ZGlmZiAtLWdpdCBhLy5kb2NrZXJpZ25vcmUgYi8uZG9ja2VyaWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMmVjZDYKLS0tIC9kZXYvbnVsbAorKysgYi8uZG9ja2VyaWdub3JlCkBAIC0wLDAgKzEgQEAKKy5naXQvCmRpZmYgLS1naXQgYS8uZXNsaW50aWdub3JlIGIvLmVzbGludGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGUyZGJhCi0tLSAvZGV2L251bGwKKysrIGIvLmVzbGludGlnbm9yZQpAQCAtMCwwICsxLDkgQEAKKyMgVE9ETzogVXNlIGVzbGludCBvbiBqcyBsaWIgYW5kIGdlbmVyYXRlZCBjb2RlCisKKyMgSWdub3JlIGxpYi9qcyBmb3Igbm93LCB3aGljaCB1c2VzIGpzaGludCBjdXJyZW50bHkKK2xpYi9qcy8qCisjIElnbm9yZSBhbGwgZ2VuZXJhdGVkIGNvZGUgZm9yIG5vdworKiovZ2VuLSoKKworIyBEb24ndCBsaW50IG5lc3RlZCBub2RlX21vZHVsZXMKKyoqL25vZGVfbW9kdWxlcwpkaWZmIC0tZ2l0IGEvLmVzbGludHJjLmpzb24gYi8uZXNsaW50cmMuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWFlODIwCi0tLSAvZGV2L251bGwKKysrIGIvLmVzbGludHJjLmpzb24KQEAgLTAsMCArMSwyNCBAQAoreworICAiZW52IjogeworICAgICJlczYiOiB0cnVlLAorICAgICJub2RlIjogdHJ1ZQorICB9LAorICAiZXh0ZW5kcyI6IFsKKyAgICAiZXNsaW50OnJlY29tbWVuZGVkIiwKKyAgICAicGx1Z2luOnByZXR0aWVyL3JlY29tbWVuZGVkIgorICBdLAorICAicGFyc2VyT3B0aW9ucyI6IHsKKyAgICAiZWNtYVZlcnNpb24iOiAyMDE3CisgIH0sCisgICJydWxlcyI6IHsKKyAgICAibm8tY29uc29sZSI6ICJvZmYiLAorICAgICJuby12YXIiOiAiZXJyb3IiLAorICAgICJwcmVmZXItY29uc3QiOiAiZXJyb3IiLAorICAgICJuby1jb25zdGFudC1jb25kaXRpb24iOiBbCisgICAgICAiZXJyb3IiLAorICAgICAgeworICAgICAgICAiY2hlY2tMb29wcyI6IGZhbHNlCisgICAgICB9CisgICAgXQorICB9Cit9CmRpZmYgLS1naXQgYS8uZ2l0aHViL3N0YWxlLnltbCBiLy5naXRodWIvc3RhbGUueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZDRhZmIKLS0tIC9kZXYvbnVsbAorKysgYi8uZ2l0aHViL3N0YWxlLnltbApAQCAtMCwwICsxLDU5IEBACisjIENvbmZpZ3VyYXRpb24gZm9yIHByb2JvdC1zdGFsZSAtIGh0dHBzOi8vZ2l0aHViLmNvbS9wcm9ib3Qvc3RhbGUKKworIyBOdW1iZXIgb2YgZGF5cyBvZiBpbmFjdGl2aXR5IGJlZm9yZSBhbiBJc3N1ZSBvciBQdWxsIFJlcXVlc3QgYmVjb21lcyBzdGFsZQorZGF5c1VudGlsU3RhbGU6IDYwCisKKyMgTnVtYmVyIG9mIGRheXMgb2YgaW5hY3Rpdml0eSBiZWZvcmUgYW4gSXNzdWUgb3IgUHVsbCBSZXF1ZXN0IHdpdGggdGhlIHN0YWxlIGxhYmVsIGlzIGNsb3NlZC4KKyMgU2V0IHRvIGZhbHNlIHRvIGRpc2FibGUuIElmIGRpc2FibGVkLCBpc3N1ZXMgc3RpbGwgbmVlZCB0byBiZSBjbG9zZWQgbWFudWFsbHksIGJ1dCB3aWxsIHJlbWFpbiBtYXJrZWQgYXMgc3RhbGUuCitkYXlzVW50aWxDbG9zZTogNworCisjIElzc3VlcyBvciBQdWxsIFJlcXVlc3RzIHdpdGggdGhlc2UgbGFiZWxzIHdpbGwgbmV2ZXIgYmUgY29uc2lkZXJlZCBzdGFsZS4gU2V0IHRvIGBbXWAgdG8gZGlzYWJsZQorZXhlbXB0TGFiZWxzOgorICAtIERvIE5vdCBNZXJnZQorICAtIGJsb2NrZWQKKyAgLSBwaW5uZWQKKyAgLSBzZWN1cml0eQorICAtICJbU3RhdHVzXSBNYXliZSBMYXRlciIKKworIyBTZXQgdG8gdHJ1ZSB0byBpZ25vcmUgaXNzdWVzIGluIGEgcHJvamVjdCAoZGVmYXVsdHMgdG8gZmFsc2UpCitleGVtcHRQcm9qZWN0czogZmFsc2UKKworIyBTZXQgdG8gdHJ1ZSB0byBpZ25vcmUgaXNzdWVzIGluIGEgbWlsZXN0b25lIChkZWZhdWx0cyB0byBmYWxzZSkKK2V4ZW1wdE1pbGVzdG9uZXM6IGZhbHNlCisKKyMgTGFiZWwgdG8gdXNlIHdoZW4gbWFya2luZyBhcyBzdGFsZQorc3RhbGVMYWJlbDogd29udGZpeAorCisjIENvbW1lbnQgdG8gcG9zdCB3aGVuIG1hcmtpbmcgYXMgc3RhbGUuIFNldCB0byBgZmFsc2VgIHRvIGRpc2FibGUKK21hcmtDb21tZW50OiA+CisgIFRoaXMgaXNzdWUgaGFzIGJlZW4gYXV0b21hdGljYWxseSBtYXJrZWQgYXMgc3RhbGUgYmVjYXVzZSBpdCBoYXMgbm90IGhhZAorICByZWNlbnQgYWN0aXZpdHkuIEl0IHdpbGwgYmUgY2xvc2VkIGluIDcgZGF5cyBpZiBubyBmdXJ0aGVyIGFjdGl2aXR5IG9jY3Vycy4KKyAgVGhhbmsgeW91IGZvciB5b3VyIGNvbnRyaWJ1dGlvbnMuCisKKyMgQ29tbWVudCB0byBwb3N0IHdoZW4gcmVtb3ZpbmcgdGhlIHN0YWxlIGxhYmVsLgordW5tYXJrQ29tbWVudDogPgorICBUaGlzIGlzc3VlIGlzIG5vIGxvbmdlciBzdGFsZS4KKyAgVGhhbmsgeW91IGZvciB5b3VyIGNvbnRyaWJ1dGlvbnMuCisKKyMgQ29tbWVudCB0byBwb3N0IHdoZW4gY2xvc2luZyBhIHN0YWxlIElzc3VlIG9yIFB1bGwgUmVxdWVzdC4KK2Nsb3NlQ29tbWVudDogPgorICBUaGlzIGlzc3VlIGhhcyBiZWVuIGF1dG9tYXRpY2FsbHkgY2xvc2VkIGR1ZSB0byBpbmFjdGl2aXR5LgorICBUaGFuayB5b3UgZm9yIHlvdXIgY29udHJpYnV0aW9ucy4KKworIyBMaW1pdCB0aGUgbnVtYmVyIG9mIGFjdGlvbnMgcGVyIGhvdXIsIGZyb20gMS0zMC4gRGVmYXVsdCBpcyAzMAorbGltaXRQZXJSdW46IDMwCisKKyMgTGltaXQgdG8gb25seSBgaXNzdWVzYCBvciBgcHVsbHNgCisjIG9ubHk6IGlzc3VlcworCisjIE9wdGlvbmFsbHksIHNwZWNpZnkgY29uZmlndXJhdGlvbiBzZXR0aW5ncyB0aGF0IGFyZSBzcGVjaWZpYyB0byBqdXN0ICdpc3N1ZXMnIG9yICdwdWxscyc6CisjIHB1bGxzOgorIyAgIGRheXNVbnRpbFN0YWxlOiAzMAorIyAgIG1hcmtDb21tZW50OiA+CisjICAgICBUaGlzIHB1bGwgcmVxdWVzdCBoYXMgYmVlbiBhdXRvbWF0aWNhbGx5IG1hcmtlZCBhcyBzdGFsZSBiZWNhdXNlIGl0IGhhcyBub3QgaGFkCisjICAgICByZWNlbnQgYWN0aXZpdHkuIEl0IHdpbGwgYmUgY2xvc2VkIGlmIG5vIGZ1cnRoZXIgYWN0aXZpdHkgb2NjdXJzLiBUaGFuayB5b3UKKyMgICAgIGZvciB5b3VyIGNvbnRyaWJ1dGlvbnMuCisKKyMgaXNzdWVzOgorIyAgIGV4ZW1wdExhYmVsczoKKyMgICAgIC0gY29uZmlybWVkCmRpZmYgLS1naXQgYS8uZ2l0aWdub3JlIGIvLmdpdGlnbm9yZQppbmRleCA0MjE5NDY4Li5iM2E1OTIwIDEwMDY0NAotLS0gYS8uZ2l0aWdub3JlCisrKyBiLy5naXRpZ25vcmUKQEAgLTIxLDQ5ICsyMSw3NiBAQAogKi5zd3AKICouaGkKICp+Cit0YWdzCiAKIC4qcHJvamVjdAorLmNsYXNzcGF0aAorLmR1YgorLnNldHRpbmdzCisuY2hlY2tzdHlsZQoganVuaXQqLnByb3BlcnRpZXMKIC5pZGVhCisqLmltbAorKi5pcHIKKyouaXdzCiBnZW4tKgogTWFrZWZpbGUKIE1ha2VmaWxlLmluCiBhY2xvY2FsLm00CiBhY2luY2x1ZGUubTQKK2FwYWNoZS10aHJpZnQtdGVzdC1saWJyYXJ5CiBhdXRvbTR0ZS5jYWNoZQogY21ha2UtKgorZHViLnNlbGVjdGlvbnMuanNvbgorbGliYXBhY2hlLXRocmlmdC5hCiBub2RlX21vZHVsZXMKIGNvbXBpbGUKIHRlc3QtZHJpdmVyCitlcmxfY3Jhc2guZHVtcAorcHJvamVjdC5sb2NrLmpzb24KIAogLnNvbmFyCiAuRFNfU3RvcmUKIC5zdm4KIC52YWdyYW50CisudnNjb2RlCisudnMKIAotL2NvbnRyaWIvLnZhZ3JhbnQvCiAvYWNsb2NhbC9saWJ0b29sLm00CiAvYWNsb2NhbC9sdCoubTQKIC9hdXRvc2Nhbi5sb2cKIC9hdXRvc2Nhbi0qLmxvZworL2NtYWtlXyoKKy9jb21waWxlci9jcHAvY29tcGlsZXIuVkMuZGIKKy9jb21waWxlci9jcHAvY29tcGlsZXIuVkMuVkMub3BlbmRiCisvY29tcGlsZXIvY3BwL3Rlc3QvcGx1Z2luL3RfY3BwX2dlbmVyYXRvci5jYworL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW5fY29uc3RhbnRzLmNwcAorL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW5fY29uc3RhbnRzLmgKKy9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luX3R5cGVzLmNwcAorL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW5fdHlwZXMuaAorL2NvbXBpbGVyL2NwcC90ZXN0Lyp0ZXN0CisvY29tcGlsZXIvY3BwL3Rlc3QvdGhyaWZ0LWdlbi0qCisvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvdGhyaWZ0LWJvb3RzdHJhcAorL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi9nZW4uc3RhbXAKIC9jb21waWxlci9jcHAvRGVidWcKIC9jb21waWxlci9jcHAvUmVsZWFzZQotL2NvbXBpbGVyL2NwcC9saWJwYXJzZS5hCi0vY29tcGlsZXIvY3BwL3NyYy90aHJpZnRsLmNjCi0vY29tcGlsZXIvY3BwL3NyYy90aHJpZnR5LmNjCi0vY29tcGlsZXIvY3BwL3NyYy90aHJpZnR5LmhoCi0vY29tcGlsZXIvY3BwL3NyYy93aW5kb3dzL3ZlcnNpb24uaAorL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2xpYnBhcnNlLmEKKy9jb21waWxlci9jcHAvc3JjL3RocmlmdC90aHJpZnRsLmNjCisvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvdGhyaWZ0eS5jYworL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3RocmlmdHkuaGgKKy9jb21waWxlci9jcHAvc3JjL3RocmlmdC93aW5kb3dzL3ZlcnNpb24uaAogL2NvbXBpbGVyL2NwcC90aHJpZnQKIC9jb21waWxlci9jcHAvdGhyaWZ0bC5jYwogL2NvbXBpbGVyL2NwcC90aHJpZnR5LmNjCiAvY29tcGlsZXIvY3BwL2xleC55eXRocmlmdGwuY2MKIC9jb21waWxlci9jcHAvdGhyaWZ0eS5oCiAvY29tcGlsZXIvY3BwL3RocmlmdHkuaGgKLS9jb21waWxlci9jcHAvdmVyc2lvbi5oCisvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvdmVyc2lvbi5oCiAvY29uZmlnLioKIC9jb25maWd1cmUKIC9jb25maWd1cmUubGluZW5vCiAvY29uZmlndXJlLnNjYW4KKy9jb250cmliLy52YWdyYW50LwogL2NvbnRyaWIvZmIzMDMvY29uZmlnLmNhY2hlCiAvY29udHJpYi9mYjMwMy9jb25maWcubG9nCiAvY29udHJpYi9mYjMwMy9jb25maWcuc3RhdHVzCkBAIC03OCw2ICsxMDUsMTMgQEAKIC9jb250cmliL2ZiMzAzL3B5L2ZiMzAzL3R0eXBlcy5weQogL2RlcGNvbXAKIC9pbnN0YWxsLXNoCisvbGliL2NsL2JhY2twb3J0LXVwZGF0ZS56aXAKKy9saWIvY2wvbGliCisvbGliL2NsL3J1bi10ZXN0cworL2xpYi9jbC9xdWlja2xpc3AubGlzcAorL2xpYi9jbC9leHRlcm5hbHMvCisvbGliL2NsL3J1bi10ZXN0cworL2xpYi9jbC9xdWlja2xpc3AvCiAvbGliL2NwcC9EZWJ1Zy8KIC9saWIvY3BwL0RlYnVnLW10LwogL2xpYi9jcHAvUmVsZWFzZS8KQEAgLTg4LDYgKzEyMiw3IEBACiAvbGliL2NwcC9zcmMvdGhyaWZ0L3N0YW1wLWgyCiAvbGliL2NwcC90ZXN0L0JlbmNobWFyawogL2xpYi9jcHAvdGVzdC9BbGxQcm90b2NvbHNUZXN0CisvbGliL2NwcC90ZXN0L0Fubm90YXRpb25UZXN0CiAvbGliL2NwcC90ZXN0L0RlYnVnUHJvdG9UZXN0CiAvbGliL2NwcC90ZXN0L0RlbnNlUHJvdG9UZXN0CiAvbGliL2NwcC90ZXN0L0VudW1UZXN0CkBAIC05NSwxMiArMTMwLDE0IEBACiAvbGliL2NwcC90ZXN0L09wdGlvbmFsUmVxdWlyZWRUZXN0CiAvbGliL2NwcC90ZXN0L1NlY3VyaXR5VGVzdAogL2xpYi9jcHAvdGVzdC9TcGVjaWFsaXphdGlvblRlc3QKLS9saWIvY3BwL3Rlc3QvUmVmbGVjdGlvblRlc3QKIC9saWIvY3BwL3Rlc3QvUmVjdXJzaXZlVGVzdAorL2xpYi9jcHAvdGVzdC9SZWZsZWN0aW9uVGVzdAorL2xpYi9jcHAvdGVzdC9SZW5kZXJlZERvdWJsZUNvbnN0YW50c1Rlc3QKIC9saWIvY3BwL3Rlc3QvVEZEVHJhbnNwb3J0VGVzdAogL2xpYi9jcHAvdGVzdC9URmlsZVRyYW5zcG9ydFRlc3QKIC9saWIvY3BwL3Rlc3QvVEludGVycnVwdFRlc3QKIC9saWIvY3BwL3Rlc3QvVE5vbmJsb2NraW5nU2VydmVyVGVzdAorL2xpYi9jcHAvdGVzdC9UTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0CiAvbGliL2NwcC90ZXN0L1RQaXBlZFRyYW5zcG9ydFRlc3QKIC9saWIvY3BwL3Rlc3QvVFNlcnZlckludGVncmF0aW9uVGVzdAogL2xpYi9jcHAvdGVzdC9UU29ja2V0SW50ZXJydXB0VGVzdApAQCAtMTIxLDY3ICsxNTgsNzcgQEAKIC9saWIvY19nbGliLyouZ2NkYQogL2xpYi9jX2dsaWIvKi5nY25vCiAvbGliL2NfZ2xpYi8qLmxvVAorL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jb25maWcuaAorL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9zdGFtcC1oMwogL2xpYi9jX2dsaWIvdGVzdC8qLmdjbm8KIC9saWIvY19nbGliL3Rlc3QvdGVzdHdyYXBwZXIuc2gKIC9saWIvY19nbGliL3Rlc3QvdGVzdHdyYXBwZXItdGVzdCoKIC9saWIvY19nbGliL3Rlc3QvdGVzdGFwcGxpY2F0aW9uZXhjZXB0aW9uCiAvbGliL2NfZ2xpYi90ZXN0L3Rlc3RiaW5hcnlwcm90b2NvbAorL2xpYi9jX2dsaWIvdGVzdC90ZXN0Y29tcGFjdHByb3RvY29sCiAvbGliL2NfZ2xpYi90ZXN0L3Rlc3RidWZmZXJlZHRyYW5zcG9ydAogL2xpYi9jX2dsaWIvdGVzdC90ZXN0Y29udGFpbmVydGVzdAogL2xpYi9jX2dsaWIvdGVzdC90ZXN0ZGVidWdwcm90bworL2xpYi9jX2dsaWIvdGVzdC90ZXN0ZmR0cmFuc3BvcnQKIC9saWIvY19nbGliL3Rlc3QvdGVzdGZyYW1lZHRyYW5zcG9ydAogL2xpYi9jX2dsaWIvdGVzdC90ZXN0bWVtb3J5YnVmZmVyCiAvbGliL2NfZ2xpYi90ZXN0L3Rlc3RvcHRpb25hbHJlcXVpcmVkCisvbGliL2NfZ2xpYi90ZXN0L3Rlc3R0cmFuc3BvcnRzc2xzb2NrZXQKIC9saWIvY19nbGliL3Rlc3QvdGVzdHNpbXBsZXNlcnZlcgogL2xpYi9jX2dsaWIvdGVzdC90ZXN0c3RydWN0CiAvbGliL2NfZ2xpYi90ZXN0L3Rlc3R0aHJpZnR0ZXN0CiAvbGliL2NfZ2xpYi90ZXN0L3Rlc3R0aHJpZnR0ZXN0Y2xpZW50CiAvbGliL2NfZ2xpYi90ZXN0L3Rlc3R0cmFuc3BvcnRzb2NrZXQKKy9saWIvY19nbGliL3Rlc3QvdGVzdHNlcmlhbGl6YXRpb24KIC9saWIvY19nbGliL3RocmlmdGMucGMKIC9saWIvY19nbGliL3RocmlmdF9jX2dsaWIucGMKIC9saWIvY3NoYXJwLyoqL2Jpbi8KIC9saWIvY3NoYXJwLyoqL29iai8KLS9saWIvZC9saWJ0aHJpZnRkLmEKKy9saWIvY3NoYXJwL3NyYy9wYWNrYWdlcworL2xpYi9kL3Rlc3QvKi5wZW0KKy9saWIvZC9saWJ0aHJpZnRkKi5hCisvbGliL2QvdGVzdC9hc3luY190ZXN0CisvbGliL2QvdGVzdC9jbGllbnRfcG9vbF90ZXN0CiAvbGliL2QvdGVzdC9zZXJpYWxpemF0aW9uX2JlbmNobWFyaworL2xpYi9kL3Rlc3Qvc3RyZXNzX3Rlc3Rfc2VydmVyCisvbGliL2QvdGVzdC90aHJpZnRfdGVzdF9jbGllbnQKKy9saWIvZC90ZXN0L3RocmlmdF90ZXN0X3NlcnZlcgogL2xpYi9kL3Rlc3QvdHJhbnNwb3J0X3Rlc3QKIC9saWIvZC91bml0dGVzdC8KLS9saWIvZGVscGhpL3NyYy8qLmRjdQotL2xpYi9kZWxwaGkvdGVzdC8qLmlkZW50Y2FjaGUKLS9saWIvZGVscGhpL3Rlc3QvKi5sb2NhbAotL2xpYi9kZWxwaGkvdGVzdC8qLmRjdQotL2xpYi9kZWxwaGkvdGVzdC8qLjIwMDcKLS9saWIvZGVscGhpL3Rlc3QvKi5kcHJvagotL2xpYi9kZWxwaGkvdGVzdC8qLmRwcm9qCi0vbGliL2RlbHBoaS90ZXN0L2NvZGVnZW4vKi5iYXQKLS9saWIvZGVscGhpL3Rlc3Qvc2tpcC8qLmxvY2FsCi0vbGliL2RlbHBoaS90ZXN0L3NraXAvKi5pZGVudGNhY2hlCi0vbGliL2RlbHBoaS90ZXN0L3NraXAvKi5pZGVudGNhY2hlCi0vbGliL2RlbHBoaS90ZXN0L3NraXAvKi5kcHJvagotL2xpYi9kZWxwaGkvdGVzdC9za2lwLyouZHByb2oKLS9saWIvZGVscGhpL3Rlc3Qvc2tpcC8qLjIwMDcKLS9saWIvZGVscGhpL3Rlc3Qvc2VyaWFsaXplci8qLmlkZW50Y2FjaGUKLS9saWIvZGVscGhpL3Rlc3Qvc2VyaWFsaXplci8qLmRwcm9qCi0vbGliL2RlbHBoaS90ZXN0L3NlcmlhbGl6ZXIvKi5sb2NhbAotL2xpYi9kZWxwaGkvdGVzdC9zZXJpYWxpemVyLyouMjAwNwotL2xpYi9kZWxwaGkvdGVzdC9zZXJpYWxpemVyLyouZGN1Ci0vbGliL2RlbHBoaS90ZXN0L211bHRpcGxleGVkLyouZHByb2oKLS9saWIvZGVscGhpL3Rlc3QvbXVsdGlwbGV4ZWQvKi4yMDA3Ci0vbGliL2RlbHBoaS90ZXN0L211bHRpcGxleGVkLyoubG9jYWwKLS9saWIvZGVscGhpL3Rlc3QvbXVsdGlwbGV4ZWQvKi5pZGVudGNhY2hlCi0vbGliL2RlbHBoaS90ZXN0L211bHRpcGxleGVkLyouZGN1Ci0vbGliL2RlbHBoaS90ZXN0L3R5cGVyZWdpc3RyeS8qLjIwMDcKLS9saWIvZGVscGhpL3Rlc3QvdHlwZXJlZ2lzdHJ5LyouZHByb2oKLS9saWIvZGVscGhpL3Rlc3QvdHlwZXJlZ2lzdHJ5LyouaWRlbnRjYWNoZQotL2xpYi9kZWxwaGkvdGVzdC90eXBlcmVnaXN0cnkvKi5sb2NhbAotL2xpYi9kZWxwaGkvdGVzdC90eXBlcmVnaXN0cnkvKi5kY3UKLS9saWIvZXJsLy5nZW5lcmF0ZWQKKy9saWIvZGFydC9jb3ZlcmFnZQorL2xpYi9kYXJ0LyoqLy5wYWNrYWdlcworL2xpYi9kYXJ0LyoqL3BhY2thZ2VzCisvbGliL2RhcnQvKiovLnB1Yi8KKy9saWIvZGFydC8qKi9wdWJzcGVjLmxvY2sKKy9saWIvZGVscGhpL3Rlc3Qvc2tpcC8qLnJlcXVlc3QKKy9saWIvZGVscGhpL3Rlc3Qvc2tpcC8qLnJlc3BvbnNlCisvbGliL2RlbHBoaS8qKi8qLmlkZW50Y2FjaGUKKy9saWIvZGVscGhpLyoqLyoubG9jYWwKKy9saWIvZGVscGhpLyoqLyouZGN1CisvbGliL2RlbHBoaS8qKi8qLjIwMDcKKy9saWIvZGVscGhpLyoqLyouZHByb2oKKy9saWIvZGVscGhpLyoqL2NvZGVnZW4vKi5iYXQKIC9saWIvZXJsLy5ldW5pdAotL2xpYi9lcmwvZWJpbgorL2xpYi9lcmwvLmdlbmVyYXRlZAorL2xpYi9lcmwvLnJlYmFyLwogL2xpYi9lcmwvZGVwcy8KKy9saWIvZXJsL2ViaW4KKy9saWIvZXJsL3NyYy90aHJpZnQuYXBwLnNyYworL2xpYi9lcmwvdGVzdC8qLmJlYW0KKy9saWIvZXJsL3Rlc3QvKi5ocmwKKy9saWIvZXJsL3Rlc3QvVGhyaWZ0X29taXRfd2l0aG91dC50aHJpZnQKIC9saWIvaGF4ZS90ZXN0L2JpbgorL2xpYi9oYXhlL3Rlc3QvZGF0YS50bXAKIC9saWIvaHMvZGlzdAorL2xpYi9qYXZhLy5ncmFkbGUKKy9saWIvamF2YS9hbmRyb2lkLy5ncmFkbGUKIC9saWIvamF2YS9idWlsZAorL2xpYi9qYXZhL3RhcmdldAorL2xpYi9qcy9kaXN0CisvbGliL2pzL2RvYwogL2xpYi9qcy90ZXN0L2J1aWxkCisvbGliL25ldGNvcmUvKiovYmluCisvbGliL25ldGNvcmUvKiovb2JqCiAvbGliL25vZGVqcy9jb3ZlcmFnZQogL2xpYi9ub2RlanMvbm9kZV9tb2R1bGVzLwogL2xpYi9wZXJsL01BTklGRVNUCkBAIC0yMDUsNiArMjUyLDcgQEAKIC9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2J1aWxkLwogL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvY29uZmlnLioKIC9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2NvbmZpZ3VyZQorL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvY29uZmlndXJlLmFjCiAvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9jb25maWd1cmUuaW4KIC9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2luc3RhbGwtc2gKIC9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2xpYnRvb2wKQEAgLTIyMSw1OSArMjY5LDEyOCBAQAogL2xpYi9waHAvdGVzdC9wYWNrYWdlcy8KIC9saWIvcHkvZGlzdC8KIC9saWIvZXJsL2xvZ3MvCisvbGliL2dvL3BrZworL2xpYi9nby9zcmMKIC9saWIvZ28vdGVzdC9nb3BhdGgvCiAvbGliL2dvL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKy9saWIvcnMvdGFyZ2V0LworL2xpYi9ycy9DYXJnby5sb2NrCisvbGliL3JzL3Rlc3QvQ2FyZ28ubG9jaworL2xpYi9ycy90ZXN0L3RhcmdldC8KKy9saWIvcnMvdGVzdC9iaW4vCisvbGliL3JzL3Rlc3Qvc3JjL2Jhc2Vfb25lLnJzCisvbGliL3JzL3Rlc3Qvc3JjL2Jhc2VfdHdvLnJzCisvbGliL3JzL3Rlc3Qvc3JjL21pZGxheWVyLnJzCisvbGliL3JzL3Rlc3Qvc3JjL3JlY3Vyc2l2ZS5ycworL2xpYi9ycy90ZXN0L3NyYy91bHRpbWF0ZS5ycworL2xpYi9ycy8qLmltbAorL2xpYi9ycy8qKi8qLmltbAorL2xpYi9zd2lmdC8uYnVpbGQKIC9saWJ0b29sCiAvbHRtYWluLnNoCiAvbWlzc2luZwogL25vZGVfbW9kdWxlcy8KKy92ZW5kb3IvCisvY29tcG9zZXIubG9jawogL3N0YW1wLWgxCisvdGVzdC9mZWF0dXJlcy9yZXN1bHRzLmpzb24KIC90ZXN0L3Jlc3VsdHMuanNvbgogL3Rlc3QvY19nbGliL3Rlc3RfY2xpZW50CiAvdGVzdC9jX2dsaWIvdGVzdF9zZXJ2ZXIKKy90ZXN0L2NsL1Rlc3RTZXJ2ZXIKKy90ZXN0L2NsL1Rlc3RDbGllbnQKIC90ZXN0L2NwcC9TdHJlc3NUZXN0CiAvdGVzdC9jcHAvU3RyZXNzVGVzdE5vbkJsb2NraW5nCiAvdGVzdC9jcHAvVGVzdENsaWVudAogL3Rlc3QvY3BwL1Rlc3RTZXJ2ZXIKKy90ZXN0L2NzaGFycC9vYmoKKy90ZXN0L2NzaGFycC9iaW4KKy90ZXN0L2RhcnQvKiovLnBhY2thZ2VzCisvdGVzdC9kYXJ0LyoqL3BhY2thZ2VzCisvdGVzdC9kYXJ0LyoqLy5wdWIvCisvdGVzdC9kYXJ0LyoqL3B1YnNwZWMubG9jawogL3Rlc3QvbG9nLwogL3Rlc3QvdGVzdC5sb2cKLS90ZXN0L2VybC8uZXVuaXQvCiAvdGVzdC9lcmwvLmdlbmVyYXRlZAorL3Rlc3QvZXJsLy5yZWJhcgorL3Rlc3QvZXJsL2ViaW4KIC90ZXN0L2dvL2Jpbi8KIC90ZXN0L2dvL1RocmlmdFRlc3QudGhyaWZ0CiAvdGVzdC9nby9nb3BhdGgKIC90ZXN0L2dvL3BrZy8KIC90ZXN0L2dvL3NyYy9jb2RlLmdvb2dsZS5jb20vCisvdGVzdC9nby9zcmMvY29tbW9uL21vY2tfaGFuZGxlci5nbwogL3Rlc3QvZ28vc3JjL2dpdGh1Yi5jb20vZ29sYW5nLworL3Rlc3QvZ28vc3JjL2dvbGFuZy5vcmcvCiAvdGVzdC9nby9zcmMvZ2VuLwogL3Rlc3QvZ28vc3JjL3RocmlmdAogL3Rlc3QvaGF4ZS9iaW4KIC90ZXN0L2hzL1Rlc3RDbGllbnQKIC90ZXN0L2hzL1Rlc3RTZXJ2ZXIKKy90ZXN0L3BocC9waHBfZXh0X2Rpci8KIC90ZXN0L3B5LnR3aXN0ZWQvX3RyaWFsX3RlbXAvCiAvdGVzdC9yYi9HZW1maWxlLmxvY2sKKy90ZXN0L25ldGNvcmUvKiovYmluCisvdGVzdC9uZXRjb3JlLyoqL29iagorL3Rlc3QvbmV0Y29yZS9UaHJpZnQKKy90ZXN0L3BocC9waHBfZXh0X2Rpci8KKy90ZXN0L3JzL0NhcmdvLmxvY2sKKy90ZXN0L3JzL3NyYy90aHJpZnRfdGVzdC5ycworL3Rlc3QvcnMvYmluLworL3Rlc3QvcnMvdGFyZ2V0LworL3Rlc3QvcnMvKi5pbWwKKy90ZXN0L3JzLyoqLyouaW1sCisvbGliL2NsL2JhY2twb3J0LXVwZGF0ZS56aXAKKy9saWIvY2wvbGliCisvdHV0b3JpYWwvY2wvcXVpY2tsaXNwLmxpc3AKKy90dXRvcmlhbC9jbC9leHRlcm5hbHMvCisvdHV0b3JpYWwvY2wvcXVpY2tsaXNwLworL3R1dG9yaWFsL2NsL1R1dG9yaWFsQ2xpZW50CisvdHV0b3JpYWwvY2wvVHV0b3JpYWxTZXJ2ZXIKKy90dXRvcmlhbC9jbC9iYWNrcG9ydC11cGRhdGUuemlwCisvdHV0b3JpYWwvY2wvbGliLworL3R1dG9yaWFsL2NsL3NoYXJlZC1pbXBsZW1lbnRhdGlvbi5mYXNsCisvdHV0b3JpYWwvY2wvdHV0b3JpYWwtaW1wbGVtZW50YXRpb24uZmFzbAogL3R1dG9yaWFsL2NwcC9UdXRvcmlhbENsaWVudAogL3R1dG9yaWFsL2NwcC9UdXRvcmlhbFNlcnZlcgogL3R1dG9yaWFsL2NfZ2xpYi90dXRvcmlhbF9jbGllbnQKIC90dXRvcmlhbC9jX2dsaWIvdHV0b3JpYWxfc2VydmVyCi0vdHV0b3JpYWwvZGVscGhpLyouZHNrCi0vdHV0b3JpYWwvZGVscGhpLyoubG9jYWwKLS90dXRvcmlhbC9kZWxwaGkvKi50dnNjb25maWcKLS90dXRvcmlhbC9kZWxwaGkvRGVscGhpQ2xpZW50L2RjdQotL3R1dG9yaWFsL2RlbHBoaS9EZWxwaGlTZXJ2ZXIvZGN1Ci0vdHV0b3JpYWwvZGVscGhpL0RlbHBoaUNsaWVudC8qLmxvY2FsCi0vdHV0b3JpYWwvZGVscGhpL0RlbHBoaUNsaWVudC8qLmlkZW50Y2FjaGUKLS90dXRvcmlhbC9kZWxwaGkvRGVscGhpU2VydmVyLyouaWRlbnRjYWNoZQotL3R1dG9yaWFsL2RlbHBoaS9EZWxwaGlTZXJ2ZXIvKi5sb2NhbAorL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBTZXJ2ZXIvb2JqCisvdHV0b3JpYWwvY3NoYXJwL0NzaGFycFNlcnZlci9iaW4KKy90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwQ2xpZW50L29iagorL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBDbGllbnQvYmluCisvdHV0b3JpYWwvZC9hc3luY19jbGllbnQKKy90dXRvcmlhbC9kL2NsaWVudAorL3R1dG9yaWFsL2Qvc2VydmVyCisvdHV0b3JpYWwvZGFydC8qKi8ucGFja2FnZXMKKy90dXRvcmlhbC9kYXJ0LyoqL3BhY2thZ2VzCisvdHV0b3JpYWwvZGFydC8qKi8ucHViLworL3R1dG9yaWFsL2RhcnQvKiovcHVic3BlYy5sb2NrCisvdHV0b3JpYWwvZGVscGhpLyoqLyouZHNrCisvdHV0b3JpYWwvZGVscGhpLyoqLyoubG9jYWwKKy90dXRvcmlhbC9kZWxwaGkvKiovKi50dnNjb25maWcKKy90dXRvcmlhbC9kZWxwaGkvKiovZGN1CisvdHV0b3JpYWwvZGVscGhpLyoqLyoubG9jYWwKKy90dXRvcmlhbC9kZWxwaGkvKiovKi5pZGVudGNhY2hlCisvdHV0b3JpYWwvZ28vZ29wYXRoCiAvdHV0b3JpYWwvZ28vZ28tdHV0b3JpYWwKIC90dXRvcmlhbC9nby9jYWxjdWxhdG9yLXJlbW90ZQogL3R1dG9yaWFsL2dvL3NyYy9zaGFyZWQKIC90dXRvcmlhbC9nby9zcmMvdHV0b3JpYWwKIC90dXRvcmlhbC9nby9zcmMvZ2l0LmFwYWNoZS5vcmcKKy90dXRvcmlhbC9nby9zcmMvZ29sYW5nLm9yZwogL3R1dG9yaWFsL2hheGUvYmluCiAvdHV0b3JpYWwvaHMvZGlzdC8KIC90dXRvcmlhbC9qYXZhL2J1aWxkLwogL3R1dG9yaWFsL2pzL2J1aWxkLworL3R1dG9yaWFsL25ldGNvcmUvKiovYmluCisvdHV0b3JpYWwvbmV0Y29yZS8qKi9vYmoKKy90dXRvcmlhbC9uZXRjb3JlL1RocmlmdAorL3R1dG9yaWFsL3JzLyouaW1sCisvdHV0b3JpYWwvcnMvc3JjL3NoYXJlZC5ycworL3R1dG9yaWFsL3JzL3NyYy90dXRvcmlhbC5ycworL3R1dG9yaWFsL3JzL2JpbgorL3R1dG9yaWFsL3JzL3RhcmdldAorL3R1dG9yaWFsL3JzL0NhcmdvLmxvY2sKIC95bHdyYXAKIAotL2NtYWtlXyoKZGlmZiAtLWdpdCBhLy5ydXN0Zm10LnRvbWwgYi8ucnVzdGZtdC50b21sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjYTVhZmQKLS0tIC9kZXYvbnVsbAorKysgYi8ucnVzdGZtdC50b21sCkBAIC0wLDAgKzEsNjQgQEAKK21heF93aWR0aCA9IDEwMAoraGFyZF90YWJzID0gZmFsc2UKK3RhYl9zcGFjZXMgPSA0CituZXdsaW5lX3N0eWxlID0gIkF1dG8iCit1c2Vfc21hbGxfaGV1cmlzdGljcyA9ICJEZWZhdWx0IgoraW5kZW50X3N0eWxlID0gIkJsb2NrIgord3JhcF9jb21tZW50cyA9IGZhbHNlCitmb3JtYXRfZG9jX2NvbW1lbnRzID0gZmFsc2UKK2NvbW1lbnRfd2lkdGggPSA4MAorbm9ybWFsaXplX2NvbW1lbnRzID0gZmFsc2UKK25vcm1hbGl6ZV9kb2NfYXR0cmlidXRlcyA9IGZhbHNlCitsaWNlbnNlX3RlbXBsYXRlX3BhdGggPSAiIgorZm9ybWF0X3N0cmluZ3MgPSBmYWxzZQorZm9ybWF0X21hY3JvX21hdGNoZXJzID0gZmFsc2UKK2Zvcm1hdF9tYWNyb19ib2RpZXMgPSB0cnVlCitlbXB0eV9pdGVtX3NpbmdsZV9saW5lID0gdHJ1ZQorc3RydWN0X2xpdF9zaW5nbGVfbGluZSA9IHRydWUKK2ZuX3NpbmdsZV9saW5lID0gZmFsc2UKK3doZXJlX3NpbmdsZV9saW5lID0gZmFsc2UKK2ltcG9ydHNfaW5kZW50ID0gIkJsb2NrIgoraW1wb3J0c19sYXlvdXQgPSAiTWl4ZWQiCittZXJnZV9pbXBvcnRzID0gZmFsc2UKK3Jlb3JkZXJfaW1wb3J0cyA9IHRydWUKK3Jlb3JkZXJfbW9kdWxlcyA9IHRydWUKK3Jlb3JkZXJfaW1wbF9pdGVtcyA9IGZhbHNlCit0eXBlX3B1bmN0dWF0aW9uX2RlbnNpdHkgPSAiV2lkZSIKK3NwYWNlX2JlZm9yZV9jb2xvbiA9IGZhbHNlCitzcGFjZV9hZnRlcl9jb2xvbiA9IHRydWUKK3NwYWNlc19hcm91bmRfcmFuZ2VzID0gZmFsc2UKK2Jpbm9wX3NlcGFyYXRvciA9ICJGcm9udCIKK3JlbW92ZV9uZXN0ZWRfcGFyZW5zID0gdHJ1ZQorY29tYmluZV9jb250cm9sX2V4cHIgPSB0cnVlCitvdmVyZmxvd19kZWxpbWl0ZWRfZXhwciA9IGZhbHNlCitzdHJ1Y3RfZmllbGRfYWxpZ25fdGhyZXNob2xkID0gMAorZW51bV9kaXNjcmltX2FsaWduX3RocmVzaG9sZCA9IDAKK21hdGNoX2FybV9ibG9ja3MgPSB0cnVlCitmb3JjZV9tdWx0aWxpbmVfYmxvY2tzID0gZmFsc2UKK2ZuX2FyZ3NfZGVuc2l0eSA9ICJUYWxsIgorYnJhY2Vfc3R5bGUgPSAiU2FtZUxpbmVXaGVyZSIKK2NvbnRyb2xfYnJhY2Vfc3R5bGUgPSAiQWx3YXlzU2FtZUxpbmUiCit0cmFpbGluZ19zZW1pY29sb24gPSB0cnVlCit0cmFpbGluZ19jb21tYSA9ICJWZXJ0aWNhbCIKK21hdGNoX2Jsb2NrX3RyYWlsaW5nX2NvbW1hID0gZmFsc2UKK2JsYW5rX2xpbmVzX3VwcGVyX2JvdW5kID0gMQorYmxhbmtfbGluZXNfbG93ZXJfYm91bmQgPSAwCitlZGl0aW9uID0gIjIwMTUiCittZXJnZV9kZXJpdmVzID0gdHJ1ZQordXNlX3RyeV9zaG9ydGhhbmQgPSBmYWxzZQordXNlX2ZpZWxkX2luaXRfc2hvcnRoYW5kID0gZmFsc2UKK2ZvcmNlX2V4cGxpY2l0X2FiaSA9IHRydWUKK2NvbmRlbnNlX3dpbGRjYXJkX3N1ZmZpeGVzID0gZmFsc2UKK2NvbG9yID0gIkF1dG8iCityZXF1aXJlZF92ZXJzaW9uID0gIjEuMC4wIgordW5zdGFibGVfZmVhdHVyZXMgPSBmYWxzZQorZGlzYWJsZV9hbGxfZm9ybWF0dGluZyA9IGZhbHNlCitza2lwX2NoaWxkcmVuID0gZmFsc2UKK2hpZGVfcGFyc2VfZXJyb3JzID0gZmFsc2UKK2Vycm9yX29uX2xpbmVfb3ZlcmZsb3cgPSBmYWxzZQorZXJyb3Jfb25fdW5mb3JtYXR0ZWQgPSBmYWxzZQorcmVwb3J0X3RvZG8gPSAiTmV2ZXIiCityZXBvcnRfZml4bWUgPSAiTmV2ZXIiCitpZ25vcmUgPSBbXQorZW1pdF9tb2RlID0gIkZpbGVzIgorbWFrZV9iYWNrdXAgPSBmYWxzZQpkaWZmIC0tZ2l0IGEvLnRyYXZpcy55bWwgYi8udHJhdmlzLnltbAppbmRleCA1ODdkNzk1Li42MzdiNWQ1IDEwMDY0NAotLS0gYS8udHJhdmlzLnltbAorKysgYi8udHJhdmlzLnltbApAQCAtMTksMTcwICsxOSwxNTUgQEAKIAogIyBidWlsZCBBcGFjaGUgVGhyaWZ0IG9uIFRyYXZpcyBDSSAtIGh0dHBzOi8vdHJhdmlzLWNpLm9yZy8KIAotbGFuZ3VhZ2U6IGNwcAorIworIyBEb2NrZXIgSW50ZWdyYXRpb24KKyMgc2VlOiBidWlsZC9kb2NrZXIvUkVBRE1FLm1kCisjIAogCiBzdWRvOiByZXF1aXJlZAorZGlzdDogdHJ1c3R5CitsYW5ndWFnZTogY3BwCiAKLWNhY2hlOgotIC0gYXB0Ci0gLSBucG0KLSAtIG1hdmVuCitzZXJ2aWNlczoKKyAgLSBkb2NrZXIKIAotY29tcGlsZXI6Ci0gIC0gY2xhbmcKLSAgLSBnY2MKK2luc3RhbGw6CisgIC0gaWYgW1sgYHVuYW1lYCA9PSAiTGludXgiIF1dOyB0aGVuIGJ1aWxkL2RvY2tlci9yZWZyZXNoLnNoOyBmaQogCi1iZWZvcmVfaW5zdGFsbDoKLSAgLSBzaCBidWlsZC90cmF2aXMvaW5zdGFsbENYWERlcGVuZGVuY2llcy5zaAotICAtIGlmIFsgIiRBTExfREVQUyIgIT0gIm5vIiBdIDsgdGhlbiBzaCBidWlsZC90cmF2aXMvaW5zdGFsbERlcGVuZGVuY2llcy5zaCAxPiAvZGV2L251bGwgOyBmaQotICAtIGlmIFsgIiRBTExfREVQUyIgIT0gIm5vIiBdIDsgdGhlbiBleHBvcnQgUEFUSD0vb3B0L2doYy8kR0hDVkVSL2Jpbjovb3B0L2NhYmFsLzEuMjAvYmluOiRQQVRIIDsgZmkKLSAgLSBpZiBbICIkQUxMX0RFUFMiICE9ICJubyIgXSA7IHRoZW4gY2FiYWwgdXBkYXRlIDsgZmkKLSAgIyBEaXNhYmxpbmcgYW55IGNhYmFsIGNvbmN1cnJlbnQgam9icyB0byB3b3JrYXJvdW5kIEdIQyBjcmFzaGVzIGR1ZSB0byBvdXQgb2YgbWVtb3J5LgotICAjIFdlIGNhbiBzYWZlbHkgcmVtb3ZlIHRoaXMgdG8gc3BlZWQgdXAgY2FiYWwgaW5zdGFsbCwgb25jZSBUcmF2aXMgaW5mcmFzdHJ1Y3R1cmUgaXMgdXBncmFkZWQuCi0gIC0gaWYgWyAiJEFMTF9ERVBTIiAhPSAibm8iIF0gOyB0aGVuIHNlZCAtaSAncy9eXHMqam9ic1xzKjpccypcJG5jcHVzXHMqJC9qb2JzOjEvZycgJEhPTUUvLmNhYmFsL2NvbmZpZyAmJiBjYXQgJEhPTUUvLmNhYmFsL2NvbmZpZyB8IGdyZXAgam9icyA7IGZpCi0KLQotc2NyaXB0OgotICAtIGlmIFsgIngkQ01BS0VfQ09ORklHIiAhPSAieG5vbmUiIF0gOyB0aGVuIG1rZGlyIGNtYWtlX2J1aWxkICYmIGNkIGNtYWtlX2J1aWxkICYmIGNtYWtlIC1HTmluamEgLURRVF9NT0NfRVhFQ1VUQUJMRT0ibW9xLXF0NSIgJENNQUtFX0NPTkZJRyAkVFJBVklTX0JVSUxEX0RJUiA7IGZpCi0gIC0gaWYgWyAieCRDTUFLRV9DT05GSUciICE9ICJ4bm9uZSIgXSA7IHRoZW4gbmluamEgOyBmaQotICAtIGlmIFsgIngkQ01BS0VfQ09ORklHIiAhPSAieG5vbmUiIF0gOyB0aGVuIGNwYWNrIDsgY2QgJFRSQVZJU19CVUlMRF9ESVIgOyBmaQotICAtIGlmIFsgIngkQ09ORklHIiAhPSAieG5vbmUiIF0gOyB0aGVuIHNoIGJvb3RzdHJhcC5zaCA7IGZpCi0gIC0gaWYgWyAieCRDT05GSUciICE9ICJ4bm9uZSIgXSA7IHRoZW4gc2ggY29uZmlndXJlICRDT05GSUcgOyBmaQotICAtIGlmIFsgIngkQ09ORklHIiAhPSAieG5vbmUiIF0gOyB0aGVuIG1ha2UgJE1BS0VfVEFSR0VUIC1qMiA7IGZpCi0KLWFmdGVyX2ZhaWx1cmU6Ci0gIC0gaWYgWyAieCRFUlJPUl9MT0ciICE9ICJ4bm9uZSIgXSA7IHRoZW4gY2F0ICRFUlJPUl9MT0cgOyBmaQorc3RhZ2VzOgorICAtIGRvY2tlciAgICAjIGRvY2tlciBpbWFnZXMKKyAgLSB0aHJpZnQgICAgIyB0aHJpZnQgYnVpbGQgam9icwogCiBlbnY6CiAgIGdsb2JhbDoKLSAgICAtIFRFU1RfTkFNRT0iIgotICAgIC0gQ01BS0VfQ09ORklHPSJub25lIgotICAgIC0gQ09ORklHPSJub25lIgotICAgIC0gTUFLRV9UQVJHRVQ9ImNoZWNrIgotICAgIC0gQUxMX0RFUFM9Im5vIgotICAgIC0gR0hDVkVSPTcuOC4zCi0gICAgLSBFUlJPUl9MT0c9Im5vbmUiCisgICAgLSBTQ1JJUFQ9ImNtYWtlLnNoIgorICAgIC0gQlVJTERfQVJHPSIiCisgICAgLSBCVUlMRF9FTlY9Ii1lIENDPWdjYyAtZSBDWFg9ZysrIC1lIFRIUklGVF9DUk9TU1RFU1RfQ09OQ1VSUkVOQ1k9NCIKKyAgICAtIERJU1RSTz11YnVudHUtYmlvbmljCisgICAgLSBCVUlMRF9MSUJTPSJDUFAgQ19HTElCIEhBU0tFTEwgSkFWQSBQWVRIT04gVEVTVElORyBUVVRPUklBTFMiICAjIG9ubHkgbWVhbmluZ2Z1bCBmb3IgQ01ha2UgYnVpbGRzCisgICAgLSBUUkFWSVNfQlVJTERfU1RBR0U9dGVzdAorICAgICMgRE9DS0VSX1JFUE8gKHRoaXMgd29ya3MgZm9yIGFsbCBidWlsZHMgYXMgYSBzb3VyY2UgZm9yIGRvY2tlciBpbWFnZXMgLSB5b3UgY2FuIG92ZXJyaWRlIGZvciBmb3JrIGJ1aWxkcyBpbiB5b3VyIFRyYXZpcyBzZXR0aW5ncykKKyAgICAtIERPQ0tFUl9SRVBPPSJ0aHJpZnQvdGhyaWZ0LWJ1aWxkIgorICAgICMgRE9DS0VSX1VTRVIgKHByb3ZpZGUgaW4geW91ciBUcmF2aXMgc2V0dGluZ3MgaWYgeW91IHdhbnQgdG8gYnVpbGQgYW5kIHVwZGF0ZSBkb2NrZXIgaW1hZ2VzIG9uY2UsIGluc3RlYWQgb2Ygb24gZXZlcnkgam9iKQorICAgICMgRE9DS0VSX1BBU1MgKHNhbWUpCiAKLSAgbWF0cml4OgotICAgICMgUHV0IGl0IGhlcmUgYmVjYXVzZSBpdCdzIG1vc3QgdGltZSBjb25zdW1pbmcKLSAgICAtIFRFU1RfTkFNRT0ibWFrZSBjcm9zcyAoYXV0b21ha2UpIgotICAgICAgVEhSSUZUX0NST1NTVEVTVF9DT05DVVJSRU5DWT02Ci0gICAgICBDT05GSUc9Ii0tZW5hYmxlLXR1dG9yaWFsPW5vIC0td2l0aG91dC1lcmxhbmcgLS13aXRob3V0LWx1YSAtLXdpdGhvdXQtaGF4ZSAtLXdpdGhvdXQtZCIKLSAgICAgIEFMTF9ERVBTPSJ5ZXMiCi0gICAgICBNQUtFX1RBUkdFVD0iY3Jvc3MiCi0gICAgICBFUlJPUl9MT0c9InRlc3QvbG9nL3VuZXhwZWN0ZWRfZmFpbHVyZXMubG9nIgotCi0gICAgIyBDTWFrZSBidWlsZHMKLSAgICAtIFRFU1RfTkFNRT0iY29tcGlsZXIgKENNYWtlICsgQ1BhY2spIgotICAgICAgQ01BS0VfQ09ORklHPSItREJVSUxEX0NPTVBJTEVSPU9OIC1EQlVJTERfTElCUkFSSUVTPU9GRiAtREJVSUxEX1RFU1RJTkc9T0ZGIC1EQlVJTERfRVhBTVBMRVM9T0ZGIgotICAgIC0gVEVTVF9OQU1FPSJhbGwgKENNYWtlICsgQ1BhY2spIgotICAgICAgQ01BS0VfQ09ORklHPSIiCi0gICAgICBBTExfREVQUz0ieWVzIgotICAgIC0gVEVTVF9OQU1FPSJDKysvYm9vc3QtdGhyZWFkcyAoQ01ha2UgKyBDUGFjaykiCi0gICAgICBDTUFLRV9DT05GSUc9Ii1EV0lUSF9DX0dMSUI9T0ZGIC1EV0lUSF9KQVZBPU9GRiAtRFdJVEhfQk9PU1RUSFJFQURTPU9OIgotICAgIC0gVEVTVF9OQU1FPSJDKysvc3RkLXRocmVhZHMgKENNYWtlICsgQ1BhY2spIgotICAgICAgQ01BS0VfQ09ORklHPSItRENNQUtFX0NYWF9GTEFHUz0tc3RkPWMrKzB4IC1EV0lUSF9DX0dMSUI9T0ZGIC1EV0lUSF9KQVZBPU9GRiAtRFdJVEhfU1REVEhSRUFEUz1PTiIKLSAgICAtIFRFU1RfTkFNRT0iY29tcGlsZXIgKG1pbmd3MzItZ2NjLCBDTWFrZSArIENQYWNrKSIKLSAgICAgIENNQUtFX0NPTkZJRz0iLURDTUFLRV9UT09MQ0hBSU5fRklMRT0uLi9idWlsZC9jbWFrZS9taW5ndzMyLXRvb2xjaGFpbi5jbWFrZSAtREJVSUxEX0NPTVBJTEVSPU9OIC1EQlVJTERfTElCUkFSSUVTPU9GRiAtREJVSUxEX1RFU1RJTkc9T0ZGIC1EQlVJTERfRVhBTVBMRVM9T0ZGIgotCi0gICAgIyBBdXRvdG9vbCBidWlsZHMKLSAgICAjIFRPRE86IFJlbW92ZSB0aGVtIGFzIG1pZ3JhdGlvbiBpcyBtYWRlCi0gICAgLSBURVNUX05BTUU9ImNvbXBpbGVyIChhdXRvbWFrZSkiCi0gICAgICBDT05GSUc9Ii0tZGlzYWJsZS1saWJzIgotICAgIC0gVEVTVF9OQU1FPSJhbGwgKGF1dG9tYWtlKSIKLSAgICAgIENPTkZJRz0iLS13aXRob3V0LWVybGFuZyAtLXdpdGhvdXQtcHl0aG9uIC0td2l0aG91dC1nbyAtLXdpdGhvdXQtbHVhIgotICAgICAgQUxMX0RFUFM9InllcyIKLSAgICAtIFRFU1RfTkFNRT0iQyAmIEMrKyAmIEhhc2tlbGwgKGF1dG9tYWtlKSIKLSAgICAgIENPTkZJRz0iLS13aXRob3V0LWNzaGFycCAtLXdpdGhvdXQtamF2YSAtLXdpdGhvdXQtZXJsYW5nIC0td2l0aG91dC1ub2RlanMgLS13aXRob3V0LWx1YSAtLXdpdGhvdXQtcHl0aG9uIC0td2l0aG91dC1wZXJsIC0td2l0aG91dC1waHAgLS13aXRob3V0LXBocC1leHRlbnNpb24gLS13aXRob3V0LXJ1YnkgLS13aXRob3V0LWdvIC0td2l0aG91dC1kIgotICAgICAgQUxMX0RFUFM9InllcyIKLSAgICAtIFRFU1RfTkFNRT0iU21hbGwgU2V0IChhdXRvbWFrZSkiCi0gICAgICBDT05GSUc9Ii0td2l0aG91dC1lcmxhbmcgLS13aXRob3V0LWhhc2tlbGwgLS13aXRob3V0LXB5dGhvbiAtLXdpdGhvdXQtZ28gLS13aXRob3V0LWx1YSAtLXdpdGhvdXQtZCAtLXdpdGhvdXQtcnVieSAtLXdpdGhvdXQtbm9kZWpzIC0td2l0aG91dC1qYXZhIgotICAgICAgQUxMX0RFUFM9InllcyIKLSAgICAtIFRFU1RfTkFNRT0iZGlzdCAoYXV0b21ha2UpIgotICAgICAgQ09ORklHPSIiCi0gICAgICBBTExfREVQUz0ieWVzIgotICAgICAgTUFLRV9UQVJHRVQ9ImRpc3QiCi0KLW1hdHJpeDoKLSAgYWxsb3dfZmFpbHVyZXM6Ci0gICAgIyBnY2MgZmFpbHMgb24gdHJhdmlzIHNlZW1pbmdseSBkdWUgdG8gb3V0IG9mIG1lbW9yeQotICAgIC0gY29tcGlsZXI6IGdjYwotCi0gIGV4Y2x1ZGU6Ci0gICAgIyBUaGlzIG9uZSB0YWtlcyB2ZXJ5IGxvbmcKLSAgICAtIGNvbXBpbGVyOiBnY2MKLSAgICAgIGVudjogVEVTVF9OQU1FPSJtYWtlIGNyb3NzIChhdXRvbWFrZSkiIENPTkZJRz0iLS13aXRob3V0LXB5dGhvbiIgQUxMX0RFUFM9InllcyIgTUFLRV9UQVJHRVQ9ImNyb3NzIgotCi0gICAgIyBEb2VzIG5vdCB1c2UgbmF0aXZlIGNvbXBpbGVyLCBubyBuZWVkIHRvIGRvIGl0IHR3aWNlCi0gICAgLSBjb21waWxlcjogZ2NjCi0gICAgICBlbnY6IFRFU1RfTkFNRT0iY29tcGlsZXIgKG1pbmd3MzItZ2NjLCBDTWFrZSArIENQYWNrKSIgQ01BS0VfQ09ORklHPSItRENNQUtFX1RPT0xDSEFJTl9GSUxFPS4uL2J1aWxkL2NtYWtlL21pbmd3MzItdG9vbGNoYWluLmNtYWtlIC1EQlVJTERfQ09NUElMRVI9T04gLURCVUlMRF9MSUJSQVJJRVM9T0ZGIC1EQlVJTERfVEVTVElORz1PRkYgLURCVUlMRF9FWEFNUExFUz1PRkYiCi0gICAgLSBjb21waWxlcjogZ2NjCi0gICAgICBlbnY6IFRFU1RfTkFNRT0iZGlzdCAoYXV0b21ha2UpIiBDT05GSUc9IiIgQUxMX0RFUFM9InllcyIgTUFLRV9UQVJHRVQ9ImRpc3QiCi0KK2pvYnM6CiAgIGluY2x1ZGU6Ci0gICAgLSBlbnY6Ci0gICAgICAgIC0gVEVTVF9OQU1FPSJEZWJpYW4gUGFja2FnZXMiCi0gICAgICBjb21waWxlcjogY2xhbmcKLSAgICAgIGJlZm9yZV9pbnN0YWxsOgotICAgICAgIC0gc2ggYnVpbGQvdHJhdmlzL2luc3RhbGxDWFhEZXBlbmRlbmNpZXMuc2g7Ci0gICAgICAgLSBzaCBidWlsZC90cmF2aXMvaW5zdGFsbERlcGVuZGVuY2llcy5zaCAxPiAvZGV2L251bGw7Ci0gICAgICAgLSBzdWRvIGFwdC1nZXQgaW5zdGFsbCBidWlsZC1lc3NlbnRpYWwgbW9uby1nbWNzIG1vbm8tZGV2ZWwgbGlibW9uby1zeXN0ZW0td2ViMi4wLWNpbCBlcmxhbmctYmFzZSBydWJ5MS44LWRldiBweXRob24tYWxsIHB5dGhvbi1hbGwtZGV2IHB5dGhvbi1hbGwtZGJnIHBocDUgcGhwNS1kZXYKLSAgICAgIHNjcmlwdDoKLSAgICAgICAtIGRwa2ctYnVpbGRwYWNrYWdlIC10YyAtdXMgLXVjCi0gICAgICAgLSBscyAtYWwgLi4KKyAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT0gc3RhZ2U6IGRvY2tlciA9PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgLSBzdGFnZTogZG9ja2VyCisgICAgICBzY3JpcHQ6IHRydWUKKyAgICAgIGVudjoKKyAgICAgICAgLSBKT0I9IkRvY2tlciBCdWlsZCB1YnVudHUteGVuaWFsIDE2LjA0IExUUyIKKyAgICAgICAgLSBESVNUUk89dWJ1bnR1LXhlbmlhbAorICAgICAgICAtIFRSQVZJU19CVUlMRF9TVEFHRT1kb2NrZXIKKyAgICAtIHNjcmlwdDogdHJ1ZQorICAgICAgZW52OgorICAgICAgICAtIEpPQj0iRG9ja2VyIEJ1aWxkIHVidW50dS1iaW9uaWMgMTguMDQgTFRTIgorICAgICAgICAtIERJU1RSTz11YnVudHUtYmlvbmljCisgICAgICAgIC0gVFJBVklTX0JVSUxEX1NUQUdFPWRvY2tlcgogCisgICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09IHN0YWdlOiB0aHJpZnQgPT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcGhhc2U6IGNyb3NzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgYXBhY2hlL3RocmlmdCBvZmZpY2lhbCBQUiBidWlsZHMgY2FuIGV4Y2VlZCA1MCBtaW51dGVzIHBlciBqb2Igc28gY29tYmluZSBhbGwgY3Jvc3MgdGVzdHMKKyAgICAtIHN0YWdlOiB0aHJpZnQKKyAgICAgIHNjcmlwdDogYnVpbGQvZG9ja2VyL3J1bi5zaAorICAgICAgaWY6IHJlcG8gPSBhcGFjaGUvdGhyaWZ0CisgICAgICBlbnY6CisgICAgICAgIC0gSk9CPSJDcm9zcyBMYW5ndWFnZSBUZXN0cyIKKyAgICAgICAgLSBTQ1JJUFQ9ImNyb3NzLXRlc3Quc2giCiAKKyAgICAjIGZvcmsgYmFzZWQgUFIgYnVpbGRzIGNhbm5vdCBleGNlZWQgNTAgbWludXRlcyBwZXIgam9iCisgICAgLSBzdGFnZTogdGhyaWZ0CisgICAgICBzY3JpcHQ6IGJ1aWxkL2RvY2tlci9ydW4uc2gKKyAgICAgIGlmOiByZXBvICE9IGFwYWNoZS90aHJpZnQKKyAgICAgIGVudjoKKyAgICAgICAgLSBKT0I9IkNyb3NzIExhbmd1YWdlIFRlc3RzIChCaW5hcnkgUHJvdG9jb2wpIgorICAgICAgICAtIFNDUklQVD0iY3Jvc3MtdGVzdC5zaCIKKyAgICAgICAgLSBCVUlMRF9BUkc9Ii0nKGJpbmFyeSknIgorCisgICAgLSBzdGFnZTogdGhyaWZ0CisgICAgICBzY3JpcHQ6IGJ1aWxkL2RvY2tlci9ydW4uc2gKKyAgICAgIGlmOiByZXBvICE9IGFwYWNoZS90aHJpZnQKKyAgICAgIGVudjoKKyAgICAgICAgLSBKT0I9IkNyb3NzIExhbmd1YWdlIFRlc3RzIChIZWFkZXIsIEpTT04gUHJvdG9jb2xzKSIKKyAgICAgICAgLSBTQ1JJUFQ9ImNyb3NzLXRlc3Quc2giCisgICAgICAgIC0gQlVJTERfQVJHPSItJyhoZWFkZXJ8anNvbiknIgorCisgICAgLSBzdGFnZTogdGhyaWZ0CisgICAgICBzY3JpcHQ6IGJ1aWxkL2RvY2tlci9ydW4uc2gKKyAgICAgIGlmOiByZXBvICE9IGFwYWNoZS90aHJpZnQKKyAgICAgIGVudjoKKyAgICAgICAgLSBKT0I9IkNyb3NzIExhbmd1YWdlIFRlc3RzIChDb21wYWN0IGFuZCBNdWx0aXBsZXhlZCBQcm90b2NvbHMpIgorICAgICAgICAtIFNDUklQVD0iY3Jvc3MtdGVzdC5zaCIKKyAgICAgICAgLSBCVUlMRF9BUkc9Ii0nKGNvbXBhY3R8bXVsdGlwbGV4ZWQpJyIKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwaGFzZTogc2NhIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIyBRQSBqb2JzIGZvciBjb2RlIGFuYWx5dGljcyBhbmQgbWV0cmljcworICAgIC0gc3RhZ2U6IHRocmlmdAorICAgICAgc2NyaXB0OiBidWlsZC9kb2NrZXIvcnVuLnNoCisgICAgICBlbnY6CisgICAgICAgIC0gSk9CPSJTdGF0aWMgQ29kZSBBbmFseXNpcyIKKyAgICAgICAgLSBTQ1JJUFQ9InNjYS5zaCIKIAotICAgICMgc3RhdGljIGNvZGUgYW5hbHlzaXMgd2l0aCBjcHBjaGVjayAod2UgY2FuIGFkZCAtLWVuYWJsZT1hbGwgbGF0ZXIpCi0gICAgLSBlbnY6ICAgIFRFU1RfTkFNRT0iY3BwY2hlY2sgKGNvbXBpbGVyKSBlcnJvciIKLSAgICAgIHNjcmlwdDogY3BwY2hlY2sgLS1mb3JjZSAtLXF1aWV0IC0taW5saW5lLXN1cHByIC0tZXJyb3ItZXhpdGNvZGU9MSAtajIgY29tcGlsZXIvY3BwL3NyYwotICAgICAgYmVmb3JlX2luc3RhbGw6IHN1ZG8gYXB0LWdldCBpbnN0YWxsIGNwcGNoZWNrCi0gICAgLSBlbnY6ICAgIFRFU1RfTkFNRT0iY3BwY2hlY2sgKGNwcCkgZXJyb3IiCi0gICAgICBzY3JpcHQ6IGNwcGNoZWNrIC0tZm9yY2UgLS1xdWlldCAtLWlubGluZS1zdXBwciAtLWVycm9yLWV4aXRjb2RlPTEgLWoyIGxpYi9jcHAvc3JjIGxpYi9jcHAvdGVzdCB0ZXN0L2NwcCB0dXRvcmlhbC9jcHAKLSAgICAgIGJlZm9yZV9pbnN0YWxsOiBzdWRvIGFwdC1nZXQgaW5zdGFsbCBjcHBjaGVjawotICAgIC0gZW52OiAgICBURVNUX05BTUU9ImNwcGNoZWNrIChjX2dsaWIpIGVycm9yIgotICAgICAgc2NyaXB0OiBjcHBjaGVjayAtLWZvcmNlIC0tcXVpZXQgLS1pbmxpbmUtc3VwcHIgLS1lcnJvci1leGl0Y29kZT0xIC1qMiBsaWIvY19nbGliL3NyYyBsaWIvY19nbGliL3Rlc3QgdGVzdC9jX2dsaWIvc3JjIHR1dG9yaWFsL2NfZ2xpYgotICAgICAgYmVmb3JlX2luc3RhbGw6IHN1ZG8gYXB0LWdldCBpbnN0YWxsIGNwcGNoZWNrCi0gICAgIyBhZGQgLS1lcnJvci1leGl0Y29kZT0xIGFzIHNvb24gYXMgZXZlcnl0aGluZyBpcyBmaXhlZAotICAgIC0gZW52OiAgICBURVNUX05BTUU9ImNwcGNoZWNrIChjb21waWxlcikgYWxsIgotICAgICAgc2NyaXB0OiBjcHBjaGVjayAtLWZvcmNlIC0tcXVpZXQgLS1pbmxpbmUtc3VwcHIgLS1lbmFibGU9YWxsIC1qMiBjb21waWxlci9jcHAvc3JjCi0gICAgICBiZWZvcmVfaW5zdGFsbDogc3VkbyBhcHQtZ2V0IGluc3RhbGwgY3BwY2hlY2sKLSAgICAtIGVudjogICAgVEVTVF9OQU1FPSJjcHBjaGVjayAoY3BwKSBhbGwiCi0gICAgICBzY3JpcHQ6IGNwcGNoZWNrIC0tZm9yY2UgLS1xdWlldCAtLWlubGluZS1zdXBwciAtLWVuYWJsZT1hbGwgLWoyIGxpYi9jcHAvc3JjIGxpYi9jcHAvdGVzdCB0ZXN0L2NwcCB0dXRvcmlhbC9jcHAKLSAgICAgIGJlZm9yZV9pbnN0YWxsOiBzdWRvIGFwdC1nZXQgaW5zdGFsbCBjcHBjaGVjawotICAgIC0gZW52OiAgICBURVNUX05BTUU9ImNwcGNoZWNrIChjX2dsaWIpIGFsbCIKLSAgICAgIHNjcmlwdDogY3BwY2hlY2sgLS1mb3JjZSAtLXF1aWV0IC0taW5saW5lLXN1cHByIC0tZW5hYmxlPWFsbCAtajIgbGliL2NfZ2xpYi9zcmMgbGliL2NfZ2xpYi90ZXN0IHRlc3QvY19nbGliL3NyYyB0dXRvcmlhbC9jX2dsaWIKLSAgICAgIGJlZm9yZV9pbnN0YWxsOiBzdWRvIGFwdC1nZXQgaW5zdGFsbCBjcHBjaGVjaworICAgICMgQyBhbmQgQysrIHVuZGVmaW5lZCBiZWhhdmlvci4KKyAgICAjIEEgYmluYXJ5IGNyYXNoZXMgaWYgdW5kZWZpbmVkIGJlaGF2aW9yIG9jY3VycyBhbmQgcHJvZHVjZXMgYSBzdGFjayB0cmFjZS4KKyAgICAjIHB5dGhvbiBpcyBkaXNhYmxlZCwgc2VlOiBUSFJJRlQtNDM2MAorICAgIC0gc2NyaXB0OiBidWlsZC9kb2NrZXIvcnVuLnNoCisgICAgICBlbnY6CisgICAgICAgIC0gSk9CPSJVQlNhbiIKKyAgICAgICAgLSBTQ1JJUFQ9InVic2FuLnNoIgorICAgICAgICAtIEJVSUxEX0FSRz0iLS13aXRob3V0LXB5dGhvbiAtLXdpdGhvdXQtcHkzIgogCi0gICAgIyBUT0RPIHVzZSBmaW5kYnVncyBmb3IgSmF2YQotICAgICMgVE9ETyB1c2UgZnhjb3AgZm9yIEMjCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHBoYXNlOiBhdXRvdG9vbHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIFRPRE86IFJlbW92ZSB0aGVtIG9uY2UgbWlncmF0ZWQgdG8gQ01ha2UKKyAgICAtIHNjcmlwdDogYnVpbGQvZG9ja2VyL3J1bi5zaAorICAgICAgZW52OgorICAgICAgICAtIEpPQj0iQXV0b3Rvb2xzIChVYnVudHUgQmlvbmljKSIKKyAgICAgICAgLSBTQ1JJUFQ9ImF1dG90b29scy5zaCIKIAotICAgICMgVE9ETyBkbyBzdHlsZSBjaGVja3MKKyAgICAtIHNjcmlwdDogYnVpbGQvZG9ja2VyL3J1bi5zaAorICAgICAgZW52OgorICAgICAgICAtIEpPQj0iQXV0b3Rvb2xzIChVYnVudHUgWGVuaWFsKSIKKyAgICAgICAgLSBESVNUUk89dWJ1bnR1LXhlbmlhbAorICAgICAgICAtIFNDUklQVD0iYXV0b3Rvb2xzLnNoIgogCi0gICAgIyBzZWFyY2ggZm9yIFRPRE8gd2l0aGluIHNvdXJjZSB0cmVlCi0gICAgLSBlbnY6ICAgIFRFU1RfTkFNRT0iVE9ETyIKLSAgICAgIGJlZm9yZV9pbnN0YWxsOgotICAgICAgc2NyaXB0OiBncmVwIC1yIFRPRE8gKgotICAgICMgc2VhcmNoIGZvciBGSVhNRSB3aXRoaW4gc291cmNlIHRyZWUKLSAgICAtIGVudjogICAgVEVTVF9OQU1FPSJGSVhNRSIKLSAgICAgIGJlZm9yZV9pbnN0YWxsOgotICAgICAgc2NyaXB0OiBncmVwIC1yIEZJWE1FICoKLSAgICAjIHNlYXJjaCBmb3IgSEFDSyB3aXRoaW4gc291cmNlIHRyZWUKLSAgICAtIGVudjogICAgVEVTVF9OQU1FPSJIQUNLIgotICAgICAgYmVmb3JlX2luc3RhbGw6Ci0gICAgICBzY3JpcHQ6IGdyZXAgLXIgSEFDSyAqCi0gICAgIyBzb21lIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGNvZGUgYmFzZQotICAgIC0gZW52OiAgICBURVNUX05BTUU9InNsb2Njb3VudCIKLSAgICAgIGJlZm9yZV9pbnN0YWxsOgotICAgICAgc2NyaXB0OiBzbG9jY291bnQgLgotICAgICAgYmVmb3JlX2luc3RhbGw6IHN1ZG8gYXB0LWdldCBpbnN0YWxsIHNsb2Njb3VudAotICAgICMgc29tZSBpbmZvIGFib3V0IHRoZSBidWlsZCBtYWNoaW5lCi0gICAgLSBlbnY6ICAgIFRFU1RfTkFNRT0iaW5mbyIKLSAgICAgIGJlZm9yZV9pbnN0YWxsOgotICAgICAgc2NyaXB0OgotICAgICAgIC0gZHBrZyAtbAotICAgICAgIC0gdW5hbWUgLWEKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcGhhc2U6IGNtYWtlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC0gc2NyaXB0OiBidWlsZC9kb2NrZXIvcnVuLnNoCisgICAgICBlbnY6CisgICAgICAgIC0gSk9CPSJDTWFrZSIKIAotIyBUT0RPIG1ha2UgaXQgcGVyZmVjdCA7LXIKLSMKKyAgICAjIEMrKyBzcGVjaWZpYyBvcHRpb25zOiBjb21waWxlciBwbHVnLWluLCB0aHJlYWRpbmcgbW9kZWwKKyAgICAtIHNjcmlwdDogYnVpbGQvZG9ja2VyL3J1bi5zaAorICAgICAgZW52OgorICAgICAgICAtIEpPQj0iQysrIChTdGQgVGhyZWFkKSBhbmQgUGx1Z2luIgorICAgICAgICAtIFNDUklQVD0iY21ha2Uuc2giCisgICAgICAgIC0gQlVJTERfTElCUz0iQ1BQIFRFU1RJTkcgVFVUT1JJQUxTIgorICAgICAgICAtIEJVSUxEX0FSRz0iLURXSVRIX1BMVUdJTj1PTiAtRFdJVEhfU1REVEhSRUFEUz1PTiAtRFdJVEhfUFlUSE9OPU9GRiAtRFdJVEhfQ19HTElCPU9GRiAtRFdJVEhfSkFWQT1PRkYgLURXSVRIX0hBU0tFTEw9T0ZGIgorICAgICAgICAtIEJVSUxEX0VOVj0iLWUgQ0M9Y2xhbmcgLWUgQ1hYPWNsYW5nKysiCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcGhhc2U6IGRpc3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC0gc2NyaXB0OiBidWlsZC9kb2NrZXIvcnVuLnNoCisgICAgICBlbnY6CisgICAgICAgIC0gSk9CPSJtYWtlIGRpc3QiCisgICAgICAgIC0gU0NSSVBUPSJtYWtlLWRpc3Quc2giCisKKyAgICAtIHNjcmlwdDogYnVpbGQvZG9ja2VyL3J1bi5zaAorICAgICAgZW52OgorICAgICAgICAtIEpPQj0iRGViaWFuIFBhY2thZ2VzIgorICAgICAgICAtIFNDUklQVD0iZHBrZy5zaCIKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwaGFzZTogY292ZXJpdHkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBXZSBidWlsZCB0aGUgY292ZXJpdHkgc2NhbiBidWlsZCBvbmNlIG1vbnRobHkgdXNpbmcgYSB0cmF2aXMgY3JvbiBqb2IKKyAgICAtIGlmOiAoZW52KENPVkVSSVRZX1NDQU5fTk9USUZJQ0FUSU9OX0VNQUlMKSBJUyBwcmVzZW50KSBBTkQgKGJyYW5jaCBJTiAobWFzdGVyKSkgQU5EICh0eXBlIElOIChjcm9uKSkKKyAgICAgIHNjcmlwdDogYnVpbGQvZG9ja2VyL3J1bi5zaAorICAgICAgZW52OgorICAgICAgICAtIEpPQj0iQ292ZXJpdHkgU2NhbiIKKyAgICAgICAgLSBTQ1JJUFQ9ImNvdnNjYW4uc2giCisgICAgIAorCisgICMjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHBoYXNlOiBvc3ggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIyBkaXNhYmxlZCBkdWUgdG8gdGhlIHRpbWUgZGVsYXlzIGl0IGltcG9zZXMgb24gYnVpbGQgam9icworICAjIC0gb3M6IG9zeAorICAjICAgb3N4X2ltYWdlOiB4Y29kZTkKKyAgIyAgIHNjcmlwdDogYnVpbGQvZG9ja2VyL3NjcmlwdHMvYXV0b3Rvb2xzLnNoCisKZGlmZiAtLWdpdCBhL0FwYWNoZVRocmlmdC5udXNwZWMgYi9BcGFjaGVUaHJpZnQubnVzcGVjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0ZWQyYzYKLS0tIC9kZXYvbnVsbAorKysgYi9BcGFjaGVUaHJpZnQubnVzcGVjCkBAIC0wLDAgKzEsNTAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorCis8IS0tCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworICBJbnN0cnVjdGlvbnMgZm9yIGJ1aWxkaW5nIGEgbnVnZXQgcGFja2FnZToKKworICAxLiBPcGVuIFRocmlmdC5zbG4gaW4gbGliXGNzaGFycFxzcmMgYW5kIGJ1aWxkIHRoZSByZWxlYXNlIHZlcnNpb24KKyAgICAgb2YgdGhlICJUaHJpZnQiIGFuZCAiVGhyaWZ0LjQ1IiBwcm9qZWN0cy4KKyAgMi4gT3BlbiBUaHJpZnQuc2xuIGluIGxpYlxuZXRjb3JlIGFuZCBidWlsZCB0aGUgcmVsZWFzZSB2ZXJzaW9uIG9mCisgICAgIHRoZSAiVGhyaWZ0IiBwcm9qZWN0LgorICAzLiBudWdldCBzZXRBcGlLZXkgPHlvdXItYXBpLWtleT4KKyAgMy4gbnVnZXQgcGFjayBBcGFjaGVUaHJpZnQubnVzcGVjIC1TeW1ib2xzIC1TeW1ib2xQYWNrYWdlRm9ybWF0IHNudXBrZworICA0LiBudWdldCBwdXNoIEFwYWNoZVRocmlmdC4xLjAuMC5udXBrZyAtU291cmNlIGh0dHBzOi8vYXBpLm51Z2V0Lm9yZy92My9pbmRleC5qc29uCisgIC0tPgorCis8cGFja2FnZSB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9wYWNrYWdpbmcvMjAxMy8wNS9udXNwZWMueHNkIj4KKyAgPG1ldGFkYXRhPgorICAgIDxpZD5BcGFjaGVUaHJpZnQ8L2lkPgorICAgIDx2ZXJzaW9uPjEuMC4wPC92ZXJzaW9uPgorICAgIDx0aXRsZT5BcGFjaGUgVGhyaWZ0IDEuMC4wPC90aXRsZT4KKyAgICA8YXV0aG9ycz5BcGFjaGUgVGhyaWZ0IERldmVsb3BlcnM8L2F1dGhvcnM+CisgICAgPG93bmVycz5BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvb3duZXJzPgorICAgIDxsaWNlbnNlIHR5cGU9ImV4cHJlc3Npb24iPkFwYWNoZS0yLjA8L2xpY2Vuc2U+CisgICAgPHByb2plY3RVcmw+aHR0cDovL3RocmlmdC5hcGFjaGUub3JnLzwvcHJvamVjdFVybD4KKyAgICA8cmVxdWlyZUxpY2Vuc2VBY2NlcHRhbmNlPnRydWU8L3JlcXVpcmVMaWNlbnNlQWNjZXB0YW5jZT4KKyAgICA8c3VtbWFyeT5BcGFjaGUgVGhyaWZ0IC5ORVQgTGlicmFyeTwvc3VtbWFyeT4KKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICBDb250YWlucyBydW50aW1lIGxpYnJhcmllcyBmcm9tIGxpYi9jc2hhcnAgZm9yIG5ldDM1IGFuZCBuZXQ0NSBmcmFtZXdvcmtzLCAKKyAgICAgIGFuZCBmcm9tIGxpYi9uZXRjb3JlIGZvciBuZXRzdGFuZGFyZDIuMCBmcmFtZXdvcmsgZGV2ZWxvcG1lbnQuCisgICAgPC9kZXNjcmlwdGlvbj4KKyAgICA8cmVwb3NpdG9yeSB0eXBlPSJHaXRIdWIiIHVybD0iaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQiIGJyYW5jaD0icmVsZWFzZS8xLjAuMCIgLz4KKyAgICA8dGFncz5BcGFjaGUgVGhyaWZ0IFJQQzwvdGFncz4KKyAgPC9tZXRhZGF0YT4KKyAgPGZpbGVzPgorICAgIDxmaWxlIHNyYz0ibGliXGNzaGFycFxzcmNcYmluXFJlbGVhc2VcVGhyaWZ0LioiIHRhcmdldD0ibGliXG5ldDM1IiAvPgorICAgIDxmaWxlIHNyYz0ibGliXGNzaGFycFxzcmNcYmluXFJlbGVhc2VcVGhyaWZ0NDUuKiIgdGFyZ2V0PSJsaWJcbmV0NDUiIC8+CisgICAgPGZpbGUgc3JjPSJsaWJcbmV0Y29yZVxUaHJpZnRcYmluXFJlbGVhc2VcbmV0c3RhbmRhcmQyLjBcKi4qIiB0YXJnZXQ9ImxpYlxuZXRzdGFuZGFyZDIuMCIgLz4KKyAgPC9maWxlcz4KKzwvcGFja2FnZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9DSEFOR0VTIGIvQ0hBTkdFUwppbmRleCA4Njk5MjYxLi4yNDRmMGRhIDEwMDY0NAotLS0gYS9DSEFOR0VTCisrKyBiL0NIQU5HRVMKQEAgLTEsNSArMSwxMTQ0IEBACiBBcGFjaGUgVGhyaWZ0IENoYW5nZWxvZwogCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorVGhyaWZ0IDAuMTIuMAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjIE5ldyBMYW5ndWFnZXMKKyAgICAqIENvbW1vbiBMSVNQIChjbCkKKyAgICAqIFN3aWZ0CisgICAgKiBUeXBlc2NyaXB0IChub2RldHMpCisKKyMjIERlcHJlY2F0ZWQgTGFuZ3VhZ2VzCisgICAgKiBDb2NvYQorCisjIyBCcmVha2luZyBDaGFuZ2VzIChzaW5jZSAwLjExLjApCisgICAgKiBbVEhSSUZULTQ1MjldIC0gUnVzdCBlbnVtIHZhcmlhbnRzIGFyZSBub3cgY2FtZWwtY2FzZWQgaW5zdGVhZCBvZiB1cHBlcmNhc2VkIHRvIGNvbmZvcm0gdG8gUnVzdCBuYW1pbmcgY29udmVudGlvbnMKKyAgICAqIFtUSFJJRlQtNDQ0OF0gLSBTdXBwb3J0IGZvciBnb2xhbmcgMS42IGFuZCBlYXJsaWVyIGhhcyBiZWVuIGRyb3BwZWQuCisgICAgKiBbVEhSSUZULTQ0NzRdIC0gUEhQIG5vdyB1c2VzIHRoZSBQU1ItNCBsb2FkZXIgYnkgZGVmYXVsdCBpbnN0ZWFkIG9mIGNsYXNzIG1hcHMuCisgICAgKiBbVEhSSUZULTQ1MzJdIC0gbWV0aG9kIHNpZ25hdHVyZXMgY2hhbmdlZCBpbiB0aGUgY29tcGlsZXIncyB0X29vcF9nZW5lcmF0b3IuCisgICAgKiBbVEhSSUZULTQ2NDhdIC0gVGhlIEMgKEdMaWIpIGNvbXBpbGVyJ3MgaGFuZGxpbmcgb2YgbmFtZXNwYWNlcyBoYXMgYmVlbiBpbXByb3ZlZC4KKworIyMgS25vd24gSXNzdWVzIChCbG9ja2VyIG9yIENyaXRpY2FsKQorICAgICogW1RIUklGVC00MDM3XSAtIGJ1aWxkOiB1c2UgYSBzaW5nbGUgYnVpbGQgc3lzdGVtIGZvciB0aHJpZnQKKyAgICAqIFtUSFJJRlQtNDExOV0gLSBidWlsZDogYm9vdHN0cmFwLnNoIGlzIG1pc3NpbmcgZnJvbSBzb3VyY2UgdGFyYmFsbAorICAgICogW1RIUklGVC0zMjg5XSAtIGNzaGFycDogc29ja2V0IGV4aGF1c3Rpb24gaW4gY3NoYXJwIGltcGxlbWVudGF0aW9uCisgICAgKiBbVEhSSUZULTMwMjldIC0gY29jb2E6IEdldHRlcnMgZm9yIGZpZWxkcyBkZWZpbmVkIHdpdGggdXBwZXJjYXNlIG5hbWVzIGRvIG5vdCB3b3JrCisgICAgKiBbVEhSSUZULTMzMjVdIC0gY29jb2E6IEV4dGVuZGVkIHNlcnZpY2VzIGFyZW4ndCBzdWJjbGFzc2VzIGluIGdlbmVyYXRlZCBDb2NvYQorICAgICogW1RIUklGVC00MTE2XSAtIGNvY29hOiBUaHJpZnQgZGUtY2FwaXRhbGl6ZXMgdGhlIG5hbWUgb2YgSXNTZXQgcHJvcGVydHkgaW4gQ29jb2EKKyAgICAqIFtUSFJJRlQtMzg3N10gLSBjcHA6IHRoZSBodHRwIGltcGxlbWVudGF0aW9uIGlzIG5vdCBzdGFuZGFyZDsgaW50ZXJvcCB3aXRoIG90aGVyIGxhbmd1YWdlcyBpcyBzcG90dHkgYXQgYmVzdAorICAgICogW1RIUklGVC00MTgwXSAtIGNwcDogSW1wb3NzaWJsZSB0byBidWlsZCBUaHJpZnQgQysrIGxpYnJhcnkgZm9yIEFuZHJvaWQgKE5ESykKKyAgICAqIFtUSFJJRlQtNDM4NF0gLSBjcHA6IFVzaW5nIG11bHRpcGxlIGFzeW5jIHNlcnZpY2VzIHNpbXVsdGFuZW91c2x5IGlzIG5vdCB0aHJlYWQtc2FmZQorICAgICogW1RIUklGVC0zMTA4XSAtIGhhc2tlbGw6IERlZmF1bHRlZCBzdHJ1Y3QgcGFyYW1ldGVycyBvbiBhIHNlcnZpY2UgZ2VuZXJhdGVzIGludmFsaWQgSGFza2VsbAorICAgICogW1RIUklGVC0zOTkwXSAtIG5vZGVqczogRXhjZXB0aW9uIHN3YWxsb3dlZCBieSBkZXNlcmlhbGl6YXRpb24gZnVuY3Rpb24KKyAgICAqIFtUSFJJRlQtNDIxNF0gLSBub2RlanM6IG1hcDxpNjQsdmFsdWU+IGtleSB0cmVhdGVkIGFzIGhleCB2YWx1ZSBpbiBKYXZhU2NyaXB0CisgICAgKiBbVEhSSUZULTQ2MDJdIC0gbm9kZWpzOiBFUlJPUiBpbiAuL25vZGVfbW9kdWxlcy90aHJpZnQvbGliL25vZGVqcy9saWIvdGhyaWZ0L2Nvbm5lY3Rpb24uanMgTW9kdWxlIG5vdCBmb3VuZDogRXJyb3I6IENhbid0IHJlc29sdmUgJ2NoaWxkX3Byb2Nlc3MnCisgICAgKiBbVEhSSUZULTQ2MzldIC0gbm9kZWpzOiBTZXF1ZW5jZSBudW1iZXJpbmcgZm9yIG11bHRpcGxleGVkIHByb3RvY29sIGJyb2tlbgorICAgICogW1RIUklGVC0xMzEwXSAtIHBocDogc2VxdWVuY2UgYW5kIHJlY29ubmVjdGlvbiBtYW5hZ2VtZW50IGlzc3VlcworICAgICogW1RIUklGVC0xNTM4XSAtIHBocDogRXJyb3IgZHVyaW5nIGRlc2VyaWFsaXphdGlvbiBpbnQ2NCBvbiAzMi1iaXQgYXJjaGl0ZWN0dXJlCisgICAgKiBbVEhSSUZULTE1ODBdIC0gcGhwOiB0aHJpZnQgdHlwZSBpNjQgamF2YSB0byBwaHAgc2VyaWFsaXplL2Rlc2VyZWFsaXplIG5vdCB3b3JraW5nCisgICAgKiBbVEhSSUZULTE5NTBdIC0gcGhwOiBQSFAgZ2V0cyBzdHVjayBpbiBpbmZpbml0ZSBsb29wCisgICAgKiBbVEhSSUZULTI5NTRdIC0gcHl0aG9uOiBzZW5kaW5nIGludCBvciBmbG9hdCBpbiBhIGRvdWJsZSBmaWVsZCBicmVha3MgdGhlIGNvbm5lY3Rpb24KKyAgICAqIFtUSFJJRlQtNDA4MF0gLSBweXRob246IHVuaXggc29ja2V0cyBjYW4gZ2V0IHN0dWNrIGZvcmV2ZXIKKyAgICAqIFtUSFJJRlQtNDI4MV0gLSBweXRob246IGdlbmVyYXRlZCBjb2RlIGlzIG91dCBvZiBvcmRlciBhbmQgY2F1c2VzIGxvYWQgaXNzdWVzCisgICAgKiBbVEhSSUZULTQ2NzddIC0gcHkzOiBVbmljb2RlRGVjaWRlRXJyb3IgaW4gUHl0aG9uMworCisjIyBCdWlsZCBQcm9jZXNzCisgICAgKiBbVEhSSUZULTQwNjddIC0gV2luZG93cyB0aHJpZnQgY29tcGlsZXIgZGlzdHJpYnV0ZWQgb24gdGhlIGFwYWNoZSB3ZWIgc2l0ZSBoYXMgcnVudGltZSBkZXBlbmRlbmNpZXMKKyAgICAqIFtUSFJJRlQtNDMwOF0gLSBEIGxhbmd1YWdlIGRvY2tlciBpbWFnZXMgbmVlZCBkZW1pb3MgZm9yIGxpYmV2ZW50IGFuZCBvcGVuc3NsIGZpeGVkIHRvIHJlLWVuYWJsZSBtYWtlIGNyb3NzIG9uIGRsYW5nCisgICAgKiBbVEhSSUZULTQ1NzldIC0gVXNlIFVidW50dSBCaW9uaWMgKDE4LjA0IExUUykgZm9yIENJIGJ1aWxkcyBpbnN0ZWFkIG9mIEFydGZ1bCAoMTcuMTApCisgICAgKiBbVEhSSUZULTQ1MDhdIC0gRGVmaW5lIENJIG9wZXJhdGluZyBzeXN0ZW0gY292ZXJhZ2UgcnVsZXMgZm9yIHRoZSBwcm9qZWN0IGFuZCAoaG9wZWZ1bGx5KSBzaW1wbGlmeSBDSSBhIGxpdHRsZSBtb3JlCisgICAgKiBbVEhSSUZULTQzOTddIC0gdWJ1bnR1IGluc3RhbGwgaW5zdHJ1Y3Rpb25zIGJyb2tlbiBvbiAxNi4wNAorICAgICogW1RIUklGVC00NTQ1XSAtIEFwcHZleW9yIGJ1aWxkcyBhcmUgZmFpbGluZyBkdWUgdG8gYSBoYXNrZWxsIC8gY2FiYWwgdXBkYXRlIGluIGNob2NvbGF0ZXkKKyAgICAqIFtUSFJJRlQtNDQ1Ml0gLSBvcHRpbWl6ZSBEb2NrZXJmaWxlIChvbmx5IG9uZXRpbWUgYXB0LWdldCB1cGRhdGUpCisgICAgKiBbVEhSSUZULTQ0NDBdIC0gcm0gYGJ1aWxkL2RvY2tlci91YnVudHUtdHJ1c3R5L0RvY2tlcmZpbGUub3JpZ2AKKyAgICAqIFtUSFJJRlQtNDM1Ml0gLSBVYnVudHUgQXJ0ZnVsIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBUaHJpZnQgYW5kIEhheGUgMy40LjIKKyAgICAqIFtUSFJJRlQtNDY2Nl0gLSBETGFuZyBDbGllbnQgUG9vbCBUZXN0IGZhaWxzIHNwb3JhZGljYWxseQorICAgICogW1RIUklGVC00Njc2XSAtIENMIHR1dG9yaWFsIGJ1aWxkIGZhaWxzIHNwb3JhZGljYWxseQorICAgICogW1RIUklGVC00NDU2XSAtIE1ha2UgaGF4ZWxpYiBkb3dubG9hZCBxdWlldCBzbyBpdCBkb2Vzbid0IGJsb3cgdXAgdGhlIGJ1aWxkIGxvZworICAgICogW1RIUklGVC00NjA1XSAtIGJvb3RzdHJhcC5zaCBmYWlscyBpZiBhdXRvbWFrZT0xLjE2LjEKKworIyMgY19nbGliCisgICAgKiBbVEhSSUZULTQ2NDhdIC0gVGhlIEMgKEdMaWIpIGNvbXBpbGVyJ3MgaGFuZGxpbmcgb2YgbmFtZXNwYWNlcyBoYXMgYmVlbiBpbXByb3ZlZC4KKyAgICAqIFtUSFJJRlQtNDYyMl0gLSBnbGliQyBjb21waWxhdGlvbiBpc3N1ZQorICAgICogW1RIUklGVC00NjcxXSAtIGMgZ2xpYiBpcyB1bmFibGUgdG8gaGFuZGxlIGNsaWVudCBjbG9zZSB1bmV4cGVjdGVkbHkKKworIyMgY2wgKG5ldyBsYW5ndWFnZSBzdXBwb3J0IGluIDAuMTIuMCkKKyAgICAqIFtUSFJJRlQtODJdIC0gQ29tbW9uIExpc3Agc3VwcG9ydAorCisjIyBjc2hhcnAKKyAgICAqIFtUSFJJRlQtNDU1OF0gLSByZXNlcnZlZCBDc2hhcnAga2V5d29yZHMgYXJlIG5vdCBlc2NhcGVkIGluIHNvbWUgY2FzZXMKKyAgICAqIFtUSFJJRlQtNDYzN10gLSBDIyBhc3luYyBtb2RlIGdlbmVyYXRlcyBpbmNvcnJlY3QgY29kZSB3aXRoIGluaGVyaXRlZCBzZXJ2aWNlcworICAgICogW1RIUklGVC00NjcyXSAtIElBc3luY1Jlc3VsdCBzdHlsZSBtZXRob2RzIG5vdCBiZWluZyBzdXBwb3J0ZWQgYnkgY2VydGFpbiB0cmFuc3BvcnRzIGxlYWRzIHRvIGlzc3VlcyBpbiBtaXhlZCBJU3luYy9JQXN5bmMgdXNlIGNhc2VzCisgICAgKiBbVEhSSUZULTQ1MzldIC0gQWxsb3cgVEJ1ZmZlcmVkVHJhbnNwb3J0IHRvIGJlIHVzZWQgYXMgYmFzZSBjbGFzcworICAgICogW1RIUklGVC00NTM1XSAtIFhNTCBkb2NzOyBjb2RlIGNsZWFudXAgKHRhYnMtPnNwYWNlczsgU3RyaW5nLT5zdHJpbmcpCisgICAgKiBbVEhSSUZULTQ0OTJdIC0gcHJvdGVjdGVkIEV4Y2VwdGlvblR5cGUgdHlwZSBtZW1iZXIgb2YgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGNhbm5vdCBiZSBhY2Nlc3NlZAorICAgICogW1RIUklGVC00NDQ2XSAtIEpTT05Qcm90b2NvbCBCYXNlNjQgRW5jb2RpbmcgVHJpbXMgUGFkZGluZworICAgICogW1RIUklGVC00NDU1XSAtIE1pc3NpbmcgZGlzcG9zZSBjYWxscyBpbiBUaHJlYWRlZFNlcnZlciAmIFRocmVhZHBvb2xTZXJ2ZXIKKyAgICAqIFtUSFJJRlQtNDYwOV0gLSBrZWVwIElubmVyRXhjZXB0aW9uIHdoZXJldmVyIGFwcHJvcHJpYXRlCisgICAgKiBbVEhSSUZULTQ2NzNdIC0gSUFzeW5jUmVzdWx0IG5vdCBzdXBwb3J0ZWQgYnkgbGF5ZXJlZCB0cmFuc3BvcnRzIChidWZmZXJlZC9mcmFtZWQpCisKKyMjIGNwcAorICAgICogW1RIUklGVC00NDc2XSAtIFR5cGVjYXN0aW5nIHByb2JsZW0gb24gbGlzdCBpdGVtcworICAgICogW1RIUklGVC00NDY1XSAtIFROb25ibG9ja2luZ1NlcnZlciB0aHJvd2luZyBUSFJJRlQgTE9HR0VSOiBUQ29ubmVjdGlvbjo6d29ya1NvY2tldCgpOiBUSFJJRlRfRUFHQUlOICh1bmF2YWlsYWJsZSByZXNvdXJjZXMpCisgICAgKiBbVEhSSUZULTQ2ODBdIC0gVEJ1ZmZlclRyYW5zcG9ydHMuaCBkb2VzIG5vdCBjb21waWxlIHVuZGVyIFZpc3VhbCBTdHVkaW8gMjAxNworICAgICogW1RIUklGVC00NjE4XSAtIFROb25ibG9ja2luZ1NlcnZlciBjcmFzaCBiZWNhdXNlIG9mIGxpbWl0YXRpb24gb2Ygc2VsZWN0KCkKKyAgICAqIFtUSFJJRlQtNDYyMF0gLSBUWmxpYlRyYW5zcG9ydC5jcHAgZG9lc24ndCBlbnN1cmUgdGhhdCB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgZm9yIHRoZSB6bGliIGZsdXNoIG1hcmtlciBpbiB0aGUgYnVmZmVyLgorICAgICogW1RIUklGVC00NTcxXSAtIFplcm9NUSBjb250cmliIGxpYnJhcnkgbmVlZHMgYSByZWZyZXNoCisgICAgKiBbVEhSSUZULTQ1NTldIC0gVFNTTFNlcnZlclNvY2tldCBpbmNvcnJlY3RseSBwcmludHMgZXJyb3JzCisgICAgKiBbVEhSSUZULTQ1NzhdIC0gTW92ZSBgVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3JgIGludG8gbWFpbiB0aHJpZnQgbGlicmFyeQorICAgICogW1RIUklGVC00NDE4XSAtIGV2aHR0cF9jb25uZWN0aW9uX25ldyBpcyBkZXByZWNhdGVkOyB1c2UgZXZodHRwX2Nvbm5lY3Rpb25fYmFzZV9uZXcKKworIyMgY29tcGlsZXIKKyAgICAqIFtUSFJJRlQtNDY0NF0gLSBDb21waWxlciBjYW5ub3QgYmUgY29tcGlsZWQgb24gbWFjT1MobWF5YmUgYWxzbyBvbiBvdGhlciBwbGF0Zm9ybXMgd2l0aCBjbGFuZykKKyAgICAqIFtUSFJJRlQtNDUzMV0gLSBUaHJpZnQgZ2VuZXJhdGVzIHdyb25nIFB5dGhvbiBjb2RlIGZvciBpbW11dGFibGUgc3RydWN0dXJlcyB3aXRoIG9wdGlvbmFsIG1lbWJlcnMKKyAgICAqIFtUSFJJRlQtNDUxM10gLSB0aHJpZnQgZ2VuZXJhdGVkIGNvZGUgaXMgbm90IHN0YWJsZSBmb3IgY29uc3RhbnRzCisgICAgKiBbVEhSSUZULTQ1MzJdIC0gQXZvaWQgdXBkYXRpbmcgVGhyaWZ0IGNvbXBpbGVyIGdlbmVyYXRlZCBjb2RlIGlmIHRoZSBvdXRwdXQgaGFzIG5vdCBjaGFuZ2VkCisgICAgKiBbVEhSSUZULTQ0MDBdIC0gVmlzdWFsIFN0dWRpbyBDb21waWxlciBwcm9qZWN0IHNob3VsZCBsaW5rIHJ1bnRpbWUgc3RhdGljYWxseSBpbiByZWxlYXNlIGJ1aWxkcworICAgICogW1RIUklGVC00Mzk5XSAtIHBsdWdpbi50aHJpZnQgdF9jb25zdF92YWx1ZSBpcyBub3QgdXNlZCBhcyBhIHVuaW9uIGluIEMrKyBjb2RlIC0tIGZpeCB0aGlzCisgICAgKiBbVEhSSUZULTQ0OTZdIC0gRGVhbGluZyB3aXRoIGxhbmd1YWdlIGtleXdvcmRzIGluIFRocmlmdCAoZS5nLiBzZXJ2aWNlIG1ldGhvZCBuYW1lcykKKyAgICAqIFtUSFJJRlQtNDM5M10gLSByZXBlYXRlZCBydW5zIG9mIGNvbXBpbGVyIHByb2R1Y2UgZGlmZmVyZW50IGJpbmFyeSBvdXRwdXQgYXQgcGx1Z2luIGludGVyZmFjZQorCisjIyBkbGFuZworICAgICogW1RIUklGVC00NDc4XSAtIFRocmlmdCB3aWxsIG5vdCBidWlsZCB3aXRoIGRsYW5nIDIuMDc4IG9yIGxhdGVyCisgICAgKiBbVEhSSUZULTQ1MDNdIC0gZGxhbmcgc2VydmVycyBsb2dFcnJvciBvbiBub3JtYWwgY2xpZW50IGRpc2Nvbm5lY3Rpb24KKyAgICAqIFtUSFJJRlQtNDMwOF0gLSBEIGxhbmd1YWdlIGRvY2tlciBpbWFnZXMgbmVlZCBkZW1pb3MgZm9yIGxpYmV2ZW50IGFuZCBvcGVuc3NsIGZpeGVkIHRvIHJlLWVuYWJsZSBtYWtlIGNyb3NzIG9uIGRsYW5nCisKKyMjIGRhcnQKKyAgICAqIFtUSFJJRlQtNDY0Nl0gLSBFZmZlY3RpdmUgRGFydCBhbmQgRXhjZXB0aW9ucworICAgICogW1RIUklGVC00NDM5XSAtIFNob3VsZG4ndCBkb3dubG9hZCBkYXJ0LmRlYiBkaXJlY3RseS4KKworIyMgZGVscGhpCisgICAgKiBbVEhSSUZULTQ1NjJdIC0gQ2FsbGluZyB3cm9uZyBleGNlcHRpb24gQ1RPUiBsZWFkcyB0byAiY2FsbCBmYWlsZWQ6IHVua25vd24gcmVzdWx0IiBpbnN0ZWFkIG9mIHRoZSByZWFsIGV4Y2VwdGlvbiBiZWluZyB0aHJvd24KKyAgICAqIFtUSFJJRlQtNDU1NF0gLSB1bmNvbXBpbGVhYmxlIGNvZGUgd2l0aCBtZW1iZXIgbmFtZXMgdGhhdCBhcmUgYWxzbyB0eXBlcyB1bmRlciBzcGVjaWZpYyBjb25kaXRpb25zCisgICAgKiBbVEhSSUZULTQ0MjJdIC0gQWRkIEFzeW5jIGltcGxlbWVudGF0aW9uIHZpYSBJRnV0dXJlCisgICAgKiBbVEhSSUZULTQ0ODVdIC0gUG9zc2libGUgaW52YWxpZCBwdHIgQVYgd2l0aCBvdmVybGFwcGVkIHJlYWQvd3JpdGUgb24gcGlwZXMKKyAgICAqIFtUSFJJRlQtNDU0OV0gLSBUaHJpZnQgZXhjZXB0aW9ucyBzaG91bGQgZGVyaXZlIGZyb20gVEV4Y2VwdGlvbgorICAgICogW1RIUklGVC00NTQwXSAtIGJ1ZmZlcmVkIHRyYW5zcG9ydCBicm9rZW4gd2hlbiB0cnlpbmcgdG8gcmUtb3BlbiBhIGZvcm1lcmx5IGNsb3NlZCB0cmFuc3BvcnQKKyAgICAqIFtUSFJJRlQtNDQ3M10gLSBNb3ZlIFRocmlmdC5Db25zb2xlLnBhcyBvdXQgb2YgdGhlIExpYnJhcnkKKyAgICAqIFtUSFJJRlQtNDQ5MF0gLSBBbGxvdyBhIGRlZmF1bHQgc2VydmljZSBhcyBmYWxsYmFjayBmb3IgbXVsdGlwbGV4IHByb2Nlc3NvcnMgY29ubmVjdGVkIGJ5IG9sZCBjbGllbnRzCisgICAgKiBbVEhSSUZULTQ0NTRdIC0gTGFyZ2Ugd3JpdGVzL3JlYWRzIG1heSBjYXVzZSByYW5nZSBjaGVjayBlcnJvcnMgaW4gZGVidWcgbW9kZQorICAgICogW1RIUklGVC00NDYxXSAtIENvbXBpbGVyIGRpcmVjdGl2ZSBzaG91bGQgbWF0Y2ggRGVscGhpIFhFNAorICAgICogW1RIUklGVC00NDYyXSAtIEZpcnN0IGxpbmUgaW4gQ29uc29sZSBkdXBsaWNhdGVkCisgICAgKiBbVEhSSUZULTQ2NDJdIC0gRlBVIGN0cmwgd29yZCBzZXR0aW5ncyBtYXkgY2F1c2UgYW4gdW5leHBlY3RlZCAiZGVub3JtYWxpemVkIiBlcnJvcgorICAgICogW1RIUklGVC00NTg5XSAtIEhUVFAgY2xpZW50IHRpbWVvdXRzIGFyZSBhKSBpbmNvbXBsZXRlIGFuZCBiKSBub3QgdXNlZCBhdCBhbGwKKyAgICAqIFtUSFJJRlQtNDU5MF0gLSBydW5uaW5nIHRoZSB0ZXN0IGNsaWVudCB1c2luZyBIVFRQIHRyYW5zcG9ydCBsZWFkcyB0byAiQ29Jbml0aWFsaXplIG5vdCBjYWxsZWQiCisKKyMjIGVybGFuZworICAgICogW1RIUklGVC00NDk3XSAtIEVybGFuZyByZWNvcmRzIHNob3VsZCB1c2UgbWFwKCkgZm9yIG1hcCB0eXBlCisgICAgKiBbVEhSSUZULTQ0OTVdIC0gRXJsYW5nIHJlY29yZHMgc2hvdWxkIGFsbG93ICd1bmRlZmluZWQnIGZvciBub24tcmVxdWlyZWQgZmllbGRzCisgICAgKiBbVEhSSUZULTQ1ODBdIC0gRml4IGVybGFuZyB0dXRvcmlhbCB1bnBhY2sgb24gV2luZG93cworICAgICogW1RIUklGVC00NTgyXSAtIFVidW50dSBYZW5pYWwgZXJsYW5nIDE4LjMgIm1ha2UgY2hlY2siIGZhaWxzCisKKyMjIGdvbGFuZworICAgICogW1RIUklGVC00NDQ4XSAtIFN1cHBvcnQgZm9yIGdvbGFuZyAxLjYgYW5kIGVhcmxpZXIgaGFzIGJlZW4gZHJvcHBlZC4KKyAgICAqIFtUSFJJRlQtNDI1M10gLSBHbyBnZW5lcmF0b3IgYXNzaWducyBzdHJpbmdzIHRvIGZpZWxkIGluIGNvbnN0IGluc3RlYWQgb2YgcG9pbnRlcnMuCisgICAgKiBbVEhSSUZULTQ1NzNdIC0gVW5pb25zIEZpZWxkIENvdW50IERvZXMgTm90IENvbnNpZGVyIEJpbmFyeQorICAgICogW1RIUklGVC00NDQ3XSAtIEdvbGFuZzogUGFuaWMgb24gcC5jLkNhbGwgd2hlbiB1c2luZyBkZXByZWNhdGVkIGluaXRpYWxpemVycworICAgICogW1RIUklGVC00NjUwXSAtIFJlcXVpcmVkIGZpZWxkIGluY29ycmVjdGx5IG1hcmtlZCBhcyBzZXQgd2hlbiBmaWVsZFR5cGUgZG9lcyBub3QgbWF0Y2gKKyAgICAqIFtUSFJJRlQtNDQ4Nl0gLSBHb2xhbmc6IC1yZW1vdGUuZ28gY2xpZW50IGNsZWFudXAKKyAgICAqIFtUSFJJRlQtNDUzN10gLSBUU2ltcGxlU2VydmVyIGNhbiBleGl0IEFjY2VwdCBsb29wIHdpdGggbG9jayBzdGlsbCBhY3F1aXJlZAorICAgICogW1RIUklGVC00NTE2XSAtIEFkZCBzdXBwb3J0IGZvciBnbyAxLjEwCisgICAgKiBbVEhSSUZULTQ0MjFdIC0gZ29sYW5nIHRlc3RzIHJlbHkgb24gZ29tb2NrLCB3aGljaCBoYXMgY2hhbmdlIGJlaGF2aW91ciwgY2F1c2luZyB0ZXN0cyB0byBmYWlsCisgICAgKiBbVEhSSUZULTQ2MjZdIC0gQ29tbXVuaWNhdGlvbiBjcmFzaCB3aGVuIHVzaW5nIGJpbmFyeS9jb21wYWN0IHByb3RvY29sIGFuZCB6bGliIHRyYW5zcG9ydAorICAgICogW1RIUklGVC00NjU5XSAtIGdvbGFuZyByYWNlIGRldGVjdGVkIHdoZW4gY2xvc2luZyBsaXN0ZW5lciBzb2NrZXQKKworIyMgaGFza2VsbAorICAgICogW1RIUklGVC00NjM0XSAtIEhhc2tlbGwgYnVpbGRzIHdpdGggb2xkZXIgY2FiYWwgY2Fubm90IHJlY29uY2lsZSBjb21wbGV4IHZlcnNpb24gcmVxdWlyZW1lbnRzCisKKyMjIGphdmEKKyAgICAqIFtUSFJJRlQtNDI1OV0gLSBUaHJpZnQgZG9lcyBub3QgY29tcGlsZSBkdWUgdG8gQW50IE1hdmVuIHRhc2sgZXJyb3JzCisgICAgKiBbVEhSSUZULTE0MThdIC0gQ29tcGlsaW5nIFRocmlmdCBmcm9tIHNvdXJjZTogQ2xhc3Mgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQ29uZGl0aW9uVGFzayBkb2Vzbid0IHN1cHBvcnQgdGhlIG5lc3RlZCAidHlwZWZvdW5kIiBlbGVtZW50CisgICAgKiBbVEhSSUZULTQ1MzBdIC0gcHJvcG9zYWw6IGFkZCBudWxsYWJpbGl0eSBhbm5vdGF0aW9ucyB0byBnZW5lcmF0ZWQgSmF2YSBjb2RlCisgICAgKiBbVEhSSUZULTQ2MTRdIC0gR2VuZXJhdGUgbWlzc2luZyBATnVsbGFibGUgYW5ub3RhdGlvbnMgZm9yIEphdmEgaXRlcmF0b3IgZ2V0dGVycworICAgICogW1RIUklGVC00NTU1XSAtIEdldHRlciBvZiBiaW5hcnkgZmllbGQgaW4gSmF2YSBjcmVhdGVzIHVubmVjZXNzYXJ5IGNvcHkKKyAgICAqIFtUSFJJRlQtMzk4M10gLSBsaWJ0aHJpZnQgaXMgZGVwbG95ZWQgb24gY2VudHJhbCB3aXRoIHBvbSBwYWNrYWdpbmcgaW5zdGVhZCBvZiBqYXIKKyAgICAqIFtUSFJJRlQtNDI5NF0gLSBKYXZhIENvbmZpZ3VyZSBGYWlscyBmb3IgQW50ID49IDEuMTAKKyAgICAqIFtUSFJJRlQtNDE3OF0gLSBKYXZhIGxpYnJhcmllcyBtaXNzaW5nIGZyb20gcGFja2FnZSB3aGVuIHVzaW5nIGNtYWtlCisgICAgKiBbVEhSSUZULTQxMjBdIC0gcG9tIGZpbGVzIGFyZSBub3QgZ2VuZXJhdGVkIG9yIHByb3ZpZGVkIGluIHRoZSBidWlsZAorICAgICogW1RIUklGVC0xNTA3XSAtIE1hdmVuIGNhbid0IGRvd25sb2FkIHJlc291cmNlIGZyb20gY2VudHJhbCB3aGVuIGJlaGluZCBhIHByb3h5IGFuZCB3b24ndCB1c2UgbG9jYWwgcmVwb3NpdG9yeQorICAgICogW1RIUklGVC00NTU2XSAtIE9wdGlvbmFsIHJldGhyb3cgb2YgdW5oYW5kbGVkIGV4Y2VwdGlvbnMgaW4gamF2YSBwcm9jZXNzb3IKKyAgICAqIFtUSFJJRlQtNDMzN10gLSBBYmxlIHRvIHNldCBrZXlTdG9yZSBhbmQgdHJ1c3RTdG9yZSBhcyBJbnB1dFN0cmVhbSBpbiB0aGUgVFNTTFRyYW5zcG9ydEZhY3RvcnkuVFNTTFRyYW5zcG9ydFBhcmFtZXRlcnMKKyAgICAqIFtUSFJJRlQtNDU2Nl0gLSBQYXNzIG1lc3NhZ2Ugb2YgdW5oYW5kbGVkIGV4Y2VwdGlvbiB0byBvcHRpb25hbCByZXRocm93LgorICAgICogW1RIUklGVC00NTA2XSAtIFJlbW92ZSBhc3NlcnRpb24gaW4gSmF2YSBTQVNMIGNvZGUgdGhhdCB3b3VsZCBiZSBpZ25vcmVkIGluIHJlbGVhc2UgYnVpbGRzCisgICAgKiBbVEhSSUZULTQ0NzBdIC0gSW5jbHVkZSBwb3B1bGFyIElERSBmaWxlIHRlbXBsYXRlcyB0byBnaXRpZ25vcmUKKyAgICAqIFtUSFJJRlQtNDQyOV0gLSBNYWtlIFRUaHJlYWRQb29sU2VydmVyLmV4ZWN1dG9yU2VydmljZV8gYXZhaWxhYmxlIGluIGluaGVyaXRlZCBjbGFzc2VzIGFuZCByZWZhY3RvciBtZXRob2RzIHRvIGJlIGFibGUgY3VzdG9taXphdGlvbgorICAgICogW1RIUklGVC0zNzY5XSAtIEZpeCBsb2dpYyBvZiBUSFJJRlQtMjI2OAorICAgICogW1RIUklGVC00NDk0XSAtIEluY3JlYXNlIEphdmEgU29ja2V0IEJ1ZmZlciBTaXplCisgICAgKiBbVEhSSUZULTQ0OTldIC0gUmVtb3ZlIE1hZ2ljIE51bWJlciBJbiBURklsZVRyYW5zcG9ydAorCisjIyBqcworICAgICogW1RIUklGVC00NDA2XSAtIEphdmFTY3JpcHQ6IFVzZSBtb2Rlcm4gUHJvbWlzZSBpbXBsZW1lbnRhdGlvbnMKKyAgICAqIFtUSFJJRlQtNDYyNV0gLSBsZXQgLyBjb25zdCB2YXJpYWJsZSBkZWNvcmF0b3JzIGZvciBlczYgY29tcGlsZXIKKyAgICAqIFtUSFJJRlQtNDY1M10gLSBFUzYgQ2xhc3NlcworICAgICogW1RIUklGVC00NTkyXSAtIEpTOiByZWFkSTMyIHBlcmZvcm1hbmNlIG9uIGxhcmdlIGFycmF5cyBpcyB2ZXJ5IHBvb3IgaW4gQ2hyb21lCisgICAgKiBbVEhSSUZULTQ1MDldIC0ganMgYW5kIG5vZGVqcyBsaWJyYXJpZXMgbmVlZCB0byBiZSByZWZyZXNoZWQgd2l0aCBjdXJyZW50IGxpYnJhcmllcworICAgICogW1RIUklGVC00NDAzXSAtIHRocmlmdC5qczogSW5jb3JyZWN0IHVzYWdlIG9mICd0aGlzJyBpbiBUV2ViU29ja2V0VHJhbnNwb3J0Ll9fb25PcGVuCisgICAgKiBbVEhSSUZULTQ0MzZdIC0gRGVzZXJpYWxpemF0aW9uIG9mIG5lc3RlZCBsaXN0IGRpc2NhcmRzIGNvbnRlbnQKKyAgICAqIFtUSFJJRlQtNDQzN10gLSBKUyBXZWJTb2NrZXQgY2xpZW50IGNhbGxiYWNrcyBpbnZva2VkIHR3aWNlIG9uIHBhcmFsbGVsIHJlcXVlc3RzCisgICAgKiBbVEhSSUZULTQ2NzldIC0gRHVwbGljYXRlIGRlY2xhcmF0aW9uIG9mIElucHV0QnVmZmVyVW5kZXJydW5FcnJvciBpbiBsaWIvbm9kZWpzL2xpYi90aHJpZnQvanNvbl9wcm90b2NvbC5qcworICAgICogW1RIUklGVC00NTUxXSAtIEFkZCBwcmV0dGllciBmb3IgY29uc2lzdGVudCBKUyBjb2RlIGZvcm1hdHRpbmcKKworIyMgbHVhCisgICAgKiBbVEhSSUZULTQ1OTFdIC0gbHVhIGNsaWVudCB1c2VzIHR3byB3cml0ZSgpIGNhbGxzIHBlciBmcmFtZWQgbWVzc2FnZSBzZW5kCisgICAgKiBbVEhSSUZULTM4NjNdIC0gQ2FuJ3QgIm1ha2UgaW5zdGFsbCIgTHVhIExpYnJhcnkKKworIyMgbmV0Y29yZQorICAgICogW1RIUklGVC00NTI0XSAtIC5ORVQgQ29yZSBTZXJ2ZXIgZG9lc24ndCBjbG9zZSBwcm9wZXJseSB3aGVuIGNhbmNlbGxlZAorICAgICogW1RIUklGVC00NDM0XSAtIFVwZGF0ZSAuTkVUIENvcmUgY29tcG9uZW50cywgYWRkIHRlc3RzIGZvciAuTmV0IENvcmUgbGlicmFyeSBhbmQgLk5ldCBDb3JlIGNvbXBpbGVyLCBmaXggYnVncyBhbmQgYnVpbGQgcHJvY2VzcworICAgICogW1RIUklGVC00NDQ2XSAtIEpTT05Qcm90b2NvbCBCYXNlNjQgRW5jb2RpbmcgVHJpbXMgUGFkZGluZworCisjIyBub2RlLmpzCisgICAgKiBbVEhSSUZULTQyMjVdIC0gRXJyb3IgaGFuZGxpbmcgbWFsZm9ybWVkIGFyZ3VtZW50cyBsZWFrcyBtZW1vcnksIGNvcnJ1cHRzIHRyYW5zcG9ydCBidWZmZXJzIGNhdXNpbmcgbmV4dCBSUEMgdG8gZmFpbAorICAgICogW1RIUklGVC0zOTUwXSAtIE1lbW9yeSBsZWFrIHdoaWxlIGNhbGxpbmcgb25ld2F5IG1ldGhvZAorICAgICogW1RIUklGVC0zMTQzXSAtIGFkZCB0eXBlc2NyaXB0IGRpcmVjdG9yeSBzdXBwb3J0CisgICAgKiBbVEhSSUZULTQ1NjRdIC0gVEJ1ZmZlcmVkVHJhbnNwb3J0IGNhbiBsZWF2ZSBjb3JydXB0IGRhdGEgaW4gdGhlIGJ1ZmZlcgorICAgICogW1RIUklGVC00NjQ3XSAtIE5vZGUuanMgRmlsZXNlcnZlciB3ZWJyb290IHBhdGgKKyAgICAqIFtUSFJJRlQtNDQ4OV0gLSBVbml4IGRvbWFpbiBzb2NrZXQgc3VwcG9ydCBmb3IgTm9kZUpTIGNsaWVudAorICAgICogW1RIUklGVC00NDQzXSAtIG5vZGUuanMganNvbl9wcm90b2NvbCB0aHJvd3MgZXJyb3IgaW4gc2tpcCBmdW5jdGlvbgorICAgICogW1RIUklGVC00NjA0XSAtIE5vZGVKUzogRXhwb3NlIEludDY0IGZyb20gYnJvd3Nlci5qcyBmb3IgY29uc3VtcHRpb24gYnkgYnJvd3NlcgorICAgICogW1RIUklGVC00NDgwXSAtIE5vZGVKUyB3YXJuaW5nIG9uIGJpbmFyeV9wcm90b2NvbCB3cml0ZU1lc3NhZ2VFbmQgd2hlbiBzZXFpZCA9IDAKKworIyMgcGVybAorICAgICogW1RIUklGVC00MzgyXSAtIFJlcGxhY2UgdGhlIHVzZSBvZiBQZXJsIEluZGlyZWN0IE9iamVjdCBTeW50YXggY2FsbHMgdG8gbmV3KCkKKyAgICAqIFtUSFJJRlQtNDQ3MV0gLSBUaHJpZnQgQ1BBTiByZWxlYXNlIGlzIG1pc3NpbmcgTWFrZWZpbGUuUEwgYW5kIHRoZSBjbGllbnRzIGFyZSB1bmFibGUgdG8gYnVpbGQgdGhlIG1vZHVsZQorICAgICogW1RIUklGVC00NDE2XSAtIFBlcmwgQ1BBTiBQYWNrYWdpbmcgSW1wcm92ZW1lbnRzCisKKyMjIHBocAorICAgICogW1RIUklGVC00NDc0XSAtIFBIUCBnZW5lcmF0b3IgdXNlIFBTUi00IGRlZmF1bHQKKyAgICAqIFtUSFJJRlQtNDQ2M10gLSBQSFAgZ2VuZXJhdGVkIGNvZGUgbWF0Y2ggUFNSLTIKKyAgICAqIFtUSFJJRlQtNDM3M10gLSBFeHRlbmRpbmcgVGhyaWZ0IGNsYXNzIHJlc3VsdHMgaW4gIkF0dGVtcHQgc2VyaWFsaXplIGZyb20gbm9uLVRocmlmdCBvYmplY3QiCisgICAgKiBbVEhSSUZULTQzNTRdIC0gVFNvY2tldCBibG9jayBvbiByZWFkCisgICAgKiBbVEhSSUZULTQ0MjNdIC0gbWlncmF0ZSBwaHAgbGlicmFyeSB0byBwc3ItNAorICAgICogW1RIUklGVC00NjU2XSAtIGluZmluaXRlIGxvb3AgaW4gbGF0ZXN0IFBIUCBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTQ0NzddIC0gVEJ1ZmZlcmVkVHJhbnNwb3J0IG11c3QgaGF2ZSB1bmRlcmx5aW5nIHRyYW5zcG9ydAorICAgICogW1RIUklGVC00NDc1XSAtIGxpYi9waHAvdGVzdCBzaG91bGQgYmUgY2hlY2tlZCBmb3IgUFNSLTIKKyAgICAqIFtUSFJJRlQtNDQ5OF0gLSBhZGQgcGhwY3MgYmFjaworICAgICogW1RIUklGVC00NDYwXSAtIHBocCBsaWJyYXJ5IHVzZSBQU1ItMgorICAgICogW1RIUklGVC00NjQxXSAtIFRDdXJsQ2xpZW50IGRvZXNuJ3QgY2hlY2sgZm9yIEhUVFAgc3RhdHVzIGNvZGUKKyAgICAqIFtUSFJJRlQtNDY0NV0gLSBUQ3VybENsaWVudDogc2hvdyBhY3R1YWwgZXJyb3IgbWVzc2FnZSB3aGVuIHRocm93aW5nIFRUcmFuc3BvcnRFeGNlcHRpb24KKyAgICAqIFtUSFJJRlQtNDY3NF0gLSBBZGQgc3RyZWFtIGNvbnRleHQgc3VwcG9ydCBpbnRvIFBIUC9USHR0cENsaWVudAorICAgICogW1RIUklGVC00NDU5XSAtIHJlZHVjZSBwaHAgbGlicmFyeSBkaXJlY3RvcnkgZGVwdGgKKworIyMgcHl0aG9uCisgICAgKiBbVEhSSUZULTQ2NzBdIC0gVHdpc3RlZCwgc2xvdHMsIGFuZCB2b2lkIG1ldGhvZCBmYWlscyB3aXRoICJvYmplY3QgaGFzIG5vIGF0dHJpYnV0ZSAnc3VjY2VzcyciCisgICAgKiBbVEhSSUZULTQ0NjRdIC0gUG90ZW50aWFsbHkgc2VydmVyLWNyYXNoaW5nIHR5cG8gaW4gUHl0aG9uIFROb25ibG9ja2luZ1NlcnZlcgorICAgICogW1RIUklGVC00NTQ4XSAtIFN1cHBvcnRpbmcgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgcHJvdG9jb2wgd2hlbiB1c2luZyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgaW4gUHl0aG9uCisgICAgKiBbVEhSSUZULTQ1NzddIC0gT3V0ZGF0ZWQgY2lwaGVyIHN0cmluZyBpbiBweXRob24gdW5pdCB0ZXN0CisgICAgKiBbVEhSSUZULTQ1MDVdIC0gcHl0aG9uIGJ1aWxkIG9uIFZhZ3JhbnQgV2luZG93cyBib3hlcyBmYWlscworICAgICogW1RIUklGVC00NjIxXSAtIFRIZWFkZXIgZm9yIFB5dGhvbgorICAgICogW1RIUklGVC00NjY4XSAtIG1ha2Ugc29ja2V0IGJhY2tsb2cgY29uZmlndXJhYmxlIGZvciBweXRob24KKyAgICAqIFtUSFJJRlQtNDU2MV0gLSBQeXRob246IGNsZWFudXAgc29ja2V0IHRpbWVvdXQgc2V0dGluZ3MKKworIyMgcnVieQorICAgICogW1RIUklGVC00Mjg5XSAtIFRocmlmdCBSU3BlYyB0ZXN0IHN1aXRlIGZhaWxzIHdpdGggUnVieSAyLjQueCBkdWUgdG8gRml4bnVtIGRlcHJlY2F0aW9uCisgICAgKiBbVEhSSUZULTQzNDJdIC0gU3VwcG9ydCBydWJ5IHJzcGVjIDMKKyAgICAqIFtUSFJJRlQtNDUyNV0gLSBBZGQgc3NsIHNvY2tldCBvcHRpb24gdG8gcnVieSBjcm9zcyB0ZXN0cworICAgICogW1RIUklGVC00NDUwXSAtIEFkZCBzZWVrIHN1cHBvcnQgdG8gVENvbXBhY3RJbnB1dFByb3RvY29sIGluIFJ1c3QKKyAgICAqIFtUSFJJRlQtNDYzMV0gLSBDb2RlZ2VuIENyZWF0ZXMgSW52YWxpZCBSdWJ5IGZvciBSZWN1cnNpdmUgU3RydWN0cworICAgICogW1RIUklGVC00NDcyXSAtIEZpeCB0aGUgZ2Vuc3BlYyBmb3IgcnVieSBzbyBpdCBkb2VzIG5vdCBjb21wbGFpbiBhYm91dCBhbiBpbnZhbGlkIGxpY2Vuc2UKKworIyMgcnVzdAorICAgICogW1RIUklGVC00NjYyXSAtIFJ1c3QgY29uc3Qgc3RyaW5nIGNhbGxzIGZ1bmN0aW9uIGF0IGNvbXBpbGUgdGltZQorICAgICogW1RIUklGVC00NjYxXSAtIFJ1c3QgZW51bSBuYW1lIHdyb25nIGNhc2UgaW4gZ2VuZXJhdGVkIHN0cnVjdHMKKyAgICAqIFtUSFJJRlQtNDYxN10gLSBBdm9pZCBnZW5lcmF0aW5nIGNvbmZsaWN0aW5nIHN0cnVjdCBuYW1lcyBpbiBSdXN0IGNvZGUKKyAgICAqIFtUSFJJRlQtNDUyOV0gLSBSdXN0IGdlbmVyYXRpb24gc2hvdWxkIGluY2x1ZGUgIyFbYWxsb3cobm9uX3NuYWtlX2Nhc2UpXSBvciBmb3JjZSBjb25mb3JtIHRvIFJ1c3Qgc3R5bGUgZ3VpZGVsaW5lcworICAgICogW1RIUklGVC00MzkwXSAtIFJ1c3QgYmluYXJ5IHByb3RvY29sIGFuZCBidWZmZXJlZCB0cmFuc3BvcnQgY2Fubm90IGhhbmRsZSB3cml0ZXMgYWJvdmUgNDA5NiBieXRlcworICAgICogW1RIUklGVC00NDE5XSAtIFJ1c3QgZnJhbWVkIHRyYW5zcG9ydCBjYW5ub3QgaGFuZGxlIHdyaXRlcyBhYm92ZSA0MDk2IGJ5dGVzCisgICAgKiBbVEhSSUZULTQ2NThdIC0gUnVzdCdzIFRCaW5hcnlJbnB1dFByb3RvY29sIGZhaWxzIHdoZW4gc3RyaWN0IGlzIGZhbHNlCisgICAgKiBbVEhSSUZULTQxODddIC0gRGFydCAtPiBSdXN0IEZyYW1lZCBjcm9zcyB0ZXN0cyBmYWlsCisgICAgKiBbVEhSSUZULTQ2NjRdIC0gUnVzdCBjYW5ub3QgY3JlYXRlIFJlYWRIYWxmL1dyaXRlSGFsZiB0byBpbXBsZW1lbnQgY3VzdG9tIHRyYW5wb3J0cworICAgICogW1RIUklGVC00NjY1XSAtIEtlZXAgUnVzdCBsaWJyYXJ5IHVwLXRvLWRhdGUgb24gY3JhdGVzLmlvCisKKyMjIHN3aWZ0IChuZXcgbGFuZ3VhZ2Ugc3VwcG9ydCBpbiAwLjEyLjApCisgICAgKiBbVEhSSUZULTM3NzNdIC0gU3dpZnQgTGlicmFyeQorCisjIyB0ZXN0IHN1aXRlCisgICAgKiBbVEhSSUZULTQ1MTVdIC0gR3JhY2VmdWxseSBzaHV0ZG93biBjcm9zcy10ZXN0IHNlcnZlcnMgdG8gZnVsbHkgdGVzdCB0ZWFyZG93bgorICAgICogW1RIUklGVC00MDg1XSAtIEFkZCAuTkVUIENvcmUgdG8gdGhlIG1ha2UgY3Jvc3Mgc3RhbmRhcmQgdGVzdCBzdWl0ZQorICAgICogW1RIUklGVC00MzU4XSAtIEFkZCB1bml4IGRvbWFpbiBzb2NrZXRzIGluIHJ1YnkgdG8gY3Jvc3MgdGVzdCAtIGNvZGUgZXhpc3RzCisKKyMjIHR5cGVzY3JpcHQgKG5ldyBsYW5ndWFnZSBzdXBwb3J0IGluIDAuMTIuMCkKKyAgICAqIFtUSFJJRlQtMzE0M10gLSBhZGQgdHlwZXNjcmlwdCBkaXJlY3Rvcnkgc3VwcG9ydAorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorVGhyaWZ0IDAuMTEuMAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjIFN1Yi10YXNrCisgICAgKiBbVEhSSUZULTI3MzNdIC0gRXJsYW5nIGNvZGluZyBzdGFuZGFyZHMKKyAgICAqIFtUSFJJRlQtMjc0MF0gLSBQZXJsIGNvZGluZyBzdGFuZGFyZHMKKyAgICAqIFtUSFJJRlQtMzYxMF0gLSBTdHJlYW1saW5lIGV4Y2VwdGlvbiBoYW5kbGluZyBpbiBQeXRob24gc2VydmVyIGhhbmRsZXIKKyAgICAqIFtUSFJJRlQtMzY4Nl0gLSBKYXZhIHByb2Nlc3NvciBzaG91bGQgcmVwb3J0IGludGVybmFsIGVycm9yIG9uIHVuY2F1Z2h0IGV4Y2VwdGlvbgorICAgICogW1RIUklGVC00MDQ5XSAtIFNraXAoKSBzaG91bGQgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSBvbiB1bmtub3duIGRhdGEgdHlwZXMKKyAgICAqIFtUSFJJRlQtNDA1M10gLSBTa2lwKCkgc2hvdWxkIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEgb24gdW5rbm93biBkYXRhIHR5cGVzCisgICAgKiBbVEhSSUZULTQxMzZdIC0gQWxpZ24gaXNfYmluYXJ5KCkgbWV0aG9kIHdpdGggaXNfc3RyaW5nKCkgdG8gc2ltcGxpZnkgdGhvc2UgY2hlY2tzCisgICAgKiBbVEhSSUZULTQxMzddIC0gRml4IHJlbWFpbmluZyB1bmRlZmluZWQgYmVoYXZpb3IgaW52YWxpZCB2cHRyIGNhc3RzIGluIFRocmlmdCBDb21waWxlcgorICAgICogW1RIUklGVC00MTM4XSAtIEZpeCByZW1haW5pbmcgdW5kZWZpbmVkIGJlaGF2aW9yIGludmFsaWQgdnB0ciBjYXN0cyBpbiBDKysgbGlicmFyeQorICAgICogW1RIUklGVC00Mjk2XSAtIEZpeCBVYnVudHUgWGVuaWFsIGJ1aWxkIGVudmlyb25tZW50IGZvciB0aGUgcHl0aG9uIGxhbmd1YWdlCisgICAgKiBbVEhSSUZULTQyOThdIC0gRml4IFVidW50dSBYZW5pYWwgYnVpbGQgZW52aXJvbm1lbnQgZm9yIHRoZSBnbyAxLjYgbGFuZ3VhZ2UKKyAgICAqIFtUSFJJRlQtNDI5OV0gLSBGaXggVWJ1bnR1IFhlbmlhbCBidWlsZCBlbnZpcm9ubWVudCBmb3IgdGhlIEQgbGFuZ3VhZ2UKKyAgICAqIFtUSFJJRlQtNDMwMF0gLSBGaXggbWFrZSBjcm9zcyBpbiBVYnVudHUgWGVuaWFsIGRvY2tlciBlbnZpcm9ubWVudCwgb25jZSBhbGwgbGFuZ3VhZ2Ugc3VwcG9ydCBpc3N1ZXMgYXJlIGZpeGVkCisgICAgKiBbVEhSSUZULTQzMDJdIC0gRml4IFVidW50dSBYZW5pYWwgbWFrZSBjcm9zcyB0ZXN0aW5nIGZvciBsdWEgYW5kIHBocDcKKyAgICAqIFtUSFJJRlQtNDM5OF0gLSBVcGRhdGUgRVhUUkFfRElTVCBmb3IgIm1ha2UgZGlzdCIKKworIyMgQnVnCisgICAgKiBbVEhSSUZULTM4MV0gLSBGYWlsIGZhc3QgaWYgY29uZmlndXJlIGRldGVjdHMgQysrIHByb2JsZW1zCisgICAgKiBbVEhSSUZULTE2NzddIC0gTWluR1cgc3VwcG9ydCBicm9rZW4KKyAgICAqIFtUSFJJRlQtMTgwNV0gLSBUaHJpZnQgc2hvdWxkIG5vdCBzd2FsbG93IEFMTCBleGNlcHRpb25zCisgICAgKiBbVEhSSUZULTIwMjZdIC0gRml4IFRDb21wYWN0UHJvdG9jb2wgNjQgYml0IGJ1aWxkcworICAgICogW1RIUklGVC0yNjQyXSAtIFJlY3Vyc2l2ZSBzdHJ1Y3RzIGRvbid0IHdvcmsgaW4gcHl0aG9uCisgICAgKiBbVEhSSUZULTI4ODldIC0gc3RhYmxlIHJlbGVhc2UgMC45LjIsIGVybGFuZyB0dXRvcmlhbCBicm9rZW4KKyAgICAqIFtUSFJJRlQtMjkxM10gLSBSdWJ5IFNlcnZlciBUaHJpZnQ6OlRocmVhZFBvb2xTZXJ2ZXIgc2hvdWxkIHNlcnZlIGluc2lkZSBhIHRocmVhZAorICAgICogW1RIUklGVC0yOTk4XSAtIE5vZGUuanM6IE1pc3NpbmcgaGVhZGVyIGZyb20gaHR0cCByZXF1ZXN0CisgICAgKiBbVEhSSUZULTMwMDBdIC0gLk5FVCBpbXBsZW1lbnRhdGlvbiBoYXMgdHJvdWJsZSB3aXRoIG1peGVkIElQIG1vZGVzCisgICAgKiBbVEhSSUZULTMyODFdIC0gVHJhdmlzIENJIGJ1aWxkIHBhc3NlZCBidXQgdGhlIGxvZyBzYXlzIEJVSUxEIEZBSUxFRAorICAgICogW1RIUklGVC0zMzU4XSAtIE1ha2VmaWxlOjEzNjI6ICoqKiBtaXNzaW5nIHNlcGFyYXRvci4gU3RvcC4KKyAgICAqIFtUSFJJRlQtMzYwMF0gLSBNYWtlIFRUd2lzdGVkIHNlcnZlciBzZW5kIGV4Y2VwdGlvbiBvbiB1bmV4cGVjdGVkIGhhbmRsZXIgZXJyb3IKKyAgICAqIFtUSFJJRlQtMzYwMl0gLSBNYWtlIFRvcm5hZG8gc2VydmVyIHNlbmQgZXhjZXB0aW9uIG9uIHVuZXhwZWN0ZWQgaGFuZGxlciBlcnJvcgorICAgICogW1RIUklGVC0zNjU3XSAtIEQgVEZpbGVXcml0ZXJUcmFuc3BvcnQgY2xvc2Ugc2hvdWxkIHVzZSBub24tcHJpb3JpdHkgc2VuZAorICAgICogW1RIUklGVC0zNzAwXSAtIEdvIE1hcCBoYXMgd3JvbmcgZGVmYXVsdCB2YWx1ZSB3aGVuIG9wdGlvbmFsCisgICAgKiBbVEhSSUZULTM3MDNdIC0gVW5pb25zIEZpZWxkIENvdW50IERvZXMgTm90IENvbnNpZGVyIE1hcC9TZXQvTGlzdCBGaWVsZHMKKyAgICAqIFtUSFJJRlQtMzczMF0gLSBzZXJ2ZXIgbG9nIGVycm9yIHR3aWNlCisgICAgKiBbVEhSSUZULTM3NzhdIC0gZ28gY2xpZW50IGNhbiBub3QgcGFzcyBtZXRob2QgcGFyYW1ldGVyIHRvIHNlcnZlciBvZiBvdGhlciBsYW5ndWFnZSBpZiBubyBmaWVsZF9pZCBpcyBnaXZlbgorICAgICogW1RIUklGVC0zNzg0XSAtIHRocmlmdC1tYXZlbi1wbHVnaW4gZ2VuZXJhdGVzIGludmFsaWQgaW5jbHVkZSBkaXJlY3RvcmllcyBmb3IgSURMIGluIGRlcGVuZGVuY3kgSkFScworICAgICogW1RIUklGVC0zODAxXSAtIE5vZGUgVGhyaWZ0IGNsaWVudCB0aHJvd3MgZXhjZXB0aW9uIHdpdGggbXVsdGlwbGV4ZXIgYW5kIHJlc3BvbnNlcyB0aGF0IGFyZSBiaWdnZXIgdGhhbiBhIHNpbmdsZSBidWZmZXIKKyAgICAqIFtUSFJJRlQtMzgyMV0gLSBUTWVtb3J5QnVmZmVyIGJ1ZmZlciBtYXkgb3ZlcmZsb3cgd2hlbiByZXNpemluZworICAgICogW1RIUklGVC0zODMyXSAtIFRocmlmdCB2ZXJzaW9uIDAuOS4zIGV4YW1wbGUgb24gV2luZG93cywgVmlzdWFsIFN0dWRpbywgbGlua2luZyBlcnJvcnMgZHVyaW5nIGNvbXBpbGluZworICAgICogW1RIUklGVC0zODQ3XSAtIHRocmlmdC9jb25maWcuaCBpbmNsdWRlcyBhICNkZWZpbmUgZm9yIFZFUlNJT04gd2hpY2ggd2lsbCBsaWtlbHkgY29uZmxpY3Qgd2l0aCBleGlzdGluZyB1c2VyIGVudmlyb25tZW50IG9yIGNvZGUKKyAgICAqIFtUSFJJRlQtMzg3M10gLSBGaXggdmFyaW91cyBidWlsZCB3YXJuaW5ncyB3aGVuIHVzaW5nIFZpc3VhbCBTdHVkaW8KKyAgICAqIFtUSFJJRlQtMzg5MV0gLSBUTm9uYmxvY2tpbmdTZXJ2ZXIgY29uZmlndXJlZCB3aXRoIG1vcmUgdGhhbiBvbmUgSU8gdGhyZWFkcyBkb2VzIG5vdCBhbHdheXMgcmV0dXJuIGZyb20gc2VydmUoKSB1cG9uIHN0b3AoKQorICAgICogW1RIUklGVC0zODkyXSAtIFRocmlmdCB1c2VzIFRMUyBTTkkgZXh0ZW5zaW9uIHByb3ZpZGVkIGJ5IE9wZW5TU0wgbGlicmFyeS4gT2xkZXIgdmVyc2lvbiBvZiBPcGVuU1NMKDwgMC45LjhmKSBtYXkgY3JlYXRlIHByb2JsZW0gYmVjYXVzZSB0aGV5IGRvIG5vdCBzdXBwb3J0ICdTU0xfc2V0X3Rsc2V4dF9ob3N0X25hbWUoKScuCisgICAgKiBbVEhSSUZULTM4OTVdIC0gQnVpbGQgZmFpbHMgdXNpbmcgSmF2YSAxLjggd2l0aCBBbnQgPCAxLjkKKyAgICAqIFtUSFJJRlQtMzg5Nl0gLSBtYXA8c3RyaW5nLHN0cmluZz4gZGF0YSB3aXRoIG51bWJlciBzdHJpbmcga2V5IGNhbm5vdCBhY2Nlc3MgdGhhdCBkZXNlcmlhbGl6ZWQgYnkgcGhwIGV4dGVuc2lvbgorICAgICogW1RIUklGVC0zOTM4XSAtIFB5dGhvbiBUTm9uYmxvY2tpbmdTZXJ2ZXIgZG9lcyBub3Qgd29yayB3aXRoIFNTTAorICAgICogW1RIUklGVC0zOTQ0XSAtIFRTU0xTb2NrZXQgaGFzIGRlYWQgY29kZSBpbiBjaGVja0hhbmRzaGFrZQorICAgICogW1RIUklGVC0zOTQ2XSAtIEphdmEgMS41IGNvbXBhdGliaWxpdHkgYnJva2VuIGZvciBiaW5hcnkgZmllbGRzIChqYXZhNSBvcHRpb24pCisgICAgKiBbVEhSSUZULTM5NjBdIC0gSW5oZXJpdGVkIHNlcnZpY2VzIGluIEx1YSBnZW5lcmF0b3IgYXJlIG5vdCBuYW1lZCBjb3JyZWN0bHkKKyAgICAqIFtUSFJJRlQtMzk2Ml0gLSBBbnQgYnVpbGQueG1sIGJyb2tlbiBvbiBXaW5kb3dzIGZvciBKYXZhIGxpYnJhcnkKKyAgICAqIFtUSFJJRlQtMzk2M10gLSBUaHJpZnQuY2FiYWwgZmlsZW5hbWUgZG9lcyBub3QgbWF0Y2ggbW9kdWxlIG5hbWUKKyAgICAqIFtUSFJJRlQtMzk2N10gLSBnb2JqZWN0L2dwYXJhbS5oOjE2NjozMzogd2FybmluZzogZW51bWVyYXRvciB2YWx1ZSBmb3Ig4oCYR19QQVJBTV9ERVBSRUNBVEVE4oCZIGlzIG5vdCBhbiBpbnRlZ2VyIGNvbnN0YW50IGV4cHJlc3Npb24KKyAgICAqIFtUSFJJRlQtMzk2OF0gLSBEZXNlcmlhbGl6aW5nIGVtcHR5IHN0cmluZy9iaW5hcnkgZmllbGRzCisgICAgKiBbVEhSSUZULTM5NzRdIC0gVXNpbmcgY2xhbmctMy44IGFuZCBUaHJlYWRTYW5pdGl6ZXIgb24gdGhlIGNvbmN1cnJlbmN5X3Rlc3QgY2xhaW1zIGJhZCBQVGhyZWFkIGJlaGF2aW9yCisgICAgKiBbVEhSSUZULTM5ODRdIC0gUEhQNyBleHRlbnNpb24gY2F1c2VzIHNlZ2ZhdWx0CisgICAgKiBbVEhSSUZULTQwMDhdIC0gYnJva2VuIGNpIGR1ZSB0byB1cHN0cmVhbSBkZXBlbmRlbmN5IHZlcnNpb25pbmcgYnJlYWsKKyAgICAqIFtUSFJJRlQtNDAwOV0gLSBVc2UgQGltcGxlbWVudGVyIGluc3RlYWQgb2YgaW1wbGVtZW50cyBpbiBUVHdpc3RlZC5weQorICAgICogW1RIUklGVC00MDEwXSAtIFEuZmNhbGwgbWVzc2luZyB1cCB3aXRoICp0aGlzKiBwb2ludGVyIGluc2lkZSBjYWxsZWQgZnVuY3Rpb24KKyAgICAqIFtUSFJJRlQtNDAxMV0gLSBTZXRzIG9mIFRocmlmdCBzdHJ1Y3RzIGdlbmVyYXRlIEdvIGNvZGUgdGhhdCBjYW4ndCBiZSBzZXJpYWxpemVkIHRvIEpTT04KKyAgICAqIFtUSFJJRlQtNDAxMl0gLSBQeXRob24gVHdpc3RlZCBpbXBsZW1lbnRhdGlvbiB1c2VzIGltcGxlbWVudHMsIG5vdCBjb21wYXRpYmxlIHdpdGggUHkzCisgICAgKiBbVEhSSUZULTQwMTRdIC0gYWxpZ24gQyMgbWV0YSBkYXRhIGluIEFzc2VtYmx5SW5mby5jcworICAgICogW1RIUklGVC00MDE1XSAtIEZpeCB3cm9uZ2x5IHNwZWxsZWQgIlRoaXJmdCJzCisgICAgKiBbVEhSSUZULTQwMTZdIC0gdGVzdEluc2FuaXR5KCkgaW1wbCBkb2VzIG5vdCBjb25mb3JtIHRvIHRlc3Qgc3BlYyBpbiBUaHJpZnRUZXN0LnRocmlmdAorICAgICogW1RIUklGVC00MDIzXSAtIFNraXAgdW5leHBlY3RlZCBmaWVsZCB0eXBlcyBvbiByZWFkL3dyaXRlCisgICAgKiBbVEhSSUZULTQwMjRdIC0gU2tpcCgpIHNob3VsZCB0aHJvdyBvbiB1bmtub3duIGRhdGEgdHlwZXMKKyAgICAqIFtUSFJJRlQtNDAyNl0gLSBUU1NMU29ja2V0IGRvZXNuJ3Qgd29yayB3aXRoIFB5dGhvbiA8IDIuNy45CisgICAgKiBbVEhSSUZULTQwMjldIC0gQWNjZWxlcmF0ZWQgcHJvdG9jb2xzIGRvIG5vdCBidWlsZCBmcm9tIHRocmlmdC1weSAwLjEwLjAgb24gUHlQSQorICAgICogW1RIUklGVC00MDMxXSAtIEdvIHBsdWdpbiBnZW5lcmF0ZXMgaW52YWxpZCBjb2RlIGZvciBsaXN0cyBvZiB0eXBlZGVmJ2VkIGJ1aWx0LWluIHR5cGVzCisgICAgKiBbVEhSSUZULTQwMzNdIC0gRGVmYXVsdCBidWlsZCBXSVRIX1BMVUdJTj1PTiBmb3IgYWxsIGJ1aWxkcyByZXN1bHRzIGluIHBhY2thZ2luZyBlcnJvcnMKKyAgICAqIFtUSFJJRlQtNDAzNF0gLSBDTWFrZSBkb2Vzbid0IHdvcmsgdG8gYnVpbGQgY29tcGlsZXIgb24gTWFjT1MKKyAgICAqIFtUSFJJRlQtNDAzNl0gLSBBZGQgLk5FVCBDb3JlIGVudmlyb25tZW50L2J1aWxkIHN1cHBvcnQgdG8gdGhlIGRvY2tlciBpbWFnZQorICAgICogW1RIUklGVC00MDM4XSAtIHNvY2tldCBjaGVjazogY2hlY2tpbmcgYW4gdW5zaWduZWQgbnVtYmVyIGFnYWluc3QgPj0gMCBuZXZlciBmYWlscworICAgICogW1RIUklGVC00MDQyXSAtIEV4dHJhY3Rpb25FcnJvciB3aGVuIHVzaW5nIGFjY2VsZXJhdGVkIHRocmlmdCBpbiBhIG11bHRpcHJvY2VzcyB0ZXN0CisgICAgKiBbVEhSSUZULTQwNDNdIC0gdGhyaWZ0IHBlcmwgZGViaWFuIHBhY2thZ2UgaXMgcGxhY2luZyBmaWxlcyBpbiB0aGUgd3JvbmcgcGxhY2UKKyAgICAqIFtUSFJJRlQtNDA0NF0gLSBCdWlsZCBqb2IgMTcgZmFpbGluZyBvbiBldmVyeSBwdWxsIHJlcXVlc3Q7IGhzcGVjIGNvcmUgKGhhc2tlbGwpIDIuNCBpc3N1ZQorICAgICogW1RIUklGVC00MDQ2XSAtIE1pbkdXIHdpdGggZ2NjIDYuMiBkb2VzIG5vdCBjb21waWxlIG9uIFdpbmRvd3MKKyAgICAqIFtUSFJJRlQtNDA2MF0gLSBUaHJpZnQgcHJpbnRUbyBvc3RyZWFtIG92ZXJsb2FkIG1lY2hhbmlzbSBicmVha3MgZG93biB3aGVuIHR5cGVzIGFyZSBuZXN0ZWQKKyAgICAqIFtUSFJJRlQtNDA2Ml0gLSBSZW1vdmUgZGVidWcgcHJpbnQgZnJvbSBUU2VydmljZUNsaWVudAorICAgICogW1RIUklGVC00MDY1XSAtIERvY3VtZW50IFBlcmwgRm9ya2luZ1NlcnZlciBzaWduYWwgcmVzdHJpY3Rpb24gaW1wb3NlZCBieSBUSFJJRlQtMzg0OCBhbmQgcmVtb3ZlIHVubmVjZXNzYXJ5IGNvZGUKKyAgICAqIFtUSFJJRlQtNDA2OF0gLSBBIGNvZGUgY29tbWVudCBpbiBKYXZhIFNlcnZlclNvY2tldCBpcyB3cm9uZyBhcm91bmQgYWNjZXB0KCkKKyAgICAqIFtUSFJJRlQtNDA3M10gLSBlbnVtIGZpbGVzIGFyZSBzdGlsbCBiZWluZyBnZW5lcmF0ZWQgd2l0aCB1bnVzZWQgaW1wb3J0cworICAgICogW1RIUklGVC00MDc2XSAtIEFwcHZleW9yIGJ1aWxkcyBmYWlsaW5nIGJlY2F1c2UgYW50IDEuOS44IHdhcyByZW1vdmVkIGZyb20gYXBhY2hlIHNlcnZlcnMKKyAgICAqIFtUSFJJRlQtNDA3N10gLSBBSV9BRERSQ09ORklHIHJlZGVmaW5lZCBhZnRlciByZWNlbnQgY2hhbmdlIHRvIFBsYXRmb3JtU29ja2V0IGhlYWRlcgorICAgICogW1RIUklGVC00MDc5XSAtIEdlbmVyYXRlZCBwZXJsIGNvZGUgdGhhdCByZXR1cm5zIHN0cnVjdHVyZXMgZnJvbSBpbmNsdWRlZCB0aHJpZnQgZmlsZXMgaXMgbWlzc2luZyBhIG5lY2Vzc2FyeSB1c2UgY2xhdXNlCisgICAgKiBbVEhSSUZULTQwODddIC0gU3B1cmlvdXMgZXhjZXB0aW9uIGRlc3Ryb3lpbmcgVFRocmVhZGVkU2VydmVyIGJlY2F1c2Ugb2YgaW5jb3JyZWN0IGpvaW4oKSBjYWxsCisgICAgKiBbVEhSSUZULTQxMDJdIC0gVEJ1ZmZlcmVkVHJhbnNwb3J0IHBlcmZvcm1hbmNlIGlzc3VlIHNpbmNlIDAuMTAuMAorICAgICogW1RIUklGVC00MTA2XSAtIGNvbmN1cnJlbmN5X3Rlc3QgZmFpbHMgcmFuZG9tbHkKKyAgICAqIFtUSFJJRlQtNDEwOF0gLSBjX2dsaWIgdGhyaWZ0IHNzbCBoYXMgbXVsdGlwbGUgYnVncyBhbmQgZGVwcmVjYXRlZCBmdW5jdGlvbnMKKyAgICAqIFtUSFJJRlQtNDEwOV0gLSBDb25maWd1cmUgU2NyaXB0IHVzZXMgc3RyaW5nIGNvbXBhcmlzb24gZm9yIHZlcnNpb25zCisgICAgKiBbVEhSSUZULTQxMjldIC0gQysrIFROb25ibG9ja2luZ1NlcnZlciBmZCBsZWFrIHdoZW4gZmFpbGluZyB0byBkaXNwYXRjaCBuZXcgY29ubmVjdGlvbnMKKyAgICAqIFtUSFJJRlQtNDEzMV0gLSBKYXZhc2NyaXB0IHdpdGggV2ViU29ja2V0IGhhbmRsZXMgb25ld2F5IG1ldGhvZHMgd3JvbmcKKyAgICAqIFtUSFJJRlQtNDEzNF0gLSBGaXggcmVtYWluaW5nIHVuZGVmaW5lZCBiZWhhdmlvciBpbnZhbGlkIHZwdHIgY2FzdHMKKyAgICAqIFtUSFJJRlQtNDE0MF0gLSBVc2Ugb2Ygbm9uLXRocmVhZC1zYWZlIGZ1bmN0aW9uIGdtdGltZSgpCisgICAgKiBbVEhSSUZULTQxNDFdIC0gSW5zdGFsbGF0aW9uIG9mIGhheGUgaW4gZG9ja2VyIGZpbGVzIHJlZmVycyB0byBhIHJlZGlyZWN0IGxpbmsgYW5kIGZhaWxzCisgICAgKiBbVEhSSUZULTQxNDddIC0gUnVzdDogcHJvdG9jb2wgc2hvdWxkIGFjY2VwdCB0cmFuc3BvcnRzIHdpdGggbm9uLXN0YXRpYyBsaWZldGltZQorICAgICogW1RIUklGVC00MTQ4XSAtIFttYXZlbi10aHJpZnQtcGx1Z2luXSBjb21waWxlIGVycm9yIHdoaWxlIGltcG9ydCBhIHRocmlmdCBpbiBkZXBlbmRlbmN5IGphciBmaWxlLgorICAgICogW1RIUklGVC00MTQ5XSAtIFN5c3RlbS5vdXQgcG9sbHV0ZXMgbG9nIGZpbGVzIAorICAgICogW1RIUklGVC00MTU0XSAtIFBIUCBjbG9zZSgpIG9mIGEgVFNvY2tldCBuZWVkcyB0byBjbG9zZSBhbnkgdHlwZSBvZiBzb2NrZXQKKyAgICAqIFtUSFJJRlQtNDE1OF0gLSBtaW5vciBpc3N1ZSBpbiBSRUFETUUtTVNZUzIubWQKKyAgICAqIFtUSFJJRlQtNDE1OV0gLSBCdWlsZGluZyB0ZXN0cyBmYWlscyBvbiBNU1lTMiAoTWluR1c2NCkgZHVlIHRvIGEgKHNtYWxsPykgbGlua2VyIGVycm9yCisgICAgKiBbVEhSSUZULTQxNjBdIC0gVE5vbmJsb2NraW5nIHNlcnZlciBmaXggdXNlIG9mIGNsb3NlZC9mcmVlZCBjb25uZWN0aW9ucworICAgICogW1RIUklGVC00MTYxXSAtIFROb25CbG9ja2luZyBzZXJ2ZXIgdXNpbmcgdW5pbml0aWFsaXplZCBldmVudCBpbiBlcnJvciBwYXRocworICAgICogW1RIUklGVC00MTYyXSAtIFROb25CbG9ja2luZyBoYW5kbGluZyBvZiBUU29ja2V0cyBpbiBlcnJvciBzdGF0ZSBpcyBpbmNvcnJlY3QgYWZ0ZXIgZmQgaXMgY2xvc2VkCisgICAgKiBbVEhSSUZULTQxNjRdIC0gQ29yZSBpbiBUU1NMU29ja2V0IGNsZWFudXBPcGVuU1NMIHdoZW4gZGVzdHJveWluZyBhIG11dGV4IHVzZWQgYnkgb3BlbnNzbAorICAgICogW1RIUklGVC00MTY1XSAtIEMrKyBidWlsZCBoYXMgbWFueSB3YXJuaW5ncyB1bmRlciBjKyswMyBkdWUgdG8gcmVjZW50IGNoYW5nZXMsIGNtYWtlIG5lZWRzIGJldHRlciBwbGF0Zm9ybS1pbmRlcGVuZGVudCBsYW5ndWFnZSBsZXZlbCBjb250cm9sCisgICAgKiBbVEhSSUZULTQxNjZdIC0gUmVjZW50IGZpeCB0byByZW1vdmUgYm9vc3Q6OmxleGljYWxfY2FzdCB1c2FnZSBicm9rZSBWUzIwMTAKKyAgICAqIFtUSFJJRlQtNDE2N10gLSBNaXNzaW5nIGNvbXBpbGUgZmxhZworICAgICogW1RIUklGVC00MTcwXSAtIFN1cHBvcnQgbHVhIDUuMSBvciBlYXJsaWVyIHByb3Blcmx5IGZvciBvYmplY3QgbGVuZ3RoIGRldGVybWluYXRpb24KKyAgICAqIFtUSFJJRlQtNDE3Ml0gLSBub2RlLmpzIHR1dG9yaWFsIGNsaWVudCBkb2VzIG5vdCBpbXBvcnQgYXNzZXJ0LCBjb25uZWN0aW9uIGlzc3VlcyBhcmUgbm90IGhhbmRsZWQgcHJvcGVybHkKKyAgICAqIFtUSFJJRlQtNDE3N10gLSBKYXZhIGNvbXBpbGVyIHByb2R1Y2VzIGRlZXAgY29weSBjb25zdHJ1Y3RvciB0aGF0IGNvdWxkIG1ha2Ugc2hhbGxvdyBjb3B5IGluc3RlYWQKKyAgICAqIFtUSFJJRlQtNDE4NF0gLSBCdWlsZGluZyBvbiBBcHB2ZXlvcjogaW52YWxpZCBlc2NhcGUgc2VxdWVuY2UgXEwKKyAgICAqIFtUSFJJRlQtNDE4NV0gLSBmYjMwMyBjb3VudGVyIGVuY29kaW5nIGZpeAorICAgICogW1RIUklGVC00MTg5XSAtIEZyYW1lZC9idWZmZXJlZCB0cmFuc3BvcnQgRGlzcG9zZSgpIGRvZXMgbm90IGRpc3Bvc2UgdGhlIG5lc3RlZCB0cmFuc3BvcnQKKyAgICAqIFtUSFJJRlQtNDE5M10gLSBMb3dlciB0aGUgZGVmYXVsdCBtYXhSZWFkQnVmZmVyQnl0ZXMgZm9yIG5vbi1ibG9ja2luZyBzZXJ2ZXJzCisgICAgKiBbVEhSSUZULTQxOTVdIC0gQ29tcGlsYXRpb24gdG8gR08gcHJvZHVjZXMgYnJva2VuIGNvZGUKKyAgICAqIFtUSFJJRlQtNDE5Nl0gLSBDYW5ub3QgZ2VuZXJhdGUgcmVjdXJzaXZlIFJ1c3QgdHlwZXMKKyAgICAqIFtUSFJJRlQtNDIwNF0gLSB0eXBvIGluIGNvbXBhY3Qgc3BlYworICAgICogW1RIUklGVC00MjA2XSAtIFN0cmluZ3MgaW4gY29udGFpbmVyIGZpZWxkcyBhcmUgbm90IGRlY29kZWQgcHJvcGVybHkgd2l0aCBweTpkeW5hbWljIGFuZCBweTp1dGY4c3RyaW5ncworICAgICogW1RIUklGVC00MjA4XSAtIEMjIE5hbWVkUGlwZXNTZXJ2ZXIgbm90IHJlYWxseSB3b3JraW5nIGluIHNvbWUgc2NlbmFyaW9zCisgICAgKiBbVEhSSUZULTQyMTFdIC0gRml4IEdFcnJvciBnbGliIG1hbmFnZW1lbnQgdW5kZXIgVGhyaWZ0CisgICAgKiBbVEhSSUZULTQyMTJdIC0gY19nbGliIGZsdXNoIHRyaWVzIHRvIGNsb3NlIFNTTCBldmVuIGlmIHNvY2tldCBpcyBpbnZhbGlkCisgICAgKiBbVEhSSUZULTQyMTNdIC0gVHJhdmlzIGJ1aWxkIGZhaWxzIGF0IGN1cmwgLXNTTCBodHRwczovL3d3dy5ucG1qcy5jb20vaW5zdGFsbC5zaCB8IHNoCisgICAgKiBbVEhSSUZULTQyMTVdIC0gR29sYW5nIFRUcmFuc3BvcnRGYWN0b3J5IFBhdHRlcm4gU3F1ZWxjaGVzIEVycm9ycworICAgICogW1RIUklGVC00MjE2XSAtIEdvbGFuZyBIdHRwIENsaWVudHMgRG8gTm90IFJlc3BlY3QgVXNlciBPcHRpb25zCisgICAgKiBbVEhSSUZULTQyMThdIC0gU2V0IFRDUF9OT0RFTEFZIGZvciBQSFAgY2xpZW50IHNvY2tldAorICAgICogW1RIUklGVC00MjE5XSAtIEdvbGFuZyBIVFRQIGNsaWVudHMgY3JlYXRlZCB3aXRoIE5pbCBidWZmZXIKKyAgICAqIFtUSFJJRlQtNDIzMV0gLSBUSlNPTlByb3RvY29sIHRocm93cyB1bmV4cGVjdGVkIG5vbi1UaHJpZnQtZXhjZXB0aW9uIG9uIG51bGwgc3RyaW5ncworICAgICogW1RIUklGVC00MjMyXSAtIC4vY29uZmlndXJlIGRvZXMgYmFkIGFudCB2ZXJzaW9uIGNoZWNrCisgICAgKiBbVEhSSUZULTQyMzRdIC0gVHJhdmlzIGJ1aWxkIGZhaWxzIGNyb3NzIGxhbmd1YWdlIHRlc3RzIHdpdGggIlVuc3VwcG9ydGVkIHNlY3VyaXR5IHByb3RvY29sIHR5cGUiCisgICAgKiBbVEhSSUZULTQyMzddIC0gR28gVFNlcnZlclNvY2tldCBSYWNlIENvbmRpdGlvbnMKKyAgICAqIFtUSFJJRlQtNDI0MF0gLSBHbyBUU2ltcGxlU2VydmVyIGRvZXMgbm90IGNsb3NlIHByb3Blcmx5CisgICAgKiBbVEhSSUZULTQyNDNdIC0gR28gVFNpbXBsZVNlcnZlciByYWNlIG9uIHdhaXQgaW4gU3RvcCgpIG1ldGhvZAorICAgICogW1RIUklGVC00MjQ1XSAtIEdvbGFuZyBURnJhbWVkVHJhbnNwb3J0J3Mgd3JpdGVCdWZmZXIgaW5jcmVhc2VzIGlmIHdyaXRlcyB0byB0cmFuc3BvcnQgZmFpbGVkCisgICAgKiBbVEhSSUZULTQyNDZdIC0gU2VxdWVuY2UgbnVtYmVyIG1pc21hdGNoIG9uIG11bHRpcGxleGVkIGNsaWVudHMKKyAgICAqIFtUSFJJRlQtNDI0N10gLSBDb21waWxlIGZhaWxzIHdpdGggb3BlbnNzbCAxLjEKKyAgICAqIFtUSFJJRlQtNDI0OF0gLSBDb21waWxlIGZhaWxzIC0gc3RybmNweSwgbWVtY21wLCBtZW1zZXQgbm90IGRlY2xhcmVkIGluIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RTU0xTb2NrZXQuY3BwCisgICAgKiBbVEhSSUZULTQyNTFdIC0gSmF2YSBFcG9sbCBTZWxlY3RvciBCdWcKKyAgICAqIFtUSFJJRlQtNDI1N10gLSBUeXBlc2NyaXB0IGFzeW5jIGNhbGxiYWNrcyBkbyBub3QgcHJvdmlkZSB0aGUgY29ycmVjdCB0eXBlcworICAgICogW1RIUklGVC00MjU4XSAtIEJvb3N0L3N0ZCB0aHJlYWQgd3JhcHBpbmcgZmF1bHRpbmVzcworICAgICogW1RIUklGVC00MjYwXSAtIEdvIGNvbnRleHQgZ2VuZXJhdGlvbiBpc3N1ZS4gQ29udGV4dCBpcyBwYXJhbWV0ZXIgaW4gSW50ZXJmYWNlIG5vdCBpbiBpbXBsZW1lbnRhdGlvbgorICAgICogW1RIUklGVC00MjYxXSAtIEdvIGNvbnRleHQgZ2VuZXJhdGlvbiBpc3N1ZTogYnJlYWtpbmcgY2hhbmdlIGluIGdlbmVyYXRlZCBjb2RlIHJlZ2FyZGluZyB0aHJpZnQuVFByb2Nlc3NvckZ1bmN0aW9uIGludGVyZmFjZQorICAgICogW1RIUklGVC00MjYyXSAtIEludmFsaWQgYmluZGluZyB0byBJbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZTY0KCkgd2l0aCA2NC1iaXQgdGFyZ2V0cworICAgICogW1RIUklGVC00MjYzXSAtIEZpeCB1c2UgYWZ0ZXIgZnJlZSBidWcgZm9yIHRocm93biBleGNlcHRpb25zCisgICAgKiBbVEhSSUZULTQyNjZdIC0gRXJsYW5nIGxpYnJhcnkgdGhyb3dzIGR1cmluZyBza2lwcGluZyBmaWVsZHMgb2YgY29tcG9zaXRlIHR5cGUgKG1hcHMsIGxpc3RzLCBzdHJ1Y3RzLCBzZXRzKQorICAgICogW1RIUklGVC00MjY4XSAtIEVybGFuZyBsaWJyYXJ5IGVtaXRzIGRlYnVnZ2luZyBvdXRwdXQgaW4gdHJhbnNwb3J0IGxheWVyCisgICAgKiBbVEhSSUZULTQyNzNdIC0gZXJsYW5nOm5vdy8wOiBEZXByZWNhdGVkIEJJRi4gCisgICAgKiBbVEhSSUZULTQyNzRdIC0gUHl0aG9uIGZlYXR1cmUgdGVzdHMgZm9yIFNTTC9UTFMgZmFpbGluZworICAgICogW1RIUklGVC00Mjc5XSAtIFdyb25nIHBhdGggaW4gaW5jbHVkZSBkaXJlY3RpdmUgaW4gZ2VuZXJhdGVkIFRocmlmdCBzb3VyY2VzCisgICAgKiBbVEhSSUZULTQyODNdIC0gVE5hbWVkUGlwZVNlcnZlciByYWNlIGNvbmRpdGlvbiBpbiBpbnRlcnJ1cHQKKyAgICAqIFtUSFJJRlQtNDI4NF0gLSBGaWxlIGNvbnRhaW5zIGEgTkJTUDogbGliL25vZGVqcy9saWIvdGhyaWZ0L3dlYl9zZXJ2ZXIuanMKKyAgICAqIFtUSFJJRlQtNDI5MF0gLSBDIyBudWxsYWJsZSBvcHRpb24gZ2VuZXJhdGVzIGludmFsaWQgY29kZSBmb3Igbm9uLXJlcXVpcmVkIGVudW0gZmllbGQgd2l0aCBkZWZhdWx0IHZhbHVlCisgICAgKiBbVEhSSUZULTQyOTJdIC0gVGltZXJNYW5hZ2VyOjpyZW1vdmUoKSBpcyBub3QgaW1wbGVtZW50ZWQKKyAgICAqIFtUSFJJRlQtNDMwN10gLSBNYWtlIHNzbC1vcGVuIHRpbWVvdXQgZWZmZWN0aXZlIGluIGdvbGFuZyBjbGllbnQKKyAgICAqIFtUSFJJRlQtNDMxMl0gLSBFcmxhbmcgY2xpZW50IGNhbm5vdCBjb25uZWN0IHRvIFB5dGhvbiBzZXJ2ZXI6IGV4Y2VwdGlvbiBlcnJvcjogZWNvbm5yZWZ1c2VkCisgICAgKiBbVEhSSUZULTQzMTNdIC0gUHJvZ3JhbSBjb2RlIG9mIHRoZSBFcmxhbmcgdHV0b3JpYWwgZmlsZXMgY29udGFpbiBzeW50YXggZXJyb3JzCisgICAgKiBbVEhSSUZULTQzMTZdIC0gVEJ5dGVCdWZmZXIuamF2YSB3aWxsIHJlYWQgdG9vIG11Y2ggZGF0YSBpZiBhIHByZXZpb3VzIHJlYWQgcmV0dXJucyBmZXdlciBieXRlcyB0aGFuIHJlcXVlc3RlZAorICAgICogW1RIUklGVC00MzE5XSAtIGNvbW1hbmQgbGluZSBzd2l0Y2ggZm9yICJldmh0dHAiIGluY29ycmVjdGx5IHJlc29sdmVkIHRvIGFub24gcGlwZXMKKyAgICAqIFtUSFJJRlQtNDMyM10gLSByYW5nZSBjaGVjayBlcnJvcnMgb3IgTlBFIGluIGVkZ2UgY2FzZXMKKyAgICAqIFtUSFJJRlQtNDMyNF0gLSBmaWVsZCBuYW1lcyBjYW4gY29uZmxpY3Qgd2l0aCBsb2NhbCB2YXJzIGluIGdlbmVyYXRlZCBjb2RlCisgICAgKiBbVEhSSUZULTQzMjhdIC0gVHJhdmlzIENJIGJ1aWxkcyBhcmUgdGltaW5nIG91dCAoam9iIDEpIGFuZCBoYXhlIGJ1aWxkcyBhcmUgZmFpbGluZyBzaW5jZSA5LzExCisgICAgKiBbVEhSSUZULTQzMjldIC0gY19nbGliIERvZXNuJ3QgaGF2ZSBhIG11bHRpcGxleGVkIHByb2Nlc3NvcgorICAgICogW1RIUklGVC00MzMxXSAtIEMrKzogVFNTTFNvY2tldHMgYnVnIGluIGhhbmRsaW5nIGh1Z2UgbWVzc2FnZXMsIGJ1ZyBpbiBoYW5kbGluZyBwb2xsaW5nCisgICAgKiBbVEhSSUZULTQzMzJdIC0gQmluYXJ5IHByb3RvY29sIGhhcyBtZW1vcnkgbGVha3MKKyAgICAqIFtUSFJJRlQtNDMzNF0gLSBQZXJsIGluZGVudGF0aW9uIGluY29ycmVjdCB3aGVuIGRlZmF1bHRpbmcgZmllbGQgYXR0cmlidXRlIHRvIGEgc3RydWN0CisgICAgKiBbVEhSSUZULTQzMzldIC0gVGhyaWZ0IEZyYW1lZCBUcmFuc3BvcnQgaW4gRXJsYW5nIGNyYXNoZXMgc2VydmVyIHdoZW4gY2xpZW50IGRpc2Nvbm5lY3RzCisgICAgKiBbVEhSSUZULTQzNDBdIC0gRXJsYW5nIGZpeCBhIGNyYXNoIG9uIGNsaWVudCBjbG9zZQorICAgICogW1RIUklGVC00MzU1XSAtIEphdmFzY3JpcHQgaW5kZW50YXRpb24gaW5jb3JyZWN0IHdoZW4gZGVmYXVsdGluZyBmaWVsZCBhdHRyaWJ1dGUgdG8gYSBzdHJ1Y3QKKyAgICAqIFtUSFJJRlQtNDM1Nl0gLSB0aHJpZnRfcHJvdG9jb2wgY2FsbCBUcmFuc3BvcnQgY2F1c2UgU2VnbWVudGF0aW9uIGZhdWx0CisgICAgKiBbVEhSSUZULTQzNTldIC0gSGF4ZSBjb21waWxlciBsb29rcyBsaWtlIGl0IGlzIHByb2R1Y2luZyBpbmNvcnJlY3QgY29kZSBmb3IgbWFwIG9yIHNldCBrZXkgdGhhdCBpcyBiaW5hcnkgdHlwZQorICAgICogW1RIUklGVC00MzYyXSAtIE1pc3Npbmcgc2l6ZS1jaGVjayBjYW4gbGVhZCB0byBodWdlIG1lbW9yeSBhbGxvY2F0aW9uCisgICAgKiBbVEhSSUZULTQzNjRdIC0gV2Vic2l0ZSBjb250cmlidXRpbmcgZ3VpZGUgZXJyb25lb3VzbHkgcmVjb21tZW5kcyBzdWJtaXR0aW5nIHBhdGNoZXMgaW4gSklSQQorICAgICogW1RIUklGVC00MzY1XSAtIFBlcmwgZ2VuZXJhdGVkIGNvZGUgdXNlcyBpbmRpcmVjdCBvYmplY3Qgc3ludGF4LCB3aGljaCBvY2Nhc2lvbmFsbHkgY2F1c2VzIGNvbXBpbGF0aW9uIGVycm9ycy4KKyAgICAqIFtUSFJJRlQtNDM2N10gLSBweXRob24gVFByb2Nlc3Nvci5wcm9jZXNzIGlzIG1pc3NpbmcgInNlbGYiCisgICAgKiBbVEhSSUZULTQzNzBdIC0gVWJ1bnR1IEFydGZ1bCBjcHBjaGVjayBhbmQgZmxha2U4IGFyZSBtb3JlIHN0cmluZ2VudCBhbmQgY2F1c2luZyBTQ0EgYnVpbGQgam9iIGZhaWx1cmVzCisgICAgKiBbVEhSSUZULTQzNzJdIC0gUGlwZSB3cml0ZSBvcGVyYXRpb25zIGFjcm9zcyBhIG5ldHdvcmsgYXJlIGxpbWl0ZWQgdG8gNjUsNTM1IGJ5dGVzIHBlciB3cml0ZS4gCisgICAgKiBbVEhSSUZULTQzNzRdIC0gY2Fubm90IGxvYWQgdGhyaWZ0X3Byb3RvY29sIGR1ZSB0byB1bmRlZmluZWQgc3ltYm9sOiBfWlRWTjEwX19jeHhhYml2MTIwX19zaV9jbGFzc190eXBlX2luZm9FCisgICAgKiBbVEhSSUZULTQzNzVdIC0gVE1lbW9yeSB0aHJvdyBiYWRfYWxsb2MgZHVlIHRvIGNvdW50ZXIgb3ZlcmZsb3cKKyAgICAqIFtUSFJJRlQtNDM3Nl0gLSBDb3Zlcml0eSBoaWdoIGltcGFjdCBpc3N1ZSByZXNvbHV0aW9uCisgICAgKiBbVEhSSUZULTQzNzddIC0gaGF4ZS4gc29ja2V0IGhhbmRsZXMgbGVhayBpbiBUU2ltcGxlU2VydmVyCisgICAgKiBbVEhSSUZULTQzODFdIC0gV3JvbmcgaXNzZXQgYml0ZmllbGQgdmFsdWUgYWZ0ZXIgdHJhbnNtaXNzaW9uCisgICAgKiBbVEhSSUZULTQzODVdIC0gR28gcmVtb3RlIGNsaWVudCAtdSBmbGFnIGlzIGJyb2tlbgorICAgICogW1RIUklGVC00MzkyXSAtIGNvbXBpbGVyLy4uLi4vcGx1Z2luLnRocmlmdCBzdHJ1Y3RzIG1pcy1vcmRlcmVkIGJsb3dzIHVwIG9jYW1sIGdlbmVyYXRvcgorICAgICogW1RIUklGVC00Mzk1XSAtIFVuYWJsZSB0byBidWlsZCBpbiB0aGUgdWJ1bnR1LXhlbmlhbCBkb2NrZXIgaW1hZ2U6IGNsYXAgMi4yOCByZXF1aXJlcyBSdXN0IDEuMjAKKyAgICAqIFtUSFJJRlQtNDM5Nl0gLSBpbmNvbnNpc3RlbnQgKG9yIHBsYWluIHdyb25nKSB2ZXJzaW9uIG51bWJlcnMgaW4gbWFzdGVyL3RydW5rIAorCisjIyBEb2N1bWVudGF0aW9uCisgICAgKiBbVEhSSUZULTQxNTddIC0gb3V0ZGF0ZWQgcmVhZG1lIGFib3V0IEhheGUgaW5zdGFsbGF0aW9uIG9uIExpbnV4CisKKyMjIEltcHJvdmVtZW50CisgICAgKiBbVEhSSUZULTEwNV0gLSBtYWtlIGEgdGhyaWZ0X3NwZWMgZm9yIGEgc3RydWN0dXJlcyB3aXRoIG5lZ2F0aXZlIHRhZ3MKKyAgICAqIFtUSFJJRlQtMjgxXSAtIENvY29hIGxpYnJhcnkgY29kZSBuZWVkcyBjb21tZW50cywgYmFkbHkKKyAgICAqIFtUSFJJRlQtNzc1XSAtIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50cyBmb3IgUGVybAorICAgICogW1RIUklGVC0yMjIxXSAtIEdlbmVyYXRlIGMrKyBjb2RlIHdpdGggc3RkOjpzaGFyZWRfcHRyIGluc3RlYWQgb2YgYm9vc3Q6OnNoYXJlZF9wdHIuCisgICAgKiBbVEhSSUZULTIzNjRdIC0gT0NhbWw6IFVzZSBPYXNpcyBleGNsdXNpdmVseSBmb3IgYnVpbGQgcHJvY2VzcworICAgICogW1RIUklGVC0yNTA0XSAtIFRNdWx0aXBsZXhlZFByb2Nlc3NvciBzaG91bGQgYWxsb3cgcmVnaXN0ZXJpbmcgZGVmYXVsdCBwcm9jZXNzb3IgY2FsbGVkIGlmIG5vIHNlcnZpY2UgbmFtZSBpcyBwcmVzZW50CisgICAgKiBbVEhSSUZULTMyMDddIC0gRW5hYmxlIGJ1aWxkIHdpdGggT3BlblNTTCAxLjEuMCBzZXJpZXMKKyAgICAqIFtUSFJJRlQtMzI3Ml0gLSBQZXJsIFNTTCBBdXRoZW50aWNhdGlvbiBTdXBwb3J0CisgICAgKiBbVEhSSUZULTMzNTddIC0gR2VuZXJhdGUgRW51bVNldC9FbnVtTWFwIHdoZXJlIGVsZW1lbnRzL2tleXMgYXJlIGVudW1zCisgICAgKiBbVEhSSUZULTMzNjldIC0gSW1wbGVtZW50IFNTTC9UTFMgc3VwcG9ydCBvbiBDIHdpdGggY19nbGliCisgICAgKiBbVEhSSUZULTM0NjddIC0gR28gTWFwcyBmb3IgVGhyaWZ0IFNldHMgU2hvdWxkIEhhdmUgVmFsdWVzIG9mIFR5cGUgc3RydWN0e30gCisgICAgKiBbVEhSSUZULTM1ODBdIC0gVEhlYWRlciBmb3IgSGFza2VsbAorICAgICogW1RIUklGVC0zNjI3XSAtIE1pc3NpbmcgYmFzaWMgY29kZSBzdHlsZSBjb25zaXN0ZW5jeSBvZiBKYXZhU2NyaXB0LgorICAgICogW1RIUklGVC0zNzA2XSAtIFRoZXJlJ3Mgbm8gc3VwcG9ydCBmb3IgTXVsdGlwbGV4ZWQgcHJvdG9jb2wgb24gY19nbGliIGxpYnJhcnkKKyAgICAqIFtUSFJJRlQtMzc2Nl0gLSBBZGQgZ2V0VW5kZXJseWluZ1RyYW5zcG9ydCgpIHRvIFRabGliVHJhbnNwb3J0CisgICAgKiBbVEhSSUZULTM3NzZdIC0gR28gY29kZSBmcm9tIG11bHRpcGxlIHRocmlmdCBmaWxlcyB3aXRoIHRoZSBzYW1lIG5hbWVzcGFjZQorICAgICogW1RIUklGVC0zODIzXSAtIEVzY2FwZSBkb2N1bWVudGF0aW9uIHdoaWxlIGdlbmVyYXRpbmcgbm9uIGVzY2FwZWQgZG9jdW1ldGF0aW9uCisgICAgKiBbVEhSSUZULTM4NTRdIC0gYWxsb3cgdXNlcnMgdG8gY2xlYXIgcmVhZCBidWZmZXJzCisgICAgKiBbVEhSSUZULTM4NTldIC0gVW5peCBEb21haW4gU29ja2V0IFN1cHBvcnQgaW4gT2JqZWN0aXZlLUMKKyAgICAqIFtUSFJJRlQtMzkyMV0gLSBDKysgY29kZSBzaG91bGQgcHJpbnQgZW51bXMgYXMgc3RyaW5ncworICAgICogW1RIUklGVC0zOTI2XSAtIFRoZXJlIHNob3VsZCBiZSBhbiBlcnJvciBlbWl0dGVkIHdoZW4gaHR0cCBzdGF0dXMgY29kZSBpcyBub3QgMjAwIAorICAgICogW1RIUklGVC00MDA3XSAtIE1pY3JvLW9wdGltaXphdGlvbiBvZiBUVHJhbnNwb3J0LnB5CisgICAgKiBbVEhSSUZULTQwNDBdIC0gQWRkIHJlYWwgY2F1c2Ugb2YgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0IGVycm9yIHRvIGV4Y2VwdGlvbgorICAgICogW1RIUklGVC00MDY0XSAtIFVwZGF0ZSBub2RlIGxpYnJhcnkgZGVwZW5kZW5jaWVzCisgICAgKiBbVEhSSUZULTQwNjldIC0gQWxsIHBlcmwgcGFja2FnZXMgc2hvdWxkIGhhdmUgcHJvcGVyIG5hbWVzcGFjZSwgdmVyc2lvbiBzeW50YXgsIGFuZCB1c2UgcHJvcGVyIHRocmlmdCBleGNlcHRpb25zCisgICAgKiBbVEhSSUZULTQwNzFdIC0gQ29uc29saWRhdGUgdGhlIFRyYXZpcyBDSSBqb2JzIHdoZXJlIHBvc3NpYmxlIHRvIHB1dCBsZXNzIHN0cmVzcyBvbiB0aGUgQXBhY2hlIEZvdW5kYXRpb24ncyBhbGxvY2F0aW9uIG9mIENJIGJ1aWxkIHNsYXZlcworICAgICogW1RIUklGVC00MDcyXSAtIEFkZCB0aGUgcG9zc2liaWxpdHkgdG8gc2VuZCBjdXN0b20gaGVhZGVycyBpbiBUQ3VybENsaWVudAorICAgICogW1RIUklGVC00MDc1XSAtIEJldHRlciBNaW5HVyBzdXBwb3J0IGZvciBoZWFkZXJzLW9ubHkgYm9vc3QgKHdpdGhvdXQgdGhyZWFkIGxpYnJhcnkpCisgICAgKiBbVEhSSUZULTQwODFdIC0gUHJvdmlkZSBhIE1pbkdXIDY0LWJpdCBBcHB2ZXlvciBDSSBidWlsZCBmb3IgYmV0dGVyIHB1bGwgcmVxdWVzdCB2YWxpZGF0aW9uCisgICAgKiBbVEhSSUZULTQwODRdIC0gSW1wcm92ZSBTU0wgc2VjdXJpdHkgaW4gdGhyaWZ0IGJ5IGFkZGluZyBhIG1ha2UgY3Jvc3MgY2xpZW50IHRoYXQgY2hlY2tzIHRvIG1ha2Ugc3VyZSBTU0x2MyBwcm90b2NvbCBjYW5ub3QgYmUgbmVnb3RpYXRlZAorICAgICogW1RIUklGVC00MDk1XSAtIEFkZCBtdWx0aXBsZXhlZCBwcm90b2NvbCB0byBUcmF2aXMgQ0kgZm9yIG1ha2UgY3Jvc3MKKyAgICAqIFtUSFJJRlQtNDA5OV0gLSBBdXRvLWRlcml2ZSBIYXNoIGZvciBnZW5lcmF0ZWQgUnVzdCBzdHJ1Y3RzCisgICAgKiBbVEhSSUZULTQxMTBdIC0gVGhlIGRlYmlhbiBidWlsZCBmaWxlcyBkbyBub3QgcHJvZHVjZSBhICItZGJnIiBwYWNrYWdlIGZvciBkZWJ1ZyBzeW1ib2xzIG9mIGxpYnRocmlmdDAKKyAgICAqIFtUSFJJRlQtNDExNF0gLSBTcGFjZSBhZnRlciAnLy8vJyBpbiBkb2MgY29tbWVudHMKKyAgICAqIFtUSFJJRlQtNDEyNl0gLSBWYWxpZGF0ZSBvYmplY3RzIGluIHBocCBleHRlbnNpb24KKyAgICAqIFtUSFJJRlQtNDEzMF0gLSBFbnN1cmUgQXBhY2hlIEh0dHAgY29ubmVjdGlvbiBpcyByZWxlYXNlZCBiYWNrIHRvIHBvb2wgYWZ0ZXIgdXNlCisgICAgKiBbVEhSSUZULTQxNTFdIC0gVGhyaWZ0IE11dGV4IENvbnRlbnRpb24gUHJvZmlsaW5nIChwdGhyZWFkcykgc2hvdWxkIGJlIGRpc2FibGVkIGJ5IGRlZmF1bHQKKyAgICAqIFtUSFJJRlQtNDE3Nl0gLSBJbXBsZW1lbnQgYSB0aHJlYWRlZCBhbmQgdGhyZWFkcG9vbCBzZXJ2ZXIgdHlwZSBmb3IgUnVzdAorICAgICogW1RIUklGVC00MTgzXSAtIE5hbWVkIHBpcGUgY2xpZW50IGJsb2NrcyBmb3JldmVyIG9uIE9wZW4oKSB3aGVuIHRoZXJlIGlzIG5vIHNlcnZlciBhdCB0aGUgb3RoZXIgZW5kCisgICAgKiBbVEhSSUZULTQxOTBdIC0gaW1wcm92ZSBDIyBUVGhyZWFkUG9vbFNlcnZlciBkZWZhdWx0cworICAgICogW1RIUklGVC00MTk3XSAtIEltcGxlbWVudCB0cmFuc3BhcmVudCBnemlwIGNvbXByZXNzaW9uIGZvciBIVFRQIHRyYW5zcG9ydAorICAgICogW1RIUklGVC00MTk4XSAtIFJ1Ynkgc2hvdWxkIGxvZyBUaHJpZnQgaW50ZXJuYWwgZXJyb3JzIHRvIGdsb2JhbCBsb2dnZXIKKyAgICAqIFtUSFJJRlQtNDIwM10gLSB0aHJpZnQgc2VydmVyIHN0b3AgZ3JhY2VmdWxseQorICAgICogW1RIUklGVC00MjA1XSAtIGNfZ2xpYiBpcyBub3QgbGlua2luZyBhZ2FpbnN0IGdsaWIgKyBnb2JqZWN0CisgICAgKiBbVEhSSUZULTQyMDldIC0gd2FybmluZyBDUzA0MTQgaW4gVFtUTFNdU2VydmVyU29ja2V0LmNzCisgICAgKiBbVEhSSUZULTQyMTBdIC0gaW5jbHVkZSBUaHJpZnQuNDUuY3Nwcm9qIGludG8gQ0kgcnVucyAKKyAgICAqIFtUSFJJRlQtNDIxN10gLSBIdHRwQ2xpZW50IHNob3VsZCBzdXBwb3J0IGd6aXAgYW5kIGRlZmxhdGUKKyAgICAqIFtUSFJJRlQtNDIyMl0gLSBTdXBwb3J0IFVuaXggRG9tYWluIFNvY2tldHMgaW4gR29sYW5nIFRTZXJ2ZXJTb2NrZXQKKyAgICAqIFtUSFJJRlQtNDIzM10gLSBNYWtlIFRIc0hhU2VydmVyLmludm9rZXIgYXZhaWxhYmxlIChnZXQgbWV0aG9kIG9ubHkpIGluIGluaGVyaXRlZCBjbGFzc2VzCisgICAgKiBbVEhSSUZULTQyMzZdIC0gU3VwcG9ydCBjb250ZXh0IGluIGdvIGdlbmVyYXRlZCBjb2RlLgorICAgICogW1RIUklGVC00MjM4XSAtIEpTT04gZ2VuZXJhdG9yOiBtYWtlIGFubm90YXRpb24tYXdhcmUKKyAgICAqIFtUSFJJRlQtNDI2OV0gLSBEb24ndCBhcHBlbmQgJy4nIHRvIEVybGFuZyBuYW1lc3BhY2UgaWYgaXQgZW5kcyBpbiAnXycuCisgICAgKiBbVEhSSUZULTQyNzBdIC0gR2VuZXJhdGUgRXJsYW5nIG1hcHBpbmcgZnVuY3Rpb25zIGZvciBjb25zdCBtYXBzIGFuZCBsaXN0cworICAgICogW1RIUklGVC00Mjc1XSAtIEFkZCBzdXBwb3J0IGZvciB6b3BlLmludGVyZmFjZSBvbmx5LCBhcGFydCBmcm9tIHR3aXN0ZWQgc3VwcG9ydC4KKyAgICAqIFtUSFJJRlQtNDI4NV0gLSBQdWxsIGdlbmVyYXRlZCBzZW5kL3JlY3YgaW50byBsaWJyYXJ5IHRvIGFsbG93IGJlaGF2aW91ciB0byBiZSBjdXN0b21pc2VkCisgICAgKiBbVEhSSUZULTQyODddIC0gQWRkIGMrKyBjb21waWxlciAibm9fc2tlbGV0b24iIGZsYWcgb3B0aW9uCisgICAgKiBbVEhSSUZULTQyODhdIC0gSW1wbGVtZW50IGxvZ2dpbmcgbGV2ZWxzIHByb3Blcmx5IGZvciBub2RlLmpzCisgICAgKiBbVEhSSUZULTQyOTVdIC0gUmVmcmVzaCB0aGUgRG9ja2VyIGltYWdlIGZpbGUgc3VpdGUgZm9yIFVidW50dSwgRGViaWFuLCBhbmQgQ2VudE9TCisgICAgKiBbVEhSSUZULTQzMDVdIC0gRW1pdCBkZG9jIGZvciBnZW5lcmF0ZWQgaXRlbXMKKyAgICAqIFtUSFJJRlQtNDMwNl0gLSBUaHJpZnQgaW1wb3J0cyBub3QgcmVwbGljYXRlZCB0byBEIHNlcnZpY2Ugb3V0cHV0CisgICAgKiBbVEhSSUZULTQzMTVdIC0gQWRkIGRlZmF1bHQgbWVzc2FnZSBmb3IgVEFwcGxpY2F0aW9uRXhjZXB0aW9uCisgICAgKiBbVEhSSUZULTQzMThdIC0gRGVscGhpIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50cworICAgICogW1RIUklGVC00MzI1XSAtIFNpbXBsaWZ5IGF1dG9tYWtlIGNyb3NzIGNvbXBpbGF0aW9uIGJ5IHJlbHlpbmcgb24gb25lIGdsb2JhbCBUSFJJRlQgY29tcGlsZXIgcGF0aAorICAgICogW1RIUklGVC00MzI3XSAtIEltcHJvdmUgVGltZXJNYW5hZ2VyIEFQSSB0byBhbGxvdyByZW1vdmluZyBzcGVjaWZpYyB0YXNrCisgICAgKiBbVEhSSUZULTQzMzBdIC0gQWxsb3cgdW51c2VkIGNyYXRlcyBpbiBSdXN0IGZpbGVzCisgICAgKiBbVEhSSUZULTQzMzNdIC0gRXJsYW5nIHR1dG9yaWFsIGV4YW1wbGVzIGFyZSB1c2luZyBhIGRpZmZlcmVudCBwb3J0ICg5OTk5KQorICAgICogW1RIUklGVC00MzQzXSAtIENoYW5nZSBDSSBidWlsZHMgdG8gdXNlIG5vZGUuanMgOC54IExUUyBvbmNlIGF2YWlsYWJsZQorICAgICogW1RIUklGVC00MzQ1XSAtIENyZWF0ZSBhIGRvY2tlciBidWlsZCBlbnZpcm9ubWVudCB0aGF0IHVzZXMgdGhlIG1pbmltdW0gc3VwcG9ydGVkIGxhbmd1YWdlIGxldmVscworICAgICogW1RIUklGVC00MzQ2XSAtIEFsbG93IFpsaWIgdHJhbnNwb3J0IGZhY3RvcnkgdG8gd3JhcCBvdGhlciB0cmFuc3BvcnRzCisgICAgKiBbVEhSSUZULTQzNDhdIC0gUGVybCBIVFRQIENsaWVudCBjdXN0b20gSFRUUCBoZWFkZXJzCisgICAgKiBbVEhSSUZULTQzNTBdIC0gVXBkYXRlIG5ldGNvcmUgYnVpbGQgZm9yIGRvdG5ldCAyLjAgc2RrIGFuZCBtYWtlIGNyb3NzIHZhbGlkYXRpb24KKyAgICAqIFtUSFJJRlQtNDM1MV0gLSBVc2UgVHJhdmlzIENJIEJ1aWxkIFN0YWdlcyB0byBvcHRpbWl6ZSB0aGUgQ0kgYnVpbGQKKyAgICAqIFtUSFJJRlQtNDM1M10gLSBjYW5ub3QgcmVhZCB2aWEgdGhyaWZ0X3Byb3RvY29sIGF0IHNlcnZlciBzaWRlCisgICAgKiBbVEhSSUZULTQzNzhdIC0gYWRkIHNldCBzdG9wVGltZW91dFVuaXQgbWV0aG9kIHRvIFRUaHJlYWRQb29sU2VydmVyCisKKyMjIE5ldyBGZWF0dXJlCisgICAgKiBbVEhSSUZULTc1MF0gLSBDKysgQ29tcGlsZXIgVmlydHVhbCBGdW5jdGlvbiBPcHRpb24KKyAgICAqIFtUSFJJRlQtMjk0NV0gLSBJbXBsZW1lbnQgc3VwcG9ydCBmb3IgUnVzdCBsYW5ndWFnZQorICAgICogW1RIUklGVC0zODU3XSAtIHRocmlmdCBqczpub2RlIGNvbXBsaWVyIHN1cHBvcnQgYW4gb2JqZWN0IGFzIHBhcmFtZXRlciBub3QgYW4gaW5zdGFuY2Ugb2Ygc3RydWN0CisgICAgKiBbVEhSSUZULTM5MzNdIC0gUG9ydCBvZmZpY2lhbCBDIyAuTkVUIGxpYnJhcnkgZm9yIFRocmlmdCB0byBDIyAuTkVUIENvcmUgbGliYXJ5CisgICAgKiBbVEhSSUZULTQwMzldIC0gVXBkYXRlIG9mIEFwYWNoZSBUaHJpZnQgLk5ldCBDb3JlIGxpYiAKKyAgICAqIFtUSFJJRlQtNDExM10gLSBQcm92aWRlIGEgYnVmZmVyIHRyYW5zcG9ydCBmb3IgcmVhZGluZy93cml0aW5nIGluIG1lbW9yeSBieXRlIHN0cmVhbQorCisjIyBRdWVzdGlvbgorICAgICogW1RIUklGVC0yOTU2XSAtIGF1dG9jb25mIC0gcG9zc2libHkgdW5kZWZpbmVkIG1hY3JvIC0gQUNfUFJPR19CSVNPTgorICAgICogW1RIUklGVC00MjIzXSAtIEFkZCBzdXBwb3J0IHRvIHRoZSBpc1NlcnZpbmcoKSBtZXRob2QgZm9yIHRoZSBDKysgbGlicmFyeQorCisjIyBUYXNrCisgICAgKiBbVEhSSUZULTM2MjJdIC0gRml4IGRlcHJlY2F0ZWQgdXNlcyBvZiBzdGQ6OmF1dG9fcHRyCisgICAgKiBbVEhSSUZULTQwMjhdIC0gUGxlYXNlIHJlbW92ZSBTeXN0ZW0ub3V0LmZvcm1hdCBmcm9tIHRoZSBzb3VyY2UgY29kZQorICAgICogW1RIUklGVC00MTg2XSAtIEJ1aWxkIGFuZCB0ZXN0IHJ1c3QgY2xpZW50IGluIFRyYXZpcworCisjIyBUZXN0CisgICAgKiBbVEhSSUZULTQyNjRdIC0gUEhQIC0gU3VwcG9ydCBib3RoIHNoYXJlZCAmIHN0YXRpYyBsaW5raW5nIG9mIHNvY2tldHMgbGlicmFyeQorCisjIyBXaXNoCisgICAgKiBbVEhSSUZULTQzNDRdIC0gRGVmaW5lIGFuZCBtYWludGFpbiB0aGUgbWluaW11bSBsYW5ndWFnZSBsZXZlbCBmb3IgYWxsIGxhbmd1YWdlcyBpbiBvbmUgcGxhY2UKKworCQorVGhyaWZ0IDAuMTAuMAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjIEJ1ZworICAgICogW1RIUklGVC0xODQwXSAtIFRocmlmdCBHZW5lcmF0ZWQgQ29kZSBDYXVzZXMgR2xvYmFsIFZhcmlhYmxlIExlYWtzCisgICAgKiBbVEhSSUZULTE4MjhdIC0gbW9jX1RRVGNwU2VydmVyLmNwcCB3YXMgcmVtb3ZlZCBmcm9tIHNvdXJjZSB0cmVlIGJ1dCBpcyBpbiB0aHJpZnQtMC45LjAudGFyLmd6CisgICAgKiBbVEhSSUZULTE3OTBdIC0gY29jb2E6IER1cGxpY2F0ZSBpbnRlcmZhY2UgZGVmaW5pdGlvbiBlcnJvcgorICAgICogW1RIUklGVC0xNzc2XSAtIFRQaXBlU2VydmVyIHNob3VsZCBpbXBsZW1lbnQgImxpc3RlbiIsIHNvIHRoYXQgVFNlcnZlckV2ZW50SGFuZGxlciBwcmVTZXJ2ZSB3aWxsIHdvcmsgcmlnaHQKKyAgICAqIFtUSFJJRlQtMTM1MV0gLSBDb21waWxlciBkb2VzIG5vdCBjYXJlIGFib3V0IGJpbmFyeSBzdHJpbmdzCisgICAgKiBbVEhSSUZULTEyMjldIC0gUHl0aG9uIGZhc3RiaW5hcnkuYyBjYW4gbm90IGhhbmRsZSB1bmljb2RlIGFzIGdlbmVyYXRlZCBweXRob24gY29kZQorICAgICogW1RIUklGVC03NDldIC0gQysrIFRCdWZmZXJlZFRyYW5zcG9ydHMgZG8gbm90IGZsdXNoIHRoZWlyIGJ1ZmZlcnMgb24gZGVsZXRlCisgICAgKiBbVEhSSUZULTc0N10gLSBDKysgVFNvY2tldC0+Y2xvc2UgY2FsbHMgc2h1dGRvd24gYnJlYWtpbmcgZm9ya2VkIHBhcmVudCBwcm9jZXNzCisgICAgKiBbVEhSSUZULTczMl0gLSBzZXJ2ZXIgZXhpdHMgYWJub3JtYWxseSB3aGVuIGNsaWVudCBjYWxscyBzZW5kX3h4eCBmdW5jdGlvbiB3aXRob3V0IGNhbGxpbmcgcmVjdl94eHggZnVuY3Rpb24KKyAgICAqIFtUSFJJRlQtMzk0Ml0gLSBUU1NMU29ja2V0IGRvZXMgbm90IGhvbm9yIHNlbmQgYW5kIHJlY2VpdmUgdGltZW91dHMKKyAgICAqIFtUSFJJRlQtMzk0MV0gLSBXaW5YUCB2ZXJzaW9uIG9mIHRocmlmdF9wb2xsKCkgcmVsaWVzIG9uIHVuZGVmaW5lZCBiZWhhdmlvciBieSBwYXNzaW5nIGEgZGVzdHJ1Y3RlZCB2YXJpYWJsZSB0byBzZWxlY3QoKQorICAgICogW1RIUklGVC0zOTQwXSAtIFZpc3VhbCBTdHVkaW8gcHJvamVjdCBmaWxlIGZvciBjb21waWxlciBpcyBicm9rZW4KKyAgICAqIFtUSFJJRlQtMzk0M10gLSBDb3Zlcml0eSBTY2FuIGlkZW50aWZpZWQgc29tZSBoaWdoIHNldmVyaXR5IGRlZmVjdHMKKyAgICAqIFtUSFJJRlQtMzkyOV0gLSBQSFAgIm5zZ2xvYmFsIiBPcHRpb24gUmVzdWx0cyBpbiBTeW50YXggRXJyb3IgaW4gR2VuZXJhdGVkIENvZGUgKFRyYWlsaW5nIEJhY2tzbGFzaCkKKyAgICAqIFtUSFJJRlQtMzkzNl0gLSBDYW5ub3QgY29tcGlsZSAwLjEwLjAgZGV2ZWxvcG1lbnQgdGlwIHdpdGggVlMyMDEzIGFuZCBlYXJsaWVyIChzbnByaW50ZiwgdWludDMyX3QpCisgICAgKiBbVEhSSUZULTM5MzVdIC0gSW5jb3JyZWN0IHNraXBwaW5nIG9mIG1hcCBhbmQgc2V0CisgICAgKiBbVEhSSUZULTM5MjBdIC0gUnVieTogRW5zdXJpbmcgdGhhdCBIVFRQIGZhaWx1cmVzIHdpbGwgY2xlYXIgdGhlIGh0dHAgdHJhbnNwb3J0IG91dGJ1ZiB2YXIKKyAgICAqIFtUSFJJRlQtMzkxOV0gLSBDIyBUVExTU2VydmVyU29ja2V0IGRvZXMgbm90IHVzZSBjbGllbnRUaW1lb3V0CisgICAgKiBbVEhSSUZULTM5MTddIC0gQ2hlY2sgYmFja3BvcnRzLnNzbF9tYXRjaF9ob3N0bmFtZSBtb2R1bGUgdmVyc2lvbgorICAgICogW1RIUklGVC0zOTA5XSAtIEZpeCBjX2dsaWIgc3RhdGljIGxpYiBDTWFrZSBidWlsZAorICAgICogW1RIUklGVC0zOTA0XSAtIFR5cG8gaW4gbm9kZSB0dXRvcmlhbCBsZWFkcyB0byB3cm9uZyB0cmFuc3BvcnQgYmVpbmcgdXNlZAorICAgICogW1RIUklGVC0zODQ4XSAtIEFzIGFuIGltcGxlbWVudGVyIG9mIGEgcGVybCBzb2NrZXQgc2VydmVyLCBJIGRvIG5vdCB3YW50IHRvIGhhdmUgdG8gcmVtZW1iZXIgdG8gaWdub3JlIFNJR0NITEQgZm9yIGl0IHRvIHdvcmsgcHJvcGVybHkKKyAgICAqIFtUSFJJRlQtMzg0NF0gLSB0aHJpZnRfcHJvdG9jb2wgY2Fubm90IGNvbXBpbGUgaW4gNy4wLjcKKyAgICAqIFtUSFJJRlQtMzg0M10gLSBpbnRlZ2VyIGlzc3VlcyB3aXRoIEhheGUgUEhQIHRhcmdldHMgY2F1c2UgWmlnWmFnIGVuY29kaW5nIHRvIGZhaWwKKyAgICAqIFtUSFJJRlQtMzg0Ml0gLSBEYXJ0IGdlbmVyYXRlcyBpbmNvcnJlY3QgY29kZSBmb3IgYSBjb25zdCBzdHJ1Y3QKKyAgICAqIFtUSFJJRlQtMzg0MV0gLSBkYXJ0IGNvbXBhY3QgcHJvdG9jb2wgaW5jb3JyZWN0bHkgc2VyaWFsaXplcy9kZXNlcmlhbGl6ZWQgZG91YmxlcworICAgICogW1RIUklGVC0zNzA4XSAtIE5hbWVFcnJvcjogZ2xvYmFsIG5hbWUgJ1RQcm90b2NvbCcgaXMgbm90IGRlZmluZWQKKyAgICAqIFtUSFJJRlQtMzcwNF0gLSAiVENvbm5lY3RlZENsaWVudCBkaWVkOiBDb3VsZCBub3QgcmVmaWxsIGJ1ZmZlciIgbWVzc2FnZSBzaG93biB3aGVuIHVzaW5nIEhUVFAgU2VydmVyCisgICAgKiBbVEhSSUZULTM2NzhdIC0gRml4IGphdmFkb2MgZXJyb3JzIG9uIEpESyA4CisgICAgKiBbVEhSSUZULTMwMTRdIC0gQXBwVmV5b3Igc3VwcG9ydAorICAgICogW1RIUklGVC0yOTk0XSAtIE5vZGUuanMgVEpTT05Qcm90b2NvbCBjYW5ub3QgYmUgdXNlZCBmb3Igb2JqZWN0IHNlcmlhbGl6YXRpb24uCisgICAgKiBbVEhSSUZULTI5NzRdIC0gd3JpdGVUb1BhcmNlbCB0aHJvd3MgTlBFIGZvciBvcHRpb25hbCBlbnVtIGZpZWxkcworICAgICogW1RIUklGVC0yOTQ4XSAtIFB5dGhvbiBUSlNPTlByb3RvY29sIGRvZXNuJ3QgaGFuZGxlIHN0cnVjdHMgd2l0aCBiaW5hcnkgZmllbGRzIGNvbnRhaW5pbmcgaW52YWxpZCB1bmljb2RlLgorICAgICogW1RIUklGVC0yODQ1XSAtIENoaWxkU2VydmljZS5QbG86IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkKKyAgICAqIFtUSFJJRlQtMzI3Nl0gLSBCaW5hcnkgZGF0YSBkb2VzIG5vdCBkZWNvZGUgY29ycmVjdGx5IHVzaW5nIHRoZSBUSlNPTlByb3RvY29sIHdoZW4gdGhlIGJhc2U2NCBlbmNvZGVkIGRhdGEgaXMgcGFkZGVkLgorICAgICogW1RIUklGVC0zMjUzXSAtIFVzaW5nIGxhdGVzdCB2ZXJzaW9uIG9mIEQgZ2l2ZXMgZGVwcmVjYXRpb24gbm90aWNlcworICAgICogW1RIUklGVC0yODgzXSAtIFRUd2lzdGVkLnB5LCBkdXJpbmcgQ29ubmVjdGlvbkxvc3QgcHJvY2Vzc2luZzogZXhjZXB0aW9ucy5SdW50aW1lRXJyb3I6IGRpY3Rpb25hcnkgY2hhbmdlZCBzaXplIGR1cmluZyBpdGVyYXRpb24KKyAgICAqIFtUSFJJRlQtMjAxOV0gLSBXcml0aW5nIG9uIGEgZGlzY29ubmVjdGVkIHNvY2tldCBvbiBNYWMgY2F1c2VzIFNJRyBQSVBFCisgICAgKiBbVEhSSUZULTIwMjBdIC0gVGhyaWZ0IGxpYnJhcnkgaGFzIHNvbWUgZW1wdHkgZmlsZXMgdGhhdCBoYXZlbid0IHJlYWxseSBiZWVuIGRlbGV0ZWQKKyAgICAqIFtUSFJJRlQtMjA0OV0gLSBHbyBjb21waWxlciBkb2Vzbid0IGJ1aWxkIG9uIG5hdGl2ZSBXaW5kb3dzCisgICAgKiBbVEhSSUZULTIwMjRdIC0gVFNlcnZlci5jcHAgd2FybnMgb24gNjQtYml0IHBsYXRmb3JtcyBhYm91dCB0cnVuY2F0aW5nIGFuIHJsaW1fdCBpbnRvIGFuIGludAorICAgICogW1RIUklGVC0yMDIzXSAtIGdldHRpbWVvZmRheSBpbXBsZW1lbnRhdGlvbiBvbiBXaW5kb3dzIGVycm9ycyB3aGVuIG5vIHRpbWUgem9uZSBpcyBwYXNzZWQgaW4uCisgICAgKiBbVEhSSUZULTIwMjJdIC0gQ29CIGFuZCBkZW5zZSBjb2RlIGdlbmVyYXRpb24gc3RpbGwgdXNlcyBUUjEgYmluZCwgZXZlbiB0aG91Z2ggdGhhdCBkb2Vzbid0IHdvcmsgd2l0aCBjbGFuZworICAgICogW1RIUklGVC0yMDI3XSAtIE1pbm9yIDY0LWJpdCBhbmQgTk9NSU5NQVggaXNzdWVzIGluIEMrKyBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTIxNTZdIC0gVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgaXMgdGhyb3dpbmcgZXhjZXB0aW9ucyB3aXRoIG1pc2xlYWRpbmcgaW5mb3JtYXRpb24KKyAgICAqIFtUSFJJRlQtMjE1NF0gLSBNaXNzaW5nIDxvcGVyYXRvciBib2R5CisgICAgKiBbVEhSSUZULTIxNDhdIC0gVE5vbmJsb2NraW5nTXVsdGlGZXRjaENsaWVudCBpbXBvcnRzIGxvZzRqCisgICAgKiBbVEhSSUZULTIxMDNdIC0gW3B5dGhvbl0gU3VwcG9ydCBmb3IgU1NMIGNlcnRpZmljYXRlcyB3aXRoIFN1YmplY3QgQWx0ZXJuYXRpdmUgTmFtZXMKKyAgICAqIFtUSFJJRlQtMTkzMV0gLSBTZW5kaW5nIGEgZnJhbWUgc2l6ZSBvZiB6ZXJvIHRvIGEgVE5vbmJsb2NraW5nU2VydmVyIGNhdXNlcyBhbiBhc3NlcnRpb24gZmFpbHVyZQorICAgICogW1RIUklGVC0xNzUxXSAtIGRlZmluaXRpb24gb2YgaW5jcmVhc2VfbWF4X2ZkcyBkb2Vzbid0IGNvbXBpbGUgd2hlbiBIQVZFX1NZU19SRVNPVVJDRV9IIGlzIG5vdCBkZWZpbmVkCisgICAgKiBbVEhSSUZULTE1MjJdIC0gVFNlcnZlclNvY2tldCBwb3RlbnRpYWwgbWVtb3J5IGxlYWsgd2l0aCBhZGRyaW5mbyAqcmVzMAorICAgICogW1RIUklGVC0xNTQ3XSAtIFByb2JsZW1zIGJ1aWxkaW5nIGFnYWluc3Qgc3RhdGljIGxpYmV2ZW50CisgICAgKiBbVEhSSUZULTE1NDVdIC0gR2VuZXJhdGVkIGphdmFzY3JpcHQgY29kZSB1c2VzICJmb3IgaW4iIGZvciBsb29waW5nIG92ZXIgYXJyYXlzCisgICAgKiBbVEhSSUZULTE0ODddIC0gTmFtZXNwYWNlIHByb2JsZW0sIGNvbXBpbGUgZmFpbHMgb24gZ2VuZXJhdGVkIGNvZGUKKyAgICAqIFtUSFJJRlQtMTQ3Ml0gLSBDb25maWd1cmF0aW9uIGNvbmZsaWN0cyB3aXRoIGJvb3N0IHBsYXRmb3JtIGluY2x1ZGUgaGVhZGVyCisgICAgKiBbVEhSSUZULTZdIC0gVGhyaWZ0IGxpYnJhcmllcyBhbmQgY29tcGlsZXIgbGFjayB2ZXJzaW9uIG51bWJlcgorICAgICogW1RIUklGVC0xNjgwXSAtIG1ha2UgaW5zdGFsbCByZXF1aXJlcyBHTlUgbWFrZQorICAgICogW1RIUklGVC0zODY5XSAtIERhcnQgVHV0b3JpYWwgYnVpbGQgZmFpbHMgd2l0aCBFcnJvciA2NSBhdCAicHViIGdldCIKKyAgICAqIFtUSFJJRlQtMzg2MV0gLSBUcmF2aXMgQ0kgYnVpbGRzIGFyZSB0aW1pbmcgb3V0IC0gQysrVFNlcnZlckludGVncmF0aW9uVGVzdCBhcHBlYXJzIHRvIGJlIGhhbmdpbmcKKyAgICAqIFtUSFJJRlQtMzg1NV0gLSBJbiB0aGUgZ28gc2ltcGxlIHNlcnZlciwgaWYgU3RvcCgpIGlzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBpdCBoYW5ncworICAgICogW1RIUklGVC0zODg1XSAtIFBIUDogRXJyb3Igd2hlbiByZWFkSTY0IGluIFRDb21wYWN0UHJvdG9jb2wKKyAgICAqIFtUSFJJRlQtMzg4M10gLSBHbyBUZXN0QWxsQ29ubmVjdGlvbiBjYW4gZmFpbCB3aXRoIHBvcnQgOTA5MCBjb2xsaXNpb24KKyAgICAqIFtUSFJJRlQtMzg4NF0gLSBGaXggRXJsYW5nIGNvbXBhY3QgcHJvdG9jb2wgZG91YmxlIGVuZGlhbmVzcyBhbmQgYm9vbGVhbiBsaXN0CisgICAgKiBbVEhSSUZULTM4ODBdIC0gRXJsYW5nIENvbXBhY3QgcHJvdG9jb2wgLSBib29sZWFuIHZhbHVlcyBpbnZlcnRlZAorICAgICogW1RIUklGVC0zODc5XSAtIFVuZGVmaW5lZCBldmFsdWF0aW9uIG9yZGVyIGNhdXNlcyBpbmNvcnJlY3QgcHJvY2Vzc2luZyBpbiB0aGUgQysrIGxpYnJhcnkgSlNPTiBwcm90b2NvbAorICAgICogW1RIUklGVC0zODUxXSAtIEdvbGFuZyB0aHJpZnQgY29udGludWFsbHkgYWRkcyB0aGUgeC90aHJpZnQgY29udGVudCB0eXBlIAorICAgICogW1RIUklGVC0zODUwXSAtIEFsbCBhcGFjaGUgYnVpbGRzIGFyZSBmYWlsaW5nIHdoZW4gaW5pdGlhdGVkIGZyb20gYSBnaXRodWIgcHVsbCByZXF1ZXN0CisgICAgKiBbVEhSSUZULTM4MzddIC0gVGhpZnQgMC45LjMgY2FuJ3QgYmUgYnVpbGQgd2l0aCBRdWlja0NoZWNrIDIuOC4yIGFuZCB1bm9yZGVyZWQtY29udGFpbmVycyAwLjIuNgorICAgICogW1RIUklGVC0zODMxXSAtIGJ1aWxkIG9mIHRlc3QvY3BwL3NyYy9UZXN0Q2xpZW50LmNwcCBmYWlscyB3aXRoIG5ld2VyIGdjYyBvbiBwbGF0Zm9ybXMgd2l0aCB1bnNpZ25lZCBjaGFyIGR1ZSB0byBuYXJyb3dpbmcgY29udmVyc2lvbnMKKyAgICAqIFtUSFJJRlQtMzgyN10gLSBwaHAgQ29tcGFjdFByb3RvY29sIHJlYWRJNjQgZnVuY3Rpb24gaGFzIGJ1Zywgd2hlbiB2YWx1ZSBoYXMgMzJiaXQgfjY0Yml0LCBFeGFtcGxl77yadmFsdWU9MTQ2MTU2MzQ1NzAwMCAKKyAgICAqIFtUSFJJRlQtMzgyNV0gLSBKYXZhc2NyaXB0IHRlc3QgZGVwZW5kZW5jeSBpcyBubyBsb25nZXIgYXZhaWxhYmxlCisgICAgKiBbVEhSSUZULTM4MTRdIC0gRml4IGNvbnRlbnRpb24gaW4gVE5vbmJsb2NraW5nU2VydmVyVGVzdAorICAgICogW1RIUklGVC0zNzkzXSAtIEFwcHZleW9yIGJ1aWxkcyByZWZlcmVuY2UgYW4gYW50IHZlcnNpb24gdGhhdCBpcyBubyBsb25nZXIgdGhlcmUKKyAgICAqIFtUSFJJRlQtMzc4Nl0gLSBOb2RlLmpzIFRMUyBlbWl0cyAnY29ubmVjdCcgYmVmb3JlIGNvbm5lY3Rpb24gaXMgcmVhZHkKKyAgICAqIFtUSFJJRlQtMzc4MF0gLSBGaXggZGFydCBpbnQ2NCB1c2FnZSB3aGVuIGNvbXBpbGVkIHRvIGpzCisgICAgKiBbVEhSSUZULTM3ODldIC0gTm9kZS5qcyBsYWNrcyBhYmlsaXR5IHRvIGRlc3Ryb3kgY29ubmVjdGlvbgorICAgICogW1RIUklGVC0zNzk2XSAtIFRoZXJlJ3Mgbm8gLS1kYmcgZm9yIGRoX3N0cmlwLCBtYXliZSBzb21lb25lIGhhcyBtaXN0YWtlbiB0aGlzIGZvciAtLWRiZy1wYWNrYWdlLgorICAgICogW1RIUklGVC0zNzk1XSAtIEdlbmVyYXRlZCBoYXNoVmFsdWUgbWV0aG9kIGluIFN3aWZ0IHdpbGwgb3ZlcmZsb3cKKyAgICAqIFtUSFJJRlQtMzc5MF0gLSBGaXggRGVscGhpIG5hbWVkIHBpcGUgY2xpZW50IHRvIHVzZSB0aW1lb3V0IGV2ZW4gd2hlbiBwaXBlIGRvZXNuJ3QgeWV0IGV4aXN0CisgICAgKiBbVEhSSUZULTM3ODddIC0gTm9kZS5qcyBDb25uZWN0aW9uIG9iamVjdCBkb2Vzbid0IGhhbmRsZSBlcnJvcnMgY29ycmVjdGx5CisgICAgKiBbVEhSSUZULTM3OTFdIC0gRGVscGhpIHBpcGUgY2xpZW50IG1heSBmYWlsIGV2ZW4gaW4gYSBub24tZXJyb3IgY29uZGl0aW9uCisgICAgKiBbVEhSSUZULTM3NzFdIC0gVEJ1ZmZlcmVkVHJhbnNwb3J0IGdldHMgaW4gaW52YWxpZCBzdGF0ZSBvbiByZWFkL3dyaXRlIGVycm9ycworICAgICogW1RIUklGVC0zNzY0XSAtIFBIUCAibWFrZSBpbnN0YWxsIiBkb2VzIG5vdCBpbnN0YWxsIFRNdWx0aXBsZXhlZFByb3RvY29sLnBocCBub3IgVFNpbXBsZUpTT05Qcm90b2NvbC5waHAKKyAgICAqIFtUSFJJRlQtMzc2OF0gLSBUVGhyZWFkZWRTZXJ2ZXIgbWF5IGNyYXNoIGlmIGl0IGlzIGRlc3Ryb3llZCBpbW1lZGlhdGVseSBhZnRlciBpdCByZXR1cm5zIGZyb20gc2VydmUoKTsgVFRocmVhZGVkU2VydmVyIGRpc2Nvbm5lY3RzIGNsaWVudHMKKyAgICAqIFtUSFJJRlQtMzc2NV0gLSBtZW1vcnkgbGVhayBpbiBweXRob24gY29tcGFjdCBwcm90b2NvbCBleHRlbnNpb24KKyAgICAqIFtUSFJJRlQtMzc1OF0gLSBUQXBwbGljYXRpb25FeGNlcHRpb246OmdldFR5cGUgYW5kIFRQcm90b2NvbEV4Y2VwdGlvbjo6Z2V0VHlwZSBzaG91bGQgYmUgY29uc3QKKyAgICAqIFtUSFJJRlQtMzc2M10gLSBGaXggc2VyaWFsaXphdGlvbiBvZiBpNjQgbGFyZ2VyIHRoYW4gMl41MyBmb3IgYnJvd3NlcmlmeQorICAgICogW1RIUklGVC0zNzU5XSAtIHJlcXVpcmVkIGZpZWxkcyB0aGF0IGFyZSBuaWwgYXJlIHNpbGVudGx5IGlnbm9yZWQgb24gd3JpdGUKKyAgICAqIFtUSFJJRlQtMzc1M10gLSBUU2VydmVyRnJhbWV3b3JrOjpzdG9wIG1heSBmYWlsIHRvIGludGVycnVwdCBjb25uZWN0ZWQgY2xpZW50cworICAgICogW1RIUklGVC0zNzU1XSAtIFREZWJ1Z1Byb3RvY29sOjp3cml0ZVN0cmluZyBoaXRzIGFzc2VydCBpbiBpc3ByaW50IG9uIFdpbmRvd3Mgd2l0aCBkZWJ1ZyBDUlQKKyAgICAqIFtUSFJJRlQtMzc1MV0gLSBDb21waWxlciBhbGxvd3MgZmllbGQgaWRzIHRoYXQgYXJlIHRvbyBsYXJnZSBmb3IgZ2VuZXJhdGVkIGNvZGUKKyAgICAqIFtUSFJJRlQtMzc0OF0gLSBOb2RlLmpzIERlc2VyaWFsaXphdGlvbiBvZiBsaXN0cyBvZiBsaXN0cyBpcyBicm9rZW4KKyAgICAqIFtUSFJJRlQtMzc2MF0gLSBGaXggaW5zdGFsbCBwYXRocyBldGMgb2YgZGViaWFuIHBhY2thZ2VzIGZvciBweSBhbmQgcGVybAorICAgICogW1RIUklGVC0zNzU3XSAtIEZpeCB2YXJpb3VzIGJ1aWxkIHdhcm5pbmdzIG9uIFdpbmRvd3Mgd2l0aCBWUzIwMTUgY29tcGlsZXIKKyAgICAqIFtUSFJJRlQtMzc1MF0gLSBOU0NvcHlpbmcgY29weVdpdGhab25lOiBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBjaGVjayBpc1NldAorICAgICogW1RIUklGVC0zNzQ3XSAtIER1cGxpY2F0ZSBub2RlLmpzIGJ1aWxkIG9uIFRyYXZpcy1DSQorICAgICogW1RIUklGVC0zNzQ0XSAtIFRoZSBwcmVjaXNpb24gc2hvdWxkIGJlIDE3ICgxNiBiaXRzIG5lZWQgYWZ0ZXIgZG90KSBhZnRlciBkb3QgZm9yIGRvdWJsZSB0eXBlLgorICAgICogW1RIUklGVC0zNzQxXSAtIGhheGUgdGVzdCBpcyBicm9rZW4KKyAgICAqIFtUSFJJRlQtMzczOV0gLSBEZXByZWNhdGlvbiB3YXJuaW5nIGluIGNvZGVnZW4vYmFzZS5kCisgICAgKiBbVEhSSUZULTM3MzVdIC0gSlNPTiBwcm90b2NvbCBsZWZ0IGluIGluY29ycmVjdCBzdGF0ZSB3aGVuIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZHVyaW5nIHJlYWQgb3Igd3JpdGUgb3BlcmF0aW9ucworICAgICogW1RIUklGVC0zNzM0XSAtIFRvIGNvbXBhcmUgdHdvIHN0cmluZyBhcyBsb3dlcmNhc2UuCisgICAgKiBbVEhSSUZULTM3NDNdIC0gSmF2YSBKU09OIHByb3RvY29sIGxlZnQgaW4gaW5jb3JyZWN0IHN0YXRlIHdoZW4gYW4gZXhjZXB0aW9uIGlzIHRocm93biBkdXJpbmcgcmVhZCBvciB3cml0ZSBvcGVyYXRpb25zCisgICAgKiBbVEhSSUZULTM3MzFdIC0gUGVybCBtdWx0aXBsZXggdGVzdCBpcyBmbGFreQorICAgICogW1RIUklGVC0zNzI5XSAtIFJlc3RyaWN0IHJha2UgdmVyc2lvbgorICAgICogW1RIUklGVC0zNzI3XSAtIEluY29ycmVjdCByZXF1aXJlIHBhdGhzIGluIE5vZGUuanMgdHV0b3JpYWwKKyAgICAqIFtUSFJJRlQtMzcyM10gLSBGaXggTHVhIGluY2x1ZGUgcGF0aAorICAgICogW1RIUklGVC0zNzIyXSAtIEZpeCBjZXJ0IHBhdGggaW4gQysrIGNyb3NzIHRlc3RzIGZvciBub24tTGludXggcGxhdGZvcm0KKyAgICAqIFtUSFJJRlQtMzcyNl0gLSBGaXggaW5jb3JyZWN0IGNvbmRpdGlvbmFsIGluIFRNdWx0aXBsZXhlZFByb2Nlc3Nvci5weQorICAgICogW1RIUklGVC0zNzI1XSAtIFNraXAgYSBmbGFreSBjcm9zcyB0ZXN0IGVudHJ5IChkLWRhcnQgY29tcGFjdCBmcmFtZWQtaXApCisgICAgKiBbVEhSSUZULTM3MjRdIC0gRml4IGluY29ycmVjdCB0aW1ldmFsIGNvbnZlcnNpb24gaW4gbGliZXZlbnQuZAorICAgICogW1RIUklGVC0zNzIxXSAtIENMT05FIC0gd2h5IG5vdCBhZGQgdW5pY29kZSBzdHJpbmdzIHN1cHBvcnQgdG8gcHl0aG9uIGRpcmVjdGx5PworICAgICogW1RIUklGVC0zNzIwXSAtIFRUY3BTb2NrZXRTdHJlYW1JbXBsLlJlYWQoKSByZXR1cm5zIDAgaWYgbm90IGFsbCByZXF1ZXN0ZWQgYnl0ZXMgY291bGQgYmUgcmVhZAorICAgICogW1RIUklGVC0zNzE5XSAtIERhcnQgZ2VuZXJhdG9yIHNob3VsZCB1c2UgbG93ZXJDYW1lbENhc2UgZm9yIHNlcnZpY2UgbmFtZXMKKyAgICAqIFtUSFJJRlQtMzkwMl0gLSBUU29ja2V0Lm9wZW4gdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgKiBbVEhSSUZULTM5MDFdIC0gVEZyYW1lZFRyYW5zcG9ydC5vcGVuIHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICogW1RIUklGVC0zODkzXSAtIENvbW1hbmQgaW5qZWN0aW9uIGluIGZvcm1hdF9nb19vdXRwdXQKKyAgICAqIFtUSFJJRlQtMzgwN10gLSBTd2lmdCBjb21waWxlciBkb2VzIG5vdCBlc2NhcGUgcmVzZXJ2ZWQgd29yZHMKKyAgICAqIFtUSFJJRlQtMzc5OF0gLSBUSHR0cENsaWVudCBkb2VzIG5vdCB1c2UgcHJveHkgZnJvbSBodHRwX3Byb3h5LCBodHRwc19wcm94eSBlbnZpcm9ubWVudCB2YXJpYWJsZXMKKyAgICAqIFtUSFJJRlQtMzgwOV0gLSB3cm9uZy91bnVzZWQgQklOQVJZIHR5cGUgY29kZQorICAgICogW1RIUklGVC0zODA2XSAtIFN3aWZ0IGdlbmVyYXRvciBkb2VzIG5vdCBoYW5kbGUgc2VsZi1yZWZlcnJpbmcgc3RydWN0cworICAgICogW1RIUklGVC0zODA1XSAtIEdvbGFuZyBzZXJ2ZXIgc3VzY2VwdGlibGUgdG8gbWVtb3J5IHNwaWtlIGZyb20gbWFsZm9ybWVkIG1lc3NhZ2UKKyAgICAqIFtUSFJJRlQtMzc5N10gLSBHZW5lcmF0ZWQgRGVscGhpIHByb2Nlc3NvciBzaG91bGRuJ3QgZXJyb3Igb3V0IG9uIHRpbWVkIG91dCBleGNlcHRpb25zCisgICAgKiBbVEhSSUZULTM4MTNdIC0gQXBwdmV5b3IgYnVpbGRzIHJlZmVyZW5jZSBhbiBvcGVuc3NsIHZlcnNpb24gdGhhdCBpcyBubyBsb25nZXIgdGhlcmUKKyAgICAqIFtUSFJJRlQtMzY1OF0gLSBNaXNzaW5nIGZpbGUgaW4gVEhSSUZULTM1OTkKKyAgICAqIFtUSFJJRlQtMzY0OV0gLSBQeXRob24gVFNhc2xDbGllbnRUcmFuc3BvcnQgaW5pdGlhbGl6ZXMgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpbmNvcnJlY3RseQorICAgICogW1RIUklGVC0zNjUwXSAtIGluY29ycmVjdCB1bmlvbiBzZXJpYWxpemF0aW9uIAorICAgICogW1RIUklGVC0zNzEzXSAtIGxpYi9kL3Rlc3QvdGhyaWZ0X3Rlc3RfcnVubmVyLnNoIGlzIGZsYWt5IG9uIEplbmtpbnMKKyAgICAqIFtUSFJJRlQtMzY2OF0gLSByYW5nZSBjaGVjayBlcnJvciBpbiBjb21wYWN0IHByb3RvY29sCisgICAgKiBbVEhSSUZULTM2NjNdIC0gQ01ha2UgY3BwIHRlc3QgZmFpbHMgdG8gYnVpbGQgb24gc3lzdGVtIHdpdGhvdXQgemxpYgorICAgICogW1RIUklGVC0zNzEyXSAtIFRUb3JuYWRvU2VydmVyIGNhbm5vdCBoYW5kbGUgSVB2NiBhZGRyZXNzCisgICAgKiBbVEhSSUZULTM3MTBdIC0gRGFydCBnZW5lcmF0b3IgZG9lcyBub3QgY2FtZWwgY2FzZSBDb25zdGFudHMgY2xhc3MgbmFtZXMKKyAgICAqIFtUSFJJRlQtMzY5N10gLSBEYXJ0IGdlbmVyYXRvciBkb2VzIG5vdCBuYW1lIGltcG9ydHMKKyAgICAqIFtUSFJJRlQtMzY5MF0gLSBXb3JrIGFyb3VuZCBkb2NrZXIgaW1hZ2UgYnVpbGQgZmFpbHVyZXMgb24gVHJhdmlzLUNJCisgICAgKiBbVEhSSUZULTM2ODldIC0gdGhyaWZ0X3JlY29ubmVjdGluZ19jbGllbnQgc3RhcnQgZmFpbGVkIHdoZW4gc2VydmVyIGlzIG5vdCBhdmFpbGFibGUKKyAgICAqIFtUSFJJRlQtMzY5NV0gLSBGaXggRCB0ZXN0IHNjcmlwdHMKKyAgICAqIFtUSFJJRlQtMzY3NV0gLSBVbmlvbiBpcyBub3Qgc2VyaWFsaXplZCBjb3JyZWN0bHkgYnkgVGhyaWZ0IEMgR2xpYgorICAgICogW1RIUklGVC0zNjczXSAtIEFQSSBmYWlscyB3aXRoIHN0ZDo6ZXhjZXB0aW9uIGFmdGVyIGEgdGltZW91dCBvY2N1cmVkIGluIGVhcmxpZXIgYW55IEFQSSBjYWxsCisgICAgKiBbVEhSSUZULTM3MDldIC0gQ29tbWVudCBzeW50YXggY2FuIHByb2R1Y2UgYnJva2VuIGNvZGUKKyAgICAqIFtUSFJJRlQtMzcwNV0gLSBHbyBtYXAgaGFzIGluY29ycmVjdCB0eXBlcyB3aGVuIHVzZWQgd2l0aCBmb3J3YXJkLWRlZmluZWQgdHlwZXMKKyAgICAqIFtUSFJJRlQtMzcwMl0gLSBGaXggY3Jvc3MgdGVzdHMgZm9yIERhcnQgY29tcGFjdCBwcm90b2NvbCAoMyBmYWlsaW5nKQorICAgICogW1RIUklGVC0zNjgzXSAtIEJhZFlpZWxkRXJyb3IgaW4gdGhyaWZ0IHB5OnRvcm5hZG8gc2VydmVyCisgICAgKiBbVEhSSUZULTM2ODJdIC0gRG8gbm90IHJldXNlIHJlZnVzZWQgc29ja2V0cyBpbiB0ZXN0IHNjcmlwdHMKKyAgICAqIFtUSFJJRlQtMzY4MV0gLSBGaXggRGFydCB0dXRvcmlhbCBidWlsZAorICAgICogW1RIUklGVC0zNjgwXSAtIEphdmEgYXN5bmMgcHJvY2Vzc29yIGZhaWxzIHRvIG5vdGlmeSBlcnJvcnMgdG8gY2xpZW50cworICAgICogW1RIUklGVC0zNzE0XSAtIFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24gaXMgbm90IGRlZmluZWQgaW4ganMvc3JjL3RocmlmdC5qcworICAgICogW1RIUklGVC0zNjg4XSAtIEZpeCBzb2NrZXQgYmluZCBmYWlsdXJlIGRldGVjdGlvbiBvZiBjcm9zcyB0ZXN0CisgICAgKiBbVEhSSUZULTM2NDFdIC0gUnVieSBjbGllbnQgc2hvdWxkIHRyeSB0byBjb25uZWN0IHRvIGV2ZXJ5IHJlc3VsdCBvZiBnZXRhZGRyaW5mbworICAgICogW1RIUklGVC0zNjM1XSAtIEQgdHJhbnNwb3J0X3Rlc3QgaXMgZmxha3kgb24gSmVua2lucyBhbmQgVHJhdmlzCisgICAgKiBbVEhSSUZULTM2MThdIC0gUHl0aG9uIFRTU0xTb2NrZXQgZGVwcmVjYXRpb24gbWVzc2FnZSBzaG91bGQgcHJpbnQgY2FsbGVyJ3MgbG9jYXRpb24KKyAgICAqIFtUSFJJRlQtMzE0NV0gLSBKU09OIHByb3RvY29sIGRvZXMgbm90IGhhbmRsZSBib29sIGFuZCBlbXB0eSBjb250YWluZXJzIGNvcnJlY3RseQorICAgICogW1RIUklGVC0zMTU4XSAtIFRCYXNlPFQsRj4jZGVlcENvcHkgc2hvdWxkIHJldHVybiBUCisgICAgKiBbVEhSSUZULTMxNTddIC0gVEJhc2Ugc2lnbmF0dXJlIHNob3VsZCBiZSBUQmFzZTxUIGV4dGVuZHMgVEJhc2U8VCxGPiwgRiBleHRlbmRzIFRGaWVsZElkRW51bT4KKyAgICAqIFtUSFJJRlQtMzE1Nl0gLSBOb2RlIFRMUzogc2VydmVyIGV4ZWN1dGVzIHByb2Nlc3NpbmcgbG9naWMgdHdvIGZ1bGwgdGltZXMKKyAgICAqIFtUSFJJRlQtMzE1NF0gLSB0dXRvcmlhbC9weS50b3JuYWRvIHRocm93IEVPRiBleGNlcHRpb24KKyAgICAqIFtUSFJJRlQtMzA2M10gLSBDKysgYnVpbGQgLVd1bnVzZWQtcGFyYW1ldGVyIHdhcm5pbmdzIG9uIHByb2Nlc3Nvcl90ZXN0LCBUcmFuc3BvcnRUZXN0CisgICAgKiBbVEhSSUZULTMwNTZdIC0gQWRkIHN0cmluZy9jb2xsZWN0aW9uIGxlbmd0aCBsaW1pdHMgZm9yIFB5dGhvbiBwcm90b2NvbCByZWFkZXJzCisgICAgKiBbVEhSSUZULTMyMzddIC0gRml4IFROYW1lZFBpcGVTZXJ2ZXI6OmNyZWF0ZU5hbWVkUGlwZSBtZW1vcnkgbGVhaworICAgICogW1RIUklGVC0zMjMzXSAtIEZpeCBDKysgVGhyZWFkTWFuYWdlcjo6SW1wbDo6cmVtb3ZlV29ya2VyIHdvcmtlciBqb2luCisgICAgKiBbVEhSSUZULTMyMzJdIC0gQ2Fubm90IGRlc2VyaWFsaXplIGpzb24gbWVzc2FnZXMgY3JlYXRlZCB3aXRoIGZpZWxkTmFtZXNBc1N0cmluZyAKKyAgICAqIFtUSFJJRlQtMzIwNl0gLSBGaXggVmlzdWFsIFN0dWRpbyBidWlsZCBmYWlsdXJlIGR1ZSAncHRocmVhZF9zZWxmJzogaWRlbnRpZmllciBub3QgZm91bmQKKyAgICAqIFtUSFJJRlQtMzIwMF0gLSBKUyBhbmQgbm9kZWpzIGRvIG5vdCBlbmNvZGUgSlNPTiBwcm90b2NvbCBiaW5hcnkgZmllbGRzIGFzIGJhc2U2NAorICAgICogW1RIUklGVC0zMTk5XSAtIEV4Y2VwdGlvbiBmaWVsZCBoYXMgYmFzaWMgbWV0YWRhdGEKKyAgICAqIFtUSFJJRlQtMzE4Ml0gLSBURnJhbWVkVHJhbnNwb3J0IGlzIGluIGFuIGludmFsaWQgc3RhdGUgYWZ0ZXIgZnJhbWUgc2l6ZSBleGNlcHRpb24KKyAgICAqIFtUSFJJRlQtMjUzNl0gLSBuZXcgVFNvY2tldCwgdW5pbml0aWFsaXNlZCB2YWx1ZSByZXBvcnRlZCBieSB2YWxncmluZAorICAgICogW1RIUklGVC0yNTI3XSAtIEFwYWNoZSBUaHJpZnQgSURMIENvbXBpbGVyIGNvZGUgZ2VuZXJhdGVkIGZvciBOb2RlLmpzIHNob3VsZCBiZSBqc2hpbnQgY2xlYW4KKyAgICAqIFtUSFJJRlQtMjUxOV0gLSAicHJvY2Vzc29yIiBjbGFzcyBpcyBub3QgYmVpbmcgZ2VuZXJhdGVkCisgICAgKiBbVEhSSUZULTI0MzFdIC0gVEZpbGVUcmFuc3BvcnRUZXN0IGZhaWxzIHdpdGggImNoZWNrIGRlbHRhIDwgWFhYIGZhaWxlZCIKKyAgICAqIFtUSFJJRlQtMjcwOF0gLSBFcmxhbmcgbGlicmFyeSBkb2VzIG5vdCBzdXBwb3J0ICJvbmV3YXkiIG1lc3NhZ2UgdHlwZQorICAgICogW1RIUklGVC0zMzc3XSAtIERlZXAgY29weSBpcyBhY3R1YWxseSBzaGFsbG93IHdoZW4gdXNpbmcgdHlwZWRlZiBtZW1iZXJzCisgICAgKiBbVEhSSUZULTMzNzZdIC0gQyMgYW5kIFB5dGhvbiBKU09OIHByb3RvY29sIGRvdWJsZSB2YWx1ZXMgbG9zZSBwcmVjaXNpb24KKyAgICAqIFtUSFJJRlQtMzM3M10gLSBWYXJpb3VzIGZpeGVzIGZvciBjcm9zcyB0ZXN0IHNlcnZlcnMgYW5kIGNsaWVudHMKKyAgICAqIFtUSFJJRlQtMzM3MF0gLSBlcnJubyBleHRlcm4gdmFyaWFibGUgcmVkZWZpbmVkLiBOb3QgY29tcGlsaW5nIGZvciBBbmRyb2lkCisgICAgKiBbVEhSSUZULTMzNzldIC0gIFBvdGVudGlhbCBvdXQgb2YgcmFuZ2UgcGFuaWMgaW4gR28gSlNPTiBwcm90b2NvbHMKKyAgICAqIFtUSFJJRlQtMzM3MV0gLSBBYnN0cmFjdCBuYW1lc3BhY2UgVW5peCBkb21haW4gc29ja2V0cyBicm9rZW4gaW4gQysrCisgICAgKiBbVEhSSUZULTMzODBdIC0gbm9kZWpzOiAwLjkuMiAtPiAwLjkuMyB1cGdyYWRlIGJyZWFrcyBQcm90b2NvbCBhbmQgVHJhbnNwb3J0IHJlcXVpcmVzCisgICAgKiBbVEhSSUZULTMzNjddIC0gRml4IGJhZCBsaW5rcyB0byBjb2Rpbmdfc3RhbmRhcmRzLm1kICM2MzQgCisgICAgKiBbVEhSSUZULTM0MDFdIC0gTmVzdGVkIGNvbGxlY3Rpb25zIGVtaXQgT2JqZWN0aXZlLUMgY29kZSB0aGF0IGNhbm5vdCBjb21waWxlCisgICAgKiBbVEhSSUZULTM0MDNdIC0gSlNPTiBTdHJpbmcgcmVhZGVyIGRvZXNuJ3QgcmVjb2duaXplIFVURi0xNiBzdXJyb2dhdGUgcGFpcnMKKyAgICAqIFtUSFJJRlQtMzM2Ml0gLSBtYWtlIGNoZWNrIGZhaWxzIGZvciBDKysgYXQgdGhlIFNlY3VyaXR5VGVzdAorICAgICogW1RIUklGVC0zMzk1XSAtIENvY29hIGNvbXBpbGVyIHByb2R1Y2VzIGNvcnJ1cHQgY29kZSB3aGVuIGJveGluZyBlbnVtcyBpbnNpZGUgbWFwLgorICAgICogW1RIUklGVC0zMzk0XSAtIGNvbXBpbGVyIGdlbmVyYXRlcyB1bmNvbXBpbGFibGUgY29kZQorICAgICogW1RIUklGVC0zMzg4XSAtIGhhc2ggZG9lc24ndCB3b3JrIG9uIHNldC9saXN0CisgICAgKiBbVEhSSUZULTMzOTFdIC0gV3JvbmcgYm9vbCBmb3JtYXR0aW5nIGluIHRlc3Qgc2VydmVyCisgICAgKiBbVEhSSUZULTMzOTBdIC0gVFRvcm5hZG8gc2VydmVyIGRvZXNuJ3QgaGFuZGxlIGNsb3NlZCBjb25uZWN0aW9ucyBwcm9wZXJseQorICAgICogW1RIUklGVC0zMzgyXSAtIFRCYXNlIGNsYXNzIGZvciBDKysgTGlicmFyeQorICAgICogW1RIUklGVC0zMzkyXSAtIEphdmEgVFpsaWJUcmFuc3BvcnQgZG9lcyBub3QgY2xvc2UgaXRzIHdyYXBwZXIgc3RyZWFtcyB1cG9uIGNsb3NlKCkKKyAgICAqIFtUSFJJRlQtMzM4M10gLSBpNjQgcmVsYXRlZCB3YXJuaW5ncyAKKyAgICAqIFtUSFJJRlQtMzM4Nl0gLSBtaXNjLiB3YXJuaW5ncyB3aXRoIG1ha2UgY2hlY2sKKyAgICAqIFtUSFJJRlQtMzM4NV0gLSB3YXJuaW5nOiBmb3JtYXQg4oCYJWx14oCZIGV4cGVjdHMg4oCYbG9uZyB1bnNpZ25lZCBpbnTigJksIGJ1dCBoYXMgdHlwZSDigJhzdGQ6OmJhc2ljX3N0cmluZzxjaGFyPjo6c2l6ZV90eXBlIHtha2EgdW5zaWduZWQgaW50fQorICAgICogW1RIUklGVC0zMzU1XSAtIG5wbSBXQVJOIHBhY2thZ2UuanNvbiB0aHJpZnRAMS4wLjAtZGV2IE5vIGxpY2Vuc2UgZmllbGQuCisgICAgKiBbVEhSSUZULTMzNjBdIC0gSW1wcm92ZSBjcm9zcyB0ZXN0IHNlcnZlcnMgYW5kIGNsaWVudHMgZnVydGhlcgorICAgICogW1RIUklGVC0zMzU5XSAtIEJpbmFyeSBmaWVsZCBpbmNvbXBhdGliaWxpdGllcworICAgICogW1RIUklGVC0zMzU0XSAtIEZpeCB3b3JkLWV4dHJhY3Rpb24gc3Vic3RyIGJ1ZyBpbiBpbml0aWFsaXNtIGNvZGUKKyAgICAqIFtUSFJJRlQtMzM1MF0gLSBQeXRob24gSlNPTiBwcm90b2NvbCBkb2VzIG5vdCBlbmNvZGUgYmluYXJ5IGFzIEJhc2U2NAorICAgICogW1RIUklGVC0zNTc3XSAtIGFzc2VydGlvbiBmYWlsZWQgYXQgbGluZSA1MTIgb2YgdGVzdGNvbnRhaW5lcnRlc3QuYworICAgICogW1RIUklGVC0zNTc2XSAtIEJvb3N0IHRlc3QgLS1sb2dfZm9ybWF0IGFyZyBkb2VzIG5vdCBhY2NlcHQgbG93ZXJjYXNlCisgICAgKiBbVEhSSUZULTM1NzVdIC0gR28gY29tcGlsZXIgdHJpZXMgdG8gdXNlIHVuZXhwb3J0ZWQgbGlicmFyeSBtZXRob2RzIHdoZW4gdXNpbmcgcmVhZF93cml0ZV9wcml2YXRlCisgICAgKiBbVEhSSUZULTM1NzRdIC0gQ29jb2EgZ2VuZXJhdG9yIG1ha2VzIHVuY29tcGlsYWJsZSBpbXBvcnRzCisgICAgKiBbVEhSSUZULTM1NzBdIC0gUmVtb3ZlIGR1cGxpY2F0ZSBpbnN0YW5jZXMgdGhhdCBhcmUgYWRkZWQgYnkgdXBzdHJlYW0KKyAgICAqIFtUSFJJRlQtMzU3MV0gLSBNYWtlIGZlYXR1cmUgdGVzdCByZXN1bHQgYnJvd3NhYmxlCisgICAgKiBbVEhSSUZULTM1NjldIC0gY19nbGliIHByb3RvY29scyBkbyBub3QgY2hlY2sgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgYnkgdHJhbnNwb3J0CisgICAgKiBbVEhSSUZULTM1NjhdIC0gVEhlYWRlciBzZXJ2ZXIgY3Jhc2hlcyBvbiByZWFkU2xvdworICAgICogW1RIUklGVC0zNTY3XSAtIEdMaWItR09iamVjdC1DUklUSUNBTCAqKjogZ19vYmplY3RfdW5yZWY6IGFzc2VydGlvbiAnR19JU19PQkpFQ1QgKG9iamVjdCknIGZhaWxlZAorICAgICogW1RIUklGVC0zNTY2XSAtIEMrKy9RdDogVFFUY3BTZXJ2ZXJUZXN0Ojp0ZXN0X2NvbW11bmljYXRlKCkgaXMgbmV2ZXIgZXhlY3V0ZWQKKyAgICAqIFtUSFJJRlQtMzU2NF0gLSBDKysvUXQ6IHBvdGVudGlhbCBjb3JlIGR1bXAgaW4gVFFUY3BTZXJ2ZXIgaW4gY2FzZSBhbiBleGNlcHRpb24gb2NjdXJzIGluIFRBc3luY1Byb2Nlc3Nvcjo6cHJvY2VzcygpCisgICAgKiBbVEhSSUZULTM1NThdIC0gdHlwb3MgaW4gY19nbGliIHRlc3RzCisgICAgKiBbVEhSSUZULTM1NTldIC0gRml4IGF3a3dhcmQgZXh0cmEgc2VtaS1jb2xvbnMgd2l0aCBDb2NvYSBjb250YWluZXIgbGl0ZXJhbHMKKyAgICAqIFtUSFJJRlQtMzU1NV0gLSAnY29uZmlndXJlJyBzY3JpcHQgZG9lcyBub3QgaG9ub3IgLS13aXRoLW9wZW5zc2w9PHBhdGg+IGZvciBsaWJjcnlwdG8gZm9yIEJOX2luaXQKKyAgICAqIFtUSFJJRlQtMzU1NF0gLSBDb25zdGFudCBkZWNscyBtYXkgbGVhZCB0byAiRXJyb3I6IGludGVybmFsIGVycm9yOiBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcoKSBhbHJlYWR5IGFjdGl2ZSBmb3IgZGlmZmVyZW50IHN0cnVjdCIKKyAgICAqIFtUSFJJRlQtMzU1Ml0gLSBnbGliX2MgTWVtb3J5IExlYWsKKyAgICAqIFtUSFJJRlQtMzU1MV0gLSBUaHJpZnQgcGVybCBsaWJyYXJ5IG1pc3NpbmcgcGFja2FnZSBkZWNsYXJhdGlvbgorICAgICogW1RIUklGVC0zNTQ5XSAtIEV4Y2VwdGlvbnMgYXJlIG5vdCBwcm9wZXJseSBzdHJpbmdpZmllZCBpbiBQZXJsIGxpYnJhcnkKKyAgICAqIFtUSFJJRlQtMzU0Nl0gLSBOb2RlSlMgY29kZSBzaG91bGQgbm90IGJlIG5hbWVzcGFjZWQgKGFuZCBpcyBjdXJyZW50bHkgbm90IHN0cmljdC1tb2RlIGNvbXBsaWFudCkKKyAgICAqIFtUSFJJRlQtMzU0NV0gLSBDb250YWluZXIgdHlwZSBsaXRlcmFscyBkbyBub3QgY29tcGlsZQorICAgICogW1RIUklGVC0zNTM4XSAtIFJlbW92ZSBVbmJvdW5kTWV0aG9kVHlwZSBpbiBUUHJvdG9jb2xEZWNvcmF0b3IKKyAgICAqIFtUSFJJRlQtMzUzNl0gLSBFcnJvciAnY2hhcicgZG9lcyBub3QgY29udGFpbiBhIGRlZmluaXRpb24gZm9yICdJc0xvd1N1cnJvZ2F0ZScgZm9yIFdQNyB0YXJnZXQKKyAgICAqIFtUSFJJRlQtMzUzNF0gLSBMaW5rIGVycm9yIHdoZW4gYnVpbGRpbmcgd2l0aCBRdDUKKyAgICAqIFtUSFJJRlQtMzUzM10gLSBDYW4gbm90IHNlbmQgbmlsIHBvaW50ZXIgYXMgc2VydmljZSBtZXRob2QgYXJndW1lbnQKKyAgICAqIFtUSFJJRlQtMzUwN10gLSBUSHR0cENsaWVudCBkb2VzIG5vdCB1c2UgcHJveHkgZnJvbSBodHRwX3Byb3h5LCBodHRwc19wcm94eSBlbnZpcm9ubWVudCB2YXJpYWJsZXMKKyAgICAqIFtUSFJJRlQtMzUwMl0gLSBDKysgVFNlcnZlclNvY2tldCBwYXNzZXMgc21hbGwgYnVmZmVyIHRvIGdldHNvY2tuYW1lCisgICAgKiBbVEhSSUZULTM1MDFdIC0gRm9yd2FyZCBzbGFzaCBpbiBjb21tZW50IGNhdXNlcyBjb21waWxlciBlcnJvcgorICAgICogW1RIUklGVC0zNDk4XSAtIEMrKyBsaWJyYXJ5IGFzc3VtZXMgb3B0aW9uYWwgZnVuY3Rpb24gcHRocmVhZF9hdHRyX3NldHNjaGVkcG9saWN5IGlzIGF2YWlsYWJsZQorICAgICogW1RIUklGVC0zNDk3XSAtIEJ1aWxkIGZhaWxzIHdpdGggImludmFsaWQgdXNlIG9mIGluY29tcGxldGUgdHlwZSIKKyAgICAqIFtUSFJJRlQtMzQ5Nl0gLSBDKys6IENvYiBzdHlsZSBjbGllbnQgZmFpbHMgd2hlbiBzZW5kaW5nIGEgY29uc2VjdXRpdmUgcmVxdWVzdAorICAgICogW1RIUklGVC0zNDkzXSAtIGxpYnRocmlmdCBkb2VzIG5vdCBjb21waWxlIG9uIHdpbmRvd3MgdXNpbmcgdmlzdWFsIHN0dWRpbworICAgICogW1RIUklGVC0zNDg4XSAtIHdhcm5pbmc6IHVudXNlZCB2YXJpYWJsZSAncHJvZ3JhbScKKyAgICAqIFtUSFJJRlQtMzQ4OV0gLSB3YXJuaW5nOiBkZXByZWNhdGVkIGNvbnZlcnNpb24gZnJvbSBzdHJpbmcgY29uc3RhbnQgdG8gJ2NoYXIqJyBbLVd3cml0ZS1zdHJpbmdzXQorICAgICogW1RIUklGVC0zNDg3XSAtIEZ1bGwgc3VwcG9ydCBmb3IgbmV3ZXIgRGVscGhpIHZlcnNpb25zCisgICAgKiBbVEhSSUZULTM1MjhdIC0gRml4IHdhcm5pbmdzIGluIHRocmlmdC5sbAorICAgICogW1RIUklGVC0zNTI3XSAtIC1nZW4gcHk6ZHluYW1pYyx1dGY4c3RyaW5ncyBpZ25vcmVzIHV0ZjhzdHJpbmdzIG9wdGlvbgorICAgICogW1RIUklGVC0zNTI2XSAtIENvZGUgZ2VuZXJhdGVkIGJ5IHB5OnV0ZjhzdHJpbmdzIGRvZXMgbm90IHdvcmsgZm9yIFB5dGhvbjMKKyAgICAqIFtUSFJJRlQtMzUyNF0gLSBkY2MzMiB3YXJuaW5nICJXMTAwMCBTeW1ib2wgJ0lzTG93U3Vycm9nYXRlJyBpcyBkZXByZWNhdGVkOiAnVXNlIFRDaGFySGVscGVyJyIgaW4gVGhyaWZ0LlByb3RvY29sLkpTT04ucGFzCisgICAgKiBbVEhSSUZULTM1MjVdIC0gcHk6ZHluYW1pYyBmYWlscyB0byBoYW5kbGUgYmluYXJ5IGxpc3Qvc2V0L21hcCBlbGVtZW50CisgICAgKiBbVEhSSUZULTM1MjFdIC0gVFNpbXBsZUpTT05Qcm90b2NvbFRlc3QgaXMgbm90IGRldGVybWluaXN0aWMgKGZhaWxzIHdoZW4gcnVuIG9uIEpESyA4KQorICAgICogW1RIUklGVC0zNTIwXSAtIERhcnQgVFNvY2tldCBvbkVycm9yIHN0cmVhbSBzaG91bGQgYmUgdHlwZWQgYXMgT2JqZWN0CisgICAgKiBbVEhSSUZULTM1MTldIC0gZmFzdGJpbmFyeSBkb2VzIG5vdCB3b3JrIHdpdGggLWdlbiBweTp1dGY4c3RyaW5ncworICAgICogW1RIUklGVC0zNTE4XSAtIFRDb25jdXJyZW50Q2xpZW50U3luY0luZm8gZmlsZXMgd2VyZSBtaXNzaW5nIGZvciBWaXN1YWwgU3R1ZGlvCisgICAgKiBbVEhSSUZULTM1MTJdIC0gY19nbGliOiBCdWlsZCBmYWlscyBkdWUgdG8gbWlzc2luZyBmZWF0dXJlcy5oCisgICAgKiBbVEhSSUZULTM0ODNdIC0gSW5jb3JyZWN0IGVtcHR5IGJpbmFyeSBoYW5kbGluZyBpbnRyb2R1Y2VkIGJ5IFRIUklGVC0zMzU5CisgICAgKiBbVEhSSUZULTM0NzldIC0gT25ld2F5IGNhbGxzIHNob3VsZCBub3QgcmV0dXJuIGV4Y2VwdGlvbnMgdG8gY2xpZW50cworICAgICogW1RIUklGVC0zNDc4XSAtIFJlc3RvcmUgZHJvcHBlZCBtZXRob2QgdG8gVEhzSGFTZXJ2ZXIuamF2YQorICAgICogW1RIUklGVC0zNDc3XSAtIFBhcnNlciBmYWlscyBvbiBlbnVtIGl0ZW0gdGhhdCBzdGFydHMgd2l0aCAnRScgbGV0dGVyIGFuZCBjb250aW51ZXMgd2l0aCBudW1iZXIgCisgICAgKiBbVEhSSUZULTM0NzZdIC0gTWlzc2luZyBpbmNsdWRlIGluIC4vc3JjL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmNwcAorICAgICogW1RIUklGVC0zNDc0XSAtIERvY2tlcjogdGhyaWZ0LWNvbXBpbGVyCisgICAgKiBbVEhSSUZULTM0NzNdIC0gV2hlbiAib3B0aW9uYWwnIGlzIHVzZWQgd2l0aCBhIHN0cnVjdCBtZW1iZXIsIEMrKyBzZXJ2ZXIgc2VlbXMgdG8gbm90IHJldHVybiBpdCBjb3JyZWN0bHkKKyAgICAqIFtUSFJJRlQtMzQ2OF0gLSBEYXJ0IFRTb2NrZXRUcmFuc3BvcnQgb25FcnJvciBoYW5kbGVyIGlzIHRvbyByZXN0cmljdGl2ZQorICAgICogW1RIUklGVC0zNDUxXSAtIHRocmlmdF9wcm90b2NvbCBQSFAgZXh0ZW5zaW9uIG1pc3NpbmcgY29uZmlnLm00IGZpbGUKKyAgICAqIFtUSFJJRlQtMzQ1Nl0gLSByb3VuZGluZyBpc3N1ZSBpbiBzdGF0aWMgYXNzZXJ0CisgICAgKiBbVEhSSUZULTM0NTVdIC0gc3RydWN0IHdyaXRlIG1ldGhvZCdzIHJldHVybiB2YWx1ZSBpcyBpbmNvcnJlY3QKKyAgICAqIFtUSFJJRlQtMzQ1NF0gLSBQeXRob24gVG9ybmFkbyB0dXRvcmlhbCBpcyBicm9rZW4KKyAgICAqIFtUSFJJRlQtMzQ2M10gLSBKYXZhIGNhbid0IGJlIGRpc2FibGVkIGluIENNYWtlIGJ1aWxkCisgICAgKiBbVEhSSUZULTM0NTBdIC0gTlBFIHdoZW4gdXNpbmcgU1NMCisgICAgKiBbVEhSSUZULTM0NDldIC0gVEJhc2VBc3luY1Byb2Nlc3NvciBmYi5yZXNwb25zZVJlYWR5KCkgbmV2ZXIgY2FsbGVkIGZvciBvbmV3YXkgZnVuY3Rpb25zCisgICAgKiBbVEhSSUZULTM0NzFdIC0gRGFydCBnZW5lcmF0b3IgZG9lcyBub3QgaGFuZGxlIHVwcGVyY2FzZSBhcmd1bWVudCBuYW1lcworICAgICogW1RIUklGVC0zNDcwXSAtIFNwb3JhZGljIHRpbWVvdXRzIHdpdGggcGlwZXMKKyAgICAqIFtUSFJJRlQtMzQ2NV0gLSBHbyBDb2RlIFdpdGggQ29tcGxleCBDb25zdCBJbml0aWFsaXplciBDb21waWxhdGlvbiBEZXBlbmRzIE9uIFN0cnVjdCBPcmRlcgorICAgICogW1RIUklGVC0zNDY0XSAtIEZpeCBzZXZlcmFsIGRlZmVjdHMgaW4gY19nbGliIGNvZGUgZ2VuZXJhdG9yCisgICAgKiBbVEhSSUZULTM0NjJdIC0gQ29jb2EgZ2VuZXJhdGVzIEluY29ycmVjdCAjaW1wb3J0IGhlYWRlciBuYW1lcworICAgICogW1RIUklGVC0zNDUzXSAtIHJlbW92ZSByYXRfZXhjbHVkZQorICAgICogW1RIUklGVC0zNDE4XSAtIFVzZSBvZiBjaXBoZXJzIGluIHNzbC53cmFwX3NvY2tldCgpIGJyZWFrcyBweXRob24gMi42IGNvbXBhdGliaWxpdHkKKyAgICAqIFtUSFJJRlQtMzQxN10gLSAibmFtZXNwYWNlIHhzZCIgaXMgbm90IHJlYWxseSB3b3JraW5nCisgICAgKiBbVEhSSUZULTM0MTNdIC0gVGhyaWZ0IGNvZGUgZ2VuZXJhdGlvbiBidWcgaW4gR28gd2hlbiBleHRlbmRpbmcgc2VydmljZQorICAgICogW1RIUklGVC0zNDIwXSAtIEMrKzogVFNTTFNvY2tldHMgYXJlIG5vdCBpbnRlcnJ1cHRhYmxlCisgICAgKiBbVEhSSUZULTM0MTVdIC0gaW5jbHVkZSB1bmlzdGQuaCBjb25kaXRpb25hbGx5CisgICAgKiBbVEhSSUZULTM0MTRdIC0gI2luY2x1ZGUgPHB3ZC5oPiBpbiBUSGVhZGVyVHJhbnNwb3J0LmggYnJlYWtzIHdpbmRvd3MgYnVpbGQKKyAgICAqIFtUSFJJRlQtMzQxMV0gLSBHbyBnZW5lcmF0ZXMgcmVtb3RlcyB3aXRoIHdyb25nIHBhY2thZ2UgcXVhbGlmaWVycyB3aGVuIGluY2x1ZGluZworICAgICogW1RIUklGVC0zNDMwXSAtIEdvIFRIdHRwQ2xpZW50IGRvZXMgbm90IHJlYWQgSFRUUCByZXNwb25zZSBib2R5IHRvIGNvbXBsZXRpb24gd2hlbiBjbG9zaW5nCisgICAgKiBbVEhSSUZULTM0MjNdIC0gRmlyc3QgY2FsbCB0byB0aHJpZnRfdHJhbnNwb3J0OnJlYWRfZXhhY3QgZmFpbHMgdG8gZGlzcGF0Y2ggY29ycmVjdCBmdW5jdGlvbgorICAgICogW1RIUklGVC0zNDIyXSAtIEdvIFRTZXJ2ZXJTb2NrZXQgZG9lc24ndCBjbG9zZSBvbiBJbnRlcnJ1cHQKKyAgICAqIFtUSFJJRlQtMzQyMV0gLSByZWJhciBhcyBkZXBlbmRlbmN5IGluc3RlYWQgb2YgYnVuZGxpbmcgKHdhczogIHJlYmFyIGZhaWxzIGlmIFBXRCBjb250YWlucyBVbmljb2RlKQorICAgICogW1RIUklGVC0zNDI4XSAtIEdvIHRlc3QgZmFpbHMgd2hlbiBydW5uaW5nIG1ha2UgY2hlY2sKKyAgICAqIFtUSFJJRlQtMzQ0NV0gLSBUaHJvd2FibGUgbWVzc2FnZXMgYXJlIGhpZGRlbiBmcm9tIEpWTSBzdGFjayB0cmFjZSBvdXRwdXQKKyAgICAqIFtUSFJJRlQtMzQ0M10gLSBUaHJpZnQgaW5jbHVkZSBjYW4gZ2VuZXJhdGUgdW5jb21waWxhYmxlIGNvZGUKKyAgICAqIFtUSFJJRlQtMzQ0NF0gLSBMYXJnZSA2NCBiaXQgSW50ZWdlciBkb2VzIG5vdCBwcmVzZXJ2ZSB2YWx1ZSB0aHJvdWdoIE5vZGUuanMgSlNPTlByb3RvY29sIAorICAgICogW1RIUklGVC0zNDM2XSAtIG1pc2MuIGNyb3NzIHRlc3QgaXNzdWVzIHdpdGggVVRGLTggcGF0aCBuYW1lcworICAgICogW1RIUklGVC0zNDM1XSAtIFB1dCBnZW5lcmF0ZWQgSmF2YSBjb2RlIGZvciBmdWxsY2FtZWwgdGVzdHMgaW4gYSBzZXBhcmF0ZSBwYWNrYWdlL25hbWVzcGFjZQorICAgICogW1RIUklGVC0zNDMzXSAtIERvdWJsZXMgYXJlbid0IGludGVycHJldGVkIGNvcnJlY3RseQorICAgICogW1RIUklGVC0zNDM3XSAtIE1pbmd3LXc2NCBidWlsZCBmYWlsCisgICAgKiBbVEhSSUZULTM0MzRdIC0gRGFydCBnZW5lcmF0b3IgcHJvZHVjZXMgZW1wdHkgbmFtZSBpbiBwdWJzcGVjLnlhbWwgZm9yIGluY2x1ZGVzIHdpdGhvdXQgbmFtZXNwYWNlcworICAgICogW1RIUklGVC0zNDA4XSAtIEpTT04gZ2VuZXJhdG9yIGVtaXRzIGluY29ycmVjdCB0eXBlcworICAgICogW1RIUklGVC0zNDA2XSAtIENvY29hIGNsaWVudCBzaG91bGQgbm90IHNjaGVkdWxlIHN0cmVhbXMgb24gbWFpbiBydW5sb29wCisgICAgKiBbVEhSSUZULTM0MDRdIC0gSlNPTiBTdHJpbmcgcmVhZGVyIGRvZXNuJ3QgcmVjb2duaXplIFVURi0xNiBzdXJyb2dhdGUgcGFpcgorICAgICogW1RIUklGVC0zNjM2XSAtIERvdWJsZSBwcmVjaXNpb24gaXMgbm90IGZ1bGx5IHByZXNlcnZlZCBpbiBDKysgVEpTT05Qcm90b2NvbAorICAgICogW1RIUklGVC0zNjMyXSAtIGNfZ2xpYiB0ZXN0c2VyaWFsaXphdGlvbiBmYWlscyB3aXRoIGdsaWIgYXNzZXJ0aW9uCisgICAgKiBbVEhSSUZULTM2MTldIC0gVXNpbmcgVGhyaWZ0IDAuOS4zIHdpdGggZ29vZ2xldGVzdCBvbiBMaW51eCBnY2MgNC45IC8gQysrMTEKKyAgICAqIFtUSFJJRlQtMzYxN10gLSBDTWFrZSBkb2VzIG5vdCBidWlsZCBndi94bWwgZ2VuZXJhdG9ycworICAgICogW1RIUklGVC0zNjE1XSAtIEZpeCBQeXRob24gU1NMIGNsaWVudCByZXNvdXJjZSBsZWFrIG9uIGNvbm5lY3Rpb24gZmFpbHVyZQorICAgICogW1RIUklGVC0zNjE2XSAtIGxpYi9weS90ZXN0L3Rlc3Rfc3Nsc29ja2V0LnB5IGlzIGZsYWt5CisgICAgKiBbVEhSSUZULTM2NDNdIC0gUGVybCBTU0wgc2VydmVyIGNydXNoZXMgaWYgYSBjbGllbnQgZGlzY29ubmVjdCB3aXRob3V0IGhhbmRzaGFrZQorICAgICogW1RIUklGVC0zNjM5XSAtIEMjIFRocmlmdCBsaWJyYXJ5IGZvcmNlcyBUTFMgMS4wLCB0aHdhcnRpbmcgVExTIDEuMiB1c2FnZQorICAgICogW1RIUklGVC0zNjMzXSAtIFRyYXZpcyAiQyBDKysgLSBHQ0MiIGJ1aWxkIHdhcyB1c2luZyBjbGFuZworICAgICogW1RIUklGVC0zNjM0XSAtIEZpeCBQeXRob24gVFNvY2tldCByZXNvdXJjZSBsZWFrIG9uIGNvbm5lY3Rpb24gZmFpbHVyZQorICAgICogW1RIUklGVC0zNjMwXSAtIERlYmlhbi9VYnVudHUgaW5zdGFsbCBkb2NzIG5lZWQgYW4gdXBkYXRlCisgICAgKiBbVEhSSUZULTM2MjldIC0gUGFyc2VyIHNldHMgZXhpdGNvZGUgb24gZXJyb3JzLCBidXQgZ2VuZXJhdG9yIGRvZXMgbm90CisgICAgKiBbVEhSSUZULTM2MDhdIC0gbGliL2NwcC90ZXN0L1NlY3VyaXR5VGVzdCBpcyBmbGFreSBpbiBqZW5raW5zIFRocmlmdC1wcmVjb21taXQgYnVpbGQuCisgICAgKiBbVEhSSUZULTM2MDFdIC0gQmV0dGVyIGNvbmZvcm1hbmNlIHRvIFBFUDggZm9yIGdlbmVyYXRlZCBjb2RlCisgICAgKiBbVEhSSUZULTM1OTldIC0gVmFsaWRhdGUgY2xpZW50IElQIGFkZHJlc3MgYWdhaW5zdCBjZXJ0J3MgU3ViamVjdEFsdE5hbWUKKyAgICAqIFtUSFJJRlQtMzU5OF0gLSBUQnVmZmVyZWRUcmFuc3BvcnQgZG9lc24ndCBpbnN0YW50aWF0ZSBjbGllbnQgY29ubmVjdGlvbgorICAgICogW1RIUklGVC0zNTk3XSAtIGBtYWtlIGNoZWNrYCBoYW5ncyBpbiBnbyB0ZXN0cworICAgICogW1RIUklGVC0zNTg5XSAtIERhcnQgZ2VuZXJhdG9yIHVzZXMgd3JvbmcgbmFtZSBpbiBjb25zdHJ1Y3RvciBmb3IgdXBwZXJjYXNlIGFyZ3VtZW50cyB3aXRoIGRlZmF1bHRzCisgICAgKiBbVEhSSUZULTM1ODhdIC0gVXNpbmcgVHlwZVNjcmlwdCB3aXRoIC0tbm9JbXBsaWNpdEFueSBmYWlscworICAgICogW1RIUklGVC0zNTg0XSAtIGJvb2xlYW4gZmFsc2UgdmFsdWUgY2Fubm90IGJlIHRyYW5zZmVycmVkCisgICAgKiBbVEhSSUZULTM1NzhdIC0gTWFrZSBUSGVhZGVyVHJhbnNwb3J0IGRldGVjdCBUQ29tcGFjdCBmcmFtZWQgYW5kIHVuZnJhbWVkCisgICAgKiBbVEhSSUZULTMzMjNdIC0gUHl0aG9uIGxpYnJhcnkgZG9lcyBub3QgaGFuZGxlIGVzY2FwZWQgZm9yd2FyZCBzbGFzaCAoIi8iKSBpbiBKU09OCisgICAgKiBbVEhSSUZULTMzMjJdIC0gQ01ha2UgZ2VuZXJhdGVkICJtYWtlIGNoZWNrIiBmYWlsZXMgb24gcHl0aG9uX3Rlc3QKKyAgICAqIFtUSFJJRlQtMzMyMV0gLSBUaHJpZnQgY2FuJ3QgYmUgYWRkZWQgYXMgYSBzdWJkaXJlY3Rvcnkgb2YgYW5vdGhlciBDTWFrZS1iYXNlZCBwcm9qZWN0CisgICAgKiBbVEhSSUZULTMzMTRdIC0gRG90cyBpbiBmaWxlIG5hbWVzIG9mIGluY2x1ZGVzIGNhdXNlcyBkb3RzIGluIGphdmFzY3JpcHQgdmFyaWFibGUgbmFtZXMKKyAgICAqIFtUSFJJRlQtMzMwN10gLSBTZWdmYXVsdCBpbiBSdWJ5IHNlcmlhbGl6ZXIKKyAgICAqIFtUSFJJRlQtMzMwOV0gLSBNaXNzaW5nIFRDb25zdGFudC5waHAgaW4gL2xpYi9waHAvTWFrZWZpbGUuYW0KKyAgICAqIFtUSFJJRlQtMzgxMF0gLSB1bnJlc29sdmVkIGV4dGVybmFsIHN5bWJvbCBwdWJsaWM6IHZpcnR1YWwgdm9pZCBfX2NkZWNsIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI6OlRTZXJ2ZXJGcmFtZXdvcms6OnNlcnZlKHZvaWQpCisgICAgKiBbVEhSSUZULTM3MzZdIC0gQysrIGxpYnJhcnkgYnVpbGQgZmFpbHMgaWYgT3BlblNTTCBkb2VzIG5vdCBzdXJycG90IFNTTHYzCisgICAgKiBbVEhSSUZULTM4NzhdIC0gQ29tcGlsZSBlcnJvciBpbiBUU1NMU29ja2V0LmNwcCB3aXRoIG5ldyBPcGVuU1NMIFtDUllQVE9fbnVtX2xvY2tzXQorICAgICogW1RIUklGVC0zOTQ5XSAtIG1pc3NpbmcgbWFrZSBkaXN0IGVudHJ5IGZvciBjb21waWxlci9jcHAvdGVzdAorICAgICogW1RIUklGVC00NDldIC0gVGhlIHdpcmUgZm9ybWF0IG9mIHRoZSBKU09OIFByb3RvY29sIG1heSBub3QgYWx3YXlzIGJlIHZhbGlkIEpTT04gaWYgaXQgY29udGFpbnMgbm9uLVVURjggZW5jb2RlZCBzdHJpbmdzCisgICAgKiBbVEhSSUZULTE2Ml0gLSBUaHJpZnQgc3RydWN0dXJlcyBhcmUgdW5oYXNoYWJsZSwgcHJldmVudGluZyB0aGVtIGZyb20gYmVpbmcgdXNlZCBhcyBzZXQgZWxlbWVudHMKKyAgICAqIFtUSFJJRlQtMzk2MV0gLSBUQ29ubmVjdGVkQ2xpZW50IGRvZXMgbm90IHRlcm1pbmF0ZSB0aGUgY29ubmVjdGlvbiB0byB0aGUgY2xpZW50IGlmIGFuIGV4Y2VwdGlvbiB3aGlsZSBwcm9jZXNzaW5nIHRoZSByZWNlaXZlZCBtZXNzYWdlIG9jY3VyZXMuCisgICAgKiBbVEhSSUZULTM4ODFdIC0gVHJhdmlzIENJIGJ1aWxkcyBhcmUgZmFpbGluZyBkdWUgdG8gZG9ja2VyIGZhaWx1cmVzICh0aHJlZSByZXRyaWVzLCBhbmQgZ2l2ZXMgdXApCisgICAgKiBbVEhSSUZULTM5MzddIC0gQ2Fubm90IGNvbXBpbGUgMC4xMC4wIGRldmVsb3BtZW50IHRpcCB3aXRoIGdjYy00LjYueAorICAgICogW1RIUklGVC0zOTY0XSAtIFVuc3VwcG9ydGVkIG1lY2hhbmlzbSB0eXBlID8/Pz8/IGR1ZSB0byBkZXBlbmRlbmN5IG9uIGRlZmF1bHQgT1MtZGVwZW5kZW50IGNoYXJzZXQKKyAgICAqIFtUSFJJRlQtMzAzOF0gLSBVc2Ugb2Ygdm9sYXRpbGUgaW4gY3BwIGxpYnJhcnkKKyAgICAqIFtUSFJJRlQtMzMwMV0gLSBKYXZhIGdlbmVyYXRlZCBjb2RlIHVzZXMgaW1wb3J0cyB0aGF0IGNhbiBsZWFkIHRvIGNsYXNzIG5hbWUgY29sbGlzaW9ucyB3aXRoIElETCBkZWZpbmVkIHR5cGVzCisgICAgKiBbVEhSSUZULTMzNDhdIC0gUEhQIFRDb21wYWN0UHJvdG9jb2wgYm9vbCZpbnQ2NCByZWFkdmFsdWUgYnVnCisgICAgKiBbVEhSSUZULTM5NTVdIC0gVFRocmVhZGVkU2VydmVyIE1lbW9yeSBMZWFrCisgICAgKiBbVEhSSUZULTM4MjldIC0gVGhyaWZ0IGRvZXMgbm90IGluc3RhbGwgUHl0aG9uIExpYnJhcmllcyBpZiBUd2lzdGVkIGlzIG5vdCBpbnN0YWxsZWQKKyAgICAqIFtUSFJJRlQtMzkzMl0gLSBDKysgVGhyZWFkTWFuYWdlciBoYXMgYSByYXJlIHRlcm1pbmF0aW9uIHJhY2UKKyAgICAqIFtUSFJJRlQtMzgyOF0gLSBjbWFrZSBmYWlscyB3aGVuIEJvb3N0X0lOQ0xVREVfRElSUyAoYW5kIG90aGVyIHZhcmlhYmxlcyBwYXNzZWQgdG8gaW5jbHVkZV9kaXJlY3RvcmllcygpKSBpcyBlbXB0eSAKKyAgICAqIFtUSFJJRlQtMzk1OF0gLSBDTWFrZSBXSVRIX01UIG9wdGlvbiBmb3Igd2luZG93cyBzdGF0aWMgcnVudGltZSBsaW5raW5nIGRvZXMgbm90IHN1cHBvcnQgdGhlIGNtYWtlIGJ1aWxkIHR5cGUgUmVsV2l0aERlYkluZm8KKyAgICAqIFtUSFJJRlQtMzk1N10gLSBUQ29ubmVjdGVkQ2xpZW50IGRvZXMgbm90IGRpc2Nvbm5lY3QgZnJvbSBjbGllbnRzIHdoZW4gdGhlaXIgdGltZW91dCBpcyByZWFjaGVkLgorICAgICogW1RIUklGVC0zOTUzXSAtIFRTU0xTb2NrZXQ6OmNsb3NlIHNob3VsZCBoYW5kbGUgZXhjZXB0aW9ucyBmcm9tIHdhaXRGb3JFdmVudCBiZWNhdXNlIGl0IGlzIGNhbGxlZCBieSB0aGUgZGVzdHJ1Y3Rvci4KKyAgICAqIFtUSFJJRlQtMzk3N10gLSBQSFAgZXh0ZW5zaW9uIGNyZWF0ZXMgdW5kZWZpbmVkIHZhbHVlcyB3aGVuIGRlc2VyaWFsaXppbmcgc2V0cworICAgICogW1RIUklGVC0zOTQ3XSAtIHNvY2thZGRyIHR5cGUgaXNuJ3QgYWx3YXlzIGxhcmdlIGVub3VnaCBmb3IgdGhlIHJldHVybiBvZiBnZXRzb2NrbmFtZQorICAgICogW1RIUklGVC0yNzU1XSAtIFRocmVhZFNhbml0aXplciByZXBvcnRzIGRhdGEgcmFjZSBpbiBUaHJlYWRNYW5hZ2VyOjpJbXBsOjphZGRXb3JrZXIKKyAgICAqIFtUSFJJRlQtMzk0OF0gLSBlcnJubyBpcyBub3QgdGhlIGNvcnJlY3QgbWV0aG9kIG9mIGdldHRpbmcgdGhlIGVycm9yIGluIHdpbmRvd3MKKyAgICAqIFtUSFJJRlQtNDAwOF0gLSBicm9rZW4gY2kgZHVlIHRvIHVwc3RyZWFtIGRlcGVuZGVuY3kgdmVyc2lvbmluZyBicmVhaworICAgICogW1RIUklGVC0zOTk5XSAtIEZpeCBEZWJpYW4gJiBVYnVudHUgcGFja2FnZSBkZXBlbmRlbmNpZXMKKyAgICAqIFtUSFJJRlQtMzg4Nl0gLSBQSFAgY3Jvc3MgdGVzdCBjbGllbnQgcmV0dXJucyAwIGV2ZW4gd2hlbiBmYWlsaW5nCisgICAgKiBbVEhSSUZULTM5OTddIC0gYnVpbGRpbmcgdGhyaWZ0IGxpYnMgZG9lcyBub3Qgc3VwcG9ydCBuZXcgb3BlbnNzbAorCisjIyBEb2N1bWVudGF0aW9uCisgICAgKiBbVEhSSUZULTM4NjddIC0gU3BlY2lmeSBCaW5hcnlQcm90b2NvbCBhbmQgQ29tcGFjdFByb3RvY29sCisKKyMjIEVwaWMKKyAgICAqIFtUSFJJRlQtMzA0OV0gLSBBcyBhbiBpT1MgZGV2ZWxvcGVyLCBJIHdhbnQgYSBnZW5lcmF0b3IgYW5kIGxpYnJhcnkgdGhhdCBwcm9kdWNlcyBTd2lmdCBjb2RlCisgICAgKiBbVEhSSUZULTIzMzZdIC0gVVRGLTggc2VudCBieSBQSFAgYXMgSlNPTiBpcyBub3QgdW5kZXJzdG9vZCBieSBUSnNvblByb3RvY29sCisKKyMjIEltcHJvdmVtZW50CisgICAgKiBbVEhSSUZULTE4NjddIC0gUHl0aG9uIGNsaWVudC9zZXJ2ZXIgc2hvdWxkIHN1cHBvcnQgY2xpZW50LXNpZGUgY2VydGlmaWNhdGVzLgorICAgICogW1RIUklGVC0xMzEzXSAtIGNfZ2xpYiBjb21wYWN0IHN1cHBvcnQKKyAgICAqIFtUSFJJRlQtMTM4NV0gLSBtYWtlIGluc3RhbGwgZG9lc24ndCBpbnN0YWxsIGphdmEgbGlicmFyeSBpbiB0aGUgc2V0dGVkIGZvbGRlcgorICAgICogW1RIUklGVC0xNDM3XSAtIFVwZGF0ZSBSUE0gc3BlYworICAgICogW1RIUklGVC04NDddIC0gVGVzdCBGcmFtZXdvcmsgaGFybW9uaXphdGlvbiBhY3Jvc3MgYWxsIGxhbmd1YWdlcworICAgICogW1RIUklGVC04MTldIC0gYWRkIEVudW1lcmF0aW9uIGZvciBwcm90b2NvbCwgdHJhbnNwb3J0IGFuZCBzZXJ2ZXIgdHlwZXMKKyAgICAqIFtUSFJJRlQtMzkyN10gLSBFbWl0IGFuIGVycm9yIGluc3RlYWQgb2YgdGhyb3cgYW4gZXJyb3IgaW4gdGhlIGFzeW5jIGNhbGxiYWNrCisgICAgKiBbVEhSSUZULTM5MzFdIC0gVFNpbXBsZVNlcnZlcjogSWYgcHJvY2VzcyByZXF1ZXN0IGVuY291bnRlciBVTktOT1dOX01FVEhPRCwgZG9uJ3QgY2xvc2UgdHJhbnNwb3J0LgorICAgICogW1RIUklGVC0zOTM0XSAtIEF1dG9tYXRpY2FsbHkgcmVzb2x2ZSBPcGVuU1NMIGJpbmFyeSB2ZXJzaW9uIG9uIFdpbmRvd3MgQ0kKKyAgICAqIFtUSFJJRlQtMzkxOF0gLSBSdW4gc3Vic2V0IG9mIG1ha2UgY3Jvc3MKKyAgICAqIFtUSFJJRlQtMzkwOF0gLSBSZW1vdmUgcmVkdW5kYW50IGRlcGVuZGVuY2llcyBmcm9tIERvY2tlcmZpbGUKKyAgICAqIFtUSFJJRlQtMzkwN10gLSBTa2lwIERvY2tlciBpbWFnZSBidWlsZCBvbiBDSSB3aGVuIHVuY2hhbmdlZAorICAgICogW1RIUklGVC0zODY4XSAtIEphdmEgc3RydWN0IGVxdWFscyBzaG91bGQgZG8gaWRlbnRpdHkgY2hlY2sgYmVmb3JlIGZpZWxkIGNvbXBhcmlzb24KKyAgICAqIFtUSFJJRlQtMzg0OV0gLSBQb3J0IEdvIHNlcmlhbGl6ZXIgYW5kIGRlc2VyaWFsaXplciB0byBkYXJ0CisgICAgKiBbVEhSSUZULTI5ODldIC0gQ29tcGxldGUgQ01ha2UgYnVpbGQgZm9yIEFwYWNoZSBUaHJpZnQKKyAgICAqIFtUSFJJRlQtMjk4MF0gLSBUaHJpZnRNZW1vcnlCdWZmZXIgZG9lc24ndCBoYXZlIGEgY29uc3RydWN0b3Igb3B0aW9uIHRvIHRha2UgYW4gZXhpc3RpbmcgYnVmZmVyCisgICAgKiBbVEhSSUZULTI4NTZdIC0gcmVmYWN0b3IgZXJsYW5nIGJhc2ljIHRyYW5zcG9ydHMgYW5kIHVuaWZ5IGludGVyZmFjZXMKKyAgICAqIFtUSFJJRlQtMjg3N10gLSBPcHRpbWl6ZSBnZW5lcmF0ZWQgaGFzaENvZGUKKyAgICAqIFtUSFJJRlQtMjg2OV0gLSBKU09OOiBydW4gc2NoZW1hIHZhbGlkYXRpb24gZnJvbSB0ZXN0cworICAgICogW1RIUklGVC0zMTEyXSAtIFtKYXZhXSBBc3luY01ldGhvZENhbGxiYWNrIHNob3VsZCBiZSB0eXBlZCBpbiBnZW5lcmF0ZWQgQXN5bmNJZmFjZQorICAgICogW1RIUklGVC0zMjYzXSAtIFBIUCBqc29uU2VyaWFsaXplKCkgc2hvdWxkIGNhc3Qgc2NhbGFyIHR5cGVzCisgICAgKiBbVEhSSUZULTI5MDVdIC0gQ29jb2EgY29tcGlsZXIgc2hvdWxkIGhhdmUgb3B0aW9uIHRvIHByb2R1Y2UgIm1vZGVybiIgT2JqZWN0aXZlLUMKKyAgICAqIFtUSFJJRlQtMjgyMV0gLSBFbmFibGUgdGhlIHVzZSBvZiBjdXN0b20gSFRUUC1IZWFkZXIgaW4gdGhlIFRyYW5zcG9ydAorICAgICogW1RIUklGVC0yMDkzXSAtIGFkZGVkIHRoZSBhYmlsaXR5IHRvIHNldCBjb21wcmVzc2lvbiBsZXZlbCBpbiBDKysgemxpYiB0cmFuc3BvcnQKKyAgICAqIFtUSFJJRlQtMjA4OV0gLSBDb21waWxlciBpZ25vcmVzIGR1cGxpY2F0ZSB0eXBlbmFtZXMKKyAgICAqIFtUSFJJRlQtMjA1Nl0gLSBNb3ZlZCBhbGwgI2luY2x1ZGUgY29uZmlnLmggc3RhdGVtZW50cyB0byAjaW5jbHVkZSA8dGhyaWZ0L2NvbmZpZy5oPgorICAgICogW1RIUklGVC0yMDMxXSAtIE1ha2UgU09fS0VFUEFMSVZFIGNvbmZpZ3VyYWJsZSBmb3IgQysrIGxpYgorICAgICogW1RIUklGVC0yMDIxXSAtIEltcHJvdmUgbGFyZ2UgYmluYXJ5IHByb3RvY29sIHN0cmluZyBwZXJmb3JtYW5jZQorICAgICogW1RIUklGVC0yMDI4XSAtIENsZWFudXAgdGhyZWFkaW5nIGhlYWRlcnMgLyBsaWJyYXJpZXMKKyAgICAqIFtUSFJJRlQtMjAxNF0gLSBDaGFuZ2UgQysrIGxpYiBpbmNsdWRlcyB0byB1c2UgPG5hbWVzcGFjZS8+IHN0eWxlIHRocm91Z2hvdXQKKyAgICAqIFtUSFJJRlQtMjMxMl0gLSB0cmF2aXMueW1sOiBidWlsZCBldmVyeXRoaW5nCisgICAgKiBbVEhSSUZULTE5MTVdIC0gTXVsdGlwbGV4aW5nIFNlcnZpY2VzCisgICAgKiBbVEhSSUZULTE3MzZdIC0gVmlzdWFsIFN0dWRpbyB0b3AgbGV2ZWwgcHJvamVjdCBmaWxlcyB3aXRoaW4gbXN2YworICAgICogW1RIUklGVC0xNzM1XSAtIGludGVncmF0ZSB0dXRvcmlhbCBpbnRvIHJlZ3VsYXIgYnVpbGQKKyAgICAqIFtUSFJJRlQtMTUzM10gLSBNYWtlIFRUcmFuc3BvcnQgc2hvdWxkIGJlIENsb3NlYWJsZQorICAgICogW1RIUklGVC0zNV0gLSBNb3ZlIGxhbmd1YWdlIHRlc3RzIGludG8gdGhlaXIgYXBwcm9wcmlhdGUgbGlicmFyeSBkaXJlY3RvcnkKKyAgICAqIFtUSFJJRlQtMTA3OV0gLSBTdXBwb3J0IGk2NCBpbiBBUzMKKyAgICAqIFtUSFJJRlQtMTEwOF0gLSBTU0wgc3VwcG9ydCBmb3IgdGhlIFJ1YnkgbGlicmFyeSAKKyAgICAqIFtUSFJJRlQtMzg1Nl0gLSB1cGRhdGUgZGViaWFuIHBhY2thZ2UgZGVlcGVuZGVuY2llcworICAgICogW1RIUklGVC0zODMzXSAtIGhheGUgaHR0cCBzZXJ2ZXIgaW1wbGVtZW50YXRpb24gKGJ5IGVtYmVkaW5nIGludG8gcGhwIHdlYiBzZXJ2ZXIpCisgICAgKiBbVEhSSUZULTM4MzldIC0gUGVyZm9ybWFuY2UgaXNzdWUgd2l0aCBiaWcgbWVzc2FnZSBkZXNlcmlhbGl6YXRpb24gdXNpbmcgcGhwIGV4dGVuc2lvbgorICAgICogW1RIUklGVC0zODIwXSAtIEVybGFuZzogRGV0ZWN0IE9UUCA+PSAxOCB0byB1c2UgbmV3IHRpbWUgY29ycmVjdGlvbgorICAgICogW1RIUklGVC0zODE2XSAtIFJlZHVjZSBkb2NrZXIgYnVpbGQgZHVyYXRpb24gb24gVHJhdmlzLUNJCisgICAgKiBbVEhSSUZULTM4MTVdIC0gUHV0IGFwcHZleW9yIGRlcGVuZGVuY3kgdmVyc2lvbnMgdG8gb25lIHBsYWNlCisgICAgKiBbVEhSSUZULTM3ODhdIC0gQ29tcGF0aWJpbGl0eSBpbXByb3ZlbWVudHMgYW5kIFdpbjY0IHN1cHBvcnQKKyAgICAqIFtUSFJJRlQtMzc5Ml0gLSBUaW1lb3V0cyBmb3IgYW5vbnltb3VzIHBpcGVzIHNob3VsZCBiZSBjb25maWd1cmFibGUKKyAgICAqIFtUSFJJRlQtMzc5NF0gLSBTcGxpdCBEZWxwaGkgYXBwbGljYXRpb24sIHByb3RvY29sIGFuZCB0cmFuc3BvcnQgZXhjZXB0aW9uIHN1YnR5cGVzIGludG8gc2VwYXJhdGUgZXhjZXB0aW9ucworICAgICogW1RIUklGVC0zNzc0XSAtIFRoZSBnZW5lcmF0ZWQgY29kZSBzaG91bGQgaGF2ZSBleGNlcHRpb25fbmFtZXMgbWV0YSBpbmZvCisgICAgKiBbVEhSSUZULTM3NjJdIC0gRml4IGJ1aWxkIHdhcm5pbmdzIGZvciBkZXByZWNhdGVkIFRocmlmdCAiYnl0ZSIgZmllbGRzCisgICAgKiBbVEhSSUZULTM3NTZdIC0gSW1wcm92ZSByZXF1aXJlZG5lc3MgZG9jdW1lbnRhdGlvbgorICAgICogW1RIUklGVC0zNzYxXSAtIEFkZCBkZWJpYW4gcGFja2FnZSBmb3IgUHl0aG9uMworICAgICogW1RIUklGVC0zNzQyXSAtIGhheGUgcGhwIGNsaSBzdXBwb3J0CisgICAgKiBbVEhSSUZULTM3MzNdIC0gU29ja2V0IHRpbWVvdXQgaW1wcm92ZW1lbnRzCisgICAgKiBbVEhSSUZULTM3MjhdIC0gaHR0cCB0cmFuc3BvcnQgZm9yIHRocmlmdC1sdWEKKyAgICAqIFtUSFJJRlQtMzkwNV0gLSBEYXJ0IGNvbXBpbGVyIGRvZXMgbm90IGluaXRpYWxpemUgYm9vbCwgaW50LCBhbmQgZG91YmxlIHByb3BlcnRpZXMKKyAgICAqIFtUSFJJRlQtMzkxMV0gLSBMb29zZW4gUnVieSBkZXYgZGVwZW5kZW5jeSB2ZXJzaW9uIHJlcXVpcmVtZW50cworICAgICogW1RIUklGVC0zOTA2XSAtIFJ1biBDIyB0ZXN0cyB3aXRoIG1ha2UgY2hlY2sKKyAgICAqIFtUSFJJRlQtMzkwMF0gLSBBZGQgUHl0aG9uIFNTTCBmbGFncworICAgICogW1RIUklGVC0zODk3XSAtIFByb3ZpZGUgbWVhbmluZ2Z1bCBleGNlcHRpb24gdHlwZSBiYXNlZCBvbiBXZWJFeGNlcHRpb25TdGF0dXMgaW4gY2FzZSBvZiB0aW1lb3V0CisgICAgKiBbVEhSSUZULTM4MDhdIC0gTWlzc2luZyBgRE9VQkxFYCBpbiB0aHJpZnQgdHlwZSBlbnVtZXJhdGlvbgorICAgICogW1RIUklGVC0zODAzXSAtIFJlbW92ZSAiZmlsZSIgYXR0cmlidXRlIGZyb20gWE1MIGdlbmVyYXRvcgorICAgICogW1RIUklGVC0zNjYwXSAtIEFkZCBWNCBtYXBwZWQgYWRkcmVzcyB0byB0ZXN0IGNsaWVudCBjZXJ0J3MgYWx0bmFtZQorICAgICogW1RIUklGVC0zNjYxXSAtIFVzZSBodHRwcyB0byBkb3dubG9hZCBtZWNrIGluIGVybGFuZyB0ZXN0IGJ1aWxkCisgICAgKiBbVEhSSUZULTM2NTldIC0gQ2hlY2sgY29uZmlndXJlIHJlc3VsdCBvZiBDTWFrZSBvbiBDSQorICAgICogW1RIUklGVC0zNjY3XSAtIEFkZCBUTFMgU05JIHN1cHBvcnQgdG8gY2xpZW50cworICAgICogW1RIUklGVC0zNjUxXSAtIE1ha2UgYmFja3BvcnRzLm1hdGNoX2hvc3RuYW1lIGFuZCBpcGFkZHJlc3Mgb3B0aW9uYWwKKyAgICAqIFtUSFJJRlQtMzY2Nl0gLSBCdWlsZCBEIHR1dG9yaWFsIGFzIHBhcnQgb2YgQXV0b3Rvb2xzIGJ1aWxkCisgICAgKiBbVEhSSUZULTM2NjVdIC0gQWRkIEQgbGliZXZlbnQgYW5kIE9wZW5TU0wgdG8gZG9ja2VyIGltYWdlcworICAgICogW1RIUklGVC0zNjY0XSAtIFJlbW92ZSBtZDUuYworICAgICogW1RIUklGVC0zNjYyXSAtIEFkZCBIYXNrZWxsIHRvIGRlYmlhbiBkb2NrZXIgaW1hZ2UKKyAgICAqIFtUSFJJRlQtMzcxMV0gLSBBZGQgRCB0byBjcm9zcyBsYW5ndWFnZSB0ZXN0CisgICAgKiBbVEhSSUZULTM2OTFdIC0gUnVuIGZsYWtlOCBQeXRob24gc3R5bGUgY2hlY2sgb24gVHJhdmlzLUNJCisgICAgKiBbVEhSSUZULTM2OTJdIC0gKFJlKWVuYWJsZSBBcHB2ZXlvciBDKysgYW5kIFB5dGhvbiBidWlsZAorICAgICogW1RIUklGVC0zNjc3XSAtIEltcHJvdmUgQ01ha2UgSmF2YSBidWlsZAorICAgICogW1RIUklGVC0zNjc5XSAtIEFkZCBzdGRvdXQgbG9nIHRvIHRlc3RCaW5hcnkgaW4gSmF2YSB0ZXN0IHNlcnZlcgorICAgICogW1RIUklGVC0zNzE4XSAtIFJlZHVjZSBzaXplIG9mIGRvY2tlciBpbWFnZSBmb3IgYnVpbGQgZW52aXJvbm1lbnQKKyAgICAqIFtUSFJJRlQtMzY5OF0gLSBbVHJhdmlzLUNJXSBJbnRyb2R1Y2UgcmV0cnkgdG8gYXB0IGNvbW1hbmRzCisgICAgKiBbVEhSSUZULTMxMjddIC0gc3dpdGNoIC1yZWN1cnNlIHRvIC0tcmVjdXJzZSBhbmQgcmVzZXJ2ZSAtcgorICAgICogW1RIUklGVC0zMDg3XSAtIFBhc3Mgb24gZXJyb3JzIGxpa2UgImNvbm5lY3Rpb24gY2xvc2VkIgorICAgICogW1RIUklGVC0zMjQwXSAtIFRocmlmdCBQeXRob24gY2xpZW50IHNob3VsZCBzdXBwb3J0IHN1YmplY3RBbHROYW1lIGFuZCB3aWxkY2FyZCBjZXJ0cyBpbiBUU1NMU29ja2V0CisgICAgKiBbVEhSSUZULTMyMTNdIC0gbWFrZSBjcm9zcyBzaG91bGQgaW5kaWNhdGUgd2hlbiBpdCBza2lwcyBhIGtub3duIGZhaWxpbmcgdGVzdAorICAgICogW1RIUklGVC0zMjA4XSAtIEZpeCBWaXN1YWwgU3R1ZGlvIHNvbHV0aW9uIGJ1aWxkIGZhaWx1cmUgZHVlIHRvIG1pc3Npbmcgc291cmNlCisgICAgKiBbVEhSSUZULTMxODZdIC0gQWRkIFRTZXJ2ZXJIVFRQIHRvIEdvIGxpYnJhcnkKKyAgICAqIFtUSFJJRlQtMjM0Ml0gLSBBZGQgX19GSUxFX18gYW5kIF9fTElORV9fIHRvIFRocmlmdCBDKysgZXhjcGV0aW9ucworICAgICogW1RIUklGVC0zMzcyXSAtIEFkZCBkYXJ0IGdlbmVyYXRvciB0byBWaXN1YWwgU3R1ZGlvIHByb2plY3QKKyAgICAqIFtUSFJJRlQtMzM2Nl0gLSBUaHJpZnRUZXN0IHRvIGltcGxlbWVudCBzdGFuZGFyZCByZXR1cm4gdmFsdWVzIAorICAgICogW1RIUklGVC0zNDAyXSAtIFByb3ZpZGUgYSBwZXJsIFVuaXggU29ja2V0IGltcGxlbWVudGF0aW9uCisgICAgKiBbVEhSSUZULTMzNjFdIC0gSW1wcm92ZSBDIyBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTMzOTNdIC0gSW50cm9kdWNlIGk4IHRvIHByb3ZpZGUgY29uc2lzdGVudCBzZXQgb2YgVGhyaWZ0IElETCBpbnRlZ2VyIHR5cGVzCisgICAgKiBbVEhSSUZULTMzMzldIC0gU3VwcG9ydCBmb3IgZGF0YWJhc2Uvc3FsCisgICAgKiBbVEhSSUZULTM1NjVdIC0gQysrOiBUW0FzeW5jXVByb2Nlc3Nvcjo6Z2V0RXZlbnRIYW5kbGVyKCkgc2hvdWxkIGJlIGRlY2xhcmVkIGFzIGNvbnN0IG1lbWJlciBmdW5jdGlvbnMKKyAgICAqIFtUSFJJRlQtMzU2M10gLSBDKysvUXQ6IHJlbW92ZWQgdXNhZ2Ugb2YgbWFjcm8gUVRfUFJFUEVORF9OQU1FU1BBQ0UgYXMgaXQgaXNuJ3QgY29uc2VxdWVudGx5IHVzZWQgZm9yIGFsbCByZWZlcmVuY2VzIHRvIFF0IHR5cGVzLgorICAgICogW1RIUklGVC0zNTYyXSAtIFJlbW92ZWQgdW51c2VkIFRBc3luY1Byb2Nlc3Nvcjo6Z2V0QXN5bmNTZXJ2ZXIoKQorICAgICogW1RIUklGVC0zNTYxXSAtIEMrKy9RdDogbWFrZSB1c2Ugb2YgUV9ESVNBQkxFX0NPUFkoKSB0byBnZXQgcmlkIG9mIGNvcHkgY3RvciBhbmQgYXNzaWdubWVudCBvcGVyYXRvcgorICAgICogW1RIUklGVC0zNTU2XSAtIGNfZ2xpYiBmaWxlIGRlc2NyaXB0b3IgdHJhbnNwb3J0CisgICAgKiBbVEhSSUZULTM1NDRdIC0gTWFrZSBjcm9zcyB0ZXN0IGZhaWwgd2hlbiBzZXJ2ZXIgcHJvY2VzcyBkaWVkIHVuZXhwZWN0ZWRseQorICAgICogW1RIUklGVC0zNTQwXSAtIE1ha2UgcHl0aG9uIHR1dG9yaWFsIG1vcmUgaW4gbGluZSB3aXRoIFBFUDgKKyAgICAqIFtUSFJJRlQtMzUzNV0gLSBEYXJ0IGdlbmVyYXRvciBhcmd1bWVudCB0byBwcm9kdWNlIGEgZmlsZSBzdHJ1Y3R1cmUgdXNhYmxlIGluIHBhcmVudCBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTM1MDVdIC0gRW5oYW5jZSBQeXRob24gVFNTTFNvY2tldAorICAgICogW1RIUklGVC0zNTA2XSAtIEVsaW1pbmF0ZSBvbGQgc3R5bGUgY2xhc3NlcyBmcm9tIGxpYnJhcnkgY29kZQorICAgICogW1RIUklGVC0zNTAzXSAtIEVuYWJsZSBweTp1dGY4c3RyaW5nIGJ5IGRlZmF1bHQKKyAgICAqIFtUSFJJRlQtMzQ5OV0gLSBBZGQgcGFja2FnZV9wcmVmaXggdG8gcHl0aG9uIGdlbmVyYXRvcgorICAgICogW1RIUklGVC0zNDk1XSAtIE1pbm9yIGVuaGFuY2VtZW50cyBhbmQgZml4ZXMgZm9yIGNyb3NzIHRlc3QKKyAgICAqIFtUSFJJRlQtMzQ4Nl0gLSBKYXZhIGdlbmVyYXRlZCBgZ2V0RmllbGRWYWx1ZWAgaXMgaW5jb21wYXRpYmxlIHdpdGggYHNldEZpZWxkVmFsdWVgIGZvciBiaW5hcnkgdmFsdWVzLgorICAgICogW1RIUklGVC0zNDg0XSAtIENvbnNvbGlkYXRlIHRlbXBvcmFyeSBidWZmZXJzIGluIEphdmEncyBUQ29tcGFjdFByb3RvY29sCisgICAgKiBbVEhSSUZULTM1MTZdIC0gQWRkIGZlYXR1cmUgdGVzdCBmb3IgVEhlYWRlciBUQmluYXJ5UHJvdG9jb2wgaW50ZXJvcAorICAgICogW1RIUklGVC0zNTE1XSAtIFB5dGhvbiAyLjYgY29tcGF0aWJpbGl0eSBhbmQgdGVzdCBvbiBDSQorICAgICogW1RIUklGVC0zNTE0XSAtIFBIUCA3IGNvbXBhdGlibGUgdmVyc2lvbiBvZiBiaW5hcnkgcHJvdG9jb2wKKyAgICAqIFtUSFJJRlQtMzQ2OV0gLSBEb2NrZXI6IERlYmlhbiBzdXBwb3J0CisgICAgKiBbVEhSSUZULTM0MTZdIC0gUmV0aXJlIG9sZCAieHh4X25hbWVzcGFjZSIgZGVjbGFyYXRpb25zIGZyb20gdGhlIElETAorICAgICogW1RIUklGVC0zNDI2XSAtIEFsaWduIGF1dG9nZW4gY29tbWVudCBpbiBYU0QKKyAgICAqIFtUSFJJRlQtMzQyNF0gLSBBZGQgQ01ha2UgYW5kcm9pZCBidWlsZCBvcHRpb24KKyAgICAqIFtUSFJJRlQtMzQzOV0gLSBSdW4gbWFrZSBjcm9zcyB1c2luZyBQeXRob24zIHdoZW4gYXZhaWxhYmxlCisgICAgKiBbVEhSSUZULTM0NDBdIC0gUHl0aG9uIG1ha2UgY2hlY2sgdGFrZXMgdG9vIG11Y2ggdGltZQorICAgICogW1RIUklGVC0zNDQxXSAtIFN0YWJpbGl6ZSBUcmF2aXMtQ0kgYnVpbGRzCisgICAgKiBbVEhSSUZULTM0MzFdIC0gQXZvaWQgInNjaGVtZXMiIEhhc2hNYXAgbG9va3VwcyBkdXJpbmcgc3RydWN0IHJlYWRzL3dyaXRlcworICAgICogW1RIUklGVC0zNDMyXSAtIEFkZCBhIFRCeXRlQnVmZmVyIHRyYW5zcG9ydCB0byB0aGUgSmF2YSBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTM0MzhdIC0gRW5hYmxlIHB5Om5ld19zdHlsZSBieSBkZWZhdWx0CisgICAgKiBbVEhSSUZULTM0MDVdIC0gR28gVEh0dHBDbGllbnQgbWlzdXNlcyBodHRwLkNsaWVudCBvYmplY3RzCisgICAgKiBbVEhSSUZULTM2MTRdIC0gSW1wcm92ZSBsb2dnaW5nIG9mIHRlc3Rfc3Nsc29ja2V0LnB5CisgICAgKiBbVEhSSUZULTM2NDddIC0gRml4IHBocCBleHRlbnNpb24gYnVpbGQgd2FybmluZ3MKKyAgICAqIFtUSFJJRlQtMzY0Ml0gLSBTcGVlZCB1cCBjcm9zcyB0ZXN0IHJ1bm5lcgorICAgICogW1RIUklGVC0zNjM3XSAtIEltcGxlbWVudCBjb21wYWN0IHByb3RvY29sIGZvciBkYXJ0CisgICAgKiBbVEhSSUZULTM2MTNdIC0gUG9ydCBQeXRob24gQyBleHRlbnNpb24gdG8gUHl0aG9uIDMKKyAgICAqIFtUSFJJRlQtMzYxMl0gLSBBZGQgUHl0aG9uIEMgZXh0ZW5zaW9uIGZvciBjb21wYWN0IHByb3RvY29sCisgICAgKiBbVEhSSUZULTM2MTFdIC0gQWRkIC0tcmVnZXggZmlsdGVyIHRvIGNyb3NzIHRlc3QgcnVubmVyCisgICAgKiBbVEhSSUZULTM2MzFdIC0gSlNPTiBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBmb3IgTHVhCisgICAgKiBbVEhSSUZULTM2MDldIC0gUmVtb3ZlIG9yIHJlcGxhY2UgVGVzdFBvcnRGaXh0dXJlLmgKKyAgICAqIFtUSFJJRlQtMzYwNV0gLSBIYXZlIHRoZSBjb21waWxlciBjb21wbGFpbiBhYm91dCBpbnZhbGlkIGFyZ3VtZW50cyBhbmQgb3B0aW9ucworICAgICogW1RIUklGVC0zNTk2XSAtIEJldHRlciBjb25mb3JtYW5jZSB0byBQRVA4CisgICAgKiBbVEhSSUZULTM1ODVdIC0gQ29tcGFjdCBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBmb3IgTHVhCisgICAgKiBbVEhSSUZULTM1ODJdIC0gRXJsYW5nIGxpYnJhcmllcyBzaG91bGQgaGF2ZSBzZXJ2aWNlIG1ldGFkYXRhCisgICAgKiBbVEhSSUZULTM1NzldIC0gSW50cm9kdWNlIHJldHJ5IHRvIG1ha2UgY3Jvc3MKKyAgICAqIFtUSFJJRlQtMzMwNl0gLSBKYXZhOiBUQmluYXJ5UHJvdG9jb2w6IFVzZSAxIHRlbXAgYnVmZmVyIGluc3RlYWQgb2YgYWxsb2NhdGluZyA4CisgICAgKiBbVEhSSUZULTM5MTBdIC0gRG8gbm90IGludm9rZSBwaXAgYXMgcGFydCBvZiBidWlsZCBwcm9jZXNzCisgICAgKiBbVEhSSUZULTE4NTddIC0gUHl0aG9uIDMuWCBTdXBwb3J0CisgICAgKiBbVEhSSUZULTE5NDRdIC0gQmluZGluZyB0byB6ZXJvIHBvcnQKKyAgICAqIFtUSFJJRlQtMzk1NF0gLSBFbmFibGUgdGhlIHVzYWdlIG9mIHN0cnVjdHMgY2FsbGVkICJPYmplY3QiIGluIEphdmEKKyAgICAqIFtUSFJJRlQtMzk4MV0gLSBFbmFibGUgYW5hbHl6ZXIgc3Ryb25nIG1vZGUgaW4gRGFydCBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTM5OThdIC0gRG9jdW1lbnQgYWJpbGl0eSB0byBhZGQgY3VzdG9tIHRhZ3MgdG8gdGhyaWZ0IHN0cnVjdHMKKyAgICAqIFtUSFJJRlQtNDAwNl0gLSBBZGQgYSByZW1vdmVFdmVudExpc3RlbmVyIG1ldGhvZCBvbiBUU29ja2V0CisKKyMjIE5ldyBGZWF0dXJlCisgICAgKiBbVEhSSUZULTY0MF0gLSBTdXBwb3J0IGRlcHJlY2F0aW9uCisgICAgKiBbVEhSSUZULTk0OF0gLSBTU0wgc29ja2V0IHN1cHBvcnQgZm9yIFBIUAorICAgICogW1RIUklGVC03NjRdIC0gYWRkIFN1cHBvcnQgZm9yIFZhbGEgbGFuZ3VhZ2UKKyAgICAqIFtUSFJJRlQtMzA0Nl0gLSBBbGxvdyBQU1I0IGNsYXNzIGxvYWRpbmcgZm9yIGdlbmVyYXRlZCBjbGFzc2VzIChQSFApCisgICAgKiBbVEhSSUZULTIxMTNdIC0gRXJsYW5nIFNTTCBTb2NrZXQgU3VwcG9ydAorICAgICogW1RIUklGVC0xNDgyXSAtIFVuaXggZG9tYWluIHNvY2tldCBzdXBwb3J0IHVuZGVyIFBIUAorICAgICogW1RIUklGVC01MTldIC0gU3VwcG9ydCBjb2xsZWN0aW9ucyBvZiB0eXBlcyB3aXRob3V0IGhhdmluZyB0byBleHBsaWNpdGx5IGRlZmluZSBpdAorICAgICogW1RIUklGVC00NjhdIC0gUmFjayBNaWRkbGV3YXJlIEFwcGxpY2F0aW9uIGZvciBSYWlscworICAgICogW1RIUklGVC0xNzA4XSAtIEFkZCBldmVudCBoYW5kbGVycyBmb3IgcHJvY2Vzc29yIGV2ZW50cworICAgICogW1RIUklGVC0zODM0XSAtIEVybGFuZyBuYW1lc3BhY2luZyBhbmQgZXhjZXB0aW9uIG1ldGFkYXRhCisgICAgKiBbVEhSSUZULTI1MTBdIC0gSW1wbGVtZW50IFROb25ibG9ja2luZ1NlcnZlcidzIGFiaWxpdHkgdG8gbGlzdGVuIG9uIHVuaXggZG9tYWluIHNvY2tldHMKKyAgICAqIFtUSFJJRlQtMzM5N10gLSBJbXBsZW1lbnQgVFByb2Nlc3NvckZhY3RvcnkgaW4gQyMgdG8gZW5hYmxlIHBlci1jbGllbnQgcHJvY2Vzc29ycworICAgICogW1RIUklGVC0zNTIzXSAtIFhNTCBHZW5lcmF0b3IKKyAgICAqIFtUSFJJRlQtMzUxMF0gLSBBZGQgSHR0cFRhc2tBc3luY0hhbmRsZXIgaW1wbGVtZW50YXRpb24KKyAgICAqIFtUSFJJRlQtMzMxOF0gLSBQSFA6IFNpbXBsZUpTT05Qcm90b2NvbCBJbXBsZW1lbnRhdGlvbgorICAgICogW1RIUklGVC0zMjk5XSAtIERhcnQgbGFuZ3VhZ2UgYmluZGluZ3MgaW4gVGhyaWZ0CisgICAgKiBbVEhSSUZULTI4MzVdIC0gQWRkIHBvc3NpYmlsaXR5IHRvIGRpc3RyaWJ1dGUgZ2VuZXJhdG9ycyBzZXBhcmF0ZWx5IGZyb20gdGhyaWZ0IGNvcmUsIGFuZCBsb2FkIHRoZW0gZHluYW1pY2FsbHkKKyAgICAqIFtUSFJJRlQtMTg0XSAtIEFkZCBPU0dpIE1hbmlmZXN0IGhlYWRlcnMgdG8gdGhlIGxpYnRocmlmdCBqYXZhIGxpYnJhcnkgdG8gYmUgYWJsZSB0byB1c2UgVGhyaWZ0IGluIHRoZSBPU0dpIHJ1bnRpbWUKKyAgICAqIFtUSFJJRlQtMTQxXSAtIElmIGEgcmVxdWlyZWQgZmllbGQgaXMgbm90IHByZXNlbnQgb24gc2VyaWFsaXphdGlvbiwgdGhyb3cgYW4gZXhjZXB0aW9uCisgICAgKiBbVEhSSUZULTE4OTFdIC0gQWRkIFdpbmRvd3MgQUxQQyB0cmFuc3BvcnQgd2hpY2ggaXMgcmlnaHQgY291bnRlcnBhcnQgb2YgVW5peCBkb21haW4gc29ja2V0cworCisjIyBRdWVzdGlvbgorICAgICogW1RIUklGVC0xODA4XSAtIFRoZSBUaHJpZnQgc3RydWN0IHNob3VsZCBiZSBjb25zaWRlcmVkIHNlbGYtY29udGFpbmVkPworICAgICogW1RIUklGVC0yODk1XSAtIFR1dG9yaWFsIGNwcAorICAgICogW1RIUklGVC0zODYwXSAtIEVsZXBoYW50LWJpcmQgYXBwbGljYXRpb24gVGVzdCBmYWlscyBmb3IgVGhyaWZ0CisgICAgKiBbVEhSSUZULTM4MTFdIC0gSFRUUFMgU3VwcG9ydCBmb3IgQysrIGFwcGxpY2F0aW9ucworICAgICogW1RIUklGVC0zNTA5XSAtICJtYWtlIGNoZWNrIiBlcnJvcgorCisjIyBTdG9yeQorICAgICogW1RIUklGVC0zNDUyXSAtIC50cmF2aXMueW1sOiBNaWdyYXRpbmcgZnJvbSBsZWdhY3kgdG8gY29udGFpbmVyLWJhc2VkIGluZnJhc3RydWN0dXJlCisKKyMjIFN1Yi10YXNrCisgICAgKiBbVEhSSUZULTE4MTFdIC0gcnVieSB0dXRvcmlhbCBhcyBwYXJ0IG9mIHRoZSByZWd1bGFyIGJ1aWxkCisgICAgKiBbVEhSSUZULTI3NzldIC0gUEhQIFRKU09OUHJvdG9jb2wgZW5jb2RlIHVuaWNvZGUgaW50byBVQ1MtNExFIHdoaWNoIGNhbid0IGJlIHBhcnNlZCBieSBvdGhlciBsYW5ndWFnZSBiaW5kaW5ncworICAgICogW1RIUklGVC0yMTEwXSAtIEVybGFuZzogU3VwcG9ydCBmb3IgTXVsdGlwbGV4aW5nIFNlcnZpY2VzIG9uIGFueSBUcmFuc3BvcnQsIFByb3RvY29sIGFuZCBTZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMzg1Ml0gLSBBIFRyYXZpcy1DSSBqb2IgZmFpbHMgd2l0aCAid3JpdGUgZXJyb3IiCisgICAgKiBbVEhSSUZULTM3NDBdIC0gRml4IGhheGVsaWIuanNvbiBjbGFzc3BhdGggCisgICAgKiBbVEhSSUZULTM2NTNdIC0gaW5jb3JyZWN0IHVuaW9uIHNlcmlhbGl6YXRpb24KKyAgICAqIFtUSFJJRlQtMzY1Ml0gLSBpbmNvcnJlY3Qgc2VyaWFsaXphdGlvbiBvZiBvcHRpb25hbHMKKyAgICAqIFtUSFJJRlQtMzY1NV0gLSBpbmNvcnJlY3QgdW5pb24gc2VyaWFsaXphdGlvbgorICAgICogW1RIUklGVC0zNjU0XSAtIGluY29ycmVjdCBzZXJpYWxpemF0aW9uIG9mIG9wdGlvbmFscworICAgICogW1RIUklGVC0zNjU2XSAtIGluY29ycmVjdCBzZXJpYWxpemF0aW9uIG9mIG9wdGlvbmFscworICAgICogW1RIUklGVC0zNjk5XSAtIEZpeCBpbnRlZ2VyIGxpbWl0IHN5bWJvbCBpbmNsdWRlcyBpbiBQeXRob24gQyBleHRlbnNpb24KKyAgICAqIFtUSFJJRlQtMzY5M10gLSBGaXggaW5jbHVkZSBpc3N1ZSBpbiBDKysgVFNTTFNvY2tldEludGVycnVwdFRlc3Qgb24gV2luZG93cworICAgICogW1RIUklGVC0zNjk0XSAtIFtXaW5kb3dzXSBEaXNhYmxlIHRlc3RzIG9mIGEgZmV3IHNlcnZlcnMgdGhhdCBhcmUgbm90IHN1cHBvcnRlZAorICAgICogW1RIUklGVC0zNjk2XSAtIEluc3RhbGwgcGlwIHRvIENlbnRPUyBEb2NrZXIgaW1hZ2VzIHRvIGZpeCBQeXRob24gYnVpbGRzCisgICAgKiBbVEhSSUZULTM2MzhdIC0gRml4IGhheGVsaWIuanNvbgorICAgICogW1RIUklGVC0zMjUxXSAtIEFkZCBodHRwIHRyYW5zcG9ydCBmb3Igc2VydmVyIHRvIEdvIGxpYgorICAgICogW1RIUklGVC0yNDI0XSAtIFJlY3Vyc2l2ZSBUeXBlcworICAgICogW1RIUklGVC0yNDIzXSAtIFRIZWFkZXIKKyAgICAqIFtUSFJJRlQtMjQxM10gLSBQeXRob246IFVURi04IHNlbnQgYnkgUEhQIGFzIEpTT04gaXMgbm90IHVuZGVyc3Rvb2QgYnkgVEpzb25Qcm90b2NvbAorICAgICogW1RIUklGVC0yNDA5XSAtIEphdmE6IFVURi04IHNlbnQgYnkgUEhQIGFzIEpTT04gaXMgbm90IHVuZGVyc3Rvb2QgYnkgVEpzb25Qcm90b2NvbAorICAgICogW1RIUklGVC0yNDEyXSAtIEQ6IFVURi04IHNlbnQgYnkgUEhQIGFzIEpTT04gaXMgbm90IHVuZGVyc3Rvb2QgYnkgVEpzb25Qcm90b2NvbAorICAgICogW1RIUklGVC0yNDExXSAtIEMrKzogVVRGLTggc2VudCBieSBQSFAgYXMgSlNPTiBpcyBub3QgdW5kZXJzdG9vZCBieSBUSnNvblByb3RvY29sCisgICAgKiBbVEhSSUZULTI0MTBdIC0gSmF2YU1lOiBVVEYtOCBzZW50IGJ5IFBIUCBhcyBKU09OIGlzIG5vdCB1bmRlcnN0b29kIGJ5IFRKc29uUHJvdG9jb2wKKyAgICAqIFtUSFJJRlQtMjY2OF0gLSBUZXN0U3VpdGU6IGRldGFpbGVkIHJlc3VsdCBvbiBwYXNzZWQgdGVzdHMgYnkgZmVhdHVyZQorICAgICogW1RIUklGVC0yNjU5XSAtIHB5dGhvbiBUZXN0IFNlcnZlciBmYWlscyB3aGVuIHRocm93aW5nIFRFeGNlcHRpb24KKyAgICAqIFtUSFJJRlQtMzM5OF0gLSBBZGQgQ01ha2UgYnVpbGQgIGZvciBIYXNrZWxsIGxpYnJhcnkgYW5kIHRlc3RzCisgICAgKiBbVEhSSUZULTMzOTZdIC0gREFSVDogVVRGLTggc2VudCBieSBQSFAgYXMgSlNPTiBpcyBub3QgdW5kZXJzdG9vZCBieSBUSnNvblByb3RvY29sCisgICAgKiBbVEhSSUZULTMzNjRdIC0gICBGaXggcnVieSBiaW5hcnkgZmllbGQgZW5jb2RpbmcgaW4gVEpTT05Qcm90b2NvbAorICAgICogW1RIUklGVC0zMzgxXSAtIEZpeCBmb3IgbWlzYy4gY29kZWdlbiBpc3N1ZXMgd2l0aCBUSFJJRlQtMjkwNQorICAgICogW1RIUklGVC0zNTczXSAtIE5vIHJ1bGUgdG8gbWFrZSB0YXJnZXQgYC4uLy4uLy4uL3Rlc3QvY19nbGliL3NyYy8uZGVwcy90ZXN0dGhyaWZ0dGVzdC10aHJpZnRfdGVzdF9oYW5kbGVyLlBvJy4KKyAgICAqIFtUSFJJRlQtMzU3Ml0gLSAiVW5hYmxlIHRvIGRldGVybWluZSB0aGUgYmVoYXZpb3Igb2YgYSBzaWduZWQgcmlnaHQgc2hpZnQiCisgICAgKiBbVEhSSUZULTM1NDJdIC0gQWRkIGxlbmd0aCBsaW1pdCBzdXBwb3J0IHRvIEphdmEgdGVzdCBzZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMzUzN10gLSBSZW1vdmUgdGhlIChub3cgb2Jzb2xldGUpIGNzaGFycDphc3luY2N0cCBmbGFnIAorICAgICogW1RIUklGVC0zNTMyXSAtIEFkZCBjb25maWd1cmFibGUgc3RyaW5nIGFuZCBjb250YWluZXIgcmVhZCBzaXplIGxpbWl0IHRvIFB5dGhvbiBwcm90b2NvbHMKKyAgICAqIFtUSFJJRlQtMzUzMV0gLSBDcmVhdGUgY3Jvc3MgbGFuZyBmZWF0dXJlIHRlc3QgZm9yIHN0cmluZyBhbmQgY29udGFpbmVyIHJlYWQgbGVuZ3RoIGxpbWl0CisgICAgKiBbVEhSSUZULTM0ODJdIC0gSGFza2VsbCBKU09OIHByb3RvY29sIGRvZXMgbm90IGVuY29kZSBiaW5hcnkgZmllbGQgYXMgQmFzZTY0CisgICAgKiBbVEhSSUZULTM0MjVdIC0gTWlub3IgZml4ZXMgKyBzaW1wbGlmaWNhdGlvbiBmb3IgQ2VudE9TIERvY2tlcmZpbGUKKyAgICAqIFtUSFJJRlQtMzQ0Ml0gLSBSdW4gQ01ha2UgdGVzdHMgb24gQXBwdmV5b3IKKyAgICAqIFtUSFJJRlQtMzQwOV0gLSBOb2RlSlMgYmluYXJ5IGZpZWxkIGlzc3VlcworICAgICogW1RIUklGVC0zNjIxXSAtIEZpeCBsaWIvY3BwL3Rlc3QvU2VjdXJpdHlUZXN0LmNwcCB0byB1c2UgZXBoZW1lcmFsIHBvcnRzCisgICAgKiBbVEhSSUZULTM2MjhdIC0gRml4IGxpYi9jcHAvdGVzdC9UU2VydmVySW50ZWdyYXRpb25UZXN0LmNwcCB0byB1c2UgZXBoZW1lcmFsIHBvcnRzCisgICAgKiBbVEhSSUZULTM2MjVdIC0gS2lsbCB1bnVzZWQgI2luY2x1ZGUgIlRlc3RQb3J0Rml4dHVyZS5oIiBpbiBsaWIvY3BwL3Rlc3QvVFNlcnZlclRyYW5zcG9ydFRlc3QuY3BwLgorICAgICogW1RIUklGVC0zNjQ2XSAtIEZpeCBQeXRob24gZXh0ZW5zaW9uIGJ1aWxkIHdhcm5pbmdzCisgICAgKiBbVEhSSUZULTM2MjZdIC0gRml4IGxpYi9jcHAvdGVzdC9UU29ja2V0SW50ZXJydXB0VGVzdC5jcHAgdG8gdXNlIGVwaGVtZXJhbCBwb3J0cy4KKyAgICAqIFtUSFJJRlQtMzYyNF0gLSBGaXggbGliL2NwcC90ZXN0L1RTZXJ2ZXJTb2NrZXRUZXN0LmNwcCB0byB1c2UgZXBoZW1lcmFsIHBvcnRzCisgICAgKiBbVEhSSUZULTM2MjNdIC0gRml4IEZpeCBjcHAvbGliL3Rlc3QvVFNTTFNvY2tldEludGVycnVwdFRlc3QuY3BwIHRvIHVzZSBlcGhlbWVyYWwgcG9ydHMKKyAgICAqIFtUSFJJRlQtMzU5Ml0gLSBBZGQgYmFzaWMgdGVzdCBjbGllbnQKKyAgICAqIFtUSFJJRlQtMzk4MF0gLSBhZGQgVEV4dGVuZGVkQmluYXJ5UHJvdG9jb2wuamF2YQorCisjIyBUYXNrCisgICAgKiBbVEhSSUZULTE4MDFdIC0gU3luYyB1cCBUQXBwbGljYXRpb25FeGNlcHRpb24gY29kZXMgYWNyb3NzIGxhbmd1YWdlcyBhbmQgdGhyaWZ0IGltcGxlbWVudGF0aW9ucworICAgICogW1RIUklGVC0xMjU5XSAtIEF1dG9tYXRlIHZlcnNpb25pbmcgCisKKyMjIFRlc3QKKyAgICAqIFtUSFJJRlQtMzQwMF0gLSBBZGQgRXJsYW5nIHRvIGNyb3NzIHRlc3QKKyAgICAqIFtUSFJJRlQtMzUwNF0gLSBGaXggRmFzdGJpbmFyeVRlc3QucHkKKworIyMgV2lzaAorICAgICogW1RIUklGVC0zOTIzXSAtIE1heWJlIHJlbW92ZSBBZXJlbyBmcm9tIHRoZSAiUG93ZXJlZCBieSIgbGlzdAorICAgICogW1RIUklGVC0yMTQ5XSAtIEFkZCBhbiBvcHRpb24gdG8gZGlzYWJsZSB0aGUgZ2VuZXJhdGlvbiBvZiBkZWZhdWx0IG9wZXJhdG9ycworCisKKwogVGhyaWZ0IDAuOS4zCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyMgQnVnCkBAIC0yNjYsNyArMTQwNSw3IEBACiAgICAgKiBbVEhSSUZULTMzMzJdIC0gbWFrZSBkaXN0IGZhaWxzIG9uIGNsZWFuIGJ1aWxkCiAgICAgKiBbVEhSSUZULTMzMjZdIC0gVGVzdHMgZG8gbm90IGNvbXBpbGUgdW5kZXIgKkJTRAogICAgICogW1RIUklGVC0zMzM0XSAtIE1hcmtkb3duIG5vdGF0aW9uIG9mIHByb3RvY29sIHNwZWMgaXMgbWFsZm9ybWVkCi0gICAgKiBbVEhSSUZULTMzMzFdIC0gd2FybmluZzog4oCYZXR5cGXigJkgbWF5IGJlIHVzZWQgdW5pbml0aWFsaXplZCBpbiB0aGlzIGZ1bmN0aW9uCisgICAgKiBbVEhSSUZULTMzMzFdIC0gd2FybmluZzogw6LigqzLnGV0eXBlw6LigqzihKIgbWF5IGJlIHVzZWQgdW5pbml0aWFsaXplZCBpbiB0aGlzIGZ1bmN0aW9uCiAgICAgKiBbVEhSSUZULTMzNDldIC0gUHl0aG9uIHNlcnZlciBkb2VzIG5vdCBoYW5kbGUgcHJvY2Vzc29yIGV4Y2VwdGlvbgogICAgICogW1RIUklGVC0zMzQzXSAtIEZpeCBoYXNrZWxsIFJFQURNRQogICAgICogW1RIUklGVC0zMzQwXSAtIFB5dGhvbjogZW5hYmxlIGpzb24gdGVzdHMgYWdhaW4KZGlmZiAtLWdpdCBhL0NNYWtlTGlzdHMudHh0IGIvQ01ha2VMaXN0cy50eHQKaW5kZXggNDRmNjVhZi4uOWY1N2E2NiAxMDA2NDQKLS0tIGEvQ01ha2VMaXN0cy50eHQKKysrIGIvQ01ha2VMaXN0cy50eHQKQEAgLTE3LDcgKzE3LDE0IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1jbWFrZV9taW5pbXVtX3JlcXVpcmVkKFZFUlNJT04gMi44LjEyKQorY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDMuMSkKKworIyBDTWFrZSAzLjEgc3VwcG9ydHMgQysrIHN0YW5kYXJkcyBzZWxlY3Rpb24gd2l0aCBDTUFLRV9DWFhfU1RBTkRBUkQKKyMgSWYgeW91IG5lZWQgQ01ha2UgMy4xKyBmb3IgVWJ1bnR1IDE0LjA0LCB0cnkKKyMgICBodHRwczovL2xhdW5jaHBhZC5uZXQvfmdlb3JnZS1lZGlzb241NS8rYXJjaGl2ZS91YnVudHUvY21ha2UtMy54CisjIElmIHlvdSBuZWVkIENNYWtlIDMuMSsgZm9yIGRlYmlhbiAiamVzc2llIiwgZ2V0IGl0IGZyb20gamVzc2llLWJhY2twb3J0cworIyBPdGhlcndpc2UKKyMgICBodHRwOi8vY21ha2Uub3JnCiAKIHByb2plY3QoIkFwYWNoZSBUaHJpZnQiKQogCkBAIC02NywxNSArNzQsMjIgQEAKIGVsc2UgKCkKICAgbWVzc2FnZShTVEFUVVMgIkJ1aWxkaW5nIHdpdGhvdXQgdGVzdHMiKQogZW5kaWYgKCkKKwogaWYoQlVJTERfQ09NUElMRVIpCisgICAgaWYoTk9UIEVYSVNUUyAke1RIUklGVF9DT01QSUxFUn0pCisgICAgICAgIHNldChUSFJJRlRfQ09NUElMRVIgJDxUQVJHRVRfRklMRTp0aHJpZnQtY29tcGlsZXI+KQorICAgIGVuZGlmKCkKICAgICBhZGRfc3ViZGlyZWN0b3J5KCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9jb21waWxlci9jcHApCitlbHNlaWYoRVhJU1RTICR7VEhSSUZUX0NPTVBJTEVSfSkKKyAgICBhZGRfZXhlY3V0YWJsZSh0aHJpZnQtY29tcGlsZXIgSU1QT1JURUQpCisgICAgc2V0X3Byb3BlcnR5KFRBUkdFVCB0aHJpZnQtY29tcGlsZXIgUFJPUEVSVFkgSU1QT1JURURfTE9DQVRJT04gJHtUSFJJRlRfQ09NUElMRVJ9KQogZW5kaWYoKQogCiBpZihCVUlMRF9DUFApCiAgICAgYWRkX3N1YmRpcmVjdG9yeSgke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vbGliL2NwcCkKICAgICBpZihCVUlMRF9UVVRPUklBTFMpCiAgICAgICAgIGFkZF9zdWJkaXJlY3RvcnkoJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3R1dG9yaWFsL2NwcCkKLSAgICBlbmRpZihCVUlMRF9UVVRPUklBTFMpCisgICAgZW5kaWYoKQogICAgIGlmKEJVSUxEX1RFU1RJTkcpCiAgICAgICAgIGlmKFdJVEhfTElCRVZFTlQgQU5EIFdJVEhfWkxJQiBBTkQgV0lUSF9PUEVOU1NMKQogICAgICAgICAgICAgYWRkX3N1YmRpcmVjdG9yeSgke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vdGVzdC9jcHApCkBAIC0xMDAsNCArMTE0LDExIEBACiAgICAgZW5kaWYoKQogZW5kaWYoKQogCitpZihCVUlMRF9IQVNLRUxMKQorICAgIGFkZF9zdWJkaXJlY3RvcnkoJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2xpYi9ocykKKyAgICBpZihCVUlMRF9URVNUSU5HKQorICAgICAgICBhZGRfc3ViZGlyZWN0b3J5KCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS90ZXN0L2hzKQorICAgIGVuZGlmKCkKK2VuZGlmKCkKKwogUFJJTlRfQ09ORklHX1NVTU1BUlkoKQpkaWZmIC0tZ2l0IGEvQ09OVFJJQlVUSU5HLm1kIGIvQ09OVFJJQlVUSU5HLm1kCmluZGV4IDc2MDQxZjYuLjdhMWQ3MTAgMTAwNjQ0Ci0tLSBhL0NPTlRSSUJVVElORy5tZAorKysgYi9DT05UUklCVVRJTkcubWQKQEAgLTEsNDkgKzEsMTE2IEBACi0jIyBIb3cgdG8gY29udHJpYnV0ZQotIDEuIEhlbHAgdG8gcmV2aWV3IGFuZCB2ZXJpZnkgZXhpc3RpbmcgcGF0Y2hlcwotIDEuIE1ha2Ugc3VyZSB5b3VyIGlzc3VlIGlzIG5vdCBhbGwgcmVhZHkgaW4gdGhlIFtKaXJhIGlzc3VlIHRyYWNrZXJdKGh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQpCi0gMS4gSWYgbm90LCBjcmVhdGUgYSB0aWNrZXQgZGVzY3JpYmluZyB0aGUgY2hhbmdlIHlvdSdyZSBwcm9wb3NpbmcgaW4gdGhlIFtKaXJhIGlzc3VlIHRyYWNrZXJdKGh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQpCi0gMS4gQ29udHJpYnV0ZSB5b3VyIHBhdGNoIHVzaW5nIG9uZSBvZiB0aGUgdHdvIG1ldGhvZHMgYmVsb3cKKyMgSG93IHRvIENvbnRyaWJ1dGUgIwogCi0jIyMgQ29udHJpYnV0aW5nIHZpYSBhIHBhdGNoCi0KLTEuIENoZWNrIG91dCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhlIHNvdXJjZSBjb2RlCi0KLSAgKiBnaXQgY2xvbmUgaHR0cHM6Ly9naXQtd2lwLXVzLmFwYWNoZS5vcmcvcmVwb3MvYXNmL3RocmlmdC5naXQgdGhyaWZ0Ci0KLTEuIE1vZGlmeSB0aGUgc291cmNlIHRvIGluY2x1ZGUgdGhlIGltcHJvdmVtZW50L2J1Z2ZpeAotCi0gICogUmVtZW1iZXIgdG8gcHJvdmlkZSAqdGVzdHMqIGZvciBhbGwgc3VibWl0ZWQgY2hhbmdlcwotICAqIFdoZW4gYnVnZml4aW5nOiBhZGQgdGVzdCB0aGF0IHdpbGwgaXNvbGF0ZSBidWcgKmJlZm9yZSogYXBwbHlpbmcgY2hhbmdlIHRoYXQgZml4ZXMgaXQKLSAgKiBWZXJpZnkgdGhhdCB5b3UgZm9sbG93IFtUaHJpZnQgQ29kaW5nIFN0YW5kYXJkc10oL2NvZGluZ19zdGFuZGFyZHMpICh5b3UgY2FuIHJ1biAnbWFrZSBzdHlsZScsIHdoaWNoIGVuc3VyZXMgcHJvcGVyIGZvcm1hdCBmb3Igc29tZSBsYW5ndWFnZXMpCi0KLTEuIENyZWF0ZSBhIHBhdGNoIGZyb20gcHJvamVjdCByb290IGRpcmVjdG9yeSAoZS5nLiB5b3VAZGV2On4vdGhyaWZ0ICQgKToKLQotICAqIGdpdCBkaWZmID4gLi4vdGhyaWZ0LVhYWC1teS1uZXctZmVhdHVyZS5wYXRjaAotCi0xLiBBdHRhY2ggdGhlIG5ld2x5IGdlbmVyYXRlZCBwYXRjaCB0byB0aGUgaXNzdWUKLTEuIFdhaXQgZm9yIG90aGVyIGNvbnRyaWJ1dG9ycyBvciBjb21taXR0ZXJzIHRvIHJldmlldyB5b3VyIG5ldyBhZGRpdGlvbgotMS4gV2FpdCBmb3IgYSBjb21taXR0ZXIgdG8gY29tbWl0IHlvdXIgcGF0Y2gKLQotIyMjIENvbnRyaWJ1dGluZyB2aWEgR2l0SHViIHB1bGwgcmVxdWVzdHMKLQotMS4gQ3JlYXRlIGEgZm9yayBmb3IgaHR0cDovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdAotMS4gQ3JlYXRlIGEgYnJhbmNoIGZvciB5b3VyIGNoYW5nZXMoYmVzdCBwcmFjdGljZSBpcyBpc3N1ZSBhcyBicmFuY2ggbmFtZSwgZS5nLiBUSFJJRlQtOTk5OSkKLTEuIE1vZGlmeSB0aGUgc291cmNlIHRvIGluY2x1ZGUgdGhlIGltcHJvdmVtZW50L2J1Z2ZpeAotCi0gICogUmVtZW1iZXIgdG8gcHJvdmlkZSAqdGVzdHMqIGZvciBhbGwgc3VibWl0ZWQgY2hhbmdlcwotICAqIFdoZW4gYnVnZml4aW5nOiBhZGQgdGVzdCB0aGF0IHdpbGwgaXNvbGF0ZSBidWcgKmJlZm9yZSogYXBwbHlpbmcgY2hhbmdlIHRoYXQgZml4ZXMgaXQKLSAgKiBWZXJpZnkgdGhhdCB5b3UgZm9sbG93IFtUaHJpZnQgQ29kaW5nIFN0YW5kYXJkc10oL2NvZGluZ19zdGFuZGFyZHMpICh5b3UgY2FuIHJ1biAnbWFrZSBzdHlsZScsIHdoaWNoIGVuc3VyZXMgcHJvcGVyIGZvcm1hdCBmb3Igc29tZSBsYW5ndWFnZXMpCi0gICogVmVyaWZ5IHRoYXQgeW91ciBjaGFuZ2Ugd29ya3Mgb24gb3RoZXIgcGxhdGZvcm1zIGJ5IGFkZGluZyBhIEdpdEh1YiBzZXJ2aWNlIGhvb2sgdG8gW1RyYXZpcyBDSV0oaHR0cDovL2RvY3MudHJhdmlzLWNpLmNvbS91c2VyL2dldHRpbmctc3RhcnRlZC8jU3RlcC1vbmUlM0EtU2lnbi1pbikgYW5kIFtBcHBWZXlvcl0oaHR0cDovL3d3dy5hcHB2ZXlvci5jb20vZG9jcykKLQotMS4gQ29tbWl0IGFuZCBwdXNoIGNoYW5nZXMgdG8geW91ciBicmFuY2ggKHBsZWFzZSB1c2UgaXNzdWUgbmFtZSBhbmQgZGVzY3JpcHRpb24gYXMgY29tbWl0IHRpdGxlLCBlLmcuIFRIUklGVC05OTk5IG1ha2UgaXQgcGVyZmVjdCkKLTEuIElzc3VlIGEgcHVsbCByZXF1ZXN0IHdpdGggdGhlIGppcmEgdGlja2V0IG51bWJlciB5b3UgYXJlIHdvcmtpbmcgb24gaW4gaXQncyBuYW1lCi0xLiBXYWl0IGZvciBvdGhlciBjb250cmlidXRvcnMgb3IgY29tbWl0dGVycyB0byByZXZpZXcgeW91ciBuZXcgYWRkaXRpb24KLTEuIFdhaXQgZm9yIGEgY29tbWl0dGVyIHRvIGNvbW1pdCB5b3VyIHBhdGNoCi0KLSMjIyBNb3JlIGluZm8KLQotIFBsZW50eSBvZiBpbmZvcm1hdGlvbiBvbiB3aHkgYW5kIGhvdyB0byBjb250cmlidXRlIGlzIGF2YWlsYWJsZSBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgd2ViIHNpdGUuIEluIHBhcnRpY3VsYXIsIHdlIHJlY29tbWVuZCB0aGUgZm9sbG93aW5nOgorVGhhbmsgeW91IGZvciB5b3VyIGludGVyZXN0IGluIGNvbnRyaWJ1dGluZyB0byB0aGUgQXBhY2hlIFRocmlmdCBwcm9qZWN0ISAgSW5mb3JtYXRpb24gb24gd2h5IGFuZCBob3cgdG8gY29udHJpYnV0ZSBpcyBhdmFpbGFibGUgb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHdlYiBzaXRlLiBJbiBwYXJ0aWN1bGFyLCB3ZSByZWNvbW1lbmQgdGhlIGZvbGxvd2luZyB0byBiZWNvbWUgYWNxdWFpbnRlZCB3aXRoIEFwYWNoZSBDb250cmlidXRpb25zOgogCiAgKiBbQ29udHJpYnV0b3JzIFRlY2ggR3VpZGVdKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kZXYvY29udHJpYnV0b3JzKQogICogW0dldCBpbnZvbHZlZCFdKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9mb3VuZGF0aW9uL2dldGludm9sdmVkLmh0bWwpCiAgKiBbTGVnYWwgYXNwZWN0cyBvbiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMgKFBhdGNoZXMpXShodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAuaHRtbCNjb250cmlidXRpb25zKQorCisjIyBHaXRIdWIgcHVsbCByZXF1ZXN0cyAjIworCitUaGlzIGlzIHRoZSBwcmVmZXJyZWQgbWV0aG9kIG9mIHN1Ym1pdHRpbmcgY2hhbmdlcy4gIFdoZW4geW91IHN1Ym1pdCBhIHB1bGwgcmVxdWVzdCB0aHJvdWdoIGdpdGh1YiwKK2l0IGFjdGl2YXRlcyB0aGUgY29udGludW91cyBpbnRlZ3JhdGlvbiAoQ0kpIGJ1aWxkIHN5c3RlbXMgYXQgQXBwdmV5b3IgYW5kIFRyYXZpcyB0byBidWlsZCB5b3VyIGNoYW5nZXN4aQorb24gYSB2YXJpZXR5IG9mIExpbnV4IGFuZCBXaW5kb3dzIGNvbmZpZ3VyYXRpb25zIGFuZCBydW4gYWxsIHRoZSB0ZXN0IHN1aXRlcy4gIEZvbGxvdyB0aGVzZSByZXF1aXJlbWVudHMgCitmb3IgYSBzdWNjZXNzZnVsIHB1bGwgcmVxdWVzdDoKKworIDEuIEFsbCBjb2RlIGNoYW5nZXMgcmVxdWlyZSBhbiBbQXBhY2hlIEppcmEgVEhSSUZUIElzc3VlXShodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUKSB0aWNrZXQuCisKKyAxLiBBbGwgcHVsbCByZXF1ZXN0cyBzaG91bGQgY29udGFpbiBhIHNpbmdsZSBjb21taXQgcGVyIGlzc3VlLCBvciB3ZSB3aWxsIGFzayB5b3UgdG8gc3F1YXNoIGl0LgorIDEuIFRoZSBwdWxsIHJlcXVlc3QgdGl0bGUgbXVzdCBiZWdpbiB3aXRoIHRoZSBKaXJhIFRIUklGVCB0aWNrZXQgaWRlbnRpZmllciwgZm9yIGV4YW1wbGU6CisKKyAgICAgICAgVEhSSUZULTk5OTk6IGFuIGV4YW1wbGUgcHVsbCByZXF1ZXN0IHRpdGxlCisgICAgICAgIAorIDEuIENvbW1pdCBtZXNzYWdlcyBtdXN0IGZvbGxvdyB0aGlzIHBhdHRlcm4gZm9yIGNvZGUgY2hhbmdlcyAoZGV2aWF0aW9ucyB3aWxsIG5vdCBiZSBtZXJnZWQpOgorICAgICAgICAKKyAgICAgICAgVEhSSUZULTk5OTk6IFtzdW1tYXJ5IG9mIGZpeCwgb25lIGxpbmUgaWYgcG9zc2libGVdCisgICAgICAgIENsaWVudDogW2xhbmd1YWdlKHMpIGFmZmVjdGVkLCBjb21tYSBzZXBhcmF0ZWQsIHVzZSBsaWIvIGRpcmVjdG9yeSBuYW1lcyBwbGVhc2VdCisKK0luc3RydWN0aW9uczoKKworIDEuIENyZWF0ZSBhIGZvcmsgaW4geW91ciBHaXRIdWIgYWNjb3VudCBvZiBodHRwOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0CisgMS4gQ2xvbmUgdGhlIGZvcmsgdG8geW91ciBkZXZlbG9wbWVudCBzeXN0ZW0uCisgMS4gQ3JlYXRlIGEgYnJhbmNoIGZvciB5b3VyIGNoYW5nZXMgKGJlc3QgcHJhY3RpY2UgaXMgaXNzdWUgYXMgYnJhbmNoIG5hbWUsIGUuZy4gVEhSSUZULTk5OTkpLgorIDEuIE1vZGlmeSB0aGUgc291cmNlIHRvIGluY2x1ZGUgdGhlIGltcHJvdmVtZW50L2J1Z2ZpeCwgYW5kOgorCisgICAgKiBSZW1lbWJlciB0byBwcm92aWRlICp0ZXN0cyogZm9yIGFsbCBzdWJtaXR0ZWQgY2hhbmdlcyEKKyAgICAqIFVzZSB0ZXN0LWRyaXZlbiBkZXZlbG9wbWVudCAoVEREKTogYWRkIGEgdGVzdCB0aGF0IHdpbGwgaXNvbGF0ZSB0aGUgYnVnICpiZWZvcmUqIGFwcGx5aW5nIHRoZSBjaGFuZ2UgdGhhdCBmaXhlcyBpdC4KKyAgICAqIFZlcmlmeSB0aGF0IHlvdSBmb2xsb3cgW1RocmlmdCBDb2RpbmcgU3RhbmRhcmRzXSgvZG9jcy9jb2Rpbmdfc3RhbmRhcmRzKSAoeW91IGNhbiBydW4gJ21ha2Ugc3R5bGUnLCB3aGljaCBlbnN1cmVzIHByb3BlciBmb3JtYXQgZm9yIHNvbWUgbGFuZ3VhZ2VzKS4KKyAgICAqIFsqb3B0aW9uYWwqXSBWZXJpZnkgdGhhdCB5b3VyIGNoYW5nZSB3b3JrcyBvbiBvdGhlciBwbGF0Zm9ybXMgYnkgYWRkaW5nIGEgR2l0SHViIHNlcnZpY2UgaG9vayB0byBbVHJhdmlzIENJXShodHRwOi8vZG9jcy50cmF2aXMtY2kuY29tL3VzZXIvZ2V0dGluZy1zdGFydGVkLyNTdGVwLW9uZSUzQS1TaWduLWluKSBhbmQgW0FwcFZleW9yXShodHRwOi8vd3d3LmFwcHZleW9yLmNvbS9kb2NzKS4gIFlvdSBjYW4gdXNlIHRoaXMgdGVjaG5pcXVlIHRvIHJ1biB0aGUgVGhyaWZ0IENJIGpvYnMgaW4geW91ciBhY2NvdW50IHRvIGNoZWNrIHlvdXIgY2hhbmdlcyBiZWZvcmUgdGhleSBhcmUgbWFkZSBwdWJsaWMuICBFdmVyeSBHaXRIdWIgcHVsbCByZXF1ZXN0IGludG8gVGhyaWZ0IHdpbGwgcnVuIHRoZSBmdWxsIENJIGJ1aWxkIGFuZCB0ZXN0IHN1aXRlIG9uIHlvdXIgY2hhbmdlcy4KKworIDEuIFNxdWFzaCB5b3VyIGNoYW5nZXMgdG8gYSBzaW5nbGUgY29tbWl0LiAgVGhpcyBtYWludGFpbnMgY2xlYW4gY2hhbmdlIGhpc3RvcnkuCisgMS4gQ29tbWl0IGFuZCBwdXNoIGNoYW5nZXMgdG8geW91ciBicmFuY2ggKHBsZWFzZSB1c2UgaXNzdWUgbmFtZSBhbmQgZGVzY3JpcHRpb24gYXMgY29tbWl0IHRpdGxlLCBlLmcuICJUSFJJRlQtOTk5OTogbWFrZSBpdCBwZXJmZWN0IiksIHdpdGggdGhlIGFmZmVjdGVkIGxhbmd1YWdlcyBvbiB0aGUgbmV4dCBsaW5lIG9mIHRoZSBkZXNjcmlwdGlvbi4KKyAxLiBVc2UgR2l0SHViIHRvIGNyZWF0ZSBhIHB1bGwgcmVxdWVzdCBnb2luZyBmcm9tIHlvdXIgYnJhbmNoIHRvIGFwYWNoZTptYXN0ZXIuICBFbnN1cmUgdGhhdCB0aGUgSmlyYSB0aWNrZXQgbnVtYmVyIGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRpdGxlIG9mIHlvdXIgcHVsbCByZXF1ZXN0LCBzYW1lIGFzIHRoZSBjb21taXQgdGl0bGUuCisgMS4gV2FpdCBmb3Igb3RoZXIgY29udHJpYnV0b3JzIG9yIGNvbW1pdHRlcnMgdG8gcmV2aWV3IHlvdXIgbmV3IGFkZGl0aW9uLCBhbmQgZm9yIGEgQ0kgYnVpbGQgdG8gY29tcGxldGUuCisgMS4gV2FpdCBmb3IgYSBjb21taXR0ZXIgdG8gY29tbWl0IHlvdXIgcGF0Y2guICBZb3UgY2FuIG51ZGdlIHRoZSBjb21taXR0ZXJzIGlmIG5lY2Vzc2FyeSBieSBzZW5kaW5nIGEgbWVzc2FnZSB0byB0aGUgW0FwYWNoZSBUaHJpZnQgbWFpbGluZyBsaXN0XShodHRwczovL3RocmlmdC5hcGFjaGUub3JnL21haWxpbmcpLgorCisjIyBJZiB5b3Ugd2FudCB0byBidWlsZCB0aGUgcHJvamVjdCBsb2NhbGx5ICMjCisKK0ZvciBXaW5kb3dzIHN5c3RlbXMsIHNlZSBvdXIgZGV0YWlsZWQgaW5zdHJ1Y3Rpb25zIG9uIHRoZSBbQ01ha2UgUkVBRE1FXSgvYnVpbGQvY21ha2UvUkVBRE1FLm1kKS4KKworRm9yIFdpbmRvd3MgTmF0aXZlIEMrKyBidWlsZHMsIHNlZSBvdXIgZGV0YWlsZWQgaW5zdHJ1Y3Rpb25zIG9uIHRoZSBbV2luQ1BQIFJFQURNRV0oL2J1aWxkL3dpbmNwcC9SRUFETUUubWQpLgorCitGb3IgdW5peCBzeXN0ZW1zLCBzZWUgb3VyIGRldGFpbGVkIGluc3RydWN0aW9ucyBvbiB0aGUgW0RvY2tlciBSRUFETUVdKC9idWlsZC9kb2NrZXIvUkVBRE1FLm1kKS4KKworIyMgSWYgeW91IHdhbnQgdG8gcmV2aWV3IG9wZW4gaXNzdWVzLi4uICMjCisKKyAxLiBSZXZpZXcgdGhlIFtHaXRIdWIgUHVsbCBSZXF1ZXN0IEJhY2tsb2ddKGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L3B1bGxzKS4gIENvZGUgcmV2aWV3cyBhcmUgb3BlbiB0byBhbGwuCisgMi4gUmV2aWV3IHRoZSBbSmlyYSBpc3N1ZSB0cmFja2VyXShodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUKS4gIFlvdSBjYW4gc2VhcmNoIGZvciB0aWNrZXRzIHJlbGF0aW5nIHRvIGxhbmd1YWdlcyB5b3UgYXJlIGludGVyZXN0ZWQgaW4gb3IgY3VycmVudGx5IHVzaW5nIHdpdGggdGhyaWZ0LCBmb3IgZXhhbXBsZSBhIEppcmEgc2VhcmNoIChJc3N1ZXMgLT4gU2VhcmNoIEZvciBJc3N1ZXMpIHF1ZXJ5IG9mIGBgcHJvamVjdCA9IFRIUklGVCBBTkQgY29tcG9uZW50IGluICgiRXJsYW5nIC0gTGlicmFyeSIpIGFuZCBzdGF0dXMgbm90IGluIChyZXNvbHZlZCwgY2xvc2VkKWBgIHdpbGwgbG9jYXRlIGFsbCB0aGUgb3BlbiBFcmxhbmcgTGlicmFyeSBpc3N1ZXMuCisKKyMjIElmIHlvdSBkaXNjb3ZlcmVkIGEgZGVmZWN0Li4uICMjCisKKyAxLiBDaGVjayB0byBzZWUgaWYgdGhlIGlzc3VlIGlzIGFscmVhZHkgaW4gdGhlIFtKaXJhIGlzc3VlIHRyYWNrZXJdKGh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQpLgorIDEuIElmIG5vdCwgY3JlYXRlIGEgdGlja2V0IGRlc2NyaWJpbmcgdGhlIGNoYW5nZSB5b3UncmUgcHJvcG9zaW5nIGluIHRoZSBKaXJhIGlzc3VlIHRyYWNrZXIuCisgMS4gQ29udHJpYnV0ZSB5b3VyIGNvZGUgY2hhbmdlcyB1c2luZyB0aGUgR2l0SHViIHB1bGwgcmVxdWVzdCBtZXRob2Q6CisKKyMjIENvbnRyaWJ1dGluZyB2aWEgUGF0Y2ggIyMKKworU29tZSBjaGFuZ2VzIGRvIG5vdCByZXF1aXJlIGEgYnVpbGQsIGZvciBleGFtcGxlIGluIGRvY3VtZW50YXRpb24uICBGb3IgY2hhbmdlcyB0aGF0IGFyZSBub3QgY29kZSBvciBidWlsZCByZWxhdGVkLCB5b3UgY2FuIHN1Ym1pdCBhIHBhdGNoIG9uIEppcmEgZm9yIHJldmlldy4gIFRvIGNyZWF0ZSBhIHBhdGNoIGZyb20gY2hhbmdlcyBpbiB5b3VyIGxvY2FsIGRpcmVjdG9yeToKKworICAgIGdpdCBkaWZmID4gLi4vVEhSSUZULU5OTk4ucGF0Y2gKKwordGhlbiB3YWl0IGZvciBjb250cmlidXRvcnMgb3IgY29tbWl0dGVycyB0byByZXZpZXcgeW91ciBjaGFuZ2VzLCBhbmQgdGhlbiBmb3IgYSBjb21taXR0ZXIgdG8gYXBwbHkgeW91ciBwYXRjaC4KKworIyMgR2l0SHViIHJlY2lwZXMgZm9yIFB1bGwgUmVxdWVzdHMgIyMKKworU29tZXRpbWVzIGNvbW1taXR0ZXJzIG1heSBhc2sgeW91IHRvIHRha2UgYWN0aW9ucyBpbiB5b3VyIHB1bGwgcmVxdWVzdHMuICBIZXJlIGFyZSBzb21lIHJlY2lwZXMgdGhhdCB3aWxsIGhlbHAgeW91IGFjY29tcGxpc2ggdGhvc2UgcmVxdWVzdHMuICBUaGVzZSBleGFtcGxlcyBhc3N1bWUgeW91IGFyZSB3b3JraW5nIG9uIEppcmEgaXNzdWUgVEhSSUZULTk5OTkuICBZb3Ugc2hvdWxkIGFsc28gYmUgZmFtaWxpYXIgd2l0aCB0aGUgW3Vwc3RyZWFtXShodHRwczovL2hlbHAuZ2l0aHViLmNvbS9hcnRpY2xlcy9zeW5jaW5nLWEtZm9yay8pIHJlcG9zaXRvcnkgY29uY2VwdC4KKworIyMjIFNxdWFzaCB5b3VyIGNoYW5nZXMgIyMjCisKK0lmIHlvdSBoYXZlIG5vdCBzdWJtaXR0ZWQgYSBwdWxsIHJlcXVlc3QgeWV0LCBvciBpZiB5b3UgaGF2ZSBub3QgeWV0IHJlYmFzZWQgeW91ciBleGlzdGluZyBwdWxsIHJlcXVlc3QsIHlvdSBjYW4gc3F1YXNoIGFsbCB5b3VyIGNvbW1pdHMgZG93biB0byBhIHNpbmdsZSBjb21taXQuICBUaGlzIG1ha2VzIGxpZmUgZWFzaWVyIGZvciB0aGUgY29tbWl0dGVycy4gIElmIHlvdXIgcHVsbCByZXF1ZXN0IG9uIEdpdEh1YiBoYXMgbW9yZSB0aGFuIG9uZSBjb21taXQsIHlvdSBzaG91bGQgZG8gdGhpcy4KKworMS4gVXNlIHRoZSBjb21tYW5kIGBgZ2l0IGxvZ2BgIHRvIGlkZW50aWZ5IGhvdyBtYW55IGNvbW1pdHMgeW91IG1hZGUgc2luY2UgeW91IGJlZ2FuLgorMi4gVXNlIHRoZSBjb21tYW5kIGBgZ2l0IHJlYmFzZSAtaSBIRUFEfk5gYCB3aGVyZSBOIGlzIHRoZSBudW1iZXIgb2YgY29tbWl0cy4KKzMuIExlYXZlICJwdWxsIiBpbiB0aGUgZmlyc3QgbGluZS4KKzQuIENoYW5nZSBhbGwgb3RoZXIgbGluZXMgZnJvbSAicHVsbCIgdG8gImZpeHVwIi4KKzUuIEFsbCB5b3VyIGNoYW5nZXMgYXJlIG5vdyBpbiBhIHNpbmdsZSBjb21taXQuCisKK0lmIHlvdSBhbHJlYWR5IGhhdmUgYSBwdWxsIHJlcXVlc3Qgb3V0c3RhbmRpbmcsIHlvdSB3aWxsIG5lZWQgdG8gZG8gYSAiZm9yY2UgcHVzaCIgdG8gb3ZlcndyaXRlIGl0IHNpbmNlIHlvdSBjaGFuZ2VkIHlvdXIgY29tbWl0IGhpc3Rvcnk6CisKKyAgICBnaXQgcHVzaCAtdSBvcmlnaW4gVEhSSUZULTk5OTkgLS1mb3JjZQorCitBIG1vcmUgZGV0YWlsZWQgd2Fsa3Rocm91Z2ggb2YgYSBzcXVhc2ggY2FuIGJlIGZvdW5kIGF0IFtHaXQgUmVhZHldKGh0dHA6Ly9naXRyZWFkeS5jb20vYWR2YW5jZWQvMjAwOS8wMi8xMC9zcXVhc2hpbmctY29tbWl0cy13aXRoLXJlYmFzZS5odG1sKS4KKworIyMjIFJlYmFzZSB5b3VyIHB1bGwgcmVxdWVzdCAjIyMKKworSWYgeW91ciBwdWxsIHJlcXVlc3QgaGFzIGEgY29uZmxpY3Qgd2l0aCBtYXN0ZXIsIGl0IG5lZWRzIHRvIGJlIHJlYmFzZWQ6CisKKyAgICBnaXQgY2hlY2tvdXQgVEhSSUZULTk5OTkKKyAgICBnaXQgcmViYXNlIHVwc3RyZWFtIG1hc3RlcgorICAgICAgKHJlc29sdmUgYW55IGNvbmZsaWN0cywgbWFrZSBzdXJlIGl0IGJ1aWxkcykKKyAgICBnaXQgcHVzaCAtdSBvcmlnaW4gVEhSSUZULTk5OTkgLS1mb3JjZQorCisjIyMgRml4IGEgYmFkIG1lcmdlICMjIworCitJZiB5b3VyIHB1bGwgcmVxdWVzdCBjb250YWlucyBjb21taXRzIHRoYXQgYXJlIG5vdCB5b3VycywgdGhlbiB5b3Ugc2hvdWxkIHVzZSB0aGUgZm9sbG93aW5nIHRlY2huaXF1ZSB0byBmaXggdGhlIGJhZCBtZXJnZSBpbiB5b3VyIGJyYW5jaDoKKworICAgIGdpdCBjaGVja291dCBtYXN0ZXIKKyAgICBnaXQgcHVsbCB1cHN0cmVhbSBtYXN0ZXIKKyAgICBnaXQgY2hlY2tvdXQgLWIgVEhSSUZULTk5OTktdGFrZS0yCisgICAgZ2l0IGNoZXJyeS1waWNrIC4uLgorICAgICAgICAocGljayBvbmx5IHlvdXIgY29tbWl0cyBmcm9tIHlvdXIgb3JpZ2luYWwgcHVsbCByZXF1ZXN0IGluIGFzY2VuZGluZyBjaHJvbm9sb2dpY2FsIG9yZGVyKQorICAgIHNxdWFzaCB5b3VyIGNoYW5nZXMgdG8gYSBzaW5nbGUgY29tbWl0IGlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgKHNlZSBhYm92ZSkKKyAgICBnaXQgcHVzaCAtdSBvcmlnaW4gVEhSSUZULTk5OTktdGFrZS0yOlRIUklGVC05OTk5CisKK1RoaXMgcHJvY2VkdXJlIHdpbGwgYXBwbHkgb25seSB5b3VyIGNvbW1pdHMgaW4gb3JkZXIgdG8gdGhlIGN1cnJlbnQgbWFzdGVyLCB0aGVuIHlvdSB3aWxsIHNxdWFzaCB0aGVtIHRvIGEgc2luZ2xlIGNvbW1pdCwgYW5kIHRoZW4geW91IGZvcmNlIHB1c2ggeW91ciBsb2NhbCBUSFJJRlQtOTk5OS10YWtlLTIgaW50byByZW1vdGUgVEhSSUZULTk5OTkgd2hpY2ggcmVwcmVzZW50cyB5b3VyIHB1bGwgcmVxdWVzdCwgcmVwbGFjaW5nIGFsbCB0aGUgY29tbWl0cyB3aXRoIHRoZSBuZXcgb25lLgorCisgCmRpZmYgLS1naXQgYS9MQU5HVUFHRVMubWQgYi9MQU5HVUFHRVMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRhM2NmNQotLS0gL2Rldi9udWxsCisrKyBiL0xBTkdVQUdFUy5tZApAQCAtMCwwICsxLDM1NSBAQAorIyBBcGFjaGUgVGhyaWZ0IExhbmd1YWdlIFN1cHBvcnQgIworCitMYXN0IE1vZGlmaWVkOiAyMDE4LTEyLTE3CisKK0d1aWRhbmNlIEZvcjogMC4xMi4wIG9yIGxhdGVyCisKK1RocmlmdCBzdXBwb3J0cyBtYW55IHByb2dyYW1taW5nIGxhbmd1YWdlcyBhbmQgaGFzIGFuIGltcHJlc3NpdmUgdGVzdCBzdWl0ZSB0aGF0IGV4ZXJjaXNlcyBtb3N0IG9mIHRoZSBsYW5ndWFnZXMsIHByb3RvY29scywgYW5kIHRyYW5zcG9ydHMgdGhhdCByZXByZXNlbnRzIGEgbWF0cml4IG9mIHRob3VzYW5kcyBvZiBwb3NzaWJsZSBjb21iaW5hdGlvbnMuICBFYWNoIGxhbmd1YWdlIHR5cGljYWxseSBoYXMgYSBtaW5pbXVtIHJlcXVpcmVkIHZlcnNpb24gYXMgd2VsbCBhcyBzdXBwb3J0IGxpYnJhcmllcyAtIHNvbWUgbWFuZGF0b3J5IGFuZCBzb21lIG9wdGlvbmFsLiAgQWxsIG9mIHRoaXMgaW5mb3JtYXRpb24gaXMgcHJvdmlkZWQgYmVsb3cgdG8gaGVscCB5b3UgYXNzZXNzIHdoZXRoZXIgeW91IGNhbiB1c2UgQXBhY2hlIFRocmlmdCB3aXRoIHlvdXIgcHJvamVjdC4gIE9idmlvdXNseSB0aGlzIGlzIGEgY29tcGxleCBtYXRyaXggdG8gbWFpbnRhaW4gYW5kIG1heSBub3QgYmUgY29ycmVjdCBpbiBhbGwgY2FzZXMgLSBpZiB5b3Ugc3BvdCBhbiBlcnJvciBwbGVhc2UgaW5mb3JtIHRoZSBkZXZlbG9wZXJzIHVzaW5nIHRoZSBtYWlsaW5nIGxpc3QuCisKK0FwYWNoZSBUaHJpZnQgaGFzIGEgY2hvaWNlIG9mIHR3byBidWlsZCBzeXN0ZW1zLiAgVGhlIGBhdXRvY29uZmAgYnVpbGQgc3lzdGVtIGlzIHRoZSBtb3N0IGNvbXBsZXRlIGJ1aWxkIGFuZCBpcyB1c2VkIHRvIGJ1aWxkIGFsbCBzdXBwb3J0ZWQgbGFuZ3VhZ2VzLiAgVGhlIGBjbWFrZWAgYnVpbGQgc3lzdGVtIGhhcyBiZWVuIGRlc2lnbmF0ZWQgYnkgdGhlIHByb2plY3QgdG8gcmVwbGFjZSBgYXV0b2NvbmZgIGhvd2V2ZXIgdGhpcyB0cmFuc2l0aW9uIHdpbGwgdGFrZSBxdWl0ZSBzb21lIHRpbWUgdG8gY29tcGxldGUuCisKK1RoZSBMYW5ndWFnZS9MaWJyYXJ5IExldmVscyBpbmRpY2F0ZSB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB2ZXJzaW9ucyB0aGF0IGFyZSB1c2VkIGluIHRoZSBbY29udGludW91cyBpbnRlZ3JhdGlvbiBlbnZpcm9ubWVudHNdKGJ1aWxkL2RvY2tlci9SRUFETUUubWQpIChBcHB2ZXlvciwgVHJhdmlzKSBmb3IgQXBhY2hlIFRocmlmdC4gIE90aGVyIGxhbmd1YWdlIGxldmVscyBtYXkgYmUgc3VwcG9ydGVkIGZvciBlYWNoIGxhbmd1YWdlLCBob3dldmVyIHRlc3RlZCBsZXNzIHRob3JvdWdobHk7IGNoZWNrIHRoZSBSRUFETUUgZmlsZSBpbnNpZGUgZWFjaCBsaWIgZGlyZWN0b3J5IGZvciBhZGRpdGlvbmFsIGRldGFpbHMuICBOb3RlIHRoYXQgd2hpbGUgYSBsYW5ndWFnZSBtYXkgY29udGFpbiBzdXBwb3J0IGZvciBwcm90b2NvbHMsIHRyYW5zcG9ydHMsIGFuZCBzZXJ2ZXJzLCB0aGUgZXh0ZW50IHRvIHdoaWNoIGVhY2ggaXMgdGVzdGVkIGFzIHBhcnQgb2YgdGhlIG92ZXJhbGwgYnVpbGQgcHJvY2VzcyB2YXJpZXMuICBUaGUgZGVmaW5pdGl2ZSBpbnRlZ3JhdGlvbiB0ZXN0IGZvciB0aGUgcHJvamVjdCBpcyBjYWxsZWQgdGhlICJjcm9zcyIgdGVzdCB3aGljaCBleGVjdXRlcyBhIHRlc3QgbWF0cml4IHdpdGggY2xpZW50cyBhbmQgc2VydmVycyBjb21tdW5pY2F0aW5nIGFjcm9zcyBsYW5ndWFnZXMuCisKKzx0YWJsZSBzdHlsZT0iZm9udC1zaXplOiA2MCU7IHBhZGRpbmc6IDFweDsiPgorPHRoZWFkPgorPHRyPgorPHRoIHJvd3NwYW49Mj5MYW5ndWFnZTwvdGg+Cis8dGggcm93c3Bhbj0yIGFsaWduPWNlbnRlcj5TaW5jZTwvdGg+Cis8dGggY29sc3Bhbj0yIGFsaWduPWNlbnRlcj5CdWlsZCBTeXN0ZW1zPC90aD4KKzx0aCBjb2xzcGFuPTIgYWxpZ249Y2VudGVyPkxhbmcvTGliIExldmVscyAoVGVzdGVkKTwvdGg+Cis8dGggY29sc3Bhbj02IGFsaWduPWNlbnRlcj5Mb3ctTGV2ZWwgVHJhbnNwb3J0czwvdGg+Cis8dGggY29sc3Bhbj0zIGFsaWduPWNlbnRlcj5UcmFuc3BvcnQgV3JhcHBlcnM8L3RoPgorPHRoIGNvbHNwYW49NCBhbGlnbj1jZW50ZXI+UHJvdG9jb2xzPC90aD4KKzx0aCBjb2xzcGFuPTUgYWxpZ249Y2VudGVyPlNlcnZlcnM8L3RoPgorPHRoIHJvd3NwYW49Mj5PcGVuIElzc3VlczwvdGg+Cis8L3RyPgorPHRyPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGg+YXV0b2NvbmY8L3RoPjx0aD5jbWFrZTwvdGg+Cis8IS0tIExhbmcvTGliIExldmVscyAtLS0tLS0tPjx0aD5NaW48L3RoPjx0aD5NYXg8L3RoPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGg+PGEgaHJlZj0iaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVW5peF9kb21haW5fc29ja2V0Ij5Eb21haW48L2E+PC90aD48dGg+Jm5ic3A7RmlsZSZuYnNwOzwvdGg+PHRoPk1lbW9yeTwvdGg+PHRoPiZuYnNwO1BpcGUmbmJzcDs8L3RoPjx0aD5Tb2NrZXQ8L3RoPjx0aD4mbmJzcDtUTFMmbmJzcDs8L3RoPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGg+RnJhbWVkPC90aD48dGg+Jm5ic3A7aHR0cCZuYnNwOzwvdGg+PHRoPiZuYnNwO3psaWImbmJzcDs8L3RoPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGg+PGEgaHJlZj0iZG9jL3NwZWNzL3RocmlmdC1iaW5hcnktcHJvdG9jb2wubWQiPkJpbmFyeTwvYT48L3RoPjx0aD48YSBocmVmPSJkb2Mvc3BlY3MvdGhyaWZ0LWNvbXBhY3QtcHJvdG9jb2wubWQiPkNvbXBhY3Q8L2E+PC90aD48dGg+Jm5ic3A7SlNPTiZuYnNwOzwvdGg+PHRoPk11bHRpcGxleDwvdGg+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0aD5Gb3JraW5nPC90aD48dGg+Tm9uYmxvY2tpbmc8L3RoPjx0aD5TaW1wbGU8L3RoPjx0aD5UaHJlYWRlZDwvdGg+PHRoPlRocmVhZFBvb2w8L3RoPgorPC90cj4KKzwvdGhlYWQ+Cis8dGJvZHk+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL2FzMy9SRUFETUUubWQiPkFjdGlvblNjcmlwdDwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC4zLjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkIGNvbHNwYW49Mj5BY3Rpb25TY3JpcHQgMzwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQvY29tcG9uZW50LzEyMzEzNzIyIj5BY3Rpb25TY3JpcHQ8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL2NfZ2xpYi9SRUFETUUubWQiPkMgKGdsaWIpPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjYuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQ+Mi40OC4yPC90ZD48dGQ+Mi41Ni4wPC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC9jb21wb25lbnQvMTIzMTM4NTQiPkMgKGdsaWIpPC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9ImxpYi9jcHAvUkVBRE1FLm1kIj5DKys8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuMi4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZCBjb2xzcGFuPTI+QysrOTg8L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMxMjMxMyI+QysrPC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9ImxpYi9jc2hhcnAvUkVBRE1FLm1kIj5DIzwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC4yLjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkPi5ORVQmbmJzcDszLjUgLyBtb25vJm5ic3A7My4yLjguMDwvdGQ+PHRkPi5ORVQmbmJzcDs0LjYuMSAvIG1vbm8mbmJzcDs0LjYuMi43PC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC9jb21wb25lbnQvMTIzMTIzNjIiPkMjICguTkVUKTwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvY29jb2EvUkVBRE1FLm1kIj5Db2NvYTwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC4yLjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkIGNvbHNwYW49Mj51bmtub3duPC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC9jb21wb25lbnQvMTIzMTIzOTgiPkNvY29hPC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9ImxpYi9jbC9SRUFETUUubWQiPkNvbW1vbiBMaXNwPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjEyLjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkPlNCQ0wgMS40LjU8L3RkPjx0ZD5TQkNMIDEuNC4xNTwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtODIiPkNvbW1vbiBMaXNwPC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9ImxpYi9kL1JFQURNRS5tZCI+RGxhbmc8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuOS4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZD4yLjA3NS4xPC90ZD48dGQ+Mi4wODMuMjwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQvY29tcG9uZW50LzEyMzE3OTA0Ij5EPC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9ImxpYi9kYXJ0L1JFQURNRS5tZCI+RGFydDwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC4xMC4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZD4xLjIyLjE8L3RkPjx0ZD4xLjI0LjM8L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMyODAwNiI+RGFydDwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvZGVscGhpL1JFQURNRS5tZCI+RGVscGhpPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjguMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQ+MjAxMDwvdGQ+PHRkPnVua25vd248L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMxNjYwMSI+RGVscGhpPC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9ImxpYi9uZXRjb3JlL1JFQURNRS5tZCI+Lk5FVCBDb3JlPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjExLjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkPjIuMS40PC90ZD48dGQ+Mi4yLjEwMTwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQvY29tcG9uZW50LzEyMzMxMTc2Ij4uTkVUIENvcmU8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL2VybC9SRUFETUUubWQiPkVybGFuZzwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC4zLjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkPjE4LjM8L3RkPjx0ZD4yMC4wLjQ8L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMxMjM5MCI+RXJsYW5nPC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9ImxpYi9nby9SRUFETUUubWQiPkdvPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjcuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQ+MS43LjY8L3RkPjx0ZD4xLjExLjQ8L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMxNDMwNyI+R288L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL2hzL1JFQURNRS5tZCI+SGFza2VsbDwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC41LjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkPjcuMTAuMzwvdGQ+PHRkPjguMC4yPC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC9jb21wb25lbnQvMTIzMTI3MDQiPkhhc2tlbGw8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL2hheGUvUkVBRE1FLm1kIj5IYXhlPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjkuMzwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQ+My4yLjE8L3RkPjx0ZD4zLjQuNDwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQvY29tcG9uZW50LzEyMzI0MzQ3Ij5IYXhlPC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9ImxpYi9qYXZhL1JFQURNRS5tZCI+SmF2YSAoU0UpPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjIuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQ+MS44LjBfMTUxPC90ZD48dGQ+MS44LjBfMTkxPC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC9jb21wb25lbnQvMTIzMTIzMTQiPkphdmEgU0U8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL2phdmFtZS9SRUFETUUubWQiPkphdmEgKE1FKTwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC41LjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkIGNvbHNwYW49Mj51bmtub3duPC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC9jb21wb25lbnQvMTIzMTM3NTkiPkphdmEgTUU8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL2pzL1JFQURNRS5tZCI+SmF2YXNjcmlwdDwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC4zLjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkIGNvbHNwYW49Mj51bmtub3duPC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC9jb21wb25lbnQvMTIzMTM0MTgiPkphdmFzY3JpcHQ8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL2x1YS9SRUFETUUubWQiPkx1YTwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC45LjI8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkPjUuMS41PC90ZD48dGQ+NS4yLjQ8L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMyMjY1OSI+THVhPC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9ImxpYi9ub2RlanMvUkVBRE1FLm1kIj5ub2RlLmpzPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjYuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQ+Ni54PC90ZD48dGQ+OC54PC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC9jb21wb25lbnQvMTIzMTQzMjAiPm5vZGUuanM8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL25vZGV0cy9SRUFETUUubWQiPm5vZGUudHM8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuMTIuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQ+My4xLjY8L3RkPjx0ZD48L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9pc3N1ZXMvP2pxbD1wcm9qZWN0JTIwJTNEJTIwVEhSSUZUJTIwQU5EJTIwcmVzb2x1dGlvbiUyMCUzRCUyMFVucmVzb2x2ZWQlMjBhbmQlMjBDb21wb25lbnQlMjBpbiUyMCglMjJUeXBlU2NyaXB0JTIwLSUyMExpYnJhcnklMjIpJTIwT1JERVIlMjBCWSUyMHByaW9yaXR5JTIwREVTQyUyQyUyMHVwZGF0ZWQlMjBERVNDIj5ub2RlLnRzPC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9ImxpYi9vY2FtbC9SRUFETUUubWQiPk9DYW1sPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjIuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQgY29sc3Bhbj0yPjQuMDQuMDwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQvY29tcG9uZW50LzEyMzEzNjYwIj5PQ2FtbDwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvcGVybC9SRUFETUUubWQiPlBlcmw8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuMi4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZD41LjIyLjE8L3RkPjx0ZD41LjI2LjE8L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMxMjMxMiI+UGVybDwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvcGhwL1JFQURNRS5tZCI+UEhQPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjIuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQ+Ny4wLjIyPC90ZD48dGQ+Ny4yLjEwPC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC9jb21wb25lbnQvMTIzMTI0MzEiPlBIUDwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvcHkvUkVBRE1FLm1kIj5QeXRob248L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuMi4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZD4yLjcuMTIsIDMuNS4yPC90ZD48dGQ+Mi43LjE1cmMxLCAzLjYuNzwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQvY29tcG9uZW50LzEyMzEyMzE1Ij5QeXRob248L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL3JiL1JFQURNRS5tZCI+UnVieTwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC4yLjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkPjIuMy4xcDExMjwvdGQ+PHRkPjIuNS4xcDU3PC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC9jb21wb25lbnQvMTIzMTIzMTYiPlJ1Ynk8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL3JzL1JFQURNRS5tZCI+UnVzdDwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC4xMS4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZD4xLjE3LjA8L3RkPjx0ZD4xLjMwLjA8L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMzMTQyMCI+UnVzdDwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvc3QvUkVBRE1FLm1kIj5TbWFsbHRhbGs8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuMi4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZCBjb2xzcGFuPTI+dW5rbm93bjwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQvY29tcG9uZW50LzEyMzEzODYxIj5TbWFsbHRhbGs8L2E+PC90ZD4KKzwvdHI+Cis8L3Rib2R5PgorPHRmb290PgorPHRyPgorPHRoIHJvd3NwYW49Mj5MYW5ndWFnZTwvdGg+Cis8dGggcm93c3Bhbj0yIGFsaWduPWNlbnRlcj5TaW5jZTwvdGg+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0aD5hdXRvY29uZjwvdGg+PHRoPmNtYWtlPC90aD4KKzwhLS0gTGFuZy9MaWIgTGV2ZWxzIC0tLS0tLS0+PHRoPk1pbjwvdGg+PHRoPk1heDwvdGg+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0aD48YSBocmVmPSJodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Vbml4X2RvbWFpbl9zb2NrZXQiPkRvbWFpbjwvYT48L3RoPjwvdGg+PHRoPiZuYnNwO0ZpbGUmbmJzcDs8L3RoPjx0aD5NZW1vcnk8L3RoPjx0aD4mbmJzcDtQaXBlJm5ic3A7PC90aD48dGg+U29ja2V0PC90aD48dGg+Jm5ic3A7VExTJm5ic3A7PC90aD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRoPkZyYW1lZDwvdGg+PHRoPiZuYnNwO2h0dHAmbmJzcDs8L3RoPjx0aD4mbmJzcDt6bGliJm5ic3A7PC90aD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRoPjxhIGhyZWY9ImRvYy9zcGVjcy90aHJpZnQtYmluYXJ5LXByb3RvY29sLm1kIj5CaW5hcnk8L2E+PC90aD48dGg+PGEgaHJlZj0iZG9jL3NwZWNzL3RocmlmdC1jb21wYWN0LXByb3RvY29sLm1kIj5Db21wYWN0PC9hPjwvdGg+PHRoPiZuYnNwO0pTT04mbmJzcDs8L3RoPjx0aD5NdWx0aXBsZXg8L3RoPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGg+Rm9ya2luZzwvdGg+PHRoPk5vbmJsb2NraW5nPC90aD48dGg+U2ltcGxlPC90aD48dGg+VGhyZWFkZWQ8L3RoPjx0aD5UaHJlYWRQb29sPC90aD4KKzx0aCByb3dzcGFuPTI+T3BlbiBJc3N1ZXM8L3RoPgorPC90cj4KKzx0cj4KKzx0aCBjb2xzcGFuPTIgYWxpZ249Y2VudGVyPkJ1aWxkIFN5c3RlbXM8L3RoPgorPHRoIGNvbHNwYW49MiBhbGlnbj1jZW50ZXI+TGFuZy9MaWIgTGV2ZWxzIChUZXN0ZWQpPC90aD4KKzx0aCBjb2xzcGFuPTYgYWxpZ249Y2VudGVyPkxvdy1MZXZlbCBUcmFuc3BvcnRzPC90aD4KKzx0aCBjb2xzcGFuPTMgYWxpZ249Y2VudGVyPlRyYW5zcG9ydCBXcmFwcGVyczwvdGg+Cis8dGggY29sc3Bhbj00IGFsaWduPWNlbnRlcj5Qcm90b2NvbHM8L3RoPgorPHRoIGNvbHNwYW49NSBhbGlnbj1jZW50ZXI+U2VydmVyczwvdGg+Cis8L3RyPgorPC90Zm9vdD4KKzwvdGFibGU+CmRpZmYgLS1naXQgYS9MSUNFTlNFIGIvTElDRU5TRQppbmRleCA4ZDVlMDgyLi4zYjZkN2Q3IDEwMDY0NAotLS0gYS9MSUNFTlNFCisrKyBiL0xJQ0VOU0UKQEAgLTIyNiwyOCArMjI2LDE0IEBACiAjICAgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuCiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Gb3IgdGhlIGNvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L21kNS5bY2hdIGNvbXBvbmVudHM6CitGb3IgdGhlIGxpYi9ub2RlanMvbGliL3RocmlmdC9qc29uX3BhcnNlLmpzOgogCiAvKgotICBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDIgQWxhZGRpbiBFbnRlcnByaXNlcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgICAganNvbl9wYXJzZS5qcworICAgIDIwMTUtMDUtMDIKKyAgICBQdWJsaWMgRG9tYWluLgorICAgIE5PIFdBUlJBTlRZIEVYUFJFU1NFRCBPUiBJTVBMSUVELiBVU0UgQVQgWU9VUiBPV04gUklTSy4KIAotICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAotICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCi0gIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCi0KLSAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCi0gIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKLSAgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgotCi0gIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90Ci0gICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCi0gICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQotICAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgotICAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQotICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCi0gIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCi0KLSAgTC4gUGV0ZXIgRGV1dHNjaAotICBnaG9zdEBhbGFkZGluLmNvbQotCi0gKi8KKyovCisoQnkgRG91Z2xhcyBDcm9ja2ZvcmQgPGRvdWdsYXNAY3JvY2tmb3JkLmNvbT4pCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUuYW0gYi9NYWtlZmlsZS5hbQppbmRleCA0MmM4MmUyLi41MTE0NTJkIDEwMDc1NQotLS0gYS9NYWtlZmlsZS5hbQorKysgYi9NYWtlZmlsZS5hbQpAQCAtMTksNyArMTksMTUgQEAKIAogQUNMT0NBTF9BTUZMQUdTID0gLUkgLi9hY2xvY2FsCiAKK2lmIFdJVEhfUExVR0lOCisjIFRvIGVuYWJsZSBib290c3RyYXAsIGJ1aWxkIG9yZGVyIGlzIGxpYi9jcHAgLT4gY29tcGlsZXIgLT4gb3RoZXJzCitTVUJESVJTID0gbGliL2NwcCBjb21waWxlci9jcHAgbGliCitpZiBXSVRIX1RFU1RTCitTVUJESVJTICs9IGxpYi9jcHAvdGVzdAorZW5kaWYKK2Vsc2UKIFNVQkRJUlMgPSBjb21waWxlci9jcHAgbGliCitlbmRpZgogCiBpZiBXSVRIX1RFU1RTCiBTVUJESVJTICs9IHRlc3QKQEAgLTM1LDMwICs0Myw0MyBAQAogCWZpbmQgJChkaXN0ZGlyKSAtdHlwZSBkIFwoIC1pbmFtZSAiLnN2biIgLW9yIC1pbmFtZSAiLmdpdCIgXCkgfCB4YXJncyBybSAtcmYKIAogcHJpbnQtdmVyc2lvbjoKLQlAZWNobyAkKFZFUlNJT04pCisJQGVjaG8gJChQQUNLQUdFX1ZFUlNJT04pCiAKIC5QSE9OWTogcHJlY3Jvc3MgY3Jvc3MKIHByZWNyb3NzLSU6IGFsbAogCSQoTUFLRSkgLUMgJCogcHJlY3Jvc3MKIHByZWNyb3NzOiBhbGwgcHJlY3Jvc3MtdGVzdCBwcmVjcm9zcy1saWIKIAotIyBUT0RPOiBnZW5lcmF0ZSAtLXNlcnZlciBhbmQgLS1jbGllbnQgc3dpdGNoZXMgZnJvbSAiLS13aXRoKG91dCktLi4uIiBidWlsZCBmbGFncwotCi0KIGVtcHR5IDo9CiBzcGFjZSA6PSAkKGVtcHR5KSAkKGVtcHR5KQogY29tbWEgOj0gLAogCi1DUk9TU19MQU5HUyA9IEBNQVlCRV9DUFBAIEBNQVlCRV9DX0dMSUJAIEBNQVlCRV9KQVZBQCBATUFZQkVfQ1NIQVJQQCBATUFZQkVfUFlUSE9OQCBATUFZQkVfUlVCWUAgQE1BWUJFX0hBU0tFTExAIEBNQVlCRV9QRVJMQCBATUFZQkVfUEhQQCBATUFZQkVfR09AIEBNQVlCRV9OT0RFSlNACitDUk9TU19MQU5HUyA9IEBNQVlCRV9DUFBAIEBNQVlCRV9DX0dMSUJAIEBNQVlCRV9DTEAgQE1BWUJFX0RAIEBNQVlCRV9KQVZBQCBATUFZQkVfQ1NIQVJQQCBATUFZQkVfUFlUSE9OQCBATUFZQkVfUFkzQCBATUFZQkVfUlVCWUAgQE1BWUJFX0hBU0tFTExAIEBNQVlCRV9QRVJMQCBATUFZQkVfUEhQQCBATUFZQkVfR09AIEBNQVlCRV9OT0RFSlNAIEBNQVlCRV9EQVJUQCBATUFZQkVfRVJMQU5HQCBATUFZQkVfTFVBQCBATUFZQkVfUlNAIEBNQVlCRV9ET1RORVRDT1JFQCBATUFZQkVfTk9ERVRTQAogQ1JPU1NfTEFOR1NfQ09NTUFfU0VQQVJBVEVEID0gJChzdWJzdCAkKHNwYWNlKSwkKGNvbW1hKSwkKENST1NTX0xBTkdTKSkKIAotY3Jvc3M6IHByZWNyb3NzCi0JJChQWVRIT04pIHRlc3QvdGVzdC5weSAtcyAtLXNlcnZlciAkKENST1NTX0xBTkdTX0NPTU1BX1NFUEFSQVRFRCkgLS1jbGllbnQgJChDUk9TU19MQU5HU19DT01NQV9TRVBBUkFURUQpCitpZiBXSVRIX1BZMworQ1JPU1NfUFk9JChQWVRIT04zKQorZWxzZQorQ1JPU1NfUFk9JChQWVRIT04pCitlbmRpZgorCitpZiBXSVRIX1BZVEhPTgorY3Jvc3NmZWF0dXJlOiBwcmVjcm9zcworCSQoQ1JPU1NfUFkpIHRlc3QvdGVzdC5weSAtLXJldHJ5LWNvdW50IDUgLS1mZWF0dXJlcyAuKiAtLXNraXAta25vd24tZmFpbHVyZXMgLS1zZXJ2ZXIgJChDUk9TU19MQU5HU19DT01NQV9TRVBBUkFURUQpCitlbHNlCisjIGZlYXR1cmUgdGVzdCBuZWVkcyBweXRob24gYnVpbGQKK2Nyb3NzZmVhdHVyZToKK2VuZGlmCisKK2Nyb3NzLSU6IHByZWNyb3NzIGNyb3NzZmVhdHVyZQorCSQoQ1JPU1NfUFkpIHRlc3QvdGVzdC5weSAtLXJldHJ5LWNvdW50IDUgLS1za2lwLWtub3duLWZhaWx1cmVzIC0tc2VydmVyICQoQ1JPU1NfTEFOR1NfQ09NTUFfU0VQQVJBVEVEKSAtLWNsaWVudCAkKENST1NTX0xBTkdTX0NPTU1BX1NFUEFSQVRFRCkgLS1yZWdleCAiJCoiCisKK2Nyb3NzOiBjcm9zcy0uKgogCiBUSU1FUyA9IDEgMiAzCiBmYWlsOiBwcmVjcm9zcwotCSQoUFlUSE9OKSB0ZXN0L3Rlc3QucHkgfHwgdHJ1ZQotCSQoUFlUSE9OKSB0ZXN0L3Rlc3QucHkgLS11cGRhdGUtZXhwZWN0ZWQtZmFpbHVyZXM9b3ZlcndyaXRlCisJJChDUk9TU19QWSkgdGVzdC90ZXN0LnB5IHx8IHRydWUKKwkkKENST1NTX1BZKSB0ZXN0L3Rlc3QucHkgLS11cGRhdGUtZXhwZWN0ZWQtZmFpbHVyZXM9b3ZlcndyaXRlCiAJJChmb3JlYWNoIHZhciwkKFRJTUVTKSx0ZXN0L3Rlc3QucHkgLXMgfHwgdHJ1ZTt0ZXN0L3Rlc3QucHkgLS11cGRhdGUtZXhwZWN0ZWQtZmFpbHVyZXM9bWVyZ2U7KQogCiBjb2Rlc3BlbGxfc2tpcF9maWxlcyA9IFwKQEAgLTkwLDkgKzExMSwxMyBAQAogCS5jbGFuZy1mb3JtYXQgXAogCS5lZGl0b3Jjb25maWcgXAogCS50cmF2aXMueW1sIFwKKwkucnVzdGZtdC50b21sIFwKKwkuZG9ja2VyaWdub3JlIFwKIAlhcHB2ZXlvci55bWwgXAogCWJvd2VyLmpzb24gXAogCWJ1aWxkIFwKKwlib290c3RyYXAuc2ggXAorCWNsZWFudXAuc2ggXAogCUNNYWtlTGlzdHMudHh0IFwKIAljb21wb3Nlci5qc29uIFwKIAljb250cmliIFwKQEAgLTEwMCwxMSArMTI1LDExIEBACiAJZGViaWFuIFwKIAlkb2MgXAogCWRvYXAucmRmIFwKLQlqc29uLXNjaGVtYS5qc29uIFwKIAlwYWNrYWdlLmpzb24gXAotCXJhdF9leGNsdWRlIFwKIAlzb25hci1wcm9qZWN0LnByb3BlcnRpZXMgXAorCUxBTkdVQUdFUy5tZCBcCiAJTElDRU5TRSBcCiAJQ0hBTkdFUyBcCiAJTk9USUNFIFwKLQlSRUFETUUubWQKKwlSRUFETUUubWQgXAorCVRocmlmdC5wb2RzcGVjCmRpZmYgLS1naXQgYS9OT1RJQ0UgYi9OT1RJQ0UKaW5kZXggYzIzOTk1YS4uOTAyZGM4ZCAxMDA2NDQKLS0tIGEvTk9USUNFCisrKyBiL05PVElDRQpAQCAtMSw1ICsxLDUgQEAKIEFwYWNoZSBUaHJpZnQKLUNvcHlyaWdodCAyMDA2LTIwMTAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorQ29weXJpZ2h0IDIwMDYtMjAxNyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAKIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYXQKLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KZGlmZiAtLWdpdCBhL1JFQURNRS5tZCBiL1JFQURNRS5tZAppbmRleCBhNTUzODlhLi5kMDllNmUxIDEwMDY0NAotLS0gYS9SRUFETUUubWQKKysrIGIvUkVBRE1FLm1kCkBAIC0xLDcgKzEsNDMgQEAKIEFwYWNoZSBUaHJpZnQKID09PT09PT09PT09PT0KIAotTGFzdCBNb2RpZmllZDogMjAxNC0wMy0xNgorSW50cm9kdWN0aW9uCis9PT09PT09PT09PT0KKworVGhyaWZ0IGlzIGEgbGlnaHR3ZWlnaHQsIGxhbmd1YWdlLWluZGVwZW5kZW50IHNvZnR3YXJlIHN0YWNrIHdpdGggYW4KK2Fzc29jaWF0ZWQgY29kZSBnZW5lcmF0aW9uIG1lY2hhbmlzbSBmb3IgcG9pbnQtdG8tcG9pbnQgUlBDLiBUaHJpZnQgcHJvdmlkZXMgCitjbGVhbiBhYnN0cmFjdGlvbnMgZm9yIGRhdGEgdHJhbnNwb3J0LCBkYXRhIHNlcmlhbGl6YXRpb24sIGFuZCBhcHBsaWNhdGlvbgorbGV2ZWwgcHJvY2Vzc2luZy4gVGhlIGNvZGUgZ2VuZXJhdGlvbiBzeXN0ZW0gdGFrZXMgYSBzaW1wbGUgZGVmaW5pdGlvbgorbGFuZ3VhZ2UgYXMgaW5wdXQgYW5kIGdlbmVyYXRlcyBjb2RlIGFjcm9zcyBwcm9ncmFtbWluZyBsYW5ndWFnZXMgdGhhdAordXNlcyB0aGUgYWJzdHJhY3RlZCBzdGFjayB0byBidWlsZCBpbnRlcm9wZXJhYmxlIFJQQyBjbGllbnRzIGFuZCBzZXJ2ZXJzLgorCishW0FwYWNoZSBUaHJpZnQgTGF5ZXJlZCBBcmNoaXRlY3R1cmVdKGRvYy9pbWFnZXMvdGhyaWZ0LWxheWVycy5wbmcpCisKK1RocmlmdCBtYWtlcyBpdCBlYXN5IGZvciBwcm9ncmFtcyB3cml0dGVuIGluIGRpZmZlcmVudCBwcm9ncmFtbWluZworbGFuZ3VhZ2VzIHRvIHNoYXJlIGRhdGEgYW5kIGNhbGwgcmVtb3RlIHByb2NlZHVyZXMuICBXaXRoIHN1cHBvcnQgCitmb3IgWzI1IHByb2dyYW1taW5nIGxhbmd1YWdlc10oTEFOR1VBR0VTLm1kKSwgY2hhbmNlcyBhcmUgVGhyaWZ0IAorc3VwcG9ydHMgdGhlIGxhbmd1YWdlcyB0aGF0IHlvdSBjdXJyZW50bHkgdXNlLgorCitUaHJpZnQgaXMgc3BlY2lmaWNhbGx5IGRlc2lnbmVkIHRvIHN1cHBvcnQgbm9uLWF0b21pYyB2ZXJzaW9uIGNoYW5nZXMKK2Fjcm9zcyBjbGllbnQgYW5kIHNlcnZlciBjb2RlLgorCitGb3IgbW9yZSBkZXRhaWxzIG9uIFRocmlmdCdzIGRlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24sIHNlZSB0aGUgVGhyaWZ0Cit3aGl0ZXBhcGVyIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBvciBhdCB0aGUgUkVBRE1FLm1kIGZpbGUKK2luIHlvdXIgcGFydGljdWxhciBzdWJkaXJlY3Rvcnkgb2YgaW50ZXJlc3QuCisKK1N0YXR1cworPT09PT09CisKK3wgQnJhbmNoIHwgVHJhdmlzIHwgQXBwdmV5b3IgfCBDb3Zlcml0eSBTY2FuIHwgY29kZWNvdi5pbyB8IFdlYnNpdGUgfAorfCA6LS0tLS0gfCA6LS0tLS0gfCA6LS0tLS0tLSB8IDotLS0tLS0tLS0tLS0gfCA6LS0tLS0tLS0tIHwgOi0tLS0tLSB8Cit8IFtgbWFzdGVyYF0oaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQvdHJlZS9tYXN0ZXIpIHwgWyFbQnVpbGQgU3RhdHVzXShodHRwczovL3RyYXZpcy1jaS5vcmcvYXBhY2hlL3RocmlmdC5zdmc/YnJhbmNoPW1hc3RlcildKGh0dHBzOi8vdHJhdmlzLWNpLm9yZy9hcGFjaGUvdGhyaWZ0KSB8IFshW0J1aWxkIHN0YXR1c10oaHR0cHM6Ly9jaS5hcHB2ZXlvci5jb20vYXBpL3Byb2plY3RzL3N0YXR1cy9naXRodWIvYXBhY2hlL3RocmlmdD9icmFuY2g9bWFzdGVyJnN2Zz10cnVlKV0oaHR0cHM6Ly9jaS5hcHB2ZXlvci5jb20vcHJvamVjdC9BcGFjaGVTb2Z0d2FyZUZvdW5kYXRpb24vdGhyaWZ0L2hpc3RvcnkpIHwgWyFbQ292ZXJpdHkgU2NhbiBCdWlsZCBTdGF0dXNdKGh0dHBzOi8vc2Nhbi5jb3Zlcml0eS5jb20vcHJvamVjdHMvMTM0NS9iYWRnZS5zdmcpXShodHRwczovL3NjYW4uY292ZXJpdHkuY29tL3Byb2plY3RzL3RocmlmdCkgfCB8IFshW1dlYnNpdGVdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vYmFkZ2Uvb2ZmaWNpYWwtd2Vic2l0ZS1icmlnaHRncmVlbi5zdmcpXShodHRwczovL3RocmlmdC5hcGFjaGUub3JnLykgfAorCitSZWxlYXNlcworPT09PT09PT0KKworVGhyaWZ0IGRvZXMgbm90IG1haW50YWluIGEgc3BlY2lmaWMgcmVsZWFzZSBjYWxlbmRhciBhdCB0aGlzIHRpbWUuICAKKworV2Ugc3RyaXZlIHRvIHJlbGVhc2UgdHdpY2UgeWVhcmx5LiAgRG93bmxvYWQgdGhlIFtjdXJyZW50IHJlbGVhc2VdKGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy9kb3dubG9hZCkuCiAKIExpY2Vuc2UKID09PT09PT0KQEAgLTIzLDI1ICs1OSw4IEBACiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiB1bmRlciB0aGUgTGljZW5zZS4KIAotSW50cm9kdWN0aW9uCi09PT09PT09PT09PT0KLQotVGhyaWZ0IGlzIGEgbGlnaHR3ZWlnaHQsIGxhbmd1YWdlLWluZGVwZW5kZW50IHNvZnR3YXJlIHN0YWNrIHdpdGggYW4KLWFzc29jaWF0ZWQgY29kZSBnZW5lcmF0aW9uIG1lY2hhbmlzbSBmb3IgUlBDLiBUaHJpZnQgcHJvdmlkZXMgY2xlYW4KLWFic3RyYWN0aW9ucyBmb3IgZGF0YSB0cmFuc3BvcnQsIGRhdGEgc2VyaWFsaXphdGlvbiwgYW5kIGFwcGxpY2F0aW9uCi1sZXZlbCBwcm9jZXNzaW5nLiBUaGUgY29kZSBnZW5lcmF0aW9uIHN5c3RlbSB0YWtlcyBhIHNpbXBsZSBkZWZpbml0aW9uCi1sYW5ndWFnZSBhcyBpdHMgaW5wdXQgYW5kIGdlbmVyYXRlcyBjb2RlIGFjcm9zcyBwcm9ncmFtbWluZyBsYW5ndWFnZXMgdGhhdAotdXNlcyB0aGUgYWJzdHJhY3RlZCBzdGFjayB0byBidWlsZCBpbnRlcm9wZXJhYmxlIFJQQyBjbGllbnRzIGFuZCBzZXJ2ZXJzLgotCi1UaHJpZnQgaXMgc3BlY2lmaWNhbGx5IGRlc2lnbmVkIHRvIHN1cHBvcnQgbm9uLWF0b21pYyB2ZXJzaW9uIGNoYW5nZXMKLWFjcm9zcyBjbGllbnQgYW5kIHNlcnZlciBjb2RlLgotCi1Gb3IgbW9yZSBkZXRhaWxzIG9uIFRocmlmdCdzIGRlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24sIHRha2UgYSBnYW5kZXIgYXQKLXRoZSBUaHJpZnQgd2hpdGVwYXBlciBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBvciBhdCB0aGUgUkVBRE1FLm1kIGZpbGVzCi1pbiB5b3VyIHBhcnRpY3VsYXIgc3ViZGlyZWN0b3J5IG9mIGludGVyZXN0LgotCi1IaWVyYXJjaHkKLT09PT09PT09PQorUHJvamVjdCBIaWVyYXJjaHkKKz09PT09PT09PT09PT09PT09CiAKIHRocmlmdC8KIApAQCAtNjAsNiArNzksNyBAQAogICAgIHBocC8KICAgICBweS8KICAgICByYi8KKyAgICAuLi4KIAogICB0ZXN0LwogCkBAIC03MSwxMCArOTEsMTYgQEAKICAgICBDb250YWlucyBhIGJhc2ljIHR1dG9yaWFsIHRoYXQgd2lsbCB0ZWFjaCB5b3UgaG93IHRvIGRldmVsb3Agc29mdHdhcmUKICAgICB1c2luZyBUaHJpZnQuCiAKK0RldmVsb3BtZW50Cis9PT09PT09PT09PQorCitUbyBidWlsZCB0aGUgc2FtZSB3YXkgVHJhdmlzIENJIGJ1aWxkcyB0aGUgcHJvamVjdCB5b3Ugc2hvdWxkIHVzZSBkb2NrZXIuCitXZSBoYXZlIFtjb21wcmVoZW5zaXZlIGJ1aWxkaW5nIGluc3RydWN0aW9ucyBmb3IgZG9ja2VyXShidWlsZC9kb2NrZXIvUkVBRE1FLm1kKS4KKwogUmVxdWlyZW1lbnRzCiA9PT09PT09PT09PT0KIAotU2VlIGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy9kb2NzL2luc3RhbGwgZm9yIGFuIHVwLXRvLWRhdGUgbGlzdCBvZiBidWlsZCByZXF1aXJlbWVudHMuCitTZWUgaHR0cDovL3RocmlmdC5hcGFjaGUub3JnL2RvY3MvaW5zdGFsbCBmb3IgYSBsaXN0IG9mIGJ1aWxkIHJlcXVpcmVtZW50cyAobWF5IGJlIHN0YWxlKS4gIEFsdGVybmF0aXZlbHkgc2VlIHRoZSBkb2NrZXIgYnVpbGQgZW52aXJvbm1lbnRzIGZvciBhIGxpc3Qgb2YgcHJlcmVxdWlzaXRlcy4KIAogUmVzb3VyY2VzCiA9PT09PT09PT0KQEAgLTE2MiwzICsxODgsNSBAQAogCiBUaGlzIHdpbGwgcnVuIGEgc2V0IG9mIHRlc3RzIHRoYXQgdXNlIGRpZmZlcmVudCBsYW5ndWFnZSBjbGllbnRzIGFuZAogc2VydmVycy4KKworCmRpZmYgLS1naXQgYS9UaHJpZnQtc3dpZnQzLnBvZHNwZWMgYi9UaHJpZnQtc3dpZnQzLnBvZHNwZWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI2YzAwYgotLS0gL2Rldi9udWxsCisrKyBiL1RocmlmdC1zd2lmdDMucG9kc3BlYwpAQCAtMCwwICsxLDE2IEBACitQb2Q6OlNwZWMubmV3IGRvIHxzfAorICBzLm5hbWUgICAgICAgICAgPSAiVGhyaWZ0LXN3aWZ0MyIKKyAgcy52ZXJzaW9uICAgICAgID0gIjEuMC4wIgorICBzLnN1bW1hcnkgICAgICAgPSAiQXBhY2hlIFRocmlmdCBpcyBhIGxpZ2h0d2VpZ2h0LCBsYW5ndWFnZS1pbmRlcGVuZGVudCBzb2Z0d2FyZSBzdGFjayB3aXRoIGFuIGFzc29jaWF0ZWQgY29kZSBnZW5lcmF0aW9uIG1lY2hhbmlzbSBmb3IgUlBDLiIKKyAgcy5kZXNjcmlwdGlvbiAgID0gPDwtREVTQworVGhlIEFwYWNoZSBUaHJpZnQgc2NhbGFibGUgY3Jvc3MtbGFuZ3VhZ2Ugc29mdHdhcmUgZnJhbWV3b3JrIGZvciBuZXR3b3JrZWQgc2VydmljZXMgZGV2ZWxvcG1lbnQgY29tYmluZXMgYSBzb2Z0d2FyZSBzdGFjayB3aXRoIGEgY29kZSBnZW5lcmF0aW9uIGVuZ2luZSB0byBidWlsZCBzZXJ2aWNlcyB0aGF0IHdvcmsgZWZmaWNpZW50bHkgYW5kIHNlYW1sZXNzbHkgYmV0d2VlbiBtYW55IHByb2dyYW1taW5nIGxhbmd1YWdlcy4KKyAgICAgICAgICAgICAgICAgICAgREVTQworICBzLmhvbWVwYWdlICAgICAgPSAiaHR0cDovL3RocmlmdC5hcGFjaGUub3JnIgorICBzLmxpY2Vuc2UgICAgICAgPSB7IDp0eXBlID0+ICdBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAnLCA6dXJsID0+ICdodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wJyB9CisgIHMuYXV0aG9yICAgICAgICA9IHsgIkFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyIgPT4gImRldkB0aHJpZnQuYXBhY2hlLm9yZyIgfQorICBzLmlvcy5kZXBsb3ltZW50X3RhcmdldCA9ICc5LjAnCisgIHMub3N4LmRlcGxveW1lbnRfdGFyZ2V0ID0gJzEwLjEwJworICBzLnJlcXVpcmVzX2FyYyAgPSB0cnVlCisgIHMuc291cmNlICAgICAgICA9IHsgOmdpdCA9PiAiaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQuZ2l0IiwgOnRhZyA9PiAidjEuMC4wIiB9CisgIHMuc291cmNlX2ZpbGVzICA9ICJsaWIvc3dpZnQvU291cmNlcy8qLnN3aWZ0IgorZW5kCmRpZmYgLS1naXQgYS9UaHJpZnQucG9kc3BlYyBiL1RocmlmdC5wb2RzcGVjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MDZlZWMKLS0tIC9kZXYvbnVsbAorKysgYi9UaHJpZnQucG9kc3BlYwpAQCAtMCwwICsxLDE4IEBACitQb2Q6OlNwZWMubmV3IGRvIHxzfAorICBzLm5hbWUgICAgICAgICAgPSAiVGhyaWZ0IgorICBzLnZlcnNpb24gICAgICAgPSAiMS4wLjAiCisgIHMuc3VtbWFyeSAgICAgICA9ICJBcGFjaGUgVGhyaWZ0IGlzIGEgbGlnaHR3ZWlnaHQsIGxhbmd1YWdlLWluZGVwZW5kZW50IHNvZnR3YXJlIHN0YWNrIHdpdGggYW4gYXNzb2NpYXRlZCBjb2RlIGdlbmVyYXRpb24gbWVjaGFuaXNtIGZvciBSUEMuIgorICBzLmRlc2NyaXB0aW9uICAgPSA8PC1ERVNDCitUaGUgQXBhY2hlIFRocmlmdCBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIG5ldHdvcmtlZCBzZXJ2aWNlcyBkZXZlbG9wbWVudCBjb21iaW5lcyBhIHNvZnR3YXJlIHN0YWNrIHdpdGggYSBjb2RlIGdlbmVyYXRpb24gZW5naW5lIHRvIGJ1aWxkIHNlcnZpY2VzIHRoYXQgd29yayBlZmZpY2llbnRseSBhbmQgc2VhbWxlc3NseSBiZXR3ZWVuIG1hbnkgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzLgorICAgICAgICAgICAgICAgICAgICBERVNDCisgIHMuaG9tZXBhZ2UgICAgICA9ICJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmciCisgIHMubGljZW5zZSAgICAgICA9IHsgOnR5cGUgPT4gJ0FwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCcsIDp1cmwgPT4gJ2h0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAnIH0KKyAgcy5hdXRob3IgICAgICAgID0geyAiQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIiA9PiAiZGV2QHRocmlmdC5hcGFjaGUub3JnIiB9CisgIHMucmVxdWlyZXNfYXJjICA9IHRydWUKKyAgcy5pb3MuZGVwbG95bWVudF90YXJnZXQgPSAnNy4wJworICBzLm9zeC5kZXBsb3ltZW50X3RhcmdldCA9ICcxMC44JworICBzLmlvcy5mcmFtZXdvcmsgPSAnQ0ZOZXR3b3JrJworICBzLm9zeC5mcmFtZXdvcmsgPSAnQ29yZVNlcnZpY2VzJworICBzLnNvdXJjZSAgICAgICAgPSB7IDpnaXQgPT4gImh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0LmdpdCIsIDp0YWcgPT4gInYxLjAuMCIgfQorICBzLnNvdXJjZV9maWxlcyAgPSAnbGliL2NvY29hL3NyYy8qKi8qLntoLG0sc3dpZnR9JworZW5kCmRpZmYgLS1naXQgYS9hY2xvY2FsL2F4X2Jvb3N0X2Jhc2UubTQgYi9hY2xvY2FsL2F4X2Jvb3N0X2Jhc2UubTQKaW5kZXggYjQ5NjAyMC4uZDU0MDM5NSAxMDA2NDQKLS0tIGEvYWNsb2NhbC9heF9ib29zdF9iYXNlLm00CisrKyBiL2FjbG9jYWwvYXhfYm9vc3RfYmFzZS5tNApAQCAtMSw1ICsxLDUgQEAKICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICAgICAgIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hdXRvY29uZi1hcmNoaXZlL2F4X2Jvb3N0X2Jhc2UuaHRtbAorIyAgICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYXV0b2NvbmYtYXJjaGl2ZS9heF9ib29zdF9iYXNlLmh0bWwKICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAjCiAjIFNZTk9QU0lTCkBAIC0zMyw3ICszMywxNSBAQAogIyAgIGFuZCB0aGlzIG5vdGljZSBhcmUgcHJlc2VydmVkLiBUaGlzIGZpbGUgaXMgb2ZmZXJlZCBhcy1pcywgd2l0aG91dCBhbnkKICMgICB3YXJyYW50eS4KIAotI3NlcmlhbCAyMworI3NlcmlhbCA0NQorCisjIGV4YW1wbGUgYm9vc3QgcHJvZ3JhbSAobmVlZCB0byBwYXNzIHZlcnNpb24pCittNF9kZWZpbmUoW19BWF9CT09TVF9CQVNFX1BST0dSQU1dLAorICAgICAgICAgIFtBQ19MQU5HX1BST0dSQU0oW1sKKyNpbmNsdWRlIDxib29zdC92ZXJzaW9uLmhwcD4KK11dLFtbCisodm9pZCkgKCh2b2lkKXNpemVvZihjaGFyWzEgLSAyKiEhKChCT09TVF9WRVJTSU9OKSA8ICgkMSkpXSkpOworXV0pXSkKIAogQUNfREVGVU4oW0FYX0JPT1NUX0JBU0VdLAogWwpAQCAtNDQsMTAxICs1MiwxMjEgQEAKICAgICAgb3IgZGlzYWJsZSBpdCAoQVJHPW5vKQogICAgICBAPDpAQVJHPXllc0A6PkAgXSldLAogICAgIFsKLSAgICBpZiB0ZXN0ICIkd2l0aHZhbCIgPSAibm8iOyB0aGVuCi0gICAgICAgIHdhbnRfYm9vc3Q9Im5vIgotICAgIGVsaWYgdGVzdCAiJHdpdGh2YWwiID0gInllcyI7IHRoZW4KLSAgICAgICAgd2FudF9ib29zdD0ieWVzIgotICAgICAgICBhY19ib29zdF9wYXRoPSIiCi0gICAgZWxzZQotICAgICAgICB3YW50X2Jvb3N0PSJ5ZXMiCi0gICAgICAgIGFjX2Jvb3N0X3BhdGg9IiR3aXRodmFsIgotICAgIGZpCisgICAgIEFTX0NBU0UoWyR3aXRodmFsXSwKKyAgICAgICBbbm9dLFt3YW50X2Jvb3N0PSJubyI7X0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aD0iIl0sCisgICAgICAgW3llc10sW3dhbnRfYm9vc3Q9InllcyI7X0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aD0iIl0sCisgICAgICAgW3dhbnRfYm9vc3Q9InllcyI7X0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aD0iJHdpdGh2YWwiXSkKICAgICBdLAogICAgIFt3YW50X2Jvb3N0PSJ5ZXMiXSkKIAogCiBBQ19BUkdfV0lUSChbYm9vc3QtbGliZGlyXSwKLSAgICAgICAgQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1ib29zdC1saWJkaXI9TElCX0RJUl0sCi0gICAgICAgIFtGb3JjZSBnaXZlbiBkaXJlY3RvcnkgZm9yIGJvb3N0IGxpYnJhcmllcy4gTm90ZSB0aGF0IHRoaXMgd2lsbCBvdmVycmlkZSBsaWJyYXJ5IHBhdGggZGV0ZWN0aW9uLCBzbyB1c2UgdGhpcyBwYXJhbWV0ZXIgb25seSBpZiBkZWZhdWx0IGxpYnJhcnkgZGV0ZWN0aW9uIGZhaWxzIGFuZCB5b3Uga25vdyBleGFjdGx5IHdoZXJlIHlvdXIgYm9vc3QgbGlicmFyaWVzIGFyZSBsb2NhdGVkLl0pLAotICAgICAgICBbCi0gICAgICAgIGlmIHRlc3QgLWQgIiR3aXRodmFsIgotICAgICAgICB0aGVuCi0gICAgICAgICAgICAgICAgYWNfYm9vc3RfbGliX3BhdGg9IiR3aXRodmFsIgotICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgQUNfTVNHX0VSUk9SKC0td2l0aC1ib29zdC1saWJkaXIgZXhwZWN0ZWQgZGlyZWN0b3J5IG5hbWUpCi0gICAgICAgIGZpCi0gICAgICAgIF0sCi0gICAgICAgIFthY19ib29zdF9saWJfcGF0aD0iIl0KLSkKKyAgW0FTX0hFTFBfU1RSSU5HKFstLXdpdGgtYm9vc3QtbGliZGlyPUxJQl9ESVJdLAorICAgIFtGb3JjZSBnaXZlbiBkaXJlY3RvcnkgZm9yIGJvb3N0IGxpYnJhcmllcy4KKyAgICAgTm90ZSB0aGF0IHRoaXMgd2lsbCBvdmVycmlkZSBsaWJyYXJ5IHBhdGggZGV0ZWN0aW9uLAorICAgICBzbyB1c2UgdGhpcyBwYXJhbWV0ZXIgb25seSBpZiBkZWZhdWx0IGxpYnJhcnkgZGV0ZWN0aW9uIGZhaWxzCisgICAgIGFuZCB5b3Uga25vdyBleGFjdGx5IHdoZXJlIHlvdXIgYm9vc3QgbGlicmFyaWVzIGFyZSBsb2NhdGVkLl0pXSwKKyAgWworICAgQVNfSUYoW3Rlc3QgLWQgIiR3aXRodmFsIl0sCisgICAgICAgICBbX0FYX0JPT1NUX0JBU0VfYm9vc3RfbGliX3BhdGg9IiR3aXRodmFsIl0sCisgICAgW0FDX01TR19FUlJPUihbLS13aXRoLWJvb3N0LWxpYmRpciBleHBlY3RlZCBkaXJlY3RvcnkgbmFtZV0pXSkKKyAgXSwKKyAgW19BWF9CT09TVF9CQVNFX2Jvb3N0X2xpYl9wYXRoPSIiXSkKIAotaWYgdGVzdCAieCR3YW50X2Jvb3N0IiA9ICJ4eWVzIjsgdGhlbgotICAgIGJvb3N0X2xpYl92ZXJzaW9uX3JlcT1pZmVsc2UoWyQxXSwgLDEuMjAuMCwkMSkKLSAgICBib29zdF9saWJfdmVyc2lvbl9yZXFfc2hvcnRlbj1gZXhwciAkYm9vc3RfbGliX3ZlcnNpb25fcmVxIDogJ1woW1swLTldXSpcLltbMC05XV0qXCknYAotICAgIGJvb3N0X2xpYl92ZXJzaW9uX3JlcV9tYWpvcj1gZXhwciAkYm9vc3RfbGliX3ZlcnNpb25fcmVxIDogJ1woW1swLTldXSpcKSdgCi0gICAgYm9vc3RfbGliX3ZlcnNpb25fcmVxX21pbm9yPWBleHByICRib29zdF9saWJfdmVyc2lvbl9yZXEgOiAnW1swLTldXSpcLlwoW1swLTldXSpcKSdgCi0gICAgYm9vc3RfbGliX3ZlcnNpb25fcmVxX3N1Yl9taW5vcj1gZXhwciAkYm9vc3RfbGliX3ZlcnNpb25fcmVxIDogJ1tbMC05XV0qXC5bWzAtOV1dKlwuXChbWzAtOV1dKlwpJ2AKLSAgICBpZiB0ZXN0ICJ4JGJvb3N0X2xpYl92ZXJzaW9uX3JlcV9zdWJfbWlub3IiID0gIngiIDsgdGhlbgotICAgICAgICBib29zdF9saWJfdmVyc2lvbl9yZXFfc3ViX21pbm9yPSIwIgotICAgICAgICBmaQotICAgIFdBTlRfQk9PU1RfVkVSU0lPTj1gZXhwciAkYm9vc3RfbGliX3ZlcnNpb25fcmVxX21ham9yIFwqIDEwMDAwMCBcKyAgJGJvb3N0X2xpYl92ZXJzaW9uX3JlcV9taW5vciBcKiAxMDAgXCsgJGJvb3N0X2xpYl92ZXJzaW9uX3JlcV9zdWJfbWlub3JgCi0gICAgQUNfTVNHX0NIRUNLSU5HKGZvciBib29zdGxpYiA+PSAkYm9vc3RfbGliX3ZlcnNpb25fcmVxKQorQk9PU1RfTERGTEFHUz0iIgorQk9PU1RfQ1BQRkxBR1M9IiIKK0FTX0lGKFt0ZXN0ICJ4JHdhbnRfYm9vc3QiID0gInh5ZXMiXSwKKyAgICAgIFtfQVhfQk9PU1RfQkFTRV9SVU5ERVRFQ1QoWyQxXSxbJDJdLFskM10pXSkKK0FDX1NVQlNUKEJPT1NUX0NQUEZMQUdTKQorQUNfU1VCU1QoQk9PU1RfTERGTEFHUykKK10pCisKKworIyBjb252ZXJ0IGEgdmVyc2lvbiBzdHJpbmcgaW4gJDIgdG8gbnVtZXJpYyBhbmQgYWZmZWN0IHRvIHBvbHltb3JwaGljIHZhciAkMQorQUNfREVGVU4oW19BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05dLFsKKyAgQVNfSUYoW3Rlc3QgIngkMiIgPSAieCJdLFtfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX3JlcT0iMS4yMC4wIl0sW19BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxPSIkMiJdKQorICBfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX3JlcV9zaG9ydGVuPWBleHByICRfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX3JlcSA6ICdcKFtbMC05XV0qXC5bWzAtOV1dKlwpJ2AKKyAgX0FYX0JPT1NUX0JBU0VfVE9OVU1FUklDVkVSU0lPTl9yZXFfbWFqb3I9YGV4cHIgJF9BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxIDogJ1woW1swLTldXSpcKSdgCisgIEFTX0lGKFt0ZXN0ICJ4JF9BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxX21ham9yIiA9ICJ4Il0sCisgICAgICAgIFtBQ19NU0dfRVJST1IoW1lvdSBzaG91bGQgYXQgbGVhc3Qgc3BlY2lmeSBsaWJib29zdCBtYWpvciB2ZXJzaW9uXSldKQorICBfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX3JlcV9taW5vcj1gZXhwciAkX0FYX0JPT1NUX0JBU0VfVE9OVU1FUklDVkVSU0lPTl9yZXEgOiAnW1swLTldXSpcLlwoW1swLTldXSpcKSdgCisgIEFTX0lGKFt0ZXN0ICJ4JF9BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxX21pbm9yIiA9ICJ4Il0sCisgICAgICAgIFtfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX3JlcV9taW5vcj0iMCJdKQorICBfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX3JlcV9zdWJfbWlub3I9YGV4cHIgJF9BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxIDogJ1tbMC05XV0qXC5bWzAtOV1dKlwuXChbWzAtOV1dKlwpJ2AKKyAgQVNfSUYoW3Rlc3QgIlgkX0FYX0JPT1NUX0JBU0VfVE9OVU1FUklDVkVSU0lPTl9yZXFfc3ViX21pbm9yIiA9ICJYIl0sCisgICAgICAgIFtfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX3JlcV9zdWJfbWlub3I9IjAiXSkKKyAgX0FYX0JPT1NUX0JBU0VfVE9OVU1FUklDVkVSU0lPTl9SRVQ9YGV4cHIgJF9BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxX21ham9yIFwqIDEwMDAwMCBcKyAgJF9BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxX21pbm9yIFwqIDEwMCBcKyAkX0FYX0JPT1NUX0JBU0VfVE9OVU1FUklDVkVSU0lPTl9yZXFfc3ViX21pbm9yYAorICBBU19WQVJfU0VUKCQxLCRfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX1JFVCkKK10pCisKK2RubCBSdW4gdGhlIGRldGVjdGlvbiBvZiBib29zdCBzaG91bGQgYmUgcnVuIG9ubHkgaWYgJHdhbnRfYm9vc3QKK0FDX0RFRlVOKFtfQVhfQk9PU1RfQkFTRV9SVU5ERVRFQ1RdLFsKKyAgICBfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OKFdBTlRfQk9PU1RfVkVSU0lPTixbJDFdKQogICAgIHN1Y2NlZWRlZD1ubwogCisKKyAgICBBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pCiAgICAgZG5sIE9uIDY0LWJpdCBzeXN0ZW1zIGNoZWNrIGZvciBzeXN0ZW0gbGlicmFyaWVzIGluIGJvdGggbGliNjQgYW5kIGxpYi4KICAgICBkbmwgVGhlIGZvcm1lciBpcyBzcGVjaWZpZWQgYnkgRkhTLCBidXQgZS5nLiBEZWJpYW4gZG9lcyBub3QgYWRoZXJlIHRvCiAgICAgZG5sIHRoaXMgKGFzIGl0IHJpc2VzIHByb2JsZW1zIGZvciBnZW5lcmljIG11bHRpLWFyY2ggc3VwcG9ydCkuCiAgICAgZG5sIFRoZSBsYXN0IGVudHJ5IGluIHRoZSBsaXN0IGlzIGNob3NlbiBieSBkZWZhdWx0IHdoZW4gbm8gbGlicmFyaWVzCiAgICAgZG5sIGFyZSBmb3VuZCwgZS5nLiB3aGVuIG9ubHkgaGVhZGVyLW9ubHkgbGlicmFyaWVzIGFyZSBpbnN0YWxsZWQhCi0gICAgbGlic3ViZGlycz0ibGliIgotICAgIGF4X2FyY2g9YHVuYW1lIC1tYAotICAgIGNhc2UgJGF4X2FyY2ggaW4KLSAgICAgIHg4Nl82NHxwcGM2NHxzMzkweHxzcGFyYzY0fGFhcmNoNjQpCi0gICAgICAgIGxpYnN1YmRpcnM9ImxpYjY0IGxpYiBsaWI2NCIKLSAgICAgICAgOzsKLSAgICBlc2FjCisgICAgQVNfQ0FTRShbJHtob3N0X2NwdX1dLAorICAgICAgW3g4Nl82NF0sW2xpYnN1YmRpcnM9ImxpYjY0IGxpYngzMiBsaWIgbGliNjQiXSwKKyAgICAgIFtwcGM2NHxwb3dlcnBjNjR8czM5MHh8c3BhcmM2NHxhYXJjaDY0fHBwYzY0bGV8cG93ZXJwYzY0bGV8cmlzY3Y2NF0sW2xpYnN1YmRpcnM9ImxpYjY0IGxpYiBsaWI2NCJdLAorICAgICAgW2xpYnN1YmRpcnM9ImxpYiJdCisgICAgKQogCiAgICAgZG5sIGFsbG93IGZvciByZWFsIG11bHRpLWFyY2ggcGF0aHMgZS5nLiAvdXNyL2xpYi94ODZfNjQtbGludXgtZ251LiBHaXZlCiAgICAgZG5sIHRoZW0gcHJpb3JpdHkgb3ZlciB0aGUgb3RoZXIgcGF0aHMgc2luY2UsIGlmIGxpYnMgYXJlIGZvdW5kIHRoZXJlLCB0aGV5CiAgICAgZG5sIGFyZSBhbG1vc3QgYXNzdXJlZGx5IHRoZSBvbmVzIGRlc2lyZWQuCi0gICAgQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKQotICAgIGxpYnN1YmRpcnM9ImxpYi8ke2hvc3RfY3B1fS0ke2hvc3Rfb3N9ICRsaWJzdWJkaXJzIgotCi0gICAgY2FzZSAke2hvc3RfY3B1fSBpbgotICAgICAgaT84NikKLSAgICAgICAgbGlic3ViZGlycz0ibGliL2kzODYtJHtob3N0X29zfSAkbGlic3ViZGlycyIKLSAgICAgICAgOzsKLSAgICBlc2FjCisgICAgQVNfQ0FTRShbJHtob3N0X2NwdX1dLAorICAgICAgW2k/ODZdLFttdWx0aWFyY2hfbGlic3ViZGlyPSJsaWIvaTM4Ni0ke2hvc3Rfb3N9Il0sCisgICAgICBbbXVsdGlhcmNoX2xpYnN1YmRpcj0ibGliLyR7aG9zdF9jcHV9LSR7aG9zdF9vc30iXQorICAgICkKIAogICAgIGRubCBmaXJzdCB3ZSBjaGVjayB0aGUgc3lzdGVtIGxvY2F0aW9uIGZvciBib29zdCBsaWJyYXJpZXMKICAgICBkbmwgdGhpcyBsb2NhdGlvbiBpc3QgY2hvc2VuIGlmIGJvb3N0IGxpYnJhcmllcyBhcmUgaW5zdGFsbGVkIHdpdGggdGhlIC0tbGF5b3V0PXN5c3RlbSBvcHRpb24KICAgICBkbmwgb3IgaWYgeW91IGluc3RhbGwgYm9vc3Qgd2l0aCBSUE0KLSAgICBpZiB0ZXN0ICIkYWNfYm9vc3RfcGF0aCIgIT0gIiI7IHRoZW4KLSAgICAgICAgQk9PU1RfQ1BQRkxBR1M9Ii1JJGFjX2Jvb3N0X3BhdGgvaW5jbHVkZSIKLSAgICAgICAgZm9yIGFjX2Jvb3N0X3BhdGhfdG1wIGluICRsaWJzdWJkaXJzOyBkbwotICAgICAgICAgICAgICAgIGlmIHRlc3QgLWQgIiRhY19ib29zdF9wYXRoIi8iJGFjX2Jvb3N0X3BhdGhfdG1wIiA7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX0xERkxBR1M9Ii1MJGFjX2Jvb3N0X3BhdGgvJGFjX2Jvb3N0X3BhdGhfdG1wIgotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgICAgICBmaQotICAgICAgICBkb25lCi0gICAgZWxpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiAhPSB5ZXM7IHRoZW4KLSAgICAgICAgZm9yIGFjX2Jvb3N0X3BhdGhfdG1wIGluICRsdF9zeXNyb290L3VzciAkbHRfc3lzcm9vdC91c3IvbG9jYWwgJGx0X3N5c3Jvb3Qvb3B0ICRsdF9zeXNyb290L29wdC9sb2NhbCA7IGRvCi0gICAgICAgICAgICBpZiB0ZXN0IC1kICIkYWNfYm9vc3RfcGF0aF90bXAvaW5jbHVkZS9ib29zdCIgJiYgdGVzdCAtciAiJGFjX2Jvb3N0X3BhdGhfdG1wL2luY2x1ZGUvYm9vc3QiOyB0aGVuCi0gICAgICAgICAgICAgICAgZm9yIGxpYnN1YmRpciBpbiAkbGlic3ViZGlycyA7IGRvCi0gICAgICAgICAgICAgICAgICAgIGlmIGxzICIkYWNfYm9vc3RfcGF0aF90bXAvJGxpYnN1YmRpci9saWJib29zdF8iKiA+L2Rldi9udWxsIDI+JjEgOyB0aGVuIGJyZWFrOyBmaQorICAgIEFTX0lGKFt0ZXN0ICJ4JF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgiICE9ICJ4Il0sWworICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBib29zdGxpYiA+PSAkMSAoJFdBTlRfQk9PU1RfVkVSU0lPTikgaW5jbHVkZXMgaW4gIiRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoL2luY2x1ZGUiXSkKKyAgICAgICAgIEFTX0lGKFt0ZXN0IC1kICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aC9pbmNsdWRlIiAmJiB0ZXN0IC1yICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aC9pbmNsdWRlIl0sWworICAgICAgICAgICBBQ19NU0dfUkVTVUxUKFt5ZXNdKQorICAgICAgICAgICBCT09TVF9DUFBGTEFHUz0iLUkkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aC9pbmNsdWRlIgorICAgICAgICAgICBmb3IgX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aF90bXAgaW4gJG11bHRpYXJjaF9saWJzdWJkaXIgJGxpYnN1YmRpcnM7IGRvCisgICAgICAgICAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgYm9vc3RsaWIgPj0gJDEgKCRXQU5UX0JPT1NUX1ZFUlNJT04pIGxpYiBwYXRoIGluICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aC8kX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aF90bXAiXSkKKyAgICAgICAgICAgICAgICBBU19JRihbdGVzdCAtZCAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgvJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGhfdG1wIiAmJiB0ZXN0IC1yICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aC8kX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aF90bXAiIF0sWworICAgICAgICAgICAgICAgICAgICAgICAgQUNfTVNHX1JFU1VMVChbeWVzXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX0xERkxBR1M9Ii1MJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgvJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGhfdG1wIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIF0sCisgICAgICBbQUNfTVNHX1JFU1VMVChbbm9dKV0pCisgICAgICAgICAgIGRvbmVdLFsKKyAgICAgIEFDX01TR19SRVNVTFQoW25vXSldKQorICAgIF0sWworICAgICAgICBpZiB0ZXN0IFgiJGNyb3NzX2NvbXBpbGluZyIgPSBYeWVzOyB0aGVuCisgICAgICAgICAgICBzZWFyY2hfbGlic3ViZGlycz0kbXVsdGlhcmNoX2xpYnN1YmRpcgorICAgICAgICBlbHNlCisgICAgICAgICAgICBzZWFyY2hfbGlic3ViZGlycz0iJG11bHRpYXJjaF9saWJzdWJkaXIgJGxpYnN1YmRpcnMiCisgICAgICAgIGZpCisgICAgICAgIGZvciBfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoX3RtcCBpbiAvdXNyIC91c3IvbG9jYWwgL29wdCAvb3B0L2xvY2FsIDsgZG8KKyAgICAgICAgICAgIGlmIHRlc3QgLWQgIiRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoX3RtcC9pbmNsdWRlL2Jvb3N0IiAmJiB0ZXN0IC1yICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aF90bXAvaW5jbHVkZS9ib29zdCIgOyB0aGVuCisgICAgICAgICAgICAgICAgZm9yIGxpYnN1YmRpciBpbiAkc2VhcmNoX2xpYnN1YmRpcnMgOyBkbworICAgICAgICAgICAgICAgICAgICBpZiBscyAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGhfdG1wLyRsaWJzdWJkaXIvbGliYm9vc3RfIiogPi9kZXYvbnVsbCAyPiYxIDsgdGhlbiBicmVhazsgZmkKICAgICAgICAgICAgICAgICBkb25lCi0gICAgICAgICAgICAgICAgQk9PU1RfTERGTEFHUz0iLUwkYWNfYm9vc3RfcGF0aF90bXAvJGxpYnN1YmRpciIKLSAgICAgICAgICAgICAgICBCT09TVF9DUFBGTEFHUz0iLUkkYWNfYm9vc3RfcGF0aF90bXAvaW5jbHVkZSIKKyAgICAgICAgICAgICAgICBCT09TVF9MREZMQUdTPSItTCRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoX3RtcC8kbGlic3ViZGlyIgorICAgICAgICAgICAgICAgIEJPT1NUX0NQUEZMQUdTPSItSSRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoX3RtcC9pbmNsdWRlIgogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgZmkKICAgICAgICAgZG9uZQotICAgIGZpCisgICAgXSkKIAogICAgIGRubCBvdmVyd3JpdGUgbGQgZmxhZ3MgaWYgd2UgaGF2ZSByZXF1aXJlZCBzcGVjaWFsIGRpcmVjdG9yeSB3aXRoCiAgICAgZG5sIC0td2l0aC1ib29zdC1saWJkaXIgcGFyYW1ldGVyCi0gICAgaWYgdGVzdCAiJGFjX2Jvb3N0X2xpYl9wYXRoIiAhPSAiIjsgdGhlbgotICAgICAgIEJPT1NUX0xERkxBR1M9Ii1MJGFjX2Jvb3N0X2xpYl9wYXRoIgotICAgIGZpCisgICAgQVNfSUYoW3Rlc3QgIngkX0FYX0JPT1NUX0JBU0VfYm9vc3RfbGliX3BhdGgiICE9ICJ4Il0sCisgICAgICAgICAgW0JPT1NUX0xERkxBR1M9Ii1MJF9BWF9CT09TVF9CQVNFX2Jvb3N0X2xpYl9wYXRoIl0pCiAKKyAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBib29zdGxpYiA+PSAkMSAoJFdBTlRfQk9PU1RfVkVSU0lPTildKQogICAgIENQUEZMQUdTX1NBVkVEPSIkQ1BQRkxBR1MiCiAgICAgQ1BQRkxBR1M9IiRDUFBGTEFHUyAkQk9PU1RfQ1BQRkxBR1MiCiAgICAgZXhwb3J0IENQUEZMQUdTCkBAIC0xNDksMTUgKzE3Nyw3IEBACiAKICAgICBBQ19SRVFVSVJFKFtBQ19QUk9HX0NYWF0pCiAgICAgQUNfTEFOR19QVVNIKEMrKykKLSAgICAgICAgQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWwotICAgIEAlOkBpbmNsdWRlIDxib29zdC92ZXJzaW9uLmhwcD4KLSAgICBdXSwgW1sKLSAgICAjaWYgQk9PU1RfVkVSU0lPTiA+PSAkV0FOVF9CT09TVF9WRVJTSU9OCi0gICAgLy8gRXZlcnl0aGluZyBpcyBva2F5Ci0gICAgI2Vsc2UKLSAgICAjICBlcnJvciBCb29zdCB2ZXJzaW9uIGlzIHRvbyBvbGQKLSAgICAjZW5kaWYKLSAgICBdXSldLFsKKyAgICAgICAgQUNfQ09NUElMRV9JRkVMU0UoW19BWF9CT09TVF9CQVNFX1BST0dSQU0oJFdBTlRfQk9PU1RfVkVSU0lPTildLFsKICAgICAgICAgQUNfTVNHX1JFU1VMVCh5ZXMpCiAgICAgc3VjY2VlZGVkPXllcwogICAgIGZvdW5kX3N5c3RlbT15ZXMKQEAgLTE2OSwzMCArMTg5LDUwIEBACiAKICAgICBkbmwgaWYgd2UgZm91bmQgbm8gYm9vc3Qgd2l0aCBzeXN0ZW0gbGF5b3V0IHdlIHNlYXJjaCBmb3IgYm9vc3QgbGlicmFyaWVzCiAgICAgZG5sIGJ1aWx0IGFuZCBpbnN0YWxsZWQgd2l0aG91dCB0aGUgLS1sYXlvdXQ9c3lzdGVtIG9wdGlvbiBvciBmb3IgYSBzdGFnZWQobm90IGluc3RhbGxlZCkgdmVyc2lvbgotICAgIGlmIHRlc3QgIngkc3VjY2VlZGVkIiAhPSAieHllcyI7IHRoZW4KKyAgICBpZiB0ZXN0ICJ4JHN1Y2NlZWRlZCIgIT0gInh5ZXMiIDsgdGhlbgorICAgICAgICBDUFBGTEFHUz0iJENQUEZMQUdTX1NBVkVEIgorICAgICAgICBMREZMQUdTPSIkTERGTEFHU19TQVZFRCIKKyAgICAgICAgQk9PU1RfQ1BQRkxBR1M9CisgICAgICAgIGlmIHRlc3QgLXogIiRfQVhfQk9PU1RfQkFTRV9ib29zdF9saWJfcGF0aCIgOyB0aGVuCisgICAgICAgICAgICBCT09TVF9MREZMQUdTPQorICAgICAgICBmaQogICAgICAgICBfdmVyc2lvbj0wCi0gICAgICAgIGlmIHRlc3QgIiRhY19ib29zdF9wYXRoIiAhPSAiIjsgdGhlbgotICAgICAgICAgICAgaWYgdGVzdCAtZCAiJGFjX2Jvb3N0X3BhdGgiICYmIHRlc3QgLXIgIiRhY19ib29zdF9wYXRoIjsgdGhlbgotICAgICAgICAgICAgICAgIGZvciBpIGluIGBscyAtZCAkYWNfYm9vc3RfcGF0aC9pbmNsdWRlL2Jvb3N0LSogMj4vZGV2L251bGxgOyBkbwotICAgICAgICAgICAgICAgICAgICBfdmVyc2lvbl90bXA9YGVjaG8gJGkgfCBzZWQgInMjJGFjX2Jvb3N0X3BhdGgjIyIgfCBzZWQgJ3MvXC9pbmNsdWRlXC9ib29zdC0vLycgfCBzZWQgJ3MvXy8uLydgCisgICAgICAgIGlmIHRlc3QgLW4gIiRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoIiA7IHRoZW4KKyAgICAgICAgICAgIGlmIHRlc3QgLWQgIiRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoIiAmJiB0ZXN0IC1yICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aCI7IHRoZW4KKyAgICAgICAgICAgICAgICBmb3IgaSBpbiBgbHMgLWQgJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgvaW5jbHVkZS9ib29zdC0qIDI+L2Rldi9udWxsYDsgZG8KKyAgICAgICAgICAgICAgICAgICAgX3ZlcnNpb25fdG1wPWBlY2hvICRpIHwgc2VkICJzIyRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoIyMiIHwgc2VkICdzL1wvaW5jbHVkZVwvYm9vc3QtLy8nIHwgc2VkICdzL18vLi8nYAogICAgICAgICAgICAgICAgICAgICBWX0NIRUNLPWBleHByICRfdmVyc2lvbl90bXAgXD4gJF92ZXJzaW9uYAotICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0ICIkVl9DSEVDSyIgPSAiMSIgOyB0aGVuCisgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIngkVl9DSEVDSyIgPSAieDEiIDsgdGhlbgogICAgICAgICAgICAgICAgICAgICAgICAgX3ZlcnNpb249JF92ZXJzaW9uX3RtcAogICAgICAgICAgICAgICAgICAgICBmaQogICAgICAgICAgICAgICAgICAgICBWRVJTSU9OX1VOREVSU0NPUkU9YGVjaG8gJF92ZXJzaW9uIHwgc2VkICdzL1wuL18vJ2AKLSAgICAgICAgICAgICAgICAgICAgQk9PU1RfQ1BQRkxBR1M9Ii1JJGFjX2Jvb3N0X3BhdGgvaW5jbHVkZS9ib29zdC0kVkVSU0lPTl9VTkRFUlNDT1JFIgorICAgICAgICAgICAgICAgICAgICBCT09TVF9DUFBGTEFHUz0iLUkkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aC9pbmNsdWRlL2Jvb3N0LSRWRVJTSU9OX1VOREVSU0NPUkUiCiAgICAgICAgICAgICAgICAgZG9uZQorICAgICAgICAgICAgICAgIGRubCBpZiBub3RoaW5nIGZvdW5kIHNlYXJjaCBmb3IgbGF5b3V0IHVzZWQgaW4gV2luZG93cyBkaXN0cmlidXRpb25zCisgICAgICAgICAgICAgICAgaWYgdGVzdCAteiAiJEJPT1NUX0NQUEZMQUdTIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC1kICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aC9ib29zdCIgJiYgdGVzdCAtciAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgvYm9vc3QiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICBCT09TVF9DUFBGTEFHUz0iLUkkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aCIKKyAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgIGRubCBpZiB3ZSBmb3VuZCBzb21ldGhpbmcgYW5kIEJPT1NUX0xERkxBR1Mgd2FzIHVuc2V0IGJlZm9yZQorICAgICAgICAgICAgICAgIGRubCAoYmVjYXVzZSAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X2xpYl9wYXRoIiA9ICIiKSwgc2V0IGl0IGhlcmUuCisgICAgICAgICAgICAgICAgaWYgdGVzdCAtbiAiJEJPT1NUX0NQUEZMQUdTIiAmJiB0ZXN0IC16ICIkQk9PU1RfTERGTEFHUyI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgZm9yIGxpYnN1YmRpciBpbiAkbGlic3ViZGlycyA7IGRvCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBscyAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgvJGxpYnN1YmRpci9saWJib29zdF8iKiA+L2Rldi9udWxsIDI+JjEgOyB0aGVuIGJyZWFrOyBmaQorICAgICAgICAgICAgICAgICAgICBkb25lCisgICAgICAgICAgICAgICAgICAgIEJPT1NUX0xERkxBR1M9Ii1MJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgvJGxpYnN1YmRpciIKKyAgICAgICAgICAgICAgICBmaQogICAgICAgICAgICAgZmkKICAgICAgICAgZWxzZQotICAgICAgICAgICAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgIT0geWVzOyB0aGVuCi0gICAgICAgICAgICAgICAgZm9yIGFjX2Jvb3N0X3BhdGggaW4gJGx0X3N5c3Jvb3QvdXNyICRsdF9zeXNyb290L3Vzci9sb2NhbCAkbHRfc3lzcm9vdC9vcHQgJGx0X3N5c3Jvb3Qvb3B0L2xvY2FsIDsgZG8KLSAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAtZCAiJGFjX2Jvb3N0X3BhdGgiICYmIHRlc3QgLXIgIiRhY19ib29zdF9wYXRoIjsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gYGxzIC1kICRhY19ib29zdF9wYXRoL2luY2x1ZGUvYm9vc3QtKiAyPi9kZXYvbnVsbGA7IGRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZlcnNpb25fdG1wPWBlY2hvICRpIHwgc2VkICJzIyRhY19ib29zdF9wYXRoIyMiIHwgc2VkICdzL1wvaW5jbHVkZVwvYm9vc3QtLy8nIHwgc2VkICdzL18vLi8nYAorICAgICAgICAgICAgaWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciICE9ICJ4eWVzIiA7IHRoZW4KKyAgICAgICAgICAgICAgICBmb3IgX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aCBpbiAvdXNyIC91c3IvbG9jYWwgL29wdCAvb3B0L2xvY2FsIDsgZG8KKyAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAtZCAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgiICYmIHRlc3QgLXIgIiRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoIiA7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciBpIGluIGBscyAtZCAkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aC9pbmNsdWRlL2Jvb3N0LSogMj4vZGV2L251bGxgOyBkbworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92ZXJzaW9uX3RtcD1gZWNobyAkaSB8IHNlZCAicyMkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aCMjIiB8IHNlZCAncy9cL2luY2x1ZGVcL2Jvb3N0LS8vJyB8IHNlZCAncy9fLy4vJ2AKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWX0NIRUNLPWBleHByICRfdmVyc2lvbl90bXAgXD4gJF92ZXJzaW9uYAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIiRWX0NIRUNLIiA9ICIxIiA7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0ICJ4JFZfQ0hFQ0siID0gIngxIiA7IHRoZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZlcnNpb249JF92ZXJzaW9uX3RtcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0X3BhdGg9JGFjX2Jvb3N0X3BhdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdF9wYXRoPSRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmkKICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUKICAgICAgICAgICAgICAgICAgICAgZmkKQEAgLTIwMCw3ICsyNDAsNyBAQAogCiAgICAgICAgICAgICAgICAgVkVSU0lPTl9VTkRFUlNDT1JFPWBlY2hvICRfdmVyc2lvbiB8IHNlZCAncy9cLi9fLydgCiAgICAgICAgICAgICAgICAgQk9PU1RfQ1BQRkxBR1M9Ii1JJGJlc3RfcGF0aC9pbmNsdWRlL2Jvb3N0LSRWRVJTSU9OX1VOREVSU0NPUkUiCi0gICAgICAgICAgICAgICAgaWYgdGVzdCAiJGFjX2Jvb3N0X2xpYl9wYXRoIiA9ICIiOyB0aGVuCisgICAgICAgICAgICAgICAgaWYgdGVzdCAteiAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X2xpYl9wYXRoIiA7IHRoZW4KICAgICAgICAgICAgICAgICAgICAgZm9yIGxpYnN1YmRpciBpbiAkbGlic3ViZGlycyA7IGRvCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiBscyAiJGJlc3RfcGF0aC8kbGlic3ViZGlyL2xpYmJvb3N0XyIqID4vZGV2L251bGwgMj4mMSA7IHRoZW4gYnJlYWs7IGZpCiAgICAgICAgICAgICAgICAgICAgIGRvbmUKQEAgLTIwOCw3ICsyNDgsNyBAQAogICAgICAgICAgICAgICAgIGZpCiAgICAgICAgICAgICBmaQogCi0gICAgICAgICAgICBpZiB0ZXN0ICJ4JEJPT1NUX1JPT1QiICE9ICJ4IjsgdGhlbgorICAgICAgICAgICAgaWYgdGVzdCAtbiAiJEJPT1NUX1JPT1QiIDsgdGhlbgogICAgICAgICAgICAgICAgIGZvciBsaWJzdWJkaXIgaW4gJGxpYnN1YmRpcnMgOyBkbwogICAgICAgICAgICAgICAgICAgICBpZiBscyAiJEJPT1NUX1JPT1Qvc3RhZ2UvJGxpYnN1YmRpci9saWJib29zdF8iKiA+L2Rldi9udWxsIDI+JjEgOyB0aGVuIGJyZWFrOyBmaQogICAgICAgICAgICAgICAgIGRvbmUKQEAgLTIxNyw3ICsyNTcsNyBAQAogICAgICAgICAgICAgICAgICAgICBzdGFnZV92ZXJzaW9uPWBlY2hvICR2ZXJzaW9uX2RpciB8IHNlZCAncy9ib29zdF8vLycgfCBzZWQgJ3MvXy8uL2cnYAogICAgICAgICAgICAgICAgICAgICAgICAgc3RhZ2VfdmVyc2lvbl9zaG9ydGVuPWBleHByICRzdGFnZV92ZXJzaW9uIDogJ1woW1swLTldXSpcLltbMC05XV0qXCknYAogICAgICAgICAgICAgICAgICAgICBWX0NIRUNLPWBleHByICRzdGFnZV92ZXJzaW9uX3Nob3J0ZW4gXD5cPSAkX3ZlcnNpb25gCi0gICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIiRWX0NIRUNLIiA9ICIxIiAtYSAiJGFjX2Jvb3N0X2xpYl9wYXRoIiA9ICIiIDsgdGhlbgorICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0ICJ4JFZfQ0hFQ0siID0gIngxIiAmJiB0ZXN0IC16ICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfbGliX3BhdGgiIDsgdGhlbgogICAgICAgICAgICAgICAgICAgICAgICAgQUNfTVNHX05PVElDRShXZSB3aWxsIHVzZSBhIHN0YWdlZCBib29zdCBsaWJyYXJ5IGZyb20gJEJPT1NUX1JPT1QpCiAgICAgICAgICAgICAgICAgICAgICAgICBCT09TVF9DUFBGTEFHUz0iLUkkQk9PU1RfUk9PVCIKICAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX0xERkxBR1M9Ii1MJEJPT1NUX1JPT1Qvc3RhZ2UvJGxpYnN1YmRpciIKQEAgLTIzMiwxNSArMjcyLDcgQEAKICAgICAgICAgZXhwb3J0IExERkxBR1MKIAogICAgICAgICBBQ19MQU5HX1BVU0goQysrKQotICAgICAgICAgICAgQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWwotICAgICAgICBAJTpAaW5jbHVkZSA8Ym9vc3QvdmVyc2lvbi5ocHA+Ci0gICAgICAgIF1dLCBbWwotICAgICAgICAjaWYgQk9PU1RfVkVSU0lPTiA+PSAkV0FOVF9CT09TVF9WRVJTSU9OCi0gICAgICAgIC8vIEV2ZXJ5dGhpbmcgaXMgb2theQotICAgICAgICAjZWxzZQotICAgICAgICAjICBlcnJvciBCb29zdCB2ZXJzaW9uIGlzIHRvbyBvbGQKLSAgICAgICAgI2VuZGlmCi0gICAgICAgIF1dKV0sWworICAgICAgICAgICAgQUNfQ09NUElMRV9JRkVMU0UoW19BWF9CT09TVF9CQVNFX1BST0dSQU0oJFdBTlRfQk9PU1RfVkVSU0lPTildLFsKICAgICAgICAgICAgIEFDX01TR19SRVNVTFQoeWVzKQogICAgICAgICBzdWNjZWVkZWQ9eWVzCiAgICAgICAgIGZvdW5kX3N5c3RlbT15ZXMKQEAgLTI0OSwxNyArMjgxLDE1IEBACiAgICAgICAgIEFDX0xBTkdfUE9QKFtDKytdKQogICAgIGZpCiAKLSAgICBpZiB0ZXN0ICIkc3VjY2VlZGVkIiAhPSAieWVzIiA7IHRoZW4KLSAgICAgICAgaWYgdGVzdCAiJF92ZXJzaW9uIiA9ICIwIiA7IHRoZW4KLSAgICAgICAgICAgIEFDX01TR19OT1RJQ0UoW1tXZSBjb3VsZCBub3QgZGV0ZWN0IHRoZSBib29zdCBsaWJyYXJpZXMgKHZlcnNpb24gJGJvb3N0X2xpYl92ZXJzaW9uX3JlcV9zaG9ydGVuIG9yIGhpZ2hlcikuIElmIHlvdSBoYXZlIGEgc3RhZ2VkIGJvb3N0IGxpYnJhcnkgKHN0aWxsIG5vdCBpbnN0YWxsZWQpIHBsZWFzZSBzcGVjaWZ5IFwkQk9PU1RfUk9PVCBpbiB5b3VyIGVudmlyb25tZW50IGFuZCBkbyBub3QgZ2l2ZSBhIFBBVEggdG8gLS13aXRoLWJvb3N0IG9wdGlvbi4gIElmIHlvdSBhcmUgc3VyZSB5b3UgaGF2ZSBib29zdCBpbnN0YWxsZWQsIHRoZW4gY2hlY2sgeW91ciB2ZXJzaW9uIG51bWJlciBsb29raW5nIGluIDxib29zdC92ZXJzaW9uLmhwcD4uIFNlZSBodHRwOi8vcmFuZHNwcmluZ2VyLmRlL2Jvb3N0IGZvciBtb3JlIGRvY3VtZW50YXRpb24uXV0pCisgICAgaWYgdGVzdCAieCRzdWNjZWVkZWQiICE9ICJ4eWVzIiA7IHRoZW4KKyAgICAgICAgaWYgdGVzdCAieCRfdmVyc2lvbiIgPSAieDAiIDsgdGhlbgorICAgICAgICAgICAgQUNfTVNHX05PVElDRShbW1dlIGNvdWxkIG5vdCBkZXRlY3QgdGhlIGJvb3N0IGxpYnJhcmllcyAodmVyc2lvbiAkMSBvciBoaWdoZXIpLiBJZiB5b3UgaGF2ZSBhIHN0YWdlZCBib29zdCBsaWJyYXJ5IChzdGlsbCBub3QgaW5zdGFsbGVkKSBwbGVhc2Ugc3BlY2lmeSBcJEJPT1NUX1JPT1QgaW4geW91ciBlbnZpcm9ubWVudCBhbmQgZG8gbm90IGdpdmUgYSBQQVRIIHRvIC0td2l0aC1ib29zdCBvcHRpb24uICBJZiB5b3UgYXJlIHN1cmUgeW91IGhhdmUgYm9vc3QgaW5zdGFsbGVkLCB0aGVuIGNoZWNrIHlvdXIgdmVyc2lvbiBudW1iZXIgbG9va2luZyBpbiA8Ym9vc3QvdmVyc2lvbi5ocHA+LiBTZWUgaHR0cDovL3JhbmRzcHJpbmdlci5kZS9ib29zdCBmb3IgbW9yZSBkb2N1bWVudGF0aW9uLl1dKQogICAgICAgICBlbHNlCiAgICAgICAgICAgICBBQ19NU0dfTk9USUNFKFtZb3VyIGJvb3N0IGxpYnJhcmllcyBzZWVtcyB0byBvbGQgKHZlcnNpb24gJF92ZXJzaW9uKS5dKQogICAgICAgICBmaQogICAgICAgICAjIGV4ZWN1dGUgQUNUSU9OLUlGLU5PVC1GT1VORCAoaWYgcHJlc2VudCk6CiAgICAgICAgIGlmZWxzZShbJDNdLCAsIDosIFskM10pCiAgICAgZWxzZQotICAgICAgICBBQ19TVUJTVChCT09TVF9DUFBGTEFHUykKLSAgICAgICAgQUNfU1VCU1QoQk9PU1RfTERGTEFHUykKICAgICAgICAgQUNfREVGSU5FKEhBVkVfQk9PU1QsLFtkZWZpbmUgaWYgdGhlIEJvb3N0IGxpYnJhcnkgaXMgYXZhaWxhYmxlXSkKICAgICAgICAgIyBleGVjdXRlIEFDVElPTi1JRi1GT1VORCAoaWYgcHJlc2VudCk6CiAgICAgICAgIGlmZWxzZShbJDJdLCAsIDosIFskMl0pCkBAIC0yNjcsNiArMjk3LDUgQEAKIAogICAgIENQUEZMQUdTPSIkQ1BQRkxBR1NfU0FWRUQiCiAgICAgTERGTEFHUz0iJExERkxBR1NfU0FWRUQiCi1maQogCiBdKQpkaWZmIC0tZ2l0IGEvYWNsb2NhbC9heF9jaGVja19vcGVuc3NsLm00IGIvYWNsb2NhbC9heF9jaGVja19vcGVuc3NsLm00CmluZGV4IGE4N2M1YTYuLjI4ZTQ4Y2IgMTAwNjQ0Ci0tLSBhL2FjbG9jYWwvYXhfY2hlY2tfb3BlbnNzbC5tNAorKysgYi9hY2xvY2FsL2F4X2NoZWNrX29wZW5zc2wubTQKQEAgLTEsNSArMSw1IEBACiAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAgICAgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2F1dG9jb25mLWFyY2hpdmUvYXhfY2hlY2tfb3BlbnNzbC5odG1sCisjICAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2F1dG9jb25mLWFyY2hpdmUvYXhfY2hlY2tfb3BlbnNzbC5odG1sCiAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIwogIyBTWU5PUFNJUwpAQCAtMzIsNyArMzIsNyBAQAogIyAgIGFuZCB0aGlzIG5vdGljZSBhcmUgcHJlc2VydmVkLiBUaGlzIGZpbGUgaXMgb2ZmZXJlZCBhcy1pcywgd2l0aG91dCBhbnkKICMgICB3YXJyYW50eS4KIAotI3NlcmlhbCA4Cisjc2VyaWFsIDEwCiAKIEFVX0FMSUFTKFtDSEVDS19TU0xdLCBbQVhfQ0hFQ0tfT1BFTlNTTF0pCiBBQ19ERUZVTihbQVhfQ0hFQ0tfT1BFTlNTTF0sIFsKQEAgLTUxLDcgKzUxLDcgQEAKICAgICAgICAgXSwgWwogICAgICAgICAgICAgIyBpZiBwa2ctY29uZmlnIGlzIGluc3RhbGxlZCBhbmQgb3BlbnNzbCBoYXMgaW5zdGFsbGVkIGEgLnBjIGZpbGUsCiAgICAgICAgICAgICAjIHRoZW4gdXNlIHRoYXQgaW5mb3JtYXRpb24gYW5kIGRvbid0IHNlYXJjaCBzc2xkaXJzCi0gICAgICAgICAgICBBQ19QQVRIX1BST0coW1BLR19DT05GSUddLCBbcGtnLWNvbmZpZ10pCisgICAgICAgICAgICBBQ19DSEVDS19UT09MKFtQS0dfQ09ORklHXSwgW3BrZy1jb25maWddKQogICAgICAgICAgICAgaWYgdGVzdCB4IiRQS0dfQ09ORklHIiAhPSB4IiI7IHRoZW4KICAgICAgICAgICAgICAgICBPUEVOU1NMX0xERkxBR1M9YCRQS0dfQ09ORklHIG9wZW5zc2wgLS1saWJzLW9ubHktTCAyPi9kZXYvbnVsbGAKICAgICAgICAgICAgICAgICBpZiB0ZXN0ICQ/ID0gMDsgdGhlbgpkaWZmIC0tZ2l0IGEvYWNsb2NhbC9heF9jb21wYXJlX3ZlcnNpb24ubTQgYi9hY2xvY2FsL2F4X2NvbXBhcmVfdmVyc2lvbi5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzhlMjA4Ci0tLSAvZGV2L251bGwKKysrIGIvYWNsb2NhbC9heF9jb21wYXJlX3ZlcnNpb24ubTQKQEAgLTAsMCArMSwxNzcgQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYXV0b2NvbmYtYXJjaGl2ZS9heF9jb21wYXJlX3ZlcnNpb24uaHRtbAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgU1lOT1BTSVMKKyMKKyMgICBBWF9DT01QQVJFX1ZFUlNJT04oVkVSU0lPTl9BLCBPUCwgVkVSU0lPTl9CLCBbQUNUSU9OLUlGLVRSVUVdLCBbQUNUSU9OLUlGLUZBTFNFXSkKKyMKKyMgREVTQ1JJUFRJT04KKyMKKyMgICBUaGlzIG1hY3JvIGNvbXBhcmVzIHR3byB2ZXJzaW9uIHN0cmluZ3MuIER1ZSB0byB0aGUgdmFyaW91cyBudW1iZXIgb2YKKyMgICBtaW5vci12ZXJzaW9uIG51bWJlcnMgdGhhdCBjYW4gZXhpc3QsIGFuZCB0aGUgZmFjdCB0aGF0IHN0cmluZworIyAgIGNvbXBhcmlzb25zIGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIG51bWVyaWMgY29tcGFyaXNvbnMsIHRoaXMgaXMgbm90CisjICAgbmVjZXNzYXJpbHkgdHJpdmlhbCB0byBkbyBpbiBhIGF1dG9jb25mIHNjcmlwdC4gVGhpcyBtYWNybyBtYWtlcyBkb2luZworIyAgIHRoZXNlIGNvbXBhcmlzb25zIGVhc3kuCisjCisjICAgVGhlIHNpeCBiYXNpYyBjb21wYXJpc29ucyBhcmUgYXZhaWxhYmxlLCBhcyB3ZWxsIGFzIGNoZWNraW5nIGVxdWFsaXR5CisjICAgbGltaXRlZCB0byBhIGNlcnRhaW4gbnVtYmVyIG9mIG1pbm9yLXZlcnNpb24gbGV2ZWxzLgorIworIyAgIFRoZSBvcGVyYXRvciBPUCBkZXRlcm1pbmVzIHdoYXQgdHlwZSBvZiBjb21wYXJpc29uIHRvIGRvLCBhbmQgY2FuIGJlIG9uZQorIyAgIG9mOgorIworIyAgICBlcSAgLSBlcXVhbCAodGVzdCBBID09IEIpCisjICAgIG5lICAtIG5vdCBlcXVhbCAodGVzdCBBICE9IEIpCisjICAgIGxlICAtIGxlc3MgdGhhbiBvciBlcXVhbCAodGVzdCBBIDw9IEIpCisjICAgIGdlICAtIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCAodGVzdCBBID49IEIpCisjICAgIGx0ICAtIGxlc3MgdGhhbiAodGVzdCBBIDwgQikKKyMgICAgZ3QgIC0gZ3JlYXRlciB0aGFuICh0ZXN0IEEgPiBCKQorIworIyAgIEFkZGl0aW9uYWxseSwgdGhlIGVxIGFuZCBuZSBvcGVyYXRvciBjYW4gaGF2ZSBhIG51bWJlciBhZnRlciBpdCB0byBsaW1pdAorIyAgIHRoZSB0ZXN0IHRvIHRoYXQgbnVtYmVyIG9mIG1pbm9yIHZlcnNpb25zLgorIworIyAgICBlcTAgLSBlcXVhbCB1cCB0byB0aGUgbGVuZ3RoIG9mIHRoZSBzaG9ydGVyIHZlcnNpb24KKyMgICAgbmUwIC0gbm90IGVxdWFsIHVwIHRvIHRoZSBsZW5ndGggb2YgdGhlIHNob3J0ZXIgdmVyc2lvbgorIyAgICBlcU4gLSBlcXVhbCB1cCB0byBOIHN1Yi12ZXJzaW9uIGxldmVscworIyAgICBuZU4gLSBub3QgZXF1YWwgdXAgdG8gTiBzdWItdmVyc2lvbiBsZXZlbHMKKyMKKyMgICBXaGVuIHRoZSBjb25kaXRpb24gaXMgdHJ1ZSwgc2hlbGwgY29tbWFuZHMgQUNUSU9OLUlGLVRSVUUgYXJlIHJ1biwKKyMgICBvdGhlcndpc2Ugc2hlbGwgY29tbWFuZHMgQUNUSU9OLUlGLUZBTFNFIGFyZSBydW4uIFRoZSBlbnZpcm9ubWVudAorIyAgIHZhcmlhYmxlICdheF9jb21wYXJlX3ZlcnNpb24nIGlzIGFsd2F5cyBzZXQgdG8gZWl0aGVyICd0cnVlJyBvciAnZmFsc2UnCisjICAgYXMgd2VsbC4KKyMKKyMgICBFeGFtcGxlczoKKyMKKyMgICAgIEFYX0NPTVBBUkVfVkVSU0lPTihbMy4xNS43XSxbbHRdLFszLjE1LjhdKQorIyAgICAgQVhfQ09NUEFSRV9WRVJTSU9OKFszLjE1XSxbbHRdLFszLjE1LjhdKQorIworIyAgIHdvdWxkIGJvdGggYmUgdHJ1ZS4KKyMKKyMgICAgIEFYX0NPTVBBUkVfVkVSU0lPTihbMy4xNS43XSxbZXFdLFszLjE1LjhdKQorIyAgICAgQVhfQ09NUEFSRV9WRVJTSU9OKFszLjE1XSxbZ3RdLFszLjE1LjhdKQorIworIyAgIHdvdWxkIGJvdGggYmUgZmFsc2UuCisjCisjICAgICBBWF9DT01QQVJFX1ZFUlNJT04oWzMuMTUuN10sW2VxMl0sWzMuMTUuOF0pCisjCisjICAgd291bGQgYmUgdHJ1ZSBiZWNhdXNlIGl0IGlzIG9ubHkgY29tcGFyaW5nIHR3byBtaW5vciB2ZXJzaW9ucy4KKyMKKyMgICAgIEFYX0NPTVBBUkVfVkVSU0lPTihbMy4xNS43XSxbZXEwXSxbMy4xNV0pCisjCisjICAgd291bGQgYmUgdHJ1ZSBiZWNhdXNlIGl0IGlzIG9ubHkgY29tcGFyaW5nIHRoZSBsZXNzZXIgbnVtYmVyIG9mIG1pbm9yCisjICAgdmVyc2lvbnMgb2YgdGhlIHR3byB2YWx1ZXMuCisjCisjICAgTm90ZTogVGhlIGNoYXJhY3RlcnMgdGhhdCBzZXBhcmF0ZSB0aGUgdmVyc2lvbiBudW1iZXJzIGRvIG5vdCBtYXR0ZXIuIEFuCisjICAgZW1wdHkgc3RyaW5nIGlzIHRoZSBzYW1lIGFzIHZlcnNpb24gMC4gT1AgaXMgZXZhbHVhdGVkIGJ5IGF1dG9jb25mLCBub3QKKyMgICBjb25maWd1cmUsIHNvIG11c3QgYmUgYSBzdHJpbmcsIG5vdCBhIHZhcmlhYmxlLgorIworIyAgIFRoZSBhdXRob3Igd291bGQgbGlrZSB0byBhY2tub3dsZWRnZSBHdWlkbyBEcmFoZWltIHdob3NlIGFkdmljZSBhYm91dAorIyAgIHRoZSBtNF9jYXNlIGFuZCBtNF9pZnZhbG4gZnVuY3Rpb25zIG1ha2UgdGhpcyBtYWNybyBvbmx5IGluY2x1ZGUgdGhlCisjICAgcG9ydGlvbnMgbmVjZXNzYXJ5IHRvIHBlcmZvcm0gdGhlIHNwZWNpZmljIGNvbXBhcmlzb24gc3BlY2lmaWVkIGJ5IHRoZQorIyAgIE9QIGFyZ3VtZW50IGluIHRoZSBmaW5hbCBjb25maWd1cmUgc2NyaXB0LgorIworIyBMSUNFTlNFCisjCisjICAgQ29weXJpZ2h0IChjKSAyMDA4IFRpbSBUb29sYW4gPHRvb2xhbkBlbGUudXJpLmVkdT4KKyMKKyMgICBDb3B5aW5nIGFuZCBkaXN0cmlidXRpb24gb2YgdGhpcyBmaWxlLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUKKyMgICBwZXJtaXR0ZWQgaW4gYW55IG1lZGl1bSB3aXRob3V0IHJveWFsdHkgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UKKyMgICBhbmQgdGhpcyBub3RpY2UgYXJlIHByZXNlcnZlZC4gVGhpcyBmaWxlIGlzIG9mZmVyZWQgYXMtaXMsIHdpdGhvdXQgYW55CisjICAgd2FycmFudHkuCisKKyNzZXJpYWwgMTIKKworZG5sICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK0FDX0RFRlVOKFtBWF9DT01QQVJFX1ZFUlNJT05dLCBbCisgIEFDX1JFUVVJUkUoW0FDX1BST0dfQVdLXSkKKworICAjIFVzZWQgdG8gaW5kaWNhdGUgdHJ1ZSBvciBmYWxzZSBjb25kaXRpb24KKyAgYXhfY29tcGFyZV92ZXJzaW9uPWZhbHNlCisKKyAgIyBDb252ZXJ0IHRoZSB0d28gdmVyc2lvbiBzdHJpbmdzIHRvIGJlIGNvbXBhcmVkIGludG8gYSBmb3JtYXQgdGhhdAorICAjIGFsbG93cyBhIHNpbXBsZSBzdHJpbmcgY29tcGFyaXNvbi4gIFRoZSBlbmQgcmVzdWx0IGlzIHRoYXQgYSB2ZXJzaW9uCisgICMgc3RyaW5nIG9mIHRoZSBmb3JtIDEuMTIuNS1yNjE3IHdpbGwgYmUgY29udmVydGVkIHRvIHRoZSBmb3JtCisgICMgMDAwMTAwMTIwMDA1MDYxNy4gIEluIG90aGVyIHdvcmRzLCBlYWNoIG51bWJlciBpcyB6ZXJvIHBhZGRlZCB0byBmb3VyCisgICMgZGlnaXRzLCBhbmQgbm9uIGRpZ2l0cyBhcmUgcmVtb3ZlZC4KKyAgQVNfVkFSX1BVU0hERUYoW0FdLFtheF9jb21wYXJlX3ZlcnNpb25fQV0pCisgIEE9YGVjaG8gIiQxIiB8IHNlZCAtZSAncy9cKFtbMC05XV0qXCkvWlwxWi9nJyBcCisgICAgICAgICAgICAgICAgICAgICAtZSAncy9aXChbWzAtOV1dXClaL1owXDFaL2cnIFwKKyAgICAgICAgICAgICAgICAgICAgIC1lICdzL1pcKFtbMC05XV1bWzAtOV1dXClaL1owXDFaL2cnIFwKKyAgICAgICAgICAgICAgICAgICAgIC1lICdzL1pcKFtbMC05XV1bWzAtOV1dW1swLTldXVwpWi9aMFwxWi9nJyBcCisgICAgICAgICAgICAgICAgICAgICAtZSAncy9bW14wLTldXS8vZydgCisKKyAgQVNfVkFSX1BVU0hERUYoW0JdLFtheF9jb21wYXJlX3ZlcnNpb25fQl0pCisgIEI9YGVjaG8gIiQzIiB8IHNlZCAtZSAncy9cKFtbMC05XV0qXCkvWlwxWi9nJyBcCisgICAgICAgICAgICAgICAgICAgICAtZSAncy9aXChbWzAtOV1dXClaL1owXDFaL2cnIFwKKyAgICAgICAgICAgICAgICAgICAgIC1lICdzL1pcKFtbMC05XV1bWzAtOV1dXClaL1owXDFaL2cnIFwKKyAgICAgICAgICAgICAgICAgICAgIC1lICdzL1pcKFtbMC05XV1bWzAtOV1dW1swLTldXVwpWi9aMFwxWi9nJyBcCisgICAgICAgICAgICAgICAgICAgICAtZSAncy9bW14wLTldXS8vZydgCisKKyAgZG5sICMgSW4gdGhlIGNhc2Ugb2YgbGUsIGdlLCBsdCwgYW5kIGd0LCB0aGUgc3RyaW5ncyBhcmUgc29ydGVkIGFzIG5lY2Vzc2FyeQorICBkbmwgIyB0aGVuIHRoZSBmaXJzdCBsaW5lIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBjb25kaXRpb24gaXMgdHJ1ZS4KKyAgZG5sICMgVGhlIHNlZCByaWdodCBhZnRlciB0aGUgZWNobyBpcyB0byByZW1vdmUgYW55IGluZGVudGVkIHdoaXRlIHNwYWNlLgorICBtNF9jYXNlKG00X3RvbG93ZXIoJDIpLAorICBbbHRdLFsKKyAgICBheF9jb21wYXJlX3ZlcnNpb249YGVjaG8gIngkQQoreCRCIiB8IHNlZCAncy9eICovLycgfCBzb3J0IC1yIHwgc2VkICJzL3gke0F9L2ZhbHNlLztzL3gke0J9L3RydWUvOzFxImAKKyAgXSwKKyAgW2d0XSxbCisgICAgYXhfY29tcGFyZV92ZXJzaW9uPWBlY2hvICJ4JEEKK3gkQiIgfCBzZWQgJ3MvXiAqLy8nIHwgc29ydCB8IHNlZCAicy94JHtBfS9mYWxzZS87cy94JHtCfS90cnVlLzsxcSJgCisgIF0sCisgIFtsZV0sWworICAgIGF4X2NvbXBhcmVfdmVyc2lvbj1gZWNobyAieCRBCit4JEIiIHwgc2VkICdzL14gKi8vJyB8IHNvcnQgfCBzZWQgInMveCR7QX0vdHJ1ZS87cy94JHtCfS9mYWxzZS87MXEiYAorICBdLAorICBbZ2VdLFsKKyAgICBheF9jb21wYXJlX3ZlcnNpb249YGVjaG8gIngkQQoreCRCIiB8IHNlZCAncy9eICovLycgfCBzb3J0IC1yIHwgc2VkICJzL3gke0F9L3RydWUvO3MveCR7Qn0vZmFsc2UvOzFxImAKKyAgXSxbCisgICAgZG5sIFNwbGl0IHRoZSBvcGVyYXRvciBmcm9tIHRoZSBzdWJ2ZXJzaW9uIGNvdW50IGlmIHByZXNlbnQuCisgICAgbTRfYm1hdGNoKG00X3N1YnN0cigkMiwyKSwKKyAgICBbMF0sWworICAgICAgIyBBIGNvdW50IG9mIHplcm8gbWVhbnMgdXNlIHRoZSBsZW5ndGggb2YgdGhlIHNob3J0ZXIgdmVyc2lvbi4KKyAgICAgICMgRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBBIGFuZCBCLgorICAgICAgYXhfY29tcGFyZV92ZXJzaW9uX2xlbl9BPWBlY2hvICIkQSIgfCAkQVdLICd7cHJpbnQobGVuZ3RoKX0nYAorICAgICAgYXhfY29tcGFyZV92ZXJzaW9uX2xlbl9CPWBlY2hvICIkQiIgfCAkQVdLICd7cHJpbnQobGVuZ3RoKX0nYAorCisgICAgICAjIFNldCBBIHRvIG5vIG1vcmUgdGhhbiBCJ3MgbGVuZ3RoIGFuZCBCIHRvIG5vIG1vcmUgdGhhbiBBJ3MgbGVuZ3RoLgorICAgICAgQT1gZWNobyAiJEEiIHwgc2VkICJzL1woLlx7JGF4X2NvbXBhcmVfdmVyc2lvbl9sZW5fQlx9XCkuKi9cMS8iYAorICAgICAgQj1gZWNobyAiJEIiIHwgc2VkICJzL1woLlx7JGF4X2NvbXBhcmVfdmVyc2lvbl9sZW5fQVx9XCkuKi9cMS8iYAorICAgIF0sCisgICAgW1swLTldK10sWworICAgICAgIyBBIGNvdW50IGdyZWF0ZXIgdGhhbiB6ZXJvIG1lYW5zIHVzZSBvbmx5IHRoYXQgbWFueSBzdWJ2ZXJzaW9ucworICAgICAgQT1gZWNobyAiJEEiIHwgc2VkICJzL1woXChbWzAtOV1dXHs0XH1cKVx7bTRfc3Vic3RyKCQyLDIpXH1cKS4qL1wxLyJgCisgICAgICBCPWBlY2hvICIkQiIgfCBzZWQgInMvXChcKFtbMC05XV1cezRcfVwpXHttNF9zdWJzdHIoJDIsMilcfVwpLiovXDEvImAKKyAgICBdLAorICAgIFsuK10sWworICAgICAgQUNfV0FSTklORygKKyAgICAgICAgW2lsbGVnYWwgT1AgbnVtZXJpYyBwYXJhbWV0ZXI6ICQyXSkKKyAgICBdLFtdKQorCisgICAgIyBQYWQgemVyb3MgYXQgZW5kIG9mIG51bWJlcnMgdG8gbWFrZSBzYW1lIGxlbmd0aC4KKyAgICBheF9jb21wYXJlX3ZlcnNpb25fdG1wX0E9IiRBYGVjaG8gJEIgfCBzZWQgJ3MvLi8wL2cnYCIKKyAgICBCPSIkQmBlY2hvICRBIHwgc2VkICdzLy4vMC9nJ2AiCisgICAgQT0iJGF4X2NvbXBhcmVfdmVyc2lvbl90bXBfQSIKKworICAgICMgQ2hlY2sgZm9yIGVxdWFsaXR5IG9yIGluZXF1YWxpdHkgYXMgbmVjZXNzYXJ5LgorICAgIG00X2Nhc2UobTRfdG9sb3dlcihtNF9zdWJzdHIoJDIsMCwyKSksCisgICAgW2VxXSxbCisgICAgICB0ZXN0ICJ4JEEiID0gIngkQiIgJiYgYXhfY29tcGFyZV92ZXJzaW9uPXRydWUKKyAgICBdLAorICAgIFtuZV0sWworICAgICAgdGVzdCAieCRBIiAhPSAieCRCIiAmJiBheF9jb21wYXJlX3ZlcnNpb249dHJ1ZQorICAgIF0sWworICAgICAgQUNfV0FSTklORyhbaWxsZWdhbCBPUCBwYXJhbWV0ZXI6ICQyXSkKKyAgICBdKQorICBdKQorCisgIEFTX1ZBUl9QT1BERUYoW0FdKWRubAorICBBU19WQVJfUE9QREVGKFtCXSlkbmwKKworICBkbmwgIyBFeGVjdXRlIEFDVElPTi1JRi1UUlVFIC8gQUNUSU9OLUlGLUZBTFNFLgorICBpZiB0ZXN0ICIkYXhfY29tcGFyZV92ZXJzaW9uIiA9ICJ0cnVlIiA7IHRoZW4KKyAgICBtNF9pZnZhbG4oWyQ0XSxbJDRdLFs6XSlkbmwKKyAgICBtNF9pZnZhbG4oWyQ1XSxbZWxzZSAkNV0pZG5sCisgIGZpCitdKSBkbmwgQVhfQ09NUEFSRV9WRVJTSU9OCmRpZmYgLS1naXQgYS9hY2xvY2FsL2F4X2N4eF9jb21waWxlX3N0ZGN4eC5tNCBiL2FjbG9jYWwvYXhfY3h4X2NvbXBpbGVfc3RkY3h4Lm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllOWVhZWQKLS0tIC9kZXYvbnVsbAorKysgYi9hY2xvY2FsL2F4X2N4eF9jb21waWxlX3N0ZGN4eC5tNApAQCAtMCwwICsxLDk0OCBAQAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYXV0b2NvbmYtYXJjaGl2ZS9heF9jeHhfY29tcGlsZV9zdGRjeHguaHRtbAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgU1lOT1BTSVMKKyMKKyMgICBBWF9DWFhfQ09NUElMRV9TVERDWFgoVkVSU0lPTiwgW2V4dHxub2V4dF0sIFttYW5kYXRvcnl8b3B0aW9uYWxdKQorIworIyBERVNDUklQVElPTgorIworIyAgIENoZWNrIGZvciBiYXNlbGluZSBsYW5ndWFnZSBjb3ZlcmFnZSBpbiB0aGUgY29tcGlsZXIgZm9yIHRoZSBzcGVjaWZpZWQKKyMgICB2ZXJzaW9uIG9mIHRoZSBDKysgc3RhbmRhcmQuICBJZiBuZWNlc3NhcnksIGFkZCBzd2l0Y2hlcyB0byBDWFggYW5kCisjICAgQ1hYQ1BQIHRvIGVuYWJsZSBzdXBwb3J0LiAgVkVSU0lPTiBtYXkgYmUgJzExJyAoZm9yIHRoZSBDKysxMSBzdGFuZGFyZCkKKyMgICBvciAnMTQnIChmb3IgdGhlIEMrKzE0IHN0YW5kYXJkKS4KKyMKKyMgICBUaGUgc2Vjb25kIGFyZ3VtZW50LCBpZiBzcGVjaWZpZWQsIGluZGljYXRlcyB3aGV0aGVyIHlvdSBpbnNpc3Qgb24gYW4KKyMgICBleHRlbmRlZCBtb2RlIChlLmcuIC1zdGQ9Z251KysxMSkgb3IgYSBzdHJpY3QgY29uZm9ybWFuY2UgbW9kZSAoZS5nLgorIyAgIC1zdGQ9YysrMTEpLiAgSWYgbmVpdGhlciBpcyBzcGVjaWZpZWQsIHlvdSBnZXQgd2hhdGV2ZXIgd29ya3MsIHdpdGgKKyMgICBwcmVmZXJlbmNlIGZvciBhbiBleHRlbmRlZCBtb2RlLgorIworIyAgIFRoZSB0aGlyZCBhcmd1bWVudCwgaWYgc3BlY2lmaWVkICdtYW5kYXRvcnknIG9yIGlmIGxlZnQgdW5zcGVjaWZpZWQsCisjICAgaW5kaWNhdGVzIHRoYXQgYmFzZWxpbmUgc3VwcG9ydCBmb3IgdGhlIHNwZWNpZmllZCBDKysgc3RhbmRhcmQgaXMKKyMgICByZXF1aXJlZCBhbmQgdGhhdCB0aGUgbWFjcm8gc2hvdWxkIGVycm9yIG91dCBpZiBubyBtb2RlIHdpdGggdGhhdAorIyAgIHN1cHBvcnQgaXMgZm91bmQuICBJZiBzcGVjaWZpZWQgJ29wdGlvbmFsJywgdGhlbiBjb25maWd1cmF0aW9uIHByb2NlZWRzCisjICAgcmVnYXJkbGVzcywgYWZ0ZXIgZGVmaW5pbmcgSEFWRV9DWFgke1ZFUlNJT059IGlmIGFuZCBvbmx5IGlmIGEKKyMgICBzdXBwb3J0aW5nIG1vZGUgaXMgZm91bmQuCisjCisjIExJQ0VOU0UKKyMKKyMgICBDb3B5cmlnaHQgKGMpIDIwMDggQmVuamFtaW4gS29zbmlrIDxia296QHJlZGhhdC5jb20+CisjICAgQ29weXJpZ2h0IChjKSAyMDEyIFphY2sgV2VpbmJlcmcgPHphY2t3QHBhbml4LmNvbT4KKyMgICBDb3B5cmlnaHQgKGMpIDIwMTMgUm95IFN0b2duZXIgPHJveXN0Z25yQGljZXMudXRleGFzLmVkdT4KKyMgICBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTUgR29vZ2xlIEluYy47IGNvbnRyaWJ1dGVkIGJ5IEFsZXhleSBTb2tvbG92IDxzb2tvbG92QGdvb2dsZS5jb20+CisjICAgQ29weXJpZ2h0IChjKSAyMDE1IFBhdWwgTm9ybWFuIDxwZW5vcm1hbkBtYWMuY29tPgorIyAgIENvcHlyaWdodCAoYykgMjAxNSBNb3JpdHogS2xhbW1sZXIgPG1vcml0ekBrbGFtbWxlci5ldT4KKyMgICBDb3B5cmlnaHQgKGMpIDIwMTYsIDIwMTggS3J6ZXNpbWlyIE5vd2FrIDxxZGxhY3pAZ21haWwuY29tPgorIworIyAgIENvcHlpbmcgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIGZpbGUsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZQorIyAgIHBlcm1pdHRlZCBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgcm95YWx0eSBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZQorIyAgIGFuZCB0aGlzIG5vdGljZSBhcmUgcHJlc2VydmVkLiAgVGhpcyBmaWxlIGlzIG9mZmVyZWQgYXMtaXMsIHdpdGhvdXQgYW55CisjICAgd2FycmFudHkuCisKKyNzZXJpYWwgMTAKKworZG5sICBUaGlzIG1hY3JvIGlzIGJhc2VkIG9uIHRoZSBjb2RlIGZyb20gdGhlIEFYX0NYWF9DT01QSUxFX1NURENYWF8xMSBtYWNybworZG5sICAoc2VyaWFsIHZlcnNpb24gbnVtYmVyIDEzKS4KKworQUNfREVGVU4oW0FYX0NYWF9DT01QSUxFX1NURENYWF0sIFtkbmwKKyAgbTRfaWYoWyQxXSwgWzExXSwgW2F4X2N4eF9jb21waWxlX2FsdGVybmF0aXZlcz0iMTEgMHgiXSwKKyAgICAgICAgWyQxXSwgWzE0XSwgW2F4X2N4eF9jb21waWxlX2FsdGVybmF0aXZlcz0iMTQgMXkiXSwKKyAgICAgICAgWyQxXSwgWzE3XSwgW2F4X2N4eF9jb21waWxlX2FsdGVybmF0aXZlcz0iMTcgMXoiXSwKKyAgICAgICAgW200X2ZhdGFsKFtpbnZhbGlkIGZpcnN0IGFyZ3VtZW50IGAkMScgdG8gQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXSldKWRubAorICBtNF9pZihbJDJdLCBbXSwgW10sCisgICAgICAgIFskMl0sIFtleHRdLCBbXSwKKyAgICAgICAgWyQyXSwgW25vZXh0XSwgW10sCisgICAgICAgIFttNF9mYXRhbChbaW52YWxpZCBzZWNvbmQgYXJndW1lbnQgYCQyJyB0byBBWF9DWFhfQ09NUElMRV9TVERDWFhdKV0pZG5sCisgIG00X2lmKFskM10sIFtdLCBbYXhfY3h4X2NvbXBpbGVfY3h4JDFfcmVxdWlyZWQ9dHJ1ZV0sCisgICAgICAgIFskM10sIFttYW5kYXRvcnldLCBbYXhfY3h4X2NvbXBpbGVfY3h4JDFfcmVxdWlyZWQ9dHJ1ZV0sCisgICAgICAgIFskM10sIFtvcHRpb25hbF0sIFtheF9jeHhfY29tcGlsZV9jeHgkMV9yZXF1aXJlZD1mYWxzZV0sCisgICAgICAgIFttNF9mYXRhbChbaW52YWxpZCB0aGlyZCBhcmd1bWVudCBgJDMnIHRvIEFYX0NYWF9DT01QSUxFX1NURENYWF0pXSkKKyAgQUNfTEFOR19QVVNIKFtDKytdKWRubAorICBhY19zdWNjZXNzPW5vCisKKyAgbTRfaWYoWyQyXSwgW25vZXh0XSwgW10sIFtkbmwKKyAgaWYgdGVzdCB4JGFjX3N1Y2Nlc3MgPSB4bm87IHRoZW4KKyAgICBmb3IgYWx0ZXJuYXRpdmUgaW4gJHtheF9jeHhfY29tcGlsZV9hbHRlcm5hdGl2ZXN9OyBkbworICAgICAgc3dpdGNoPSItc3RkPWdudSsrJHthbHRlcm5hdGl2ZX0iCisgICAgICBjYWNoZXZhcj1BU19UUl9TSChbYXhfY3ZfY3h4X2NvbXBpbGVfY3h4JDFfJHN3aXRjaF0pCisgICAgICBBQ19DQUNIRV9DSEVDSyh3aGV0aGVyICRDWFggc3VwcG9ydHMgQysrJDEgZmVhdHVyZXMgd2l0aCAkc3dpdGNoLAorICAgICAgICAgICAgICAgICAgICAgJGNhY2hldmFyLAorICAgICAgICBbYWNfc2F2ZV9DWFg9IiRDWFgiCisgICAgICAgICBDWFg9IiRDWFggJHN3aXRjaCIKKyAgICAgICAgIEFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1NPVVJDRShbX0FYX0NYWF9DT01QSUxFX1NURENYWF90ZXN0Ym9keV8kMV0pXSwKKyAgICAgICAgICBbZXZhbCAkY2FjaGV2YXI9eWVzXSwKKyAgICAgICAgICBbZXZhbCAkY2FjaGV2YXI9bm9dKQorICAgICAgICAgQ1hYPSIkYWNfc2F2ZV9DWFgiXSkKKyAgICAgIGlmIGV2YWwgdGVzdCB4XCQkY2FjaGV2YXIgPSB4eWVzOyB0aGVuCisgICAgICAgIENYWD0iJENYWCAkc3dpdGNoIgorICAgICAgICBpZiB0ZXN0IC1uICIkQ1hYQ1BQIiA7IHRoZW4KKyAgICAgICAgICBDWFhDUFA9IiRDWFhDUFAgJHN3aXRjaCIKKyAgICAgICAgZmkKKyAgICAgICAgYWNfc3VjY2Vzcz15ZXMKKyAgICAgICAgYnJlYWsKKyAgICAgIGZpCisgICAgZG9uZQorICBmaV0pCisKKyAgbTRfaWYoWyQyXSwgW2V4dF0sIFtdLCBbZG5sCisgIGlmIHRlc3QgeCRhY19zdWNjZXNzID0geG5vOyB0aGVuCisgICAgZG5sIEhQJ3MgYUNDIG5lZWRzICtzdGQ9YysrMTEgYWNjb3JkaW5nIHRvOgorICAgIGRubCBodHRwOi8vaDIxMDA3Lnd3dzIuaHAuY29tL3BvcnRhbC9kb3dubG9hZC9maWxlcy91bnByb3QvYUN4eC9QREZfUmVsZWFzZV9Ob3Rlcy83NjkxNDktMDAxLnBkZgorICAgIGRubCBDcmF5J3MgY3JheUNDIG5lZWRzICItaCBzdGQ9YysrMTEiCisgICAgZm9yIGFsdGVybmF0aXZlIGluICR7YXhfY3h4X2NvbXBpbGVfYWx0ZXJuYXRpdmVzfTsgZG8KKyAgICAgIGZvciBzd2l0Y2ggaW4gLXN0ZD1jKyske2FsdGVybmF0aXZlfSArc3RkPWMrKyR7YWx0ZXJuYXRpdmV9ICItaCBzdGQ9YysrJHthbHRlcm5hdGl2ZX0iOyBkbworICAgICAgICBjYWNoZXZhcj1BU19UUl9TSChbYXhfY3ZfY3h4X2NvbXBpbGVfY3h4JDFfJHN3aXRjaF0pCisgICAgICAgIEFDX0NBQ0hFX0NIRUNLKHdoZXRoZXIgJENYWCBzdXBwb3J0cyBDKyskMSBmZWF0dXJlcyB3aXRoICRzd2l0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICRjYWNoZXZhciwKKyAgICAgICAgICBbYWNfc2F2ZV9DWFg9IiRDWFgiCisgICAgICAgICAgIENYWD0iJENYWCAkc3dpdGNoIgorICAgICAgICAgICBBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19TT1VSQ0UoW19BWF9DWFhfQ09NUElMRV9TVERDWFhfdGVzdGJvZHlfJDFdKV0sCisgICAgICAgICAgICBbZXZhbCAkY2FjaGV2YXI9eWVzXSwKKyAgICAgICAgICAgIFtldmFsICRjYWNoZXZhcj1ub10pCisgICAgICAgICAgIENYWD0iJGFjX3NhdmVfQ1hYIl0pCisgICAgICAgIGlmIGV2YWwgdGVzdCB4XCQkY2FjaGV2YXIgPSB4eWVzOyB0aGVuCisgICAgICAgICAgQ1hYPSIkQ1hYICRzd2l0Y2giCisgICAgICAgICAgaWYgdGVzdCAtbiAiJENYWENQUCIgOyB0aGVuCisgICAgICAgICAgICBDWFhDUFA9IiRDWFhDUFAgJHN3aXRjaCIKKyAgICAgICAgICBmaQorICAgICAgICAgIGFjX3N1Y2Nlc3M9eWVzCisgICAgICAgICAgYnJlYWsKKyAgICAgICAgZmkKKyAgICAgIGRvbmUKKyAgICAgIGlmIHRlc3QgeCRhY19zdWNjZXNzID0geHllczsgdGhlbgorICAgICAgICBicmVhaworICAgICAgZmkKKyAgICBkb25lCisgIGZpXSkKKyAgQUNfTEFOR19QT1AoW0MrK10pCisgIGlmIHRlc3QgeCRheF9jeHhfY29tcGlsZV9jeHgkMV9yZXF1aXJlZCA9IHh0cnVlOyB0aGVuCisgICAgaWYgdGVzdCB4JGFjX3N1Y2Nlc3MgPSB4bm87IHRoZW4KKyAgICAgIEFDX01TR19FUlJPUihbKioqIEEgY29tcGlsZXIgd2l0aCBzdXBwb3J0IGZvciBDKyskMSBsYW5ndWFnZSBmZWF0dXJlcyBpcyByZXF1aXJlZC5dKQorICAgIGZpCisgIGZpCisgIGlmIHRlc3QgeCRhY19zdWNjZXNzID0geG5vOyB0aGVuCisgICAgSEFWRV9DWFgkMT0wCisgICAgQUNfTVNHX05PVElDRShbTm8gY29tcGlsZXIgd2l0aCBDKyskMSBzdXBwb3J0IHdhcyBmb3VuZF0pCisgIGVsc2UKKyAgICBIQVZFX0NYWCQxPTEKKyAgICBBQ19ERUZJTkUoSEFWRV9DWFgkMSwxLAorICAgICAgICAgICAgICBbZGVmaW5lIGlmIHRoZSBjb21waWxlciBzdXBwb3J0cyBiYXNpYyBDKyskMSBzeW50YXhdKQorICBmaQorICBBQ19TVUJTVChIQVZFX0NYWCQxKQorXSkKKworCitkbmwgIFRlc3QgYm9keSBmb3IgY2hlY2tpbmcgQysrMTEgc3VwcG9ydAorCittNF9kZWZpbmUoW19BWF9DWFhfQ09NUElMRV9TVERDWFhfdGVzdGJvZHlfMTFdLAorICBfQVhfQ1hYX0NPTVBJTEVfU1REQ1hYX3Rlc3Rib2R5X25ld19pbl8xMQorKQorCisKK2RubCAgVGVzdCBib2R5IGZvciBjaGVja2luZyBDKysxNCBzdXBwb3J0CisKK200X2RlZmluZShbX0FYX0NYWF9DT01QSUxFX1NURENYWF90ZXN0Ym9keV8xNF0sCisgIF9BWF9DWFhfQ09NUElMRV9TVERDWFhfdGVzdGJvZHlfbmV3X2luXzExCisgIF9BWF9DWFhfQ09NUElMRV9TVERDWFhfdGVzdGJvZHlfbmV3X2luXzE0CispCisKK200X2RlZmluZShbX0FYX0NYWF9DT01QSUxFX1NURENYWF90ZXN0Ym9keV8xN10sCisgIF9BWF9DWFhfQ09NUElMRV9TVERDWFhfdGVzdGJvZHlfbmV3X2luXzExCisgIF9BWF9DWFhfQ09NUElMRV9TVERDWFhfdGVzdGJvZHlfbmV3X2luXzE0CisgIF9BWF9DWFhfQ09NUElMRV9TVERDWFhfdGVzdGJvZHlfbmV3X2luXzE3CispCisKK2RubCAgVGVzdHMgZm9yIG5ldyBmZWF0dXJlcyBpbiBDKysxMQorCittNF9kZWZpbmUoW19BWF9DWFhfQ09NUElMRV9TVERDWFhfdGVzdGJvZHlfbmV3X2luXzExXSwgW1sKKworLy8gSWYgdGhlIGNvbXBpbGVyIGFkbWl0cyB0aGF0IGl0IGlzIG5vdCByZWFkeSBmb3IgQysrMTEsIHdoeSB0b3J0dXJlIGl0PworLy8gSG9wZWZ1bGx5LCB0aGlzIHdpbGwgc3BlZWQgdXAgdGhlIHRlc3QuCisKKyNpZm5kZWYgX19jcGx1c3BsdXMKKworI2Vycm9yICJUaGlzIGlzIG5vdCBhIEMrKyBjb21waWxlciIKKworI2VsaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCisKKyNlcnJvciAiVGhpcyBpcyBub3QgYSBDKysxMSBjb21waWxlciIKKworI2Vsc2UKKworbmFtZXNwYWNlIGN4eDExCit7CisKKyAgbmFtZXNwYWNlIHRlc3Rfc3RhdGljX2Fzc2VydAorICB7CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICBzdHJ1Y3QgY2hlY2sKKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihpbnQpIDw9IHNpemVvZihUKSwgIm5vdCBiaWcgZW5vdWdoIik7CisgICAgfTsKKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfZmluYWxfb3ZlcnJpZGUKKyAgeworCisgICAgc3RydWN0IEJhc2UKKyAgICB7CisgICAgICB2aXJ0dWFsIHZvaWQgZigpIHt9CisgICAgfTsKKworICAgIHN0cnVjdCBEZXJpdmVkIDogcHVibGljIEJhc2UKKyAgICB7CisgICAgICB2aXJ0dWFsIHZvaWQgZigpIG92ZXJyaWRlIHt9CisgICAgfTsKKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfZG91YmxlX3JpZ2h0X2FuZ2xlX2JyYWNrZXRzCisgIHsKKworICAgIHRlbXBsYXRlIDwgdHlwZW5hbWUgVCA+CisgICAgc3RydWN0IGNoZWNrIHt9OworCisgICAgdHlwZWRlZiBjaGVjazx2b2lkPiBzaW5nbGVfdHlwZTsKKyAgICB0eXBlZGVmIGNoZWNrPGNoZWNrPHZvaWQ+PiBkb3VibGVfdHlwZTsKKyAgICB0eXBlZGVmIGNoZWNrPGNoZWNrPGNoZWNrPHZvaWQ+Pj4gdHJpcGxlX3R5cGU7CisgICAgdHlwZWRlZiBjaGVjazxjaGVjazxjaGVjazxjaGVjazx2b2lkPj4+PiBxdWFkcnVwbGVfdHlwZTsKKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfZGVjbHR5cGUKKyAgeworCisgICAgaW50CisgICAgZigpCisgICAgeworICAgICAgaW50IGEgPSAxOworICAgICAgZGVjbHR5cGUoYSkgYiA9IDI7CisgICAgICByZXR1cm4gYSArIGI7CisgICAgfQorCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF90eXBlX2RlZHVjdGlvbgorICB7CisKKyAgICB0ZW1wbGF0ZSA8IHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiA+CisgICAgc3RydWN0IGlzX3NhbWUKKyAgICB7CisgICAgICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IGZhbHNlOworICAgIH07CisKKyAgICB0ZW1wbGF0ZSA8IHR5cGVuYW1lIFQgPgorICAgIHN0cnVjdCBpc19zYW1lPFQsIFQ+CisgICAgeworICAgICAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOworICAgIH07CisKKyAgICB0ZW1wbGF0ZSA8IHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiA+CisgICAgYXV0bworICAgIGFkZChUMSBhMSwgVDIgYTIpIC0+IGRlY2x0eXBlKGExICsgYTIpCisgICAgeworICAgICAgcmV0dXJuIGExICsgYTI7CisgICAgfQorCisgICAgaW50CisgICAgdGVzdChjb25zdCBpbnQgYywgdm9sYXRpbGUgaW50IHYpCisgICAgeworICAgICAgc3RhdGljX2Fzc2VydChpc19zYW1lPGludCwgZGVjbHR5cGUoMCk+Ojp2YWx1ZSA9PSB0cnVlLCAiIik7CisgICAgICBzdGF0aWNfYXNzZXJ0KGlzX3NhbWU8aW50LCBkZWNsdHlwZShjKT46OnZhbHVlID09IGZhbHNlLCAiIik7CisgICAgICBzdGF0aWNfYXNzZXJ0KGlzX3NhbWU8aW50LCBkZWNsdHlwZSh2KT46OnZhbHVlID09IGZhbHNlLCAiIik7CisgICAgICBhdXRvIGFjID0gYzsKKyAgICAgIGF1dG8gYXYgPSB2OworICAgICAgYXV0byBzdW1pID0gYWMgKyBhdiArICd4JzsKKyAgICAgIGF1dG8gc3VtZiA9IGFjICsgYXYgKyAxLjA7CisgICAgICBzdGF0aWNfYXNzZXJ0KGlzX3NhbWU8aW50LCBkZWNsdHlwZShhYyk+Ojp2YWx1ZSA9PSB0cnVlLCAiIik7CisgICAgICBzdGF0aWNfYXNzZXJ0KGlzX3NhbWU8aW50LCBkZWNsdHlwZShhdik+Ojp2YWx1ZSA9PSB0cnVlLCAiIik7CisgICAgICBzdGF0aWNfYXNzZXJ0KGlzX3NhbWU8aW50LCBkZWNsdHlwZShzdW1pKT46OnZhbHVlID09IHRydWUsICIiKTsKKyAgICAgIHN0YXRpY19hc3NlcnQoaXNfc2FtZTxpbnQsIGRlY2x0eXBlKHN1bWYpPjo6dmFsdWUgPT0gZmFsc2UsICIiKTsKKyAgICAgIHN0YXRpY19hc3NlcnQoaXNfc2FtZTxpbnQsIGRlY2x0eXBlKGFkZChjLCB2KSk+Ojp2YWx1ZSA9PSB0cnVlLCAiIik7CisgICAgICByZXR1cm4gKHN1bWYgPiAwLjApID8gc3VtaSA6IGFkZChjLCB2KTsKKyAgICB9CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X25vZXhjZXB0CisgIHsKKworICAgIGludCBmKCkgeyByZXR1cm4gMDsgfQorICAgIGludCBnKCkgbm9leGNlcHQgeyByZXR1cm4gMDsgfQorCisgICAgc3RhdGljX2Fzc2VydChub2V4Y2VwdChmKCkpID09IGZhbHNlLCAiIik7CisgICAgc3RhdGljX2Fzc2VydChub2V4Y2VwdChnKCkpID09IHRydWUsICIiKTsKKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfY29uc3RleHByCisgIHsKKworICAgIHRlbXBsYXRlIDwgdHlwZW5hbWUgQ2hhclQgPgorICAgIHVuc2lnbmVkIGxvbmcgY29uc3RleHByCisgICAgc3RybGVuX2Nfcihjb25zdCBDaGFyVCAqY29uc3QgcywgY29uc3QgdW5zaWduZWQgbG9uZyBhY2MpIG5vZXhjZXB0CisgICAgeworICAgICAgcmV0dXJuICpzID8gc3RybGVuX2NfcihzICsgMSwgYWNjICsgMSkgOiBhY2M7CisgICAgfQorCisgICAgdGVtcGxhdGUgPCB0eXBlbmFtZSBDaGFyVCA+CisgICAgdW5zaWduZWQgbG9uZyBjb25zdGV4cHIKKyAgICBzdHJsZW5fYyhjb25zdCBDaGFyVCAqY29uc3Qgcykgbm9leGNlcHQKKyAgICB7CisgICAgICByZXR1cm4gc3RybGVuX2NfcihzLCAwVUwpOworICAgIH0KKworICAgIHN0YXRpY19hc3NlcnQoc3RybGVuX2MoIiIpID09IDBVTCwgIiIpOworICAgIHN0YXRpY19hc3NlcnQoc3RybGVuX2MoIjEiKSA9PSAxVUwsICIiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0cmxlbl9jKCJleGFtcGxlIikgPT0gN1VMLCAiIik7CisgICAgc3RhdGljX2Fzc2VydChzdHJsZW5fYygiYW5vdGhlclwwZXhhbXBsZSIpID09IDdVTCwgIiIpOworCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9ydmFsdWVfcmVmZXJlbmNlcworICB7CisKKyAgICB0ZW1wbGF0ZSA8IGludCBOID4KKyAgICBzdHJ1Y3QgYW5zd2VyCisgICAgeworICAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQgdmFsdWUgPSBOOworICAgIH07CisKKyAgICBhbnN3ZXI8MT4gZihpbnQmKSAgICAgICB7IHJldHVybiBhbnN3ZXI8MT4oKTsgfQorICAgIGFuc3dlcjwyPiBmKGNvbnN0IGludCYpIHsgcmV0dXJuIGFuc3dlcjwyPigpOyB9CisgICAgYW5zd2VyPDM+IGYoaW50JiYpICAgICAgeyByZXR1cm4gYW5zd2VyPDM+KCk7IH0KKworICAgIHZvaWQKKyAgICB0ZXN0KCkKKyAgICB7CisgICAgICBpbnQgaSA9IDA7CisgICAgICBjb25zdCBpbnQgYyA9IDA7CisgICAgICBzdGF0aWNfYXNzZXJ0KGRlY2x0eXBlKGYoaSkpOjp2YWx1ZSA9PSAxLCAiIik7CisgICAgICBzdGF0aWNfYXNzZXJ0KGRlY2x0eXBlKGYoYykpOjp2YWx1ZSA9PSAyLCAiIik7CisgICAgICBzdGF0aWNfYXNzZXJ0KGRlY2x0eXBlKGYoMCkpOjp2YWx1ZSA9PSAzLCAiIik7CisgICAgfQorCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF91bmlmb3JtX2luaXRpYWxpemF0aW9uCisgIHsKKworICAgIHN0cnVjdCB0ZXN0CisgICAgeworICAgICAgc3RhdGljIGNvbnN0IGludCB6ZXJvIHt9OworICAgICAgc3RhdGljIGNvbnN0IGludCBvbmUgezF9OworICAgIH07CisKKyAgICBzdGF0aWNfYXNzZXJ0KHRlc3Q6Onplcm8gPT0gMCwgIiIpOworICAgIHN0YXRpY19hc3NlcnQodGVzdDo6b25lID09IDEsICIiKTsKKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfbGFtYmRhcworICB7CisKKyAgICB2b2lkCisgICAgdGVzdDEoKQorICAgIHsKKyAgICAgIGF1dG8gbGFtYmRhMSA9IFtdKCl7fTsKKyAgICAgIGF1dG8gbGFtYmRhMiA9IGxhbWJkYTE7CisgICAgICBsYW1iZGExKCk7CisgICAgICBsYW1iZGEyKCk7CisgICAgfQorCisgICAgaW50CisgICAgdGVzdDIoKQorICAgIHsKKyAgICAgIGF1dG8gYSA9IFtdKGludCBpLCBpbnQgail7IHJldHVybiBpICsgajsgfSgxLCAyKTsKKyAgICAgIGF1dG8gYiA9IFtdKCkgLT4gaW50IHsgcmV0dXJuICcwJzsgfSgpOworICAgICAgYXV0byBjID0gWz1dKCl7IHJldHVybiBhICsgYjsgfSgpOworICAgICAgYXV0byBkID0gWyZdKCl7IHJldHVybiBjOyB9KCk7CisgICAgICBhdXRvIGUgPSBbYSwgJmJdKGludCB4KSBtdXRhYmxlIHsKKyAgICAgICAgY29uc3QgYXV0byBpZGVudGl0eSA9IFtdKGludCB5KXsgcmV0dXJuIHk7IH07CisgICAgICAgIGZvciAoYXV0byBpID0gMDsgaSA8IGE7ICsraSkKKyAgICAgICAgICBhICs9IGItLTsKKyAgICAgICAgcmV0dXJuIHggKyBpZGVudGl0eShhICsgYik7CisgICAgICB9KDApOworICAgICAgcmV0dXJuIGEgKyBiICsgYyArIGQgKyBlOworICAgIH0KKworICAgIGludAorICAgIHRlc3QzKCkKKyAgICB7CisgICAgICBjb25zdCBhdXRvIG51bGxhcnkgPSBbXSgpeyByZXR1cm4gMDsgfTsKKyAgICAgIGNvbnN0IGF1dG8gdW5hcnkgPSBbXShpbnQgeCl7IHJldHVybiB4OyB9OworICAgICAgdXNpbmcgbnVsbGFyeV90ID0gZGVjbHR5cGUobnVsbGFyeSk7CisgICAgICB1c2luZyB1bmFyeV90ID0gZGVjbHR5cGUodW5hcnkpOworICAgICAgY29uc3QgYXV0byBoaWdoZXIxc3QgPSBbXShudWxsYXJ5X3QgZil7IHJldHVybiBmKCk7IH07CisgICAgICBjb25zdCBhdXRvIGhpZ2hlcjJuZCA9IFt1bmFyeV0obnVsbGFyeV90IGYxKXsKKyAgICAgICAgcmV0dXJuIFt1bmFyeSwgZjFdKHVuYXJ5X3QgZjIpeyByZXR1cm4gZjIodW5hcnkoZjEoKSkpOyB9OworICAgICAgfTsKKyAgICAgIHJldHVybiBoaWdoZXIxc3QobnVsbGFyeSkgKyBoaWdoZXIybmQobnVsbGFyeSkodW5hcnkpOworICAgIH0KKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfdmFyaWFkaWNfdGVtcGxhdGVzCisgIHsKKworICAgIHRlbXBsYXRlIDxpbnQuLi4+CisgICAgc3RydWN0IHN1bTsKKworICAgIHRlbXBsYXRlIDxpbnQgTjAsIGludC4uLiBOMXRvTj4KKyAgICBzdHJ1Y3Qgc3VtPE4wLCBOMXRvTi4uLj4KKyAgICB7CisgICAgICBzdGF0aWMgY29uc3RleHByIGF1dG8gdmFsdWUgPSBOMCArIHN1bTxOMXRvTi4uLj46OnZhbHVlOworICAgIH07CisKKyAgICB0ZW1wbGF0ZSA8PgorICAgIHN0cnVjdCBzdW08PgorICAgIHsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgYXV0byB2YWx1ZSA9IDA7CisgICAgfTsKKworICAgIHN0YXRpY19hc3NlcnQoc3VtPD46OnZhbHVlID09IDAsICIiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHN1bTwxPjo6dmFsdWUgPT0gMSwgIiIpOworICAgIHN0YXRpY19hc3NlcnQoc3VtPDIzPjo6dmFsdWUgPT0gMjMsICIiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHN1bTwxLCAyPjo6dmFsdWUgPT0gMywgIiIpOworICAgIHN0YXRpY19hc3NlcnQoc3VtPDUsIDUsIDExPjo6dmFsdWUgPT0gMjEsICIiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHN1bTwyLCAzLCA1LCA3LCAxMSwgMTM+Ojp2YWx1ZSA9PSA0MSwgIiIpOworCisgIH0KKworICAvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzEzNzI4MTg0L3RlbXBsYXRlLWFsaWFzZXMtYW5kLXNmaW5hZQorICAvLyBDbGFuZyAzLjEgZmFpbHMgd2l0aCBoZWFkZXJzIG9mIGxpYnN0ZCsrIDQuOC4zIHdoZW4gdXNpbmcgc3RkOjpmdW5jdGlvbgorICAvLyBiZWNhdXNlIG9mIHRoaXMuCisgIG5hbWVzcGFjZSB0ZXN0X3RlbXBsYXRlX2FsaWFzX3NmaW5hZQorICB7CisKKyAgICBzdHJ1Y3QgZm9vIHt9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICB1c2luZyBtZW1iZXIgPSB0eXBlbmFtZSBUOjptZW1iZXJfdHlwZTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgdm9pZCBmdW5jKC4uLikge30KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgdm9pZCBmdW5jKG1lbWJlcjxUPiopIHt9CisKKyAgICB2b2lkIHRlc3QoKTsKKworICAgIHZvaWQgdGVzdCgpIHsgZnVuYzxmb28+KDApOyB9CisKKyAgfQorCit9ICAvLyBuYW1lc3BhY2UgY3h4MTEKKworI2VuZGlmICAvLyBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisKK11dKQorCisKK2RubCAgVGVzdHMgZm9yIG5ldyBmZWF0dXJlcyBpbiBDKysxNAorCittNF9kZWZpbmUoW19BWF9DWFhfQ09NUElMRV9TVERDWFhfdGVzdGJvZHlfbmV3X2luXzE0XSwgW1sKKworLy8gSWYgdGhlIGNvbXBpbGVyIGFkbWl0cyB0aGF0IGl0IGlzIG5vdCByZWFkeSBmb3IgQysrMTQsIHdoeSB0b3J0dXJlIGl0PworLy8gSG9wZWZ1bGx5LCB0aGlzIHdpbGwgc3BlZWQgdXAgdGhlIHRlc3QuCisKKyNpZm5kZWYgX19jcGx1c3BsdXMKKworI2Vycm9yICJUaGlzIGlzIG5vdCBhIEMrKyBjb21waWxlciIKKworI2VsaWYgX19jcGx1c3BsdXMgPCAyMDE0MDJMCisKKyNlcnJvciAiVGhpcyBpcyBub3QgYSBDKysxNCBjb21waWxlciIKKworI2Vsc2UKKworbmFtZXNwYWNlIGN4eDE0Cit7CisKKyAgbmFtZXNwYWNlIHRlc3RfcG9seW1vcnBoaWNfbGFtYmRhcworICB7CisKKyAgICBpbnQKKyAgICB0ZXN0KCkKKyAgICB7CisgICAgICBjb25zdCBhdXRvIGxhbWJkYSA9IFtdKGF1dG8mJi4uLiBhcmdzKXsKKyAgICAgICAgY29uc3QgYXV0byBpc3RpbnkgPSBbXShhdXRvIHgpeworICAgICAgICAgIHJldHVybiAoc2l6ZW9mKHgpID09IDFVTCkgPyAxIDogMDsKKyAgICAgICAgfTsKKyAgICAgICAgY29uc3QgaW50IGFyZXRpbnlbXSA9IHsgaXN0aW55KGFyZ3MpLi4uIH07CisgICAgICAgIHJldHVybiBhcmV0aW55WzBdOworICAgICAgfTsKKyAgICAgIHJldHVybiBsYW1iZGEoMSwgMUwsIDEuMGYsICcxJyk7CisgICAgfQorCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9iaW5hcnlfbGl0ZXJhbHMKKyAgeworCisgICAgY29uc3RleHByIGF1dG8gaXZpaSA9IDBiMDAwMDAwMDAwMDEwMTAxMDsKKyAgICBzdGF0aWNfYXNzZXJ0KGl2aWkgPT0gNDIsICJ3cm9uZyB2YWx1ZSIpOworCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9nZW5lcmFsaXplZF9jb25zdGV4cHIKKyAgeworCisgICAgdGVtcGxhdGUgPCB0eXBlbmFtZSBDaGFyVCA+CisgICAgY29uc3RleHByIHVuc2lnbmVkIGxvbmcKKyAgICBzdHJsZW5fYyhjb25zdCBDaGFyVCAqY29uc3Qgcykgbm9leGNlcHQKKyAgICB7CisgICAgICBhdXRvIGxlbmd0aCA9IDBVTDsKKyAgICAgIGZvciAoYXV0byBwID0gczsgKnA7ICsrcCkKKyAgICAgICAgKytsZW5ndGg7CisgICAgICByZXR1cm4gbGVuZ3RoOworICAgIH0KKworICAgIHN0YXRpY19hc3NlcnQoc3RybGVuX2MoIiIpID09IDBVTCwgIiIpOworICAgIHN0YXRpY19hc3NlcnQoc3RybGVuX2MoIngiKSA9PSAxVUwsICIiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0cmxlbl9jKCJ0ZXN0IikgPT0gNFVMLCAiIik7CisgICAgc3RhdGljX2Fzc2VydChzdHJsZW5fYygiYW5vdGhlclwwdGVzdCIpID09IDdVTCwgIiIpOworCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9sYW1iZGFfaW5pdF9jYXB0dXJlCisgIHsKKworICAgIGludAorICAgIHRlc3QoKQorICAgIHsKKyAgICAgIGF1dG8geCA9IDA7CisgICAgICBjb25zdCBhdXRvIGxhbWJkYTEgPSBbYSA9IHhdKGludCBiKXsgcmV0dXJuIGEgKyBiOyB9OworICAgICAgY29uc3QgYXV0byBsYW1iZGEyID0gW2EgPSBsYW1iZGExKHgpXSgpeyByZXR1cm4gYTsgfTsKKyAgICAgIHJldHVybiBsYW1iZGEyKCk7CisgICAgfQorCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9kaWdpdF9zZXBhcmF0b3JzCisgIHsKKworICAgIGNvbnN0ZXhwciBhdXRvIHRlbl9taWxsaW9uID0gMTAwJzAwMCcwMDA7CisgICAgc3RhdGljX2Fzc2VydCh0ZW5fbWlsbGlvbiA9PSAxMDAwMDAwMDAsICIiKTsKKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfcmV0dXJuX3R5cGVfZGVkdWN0aW9uCisgIHsKKworICAgIGF1dG8gZihpbnQmIHgpIHsgcmV0dXJuIHg7IH0KKyAgICBkZWNsdHlwZShhdXRvKSBnKGludCYgeCkgeyByZXR1cm4geDsgfQorCisgICAgdGVtcGxhdGUgPCB0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIgPgorICAgIHN0cnVjdCBpc19zYW1lCisgICAgeworICAgICAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIHZhbHVlID0gZmFsc2U7CisgICAgfTsKKworICAgIHRlbXBsYXRlIDwgdHlwZW5hbWUgVCA+CisgICAgc3RydWN0IGlzX3NhbWU8VCwgVD4KKyAgICB7CisgICAgICBzdGF0aWMgY29uc3RleHByIGF1dG8gdmFsdWUgPSB0cnVlOworICAgIH07CisKKyAgICBpbnQKKyAgICB0ZXN0KCkKKyAgICB7CisgICAgICBhdXRvIHggPSAwOworICAgICAgc3RhdGljX2Fzc2VydChpc19zYW1lPGludCwgZGVjbHR5cGUoZih4KSk+Ojp2YWx1ZSwgIiIpOworICAgICAgc3RhdGljX2Fzc2VydChpc19zYW1lPGludCYsIGRlY2x0eXBlKGcoeCkpPjo6dmFsdWUsICIiKTsKKyAgICAgIHJldHVybiB4OworICAgIH0KKworICB9CisKK30gIC8vIG5hbWVzcGFjZSBjeHgxNAorCisjZW5kaWYgIC8vIF9fY3BsdXNwbHVzID49IDIwMTQwMkwKKworXV0pCisKKworZG5sICBUZXN0cyBmb3IgbmV3IGZlYXR1cmVzIGluIEMrKzE3CisKK200X2RlZmluZShbX0FYX0NYWF9DT01QSUxFX1NURENYWF90ZXN0Ym9keV9uZXdfaW5fMTddLCBbWworCisvLyBJZiB0aGUgY29tcGlsZXIgYWRtaXRzIHRoYXQgaXQgaXMgbm90IHJlYWR5IGZvciBDKysxNywgd2h5IHRvcnR1cmUgaXQ/CisvLyBIb3BlZnVsbHksIHRoaXMgd2lsbCBzcGVlZCB1cCB0aGUgdGVzdC4KKworI2lmbmRlZiBfX2NwbHVzcGx1cworCisjZXJyb3IgIlRoaXMgaXMgbm90IGEgQysrIGNvbXBpbGVyIgorCisjZWxpZiBfX2NwbHVzcGx1cyA8IDIwMTcwM0wKKworI2Vycm9yICJUaGlzIGlzIG5vdCBhIEMrKzE3IGNvbXBpbGVyIgorCisjZWxzZQorCisjaW5jbHVkZSA8aW5pdGlhbGl6ZXJfbGlzdD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCituYW1lc3BhY2UgY3h4MTcKK3sKKworICBuYW1lc3BhY2UgdGVzdF9jb25zdGV4cHJfbGFtYmRhcworICB7CisKKyAgICBjb25zdGV4cHIgaW50IGZvbyA9IFtdKCl7cmV0dXJuIDQyO30oKTsKKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3Q6Om5lc3RlZF9uYW1lc3BhY2U6OmRlZmluaXRpb25zCisgIHsKKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfZm9sZF9leHByZXNzaW9uCisgIHsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIEFyZ3M+CisgICAgaW50IG11bHRpcGx5KEFyZ3MuLi4gYXJncykKKyAgICB7CisgICAgICByZXR1cm4gKGFyZ3MgKiAuLi4gKiAxKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBBcmdzPgorICAgIGJvb2wgYWxsKEFyZ3MuLi4gYXJncykKKyAgICB7CisgICAgICByZXR1cm4gKGFyZ3MgJiYgLi4uKTsKKyAgICB9CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X2V4dGVuZGVkX3N0YXRpY19hc3NlcnQKKyAgeworCisgICAgc3RhdGljX2Fzc2VydCAodHJ1ZSk7CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X2F1dG9fYnJhY2VfaW5pdF9saXN0CisgIHsKKworICAgIGF1dG8gZm9vID0gezV9OworICAgIGF1dG8gYmFyIHs1fTsKKworICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxpbnQ+LCBkZWNsdHlwZShmb28pPjo6dmFsdWUpOworICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGludCwgZGVjbHR5cGUoYmFyKT46OnZhbHVlKTsKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X3R5cGVuYW1lX2luX3RlbXBsYXRlX3RlbXBsYXRlX3BhcmFtZXRlcgorICB7CisKKyAgICB0ZW1wbGF0ZTx0ZW1wbGF0ZTx0eXBlbmFtZT4gdHlwZW5hbWUgWD4gc3RydWN0IEQ7CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X2ZhbGx0aHJvdWdoX25vZGlzY2FyZF9tYXliZV91bnVzZWRfYXR0cmlidXRlcworICB7CisKKyAgICBpbnQgZjEoKQorICAgIHsKKyAgICAgIHJldHVybiA0MjsKKyAgICB9CisKKyAgICBbW25vZGlzY2FyZF1dIGludCBmMigpCisgICAgeworICAgICAgW1ttYXliZV91bnVzZWRdXSBhdXRvIHVudXNlZCA9IGYxKCk7CisKKyAgICAgIHN3aXRjaCAoZjEoKSkKKyAgICAgIHsKKyAgICAgIGNhc2UgMTc6CisgICAgICAgIGYxKCk7CisgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKKyAgICAgIGNhc2UgNDI6CisgICAgICAgIGYxKCk7CisgICAgICB9CisgICAgICByZXR1cm4gZjEoKTsKKyAgICB9CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X2V4dGVuZGVkX2FnZ3JlZ2F0ZV9pbml0aWFsaXphdGlvbgorICB7CisKKyAgICBzdHJ1Y3QgYmFzZTEKKyAgICB7CisgICAgICBpbnQgYjEsIGIyID0gNDI7CisgICAgfTsKKworICAgIHN0cnVjdCBiYXNlMgorICAgIHsKKyAgICAgIGJhc2UyKCkgeworICAgICAgICBiMyA9IDQyOworICAgICAgfQorICAgICAgaW50IGIzOworICAgIH07CisKKyAgICBzdHJ1Y3QgZGVyaXZlZCA6IGJhc2UxLCBiYXNlMgorICAgIHsKKyAgICAgICAgaW50IGQ7CisgICAgfTsKKworICAgIGRlcml2ZWQgZDEge3sxLCAyfSwge30sIDR9OyAgLy8gZnVsbCBpbml0aWFsaXphdGlvbgorICAgIGRlcml2ZWQgZDIge3t9LCB7fSwgNH07ICAgICAgLy8gdmFsdWUtaW5pdGlhbGl6ZWQgYmFzZXMKKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfZ2VuZXJhbF9yYW5nZV9iYXNlZF9mb3JfbG9vcAorICB7CisKKyAgICBzdHJ1Y3QgaXRlcgorICAgIHsKKyAgICAgIGludCBpOworCisgICAgICBpbnQmIG9wZXJhdG9yKiAoKQorICAgICAgeworICAgICAgICByZXR1cm4gaTsKKyAgICAgIH0KKworICAgICAgY29uc3QgaW50JiBvcGVyYXRvciogKCkgY29uc3QKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIGk7CisgICAgICB9CisKKyAgICAgIGl0ZXImIG9wZXJhdG9yKysoKQorICAgICAgeworICAgICAgICArK2k7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIH0KKyAgICB9OworCisgICAgc3RydWN0IHNlbnRpbmVsCisgICAgeworICAgICAgaW50IGk7CisgICAgfTsKKworICAgIGJvb2wgb3BlcmF0b3I9PSAoY29uc3QgaXRlciYgaSwgY29uc3Qgc2VudGluZWwmIHMpCisgICAgeworICAgICAgcmV0dXJuIGkuaSA9PSBzLmk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9IChjb25zdCBpdGVyJiBpLCBjb25zdCBzZW50aW5lbCYgcykKKyAgICB7CisgICAgICByZXR1cm4gIShpID09IHMpOworICAgIH0KKworICAgIHN0cnVjdCByYW5nZQorICAgIHsKKyAgICAgIGl0ZXIgYmVnaW4oKSBjb25zdAorICAgICAgeworICAgICAgICByZXR1cm4gezB9OworICAgICAgfQorCisgICAgICBzZW50aW5lbCBlbmQoKSBjb25zdAorICAgICAgeworICAgICAgICByZXR1cm4gezV9OworICAgICAgfQorICAgIH07CisKKyAgICB2b2lkIGYoKQorICAgIHsKKyAgICAgIHJhbmdlIHIge307CisKKyAgICAgIGZvciAoYXV0byBpIDogcikKKyAgICAgIHsKKyAgICAgICAgW1ttYXliZV91bnVzZWRdXSBhdXRvIHYgPSBpOworICAgICAgfQorICAgIH0KKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfbGFtYmRhX2NhcHR1cmVfYXN0ZXJpc2tfdGhpc19ieV92YWx1ZQorICB7CisKKyAgICBzdHJ1Y3QgdAorICAgIHsKKyAgICAgIGludCBpOworICAgICAgaW50IGZvbygpCisgICAgICB7CisgICAgICAgIHJldHVybiBbKnRoaXNdKCkKKyAgICAgICAgeworICAgICAgICAgIHJldHVybiBpOworICAgICAgICB9KCk7CisgICAgICB9CisgICAgfTsKKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfZW51bV9jbGFzc19jb25zdHJ1Y3Rpb24KKyAgeworCisgICAgZW51bSBjbGFzcyBieXRlIDogdW5zaWduZWQgY2hhcgorICAgIHt9OworCisgICAgYnl0ZSBmb28gezQyfTsKKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfY29uc3RleHByX2lmCisgIHsKKworICAgIHRlbXBsYXRlIDxib29sIGNvbmQ+CisgICAgaW50IGYgKCkKKyAgICB7CisgICAgICBpZiBjb25zdGV4cHIoY29uZCkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIDEzOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICByZXR1cm4gNDI7CisgICAgICB9CisgICAgfQorCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9zZWxlY3Rpb25fc3RhdGVtZW50X3dpdGhfaW5pdGlhbGl6ZXIKKyAgeworCisgICAgaW50IGYoKQorICAgIHsKKyAgICAgIHJldHVybiAxMzsKKyAgICB9CisKKyAgICBpbnQgZjIoKQorICAgIHsKKyAgICAgIGlmIChhdXRvIGkgPSBmKCk7IGkgPiAwKQorICAgICAgeworICAgICAgICByZXR1cm4gMzsKKyAgICAgIH0KKworICAgICAgc3dpdGNoIChhdXRvIGkgPSBmKCk7IGkgKyA0KQorICAgICAgeworICAgICAgY2FzZSAxNzoKKyAgICAgICAgcmV0dXJuIDI7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgIH0KKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfdGVtcGxhdGVfYXJndW1lbnRfZGVkdWN0aW9uX2Zvcl9jbGFzc190ZW1wbGF0ZXMKKyAgeworCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KKyAgICBzdHJ1Y3QgcGFpcgorICAgIHsKKyAgICAgIHBhaXIgKFQxIHAxLCBUMiBwMikKKyAgICAgICAgOiBtMSB7cDF9LAorICAgICAgICAgIG0yIHtwMn0KKyAgICAgIHt9CisKKyAgICAgIFQxIG0xOworICAgICAgVDIgbTI7CisgICAgfTsKKworICAgIHZvaWQgZigpCisgICAgeworICAgICAgW1ttYXliZV91bnVzZWRdXSBhdXRvIHAgPSBwYWlyezEzLCA0MnV9OworICAgIH0KKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3Rfbm9uX3R5cGVfYXV0b190ZW1wbGF0ZV9wYXJhbWV0ZXJzCisgIHsKKworICAgIHRlbXBsYXRlIDxhdXRvIG4+CisgICAgc3RydWN0IEIKKyAgICB7fTsKKworICAgIEI8NT4gYjE7CisgICAgQjwnYSc+IGIyOworCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9zdHJ1Y3R1cmVkX2JpbmRpbmdzCisgIHsKKworICAgIGludCBhcnJbMl0gPSB7IDEsIDIgfTsKKyAgICBzdGQ6OnBhaXI8aW50LCBpbnQ+IHByID0geyAxLCAyIH07CisKKyAgICBhdXRvIGYxKCkgLT4gaW50KCYpWzJdCisgICAgeworICAgICAgcmV0dXJuIGFycjsKKyAgICB9CisKKyAgICBhdXRvIGYyKCkgLT4gc3RkOjpwYWlyPGludCwgaW50PiYKKyAgICB7CisgICAgICByZXR1cm4gcHI7CisgICAgfQorCisgICAgc3RydWN0IFMKKyAgICB7CisgICAgICBpbnQgeDEgOiAyOworICAgICAgdm9sYXRpbGUgZG91YmxlIHkxOworICAgIH07CisKKyAgICBTIGYzKCkKKyAgICB7CisgICAgICByZXR1cm4ge307CisgICAgfQorCisgICAgYXV0byBbIHgxLCB5MSBdID0gZjEoKTsKKyAgICBhdXRvJiBbIHhyMSwgeXIxIF0gPSBmMSgpOworICAgIGF1dG8gWyB4MiwgeTIgXSA9IGYyKCk7CisgICAgYXV0byYgWyB4cjIsIHlyMiBdID0gZjIoKTsKKyAgICBjb25zdCBhdXRvIFsgeDMsIHkzIF0gPSBmMygpOworCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9leGNlcHRpb25fc3BlY190eXBlX3N5c3RlbQorICB7CisKKyAgICBzdHJ1Y3QgR29vZCB7fTsKKyAgICBzdHJ1Y3QgQmFkIHt9OworCisgICAgdm9pZCBnMSgpIG5vZXhjZXB0OworICAgIHZvaWQgZzIoKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgQmFkCisgICAgZihUKiwgVCopOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorICAgIEdvb2QKKyAgICBmKFQxKiwgVDIqKTsKKworICAgIHN0YXRpY19hc3NlcnQgKHN0ZDo6aXNfc2FtZV92PEdvb2QsIGRlY2x0eXBlKGYoZzEsIGcyKSk+KTsKKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfaW5saW5lX3ZhcmlhYmxlcworICB7CisKKyAgICB0ZW1wbGF0ZTxjbGFzcyBUPiB2b2lkIGYoVCkKKyAgICB7fQorCisgICAgdGVtcGxhdGU8Y2xhc3MgVD4gaW5saW5lIFQgZyhUKQorICAgIHsKKyAgICAgIHJldHVybiBUe307CisgICAgfQorCisgICAgdGVtcGxhdGU8PiBpbmxpbmUgdm9pZCBmPD4oaW50KQorICAgIHt9CisKKyAgICB0ZW1wbGF0ZTw+IGludCBnPD4oaW50KQorICAgIHsKKyAgICAgIHJldHVybiA1OworICAgIH0KKworICB9CisKK30gIC8vIG5hbWVzcGFjZSBjeHgxNworCisjZW5kaWYgIC8vIF9fY3BsdXNwbHVzIDwgMjAxNzAzTAorCitdXSkKZGlmZiAtLWdpdCBhL2FjbG9jYWwvYXhfY3h4X2NvbXBpbGVfc3RkY3h4XzExLm00IGIvYWNsb2NhbC9heF9jeHhfY29tcGlsZV9zdGRjeHhfMTEubTQKaW5kZXggYTlhOGY1OC4uMTczM2ZkOCAxMDA2NDQKLS0tIGEvYWNsb2NhbC9heF9jeHhfY29tcGlsZV9zdGRjeHhfMTEubTQKKysrIGIvYWNsb2NhbC9heF9jeHhfY29tcGlsZV9zdGRjeHhfMTEubTQKQEAgLTEsMjYgKzEsMjMgQEAKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2F1dG9jb25mLWFyY2hpdmUvYXhfY3h4X2NvbXBpbGVfc3RkY3h4XzExLmh0bWwKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hdXRvY29uZi1hcmNoaXZlL2F4X2N4eF9jb21waWxlX3N0ZGN4eF8xMS5odG1sCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAjCiAjIFNZTk9QU0lTCiAjCi0jICAgQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXzExKFtleHR8bm9leHRdLFttYW5kYXRvcnl8b3B0aW9uYWxdKQorIyAgIEFYX0NYWF9DT01QSUxFX1NURENYWF8xMShbZXh0fG5vZXh0XSwgW21hbmRhdG9yeXxvcHRpb25hbF0pCiAjCiAjIERFU0NSSVBUSU9OCiAjCiAjICAgQ2hlY2sgZm9yIGJhc2VsaW5lIGxhbmd1YWdlIGNvdmVyYWdlIGluIHRoZSBjb21waWxlciBmb3IgdGhlIEMrKzExCi0jICAgc3RhbmRhcmQ7IGlmIG5lY2Vzc2FyeSwgYWRkIHN3aXRjaGVzIHRvIENYWEZMQUdTIHRvIGVuYWJsZSBzdXBwb3J0LgorIyAgIHN0YW5kYXJkOyBpZiBuZWNlc3NhcnksIGFkZCBzd2l0Y2hlcyB0byBDWFggYW5kIENYWENQUCB0byBlbmFibGUKKyMgICBzdXBwb3J0LgogIwotIyAgIFRoZSBmaXJzdCBhcmd1bWVudCwgaWYgc3BlY2lmaWVkLCBpbmRpY2F0ZXMgd2hldGhlciB5b3UgaW5zaXN0IG9uIGFuCi0jICAgZXh0ZW5kZWQgbW9kZSAoZS5nLiAtc3RkPWdudSsrMTEpIG9yIGEgc3RyaWN0IGNvbmZvcm1hbmNlIG1vZGUgKGUuZy4KLSMgICAtc3RkPWMrKzExKS4gIElmIG5laXRoZXIgaXMgc3BlY2lmaWVkLCB5b3UgZ2V0IHdoYXRldmVyIHdvcmtzLCB3aXRoCi0jICAgcHJlZmVyZW5jZSBmb3IgYW4gZXh0ZW5kZWQgbW9kZS4KLSMKLSMgICBUaGUgc2Vjb25kIGFyZ3VtZW50LCBpZiBzcGVjaWZpZWQgJ21hbmRhdG9yeScgb3IgaWYgbGVmdCB1bnNwZWNpZmllZCwKLSMgICBpbmRpY2F0ZXMgdGhhdCBiYXNlbGluZSBDKysxMSBzdXBwb3J0IGlzIHJlcXVpcmVkIGFuZCB0aGF0IHRoZSBtYWNybwotIyAgIHNob3VsZCBlcnJvciBvdXQgaWYgbm8gbW9kZSB3aXRoIHRoYXQgc3VwcG9ydCBpcyBmb3VuZC4gIElmIHNwZWNpZmllZAotIyAgICdvcHRpb25hbCcsIHRoZW4gY29uZmlndXJhdGlvbiBwcm9jZWVkcyByZWdhcmRsZXNzLCBhZnRlciBkZWZpbmluZwotIyAgIEhBVkVfQ1hYMTEgaWYgYW5kIG9ubHkgaWYgYSBzdXBwb3J0aW5nIG1vZGUgaXMgZm91bmQuCisjICAgVGhpcyBtYWNybyBpcyBhIGNvbnZlbmllbmNlIGFsaWFzIGZvciBjYWxsaW5nIHRoZSBBWF9DWFhfQ09NUElMRV9TVERDWFgKKyMgICBtYWNybyB3aXRoIHRoZSB2ZXJzaW9uIHNldCB0byBDKysxMS4gIFRoZSB0d28gb3B0aW9uYWwgYXJndW1lbnRzIGFyZQorIyAgIGZvcndhcmRlZCBsaXRlcmFsbHkgYXMgdGhlIHNlY29uZCBhbmQgdGhpcmQgYXJndW1lbnQgcmVzcGVjdGl2ZWx5LgorIyAgIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBBWF9DWFhfQ09NUElMRV9TVERDWFggbWFjcm8gZm9yCisjICAgbW9yZSBpbmZvcm1hdGlvbi4gIElmIHlvdSB3YW50IHRvIHVzZSB0aGlzIG1hY3JvLCB5b3UgYWxzbyBuZWVkIHRvCisjICAgZG93bmxvYWQgdGhlIGF4X2N4eF9jb21waWxlX3N0ZGN4eC5tNCBmaWxlLgogIwogIyBMSUNFTlNFCiAjCkBAIC0yOCwxMzggKzI1LDE1IEBACiAjICAgQ29weXJpZ2h0IChjKSAyMDEyIFphY2sgV2VpbmJlcmcgPHphY2t3QHBhbml4LmNvbT4KICMgICBDb3B5cmlnaHQgKGMpIDIwMTMgUm95IFN0b2duZXIgPHJveXN0Z25yQGljZXMudXRleGFzLmVkdT4KICMgICBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTUgR29vZ2xlIEluYy47IGNvbnRyaWJ1dGVkIGJ5IEFsZXhleSBTb2tvbG92IDxzb2tvbG92QGdvb2dsZS5jb20+CisjICAgQ29weXJpZ2h0IChjKSAyMDE1IFBhdWwgTm9ybWFuIDxwZW5vcm1hbkBtYWMuY29tPgorIyAgIENvcHlyaWdodCAoYykgMjAxNSBNb3JpdHogS2xhbW1sZXIgPG1vcml0ekBrbGFtbWxlci5ldT4KICMKICMgICBDb3B5aW5nIGFuZCBkaXN0cmlidXRpb24gb2YgdGhpcyBmaWxlLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUKICMgICBwZXJtaXR0ZWQgaW4gYW55IG1lZGl1bSB3aXRob3V0IHJveWFsdHkgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UKICMgICBhbmQgdGhpcyBub3RpY2UgYXJlIHByZXNlcnZlZC4gVGhpcyBmaWxlIGlzIG9mZmVyZWQgYXMtaXMsIHdpdGhvdXQgYW55CiAjICAgd2FycmFudHkuCiAKLSNzZXJpYWwgMTAKKyNzZXJpYWwgMTgKIAotbTRfZGVmaW5lKFtfQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXzExX3Rlc3Rib2R5XSwgW1sKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gICAgc3RydWN0IGNoZWNrCi0gICAgewotICAgICAgc3RhdGljX2Fzc2VydChzaXplb2YoaW50KSA8PSBzaXplb2YoVCksICJub3QgYmlnIGVub3VnaCIpOwotICAgIH07Ci0KLSAgICBzdHJ1Y3QgQmFzZSB7Ci0gICAgdmlydHVhbCB2b2lkIGYoKSB7fQotICAgIH07Ci0gICAgc3RydWN0IENoaWxkIDogcHVibGljIEJhc2UgewotICAgIHZpcnR1YWwgdm9pZCBmKCkgb3ZlcnJpZGUge30KLSAgICB9OwotCi0gICAgdHlwZWRlZiBjaGVjazxjaGVjazxib29sPj4gcmlnaHRfYW5nbGVfYnJhY2tldHM7Ci0KLSAgICBpbnQgYTsKLSAgICBkZWNsdHlwZShhKSBiOwotCi0gICAgdHlwZWRlZiBjaGVjazxpbnQ+IGNoZWNrX3R5cGU7Ci0gICAgY2hlY2tfdHlwZSBjOwotICAgIGNoZWNrX3R5cGUmJiBjciA9IHN0YXRpY19jYXN0PGNoZWNrX3R5cGUmJj4oYyk7Ci0KLSAgICBhdXRvIGQgPSBhOwotICAgIGF1dG8gbCA9IFtdKCl7fTsKLSAgICAvLyBQcmV2ZW50IENsYW5nIGVycm9yOiB1bnVzZWQgdmFyaWFibGUgJ2wnIFstV2Vycm9yLC1XdW51c2VkLXZhcmlhYmxlXQotICAgIHN0cnVjdCB1c2VfbCB7IHVzZV9sKCkgeyBsKCk7IH0gfTsKLQotICAgIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTM3MjgxODQvdGVtcGxhdGUtYWxpYXNlcy1hbmQtc2ZpbmFlCi0gICAgLy8gQ2xhbmcgMy4xIGZhaWxzIHdpdGggaGVhZGVycyBvZiBsaWJzdGQrKyA0LjguMyB3aGVuIHVzaW5nIHN0ZDo6ZnVuY3Rpb24gYmVjYXVzZSBvZiB0aGlzCi0gICAgbmFtZXNwYWNlIHRlc3RfdGVtcGxhdGVfYWxpYXNfc2ZpbmFlIHsKLSAgICAgICAgc3RydWN0IGZvbyB7fTsKLQotICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotICAgICAgICB1c2luZyBtZW1iZXIgPSB0eXBlbmFtZSBUOjptZW1iZXJfdHlwZTsKLQotICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotICAgICAgICB2b2lkIGZ1bmMoLi4uKSB7fQotCi0gICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgICAgIHZvaWQgZnVuYyhtZW1iZXI8VD4qKSB7fQotCi0gICAgICAgIHZvaWQgdGVzdCgpOwotCi0gICAgICAgIHZvaWQgdGVzdCgpIHsKLSAgICAgICAgICAgIGZ1bmM8Zm9vPigwKTsKLSAgICAgICAgfQotICAgIH0KLV1dKQotCi1BQ19ERUZVTihbQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXzExXSwgW2RubAotICBtNF9pZihbJDFdLCBbXSwgW10sCi0gICAgICAgIFskMV0sIFtleHRdLCBbXSwKLSAgICAgICAgWyQxXSwgW25vZXh0XSwgW10sCi0gICAgICAgIFttNF9mYXRhbChbaW52YWxpZCBhcmd1bWVudCBgJDEnIHRvIEFYX0NYWF9DT01QSUxFX1NURENYWF8xMV0pXSlkbmwKLSAgbTRfaWYoWyQyXSwgW10sIFtheF9jeHhfY29tcGlsZV9jeHgxMV9yZXF1aXJlZD10cnVlXSwKLSAgICAgICAgWyQyXSwgW21hbmRhdG9yeV0sIFtheF9jeHhfY29tcGlsZV9jeHgxMV9yZXF1aXJlZD10cnVlXSwKLSAgICAgICAgWyQyXSwgW29wdGlvbmFsXSwgW2F4X2N4eF9jb21waWxlX2N4eDExX3JlcXVpcmVkPWZhbHNlXSwKLSAgICAgICAgW200X2ZhdGFsKFtpbnZhbGlkIHNlY29uZCBhcmd1bWVudCBgJDInIHRvIEFYX0NYWF9DT01QSUxFX1NURENYWF8xMV0pXSkKLSAgQUNfTEFOR19QVVNIKFtDKytdKWRubAotICBhY19zdWNjZXNzPW5vCi0gIEFDX0NBQ0hFX0NIRUNLKHdoZXRoZXIgJENYWCBzdXBwb3J0cyBDKysxMSBmZWF0dXJlcyBieSBkZWZhdWx0LAotICBheF9jdl9jeHhfY29tcGlsZV9jeHgxMSwKLSAgW0FDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1NPVVJDRShbX0FYX0NYWF9DT01QSUxFX1NURENYWF8xMV90ZXN0Ym9keV0pXSwKLSAgICBbYXhfY3ZfY3h4X2NvbXBpbGVfY3h4MTE9eWVzXSwKLSAgICBbYXhfY3ZfY3h4X2NvbXBpbGVfY3h4MTE9bm9dKV0pCi0gIGlmIHRlc3QgeCRheF9jdl9jeHhfY29tcGlsZV9jeHgxMSA9IHh5ZXM7IHRoZW4KLSAgICBhY19zdWNjZXNzPXllcwotICBmaQotCi0gIG00X2lmKFskMV0sIFtub2V4dF0sIFtdLCBbZG5sCi0gIGlmIHRlc3QgeCRhY19zdWNjZXNzID0geG5vOyB0aGVuCi0gICAgZm9yIHN3aXRjaCBpbiAtc3RkPWdudSsrMTEgLXN0ZD1nbnUrKzB4OyBkbwotICAgICAgY2FjaGV2YXI9QVNfVFJfU0goW2F4X2N2X2N4eF9jb21waWxlX2N4eDExXyRzd2l0Y2hdKQotICAgICAgQUNfQ0FDSEVfQ0hFQ0sod2hldGhlciAkQ1hYIHN1cHBvcnRzIEMrKzExIGZlYXR1cmVzIHdpdGggJHN3aXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICRjYWNoZXZhciwKLSAgICAgICAgW2FjX3NhdmVfQ1hYRkxBR1M9IiRDWFhGTEFHUyIKLSAgICAgICAgIENYWEZMQUdTPSIkQ1hYRkxBR1MgJHN3aXRjaCIKLSAgICAgICAgIEFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1NPVVJDRShbX0FYX0NYWF9DT01QSUxFX1NURENYWF8xMV90ZXN0Ym9keV0pXSwKLSAgICAgICAgICBbZXZhbCAkY2FjaGV2YXI9eWVzXSwKLSAgICAgICAgICBbZXZhbCAkY2FjaGV2YXI9bm9dKQotICAgICAgICAgQ1hYRkxBR1M9IiRhY19zYXZlX0NYWEZMQUdTIl0pCi0gICAgICBpZiBldmFsIHRlc3QgeFwkJGNhY2hldmFyID0geHllczsgdGhlbgotICAgICAgICBDWFhGTEFHUz0iJENYWEZMQUdTICRzd2l0Y2giCi0gICAgICAgIGFjX3N1Y2Nlc3M9eWVzCi0gICAgICAgIGJyZWFrCi0gICAgICBmaQotICAgIGRvbmUKLSAgZmldKQotCi0gIG00X2lmKFskMV0sIFtleHRdLCBbXSwgW2RubAotICBpZiB0ZXN0IHgkYWNfc3VjY2VzcyA9IHhubzsgdGhlbgotICAgIGZvciBzd2l0Y2ggaW4gLXN0ZD1jKysxMSAtc3RkPWMrKzB4OyBkbwotICAgICAgY2FjaGV2YXI9QVNfVFJfU0goW2F4X2N2X2N4eF9jb21waWxlX2N4eDExXyRzd2l0Y2hdKQotICAgICAgQUNfQ0FDSEVfQ0hFQ0sod2hldGhlciAkQ1hYIHN1cHBvcnRzIEMrKzExIGZlYXR1cmVzIHdpdGggJHN3aXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICRjYWNoZXZhciwKLSAgICAgICAgW2FjX3NhdmVfQ1hYRkxBR1M9IiRDWFhGTEFHUyIKLSAgICAgICAgIENYWEZMQUdTPSIkQ1hYRkxBR1MgJHN3aXRjaCIKLSAgICAgICAgIEFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1NPVVJDRShbX0FYX0NYWF9DT01QSUxFX1NURENYWF8xMV90ZXN0Ym9keV0pXSwKLSAgICAgICAgICBbZXZhbCAkY2FjaGV2YXI9eWVzXSwKLSAgICAgICAgICBbZXZhbCAkY2FjaGV2YXI9bm9dKQotICAgICAgICAgQ1hYRkxBR1M9IiRhY19zYXZlX0NYWEZMQUdTIl0pCi0gICAgICBpZiBldmFsIHRlc3QgeFwkJGNhY2hldmFyID0geHllczsgdGhlbgotICAgICAgICBDWFhGTEFHUz0iJENYWEZMQUdTICRzd2l0Y2giCi0gICAgICAgIGFjX3N1Y2Nlc3M9eWVzCi0gICAgICAgIGJyZWFrCi0gICAgICBmaQotICAgIGRvbmUKLSAgZmldKQotICBBQ19MQU5HX1BPUChbQysrXSkKLSAgaWYgdGVzdCB4JGF4X2N4eF9jb21waWxlX2N4eDExX3JlcXVpcmVkID0geHRydWU7IHRoZW4KLSAgICBpZiB0ZXN0IHgkYWNfc3VjY2VzcyA9IHhubzsgdGhlbgotICAgICAgQUNfTVNHX0VSUk9SKFsqKiogQSBjb21waWxlciB3aXRoIHN1cHBvcnQgZm9yIEMrKzExIGxhbmd1YWdlIGZlYXR1cmVzIGlzIHJlcXVpcmVkLl0pCi0gICAgZmkKLSAgZWxzZQotICAgIGlmIHRlc3QgeCRhY19zdWNjZXNzID0geG5vOyB0aGVuCi0gICAgICBIQVZFX0NYWDExPTAKLSAgICAgIEFDX01TR19OT1RJQ0UoW05vIGNvbXBpbGVyIHdpdGggQysrMTEgc3VwcG9ydCB3YXMgZm91bmRdKQotICAgIGVsc2UKLSAgICAgIEhBVkVfQ1hYMTE9MQotICAgICAgQUNfREVGSU5FKEhBVkVfQ1hYMTEsMSwKLSAgICAgICAgICAgICAgICBbZGVmaW5lIGlmIHRoZSBjb21waWxlciBzdXBwb3J0cyBiYXNpYyBDKysxMSBzeW50YXhdKQotICAgIGZpCi0KLSAgICBBQ19TVUJTVChIQVZFX0NYWDExKQotICBmaQotXSkKK0FYX1JFUVVJUkVfREVGSU5FRChbQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXSkKK0FDX0RFRlVOKFtBWF9DWFhfQ09NUElMRV9TVERDWFhfMTFdLCBbQVhfQ1hYX0NPTVBJTEVfU1REQ1hYKFsxMV0sIFskMV0sIFskMl0pXSkKZGlmZiAtLWdpdCBhL2FjbG9jYWwvYXhfamF2YWNfYW5kX2phdmEubTQgYi9hY2xvY2FsL2F4X2phdmFjX2FuZF9qYXZhLm00CmluZGV4IGYzNDFmNTAuLjAyMDM5NjAgMTAwNjQ0Ci0tLSBhL2FjbG9jYWwvYXhfamF2YWNfYW5kX2phdmEubTQKKysrIGIvYWNsb2NhbC9heF9qYXZhY19hbmRfamF2YS5tNApAQCAtMTE4LDcgKzExOCw3IEBACiBBQ19ERUZVTihbQVhfQ0hFQ0tfQU5UX1ZFUlNJT05dLAogICAgICAgICAgWwogICAgICAgICAgIEFDX01TR19DSEVDS0lORyhmb3IgYW50IHZlcnNpb24gPiAkMikKLSAgICAgICAgICBBTlRfVkFMSUQ9YGV4cHIgJCgkMSAtdmVyc2lvbiAyPi9kZXYvbnVsbCB8IHNlZCAtbiAncy8uKnZlcnNpb24gXChAPDpAMC05XC5AOj5AKlwpLiovXDEvcCcpIFw+PSAkMmAKKyAgICAgICAgICBBTlRfVkFMSUQ9YGV4cHIgIngkKHByaW50ZiAiJDJcbiQoJDEgLXZlcnNpb24gMj4vZGV2L251bGwgfCBzZWQgLW4gJ3MvLip2ZXJzaW9uIFwoQDw6QDAtOVwuQDo+QCpcKS4qL1wxL3AnKSIgfCBzb3J0IC10ICcuJyAtayAxLDEgLWsgMiwyIC1rIDMsMyAtZyB8IHNlZCAtbiAxcCkiID0gIngkMiJgCiAgICAgICAgICAgaWYgdGVzdCAieCRBTlRfVkFMSUQiID0gIngxIiA7IHRoZW4KICAgICAgICAgICAgIEFDX01TR19SRVNVTFQoeWVzKQogICAgICAgICAgIGVsc2UKZGlmZiAtLWdpdCBhL2FjbG9jYWwvYXhfbHVhLm00IGIvYWNsb2NhbC9heF9sdWEubTQKaW5kZXggMTU1MzQ5MS4uNTkyMDE2NyAxMDA2NDQKLS0tIGEvYWNsb2NhbC9heF9sdWEubTQKKysrIGIvYWNsb2NhbC9heF9sdWEubTQKQEAgLTEsNSArMSw1IEBACiAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAgICAgICAgICBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYXV0b2NvbmYtYXJjaGl2ZS9heF9sdWEuaHRtbAorIyAgICAgICAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2F1dG9jb25mLWFyY2hpdmUvYXhfbHVhLmh0bWwKICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAjCiAjIFNZTk9QU0lTCkBAIC0xOCw4ICsxOCw4IEBACiAjICAgQWxzbyBkZXRlY3QgTHVhIGhlYWRlcnMgYW5kIGxpYnJhcmllcy4gVGhlIEx1YSB2ZXJzaW9uIGNvbnRhaW5lZCBpbiB0aGUKICMgICBoZWFkZXIgaXMgY2hlY2tlZCB0byBtYXRjaCB0aGUgTHVhIGludGVycHJldGVyIHZlcnNpb24gZXhhY3RseS4gV2hlbgogIyAgIHNlYXJjaGluZyBmb3IgTHVhIGxpYnJhcmllcywgdGhlIHZlcnNpb24gbnVtYmVyIGlzIHVzZWQgYXMgYSBzdWZmaXguCi0jICAgVGhpcyBpcyBkb25lIHdpdGggdGhlIGdvYWwgb2Ygc3VwcG9ydGluZyBtdWx0aXBsZSBMdWEgaW5zdGFsbHMgKDUuMSBhbmQKLSMgICA1LjIgc2lkZS1ieS1zaWRlKS4KKyMgICBUaGlzIGlzIGRvbmUgd2l0aCB0aGUgZ29hbCBvZiBzdXBwb3J0aW5nIG11bHRpcGxlIEx1YSBpbnN0YWxscyAoNS4xLAorIyAgIDUuMiwgYW5kIDUuMyBzaWRlLWJ5LXNpZGUpLgogIwogIyAgIEEgbm90ZSBvbiBjb21wYXRpYmlsaXR5IHdpdGggcHJldmlvdXMgdmVyc2lvbnM6IFRoaXMgZmlsZSBoYXMgYmVlbgogIyAgIG1vc3RseSByZXdyaXR0ZW4gZm9yIHNlcmlhbCAxOC4gTW9zdCBkZXZlbG9wZXJzIHNob3VsZCBiZSBhYmxlIHRvIHVzZQpAQCAtNTEsNyArNTEsNyBAQAogIwogIyAgIElmIE1JTklNVU0tVkVSU0lPTiBpcyBzdXBwbGllZCwgdGhlbiBvbmx5IEx1YSBpbnRlcnByZXRlcnMgd2l0aCBhCiAjICAgdmVyc2lvbiBudW1iZXIgZ3JlYXRlciBvciBlcXVhbCB0byBNSU5JTVVNLVZFUlNJT04gd2lsbCBiZSBhY2NlcHRlZC4gSWYKLSMgICBUT08tQklHLSBWRVJTSU9OIGlzIGFsc28gc3VwcGxpZWQsIHRoZW4gb25seSBMdWEgaW50ZXJwcmV0ZXJzIHdpdGggYQorIyAgIFRPTy1CSUctVkVSU0lPTiBpcyBhbHNvIHN1cHBsaWVkLCB0aGVuIG9ubHkgTHVhIGludGVycHJldGVycyB3aXRoIGEKICMgICB2ZXJzaW9uIG51bWJlciBncmVhdGVyIG9yIGVxdWFsIHRvIE1JTklNVU0tVkVSU0lPTiBhbmQgbGVzcyB0aGFuCiAjICAgVE9PLUJJRy1WRVJTSU9OIHdpbGwgYmUgYWNjZXB0ZWQuCiAjCkBAIC02NiwxMiArNjYsMTMgQEAKICMgICAgIGx1YWV4ZWNkaXIgICAgICAgICBEaXJlY3RvcnkgdG8gaW5zdGFsbCBMdWEgbW9kdWxlcy4KICMgICAgIHBrZ2x1YWV4ZWNkaXIgICAgICAkbHVhZXhlY2Rpci8kUEFDS0FHRQogIwotIyAgIFRoZXNlIHBhdGhzIGEgZm91bmQgYmFzZWQgb24gJHByZWZpeCwgJGV4ZWNfcHJlZml4LCBMdWEncyBwYWNrYWdlLnBhdGgsCi0jICAgYW5kIHBhY2thZ2UuY3BhdGguIFRoZSBmaXJzdCBwYXRoIG9mIHBhY2thZ2UucGF0aCBiZWdpbm5pbmcgd2l0aCAkcHJlZml4Ci0jICAgaXMgc2VsZWN0ZWQgYXMgbHVhZGlyLiBUaGUgZmlyc3QgcGF0aCBvZiBwYWNrYWdlLmNwYXRoIGJlZ2lubmluZyB3aXRoCi0jICAgJGV4ZWNfcHJlZml4IGlzIHVzZWQgYXMgbHVhZXhlY2Rpci4gVGhpcyBzaG91bGQgd29yayBvbiBhbGwgcmVhc29uYWJsZQotIyAgIEx1YSBpbnN0YWxsYXRpb25zLiBJZiBhIHBhdGggY2Fubm90IGJlIGRldGVybWluZWQsIGEgZGVmYXVsdCBwYXRoIGlzCi0jICAgdXNlZC4gT2YgY291cnNlLCB0aGUgdXNlciBjYW4gb3ZlcnJpZGUgdGhlc2UgbGF0ZXIgd2hlbiBpbnZva2luZyBtYWtlLgorIyAgIFRoZXNlIHBhdGhzIGFyZSBmb3VuZCBiYXNlZCBvbiAkcHJlZml4LCAkZXhlY19wcmVmaXgsIEx1YSdzCisjICAgcGFja2FnZS5wYXRoLCBhbmQgcGFja2FnZS5jcGF0aC4gVGhlIGZpcnN0IHBhdGggb2YgcGFja2FnZS5wYXRoCisjICAgYmVnaW5uaW5nIHdpdGggJHByZWZpeCBpcyBzZWxlY3RlZCBhcyBsdWFkaXIuIFRoZSBmaXJzdCBwYXRoIG9mCisjICAgcGFja2FnZS5jcGF0aCBiZWdpbm5pbmcgd2l0aCAkZXhlY19wcmVmaXggaXMgdXNlZCBhcyBsdWFleGVjZGlyLiBUaGlzCisjICAgc2hvdWxkIHdvcmsgb24gYWxsIHJlYXNvbmFibGUgTHVhIGluc3RhbGxhdGlvbnMuIElmIGEgcGF0aCBjYW5ub3QgYmUKKyMgICBkZXRlcm1pbmVkLCBhIGRlZmF1bHQgcGF0aCBpcyB1c2VkLiBPZiBjb3Vyc2UsIHRoZSB1c2VyIGNhbiBvdmVycmlkZQorIyAgIHRoZXNlIGxhdGVyIHdoZW4gaW52b2tpbmcgbWFrZS4KICMKICMgICAgIGx1YWRpciAgICAgICAgICAgICBEZWZhdWx0OiAkcHJlZml4L3NoYXJlL2x1YS8kTFVBX1ZFUlNJT04KICMgICAgIGx1YWV4ZWNkaXIgICAgICAgICBEZWZhdWx0OiAkZXhlY19wcmVmaXgvbGliL2x1YS8kTFVBX1ZFUlNJT04KQEAgLTE1MSw3ICsxNTIsNyBAQAogIwogIyBMSUNFTlNFCiAjCi0jICAgQ29weXJpZ2h0IChjKSAyMDE0IFJldWJlbiBUaG9tYXMgPHJydEBzYzNkLm9yZz4KKyMgICBDb3B5cmlnaHQgKGMpIDIwMTUgUmV1YmVuIFRob21hcyA8cnJ0QHNjM2Qub3JnPgogIyAgIENvcHlyaWdodCAoYykgMjAxNCBUaW0gUGVya2lucyA8dHByazc3QGdtYWlsLmNvbT4KICMKICMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMTY1LDcgKzE2Niw3IEBACiAjICAgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICMKICMgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotIyAgIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisjICAgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiAjCiAjICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIHJlc3BlY3RpdmUgQXV0b2NvbmYgTWFjcm8ncyBjb3B5cmlnaHQgb3duZXIKICMgICBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgdGhlIGNvbmZpZ3VyZQpAQCAtMTgwLDcgKzE4MSw3IEBACiAjICAgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgQXV0b2NvbmYgTWFjcm8sIHlvdSBtYXkgZXh0ZW5kIHRoaXMgc3BlY2lhbAogIyAgIGV4Y2VwdGlvbiB0byB0aGUgR1BMIHRvIGFwcGx5IHRvIHlvdXIgbW9kaWZpZWQgdmVyc2lvbiBhcyB3ZWxsLgogCi0jc2VyaWFsIDM2Cisjc2VyaWFsIDQwCiAKIGRubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiBkbmwgQVhfUFJPR19MVUEoW01JTklNVU0tVkVSU0lPTl0sIFtUT08tQklHLVZFUlNJT05dLApAQCAtMTk3LDcgKzE5OCw3IEBACiAKICAgZG5sIEZpbmQgYSBMdWEgaW50ZXJwcmV0ZXIuCiAgIG00X2RlZmluZV9kZWZhdWx0KFtfQVhfTFVBX0lOVEVSUFJFVEVSX0xJU1RdLAotICAgIFtsdWEgbHVhNS4yIGx1YTUyIGx1YTUuMSBsdWE1MSBsdWE1MF0pCisgICAgW2x1YSBsdWE1LjMgbHVhNTMgbHVhNS4yIGx1YTUyIGx1YTUuMSBsdWE1MSBsdWE1MF0pCiAKICAgbTRfaWYoWyQxXSwgW10sCiAgIFsgZG5sIE5vIHZlcnNpb24gY2hlY2sgaXMgbmVlZGVkLiBGaW5kIGFueSBMdWEgaW50ZXJwcmV0ZXIuCkBAIC0zMDQsNyArMzA1LDcgQEAKICAgICAgICAgYXhfY3ZfbHVhX2x1YWRpcj0iJExVQV9QUkVGSVgvc2hhcmUvbHVhLyRMVUFfVkVSU0lPTiIKIAogICAgICAgICBkbmwgVHJ5IHRvIGZpbmQgYSBwYXRoIHdpdGggdGhlIHByZWZpeC4KLSAgICAgICAgX0FYX0xVQV9GTkRfUFJGWF9QVEgoWyRMVUFdLCBbJGF4X2x1YV9wcmVmaXhdLCBbcGFja2FnZS5wYXRoXSkKKyAgICAgICAgX0FYX0xVQV9GTkRfUFJGWF9QVEgoWyRMVUFdLCBbJGF4X2x1YV9wcmVmaXhdLCBbc2NyaXB0XSkKICAgICAgICAgQVNfSUYoW3Rlc3QgIngkYXhfbHVhX3ByZWZpeGVkX3BhdGgiICE9ICd4J10sCiAgICAgICAgIFsgZG5sIEZpeCB0aGUgcHJlZml4LgogICAgICAgICAgIF9heF9zdHJpcF9wcmVmaXg9YGVjaG8gIiRheF9sdWFfcHJlZml4IiB8ICRTRUQgJ3N8LnwufGcnYApAQCAtMzMxLDcgKzMzMiw3IEBACiAKICAgICAgICAgZG5sIFRyeSB0byBmaW5kIGEgcGF0aCB3aXRoIHRoZSBwcmVmaXguCiAgICAgICAgIF9BWF9MVUFfRk5EX1BSRlhfUFRIKFskTFVBXSwKLSAgICAgICAgICBbJGF4X2x1YV9leGVjX3ByZWZpeF0sIFtwYWNrYWdlLmNwYXRoXSkKKyAgICAgICAgICBbJGF4X2x1YV9leGVjX3ByZWZpeF0sIFttb2R1bGVdKQogICAgICAgICBBU19JRihbdGVzdCAieCRheF9sdWFfcHJlZml4ZWRfcGF0aCIgIT0gJ3gnXSwKICAgICAgICAgWyBkbmwgRml4IHRoZSBwcmVmaXguCiAgICAgICAgICAgX2F4X3N0cmlwX3ByZWZpeD1gZWNobyAiJGF4X2x1YV9leGVjX3ByZWZpeCIgfCAkU0VEICdzfC58LnxnJ2AKQEAgLTQxNSw3ICs0MTYsNyBAQAogWwogICBkbmwgR2V0IHRoZSBzY3JpcHQgb3IgbW9kdWxlIGRpcmVjdG9yeSBieSBxdWVyeWluZyB0aGUgTHVhIGludGVycHJldGVyLAogICBkbmwgZmlsdGVyaW5nIG9uIHRoZSBnaXZlbiBwcmVmaXgsIGFuZCBzZWxlY3RpbmcgdGhlIHNoYWxsb3dlc3QgcGF0aC4gSWYgbm8KLSAgZG5sIHBhdGggIGlzIGZvdW5kIG1hdGNoaW5nIHRoZSBwcmVmaXgsIHRoZSByZXN1bHQgd2lsbCBiZSBhbiBlbXB0eSBzdHJpbmcuCisgIGRubCBwYXRoIGlzIGZvdW5kIG1hdGNoaW5nIHRoZSBwcmVmaXgsIHRoZSByZXN1bHQgd2lsbCBiZSBhbiBlbXB0eSBzdHJpbmcuCiAgIGRubCBUaGUgdGhpcmQgYXJndW1lbnQgZGV0ZXJtaW5lcyB0aGUgdHlwZSBvZiBzZWFyY2gsIGl0IGNhbiBiZSAnc2NyaXB0JyBvcgogICBkbmwgJ21vZHVsZScuIFN1cHBseWluZyAnc2NyaXB0JyB3aWxsIHBlcmZvcm0gdGhlIHNlYXJjaCB3aXRoIHBhY2thZ2UucGF0aAogICBkbmwgYW5kIExVQV9QQVRILCBhbmQgc3VwcGx5aW5nICdtb2R1bGUnIHdpbGwgc2VhcmNoIHdpdGggcGFja2FnZS5jcGF0aCBhbmQKQEAgLTQzMSw3ICs0MzIsNyBAQAogICAgICAgcGF0aHMgPSAocGFja2FnZSBhbmQgcGFja2FnZS5jcGF0aCkgb3IgTFVBX0NQQVRICiAgICAgZW5kCiAgICAgLS0gc2VhcmNoIGZvciB0aGUgcHJlZml4Ci0gICAgbG9jYWwgcHJlZml4ID0gIiQyIgorICAgIGxvY2FsIHByZWZpeCA9ICInJDInIgogICAgIGxvY2FsIG1pbnBhdGggPSAiIgogICAgIGxvY2FsIG1pbmRlcHRoID0gMWU5CiAgICAgc3RyaW5nLmdzdWIocGF0aHMsICIoQDw6QF47QDo+QCspIiwKZGlmZiAtLWdpdCBhL2FjbG9jYWwvYXhfcHJvZ19kb3RuZXRjb3JlX3ZlcnNpb24ubTQgYi9hY2xvY2FsL2F4X3Byb2dfZG90bmV0Y29yZV92ZXJzaW9uLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYzc0OTUKLS0tIC9kZXYvbnVsbAorKysgYi9hY2xvY2FsL2F4X3Byb2dfZG90bmV0Y29yZV92ZXJzaW9uLm00CkBAIC0wLDAgKzEsNjEgQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hdXRvY29uZi1hcmNoaXZlL2F4X3Byb2dfZG90bmV0Y29yZV92ZXJzaW9uLmh0bWwKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBTWU5PUFNJUworIworIyAgIEFYX1BST0dfRE9UTkVUQ09SRV9WRVJTSU9OKFtWRVJTSU9OXSxbQUNUSU9OLUlGLVRSVUVdLFtBQ1RJT04tSUYtRkFMU0VdKQorIworIyBERVNDUklQVElPTgorIworIyAgIE1ha2VzIHN1cmUgdGhhdCAuTkVUIENvcmUgc3VwcG9ydHMgdGhlIHZlcnNpb24gaW5kaWNhdGVkLiBJZiB0cnVlIHRoZQorIyAgIHNoZWxsIGNvbW1hbmRzIGluIEFDVElPTi1JRi1UUlVFIGFyZSBleGVjdXRlZC4gSWYgbm90IHRoZSBzaGVsbCBjb21tYW5kcworIyAgIGluIEFDVElPTi1JRi1GQUxTRSBhcmUgcnVuLiBUaGUgJGRvdG5ldGNvcmVfdmVyc2lvbiB2YXJpYWJsZSB3aWxsIGJlCisjICAgZmlsbGVkIHdpdGggdGhlIGRldGVjdGVkIHZlcnNpb24uCisjCisjICAgVGhpcyBtYWNybyB1c2VzIHRoZSAkRE9UTkVUQ09SRSB2YXJpYWJsZSB0byBwZXJmb3JtIHRoZSBjaGVjay4gSWYKKyMgICAkRE9UTkVUQ09SRSBpcyBub3Qgc2V0IHByaW9yIHRvIGNhbGxpbmcgdGhpcyBtYWNybywgdGhlIG1hY3JvIHdpbGwgZmFpbC4KKyMKKyMgICBFeGFtcGxlOgorIworIyAgICAgQUNfUEFUSF9QUk9HKFtET1RORVRDT1JFXSxbZG90bmV0XSkKKyMgICAgIEFDX1BST0dfRE9UTkVUQ09SRV9WRVJTSU9OKFsxLjAuMl0sWyAuLi4gXSxbIC4uLiBdKQorIworIyAgIFNlYXJjaGVzIGZvciAuTkVUIENvcmUsIHRoZW4gY2hlY2tzIGlmIGF0IGxlYXN0IHZlcnNpb24gMS4wLjIgaXMKKyMgICBwcmVzZW50LgorIworIyBMSUNFTlNFCisjCisjICAgQ29weXJpZ2h0IChjKSAyMDE2IEplbnMgR2V5ZXIgPGplbnNnQGFwYWNoZS5vcmc+CisjCisjICAgQ29weWluZyBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoaXMgZmlsZSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlCisjICAgcGVybWl0dGVkIGluIGFueSBtZWRpdW0gd2l0aG91dCByb3lhbHR5IHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlCisjICAgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuIFRoaXMgZmlsZSBpcyBvZmZlcmVkIGFzLWlzLCB3aXRob3V0IGFueQorIyAgIHdhcnJhbnR5LgorCisjc2VyaWFsIDIKKworQUNfREVGVU4oW0FYX1BST0dfRE9UTkVUQ09SRV9WRVJTSU9OXSxbCisgICAgQUNfUkVRVUlSRShbQUNfUFJPR19TRURdKQorCisgICAgQVNfSUYoW3Rlc3QgLW4gIiRET1RORVRDT1JFIl0sWworICAgICAgICBheF9kb3RuZXRjb3JlX3ZlcnNpb249IiQxIgorCisgICAgICAgIEFDX01TR19DSEVDS0lORyhbZm9yIC5ORVQgQ29yZSB2ZXJzaW9uXSkKKyAgICAgICAgZG90bmV0Y29yZV92ZXJzaW9uPWAkRE9UTkVUQ09SRSAtLXZlcnNpb24gMj4mMSB8ICRTRUQgLWUgJ3MvXChAPDpAMC05QDo+QCpcLkA8OkAwLTlAOj5AKlwuQDw6QDAtOUA6PkAqXClcKC4qXCkvXDEvJ2AKKyAgICAgICAgQUNfTVNHX1JFU1VMVCgkZG90bmV0Y29yZV92ZXJzaW9uKQorCisJICAgIEFDX1NVQlNUKFtET1RORVRDT1JFX1ZFUlNJT05dLFskZG90bmV0Y29yZV92ZXJzaW9uXSkKKworICAgICAgICBBWF9DT01QQVJFX1ZFUlNJT04oWyRheF9kb3RuZXRjb3JlX3ZlcnNpb25dLFtsZV0sWyRkb3RuZXRjb3JlX3ZlcnNpb25dLFsKKwkgICAgOgorICAgICAgICAgICAgJDIKKyAgICAgICAgXSxbCisJICAgIDoKKyAgICAgICAgICAgICQzCisgICAgICAgIF0pCisgICAgXSxbCisgICAgICAgIEFDX01TR19XQVJOKFtjb3VsZCBub3QgZmluZCAuTkVUIENvcmVdKQorICAgICAgICAkMworICAgIF0pCitdKQpkaWZmIC0tZ2l0IGEvYWNsb2NhbC9heF9wcm9nX2hheGVfdmVyc2lvbi5tNCBiL2FjbG9jYWwvYXhfcHJvZ19oYXhlX3ZlcnNpb24ubTQKaW5kZXggM2RlZTQzMC4uZmNhY2M2NyAxMDA2NDQKLS0tIGEvYWNsb2NhbC9heF9wcm9nX2hheGVfdmVyc2lvbi5tNAorKysgYi9hY2xvY2FsL2F4X3Byb2dfaGF4ZV92ZXJzaW9uLm00CkBAIC0xLDUgKzEsNSBAQAogIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgICBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYXV0b2NvbmYtYXJjaGl2ZS9heF9wcm9nX2hheGVfdmVyc2lvbi5odG1sCisjICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hdXRvY29uZi1hcmNoaXZlL2F4X3Byb2dfaGF4ZV92ZXJzaW9uLmh0bWwKICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAjCiAjIFNZTk9QU0lTCkBAIC0zMiw3ICszMiw3IEBACiAjICAgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuIFRoaXMgZmlsZSBpcyBvZmZlcmVkIGFzLWlzLCB3aXRob3V0IGFueQogIyAgIHdhcnJhbnR5LgogCi0jc2VyaWFsIDEKKyNzZXJpYWwgMgogCiBBQ19ERUZVTihbQVhfUFJPR19IQVhFX1ZFUlNJT05dLFsKICAgICBBQ19SRVFVSVJFKFtBQ19QUk9HX1NFRF0pCmRpZmYgLS1naXQgYS9hY2xvY2FsL2F4X3Byb2dfcGVybF9tb2R1bGVzLm00IGIvYWNsb2NhbC9heF9wcm9nX3BlcmxfbW9kdWxlcy5tNAppbmRleCAxMWEzMjZjLi43MGIzMjMwIDEwMDY0NAotLS0gYS9hY2xvY2FsL2F4X3Byb2dfcGVybF9tb2R1bGVzLm00CisrKyBiL2FjbG9jYWwvYXhfcHJvZ19wZXJsX21vZHVsZXMubTQKQEAgLTEsNSArMSw1IEBACiAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAgIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hdXRvY29uZi1hcmNoaXZlL2F4X3Byb2dfcGVybF9tb2R1bGVzLmh0bWwKKyMgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2F1dG9jb25mLWFyY2hpdmUvYXhfcHJvZ19wZXJsX21vZHVsZXMuaHRtbAogIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICMKICMgU1lOT1BTSVMKQEAgLTMyLDcgKzMyLDcgQEAKICMgICBhbmQgdGhpcyBub3RpY2UgYXJlIHByZXNlcnZlZC4gVGhpcyBmaWxlIGlzIG9mZmVyZWQgYXMtaXMsIHdpdGhvdXQgYW55CiAjICAgd2FycmFudHkuCiAKLSNzZXJpYWwgNworI3NlcmlhbCA4CiAKIEFVX0FMSUFTKFtBQ19QUk9HX1BFUkxfTU9EVUxFU10sIFtBWF9QUk9HX1BFUkxfTU9EVUxFU10pCiBBQ19ERUZVTihbQVhfUFJPR19QRVJMX01PRFVMRVNdLFtkbmwKZGlmZiAtLWdpdCBhL2FjbG9jYWwvbTRfYXhfY29tcGFyZV92ZXJzaW9uLm00IGIvYWNsb2NhbC9tNF9heF9jb21wYXJlX3ZlcnNpb24ubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ZGMwZmQuLjAwMDAwMDAKLS0tIGEvYWNsb2NhbC9tNF9heF9jb21wYXJlX3ZlcnNpb24ubTQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgICAgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2F1dG9jb25mLWFyY2hpdmUvYXhfY29tcGFyZV92ZXJzaW9uLmh0bWwKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIFNZTk9QU0lTCi0jCi0jICAgQVhfQ09NUEFSRV9WRVJTSU9OKFZFUlNJT05fQSwgT1AsIFZFUlNJT05fQiwgW0FDVElPTi1JRi1UUlVFXSwgW0FDVElPTi1JRi1GQUxTRV0pCi0jCi0jIERFU0NSSVBUSU9OCi0jCi0jICAgVGhpcyBtYWNybyBjb21wYXJlcyB0d28gdmVyc2lvbiBzdHJpbmdzLiBEdWUgdG8gdGhlIHZhcmlvdXMgbnVtYmVyIG9mCi0jICAgbWlub3ItdmVyc2lvbiBudW1iZXJzIHRoYXQgY2FuIGV4aXN0LCBhbmQgdGhlIGZhY3QgdGhhdCBzdHJpbmcKLSMgICBjb21wYXJpc29ucyBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCBudW1lcmljIGNvbXBhcmlzb25zLCB0aGlzIGlzIG5vdAotIyAgIG5lY2Vzc2FyaWx5IHRyaXZpYWwgdG8gZG8gaW4gYSBhdXRvY29uZiBzY3JpcHQuIFRoaXMgbWFjcm8gbWFrZXMgZG9pbmcKLSMgICB0aGVzZSBjb21wYXJpc29ucyBlYXN5LgotIwotIyAgIFRoZSBzaXggYmFzaWMgY29tcGFyaXNvbnMgYXJlIGF2YWlsYWJsZSwgYXMgd2VsbCBhcyBjaGVja2luZyBlcXVhbGl0eQotIyAgIGxpbWl0ZWQgdG8gYSBjZXJ0YWluIG51bWJlciBvZiBtaW5vci12ZXJzaW9uIGxldmVscy4KLSMKLSMgICBUaGUgb3BlcmF0b3IgT1AgZGV0ZXJtaW5lcyB3aGF0IHR5cGUgb2YgY29tcGFyaXNvbiB0byBkbywgYW5kIGNhbiBiZSBvbmUKLSMgICBvZjoKLSMKLSMgICAgZXEgIC0gZXF1YWwgKHRlc3QgQSA9PSBCKQotIyAgICBuZSAgLSBub3QgZXF1YWwgKHRlc3QgQSAhPSBCKQotIyAgICBsZSAgLSBsZXNzIHRoYW4gb3IgZXF1YWwgKHRlc3QgQSA8PSBCKQotIyAgICBnZSAgLSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgKHRlc3QgQSA+PSBCKQotIyAgICBsdCAgLSBsZXNzIHRoYW4gKHRlc3QgQSA8IEIpCi0jICAgIGd0ICAtIGdyZWF0ZXIgdGhhbiAodGVzdCBBID4gQikKLSMKLSMgICBBZGRpdGlvbmFsbHksIHRoZSBlcSBhbmQgbmUgb3BlcmF0b3IgY2FuIGhhdmUgYSBudW1iZXIgYWZ0ZXIgaXQgdG8gbGltaXQKLSMgICB0aGUgdGVzdCB0byB0aGF0IG51bWJlciBvZiBtaW5vciB2ZXJzaW9ucy4KLSMKLSMgICAgZXEwIC0gZXF1YWwgdXAgdG8gdGhlIGxlbmd0aCBvZiB0aGUgc2hvcnRlciB2ZXJzaW9uCi0jICAgIG5lMCAtIG5vdCBlcXVhbCB1cCB0byB0aGUgbGVuZ3RoIG9mIHRoZSBzaG9ydGVyIHZlcnNpb24KLSMgICAgZXFOIC0gZXF1YWwgdXAgdG8gTiBzdWItdmVyc2lvbiBsZXZlbHMKLSMgICAgbmVOIC0gbm90IGVxdWFsIHVwIHRvIE4gc3ViLXZlcnNpb24gbGV2ZWxzCi0jCi0jICAgV2hlbiB0aGUgY29uZGl0aW9uIGlzIHRydWUsIHNoZWxsIGNvbW1hbmRzIEFDVElPTi1JRi1UUlVFIGFyZSBydW4sCi0jICAgb3RoZXJ3aXNlIHNoZWxsIGNvbW1hbmRzIEFDVElPTi1JRi1GQUxTRSBhcmUgcnVuLiBUaGUgZW52aXJvbm1lbnQKLSMgICB2YXJpYWJsZSAnYXhfY29tcGFyZV92ZXJzaW9uJyBpcyBhbHdheXMgc2V0IHRvIGVpdGhlciAndHJ1ZScgb3IgJ2ZhbHNlJwotIyAgIGFzIHdlbGwuCi0jCi0jICAgRXhhbXBsZXM6Ci0jCi0jICAgICBBWF9DT01QQVJFX1ZFUlNJT04oWzMuMTUuN10sW2x0XSxbMy4xNS44XSkKLSMgICAgIEFYX0NPTVBBUkVfVkVSU0lPTihbMy4xNV0sW2x0XSxbMy4xNS44XSkKLSMKLSMgICB3b3VsZCBib3RoIGJlIHRydWUuCi0jCi0jICAgICBBWF9DT01QQVJFX1ZFUlNJT04oWzMuMTUuN10sW2VxXSxbMy4xNS44XSkKLSMgICAgIEFYX0NPTVBBUkVfVkVSU0lPTihbMy4xNV0sW2d0XSxbMy4xNS44XSkKLSMKLSMgICB3b3VsZCBib3RoIGJlIGZhbHNlLgotIwotIyAgICAgQVhfQ09NUEFSRV9WRVJTSU9OKFszLjE1LjddLFtlcTJdLFszLjE1LjhdKQotIwotIyAgIHdvdWxkIGJlIHRydWUgYmVjYXVzZSBpdCBpcyBvbmx5IGNvbXBhcmluZyB0d28gbWlub3IgdmVyc2lvbnMuCi0jCi0jICAgICBBWF9DT01QQVJFX1ZFUlNJT04oWzMuMTUuN10sW2VxMF0sWzMuMTVdKQotIwotIyAgIHdvdWxkIGJlIHRydWUgYmVjYXVzZSBpdCBpcyBvbmx5IGNvbXBhcmluZyB0aGUgbGVzc2VyIG51bWJlciBvZiBtaW5vcgotIyAgIHZlcnNpb25zIG9mIHRoZSB0d28gdmFsdWVzLgotIwotIyAgIE5vdGU6IFRoZSBjaGFyYWN0ZXJzIHRoYXQgc2VwYXJhdGUgdGhlIHZlcnNpb24gbnVtYmVycyBkbyBub3QgbWF0dGVyLiBBbgotIyAgIGVtcHR5IHN0cmluZyBpcyB0aGUgc2FtZSBhcyB2ZXJzaW9uIDAuIE9QIGlzIGV2YWx1YXRlZCBieSBhdXRvY29uZiwgbm90Ci0jICAgY29uZmlndXJlLCBzbyBtdXN0IGJlIGEgc3RyaW5nLCBub3QgYSB2YXJpYWJsZS4KLSMKLSMgICBUaGUgYXV0aG9yIHdvdWxkIGxpa2UgdG8gYWNrbm93bGVkZ2UgR3VpZG8gRHJhaGVpbSB3aG9zZSBhZHZpY2UgYWJvdXQKLSMgICB0aGUgbTRfY2FzZSBhbmQgbTRfaWZ2YWxuIGZ1bmN0aW9ucyBtYWtlIHRoaXMgbWFjcm8gb25seSBpbmNsdWRlIHRoZQotIyAgIHBvcnRpb25zIG5lY2Vzc2FyeSB0byBwZXJmb3JtIHRoZSBzcGVjaWZpYyBjb21wYXJpc29uIHNwZWNpZmllZCBieSB0aGUKLSMgICBPUCBhcmd1bWVudCBpbiB0aGUgZmluYWwgY29uZmlndXJlIHNjcmlwdC4KLSMKLSMgTElDRU5TRQotIwotIyAgIENvcHlyaWdodCAoYykgMjAwOCBUaW0gVG9vbGFuIDx0b29sYW5AZWxlLnVyaS5lZHU+Ci0jCi0jICAgQ29weWluZyBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoaXMgZmlsZSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlCi0jICAgcGVybWl0dGVkIGluIGFueSBtZWRpdW0gd2l0aG91dCByb3lhbHR5IHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlCi0jICAgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuIFRoaXMgZmlsZSBpcyBvZmZlcmVkIGFzLWlzLCB3aXRob3V0IGFueQotIyAgIHdhcnJhbnR5LgotCi0jc2VyaWFsIDExCi0KLWRubCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1BQ19ERUZVTihbQVhfQ09NUEFSRV9WRVJTSU9OXSwgWwotICBBQ19SRVFVSVJFKFtBQ19QUk9HX0FXS10pCi0KLSAgIyBVc2VkIHRvIGluZGljYXRlIHRydWUgb3IgZmFsc2UgY29uZGl0aW9uCi0gIGF4X2NvbXBhcmVfdmVyc2lvbj1mYWxzZQotCi0gICMgQ29udmVydCB0aGUgdHdvIHZlcnNpb24gc3RyaW5ncyB0byBiZSBjb21wYXJlZCBpbnRvIGEgZm9ybWF0IHRoYXQKLSAgIyBhbGxvd3MgYSBzaW1wbGUgc3RyaW5nIGNvbXBhcmlzb24uICBUaGUgZW5kIHJlc3VsdCBpcyB0aGF0IGEgdmVyc2lvbgotICAjIHN0cmluZyBvZiB0aGUgZm9ybSAxLjEyLjUtcjYxNyB3aWxsIGJlIGNvbnZlcnRlZCB0byB0aGUgZm9ybQotICAjIDAwMDEwMDEyMDAwNTA2MTcuICBJbiBvdGhlciB3b3JkcywgZWFjaCBudW1iZXIgaXMgemVybyBwYWRkZWQgdG8gZm91cgotICAjIGRpZ2l0cywgYW5kIG5vbiBkaWdpdHMgYXJlIHJlbW92ZWQuCi0gIEFTX1ZBUl9QVVNIREVGKFtBXSxbYXhfY29tcGFyZV92ZXJzaW9uX0FdKQotICBBPWBlY2hvICIkMSIgfCBzZWQgLWUgJ3MvXChbWzAtOV1dKlwpL1pcMVovZycgXAotICAgICAgICAgICAgICAgICAgICAgLWUgJ3MvWlwoW1swLTldXVwpWi9aMFwxWi9nJyBcCi0gICAgICAgICAgICAgICAgICAgICAtZSAncy9aXChbWzAtOV1dW1swLTldXVwpWi9aMFwxWi9nJyBcCi0gICAgICAgICAgICAgICAgICAgICAtZSAncy9aXChbWzAtOV1dW1swLTldXVtbMC05XV1cKVovWjBcMVovZycgXAotICAgICAgICAgICAgICAgICAgICAgLWUgJ3MvW1teMC05XV0vL2cnYAotCi0gIEFTX1ZBUl9QVVNIREVGKFtCXSxbYXhfY29tcGFyZV92ZXJzaW9uX0JdKQotICBCPWBlY2hvICIkMyIgfCBzZWQgLWUgJ3MvXChbWzAtOV1dKlwpL1pcMVovZycgXAotICAgICAgICAgICAgICAgICAgICAgLWUgJ3MvWlwoW1swLTldXVwpWi9aMFwxWi9nJyBcCi0gICAgICAgICAgICAgICAgICAgICAtZSAncy9aXChbWzAtOV1dW1swLTldXVwpWi9aMFwxWi9nJyBcCi0gICAgICAgICAgICAgICAgICAgICAtZSAncy9aXChbWzAtOV1dW1swLTldXVtbMC05XV1cKVovWjBcMVovZycgXAotICAgICAgICAgICAgICAgICAgICAgLWUgJ3MvW1teMC05XV0vL2cnYAotCi0gIGRubCAjIEluIHRoZSBjYXNlIG9mIGxlLCBnZSwgbHQsIGFuZCBndCwgdGhlIHN0cmluZ3MgYXJlIHNvcnRlZCBhcyBuZWNlc3NhcnkKLSAgZG5sICMgdGhlbiB0aGUgZmlyc3QgbGluZSBpcyB1c2VkIHRvIGRldGVybWluZSBpZiB0aGUgY29uZGl0aW9uIGlzIHRydWUuCi0gIGRubCAjIFRoZSBzZWQgcmlnaHQgYWZ0ZXIgdGhlIGVjaG8gaXMgdG8gcmVtb3ZlIGFueSBpbmRlbnRlZCB3aGl0ZSBzcGFjZS4KLSAgbTRfY2FzZShtNF90b2xvd2VyKCQyKSwKLSAgW2x0XSxbCi0gICAgYXhfY29tcGFyZV92ZXJzaW9uPWBlY2hvICJ4JEEKLXgkQiIgfCBzZWQgJ3MvXiAqLy8nIHwgc29ydCAtciB8IHNlZCAicy94JHtBfS9mYWxzZS87cy94JHtCfS90cnVlLzsxcSJgCi0gIF0sCi0gIFtndF0sWwotICAgIGF4X2NvbXBhcmVfdmVyc2lvbj1gZWNobyAieCRBCi14JEIiIHwgc2VkICdzL14gKi8vJyB8IHNvcnQgfCBzZWQgInMveCR7QX0vZmFsc2UvO3MveCR7Qn0vdHJ1ZS87MXEiYAotICBdLAotICBbbGVdLFsKLSAgICBheF9jb21wYXJlX3ZlcnNpb249YGVjaG8gIngkQQoteCRCIiB8IHNlZCAncy9eICovLycgfCBzb3J0IHwgc2VkICJzL3gke0F9L3RydWUvO3MveCR7Qn0vZmFsc2UvOzFxImAKLSAgXSwKLSAgW2dlXSxbCi0gICAgYXhfY29tcGFyZV92ZXJzaW9uPWBlY2hvICJ4JEEKLXgkQiIgfCBzZWQgJ3MvXiAqLy8nIHwgc29ydCAtciB8IHNlZCAicy94JHtBfS90cnVlLztzL3gke0J9L2ZhbHNlLzsxcSJgCi0gIF0sWwotICAgIGRubCBTcGxpdCB0aGUgb3BlcmF0b3IgZnJvbSB0aGUgc3VidmVyc2lvbiBjb3VudCBpZiBwcmVzZW50LgotICAgIG00X2JtYXRjaChtNF9zdWJzdHIoJDIsMiksCi0gICAgWzBdLFsKLSAgICAgICMgQSBjb3VudCBvZiB6ZXJvIG1lYW5zIHVzZSB0aGUgbGVuZ3RoIG9mIHRoZSBzaG9ydGVyIHZlcnNpb24uCi0gICAgICAjIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gQSBhbmQgQi4KLSAgICAgIGF4X2NvbXBhcmVfdmVyc2lvbl9sZW5fQT1gZWNobyAiJEEiIHwgJEFXSyAne3ByaW50KGxlbmd0aCl9J2AKLSAgICAgIGF4X2NvbXBhcmVfdmVyc2lvbl9sZW5fQj1gZWNobyAiJEIiIHwgJEFXSyAne3ByaW50KGxlbmd0aCl9J2AKLQotICAgICAgIyBTZXQgQSB0byBubyBtb3JlIHRoYW4gQidzIGxlbmd0aCBhbmQgQiB0byBubyBtb3JlIHRoYW4gQSdzIGxlbmd0aC4KLSAgICAgIEE9YGVjaG8gIiRBIiB8IHNlZCAicy9cKC5ceyRheF9jb21wYXJlX3ZlcnNpb25fbGVuX0JcfVwpLiovXDEvImAKLSAgICAgIEI9YGVjaG8gIiRCIiB8IHNlZCAicy9cKC5ceyRheF9jb21wYXJlX3ZlcnNpb25fbGVuX0FcfVwpLiovXDEvImAKLSAgICBdLAotICAgIFtbMC05XStdLFsKLSAgICAgICMgQSBjb3VudCBncmVhdGVyIHRoYW4gemVybyBtZWFucyB1c2Ugb25seSB0aGF0IG1hbnkgc3VidmVyc2lvbnMKLSAgICAgIEE9YGVjaG8gIiRBIiB8IHNlZCAicy9cKFwoW1swLTldXVx7NFx9XClce200X3N1YnN0cigkMiwyKVx9XCkuKi9cMS8iYAotICAgICAgQj1gZWNobyAiJEIiIHwgc2VkICJzL1woXChbWzAtOV1dXHs0XH1cKVx7bTRfc3Vic3RyKCQyLDIpXH1cKS4qL1wxLyJgCi0gICAgXSwKLSAgICBbLitdLFsKLSAgICAgIEFDX1dBUk5JTkcoCi0gICAgICAgIFtpbGxlZ2FsIE9QIG51bWVyaWMgcGFyYW1ldGVyOiAkMl0pCi0gICAgXSxbXSkKLQotICAgICMgUGFkIHplcm9zIGF0IGVuZCBvZiBudW1iZXJzIHRvIG1ha2Ugc2FtZSBsZW5ndGguCi0gICAgYXhfY29tcGFyZV92ZXJzaW9uX3RtcF9BPSIkQWBlY2hvICRCIHwgc2VkICdzLy4vMC9nJ2AiCi0gICAgQj0iJEJgZWNobyAkQSB8IHNlZCAncy8uLzAvZydgIgotICAgIEE9IiRheF9jb21wYXJlX3ZlcnNpb25fdG1wX0EiCi0KLSAgICAjIENoZWNrIGZvciBlcXVhbGl0eSBvciBpbmVxdWFsaXR5IGFzIG5lY2Vzc2FyeS4KLSAgICBtNF9jYXNlKG00X3RvbG93ZXIobTRfc3Vic3RyKCQyLDAsMikpLAotICAgIFtlcV0sWwotICAgICAgdGVzdCAieCRBIiA9ICJ4JEIiICYmIGF4X2NvbXBhcmVfdmVyc2lvbj10cnVlCi0gICAgXSwKLSAgICBbbmVdLFsKLSAgICAgIHRlc3QgIngkQSIgIT0gIngkQiIgJiYgYXhfY29tcGFyZV92ZXJzaW9uPXRydWUKLSAgICBdLFsKLSAgICAgIEFDX1dBUk5JTkcoW2lsbGVnYWwgT1AgcGFyYW1ldGVyOiAkMl0pCi0gICAgXSkKLSAgXSkKLQotICBBU19WQVJfUE9QREVGKFtBXSlkbmwKLSAgQVNfVkFSX1BPUERFRihbQl0pZG5sCi0KLSAgZG5sICMgRXhlY3V0ZSBBQ1RJT04tSUYtVFJVRSAvIEFDVElPTi1JRi1GQUxTRS4KLSAgaWYgdGVzdCAiJGF4X2NvbXBhcmVfdmVyc2lvbiIgPSAidHJ1ZSIgOyB0aGVuCi0gICAgbTRfaWZ2YWxuKFskNF0sWyQ0XSxbOl0pZG5sCi0gICAgbTRfaWZ2YWxuKFskNV0sW2Vsc2UgJDVdKWRubAotICBmaQotXSkgZG5sIEFYX0NPTVBBUkVfVkVSU0lPTgpkaWZmIC0tZ2l0IGEvYXBwdmV5b3IueW1sIGIvYXBwdmV5b3IueW1sCmluZGV4IDBjNWJmZGYuLmUwMjE0NzkgMTAwNzU1Ci0tLSBhL2FwcHZleW9yLnltbAorKysgYi9hcHB2ZXlvci55bWwKQEAgLTEsMyArMSw0IEBACisjCiAjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKICMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKICMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KQEAgLTE4LDM2ICsxOSw5MiBAQAogCiAjIGJ1aWxkIEFwYWNoZSBUaHJpZnQgb24gQXBwVmV5b3IgLSBodHRwczovL2NpLmFwcHZleW9yLmNvbQogCi12ZXJzaW9uOiAne2J1aWxkfScKK3ZlcnNpb246ICcxLjAuMC57YnVpbGR9JworCitzaGFsbG93X2Nsb25lOiB0cnVlCisKIG9zOgotLSBXaW5kb3dzIFNlcnZlciAyMDEyIFIyCi0tIFZpc3VhbCBTdHVkaW8gMjAxNCBDVFA0Ci0tIFZpc3VhbCBTdHVkaW8gMjAxNSBDVFAKLS0gVmlzdWFsIFN0dWRpbyAyMDE1IENUUCA2Ci0tIFZpc3VhbCBTdHVkaW8gMjAxNSBQcmV2aWV3CisgIC0gVmlzdWFsIFN0dWRpbyAyMDE3CisKK21hdHJpeDoKKyAgYWxsb3dfZmFpbHVyZXM6CisgICAgICAtIFBST0ZJTEU6IENZR1dJTgorICBmYXN0X2ZpbmlzaDogdHJ1ZQogCiBlbnZpcm9ubWVudDoKLSAgQk9PU1RfUk9PVDogYzpcTGlicmFyaWVzXGJvb3N0Ci0gIEJPT1NUX0xJQlJBUllESVI6IGM6XExpYnJhcmllc1xib29zdFxzdGFnZVxsaWIKKyAgbWF0cml4OgorICAgLSBQUk9GSUxFOiBNU1ZDMjAxNworICAgICBQTEFURk9STTogeDY0CisgICAgIENPTkZJR1VSQVRJT046IFJlbGVhc2UKKyAgICAgQk9PU1RfVkVSU0lPTjogMS42NS4xCisgICAgIExJQkVWRU5UX1ZFUlNJT046IDIuMS44CisgICAgIFBZVEhPTl9WRVJTSU9OOiAzLjYKKyAgICAgUVRfVkVSU0lPTjogNS4xMAorICAgICBaTElCX1ZFUlNJT046IDEuMi4xMQorICAgICBESVNBQkxFRF9URVNUUzogU3RyZXNzVGVzdE5vbkJsb2NraW5nCisKKyAgIC0gUFJPRklMRTogTVNWQzIwMTMKKyAgICAgUExBVEZPUk06IHg4NgorICAgICBDT05GSUdVUkFUSU9OOiBSZWxlYXNlCisgICAgIEJPT1NUX1ZFUlNJT046IDEuNTguMAorICAgICBMSUJFVkVOVF9WRVJTSU9OOiAyLjAuMjIKKyAgICAgUFlUSE9OX1ZFUlNJT046IDMuNQorICAgICBRVF9WRVJTSU9OOiA1LjgKKyAgICAgWkxJQl9WRVJTSU9OOiAxLjIuOAorICAgICBESVNBQkxFRF9URVNUUzogU3RyZXNzVGVzdE5vbkJsb2NraW5nCisgICAgIEFQUFZFWU9SX0JVSUxEX1dPUktFUl9JTUFHRTogVmlzdWFsIFN0dWRpbyAyMDE1CisKKyAgIC0gUFJPRklMRTogTUlOR1cKKyAgICAgUExBVEZPUk06IHg2NAorICAgICBDT05GSUdVUkFUSU9OOiBSZWxXaXRoRGViSW5mbworICAgICBESVNBQkxFRF9URVNUUzogU3RyZXNzVGVzdE5vbkJsb2NraW5nCisKKyAgIC0gUFJPRklMRTogQ1lHV0lOCisgICAgIFBMQVRGT1JNOiB4ODYKKyAgICAgQ09ORklHVVJBVElPTjogUmVsV2l0aERlYkluZm8KKyAgICAgRElTQUJMRURfVEVTVFM6IChabGliVGVzdHxPcGVuU1NMTWFudWFsSW5pdFRlc3R8VE5vbmJsb2NraW5nU2VydmVyVGVzdHxTdHJlc3NUZXN0Tm9uQmxvY2tpbmcpCisKKyMgIC0gUFJPRklMRTogQ1lHV0lOCisjICAgIFBMQVRGT1JNOiB4NjQKKyMgICAgQ09ORklHVVJBVElPTjogUmVsV2l0aERlYkluZm8KKyMgICAgRElTQUJMRURfVEVTVFM6IChabGliVGVzdHxPcGVuU1NMTWFudWFsSW5pdFRlc3R8VE5vbmJsb2NraW5nU2VydmVyVGVzdHxTdHJlc3NUZXN0Tm9uQmxvY2tpbmcpCiAKIGluc3RhbGw6Ci0tIGNpbnN0IGNtYWtlCi0tIGNpbnN0IG5zaXMKLS0gY2luc3QgYW50Ci0tIGNpbnN0IHdpbmZsZXhiaXNvbgorICAtIGNkICVBUFBWRVlPUl9CVUlMRF9GT0xERVIlCisgIC0gY2FsbCBidWlsZFxhcHB2ZXlvclwlUFJPRklMRTp+MCw0JS1hcHB2ZXlvci1pbnN0YWxsLmJhdAorICAtIHJlZnJlc2hlbnYKIAogYnVpbGRfc2NyaXB0OgotLSBzZXQgUEFUSD1DOlxQcm9ncmFtRGF0YVxjaG9jb2xhdGV5XGJpbjtDOlx0b29sc1xhcGFjaGUtYW50LTEuOS40XGJpbjslUEFUSCUKLS0gbXYgQzpcUHJvZ3JhbURhdGFcY2hvY29sYXRleVxiaW5cd2luX2Jpc29uLmV4ZSBDOlxQcm9ncmFtRGF0YVxjaG9jb2xhdGV5XGJpblxiaXNvbi5leGUKLS0gbXYgQzpcUHJvZ3JhbURhdGFcY2hvY29sYXRleVxiaW5cd2luX2ZsZXguZXhlIEM6XFByb2dyYW1EYXRhXGNob2NvbGF0ZXlcYmluXGZsZXguZXhlCi0tIHNldCBKQVZBX0hPTUU9QzpcUHJvZ3JhbSBGaWxlc1xKYXZhXGpkazEuNy4wCi0tIHNldCBQQVRIPSVKQVZBX0hPTUUlXGJpbjslUEFUSCUKLS0gbWtkaXIgY21ha2UtYnVpbGQKLS0gY2QgY21ha2UtYnVpbGQKLS0gY21ha2UgLURCVUlMRF9URVNUSU5HPU9GRiAuLgotLSBjbWFrZSAtLWJ1aWxkIC4KLS0gY21ha2UgLS1idWlsZCAuIC0tY29uZmlnIFJlbGVhc2UKLS0gY3BhY2sKKyAgLSBjZCAlQVBQVkVZT1JfQlVJTERfRk9MREVSJQorICAtIGNhbGwgYnVpbGRcYXBwdmV5b3JcJVBST0ZJTEU6fjAsNCUtYXBwdmV5b3ItYnVpbGQuYmF0CiAKLSNUT0RPIGVuYWJsZSB0ZXN0aW5nCi0jVE9ETyBtYWtlIGl0IHBlcmZlY3QgOy1yCit0ZXN0X3NjcmlwdDoKKyAgLSBjZCAlQVBQVkVZT1JfQlVJTERfRk9MREVSJQorICAtIGNhbGwgYnVpbGRcYXBwdmV5b3JcJVBST0ZJTEU6fjAsNCUtYXBwdmV5b3ItdGVzdC5iYXQKKworCisjIGFydGlmYWN0IGNhcHR1cmUgZGlzYWJsZWQgYXMgaXQgbWlnaHQgaW5jcmVhc2Ugc2VydmljZSBjb3N0IGZvciBsaXR0bGUgZ2FpbjoKKyMKKyMgYXJ0aWZhY3RzOgorIyAgLSBwYXRoOiBsb2NhbC10aHJpZnQtaW5zdAorIyAgICBuYW1lOiBjbWFrZSBpbnN0YWxsZWQgY29udGVudAorIyAgICB0eXBlOiB6aXAKKyMKKyMgIC0gcGF0aDogbG9jYWwtdGhyaWZ0LWJ1aWxkXFRlc3RpbmcKKyMgICAgbmFtZTogY3Rlc3Qgb3V0cHV0CisjICAgIHR5cGU6IHppcAorCisjIFJEUCBzdXBwb3J0OiB1c2Ugb25lIG9yIHRoZSBvdGhlci4uLgorIworIyBlbmFibGVzIFJEUCBmb3IgZWFjaCBidWlsZCBqb2Igc28geW91IGNhbiBpbnNwZWN0IHRoZSBlbnZpcm9ubWVudCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBqb2I6CisjIGluaXQ6CisjICAtIHBzOiBpZXggKChuZXctb2JqZWN0IG5ldC53ZWJjbGllbnQpLkRvd25sb2FkU3RyaW5nKCdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYXBwdmV5b3IvY2kvbWFzdGVyL3NjcmlwdHMvZW5hYmxlLXJkcC5wczEnKSkKKyMKKyMgZW5hYmxlcyBSRFAgYXQgdGhlIGVuZCBvZiB0aGUgYnVpbGQgam9iIHNvIHlvdSBjYW4gbG9naW4gYW5kIHJlLXJ1bgorIyBjb21tYW5kcyB0byBzZWUgd2h5IHNvbWV0aGluZyBmYWlsZWQuLi4KKyNvbl9maW5pc2g6CisjICAtIHBzOiAkYmxvY2tSZHAgPSAkdHJ1ZTsgaWV4ICgobmV3LW9iamVjdCBuZXQud2ViY2xpZW50KS5Eb3dubG9hZFN0cmluZygnaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2FwcHZleW9yL2NpL21hc3Rlci9zY3JpcHRzL2VuYWJsZS1yZHAucHMxJykpCisjCisjIGFsc28gbmVlZDoKKyMgZW52aXJvbm1lbnQ6CisjICAgQVBQVkVZT1JfUkRQX1BBU1NXT1JEOiB0aHIxRlQyMzQ1JHh5eloKZGlmZiAtLWdpdCBhL2Jvb3RzdHJhcC5zaCBiL2Jvb3RzdHJhcC5zaAppbmRleCA1MmVjZGE0Li4yNDUyZWVhIDEwMDc1NQotLS0gYS9ib290c3RyYXAuc2gKKysrIGIvYm9vdHN0cmFwLnNoCkBAIC0zOCwxNyArMzgsMjQgQEAKICAgZXhpdCAxCiBmaQogCitmb3JtYXRfdmVyc2lvbiAoKSB7CisgICAgcHJpbnRmICIlMDNkJTAzZCUwM2QlMDNkIiAkKGVjaG8gJDEgfCB0ciAnLicgJyAnKTsKK30KKwogIyB3ZSByZXF1aXJlIGF1dG9tYWtlIDEuMTMgb3IgbGF0ZXIKICMgY2hlY2sgbXVzdCBoYXBwZW4gZXh0ZXJuYWxseSBkdWUgdG8gdXNlIG9mIG5ld2VyIG1hY3JvCiBBVVRPTUFLRV9WRVJTSU9OPWBhdXRvbWFrZSAtLXZlcnNpb24gfCBncmVwIGF1dG9tYWtlIHwgZWdyZXAgLW8gJyhbMC05XXsxLH1cLikrWzAtOV17MSx9J2AKLWlmIFsgIiRBVVRPTUFLRV9WRVJTSU9OIiBcPCAiMS4xMyIgXTsgdGhlbgoraWYgIFsgJChmb3JtYXRfdmVyc2lvbiAkQVVUT01BS0VfVkVSU0lPTikgLWx0ICQoZm9ybWF0X3ZlcnNpb24gMS4xMykgXTsgdGhlbgogICBlY2hvID4mMiAiYXV0b21ha2UgdmVyc2lvbiAkQVVUT01BS0VfVkVSU0lPTiBpcyB0b28gb2xkIChuZWVkIDEuMTMgb3IgbGF0ZXIpIgogICBleGl0IDEKIGZpCiAKK3NldCAtZQogYXV0b3NjYW4KICRMSUJUT09MSVpFIC0tY29weSAtLWF1dG9tYWtlCiBhY2xvY2FsIC1JIC4vYWNsb2NhbAogYXV0b2hlYWRlcgorc2VkICcvdW5kZWYgVkVSU0lPTi9kJyBjb25maWcuaGluID4gY29uZmlnLmhpbjIKK212IGNvbmZpZy5oaW4yIGNvbmZpZy5oaW4KIGF1dG9jb25mCiBhdXRvbWFrZSAtLWNvcHkgLS1hZGQtbWlzc2luZyAtLWZvcmVpZ24KZGlmZiAtLWdpdCBhL2Jvd2VyLmpzb24gYi9ib3dlci5qc29uCmluZGV4IGUwNjEyZTMuLjg1M2I4Y2IgMTAwNjQ0Ci0tLSBhL2Jvd2VyLmpzb24KKysrIGIvYm93ZXIuanNvbgpAQCAtMSw3ICsxLDcgQEAKIHsKICAgIm5hbWUiOiAidGhyaWZ0IiwKLSAgInZlcnNpb24iOiAiMC45LjMiLAotICAiaG9tZXBhZ2UiOiAiaHR0cHM6Ly9naXQtd2lwLXVzLmFwYWNoZS5vcmcvcmVwb3MvYXNmL3RocmlmdC5naXQiLAorICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICJob21lcGFnZSI6ICJodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC5naXQiLAogICAiYXV0aG9ycyI6IFsKICAgICAiQXBhY2hlIFRocmlmdCA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPiIKICAgXSwKQEAgLTExLDYgKzExLDUgQEAKICAgICAidGhyaWZ0IgogICBdLAogICAibGljZW5zZSI6ICJBcGFjaGUgdjIiLAotICAiaWdub3JlIjogWwotICBdCisgICJpZ25vcmUiOiBbXQogfQpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvQ1lHVy1hcHB2ZXlvci1idWlsZC5iYXQgYi9idWlsZC9hcHB2ZXlvci9DWUdXLWFwcHZleW9yLWJ1aWxkLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjI2MjIyCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvQ1lHVy1hcHB2ZXlvci1idWlsZC5iYXQKQEAgLTAsMCArMSwzNiBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworQEVDSE8gT0ZGCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCisKK0NEIGJ1aWxkXGFwcHZleW9yICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9iYW5uZXJfYnVpbGQuYmF0ICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX3NldGVudi5iYXQgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKworU0VUIENNQUtFQVJHUz1eCisgIC1HJyVHRU5FUkFUT1IlJyBeCisgIC1EQ01BS0VfQlVJTERfVFlQRT0lQ09ORklHVVJBVElPTiUgXgorICAtRENNQUtFX0lOU1RBTExfUFJFRklYPSVJTlNURElSJSBeCisgIC1EQ01BS0VfQ1hYX0VYVEVOU0lPTlM9T04gXgorICAtRENNQUtFX0NYWF9GTEFHUz0iLURfR05VX1NPVVJDRSIgXgorICAtRENNQUtFX0NYWF9TVEFOREFSRD0xMSBeCisgIC1EV0lUSF9QWVRIT049T0ZGIF4KKyAgLURXSVRIX1NIQVJFRF9MSUI9T0ZGIF4KKyAgLURXSVRIX1NUQVRJQ19MSUI9T04gXgorICAtRFdJVEhfU1REVEhSRUFEUz1PTgorCitARUNITyBPTgorJUJBU0glIC1sYyAibWtkaXIgLXAgJUJVSUxERElSJSAmJiBjZCAlQlVJTERESVIlICYmIGNtYWtlLmV4ZSAlU1JDRElSJSAlQ01BS0VBUkdTJSAmJiBjbWFrZSAtLWJ1aWxkIC4gLS1jb25maWcgJUNPTkZJR1VSQVRJT04lIC0tdGFyZ2V0IGluc3RhbGwiIHx8IEVYSVQgL0IKK0BFQ0hPIE9GRgpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvQ1lHVy1hcHB2ZXlvci1pbnN0YWxsLmJhdCBiL2J1aWxkL2FwcHZleW9yL0NZR1ctYXBwdmV5b3ItaW5zdGFsbC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdkYjdkNAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL0NZR1ctYXBwdmV5b3ItaW5zdGFsbC5iYXQKQEAgLTAsMCArMSwzNCBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworOjoKKzo6IEFwcHZleW9yIGluc3RhbGwgc2NyaXB0IGZvciBDWUdXSU4KKzo6IEluc3RhbGxzIHRoaXJkIHBhcnR5IHBhY2thZ2VzIHdlIG5lZWQgZm9yIGEgY21ha2UgYnVpbGQKKzo6CisKK0BFQ0hPIE9GRgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorCitDRCBidWlsZFxhcHB2ZXlvciAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9iYW5uZXJfaW5zdGFsbC5iYXQgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfc2V0ZW52LmJhdCAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX3Nob3dlbnYuYmF0ICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorCis6OgorOjogSW5zdGFsbCBhcHQtY3lnIGZvciBwYWNrYWdlIG1hbmFnZW1lbnQKKzo6CisKKyVCQVNIJSAtbGMgIndnZXQgcmF3Z2l0LmNvbS90cmFuc2NvZGUtb3Blbi9hcHQtY3lnL21hc3Rlci9hcHQtY3lnICYmIGluc3RhbGwgYXB0LWN5ZyAvYmluICYmIHJtIC1mIGFwdC1jeWciIHx8IEVYSVQgL0IKKyVCQVNIJSAtbGMgImFwdC1jeWcgdXBkYXRlIiB8fCBFWElUIC9CCislQkFTSCUgLWxjICJhcHQtY3lnIGluc3RhbGwgYmlzb24gY21ha2UgZmxleCBnY2MtZysrIGxpYmJvb3N0LWRldmVsIGxpYmV2ZW50LWRldmVsIG1ha2Ugb3BlbnNzbC1kZXZlbCB6bGliLWRldmVsIgpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvQ1lHVy1hcHB2ZXlvci10ZXN0LmJhdCBiL2J1aWxkL2FwcHZleW9yL0NZR1ctYXBwdmV5b3ItdGVzdC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY2N2Y5YgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL0NZR1ctYXBwdmV5b3ItdGVzdC5iYXQKQEAgLTAsMCArMSwyMSBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworQEVDSE8gT0ZGCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCitDRCBidWlsZFxhcHB2ZXlvciAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9iYW5uZXJfdGVzdC5iYXQgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfc2V0ZW52LmJhdCAgICAgICAgICAgICB8fCBFWElUIC9CCisKKyVCQVNIJSAtbGMgImNkICVCVUlMRERJUiUgJiYgY3Rlc3QuZXhlIC1DICVDT05GSUdVUkFUSU9OJSAtLXRpbWVvdXQgMzAwIC1WViAtRSAnJURJU0FCTEVEX1RFU1RTJSciIHx8IEVYSVQgL0IKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL01JTkctYXBwdmV5b3ItYnVpbGQuYmF0IGIvYnVpbGQvYXBwdmV5b3IvTUlORy1hcHB2ZXlvci1idWlsZC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM3YTk1YQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL01JTkctYXBwdmV5b3ItYnVpbGQuYmF0CkBAIC0wLDAgKzEsMzYgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKK0BFQ0hPIE9GRgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorCitDRCBidWlsZFxhcHB2ZXlvciAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfYmFubmVyX2J1aWxkLmJhdCAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zZXRlbnYuYmF0ICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKK1NFVCBDTUFLRUFSR1M9XgorICAtRyclR0VORVJBVE9SJScgXgorICAtRENNQUtFX0JVSUxEX1RZUEU9JUNPTkZJR1VSQVRJT04lIF4KKyAgLURDTUFLRV9JTlNUQUxMX1BSRUZJWD0lSU5TVERJUiUgXgorICAtRENNQUtFX01BS0VfUFJPR1JBTT0vbWluZ3clTk9STV9QTEFURk9STSUvYmluL21pbmd3MzItbWFrZSBeCisgIC1EQ01BS0VfQ19DT01QSUxFUj0vbWluZ3clTk9STV9QTEFURk9STSUvYmluL2djYy5leGUgXgorICAtRENNQUtFX0NYWF9DT01QSUxFUj0vbWluZ3clTk9STV9QTEFURk9STSUvYmluL2crKy5leGUgXgorICAtRE9QRU5TU0xfUk9PVF9ESVI9L21pbmd3JU5PUk1fUExBVEZPUk0lIF4KKyAgLURXSVRIX1BZVEhPTj1PRkYgXgorICAtRFdJVEhfU0hBUkVEX0xJQj1PRkYgXgorICAtRFdJVEhfU1RBVElDX0xJQj1PTgorCitARUNITyBPTgorJUJBU0glIC1sYyAibWtkaXIgLXAgJUJVSUxERElSJSAmJiBjZCAlQlVJTERESVIlICYmIGNtYWtlLmV4ZSAlU1JDRElSJSAlQ01BS0VBUkdTJSAmJiBjbWFrZSAtLWJ1aWxkIC4gLS1jb25maWcgJUNPTkZJR1VSQVRJT04lIC0tdGFyZ2V0IGluc3RhbGwiIHx8IEVYSVQgL0IKK0BFQ0hPIE9GRgpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvTUlORy1hcHB2ZXlvci1pbnN0YWxsLmJhdCBiL2J1aWxkL2FwcHZleW9yL01JTkctYXBwdmV5b3ItaW5zdGFsbC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA2OWIwNQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL01JTkctYXBwdmV5b3ItaW5zdGFsbC5iYXQKQEAgLTAsMCArMSw0NSBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworOjoKKzo6IEFwcHZleW9yIGluc3RhbGwgc2NyaXB0IGZvciBNSU5HVyBvbiBNU1lTMgorOjogSW5zdGFsbHMgdGhpcmQgcGFydHkgcGFja2FnZXMgd2UgbmVlZCBmb3IgYSBjbWFrZSBidWlsZAorOjoKKworQEVDSE8gT0ZGCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCisKK0NEIGJ1aWxkXGFwcHZleW9yICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX2Jhbm5lcl9pbnN0YWxsLmJhdCAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zZXRlbnYuYmF0ICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfc2hvd2Vudi5iYXQgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKK1NFVCBQQUNLQUdFUz1eCisgIC0tbmVlZGVkIC1TIGJpc29uIGZsZXggbWFrZSBeCisgIG1pbmd3LXc2NC0lTUlOR1dQTEFUJS1ib29zdCBeCisgIG1pbmd3LXc2NC0lTUlOR1dQTEFUJS1jbWFrZSBeCisgIG1pbmd3LXc2NC0lTUlOR1dQTEFUJS1saWJldmVudCBeCisgIG1pbmd3LXc2NC0lTUlOR1dQTEFUJS1vcGVuc3NsIF4KKyAgbWluZ3ctdzY0LSVNSU5HV1BMQVQlLXRvb2xjaGFpbiBeCisgIG1pbmd3LXc2NC0lTUlOR1dQTEFUJS16bGliCisKKzo6bWluZ3ctdzY0LSVNSU5HV1BMQVQlLXF0NSA6IFdBWSB0b28gbGFyZ2UgKDFHQiBkb3dubG9hZCEpIC0gdGVzdGVkIGluIGN5Z3dpbiBidWlsZHMgYW55d2F5CisKKzo6IFJlbW92ZSBvbGQgcGFja2FnZXMgdGhhdCBubyBsb25nZXIgZXhpc3QgdG8gYXZvaWQgYW4gZXJyb3IKKyVCQVNIJSAtbGMgInBhY21hbiAtLW5vY29uZmlybSAtLXJlbW92ZSBsaWJjYXRnZXRzIGNhdGdldHMgfHwgdHJ1ZSIgfHwgRVhJVCAvQgorCis6OiBVcGdyYWRlIHRoaW5ncworJUJBU0glIC1sYyAicGFjbWFuIC0tbm9jb25maXJtIC1TeXUgJUlHTk9SRSUiICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCislQkFTSCUgLWxjICJwYWNtYW4gLS1ub2NvbmZpcm0gLVN1ICVJR05PUkUlIiAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKyVCQVNIJSAtbGMgInBhY21hbiAtLW5vY29uZmlybSAlUEFDS0FHRVMlIiAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL01JTkctYXBwdmV5b3ItdGVzdC5iYXQgYi9idWlsZC9hcHB2ZXlvci9NSU5HLWFwcHZleW9yLXRlc3QuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5OWMxZmYKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9hcHB2ZXlvci9NSU5HLWFwcHZleW9yLXRlc3QuYmF0CkBAIC0wLDAgKzEsMjIgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKK0BFQ0hPIE9GRgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorCitDRCBidWlsZFxhcHB2ZXlvciAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9iYW5uZXJfdGVzdC5iYXQgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfc2V0ZW52LmJhdCAgICAgICAgICAgICB8fCBFWElUIC9CCisKKyVCQVNIJSAtbGMgImNkICVCVUlMRERJUiUgJiYgY3Rlc3QuZXhlIC1DICVDT05GSUdVUkFUSU9OJSAtLXRpbWVvdXQgMzAwIC1WViAtRSAnJURJU0FCTEVEX1RFU1RTJSciIHx8IEVYSVQgL0IKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL01TVkMtYXBwdmV5b3ItYnVpbGQuYmF0IGIvYnVpbGQvYXBwdmV5b3IvTVNWQy1hcHB2ZXlvci1idWlsZC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRiOTJhMgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL01TVkMtYXBwdmV5b3ItYnVpbGQuYmF0CkBAIC0wLDAgKzEsNDcgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKK0BFQ0hPIE9GRgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorCitDRCBidWlsZFxhcHB2ZXlvciAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfYmFubmVyX2J1aWxkLmJhdCAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zZXRlbnYuYmF0ICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitNS0RJUiAiJUJVSUxERElSJSIgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NEICIlQlVJTERESVIlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorCitARUNITyBPTgorICBjbWFrZSAiJVNSQ0RJUiUiIF4KKyAgICAtRyIlR0VORVJBVE9SJSIgXgorCS1EQklTT05fRVhFQ1VUQUJMRT1DOlxQcm9ncmFtRGF0YVxjaG9jb2xhdGV5XGxpYlx3aW5mbGV4Ymlzb24zXHRvb2xzXHdpbl9iaXNvbi5leGUgXgorICAgIC1EQk9PU1RfUk9PVD0iJUJPT1NUX1JPT1QlIiBeCisgICAgLURCT09TVF9MSUJSQVJZRElSPSIlQk9PU1RfTElCUkFSWURJUiUiIF4KKyAgICAtRENNQUtFX0JVSUxEX1RZUEU9IiVDT05GSUdVUkFUSU9OJSIgXgorICAgIC1EQ01BS0VfSU5TVEFMTF9QUkVGSVg9IiVJTlNURElSJSIgXgorCS1ERkxFWF9FWEVDVVRBQkxFPUM6XFByb2dyYW1EYXRhXGNob2NvbGF0ZXlcbGliXHdpbmZsZXhiaXNvbjNcdG9vbHNcd2luX2ZsZXguZXhlIF4KKyAgICAtRElOVFRZUEVTX1JPT1Q9IiVXSU4zUCVcbXNpbnR0eXBlcyIgXgorICAgIC1ETElCRVZFTlRfUk9PVD0iJVdJTjNQJVxsaWJldmVudC0lTElCRVZFTlRfVkVSU0lPTiUtc3RhYmxlIiBeCisgICAgLURPUEVOU1NMX1JPT1RfRElSPSIlT1BFTlNTTF9ST09UJSIgXgorICAgIC1ET1BFTlNTTF9VU0VfU1RBVElDX0xJQlM9T0ZGIF4KKyAgICAtRFpMSUJfTElCUkFSWT0iJVdJTjNQJVx6bGliLWluc3RcbGliXHpsaWIlWkxJQl9MSUJfU1VGRklYJS5saWIiIF4KKyAgICAtRFpMSUJfUk9PVD0iJVdJTjNQJVx6bGliLWluc3QiIF4KKyAgICAtRFdJVEhfUFlUSE9OPSVXSVRIX1BZVEhPTiUgXgorICAgIC1EV0lUSF8lVEhSRUFETU9ERUwlVEhSRUFEUz1PTiBeCisgICAgLURXSVRIX1NIQVJFRF9MSUI9T0ZGIF4KKyAgICAtRFdJVEhfU1RBVElDX0xJQj1PTiAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQEVDSE8gT0ZGCisKK2NtYWtlIC0tYnVpbGQgLiBeCisgIC0tY29uZmlnICIlQ09ORklHVVJBVElPTiUiIF4KKyAgLS10YXJnZXQgSU5TVEFMTCAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvTVNWQy1hcHB2ZXlvci1pbnN0YWxsLmJhdCBiL2J1aWxkL2FwcHZleW9yL01TVkMtYXBwdmV5b3ItaW5zdGFsbC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk3M2QyOQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL01TVkMtYXBwdmV5b3ItaW5zdGFsbC5iYXQKQEAgLTAsMCArMSw1OSBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworOjoKKzo6IEFwcHZleW9yIGluc3RhbGwgc2NyaXB0IGZvciBNU1ZDCis6OiBJbnN0YWxscyAob3IgYnVpbGRzKSB0aGlyZCBwYXJ0eSBwYWNrYWdlcyB3ZSBuZWVkCis6OgorCitARUNITyBPRkYKK1NFVExPQ0FMIEVuYWJsZURlbGF5ZWRFeHBhbnNpb24KKworQ0QgYnVpbGRcYXBwdmV5b3IgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9iYW5uZXJfaW5zdGFsbC5iYXQgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zZXRlbnYuYmF0ICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zaG93ZW52LmJhdCAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorTUtESVIgIiVXSU4zUCUiICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorCitjaG9jbyBmZWF0dXJlIGVuYWJsZSAtbiBhbGxvd0dsb2JhbENvbmZpcm1hdGlvbiB8fCBFWElUIC9CCisKKzo6IFRoaW5ncyB0byBpbnN0YWxsIHdoZW4gTk9UIHJ1bm5pbmcgaW4gYXBwdmV5b3I6CitJRiAiJUFQUFZFWU9SX0JVSUxEX0lEJSIgPT0gIiIgKAorICAgIGN1cCAteSBjaG9jb2xhdGV5ICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorICAgIGNpbnN0IC15IGN1cmwgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorICAgIGNpbnN0IC15IDd6aXAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorICAgIGNpbnN0IC15IHB5dGhvbjMgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorICAgIGNpbnN0IC15IG9wZW5zc2wubGlnaHQgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorKQorCitjaW5zdCAteSBqZGs4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitjaW5zdCAteSB3aW5mbGV4Ymlzb24zICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKKzo6IHpsaWIgLSBub3QgYXZhaWxhYmxlIHRocm91Z2ggY2hvY29sYXRleQorQ0QgIiVBUFBWRVlPUl9TQ1JJUFRTJSIgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorY2FsbCBidWlsZC16bGliLmJhdCAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorCis6OiBsaWJldmVudCAtIG5vdCBhdmFpbGFibGUgdGhyb3VnaCBjaG9jb2xhdGV5CitDRCAiJUFQUFZFWU9SX1NDUklQVFMlIiAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitjYWxsIGJ1aWxkLWxpYmV2ZW50LmJhdCAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKKzo6IHB5dGhvbiBwYWNrYWdlcyAoY29ycmVjdCBwYXRoIHRvIHBpcCBzZXQgaW4gY2xfc2V0ZW52LmJhdCkKK3BpcC5leGUgXgorICAgIGluc3RhbGwgYmFja3BvcnRzLnNzbF9tYXRjaF9ob3N0bmFtZSBeCisgICAgICAgICAgICBpcGFkZHJlc3MgXgorICAgICAgICAgICAgc2l4IF4KKyAgICAgICAgICAgIHRvcm5hZG8gXgorICAgICAgICAgICAgdHdpc3RlZCAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorCitjaW5zdCAteSBnaGMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9NU1ZDLWFwcHZleW9yLXRlc3QuYmF0IGIvYnVpbGQvYXBwdmV5b3IvTVNWQy1hcHB2ZXlvci10ZXN0LmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTk0NTc5Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvTVNWQy1hcHB2ZXlvci10ZXN0LmJhdApAQCAtMCwwICsxLDMyIEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCitARUNITyBPTgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorQ0QgYnVpbGRcYXBwdmV5b3IgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfYmFubmVyX3Rlc3QuYmF0ICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX3NldGVudi5iYXQgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0QgIiVCVUlMRERJUiUiICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKworRElSIEM6XGxpYnJhcmllcworRElSIEM6XGxpYnJhcmllc1xib29zdF8xXzU5XzAKK0RJUiBDOlxsaWJyYXJpZXNcYm9vc3RfMV82MF8wCitESVIgQzpcbGlicmFyaWVzXGJvb3N0XzFfNjJfMAorRElSIEM6XGxpYnJhcmllc1xib29zdF8xXzYzXzAKK0RJUiBDOlxsaWJyYXJpZXNcYm9vc3RfMV82NF8wCisKKzo6IEFkZCBkaXJlY3RvcmllcyB0byB0aGUgcGF0aCB0byBmaW5kIERMTHMgb2YgdGhpcmQgcGFydHkgbGlicmFyaWVzIHNvIHRlc3RzIHJ1biBwcm9wZXJseSEKK1NFVCBQQVRIPSVCT09TVF9MSUJSQVJZRElSOi89XCU7JU9QRU5TU0xfUk9PVCVcYmluOyVXSU4zUCVcemxpYi1pbnN0XGJpbjslUEFUSCUKKworY3Rlc3QgLUMgJUNPTkZJR1VSQVRJT04lIC0tdGltZW91dCAzMDAgLVZWIC1FICIoJURJU0FCTEVEX1RFU1RTJSkiIHx8IEVYSVQgL0IKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL01TWVMtYXBwdmV5b3ItYnVpbGQuYmF0IGIvYnVpbGQvYXBwdmV5b3IvTVNZUy1hcHB2ZXlvci1idWlsZC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQwMTcyOQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL01TWVMtYXBwdmV5b3ItYnVpbGQuYmF0CkBAIC0wLDAgKzEsNDggQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKK0BFQ0hPIE9GRgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorCitDRCBidWlsZFxhcHB2ZXlvciAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfYmFubmVyX2J1aWxkLmJhdCAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zZXRlbnYuYmF0ICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKK1NFVCBCQVNIPUM6XG1zeXM2NFx1c3JcYmluXGJhc2gKK1NFVCBDTUFLRT0vYy9tc3lzNjQvbWluZ3c2NC9iaW4vY21ha2UuZXhlCisKK0BFQ0hPIE9OCitTRVQgQ01BS0VBUkdTPS1HXCIlR0VORVJBVE9SJVwiIF4KKyAgLURCb29zdF9ERUJVRz1PTiBeCisgIC1EQm9vc3RfTkFNRVNQQUNFPWxpYmJvb3N0IF4KKyAgLURCT09TVF9JTkNMVURFRElSPSVCT09TVF9JTkNMVURFRElSJSBeCisgIC1EQk9PU1RfTElCUkFSWURJUj0lQk9PU1RfTElCUkFSWURJUiUgXgorICAtRENNQUtFX0JVSUxEX1RZUEU9JUNPTkZJR1VSQVRJT04lIF4KKyAgLURDTUFLRV9DX0NPTVBJTEVSPWdjYy5leGUgXgorICAtRENNQUtFX0NYWF9DT01QSUxFUj1nKysuZXhlIF4KKyAgLURDTUFLRV9NQUtFX1BST0dSQU09bWFrZS5leGUgXgorICAtRENNQUtFX0lOU1RBTExfUFJFRklYPSVJTlNURElSX01TWVMlIF4KKyAgLURMSUJFVkVOVF9ST09UPSVMSUJFVkVOVF9ST09UJSBeCisgIC1ET1BFTlNTTF9MSUJSQVJJRVM9JU9QRU5TU0xfTElCUkFSSUVTJSBeCisgIC1ET1BFTlNTTF9ST09UX0RJUj0lT1BFTlNTTF9ST09UJSBeCisgIC1ET1BFTlNTTF9VU0VfU1RBVElDX0xJQlM9T04gXgorICAtRFdJVEhfQk9PU1RfU1RBVElDPU9OIF4KKyAgLURXSVRIX0pBVkE9T0ZGIF4KKyAgLURXSVRIX0xJQkVWRU5UPU9OIF4KKyAgLURXSVRIX1BZVEhPTj0lV0lUSF9QWVRIT04lIF4KKyAgLURXSVRIX1NIQVJFRF9MSUI9T0ZGIF4KKyAgLURXSVRIX1NUQVRJQ19MSUI9T04KKworJUJBU0glIC1sYyAibWtkaXIgJUJVSUxERElSX01TWVMlICYmIGNkICVCVUlMRERJUl9NU1lTJSAmJiAlQ01BS0UlICVTUkNESVJfTVNZUyUgJUNNQUtFQVJHUyUgJiYgJUNNQUtFJSAtLWJ1aWxkIC4gLS1jb25maWcgJUNPTkZJR1VSQVRJT04lIC0tdGFyZ2V0IGluc3RhbGwiIHx8IEVYSVQgL0IKK0BFQ0hPIE9GRgpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvTVNZUy1hcHB2ZXlvci1pbnN0YWxsLmJhdCBiL2J1aWxkL2FwcHZleW9yL01TWVMtYXBwdmV5b3ItaW5zdGFsbC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgxOGRmMwotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL01TWVMtYXBwdmV5b3ItaW5zdGFsbC5iYXQKQEAgLTAsMCArMSw0OCBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworOjoKKzo6IEFwcHZleW9yIGluc3RhbGwgc2NyaXB0IGZvciBNU1lTCis6OiBJbnN0YWxscyAob3IgYnVpbGRzKSB0aGlyZCBwYXJ0eSBwYWNrYWdlcyB3ZSBuZWVkCis6OgorCitARUNITyBPRkYKK1NFVExPQ0FMIEVuYWJsZURlbGF5ZWRFeHBhbnNpb24KKworQ0QgYnVpbGRcYXBwdmV5b3IgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfYmFubmVyX2luc3RhbGwuYmF0ICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX3NldGVudi5iYXQgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zaG93ZW52LmJhdCAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKworOjogV2UncmUgZ29pbmcgdG8ga2VlcCBib29zdCBhdCBhIHZlcnNpb24gY21ha2UgdW5kZXJzdGFuZHMKK1NFVCBCT09TVFBLRz1taW5ndy13NjQteDg2XzY0LWJvb3N0LTEuNjQuMC0zLWFueS5wa2cudGFyLnh6CitTRVQgSUdOT1JFPS0taWdub3JlIG1pbmd3LXc2NC14ODZfNjQtYm9vc3QKKworU0VUIFBBQ0tBR0VTPV4KKyAgLS1uZWVkZWQgLVMgYmlzb24gZmxleCBtYWtlIF4KKyAgbWluZ3ctdzY0LXg4Nl82NC1jbWFrZSBeCisgIG1pbmd3LXc2NC14ODZfNjQtbGliZXZlbnQgXgorICBtaW5ndy13NjQteDg2XzY0LW9wZW5zc2wgXgorICBtaW5ndy13NjQteDg2XzY0LXRvb2xjaGFpbiBeCisgIG1pbmd3LXc2NC14ODZfNjQtemxpYgorCislQkFTSCUgLWxjICJwYWNtYW4gLS1ub2NvbmZpcm0gLVN5dSAlSUdOT1JFJSIgfHwgRVhJVCAvQgorJUJBU0glIC1sYyAicGFjbWFuIC0tbm9jb25maXJtIC1TdSAlSUdOT1JFJSIgIHx8IEVYSVQgL0IKKyVCQVNIJSAtbGMgInBhY21hbiAtLW5vY29uZmlybSAlUEFDS0FHRVMlIiAgICB8fCBFWElUIC9CCisKKzo6IEluc3RhbGwgYSBzbGlnaHRseSBvbGRlciBib29zdCAoMS42NC4wKSBhcyBjbWFrZSAzLjEwCis6OiBkb2VzIG5vdCBoYXZlIGJ1aWx0LWluIGRlcGVuZGVuY2llcyBmb3IgYm9vc3QgMS42Ni4wIHlldAorOjogLS0gdGhpcyBjdXRzIGRvd24gb24gYnVpbGQgd2FybmluZyBvdXRwdXQgLS0KKyVCQVNIJSAtbGMgIndnZXQgaHR0cDovL3JlcG8ubXN5czIub3JnL21pbmd3L3g4Nl82NC8lQk9PU1RQS0clICYmIHBhY21hbiAtLW5vY29uZmlybSAtLW5lZWRlZCAtVSAlQk9PU1RQS0clICYmIHJtICVCT09TVFBLRyUiIHx8IEVYSVQgL0IKKwpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvTVNZUy1hcHB2ZXlvci10ZXN0LmJhdCBiL2J1aWxkL2FwcHZleW9yL01TWVMtYXBwdmV5b3ItdGVzdC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYzN2VjNQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL01TWVMtYXBwdmV5b3ItdGVzdC5iYXQKQEAgLTAsMCArMSwyNiBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworQEVDSE8gT0ZGCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCisKK0NEIGJ1aWxkXGFwcHZleW9yICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX2Jhbm5lcl90ZXN0LmJhdCAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zZXRlbnYuYmF0ICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NEICIlQlVJTERESVIlIiAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKKzo6IHJhbmRvbWx5IGZhaWxzIG9uIG1pbmd3OyBzZWUgSmlyYSBUSFJJRlQtNDEwNgorU0VUIERJU0FCTEVEX1RFU1RTPWNvbmN1cnJlbmN5X3Rlc3QKKworJUJBU0glIC1sYyAiY2QgJUJVSUxERElSX01TWVMlICYmIGN0ZXN0LmV4ZSAtQyAlQ09ORklHVVJBVElPTiUgLS10aW1lb3V0IDMwMCAtVlYgLUUgJyglRElTQUJMRURfVEVTVFMlKSciIHx8IEVYSVQgL0IKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL1JFQURNRS5tZCBiL2J1aWxkL2FwcHZleW9yL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTJhYTMwCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMzQgQEAKKzwhLS0tCitMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKK3lvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KK1lvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKyMgQXBwdmV5b3IgQnVpbGQKKworQXBwdmV5b3IgaXMgY2FwYWJsZSBvZiBidWlsZGluZyBNU1ZDIDIwMTAgdGhyb3VnaCAyMDE1IGFzIHdlbGwgYXMKK2hhdmluZyB0aGUgbGF0ZXN0IE1TWVMyL01pbkdXIDY0LWJpdCBlbnZpcm9ubWVudC4gIEl0IGhhcyBtYW55IHZlcnNpb25zCitvZiBib29zdCBhbmQgcHl0aG9uIGluc3RhbGxlZCBhcyB3ZWxsLiAgU2VlIHdoYXQgYXBwdmV5b3IgaGFzCitbaW5zdGFsbGVkIG9uIGJ1aWxkIHdvcmtlcnNdKGh0dHBzOi8vd3d3LmFwcHZleW9yLmNvbS9kb2NzL2luc3RhbGxlZC1zb2Z0d2FyZS8pLgorCitXZSBydW4gYSBtYXRyaXggYnVpbGQgb24gQXBwdmV5b3IgYW5kIGJ1aWxkIHRoZSBmb2xsb3dpbmcgY29tYmluYXRpb25zOgorCisqIE1pbkdXIHg2NCAoZ2NjIDYuMy4wKQorKiBNU1ZDIDIwMTAgeDg2LCBhbiBvbGRlciBib29zdCwgYW4gb2xkZXIgcHl0aG9uCisqIE1TVkMgMjAxNSB4ODYveDY0LCB0aGUgbGF0ZXN0IGJvb3N0LCB0aGUgbGF0ZXN0IHB5dGhvbgorKiBNU1lTMiB4NjQgKGdjYyA2LjMuMCkgLSB0aGlzIGlzIGEgd29yayBpbiBwcm9ncmVzcworCitUaGUgQXBwdmV5b3Igc2NyaXB0IHRha2VzIHRoZSBmaXJzdCBmb3VyIGxldHRlcnMgZnJvbSB0aGUgUFJPRklMRSBzcGVjaWZpZWQgaW4KK3RoZSBlbnZpcm9ubWVudCBzdGFuemEgYW5kIHJ1bnMgdGhlc2Ugc2NyaXB0cyBpbiBvcmRlcjoKKworPz8/Py1hcHB2ZXlvci1pbnN0YWxsLmJhdCB3aWxsIGluc3RhbGwgdGhpcmQgcGFydHkgbGlicmFyaWVzIGFuZCBzZXQgdXAgdGhlIGVudmlyb25tZW50Cis/Pz8/LWFwcHZleW9yLWJ1aWxkLmJhdCB3aWxsIGJ1aWxkIHdpdGggY21ha2UKKz8/Pz8tYXBwdmV5b3ItdGVzdC5iYXQgd2lsbCBydW4gY3Rlc3QKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL2J1aWxkLWxpYmV2ZW50LmJhdCBiL2J1aWxkL2FwcHZleW9yL2J1aWxkLWxpYmV2ZW50LmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGI2MzViCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvYnVpbGQtbGliZXZlbnQuYmF0CkBAIC0wLDAgKzEsMzcgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKK1NFVExPQ0FMIEVuYWJsZURlbGF5ZWRFeHBhbnNpb24KKworU0VUIFVSTEZJTEU9bGliZXZlbnQtJUxJQkVWRU5UX1ZFUlNJT04lLXN0YWJsZS50YXIuZ3oKK1NFVCBVUkw9aHR0cHM6Ly9naXRodWIuY29tL2xpYmV2ZW50L2xpYmV2ZW50L3JlbGVhc2VzL2Rvd25sb2FkL3JlbGVhc2UtJUxJQkVWRU5UX1ZFUlNJT04lLXN0YWJsZS8lVVJMRklMRSUKKworOjogRG93bmxvYWQgLSBzdXBwb3J0IHJ1bm5pbmcgYSBsb2NhbCBidWlsZCBvciBhIGJ1aWxkIGluIGFwcHZleW9yCitDRCAiJVdJTjNQJSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorSUYgIiVBUFBWRVlPUl9CVUlMRF9JRCUiID09ICIiICgKKyAgICBjdXJsIC1MIC1mIC1vICIlVVJMRklMRSUiICIlVVJMJSIKKykgRUxTRSAoCisgICAgYXBwdmV5b3IgRG93bmxvYWRGaWxlICIlVVJMJSIKKykKKzd6IHggIiVVUkxGSUxFJSIgLXNvIHwgN3ogeCAtc2kgLXR0YXIgPiBudWwgICAgICB8fCBFWElUIC9CCitDRCAibGliZXZlbnQtJUxJQkVWRU5UX1ZFUlNJT04lLXN0YWJsZSIgICAgICAgICAgfHwgRVhJVCAvQgorbm1ha2UgLWYgTWFrZWZpbGUubm1ha2Ugc3RhdGljX2xpYnMgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKworOjogaW4gbGliZXZlbnQgMi4wIHRoZXJlIGlzIG5vIG5tYWtlIHN1YmRpcmVjdG9yeSBpbiBXSU4zMi1Db2RlLCBidXQgaW4gMi4xIHRoZXJlIGlzCitta2RpciBsaWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorbW92ZSAqLmxpYiBsaWJcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK21vdmUgV0lOMzItQ29kZVxldmVudDJcKiBpbmNsdWRlXGV2ZW50MlwgICAgICAgICB8fCBtb3ZlIFdJTjMyLUNvZGVcbm1ha2VcZXZlbnQyXCogaW5jbHVkZVxldmVudDJcIHx8IEVYSVQgL0IKK21vdmUgKi5oIGluY2x1ZGVcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKK0VORExPQ0FMCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9idWlsZC16bGliLmJhdCBiL2J1aWxkL2FwcHZleW9yL2J1aWxkLXpsaWIuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxOTU3MjYKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9hcHB2ZXlvci9idWlsZC16bGliLmJhdApAQCAtMCwwICsxLDU2IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCisKK1NFVCBQQUNLQUdFPXpsaWItJVpMSUJfVkVSU0lPTiUKK1NFVCBCVUlMRERJUj0lV0lOM1AlXHpsaWItYnVpbGQKK1NFVCBJTlNURElSPSVXSU4zUCVcemxpYi1pbnN0CitTRVQgU1JDRElSPSVXSU4zUCVcJVBBQ0tBR0UlCitTRVQgVVJMRklMRT0lUEFDS0FHRSUudGFyLmd6CisKKzo6IFRoaXMgYWxsb3dzIHVzIHRvIHRvbGVyYXRlIHdoZW4gdGhlIGN1cnJlbnQgdmVyc2lvbiBpcyBhcmNoaXZlZAorU0VUIFVSTD1odHRwOi8vemxpYi5uZXQvJVVSTEZJTEUlCitTRVQgRlVSTD1odHRwOi8vemxpYi5uZXQvZm9zc2lscy8lVVJMRklMRSUKKworOjogRG93bmxvYWQgLSBzdXBwb3J0IHJ1bm5pbmcgYSBsb2NhbCBidWlsZCBvciBhIGJ1aWxkIGluIGFwcHZleW9yCitDRCAiJVdJTjNQJSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0lGICIlQVBQVkVZT1JfQlVJTERfSUQlIiA9PSAiIiAoCisgICAgY3VybCAtTCAtZiAtbyAiJVVSTEZJTEUlIiAiJVVSTCUiCisgICAgSUYgRVJST1JMRVZFTCAxICgKKyAgICAgICAgY3VybCAtTCAtZiAtbyAiJVVSTEZJTEUlIiAiJUZVUkwlIgorICAgICkKKykgRUxTRSAoCisgICAgYXBwdmV5b3IgRG93bmxvYWRGaWxlICIlVVJMJSIKKyAgICBJRiBFUlJPUkxFVkVMIDEgKAorICAgICAgICBhcHB2ZXlvciBEb3dubG9hZEZpbGUgIiVGVVJMJSIgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisgICAgKQorKQorN3ogeCAiJVVSTEZJTEUlIiAtc28gfCA3eiB4IC1zaSAtdHRhciA+IG51bCAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKKzo6IEdlbmVyYXRlCitNS0RJUiAiJUJVSUxERElSJSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NEICIlQlVJTERESVIlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorY21ha2UgIiVTUkNESVIlIiBeCisgICAgICAtRyJOTWFrZSBNYWtlZmlsZXMiIF4KKyAgICAgIC1EQ01BS0VfSU5TVEFMTF9QUkVGSVg9IiVJTlNURElSJSIgXgorICAgICAgLURDTUFLRV9CVUlMRF9UWVBFPSIlQ09ORklHVVJBVElPTiUiICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKKzo6IEJ1aWxkCitubWFrZSAvZk1ha2VmaWxlIGluc3RhbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0lGICIlQ09ORklHVVJBVElPTiUiID09ICJEZWJ1ZyIgKAorICAgIENPUFkgIiVCVUlMRERJUiVcemxpYmQucGRiIiAiJUlOU1RESVIlXGJpblwiICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCispCisKK0VORExPQ0FMCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9jbF9iYW5uZXJfYXBhY2hlX3RocmlmdC5iYXQgYi9idWlsZC9hcHB2ZXlvci9jbF9iYW5uZXJfYXBhY2hlX3RocmlmdC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhmMmEyYQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL2NsX2Jhbm5lcl9hcGFjaGVfdGhyaWZ0LmJhdApAQCAtMCwwICsxLDI0IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCis6OiBBIHZpc3VhbCBpbmRpY2F0b3IgaW4gYSBsYXJnZSBsb2cgaGVscHMgeW91IGxvY2F0ZSB0aGluZ3Mgd2hlbiBzY2FubmluZworOjogaHR0cDovL3d3dy5wYXRvcmprLmNvbS9zb2Z0d2FyZS90YWFnLyNwPWRpc3BsYXkmZj1TbWFsbCUyMFNsYW50JnQ9QXBhY2hlJTIwVGhyaWZ0CisKK0VDSE8vCitFQ0hPICAgIF9fXyAgICAgICAgICAgICAgICAgX18gICAgICAgICBfX19fX19fXyAgICAgICBfIF9fX19fCitFQ0hPICAgLyBfIHwgX19fICBfX18gX19fX18vIC8gIF9fXyAgIC9fICBfXy8gLyAgX19fXyhfKSBfLyAvXworRUNITyAgLyBfXyB8LyBfIFwvIF8gYC8gX18vIF8gXC8gLV8pICAgLyAvIC8gXyBcLyBfXy8gLyBfLyBfXy8KK0VDSE8gL18vIHxfLyAuX18vXF8sXy9cX18vXy8vXy9cX18vICAgL18vIC9fLy9fL18vIC9fL18vIFxfXy8KK0VDSE8gICAgICAvXy8KK0VDSE8vCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9jbF9iYW5uZXJfYnVpbGQuYmF0IGIvYnVpbGQvYXBwdmV5b3IvY2xfYmFubmVyX2J1aWxkLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDI3MmYzCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvY2xfYmFubmVyX2J1aWxkLmJhdApAQCAtMCwwICsxLDIzIEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCis6OiBBIHZpc3VhbCBpbmRpY2F0b3IgaW4gYSBsYXJnZSBsb2cgaGVscHMgeW91IGxvY2F0ZSB0aGluZ3Mgd2hlbiBzY2FubmluZworOjogaHR0cDovL3d3dy5wYXRvcmprLmNvbS9zb2Z0d2FyZS90YWFnLyNwPWRpc3BsYXkmZj1TbWFsbCUyMFNsYW50JnQ9QnVpbGQKKworRUNITy8KK0VDSE8gICAgX19fICAgICAgIF8gX18gICBfXworRUNITyAgIC8gXyApX18gX18oXykgL19fLyAvCitFQ0hPICAvIF8gIC8gLy8gLyAvIC8gXyAgLyAgICAgQEBAIEJVSUxECitFQ0hPIC9fX19fL1xfLF8vXy9fL1xfLF8vCitFQ0hPLwpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvY2xfYmFubmVyX2luc3RhbGwuYmF0IGIvYnVpbGQvYXBwdmV5b3IvY2xfYmFubmVyX2luc3RhbGwuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZTNkYTIKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9hcHB2ZXlvci9jbF9iYW5uZXJfaW5zdGFsbC5iYXQKQEAgLTAsMCArMSwyMyBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworOjogQSB2aXN1YWwgaW5kaWNhdG9yIGluIGEgbGFyZ2UgbG9nIGhlbHBzIHlvdSBsb2NhdGUgdGhpbmdzIHdoZW4gc2Nhbm5pbmcKKzo6IGh0dHA6Ly93d3cucGF0b3Jqay5jb20vc29mdHdhcmUvdGFhZy8jcD1kaXNwbGF5JmY9U21hbGwlMjBTbGFudCZ0PUluc3RhbGwKKworRUNITy8KK0VDSE8gICAgX19fXyAgICAgICAgIF9fICAgICAgIF9fX18KK0VDSE8gICAvICBfL19fICBfX18gLyAvX19fXyBfLyAvIC8KK0VDSE8gIF8vIC8vIF8gXChfLV48LyBfXy8gXyBcLyAvIC8gICAgIEBAQCBJTlNUQUxMCitFQ0hPIC9fX18vXy8vXy9fX18vXF9fL1xfLF8vXy9fLworRUNITy8KZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL2NsX2Jhbm5lcl90ZXN0LmJhdCBiL2J1aWxkL2FwcHZleW9yL2NsX2Jhbm5lcl90ZXN0LmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGUyZDEwCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvY2xfYmFubmVyX3Rlc3QuYmF0CkBAIC0wLDAgKzEsMjMgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKKzo6IEEgdmlzdWFsIGluZGljYXRvciBpbiBhIGxhcmdlIGxvZyBoZWxwcyB5b3UgbG9jYXRlIHRoaW5ncyB3aGVuIHNjYW5uaW5nCis6OiBodHRwOi8vd3d3LnBhdG9yamsuY29tL3NvZnR3YXJlL3RhYWcvI3A9ZGlzcGxheSZmPVNtYWxsJTIwU2xhbnQmdD1UZXN0CisKK0VDSE8vCitFQ0hPICBfX19fX18gICAgICAgIF9fCitFQ0hPIC9fICBfXy9fXyBfX18gLyAvXworRUNITyAgLyAvIC8gLV9efF8tXjwvIF9fLyAgICAgQEBAIFRFU1QKK0VDSE8gL18vICBcX18vX19fL1xfXy8KK0VDSE8vCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9jbF9zZXRjb21waWxlci5iYXQgYi9idWlsZC9hcHB2ZXlvci9jbF9zZXRjb21waWxlci5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMzZmZjNQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL2NsX3NldGNvbXBpbGVyLmJhdApAQCAtMCwwICsxLDYzIEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCis6OgorOjogRGV0ZWN0IHRoZSBjb21waWxlciBlZGl0aW9uIHdlJ3JlIGJ1aWxkaW5nIGluLgorOjogU2V0IHRoZSBDT01QSUxFUiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBvbmUgb2Y6Cis6OiAgIGdjYyAgID0gTWluR1cgLyBNU1lTMiBhbmQgZ2NjIHRvb2xjaGFpbgorOjogICB2YzEwMCA9IFZpc3VhbCBTdHVkaW8gMjAxMAorOjogICB2YzExMCA9IFZpc3VhbCBTdHVkaW8gMjAxMgorOjogICB2YzEyMCA9IFZpc3VhbCBTdHVkaW8gMjAxMworOjogICB2YzE0MCA9IFZpc3VhbCBTdHVkaW8gMjAxNQorOjogICB2YzE0MSA9IFZpc3VhbCBTdHVkaW8gMjAxNworOjoKKzo6IEhvbm9ycyBhbnkgZXhpc3RpbmcgQ09NUElMRVIgZW52aXJvbm1lbnQgdmFyaWFibGUKKzo6ICAgc2V0dGluZyBpbnN0ZWFkIG9mIG92ZXJ3cml0aW5nIGl0LCB0byBhbGxvdyBpdAorOjogICB0byBiZSBmb3JjZWQgaWYgbmVlZGVkLgorOjoKKzo6IFNldHMgRVJST1JMRVZFTCB0byAwIGlmIENPTVBJTEVSIGNhbiBiZSBkZXRlcm1pbmVkLAorOjogICAgICAgICAgICAgICAgIHRvIDEgaWYgaXQgY2Fubm90LgorOjoKKworSUYgREVGSU5FRCBDT01QSUxFUiAoCisgIEVDSE8gW3dhcm4gXSB1c2luZyBleGlzdGluZyBlbnZpcm9ubWVudCB2YXJpYWJsZSBDT01QSUxFUgorICBFWElUIC9CIDAKKykKKworSUYgTk9UICIlUFJPRklMRTp+MCw0JSIgPT0gIk1TVkMiICgKKyAgU0VUIENPTVBJTEVSPWdjYworKSBFTFNFICgKKyAgQ0FMTCA6Q0hFQ0sgMTYKKyAgSUYgIUVSUk9STEVWRUwhID09IDAgKFNFVCBDT01QSUxFUj12YzEwMCkKKyAgQ0FMTCA6Q0hFQ0sgMTcKKyAgSUYgIUVSUk9STEVWRUwhID09IDAgKFNFVCBDT01QSUxFUj12YzExMCkKKyAgQ0FMTCA6Q0hFQ0sgMTgKKyAgSUYgIUVSUk9STEVWRUwhID09IDAgKFNFVCBDT01QSUxFUj12YzEyMCkKKyAgQ0FMTCA6Q0hFQ0sgMTkuMAorICBJRiAhRVJST1JMRVZFTCEgPT0gMCAoU0VUIENPTVBJTEVSPXZjMTQwKQorICBDQUxMIDpDSEVDSyAxOS4xCisgIElGICFFUlJPUkxFVkVMISA9PSAwIChTRVQgQ09NUElMRVI9dmMxNDEpCispCisKK0lGIE5PVCBERUZJTkVEIENPTVBJTEVSICgKKyAgRUNITyBbZXJyb3JdIHVuYWJsZSB0byBkZXRlcm1pbmUgdGhlIGNvbXBpbGVyIGVkaXRpb24KKyAgRVhJVCAvQiAxCispCisKK0VDSE8gW2luZm8gXSBkZXRlY3RlZCBjb21waWxlciBlZGl0aW9uICAgICVDT01QSUxFUiUKK0VYSVQgL0IgMAorCis6Q0hFQ0sKK2NsIC8/IDI+JjEgfCBmaW5kc3RyIC9DOiJWZXJzaW9uICUxJSIgPiBudWwKK0VYSVQgL0IKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL2NsX3NldGVudi5iYXQgYi9idWlsZC9hcHB2ZXlvci9jbF9zZXRlbnYuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMzM2NmQKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9hcHB2ZXlvci9jbF9zZXRlbnYuYmF0CkBAIC0wLDAgKzEsMTIxIEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCitARUNITyBPRkYKKworSUYgIiVQUk9GSUxFJSIgPT0gIk1TVkMyMDEyIiAoCisgIENBTEwgIkM6XFByb2dyYW0gRmlsZXMgKHg4NilcTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gMTEuMFxWQ1x2Y3ZhcnNhbGwuYmF0IiAlUExBVEZPUk0lCispIEVMU0UgSUYgIiVQUk9GSUxFJSIgPT0gIk1TVkMyMDEzIiAoCisgIENBTEwgIkM6XFByb2dyYW0gRmlsZXMgKHg4NilcTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gMTIuMFxWQ1x2Y3ZhcnNhbGwuYmF0IiAlUExBVEZPUk0lCispIEVMU0UgSUYgIiVQUk9GSUxFJSIgPT0gIk1TVkMyMDE1IiAoCisgIENBTEwgIkM6XFByb2dyYW0gRmlsZXMgKHg4NilcTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gMTQuMFxWQ1x2Y3ZhcnNhbGwuYmF0IiAlUExBVEZPUk0lCispIEVMU0UgSUYgIiVQUk9GSUxFJSIgPT0gIk1TVkMyMDE3IiAoCisgIENBTEwgOlNFVFVQTkVXRVJNU1ZDICAgIHx8IEVYSVQgL0IKKykgRUxTRSBJRiAiJVBST0ZJTEUlIiA9PSAiTUlOR1ciICgKKyAgUkVNIFN1cHBvcnRlZCwgbm90aGluZyBzcGVjaWFsIHRvIGRvIGhlcmUuCispIEVMU0UgSUYgIiVQUk9GSUxFJSIgPT0gIkNZR1dJTiIgKAorICBSRU0gU3VwcG9ydGVkLCBub3RoaW5nIHNwZWNpYWwgdG8gZG8gaGVyZS4KKykgRUxTRSAoCisgIEVDSE8gVW5zdXBwb3J0ZWQgUFJPRklMRT0lUFJPRklMRSUgb3IgUExBVEZPUk09JVBMQVRGT1JNJQorICBFWElUIC9CIDEKKykKKworQ0FMTCBjbF9zZXRjb21waWxlci5iYXQgICB8fCBFWElUIC9CCitDQUxMIGNsX3NldGdlbmVyYXRvci5iYXQgIHx8IEVYSVQgL0IKKworU0VUIEFQUFZFWU9SX1NDUklQVFM9JUFQUFZFWU9SX0JVSUxEX0ZPTERFUiVcYnVpbGRcYXBwdmV5b3IKK1NFVCBCVUlMRERJUj0lQVBQVkVZT1JfQlVJTERfRk9MREVSJVwuLlxidWlsZFwlUFJPRklMRSVcJVBMQVRGT1JNJQorU0VUIElOU1RESVI9JUFQUFZFWU9SX0JVSUxEX0ZPTERFUiVcLi5cYnVpbGRcJVBST0ZJTEUlXCVQTEFURk9STSUKK1NFVCBTUkNESVI9JUFQUFZFWU9SX0JVSUxEX0ZPTERFUiUKKworOjogUExBVEZPUk0gaXMgeDY0IG9yIHg4NgorOjogTk9STV9QTEFURk9STSBpcyA2NCBvciAzMgorU0VUIE5PUk1fUExBVEZPUk09JVBMQVRGT1JNOn4tMiwyJQorSUYgIiVOT1JNX1BMQVRGT1JNJSIgPT0gIjg2IiAoU0VUIE5PUk1fUExBVEZPUk09MzIpCisKK0lGICIlUFJPRklMRTp+MCw0JSIgPT0gIk1TVkMiICgKKworICA6OiBGaW5kQm9vc3QgbmVlZHMgZm9yd2FyZCBzbGFzaGVzIHNvIGNtYWtlIGRvZXNuJ3Qgc2VlIHNvbWV0aGluZyBhcyBhbiBlc2NhcGVkIGNoYXJhY3RlcgorICBTRVQgQk9PU1RfUk9PVD1DOi9MaWJyYXJpZXMvYm9vc3RfJUJPT1NUX1ZFUlNJT046Lj1fJQorICBTRVQgQk9PU1RfTElCUkFSWURJUj0hQk9PU1RfUk9PVCEvbGliJU5PUk1fUExBVEZPUk0lLW1zdmMtJUNPTVBJTEVSOn4tMywyJS4lQ09NUElMRVI6fi0xLDElCisgIFNFVCBPUEVOU1NMX1JPT1Q9QzpcT3BlblNTTC1XaW4lTk9STV9QTEFURk9STSUKKyAgU0VUIFdJTjNQPSVBUFBWRVlPUl9CVUlMRF9GT0xERVIlXHRoaXJkcGFydHkKKworICBTRVQgVEhSRUFETU9ERUw9U1RECisKKyAgSUYgIiVQWVRIT05fVkVSU0lPTiUiID09ICIiICgKKyAgICBTRVQgV0lUSF9QWVRIT049T0ZGCisgICkgRUxTRSAoCisgICAgU0VUIFdJVEhfUFlUSE9OPU9OCisgICAgSUYgL2kgIiVQTEFURk9STSUiID09ICJ4NjQiIFNFVCBQVEVYVD0teDY0CisgICAgU0VUIFBBVEg9QzpcUHl0aG9uJVBZVEhPTl9WRVJTSU9OOi49JSFQVEVYVCFcc2NyaXB0cztDOlxQeXRob24lUFlUSE9OX1ZFUlNJT046Lj0lIVBURVhUITshUEFUSCEKKyAgKQorICBJRiAiJUNPTkZJR1VSQVRJT04lIiA9PSAiRGVidWciIChTRVQgWkxJQl9MSUJfU1VGRklYPWQpCisKKyAgSUYgTk9UICIlUVRfVkVSU0lPTiUiID09ICIiICgKKyAgICBJRiAvaSAiJVBMQVRGT1JNJSIgPT0gIng2NCIgU0VUIFFURVhUPV82NAorICAgIFNFVCBQQVRIPUM6XFF0XCVRVF9WRVJTSU9OJVwlUFJPRklMRSUhUVRFWFQhXGJpbjshUEFUSCEKKyAgKQorCispIEVMU0UgSUYgIiVQUk9GSUxFOn4wLDQlIiA9PSAiTUlORyIgKAorCisgIDo6IFBMQVRGT1JNID0geDg2IG1lYW5zIE1JTkdXUExBVCBpNjg2CisgIDo6IFBMQVRGT1JNID0geDY0IG1lYW5zIE1JTkdXUExBVCB4ODZfNjQKKyAgU0VUIE1JTkdXUExBVD14ODZfNjQKKyAgSUYgIiVQTEFURk9STSUiID09ICJ4ODYiIChTRVQgTUlOR1dQTEFUPWk2ODYpCisKKyAgU0VUIEJBU0g9QzpcbXN5czY0XHVzclxiaW5cYmFzaC5leGUKKyAgIUJBU0ghIC1sYyAic2VkIC1pICcvZXhwb3J0IFBBVEg9XC9taW5ndzMyXC9iaW4vZCcgfi8uYmFzaF9wcm9maWxlICYmIHNlZCAtaSAnL2V4cG9ydCBQQVRIPVwvbWluZ3c2NFwvYmluL2QnIH4vLmJhc2hfcHJvZmlsZSAmJiBlY2hvICdleHBvcnQgUEFUSD0vbWluZ3clTk9STV9QTEFURk9STSUvYmluOiRQQVRIJyA+PiB+Ly5iYXNoX3Byb2ZpbGUiIHx8IEVYSVQgL0IKKworICBTRVQgQlVJTERESVI9JUJVSUxERElSOlw9LyUKKyAgU0VUIEJVSUxERElSPS9jIUJVSUxERElSOn4yIQorICBTRVQgSU5TVERJUj0lSU5TVERJUjpcPS8lCisgIFNFVCBJTlNURElSPS9jIUlOU1RESVI6fjIhCisgIFNFVCBTUkNESVI9JVNSQ0RJUjpcPS8lCisgIFNFVCBTUkNESVI9L2MhU1JDRElSOn4yIQorCispIEVMU0UgSUYgIiVQUk9GSUxFOn4wLDQlIiA9PSAiQ1lHVyIgKAorCisgIFNFVCBDWUdXSU5ST09UPUM6XGN5Z3dpbgorICBJRiAiJVBMQVRGT1JNJSIgPT0gIng2NCIgKFNFVCBDWUdXSU5ST09UPSFDWUdXSU5ST09UITY0KQorCisgIFNFVCBCQVNIPSFDWUdXSU5ST09UIVxiaW5cYmFzaC5leGUKKyAgU0VUIFNFVFVQPSFDWUdXSU5ST09UIVxzZXR1cC14ODYKKyAgSUYgIiVQTEFURk9STSUiID09ICJ4NjQiIChTRVQgU0VUVVA9IVNFVFVQIV82NCkKKyAgU0VUIFNFVFVQPSFTRVRVUCEuZXhlCisKKyAgU0VUIEJVSUxERElSPSVCVUlMRERJUjpcPS8lCisgIFNFVCBCVUlMRERJUj0vY3lnZHJpdmUvYyFCVUlMRERJUjp+MiEKKyAgU0VUIElOU1RESVI9JUlOU1RESVI6XD0vJQorICBTRVQgSU5TVERJUl9DWUc9L2N5Z2RyaXZlL2MhSU5TVERJUjp+MiEKKyAgU0VUIFNSQ0RJUj0lU1JDRElSOlw9LyUKKyAgU0VUIFNSQ0RJUj0vY3lnZHJpdmUvYyFTUkNESVI6fjIhCisKKykKKworR09UTyA6RU9GCisKKzpTRVRVUE5FV0VSTVNWQworICBGT1IgL0YgIlVTRUJBQ0tRIFRPS0VOUz0qIiAlJWkgSU4gKGBjYWxsICIlUHJvZ3JhbUZpbGVzKHg4NiklXE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvXEluc3RhbGxlclx2c3doZXJlLmV4ZSIgLXZlcnNpb24gIlsxNS4wLDE2LjApIiAtcHJvcGVydHkgaW5zdGFsbGF0aW9uUGF0aGApIERPICgKKyAgICBJRiAiJU1TVkNST09UJSIgPT0gIiIgKFNFVCBNU1ZDUk9PVD0lJWkpCisgICkKKyAgU0VUIE1TVkNQTEFUPXg4NgorICBJRiAiJVBMQVRGT1JNJSIgPT0gIng2NCIgKFNFVCBNU1ZDUExBVD1hbWQ2NCkKKworICBTRVQgQ1VSUkVOVERJUj0lQ0QlCisgIENBTEwgIiFNU1ZDUk9PVCFcQ29tbW9uN1xUb29sc1xWc0RldkNtZC5iYXQiIC1hcmNoPSFNU1ZDUExBVCEgfHwgRVhJVCAvQgorICBDRCAlQ1VSUkVOVERJUiUKKyAgRVhJVCAvQgorCis6RU9GCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9jbF9zZXRnZW5lcmF0b3IuYmF0IGIvYnVpbGQvYXBwdmV5b3IvY2xfc2V0Z2VuZXJhdG9yLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWI2ZmYzCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvY2xfc2V0Z2VuZXJhdG9yLmJhdApAQCAtMCwwICsxLDc5IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCis6OgorOjogRGV0ZWN0IHRoZSBjb21waWxlciBlZGl0aW9uIHdlJ3JlIGJ1aWxkaW5nIGluIGFuZCB0aGVuCis6OiBzZXQgdGhlIEdFTkVSQVRPUiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBvbmUgb2Y6Cis6OgorOjogIFZpc3VhbCBTdHVkaW8gMTUgMjAxNyBbYXJjaF0gPSBHZW5lcmF0ZXMgVmlzdWFsIFN0dWRpbyAyMDE3IHByb2plY3QgZmlsZXMuCis6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsIFthcmNoXSBjYW4gYmUgIldpbjY0IiBvciAiQVJNIi4KKzo6ICBWaXN1YWwgU3R1ZGlvIDE0IDIwMTUgW2FyY2hdID0gR2VuZXJhdGVzIFZpc3VhbCBTdHVkaW8gMjAxNSBwcm9qZWN0IGZpbGVzLgorOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbCBbYXJjaF0gY2FuIGJlICJXaW42NCIgb3IgIkFSTSIuCis6OiAgVmlzdWFsIFN0dWRpbyAxMiAyMDEzIFthcmNoXSA9IEdlbmVyYXRlcyBWaXN1YWwgU3R1ZGlvIDIwMTMgcHJvamVjdCBmaWxlcy4KKzo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWwgW2FyY2hdIGNhbiBiZSAiV2luNjQiIG9yICJBUk0iLgorOjogIFZpc3VhbCBTdHVkaW8gMTEgMjAxMiBbYXJjaF0gPSBHZW5lcmF0ZXMgVmlzdWFsIFN0dWRpbyAyMDEyIHByb2plY3QgZmlsZXMuCis6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsIFthcmNoXSBjYW4gYmUgIldpbjY0IiBvciAiQVJNIi4KKzo6ICBWaXN1YWwgU3R1ZGlvIDEwIDIwMTAgW2FyY2hdID0gR2VuZXJhdGVzIFZpc3VhbCBTdHVkaW8gMjAxMCBwcm9qZWN0IGZpbGVzLgorOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbCBbYXJjaF0gY2FuIGJlICJXaW42NCIgb3IgIklBNjQiLgorOjogIE1pbkdXIE1ha2VmaWxlcyAgICAgICAgICAgICAgPSBHZW5lcmF0ZXMgbWFrZWZpbGVzIGZvciBNaW5HVworOjogIE1TWVMgTWFrZWZpbGVzICAgICAgICAgICAgICAgPSBHZW5lcmF0ZXMgbWFrZWZpbGVzIGZvciBNU1lTCis6OiAgVW5peCBNYWtlZmlsZXMgICAgICAgICAgICAgICA9IEdlbmVyYXRlcyBtYWtlZmlsZXMgZm9yIENZR1dJTgorOjoKKzo6IEhvbm9ycyBhbnkgZXhpc3RpbmcgR0VORVJBVE9SIGVudmlyb25tZW50IHZhcmlhYmxlCis6OiAgIHNldHRpbmcgaW5zdGVhZCBvZiBvdmVyd3JpdGluZyBpdCwgdG8gYWxsb3cgaXQKKzo6ICAgdG8gYmUgZm9yY2VkIGlmIG5lZWRlZC4KKzo6Cis6OiBTZXRzIEVSUk9STEVWRUwgdG8gMCBpZiBHRU5FUkFUT1IgY2FuIGJlIGRldGVybWluZWQsCis6OiAgICAgICAgICAgICAgICAgdG8gMSBpZiBpdCBjYW5ub3QuCis6OgorCitJRiBERUZJTkVEIEdFTkVSQVRPUiAoCisgIEVDSE8gW3dhcm4gXSB1c2luZyBleGlzdGluZyBlbnZpcm9ubWVudCB2YXJpYWJsZSBHRU5FUkFUT1IKKyAgRVhJVCAvQiAwCispCisKKworSUYgIiVQUk9GSUxFOn4wLDQlIiA9PSAiTUlORyIgKAorICBTRVQgR0VORVJBVE9SPU1pbkdXIE1ha2VmaWxlcworCispIEVMU0UgSUYgIiVQUk9GSUxFOn4wLDQlIiA9PSAiQ1lHVyIgKAorICBTRVQgR0VORVJBVE9SPVVuaXggTWFrZWZpbGVzCisKKykgRUxTRSBJRiAiJVBST0ZJTEU6fjAsNCUiID09ICJNU1lTIiAoCisgIFNFVCBHRU5FUkFUT1I9TVNZUyBNYWtlZmlsZXMKKykgRUxTRSAoCisgIElGIC9pICIlUExBVEZPUk0lIiA9PSAieDY0IiBTRVQgR0VOQVJDSD0gV2luNjQKKyAgQ0FMTCA6Q0hFQ0sgMTYKKyAgSUYgIUVSUk9STEVWRUwhID09IDAgU0VUIEdFTkVSQVRPUj1WaXN1YWwgU3R1ZGlvIDEwIDIwMTAhR0VOQVJDSCEKKyAgQ0FMTCA6Q0hFQ0sgMTcKKyAgSUYgIUVSUk9STEVWRUwhID09IDAgU0VUIEdFTkVSQVRPUj1WaXN1YWwgU3R1ZGlvIDExIDIwMTIhR0VOQVJDSCEKKyAgQ0FMTCA6Q0hFQ0sgMTgKKyAgSUYgIUVSUk9STEVWRUwhID09IDAgU0VUIEdFTkVSQVRPUj1WaXN1YWwgU3R1ZGlvIDEyIDIwMTMhR0VOQVJDSCEKKyAgQ0FMTCA6Q0hFQ0sgMTkuMAorICBJRiAhRVJST1JMRVZFTCEgPT0gMCBTRVQgR0VORVJBVE9SPVZpc3VhbCBTdHVkaW8gMTQgMjAxNSFHRU5BUkNIIQorICBDQUxMIDpDSEVDSyAxOS4xCisgIElGICFFUlJPUkxFVkVMISA9PSAwIFNFVCBHRU5FUkFUT1I9VmlzdWFsIFN0dWRpbyAxNSAyMDE3IUdFTkFSQ0ghCispCisKK0lGIE5PVCBERUZJTkVEIEdFTkVSQVRPUiAoCisgIEVDSE8gW2Vycm9yXSB1bmFibGUgdG8gZGV0ZXJtaW5lIHRoZSBDTWFrZSBnZW5lcmF0b3IgdG8gdXNlCisgIEVYSVQgL0IgMQorKQorCitFQ0hPIFtpbmZvIF0gdXNpbmcgQ01ha2UgZ2VuZXJhdG9yICAgICAgICAlR0VORVJBVE9SJQorRVhJVCAvQiAwCisKKzpDSEVDSworY2wgLz8gMj4mMSB8IGZpbmRzdHIgL0M6IlZlcnNpb24gJTElIiA+IG51bAorRVhJVCAvQgpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvY2xfc2hvd2Vudi5iYXQgYi9idWlsZC9hcHB2ZXlvci9jbF9zaG93ZW52LmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzBhNDkwCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvY2xfc2hvd2Vudi5iYXQKQEAgLTAsMCArMSw2MyBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworRUNITy8KK0VDSE8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSUYgIiVQUk9GSUxFOn4wLDQlIiA9PSAiTVNWQyIgKAorRUNITyBWZXJzaW9ucworRUNITyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFQ0hPIGJvb3N0ICAgICAgICAgICAgICAgICA9ICVCT09TVF9WRVJTSU9OJQorRUNITyBsaWJldmVudCAgICAgICAgICAgICAgPSAlTElCRVZFTlRfVkVSU0lPTiUKK0VDSE8gcHl0aG9uICAgICAgICAgICAgICAgID0gJVBZVEhPTl9WRVJTSU9OJQorRUNITyBxdCAgICAgICAgICAgICAgICAgICAgPSAlUVRfVkVSU0lPTiUKK0VDSE8gemxpYiAgICAgICAgICAgICAgICAgID0gJVpMSUJfVkVSU0lPTiUKK0VDSE8vCispCitFQ0hPIEFwcHZleW9yIFZhcmlhYmxlcworRUNITyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFQ0hPIEFQUFZFWU9SX0JVSUxEX0ZPTERFUiA9ICVBUFBWRVlPUl9CVUlMRF9GT0xERVIlCitFQ0hPIENPTkZJR1VSQVRJT04gICAgICAgICA9ICVDT05GSUdVUkFUSU9OJQorRUNITyBQTEFURk9STSAgICAgICAgICAgICAgPSAlUExBVEZPUk0lCitFQ0hPIFBST0ZJTEUgICAgICAgICAgICAgICA9ICVQUk9GSUxFJQorRUNITy8KK0VDSE8gT3VyIFZhcmlhYmxlcworRUNITyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFQ0hPIEFQUFZFWU9SX1NDUklQVFMgICAgICA9ICVBUFBWRVlPUl9TQ1JJUFRTJQorRUNITyBCQVNIICAgICAgICAgICAgICAgICAgPSAlQkFTSCUKK0VDSE8gQk9PU1RfUk9PVCAgICAgICAgICAgID0gJUJPT1NUX1JPT1QlCitFQ0hPIEJPT1NUX0lOQ0xVREVESVIgICAgICA9ICVCT09TVF9JTkNMVURFRElSJQorRUNITyBCT09TVF9MSUJSQVJZRElSICAgICAgPSAlQk9PU1RfTElCUkFSWURJUiUKK0VDSE8gQlVJTERESVIgICAgICAgICAgICAgID0gJUJVSUxERElSJQorRUNITyBDT01QSUxFUiAgICAgICAgICAgICAgPSAlQ09NUElMRVIlCitFQ0hPIEdFTkVSQVRPUiAgICAgICAgICAgICA9ICVHRU5FUkFUT1IlCitFQ0hPIElOU1RESVIgICAgICAgICAgICAgICA9ICVJTlNURElSJQorRUNITyBKQVZBX0hPTUUgICAgICAgICAgICAgPSAlSkFWQV9IT01FJQorRUNITyBPUEVOU1NMX1JPT1QgICAgICAgICAgPSAlT1BFTlNTTF9ST09UJQorRUNITyBTRVRVUCAgICAgICAgICAgICAgICAgPSAlU0VUVVAlCitFQ0hPIFNSQ0RJUiAgICAgICAgICAgICAgICA9ICVTUkNESVIlCitFQ0hPIFdJTjNQICAgICAgICAgICAgICAgICA9ICVXSU4zUCUKK0VDSE8gV0lUSF9QWVRIT04gICAgICAgICAgID0gJVdJVEhfUFlUSE9OJQorRUNITyBaTElCX1NUQVRJQ19TVUZGSVggICAgPSAlWkxJQl9TVEFUSUNfU1VGRklYJQorSUYgTk9UICIlUFJPRklMRTp+MCw0JSIgPT0gIk1TVkMiICgKKyAgRUNITy8KKyAgRUNITyBVTklYeSBQQVRICisgIEVDSE8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAlQkFTSCUgLWxjICJlY2hvICRQQVRIIgorKQorRUNITy8KK0VDSE8gV2luZG93cyBQQVRICitFQ0hPIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VDSE8gJVBBVEglCitFQ0hPID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0VDSE8vCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9zaW11bGF0ZS1hcHB2ZXlvci5iYXQgYi9idWlsZC9hcHB2ZXlvci9zaW11bGF0ZS1hcHB2ZXlvci5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY3NGY0MAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL3NpbXVsYXRlLWFwcHZleW9yLmJhdApAQCAtMCwwICsxLDM1IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCis6OgorOjogSGVscHMgYnVpbGQgdGhyaWZ0IGJ5IHByZXRlbmRpbmcgdG8gYmUgYXBwdmV5b3IKKzo6IFVzYWdlOgorOjogICBjZCBidWlsZFxhcHB2ZXlvcgorOjogICBzaW11bGF0ZS1hcHB2ZXlvci5iYXQgW0RlYnVnfFJlbGVhc2VdIFt4ODZ8eDY0XSBbQ1lHV0lOfE1JTkdXfE1TVkMyMDE/XQorOjoKKworQEVDSE8gT0ZGCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCisKK1NFVCBBUFBWRVlPUl9CVUlMRF9GT0xERVI9JX5kcDAuLlwuLgorU0VUIENPTkZJR1VSQVRJT049JTEKK1NFVCBQTEFURk9STT0lMgorU0VUIFBST0ZJTEU9JTMKKworQ0QgJUFQUFZFWU9SX0JVSUxEX0ZPTERFUiUKK0NBTEwgYnVpbGRcYXBwdmV5b3JcJVBST0ZJTEU6fjAsNCUtYXBwdmV5b3ItaW5zdGFsbC5iYXQgfHwgRVhJVCAvQgorQ0QgJUFQUFZFWU9SX0JVSUxEX0ZPTERFUiUKK0NBTEwgYnVpbGRcYXBwdmV5b3JcJVBST0ZJTEU6fjAsNCUtYXBwdmV5b3ItYnVpbGQuYmF0ICAgfHwgRVhJVCAvQgorQ0QgJUFQUFZFWU9SX0JVSUxEX0ZPTERFUiUKK0NBTEwgYnVpbGRcYXBwdmV5b3JcJVBST0ZJTEU6fjAsNCUtYXBwdmV5b3ItdGVzdC5iYXQKZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL0NQYWNrQ29uZmlnLmNtYWtlIGIvYnVpbGQvY21ha2UvQ1BhY2tDb25maWcuY21ha2UKaW5kZXggMDI0MDAwNS4uZmRjMWI0ZSAxMDA2NDQKLS0tIGEvYnVpbGQvY21ha2UvQ1BhY2tDb25maWcuY21ha2UKKysrIGIvYnVpbGQvY21ha2UvQ1BhY2tDb25maWcuY21ha2UKQEAgLTI4LDggKzI4LDggQEAKIHNldChDUEFDS19QQUNLQUdFX05BTUUgInRocmlmdCIpCiBzZXQoQ1BBQ0tfUEFDS0FHRV9WRVJTSU9OICIke1BBQ0tBR0VfVkVSU0lPTn0iKQogc2V0KENQQUNLX1BBQ0tBR0VfREVTQ1JJUFRJT05fU1VNTUFSWSAiQXBhY2hlIFRocmlmdCIpCi1zZXQoQ1BBQ0tfUEFDS0FHRV9ERVNDUklQVElPTl9GSUxFICIke0NNQUtFX1NPVVJDRV9ESVJ9L1JFQURNRS5tZCIpCi1zZXQoQ1BBQ0tfUkVTT1VSQ0VfRklMRV9MSUNFTlNFICIke0NNQUtFX1NPVVJDRV9ESVJ9L0xJQ0VOU0UiKQorc2V0KENQQUNLX1BBQ0tBR0VfREVTQ1JJUFRJT05fRklMRSAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L1JFQURNRS5tZCIpCitzZXQoQ1BBQ0tfUkVTT1VSQ0VfRklMRV9MSUNFTlNFICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vTElDRU5TRSIpCiBzZXQoQ1BBQ0tfUEFDS0FHRV9WRU5ET1IgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIikKIHNldChDUEFDS19QQUNLQUdFX0NPTlRBQ1QgImRldkB0aHJpZnQuYXBhY2hlLm9yZyIpCiBzZXQoQ1BBQ0tfUEFDS0FHRV9JTlNUQUxMX0RJUkVDVE9SWSAiJHtDUEFDS19QQUNLQUdFX05BTUV9IikKQEAgLTU4LDcgKzU4LDcgQEAKICAgICAgICAgImh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUIiAiQXBhY2hlIFRocmlmdCAtIElzc3VlcyIpCiAgICAgc2V0KENQQUNLX05TSVNfQ09OVEFDVCAke0NQQUNLX1BBQ0tBR0VfQ09OVEFDVH0pCiAgICAgc2V0KENQQUNLX05TSVNfTU9ESUZZX1BBVEggIk9OIikKLSAgICBzZXQoQ1BBQ0tfUEFDS0FHRV9JTlNUQUxMX0RJUkVDVE9SWSAke0NQQUNLX1BBQ0tBR0VfTkFNRX0pCisgICAgc2V0KENQQUNLX1BBQ0tBR0VfSU5TVEFMTF9ESVJFQ1RPUlkgIiR7Q1BBQ0tfUEFDS0FHRV9OQU1FfSIpCiBlbHNlKCkKICAgICBzZXQoQ1BBQ0tfR0VORVJBVE9SICJERUIiICkKICAgICBzZXQoQ1BBQ0tfREVCSUFOX1BBQ0tBR0VfTUFJTlRBSU5FUiAke0NQQUNLX1BBQ0tBR0VfQ09OVEFDVH0pCmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9Db25maWd1cmVDaGVja3MuY21ha2UgYi9idWlsZC9jbWFrZS9Db25maWd1cmVDaGVja3MuY21ha2UKaW5kZXggZjY1MDU0NC4uNDU3YmZlMCAxMDA2NDQKLS0tIGEvYnVpbGQvY21ha2UvQ29uZmlndXJlQ2hlY2tzLmNtYWtlCisrKyBiL2J1aWxkL2NtYWtlL0NvbmZpZ3VyZUNoZWNrcy5jbWFrZQpAQCAtMTcsMTcgKzE3LDE2IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi0KLWluY2x1ZGUoQ2hlY2tTeW1ib2xFeGlzdHMpCitpbmNsdWRlKENoZWNrRnVuY3Rpb25FeGlzdHMpCiBpbmNsdWRlKENoZWNrSW5jbHVkZUZpbGUpCiBpbmNsdWRlKENoZWNrSW5jbHVkZUZpbGVzKQotaW5jbHVkZShDaGVja0Z1bmN0aW9uRXhpc3RzKQoraW5jbHVkZShDaGVja1N5bWJvbEV4aXN0cykKIAotIyBJZiBBSV9BRERSQ09ORklHIGlzIG5vdCBkZWZpbmVkIHdlIGRlZmluZSBpdCBhcyAwCi1jaGVja19zeW1ib2xfZXhpc3RzKEFJX0FERFJDT05GSUcgInN5cy90eXBlcy5oO3N5cy9zb2NrZXQuaDtuZXRkYi5oIiBIQVZFX0FJX0FERFJDT05GSUcpCi1pZihOT1QgSEFWRV9BSV9BRERSQ09ORklHKQotc2V0KEFJX0FERFJDT05GSUcgMSkKLWVuZGlmKE5PVCBIQVZFX0FJX0FERFJDT05GSUcpCitpZiAoSW50dHlwZXNfRk9VTkQpCisgICMgVGhpcyBhbGxvd3MgdGhlIGludHR5cGVzLmggYW5kIHN0ZGludC5oIGNoZWNrcyB0byBzdWNjZWVkIG9uIHBsYXRmb3JtcyB0aGF0CisgICMgZG8gbm90IG5hdGl2ZWx5IHByb3ZpZGUgdGhlcmUuCisgIHNldCAoQ01BS0VfUkVRVUlSRURfSU5DTFVERVMgJHtJTlRUWVBFU19JTkNMVURFX0RJUlN9KQorZW5kaWYgKCkKIAogY2hlY2tfaW5jbHVkZV9maWxlKGFycGEvaW5ldC5oIEhBVkVfQVJQQV9JTkVUX0gpCiBjaGVja19pbmNsdWRlX2ZpbGUoZmNudGwuaCBIQVZFX0ZDTlRMX0gpCkBAIC0zNSwxOCArMzQsMjIgQEAKIGNoZWNrX2luY2x1ZGVfZmlsZShpbnR0eXBlcy5oIEhBVkVfSU5UVFlQRVNfSCkKIGNoZWNrX2luY2x1ZGVfZmlsZShuZXRkYi5oIEhBVkVfTkVUREJfSCkKIGNoZWNrX2luY2x1ZGVfZmlsZShuZXRpbmV0L2luLmggSEFWRV9ORVRJTkVUX0lOX0gpCitjaGVja19pbmNsdWRlX2ZpbGUoc2lnbmFsLmggSEFWRV9TSUdOQUxfSCkKIGNoZWNrX2luY2x1ZGVfZmlsZShzdGRpbnQuaCBIQVZFX1NURElOVF9IKQogY2hlY2tfaW5jbHVkZV9maWxlKHVuaXN0ZC5oIEhBVkVfVU5JU1REX0gpCiBjaGVja19pbmNsdWRlX2ZpbGUocHRocmVhZC5oIEhBVkVfUFRIUkVBRF9IKQotY2hlY2tfaW5jbHVkZV9maWxlKHN5cy90aW1lLmggSEFWRV9TWVNfVElNRV9IKQorY2hlY2tfaW5jbHVkZV9maWxlKHN5cy9pb2N0bC5oIEhBVkVfU1lTX0lPQ1RMX0gpCiBjaGVja19pbmNsdWRlX2ZpbGUoc3lzL3BhcmFtLmggSEFWRV9TWVNfUEFSQU1fSCkKIGNoZWNrX2luY2x1ZGVfZmlsZShzeXMvcmVzb3VyY2UuaCBIQVZFX1NZU19SRVNPVVJDRV9IKQogY2hlY2tfaW5jbHVkZV9maWxlKHN5cy9zb2NrZXQuaCBIQVZFX1NZU19TT0NLRVRfSCkKIGNoZWNrX2luY2x1ZGVfZmlsZShzeXMvc3RhdC5oIEhBVkVfU1lTX1NUQVRfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZShzeXMvdGltZS5oIEhBVkVfU1lTX1RJTUVfSCkKIGNoZWNrX2luY2x1ZGVfZmlsZShzeXMvdW4uaCBIQVZFX1NZU19VTl9IKQorY2hlY2tfaW5jbHVkZV9maWxlKHBvbGwuaCBIQVZFX1BPTExfSCkKIGNoZWNrX2luY2x1ZGVfZmlsZShzeXMvcG9sbC5oIEhBVkVfU1lTX1BPTExfSCkKIGNoZWNrX2luY2x1ZGVfZmlsZShzeXMvc2VsZWN0LmggSEFWRV9TWVNfU0VMRUNUX0gpCiBjaGVja19pbmNsdWRlX2ZpbGUoc2NoZWQuaCBIQVZFX1NDSEVEX0gpCitjaGVja19pbmNsdWRlX2ZpbGUoc3RyaW5nLmggSEFWRV9TVFJJTkdfSCkKIGNoZWNrX2luY2x1ZGVfZmlsZShzdHJpbmdzLmggSEFWRV9TVFJJTkdTX0gpCiAKIGNoZWNrX2Z1bmN0aW9uX2V4aXN0cyhnZXRob3N0YnluYW1lIEhBVkVfR0VUSE9TVEJZTkFNRSkKQEAgLTcyLDUgKzc1LDUgQEAKIAogIyBnZW5lcmF0ZSBhIGNvbmZpZy5oIGZpbGUKIGNvbmZpZ3VyZV9maWxlKCIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vYnVpbGQvY21ha2UvY29uZmlnLmguaW4iICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0L2NvbmZpZy5oIikKLSMgSEFDSzogU29tZSBmaWxlcyBpbmNsdWRlIHRocmlmdC9jb25maWcuaCBhbmQgc29tZSBjb25maWcuaCBzbyB3ZSBpbmNsdWRlIGJvdGguIFRoaXMgc2hvdWxkIGJlIGNsZWFuZWQgdXAuCi1pbmNsdWRlX2RpcmVjdG9yaWVzKCIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0IiAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9IikKKworaW5jbHVkZV9kaXJlY3RvcmllcygiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9IikKZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL0RlZmluZUNNYWtlRGVmYXVsdHMuY21ha2UgYi9idWlsZC9jbWFrZS9EZWZpbmVDTWFrZURlZmF1bHRzLmNtYWtlCmluZGV4IDM0ZmY3MzguLjkzMjU1ZTAgMTAwNjQ0Ci0tLSBhL2J1aWxkL2NtYWtlL0RlZmluZUNNYWtlRGVmYXVsdHMuY21ha2UKKysrIGIvYnVpbGQvY21ha2UvRGVmaW5lQ01ha2VEZWZhdWx0cy5jbWFrZQpAQCAtMzUsNyArMzUsNyBAQAogc2V0KENNQUtFX0NPTE9SX01BS0VGSUxFIE9OKQogCiAjIERlZmluZSB0aGUgZ2VuZXJpYyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJpZXMgaGVyZQotc2V0KEdFTkVSSUNfTElCX1ZFUlNJT04gIjAuOS4zIikKK3NldChHRU5FUklDX0xJQl9WRVJTSU9OICIxLjAuMCIpCiBzZXQoR0VORVJJQ19MSUJfU09WRVJTSU9OICIwIikKIAogIyBTZXQgdGhlIGRlZmF1bHQgYnVpbGQgdHlwZSB0byByZWxlYXNlIHdpdGggZGVidWcgaW5mbwpAQCAtNjgsMyArNjgsMjMgQEAKICMgbG9jYXRpb25zIGFuZCBydW5uaW5nIHRoZSBleGVjdXRhYmxlcyB3aXRob3V0IExEX1BSRUxPQUQgb3Igc2ltaWxhci4KICMgVGhpcyByZXF1aXJlcyB0aGUgbGlicmFyeSB0byBiZSBidWlsdCB3aXRoIHJwYXRoIHN1cHBvcnQuCiBzZXQoQ01BS0VfSU5TVEFMTF9SUEFUSF9VU0VfTElOS19QQVRIIFRSVUUpCisKKyMKKyMgQysrIExhbmd1YWdlIExldmVsIERlZmF1bHRzIC0gdGhpcyBkZXBlbmRzIG9uIHRoZSBjb21waWxlciBjYXBhYmlsaXRpZXMKKyMKK2lmIChOT1QgREVGSU5FRCBDTUFLRV9DWFhfU1RBTkRBUkQpCisgIHNldChDTUFLRV9DWFhfU1RBTkRBUkQgMTEpICMgQysrMTEKKyAgbWVzc2FnZShTVEFUVVMgIlNldHRpbmcgQysrMTEgYXMgdGhlIGRlZmF1bHQgbGFuZ3VhZ2UgbGV2ZWwuIikKKyAgbWVzc2FnZShTVEFUVVMgIlRvIHNwZWNpZnkgYSBkaWZmZXJlbnQgQysrIGxhbmd1YWdlIGxldmVsLCBzZXQgQ01BS0VfQ1hYX1NUQU5EQVJEIikKK2VuZGlmKCkKKworaWYgKENNQUtFX0NYWF9TVEFOREFSRCBFUVVBTCA5OCkKKyAgbWVzc2FnZShGQVRBTF9FUlJPUiAib25seSBDKysxMSBvciBhYm92ZSBDKysgc3RhbmRhcmQgaXMgc3VwcG9ydGVkIikKK2Vsc2VpZiAoQ01BS0VfQ1hYX1NUQU5EQVJEIEVRVUFMIDExKQorICAjIHNob3VsZCBub3QgZmFsbGJhY2sgdG8gQysrOTgKKyAgc2V0KENNQUtFX0NYWF9TVEFOREFSRF9SRVFVSVJFRCBPTikKK2VuZGlmKCkKKworaWYgKE5PVCBERUZJTkVEIENNQUtFX0NYWF9FWFRFTlNJT05TKQorICBzZXQoQ01BS0VfQ1hYX0VYVEVOU0lPTlMgT0ZGKSAgICAgICAgIyB1c2Ugc3RhbmRhcmRzIGNvbXBsaWFudCBsYW5ndWFnZSBsZXZlbCBmb3IgcG9ydGFiaWxpdHkKK2VuZGlmKCkKZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL0RlZmluZU9wdGlvbnMuY21ha2UgYi9idWlsZC9jbWFrZS9EZWZpbmVPcHRpb25zLmNtYWtlCmluZGV4IDYyZTI0MGYuLjlhZmY1M2MgMTAwNjQ0Ci0tLSBhL2J1aWxkL2NtYWtlL0RlZmluZU9wdGlvbnMuY21ha2UKKysrIGIvYnVpbGQvY21ha2UvRGVmaW5lT3B0aW9ucy5jbWFrZQpAQCAtMjAsMTEgKzIwLDE3IEBACiAKIGluY2x1ZGUoQ01ha2VEZXBlbmRlbnRPcHRpb24pCiAKK3NldChUSFJJRlRfQ09NUElMRVIgIiIgQ0FDSEUgRklMRVBBVEggIkV4dGVybmFsIFRocmlmdCBjb21waWxlciB0byB1c2UgZHVyaW5nIGJ1aWxkIikKKwogIyBBZGRpdGlvbmFsIGNvbXBvbmVudHMKIG9wdGlvbihCVUlMRF9DT01QSUxFUiAiQnVpbGQgVGhyaWZ0IGNvbXBpbGVyIiBPTikKLW9wdGlvbihCVUlMRF9URVNUSU5HICJCdWlsZCB3aXRoIHVuaXQgdGVzdHMiIE9OKQotb3B0aW9uKEJVSUxEX0VYQU1QTEVTICJCdWlsZCBleGFtcGxlcyIgT04pCi1vcHRpb24oQlVJTERfVFVUT1JJQUxTICJCdWlsZCBUaHJpZnQgdHV0b3JpYWxzIiBPTikKKworaWYoQlVJTERfQ09NUElMRVIgT1IgRVhJU1RTICR7VEhSSUZUX0NPTVBJTEVSfSkKKyAgICBzZXQoSEFWRV9DT01QSUxFUiBPTikKK2VuZGlmKCkKK0NNQUtFX0RFUEVOREVOVF9PUFRJT04oQlVJTERfVEVTVElORyAiQnVpbGQgd2l0aCB1bml0IHRlc3RzIiBPTiAiSEFWRV9DT01QSUxFUiIgT0ZGKQorQ01BS0VfREVQRU5ERU5UX09QVElPTihCVUlMRF9FWEFNUExFUyAiQnVpbGQgZXhhbXBsZXMiIE9OICJIQVZFX0NPTVBJTEVSIiBPRkYpCitDTUFLRV9ERVBFTkRFTlRfT1BUSU9OKEJVSUxEX1RVVE9SSUFMUyAiQnVpbGQgVGhyaWZ0IHR1dG9yaWFscyIgT04gIkhBVkVfQ09NUElMRVIiIE9GRikKIG9wdGlvbihCVUlMRF9MSUJSQVJJRVMgIkJ1aWxkIFRocmlmdCBsaWJyYXJpZXMiIE9OKQogCiAjIExpYnJhcmllcyB0byBidWlsZApAQCAtMzQsNTAgKzQwLDg2IEBACiAjIGFuZCBlbmFibGVzIHRoZSBsaWJyYXJ5IGlmIGFsbCBhcmUgZm91bmQuIFRoaXMgbWVhbnMgdGhlIGRlZmF1bHQgaXMgdG8gYnVpbGQgYXMKICMgbXVjaCBhcyBwb3NzaWJsZSBidXQgbGVhdmluZyBvdXQgbGlicmFyaWVzIGlmIHRoZWlyIGRlcGVuZGVuY2llcyBhcmUgbm90IG1ldC4KIAorb3B0aW9uKFdJVEhfQk9PU1RfU1RBVElDICJCdWlsZCB3aXRoIEJvb3N0IHN0YXRpYyBsaW5rIGxpYnJhcnkiIE9GRikKK3NldChCb29zdF9VU0VfU1RBVElDX0xJQlMgJHtXSVRIX0JPT1NUX1NUQVRJQ30pCitpZiAoTk9UIFdJVEhfQk9PU1RfU1RBVElDKQorICAgIGFkZF9kZWZpbml0aW9ucygtREJPT1NUX0FMTF9EWU5fTElOSykKKyAgICBhZGRfZGVmaW5pdGlvbnMoLURCT09TVF9URVNUX0RZTl9MSU5LKQorZW5kaWYoKQorCiAjIEMrKwogb3B0aW9uKFdJVEhfQ1BQICJCdWlsZCBDKysgVGhyaWZ0IGxpYnJhcnkiIE9OKQotZmluZF9wYWNrYWdlKEJvb3N0IDEuNTMgUVVJRVQpCitpZihXSVRIX0NQUCkKKyAgICBmaW5kX3BhY2thZ2UoQm9vc3QgMS41MyBRVUlFVCkKKyAgICAjIE5PVEU6IEN1cnJlbnRseSB0aGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIEMrKyBzcGVjaWZpYywKKyAgICAjIGJ1dCBpbiBmdXR1cmUgb3RoZXIgbGlicmFyaWVzIG1pZ2h0IHJldXNlIHRoZW0uCisgICAgIyBTbyB0aGV5IGFyZSBub3QgZGVwZW5kZW50IG9uIFdJVEhfQ1BQIGJ1dCBzZXR0aW5nIHRoZW0gd2l0aG91dCBXSVRIX0NQUCBjdXJyZW50bHkKKyAgICAjIGhhcyBubyBlZmZlY3QuCisgICAgaWYoWkxJQl9MSUJSQVJZKQorICAgICAgICAjIEZpbmRaTElCLmNtYWtlIGRvZXMgbm90IG5vcm1hbGl6ZSBwYXRoIHNvIHdlIG5lZWQgdG8gZG8gaXQgb3Vyc2VsdmVzLgorICAgICAgICBmaWxlKFRPX0NNQUtFX1BBVEggJHtaTElCX0xJQlJBUll9IFpMSUJfTElCUkFSWSkKKyAgICBlbmRpZigpCisgICAgZmluZF9wYWNrYWdlKFpMSUIgUVVJRVQpCisgICAgQ01BS0VfREVQRU5ERU5UX09QVElPTihXSVRIX1pMSUIgIkJ1aWxkIHdpdGggWkxJQiBzdXBwb3J0IiBPTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlpMSUJfRk9VTkQiIE9GRikKKyAgICBmaW5kX3BhY2thZ2UoTGliZXZlbnQgUVVJRVQpCisgICAgQ01BS0VfREVQRU5ERU5UX09QVElPTihXSVRIX0xJQkVWRU5UICJCdWlsZCB3aXRoIGxpYmV2ZW50IHN1cHBvcnQiIE9OCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiTGliZXZlbnRfRk9VTkQiIE9GRikKKyAgICBmaW5kX3BhY2thZ2UoUXQ0IFFVSUVUIENPTVBPTkVOVFMgUXRDb3JlIFF0TmV0d29yaykKKyAgICBDTUFLRV9ERVBFTkRFTlRfT1BUSU9OKFdJVEhfUVQ0ICJCdWlsZCB3aXRoIFF0NCBzdXBwb3J0IiBPTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlFUNF9GT1VORCIgT0ZGKQorICAgIGZpbmRfcGFja2FnZShRdDUgUVVJRVQgQ09NUE9ORU5UUyBDb3JlIE5ldHdvcmspCisgICAgQ01BS0VfREVQRU5ERU5UX09QVElPTihXSVRIX1FUNSAiQnVpbGQgd2l0aCBRdDUgc3VwcG9ydCIgT04KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJRdDVfRk9VTkQiIE9GRikKKyAgICBpZigke1dJVEhfUVQ0fSBBTkQgJHtXSVRIX1FUNX0gQU5EICR7Q01BS0VfTUFKT1JfVkVSU0lPTn0gTEVTUyAzKQorICAgICAgIyBjbWFrZSA8IDMuMC4wIGNhdXNlcyBjb25mbGljdCB3aGVuIGJ1aWxkaW5nIGJvdGggUXQ0IGFuZCBRdDUKKyAgICAgIHNldChXSVRIX1FUNCBPRkYpCisgICAgZW5kaWYoKQorICAgIGZpbmRfcGFja2FnZShPcGVuU1NMIFFVSUVUKQorICAgIENNQUtFX0RFUEVOREVOVF9PUFRJT04oV0lUSF9PUEVOU1NMICJCdWlsZCB3aXRoIE9wZW5TU0wgc3VwcG9ydCIgT04KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJPUEVOU1NMX0ZPVU5EIiBPRkYpCisgICAgb3B0aW9uKFdJVEhfU1REVEhSRUFEUyAiQnVpbGQgd2l0aCBDKysgc3RkOjp0aHJlYWQgc3VwcG9ydCIgT04pCitlbmRpZigpCiBDTUFLRV9ERVBFTkRFTlRfT1BUSU9OKEJVSUxEX0NQUCAiQnVpbGQgQysrIGxpYnJhcnkiIE9OCiAgICAgICAgICAgICAgICAgICAgICAgICJCVUlMRF9MSUJSQVJJRVM7V0lUSF9DUFA7Qm9vc3RfRk9VTkQiIE9GRikKLSMgTk9URTogQ3VycmVudGx5IHRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgQysrIHNwZWNpZmljLAotIyBidXQgaW4gZnV0dXJlIG90aGVyIGxpYnJhcmllcyBtaWdodCByZXVzZSB0aGVtLgotIyBTbyB0aGV5IGFyZSBub3QgZGVwZW5kZW50IG9uIFdJVEhfQ1BQIGJ1dCBzZXR0aW5nIHRoZW0gd2l0aG91dCBXSVRIX0NQUCBjdXJyZW50bHkKLSMgaGFzIG5vIGVmZmVjdC4KLWZpbmRfcGFja2FnZShaTElCIFFVSUVUKQotQ01BS0VfREVQRU5ERU5UX09QVElPTihXSVRIX1pMSUIgIkJ1aWxkIHdpdGggWkxJQiBzdXBwb3J0IiBPTgotICAgICAgICAgICAgICAgICAgICAgICAiWkxJQl9GT1VORCIgT0ZGKQotZmluZF9wYWNrYWdlKExpYmV2ZW50IFFVSUVUKQotQ01BS0VfREVQRU5ERU5UX09QVElPTihXSVRIX0xJQkVWRU5UICJCdWlsZCB3aXRoIGxpYmV2ZW50IHN1cHBvcnQiIE9OCi0gICAgICAgICAgICAgICAgICAgICAgICJMaWJldmVudF9GT1VORCIgT0ZGKQotZmluZF9wYWNrYWdlKFF0NCBRVUlFVCBDT01QT05FTlRTIFF0Q29yZSBRdE5ldHdvcmspCi1DTUFLRV9ERVBFTkRFTlRfT1BUSU9OKFdJVEhfUVQ0ICJCdWlsZCB3aXRoIFF0NCBzdXBwb3J0IiBPTgotICAgICAgICAgICAgICAgICAgICAgICAiUVQ0X0ZPVU5EIiBPRkYpCi1maW5kX3BhY2thZ2UoUXQ1IFFVSUVUIENPTVBPTkVOVFMgQ29yZSBOZXR3b3JrKQotQ01BS0VfREVQRU5ERU5UX09QVElPTihXSVRIX1FUNSAiQnVpbGQgd2l0aCBRdDUgc3VwcG9ydCIgT04KLSAgICAgICAgICAgICAgICAgICAgICAgIlF0NV9GT1VORCIgT0ZGKQotaWYoJHtXSVRIX1FUNH0gQU5EICR7V0lUSF9RVDV9IEFORCAke0NNQUtFX01BSk9SX1ZFUlNJT059IExFU1MgMykKLSAgIyBjbWFrZSA8IDMuMC4wIGNhdXNlcyBjb25mbGljdCB3aGVuIGJ1aWxkaW5nIGJvdGggUXQ0IGFuZCBRdDUKLSAgc2V0KFdJVEhfUVQ0IE9GRikKLWVuZGlmKCkKLWZpbmRfcGFja2FnZShPcGVuU1NMIFFVSUVUKQotQ01BS0VfREVQRU5ERU5UX09QVElPTihXSVRIX09QRU5TU0wgIkJ1aWxkIHdpdGggT3BlblNTTCBzdXBwb3J0IiBPTgotICAgICAgICAgICAgICAgICAgICAgICAiT1BFTlNTTF9GT1VORCIgT0ZGKQotb3B0aW9uKFdJVEhfU1REVEhSRUFEUyAiQnVpbGQgd2l0aCBDKysgc3RkOjp0aHJlYWQgc3VwcG9ydCIgT0ZGKQotQ01BS0VfREVQRU5ERU5UX09QVElPTihXSVRIX0JPT1NUVEhSRUFEUyAiQnVpbGQgd2l0aCBCb29zdCB0aHJlYWRzIHN1cHBvcnQiIE9GRgotICAgICJOT1QgV0lUSF9TVERUSFJFQURTO0Jvb3N0X0ZPVU5EIiBPRkYpCi0KK0NNQUtFX0RFUEVOREVOVF9PUFRJT04oV0lUSF9QTFVHSU4gIkJ1aWxkIGNvbXBpbGVyIHBsdWdpbiBzdXBwb3J0IiBPRkYKKyAgICAgICAgICAgICAgICAgICAgICAgIkJVSUxEX0NPTVBJTEVSO0JVSUxEX0NQUCIgT0ZGKQogCiAjIEMgR0xpYgogb3B0aW9uKFdJVEhfQ19HTElCICJCdWlsZCBDIChHTGliKSBUaHJpZnQgbGlicmFyeSIgT04pCi1maW5kX3BhY2thZ2UoR0xJQiBRVUlFVCBDT01QT05FTlRTIGdvYmplY3QpCitpZihXSVRIX0NfR0xJQikKKyAgICBmaW5kX3BhY2thZ2UoR0xJQiBRVUlFVCBDT01QT05FTlRTIGdvYmplY3QpCitlbmRpZigpCiBDTUFLRV9ERVBFTkRFTlRfT1BUSU9OKEJVSUxEX0NfR0xJQiAiQnVpbGQgQyAoR0xpYikgbGlicmFyeSIgT04KICAgICAgICAgICAgICAgICAgICAgICAgIkJVSUxEX0xJQlJBUklFUztXSVRIX0NfR0xJQjtHTElCX0ZPVU5EIiBPRkYpCisKK2lmKEJVSUxEX0NQUCkKKyAgICBzZXQoYm9vc3RfY29tcG9uZW50cykKKyAgICBpZihCVUlMRF9URVNUSU5HKQorICAgICAgICBsaXN0KEFQUEVORCBib29zdF9jb21wb25lbnRzIHN5c3RlbSB0aHJlYWQpCisgICAgZW5kaWYoKQorICAgIGlmKEJVSUxEX1RFU1RJTkcpCisgICAgICAgIGxpc3QoQVBQRU5EIGJvb3N0X2NvbXBvbmVudHMgdW5pdF90ZXN0X2ZyYW1ld29yayBmaWxlc3lzdGVtIGNocm9ubyBwcm9ncmFtX29wdGlvbnMpCisgICAgZW5kaWYoKQorICAgIGlmKGJvb3N0X2NvbXBvbmVudHMpCisgICAgICAgIGZpbmRfcGFja2FnZShCb29zdCAxLjUzIFJFUVVJUkVEIENPTVBPTkVOVFMgJHtib29zdF9jb21wb25lbnRzfSkKKyAgICBlbmRpZigpCitlbHNlaWYoQlVJTERfQ19HTElCIEFORCBCVUlMRF9URVNUSU5HKQorICAgIGZpbmRfcGFja2FnZShCb29zdCAxLjUzIFJFUVVJUkVEKQorZW5kaWYoKQorCiAjIEphdmEKIG9wdGlvbihXSVRIX0pBVkEgIkJ1aWxkIEphdmEgVGhyaWZ0IGxpYnJhcnkiIE9OKQotZmluZF9wYWNrYWdlKEphdmEgUVVJRVQpCi1maW5kX3BhY2thZ2UoQW50IFFVSUVUKQotQ01BS0VfREVQRU5ERU5UX09QVElPTihCVUlMRF9KQVZBICJCdWlsZCBKYXZhIGxpYnJhcnkiIE9OCi0gICAgICAgICAgICAgICAgICAgICAgICJCVUlMRF9MSUJSQVJJRVM7V0lUSF9KQVZBO0pBVkFfRk9VTkQ7QU5UX0ZPVU5EIiBPRkYpCitpZihBTkRST0lEKQorICAgIGZpbmRfcGFja2FnZShHcmFkbGUgUVVJRVQpCisgICAgQ01BS0VfREVQRU5ERU5UX09QVElPTihCVUlMRF9KQVZBICJCdWlsZCBKYXZhIGxpYnJhcnkiIE9OCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlVJTERfTElCUkFSSUVTO1dJVEhfSkFWQTtHUkFETEVfRk9VTkQiIE9GRikKK2Vsc2UoKQorICAgIGZpbmRfcGFja2FnZShHcmFkbGV3IFFVSUVUKQorICAgIGZpbmRfcGFja2FnZShKYXZhIFFVSUVUKQorICAgIENNQUtFX0RFUEVOREVOVF9PUFRJT04oQlVJTERfSkFWQSAiQnVpbGQgSmF2YSBsaWJyYXJ5IiBPTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJVSUxEX0xJQlJBUklFUztXSVRIX0pBVkE7SkFWQV9GT1VORDtHUkFETEVXX0ZPVU5EIiBPRkYpCitlbmRpZigpCiAKICMgUHl0aG9uCiBvcHRpb24oV0lUSF9QWVRIT04gIkJ1aWxkIFB5dGhvbiBUaHJpZnQgbGlicmFyeSIgT04pCkBAIC04Niw2ICsxMjgsMTMgQEAKIENNQUtFX0RFUEVOREVOVF9PUFRJT04oQlVJTERfUFlUSE9OICJCdWlsZCBQeXRob24gbGlicmFyeSIgT04KICAgICAgICAgICAgICAgICAgICAgICAgIkJVSUxEX0xJQlJBUklFUztXSVRIX1BZVEhPTjtQWVRIT05MSUJTX0ZPVU5EIiBPRkYpCiAKKyMgSGFza2VsbAorb3B0aW9uKFdJVEhfSEFTS0VMTCAiQnVpbGQgSGFza2VsbCBUaHJpZnQgbGlicmFyeSIgT04pCitmaW5kX3BhY2thZ2UoR0hDIFFVSUVUKQorZmluZF9wYWNrYWdlKENhYmFsIFFVSUVUKQorQ01BS0VfREVQRU5ERU5UX09QVElPTihCVUlMRF9IQVNLRUxMICJCdWlsZCBHSEMgbGlicmFyeSIgT04KKyAgICAgICAgICAgICAgICAgICAgICAgIkJVSUxEX0xJQlJBUklFUztXSVRIX0hBU0tFTEw7R0hDX0ZPVU5EO0NBQkFMX0ZPVU5EIiBPRkYpCisKICMgQ29tbW9uIGxpYnJhcnkgb3B0aW9ucwogb3B0aW9uKFdJVEhfU0hBUkVEX0xJQiAiQnVpbGQgc2hhcmVkIGxpYnJhcmllcyIgT04pCiBvcHRpb24oV0lUSF9TVEFUSUNfTElCICJCdWlsZCBzdGF0aWMgbGlicmFyaWVzIiBPTikKQEAgLTEwOCwzNiArMTU3LDQ4IEBACiAKIG1hY3JvKFBSSU5UX0NPTkZJR19TVU1NQVJZKQogbWVzc2FnZShTVEFUVVMgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKQotbWVzc2FnZShTVEFUVVMgIlRocmlmdCB2ZXJzaW9uOiAgICAgICAgICAgICAgICAgICAgICAgJHt0aHJpZnRfVkVSU0lPTn0gKCR7dGhyaWZ0X1ZFUlNJT05fTUFKT1J9LiR7dGhyaWZ0X1ZFUlNJT05fTUlOT1J9LiR7dGhyaWZ0X1ZFUlNJT05fUEFUQ0h9KSIpCi1tZXNzYWdlKFNUQVRVUyAiVGhyaWZ0IHBhY2thZ2UgdmVyc2lvbjogICAgICAgICAgICAgICAke1BBQ0tBR0VfVkVSU0lPTn0iKQorbWVzc2FnZShTVEFUVVMgIlRocmlmdCB2ZXJzaW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke3RocmlmdF9WRVJTSU9OfSAoJHt0aHJpZnRfVkVSU0lPTl9NQUpPUn0uJHt0aHJpZnRfVkVSU0lPTl9NSU5PUn0uJHt0aHJpZnRfVkVSU0lPTl9QQVRDSH0pIikKK21lc3NhZ2UoU1RBVFVTICJUaHJpZnQgcGFja2FnZSB2ZXJzaW9uOiAgICAgICAgICAgICAgICAgICAgICAgJHtQQUNLQUdFX1ZFUlNJT059IikKIG1lc3NhZ2UoU1RBVFVTICJCdWlsZCBjb25maWd1cmF0aW9uIFN1bW1hcnkiKQotbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgVGhyaWZ0IGNvbXBpbGVyOiAgICAgICAgICAgICAgJHtCVUlMRF9DT01QSUxFUn0iKQotbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgd2l0aCB1bml0IHRlc3RzOiAgICAgICAgICAgICAgJHtCVUlMRF9URVNUSU5HfSIpCi1tZXNzYWdlKFNUQVRVUyAiICBCdWlsZCBleGFtcGxlczogICAgICAgICAgICAgICAgICAgICAke0JVSUxEX0VYQU1QTEVTfSIpCi1tZXNzYWdlKFNUQVRVUyAiICBCdWlsZCBUaHJpZnQgbGlicmFyaWVzOiAgICAgICAgICAgICAke0JVSUxEX0xJQlJBUklFU30iKQorbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgVGhyaWZ0IGNvbXBpbGVyOiAgICAgICAgICAgICAgICAgICAgICAke0JVSUxEX0NPTVBJTEVSfSIpCittZXNzYWdlKFNUQVRVUyAiICBCdWlsZCBjb21waWxlciBwbHVnaW4gc3VwcG9ydDogICAgICAgICAgICAgICR7V0lUSF9QTFVHSU59IikKK21lc3NhZ2UoU1RBVFVTICIgIEJ1aWxkIHdpdGggdW5pdCB0ZXN0czogICAgICAgICAgICAgICAgICAgICAgJHtCVUlMRF9URVNUSU5HfSIpCitNRVNTQUdFX0RFUChIQVZFX0NPTVBJTEVSICJEaXNhYmxlZCBiZWNhdXNlIEJVSUxEX1RIUklGVD1PRkYgYW5kIG5vIHZhbGlkIFRIUklGVF9DT01QSUxFUiBpcyBnaXZlbiIpCittZXNzYWdlKFNUQVRVUyAiICBCdWlsZCBleGFtcGxlczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7QlVJTERfRVhBTVBMRVN9IikKK01FU1NBR0VfREVQKEhBVkVfQ09NUElMRVIgIkRpc2FibGVkIGJlY2F1c2UgQlVJTERfVEhSSUZUPU9GRiBhbmQgbm8gdmFsaWQgVEhSSUZUX0NPTVBJTEVSIGlzIGdpdmVuIikKK21lc3NhZ2UoU1RBVFVTICIgIEJ1aWxkIFRocmlmdCBsaWJyYXJpZXM6ICAgICAgICAgICAgICAgICAgICAgJHtCVUlMRF9MSUJSQVJJRVN9IikKIG1lc3NhZ2UoU1RBVFVTICIgTGFuZ3VhZ2UgbGlicmFyaWVzOiIpCi1tZXNzYWdlKFNUQVRVUyAiICBCdWlsZCBDKysgbGlicmFyeTogICAgICAgICAgICAgICAgICAke0JVSUxEX0NQUH0iKQotTUVTU0FHRV9ERVAoV0lUSF9DUFAgIkRpc2FibGVkIGJ5IHZpYSBXSVRIX0NDUD1PRkYiKQorbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgQysrIGxpYnJhcnk6ICAgICAgICAgICAgICAgICAgICAgICAgICAke0JVSUxEX0NQUH0iKQorTUVTU0FHRV9ERVAoV0lUSF9DUFAgIkRpc2FibGVkIGJ5IFdJVEhfQ1BQPU9GRiIpCiBNRVNTQUdFX0RFUChCb29zdF9GT1VORCAiQm9vc3QgaGVhZGVycyBtaXNzaW5nIikKLW1lc3NhZ2UoU1RBVFVTICIgIEJ1aWxkIEMgKEdMaWIpIGxpYnJhcnk6ICAgICAgICAgICAgICR7QlVJTERfQ19HTElCfSIpCi1NRVNTQUdFX0RFUChXSVRIX0NfR0xJQiAiRGlzYWJsZWQgYnkgdmlhIFdJVEhfQ19HTElCPU9GRiIpCittZXNzYWdlKFNUQVRVUyAiICAgIEMrKyBMYW5ndWFnZSBMZXZlbDogICAgICAgICAgICAgICAgICAgICAgICR7Q1hYX0xBTkdVQUdFX0xFVkVMfSIpCittZXNzYWdlKFNUQVRVUyAiICBCdWlsZCBDIChHTGliKSBsaWJyYXJ5OiAgICAgICAgICAgICAgICAgICAgICR7QlVJTERfQ19HTElCfSIpCitNRVNTQUdFX0RFUChXSVRIX0NfR0xJQiAiRGlzYWJsZWQgYnkgV0lUSF9DX0dMSUI9T0ZGIikKIE1FU1NBR0VfREVQKEdMSUJfRk9VTkQgIkdMaWIgbWlzc2luZyIpCi1tZXNzYWdlKFNUQVRVUyAiICBCdWlsZCBKYXZhIGxpYnJhcnk6ICAgICAgICAgICAgICAgICAke0JVSUxEX0pBVkF9IikKLU1FU1NBR0VfREVQKFdJVEhfSkFWQSAiRGlzYWJsZWQgYnkgdmlhIFdJVEhfSkFWQT1PRkYiKQotTUVTU0FHRV9ERVAoSkFWQV9GT1VORCAiSmF2YSBSdW50aW1lIG1pc3NpbmciKQotTUVTU0FHRV9ERVAoQU5UX0ZPVU5EICJBbnQgbWlzc2luZyIpCi1tZXNzYWdlKFNUQVRVUyAiICBCdWlsZCBQeXRob24gbGlicmFyeTogICAgICAgICAgICAgICAke0JVSUxEX1BZVEhPTn0iKQotTUVTU0FHRV9ERVAoV0lUSF9QWVRIT04gIkRpc2FibGVkIGJ5IHZpYSBXSVRIX1BZVEhPTj1PRkYiKQorbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgSmF2YSBsaWJyYXJ5OiAgICAgICAgICAgICAgICAgICAgICAgICAke0JVSUxEX0pBVkF9IikKK01FU1NBR0VfREVQKFdJVEhfSkFWQSAiRGlzYWJsZWQgYnkgV0lUSF9KQVZBPU9GRiIpCitpZihBTkRST0lEKQorICAgIE1FU1NBR0VfREVQKEdSQURMRV9GT1VORCAiR3JhZGxlIG1pc3NpbmciKQorZWxzZSgpCisgICAgTUVTU0FHRV9ERVAoSkFWQV9GT1VORCAiSmF2YSBSdW50aW1lIG1pc3NpbmciKQorICAgIE1FU1NBR0VfREVQKEdSQURMRVdfRk9VTkQgIkdyYWRsZSBXcmFwcGVyIG1pc3NpbmciKQorZW5kaWYoKQorbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgUHl0aG9uIGxpYnJhcnk6ICAgICAgICAgICAgICAgICAgICAgICAke0JVSUxEX1BZVEhPTn0iKQorTUVTU0FHRV9ERVAoV0lUSF9QWVRIT04gIkRpc2FibGVkIGJ5IFdJVEhfUFlUSE9OPU9GRiIpCiBNRVNTQUdFX0RFUChQWVRIT05MSUJTX0ZPVU5EICJQeXRob24gbGlicmFyaWVzIG1pc3NpbmciKQorbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgSGFza2VsbCBsaWJyYXJ5OiAgICAgICAgICAgICAgICAgICAgICAke0JVSUxEX0hBU0tFTEx9IikKK01FU1NBR0VfREVQKFdJVEhfSEFTS0VMTCAiRGlzYWJsZWQgYnkgV0lUSF9IQVNLRUxMPU9GRiIpCitNRVNTQUdFX0RFUChHSENfRk9VTkQgIkdIQyBtaXNzaW5nIikKK01FU1NBR0VfREVQKENBQkFMX0ZPVU5EICJDYWJhbCBtaXNzaW5nIikKIG1lc3NhZ2UoU1RBVFVTICIgTGlicmFyeSBmZWF0dXJlczoiKQotbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgc2hhcmVkIGxpYnJhcmllczogICAgICAgICAgICAgJHtXSVRIX1NIQVJFRF9MSUJ9IikKLW1lc3NhZ2UoU1RBVFVTICIgIEJ1aWxkIHN0YXRpYyBsaWJyYXJpZXM6ICAgICAgICAgICAgICR7V0lUSF9TVEFUSUNfTElCfSIpCi1tZXNzYWdlKFNUQVRVUyAiICBCdWlsZCB3aXRoIFpMSUIgc3VwcG9ydDogICAgICAgICAgICAke1dJVEhfWkxJQn0iKQotbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgd2l0aCBsaWJldmVudCBzdXBwb3J0OiAgICAgICAgJHtXSVRIX0xJQkVWRU5UfSIpCi1tZXNzYWdlKFNUQVRVUyAiICBCdWlsZCB3aXRoIFF0NCBzdXBwb3J0OiAgICAgICAgICAgICAke1dJVEhfUVQ0fSIpCi1tZXNzYWdlKFNUQVRVUyAiICBCdWlsZCB3aXRoIFF0NSBzdXBwb3J0OiAgICAgICAgICAgICAke1dJVEhfUVQ1fSIpCi1tZXNzYWdlKFNUQVRVUyAiICBCdWlsZCB3aXRoIE9wZW5TU0wgc3VwcG9ydDogICAgICAgICAke1dJVEhfT1BFTlNTTH0iKQotbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgd2l0aCBCb29zdCB0aHJlYWQgc3VwcG9ydDogICAgJHtXSVRIX0JPT1NUVEhSRUFEU30iKQotbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgd2l0aCBDKysgc3RkOjp0aHJlYWQgc3VwcG9ydDogJHtXSVRIX1NURFRIUkVBRFN9IikKK21lc3NhZ2UoU1RBVFVTICIgIEJ1aWxkIHNoYXJlZCBsaWJyYXJpZXM6ICAgICAgICAgICAgICAgICAgICAgJHtXSVRIX1NIQVJFRF9MSUJ9IikKK21lc3NhZ2UoU1RBVFVTICIgIEJ1aWxkIHN0YXRpYyBsaWJyYXJpZXM6ICAgICAgICAgICAgICAgICAgICAgJHtXSVRIX1NUQVRJQ19MSUJ9IikKK21lc3NhZ2UoU1RBVFVTICIgIEJ1aWxkIHdpdGggQm9vc3Qgc3RhdGljIGxpbmsgbGlicmFyeTogICAgICAgJHtXSVRIX0JPT1NUX1NUQVRJQ30iKQorbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgd2l0aCBDKysgc3RkOjp0aHJlYWQgc3VwcG9ydDogICAgICAgICAke1dJVEhfU1REVEhSRUFEU30iKQorbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgd2l0aCBsaWJldmVudCBzdXBwb3J0OiAgICAgICAgICAgICAgICAke1dJVEhfTElCRVZFTlR9IikKK21lc3NhZ2UoU1RBVFVTICIgIEJ1aWxkIHdpdGggT3BlblNTTCBzdXBwb3J0OiAgICAgICAgICAgICAgICAgJHtXSVRIX09QRU5TU0x9IikKK21lc3NhZ2UoU1RBVFVTICIgIEJ1aWxkIHdpdGggUXQ0IHN1cHBvcnQ6ICAgICAgICAgICAgICAgICAgICAgJHtXSVRIX1FUNH0iKQorbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgd2l0aCBRdDUgc3VwcG9ydDogICAgICAgICAgICAgICAgICAgICAke1dJVEhfUVQ1fSIpCittZXNzYWdlKFNUQVRVUyAiICBCdWlsZCB3aXRoIFpMSUIgc3VwcG9ydDogICAgICAgICAgICAgICAgICAgICR7V0lUSF9aTElCfSIpCiBtZXNzYWdlKFNUQVRVUyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpCiBlbmRtYWNybyhQUklOVF9DT05GSUdfU1VNTUFSWSkKZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL0RlZmluZVBsYXRmb3JtU3BlY2lmYy5jbWFrZSBiL2J1aWxkL2NtYWtlL0RlZmluZVBsYXRmb3JtU3BlY2lmYy5jbWFrZQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDQwZWM2MjcuLjNmMTEyYjYKLS0tIGEvYnVpbGQvY21ha2UvRGVmaW5lUGxhdGZvcm1TcGVjaWZjLmNtYWtlCisrKyBiL2J1aWxkL2NtYWtlL0RlZmluZVBsYXRmb3JtU3BlY2lmYy5jbWFrZQpAQCAtMTcsNiArMTcsOCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAorIyBVbmNvbW1lbnQgdGhpcyB0byBzaG93IHNvbWUgYmFzaWMgY21ha2UgdmFyaWFibGVzIGFib3V0IHBsYXRmb3JtcworIyBpbmNsdWRlIChOZXdQbGF0Zm9ybURlYnVnKQogCiAjIFZpc3VhbCBTdHVkaW8gc3BlY2lmaWMgb3B0aW9ucwogaWYoTVNWQykKQEAgLTM3LDYgKzM5LDcgQEAKICAgICAjIEZvciBEZWJ1ZyBidWlsZCB0eXBlcywgYXBwZW5kIGEgImQiIHRvIHRoZSBsaWJyYXJ5IG5hbWVzLgogICAgIHNldChDTUFLRV9ERUJVR19QT1NURklYICJkIiBDQUNIRSBTVFJJTkcgIlNldCBkZWJ1ZyBsaWJyYXJ5IHBvc3RmaXgiIEZPUkNFKQogICAgIHNldChDTUFLRV9SRUxFQVNFX1BPU1RGSVggIiIgQ0FDSEUgU1RSSU5HICJTZXQgcmVsZWFzZSBsaWJyYXJ5IHBvc3RmaXgiIEZPUkNFKQorICAgIHNldChDTUFLRV9SRUxXSVRIREVCSU5GT19QT1NURklYICIiIENBQ0hFIFNUUklORyAiU2V0IHJlbGVhc2UgbGlicmFyeSBwb3N0Zml4IiBGT1JDRSkKIAogICAgICMgQnVpbGQgdXNpbmcgL01UIG9wdGlvbiBpbnN0ZWFkIG9mIC9NRCBpZiB0aGUgV0lUSF9NVCBvcHRpb25zIGlzIHNldAogICAgIGlmKFdJVEhfTVQpCkBAIC00NCw5ICs0NywxMSBAQAogICAgICAgICAgICAgICAgIENNQUtFX0NYWF9GTEFHUwogICAgICAgICAgICAgICAgIENNQUtFX0NYWF9GTEFHU19ERUJVRwogICAgICAgICAgICAgICAgIENNQUtFX0NYWF9GTEFHU19SRUxFQVNFCisgICAgICAgICAgICAgICAgQ01BS0VfQ1hYX0ZMQUdTX1JFTFdJVEhERUJJTkZPCiAgICAgICAgICAgICAgICAgQ01BS0VfQ19GTEFHUwogICAgICAgICAgICAgICAgIENNQUtFX0NfRkxBR1NfREVCVUcKICAgICAgICAgICAgICAgICBDTUFLRV9DX0ZMQUdTX1JFTEVBU0UKKyAgICAgICAgICAgICAgICBDTUFLRV9DX0ZMQUdTX1JFTFdJVEhERUJJTkZPCiAgICAgICAgICAgICAgICAgKQogICAgICAgICBmb3JlYWNoKENvbXBpbGVyRmxhZyAke0NvbXBpbGVyRmxhZ3N9KQogICAgICAgICAgIHN0cmluZyhSRVBMQUNFICIvTUQiICIvTVQiICR7Q29tcGlsZXJGbGFnfSAiJHske0NvbXBpbGVyRmxhZ319IikKQEAgLTU2LDkgKzYxLDYgQEAKICAgICAgICAgc2V0KFNUQVRJQ19QT1NURklYICJtZCIgQ0FDSEUgU1RSSU5HICJTZXQgc3RhdGljIGxpYnJhcnkgcG9zdGZpeCIgRk9SQ0UpCiAgICAgZW5kaWYoV0lUSF9NVCkKIAotICAgICMgRGlzYWJsZSBXaW5kb3dzLmggZGVmaW5pdGlvbiBvZiBtYWNyb3MgZm9yIG1pbiBhbmQgbWF4Ci0gICAgYWRkX2RlZmluaXRpb25zKCItRE5PTUlOTUFYIikKLQogICAgICMgRGlzYWJsZSBib29zdCBhdXRvIGxpbmtpbmcgcHJhZ21hcyAtIGNtYWtlIGluY2x1ZGVzIHRoZSByaWdodCBmaWxlcwogICAgIGFkZF9kZWZpbml0aW9ucygiLURCT09TVF9BTExfTk9fTElCIikKIApAQCAtNjgsMjcgKzcwLDQ5IEBACiAgICAgICBtZXNzYWdlIChGQVRBTF9FUlJPUiAiV2luZG93cyBidWlsZCBkb2VzIG5vdCBzdXBwb3J0IHNoYXJlZCBsaWJyYXJ5IG91dHB1dCB5ZXQsIHBsZWFzZSBzZXQgLURXSVRIX1NIQVJFRF9MSUI9b2ZmIikKICAgICBlbmRpZigpCiAKKyAgICBhZGRfZGVmaW5pdGlvbnMoIi9NUCIpICMgcGFyYWxsZWwgYnVpbGQKKyAgICBhZGRfZGVmaW5pdGlvbnMoIi9XMyIpICMgd2FybmluZyBsZXZlbCAzCisKKyAgICAjIFZTMjAxMCBkb2VzIG5vdCBwcm92aWRlIGludHR5cGVzIHdoaWNoIHdlIG5lZWQgZm9yICJQUklkNjQiIHVzZWQgaW4gbWFueSBwbGFjZXMKKyAgICBmaW5kX3BhY2thZ2UoSW50dHlwZXMpCisgICAgaWYgKEludHR5cGVzX0ZPVU5EKQorICAgICAgaW5jbHVkZV9kaXJlY3Rvcmllcygke0lOVFRZUEVTX0lOQ0xVREVfRElSU30pCisgICAgICAjIE9wZW5TU0wgY29uZmxpY3RzIHdpdGggdGhlIGRlZmluaXRpb24gb2YgUFJJZDY0IHVubGVzcyBpdCBpcyBkZWZpbmVkIGZpcnN0CisgICAgICBhZGRfZGVmaW5pdGlvbnMoIi9GSWludHR5cGVzLmgiKQorICAgIGVuZGlmICgpCiBlbHNlaWYoVU5JWCkKICAgZmluZF9wcm9ncmFtKCBNRU1PUllDSEVDS19DT01NQU5EIHZhbGdyaW5kICkKICAgc2V0KCBNRU1PUllDSEVDS19DT01NQU5EX09QVElPTlMgIi0tZ2VuLXN1cHByZXNzaW9ucz1hbGwgLS1sZWFrLWNoZWNrPWZ1bGwiICkKICAgc2V0KCBNRU1PUllDSEVDS19TVVBQUkVTU0lPTlNfRklMRSAiJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvdmFsZ3JpbmQuc3VwcHJlc3MiICkKIGVuZGlmKCkKIAorYWRkX2RlZmluaXRpb25zKCItRF9fU1REQ19GT1JNQVRfTUFDUk9TIikKK2FkZF9kZWZpbml0aW9ucygiLURfX1NURENfTElNSVRfTUFDUk9TIikKKwogIyBXSVRIXypUSFJFQURTIHNlbGVjdHMgd2hpY2ggdGhyZWFkaW5nIGxpYnJhcnkgdG8gdXNlCi1pZihXSVRIX0JPT1NUVEhSRUFEUykKLSAgYWRkX2RlZmluaXRpb25zKCItRFVTRV9CT09TVF9USFJFQUQ9MSIpCi1lbHNlaWYoV0lUSF9TVERUSFJFQURTKQoraWYoV0lUSF9TVERUSFJFQURTKQogICBhZGRfZGVmaW5pdGlvbnMoIi1EVVNFX1NURF9USFJFQUQ9MSIpCiBlbmRpZigpCiAKLSMgR0NDIGFuZCBDbGFuZy4KLWlmKENNQUtFX0NPTVBJTEVSX0lTX0dOVUNDIE9SIENNQUtFX0NPTVBJTEVSX0lTX0dOVUNYWCBPUiBDTUFLRV9DWFhfQ09NUElMRVJfSUQgTUFUQ0hFUyAiQ2xhbmciKQotICAjIEZJWE1FIC1wZWRhbnRpYyBjYW4gbm90IGJlIHVzZWQgYXQgdGhlIG1vbWVudCBiZWNhdXNlIG9mOiBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0yNzg0Ci0gICNzZXQoQ01BS0VfQ1hYX0ZMQUdTICIke0NNQUtFX0NYWF9GTEFHU30gLXN0ZD1jKysxMSAtTzIgLVdhbGwgLVdleHRyYSAtcGVkYW50aWMiKQotICAjIEZJWE1FIGVuYWJsaW5nIGMrKzExIGJyZWFrcyBzb21lIExpbnV4IGJ1aWxkcyBvbiBUcmF2aXMgYnkgdHJpZ2dlcmluZyBhIGcrKyBidWcsIHNlZQotICAjIGh0dHBzOi8vdHJhdmlzLWNpLm9yZy9hcGFjaGUvdGhyaWZ0L2pvYnMvNTgwMTcwMjIKLSAgIyBvbiB0aGUgb3RoZXIgaGFuZCwgYm90aCBNYWNPU1ggYW5kIEZyZWVCU0QgbmVlZCBjKysxMQotICBpZigke0NNQUtFX1NZU1RFTV9OQU1FfSBNQVRDSEVTICJEYXJ3aW4iIE9SICR7Q01BS0VfU1lTVEVNX05BTUV9IE1BVENIRVMgIkZyZWVCU0QiKQotICAgIHNldChDTUFLRV9DWFhfRkxBR1MgIiR7Q01BS0VfQ1hYX0ZMQUdTfSAtc3RkPWMrKzExIC1PMiAtV2FsbCAtV2V4dHJhIikKKyMgQysrIExhbmd1YWdlIExldmVsCitzZXQoQ1hYX0xBTkdVQUdFX0xFVkVMICJDKyske0NNQUtFX0NYWF9TVEFOREFSRH0iKQoraWYgKENNQUtFX0NYWF9TVEFOREFSRF9SRVFVSVJFRCkKKyAgc3RyaW5nKENPTkNBVCBDWFhfTEFOR1VBR0VfTEVWRUwgIiR7Q1hYX0xBTkdVQUdFX0xFVkVMfSBbY29tcGlsZXIgbXVzdCBzdXBwb3J0IGl0XSIpCitlbHNlKCkKKyAgc3RyaW5nKENPTkNBVCBDWFhfTEFOR1VBR0VfTEVWRUwgIiR7Q1hYX0xBTkdVQUdFX0xFVkVMfSBbZmFsbGJhY2sgdG8gZWFybGllciBpZiBjb21waWxlciBkb2VzIG5vdCBzdXBwb3J0IGl0XSIpCitlbmRpZigpCitpZiAoQ01BS0VfQ1hYX0VYVEVOU0lPTlMpCisgIHN0cmluZyhDT05DQVQgQ1hYX0xBTkdVQUdFX0xFVkVMICIke0NYWF9MQU5HVUFHRV9MRVZFTH0gW3dpdGggY29tcGlsZXItc3BlY2lmaWMgZXh0ZW5zaW9uc10iKQorZW5kaWYoKQorCitpZiAoQ01BS0VfQ1hYX0NPTVBJTEVSX0lEIE1BVENIRVMgIkNsYW5nIikKKyAgc2V0KENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9IC1Xbm8tZGVwcmVjYXRlZC1yZWdpc3RlciIpCitlbmRpZigpCisKKyMgQnVpbGRpbmcgV0lUSF9QTFVHSU4gcmVxdWlyZXMgYm9vc3QgbWVtb3J5IG9wZXJhdGlvbnMsIGZvciBub3csIGFuZCBnY2MgPj0gNC44CitpZiAoV0lUSF9QTFVHSU4pCisgIGlmIChDTUFLRV9DWFhfQ09NUElMRVJfSUQgTUFUQ0hFUyAiR05VIiBBTkQgQ01BS0VfQ1hYX0NPTVBJTEVSX1ZFUlNJT04gVkVSU0lPTl9MRVNTICI0LjgiKQorICAgIG1lc3NhZ2UoU0VORF9FUlJPUiAiVGhyaWZ0IGNvbXBpbGVyIHBsdWctaW4gc3VwcG9ydCBpcyBub3QgcG9zc2libGUgd2l0aCBvbGRlciBnY2MgKCA8IDQuOCApIGNvbXBpbGVyIikKICAgZW5kaWYoKQogZW5kaWYoKQorCmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9GaW5kQW50LmNtYWtlIGIvYnVpbGQvY21ha2UvRmluZEFudC5jbWFrZQppbmRleCAxNmI5YWZkLi44YjAzNzFkIDEwMDY0NAotLS0gYS9idWlsZC9jbWFrZS9GaW5kQW50LmNtYWtlCisrKyBiL2J1aWxkL2NtYWtlL0ZpbmRBbnQuY21ha2UKQEAgLTE4LDggKzE4LDggQEAKICMKIAogCi0jICBBbnRfRk9VTkQgLSBzeXN0ZW0gaGFzIEFudAotIyAgQW50X0VYRUNVVEJBTEUgLSB0aGUgQW50IGV4ZWN1dGFibGUKKyMgIEFOVF9GT1VORCAtIHN5c3RlbSBoYXMgQW50CisjICBBbnRfRVhFQ1VUQUJMRSAtIHRoZSBBbnQgZXhlY3V0YWJsZQogIwogIyBJdCB3aWxsIHNlYXJjaCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgQU5UX0hPTUUgaWYgaXQgaXMgc2V0CiAKZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL0ZpbmRDYWJhbC5jbWFrZSBiL2J1aWxkL2NtYWtlL0ZpbmRDYWJhbC5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWQzMzdiCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvY21ha2UvRmluZENhYmFsLmNtYWtlCkBAIC0wLDAgKzEsMzAgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisKKyMgIENhYmFsX0ZPVU5EIC0gc3lzdGVtIGhhcyBDYWJhbAorIyAgQ2FiYWwgLSB0aGUgQ2FiYWwgZXhlY3V0YWJsZQorIworIyBJdCB3aWxsIHNlYXJjaCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgQ0FCQUxfSE9NRSBpZiBpdCBpcyBzZXQKKworaW5jbHVkZShGaW5kUGFja2FnZUhhbmRsZVN0YW5kYXJkQXJncykKKworZmluZF9wcm9ncmFtKENBQkFMIE5BTUVTIGNhYmFsIFBBVEhTICRFTlZ7SE9NRX0vLmNhYmFsL2JpbiAkRU5We0NBQkFMX0hPTUV9L2JpbikKK2ZpbmRfcGFja2FnZV9oYW5kbGVfc3RhbmRhcmRfYXJncyhDQUJBTCBERUZBVUxUX01TRyBDQUJBTCkKK21hcmtfYXNfYWR2YW5jZWQoQ0FCQUwpCmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9GaW5kR0hDLmNtYWtlIGIvYnVpbGQvY21ha2UvRmluZEdIQy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODczODQ3Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvY21ha2UvRmluZEdIQy5jbWFrZQpAQCAtMCwwICsxLDM2IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworCisjICBHSENfRk9VTkQgLSBzeXN0ZW0gaGFzIEdIQworIyAgR0hDIC0gdGhlIEdIQyBleGVjdXRhYmxlCisjICBSVU5fSEFTS0VMTF9GT1VORCAtIHN5c3RlbSBoYXMgcnVuaGFza2VsbAorIyAgUlVOX0hBU0tFTEwgLSB0aGUgcnVuaGFza2VsbCBleGVjdXRhYmxlCisjCisjIEl0IHdpbGwgc2VhcmNoIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBHSENfSE9NRSBpZiBpdCBpcyBzZXQKKworaW5jbHVkZShGaW5kUGFja2FnZUhhbmRsZVN0YW5kYXJkQXJncykKKworZmluZF9wcm9ncmFtKEdIQyBOQU1FUyBnaGMgUEFUSFMgJEVOVntHSENfSE9NRX0vYmluKQorZmluZF9wYWNrYWdlX2hhbmRsZV9zdGFuZGFyZF9hcmdzKEdIQyBERUZBVUxUX01TRyBHSEMpCittYXJrX2FzX2FkdmFuY2VkKEdIQykKKworZmluZF9wcm9ncmFtKFJVTl9IQVNLRUxMIE5BTUVTIHJ1bmhhc2tlbGwgUEFUSFMgJEVOVntHSENfSE9NRX0vYmluKQorZmluZF9wYWNrYWdlX2hhbmRsZV9zdGFuZGFyZF9hcmdzKFJVTl9IQVNLRUxMIERFRkFVTFRfTVNHIFJVTl9IQVNLRUxMKQorbWFya19hc19hZHZhbmNlZChSVU5fSEFTS0VMTCkKZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL0ZpbmRHcmFkbGUuY21ha2UgYi9idWlsZC9jbWFrZS9GaW5kR3JhZGxlLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NDVkNjkKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9jbWFrZS9GaW5kR3JhZGxlLmNtYWtlCkBAIC0wLDAgKzEsMzAgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisKKyMgIEdSQURMRV9GT1VORCAtIHN5c3RlbSBoYXMgR3JhZGxlCisjICBHUkFETEVfRVhFQ1VUQUJMRSAtIHRoZSBHcmFkbGUgZXhlY3V0YWJsZQorIworIyBJdCB3aWxsIHNlYXJjaCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgQU5UX0hPTUUgaWYgaXQgaXMgc2V0CisKK2luY2x1ZGUoRmluZFBhY2thZ2VIYW5kbGVTdGFuZGFyZEFyZ3MpCisKK2ZpbmRfcHJvZ3JhbShHUkFETEVfRVhFQ1VUQUJMRSBOQU1FUyBncmFkbGUgUEFUSFMgJEVOVntHUkFETEVfSE9NRX0vYmluIE5PX0NNQUtFX0ZJTkRfUk9PVF9QQVRIKQorZmluZF9wYWNrYWdlX2hhbmRsZV9zdGFuZGFyZF9hcmdzKEdyYWRsZSBERUZBVUxUX01TRyBHUkFETEVfRVhFQ1VUQUJMRSkKK21hcmtfYXNfYWR2YW5jZWQoR1JBRExFX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9GaW5kR3JhZGxldy5jbWFrZSBiL2J1aWxkL2NtYWtlL0ZpbmRHcmFkbGV3LmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3YmI5OTgKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9jbWFrZS9GaW5kR3JhZGxldy5jbWFrZQpAQCAtMCwwICsxLDM2IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworCisjICBHUkFETEVXX0ZPVU5EIC0gc3lzdGVtIGhhcyBHcmFkbGV3CisjICBHUkFETEVXX0VYRUNVVEFCTEUgLSB0aGUgR3JhZGxldyBleGVjdXRhYmxlCisjCisjIEl0IHdpbGwgc2VhcmNoIHRoZSBsb2NhdGlvbiBDTUFLRV9TT1VSQ0VfRElSL2xpYi9qYXZhCisKK2luY2x1ZGUoRmluZFBhY2thZ2VIYW5kbGVTdGFuZGFyZEFyZ3MpCisKK2ZpbmRfcHJvZ3JhbShHUkFETEVXX0VYRUNVVEFCTEUgZ3JhZGxldyBQQVRIUyAke0NNQUtFX1NPVVJDRV9ESVJ9L2xpYi9qYXZhIE5PX0RFRkFVTFRfUEFUSCBOT19DTUFLRV9GSU5EX1JPT1RfUEFUSCkKK2ZpbmRfcGFja2FnZV9oYW5kbGVfc3RhbmRhcmRfYXJncyhHcmFkbGV3IERFRkFVTFRfTVNHIEdSQURMRVdfRVhFQ1VUQUJMRSkKK21hcmtfYXNfYWR2YW5jZWQoR1JBRExFV19FWEVDVVRBQkxFKQorCisjIEJ1Z2d5IGZpbmRfcHJvZ3JhbSBjYW5ub3QgZmluZCBncmFkbGV3LmJhdCB3aGVuIGdyYWRsZXcgaXMgYXQgdGhlIHNhbWUgcGF0aAorIyBhbmQgZXZlbiBidWdnaWVyIGN0ZXN0IHdpbGwgbm90IGV4ZWN1dGUgZ3JhZGxldy5iYXQgd2hlbiBncmFkbGV3IGlzIGdpdmVuLgoraWYoQ01BS0VfSE9TVF9XSU4zMikKKyAgICBzdHJpbmcoUkVHRVggUkVQTEFDRSAiKC4rZ3JhZGxldykkIiAiXFwxLmJhdCIgR1JBRExFV19FWEVDVVRBQkxFICR7R1JBRExFV19FWEVDVVRBQkxFfSkKK2VuZGlmKENNQUtFX0hPU1RfV0lOMzIpCmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9GaW5kSW50dHlwZXMuY21ha2UgYi9idWlsZC9jbWFrZS9GaW5kSW50dHlwZXMuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY2MWY3OAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2NtYWtlL0ZpbmRJbnR0eXBlcy5jbWFrZQpAQCAtMCwwICsxLDQxIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyBmaW5kIG1zaW50dHlwZXMgb24gY29tcGlsZXJzIHRoYXQgZG9uJ3QgcHJvdmlkZSBpdCwgZm9yIGV4YW1wbGUKKyMgICBWUzIwMTAKKworIyBVc2FnZTogCisjIFByb3ZpZGUgSU5UVFlQRVNfUk9PVCBpZiB5b3UgbmVlZCBpdAorIyBSZXN1bHQ6IElOVFRZUEVTX0lOQ0xVREVfRElSUywgd2hlcmUgdG8gZmluZCBpbnR0eXBlcy5oCisjIFJlc3VsdDogSW50dHlwZXNfRk9VTkQsIElmIGZhbHNlLCBpbnR0eXBlcy5oIHdhcyBub3QgZm91bmQKKworZmluZF9wYXRoKElOVFRZUEVTX0lOQ0xVREVfRElSUyBpbnR0eXBlcy5oIEhJTlRTICR7SU5UVFlQRVNfUk9PVH0pCitpZiAoSU5UVFlQRVNfSU5DTFVERV9ESVJTKQorICBzZXQoSW50dHlwZXNfRk9VTkQgVFJVRSkKK2Vsc2UgKCkKKyAgc2V0KEludHR5cGVzX0ZPVU5EIEZBTFNFKQorICBpZiAoSW50dHlwZXNfRklORF9SRVFVSVJFRCkKKyAgICBtZXNzYWdlKEZBVEFMX0VSUk9SICJDb3VsZCBOT1QgZmluZCBpbnR0eXBlcy5oIikKKyAgZW5kaWYgKCkKKyAgbWVzc2FnZShTVEFUVVMgImludHR5cGVzLmggTk9UIGZvdW5kIikKK2VuZGlmICgpCisKK21hcmtfYXNfYWR2YW5jZWQoCisgIElOVFRZUEVTX0lOQ0xVREVfRElSUworKQpkaWZmIC0tZ2l0IGEvYnVpbGQvY21ha2UvRmluZExpYmV2ZW50LmNtYWtlIGIvYnVpbGQvY21ha2UvRmluZExpYmV2ZW50LmNtYWtlCmluZGV4IDFlYWMzMTUuLmFjNmEwNzggMTAwNjQ0Ci0tLSBhL2J1aWxkL2NtYWtlL0ZpbmRMaWJldmVudC5jbWFrZQorKysgYi9idWlsZC9jbWFrZS9GaW5kTGliZXZlbnQuY21ha2UKQEAgLTYsMTQgKzYsMjAgQEAKICMgTElCRVZFTlRfTElCUkFSSUVTLCBMaWJFdmVudCBsaWJyYXJpZXMKICMgTGliZXZlbnRfRk9VTkQsIElmIGZhbHNlLCBkbyBub3QgdHJ5IHRvIHVzZSBsaWJldmVudAogCi1zZXQoTGliRXZlbnRfRVhUUkFfUFJFRklYRVMgL3Vzci9sb2NhbCAvb3B0L2xvY2FsICIkRU5We0hPTUV9IikKK3NldChMSUJFVkVOVF9ST09UIENBQ0hFIFBBVEggIlJvb3QgZGlyZWN0b3J5IG9mIGxpYmV2ZW50IGluc3RhbGxhdGlvbiIpCitzZXQoTGliRXZlbnRfRVhUUkFfUFJFRklYRVMgL3Vzci9sb2NhbCAvb3B0L2xvY2FsICIkRU5We0hPTUV9IiAke0xJQkVWRU5UX1JPT1R9KQogZm9yZWFjaChwcmVmaXggJHtMaWJFdmVudF9FWFRSQV9QUkVGSVhFU30pCiAgIGxpc3QoQVBQRU5EIExpYkV2ZW50X0lOQ0xVREVfUEFUSFMgIiR7cHJlZml4fS9pbmNsdWRlIikKICAgbGlzdChBUFBFTkQgTGliRXZlbnRfTElCUkFSSUVTX1BBVEhTICIke3ByZWZpeH0vbGliIikKIGVuZGZvcmVhY2goKQogCi1maW5kX3BhdGgoTElCRVZFTlRfSU5DTFVERV9ESVJTIGV2ZW50LmggUEFUSFMgJHtMaWJFdmVudF9JTkNMVURFX1BBVEhTfSkKLWZpbmRfbGlicmFyeShMSUJFVkVOVF9MSUJSQVJJRVMgTkFNRVMgZXZlbnQgUEFUSFMgJHtMaWJFdmVudF9MSUJSQVJJRVNfUEFUSFN9KQorIyBMb29raW5nIGZvciAiZXZlbnQuaCIgd2lsbCBmaW5kIHRoZSBQbGF0Zm9ybSBTREsgaW5jbHVkZSBkaXIgb24gd2luZG93cworIyBzbyB3ZSBhbHNvIGxvb2sgZm9yIGEgcGVlciBoZWFkZXIgbGlrZSBldmh0dHAuaCB0byBnZXQgdGhlIHJpZ2h0IHBhdGgKK2ZpbmRfcGF0aChMSUJFVkVOVF9JTkNMVURFX0RJUlMgZXZodHRwLmggZXZlbnQuaCBQQVRIUyAke0xpYkV2ZW50X0lOQ0xVREVfUEFUSFN9KQorCisjICJsaWIiIHByZWZpeCBpcyBuZWVkZWQgb24gV2luZG93cyBpbiBzb21lIGNhc2VzCisjIG5ld2VyIHZlcnNpb25zIG9mIGxpYmV2ZW50IHVzZSB0aHJlZSBsaWJyYXJpZXMKK2ZpbmRfbGlicmFyeShMSUJFVkVOVF9MSUJSQVJJRVMgTkFNRVMgZXZlbnQgZXZlbnRfY29yZSBldmVudF9leHRyYSBsaWJldmVudCBQQVRIUyAke0xpYkV2ZW50X0xJQlJBUklFU19QQVRIU30pCiAKIGlmIChMSUJFVkVOVF9MSUJSQVJJRVMgQU5EIExJQkVWRU5UX0lOQ0xVREVfRElSUykKICAgc2V0KExpYmV2ZW50X0ZPVU5EIFRSVUUpCmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9OZXdQbGF0Zm9ybURlYnVnLmNtYWtlIGIvYnVpbGQvY21ha2UvTmV3UGxhdGZvcm1EZWJ1Zy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTRkMzAyCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvY21ha2UvTmV3UGxhdGZvcm1EZWJ1Zy5jbWFrZQpAQCAtMCwwICsxLDQ0IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIworIyBGb3IgZGVidWdnaW5nIG5ldyBwbGF0Zm9ybXMsIGp1c3QgdG8gc2VlIHdoYXQgc29tZSBlbnZpcm9ubWVudCBmbGFncyBhcmUuLi4KKyMKK21hY3JvKFNIT1dGTEFHIGZsYWcpCisgIG1lc3NhZ2UoU1RBVFVTICIke2ZsYWd9ID0gJHske2ZsYWd9fSIpCitlbmRtYWNybyhTSE9XRkxBRykKKworc2V0KE5FV1BMQVRGT1JNREVCVUcgT04pCisKK2lmKE5FV1BMQVRGT1JNREVCVUcpCisgIFNIT1dGTEFHKCJBUFBMRSIpCisgIFNIT1dGTEFHKCJCT1JMQU5EIikKKyAgU0hPV0ZMQUcoIkNNQUtFX0NfQ09NUElMRVJfSUQiKQorICBTSE9XRkxBRygiQ01BS0VfQ1hYX0NPTVBJTEVSX0lEIikKKyAgU0hPV0ZMQUcoIkNNQUtFX0NPTVBJTEVSX0lTX0dOVUNDIikKKyAgU0hPV0ZMQUcoIkNNQUtFX0NPTVBJTEVSX0lTX0dOVUNYWCIpCisgIFNIT1dGTEFHKCJDWUdXSU4iKQorICBTSE9XRkxBRygiTUlOR1ciKQorICBTSE9XRkxBRygiTVNWQyIpCisgIFNIT1dGTEFHKCJNU1ZDX1ZFUlNJT04iKQorICBTSE9XRkxBRygiTVNZUyIpCisgIFNIT1dGTEFHKCJVTklYIikKKyAgU0hPV0ZMQUcoIldBVENPTSIpCisgIFNIT1dGTEFHKCJXSU4zMiIpCitlbmRpZihORVdQTEFURk9STURFQlVHKQpkaWZmIC0tZ2l0IGEvYnVpbGQvY21ha2UvUkVBRE1FLU1TWVMyLm1kIGIvYnVpbGQvY21ha2UvUkVBRE1FLU1TWVMyLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3Y2FkOTIKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9jbWFrZS9SRUFETUUtTVNZUzIubWQKQEAgLTAsMCArMSw2MyBAQAorPCEtLS0KK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworIyBCdWlsZGluZyB0aHJpZnQgb24gV2luZG93cyAoTWluR1c2NC9NU1lTMikKKworVGhyaWZ0IHVzZXMgY21ha2UgdG8gbWFrZSBpdCBlYXNpZXIgdG8gYnVpbGQgdGhlIHByb2plY3Qgb24gbXVsdGlwbGUgcGxhdGZvcm1zLCBob3dldmVyIHRvIGJ1aWxkIGEgZnVsbHkgZnVuY3Rpb25hbCBhbmQgcHJvZHVjdGlvbiByZWFkeSB0aHJpZnQgb24gV2luZG93cyByZXF1aXJlcyBhIG51bWJlciBvZiB0aGlyZCBwYXJ0eSBsaWJyYXJpZXMgdG8gYmUgb2J0YWluZWQuICBPbmNlIHRoaXJkIHBhcnR5IGxpYnJhcmllcyBhcmUgcmVhZHksIHRoZSByaWdodCBjb21iaW5hdGlvbiBvZiBvcHRpb25zIG11c3QgYmUgcGFzc2VkIHRvIGNtYWtlIGluIG9yZGVyIHRvIGdlbmVyYXRlIHRoZSBjb3JyZWN0IGVudmlyb25tZW50LgorCis+IE5vdGU6IGxpYmV2ZW50IGFuZCBsaWJldmVudC1kZXZlbCBkbyBub3Qgd29yayB3aXRoIHRoaXMgdG9vbGNoYWluIGFzIHRoZXkgZG8gbm90IHByb3Blcmx5IGRldGVjdCBtaW5ndzY0IGFuZCBleHBlY3Qgc29tZSBoZWFkZXJzIHRvIGV4aXN0IHRoYXQgZG8gbm90LCBzbyB0aGUgbm9uLWJsb2NraW5nIHNlcnZlciBpcyBub3QgY3VycmVudGx5IGJ1aWx0IGludG8gdGhpcyBzb2x1dGlvbi4KKworIyMgTVNZUzIKKworRG93bmxvYWQgYW5kIGZ1bGx5IHVwZ3JhZGUgbXN5czIgZm9sbG93aW5nIHRoZSBpbnN0cnVjdGlvbnMgYXQ6CisKKyAgICBodHRwczovL21zeXMyLmdpdGh1Yi5pby8KKworSW5zdGFsbCB0aGUgbmVjZXNzYXJ5IHRvb2xjaGFpbiBpdGVtcyBmb3IgQysrOgorCisgICAgJCBwYWNtYW4gLS1uZWVkZWQgLVMgYmlzb24gZmxleCBtYWtlIG1pbmd3LXc2NC14ODZfNjQtb3BlbnNzbCBcCisgICAgICAgICAgICAgICAgbWluZ3ctdzY0LXg4Nl82NC1ib29zdCBtaW5ndy13NjQteDg2XzY0LWNtYWtlIFwKKyAgICAgICAgICAgICAgICBtaW5ndy13NjQteDg2XzY0LXRvb2xjaGFpbiBtaW5ndy13NjQteDg2XzY0LXpsaWIKKworVXBkYXRlIHlvdXIgbXN5czIgYmFzaCBwYXRoIHRvIGluY2x1ZGUgL21pbmd3NjQvYmluIGJ5IGFkZGluZyBhIGxpbmUgdG8geW91ciB+Ly5iYXNoX3Byb2ZpbGVzIHVzaW5nIHRoaXMgY29tbWFuZDoKKworICAgIGVjaG8gImV4cG9ydCBQQVRIPS9taW5ndzY0L2JpbjpcJFBBVEgiID4+IH4vLmJhc2hfcHJvZmlsZQorCitBZnRlciB0aGF0LCBjbG9zZSB5b3VyIHNoZWxsIGFuZCBvcGVuIGEgbmV3IG9uZS4KKworVXNlIGNtYWtlIHRvIGNyZWF0ZSBhIE1pbkdXIG1ha2VmaWxlLCBvdXQgb2YgdHJlZSAoYXNzdW1lcyB5b3UgYXJlIGluIHRoZSB0b3AgbGV2ZWwgb2YgdGhlIHRocmlmdCBzb3VyY2UgdHJlZSk6CisKKyAgICBta2RpciAuLi90aHJpZnQtYnVpbGQKKyAgICBjZCAuLi90aHJpZnQtYnVpbGQKKyAgICBjbWFrZSAtRyJNaW5HVyBNYWtlZmlsZXMiIC1EQ01BS0VfTUFLRV9QUk9HUkFNPS9taW5ndzY0L2Jpbi9taW5ndzMyLW1ha2UgXAorICAgICAgIC1EQ01BS0VfQ19DT01QSUxFUj14ODZfNjQtdzY0LW1pbmd3MzItZ2NjLmV4ZSBcCisgICAgICAgLURDTUFLRV9DWFhfQ09NUElMRVI9eDg2XzY0LXc2NC1taW5ndzMyLWcrKy5leGUgXAorICAgICAgIC1EV0lUSF9MSUJFVkVOVD1PRkYgXAorICAgICAgIC1EV0lUSF9TSEFSRURfTElCPU9GRiAtRFdJVEhfU1RBVElDX0xJQj1PTiBcCisgICAgICAgLURXSVRIX0pBVkE9T0ZGIC1EV0lUSF9QWVRIT049T0ZGIC1EV0lUSF9QRVJMPU9GRiBcCisgICAgICAgLi4vdGhyaWZ0CisKK0J1aWxkIHRocmlmdCAoaW5zaWRlIHRocmlmdC1idWlsZCk6CisKKyAgICBjbWFrZSAtLWJ1aWxkIC4KKworUnVuIHRoZSB0ZXN0cyAoaW5zaWRlIHRocmlmdC1idWlsZCk6CisKKyAgICBjdGVzdAorCis+IElmIHlvdSBydW4gaW50byBpc3N1ZXMsIGNoZWNrIEFwYWNoZSBKaXJhIFRIUklGVC00MDQ2IGZvciBwYXRjaGVzIHJlbGF0aW5nIHRvIE1pbkdXNjQvTVNZUzIgYnVpbGRzLgorCisjIyBUZXN0ZWQgV2l0aAorCittc3lzMiA2NC1iaXQgMjAxNi0xMC0yNiBkaXN0cmlidXRpb24KZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL1JFQURNRS5tZCBiL2J1aWxkL2NtYWtlL1JFQURNRS5tZAppbmRleCBlYmM0ZjdkLi5lNWMxMjhiIDEwMDY0NAotLS0gYS9idWlsZC9jbWFrZS9SRUFETUUubWQKKysrIGIvYnVpbGQvY21ha2UvUkVBRE1FLm1kCkBAIC0zMCw3ICszMCw3IEBACiAgICAgY21ha2UgLUcgIlZpc3VhbCBTdHVkaW8gMTIgMjAxMyBXaW42NCIgXAogICAgIC1EQk9PU1RfUk9PVD1DOi8zcmRwYXJ0eS9ib29zdF8xXzU4XzAgXAogICAgIC1EWkxJQl9ST09UPUM6LzNyZHBhcnR5L3psaWIxMjgtZGxsIFwKLSAgICAtRFdJVEhfU0hBUkVEX0xJQj1vZmYgLURXSVRIX0JPT1NUVEhSRUFEUz1PTiAuLgorICAgIC1EV0lUSF9TSEFSRURfTElCPW9mZiAuLgogCiBhbmQgb3BlbiB0aGUgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgeW91IGxpa2Ugd2l0aCB0aGUgc29sdXRpb24gb3IgZG8gdGhpczoKIApkaWZmIC0tZ2l0IGEvYnVpbGQvY21ha2UvVGhyaWZ0TWFjcm9zLmNtYWtlIGIvYnVpbGQvY21ha2UvVGhyaWZ0TWFjcm9zLmNtYWtlCmluZGV4IDI2NTY1OTguLmY4MzdmOTQgMTAwNjQ0Ci0tLSBhL2J1aWxkL2NtYWtlL1RocmlmdE1hY3Jvcy5jbWFrZQorKysgYi9idWlsZC9jbWFrZS9UaHJpZnRNYWNyb3MuY21ha2UKQEAgLTI1LDcgKzI1LDYgQEAKIAogaWYoV0lUSF9TSEFSRURfTElCKQogICAgIGFkZF9saWJyYXJ5KCR7bmFtZX0gU0hBUkVEICR7QVJHTn0pCi0gICAgI3RhcmdldF9saW5rX2xpYnJhcmllcygke25hbWV9ICR7U1lTTElCU30pCiAgICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKCR7bmFtZX0gUFJPUEVSVElFUwogICAgICAgICBPVVRQVVRfTkFNRSAke25hbWV9CiAgICAgICAgIFZFUlNJT04gJHt0aHJpZnRfVkVSU0lPTn0KQEAgLTQwLDcgKzM5LDYgQEAKIAogaWYoV0lUSF9TVEFUSUNfTElCKQogICAgIGFkZF9saWJyYXJ5KCR7bmFtZX1fc3RhdGljIFNUQVRJQyAke0FSR059KQotICAgICN0YXJnZXRfbGlua19saWJyYXJpZXMoJHtuYW1lfV9zdGF0aWMgJHtTWVNMSUJTfSkKICAgICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoJHtuYW1lfV9zdGF0aWMgUFJPUEVSVElFUwogICAgICAgICBPVVRQVVRfTkFNRSAke25hbWV9JHtTVEFUSUNfUE9TVEZJWH0KICAgICAgICAgVkVSU0lPTiAke3RocmlmdF9WRVJTSU9OfQpAQCAtNTUsNiArNTMsMTkgQEAKIGVuZG1hY3JvKEFERF9MSUJSQVJZX1RIUklGVCkKIAogCittYWNybyhUQVJHRVRfSU5DTFVERV9ESVJFQ1RPUklFU19USFJJRlQgbmFtZSkKKworaWYoV0lUSF9TSEFSRURfTElCKQorICAgIHRhcmdldF9pbmNsdWRlX2RpcmVjdG9yaWVzKCR7bmFtZX0gJHtBUkdOfSkKK2VuZGlmKCkKKworaWYoV0lUSF9TVEFUSUNfTElCKQorICAgIHRhcmdldF9pbmNsdWRlX2RpcmVjdG9yaWVzKCR7bmFtZX1fc3RhdGljICR7QVJHTn0pCitlbmRpZigpCisKK2VuZG1hY3JvKFRBUkdFVF9JTkNMVURFX0RJUkVDVE9SSUVTX1RIUklGVCkKKworCiBtYWNybyhUQVJHRVRfTElOS19MSUJSQVJJRVNfVEhSSUZUIG5hbWUpCiAKIGlmKFdJVEhfU0hBUkVEX0xJQikKQEAgLTg0LDExICs5NSwxMSBAQAogbWFjcm8oVEFSR0VUX0xJTktfTElCUkFSSUVTX1RIUklGVF9BR0FJTlNUX1RIUklGVF9MSUJSQVJZIHRhcmdldCBsaWJuYW1lKQogCiBpZihXSVRIX1NIQVJFRF9MSUIpCi0gICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKCR7dGFyZ2V0fSAke2xpYm5hbWV9KQorICAgIHRhcmdldF9saW5rX2xpYnJhcmllcygke3RhcmdldH0gJHtBUkdOfSAke2xpYm5hbWV9KQogZW5kaWYoKQogCiBpZihXSVRIX1NUQVRJQ19MSUIpCi0gICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKCR7dGFyZ2V0fV9zdGF0aWMgJHtsaWJuYW1lfV9zdGF0aWMpCisgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKCR7dGFyZ2V0fV9zdGF0aWMgJHtBUkdOfSAke2xpYm5hbWV9X3N0YXRpYykKIGVuZGlmKCkKIAogZW5kbWFjcm8oVEFSR0VUX0xJTktfTElCUkFSSUVTX1RIUklGVF9BR0FJTlNUX1RIUklGVF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvYnVpbGQvY21ha2UvYW5kcm9pZC10b29sY2hhaW4uY21ha2UgYi9idWlsZC9jbWFrZS9hbmRyb2lkLXRvb2xjaGFpbi5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWYzZDAwCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvY21ha2UvYW5kcm9pZC10b29sY2hhaW4uY21ha2UKQEAgLTAsMCArMSwyNiBAQAorc2V0KEFORFJPSURfTkRLICIvb3B0L2FuZHJvaWQtbmRrIiBDQUNIRSkKK3NldChBTkRST0lEX1BMQVRGT1JNICJhbmRyb2lkLTE1IiBDQUNIRSkKK3NldChBTkRST0lEX0FSQ0ggImFyY2gtYXJtIiBDQUNIRSkKK3NldChBTkRST0lEX1RPT0xfQVJDSCAiYW5kcm9pZC1hcm0iIENBQ0hFKQorc2V0KEFORFJPSURfQ1BVICJhcm1lYWJpLXY3YSIgQ0FDSEUpCitzZXQoQU5EUk9JRF9HQ0NfVkVSU0lPTiA0LjkgQ0FDSEUpCitzZXQoSE9TVF9BUkNIIGxpbnV4LXg4Nl82NCBDQUNIRSkKKworc2V0KENNQUtFX1NZU1RFTV9OQU1FIEFuZHJvaWQpCitzZXQoQU5EUk9JRF9TWVNST09UICIke0FORFJPSURfTkRLfS9wbGF0Zm9ybXMvJHtBTkRST0lEX1BMQVRGT1JNfS8ke0FORFJPSURfQVJDSH0iKQorc2V0KEFORFJPSURfVFJJUExFVCBhcm0tbGludXgtYW5kcm9pZGVhYmkpCitzZXQoQU5EUk9JRF9TVEwgIiR7QU5EUk9JRF9OREt9L3NvdXJjZXMvY3h4LXN0bC9nbnUtbGlic3RkKysvJHtBTkRST0lEX0dDQ19WRVJTSU9OfSIpCisKK3NldChfQ09NUElMRVJfUk9PVCAke0FORFJPSURfTkRLfS9wcmVidWlsdC8ke0FORFJPSURfVFJJUExFVH0tJHtBTkRST0lEX0dDQ19WRVJTSU9OfS9wcmVidWlsdC8ke0hPU1RfQVJDSH0pCitzZXQoQ01BS0VfQ19DT01QSUxFUiAke19DT01QSUxFUl9ST09UfS9iaW4vJHtBTkRST0lEX1RSSVBMRVR9LWdjYykKK3NldChDTUFLRV9DWENYX0NPTVBJTEVSICR7X0NPTVBJTEVSX1JPT1R9L2Jpbi8ke0FORFJPSURfVFJJUExFVH0tZysrKQorCitpbmNsdWRlX2RpcmVjdG9yaWVzKAorICAgICR7QU5EUk9JRF9TVEx9L2luY2x1ZGUKKyAgICAke0FORFJPSURfU1RMfS9saWJzLyR7QU5EUk9JRF9DUFV9L2luY2x1ZGUpCisKK3NldChDTUFLRV9GSU5EX1JPT1RfUEFUSCAke0FORFJPSURfU1lTUk9PVH0pCisKK3NldChDTUFLRV9GSU5EX1JPT1RfUEFUSF9NT0RFX1BST0dSQU0gTkVWRVIpCitzZXQoQ01BS0VfRklORF9ST09UX1BBVEhfTU9ERV9MSUJSQVJZIE9OTFkpCitzZXQoQ01BS0VfRklORF9ST09UX1BBVEhfTU9ERV9JTkNMVURFIE9OTFkpCmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9jb25maWcuaC5pbiBiL2J1aWxkL2NtYWtlL2NvbmZpZy5oLmluCmluZGV4IDE4MWVhMTguLjVmMGFlNDYgMTAwNjQ0Ci0tLSBhL2J1aWxkL2NtYWtlL2NvbmZpZy5oLmluCisrKyBiL2J1aWxkL2NtYWtlL2NvbmZpZy5oLmluCkBAIC00NCw5ICs0NCw2IEBACiAvKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBhbmQgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCiAjZGVmaW5lIFBBQ0tBR0VfU1RSSU5HICIke1BBQ0tBR0VfU1RSSU5HfSIKIAotLyogVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZSAqLwotI2RlZmluZSBWRVJTSU9OICIke1ZFUlNJT059IgotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKiogREVGSU5FUyAqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBEZWZpbmUgaWYgdGhlIEFJX0FERFJDT05GSUcgc3ltYm9sIGlzIHVuYXZhaWxhYmxlICovCkBAIC02Nyw5ICs2NCw2IEBACiAgICBzZWU6IGFjbG9jYWwvYWNfcHJvZ19iaXNvbi5tNCAqLwogI2NtYWtlZGVmaW5lIEJJU09OX1VTRV9QQVJTRVJfSF9FWFRFTlNJT04gMQogCi0vKiByZXBsYWNlcyBQT1NJWCBwdGhyZWFkIGJ5IGJvb3N0Ojp0aHJlYWQgKi8KLSNjbWFrZWRlZmluZSBVU0VfQk9PU1RfVEhSRUFEIDEKLQogLyogcmVwbGFjZXMgUE9TSVggcHRocmVhZCBieSBzdGQ6OnRocmVhZCAqLwogI2NtYWtlZGVmaW5lIFVTRV9TVERfVEhSRUFEIDEKIApAQCAtOTQsNiArODgsOSBAQAogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxuZXRpbmV0L2luLmg+IGhlYWRlciBmaWxlLiAqLwogI2NtYWtlZGVmaW5lIEhBVkVfTkVUSU5FVF9JTl9IIDEKIAorLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzaWduYWwuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9TSUdOQUxfSCAxCisKIC8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkaW50Lmg+IGhlYWRlciBmaWxlLiAqLwogI2NtYWtlZGVmaW5lIEhBVkVfU1RESU5UX0ggMQogCkBAIC0xMDMsOCArMTAwLDggQEAKIC8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8cHRocmVhZC5oPiBoZWFkZXIgZmlsZS4gKi8KICNjbWFrZWRlZmluZSBIQVZFX1BUSFJFQURfSCAxCiAKLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3RpbWUuaD4gaGVhZGVyIGZpbGUuICovCi0jY21ha2VkZWZpbmUgSEFWRV9TWVNfVElNRV9IIDEKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL2lvY3RsLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfU1lTX0lPQ1RMX0ggMQogCiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wYXJhbS5oPiBoZWFkZXIgZmlsZS4gKi8KICNjbWFrZWRlZmluZSBIQVZFX1NZU19QQVJBTV9IIDEKQEAgLTEyMSwxMiArMTE4LDE4IEBACiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy91bi5oPiBoZWFkZXIgZmlsZS4gKi8KICNjbWFrZWRlZmluZSBIQVZFX1NZU19VTl9IIDEKIAorLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxwb2xsLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfUE9MTF9IIDEKKwogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvcG9sbC5oPiBoZWFkZXIgZmlsZS4gKi8KICNjbWFrZWRlZmluZSBIQVZFX1NZU19QT0xMX0ggMQogCiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zZWxlY3QuaD4gaGVhZGVyIGZpbGUuICovCiAjY21ha2VkZWZpbmUgSEFWRV9TWVNfU0VMRUNUX0ggMQogCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90aW1lLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfU1lTX1RJTUVfSCAxCisKIC8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c2NoZWQuaD4gaGVhZGVyIGZpbGUuICovCiAjY21ha2VkZWZpbmUgSEFWRV9TQ0hFRF9IIDEKIApAQCAtMTU0LDQgKzE1Nyw0IEBACiAvKiBEZWZpbmUgdG8gMSBpZiBzdHJlcnJvcl9yIHJldHVybnMgY2hhciAqLiAqLwogI2NtYWtlZGVmaW5lIFNUUkVSUk9SX1JfQ0hBUl9QIDEKIAotI2VuZGlmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorI2VuZGlmCmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvUkVBRE1FLm1kIGIvYnVpbGQvZG9ja2VyL1JFQURNRS5tZAppbmRleCAzNzEyNjUzLi45NjZkNjkwIDEwMDY0NAotLS0gYS9idWlsZC9kb2NrZXIvUkVBRE1FLm1kCisrKyBiL2J1aWxkL2RvY2tlci9SRUFETUUubWQKQEAgLTEsMjcgKzEsMTk4IEBACi0jIEFwYWNoZSBUaHJpZnQgRG9ja2VyIGNvbnRhaW5lcnMKLUEgc2V0IG9mIGRvY2tlciBjb250YWluZXJzIHVzZWQgdG8gYnVpbGQgYW5kIHRlc3QgQXBhY2hlIFRocmlmdAorIyBEb2NrZXIgSW50ZWdyYXRpb24gIwogCi0jIyMgQXZhaWxhYmxlIENvbnRhaW5lcnMKK0R1ZSB0byB0aGUgbGFyZ2UgbnVtYmVyIG9mIGxhbmd1YWdlcyBzdXBwb3J0ZWQgYnkgQXBhY2hlIFRocmlmdCwKK2RvY2tlciBjb250YWluZXJzIGFyZSB1c2VkIHRvIGJ1aWxkIGFuZCB0ZXN0IHRoZSBwcm9qZWN0IG9uIGEKK3ZhcmlldHkgb2YgcGxhdGZvcm1zIHRvIHByb3ZpZGUgbWF4aW11bSB0ZXN0IGNvdmVyYWdlLgogCi0qIFVidW50dSAtIGJhc2VkIG9uIHVidW50dTp0cnVzdHkgKDE0LjA0KQotKiBDZW50b3MgLSBiYXNlZCBvbiBjZW50b3M6Ni42CisjIyBBcHB2ZXlvciBJbnRlZ3JhdGlvbiAjIwogCi0jIyBEZXBlbmRlbmNpZXMKK0F0IHRoaXMgdGltZSB0aGUgQXBwdmV5b3Igc2NyaXB0cyBkbyBub3QgdXNlIGRvY2tlciBjb250YWluZXJzLgorT25jZSBNaWNyb3NvZnQgc3VwcG9ydHMgVmlzdWFsIFN0dWRpbyBCdWlsZCBUb29scyBydW5uaW5nIGluc2lkZQorbmFubyBjb250YWluZXJzIChpbnN0ZWFkIG9mIENvcmUsIHdoaWNoIGlzIGh1Z2UpIHRoZW4gd2Ugd2lsbAorY29uc2lkZXIgdXNpbmcgY29udGFpbmVycyBmb3IgdGhlIFdpbmRvd3MgYnVpbGRzIGFzIHdlbGwuCiAKLSogQSB3b3JraW5nIERvY2tlciBlbnZpcm9ubWVudC4gQSBWYWdyYW50ZmlsZSBpcyBwcm92aWRlZCB3aGljaCB3aWxsIHNldHVwIGFuIFVidW50dSBob3N0IGFuZCB3b3JraW5nIERvY2tlciBlbnZpcm9ubWVudCBhcyB3ZWxsIGFzIGJ1aWxkIHRoZSBBcGFjaGUgVGhyaWZ0IERvY2tlciBjb250YWluZXIgZm9yIHRlc3RpbmcgYW5kIGRldmVsb3BtZW50CisjIyBUcmF2aXMgQ0kgSW50ZWdyYXRpb24gIyMKIAotIyMgVXNhZ2UKLUZyb20gdGhlIEFwYWNoZSBUaHJpZnQgY29kZSBiYXNlIHJvb3QKK1RoZSBUcmF2aXMgQ0kgc2NyaXB0cyB1c2UgdGhlIGZvbGxvd2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYW5kCitsb2dpYyB0byBkZXRlcm1pbmUgdGhlaXIgYmVoYXZpb3I6CiAKLSogQnVpbGQKKyMjIyBFbnZpcm9ubWVudCBWYXJpYWJsZXMgIyMjCiAKLQlkb2NrZXIgYnVpbGQgLXQgdGhyaWZ0IGJ1aWxkL2RvY2tlci91YnVudHUKK3wgVmFyaWFibGUgfCBEZWZhdWx0IHwgVXNhZ2UgfAorfCAtLS0tLS0tLSB8IC0tLS0tIHwgLS0tLS0tLSB8Cit8IGBESVNUUk9gIHwgYHVidW50dS1iaW9uaWNgIHwgU2V0IGJ5IHZhcmlvdXMgYnVpbGQgam9icyBpbiBgLnRyYXZpcy55bWxgIHRvIHJ1biBidWlsZHMgaW4gZGlmZmVyZW50IGNvbnRhaW5lcnMuICBOb3QgaW50ZW5kZWQgdG8gYmUgc2V0IGV4dGVybmFsbHkufAorfCBgRE9DS0VSX1JFUE9gIHwgYHRocmlmdC90aHJpZnQtYnVpbGRgIHwgVGhlIG5hbWUgb2YgdGhlIERvY2tlciBIdWIgcmVwb3NpdG9yeSB0byBvYnRhaW4gYW5kIHN0b3JlIGRvY2tlciBpbWFnZXMuIHwKK3wgYERPQ0tFUl9VU0VSYCB8IGA8bm9uZT5gIHwgVGhlIERvY2tlciBIdWIgYWNjb3VudCBuYW1lIGNvbnRhaW5pbmcgdGhlIHJlcG9zaXRvcnkuIHwKK3wgYERPQ0tFUl9QQVNTYCB8IGA8bm9uZT5gIHwgVGhlIERvY2tlciBIdWIgYWNjb3VudCBwYXNzd29yZCB0byB1c2Ugd2hlbiBwdXNoaW5nIG5ldyB0YWdzLiB8CiAKLQlvcgorRm9yIGV4YW1wbGUsIHRoZSBkZWZhdWx0IGRvY2tlciBpbWFnZSB0aGF0IGlzIHVzZWQgaW4gYnVpbGRzIGlmIG5vIG92ZXJyaWRlcyBhcmUgc3BlY2lmaWVkIHdvdWxkIGJlOiBgdGhyaWZ0L3RocmlmdC1idWlsZDp1YnVudHUtYmlvbmljYAogCi0JZG9ja2VyIGJ1aWxkIC10IHRocmlmdCBidWlsZC9kb2NrZXIvY2VudG9zCisjIyMgRm9ya3MgIyMjCiAKLSogUnVuCitJZiB5b3UgaGF2ZSBmb3JrZWQgdGhlIEFwYWNoZSBUaHJpZnQgcmVwb3NpdG9yeSBhbmQgeW91IHdvdWxkIGxpa2UKK3RvIHVzZSB5b3VyIG93biBEb2NrZXIgSHViIGFjY291bnQgdG8gc3RvcmUgdGhyaWZ0IGJ1aWxkIGltYWdlcywKK3lvdSBjYW4gdXNlIHRoZSBUcmF2aXMgQ0kgd2ViIGludGVyZmFjZSB0byBzZXQgdGhlIGBET0NLRVJfVVNFUmAsCitgRE9DS0VSX1BBU1NgLCBhbmQgYERPQ0tFUl9SRVBPYCB2YXJpYWJsZXMgaW4gYSBzZWN1cmUgbWFubmVyLgorWW91ciBmb3JrIGJ1aWxkcyB3aWxsIHRoZW4gcHVsbCwgcHVzaCwgYW5kIHRhZyB0aGUgZG9ja2VyIGltYWdlcworaW4geW91ciBhY2NvdW50LgogCi0JZG9ja2VyIHJ1biAtdiAkKHB3ZCk6L3RocmlmdCAtaXQgdGhyaWZ0IC9iaW4vYmFzaAorIyMjIExvZ2ljICMjIwogCitUaGUgVHJhdmlzIENJIGJ1aWxkIHJ1bnMgaW4gdHdvIHBoYXNlcyAtIGZpcnN0IHRoZSBkb2NrZXIgaW1hZ2VzIGFyZSByZWJ1aWx0Citmb3IgZWFjaCBvZiB0aGUgc3VwcG9ydGVkIGNvbnRhaW5lcnMgaWYgdGhleSBkbyBub3QgbWF0Y2ggdGhlIERvY2tlcmZpbGUgdGhhdAord2FzIHVzZWQgdG8gYnVpbGQgdGhlIG1vc3QgcmVjZW50IHRhZy4gIElmIGEgYERPQ0tFUl9QQVNTYCBlbnZpcm9ubWVudAordmFyaWFibGUgaXMgc3BlY2lmaWVkLCB0aGUgZG9ja2VyIHN0YWdlIGJ1aWxkcyB3aWxsIGF0dGVtcHQgdG8gbG9nIGludG8KK0RvY2tlciBIdWIgYW5kIHB1c2ggdGhlIHJlc3VsdGluZyB0YWdzLgorCisjIyBTdXBwb3J0ZWQgQ29udGFpbmVycyAjIworCitUaGUgVHJhdmlzIENJIChjb250aW51b3VzIGludGVncmF0aW9uKSBidWlsZHMgdXNlIHRoZSBVYnVudHUgQmlvbmljCisoMTguMDQgTFRTKSBhbmQgWGVuaWFsICgxNi4wNCBMVFMpIGltYWdlcyB0byBtYXhpbWl6ZSBsYW5ndWFnZSBsZXZlbAorY292ZXJhZ2UuCisKKyMjIyBVYnVudHUgIyMjCisKKyogYmlvbmljIChzdGFibGUsIGN1cnJlbnQpCisqIGFydGZ1bCAocHJldmlvdXMgc3RhYmxlKQorKiB4ZW5pYWwgKGxlZ2FjeSkKKworIyMgVW5zdXBwb3J0ZWQgQ29udGFpbmVycyAjIworCitUaGVzZSBjb250YWluZXJzIG1heSBiZSBpbiB2YXJpb3VzIHN0YXRlcywgYW5kIG1heSBub3QgYnVpbGQgZXZlcnl0aGluZy4KK1RoZXkgY2FuIGJlIGZvdW5kIGluIHRoZSBgb2xkL2Agc3ViZGlyZWN0b3J5LgorCisjIyMgQ2VudE9TICMjIworKiA3LjMKKyAgKiBtYWtlIGNoZWNrIGluIGxpYi9weSBtYXkgaGFuZyBpbiB0ZXN0X3NzbHNvY2tldCAtIHJvb3QgY2F1c2UgdW5rbm93bgorCisjIyMgRGViaWFuICMjIworCisqIGplc3NpZQorKiBzdHJldGNoCisgICogbWFrZSBjaGVjayBpbiBsaWIvY3BwIGZhaWxzIGR1ZSB0byBodHRwczovL3N2bi5ib29zdC5vcmcvdHJhYzEwL3RpY2tldC8xMjUwNworCisjIyBCdWlsZGluZyBsaWtlIFRyYXZpcyBDSSBkb2VzLCBsb2NhbGx5ICMjCisKK1dlIHJlY29tbWVuZCB5b3UgYnVpbGQgbG9jYWxseSB0aGUgc2FtZSB3YXkgVHJhdmlzIENJIGRvZXMsIHNvIHRoYXQgd2hlbiB5b3UKK3N1Ym1pdCB5b3VyIHB1bGwgcmVxdWVzdCB5b3Ugd2lsbCBydW4gaW50byBmZXdlciBzdXJwcmlzZXMuICBUbyBtYWtlIGl0IGEKK2xpdHRsZSBlYXNpZXIsIHB1dCB0aGUgZm9sbG93aW5nIGludG8geW91ciBgfi8uYmFzaF9hbGlhc2VzYCBmaWxlOgorCisgICAgIyBLaWxsIGFsbCBydW5uaW5nIGNvbnRhaW5lcnMuCisgICAgYWxpYXMgZG9ja2Vya2lsbGFsbD0nZG9ja2VyIGtpbGwgJChkb2NrZXIgcHMgLXEpJworCisgICAgIyBEZWxldGUgYWxsIHN0b3BwZWQgY29udGFpbmVycy4KKyAgICBhbGlhcyBkb2NrZXJjbGVhbmM9J3ByaW50ZiAiXG4+Pj4gRGVsZXRpbmcgc3RvcHBlZCBjb250YWluZXJzXG5cbiIgJiYgZG9ja2VyIHJtICQoZG9ja2VyIHBzIC1hIC1xKScKKworICAgICMgRGVsZXRlIGFsbCB1bnRhZ2dlZCBpbWFnZXMuCisgICAgYWxpYXMgZG9ja2VyY2xlYW5pPSdwcmludGYgIlxuPj4+IERlbGV0aW5nIHVudGFnZ2VkIGltYWdlc1xuXG4iICYmIGRvY2tlciBybWkgJChkb2NrZXIgaW1hZ2VzIC1xIC1mIGRhbmdsaW5nPXRydWUpJworCisgICAgIyBEZWxldGUgYWxsIHN0b3BwZWQgY29udGFpbmVycyBhbmQgdW50YWdnZWQgaW1hZ2VzLgorICAgIGFsaWFzIGRvY2tlcmNsZWFuPSdkb2NrZXJjbGVhbmMgfHwgdHJ1ZSAmJiBkb2NrZXJjbGVhbmknCisKKyAgICAjIEJ1aWxkIGEgdGhyaWZ0IGRvY2tlciBpbWFnZSAocnVuIGZyb20gdG9wIGxldmVsIG9mIGdpdCByZXBvKTogYXJndW1lbnQgIzEgaXMgaW1hZ2UgdHlwZSAodWJ1bnR1LCBjZW50b3MsIGV0YykuCisgICAgZnVuY3Rpb24gZG9ja2VyYnVpbGQKKyAgICB7CisgICAgICBkb2NrZXIgYnVpbGQgLXQgJDEgYnVpbGQvZG9ja2VyLyQxCisgICAgfQorCisgICAgIyBSdW4gYSB0aHJpZnQgZG9ja2VyIGltYWdlOiBhcmd1bWVudCAjMSBpcyBpbWFnZSB0eXBlICh1YnVudHUsIGNlbnRvcywgZXRjKS4KKyAgICBmdW5jdGlvbiBkb2NrZXJydW4KKyAgICB7CisgICAgICBkb2NrZXIgcnVuIC12ICQocHdkKTovdGhyaWZ0L3NyYyAtaXQgJDEgL2Jpbi9iYXNoCisgICAgfQorCitUaGVuLCB0byBwdWxsIGRvd24gdGhlIGN1cnJlbnQgaW1hZ2UgYmVpbmcgdXNlZCB0byBidWlsZCAodGhlIHNhbWUgd2F5CitUcmF2aXMgQ0kgZG9lcyBpdCkgLSBpZiBpdCBpcyBvdXQgb2YgZGF0ZSBpbiBhbnkgd2F5IGl0IHdpbGwgYnVpbGQgYQorbmV3IG9uZSBmb3IgeW91OgorCisgICAgdGhyaWZ0JCBET0NLRVJfUkVQTz10aHJpZnQvdGhyaWZ0LWJ1aWxkIERJU1RSTz11YnVudHUtYmlvbmljIGJ1aWxkL2RvY2tlci9yZWZyZXNoLnNoCisKK1RvIHJ1biBhbGwgdW5pdCB0ZXN0cyAoanVzdCBsaWtlIFRyYXZpcyBDSSBkb2VzKToKKworICAgIHRocmlmdCQgZG9ja2VycnVuIHVidW50dS1iaW9uaWMKKyAgICByb290QDhjYWY1NmIwY2U3YjovdGhyaWZ0L3NyYyMgYnVpbGQvZG9ja2VyL3NjcmlwdHMvYXV0b3Rvb2xzLnNoCisKK1RvIHJ1biB0aGUgY3Jvc3MgdGVzdHMgKGp1c3QgbGlrZSBUcmF2aXMgQ0kgZG9lcyk6CisKKyAgICB0aHJpZnQkIGRvY2tlcnJ1biB1YnVudHUtYmlvbmljCisgICAgcm9vdEA4Y2FmNTZiMGNlN2I6L3RocmlmdC9zcmMjIGJ1aWxkL2RvY2tlci9zY3JpcHRzL2Nyb3NzLXRlc3Quc2gKKworV2hlbiB5b3UgYXJlIGRvbmUsIHlvdSB3YW50IHRvIGNsZWFuIHVwIG9jY2FzaW9uYWxseSBzbyB0aGF0IGRvY2tlciBpc24ndCB1c2luZyBsb3RzIG9mIGV4dHJhIGRpc2sgc3BhY2U6CisKKyAgICB0aHJpZnQkIGRvY2tlcmNsZWFuCisKK1lvdSBuZWVkIHRvIHJ1biB0aGUgZG9ja2VyIGNvbW1hbmRzIGZyb20gdGhlIHJvb3Qgb2YgdGhlIGxvY2FsIGNsb25lIG9mIHRoZQordGhyaWZ0IGdpdCByZXBvc2l0b3J5IGZvciB0aGVtIHRvIHdvcmsuCisKK1doZW4geW91IGFyZSBkb25lIGluIHRoZSByb290IGRvY2tlciBzaGVsbCB5b3UgY2FuIGBleGl0YCB0byBnbyBiYWNrIHRvCit5b3VyIHVzZXIgaG9zdCBzaGVsbC4gIE9uY2UgdGhlIHVuaXQgdGVzdHMgYW5kIGNyb3NzIHRlc3QgcGFzc2VzIGxvY2FsbHksCitzdWJtaXQgdGhlIGNoYW5nZXMsIGFuZCBpZiBkZXNpcmVkIHNxdWFzaCB0aGUgcHVsbCByZXF1ZXN0IHRvIG9uZSBjb21taXQKK3RvIG1ha2UgaXQgZWFzaWVyIHRvIG1lcmdlICh0aGUgY29tbWl0dGVycyBjYW4gc3F1YXNoIGF0IGNvbW1pdCB0aW1lIG5vdwordGhhdCBHaXRIdWIgaXMgdGhlIG1hc3RlciByZXBvc2l0b3J5KS4gIE5vdyB5b3UgYXJlIGJ1aWxkaW5nIGxpa2UgVHJhdmlzIENJIGRvZXMhCisKKyMjIFJhdyBDb21tYW5kcyBmb3IgQnVpbGRpbmcgd2l0aCBEb2NrZXIgIyMKKworSWYgeW91IGRvIG5vdCB3YW50IHRvIHVzZSB0aGUgc2FtZSBzY3JpcHRzIFRyYXZpcyBDSSBkb2VzLCB5b3UgY2FuIGRvIGl0IG1hbnVhbGx5OgorCitCdWlsZCB0aGUgaW1hZ2U6CisKKyAgICB0aHJpZnQkIGRvY2tlciBidWlsZCAtdCB0aHJpZnQgYnVpbGQvZG9ja2VyL3VidW50dS1iaW9uaWMKKworT3BlbiBhIGNvbW1hbmQgcHJvbXB0IGluIHRoZSBpbWFnZToKKworICAgIHRocmlmdCQgZG9ja2VyIHJ1biAtdiAkKHB3ZCk6L3RocmlmdC9zcmMgLWl0IHRocmlmdCAvYmluL2Jhc2gKKworIyMgQ29yZSBUb29sIFZlcnNpb25zIHBlciBEb2NrZXJmaWxlICMjCisKK0xhc3QgdXBkYXRlZDogT2N0b2JlciAxLCAyMDE3CisKK3wgVG9vbCAgICAgIHwgdWJ1bnR1LXhlbmlhbCB8IHVidW50dS1iaW9uaWMgfCBOb3RlcyB8Cit8IDotLS0tLS0tLSB8IDotLS0tLS0tLS0tLS0gfCA6LS0tLS0tLS0tLS0tIHwgOi0tLS0gfAorfCBhbnQgICAgICAgfCAxLjkuNiAgICAgICAgIHwgMS4xMC4zICAgICAgICB8ICAgICAgIHwKK3wgYXV0b2NvbmYgIHwgMi42OSAgICAgICAgICB8IDIuNjkgICAgICAgICAgfCAgICAgICB8Cit8IGF1dG9tYWtlICB8IDEuMTUgICAgICAgICAgfCAxLjE1LjEgICAgICAgIHwgICAgICAgfAorfCBiaXNvbiAgICAgfCAzLjAuNCAgICAgICAgIHwgMy4wLjQgICAgICAgICB8ICAgICAgIHwKK3wgYm9vc3QgICAgIHwgMS41OC4wICAgICAgICB8IDEuNjUuMSAgICAgICAgfCAgICAgICB8Cit8IGNtYWtlICAgICB8IDMuNS4xICAgICAgICAgfCAzLjEwLjIgICAgICAgIHwgICAgICAgfAorfCBjcHBjaGVjayAgfCAxLjcyICAgICAgICAgIHwgMS44MiAgICAgICAgICB8ICAgICAgIHwKK3wgZmxleCAgICAgIHwgMi42LjAgICAgICAgICB8IDIuNi40ICAgICAgICAgfCAgICAgICB8Cit8IGxpYmM2ICAgICB8IDIuMjMgICAgICAgICAgfCAyLjI3ICAgICAgICAgIHwgZ2xpYmMgfAorfCBsaWJldmVudCAgfCAyLjAuMjEgICAgICAgIHwgMi4xLjggICAgICAgICB8ICAgICAgIHwKK3wgbGlic3RkYysrIHwgNS40LjAgICAgICAgICB8IDcuMy4wICAgICAgICAgfCAgICAgICB8Cit8IG1ha2UgICAgICB8IDQuMSAgICAgICAgICAgfCA0LjEgICAgICAgICAgIHwgICAgICAgfAorfCBvcGVuc3NsICAgfCAxLjAuMmcgICAgICAgIHwgMS4xLjBnICAgICAgICB8ICAgICAgIHwKK3wgcXQ1ICAgICAgIHwgNS41LjEgICAgICAgICB8IDUuOS41ICAgICAgICAgfCAgICAgICB8CisKKyMjIENvbXBpbGVyL0xhbmd1YWdlIFZlcnNpb25zIHBlciBEb2NrZXJmaWxlICMjCisKK3wgTGFuZ3VhZ2UgIHwgdWJ1bnR1LXhlbmlhbCB8IHVidW50dS1iaW9uaWMgfCBOb3RlcyB8Cit8IDotLS0tLS0tLSB8IDotLS0tLS0tLS0tLS0gfCA6LS0tLS0tLS0tLS0tIHwgOi0tLS0gfAorfCBhcyBvZiAgICAgfCBNYXIgMDYsIDIwMTggIHwgSmFuIDQsIDIwMTkgICB8ICAgICAgIHwKK3wgYXMzICAgICAgIHwgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgfCBOb3QgaW4gQ0kgfAorfCBDKysgZ2NjICAgfCA1LjQuMCAgICAgICAgIHwgNy4zLjAgICAgICAgICB8ICAgICAgIHwKK3wgQysrIGNsYW5nIHwgMy44ICAgICAgICAgICB8IDYuMCAgICAgICAgICAgfCAgICAgICB8Cit8IEMjIChtb25vKSB8IDQuMi4xLjAgICAgICAgfCA0LjYuMi43ICAgICAgIHwgICAgICAgfAorfCBjX2dsaWIgICAgfCAyLjQ4LjIgICAgICAgIHwgMi41Ni4wICAgICAgICB8ICAgICAgIHwKK3wgY2wgKHNiY2wpIHwgICAgICAgICAgICAgICB8IDEuNC4xNSAgICAgICAgfCAgICAgICB8Cit8IGNvY29hICAgICB8ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwgTm90IGluIENJIHwKK3wgZCAgICAgICAgIHwgMi4wNzUuMSAgICAgICB8IDIuMDgzLjEgICAgICAgfCAgICAgICB8Cit8IGRhcnQgICAgICB8IDEuMjIuMSAgICAgICAgfCAxLjI0LjMgICAgICAgIHwgICAgICAgfAorfCBkZWxwaGkgICAgfCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICB8IE5vdCBpbiBDSSB8Cit8IGRvdG5ldCAgICB8IDIuMS40ICAgICAgICAgfCAyLjIuMTAxICAgICAgIHwgICAgICAgfAorfCBlcmxhbmcgICAgfCAxOC4zICAgICAgICAgIHwgMjAuMi4yICAgICAgICB8ICAgICAgIHwKK3wgZ28gICAgICAgIHwgMS43LjYgICAgICAgICB8IDEuMTEuNCAgICAgICAgfCAgICAgICB8Cit8IGhhc2tlbGwgICB8IDcuMTAuMyAgICAgICAgfCA4LjAuMiAgICAgICAgIHwgICAgICAgfAorfCBoYXhlICAgICAgfCAzLjIuMSAgICAgICAgIHwgMy40LjQgICAgICAgICB8IFRIUklGVC00MzUyOiBhdm9pZCAzLjQuMiB8Cit8IGphdmEgICAgICB8IDEuOC4wXzE1MSAgICAgfCAxLjguMF8xOTEgICAgIHwgICAgICAgfAorfCBqcyAgICAgICAgfCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICB8IFVuc3VyZSBob3cgdG8gbG9vayBmb3IgdmVyc2lvbiBpbmZvPyB8Cit8IGx1YSAgICAgICB8IDUuMi40ICAgICAgICAgfCA1LjIuNCAgICAgICAgIHwgTHVhIDUuMzogc2VlIFRIUklGVC00Mzg2IHwKK3wgbm9kZWpzICAgIHwgNi4xMy4wICAgICAgICB8IDguMTUuMCAgICAgICAgfCAgICAgICB8Cit8IG9jYW1sICAgICB8ICAgICAgICAgICAgICAgfCA0LjA1LjAgICAgICAgIHwgVEhSSUZULTQ1MTc6IG9jYW1sIDQuMDIuMyBvbiB4ZW5pYWwgYXBwZWFycyBicm9rZW4gfAorfCBwZXJsICAgICAgfCA1LjIyLjEgICAgICAgIHwgNS4yNi4xICAgICAgICB8ICAgICAgIHwKK3wgcGhwICAgICAgIHwgNy4wLjIyICAgICAgICB8IDcuMi4xMCAgICAgICAgfCAgICAgICB8Cit8IHB5dGhvbiAgICB8IDIuNy4xMiAgICAgICAgfCAyLjcuMTVyYzEgICAgIHwgICAgICAgfAorfCBweXRob24zICAgfCAzLjUuMiAgICAgICAgIHwgMy42LjcgICAgICAgICB8ICAgICAgIHwKK3wgcnVieSAgICAgIHwgMi4zLjFwMTEyICAgICB8IDIuNS4xcDU3ICAgICAgfCAgICAgICB8Cit8IHJ1c3QgICAgICB8IDEuMTcuMCAgICAgICAgfCAxLjMwLjAgICAgICAgIHwgICAgICAgfAorfCBzbWFsbHRhbGsgfCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICB8IE5vdCBpbiBDSSB8Cit8IHN3aWZ0ICAgICB8ICAgICAgICAgICAgICAgfCA0LjIuMSAgICAgICAgIHwgICAgICAgfApkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL2NlbnRvcy9Eb2NrZXJmaWxlIGIvYnVpbGQvZG9ja2VyL2NlbnRvcy9Eb2NrZXJmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGMyNzNjLi4wMDAwMDAwCi0tLSBhL2J1aWxkL2RvY2tlci9jZW50b3MvRG9ja2VyZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotIyBBcGFjaGUgVGhyaWZ0IERvY2tlciBidWlsZCBlbnZpcm9ubWVudCBmb3IgQ2VudG9zCi0jCi0jIEtub3duIG1pc3NpbmcgY2xpZW50IGxpYnJhcmllczoKLSMgIC0gRAotIyAgLSBIYXhlCi0jICAtIEx1YQotIwotCi1GUk9NIGNlbnRvczo3Ci1NQUlOVEFJTkVSIEFwYWNoZSBUaHJpZnQgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KLQotRU5WIEhPTUUgL3Jvb3QKLQotIyBSVU4geXVtIC15IHVwZGF0ZQotCi0jIEdlbmVyYWwgZGVwZW5kZW5jaWVzCi1SVU4geXVtIC15IGluc3RhbGwgLXkgdGFyIG00IHBlcmwgZ2NjIGdpdCBsaWJ0b29sIHpsaWItZGV2ZWwgb3BlbnNzbC1kZXZlbCBhdXRvY29uZiBtYWtlIGJpc29uIGJpc29uLWRldmVsIGZsZXgKLQotUlVOIG1rZGlyIC1wIC90bXAvZXBlbCAmJiBcCi0gICAgY3VybCAtc1NMICJodHRwOi8vZGwuZmVkb3JhcHJvamVjdC5vcmcvcHViL2VwZWwvNy94ODZfNjQvZS9lcGVsLXJlbGVhc2UtNy01Lm5vYXJjaC5ycG0iIC1vIC90bXAvZXBlbC9lcGVsLXJlbGVhc2UtNy01Lm5vYXJjaC5ycG0gJiYgXAotICAgIGNkIC90bXAvZXBlbCAmJiBcCi0gICAgcnBtIC1pdmggZXBlbC1yZWxlYXNlKi5ycG0gJiYgXAotICAgIGNkICRIT01FCi0KLSMgQXV0b21ha2UKLVJVTiBta2RpciAtcCAvdG1wL2F1dG9tYWtlICYmIFwKLSAgICBjdXJsIC1TTCAiaHR0cDovL2Z0cC5nbnUub3JnL2dudS9hdXRvbWFrZS9hdXRvbWFrZS0xLjE0LnRhci5neiIgfCB0YXIgLXh6QyAvdG1wL2F1dG9tYWtlICYmIFwKLSAgICBjZCAvdG1wL2F1dG9tYWtlL2F1dG9tYWtlLTEuMTQgJiYgXAotICAgIC4vY29uZmlndXJlIC0tcHJlZml4PS91c3IgJiYgXAotICAgIG1ha2UgJiYgXAotICAgIG1ha2UgaW5zdGFsbCAmJiBcCi0gICAgY2QgJEhPTUUKLQotIyBDKysgZGVwZW5kZW5jaWVzCi1SVU4geXVtIGluc3RhbGwgLXkgbGliYm9vc3QtZGV2IGxpYmV2ZW50LWRldmVsCi0KLSMgSmF2YSBEZXBlbmRlbmNpZXMKLVJVTiB5dW0gaW5zdGFsbCAteSBhbnQganVuaXQgYW50LW5vZGVwcyBhbnQtanVuaXQgamF2YS0xLjcuMC1vcGVuamRrLWRldmVsCi0KLSMgUHl0aG9uIERlcGVuZGVuY2llcwotUlVOIHl1bSBpbnN0YWxsIC15IHB5dGhvbi1kZXZlbCBweXRob24tc2V0dXB0b29scyBweXRob24tdHdpc3RlZAotCi0jIFJ1YnkgRGVwZW5kZW5jaWVzCi1SVU4geXVtIGluc3RhbGwgLXkgcnVieSBydWJ5LWRldmVsIHJ1YnlnZW1zICYmIFwKLSAgICBnZW0gaW5zdGFsbCBidW5kbGVyIHJha2UKLQotIyBQZXJsIERlcGVuZGVuY2llcwotUlVOIHl1bSBpbnN0YWxsIC15IHBlcmwtQml0LVZlY3RvciBwZXJsLUNsYXNzLUFjY2Vzc29yIHBlcmwtRXh0VXRpbHMtTWFrZU1ha2VyIHBlcmwtVGVzdC1TaW1wbGUKLQotIyBQSFAgRGVwZW5kZW5jaWVzCi1SVU4geXVtIGluc3RhbGwgLXkgcGhwIHBocC1kZXZlbCBwaHAtcGVhciByZTJjCi0KLSMgR0xpYkMgRGVwZW5kZW5jaWVzCi1SVU4geXVtIGluc3RhbGwgLXkgZ2xpYjItZGV2ZWwKLQotIyBFcmxhbmcgRGVwZW5kZW5jaWVzCi1SVU4gY3VybCAtc1NMIGh0dHA6Ly9wYWNrYWdlcy5lcmxhbmctc29sdXRpb25zLmNvbS9ycG0vY2VudG9zL2VybGFuZ19zb2x1dGlvbnMucmVwbyAtbyAvZXRjL3l1bS5yZXBvcy5kL2VybGFuZ19zb2x1dGlvbnMucmVwbyAmJiBcCi0gICAgeXVtIGluc3RhbGwgLXkgZXJsYW5nLWtlcm5lbCBlcmxhbmctZXJ0cyBlcmxhbmctc3RkbGliIGVybGFuZy1ldW5pdCBlcmxhbmctcmViYXIKLQotIyBHbyBEZXBlbmRlbmNpZXMKLVJVTiBjdXJsIC1zU0wgaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2dvbGFuZy9nbzEuNC4yLmxpbnV4LWFtZDY0LnRhci5neiB8IHRhciAtQyAvdXNyL2xpYi8gLXh6ICYmIFwKLSAgICBta2RpciAtcCAvdXNyL3NoYXJlL2dvCi0KLUVOViBHT1JPT1QgL3Vzci9saWIvZ28KLUVOViBHT1BBVEggL3Vzci9zaGFyZS9nbwotRU5WIFBBVEggJHtHT1JPT1R9L2Jpbjoke0dPUEFUSH0vYmluOiRQQVRICi0KLSMgSGFza2VsbCBEZXBlbmRlbmNpZXMKLVJVTiB5dW0gLXkgaW5zdGFsbCBjYWJhbC1kZXYgJiYgXAotICAgIGNhYmFsIHVwZGF0ZSAmJiBcCi0gICAgY2FiYWwgaW5zdGFsbCBjYWJhbC1pbnN0YWxsICYmIFwKLSAgICBjZCAkSE9NRQotCi0jIE5vZGUuanMgRGVwZW5kZW5jaWVzCi1SVU4geXVtIGluc3RhbGwgLXkgbm9kZWpzIG5vZGVqcy1kZXZlbCBucG0KLQotIyBDIyBEZXBlbmRlbmNpZXMKLVJVTiB5dW0gaW5zdGFsbCAteSBtb25vLWNvcmUgbW9uby1kZXZlbCBtb25vLXdlYi1kZXZlbCBtb25vLWV4dHJhcyBtaW5ndzMyLWJpbnV0aWxzIG1pbmd3MzItcnVudGltZSBtaW5ndzMyLW5zaXMKLQotIyBDbGVhbiB1cAotUlVOIHJtIC1yZiAvdG1wLyogJiYgXAotICAgIHl1bSBjbGVhbiBhbGwKLQotV09SS0RJUiAkSE9NRQpkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL1ZhZ3JhbnRmaWxlIGIvYnVpbGQvZG9ja2VyL29sZC9WYWdyYW50ZmlsZQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYnVpbGQvZG9ja2VyL1ZhZ3JhbnRmaWxlCnJlbmFtZSB0byBidWlsZC9kb2NrZXIvb2xkL1ZhZ3JhbnRmaWxlCmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvb2xkL2NlbnRvcy03LjMvRG9ja2VyZmlsZSBiL2J1aWxkL2RvY2tlci9vbGQvY2VudG9zLTcuMy9Eb2NrZXJmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NmJiYWEKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9kb2NrZXIvb2xkL2NlbnRvcy03LjMvRG9ja2VyZmlsZQpAQCAtMCwwICsxLDE5OSBAQAorIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIEFwYWNoZSBUaHJpZnQgRG9ja2VyIGJ1aWxkIGVudmlyb25tZW50IGZvciBDZW50T1MKKyMKKyMgS25vd24gbWlzc2luZyBjbGllbnQgbGlicmFyaWVzOgorIyAgLSBkb3RuZXQgKHdpbGwgdXBkYXRlIHRvIDIuMC4wIHNlcGFyYXRlbHkpCisjICAtIGhheGUgKG5vdCBpbiBjZW50b3MpCisKK0ZST00gY2VudG9zOjcuMy4xNjExCitNQUlOVEFJTkVSIEFwYWNoZSBUaHJpZnQgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KKworUlVOIHl1bSBpbnN0YWxsIC15IGVwZWwtcmVsZWFzZQorCisjIEdlbmVyYWwgZGVwZW5kZW5jaWVzCitSVU4geXVtIGluc3RhbGwgLXkgXAorICAgICAgYXV0b2NvbmYgXAorICAgICAgYmlzb24gXAorICAgICAgYmlzb24tZGV2ZWwgXAorICAgICAgY2xhbmcgXAorICAgICAgY2xhbmctYW5hbHl6ZXIgXAorICAgICAgY21ha2UzIFwKKyAgICAgIGN1cmwgXAorICAgICAgZmxleCBcCisgICAgICBnY2MgXAorICAgICAgZ2NjLWMrKyBcCisgICAgICBnZGIgXAorICAgICAgZ2l0IFwKKyAgICAgIGxpYnRvb2wgXAorICAgICAgbTQgXAorICAgICAgbWFrZSBcCisgICAgICB0YXIgXAorICAgICAgdW56aXAgXAorICAgICAgdmFsZ3JpbmQgXAorICAgICAgd2dldCAmJiBcCisgICAgICBsbiAtcyAvdXNyL2Jpbi9jbWFrZTMgL3Vzci9iaW4vY21ha2UgJiYgXAorICAgICAgbG4gLXMgL3Vzci9iaW4vY3BhY2szIC91c3IvYmluL2NwYWNrICYmIFwKKyAgICAgIGxuIC1zIC91c3IvYmluL2N0ZXN0MyAvdXNyL2Jpbi9jdGVzdAorCisjIEMrKyBkZXBlbmRlbmNpZXMKK1JVTiB5dW0gaW5zdGFsbCAteSBcCisgICAgICBib29zdC1kZXZlbC1zdGF0aWMgXAorICAgICAgemxpYi1kZXZlbCBcCisgICAgICBvcGVuc3NsLWRldmVsIFwKKyAgICAgIGxpYmV2ZW50LWRldmVsICYmIFwKKyAgICBjZCAvdXNyL2xpYjY0ICYmIFwKKyAgICBsbiAtcyBsaWJib29zdF90aHJlYWQtbXQuYSBsaWJib29zdF90aHJlYWQuYQorCisjIEMjIERlcGVuZGVuY2llcworUlVOIHl1bSBpbnN0YWxsIC15IFwKKyAgICAgIG1vbm8tY29yZSBcCisgICAgICBtb25vLWRldmVsIFwKKyAgICAgIG1vbm8td2ViLWRldmVsIFwKKyAgICAgIG1vbm8tZXh0cmFzCisKKyMgRCBEZXBlbmRlbmNpZXMKK1JVTiB5dW0gaW5zdGFsbCAteSBodHRwOi8vZG93bmxvYWRzLmRsYW5nLm9yZy9yZWxlYXNlcy8yLngvMi4wNzYuMC9kbWQtMi4wNzYuMC0wLmZlZG9yYS54ODZfNjQucnBtIHhkZy11dGlscworUlVOIGN1cmwgLXNTTCBodHRwczovL2dpdGh1Yi5jb20vRC1Qcm9ncmFtbWluZy1EZWltb3Mvb3BlbnNzbC9hcmNoaXZlL21hc3Rlci50YXIuZ3p8IHRhciB4eiAmJiBcCisgICAgY3VybCAtc1NMIGh0dHBzOi8vZ2l0aHViLmNvbS9ELVByb2dyYW1taW5nLURlaW1vcy9saWJldmVudC9hcmNoaXZlL21hc3Rlci50YXIuZ3p8IHRhciB4eiAmJiBcCisgICAgbWtkaXIgLXAgL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvZGVpbW9zIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L0MgJiYgXAorICAgIG12IGxpYmV2ZW50LW1hc3Rlci9kZWltb3MvKiBvcGVuc3NsLW1hc3Rlci9kZWltb3MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9kZWltb3MvICYmIFwKKyAgICBtdiBsaWJldmVudC1tYXN0ZXIvQy8qIG9wZW5zc2wtbWFzdGVyL0MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DLyAmJiBcCisgICAgcm0gLXJmIGxpYmV2ZW50LW1hc3RlciBvcGVuc3NsLW1hc3RlcgorCisjIERhcnQKK1JVTiBjZCAvdXNyL2xvY2FsICYmIFwKKyAgICB3Z2V0IC1xIGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kYXJ0LWFyY2hpdmUvY2hhbm5lbHMvc3RhYmxlL3JlbGVhc2UvMS4yNC4yL3Nkay9kYXJ0c2RrLWxpbnV4LXg2NC1yZWxlYXNlLnppcCAmJiBcCisgICAgdW56aXAgLXEgZGFydHNkay1saW51eC14NjQtcmVsZWFzZS56aXAgJiYgXAorICAgIHJtIGRhcnRzZGstbGludXgteDY0LXJlbGVhc2UuemlwCitFTlYgUEFUSCAvdXNyL2xvY2FsL2RhcnQtc2RrL2JpbjokUEFUSAorCisjIEVybGFuZyBEZXBlbmRlbmNpZXMKK1JVTiBjdXJsIC1zU0wgaHR0cDovL3BhY2thZ2VzLmVybGFuZy1zb2x1dGlvbnMuY29tL3JwbS9jZW50b3MvZXJsYW5nX3NvbHV0aW9ucy5yZXBvIC1vIC9ldGMveXVtLnJlcG9zLmQvZXJsYW5nX3NvbHV0aW9ucy5yZXBvICYmIFwKKyAgICB5dW0gaW5zdGFsbCAteSBcCisgICAgICBlcmxhbmcta2VybmVsIFwKKyAgICAgIGVybGFuZy1lcnRzIFwKKyAgICAgIGVybGFuZy1zdGRsaWIgXAorICAgICAgZXJsYW5nLWV1bml0IFwKKyAgICAgIGVybGFuZy1yZWJhciBcCisgICAgICBlcmxhbmctdG9vbHMKKworIyBHTGliQyBEZXBlbmRlbmNpZXMKK1JVTiB5dW0gaW5zdGFsbCAteSBnbGliMi1kZXZlbAorCisjIEdvIERlcGVuZGVuY2llcworUlVOIGN1cmwgLXNTTCBodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZ29sYW5nL2dvMS45LmxpbnV4LWFtZDY0LnRhci5neiB8IHRhciAtQyAvdXNyL2xvY2FsLyAteHoKK0VOViBQQVRIIC91c3IvbG9jYWwvZ28vYmluOiRQQVRICisKKyMgSGFza2VsbCBEZXBlbmRlbmNpZXMKK1JVTiB5dW0gLXkgaW5zdGFsbCBoYXNrZWxsLXBsYXRmb3JtCisKKyMgSGF4ZSBEZXBlbmRlbmNpZXMKKyMgTm90IGluIGRlYmlhbi9zdHJldGNoCisKKyMgSmF2YSBEZXBlbmRlbmNpZXMKK1JVTiB5dW0gaW5zdGFsbCAteSBcCisgICAgICBhbnQgXAorICAgICAganVuaXQgXAorICAgICAgYW50LWp1bml0IFwKKyAgICAgIGphdmEtMS44LjAtb3Blbmpkay1kZXZlbAorCisjIEx1YSBEZXBlbmRlbmNpZXMKKyMgTHVhIGluIGVwZWwgaXMgdG9vIG9sZCAoNS4xLjQsIG5lZWQgNS4yKSBzbyB3ZSBnZXQgdGhlIGxhdGVzdAorUlVOIHl1bSBpbnN0YWxsIC15IHJlYWRsaW5lLWRldmVsICYmIFwKKyAgICB3Z2V0IC1xIGh0dHA6Ly93d3cubHVhLm9yZy9mdHAvbHVhLTUuMy40LnRhci5neiAmJiBcCisgICAgdGFyIHh6ZiBsdWEtNS4zLjQudGFyLmd6ICYmIFwKKyAgICBjZCBsdWEtNS4zLjQgJiYgXAorICAgIHNlZCAtaSAncy9DRkxBR1M9IC9DRkxBR1M9IC1mUElDIC9nJyBzcmMvTWFrZWZpbGUgJiYgXAorICAgIG1ha2UgbGludXggJiYgXAorICAgIG1ha2UgaW5zdGFsbCAmJiBcCisgICAgY2QgLi4gJiYgXAorICAgIHJtIC1yZiBsdWEtNSoKKworIyBNaW5HVyBEZXBlbmRlbmNpZXMKK1JVTiB5dW0gaW5zdGFsbCAteSBcCisgICAgICBtaW5ndzMyLWJpbnV0aWxzIFwKKyAgICAgIG1pbmd3MzItY3J0IFwKKyAgICAgIG1pbmd3MzItbnNpcworCisjIE5vZGUuanMgRGVwZW5kZW5jaWVzCisjIFdvcmsgYXJvdW5kIGVwZWwgaXNzdWUgd2hlcmUgdGhleSByZW1vdmVkIGh0dHAtcGFyc2VyIHRoYXQgbm9kZWpzIGRlcGVuZHMgb24hCitSVU4geXVtIC15IGluc3RhbGwgaHR0cHM6Ly9vcGVuc291cmNlLmVuZGEuZXUvcGFja2FnZXMvaHR0cC1wYXJzZXItMi43LjEtMy5lbDcueDg2XzY0LnJwbQorUlVOIHl1bSBpbnN0YWxsIC15IFwKKyAgICAgIG5vZGVqcyBcCisgICAgICBucG0KKworIyBPY2FtbCBEZXBlbmRlbmNpZXMKK1JVTiB5dW0gaW5zdGFsbCAteSBcCisgICAgICBvY2FtbCBcCisgICAgICBvY2FtbC1vY2FtbGRvYyAmJiBcCisgICAgd2dldCAtcSBodHRwczovL3Jhdy5naXRodWIuY29tL29jYW1sL29wYW0vbWFzdGVyL3NoZWxsL29wYW1faW5zdGFsbGVyLnNoIC1PIC0gfCBzaCAtcyAvdXNyL2xvY2FsL2JpbiAmJiBcCisgICAgb3BhbSBpbml0IC0teWVzICYmIFwKKyAgICBvcGFtIGluc3RhbGwgLS15ZXMgb2FzaXMgJiYgXAorICAgIGVjaG8gJy4gL3Jvb3QvLm9wYW0vb3BhbS1pbml0L2luaXQuc2ggPiAvZGV2L251bGwgMj4gL2Rldi9udWxsIHx8IHRydWUnID4+IH4vLmJhc2hyYworCisjIFBlcmwgRGVwZW5kZW5jaWVzCitSVU4geXVtIGluc3RhbGwgLXkgXAorICAgICAgcGVybCBcCisgICAgICBwZXJsLXZlcnNpb24gXAorICAgICAgcGVybC1CaXQtVmVjdG9yIFwKKyAgICAgIHBlcmwtQ2xhc3MtQWNjZXNzb3IgXAorICAgICAgcGVybC1FeHRVdGlscy1NYWtlTWFrZXIgXAorICAgICAgcGVybC1UZXN0LVNpbXBsZSBcCisgICAgICBwZXJsLUlPLVNvY2tldC1TU0wgXAorICAgICAgcGVybC1OZXQtU1NMZWF5IFwKKyAgICAgIHBlcmwtQ3J5cHQtU1NMZWF5CisKKyMgUEhQIERlcGVuZGVuY2llcworUlVOIHl1bSBpbnN0YWxsIC15IFwKKyAgICAgIHBocCBcCisgICAgICBwaHAtZGV2ZWwgXAorICAgICAgcGhwLXBlYXIgXAorICAgICAgcmUyYyBcCisgICAgICBwaHAtcGhwdW5pdC1QSFBVbml0IFwKKyAgICAgIGJ6aXAyCisKKyMgUHl0aG9uIERlcGVuZGVuY2llcworUlVOIHl1bSBpbnN0YWxsIC15IFwKKyAgICAgIHB5dGhvbiBcCisgICAgICBweXRob24tZGV2ZWwgXAorICAgICAgcHl0aG9uLXBpcCBcCisgICAgICBweXRob24tc2V0dXB0b29scyBcCisgICAgICBweXRob24zNCBcCisgICAgICBweXRob24zNC1kZXZlbCBcCisgICAgICBweXRob24zNC1waXAgXAorICAgICAgcHl0aG9uMzQtc2V0dXB0b29scworUlVOIHBpcDIgaW5zdGFsbCAtLXVwZ3JhZGUgcGlwCitSVU4gcGlwMiBpbnN0YWxsIC0tdXBncmFkZSBiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lIGlwYWRkcmVzcyBzZXR1cHRvb2xzIHNpeCB0b3JuYWRvIHRvcm5hZG8tdGVzdGluZyB0d2lzdGVkIHZpcnR1YWxlbnYgem9wZS1pbnRlcmZhY2UKK1JVTiBwaXAzIGluc3RhbGwgLS11cGdyYWRlIHBpcAorUlVOIHBpcDMgaW5zdGFsbCAtLXVwZ3JhZGUgYmFja3BvcnRzLnNzbF9tYXRjaF9ob3N0bmFtZSBpcGFkZHJlc3Mgc2V0dXB0b29scyBzaXggdG9ybmFkbyB0b3JuYWRvLXRlc3RpbmcgdHdpc3RlZCB2aXJ0dWFsZW52IHpvcGUtaW50ZXJmYWNlCisKKyMgUnVieSBEZXBlbmRlbmNpZXMKK1JVTiB5dW0gaW5zdGFsbCAteSBcCisgICAgICBydWJ5IFwKKyAgICAgIHJ1YnktZGV2ZWwgXAorICAgICAgcnVieWdlbXMgJiYgXAorICAgIGdlbSBpbnN0YWxsIGJ1bmRsZXIgcmFrZQorCisjIFJ1c3QKK1JVTiBjdXJsIGh0dHBzOi8vc2gucnVzdHVwLnJzIC1zU2YgfCBzaCAtcyAtLSAteSAtLWRlZmF1bHQtdG9vbGNoYWluIDEuMTcuMAorRU5WIFBBVEggL3Jvb3QvLmNhcmdvL2JpbjokUEFUSAorCisjIENsZWFuIHVwCitSVU4gcm0gLXJmIC90bXAvKiAmJiBcCisgICAgeXVtIGNsZWFuIGFsbAorCitFTlYgVEhSSUZUX1JPT1QgL3RocmlmdAorUlVOIG1rZGlyIC1wICRUSFJJRlRfUk9PVC9zcmMKK0NPUFkgRG9ja2VyZmlsZSAkVEhSSUZUX1JPT1QvCitXT1JLRElSICRUSFJJRlRfUk9PVC9zcmMKZGlmZiAtLWdpdCBhL2J1aWxkL2RvY2tlci9vbGQvZGViaWFuLWplc3NpZS9Eb2NrZXJmaWxlIGIvYnVpbGQvZG9ja2VyL29sZC9kZWJpYW4tamVzc2llL0RvY2tlcmZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JjNzRmYwotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2RvY2tlci9vbGQvZGViaWFuLWplc3NpZS9Eb2NrZXJmaWxlCkBAIC0wLDAgKzEsMjA0IEBACisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgQXBhY2hlIFRocmlmdCBEb2NrZXIgYnVpbGQgZW52aXJvbm1lbnQgZm9yIERlYmlhbgorIworIyBLbm93biBtaXNzaW5nIGNsaWVudCBsaWJyYXJpZXM6CisjICAtIGRvdG5ldGNvcmUKKyMgIC0gcnVzdAorCitGUk9NIGJ1aWxkcGFjay1kZXBzOmplc3NpZS1zY20KK01BSU5UQUlORVIgQXBhY2hlIFRocmlmdCA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPgorCitFTlYgREVCSUFOX0ZST05URU5EIG5vbmludGVyYWN0aXZlCisKKyMgQWRkIGFwdCBzb3VyY2VzCisjIGplc3NpZS1iYWNrcG9ydHMgZm9yIGNtYWtlIGFuZCBzb21lIHJ1YnkgYml0cworUlVOIGVjaG8gImRlYiBodHRwOi8vZnRwLmRlYmlhbi5vcmcvZGViaWFuIGplc3NpZS1iYWNrcG9ydHMgbWFpbiIgPiAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9qZXNzaWUtYmFja3BvcnRzLmxpc3QKKworIyBEYXJ0CitSVU4gY3VybCBodHRwczovL2RsLXNzbC5nb29nbGUuY29tL2xpbnV4L2xpbnV4X3NpZ25pbmdfa2V5LnB1YiB8IGFwdC1rZXkgYWRkIC0gJiYgXAorICAgIGN1cmwgaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkLmRhcnRsYW5nLm9yZy9saW51eC9kZWJpYW4vZGFydF9zdGFibGUubGlzdCA+IC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2RhcnRfc3RhYmxlLmxpc3QgJiYgXAorICAgIHNlZCAtaSAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9kYXJ0X3N0YWJsZS5saXN0IC1lICdzL2h0dHBzOi9odHRwOi9nJworCitSVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEdlbmVyYWwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBiaXNvbiBcCisgICAgICBidWlsZC1lc3NlbnRpYWwgXAorICAgICAgY2xhbmcgXAorICAgICAgZGViaGVscGVyIFwKKyAgICAgIGZsZXggXAorICAgICAgcGtnLWNvbmZpZyAmJiBcCisgICAgYXB0LWdldCAtdCBqZXNzaWUtYmFja3BvcnRzIGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgY21ha2UKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBDKysgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJib29zdC1kZXYgXAorICAgICAgbGliYm9vc3QtZmlsZXN5c3RlbS1kZXYgXAorICAgICAgbGliYm9vc3QtcHJvZ3JhbS1vcHRpb25zLWRldiBcCisgICAgICBsaWJib29zdC1zeXN0ZW0tZGV2IFwKKyAgICAgIGxpYmJvb3N0LXRlc3QtZGV2IFwKKyAgICAgIGxpYmJvb3N0LXRocmVhZC1kZXYgXAorICAgICAgbGliZXZlbnQtZGV2IFwKKyAgICAgIGxpYnNzbC1kZXYgXAorICAgICAgcXQ1LWRlZmF1bHQgXAorICAgICAgcXRiYXNlNS1kZXYgXAorICAgICAgcXRiYXNlNS1kZXYtdG9vbHMKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBKYXZhIGRlcGVuZGVuY2llc2AgXAorICAgICAgYW50IFwKKyAgICAgIGFudC1vcHRpb25hbCBcCisgICAgICBvcGVuamRrLTctamRrIFwKKyAgICAgIG1hdmVuCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUHl0aG9uIGRlcGVuZGVuY2llc2AgXAorICAgICAgcHl0aG9uLWFsbCBcCisgICAgICBweXRob24tYWxsLWRiZyBcCisgICAgICBweXRob24tYWxsLWRldiBcCisgICAgICBweXRob24tcGlwIFwKKyAgICAgIHB5dGhvbi1zZXR1cHRvb2xzIFwKKyAgICAgIHB5dGhvbi10d2lzdGVkIFwKKyAgICAgIHB5dGhvbi16b3BlLmludGVyZmFjZSBcCisgICAgICBweXRob24zLWFsbCBcCisgICAgICBweXRob24zLWFsbC1kYmcgXAorICAgICAgcHl0aG9uMy1hbGwtZGV2IFwKKyAgICAgIHB5dGhvbjMtc2V0dXB0b29scyBcCisgICAgICBweXRob24zLXBpcAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFJ1YnkgZGVwZW5kZW5jaWVzYCBcCisgICAgICBydWJ5IFwKKyAgICAgIHJ1YnktZGV2IFwKK2AjIFBlcmwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJiaXQtdmVjdG9yLXBlcmwgXAorICAgICAgbGliY2xhc3MtYWNjZXNzb3ItY2xhc3MtcGVybCBcCisgICAgICBsaWJjcnlwdC1zc2xlYXktcGVybCBcCisgICAgICBsaWJpby1zb2NrZXQtc3NsLXBlcmwgXAorICAgICAgbGlibmV0LXNzbGVheS1wZXJsCisKK1JVTiBhcHQtZ2V0IC10IGplc3NpZS1iYWNrcG9ydHMgaW5zdGFsbCAteSBydWJ5LWJ1bmRsZXIKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUGhwIGRlcGVuZGVuY2llc2AgXAorICAgICAgcGhwNSBcCisgICAgICBwaHA1LWRldiBcCisgICAgICBwaHA1LWNsaSBcCisgICAgICBwaHAtcGVhciBcCisgICAgICByZTJjIFwKKyAgICAgIHBocHVuaXQgXAorYCMgR2xpYkMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJnbGliMi4wLWRldgorCitSVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEVybGFuZyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGVybGFuZy1iYXNlIFwKKyAgICAgIGVybGFuZy1ldW5pdCBcCisgICAgICBlcmxhbmctZGV2IFwKKyAgICAgIGVybGFuZy10b29scyBcCisgICAgICByZWJhcgorCitSVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEhhc2tlbGwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBnaGMgXAorICAgICAgY2FiYWwtaW5zdGFsbCBcCitgIyBIYXhlIGRlcGVuZGVuY2llc2AgXAorICAgICAgbmVrbyBcCisgICAgICBuZWtvLWRldiBcCisgICAgICBsaWJuZWtvMAorCitSVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIE5vZGUuanMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBub2RlanMgXAorICAgICAgbm9kZWpzLWRldiBcCisgICAgICBub2RlanMtbGVnYWN5IFwKKyAgICAgIG5wbQorCitSVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIENTaGFycCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYm1vbm8tc3lzdGVtLXdlYjIuMC1jaWwgXAorICAgICAgbW9uby1kZXZlbAorCitSVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEQgZGVwZW5kZW5jaWVzYCBcCisgICAgICB4ZGctdXRpbHMgXAorYCMgRGFydCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGRhcnQgXAorYCMgTHVhIGRlcGVuZGVuY2llc2AgXAorICAgICAgbHVhNS4yIFwKKyAgICAgIGx1YTUuMi1kZXYgXAorYCMgTWluR1cgZGVwZW5kZW5jaWVzYCBcCisgICAgICBtaW5ndzMyIFwKKyAgICAgIG1pbmd3MzItYmludXRpbHMgXAorYCMgICAgICBtaW5ndzMyLXJ1bnRpbWVgIFwKKyAgICAgIG5zaXMgXAorYCMgQ2xlYW4gdXBgIFwKKyAgICAmJiBybSAtcmYgL3Zhci9jYWNoZS9hcHQvKiAmJiBcCisgICAgcm0gLXJmIC92YXIvbGliL2FwdC9saXN0cy8qICYmIFwKKyAgICBybSAtcmYgL3RtcC8qICYmIFwKKyAgICBybSAtcmYgL3Zhci90bXAvKgorCisjIFJ1YnkKK1JVTiBnZW0gaW5zdGFsbCBidW5kbGVyIC0tbm8tcmkgLS1uby1yZG9jCisKKyMgUHl0aG9uIG9wdGlvbmFsIGRlcGVuZGVuY2llcworUlVOIHBpcDIgaW5zdGFsbCAtVSBpcGFkZHJlc3MgYmFja3BvcnRzLnNzbF9tYXRjaF9ob3N0bmFtZSB0b3JuYWRvCitSVU4gcGlwMyBpbnN0YWxsIC1VIGJhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUgdG9ybmFkbworCisjIEdvCitSVU4gY3VybCAtc1NMIGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9nb2xhbmcvZ28xLjQuMy5saW51eC1hbWQ2NC50YXIuZ3ogfCB0YXIgLUMgL3Vzci9sb2NhbC8gLXh6CitFTlYgUEFUSCAvdXNyL2xvY2FsL2dvL2JpbjokUEFUSAorCisjIEhheGUKK1JVTiBta2RpciAtcCAvdXNyL2xpYi9oYXhlICYmIFwKKyAgICB3Z2V0IC1PIC0gaHR0cHM6Ly9naXRodWIuY29tL0hheGVGb3VuZGF0aW9uL2hheGUvcmVsZWFzZXMvZG93bmxvYWQvMy4yLjEvaGF4ZS0zLjIuMS1saW51eDY0LnRhci5neiB8IFwKKyAgICB0YXIgLUMgL3Vzci9saWIvaGF4ZSAtLXN0cmlwLWNvbXBvbmVudHM9MSAteHogJiYgXAorICAgIGxuIC1zIC91c3IvbGliL2hheGUvaGF4ZSAvdXNyL2Jpbi9oYXhlICYmIFwKKyAgICBsbiAtcyAvdXNyL2xpYi9oYXhlL2hheGVsaWIgL3Vzci9iaW4vaGF4ZWxpYiAmJiBcCisgICAgbWtkaXIgLXAgL3Vzci9saWIvaGF4ZS9saWIgICYmIFwKKyAgICBjaG1vZCAtUiA3NzcgL3Vzci9saWIvaGF4ZS9saWIgJiYgXAorICAgIGhheGVsaWIgc2V0dXAgL3Vzci9saWIvaGF4ZS9saWIgJiYgXAorICAgIGhheGVsaWIgaW5zdGFsbCBoeGNwcAorCisjIEQKK1JVTiBjdXJsIC1zU0wgaHR0cDovL2Rvd25sb2Fkcy5kbGFuZy5vcmcvcmVsZWFzZXMvMi54LzIuMDcwLjAvZG1kXzIuMDcwLjAtMF9hbWQ2NC5kZWIgLW8gL3RtcC9kbWRfMi4wNzAuMC0wX2FtZDY0LmRlYiAmJiBcCisgICAgZHBrZyAtaSAvdG1wL2RtZF8yLjA3MC4wLTBfYW1kNjQuZGViICYmIFwKKyAgICBybSAvdG1wL2RtZF8yLjA3MC4wLTBfYW1kNjQuZGViICYmIFwKKyAgICBjdXJsIC1zU0wgaHR0cHM6Ly9naXRodWIuY29tL0QtUHJvZ3JhbW1pbmctRGVpbW9zL29wZW5zc2wvYXJjaGl2ZS9tYXN0ZXIudGFyLmd6fCB0YXIgeHogJiYgXAorICAgIGN1cmwgLXNTTCBodHRwczovL2dpdGh1Yi5jb20vRC1Qcm9ncmFtbWluZy1EZWltb3MvbGliZXZlbnQvYXJjaGl2ZS9tYXN0ZXIudGFyLmd6fCB0YXIgeHogJiYgXAorICAgIG1rZGlyIC1wIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcyAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DICYmIFwKKyAgICBtdiBsaWJldmVudC1tYXN0ZXIvZGVpbW9zLyogb3BlbnNzbC1tYXN0ZXIvZGVpbW9zLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvZGVpbW9zLyAmJiBcCisgICAgbXYgbGliZXZlbnQtbWFzdGVyL0MvKiBvcGVuc3NsLW1hc3Rlci9DLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvQy8gJiYgXAorICAgIHJtIC1yZiBsaWJldmVudC1tYXN0ZXIgb3BlbnNzbC1tYXN0ZXIgJiYgXAorICAgIGVjaG8gJ2djYyAtV2wsLS1uby1hcy1uZWVkZWQgJConID4gL3Vzci9sb2NhbC9iaW4vZ2NjLWRtZCAmJiBcCisgICAgY2htb2QgNzU1IC91c3IvbG9jYWwvYmluL2djYy1kbWQgJiYgXAorICAgIGVjaG8gJ0NDPS91c3IvbG9jYWwvYmluL2djYy1kbWQnID4+IC9ldGMvZG1kLmNvbmYKKworIyBEYXJ0CitFTlYgUEFUSCAvdXNyL2xpYi9kYXJ0L2JpbjokUEFUSAorCisjIE9DYW1sCitSVU4gZWNobyAnZGViIGh0dHA6Ly9wcGEubGF1bmNocGFkLm5ldC9hdnNtL3BwYS91YnVudHUgdHJ1c3R5IG1haW4nID4gL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvYXZzbS1vZmZpY2lhbC1vY2FtbC5saXN0ICYmIFwKKyAgICBncGcgLS1rZXlzZXJ2ZXIga2V5c2VydmVyLnVidW50dS5jb20gLS1yZWN2IDYxNzA3QjA5ICYmIFwKKyAgICBncGcgLS1leHBvcnQgLS1hcm1vciA2MTcwN0IwOSB8IGFwdC1rZXkgYWRkIC0gJiYgXAorICAgIGFwdC1nZXQgdXBkYXRlICYmIFwKKyAgICBhcHQtZ2V0IGluc3RhbGwgLXkgb2NhbWwgb3BhbSAmJiBcCisgICAgb3BhbSBpbml0ICYmIFwKKyAgICBvcGFtIGluc3RhbGwgb2FzaXMKKworIyBGb3JjZSB1dGY4IGxvY2FsZSB0byBzdWNjZXNzZnVsbHkgYnVpbGQgSGFza2VsbCB0Zi1yYW5kb20KK0VOViBMQ19BTEwgQy5VVEYtOAorCitFTlYgVEhSSUZUX1JPT1QgL3RocmlmdAorUlVOIG1rZGlyIC1wICRUSFJJRlRfUk9PVC9zcmMKK0NPUFkgRG9ja2VyZmlsZSAkVEhSSUZUX1JPT1QvCitXT1JLRElSICRUSFJJRlRfUk9PVC9zcmMKZGlmZiAtLWdpdCBhL2J1aWxkL2RvY2tlci9vbGQvZGViaWFuLXN0cmV0Y2gvRG9ja2VyZmlsZSBiL2J1aWxkL2RvY2tlci9vbGQvZGViaWFuLXN0cmV0Y2gvRG9ja2VyZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDNlZWNkCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZG9ja2VyL29sZC9kZWJpYW4tc3RyZXRjaC9Eb2NrZXJmaWxlCkBAIC0wLDAgKzEsMjMxIEBACisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgQXBhY2hlIFRocmlmdCBEb2NrZXIgYnVpbGQgZW52aXJvbm1lbnQgZm9yIERlYmlhbiBTdHJldGNoCisjCisjIEtub3duIGlzc3VlczoKKyMgLSBkOiBkZWltb3MgZm9yIGxpYmV2ZW50IGFuZCBvcGVuc3NsIGRpc2FibGVkIC0gYnVpbGQgZXJyb3JzCisjIC0gZG90bmV0Y29yZSwgYmVjYXVzZSBuZXRjb3JlIGlzIGZvciAxLjAuMC1wcmV2aWV3IGFuZCAyLjAuMCBpcyBvdXQKKyMgLSBydXN0OiBjYXJnbyBub3QgaW4gZGViaWFuIHJlcG8gLSBwZXJoYXBzIG5vdCBuZWVkZWQ/CisKK0ZST00gYnVpbGRwYWNrLWRlcHM6c3RyZXRjaC1zY20KK01BSU5UQUlORVIgQXBhY2hlIFRocmlmdCA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPgorCitFTlYgREVCSUFOX0ZST05URU5EIG5vbmludGVyYWN0aXZlCisKKyMjIyBBZGQgYXB0IHJlcG9zCisKK1JVTiBhcHQtZ2V0IHVwZGF0ZSAmJiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgYXB0IGFwdC10cmFuc3BvcnQtaHR0cHMgY3VybCB3Z2V0IGFwdC11dGlscworCisjIEQKK1JVTiB3Z2V0IGh0dHA6Ly9tYXN0ZXIuZGwuc291cmNlZm9yZ2UubmV0L3Byb2plY3QvZC1hcHQvZmlsZXMvZC1hcHQubGlzdCAtTyAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9kLWFwdC5saXN0ICYmIFwKKyAgICBhcHQtZ2V0IHVwZGF0ZSAmJiBhcHQtZ2V0IC15IC0tYWxsb3ctdW5hdXRoZW50aWNhdGVkIGluc3RhbGwgLS1yZWluc3RhbGwgZC1hcHQta2V5cmluZworCisjIERhcnQKK1JVTiBjdXJsIGh0dHBzOi8vZGwtc3NsLmdvb2dsZS5jb20vbGludXgvbGludXhfc2lnbmluZ19rZXkucHViIHwgYXB0LWtleSBhZGQgLSAmJiBcCisgICAgY3VybCBodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQuZGFydGxhbmcub3JnL2xpbnV4L2RlYmlhbi9kYXJ0X3N0YWJsZS5saXN0ID4gL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvZGFydF9zdGFibGUubGlzdCAmJiBcCisgICAgc2VkIC1pIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2RhcnRfc3RhYmxlLmxpc3QgLWUgJ3MvaHR0cHM6L2h0dHA6L2cnCisKKyMgZG90bmV0IChjb3JlKSAyLjAuMCAtIHByb2plY3QgaXNuJ3QgcmVhZHkgZm9yIHRoaXMgeWV0OgorIyBSVU4gY3VybCBodHRwczovL3BhY2thZ2VzLm1pY3Jvc29mdC5jb20va2V5cy9taWNyb3NvZnQuYXNjIHwgZ3BnIC0tZGVhcm1vciA+IC9ldGMvYXB0L3RydXN0ZWQuZ3BnLmQvbWljcm9zb2Z0LmdwZyAmJiBcCisjICAgICBlY2hvICJkZWIgW2FyY2g9YW1kNjRdIGh0dHBzOi8vcGFja2FnZXMubWljcm9zb2Z0LmNvbS9yZXBvcy9taWNyb3NvZnQtdWJ1bnR1LXhlbmlhbC1wcm9kIHhlbmlhbCBtYWluIiA+IC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2RvdG5ldGRldi5saXN0CisKKyMgbm9kZS5qcyAodGhpcyBzdGVwIHJ1bnMgYXB0LWdldCB1cGRhdGUgaW50ZXJuYWxseSkKK1JVTiBjdXJsIC1zTCBodHRwczovL2RlYi5ub2Rlc291cmNlLmNvbS9zZXR1cF84LnggfCBiYXNoCisKKworIyMjIGluc3RhbGwgZ2VuZXJhbCBkZXBlbmRlbmNpZXMKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgR2VuZXJhbCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGJhc2gtY29tcGxldGlvbiBcCisgICAgICBiaXNvbiBcCisgICAgICBidWlsZC1lc3NlbnRpYWwgXAorICAgICAgY2xhbmcgXAorICAgICAgY21ha2UgXAorICAgICAgZGViaGVscGVyIFwKKyAgICAgIGZsZXggXAorICAgICAgZ2RiIFwKKyAgICAgIG5pbmphLWJ1aWxkIFwKKyAgICAgIHBrZy1jb25maWcgXAorICAgICAgdmFsZ3JpbmQgXAorICAgICAgdmltCisKKworIyMjIGxhbmd1YWdlcworCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEMrKyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYmJvb3N0LWRldiBcCisgICAgICBsaWJib29zdC1maWxlc3lzdGVtLWRldiBcCisgICAgICBsaWJib29zdC1wcm9ncmFtLW9wdGlvbnMtZGV2IFwKKyAgICAgIGxpYmJvb3N0LXN5c3RlbS1kZXYgXAorICAgICAgbGliYm9vc3QtdGVzdC1kZXYgXAorICAgICAgbGliYm9vc3QtdGhyZWFkLWRldiBcCisgICAgICBsaWJldmVudC1kZXYgXAorICAgICAgbGlic3NsLWRldiBcCisgICAgICBxdDUtZGVmYXVsdCBcCisgICAgICBxdGJhc2U1LWRldiBcCisgICAgICBxdGJhc2U1LWRldi10b29scworCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIGNzaGFycCAobW9ubykgZGVwZW5kZW5jaWVzYCBcCisgICAgICBtb25vLWRldmVsCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgRCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGRtZC1iaW4gXAorICAgICAgbGliZXZlbnQtZGV2IFwKKyAgICAgIGxpYnNzbC1kZXYgXAorICAgICAgeGRnLXV0aWxzCisjIGxpYmV2ZW50IGRlaW1vcyBkaXNhYmxlZCAtIGJ1aWxkIGVycm9ycworIyBSVU4gbWtkaXIgLXAgL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvZGVpbW9zIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L0MgJiYgXAorIyAgICAgY3VybCAtc1NMIGh0dHBzOi8vZ2l0aHViLmNvbS9ELVByb2dyYW1taW5nLURlaW1vcy9saWJldmVudC9hcmNoaXZlL21hc3Rlci50YXIuZ3p8IHRhciB4eiAmJiBcCisjICAgICBtdiBsaWJldmVudC1tYXN0ZXIvZGVpbW9zLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvZGVpbW9zLyAmJiBcCisjICAgICBtdiBsaWJldmVudC1tYXN0ZXIvQy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L0MvICYmIFwKKyMgICAgIHJtIC1yZiBsaWJldmVudC1tYXN0ZXIKKyMgb3BlbnNzbCBkZWltb3MgZG9lc24ndCB3b3JrIHdpdGggb3BlbnNzbC0xLjEuMCAtIGRpc2FibGluZyBpdCBmb3Igbm93OgorIyBSVU4gY3VybCAtc1NMIGh0dHBzOi8vZ2l0aHViLmNvbS9ELVByb2dyYW1taW5nLURlaW1vcy9vcGVuc3NsL2FyY2hpdmUvbWFzdGVyLnRhci5nenwgdGFyIHh6ICYmIFwKKyMgICAgIG12IG9wZW5zc2wtbWFzdGVyL2RlaW1vcy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcy8gJiYgXAorIyAgICAgbXYgb3BlbnNzbC1tYXN0ZXIvQy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L0MvICYmIFwKKyMgICAgIHJtIC1yZiBvcGVuc3NsLW1hc3RlcgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIERhcnQgZGVwZW5kZW5jaWVzYCBcCisgICAgICBkYXJ0CitFTlYgUEFUSCAvdXNyL2xpYi9kYXJ0L2JpbjokUEFUSAorCisjIHByb2plY3QgaXNuJ3QgcmVhZHkgZm9yIHRoaXMgcXVpdGUgeWV0OgorIyBSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKKyMgYCMgZG90bmV0IGNvcmUgZGVwZW5kZW5jaWVzYCBcCisjICAgICAgIGRvdG5ldC1zZGstMi4wLjAKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBFcmxhbmcgZGVwZW5kZW5jaWVzYCBcCisgICAgICBlcmxhbmctYmFzZSBcCisgICAgICBlcmxhbmctZXVuaXQgXAorICAgICAgZXJsYW5nLWRldiBcCisgICAgICBlcmxhbmctdG9vbHMgXAorICAgICAgcmViYXIKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBHbGliQyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYmdsaWIyLjAtZGV2CisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgZ29sYW5nIChnbykgZGVwZW5kZW5jaWVzYCBcCisgICAgICBnb2xhbmctZ28KKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBIYXNrZWxsIGRlcGVuZGVuY2llc2AgXAorICAgICAgZ2hjIFwKKyAgICAgIGNhYmFsLWluc3RhbGwKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBIYXhlIGRlcGVuZGVuY2llc2AgXAorICAgICAgaGF4ZSBcCisgICAgICBuZWtvIFwKKyAgICAgIG5la28tZGV2CitSVU4gaGF4ZWxpYiBzZXR1cCAtLWFsd2F5cyAvdXNyL3NoYXJlL2hheGUvbGliICYmIFwKKyAgICBoYXhlbGliIGluc3RhbGwgLS1hbHdheXMgaHhjcHAKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBKYXZhIGRlcGVuZGVuY2llc2AgXAorICAgICAgYW50IFwKKyAgICAgIGFudC1vcHRpb25hbCBcCisgICAgICBvcGVuamRrLTgtamRrIFwKKyAgICAgIG1hdmVuCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgTHVhIGRlcGVuZGVuY2llc2AgXAorICAgICAgbHVhNS4yIFwKKyAgICAgIGx1YTUuMi1kZXYKKyMgaHR0cHM6Ly9idWdzLmxhdW5jaHBhZC5uZXQvdWJ1bnR1Lytzb3VyY2UvbHVhNS4zLytidWcvMTcwNzIxMgorIyBzYW1lIGZvciBkZWJpYW4gc3RyZXRjaAorIyBsdWE1LjMgZG9lcyBub3QgaW5zdGFsbCBhbHRlcm5hdGl2ZXMgc28gc3RpY2sgd2l0aCA1LjIgaGVyZQorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIE5vZGUuanMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBub2RlanMKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBPQ2FtbCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIG9jYW1sIFwKKyAgICAgIG9wYW0gJiYgXAorICAgIG9wYW0gaW5pdCAtLXllcyAmJiBcCisgICAgb3BhbSBpbnN0YWxsIC0teWVzIG9hc2lzCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUGVybCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYmJpdC12ZWN0b3ItcGVybCBcCisgICAgICBsaWJjbGFzcy1hY2Nlc3Nvci1jbGFzcy1wZXJsIFwKKyAgICAgIGxpYmNyeXB0LXNzbGVheS1wZXJsIFwKKyAgICAgIGxpYmlvLXNvY2tldC1zc2wtcGVybCBcCisgICAgICBsaWJuZXQtc3NsZWF5LXBlcmwKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBQaHAgZGVwZW5kZW5jaWVzYCBcCisgICAgICBwaHA3LjAgXAorICAgICAgcGhwNy4wLWNsaSBcCisgICAgICBwaHA3LjAtZGV2IFwKKyAgICAgIHBocC1wZWFyIFwKKyAgICAgIHJlMmMgXAorICAgICAgcGhwdW5pdAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFB5dGhvbiBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHB5dGhvbi1hbGwgXAorICAgICAgcHl0aG9uLWFsbC1kYmcgXAorICAgICAgcHl0aG9uLWFsbC1kZXYgXAorICAgICAgcHl0aG9uLWJhY2twb3J0cy5zc2wtbWF0Y2gtaG9zdG5hbWUgXAorICAgICAgcHl0aG9uLWlwYWRkcmVzcyBcCisgICAgICBweXRob24tcGlwIFwKKyAgICAgIHB5dGhvbi1zZXR1cHRvb2xzIFwKKyAgICAgIHB5dGhvbi1zaXggXAorICAgICAgcHl0aG9uLXRvcm5hZG8gXAorICAgICAgcHl0aG9uLXR3aXN0ZWQgXAorICAgICAgcHl0aG9uLXdoZWVsIFwKKyAgICAgIHB5dGhvbi16b3BlLmludGVyZmFjZSBcCisgICAgICBweXRob24zLWFsbCBcCisgICAgICBweXRob24zLWFsbC1kYmcgXAorICAgICAgcHl0aG9uMy1hbGwtZGV2IFwKKyAgICAgIHB5dGhvbjMtc2V0dXB0b29scyBcCisgICAgICBweXRob24zLXNpeCBcCisgICAgICBweXRob24zLXRvcm5hZG8gXAorICAgICAgcHl0aG9uMy10d2lzdGVkIFwKKyAgICAgIHB5dGhvbjMtd2hlZWwgXAorICAgICAgcHl0aG9uMy16b3BlLmludGVyZmFjZSAmJiBcCisgICAgcGlwIGluc3RhbGwgLS11cGdyYWRlIGJhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBSdWJ5IGRlcGVuZGVuY2llc2AgXAorICAgICAgcnVieSBcCisgICAgICBydWJ5LWRldiBcCisgICAgICBydWJ5LWJ1bmRsZXIKK1JVTiBnZW0gaW5zdGFsbCBidW5kbGVyIC0tbm8tcmkgLS1uby1yZG9jCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUnVzdCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHJ1c3RjCisKKyMgVXBkYXRlIGFueXRoaW5nIGVsc2UgbGVmdCBoYW5naW5nCitSVU4gYXB0LWdldCBkaXN0LXVwZ3JhZGUgLXkKKworIyBDbGVhbiB1cAorUlVOIHJtIC1yZiAvdmFyL2NhY2hlL2FwdC8qICYmIFwKKyAgICBybSAtcmYgL3Zhci9saWIvYXB0L2xpc3RzLyogJiYgXAorICAgIHJtIC1yZiAvdG1wLyogJiYgXAorICAgIHJtIC1yZiAvdmFyL3RtcC8qCisKK0VOViBUSFJJRlRfUk9PVCAvdGhyaWZ0CitSVU4gbWtkaXIgLXAgJFRIUklGVF9ST09UL3NyYworQ09QWSBEb2NrZXJmaWxlICRUSFJJRlRfUk9PVC8KK1dPUktESVIgJFRIUklGVF9ST09UL3NyYwpkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL29sZC91YnVudHUtdHJ1c3R5L0RvY2tlcmZpbGUgYi9idWlsZC9kb2NrZXIvb2xkL3VidW50dS10cnVzdHkvRG9ja2VyZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGU0ZDNiCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZG9ja2VyL29sZC91YnVudHUtdHJ1c3R5L0RvY2tlcmZpbGUKQEAgLTAsMCArMSwyNDQgQEAKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIworIyBBcGFjaGUgVGhyaWZ0IERvY2tlciBidWlsZCBlbnZpcm9ubWVudCBmb3IgVWJ1bnR1IFRydXN0eQorIyBVc2luZyBhbGwgc3RvY2sgVWJ1bnR1IFRydXN0eSBwYWNrYWdpbmcgZXhjZXB0IGZvcjoKKyMgLSBkOiBkb2VzIG5vdCBjb21lIHdpdGggVWJ1bnR1IHNvIHdlJ3JlIGluc3RhbGxpbmcgMi4wNzAuMAorIyAtIGRhcnQ6IGRvZXMgbm90IGNvbWUgd2l0aCBVYnVudHUgc28gd2UncmUgaW5zdGFsbGluZyAxLjIwLjEKKyMgLSBkb3RuZXRjb3JlLCBkaXNhYmxlZCBiZWNhdXNlIG5ldGNvcmUgaXMgZm9yIDEuMC4wLXByZXZpZXcgYW5kIDIuMC4wIGlzIG91dAorIyAtIGhheGUsIGRpc2FibGVkIGJlY2F1c2UgdGhlIGRpc3RybyBjb21lcyB3aXRoIDMuMC4wIGFuZCBpdCBjb3JlcyB3aGlsZSBpbnN0YWxsaW5nCisjIC0gbm9kZS5qcywgZGlzYWJsZWQgYmVjYXVzZSBpdCBpcyBhdCAwLjEwLjAgaW4gdGhlIGRpc3RybyB3aGljaCBpcyB0b28gb2xkIChuZWVkIDQrKQorIyAtIG9jYW1sLCBkaXNhYmxlZCBiZWNhdXNlIGl0IGZhaWxzIHRvIGluc3RhbGwgcHJvcGVybHkKKyMKKworRlJPTSBidWlsZHBhY2stZGVwczp0cnVzdHktc2NtCitNQUlOVEFJTkVSIEFwYWNoZSBUaHJpZnQgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KK0VOViBERUJJQU5fRlJPTlRFTkQgbm9uaW50ZXJhY3RpdmUKKworIyMjIEFkZCBhcHQgcmVwb3MKKworUlVOIGFwdC1nZXQgdXBkYXRlICYmIFwKKyAgICBhcHQtZ2V0IGRpc3QtdXBncmFkZSAteSAmJiBcCisgICAgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKKyAgICAgIGFwdCBcCisgICAgICBhcHQtdHJhbnNwb3J0LWh0dHBzIFwKKyAgICAgIGFwdC11dGlscyBcCisgICAgICBjdXJsIFwKKyAgICAgIGRpcm1uZ3IgXAorICAgICAgc29mdHdhcmUtcHJvcGVydGllcy1jb21tb24gXAorICAgICAgd2dldAorCisjIEQKK1JVTiBhcHQta2V5IGFkdiAtLWtleXNlcnZlciBrZXlzZXJ2ZXIudWJ1bnR1LmNvbSAtLXJlY3Yta2V5cyBFQkNGOTc1RTVCQTI0RDVFICYmIFwKKyAgICAgICAgd2dldCBodHRwOi8vbWFzdGVyLmRsLnNvdXJjZWZvcmdlLm5ldC9wcm9qZWN0L2QtYXB0L2ZpbGVzL2QtYXB0Lmxpc3QgLU8gL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvZC1hcHQubGlzdCAmJiBcCisgICAgICAgIHdnZXQgLXFPIC0gaHR0cHM6Ly9kbGFuZy5vcmcvZC1rZXlyaW5nLmdwZyB8IGFwdC1rZXkgYWRkIC0KKworIyBEYXJ0CitSVU4gY3VybCBodHRwczovL2RsLXNzbC5nb29nbGUuY29tL2xpbnV4L2xpbnV4X3NpZ25pbmdfa2V5LnB1YiB8IGFwdC1rZXkgYWRkIC0gJiYgXAorICAgICAgICBjdXJsIGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC5kYXJ0bGFuZy5vcmcvbGludXgvZGViaWFuL2RhcnRfc3RhYmxlLmxpc3QgPiBcCisgICAgICAgICAgL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvZGFydF9zdGFibGUubGlzdAorCitSVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEdlbmVyYWwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBiYXNoLWNvbXBsZXRpb24gXAorICAgICAgYmlzb24gXAorICAgICAgYnVpbGQtZXNzZW50aWFsIFwKKyAgICAgIGNsYW5nIFwKKyAgICAgIGNtYWtlIFwKKyAgICAgIGRlYmhlbHBlciBcCisgICAgICBmbGV4IFwKKyAgICAgIGdkYiBcCisgICAgICBsbHZtIFwKKyAgICAgIG5pbmphLWJ1aWxkIFwKKyAgICAgIHBrZy1jb25maWcgXAorICAgICAgdmFsZ3JpbmQgXAorICAgICAgdmltCitFTlYgUEFUSCAvdXNyL2xpYi9sbHZtLTMuOC9iaW46JFBBVEgKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBDKysgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJib29zdC1hbGwtZGV2IFwKKyAgICAgIGxpYmV2ZW50LWRldiBcCisgICAgICBsaWJzc2wtZGV2IFwKKyAgICAgIHF0NS1kZWZhdWx0IFwKKyAgICAgIHF0YmFzZTUtZGV2IFwKKyAgICAgIHF0YmFzZTUtZGV2LXRvb2xzCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgY3NoYXJwIChtb25vKSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIG1vbm8tZGV2ZWwKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBEIGRlcGVuZGVuY2llc2AgXAorICAgICAgZG1kLWJpbj0yLjA3MC4yLTAgXAorICAgICAgbGlicGhvYm9zMi1kZXY9Mi4wNzAuMi0wIFwKKyAgICAgIGR1YiBcCisgICAgICBkZm10IFwKKyAgICAgIGRzY2FubmVyIFwKKyAgICAgIHhkZy11dGlscworUlVOIG1rZGlyIC1wIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcyAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DICYmIFwKKyAgICBjdXJsIC1zU0wgaHR0cHM6Ly9naXRodWIuY29tL0QtUHJvZ3JhbW1pbmctRGVpbW9zL2xpYmV2ZW50L2FyY2hpdmUvbWFzdGVyLnRhci5nenwgdGFyIHh6ICYmIFwKKyAgICBtdiBsaWJldmVudC1tYXN0ZXIvZGVpbW9zLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvZGVpbW9zLyAmJiBcCisgICAgbXYgbGliZXZlbnQtbWFzdGVyL0MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DLyAmJiBcCisgICAgcm0gLXJmIGxpYmV2ZW50LW1hc3RlcgorUlVOIGN1cmwgLXNTTCBodHRwczovL2dpdGh1Yi5jb20vRC1Qcm9ncmFtbWluZy1EZWltb3Mvb3BlbnNzbC9hcmNoaXZlL21hc3Rlci50YXIuZ3p8IHRhciB4eiAmJiBcCisgICAgbXYgb3BlbnNzbC1tYXN0ZXIvZGVpbW9zLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvZGVpbW9zLyAmJiBcCisgICAgbXYgb3BlbnNzbC1tYXN0ZXIvQy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L0MvICYmIFwKKyAgICBybSAtcmYgb3BlbnNzbC1tYXN0ZXIKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBEYXJ0IGRlcGVuZGVuY2llc2AgXAorICAgICAgZGFydD0xLjIwLjEtMQorRU5WIFBBVEggL3Vzci9saWIvZGFydC9iaW46JFBBVEgKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBFcmxhbmcgZGVwZW5kZW5jaWVzYCBcCisgICAgICBlcmxhbmctYmFzZSBcCisgICAgICBlcmxhbmctZXVuaXQgXAorICAgICAgZXJsYW5nLWRldiBcCisgICAgICBlcmxhbmctdG9vbHMgXAorICAgICAgcmViYXIKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBHbGliQyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYmdsaWIyLjAtZGV2CisKKyMgZ29sYW5nCitFTlYgR09MQU5HX1ZFUlNJT04gMS43LjYKK0VOViBHT0xBTkdfRE9XTkxPQURfVVJMIGh0dHBzOi8vZ29sYW5nLm9yZy9kbC9nbyRHT0xBTkdfVkVSU0lPTi5saW51eC1hbWQ2NC50YXIuZ3oKK0VOViBHT0xBTkdfRE9XTkxPQURfU0hBMjU2IGFkNTgwOGJmNDJiMDE0YzIyZGQ3NjQ2NDU4ZjYzMTM4NTAwMzA0OWRlZDBiYjZhZjJlZmM3ZjFmNzlmYTI5ZWEKK1JVTiBjdXJsIC1mc1NMICIkR09MQU5HX0RPV05MT0FEX1VSTCIgLW8gZ29sYW5nLnRhci5neiAmJiBcCisgICAgICBlY2hvICIkR09MQU5HX0RPV05MT0FEX1NIQTI1NiAgZ29sYW5nLnRhci5neiIgfCBzaGEyNTZzdW0gLWMgLSAmJiBcCisgICAgICB0YXIgLUMgL3Vzci9sb2NhbCAteHpmIGdvbGFuZy50YXIuZ3ogJiYgXAorICAgICAgbG4gLXMgL3Vzci9sb2NhbC9nby9iaW4vZ28gL3Vzci9sb2NhbC9iaW4gJiYgXAorICAgICAgcm0gZ29sYW5nLnRhci5negorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEhhc2tlbGwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBnaGMgXAorICAgICAgY2FiYWwtaW5zdGFsbAorCisjIGRpc2FibGVkIGJlY2F1c2UgaXQgY29yZXMgd2hpbGUgaW5zdGFsbGluZworIyBSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKKyMgYCMgSGF4ZSBkZXBlbmRlbmNpZXNgIFwKKyMgICAgICAgaGF4ZSBcCisjICAgICAgIG5la28gXAorIyAgICAgICBuZWtvLWRldiAmJiBcCisjICAgICBoYXhlbGliIHNldHVwIC91c3Ivc2hhcmUvaGF4ZS9saWIgJiYgXAorIyAgICAgaGF4ZWxpYiBpbnN0YWxsIGh4Y3BwIDMuMi4xMDIKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBKYXZhIGRlcGVuZGVuY2llc2AgXAorICAgICAgYW50IFwKKyAgICAgIGFudC1vcHRpb25hbCBcCisgICAgICBvcGVuamRrLTctamRrIFwKKyAgICAgIG1hdmVuCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgTHVhIGRlcGVuZGVuY2llc2AgXAorICAgICAgbHVhNS4xIFwKKyAgICAgIGx1YTUuMS1kZXYKKworIyBkaXNhYmxlZCBiZWNhdXNlIGl0IGlzIHRvbyBvbGQKKyMgUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCisjIGAjIE5vZGUuanMgZGVwZW5kZW5jaWVzYCBcCisjICAgICAgIG5vZGVqcyBcCisjICAgICAgIG5wbQorCisjIGRpc2FibGVkIGJlY2F1c2UgaXQgZmFpbHMgdG8gaW5zdGFsbCBwcm9wZXJseQorIyBSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKKyMgYCMgT0NhbWwgZGVwZW5kZW5jaWVzYCBcCisjICAgICAgIG9jYW1sIFwKKyMgICAgICAgb3BhbSAmJiBcCisjICAgICBvcGFtIGluaXQgLS15ZXMgJiYgXAorIyAgICAgb3BhbSBpbnN0YWxsIC0teWVzIG9hc2lzCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUGVybCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYmJpdC12ZWN0b3ItcGVybCBcCisgICAgICBsaWJjbGFzcy1hY2Nlc3Nvci1jbGFzcy1wZXJsIFwKKyAgICAgIGxpYmNyeXB0LXNzbGVheS1wZXJsIFwKKyAgICAgIGxpYmlvLXNvY2tldC1zc2wtcGVybCBcCisgICAgICBsaWJuZXQtc3NsZWF5LXBlcmwKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBQaHAgZGVwZW5kZW5jaWVzYCBcCisgICAgICBwaHA1IFwKKyAgICAgIHBocDUtY2xpIFwKKyAgICAgIHBocDUtZGV2IFwKKyAgICAgIHBocC1wZWFyIFwKKyAgICAgIHJlMmMgJiYgXAorICAgICAgd2dldCBodHRwczovL2dldGNvbXBvc2VyLm9yZy9pbnN0YWxsZXIgLU8gLSAtcSB8IHBocCAtLSAtLXF1aWV0IC0taW5zdGFsbC1kaXI9L3Vzci9sb2NhbC9iaW4vIC0tZmlsZW5hbWU9Y29tcG9zZXIKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBQeXRob24gZGVwZW5kZW5jaWVzYCBcCisgICAgICBweXRob24tYWxsIFwKKyAgICAgIHB5dGhvbi1hbGwtZGJnIFwKKyAgICAgIHB5dGhvbi1hbGwtZGV2IFwKKyAgICAgIHB5dGhvbi1waXAgXAorICAgICAgcHl0aG9uLXNldHVwdG9vbHMgXAorICAgICAgcHl0aG9uLXNpeCBcCisgICAgICBweXRob24tdHdpc3RlZCBcCisgICAgICBweXRob24td2hlZWwgXAorICAgICAgcHl0aG9uLXpvcGUuaW50ZXJmYWNlIFwKKyAgICAgIHB5dGhvbjMtYWxsIFwKKyAgICAgIHB5dGhvbjMtYWxsLWRiZyBcCisgICAgICBweXRob24zLWFsbC1kZXYgXAorICAgICAgcHl0aG9uMy1waXAgXAorICAgICAgcHl0aG9uMy1zZXR1cHRvb2xzIFwKKyAgICAgIHB5dGhvbjMtc2l4IFwKKyAgICAgIHB5dGhvbjMtd2hlZWwgXAorICAgICAgcHl0aG9uMy16b3BlLmludGVyZmFjZSAmJiBcCisgICAgcGlwIGluc3RhbGwgLVUgaXBhZGRyZXNzIGJhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUgdG9ybmFkbyAmJiBcCisgICAgcGlwMyBpbnN0YWxsIC1VIGJhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUgdG9ybmFkbworIyBpbnN0YWxsaW5nIHRvcm5hZG8gYnkgcGlwL3BpcDMgaW5zdGVhZCBvZiBkZWJpYW4gcGFja2FnZQorIyBpZiB3ZSBpbnN0YWxsIHRoZSBkZWJpYW4gcGFja2FnZSwgdGhlIGJ1aWxkIGZhaWxzIGluIHB5MgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFJ1YnkgZGVwZW5kZW5jaWVzYCBcCisgICAgICBydWJ5IFwKKyAgICAgIHJ1YnktZGV2IFwKKyAgICAgIHJ1YnktYnVuZGxlcgorUlVOIGdlbSBpbnN0YWxsIGJ1bmRsZXIgLS1uby1yaSAtLW5vLXJkb2MKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBSdXN0IGRlcGVuZGVuY2llc2AgXAorICAgICAgY2FyZ28gXAorICAgICAgcnVzdGMKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBTdGF0aWMgQ29kZSBBbmFseXNpcyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGNwcGNoZWNrIFwKKyAgICAgIHNsb2Njb3VudCAmJiBcCisgICAgcGlwIGluc3RhbGwgZmxha2U4CisKKyMgSW5zdGFsbCBCb3VuY3lDYXN0bGUgcHJvdmlkZXIgdG8gZml4IEphdmEgYnVpbGRzIGlzc3VlcyB3aXRoIEpESyA3CisjIEJ1aWxkcyBhY2Nlc3NpbmcgcmVwb3RlIHJlcG9zaXRvcmllcyBmYWlsIGFzIHNlZW4gaGVyZTogaHR0cHM6Ly9naXRodWIuY29tL3RyYXZpcy1jaS90cmF2aXMtY2kvaXNzdWVzLzg1MDMKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgQm91bmN5Q2FzdGxlIEpDRSBQcm92aWRlciBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYmJjcHJvdi1qYXZhICYmIFwKKyAgICBsbiAtcyAvdXNyL3NoYXJlL2phdmEvYmNwcm92LmphciAvdXNyL2xpYi9qdm0vamF2YS03LW9wZW5qZGstYW1kNjQvanJlL2xpYi9leHQvYmNwcm92LmphciAmJiBcCisgICAgYXdrIC1GIC4gLXYgT0ZTPS4gJ0JFR0lOe249Mn0vXnNlY3VyaXR5XC5wcm92aWRlci8ge3NwbGl0KCQzLCBwb3NBbmRFcXVhbHMsICI9Iik7JDM9bisrIj0icG9zQW5kRXF1YWxzWzJdO3ByaW50O25leHR9IDEnIC9ldGMvamF2YS03LW9wZW5qZGsvc2VjdXJpdHkvamF2YS5zZWN1cml0eSA+IC90bXAvamF2YS5zZWN1cml0eSAmJiBcCisgIGVjaG8gInNlY3VyaXR5LnByb3ZpZGVyLjE9b3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuQm91bmN5Q2FzdGxlUHJvdmlkZXIiID4+IC90bXAvamF2YS5zZWN1cml0eSAmJiBcCisgIG12IC90bXAvamF2YS5zZWN1cml0eSAvZXRjL2phdmEtNy1vcGVuamRrL3NlY3VyaXR5L2phdmEuc2VjdXJpdHkKKworIyBDbGVhbiB1cAorUlVOIHJtIC1yZiAvdmFyL2NhY2hlL2FwdC8qICYmIFwKKyAgICBybSAtcmYgL3Zhci9saWIvYXB0L2xpc3RzLyogJiYgXAorICAgIHJtIC1yZiAvdG1wLyogJiYgXAorICAgIHJtIC1yZiAvdmFyL3RtcC8qCisKK0VOViBUSFJJRlRfUk9PVCAvdGhyaWZ0CitSVU4gbWtkaXIgLXAgJFRIUklGVF9ST09UL3NyYworQ09QWSBEb2NrZXJmaWxlICRUSFJJRlRfUk9PVC8KK1dPUktESVIgJFRIUklGVF9ST09UL3NyYwpkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL3JlZnJlc2guc2ggYi9idWlsZC9kb2NrZXIvcmVmcmVzaC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wOGNiYzkxCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZG9ja2VyL3JlZnJlc2guc2gKQEAgLTAsMCArMSw4MiBAQAorIyEvYmluL2Jhc2gKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjCisjIFRoZSBidWlsZCBoYXMgdHdvIHN0YWdlczogImRvY2tlciIgYW5kICJ0ZXN0IgorIyBUaGUgImRvY2tlciIgc3RhZ2UgaXMgbWVhbnQgdG8gcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlcworIyAgIGlmIG5lZWRlZC4gIElmIHdlIGNhbm5vdCBwdXNoIHRoYXQgcmVzdWx0IGhvd2V2ZXIgdGhlbgorIyAgIHRoZXJlIGlzIG5vIHJlYXNvbiB0byBkbyBhbnl0aGluZy4KKyMgVGhlICJ0ZXN0IiBzdGFnZSBpcyBhbiBhY3R1YWwgdGVzdCBqb2IuICBFdmVuIGlmIHRoZSBkb2NrZXIKKyMgICBpbWFnZSBkb2Vzbid0IG1hdGNoIHdoYXQncyBpbiB0aGUgcmVwbywgd2Ugc3RpbGwgYnVpbGQKKyMgICB0aGUgaW1hZ2Ugc28gdGhlIGJ1aWxkIGpvYiBjYW4gcnVuIHByb3Blcmx5LgorIworCitzZXQgLWUKKworU0NSSVBUX0RJUj0iJChjZCAiJChkaXJuYW1lICIke0JBU0hfU09VUkNFWzBdfSIpIiAmJiBwd2QpIgorRE9DS0VSX1RBRz0kRE9DS0VSX1JFUE86JERJU1RSTworCitmdW5jdGlvbiBkb2NrZXJmaWxlX2NoYW5nZWQgeworICAjIGltYWdlIG1heSBub3QgZXhpc3QgeWV0LCBzbyB3ZSBoYXZlIHRvIGxldCBpdCBmYWlsIHNpbGVudGx5OgorICBkb2NrZXIgcHVsbCAkRE9DS0VSX1RBRyB8fCB0cnVlCisgIGRvY2tlciBydW4gJERPQ0tFUl9UQUcgYmFzaCAtYyAnY2QgLi4gJiYgc2hhNTEyc3VtIERvY2tlcmZpbGUnID4gLkRvY2tlcmZpbGUuc2hhNTEyCisgIHNoYTUxMnN1bSAtYyAuRG9ja2VyZmlsZS5zaGE1MTIKK30KKworIworIyBJZiB0aGlzIGJ1aWxkIGhhcyBubyBET0NLRVJfUEFTUyBhbmQgaXQgaXMgaW4gdGhlIGRvY2tlciBzdGFnZQorIyB0aGVuIHRoZXJlJ3Mgbm8gcmVhc29uIHRvIGRvIGFueSBwcm9jZXNzaW5nIGJlY2F1c2Ugd2UgY2Fubm90CisjIHB1c2ggdGhlIHJlc3VsdCBpZiB0aGUgRG9ja2VyZmlsZSBjaGFuZ2VkLiAgCisjCisKK2lmIFtbICIkVFJBVklTX0JVSUxEX1NUQUdFIiA9PSAiZG9ja2VyIiBdXSAmJiBbWyAteiAiJERPQ0tFUl9QQVNTIiBdXTsgdGhlbgorICBlY2hvIERldGVjdGVkIGRvY2tlciBzdGFnZSBidWlsZCBhbmQgbm8gZGVmaW5lZCBET0NLRVJfUEFTUywgdGhpcyBidWlsZCBqb2Igd2lsbCBiZSBza2lwcGVkLgorICBlY2hvIFN1YnNlcXVlbnQgam9icyBpbiB0aGUgdGVzdCBzdGFnZSBtYXkgZWFjaCByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UuCisgIGV4aXQgMAorZmkKKworCitwdXNoZCAke1NDUklQVF9ESVJ9LyRESVNUUk8KK2lmIGRvY2tlcmZpbGVfY2hhbmdlZDsgdGhlbgorICBlY2hvIERvY2tlcmZpbGUgaGFzIG5vdCBjaGFuZ2VkLiAgTm8gbmVlZCB0byByZWJ1aWxkLgorICBleGl0IDAKK2Vsc2UKKyAgZWNobyBEb2NrZXJmaWxlIGhhcyBjaGFuZ2VkLgorZmkKK3BvcGQKKworIworIyBEb2NrZXJmaWxlIGhhcyBjaGFuZ2VkIC0gcmVidWlsZCBpdCBmb3IgdGhlIGN1cnJlbnQgYnVpbGQgam9iLgorIyBJZiBpdCBpcyBhICJkb2NrZXIiIHN0YWdlIGJ1aWxkIHRoZW4gd2Ugd2FudCB0byBwdXNoIGl0IGJhY2sKKyMgdG8gdGhlIERPQ0tFUl9SRVBPLiAgSWYgaXQgaXMgYSAidGVzdCIgc3RhZ2UgYnVpbGQgdGhlbiB3ZSBkbworIyBub3QuICBJZiBub2JvZHkgZGVmaW5lZCBhIERPQ0tFUl9QQVNTIHRoZW4gaXQgZG9lc24ndCBtYXR0ZXIuCisjCisKK2VjaG8gUmVidWlsZGluZyBkb2NrZXIgaW1hZ2UgJERJU1RSTworZG9ja2VyIGJ1aWxkIC0tdGFnICRET0NLRVJfVEFHIGJ1aWxkL2RvY2tlci8kRElTVFJPCisKK2lmIFtbICIkVFJBVklTX0JVSUxEX1NUQUdFIiA9PSAiZG9ja2VyIiBdXSAmJiBbWyAhIC16ICIkRE9DS0VSX1VTRVIiIF1dICYmIFtbICEgLXogIiRET0NLRVJfUEFTUyIgXV07IHRoZW4gCisgIGVjaG8gUHVzaGluZyBkb2NrZXIgaW1hZ2UgJERPQ0tFUl9UQUcKKyAgZG9ja2VyIGxvZ2luIC11ICRET0NLRVJfVVNFUiAtcCAkRE9DS0VSX1BBU1MKKyAgZG9ja2VyIHB1c2ggJERPQ0tFUl9UQUcKK2Vsc2UKKyAgZWNobyBOb3QgcHVzaGluZyBkb2NrZXIgaW1hZ2U6IGVpdGhlciBub3QgYSBkb2NrZXIgc3RhZ2UgYnVpbGQgam9iLCBvciBvbmUgb2YgRE9DS0VSX1VTRVIgb3IgRE9DS0VSX1BBU1MgaXMgdW5kZWZpbmVkLgorZmkKKwpkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL3J1bi5zaCBiL2J1aWxkL2RvY2tlci9ydW4uc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWZlMTlkNQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2RvY2tlci9ydW4uc2gKQEAgLTAsMCArMSwzMCBAQAorIyEvYmluL2Jhc2gKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitzZXQgLWUKKworU0NSSVBUX0RJUj0iJChjZCAiJChkaXJuYW1lICIke0JBU0hfU09VUkNFWzBdfSIpIiAmJiBwd2QpIgorRE9DS0VSX1RBRz0kRE9DS0VSX1JFUE86JERJU1RSTworCitwcmludGVudiB8IHNvcnQKKworZG9ja2VyIHJ1biAtLW5ldD1ob3N0IC1lIEJVSUxEX0xJQlM9IiRCVUlMRF9MSUJTIiAkQlVJTERfRU5WIC12ICQocHdkKTovdGhyaWZ0L3NyYyBcCisJLWl0ICRET0NLRVJfVEFHIGJ1aWxkL2RvY2tlci9zY3JpcHRzLyRTQ1JJUFQgJEJVSUxEX0FSRworCmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvc2NyaXB0cy9hdXRvdG9vbHMuc2ggYi9idWlsZC9kb2NrZXIvc2NyaXB0cy9hdXRvdG9vbHMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODM4OGY3MgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2RvY2tlci9zY3JpcHRzL2F1dG90b29scy5zaApAQCAtMCwwICsxLDYgQEAKKyMhL2Jpbi9zaAorc2V0IC1ldgorCisuL2Jvb3RzdHJhcC5zaAorLi9jb25maWd1cmUgJCoKK21ha2UgY2hlY2sgLWozCmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvc2NyaXB0cy9jbWFrZS5zaCBiL2J1aWxkL2RvY2tlci9zY3JpcHRzL2NtYWtlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNjYzMxMWUKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9kb2NrZXIvc2NyaXB0cy9jbWFrZS5zaApAQCAtMCwwICsxLDIzIEBACisjIS9iaW4vc2gKK3NldCAtZXYKKworQ01BS0VfRkxBR1M9JCoKK01BS0VQUk9HPW1ha2UKKworaWYgbmluamEgLS12ZXJzaW9uICA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgTUFLRVBST0c9bmluamEKKyAgQ01BS0VfRkxBR1M9Ii1HTmluamEgJENNQUtFX0ZMQUdTIgorZmkKKworbWtkaXIgLXAgY21ha2VfYnVpbGQgJiYgY2QgY21ha2VfYnVpbGQKK2NtYWtlICRDTUFLRV9GTEFHUyAuLgorZm9yIExJQiBpbiAkQlVJTERfTElCUzsgZG8KKyAgaWYgISBncmVwICJeQlVJTERfJHtMSUJ9OkJPT0w9T04kIiBDTWFrZUNhY2hlLnR4dCA7IHRoZW4KKyAgICBlY2hvICJmYWlsZWQgdG8gY29uZmlndXJlICRMSUIiCisgICAgZXhpdCAxCisgIGZpCitkb25lCiskTUFLRVBST0cgLWozCitjcGFjaworY3Rlc3QgLVZWIC1FICIocHl0aG9uX3Rlc3QpIgorIyBkaXNhYmxlZCBjbWFrZSBweXRob25fdGVzdCBmb3Igbm93IHNpbmNlIGl0IGZhaWxzIGluIHRyYXZpcyB1bmRlciBjZW50b3MKZGlmZiAtLWdpdCBhL2J1aWxkL2RvY2tlci9zY3JpcHRzL2NvdnNjYW4uc2ggYi9idWlsZC9kb2NrZXIvc2NyaXB0cy9jb3ZzY2FuLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNiM2YyODMKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9kb2NrZXIvc2NyaXB0cy9jb3ZzY2FuLnNoCkBAIC0wLDAgKzEsNTAgQEAKKyMKKyMgQ292ZXJpdHkgU2NhbiBUcmF2aXMgYnVpbGQgc2NyaXB0CisjIFRvIHJ1biB0aGlzIGludGVyYWN0aXZlbHksIHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIHlvdXJzZWxmLAorIyBhbmQgcnVuIHRoaXMgaW5zaWRlIGEgZG9ja2VyIGNvbnRhaW5lci4KKyMKKyMgQ29tbWFuZC1MaW5lIEFyZ3VtZW50cworIworIyAtLXNraXBkb3dubG9hZCAgIHRvIHNraXAgcmUtZG93bmxvYWRpbmcgdGhlIENvdmVyaXR5IFNjYW4gYnVpbGQgcGFja2FnZSAobGFyZ2UpCisjCisjIEVudmlyb25tZW50IFZhcmlhYmxlcyAocmVxdWlyZWQpCisjCisjIENPVkVSSVRZX1NDQU5fTk9USUZJQ0FUSU9OX0VNQUlMICAtIGVtYWlsIGFkZHJlc3MgdG8gbm90aWZ5CisjIENPVkVSSVRZX1NDQU5fVE9LRU4gICAgICAgICAgICAgICAtIHRoZSBDb3Zlcml0eSBTY2FuIHRva2VuIChzaG91bGQgYmUgc2VjdXJlKQorIworIyBFbnZpcm9ubWVudCBWYXJpYWJsZXMgKGRlZmF1bHRlZCkKKyMKKyMgQ09WRVJJVFlfU0NBTl9CVUlMRF9DT01NQU5EICAgICAgIC0gZGVmYXVsdHMgdG8gImJ1aWxkL2RvY2tlci9zY3JpcHRzL2F1dG90b29scy5zaCIKKyMgQ09WRVJJVFlfU0NBTl9ERVNDUklQVElPTiAgICAgICAgIC0gZGVmYXVsdHMgdG8gVFJBVklTX0JSQU5DSCBvciAibWFzdGVyIiBpZiBlbXB0eQorIyBDT1ZFUklUWV9TQ0FOX1BST0pFQ1QgICAgICAgICAgICAgLSBkZWZhdWx0cyB0byAidGhyaWZ0IgorCitzZXQgLWV4CisKK0NPVkVSSVRZX1NDQU5fQlVJTERfQ09NTUFORD0ke0NPVkVSSVRZX1NDQU5fQlVJTERfQ09NTUFORDotYnVpbGQvZG9ja2VyL3NjcmlwdHMvYXV0b3Rvb2xzLnNofQorQ09WRVJJVFlfU0NBTl9ERVNDUklQVElPTj0ke0NPVkVSSVRZX1NDQU5fREVTQ1JJUFRJT046LSR7VFJBVklTX0JSQU5DSDotbWFzdGVyfX0KK0NPVkVSSVRZX1NDQU5fUFJPSkVDVD0ke0NPVkVSSVRZX1NDQU5fUFJPSkVDVDotdGhyaWZ0fQorCisjIGRvd25sb2FkIHRoZSBjb3Zlcml0eSBzY2FuIHBhY2thZ2UKKworcHVzaGQgL3RtcAoraWYgW1sgIiQxIiAhPSAiLS1za2lwZG93bmxvYWQiIF1dOyB0aGVuCisgIHJtIC1yZiBjb3Zlcml0eV90b29sLnRneiBjb3YtYW5hbHlzaXMqCisgIHdnZXQgaHR0cHM6Ly9zY2FuLmNvdmVyaXR5LmNvbS9kb3dubG9hZC9saW51eDY0IC0tcG9zdC1kYXRhICJ0b2tlbj0kQ09WRVJJVFlfU0NBTl9UT0tFTiZwcm9qZWN0PSRDT1ZFUklUWV9TQ0FOX1BST0pFQ1QiIC1PIGNvdmVyaXR5X3Rvb2wudGd6CisgIHRhciB4emYgY292ZXJpdHlfdG9vbC50Z3oKK2ZpCitDT1ZCSU49JChlY2hvICQocHdkKS9jb3YtYW5hbHlzaXMqL2JpbikKK2V4cG9ydCBQQVRIPSRDT1ZCSU46JFBBVEgKK3BvcGQKKworIyBidWlsZCB0aGUgcHJvamVjdCB3aXRoIGNvdmVyaXR5IHNjYW4KKworcm0gLXJmIGNvdi1pbnQvCitjb3YtYnVpbGQgLS1kaXIgY292LWludCAkQ09WRVJJVFlfU0NBTl9CVUlMRF9DT01NQU5ECit0YXIgY0pmIGNvdi1pbnQudGFyLnh6IGNvdi1pbnQvCitjdXJsIC0tZm9ybSB0b2tlbj0iJENPVkVSSVRZX1NDQU5fVE9LRU4iIFwKKyAgICAgLS1mb3JtIGVtYWlsPSIkQ09WRVJJVFlfU0NBTl9OT1RJRklDQVRJT05fRU1BSUwiIFwKKyAgICAgLS1mb3JtIGZpbGU9QGNvdi1pbnQudGFyLnh6IFwKKyAgICAgLS1mb3JtIHZlcnNpb249IiQoZ2l0IGRlc2NyaWJlIC0tdGFncykiIFwKKyAgICAgLS1mb3JtIGRlc2NyaXB0aW9uPSIkQ09WRVJJVFlfU0NBTl9ERVNDUklQVElPTiIgXAorICAgICBodHRwczovL3NjYW4uY292ZXJpdHkuY29tL2J1aWxkcz9wcm9qZWN0PSIkQ09WRVJJVFlfU0NBTl9QUk9KRUNUIgorCmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvc2NyaXB0cy9jcm9zcy10ZXN0LnNoIGIvYnVpbGQvZG9ja2VyL3NjcmlwdHMvY3Jvc3MtdGVzdC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40MzU4MWE1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZG9ja2VyL3NjcmlwdHMvY3Jvc3MtdGVzdC5zaApAQCAtMCwwICsxLDE2IEBACisjIS9iaW4vc2gKK3NldCAtZXYKKworLi9ib290c3RyYXAuc2gKKy4vY29uZmlndXJlIC0tZW5hYmxlLXR1dG9yaWFsPW5vCittYWtlIC1qMyBwcmVjcm9zcworCitzZXQgK2UKK21ha2UgY3Jvc3MkMQorCitSRVQ9JD8KK2lmIFsgJFJFVCAtbmUgMCBdOyB0aGVuCisgIGNhdCB0ZXN0L2xvZy91bmV4cGVjdGVkX2ZhaWx1cmVzLmxvZworZmkKKworZXhpdCAkUkVUCmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvc2NyaXB0cy9kcGtnLnNoIGIvYnVpbGQvZG9ja2VyL3NjcmlwdHMvZHBrZy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zYmEwY2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZG9ja2VyL3NjcmlwdHMvZHBrZy5zaApAQCAtMCwwICsxLDUgQEAKKyMhL2Jpbi9zaAorc2V0IC1ldgorCitkcGtnLWJ1aWxkcGFja2FnZSAtdGMgLXVzIC11YworbHMgLWFsIC4uCmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvc2NyaXB0cy9tYWtlLWRpc3Quc2ggYi9idWlsZC9kb2NrZXIvc2NyaXB0cy9tYWtlLWRpc3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWEzNjgxZQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2RvY2tlci9zY3JpcHRzL21ha2UtZGlzdC5zaApAQCAtMCwwICsxLDkgQEAKKyMhL2Jpbi9zaAorc2V0IC1ldgorCisuL2Jvb3RzdHJhcC5zaAorLi9jb25maWd1cmUgJCoKK21ha2UgZGlzdAordGFyIHh2ZiB0aHJpZnQtKi50YXIuZ3oKK2NkIHRocmlmdC0qCisuL2J1aWxkL2RvY2tlci9zY3JpcHRzL2NtYWtlLnNoCmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvc2NyaXB0cy9zY2Euc2ggYi9idWlsZC9kb2NrZXIvc2NyaXB0cy9zY2Euc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTZkNTgyNgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2RvY2tlci9zY3JpcHRzL3NjYS5zaApAQCAtMCwwICsxLDY2IEBACisjIS9iaW4vYmFzaAorc2V0IC1ldgorCisjCisjIEdlbmVyYXRlIHRocmlmdCBmaWxlcyBzbyB0aGUgc3RhdGljIGNvZGUgYW5hbHlzaXMgaW5jbHVkZXMgYW4gYW5hbHlzaXMKKyMgb2YgdGhlIGZpbGVzIHRoZSB0aHJpZnQgY29tcGlsZXIgc3BpdHMgb3V0LiAgSWYgcnVubmluZyBpbnRlcmFjdGl2ZWx5CisjIHNldCB0aGUgTk9CVUlMRCBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBza2lwIHRoZSBib290L2NvbmZpZy9tYWtlIHBoYXNlLgorIworCitpZiBbWyAteiAiJE5PQlVJTEQiIF1dOyB0aGVuCisgIC4vYm9vdHN0cmFwLnNoCisgIC4vY29uZmlndXJlIC0tZW5hYmxlLXR1dG9yaWFsPW5vCisgIG1ha2UgLWozIHByZWNyb3NzCitmaQorCisjCisjIEMvQysrIHN0YXRpYyBjb2RlIGFuYWx5c2lzIHdpdGggY3BwY2hlY2sKKyMgYWRkIC0tZXJyb3ItZXhpdGNvZGU9MSB0byAtLWVuYWJsZT1hbGwgYXMgc29vbiBhcyBldmVyeXRoaW5nIGlzIGZpeGVkCisjCisjIFB5dGhvbiBjb2RlIHN0eWxlIGNoZWNrIHdpdGggZmxha2U4CisjCisjIHNlYXJjaCBmb3IgVE9ETyBldGMgd2l0aGluIHNvdXJjZSB0cmVlCisjIHNvbWUgc3RhdGlzdGljcyBhYm91dCB0aGUgY29kZSBiYXNlCisjIHNvbWUgaW5mbyBhYm91dCB0aGUgYnVpbGQgbWFjaGluZQorCisjIENvbXBpbGVyIGNwcGNoZWNrIChBbGwpCitjcHBjaGVjayAtLWZvcmNlIC0tcXVpZXQgLS1pbmxpbmUtc3VwcHIgLS1lbmFibGU9YWxsIC1qMiBjb21waWxlci9jcHAvc3JjCisKKyMgQysrIGNwcGNoZWNrIChBbGwpCitjcHBjaGVjayAtLWZvcmNlIC0tcXVpZXQgLS1pbmxpbmUtc3VwcHIgLS1lbmFibGU9YWxsIC1qMiBsaWIvY3BwL3NyYyBsaWIvY3BwL3Rlc3QgdGVzdC9jcHAgdHV0b3JpYWwvY3BwCisKKyMgQyBHbGliIGNwcGNoZWNrIChBbGwpCitjcHBjaGVjayAtLWZvcmNlIC0tcXVpZXQgLS1pbmxpbmUtc3VwcHIgLS1lbmFibGU9YWxsIC1qMiBsaWIvY19nbGliL3NyYyBsaWIvY19nbGliL3Rlc3QgdGVzdC9jX2dsaWIvc3JjIHR1dG9yaWFsL2NfZ2xpYgorCisjIFNpbGVudCBlcnJvciBjaGVja3MKKyMgU2VlIFRIUklGVC00MzcxIDogZmxleCBnZW5lcmF0ZWQgY29kZSB0cmlnZ2VycyAicG9zc2libGUgbnVsbCBwb2ludGVyIGRlcmVmZXJlbmNlIiBpbiB5eV9pbml0X2J1ZmZlcgorY3BwY2hlY2sgLS1mb3JjZSAtLXF1aWV0IC0taW5saW5lLXN1cHByIC0tc3VwcHJlc3M9Iio6dGhyaWZ0L3RocmlmdGwuY2MiIC0tZXJyb3ItZXhpdGNvZGU9MSAtajIgY29tcGlsZXIvY3BwL3NyYworY3BwY2hlY2sgLS1mb3JjZSAtLXF1aWV0IC0taW5saW5lLXN1cHByIC0tZXJyb3ItZXhpdGNvZGU9MSAtajIgbGliL2NwcC9zcmMgbGliL2NwcC90ZXN0IHRlc3QvY3BwIHR1dG9yaWFsL2NwcAorY3BwY2hlY2sgLS1mb3JjZSAtLXF1aWV0IC0taW5saW5lLXN1cHByIC0tZXJyb3ItZXhpdGNvZGU9MSAtajIgbGliL2NfZ2xpYi9zcmMgbGliL2NfZ2xpYi90ZXN0IHRlc3QvY19nbGliL3NyYyB0dXRvcmlhbC9jX2dsaWIKKworIyBQeXRob24gY29kZSBzdHlsZQorZmxha2U4IC0taWdub3JlPVc1MDQsRTUwMSBsaWIvcHkKK2ZsYWtlOCAtLWV4Y2x1ZGU9dHV0b3JpYWwvcHkvYnVpbGQgdHV0b3JpYWwvcHkKKyMgVEhSSUZULTQzNzEgOiBnZW5lcmF0ZWQgZmlsZXMgYXJlIGV4Y2x1ZGVkIGJlY2F1c2UgdGhleSBoYXZlbid0IGJlZW4gc2NydWJiZWQgeWV0CitmbGFrZTggLS1pZ25vcmU9RTUwMSAtLWV4Y2x1ZGU9IiovZ2VuLXB5Ki8qIix0ZXN0L3B5L2J1aWxkIHRlc3QvcHkKK2ZsYWtlOCB0ZXN0L3B5LnR3aXN0ZWQKK2ZsYWtlOCB0ZXN0L3B5LnRvcm5hZG8KK2ZsYWtlOCAtLWlnbm9yZT1FNTAxIHRlc3QvdGVzdC5weQorZmxha2U4IC0taWdub3JlPUU1MDEsRTcyMiB0ZXN0L2Nyb3NzcnVubmVyCitmbGFrZTggdGVzdC9mZWF0dXJlcworCisjIFBIUCBjb2RlIHN0eWxlCitjb21wb3NlciBpbnN0YWxsIC0tcXVpZXQKKy4vdmVuZG9yL2Jpbi9waHBjcworCisjIFRPRE8gZXRjCitlY2hvIEZJWE1FczogYGdyZXAgLXIgRklYTUUgKiB8IHdjIC1sYAorZWNobyAgSEFDS3M6IGBncmVwIC1yIEhBQ0sgKiB8IHdjIC1sYAorZWNobyAgVE9ET3M6IGBncmVwIC1yIFRPRE8gKiB8IHdjIC1sYAorCisjIExvQworc2xvY2NvdW50IC4KKworIyBTeXN0ZW0gSW5mbworZHBrZyAtbAordW5hbWUgLWEKZGlmZiAtLWdpdCBhL2J1aWxkL2RvY2tlci9zY3JpcHRzL3Vic2FuLnNoIGIvYnVpbGQvZG9ja2VyL3NjcmlwdHMvdWJzYW4uc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjUwZGJhMAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2RvY2tlci9zY3JpcHRzL3Vic2FuLnNoCkBAIC0wLDAgKzEsMzAgQEAKKyMhL2Jpbi9zaAorCitzZXQgLWUKKworIyBXcmFwcyBhdXRvdG9vbHMuc2gsIGJ1dCBlYWNoIGJpbmFyeSBjcmFzaGVzIGlmIGl0IGV4aGliaXRzIHVuZGVmaW5lZCBiZWhhdmlvci4gCisjIFNldCB0aGUgdW5kZWZpbmVkIGJlaGF2aW9yIGZsYWdzLiBUaGlzIGNyYXNoZXMgb24gYWxsIHVuZGVmaW5lZCBiZWhhdmlvciBleGNlcHQgZm9yCisjIHVuZGVmaW5lZCBjYXN0aW5nLCBha2EgInZwdHIiLgorIyBUT0RPOiBmaXggdW5kZWZpbmVkIHZwdHIgYmVoYXZpb3IgYW5kIHR1cm4gdGhpcyBvcHRpb24gYmFjayBvbi4KKworZXhwb3J0IENGTEFHUz0iLWZzYW5pdGl6ZT11bmRlZmluZWQgLWZuby1zYW5pdGl6ZS1yZWNvdmVyPXVuZGVmaW5lZCAtTzAgLWdnZGIzIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIgorZXhwb3J0IENYWEZMQUdTPSIke0NGTEFHU30iCitleHBvcnQgTERGTEFHUz0iLWx1YnNhbiIKK2V4cG9ydCBVQlNBTl9PUFRJT05TPXByaW50X3N0YWNrdHJhY2U9MQorCisjCisjIHdvcmsgYXJvdW5kIGh0dHBzOi8vc3ZuLmJvb3N0Lm9yZy90cmFjMTAvdGlja2V0LzExNjMyIGlmIHByZXNlbnQKKyMKKworc2VkIC1pICdzLywgc3RyZWFtX3QocmRidWYoKSkgLywgc3RyZWFtX3QocGJhc2VfdHlwZTo6bWVtYmVyLmdldCgpKS9nJyAvdXNyL2luY2x1ZGUvYm9vc3QvZm9ybWF0L2FsdF9zc3RyZWFtLmhwcAorCisjIGxsdm0tc3ltYm9saXplciBtdXN0IGJlIG9uIFBBVEggdG8gZ2V0IGEgc3RhY2sgdHJhY2Ugb24gZXJyb3IKKworQ0xBTkdfUEFUSD0iJChta3RlbXAgLWQpIgordHJhcCAicm0gLXJmICR7Q0xBTkdfUEFUSH0iIEVYSVQKK2xuIC1zICIkKHdoZXJlaXMgbGx2bS1zeW1ib2xpemVyLTQuMCAgfCByZXYgfCBjdXQgLWQgJyAnIC1mIDEgfCByZXYpIiBcCisgICIke0NMQU5HX1BBVEh9L2xsdm0tc3ltYm9saXplciIKK2V4cG9ydCBQQVRIPSIke0NMQU5HX1BBVEh9OiR7UEFUSH0iCitsbHZtLXN5bWJvbGl6ZXIgLXZlcnNpb24KKworYnVpbGQvZG9ja2VyL3NjcmlwdHMvYXV0b3Rvb2xzLnNoICQqCmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvdWJ1bnR1LWFydGZ1bC9Eb2NrZXJmaWxlIGIvYnVpbGQvZG9ja2VyL3VidW50dS1hcnRmdWwvRG9ja2VyZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmU4NGQxCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZG9ja2VyL3VidW50dS1hcnRmdWwvRG9ja2VyZmlsZQpAQCAtMCwwICsxLDI3MCBAQAorIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjCisjIEFwYWNoZSBUaHJpZnQgRG9ja2VyIGJ1aWxkIGVudmlyb25tZW50IGZvciBVYnVudHUgQXJ0ZnVsCisjIFVzaW5nIGFsbCBzdG9jayBVYnVudHUgQXJ0ZnVsIHBhY2thZ2luZyBleGNlcHQgZm9yOgorIyAtIGNwcDogc3RvY2sgYm9vc3QgMS42MiBpbiBhcnRmdWwgaGFzIGEgbmFzdHkgYnVnIHNvIHdlIHVzZSBzdG9jayBib29zdCAxLjYzCisjIC0gZDogZG1kIGRvZXMgbm90IGNvbWUgd2l0aCBVYnVudHUKKyMgLSBkYXJ0OiBkb2VzIG5vdCBjb21lIHdpdGggVWJ1bnR1LiBQaW5uZWQgdG8gbGFzdCAxLnggcmVsZWFzZQorIyAtIGRvdG5ldDogZG9lcyBub3QgY29tZSB3aXRoIFVidW50dQorIyAtIGhheGU6IHZlcnNpb24gMy40LjIgdGhhdCBjb21lcyB3aXRoIFVidW50dSBjb3JlcyBpbiBvdXIgQ0kgYnVpbGQKKyMgLSBnbzogYXJ0ZnVsIGNvbWVzIHdpdGggMS45LCB3ZSB3YW50IHRoZSBsYXRlc3QgKHN1cHBvcnRlZCkKKyMgLSBub2RlanM6IHdhbnQgdjgsIGFydGZ1bCBjb21lcyB3aXRoIHY2CisjCisKK0ZST00gYnVpbGRwYWNrLWRlcHM6YXJ0ZnVsLXNjbQorTUFJTlRBSU5FUiBBcGFjaGUgVGhyaWZ0IDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+CitFTlYgREVCSUFOX0ZST05URU5EIG5vbmludGVyYWN0aXZlCisKKyMjIyBBZGQgYXB0IHJlcG9zCisKK1JVTiBhcHQtZ2V0IHVwZGF0ZSAmJiBcCisgICAgYXB0LWdldCBkaXN0LXVwZ3JhZGUgLXkgJiYgXAorICAgIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCisgICAgICBhcHQgXAorICAgICAgYXB0LXRyYW5zcG9ydC1odHRwcyBcCisgICAgICBhcHQtdXRpbHMgXAorICAgICAgY3VybCBcCisgICAgICBkaXJtbmdyIFwKKyAgICAgIHNvZnR3YXJlLXByb3BlcnRpZXMtY29tbW9uIFwKKyAgICAgIHdnZXQKKworIyBjc2hhcnAgKG1vbm8pIC0gaWYgd2UgZXZlciB3YW50IGEgbGF0ZXIgdmVyc2lvbgorIyBSVU4gZWNobyAiZGViIGh0dHA6Ly9kb3dubG9hZC5tb25vLXByb2plY3QuY29tL3JlcG8vZGViaWFuIHhlbmlhbCBtYWluIiB8IHRlZSAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9tb25vLmxpc3QgJiYgXAorIyAgICAgYXB0LWtleSBhZHYgLS1rZXlzZXJ2ZXIga2V5c2VydmVyLnVidW50dS5jb20gLS1yZWN2LWtleXMgQTZBMTlCMzhEM0Q4MzFFRgorCisjIERhcnQKK1JVTiBjdXJsIGh0dHBzOi8vZGwtc3NsLmdvb2dsZS5jb20vbGludXgvbGludXhfc2lnbmluZ19rZXkucHViIHwgYXB0LWtleSBhZGQgLSAmJiBcCisgICAgY3VybCBodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQuZGFydGxhbmcub3JnL2xpbnV4L2RlYmlhbi9kYXJ0X3N0YWJsZS5saXN0ID4gXAorICAgICAgL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvZGFydF9zdGFibGUubGlzdAorRU5WIERBUlRfVkVSU0lPTiAxLjI0LjMtMQorCisjIGRvdG5ldCAobmV0Y29yZSkKK1JVTiBjdXJsIGh0dHBzOi8vcGFja2FnZXMubWljcm9zb2Z0LmNvbS9rZXlzL21pY3Jvc29mdC5hc2MgfCBncGcgLS1kZWFybW9yID4gL2V0Yy9hcHQvdHJ1c3RlZC5ncGcuZC9taWNyb3NvZnQuZ3BnICYmIFwKKyAgICBlY2hvICJkZWIgW2FyY2g9YW1kNjRdIGh0dHBzOi8vcGFja2FnZXMubWljcm9zb2Z0LmNvbS9yZXBvcy9taWNyb3NvZnQtdWJ1bnR1LWFydGZ1bC1wcm9kIGFydGZ1bCBtYWluIiA+IFwKKyAgICAgIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2RvdG5ldGRldi5saXN0CisKKyMgaGF4ZSAoaHR0cHM6Ly9oYXhlLm9yZy9kb3dubG9hZC9saW51eC8pCitSVU4gYWRkLWFwdC1yZXBvc2l0b3J5IHBwYTpoYXhlL3JlbGVhc2VzIC15CisKKyMgbm9kZS5qcworUlVOIGN1cmwgLXNMIGh0dHBzOi8vZGViLm5vZGVzb3VyY2UuY29tL2dwZ2tleS9ub2Rlc291cmNlLmdwZy5rZXkgfCBhcHQta2V5IGFkZCAtICYmIFwKKyAgICBlY2hvICJkZWIgaHR0cHM6Ly9kZWIubm9kZXNvdXJjZS5jb20vbm9kZV84LnggYXJ0ZnVsIG1haW4iIHwgdGVlIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL25vZGVzb3VyY2UubGlzdAorCisjIyMgaW5zdGFsbCBnZW5lcmFsIGRlcGVuZGVuY2llcworUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBHZW5lcmFsIGRlcGVuZGVuY2llc2AgXAorICAgICAgYmFzaC1jb21wbGV0aW9uIFwKKyAgICAgIGJpc29uIFwKKyAgICAgIGJ1aWxkLWVzc2VudGlhbCBcCisgICAgICBjbGFuZyBcCisgICAgICBjbWFrZSBcCisgICAgICBkZWJoZWxwZXIgXAorICAgICAgZmxleCBcCisgICAgICBnZGIgXAorICAgICAgbGx2bSBcCisgICAgICBuaW5qYS1idWlsZCBcCisgICAgICBwa2ctY29uZmlnIFwKKyAgICAgIHZhbGdyaW5kIFwKKyAgICAgIHZpbQorRU5WIFBBVEggL3Vzci9saWIvbGx2bS0zLjgvYmluOiRQQVRICisKKyMgYm9vc3QtMS42MiBoYXMgYSB0ZXJyaWJsZSBidWcgaW4gYm9vc3Q6OnRlc3QsIHNlZSBodHRwczovL3N2bi5ib29zdC5vcmcvdHJhYzEwL3RpY2tldC8xMjUwNworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBDKysgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJib29zdDEuNjMtYWxsLWRldiBcCisgICAgICBsaWJldmVudC1kZXYgXAorICAgICAgbGlic3NsLWRldiBcCisgICAgICBxdDUtZGVmYXVsdCBcCisgICAgICBxdGJhc2U1LWRldiBcCisgICAgICBxdGJhc2U1LWRldi10b29scworCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIGNzaGFycCAobW9ubykgZGVwZW5kZW5jaWVzYCBcCisgICAgICBtb25vLWRldmVsCisKK0VOViBTQkNMX1ZFUlNJT04gMS40LjUKK1JVTiBcCitgIyBDb21tb24gTGlzcCAoc2JjbCkgZGVwZW5kZW5jaWVzYCBcCisgICAgY3VybCAtLXZlcnNpb24gJiYgXAorICAgIGN1cmwgLU8gLUogLUwgaHR0cHM6Ly9rZW50LmRsLnNvdXJjZWZvcmdlLm5ldC9wcm9qZWN0L3NiY2wvc2JjbC8ke1NCQ0xfVkVSU0lPTn0vc2JjbC0ke1NCQ0xfVkVSU0lPTn0teDg2LTY0LWxpbnV4LWJpbmFyeS50YXIuYnoyICYmIFwKKyAgICB0YXIgeGpmIHNiY2wtJHtTQkNMX1ZFUlNJT059LXg4Ni02NC1saW51eC1iaW5hcnkudGFyLmJ6MiAmJiBcCisgICAgY2Qgc2JjbC0ke1NCQ0xfVkVSU0lPTn0teDg2LTY0LWxpbnV4ICYmIFwKKyAgICAuL2luc3RhbGwuc2ggJiYgXAorICAgIHNiY2wgLS12ZXJzaW9uICYmIFwKKyAgICBybSAtcmYgc2JjbCoKKworRU5WIERfVkVSU0lPTiAgICAgMi4wODAuMAorRU5WIERNRF9ERUIgICAgICAgZG1kXzIuMDgwLjAtMF9hbWQ2NC5kZWIKK1JVTiBcCitgIyBEIGRlcGVuZGVuY2llc2AgXAorICAgIHdnZXQgLXEgaHR0cDovL2Rvd25sb2Fkcy5kbGFuZy5vcmcvcmVsZWFzZXMvMi54LyR7RF9WRVJTSU9OfS8ke0RNRF9ERUJ9ICYmIFwKKyAgICBkcGtnIC0taW5zdGFsbCAke0RNRF9ERUJ9ICYmIFwKKyAgICBybSAtZiAke0RNRF9ERUJ9ICYmIFwKKyAgICBta2RpciAtcCAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9kZWltb3MgL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvQyAmJiBcCisgICAgY3VybCAtc1NMIGh0dHBzOi8vZ2l0aHViLmNvbS9ELVByb2dyYW1taW5nLURlaW1vcy9saWJldmVudC9hcmNoaXZlL21hc3Rlci50YXIuZ3p8IHRhciB4eiAmJiBcCisgICAgbXYgbGliZXZlbnQtbWFzdGVyL2RlaW1vcy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcy8gJiYgXAorICAgIG12IGxpYmV2ZW50LW1hc3Rlci9DLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvQy8gJiYgXAorICAgIHJtIC1yZiBsaWJldmVudC1tYXN0ZXIgJiYgXAorICAgIGN1cmwgLXNTTCBodHRwczovL2dpdGh1Yi5jb20vRC1Qcm9ncmFtbWluZy1EZWltb3Mvb3BlbnNzbC9hcmNoaXZlL21hc3Rlci50YXIuZ3p8IHRhciB4eiAmJiBcCisgICAgbXYgb3BlbnNzbC1tYXN0ZXIvZGVpbW9zLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvZGVpbW9zLyAmJiBcCisgICAgbXYgb3BlbnNzbC1tYXN0ZXIvQy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L0MvICYmIFwKKyAgICBybSAtcmYgb3BlbnNzbC1tYXN0ZXIKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCisgICAgICBgIyBEYXJ0IGRlcGVuZGVuY2llc2AgXAorICAgICAgZGFydD0kREFSVF9WRVJTSU9OCitFTlYgUEFUSCAvdXNyL2xpYi9kYXJ0L2JpbjokUEFUSAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIGRvdG5ldCBjb3JlIGRlcGVuZGVuY2llc2AgXAorICAgICAgZG90bmV0LXNkay0yLjEuNAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEVybGFuZyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGVybGFuZy1iYXNlIFwKKyAgICAgIGVybGFuZy1ldW5pdCBcCisgICAgICBlcmxhbmctZGV2IFwKKyAgICAgIGVybGFuZy10b29scyBcCisgICAgICByZWJhcgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEdsaWJDIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGliZ2xpYjIuMC1kZXYKKworIyBnb2xhbmcKK0VOViBHT0xBTkdfVkVSU0lPTiAxLjEwCitFTlYgR09MQU5HX0RPV05MT0FEX1VSTCBodHRwczovL2dvbGFuZy5vcmcvZGwvZ28kR09MQU5HX1ZFUlNJT04ubGludXgtYW1kNjQudGFyLmd6CitFTlYgR09MQU5HX0RPV05MT0FEX1NIQTI1NiBiNWE2NDMzNWYxNDkwMjc3YjU4NTgzMmQxZjZjN2Y4YzZjMTEyMDZjYmE1Y2QzZjc3MWRjYjg3Yjk4YWQxYTMzCitSVU4gY3VybCAtZnNTTCAiJEdPTEFOR19ET1dOTE9BRF9VUkwiIC1vIGdvbGFuZy50YXIuZ3ogJiYgXAorICAgICAgZWNobyAiJEdPTEFOR19ET1dOTE9BRF9TSEEyNTYgIGdvbGFuZy50YXIuZ3oiIHwgc2hhMjU2c3VtIC1jIC0gJiYgXAorICAgICAgICAgICAgdGFyIC1DIC91c3IvbG9jYWwgLXh6ZiBnb2xhbmcudGFyLmd6ICYmIFwKKyAgICAgICAgICAgICAgICAgIGxuIC1zIC91c3IvbG9jYWwvZ28vYmluL2dvIC91c3IvbG9jYWwvYmluICYmIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJtIGdvbGFuZy50YXIuZ3oKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBIYXNrZWxsIGRlcGVuZGVuY2llc2AgXAorICAgICAgZ2hjIFwKKyAgICAgIGNhYmFsLWluc3RhbGwKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBIYXhlIGRlcGVuZGVuY2llc2AgXAorICAgICAgaGF4ZSBcCisgICAgICBuZWtvIFwKKyAgICAgIG5la28tZGV2ICYmIFwKKyAgICBoYXhlbGliIHNldHVwIC0tYWx3YXlzIC91c3Ivc2hhcmUvaGF4ZS9saWIgJiYgXAorICAgIGhheGVsaWIgaW5zdGFsbCAtLWFsd2F5cyBoeGNwcCAyPiYxID4gL2Rldi9udWxsCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgSmF2YSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGFudCBcCisgICAgICBhbnQtb3B0aW9uYWwgXAorICAgICAgb3Blbmpkay04LWpkayBcCisgICAgICBtYXZlbgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEx1YSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGx1YTUuMiBcCisgICAgICBsdWE1LjItZGV2CisjIGh0dHBzOi8vYnVncy5sYXVuY2hwYWQubmV0L3VidW50dS8rc291cmNlL2x1YTUuMy8rYnVnLzE3MDcyMTIKKyMgbHVhNS4zIGRvZXMgbm90IGluc3RhbGwgYWx0ZXJuYXRpdmVzIQorIyBuZWVkIHRvIHVwZGF0ZSBvdXIgbHVhc29ja2V0IGNvZGUsIGx1YSBkb2Vzbid0IGhhdmUgbHVhTF9vcGVubGliIGFueSBtb3JlCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgTm9kZS5qcyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIG5vZGVqcworCisjIFRlc3QgZGVwZW5kZW5jaWVzIGZvciBydW5uaW5nIHB1cHBldGVlcgorUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBKUyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYnhzczEKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBPQ2FtbCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIG9jYW1sIFwKKyAgICAgIG9wYW0gJiYgXAorICAgIG9wYW0gaW5pdCAtLXllcyAmJiBcCisgICAgb3BhbSBpbnN0YWxsIC0teWVzIG9hc2lzCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUGVybCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYmJpdC12ZWN0b3ItcGVybCBcCisgICAgICBsaWJjbGFzcy1hY2Nlc3Nvci1jbGFzcy1wZXJsIFwKKyAgICAgIGxpYmNyeXB0LXNzbGVheS1wZXJsIFwKKyAgICAgIGxpYmlvLXNvY2tldC1zc2wtcGVybCBcCisgICAgICBsaWJuZXQtc3NsZWF5LXBlcmwKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBQaHAgZGVwZW5kZW5jaWVzYCBcCisgICAgICBwaHAgXAorICAgICAgcGhwLWNsaSBcCisgICAgICBwaHAtZGV2IFwKKyAgICAgIHBocC1wZWFyIFwKKyAgICAgIHJlMmMgXAorICAgICAgY29tcG9zZXIKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBQeXRob24gZGVwZW5kZW5jaWVzYCBcCisgICAgICBweXRob24tYWxsIFwKKyAgICAgIHB5dGhvbi1hbGwtZGJnIFwKKyAgICAgIHB5dGhvbi1hbGwtZGV2IFwKKyAgICAgIHB5dGhvbi1pcGFkZHJlc3MgXAorICAgICAgcHl0aG9uLXBpcCBcCisgICAgICBweXRob24tc2V0dXB0b29scyBcCisgICAgICBweXRob24tc2l4IFwKKyAgICAgIHB5dGhvbi10b3JuYWRvIFwKKyAgICAgIHB5dGhvbi10d2lzdGVkIFwKKyAgICAgIHB5dGhvbi13aGVlbCBcCisgICAgICBweXRob24tem9wZS5pbnRlcmZhY2UgJiYgXAorICAgcGlwIGluc3RhbGwgLS11cGdyYWRlIGJhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBQeXRob24zIGRlcGVuZGVuY2llc2AgXAorICAgICAgcHl0aG9uMy1hbGwgXAorICAgICAgcHl0aG9uMy1hbGwtZGJnIFwKKyAgICAgIHB5dGhvbjMtYWxsLWRldiBcCisgICAgICBweXRob24zLXBpcCBcCisgICAgICBweXRob24zLXNldHVwdG9vbHMgXAorICAgICAgcHl0aG9uMy1zaXggXAorICAgICAgcHl0aG9uMy10b3JuYWRvIFwKKyAgICAgIHB5dGhvbjMtdHdpc3RlZCBcCisgICAgICBweXRob24zLXdoZWVsIFwKKyAgICAgIHB5dGhvbjMtem9wZS5pbnRlcmZhY2UKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBSdWJ5IGRlcGVuZGVuY2llc2AgXAorICAgICAgcnVieSBcCisgICAgICBydWJ5LWRldiBcCisgICAgICBydWJ5LWJ1bmRsZXIKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBSdXN0IGRlcGVuZGVuY2llc2AgXAorICAgICAgY2FyZ28gXAorICAgICAgcnVzdGMKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBTdGF0aWMgQ29kZSBBbmFseXNpcyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGNwcGNoZWNrIFwKKyAgICAgIHNsb2Njb3VudCAmJiBcCisgICAgcGlwIGluc3RhbGwgZmxha2U4CisKKyMgQ2xlYW4gdXAKK1JVTiBybSAtcmYgL3Zhci9jYWNoZS9hcHQvKiAmJiBcCisgICAgcm0gLXJmIC92YXIvbGliL2FwdC9saXN0cy8qICYmIFwKKyAgICBybSAtcmYgL3RtcC8qICYmIFwKKyAgICBybSAtcmYgL3Zhci90bXAvKgorCitFTlYgVEhSSUZUX1JPT1QgL3RocmlmdAorUlVOIG1rZGlyIC1wICRUSFJJRlRfUk9PVC9zcmMKK0NPUFkgRG9ja2VyZmlsZSAkVEhSSUZUX1JPT1QvCitXT1JLRElSICRUSFJJRlRfUk9PVC9zcmMKZGlmZiAtLWdpdCBhL2J1aWxkL2RvY2tlci91YnVudHUtYmlvbmljL0RvY2tlcmZpbGUgYi9idWlsZC9kb2NrZXIvdWJ1bnR1LWJpb25pYy9Eb2NrZXJmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzYzk5YTkKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9kb2NrZXIvdWJ1bnR1LWJpb25pYy9Eb2NrZXJmaWxlCkBAIC0wLDAgKzEsMjc5IEBACisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMKKyMgQXBhY2hlIFRocmlmdCBEb2NrZXIgYnVpbGQgZW52aXJvbm1lbnQgZm9yIFVidW50dSBCaW9uaWMKKyMgVXNpbmcgYWxsIHN0b2NrIFVidW50dSBCaW9uaWMgcGFja2FnaW5nIGV4Y2VwdCBmb3I6CisjIC0gY2w6IHdhbnQgbGF0ZXN0CisjIC0gZDogZG1kIGRvZXMgbm90IGNvbWUgd2l0aCBVYnVudHUKKyMgLSBkYXJ0OiBkb2VzIG5vdCBjb21lIHdpdGggVWJ1bnR1LiBQaW5uZWQgdG8gbGFzdCAxLnggcmVsZWFzZQorIyAtIGRvdG5ldDogZG9lcyBub3QgY29tZSB3aXRoIFVidW50dQorIyAtIGdvOiB3YW50IGxhdGVzdAorIyAtIG5vZGVqczogd2FudCB2OCwgYmlvbmljIGNvbWVzIHdpdGggdjYKKyMKKworRlJPTSBidWlsZHBhY2stZGVwczpiaW9uaWMtc2NtCitNQUlOVEFJTkVSIEFwYWNoZSBUaHJpZnQgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KK0VOViBERUJJQU5fRlJPTlRFTkQgbm9uaW50ZXJhY3RpdmUKKworIyMjIEFkZCBhcHQgcmVwb3MKKworUlVOIGFwdC1nZXQgdXBkYXRlICYmIFwKKyAgICBhcHQtZ2V0IGRpc3QtdXBncmFkZSAteSAmJiBcCisgICAgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKKyAgICAgIGFwdCBcCisgICAgICBhcHQtdHJhbnNwb3J0LWh0dHBzIFwKKyAgICAgIGFwdC11dGlscyBcCisgICAgICBjdXJsIFwKKyAgICAgIGRpcm1uZ3IgXAorICAgICAgc29mdHdhcmUtcHJvcGVydGllcy1jb21tb24gXAorICAgICAgd2dldAorCisjIGNzaGFycCAobW9ubykgLSBpZiB3ZSBldmVyIHdhbnQgYSBsYXRlciB2ZXJzaW9uCisjIFJVTiBlY2hvICJkZWIgaHR0cDovL2Rvd25sb2FkLm1vbm8tcHJvamVjdC5jb20vcmVwby9kZWJpYW4geGVuaWFsIG1haW4iIHwgdGVlIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL21vbm8ubGlzdCAmJiBcCisjICAgICBhcHQta2V5IGFkdiAtLWtleXNlcnZlciBrZXlzZXJ2ZXIudWJ1bnR1LmNvbSAtLXJlY3Yta2V5cyBBNkExOUIzOEQzRDgzMUVGCisKKyMgRGFydAorUlVOIGN1cmwgaHR0cHM6Ly9kbC1zc2wuZ29vZ2xlLmNvbS9saW51eC9saW51eF9zaWduaW5nX2tleS5wdWIgfCBhcHQta2V5IGFkZCAtICYmIFwKKyAgICBjdXJsIGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC5kYXJ0bGFuZy5vcmcvbGludXgvZGViaWFuL2RhcnRfc3RhYmxlLmxpc3QgPiBcCisgICAgICAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9kYXJ0X3N0YWJsZS5saXN0CitFTlYgREFSVF9WRVJTSU9OIDEuMjQuMy0xCisKKyMgZG90bmV0IChuZXRjb3JlKQorUlVOIGN1cmwgaHR0cHM6Ly9wYWNrYWdlcy5taWNyb3NvZnQuY29tL2tleXMvbWljcm9zb2Z0LmFzYyB8IGdwZyAtLWRlYXJtb3IgPiAvZXRjL2FwdC90cnVzdGVkLmdwZy5kL21pY3Jvc29mdC5ncGcgJiYgXAorICAgIHdnZXQgLXEgLU8gL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvbWljcm9zb2Z0LXByb2QubGlzdCBodHRwczovL3BhY2thZ2VzLm1pY3Jvc29mdC5jb20vY29uZmlnL3VidW50dS8xOC4wNC9wcm9kLmxpc3QgJiYgXAorICAgIGNob3duIHJvb3Q6cm9vdCAvZXRjL2FwdC90cnVzdGVkLmdwZy5kL21pY3Jvc29mdC5ncGcgJiYgXAorICAgIGNob3duIHJvb3Q6cm9vdCAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9taWNyb3NvZnQtcHJvZC5saXN0CisKKyMgbm9kZS5qcworUlVOIGN1cmwgLXNMIGh0dHBzOi8vZGViLm5vZGVzb3VyY2UuY29tL2dwZ2tleS9ub2Rlc291cmNlLmdwZy5rZXkgfCBhcHQta2V5IGFkZCAtICYmIFwKKyAgICBlY2hvICJkZWIgaHR0cHM6Ly9kZWIubm9kZXNvdXJjZS5jb20vbm9kZV84LnggYmlvbmljIG1haW4iIHwgdGVlIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL25vZGVzb3VyY2UubGlzdAorCisjIyMgaW5zdGFsbCBnZW5lcmFsIGRlcGVuZGVuY2llcworUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBHZW5lcmFsIGRlcGVuZGVuY2llc2AgXAorICAgICAgYmFzaC1jb21wbGV0aW9uIFwKKyAgICAgIGJpc29uIFwKKyAgICAgIGJ1aWxkLWVzc2VudGlhbCBcCisgICAgICBjbGFuZyBcCisgICAgICBjbWFrZSBcCisgICAgICBkZWJoZWxwZXIgXAorICAgICAgZmxleCBcCisgICAgICBnZGIgXAorICAgICAgbGx2bSBcCisgICAgICBuaW5qYS1idWlsZCBcCisgICAgICBwa2ctY29uZmlnIFwKKyAgICAgIHZhbGdyaW5kIFwKKyAgICAgIHZpbQorRU5WIFBBVEggL3Vzci9saWIvbGx2bS02LjAvYmluOiRQQVRICisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgQysrIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGliYm9vc3QtYWxsLWRldiBcCisgICAgICBsaWJldmVudC1kZXYgXAorICAgICAgbGlic3NsLWRldiBcCisgICAgICBxdDUtZGVmYXVsdCBcCisgICAgICBxdGJhc2U1LWRldiBcCisgICAgICBxdGJhc2U1LWRldi10b29scworCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIGNzaGFycCAobW9ubykgZGVwZW5kZW5jaWVzYCBcCisgICAgICBtb25vLWRldmVsCisKK0VOViBTQkNMX1ZFUlNJT04gMS40LjE1CitSVU4gXAorYCMgQ29tbW9uIExpc3AgKHNiY2wpIGRlcGVuZGVuY2llc2AgXAorICAgIGN1cmwgLS12ZXJzaW9uICYmIFwKKyAgICBjdXJsIC1vIHNiY2wtJHtTQkNMX1ZFUlNJT059LXg4Ni02NC1saW51eC1iaW5hcnkudGFyLmJ6MiAtSiAtTCBodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9zYmNsL2ZpbGVzL3NiY2wvJHtTQkNMX1ZFUlNJT059L3NiY2wtJHtTQkNMX1ZFUlNJT059LXg4Ni02NC1saW51eC1iaW5hcnkudGFyLmJ6Mi9kb3dubG9hZD91c2VfbWlycm9yPW1hbmFnZWR3YXkjICYmIFwKKyAgICB0YXIgeGpmIHNiY2wtJHtTQkNMX1ZFUlNJT059LXg4Ni02NC1saW51eC1iaW5hcnkudGFyLmJ6MiAmJiBcCisgICAgY2Qgc2JjbC0ke1NCQ0xfVkVSU0lPTn0teDg2LTY0LWxpbnV4ICYmIFwKKyAgICAuL2luc3RhbGwuc2ggJiYgXAorICAgIHNiY2wgLS12ZXJzaW9uICYmIFwKKyAgICBjZCAuLiAmJiBcCisgICAgcm0gLXJmIHNiY2wqCisKK0VOViBEX1ZFUlNJT04gICAgIDIuMDgzLjEKK0VOViBETURfREVCICAgICAgIGRtZF8yLjA4My4xLTBfYW1kNjQuZGViCitSVU4gXAorYCMgRCBkZXBlbmRlbmNpZXNgIFwKKyAgICB3Z2V0IC1xIGh0dHA6Ly9kb3dubG9hZHMuZGxhbmcub3JnL3JlbGVhc2VzLzIueC8ke0RfVkVSU0lPTn0vJHtETURfREVCfSAmJiBcCisgICAgZHBrZyAtLWluc3RhbGwgJHtETURfREVCfSAmJiBcCisgICAgcm0gLWYgJHtETURfREVCfSAmJiBcCisgICAgbWtkaXIgLXAgL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvZGVpbW9zIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L0MgJiYgXAorICAgIGdpdCBjbG9uZSAtYiAndjIuMC4yKzIuMC4xNicgaHR0cHM6Ly9naXRodWIuY29tL0QtUHJvZ3JhbW1pbmctRGVpbW9zL2xpYmV2ZW50LmdpdCBkZWltb3MtbGliZXZlbnQtMi4wICYmIFwKKyAgICBtdiBkZWltb3MtbGliZXZlbnQtMi4wL2RlaW1vcy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcy8gJiYgXAorICAgIG12IGRlaW1vcy1saWJldmVudC0yLjAvQy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L0MvICYmIFwKKyAgICBybSAtcmYgZGVpbW9zLWxpYmV2ZW50LTIuMCAmJiBcCisgICAgZ2l0IGNsb25lIC1iICd2Mi4wLjArMS4xLjBoJyBodHRwczovL2dpdGh1Yi5jb20vRC1Qcm9ncmFtbWluZy1EZWltb3Mvb3BlbnNzbC5naXQgZGVpbW9zLW9wZW5zc2wtMS4xLjBoICYmIFwKKyAgICBtdiBkZWltb3Mtb3BlbnNzbC0xLjEuMGgvZGVpbW9zLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvZGVpbW9zLyAmJiBcCisgICAgbXYgZGVpbW9zLW9wZW5zc2wtMS4xLjBoL0MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DLyAmJiBcCisgICAgcm0gLXJmIGRlaW1vcy1vcGVuc3NsLTEuMS4waAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKKyAgICAgIGAjIERhcnQgZGVwZW5kZW5jaWVzYCBcCisgICAgICBkYXJ0PSREQVJUX1ZFUlNJT04KK0VOViBQQVRIIC91c3IvbGliL2RhcnQvYmluOiRQQVRICisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgZG90bmV0IGNvcmUgZGVwZW5kZW5jaWVzYCBcCisgICAgICBkb3RuZXQtc2RrLTIuMgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEVybGFuZyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGVybGFuZy1iYXNlIFwKKyAgICAgIGVybGFuZy1ldW5pdCBcCisgICAgICBlcmxhbmctZGV2IFwKKyAgICAgIGVybGFuZy10b29scyBcCisgICAgICByZWJhcgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEdsaWJDIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGliZ2xpYjIuMC1kZXYKKworIyBnb2xhbmcKK0VOViBHT0xBTkdfVkVSU0lPTiAxLjExLjQKK0VOViBHT0xBTkdfRE9XTkxPQURfVVJMIGh0dHBzOi8vZ29sYW5nLm9yZy9kbC9nbyRHT0xBTkdfVkVSU0lPTi5saW51eC1hbWQ2NC50YXIuZ3oKK0VOViBHT0xBTkdfRE9XTkxPQURfU0hBMjU2IGZiMjZjMzBlNmEwNGFkOTM3YmJjNjU3YTFiNWJiYTkyZjgwMDk2YWYxZThlZTZkYTY0MzBjMDQ1YThkYjNhNWIKK1JVTiBjdXJsIC1mc1NMICIkR09MQU5HX0RPV05MT0FEX1VSTCIgLW8gZ29sYW5nLnRhci5neiAmJiBcCisgICAgICBlY2hvICIkR09MQU5HX0RPV05MT0FEX1NIQTI1NiAgZ29sYW5nLnRhci5neiIgfCBzaGEyNTZzdW0gLWMgLSAmJiBcCisgICAgICAgICAgICB0YXIgLUMgL3Vzci9sb2NhbCAteHpmIGdvbGFuZy50YXIuZ3ogJiYgXAorICAgICAgICAgICAgICAgICAgbG4gLXMgL3Vzci9sb2NhbC9nby9iaW4vZ28gL3Vzci9sb2NhbC9iaW4gJiYgXAorICAgICAgICAgICAgICAgICAgICAgICAgcm0gZ29sYW5nLnRhci5negorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEhhc2tlbGwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBnaGMgXAorICAgICAgY2FiYWwtaW5zdGFsbAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEhheGUgZGVwZW5kZW5jaWVzYCBcCisgICAgICBoYXhlIFwKKyAgICAgIG5la28gXAorICAgICAgbmVrby1kZXYgJiYgXAorICAgIGhheGVsaWIgc2V0dXAgLS1hbHdheXMgL3Vzci9zaGFyZS9oYXhlL2xpYiAmJiBcCisgICAgaGF4ZWxpYiBpbnN0YWxsIC0tYWx3YXlzIGh4Y3BwIDI+JjEgPiAvZGV2L251bGwKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBKYXZhIGRlcGVuZGVuY2llc2AgXAorICAgICAgYW50IFwKKyAgICAgIGFudC1vcHRpb25hbCBcCisgICAgICBvcGVuamRrLTgtamRrIFwKKyAgICAgIG1hdmVuICYmIFwKKyAgICB1cGRhdGUtYWx0ZXJuYXRpdmVzIC0tc2V0IGphdmEgL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0L2pyZS9iaW4vamF2YQorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEx1YSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGx1YTUuMiBcCisgICAgICBsdWE1LjItZGV2CisjIGh0dHBzOi8vYnVncy5sYXVuY2hwYWQubmV0L3VidW50dS8rc291cmNlL2x1YTUuMy8rYnVnLzE3MDcyMTIKKyMgbHVhNS4zIGRvZXMgbm90IGluc3RhbGwgYWx0ZXJuYXRpdmVzIQorIyBuZWVkIHRvIHVwZGF0ZSBvdXIgbHVhc29ja2V0IGNvZGUsIGx1YSBkb2Vzbid0IGhhdmUgbHVhTF9vcGVubGliIGFueSBtb3JlCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgTm9kZS5qcyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIG5vZGVqcworCisjIFRlc3QgZGVwZW5kZW5jaWVzIGZvciBydW5uaW5nIHB1cHBldGVlcgorUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBKUyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYnhzczEKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBPQ2FtbCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIG9jYW1sIFwKKyAgICAgIG9wYW0gJiYgXAorICAgIG9wYW0gaW5pdCAtLXllcyAmJiBcCisgICAgb3BhbSBpbnN0YWxsIC0teWVzIG9hc2lzCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUGVybCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYmJpdC12ZWN0b3ItcGVybCBcCisgICAgICBsaWJjbGFzcy1hY2Nlc3Nvci1jbGFzcy1wZXJsIFwKKyAgICAgIGxpYmNyeXB0LXNzbGVheS1wZXJsIFwKKyAgICAgIGxpYmlvLXNvY2tldC1zc2wtcGVybCBcCisgICAgICBsaWJuZXQtc3NsZWF5LXBlcmwKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBQaHAgZGVwZW5kZW5jaWVzYCBcCisgICAgICBwaHAgXAorICAgICAgcGhwLWNsaSBcCisgICAgICBwaHAtZGV2IFwKKyAgICAgIHBocC1wZWFyIFwKKyAgICAgIHJlMmMgXAorICAgICAgY29tcG9zZXIKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBQeXRob24gZGVwZW5kZW5jaWVzYCBcCisgICAgICBweXRob24tYWxsIFwKKyAgICAgIHB5dGhvbi1hbGwtZGJnIFwKKyAgICAgIHB5dGhvbi1hbGwtZGV2IFwKKyAgICAgIHB5dGhvbi1pcGFkZHJlc3MgXAorICAgICAgcHl0aG9uLXBpcCBcCisgICAgICBweXRob24tc2V0dXB0b29scyBcCisgICAgICBweXRob24tc2l4IFwKKyAgICAgIHB5dGhvbi10b3JuYWRvIFwKKyAgICAgIHB5dGhvbi10d2lzdGVkIFwKKyAgICAgIHB5dGhvbi13aGVlbCBcCisgICAgICBweXRob24tem9wZS5pbnRlcmZhY2UgJiYgXAorICAgcGlwIGluc3RhbGwgLS11cGdyYWRlIGJhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBQeXRob24zIGRlcGVuZGVuY2llc2AgXAorICAgICAgcHl0aG9uMy1hbGwgXAorICAgICAgcHl0aG9uMy1hbGwtZGJnIFwKKyAgICAgIHB5dGhvbjMtYWxsLWRldiBcCisgICAgICBweXRob24zLXBpcCBcCisgICAgICBweXRob24zLXNldHVwdG9vbHMgXAorICAgICAgcHl0aG9uMy1zaXggXAorICAgICAgcHl0aG9uMy10b3JuYWRvIFwKKyAgICAgIHB5dGhvbjMtdHdpc3RlZCBcCisgICAgICBweXRob24zLXdoZWVsIFwKKyAgICAgIHB5dGhvbjMtem9wZS5pbnRlcmZhY2UKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBSdWJ5IGRlcGVuZGVuY2llc2AgXAorICAgICAgcnVieSBcCisgICAgICBydWJ5LWRldiBcCisgICAgICBydWJ5LWJ1bmRsZXIKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBSdXN0IGRlcGVuZGVuY2llc2AgXAorICAgICAgY2FyZ28gXAorICAgICAgcnVzdGMKKworIyBTd2lmdCBvbiBMaW51eCBmb3IgY3Jvc3MgdGVzdHMKK1JVTiBjZCAvICYmIFwKKyAgICB3Z2V0IC0tcXVpZXQgaHR0cHM6Ly9zd2lmdC5vcmcvYnVpbGRzL3N3aWZ0LTQuMi4xLXJlbGVhc2UvdWJ1bnR1MTgwNC9zd2lmdC00LjIuMS1SRUxFQVNFL3N3aWZ0LTQuMi4xLVJFTEVBU0UtdWJ1bnR1MTguMDQudGFyLmd6ICYmIFwKKyAgICB0YXIgeGYgc3dpZnQtNC4yLjEtUkVMRUFTRS11YnVudHUxOC4wNC50YXIuZ3ogLS1zdHJpcC1jb21wb25lbnRzPTEgJiYgXAorICAgIHJtIHN3aWZ0LTQuMi4xLVJFTEVBU0UtdWJ1bnR1MTguMDQudGFyLmd6ICYmIFwKKyAgICBzd2lmdCAtLXZlcnNpb24KKworIyBjcHBjaGVjay0xLjgyIGhhcyBhIG5hc3R5IGNwcCBwYXJzZXIgYnVnLCBzbyB3ZSdyZSB1c2luZyBzb21ldGhpbmcgbmV3ZXIKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgU3RhdGljIENvZGUgQW5hbHlzaXMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBjcHBjaGVjayBcCisgICAgICBzbG9jY291bnQgJiYgXAorICAgIHBpcCBpbnN0YWxsIGZsYWtlOCAmJiBcCisgICAgd2dldCAtcSAiaHR0cHM6Ly9sYXVuY2hwYWQubmV0L3VidW50dS8rc291cmNlL2NwcGNoZWNrLzEuODMtMi8rYnVpbGQvMTQ4NzQ3MDMvK2ZpbGVzL2NwcGNoZWNrXzEuODMtMl9hbWQ2NC5kZWIiICYmIFwKKyAgICBkcGtnIC1pIGNwcGNoZWNrXzEuODMtMl9hbWQ2NC5kZWIgJiYgXAorICAgIHJtIGNwcGNoZWNrXzEuODMtMl9hbWQ2NC5kZWIKKworIyBDbGVhbiB1cAorUlVOIHJtIC1yZiAvdmFyL2NhY2hlL2FwdC8qICYmIFwKKyAgICBybSAtcmYgL3Zhci9saWIvYXB0L2xpc3RzLyogJiYgXAorICAgIHJtIC1yZiAvdG1wLyogJiYgXAorICAgIHJtIC1yZiAvdmFyL3RtcC8qCisKK0VOViBUSFJJRlRfUk9PVCAvdGhyaWZ0CitSVU4gbWtkaXIgLXAgJFRIUklGVF9ST09UL3NyYworQ09QWSBEb2NrZXJmaWxlICRUSFJJRlRfUk9PVC8KK1dPUktESVIgJFRIUklGVF9ST09UL3NyYwpkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL3VidW50dS14ZW5pYWwvRG9ja2VyZmlsZSBiL2J1aWxkL2RvY2tlci91YnVudHUteGVuaWFsL0RvY2tlcmZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM3MmI0ZAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2RvY2tlci91YnVudHUteGVuaWFsL0RvY2tlcmZpbGUKQEAgLTAsMCArMSwyNzEgQEAKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIworIyBBcGFjaGUgVGhyaWZ0IERvY2tlciBidWlsZCBlbnZpcm9ubWVudCBmb3IgVWJ1bnR1IFhlbmlhbAorIyBVc2luZyBhbGwgc3RvY2sgVWJ1bnR1IFhlbmlhbCBwYWNrYWdpbmcgZXhjZXB0IGZvcjoKKyMgLSBkOiBkb2VzIG5vdCBjb21lIHdpdGggVWJ1bnR1IHNvIHdlJ3JlIGluc3RhbGxpbmcgMi4wNzUuMSBmb3IgY292ZXJhZ2UKKyMgLSBkYXJ0OiBkb2VzIG5vdCBjb21lIHdpdGggVWJ1bnR1IHNvIHdlJ3JlIGluc3RhbGxpbmcgMS4yMi4xIGZvciBjb3ZlcmFnZQorIyAtIGRvdG5ldDogZG9lcyBub3QgY29tZSB3aXRoIFVidW50dQorIyAtIGdvOiBYZW5pYWwgY29tZXMgd2l0aCAxLjYsIGJ1dCB3ZSBuZWVkIDEuNyBvciBsYXRlcgorIyAtIG5vZGVqczogWGVuaWFsIGNvbWVzIHdpdGggNC4yLjYgd2hpY2ggZXhpdHMgTFRTIEFwcmlsIDIwMTgsIHNvIHdlJ3JlIGluc3RhbGxpbmcgNi54CisjIC0gb2NhbWw6IGNhdXNlcyBzdGFjayBvdmVyZmxvdyBlcnJvciwganVzdCBzdGFydGVkIE1hcmNoIDIwMTggbm90IHN1cmUgd2h5CisjCisKK0ZST00gYnVpbGRwYWNrLWRlcHM6eGVuaWFsLXNjbQorTUFJTlRBSU5FUiBBcGFjaGUgVGhyaWZ0IDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+CitFTlYgREVCSUFOX0ZST05URU5EIG5vbmludGVyYWN0aXZlCisKKyMjIyBBZGQgYXB0IHJlcG9zCisKK1JVTiBhcHQtZ2V0IHVwZGF0ZSAmJiBcCisgICAgYXB0LWdldCBkaXN0LXVwZ3JhZGUgLXkgJiYgXAorICAgIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCisgICAgICBhcHQgXAorICAgICAgYXB0LXRyYW5zcG9ydC1odHRwcyBcCisgICAgICBhcHQtdXRpbHMgXAorICAgICAgY3VybCBcCisgICAgICBzb2Z0d2FyZS1wcm9wZXJ0aWVzLWNvbW1vbiBcCisgICAgICB3Z2V0CisKKyMgY3NoYXJwIChtb25vKQorIyBSVU4gZWNobyAiZGViIGh0dHA6Ly9kb3dubG9hZC5tb25vLXByb2plY3QuY29tL3JlcG8vZGViaWFuIHhlbmlhbCBtYWluIiB8IHRlZSAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9tb25vLmxpc3QgJiYgXAorIyAgICAgYXB0LWtleSBhZHYgLS1rZXlzZXJ2ZXIga2V5c2VydmVyLnVidW50dS5jb20gLS1yZWN2LWtleXMgQTZBMTlCMzhEM0Q4MzFFRgorCisjIEQKK1JVTiBhcHQta2V5IGFkdiAtLWtleXNlcnZlciBrZXlzZXJ2ZXIudWJ1bnR1LmNvbSAtLXJlY3Yta2V5cyBFQkNGOTc1RTVCQTI0RDVFICYmIFwKKyAgICB3Z2V0IGh0dHA6Ly9tYXN0ZXIuZGwuc291cmNlZm9yZ2UubmV0L3Byb2plY3QvZC1hcHQvZmlsZXMvZC1hcHQubGlzdCAtTyAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9kLWFwdC5saXN0ICYmIFwKKyAgICB3Z2V0IC1xTyAtIGh0dHBzOi8vZGxhbmcub3JnL2Qta2V5cmluZy5ncGcgfCBhcHQta2V5IGFkZCAtCisKKyMgRGFydAorUlVOIGN1cmwgaHR0cHM6Ly9kbC1zc2wuZ29vZ2xlLmNvbS9saW51eC9saW51eF9zaWduaW5nX2tleS5wdWIgfCBhcHQta2V5IGFkZCAtICYmIFwKKyAgICBjdXJsIGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC5kYXJ0bGFuZy5vcmcvbGludXgvZGViaWFuL2RhcnRfc3RhYmxlLmxpc3QgPiBcCisgICAgICAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9kYXJ0X3N0YWJsZS5saXN0CitFTlYgREFSVF9WRVJTSU9OIDEuMjIuMS0xCisKKyMgZG90bmV0IChjb3JlKQorUlVOIGN1cmwgaHR0cHM6Ly9wYWNrYWdlcy5taWNyb3NvZnQuY29tL2tleXMvbWljcm9zb2Z0LmFzYyB8IGdwZyAtLWRlYXJtb3IgPiAvZXRjL2FwdC90cnVzdGVkLmdwZy5kL21pY3Jvc29mdC5ncGcgJiYgXAorICAgIGVjaG8gImRlYiBbYXJjaD1hbWQ2NF0gaHR0cHM6Ly9wYWNrYWdlcy5taWNyb3NvZnQuY29tL3JlcG9zL21pY3Jvc29mdC11YnVudHUteGVuaWFsLXByb2QgeGVuaWFsIG1haW4iID4gXAorICAgICAgL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvZG90bmV0ZGV2Lmxpc3QKKworIyBub2RlLmpzCitSVU4gY3VybCAtc0wgaHR0cHM6Ly9kZWIubm9kZXNvdXJjZS5jb20vZ3Bna2V5L25vZGVzb3VyY2UuZ3BnLmtleSB8IGFwdC1rZXkgYWRkIC0gJiYgXAorICAgIGVjaG8gImRlYiBodHRwczovL2RlYi5ub2Rlc291cmNlLmNvbS9ub2RlXzYueCB4ZW5pYWwgbWFpbiIgfCB0ZWUgL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvbm9kZXNvdXJjZS5saXN0CisKKyMjIyBpbnN0YWxsIGdlbmVyYWwgZGVwZW5kZW5jaWVzCitSVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEdlbmVyYWwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBiYXNoLWNvbXBsZXRpb24gXAorICAgICAgYmlzb24gXAorICAgICAgYnVpbGQtZXNzZW50aWFsIFwKKyAgICAgIGNsYW5nIFwKKyAgICAgIGNtYWtlIFwKKyAgICAgIGRlYmhlbHBlciBcCisgICAgICBmbGV4IFwKKyAgICAgIGdkYiBcCisgICAgICBsbHZtIFwKKyAgICAgIG5pbmphLWJ1aWxkIFwKKyAgICAgIHBrZy1jb25maWcgXAorICAgICAgdmFsZ3JpbmQgXAorICAgICAgdmltCitFTlYgUEFUSCAvdXNyL2xpYi9sbHZtLTMuOC9iaW46JFBBVEgKKworIyMjIGxhbmd1YWdlcworCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEMrKyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYmJvb3N0LWRldiBcCisgICAgICBsaWJib29zdC1maWxlc3lzdGVtLWRldiBcCisgICAgICBsaWJib29zdC1wcm9ncmFtLW9wdGlvbnMtZGV2IFwKKyAgICAgIGxpYmJvb3N0LXN5c3RlbS1kZXYgXAorICAgICAgbGliYm9vc3QtdGVzdC1kZXYgXAorICAgICAgbGliYm9vc3QtdGhyZWFkLWRldiBcCisgICAgICBsaWJldmVudC1kZXYgXAorICAgICAgbGlic3NsLWRldiBcCisgICAgICBxdDUtZGVmYXVsdCBcCisgICAgICBxdGJhc2U1LWRldiBcCisgICAgICBxdGJhc2U1LWRldi10b29scworCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIGNzaGFycCAobW9ubykgZGVwZW5kZW5jaWVzYCBcCisgICAgICBtb25vLWRldmVsCisKK0VOViBEX1ZFUlNJT04gMi4wNzUuMS0wCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tYWxsb3ctdW5hdXRoZW50aWNhdGVkIC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEQgZGVwZW5kZW5jaWVzYCBcCisgICAgICBkbWQtYmluPSREX1ZFUlNJT04gXAorICAgICAgbGlicGhvYm9zMi1kZXY9JERfVkVSU0lPTiBcCisgICAgICBkdWI9MS42LjAtMCBcCisgICAgICBkZm10IFwKKyAgICAgIGRzY2FubmVyIFwKKyAgICAgIGxpYmV2ZW50LWRldiBcCisgICAgICBsaWJzc2wtZGV2IFwKKyAgICAgIHhkZy11dGlscworUlVOIG1rZGlyIC1wIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcyAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DICYmIFwKKyAgICBjdXJsIC1zU0wgaHR0cHM6Ly9naXRodWIuY29tL0QtUHJvZ3JhbW1pbmctRGVpbW9zL2xpYmV2ZW50L2FyY2hpdmUvbWFzdGVyLnRhci5nenwgdGFyIHh6ICYmIFwKKyAgICBtdiBsaWJldmVudC1tYXN0ZXIvZGVpbW9zLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvZGVpbW9zLyAmJiBcCisgICAgbXYgbGliZXZlbnQtbWFzdGVyL0MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DLyAmJiBcCisgICAgcm0gLXJmIGxpYmV2ZW50LW1hc3RlcgorUlVOIGN1cmwgLXNTTCBodHRwczovL2dpdGh1Yi5jb20vRC1Qcm9ncmFtbWluZy1EZWltb3Mvb3BlbnNzbC9hcmNoaXZlL3YxLjEuNisxLjAuMWcudGFyLmd6IHwgdGFyIHh6ICYmIFwKKyAgICBtdiBvcGVuc3NsLTEuMS42LTEuMC4xZy9kZWltb3MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9kZWltb3MvICYmIFwKKyAgICBtdiBvcGVuc3NsLTEuMS42LTEuMC4xZy9DLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvQy8gJiYgXAorICAgIHJtIC1yZiBvcGVuc3NsLTEuMS42LTEuMC4xZworCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIERhcnQgZGVwZW5kZW5jaWVzYCBcCisgICAgICBkYXJ0PSREQVJUX1ZFUlNJT04KK0VOViBQQVRIIC91c3IvbGliL2RhcnQvYmluOiRQQVRICisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgZG90bmV0IGNvcmUgZGVwZW5kZW5jaWVzYCBcCisgICAgICBkb3RuZXQtc2RrLTIuMS40CisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgRXJsYW5nIGRlcGVuZGVuY2llc2AgXAorICAgICAgZXJsYW5nLWJhc2UgXAorICAgICAgZXJsYW5nLWV1bml0IFwKKyAgICAgIGVybGFuZy1kZXYgXAorICAgICAgZXJsYW5nLXRvb2xzIFwKKyAgICAgIHJlYmFyCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgR2xpYkMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJnbGliMi4wLWRldgorCisjIGdvbGFuZworRU5WIEdPTEFOR19WRVJTSU9OIDEuNy42CitFTlYgR09MQU5HX0RPV05MT0FEX1VSTCBodHRwczovL2dvbGFuZy5vcmcvZGwvZ28kR09MQU5HX1ZFUlNJT04ubGludXgtYW1kNjQudGFyLmd6CitFTlYgR09MQU5HX0RPV05MT0FEX1NIQTI1NiBhZDU4MDhiZjQyYjAxNGMyMmRkNzY0NjQ1OGY2MzEzODUwMDMwNDlkZWQwYmI2YWYyZWZjN2YxZjc5ZmEyOWVhCitSVU4gY3VybCAtZnNTTCAiJEdPTEFOR19ET1dOTE9BRF9VUkwiIC1vIGdvbGFuZy50YXIuZ3ogJiYgXAorICAgICAgZWNobyAiJEdPTEFOR19ET1dOTE9BRF9TSEEyNTYgIGdvbGFuZy50YXIuZ3oiIHwgc2hhMjU2c3VtIC1jIC0gJiYgXAorICAgICAgdGFyIC1DIC91c3IvbG9jYWwgLXh6ZiBnb2xhbmcudGFyLmd6ICYmIFwKKyAgICAgIGxuIC1zIC91c3IvbG9jYWwvZ28vYmluL2dvIC91c3IvbG9jYWwvYmluICYmIFwKKyAgICAgIHJtIGdvbGFuZy50YXIuZ3oKKworIyBkdWUgdG8gYSBidWcgaW4gY2FiYWwgaW4geGVuaWFsIChjYWJhbC1pbnN0YWxsIHBhY2thZ2UpIHdlIHB1bGwgaW4gYW5vdGhlcjoKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgSGFza2VsbCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGdoYyAmJiBcCisgICAgY2QgL3RtcCAmJiBcCisgICAgd2dldCAtcSBodHRwczovL3d3dy5oYXNrZWxsLm9yZy9jYWJhbC9yZWxlYXNlL2NhYmFsLWluc3RhbGwtMS4yNC4wLjIvY2FiYWwtaW5zdGFsbC0xLjI0LjAuMi14ODZfNjQtdW5rbm93bi1saW51eC50YXIuZ3ogJiYgXAorICAgIHRhciB4emYgY2FiYWwtaW5zdGFsbC0xLjI0LjAuMi14ODZfNjQtdW5rbm93bi1saW51eC50YXIuZ3ogJiYgXAorICAgIGZpbmQgZGlzdC1uZXdzdHlsZS8gLXR5cGUgZiAtbmFtZSBjYWJhbCAtZXhlYyBtdiB7fSAvdXNyL2JpbiBcOyAmJiBcCisgICAgcm0gLXJmIC90bXAvY2FiYWwqICYmIFwKKyAgICBjYWJhbCAtLXZlcnNpb24KKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBIYXhlIGRlcGVuZGVuY2llc2AgXAorICAgICAgaGF4ZSBcCisgICAgICBuZWtvIFwKKyAgICAgIG5la28tZGV2IFwKKyAgICAgIGxpYm5la28wICYmIFwKKyAgICBoYXhlbGliIHNldHVwIC0tYWx3YXlzIC91c3Ivc2hhcmUvaGF4ZS9saWIgJiYgXAorICAgIGhheGVsaWIgaW5zdGFsbCAtLWFsd2F5cyBoeGNwcCAzLjQuNjQgMj4mMSA+IC9kZXYvbnVsbAorIyBub3RlOiBoeGNwcCAzLjQuMTg1IChsYXRlc3QpIG5vIGxvbmdlciBzaGlwcyBzdGF0aWMgbGlicmFyaWVzLCBhbmQgY2F1c2VkIGEgYnVpbGQgZmFpbHVyZQorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEphdmEgZGVwZW5kZW5jaWVzYCBcCisgICAgICBhbnQgXAorICAgICAgYW50LW9wdGlvbmFsIFwKKyAgICAgIG9wZW5qZGstOC1qZGsgXAorICAgICAgbWF2ZW4KKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBMdWEgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsdWE1LjIgXAorICAgICAgbHVhNS4yLWRldgorIyBodHRwczovL2J1Z3MubGF1bmNocGFkLm5ldC91YnVudHUvK3NvdXJjZS9sdWE1LjMvK2J1Zy8xNzA3MjEyCisjIGx1YTUuMyBkb2VzIG5vdCBpbnN0YWxsIGFsdGVybmF0aXZlcyBzbyBzdGljayB3aXRoIDUuMiBoZXJlCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgTm9kZS5qcyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIG5vZGVqcworCisjIFRlc3QgZGVwZW5kZW5jaWVzIGZvciBydW5uaW5nIHB1cHBldGVlcgorUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBKUyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYnhzczEgXAorICAgICAgbGliYXRrLWJyaWRnZTIuMC0wIFwKKyAgICAgIGxpYmd0ay0zLTAKKworIyBUSFJJRlQtNDUxNzogY2F1c2VzIHN0YWNrIG92ZXJmbG93czsgdmVyc2lvbiB0b28gb2xkOyBza2lwIG9jYW1sIGluIHhlbmlhbAorIyBSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKKyMgYCMgT0NhbWwgZGVwZW5kZW5jaWVzYCBcCisjICAgICAgIG9jYW1sIFwKKyMgICAgICAgb3BhbSAmJiBcCisjICAgICBvcGFtIGluaXQgLS15ZXMgJiYgXAorIyAgICAgb3BhbSBpbnN0YWxsIC0teWVzIG9hc2lzCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUGVybCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYmJpdC12ZWN0b3ItcGVybCBcCisgICAgICBsaWJjbGFzcy1hY2Nlc3Nvci1jbGFzcy1wZXJsIFwKKyAgICAgIGxpYmNyeXB0LXNzbGVheS1wZXJsIFwKKyAgICAgIGxpYmlvLXNvY2tldC1zc2wtcGVybCBcCisgICAgICBsaWJuZXQtc3NsZWF5LXBlcmwKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBQaHAgZGVwZW5kZW5jaWVzYCBcCisgICAgICBwaHA3LjAgXAorICAgICAgcGhwNy4wLWNsaSBcCisgICAgICBwaHA3LjAtZGV2IFwKKyAgICAgIHBocC1wZWFyIFwKKyAgICAgIHJlMmMgXAorICAgICAgY29tcG9zZXIKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBQeXRob24gZGVwZW5kZW5jaWVzYCBcCisgICAgICBweXRob24tYWxsIFwKKyAgICAgIHB5dGhvbi1hbGwtZGJnIFwKKyAgICAgIHB5dGhvbi1hbGwtZGV2IFwKKyAgICAgIHB5dGhvbi1iYWNrcG9ydHMuc3NsLW1hdGNoLWhvc3RuYW1lIFwKKyAgICAgIHB5dGhvbi1pcGFkZHJlc3MgXAorICAgICAgcHl0aG9uLXBpcCBcCisgICAgICBweXRob24tc2V0dXB0b29scyBcCisgICAgICBweXRob24tc2l4IFwKKyAgICAgIHB5dGhvbi10b3JuYWRvIFwKKyAgICAgIHB5dGhvbi10d2lzdGVkIFwKKyAgICAgIHB5dGhvbi13aGVlbCBcCisgICAgICBweXRob24tem9wZS5pbnRlcmZhY2UgXAorICAgICAgcHl0aG9uMy1hbGwgXAorICAgICAgcHl0aG9uMy1hbGwtZGJnIFwKKyAgICAgIHB5dGhvbjMtYWxsLWRldiBcCisgICAgICBweXRob24zLXNldHVwdG9vbHMgXAorICAgICAgcHl0aG9uMy1zaXggXAorICAgICAgcHl0aG9uMy10b3JuYWRvIFwKKyAgICAgIHB5dGhvbjMtdHdpc3RlZCBcCisgICAgICBweXRob24zLXdoZWVsIFwKKyAgICAgIHB5dGhvbjMtem9wZS5pbnRlcmZhY2UgJiYgXAorICAgIHBpcCBpbnN0YWxsIC0tdXBncmFkZSBiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUnVieSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHJ1YnkgXAorICAgICAgcnVieS1kZXYgXAorICAgICAgcnVieS1idW5kbGVyCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUnVzdCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGNhcmdvIFwKKyAgICAgIHJ1c3RjCisKKyMgQ2xlYW4gdXAKK1JVTiBybSAtcmYgL3Zhci9jYWNoZS9hcHQvKiAmJiBcCisgICAgcm0gLXJmIC92YXIvbGliL2FwdC9saXN0cy8qICYmIFwKKyAgICBybSAtcmYgL3RtcC8qICYmIFwKKyAgICBybSAtcmYgL3Zhci90bXAvKgorCitFTlYgRE9UTkVUX0NMSV9URUxFTUVUUllfT1BUT1VUIDEKK0VOViBUSFJJRlRfUk9PVCAvdGhyaWZ0CitSVU4gbWtkaXIgLXAgJFRIUklGVF9ST09UL3NyYworQ09QWSBEb2NrZXJmaWxlICRUSFJJRlRfUk9PVC8KK1dPUktESVIgJFRIUklGVF9ST09UL3NyYwpkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL3VidW50dS9Eb2NrZXJmaWxlIGIvYnVpbGQvZG9ja2VyL3VidW50dS9Eb2NrZXJmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTQ4MDA2Li4wMDAwMDAwCi0tLSBhL2J1aWxkL2RvY2tlci91YnVudHUvRG9ja2VyZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSMgQXBhY2hlIFRocmlmdCBEb2NrZXIgYnVpbGQgZW52aXJvbm1lbnQgZm9yIENlbnRvcwotIwotIyBLbm93biBtaXNzaW5nIGNsaWVudCBsaWJyYXJpZXM6Ci0jICAtIE5vbmUKLQotRlJPTSB1YnVudHU6dHJ1c3R5Ci1NQUlOVEFJTkVSIEFwYWNoZSBUaHJpZnQgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KLQotRU5WIEhPTUUgL3Jvb3QKLUVOViBERUJJQU5fRlJPTlRFTkQgbm9uaW50ZXJhY3RpdmUKLQotUlVOIGFwdC1nZXQgdXBkYXRlIC15ICYmIGFwdC1nZXQgZGlzdC11cGdyYWRlIC15Ci0KLSMgR2VuZXJhbCBkZXBlbmRlbmNpZXMKLVJVTiBhcHQtZ2V0IGluc3RhbGwgLXkgYXV0b21ha2UgbGlidG9vbCBmbGV4IGJpc29uIHBrZy1jb25maWcgZysrIGxpYnNzbC1kZXYgbWFrZSBsaWJxdDQtZGV2IGdpdCBcCi0gICAgZGViaGVscGVyIGNtYWtlCi0KLSMgQysrIGRlcGVuZGVuY2llcwotUlVOIGFwdC1nZXQgaW5zdGFsbCAteSBsaWJib29zdC1kZXYgbGliYm9vc3QtdGVzdC1kZXYgbGliYm9vc3QtcHJvZ3JhbS1vcHRpb25zLWRldiBcCi0gICAgbGliYm9vc3QtZmlsZXN5c3RlbS1kZXYgbGliYm9vc3Qtc3lzdGVtLWRldiBsaWJib29zdC10aHJlYWQtZGV2IGxpYmV2ZW50LWRldgotCi0jIEphdmEgZGVwZW5kZW5jaWVzCi1SVU4gYXB0LWdldCBpbnN0YWxsIC15IGFudCBvcGVuamRrLTctamRrIG1hdmVuICYmIFwKLSAgICB1cGRhdGUtamF2YS1hbHRlcm5hdGl2ZXMgLXMgamF2YS0xLjcuMC1vcGVuamRrLWFtZDY0Ci0KLSMgUHl0aG9uIGRlcGVuZGVuY2llcwotUlVOIGFwdC1nZXQgaW5zdGFsbCAteSBweXRob24tYWxsIHB5dGhvbi1hbGwtZGV2IHB5dGhvbi1hbGwtZGJnIHB5dGhvbi1zZXR1cHRvb2xzIHB5dGhvbi1zdXBwb3J0IFwKLSAgICBweXRob24tdHdpc3RlZCBweXRob24tem9wZS5pbnRlcmZhY2UKLQotIyBSdWJ5IGRlcGVuZGVuY2llcwotUlVOIGFwdC1nZXQgaW5zdGFsbCAteSBydWJ5IHJ1YnktZGV2ICYmIFwKLSAgICBnZW0gaW5zdGFsbCBidW5kbGVyIHJha2UKLQotIyBQZXJsIGRlcGVuZGVuY2llcwotUlVOIGFwdC1nZXQgaW5zdGFsbCAteSBsaWJiaXQtdmVjdG9yLXBlcmwgbGliY2xhc3MtYWNjZXNzb3ItY2xhc3MtcGVybAotCi0jIFBocCBkZXBlbmRlbmNpZXMKLVJVTiBhcHQtZ2V0IGluc3RhbGwgLXkgcGhwNSBwaHA1LWRldiBwaHA1LWNsaSBwaHAtcGVhciByZTJjIHBocHVuaXQKLQotIyBHbGliQyBkZXBlbmRlbmNpZXMKLVJVTiBhcHQtZ2V0IGluc3RhbGwgLXkgbGliZ2xpYjIuMC1kZXYKLQotIyBFcmxhbmcgZGVwZW5kZW5jaWVzCi1SVU4gZWNobyAnZGViIGh0dHA6Ly9wYWNrYWdlcy5lcmxhbmctc29sdXRpb25zLmNvbS9kZWJpYW4gdHJ1c3R5IGNvbnRyaWInID4gL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvZXJsYW5nX3NvbHV0aW9ucy5saXN0ICYmIFwKLSAgICBjdXJsIC1zU0wgaHR0cDovL3BhY2thZ2VzLmVybGFuZy1zb2x1dGlvbnMuY29tL2RlYmlhbi9lcmxhbmdfc29sdXRpb25zLmFzYyB8IHN1ZG8gYXB0LWtleSBhZGQgLSAmJiBcCi0gICAgYXB0LWdldCB1cGRhdGUgJiYgXAotICAgIGFwdC1nZXQgaW5zdGFsbCAteSBlcmxhbmctYmFzZSBlcmxhbmctZXVuaXQgZXJsYW5nLWRldgotCi0jIEdPIGRlcGVuZGVuY2llcwotUlVOIGN1cmwgLXNTTCBodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZ29sYW5nL2dvMS40LjIubGludXgtYW1kNjQudGFyLmd6IHwgdGFyIC1DIC91c3IvbGliLyAteHogJiYgXAotICAgIG1rZGlyIC1wIC91c3Ivc2hhcmUvZ28KLQotRU5WIEdPUk9PVCAvdXNyL2xpYi9nbwotRU5WIEdPUEFUSCAvdXNyL3NoYXJlL2dvCi1FTlYgUEFUSCAke0dPUk9PVH0vYmluOiR7R09QQVRIfS9iaW46JFBBVEgKLQotIyBIYXNrZWxsIGRlcGVuZGVuY2llcwotUlVOIGFwdC1nZXQgaW5zdGFsbCAteSBnaGMgY2FiYWwtaW5zdGFsbCBsaWJnaGMtYmluYXJ5LWRldiBsaWJnaGMtbmV0d29yay1kZXYgbGliZ2hjLWh0dHAtZGV2IFwKLSAgICBsaWJnaGMtaGFzaGFibGUtZGV2IGxpYmdoYy11bm9yZGVyZWQtY29udGFpbmVycy1kZXYgbGliZ2hjLXZlY3Rvci1kZXYgJiYgXAotICAgIGNhYmFsIHVwZGF0ZQotCi0jIEhheGUKLVJVTiBhcHQtZ2V0IGluc3RhbGwgLXkgbmVrbyBuZWtvLWRldiBsaWJuZWtvMCAmJiBcCi0gICAgbWtkaXIgLXAgL3RtcC9oYXhlIC91c3IvbGliL2hheGUgJiYgXAotICAgIGN1cmwgaHR0cDovL2hheGUub3JnL3dlYnNpdGUtY29udGVudC9kb3dubG9hZHMvMy4yLjAvZG93bmxvYWRzL2hheGUtMy4yLjAtbGludXg2NC50YXIuZ3ogLW8gL3RtcC9oYXhlL2hheGUtMy4yLjAtbGludXg2NC50YXIuZ3ogJiYgXAotICAgIHRhciAteHZ6ZiAvdG1wL2hheGUvaGF4ZS0zLjIuMC1saW51eDY0LnRhci5neiAtQyAvdXNyL2xpYi9oYXhlIC0tc3RyaXAtY29tcG9uZW50cz0xICYmIFwKLSAgICBsbiAtcyAvdXNyL2xpYi9oYXhlL2hheGUgL3Vzci9iaW4vaGF4ZSAmJiBcCi0gICAgbG4gLXMgL3Vzci9saWIvaGF4ZS9oYXhlbGliIC91c3IvYmluL2hheGVsaWIgJiYgXAotICAgIG1rZGlyIC1wIC91c3IvbGliL2hheGUvbGliICAmJiBcCi0gICAgY2htb2QgLVIgNzc3IC91c3IvbGliL2hheGUvbGliICYmIFwKLSAgICBoYXhlbGliIHNldHVwIC91c3IvbGliL2hheGUvbGliICYmIFwKLSAgICBoYXhlbGliIGluc3RhbGwgaHhjcHAKLQotIyBMdWEgZGVwZW5kZW5jaWVzCi1SVU4gYXB0LWdldCBpbnN0YWxsIC15IGx1YTUuMiBsdWE1LjItZGV2Ci0KLSMgTm9kZS5qcyBkZXBlbmRlbmNpZXMKLVJVTiBhcHQtZ2V0IGluc3RhbGwgLXkgbm9kZWpzIG5vZGVqcy1kZXYgbm9kZWpzLWxlZ2FjeSBucG0KLQotIyBDU2hhcnAKLVJVTiBhcHQtZ2V0IGluc3RhbGwgLXkgbW9uby1nbWNzIG1vbm8tZGV2ZWwgbW9uby14YnVpbGQgbW9uby1jb21wbGV0ZSBsaWJtb25vLXN5c3RlbS13ZWIyLjAtY2lsIFwKLSAgICBtaW5ndzMyIG1pbmd3MzItYmludXRpbHMgbWluZ3czMi1ydW50aW1lIG5zaXMKLQotIyBEIGRlcGVuZGVuY2llcwotIyBUSFJJRlQtMjkxNjogRE1EIHBpbm5lZCB0byAyLjA2NS4wLTAgZHVlIHRvIHJlZ3Jlc3Npb24gaW4gMi4wNjYKLSMgVEhSSUZULTMyNTM6IERNRCBwaW5uZWQgdG8gMi4wNjUuMC0wIGR1ZSB0byBkZXByZWNhdGlvbnMgMi4wNjcuMQotUlVOIGFwdC1nZXQgaW5zdGFsbCAteSBnY2MtbXVsdGlsaWIgeGRnLXV0aWxzICYmIFwKLSAgICBjdXJsIC1zU0wgaHR0cDovL2Rvd25sb2Fkcy5kbGFuZy5vcmcvcmVsZWFzZXMvMi54LzIuMDY1LjAvZG1kXzIuMDY1LjAtMF9hbWQ2NC5kZWIgLW8gL3RtcC9kbWRfMi4wNjUuMC0wX2FtZDY0LmRlYiAmJiBcCi0gICAgZHBrZyAtaSAvdG1wL2RtZF8yLjA2NS4wLTBfYW1kNjQuZGViICYmIFwKLSAgICBybSAvdG1wL2RtZF8yLjA2NS4wLTBfYW1kNjQuZGViCi0KLSMgQ2xlYW4gdXAKLVJVTiBhcHQtZ2V0IGNsZWFuICYmIFwKLSAgICBybSAtcmYgL3Zhci9jYWNoZS9hcHQvKiAmJiBcCi0gICAgcm0gLXJmIC92YXIvbGliL2FwdC9saXN0cy8qICYmIFwKLSAgICBybSAtcmYgL3RtcC8qICYmIFwKLSAgICBybSAtcmYgL3Zhci90bXAvKgotCi1XT1JLRElSICRIT01FCmRpZmYgLS1naXQgYS9idWlsZC9maXhjaGFuZ2VzLnNoIGIvYnVpbGQvZml4Y2hhbmdlcy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42YzU3YjU0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZml4Y2hhbmdlcy5zaApAQCAtMCwwICsxLDM5IEBACisjIS91c3IvYmluL2VudiBiYXNoCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMKKyMgZml4Y2hhbmdlcyB3aWxsIHRha2UgYSBmaWxlIGFzIGlucHV0IGFuZCBsb29rIGZvciB0ZXh0IG1hdGNoaW5nCisjIHRoZSBwYXR0ZXJuIFtUSFJJRlQtbm5ubl0gKHRoZSBudW1iZXIgb2YgZGlnaXRzIGlzIG5vdCBpbXBvcnRhbnQpCisjIHdoaWNoIGlzIG5vdCBhIG1hcmtkb3duIGxpbmssIGFuZCBjaGFuZ2UgaXQgdG8gYmUgYSBtYXJrZG93biBsaW5rLgorIyBUaGUgdG9vbCB3cml0ZXMgdG8gc3Rkb3V0IHNvIHlvdSBjYW4gcmVkaXJlY3QgaXQgdG8gYSB0ZW1wb3JhcnkKKyMgZmlsZSBhbmQgdGhlbiBjb21wYXJlIGFnYWluc3QgdGhlIG9yaWdpbmFsIGZpbGUgYmVmb3JlIHJlcGxhY2luZworIyBpdC4KKyMKKyMgVGhpcyB0b29sIHdhcyBkZXZlbG9wZWQgYWZ0ZXIgdGhlIDAuMTIuMCByZWxlYXNlIHRvIGFzc2lzdCB3aXRoCisjIGdlbmVyYXRpb24gb2YgQ0hBTkdFUy5tZCBjb250ZW50LgorIworCit3aGlsZSBJRlM9JycgcmVhZCAtciBsaW5lIHx8IFtbIC1uICIkbGluZSIgXV07IGRvCisgICAgaWYgW1sgIiRsaW5lIiA9fiBeKC4qKVxbKFRIUklGVC1bWzpkaWdpdDpdXSspXF1bXlwoXSguKikkIF1dOyB0aGVuCisgICAgICAgIGVjaG8gIiR7QkFTSF9SRU1BVENIWzFdfVske0JBU0hfUkVNQVRDSFsyXX1dKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvJHtCQVNIX1JFTUFUQ0hbMl19KSAke0JBU0hfUkVNQVRDSFszXX0iCisgICAgZWxzZQorICAgICAgICBlY2hvICIkbGluZSIKKyAgICBmaQorZG9uZSA8ICIkMSIKZGlmZiAtLWdpdCBhL2J1aWxkL3RyYXZpcy9pbnN0YWxsQ1hYRGVwZW5kZW5jaWVzLnNoIGIvYnVpbGQvdHJhdmlzL2luc3RhbGxDWFhEZXBlbmRlbmNpZXMuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFjM2VkZjMuLjAwMDAwMDAKLS0tIGEvYnVpbGQvdHJhdmlzL2luc3RhbGxDWFhEZXBlbmRlbmNpZXMuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0jIS9iaW4vc2gKLQotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLQotIyBNYWlubHkgYWltaW5nIFRyYXZpcyBDSSdzIFVidW50dSBtYWNoaW5lcyBmb3Igbm93Ci0jIHNlZSB3aGF0IHdlIG5lZWQ6IGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy9kb2NzL2luc3RhbGwvdWJ1bnR1Ci0KLSMgR2VuZXJhbCBkZXBlbmRlbmNpZXMKLXN1ZG8gYXB0LWFkZC1yZXBvc2l0b3J5ICJkZWIgaHR0cDovL2FyY2hpdmUudWJ1bnR1LmNvbS91YnVudHUvIHRydXN0eSBtYWluIHJlc3RyaWN0ZWQiIC15Ci1zdWRvIGFwdC1nZXQgdXBkYXRlIC1xcQotCi1zdWRvIGFwdC1nZXQgaW5zdGFsbCAtcXEgbGlicGFuZ28tMS4wLTAgbGlicXQ0LWRldiBxdGJhc2U1LWRldiBxdGJhc2U1LWRldi10b29scyBxdDUtZGVmYXVsdCBsaWJib29zdC1kZXYgbGliYm9vc3QtdGVzdC1kZXYgbGliYm9vc3QtcHJvZ3JhbS1vcHRpb25zLWRldiBsaWJib29zdC1zeXN0ZW0tZGV2IGxpYmJvb3N0LWZpbGVzeXN0ZW0tZGV2IGxpYmJvb3N0LXRocmVhZC1kZXYgbGliZXZlbnQtZGV2IGF1dG9tYWtlIGxpYnRvb2wgZmxleCBiaXNvbiBwa2ctY29uZmlnIGcrKyBsaWJzc2wtZGV2IG1ha2UgY21ha2UgZ2l0IGRlYmhlbHBlciBiYyBuc2lzIG5pbmphLWJ1aWxkCi1kcGtnIC1TIC91c3IvaW5jbHVkZS9ib29zdC92ZXJzaW9uLmhwcApkaWZmIC0tZ2l0IGEvYnVpbGQvdHJhdmlzL2luc3RhbGxEZXBlbmRlbmNpZXMuc2ggYi9idWlsZC90cmF2aXMvaW5zdGFsbERlcGVuZGVuY2llcy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWI3NDE0MC4uMDAwMDAwMAotLS0gYS9idWlsZC90cmF2aXMvaW5zdGFsbERlcGVuZGVuY2llcy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLSMhL2Jpbi9zaAotCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotU0NSSVBUUEFUSD0kKCBjZCAkKGRpcm5hbWUgJDApIDsgcHdkIC1QICkKLQotIyBNYWlubHkgYWltaW5nIFRyYXZpcyBDSSdzIFVidW50dSBtYWNoaW5lcyBmb3Igbm93Ci0jIHNlZSB3aGF0IHdlIG5lZWQ6IGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy9kb2NzL2luc3RhbGwvdWJ1bnR1Ci0KLSMgR2VuZXJhbCBkZXBlbmRlbmNpZXMKLXNoICR7U0NSSVBUUEFUSH0vaW5zdGFsbENYWERlcGVuZGVuY2llcy5zaAotCi0jIEphdmEgZGVwZW5kZW5jaWVzCi1zdWRvIGFwdC1nZXQgaW5zdGFsbCAtcXEgYW50IG9wZW5qZGstNy1qZGsKLXN1ZG8gdXBkYXRlLWphdmEtYWx0ZXJuYXRpdmVzIC1zIGphdmEtMS43LjAtb3Blbmpkay1hbWQ2NAotCi0jIFB5dGhvbiBkZXBlbmRlbmNpZXMKLXN1ZG8gYXB0LWdldCBpbnN0YWxsIC1xcSBweXRob24tYWxsIHB5dGhvbi1hbGwtZGV2IHB5dGhvbi1hbGwtZGJnIHB5dGhvbi1zZXR1cHRvb2xzIHB5dGhvbi1zdXBwb3J0IHB5dGhvbi10d2lzdGVkCi0KLSMgUnVieSBkZXBlbmRlbmNpZXMKLXN1ZG8gYXB0LWdldCBpbnN0YWxsIC1xcSBydWJ5IHJ1YnktZGV2Ci1zdWRvIGdlbSBpbnN0YWxsIGJ1bmRsZXIgcmFrZQotCi0jIFBlcmwgZGVwZW5kZW5jaWVzCi1zdWRvIGFwdC1nZXQgaW5zdGFsbCAtcXEgbGliYml0LXZlY3Rvci1wZXJsIGxpYmNsYXNzLWFjY2Vzc29yLWNsYXNzLXBlcmwgbGliaW8tc29ja2V0LXNzbC1wZXJsIGxpYm5ldC1zc2xlYXktcGVybCBsaWJjcnlwdC1zc2xlYXktcGVybAotCi0jIFBocCBkZXBlbmRlbmNpZXMKLXN1ZG8gYXB0LWdldCBpbnN0YWxsIC1xcSBwaHA1IHBocDUtZGV2IHBocDUtY2xpIHBocC1wZWFyIHJlMmMKLQotIyBHbGliQyBkZXBlbmRlbmNpZXMKLXN1ZG8gYXB0LWdldCBpbnN0YWxsIC1xcSBsaWJnbGliMi4wLWRldgotCi0jIEVybGFuZyBkZXBlbmRlbmNpZXMKLXN1ZG8gYXB0LWdldCBpbnN0YWxsIC1xcSBlcmxhbmctYmFzZSBlcmxhbmctZXVuaXQgZXJsYW5nLWRldgotCi0jIEdPIGRlcGVuZGVuY2llcwotZWNobyAiZ29sYW5nLWdvIGdvbGFuZy1nby9kYXNoYm9hcmQgYm9vbGVhbiBmYWxzZSIgfCBkZWJjb25mLXNldC1zZWxlY3Rpb25zCi1zdWRvIGFwdC1nZXQgLXkgaW5zdGFsbCAtcXEgZ29sYW5nIGdvbGFuZy1nbwotCi0jIEhhc2tlbGwgZGVwZW5kZW5jaWVzCi1zdWRvIGFkZC1hcHQtcmVwb3NpdG9yeSAteSBwcGE6aHZyL2doYwotc3VkbyBhcHQtZ2V0IHVwZGF0ZQotc3VkbyBhcHQtZ2V0IGluc3RhbGwgY2FiYWwtaW5zdGFsbC0xLjIwIGdoYy0kR0hDVkVSCi0KLSMgTHVhIGRlcGVuZGVuY2llcwotc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIGx1YTUuMiBsdWE1LjItZGV2Ci0KLSMgTm9kZS5qcyBkZXBlbmRlbmNpZXMKLXN1ZG8gYXB0LWdldCBpbnN0YWxsIC1xcSBub2RlanMgbm9kZWpzLWRldiBucG0KLXN1ZG8gdXBkYXRlLWFsdGVybmF0aXZlcyAtLWluc3RhbGwgL3Vzci9iaW4vbm9kZSBub2RlIC91c3IvYmluL25vZGVqcyAxMAotCi0jIENTaGFycAotc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIG1vbm8tZ21jcyBtb25vLWRldmVsIGxpYm1vbm8tc3lzdGVtLXdlYjIuMC1jaWwKLXN1ZG8gYXB0LWdldCBpbnN0YWxsIC1xcSBtaW5ndzMyIG1pbmd3MzItYmludXRpbHMgbWluZ3czMi1ydW50aW1lIG5zaXMKZGlmZiAtLWdpdCBhL2J1aWxkL3ZlcmFsaWduLnNoIGIvYnVpbGQvdmVyYWxpZ24uc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjE3NDRiNAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL3ZlcmFsaWduLnNoCkBAIC0wLDAgKzEsMzEzIEBACisjIS91c3IvYmluL2VudiBiYXNoCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMgCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjIAorIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIworIyBUaGUgdmVyYWxpZ24gc2NyaXB0IHNldHMgdGhlIGFwcHJvcHJpYXRlIHZlcnNpb25zIGluIGFsbCBvZgorIyB0aGUgcGFja2FnZSBjb25maWd1cmF0aW9uIGZpbGVzIGZvciBhbGwgb2YgdGhlIHN1cHBvcnRlZAorIyBsYW5ndWFnZXMuICBJdCBpcyB1c2VkIHRvIHByZXBhcmUgYSByZWxlYXNlIG9yIG1vdmUgbWFzdGVyCisjIGZvcndhcmQgdG8gdGhlIG5leHQgYW50aWNpcGF0ZWQgdmVyc2lvbi4KKyMKKyMgVVNBR0UKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgdXNhZ2U6IHZlcmFsaWduLnNoIDxvbGRWZXJzaW9uPiA8bmV3VmVyc2lvbj4KKyMKKyMgRVhBTVBMRQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAkIC4vdmVyYWxpZ24uc2ggMC4xMi4wIDEuMC4wCisjICQgLi92ZXJhbGlnbi5zaCAxLjAuMCAxLjEuMAorIworIyBJTVBPUlRBTlQgVVNBR0UgTk9URQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBEZWZpbmUgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIERSWVJVTiB0byBoYXZlIHRoZSBzY3JpcHQKKyMgcHJpbnQgb3V0IGFsbCBtYXRjaGVzIHRvIHRoZSBvbGRWZXJzaW9uIGhpbGlnaHRlZCBzbyB0aGF0CisjIHlvdSBjYW4gdmVyaWZ5IGl0IHdpbGwgY2hhbmdlIHRoZSByaWdodCB0aGluZ3MuCisjCisKK2RlY2xhcmUgLUEgRklMRVMKKworIyBUaGVzZSBmaWxlcyByZXF1aXJlIGEgbWFudWFsIHRvdWNoOgorRklMRVNbQ0hBTkdFUy5tZF09bWFudWFsCitGSUxFU1tkZWJpYW4vY2hhbmdlbG9nXT1tYW51YWwKK0ZJTEVTW2RvYXAucmRmXT1tYW51YWwKKworIyBUaGVzZSBmaWxlcyBjYW4gYmUgdXBkYXRlZCBhdXRvbWF0aWNhbGx5OgorRklMRVNbQXBhY2hlVGhyaWZ0Lm51c3BlY109c2ltcGxlUmVwbGFjZQorRklMRVNbVGhyaWZ0LXN3aWZ0My5wb2RzcGVjXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tUaHJpZnQucG9kc3BlY109c2ltcGxlUmVwbGFjZQorRklMRVNbYXBwdmV5b3IueW1sXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tib3dlci5qc29uXT1qc29uUmVwbGFjZQorRklMRVNbYnVpbGQvY21ha2UvRGVmaW5lQ01ha2VEZWZhdWx0cy5jbWFrZV09c2ltcGxlUmVwbGFjZQorRklMRVNbY29uZmlndXJlLmFjXT1jb25maWd1cmVSZXBsYWNlCitGSUxFU1tjb250cmliL3RocmlmdC5zcGVjXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvY29jb2Evc3JjL1RocmlmdC5oXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvY3NoYXJwL1RocmlmdE1TQnVpbGRUYXNrL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvY3NoYXJwL1RocmlmdE1TQnVpbGRUYXNrL1RocmlmdE1TQnVpbGRUYXNrLmNzcHJval09c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL2NzaGFycC9zcmMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3NdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9jc2hhcnAvc3JjL1RocmlmdC5jc3Byb2pdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvQ2xpZW50L011bHRpcGxleENsaWVudC5jc3Byb2pdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvQ2xpZW50L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L1NlcnZlci9NdWx0aXBsZXhTZXJ2ZXIuY3Nwcm9qXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L1NlcnZlci9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jc109c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3NdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9kL3NyYy90aHJpZnQvYmFzZS5kXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvZGFydC9wdWJzcGVjLnlhbWxdPXB1YnNwZWNSZXBsYWNlCitGSUxFU1tsaWIvZGVscGhpL3NyYy9UaHJpZnQucGFzXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvZXJsL3NyYy90aHJpZnQuYXBwLnNyY109c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL2hheGUvaGF4ZWxpYi5qc29uXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvaHMvdGhyaWZ0LmNhYmFsXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvamF2YS9ncmFkbGUucHJvcGVydGllc109c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL2pzL3BhY2thZ2UuanNvbl09anNvblJlcGxhY2UKK0ZJTEVTW2xpYi9qcy9zcmMvdGhyaWZ0LmpzXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvbHVhL1RocmlmdC5sdWFdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9uZXRjb3JlL1RocmlmdC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jc109c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvQ2xpZW50L1RIdHRwQ2xpZW50VHJhbnNwb3J0LmNzXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvb2NhbWwvX29hc2lzXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvcGVybC9saWIvVGhyaWZ0LnBtXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvcHkvc2V0dXAucHldPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9yYi90aHJpZnQuZ2Vtc3BlY109c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL3JzL0NhcmdvLnRvbWxdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9zdC9wYWNrYWdlLnhtbF09c2ltcGxlUmVwbGFjZQorRklMRVNbcGFja2FnZS5qc29uXT1qc29uUmVwbGFjZQorRklMRVNbc29uYXItcHJvamVjdC5wcm9wZXJ0aWVzXT1zaW1wbGVSZXBsYWNlCitGSUxFU1t0ZXN0L2NzaGFycC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jc109c2ltcGxlUmVwbGFjZQorRklMRVNbdGVzdC9jc2hhcnAvVGhyaWZ0VGVzdC5jc3Byb2pdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW3Rlc3QvZGFydC90ZXN0X2NsaWVudC9wdWJzcGVjLnlhbWxdPXB1YnNwZWNSZXBsYWNlCitGSUxFU1t0ZXN0L2VybC9zcmMvdGhyaWZ0X3Rlc3QuYXBwLnNyY109c2ltcGxlUmVwbGFjZQorRklMRVNbdHV0b3JpYWwvY3NoYXJwL0NzaGFycENsaWVudC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jc109c2ltcGxlUmVwbGFjZQorRklMRVNbdHV0b3JpYWwvY3NoYXJwL0NzaGFycFNlcnZlci9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jc109c2ltcGxlUmVwbGFjZQorRklMRVNbdHV0b3JpYWwvZGFydC9jbGllbnQvcHVic3BlYy55YW1sXT1wdWJzcGVjUmVwbGFjZQorRklMRVNbdHV0b3JpYWwvZGFydC9jb25zb2xlX2NsaWVudC9wdWJzcGVjLnlhbWxdPXB1YnNwZWNSZXBsYWNlCitGSUxFU1t0dXRvcmlhbC9kYXJ0L3NlcnZlci9wdWJzcGVjLnlhbWxdPXB1YnNwZWNSZXBsYWNlCitGSUxFU1t0dXRvcmlhbC9kZWxwaGkvRGVscGhpQ2xpZW50L0RlbHBoaUNsaWVudC5kcHJval09c2ltcGxlUmVwbGFjZQorRklMRVNbdHV0b3JpYWwvZGVscGhpL0RlbHBoaVNlcnZlci9EZWxwaGlTZXJ2ZXIuZHByb2pdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW3R1dG9yaWFsL2hzL1RocmlmdFR1dG9yaWFsLmNhYmFsXT1zaW1wbGVSZXBsYWNlCitGSUxFU1t0dXRvcmlhbC9vY2FtbC9fb2FzaXNdPXNpbXBsZVJlcGxhY2UKKworaWYgWyAhIC1mICJDSEFOR0VTIiBdOyB0aGVuCisgICAgPiYyIGVjaG8gImVycm9yOiBydW4gdmVyYWxpZ24uc2ggd2hpbGUgaW4gdGhlIHRocmlmdCByb290IGRpcmVjdG9yeSIKKyAgICBleGl0IDEKK2ZpCisKK2lmIFsgJCMgLW5lIDIgXTsgdGhlbgorICAgID4mMiBlY2hvICJ1c2FnZTogdmVyYWxpZ24uc2ggPG9sZFZlcnNpb24+IDxuZXdWZXJzaW9uPiIKKyAgICBleGl0IDEKK2ZpCisKK2pxIC0tdmVyc2lvbiAxPi9kZXYvbnVsbCAyPi9kZXYvbnVsbAoraWYgWyAkPyAtbmUgMCBdOyB0aGVuCisgICAgPiYyIGVjaG8gImVycm9yOiB0aGUgJ2pxJyBwYWNrYWdlIGlzIG5vdCBpbnN0YWxsZWQiCisgICAgZXhpdCAxCitmaQorCisjCisjIHZhbGlkYXRlVmVyc2lvbjogY2hlY2sgdGhhdCBhIHZlcnNpb24gbWF0Y2hlcyB0aGUgbWFqb3IubWlub3IucGF0Y2gKKyMgICBmb3JtYXQgd2hpY2ggaXMgdGhlIGxvd2VzdCBjb21tb24gZGVub21pbmF0b3Igc3VwcG9ydGVkIGJ5IGFsbAorIyAgIHByb2plY3Qgc3lzdGVtcy4KKyMgXHBhcmFtICQxIHRoZSB2ZXJzaW9uCisjIFxyZXR1cm5zIDAgaWYgdGhlIHZlcnNpb24gaXMgY29tcGxpYW50CisjCitmdW5jdGlvbiB2YWxpZGF0ZVZlcnNpb24KK3sKKyAgICBsb2NhbCByZXN1bHQKKyAgICBsb2NhbCB2YWxpZAorICAgIHZhbGlkPSQoZWNobyAiJDEiIHwgc2VkICcvXltbOmRpZ2l0Ol1dXCtcLltbOmRpZ2l0Ol1dXCtcLltbOmRpZ2l0Ol1dXCskLyF7cTIyfScpCisgICAgcmVzdWx0PSQ/CisgICAgaWYgWyAkcmVzdWx0IC1lcSAyMiBdOyB0aGVuCisgICAgICAgID4mMiBlY2hvICJlcnJvcjogdmVyc2lvbiAnJDEnIGRvZXMgbm90IGNvbmZvcm0gdG8gdGhlIHJlcXVpcmVkIG1ham9yLm1pbm9yLnBhdGNoIGZvcm1hdCIKKyAgICAgICAgcmV0dXJuICR7cmVzdWx0fQorICAgIGZpCit9CisKK09MRFZFUlNJT049JDEKK05FV1ZFUlNJT049JDIKK3ZhbGlkYXRlVmVyc2lvbiAiJHtPTERWRVJTSU9OfSIgfHwgZXhpdCAkPwordmFsaWRhdGVWZXJzaW9uICIke05FV1ZFUlNJT059IiB8fCBleGl0ICQ/CisKKyMKKyMgZXNjYXBlVmVyc2lvbjogZXNjYXBlIHRoZSB2ZXJzaW9uIGZvciB1c2UgYXMgYSBzZWQgc2VhcmNoCisjIFxwYXJhbSAkMSB0aGUgdmVyc2lvbiB0byBlc2NhcGUKKyMgXG91dHB1dCB0aGUgZXNjYXBlZCBzdHJpbmcKKyMgXHJldHVybnMgMAorIyBcZXhhbXBsZSBWRVJTRUFSQ0g9JChlc2NhcGVWZXJzaW9uICJbMS4wLjBdIik7IGVjaG8gJFZFUlNFQVJDSDsgPT4gIlxbMVwuMFwuMFxdIgorIworZnVuY3Rpb24gZXNjYXBlVmVyc2lvbgoreworICAgIGVjaG8gIiQoZWNobyAkMSB8IHNlZCAncy9cLi9cXC4vZycgfCBzZWQgJ3MvXFsvXFxcWy9nJyB8IHNlZCAncy9cXS9cXFxdL2cnKSIKK30KKworIyBTZXQgdXAgdmVyYm9zZSBoaWxpZ2h0aW5nIGlmIHJ1bm5pbmcgaW50ZXJhY3RpdmUKK2lmIFsgIiQodHB1dCBjb2xvcnMpIiAtbmUgMCBdOyB0aGVuCisgICAgcmV2ZXJzZT0kKHRwdXQgcmV2KQorICAgIHJlZD0kKHRwdXQgc2V0YWYgMSkKKyAgICBncmVlbj0kKHRwdXQgc2V0YWYgMikKKyAgICB5ZWxsb3c9JCh0cHV0IHNldGFmIDMpCisgICAgbm9ybWFsPSQodHB1dCBzZ3IwKQorZmkKKworZGVjbGFyZSAtQSBNQU5VQUwKKworIworIyBtYW51YWw6IG5vdGUgdGhhdCB1cGRhdGUgb2Ygc2FpZCBmaWxlIGlzIG1hbnVhbAorIyBccGFyYW0gJDEgZmlsZW5hbWUgdG8gZG8gcmVwbGFjZW1lbnRzIG9uCisjIFxyZXR1cm5zIDAKKyMKK2Z1bmN0aW9uIG1hbnVhbAoreworICAgIE1BTlVBTFsiJDEiXT0iIgorICAgIHJldHVybiAwCit9CisKKyMKKyMgY29uZmlndXJlUmVwbGFjZTogcmVwbGFjZSB0aGUgQUNfSU5JVCBmaWVsZCBpbiBjb25maWd1cmUuYWMKKyMgXHBhcmFtICQxIGZpbGVuYW1lIHRvIGRvIHJlcGxhY2VtZW50cyBvbgorIyBccmV0dXJucyAwIG9uIHN1Y2Nlc3MKKyMKKworZnVuY3Rpb24gY29uZmlndXJlUmVwbGFjZQoreworICAgIHJlcGxhY2UgIiQxIiAiW3RocmlmdF0sIFske09MRFZFUlNJT059XSIgIlt0aHJpZnRdLCBbJHtORVdWRVJTSU9OfV0iCit9CisKKyMKKyMganNvblJlcGxhY2U6IHJlcGxhY2UgYSBzcGVjaWZpYyB2ZXJzaW9uIGZpZWxkIGluIGEgSlNPTiBmaWxlCisjICAgbXVzdCBiZSBhIHRvcCBsZXZlbCAidmVyc2lvbiIgZmllbGQgaW4gdGhlIGpzb24gc3RydWN0dXJlCisjIFxwYXJhbSAkMSBmaWxlbmFtZSB0byBkbyByZXBsYWNlbWVudHMgb24KKyMgXHJldHVybnMgMCBvbiBzdWNjZXNzCisjCisKK2Z1bmN0aW9uIGpzb25SZXBsYWNlCit7CisgICAgbG9jYWwgcmVzdWx0CisgICAgbG9jYWwgb3V0cHV0CisgICAgaWYgWyAhIC16ICIkRFJZUlVOIiBdOyB0aGVuCisgICAgICAgIG91dHB1dD0kKGpxIC1lICIudmVyc2lvbiIgIiQxIikKKyAgICBlbHNlCisgICAgICAgIG91dHB1dD0kKGpxIC1lICIudmVyc2lvbiA9IFwiJHtORVdWRVJTSU9OfVwiIiAiJDEiID4gdG1wLiQkLmpzb24gJiYgbXYgdG1wLiQkLmpzb24gIiQxIikKKyAgICBmaQorICAgIHJlc3VsdD0kPworICAgIGlmIFsgJD8gLW5lIDAgXTsgdGhlbgorICAgICAgICBwcmludGYgIiUtNjBzIHwgJTVkIHwgJHtyZWR9RVJST1Ike25vcm1hbH06IHZlcnNpb24gdGFnIG5vdCBmb3VuZCIgIiQxIiAiJGNvdW50IgorICAgICAgICBlY2hvCisgICAgICAgIHJldHVybiAxCisgICAgZWxpZiBbICEgLXogIiREUllSVU4iIF07IHRoZW4KKyAgICAgICAgb3V0cHV0PSR7b3V0cHV0JVwifQorICAgICAgICBvdXRwdXQ9JHtvdXRwdXQjXCJ9CisgICAgICAgIHByaW50ZiAiJS02MHMgfCAlNWQgfCBNQVRDSEVTOiAgIHZlcnNpb246IFwiJHtyZXZlcnNlfSR7Z3JlZW59JHtvdXRwdXR9JHtub3JtYWx9XCIiICIkMSIgMQorICAgICAgICBlY2hvCisgICAgICAgIHJldHVybiAwCisgICAgZmkKKyAgICBwcmludGYgIiUtNjBzIHwgJTVkIHwgJHtncmVlbn1PSyR7bm9ybWFsfSIgIiQxIiAxCisgICAgZWNobworICAgIHJldHVybiAwCit9CisKKyMKKyMgcHVic3BlY1JlcGxhY2U6IHJlcGxhY2UgYSBzcGVjaWZpYyB2ZXJzaW9uIGZpZWxkIGluIGEgWUFNTCBmaWxlCisjICAgbXVzdCBiZSBhIHRvcCBsZXZlbCAidmVyc2lvbiIgZmllbGQgaW4gdGhlIHlhbWwgc3RydWN0dXJlCisjICAgZGlkIG5vdCBmaW5kIGEgcGFja2FnZSB0aGF0IHByZXNlcnZlcyBjb21tZW50cyBzbyB0aGlzIGlzCisjICAgc29tZXdoYXQgYnJhaW4tZGVhZCwgYnV0IGl0IGdldHMgdGhlIGpvYiBkb25lCisjIFxwYXJhbSAkMSBmaWxlbmFtZSB0byBkbyByZXBsYWNlbWVudHMgb24KKyMgXHJldHVybnMgMCBvbiBzdWNjZXNzCisjCisKK2Z1bmN0aW9uIHB1YnNwZWNSZXBsYWNlCit7CisgICAgcmVwbGFjZSAiJDEiICJ2ZXJzaW9uOiAke09MRFZFUlNJT059IiAidmVyc2lvbjogJHtORVdWRVJTSU9OfSIKK30KKworIworIyByZXBsYWNlOiByZXBsYWNlIG9jY3VycmVuY2VzIG9mIG9uZSBzdHJpbmcgd2l0aCBhbm90aGVyCisjICAgICB0aGUgZmlsZSBzcGVjaWZpZWQgbXVzdCBjb250YWluIHRoZSBvbGQgc3RyaW5nIGF0IGxlYXN0IG9uY2UKKyMgICAgIGluIG9yZGVyIHRvIGJlIHN1Y2Nlc3NmdWwuCisjIFxwYXJhbSAkMSBmaWxlbmFtZSB0byBkbyByZXBsYWNlbWVudHMgb24KKyMgXHBhcmFtICQyIHRoZSAib2xkIiBzdHJpbmcgdG8gYmUgcmVwbGFjZWQKKyMgXHBhcmFtICQzIHRoZSAibmV3IiBzdHJpaW5nIHRvIHJlcGxhY2UgaXQgd2l0aAorIyBccmV0dXJucyAwIG9uIHN1Y2Nlc3MKKyMKK2Z1bmN0aW9uIHJlcGxhY2UKK3sKKyAgICBsb2NhbCByZXN1bHQKKyAgICBsb2NhbCBvdXRwdXQKKyAgICBsb2NhbCBvbGRTdHJpbmc9IiQyIgorICAgIGxvY2FsIG5ld1N0cmluZz0iJDMiCisgICAgbG9jYWwgb2xkUmVnZXg9JChlc2NhcGVWZXJzaW9uICIke29sZFN0cmluZ30iKQorICAgIGxvY2FsIGNvdW50PSQoZ3JlcCAtRWMgIiR7b2xkUmVnZXh9IiAiJDEiKQorICAgIGxvY2FsIHZlcmJvc2UKKyAgICBpZiBbICRjb3VudCAtZXEgMCBdOyB0aGVuCisgICAgICAgIHByaW50ZiAiJS02MHMgfCAlNWQgfCAke3JlZH1OT1QgRk9VTkQke25vcm1hbH06ICR7b2xkU3RyaW5nfSIgIiQxIiAwCisgICAgICAgIGVjaG8KKyAgICAgICAgcmV0dXJuIDEKKyAgICBlbGlmIFsgISAteiAiJERSWVJVTiIgXTsgdGhlbgorICAgICAgICBwcmludGYgIiUtNjBzIHwgJTVkIHwgTUFUQ0hFUzoiICIkMSIgIiRjb3VudCIKKyAgICAgICAgZWNobworICAgICAgICB3aGlsZSByZWFkIC1yIGxpbmU7IGRvCisgICAgICAgICAgICBlY2hvICIgPiAkKGVjaG8gIiRsaW5lIiB8IHNlZCAicy8ke29sZFJlZ2V4fS8ke3JldmVyc2V9JHtncmVlbn0ke29sZFN0cmluZ30ke25vcm1hbH0vZyIpIgorICAgICAgICBkb25lIDwgPChncmVwIC1FICIke29sZFJlZ2V4fSIgIiQxIikKKyAgICAgICAgcmV0dXJuIDAKKyAgICBmaQorICAgIG91dHB1dD0kKHNlZCAtaSAicy8ke29sZFJlZ2V4fS8ke25ld1N0cmluZ30vZyIgIiQxIikKKyAgICByZXN1bHQ9JD8KKyAgICBpZiBbICRyZXN1bHQgLW5lIDAgXTsgdGhlbgorICAgICAgICBwcmludGYgIiUtNjBzIHwgJTVkIHwgJHtyZWR9RVJST1Ike25vcm1hbH06ICVzIiAiJDEiICIkY291bnQiICIkb3V0cHV0IgorICAgICAgICBlY2hvCisgICAgICAgIHJldHVybiAxCisgICAgZmkKKyAgICBwcmludGYgIiUtNjBzIHwgJTVkIHwgJHtncmVlbn1PSyR7bm9ybWFsfSIgIiQxIiAiJGNvdW50IgorICAgIGVjaG8KKyAgICByZXR1cm4gMAorfQorCisjCisjIHNpbXBsZVJlcGxhY2U6IHJlcGxhY2Ugb2NjdXJyZW5jZXMgb2YgJHtPTERWRVJTSU9OfSB3aXRoICR7TkVXVkVSU0lPTn0KKyMgICAgIHRoZSBmaWxlIHNwZWNpZmllZCBtdXN0IGNvbnRhaW4gT0xEVkVSU0lPTiBhdCBsZWFzdCBvbmNlCisjICAgICBpbiBvcmRlciB0byBiZSBzdWNjZXNzZnVsLgorIyBccGFyYW0gJDEgZmlsZW5hbWUgdG8gZG8gcmVwbGFjZW1lbnRzIG9uCisjIFxwYXJhbSAkMiB0aGUgIm9sZCIgc3RyaW5nIHRvIGJlIHJlcGxhY2VkCisjIFxwYXJhbSAkMyB0aGUgIm5ldyIgc3RyaWluZyB0byByZXBsYWNlIGl0IHdpdGgKKyMgXHJldHVybnMgMCBvbiBzdWNjZXNzCisjCitmdW5jdGlvbiBzaW1wbGVSZXBsYWNlCit7CisgICAgcmVwbGFjZSAiJDEiICIke09MRFZFUlNJT059IiAiJHtORVdWRVJTSU9OfSIKK30KKworZWNobyAiIgorZWNobyAiQXBhY2hlIFRocmlmdCBWZXJzaW9uIEFsaWdubWVudCBUb29sIgorZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorZWNobyAiIgorZWNobyAiUHJldmlvdXMgVmVyc2lvbjogJHtPTERWRVJTSU9OfSIKK2VjaG8gIiAgICAgTmV3IFZlcnNpb246ICR7TkVXVkVSU0lPTn0iCitlY2hvICIiCitlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKK2VjaG8gIkZpbGVuYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENvdW50IHwgU3RhdHVzICAgICAgICAgICAgICAgIgorZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisKK2ZvciBmaWxlIGluICQoZWNobyAiJHshRklMRVNbQF19IiB8IHNvcnQpOyBkbworICAgICR7RklMRVNbJGZpbGVdfSAkZmlsZSB8fCBleGl0ICQ/Citkb25lCisKK2VjaG8KK2VjaG8gIkZpbGVzIHRoYXQgbXVzdCBiZSBtb2RpZmllZCBtYW51YWxseToiCitlY2hvCitmb3IgbWFudSBpbiAkKGVjaG8gIiR7IU1BTlVBTFtAXX0iIHwgc29ydCk7IGRvCisgICAgZWNobyAiID4gJHt5ZWxsb3d9JHttYW51fSR7bm9ybWFsfSIKK2RvbmUKKworZXhpdCAwCmRpZmYgLS1naXQgYS9idWlsZC93aW5jcHAvUkVBRE1FLm1kIGIvYnVpbGQvd2luY3BwL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjMxNzgwCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvd2luY3BwL1JFQURNRS5tZApAQCAtMCwwICsxLDIxOSBAQAorPCEtLS0KK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworIyBCdWlsZGluZyB0aHJpZnQgb24gV2luZG93cyAoTmF0aXZlKQorCitUaHJpZnQgdXNlcyBjbWFrZSB0byBtYWtlIGl0IGVhc2llciB0byBidWlsZCB0aGUgcHJvamVjdCBvbiBtdWx0aXBsZSBwbGF0Zm9ybXMsIGhvd2V2ZXIgdG8gYnVpbGQgYSBmdWxseSBmdW5jdGlvbmFsIGFuZCBwcm9kdWN0aW9uIHJlYWR5IHRocmlmdCBvbiBXaW5kb3dzIHJlcXVpcmVzIGEgbnVtYmVyIG9mIHRoaXJkIHBhcnR5IGxpYnJhcmllcyB0byBiZSBvYnRhaW5lZCBvciBidWlsdC4gIE9uY2UgdGhpcmQgcGFydHkgbGlicmFyaWVzIGFyZSByZWFkeSwgdGhlIHJpZ2h0IGNvbWJpbmF0aW9uIG9mIG9wdGlvbnMgbXVzdCBiZSBwYXNzZWQgdG8gY21ha2UgaW4gb3JkZXIgdG8gZ2VuZXJhdGUgdGhlIGNvcnJlY3QgZW52aXJvbm1lbnQuCisKKyMjIFN1bW1hcnkKKworVGhlc2UgaW5zdHJ1Y3Rpb25zIHdpbGwgaGVscCB5b3UgYnVpbGQgdGhyaWZ0IGZvciB3aW5kb3dzIHVzaW5nIFZpc3VhbAorU3R1ZGlvIDIwMTAgb3IgbGF0ZXIuICBUaGUgY29udHJpYnV0ZWQgYmF0Y2ggZmlsZXMgd2lsbCBoZWxwIHlvdSBidWlsZAordGhlIHRoaXJkIHBhcnR5IGxpYnJhcmllcyBuZWVkZWQgZm9yIGNvbXBsZXRlIHRocmlmdCBmdW5jdGlvbmFsaXR5IGFzCit3ZWxsIGFzIHRocmlmdCBpdHNlbGYuCisKK1RoZXNlIGluc3RydWN0aW9ucyBmb2xsb3cgYSBkaXJlY3RvcnkgbGF5b3V0IHRoYXQgbG9va3MgbGlrZSB0aGUgZm9sbG93aW5nOgorCisgICAgd29ya3NwYWNlXAorICAgICAgYnVpbGRcICAgICAgIC0gdGhpcyBpcyB3aGVyZSB0aGUgb3V0LW9mLXRyZWUgdGhyaWZ0IGNtYWtlIGJ1aWxkcyBhcmUgZ2VuZXJhdGVkCisgICAgICBkaXN0XCAgICAgICAgLSB0aGlzIGlzIHdoZXJlIHRoZSB0aHJpZnQgYnVpbGQgcmVzdWx0cyBlbmQgdXAKKyAgICAgIHRoaXJkcGFydHlcICAtIHRoaXMgaXMgd2hlcmUgYWxsIHRoaXJkIHBhcnR5IGJpbmFyaWVzIGFuZCBsaWJyYXJpZXMgbGl2ZQorICAgICAgICBidWlsZFwgICAgICAgLSB0aGlzIGlzIHdoZXJlIGFsbCB0aGlyZCBwYXJ0eSBvdXQtb2YtdHJlZSBidWlsZHMgYXJlIGdlbmVyYXRlZAorICAgICAgICAgICAgICAgICAgICAgICAoZXhjZXB0IGZvciBvcGVuc3NsLCB3aGljaCBvbmx5IGJ1aWxkcyBpbi10cmVlKQorICAgICAgICBkaXN0XCAgICAgICAgLSB0aGlzIGlzIHdoZXJlIGFsbCB0aGlyZCBwYXJ0eSBkaXN0cmlidXRpb25zIGVuZCB1cAorICAgICAgICBzcmNcICAgICAgICAgLSB0aGlzIGlzIHdoZXJlIGFsbCB0aGlyZCBwYXJ0eSBzb3VyY2UgcHJvamVjdHMgbGl2ZQorICAgICAgc2NyaXB0c1wgICAgIC0gYmF0Y2ggZmlsZXMgdXNlZCB0byBzZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBidWlsZHMKKyAgICAgIHRocmlmdFwgICAgICAtIHRoaXMgaXMgd2hlcmUgdGhlIHRocmlmdCBzb3VyY2UgcHJvamVjdCBsaXZlcworCitDcmVhdGUgYSAid29ya3NwYWNlIiBkaXJlY3Rvcnkgc29tZXdoZXJlIG9uIHlvdXIgc3lzdGVtIGFuZCB0aGVuIGNvcHkgdGhlIGNvbnRlbnRzIG9mIHRoaXMKK2RpcmVjdG9yeSB0byB0aGVyZSwgdGhlbiBjbG9uZSBvciB1bnBhY2sgdGhyaWZ0IGludG8gYHdvcmtzcGFjZVx0aHJpZnRgLgorCisjIyBUaGlyZCBQYXJ0eSBMaWJyYXJpZXMKKworQmF0Y2ggc2NyaXB0cyBhcmUgcHJvdmlkZWQgdG8gYnVpbGQgc29tZSB0aGlyZCBwYXJ0eSBsaWJyYXJpZXMuICBZb3UgbXVzdCBkb3dubG9hZCB0aGVtIGFuZCBwbGFjZSB0aGVtIGludG8gdGhlIGRpcmVjdG9yeSBub3RlZCBmb3IgZWFjaC4gIFlvdSBjYW4gdXNlIGRpZmZlcmVudCB2ZXJzaW9ucyBpZiB5b3UgcHJlZmVyOyB0aGVzZSBpbnN0cnVjdGlvbnMgd2VyZSBtYWRlIHdpdGggdGhlIHZlcnNpb25zIGxpc3RlZC4gIAorCis+IFRJUDogVG8gbW9kaWZ5IHRoZSB2ZXJzaW9ucyB1c2VkIGluIHRoZSBiYXRjaCBzY3JpcHRzLCBsb29rIGluIHNjcmlwdHNcdHB2ZXJzaW9ucy5iYXQuCisKK0J1aWxkIHRoZW0gaW4gdGhlIG9yZGVyIGxpc3RlZCB0byBzYXRpc2Z5IHRoZWlyIGRlcGVuZGVuY2llcy4KKworIyMjIHdpbmZsZXhiaXNvbgorCisgICAgICAgIHNvdXJjZTogd2ViIHNpdGUKKyAgICAgIGxvY2F0aW9uOiBodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy93aW5mbGV4Ymlzb24vZmlsZXMvd2luX2ZsZXhfYmlzb24tbGF0ZXN0LnppcC9kb3dubG9hZAorICAgICAgIHZlcnNpb246ICJsYXRlc3QiCisgICAgIGRpcmVjdG9yeTogd29ya3NwYWNlXHRoaXJkcGFydHlcZGlzdFx3aW5mbGV4Ymlzb24KKworVGhpcyBwYWNrYWdlIGlzIHJlcXVpcmVkIHRvIGJ1aWxkIHRoZSBjb21waWxlci4gIFRoaXMgdGhpcmQgcGFydHkgcGFja2FnZSBkb2VzIG5vdCBuZWVkIHRvIGJlIGJ1aWx0IGFzIGl0IGlzIGEgYmluYXJ5IGRpc3RyaWJ1dGlvbiBvZiB0aGUgImJpc29uIiBhbmQgImZsZXgiIHRvb2xzIG5vcm1hbGx5IGZvdW5kIG9uIFVuaXggYm94ZXMuCisKKz4gVElQOiBJZiB5b3UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBidWlsZGluZyB0aGUgY29tcGlsZXIsIHlvdSBjYW4gc2tpcCB0aGUgcmVtYWluaW5nIHRoaXJkIHBhcnR5IGxpYnJhcmllcy4KKworIyMjIHpsaWIKKworICAgICAgICBzb3VyY2U6IHdlYiBzaXRlCisgICAgICBsb2NhdGlvbjogaHR0cDovL3psaWIubmV0LworICAgICAgIHZlcnNpb246IDEuMi45CisgICAgIGRpcmVjdG9yeTogd29ya3NwYWNlXHRoaXJkcGFydHlcc3JjXHpsaWItMS4yLjkKKworVG8gYnVpbGQsIG9wZW4gdGhlIGFwcHJvcHJpYXRlIFZpc3VhbCBTdHVkaW8gY29tbWFuZCBwcm9tcHQgYW5kIHRoZW4gcnVuIAordGhlIGJ1aWxkLXpsaWIuYmF0IHNjcmlwdCBpbiB0aGlyZHBhcnR5XHNyYy4KKyAKKyMjIyBvcGVuc3NsCisKKyAgICAgICAgc291cmNlOiB3ZWIgc2l0ZQorICAgICAgbG9jYXRpb246IGh0dHBzOi8vd3d3Lm9wZW5zc2wub3JnLworICAgICAgIHZlcnNpb246IDEuMS4wYworICAgICBkaXJlY3Rvcnk6IHdvcmtzcGFjZVx0aGlyZHBhcnR5XHNyY1xvcGVuc3NsLTEuMS4wYworICAgIGRlcGVuZHMtb246IHpsaWIKKworSWYgeW91IGFyZSB1c2luZyBvcGVuc3NsLTEuMS4wIG9yIGxhdGVyLCB0aGV5IGNoYW5nZWQgc3RhdGljIGJ1aWxkcyB0byB1c2UgTWljcm9zb2Z0IFN0YXRpYyBSVEwgZm9yIHJlbGVhc2UgYnVpbGRzLiAgemxpYiBieSBkZWZhdWx0IHVzZXMgYSBkeW5hbWljIHJ1bnRpbWUsIGFzIGRvZXMgbGliZXZlbnQuICBFZGl0IHRoZSBmaWxlIENvbmZpZ3VyYXRpb25zLzEwLW1haW4uY29uZiBhbmQgcmVwbGFjZSB0aGUgc2VjdGlvbiBjb250ZW50cyBmb3IgIlZDLW5vQ0UtY29tbW9uIiB3aXRoIHdoYXQgYXBwZWFycyBiZWxvdyB0byBtYWtlIG9wZW5zc2wgYnVpbGQgd2l0aCBkeW5hbWljIHJ1bnRpbWUgaW5zdGVhZDoKKworICAgICJWQy1ub0NFLWNvbW1vbiIgPT4geworICAgICAgICBpbmhlcml0X2Zyb20gICAgID0+IFsgIlZDLWNvbW1vbiIgXSwKKyAgICAgICAgdGVtcGxhdGUgICAgICAgICA9PiAxLAorICAgICAgICBjZmxhZ3MgICAgICAgICAgID0+IGFkZChwaWNrZXIoZGVmYXVsdCA9PiAiLURVTklDT0RFIC1EX1VOSUNPREUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcgICA9PiAiL01EZCAvT2QgLURERUJVRyAtRF9ERUJVRyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxlYXNlID0+ICIvTUQgL08yIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKSwKKyAgICAgICAgYmluX2NmbGFncyAgICAgICA9PiBhZGQocGlja2VyKGRlYnVnICAgPT4gIi9NRGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsZWFzZSA9PiAiL01EIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSksCisgICAgICAgIGJpbl9sZmxhZ3MgICAgICAgPT4gYWRkKCIvc3Vic3lzdGVtOmNvbnNvbGUgL29wdDpyZWYiKSwKKyAgICAgICAgZXhfbGlicyAgICAgICAgICA9PiBhZGQoc3ViIHsKKyAgICAgICAgICAgIG15IEBleF9saWJzID0gKCk7CisgICAgICAgICAgICBwdXNoIEBleF9saWJzLCAnd3MyXzMyLmxpYicgdW5sZXNzICRkaXNhYmxlZHtzb2NrfTsKKyAgICAgICAgICAgIHB1c2ggQGV4X2xpYnMsICdnZGkzMi5saWIgYWR2YXBpMzIubGliIGNyeXB0MzIubGliIHVzZXIzMi5saWInOworICAgICAgICAgICAgcmV0dXJuIGpvaW4oIiAiLCBAZXhfbGlicyk7CisgICAgICAgIH0pLAorICAgIH0sCisKK1RvIGJ1aWxkLCBvcGVuIHRoZSBhcHByb3ByaWF0ZSBWaXN1YWwgU3R1ZGlvIGNvbW1hbmQgcHJvbXB0IGFuZCB0aGVuIHJ1biAKK3RoZSBidWlsZC1vcGVuc3NsLmJhdCBzY3JpcHQgaW4gdGhpcmRwYXJ0eVxzcmMuCisKKyMjIyBsaWJldmVudAorCisgICAgICAgIHNvdXJjZTogZ2l0CisgICAgICBsb2NhdGlvbjogaHR0cHM6Ly9naXRodWIuY29tL25tYXRoZXdzb24vTGliZXZlbnQuZ2l0CisgICAgICAgICAgIHVzZTogY29tbWl0IDM4MjFjY2ExYTYzN2Y0ZGE0MDk5YzkzNDNlNzMyNmRhMDBmNjk4MWMgb3IgbGF0ZXIKKyAgICAgICAgICBkYXRlOiBGcmkgRGVjIDIzIDE2OjE5OjM1IDIwMTYgKzA4MDAgb3IgbGF0ZXIKKyAgICAgICB2ZXJzaW9uOiBjb3JyZXNwb25kcyB0byAyLjEuN3JjICsgcGF0Y2hlcworICAgICBkaXJlY3Rvcnk6IHdvcmtzcGFjZVx0aGlyZHBhcnR5XHNyY1xsaWJldmVudC0yLjEuN3JjMgorICAgIGRlcGVuZHMtb246IG9wZW5zc2wsIHpsaWIKKworVG8gYnVpbGQsIG9wZW4gdGhlIGFwcHJvcHJpYXRlIFZpc3VhbCBTdHVkaW8gY29tbWFuZCBwcm9tcHQgYW5kIHRoZW4gcnVuIAordGhlIGJ1aWxkLWxpYmV2ZW50LmJhdCBzY3JpcHQgaW4gdGhpcmRwYXJ0eVxzcmMuCisKKyMjIyBtc2ludHR5cGVzCisKKyAgICAgICAgc291cmNlOiB3ZWIgc2l0ZQorICAgICAgbG9jYXRpb246IGh0dHBzOi8vY29kZS5nb29nbGUuY29tL2FyY2hpdmUvcC9tc2ludHR5cGVzL2Rvd25sb2FkcworICAgICAgIHZlcnNpb246IDI2CisgICAgIGRpcmVjdG9yeTogd29ya3NwYWNlXHRoaXJkcGFydHlcZGlzdFxtc2ludHR5cGVzCisKKz4gVElQOiBUaGlzIGlzIG9ubHkgbmVjZXNzYXJ5IGZvciBWaXN1YWwgU3R1ZGlvIDIwMTAsIHdoaWNoIGRpZCBub3QgaW5jbHVkZSBhbiA8aW50dHlwZXMuaD4gaGVhZGVyLgorCitUaGlzIHRoaXJkIHBhcnR5IHBhY2thZ2UgZG9lcyBub3QgbmVlZCB0byBiZSBidWlsdCBhcyBpdCBpcyBhIGRpc3RyaWJ1dGlvbiBvZiBoZWFkZXIgZmlsZXMuCisKKyMjIyBib29zdAorCisgICAgICAgIHNvdXJjZTogd2ViIHNpdGUKKyAgICAgIGxvY2F0aW9uOiBodHRwOi8vYm9vc3QudGVla3M5OS5jb20vCisgICAgICAgdmVyc2lvbjogMV82Ml8wCisgICAgIGRpcmVjdG9yeTogd29ya3NwYWNlXHRoaXJkcGFydHlcZGlzdFxib29zdF8xXzYyXzAKKworVGhlIHByZS1idWlsdCBiaW5hcnkgdmVyc2lvbnMgb2YgYm9vc3QgY29tZSBpbiBzZWxmLXVucGFja2luZyBleGVjdXRhYmxlcy4gIFJ1biBlYWNoIG9mIHRoZSBvbmVzIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiBhbmQgcG9pbnQgdGhlbSBhdCB0aGUgc2FtZSB0aGlyZHBhcnR5IGRpc3QgZGlyZWN0b3J5LgorCisjIyBCdWlsZGluZyBhIFByb2R1Y3Rpb24gdGhyaWZ0IENvbXBpbGVyCisKKyMjIyBQcmVyZXF1aXNpdGVzCisKKyogQ01ha2UtMi44LjEyLjIgb3IgbGF0ZXIKKyogVmlzdWFsIFN0dWRpbyAyMDEwIG9yIGxhdGVyCisqIHRocmlmdCBzb3VyY2UgcGxhY2VkIGludG8gd29ya3NwYWNlXHRocmlmdAorKiB3aW5mbGV4Ymlzb24gcGxhY2VkIGludG8gd29ya3NwYWNlXHRoaXJkcGFydHlcZGlzdAorCisjIyMgSW5zdHJ1Y3Rpb25zCisKK0J5IGZvbGxvd2luZyB0aGVzZSBpbnN0cnVjdGlvbnMgeW91IHdpbGwgZW5kIHVwIHdpdGggYSByZWxlYXNlIG1vZGUgdGhyaWZ0IGNvbXBpbGVyIHRoYXQgaXMgc3VpdGFibGUgZm9yIGRpc3RyaWJ1dGlvbiBhcyBpdCBoYXMgbm8gZXh0ZXJuYWwgZGVwZW5kZW5jaWVzLiAgCisKKzEuIE9wZW4gdGhlIGFwcHJvcHJpYXRlIFZpc3VhbCBTdHVkaW8gQ29tbWFuZCBQcm9tcHQuCisyLiBgY2Qgd29ya3NwYWNlYAorMy4gYGJ1aWxkLXRocmlmdC1jb21waWxlci5iYXRgCisKK1RoZSBiYXRjaCBmaWxlIHVzZXMgQ01ha2UgdG8gZ2VuZXJhdGUgYW4gb3V0LW9mLXRyZWUgYnVpbGQgZGlyZWN0b3J5IGluIGB3b3Jrc3BhY2VcYnVpbGRgIGFuZCB0aGVuIGJ1aWxkcyB0aGUgY29tcGlsZXIuICBUaGUgcmVzdWx0aW5nIGB0aHJpZnQuZXhlYCBwcm9ncmFtIGlzIHBsYWNlZCBpbnRvIGB3b3Jrc3BhY2VcZGlzdGAgaW4gYSBwYXRoIHRoYXQgZGVwZW5kcyBvbiB5b3VyIGNvbXBpbGVyIHZlcnNpb24gYW5kIHBsYXRmb3JtLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSB1c2UgYSBWaXN1YWwgU3R1ZGlvIDIwMTAgeDY0IENvbW1hbmQgUHJvbXB0LCB0aGUgY29tcGlsZXIgd2lsbCBiZSBwbGFjZWQgaW50byBgd29ya3NwYWNlXGRpc3RcdGhyaWZ0LWNvbXBpbGVyLWRldlx2YzEwMFx4NjRcUmVsZWFzZVx0aHJpZnQuZXhlYAorCisjIyMjIERldGFpbHMKKworVGhpcyBzZWN0aW9uIGlzIGZvciB0aG9zZSB3aG8gYXJlIGN1cmlvdXMgYWJvdXQgdGhlIENNYWtlIG9wdGlvbnMgdXNlZCBpbiB0aGUgYnVpbGQgcHJvY2Vzcy4KKworQ01ha2UgdGFrZXMgdGhlIHNvdXJjZSB0cmVlIGFzIHRoZSBmaXJzdCBhcmd1bWVudCBhbmQgdXNlcyB0aGUgcmVtYWluaW5nIGFyZ3VtZW50cyBmb3IgY29uZmlndXJhdGlvbi4gIFRoZSBiYXRjaCBmaWxlIGBidWlsZC10aHJpZnQtY29tcGlsZXJgIGVzc2VudGlhbGx5IHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgY29tbWFuZHM6CisKKyAgICBDOlw+IENEIHdvcmtzcGFjZVxidWlsZAorICAgIEM6XHdvcmtzcGFjZVxidWlsZD4gIkM6XFByb2dyYW0gRmlsZXNcQ01ha2VcYmluXGNtYWtlLmV4ZSIgLi5cdGhyaWZ0IAorICAgICAgICAgICAgICAgICAgICAgICAgICAtREJJU09OX0VYRUNVVEFCTEU9Li5cdGhpcmRwYXJ0eVxkaXN0XHdpbmZsZXhiaXNvblx3aW5fYmlzb24uZXhlCisgICAgICAgICAgICAgICAgICAgICAgICAgIC1EQ01BS0VfQlVJTERfVFlQRT1SZWxlYXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgIC1ERkxFWF9FWEVDVVRBQkxFPS4uXHRoaXJkcGFydHlcZGlzdFx3aW5mbGV4Ymlzb25cd2luX2ZsZXguZXhlCisgICAgICAgICAgICAgICAgICAgICAgICAgIC1EV0lUSF9NVD1PTgorICAgICAgICAgICAgICAgICAgICAgICAgICAtRFdJVEhfU0hBUkVEX0xJQj1PRkYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLUciTk1ha2UgTWFrZWZpbGVzIgorICAgIEM6XHdvcmtzcGFjZVxidWlsZD4gTk1BS0UgL0ZNYWtlZmlsZSB0aHJpZnQtY29tcGlsZXIKKworV0lUSF9NVCBjb250cm9scyB0aGUgZHluYW1pYyBvciBzdGF0aWMgcnVudGltZSBsaWJyYXJ5IHNlbGVjdGlvbi4gIFRvIGJ1aWxkIGEgcHJvZHVjdGlvbiBjb21waWxlciwgdGhlIHRocmlmdCBwcm9qZWN0IHJlY29tbWVuZHMgdXNpbmcgdGhlIHN0YXRpYyBydW50aW1lIGxpYnJhcnkgdG8gbWFrZSB0aGUgZXhlY3V0YWJsZSBwb3J0YWJsZS4gIFRoZSBiYXRjaCBmaWxlIHNldHMgdGhpcy4KKworWW91IGNhbiBidWlsZCBhIFZpc3VhbCBTdHVkaW8gcHJvamVjdCBmaWxlIGJ5IGZvbGxvd2luZyB0aGUgZXhhbXBsZSBidXQgc3Vic3RpdHV0aW5nIGEgZGlmZmVyZW50IGdlbmVyYXRvciBmb3IgdGhlICItRyIgb3B0aW9uLiAgUnVuIGBjbWFrZS5leGUgLS1oZWxwYCBmb3IgYSBsaXN0IG9mIGdlbmVyYXRvcnMuICBUeXBpY2FsbHksIHRoaXMgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgb24gV2luZG93cyAob21pdCAiV2luNjQiIHRvIGJ1aWxkIDMyLWJpdCBpbnN0ZWFkKToKKworKiAiVmlzdWFsIFN0dWRpbyAxMCAyMDEwIFdpbjY0IgorKiAiVmlzdWFsIFN0dWRpbyAxMSAyMDEyIFdpbjY0IgorKiAiVmlzdWFsIFN0dWRpbyAxMiAyMDEzIFdpbjY0IgorKiAiVmlzdWFsIFN0dWRpbyAxNCAyMDE1IFdpbjY0IgorKiAiVmlzdWFsIFN0dWRpbyAxNSAyMDE3IFdpbjY0IgorCitGb3IgZXhhbXBsZSB5b3UgY2FuIGJ1aWxkIHVzaW5nIGEgVmlzdWFsIFN0dWRpbyBzb2x1dGlvbiBmaWxlIG9uIHRoZSBjb21tYW5kIGxpbmUgYnkgZG9pbmc6CisKKyAgICBDOlw+IENEIHdvcmtzcGFjZVxidWlsZAorICAgIEM6XHdvcmtzcGFjZVxidWlsZD4gIkM6XFByb2dyYW0gRmlsZXNcQ01ha2VcYmluXGNtYWtlLmV4ZSIgLi5cdGhyaWZ0IAorICAgICAgICAgICAgICAgICAgICAgICAgICAtREJJU09OX0VYRUNVVEFCTEU9Li5cdGhpcmRwYXJ0eVxkaXN0XHdpbmZsZXhiaXNvblx3aW5fYmlzb24uZXhlCisgICAgICAgICAgICAgICAgICAgICAgICAgIC1EQ01BS0VfQlVJTERfVFlQRT1SZWxlYXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgIC1ERkxFWF9FWEVDVVRBQkxFPS4uXHRoaXJkcGFydHlcZGlzdFx3aW5mbGV4Ymlzb25cd2luX2ZsZXguZXhlCisgICAgICAgICAgICAgICAgICAgICAgICAgIC1EV0lUSF9NVD1PTgorICAgICAgICAgICAgICAgICAgICAgICAgICAtRFdJVEhfU0hBUkVEX0xJQj1PRkYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLUciVmlzdWFsIFN0dWRpbyAxNCAyMDE1IFdpbjY0IgorICAgIEM6XHdvcmtzcGFjZVxidWlsZD4gTVNCVUlMRCAiQXBhY2hlIFRocmlmdC5zbG4iIC9wOkNvbmZpZ3VyYXRpb249UmVsZWFzZSAvcDpQbGF0Zm9ybT14NjQgL3Q6dGhyaWZ0LWNvbXBpbGVyCisKK1lvdSBjYW4gYWxzbyBkb3VibGUtY2xpY2sgb24gdGhlIHNvbHV0aW9uIGZpbGUgdG8gYnJpbmcgaXQgdXAgaW4gVmlzdWFsIFN0dWRpbyBhbmQgYnVpbGQgb3IgZGVidWcgaW50ZXJhY3RpdmVseSBmcm9tIHRoZXJlLgorCisjIyBCdWlsZGluZyB0aGUgdGhyaWZ0IEMrKyBSdW4tVGltZSBMaWJyYXJ5CisKK1RoZXNlIGluc3RydWN0aW9ucyBhcmUgc2ltaWxhciB0byB0aGUgY29tcGlsZXIgYnVpbGQgaG93ZXZlciB0aGVyZSBhcmUgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgb24gdGhpcmQgcGFydHkgbGlicmFyaWVzIHRvIGJ1aWxkIGEgZmVhdHVyZS1jb21wbGV0ZSBydW50aW1lLiAgVGhlIHJlc3VsdGluZyBzdGF0aWMgbGluayBsaWJyYXJ5IGZvciB0aHJpZnQgdXNlcyBhIGR5bmFtaWMgTWljcm9zb2Z0IHJ1bnRpbWUuCisKKzEuIE9wZW4gdGhlIGRlc2lyZWQgVmlzdWFsIFN0dWRpbyBDb21tYW5kIFByb21wdC4KKzIuIGBjZCB3b3Jrc3BhY2VgCiszLiBgYnVpbGQtdGhyaWZ0LmJhdGAKKworVGhyaWZ0IGRlcGVuZHMgb24gYm9vc3QsIGxpYmV2ZW50LCBvcGVuc3NsLCBhbmQgemxpYiBpbiBvcmRlciB0byBidWlsZCB3aXRoIGFsbCBzZXJ2ZXIgYW5kIHRyYW5zcG9ydCB0eXBlcy4gIFRvIHVzZSBsYXRlciB2ZXJzaW9ucyBvZiBib29zdCBsaWtlIDEuNjIgeW91IHdpbGwgbmVlZCBhIHJlY2VudCB2ZXJzaW9uIG9mIGNtYWtlIChhdCBsZWFzdCAzLjcpLgorCitUaGUgYnVpbGQtdGhyaWZ0IHNjcmlwdCBoYXMgb3B0aW9ucyB0byBidWlsZCBkZWJ1ZyBvciByZWxlYXNlIGFuZCB0byBvcHRpb25hbGx5IGRpc2FibGUgYW55IG9mIHRoZSBnZW5lcmF0aW9uIChjbWFrZSksIGJ1aWxkLCBvciB0ZXN0IHBoYXNlcy4gIEJ5IGRlZmF1bHQsIHRoZSBiYXRjaCBmaWxlIHdpbGwgZ2VuZXJhdGUgYW4gb3V0LW9mLXRyZWUgYnVpbGQgZGlyZWN0b3J5IGluc2lkZSBgd29ya3NwYWNlXGJ1aWxkYCwgdGhlbiBwZXJmb3JtIGEgcmVsZWFzZSBidWlsZCwgdGhlbiBydW4gdGhlIHVuaXQgdGVzdHMuICBUaGUgYmF0Y2ggZmlsZSBhY2NlcHRzIHNvbWUgb3B0aW9uIGZsYWdzIHRvIGNvbnRyb2wgaXRzIGJlaGF2aW9yOgorCisgICAgOjogRmxhZ3MgeW91IGNhbiB1c2UgdG8gY2hhbmdlIHRoaXMgYmVoYXZpb3I6CisgICAgOjoKKyAgICA6OiAgIC9ERUJVRyAgICAgICAgICAgIC0gaWYgYnVpbGRpbmcsIHBlcmZvcm0gYSBkZWJ1ZyBidWlsZCBpbnN0ZWFkCisgICAgOjogICAvTk9HRU5FUkFURSAgICAgICAtIHNraXAgY21ha2UgZ2VuZXJhdGlvbiAtIHVzZWZ1bCBpZiB5b3UKKyAgICA6OiAgICAgICAgICAgICAgICAgICAgICAgaGF2ZSBhbHJlYWR5IGdlbmVyYXRlZCBhIHNvbHV0aW9uIGFuZCBqdXN0CisgICAgOjogICAgICAgICAgICAgICAgICAgICAgIHdhbnQgdG8gYnVpbGQKKyAgICA6OiAgIC9OT0JVSUxEICAgICAgICAgIC0gc2tpcCBjbWFrZSBidWlsZCAtIHVzZWZ1bCBpZiB5b3UganVzdAorICAgIDo6ICAgICAgICAgICAgICAgICAgICAgICB3YW50IHRvIGdlbmVyYXRlIGEgc29sdXRpb24KKyAgICA6OiAgIC9OT1RFU1QgICAgICAgICAgIC0gc2tpcCBjdGVzdCBleGVjdXRpb24KKworRm9yIGV4YW1wbGUgaWYgeW91IHdhbnQgdG8gZ2VuZXJhdGUgdGhlIGNtYWtlIGVudmlyb25tZW50IHdpdGhvdXQgYnVpbGRpbmcgb3IgcnVubmluZyB0ZXN0czoKKworICAgIEM6XHdvcmtzcGFjZT4gYnVpbGQtdGhyaWZ0LmJhdCAvTk9CVUlMRCAvTk9URVNUCmRpZmYgLS1naXQgYS9idWlsZC93aW5jcHAvYnVpbGQtdGhyaWZ0LWNvbXBpbGVyLmJhdCBiL2J1aWxkL3dpbmNwcC9idWlsZC10aHJpZnQtY29tcGlsZXIuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2YjQyYTgKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC93aW5jcHAvYnVpbGQtdGhyaWZ0LWNvbXBpbGVyLmJhdApAQCAtMCwwICsxLDc5IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6IAorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjogCis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6IAorCis6OgorOjogUHJvZHVjZXMgYSBwcm9kdWN0aW9uIHRocmlmdCBjb21waWxlciBzdWl0YWJsZSBmb3IgcmVkaXN0cmlidXRpb24uCis6OiBUaGUgY29tcGlsZXIgaXMgbGlua2VkIHRvIHJ1bnRpbWUgc3RhdGljYWxseSBmb3IgbWF4aW11bSBwb3J0YWJpbGl0eS4KKzo6IEFzc3VtZXMgdGhlIHRoaXJkcGFydHkgZmlsZXMgZm9yICJ3aW5mbGV4Ymlzb24iIGhhdmUgYmVlbiBwbGFjZWQKKzo6IGFjY29yZGluZyB0byB0aGUgUkVBRE1FLm1kIGluc3RydWN0aW9ucy4KKzo6Cis6OiBPcGVuIGEgVmlzdWFsIFN0dWRpbyBDb21tYW5kIFByb21wdCBvZiB5b3VyIGNob29zaW5nIGFuZCB0aGVuCis6OiBydW4gdGhpcyBzY3JpcHQuICAKKworQEVDSE8gT0ZGCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCisKK0lGIE5PVCBERUZJTkVEIFBBQ0tBR0VfTkFNRSAgICBTRVQgUEFDS0FHRV9OQU1FPXRocmlmdAorSUYgTk9UIERFRklORUQgUEFDS0FHRV9WRVJTSU9OIFNFVCBQQUNLQUdFX1ZFUlNJT049ZGV2CitJRiBOT1QgREVGSU5FRCBTT1VSQ0VfRElSICAgICAgU0VUIFNPVVJDRURJUj0lfmRwMCVQQUNLQUdFX05BTUUlCitJRiBOT1QgREVGSU5FRCBXSU4zUF9ST09UICAgICAgU0VUIFdJTjNQX1JPT1Q9JX5kcDB0aGlyZHBhcnR5CisKKzo6IFNldCBDT01QSUxFUiB0byAodmMxMDAgLSB2YzE0MCkgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IGVudmlyb25tZW50CitDQUxMIHNjcmlwdHNcY2xfc2V0Y29tcGlsZXIuYmF0IHx8IEVYSVQgL0IKKworOjogU2V0IEFSQ0ggdG8gZWl0aGVyIHdpbjMyIG9yIHg2NCBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQKK0NBTEwgc2NyaXB0c1xjbF9zZXRhcmNoLmJhdCB8fCBFWElUIC9CCisKKzo6IFNldCBHRU5FUkFUT1IgZm9yIENNYWtlIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudAorQ0FMTCBzY3JpcHRzXGNsX3NldGdlbmVyYXRvci5iYXQgfHwgRVhJVCAvQgorCitJRiBOT1QgREVGSU5FRCBCVUlMRFRZUEUgKAorICBTRVQgQlVJTERUWVBFPVJlbGVhc2UKKykKKworICBTRVQgQlVJTERESVI9JX5kcDBidWlsZFwlUEFDS0FHRV9OQU1FJS1jb21waWxlclwlUEFDS0FHRV9WRVJTSU9OJVwlQ09NUElMRVIlXAorICBTRVQgT1VURElSPSV+ZHAwZGlzdFwlUEFDS0FHRV9OQU1FJS1jb21waWxlci0lUEFDS0FHRV9WRVJTSU9OJVwlQ09NUElMRVIlXCVBUkNIJVwlQlVJTERUWVBFJVwKKyAgU0VUIEJPT1NUX0xJQkRJUj1saWIlQVJDSDp+LTIsMiUtbXN2Yy0lQ09NUElMRVI6fi0zLDIlLjAKKyAgSUYgIiVCVUlMRFRZUEUlIiA9PSAiRGVidWciIChTRVQgWkxJQl9TVEFUSUNfU1VGRklYPWQpCisKKyAgRUNITy8KKyAgRUNITyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEVDSE8gICAgIENvbmZpZ3VyYXRpb246ICVQQUNLQUdFX05BTUUlICVQQUNLQUdFX1ZFUlNJT04lICVDT01QSUxFUiU6JUFSQ0glOiVCVUlMRFRZUEUlICIlR0VORVJBVE9SJSIKK0lGIERFRklORUQgQ09NUElMRVJPTkxZICgKKyAgRUNITyAgICAgICAgICAgICAgICAgICAgQ09NUElMRVIgT05MWQorKQorICBFQ0hPICAgQnVpbGQgRGlyZWN0b3J5OiAlQlVJTERESVIlCisgIEVDSE8gSW5zdGFsbCBEaXJlY3Rvcnk6ICVPVVRESVIlCisgIEVDSE8gIFNvdXJjZSBEaXJlY3Rvcnk6ICVTT1VSQ0VESVIlCisgIEVDSE8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBFQ0hPLworCisgIE1LRElSICIlQlVJTERESVIlIgorICBDRCAiJUJVSUxERElSJSIgfHwgRVhJVCAvQgorCisgIENNQUtFLkVYRSAlfmRwMHRocmlmdCBeCisgICAgLUciJUdFTkVSQVRPUiUiIF4KKyAgICAtREJJU09OX0VYRUNVVEFCTEU9JVdJTjNQX1JPT1QlXGRpc3Rcd2luZmxleGJpc29uXHdpbl9iaXNvbi5leGUgXgorICAgIC1EQ01BS0VfQlVJTERfVFlQRT0lQlVJTERUWVBFJSBeCisgICAgLURGTEVYX0VYRUNVVEFCTEU9JVdJTjNQX1JPT1QlXGRpc3Rcd2luZmxleGJpc29uXHdpbl9mbGV4LmV4ZSBeCisgICAgLURXSVRIX01UPU9OIF4KKyAgICAtRFdJVEhfU0hBUkVEX0xJQj1PRkYgfHwgRVhJVCAvQgorCisgIENEICVCVUlMRERJUiUKKworICBDTUFLRS5FWEUgLS1idWlsZCAuIC0tY29uZmlnICVCVUlMRFRZUEUlIC0tdGFyZ2V0IHRocmlmdC1jb21waWxlciB8fCBFWElUIC9CCisgIFhDT1BZIC9GIC9ZICVCVUlMRERJUiVcYmluXCVCVUlMRFRZUEUlXHRocmlmdC5leGUgJU9VVERJUiUKKworRU5ETE9DQUwKK0VYSVQgL0IKZGlmZiAtLWdpdCBhL2J1aWxkL3dpbmNwcC9idWlsZC10aHJpZnQuYmF0IGIvYnVpbGQvd2luY3BwL2J1aWxkLXRocmlmdC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg2N2FjZgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL3dpbmNwcC9idWlsZC10aHJpZnQuYmF0CkBAIC0wLDAgKzEsMTYzIEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6IAorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjogCis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6IAorCis6OgorOjogR2VuZXJhdGVzIGEgVmlzdWFsIFN0dWRpbyBzb2x1dGlvbiBmb3IgdGhyaWZ0IGFuZCB0aGVuIGJ1aWxkcyBpdC4KKzo6IEFzc3VtZXMgdGhpcmQgcGFydHkgbGlicmFyaWVzIGhhdmUgYmVlbiBidWlsdCBvciBwbGFjZWQgYWxyZWFkeS4KKzo6Cis6OiBPcGVuIGEgVmlzdWFsIFN0dWRpbyBDb21tYW5kIFByb21wdCBvZiB5b3VyIGNob29zaW5nIGFuZCB0aGVuCis6OiBydW4gdGhpcyBzY3JpcHQuICAKKzo6Cis6OiBOb3JtYWxseSB0aGUgc2NyaXB0IHdpbGwgcnVuIGNtYWtlIHRvIGdlbmVyYXRlIGEgc29sdXRpb24sIHRoZW4KKzo6IHBlcmZvcm0gYSBidWlsZCwgdGhlbiBydW4gdGVzdHMgb24gdGhlIGNvbXBsZXRlIHRocmlmdCBsaWJyYXJ5Cis6OiBpbiByZWxlYXNlIG1vZGUuCis6OgorOjogRmxhZ3MgeW91IGNhbiB1c2UgdG8gY2hhbmdlIHRoaXMgYmVoYXZpb3I6Cis6OgorOjogICAvREVCVUcgICAgICAgICAgICAtIGRlYnVnIGluc3RlYWQgb2YgcmVsZWFzZQorOjogICAvSURFICAgICAgICAgICAgICAtIGxhdW5jaCBWaXN1YWwgU3R1ZGlvIHdpdGggYSBwYXRoIHNldAorOjogICAgICAgICAgICAgICAgICAgICAgIHVwIGNvcnJlY3RseSB0byBydW4gdGVzdHMgaW5zdGVhZCBvZgorOjogICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1pbmcgYW55IG90aGVyIGFjdGlvbnMsIGkuZS4KKzo6ICAgICAgICAgICAgICAgICAgICAgICBpbXBsaWVzIHNldHRpbmcgdGhlIG5leHQgdGhyZWUgZmxhZ3MKKzo6ICAgL05PR0VORVJBVEUgICAgICAgLSBza2lwIGNtYWtlIGdlbmVyYXRpb24gLSB1c2VmdWwgaWYgeW91Cis6OiAgICAgICAgICAgICAgICAgICAgICAgaGF2ZSBhbHJlYWR5IGdlbmVyYXRlZCBhIHNvbHV0aW9uIGFuZCBqdXN0Cis6OiAgICAgICAgICAgICAgICAgICAgICAgd2FudCB0byBidWlsZAorOjogICAvTk9CVUlMRCAgICAgICAgICAtIHNraXAgY21ha2UgYnVpbGQgLSB1c2VmdWwgaWYgeW91IGp1c3QKKzo6ICAgICAgICAgICAgICAgICAgICAgICB3YW50IHRvIGdlbmVyYXRlIGEgc29sdXRpb24KKzo6ICAgL05PVEVTVCAgICAgICAgICAgLSBza2lwIGN0ZXN0IGV4ZWN1dGlvbgorOjoKKworQEVDSE8gT0ZGCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCisKKzo6IFNldHMgdmFyaWFibGVzIGZvciB0aGlyZCBwYXJ0eSB2ZXJzaW9ucyB1c2VkIGluIGJ1aWxkCitDQUxMIHNjcmlwdHNcdHB2ZXJzaW9ucy5iYXQgfHwgRVhJVCAvQgorCitJRiBOT1QgREVGSU5FRCBQQUNLQUdFX05BTUUgICAgU0VUIFBBQ0tBR0VfTkFNRT10aHJpZnQKK0lGIE5PVCBERUZJTkVEIFBBQ0tBR0VfVkVSU0lPTiBTRVQgUEFDS0FHRV9WRVJTSU9OPWRldgorSUYgTk9UIERFRklORUQgU09VUkNFX0RJUiAgICAgIFNFVCBTT1VSQ0VESVI9JX5kcDAlUEFDS0FHRV9OQU1FJQorSUYgTk9UIERFRklORUQgV0lOM1BfUk9PVCAgICAgIFNFVCBXSU4zUF9ST09UPSV+ZHAwdGhpcmRwYXJ0eQorCis6OiBTZXQgQ09NUElMRVIgdG8gKHZjMTAwIC0gdmMxNDApIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudAorQ0FMTCBzY3JpcHRzXGNsX3NldGNvbXBpbGVyLmJhdCB8fCBFWElUIC9CCisKKzo6IFNldCBBUkNIIHRvIGVpdGhlciB3aW4zMiBvciB4NjQgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IGVudmlyb25tZW50CitDQUxMIHNjcmlwdHNcY2xfc2V0YXJjaC5iYXQgfHwgRVhJVCAvQgorCis6OiBTZXQgR0VORVJBVE9SIGZvciBDTWFrZSBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQKK0NBTEwgc2NyaXB0c1xjbF9zZXRnZW5lcmF0b3IuYmF0IHx8IEVYSVQgL0IKKworOjogRGVmYXVsdHMKKworSUYgTk9UIERFRklORUQgQlVJTERUWVBFIFNFVCBCVUlMRFRZUEU9UmVsZWFzZQorU0VUIE9QVF9JREU9MAorU0VUIE9QVF9CVUlMRD0xCitTRVQgT1BUX0dFTkVSQVRFPTEKK1NFVCBPUFRfVEVTVD0xCisKKzo6IEFwcGx5IEZsYWdzCisKK0lGIC9JICIlMSIgPT0gIi9ERUJVRyIgICAgICAgIFNFVCBCVUlMRFRZUEU9RGVidWcKK0lGIC9JICIlMiIgPT0gIi9ERUJVRyIgICAgICAgIFNFVCBCVUlMRFRZUEU9RGVidWcKK0lGIC9JICIlMyIgPT0gIi9ERUJVRyIgICAgICAgIFNFVCBCVUlMRFRZUEU9RGVidWcKK0lGIC9JICIlMSIgPT0gIi9JREUiICAgICAgICAgIFNFVCBPUFRfSURFPTEKK0lGIC9JICIlMiIgPT0gIi9JREUiICAgICAgICAgIFNFVCBPUFRfSURFPTEKK0lGIC9JICIlMyIgPT0gIi9JREUiICAgICAgICAgIFNFVCBPUFRfSURFPTEKK0lGIC9JICIlMSIgPT0gIi9OT0JVSUxEIiAgICAgIFNFVCBPUFRfQlVJTEQ9MAorSUYgL0kgIiUyIiA9PSAiL05PQlVJTEQiICAgICAgU0VUIE9QVF9CVUlMRD0wCitJRiAvSSAiJTMiID09ICIvTk9CVUlMRCIgICAgICBTRVQgT1BUX0JVSUxEPTAKK0lGIC9JICIlMSIgPT0gIi9OT0dFTkVSQVRFIiAgIFNFVCBPUFRfR0VORVJBVEU9MAorSUYgL0kgIiUyIiA9PSAiL05PR0VORVJBVEUiICAgU0VUIE9QVF9HRU5FUkFURT0wCitJRiAvSSAiJTMiID09ICIvTk9HRU5FUkFURSIgICBTRVQgT1BUX0dFTkVSQVRFPTAKK0lGIC9JICIlMSIgPT0gIi9OT1RFU1QiICAgICAgIFNFVCBPUFRfVEVTVD0wCitJRiAvSSAiJTIiID09ICIvTk9URVNUIiAgICAgICBTRVQgT1BUX1RFU1Q9MAorSUYgL0kgIiUzIiA9PSAiL05PVEVTVCIgICAgICAgU0VUIE9QVF9URVNUPTAKKworSUYgJU9QVF9JREUlID09IDEgKAorICBTRVQgT1BUX0dFTkVSQVRFPTAKKyAgU0VUIE9QVF9CVUlMRD0wCisgIFNFVCBPUFRfVEVTVD0wCispCisKKyAgU0VUIEJVSUxERElSPSV+ZHAwYnVpbGRcJVBBQ0tBR0VfTkFNRSVcJVBBQ0tBR0VfVkVSU0lPTiVcJUNPTVBJTEVSJVwlQVJDSCVcCisgIFNFVCBPVVRESVI9JX5kcDBkaXN0XCVQQUNLQUdFX05BTUUlLSVQQUNLQUdFX1ZFUlNJT04lXCVDT01QSUxFUiVcJUFSQ0glXCVCVUlMRFRZUEUlXAorICBTRVQgQk9PU1RfTElCRElSPWxpYiVBUkNIOn4tMiwyJS1tc3ZjLSVDT01QSUxFUjp+LTMsMiUuMAorICBJRiAiJUJVSUxEVFlQRSUiID09ICJEZWJ1ZyIgKFNFVCBaTElCX1NUQVRJQ19TVUZGSVg9ZCkKKworICBFQ0hPLworICBFQ0hPID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRUNITyAgICAgQ29uZmlndXJhdGlvbjogJVBBQ0tBR0VfTkFNRSUgJVBBQ0tBR0VfVkVSU0lPTiUgJUNPTVBJTEVSJTolQVJDSCU6JUJVSUxEVFlQRSUgIiVHRU5FUkFUT1IlIgorSUYgREVGSU5FRCBDT01QSUxFUk9OTFkgKAorICBFQ0hPICAgICAgICAgICAgICAgICAgICBDT01QSUxFUiBPTkxZCispCisgIEVDSE8gICBCdWlsZCBEaXJlY3Rvcnk6ICVCVUlMRERJUiUKKyAgRUNITyBJbnN0YWxsIERpcmVjdG9yeTogJU9VVERJUiUKKyAgRUNITyAgU291cmNlIERpcmVjdG9yeTogJVNPVVJDRURJUiUKKyAgRUNITyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEVDSE8vCisKK0lGICVPUFRfSURFJSA9PSAxICgKKworICBDQUxMIDpTRVRSVU5QQVRIIHx8IEVYSVQgL0IKKyAgQ0FMTCBERVZFTlYgIiFCVUlMRERJUiFBcGFjaGUgVGhyaWZ0LnNsbiIgfHwgRVhJVCAvQgorICBFWElUIC9CCisgIAorKQorCisgIE1LRElSICIlQlVJTERESVIlIgorICBDRCAiJUJVSUxERElSJSIgfHwgRVhJVCAvQgorCitJRiAlT1BUX0dFTkVSQVRFJSA9PSAxICgKKworICBDTUFLRS5FWEUgJX5kcDB0aHJpZnQgXgorICAgIC1HIiVHRU5FUkFUT1IlIiBeCisgICAgLURCSVNPTl9FWEVDVVRBQkxFPSVXSU4zUF9ST09UJVxkaXN0XHdpbmZsZXhiaXNvblx3aW5fYmlzb24uZXhlIF4KKyAgICAtREJPT1NUX1JPT1Q9JVdJTjNQX1JPT1QlXGRpc3RcYm9vc3RfJVRQX0JPT1NUX1ZFUlNJT04lIF4KKyAgICAtREJPT1NUX0xJQlJBUllESVI9JVdJTjNQX1JPT1QlXGRpc3RcYm9vc3RfJVRQX0JPT1NUX1ZFUlNJT04lXCVCT09TVF9MSUJESVIlIF4KKyAgICAtRENNQUtFX0lOU1RBTExfUFJFRklYPSVPVVRESVIlIF4KKyAgICAtRENNQUtFX0JVSUxEX1RZUEU9JUJVSUxEVFlQRSUgXgorICAgIC1ERkxFWF9FWEVDVVRBQkxFPSVXSU4zUF9ST09UJVxkaXN0XHdpbmZsZXhiaXNvblx3aW5fZmxleC5leGUgXgorICAgIC1ESU5UVFlQRVNfUk9PVD0lV0lOM1BfUk9PVCVcZGlzdFxtc2ludHR5cGVzIF4KKyAgICAtRExJQkVWRU5UX1JPT1Q9JVdJTjNQX1JPT1QlXGRpc3RcbGliZXZlbnQtJVRQX0xJQkVWRU5UX1ZFUlNJT04lXCVDT01QSUxFUiVcJUFSQ0glXCVCVUlMRFRZUEUlIF4KKyAgICAtRE9QRU5TU0xfUk9PVF9ESVI9JVdJTjNQX1JPT1QlXGRpc3Rcb3BlbnNzbC0lVFBfT1BFTlNTTF9WRVJTSU9OJVwlQ09NUElMRVIlXCVBUkNIJVwlQlVJTERUWVBFJVxkeW5hbWljIF4KKyAgICAtRE9QRU5TU0xfVVNFX1NUQVRJQ19MSUJTPU9GRiBeCisgICAgLURaTElCX0xJQlJBUlk9JVdJTjNQX1JPT1QlXGRpc3RcemxpYi0lVFBfWkxJQl9WRVJTSU9OJVwlQ09NUElMRVIlXCVBUkNIJVxsaWJcemxpYiVaTElCX0xJQl9TVUZGSVglLmxpYiBeCisgICAgLURaTElCX1JPT1Q9JVdJTjNQX1JPT1QlXGRpc3RcemxpYi0lVFBfWkxJQl9WRVJTSU9OJVwlQ09NUElMRVIlXCVBUkNIJSBeCisgICAgLURXSVRIX1NIQVJFRF9MSUI9T0ZGIF4KKyAgICAtRFdJVEhfU1RBVElDX0xJQj1PTiB8fCBFWElUIC9CCisKKykKKworSUYgJU9QVF9CVUlMRCUgPT0gMSAoCisKKyAgQ0QgJUJVSUxERElSJQorICBDTUFLRS5FWEUgLS1idWlsZCAuIC0tY29uZmlnICVCVUlMRFRZUEUlIC0tdGFyZ2V0IElOU1RBTEwgfHwgRVhJVCAvQgorCispCisKK0lGICVPUFRfVEVTVCUgPT0gMSAoCisKKyAgQ0FMTCA6U0VUUlVOUEFUSCB8fCBFWElUIC9CCisgIENNQUtFLkVYRSAtLWJ1aWxkIC4gLS1jb25maWcgJUJVSUxEVFlQRSUgLS10YXJnZXQgUlVOX1RFU1RTIHx8IEVYSVQgL0IKKyAgCispCisKKzpTRVRSVU5QQVRICisgIFNFVCBQQVRIPSFQQVRIITslV0lOM1BfUk9PVCVcZGlzdFxib29zdF8lVFBfQk9PU1RfVkVSU0lPTiVcJUJPT1NUX0xJQkRJUiUKKyAgU0VUIFBBVEg9IVBBVEghOyVXSU4zUF9ST09UJVxkaXN0XG9wZW5zc2wtJVRQX09QRU5TU0xfVkVSU0lPTiVcJUNPTVBJTEVSJVwlQVJDSCVcJUJVSUxEVFlQRSVcZHluYW1pY1xiaW4KKyAgU0VUIFBBVEg9IVBBVEghOyVXSU4zUF9ST09UJVxkaXN0XHpsaWItJVRQX1pMSUJfVkVSU0lPTiVcJUNPTVBJTEVSJVwlQVJDSCVcYmluCisgIEVYSVQgL0IKKworRU5ETE9DQUwKK0VYSVQgL0IKZGlmZiAtLWdpdCBhL2J1aWxkL3dpbmNwcC9zY3JpcHRzL2NsX3NldGFyY2guYmF0IGIvYnVpbGQvd2luY3BwL3NjcmlwdHMvY2xfc2V0YXJjaC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU3MGExZQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL3dpbmNwcC9zY3JpcHRzL2NsX3NldGFyY2guYmF0CkBAIC0wLDAgKzEsNDcgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjogCis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OiAKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjogCisKKzo6Cis6OiBEZXRlY3QgdGhlIGFyY2hpdGVjdHVyZSB3ZSdyZSBidWlsZGluZyBmb3IuCis6OiBTZXQgdGhlIEFSQ0ggZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gb25lIG9mOgorOjogICB3aW4zMgorOjogICB4NjQKKzo6Cis6OiBIb25vcnMgYW55IGV4aXN0aW5nIEFSQ0ggZW52aXJvbm1lbnQgdmFyaWFibGUKKzo6ICAgc2V0dGluZyBpbnN0ZWFkIG9mIG92ZXJ3cml0aW5nIGl0LCB0byBhbGxvdyBpdAorOjogICB0byBiZSBmb3JjZWQgaWYgbmVlZGVkLgorOjoKKzo6IFNldHMgRVJST1JMRVZFTCB0byAwIGlmIEFSQ0ggY2FuIGJlIGRldGVybWluZWQsCis6OiAgICAgICAgICAgICAgICAgdG8gMSBpZiBpdCBjYW5ub3QuCis6OgorCitJRiBERUZJTkVEIEFSQ0ggKAorICBFQ0hPIFt3YXJuIF0gdXNpbmcgZXhpc3RpbmcgZW52aXJvbm1lbnQgdmFyaWFibGUgQVJDSAorICBFWElUIC9CIDAKKykKKworQ0FMTCA6Q0hFQ0sgeDY0CitJRiAlRVJST1JMRVZFTCUgPT0gMCAoU0VUIEFSQ0g9eDY0KSBFTFNFIChTRVQgQVJDSD13aW4zMikKKworSUYgTk9UIERFRklORUQgQVJDSCAoCisgIEVDSE8gW2Vycm9yXSB1bmFibGUgdG8gZGV0ZXJtaW5lIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlCisgIEVYSVQgL0IgMQorKQorCitFQ0hPIFtpbmZvIF0gZGV0ZWN0ZWQgdGFyZ2V0IGFyY2hpdGVjdHVyZSAlQVJDSCUKK0VYSVQgL0IgMAorCis6Q0hFQ0sKK2NsIC8/IDI+JjEgfCBmaW5kc3RyIC9DOiIgZm9yICUxJSIgPiBudWwKK0VYSVQgL0IgJUVSUk9STEVWRUwlCmRpZmYgLS1naXQgYS9idWlsZC93aW5jcHAvc2NyaXB0cy9jbF9zZXRjb21waWxlci5iYXQgYi9idWlsZC93aW5jcHAvc2NyaXB0cy9jbF9zZXRjb21waWxlci5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQwNWQ3NgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL3dpbmNwcC9zY3JpcHRzL2NsX3NldGNvbXBpbGVyLmJhdApAQCAtMCwwICsxLDU4IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6IAorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjogCis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6IAorCis6OgorOjogRGV0ZWN0IHRoZSBjb21waWxlciBlZGl0aW9uIHdlJ3JlIGJ1aWxkaW5nIGluLgorOjogU2V0IHRoZSBDT01QSUxFUiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBvbmUgb2Y6Cis6OiAgIHZjMTAwID0gVmlzdWFsIFN0dWRpbyAyMDEwCis6OiAgIHZjMTEwID0gVmlzdWFsIFN0dWRpbyAyMDEyCis6OiAgIHZjMTIwID0gVmlzdWFsIFN0dWRpbyAyMDEzCis6OiAgIHZjMTQwID0gVmlzdWFsIFN0dWRpbyAyMDE1Cis6OiAgIHZjMTUwID0gVmlzdWFsIFN0dWRpbyAyMDE3Cis6OgorOjogSG9ub3JzIGFueSBleGlzdGluZyBDT01QSUxFUiBlbnZpcm9ubWVudCB2YXJpYWJsZQorOjogICBzZXR0aW5nIGluc3RlYWQgb2Ygb3ZlcndyaXRpbmcgaXQsIHRvIGFsbG93IGl0Cis6OiAgIHRvIGJlIGZvcmNlZCBpZiBuZWVkZWQuCis6OgorOjogU2V0cyBFUlJPUkxFVkVMIHRvIDAgaWYgQ09NUElMRVIgY2FuIGJlIGRldGVybWluZWQsCis6OiAgICAgICAgICAgICAgICAgdG8gMSBpZiBpdCBjYW5ub3QuCis6OgorCitJRiBERUZJTkVEIENPTVBJTEVSICgKKyAgRUNITyBbd2FybiBdIHVzaW5nIGV4aXN0aW5nIGVudmlyb25tZW50IHZhcmlhYmxlIENPTVBJTEVSCisgIEVYSVQgL0IgMAorKQorCitDQUxMIDpDSEVDSyAxNgorSUYgJUVSUk9STEVWRUwlID09IDAgKElGIE5PVCBERUZJTkVEIENPTVBJTEVSIFNFVCBDT01QSUxFUj12YzEwMCkKK0NBTEwgOkNIRUNLIDE3CitJRiAlRVJST1JMRVZFTCUgPT0gMCAoSUYgTk9UIERFRklORUQgQ09NUElMRVIgU0VUIENPTVBJTEVSPXZjMTEwKQorQ0FMTCA6Q0hFQ0sgMTgKK0lGICVFUlJPUkxFVkVMJSA9PSAwIChJRiBOT1QgREVGSU5FRCBDT01QSUxFUiBTRVQgQ09NUElMRVI9dmMxMjApCitDQUxMIDpDSEVDSyAxOS4wMAorSUYgJUVSUk9STEVWRUwlID09IDAgKElGIE5PVCBERUZJTkVEIENPTVBJTEVSIFNFVCBDT01QSUxFUj12YzE0MCkKK0NBTEwgOkNIRUNLIDE5LjEwCitJRiAlRVJST1JMRVZFTCUgPT0gMCAoSUYgTk9UIERFRklORUQgQ09NUElMRVIgU0VUIENPTVBJTEVSPXZjMTUwKQorCitJRiBOT1QgREVGSU5FRCBDT01QSUxFUiAoCisgIEVDSE8gW2Vycm9yXSB1bmFibGUgdG8gZGV0ZXJtaW5lIHRoZSBjb21waWxlciBlZGl0aW9uCisgIEVYSVQgL0IgMQorKQorCitFQ0hPIFtpbmZvIF0gZGV0ZWN0ZWQgY29tcGlsZXIgZWRpdGlvbiAgICAlQ09NUElMRVIlCitFWElUIC9CIDAKKworOkNIRUNLCitjbCAvPyAyPiYxIHwgZmluZHN0ciAvQzoiVmVyc2lvbiAlMSUuIiA+IG51bAorRVhJVCAvQiAlRVJST1JMRVZFTCUKZGlmZiAtLWdpdCBhL2J1aWxkL3dpbmNwcC9zY3JpcHRzL2NsX3NldGdlbmVyYXRvci5iYXQgYi9idWlsZC93aW5jcHAvc2NyaXB0cy9jbF9zZXRnZW5lcmF0b3IuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhZTI3NDIKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC93aW5jcHAvc2NyaXB0cy9jbF9zZXRnZW5lcmF0b3IuYmF0CkBAIC0wLDAgKzEsNjkgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjogCis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OiAKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjogCisKKzo6Cis6OiBEZXRlY3QgdGhlIGNvbXBpbGVyIGVkaXRpb24gd2UncmUgYnVpbGRpbmcgaW4gYW5kIHRoZW4gCis6OiBzZXQgdGhlIEdFTkVSQVRPUiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBvbmUgb2Y6Cis6OgorOjogIFZpc3VhbCBTdHVkaW8gMTUgMjAxNyBbYXJjaF0gPSBHZW5lcmF0ZXMgVmlzdWFsIFN0dWRpbyAyMDE3IHByb2plY3QgZmlsZXMuCis6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsIFthcmNoXSBjYW4gYmUgIldpbjY0IiBvciAiQVJNIi4KKzo6ICBWaXN1YWwgU3R1ZGlvIDE0IDIwMTUgW2FyY2hdID0gR2VuZXJhdGVzIFZpc3VhbCBTdHVkaW8gMjAxNSBwcm9qZWN0IGZpbGVzLgorOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbCBbYXJjaF0gY2FuIGJlICJXaW42NCIgb3IgIkFSTSIuCis6OiAgVmlzdWFsIFN0dWRpbyAxMiAyMDEzIFthcmNoXSA9IEdlbmVyYXRlcyBWaXN1YWwgU3R1ZGlvIDIwMTMgcHJvamVjdCBmaWxlcy4KKzo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWwgW2FyY2hdIGNhbiBiZSAiV2luNjQiIG9yICJBUk0iLgorOjogIFZpc3VhbCBTdHVkaW8gMTEgMjAxMiBbYXJjaF0gPSBHZW5lcmF0ZXMgVmlzdWFsIFN0dWRpbyAyMDEyIHByb2plY3QgZmlsZXMuCis6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsIFthcmNoXSBjYW4gYmUgIldpbjY0IiBvciAiQVJNIi4KKzo6ICBWaXN1YWwgU3R1ZGlvIDEwIDIwMTAgW2FyY2hdID0gR2VuZXJhdGVzIFZpc3VhbCBTdHVkaW8gMjAxMCBwcm9qZWN0IGZpbGVzLgorOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbCBbYXJjaF0gY2FuIGJlICJXaW42NCIgb3IgIklBNjQiLgorOjoKKzo6IEhvbm9ycyBhbnkgZXhpc3RpbmcgR0VORVJBVE9SIGVudmlyb25tZW50IHZhcmlhYmxlCis6OiAgIHNldHRpbmcgaW5zdGVhZCBvZiBvdmVyd3JpdGluZyBpdCwgdG8gYWxsb3cgaXQKKzo6ICAgdG8gYmUgZm9yY2VkIGlmIG5lZWRlZC4KKzo6Cis6OiBTZXRzIEVSUk9STEVWRUwgdG8gMCBpZiBHRU5FUkFUT1IgY2FuIGJlIGRldGVybWluZWQsCis6OiAgICAgICAgICAgICAgICAgdG8gMSBpZiBpdCBjYW5ub3QuCis6OgorOjogUmVxdWlyZXMgY2xfc2V0YXJjaC5iYXQgdG8gaGF2ZSBiZWVuIGV4ZWN1dGVkIG9yIHRoZSBBUkNIIGVudmlyb25tZW50Cis6OiB2YXJpYWJsZSB0byBiZSBzZXQuCis6OgorCitJRiAiJUFSQ0glIiA9PSAieDY0IiAoU0VUIEdFTkFSQ0g9IFdpbjY0KQorCitJRiBERUZJTkVEIEdFTkVSQVRPUiAoCisgIEVDSE8gW3dhcm4gXSB1c2luZyBleGlzdGluZyBlbnZpcm9ubWVudCB2YXJpYWJsZSBHRU5FUkFUT1IKKyAgRVhJVCAvQiAwCispCisKK0NBTEwgOkNIRUNLIDE2CitJRiAlRVJST1JMRVZFTCUgPT0gMCAoSUYgTk9UIERFRklORUQgR0VORVJBVE9SIFNFVCBHRU5FUkFUT1I9VmlzdWFsIFN0dWRpbyAxMCAyMDEwJUdFTkFSQ0glKQorQ0FMTCA6Q0hFQ0sgMTcKK0lGICVFUlJPUkxFVkVMJSA9PSAwIChJRiBOT1QgREVGSU5FRCBHRU5FUkFUT1IgU0VUIEdFTkVSQVRPUj1WaXN1YWwgU3R1ZGlvIDExIDIwMTIlR0VOQVJDSCUpCitDQUxMIDpDSEVDSyAxOAorSUYgJUVSUk9STEVWRUwlID09IDAgKElGIE5PVCBERUZJTkVEIEdFTkVSQVRPUiBTRVQgR0VORVJBVE9SPVZpc3VhbCBTdHVkaW8gMTIgMjAxMyVHRU5BUkNIJSkKK0NBTEwgOkNIRUNLIDE5LjAwCitJRiAlRVJST1JMRVZFTCUgPT0gMCAoSUYgTk9UIERFRklORUQgR0VORVJBVE9SIFNFVCBHRU5FUkFUT1I9VmlzdWFsIFN0dWRpbyAxNCAyMDE1JUdFTkFSQ0glKQorQ0FMTCA6Q0hFQ0sgMTkuMTAKK0lGICVFUlJPUkxFVkVMJSA9PSAwIChJRiBOT1QgREVGSU5FRCBHRU5FUkFUT1IgU0VUIEdFTkVSQVRPUj1WaXN1YWwgU3R1ZGlvIDE1IDIwMTclR0VOQVJDSCUpCisKK0lGIE5PVCBERUZJTkVEIEdFTkVSQVRPUiAoCisgIEVDSE8gW2Vycm9yXSB1bmFibGUgdG8gZGV0ZXJtaW5lIHRoZSBDTWFrZSBnZW5lcmF0b3IgdG8gdXNlCisgIEVYSVQgL0IgMQorKQorCitFQ0hPIFtpbmZvIF0gdXNpbmcgQ01ha2UgZ2VuZXJhdG9yICAgICAgICAlR0VORVJBVE9SJQorRVhJVCAvQiAwCisKKzpDSEVDSworY2wgLz8gMj4mMSB8IGZpbmRzdHIgL0M6IlZlcnNpb24gJTElLiIgPiBudWwKK0VYSVQgL0IgJUVSUk9STEVWRUwlCmRpZmYgLS1naXQgYS9idWlsZC93aW5jcHAvc2NyaXB0cy90cHZlcnNpb25zLmJhdCBiL2J1aWxkL3dpbmNwcC9zY3JpcHRzL3RwdmVyc2lvbnMuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MGM4NjgKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC93aW5jcHAvc2NyaXB0cy90cHZlcnNpb25zLmJhdApAQCAtMCwwICsxLDI0IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6IAorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjogCis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6IAorCis6OgorOjogU2V0IHRoZSB2ZXJzaW9ucyBvZiB0aGlyZCBwYXJ0eSBsaWJyYXJpZXMgdG8gdXNlLgorOjoKKworSUYgTk9UIERFRklORUQgVFBfQk9PU1RfVkVSU0lPTiAgICBTRVQgVFBfQk9PU1RfVkVSU0lPTj0xXzYyXzAKK0lGIE5PVCBERUZJTkVEIFRQX0xJQkVWRU5UX1ZFUlNJT04gU0VUIFRQX0xJQkVWRU5UX1ZFUlNJT049Mi4xLjdyYzIKK0lGIE5PVCBERUZJTkVEIFRQX09QRU5TU0xfVkVSU0lPTiAgU0VUIFRQX09QRU5TU0xfVkVSU0lPTj0xLjEuMGMKK0lGIE5PVCBERUZJTkVEIFRQX1pMSUJfVkVSU0lPTiAgICAgU0VUIFRQX1pMSUJfVkVSU0lPTj0xLjIuOQorCitFWElUIC9CIDAKZGlmZiAtLWdpdCBhL2J1aWxkL3dpbmNwcC90aGlyZHBhcnR5L3NyYy9idWlsZC1saWJldmVudC5iYXQgYi9idWlsZC93aW5jcHAvdGhpcmRwYXJ0eS9zcmMvYnVpbGQtbGliZXZlbnQuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZjUwNWMKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC93aW5jcHAvdGhpcmRwYXJ0eS9zcmMvYnVpbGQtbGliZXZlbnQuYmF0CkBAIC0wLDAgKzEsODYgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjogCis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OiAKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjogCisKKzo6Cis6OiBCdWlsZCBzY3JpcHQgZm9yIGxpYmV2ZW50IG9uIHdpbmRvd3MKKzo6IFVzZSBsaWJldmVudCBtYXN0ZXIgZnJvbSBnaXRodWIgd2hpY2ggaGFzIGNtYWtlIGludGVncmF0aW9uCis6OiBVc2VzIHRoZSBlbnZpcm9ubWVudCBzZXQgdXAgYnkgYSBWaXN1YWwgU3R1ZGlvIENvbW1hbmQgUHJvbXB0IHNob3J0Y3V0Cis6OiB0byB0YXJnZXQgYSBzcGVjaWZpYyBhcmNoaXRlY3R1cmUgYW5kIGNvbXBpbGVyCis6OgorOjogQ3JlYXRlcyBhIHN0YXRpYyBsaW5rIGxpYnJhcnkuCis6OiBMaW5rcyBhZ2FpbnN0IE9wZW5TU0wgYW5kIHpsaWIgc3RhdGljYWxseS4KKzo6CisKK0BFQ0hPIE9GRgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorCis6OiBTZXRzIHZhcmlhYmxlcyBmb3IgdGhpcmQgcGFydHkgdmVyc2lvbnMgdXNlZCBpbiBidWlsZAorQ0FMTCAuLlwuLlxzY3JpcHRzXHRwdmVyc2lvbnMuYmF0IHx8IEVYSVQgL0IKKworOjogdXNlICJidWlsZC1saWJldmVudC5iYXQgL3llcyIgdG8gc2tpcCB0aGUgcXVlc3Rpb24gcGFydAorSUYgL0kgIiUxIiA9PSAiL1lFUyIgICAgICAgICAgIFNFVCBOT0FTSz0xCisKKzo6IFNldCBDT01QSUxFUiB0byAodmMxMDAgLSB2YzE0MCkgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IGVudmlyb25tZW50CitDQUxMIC4uXC4uXHNjcmlwdHNcY2xfc2V0Y29tcGlsZXIuYmF0IHx8IEVYSVQgL0IKKworOjogU2V0IEFSQ0ggdG8gZWl0aGVyIHdpbjMyIG9yIHg2NCBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQKK0NBTEwgLi5cLi5cc2NyaXB0c1xjbF9zZXRhcmNoLmJhdCB8fCBFWElUIC9CCisKK0lGIE5PVCBERUZJTkVEIEdFTkVSQVRPUiAgICAgICBTRVQgR0VORVJBVE9SPU5NYWtlIE1ha2VmaWxlcworSUYgTk9UIERFRklORUQgUEFDS0FHRV9OQU1FICAgIFNFVCBQQUNLQUdFX05BTUU9bGliZXZlbnQKK0lGIE5PVCBERUZJTkVEIFBBQ0tBR0VfVkVSU0lPTiBTRVQgUEFDS0FHRV9WRVJTSU9OPSVUUF9MSUJFVkVOVF9WRVJTSU9OJQorSUYgTk9UIERFRklORUQgU09VUkNFRElSICAgICAgIFNFVCBTT1VSQ0VESVI9JX5kcDAlUEFDS0FHRV9OQU1FJS0lUEFDS0FHRV9WRVJTSU9OJQorSUYgTk9UIERFRklORUQgV0lOM1BfUk9PVCAgICAgIFNFVCBXSU4zUF9ST09UPSV+ZHAwLi4KKworRk9SICUlWCBJTiAoCisgIERlYnVnIAorICBSZWxlYXNlCispIERPICgKKyAgU0VUIEJVSUxEVFlQRT0lJVgKKyAgU0VUIEJVSUxERElSPSVXSU4zUF9ST09UJVxidWlsZFwlUEFDS0FHRV9OQU1FJVwlUEFDS0FHRV9WRVJTSU9OJVwlQ09NUElMRVIlXCVBUkNIJVwhQlVJTERUWVBFIQorICBTRVQgT1VURElSPSVXSU4zUF9ST09UJVxkaXN0XCVQQUNLQUdFX05BTUUlLSVQQUNLQUdFX1ZFUlNJT04lXCVDT01QSUxFUiVcJUFSQ0glXCFCVUlMRFRZUEUhCisKKyAgSUYgIiFCVUlMRFRZUEUhIiA9PSAiRGVidWciIChTRVQgWkxJQl9MSUJfU1VGRklYPWQpCisKKyAgU0VUIENNQUtFX0RFRlM9XgorICAgLURFVkVOVF9fRElTQUJMRV9TQU1QTEVTPU9OIF4KKyAgIC1ERVZFTlRfX0RJU0FCTEVfVEVTVFM9T04gXgorICAgLURPUEVOU1NMX1VTRV9TVEFUSUNfTElCUz1PRkYgXgorICAgLURPUEVOU1NMX1JPT1RfRElSPSVXSU4zUF9ST09UJVxkaXN0XG9wZW5zc2wtJVRQX09QRU5TU0xfVkVSU0lPTiVcJUNPTVBJTEVSJVwlQVJDSCVcIUJVSUxEVFlQRSFcZHluYW1pYyBeCisgICAtRFpMSUJfTElCUkFSWT0lV0lOM1BfUk9PVCVcZGlzdFx6bGliLSVUUF9aTElCX1ZFUlNJT04lXCVDT01QSUxFUiVcJUFSQ0glXGxpYlx6bGliIVpMSUJfTElCX1NVRkZJWCEubGliIF4KKyAgIC1EWkxJQl9ST09UPSVXSU4zUF9ST09UJVxkaXN0XHpsaWItJVRQX1pMSUJfVkVSU0lPTiVcJUNPTVBJTEVSJVwlQVJDSCUKKworICBFQ0hPLworICBFQ0hPID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRUNITyAgICAgICAgICBCdWlsZGluZzogJVBBQ0tBR0VfTkFNRSUgdiVQQUNLQUdFX1ZFUlNJT04lICVDT01QSUxFUiU6JUFSQ0glOiFCVUlMRFRZUEUhICIlR0VORVJBVE9SJSIKKyAgRUNITyBDTWFrZSBEZWZpbml0aW9uczogIUNNQUtFX0RFRlMhCisgIEVDSE8gICBCdWlsZCBEaXJlY3Rvcnk6ICFCVUlMRERJUiEKKyAgRUNITyBJbnN0YWxsIERpcmVjdG9yeTogIU9VVERJUiEKKyAgRUNITyAgU291cmNlIERpcmVjdG9yeTogJVNPVVJDRURJUiUKKyAgRUNITyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEVDSE8vCisKKyAgSUYgTk9UIERFRklORUQgTk9BU0sgKAorICAgIENIT0lDRSAvTSAiRG8geW91IHdhbnQgdG8gYnVpbGQgdGhpcyBjb25maWd1cmF0aW9uPyAiIC9jIFlOCisgICAgSUYgIUVSUk9STEVWRUwhIE5FUSAxIChFWElUIC9CICFFUlJPUkxFVkVMISkKKyAgKQorICAKKyAgTUtESVIgIiFCVUlMRERJUiEiCisgIENEICIhQlVJTERESVIhIiB8fCBFWElUIC9CCisKKyAgQ01BS0UuRVhFIC1HIiVHRU5FUkFUT1IlIiAtRENNQUtFX0lOU1RBTExfUFJFRklYPSFPVVRESVIhIC1EQ01BS0VfQlVJTERfVFlQRT0hQlVJTERUWVBFISAhQ01BS0VfREVGUyEgIiVTT1VSQ0VESVIlIiB8fCBFWElUIC9CCisgIE5NQUtFIC9mTWFrZWZpbGUgaW5zdGFsbCB8fCBFWElUIC9CCispCisKK0VORExPQ0FMCmRpZmYgLS1naXQgYS9idWlsZC93aW5jcHAvdGhpcmRwYXJ0eS9zcmMvYnVpbGQtb3BlbnNzbC5iYXQgYi9idWlsZC93aW5jcHAvdGhpcmRwYXJ0eS9zcmMvYnVpbGQtb3BlbnNzbC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YyNzBmMAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL3dpbmNwcC90aGlyZHBhcnR5L3NyYy9idWlsZC1vcGVuc3NsLmJhdApAQCAtMCwwICsxLDEwNiBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OiAKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6IAorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OiAKKworOjoKKzo6IEJ1aWxkIHNjcmlwdCBmb3Igb3BlbnNzbCBvbiB3aW5kb3dzCis6OiBvcGVuc3NsIHVzZXMgYW4gaW4tdHJlZSBidWlsZCBzbyB5b3UgaGF2ZSB0byBjbGVhbiBiZXR3ZWVuIGVhY2ggb25lCis6OgorOjogVXNlcyB0aGUgZW52aXJvbm1lbnQgc2V0IHVwIGJ5IGEgVmlzdWFsIFN0dWRpbyBDb21tYW5kIFByb21wdCBzaG9ydGN1dAorOjogdG8gdGFyZ2V0IGEgc3BlY2lmaWMgYXJjaGl0ZWN0dXJlIGFuZCBjb21waWxlcgorOjoKKzo6IElmIHlvdSB1c2UgTGF2YXNvZnQgQWQtQXdhcmUsIGRpc2FibGUgaXQgZm9yIHRoaXMgYnVpbGQuICBJdCBibG9ja3MgdGhlIGNyZWF0aW9uCis6OiBvZiBhbnkgZmlsZSBuYW1lZCAiY2xpZW50aGVsbG90ZXN0LmV4ZSIgZm9yIHdoYXRldmVyIHJlYXNvbiwgd2hpY2ggYnJlYWtzIHRoZSBidWlsZC4KKzo6CisKK0BFQ0hPIE9GRgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorCis6OiBTZXRzIHZhcmlhYmxlcyBmb3IgdGhpcmQgcGFydHkgdmVyc2lvbnMgdXNlZCBpbiBidWlsZAorQ0FMTCAuLlwuLlxzY3JpcHRzXHRwdmVyc2lvbnMuYmF0IHx8IEVYSVQgL0IKKworOjogdXNlICJidWlsZC1vcGVuc3NsLmJhdCAveWVzIiB0byBza2lwIHRoZSBxdWVzdGlvbiBwYXJ0CitJRiAvSSAiJTEiID09ICIvWUVTIiAgICAgICAgICAgU0VUIE5PQVNLPTEKKworSUYgTk9UIERFRklORUQgUEFDS0FHRV9OQU1FICAgIFNFVCBQQUNLQUdFX05BTUU9b3BlbnNzbAorSUYgTk9UIERFRklORUQgUEFDS0FHRV9WRVJTSU9OIFNFVCBQQUNLQUdFX1ZFUlNJT049JVRQX09QRU5TU0xfVkVSU0lPTiUKK0lGIE5PVCBERUZJTkVEIFNPVVJDRURJUiAgICAgICBTRVQgU09VUkNFRElSPSV+ZHAwJVBBQ0tBR0VfTkFNRSUtJVBBQ0tBR0VfVkVSU0lPTiUKK0lGIE5PVCBERUZJTkVEIFdJTjNQX1JPT1QgICAgICBTRVQgV0lOM1BfUk9PVD0lfmRwMC4uCisKKzo6IFNldCBDT01QSUxFUiB0byAodmMxMDAgLSB2YzE0MCkgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IGVudmlyb25tZW50CitDQUxMIC4uXC4uXHNjcmlwdHNcY2xfc2V0Y29tcGlsZXIuYmF0IHx8IEVYSVQgL0IKKworOjogU2V0IEFSQ0ggdG8gZWl0aGVyIHdpbjMyIG9yIHg2NCBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQKK0NBTEwgLi5cLi5cc2NyaXB0c1xjbF9zZXRhcmNoLmJhdCB8fCBFWElUIC9CCisKK0lGICIlQVJDSCUiID09ICJ4NjQiICgKKyAgU0VUIFRPRE89ZGVidWctVkMtV0lONjRBIFZDLVdJTjY0QQorKSBFTFNFICgKKyAgU0VUIFRPRE89ZGVidWctVkMtV0lOMzIgVkMtV0lOMzIKKykKKworRk9SICUlWCBJTiAoICFUT0RPISApIERPICgKKyAgU0VUIEJVSUxEVFlQRT0lJVgKKyAgRk9SICUlWSBJTiAoCisgICAgbnQKKyAgICBudGRsbAorICApIERPICgKKyAgICBTRVQgTElCVFlQRT0lJVkKKworICAgIElGICIhQlVJTERUWVBFOn4wLDYhIiA9PSAiZGVidWctIiAoCisgICAgICBTRVQgT1VUQlVJTERUWVBFPWRlYnVnCisgICAgICBTRVQgWkxJQkxJQlNVRkZJWD1kCisgICAgKSBFTFNFICgKKyAgICAgIFNFVCBPVVRCVUlMRFRZUEU9cmVsZWFzZQorICAgICAgU0VUIFpMSUJMSUJTVUZGSVg9CisgICAgKQorCisgICAgSUYgIiFMSUJUWVBFISIgPT0gIm50ZGxsIiAoCisgICAgICBTRVQgQlVJTERfT1BUSU9OUz1zaGFyZWQKKyAgICAgIFNFVCBPVVRMSUJUWVBFPWR5bmFtaWMKKyAgICAgIFNFVCBaTElCTElCPXpsaWIhWkxJQkxJQlNVRkZJWCEKKyAgICAgIFNFVCBaTElCT1BUPXpsaWItZHluYW1pYworICAgICkgRUxTRSAoCisgICAgICBTRVQgQlVJTERfT1BUSU9OUz1uby1zaGFyZWQKKyAgICAgIFNFVCBPVVRMSUJUWVBFPXN0YXRpYworICAgICAgU0VUIFpMSUJMSUI9emxpYnN0YXRpYyFaTElCTElCU1VGRklYIS5saWIKKyAgICAgIFNFVCBaTElCT1BUPXpsaWIKKyAgICApCisKKyAgICBTRVQgTElCPSV+ZHAwLi5cZGlzdFx6bGliLSVUUF9aTElCX1ZFUlNJT04lXCFDT01QSUxFUiFcIUFSQ0ghXGxpYjshTElCIQorICAgIFNFVCBCVUlMRF9PUFRJT05TPSFCVUlMRF9PUFRJT05TISBuby1hc20gbm8tdW5pdC10ZXN0ICFaTElCT1BUISAtLW9wZW5zc2xkaXI9c3NsIC0td2l0aC16bGliLWluY2x1ZGU9JX5kcDAuLlxkaXN0XHpsaWItJVRQX1pMSUJfVkVSU0lPTiVcIUNPTVBJTEVSIVwhQVJDSCFcaW5jbHVkZSAtLXdpdGgtemxpYi1saWI9IVpMSUJMSUIhCisgICAgU0VUIE9VVERJUj0lV0lOM1BfUk9PVCVcZGlzdFwlUEFDS0FHRV9OQU1FJS0lUEFDS0FHRV9WRVJTSU9OJVwlQ09NUElMRVIlXCVBUkNIJVwhT1VUQlVJTERUWVBFIVwhT1VUTElCVFlQRSEKKworICAgIEVDSE8vCisgICAgRUNITyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRUNITyAgICAgICAgICBCdWlsZGluZzogJVBBQ0tBR0VfTkFNRSUgJVBBQ0tBR0VfVkVSU0lPTiUgJUNPTVBJTEVSJTolQVJDSCU6IU9VVEJVSUxEVFlQRSE6IU9VVExJQlRZUEUhIFshQlVJTERUWVBFIV0KKyAgICBFQ0hPIENvbmZpZ3VyZSBPcHRpb25zOiAhQlVJTERfT1BUSU9OUyEKKyAgICBFQ0hPIEluc3RhbGwgRGlyZWN0b3J5OiAhT1VURElSIQorICAgIEVDSE8gIFNvdXJjZSBEaXJlY3Rvcnk6ICVTT1VSQ0VESVIlCisgICAgRUNITyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRUNITy8KKworICAgIElGIE5PVCBERUZJTkVEIE5PQVNLICgKKyAgICAgIENIT0lDRSAvTSAiRG8geW91IHdhbnQgdG8gYnVpbGQgdGhpcyBjb25maWd1cmF0aW9uPyAiIC9jIFlOCisgICAgICBJRiAhRVJST1JMRVZFTCEgTkVRIDEgKEVYSVQgL0IgIUVSUk9STEVWRUwhKQorICAgICkKKworICAgIENEICVTT1VSQ0VESVIlIHx8IEVYSVQgL0IKKyAgICBwZXJsIENvbmZpZ3VyZSAhQlVJTERUWVBFISAtLXByZWZpeD0iIU9VVERJUiEiICFCVUlMRF9PUFRJT05TISB8fCBFWElUIC9CCisgICAgTk1BS0UgL0ZNYWtlZmlsZSBpbnN0YWxsX3N3IHx8IEVYSVQgL0IKKyAgICBOTUFLRSAvRk1ha2VmaWxlIGNsZWFuIHx8IEVYSVQgL0IKKyAgKQorKQorCitFTkRMT0NBTAorRVhJVCAvQgpkaWZmIC0tZ2l0IGEvYnVpbGQvd2luY3BwL3RoaXJkcGFydHkvc3JjL2J1aWxkLXpsaWIuYmF0IGIvYnVpbGQvd2luY3BwL3RoaXJkcGFydHkvc3JjL2J1aWxkLXpsaWIuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MjcyMzAKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC93aW5jcHAvdGhpcmRwYXJ0eS9zcmMvYnVpbGQtemxpYi5iYXQKQEAgLTAsMCArMSw3NSBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OiAKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6IAorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OiAKKworOjoKKzo6IEJ1aWxkIHNjcmlwdCBmb3IgemxpYiBvbiB3aW5kb3dzLgorOjogVXNlcyB0aGUgZW52aXJvbm1lbnQgc2V0IHVwIGJ5IGEgVmlzdWFsIFN0dWRpbyBDb21tYW5kIFByb21wdCBzaG9ydGN1dAorOjogdG8gdGFyZ2V0IGEgc3BlY2lmaWMgYXJjaGl0ZWN0dXJlIGFuZCBjb21waWxlci4KKzo6CisKK0BFQ0hPIE9GRgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorCis6OiBTZXRzIHZhcmlhYmxlcyBmb3IgdGhpcmQgcGFydHkgdmVyc2lvbnMgdXNlZCBpbiBidWlsZAorQ0FMTCAuLlwuLlxzY3JpcHRzXHRwdmVyc2lvbnMuYmF0IHx8IEVYSVQgL0IKKworOjogdXNlICJidWlsZC16bGliLmJhdCAveWVzIiB0byBza2lwIHRoZSBxdWVzdGlvbiBwYXJ0CitJRiAvSSAiJTEiID09ICIvWUVTIiAgICAgICAgICAgU0VUIE5PQVNLPTEKKworSUYgTk9UIERFRklORUQgR0VORVJBVE9SICAgICAgIFNFVCBHRU5FUkFUT1I9Tk1ha2UgTWFrZWZpbGVzCitJRiBOT1QgREVGSU5FRCBQQUNLQUdFX05BTUUgICAgU0VUIFBBQ0tBR0VfTkFNRT16bGliCitJRiBOT1QgREVGSU5FRCBQQUNLQUdFX1ZFUlNJT04gU0VUIFBBQ0tBR0VfVkVSU0lPTj0lVFBfWkxJQl9WRVJTSU9OJQorSUYgTk9UIERFRklORUQgU09VUkNFX0RJUiAgICAgIFNFVCBTT1VSQ0VESVI9JX5kcDAlUEFDS0FHRV9OQU1FJS0lUEFDS0FHRV9WRVJTSU9OJQorSUYgTk9UIERFRklORUQgV0lOM1BfUk9PVCAgICAgIFNFVCBXSU4zUF9ST09UPSV+ZHAwLi4KKworOjogU2V0IENPTVBJTEVSIHRvICh2YzEwMCAtIHZjMTQwKSBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQKK0NBTEwgLi5cLi5cc2NyaXB0c1xjbF9zZXRjb21waWxlci5iYXQgfHwgRVhJVCAvQgorCis6OiBTZXQgQVJDSCB0byBlaXRoZXIgd2luMzIgb3IgeDY0IGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudAorQ0FMTCAuLlwuLlxzY3JpcHRzXGNsX3NldGFyY2guYmF0IHx8IEVYSVQgL0IKKworRk9SICUlWCBJTiAoCisgIERlYnVnIAorICBSZWxlYXNlCispIERPICgKKyAgU0VUIEJVSUxEVFlQRT0lJVgKKyAgU0VUIEJVSUxERElSPSVXSU4zUF9ST09UJVxidWlsZFwlUEFDS0FHRV9OQU1FJVwlUEFDS0FHRV9WRVJTSU9OJVwlQ09NUElMRVIlXCVBUkNIJVwhQlVJTERUWVBFIQorICBTRVQgT1VURElSPSVXSU4zUF9ST09UJVxkaXN0XCVQQUNLQUdFX05BTUUlLSVQQUNLQUdFX1ZFUlNJT04lXCVDT01QSUxFUiVcJUFSQ0glCisKKyAgRUNITy8KKyAgRUNITyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEVDSE8gICAgICAgICAgQnVpbGRpbmc6ICVQQUNLQUdFX05BTUUlIHYlUEFDS0FHRV9WRVJTSU9OJSAlQ09NUElMRVIlOiVBUkNIJTohQlVJTERUWVBFISAiJUdFTkVSQVRPUiUiCisgIEVDSE8gICBCdWlsZCBEaXJlY3Rvcnk6ICFCVUlMRERJUiEKKyAgRUNITyBJbnN0YWxsIERpcmVjdG9yeTogIU9VVERJUiEKKyAgRUNITyAgU291cmNlIERpcmVjdG9yeTogJVNPVVJDRURJUiUKKyAgRUNITyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEVDSE8vCisKKyAgSUYgTk9UIERFRklORUQgTk9BU0sgKAorICAgIENIT0lDRSAvTSAiRG8geW91IHdhbnQgdG8gYnVpbGQgdGhpcyBjb25maWd1cmF0aW9uPyAiIC9jIFlOCisgICAgSUYgIUVSUk9STEVWRUwhIE5FUSAxIChFWElUIC9CICFFUlJPUkxFVkVMISkKKyAgKQorCisgIE1LRElSICIhQlVJTERESVIhIgorICBDRCAiIUJVSUxERElSISIgfHwgRVhJVCAvQgorCisgIENNQUtFLkVYRSAtRyIlR0VORVJBVE9SJSIgLURDTUFLRV9JTlNUQUxMX1BSRUZJWD0hT1VURElSISAtRENNQUtFX0JVSUxEX1RZUEU9IUJVSUxEVFlQRSEgIiVTT1VSQ0VESVIlIiB8fCBFWElUIC9CCisgIE5NQUtFIC9mTWFrZWZpbGUgaW5zdGFsbCB8fCBFWElUIC9CCisKKyAgSUYgIiFCVUlMRFRZUEUhIiA9PSAiRGVidWciICgKKyAgICBDT1BZICIhQlVJTERESVIhXHpsaWJkLnBkYiIgIiFPVVRESVIhXGJpblwiIHx8IEVYSVQgL0IKKyAgKQorKQorCitFTkRMT0NBTApkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL0NNYWtlTGlzdHMudHh0IGIvY29tcGlsZXIvY3BwL0NNYWtlTGlzdHMudHh0CmluZGV4IGJjNjU5MWMuLjBkZjc5MGUgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL2NwcC9DTWFrZUxpc3RzLnR4dAorKysgYi9jb21waWxlci9jcHAvQ01ha2VMaXN0cy50eHQKQEAgLTE2LDgyICsxNiw2NCBAQAogIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIworY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDIuOC4xMikKIAotIyBXaW5kb3dzIGhhcyBhIGRpZmZlcmVudCBoZWFkZXIKK2NvbmZpZ3VyZV9maWxlKCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9zcmMvdGhyaWZ0L3ZlcnNpb24uaC5pbiAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0L3ZlcnNpb24uaCkKIGlmKE1TVkMpCi0gICAgY29uZmlndXJlX2ZpbGUoJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3NyYy93aW5kb3dzL3ZlcnNpb24uaC5pbiAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdmVyc2lvbi5oKQotZWxzZSgpCi0gICAgY29uZmlndXJlX2ZpbGUoJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3ZlcnNpb24uaC5pbiAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdmVyc2lvbi5oKQorICAgICMgVGhlIHdpbmZsZXhiaXNvbiBnZW5lcmF0b3Igb3V0cHV0cyBzb21lIG1hY3JvcyB0aGF0IGNvbmZsaWN0IHdpdGggdGhlIFZpc3VhbCBTdHVkaW8gMjAxMCBjb3B5IG9mIHN0ZGludC5oCisgICAgIyBUaGlzIG1pZ2h0IGJlIGZpeGVkIGluIGxhdGVyIHZlcnNpb25zIG9mIFZpc3VhbCBTdHVkaW8sIGJ1dCBhbiBlYXN5IHNvbHV0aW9uIGlzIHRvIGluY2x1ZGUgc3RkaW50LmggZmlyc3QKKyAgICBpZihIQVZFX1NURElOVF9IKQorICAgICAgICBhZGRfZGVmaW5pdGlvbnMoLURfX1NURENfRk9STUFUX01BQ1JPUykKKyAgICAgICAgYWRkX2RlZmluaXRpb25zKC1EX19TVERDX0xJTUlUX01BQ1JPUykKKyAgICAgICAgYWRkX2RlZmluaXRpb25zKC9GSSJzdGRpbnQuaCIpCisgICAgZW5kaWYoSEFWRV9TVERJTlRfSCkKIGVuZGlmKCkKIAogZmluZF9wYWNrYWdlKEZMRVggUkVRVUlSRUQpCiBmaW5kX3BhY2thZ2UoQklTT04gUkVRVUlSRUQpCiAKKyMgY3JlYXRlIGRpcmVjdG9yeSBmb3IgdGhyaWZ0eSBhbmQgdGhyaWZ0bAorZmlsZShNQUtFX0RJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0LykKKwogIyBDcmVhdGUgZmxleCBhbmQgYmlzb24gZmlsZXMgYW5kIGJ1aWxkIHRoZSBsaWIgcGFyc2Ugc3RhdGljIGxpYnJhcnkKLUJJU09OX1RBUkdFVCh0aHJpZnR5ICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9zcmMvdGhyaWZ0eS55eSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0eS5jYykKLUZMRVhfVEFSR0VUKHRocmlmdGwgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3NyYy90aHJpZnRsLmxsICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnRsLmNjKQorQklTT05fVEFSR0VUKHRocmlmdHkgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3NyYy90aHJpZnQvdGhyaWZ0eS55eSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0L3RocmlmdHkuY2MpCitGTEVYX1RBUkdFVCh0aHJpZnRsICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9zcmMvdGhyaWZ0L3RocmlmdGwubGwgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC90aHJpZnRsLmNjKQogQUREX0ZMRVhfQklTT05fREVQRU5ERU5DWSh0aHJpZnRsIHRocmlmdHkpCiAKLSMgSEFDSzogV29yayBhcm91bmQgdGhlIGZhY3QgdGhhdCBiaXNvbiBjcmF0ZXMgYSAuaGggZmlsZSBidXQgd2UgbmVlZCBhIC5oIGZpbGUKLWFkZF9jdXN0b21fY29tbWFuZChPVVRQVVQgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdHkuaAotICAgICAgICAgICAgICAgICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBjb3B5ICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnR5LmhoICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnR5LmgKLSAgICAgICAgICAgICAgICAgICBERVBFTkRTICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnR5LmhoCi0gICAgICAgICAgICAgICAgICAgKQotCi1zZXQobGlicGFyc2VfU09VUkNFUwotICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnR5LmNjCi0gICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdGwuY2MKLSAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0eS5oCitzZXQocGFyc2VfU09VUkNFUworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvdGhyaWZ0eS5jYworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvdGhyaWZ0bC5jYworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvdGhyaWZ0eS5oaAogKQogCi1hZGRfbGlicmFyeShsaWJwYXJzZSBTVEFUSUMgJHtsaWJwYXJzZV9TT1VSQ0VTfSkKK2FkZF9saWJyYXJ5KHBhcnNlIFNUQVRJQyAke3BhcnNlX1NPVVJDRVN9KQogCiAjIENyZWF0ZSB0aGUgdGhyaWZ0IGNvbXBpbGVyCi1zZXQoIHRocmlmdF9TT1VSQ0VTIAotICAgIHNyYy9tYWluLmNjCi0gICAgc3JjL21kNS5jCi0gICAgc3JjL2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmNjCi0gICAgc3JjL2dlbmVyYXRlL3RfZ2VuZXJhdG9yX3JlZ2lzdHJ5LmgKLSAgICBzcmMvZ2xvYmFscy5oCi0gICAgc3JjL21haW4uaAotICAgIHNyYy9wbGF0Zm9ybS5oCi0gICAgc3JjL21kNS5oCi0gICAgc3JjL2F1ZGl0L3RfYXVkaXQuY3BwCi0gICAgc3JjL3BhcnNlL3RfZG9jLmgKLSAgICBzcmMvcGFyc2UvdF90eXBlLmgKLSAgICBzcmMvcGFyc2UvdF9iYXNlX3R5cGUuaAotICAgIHNyYy9wYXJzZS90X2VudW0uaAotICAgIHNyYy9wYXJzZS90X2VudW1fdmFsdWUuaAotICAgIHNyYy9wYXJzZS90X3R5cGVkZWYuaAotICAgIHNyYy9wYXJzZS90X3R5cGVkZWYuY2MKLSAgICBzcmMvcGFyc2UvdF9jb250YWluZXIuaAotICAgIHNyYy9wYXJzZS90X2xpc3QuaAotICAgIHNyYy9wYXJzZS90X3NldC5oCi0gICAgc3JjL3BhcnNlL3RfbWFwLmgKLSAgICBzcmMvcGFyc2UvdF9zdHJ1Y3QuaAotICAgIHNyYy9wYXJzZS90X2ZpZWxkLmgKLSAgICBzcmMvcGFyc2UvdF9zZXJ2aWNlLmgKLSAgICBzcmMvcGFyc2UvdF9mdW5jdGlvbi5oCi0gICAgc3JjL3BhcnNlL3RfcHJvZ3JhbS5oCi0gICAgc3JjL3BhcnNlL3Rfc2NvcGUuaAotICAgIHNyYy9wYXJzZS90X2NvbnN0LmgKLSAgICBzcmMvcGFyc2UvdF9jb25zdF92YWx1ZS5oCi0gICAgc3JjL3BhcnNlL3BhcnNlLmNjCi0gICAgc3JjL2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmgKLSAgICBzcmMvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgKLSAgICBzcmMvZ2VuZXJhdGUvdF9odG1sX2dlbmVyYXRvci5oCi0gICAgc3JjL3dpbmRvd3MvY29uZmlnLmgKLSAgICB2ZXJzaW9uLmgKK3NldChjb21waWxlcl9jb3JlCisgICAgc3JjL3RocmlmdC9jb21tb24uY2MKKyAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmNjCisgICAgc3JjL3RocmlmdC9wYXJzZS90X3R5cGVkZWYuY2MKKyAgICBzcmMvdGhyaWZ0L3BhcnNlL3BhcnNlLmNjCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC92ZXJzaW9uLmgKKykKKworc2V0KHRocmlmdC1jb21waWxlcl9TT1VSQ0VTCisgICAgc3JjL3RocmlmdC9tYWluLmNjCisgICAgc3JjL3RocmlmdC9hdWRpdC90X2F1ZGl0LmNwcAorKQorCitzZXQodGhyaWZ0X2NvbXBpbGVyX0xBTkdTCiApCiAKICMgVGhpcyBtYWNybyBhZGRzIGFuIG9wdGlvbiBUSFJJRlRfQ09NUElMRVJfJHtOQU1FfQogIyB0aGF0IGFsbG93cyBlbmFibGluZyBvciBkaXNhYmxpbmcgY2VydGFpbiBsYW5ndWFnZXMKIG1hY3JvKFRIUklGVF9BRERfQ09NUElMRVIgbmFtZSBkZXNjcmlwdGlvbiBpbml0aWFsKQogICAgIHN0cmluZyhUT1VQUEVSICJUSFJJRlRfQ09NUElMRVJfJHtuYW1lfSIgZW5hYmxlcikKLSAgICBzZXQoc3JjICJzcmMvZ2VuZXJhdGUvdF8ke25hbWV9X2dlbmVyYXRvci5jYyIpCisgICAgc2V0KHNyYyAic3JjL3RocmlmdC9nZW5lcmF0ZS90XyR7bmFtZX1fZ2VuZXJhdG9yLmNjIikKICAgICBvcHRpb24oJHtlbmFibGVyfSAke2Rlc2NyaXB0aW9ufSAke2luaXRpYWx9KQogICAgIGlmKCR7ZW5hYmxlcn0pCi0gICAgICAgIGxpc3QoQVBQRU5EIHRocmlmdF9TT1VSQ0VTICR7c3JjfSkKKyAgICAgICAgbGlzdChBUFBFTkQgdGhyaWZ0LWNvbXBpbGVyX1NPVVJDRVMgJHtzcmN9KQorICAgICAgICBsaXN0KEFQUEVORCB0aHJpZnRfY29tcGlsZXJfTEFOR1MgJHtuYW1lfSkKICAgICBlbmRpZigpCiBlbmRtYWNybygpCiAKQEAgLTEwMCwxNCArODIsMTcgQEAKIFRIUklGVF9BRERfQ09NUElMRVIoY3BwICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBDKysiIE9OKQogVEhSSUZUX0FERF9DT01QSUxFUihqYXZhICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEphdmEiICAgT04pCiBUSFJJRlRfQUREX0NPTVBJTEVSKGFzMyAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgQWN0aW9uU2NyaXB0IDMiIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihkYXJ0ICAgICJFbmFibGUgY29tcGlsZXIgZm9yIERhcnQiIE9OKQogVEhSSUZUX0FERF9DT01QSUxFUihoYXhlICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEhheGUiIE9OKQogVEhSSUZUX0FERF9DT01QSUxFUihjc2hhcnAgICJFbmFibGUgY29tcGlsZXIgZm9yIEMjIiBPTikKK1RIUklGVF9BRERfQ09NUElMRVIobmV0Y29yZSAiRW5hYmxlIGNvbXBpbGVyIGZvciAuTkVUIENvcmUiIE9OKQogVEhSSUZUX0FERF9DT01QSUxFUihweSAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIFB5dGhvbiAyLjAiIE9OKQogVEhSSUZUX0FERF9DT01QSUxFUihyYiAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIFJ1YnkiIE9OKQogVEhSSUZUX0FERF9DT01QSUxFUihwZXJsICAgICJFbmFibGUgY29tcGlsZXIgZm9yIFBlcmwiIE9OKQogVEhSSUZUX0FERF9DT01QSUxFUihwaHAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIFBIUCIgT04pCiBUSFJJRlRfQUREX0NPTVBJTEVSKGVybCAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgRXJsYW5nIiBPTikKIFRIUklGVF9BRERfQ09NUElMRVIoY29jb2EgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBDb2NvYSBPYmplY3RpdmUtQyIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKHN3aWZ0ICAgIkVuYWJsZSBjb21waWxlciBmb3IgQ29jb2EgU3dpZnQiIE9OKQogVEhSSUZUX0FERF9DT01QSUxFUihzdCAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIFNtYWxsdGFsayIgT04pCiBUSFJJRlRfQUREX0NPTVBJTEVSKG9jYW1sICAgIkVuYWJsZSBjb21waWxlciBmb3IgT0NhbWwiIE9OKQogVEhSSUZUX0FERF9DT01QSUxFUihocyAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEhhc2tlbGwiIE9OKQpAQCAtMTIwLDE0ICsxMDUsMTE3IEBACiBUSFJJRlRfQUREX0NPTVBJTEVSKGdvICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgR28iIE9OKQogVEhSSUZUX0FERF9DT01QSUxFUihkICAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEQiIE9OKQogVEhSSUZUX0FERF9DT01QSUxFUihsdWEgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEx1YSIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKGd2ICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgR3JhcGhWaXoiIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihycyAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIFJ1c3QiIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUih4bWwgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIFhNTCIgT04pCiAKICMgVGhyaWZ0IGlzIGxvb2tpbmcgZm9yIGluY2x1ZGUgZmlsZXMgaW4gdGhlIHNyYyBkaXJlY3RvcnkKICMgd2UgYWxzbyBhZGQgdGhlIGN1cnJlbnQgYmluYXJ5IGRpcmVjdG9yeSBmb3IgZ2VuZXJhdGVkIGZpbGVzCiBpbmNsdWRlX2RpcmVjdG9yaWVzKCR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfSBzcmMpCiAKLWFkZF9leGVjdXRhYmxlKHRocmlmdC1jb21waWxlciAke3RocmlmdF9TT1VSQ0VTfSkKK2lmKE5PVCBERUZJTkVEIFdJVEhfUExVR0lOIE9SIE5PVCAke1dJVEhfUExVR0lOfSkKKyAgICBsaXN0KEFQUEVORCB0aHJpZnQtY29tcGlsZXJfU09VUkNFUyAke2NvbXBpbGVyX2NvcmV9KQorZW5kaWYoKQorCithZGRfZXhlY3V0YWJsZSh0aHJpZnQtY29tcGlsZXIgJHt0aHJpZnQtY29tcGlsZXJfU09VUkNFU30pCisKK2lmKCR7V0lUSF9QTFVHSU59KQorICAgIGFkZF9leGVjdXRhYmxlKHRocmlmdC1ib290c3RyYXAgJHtjb21waWxlcl9jb3JlfQorICAgICAgICBzcmMvdGhyaWZ0L21haW4uY2MKKyAgICAgICAgc3JjL3RocmlmdC9hdWRpdC90X2F1ZGl0LmNwcAorICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY3BwX2dlbmVyYXRvci5jYworICAgICkKKyAgICB0YXJnZXRfbGlua19saWJyYXJpZXModGhyaWZ0LWJvb3RzdHJhcCBwYXJzZSkKKworICAgIHNldChQTFVHSU5fR0VOX1NPVVJDRVMKKyAgICAgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC9wbHVnaW4vcGx1Z2luX3R5cGVzLmgKKyAgICAgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC9wbHVnaW4vcGx1Z2luX3R5cGVzLmNwcAorICAgICAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0L3BsdWdpbi9wbHVnaW5fY29uc3RhbnRzLmgKKyAgICAgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC9wbHVnaW4vcGx1Z2luX2NvbnN0YW50cy5jcHAKKyAgICApCisKKyAgICBmaWxlKE1BS0VfRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvcGx1Z2luKQorICAgIGFkZF9jdXN0b21fY29tbWFuZChPVVRQVVQgJHtQTFVHSU5fR0VOX1NPVVJDRVN9CisgICAgICAgIERFUEVORFMgdGhyaWZ0LWJvb3RzdHJhcCBzcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW4udGhyaWZ0CisgICAgICAgIENPTU1BTkQgdGhyaWZ0LWJvb3RzdHJhcCAtZ2VuIGNwcAorICAgICAgICAtb3V0ICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvcGx1Z2luCisgICAgICAgICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9zcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW4udGhyaWZ0CisgICAgKQorCisgICAgaW5jbHVkZV9kaXJlY3RvcmllcyguLi8uLi9saWIvY3BwL3NyYykKKworICAgIGluY2x1ZGUoVGhyaWZ0TWFjcm9zKQorICAgIEFERF9MSUJSQVJZX1RIUklGVCh0aHJpZnRjCisgICAgICAgICR7Y29tcGlsZXJfY29yZX0KKyAgICAgICAgJHtQTFVHSU5fR0VOX1NPVVJDRVN9CisgICAgICAgIHNyYy90aHJpZnQvbG9nZ2luZy5jYworICAgICAgICBzcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW5fb3V0cHV0LmNjCisgICAgICAgIHNyYy90aHJpZnQvcGx1Z2luL3BsdWdpbi5jYworICAgICkKKyAgICBUQVJHRVRfSU5DTFVERV9ESVJFQ1RPUklFU19USFJJRlQodGhyaWZ0YyBQVUJMSUMgJHtCb29zdF9JTkNMVURFX0RJUlN9KQorICAgIFRBUkdFVF9MSU5LX0xJQlJBUklFU19USFJJRlRfQUdBSU5TVF9USFJJRlRfTElCUkFSWSh0aHJpZnRjIHRocmlmdCBQVUJMSUMpCisgICAgdGFyZ2V0X2NvbXBpbGVfZGVmaW5pdGlvbnModGhyaWZ0LWNvbXBpbGVyIFBVQkxJQyBUSFJJRlRfRU5BQkxFX1BMVUdJTikKKyAgICBMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkodGhyaWZ0LWNvbXBpbGVyIHRocmlmdGMpCitlbmRpZigpCisKK3NldF90YXJnZXRfcHJvcGVydGllcyh0aHJpZnQtY29tcGlsZXIgUFJPUEVSVElFUyBSVU5USU1FX09VVFBVVF9ESVJFQ1RPUlkgYmluLykKIHNldF90YXJnZXRfcHJvcGVydGllcyh0aHJpZnQtY29tcGlsZXIgUFJPUEVSVElFUyBPVVRQVVRfTkFNRSB0aHJpZnQpCiAKLXRhcmdldF9saW5rX2xpYnJhcmllcyh0aHJpZnQtY29tcGlsZXIgbGlicGFyc2UpCit0YXJnZXRfbGlua19saWJyYXJpZXModGhyaWZ0LWNvbXBpbGVyIHBhcnNlKQogCi1pbnN0YWxsKFRBUkdFVFMgdGhyaWZ0LWNvbXBpbGVyIERFU1RJTkFUSU9OICIke0JJTl9JTlNUQUxMX0RJUn0iKQoraW5zdGFsbChUQVJHRVRTIHRocmlmdC1jb21waWxlciBERVNUSU5BVElPTiBiaW4pCisKK2lmKCR7V0lUSF9QTFVHSU59KQorICAjIEluc3RhbGwgdGhlIGhlYWRlcnMKKyAgaW5zdGFsbChGSUxFUworICAgICAgInNyYy90aHJpZnQvY29tbW9uLmgiCisgICAgICAic3JjL3RocmlmdC9nbG9iYWxzLmgiCisgICAgICAic3JjL3RocmlmdC9sb2dnaW5nLmgiCisgICAgICAic3JjL3RocmlmdC9tYWluLmgiCisgICAgICAic3JjL3RocmlmdC9wbGF0Zm9ybS5oIgorICAgICAgIiR7Q01BS0VfQklOQVJZX0RJUn0vY29tcGlsZXIvY3BwL3RocmlmdC92ZXJzaW9uLmgiCisgICAgICBERVNUSU5BVElPTiAiJHtJTkNMVURFX0lOU1RBTExfRElSfS90aHJpZnQiKQorICBpbnN0YWxsKEZJTEVTCisgICAgICAic3JjL3RocmlmdC9hdWRpdC90X2F1ZGl0LmgiCisgICAgICBERVNUSU5BVElPTiAiJHtJTkNMVURFX0lOU1RBTExfRElSfS90aHJpZnQvYXVkaXQiKQorICBpbnN0YWxsKEZJTEVTCisgICAgICAic3JjL3RocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5oIgorICAgICAgInNyYy90aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3JfcmVnaXN0cnkuaCIKKyAgICAgICJzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfaHRtbF9nZW5lcmF0b3IuaCIKKyAgICAgICJzcmMvdGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgorICAgICAgREVTVElOQVRJT04gIiR7SU5DTFVERV9JTlNUQUxMX0RJUn0vdGhyaWZ0L2dlbmVyYXRlIikKKyAgaW5zdGFsbChGSUxFUworICAgICAgInNyYy90aHJpZnQvcGFyc2UvdF9iYXNlX3R5cGUuaCIKKyAgICAgICJzcmMvdGhyaWZ0L3BhcnNlL3RfY29uc3QuaCIKKyAgICAgICJzcmMvdGhyaWZ0L3BhcnNlL3RfY29uc3RfdmFsdWUuaCIKKyAgICAgICJzcmMvdGhyaWZ0L3BhcnNlL3RfY29udGFpbmVyLmgiCisgICAgICAic3JjL3RocmlmdC9wYXJzZS90X2RvYy5oIgorICAgICAgInNyYy90aHJpZnQvcGFyc2UvdF9lbnVtLmgiCisgICAgICAic3JjL3RocmlmdC9wYXJzZS90X2VudW1fdmFsdWUuaCIKKyAgICAgICJzcmMvdGhyaWZ0L3BhcnNlL3RfZmllbGQuaCIKKyAgICAgICJzcmMvdGhyaWZ0L3BhcnNlL3RfZnVuY3Rpb24uaCIKKyAgICAgICJzcmMvdGhyaWZ0L3BhcnNlL3RfbGlzdC5oIgorICAgICAgInNyYy90aHJpZnQvcGFyc2UvdF9tYXAuaCIKKyAgICAgICJzcmMvdGhyaWZ0L3BhcnNlL3RfcHJvZ3JhbS5oIgorICAgICAgInNyYy90aHJpZnQvcGFyc2UvdF9zY29wZS5oIgorICAgICAgInNyYy90aHJpZnQvcGFyc2UvdF9zZXJ2aWNlLmgiCisgICAgICAic3JjL3RocmlmdC9wYXJzZS90X3NldC5oIgorICAgICAgInNyYy90aHJpZnQvcGFyc2UvdF9zdHJ1Y3QuaCIKKyAgICAgICJzcmMvdGhyaWZ0L3BhcnNlL3RfdHlwZWRlZi5oIgorICAgICAgInNyYy90aHJpZnQvcGFyc2UvdF90eXBlLmgiCisgICAgICBERVNUSU5BVElPTiAiJHtJTkNMVURFX0lOU1RBTExfRElSfS90aHJpZnQvcGFyc2UiKQorICBpbnN0YWxsKEZJTEVTCisgICAgICAic3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luLmgiCisgICAgICAic3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luX291dHB1dC5oIgorICAgICAgInNyYy90aHJpZnQvcGx1Z2luL3R5cGVfdXRpbC5oIgorICAgICAgREVTVElOQVRJT04gIiR7SU5DTFVERV9JTlNUQUxMX0RJUn0vdGhyaWZ0L3BsdWdpbiIpCitpZihNU1ZDKQorICBpbnN0YWxsKEZJTEVTCisgICAgICAic3JjL3RocmlmdC93aW5kb3dzL2NvbmZpZy5oIgorICAgICAgREVTVElOQVRJT04gIiR7SU5DTFVERV9JTlNUQUxMX0RJUn0vdGhyaWZ0L3dpbmRvd3MiKQorZW5kaWYoKQorZW5kaWYoKQorCitpZihCVUlMRF9URVNUSU5HKQorICAgIGFkZF9zdWJkaXJlY3RvcnkodGVzdCkKK2VuZGlmKCkKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9NYWtlZmlsZS5hbSBiL2NvbXBpbGVyL2NwcC9NYWtlZmlsZS5hbQppbmRleCAzOGY5ZjlkLi4wYjhlZjJlIDEwMDY0NAotLS0gYS9jb21waWxlci9jcHAvTWFrZWZpbGUuYW0KKysrIGIvY29tcGlsZXIvY3BwL01ha2VmaWxlLmFtCkBAIC0yMSw4OSArMjEsMTcwIEBACiAjIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCiAjIGRldGFpbHMuCiAKLUFNX1lGTEFHUyA9IC1kCi1MSUJTID0KLUJVSUxUX1NPVVJDRVMgPSBzcmMvdGhyaWZ0eS5jYworQVVUT01BS0VfT1BUSU9OUyA9IHN1YmRpci1vYmplY3RzCisKKyMgTm90ZSBvbiB3aHkgd2UgaGF2ZSBzcmMvdGhyaWZ0IGFuZCBzcmMvdGhyaWZ0L3BsdWdpbiBkaXJlY3RvcmllczoKKyMgU2luY2UgQXV0b21ha2Ugc3VwcG9ydHMgb25seSBvbmUgc2V0IG9mIEJVSUxUX1NPVVJDRVMgcGVyIGZpbGUgYW5kIGRvZXMgbm90IGFsbG93CisjIFNVQkRJUlMgYnVpbHQgYmVmb3JlIEJVSUxUX1NPVVJDRVMsIHdlIGVuZCB1cCBzZXBhcmF0ZSBNYWtlZmlsZS5hbSBmb3IgZWFjaCBzb3VyY2UKKyMgY29kZSBnZW5lcmF0aW9uLCBpLmUuIGxleC15YWNjIGFuZCBUaHJpZnQsIHRvIGFjaGlldmUgc3RhYmxlIHBhcmFsbGVsIG1ha2UuCisKK1NVQkRJUlMgPSBzcmMgc3JjL3RocmlmdC9wbHVnaW4gLgoraWYgV0lUSF9URVNUUworU1VCRElSUyArPSB0ZXN0CitlbmRpZgogCiBiaW5fUFJPR1JBTVMgPSB0aHJpZnQKIAotbm9pbnN0X0xJQlJBUklFUyA9IGxpYnBhcnNlLmEKLQogdGhyaWZ0X09CSkRJUiA9IG9iagogCi10aHJpZnRfU09VUkNFUyA9IHNyYy9tYWluLmNjIFwKLSAgICAgICAgICAgICAgICAgc3JjL21kNS5jIFwKLSAgICAgICAgICAgICAgICAgc3JjL2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmNjIFwKLSAgICAgICAgICAgICAgICAgc3JjL2dlbmVyYXRlL3RfZ2VuZXJhdG9yX3JlZ2lzdHJ5LmggXAotICAgICAgICAgICAgICAgICBzcmMvZ2xvYmFscy5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL21haW4uaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9wbGF0Zm9ybS5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL2xvZ2dpbmcuaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9tZDUuaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9hdWRpdC90X2F1ZGl0LmNwcCBcCi0gICAgICAgICAgICAgICAgIHNyYy9hdWRpdC90X2F1ZGl0LmggXAotICAgICAgICAgICAgICAgICBzcmMvcGFyc2UvdF9kb2MuaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9wYXJzZS90X3R5cGUuaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9wYXJzZS90X2Jhc2VfdHlwZS5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL3BhcnNlL3RfZW51bS5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL3BhcnNlL3RfZW51bV92YWx1ZS5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL3BhcnNlL3RfdHlwZWRlZi5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL3BhcnNlL3RfdHlwZWRlZi5jYyBcCi0gICAgICAgICAgICAgICAgIHNyYy9wYXJzZS90X2NvbnRhaW5lci5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL3BhcnNlL3RfbGlzdC5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL3BhcnNlL3Rfc2V0LmggXAotICAgICAgICAgICAgICAgICBzcmMvcGFyc2UvdF9tYXAuaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9wYXJzZS90X3N0cnVjdC5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL3BhcnNlL3RfZmllbGQuaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9wYXJzZS90X3NlcnZpY2UuaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9wYXJzZS90X2Z1bmN0aW9uLmggXAotICAgICAgICAgICAgICAgICBzcmMvcGFyc2UvdF9wcm9ncmFtLmggXAotICAgICAgICAgICAgICAgICBzcmMvcGFyc2UvdF9zY29wZS5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL3BhcnNlL3RfY29uc3QuaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9wYXJzZS90X2NvbnN0X3ZhbHVlLmggXAotICAgICAgICAgICAgICAgICBzcmMvcGFyc2UvcGFyc2UuY2MgXAotICAgICAgICAgICAgICAgICBzcmMvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9nZW5lcmF0ZS90X2h0bWxfZ2VuZXJhdG9yLmggXAotICAgICAgICAgICAgICAgICBzcmMvd2luZG93cy9jb25maWcuaCBcCi0gICAgICAgICAgICAgICAgIHNyYy93aW5kb3dzL3ZlcnNpb24uaAorcGx1Z2luX2dlbiA9IHNyYy90aHJpZnQvcGx1Z2luL3BsdWdpbl90eXBlcy5oIFwKKyAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW5fdHlwZXMuY3BwIFwKKyAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW5fY29uc3RhbnRzLmggXAorICAgICAgICAgICAgIHNyYy90aHJpZnQvcGx1Z2luL3BsdWdpbl9jb25zdGFudHMuY3BwCisKK2NvbXBpbGVyX2NvcmUgPSAgc3JjL3RocmlmdC9jb21tb24uaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY29tbW9uLmNjIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3JfcmVnaXN0cnkuaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2xvYmFscy5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wbGF0Zm9ybS5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9sb2dnaW5nLmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfZG9jLmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfdHlwZS5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X2Jhc2VfdHlwZS5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X2VudW0uaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9lbnVtX3ZhbHVlLmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfdHlwZWRlZi5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X3R5cGVkZWYuY2MgXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfY29udGFpbmVyLmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfbGlzdC5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X3NldC5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X21hcC5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X3N0cnVjdC5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X2ZpZWxkLmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3Rfc2VydmljZS5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X2Z1bmN0aW9uLmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfcHJvZ3JhbS5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X3Njb3BlLmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfY29uc3QuaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9jb25zdF92YWx1ZS5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS9wYXJzZS5jYyBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfaHRtbF9nZW5lcmF0b3IuaCAKKwordGhyaWZ0X1NPVVJDRVMgPSBzcmMvdGhyaWZ0L21haW4uaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvbWFpbi5jYyBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvYXVkaXQvdF9hdWRpdC5jcHAgXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2F1ZGl0L3RfYXVkaXQuaAogCiAjIFNwZWNpZmljIGNsaWVudCBnZW5lcmF0b3Igc291cmNlCi10aHJpZnRfU09VUkNFUyArPSBzcmMvZ2VuZXJhdGUvdF9jX2dsaWJfZ2VuZXJhdG9yLmNjIFwKLSAgICAgICAgICAgICAgICAgIHNyYy9nZW5lcmF0ZS90X2NwcF9nZW5lcmF0b3IuY2MgXAotICAgICAgICAgICAgICAgICAgc3JjL2dlbmVyYXRlL3RfamF2YV9nZW5lcmF0b3IuY2MgXAotICAgICAgICAgICAgICAgICAgc3JjL2dlbmVyYXRlL3RfanNvbl9nZW5lcmF0b3IuY2MgXAotICAgICAgICAgICAgICAgICAgc3JjL2dlbmVyYXRlL3RfYXMzX2dlbmVyYXRvci5jYyBcCi0gICAgICAgICAgICAgICAgICBzcmMvZ2VuZXJhdGUvdF9oYXhlX2dlbmVyYXRvci5jYyBcCi0gICAgICAgICAgICAgICAgICBzcmMvZ2VuZXJhdGUvdF9jc2hhcnBfZ2VuZXJhdG9yLmNjIFwKLSAgICAgICAgICAgICAgICAgIHNyYy9nZW5lcmF0ZS90X3B5X2dlbmVyYXRvci5jYyBcCi0gICAgICAgICAgICAgICAgICBzcmMvZ2VuZXJhdGUvdF9yYl9nZW5lcmF0b3IuY2MgXAotICAgICAgICAgICAgICAgICAgc3JjL2dlbmVyYXRlL3RfcGVybF9nZW5lcmF0b3IuY2MgXAotICAgICAgICAgICAgICAgICAgc3JjL2dlbmVyYXRlL3RfcGhwX2dlbmVyYXRvci5jYyBcCi0gICAgICAgICAgICAgICAgICBzcmMvZ2VuZXJhdGUvdF9lcmxfZ2VuZXJhdG9yLmNjIFwKLSAgICAgICAgICAgICAgICAgIHNyYy9nZW5lcmF0ZS90X2NvY29hX2dlbmVyYXRvci5jYyBcCi0gICAgICAgICAgICAgICAgICBzcmMvZ2VuZXJhdGUvdF9zdF9nZW5lcmF0b3IuY2MgXAotICAgICAgICAgICAgICAgICAgc3JjL2dlbmVyYXRlL3Rfb2NhbWxfZ2VuZXJhdG9yLmNjIFwKLSAgICAgICAgICAgICAgICAgIHNyYy9nZW5lcmF0ZS90X2hzX2dlbmVyYXRvci5jYyBcCi0gICAgICAgICAgICAgICAgICBzcmMvZ2VuZXJhdGUvdF94c2RfZ2VuZXJhdG9yLmNjIFwKLSAgICAgICAgICAgICAgICAgIHNyYy9nZW5lcmF0ZS90X2h0bWxfZ2VuZXJhdG9yLmNjIFwKLSAgICAgICAgICAgICAgICAgIHNyYy9nZW5lcmF0ZS90X2pzX2dlbmVyYXRvci5jYyBcCi0gICAgICAgICAgICAgICAgICBzcmMvZ2VuZXJhdGUvdF9qYXZhbWVfZ2VuZXJhdG9yLmNjIFwKLSAgICAgICAgICAgICAgICAgIHNyYy9nZW5lcmF0ZS90X2RlbHBoaV9nZW5lcmF0b3IuY2MgXAotICAgICAgICAgICAgICAgICAgc3JjL2dlbmVyYXRlL3RfZ29fZ2VuZXJhdG9yLmNjIFwKLSAgICAgICAgICAgICAgICAgIHNyYy9nZW5lcmF0ZS90X2d2X2dlbmVyYXRvci5jYyBcCi0gICAgICAgICAgICAgICAgICBzcmMvZ2VuZXJhdGUvdF9kX2dlbmVyYXRvci5jYyBcCi0gICAgICAgICAgICAgICAgICBzcmMvZ2VuZXJhdGUvdF9sdWFfZ2VuZXJhdG9yLmNjCit0aHJpZnRfU09VUkNFUyArPSBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY19nbGliX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY3BwX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfamF2YV9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2pzb25fZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9hczNfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9kYXJ0X2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfaGF4ZV9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NzaGFycF9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X25ldGNvcmVfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9uZXRjb3JlX2dlbmVyYXRvci5oIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9weV9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X3JiX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfcGVybF9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X3BocF9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2VybF9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NvY29hX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3Rfc3dpZnRfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9zdF9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X29jYW1sX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfaHNfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF94c2RfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF94bWxfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9odG1sX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfanNfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9qYXZhbWVfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9kZWxwaGlfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9nb19nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2d2X2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZF9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2x1YV9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X3JzX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY2xfZ2VuZXJhdG9yLmNjCiAKIHRocmlmdF9DUFBGTEFHUyA9IC1JJChzcmNkaXIpL3NyYwotdGhyaWZ0X0NYWEZMQUdTID0gLVdhbGwgLVdleHRyYSAtcGVkYW50aWMKLXRocmlmdF9MREFERCA9IEBMRVhMSUJAIGxpYnBhcnNlLmEKK3RocmlmdF9DWFhGTEFHUyA9IC1XYWxsIC1XZXh0cmEgLXBlZGFudGljIC1XZXJyb3IKK3RocmlmdF9MREFERCA9IEBMRVhMSUJAIHNyYy90aHJpZnQvbGlicGFyc2UuYQogCi1saWJwYXJzZV9hX0NQUEZMQUdTID0gLUkkKHNyY2Rpcikvc3JjCi1saWJwYXJzZV9hX0NYWEZMQUdTID0gLVdhbGwgLVduby1zaWduLWNvbXBhcmUgLVduby11bnVzZWQKK2lmICFXSVRIX1BMVUdJTgordGhyaWZ0X1NPVVJDRVMgKz0gJChjb21waWxlcl9jb3JlKQorZWxzZQogCi1saWJwYXJzZV9hX1NPVVJDRVMgPSBzcmMvdGhyaWZ0eS55eSBcCi0gICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0bC5sbAorbGliX0xUTElCUkFSSUVTID0gbGlidGhyaWZ0Yy5sYQorCit0aHJpZnRfQ1BQRkxBR1MgKz0gLURUSFJJRlRfRU5BQkxFX1BMVUdJTj0xCit0aHJpZnRfTERBREQgKz0gbGlidGhyaWZ0Yy5sYQorCitub2Rpc3RfbGlidGhyaWZ0Y19sYV9TT1VSQ0VTID0gJChwbHVnaW5fZ2VuKQorbGlidGhyaWZ0Y19sYV9TT1VSQ0VTID0gJChjb21waWxlcl9jb3JlKSBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BsdWdpbi90eXBlX3V0aWwuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW4uaCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW4uY2MgXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luX291dHB1dC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGx1Z2luL3BsdWdpbl9vdXRwdXQuY2MgXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luLnRocmlmdCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2xvZ2dpbmcuY2MKKworCitsaWJ0aHJpZnRjX2xhX0NQUEZMQUdTID0gLUkkKHNyY2Rpcikvc3JjIC1Jc3JjIC1JJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvc3JjIC1EVEhSSUZUX0VOQUJMRV9QTFVHSU49MQorbGlidGhyaWZ0Y19sYV9DWFhGTEFHUyA9IC1XYWxsIC1XZXh0cmEgLXBlZGFudGljCitsaWJ0aHJpZnRjX2xhX0xJQkFERCA9ICQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdC5sYQorCitpbmNsdWRlX3RocmlmdGRpciA9ICQoaW5jbHVkZWRpcikvdGhyaWZ0CitpbmNsdWRlX3RocmlmdF9IRUFERVJTID0gc3JjL3RocmlmdC9jb21tb24uaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nbG9iYWxzLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvbG9nZ2luZy5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L21haW4uaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wbGF0Zm9ybS5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3ZlcnNpb24uaAorCitpbmNsdWRlX2F1ZGl0ZGlyID0gJChpbmNsdWRlX3RocmlmdGRpcikvd2luZG93cworaW5jbHVkZV9hdWRpdF9IRUFERVJTID0gc3JjL3RocmlmdC9hdWRpdC90X2F1ZGl0LmgKKworaW5jbHVkZV9nZW5lcmF0ZWRpciA9ICQoaW5jbHVkZV90aHJpZnRkaXIpL2dlbmVyYXRlCitpbmNsdWRlX2dlbmVyYXRlX0hFQURFUlMgPSBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvcl9yZWdpc3RyeS5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2h0bWxfZ2VuZXJhdG9yLmggCisKK2luY2x1ZGVfcGFyc2VkaXIgPSAkKGluY2x1ZGVfdGhyaWZ0ZGlyKS9wYXJzZQoraW5jbHVkZV9wYXJzZV9IRUFERVJTID0gc3JjL3RocmlmdC9wYXJzZS90X3NlcnZpY2UuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfcHJvZ3JhbS5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9maWVsZC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9zY29wZS5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF90eXBlZGVmLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X3NldC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9jb25zdF92YWx1ZS5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9lbnVtX3ZhbHVlLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X2NvbnN0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X2xpc3QuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfbWFwLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X2NvbnRhaW5lci5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9iYXNlX3R5cGUuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfZW51bS5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9mdW5jdGlvbi5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF90eXBlLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X2RvYy5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9zdHJ1Y3QuaAorCitpbmNsdWRlX3BsdWdpbmRpciA9ICQoaW5jbHVkZV90aHJpZnRkaXIpL3BsdWdpbgoraW5jbHVkZV9wbHVnaW5fSEVBREVSUyA9IHNyYy90aHJpZnQvcGx1Z2luL3BsdWdpbi5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BsdWdpbi90eXBlX3V0aWwuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luX291dHB1dC5oCisKK2luY2x1ZGVfd2luZG93c2RpciA9ICQoaW5jbHVkZV90aHJpZnRkaXIpL3dpbmRvd3MKK2luY2x1ZGVfd2luZG93c19IRUFERVJTID0gc3JjL3RocmlmdC93aW5kb3dzL2NvbmZpZy5oCitlbmRpZgogCiBXSU5ET1dTX0RJU1QgPSBcCiAgICAgICAgICAgICAgY29tcGlsZXIuc2xuIFwKQEAgLTExNCwxMiArMTk1LDEzIEBACiAgICAgICAgICAgICAgY29kaW5nX3N0YW5kYXJkcy5tZCBcCiAgICAgICAgICAgICAgUkVBRE1FLm1kIFwKICAgICAgICAgICAgICBDTWFrZUxpc3RzLnR4dCBcCisgICAgICAgICAgICAgdGVzdCBcCiAgICAgICAgICAgICAgJChXSU5ET1dTX0RJU1QpCiAKIGNsZWFuLWxvY2FsOgotCSQoUk0pIHRocmlmdGwuY2MgdGhyaWZ0eS5jYyB0aHJpZnR5LmggdGhyaWZ0eS5oaCB2ZXJzaW9uLmggd2luZG93cy92ZXJzaW9uLmgKKwkkKFJNKSB2ZXJzaW9uLmggJChwbHVnaW5fZ2VuKQogCi1zcmMvbWFpbi5jYzogdmVyc2lvbi5oCitzcmMvdGhyaWZ0L21haW4uY2M6IHNyYy90aHJpZnQvdmVyc2lvbi5oCiAKIHN0eWxlLWxvY2FsOgotCSQoQ1BQU1RZTEVfQ01EKQorICAkKENQUFNUWUxFX0NNRCkKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9SRUFETUUubWQgYi9jb21waWxlci9jcHAvUkVBRE1FLm1kCmluZGV4IGVhMTk1YzcuLjMyZWFjOWYgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL2NwcC9SRUFETUUubWQKKysrIGIvY29tcGlsZXIvY3BwL1JFQURNRS5tZApAQCAtMSw4NCArMSwxNzUgQEAKLSMgQnVpbGQgY29tcGlsZXIgdXNpbmcgQ01ha2UKKyMgQnVpbGQgVGhyaWZ0IElETCBjb21waWxlciB1c2luZyBDTWFrZQogCi1Vc2UgdGhlIGZvbGxvd2luZyBzdGVwcyB0byBidWlsZCB1c2luZyBjbWFrZToKKzwhLS0gVE9DIC0tPgogCi0gICAgbWtkaXIgY21ha2UtYnVpbGQKLSAgICBjZCBjbWFrZS1idWlsZAotICAgIGNtYWtlIC4uCi0gICAgbWFrZQorLSBbQnVpbGQgVGhyaWZ0IElETCBjb21waWxlciB1c2luZyBDTWFrZV0oI2J1aWxkLXRocmlmdC1pZGwtY29tcGlsZXItdXNpbmctY21ha2UpCisgICAgLSBbQnVpbGQgb24gVW5peC1saWtlIFN5c3RlbV0oI2J1aWxkLW9uLXVuaXgtbGlrZS1zeXN0ZW0pCisgICAgICAgIC0gW1ByZXJlcXVpc2l0ZXNdKCNwcmVyZXF1aXNpdGVzKQorICAgICAgICAtIFtCdWlsZCB1c2luZyBDTWFrZV0oI2J1aWxkLXVzaW5nLWNtYWtlKQorICAgICAgICAgICAgLSBbQnVpbGQgd2l0aCBFY2xpcHNlIElERV0oI2J1aWxkLXdpdGgtZWNsaXBzZS1pZGUpCisgICAgICAgICAgICAtIFtCdWlsZCB3aXRoIFhDb2RlIElERSBpbiBNYWNPU10oI2J1aWxkLXdpdGgteGNvZGUtaWRlLWluLW1hY29zKQorICAgICAgICAgICAgLSBbVXNhZ2Ugb2Ygb3RoZXIgSURFc10oI3VzYWdlLW9mLW90aGVyLWlkZXMpCisgICAgLSBbQnVpbGQgb24gV2luZG93c10oI2J1aWxkLW9uLXdpbmRvd3MpCisgICAgICAgIC0gW1ByZXJlcXVpc2l0ZXNdKCNwcmVyZXF1aXNpdGVzLTEpCisgICAgICAgIC0gW0J1aWxkIHVzaW5nIEdpdCBCYXNoXSgjYnVpbGQtdXNpbmctZ2l0LWJhc2gpCisgICAgICAgIC0gW1VzaW5nIFZpc3VhbCBTdHVkaW8gYW5kIFdpbiBmbGV4LWJpc29uXSgjdXNpbmctdmlzdWFsLXN0dWRpby1hbmQtd2luLWZsZXgtYmlzb24pCisgICAgICAgIC0gW0Nyb3NzIGNvbXBpbGUgdXNpbmcgbWluZ3czMiBhbmQgZ2VuZXJhdGUgYSBXaW5kb3dzIEluc3RhbGxlciB3aXRoIENQYWNrXSgjY3Jvc3MtY29tcGlsZS11c2luZy1taW5ndzMyLWFuZC1nZW5lcmF0ZS1hLXdpbmRvd3MtaW5zdGFsbGVyLXdpdGgtY3BhY2spCistIFtPdGhlciBjYXNlc10oI290aGVyLWNhc2VzKQorICAgIC0gW0J1aWxkaW5nIHRoZSBUaHJpZnQgSURMIGNvbXBpbGVyIGluIFdpbmRvd3Mgd2l0aG91dCBDTWFrZV0oI2J1aWxkaW5nLXRoZS10aHJpZnQtaWRsLWNvbXBpbGVyLWluLXdpbmRvd3Mtd2l0aG91dC1jbWFrZSkKKy0gW1VuaXQgdGVzdHMgZm9yIGNvbXBpbGVyXSgjdW5pdC10ZXN0cy1mb3ItY29tcGlsZXIpCisgICAgLSBbVXNpbmcgYm9vc3QgdGVzdF0oI3VzaW5nLWJvb3N0LXRlc3QpCisgICAgLSBbVXNpbmcgQ2F0Y2ggQysrIHRlc3QgbGlicmFyeV0oI3VzaW5nLWNhdGNoLWMtdGVzdC1saWJyYXJ5KQorLSBbSGF2ZSBhIEhhcHB5IGZyZWUgdGltZSBhbmQgaG9saWRheXNdKCNoYXZlLWEtaGFwcHktZnJlZS10aW1lLWFuZC1ob2xpZGF5cykKIAorPCEtLSAvVE9DIC0tPgogCi0jIyMgQ3JlYXRlIGFuIGVjbGlwc2UgcHJvamVjdAorIyMgQnVpbGQgb24gVW5peC1saWtlIFN5c3RlbQogCi0gICAgbWtkaXIgY21ha2UtZWMgJiYgY2QgY21ha2UtZWMKLSAgICBjbWFrZSAtRyAiRWNsaXBzZSBDRFQ0IC0gVW5peCBNYWtlZmlsZXMiIC4uCi0gICAgbWFrZQorIyMjIFByZXJlcXVpc2l0ZXMKKy0gSW5zdGFsbCBDTWFrZQorLSBJbnN0YWxsIGZsZXggYW5kIGJpc29uCisKKyMjIyBCdWlsZCB1c2luZyBDTWFrZQorCistIEdvIHRvICoqdGhyaWZ0XGNvbXBpbGVyXGNwcCoqCistIFVzZSB0aGUgZm9sbG93aW5nIHN0ZXBzIHRvIGJ1aWxkIHVzaW5nIGNtYWtlOgorCitgYGAKK21rZGlyIGNtYWtlLWJ1aWxkICYmIGNkIGNtYWtlLWJ1aWxkCitjbWFrZSAuLgorbWFrZQorYGBgCisKKyMjIyMgQnVpbGQgd2l0aCBFY2xpcHNlIElERQorCistIEdvIHRvICoqdGhyaWZ0XGNvbXBpbGVyXGNwcCoqCistIFVzZSB0aGUgZm9sbG93aW5nIHN0ZXBzIHRvIGJ1aWxkIHVzaW5nIGNtYWtlOgorCitgYGAKK21rZGlyIGNtYWtlLWVjICYmIGNkIGNtYWtlLWVjCitjbWFrZSAtRyAiRWNsaXBzZSBDRFQ0IC0gVW5peCBNYWtlZmlsZXMiIC4uCittYWtlCitgYGAKIAogTm93IG9wZW4gdGhlIGZvbGRlciBjbWFrZS1lYyB1c2luZyBlY2xpcHNlLgogCisjIyMjIEJ1aWxkIHdpdGggWENvZGUgSURFIGluIE1hY09TCisKKy0gSW5zdGFsbC91cGRhdGUgZmxleCwgYmlzb24gYW5kIGNtYWtlIHdpdGggYnJldworCitgYGAKK2JyZXcgaW5zdGFsbCBjbWFrZQorYnJldyBpbnN0YWxsIGJpc29uCitgYGAKKworLSBHbyB0byAqKnRocmlmdFxjb21waWxlclxjcHAqKgorLSBSdW4gY29tbWFuZHMgaW4gY29tbWFuZCBsaW5lOgorCitgYGAKK21rZGlyIGNtYWtlLWJ1aWxkICYmIGNkIGNtYWtlLWJ1aWxkCitjbWFrZSAtRyAiWGNvZGUiIC1EV0lUSF9QTFVHSU49T0ZGIC4uCitjbWFrZSAtLWJ1aWxkIC4KK2BgYAorCisjIyMjIFVzYWdlIG9mIG90aGVyIElERXMKKworUGxlYXNlIGNoZWNrIGxpc3Qgb2Ygc3VwcG9ydGVkIElERSAKKworYGBgCitjbWFrZSAtLWhlbHAKK2BgYAorCisjIyBCdWlsZCBvbiBXaW5kb3dzCisKKyMjIyBQcmVyZXF1aXNpdGVzCistIEluc3RhbGwgQ01ha2UgLSBodHRwczovL2NtYWtlLm9yZy9kb3dubG9hZC8KKy0gSW4gY2FzZSBpZiB5b3Ugd2FudCB0byBidWlsZCB3aXRob3V0IEdpdCBCYXNoIC0gaW5zdGFsbCB3aW5mbGV4Ymlzb24gLSBodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy93aW5mbGV4Ymlzb24vCistIEluIGNhc2UgaWYgeW91IHdhbnQgdG8gYnVpbGQgd2l0aCBWaXN1YWwgU3R1ZGlvIC0gaW5zdGFsbCBWaXN1YWwgU3R1ZGlvIAorICAtIEJldHRlciB0byB1c2UgdGhlIGxhdGVzdCBzdGFibGUgVmlzdWFsIFN0dWRpbyBDb21tdW5pdHkgRWRpdGlvbiAtIGh0dHBzOi8vd3d3LnZpc3VhbHN0dWRpby5jb20vdnMvd2hhdHNuZXcvIChlbnN1cmUgdGhhdCB5b3UgaW5zdGFsbGVkIHdvcmtsb2FkICJEZXNrdG9wIERldmVsb3BtZW50IHdpdGggQysrIiBmb3IgVlMyMDE3KSAtIE1pY3Jvc29mdCBhZGRlZCBzb21lIHN1cHBvcnQgZm9yIENNYWtlIGFuZCBpbXByb3ZpbmcgaXQgaW4gVmlzdWFsIFN0dWRpbworCisjIyMgQnVpbGQgdXNpbmcgR2l0IEJhc2gKKworR2l0IEJhc2ggcHJvdmlkZXMgZmxleCBhbmQgYmlzb24KKworLSBHbyB0byAqKnRocmlmdFxjb21waWxlclxjcHAqKgorLSBVc2UgdGhlIGZvbGxvd2luZyBzdGVwcyB0byBidWlsZCB1c2luZyBjbWFrZToKKworYGBgCitta2RpciBjbWFrZS12cyAmJiBjZCBjbWFrZS12cworY21ha2UgLURXSVRIX1NIQVJFRF9MSUI9b2ZmIC4uCitjbWFrZSAtLWJ1aWxkIC4KK2BgYAorCisjIyMgVXNpbmcgVmlzdWFsIFN0dWRpbyBhbmQgV2luIGZsZXgtYmlzb24KKworLSBHZW5lcmF0ZSBhIFZpc3VhbCBTdHVkaW8gcHJvamVjdCBmb3IgdmVyc2lvbiBvZiBWaXN1YWwgU3R1ZGlvIHdoaWNoIHlvdSBoYXZlICgqKmNtYWtlIC0taGVscCoqIGNhbiBzaG93IGxpc3Qgb2Ygc3VwcG9ydGFibGUgVlMgdmVyc2lvbnMpOgorLSBSdW4gY29tbWFuZHMgaW4gY29tbWFuZCBsaW5lOgorYGBgCitta2RpciBjbWFrZS12cworY2QgY21ha2UtdnMKK2NtYWtlIC1HICJWaXN1YWwgU3R1ZGlvIDE1IDIwMTciIC1EV0lUSF9QTFVHSU49T0ZGIC4uCitgYGAKKy0gTm93IG9wZW4gdGhlIGZvbGRlciBjbWFrZS12cyB1c2luZyBWaXN1YWwgU3R1ZGlvLgogCiAjIyMgQ3Jvc3MgY29tcGlsZSB1c2luZyBtaW5ndzMyIGFuZCBnZW5lcmF0ZSBhIFdpbmRvd3MgSW5zdGFsbGVyIHdpdGggQ1BhY2sKIAotICAgIG1rZGlyIGNtYWtlLW1pbmd3MzIgJiYgY2QgY21ha2UtbWluZ3czMgotICAgIGNtYWtlIC1EQ01BS0VfVE9PTENIQUlOX0ZJTEU9Li4vYnVpbGQvY21ha2UvbWluZ3czMi10b29sY2hhaW4uY21ha2UgLURCVUlMRF9DT01QSUxFUj1PTiAtREJVSUxEX0xJQlJBUklFUz1PRkYgLURCVUlMRF9URVNUSU5HPU9GRiAtREJVSUxEX0VYQU1QTEVTPU9GRiAuLgotICAgIGNwYWNrCi0KLSMjIEJ1aWxkIG9uIHdpbmRvd3MKLQotIyMjIHVzaW5nIEdpdCBCYXNoCi1HaXQgQmFzaCBwcm92aWRlcyBmbGV4IGFuZCBiaXNvbiwgc28geW91IGp1c3QgbmVlZCB0byBkbyB0aGlzOgotCi0gICAgbWtkaXIgY21ha2UtdnMgJiYgY2QgY21ha2UtdnMKLSAgICBjbWFrZSAtRFdJVEhfU0hBUkVEX0xJQj1vZmYgLi4KLQotIyMjIHVzaW5nIFdpbiBmbGV4LWJpc29uCi0KLUluIG9yZGVyIHRvIGJ1aWxkIG9uIHdpbmRvd3Mgd2l0aCB3aW5mbGV4Ymlzb24gYSBmZXcgYWRkaXRpb25hbCBzdGVwcyBhcmUgbmVjZXNzYXJ5OgotCi0xLiBEb3dubG9hZCB3aW5mbGV4Ymlzb24gZnJvbSBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL3dpbmZsZXhiaXNvbi8KLTIuIEV4dHJhY3QgdGhlIHdpbmZsZXggYmlzb24gZmlsZXMgdG8gZm9yIGUuZy4gQzpcd2luZmxleGJpc29uCi0zLiBNYWtlIHRoZSBDTWFrZSB2YXJpYWJsZXMgcG9pbnQgdG8gdGhlIGNvcnJlY3QgYmluYXJpZXMuCi0gICogRkxFWF9FWEVDVVRBQkxFID0gQzovd2luYnVpbGQvd2luX2ZsZXguZXhlCi0gICogQklTT05fRVhFQ1VUQUJMRSA9IEM6L3dpbmJ1aWxkL3dpbl9iaXNvbi5leGUKLTQuIEdlbmVyYXRlIGEgVmlzdWFsIFN0dWRpbyBwcm9qZWN0OgogYGBgCi1ta2RpciBjbWFrZS12cyAmJiBjZCBjbWFrZS12cwotY21ha2UgLUcgIlZpc3VhbCBTdHVkaW8gMTIiIC1EV0lUSF9TSEFSRURfTElCPW9mZiAuLgorbWtkaXIgY21ha2UtbWluZ3czMiAmJiBjZCBjbWFrZS1taW5ndzMyCitjbWFrZSAtRENNQUtFX1RPT0xDSEFJTl9GSUxFPS4uL2J1aWxkL2NtYWtlL21pbmd3MzItdG9vbGNoYWluLmNtYWtlIC1EQlVJTERfQ09NUElMRVI9T04gLURCVUlMRF9MSUJSQVJJRVM9T0ZGIC1EQlVJTERfVEVTVElORz1PRkYgLURCVUlMRF9FWEFNUExFUz1PRkYgLi4KK2NwYWNrCiBgYGAKLTUuIE5vdyBvcGVuIHRoZSBmb2xkZXIgYnVpbGRfdnMgdXNpbmcgVmlzdWFsIFN0dWRpbyAyMDEzLgogCi0jIEJ1aWxkaW5nIHRoZSBUaHJpZnQgSURMIGNvbXBpbGVyIGluIFdpbmRvd3MKKyMgT3RoZXIgY2FzZXMKIAotSWYgeW91IGRvbid0IHdhbnQgdG8gdXNlIENNYWtlIHlvdSBjYW4gdXNlIHRoZSBhbHJlYWR5IGF2YWlsYWJsZSBWaXN1YWwgU3R1ZGlvCi0yMDEwIHNvbHV0aW9uLgotVGhlIFZpc3VhbCBTdHVkaW8gcHJvamVjdCBjb250YWlucyBwcmUtYnVpbGQgY29tbWFuZHMgdG8gZ2VuZXJhdGUgdGhlCi10aHJpZnRsLmNjLCB0aHJpZnR5LmNjIGFuZCB0aHJpZnR5LmhoIGZpbGVzIHdoaWNoIGFyZSBuZWNlc3NhcnkgdG8gYnVpbGQKLXRoZSBjb21waWxlci4gVGhlc2UgZGVwZW5kIG9uIGJpc29uLCBmbGV4IGFuZCB0aGVpciBkZXBlbmRlbmNpZXMgdG8KLXdvcmsgcHJvcGVybHkuIElmIHRoaXMgZG9lc24ndCB3b3JrIG9uIGEgc3lzdGVtLCB0cnkgdGhlc2UgbWFudWFsCi1wcmUtYnVpbGQgc3RlcHMuCisjIyBCdWlsZGluZyB0aGUgVGhyaWZ0IElETCBjb21waWxlciBpbiBXaW5kb3dzIHdpdGhvdXQgQ01ha2UKIAotT3BlbiBjb21waWxlci5zbG4gYW5kIHJlbW92ZSB0aGUgUHJlLWJ1aWxkIGNvbW1hbmRzIHVuZGVyIHRoZSBwcm9qZWN0J3MKLSBQcm9wZXJ0aWVzIC0+IEJ1aWxkIEV2ZW50cyAtPiBQcmUtQnVpbGQgRXZlbnRzLgorSWYgeW91IGRvbid0IHdhbnQgdG8gdXNlIENNYWtlIHlvdSBjYW4gdXNlIHRoZSBhbHJlYWR5IGF2YWlsYWJsZSBWaXN1YWwgU3R1ZGlvIDIwMTAgc29sdXRpb24uCiAKLURvd25sb2FkIGZsZXggJiBiaXNvbiBmcm9tIGh0dHA6Ly9qYWlzYW50b255ay53b3JkcHJlc3MuY29tLzIwMDgvMDMvMTYvbGV4LWFuZC15YWNjYmlzb24taW4td2luZG93cy8KLURvd25sb2FkIGJpc29uLnNpbXBsZSBpbiBhZGRpdGlvbiB0byBiaXNvbi5leGUgLiBUaGlzIGJ1aWxkIG9mIGJpc29uIGlzIGVhc2llciB0byB1c2UKLXRoYW4gdGhlIG9uZSBvbiBzb3VyY2Vmb3JnZSB3aGljaCBoYXMgYSBteXJpYWQgb2YgZGVwZW5kZW5jaWVzLgotUGxhY2UgdGhlc2UgYmluYXJpZXMgc29tZXdoZXJlIGluIHRoZSBwYXRoLgorVGhlIFZpc3VhbCBTdHVkaW8gcHJvamVjdCBjb250YWlucyBwcmUtYnVpbGQgY29tbWFuZHMgdG8gZ2VuZXJhdGUgdGhlIHRocmlmdGwuY2MsIHRocmlmdHkuY2MgYW5kIHRocmlmdHkuaGggZmlsZXMgd2hpY2ggYXJlIG5lY2Vzc2FyeSB0byBidWlsZCB0aGUgY29tcGlsZXIuIAorCitUaGVzZSBkZXBlbmQgb24gYmlzb24sIGZsZXggYW5kIHRoZWlyIGRlcGVuZGVuY2llcyB0byB3b3JrIHByb3Blcmx5LgorCitEb3dubG9hZCBmbGV4ICYgYmlzb24gYXMgZGVzY3JpYmVkIGFib3ZlLiAKKworUGxhY2UgdGhlc2UgYmluYXJpZXMgc29tZXdoZXJlIGluIHRoZSBwYXRoIGFuZCByZW5hbWUgd2luX2ZsZXguZXhlIGFuZCB3aW5fYmlzb24uZXhlIHRvIGZsZXguZXhlIGFuZCBiaXNvbi5leGUgcmVzcGVjdGl2ZWx5LgorCitJZiB0aGlzIGRvZXNuJ3Qgd29yayBvbiBhIHN5c3RlbSwgdHJ5IHRoZXNlIG1hbnVhbCBwcmUtYnVpbGQgc3RlcHMuCisKK09wZW4gY29tcGlsZXIuc2xuIGFuZCByZW1vdmUgdGhlIFByZS1idWlsZCBjb21tYW5kcyB1bmRlciB0aGUgcHJvamVjdCdzOiBQcm9wZXJ0aWVzIC0+IEJ1aWxkIEV2ZW50cyAtPiBQcmUtQnVpbGQgRXZlbnRzLgogCiBGcm9tIGEgY29tbWFuZCBwcm9tcHQ6Ci0+IGNkIHRocmlmdC9jb21waWxlci9jcHAKLT4gZmxleCAtb3NyY1x0aHJpZnRsLmNjIHNyY1x0aHJpZnRsLmxsCitgYGAKK2NkIHRocmlmdC9jb21waWxlci9jcHAKK2ZsZXggLW8gc3JjXHRocmlmdFx0aHJpZnRsLmNjIHNyY1x0aHJpZnRcdGhyaWZ0bC5sbAorYGBgCiBJbiB0aGUgZ2VuZXJhdGVkIHRocmlmdGwuY2MsIGNvbW1lbnQgb3V0ICNpbmNsdWRlIDx1bmlzdGQuaD4KIAogUGxhY2UgYSBjb3B5IG9mIGJpc29uLnNpbXBsZSBpbiB0aHJpZnQvY29tcGlsZXIvY3BwCi0+IGJpc29uIC15IC1vICJzcmMvdGhyaWZ0eS5jYyIgLS1kZWZpbmVzIHNyYy90aHJpZnR5Lnl5Ci0+IG1vdmUgc3JjXHRocmlmdHkuY2MuaGggIHNyY1x0aHJpZnR5LmhoCitgYGAKK2Jpc29uIC15IC1vICJzcmMvdGhyaWZ0L3RocmlmdHkuY2MiIC0tZGVmaW5lcyBzcmMvdGhyaWZ0L3RocmlmdHkueXkKK21vdmUgc3JjXHRocmlmdFx0aHJpZnR5LmNjLmhoICBzcmNcdGhyaWZ0XHRocmlmdHkuaGgKK2BgYAogCiBCaXNvbiBtaWdodCBnZW5lcmF0ZSB0aGUgeWFjYyBoZWFkZXIgZmlsZSAidGhyaWZ0eS5jYy5oIiB3aXRoIGp1c3Qgb25lIGggIi5oIiBleHRlbnNpb247IGluIHRoaXMgY2FzZSB5b3UnbGwgaGF2ZSB0byByZW5hbWUgdG8gInRocmlmdHkuaCIuCiAKLT4gbW92ZSBzcmNcd2luZG93c1x2ZXJzaW9uLmguaW4gc3JjXHdpbmRvd3NcdmVyc2lvbi5oCitgYGAKK21vdmUgc3JjXHRocmlmdFx2ZXJzaW9uLmguaW4gc3JjXHRocmlmdFx2ZXJzaW9uLmgKK2BgYAogCiBEb3dubG9hZCBpbnR0eXBlcy5oIGZyb20gdGhlIGludGVyd2VicyBhbmQgcGxhY2UgaXQgaW4gYW4gaW5jbHVkZSBwYXRoCiBsb2NhdGlvbiAoZS5nLiB0aHJpZnQvY29tcGlsZXIvY3BwL3NyYykuCiAKIEJ1aWxkIHRoZSBjb21waWxlciBpbiBWaXN1YWwgU3R1ZGlvLgorCisjIFVuaXQgdGVzdHMgZm9yIGNvbXBpbGVyCisKKyMjIFVzaW5nIGJvb3N0IHRlc3QKKy0gcGxzIGNoZWNrICoqdGVzdCoqIGZvbGRlcgorCisjIyBVc2luZyBDYXRjaCBDKysgdGVzdCBsaWJyYXJ5CisKK0FkZGVkIGdlbmVyaWMgd2F5IHRvIGNvdmVyIGNvZGUgYnkgdGVzdHMgZm9yIG1hbnkgbGFuZ3VhZ2VzICh5b3UganVzdCBuZWVkIHRvIG1ha2UgYSBjb3JyZWN0IGhlYWRlciBmaWxlIGZvciBnZW5lcmF0b3IgZm9yIHlvdXIgbGFuZ3VhZ2UgLSBleGFtcGxlIGluICoqbmV0Y29yZSoqIGltcGxlbWVudGF0aW9uKQorCistIHBscyBjaGVjayAqKnRlc3RzKiogZm9sZGVyCisKKyMgSGF2ZSBhIEhhcHB5IGZyZWUgdGltZSBhbmQgaG9saWRheXMgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL2NvbXBpbGVyLnZjeHByb2ogYi9jb21waWxlci9jcHAvY29tcGlsZXIudmN4cHJvagppbmRleCBjMDhlZGYyLi4wNjI4YjU0IDEwMDY0NAotLS0gYS9jb21waWxlci9jcHAvY29tcGlsZXIudmN4cHJvagorKysgYi9jb21waWxlci9jcHAvY29tcGlsZXIudmN4cHJvagpAQCAtMTksNzUgKzE5LDgwIEBACiAgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KICAgPC9JdGVtR3JvdXA+CiAgIDxJdGVtR3JvdXA+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcYXVkaXRcdF9hdWRpdC5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfZ2VuZXJhdG9yLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9nZW5lcmF0b3JfcmVnaXN0cnkuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X29vcF9nZW5lcmF0b3IuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2h0bWxfZ2VuZXJhdG9yLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcZ2xvYmFscy5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXG1haW4uaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xtZDUuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xwYXJzZVx0X2Jhc2VfdHlwZS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHBhcnNlXHRfY29uc3QuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xwYXJzZVx0X2NvbnN0X3ZhbHVlLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNccGFyc2VcdF9jb250YWluZXIuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xwYXJzZVx0X2RvYy5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHBhcnNlXHRfZW51bS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHBhcnNlXHRfZW51bV92YWx1ZS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHBhcnNlXHRfZmllbGQuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xwYXJzZVx0X2Z1bmN0aW9uLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNccGFyc2VcdF9saXN0LmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNccGFyc2VcdF9tYXAuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xwYXJzZVx0X3Byb2dyYW0uaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xwYXJzZVx0X3Njb3BlLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNccGFyc2VcdF9zZXJ2aWNlLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNccGFyc2VcdF9zZXQuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xwYXJzZVx0X3N0cnVjdC5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHBhcnNlXHRfdHlwZS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHBhcnNlXHRfdHlwZWRlZi5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHBsYXRmb3JtLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0eS5oaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x3aW5kb3dzXGNvbmZpZy5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHdpbmRvd3NcdmVyc2lvbi5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxhdWRpdFx0X2F1ZGl0LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGNvbW1vbi5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2dlbmVyYXRvci5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2dlbmVyYXRvcl9yZWdpc3RyeS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X29vcF9nZW5lcmF0b3IuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9odG1sX2dlbmVyYXRvci5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnbG9iYWxzLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XG1haW4uaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccGFyc2VcdF9iYXNlX3R5cGUuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccGFyc2VcdF9jb25zdC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwYXJzZVx0X2NvbnN0X3ZhbHVlLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHBhcnNlXHRfY29udGFpbmVyLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHBhcnNlXHRfZG9jLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHBhcnNlXHRfZW51bS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwYXJzZVx0X2VudW1fdmFsdWUuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccGFyc2VcdF9maWVsZC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwYXJzZVx0X2Z1bmN0aW9uLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHBhcnNlXHRfbGlzdC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwYXJzZVx0X21hcC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwYXJzZVx0X3Byb2dyYW0uaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccGFyc2VcdF9zY29wZS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwYXJzZVx0X3NlcnZpY2UuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccGFyc2VcdF9zZXQuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccGFyc2VcdF9zdHJ1Y3QuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccGFyc2VcdF90eXBlLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHBhcnNlXHRfdHlwZWRlZi5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwbGF0Zm9ybS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0aHJpZnR5LmhoIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXGNvbmZpZy5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx2ZXJzaW9uLmgiIC8+CiAgIDwvSXRlbUdyb3VwPgogICA8SXRlbUdyb3VwPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGF1ZGl0XHRfYXVkaXQuY3BwIi8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9hczNfZ2VuZXJhdG9yLmNjIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfY29jb2FfZ2VuZXJhdG9yLmNjIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfY3BwX2dlbmVyYXRvci5jYyIgLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2NzaGFycF9nZW5lcmF0b3IuY2MiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9jX2dsaWJfZ2VuZXJhdG9yLmNjIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfZF9nZW5lcmF0b3IuY2MiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9kZWxwaGlfZ2VuZXJhdG9yLmNjIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfZXJsX2dlbmVyYXRvci5jYyIgLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2dlbmVyYXRvci5jYyIgLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2dvX2dlbmVyYXRvci5jYyIgLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2d2X2dlbmVyYXRvci5jYyIgLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2hheGVfZ2VuZXJhdG9yLmNjIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfaHNfZ2VuZXJhdG9yLmNjIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfaHRtbF9nZW5lcmF0b3IuY2MiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9qYXZhbWVfZ2VuZXJhdG9yLmNjIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfamF2YV9nZW5lcmF0b3IuY2MiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9qc19nZW5lcmF0b3IuY2MiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9qc29uX2dlbmVyYXRvci5jYyIgLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2x1YV9nZW5lcmF0b3IuY2MiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9vY2FtbF9nZW5lcmF0b3IuY2MiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9wZXJsX2dlbmVyYXRvci5jYyIgLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X3BocF9nZW5lcmF0b3IuY2MiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9weV9nZW5lcmF0b3IuY2MiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9yYl9nZW5lcmF0b3IuY2MiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9zdF9nZW5lcmF0b3IuY2MiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF94c2RfZ2VuZXJhdG9yLmNjIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXG1haW4uY2MiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcbWQ1LmMiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNccGFyc2VccGFyc2UuY2MiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNccGFyc2VcdF90eXBlZGVmLmNjIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdGwuY2MiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0eS5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXVkaXRcdF9hdWRpdC5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGNvbW1vbi5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9hczNfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2NvY29hX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9jcHBfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2NzaGFycF9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfbmV0Y29yZV9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfY19nbGliX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9kX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9kYXJ0X2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9kZWxwaGlfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2VybF9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2dvX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9ndl9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfaGF4ZV9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfaHNfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2h0bWxfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2phdmFtZV9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfamF2YV9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfanNfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2pzb25fZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2x1YV9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfb2NhbWxfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X3BlcmxfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X3BocF9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfcHlfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X3JiX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9yc19nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfc3RfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X3N3aWZ0X2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF94bWxfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X3hzZF9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XG1haW4uY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHBhcnNlXHBhcnNlLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwYXJzZVx0X3R5cGVkZWYuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRocmlmdGwuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRocmlmdHkuY2MiIC8+CiAgIDwvSXRlbUdyb3VwPgogICA8SXRlbUdyb3VwPgotICAgIDxOb25lIEluY2x1ZGU9InNyY1x0aHJpZnRsLmxsIiAvPgotICAgIDxOb25lIEluY2x1ZGU9InNyY1x0aHJpZnR5Lnl5IiAvPgorICAgIDxOb25lIEluY2x1ZGU9InNyY1x0aHJpZnRcdGhyaWZ0bC5sbCIgLz4KKyAgICA8Tm9uZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRocmlmdHkueXkiIC8+CiAgIDwvSXRlbUdyb3VwPgogICA8UHJvcGVydHlHcm91cCBMYWJlbD0iR2xvYmFscyI+CiAgICAgPFByb2plY3RHdWlkPns4OTk3NUExQS1GNzk5LTQ1NTYtOThCOC02NEUzMEFCMzlBOTB9PC9Qcm9qZWN0R3VpZD4KQEAgLTE2NCw3ICsxNjksNyBAQAogICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4KICAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4KICAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtNSU5HVztZWV9OT19VTklTVERfSDtfREVCVUc7X0NPTlNPTEU7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPEZvcmNlZEluY2x1ZGVGaWxlcz5jb25maWcuaDwvRm9yY2VkSW5jbHVkZUZpbGVzPgorICAgICAgPEZvcmNlZEluY2x1ZGVGaWxlcz50aHJpZnRcd2luZG93c1xjb25maWcuaDwvRm9yY2VkSW5jbHVkZUZpbGVzPgogICAgICAgPENvbXBpbGVBcz5Db21waWxlQXNDcHA8L0NvbXBpbGVBcz4KICAgICA8L0NsQ29tcGlsZT4KICAgICA8TGluaz4KQEAgLTE3Miw4ICsxNzcsNyBAQAogICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+CiAgICAgPC9MaW5rPgogICAgIDxQcmVCdWlsZEV2ZW50PgotICAgICAgPENvbW1hbmQ+ZmxleCAtbyAic3JjXFx0aHJpZnRsLmNjIiBzcmMvdGhyaWZ0bC5sbAotYmlzb24gLXkgLW8gInNyY1x0aHJpZnR5LmNjIiAtLWRlZmluZXM9InNyYy90aHJpZnR5LmhoIiBzcmMvdGhyaWZ0eS55eTwvQ29tbWFuZD4KKyAgICAgIDxDb21tYW5kPmZsZXggLW8gInNyY1xcdGhyaWZ0XFx0aHJpZnRsLmNjIiBzcmMvdGhyaWZ0L3RocmlmdGwubGwgJmFtcDsmYW1wOyBiaXNvbiAteSAtbyAic3JjXFx0aHJpZnRcXHRocmlmdHkuY2MiIC0tZGVmaW5lcz0ic3JjXFx0aHJpZnRcXHRocmlmdHkuaGgiIHNyYy90aHJpZnQvdGhyaWZ0eS55eTwvQ29tbWFuZD4KICAgICA8L1ByZUJ1aWxkRXZlbnQ+CiAgIDwvSXRlbURlZmluaXRpb25Hcm91cD4KICAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj4KQEAgLTE4Myw3ICsxODcsNyBAQAogICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4KICAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4KICAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtNSU5HVztZWV9OT19VTklTVERfSDtfREVCVUc7X0NPTlNPTEU7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPEZvcmNlZEluY2x1ZGVGaWxlcz5jb25maWcuaDwvRm9yY2VkSW5jbHVkZUZpbGVzPgorICAgICAgPEZvcmNlZEluY2x1ZGVGaWxlcz50aHJpZnRcd2luZG93c1xjb25maWcuaDwvRm9yY2VkSW5jbHVkZUZpbGVzPgogICAgICAgPENvbXBpbGVBcz5Db21waWxlQXNDcHA8L0NvbXBpbGVBcz4KICAgICA8L0NsQ29tcGlsZT4KICAgICA8TGluaz4KQEAgLTE5MSw4ICsxOTUsNyBAQAogICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+CiAgICAgPC9MaW5rPgogICAgIDxQcmVCdWlsZEV2ZW50PgotICAgICAgPENvbW1hbmQ+ZmxleCAtbyAic3JjXHRocmlmdGwuY2MiIHNyYy90aHJpZnRsLmxsCi1iaXNvbiAteSAtbyAic3JjXHRocmlmdHkuY2MiIC0tZGVmaW5lcz0ic3JjL3RocmlmdHkuaGgiIHNyYy90aHJpZnR5Lnl5PC9Db21tYW5kPgorICAgICAgPENvbW1hbmQ+ZmxleCAtbyAic3JjXFx0aHJpZnRcXHRocmlmdGwuY2MiIHNyYy90aHJpZnQvdGhyaWZ0bC5sbCAmYW1wOyZhbXA7IGJpc29uIC15IC1vICJzcmNcXHRocmlmdFxcdGhyaWZ0eS5jYyIgLS1kZWZpbmVzPSJzcmNcXHRocmlmdFxcdGhyaWZ0eS5oaCIgc3JjL3RocmlmdC90aHJpZnR5Lnl5PC9Db21tYW5kPgogICAgIDwvUHJlQnVpbGRFdmVudD4KICAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgogICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4KQEAgLTIwNCw4ICsyMDcsOSBAQAogICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPgogICAgICAgPEludHJpbnNpY0Z1bmN0aW9ucz50cnVlPC9JbnRyaW5zaWNGdW5jdGlvbnM+CiAgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7TUlOR1c7WVlfTk9fVU5JU1REX0g7TkRFQlVHO19DT05TT0xFOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxGb3JjZWRJbmNsdWRlRmlsZXM+Y29uZmlnLmg8L0ZvcmNlZEluY2x1ZGVGaWxlcz4KKyAgICAgIDxGb3JjZWRJbmNsdWRlRmlsZXM+dGhyaWZ0XHdpbmRvd3NcY29uZmlnLmg8L0ZvcmNlZEluY2x1ZGVGaWxlcz4KICAgICAgIDxDb21waWxlQXM+Q29tcGlsZUFzQ3BwPC9Db21waWxlQXM+CisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZDwvUnVudGltZUxpYnJhcnk+CiAgICAgPC9DbENvbXBpbGU+CiAgICAgPExpbms+CiAgICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4KQEAgLTIxNCw4ICsyMTgsNyBAQAogICAgICAgPE9wdGltaXplUmVmZXJlbmNlcz50cnVlPC9PcHRpbWl6ZVJlZmVyZW5jZXM+CiAgICAgPC9MaW5rPgogICAgIDxQcmVCdWlsZEV2ZW50PgotICAgICAgPENvbW1hbmQ+ZmxleCAtbyAic3JjXHRocmlmdGwuY2MiIHNyYy90aHJpZnRsLmxsCi1iaXNvbiAteSAtbyAic3JjXHRocmlmdHkuY2MiIC0tZGVmaW5lcz0ic3JjL3RocmlmdHkuaGgiIHNyYy90aHJpZnR5Lnl5PC9Db21tYW5kPgorICAgICAgPENvbW1hbmQ+ZmxleCAtbyAic3JjXFx0aHJpZnRcXHRocmlmdGwuY2MiIHNyYy90aHJpZnQvdGhyaWZ0bC5sbCAmYW1wOyZhbXA7IGJpc29uIC15IC1vICJzcmNcXHRocmlmdFxcdGhyaWZ0eS5jYyIgLS1kZWZpbmVzPSJzcmNcXHRocmlmdFxcdGhyaWZ0eS5oaCIgc3JjL3RocmlmdC90aHJpZnR5Lnl5PC9Db21tYW5kPgogICAgIDwvUHJlQnVpbGRFdmVudD4KICAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgogICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+CkBAIC0yMjcsOCArMjMwLDkgQEAKICAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4KICAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+dHJ1ZTwvSW50cmluc2ljRnVuY3Rpb25zPgogICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO01JTkdXO1lZX05PX1VOSVNURF9IO05ERUJVRztfQ09OU09MRTslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8Rm9yY2VkSW5jbHVkZUZpbGVzPmNvbmZpZy5oPC9Gb3JjZWRJbmNsdWRlRmlsZXM+CisgICAgICA8Rm9yY2VkSW5jbHVkZUZpbGVzPnRocmlmdFx3aW5kb3dzXGNvbmZpZy5oPC9Gb3JjZWRJbmNsdWRlRmlsZXM+CiAgICAgICA8Q29tcGlsZUFzPkNvbXBpbGVBc0NwcDwvQ29tcGlsZUFzPgorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWQ8L1J1bnRpbWVMaWJyYXJ5PgogICAgIDwvQ2xDb21waWxlPgogICAgIDxMaW5rPgogICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+CkBAIC0yMzcsOCArMjQxLDcgQEAKICAgICAgIDxPcHRpbWl6ZVJlZmVyZW5jZXM+dHJ1ZTwvT3B0aW1pemVSZWZlcmVuY2VzPgogICAgIDwvTGluaz4KICAgICA8UHJlQnVpbGRFdmVudD4KLSAgICAgIDxDb21tYW5kPmZsZXggLW8gInNyY1x0aHJpZnRsLmNjIiBzcmMvdGhyaWZ0bC5sbAotYmlzb24gLXkgLW8gInNyY1x0aHJpZnR5LmNjIiAtLWRlZmluZXM9InNyYy90aHJpZnR5LmhoIiBzcmMvdGhyaWZ0eS55eTwvQ29tbWFuZD4KKyAgICAgIDxDb21tYW5kPmZsZXggLW8gInNyY1xcdGhyaWZ0XFx0aHJpZnRsLmNjIiBzcmMvdGhyaWZ0L3RocmlmdGwubGwgJmFtcDsmYW1wOyBiaXNvbiAteSAtbyAic3JjXFx0aHJpZnRcXHRocmlmdHkuY2MiIC0tZGVmaW5lcz0ic3JjXFx0aHJpZnRcXHRocmlmdHkuaGgiIHNyYy90aHJpZnQvdGhyaWZ0eS55eTwvQ29tbWFuZD4KICAgICA8L1ByZUJ1aWxkRXZlbnQ+CiAgIDwvSXRlbURlZmluaXRpb25Hcm91cD4KICAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAudGFyZ2V0cyIgLz4KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9jb21waWxlci52Y3hwcm9qLmZpbHRlcnMgYi9jb21waWxlci9jcHAvY29tcGlsZXIudmN4cHJvai5maWx0ZXJzCmluZGV4IDdmZjY5YjcuLmI5Njg2NWIgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL2NwcC9jb21waWxlci52Y3hwcm9qLmZpbHRlcnMKKysrIGIvY29tcGlsZXIvY3BwL2NvbXBpbGVyLnZjeHByb2ouZmlsdGVycwpAQCAtMTYsNyArMTYsNiBAQAogICAgIDwvQ2xJbmNsdWRlPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXGdsb2JhbHMuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xtYWluLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcbWQ1LmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNccGFyc2VcdF9iYXNlX3R5cGUuaCI+CiAgICAgICA8RmlsdGVyPnBhcnNlPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+CkBAIC0xMTEsNiArMTEwLDkgQEAKICAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2RfZ2VuZXJhdG9yLmNjIj4KICAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2RhcnRfZ2VuZXJhdG9yLmNjIj4KKyAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2RlbHBoaV9nZW5lcmF0b3IuY2MiPgogICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgpAQCAtMTU5LDE0ICsxNjEsMjIgQEAKICAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X3JiX2dlbmVyYXRvci5jYyI+CiAgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9yc19nZW5lcmF0b3IuY2MiPgorICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfc3RfZ2VuZXJhdG9yLmNjIj4KICAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X3N3aWZ0X2dlbmVyYXRvci5jYyI+CisgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF94c2RfZ2VuZXJhdG9yLmNjIj4KICAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X3htbF9nZW5lcmF0b3IuY2MiPgorICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXG1haW4uY2MiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcbWQ1LmMiIC8+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNccGFyc2VccGFyc2UuY2MiPgogICAgICAgPEZpbHRlcj5wYXJzZTwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgpAQCAtMTg2LDQgKzE5Niw0IEBACiAgICAgPE5vbmUgSW5jbHVkZT0ic3JjXHRocmlmdGwubGwiIC8+CiAgICAgPE5vbmUgSW5jbHVkZT0ic3JjXHRocmlmdHkueXkiIC8+CiAgIDwvSXRlbUdyb3VwPgotPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvTWFrZWZpbGUuYW0gYi9jb21waWxlci9jcHAvc3JjL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMmM1Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsODcgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIworIyBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorIyBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorIyBkZXRhaWxzLgorCitBVVRPTUFLRV9PUFRJT05TID0gc3ViZGlyLW9iamVjdHMKKworQU1fWUZMQUdTID0gLWQKKworQlVJTFRfU09VUkNFUyA9IHRocmlmdC90aHJpZnR5LmNjCisKK25vaW5zdF9MSUJSQVJJRVMgPSB0aHJpZnQvbGlicGFyc2UuYQorCit0aHJpZnRfbGlicGFyc2VfYV9DUFBGTEFHUyA9IC1JJChzcmNkaXIpCit0aHJpZnRfbGlicGFyc2VfYV9DWFhGTEFHUyA9IC1XYWxsIC1Xbm8tc2lnbi1jb21wYXJlIC1Xbm8tdW51c2VkCisKK3RocmlmdF9saWJwYXJzZV9hX1NPVVJDRVMgPSB0aHJpZnQvdGhyaWZ0eS55eSBcCisgICAgICAgICAgICAgICAgICAgICB0aHJpZnQvdGhyaWZ0bC5sbAorCitjbGVhbi1sb2NhbDoKKwkkKFJNKSB0aHJpZnQvdGhyaWZ0bC5jYyB0aHJpZnQvdGhyaWZ0eS5jYyB0aHJpZnQvdGhyaWZ0eS5oIHRocmlmdC90aHJpZnR5LmhoCisKK2lmIFdJVEhfUExVR0lOCitub2luc3RfUFJPR1JBTVMgPSB0aHJpZnQvdGhyaWZ0LWJvb3RzdHJhcAorCit0aHJpZnRfdGhyaWZ0X2Jvb3RzdHJhcF9TT1VSQ0VTID0gXAorICAgICAgICAgICAgICAgICB0aHJpZnQvY29tbW9uLmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvY29tbW9uLmNjIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L2F1ZGl0L3RfYXVkaXQuaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9hdWRpdC90X2F1ZGl0LmNwcCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvcl9yZWdpc3RyeS5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L2dsb2JhbHMuaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9wbGF0Zm9ybS5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L2xvZ2dpbmcuaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9wYXJzZS90X2RvYy5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L3BhcnNlL3RfdHlwZS5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L3BhcnNlL3RfYmFzZV90eXBlLmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvcGFyc2UvdF9lbnVtLmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvcGFyc2UvdF9lbnVtX3ZhbHVlLmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvcGFyc2UvdF90eXBlZGVmLmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvcGFyc2UvdF90eXBlZGVmLmNjIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L3BhcnNlL3RfY29udGFpbmVyLmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvcGFyc2UvdF9saXN0LmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvcGFyc2UvdF9zZXQuaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9wYXJzZS90X21hcC5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L3BhcnNlL3Rfc3RydWN0LmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvcGFyc2UvdF9maWVsZC5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L3BhcnNlL3Rfc2VydmljZS5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L3BhcnNlL3RfZnVuY3Rpb24uaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9wYXJzZS90X3Byb2dyYW0uaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9wYXJzZS90X3Njb3BlLmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvcGFyc2UvdF9jb25zdC5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L3BhcnNlL3RfY29uc3RfdmFsdWUuaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9wYXJzZS9wYXJzZS5jYyBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L2dlbmVyYXRlL3RfaHRtbF9nZW5lcmF0b3IuaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC93aW5kb3dzL2NvbmZpZy5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L3ZlcnNpb24uaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9nZW5lcmF0ZS90X2NwcF9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICB0aHJpZnQvbWFpbi5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L21haW4uY2MKKworbWFpbi5jYzogdmVyc2lvbi5oCisKK3RocmlmdF90aHJpZnRfYm9vdHN0cmFwX0NYWEZMQUdTID0gLVdhbGwgLVdleHRyYSAtcGVkYW50aWMKK3RocmlmdF90aHJpZnRfYm9vdHN0cmFwX0xEQUREID0gQExFWExJQkAgdGhyaWZ0L2xpYnBhcnNlLmEKK2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2F1ZGl0L3RfYXVkaXQuY3BwIGIvY29tcGlsZXIvY3BwL3NyYy9hdWRpdC90X2F1ZGl0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZjYmQ1ZS4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2F1ZGl0L3RfYXVkaXQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDY2ICswLDAgQEAKLQotI2luY2x1ZGUgPGNhc3NlcnQ+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8bGltaXRzLmg+Ci0KLS8vIENhcmVmdWw6IG11c3QgaW5jbHVkZSBnbG9iYWxzIGZpcnN0IGZvciBleHRlcm4gZGVmaW5pdGlvbnMKLSNpbmNsdWRlICJnbG9iYWxzLmgiCi0KLSNpbmNsdWRlICJwYXJzZS90X3Byb2dyYW0uaCIKLSNpbmNsdWRlICJwYXJzZS90X3Njb3BlLmgiCi0jaW5jbHVkZSAicGFyc2UvdF9jb25zdC5oIgotI2luY2x1ZGUgInBhcnNlL3RfZmllbGQuaCIKLQotI2luY2x1ZGUgInZlcnNpb24uaCIKLQotI2luY2x1ZGUgInRfYXVkaXQuaCIKLQotZXh0ZXJuIGludCBnX3dhcm47Ci1leHRlcm4gc3RkOjpzdHJpbmcgZ19jdXJwYXRoOwotZXh0ZXJuIGJvb2wgZ19yZXR1cm5fZmFpbHVyZTsKLQotdm9pZCB0aHJpZnRfYXVkaXRfd2FybmluZyhpbnQgbGV2ZWwsIGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7Ci0gICBpZiAoZ193YXJuIDwgbGV2ZWwpIHsKLSAgICAgIHJldHVybjsKLSAgIH0KLSAgIHZhX2xpc3QgYXJnczsKLSAgIHByaW50ZigiW1RocmlmdCBBdWRpdCBXYXJuaW5nOiVzXSAiLCBnX2N1cnBhdGguY19zdHIoKSk7Ci0gICB2YV9zdGFydChhcmdzLCBmbXQpOwotICAgdnByaW50ZihmbXQsIGFyZ3MpOwotICAgdmFfZW5kKGFyZ3MpOwotICAgcHJpbnRmKCJcbiIpOwotfQotCi12b2lkIHRocmlmdF9hdWRpdF9mYWlsdXJlKGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7Ci0gIHZhX2xpc3QgYXJnczsKLSAgZnByaW50ZihzdGRlcnIsICJbVGhyaWZ0IEF1ZGl0IEZhaWx1cmU6JXNdICIsIGdfY3VycGF0aC5jX3N0cigpKTsKLSAgdmFfc3RhcnQoYXJncywgZm10KTsKLSAgdmZwcmludGYoc3RkZXJyLCBmbXQsIGFyZ3MpOwotICB2YV9lbmQoYXJncyk7Ci0gIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKLSAgZ19yZXR1cm5fZmFpbHVyZSA9IHRydWU7Ci19Ci0KLXZvaWQgY29tcGFyZV9uYW1lc3BhY2UodF9wcm9ncmFtKiBuZXdQcm9ncmFtLCB0X3Byb2dyYW0qIG9sZFByb2dyYW0pCi17Ci0gICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBuZXdOYW1lc3BhY2VNYXAgPSBuZXdQcm9ncmFtLT5nZXRfYWxsX25hbWVzcGFjZXMoKTsKLSAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIG9sZE5hbWVzcGFjZU1hcCA9IG9sZFByb2dyYW0tPmdldF9hbGxfbmFtZXNwYWNlcygpOwotCi0gICBmb3Ioc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3Igb2xkTmFtZXNwYWNlTWFwSXQgPSBvbGROYW1lc3BhY2VNYXAuYmVnaW4oKTsKLSAgICAgICAgIG9sZE5hbWVzcGFjZU1hcEl0ICE9IG9sZE5hbWVzcGFjZU1hcC5lbmQoKTsKLSAgICAgICAgIG9sZE5hbWVzcGFjZU1hcEl0KyspCi0gICB7Ci0gICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBuZXdOYW1lc3BhY2VNYXBJdCA9IG5ld05hbWVzcGFjZU1hcC5maW5kKG9sZE5hbWVzcGFjZU1hcEl0LT5maXJzdCk7Ci0gICAgICBpZihuZXdOYW1lc3BhY2VNYXBJdCA9PSBuZXdOYW1lc3BhY2VNYXAuZW5kKCkpCi0gICAgICB7Ci0gICAgICAgICB0aHJpZnRfYXVkaXRfd2FybmluZygxLCAiTGFuZ3VhZ2UgJXMgbm90IGZvdW5kIGluIG5ldyB0aHJpZnQgZmlsZVxuIiwgKG9sZE5hbWVzcGFjZU1hcEl0LT5maXJzdCkuY19zdHIoKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmKChuZXdOYW1lc3BhY2VNYXBJdC0+c2Vjb25kKSAhPSBvbGROYW1lc3BhY2VNYXBJdC0+c2Vjb25kKQotICAgICAgewotICAgICAgICAgdGhyaWZ0X2F1ZGl0X3dhcm5pbmcoMSwgIk5hbWVzcGFjZSAlcyBjaGFuZ2VkIGluIG5ldyB0aHJpZnQgZmlsZVxuIiwgKG9sZE5hbWVzcGFjZU1hcEl0LT5zZWNvbmQpLmNfc3RyKCkpOwotICAgICAgfQotICAgfQotfQotCi12b2lkIGNvbXBhcmVfZW51bV92YWx1ZXModF9lbnVtKiBuZXdFbnVtLHRfZW51bSogb2xkRW51bSkKLXsKLSAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+JiBvbGRFbnVtVmFsdWVzID0gb2xkRW51bS0+Z2V0X2NvbnN0YW50cygpOwotICAgZm9yKHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBvbGRFbnVtVmFsdWVzSXQgPSBvbGRFbnVtVmFsdWVzLmJlZ2luKCk7Ci0gICAgICAgICBvbGRFbnVtVmFsdWVzSXQgIT0gb2xkRW51bVZhbHVlcy5lbmQoKTsKLSAgICAgICAgIG9sZEVudW1WYWx1ZXNJdCsrKQotICAgewotICAgICAgaW50IGVudW1WYWx1ZSA9ICgqb2xkRW51bVZhbHVlc0l0KS0+Z2V0X3ZhbHVlKCk7Ci0gICAgICB0X2VudW1fdmFsdWUqIG5ld0VudW1WYWx1ZSA9IG5ld0VudW0tPmdldF9jb25zdGFudF9ieV92YWx1ZShlbnVtVmFsdWUpOwotICAgICAgaWYobmV3RW51bVZhbHVlICE9IE5VTEwpCi0gICAgICB7Ci0gICAgICAgICBzdGQ6OnN0cmluZyBlbnVtTmFtZSA9ICgqb2xkRW51bVZhbHVlc0l0KS0+Z2V0X25hbWUoKTsKLSAgICAgICAgIGlmKGVudW1OYW1lICE9IG5ld0VudW1WYWx1ZS0+Z2V0X25hbWUoKSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIHRocmlmdF9hdWRpdF93YXJuaW5nKDEsICJOYW1lIG9mIHRoZSB2YWx1ZSAlZCBjaGFuZ2VkIGluIGVudW0gJXNcbiIsIGVudW1WYWx1ZSwgb2xkRW51bS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKLSAgICAgICAgIH0gICAgICAKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgIHRocmlmdF9hdWRpdF9mYWlsdXJlKCJFbnVtIHZhbHVlICVkIG1pc3NpbmcgaW4gJXNcbiIsIGVudW1WYWx1ZSwgb2xkRW51bS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKLSAgICAgIH0KLQotICAgfQotfQotCi12b2lkIGNvbXBhcmVfZW51bXMoY29uc3Qgc3RkOjp2ZWN0b3I8dF9lbnVtKj4mIG5ld0VudW1MaXN0LCBjb25zdCBzdGQ6OnZlY3Rvcjx0X2VudW0qPiYgb2xkRW51bUxpc3QpCi17Ci0gICBzdGQ6Om1hcDxzdGQ6OnN0cmluZyx0X2VudW0qPiBuZXdFbnVtTWFwOwotICAgc3RkOjp2ZWN0b3I8dF9lbnVtKj46OmNvbnN0X2l0ZXJhdG9yIG5ld0VudW1JdDsKLSAgIGZvcihuZXdFbnVtSXQgPSBuZXdFbnVtTGlzdC5iZWdpbigpOyBuZXdFbnVtSXQgIT0gbmV3RW51bUxpc3QuZW5kKCk7IG5ld0VudW1JdCsrKQotICAgewotICAgICAgbmV3RW51bU1hcFsoKm5ld0VudW1JdCktPmdldF9uYW1lKCldID0gKm5ld0VudW1JdDsKLSAgIH0KLSAgIHN0ZDo6dmVjdG9yPHRfZW51bSo+Ojpjb25zdF9pdGVyYXRvciBvbGRFbnVtSXQ7Ci0gICBmb3Iob2xkRW51bUl0ID0gb2xkRW51bUxpc3QuYmVnaW4oKTsgb2xkRW51bUl0ICE9IG9sZEVudW1MaXN0LmVuZCgpOyBvbGRFbnVtSXQrKykKLSAgIHsKLSAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLHRfZW51bSo+OjppdGVyYXRvciBuZXdFbnVtTWFwSXQ7Ci0gICAgICBuZXdFbnVtTWFwSXQgPSBuZXdFbnVtTWFwLmZpbmQoKCpvbGRFbnVtSXQpLT5nZXRfbmFtZSgpKTsKLQotICAgICAgaWYobmV3RW51bU1hcEl0ID09IG5ld0VudW1NYXAuZW5kKCkpCi0gICAgICB7Ci0gICAgICAgICB0aHJpZnRfYXVkaXRfd2FybmluZygxLCAiRW51bSAlcyBub3QgZm91bmQgaW4gbmV3IHRocmlmdCBmaWxlXG4iLCgqb2xkRW51bUl0KS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgIGNvbXBhcmVfZW51bV92YWx1ZXMobmV3RW51bU1hcEl0LT5zZWNvbmQsICpvbGRFbnVtSXQpOwotICAgICAgfQotICAgfQotfQotCi0vL1RoaXMgZnVuY3Rpb24gcmV0dXJucyAndHJ1ZScgaWYgdGhlIHR3byBhcmd1ZW1lbnRzIGFyZSBvZiBzYW1lIHR5cGVzLgotLy9SZXR1cm5zIGZhbHNlIGlmIHRoZXkgYXJlIG9mIGRpZmZlcmVudCB0eXBlCi1ib29sIGNvbXBhcmVfdHlwZSh0X3R5cGUqIG5ld1R5cGUsIHRfdHlwZSogb2xkVHlwZSkKLXsKLSAgIC8vQ29tcGFyaW5nIG5hbWVzIG9mIHR3byB0eXBlcyB3aWxsIHdvcmsgd2hlbiB0aGUgbmV3VHlwZSBhbmQgb2xkVHlwZSBhcmUgYmFzaWMgdHlwZXMgb3Igc3RydWN0cyBvciBlbnVtcy4KLSAgIC8vSG93ZXZlciwgd2hlbiB0aGV5IGFyZSBjb250YWluZXJzLCBnZXRfbmFtZSgpIHJldHVybnMgZW1wdHkgZm9yIHdoaWNoIHdlIGhhdmUgdG8gY29tcGFyZSB0aGUgdHlwZSBvZiAKLSAgIC8vdGhlaXIgZWxlbWVudHMgYXMgd2VsbC4KLSAgIGlmKChuZXdUeXBlLT5nZXRfbmFtZSgpKS5lbXB0eSgpICYmIChvbGRUeXBlLT5nZXRfbmFtZSgpKS5lbXB0eSgpKQotICAgewotCi0gICAgICBpZihuZXdUeXBlLT5pc19saXN0KCkgJiYgb2xkVHlwZS0+aXNfbGlzdCgpKQotICAgICAgewotICAgICAgICAgdF90eXBlKiBuZXdFbGVtZW50VHlwZSA9ICgodF9saXN0KiluZXdUeXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgICAgICAgdF90eXBlKiBvbGRFbGVtZW50VHlwZSA9ICgodF9saXN0KilvbGRUeXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgICAgICAgcmV0dXJuIGNvbXBhcmVfdHlwZShuZXdFbGVtZW50VHlwZSwgb2xkRWxlbWVudFR5cGUpOwotICAgICAgfQotICAgICAgZWxzZSBpZihuZXdUeXBlLT5pc19tYXAoKSAmJiBvbGRUeXBlLT5pc19tYXAoKSkKLSAgICAgIHsKLSAgICAgICAgIHRfdHlwZSogbmV3S2V5VHlwZSA9ICgodF9tYXAqKW5ld1R5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICAgICAgIHRfdHlwZSogb2xkS2V5VHlwZSA9ICgodF9tYXAqKW9sZFR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLQotICAgICAgICAgdF90eXBlKiBuZXdWYWxUeXBlID0gKCh0X21hcCopbmV3VHlwZSktPmdldF92YWxfdHlwZSgpOwotICAgICAgICAgdF90eXBlKiBvbGRWYWxUeXBlID0gKCh0X21hcCopb2xkVHlwZSktPmdldF92YWxfdHlwZSgpOwotCi0gICAgICAgICByZXR1cm4gKGNvbXBhcmVfdHlwZShuZXdLZXlUeXBlLCBvbGRLZXlUeXBlKSAmJiBjb21wYXJlX3R5cGUobmV3VmFsVHlwZSwgb2xkVmFsVHlwZSkpOwotICAgICAgfQotICAgICAgZWxzZSBpZihuZXdUeXBlLT5pc19zZXQoKSAmJiBvbGRUeXBlLT5pc19zZXQoKSkKLSAgICAgIHsKLSAgICAgICAgIHRfdHlwZSogbmV3RWxlbWVudFR5cGUgPSAoKHRfc2V0KiluZXdUeXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgICAgICAgdF90eXBlKiBvbGRFbGVtZW50VHlwZSA9ICgodF9zZXQqKW9sZFR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgICAgICByZXR1cm4gY29tcGFyZV90eXBlKG5ld0VsZW1lbnRUeXBlLCBvbGRFbGVtZW50VHlwZSk7IAotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgfQotICAgZWxzZSBpZihuZXdUeXBlLT5nZXRfbmFtZSgpID09IG9sZFR5cGUtPmdldF9uYW1lKCkpCi0gICB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgIH0KLSAgIGVsc2UKLSAgIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgIH0KLX0KLQotYm9vbCBjb21wYXJlX3BhaXIoc3RkOjpwYWlyPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4gbmV3TWFwUGFpciwgc3RkOjpwYWlyPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4gb2xkTWFwUGFpcikKLXsKLSAgIHJldHVybiBjb21wYXJlX2RlZmF1bHRzKG5ld01hcFBhaXIuZmlyc3QsIG9sZE1hcFBhaXIuZmlyc3QpICYmIGNvbXBhcmVfZGVmYXVsdHMobmV3TWFwUGFpci5zZWNvbmQsIG9sZE1hcFBhaXIuc2Vjb25kKTsKLX0gICAKLQotLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zICd0cnVlJyBpZiB0aGUgZGVmYXVsdCB2YWx1ZXMgYXJlIHNhbWUuIFJldHVybnMgZmFsc2UgaWYgdGhleSBhcmUgZGlmZmVyZW50LgotYm9vbCBjb21wYXJlX2RlZmF1bHRzKHRfY29uc3RfdmFsdWUqIG5ld1N0cnVjdERlZmF1bHQsIHRfY29uc3RfdmFsdWUqIG9sZFN0cnVjdERlZmF1bHQpCi17Ci0gICBpZihuZXdTdHJ1Y3REZWZhdWx0ID09IE5VTEwgJiYgb2xkU3RydWN0RGVmYXVsdCA9PSBOVUxMKSByZXR1cm4gdHJ1ZTsKLSAgIGVsc2UgaWYobmV3U3RydWN0RGVmYXVsdCA9PSBOVUxMICYmIG9sZFN0cnVjdERlZmF1bHQgIT0gTlVMTCkgcmV0dXJuIGZhbHNlOwotICAgZWxzZSBpZiAobmV3U3RydWN0RGVmYXVsdCAhPSBOVUxMICYmIG9sZFN0cnVjdERlZmF1bHQgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOwotCi0gICBpZihuZXdTdHJ1Y3REZWZhdWx0LT5nZXRfdHlwZSgpICE9IG9sZFN0cnVjdERlZmF1bHQtPmdldF90eXBlKCkpCi0gICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICB9Ci0KLSAgIHN3aXRjaChuZXdTdHJ1Y3REZWZhdWx0LT5nZXRfdHlwZSgpKQotICAgewotICAgICAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSOgotICAgICAgICAgcmV0dXJuIChuZXdTdHJ1Y3REZWZhdWx0LT5nZXRfaW50ZWdlcigpID09IG9sZFN0cnVjdERlZmF1bHQtPmdldF9pbnRlZ2VyKCkpOwotICAgICAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9ET1VCTEU6Ci0gICAgICAgICByZXR1cm4gKG5ld1N0cnVjdERlZmF1bHQtPmdldF9kb3VibGUoKSA9PSBvbGRTdHJ1Y3REZWZhdWx0LT5nZXRfZG91YmxlKCkpOwotICAgICAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9TVFJJTkc6Ci0gICAgICAgICByZXR1cm4gKG5ld1N0cnVjdERlZmF1bHQtPmdldF9zdHJpbmcoKSA9PSBvbGRTdHJ1Y3REZWZhdWx0LT5nZXRfc3RyaW5nKCkpOwotICAgICAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9MSVNUOgotICAgICAgICAgewotICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiBvbGREZWZhdWx0TGlzdCA9IG9sZFN0cnVjdERlZmF1bHQtPmdldF9saXN0KCk7Ci0gICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIG5ld0RlZmF1bHRMaXN0ID0gbmV3U3RydWN0RGVmYXVsdC0+Z2V0X2xpc3QoKTsKLSAgICAgICAgICAgIGJvb2wgZGVmYXVsdFZhbHVlc0NvbXBhcmUgPSAob2xkRGVmYXVsdExpc3Quc2l6ZSgpID09IG5ld0RlZmF1bHRMaXN0LnNpemUoKSk7Ci0KLSAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWVzQ29tcGFyZSAmJiBzdGQ6OmVxdWFsKG5ld0RlZmF1bHRMaXN0LmJlZ2luKCksIG5ld0RlZmF1bHRMaXN0LmVuZCgpLCBvbGREZWZhdWx0TGlzdC5iZWdpbigpLCBjb21wYXJlX2RlZmF1bHRzKTsKLSAgICAgICAgIH0KLSAgICAgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfTUFQOgotICAgICAgICAgewotICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiBuZXdNYXAgPSBuZXdTdHJ1Y3REZWZhdWx0LT5nZXRfbWFwKCk7Ci0gICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+IG9sZE1hcCA9IG9sZFN0cnVjdERlZmF1bHQtPmdldF9tYXAoKTsKLQotICAgICAgICAgICAgYm9vbCBkZWZhdWx0VmFsdWVzQ29tcGFyZSA9IChvbGRNYXAuc2l6ZSgpID09IG5ld01hcC5zaXplKCkpOwotCi0gICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlc0NvbXBhcmUgJiYgc3RkOjplcXVhbChuZXdNYXAuYmVnaW4oKSwgbmV3TWFwLmVuZCgpLCBvbGRNYXAuYmVnaW4oKSwgY29tcGFyZV9wYWlyKTsKLSAgICAgICAgIH0KLSAgICAgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfSURFTlRJRklFUjoKLSAgICAgICAgIHJldHVybiAobmV3U3RydWN0RGVmYXVsdC0+Z2V0X2lkZW50aWZpZXIoKSA9PSBvbGRTdHJ1Y3REZWZhdWx0LT5nZXRfaWRlbnRpZmllcigpKTsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICB9Ci0KLX0KLQotdm9pZCBjb21wYXJlX3N0cnVjdF9maWVsZCh0X2ZpZWxkKiBuZXdGaWVsZCwgdF9maWVsZCogb2xkRmllbGQsIHN0ZDo6c3RyaW5nIG9sZFN0cnVjdE5hbWUpCi17Ci0gICB0X3R5cGUqIG5ld0ZpZWxkVHlwZSA9IG5ld0ZpZWxkLT5nZXRfdHlwZSgpOwotICAgdF90eXBlKiBvbGRGaWVsZFR5cGUgPSBvbGRGaWVsZC0+Z2V0X3R5cGUoKTsKLSAgIGlmKCFjb21wYXJlX3R5cGUobmV3RmllbGRUeXBlLCBvbGRGaWVsZFR5cGUpKQotICAgewotICAgICAgdGhyaWZ0X2F1ZGl0X2ZhaWx1cmUoIlN0cnVjdCBGaWVsZCBUeXBlIENoYW5nZWQgZm9yIElkID0gJWQgaW4gJXMgXG4iLCBuZXdGaWVsZC0+Z2V0X2tleSgpLCBvbGRTdHJ1Y3ROYW1lLmNfc3RyKCkpOwotICAgfQotCi0gICAvLyBBIFN0cnVjdCBtZW1iZXIgY2FuIGJlIG9wdGlvbmFsIGlmIGl0IGlzIG1lbnRpb25lZCBleHBsaWNpdGx5LCBvciBpZiBpdCBpcyBhc3NpZ25lZCB3aXRoIGRlZmF1bHQgdmFsdWVzLgotICAgYm9vbCBuZXdTdHJ1Y3RGaWVsZE9wdGlvbmFsID0gKG5ld0ZpZWxkLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCk7Ci0gICBib29sIG9sZFN0cnVjdEZpZWxkT3B0aW9uYWwgPSAob2xkRmllbGQtPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKTsKLQotICAgaWYobmV3U3RydWN0RmllbGRPcHRpb25hbCAhPSBvbGRTdHJ1Y3RGaWVsZE9wdGlvbmFsKQotICAgewotICAgICAgdGhyaWZ0X2F1ZGl0X2ZhaWx1cmUoIlN0cnVjdCBGaWVsZCBSZXF1aXJlZG5lc3MgQ2hhbmdlZCBmb3IgSWQgPSAlZCBpbiAlcyBcbiIsIG5ld0ZpZWxkLT5nZXRfa2V5KCksIG9sZFN0cnVjdE5hbWUuY19zdHIoKSk7Ci0gICB9Ci0gICBpZihuZXdTdHJ1Y3RGaWVsZE9wdGlvbmFsIHx8IG9sZFN0cnVjdEZpZWxkT3B0aW9uYWwpCi0gICB7Ci0gICAgICBpZighY29tcGFyZV9kZWZhdWx0cyhuZXdGaWVsZC0+Z2V0X3ZhbHVlKCksIG9sZEZpZWxkLT5nZXRfdmFsdWUoKSkpCi0gICAgICB7Ci0gICAgICAgICB0aHJpZnRfYXVkaXRfd2FybmluZygxLCAiRGVmYXVsdCB2YWx1ZSBjaGFuZ2VkIGZvciBJZCA9ICVkIGluICVzIFxuIiwgbmV3RmllbGQtPmdldF9rZXkoKSwgb2xkU3RydWN0TmFtZS5jX3N0cigpKTsKLSAgICAgIH0KLSAgIH0KLQotICAgc3RkOjpzdHJpbmcgZmllbGROYW1lID0gbmV3RmllbGQtPmdldF9uYW1lKCk7Ci0gICBpZihmaWVsZE5hbWUgIT0gb2xkRmllbGQtPmdldF9uYW1lKCkpCi0gICB7Ci0gICAgICB0aHJpZnRfYXVkaXRfd2FybmluZygxLCAiU3RydWN0IGZpZWxkIG5hbWUgY2hhbmdlZCBmb3IgSWQgPSAlZCBpbiAlc1xuIiwgbmV3RmllbGQtPmdldF9rZXkoKSwgb2xkU3RydWN0TmFtZS5jX3N0cigpKTsKLSAgIH0KLQotfQotCi12b2lkIGNvbXBhcmVfc2luZ2xlX3N0cnVjdCh0X3N0cnVjdCogbmV3U3RydWN0LCB0X3N0cnVjdCogb2xkU3RydWN0LCBjb25zdCBzdGQ6OnN0cmluZyYgb2xkU3RydWN0TmFtZSA9IHN0ZDo6c3RyaW5nKCkpCi17Ci0gICBzdGQ6OnN0cmluZyBzdHJ1Y3ROYW1lID0gb2xkU3RydWN0TmFtZS5lbXB0eSgpID8gb2xkU3RydWN0LT5nZXRfbmFtZSgpIDogb2xkU3RydWN0TmFtZTsKLSAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgb2xkU3RydWN0TWVtYmVyc0luSWRPcmRlciA9IG9sZFN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7Ci0gICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIG5ld1N0cnVjdE1lbWJlcnNJbklkT3JkZXIgPSBuZXdTdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOwotICAgc3RkOjp2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBvbGRTdHJ1Y3RNZW1iZXJJdCA9IG9sZFN0cnVjdE1lbWJlcnNJbklkT3JkZXIuYmVnaW4oKTsKLSAgIHN0ZDo6dmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbmV3U3RydWN0TWVtYmVySXQgPSBuZXdTdHJ1Y3RNZW1iZXJzSW5JZE9yZGVyLmJlZ2luKCk7Ci0KLSAgIC8vIFNpbmNlIHdlIGhhdmUgdGhlIHN0cnVjdCBtZW1iZXJzIGluIHRoZWlyIElEIG9yZGVyLCBjb21wYXJpbmcgdGhlaXIgSURzIGNhbiBiZSBkb25lIGJ5IHRyYXZlcnNpbmcgdGhlIHR3byBtZW1iZXIKLSAgIC8vIGxpc3RzIHRvZ2V0aGVyLiAgCi0gICB3aGlsZSghKG9sZFN0cnVjdE1lbWJlckl0ID09IG9sZFN0cnVjdE1lbWJlcnNJbklkT3JkZXIuZW5kKCkgJiYgbmV3U3RydWN0TWVtYmVySXQgPT0gbmV3U3RydWN0TWVtYmVyc0luSWRPcmRlci5lbmQoKSkpCi0gICB7Ci0gICAgICBpZihuZXdTdHJ1Y3RNZW1iZXJJdCA9PSBuZXdTdHJ1Y3RNZW1iZXJzSW5JZE9yZGVyLmVuZCgpICYmIG9sZFN0cnVjdE1lbWJlckl0ICE9IG9sZFN0cnVjdE1lbWJlcnNJbklkT3JkZXIuZW5kKCkpCi0gICAgICB7Ci0gICAgICAgICAvLyBBIGZpZWxkIElEIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgZW5kLgotICAgICAgICAgdGhyaWZ0X2F1ZGl0X2ZhaWx1cmUoIlN0cnVjdCBGaWVsZCByZW1vdmVkIGZvciBJZCA9ICVkIGluICVzIFxuIiwgKCpvbGRTdHJ1Y3RNZW1iZXJJdCktPmdldF9rZXkoKSwgc3RydWN0TmFtZS5jX3N0cigpKTsKLSAgICAgICAgIG9sZFN0cnVjdE1lbWJlckl0Kys7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmKG5ld1N0cnVjdE1lbWJlckl0ICE9IG5ld1N0cnVjdE1lbWJlcnNJbklkT3JkZXIuZW5kKCkgJiYgb2xkU3RydWN0TWVtYmVySXQgPT0gb2xkU3RydWN0TWVtYmVyc0luSWRPcmRlci5lbmQoKSkKLSAgICAgIHsKLSAgICAgICAgIC8vTmV3IGZpZWxkIElEIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBlbmQuCi0gICAgICAgICBpZigoKm5ld1N0cnVjdE1lbWJlckl0KS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpCi0gICAgICAgICB7Ci0gICAgICAgICAgICB0aHJpZnRfYXVkaXRfZmFpbHVyZSgiUmVxdWlyZWQgU3RydWN0IEZpZWxkIEFkZGVkIGZvciBJZCA9ICVkIGluICVzIFxuIiwgKCpuZXdTdHJ1Y3RNZW1iZXJJdCktPmdldF9rZXkoKSwgc3RydWN0TmFtZS5jX3N0cigpKTsKLSAgICAgICAgIH0KLSAgICAgICAgIG5ld1N0cnVjdE1lbWJlckl0Kys7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmKCgqbmV3U3RydWN0TWVtYmVySXQpLT5nZXRfa2V5KCkgPT0gKCpvbGRTdHJ1Y3RNZW1iZXJJdCktPmdldF9rZXkoKSkKLSAgICAgIHsKLSAgICAgICAgIC8vRmllbGQgSUQgZm91bmQgaW4gYm90aCBzdHJ1Y3RzLiBDb21wYXJlIGZpZWxkIHR5cGVzLCBkZWZhdWx0IHZhbHVlcy4KLSAgICAgICAgIGNvbXBhcmVfc3RydWN0X2ZpZWxkKCpuZXdTdHJ1Y3RNZW1iZXJJdCwgKm9sZFN0cnVjdE1lbWJlckl0LCBzdHJ1Y3ROYW1lKTsKLQotICAgICAgICAgbmV3U3RydWN0TWVtYmVySXQrKzsKLSAgICAgICAgIG9sZFN0cnVjdE1lbWJlckl0Kys7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmKCgqbmV3U3RydWN0TWVtYmVySXQpLT5nZXRfa2V5KCkgPCAoKm9sZFN0cnVjdE1lbWJlckl0KS0+Z2V0X2tleSgpKQotICAgICAgewotICAgICAgICAgLy9OZXcgRmllbGQgSWQgaXMgaW5zZXJ0ZWQgaW4gYmV0d2VlbgotICAgICAgICAgLy9BZGRpbmcgZmllbGRzIHRvIHN0cnVjdCBpcyBmaW5lLCBidXQgYWRkaW5nIHRoZW0gaW4gdGhlIG1pZGRsZSBpcyBzdXNwaWNpb3VzLiBFcnJvciEhCi0gICAgICAgICB0aHJpZnRfYXVkaXRfZmFpbHVyZSgiU3RydWN0IGZpZWxkIGlzIGFkZGVkIGluIHRoZSBtaWRkbGUgd2l0aCBJZCA9ICVkIGluICVzXG4iLCAgKCpuZXdTdHJ1Y3RNZW1iZXJJdCktPmdldF9rZXkoKSwgIHN0cnVjdE5hbWUuY19zdHIoKSk7Ci0gICAgICAgICBuZXdTdHJ1Y3RNZW1iZXJJdCsrOwotICAgICAgfQotICAgICAgZWxzZSBpZigoKm5ld1N0cnVjdE1lbWJlckl0KS0+Z2V0X2tleSgpID4gKCpvbGRTdHJ1Y3RNZW1iZXJJdCktPmdldF9rZXkoKSkKLSAgICAgIHsKLSAgICAgICAgIC8vQSBmaWVsZCBpcyBkZWxldGVkIGluIG5ld1N0cnVjdC4KLSAgICAgICAgIHRocmlmdF9hdWRpdF9mYWlsdXJlKCJTdHJ1Y3QgRmllbGQgcmVtb3ZlZCBmb3IgSWQgPSAlZCBpbiAlcyBcbiIsICAoKm9sZFN0cnVjdE1lbWJlckl0KS0+Z2V0X2tleSgpLCBzdHJ1Y3ROYW1lLmNfc3RyKCkpOwotICAgICAgICAgb2xkU3RydWN0TWVtYmVySXQrKzsKLSAgICAgIH0KLQotICAgfQotfQotCi12b2lkIGNvbXBhcmVfc3RydWN0cyhjb25zdCBzdGQ6OnZlY3Rvcjx0X3N0cnVjdCo+JiBuZXdTdHJ1Y3RMaXN0LCBjb25zdCBzdGQ6OnZlY3Rvcjx0X3N0cnVjdCo+JiBvbGRTdHJ1Y3RMaXN0KQotewotICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsdF9zdHJ1Y3QqPiBuZXdTdHJ1Y3RNYXA7Ci0gICBzdGQ6OnZlY3Rvcjx0X3N0cnVjdCo+Ojpjb25zdF9pdGVyYXRvciBuZXdTdHJ1Y3RMaXN0SXQ7Ci0gICBmb3IobmV3U3RydWN0TGlzdEl0ID0gbmV3U3RydWN0TGlzdC5iZWdpbigpOyBuZXdTdHJ1Y3RMaXN0SXQgIT0gbmV3U3RydWN0TGlzdC5lbmQoKTsgbmV3U3RydWN0TGlzdEl0KyspCi0gICB7Ci0gICAgICBuZXdTdHJ1Y3RNYXBbKCpuZXdTdHJ1Y3RMaXN0SXQpLT5nZXRfbmFtZSgpXSA9ICpuZXdTdHJ1Y3RMaXN0SXQ7Ci0gICB9Ci0KLSAgIHN0ZDo6dmVjdG9yPHRfc3RydWN0Kj46OmNvbnN0X2l0ZXJhdG9yIG9sZFN0cnVjdExpc3RJdDsKLSAgIGZvcihvbGRTdHJ1Y3RMaXN0SXQgPSBvbGRTdHJ1Y3RMaXN0LmJlZ2luKCk7IG9sZFN0cnVjdExpc3RJdCAhPSBvbGRTdHJ1Y3RMaXN0LmVuZCgpOyBvbGRTdHJ1Y3RMaXN0SXQrKykKLSAgIHsKLSAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB0X3N0cnVjdCo+OjppdGVyYXRvciBuZXdTdHJ1Y3RNYXBJdDsKLSAgICAgIG5ld1N0cnVjdE1hcEl0ID0gbmV3U3RydWN0TWFwLmZpbmQoKCpvbGRTdHJ1Y3RMaXN0SXQpLT5nZXRfbmFtZSgpKTsKLSAgICAgIGlmKG5ld1N0cnVjdE1hcEl0ID09IG5ld1N0cnVjdE1hcC5lbmQoKSkKLSAgICAgIHsKLSAgICAgICAgIHRocmlmdF9hdWRpdF9mYWlsdXJlKCJTdHJ1Y3QgJXMgbm90IGZvdW5kIGluIG5ldyB0aHJpZnQgZmlsZVxuIiwgKCpvbGRTdHJ1Y3RMaXN0SXQpLT5nZXRfbmFtZSgpLmNfc3RyKCkpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAgY29tcGFyZV9zaW5nbGVfc3RydWN0KG5ld1N0cnVjdE1hcEl0LT5zZWNvbmQsICpvbGRTdHJ1Y3RMaXN0SXQpOwotICAgICAgfQotICAgfQotCi19Ci0KLXZvaWQgY29tcGFyZV9zaW5nbGVfZnVuY3Rpb24odF9mdW5jdGlvbiogbmV3RnVuY3Rpb24sIHRfZnVuY3Rpb24qIG9sZEZ1bmN0aW9uKQotewotICAgdF90eXBlKiBuZXdGdW5jdGlvblJldHVyblR5cGUgPSBuZXdGdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKLQotICAgaWYobmV3RnVuY3Rpb24tPmlzX29uZXdheSgpICE9IG9sZEZ1bmN0aW9uLT5pc19vbmV3YXkoKSkKLSAgIHsKLSAgICAgIHRocmlmdF9hdWRpdF9mYWlsdXJlKCJPbmV3YXkgYXR0cmlidXRlIGNoYW5nZWQgZm9yIGZ1bmN0aW9uICVzXG4iLG9sZEZ1bmN0aW9uLT5nZXRfbmFtZSgpLmNfc3RyKCkpOwotICAgfQotICAgaWYoIWNvbXBhcmVfdHlwZShuZXdGdW5jdGlvblJldHVyblR5cGUsIG9sZEZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSkKLSAgIHsKLSAgICAgIHRocmlmdF9hdWRpdF9mYWlsdXJlKCJSZXR1cm4gdHlwZSBjaGFuZ2VkIGZvciBmdW5jdGlvbiAlc1xuIixvbGRGdW5jdGlvbi0+Z2V0X25hbWUoKS5jX3N0cigpKTsKLSAgIH0KLQotICAgLy9Db21wYXJlIGZ1bmN0aW9uIGFyZ3VtZW50cy4KLSAgIGNvbXBhcmVfc2luZ2xlX3N0cnVjdChuZXdGdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSwgb2xkRnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpOwotICAgc3RkOjpzdHJpbmcgZXhjZXB0aW9uTmFtZSA9IG9sZEZ1bmN0aW9uLT5nZXRfbmFtZSgpOwotICAgZXhjZXB0aW9uTmFtZSArPSAiX2V4Y2VwdGlvbiI7Ci0gICBjb21wYXJlX3NpbmdsZV9zdHJ1Y3QobmV3RnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKSwgb2xkRnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKSwgZXhjZXB0aW9uTmFtZSk7Ci19Ci0KLXZvaWQgY29tcGFyZV9mdW5jdGlvbnMoY29uc3Qgc3RkOjp2ZWN0b3I8dF9mdW5jdGlvbio+JiBuZXdGdW5jdGlvbkxpc3QsIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZnVuY3Rpb24qPiYgb2xkRnVuY3Rpb25MaXN0KQotewotICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHRfZnVuY3Rpb24qPiBuZXdGdW5jdGlvbk1hcDsKLSAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIG5ld0Z1bmN0aW9uTWFwSXQ7Ci0gICBmb3Ioc3RkOjp2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBuZXdGdW5jdGlvbkl0ID0gbmV3RnVuY3Rpb25MaXN0LmJlZ2luKCk7Ci0gICAgICAgICBuZXdGdW5jdGlvbkl0ICE9IG5ld0Z1bmN0aW9uTGlzdC5lbmQoKTsKLSAgICAgICAgIG5ld0Z1bmN0aW9uSXQrKykKLSAgIHsKLSAgICAgIG5ld0Z1bmN0aW9uTWFwWygqbmV3RnVuY3Rpb25JdCktPmdldF9uYW1lKCldID0gKm5ld0Z1bmN0aW9uSXQ7Ci0gICB9Ci0KLSAgIGZvcihzdGQ6OnZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIG9sZEZ1bmN0aW9uSXQgPSBvbGRGdW5jdGlvbkxpc3QuYmVnaW4oKTsKLSAgICAgICAgIG9sZEZ1bmN0aW9uSXQgIT0gb2xkRnVuY3Rpb25MaXN0LmVuZCgpOwotICAgICAgICAgb2xkRnVuY3Rpb25JdCsrKQotICAgewotICAgICAgbmV3RnVuY3Rpb25NYXBJdCA9IG5ld0Z1bmN0aW9uTWFwLmZpbmQoKCpvbGRGdW5jdGlvbkl0KS0+Z2V0X25hbWUoKSk7Ci0gICAgICBpZihuZXdGdW5jdGlvbk1hcEl0ID09IG5ld0Z1bmN0aW9uTWFwLmVuZCgpKQotICAgICAgewotICAgICAgICAgdGhyaWZ0X2F1ZGl0X2ZhaWx1cmUoIk5ldyBUaHJpZnQgRmlsZSBoYXMgbWlzc2luZyBmdW5jdGlvbiAlc1xuIiwoKm9sZEZ1bmN0aW9uSXQpLT5nZXRfbmFtZSgpLmNfc3RyKCkpOwotICAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICAvL0Z1bmN0aW9uIGlzIGZvdW5kIGluIGJvdGggdGhyaWZ0IGZpbGVzLiBDb21wYXJlIHJldHVybiB0eXBlIGFuZCBhcmd1bWVudCBsaXN0Ci0gICAgICAgICBjb21wYXJlX3NpbmdsZV9mdW5jdGlvbihuZXdGdW5jdGlvbk1hcEl0LT5zZWNvbmQsICpvbGRGdW5jdGlvbkl0KTsKLSAgICAgIH0KLSAgIH0KLQotfQotCi12b2lkIGNvbXBhcmVfc2VydmljZXMoY29uc3Qgc3RkOjp2ZWN0b3I8dF9zZXJ2aWNlKj4mIG5ld1NlcnZpY2VzLCBjb25zdCBzdGQ6OnZlY3Rvcjx0X3NlcnZpY2UqPiYgb2xkU2VydmljZXMpCi17Ci0gICBzdGQ6OnZlY3Rvcjx0X3NlcnZpY2UqPjo6Y29uc3RfaXRlcmF0b3Igb2xkU2VydmljZUl0OwotCi0gICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgdF9zZXJ2aWNlKj4gbmV3U2VydmljZU1hcDsKLSAgIGZvcihzdGQ6OnZlY3Rvcjx0X3NlcnZpY2UqPjo6Y29uc3RfaXRlcmF0b3IgbmV3U2VydmljZUl0ID0gbmV3U2VydmljZXMuYmVnaW4oKTsKLSAgICAgICAgIG5ld1NlcnZpY2VJdCAhPSBuZXdTZXJ2aWNlcy5lbmQoKTsKLSAgICAgICAgIG5ld1NlcnZpY2VJdCsrKQotICAgewotICAgICAgbmV3U2VydmljZU1hcFsoKm5ld1NlcnZpY2VJdCktPmdldF9uYW1lKCldID0gKm5ld1NlcnZpY2VJdDsKLSAgIH0KLQotCi0gICBmb3Iob2xkU2VydmljZUl0ID0gb2xkU2VydmljZXMuYmVnaW4oKTsgb2xkU2VydmljZUl0ICE9IG9sZFNlcnZpY2VzLmVuZCgpOyBvbGRTZXJ2aWNlSXQrKykKLSAgIHsKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG9sZFNlcnZpY2VOYW1lID0gKCpvbGRTZXJ2aWNlSXQpLT5nZXRfbmFtZSgpOwotICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHRfc2VydmljZSo+OjppdGVyYXRvciBuZXdTZXJ2aWNlTWFwSXQgPSBuZXdTZXJ2aWNlTWFwLmZpbmQob2xkU2VydmljZU5hbWUpOwotCi0gICAgICBpZihuZXdTZXJ2aWNlTWFwSXQgPT0gbmV3U2VydmljZU1hcC5lbmQoKSkKLSAgICAgIHsKLSAgICAgICAgIHRocmlmdF9hdWRpdF9mYWlsdXJlKCJOZXcgVGhyaWZ0IGZpbGUgaXMgbWlzc2luZyBhIHNlcnZpY2UgJXNcbiIsIG9sZFNlcnZpY2VOYW1lLmNfc3RyKCkpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAgdF9zZXJ2aWNlKiBvbGRTZXJ2aWNlRXh0ZW5kcyA9ICgqb2xkU2VydmljZUl0KS0+Z2V0X2V4dGVuZHMoKTsKLSAgICAgICAgIHRfc2VydmljZSogbmV3U2VydmljZUV4dGVuZHMgPSAobmV3U2VydmljZU1hcEl0LT5zZWNvbmQpLT5nZXRfZXh0ZW5kcygpOwotCi0gICAgICAgICBpZihvbGRTZXJ2aWNlRXh0ZW5kcyA9PSBOVUxMKQotICAgICAgICAgewotICAgICAgICAgICAgLy8gSXQgaXMgZmluZSB0byBhZGQgZXh0ZW5kcy4gU28gaWYgc2VydmljZSBpbiBvbGRlciB0aHJpZnQgZGlkIG5vdCBoYXZlIGFueSBleHRlbmRzLCB3ZSBhcmUgZmluZS4KLSAgICAgICAgICAgIC8vIERPIE5vdGhpbmcKLSAgICAgICAgIH0KLSAgICAgICAgIGVsc2UgaWYob2xkU2VydmljZUV4dGVuZHMgIT0gTlVMTCAmJiBuZXdTZXJ2aWNlRXh0ZW5kcyA9PSBOVUxMKQotICAgICAgICAgewotICAgICAgICAgICAgdGhyaWZ0X2F1ZGl0X2ZhaWx1cmUoIkNoYW5nZSBpbiBTZXJ2aWNlIGluaGVyaXRhbmNlIGZvciAlc1xuIiwgb2xkU2VydmljZU5hbWUuY19zdHIoKSk7Ci0gICAgICAgICB9Ci0gICAgICAgICBlbHNlCi0gICAgICAgICB7Ci0gICAgICAgICAgICBzdGQ6OnN0cmluZyBvbGRFeHRlbmRzTmFtZSA9IG9sZFNlcnZpY2VFeHRlbmRzLT5nZXRfbmFtZSgpOwotICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmV3RXh0ZW5kc05hbWUgPSBuZXdTZXJ2aWNlRXh0ZW5kcy0+Z2V0X25hbWUoKTsKLQotICAgICAgICAgICAgaWYoIG5ld0V4dGVuZHNOYW1lICE9IG9sZEV4dGVuZHNOYW1lKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgdGhyaWZ0X2F1ZGl0X2ZhaWx1cmUoIkNoYW5nZSBpbiBTZXJ2aWNlIGluaGVyaXRhbmNlIGZvciAlc1xuIiwgb2xkU2VydmljZU5hbWUuY19zdHIoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGNvbXBhcmVfZnVuY3Rpb25zKChuZXdTZXJ2aWNlTWFwSXQtPnNlY29uZCktPmdldF9mdW5jdGlvbnMoKSwgKCpvbGRTZXJ2aWNlSXQpLT5nZXRfZnVuY3Rpb25zKCkpOwotICAgICAgfQotCi0gICB9Ci0KLX0KLQotdm9pZCBjb21wYXJlX2NvbnN0cyhjb25zdCBzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4mIG5ld0NvbnN0LCBjb25zdCBzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4mIG9sZENvbnN0KQotewotICAgc3RkOjp2ZWN0b3I8dF9jb25zdCo+Ojpjb25zdF9pdGVyYXRvciBuZXdDb25zdEl0OwotICAgc3RkOjp2ZWN0b3I8dF9jb25zdCo+Ojpjb25zdF9pdGVyYXRvciBvbGRDb25zdEl0OwotCi0gICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgdF9jb25zdCo+IG5ld0NvbnN0TWFwOwotCi0gICBmb3IobmV3Q29uc3RJdCA9IG5ld0NvbnN0LmJlZ2luKCk7IG5ld0NvbnN0SXQgIT0gbmV3Q29uc3QuZW5kKCk7IG5ld0NvbnN0SXQrKykKLSAgIHsKLSAgICAgIG5ld0NvbnN0TWFwWygqbmV3Q29uc3RJdCktPmdldF9uYW1lKCldID0gKm5ld0NvbnN0SXQ7Ci0gICB9Ci0KLSAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB0X2NvbnN0Kj46OmNvbnN0X2l0ZXJhdG9yIG5ld0NvbnN0TWFwSXQ7Ci0gICBmb3Iob2xkQ29uc3RJdCA9IG9sZENvbnN0LmJlZ2luKCk7IG9sZENvbnN0SXQgIT0gb2xkQ29uc3QuZW5kKCk7IG9sZENvbnN0SXQrKykKLSAgIHsKLSAgICAgIG5ld0NvbnN0TWFwSXQgPSBuZXdDb25zdE1hcC5maW5kKCgqb2xkQ29uc3RJdCktPmdldF9uYW1lKCkpOwotICAgICAgaWYobmV3Q29uc3RNYXBJdCA9PSBuZXdDb25zdE1hcC5lbmQoKSkKLSAgICAgIHsKLSAgICAgICAgIHRocmlmdF9hdWRpdF93YXJuaW5nKDEsICJDb25zdGFudHMgTWlzc2luZyAlcyBcbiIsICgoKm9sZENvbnN0SXQpLT5nZXRfbmFtZSgpKS5jX3N0cigpKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYoIWNvbXBhcmVfdHlwZSgobmV3Q29uc3RNYXBJdC0+c2Vjb25kKS0+Z2V0X3R5cGUoKSwgKCpvbGRDb25zdEl0KS0+Z2V0X3R5cGUoKSkpCi0gICAgICB7Ci0gICAgICAgICB0aHJpZnRfYXVkaXRfd2FybmluZygxLCAiQ29uc3RhbnQgJXMgaXMgb2YgZGlmZmVyZW50IHR5cGUgXG4iLCAoKCpvbGRDb25zdEl0KS0+Z2V0X25hbWUoKSkuY19zdHIoKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmKCFjb21wYXJlX2RlZmF1bHRzKChuZXdDb25zdE1hcEl0LT5zZWNvbmQpLT5nZXRfdmFsdWUoKSwgKCpvbGRDb25zdEl0KS0+Z2V0X3ZhbHVlKCkpKQotICAgICAgewotICAgICAgICAgdGhyaWZ0X2F1ZGl0X3dhcm5pbmcoMSwgIkNvbnN0YW50ICVzIGhhcyBkaWZmZXJlbnQgdmFsdWVcbiIsICgoKm9sZENvbnN0SXQpLT5nZXRfbmFtZSgpKS5jX3N0cigpKTsKLSAgICAgIH0KLSAgIH0KLX0KLQotCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2F1ZGl0L3RfYXVkaXQuaCBiL2NvbXBpbGVyL2NwcC9zcmMvYXVkaXQvdF9hdWRpdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDAwMTNhLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvYXVkaXQvdF9hdWRpdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotI2lmbmRlZiBUX0FVRElUX0gKLSNkZWZpbmUgVF9BVURJVF9ICi0KLXZvaWQgY29tcGFyZV9uYW1lc3BhY2UodF9wcm9ncmFtKiBuZXdQcm9ncmFtLCB0X3Byb2dyYW0qIG9sZFByb2dyYW0pOwotdm9pZCBjb21wYXJlX2VudW1zKGNvbnN0IHN0ZDo6dmVjdG9yPHRfZW51bSo+JiBuZXdFbnVtTGlzdCwgY29uc3Qgc3RkOjp2ZWN0b3I8dF9lbnVtKj4mIG9sZEVudW1MaXN0KTsKLWJvb2wgY29tcGFyZV9kZWZhdWx0cyh0X2NvbnN0X3ZhbHVlKiBuZXdTdHJ1Y3REZWZhdWx0LCB0X2NvbnN0X3ZhbHVlKiBvbGRTdHJ1Y3REZWZhdWx0KTsKLXZvaWQgY29tcGFyZV9zdHJ1Y3RzKGNvbnN0IHN0ZDo6dmVjdG9yPHRfc3RydWN0Kj4mIG5ld1N0cnVjdExpc3QsIGNvbnN0IHN0ZDo6dmVjdG9yPHRfc3RydWN0Kj4mIG9sZFN0cnVjdExpc3QpOwotdm9pZCBjb21wYXJlX3NlcnZpY2VzKGNvbnN0IHN0ZDo6dmVjdG9yPHRfc2VydmljZSo+JiBuZXdTZXJ2aWNlcywgY29uc3Qgc3RkOjp2ZWN0b3I8dF9zZXJ2aWNlKj4mIG9sZFNlcnZpY2VzKTsKLXZvaWQgY29tcGFyZV9jb25zdHMoY29uc3Qgc3RkOjp2ZWN0b3I8dF9jb25zdCo+JiBuZXdDb25zdCwgY29uc3Qgc3RkOjp2ZWN0b3I8dF9jb25zdCo+JiBvbGRDb25zdCk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2FzM19nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfYXMzX2dlbmVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM0MzQzMC4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfYXMzX2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDI1NzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8Y2N0eXBlPgotCi0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzdGRleGNlcHQ+Ci0KLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotI2luY2x1ZGUgInRfb29wX2dlbmVyYXRvci5oIgotCi11c2luZyBzdGQ6Om1hcDsKLXVzaW5nIHN0ZDo6b2ZzdHJlYW07Ci11c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Ci11c2luZyBzdGQ6OnN0cmluZzsKLXVzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwotdXNpbmcgc3RkOjp2ZWN0b3I7Ci0KLXN0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKLQotLyoqCi0gKiBBUzMgY29kZSBnZW5lcmF0b3IuCi0gKgotICovCi1jbGFzcyB0X2FzM19nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKLXB1YmxpYzoKLSAgdF9hczNfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCi0gICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgewotICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7Ci0gICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJiaW5kYWJsZSIpOwotICAgIGJpbmRhYmxlXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWFzMyI7Ci0gIH0KLQotICAvKioKLSAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcwotICAgKi8KLQotICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7Ci0gIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7Ci0KLSAgLyoqCi0gICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOwotICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOwotCi0gIHZvaWQgcHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fc3RhdGljLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVmdmFsID0gZmFsc2UpOwotICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9hczNfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9hczNfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NsYXNzID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UpOwotICAvLyByZW1vdmVkIC0tIGVxdWFsaXR5LGNvbXBhcmVfdG8KLSAgdm9pZCBnZW5lcmF0ZV9hczNfc3RydWN0X3JlYWRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9hczNfdmFsaWRhdG9yKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2FzM19zdHJ1Y3RfcmVzdWx0X3dyaXRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9hczNfc3RydWN0X3dyaXRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9hczNfc3RydWN0X3Rvc3RyaW5nKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgYmluZGFibGUpOwotICB2b2lkIGdlbmVyYXRlX2FzM19tZXRhX2RhdGFfbWFwKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIGdldF9hczNfdHlwZV9zdHJpbmcodF90eXBlKiB0eXBlKTsKLSAgdm9pZCBnZW5lcmF0ZV9yZWZsZWN0aW9uX3NldHRlcnMoc3RkOjpvc3RyaW5nc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUpOwotICB2b2lkIGdlbmVyYXRlX3JlZmxlY3Rpb25fZ2V0dGVycyhzdGQ6Om9zdHJpbmdzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfZ2VuZXJpY19maWVsZF9nZXR0ZXJzX3NldHRlcnMoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZ2VuZXJpY19pc3NldF9tZXRob2Qoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfYXMzX2JlYW5fYm9pbGVycGxhdGUoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBiaW5kYWJsZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0gIHN0ZDo6c3RyaW5nIGdldF9jYXBfbmFtZShzdGQ6OnN0cmluZyBuYW1lKTsKLSAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVfaXNzZXRfY2hlY2sodF9maWVsZCogZmllbGQpOwotICBzdGQ6OnN0cmluZyBnZW5lcmF0ZV9pc3NldF9jaGVjayhzdGQ6OnN0cmluZyBmaWVsZCk7Ci0gIHZvaWQgZ2VuZXJhdGVfaXNzZXRfc2V0KG9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKTsKLSAgLy8gcmVtb3ZlZCBzdGQ6OnN0cmluZyBpc3NldF9maWVsZF9pZCh0X2ZpZWxkKiBmaWVsZCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gIC8qKgotICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1hcCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9hczNfZG9jKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpOwotCi0gIHZvaWQgZ2VuZXJhdGVfYXMzX2RvYyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRkb2MpOwotCi0gIC8qKgotICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucwotICAgKi8KLQotICBzdGQ6OnN0cmluZyBhczNfcGFja2FnZSgpOwotICBzdGQ6OnN0cmluZyBhczNfdHlwZV9pbXBvcnRzKCk7Ci0gIHN0ZDo6c3RyaW5nIGFzM190aHJpZnRfaW1wb3J0cygpOwotICBzdGQ6OnN0cmluZyBhczNfdGhyaWZ0X2dlbl9pbXBvcnRzKHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcmIGltcG9ydHMpOwotICBzdGQ6OnN0cmluZyBhczNfdGhyaWZ0X2dlbl9pbXBvcnRzKHRfc2VydmljZSogdHNlcnZpY2UpOwotICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl9jb250YWluZXIgPSBmYWxzZSwgYm9vbCBpbl9pbml0ID0gZmFsc2UpOwotICBzdGQ6OnN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdGJhc2UsIGJvb2wgaW5fY29udGFpbmVyID0gZmFsc2UpOwotICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0ID0gZmFsc2UpOwotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0gIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIGdldF9lbnVtX2NsYXNzX25hbWUodF90eXBlKiB0eXBlKTsKLQotICBib29sIHR5cGVfY2FuX2JlX251bGwodF90eXBlKiB0dHlwZSkgewotICAgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7Ci0KLSAgICByZXR1cm4gdHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKQotICAgICAgICAgICB8fCB0dHlwZS0+aXNfc3RyaW5nKCk7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBjb25zdGFudF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpOwotCi1wcml2YXRlOgotICAvKioKLSAgICogRmlsZSBzdHJlYW1zCi0gICAqLwotCi0gIHN0ZDo6c3RyaW5nIHBhY2thZ2VfbmFtZV87Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9zZXJ2aWNlXzsKLSAgc3RkOjpzdHJpbmcgcGFja2FnZV9kaXJfOwotCi0gIGJvb2wgYmluZGFibGVfOwotfTsKLQotLyoqCi0gKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAotICogc3RyZWFtcy4KLSAqCi0gKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgewotICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKLSAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKLSAgcGFja2FnZV9uYW1lXyA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJhczMiKTsKLQotICBzdHJpbmcgZGlyID0gcGFja2FnZV9uYW1lXzsKLSAgc3RyaW5nIHN1YmRpciA9IGdldF9vdXRfZGlyKCk7Ci0gIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKLSAgd2hpbGUgKChsb2MgPSBkaXIuZmluZCgiLiIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICBzdWJkaXIgPSBzdWJkaXIgKyAiLyIgKyBkaXIuc3Vic3RyKDAsIGxvYyk7Ci0gICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOwotICAgIGRpciA9IGRpci5zdWJzdHIobG9jICsgMSk7Ci0gIH0KLSAgaWYgKGRpci5zaXplKCkgPiAwKSB7Ci0gICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyOwotICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKLSAgfQotCi0gIHBhY2thZ2VfZGlyXyA9IHN1YmRpcjsKLX0KLQotLyoqCi0gKiBQYWNrYWdlcyB0aGUgZ2VuZXJhdGVkIGZpbGUKLSAqCi0gKiBAcmV0dXJuIFN0cmluZyBvZiB0aGUgcGFja2FnZSwgaS5lLiAicGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdGRlbW87IgotICovCi1zdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjphczNfcGFja2FnZSgpIHsKLSAgaWYgKCFwYWNrYWdlX25hbWVfLmVtcHR5KCkpIHsKLSAgICByZXR1cm4gc3RyaW5nKCJwYWNrYWdlICIpICsgcGFja2FnZV9uYW1lXyArICIgIjsKLSAgfQotICByZXR1cm4gInBhY2thZ2UgIjsKLX0KLQotLyoqCi0gKiBQcmludHMgc3RhbmRhcmQgYXMzIGltcG9ydHMKLSAqCi0gKiBAcmV0dXJuIExpc3Qgb2YgaW1wb3J0cyBmb3IgQXMzIHR5cGVzIHRoYXQgYXJlIHVzZWQgaW4gaGVyZQotICovCi1zdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjphczNfdHlwZV9pbXBvcnRzKCkgewotICByZXR1cm4gc3RyaW5nKCkgKyAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlNldDtcbiIgKyAiaW1wb3J0IGZsYXNoLnV0aWxzLkJ5dGVBcnJheTtcbiIKLSAgICAgICAgICsgImltcG9ydCBmbGFzaC51dGlscy5EaWN0aW9uYXJ5O1xuXG4iOwotfQotCi0vKioKLSAqIFByaW50cyBzdGFuZGFyZCBhczMgaW1wb3J0cwotICoKLSAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgdGhyaWZ0Ci0gKi8KLXN0cmluZyB0X2FzM19nZW5lcmF0b3I6OmFzM190aHJpZnRfaW1wb3J0cygpIHsKLSAgcmV0dXJuIHN0cmluZygpICsgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC4qO1xuIiArICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLio7XG4iCi0gICAgICAgICArICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuKjtcblxuIjsKLX0KLQotLyoqCi0gKiBQcmludHMgaW1wb3J0cyBuZWVkZWQgZm9yIGEgZ2l2ZW4gdHlwZQotICoKLSAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgYSBnaXZlbiB0X3N0cnVjdAotICovCi1zdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjphczNfdGhyaWZ0X2dlbl9pbXBvcnRzKHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcmIGltcG9ydHMpIHsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIC8vIEZvciBlYWNoIHR5cGUgY2hlY2sgaWYgaXQgaXMgZnJvbSBhIGRpZmZlcm5ldCBuYW1lc3BhY2UKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9ICgqbV9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X3Byb2dyYW0oKTsKLSAgICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKLSAgICAgIHN0cmluZyBwYWNrYWdlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiYXMzIik7Ci0gICAgICBpZiAoIXBhY2thZ2UuZW1wdHkoKSkgewotICAgICAgICBpZiAoaW1wb3J0cy5maW5kKHBhY2thZ2UgKyAiLiIgKyAoKm1faXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCkpID09IHN0cmluZzo6bnBvcykgewotICAgICAgICAgIGltcG9ydHMuYXBwZW5kKCJpbXBvcnQgIiArIHBhY2thZ2UgKyAiLiIgKyAoKm1faXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCkgKyAiO1xuIik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGltcG9ydHM7Ci19Ci0KLS8qKgotICogUHJpbnRzIGltcG9ydHMgbmVlZGVkIGZvciBhIGdpdmVuIHR5cGUKLSAqCi0gKiBAcmV0dXJuIExpc3Qgb2YgaW1wb3J0cyBuZWNlc3NhcnkgZm9yIGEgZ2l2ZW4gdF9zZXJ2aWNlCi0gKi8KLXN0cmluZyB0X2FzM19nZW5lcmF0b3I6OmFzM190aHJpZnRfZ2VuX2ltcG9ydHModF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgaW1wb3J0czsKLSAgY29uc3QgdmVjdG9yPHRfZnVuY3Rpb24qPiYgZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIC8vIEZvciBlYWNoIHR5cGUgY2hlY2sgaWYgaXQgaXMgZnJvbSBhIGRpZmZlcm5ldCBuYW1lc3BhY2UKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmdldF9wcm9ncmFtKCk7Ci0gICAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7Ci0gICAgICBzdHJpbmcgcGFja2FnZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImFzMyIpOwotICAgICAgaWYgKCFwYWNrYWdlLmVtcHR5KCkpIHsKLSAgICAgICAgaWYgKGltcG9ydHMuZmluZChwYWNrYWdlICsgIi4iICsgKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5nZXRfbmFtZSgpKSA9PSBzdHJpbmc6Om5wb3MpIHsKLSAgICAgICAgICBpbXBvcnRzLmFwcGVuZCgiaW1wb3J0ICIgKyBwYWNrYWdlICsgIi4iICsgKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyAiO1xuIik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBhczNfdGhyaWZ0X2dlbl9pbXBvcnRzKCgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSwgaW1wb3J0cyk7Ci0gICAgYXMzX3RocmlmdF9nZW5faW1wb3J0cygoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKSwgaW1wb3J0cyk7Ci0gIH0KLQotICByZXR1cm4gaW1wb3J0czsKLX0KLQotLyoqCi0gKiBOb3RoaW5nIGluIEFzMwotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgewotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gQXMzLCBzaW5jZSBpdCBkb2VzCi0gKiBub3Qgc3VwcG9ydCBhcmJpdHJhcnkgbmFtZSByZXBsYWNlbWVudHMsIGFuZCBpdCdkIGJlIGEgd2Fja3kgd2FzdGUKLSAqIG9mIG92ZXJoZWFkIHRvIG1ha2Ugd3JhcHBlciBjbGFzc2VzLgotICoKLSAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKLSAgKHZvaWQpdHR5cGVkZWY7Ci19Ci0KLS8qKgotICogRW51bXMgYXJlIGEgY2xhc3Mgd2l0aCBhIHNldCBvZiBzdGF0aWMgY29uc3RhbnRzLgotICoKLSAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgewotICAvLyBNYWtlIG91dHB1dCBmaWxlCi0gIHN0cmluZyBmX2VudW1fbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArICh0ZW51bS0+Z2V0X25hbWUoKSkgKyAiLmFzIjsKLSAgb2ZzdHJlYW0gZl9lbnVtOwotICBmX2VudW0ub3BlbihmX2VudW1fbmFtZS5jX3N0cigpKTsKLQotICAvLyBDb21tZW50IGFuZCBwYWNrYWdlIGl0Ci0gIGZfZW51bSA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBhczNfcGFja2FnZSgpIDw8IGVuZGw7Ci0KLSAgc2NvcGVfdXAoZl9lbnVtKTsKLSAgLy8gQWRkIGFzMyBpbXBvcnRzCi0gIGZfZW51bSA8PCBzdHJpbmcoKSArICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuU2V0OyIgPDwgZW5kbCA8PCAiaW1wb3J0IGZsYXNoLnV0aWxzLkRpY3Rpb25hcnk7IgotICAgICAgICAgPDwgZW5kbDsKLQotICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIGNsYXNzICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIiAiOwotICBzY29wZV91cChmX2VudW0pOwotCi0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOwotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgIGluZGVudChmX2VudW0pIDw8ICJwdWJsaWMgc3RhdGljIGNvbnN0ICIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6aW50ID0gIiA8PCB2YWx1ZSA8PCAiOyIKLSAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICB9Ci0KLSAgLy8gQ3JlYXRlIGEgc3RhdGljIFNldCB3aXRoIGFsbCB2YWxpZCB2YWx1ZXMgZm9yIHRoaXMgZW51bQotICBmX2VudW0gPDwgZW5kbDsKLQotICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIHN0YXRpYyBjb25zdCBWQUxJRF9WQUxVRVM6U2V0ID0gbmV3IFNldCgiOwotICBpbmRlbnRfdXAoKTsKLSAgYm9vbCBmaXJzdFZhbHVlID0gdHJ1ZTsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICAvLyBwb3B1bGF0ZSBzZXQKLSAgICBmX2VudW0gPDwgKGZpcnN0VmFsdWUgPyAiIiA6ICIsICIpIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICBmaXJzdFZhbHVlID0gZmFsc2U7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9lbnVtIDw8ICIpOyIgPDwgZW5kbDsKLQotICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIHN0YXRpYyBjb25zdCBWQUxVRVNfVE9fTkFNRVM6RGljdGlvbmFyeSA9IG5ldyBEaWN0aW9uYXJ5KCk7IiA8PCBlbmRsOwotCi0gIHNjb3BlX3VwKGZfZW51bSk7Ci0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaW5kZW50KGZfZW51bSkgPDwgIlZBTFVFU19UT19OQU1FU1siIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXSA9IFwiIgotICAgICAgICAgICAgICAgICAgIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCI7IiA8PCBlbmRsOwotICB9Ci0gIGZfZW51bSA8PCBlbmRsOwotCi0gIHNjb3BlX2Rvd24oZl9lbnVtKTsKLQotICBzY29wZV9kb3duKGZfZW51bSk7IC8vIGVuZCBjbGFzcwotCi0gIHNjb3BlX2Rvd24oZl9lbnVtKTsgLy8gZW5kIHBhY2thZ2UKLQotICBmX2VudW0uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBjbGFzcyB0aGF0IGhvbGRzIGFsbCB0aGUgY29uc3RhbnRzLgotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpIHsKLSAgaWYgKGNvbnN0cy5lbXB0eSgpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBwcm9ncmFtX25hbWVfICsgIkNvbnN0YW50cy5hcyI7Ci0gIG9mc3RyZWFtIGZfY29uc3RzOwotICBmX2NvbnN0cy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7Ci0KLSAgLy8gUHJpbnQgaGVhZGVyCi0gIGZfY29uc3RzIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGFzM19wYWNrYWdlKCk7Ci0KLSAgc2NvcGVfdXAoZl9jb25zdHMpOwotICBmX2NvbnN0cyA8PCBlbmRsOwotCi0gIGZfY29uc3RzIDw8IGFzM190eXBlX2ltcG9ydHMoKTsKLQotICBpbmRlbnQoZl9jb25zdHMpIDw8ICJwdWJsaWMgY2xhc3MgIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJDb25zdGFudHMgeyIgPDwgZW5kbCA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY19pdGVyOwotICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgewotICAgIHByaW50X2NvbnN0X3ZhbHVlKGZfY29uc3RzLAotICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF90eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfY29uc3RzKSA8PCAifSIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihmX2NvbnN0cyk7Ci0gIGZfY29uc3RzLmNsb3NlKCk7Ci19Ci0KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpwcmludF9jb25zdF92YWx1ZShzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fc3RhdGljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVmdmFsKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGluZGVudChvdXQpOwotICBpZiAoIWRlZnZhbCkgewotICAgIG91dCA8PCAoaW5fc3RhdGljID8gInZhciAiIDogInB1YmxpYyBzdGF0aWMgY29uc3QgIik7Ci0gIH0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgc3RyaW5nIHYyID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOwotICAgIG91dCA8PCBuYW1lOwotICAgIGlmICghZGVmdmFsKSB7Ci0gICAgICBvdXQgPDwgIjoiIDw8IHR5cGVfbmFtZSh0eXBlKTsKLSAgICB9Ci0gICAgb3V0IDw8ICIgPSAiIDw8IHYyIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgb3V0IDw8IG5hbWU7Ci0gICAgaWYgKCFkZWZ2YWwpIHsKLSAgICAgIG91dCA8PCAiOiIgPDwgdHlwZV9uYW1lKHR5cGUpOwotICAgIH0KLSAgICBvdXQgPDwgIiA9ICIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgb3V0IDw8IG5hbWUgPDwgIjoiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IgotICAgICAgICA8PCBlbmRsOwotICAgIGlmICghaW5fc3RhdGljKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBmdW5jdGlvbigpOnZvaWQgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKLSAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7Ci0gICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOwotICAgICAgfQotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi4iOwotICAgICAgb3V0IDw8IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSA8PCAiID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGlmICghaW5fc3RhdGljKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0oKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgb3V0IDw8IG5hbWU7Ci0gICAgaWYgKCFkZWZ2YWwpIHsKLSAgICAgIG91dCA8PCAiOiIgPDwgdHlwZV9uYW1lKHR5cGUpOwotICAgIH0KLSAgICBvdXQgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKLSAgICBpZiAoIWluX3N0YXRpYykgewotICAgICAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgZnVuY3Rpb24oKTp2b2lkIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0gICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHN0cmluZyBrZXkgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBrdHlwZSwgdl9pdGVyLT5maXJzdCk7Ci0gICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIlsiIDw8IGtleSA8PCAiXSA9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpZiAoIWluX3N0YXRpYykgewotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9KCk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKLSAgICBvdXQgPDwgbmFtZTsKLSAgICBpZiAoIWRlZnZhbCkgewotICAgICAgb3V0IDw8ICI6IiA8PCB0eXBlX25hbWUodHlwZSk7Ci0gICAgfQotICAgIG91dCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOwotICAgIGlmICghaW5fc3RhdGljKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBmdW5jdGlvbigpOnZvaWQgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLSAgICB0X3R5cGUqIGV0eXBlOwotICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgZXR5cGUsICp2X2l0ZXIpOwotICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLiIgPDwgKHR5cGUtPmlzX2xpc3QoKSA/ICJwdXNoIiA6ICJhZGQiKSA8PCAiKCIgPDwgdmFsIDw8ICIpOyIKLSAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgfQotICAgIGlmICghaW5fc3RhdGljKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0oKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgdHlwZSAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotfQotCi1zdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKLSAgKHZvaWQpbmFtZTsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSByZW5kZXI7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJlbmRlciA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZW5kZXIgPDwgKCh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDApID8gInRydWUiIDogImZhbHNlIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZW5kZXIgPDwgIihieXRlKSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJlbmRlciA8PCAiKHNob3J0KSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICJMIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgcmVuZGVyIDw8ICIoZG91YmxlKSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICB9IGVsc2UgewotICAgIHN0cmluZyB0ID0gdG1wKCJ0bXAiKTsKLSAgICBwcmludF9jb25zdF92YWx1ZShvdXQsIHQsIHR5cGUsIHZhbHVlLCB0cnVlKTsKLSAgICByZW5kZXIgPDwgdDsKLSAgfQotCi0gIHJldHVybiByZW5kZXIuc3RyKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4gVGhpcyBpcyBhIGNsYXNzCi0gKiB3aXRoIGRhdGEgbWVtYmVycywgcmVhZCgpLCB3cml0ZSgpLCBhbmQgYW4gaW5uZXIgSXNzZXQgY2xhc3MuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgZ2VuZXJhdGVfYXMzX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Ci19Ci0KLS8qKgotICogRXhjZXB0aW9ucyBhcmUgc3RydWN0cywgYnV0IHRoZXkgaW5oZXJpdCBmcm9tIEV4Y2VwdGlvbgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9hczNfc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7Ci19Ci0KLS8qKgotICogQXMzIHN0cnVjdCBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgLy8gTWFrZSBvdXRwdXQgZmlsZQotICBzdHJpbmcgZl9zdHJ1Y3RfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArICh0c3RydWN0LT5nZXRfbmFtZSgpKSArICIuYXMiOwotICBvZnN0cmVhbSBmX3N0cnVjdDsKLSAgZl9zdHJ1Y3Qub3BlbihmX3N0cnVjdF9uYW1lLmNfc3RyKCkpOwotCi0gIGZfc3RydWN0IDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGFzM19wYWNrYWdlKCk7Ci0KLSAgc2NvcGVfdXAoZl9zdHJ1Y3QpOwotICBmX3N0cnVjdCA8PCBlbmRsOwotCi0gIHN0cmluZyBpbXBvcnRzOwotCi0gIGZfc3RydWN0IDw8IGFzM190eXBlX2ltcG9ydHMoKSA8PCBhczNfdGhyaWZ0X2ltcG9ydHMoKSA8PCBhczNfdGhyaWZ0X2dlbl9pbXBvcnRzKHRzdHJ1Y3QsIGltcG9ydHMpCi0gICAgICAgICAgIDw8IGVuZGw7Ci0KLSAgaWYgKGJpbmRhYmxlXyAmJiAhaXNfZXhjZXB0aW9uKSB7Ci0gICAgZl9zdHJ1Y3QgPDwgImltcG9ydCBmbGFzaC5ldmVudHMuRXZlbnQ7IiA8PCBlbmRsIDw8ICJpbXBvcnQgZmxhc2guZXZlbnRzLkV2ZW50RGlzcGF0Y2hlcjsiCi0gICAgICAgICAgICAgPDwgZW5kbCA8PCAiaW1wb3J0IG14LmV2ZW50cy5Qcm9wZXJ0eUNoYW5nZUV2ZW50OyIgPDwgZW5kbDsKLSAgfQotCi0gIGdlbmVyYXRlX2FzM19zdHJ1Y3RfZGVmaW5pdGlvbihmX3N0cnVjdCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKLQotICBzY29wZV9kb3duKGZfc3RydWN0KTsgLy8gZW5kIG9mIHBhY2thZ2UKLSAgZl9zdHJ1Y3QuY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBBczMgc3RydWN0IGRlZmluaXRpb24uIFRoaXMgaGFzIHZhcmlvdXMgcGFyYW1ldGVycywgYXMgaXQgY291bGQgYmUKLSAqIGdlbmVyYXRlZCBzdGFuZGFsb25lIG9yIGluc2lkZSBhbm90aGVyIGNsYXNzIGFzIGEgaGVscGVyLiBJZiBpdAotICogaXMgYSBoZWxwZXIgdGhhbiBpdCBpcyBhIHN0YXRpYyBjbGFzcy4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCAgICAgIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICogQHBhcmFtIGlzX2V4Y2VwdGlvbiBJcyB0aGlzIGFuIGV4Y2VwdGlvbj8KLSAqIEBwYXJhbSBpbl9jbGFzcyAgICAgSWYgaW5zaWRlIGEgY2xhc3MsIG5lZWRzIHRvIGJlIHN0YXRpYyBjbGFzcwotICogQHBhcmFtIGlzX3Jlc3VsdCAgICBJZiB0aGlzIGlzIGEgcmVzdWx0IGl0IG5lZWRzIGEgZGlmZmVyZW50IHdyaXRlcgotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX3N0cnVjdF9kZWZpbml0aW9uKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQpIHsKLSAgZ2VuZXJhdGVfYXMzX2RvYyhvdXQsIHRzdHJ1Y3QpOwotCi0gIGJvb2wgaXNfZmluYWwgPSAodHN0cnVjdC0+YW5ub3RhdGlvbnNfLmZpbmQoImZpbmFsIikgIT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpKTsKLSAgYm9vbCBiaW5kYWJsZSA9ICFpc19leGNlcHRpb24gJiYgIWluX2NsYXNzICYmIGJpbmRhYmxlXzsKLQotICBpbmRlbnQob3V0KSA8PCAoaW5fY2xhc3MgPyAiIiA6ICJwdWJsaWMgIikgPDwgKGlzX2ZpbmFsID8gImZpbmFsICIgOiAiIikgPDwgImNsYXNzICIKLSAgICAgICAgICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiICI7Ci0KLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIG91dCA8PCAiZXh0ZW5kcyBFcnJvciAiOwotICB9IGVsc2UgaWYgKGJpbmRhYmxlKSB7Ci0gICAgb3V0IDw8ICJleHRlbmRzIEV2ZW50RGlzcGF0Y2hlciAiOwotICB9Ci0gIG91dCA8PCAiaW1wbGVtZW50cyBUQmFzZSAiOwotCi0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgc3RhdGljIGNvbnN0IFNUUlVDVF9ERVNDOlRTdHJ1Y3QgPSBuZXcgVFN0cnVjdChcIiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICA8PCAiXCIpOyIgPDwgZW5kbDsKLQotICAvLyBNZW1iZXJzIGFyZSBwdWJsaWMgZm9yIC1hczMsIHByaXZhdGUgZm9yIC1hczNiZWFuCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGluZGVudChvdXQpIDw8ICJwcml2YXRlIHN0YXRpYyBjb25zdCAiIDw8IGNvbnN0YW50X25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKQotICAgICAgICAgICAgICAgIDw8ICJfRklFTERfREVTQzpURmllbGQgPSBuZXcgVEZpZWxkKFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiLCAiCi0gICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIiA8PCAoKm1faXRlciktPmdldF9rZXkoKSA8PCAiKTsiCi0gICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgfQotCi0gIG91dCA8PCBlbmRsOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9hczNfZG9jKG91dCwgKm1faXRlcik7Ci0gICAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgdmFyIF8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSArICI6IiArIHR5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCkpCi0gICAgICAgICAgICAgICAgPDwgIjsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHN0YXRpYyBjb25zdCAiIDw8IHVwY2FzZV9zdHJpbmcoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKQotICAgICAgICAgICAgICAgIDw8ICI6aW50ID0gIiA8PCAoKm1faXRlciktPmdldF9rZXkoKSA8PCAiOyIgPDwgZW5kbDsKLSAgfQotCi0gIG91dCA8PCBlbmRsOwotCi0gIC8vIElubmVyIElzc2V0IGNsYXNzCi0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBpZiAoIXR5cGVfY2FuX2JlX251bGwoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSB2YXIgX19pc3NldF8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOkJvb2xlYW4gPSBmYWxzZTsiCi0gICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfYXMzX21ldGFfZGF0YV9tYXAob3V0LCB0c3RydWN0KTsKLQotICAvLyBTdGF0aWMgaW5pdGlhbGl6ZXIgdG8gcG9wdWxhdGUgZ2xvYmFsIGNsYXNzIHRvIHN0cnVjdCBtZXRhZGF0YSBtYXAKLSAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAiRmllbGRNZXRhRGF0YS5hZGRTdHJ1Y3RNZXRhRGF0YU1hcCgiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiLCBtZXRhRGF0YU1hcCk7IgotICAgICAgICAgICAgICA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIERlZmF1bHQgY29uc3RydWN0b3IKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgewotICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiCi0gICAgICAgICAgICAgICAgICA8PCAoKm1faXRlciktPmdldF92YWx1ZSgpLT5nZXRfaW50ZWdlcigpIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2FzM19iZWFuX2JvaWxlcnBsYXRlKG91dCwgdHN0cnVjdCwgYmluZGFibGUpOwotICBnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnNfc2V0dGVycyhvdXQsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9nZW5lcmljX2lzc2V0X21ldGhvZChvdXQsIHRzdHJ1Y3QpOwotCi0gIGdlbmVyYXRlX2FzM19zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7Ci0gIGlmIChpc19yZXN1bHQpIHsKLSAgICBnZW5lcmF0ZV9hczNfc3RydWN0X3Jlc3VsdF93cml0ZXIob3V0LCB0c3RydWN0KTsKLSAgfSBlbHNlIHsKLSAgICBnZW5lcmF0ZV9hczNfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOwotICB9Ci0gIGdlbmVyYXRlX2FzM19zdHJ1Y3RfdG9zdHJpbmcob3V0LCB0c3RydWN0LCBiaW5kYWJsZSk7Ci0gIGdlbmVyYXRlX2FzM192YWxpZGF0b3Iob3V0LCB0c3RydWN0KTsKLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byByZWFkIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfc3RydWN0X3JlYWRlcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiByZWFkKGlwcm90OlRQcm90b2NvbCk6dm9pZCB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gRGVjbGFyZSBzdGFjayB0bXAgdmFyaWFibGVzIGFuZCByZWFkIHN0cnVjdCBoZWFkZXIKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgZmllbGQ6VEZpZWxkOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaXByb3QucmVhZFN0cnVjdEJlZ2luKCk7IiA8PCBlbmRsOwotCi0gIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcwotICBpbmRlbnQob3V0KSA8PCAid2hpbGUgKHRydWUpIiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotCi0gIC8vIFJlYWQgYmVnaW5uaW5nIGZpZWxkIG1hcmtlcgotICBpbmRlbnQob3V0KSA8PCAiZmllbGQgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpOyIgPDwgZW5kbDsKLQotICAvLyBDaGVjayBmb3IgZmllbGQgU1RPUCBtYXJrZXIgYW5kIGJyZWFrCi0gIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5TVE9QKSB7ICIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJicmVhazsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIC8vIFN3aXRjaCBzdGF0ZW1lbnQgb24gdGhlIGZpZWxkIHdlIGFyZSByZWFkaW5nCi0gIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkLmlkKSIgPDwgZW5kbDsKLQotICBzY29wZV91cChvdXQpOwotCi0gIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgdXBjYXNlX3N0cmluZygoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGQudHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLiIpOwotICAgIGdlbmVyYXRlX2lzc2V0X3NldChvdXQsICpmX2l0ZXIpOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyAiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsiCi0gICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0KLSAgLy8gSW4gdGhlIGRlZmF1bHQgY2FzZSB3ZSBza2lwIHRoZSBmaWVsZAotICBvdXQgPDwgaW5kZW50KCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7IgotICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBicmVhazsiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIC8vIFJlYWQgZmllbGQgZW5kIG1hcmtlcgotICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZEZpZWxkRW5kKCk7IiA8PCBlbmRsOwotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgImlwcm90LnJlYWRTdHJ1Y3RFbmQoKTsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBpbiBub24tYmVhbnMgc3R5bGUsIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMgb2YgcHJpbWl0aXZlIHR5cGUKLSAgLy8gKHdoaWNoIGNhbiBiZSBjaGVja2VkIGhlcmUgYnV0IG5vdCBpbiB0aGUgZ2VuZXJhbCB2YWxpZGF0ZSBtZXRob2QpCi0gIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIvLyBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIG9mIHByaW1pdGl2ZSB0eXBlLCB3aGljaCBjYW4ndCBiZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaGVja2VkIGluIHRoZSB2YWxpZGF0ZSBtZXRob2QiIDw8IGVuZGw7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQgJiYgIXR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSkgewotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIV9faXNzZXRfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgIDw8ICIgIHRocm93IG5ldyBUUHJvdG9jb2xFcnJvcihUUHJvdG9jb2xFcnJvci5VTktOT1dOLCBcIlJlcXVpcmVkIGZpZWxkICciCi0gICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCi0gICAgICAgICAgPDwgIicgd2FzIG5vdCBmb3VuZCBpbiBzZXJpYWxpemVkIGRhdGEhIFN0cnVjdDogXCIgKyB0b1N0cmluZygpKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICAvLyBwZXJmb3JtcyB2YXJpb3VzIGNoZWNrcyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKLSAgaW5kZW50KG91dCkgPDwgInZhbGlkYXRlKCk7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vLyBnZW5lcmF0ZXMgYXMzIG1ldGhvZCB0byBwZXJmb3JtIHZhcmlvdXMgY2hlY2tzCi0vLyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfdmFsaWRhdG9yKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gdmFsaWRhdGUoKTp2b2lkIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgIi8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMiIDw8IGVuZGw7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID09IG51bGwpIHsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBUUHJvdG9jb2xFcnJvcihUUHJvdG9jb2xFcnJvci5VTktOT1dOLCBcIlJlcXVpcmVkIGZpZWxkICciCi0gICAgICAgICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJyB3YXMgbm90IHByZXNlbnQhIFN0cnVjdDogXCIgKyB0b1N0cmluZygpKTsiCi0gICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIi8vIGFsYXMsIHdlIGNhbm5vdCBjaGVjayAnIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgPDwgIicgYmVjYXVzZSBpdCdzIGEgcHJpbWl0aXZlIGFuZCB5b3UgY2hvc2UgdGhlIG5vbi1iZWFucyBnZW5lcmF0b3IuIiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8vIGNoZWNrIHRoYXQgZmllbGRzIG9mIHR5cGUgZW51bSBoYXZlIHZhbGlkIHZhbHVlcwotICBvdXQgPDwgaW5kZW50KCkgPDwgIi8vIGNoZWNrIHRoYXQgZmllbGRzIG9mIHR5cGUgZW51bSBoYXZlIHZhbGlkIHZhbHVlcyIgPDwgZW5kbDsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqZl9pdGVyKTsKLSAgICB0X3R5cGUqIHR5cGUgPSBmaWVsZC0+Z2V0X3R5cGUoKTsKLSAgICAvLyBpZiBmaWVsZCBpcyBhbiBlbnVtLCBjaGVjayB0aGF0IGl0cyB2YWx1ZSBpcyB2YWxpZAotICAgIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZCkgPDwgIiAmJiAhIiA8PCBnZXRfZW51bV9jbGFzc19uYW1lKHR5cGUpCi0gICAgICAgICAgICAgICAgICA8PCAiLlZBTElEX1ZBTFVFUy5jb250YWlucygiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIpKXsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoVFByb3RvY29sRXJyb3IuVU5LTk9XTiwgXCJUaGUgZmllbGQgJyIKLSAgICAgICAgICAgICAgICAgIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICInIGhhcyBiZWVuIGFzc2lnbmVkIHRoZSBpbnZhbGlkIHZhbHVlIFwiICsgIgotICAgICAgICAgICAgICAgICAgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIik7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gd3JpdGUgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdAotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX3N0cnVjdF93cml0ZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gd3JpdGUob3Byb3Q6VFByb3RvY29sKTp2b2lkIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICAvLyBwZXJmb3JtcyB2YXJpb3VzIGNoZWNrcyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKLSAgaW5kZW50KG91dCkgPDwgInZhbGlkYXRlKCk7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlU3RydWN0QmVnaW4oU1RSVUNUX0RFU0MpOyIgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGJvb2wgbnVsbF9hbGxvd2VkID0gdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpOwotICAgIGlmIChudWxsX2FsbG93ZWQpIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoaXMuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotCi0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRCZWdpbigiIDw8IGNvbnN0YW50X25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKQotICAgICAgICAgICAgICAgIDw8ICJfRklFTERfREVTQyk7IiA8PCBlbmRsOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy4iKTsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOwotCi0gICAgaWYgKG51bGxfYWxsb3dlZCkgewotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgfQotICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAotICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEVuZCgpOyIKLSAgICAgIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gd3JpdGUgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdCwKLSAqIHdoaWNoIGlzIGEgZnVuY3Rpb24gcmVzdWx0LiBUaGVzZSBmaWVsZHMgYXJlIG9ubHkgd3JpdHRlbgotICogaWYgdGhleSBhcmUgc2V0IGluIHRoZSBJc3NldCBhcnJheSwgYW5kIG9ubHkgb25lIG9mIHRoZW0KLSAqIGNhbiBiZSBzZXQgYXQgYSB0aW1lLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGZ1bmN0aW9uIHdyaXRlKG9wcm90OlRQcm90b2NvbCk6dm9pZCB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlU3RydWN0QmVnaW4oU1RSVUNUX0RFU0MpOyIgPDwgZW5kbDsKLQotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgIjsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8ICIgZWxzZSBpZiAiOwotICAgIH0KLQotICAgIG91dCA8PCAiKHRoaXMuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSB7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEJlZ2luKCIgPDwgY29uc3RhbnRfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpCi0gICAgICAgICAgICAgICAgPDwgIl9GSUVMRF9ERVNDKTsiIDw8IGVuZGw7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLiIpOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCi0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IjsKLSAgfQotICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAotICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgIDw8ICJvcHJvdC53cml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3JlZmxlY3Rpb25fZ2V0dGVycyhvc3RyaW5nc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjYXBfbmFtZSkgewotICAodm9pZCl0eXBlOwotICAodm9pZCljYXBfbmFtZTsKLSAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCB1cGNhc2Vfc3RyaW5nKGZpZWxkX25hbWUpIDw8ICI6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgInJldHVybiB0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3JlZmxlY3Rpb25fc2V0dGVycyhvc3RyaW5nc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjYXBfbmFtZSkgewotICAodm9pZCl0eXBlOwotICAodm9pZCljYXBfbmFtZTsKLSAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCB1cGNhc2Vfc3RyaW5nKGZpZWxkX25hbWUpIDw8ICI6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgImlmICh2YWx1ZSA9PSBudWxsKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB1bnNldCIgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpIDw8ICIoKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IHZhbHVlOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJicmVhazsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotfQotCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ2VuZXJpY19maWVsZF9nZXR0ZXJzX3NldHRlcnMoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0KLSAgc3RkOjpvc3RyaW5nc3RyZWFtIGdldHRlcl9zdHJlYW07Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBzZXR0ZXJfc3RyZWFtOwotCi0gIC8vIGJ1aWxkIHVwIHRoZSBib2RpZXMgb2YgYm90aCB0aGUgZ2V0dGVyIGFuZCBzZXR0ZXIgYXQgb25jZQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOwotICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoZmllbGQtPmdldF90eXBlKCkpOwotICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKLSAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKTsKLQotICAgIGluZGVudF91cCgpOwotICAgIGdlbmVyYXRlX3JlZmxlY3Rpb25fc2V0dGVycyhzZXR0ZXJfc3RyZWFtLCB0eXBlLCBmaWVsZF9uYW1lLCBjYXBfbmFtZSk7Ci0gICAgZ2VuZXJhdGVfcmVmbGVjdGlvbl9nZXR0ZXJzKGdldHRlcl9zdHJlYW0sIHR5cGUsIGZpZWxkX25hbWUsIGNhcF9uYW1lKTsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0KLSAgLy8gY3JlYXRlIHRoZSBzZXR0ZXIKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiBzZXRGaWVsZFZhbHVlKGZpZWxkSUQ6aW50LCB2YWx1ZToqKTp2b2lkIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkSUQpIHsiIDw8IGVuZGw7Ci0KLSAgb3V0IDw8IHNldHRlcl9zdHJlYW0uc3RyKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihcIkZpZWxkIFwiICsgZmllbGRJRCArIFwiIGRvZXNuJ3QgZXhpc3QhXCIpOyIgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIGNyZWF0ZSB0aGUgZ2V0dGVyCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gZ2V0RmllbGRWYWx1ZShmaWVsZElEOmludCk6KiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZElEKSB7IiA8PCBlbmRsOwotCi0gIG91dCA8PCBnZXR0ZXJfc3RyZWFtLnN0cigpOwotCi0gIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoXCJGaWVsZCBcIiArIGZpZWxkSUQgKyBcIiBkb2Vzbid0IGV4aXN0IVwiKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vLyBDcmVhdGVzIGEgZ2VuZXJpYyBpc1NldCBtZXRob2QgdGhhdCB0YWtlcyB0aGUgZmllbGQgbnVtYmVyIGFzIGFyZ3VtZW50Ci12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ2VuZXJpY19pc3NldF9tZXRob2Qoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gY3JlYXRlIHRoZSBpc1NldCBtZXRob2QKLSAgaW5kZW50KG91dCkgPDwgIi8vIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBjb3JyZXNwb25kaW5nIHRvIGZpZWxkSUQgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhICIKLSAgICAgICAgICAgICAgICAgInZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIGlzU2V0KGZpZWxkSUQ6aW50KTpCb29sZWFuIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZElEKSB7IiA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOwotICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgdXBjYXNlX3N0cmluZyhmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIjoiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInJldHVybiAiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkKSA8PCAiOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihcIkZpZWxkIFwiICsgZmllbGRJRCArIFwiIGRvZXNuJ3QgZXhpc3QhXCIpOyIgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNldCBvZiBBczMgQmVhbiBib2lsZXJwbGF0ZSBmdW5jdGlvbnMgKHNldHRlcnMsIGdldHRlcnMsIGV0Yy4pCi0gKiBmb3IgdGhlIGdpdmVuIHN0cnVjdC4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2FzM19iZWFuX2JvaWxlcnBsYXRlKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiaW5kYWJsZSkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOwotICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoZmllbGQtPmdldF90eXBlKCkpOwotICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKLSAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKTsKLQotICAgIC8vIFNpbXBsZSBnZXR0ZXIKLSAgICBnZW5lcmF0ZV9hczNfZG9jKG91dCwgZmllbGQpOwotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gZ2V0ICIgPDwgZmllbGRfbmFtZSA8PCAiKCk6IiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpcy5fIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIC8vIFNpbXBsZSBzZXR0ZXIKLSAgICBnZW5lcmF0ZV9hczNfZG9jKG91dCwgZmllbGQpOwotICAgIHN0ZDo6c3RyaW5nIHByb3BOYW1lID0gdG1wKCJ0aHJpZnRQcm9wZXJ0eUNoYW5nZSIpOwotICAgIGlmIChiaW5kYWJsZSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIltCaW5kYWJsZShldmVudD1cIiIgPDwgcHJvcE5hbWUgPDwgIlwiKV0iIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gc2V0ICIgPDwgZmllbGRfbmFtZSA8PCAiKCIgPDwgZmllbGRfbmFtZSA8PCAiOiIKLSAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUodHlwZSkgPDwgIik6dm9pZCB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLl8iIDw8IGZpZWxkX25hbWUgPDwgIiA9ICIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgICBnZW5lcmF0ZV9pc3NldF9zZXQob3V0LCBmaWVsZCk7Ci0KLSAgICBpZiAoYmluZGFibGUpIHsKLSAgICAgIC8vIFdlIGhhdmUgdG8gdXNlIGEgY3VzdG9tIGV2ZW50IHJhdGhlciB0aGFuIHRoZSBkZWZhdWx0LCBiZWNhdXNlIGlmIHlvdSB1c2UgdGhlIGRlZmF1bHQsCi0gICAgICAvLyB0aGUgc2V0dGVyIG9ubHkgZ2V0cyBjYWxsZWQgaWYgdGhlIHZhbHVlIGhhcyBjaGFuZ2VkIC0gdGhpcyBtZWFucyBjYWxsaW5nCi0gICAgICAvLyBmb28uc2V0SW50VmFsdWUoMCkKLSAgICAgIC8vIHdpbGwgbm90IGNhdXNlIGZvby5pc0ludFZhbHVlU2V0KCkgdG8gcmV0dXJuIHRydWUgc2luY2UgdGhlIHZhbHVlIG9mIGZvby5faW50VmFsdWUgd2Fzbid0Ci0gICAgICAvLyBjaGFuZ2VkCi0gICAgICAvLyBzbyB0aGUgc2V0dGVyIHdhcyBuZXZlciBjYWxsZWQuCi0gICAgICBpbmRlbnQob3V0KSA8PCAiZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCIiIDw8IHByb3BOYW1lIDw8ICJcIikpOyIgPDwgZW5kbDsKLQotICAgICAgLy8gSG93ZXZlciwgaWYgeW91IGp1c3QgdXNlIGEgY3VzdG9tIGV2ZW50LCB0aGVuIGNvbGxlY3Rpb25zIHdvbid0IGJlIGFibGUgdG8gZGV0ZWN0IHdoZW4KLSAgICAgIC8vIGVsZW1lbnRzCi0gICAgICAvLyBpbiB0aGUgY29sbGVjdGlvbnMgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZXkgbGlzdGVkIGZvciBQcm9wZXJ0eUNoYW5nZUV2ZW50cy4gIFNvLCB3ZQotICAgICAgLy8gZGlzcGF0Y2ggYm90aC4KLSAgICAgIGluZGVudChvdXQpIDw8ICJkaXNwYXRjaEV2ZW50KG5ldyBQcm9wZXJ0eUNoYW5nZUV2ZW50KFByb3BlcnR5Q2hhbmdlRXZlbnQuUFJPUEVSVFlfQ0hBTkdFKSk7IgotICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgLy8gVW5zZXR0ZXIKLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIHVuc2V0IiA8PCBjYXBfbmFtZSA8PCAiKCk6dm9pZCB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG51bGw7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy5fX2lzc2V0XyIgPDwgZmllbGRfbmFtZSA8PCAiID0gZmFsc2U7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICAvLyBpc1NldCBtZXRob2QKLSAgICBpbmRlbnQob3V0KSA8PCAiLy8gUmV0dXJucyB0cnVlIGlmIGZpZWxkICIgPDwgZmllbGRfbmFtZQotICAgICAgICAgICAgICAgIDw8ICIgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlIiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gaXMiIDw8IGdldF9jYXBfbmFtZSgic2V0IikgPDwgY2FwX25hbWUgPDwgIigpOkJvb2xlYW4geyIKLSAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgIT0gbnVsbDsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpcy5fX2lzc2V0XyIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdG9TdHJpbmcoKSBtZXRob2QgZm9yIHRoZSBnaXZlbiBzdHJ1Y3QKLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2FzM19zdHJ1Y3RfdG9zdHJpbmcob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiaW5kYWJsZSkgewotICAvLyBJZiBpdCdzIGJpbmRhYmxlLCBpdCBleHRlbmRzIEV2ZW50RGlzcGF0Y2hlciBzbyB0b1N0cmluZyBpcyBhbiBvdmVycmlkZS4KLSAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgIiA8PCAoYmluZGFibGUgPyAib3ZlcnJpZGUgIiA6ICIiKSA8PCAiZnVuY3Rpb24gdG9TdHJpbmcoKTpTdHJpbmcgeyIKLSAgICAgIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyIHJldDpTdHJpbmcgPSBuZXcgU3RyaW5nKFwiIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoXCIpOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgZmlyc3Q6Qm9vbGVhbiA9IHRydWU7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBib29sIGNvdWxkX2JlX3Vuc2V0ID0gKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKLSAgICBpZiAoY291bGRfYmVfdW5zZXQpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotCi0gICAgdF9maWVsZCogZmllbGQgPSAoKmZfaXRlcik7Ci0KLSAgICBpZiAoIWZpcnN0KSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFmaXJzdCkgcmV0ICs9ICBcIiwgXCI7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnQob3V0KSA8PCAicmV0ICs9IFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjpcIjsiIDw8IGVuZGw7Ci0gICAgYm9vbCBjYW5fYmVfbnVsbCA9IHR5cGVfY2FuX2JlX251bGwoZmllbGQtPmdldF90eXBlKCkpOwotICAgIGlmIChjYW5fYmVfbnVsbCkgewotICAgICAgaW5kZW50KG91dCkgPDwgImlmICh0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIHJldCArPSBcIm51bGxcIjsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0KLSAgICBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX2Jhc2VfdHlwZSgpICYmICgodF9iYXNlX3R5cGUqKShmaWVsZC0+Z2V0X3R5cGUoKSkpLT5pc19iaW5hcnkoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0ICs9IFwiQklOQVJZXCI7IiA8PCBlbmRsOwotICAgIH0gZWxzZSBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX2VudW0oKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgInZhciAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgICA8PCAiX25hbWU6U3RyaW5nID0gIiA8PCBnZXRfZW51bV9jbGFzc19uYW1lKGZpZWxkLT5nZXRfdHlwZSgpKQotICAgICAgICAgICAgICAgICAgPDwgIi5WQUxVRVNfVE9fTkFNRVNbdGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIl9uYW1lICE9IG51bGwpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICByZXQgKz0gIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiX25hbWU7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0ICs9IFwiIChcIjsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJyZXQgKz0gdGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICJfbmFtZSAhPSBudWxsKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0ICs9IFwiKVwiOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicmV0ICs9IHRoaXMuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaWYgKGNhbl9iZV9udWxsKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudChvdXQpIDw8ICJmaXJzdCA9IGZhbHNlOyIgPDwgZW5kbDsKLQotICAgIGlmIChjb3VsZF9iZV91bnNldCkgewotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgICBmaXJzdCA9IGZhbHNlOwotICB9Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0ICs9IFwiKVwiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHJldDsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdGF0aWMgbWFwIHdpdGggbWV0YSBkYXRhIHRvIHN0b3JlIGluZm9ybWF0aW9uIHN1Y2ggYXMgZmllbGRJRCB0bwotICogZmllbGROYW1lIG1hcHBpbmcKLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2FzM19tZXRhX2RhdGFfbWFwKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICAvLyBTdGF0aWMgTWFwIHdpdGggZmllbGRJRCAtPiBGaWVsZE1ldGFEYXRhIG1hcHBpbmdzCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RhdGljIGNvbnN0IG1ldGFEYXRhTWFwOkRpY3Rpb25hcnkgPSBuZXcgRGljdGlvbmFyeSgpOyIgPDwgZW5kbDsKLQotICBpZiAoZmllbGRzLnNpemUoKSA+IDApIHsKLSAgICAvLyBQb3B1bGF0ZSBtYXAKLSAgICBzY29wZV91cChvdXQpOwotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7Ci0gICAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZmllbGQtPmdldF9uYW1lKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAibWV0YURhdGFNYXBbIiA8PCB1cGNhc2Vfc3RyaW5nKGZpZWxkX25hbWUpIDw8ICJdID0gbmV3IEZpZWxkTWV0YURhdGEoXCIiCi0gICAgICAgICAgICAgICAgICA8PCBmaWVsZF9uYW1lIDw8ICJcIiwgIjsKLQotICAgICAgLy8gU2V0IGZpZWxkIHJlcXVpcmVtZW50IHR5cGUgKHJlcXVpcmVkLCBvcHRpb25hbCwgZXRjLikKLSAgICAgIGlmIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICAgICAgb3V0IDw8ICJURmllbGRSZXF1aXJlbWVudFR5cGUuUkVRVUlSRUQsICI7Ci0gICAgICB9IGVsc2UgaWYgKGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCkgewotICAgICAgICBvdXQgPDwgIlRGaWVsZFJlcXVpcmVtZW50VHlwZS5PUFRJT05BTCwgIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCAiVEZpZWxkUmVxdWlyZW1lbnRUeXBlLkRFRkFVTFQsICI7Ci0gICAgICB9Ci0KLSAgICAgIC8vIENyZWF0ZSB2YWx1ZSBtZXRhIGRhdGEKLSAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgICAgIG91dCA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgfQotfQotCi0vKioKLSAqIFJldHVybnMgYSBzdHJpbmcgd2l0aCB0aGUgYXMzIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiB0aHJpZnQgdHlwZQotICogKGUuZy4gZm9yIHRoZSB0eXBlIHN0cnVjdCBpdCByZXR1cm5zICJUVHlwZS5TVFJVQ1QiKQotICovCi1zdGQ6OnN0cmluZyB0X2FzM19nZW5lcmF0b3I6OmdldF9hczNfdHlwZV9zdHJpbmcodF90eXBlKiB0eXBlKSB7Ci0gIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLkxJU1QiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5NQVAiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5TRVQiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLlNUUlVDVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5JMzIiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgIHJldHVybiBnZXRfYXMzX3R5cGVfc3RyaW5nKCgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICBzd2l0Y2ggKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgcmV0dXJuICJUVHlwZS5WT0lEIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICJUVHlwZS5TVFJJTkciOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJUVHlwZS5CT09MIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJldHVybiAiVFR5cGUuQllURSI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiVFR5cGUuSTE2IjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICJUVHlwZS5JMzIiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gIlRUeXBlLkk2NCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiVFR5cGUuRE9VQkxFIjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIlVua25vd24gdGhyaWZ0IHR5cGUgXCIiICsgdHlwZS0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiIHBhc3NlZCB0byB0X2FzM19nZW5lcmF0b3I6OmdldF9hczNfdHlwZV9zdHJpbmchIik7Ci0gICAgICBicmVhazsgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIQotICAgIH0KLSAgfSBlbHNlIHsKLSAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoCi0gICAgICAgICJVbmtub3duIHRocmlmdCB0eXBlIFwiIiArIHR5cGUtPmdldF9uYW1lKCkKLSAgICAgICAgKyAiXCIgcGFzc2VkIHRvIHRfYXMzX2dlbmVyYXRvcjo6Z2V0X2FzM190eXBlX3N0cmluZyEiKTsgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIQotICB9Ci19Ci0KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUpIHsKLSAgb3V0IDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnRfdXAoKTsKLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIm5ldyBTdHJ1Y3RNZXRhRGF0YShUVHlwZS5TVFJVQ1QsICIgPDwgdHlwZV9uYW1lKHR5cGUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBMaXN0TWV0YURhdGEoVFR5cGUuTElTVCwgIjsKLSAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCBlbGVtX3R5cGUpOwotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgU2V0TWV0YURhdGEoVFR5cGUuU0VULCAiOwotICAgICAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGVsZW1fdHlwZSk7Ci0gICAgfSBlbHNlIHsgLy8gbWFwCi0gICAgICBpbmRlbnQob3V0KSA8PCAibmV3IE1hcE1ldGFEYXRhKFRUeXBlLk1BUCwgIjsKLSAgICAgIHRfdHlwZSoga2V5X3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgICB0X3R5cGUqIHZhbF90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwga2V5X3R5cGUpOwotICAgICAgb3V0IDw8ICIsICI7Ci0gICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCB2YWxfdHlwZSk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGluZGVudChvdXQpIDw8ICJuZXcgRmllbGRWYWx1ZU1ldGFEYXRhKCIgPDwgZ2V0X2FzM190eXBlX3N0cmluZyh0eXBlKTsKLSAgfQotICBvdXQgPDwgIikiOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnRfZG93bigpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLiBJbiBDKyssIHRoaXMgY29tcHJpc2VzIGFuIGVudGlyZWx5IHNlcGFyYXRlCi0gKiBoZWFkZXIgYW5kIHNvdXJjZSBmaWxlLiBUaGUgaGVhZGVyIGZpbGUgZGVmaW5lcyB0aGUgbWV0aG9kcyBhbmQgaW5jbHVkZXMKLSAqIHRoZSBkYXRhIHR5cGVzIGRlZmluZWQgaW4gdGhlIG1haW4gaGVhZGVyIGZpbGUsIGFuZCB0aGUgaW1wbGVtZW50YXRpb24KLSAqIGZpbGUgY29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBiYXNpYyBwcmludGVyIGFuZCBkZWZhdWx0IGludGVyZmFjZXMuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAvLyBNYWtlIGludGVyZmFjZSBmaWxlCi0gIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIHNlcnZpY2VfbmFtZV8gKyAiLmFzIjsKLSAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOwotCi0gIGZfc2VydmljZV8gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgYXMzX3BhY2thZ2UoKTsKLQotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwgYXMzX3R5cGVfaW1wb3J0cygpIDw8IGFzM190aHJpZnRfaW1wb3J0cygpCi0gICAgICAgICAgICAgPDwgYXMzX3RocmlmdF9nZW5faW1wb3J0cyh0c2VydmljZSk7Ci0KLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICB0X3R5cGUqIHBhcmVudCA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOwotICAgIHN0cmluZyBwYXJlbnRfbmFtZXNwYWNlID0gcGFyZW50LT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZXNwYWNlKCJhczMiKTsKLSAgICBpZiAoIXBhcmVudF9uYW1lc3BhY2UuZW1wdHkoKSAmJiBwYXJlbnRfbmFtZXNwYWNlICE9IHBhY2thZ2VfbmFtZV8pIHsKLSAgICAgIGZfc2VydmljZV8gPDwgImltcG9ydCAiIDw8IHR5cGVfbmFtZShwYXJlbnQpIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7Ci0KLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXy5jbG9zZSgpOwotCi0gIC8vIE5vdyBtYWtlIHRoZSBpbXBsZW1lbnRhdGlvbi9jbGllbnQgZmlsZQotICBmX3NlcnZpY2VfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIHNlcnZpY2VfbmFtZV8gKyAiSW1wbC5hcyI7Ci0gIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKLQotICBmX3NlcnZpY2VfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGFzM19wYWNrYWdlKCk7Ci0KLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8IGFzM190eXBlX2ltcG9ydHMoKSA8PCBhczNfdGhyaWZ0X2ltcG9ydHMoKQotICAgICAgICAgICAgIDw8IGFzM190aHJpZnRfZ2VuX2ltcG9ydHModHNlcnZpY2UpOwotCi0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgdF90eXBlKiBwYXJlbnQgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKLSAgICBzdHJpbmcgcGFyZW50X25hbWVzcGFjZSA9IHBhcmVudC0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWVzcGFjZSgiYXMzIik7Ci0gICAgaWYgKCFwYXJlbnRfbmFtZXNwYWNlLmVtcHR5KCkgJiYgcGFyZW50X25hbWVzcGFjZSAhPSBwYWNrYWdlX25hbWVfKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICJpbXBvcnQgIiA8PCB0eXBlX25hbWUocGFyZW50KSA8PCAiSW1wbDsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLQotICBmX3NlcnZpY2VfIDw8IGFzM190eXBlX2ltcG9ydHMoKTsKLSAgZl9zZXJ2aWNlXyA8PCBhczNfdGhyaWZ0X2ltcG9ydHMoKTsKLSAgZl9zZXJ2aWNlXyA8PCBhczNfdGhyaWZ0X2dlbl9pbXBvcnRzKHRzZXJ2aWNlKTsKLSAgaWYgKCFwYWNrYWdlX25hbWVfLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8ICJpbXBvcnQgIiA8PCBwYWNrYWdlX25hbWVfIDw8ICIuKjsiIDw8IGVuZGw7Ci0gIH0KLQotICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOwotCi0gIGZfc2VydmljZV8uY2xvc2UoKTsKLQotICAvLyBOb3cgbWFrZSB0aGUgcHJvY2Vzc29yL3NlcnZlciBmaWxlCi0gIGZfc2VydmljZV9uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgc2VydmljZV9uYW1lXyArICJQcm9jZXNzb3IuYXMiOwotICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7Ci0KLSAgZl9zZXJ2aWNlXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBhczNfcGFja2FnZSgpOwotCi0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0gIGZfc2VydmljZV8gPDwgZW5kbCA8PCBhczNfdHlwZV9pbXBvcnRzKCkgPDwgYXMzX3RocmlmdF9pbXBvcnRzKCkKLSAgICAgICAgICAgICA8PCBhczNfdGhyaWZ0X2dlbl9pbXBvcnRzKHRzZXJ2aWNlKSA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRzZXJ2aWNlKTsKLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLQotICBmX3NlcnZpY2VfIDw8IGFzM190eXBlX2ltcG9ydHMoKTsKLSAgZl9zZXJ2aWNlXyA8PCBhczNfdGhyaWZ0X2ltcG9ydHMoKTsKLSAgZl9zZXJ2aWNlXyA8PCBhczNfdGhyaWZ0X2dlbl9pbXBvcnRzKHRzZXJ2aWNlKSA8PCBlbmRsOwotICBpZiAoIXBhY2thZ2VfbmFtZV8uZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwgImltcG9ydCAiIDw8IHBhY2thZ2VfbmFtZV8gPDwgIi4qOyIgPDwgZW5kbDsKLSAgfQotCi0gIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7Ci0KLSAgZl9zZXJ2aWNlXy5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBleHRlbmRzX2lmYWNlID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kc19pZmFjZSA9ICIgZXh0ZW5kcyAiICsgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCk7Ci0gIH0KLQotICBnZW5lcmF0ZV9hczNfZG9jKGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHVibGljIGludGVyZmFjZSAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgZXh0ZW5kc19pZmFjZSA8PCAiIHsiIDw8IGVuZGwKLSAgICAgICAgICAgICA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfYXMzX2RvYyhmX3NlcnZpY2VfLCAqZl9pdGVyKTsKLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIi8vZnVuY3Rpb24gb25FcnJvcihFcnJvcik6dm9pZDsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLy9mdW5jdGlvbiBvblN1Y2Nlc3MoKTp2b2lkOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLy9mdW5jdGlvbiBvbkVycm9yKEVycm9yKTp2b2lkOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIvL2Z1bmN0aW9uIG9uU3VjY2VzcygiIDw8IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKTp2b2lkOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgc3RydWN0cyBmb3IgYWxsIHRoZSBzZXJ2aWNlIGFyZ3MgYW5kIHJldHVybiB0eXBlcwotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZQotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGdlbmVyYXRlX2FzM19zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCB0cywgZmFsc2UsIHRydWUpOwotICAgIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKTsKLSAgICBleHRlbmRzX2NsaWVudCA9ICIgZXh0ZW5kcyAiICsgZXh0ZW5kcyArICJJbXBsIjsKLSAgfQotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGNsYXNzICIgPDwgc2VydmljZV9uYW1lXyA8PCAiSW1wbCIgPDwgZXh0ZW5kc19jbGllbnQKLSAgICAgICAgICAgICAgICAgICAgIDw8ICIgaW1wbGVtZW50cyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBmdW5jdGlvbiAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkltcGwiCi0gICAgICAgICAgICAgICAgICAgICA8PCAiKGlwcm90OlRQcm90b2NvbCwgb3Byb3Q6VFByb3RvY29sPW51bGwpIiA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlwcm90XyA9IGlwcm90OyIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAob3Byb3QgPT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdF8gPSBpcHJvdDsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdF8gPSBvcHJvdDsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IjsKLSAgfSBlbHNlIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzdXBlcihpcHJvdCwgb3Byb3QpOyIgPDwgZW5kbDsKLSAgfQotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInByb3RlY3RlZCB2YXIgaXByb3RfOlRQcm90b2NvbDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgIDw8ICJwcm90ZWN0ZWQgdmFyIG9wcm90XzpUUHJvdG9jb2w7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgIDw8ICJwcm90ZWN0ZWQgdmFyIHNlcWlkXzppbnQ7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBmdW5jdGlvbiBnZXRJbnB1dFByb3RvY29sKCk6VFByb3RvY29sIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIHRoaXMuaXByb3RfOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGZ1bmN0aW9uIGdldE91dHB1dFByb3RvY29sKCk6VFByb3RvY29sIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIHRoaXMub3Byb3RfOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgLy8gT3BlbiBmdW5jdGlvbgotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLy9mdW5jdGlvbiBvbkVycm9yKEVycm9yKTp2b2lkOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIvL2Z1bmN0aW9uIG9uU3VjY2VzcygpOnZvaWQ7IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIvL2Z1bmN0aW9uIG9uRXJyb3IoRXJyb3IpOnZvaWQ7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIi8vZnVuY3Rpb24gb25TdWNjZXNzKCIgPDwgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIpOnZvaWQ7IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0gICAgLy8gR2V0IHRoZSBzdHJ1Y3Qgb2YgZnVuY3Rpb24gY2FsbCBwYXJhbXMKLSAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLQotICAgIHN0cmluZyBhcmdzbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfYXJncyI7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLQotICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdAotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90Xy53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoXCIiIDw8IGZ1bm5hbWUgPDwgIlwiLCAiCi0gICAgICAgICAgICAgICA8PCAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJUTWVzc2FnZVR5cGUuT05FV0FZIiA6ICJUTWVzc2FnZVR5cGUuQ0FMTCIpCi0gICAgICAgICAgICAgICA8PCAiLCBzZXFpZF8pKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInZhciBhcmdzOiIgPDwgYXJnc25hbWUgPDwgIiA9IG5ldyAiCi0gICAgICAgICAgICAgICA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotCi0gICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3MuIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIgotICAgICAgICAgICAgICAgICA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzLndyaXRlKG9wcm90Xyk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICA8PCAib3Byb3RfLndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKLQotICAgIGlmICgoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdF8uZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90Xy5nZXRUcmFuc3BvcnQoKS5mbHVzaChmdW5jdGlvbihlcnJvcjpFcnJvcik6dm9pZCB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0cnkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgc3RyaW5nIHJlc3VsdG5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAoZXJyb3IgIT0gbnVsbCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgICA8PCAiICBpZiAob25FcnJvciAhPSBudWxsKSBvbkVycm9yKGVycm9yKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuOyIKLSAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgICA8PCAidmFyIG1zZzpUTWVzc2FnZSA9IGlwcm90Xy5yZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgIDw8ICJpZiAobXNnLnR5cGUgPT0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTikgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgICA8PCAiICB2YXIgeDpUQXBwbGljYXRpb25FcnJvciA9IFRBcHBsaWNhdGlvbkVycm9yLnJlYWQoaXByb3RfKTsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgaXByb3RfLnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgIDw8ICIgIGlmIChvbkVycm9yICE9IG51bGwpIG9uRXJyb3IoeCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybjsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInZhciByZXN1bHQgOiIgPDwgcmVzdWx0bmFtZSA8PCAiID0gbmV3ICIKLSAgICAgICAgICAgICAgICAgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXN1bHQucmVhZChpcHJvdF8pOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaXByb3RfLnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOwotCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC4iIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCJzdWNjZXNzIikgPDwgIikgeyIgPDwgZW5kbAotICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIGlmIChvblN1Y2Nlc3MgIT0gbnVsbCkgb25TdWNjZXNzKHJlc3VsdC5zdWNjZXNzKTsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm47IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT0gbnVsbCkgeyIgPDwgZW5kbAotICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIGlmIChvbkVycm9yICE9IG51bGwpIG9uRXJyb3IocmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgICAgPDwgIik7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIC8vIElmIHlvdSBnZXQgaGVyZSBpdCdzIGFuIGV4Y2VwdGlvbiwgdW5sZXNzIGEgdm9pZCBmdW5jdGlvbgotICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChvblN1Y2Nlc3MgIT0gbnVsbCkgb25TdWNjZXNzKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgICAgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotCi0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChvbkVycm9yICE9IG51bGwpIG9uRXJyb3IobmV3ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEFwcGxpY2F0aW9uRXJyb3IoVEFwcGxpY2F0aW9uRXJyb3IuTUlTU0lOR19SRVNVTFQsIFwiIgotICAgICAgICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIikpOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IGNhdGNoIChlOlRFcnJvcikgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgICA8PCAiICBpZiAob25FcnJvciAhPSBudWxsKSBvbkVycm9yKGUpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLQotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSk7IiA8PCBlbmRsOwotICAgIH0KLSAgICAvLyBDbG9zZSBmdW5jdGlvbgotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gRXh0ZW5kcyBzdHVmZgotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX3Byb2Nlc3NvciA9ICIgZXh0ZW5kcyAiICsgZXh0ZW5kcyArICJQcm9jZXNzb3IiOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGNsYXNzICIgPDwgc2VydmljZV9uYW1lXyA8PCAiUHJvY2Vzc29yIiA8PCBleHRlbmRzX3Byb2Nlc3NvcgotICAgICAgICAgICAgICAgICAgICAgPDwgIiBpbXBsZW1lbnRzIFRQcm9jZXNzb3IgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgZnVuY3Rpb24gIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJQcm9jZXNzb3IoaWZhY2U6IiA8PCBzZXJ2aWNlX25hbWVfCi0gICAgICAgICAgICAgICAgICAgICA8PCAiKSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAic3VwZXIoaWZhY2UpOyIgPDwgZW5kbDsKLSAgfQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZmFjZV8gPSBpZmFjZTsiIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJQUk9DRVNTX01BUFtcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICA8PCAiXCJdID0gIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIigpOyIgPDwgZW5kbDsKLSAgfQotCi0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwcml2YXRlIHZhciBpZmFjZV86IiA8PCBzZXJ2aWNlX25hbWVfIDw8ICI7IiA8PCBlbmRsOwotCi0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgY29uc3QgUFJPQ0VTU19NQVA6RGljdGlvbmFyeSA9IG5ldyBEaWN0aW9uYXJ5KCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBzZXJ2ZXIgaW1wbGVtZW50YXRpb24KLSAgc3RyaW5nIG92ZXJyaWRlID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgb3ZlcnJpZGUgPSAib3ZlcnJpZGUgIjsKLSAgfQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgb3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgIDw8ICJwdWJsaWMgZnVuY3Rpb24gcHJvY2VzcyhpcHJvdDpUUHJvdG9jb2wsIG9wcm90OlRQcm90b2NvbCk6Qm9vbGVhbiIgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidmFyIG1zZzpUTWVzc2FnZSA9IGlwcm90LnJlYWRNZXNzYWdlQmVnaW4oKTsiIDw8IGVuZGw7Ci0KLSAgLy8gVE9ETyhtY3NsZWUpOiB2YWxpZGF0ZSBtZXNzYWdlLCB3YXMgdGhlIHNlcWlkIGV0Yy4gbGVnaXQ/Ci0gIC8vIEFTLSBJZiBhbGwgbWV0aG9kIGlzIG9uZXdheToKLSAgLy8gZG8geW91IGhhdmUgYW4gb3Byb3Q/Ci0gIC8vIGRvIHlvdSB5b3UgbmVlZCBudWxsY2hlY2s/Ci0gIGZfc2VydmljZV8KLSAgICAgIDw8IGluZGVudCgpIDw8ICJ2YXIgZm46RnVuY3Rpb24gPSBQUk9DRVNTX01BUFttc2cubmFtZV07IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICA8PCAiaWYgKGZuID09IG51bGwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBUVHlwZS5TVFJVQ1QpOyIKLSAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgaXByb3QucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgIDw8ICIgIHZhciB4OlRBcHBsaWNhdGlvbkVycm9yID0gbmV3IFRBcHBsaWNhdGlvbkVycm9yKFRBcHBsaWNhdGlvbkVycm9yLlVOS05PV05fTUVUSE9ELCAiCi0gICAgICAgICAiXCJJbnZhbGlkIG1ldGhvZCBuYW1lOiAnXCIrbXNnLm5hbWUrXCInXCIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgPDwgIiAgb3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKG1zZy5uYW1lLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBtc2cuc2VxaWQpKTsiCi0gICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHgud3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsiCi0gICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICA8PCAiICByZXR1cm4gdHJ1ZTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgIDw8ICJmbi5jYWxsKHRoaXMsbXNnLnNlcWlkLCBpcHJvdCwgb3Byb3QpOyIgPDwgZW5kbDsKLQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIHJldHVybjsKLSAgfQotCi0gIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKLSAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKLSAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOwotICB9Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKLSAgfQotCi0gIGdlbmVyYXRlX2FzM19zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCAmcmVzdWx0LCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gICh2b2lkKXRzZXJ2aWNlOwotICAvLyBPcGVuIGNsYXNzCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJpdmF0ZSBmdW5jdGlvbiAiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCk6RnVuY3Rpb24geyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgLy8gT3BlbiBmdW5jdGlvbgotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiBmdW5jdGlvbihzZXFpZDppbnQsIGlwcm90OlRQcm90b2NvbCwgb3Byb3Q6VFByb3RvY29sKTp2b2lkIiA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICBzdHJpbmcgYXJnc25hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiOwotICBzdHJpbmcgcmVzdWx0bmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKLQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ2YXIgYXJnczoiIDw8IGFyZ3NuYW1lIDw8ICIgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImFyZ3MucmVhZChpcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpcHJvdC5yZWFkTWVzc2FnZUVuZCgpOyIKLSAgICAgICAgICAgICA8PCBlbmRsOwotCi0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0KLSAgLy8gRGVjbGFyZSByZXN1bHQgZm9yIG5vbiBvbmV3YXkgZnVuY3Rpb24KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidmFyIHJlc3VsdDoiIDw8IHJlc3VsdG5hbWUgPDwgIiA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIKLSAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBUcnkgYmxvY2sgZm9yIGEgZnVuY3Rpb24gd2l0aCBleGNlcHRpb25zCi0gIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRyeSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKLSAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAiaWZhY2VfLiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8ICJhcmdzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBmX3NlcnZpY2VfIDw8ICIvLyBzb3JyeSB0aGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIHlldCIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIGlzIG5vdCB5ZXQgc3VwcG9ydGVkXCIpOyIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIFNldCBpc3NldCBvbiBzdWNjZXNzIGZpZWxkCi0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkKLSAgICAgICYmICF0eXBlX2Nhbl9iZV9udWxsKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkpIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuc2V0IiA8PCBnZXRfY2FwX25hbWUoInN1Y2Nlc3MiKSA8PCBnZXRfY2FwX25hbWUoImlzU2V0IikKLSAgICAgICAgICAgICAgIDw8ICIodHJ1ZSk7IiA8PCBlbmRsOwotICB9Ci0KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmIHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IjsKLSAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PCAiIGNhdGNoICgiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOiIKLSAgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIKLSAgICAgICAgICAgICAgICAgICA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAifSI7Ci0gICAgICB9Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgIiBjYXRjaCAodGg6RXJyb3IpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJhY2UoXCJJbnRlcm5hbCBlcnJvciBwcm9jZXNzaW5nICIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICA8PCAiXCIsIHRoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgIDw8ICJ2YXIgeDpUQXBwbGljYXRpb25FcnJvciA9IG5ldyAiCi0gICAgICAgICAgICAgICAgICAiVEFwcGxpY2F0aW9uRXJyb3IoVEFwcGxpY2F0aW9uRXJyb3IuSU5URVJOQUxfRVJST1IsIFwiSW50ZXJuYWwgZXJyb3IgcHJvY2Vzc2luZyAiCi0gICAgICAgICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgPDwgIlwiLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBzZXFpZCkpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieC53cml0ZShvcHJvdCk7IgotICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICA8PCAib3Byb3QuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gU2hvcnRjdXQgb3V0IGhlcmUgZm9yIG9uZXdheSBmdW5jdGlvbnMKLSAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0KLSAgICAvLyBDbG9zZSBjbGFzcwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAgIHJldHVybjsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgPDwgIlwiLCBUTWVzc2FnZVR5cGUuUkVQTFksIHNlcWlkKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXN1bHQud3JpdGUob3Byb3QpOyIKLSAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICA8PCAib3Byb3QuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsiIDw8IGVuZGw7Ci0KLSAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIC8vIENsb3NlIGNsYXNzCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZAotICogQHBhcmFtIHByZWZpeCBUaGUgdmFyaWFibGUgbmFtZSBvciBjb250YWluZXIgZm9yIHRoaXMgZmllbGQKLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCkgewotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIgPSBpcHJvdC4iOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgICAgIG91dCA8PCAicmVhZEJpbmFyeSgpOyI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nKCk7IjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgb3V0IDw8ICJyZWFkQm9vbCgpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBvdXQgPDwgInJlYWRCeXRlKCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgb3V0IDw8ICJyZWFkSTE2KCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgb3V0IDw8ICJyZWFkSTMyKCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgb3V0IDw8ICJyZWFkSTY0KCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgb3V0IDw8ICJyZWFkRG91YmxlKCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEFzMyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIG91dCA8PCAicmVhZEkzMigpOyI7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAotICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKLSAgICAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGFuIHVuc2VyaWFsaXplciBmb3IgYSBzdHJ1Y3QsIGludm9rZXMgcmVhZCgpCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKLSAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgIDw8IHByZWZpeCA8PCAiLnJlYWQoaXByb3QpOyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBjb250YWluZXIgYnkgcmVhZGluZyBpdHMgc2l6ZSBhbmQgdGhlbiBpdGVyYXRpbmcKLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgc3RyaW5nIG9iajsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgb2JqID0gdG1wKCJfbWFwIik7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgb2JqID0gdG1wKCJfc2V0Iik7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIG9iaiA9IHRtcCgiX2xpc3QiKTsKLSAgfQotCi0gIC8vIERlY2xhcmUgdmFyaWFibGVzLCByZWFkIGhlYWRlcgotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInZhciAiIDw8IG9iaiA8PCAiOlRNYXAgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInZhciAiIDw8IG9iaiA8PCAiOlRTZXQgPSBpcHJvdC5yZWFkU2V0QmVnaW4oKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJ2YXIgIiA8PCBvYmogPDwgIjpUTGlzdCA9IGlwcm90LnJlYWRMaXN0QmVnaW4oKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpCi0gICAgICAgICAgICAgIC8vIHNpemUgdGhlIGNvbGxlY3Rpb24gY29ycmVjdGx5Ci0gICAgICAgICAgICAgIDw8ICIoIgotICAgICAgICAgICAgICA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgLy8gRm9yIGxvb3AgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cwotICBzdHJpbmcgaSA9IHRtcCgiX2kiKTsKLSAgaW5kZW50KG91dCkgPDwgImZvciAodmFyICIgPDwgaSA8PCAiOmludCA9IDA7ICIgPDwgaSA8PCAiIDwgIiA8PCBvYmogPDwgIi5zaXplIgotICAgICAgICAgICAgICA8PCAiOyAiCi0gICAgICAgICAgICAgIDw8ICIrKyIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKLQotICBzY29wZV91cChvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBwcmVmaXgpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4KTsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICAvLyBSZWFkIGNvbnRhaW5lciBlbmQKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTWFwRW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkU2V0RW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZExpc3RFbmQoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBrZXkgPSB0bXAoIl9rZXkiKTsKLSAgc3RyaW5nIHZhbCA9IHRtcCgiX3ZhbCIpOwotICB0X2ZpZWxkIGZrZXkodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7Ci0gIHRfZmllbGQgZnZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKLQotICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZma2V5KSA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmdmFsKSA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXkpOwotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsKTsKLQotICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIlsiIDw8IGtleSA8PCAiXSA9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIHNldCBlbGVtZW50Ci0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKLSAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5hZGQoIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBsaXN0IGVsZW1lbnQKLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOwotICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5wdXNoKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQotICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCkgewotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcwotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7Ci0KLSAgICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3QuIjsKLQotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgICBvdXQgPDwgIndyaXRlQmluYXJ5KCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIG91dCA8PCAid3JpdGVCb29sKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUJ5dGUoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJMTYoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJNjQoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIG91dCA8PCAid3JpdGVEb3VibGUoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBBczMgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgcHJlZml4LmNfc3RyKCksCi0gICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAotICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGFsbCB0aGUgbWVtYmVycyBvZiBhIHN0cnVjdC4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IHRvIHNlcmlhbGl6ZQotICogQHBhcmFtIHByZWZpeCAgU3RyaW5nIHByZWZpeCB0byBhdHRhY2ggdG8gYWxsIGZpZWxkcwotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgewotICAodm9pZCl0c3RydWN0OwotICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIud3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHdyaXRpbmcgaXRzIHNpemUgdGhlbiB0aGUgZWxlbWVudHMuCi0gKgotICogQHBhcmFtIHR0eXBlICBUaGUgdHlwZSBvZiBjb250YWluZXIKLSAqIEBwYXJhbSBwcmVmaXggU3RyaW5nIHByZWZpeCBmb3IgZmllbGRzCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgc3RyaW5nIGl0ZXIgPSB0bXAoIl9rZXkiKTsKLSAgICBzdHJpbmcgY291bnRlciA9IHRtcCgiX3NpemVDb3VudGVyIik7Ci0gICAgaW5kZW50KG91dCkgPDwgInZhciAiIDw8IGNvdW50ZXIgPDwgIjppbnQgPSAwOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiZm9yICh2YXIgIiA8PCBpdGVyIDw8ICI6KiBpbiAiIDw8IHByZWZpeCA8PCAiKSB7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgICIgPDwgY291bnRlciA8PCArIisrOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZU1hcEJlZ2luKG5ldyBUTWFwKCIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpCi0gICAgICAgICAgICAgICAgPDwgIiwgIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIiA8PCBjb3VudGVyIDw8ICIpKTsiCi0gICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTZXRCZWdpbihuZXcgVFNldCgiIDw8IHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkKLSAgICAgICAgICAgICAgICA8PCAiLCAiIDw8IHByZWZpeCA8PCAiLnNpemUpKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUxpc3RCZWdpbihuZXcgVExpc3QoIgotICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwgcHJlZml4IDw8ICIubGVuZ3RoKSk7IgotICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gIH0KLQotICBzdHJpbmcgaXRlciA9IHRtcCgiZWxlbSIpOwotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImZvciAodmFyICIgPDwgaXRlciA8PCAiOiogaW4gIiA8PCBwcmVmaXggPDwgIikiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJmb3IgZWFjaCAodmFyICIgPDwgaXRlciA8PCAiOiogaW4gIiA8PCBwcmVmaXggPDwgIi50b0FycmF5KCkpIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImZvciBlYWNoICh2YXIgIiA8PCBpdGVyIDw8ICI6KiBpbiAiIDw8IHByZWZpeCA8PCAiKSI7Ci0gIH0KLQotICBzY29wZV91cChvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBpdGVyLCBwcmVmaXgpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOwotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVNYXBFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlU2V0RW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVMaXN0RW5kKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBtYXAuCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbWFwKSB7Ci0gIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCwgIiIpOwotICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgbWFwICsgIlsiICsgaXRlciArICJdIik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQsICIiKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgaXRlcikgewotICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Ci19Ci0KLS8qKgotICogUmV0dXJucyBhIEFzMyB0eXBlIG5hbWUKLSAqCi0gKiBAcGFyYW0gdHR5cGUgVGhlIHR5cGUKLSAqIEBwYXJhbSBjb250YWluZXIgSXMgdGhlIHR5cGUgZ29pbmcgaW5zaWRlIGEgY29udGFpbmVyPwotICogQHJldHVybiBBczMgdHlwZSBuYW1lLCBpLmUuIEhhc2hNYXA8S2V5LFZhbHVlPgotICovCi1zdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl9jb250YWluZXIsIGJvb2wgaW5faW5pdCkgewotICAodm9pZClpbl9pbml0OwotICAvLyBJbiBBczMgdHlwZWRlZnMgYXJlIGp1c3QgcmVzb2x2ZWQgdG8gdGhlaXIgcmVhbCB0eXBlCi0gIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7Ci0gIHN0cmluZyBwcmVmaXg7Ci0KLSAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHJldHVybiBiYXNlX3R5cGVfbmFtZSgodF9iYXNlX3R5cGUqKXR0eXBlLCBpbl9jb250YWluZXIpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gImludCI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICJEaWN0aW9uYXJ5IjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIlNldCI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiAiQXJyYXkiOwotICB9Ci0KLSAgLy8gQ2hlY2sgZm9yIG5hbWVzcGFjaW5nCi0gIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOwotICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKLSAgICBzdHJpbmcgcGFja2FnZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImFzMyIpOwotICAgIGlmICghcGFja2FnZS5lbXB0eSgpKSB7Ci0gICAgICByZXR1cm4gcGFja2FnZSArICIuIiArIHR0eXBlLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgfQotCi0gIHJldHVybiB0dHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBBUzMgdHlwZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSB0aHJpZnQgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGJhc2UgVGhlIGJhc2UgdHlwZQotICogQHBhcmFtIGNvbnRhaW5lciBJcyBpdCBnb2luZyBpbiBhIEFzMyBjb250YWluZXI/Ci0gKi8KLXN0cmluZyB0X2FzM19nZW5lcmF0b3I6OmJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0eXBlLCBib29sIGluX2NvbnRhaW5lcikgewotICAodm9pZClpbl9jb250YWluZXI7Ci0gIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSB0eXBlLT5nZXRfYmFzZSgpOwotCi0gIHN3aXRjaCAodGJhc2UpIHsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgIHJldHVybiAidm9pZCI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgewotICAgICAgcmV0dXJuICJCeXRlQXJyYXkiOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gIlN0cmluZyI7Ci0gICAgfQotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgcmV0dXJuICJCb29sZWFuIjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgcmV0dXJuICJpbnQiOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICB0aHJvdyAiaTY0IGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGluIGFzMyI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgIHJldHVybiAiTnVtYmVyIjsKLSAgZGVmYXVsdDoKLSAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEFzMyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBEZWNsYXJlcyBhIGZpZWxkLCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCi0gKgotICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCi0gKi8KLXN0cmluZyB0X2FzM19nZW5lcmF0b3I6OmRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQpIHsKLSAgLy8gVE9ETyhtY3NsZWUpOiBkbyB3ZSBldmVyIG5lZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGQ/Ci0gIHN0cmluZyByZXN1bHQgPSAidmFyICIgKyB0ZmllbGQtPmdldF9uYW1lKCkgKyAiOiIgKyB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgaWYgKGluaXQpIHsKLSAgICB0X3R5cGUqIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotICAgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgdGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7Ci0gICAgICBvZnN0cmVhbSBkdW1teTsKLSAgICAgIHJlc3VsdCArPSAiID0gIiArIHJlbmRlcl9jb25zdF92YWx1ZShkdW1teSwgdGZpZWxkLT5nZXRfbmFtZSgpLCB0dHlwZSwgdGZpZWxkLT5nZXRfdmFsdWUoKSk7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICByZXN1bHQgKz0gIiA9IG51bGwiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgcmVzdWx0ICs9ICIgPSBmYWxzZSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICByZXN1bHQgKz0gIiA9IDAiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICByZXN1bHQgKz0gIiA9IChkb3VibGUpMCI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICByZXN1bHQgKz0gIiA9IDAiOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgKyAiKCkiOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgKyAiKCkiOwotICAgICAgOwotICAgIH0KLSAgfQotICByZXR1cm4gcmVzdWx0ICsgIjsiOwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KLSAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KLSAqLwotc3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RyaW5nIHByZWZpeCkgewotICBzdGQ6OnN0cmluZyBhcmd1bWVudHMgPSBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSk7Ci0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGlmIChhcmd1bWVudHMgIT0gIiIpIHsKLSAgICAgIGFyZ3VtZW50cyArPSAiLCAiOwotICAgIH0KLSAgICBhcmd1bWVudHMgKz0gIm9uRXJyb3I6RnVuY3Rpb24sIG9uU3VjY2VzczpGdW5jdGlvbiI7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyByZXN1bHQgPSAiZnVuY3Rpb24gIiArIHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIoIiArIGFyZ3VtZW50cyArICIpOnZvaWQiOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBjb21tYSBzZXBhcmF0ZWQgZmllbGQgbGlzdCwgd2l0aCB0eXBlIG5hbWVzCi0gKi8KLXN0cmluZyB0X2FzM19nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgKz0gIiwgIjsKLSAgICB9Ci0gICAgcmVzdWx0ICs9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICI6IiArIHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCkpOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBDKysgZW51bSBzdHJpbmcgZm9yIHRoZSBnaXZlbiB0eXBlLgotICovCi1zdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICJUVHlwZS5TVFJJTkciOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiVFR5cGUuQk9PTCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJUVHlwZS5CWVRFIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiVFR5cGUuSTE2IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiVFR5cGUuSTMyIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiVFR5cGUuSTY0IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiVFR5cGUuRE9VQkxFIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5JMzIiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLlNUUlVDVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLk1BUCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLlNFVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5MSVNUIjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotLyoqCi0gKiBBcHBsaWVzIHRoZSBjb3JyZWN0IHN0eWxlIHRvIGEgc3RyaW5nIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiBub2NhbWVsX3N0eWxlXwotICovCi1zdGQ6OnN0cmluZyB0X2FzM19nZW5lcmF0b3I6OmdldF9jYXBfbmFtZShzdGQ6OnN0cmluZyBuYW1lKSB7Ci0gIG5hbWVbMF0gPSB0b3VwcGVyKG5hbWVbMF0pOwotICByZXR1cm4gbmFtZTsKLX0KLQotc3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6Y29uc3RhbnRfbmFtZShzdHJpbmcgbmFtZSkgewotICBzdHJpbmcgY29uc3RhbnRfbmFtZTsKLQotICBib29sIGlzX2ZpcnN0ID0gdHJ1ZTsKLSAgYm9vbCB3YXNfcHJldmlvdXNfY2hhcl91cHBlciA9IGZhbHNlOwotICBmb3IgKHN0cmluZzo6aXRlcmF0b3IgaXRlciA9IG5hbWUuYmVnaW4oKTsgaXRlciAhPSBuYW1lLmVuZCgpOyArK2l0ZXIpIHsKLSAgICBzdHJpbmc6OnZhbHVlX3R5cGUgY2hhcmFjdGVyID0gKCppdGVyKTsKLQotICAgIGJvb2wgaXNfdXBwZXIgPSBpc3VwcGVyKGNoYXJhY3Rlcik7Ci0KLSAgICBpZiAoaXNfdXBwZXIgJiYgIWlzX2ZpcnN0ICYmICF3YXNfcHJldmlvdXNfY2hhcl91cHBlcikgewotICAgICAgY29uc3RhbnRfbmFtZSArPSAnXyc7Ci0gICAgfQotICAgIGNvbnN0YW50X25hbWUgKz0gdG91cHBlcihjaGFyYWN0ZXIpOwotCi0gICAgaXNfZmlyc3QgPSBmYWxzZTsKLSAgICB3YXNfcHJldmlvdXNfY2hhcl91cHBlciA9IGlzX3VwcGVyOwotICB9Ci0KLSAgcmV0dXJuIGNvbnN0YW50X25hbWU7Ci19Ci0KLS8qKgotICogRW1pdHMgYSBBczNEb2MgY29tbWVudCBpZiB0aGUgcHJvdmlkZWQgb2JqZWN0IGhhcyBhIGRvYyBpbiBUaHJpZnQKLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2FzM19kb2Mob2ZzdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpIHsKLSAgaWYgKHRkb2MtPmhhc19kb2MoKSkgewotICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwgIi8qKlxuIiwgIiAqICIsIHRkb2MtPmdldF9kb2MoKSwgIiAqL1xuIik7Ci0gIH0KLX0KLQotLyoqCi0gKiBFbWl0cyBhIEFzM0RvYyBjb21tZW50IGlmIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBvYmplY3QgaGFzIGEgZG9jIGluIFRocmlmdAotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX2RvYyhvZnN0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgaWYgKHRmdW5jdGlvbi0+aGFzX2RvYygpKSB7Ci0gICAgc3RyaW5nc3RyZWFtIHNzOwotICAgIHNzIDw8IHRmdW5jdGlvbi0+Z2V0X2RvYygpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBwX2l0ZXI7Ci0gICAgZm9yIChwX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgcF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytwX2l0ZXIpIHsKLSAgICAgIHRfZmllbGQqIHAgPSAqcF9pdGVyOwotICAgICAgc3MgPDwgIlxuQHBhcmFtICIgPDwgcC0+Z2V0X25hbWUoKTsKLSAgICAgIGlmIChwLT5oYXNfZG9jKCkpIHsKLSAgICAgICAgc3MgPDwgIiAiIDw8IHAtPmdldF9kb2MoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiLyoqXG4iLCAiICogIiwgc3Muc3RyKCksICIgKi9cbiIpOwotICB9Ci19Ci0KLXN0ZDo6c3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfY2hlY2sodF9maWVsZCogZmllbGQpIHsKLSAgcmV0dXJuIGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkLT5nZXRfbmFtZSgpKTsKLX0KLQotc3RkOjpzdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9jaGVjayhzdGQ6OnN0cmluZyBmaWVsZF9uYW1lKSB7Ci0gIHJldHVybiAiaXMiICsgZ2V0X2NhcF9uYW1lKCJzZXQiKSArIGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKSArICIoKSI7Ci19Ci0KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9zZXQob2ZzdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpIHsKLSAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKGZpZWxkLT5nZXRfdHlwZSgpKSkgewotICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLl9faXNzZXRfIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiID0gdHJ1ZTsiIDw8IGVuZGw7Ci0gIH0KLX0KLQotc3RkOjpzdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjpnZXRfZW51bV9jbGFzc19uYW1lKHRfdHlwZSogdHlwZSkgewotICBzdHJpbmcgcGFja2FnZSA9ICIiOwotICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0eXBlLT5nZXRfcHJvZ3JhbSgpOwotICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKLSAgICBwYWNrYWdlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiYXMzIikgKyAiLiI7Ci0gIH0KLSAgcmV0dXJuIHBhY2thZ2UgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi1USFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAotICAgIGFzMywKLSAgICAiQVMzIiwKLSAgICAiICAgIGJpbmRhYmxlOiAgICAgICAgQWRkIFtiaW5kYWJsZV0gbWV0YWRhdGEgdG8gYWxsIHRoZSBzdHJ1Y3QgY2xhc3Nlcy5cbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfY19nbGliX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9jX2dsaWJfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2FhNGQyLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9jX2dsaWJfZ2VuZXJhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDU2NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCi0gKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgotICogZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgInBsYXRmb3JtLmgiCi0jaW5jbHVkZSAidF9vb3BfZ2VuZXJhdG9yLmgiCi0KLXVzaW5nIHN0ZDo6bWFwOwotdXNpbmcgc3RkOjpvZnN0cmVhbTsKLXVzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKLXVzaW5nIHN0ZDo6c3RyaW5nOwotdXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Ci11c2luZyBzdGQ6OnZlY3RvcjsKLQotc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcwotCi0vKiBmb3J3YXJkIGRlY2xhcmF0aW9ucyAqLwotc3RyaW5nIGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhzdHJpbmcgbmFtZSk7Ci1zdHJpbmcgdW5kZXJzY29yZXNfdG9faW5pdGlhbF9jYXBzKHN0cmluZyBuYW1lKTsKLXN0cmluZyB0b191cHBlcl9jYXNlKHN0cmluZyBuYW1lKTsKLXN0cmluZyB0b19sb3dlcl9jYXNlKHN0cmluZyBuYW1lKTsKLQotLyoqCi0gKiBDIGNvZGUgZ2VuZXJhdG9yLCB1c2luZyBnbGliIGZvciBDIHR5cGluZy4KLSAqLwotY2xhc3MgdF9jX2dsaWJfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7Ci1wdWJsaWM6Ci0gIC8qIGNvbnN0cnVjdG9yICovCi0gIHRfY19nbGliX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXA8c3RyaW5nLCBzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgb3B0aW9uX3N0cmluZykKLSAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKSB7Ci0gICAgKHZvaWQpcGFyc2VkX29wdGlvbnM7Ci0gICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKLSAgICAvKiBzZXQgdGhlIG91dHB1dCBkaXJlY3RvcnkgKi8KLSAgICB0aGlzLT5vdXRfZGlyX2Jhc2VfID0gImdlbi1jX2dsaWIiOwotCi0gICAgLyogc2V0IHRoZSBuYW1lc3BhY2UgKi8KLSAgICB0aGlzLT5uc3BhY2UgPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiY19nbGliIik7Ci0KLSAgICBpZiAodGhpcy0+bnNwYWNlLmVtcHR5KCkpIHsKLSAgICAgIHRoaXMtPm5zcGFjZSA9ICIiOwotICAgICAgdGhpcy0+bnNwYWNlX3UgPSAiIjsKLSAgICAgIHRoaXMtPm5zcGFjZV91YyA9ICIiOwotICAgICAgdGhpcy0+bnNwYWNlX2xjID0gIiI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIHJlcGxhY2UgZG90cyB3aXRoIHVuZGVyc2NvcmVzICovCi0gICAgICBjaGFyKiB0bXAgPSBzdHJkdXAodGhpcy0+bnNwYWNlLmNfc3RyKCkpOwotICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBzdHJsZW4odG1wKTsgaSsrKSB7Ci0gICAgICAgIGlmICh0bXBbaV0gPT0gJy4nKSB7Ci0gICAgICAgICAgdG1wW2ldID0gJ18nOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICB0aGlzLT5uc3BhY2UgPSBzdHJpbmcodG1wLCBzdHJsZW4odG1wKSk7Ci0gICAgICBmcmVlKHRtcCk7Ci0KLSAgICAgIC8qIGNsZWFuIHVwIHRoZSBuYW1lc3BhY2UgZm9yIEMuCi0gICAgICAgKiBBbiBpbnB1dCBvZiAnbmFtZXNwYWNlIGZvbycgc2hvdWxkIHJlc3VsdCBpbjoKLSAgICAgICAqICAtIG5zcGFjZSA9IGZvbyAgICAgICAtIGZvciB0aHJpZnQgb2JqZWN0cyBhbmQgdHlwZWRlZnMKLSAgICAgICAqICAtIG5zcGFjZV91ID0gRm9vICAgICAtIGZvciBpbnRlcm5hbCBHT2JqZWN0IHByZWZpeGVzCi0gICAgICAgKiAgLSBuc3BhY2VfdWMgPSBGT09fICAgLSBmb3IgbWFjcm8gcHJlZml4ZXMKLSAgICAgICAqICAtIG5zcGFjZV9sYyA9IGZvb18gICAtIGZvciBmaWxlbmFtZSBhbmQgbWV0aG9kIHByZWZpeGVzCi0gICAgICAgKiBUaGUgdW5kZXJzY29yZXMgYXJlIHRoZXJlIHNpbmNlIHVjIGFuZCBsYyBzdHJpbmdzIGFyZSB1c2VkIGFzIGZpbGUgYW5kCi0gICAgICAgKiB2YXJpYWJsZSBwcmVmaXhlcy4KLSAgICAgICAqLwotICAgICAgdGhpcy0+bnNwYWNlX3UgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXModGhpcy0+bnNwYWNlKTsKLSAgICAgIHRoaXMtPm5zcGFjZV91YyA9IHRvX3VwcGVyX2Nhc2UodGhpcy0+bnNwYWNlX3UpICsgIl8iOwotICAgICAgdGhpcy0+bnNwYWNlX2xjID0gdG9fbG93ZXJfY2FzZSh0aGlzLT5uc3BhY2VfdSkgKyAiXyI7Ci0gICAgfQotICB9Ci0KLSAgLyogaW5pdGlhbGl6YXRpb24gYW5kIGRlc3RydWN0aW9uICovCi0gIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKLSAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKLQotICAvKiBnZW5lcmF0aW9uIGZ1bmN0aW9ucyAqLwotICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7Ci0gIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb25zdHModmVjdG9yPHRfY29uc3QqPiBjb25zdHMpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHN0cnVjdCk7Ci0KLXByaXZhdGU6Ci0gIC8qIGZpbGUgc3RyZWFtcyAqLwotICBvZnN0cmVhbSBmX3R5cGVzXzsKLSAgb2ZzdHJlYW0gZl90eXBlc19pbXBsXzsKLSAgb2ZzdHJlYW0gZl9oZWFkZXJfOwotICBvZnN0cmVhbSBmX3NlcnZpY2VfOwotCi0gIC8qIG5hbWVzcGFjZSB2YXJpYWJsZXMgKi8KLSAgc3RyaW5nIG5zcGFjZTsKLSAgc3RyaW5nIG5zcGFjZV91OwotICBzdHJpbmcgbnNwYWNlX3VjOwotICBzdHJpbmcgbnNwYWNlX2xjOwotCi0gIC8qIGhlbHBlciBmdW5jdGlvbnMgKi8KLSAgYm9vbCBpc19jb21wbGV4X3R5cGUodF90eXBlKiB0dHlwZSk7Ci0gIHN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl90eXBlZGVmID0gZmFsc2UsIGJvb2wgaXNfY29uc3QgPSBmYWxzZSk7Ci0gIHN0cmluZyBwcm9wZXJ0eV90eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl90eXBlZGVmID0gZmFsc2UsIGJvb2wgaXNfY29uc3QgPSBmYWxzZSk7Ci0gIHN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdHlwZSk7Ci0gIHN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKTsKLSAgc3RyaW5nIGNvbnN0YW50X2xpdGVyYWwodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0gIHN0cmluZyBjb25zdGFudF92YWx1ZShzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0gIHN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLSAgc3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICBzdHJpbmcgeGNlcHRpb25fbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbml0ID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlciA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICBib29sIGNvbnN0YW50ID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVmZXJlbmNlID0gZmFsc2UpOwotICB2b2lkIGRlY2xhcmVfbG9jYWxfdmFyaWFibGUob2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nJiBiYXNlX25hbWUpOwotCi0gIC8qIGdlbmVyYXRpb24gZnVuY3Rpb25zICovCi0gIHZvaWQgZ2VuZXJhdGVfY29uc3RfaW5pdGlhbGl6ZXIoc3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hhbmRsZXIodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfb2JqZWN0KHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3Rfd3JpdGVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0aGlzX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdGhpc19nZXQgPSAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZnVuY3Rpb24gPSB0cnVlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3RfcmVhZGVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0aGlzX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdGhpc19nZXQgPSAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZnVuY3Rpb24gPSB0cnVlKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzdWZmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQpOwotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgsIGludCBlcnJvcl9yZXQpOwotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCwgaW50IGVycm9yX3JldCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQpOwotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIGVsZW1lbnQsIGludCBlcnJvcl9yZXQpOwotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3VmZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhbGxvY2F0ZSA9IHRydWUpOwotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhbGxvY2F0ZSA9IHRydWUpOwotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4LCBpbnQgZXJyb3JfcmV0KTsKLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RyaW5nIHByZWZpeCwgaW50IGVycm9yX3JldCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBwcmVmaXgsIGludCBlcnJvcl9yZXQpOwotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQpOwotCi0gIHN0cmluZyBnZW5lcmF0ZV9uZXdfaGFzaF9mcm9tX3R5cGUodF90eXBlKiBrZXksIHRfdHlwZSogdmFsdWUpOwotICBzdHJpbmcgZ2VuZXJhdGVfbmV3X2FycmF5X2Zyb21fdHlwZSh0X3R5cGUqIHR0eXBlKTsKLQotICBzdHJpbmcgZ2VuZXJhdGVfZnJlZV9mdW5jX2Zyb21fdHlwZSh0X3R5cGUqIHR0eXBlKTsKLSAgc3RyaW5nIGdlbmVyYXRlX2hhc2hfZnVuY19mcm9tX3R5cGUodF90eXBlKiB0dHlwZSk7Ci0gIHN0cmluZyBnZW5lcmF0ZV9jbXBfZnVuY19mcm9tX3R5cGUodF90eXBlKiB0dHlwZSk7Ci19OwotCi0vKioKLSAqIFByZXBhcmUgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZQotICogb3V0cHV0IHN0cmVhbXMuCi0gKi8KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKLSAgLyogY3JlYXRlIG91dHB1dCBkaXJlY3RvcnkgKi8KLSAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKLQotICBzdHJpbmcgcHJvZ3JhbV9uYW1lX3UgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMocHJvZ3JhbV9uYW1lXyk7Ci0gIHN0cmluZyBwcm9ncmFtX25hbWVfdWMgPSB0b191cHBlcl9jYXNlKHByb2dyYW1fbmFtZV91KTsKLSAgc3RyaW5nIHByb2dyYW1fbmFtZV9sYyA9IHRvX2xvd2VyX2Nhc2UocHJvZ3JhbV9uYW1lX3UpOwotCi0gIC8qIGNyZWF0ZSBvdXRwdXQgZmlsZXMgKi8KLSAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyB0aGlzLT5uc3BhY2VfbGMgKyBwcm9ncmFtX25hbWVfbGMgKyAiX3R5cGVzLmgiOwotICBmX3R5cGVzXy5vcGVuKGZfdHlwZXNfbmFtZS5jX3N0cigpKTsKLSAgc3RyaW5nIGZfdHlwZXNfaW1wbF9uYW1lID0gZ2V0X291dF9kaXIoKSArIHRoaXMtPm5zcGFjZV9sYyArIHByb2dyYW1fbmFtZV9sYyArICJfdHlwZXMuYyI7Ci0gIGZfdHlwZXNfaW1wbF8ub3BlbihmX3R5cGVzX2ltcGxfbmFtZS5jX3N0cigpKTsKLQotICAvKiBhZGQgdGhyaWZ0IGJvaWxlcnBsYXRlIGhlYWRlcnMgKi8KLSAgZl90eXBlc18gPDwgYXV0b2dlbl9jb21tZW50KCk7Ci0gIGZfdHlwZXNfaW1wbF8gPDwgYXV0b2dlbl9jb21tZW50KCk7Ci0KLSAgLyogaW5jbHVkZSBpbmNsdXNpb24gZ3VhcmQgKi8KLSAgZl90eXBlc18gPDwgIiNpZm5kZWYgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgcHJvZ3JhbV9uYW1lX3VjIDw8ICJfVFlQRVNfSCIgPDwgZW5kbCA8PCAiI2RlZmluZSAiCi0gICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBwcm9ncmFtX25hbWVfdWMgPDwgIl9UWVBFU19IIiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLyogaW5jbHVkZSBiYXNlIHR5cGVzICovCi0gIGZfdHlwZXNfIDw8ICIvKiBiYXNlIGluY2x1ZGVzICovIiA8PCBlbmRsIDw8ICIjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4iIDw8IGVuZGwKLSAgICAgICAgICAgPDwgIiNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdF9zdHJ1Y3QuaD4iIDw8IGVuZGwKLSAgICAgICAgICAgPDwgIiNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oPiIgPDwgZW5kbDsKLQotICAvKiBpbmNsdWRlIG90aGVyIHRocmlmdCBpbmNsdWRlcyAqLwotICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluY2x1ZGVzLnNpemUoKTsgKytpKSB7Ci0gICAgZl90eXBlc18gPDwgIi8qIG90aGVyIHRocmlmdCBpbmNsdWRlcyAqLyIgPDwgZW5kbCA8PCAiI2luY2x1ZGUgXCIiIDw8IHRoaXMtPm5zcGFjZV9sYwotICAgICAgICAgICAgIDw8IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhpbmNsdWRlc1tpXS0+Z2V0X25hbWUoKSkgPDwgIl90eXBlcy5oXCIiIDw8IGVuZGw7Ci0gIH0KLSAgZl90eXBlc18gPDwgZW5kbDsKLQotICAvKiBpbmNsdWRlIGN1c3RvbSBoZWFkZXJzICovCi0gIGNvbnN0IHZlY3RvcjxzdHJpbmc+JiBjX2luY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9jX2luY2x1ZGVzKCk7Ci0gIGZfdHlwZXNfIDw8ICIvKiBjdXN0b20gdGhyaWZ0IGluY2x1ZGVzICovIiA8PCBlbmRsOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNfaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKLSAgICBpZiAoY19pbmNsdWRlc1tpXVswXSA9PSAnPCcpIHsKLSAgICAgIGZfdHlwZXNfIDw8ICIjaW5jbHVkZSAiIDw8IGNfaW5jbHVkZXNbaV0gPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgZl90eXBlc18gPDwgIiNpbmNsdWRlIFwiIiA8PCBjX2luY2x1ZGVzW2ldIDw8ICJcIiIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLSAgZl90eXBlc18gPDwgZW5kbDsKLQotICAvKiBpbmNsdWRlIG1hdGguaCAoZm9yICJJTkZJTklUWSIpIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBmaWxlLCBpbiBjYXNlIHdlCi0gICAgIGVuY291bnRlciBhIHN0cnVjdCB3aXRoIGEgbWVtYmVyIG9mIHR5cGUgZG91YmxlICovCi0gIGZfdHlwZXNfaW1wbF8gPDwgZW5kbCA8PCAiI2luY2x1ZGUgPG1hdGguaD4iIDw8IGVuZGw7Ci0KLSAgLy8gaW5jbHVkZSB0aGUgdHlwZXMgZmlsZQotICBmX3R5cGVzX2ltcGxfIDw8IGVuZGwgPDwgIiNpbmNsdWRlIFwiIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgcHJvZ3JhbV9uYW1lX3UgPDwgIl90eXBlcy5oXCIiCi0gICAgICAgICAgICAgICAgPDwgZW5kbCA8PCAiI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZl90eXBlc18gPDwgIi8qIGJlZ2luIHR5cGVzICovIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogIEZpbmlzaCB1cCBnZW5lcmF0aW9uIGFuZCBjbG9zZSBhbGwgZmlsZSBzdHJlYW1zLgotICovCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgewotICBzdHJpbmcgcHJvZ3JhbV9uYW1lX3VjID0gdG9fdXBwZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMocHJvZ3JhbV9uYW1lXykpOwotCi0gIC8qIGVuZCB0aGUgaGVhZGVyIGluY2x1c2lvbiBndWFyZCAqLwotICBmX3R5cGVzXyA8PCAiI2VuZGlmIC8qICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHByb2dyYW1fbmFtZV91YyA8PCAiX1RZUEVTX0ggKi8iIDw8IGVuZGw7Ci0KLSAgLyogY2xvc2Ugb3V0cHV0IGZpbGUgKi8KLSAgZl90eXBlc18uY2xvc2UoKTsKLSAgZl90eXBlc19pbXBsXy5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIFRocmlmdCB0eXBlZGVmIGluIEMgY29kZS4gIEZvciBleGFtcGxlOgotICoKLSAqIFRocmlmdDoKLSAqIHR5cGVkZWYgbWFwPGkzMixpMzI+IFNvbWVNYXAKLSAqCi0gKiBDOgotICogdHlwZWRlZiBHSGFzaFRhYmxlICogVGhyaWZ0U29tZU1hcDsKLSAqLwotdm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgewotICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAidHlwZWRlZiAiIDw8IHR5cGVfbmFtZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSwgdHJ1ZSkgPDwgIiAiIDw8IHRoaXMtPm5zcGFjZQotICAgICAgICAgICA8PCB0dHlwZWRlZi0+Z2V0X3N5bWJvbGljKCkgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBDIGVudW1lcmF0aW9uLiAgRm9yIGV4YW1wbGU6Ci0gKgotICogVGhyaWZ0OgotICogZW51bSBNeUVudW0gewotICogICBPTkUgPSAxLAotICogICBUV08KLSAqIH0KLSAqCi0gKiBDOgotICogZW51bSBfVGhyaWZ0TXlFbnVtIHsKLSAqICAgVEhSSUZUX01ZX0VOVU1fT05FID0gMSwKLSAqICAgVEhSSUZUX01ZX0VOVU1fVFdPCi0gKiB9OwotICogdHlwZWRlZiBlbnVtIF9UaHJpZnRNeUVudW0gVGhyaWZ0TXlFbnVtOwotICovCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0gIHN0cmluZyBuYW1lID0gdGVudW0tPmdldF9uYW1lKCk7Ci0gIHN0cmluZyBuYW1lX3VjID0gdG9fdXBwZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMobmFtZSkpOwotCi0gIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJlbnVtIF8iIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICIgeyIgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLQotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotCi0gIC8qIG91dHB1dCBlYWNoIG9mIHRoZSBlbnVtZXJhdGlvbiBlbGVtZW50cyAqLwotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgZl90eXBlc18gPDwgIiwiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IG5hbWVfdWMgPDwgIl8iIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICBmX3R5cGVzXyA8PCAiID0gIiA8PCAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl90eXBlc18gPDwgZW5kbCA8PCAifTsiIDw8IGVuZGwgPDwgInR5cGVkZWYgZW51bSBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiICIKLSAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBmX3R5cGVzXyA8PCAiLyogcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjb25zdGFudCAqLyIgPDwgZW5kbDsKLSAgZl90eXBlc18gPDwgImNvbnN0IGNoYXIgKiIgPDwgZW5kbDsKLSAgZl90eXBlc18gPDwgInRvU3RyaW5nXyIgPDwgbmFtZSA8PCAiKGludCB2YWx1ZSk7ICIgPDwgZW5kbCA8PCBlbmRsOwotICA7Ci0gIGZfdHlwZXNfaW1wbF8gPDwgIi8qIHJldHVybiB0aGUgbmFtZSBvZiB0aGUgY29uc3RhbnQgKi8iIDw8IGVuZGw7Ci0gIGZfdHlwZXNfaW1wbF8gPDwgImNvbnN0IGNoYXIgKiIgPDwgZW5kbDsKLSAgZl90eXBlc19pbXBsXyA8PCAidG9TdHJpbmdfIiA8PCBuYW1lIDw8ICIoaW50IHZhbHVlKSAiIDw8IGVuZGw7Ci0gIGZfdHlwZXNfaW1wbF8gPDwgInsiIDw8IGVuZGw7Ci0gIGZfdHlwZXNfaW1wbF8gPDwgIiAgc3RhdGljIF9fdGhyZWFkIGNoYXIgYnVmWzE2XSA9IHswfTsiIDw8IGVuZGw7Ci0gIGZfdHlwZXNfaW1wbF8gPDwgIiAgc3dpdGNoKHZhbHVlKSB7IiA8PCBlbmRsOwotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGZfdHlwZXNfaW1wbF8gPDwgIiAgY2FzZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBuYW1lX3VjIDw8ICJfIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIjoiCi0gICAgICAgICAgICAgICAgICA8PCAicmV0dXJuIFwiIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgbmFtZV91YyA8PCAiXyIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgICA8PCAiXCI7IiA8PCBlbmRsOwotICB9Ci0gIGZfdHlwZXNfaW1wbF8gPDwgIiAgZGVmYXVsdDogZ19zbnByaW50ZihidWYsIDE2LCBcIiVkXCIsIHZhbHVlKTsgcmV0dXJuIGJ1ZjsiIDw8IGVuZGw7Ci0gIGZfdHlwZXNfaW1wbF8gPDwgIiAgfSIgPDwgZW5kbDsKLSAgZl90eXBlc19pbXBsXyA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBUaHJpZnQgY29uc3RhbnRzIGluIEMgY29kZS4KLSAqLwotdm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cyh2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgewotICBmX3R5cGVzXyA8PCAiLyogY29uc3RhbnRzICovIiA8PCBlbmRsOwotICBmX3R5cGVzX2ltcGxfIDw8ICIvKiBjb25zdGFudHMgKi8iIDw8IGVuZGw7Ci0KLSAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY19pdGVyOwotICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgewotICAgIHN0cmluZyBuYW1lID0gKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIHN0cmluZyBuYW1lX3VjID0gdG9fdXBwZXJfY2FzZShuYW1lKTsKLSAgICBzdHJpbmcgbmFtZV9sYyA9IHRvX2xvd2VyX2Nhc2UobmFtZSk7Ci0gICAgdF90eXBlKiB0eXBlID0gKCpjX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLQotICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IG5hbWVfdWMgPDwgIiAiCi0gICAgICAgICAgICAgPDwgY29uc3RhbnRfdmFsdWUobmFtZV9sYywgdHlwZSwgdmFsdWUpIDw8IGVuZGw7Ci0KLSAgICBnZW5lcmF0ZV9jb25zdF9pbml0aWFsaXplcihuYW1lX2xjLCB0eXBlLCB2YWx1ZSk7Ci0gIH0KLQotICBmX3R5cGVzXyA8PCBlbmRsOwotICBmX3R5cGVzX2ltcGxfIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGUgVGhyaWZ0IHN0cnVjdHMgaW4gQyBjb2RlLCBhcyBHT2JqZWN0cy4gIEV4YW1wbGU6Ci0gKgotICogVGhyaWZ0OgotICogc3RydWN0IEJvbmsKLSAqIHsKLSAqICAgMTogc3RyaW5nIG1lc3NhZ2UsCi0gKiAgIDI6IGkzMiB0eXBlCi0gKiB9Ci0gKgotICogQyBHT2JqZWN0IGluc3RhbmNlIGhlYWRlcjoKLSAqIHN0cnVjdCBfVGhyaWZ0Qm9uawotICogewotICogICBHT2JqZWN0IHBhcmVudDsKLSAqCi0gKiAgIGdjaGFyICogbWVzc2FnZTsKLSAqICAgZ2ludDMyIHR5cGU7Ci0gKiB9OwotICogdHlwZWRlZiBzdHJ1Y3QgX1RocmlmdEJvbmsgVGhyaWZ0Qm9uawotICogLy8gLi4uIGFkZGl0aW9uYWwgR09iamVjdCBib2lsZXJwbGF0ZSAuLi4KLSAqLwotdm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBmX3R5cGVzXyA8PCAiLyogc3RydWN0ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiICovIiA8PCBlbmRsOwotICBnZW5lcmF0ZV9vYmplY3QodHN0cnVjdCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGUgQyBjb2RlIHRvIHJlcHJlc2VudCBUaHJpZnQgc2VydmljZXMuICBDcmVhdGVzIGEgbmV3IEdPYmplY3QKLSAqIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGFjY2VzcyB0aGUgc2VydmljZS4KLSAqLwotdm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgc3ZjbmFtZV91ID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHRzZXJ2aWNlLT5nZXRfbmFtZSgpKTsKLSAgc3RyaW5nIHN2Y25hbWVfdWMgPSB0aGlzLT5uc3BhY2VfdWMgKyB0b191cHBlcl9jYXNlKHN2Y25hbWVfdSk7Ci0gIHN0cmluZyBmaWxlbmFtZSA9IHRoaXMtPm5zcGFjZV9sYyArIHRvX2xvd2VyX2Nhc2Uoc3ZjbmFtZV91KTsKLQotICAvLyBtYWtlIG91dHB1dCBmaWxlcwotICBzdHJpbmcgZl9oZWFkZXJfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBmaWxlbmFtZSArICIuaCI7Ci0gIGZfaGVhZGVyXy5vcGVuKGZfaGVhZGVyX25hbWUuY19zdHIoKSk7Ci0KLSAgc3RyaW5nIHByb2dyYW1fbmFtZV91ID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHByb2dyYW1fbmFtZV8pOwotICBzdHJpbmcgcHJvZ3JhbV9uYW1lX2xjID0gdG9fbG93ZXJfY2FzZShwcm9ncmFtX25hbWVfdSk7Ci0KLSAgLy8gYWRkIGhlYWRlciBmaWxlIGJvaWxlcnBsYXRlCi0gIGZfaGVhZGVyXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKTsKLQotICAvLyBhZGQgYW4gaW5jbHVzaW9uIGd1YXJkCi0gIGZfaGVhZGVyXyA8PCAiI2lmbmRlZiAiIDw8IHN2Y25hbWVfdWMgPDwgIl9IIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIgPDwgc3ZjbmFtZV91YyA8PCAiX0giIDw8IGVuZGwKLSAgICAgICAgICAgIDw8IGVuZGw7Ci0KLSAgLy8gYWRkIHN0YW5kYXJkIGluY2x1ZGVzCi0gIGZfaGVhZGVyXyA8PCAiI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9kaXNwYXRjaF9wcm9jZXNzb3IuaD4iIDw8IGVuZGwgPDwgZW5kbDsKLSAgZl9oZWFkZXJfIDw8ICIjaW5jbHVkZSBcIiIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHByb2dyYW1fbmFtZV9sYyA8PCAiX3R5cGVzLmhcIiIgPDwgZW5kbDsKLQotICAvLyBpZiB3ZSBhcmUgaW5oZXJpdGluZyBmcm9tIGFub3RoZXIgc2VydmljZSwgaW5jbHVkZSBpdHMgaGVhZGVyCi0gIHRfc2VydmljZSogZXh0ZW5kc19zZXJ2aWNlID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7Ci0gIGlmIChleHRlbmRzX3NlcnZpY2UgIT0gTlVMTCkgewotICAgIGZfaGVhZGVyXyA8PCAiI2luY2x1ZGUgXCIiIDw8IHRoaXMtPm5zcGFjZV9sYwotICAgICAgICAgICAgICA8PCB0b19sb3dlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhleHRlbmRzX3NlcnZpY2UtPmdldF9uYW1lKCkpKSA8PCAiLmhcIiIKLSAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgfQotICBmX2hlYWRlcl8gPDwgZW5kbDsKLQotICAvLyBjcmVhdGUgdGhlIHNlcnZpY2UgaW1wbGVtZW50YXRpb24KLSAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gZ2V0X291dF9kaXIoKSArIGZpbGVuYW1lICsgIi5jIjsKLSAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOwotCi0gIC8vIGFkZCB0aGUgYm9pbGVycGxhY2UgaGVhZGVyCi0gIGZfc2VydmljZV8gPDwgYXV0b2dlbl9jb21tZW50KCk7Ci0KLSAgLy8gaW5jbHVkZSB0aGUgaGVhZGVycwotICBmX3NlcnZpY2VfIDw8ICIjaW5jbHVkZSA8c3RyaW5nLmg+IiA8PCBlbmRsIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4iIDw8IGVuZGwKLSAgICAgICAgICAgICA8PCAiI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbi5oPiIgPDwgZW5kbCA8PCAiI2luY2x1ZGUgXCIiCi0gICAgICAgICAgICAgPDwgZmlsZW5hbWUgPDwgIi5oXCIiIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBnZW5lcmF0ZSB0aGUgc2VydmljZS1oZWxwZXIgY2xhc3NlcwotICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOwotCi0gIC8vIGdlbmVyYXRlIHRoZSBjbGllbnQgb2JqZWN0cwotICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7Ci0KLSAgLy8gZ2VuZXJhdGUgdGhlIHNlcnZlciBvYmplY3RzCi0gIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRzZXJ2aWNlKTsKLQotICAvLyBlbmQgdGhlIGhlYWRlciBpbmNsdXNpb24gZ3VhcmQKLSAgZl9oZWFkZXJfIDw8ICIjZW5kaWYgLyogIiA8PCBzdmNuYW1lX3VjIDw8ICJfSCAqLyIgPDwgZW5kbDsKLQotICAvLyBjbG9zZSB0aGUgZmlsZXMKLSAgZl9zZXJ2aWNlXy5jbG9zZSgpOwotICBmX2hlYWRlcl8uY2xvc2UoKTsKLX0KLQotLyoqCi0gKgotICovCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBzdHJpbmcgbmFtZV91ID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKG5hbWUpOwotICBzdHJpbmcgbmFtZV9sYyA9IHRvX2xvd2VyX2Nhc2UobmFtZV91KTsKLSAgc3RyaW5nIG5hbWVfdWMgPSB0b191cHBlcl9jYXNlKG5hbWVfdSk7Ci0KLSAgZ2VuZXJhdGVfb2JqZWN0KHRzdHJ1Y3QpOwotCi0gIGZfdHlwZXNfIDw8ICIvKiBleGNlcHRpb24gKi8iIDw8IGVuZGwKLSAgICAgICAgICAgPDwgInR5cGVkZWYgZW51bSIgPDwgZW5kbAotICAgICAgICAgICA8PCAieyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBuYW1lX3VjIDw8ICJfRVJST1JfQ09ERSIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgZl90eXBlc18gPDwgIn0gIiA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiRXJyb3I7IiA8PCBlbmRsCi0gICAgICAgICAgIDw8IGVuZGwKLSAgICAgICAgICAgPDwgIkdRdWFyayAiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX2xjCi0gICAgICAgICAgIDw8ICJfZXJyb3JfcXVhcmsgKHZvaWQpOyIgPDwgZW5kbAotICAgICAgICAgICA8PCAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBuYW1lX3VjIDw8ICJfRVJST1IgKCIKLSAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfbGMgPDwgIl9lcnJvcl9xdWFyaygpKSIgPDwgZW5kbAotICAgICAgICAgICA8PCBlbmRsCi0gICAgICAgICAgIDw8IGVuZGw7Ci0KLSAgZl90eXBlc19pbXBsXyA8PCAiLyogZGVmaW5lIHRoZSBHRXJyb3IgZG9tYWluIGZvciBleGNlcHRpb25zICovIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIKLSAgICAgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgbmFtZV91YyA8PCAiX0VSUk9SX0RPTUFJTiBcIiIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfbGMKLSAgICAgICAgICAgICAgICA8PCAiX2Vycm9yX3F1YXJrXCIiIDw8IGVuZGwgPDwgIkdRdWFyayIgPDwgZW5kbCA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV9sYwotICAgICAgICAgICAgICAgIDw8ICJfZXJyb3JfcXVhcmsgKHZvaWQpIiA8PCBlbmRsIDw8ICJ7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgPDwgIiAgcmV0dXJuIGdfcXVhcmtfZnJvbV9zdGF0aWNfc3RyaW5nICgiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBuYW1lX3VjCi0gICAgICAgICAgICAgICAgPDwgIl9FUlJPUl9ET01BSU4pOyIgPDwgZW5kbCA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioKLSAqIEhFTFBFUiBGVU5DVElPTlMgKgotICoqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIFJldHVybnMgdHJ1ZSBpZiB0dHlwZSBpcyBub3QgYSBwcmltaXRpdmUuCi0gKi8KLWJvb2wgdF9jX2dsaWJfZ2VuZXJhdG9yOjppc19jb21wbGV4X3R5cGUodF90eXBlKiB0dHlwZSkgewotICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOwotCi0gIHJldHVybiB0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpOwotfQotCi0vKioKLSAqIE1hcHMgYSBUaHJpZnQgdF90eXBlIHRvIGEgQyB0eXBlLgotICovCi1zdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl90eXBlZGVmLCBib29sIGlzX2NvbnN0KSB7Ci0gIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICBzdHJpbmcgYm5hbWUgPSBiYXNlX3R5cGVfbmFtZSgodF9iYXNlX3R5cGUqKXR0eXBlKTsKLQotICAgIGlmIChpc19jb25zdCkgewotICAgICAgcmV0dXJuICJjb25zdCAiICsgYm5hbWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBibmFtZTsKLSAgICB9Ci0gIH0KLQotICBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgc3RyaW5nIGNuYW1lOwotCi0gICAgdF9jb250YWluZXIqIHRjb250YWluZXIgPSAodF9jb250YWluZXIqKXR0eXBlOwotICAgIGlmICh0Y29udGFpbmVyLT5oYXNfY3BwX25hbWUoKSkgewotICAgICAgY25hbWUgPSB0Y29udGFpbmVyLT5nZXRfY3BwX25hbWUoKTsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgICAgY25hbWUgPSAiR0hhc2hUYWJsZSI7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIC8vIHNpbmNlIGEgc2V0IHJlcXVpcmVzIHVuaXF1ZSBlbGVtZW50cywgdXNlIGEgR0hhc2hUYWJsZSwgYW5kCi0gICAgICAvLyBwb3B1bGF0ZSB0aGUga2V5cyBhbmQgdmFsdWVzIHdpdGggdGhlIHNhbWUgZGF0YSwgdXNpbmcga2V5cyBmb3IKLSAgICAgIC8vIHRoZSBhY3R1YWwgd3JpdGVzIGFuZCByZWFkcy4KLSAgICAgIC8vIFRPRE86IGRpc2N1c3Mgd2hldGhlciBvciBub3QgdG8gaW1wbGVtZW50IFRTZXQsIFRIYXNoU2V0IG9yIEdIYXNoU2V0Ci0gICAgICBjbmFtZSA9ICJHSGFzaFRhYmxlIjsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIC8vIFRPRE86IGludmVzdGlnYXRlIG90aGVyIGltcGxlbWVudGF0aW9ucyBiZXNpZGVzIEdQdHJBcnJheQotICAgICAgY25hbWUgPSAiR1B0ckFycmF5IjsKLSAgICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgICBpZiAoZXR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKilldHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IGRldGVybWluZSBhcnJheSB0eXBlIjsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICAgIGNuYW1lID0gIkdBcnJheSI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gYXJyYXkgaW5mbyBmb3IgdHlwZSI7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBPbWl0IHRoZSBkZXJlZmVyZW5jZSBvcGVyYXRvciBpZiB3ZSBhcmUgYWxpYXNpbmcgdGhpcyB0eXBlIHdpdGhpbiBhCi0gICAgICAgdHlwZWRlZiwgdG8gYWxsb3cgdGhlIHR5cGUgdG8gYmUgdXNlZCBtb3JlIG5hdHVyYWxseSBpbiBjbGllbnQgY29kZTsKLSAgICAgICBvdGhlcndpc2UsIGluY2x1ZGUgaXQgKi8KLSAgICBpZiAoIWluX3R5cGVkZWYpIHsKLSAgICAgIGNuYW1lICs9ICIgKiI7Ci0gICAgfQotCi0gICAgaWYgKGlzX2NvbnN0KSB7Ci0gICAgICByZXR1cm4gImNvbnN0ICIgKyBjbmFtZTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIGNuYW1lOwotICAgIH0KLSAgfQotCi0gIC8vIGNoZWNrIGZvciBhIG5hbWVzcGFjZQotICBzdHJpbmcgcG5hbWUgPSB0aGlzLT5uc3BhY2UgKyB0dHlwZS0+Z2V0X25hbWUoKTsKLQotICBpZiAoaXNfY29tcGxleF90eXBlKHR0eXBlKSkgewotICAgIHBuYW1lICs9ICIgKiI7Ci0gIH0KLQotICBpZiAoaXNfY29uc3QpIHsKLSAgICByZXR1cm4gImNvbnN0ICIgKyBwbmFtZTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gcG5hbWU7Ci0gIH0KLX0KLQotLyoqCi0gKiBNYXBzIGEgVGhyaWZ0IHByaW1pdGl2ZSB0byB0aGUgdHlwZSBuZWVkZWQgdG8gaG9sZCBpdHMgdmFsdWUgd2hlbiB1c2VkIGFzIGFuCi0gKiBvYmplY3QgcHJvcGVydHkuCi0gKgotICogVGhpcyBtZXRob2QgaXMgbmVlZGVkIGJlY2F1c2UgYWxsIGludGVnZXIgcHJvcGVydGllcyBvZiB3aWR0aCBsZXNzIHRoYW4gNjQKLSAqIGJpdHMgbWFwIHRvIHRoZSBzYW1lIHR5cGUsIGdpbnQsIGFzIG9wcG9zZWQgdG8gdGhlaXIgd2lkdGgtc3BlY2lmaWMgdHlwZQotICogKGdpbnQ4LCBnaW50MTYgb3IgZ2ludDMyKS4KLSAqLwotc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6cHJvcGVydHlfdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgaW5fdHlwZWRlZiwgYm9vbCBpc19jb25zdCkgewotICBzdHJpbmcgcmVzdWx0OwotCi0gIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICBzd2l0Y2ggKCgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIGlmIChpc19jb25zdCkgewotICAgICAgICByZXN1bHQgPSAiY29uc3QgZ2ludCI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXN1bHQgPSAiZ2ludCI7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXN1bHQgPSB0eXBlX25hbWUodHR5cGUsIGluX3R5cGVkZWYsIGlzX2NvbnN0KTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgcmVzdWx0ID0gdHlwZV9uYW1lKHR0eXBlLCBpbl90eXBlZGVmLCBpc19jb25zdCk7Ci0gIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIE1hcHMgYSBUaHJpZnQgcHJpbWl0aXZlIHRvIGEgQyBwcmltaXRpdmUuCi0gKi8KLXN0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OmJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0eXBlKSB7Ci0gIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSB0eXBlLT5nZXRfYmFzZSgpOwotCi0gIHN3aXRjaCAodGJhc2UpIHsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgIHJldHVybiAidm9pZCI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgewotICAgICAgcmV0dXJuICJHQnl0ZUFycmF5ICoiOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gImdjaGFyICoiOwotICAgIH0KLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgIHJldHVybiAiZ2Jvb2xlYW4iOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgcmV0dXJuICJnaW50OCI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIHJldHVybiAiZ2ludDE2IjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgcmV0dXJuICJnaW50MzIiOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICByZXR1cm4gImdpbnQ2NCI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgIHJldHVybiAiZ2RvdWJsZSI7Ci0gIGRlZmF1bHQ6Ci0gICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDIGJhc2UgdHlwZSBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBSZXR1cm5zIGEgbWVtYmVyIG9mIHRoZSBUaHJpZnRUeXBlIEMgZW51bWVyYXRpb24gaW4gdGhyaWZ0X3Byb3RvY29sLmgKLSAqIGZvciBhIFRocmlmdCB0eXBlLgotICovCi1zdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLQotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gIlRfU1RSSU5HIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gIlRfQk9PTCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJUX0JZVEUiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICJUX0kxNiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gIlRfSTMyIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiVF9JNjQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJUX0RPVUJMRSI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiVF9JMzIiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpKSB7Ci0gICAgcmV0dXJuICJUX1NUUlVDVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiVF9TVFJVQ1QiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICJUX01BUCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIlRfU0VUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIlRfTElTVCI7Ci0gIH0KLQotICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLS8qKgotICogUmV0dXJucyBhIFRocmlmdCBjb25zdGFudCBmb3JtYXR0ZWQgYXMgYSBsaXRlcmFsIGZvciBpbmNsdXNpb24gaW4gQyBjb2RlLgotICovCi1zdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjpjb25zdGFudF9saXRlcmFsKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKLSAgb3N0cmluZ3N0cmVhbSByZW5kZXI7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgLyogcHJpbWl0aXZlcyAqLwotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLQotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJlbmRlciA8PCAiXCIiICsgdmFsdWUtPmdldF9zdHJpbmcoKSArICJcIiI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZW5kZXIgPDwgKCh2YWx1ZS0+Z2V0X2ludGVnZXIoKSAhPSAwKSA/ICJUUlVFIiA6ICJGQUxTRSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgdF9jb25zdF92YWx1ZTo6dF9jb25zdF92YWx1ZV90eXBlIHZhbHVlX3R5cGUgPSB2YWx1ZS0+Z2V0X3R5cGUoKTsKLQotICAgIHN3aXRjaCAodmFsdWVfdHlwZSkgewotICAgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfSURFTlRJRklFUjoKLSAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfTElTVDoKLSAgICAgIHJlbmRlciA8PCAieyAiOwotICAgICAgewotICAgICAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgICAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiBsaXN0ID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGxpc3RfaXRlcjsKLQotICAgICAgICBpZiAobGlzdC5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgbGlzdF9pdGVyID0gbGlzdC5iZWdpbigpOwotICAgICAgICAgIHJlbmRlciA8PCBjb25zdGFudF9saXRlcmFsKGVsZW1fdHlwZSwgKmxpc3RfaXRlcik7Ci0KLSAgICAgICAgICB3aGlsZSAoKytsaXN0X2l0ZXIgIT0gbGlzdC5lbmQoKSkgewotICAgICAgICAgICAgcmVuZGVyIDw8ICIsICIgPDwgY29uc3RhbnRfbGl0ZXJhbChlbGVtX3R5cGUsICpsaXN0X2l0ZXIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmVuZGVyIDw8ICIgfSI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX01BUDoKLSAgICBkZWZhdWx0OgotICAgICAgcmVuZGVyIDw8ICJOVUxMIC8qIG5vdCBzdXBwb3J0ZWQgKi8iOwotICAgIH0KLSAgfQotCi0gIHJldHVybiByZW5kZXIuc3RyKCk7Ci19Ci0KLS8qKgotICogUmV0dXJucyBDIGNvZGUgdGhhdCByZXByZXNlbnRzIGEgVGhyaWZ0IGNvbnN0YW50LgotICovCi1zdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjpjb25zdGFudF92YWx1ZShzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewotICBvc3RyaW5nc3RyZWFtIHJlbmRlcjsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAvKiBwcmltaXRpdmVzICovCi0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJlbmRlciA8PCAiZ19zdHJkdXAgKFwiIiArIHZhbHVlLT5nZXRfc3RyaW5nKCkgKyAiXCIpIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJlbmRlciA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpICE9IDApID8gMSA6IDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmVuZGVyIDw8ICIoIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIikiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkgfHwgdHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpCi0gICAgICAgICAgICAgfHwgdHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZW5kZXIgPDwgIigiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCB0b19sb3dlcl9jYXNlKG5hbWUpIDw8ICJfY29uc3RhbnQoKSkiOwotICB9IGVsc2UgewotICAgIHJlbmRlciA8PCAiTlVMTCAvKiBub3Qgc3VwcG9ydGVkICovIjsKLSAgfQotCi0gIHJldHVybiByZW5kZXIuc3RyKCk7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJwotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgotICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgotICovCi1zdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIHRfdHlwZSogdHR5cGUgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7Ci0gIHRfc3RydWN0KiBhcmdsaXN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOwotICB0X3N0cnVjdCogeGxpc3QgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgc3RyaW5nIGZuYW1lID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSk7Ci0KLSAgYm9vbCBoYXNfcmV0dXJuID0gIXR0eXBlLT5pc192b2lkKCk7Ci0gIGJvb2wgaGFzX2FyZ3MgPSBhcmdsaXN0LT5nZXRfbWVtYmVycygpLnNpemUoKSA9PSAwOwotICBib29sIGhhc194Y2VwdGlvbnMgPSB4bGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPT0gMDsKLSAgcmV0dXJuICJnYm9vbGVhbiAiICsgdGhpcy0+bnNwYWNlX2xjICsgZm5hbWUgKyAiICgiICsgdGhpcy0+bnNwYWNlICsgc2VydmljZV9uYW1lXyArICJJZiAqIGlmYWNlIgotICAgICAgICAgKyAoaGFzX3JldHVybiA/ICIsICIgKyB0eXBlX25hbWUodHR5cGUpICsgIiogX3JldHVybiIgOiAiIikKLSAgICAgICAgICsgKGhhc19hcmdzID8gIiIgOiAoIiwgIiArIGFyZ3VtZW50X2xpc3QoYXJnbGlzdCkpKQotICAgICAgICAgKyAoaGFzX3hjZXB0aW9ucyA/ICIiIDogKCIsICIgKyB4Y2VwdGlvbl9saXN0KHhsaXN0KSkpICsgIiwgR0Vycm9yICoqIGVycm9yKSI7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZpZWxkIGxpc3QKLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqIEByZXR1cm4gQ29tbWEgc2VwZWFyYXRlZCBsaXN0IG9mIGFsbCBmaWVsZCBuYW1lcyBpbiB0aGF0IHN0cnVjdAotICovCi1zdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ICs9ICIsICI7Ci0gICAgfQotICAgIHJlc3VsdCArPSB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgdHJ1ZSkgKyAiICIgKyAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIG11dGFibGUgZXhjZXB0aW9uIGxpc3RzCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKiBAcmV0dXJuIENvbW1hIHNlcGVhcmF0ZWQgbGlzdCBvZiBhbGwgZmllbGQgbmFtZXMgaW4gdGhhdCBzdHJ1Y3QKLSAqLwotc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6eGNlcHRpb25fbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiLCAiOwotICAgIH0KLSAgICByZXN1bHQgKz0gdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSArICIqICIgKyAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBEZWNsYXJlcyBhIGZpZWxkLCBpbmNsdWRpbmcgYW55IG5lY2Vzc2FyeSBpbml0aWFsaXphdGlvbi4KLSAqLwotc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNvbnN0YW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlZmVyZW5jZSkgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0gIGlmIChjb25zdGFudCkgewotICAgIHJlc3VsdCArPSAiY29uc3QgIjsKLSAgfQotICByZXN1bHQgKz0gdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gIGlmIChwb2ludGVyKSB7Ci0gICAgcmVzdWx0ICs9ICIqIjsKLSAgfQotICBpZiAocmVmZXJlbmNlKSB7Ci0gICAgcmVzdWx0ICs9ICIqIjsKLSAgfQotICByZXN1bHQgKz0gIiAiICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICBpZiAoaW5pdCkgewotICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgcmVzdWx0ICs9ICIgPSAoZ2RvdWJsZSkgMCI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIHJlc3VsdCArPSAiID0gTlVMTCI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDIGludGlhbGl6ZXIgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgcmVzdWx0ICs9ICIgPSAoIiArIHR5cGVfbmFtZSh0eXBlKSArICIpIDAiOwotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICAgIHJlc3VsdCArPSAiID0gTlVMTCI7Ci0gICAgfQotICB9Ci0KLSAgaWYgKCFyZWZlcmVuY2UpIHsKLSAgICByZXN1bHQgKz0gIjsiOwotICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgQyBjb2RlIHRoYXQgaW5pdGlhbGl6ZXMgY29tcGxleCBjb25zdGFudHMuCi0gKi8KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdF9pbml0aWFsaXplcihzdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKLSAgc3RyaW5nIG5hbWVfdSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhuYW1lKTsKLSAgc3RyaW5nIG5hbWVfbGMgPSB0b19sb3dlcl9jYXNlKG5hbWVfdSk7Ci0gIHN0cmluZyB0eXBlX3UgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXModHlwZS0+Z2V0X25hbWUoKSk7Ci0gIHN0cmluZyB0eXBlX3VjID0gdG9fdXBwZXJfY2FzZSh0eXBlX3UpOwotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgb3N0cmluZ3N0cmVhbSBpbml0aWFsaXplcnM7Ci0KLSAgICAvLyBpbml0aWFsaXplIGFueSBjb25zdGFudHMgdGhhdCBtYXkgYmUgcmVmZXJlbmNlZCBieSB0aGlzIGluaXRpYWxpemVyCi0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7Ci0gICAgICBzdHJpbmcgZmllbGRfbmFtZSA9ICIiOwotCi0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgewotICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgICAgICAgZmllbGRfbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiCi0gICAgICAgICAgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgICBmaWVsZF9uYW1lID0gdG1wKGZpZWxkX25hbWUpOwotCi0gICAgICBnZW5lcmF0ZV9jb25zdF9pbml0aWFsaXplcihuYW1lICsgIl9jb25zdGFudF8iICsgZmllbGRfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBpbml0aWFsaXplcnMgPDwgIiAgICBjb25zdGFudC0+IiA8PCB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkgPDwgIiA9ICIKLSAgICAgICAgICAgICAgICAgICA8PCBjb25zdGFudF92YWx1ZShuYW1lICsgIl9jb25zdGFudF8iICsgZmllbGRfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfaXRlci0+c2Vjb25kKSA8PCAiOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgICAgIDw8ICIgICAgY29uc3RhbnQtPl9faXNzZXRfIiA8PCB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkKLSAgICAgICAgICAgICAgICAgICA8PCAiID0gVFJVRTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gaW1wbGVtZW50IHRoZSBpbml0aWFsaXplcgotICAgIGZfdHlwZXNfaW1wbF8gPDwgInN0YXRpYyAiIDw8IHRoaXMtPm5zcGFjZSA8PCB0eXBlLT5nZXRfbmFtZSgpIDw8ICIgKiIKLSAgICAgICAgICAgICAgICAgIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX2xjIDw8ICJfY29uc3RhbnQgKHZvaWQpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfdHlwZXNfaW1wbF8pOwotICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInN0YXRpYyAiIDw8IHRoaXMtPm5zcGFjZSA8PCB0eXBlLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgICA8PCAiICpjb25zdGFudCA9IE5VTEw7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKGNvbnN0YW50ID09IE5VTEwpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfdHlwZXNfaW1wbF8pOwotICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImNvbnN0YW50ID0gZ19vYmplY3RfbmV3ICgiIDw8IHRoaXMtPm5zcGFjZV91YwotICAgICAgICAgICAgICAgICAgPDwgIlRZUEVfIiA8PCB0eXBlX3VjIDw8ICIsIE5VTEwpOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgICAgPDwgaW5pdGlhbGl6ZXJzLnN0cigpOwotICAgIHNjb3BlX2Rvd24oZl90eXBlc19pbXBsXyk7Ci0gICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGNvbnN0YW50OyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKGZfdHlwZXNfaW1wbF8pOwotICAgIGZfdHlwZXNfaW1wbF8gPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICBzdHJpbmcgbGlzdF90eXBlID0gIkdQdHJBcnJheSAqIjsKLSAgICAvLyBUT0RPOiBUaGlzIGluaXRpYWxpemF0aW9uIHNob3VsZCBjb250YWluIGEgZnJlZSBmdW5jdGlvbiBmb3IgY29udGFpbmVyCi0gICAgc3RyaW5nIGxpc3RfaW5pdGlhbGl6ZXIgPSAiZ19wdHJfYXJyYXlfbmV3KCk7IjsKLSAgICBzdHJpbmcgbGlzdF9hcHBlbmRlciA9ICJnX3B0cl9hcnJheV9hZGQiOwotICAgIGJvb2wgbGlzdF92YXJpYWJsZSA9IGZhbHNlOwotCi0gICAgdF90eXBlKiBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBvc3RyaW5nc3RyZWFtIGluaXRpYWxpemVyczsKLSAgICBvc3RyaW5nc3RyZWFtIGFwcGVuZGVyczsKLQotICAgIGxpc3RfaW5pdGlhbGl6ZXIgPSBnZW5lcmF0ZV9uZXdfYXJyYXlfZnJvbV90eXBlKGV0eXBlKTsKLSAgICBpZiAoZXR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopZXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBkZXRlcm1pbmUgYXJyYXkgdHlwZSI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgbGlzdF90eXBlID0gIkdBcnJheSAqIjsKLSAgICAgICAgbGlzdF9hcHBlbmRlciA9ICJnX2FycmF5X2FwcGVuZF92YWwiOwotICAgICAgICBsaXN0X3ZhcmlhYmxlID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGFycmF5IGluZm8gZm9yIHR5cGUiOwotICAgICAgfQotICAgIH0KLQotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBzdHJpbmcgZm5hbWUgPSB0bXAobmFtZSk7Ci0KLSAgICAgIGdlbmVyYXRlX2NvbnN0X2luaXRpYWxpemVyKGZuYW1lLCBldHlwZSwgKCp2X2l0ZXIpKTsKLSAgICAgIGlmIChsaXN0X3ZhcmlhYmxlKSB7Ci0gICAgICAgIGluaXRpYWxpemVycyA8PCAiICAgICIgPDwgdHlwZV9uYW1lKGV0eXBlKSA8PCAiICIgPDwgZm5hbWUgPDwgIiA9ICIKLSAgICAgICAgICAgICAgICAgICAgIDw8IGNvbnN0YW50X3ZhbHVlKGZuYW1lLCAodF90eXBlKilldHlwZSwgKCp2X2l0ZXIpKSA8PCAiOyIKLSAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICAgIGFwcGVuZGVycyA8PCAiICAgICIgPDwgbGlzdF9hcHBlbmRlciA8PCAiKGNvbnN0YW50LCAiIDw8IGZuYW1lIDw8ICIpOyIKLSAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBhcHBlbmRlcnMgPDwgIiAgICAiIDw8IGxpc3RfYXBwZW5kZXIgPDwgIihjb25zdGFudCwgIgotICAgICAgICAgICAgICAgICAgPDwgY29uc3RhbnRfdmFsdWUoZm5hbWUsICh0X3R5cGUqKWV0eXBlLCAoKnZfaXRlcikpIDw8ICIpOyIKLSAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZl90eXBlc19pbXBsXyA8PCAic3RhdGljICIgPDwgbGlzdF90eXBlIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX2xjIDw8ICJfY29uc3RhbnQgKHZvaWQpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfdHlwZXNfaW1wbF8pOwotICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInN0YXRpYyAiIDw8IGxpc3RfdHlwZSA8PCAiIGNvbnN0YW50ID0gTlVMTDsiCi0gICAgICAgICAgICAgICAgICA8PCBlbmRsCi0gICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKGNvbnN0YW50ID09IE5VTEwpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfdHlwZXNfaW1wbF8pOwotICAgIGlmICghaW5pdGlhbGl6ZXJzLnN0cigpLmVtcHR5KCkpIHsKLSAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5pdGlhbGl6ZXJzLnN0cigpCi0gICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgfQotICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImNvbnN0YW50ID0gIiA8PCBsaXN0X2luaXRpYWxpemVyIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgIDw8IGFwcGVuZGVycy5zdHIoKTsKLSAgICBzY29wZV9kb3duKGZfdHlwZXNfaW1wbF8pOwotICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInJldHVybiBjb25zdGFudDsiIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihmX3R5cGVzX2ltcGxfKTsKLSAgICBmX3R5cGVzX2ltcGxfIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgb3N0cmluZ3N0cmVhbSBpbml0aWFsaXplcnM7Ci0gICAgb3N0cmluZ3N0cmVhbSBhcHBlbmRlcnM7Ci0KLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgc3RyaW5nIGZuYW1lID0gdG1wKG5hbWUpOwotICAgICAgZ2VuZXJhdGVfY29uc3RfaW5pdGlhbGl6ZXIoZm5hbWUsIGV0eXBlLCAoKnZfaXRlcikpOwotICAgICAgaW5pdGlhbGl6ZXJzIDw8ICIgICAgIiA8PCB0eXBlX25hbWUoZXR5cGUpIDw8ICIgIiA8PCBmbmFtZSA8PCAiID0gIgotICAgICAgICAgICAgICAgICAgIDw8IGNvbnN0YW50X3ZhbHVlKGZuYW1lLCAodF90eXBlKilldHlwZSwgKCp2X2l0ZXIpKSA8PCAiOyIKLSAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgICAgYXBwZW5kZXJzIDw8ICIgICAgZ19oYXNoX3RhYmxlX2luc2VydCAoY29uc3RhbnQsICYiIDw8IGZuYW1lIDw8ICIsICYiCi0gICAgICAgICAgICAgICAgPDwgZm5hbWUgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGZfdHlwZXNfaW1wbF8gPDwgInN0YXRpYyBHSGFzaFRhYmxlICoiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX2xjIDw8ICJfY29uc3RhbnQgKHZvaWQpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfdHlwZXNfaW1wbF8pOwotICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInN0YXRpYyBHSGFzaFRhYmxlICpjb25zdGFudCA9IE5VTEw7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKGNvbnN0YW50ID09IE5VTEwpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfdHlwZXNfaW1wbF8pOwotICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5pdGlhbGl6ZXJzLnN0cigpCi0gICAgICAgICAgICAgICAgICA8PCBlbmRsCi0gICAgICAgICAgICAgICAgICAvLyBUT0RPOiBUaGlzIGluaXRpYWxpemF0aW9uIHNob3VsZCBjb250YWluIGEgZnJlZSBmdW5jdGlvbgotICAgICAgICAgICAgICAgICAgLy8gZm9yIGVsZW1lbnRzCi0gICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiY29uc3RhbnQgPSBnX2hhc2hfdGFibGVfbmV3IChOVUxMLCBOVUxMKTsiCi0gICAgICAgICAgICAgICAgICA8PCBlbmRsCi0gICAgICAgICAgICAgICAgICA8PCBhcHBlbmRlcnMuc3RyKCk7Ci0gICAgc2NvcGVfZG93bihmX3R5cGVzX2ltcGxfKTsKLSAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gY29uc3RhbnQ7IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24oZl90eXBlc19pbXBsXyk7Ci0gICAgZl90eXBlc19pbXBsXyA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBvc3RyaW5nc3RyZWFtIGluaXRpYWxpemVyczsKLSAgICBvc3RyaW5nc3RyZWFtIGFwcGVuZGVyczsKLQotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBzdHJpbmcgZm5hbWUgPSB0bXAobmFtZSk7Ci0gICAgICBzdHJpbmcga25hbWUgPSBmbmFtZSArICJrZXkiOwotICAgICAgc3RyaW5nIHZuYW1lID0gZm5hbWUgKyAidmFsIjsKLSAgICAgIGdlbmVyYXRlX2NvbnN0X2luaXRpYWxpemVyKGtuYW1lLCBrdHlwZSwgKCp2X2l0ZXIpKTsKLSAgICAgIGdlbmVyYXRlX2NvbnN0X2luaXRpYWxpemVyKHZuYW1lLCB2dHlwZSwgKCp2X2l0ZXIpKTsKLQotICAgICAgaW5pdGlhbGl6ZXJzIDw8ICIgICAgIiA8PCB0eXBlX25hbWUoa3R5cGUpIDw8ICIgIiA8PCBrbmFtZSA8PCAiID0gIgotICAgICAgICAgICAgICAgICAgIDw8IGNvbnN0YW50X3ZhbHVlKGtuYW1lLCAodF90eXBlKilrdHlwZSwgKCp2X2l0ZXIpKSA8PCAiOyIKLSAgICAgICAgICAgICAgICAgICA8PCBlbmRsCi0gICAgICAgICAgICAgICAgICAgPDwgIiAgICAiIDw8IHR5cGVfbmFtZSh2dHlwZSkgPDwgIiAiIDw8IHZuYW1lIDw8ICIgPSAiCi0gICAgICAgICAgICAgICAgICAgPDwgY29uc3RhbnRfdmFsdWUodm5hbWUsICh0X3R5cGUqKXZ0eXBlLCAoKnZfaXRlcikpIDw8ICI7IgotICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICBhcHBlbmRlcnMgPDwgIiAgICBnX2hhc2hfdGFibGVfaW5zZXJ0IChjb25zdGFudCwgJiIgPDwgZm5hbWUgPDwgIiwgJiIKLSAgICAgICAgICAgICAgICA8PCBmbmFtZSA8PCAiKTsiCi0gICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBmX3R5cGVzX2ltcGxfIDw8ICJzdGF0aWMgR0hhc2hUYWJsZSAqIiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV9sYyA8PCAiX2NvbnN0YW50ICh2b2lkKSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3R5cGVzX2ltcGxfKTsKLSAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJzdGF0aWMgR0hhc2hUYWJsZSAqY29uc3RhbnQgPSBOVUxMOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmIChjb25zdGFudCA9PSBOVUxMKSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3R5cGVzX2ltcGxfKTsKLSAgICBmX3R5cGVzX2ltcGxfIDw8IGluaXRpYWxpemVycy5zdHIoKQotICAgICAgICAgICAgICAgICAgPDwgZW5kbAotICAgICAgICAgICAgICAgICAgLy8gVE9ETzogVGhpcyBpbml0aWFsaXphdGlvbiBzaG91bGQgY29udGFpbiBhIGZyZWUgZnVuY3Rpb24KLSAgICAgICAgICAgICAgICAgIC8vIGZvciBlbGVtZW50cwotICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImNvbnN0YW50ID0gZ19oYXNoX3RhYmxlX25ldyAoTlVMTCwgTlVMTCk7IgotICAgICAgICAgICAgICAgICAgPDwgZW5kbAotICAgICAgICAgICAgICAgICAgPDwgYXBwZW5kZXJzLnN0cigpOwotICAgIHNjb3BlX2Rvd24oZl90eXBlc19pbXBsXyk7Ci0gICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGNvbnN0YW50OyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKGZfdHlwZXNfaW1wbF8pOwotICAgIGZfdHlwZXNfaW1wbF8gPDwgZW5kbDsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBoZWxwZXIgY2xhc3NlcyBmb3IgYSBzZXJ2aWNlLCBjb25zaXN0aW5nIG9mIGEgVGhyaWZ0U3RydWN0IHN1YmNsYXNzCi0gKiBmb3IgdGhlIGFyZ3VtZW50cyB0byBhbmQgdGhlIHJlc3VsdCBmcm9tIGVhY2ggbWV0aG9kLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBmb3Igd2hpY2ggdG8gZ2VuZXJhdGUgaGVscGVyIGNsYXNzZXMKLSAqLwotdm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZnVuY3Rpb25faXRlcjsKLQotICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIHNlcnZpY2UncyBtZXRob2RzCi0gIGZvciAoZnVuY3Rpb25faXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmdW5jdGlvbl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmdW5jdGlvbl9pdGVyKSB7Ci0gICAgc3RyaW5nIGZ1bmN0aW9uX25hbWUgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIHRfc3RydWN0KiBhcmdfbGlzdCA9ICgqZnVuY3Rpb25faXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgc3RyaW5nIGFyZ19saXN0X25hbWVfb3JpZyA9IGFyZ19saXN0LT5nZXRfbmFtZSgpOwotCi0gICAgLy8gR2VuZXJhdGUgdGhlIGFyZ3VtZW50cyBjbGFzcwotICAgIGFyZ19saXN0LT5zZXRfbmFtZSh0c2VydmljZS0+Z2V0X25hbWUoKSArIHVuZGVyc2NvcmVzX3RvX2luaXRpYWxfY2FwcyhmdW5jdGlvbl9uYW1lKSArICJBcmdzIik7Ci0gICAgZ2VuZXJhdGVfc3RydWN0KGFyZ19saXN0KTsKLQotICAgIGFyZ19saXN0LT5zZXRfbmFtZShhcmdfbGlzdF9uYW1lX29yaWcpOwotCi0gICAgLy8gR2VuZXJhdGUgdGhlIHJlc3VsdCBjbGFzcwotICAgIGlmICghKCpmdW5jdGlvbl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywKLSAgICAgICAgICAgICAgICAgICAgICB0c2VydmljZS0+Z2V0X25hbWUoKSArIHVuZGVyc2NvcmVzX3RvX2luaXRpYWxfY2FwcyhmdW5jdGlvbl9uYW1lKSArICJSZXN1bHQiKTsKLSAgICAgIHRfZmllbGQgc3VjY2VzcygoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOwotICAgICAgc3VjY2Vzcy5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUSU9OQUwpOwotICAgICAgaWYgKCEoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7Ci0gICAgICB9Ci0KLSAgICAgIHRfc3RydWN0KiB4cyA9ICgqZnVuY3Rpb25faXRlciktPmdldF94Y2VwdGlvbnMoKTsKLSAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmllbGRfaXRlcjsKLSAgICAgIGZvciAoZmllbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmaWVsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmaWVsZF9pdGVyKSB7Ci0gICAgICAgICgqZmllbGRfaXRlciktPnNldF9yZXEodF9maWVsZDo6VF9PUFRJT05BTCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoKmZpZWxkX2l0ZXIpOwotICAgICAgfQotCi0gICAgICBnZW5lcmF0ZV9zdHJ1Y3QoJnJlc3VsdCk7Ci0gICAgfQotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIEMgY29kZSB0aGF0IHJlcHJlc2VudHMgYSBUaHJpZnQgc2VydmljZSBjbGllbnQuCi0gKi8KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIC8qIGdldCBzb21lIEMgZnJpZW5kbHkgc2VydmljZSBuYW1lcyAqLwotICBzdHJpbmcgc2VydmljZV9uYW1lX2xjID0gdG9fbG93ZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoc2VydmljZV9uYW1lXykpOwotICBzdHJpbmcgc2VydmljZV9uYW1lX3VjID0gdG9fdXBwZXJfY2FzZShzZXJ2aWNlX25hbWVfbGMpOwotCi0gIHN0cmluZyBwYXJlbnRfc2VydmljZV9uYW1lOwotICBzdHJpbmcgcGFyZW50X3NlcnZpY2VfbmFtZV9sYzsKLSAgc3RyaW5nIHBhcmVudF9zZXJ2aWNlX25hbWVfdWM7Ci0KLSAgc3RyaW5nIHBhcmVudF9jbGFzc19uYW1lID0gIkdPYmplY3QiOwotICBzdHJpbmcgcGFyZW50X3R5cGVfbmFtZSA9ICJHX1RZUEVfT0JKRUNUIjsKLQotICAvLyBUaGUgc2VydmljZSB0aGlzIHNlcnZpY2UgZXh0ZW5kcywgb3IgTlVMTCBpZiBpdCBleHRlbmRzIG5vCi0gIC8vIHNlcnZpY2UKLSAgdF9zZXJ2aWNlKiBleHRlbmRzX3NlcnZpY2UgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKLSAgaWYgKGV4dGVuZHNfc2VydmljZSkgewotICAgIC8vIFRoZSBuYW1lIG9mIHRoZSBwYXJlbnQgc2VydmljZQotICAgIHBhcmVudF9zZXJ2aWNlX25hbWUgPSBleHRlbmRzX3NlcnZpY2UtPmdldF9uYW1lKCk7Ci0gICAgcGFyZW50X3NlcnZpY2VfbmFtZV9sYyA9IHRvX2xvd2VyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHBhcmVudF9zZXJ2aWNlX25hbWUpKTsKLSAgICBwYXJlbnRfc2VydmljZV9uYW1lX3VjID0gdG9fdXBwZXJfY2FzZShwYXJlbnRfc2VydmljZV9uYW1lX2xjKTsKLQotICAgIC8vIFRoZSBuYW1lcyBvZiB0aGUgY2xpZW50IGNsYXNzJyBwYXJlbnQgY2xhc3MgYW5kIHR5cGUKLSAgICBwYXJlbnRfY2xhc3NfbmFtZSA9IHRoaXMtPm5zcGFjZSArIHBhcmVudF9zZXJ2aWNlX25hbWUgKyAiQ2xpZW50IjsKLSAgICBwYXJlbnRfdHlwZV9uYW1lID0gdGhpcy0+bnNwYWNlX3VjICsgIlRZUEVfIiArIHBhcmVudF9zZXJ2aWNlX25hbWVfdWMgKyAiX0NMSUVOVCI7Ci0gIH0KLQotICAvLyBUaGUgYmFzZSBzZXJ2aWNlICh0aGUgdG9wbW9zdCBpbiB0aGUgImV4dGVuZHMiIGhpZXJhcmNoeSksIG9uCi0gIC8vIHdob3NlIGNsaWVudCBjbGFzcyB0aGUgImlucHV0X3Byb3RvY29sIiBhbmQgIm91dHB1dF9wcm90b2NvbCIKLSAgLy8gcHJvcGVydGllcyBhcmUgZGVmaW5lZAotICB0X3NlcnZpY2UqIGJhc2Vfc2VydmljZSA9IHRzZXJ2aWNlOwotICB3aGlsZSAoYmFzZV9zZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKSB7Ci0gICAgYmFzZV9zZXJ2aWNlID0gYmFzZV9zZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOwotICB9Ci0KLSAgc3RyaW5nIGJhc2Vfc2VydmljZV9uYW1lID0gYmFzZV9zZXJ2aWNlLT5nZXRfbmFtZSgpOwotICBzdHJpbmcgYmFzZV9zZXJ2aWNlX25hbWVfbGMgPSB0b19sb3dlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhiYXNlX3NlcnZpY2VfbmFtZSkpOwotICBzdHJpbmcgYmFzZV9zZXJ2aWNlX25hbWVfdWMgPSB0b191cHBlcl9jYXNlKGJhc2Vfc2VydmljZV9uYW1lX2xjKTsKLQotICAvLyBHZW5lcmF0ZSB0aGUgY2xpZW50IGludGVyZmFjZSBkdW1teSBvYmplY3QgaW4gdGhlIGhlYWRlci4KLSAgZl9oZWFkZXJfIDw8ICIvKiAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIiBzZXJ2aWNlIGludGVyZmFjZSAqLyIgPDwgZW5kbCA8PCAidHlwZWRlZiBzdHJ1Y3QgXyIKLSAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZiAiIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZjsgIgotICAgICAgICAgICAgPDwgIiAvKiBkdW1teSBvYmplY3QgKi8iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgY2xpZW50IGludGVyZmFjZSBvYmplY3QgaW4gdGhlIGhlYWRlci4KLSAgZl9oZWFkZXJfIDw8ICJzdHJ1Y3QgXyIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmSW50ZXJmYWNlIiA8PCBlbmRsIDw8ICJ7IiA8PCBlbmRsCi0gICAgICAgICAgICA8PCAiICBHVHlwZUludGVyZmFjZSBwYXJlbnQ7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLyogd3JpdGUgb3V0IHRoZSBmdW5jdGlvbnMgZm9yIHRoaXMgaW50ZXJmYWNlICovCi0gIGluZGVudF91cCgpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAvKiBtYWtlIHRoZSBmdW5jdGlvbiBuYW1lIEMgZnJpZW5kbHkgKi8KLSAgICBzdHJpbmcgZnVubmFtZSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcygoKmZfaXRlciktPmdldF9uYW1lKCkpOwotICAgIHRfdHlwZSogdHR5cGUgPSAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCk7Ci0gICAgdF9zdHJ1Y3QqIGFyZ2xpc3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgdF9zdHJ1Y3QqIHhsaXN0ID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgYm9vbCBoYXNfcmV0dXJuID0gIXR0eXBlLT5pc192b2lkKCk7Ci0gICAgYm9vbCBoYXNfYXJncyA9IGFyZ2xpc3QtPmdldF9tZW1iZXJzKCkuc2l6ZSgpID09IDA7Ci0gICAgYm9vbCBoYXNfeGNlcHRpb25zID0geGxpc3QtPmdldF9tZW1iZXJzKCkuc2l6ZSgpID09IDA7Ci0KLSAgICBzdHJpbmcgcGFyYW1zID0gIigiICsgdGhpcy0+bnNwYWNlICsgc2VydmljZV9uYW1lXyArICJJZiAqaWZhY2UiCi0gICAgICAgICAgICAgICAgICAgICsgKGhhc19yZXR1cm4gPyAiLCAiICsgdHlwZV9uYW1lKHR0eXBlKSArICIqIF9yZXR1cm4iIDogIiIpCi0gICAgICAgICAgICAgICAgICAgICsgKGhhc19hcmdzID8gIiIgOiAoIiwgIiArIGFyZ3VtZW50X2xpc3QoYXJnbGlzdCkpKQotICAgICAgICAgICAgICAgICAgICArIChoYXNfeGNlcHRpb25zID8gIiIgOiAoIiwgIiArIHhjZXB0aW9uX2xpc3QoeGxpc3QpKSkgKyAiLCBHRXJyb3IgKiplcnJvcikiOwotCi0gICAgaW5kZW50KGZfaGVhZGVyXykgPDwgImdib29sZWFuICgqIiA8PCBmdW5uYW1lIDw8ICIpICIgPDwgcGFyYW1zIDw8ICI7IiA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgZl9oZWFkZXJfIDw8ICJ9OyIgPDwgZW5kbCA8PCAidHlwZWRlZiBzdHJ1Y3QgXyIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmSW50ZXJmYWNlICIKLSAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZkludGVyZmFjZTsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBnZW5lcmF0ZSBhbGwgdGhlIGludGVyZmFjZSBib2lsZXJwbGF0ZQotICBmX2hlYWRlcl8gPDwgIkdUeXBlICIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2lmX2dldF90eXBlICh2b2lkKTsiIDw8IGVuZGwKLSAgICAgICAgICAgIDw8ICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSUYgIgotICAgICAgICAgICAgPDwgIigiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9pZl9nZXRfdHlwZSgpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiCi0gICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSUYob2JqKSAiCi0gICAgICAgICAgICA8PCAiKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIgotICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSUYsICIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmKSkiIDw8IGVuZGwKLSAgICAgICAgICAgIDw8ICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJJU18iIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0lGKG9iaikgIgotICAgICAgICAgICAgPDwgIihHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIKLSAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0lGKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMKLSAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0lGX0dFVF9JTlRFUkZBQ0UoaW5zdCkgKEdfVFlQRV9JTlNUQU5DRV9HRVRfSU5URVJGQUNFICgoaW5zdCksICIKLSAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0lGLCAiIDw8IHRoaXMtPm5zcGFjZQotICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lXyA8PCAiSWZJbnRlcmZhY2UpKSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIHdyaXRlIG91dCBhbGwgdGhlIGludGVyZmFjZSBmdW5jdGlvbiBwcm90b3R5cGVzCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgLyogbWFrZSB0aGUgZnVuY3Rpb24gbmFtZSBDIGZyaWVuZGx5ICovCi0gICAgc3RyaW5nIGZ1bm5hbWUgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICB0X3R5cGUqIHR0eXBlID0gKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpOwotICAgIHRfc3RydWN0KiBhcmdsaXN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIHRfc3RydWN0KiB4bGlzdCA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOwotICAgIGJvb2wgaGFzX3JldHVybiA9ICF0dHlwZS0+aXNfdm9pZCgpOwotICAgIGJvb2wgaGFzX2FyZ3MgPSBhcmdsaXN0LT5nZXRfbWVtYmVycygpLnNpemUoKSA9PSAwOwotICAgIGJvb2wgaGFzX3hjZXB0aW9ucyA9IHhsaXN0LT5nZXRfbWVtYmVycygpLnNpemUoKSA9PSAwOwotCi0gICAgc3RyaW5nIHBhcmFtcyA9ICIoIiArIHRoaXMtPm5zcGFjZSArIHNlcnZpY2VfbmFtZV8gKyAiSWYgKmlmYWNlIgotICAgICAgICAgICAgICAgICAgICArIChoYXNfcmV0dXJuID8gIiwgIiArIHR5cGVfbmFtZSh0dHlwZSkgKyAiKiBfcmV0dXJuIiA6ICIiKQotICAgICAgICAgICAgICAgICAgICArIChoYXNfYXJncyA/ICIiIDogKCIsICIgKyBhcmd1bWVudF9saXN0KGFyZ2xpc3QpKSkKLSAgICAgICAgICAgICAgICAgICAgKyAoaGFzX3hjZXB0aW9ucyA/ICIiIDogKCIsICIgKyB4Y2VwdGlvbl9saXN0KHhsaXN0KSkpICsgIiwgR0Vycm9yICoqZXJyb3IpIjsKLQotICAgIGZfaGVhZGVyXyA8PCAiZ2Jvb2xlYW4gIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfaWZfIiA8PCBmdW5uYW1lIDw8ICIgIgotICAgICAgICAgICAgICA8PCBwYXJhbXMgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLSAgZl9oZWFkZXJfIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGNsaWVudCBvYmplY3QgaW5zdGFuY2UgZGVmaW5pdGlvbiBpbiB0aGUgaGVhZGVyLgotICBmX2hlYWRlcl8gPDwgIi8qICIgPDwgc2VydmljZV9uYW1lXyA8PCAiIHNlcnZpY2UgY2xpZW50ICovIiA8PCBlbmRsIDw8ICJzdHJ1Y3QgXyIgPDwgdGhpcy0+bnNwYWNlCi0gICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnQiIDw8IGVuZGwgPDwgInsiIDw8IGVuZGwgPDwgIiAgIiA8PCBwYXJlbnRfY2xhc3NfbmFtZQotICAgICAgICAgICAgPDwgIiBwYXJlbnQ7IiA8PCBlbmRsOwotICBpZiAoIWV4dGVuZHNfc2VydmljZSkgewotICAgIC8vIERlZmluZSAiaW5wdXRfcHJvdG9jb2wiIGFuZCAib3V0cHV0X3Byb3RvY29sIiBwcm9wZXJ0aWVzIG9ubHkKLSAgICAvLyBmb3IgYmFzZSBzZXJ2aWNlczsgY2hpbGQgc2VydmljZS1jbGllbnQgY2xhc3NlcyB3aWxsIGluaGVyaXQKLSAgICAvLyB0aGVzZQotICAgIGZfaGVhZGVyXyA8PCBlbmRsIDw8ICIgIFRocmlmdFByb3RvY29sICppbnB1dF9wcm90b2NvbDsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgPDwgIiAgVGhyaWZ0UHJvdG9jb2wgKm91dHB1dF9wcm90b2NvbDsiIDw8IGVuZGw7Ci0gIH0KLSAgZl9oZWFkZXJfIDw8ICJ9OyIgPDwgZW5kbCA8PCAidHlwZWRlZiBzdHJ1Y3QgXyIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudCAiCi0gICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50OyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBjbGFzcyBkZWZpbml0aW9uIGluIHRoZSBoZWFkZXIuCi0gIGZfaGVhZGVyXyA8PCAic3RydWN0IF8iIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnRDbGFzcyIgPDwgZW5kbCA8PCAieyIgPDwgZW5kbAotICAgICAgICAgICAgPDwgIiAgIiA8PCBwYXJlbnRfY2xhc3NfbmFtZSA8PCAiQ2xhc3MgcGFyZW50OyIgPDwgZW5kbCA8PCAifTsiIDw8IGVuZGwKLSAgICAgICAgICAgIDw8ICJ0eXBlZGVmIHN0cnVjdCBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50Q2xhc3MgIiA8PCB0aGlzLT5uc3BhY2UKLSAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudENsYXNzOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIENyZWF0ZSBhbGwgdGhlIEdPYmplY3QgYm9pbGVycGxhdGUKLSAgZl9oZWFkZXJfIDw8ICJHVHlwZSAiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9jbGllbnRfZ2V0X3R5cGUgKHZvaWQpOyIgPDwgZW5kbAotICAgICAgICAgICAgPDwgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIiA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9DTElFTlQgIgotICAgICAgICAgICAgPDwgIigiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9jbGllbnRfZ2V0X3R5cGUoKSkiIDw8IGVuZGwKLSAgICAgICAgICAgIDw8ICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0NMSUVOVChvYmopICIKLSAgICAgICAgICAgIDw8ICIoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iCi0gICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9DTElFTlQsICIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudCkpIiA8PCBlbmRsCi0gICAgICAgICAgICA8PCAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9DTElFTlRfQ0xBU1MoYykgIgotICAgICAgICAgICAgPDwgIihHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IHNlcnZpY2VfbmFtZV91YwotICAgICAgICAgICAgPDwgIl9DTElFTlQsICIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudENsYXNzKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIgotICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0lTX0NMSUVOVChvYmopICIKLSAgICAgICAgICAgIDw8ICIoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iCi0gICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9DTElFTlQpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YwotICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSVNfQ0xJRU5UX0NMQVNTKGMpICIKLSAgICAgICAgICAgIDw8ICIoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIiA8PCBzZXJ2aWNlX25hbWVfdWMKLSAgICAgICAgICAgIDw8ICJfQ0xJRU5UKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjCi0gICAgICAgICAgICA8PCAiX0NMSUVOVF9HRVRfQ0xBU1Mob2JqKSAiCi0gICAgICAgICAgICA8PCAiKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iCi0gICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9DTElFTlQsICIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudENsYXNzKSkiCi0gICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLyogd3JpdGUgb3V0IHRoZSBmdW5jdGlvbiBwcm90b3R5cGVzICovCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgLyogbWFrZSB0aGUgZnVuY3Rpb24gbmFtZSBDIGZyaWVuZGx5ICovCi0gICAgc3RyaW5nIGZ1bm5hbWUgPSB0b19sb3dlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcygoKmZfaXRlciktPmdldF9uYW1lKCkpKTsKLQotICAgIHRfZnVuY3Rpb24gc2VydmljZV9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZV9sYyArIHN0cmluZygiX2NsaWVudF8iKSArIGZ1bm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCkpOwotICAgIGluZGVudChmX2hlYWRlcl8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VydmljZV9mdW5jdGlvbikgPDwgIjsiIDw8IGVuZGw7Ci0KLSAgICB0X2Z1bmN0aW9uIHNlbmRfZnVuY3Rpb24oZ190eXBlX3ZvaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZV9sYyArIHN0cmluZygiX2NsaWVudF9zZW5kXyIpICsgZnVubmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpKTsKLSAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnNlbmRfZnVuY3Rpb24pIDw8ICI7IiA8PCBlbmRsOwotCi0gICAgLy8gaW1wbGVtZW50IHJlY3YgaWYgbm90IGEgb25ld2F5IHNlcnZpY2UKLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7Ci0gICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZV9sYyArIHN0cmluZygiX2NsaWVudF9yZWN2XyIpICsgZnVubmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9hcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpKTsKLSAgICAgIGluZGVudChmX2hlYWRlcl8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbikgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgLyogd3JpdGUgb3V0IHRoZSBnZXQvc2V0IGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KLSAgZl9oZWFkZXJfIDw8ICJ2b2lkICIgKyBzZXJ2aWNlX25hbWVfbGMgKyAiX2NsaWVudF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0eV9pZCwgY29uc3QgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpOyIKLSAgICAgICAgICAgIDw8IGVuZGw7Ci0gIGZfaGVhZGVyXyA8PCAidm9pZCAiICsgc2VydmljZV9uYW1lX2xjICsgIl9jbGllbnRfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydHlfaWQsIEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKTsiCi0gICAgICAgICAgICA8PCBlbmRsOwotCi0gIGZfaGVhZGVyXyA8PCBlbmRsOwotICAvLyBlbmQgb2YgaGVhZGVyIGNvZGUKLQotICAvLyBHZW5lcmF0ZSBpbnRlcmZhY2UgbWV0aG9kIGltcGxlbWVudGF0aW9ucwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIC8qIG1ha2UgdGhlIGZ1bmN0aW9uIG5hbWUgQyBmcmllbmRseSAqLwotICAgIHN0cmluZyBmdW5uYW1lID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgdF90eXBlKiB0dHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKTsKLSAgICB0X3N0cnVjdCogYXJnbGlzdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICB0X3N0cnVjdCogeGxpc3QgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKLSAgICBib29sIGhhc19yZXR1cm4gPSAhdHR5cGUtPmlzX3ZvaWQoKTsKLSAgICBib29sIGhhc19hcmdzID0gYXJnbGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPT0gMDsKLSAgICBib29sIGhhc194Y2VwdGlvbnMgPSB4bGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPT0gMDsKLQotICAgIHN0cmluZyBwYXJhbXMgPSAiKCIgKyB0aGlzLT5uc3BhY2UgKyBzZXJ2aWNlX25hbWVfICsgIklmICppZmFjZSIKLSAgICAgICAgICAgICAgICAgICAgKyAoaGFzX3JldHVybiA/ICIsICIgKyB0eXBlX25hbWUodHR5cGUpICsgIiogX3JldHVybiIgOiAiIikKLSAgICAgICAgICAgICAgICAgICAgKyAoaGFzX2FyZ3MgPyAiIiA6ICgiLCAiICsgYXJndW1lbnRfbGlzdChhcmdsaXN0KSkpCi0gICAgICAgICAgICAgICAgICAgICsgKGhhc194Y2VwdGlvbnMgPyAiIiA6ICgiLCAiICsgeGNlcHRpb25fbGlzdCh4bGlzdCkpKSArICIsIEdFcnJvciAqKmVycm9yKSI7Ci0KLSAgICBzdHJpbmcgcGFyYW1zX3dpdGhvdXRfdHlwZSA9IHN0cmluZygiaWZhY2UsICIpICsgKGhhc19yZXR1cm4gPyAiX3JldHVybiwgIiA6ICIiKTsKLQotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ2xpc3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyX2ZpZWxkOwotICAgIGZvciAoZl9pdGVyX2ZpZWxkID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlcl9maWVsZCAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyX2ZpZWxkKSB7Ci0gICAgICBwYXJhbXNfd2l0aG91dF90eXBlICs9ICgqZl9pdGVyX2ZpZWxkKS0+Z2V0X25hbWUoKTsKLSAgICAgIHBhcmFtc193aXRob3V0X3R5cGUgKz0gIiwgIjsKLSAgICB9Ci0KLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4bGlzdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgIHBhcmFtc193aXRob3V0X3R5cGUgKz0gKCp4X2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgcGFyYW1zX3dpdGhvdXRfdHlwZSArPSAiLCAiOwotICAgIH0KLQotICAgIGZfc2VydmljZV8gPDwgImdib29sZWFuIiA8PCBlbmRsIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9pZl8iIDw8IGZ1bm5hbWUKLSAgICAgICAgICAgICAgIDw8ICIgIiA8PCBwYXJhbXMgPDwgZW5kbCA8PCAieyIgPDwgZW5kbCA8PCAiICByZXR1cm4gIiA8PCB0aGlzLT5uc3BhY2VfdWMKLSAgICAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0lGX0dFVF9JTlRFUkZBQ0UgKGlmYWNlKS0+IiA8PCBmdW5uYW1lIDw8ICIgKCIKLSAgICAgICAgICAgICAgIDw8IHBhcmFtc193aXRob3V0X3R5cGUgPDwgImVycm9yKTsiIDw8IGVuZGwgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIGludGVyZmFjZSBib2lsZXJwbGF0ZQotICBmX3NlcnZpY2VfIDw8ICJHVHlwZSIgPDwgZW5kbCA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfaWZfZ2V0X3R5cGUgKHZvaWQpIgotICAgICAgICAgICAgIDw8IGVuZGwgPDwgInsiIDw8IGVuZGwgPDwgIiAgc3RhdGljIEdUeXBlIHR5cGUgPSAwOyIgPDwgZW5kbCA8PCAiICBpZiAodHlwZSA9PSAwKSIKLSAgICAgICAgICAgICA8PCBlbmRsIDw8ICIgIHsiIDw8IGVuZGwgPDwgIiAgICBzdGF0aWMgY29uc3QgR1R5cGVJbmZvIHR5cGVfaW5mbyA9IiA8PCBlbmRsIDw8ICIgICAgeyIKLSAgICAgICAgICAgICA8PCBlbmRsIDw8ICIgICAgICBzaXplb2YgKCIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmSW50ZXJmYWNlKSwiIDw8IGVuZGwKLSAgICAgICAgICAgICA8PCAiICAgICAgTlVMTCwgIC8qIGJhc2VfaW5pdCAqLyIgPDwgZW5kbCA8PCAiICAgICAgTlVMTCwgIC8qIGJhc2VfZmluYWxpemUgKi8iIDw8IGVuZGwKLSAgICAgICAgICAgICA8PCAiICAgICAgTlVMTCwgIC8qIGNsYXNzX2luaXQgKi8iIDw8IGVuZGwgPDwgIiAgICAgIE5VTEwsICAvKiBjbGFzc19maW5hbGl6ZSAqLyIKLSAgICAgICAgICAgICA8PCBlbmRsIDw8ICIgICAgICBOVUxMLCAgLyogY2xhc3NfZGF0YSAqLyIgPDwgZW5kbAotICAgICAgICAgICAgIDw8ICIgICAgICAwLCAgICAgLyogaW5zdGFuY2Vfc2l6ZSAqLyIgPDwgZW5kbCA8PCAiICAgICAgMCwgICAgIC8qIG5fcHJlYWxsb2NzICovIgotICAgICAgICAgICAgIDw8IGVuZGwgPDwgIiAgICAgIE5VTEwsICAvKiBpbnN0YW5jZV9pbml0ICovIiA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgIiAgICAgIE5VTEwgICAvKiB2YWx1ZV90YWJsZSAqLyIgPDwgZW5kbCA8PCAiICAgIH07IiA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgIiAgICB0eXBlID0gZ190eXBlX3JlZ2lzdGVyX3N0YXRpYyAoR19UWVBFX0lOVEVSRkFDRSwiIDw8IGVuZGwKLSAgICAgICAgICAgICA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmXCIsIgotICAgICAgICAgICAgIDw8IGVuZGwgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnR5cGVfaW5mbywgMCk7IiA8PCBlbmRsIDw8ICIgIH0iCi0gICAgICAgICAgICAgPDwgZW5kbCA8PCAiICByZXR1cm4gdHlwZTsiIDw8IGVuZGwgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSBjbGllbnQgYm9pbGVycGxhdGUKLSAgZl9zZXJ2aWNlXyA8PCAic3RhdGljIHZvaWQgIiA8PCBlbmRsIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMKLSAgICAgICAgICAgICA8PCAiX2lmX2ludGVyZmFjZV9pbml0ICgiIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZkludGVyZmFjZSAqaWZhY2UpOyIKLSAgICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGwgPDwgIkdfREVGSU5FX1RZUEVfV0lUSF9DT0RFICgiIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfCi0gICAgICAgICAgICAgPDwgIkNsaWVudCwgIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfY2xpZW50LCIgPDwgZW5kbAotICAgICAgICAgICAgIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgIiA8PCBwYXJlbnRfdHlwZV9uYW1lIDw8ICIsICIgPDwgZW5kbAotICAgICAgICAgICAgIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgR19JTVBMRU1FTlRfSU5URVJGQUNFICgiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iCi0gICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSUYsIiA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgPDwgdGhpcy0+bnNwYWNlX2xjCi0gICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfaWZfaW50ZXJmYWNlX2luaXQpKSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHByb3BlcnR5LXJlbGF0ZWQgY29kZSBvbmx5IGZvciBiYXNlIHNlcnZpY2VzLS0tY2hpbGQKLSAgLy8gc2VydmljZS1jbGllbnQgY2xhc3NlcyBoYXZlIG9ubHkgcHJvcGVydGllcyBpbmhlcml0ZWQgZnJvbSB0aGVpcgotICAvLyBwYXJlbnQgY2xhc3MKLSAgaWYgKCFleHRlbmRzX3NlcnZpY2UpIHsKLSAgICAvLyBHZW5lcmF0ZSBjbGllbnQgcHJvcGVydGllcwotICAgIGZfc2VydmljZV8gPDwgImVudW0gXyIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudFByb3BlcnRpZXMiIDw8IGVuZGwgPDwgInsiCi0gICAgICAgICAgICAgICA8PCBlbmRsIDw8ICIgIFBST1BfMCwiIDw8IGVuZGwgPDwgIiAgUFJPUF8iIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMKLSAgICAgICAgICAgICAgIDw8ICJfQ0xJRU5UX0lOUFVUX1BST1RPQ09MLCIgPDwgZW5kbCA8PCAiICBQUk9QXyIgPDwgdGhpcy0+bnNwYWNlX3VjCi0gICAgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9DTElFTlRfT1VUUFVUX1BST1RPQ09MIiA8PCBlbmRsIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgLy8gZ2VuZXJhdGUgcHJvcGVydHkgc2V0dGVyCi0gICAgZl9zZXJ2aWNlXyA8PCAidm9pZCIgPDwgZW5kbCA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfY2xpZW50X3NldF9wcm9wZXJ0eSAoIgotICAgICAgICAgICAgICAgPDwgIkdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsIGNvbnN0IEdWYWx1ZSAqdmFsdWUsICIKLSAgICAgICAgICAgICAgIDw8ICJHUGFyYW1TcGVjICpwc3BlYykiIDw8IGVuZGwgPDwgInsiIDw8IGVuZGwgPDwgIiAgIiA8PCB0aGlzLT5uc3BhY2UKLSAgICAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudCAqY2xpZW50ID0gIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjCi0gICAgICAgICAgICAgICA8PCAiX0NMSUVOVCAob2JqZWN0KTsiIDw8IGVuZGwgPDwgZW5kbCA8PCAiICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgZW5kbCA8PCAiICBzd2l0Y2ggKHByb3BlcnR5X2lkKSIgPDwgZW5kbCA8PCAiICB7IiA8PCBlbmRsIDw8ICIgICAgY2FzZSBQUk9QXyIKLSAgICAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9DTElFTlRfSU5QVVRfUFJPVE9DT0w6IiA8PCBlbmRsCi0gICAgICAgICAgICAgICA8PCAiICAgICAgY2xpZW50LT5pbnB1dF9wcm90b2NvbCA9IGdfdmFsdWVfZ2V0X29iamVjdCAodmFsdWUpOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgIiAgICAgIGJyZWFrOyIgPDwgZW5kbCA8PCAiICAgIGNhc2UgUFJPUF8iIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMKLSAgICAgICAgICAgICAgIDw8ICJfQ0xJRU5UX09VVFBVVF9QUk9UT0NPTDoiIDw8IGVuZGwKLSAgICAgICAgICAgICAgIDw8ICIgICAgICBjbGllbnQtPm91dHB1dF9wcm90b2NvbCA9IGdfdmFsdWVfZ2V0X29iamVjdCAodmFsdWUpOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgIiAgICAgIGJyZWFrOyIgPDwgZW5kbCA8PCAiICB9IiA8PCBlbmRsIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICAvLyBnZW5lcmF0ZSBwcm9wZXJ0eSBnZXR0ZXIKLSAgICBmX3NlcnZpY2VfIDw8ICJ2b2lkIiA8PCBlbmRsIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9jbGllbnRfZ2V0X3Byb3BlcnR5ICgiCi0gICAgICAgICAgICAgICA8PCAiR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwgR1ZhbHVlICp2YWx1ZSwgIgotICAgICAgICAgICAgICAgPDwgIkdQYXJhbVNwZWMgKnBzcGVjKSIgPDwgZW5kbCA8PCAieyIgPDwgZW5kbCA8PCAiICAiIDw8IHRoaXMtPm5zcGFjZQotICAgICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50ICpjbGllbnQgPSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMKLSAgICAgICAgICAgICAgIDw8ICJfQ0xJRU5UIChvYmplY3QpOyIgPDwgZW5kbCA8PCBlbmRsIDw8ICIgIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICA8PCBlbmRsIDw8ICIgIHN3aXRjaCAocHJvcGVydHlfaWQpIiA8PCBlbmRsIDw8ICIgIHsiIDw8IGVuZGwgPDwgIiAgICBjYXNlIFBST1BfIgotICAgICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0NMSUVOVF9JTlBVVF9QUk9UT0NPTDoiIDw8IGVuZGwKLSAgICAgICAgICAgICAgIDw8ICIgICAgICBnX3ZhbHVlX3NldF9vYmplY3QgKHZhbHVlLCBjbGllbnQtPmlucHV0X3Byb3RvY29sKTsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgIDw8ICIgICAgICBicmVhazsiIDw8IGVuZGwgPDwgIiAgICBjYXNlIFBST1BfIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjCi0gICAgICAgICAgICAgICA8PCAiX0NMSUVOVF9PVVRQVVRfUFJPVE9DT0w6IiA8PCBlbmRsCi0gICAgICAgICAgICAgICA8PCAiICAgICAgZ192YWx1ZV9zZXRfb2JqZWN0ICh2YWx1ZSwgY2xpZW50LT5vdXRwdXRfcHJvdG9jb2wpOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgIiAgICAgIGJyZWFrOyIgPDwgZW5kbCA8PCAiICB9IiA8PCBlbmRsIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHN0cmluZyBuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIHN0cmluZyBmdW5uYW1lID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKG5hbWUpOwotCi0gICAgLy8gR2V0IHRoZSBzdHJ1Y3Qgb2YgZnVuY3Rpb24gY2FsbCBwYXJhbXMgYW5kIGV4Y2VwdGlvbnMKLSAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLQotICAgIC8vIEZ1bmN0aW9uIGZvciBzZW5kaW5nCi0gICAgdF9mdW5jdGlvbiBzZW5kX2Z1bmN0aW9uKGdfdHlwZV92b2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWVfbGMgKyBzdHJpbmcoIl9jbGllbnRfc2VuZF8iKSArIGZ1bm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSk7Ci0KLSAgICAvLyBPcGVuIHRoZSBzZW5kIGZ1bmN0aW9uCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VuZF9mdW5jdGlvbikgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICAgIHN0cmluZyByZXFUeXBlID0gKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJUX09ORVdBWSIgOiAiVF9DQUxMIjsKLQotICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdAotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdpbnQzMiBjc2VxaWQgPSAwOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgPDwgIlRocmlmdFByb3RvY29sICogcHJvdG9jb2wgPSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBiYXNlX3NlcnZpY2VfbmFtZV91YwotICAgICAgICAgICAgICAgPDwgIl9DTElFTlQgKGlmYWNlKS0+b3V0cHV0X3Byb3RvY29sOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICA8PCAiaWYgKHRocmlmdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgXCIiIDw8IG5hbWUgPDwgIlwiLCAiCi0gICAgICAgICAgICAgICA8PCByZXFUeXBlIDw8ICIsIGNzZXFpZCwgZXJyb3IpIDwgMCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIEZBTFNFOyIKLSAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIGdlbmVyYXRlX3N0cnVjdF93cml0ZXIoZl9zZXJ2aWNlXywgYXJnX3N0cnVjdCwgIiIsICIiLCBmYWxzZSk7Ci0KLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAodGhyaWZ0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfZW5kIChwcm90b2NvbCwgZXJyb3IpIDwgMCkiIDw8IGVuZGwKLSAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBGQUxTRTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgIDw8ICJpZiAoIXRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHByb3RvY29sLT50cmFuc3BvcnQsIGVycm9yKSkiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgIDw8ICIgIHJldHVybiBGQUxTRTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgIDw8ICJpZiAoIXRocmlmdF90cmFuc3BvcnRfd3JpdGVfZW5kIChwcm90b2NvbC0+dHJhbnNwb3J0LCBlcnJvcikpIiA8PCBlbmRsCi0gICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gRkFMU0U7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJldHVybiBUUlVFOyIKLSAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0KLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAgIC8vIEdlbmVyYXRlIHJlY3YgZnVuY3Rpb24gb25seSBpZiBub3QgYW4gYXN5bmMgZnVuY3Rpb24KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7Ci0gICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZV9sYyArIHN0cmluZygiX2NsaWVudF9yZWN2XyIpICsgZnVubmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9hcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpKTsKLSAgICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24pIDw8IGVuZGw7Ci0gICAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ2ludDMyIHJzZXFpZDsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImdjaGFyICogZm5hbWUgPSBOVUxMOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiVGhyaWZ0TWVzc2FnZVR5cGUgbXR5cGU7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJUaHJpZnRQcm90b2NvbCAqIHByb3RvY29sID0gIgotICAgICAgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgYmFzZV9zZXJ2aWNlX25hbWVfdWMKLSAgICAgICAgICAgICAgICAgPDwgIl9DTElFTlQgKGlmYWNlKS0+aW5wdXRfcHJvdG9jb2w7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbiAqeGNlcHRpb247IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmICh0aHJpZnRfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luICIKLSAgICAgICAgICAgICAgICAgICAgIihwcm90b2NvbCwgJmZuYW1lLCAmbXR5cGUsICZyc2VxaWQsIGVycm9yKSA8IDApIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChmbmFtZSkgZ19mcmVlIChmbmFtZSk7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gRkFMU0U7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgPDwgZW5kbAotICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKG10eXBlID09IFRfRVhDRVBUSU9OKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAoZm5hbWUpIGdfZnJlZSAoZm5hbWUpOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieGNlcHRpb24gPSBnX29iamVjdF9uZXcgIgotICAgICAgICAgICAgICAgICAgICAiKFRIUklGVF9UWVBFX0FQUExJQ0FUSU9OX0VYQ0VQVElPTiwgTlVMTCk7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0aHJpZnRfc3RydWN0X3JlYWQgKFRIUklGVF9TVFJVQ1QgKHhjZXB0aW9uKSwgIgotICAgICAgICAgICAgICAgICAgICAicHJvdG9jb2wsIE5VTEwpOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidGhyaWZ0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9lbmQgIgotICAgICAgICAgICAgICAgICAgICAiKHByb3RvY29sLCBOVUxMKTsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInRocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQgIgotICAgICAgICAgICAgICAgICAgICAiKHByb3RvY29sLT50cmFuc3BvcnQsIE5VTEwpOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZ19zZXRfZXJyb3IgKGVycm9yLCAiCi0gICAgICAgICAgICAgICAgICAgICJUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SLHhjZXB0aW9uLT50eXBlLCAiCi0gICAgICAgICAgICAgICAgICAgICJcImFwcGxpY2F0aW9uIGVycm9yOiAlc1wiLCB4Y2VwdGlvbi0+bWVzc2FnZSk7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF91bnJlZiAoeGNlcHRpb24pOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIEZBTFNFOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgaWYgKG10eXBlICE9IFRfUkVQTFkpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChmbmFtZSkgZ19mcmVlIChmbmFtZSk7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0aHJpZnRfcHJvdG9jb2xfc2tpcCAocHJvdG9jb2wsIFRfU1RSVUNULCAiCi0gICAgICAgICAgICAgICAgICAgICJOVUxMKTsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInRocmlmdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfZW5kIChwcm90b2NvbCwgIgotICAgICAgICAgICAgICAgICAgICAiTlVMTCk7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kICgiCi0gICAgICAgICAgICAgICAgICAgICJwcm90b2NvbC0+dHJhbnNwb3J0LCBOVUxMKTsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImdfc2V0X2Vycm9yIChlcnJvciwgIgotICAgICAgICAgICAgICAgICAgICAiVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUiwgIgotICAgICAgICAgICAgICAgICAgICAiVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9JTlZBTElEX01FU1NBR0VfVFlQRSwgIgotICAgICAgICAgICAgICAgICAgICAiXCJpbnZhbGlkIG1lc3NhZ2UgdHlwZSAlZCwgZXhwZWN0ZWQgVF9SRVBMWVwiLCBtdHlwZSk7IgotICAgICAgICAgICAgICAgICA8PCBlbmRsCi0gICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gRkFMU0U7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0gZWxzZSBpZiAoc3RybmNtcCAoZm5hbWUsIFwiIiA8PCBuYW1lCi0gICAgICAgICAgICAgICAgIDw8ICJcIiwgIiA8PCBuYW1lLmxlbmd0aCgpIDw8ICIpICE9IDApIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRocmlmdF9wcm90b2NvbF9za2lwIChwcm90b2NvbCwgVF9TVFJVQ1QsICIKLSAgICAgICAgICAgICAgICAgICAgIk5VTEwpOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidGhyaWZ0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9lbmQgKHByb3RvY29sLCIKLSAgICAgICAgICAgICAgICAgICAgImVycm9yKTsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInRocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQgKCIKLSAgICAgICAgICAgICAgICAgICAgInByb3RvY29sLT50cmFuc3BvcnQsIGVycm9yKTsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImdfc2V0X2Vycm9yIChlcnJvciwgIgotICAgICAgICAgICAgICAgICAgICAiVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUiwgIgotICAgICAgICAgICAgICAgICAgICAiVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9XUk9OR19NRVRIT0RfTkFNRSwgIgotICAgICAgICAgICAgICAgICAgICAiXCJ3cm9uZyBtZXRob2QgbmFtZSAlcywgZXhwZWN0ZWQgIiA8PCBuYW1lCi0gICAgICAgICAgICAgICAgICAgIDw8ICJcIiwgZm5hbWUpOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKGZuYW1lKSBnX2ZyZWUgKGZuYW1lKTsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInJldHVybiBGQUxTRTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAotICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKGZuYW1lKSBnX2ZyZWUgKGZuYW1lKTsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLQotICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotCi0gICAgICB7Ci0gICAgICAgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOwotICAgICAgICB0X2ZpZWxkIHN1Y2Nlc3MoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLCAiKl9yZXR1cm4iLCAwKTsKLSAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYWRkIHJlYWRlcnMgZm9yIGV4Y2VwdGlvbnMsIGRlcmVmZXJlbmNpbmcgdGhlIHBvaW50ZXIuCi0gICAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7IHhfaXRlcisrKSB7Ci0gICAgICAgICAgdF9maWVsZCogeGNlcHRpb24gPSBuZXcgdF9maWVsZCgoKnhfaXRlciktPmdldF90eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKiIgKyAoKnhfaXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKnhfaXRlciktPmdldF9rZXkoKSk7Ci0gICAgICAgICAgcmVzdWx0LmFwcGVuZCh4Y2VwdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBnZW5lcmF0ZV9zdHJ1Y3RfcmVhZGVyKGZfc2VydmljZV8sICZyZXN1bHQsICIiLCAiIiwgZmFsc2UpOwotICAgICAgfQotCi0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAodGhyaWZ0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9lbmQgKHByb3RvY29sLCBlcnJvcikgPCAwKSIKLSAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gRkFMU0U7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICAgPDwgImlmICghdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZCAocHJvdG9jb2wtPnRyYW5zcG9ydCwgZXJyb3IpKSIgPDwgZW5kbAotICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gRkFMU0U7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICAgIC8vIGNvcHkgb3ZlciBhbnkgdGhyb3cgZXhjZXB0aW9ucyBhbmQgcmV0dXJuIGZhaWx1cmUKLSAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7IHhfaXRlcisrKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmICgqIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSBOVUxMKSIgPDwgZW5kbAotICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgICAgZ19zZXRfZXJyb3IgKGVycm9yLCAiCi0gICAgICAgICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjCi0gICAgICAgICAgICAgICAgICAgPDwgdG9fdXBwZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpKSkKLSAgICAgICAgICAgICAgICAgICA8PCAiX0VSUk9SLCAiIDw8IHRoaXMtPm5zcGFjZV91YwotICAgICAgICAgICAgICAgICAgIDw8IHRvX3VwcGVyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSkpCi0gICAgICAgICAgICAgICAgICAgPDwgIl9FUlJPUl9DT0RFLCBcIiIgPDwgKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpIDw8ICJcIik7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgICByZXR1cm4gRkFMU0U7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIFRSVUU7IiA8PCBlbmRsOwotICAgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgICB9Ci0KLSAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgdF9mdW5jdGlvbiBzZXJ2aWNlX2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lX2xjICsgc3RyaW5nKCJfY2xpZW50XyIpICsgZnVubmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKSk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VydmljZV9mdW5jdGlvbikgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICAgIC8vIHdyYXAgZWFjaCBmdW5jdGlvbgotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmICghIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfY2xpZW50X3NlbmRfIgotICAgICAgICAgICAgICAgPDwgZnVubmFtZSA8PCAiIChpZmFjZSI7Ci0KLSAgICAvLyBEZWNsYXJlIHRoZSBmdW5jdGlvbiBhcmd1bWVudHMKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOwotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICIsICIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgIiwgZXJyb3IpKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gRkFMU0U7IiA8PCBlbmRsOwotCi0gICAgLy8gaWYgbm90IG9uZXdheSwgaW1wbGVtZW50IHJlY3YKLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIHN0cmluZyByZXQgPSAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSA/ICIiIDogIl9yZXR1cm4sICI7Ci0KLSAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpOwotICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgcmV0ICs9ICgqeF9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgICAgcmV0ICs9ICIsICI7Ci0gICAgICB9Ci0KLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmICghIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfY2xpZW50X3JlY3ZfIgotICAgICAgICAgICAgICAgICA8PCBmdW5uYW1lIDw8ICIgKGlmYWNlLCAiIDw8IHJldCA8PCAiZXJyb3IpKSIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgICA8PCAiICByZXR1cm4gRkFMU0U7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIC8vIHJldHVybiBUUlVFIHdoaWNoIG1lYW5zIGFsbCBmdW5jdGlvbnMgd2VyZSBjYWxsZWQgT0sKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiBUUlVFOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgfQotCi0gIC8vIGNyZWF0ZSB0aGUgaW50ZXJmYWNlIGluaXRpYWxpemVyCi0gIGZfc2VydmljZV8gPDwgInN0YXRpYyB2b2lkIiA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2lmX2ludGVyZmFjZV9pbml0ICgiCi0gICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmSW50ZXJmYWNlICppZmFjZSkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICBpZiAoZnVuY3Rpb25zLnNpemUoKSA+IDApIHsKLSAgICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgLyogbWFrZSB0aGUgZnVuY3Rpb24gbmFtZSBDIGZyaWVuZGx5ICovCi0gICAgICBzdHJpbmcgZnVubmFtZSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcygoKmZfaXRlciktPmdldF9uYW1lKCkpOwotCi0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZmFjZS0+IiA8PCBmdW5uYW1lIDw8ICIgPSAiIDw8IHRoaXMtPm5zcGFjZV9sYwotICAgICAgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9jbGllbnRfIiA8PCBmdW5uYW1lIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotICBlbHNlIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJUSFJJRlRfVU5VU0VEX1ZBUiAoaWZhY2UpOyIgPDwgZW5kbDsKLSAgfQotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgLy8gY3JlYXRlIHRoZSBjbGllbnQgaW5zdGFuY2UgaW5pdGlhbGl6ZXIKLSAgZl9zZXJ2aWNlXyA8PCAic3RhdGljIHZvaWQiIDw8IGVuZGwKLSAgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfY2xpZW50X2luaXQgKCIKLSAgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50ICpjbGllbnQpIiA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgaWYgKCFleHRlbmRzX3NlcnZpY2UpIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJjbGllbnQtPmlucHV0X3Byb3RvY29sID0gTlVMTDsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJjbGllbnQtPm91dHB1dF9wcm90b2NvbCA9IE5VTEw7IiA8PCBlbmRsOwotICB9Ci0gIGVsc2UgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIlRIUklGVF9VTlVTRURfVkFSIChjbGllbnQpOyIgPDwgZW5kbDsKLSAgfQotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgLy8gY3JlYXRlIHRoZSBjbGllbnQgY2xhc3MgaW5pdGlhbGl6ZXIKLSAgZl9zZXJ2aWNlXyA8PCAic3RhdGljIHZvaWQiIDw8IGVuZGwgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYwotICAgICAgICAgICAgIDw8ICJfY2xpZW50X2NsYXNzX2luaXQgKCIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudENsYXNzICpjbHMpIgotICAgICAgICAgICAgIDw8IGVuZGwgPDwgInsiIDw8IGVuZGw7Ci0gIGlmICghZXh0ZW5kc19zZXJ2aWNlKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAiICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoY2xzKTsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgIDw8ICIgIEdQYXJhbVNwZWMgKnBhcmFtX3NwZWM7IiA8PCBlbmRsIDw8IGVuZGwKLSAgICAgICAgICAgICAgIDw8ICIgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9ICIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYwotICAgICAgICAgICAgICAgPDwgIl9jbGllbnRfc2V0X3Byb3BlcnR5OyIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgIiAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjCi0gICAgICAgICAgICAgICA8PCAiX2NsaWVudF9nZXRfcHJvcGVydHk7IiA8PCBlbmRsIDw8IGVuZGwKLSAgICAgICAgICAgICAgIDw8ICIgIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfb2JqZWN0IChcImlucHV0X3Byb3RvY29sXCIsIiA8PCBlbmRsCi0gICAgICAgICAgICAgICA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJpbnB1dCBwcm90b2NvbCAoY29uc3RydWN0KVwiLCIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiU2V0IHRoZSBjbGllbnQgaW5wdXQgcHJvdG9jb2xcIiwiIDw8IGVuZGwKLSAgICAgICAgICAgICAgIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9QUk9UT0NPTCwiIDw8IGVuZGwKLSAgICAgICAgICAgICAgIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSk7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICA8PCAiICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF8iIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMKLSAgICAgICAgICAgICAgIDw8ICJfQ0xJRU5UX0lOUFVUX1BST1RPQ09MLCBwYXJhbV9zcGVjKTsiIDw8IGVuZGwgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgIiAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY19vYmplY3QgKFwib3V0cHV0X3Byb3RvY29sXCIsIiA8PCBlbmRsCi0gICAgICAgICAgICAgICA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvdXRwdXQgcHJvdG9jb2wgKGNvbnN0cnVjdClcIiwiIDw8IGVuZGwKLSAgICAgICAgICAgICAgIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlNldCB0aGUgY2xpZW50IG91dHB1dCBwcm90b2NvbFwiLCIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX1BST1RPQ09MLCIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgIDw8ICIgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIiA8PCBlbmRsCi0gICAgICAgICAgICAgICA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QXyIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YwotICAgICAgICAgICAgICAgPDwgIl9DTElFTlRfT1VUUFVUX1BST1RPQ09MLCBwYXJhbV9zcGVjKTsiIDw8IGVuZGw7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAiICBUSFJJRlRfVU5VU0VEX1ZBUiAoY2xzKTsiIDw8IGVuZGw7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBDIGNvZGUgdGhhdCByZXByZXNlbnRzIGEgVGhyaWZ0IHNlcnZpY2UgaGFuZGxlci4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZm9yIHdoaWNoIHRvIGdlbmVyYXRlIGEgaGFuZGxlci4KLSAqLwotdm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGFuZGxlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZnVuY3Rpb25faXRlcjsKLQotICBzdHJpbmcgc2VydmljZV9uYW1lX2xjID0gdG9fbG93ZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoc2VydmljZV9uYW1lXykpOwotICBzdHJpbmcgc2VydmljZV9uYW1lX3VjID0gdG9fdXBwZXJfY2FzZShzZXJ2aWNlX25hbWVfbGMpOwotCi0gIHN0cmluZyBjbGFzc19uYW1lID0gdGhpcy0+bnNwYWNlICsgc2VydmljZV9uYW1lXyArICJIYW5kbGVyIjsKLSAgc3RyaW5nIGNsYXNzX25hbWVfbGMgPSB0b19sb3dlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhjbGFzc19uYW1lKSk7Ci0gIHN0cmluZyBjbGFzc19uYW1lX3VjID0gdG9fdXBwZXJfY2FzZShjbGFzc19uYW1lX2xjKTsKLQotICBzdHJpbmcgcGFyZW50X2NsYXNzX25hbWU7Ci0gIHN0cmluZyBwYXJlbnRfdHlwZV9uYW1lOwotCi0gIHN0cmluZyBhcmdzX2luZGVudDsKLQotICAvLyBUaGUgc2VydmljZSB0aGlzIHNlcnZpY2UgZXh0ZW5kcywgb3IgTlVMTCBpZiBpdCBleHRlbmRzIG5vIHNlcnZpY2UKLSAgdF9zZXJ2aWNlKiBleHRlbmRzX3NlcnZpY2UgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKLQotICAvLyBEZXRlcm1pbmUgdGhlIG5hbWUgb2Ygb3VyIHBhcmVudCBzZXJ2aWNlIChpZiBhbnkpIGFuZCB0aGUgaGFuZGxlciBjbGFzcycKLSAgLy8gcGFyZW50IGNsYXNzIG5hbWUgYW5kIHR5cGUKLSAgaWYgKGV4dGVuZHNfc2VydmljZSkgewotICAgIHN0cmluZyBwYXJlbnRfc2VydmljZV9uYW1lID0gZXh0ZW5kc19zZXJ2aWNlLT5nZXRfbmFtZSgpOwotICAgIHN0cmluZyBwYXJlbnRfc2VydmljZV9uYW1lX2xjID0gdG9fbG93ZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMocGFyZW50X3NlcnZpY2VfbmFtZSkpOwotICAgIHN0cmluZyBwYXJlbnRfc2VydmljZV9uYW1lX3VjID0gdG9fdXBwZXJfY2FzZShwYXJlbnRfc2VydmljZV9uYW1lX2xjKTsKLQotICAgIHBhcmVudF9jbGFzc19uYW1lID0gdGhpcy0+bnNwYWNlICsgcGFyZW50X3NlcnZpY2VfbmFtZSArICJIYW5kbGVyIjsKLSAgICBwYXJlbnRfdHlwZV9uYW1lID0gdGhpcy0+bnNwYWNlX3VjICsgIlRZUEVfIiArIHBhcmVudF9zZXJ2aWNlX25hbWVfdWMgKyAiX0hBTkRMRVIiOwotICB9IGVsc2UgewotICAgIHBhcmVudF9jbGFzc19uYW1lID0gIkdPYmplY3QiOwotICAgIHBhcmVudF90eXBlX25hbWUgPSAiR19UWVBFX09CSkVDVCI7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSB0aGUgaGFuZGxlciBjbGFzcycgZGVmaW5pdGlvbiBpbiB0aGUgaGVhZGVyIGZpbGUKLQotICAvLyBHZW5lcmF0ZSB0aGUgaGFuZGxlciBpbnN0YW5jZSBkZWZpbml0aW9uCi0gIGZfaGVhZGVyXyA8PCAiLyogIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICIgaGFuZGxlciAoYWJzdHJhY3QgYmFzZSBjbGFzcykgKi8iIDw8IGVuZGwgPDwgInN0cnVjdCBfIgotICAgICAgICAgICAgPDwgY2xhc3NfbmFtZSA8PCBlbmRsIDw8ICJ7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8IHBhcmVudF9jbGFzc19uYW1lIDw8ICIgcGFyZW50OyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9oZWFkZXJfIDw8ICJ9OyIgPDwgZW5kbCA8PCAidHlwZWRlZiBzdHJ1Y3QgXyIgPDwgY2xhc3NfbmFtZSA8PCAiICIgPDwgY2xhc3NfbmFtZSA8PCAiOyIgPDwgZW5kbAotICAgICAgICAgICAgPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgaGFuZGxlciBjbGFzcyBkZWZpbml0aW9uLCBpbmNsdWRpbmcgaXRzIGNsYXNzIG1lbWJlcnMKLSAgLy8gKG1ldGhvZHMpCi0gIGZfaGVhZGVyXyA8PCAic3RydWN0IF8iIDw8IGNsYXNzX25hbWUgPDwgIkNsYXNzIiA8PCBlbmRsIDw8ICJ7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8IHBhcmVudF9jbGFzc19uYW1lIDw8ICJDbGFzcyBwYXJlbnQ7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZm9yIChmdW5jdGlvbl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZ1bmN0aW9uX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2Z1bmN0aW9uX2l0ZXIpIHsKLSAgICBzdHJpbmcgbWV0aG9kX25hbWUgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgdF90eXBlKiByZXR1cm5fdHlwZSA9ICgqZnVuY3Rpb25faXRlciktPmdldF9yZXR1cm50eXBlKCk7Ci0gICAgdF9zdHJ1Y3QqIGFyZ19saXN0ID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICB0X3N0cnVjdCogeF9saXN0ID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOwotICAgIGJvb2wgaGFzX3JldHVybiA9ICFyZXR1cm5fdHlwZS0+aXNfdm9pZCgpOwotICAgIGJvb2wgaGFzX2FyZ3MgPSBhcmdfbGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPT0gMDsKLSAgICBib29sIGhhc194Y2VwdGlvbnMgPSB4X2xpc3QtPmdldF9tZW1iZXJzKCkuc2l6ZSgpID09IDA7Ci0KLSAgICBzdHJpbmcgcGFyYW1zID0gIigiICsgdGhpcy0+bnNwYWNlICsgc2VydmljZV9uYW1lXyArICJJZiAqaWZhY2UiCi0gICAgICAgICAgICAgICAgICAgICsgKGhhc19yZXR1cm4gPyAiLCAiICsgdHlwZV9uYW1lKHJldHVybl90eXBlKSArICIqIF9yZXR1cm4iIDogIiIpCi0gICAgICAgICAgICAgICAgICAgICsgKGhhc19hcmdzID8gIiIgOiAoIiwgIiArIGFyZ3VtZW50X2xpc3QoYXJnX2xpc3QpKSkKLSAgICAgICAgICAgICAgICAgICAgKyAoaGFzX3hjZXB0aW9ucyA/ICIiIDogKCIsICIgKyB4Y2VwdGlvbl9saXN0KHhfbGlzdCkpKSArICIsIEdFcnJvciAqKmVycm9yKSI7Ci0KLSAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCAiZ2Jvb2xlYW4gKCoiIDw8IG1ldGhvZF9uYW1lIDw8ICIpICIgPDwgcGFyYW1zIDw8ICI7IiA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgZl9oZWFkZXJfIDw8ICJ9OyIgPDwgZW5kbCA8PCAidHlwZWRlZiBzdHJ1Y3QgXyIgPDwgY2xhc3NfbmFtZSA8PCAiQ2xhc3MgIiA8PCBjbGFzc19uYW1lCi0gICAgICAgICAgICA8PCAiQ2xhc3M7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHJlbWFpbmluZyBoZWFkZXIgYm9pbGVycGxhdGUKLSAgZl9oZWFkZXJfIDw8ICJHVHlwZSAiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9nZXRfdHlwZSAodm9pZCk7IiA8PCBlbmRsIDw8ICIjZGVmaW5lICIKLSAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0hBTkRMRVIgIgotICAgICAgICAgICAgPDwgIigiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9nZXRfdHlwZSgpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiIDw8IGNsYXNzX25hbWVfdWMKLSAgICAgICAgICAgIDw8ICIob2JqKSAiCi0gICAgICAgICAgICA8PCAiKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIgotICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSEFORExFUiwgIiA8PCBjbGFzc19uYW1lIDw8ICIpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiCi0gICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIklTXyIgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSEFORExFUihvYmopICIKLSAgICAgICAgICAgIDw8ICIoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iCi0gICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9IQU5ETEVSKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIiA8PCBjbGFzc19uYW1lX3VjCi0gICAgICAgICAgICA8PCAiX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iCi0gICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9IQU5ETEVSLCAiIDw8IGNsYXNzX25hbWUgPDwgIkNsYXNzKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIgotICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJJU18iIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0hBTkRMRVJfQ0xBU1MoYykgIgotICAgICAgICAgICAgPDwgIihHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IHNlcnZpY2VfbmFtZV91YwotICAgICAgICAgICAgPDwgIl9IQU5ETEVSKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjCi0gICAgICAgICAgICA8PCAiX0hBTkRMRVJfR0VUX0NMQVNTKG9iaikgIgotICAgICAgICAgICAgPDwgIihHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIgotICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSEFORExFUiwgIiA8PCBjbGFzc19uYW1lIDw8ICJDbGFzcykpIiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGhhbmRsZXIgY2xhc3MnIG1ldGhvZCBkZWZpbml0aW9ucwotICBmb3IgKGZ1bmN0aW9uX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZnVuY3Rpb25faXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZnVuY3Rpb25faXRlcikgewotICAgIHN0cmluZyBtZXRob2RfbmFtZSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcygoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICB0X3R5cGUqIHJldHVybl90eXBlID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKTsKLSAgICB0X3N0cnVjdCogYXJnX2xpc3QgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIHRfc3RydWN0KiB4X2xpc3QgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgYm9vbCBoYXNfcmV0dXJuID0gIXJldHVybl90eXBlLT5pc192b2lkKCk7Ci0gICAgYm9vbCBoYXNfYXJncyA9IGFyZ19saXN0LT5nZXRfbWVtYmVycygpLnNpemUoKSA9PSAwOwotICAgIGJvb2wgaGFzX3hjZXB0aW9ucyA9IHhfbGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPT0gMDsKLQotICAgIHN0cmluZyBwYXJhbXMgPSAiKCIgKyB0aGlzLT5uc3BhY2UgKyBzZXJ2aWNlX25hbWVfICsgIklmICppZmFjZSIKLSAgICAgICAgICAgICAgICAgICAgKyAoaGFzX3JldHVybiA/ICIsICIgKyB0eXBlX25hbWUocmV0dXJuX3R5cGUpICsgIiogX3JldHVybiIgOiAiIikKLSAgICAgICAgICAgICAgICAgICAgKyAoaGFzX2FyZ3MgPyAiIiA6ICgiLCAiICsgYXJndW1lbnRfbGlzdChhcmdfbGlzdCkpKQotICAgICAgICAgICAgICAgICAgICArIChoYXNfeGNlcHRpb25zID8gIiIgOiAoIiwgIiArIHhjZXB0aW9uX2xpc3QoeF9saXN0KSkpICsgIiwgR0Vycm9yICoqZXJyb3IpIjsKLQotICAgIGZfaGVhZGVyXyA8PCAiZ2Jvb2xlYW4gIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfIiA8PCBtZXRob2RfbmFtZSA8PCAiICIgPDwgcGFyYW1zIDw8ICI7IiA8PCBlbmRsOwotICB9Ci0gIGZfaGVhZGVyXyA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBoYW5kbGVyJ3MgaW1wbGVtZW50YXRpb24gaW4gdGhlIGltcGxlbWVudGF0aW9uIGZpbGUKLQotICAvLyBHZW5lcmF0ZSB0aGUgaW1wbGVtZW50YXRpb24gYm9pbGVycGxhdGUKLSAgZl9zZXJ2aWNlXyA8PCAic3RhdGljIHZvaWQiIDw8IGVuZGwgPDwgY2xhc3NfbmFtZV9sYyA8PCAiXyIgPDwgc2VydmljZV9uYW1lX2xjCi0gICAgICAgICAgICAgPDwgIl9pZl9pbnRlcmZhY2VfaW5pdCAoIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiSWZJbnRlcmZhY2UgKmlmYWNlKTsiCi0gICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGFyZ3NfaW5kZW50ID0gc3RyaW5nKDI1LCAnICcpOwotICBmX3NlcnZpY2VfIDw8ICJHX0RFRklORV9UWVBFX1dJVEhfQ09ERSAoIiA8PCBjbGFzc19uYW1lIDw8ICIsICIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAotICAgICAgICAgICAgIDw8IGNsYXNzX25hbWVfbGMgPDwgIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgcGFyZW50X3R5cGVfbmFtZSA8PCAiLCIgPDwgZW5kbAotICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8ICJHX0lNUExFTUVOVF9JTlRFUkZBQ0UgKCIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIKLSAgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9JRiwiIDw8IGVuZGw7Ci0gIGFyZ3NfaW5kZW50ICs9IHN0cmluZygyMywgJyAnKTsKLSAgZl9zZXJ2aWNlXyA8PCBhcmdzX2luZGVudCA8PCBjbGFzc19uYW1lX2xjIDw8ICJfIiA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9pZl9pbnRlcmZhY2VfaW5pdCkpIgotICAgICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgaGFuZGxlciBtZXRob2QgaW1wbGVtZW50YXRpb25zCi0gIGZvciAoZnVuY3Rpb25faXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmdW5jdGlvbl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmdW5jdGlvbl9pdGVyKSB7Ci0gICAgc3RyaW5nIGZ1bmN0aW9uX25hbWUgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIHN0cmluZyBtZXRob2RfbmFtZSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhmdW5jdGlvbl9uYW1lKTsKLSAgICB0X3R5cGUqIHJldHVybl90eXBlID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKTsKLSAgICB0X3N0cnVjdCogYXJnX2xpc3QgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIHRfc3RydWN0KiB4X2xpc3QgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0KLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBhcmdzID0gYXJnX2xpc3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geF9saXN0LT5nZXRfbWVtYmVycygpOwotCi0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmllbGRfaXRlcjsKLQotICAgIHRfZnVuY3Rpb24gaW1wbGVtZW50aW5nX2Z1bmN0aW9uKHJldHVybl90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZV9sYyArICJfaGFuZGxlcl8iICsgbWV0aG9kX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnX2xpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeF9saXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZnVuY3Rpb25faXRlciktPmlzX29uZXdheSgpKTsKLQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJmltcGxlbWVudGluZ19mdW5jdGlvbikgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX3JldHVybl92YWxfaWZfZmFpbCAoIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIklTXyIKLSAgICAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0hBTkRMRVIgKGlmYWNlKSwgRkFMU0UpOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICA8PCAicmV0dXJuICIgPDwgY2xhc3NfbmFtZV91YyA8PCAiX0dFVF9DTEFTUyAoaWZhY2UpIgotICAgICAgICAgICAgICAgPDwgIi0+IiA8PCBtZXRob2RfbmFtZSA8PCAiIChpZmFjZSwgIjsKLQotICAgIGlmICghcmV0dXJuX3R5cGUtPmlzX3ZvaWQoKSkgewotICAgICAgZl9zZXJ2aWNlXyA8PCAiX3JldHVybiwgIjsKLSAgICB9Ci0gICAgZm9yIChmaWVsZF9pdGVyID0gYXJncy5iZWdpbigpOyBmaWVsZF9pdGVyICE9IGFyZ3MuZW5kKCk7ICsrZmllbGRfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PCAoKmZpZWxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIsICI7Ci0gICAgfQotICAgIGZvciAoZmllbGRfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyBmaWVsZF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKytmaWVsZF9pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICgqZmllbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIiwgIjsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAiZXJyb3IpOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHRoZSBoYW5kbGVyIGludGVyZmFjZSBpbml0aWFsaXplcgotICBmX3NlcnZpY2VfIDw8ICJzdGF0aWMgdm9pZCIgPDwgZW5kbCA8PCBjbGFzc19uYW1lX2xjIDw8ICJfIiA8PCBzZXJ2aWNlX25hbWVfbGMKLSAgICAgICAgICAgICA8PCAiX2lmX2ludGVyZmFjZV9pbml0ICgiIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZkludGVyZmFjZSAqaWZhY2UpIgotICAgICAgICAgICAgIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICBpZiAoZnVuY3Rpb25zLnNpemUoKSA+IDApIHsKLSAgICBmb3IgKGZ1bmN0aW9uX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZnVuY3Rpb25faXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZnVuY3Rpb25faXRlcikgewotICAgICAgc3RyaW5nIG1ldGhvZF9uYW1lID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqZnVuY3Rpb25faXRlciktPmdldF9uYW1lKCkpOwotCi0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZmFjZS0+IiA8PCBtZXRob2RfbmFtZSA8PCAiID0gIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfIgotICAgICAgICAgICAgICAgICA8PCBtZXRob2RfbmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLSAgZWxzZSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAiVEhSSUZUX1VOVVNFRF9WQVIgKGlmYWNlKTsiIDw8IGVuZGw7Ci0gIH0KLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBoYW5kbGVyIGluc3RhbmNlIGluaXRpYWxpemVyCi0gIGZfc2VydmljZV8gPDwgInN0YXRpYyB2b2lkIiA8PCBlbmRsIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9pbml0ICgiIDw8IGNsYXNzX25hbWUgPDwgIiAqc2VsZikiCi0gICAgICAgICAgICAgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIlRIUklGVF9VTlVTRURfVkFSIChzZWxmKTsiIDw8IGVuZGw7Ci0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgaGFuZGxlciBjbGFzcyBpbml0aWFsaXplcgotICBmX3NlcnZpY2VfIDw8ICJzdGF0aWMgdm9pZCIgPDwgZW5kbAotICAgICAgICAgICAgIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9jbGFzc19pbml0ICgiIDw8IGNsYXNzX25hbWUgPDwgIkNsYXNzICpjbHMpIgotICAgICAgICAgICAgIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICBpZiAoZnVuY3Rpb25zLnNpemUoKSA+IDApIHsKLSAgICBmb3IgKGZ1bmN0aW9uX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsKLSAgICAgICAgIGZ1bmN0aW9uX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOwotICAgICAgICAgKytmdW5jdGlvbl9pdGVyKSB7Ci0gICAgICBzdHJpbmcgZnVuY3Rpb25fbmFtZSA9ICgqZnVuY3Rpb25faXRlciktPmdldF9uYW1lKCk7Ci0gICAgICBzdHJpbmcgbWV0aG9kX25hbWUgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoZnVuY3Rpb25fbmFtZSk7Ci0KLSAgICAgIC8vIEFsbCBtZXRob2RzIGFyZSBwdXJlIHZpcnR1YWwgYW5kIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NlcwotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiY2xzLT4iIDw8IG1ldGhvZF9uYW1lIDw8ICIgPSBOVUxMOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLSAgZWxzZSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiVEhSSUZUX1VOVVNFRF9WQVIgKGNscyk7IiA8PCBlbmRsOwotICB9Ci0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgQyBjb2RlIHRoYXQgcmVwcmVzZW50cyBhIFRocmlmdCBzZXJ2aWNlIHByb2Nlc3Nvci4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZm9yIHdoaWNoIHRvIGdlbmVyYXRlIGEgcHJvY2Vzc29yCi0gKi8KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZnVuY3Rpb25faXRlcjsKLQotICBzdHJpbmcgc2VydmljZV9uYW1lX2xjID0gdG9fbG93ZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoc2VydmljZV9uYW1lXykpOwotICBzdHJpbmcgc2VydmljZV9uYW1lX3VjID0gdG9fdXBwZXJfY2FzZShzZXJ2aWNlX25hbWVfbGMpOwotCi0gIHN0cmluZyBjbGFzc19uYW1lID0gdGhpcy0+bnNwYWNlICsgc2VydmljZV9uYW1lXyArICJQcm9jZXNzb3IiOwotICBzdHJpbmcgY2xhc3NfbmFtZV9sYyA9IHRvX2xvd2VyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKGNsYXNzX25hbWUpKTsKLSAgc3RyaW5nIGNsYXNzX25hbWVfdWMgPSB0b191cHBlcl9jYXNlKGNsYXNzX25hbWVfbGMpOwotCi0gIHN0cmluZyBwYXJlbnRfY2xhc3NfbmFtZTsKLSAgc3RyaW5nIHBhcmVudF90eXBlX25hbWU7Ci0KLSAgc3RyaW5nIGhhbmRsZXJfY2xhc3NfbmFtZSA9IHRoaXMtPm5zcGFjZSArIHNlcnZpY2VfbmFtZV8gKyAiSGFuZGxlciI7Ci0gIHN0cmluZyBoYW5kbGVyX2NsYXNzX25hbWVfbGMgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoaGFuZGxlcl9jbGFzc19uYW1lKTsKLQotICBzdHJpbmcgcHJvY2Vzc19mdW5jdGlvbl90eXBlX25hbWUgPSBjbGFzc19uYW1lICsgIlByb2Nlc3NGdW5jdGlvbiI7Ci0gIHN0cmluZyBwcm9jZXNzX2Z1bmN0aW9uX2RlZl90eXBlX25hbWUgPQotICAgIGNsYXNzX25hbWVfbGMgKyAiX3Byb2Nlc3NfZnVuY3Rpb25fZGVmIjsKLQotICBzdHJpbmcgZnVuY3Rpb25fbmFtZTsKLSAgc3RyaW5nIGFyZ3NfaW5kZW50OwotCi0gIC8vIFRoZSBzZXJ2aWNlIHRoaXMgc2VydmljZSBleHRlbmRzLCBvciBOVUxMIGlmIGl0IGV4dGVuZHMgbm8gc2VydmljZQotICB0X3NlcnZpY2UqIGV4dGVuZHNfc2VydmljZSA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOwotCi0gIC8vIERldGVybWluZSB0aGUgbmFtZSBvZiBvdXIgcGFyZW50IHNlcnZpY2UgKGlmIGFueSkgYW5kIHRoZQotICAvLyBwcm9jZXNzb3IgY2xhc3MnIHBhcmVudCBjbGFzcyBuYW1lIGFuZCB0eXBlCi0gIGlmIChleHRlbmRzX3NlcnZpY2UpIHsKLSAgICBzdHJpbmcgcGFyZW50X3NlcnZpY2VfbmFtZSA9IGV4dGVuZHNfc2VydmljZS0+Z2V0X25hbWUoKTsKLSAgICBzdHJpbmcgcGFyZW50X3NlcnZpY2VfbmFtZV9sYyA9IHRvX2xvd2VyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHBhcmVudF9zZXJ2aWNlX25hbWUpKTsKLSAgICBzdHJpbmcgcGFyZW50X3NlcnZpY2VfbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UocGFyZW50X3NlcnZpY2VfbmFtZV9sYyk7Ci0KLSAgICBwYXJlbnRfY2xhc3NfbmFtZSA9IHRoaXMtPm5zcGFjZSArIHBhcmVudF9zZXJ2aWNlX25hbWUgKyAiUHJvY2Vzc29yIjsKLSAgICBwYXJlbnRfdHlwZV9uYW1lID0gdGhpcy0+bnNwYWNlX3VjICsgIlRZUEVfIiArIHBhcmVudF9zZXJ2aWNlX25hbWVfdWMgKyAiX1BST0NFU1NPUiI7Ci0gIH0gZWxzZSB7Ci0gICAgcGFyZW50X2NsYXNzX25hbWUgPSAiVGhyaWZ0RGlzcGF0Y2hQcm9jZXNzb3IiOwotICAgIHBhcmVudF90eXBlX25hbWUgPSAiVEhSSUZUX1RZUEVfRElTUEFUQ0hfUFJPQ0VTU09SIjsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzb3IgY2xhc3MnIGRlZmluaXRpb24gaW4gdGhlIGhlYWRlciBmaWxlCi0KLSAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3NvciBpbnN0YW5jZSBkZWZpbml0aW9uCi0gIGZfaGVhZGVyXyA8PCAiLyogIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICIgcHJvY2Vzc29yICovIiA8PCBlbmRsIDw8ICJzdHJ1Y3QgXyIgPDwgY2xhc3NfbmFtZSA8PCBlbmRsCi0gICAgICAgICAgICA8PCAieyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCBwYXJlbnRfY2xhc3NfbmFtZSA8PCAiIHBhcmVudDsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgPDwgIi8qIHByb3RlY3RlZCAqLyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlICsgc2VydmljZV9uYW1lXyArICJIYW5kbGVyICpoYW5kbGVyOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgPDwgIkdIYXNoVGFibGUgKnByb2Nlc3NfbWFwOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9oZWFkZXJfIDw8ICJ9OyIgPDwgZW5kbCA8PCAidHlwZWRlZiBzdHJ1Y3QgXyIgPDwgY2xhc3NfbmFtZSA8PCAiICIgPDwgY2xhc3NfbmFtZSA8PCAiOyIgPDwgZW5kbAotICAgICAgICAgICAgPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2Vzc29yIGNsYXNzIGRlZmluaXRpb24KLSAgZl9oZWFkZXJfIDw8ICJzdHJ1Y3QgXyIgPDwgY2xhc3NfbmFtZSA8PCAiQ2xhc3MiIDw8IGVuZGwgPDwgInsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgcGFyZW50X2NsYXNzX25hbWUgPDwgIkNsYXNzIHBhcmVudDsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgPDwgIi8qIHByb3RlY3RlZCAqLyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgPDwgImdib29sZWFuICgqZGlzcGF0Y2hfY2FsbCkgKFRocmlmdERpc3BhdGNoUHJvY2Vzc29yICpwcm9jZXNzb3IsIiA8PCBlbmRsOwotICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgc3RyaW5nKDI3LCAnICcpOwotICBmX2hlYWRlcl8gPDwgYXJnc19pbmRlbnQgPDwgIlRocmlmdFByb3RvY29sICppbiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIlRocmlmdFByb3RvY29sICpvdXQsIgotICAgICAgICAgICAgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiZ2NoYXIgKmZuYW1lLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiZ2ludDMyIHNlcWlkLCIKLSAgICAgICAgICAgIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIkdFcnJvciAqKmVycm9yKTsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfaGVhZGVyXyA8PCAifTsiIDw8IGVuZGwgPDwgInR5cGVkZWYgc3RydWN0IF8iIDw8IGNsYXNzX25hbWUgPDwgIkNsYXNzICIgPDwgY2xhc3NfbmFtZQotICAgICAgICAgICAgPDwgIkNsYXNzOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSByZW1haW5pbmcgaGVhZGVyIGJvaWxlcnBsYXRlCi0gIGZfaGVhZGVyXyA8PCAiR1R5cGUgIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfZ2V0X3R5cGUgKHZvaWQpOyIgPDwgZW5kbCA8PCAiI2RlZmluZSAiCi0gICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIiA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9QUk9DRVNTT1IgIgotICAgICAgICAgICAgPDwgIigiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9nZXRfdHlwZSgpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiIDw8IGNsYXNzX25hbWVfdWMKLSAgICAgICAgICAgIDw8ICIob2JqKSAiCi0gICAgICAgICAgICA8PCAiKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIgotICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfUFJPQ0VTU09SLCAiIDw8IGNsYXNzX25hbWUgPDwgIikpIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIKLSAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiSVNfIiA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9QUk9DRVNTT1Iob2JqKSAiCi0gICAgICAgICAgICA8PCAiKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIgotICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfUFJPQ0VTU09SKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIiA8PCBjbGFzc19uYW1lX3VjCi0gICAgICAgICAgICA8PCAiX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iCi0gICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9QUk9DRVNTT1IsICIgPDwgY2xhc3NfbmFtZSA8PCAiQ2xhc3MpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiCi0gICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIklTXyIgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfUFJPQ0VTU09SX0NMQVNTKGMpICIKLSAgICAgICAgICAgIDw8ICIoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIiA8PCBzZXJ2aWNlX25hbWVfdWMKLSAgICAgICAgICAgIDw8ICJfUFJPQ0VTU09SKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjCi0gICAgICAgICAgICA8PCAiX1BST0NFU1NPUl9HRVRfQ0xBU1Mob2JqKSAiCi0gICAgICAgICAgICA8PCAiKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iCi0gICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9QUk9DRVNTT1IsICIgPDwgY2xhc3NfbmFtZSA8PCAiQ2xhc3MpKSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzb3IncyBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgaW1wbGVtZW50YXRpb24gZmlsZQotCi0gIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzb3IncyBwcm9wZXJ0aWVzIGVudW0KLSAgZl9zZXJ2aWNlXyA8PCAiZW51bSBfIiA8PCBjbGFzc19uYW1lIDw8ICJQcm9wZXJ0aWVzIiA8PCBlbmRsIDw8ICJ7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiUFJPUF8iIDw8IGNsYXNzX25hbWVfdWMgPDwgIl8wLCIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiUFJPUF8iCi0gICAgICAgICAgICAgPDwgY2xhc3NfbmFtZV91YyA8PCAiX0hBTkRMRVIiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwgIn07IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGltcGxlbWVudGF0aW9uIGJvaWxlcnBsYXRlCi0gIGFyZ3NfaW5kZW50ID0gc3RyaW5nKDE1LCAnICcpOwotICBmX3NlcnZpY2VfIDw8ICJHX0RFRklORV9UWVBFICgiIDw8IGNsYXNzX25hbWUgPDwgIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgY2xhc3NfbmFtZV9sYwotICAgICAgICAgICAgIDw8ICIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8IHBhcmVudF90eXBlX25hbWUgPDwgIikiIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2Vzc29yJ3MgcHJvY2Vzc2luZy1mdW5jdGlvbiB0eXBlCi0gIGFyZ3NfaW5kZW50ID0gc3RyaW5nKHByb2Nlc3NfZnVuY3Rpb25fdHlwZV9uYW1lLmxlbmd0aCgpICsgMjMsICcgJyk7Ci0gIGZfc2VydmljZV8gPDwgInR5cGVkZWYgZ2Jvb2xlYW4gKCogIiA8PCBwcm9jZXNzX2Z1bmN0aW9uX3R5cGVfbmFtZSA8PCAiKSAoIgotICAgICAgICAgICAgIDw8IGNsYXNzX25hbWUgPDwgIiAqLCAiIDw8IGVuZGwKLSAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAiZ2ludDMyLCIgPDwgZW5kbAotICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8ICJUaHJpZnRQcm90b2NvbCAqLCIgPDwgZW5kbAotICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8ICJUaHJpZnRQcm90b2NvbCAqLCIgPDwgZW5kbAotICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8ICJHRXJyb3IgKiopOyIgPDwgZW5kbAotICAgICAgICAgICAgIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3NvcidzIHByb2Nlc3NpbmctZnVuY3Rpb24tZGVmaW5pdGlvbiB0eXBlCi0gIGZfc2VydmljZV8gPDwgInR5cGVkZWYgc3RydWN0IiA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgInsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnY2hhciAqbmFtZTsiIDw8IGVuZGwKLSAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBwcm9jZXNzX2Z1bmN0aW9uX3R5cGVfbmFtZSA8PCAiIGZ1bmN0aW9uOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PCAifSAiIDw8IHByb2Nlc3NfZnVuY3Rpb25fZGVmX3R5cGVfbmFtZSA8PCAiOyIgPDwgZW5kbAotICAgICAgICAgICAgIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgZm9yd2FyZCBkZWNsYXJhdGlvbnMgb2YgdGhlIHByb2Nlc3NvcidzIHByb2Nlc3NpbmcgZnVuY3Rpb25zIHNvIHdlCi0gIC8vIGNhbiByZWZlciB0byB0aGVtIGluIHRoZSBwcm9jZXNzaW5nLWZ1bmN0aW9uLWRlZmluaXRpb24gc3RydWN0IGJlbG93IGFuZAotICAvLyBrZWVwIGFsbCBvZiB0aGUgcHJvY2Vzc29yJ3MgZGVjbGFyYXRpb25zIGluIG9uZSBwbGFjZQotICBmb3IgKGZ1bmN0aW9uX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsKLSAgICAgICBmdW5jdGlvbl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsKLSAgICAgICArK2Z1bmN0aW9uX2l0ZXIpIHsKLSAgICBmdW5jdGlvbl9uYW1lID0gY2xhc3NfbmFtZV9sYyArICJfcHJvY2Vzc18iCi0gICAgICArIGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcygoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLQotICAgIGFyZ3NfaW5kZW50ID0gc3RyaW5nKGZ1bmN0aW9uX25hbWUubGVuZ3RoKCkgKyAyLCAnICcpOwotICAgIGZfc2VydmljZV8gPDwgInN0YXRpYyBnYm9vbGVhbiIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgZnVuY3Rpb25fbmFtZSA8PCAiICgiCi0gICAgICAgICAgICAgICA8PCBjbGFzc19uYW1lIDw8ICIgKiwiIDw8IGVuZGwKLSAgICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8ICJnaW50MzIsIiA8PCBlbmRsCi0gICAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAiVGhyaWZ0UHJvdG9jb2wgKiwiIDw8IGVuZGwKLSAgICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8ICJUaHJpZnRQcm90b2NvbCAqLCIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgIkdFcnJvciAqKik7IiA8PCBlbmRsOwotICB9Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2Vzc29yJ3MgcHJvY2Vzc2luZy1mdW5jdGlvbiBkZWZpbml0aW9ucywgaWYgdGhlIHNlcnZpY2UKLSAgLy8gZGVmaW5lcyBhbnkgbWV0aG9kcwotICBpZiAoZnVuY3Rpb25zLnNpemUoKSA+IDApIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzdGF0aWMgIiA8PCBwcm9jZXNzX2Z1bmN0aW9uX2RlZl90eXBlX25hbWUKLSAgICAgICAgICAgICAgIDw8IGVuZGwKLSAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9wcm9jZXNzX2Z1bmN0aW9uX2RlZnNbIgotICAgICAgICAgICAgICAgPDwgZnVuY3Rpb25zLnNpemUoKSA8PCAiXSA9IHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZm9yIChmdW5jdGlvbl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7Ci0gICAgICAgICBmdW5jdGlvbl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsKLSAgICAgICAgICsrZnVuY3Rpb25faXRlcikgewotICAgICAgc3RyaW5nIHNlcnZpY2VfZnVuY3Rpb25fbmFtZSA9ICgqZnVuY3Rpb25faXRlciktPmdldF9uYW1lKCk7Ci0gICAgICBzdHJpbmcgcHJvY2Vzc19mdW5jdGlvbl9uYW1lID0gY2xhc3NfbmFtZV9sYyArICJfcHJvY2Vzc18iCi0gICAgICAgICsgaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHNlcnZpY2VfZnVuY3Rpb25fbmFtZSk7Ci0KLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIlwiIiA8PCBzZXJ2aWNlX2Z1bmN0aW9uX25hbWUgPDwgIlwiLCIgPDwgZW5kbAotICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBwcm9jZXNzX2Z1bmN0aW9uX25hbWUgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IgotICAgICAgICAgICAgICAgICA8PCAoZnVuY3Rpb25faXRlciA9PSAtLWZ1bmN0aW9ucy5lbmQoKSA/ICIiIDogIiwiKSA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn07IiA8PCBlbmRsCi0gICAgICAgICAgICAgICA8PCBlbmRsOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3NvcidzIHByb2Nlc3NpbmcgZnVuY3Rpb25zCi0gIGZvciAoZnVuY3Rpb25faXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmdW5jdGlvbl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmdW5jdGlvbl9pdGVyKSB7Ci0gICAgc3RyaW5nIHNlcnZpY2VfZnVuY3Rpb25fbmFtZSA9ICgqZnVuY3Rpb25faXRlciktPmdldF9uYW1lKCk7Ci0gICAgc3RyaW5nIHNlcnZpY2VfZnVuY3Rpb25fbmFtZV9pYyA9IHVuZGVyc2NvcmVzX3RvX2luaXRpYWxfY2FwcyhzZXJ2aWNlX2Z1bmN0aW9uX25hbWUpOwotICAgIHN0cmluZyBzZXJ2aWNlX2Z1bmN0aW9uX25hbWVfbGMgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoc2VydmljZV9mdW5jdGlvbl9uYW1lKTsKLSAgICBzdHJpbmcgc2VydmljZV9mdW5jdGlvbl9uYW1lX3VjID0gdG9fdXBwZXJfY2FzZShzZXJ2aWNlX2Z1bmN0aW9uX25hbWVfbGMpOwotCi0gICAgdF90eXBlKiByZXR1cm5fdHlwZSA9ICgqZnVuY3Rpb25faXRlciktPmdldF9yZXR1cm50eXBlKCk7Ci0gICAgYm9vbCBoYXNfcmV0dXJuX3ZhbHVlID0gIXJldHVybl90eXBlLT5pc192b2lkKCk7Ci0KLSAgICB0X3N0cnVjdCogYXJnX2xpc3QgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGFyZ3MgPSBhcmdfbGlzdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBhcmdfaXRlcjsKLQotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9ICgqZnVuY3Rpb25faXRlciktPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4Y2VwdGlvbl9pdGVyOwotCi0gICAgc3RyaW5nIGFyZ3NfY2xhc3NfbmFtZSA9IHRoaXMtPm5zcGFjZSArIHNlcnZpY2VfbmFtZV8gKyBzZXJ2aWNlX2Z1bmN0aW9uX25hbWVfaWMgKyAiQXJncyI7Ci0gICAgc3RyaW5nIGFyZ3NfY2xhc3NfdHlwZSA9IHRoaXMtPm5zcGFjZV91YyArICJUWVBFXyIgKyBzZXJ2aWNlX25hbWVfdWMgKyAiXyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzZXJ2aWNlX2Z1bmN0aW9uX25hbWVfdWMgKyAiX0FSR1MiOwotCi0gICAgc3RyaW5nIHJlc3VsdF9jbGFzc19uYW1lID0gdGhpcy0+bnNwYWNlICsgc2VydmljZV9uYW1lXyArIHNlcnZpY2VfZnVuY3Rpb25fbmFtZV9pYyArICJSZXN1bHQiOwotICAgIHN0cmluZyByZXN1bHRfY2xhc3NfdHlwZSA9IHRoaXMtPm5zcGFjZV91YyArICJUWVBFXyIgKyBzZXJ2aWNlX25hbWVfdWMgKyAiXyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNlcnZpY2VfZnVuY3Rpb25fbmFtZV91YyArICJfUkVTVUxUIjsKLQotICAgIHN0cmluZyBoYW5kbGVyX2Z1bmN0aW9uX25hbWUgPSBoYW5kbGVyX2NsYXNzX25hbWVfbGMgKyAiXyIgKyBzZXJ2aWNlX2Z1bmN0aW9uX25hbWVfbGM7Ci0KLSAgICBmdW5jdGlvbl9uYW1lID0gY2xhc3NfbmFtZV9sYyArICJfcHJvY2Vzc18iCi0gICAgICAgICAgICAgICAgICAgICsgaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHNlcnZpY2VfZnVuY3Rpb25fbmFtZSk7Ci0KLSAgICBhcmdzX2luZGVudCA9IHN0cmluZyhmdW5jdGlvbl9uYW1lLmxlbmd0aCgpICsgMiwgJyAnKTsKLSAgICBmX3NlcnZpY2VfIDw8ICJzdGF0aWMgZ2Jvb2xlYW4iIDw8IGVuZGwgPDwgZnVuY3Rpb25fbmFtZSA8PCAiICgiIDw8IGNsYXNzX25hbWUgPDwgIiAqc2VsZiwiCi0gICAgICAgICAgICAgICA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJnaW50MzIgc2VxdWVuY2VfaWQsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50Ci0gICAgICAgICAgICAgICA8PCAiVGhyaWZ0UHJvdG9jb2wgKmlucHV0X3Byb3RvY29sLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAotICAgICAgICAgICAgICAgPDwgIlRocmlmdFByb3RvY29sICpvdXRwdXRfcHJvdG9jb2wsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJHRXJyb3IgKiplcnJvcikiCi0gICAgICAgICAgICAgICA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdib29sZWFuIHJlc3VsdCA9IFRSVUU7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiVGhyaWZ0VHJhbnNwb3J0ICogdHJhbnNwb3J0OyIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIlRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uICp4Y2VwdGlvbjsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGFyZ3NfY2xhc3NfbmFtZSArICIgKiBhcmdzID0iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19vYmplY3RfbmV3ICgiIDw8IGFyZ3NfY2xhc3NfdHlwZSA8PCAiLCBOVUxMKTsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGlmICgoKmZ1bmN0aW9uX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiVEhSSUZUX1VOVVNFRF9WQVIgKHNlcXVlbmNlX2lkKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICAgPDwgIlRIUklGVF9VTlVTRURfVkFSIChvdXRwdXRfcHJvdG9jb2wpOyIgPDwgZW5kbCA8PCBlbmRsOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF9nZXQgKGlucHV0X3Byb3RvY29sLCBcInRyYW5zcG9ydFwiLCAiCi0gICAgICAgICAgICAgICA8PCAiJnRyYW5zcG9ydCwgTlVMTCk7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICAvLyBSZWFkIHRoZSBtZXRob2QncyBhcmd1bWVudHMgZnJvbSB0aGUgY2FsbGVyCi0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKCh0aHJpZnRfc3RydWN0X3JlYWQgKFRIUklGVF9TVFJVQ1QgKGFyZ3MpLCAiCi0gICAgICAgICAgICAgICA8PCAiaW5wdXRfcHJvdG9jb2wsIGVycm9yKSAhPSAtMSkgJiYiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgIDw8ICIgICAgKHRocmlmdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfZW5kIChpbnB1dF9wcm90b2NvbCwgIgotICAgICAgICAgICAgICAgPDwgImVycm9yKSAhPSAtMSkgJiYiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgIDw8ICIgICAgKHRocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQgKHRyYW5zcG9ydCwgZXJyb3IpICE9IEZBTFNFKSkiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgICBmb3IgKGFyZ19pdGVyID0gYXJncy5iZWdpbigpOyBhcmdfaXRlciAhPSBhcmdzLmVuZCgpOyArK2FyZ19pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IHByb3BlcnR5X3R5cGVfbmFtZSgoKmFyZ19pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiAiCi0gICAgICAgICAgICAgICAgIDw8ICgqYXJnX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLSAgICBmb3IgKHhjZXB0aW9uX2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeGNlcHRpb25faXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreGNlcHRpb25faXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCB0eXBlX25hbWUoKCp4Y2VwdGlvbl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiAiCi0gICAgICAgICAgICAgICAgIDw8IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcygoKnhjZXB0aW9uX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiID0gTlVMTDsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGlmIChoYXNfcmV0dXJuX3ZhbHVlKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IHByb3BlcnR5X3R5cGVfbmFtZShyZXR1cm5fdHlwZSkgPDwgIiByZXR1cm5fdmFsdWU7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpZiAoISgqZnVuY3Rpb25faXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IHJlc3VsdF9jbGFzc19uYW1lIDw8ICIgKiByZXN1bHRfc3RydWN0OyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gICAgaWYgKGFyZ3Muc2l6ZSgpID4gMCkgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19vYmplY3RfZ2V0IChhcmdzLCIgPDwgZW5kbDsKLSAgICAgIGFyZ3NfaW5kZW50ID0gaW5kZW50KCkgKyBzdHJpbmcoMTQsICcgJyk7Ci0gICAgICBmb3IgKGFyZ19pdGVyID0gYXJncy5iZWdpbigpOyBhcmdfaXRlciAhPSBhcmdzLmVuZCgpOyArK2FyZ19pdGVyKSB7Ci0gICAgICAgIHN0cmluZyBhcmdfbmFtZSA9ICgqYXJnX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgICAgIGZfc2VydmljZV8gPDwgYXJnc19pbmRlbnQgPDwgIlwiIiA8PCBhcmdfbmFtZSA8PCAiXCIsICYiIDw8IGFyZ19uYW1lIDw8ICIsIiA8PCBlbmRsOwotICAgICAgfQotICAgICAgZl9zZXJ2aWNlXyA8PCBhcmdzX2luZGVudCA8PCAiTlVMTCk7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaWYgKCEoKmZ1bmN0aW9uX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgIDw8ICJnX29iamVjdF9nZXQgKG91dHB1dF9wcm90b2NvbCwgXCJ0cmFuc3BvcnRcIiwgIgotICAgICAgICAgICAgICAgICA8PCAiJnRyYW5zcG9ydCwgTlVMTCk7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICAgPDwgInJlc3VsdF9zdHJ1Y3QgPSBnX29iamVjdF9uZXcgKCIgPDwgcmVzdWx0X2NsYXNzX3R5cGUgPDwgIiwgTlVMTCk7IiA8PCBlbmRsOwotICAgICAgaWYgKGhhc19yZXR1cm5fdmFsdWUpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19vYmplY3RfZ2V0IChyZXN1bHRfc3RydWN0LCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwic3VjY2Vzc1wiLCAmcmV0dXJuX3ZhbHVlLCBOVUxMKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gUGFzcyB0aGUgYXJndW1lbnRzIHRvIHRoZSBjb3JyZXNwb25kaW5nIG1ldGhvZCBpbiB0aGUgaGFuZGxlcgotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmICgiIDw8IGhhbmRsZXJfZnVuY3Rpb25fbmFtZSA8PCAiICgiIDw8IHRoaXMtPm5zcGFjZV91YwotICAgICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSUYgKHNlbGYtPmhhbmRsZXIpLCIgPDwgZW5kbDsKLSAgICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgc3RyaW5nKGhhbmRsZXJfZnVuY3Rpb25fbmFtZS5sZW5ndGgoKSArIDYsICcgJyk7Ci0gICAgaWYgKGhhc19yZXR1cm5fdmFsdWUpIHsKLSAgICAgIHN0cmluZyByZXR1cm5fdHlwZV9uYW1lID0gdHlwZV9uYW1lKHJldHVybl90eXBlKTsKLQotICAgICAgZl9zZXJ2aWNlXyA8PCBhcmdzX2luZGVudDsKLQotICAgICAgLy8gQ2FzdCByZXR1cm5fdmFsdWUgaWYgaXQgd2FzIGRlY2xhcmVkIGFzIGEgdHlwZSBvdGhlciB0aGFuIHRoZSByZXR1cm4KLSAgICAgIC8vIHZhbHVlJ3MgYWN0dWFsIHR5cGUtLS10aGlzIGlzIHRydWUgZm9yIGludGVnZXIgdmFsdWVzIDMyIGJpdHMgb3IgZmV3ZXIKLSAgICAgIC8vIGluIHdpZHRoLCBmb3Igd2hpY2ggR0xpYiByZXF1aXJlcyBhIHBsYWluIGdpbnQgdHlwZSBiZSB1c2VkIHdoZW4KLSAgICAgIC8vIHN0b3Jpbmcgb3IgcmV0cmlldmluZyBhcyBhbiBvYmplY3QgcHJvcGVydHkKLSAgICAgIGlmIChyZXR1cm5fdHlwZV9uYW1lICE9IHByb3BlcnR5X3R5cGVfbmFtZShyZXR1cm5fdHlwZSkpIHsKLSAgICAgICAgaWYgKHJldHVybl90eXBlX25hbWVbcmV0dXJuX3R5cGVfbmFtZS5sZW5ndGgoKSAtIDFdICE9ICcqJykgewotICAgICAgICAgIHJldHVybl90eXBlX25hbWUgKz0gJyAnOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybl90eXBlX25hbWUgKz0gJyonOwotCi0gICAgICAgIGZfc2VydmljZV8gPDwgIigiIDw8IHJldHVybl90eXBlX25hbWUgPDwgIikiOwotICAgICAgfQotCi0gICAgICBmX3NlcnZpY2VfIDw8ICImcmV0dXJuX3ZhbHVlLCIgPDwgZW5kbDsKLSAgICB9Ci0gICAgZm9yIChhcmdfaXRlciA9IGFyZ3MuYmVnaW4oKTsgYXJnX2l0ZXIgIT0gYXJncy5lbmQoKTsgKythcmdfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PCBhcmdzX2luZGVudCA8PCAoKmFyZ19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiLCIgPDwgZW5kbDsKLSAgICB9Ci0gICAgZm9yICh4Y2VwdGlvbl9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhjZXB0aW9uX2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hjZXB0aW9uX2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgYXJnc19pbmRlbnQgPDwgIiYiIDw8IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcygoKnhjZXB0aW9uX2l0ZXIpLT5nZXRfbmFtZSgpKQotICAgICAgICAgICAgICAgICA8PCAiLCIgPDwgZW5kbDsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCBhcmdzX2luZGVudCA8PCAiZXJyb3IpID09IFRSVUUpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0gICAgLy8gVGhlIGhhbmRsZXIgcmVwb3J0ZWQgc3VjY2VzczsgcmV0dXJuIHRoZSByZXN1bHQsIGlmIGFueSwgdG8gdGhlIGNhbGxlcgotICAgIGlmICghKCpmdW5jdGlvbl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIGlmIChoYXNfcmV0dXJuX3ZhbHVlKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X3NldCAocmVzdWx0X3N0cnVjdCwgXCJzdWNjZXNzXCIsIHJldHVybl92YWx1ZSwgIgotICAgICAgICAgICAgICAgICAgIDw8ICJOVUxMKTsiIDw8IGVuZGw7Ci0KLSAgICAgICAgLy8gRGVhbGxvY2F0ZSAob3IgdW5yZWYpIHJldHVybl92YWx1ZQotICAgICAgICByZXR1cm5fdHlwZSA9IGdldF90cnVlX3R5cGUocmV0dXJuX3R5cGUpOwotICAgICAgICBpZiAocmV0dXJuX3R5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICAgICAgdF9iYXNlX3R5cGUqIGJhc2VfdHlwZSA9ICgodF9iYXNlX3R5cGUqKXJldHVybl90eXBlKTsKLQotICAgICAgICAgIGlmIChiYXNlX3R5cGUtPmdldF9iYXNlKCkgPT0gdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HKSB7Ci0gICAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAocmV0dXJuX3ZhbHVlICE9IE5VTEwpIiA8PCBlbmRsOwotICAgICAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgICAgICBpZiAoYmFzZV90eXBlLT5pc19iaW5hcnkoKSkgewotICAgICAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX2J5dGVfYXJyYXlfdW5yZWYgKHJldHVybl92YWx1ZSk7IiA8PCBlbmRsOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19mcmVlIChyZXR1cm5fdmFsdWUpOyIgPDwgZW5kbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHJldHVybl90eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChyZXR1cm5fdmFsdWUgIT0gTlVMTCkiIDw8IGVuZGw7Ci0gICAgICAgICAgaW5kZW50X3VwKCk7Ci0KLSAgICAgICAgICBpZiAocmV0dXJuX3R5cGUtPmlzX2xpc3QoKSkgewotICAgICAgICAgICAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfbGlzdCopcmV0dXJuX3R5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0KLSAgICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gICAgICAgICAgICBpZiAoKGVsZW1fdHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgIWVsZW1fdHlwZS0+aXNfc3RyaW5nKCkpCi0gICAgICAgICAgICAgICAgfHwgZWxlbV90eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgICAgICAgICAgZl9zZXJ2aWNlXyA8PCAiZ19hcnJheV91bnJlZiI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBmX3NlcnZpY2VfIDw8ICJnX3B0cl9hcnJheV91bnJlZiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmX3NlcnZpY2VfIDw8ICIgKHJldHVybl92YWx1ZSk7IiA8PCBlbmRsOwotICAgICAgICAgIH0gZWxzZSBpZiAocmV0dXJuX3R5cGUtPmlzX21hcCgpIHx8IHJldHVybl90eXBlLT5pc19zZXQoKSkgewotICAgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19oYXNoX3RhYmxlX3VucmVmIChyZXR1cm5fdmFsdWUpOyIgPDwgZW5kbDsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICB9IGVsc2UgaWYgKHJldHVybl90eXBlLT5pc19zdHJ1Y3QoKSkgewotICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChyZXR1cm5fdmFsdWUgIT0gTlVMTCkiIDw8IGVuZGw7Ci0gICAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19vYmplY3RfdW5yZWYgKHJldHVybl92YWx1ZSk7IiA8PCBlbmRsOwotICAgICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQgPSIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiKCh0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAob3V0cHV0X3Byb3RvY29sLCIgPDwgZW5kbDsKLSAgICAgIGFyZ3NfaW5kZW50ID0gaW5kZW50KCkgKyBzdHJpbmcoMzksICcgJyk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGFyZ3NfaW5kZW50IDw8ICJcIiIgPDwgc2VydmljZV9mdW5jdGlvbl9uYW1lIDw8ICJcIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKLSAgICAgICAgICAgICAgICAgPDwgIlRfUkVQTFksIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJzZXF1ZW5jZV9pZCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKLSAgICAgICAgICAgICAgICAgPDwgImVycm9yKSAhPSAtMSkgJiYiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICAgPDwgIiAodGhyaWZ0X3N0cnVjdF93cml0ZSAoVEhSSUZUX1NUUlVDVCAocmVzdWx0X3N0cnVjdCksIiA8PCBlbmRsOwotICAgICAgYXJnc19pbmRlbnQgPSBpbmRlbnQoKSArIHN0cmluZygyMywgJyAnKTsKLSAgICAgIGZfc2VydmljZV8gPDwgYXJnc19pbmRlbnQgPDwgIm91dHB1dF9wcm90b2NvbCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgImVycm9yKSAhPSAtMSkpOyIKLSAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgfQotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZWxzZSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICAgIC8vIFRoZSBoYW5kbGVyIHJlcG9ydGVkIGZhaWx1cmU7IGNoZWNrIHRvIHNlZSBpZiBhbiBhcHBsaWNhdGlvbi1kZWZpbmVkCi0gICAgLy8gZXhjZXB0aW9uIHdhcyByYWlzZWQgYW5kIGlmIHNvLCByZXR1cm4gaXQgdG8gdGhlIGNhbGxlcgotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gICAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgICBmb3IgKHhjZXB0aW9uX2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeGNlcHRpb25faXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreGNlcHRpb25faXRlcikgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICJpZiAoIiA8PCBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoKCp4Y2VwdGlvbl9pdGVyKS0+Z2V0X25hbWUoKSkKLSAgICAgICAgICAgICAgICAgICA8PCAiICE9IE5VTEwpIiA8PCBlbmRsOwotICAgICAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19vYmplY3Rfc2V0IChyZXN1bHRfc3RydWN0LCIgPDwgZW5kbDsKLSAgICAgICAgYXJnc19pbmRlbnQgPSBpbmRlbnQoKSArIHN0cmluZygxNCwgJyAnKTsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBhcmdzX2luZGVudCA8PCAiXCIiIDw8ICgqeGNlcHRpb25faXRlciktPmdldF9uYW1lKCkgPDwgIlwiLCAiCi0gICAgICAgICAgICAgICAgICAgPDwgKCp4Y2VwdGlvbl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiTlVMTCk7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0ID0iIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIoKHRocmlmdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChvdXRwdXRfcHJvdG9jb2wsIiA8PCBlbmRsOwotICAgICAgICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgc3RyaW5nKDM5LCAnICcpOwotICAgICAgICBmX3NlcnZpY2VfIDw8IGFyZ3NfaW5kZW50IDw8ICJcIiIgPDwgc2VydmljZV9mdW5jdGlvbl9uYW1lIDw8ICJcIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKLSAgICAgICAgICAgICAgICAgICA8PCAiVF9SRVBMWSwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgInNlcXVlbmNlX2lkLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAotICAgICAgICAgICAgICAgICAgIDw8ICJlcnJvcikgIT0gLTEpICYmIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgICAgPDwgIiAodGhyaWZ0X3N0cnVjdF93cml0ZSAoVEhSSUZUX1NUUlVDVCAocmVzdWx0X3N0cnVjdCksIiA8PCBlbmRsOwotICAgICAgICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgc3RyaW5nKDIzLCAnICcpOwotICAgICAgICBmX3NlcnZpY2VfIDw8IGFyZ3NfaW5kZW50IDw8ICJvdXRwdXRfcHJvdG9jb2wsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJlcnJvcikgIT0gLTEpKTsiCi0gICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZWxzZSIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICAgIH0KLQotICAgIC8vIElmIHRoZSBoYW5kbGVyIHJlcG9ydGVkIGZhaWx1cmUgYnV0IHJhaXNlZCBubyBhcHBsaWNhdGlvbi1kZWZpbmVkCi0gICAgLy8gZXhjZXB0aW9uLCByZXR1cm4gYSBUaHJpZnQgYXBwbGljYXRpb24gZXhjZXB0aW9uIHdpdGggdGhlIGluZm9ybWF0aW9uCi0gICAgLy8gcmV0dXJuZWQgdmlhIEdMaWIncyBvd24gZXJyb3ItcmVwb3J0aW5nIG1lY2hhbmlzbQotICAgIGZfc2VydmljZV8gPDwgImlmICgqZXJyb3IgPT0gTlVMTCkiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ193YXJuaW5nIChcIiIgPDwgc2VydmljZV9uYW1lXyA8PCAiLiIKLSAgICAgICAgICAgICAgIDw8ICgqZnVuY3Rpb25faXRlciktPmdldF9uYW1lKCkgPDwgIiBpbXBsZW1lbnRhdGlvbiByZXR1cm5lZCBGQUxTRSBcIiIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgc3RyaW5nKDExLCAnICcpIDw8ICJcImJ1dCBkaWQgbm90IHNldCBhbiBlcnJvclwiKTsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInhjZXB0aW9uID0iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9BUFBMSUNBVElPTl9FWENFUFRJT04sIiA8PCBlbmRsOwotICAgIGFyZ3NfaW5kZW50ID0gaW5kZW50KCkgKyBzdHJpbmcoMTQsICcgJyk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBhcmdzX2luZGVudCA8PCAiXCJ0eXBlXCIsICAgICplcnJvciAhPSBOVUxMID8gKCplcnJvciktPmNvZGUgOiIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgc3RyaW5nKDExLCAnICcpIDw8ICJUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX1VOS05PV04sIgotICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiXCJtZXNzYWdlXCIsICplcnJvciAhPSBOVUxMID8gKCplcnJvciktPm1lc3NhZ2UgOiBOVUxMLCIKLSAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIk5VTEwpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfY2xlYXJfZXJyb3IgKGVycm9yKTsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgPDwgInJlc3VsdCA9IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIigodGhyaWZ0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKG91dHB1dF9wcm90b2NvbCwiIDw8IGVuZGw7Ci0gICAgYXJnc19pbmRlbnQgPSBpbmRlbnQoKSArIHN0cmluZygzOSwgJyAnKTsKLSAgICBmX3NlcnZpY2VfIDw8IGFyZ3NfaW5kZW50IDw8ICJcIiIgPDwgc2VydmljZV9mdW5jdGlvbl9uYW1lIDw8ICJcIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKLSAgICAgICAgICAgICAgIDw8ICJUX0VYQ0VQVElPTiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgInNlcXVlbmNlX2lkLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAotICAgICAgICAgICAgICAgPDwgImVycm9yKSAhPSAtMSkgJiYiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgIDw8ICIgKHRocmlmdF9zdHJ1Y3Rfd3JpdGUgKFRIUklGVF9TVFJVQ1QgKHhjZXB0aW9uKSwiIDw8IGVuZGw7Ci0gICAgYXJnc19pbmRlbnQgPSBpbmRlbnQoKSArIHN0cmluZygyMywgJyAnKTsKLSAgICBmX3NlcnZpY2VfIDw8IGFyZ3NfaW5kZW50IDw8ICJvdXRwdXRfcHJvdG9jb2wsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJlcnJvcikgIT0gLTEpKTsiCi0gICAgICAgICAgICAgICA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF91bnJlZiAoeGNlcHRpb24pOyIgPDwgZW5kbDsKLQotICAgIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotICAgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICB9Ci0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgICAvLyBEZWxsb2NhdGUgb3IgdW5yZWYgcmV0cmlldmVkIGFyZ3VtZW50IHZhbHVlcyBhcyBuZWNlc3NhcnkKLSAgICBmb3IgKGFyZ19pdGVyID0gYXJncy5iZWdpbigpOyBhcmdfaXRlciAhPSBhcmdzLmVuZCgpOyArK2FyZ19pdGVyKSB7Ci0gICAgICBzdHJpbmcgYXJnX25hbWUgPSAoKmFyZ19pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgIHRfdHlwZSogYXJnX3R5cGUgPSBnZXRfdHJ1ZV90eXBlKCgqYXJnX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLQotICAgICAgaWYgKGFyZ190eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgICB0X2Jhc2VfdHlwZSogYmFzZV90eXBlID0gKCh0X2Jhc2VfdHlwZSopYXJnX3R5cGUpOwotCi0gICAgICAgIGlmIChiYXNlX3R5cGUtPmdldF9iYXNlKCkgPT0gdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HKSB7Ci0gICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgYXJnX25hbWUgPDwgIiAhPSBOVUxMKSIgPDwgZW5kbDsKLSAgICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgICBpZiAoYmFzZV90eXBlLT5pc19iaW5hcnkoKSkgewotICAgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19ieXRlX2FycmF5X3VucmVmICgiIDw8IGFyZ19uYW1lIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19mcmVlICgiIDw8IGFyZ19uYW1lIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmIChhcmdfdHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgYXJnX25hbWUgPDwgIiAhPSBOVUxMKSIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0KLSAgICAgICAgaWYgKGFyZ190eXBlLT5pc19saXN0KCkpIHsKLSAgICAgICAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9saXN0KilhcmdfdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLQotICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gICAgICAgICAgaWYgKChlbGVtX3R5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICFlbGVtX3R5cGUtPmlzX3N0cmluZygpKQotICAgICAgICAgICAgICB8fCBlbGVtX3R5cGUtPmlzX2VudW0oKSkgewotICAgICAgICAgICAgZl9zZXJ2aWNlXyA8PCAiZ19hcnJheV91bnJlZiI7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZfc2VydmljZV8gPDwgImdfcHRyX2FycmF5X3VucmVmIjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZl9zZXJ2aWNlXyA8PCAiICgiIDw8IGFyZ19uYW1lIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgICAgfSBlbHNlIGlmIChhcmdfdHlwZS0+aXNfbWFwKCkgfHwgYXJnX3R5cGUtPmlzX3NldCgpKSB7Ci0gICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19oYXNoX3RhYmxlX3VucmVmICgiIDw8IGFyZ19uYW1lIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgICAgfQotCi0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICB9IGVsc2UgaWYgKGFyZ190eXBlLT5pc19zdHJ1Y3QoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAoIiA8PCBhcmdfbmFtZSA8PCAiICE9IE5VTEwpIiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19vYmplY3RfdW5yZWYgKCIgPDwgYXJnX25hbWUgPDwgIik7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgfQotICAgIH0KLQotICAgIGlmICghKCpmdW5jdGlvbl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X3VucmVmIChyZXN1bHRfc3RydWN0KTsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgICA8PCAiaWYgKHJlc3VsdCA9PSBUUlVFKSIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0ID0iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIigodGhyaWZ0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfZW5kICIKLSAgICAgICAgICAgICAgICAgPDwgIihvdXRwdXRfcHJvdG9jb2wsIGVycm9yKSAhPSAtMSkgJiYiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICAgPDwgIiAodGhyaWZ0X3RyYW5zcG9ydF93cml0ZV9lbmQgKHRyYW5zcG9ydCwgZXJyb3IpICIKLSAgICAgICAgICAgICAgICAgPDwgIiE9IEZBTFNFKSAmJiIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgICA8PCAiICh0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIGVycm9yKSAiCi0gICAgICAgICAgICAgICAgIDw8ICIhPSBGQUxTRSkpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgIH0KLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImVsc2UiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0ID0gRkFMU0U7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgPDwgImdfb2JqZWN0X3VucmVmIChhcmdzKTsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHJlc3VsdDsiIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLQotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzb3IncyBkaXNwYXRjaF9jYWxsIGltcGxlbWVudGF0aW9uCi0gIGZ1bmN0aW9uX25hbWUgPSBjbGFzc19uYW1lX2xjICsgIl9kaXNwYXRjaF9jYWxsIjsKLSAgYXJnc19pbmRlbnQgPSBpbmRlbnQoKSArIHN0cmluZyhmdW5jdGlvbl9uYW1lLmxlbmd0aCgpICsgMiwgJyAnKTsKLSAgZl9zZXJ2aWNlXyA8PCAic3RhdGljIGdib29sZWFuIiA8PCBlbmRsIDw8IGZ1bmN0aW9uX25hbWUKLSAgICAgICAgICAgICA8PCAiIChUaHJpZnREaXNwYXRjaFByb2Nlc3NvciAqZGlzcGF0Y2hfcHJvY2Vzc29yLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAotICAgICAgICAgICAgIDw8ICJUaHJpZnRQcm90b2NvbCAqaW5wdXRfcHJvdG9jb2wsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50Ci0gICAgICAgICAgICAgPDwgIlRocmlmdFByb3RvY29sICpvdXRwdXRfcHJvdG9jb2wsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJnY2hhciAqbWV0aG9kX25hbWUsIgotICAgICAgICAgICAgIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgImdpbnQzMiBzZXF1ZW5jZV9pZCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKLSAgICAgICAgICAgICA8PCAiR0Vycm9yICoqZXJyb3IpIiA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBjbGFzc19uYW1lX2xjIDw8ICJfcHJvY2Vzc19mdW5jdGlvbl9kZWYgKiIKLSAgICAgICAgICAgICA8PCAicHJvY2Vzc19mdW5jdGlvbl9kZWY7IiA8PCBlbmRsOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnYm9vbGVhbiBkaXNwYXRjaF9yZXN1bHQgPSBGQUxTRTsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgIDw8IGNsYXNzX25hbWUgPDwgIiAqc2VsZiA9ICIgPDwgY2xhc3NfbmFtZV91YyA8PCAiIChkaXNwYXRjaF9wcm9jZXNzb3IpOyIgPDwgZW5kbDsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBwYXJlbnRfY2xhc3NfbmFtZSA8PCAiQ2xhc3MgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIqcGFyZW50X2NsYXNzID0iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX3R5cGVfY2xhc3NfcGVla19wYXJlbnQgKCIgPDwgY2xhc3NfbmFtZV91YyA8PCAiX0dFVF9DTEFTUyAoc2VsZikpOyIKLSAgICAgICAgICAgICA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8IGVuZGwKLSAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAicHJvY2Vzc19mdW5jdGlvbl9kZWYgPSAiCi0gICAgICAgICAgICAgPDwgImdfaGFzaF90YWJsZV9sb29rdXAgKHNlbGYtPnByb2Nlc3NfbWFwLCBtZXRob2RfbmFtZSk7IiA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmIChwcm9jZXNzX2Z1bmN0aW9uX2RlZiAhPSBOVUxMKSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gIGFyZ3NfaW5kZW50ID0gaW5kZW50KCkgKyBzdHJpbmcoNTMsICcgJyk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImRpc3BhdGNoX3Jlc3VsdCA9ICIKLSAgICAgICAgICAgICA8PCAiKCpwcm9jZXNzX2Z1bmN0aW9uX2RlZi0+ZnVuY3Rpb24pIChzZWxmLCIgPDwgZW5kbAotICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8ICJzZXF1ZW5jZV9pZCwiIDw8IGVuZGwKLSAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAiaW5wdXRfcHJvdG9jb2wsIiA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgIm91dHB1dF9wcm90b2NvbCwiIDw8IGVuZGwKLSAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAiZXJyb3IpOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZWxzZSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgLy8gTWV0aG9kIG5hbWUgbm90IHJlY29nbml6ZWQ7IGNoYWluIHVwIHRvIG91ciBwYXJlbnQgcHJvY2Vzc29yLS0tbm90ZSB0aGUKLSAgLy8gdG9wLW1vc3QgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QsIGluIFRocmlmdERpc3BhdGNoUHJvY2Vzc29yIGl0c2VsZiwKLSAgLy8gd2lsbCByZXR1cm4gYW4gYXBwbGljYXRpb24gZXhjZXB0aW9uIHRvIHRoZSBjYWxsZXIgaWYgbm8gY2xhc3MgaW4gdGhlCi0gIC8vIGhpZXJhcmNoeSByZWNvZ25pemVzIHRoZSBtZXRob2QgbmFtZQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkaXNwYXRjaF9yZXN1bHQgPSBwYXJlbnRfY2xhc3MtPmRpc3BhdGNoX2NhbGwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoZGlzcGF0Y2hfcHJvY2Vzc29yLCIgPDwgZW5kbDsKLSAgYXJnc19pbmRlbnQgPSBpbmRlbnQoKSArIHN0cmluZyg0NywgJyAnKTsKLSAgZl9zZXJ2aWNlXyA8PCBhcmdzX2luZGVudCA8PCAiaW5wdXRfcHJvdG9jb2wsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJvdXRwdXRfcHJvdG9jb2wsIgotICAgICAgICAgICAgIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIm1ldGhvZF9uYW1lLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAic2VxdWVuY2VfaWQsIgotICAgICAgICAgICAgIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgImVycm9yKTsiIDw8IGVuZGw7Ci0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGRpc3BhdGNoX3Jlc3VsdDsiIDw8IGVuZGw7Ci0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2Vzc29yJ3MgcHJvcGVydHkgc2V0dGVyCi0gIGZ1bmN0aW9uX25hbWUgPSBjbGFzc19uYW1lX2xjICsgIl9zZXRfcHJvcGVydHkiOwotICBhcmdzX2luZGVudCA9IHN0cmluZyhmdW5jdGlvbl9uYW1lLmxlbmd0aCgpICsgMiwgJyAnKTsKLSAgZl9zZXJ2aWNlXyA8PCAic3RhdGljIHZvaWQiIDw8IGVuZGwgPDwgZnVuY3Rpb25fbmFtZSA8PCAiIChHT2JqZWN0ICpvYmplY3QsIiA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgImd1aW50IHByb3BlcnR5X2lkLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiY29uc3QgR1ZhbHVlICp2YWx1ZSwiCi0gICAgICAgICAgICAgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiR1BhcmFtU3BlYyAqcHNwZWMpIiA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBjbGFzc19uYW1lIDw8ICIgKnNlbGYgPSAiIDw8IGNsYXNzX25hbWVfdWMgPDwgIiAob2JqZWN0KTsiIDw8IGVuZGwKLSAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJzd2l0Y2ggKHByb3BlcnR5X2lkKSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImNhc2UgUFJPUF8iIDw8IGNsYXNzX25hbWVfdWMgPDwgIl9IQU5ETEVSOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChzZWxmLT5oYW5kbGVyICE9IE5VTEwpIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19vYmplY3RfdW5yZWYgKHNlbGYtPmhhbmRsZXIpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAic2VsZi0+aGFuZGxlciA9IGdfdmFsdWVfZ2V0X29iamVjdCAodmFsdWUpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgIDw8ICJnX29iamVjdF9yZWYgKHNlbGYtPmhhbmRsZXIpOyIgPDwgZW5kbDsKLSAgaWYgKGV4dGVuZHNfc2VydmljZSkgewotICAgIC8vIENoYWluIHVwIHRvIHNldCB0aGUgaGFuZGxlciBpbiBldmVyeSBzdXBlcmNsYXNzIGFzIHdlbGwKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIkdfT0JKRUNUX0NMQVNTICgiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9wYXJlbnRfY2xhc3MpLT4iCi0gICAgICAgICAgICAgICA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInNldF9wcm9wZXJ0eSAob2JqZWN0LCBwcm9wZXJ0eV9pZCwgdmFsdWUsIHBzcGVjKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7IgotICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHByb2Nlc3NvcidzIHByb3BlcnR5IGdldHRlcgotICBmdW5jdGlvbl9uYW1lID0gY2xhc3NfbmFtZV9sYyArICJfZ2V0X3Byb3BlcnR5IjsKLSAgYXJnc19pbmRlbnQgPSBzdHJpbmcoZnVuY3Rpb25fbmFtZS5sZW5ndGgoKSArIDIsICcgJyk7Ci0gIGZfc2VydmljZV8gPDwgInN0YXRpYyB2b2lkIiA8PCBlbmRsIDw8IGZ1bmN0aW9uX25hbWUgPDwgIiAoR09iamVjdCAqb2JqZWN0LCIgPDwgZW5kbAotICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8ICJndWludCBwcm9wZXJ0eV9pZCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIkdWYWx1ZSAqdmFsdWUsIgotICAgICAgICAgICAgIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIkdQYXJhbVNwZWMgKnBzcGVjKSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgY2xhc3NfbmFtZSA8PCAiICpzZWxmID0gIiA8PCBjbGFzc19uYW1lX3VjIDw8ICIgKG9iamVjdCk7IiA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAic3dpdGNoIChwcm9wZXJ0eV9pZCkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJjYXNlIFBST1BfIiA8PCBjbGFzc19uYW1lX3VjIDw8ICJfSEFORExFUjoiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX3ZhbHVlX3NldF9vYmplY3QgKHZhbHVlLCBzZWxmLT5oYW5kbGVyKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICA8PCAiYnJlYWs7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIkdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wZXJ0eV9pZCwgcHNwZWMpOyIKLSAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0b3IgdGhlIHByb2Nlc3NvcidzIGRpc3Bvc2UgZnVuY3Rpb24KLSAgZl9zZXJ2aWNlXyA8PCAic3RhdGljIHZvaWQiIDw8IGVuZGwgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX2Rpc3Bvc2UgKEdPYmplY3QgKmdvYmplY3QpIiA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBjbGFzc19uYW1lIDw8ICIgKnNlbGYgPSAiIDw8IGNsYXNzX25hbWVfdWMgPDwgIiAoZ29iamVjdCk7IiA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgKHNlbGYtPmhhbmRsZXIgIT0gTlVMTCkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF91bnJlZiAoc2VsZi0+aGFuZGxlcik7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgPDwgInNlbGYtPmhhbmRsZXIgPSBOVUxMOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJHX09CSkVDVF9DTEFTUyAoIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfcGFyZW50X2NsYXNzKSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItPmRpc3Bvc2UgKGdvYmplY3QpOyIKLSAgICAgICAgICAgICA8PCBlbmRsOwotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgcHJvY2Vzc29yIGZpbmFsaXplIGZ1bmN0aW9uCi0gIGZfc2VydmljZV8gPDwgInN0YXRpYyB2b2lkIiA8PCBlbmRsIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9maW5hbGl6ZSAoR09iamVjdCAqZ29iamVjdCkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJQcm9jZXNzb3IgKnNlbGYgPSAiIDw8IHRoaXMtPm5zcGFjZV91YwotICAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX1BST0NFU1NPUiAoZ29iamVjdCk7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICA8PCAiZ19oYXNoX3RhYmxlX2Rlc3Ryb3kgKHNlbGYtPnByb2Nlc3NfbWFwKTsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgIDw8ICJHX09CSkVDVF9DTEFTUyAoIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfcGFyZW50X2NsYXNzKSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLT5maW5hbGl6ZSAoZ29iamVjdCk7IiA8PCBlbmRsOwotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgcHJvY2Vzc29yIGluc3RhbmNlIGluaXRpYWxpemVyCi0gIGZfc2VydmljZV8gPDwgInN0YXRpYyB2b2lkIiA8PCBlbmRsIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9pbml0ICgiIDw8IGNsYXNzX25hbWUgPDwgIiAqc2VsZikiCi0gICAgICAgICAgICAgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gIGlmIChmdW5jdGlvbnMuc2l6ZSgpID4gMCkgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImd1aW50IGluZGV4OyIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgfQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzZWxmLT5oYW5kbGVyID0gTlVMTDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICA8PCAic2VsZi0+cHJvY2Vzc19tYXAgPSAiCi0gICAgICAgICAgICAgICAgImdfaGFzaF90YWJsZV9uZXcgKGdfc3RyX2hhc2gsIGdfc3RyX2VxdWFsKTsiIDw8IGVuZGw7Ci0gIGlmIChmdW5jdGlvbnMuc2l6ZSgpID4gMCkgewotICAgIGFyZ3NfaW5kZW50ID0gc3RyaW5nKDIxLCAnICcpOwotICAgIGZfc2VydmljZV8gPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImZvciAoaW5kZXggPSAwOyBpbmRleCA8ICIKLSAgICAgICAgICAgICAgIDw8IGZ1bmN0aW9ucy5zaXplKCkgPDwgIjsgaW5kZXggKz0gMSkiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19oYXNoX3RhYmxlX2luc2VydCAoc2VsZi0+cHJvY2Vzc19tYXAsIiA8PCBlbmRsCi0gICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBhcmdzX2luZGVudAotICAgICAgICAgICAgICAgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX3Byb2Nlc3NfZnVuY3Rpb25fZGVmc1tpbmRleF0ubmFtZSwiIDw8IGVuZGwKLSAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGFyZ3NfaW5kZW50Ci0gICAgICAgICAgICAgICA8PCAiJiIgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX3Byb2Nlc3NfZnVuY3Rpb25fZGVmc1tpbmRleF0iIDw8ICIpOyIKLSAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgcHJvY2Vzc29yIGNsYXNzIGluaXRpYWxpemVyCi0gIGZfc2VydmljZV8gPDwgInN0YXRpYyB2b2lkIiA8PCBlbmRsIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9jbGFzc19pbml0ICgiIDw8IGNsYXNzX25hbWUKLSAgICAgICAgICAgICA8PCAiQ2xhc3MgKmNscykiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoY2xzKTsiIDw8IGVuZGwKLSAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiVGhyaWZ0RGlzcGF0Y2hQcm9jZXNzb3JDbGFzcyAqZGlzcGF0Y2hfcHJvY2Vzc29yX2NsYXNzID0iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJUSFJJRlRfRElTUEFUQ0hfUFJPQ0VTU09SX0NMQVNTIChjbHMpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiR1BhcmFtU3BlYyAqcGFyYW1fc3BlYzsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgIDw8ICJnb2JqZWN0X2NsYXNzLT5kaXNwb3NlID0gIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfZGlzcG9zZTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICA8PCAiZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSAiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9maW5hbGl6ZTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICA8PCAiZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfc2V0X3Byb3BlcnR5OyIgPDwgZW5kbAotICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSAiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9nZXRfcHJvcGVydHk7IgotICAgICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgIDw8ICJkaXNwYXRjaF9wcm9jZXNzb3JfY2xhc3MtPmRpc3BhdGNoX2NhbGwgPSAiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9kaXNwYXRjaF9jYWxsOyIKLSAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJjbHMtPmRpc3BhdGNoX2NhbGwgPSAiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9kaXNwYXRjaF9jYWxsOyIKLSAgICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfb2JqZWN0IChcImhhbmRsZXJcIiwiCi0gICAgICAgICAgICAgPDwgZW5kbDsKLSAgYXJnc19pbmRlbnQgPSBpbmRlbnQoKSArIHN0cmluZygzNCwgJyAnKTsKLSAgZl9zZXJ2aWNlXyA8PCBhcmdzX2luZGVudCA8PCAiXCJTZXJ2aWNlIGhhbmRsZXIgaW1wbGVtZW50YXRpb25cIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKLSAgICAgICAgICAgICA8PCAiXCJUaGUgc2VydmljZSBoYW5kbGVyIGltcGxlbWVudGF0aW9uIFwiIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50Ci0gICAgICAgICAgICAgPDwgIlwidG8gd2hpY2ggbWV0aG9kIGNhbGxzIGFyZSBkaXNwYXRjaGVkLlwiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAotICAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV91YyArICJUWVBFXyIgKyBzZXJ2aWNlX25hbWVfdWMgKyAiX0hBTkRMRVIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50Ci0gICAgICAgICAgICAgPDwgIkdfUEFSQU1fUkVBRFdSSVRFKTsiIDw8IGVuZGw7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIiA8PCBlbmRsOwotICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgc3RyaW5nKDMzLCAnICcpOwotICBmX3NlcnZpY2VfIDw8IGFyZ3NfaW5kZW50IDw8ICJQUk9QXyIgPDwgY2xhc3NfbmFtZV91YyA8PCAiX0hBTkRMRVIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50Ci0gICAgICAgICAgICAgPDwgInBhcmFtX3NwZWMpOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgQyBjb2RlIHRoYXQgcmVwcmVzZW50cyBhIFRocmlmdCBzZXJ2aWNlIHNlcnZlci4KLSAqLwotdm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgKHZvaWQpdHNlcnZpY2U7Ci0gIC8vIEdlbmVyYXRlIHRoZSBzZXJ2aWNlJ3MgaGFuZGxlciBjbGFzcwotICBnZW5lcmF0ZV9zZXJ2aWNlX2hhbmRsZXIodHNlcnZpY2UpOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBzZXJ2aWNlJ3MgcHJvY2Vzc29yIGNsYXNzCi0gIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRzZXJ2aWNlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgQyBjb2RlIHRvIHJlcHJlc2VudCBhIFRIcmlmdCBzdHJ1Y3R1cmUgYXMgYSBHT2JqZWN0LgotICovCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2JqZWN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgc3RyaW5nIG5hbWVfdSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhuYW1lKTsKLSAgc3RyaW5nIG5hbWVfdWMgPSB0b191cHBlcl9jYXNlKG5hbWVfdSk7Ci0KLSAgc3RyaW5nIGNsYXNzX25hbWUgPSB0aGlzLT5uc3BhY2UgKyBuYW1lOwotICBzdHJpbmcgY2xhc3NfbmFtZV9sYyA9IHRvX2xvd2VyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKGNsYXNzX25hbWUpKTsKLSAgc3RyaW5nIGNsYXNzX25hbWVfdWMgPSB0b191cHBlcl9jYXNlKGNsYXNzX25hbWVfbGMpOwotCi0gIHN0cmluZyBmdW5jdGlvbl9uYW1lOwotICBzdHJpbmcgYXJnc19pbmRlbnQ7Ci0KLSAgLy8gd3JpdGUgdGhlIGluc3RhbmNlIGRlZmluaXRpb24KLSAgZl90eXBlc18gPDwgInN0cnVjdCBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCBlbmRsIDw8ICJ7ICIgPDwgZW5kbAotICAgICAgICAgICA8PCAiICBUaHJpZnRTdHJ1Y3QgcGFyZW50OyAiIDw8IGVuZGwgPDwgZW5kbCA8PCAiICAvKiBwdWJsaWMgKi8iIDw8IGVuZGw7Ci0KLSAgLy8gZm9yIGVhY2ggZmllbGQsIGFkZCBhIG1lbWJlciB2YXJpYWJsZQotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgIGZfdHlwZXNfIDw8ICIgICIgPDwgdHlwZV9uYW1lKHQpIDw8ICIgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICAgIGZfdHlwZXNfIDw8ICIgIGdib29sZWFuIF9faXNzZXRfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgLy8gY2xvc2UgdGhlIHN0cnVjdHVyZSBkZWZpbml0aW9uIGFuZCBjcmVhdGUgYSB0eXBlZGVmCi0gIGZfdHlwZXNfIDw8ICJ9OyIgPDwgZW5kbCA8PCAidHlwZWRlZiBzdHJ1Y3QgXyIgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIiAiIDw8IHRoaXMtPm5zcGFjZQotICAgICAgICAgICA8PCBuYW1lIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gd3JpdGUgdGhlIGNsYXNzIGRlZmluaXRpb24KLSAgZl90eXBlc18gPDwgInN0cnVjdCBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiQ2xhc3MiIDw8IGVuZGwgPDwgInsiIDw8IGVuZGwKLSAgICAgICAgICAgPDwgIiAgVGhyaWZ0U3RydWN0Q2xhc3MgcGFyZW50OyIgPDwgZW5kbCA8PCAifTsiIDw8IGVuZGwgPDwgInR5cGVkZWYgc3RydWN0IF8iCi0gICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICJDbGFzcyAiIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICJDbGFzczsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyB3cml0ZSB0aGUgc3RhbmRhcmQgR09iamVjdCBib2lsZXJwbGF0ZQotICBmX3R5cGVzXyA8PCAiR1R5cGUgIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV91IDw8ICJfZ2V0X3R5cGUgKHZvaWQpOyIgPDwgZW5kbCA8PCAiI2RlZmluZSAiCi0gICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IG5hbWVfdWMgPDwgIiAoIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV91Ci0gICAgICAgICAgIDw8ICJfZ2V0X3R5cGUoKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgbmFtZV91YwotICAgICAgICAgICA8PCAiKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIiA8PCBuYW1lX3VjCi0gICAgICAgICAgIDw8ICIsICIgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIikpIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjCi0gICAgICAgICAgIDw8IG5hbWVfdWMgPDwgIl9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIl9UWVBFXyIKLSAgICAgICAgICAgPDwgbmFtZV91YyA8PCAiLCAiIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICJDbGFzcykpIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIKLSAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJJU18iIDw8IG5hbWVfdWMgPDwgIihvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksICIKLSAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgbmFtZV91YyA8PCAiKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMKLSAgICAgICAgICAgPDwgIklTXyIgPDwgbmFtZV91YyA8PCAiX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCAiIDw8IHRoaXMtPm5zcGFjZV91YwotICAgICAgICAgICA8PCAiVFlQRV8iIDw8IG5hbWVfdWMgPDwgIikpIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IG5hbWVfdWMKLSAgICAgICAgICAgPDwgIl9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIKLSAgICAgICAgICAgPDwgbmFtZV91YyA8PCAiLCAiIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICJDbGFzcykpIiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gc3RhcnQgd3JpdGluZyB0aGUgb2JqZWN0IGltcGxlbWVudGF0aW9uIC5jIGZpbGUKLQotICAvLyBnZW5lcmF0ZSBwcm9wZXJ0aWVzIGVudW0KLSAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgewotICAgIGZfdHlwZXNfaW1wbF8gPDwgImVudW0gXyIgPDwgY2xhc3NfbmFtZSA8PCAiUHJvcGVydGllcyIgPDwgZW5kbCA8PCAieyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJQUk9QXyIgPDwgY2xhc3NfbmFtZV91YyA8PCAiXzAiOwotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIHN0cmluZyBtZW1iZXJfbmFtZV91YwotICAgICAgICAgID0gdG9fdXBwZXJfY2FzZSh0b19sb3dlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcygoKm1faXRlciktPmdldF9uYW1lKCkpKSk7Ci0KLSAgICAgIGZfdHlwZXNfaW1wbF8gPDwgIiwiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIlBST1BfIiA8PCBjbGFzc19uYW1lX3VjIDw8ICJfIiA8PCBtZW1iZXJfbmFtZV91YzsKLSAgICB9Ci0gICAgZl90eXBlc19pbXBsXyA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl90eXBlc19pbXBsXyA8PCAifTsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotCi0gIC8vIGdlbmVyYXRlIHN0cnVjdCBJL08gbWV0aG9kcwotICBzdHJpbmcgdGhpc19nZXQgPSB0aGlzLT5uc3BhY2UgKyBuYW1lICsgIiAqIHRoaXNfb2JqZWN0ID0gIiArIHRoaXMtPm5zcGFjZV91YyArIG5hbWVfdWMKLSAgICAgICAgICAgICAgICAgICAgKyAiKG9iamVjdCk7IjsKLSAgZ2VuZXJhdGVfc3RydWN0X3JlYWRlcihmX3R5cGVzX2ltcGxfLCB0c3RydWN0LCAidGhpc19vYmplY3QtPiIsIHRoaXNfZ2V0KTsKLSAgZ2VuZXJhdGVfc3RydWN0X3dyaXRlcihmX3R5cGVzX2ltcGxfLCB0c3RydWN0LCAidGhpc19vYmplY3QtPiIsIHRoaXNfZ2V0KTsKLQotICAvLyBnZW5lcmF0ZSBwcm9wZXJ0eSBzZXR0ZXIgYW5kIGdldHRlcgotICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7Ci0gICAgLy8gZ2VuZXJhdGUgcHJvcGVydHkgc2V0dGVyCi0gICAgZnVuY3Rpb25fbmFtZSA9IGNsYXNzX25hbWVfbGMgKyAiX3NldF9wcm9wZXJ0eSI7Ci0gICAgYXJnc19pbmRlbnQgPSBzdHJpbmcoZnVuY3Rpb25fbmFtZS5sZW5ndGgoKSArIDIsICcgJyk7Ci0gICAgZl90eXBlc19pbXBsXyA8PCAic3RhdGljIHZvaWQiIDw8IGVuZGwgPDwgZnVuY3Rpb25fbmFtZSA8PCAiIChHT2JqZWN0ICpvYmplY3QsIiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAiZ3VpbnQgcHJvcGVydHlfaWQsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50Ci0gICAgICAgICAgICAgICAgICA8PCAiY29uc3QgR1ZhbHVlICp2YWx1ZSwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIkdQYXJhbVNwZWMgKnBzcGVjKSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3R5cGVzX2ltcGxfKTsKLSAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8IGNsYXNzX25hbWUgPDwgIiAqc2VsZiA9ICIgPDwgY2xhc3NfbmFtZV91YyA8PCAiIChvYmplY3QpOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAic3dpdGNoIChwcm9wZXJ0eV9pZCkiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl90eXBlc19pbXBsXyk7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgdF9maWVsZCogbWVtYmVyID0gKCptX2l0ZXIpOwotICAgICAgc3RyaW5nIG1lbWJlcl9uYW1lID0gbWVtYmVyLT5nZXRfbmFtZSgpOwotICAgICAgc3RyaW5nIG1lbWJlcl9uYW1lX3VjCi0gICAgICAgICAgPSB0b191cHBlcl9jYXNlKHRvX2xvd2VyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKG1lbWJlcl9uYW1lKSkpOwotICAgICAgdF90eXBlKiBtZW1iZXJfdHlwZSA9IGdldF90cnVlX3R5cGUobWVtYmVyLT5nZXRfdHlwZSgpKTsKLQotICAgICAgc3RyaW5nIHByb3BlcnR5X2lkZW50aWZpZXIgPSAiUFJPUF8iICsgY2xhc3NfbmFtZV91YyArICJfIiArIG1lbWJlcl9uYW1lX3VjOwotCi0gICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJjYXNlICIgPDwgcHJvcGVydHlfaWRlbnRpZmllciArICI6IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0KLSAgICAgIGlmIChtZW1iZXJfdHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgICAgdF9iYXNlX3R5cGUqIGJhc2VfdHlwZSA9ICgodF9iYXNlX3R5cGUqKW1lbWJlcl90eXBlKTsKLSAgICAgICAgc3RyaW5nIGFzc2lnbl9mdW5jdGlvbl9uYW1lOwotCi0gICAgICAgIGlmIChiYXNlX3R5cGUtPmdldF9iYXNlKCkgPT0gdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HKSB7Ci0gICAgICAgICAgc3RyaW5nIHJlbGVhc2VfZnVuY3Rpb25fbmFtZTsKLQotICAgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImlmIChzZWxmLT4iIDw8IG1lbWJlcl9uYW1lIDw8ICIgIT0gTlVMTCkiIDw8IGVuZGw7Ci0gICAgICAgICAgaW5kZW50X3VwKCk7Ci0KLSAgICAgICAgICBpZiAoYmFzZV90eXBlLT5pc19iaW5hcnkoKSkgewotICAgICAgICAgICAgcmVsZWFzZV9mdW5jdGlvbl9uYW1lID0gImdfYnl0ZV9hcnJheV91bnJlZiI7Ci0gICAgICAgICAgICBhc3NpZ25fZnVuY3Rpb25fbmFtZSA9ICJnX3ZhbHVlX2R1cF9ib3hlZCI7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlbGVhc2VfZnVuY3Rpb25fbmFtZSA9ICJnX2ZyZWUiOwotICAgICAgICAgICAgYXNzaWduX2Z1bmN0aW9uX25hbWUgPSAiZ192YWx1ZV9kdXBfc3RyaW5nIjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8IHJlbGVhc2VfZnVuY3Rpb25fbmFtZSA8PCAiIChzZWxmLT4iIDw8IG1lbWJlcl9uYW1lIDw8ICIpOyIKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBzd2l0Y2ggKGJhc2VfdHlwZS0+Z2V0X2Jhc2UoKSkgewotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgICAgIGFzc2lnbl9mdW5jdGlvbl9uYW1lID0gImdfdmFsdWVfZ2V0X2Jvb2xlYW4iOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgICAgICBhc3NpZ25fZnVuY3Rpb25fbmFtZSA9ICJnX3ZhbHVlX2dldF9pbnQiOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgICAgIGFzc2lnbl9mdW5jdGlvbl9uYW1lID0gImdfdmFsdWVfZ2V0X2ludDY0IjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgICAgICBhc3NpZ25fZnVuY3Rpb25fbmFtZSA9ICJnX3ZhbHVlX2dldF9kb3VibGUiOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiAiCi0gICAgICAgICAgICAgICAgICAidW5yZWNvZ25pemVkIGJhc2UgdHlwZSBcIiIgKyBiYXNlX3R5cGUtPmdldF9uYW1lKCkgKyAiXCIgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvciBzdHJ1Y3QgbWVtYmVyIFwiIgotICAgICAgICAgICAgICAgICsgbWVtYmVyX25hbWUgKyAiXCIiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAic2VsZi0+IiA8PCBtZW1iZXJfbmFtZSA8PCAiID0gIiA8PCBhc3NpZ25fZnVuY3Rpb25fbmFtZQotICAgICAgICAgICAgICAgICAgICAgIDw8ICIgKHZhbHVlKTsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgaWYgKG1lbWJlcl90eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAic2VsZi0+IiA8PCBtZW1iZXJfbmFtZSA8PCAiID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7IgotICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgaWYgKG1lbWJlcl90eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgICBzdHJpbmcgcmVsZWFzZV9mdW5jdGlvbl9uYW1lOwotICAgICAgICBzdHJpbmcgYXNzaWduX2Z1bmN0aW9uX25hbWU7Ci0KLSAgICAgICAgaWYgKG1lbWJlcl90eXBlLT5pc19saXN0KCkpIHsKLSAgICAgICAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9saXN0KiltZW1iZXJfdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLQotICAgICAgICAgIC8vIExpc3RzIG9mIGJhc2UgdHlwZXMgb3RoZXIgdGhhbiBzdHJpbmdzIGFyZSByZXByZXNlbnRlZCBhcyBHQXJyYXlzOwotICAgICAgICAgIC8vIGFsbCBvdGhlcnMgYXMgR1B0ckFycmF5cwotICAgICAgICAgIGlmIChlbGVtX3R5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICFlbGVtX3R5cGUtPmlzX3N0cmluZygpKSB7Ci0gICAgICAgICAgICByZWxlYXNlX2Z1bmN0aW9uX25hbWUgPSAiZ19hcnJheV91bnJlZiI7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlbGVhc2VfZnVuY3Rpb25fbmFtZSA9ICJnX3B0cl9hcnJheV91bnJlZiI7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgYXNzaWduX2Z1bmN0aW9uX25hbWUgPSAiZ192YWx1ZV9kdXBfYm94ZWQiOwotICAgICAgICB9IGVsc2UgaWYgKG1lbWJlcl90eXBlLT5pc19zZXQoKSB8fCBtZW1iZXJfdHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgICAgICByZWxlYXNlX2Z1bmN0aW9uX25hbWUgPSAiZ19oYXNoX3RhYmxlX3VucmVmIjsKLSAgICAgICAgICBhc3NpZ25fZnVuY3Rpb25fbmFtZSA9ICJnX3ZhbHVlX2R1cF9ib3hlZCI7Ci0gICAgICAgIH0KLQotICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJpZiAoc2VsZi0+IiA8PCBtZW1iZXJfbmFtZSA8PCAiICE9IE5VTEwpIiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCByZWxlYXNlX2Z1bmN0aW9uX25hbWUgPDwgIiAoc2VsZi0+IiA8PCBtZW1iZXJfbmFtZSA8PCAiKTsiCi0gICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAic2VsZi0+IiA8PCBtZW1iZXJfbmFtZSA8PCAiID0gIiA8PCBhc3NpZ25fZnVuY3Rpb25fbmFtZQotICAgICAgICAgICAgICAgICAgICAgIDw8ICIgKHZhbHVlKTsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgaWYgKG1lbWJlcl90eXBlLT5pc19zdHJ1Y3QoKSB8fCBtZW1iZXJfdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJpZiAoc2VsZi0+IiA8PCBtZW1iZXJfbmFtZSA8PCAiICE9IE5VTEwpIiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiZ19vYmplY3RfdW5yZWYgKHNlbGYtPiIgPDwgbWVtYmVyX25hbWUgPDwgIik7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJzZWxmLT4iIDw8IG1lbWJlcl9uYW1lIDw8ICIgPSBnX3ZhbHVlX2R1cF9vYmplY3QgKHZhbHVlKTsiCi0gICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgaWYgKG1lbWJlci0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAic2VsZi0+X19pc3NldF8iIDw8IG1lbWJlcl9uYW1lIDw8ICIgPSBUUlVFOyIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgIH0KLSAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcGVydHlfaWQsIHBzcGVjKTsiCi0gICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBzY29wZV9kb3duKGZfdHlwZXNfaW1wbF8pOwotICAgIHNjb3BlX2Rvd24oZl90eXBlc19pbXBsXyk7Ci0gICAgZl90eXBlc19pbXBsXyA8PCBlbmRsOwotCi0gICAgLy8gZ2VuZXJhdGUgcHJvcGVydHkgZ2V0dGVyCi0gICAgZnVuY3Rpb25fbmFtZSA9IGNsYXNzX25hbWVfbGMgKyAiX2dldF9wcm9wZXJ0eSI7Ci0gICAgYXJnc19pbmRlbnQgPSBzdHJpbmcoZnVuY3Rpb25fbmFtZS5sZW5ndGgoKSArIDIsICcgJyk7Ci0gICAgZl90eXBlc19pbXBsXyA8PCAic3RhdGljIHZvaWQiIDw8IGVuZGwgPDwgZnVuY3Rpb25fbmFtZSA8PCAiIChHT2JqZWN0ICpvYmplY3QsIiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAiZ3VpbnQgcHJvcGVydHlfaWQsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJHVmFsdWUgKnZhbHVlLCIKLSAgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIkdQYXJhbVNwZWMgKnBzcGVjKSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3R5cGVzX2ltcGxfKTsKLSAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8IGNsYXNzX25hbWUgPDwgIiAqc2VsZiA9ICIgPDwgY2xhc3NfbmFtZV91YyA8PCAiIChvYmplY3QpOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAic3dpdGNoIChwcm9wZXJ0eV9pZCkiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl90eXBlc19pbXBsXyk7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgdF9maWVsZCogbWVtYmVyID0gKCptX2l0ZXIpOwotICAgICAgc3RyaW5nIG1lbWJlcl9uYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgc3RyaW5nIG1lbWJlcl9uYW1lX3VjCi0gICAgICAgICAgPSB0b191cHBlcl9jYXNlKHRvX2xvd2VyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKG1lbWJlcl9uYW1lKSkpOwotICAgICAgdF90eXBlKiBtZW1iZXJfdHlwZSA9IGdldF90cnVlX3R5cGUobWVtYmVyLT5nZXRfdHlwZSgpKTsKLQotICAgICAgc3RyaW5nIHByb3BlcnR5X2lkZW50aWZpZXIgPSAiUFJPUF8iICsgY2xhc3NfbmFtZV91YyArICJfIiArIG1lbWJlcl9uYW1lX3VjOwotCi0gICAgICBzdHJpbmcgc2V0dGVyX2Z1bmN0aW9uX25hbWU7Ci0KLSAgICAgIGlmIChtZW1iZXJfdHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgICAgdF9iYXNlX3R5cGUqIGJhc2VfdHlwZSA9ICgodF9iYXNlX3R5cGUqKW1lbWJlcl90eXBlKTsKLQotICAgICAgICBzd2l0Y2ggKGJhc2VfdHlwZS0+Z2V0X2Jhc2UoKSkgewotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgICAgc2V0dGVyX2Z1bmN0aW9uX25hbWUgPSAiZ192YWx1ZV9zZXRfYm9vbGVhbiI7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgICAgc2V0dGVyX2Z1bmN0aW9uX25hbWUgPSAiZ192YWx1ZV9zZXRfaW50IjsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgICBzZXR0ZXJfZnVuY3Rpb25fbmFtZSA9ICJnX3ZhbHVlX3NldF9pbnQ2NCI7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgICAgc2V0dGVyX2Z1bmN0aW9uX25hbWUgPSAiZ192YWx1ZV9zZXRfZG91YmxlIjsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgICBpZiAoYmFzZV90eXBlLT5pc19iaW5hcnkoKSkgewotICAgICAgICAgICAgc2V0dGVyX2Z1bmN0aW9uX25hbWUgPSAiZ192YWx1ZV9zZXRfYm94ZWQiOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzZXR0ZXJfZnVuY3Rpb25fbmFtZSA9ICJnX3ZhbHVlX3NldF9zdHJpbmciOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogIgotICAgICAgICAgICAgICAgICJ1bnJlY29nbml6ZWQgYmFzZSB0eXBlIFwiIiArIGJhc2VfdHlwZS0+Z2V0X25hbWUoKSArICJcIiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvciBzdHJ1Y3QgbWVtYmVyIFwiIgotICAgICAgICAgICAgICArIG1lbWJlcl9uYW1lICsgIlwiIjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmIChtZW1iZXJfdHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICAgIHNldHRlcl9mdW5jdGlvbl9uYW1lID0gImdfdmFsdWVfc2V0X2ludCI7Ci0gICAgICB9IGVsc2UgaWYgKG1lbWJlcl90eXBlLT5pc19zdHJ1Y3QoKSB8fCBtZW1iZXJfdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgICAgICBzZXR0ZXJfZnVuY3Rpb25fbmFtZSA9ICJnX3ZhbHVlX3NldF9vYmplY3QiOwotICAgICAgfSBlbHNlIGlmIChtZW1iZXJfdHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICAgICAgc2V0dGVyX2Z1bmN0aW9uX25hbWUgPSAiZ192YWx1ZV9zZXRfYm94ZWQiOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiAiCi0gICAgICAgICAgICAgICJ1bnJlY29nbml6ZWQgdHlwZSBmb3Igc3RydWN0IG1lbWJlciBcIiIgKyBtZW1iZXJfbmFtZSArICJcIiI7Ci0gICAgICB9Ci0KLSAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImNhc2UgIiA8PCBwcm9wZXJ0eV9pZGVudGlmaWVyICsgIjoiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgc2V0dGVyX2Z1bmN0aW9uX25hbWUgPDwgIiAodmFsdWUsIHNlbGYtPiIgPDwgbWVtYmVyX25hbWUgPDwgIik7IgotICAgICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgfQotICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgIkdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wZXJ0eV9pZCwgcHNwZWMpOyIKLSAgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIHNjb3BlX2Rvd24oZl90eXBlc19pbXBsXyk7Ci0gICAgc2NvcGVfZG93bihmX3R5cGVzX2ltcGxfKTsKLSAgICBmX3R5cGVzX2ltcGxfIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBnZW5lcmF0ZSB0aGUgaW5zdGFuY2UgaW5pdCBmdW5jdGlvbgotCi0gIGZfdHlwZXNfaW1wbF8gPDwgInN0YXRpYyB2b2lkICIgPDwgZW5kbCA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV91IDw8ICJfaW5zdGFuY2VfaW5pdCAoIgotICAgICAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICIgKiBvYmplY3QpIiA8PCBlbmRsIDw8ICJ7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICAvLyBnZW5lcmF0ZSBkZWZhdWx0LXZhbHVlIHN0cnVjdHVyZXMgZm9yIGNvbnRhaW5lci10eXBlIG1lbWJlcnMKLSAgYm9vbCBjb25zdGFudF9kZWNsYXJhdGlvbl9vdXRwdXQgPSBmYWxzZTsKLSAgYm9vbCBzdHJpbmdfbGlzdF9jb25zdGFudF9vdXRwdXQgPSBmYWxzZTsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfZmllbGQqIG1lbWJlciA9ICptX2l0ZXI7Ci0gICAgdF9jb25zdF92YWx1ZSogbWVtYmVyX3ZhbHVlID0gbWVtYmVyLT5nZXRfdmFsdWUoKTsKLQotICAgIGlmIChtZW1iZXJfdmFsdWUgIT0gTlVMTCkgewotICAgICAgc3RyaW5nIG1lbWJlcl9uYW1lID0gbWVtYmVyLT5nZXRfbmFtZSgpOwotICAgICAgdF90eXBlKiBtZW1iZXJfdHlwZSA9IGdldF90cnVlX3R5cGUobWVtYmVyLT5nZXRfdHlwZSgpKTsKLQotICAgICAgaWYgKG1lbWJlcl90eXBlLT5pc19saXN0KCkpIHsKLSAgICAgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgbGlzdCA9IG1lbWJlcl92YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICAgICAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfbGlzdCopbWVtYmVyX3R5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0KLSAgICAgICAgLy8gR2VuZXJhdGUgYW4gYXJyYXkgd2l0aCB0aGUgbGlzdCBsaXRlcmFsCi0gICAgICAgIGluZGVudChmX3R5cGVzX2ltcGxfKSA8PCAic3RhdGljICIgPDwgdHlwZV9uYW1lKGVsZW1fdHlwZSwgZmFsc2UsIHRydWUpIDw8ICIgX19kZWZhdWx0XyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IG1lbWJlcl9uYW1lIDw8ICJbIiA8PCBsaXN0LnNpemUoKSA8PCAiXSA9ICIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgY29uc3RhbnRfbGl0ZXJhbChtZW1iZXJfdHlwZSwgbWVtYmVyX3ZhbHVlKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLQotICAgICAgICBjb25zdGFudF9kZWNsYXJhdGlvbl9vdXRwdXQgPSB0cnVlOwotCi0gICAgICAgIC8vIElmIHdlIGFyZSBnZW5lcmF0aW5nIHZhbHVlcyBmb3IgYSBwb2ludGVyIGFycmF5IChpLmUuIGEgbGlzdCBvZgotICAgICAgICAvLyBzdHJpbmdzKSwgc2V0IGEgZmxhZyBzbyB3ZSBrbm93IHRvIGFsc28gZGVjbGFyZSBhbiBpbmRleCB2YXJpYWJsZSB0bwotICAgICAgICAvLyB1c2UgaW4gcHJlLXBvcHVsYXRpbmcgdGhlIGFycmF5Ci0gICAgICAgIGlmIChlbGVtX3R5cGUtPmlzX3N0cmluZygpKSB7Ci0gICAgICAgICAgc3RyaW5nX2xpc3RfY29uc3RhbnRfb3V0cHV0ID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBUT0RPOiBIYW5kbGUgY29udGFpbmVyIHR5cGVzIG90aGVyIHRoYW4gbGlzdAotICAgIH0KLSAgfQotICBpZiAoY29uc3RhbnRfZGVjbGFyYXRpb25fb3V0cHV0KSB7Ci0gICAgaWYgKHN0cmluZ19saXN0X2NvbnN0YW50X291dHB1dCkgewotICAgICAgaW5kZW50KGZfdHlwZXNfaW1wbF8pIDw8ICJ1bnNpZ25lZCBpbnQgbGlzdF9pbmRleDsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgZl90eXBlc19pbXBsXyA8PCBlbmRsOwotICB9Ci0KLSAgLy8gc2F0aXNmeSBjb21waWxlcnMgd2l0aCAtV2FsbCB0dXJuZWQgb24KLSAgaW5kZW50KGZfdHlwZXNfaW1wbF8pIDw8ICIvKiBzYXRpc2Z5IC1XYWxsICovIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCAiVEhSSUZUX1VOVVNFRF9WQVIgKG9iamVjdCk7IiA8PCBlbmRsOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKHQtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICBzdHJpbmcgZHZhbCA9ICIgPSAiOwotICAgICAgaWYgKHQtPmlzX2VudW0oKSkgewotICAgICAgICBkdmFsICs9ICIoIiArIHR5cGVfbmFtZSh0KSArICIpIjsKLSAgICAgIH0KLSAgICAgIHRfY29uc3RfdmFsdWUqIGN2ID0gKCptX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICAgIGlmIChjdiAhPSBOVUxMKSB7Ci0gICAgICAgIGR2YWwgKz0gY29uc3RhbnRfdmFsdWUoIiIsIHQsIGN2KTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGR2YWwgKz0gdC0+aXNfc3RyaW5nKCkgPyAiTlVMTCIgOiAiMCI7Ci0gICAgICB9Ci0gICAgICBpbmRlbnQoZl90eXBlc19pbXBsXykgPDwgIm9iamVjdC0+IiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgZHZhbCA8PCAiOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKHQtPmlzX3N0cnVjdCgpKSB7Ci0gICAgICBzdHJpbmcgbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgIHN0cmluZyB0eXBlX25hbWVfdWMKLSAgICAgICAgICA9IHRvX3VwcGVyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSkpOwotICAgICAgaW5kZW50KGZfdHlwZXNfaW1wbF8pIDw8ICJvYmplY3QtPiIgPDwgbmFtZSA8PCAiID0gZ19vYmplY3RfbmV3ICgiIDw8IHRoaXMtPm5zcGFjZV91YwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJUWVBFXyIgPDwgdHlwZV9uYW1lX3VjIDw8ICIsIE5VTEwpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKHQtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICAgIHN0cmluZyBuYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgaW5kZW50KGZfdHlwZXNfaW1wbF8pIDw8ICJvYmplY3QtPiIgPDwgbmFtZSA8PCAiID0gTlVMTDsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmICh0LT5pc19jb250YWluZXIoKSkgewotICAgICAgc3RyaW5nIG5hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7Ci0gICAgICBzdHJpbmcgaW5pdF9mdW5jdGlvbjsKLSAgICAgIHRfdHlwZSogZXR5cGUgPSBOVUxMOwotCi0gICAgICBpZiAodC0+aXNfbWFwKCkpIHsKLSAgICAgICAgdF90eXBlKiBrZXkgPSAoKHRfbWFwKil0KS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgICAgIHRfdHlwZSogdmFsdWUgPSAoKHRfbWFwKil0KS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgICAgIGluaXRfZnVuY3Rpb24gPSBnZW5lcmF0ZV9uZXdfaGFzaF9mcm9tX3R5cGUoa2V5LCB2YWx1ZSk7Ci0gICAgICB9IGVsc2UgaWYgKHQtPmlzX3NldCgpKSB7Ci0gICAgICAgIGV0eXBlID0gKCh0X3NldCopdCktPmdldF9lbGVtX3R5cGUoKTsKLSAgICAgICAgaW5pdF9mdW5jdGlvbiA9IGdlbmVyYXRlX25ld19oYXNoX2Zyb21fdHlwZShldHlwZSwgTlVMTCk7Ci0gICAgICB9IGVsc2UgaWYgKHQtPmlzX2xpc3QoKSkgewotICAgICAgICBldHlwZSA9ICgodF9saXN0Kil0KS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgICAgICBpbml0X2Z1bmN0aW9uID0gZ2VuZXJhdGVfbmV3X2FycmF5X2Zyb21fdHlwZShldHlwZSk7Ci0gICAgICB9Ci0KLSAgICAgIGluZGVudChmX3R5cGVzX2ltcGxfKSA8PCAib2JqZWN0LT4iIDw8IG5hbWUgPDwgIiA9ICIgPDwgaW5pdF9mdW5jdGlvbiA8PCBlbmRsOwotCi0gICAgICAvLyBQcmUtcG9wdWxhdGUgdGhlIGNvbnRhaW5lciB3aXRoIHRoZSBzcGVjaWZpZWQgZGVmYXVsdCB2YWx1ZXMsIGlmIGFueQotICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkpIHsKLSAgICAgICAgdF9jb25zdF92YWx1ZSogbWVtYmVyX3ZhbHVlID0gKCptX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLQotICAgICAgICBpZiAodC0+aXNfbGlzdCgpKSB7Ci0gICAgICAgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgbGlzdCA9IG1lbWJlcl92YWx1ZS0+Z2V0X2xpc3QoKTsKLQotICAgICAgICAgIGlmICgoZXR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICFldHlwZS0+aXNfc3RyaW5nKCkpCi0gICAgICAgICAgICAgIHx8IGV0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgICAgICAgIGluZGVudChmX3R5cGVzX2ltcGxfKSA8PAotICAgICAgICAgICAgICAiZ19hcnJheV9hcHBlbmRfdmFscyAob2JqZWN0LT4iIDw8IG5hbWUgPDwgIiwgJl9fZGVmYXVsdF8iIDw8Ci0gICAgICAgICAgICAgIG5hbWUgPDwgIiwgIiA8PCBsaXN0LnNpemUoKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgaW5kZW50KGZfdHlwZXNfaW1wbF8pIDw8Ci0gICAgICAgICAgICAgICJmb3IgKGxpc3RfaW5kZXggPSAwOyBsaXN0X2luZGV4IDwgIiA8PCBsaXN0LnNpemUoKSA8PCAiOyAiIDw8Ci0gICAgICAgICAgICAgICJsaXN0X2luZGV4ICs9IDEpIiA8PCBlbmRsOwotICAgICAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgICAgICBpbmRlbnQoZl90eXBlc19pbXBsXykgPDwKLSAgICAgICAgICAgICAgImdfcHRyX2FycmF5X2FkZCAob2JqZWN0LT4iIDw8IG5hbWUgPDwgIiwiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgc3RyaW5nKDE3LCAnICcpIDw8ICJnX3N0cmR1cCAoX19kZWZhdWx0XyIgPDwKLSAgICAgICAgICAgICAgbmFtZSA8PCAiW2xpc3RfaW5kZXhdKSk7IiA8PCBlbmRsOwotICAgICAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUT0RPOiBIYW5kbGUgY29udGFpbmVyIHR5cGVzIG90aGVyIHRoYW4gbGlzdAotICAgICAgfQotICAgIH0KLQotICAgIC8qIGlmIG5vdCByZXF1aXJlZCwgaW5pdGlhbGl6ZSB0aGUgX19pc3NldCB2YXJpYWJsZSAqLwotICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICBpbmRlbnQoZl90eXBlc19pbXBsXykgPDwgIm9iamVjdC0+X19pc3NldF8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gRkFMU0U7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfdHlwZXNfaW1wbF8gPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvKiBjcmVhdGUgdGhlIGRlc3RydWN0b3IgKi8KLSAgZl90eXBlc19pbXBsXyA8PCAic3RhdGljIHZvaWQgIiA8PCBlbmRsIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX3UKLSAgICAgICAgICAgICAgICA8PCAiX2ZpbmFsaXplIChHT2JqZWN0ICpvYmplY3QpIiA8PCBlbmRsIDw8ICJ7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICIgKnRvYmplY3QgPSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBuYW1lX3VjCi0gICAgICAgICAgICAgICAgPDwgIiAob2JqZWN0KTsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICIvKiBzYXRpc2Z5IC1XYWxsIGluIGNhc2Ugd2UgZG9uJ3QgdXNlIHRvYmplY3QgKi8iIDw8IGVuZGwKLSAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiVEhSSUZUX1VOVVNFRF9WQVIgKHRvYmplY3QpOyIgPDwgZW5kbDsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgIGlmICh0LT5pc19jb250YWluZXIoKSkgewotICAgICAgc3RyaW5nIG5hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7Ci0gICAgICBpZiAodC0+aXNfbWFwKCkgfHwgdC0+aXNfc2V0KCkpIHsKLSAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHRvYmplY3QtPiIgPDwgbmFtZSA8PCAiICE9IE5VTEwpIiA8PCBlbmRsOwotICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiZ19oYXNoX3RhYmxlX2Rlc3Ryb3kgKHRvYmplY3QtPiIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInRvYmplY3QtPiIgPDwgbmFtZSA8PCAiID0gTlVMTDsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgaWYgKHQtPmlzX2xpc3QoKSkgewotICAgICAgICB0X3R5cGUqIGV0eXBlID0gKCh0X2xpc3QqKXQpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgICAgIHN0cmluZyBkZXN0cnVjdG9yX2Z1bmN0aW9uID0gImdfcHRyX2FycmF5X3VucmVmIjsKLQotICAgICAgICBpZiAoZXR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKWV0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3QgZGV0ZXJtaW5lIGFycmF5IHR5cGUiOwotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgICAgICBkZXN0cnVjdG9yX2Z1bmN0aW9uID0gImdfYXJyYXlfdW5yZWYiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBhcnJheSBpbmZvIGZvciB0eXBlIjsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJpZiAodG9iamVjdC0+IiA8PCBuYW1lIDw8ICIgIT0gTlVMTCkiIDw8IGVuZGw7Ci0gICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8IGRlc3RydWN0b3JfZnVuY3Rpb24gPDwgIiAodG9iamVjdC0+IiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAidG9iamVjdC0+IiA8PCBuYW1lIDw8ICIgPSBOVUxMOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHQtPmlzX3N0cnVjdCgpIHx8IHQtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICAgIHN0cmluZyBuYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgLy8gVE9ETzogZ19jbGVhcl9vYmplY3QgbmVlZHMgZ2xpYiA+PSAyLjI4Ci0gICAgICAvLyBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJnX2NsZWFyX29iamVjdCAoJih0b2JqZWN0LT4iIDw8IG5hbWUgPDwgIikpOyIgPDwgZW5kbDsKLSAgICAgIC8vIGRvZXMgZ19vYmplY3RfdW5yZWYgdGhlIHRyaWNrPwotICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHRvYmplY3QtPiIgPDwgbmFtZSA8PCAiICE9IE5VTEwpIiA8PCBlbmRsOwotICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiZ19vYmplY3RfdW5yZWYodG9iamVjdC0+IiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInRvYmplY3QtPiIgPDwgbmFtZSA8PCAiID0gTlVMTDsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKHQtPmlzX3N0cmluZygpKSB7Ci0gICAgICBzdHJpbmcgbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImlmICh0b2JqZWN0LT4iIDw8IG5hbWUgPDwgIiAhPSBOVUxMKSIgPDwgZW5kbDsKLSAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgZ2VuZXJhdGVfZnJlZV9mdW5jX2Zyb21fdHlwZSh0KSA8PCAiKHRvYmplY3QtPiIgPDwgbmFtZSA8PCAiKTsiCi0gICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJ0b2JqZWN0LT4iIDw8IG5hbWUgPDwgIiA9IE5VTEw7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl90eXBlc19pbXBsXyA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIGdlbmVyYXRlIHRoZSBjbGFzcyBpbml0IGZ1bmN0aW9uCi0KLSAgZl90eXBlc19pbXBsXyA8PCAic3RhdGljIHZvaWQiIDw8IGVuZGwgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX2NsYXNzX2luaXQgKCIgPDwgY2xhc3NfbmFtZQotICAgICAgICAgICAgICAgIDw8ICJDbGFzcyAqIGNscykiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfdHlwZXNfaW1wbF8pOwotCi0gIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgIkdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChjbHMpOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJUaHJpZnRTdHJ1Y3RDbGFzcyAqc3RydWN0X2NsYXNzID0gIgotICAgICAgICAgICAgICAgIDw8ICJUSFJJRlRfU1RSVUNUX0NMQVNTIChjbHMpOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgPDwgInN0cnVjdF9jbGFzcy0+cmVhZCA9ICIgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX3JlYWQ7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgPDwgInN0cnVjdF9jbGFzcy0+d3JpdGUgPSAiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl93cml0ZTsiIDw8IGVuZGwgPDwgZW5kbAotICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9ICIgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX2ZpbmFsaXplOyIKLSAgICAgICAgICAgICAgICA8PCBlbmRsOwotICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7Ci0gICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gIiA8PCBjbGFzc19uYW1lX2xjCi0gICAgICAgICAgICAgICAgICA8PCAiX2dldF9wcm9wZXJ0eTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICAgIDw8ICJnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSAiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9zZXRfcHJvcGVydHk7IiA8PCBlbmRsOwotCi0gICAgLy8gaW5zdGFsbCBhIHByb3BlcnR5IGZvciBlYWNoIG1lbWJlcgotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIHRfZmllbGQqIG1lbWJlciA9ICgqbV9pdGVyKTsKLSAgICAgIHN0cmluZyBtZW1iZXJfbmFtZSA9IG1lbWJlci0+Z2V0X25hbWUoKTsKLSAgICAgIHN0cmluZyBtZW1iZXJfbmFtZV91YwotICAgICAgICAgID0gdG9fdXBwZXJfY2FzZSh0b19sb3dlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhtZW1iZXJfbmFtZSkpKTsKLSAgICAgIHRfdHlwZSogbWVtYmVyX3R5cGUgPSBnZXRfdHJ1ZV90eXBlKG1lbWJlci0+Z2V0X3R5cGUoKSk7Ci0gICAgICB0X2NvbnN0X3ZhbHVlKiBtZW1iZXJfdmFsdWUgPSBtZW1iZXItPmdldF92YWx1ZSgpOwotCi0gICAgICBzdHJpbmcgcHJvcGVydHlfaWRlbnRpZmllciA9ICJQUk9QXyIgKyBjbGFzc19uYW1lX3VjICsgIl8iICsgbWVtYmVyX25hbWVfdWM7Ci0KLSAgICAgIGZfdHlwZXNfaW1wbF8gPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgYXJnc19pbmRlbnQgPSBpbmRlbnQoKSArICcgJzsKLSAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgIihnb2JqZWN0X2NsYXNzLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCBwcm9wZXJ0eV9pZGVudGlmaWVyCi0gICAgICAgICAgICAgICAgICAgIDw8ICIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50OwotCi0gICAgICBpZiAobWVtYmVyX3R5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgYmFzZV90eXBlID0gKCh0X2Jhc2VfdHlwZSopbWVtYmVyX3R5cGUpLT5nZXRfYmFzZSgpOwotCi0gICAgICAgIGlmIChiYXNlX3R5cGUgPT0gdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HKSB7Ci0gICAgICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKW1lbWJlcl90eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgICAgIGFyZ3NfaW5kZW50ICs9IHN0cmluZygyMCwgJyAnKTsKLSAgICAgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgImdfcGFyYW1fc3BlY19ib3hlZCAoXCIiIDw8IG1lbWJlcl9uYW1lIDw8ICJcIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIk5VTEwsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJOVUxMLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAotICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiR19UWVBFX0JZVEVfQVJSQVksIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJHX1BBUkFNX1JFQURXUklURSkpOyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXJnc19pbmRlbnQgKz0gc3RyaW5nKDIxLCAnICcpOwotICAgICAgICAgICAgZl90eXBlc19pbXBsXyA8PCAiZ19wYXJhbV9zcGVjX3N0cmluZyAoXCIiIDw8IG1lbWJlcl9uYW1lIDw8ICJcIiwiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgIk5VTEwsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJOVUxMLCIgPDwgZW5kbAotICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBhcmdzX2luZGVudAotICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAoKG1lbWJlcl92YWx1ZSAhPSBOVUxMKSA/ICJcIiIgKyBtZW1iZXJfdmFsdWUtPmdldF9zdHJpbmcoKSArICJcIiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiTlVMTCIpIDw8ICIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJHX1BBUkFNX1JFQURXUklURSkpOyIgPDwgZW5kbDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoYmFzZV90eXBlID09IHRfYmFzZV90eXBlOjpUWVBFX0JPT0wpIHsKLSAgICAgICAgICBhcmdzX2luZGVudCArPSBzdHJpbmcoMjIsICcgJyk7Ci0gICAgICAgICAgZl90eXBlc19pbXBsXyA8PCAiZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKFwiIiA8PCBtZW1iZXJfbmFtZSA8PCAiXCIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICA8PCAiTlVMTCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIk5VTEwsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICA8PCAoKChtZW1iZXJfdmFsdWUgIT0gTlVMTCkgJiYgKG1lbWJlcl92YWx1ZS0+Z2V0X2ludGVnZXIoKSAhPSAwKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAiVFJVRSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiRkFMU0UiKSA8PCAiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiR19QQVJBTV9SRUFEV1JJVEUpKTsiCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgICAgICB9IGVsc2UgaWYgKChiYXNlX3R5cGUgPT0gdF9iYXNlX3R5cGU6OlRZUEVfQllURSkgfHwgKGJhc2VfdHlwZSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTYpCi0gICAgICAgICAgICAgICAgICAgfHwgKGJhc2VfdHlwZSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzIpIHx8IChiYXNlX3R5cGUgPT0gdF9iYXNlX3R5cGU6OlRZUEVfSTY0KQotICAgICAgICAgICAgICAgICAgIHx8IChiYXNlX3R5cGUgPT0gdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFKSkgewotICAgICAgICAgIHN0cmluZyBwYXJhbV9zcGVjX2Z1bmN0aW9uX25hbWUgPSAiZ19wYXJhbV9zcGVjX2ludCI7Ci0gICAgICAgICAgc3RyaW5nIG1pbl92YWx1ZTsKLSAgICAgICAgICBzdHJpbmcgbWF4X3ZhbHVlOwotICAgICAgICAgIG9zdHJpbmdzdHJlYW0gZGVmYXVsdF92YWx1ZTsKLQotICAgICAgICAgIHN3aXRjaCAoYmFzZV90eXBlKSB7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICAgICAgbWluX3ZhbHVlID0gIkdfTUlOSU5UOCI7Ci0gICAgICAgICAgICBtYXhfdmFsdWUgPSAiR19NQVhJTlQ4IjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgICAgICBtaW5fdmFsdWUgPSAiR19NSU5JTlQxNiI7Ci0gICAgICAgICAgICBtYXhfdmFsdWUgPSAiR19NQVhJTlQxNiI7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICAgICAgbWluX3ZhbHVlID0gIkdfTUlOSU5UMzIiOwotICAgICAgICAgICAgbWF4X3ZhbHVlID0gIkdfTUFYSU5UMzIiOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgICAgIHBhcmFtX3NwZWNfZnVuY3Rpb25fbmFtZSA9ICJnX3BhcmFtX3NwZWNfaW50NjQiOwotICAgICAgICAgICAgbWluX3ZhbHVlID0gIkdfTUlOSU5UNjQiOwotICAgICAgICAgICAgbWF4X3ZhbHVlID0gIkdfTUFYSU5UNjQiOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgICAgIHBhcmFtX3NwZWNfZnVuY3Rpb25fbmFtZSA9ICJnX3BhcmFtX3NwZWNfZG91YmxlIjsKLSAgICAgICAgICAgIG1pbl92YWx1ZSA9ICItSU5GSU5JVFkiOwotICAgICAgICAgICAgbWF4X3ZhbHVlID0gIklORklOSVRZIjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogIgotICAgICAgICAgICAgICAgICAgInVucmVjb2duaXplZCBiYXNlIHR5cGUgXCIiICsgbWVtYmVyX3R5cGUtPmdldF9uYW1lKCkgKyAiXCIgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9yIHN0cnVjdCBtZW1iZXIgXCIiCi0gICAgICAgICAgICAgICAgKyBtZW1iZXJfbmFtZSArICJcIiI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAobWVtYmVyX3ZhbHVlICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGRlZmF1bHRfdmFsdWUgPDwgKGJhc2VfdHlwZSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEUgPyBtZW1iZXJfdmFsdWUtPmdldF9kb3VibGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1lbWJlcl92YWx1ZS0+Z2V0X2ludGVnZXIoKSk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRlZmF1bHRfdmFsdWUgPDwgIjAiOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGFyZ3NfaW5kZW50ICs9IHN0cmluZyhwYXJhbV9zcGVjX2Z1bmN0aW9uX25hbWUubGVuZ3RoKCkgKyAyLCAnICcpOwotICAgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgcGFyYW1fc3BlY19mdW5jdGlvbl9uYW1lIDw8ICIgKFwiIiA8PCBtZW1iZXJfbmFtZSA8PCAiXCIsIiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAiTlVMTCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIk5VTEwsIiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCBtaW5fdmFsdWUgPDwgIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgbWF4X3ZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCBkZWZhdWx0X3ZhbHVlLnN0cigpIDw8ICIsIiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAiR19QQVJBTV9SRUFEV1JJVEUpKTsiIDw8IGVuZGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgfSBlbHNlIGlmIChtZW1iZXJfdHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICAgIHRfZW51bV92YWx1ZSogZW51bV9taW5fdmFsdWUgPSAoKHRfZW51bSopbWVtYmVyX3R5cGUpLT5nZXRfbWluX3ZhbHVlKCk7Ci0gICAgICAgIHRfZW51bV92YWx1ZSogZW51bV9tYXhfdmFsdWUgPSAoKHRfZW51bSopbWVtYmVyX3R5cGUpLT5nZXRfbWF4X3ZhbHVlKCk7Ci0gICAgICAgIGludCBtaW5fdmFsdWUgPSAoZW51bV9taW5fdmFsdWUgIT0gTlVMTCkgPyBlbnVtX21pbl92YWx1ZS0+Z2V0X3ZhbHVlKCkgOiAwOwotICAgICAgICBpbnQgbWF4X3ZhbHVlID0gKGVudW1fbWF4X3ZhbHVlICE9IE5VTEwpID8gZW51bV9tYXhfdmFsdWUtPmdldF92YWx1ZSgpIDogMDsKLQotICAgICAgICBhcmdzX2luZGVudCArPSBzdHJpbmcoMTgsICcgJyk7Ci0gICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgImdfcGFyYW1fc3BlY19pbnQgKFwiIiA8PCBtZW1iZXJfbmFtZSA8PCAiXCIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50Ci0gICAgICAgICAgICAgICAgICAgICAgPDwgIk5VTEwsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJOVUxMLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAotICAgICAgICAgICAgICAgICAgICAgIDw8IG1pbl92YWx1ZSA8PCAiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCBtYXhfdmFsdWUgPDwgIiwiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCBtaW5fdmFsdWUgPDwgIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKLSAgICAgICAgICAgICAgICAgICAgICA8PCAiR19QQVJBTV9SRUFEV1JJVEUpKTsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICB9IGVsc2UgaWYgKG1lbWJlcl90eXBlLT5pc19zdHJ1Y3QoKSB8fCBtZW1iZXJfdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgICAgICBzdHJpbmcgcGFyYW1fdHlwZSA9IHRoaXMtPm5zcGFjZV91YyArICJUWVBFXyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHRvX3VwcGVyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKG1lbWJlcl90eXBlLT5nZXRfbmFtZSgpKSk7Ci0KLSAgICAgICAgYXJnc19pbmRlbnQgKz0gc3RyaW5nKDIwLCAnICcpOwotICAgICAgICBmX3R5cGVzX2ltcGxfIDw8ICJnX3BhcmFtX3NwZWNfb2JqZWN0IChcIiIgPDwgbWVtYmVyX25hbWUgPDwgIlwiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAotICAgICAgICAgICAgICAgICAgICAgIDw8ICJOVUxMLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiTlVMTCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKLSAgICAgICAgICAgICAgICAgICAgICA8PCBwYXJhbV90eXBlIDw8ICIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJHX1BBUkFNX1JFQURXUklURSkpOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIH0gZWxzZSBpZiAobWVtYmVyX3R5cGUtPmlzX2xpc3QoKSkgewotICAgICAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9saXN0KiltZW1iZXJfdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICAgICAgc3RyaW5nIHBhcmFtX3R5cGU7Ci0KLSAgICAgICAgaWYgKGVsZW1fdHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgIWVsZW1fdHlwZS0+aXNfc3RyaW5nKCkpIHsKLSAgICAgICAgICBwYXJhbV90eXBlID0gIkdfVFlQRV9BUlJBWSI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcGFyYW1fdHlwZSA9ICJHX1RZUEVfUFRSX0FSUkFZIjsKLSAgICAgICAgfQotCi0gICAgICAgIGFyZ3NfaW5kZW50ICs9IHN0cmluZygyMCwgJyAnKTsKLSAgICAgICAgZl90eXBlc19pbXBsXyA8PCAiZ19wYXJhbV9zcGVjX2JveGVkIChcIiIgPDwgbWVtYmVyX25hbWUgPDwgIlwiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAotICAgICAgICAgICAgICAgICAgICAgIDw8ICJOVUxMLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiTlVMTCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKLSAgICAgICAgICAgICAgICAgICAgICA8PCBwYXJhbV90eXBlIDw8ICIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJHX1BBUkFNX1JFQURXUklURSkpOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIH0gZWxzZSBpZiAobWVtYmVyX3R5cGUtPmlzX3NldCgpIHx8IG1lbWJlcl90eXBlLT5pc19tYXAoKSkgewotICAgICAgICBhcmdzX2luZGVudCArPSBzdHJpbmcoMjAsICcgJyk7Ci0gICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgImdfcGFyYW1fc3BlY19ib3hlZCAoXCIiIDw8IG1lbWJlcl9uYW1lIDw8ICJcIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKLSAgICAgICAgICAgICAgICAgICAgICA8PCAiTlVMTCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIk5VTEwsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50Ci0gICAgICAgICAgICAgICAgICAgICAgPDwgIkdfVFlQRV9IQVNIX1RBQkxFLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiR19QQVJBTV9SRUFEV1JJVEUpKTsiCi0gICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgc2NvcGVfZG93bihmX3R5cGVzX2ltcGxfKTsKLSAgZl90eXBlc19pbXBsXyA8PCBlbmRsOwotCi0gIGZfdHlwZXNfaW1wbF8gPDwgIkdUeXBlIiA8PCBlbmRsIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX3UgPDwgIl9nZXRfdHlwZSAodm9pZCkiIDw8IGVuZGwgPDwgInsiCi0gICAgICAgICAgICAgICAgPDwgZW5kbCA8PCAiICBzdGF0aWMgR1R5cGUgdHlwZSA9IDA7IiA8PCBlbmRsIDw8IGVuZGwgPDwgIiAgaWYgKHR5cGUgPT0gMCkgIiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgPDwgIiAgeyIgPDwgZW5kbCA8PCAiICAgIHN0YXRpYyBjb25zdCBHVHlwZUluZm8gdHlwZV9pbmZvID0gIiA8PCBlbmRsIDw8ICIgICAgeyIKLSAgICAgICAgICAgICAgICA8PCBlbmRsIDw8ICIgICAgICBzaXplb2YgKCIgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIkNsYXNzKSwiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICA8PCAiICAgICAgTlVMTCwgLyogYmFzZV9pbml0ICovIiA8PCBlbmRsIDw8ICIgICAgICBOVUxMLCAvKiBiYXNlX2ZpbmFsaXplICovIgotICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgIiAgICAgIChHQ2xhc3NJbml0RnVuYykgIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV91IDw8ICJfY2xhc3NfaW5pdCwiCi0gICAgICAgICAgICAgICAgPDwgZW5kbCA8PCAiICAgICAgTlVMTCwgLyogY2xhc3NfZmluYWxpemUgKi8iIDw8IGVuZGwKLSAgICAgICAgICAgICAgICA8PCAiICAgICAgTlVMTCwgLyogY2xhc3NfZGF0YSAqLyIgPDwgZW5kbCA8PCAiICAgICAgc2l6ZW9mICgiIDw8IHRoaXMtPm5zcGFjZQotICAgICAgICAgICAgICAgIDw8IG5hbWUgPDwgIiksIiA8PCBlbmRsIDw8ICIgICAgICAwLCAvKiBuX3ByZWFsbG9jcyAqLyIgPDwgZW5kbAotICAgICAgICAgICAgICAgIDw8ICIgICAgICAoR0luc3RhbmNlSW5pdEZ1bmMpICIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfdSA8PCAiX2luc3RhbmNlX2luaXQsIgotICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgIiAgICAgIE5VTEwsIC8qIHZhbHVlX3RhYmxlICovIiA8PCBlbmRsIDw8ICIgICAgfTsiIDw8IGVuZGwgPDwgZW5kbAotICAgICAgICAgICAgICAgIDw8ICIgICAgdHlwZSA9IGdfdHlwZV9yZWdpc3Rlcl9zdGF0aWMgKFRIUklGVF9UWVBFX1NUUlVDVCwgIiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIiIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICJUeXBlXCIsIgotICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnR5cGVfaW5mbywgMCk7IiA8PCBlbmRsIDw8ICIgIH0iCi0gICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsIDw8ICIgIHJldHVybiB0eXBlOyIgPDwgZW5kbCA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBmdW5jdGlvbnMgdG8gd3JpdGUgVGhyaWZ0IHN0cnVjdHVyZXMgdG8gYSBzdHJlYW0uCi0gKi8KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3Rfd3JpdGVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0aGlzX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdGhpc19nZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2Z1bmN0aW9uKSB7Ci0gIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgc3RyaW5nIG5hbWVfdSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhuYW1lKTsKLSAgc3RyaW5nIG5hbWVfdWMgPSB0b191cHBlcl9jYXNlKG5hbWVfdSk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBpbnQgZXJyb3JfcmV0ID0gMDsKLQotICBpZiAoaXNfZnVuY3Rpb24pIHsKLSAgICBlcnJvcl9yZXQgPSAtMTsKLSAgICBpbmRlbnQob3V0KSA8PCAic3RhdGljIGdpbnQzMiIgPDwgZW5kbCA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV91Ci0gICAgICAgICAgICAgICAgPDwgIl93cml0ZSAoVGhyaWZ0U3RydWN0ICpvYmplY3QsIFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpIgotICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiZ2ludDMyIHJldDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImdpbnQzMiB4ZmVyID0gMDsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCB0aGlzX2dldCA8PCBlbmRsOwotICAvLyBzYXRpc2Z5IC1XYWxsIGluIHRoZSBjYXNlIG9mIGFuIGVtcHR5IHN0cnVjdAotICBpZiAoIXRoaXNfZ2V0LmVtcHR5KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiVEhSSUZUX1VOVVNFRF9WQVIgKHRoaXNfb2JqZWN0KTsiIDw8IGVuZGw7Ci0gIH0KLQotICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9iZWdpbiAocHJvdG9jb2wsIFwiIiA8PCBuYW1lCi0gICAgICA8PCAiXCIsIGVycm9yKSkgPCAwKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwKLSAgICAgIDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCkgewotICAgICAgaW5kZW50KG91dCkgPDwgImlmICh0aGlzX29iamVjdC0+X19pc3NldF8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID09IFRSVUUpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgIgotICAgICAgICA8PCAiXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIgotICAgICAgICA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0Ci0gICAgICAgIDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGw7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgdGhpc19uYW1lLCAiIiwgZXJyb3JfcmV0KTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIGVycm9yKSkgPCAwKSIgPDwgZW5kbAotICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIKLSAgICAgICAgPDwgZW5kbDsKLQotICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgLy8gd3JpdGUgdGhlIHN0cnVjdCBtYXAKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9maWVsZF9zdG9wIChwcm90b2NvbCwgZXJyb3IpKSA8IDApIiA8PCBlbmRsCi0gICAgICA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbAotICAgICAgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9lbmQgKHByb3RvY29sLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwKLSAgICAgIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsCi0gICAgICA8PCBlbmRsOwotCi0gIGlmIChpc19mdW5jdGlvbikgewotICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4geGZlcjsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIHRvIHJlYWQgVGhyaWZ0IHN0cnVjdHVyZXMgZnJvbSBhIHN0cmVhbS4KLSAqLwotdm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF9yZWFkZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHRoaXNfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0aGlzX2dldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZnVuY3Rpb24pIHsKLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBzdHJpbmcgbmFtZV91ID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKG5hbWUpOwotICBzdHJpbmcgbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UobmFtZV91KTsKLSAgaW50IGVycm9yX3JldCA9IDA7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBpZiAoaXNfZnVuY3Rpb24pIHsKLSAgICBlcnJvcl9yZXQgPSAtMTsKLSAgICBpbmRlbnQob3V0KSA8PCAiLyogcmVhZHMgYSAiIDw8IG5hbWVfdSA8PCAiIG9iamVjdCAqLyIgPDwgZW5kbCA8PCAic3RhdGljIGdpbnQzMiIgPDwgZW5kbAotICAgICAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX3UKLSAgICAgICAgICAgICAgICA8PCAiX3JlYWQgKFRocmlmdFN0cnVjdCAqb2JqZWN0LCBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKSIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8ICJ7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICAvLyBkZWNsYXJlIHN0YWNrIHRlbXAgdmFyaWFibGVzCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiZ2ludDMyIHJldDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImdpbnQzMiB4ZmVyID0gMDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgIDw8ICJnY2hhciAqbmFtZSA9IE5VTEw7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJUaHJpZnRUeXBlIGZ0eXBlOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgPDwgImdpbnQxNiBmaWQ7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJndWludDMyIGxlbiA9IDA7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICA8PCAiZ3BvaW50ZXIgZGF0YSA9IE5VTEw7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHRoaXNfZ2V0IDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgaW5kZW50KG91dCkgPDwgImdib29sZWFuIGlzc2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBGQUxTRTsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgLy8gc2F0aXNmeSAtV2FsbCBpbiBjYXNlIHdlIGRvbid0IHVzZSBzb21lIHZhcmlhYmxlcwotICBvdXQgPDwgaW5kZW50KCkgPDwgIi8qIHNhdGlzZnkgLVdhbGwgaW4gY2FzZSB0aGVzZSBhcmVuJ3QgdXNlZCAqLyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgPDwgIlRIUklGVF9VTlVTRURfVkFSIChsZW4pOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiVEhSSUZUX1VOVVNFRF9WQVIgKGRhdGEpOyIgPDwgZW5kbDsKLQotICBpZiAoIXRoaXNfZ2V0LmVtcHR5KCkpIHsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlRIUklGVF9VTlVTRURfVkFSICh0aGlzX29iamVjdCk7IiA8PCBlbmRsOwotICB9Ci0gIG91dCA8PCBlbmRsOwotCi0gIC8vIHJlYWQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RydWN0dXJlIG1hcmtlcgotICBvdXQgPDwgaW5kZW50KCkgPDwgIi8qIHJlYWQgdGhlIHN0cnVjdCBiZWdpbiBtYXJrZXIgKi8iIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9iZWdpbiAocHJvdG9jb2wsICZuYW1lLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwKLSAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIGlmIChuYW1lKSBnX2ZyZWUgKG5hbWUpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiAobmFtZSkgZ19mcmVlIChuYW1lKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgIDw8ICJuYW1lID0gTlVMTDsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyByZWFkIHRoZSBzdHJ1Y3QgZmllbGRzCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiLyogcmVhZCB0aGUgc3RydWN0IGZpZWxkcyAqLyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAid2hpbGUgKDEpIiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotCi0gIC8vIHJlYWQgYmVnaW5uaW5nIGZpZWxkIG1hcmtlcgotICBvdXQgPDwgaW5kZW50KCkgPDwgIi8qIHJlYWQgdGhlIGJlZ2lubmluZyBvZiBhIGZpZWxkICovIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZuYW1lLCAmZnR5cGUsICZmaWQsIGVycm9yKSkgPCAwKSIKLSAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgaWYgKG5hbWUpIGdfZnJlZSAobmFtZSk7IiA8PCBlbmRsCi0gICAgICA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmIChuYW1lKSBnX2ZyZWUgKG5hbWUpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgPDwgIm5hbWUgPSBOVUxMOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIGNoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlcgotICBvdXQgPDwgaW5kZW50KCkgPDwgIi8qIGJyZWFrIGlmIHdlIGdldCBhIFNUT1AgZmllbGQgKi8iIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgIDw8ICJpZiAoZnR5cGUgPT0gVF9TVE9QKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBicmVhazsiIDw8IGVuZGwKLSAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gc3dpdGNoIGRlcGVuZGluZyBvbiB0aGUgZmllbGQgdHlwZQotICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWQpIiA8PCBlbmRsOwotCi0gIC8vIHN0YXJ0IHN3aXRjaAotICBzY29wZV91cChvdXQpOwotCi0gIC8vIGdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biB0eXBlcwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjoiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgImlmIChmdHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpIiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJ7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X3VwKCk7Ci0gICAgLy8gZ2VuZXJhdGUgZGVzZXJpYWxpemUgZmllbGQKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsIHRoaXNfbmFtZSwgIiIsIGVycm9yX3JldCwgZmFsc2UpOwotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgIDw8ICIgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3NraXAgKHByb3RvY29sLCBmdHlwZSwgZXJyb3IpKSA8IDApIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgIDw8ICIgICAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHhmZXIgKz0gcmV0OyIgPDwgZW5kbAotICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLQotICAvLyBjcmVhdGUgdGhlIGRlZmF1bHQgY2FzZQotICBvdXQgPDwgaW5kZW50KCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICA8PCAiICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9za2lwIChwcm90b2NvbCwgZnR5cGUsIGVycm9yKSkgPCAwKSIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgPDwgIiAgICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgeGZlciArPSByZXQ7IiA8PCBlbmRsCi0gICAgICA8PCBpbmRlbnQoKSA8PCAiICBicmVhazsiIDw8IGVuZGw7Ci0KLSAgLy8gZW5kIHN3aXRjaAotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgLy8gcmVhZCBmaWVsZCBlbmQgbWFya2VyCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKHByb3RvY29sLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwKLSAgICAgIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsOwotCi0gIC8vIGVuZCB3aGlsZSBsb29wCi0gIHNjb3BlX2Rvd24ob3V0KTsKLSAgb3V0IDw8IGVuZGw7Ci0KLSAgLy8gcmVhZCB0aGUgZW5kIG9mIHRoZSBzdHJ1Y3R1cmUKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9lbmQgKHByb3RvY29sLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwKLSAgICAgIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsCi0gICAgICA8PCBlbmRsOwotCi0gIC8vIGlmIGEgcmVxdWlyZWQgZmllbGQgaXMgbWlzc2luZywgdGhyb3cgYW4gZXJyb3IKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIWlzc2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ7IgotICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfUFJPVE9DT0xfRVJST1IsIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgPDwgIiAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9JTlZBTElEX0RBVEEsIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgPDwgIiAgICAgICAgICAgICAgIFwibWlzc2luZyBmaWVsZFwiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIC0xOyIgPDwgZW5kbAotICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaWYgKGlzX2Z1bmN0aW9uKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInJldHVybiB4ZmVyOyIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIGVuZCB0aGUgZnVuY3Rpb24vc3RydWN0dXJlCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3VmZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0KSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkgKyBzdWZmaXg7Ci0KLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIG5hbWU7Ci0gIH0KLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUsIGVycm9yX3JldCk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSwgZXJyb3JfcmV0KTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfIjsKLQotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBvdXQgPDwgImJvb2wgKHByb3RvY29sLCAiIDw8IG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBvdXQgPDwgImJ5dGUgKHByb3RvY29sLCAiIDw8IG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIG91dCA8PCAiaTE2IChwcm90b2NvbCwgIiA8PCBuYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBvdXQgPDwgImkzMiAocHJvdG9jb2wsICIgPDwgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgb3V0IDw8ICJpNjQgKHByb3RvY29sLCAiIDw8IG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIG91dCA8PCAiZG91YmxlIChwcm90b2NvbCwgIiA8PCBuYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgICAgb3V0IDw8ICJiaW5hcnkgKHByb3RvY29sLCAoKEdCeXRlQXJyYXkgKikgIiA8PCBuYW1lIDw8ICIpLT5kYXRhLCAoKEdCeXRlQXJyYXkgKikgIiA8PCBuYW1lCi0gICAgICAgICAgICAgIDw8ICIpLT5sZW4iOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG91dCA8PCAic3RyaW5nIChwcm90b2NvbCwgIiA8PCBuYW1lOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDIHdyaXRlciBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpICsgbmFtZTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgb3V0IDw8ICJpMzIgKHByb3RvY29sLCAoZ2ludDMyKSAiIDw8IG5hbWU7Ci0gICAgfQotICAgIG91dCA8PCAiLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgbmFtZS5jX3N0cigpLAotICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7Ci0gIH0KLX0KLQotdm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQpIHsKLSAgKHZvaWQpdHN0cnVjdDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9zdHJ1Y3Rfd3JpdGUgKFRIUklGVF9TVFJVQ1QgKCIgPDwgcHJlZml4Ci0gICAgICA8PCAiKSwgcHJvdG9jb2wsIGVycm9yKSkgPCAwKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwKLSAgICAgIDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCkgewotICBzY29wZV91cChvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBzdHJpbmcgbGVuZ3RoID0gImdfaGFzaF90YWJsZV9zaXplICgoR0hhc2hUYWJsZSAqKSAiICsgcHJlZml4ICsgIikiOwotICAgIHRfdHlwZSogdGtleSA9ICgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB0dmFsID0gKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICBzdHJpbmcgdGtleV9uYW1lID0gdHlwZV9uYW1lKHRrZXkpOwotICAgIHN0cmluZyB0dmFsX25hbWUgPSB0eXBlX25hbWUodHZhbCk7Ci0gICAgc3RyaW5nIHRrZXlfcHRyOwotICAgIHN0cmluZyB0dmFsX3B0cjsKLSAgICBzdHJpbmcga2V5bmFtZSA9IHRtcCgia2V5Iik7Ci0gICAgc3RyaW5nIHZhbG5hbWUgPSB0bXAoInZhbCIpOwotCi0gICAgZGVjbGFyZV9sb2NhbF92YXJpYWJsZShvdXQsIHRrZXksIGtleW5hbWUpOwotICAgIGRlY2xhcmVfbG9jYWxfdmFyaWFibGUob3V0LCB0dmFsLCB2YWxuYW1lKTsKLQotICAgIC8qIElmIGVpdGhlciB0aGUga2V5IG9yIHZhbHVlIHR5cGUgaXMgYSB0eXBlZGVmLCBmaW5kIGl0cyB1bmRlcmx5aW5nIHR5cGUgc28KLSAgICAgICB3ZSBjYW4gY29ycmVjdGx5IGRldGVybWluZSBob3cgdG8gZ2VuZXJhdGUgYSBwb2ludGVyIHRvIGl0ICovCi0gICAgdGtleSA9IGdldF90cnVlX3R5cGUodGtleSk7Ci0gICAgdHZhbCA9IGdldF90cnVlX3R5cGUodHZhbCk7Ci0KLSAgICB0a2V5X3B0ciA9IHRrZXktPmlzX3N0cmluZygpIHx8ICF0a2V5LT5pc19iYXNlX3R5cGUoKSA/ICIiIDogIioiOwotICAgIHR2YWxfcHRyID0gdHZhbC0+aXNfc3RyaW5nKCkgfHwgIXR2YWwtPmlzX2Jhc2VfdHlwZSgpID8gIiIgOiAiKiI7Ci0KLSAgICAvKgotICAgICAqIFNvbWUgdWdsaW5lc3MgaGVyZS4gIFRvIG1heGltaXplIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCB3ZQotICAgICAqIGF2b2lkIHVzaW5nIEdIYXNoVGFibGVJdGVyIGFuZCBpbnN0ZWFkIGdldCBhIEdMaXN0IG9mIGFsbCBrZXlzLAotICAgICAqIHRoZW4gY29weSBpdCBpbnRvIGEgYXJyYXkgb24gdGhlIHN0YWNrLCBhbmQgZnJlZSBpdC4KLSAgICAgKiBUaGlzIGlzIGJlY2F1c2Ugd2UgbWF5IGV4aXQgZWFybHkgYmVmb3JlIHdlIGdldCBhIGNoYW5jZSB0byBmcmVlIHRoZQotICAgICAqIEdMaXN0LgotICAgICAqLwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiR0xpc3QgKmtleV9saXN0ID0gTlVMTCwgKml0ZXIgPSBOVUxMOyIgPDwgZW5kbAotICAgICAgICA8PCBpbmRlbnQoKSA8PCB0a2V5X25hbWUgPDwgdGtleV9wdHIgPDwgIioga2V5czsiIDw8IGVuZGwKLSAgICAgICAgPDwgaW5kZW50KCkgPDwgImludCBpID0gMCwga2V5X2NvdW50OyIgPDwgZW5kbAotICAgICAgICA8PCBlbmRsCi0gICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9tYXBfYmVnaW4gKHByb3RvY29sLCAiCi0gICAgICAgIDw8IHR5cGVfdG9fZW51bSh0a2V5KSA8PCAiLCAiIDw8IHR5cGVfdG9fZW51bSh0dmFsKSA8PCAiLCAoZ2ludDMyKSAiCi0gICAgICAgIDw8IGxlbmd0aCA8PCAiLCBlcnJvcikpIDwgMCkiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbAotICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZ19oYXNoX3RhYmxlX2ZvcmVhY2ggKChHSGFzaFRhYmxlICopICIgPDwgcHJlZml4Ci0gICAgICAgIDw8ICIsIHRocmlmdF9oYXNoX3RhYmxlX2dldF9rZXlzLCAma2V5X2xpc3QpOyIgPDwgZW5kbAotICAgICAgICA8PCBpbmRlbnQoKSA8PCAia2V5X2NvdW50ID0gZ19saXN0X2xlbmd0aCAoa2V5X2xpc3QpOyIgPDwgZW5kbAotICAgICAgICA8PCBpbmRlbnQoKSA8PCAia2V5cyA9IGdfbmV3YSAoIiA8PCB0a2V5X25hbWUgPDwgdGtleV9wdHIKLSAgICAgICAgPDwgIiwga2V5X2NvdW50KTsiIDw8IGVuZGwKLSAgICAgICAgPDwgaW5kZW50KCkgPDwgImZvciAoaXRlciA9IGdfbGlzdF9maXJzdCAoa2V5X2xpc3QpOyBpdGVyOyAiCi0gICAgICAgICAgICJpdGVyID0gaXRlci0+bmV4dCkiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJrZXlzW2krK10gPSAoIiA8PCB0a2V5X25hbWUgPDwgdGtleV9wdHIKLSAgICAgICAgPDwgIikgaXRlci0+ZGF0YTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImdfbGlzdF9mcmVlIChrZXlfbGlzdCk7IiA8PCBlbmRsCi0gICAgICAgIDw8IGVuZGwKLSAgICAgICAgPDwgaW5kZW50KCkgPDwgImZvciAoaSA9IDA7IGkgPCBrZXlfY291bnQ7ICsraSkiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwga2V5bmFtZSA8PCAiID0ga2V5c1tpXTsiIDw8IGVuZGwKLSAgICAgICAgPDwgaW5kZW50KCkgPDwgdmFsbmFtZSA8PCAiID0gKCIgPDwgdHZhbF9uYW1lIDw8IHR2YWxfcHRyCi0gICAgICAgIDw8ICIpIGdfaGFzaF90YWJsZV9sb29rdXAgKCgoR0hhc2hUYWJsZSAqKSAiIDw8IHByZWZpeAotICAgICAgICA8PCAiKSwgKGdwb2ludGVyKSAiIDw8IGtleW5hbWUgPDwgIik7IiA8PCBlbmRsCi0gICAgICAgIDw8IGVuZGw7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRfbWFwKil0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGtleV9wdHIgKyAiICIgKyBrZXluYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dmFsX3B0ciArICIgIiArIHZhbG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX3JldCk7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWFwX2VuZCAocHJvdG9jb2wsICIKLSAgICAgICAgICAgImVycm9yKSkgPCAwKSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIHN0cmluZyBsZW5ndGggPSAiZ19oYXNoX3RhYmxlX3NpemUgKChHSGFzaFRhYmxlICopICIgKyBwcmVmaXggKyAiKSI7Ci0gICAgdF90eXBlKiB0ZWxlbSA9ICgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIHN0cmluZyB0ZWxlbV9uYW1lID0gdHlwZV9uYW1lKHRlbGVtKTsKLSAgICBzdHJpbmcgdGVsZW1fcHRyID0gdGVsZW0tPmlzX3N0cmluZygpIHx8ICF0ZWxlbS0+aXNfYmFzZV90eXBlKCkgPyAiIiA6ICIqIjsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIkdMaXN0ICprZXlfbGlzdCA9IE5VTEwsICppdGVyID0gTlVMTDsiIDw8IGVuZGwKLSAgICAgICAgPDwgaW5kZW50KCkgPDwgdGVsZW1fbmFtZSA8PCB0ZWxlbV9wdHIgPDwgIioga2V5czsiIDw8IGVuZGwKLSAgICAgICAgPDwgaW5kZW50KCkgPDwgImludCBpID0gMCwga2V5X2NvdW50OyIgPDwgZW5kbAotICAgICAgICA8PCBpbmRlbnQoKSA8PCB0ZWxlbV9uYW1lIDw8IHRlbGVtX3B0ciA8PCAiIGVsZW07IiA8PCBlbmRsCi0gICAgICAgIDw8IGluZGVudCgpIDw8ICJncG9pbnRlciB2YWx1ZTsiIDw8IGVuZGwKLSAgICAgICAgPDwgaW5kZW50KCkgPDwgIlRIUklGVF9VTlVTRURfVkFSICh2YWx1ZSk7IiA8PCBlbmRsCi0gICAgICAgIDw8IGVuZGwKLSAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3NldF9iZWdpbiAocHJvdG9jb2wsICIKLSAgICAgICAgPDwgdHlwZV90b19lbnVtKHRlbGVtKSA8PCAiLCAoZ2ludDMyKSAiIDw8IGxlbmd0aCA8PCAiLCBlcnJvcikpIDwgMCkiCi0gICAgICAgIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbAotICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZ19oYXNoX3RhYmxlX2ZvcmVhY2ggKChHSGFzaFRhYmxlICopICIgPDwgcHJlZml4Ci0gICAgICAgIDw8ICIsIHRocmlmdF9oYXNoX3RhYmxlX2dldF9rZXlzLCAma2V5X2xpc3QpOyIgPDwgZW5kbAotICAgICAgICA8PCBpbmRlbnQoKSA8PCAia2V5X2NvdW50ID0gZ19saXN0X2xlbmd0aCAoa2V5X2xpc3QpOyIgPDwgZW5kbAotICAgICAgICA8PCBpbmRlbnQoKSA8PCAia2V5cyA9IGdfbmV3YSAoIiA8PCB0ZWxlbV9uYW1lIDw8IHRlbGVtX3B0cgotICAgICAgICA8PCAiLCBrZXlfY291bnQpOyIgPDwgZW5kbAotICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZm9yIChpdGVyID0gZ19saXN0X2ZpcnN0IChrZXlfbGlzdCk7IGl0ZXI7ICIKLSAgICAgICAgICAgIml0ZXIgPSBpdGVyLT5uZXh0KSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImtleXNbaSsrXSA9ICgiIDw8IHRlbGVtX25hbWUgPDwgdGVsZW1fcHRyCi0gICAgICAgIDw8ICIpIGl0ZXItPmRhdGE7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJnX2xpc3RfZnJlZSAoa2V5X2xpc3QpOyIgPDwgZW5kbAotICAgICAgICA8PCBlbmRsCi0gICAgICAgIDw8IGluZGVudCgpIDw8ICJmb3IgKGkgPSAwOyBpIDwga2V5X2NvdW50OyArK2kpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJlbGVtID0ga2V5c1tpXTsiIDw8IGVuZGwKLSAgICAgICAgPDwgaW5kZW50KCkgPDwgInZhbHVlID0gKGdwb2ludGVyKSBnX2hhc2hfdGFibGVfbG9va3VwICIKLSAgICAgICAgICAgIigoKEdIYXNoVGFibGUgKikgIiA8PCBwcmVmaXggPDwgIiksIChncG9pbnRlcikgZWxlbSk7IiA8PCBlbmRsCi0gICAgICAgIDw8IGVuZGw7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRfc2V0Kil0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVsZW1fcHRyICsgImVsZW0iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9yZXQpOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3NldF9lbmQgKHByb3RvY29sLCAiCi0gICAgICAgICAgICJlcnJvcikpIDwgMCkiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgc3RyaW5nIGxlbmd0aCA9IHByZWZpeCArICItPmxlbiI7Ci0gICAgc3RyaW5nIGkgPSB0bXAoImkiKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImd1aW50ICIgPDwgaSA8PCAiOyIgPDwgZW5kbAotICAgICAgICA8PCBlbmRsCi0gICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9saXN0X2JlZ2luIChwcm90b2NvbCwgIgotICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAoZ2ludDMyKSAiCi0gICAgICAgIDw8IGxlbmd0aCA8PCAiLCBlcnJvcikpIDwgMCkiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbAotICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZm9yICgiIDw8IGkgPDwgIiA9IDA7ICIgPDwgaSA8PCAiIDwgIiA8PCBsZW5ndGggPDwgIjsgIgotICAgICAgICA8PCBpIDw8ICIrKykiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIHByZWZpeCwgaSwgZXJyb3JfcmV0KTsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9saXN0X2VuZCAocHJvdG9jb2wsICIKLSAgICAgICAgICAgImVycm9yKSkgPCAwKSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsOwotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotfQotCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQpIHsKLSAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsICIiLCAiIiwgZXJyb3JfcmV0KTsKLQotICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsdWUpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCAiIiwgIiIsIGVycm9yX3JldCk7Ci19Ci0KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBlbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0KSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbWVudCk7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiLCAiIiwgZXJyb3JfcmV0KTsKLX0KLQotdm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQpIHsKLSAgdF90eXBlKiB0dHlwZSA9IGdldF90cnVlX3R5cGUodGxpc3QtPmdldF9lbGVtX3R5cGUoKSk7Ci0KLSAgLy8gY2FzdCB0byBub24tY29uc3QKLSAgc3RyaW5nIGNhc3QgPSAiIjsKLSAgc3RyaW5nIG5hbWUgPSAiZ19wdHJfYXJyYXlfaW5kZXggKChHUHRyQXJyYXkgKikgIiArIGxpc3QgKyAiLCAiICsgaW5kZXggKyAiKSI7Ci0KLSAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IGRldGVybWluZSBhcnJheSB0eXBlIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIG5hbWUgPSAiZ19hcnJheV9pbmRleCAoIiArIGxpc3QgKyAiLCBnYm9vbGVhbiwgIiArIGluZGV4ICsgIikiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgbmFtZSA9ICJnX2FycmF5X2luZGV4ICgiICsgbGlzdCArICIsIGdpbnQ4LCAiICsgaW5kZXggKyAiKSI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIG5hbWUgPSAiZ19hcnJheV9pbmRleCAoIiArIGxpc3QgKyAiLCBnaW50MTYsICIgKyBpbmRleCArICIpIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgbmFtZSA9ICJnX2FycmF5X2luZGV4ICgiICsgbGlzdCArICIsIGdpbnQzMiwgIiArIGluZGV4ICsgIikiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICBuYW1lID0gImdfYXJyYXlfaW5kZXggKCIgKyBsaXN0ICsgIiwgZ2ludDY0LCAiICsgaW5kZXggKyAiKSI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIG5hbWUgPSAiZ19hcnJheV9pbmRleCAoIiArIGxpc3QgKyAiLCBnZG91YmxlLCAiICsgaW5kZXggKyAiKSI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIGNhc3QgPSAiKGdjaGFyKikiOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gYXJyYXkgaW5mbyBmb3IgdHlwZSI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSB8fCB0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBjYXN0ID0gIihHSGFzaFRhYmxlKikiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICB0X3R5cGUqIGJhc2UgPSAoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgaWYgKGJhc2UtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICBzd2l0Y2ggKCgodF9iYXNlX3R5cGUqKWJhc2UpLT5nZXRfYmFzZSgpKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IGRldGVybWluZSBhcnJheSB0eXBlIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgY2FzdCA9ICIoR0FycmF5KikiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBjYXN0ID0gIihHUHRyQXJyYXkqKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgIkNvbXBpbGVyIGVycm9yOiBubyBhcnJheSBpbmZvIGZvciB0eXBlIjsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgY2FzdCA9ICIoR1B0ckFycmF5KikiOwotICAgIH0KLSAgfQotCi0gIHRfZmllbGQgZWZpZWxkKHR0eXBlLCAiKCIgKyBjYXN0ICsgbmFtZSArICIpIik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiLCAiIiwgZXJyb3JfcmV0KTsKLX0KLQotLyogZGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuICovCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3VmZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhbGxvY2F0ZSkgewotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkgKyBzdWZmaXg7Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUsIGVycm9yX3JldCwgYWxsb2NhdGUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSwgZXJyb3JfcmV0KTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBpZiAodGJhc2UgPT0gdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgbmFtZSA8PCAiICE9IE5VTEwpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiZ19mcmVlKCIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgbmFtZSA8PCAiID0gTlVMTDsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfIjsKLQotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgb3V0IDw8ICJiaW5hcnkgKHByb3RvY29sLCAmZGF0YSwgJmxlbiI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgInN0cmluZyAocHJvdG9jb2wsICYiIDw8IG5hbWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICBvdXQgPDwgImJvb2wgKHByb3RvY29sLCAmIiA8PCBuYW1lOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgb3V0IDw8ICJieXRlIChwcm90b2NvbCwgJiIgPDwgbmFtZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgb3V0IDw8ICJpMTYgKHByb3RvY29sLCAmIiA8PCBuYW1lOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICBvdXQgPDwgImkzMiAocHJvdG9jb2wsICYiIDw8IG5hbWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIG91dCA8PCAiaTY0IChwcm90b2NvbCwgJiIgPDwgbmFtZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgb3V0IDw8ICJkb3VibGUgKHByb3RvY29sLCAmIiA8PCBuYW1lOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQyByZWFkZXIgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKSArIG5hbWU7Ci0gICAgfQotICAgIG91dCA8PCAiLCBlcnJvcikpIDwgMCkiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IgotICAgICAgICA8PCBlbmRsOwotCi0gICAgLy8gbG9hZCB0aGUgYnl0ZSBhcnJheSB3aXRoIHRoZSBkYXRhCi0gICAgaWYgKHRiYXNlID09IHRfYmFzZV90eXBlOjpUWVBFX1NUUklORyAmJiAoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIiA9IGdfYnl0ZV9hcnJheV9uZXcoKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiZ19ieXRlX2FycmF5X2FwcGVuZCAoIiA8PCBuYW1lIDw8ICIsIChndWludDggKikgZGF0YSwgKGd1aW50KSBsZW4pOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJnX2ZyZWUgKGRhdGEpOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgc3RyaW5nIHQgPSB0bXAoImVjYXN0Iik7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJnaW50MzIgIiA8PCB0IDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICYiIDw8IHQgPDwgIiwgZXJyb3IpKSA8IDApIiA8PCBlbmRsCi0gICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsCi0gICAgICAgIDw8IGluZGVudCgpIDw8IG5hbWUgPDwgIiA9ICgiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKSIgPDwgdCA8PCAiOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCi0gICAgICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKLSAgfQotCi0gIC8vIGlmIHRoZSB0eXBlIGlzIG5vdCByZXF1aXJlZCBhbmQgdGhpcyBpcyBhIHRocmlmdCBzdHJ1Y3QgKG5vIHByZWZpeCksCi0gIC8vIHNldCB0aGUgaXNzZXQgdmFyaWFibGUuICBpZiB0aGUgdHlwZSBpcyByZXF1aXJlZCwgdGhlbiBzZXQgdGhlCi0gIC8vIGxvY2FsIHZhcmlhYmxlIGluZGljYXRpbmcgdGhlIHZhbHVlIHdhcyBzZXQsIHNvIHRoYXQgd2UgY2FuIGRvICAgIC8vIHZhbGlkYXRpb24gbGF0ZXIuCi0gIGlmICh0ZmllbGQtPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEICYmIHByZWZpeCAhPSAiIikgewotICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiX19pc3NldF8iIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCBzdWZmaXggPDwgIiA9IFRSVUU7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHRmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQgJiYgcHJlZml4ICE9ICIiKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImlzc2V0XyIgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPSBUUlVFOyIgPDwgZW5kbDsKLSAgfQotfQotCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFsbG9jYXRlKSB7Ci0gIHN0cmluZyBuYW1lX3VjID0gdG9fdXBwZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXModHN0cnVjdC0+Z2V0X25hbWUoKSkpOwotICBpZiAodHN0cnVjdC0+aXNfeGNlcHRpb24oKSkgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiLyogVGhpcyBzdHJ1Y3QgaXMgYW4gZXhjZXB0aW9uICovIiA8PCBlbmRsOwotICAgIGFsbG9jYXRlID0gdHJ1ZTsKLSAgfQotCi0gIGlmIChhbGxvY2F0ZSkgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCAiIDw8IHByZWZpeCA8PCAiICE9IE5VTEwpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZ19vYmplY3RfdW5yZWYgKCIgPDwgcHJlZml4IDw8ICIpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IGdfb2JqZWN0X25ldyAoIiA8PCB0aGlzLT5uc3BhY2VfdWMKLSAgICAgICAgPDwgIlRZUEVfIiA8PCBuYW1lX3VjIDw8ICIsIE5VTEwpOyIgPDwgZW5kbDsKLSAgfQotICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3N0cnVjdF9yZWFkIChUSFJJRlRfU1RSVUNUICgiIDw8IHByZWZpeAotICAgICAgPDwgIiksIHByb3RvY29sLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpZiAoYWxsb2NhdGUpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiZ19vYmplY3RfdW5yZWYgKCIgPDwgcHJlZml4IDw8ICIpOyIgPDwgZW5kbDsKLSAgICBpZiAodHN0cnVjdC0+aXNfeGNlcHRpb24oKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIgPSBOVUxMOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQpIHsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJndWludDMyIHNpemU7IiA8PCBlbmRsCi0gICAgICAgIDw8IGluZGVudCgpIDw8ICJndWludDMyIGk7IiA8PCBlbmRsCi0gICAgICAgIDw8IGluZGVudCgpIDw8ICJUaHJpZnRUeXBlIGtleV90eXBlOyIgPDwgZW5kbAotICAgICAgICA8PCBpbmRlbnQoKSA8PCAiVGhyaWZ0VHlwZSB2YWx1ZV90eXBlOyIgPDwgZW5kbAotICAgICAgICA8PCBlbmRsCi0gICAgICAgIDw8IGluZGVudCgpIDw8ICIvKiByZWFkIHRoZSBtYXAgYmVnaW4gbWFya2VyICovIiA8PCBlbmRsCi0gICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX21hcF9iZWdpbiAocHJvdG9jb2wsICIKLSAgICAgICAgICAgIiZrZXlfdHlwZSwgJnZhbHVlX3R5cGUsICZzaXplLCBlcnJvcikpIDwgMCkiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbAotICAgICAgICA8PCBlbmRsOwotCi0gICAgLy8gaXRlcmF0ZSBvdmVyIG1hcCBlbGVtZW50cwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiLyogaXRlcmF0ZSB0aHJvdWdoIGVhY2ggb2YgdGhlIG1hcCdzIGZpZWxkcyAqLyIgPDwgZW5kbAotICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCwgZXJyb3JfcmV0KTsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgb3V0IDw8IGVuZGw7Ci0KLSAgICAvLyByZWFkIG1hcCBlbmQKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIi8qIHJlYWQgdGhlIG1hcCBlbmQgbWFya2VyICovIiA8PCBlbmRsCi0gICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX21hcF9lbmQgKHByb3RvY29sLCAiCi0gICAgICAgICAgICJlcnJvcikpIDwgMCkiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImd1aW50MzIgc2l6ZTsiIDw8IGVuZGwKLSAgICAgICAgPDwgaW5kZW50KCkgPDwgImd1aW50MzIgaTsiIDw8IGVuZGwKLSAgICAgICAgPDwgaW5kZW50KCkgPDwgIlRocmlmdFR5cGUgZWxlbWVudF90eXBlOyIgPDwgZW5kbAotICAgICAgICA8PCBlbmRsCi0gICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX3NldF9iZWdpbiAocHJvdG9jb2wsICIKLSAgICAgICAgICAgIiZlbGVtZW50X3R5cGUsICZzaXplLCBlcnJvcikpIDwgMCkiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbAotICAgICAgICA8PCBlbmRsOwotCi0gICAgLy8gaXRlcmF0ZSBvdmVyIHRoZSBlbGVtZW50cwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiLyogaXRlcmF0ZSB0aHJvdWdoIHRoZSBzZXQgZWxlbWVudHMgKi8iIDw8IGVuZGwKLSAgICAgICAgPDwgaW5kZW50KCkgPDwgImZvciAoaSA9IDA7IGkgPCBzaXplOyArK2kpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBwcmVmaXgsIGVycm9yX3JldCk7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotCi0gICAgLy8gcmVhZCBzZXQgZW5kCi0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX3NldF9lbmQgKHByb3RvY29sLCAiCi0gICAgICAgICAgICJlcnJvcikpIDwgMCkiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbAotICAgICAgICA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImd1aW50MzIgc2l6ZTsiIDw8IGVuZGwKLSAgICAgICAgPDwgaW5kZW50KCkgPDwgImd1aW50MzIgaTsiIDw8IGVuZGwKLSAgICAgICAgPDwgaW5kZW50KCkgPDwgIlRocmlmdFR5cGUgZWxlbWVudF90eXBlOyIgPDwgZW5kbAotICAgICAgICA8PCBlbmRsCi0gICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2xpc3RfYmVnaW4gKHByb3RvY29sLCAiCi0gICAgICAgICAgICImZWxlbWVudF90eXBlLCZzaXplLCBlcnJvcikpIDwgMCkiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbAotICAgICAgICA8PCBlbmRsOwotCi0gICAgLy8gaXRlcmF0ZSBvdmVyIHRoZSBlbGVtZW50cwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiLyogaXRlcmF0ZSB0aHJvdWdoIGxpc3QgZWxlbWVudHMgKi8iIDw8IGVuZGwKLSAgICAgICAgPDwgaW5kZW50KCkgPDwgImZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRfbGlzdCopdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9yZXQpOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLQotICAgIC8vIHJlYWQgbGlzdCBlbmQKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfbGlzdF9lbmQgKHByb3RvY29sLCAiCi0gICAgICAgICAgICJlcnJvcikpIDwgMCkiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbDsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLX0KLQotdm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmRlY2xhcmVfbG9jYWxfdmFyaWFibGUob2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nJiBuYW1lKSB7Ci0gIHN0cmluZyB0bmFtZSA9IHR5cGVfbmFtZSh0dHlwZSk7Ci0KLSAgLyogSWYgdGhlIGdpdmVuIHR5cGUgaXMgYSB0eXBlZGVmLCBmaW5kIGl0cyB1bmRlcmx5aW5nIHR5cGUgc28gd2UKLSAgICAgY2FuIGNvcnJlY3RseSBkZXRlcm1pbmUgaG93IHRvIGdlbmVyYXRlIGEgcG9pbnRlciB0byBpdCAqLwotICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOwotCi0gIHN0cmluZyBwdHIgPSB0dHlwZS0+aXNfc3RyaW5nKCkgfHwgIXR0eXBlLT5pc19iYXNlX3R5cGUoKSA/ICIiIDogIioiOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X21hcCogdG1hcCA9ICh0X21hcCopdHR5cGU7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8IHRuYW1lIDw8IHB0ciA8PCAiICIgPDwgbmFtZSA8PCAiID0gIgotICAgICAgICA8PCBnZW5lcmF0ZV9uZXdfaGFzaF9mcm9tX3R5cGUodG1hcC0+Z2V0X2tleV90eXBlKCksIHRtYXAtPmdldF92YWxfdHlwZSgpKSA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICB0X2xpc3QqIHRsaXN0ID0gKHRfbGlzdCopdHR5cGU7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8IHRuYW1lIDw8IHB0ciA8PCAiICIgPDwgbmFtZSA8PCAiID0gIgotICAgICAgICA8PCBnZW5lcmF0ZV9uZXdfYXJyYXlfZnJvbV90eXBlKHRsaXN0LT5nZXRfZWxlbV90eXBlKCkpIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCB0bmFtZSA8PCBwdHIgPDwgIiAiIDw8IG5hbWUgPDwgIjsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8IHRuYW1lIDw8IHB0ciA8PCAiICIgPDwgbmFtZQotICAgICAgICA8PCAocHRyICE9ICIiID8gIiA9IGdfbmV3ICgiICsgdG5hbWUgKyAiLCAxKSIgOiAiID0gTlVMTCIpIDw8ICI7IiA8PCBlbmRsOwotICB9Ci19Ci0KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCkgewotICB0X3R5cGUqIHRrZXkgPSB0bWFwLT5nZXRfa2V5X3R5cGUoKTsKLSAgdF90eXBlKiB0dmFsID0gdG1hcC0+Z2V0X3ZhbF90eXBlKCk7Ci0gIHN0cmluZyBrZXluYW1lID0gdG1wKCJrZXkiKTsKLSAgc3RyaW5nIHZhbG5hbWUgPSB0bXAoInZhbCIpOwotCi0gIGRlY2xhcmVfbG9jYWxfdmFyaWFibGUob3V0LCB0a2V5LCBrZXluYW1lKTsKLSAgZGVjbGFyZV9sb2NhbF92YXJpYWJsZShvdXQsIHR2YWwsIHZhbG5hbWUpOwotCi0gIC8qIElmIGVpdGhlciB0aGUga2V5IG9yIHZhbHVlIHR5cGUgaXMgYSB0eXBlZGVmLCBmaW5kIGl0cyB1bmRlcmx5aW5nCi0gICAgIHR5cGUgc28gd2UgY2FuIGNvcnJlY3RseSBkZXRlcm1pbmUgaG93IHRvIGdlbmVyYXRlIGEgcG9pbnRlciB0bwotICAgICBpdCAqLwotICB0a2V5ID0gZ2V0X3RydWVfdHlwZSh0a2V5KTsKLSAgdHZhbCA9IGdldF90cnVlX3R5cGUodHZhbCk7Ci0KLSAgc3RyaW5nIHRrZXlfcHRyID0gdGtleS0+aXNfc3RyaW5nKCkgfHwgIXRrZXktPmlzX2Jhc2VfdHlwZSgpID8gIiIgOiAiKiI7Ci0gIHN0cmluZyB0dmFsX3B0ciA9IHR2YWwtPmlzX3N0cmluZygpIHx8ICF0dmFsLT5pc19iYXNlX3R5cGUoKSA/ICIiIDogIioiOwotCi0gIC8vIGRlc2VyaWFsaXplIHRoZSBmaWVsZHMgb2YgdGhlIG1hcCBlbGVtZW50Ci0gIHRfZmllbGQgZmtleSh0a2V5LCB0a2V5X3B0ciArIGtleW5hbWUpOwotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5LCAiIiwgIiIsIGVycm9yX3JldCk7Ci0gIHRfZmllbGQgZnZhbCh0dmFsLCB0dmFsX3B0ciArIHZhbG5hbWUpOwotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsLCAiIiwgIiIsIGVycm9yX3JldCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgImdfaGFzaF90YWJsZV9pbnNlcnQgKChHSGFzaFRhYmxlICopIiA8PCBwcmVmaXggPDwgIiwgKGdwb2ludGVyKSAiIDw8IGtleW5hbWUKLSAgICAgICAgICAgICAgPDwgIiwgKGdwb2ludGVyKSAiIDw8IHZhbG5hbWUgPDwgIik7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQpIHsKLSAgdF90eXBlKiB0ZWxlbSA9IHRzZXQtPmdldF9lbGVtX3R5cGUoKTsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7Ci0gIHN0cmluZyB0ZWxlbV9wdHIgPSB0ZWxlbS0+aXNfc3RyaW5nKCkgfHwgIXRlbGVtLT5pc19iYXNlX3R5cGUoKSA/ICIiIDogIioiOwotCi0gIGRlY2xhcmVfbG9jYWxfdmFyaWFibGUob3V0LCB0ZWxlbSwgZWxlbSk7Ci0KLSAgdF9maWVsZCBmZWxlbSh0ZWxlbSwgdGVsZW1fcHRyICsgZWxlbSk7Ci0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtLCAiIiwgIiIsIGVycm9yX3JldCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgImdfaGFzaF90YWJsZV9pbnNlcnQgKChHSGFzaFRhYmxlICopICIgPDwgcHJlZml4IDw8ICIsIChncG9pbnRlcikgIiA8PCBlbGVtCi0gICAgICAgICAgICAgIDw8ICIsIChncG9pbnRlcikgMSk7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCkgewotICAodm9pZClpbmRleDsKLSAgdF90eXBlKiB0dHlwZSA9IHRsaXN0LT5nZXRfZWxlbV90eXBlKCk7Ci0gIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOwotICBzdHJpbmcgdGVsZW1fcHRyID0gdHR5cGUtPmlzX3N0cmluZygpIHx8ICF0dHlwZS0+aXNfYmFzZV90eXBlKCkgPyAiIiA6ICIqIjsKLQotICBkZWNsYXJlX2xvY2FsX3ZhcmlhYmxlKG91dCwgdHR5cGUsIGVsZW0pOwotCi0gIHRfZmllbGQgZmVsZW0odHR5cGUsIHRlbGVtX3B0ciArIGVsZW0pOwotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSwgIiIsICIiLCBlcnJvcl9yZXQpOwotCi0gIGluZGVudChvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBkZXRlcm1pbmUgYXJyYXkgdHlwZSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICBvdXQgPDwgImdfcHRyX2FycmF5X2FkZCAoIiA8PCBwcmVmaXggPDwgIiwgIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgb3V0IDw8ICJnX2FycmF5X2FwcGVuZF92YWxzICgiIDw8IHByZWZpeCA8PCAiLCAiIDw8IGVsZW0gPDwgIiwgMSk7IiA8PCBlbmRsOwotICAgICAgcmV0dXJuOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGFycmF5IGluZm8gZm9yIHR5cGUiOwotICAgIH0KLSAgfQotICBvdXQgPDwgImdfcHRyX2FycmF5X2FkZCAoIiA8PCBwcmVmaXggPDwgIiwgIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKLX0KLQotc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnJlZV9mdW5jX2Zyb21fdHlwZSh0X3R5cGUqIHR0eXBlKSB7Ci0gIGlmICh0dHlwZSA9PSBOVUxMKQotICAgIHJldHVybiAiTlVMTCI7Ci0KLSAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IGRldGVybWluZSBoYXNoIHR5cGUiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiZ19mcmVlIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0dHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgIHJldHVybiAidGhyaWZ0X3N0cmluZ19mcmVlIjsKLSAgICAgIH0KLSAgICAgIHJldHVybiAiZ19mcmVlIjsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBoYXNoIHRhYmxlIGluZm8gZm9yIHR5cGUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJOVUxMIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkgfHwgdHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICIoR0Rlc3Ryb3lOb3RpZnkpIGdfaGFzaF90YWJsZV9kZXN0cm95IjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc3RydWN0KCkpIHsKLSAgICByZXR1cm4gImdfb2JqZWN0X3VucmVmIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgdF90eXBlKiBldHlwZSA9ICgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICBpZiAoZXR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopZXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBkZXRlcm1pbmUgYXJyYXkgdHlwZSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIHJldHVybiAiKEdEZXN0cm95Tm90aWZ5KSBnX2FycmF5X3VucmVmIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICByZXR1cm4gIihHRGVzdHJveU5vdGlmeSkgZ19wdHJfYXJyYXlfdW5yZWYiOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBhcnJheSBpbmZvIGZvciB0eXBlIjsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGV0eXBlLT5pc19jb250YWluZXIoKSB8fCBldHlwZS0+aXNfc3RydWN0KCkpIHsKLSAgICAgIHJldHVybiAiKEdEZXN0cm95Tm90aWZ5KSBnX3B0cl9hcnJheV91bnJlZiI7Ci0gICAgICA7Ci0gICAgfSBlbHNlIGlmIChldHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICByZXR1cm4gIihHRGVzdHJveU5vdGlmeSkgZ19hcnJheV91bnJlZiI7Ci0gICAgfQotICAgIHByaW50ZigiVHlwZSBub3QgZXhwZWN0ZWQgaW5zaWRlIHRoZSBhcnJheTogJXNcbiIsIGV0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOwotICAgIHRocm93ICJUeXBlIG5vdCBleHBlY3RlZCBpbnNpZGUgYXJyYXkiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICByZXR1cm4gZ2VuZXJhdGVfZnJlZV9mdW5jX2Zyb21fdHlwZSgoKHRfdHlwZWRlZiopdHR5cGUpLT5nZXRfdHlwZSgpKTsKLSAgfQotICBwcmludGYoIlR5cGUgbm90IGV4cGVjdGVkOiAlc1xuIiwgdHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7Ci0gIHRocm93ICJUeXBlIG5vdCBleHBlY3RlZCI7Ci19Ci0KLXN0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2hhc2hfZnVuY19mcm9tX3R5cGUodF90eXBlKiB0dHlwZSkgewotICBpZiAodHR5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gIk5VTEwiOwotCi0gIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBkZXRlcm1pbmUgaGFzaCB0eXBlIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gImdfaW50X2hhc2giOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJnX2ludDY0X2hhc2giOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJnX2RvdWJsZV9oYXNoIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJldHVybiAiZ19zdHJfaGFzaCI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gaGFzaCB0YWJsZSBpbmZvIGZvciB0eXBlIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiZ19kaXJlY3RfaGFzaCI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSkgewotICAgIHJldHVybiAiZ19kaXJlY3RfaGFzaCI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgIHJldHVybiBnZW5lcmF0ZV9oYXNoX2Z1bmNfZnJvbV90eXBlKCgodF90eXBlZGVmKil0dHlwZSktPmdldF90eXBlKCkpOwotICB9Ci0gIHByaW50ZigiVHlwZSBub3QgZXhwZWN0ZWQ6ICVzXG4iLCB0dHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKLSAgdGhyb3cgIlR5cGUgbm90IGV4cGVjdGVkIjsKLX0KLQotc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY21wX2Z1bmNfZnJvbV90eXBlKHRfdHlwZSogdHR5cGUpIHsKLSAgaWYgKHR0eXBlID09IE5VTEwpCi0gICAgcmV0dXJuICJOVUxMIjsKLQotICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3QgZGV0ZXJtaW5lIGhhc2ggdHlwZSI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICJnX2ludF9lcXVhbCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gImdfaW50NjRfZXF1YWwiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJnX2RvdWJsZV9lcXVhbCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gImdfc3RyX2VxdWFsIjsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBoYXNoIHRhYmxlIGluZm8gZm9yIHR5cGUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJnX2RpcmVjdF9lcXVhbCI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSkgewotICAgIHJldHVybiAiZ19kaXJlY3RfZXF1YWwiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICByZXR1cm4gZ2VuZXJhdGVfY21wX2Z1bmNfZnJvbV90eXBlKCgodF90eXBlZGVmKil0dHlwZSktPmdldF90eXBlKCkpOwotICB9Ci0gIHByaW50ZigiVHlwZSBub3QgZXhwZWN0ZWQ6ICVzXG4iLCB0dHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKLSAgdGhyb3cgIlR5cGUgbm90IGV4cGVjdGVkIjsKLX0KLQotc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV3X2hhc2hfZnJvbV90eXBlKHRfdHlwZSoga2V5LCB0X3R5cGUqIHZhbHVlKSB7Ci0gIHN0cmluZyBoYXNoX2Z1bmMgPSBnZW5lcmF0ZV9oYXNoX2Z1bmNfZnJvbV90eXBlKGtleSk7Ci0gIHN0cmluZyBjbXBfZnVuYyA9IGdlbmVyYXRlX2NtcF9mdW5jX2Zyb21fdHlwZShrZXkpOwotICBzdHJpbmcga2V5X2ZyZWVfZnVuYyA9IGdlbmVyYXRlX2ZyZWVfZnVuY19mcm9tX3R5cGUoa2V5KTsKLSAgc3RyaW5nIHZhbHVlX2ZyZWVfZnVuYyA9IGdlbmVyYXRlX2ZyZWVfZnVuY19mcm9tX3R5cGUodmFsdWUpOwotCi0gIHJldHVybiAiZ19oYXNoX3RhYmxlX25ld19mdWxsICgiICsgaGFzaF9mdW5jICsgIiwgIiArIGNtcF9mdW5jICsgIiwgIiArIGtleV9mcmVlX2Z1bmMgKyAiLCAiCi0gICAgICAgICArIHZhbHVlX2ZyZWVfZnVuYyArICIpOyI7Ci19Ci0KLXN0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX25ld19hcnJheV9mcm9tX3R5cGUodF90eXBlKiB0dHlwZSkgewotICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3QgZGV0ZXJtaW5lIGFycmF5IHR5cGUiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJnX2FycmF5X25ldyAoMCwgMSwgc2l6ZW9mIChnYm9vbGVhbikpOyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJnX2FycmF5X25ldyAoMCwgMSwgc2l6ZW9mIChnaW50OCkpOyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gImdfYXJyYXlfbmV3ICgwLCAxLCBzaXplb2YgKGdpbnQxNikpOyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gImdfYXJyYXlfbmV3ICgwLCAxLCBzaXplb2YgKGdpbnQzMikpOyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gImdfYXJyYXlfbmV3ICgwLCAxLCBzaXplb2YgKGdpbnQ2NCkpOyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gImdfYXJyYXlfbmV3ICgwLCAxLCBzaXplb2YgKGdkb3VibGUpKTsiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICJnX3B0cl9hcnJheV9uZXdfd2l0aF9mcmVlX2Z1bmMgKGdfZnJlZSk7IjsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBhcnJheSBpbmZvIGZvciB0eXBlIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiZ19hcnJheV9uZXcgKDAsIDEsIHNpemVvZiAoZ2ludDMyKSk7IjsKLSAgfSBlbHNlIHsKLSAgICBzdHJpbmcgZnJlZV9mdW5jID0gZ2VuZXJhdGVfZnJlZV9mdW5jX2Zyb21fdHlwZSh0dHlwZSk7Ci0gICAgcmV0dXJuICJnX3B0cl9hcnJheV9uZXdfd2l0aF9mcmVlX2Z1bmMgKCIgKyBmcmVlX2Z1bmMgKyAiKTsiOwotICB9Ci0KLSAgcmV0dXJuICJnX3B0cl9hcnJheV9uZXcoKTsiOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBVVElMSVRZIEZVTkNUSU9OUyAgICAgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIFVwcGVyIGNhc2UgYSBzdHJpbmcuICBXcmFwcyBib29zdCdzIHN0cmluZyB1dGlsaXR5LgotICovCi1zdHJpbmcgdG9fdXBwZXJfY2FzZShzdHJpbmcgbmFtZSkgewotICBzdHJpbmcgcyhuYW1lKTsKLSAgc3RkOjp0cmFuc2Zvcm0ocy5iZWdpbigpLCBzLmVuZCgpLCBzLmJlZ2luKCksIDo6dG91cHBlcik7Ci0gIHJldHVybiBzOwotICAvLyAgcmV0dXJuIGJvb3N0Ojp0b191cHBlcl9jb3B5IChuYW1lKTsKLX0KLQotLyoqCi0gKiBMb3dlciBjYXNlIGEgc3RyaW5nLiAgV3JhcHMgYm9vc3QncyBzdHJpbmcgdXRpbGl0eS4KLSAqLwotc3RyaW5nIHRvX2xvd2VyX2Nhc2Uoc3RyaW5nIG5hbWUpIHsKLSAgc3RyaW5nIHMobmFtZSk7Ci0gIHN0ZDo6dHJhbnNmb3JtKHMuYmVnaW4oKSwgcy5lbmQoKSwgcy5iZWdpbigpLCA6OnRvbG93ZXIpOwotICByZXR1cm4gczsKLSAgLy8gIHJldHVybiBib29zdDo6dG9fbG93ZXJfY29weSAobmFtZSk7Ci19Ci0KLS8qKgotICogTWFrZXMgYSBzdHJpbmcgZnJpZW5kbHkgdG8gQyBjb2RlIHN0YW5kYXJkcyBieSBsb3dlcmNhc2luZyBhbmQgYWRkaW5nCi0gKiB1bmRlcnNjb3Jlcywgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIuICBGb3IgZXhhbXBsZToKLSAqCi0gKiBJbnB1dDogIlpvbWdDYW1lbENhc2UiCi0gKiBPdXRwdXQ6ICJ6b21nX2NhbWVsX2Nhc2UiCi0gKi8KLXN0cmluZyBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoc3RyaW5nIG5hbWUpIHsKLSAgc3RyaW5nIHJldDsKLSAgY29uc3QgY2hhciogdG1wID0gbmFtZS5jX3N0cigpOwotICBpbnQgcG9zID0gMDsKLQotICAvKiB0aGUgZmlyc3QgY2hhcmFjdGVyIGlzbid0IHVuZGVyc2NvcmVkIGlmIHVwcGVyY2FzZSwganVzdCBsb3dlcmNhc2VkICovCi0gIHJldCArPSB0b2xvd2VyKHRtcFtwb3NdKTsKLSAgcG9zKys7Ci0gIGZvciAodW5zaWduZWQgaW50IGkgPSBwb3M7IGkgPCBuYW1lLmxlbmd0aCgpOyBpKyspIHsKLSAgICBjaGFyIGxjID0gdG9sb3dlcih0bXBbaV0pOwotICAgIGlmIChsYyAhPSB0bXBbaV0pIHsKLSAgICAgIHJldCArPSAnXyc7Ci0gICAgfQotICAgIHJldCArPSBsYzsKLSAgfQotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qKgotICogUGVyZm9ybXMgdGhlIHJldmVyc2Ugb3BlcmF0aW9uIG9mIGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlczogVGhlIGZpcnN0Ci0gKiBjaGFyYWN0ZXIgb2YgdGhlIHN0cmluZyBpcyBtYWRlIHVwcGVyY2FzZSwgYWxvbmcgd2l0aCBlYWNoIGNoYXJhY3RlciB0aGF0Ci0gKiBmb2xsb3dzIGFuIHVuZGVyc2NvcmUgKHdoaWNoIGlzIHJlbW92ZWQpLiBVc2VmdWwgZm9yIGNvbnZlcnRpbmcgVGhyaWZ0Ci0gKiBzZXJ2aWNlLW1ldGhvZCBuYW1lcyBpbnRvIEdPYmplY3Qtc3R5bGUgY2xhc3MgbmFtZXMuCi0gKgotICogSW5wdXQ6ICJ6b21nX2NhbWVsX2Nhc2UiCi0gKiBPdXRwdXQ6ICJab21nQ2FtZWxDYXNlIgotICovCi1zdHJpbmcgdW5kZXJzY29yZXNfdG9faW5pdGlhbF9jYXBzKHN0cmluZyBuYW1lKSB7Ci0gIHN0cmluZyByZXQ7Ci0gIGNvbnN0IGNoYXIqIHRtcCA9IG5hbWUuY19zdHIoKTsKLSAgYm9vbCB1cHBlcmNhc2VfbmV4dCA9IHRydWU7Ci0KLSAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBuYW1lLmxlbmd0aCgpOyBpKyspIHsKLSAgICBjaGFyIGMgPSB0bXBbaV07Ci0gICAgaWYgKGMgPT0gJ18nKSB7Ci0gICAgICB1cHBlcmNhc2VfbmV4dCA9IHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmICh1cHBlcmNhc2VfbmV4dCkgewotICAgICAgICByZXQgKz0gdG91cHBlcihjKTsKLSAgICAgICAgdXBwZXJjYXNlX25leHQgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldCArPSBjOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIHJlZ2lzdGVyIHRoaXMgZ2VuZXJhdG9yIHdpdGggdGhlIG1haW4gcHJvZ3JhbSAqLwotVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihjX2dsaWIsICJDLCB1c2luZyBHTGliIiwgIiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfY29jb2FfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2NvY29hX2dlbmVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkwYzkzNy4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfY29jb2FfZ2VuZXJhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjg1NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSAidF9vb3BfZ2VuZXJhdG9yLmgiCi0jaW5jbHVkZSAicGxhdGZvcm0uaCIKLQotdXNpbmcgc3RkOjptYXA7Ci11c2luZyBzdGQ6Om9mc3RyZWFtOwotdXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwotdXNpbmcgc3RkOjpzdHJpbmc7Ci11c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKLXVzaW5nIHN0ZDo6dmVjdG9yOwotCi1zdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCi0KLS8qKgotICogT2JqZWN0aXZlLUMgY29kZSBnZW5lcmF0b3IuCi0gKgotICogbW9zdGx5IGNvcHkvcGFzdGluZy90d2Vha2luZyBmcm9tIG1jc2xlZSdzIHdvcmsuCi0gKi8KLWNsYXNzIHRfY29jb2FfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7Ci1wdWJsaWM6Ci0gIHRfY29jb2FfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQotICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKLSAgICAodm9pZClvcHRpb25fc3RyaW5nOwotICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgibG9nX3VuZXhwZWN0ZWQiKTsKLSAgICBsb2dfdW5leHBlY3RlZF8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgidmFsaWRhdGVfcmVxdWlyZWQiKTsKLSAgICB2YWxpZGF0ZV9yZXF1aXJlZF8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgiYXN5bmNfY2xpZW50cyIpOwotICAgIGFzeW5jX2NsaWVudHNfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tY29jb2EiOwotICB9Ci0KLSAgLyoqCi0gICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKLSAgICovCi0KLSAgdm9pZCBpbml0X2dlbmVyYXRvcigpOwotICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOwotCi0gIHZvaWQgZ2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpOwotCi0gIC8qKgotICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKLSAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLQotICB2b2lkIHByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlZnZhbCA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcHJvcGVydHkgPSBmYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZShvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNvbnRhaW5lcml6ZV9pdCA9IGZhbHNlKTsKLQotICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbnRlcmZhY2Uoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UpOwotICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbXBsZW1lbnRhdGlvbihzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UpOwotICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbml0aWFsaXplcl9zaWduYXR1cmUoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2luaXRfd2l0aF9jb2Rlcl9tZXRob2Qob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2VuY29kZV93aXRoX2NvZGVyX21ldGhvZChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2hhc2hfbWV0aG9kKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaXNfZXF1YWxfbWV0aG9kKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfZmllbGRfYWNjZXNzb3JfZGVjbGFyYXRpb25zKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9maWVsZF9hY2Nlc3Nvcl9pbXBsZW1lbnRhdGlvbnMoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X3JlYWRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF92YWxpZGF0b3Ioc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2Rlc2NyaXB0aW9uKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotCi0gIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3Jlc3VsdF9oZWxwZXJfc3RydWN0X3R5cGUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fYXJnc19oZWxwZXJfc3RydWN0X3R5cGUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0KLSAgLyoqCi0gICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX3Byb3RvY29sKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9hc3luY19wcm90b2NvbChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOwotCi0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfaW50ZXJmYWNlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfYXN5bmNfaW50ZXJmYWNlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9zZW5kX2Z1bmN0aW9uX2ltcGxlbWVudGF0aW9uKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotICB2b2lkIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X3NlbmRfZnVuY3Rpb25faW52b2NhdGlvbihvZnN0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotICB2b2lkIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X3JlY3ZfZnVuY3Rpb25faW1wbGVtZW50YXRpb24ob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfaW1wbGVtZW50YXRpb24oc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9hc3luY19pbXBsZW1lbnRhdGlvbihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOwotCi0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9zZXJ2ZXJfaW50ZXJmYWNlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9zZXJ2ZXJfaW1wbGVtZW50YXRpb24oc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gIC8qKgotICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgZmllbGROYW1lKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgZmllbGROYW1lID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBtYXApOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBsaXN0TmFtZSk7Ci0KLSAgLyoqCi0gICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCi0gICAqLwotCi0gIHN0ZDo6c3RyaW5nIGNvY29hX3ByZWZpeCgpOwotICBzdGQ6OnN0cmluZyBjb2NvYV9pbXBvcnRzKCk7Ci0gIHN0ZDo6c3RyaW5nIGNvY29hX3RocmlmdF9pbXBvcnRzKCk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGNsYXNzX3JlZiA9IGZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgYmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHRiYXNlKTsKLSAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQpOwotICBzdGQ6OnN0cmluZyBkZWNsYXJlX3Byb3BlcnR5KHRfZmllbGQqIHRmaWVsZCk7Ci0gIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotICBzdGQ6OnN0cmluZyBhc3luY19mdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLSAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKLSAgc3RkOjpzdHJpbmcgZm9ybWF0X3N0cmluZ19mb3JfdHlwZSh0X3R5cGUqIHR5cGUpOwotICBzdGQ6OnN0cmluZyBjYWxsX2ZpZWxkX3NldHRlcih0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIGZpZWxkTmFtZSk7Ci0gIHN0ZDo6c3RyaW5nIGNvbnRhaW5lcml6ZSh0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBmaWVsZE5hbWUpOwotICBzdGQ6OnN0cmluZyBkZWNvbnRhaW5lcml6ZSh0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIGZpZWxkTmFtZSk7Ci0KLSAgYm9vbCB0eXBlX2Nhbl9iZV9udWxsKHRfdHlwZSogdHR5cGUpIHsKLSAgICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOwotCi0gICAgcmV0dXJuIHR0eXBlLT5pc19jb250YWluZXIoKSB8fCB0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkKLSAgICAgICAgICAgfHwgdHR5cGUtPmlzX3N0cmluZygpOwotICB9Ci0KLXByaXZhdGU6Ci0gIHN0ZDo6c3RyaW5nIGNvY29hX3ByZWZpeF87Ci0gIHN0ZDo6c3RyaW5nIGNvbnN0YW50c19kZWNsYXJhdGlvbnNfOwotCi0gIC8qKgotICAgKiBGaWxlIHN0cmVhbXMKLSAgICovCi0KLSAgc3RkOjpvZnN0cmVhbSBmX2hlYWRlcl87Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9pbXBsXzsKLQotICBib29sIGxvZ191bmV4cGVjdGVkXzsKLSAgYm9vbCB2YWxpZGF0ZV9yZXF1aXJlZF87Ci0gIGJvb2wgYXN5bmNfY2xpZW50c187Ci19OwotCi0vKioKLSAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0Ci0gKiBzdHJlYW1zLgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKLSAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5Ci0gIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7Ci0gIGNvY29hX3ByZWZpeF8gPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiY29jb2EiKTsKLQotICAvLyB3ZSBoYXZlIGEgLmggaGVhZGVyIGZpbGUuLi4KLSAgc3RyaW5nIGZfaGVhZGVyX25hbWUgPSBwcm9ncmFtX25hbWVfICsgIi5oIjsKLSAgc3RyaW5nIGZfaGVhZGVyX2Z1bGxuYW1lID0gZ2V0X291dF9kaXIoKSArIGZfaGVhZGVyX25hbWU7Ci0gIGZfaGVhZGVyXy5vcGVuKGZfaGVhZGVyX2Z1bGxuYW1lLmNfc3RyKCkpOwotCi0gIGZfaGVhZGVyXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOwotCi0gIGZfaGVhZGVyXyA8PCBjb2NvYV9pbXBvcnRzKCkgPDwgY29jb2FfdGhyaWZ0X2ltcG9ydHMoKTsKLQotICAvLyAuLi5hbmQgYSAubSBpbXBsZW1lbnRhdGlvbiBmaWxlCi0gIHN0cmluZyBmX2ltcGxfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwcm9ncmFtX25hbWVfICsgIi5tIjsKLSAgZl9pbXBsXy5vcGVuKGZfaW1wbF9uYW1lLmNfc3RyKCkpOwotCi0gIGZfaW1wbF8gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKLQotICBmX2ltcGxfIDw8IGNvY29hX2ltcG9ydHMoKSA8PCBjb2NvYV90aHJpZnRfaW1wb3J0cygpIDw8ICIjaW1wb3J0IFwiIiA8PCBmX2hlYWRlcl9uYW1lIDw8ICJcIiIKLSAgICAgICAgICA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogUHJpbnRzIHN0YW5kYXJkIENvY29hIGltcG9ydHMKLSAqCi0gKiBAcmV0dXJuIExpc3Qgb2YgaW1wb3J0cyBmb3IgQ29jb2EgbGlicmFyaWVzCi0gKi8KLXN0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6Y29jb2FfaW1wb3J0cygpIHsKLSAgcmV0dXJuIHN0cmluZygpICsgIiNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPlxuIiArICJcbiI7Ci19Ci0KLS8qKgotICogUHJpbnRzIHRocmlmdCBydW50aW1lIGltcG9ydHMKLSAqCi0gKiBAcmV0dXJuIExpc3Qgb2YgaW1wb3J0cyBuZWNlc3NhcnkgZm9yIHRocmlmdCBydW50aW1lCi0gKi8KLXN0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6Y29jb2FfdGhyaWZ0X2ltcG9ydHMoKSB7Ci0gIHN0cmluZyByZXN1bHQgPSBzdHJpbmcoKSArICIjaW1wb3J0IFwiVFByb3RvY29sLmhcIlxuIiArICIjaW1wb3J0IFwiVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmhcIlxuIgotICAgICAgICAgICAgICAgICAgKyAiI2ltcG9ydCBcIlRQcm90b2NvbEV4Y2VwdGlvbi5oXCJcbiIgCi0gICAgICAgICAgICAgICAgICArICIjaW1wb3J0IFwiVFByb3RvY29sVXRpbC5oXCJcbiIKLSAgICAgICAgICAgICAgICAgICsgIiNpbXBvcnQgXCJUUHJvY2Vzc29yLmhcIlxuIiAKLSAgICAgICAgICAgICAgICAgICsgIiNpbXBvcnQgXCJUT2JqZWN0aXZlLUMuaFwiXG4iCi0gICAgICAgICAgICAgICAgICArICIjaW1wb3J0IFwiVEJhc2UuaFwiXG4iCi0gICAgICAgICAgICAgICAgICArICIjaW1wb3J0IFwiVEFzeW5jVHJhbnNwb3J0LmhcIlxuIgotICAgICAgICAgICAgICAgICAgKyAiI2ltcG9ydCBcIlRQcm90b2NvbEZhY3RvcnkuaFwiXG4iCi0gICAgICAgICAgICAgICAgICArICIjaW1wb3J0IFwiVEJhc2VDbGllbnQuaFwiXG4iIAotICAgICAgICAgICAgICAgICAgKyAiXG4iOwotCi0gIC8vIEluY2x1ZGUgb3RoZXIgVGhyaWZ0IGluY2x1ZGVzCi0gIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKLSAgICByZXN1bHQgKz0gIiNpbXBvcnQgXCIiICsgaW5jbHVkZXNbaV0tPmdldF9uYW1lKCkgKyAiLmhcIiIgKyAiXG4iOwotICB9Ci0gIHJlc3VsdCArPSAiXG4iOwotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogRmluaXNoIHVwIGdlbmVyYXRpb24uCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKLSAgLy8gc3RpY2sgb3VyIGNvbnN0YW50cyBkZWNsYXJhdGlvbnMgYXQgdGhlIGVuZCBvZiB0aGUgaGVhZGVyIGZpbGUKLSAgLy8gc2luY2UgdGhleSByZWZlciB0byB0aGluZ3Mgd2UgYXJlIGRlZmluaW5nLgotICBmX2hlYWRlcl8gPDwgY29uc3RhbnRzX2RlY2xhcmF0aW9uc18gPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBUaGlzIGlzIGp1c3QgYSBzaW1wbGUgMS1saW5lciBpbiBvYmplY3RpdmUtYwotICoKLSAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgewotICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInR5cGVkZWYgIiA8PCB0eXBlX25hbWUodHR5cGVkZWYtPmdldF90eXBlKCkpIDw8ICIgIiA8PCBjb2NvYV9wcmVmaXhfCi0gICAgICAgICAgICA8PCB0dHlwZWRlZi0+Z2V0X3N5bWJvbGljKCkgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgY29kZSBmb3IgYW4gZW51bWVyYXRlZCB0eXBlLiBJbiBPYmplY3RpdmUtQywgdGhpcyBpcwotICogZXNzZW50aWFsbHkgdGhlIHNhbWUgYXMgdGhlIHRocmlmdCBkZWZpbml0aW9uIGl0c2VsZiwgdXNpbmcgdGhlCi0gKiBlbnVtIGtleXdvcmQgaW4gT2JqZWN0aXZlLUMuICBGb3IgbmFtZXNwYWNlIHB1cnBvc2VzLCB0aGUgbmFtZSBvZgotICogdGhlIGVudW0gcGx1cyBhbiB1bmRlcnNjb3JlIGlzIHByZWZpeGVkIG9udG8gZWFjaCBlbGVtZW50LgotICoKLSAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0gIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiZW51bSAiIDw8IGNvY29hX3ByZWZpeF8gPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgZl9oZWFkZXJfIDw8ICIsIiA8PCBlbmRsOwotICAgIH0KLSAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIl8iIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICBmX2hlYWRlcl8gPDwgIiA9ICIgPDwgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfaGVhZGVyXyA8PCBlbmRsIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGNsYXNzIHRoYXQgaG9sZHMgYWxsIHRoZSBjb25zdGFudHMuICBQcmltaXRpdmUgdmFsdWVzCi0gKiBjb3VsZCBoYXZlIGJlZW4gcGxhY2VkIG91dHNpZGUgdGhpcyBjbGFzcywgYnV0IEkganVzdCBwdXQKLSAqIGV2ZXJ5dGhpbmcgaW4gZm9yIGNvbnNpc3RlbmN5LgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gY29uc3RfaW50ZXJmYWNlOwotICBzdHJpbmcgY29uc3RhbnRzX2NsYXNzX25hbWUgPSBjb2NvYV9wcmVmaXhfICsgcHJvZ3JhbV9uYW1lXyArICJDb25zdGFudHMiOwotCi0gIGNvbnN0X2ludGVyZmFjZSA8PCAiQGludGVyZmFjZSAiIDw8IGNvbnN0YW50c19jbGFzc19uYW1lIDw8ICIgOiBOU09iamVjdCAiOwotICBzY29wZV91cChjb25zdF9pbnRlcmZhY2UpOwotICBzY29wZV9kb3duKGNvbnN0X2ludGVyZmFjZSk7Ci0KLSAgLy8gZ2V0dGVyIG1ldGhvZCBmb3IgZWFjaCBjb25zdGFudCBkZWZpbmVkLgotICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgc3RyaW5nIG5hbWUgPSAoKmNfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgdF90eXBlKiB0eXBlID0gKCpjX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgIGNvbnN0X2ludGVyZmFjZSA8PCAiKyAoIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIikgIiA8PCBuYW1lIDw8ICI7IiA8PCBlbmRsOwotICB9Ci0KLSAgY29uc3RfaW50ZXJmYWNlIDw8ICJAZW5kIjsKLQotICAvLyB0aGlzIGdldHMgc3BpdCBpbnRvIHRoZSBoZWFkZXIgZmlsZSBpbiA6OmNsb3NlX2dlbmVyYXRvcgotICBjb25zdGFudHNfZGVjbGFyYXRpb25zXyA9IGNvbnN0X2ludGVyZmFjZS5zdHIoKTsKLQotICAvLyBzdGF0aWMgdmFyaWFibGVzIGluIHRoZSAubSBob2xkIGFsbCBjb25zdGFudCB2YWx1ZXMKLSAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBzdHJpbmcgbmFtZSA9ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICB0X3R5cGUqIHR5cGUgPSAoKmNfaXRlciktPmdldF90eXBlKCk7Ci0gICAgZl9pbXBsXyA8PCAic3RhdGljICIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIiA8PCBjb2NvYV9wcmVmaXhfIDw8IG5hbWU7Ci0gICAgaWYgKCF0eXBlLT5pc19jb250YWluZXIoKSAmJiAhdHlwZS0+aXNfc3RydWN0KCkpIHsKLSAgICAgIGZfaW1wbF8gPDwgIiA9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGZfaW1wbF8sIHR5cGUsICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkpOwotICAgIH0KLSAgICBmX2ltcGxfIDw8ICI7IiA8PCBlbmRsOwotICB9Ci0gIGZfaW1wbF8gPDwgZW5kbDsKLQotICBmX2ltcGxfIDw8ICJAaW1wbGVtZW50YXRpb24gIiA8PCBjb25zdGFudHNfY2xhc3NfbmFtZSA8PCBlbmRsOwotCi0gIC8vIGluaXRpYWxpemUgY29tcGxleCBjb25zdGFudHMgd2hlbiB0aGUgY2xhc3MgaXMgbG9hZGVkCi0gIGZfaW1wbF8gPDwgIisgKHZvaWQpIGluaXRpYWxpemUgIjsKLSAgc2NvcGVfdXAoZl9pbXBsXyk7Ci0KLSAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpZiAoKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLT5pc19jb250YWluZXIoKSB8fCAoKmNfaXRlciktPmdldF90eXBlKCktPmlzX3N0cnVjdCgpKSB7Ci0gICAgICBwcmludF9jb25zdF92YWx1ZShmX2ltcGxfLAotICAgICAgICAgICAgICAgICAgICAgICAgY29jb2FfcHJlZml4XyArICgqY19pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLSAgICAgIGZfaW1wbF8gPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0gIHNjb3BlX2Rvd24oZl9pbXBsXyk7Ci0KLSAgLy8gZ2V0dGVyIG1ldGhvZCBmb3IgZWFjaCBjb25zdGFudAotICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgewotICAgIHN0cmluZyBuYW1lID0gKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIHRfdHlwZSogdHlwZSA9ICgqY19pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICBmX2ltcGxfIDw8ICIrICgiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKSAiIDw8IG5hbWU7Ci0gICAgc2NvcGVfdXAoZl9pbXBsXyk7Ci0gICAgaW5kZW50KGZfaW1wbF8pIDw8ICJyZXR1cm4gIiA8PCBjb2NvYV9wcmVmaXhfIDw8IG5hbWUgPDwgIjsiIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihmX2ltcGxfKTsKLSAgfQotCi0gIGZfaW1wbF8gPDwgIkBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLiBUaGlzIGlzIGEgY2xhc3MKLSAqIHdpdGggcHJvdGVjdGVkIGRhdGEgbWVtYmVycywgcmVhZCgpLCB3cml0ZSgpLCBhbmQgZ2V0dGVycyBhbmQgc2V0dGVycy4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbnRlcmZhY2UoZl9oZWFkZXJfLCB0c3RydWN0LCBmYWxzZSk7Ci0gIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbXBsZW1lbnRhdGlvbihmX2ltcGxfLCB0c3RydWN0LCBmYWxzZSk7Ci19Ci0KLS8qKgotICogRXhjZXB0aW9ucyBhcmUgc3RydWN0cywgYnV0IHRoZXkgaW5oZXJpdCBmcm9tIE5TRXhjZXB0aW9uCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ludGVyZmFjZShmX2hlYWRlcl8sIHR4Y2VwdGlvbiwgdHJ1ZSk7Ci0gIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbXBsZW1lbnRhdGlvbihmX2ltcGxfLCB0eGNlcHRpb24sIHRydWUpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlIHRoZSBpbnRlcmZhY2UgZm9yIGEgc3RydWN0Ci0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbnRlcmZhY2Uob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0gIG91dCA8PCAiQGludGVyZmFjZSAiIDw8IGNvY29hX3ByZWZpeF8gPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIDogIjsKLQotICBpZiAoaXNfZXhjZXB0aW9uKSB7Ci0gICAgb3V0IDw8ICJOU0V4Y2VwdGlvbiAiOwotICB9IGVsc2UgewotICAgIG91dCA8PCAiTlNPYmplY3QgIjsKLSAgfQotICBvdXQgPDwgIjxUQmFzZSwgTlNDb2Rpbmc+ICI7Ci0KLSAgc2NvcGVfdXAob3V0KTsKLQotICAvLyBtZW1iZXJzIGFyZSBwcm90ZWN0ZWQuICB0aGlzIGlzIHJlZHVuZGFudCwgYnV0IGV4cGxpY2l0LgotICAvLyAgZl9oZWFkZXJfIDw8IGVuZGwgPDwgIkBwcm90ZWN0ZWQ6IiA8PCBlbmRsOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotCi0gIC8vIG1lbWJlciB2YXJpYWxiZXMKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8IGRlY2xhcmVfZmllbGQoKm1faXRlcikgPDwgZW5kbDsKLSAgfQotCi0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICBvdXQgPDwgZW5kbDsKLSAgICAvLyBpc3NldCBmaWVsZHMKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiQk9PTCBfXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJfaXNzZXQ7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLSAgb3V0IDw8IGVuZGw7Ci0KLSAgLy8gcHJvcGVydGllcwotICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7Ci0gICAgb3V0IDw8ICIjaWYgVEFSR0VUX09TX0lQSE9ORSB8fCAoTUFDX09TX1hfVkVSU0lPTl9NQVhfQUxMT1dFRCA+PSBNQUNfT1NfWF9WRVJTSU9OXzEwXzUpIgotICAgICAgICA8PCBlbmRsOwotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBkZWNsYXJlX3Byb3BlcnR5KCptX2l0ZXIpIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCAiI2VuZGlmIiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBkZWZhdWx0IGluaXRpYWxpemVyCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiLSAoaWQpIGluaXQ7IiA8PCBlbmRsOwotCi0gIC8vIGluaXRpYWxpemVyIGZvciBhbGwgZmllbGRzCi0gIGlmICghbWVtYmVycy5lbXB0eSgpKSB7Ci0gICAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2luaXRpYWxpemVyX3NpZ25hdHVyZShvdXQsIHRzdHJ1Y3QpOwotICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKLSAgfQotICBvdXQgPDwgZW5kbDsKLQotICAvLyByZWFkIGFuZCB3cml0ZQotICBvdXQgPDwgIi0gKHZvaWQpIHJlYWQ6IChpZCA8VFByb3RvY29sPikgaW5Qcm90b2NvbDsiIDw8IGVuZGw7Ci0gIG91dCA8PCAiLSAodm9pZCkgd3JpdGU6IChpZCA8VFByb3RvY29sPikgb3V0UHJvdG9jb2w7IiA8PCBlbmRsOwotICBvdXQgPDwgZW5kbDsKLQotICAvLyB2YWxpZGF0b3IKLSAgb3V0IDw8ICItICh2b2lkKSB2YWxpZGF0ZTsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBnZXR0ZXJzIGFuZCBzZXR0ZXJzCi0gIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9maWVsZF9hY2Nlc3Nvcl9kZWNsYXJhdGlvbnMob3V0LCB0c3RydWN0LCBpc19leGNlcHRpb24pOwotCi0gIG91dCA8PCAiQGVuZCIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlIHNpZ25hdHVyZSBmb3IgaW5pdGlhbGl6ZXIgb2Ygc3RydWN0IHdpdGggYSBwYXJhbWV0ZXIgZm9yCi0gKiBlYWNoIGZpZWxkLgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW5pdGlhbGl6ZXJfc2lnbmF0dXJlKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIGluZGVudChvdXQpIDw8ICItIChpZCkgaW5pdFdpdGgiOwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7KSB7Ci0gICAgaWYgKG1faXRlciA9PSBtZW1iZXJzLmJlZ2luKCkpIHsKLSAgICAgIG91dCA8PCBjYXBpdGFsaXplKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCAoKm1faXRlciktPmdldF9uYW1lKCk7Ci0gICAgfQotICAgIG91dCA8PCAiOiAoIiA8PCB0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICArK21faXRlcjsKLSAgICBpZiAobV9pdGVyICE9IG1lbWJlcnMuZW5kKCkpIHsKLSAgICAgIG91dCA8PCAiICI7Ci0gICAgfQotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGUgZ2V0dGVyIGFuZCBzZXR0ZXIgZGVjbGFyYXRpb25zIGZvciBhbGwgZmllbGRzLCBwbHVzIGFuCi0gKiBJc1NldCBnZXR0ZXIuCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF9maWVsZF9hY2Nlc3Nvcl9kZWNsYXJhdGlvbnMob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0gICh2b2lkKWlzX2V4Y2VwdGlvbjsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiI2lmICFfX2hhc19mZWF0dXJlKG9iamNfYXJjKSIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIi0gKCIgPDwgdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgIgotICAgICAgICA8PCBkZWNhcGl0YWxpemUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOyIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIi0gKHZvaWQpIHNldCIgPDwgY2FwaXRhbGl6ZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8ICI6ICgiCi0gICAgICAgIDw8IHR5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICIpICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiI2VuZGlmIiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiLSAoQk9PTCkgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIklzU2V0OyIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGUgdGhlIGluaXRXaXRoQ29kZXIgbWV0aG9kIGZvciB0aGlzIHN0cnVjdCBzbyBpdCdzIGNvbXBhdGlibGUgd2l0aAotICogdGhlIE5TQ29kaW5nIHByb3RvY29sCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbml0X3dpdGhfY29kZXJfbWV0aG9kKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0gIGluZGVudChvdXQpIDw8ICItIChpZCkgaW5pdFdpdGhDb2RlcjogKE5TQ29kZXIgKikgZGVjb2RlciIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIC8vIE5TRXhjZXB0aW9ucyBjb25mb3JtIHRvIE5TQ29kaW5nLCBzbyB3ZSBjYW4gY2FsbCBzdXBlcgotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAic2VsZiA9IFtzdXBlciBpbml0V2l0aENvZGVyOiBkZWNvZGVyXTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJzZWxmID0gW3N1cGVyIGluaXRdOyIgPDwgZW5kbDsKLSAgfQotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChbZGVjb2RlciBjb250YWluc1ZhbHVlRm9yS2V5OiBAXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdKSIKLSAgICAgICAgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiX18iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIjsKLSAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0KSkgewotICAgICAgb3V0IDw8ICJbW2RlY29kZXIgZGVjb2RlT2JqZWN0Rm9yS2V5OiBAXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdIHJldGFpbl9zdHViXTsiCi0gICAgICAgICAgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKHQtPmlzX2VudW0oKSkgewotICAgICAgb3V0IDw8ICJbZGVjb2RlciBkZWNvZGVJbnRGb3JLZXk6IEBcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdCktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIG91dCA8PCAiW2RlY29kZXIgZGVjb2RlQm9vbEZvcktleTogQFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBvdXQgPDwgIltkZWNvZGVyIGRlY29kZUludEZvcktleTogQFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIG91dCA8PCAiW2RlY29kZXIgZGVjb2RlSW50Rm9yS2V5OiBAXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgb3V0IDw8ICJbZGVjb2RlciBkZWNvZGVJbnQzMkZvcktleTogQFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIG91dCA8PCAiW2RlY29kZXIgZGVjb2RlSW50NjRGb3JLZXk6IEBcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgIltkZWNvZGVyIGRlY29kZURvdWJsZUZvcktleTogQFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBkb24ndCBrbm93IGhvdyB0byBkZWNvZGUgdGhyaWZ0IHR5cGU6ICIKLSAgICAgICAgICAgICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJfXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJfaXNzZXQgPSBZRVM7IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgfQotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHNlbGY7IiA8PCBlbmRsOwotICBzY29wZV9kb3duKG91dCk7Ci0gIG91dCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlIHRoZSBlbmNvZGVXaXRoQ29kZXIgbWV0aG9kIGZvciB0aGlzIHN0cnVjdCBzbyBpdCdzIGNvbXBhdGlibGUgd2l0aAotICogdGhlIE5TQ29kaW5nIHByb3RvY29sCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF9lbmNvZGVfd2l0aF9jb2Rlcl9tZXRob2Qob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0gIGluZGVudChvdXQpIDw8ICItICh2b2lkKSBlbmNvZGVXaXRoQ29kZXI6IChOU0NvZGVyICopIGVuY29kZXIiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0gIGlmIChpc19leGNlcHRpb24pIHsKLSAgICAvLyBOU0V4Y2VwdGlvbnMgY29uZm9ybSB0byBOU0NvZGluZywgc28gd2UgY2FuIGNhbGwgc3VwZXIKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltzdXBlciBlbmNvZGVXaXRoQ29kZXI6IGVuY29kZXJdOyIgPDwgZW5kbDsKLSAgfQotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChfXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJfaXNzZXQpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgLy8gb3V0IDw8IGluZGVudCgpIDw8ICJfXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiOwotICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHQpKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltlbmNvZGVyIGVuY29kZU9iamVjdDogX18iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZvcktleTogQFwiIgotICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKHQtPmlzX2VudW0oKSkgewotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbZW5jb2RlciBlbmNvZGVJbnQ6IF9fIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiBmb3JLZXk6IEBcIiIKLSAgICAgICAgICA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0KS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbZW5jb2RlciBlbmNvZGVCb29sOiBfXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZm9yS2V5OiBAXCIiCi0gICAgICAgICAgICA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltlbmNvZGVyIGVuY29kZUludDogX18iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZvcktleTogQFwiIgotICAgICAgICAgICAgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltlbmNvZGVyIGVuY29kZUludDogX18iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZvcktleTogQFwiIgotICAgICAgICAgICAgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltlbmNvZGVyIGVuY29kZUludDMyOiBfXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZm9yS2V5OiBAXCIiCi0gICAgICAgICAgICA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW2VuY29kZXIgZW5jb2RlSW50NjQ6IF9fIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiBmb3JLZXk6IEBcIiIKLSAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbZW5jb2RlciBlbmNvZGVEb3VibGU6IF9fIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiBmb3JLZXk6IEBcIiIKLSAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGRvbid0IGtub3cgaG93IHRvIGVuY29kZSB0aHJpZnQgdHlwZTogIgotICAgICAgICAgICAgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotICAgIH0KLSAgICBzY29wZV9kb3duKG91dCk7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci0gIG91dCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlIHRoZSBoYXNoIG1ldGhvZCBmb3IgdGhpcyBzdHJ1Y3QKLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X2hhc2hfbWV0aG9kKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICItIChOU1VJbnRlZ2VyKSBoYXNoIiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIk5TVUludGVnZXIgaGFzaCA9IDE3OyIgPDwgZW5kbDsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJoYXNoID0gKGhhc2ggKiAzMSkgXiBfXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpCi0gICAgICAgIDw8ICJfaXNzZXQgPyAyNjU0NDM1NzYxIDogMDsiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoX18iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiX2lzc2V0KSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHQpKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImhhc2ggPSAoaGFzaCAqIDMxKSBeIFtfXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgaGFzaF07IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImhhc2ggPSAoaGFzaCAqIDMxKSBeIFtAKF9fIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIikgaGFzaF07IgotICAgICAgICAgIDw8IGVuZGw7Ci0gICAgfQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgfQotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGhhc2g7IiA8PCBlbmRsOwotICBzY29wZV9kb3duKG91dCk7Ci0gIG91dCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlIHRoZSBpc0VxdWFsIG1ldGhvZCBmb3IgdGhpcyBzdHJ1Y3QKLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X2lzX2VxdWFsX21ldGhvZChvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAiLSAoQk9PTCkgaXNFcXVhbDogKGlkKSBhbk9iamVjdCIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBpbmRlbnQob3V0KSA8PCAiaWYgKHNlbGYgPT0gYW5PYmplY3QpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIFlFUzsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIHN0cmluZyBjbGFzc19uYW1lID0gY29jb2FfcHJlZml4XyArIHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgImlmICghW2FuT2JqZWN0IGlzS2luZE9mQ2xhc3M6WyIgPDwgY2xhc3NfbmFtZSA8PCAiIGNsYXNzXV0pIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIE5POyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgY2xhc3NfbmFtZSA8PCAiICpvdGhlciA9ICgiIDw8IGNsYXNzX25hbWUgPDwgIiAqKWFuT2JqZWN0OyIgPDwgZW5kbDsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgc3RyaW5nIG5hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7Ci0gICAgaWYgKHR5cGVfY2FuX2JlX251bGwodCkpIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKChfXyIgPDwgbmFtZSA8PCAiX2lzc2V0ICE9IG90aGVyLT5fXyIgPDwgbmFtZSA8PCAiX2lzc2V0KSB8fCIgPDwgZW5kbAotICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgICAgIgotICAgICAgICAgIDw8ICIoX18iIDw8IG5hbWUgPDwgIl9pc3NldCAmJiAiCi0gICAgICAgICAgPDwgIigoX18iIDw8IG5hbWUgPDwgIiB8fCBvdGhlci0+X18iIDw8IG5hbWUgPDwgIikgJiYgIgotICAgICAgICAgIDw8ICIhW19fIiA8PCBuYW1lIDw8ICIgaXNFcXVhbDpvdGhlci0+X18iIDw8IG5hbWUgPDwgIl0pKSkgeyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoKF9fIiA8PCBuYW1lIDw8ICJfaXNzZXQgIT0gb3RoZXItPl9fIiA8PCBuYW1lIDw8ICJfaXNzZXQpIHx8IiA8PCBlbmRsCi0gICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgICAiCi0gICAgICAgICAgPDwgIihfXyIgPDwgbmFtZSA8PCAiX2lzc2V0ICYmICIKLSAgICAgICAgICA8PCAiKF9fIiA8PCBuYW1lIDw8ICIgIT0gb3RoZXItPl9fIiA8PCBuYW1lIDw8ICIpKSkgeyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInJldHVybiBOTzsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgfQotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIFlFUzsiIDw8IGVuZGw7Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLSAgb3V0IDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGUgc3RydWN0IGltcGxlbWVudGF0aW9uLgotICoKLSAqIEBwYXJhbSB0c3RydWN0ICAgICAgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKiBAcGFyYW0gaXNfZXhjZXB0aW9uIElzIHRoaXMgYW4gZXhjZXB0aW9uPwotICogQHBhcmFtIGlzX3Jlc3VsdCAgICBJZiB0aGlzIGlzIGEgcmVzdWx0IGl0IG5lZWRzIGEgZGlmZmVyZW50IHdyaXRlcgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW1wbGVtZW50YXRpb24ob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCkgewotICBpbmRlbnQob3V0KSA8PCAiQGltcGxlbWVudGF0aW9uICIgPDwgY29jb2FfcHJlZml4XyA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8IGVuZGwgPDwgZW5kbDsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIC8vIGV4Y2VwdGlvbnMgbmVlZCB0byBjYWxsIHRoZSBkZXNpZ25hdGVkIGluaXRpYWxpemVyIG9uIE5TRXhjZXB0aW9uCi0gIGlmIChpc19leGNlcHRpb24pIHsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIi0gKGlkKSBpbml0IiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gW3N1cGVyIGluaXRXaXRoTmFtZTogQFwiIiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKLSAgICAgICAgPDwgIlwiIHJlYXNvbjogQFwidW5rbm93blwiIHVzZXJJbmZvOiBuaWxdOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gc3RydWN0Ci0KLSAgICAvLyBkZWZhdWx0IGluaXRpYWxpemVyCi0gICAgLy8gc2V0dXAgaW5zdGFuY2UgdmFyaWFibGVzIHdpdGggZGVmYXVsdCB2YWx1ZXMKLSAgICBpbmRlbnQob3V0KSA8PCAiLSAoaWQpIGluaXQiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBpbmRlbnQob3V0KSA8PCAic2VsZiA9IFtzdXBlciBpbml0XTsiIDw8IGVuZGw7Ci0gICAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgewotICAgICAgb3V0IDw8ICIjaWYgVEFSR0VUX09TX0lQSE9ORSB8fCAoTUFDX09TX1hfVkVSU0lPTl9NQVhfQUxMT1dFRCA+PSBNQUNfT1NfWF9WRVJTSU9OXzEwXzUpIgotICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgewotICAgICAgICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VsZi4iICsgKCptX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgb3V0IDw8ICIjZW5kaWYiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gc2VsZjsiIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICAgIG91dCA8PCBlbmRsOwotICB9Ci0KLSAgLy8gaW5pdGlhbGl6ZXIgd2l0aCBhbGwgZmllbGRzIGFzIHBhcmFtcwotICBpZiAoIW1lbWJlcnMuZW1wdHkoKSkgewotICAgIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbml0aWFsaXplcl9zaWduYXR1cmUob3V0LCB0c3RydWN0KTsKLSAgICBvdXQgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotICAgIGlmIChpc19leGNlcHRpb24pIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAic2VsZiA9IFtzZWxmIGluaXRdOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJzZWxmID0gW3N1cGVyIGluaXRdOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIl9fIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICI7Ci0gICAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0KSkgewotICAgICAgICBvdXQgPDwgIlsiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIHJldGFpbl9zdHViXTsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJfXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJfaXNzZXQgPSBZRVM7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHNlbGY7IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgICBvdXQgPDwgZW5kbDsKLSAgfQotCi0gIC8vIGluaXRXaXRoQ29kZXIgZm9yIE5TQ29kaW5nCi0gIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbml0X3dpdGhfY29kZXJfbWV0aG9kKG91dCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKLSAgLy8gZW5jb2RlV2l0aENvZGVyIGZvciBOU0NvZGluZwotICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfZW5jb2RlX3dpdGhfY29kZXJfbWV0aG9kKG91dCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKLSAgLy8gaGFzaCBhbmQgaXNFcXVhbCBmb3IgTlNPYmplY3QKLSAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2hhc2hfbWV0aG9kKG91dCwgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pc19lcXVhbF9tZXRob2Qob3V0LCB0c3RydWN0KTsKLQotICAvLyBkZWFsbG9jCi0gIGlmICghbWVtYmVycy5lbXB0eSgpKSB7Ci0gICAgb3V0IDw8ICItICh2b2lkKSBkZWFsbG9jIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0KLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0KSkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAiW19fIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiByZWxlYXNlX3N0dWJdOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltzdXBlciBkZWFsbG9jX3N0dWJdOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0KLQotICAvLyB0aGUgcmVzdCBvZiB0aGUgbWV0aG9kcwotICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfZmllbGRfYWNjZXNzb3JfaW1wbGVtZW50YXRpb25zKG91dCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKLSAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOwotICBpZiAoaXNfcmVzdWx0KSB7Ci0gICAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X3Jlc3VsdF93cml0ZXIob3V0LCB0c3RydWN0KTsKLSAgfSBlbHNlIHsKLSAgICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7Ci0gIH0KLSAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X3ZhbGlkYXRvcihvdXQsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfZGVzY3JpcHRpb24ob3V0LCB0c3RydWN0KTsKLQotICBvdXQgPDwgIkBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byByZWFkIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF9yZWFkZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8ICItICh2b2lkKSByZWFkOiAoaWQgPFRQcm90b2NvbD4pIGluUHJvdG9jb2wiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIC8vIERlY2xhcmUgc3RhY2sgdG1wIHZhcmlhYmxlcwotICBpbmRlbnQob3V0KSA8PCAiTlNTdHJpbmcgKiBmaWVsZE5hbWU7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiaW50IGZpZWxkVHlwZTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJpbnQgZmllbGRJRDsiIDw8IGVuZGw7Ci0gIG91dCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJbaW5Qcm90b2NvbCByZWFkU3RydWN0QmVnaW5SZXR1cm5pbmdOYW1lOiBOVUxMXTsiIDw8IGVuZGw7Ci0KLSAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCi0gIGluZGVudChvdXQpIDw8ICJ3aGlsZSAodHJ1ZSkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgLy8gUmVhZCBiZWdpbm5pbmcgZmllbGQgbWFya2VyCi0gIGluZGVudChvdXQpCi0gICAgICA8PCAiW2luUHJvdG9jb2wgcmVhZEZpZWxkQmVnaW5SZXR1cm5pbmdOYW1lOiAmZmllbGROYW1lIHR5cGU6ICZmaWVsZFR5cGUgZmllbGRJRDogJmZpZWxkSURdOyIKLSAgICAgIDw8IGVuZGw7Ci0KLSAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyIGFuZCBicmVhawotICBpbmRlbnQob3V0KSA8PCAiaWYgKGZpZWxkVHlwZSA9PSBUVHlwZV9TVE9QKSB7ICIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJicmVhazsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIC8vIFN3aXRjaCBzdGF0ZW1lbnQgb24gdGhlIGZpZWxkIHdlIGFyZSByZWFkaW5nCi0gIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkSUQpIiA8PCBlbmRsOwotCi0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGZpZWxkVHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJmaWVsZFZhbHVlIik7Ci0gICAgaW5kZW50KG91dCkgPDwgY2FsbF9maWVsZF9zZXR0ZXIoKmZfaXRlciwgImZpZWxkVmFsdWUiKSA8PCBlbmRsOwotICAgIC8vIGlmIHRoaXMgaXMgYW4gYWxsb2NhdGVkIGZpZWxkLCByZWxlYXNlIGl0IHNpbmNlIHRoZSBzdHJ1Y3QKLSAgICAvLyBpcyBub3cgcmV0YWluaW5nIGl0Ci0gICAgaWYgKHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSkgewotICAgICAgLy8gZGVzZXJpYWxpemVkIHN0cmluZ3MgYXJlIGF1dG9yZWxlYXNlLCBzbyBkb24ndCByZWxlYXNlIHRoZW0KLSAgICAgIGlmICghKGdldF90cnVlX3R5cGUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKS0+aXNfc3RyaW5nKCkpKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJbZmllbGRWYWx1ZSByZWxlYXNlX3N0dWJdOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsgIiA8PCBlbmRsOwotICAgIGlmIChsb2dfdW5leHBlY3RlZF8pIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBOU0xvZyhAXCIlczogZmllbGQgSUQgJWkgaGFzIHVuZXhwZWN0ZWQgdHlwZSAlaS4gIFNraXBwaW5nLlwiLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIl9fUFJFVFRZX0ZVTkNUSU9OX18sIGZpZWxkSUQsIGZpZWxkVHlwZSk7IiA8PCBlbmRsOwotICAgIH0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgW1RQcm90b2NvbFV0aWwgc2tpcFR5cGU6IGZpZWxkVHlwZSBvblByb3RvY29sOiBpblByb3RvY29sXTsiIDw8IGVuZGwKLSAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0KLSAgLy8gSW4gdGhlIGRlZmF1bHQgY2FzZSB3ZSBza2lwIHRoZSBmaWVsZAotICBvdXQgPDwgaW5kZW50KCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOwotICBpZiAobG9nX3VuZXhwZWN0ZWRfKSB7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIE5TTG9nKEBcIiVzOiB1bmV4cGVjdGVkIGZpZWxkIElEICVpIHdpdGggdHlwZSAlaS4gIFNraXBwaW5nLlwiLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICJfX1BSRVRUWV9GVU5DVElPTl9fLCBmaWVsZElELCBmaWVsZFR5cGUpOyIgPDwgZW5kbDsKLSAgfQotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgW1RQcm90b2NvbFV0aWwgc2tpcFR5cGU6IGZpZWxkVHlwZSBvblByb3RvY29sOiBpblByb3RvY29sXTsiIDw8IGVuZGwKLSAgICAgIDw8IGluZGVudCgpIDw8ICIgIGJyZWFrOyIgPDwgZW5kbDsKLQotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgLy8gUmVhZCBmaWVsZCBlbmQgbWFya2VyCi0gIGluZGVudChvdXQpIDw8ICJbaW5Qcm90b2NvbCByZWFkRmllbGRFbmRdOyIgPDwgZW5kbDsKLQotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICJbaW5Qcm90b2NvbCByZWFkU3RydWN0RW5kXTsiIDw8IGVuZGw7Ci0KLSAgLy8gcGVyZm9ybXMgdmFyaW91cyBjaGVja3MgKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCi0gIGlmICh2YWxpZGF0ZV9yZXF1aXJlZF8pIHsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltzZWxmIHZhbGlkYXRlXTsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byB3cml0ZSBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0Ci0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF93cml0ZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICItICh2b2lkKSB3cml0ZTogKGlkIDxUUHJvdG9jb2w+KSBvdXRQcm90b2NvbCB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgIltvdXRQcm90b2NvbCB3cml0ZVN0cnVjdEJlZ2luV2l0aE5hbWU6IEBcIiIgPDwgbmFtZSA8PCAiXCJdOyIgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKF9fIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIl9pc3NldCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBib29sIG51bGxfYWxsb3dlZCA9IHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAobnVsbF9hbGxvd2VkKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChfXyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT0gbmlsKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotCi0gICAgaW5kZW50KG91dCkgPDwgIltvdXRQcm90b2NvbCB3cml0ZUZpZWxkQmVnaW5XaXRoTmFtZTogQFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICA8PCAiXCIgdHlwZTogIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKQotICAgICAgICAgICAgICAgIDw8ICIgZmllbGRJRDogIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiXTsiIDw8IGVuZGw7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJfXyIgKyAoKmZfaXRlciktPmdldF9uYW1lKCkpOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCi0gICAgaW5kZW50KG91dCkgPDwgIltvdXRQcm90b2NvbCB3cml0ZUZpZWxkRW5kXTsiIDw8IGVuZGw7Ci0KLSAgICBpZiAobnVsbF9hbGxvd2VkKSB7Ci0gICAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgfQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgfQotICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAotICBvdXQgPDwgaW5kZW50KCkgPDwgIltvdXRQcm90b2NvbCB3cml0ZUZpZWxkU3RvcF07IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICA8PCAiW291dFByb3RvY29sIHdyaXRlU3RydWN0RW5kXTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gd3JpdGUgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdCwgd2hpY2gKLSAqIGlzIGEgZnVuY3Rpb24gcmVzdWx0LiBUaGVzZSBmaWVsZHMgYXJlIG9ubHkgd3JpdHRlbiBpZiB0aGV5IGFyZQotICogc2V0LCBhbmQgb25seSBvbmUgb2YgdGhlbSBjYW4gYmUgc2V0IGF0IGEgdGltZS4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X3Jlc3VsdF93cml0ZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICItICh2b2lkKSB3cml0ZTogKGlkIDxUUHJvdG9jb2w+KSBvdXRQcm90b2NvbCB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgIltvdXRQcm90b2NvbCB3cml0ZVN0cnVjdEJlZ2luV2l0aE5hbWU6IEBcIiIgPDwgbmFtZSA8PCAiXCJdOyIgPDwgZW5kbDsKLQotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgIjsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8ICIgZWxzZSBpZiAiOwotICAgIH0KLQotICAgIG91dCA8PCAiKF9fIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIl9pc3NldCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGJvb2wgbnVsbF9hbGxvd2VkID0gdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpOwotICAgIGlmIChudWxsX2FsbG93ZWQpIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKF9fIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSBuaWwpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAiW291dFByb3RvY29sIHdyaXRlRmllbGRCZWdpbldpdGhOYW1lOiBAXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgIDw8ICJcIiB0eXBlOiAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpCi0gICAgICAgICAgICAgICAgPDwgIiBmaWVsZElEOiAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICJdOyIgPDwgZW5kbDsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCi0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgIl9fIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKLSAgICBpbmRlbnQob3V0KSA8PCAiW291dFByb3RvY29sIHdyaXRlRmllbGRFbmRdOyIgPDwgZW5kbDsKLQotICAgIGlmIChudWxsX2FsbG93ZWQpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IjsKLSAgfQotICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAotICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiW291dFByb3RvY29sIHdyaXRlRmllbGRTdG9wXTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgIDw8ICJbb3V0UHJvdG9jb2wgd3JpdGVTdHJ1Y3RFbmRdOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byBwZXJmb3JtIHZhcmlvdXMgY2hlY2tzCi0gKiAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X3ZhbGlkYXRvcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBvdXQgPDwgaW5kZW50KCkgPDwgIi0gKHZvaWQpIHZhbGlkYXRlIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgIi8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMiIDw8IGVuZGw7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAoKmZfaXRlcik7Ci0gICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFfXyIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIl9pc3NldCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgIDw8ICIgIEB0aHJvdyBbVFByb3RvY29sRXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhOYW1lOiBAXCJUUHJvdG9jb2xFeGNlcHRpb25cIiIgPDwgZW5kbAotICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjogQFwiUmVxdWlyZWQgZmllbGQgJyIKLSAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicgaXMgbm90IHNldC5cIl07IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlIHByb3BlcnR5IGFjY2Vzc29yIG1ldGhvZHMgZm9yIGFsbCBmaWVsZHMgaW4gdGhlIHN0cnVjdC4KLSAqIGdldHRlciwgc2V0dGVyLCBpc3NldCBnZXR0ZXIuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF9maWVsZF9hY2Nlc3Nvcl9pbXBsZW1lbnRhdGlvbnMob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0gICh2b2lkKWlzX2V4Y2VwdGlvbjsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKLSAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZmllbGQtPmdldF9uYW1lKCk7Ci0gICAgc3RkOjpzdHJpbmcgY2FwX25hbWUgPSBmaWVsZF9uYW1lOwotICAgIGNhcF9uYW1lWzBdID0gdG91cHBlcihjYXBfbmFtZVswXSk7Ci0KLSAgICAvLyBTaW1wbGUgZ2V0dGVyCi0gICAgaW5kZW50KG91dCkgPDwgIi0gKCIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIpICI7Ci0gICAgb3V0IDw8IGZpZWxkX25hbWUgPDwgIiB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGlmICghdHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiBfXyIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiBbW19fIiA8PCBmaWVsZF9uYW1lIDw8ICIgcmV0YWluX3N0dWJdIGF1dG9yZWxlYXNlX3N0dWJdOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgLy8gU2ltcGxlIHNldHRlcgotICAgIGluZGVudChvdXQpIDw8ICItICh2b2lkKSBzZXQiIDw8IGNhcF9uYW1lIDw8ICI6ICgiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKSAiIDw8IGZpZWxkX25hbWUKLSAgICAgICAgICAgICAgICA8PCAiIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiX18iIDw8IGZpZWxkX25hbWUgPDwgIiA9ICIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgIlsiIDw8IGZpZWxkX25hbWUgPDwgIiByZXRhaW5fc3R1Yl07IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIltfXyIgPDwgZmllbGRfbmFtZSA8PCAiIHJlbGVhc2Vfc3R1Yl07IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIl9fIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSAiIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudChvdXQpIDw8ICJfXyIgPDwgZmllbGRfbmFtZSA8PCAiX2lzc2V0ID0gWUVTOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICAvLyBJc1NldAotICAgIGluZGVudChvdXQpIDw8ICItIChCT09MKSAiIDw8IGZpZWxkX25hbWUgPDwgIklzU2V0IHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInJldHVybiBfXyIgPDwgZmllbGRfbmFtZSA8PCAiX2lzc2V0OyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICAvLyBVbnNldHRlciAtIGRvIHdlIG5lZWQgdGhpcz8KLSAgICBpbmRlbnQob3V0KSA8PCAiLSAodm9pZCkgdW5zZXQiIDw8IGNhcF9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIltfXyIgPDwgZmllbGRfbmFtZSA8PCAiIHJlbGVhc2Vfc3R1Yl07IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIl9fIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBuaWw7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnQob3V0KSA8PCAiX18iIDw8IGZpZWxkX25hbWUgPDwgIl9pc3NldCA9IE5POyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBkZXNjcmlwdGlvbiBtZXRob2QgZm9yIHRoZSBnaXZlbiBzdHJ1Y3QKLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X2Rlc2NyaXB0aW9uKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiLSAoTlNTdHJpbmcgKikgZGVzY3JpcHRpb24geyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICJOU011dGFibGVTdHJpbmcgKiBtcyA9IFtOU011dGFibGVTdHJpbmcgc3RyaW5nV2l0aFN0cmluZzogQFwiIgotICAgICAgPDwgY29jb2FfcHJlZml4XyA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoXCJdOyIgPDwgZW5kbDsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJbbXMgYXBwZW5kU3RyaW5nOiBAXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOlwiXTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJbbXMgYXBwZW5kU3RyaW5nOiBAXCIsIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjpcIl07IiA8PCBlbmRsOwotICAgIH0KLSAgICB0X3R5cGUqIHR0eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgIGluZGVudChvdXQpIDw8ICJbbXMgYXBwZW5kRm9ybWF0OiBAXCIiIDw8IGZvcm1hdF9zdHJpbmdfZm9yX3R5cGUodHR5cGUpIDw8ICJcIiwgX18iCi0gICAgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJdOyIgPDwgZW5kbDsKLSAgfQotICBvdXQgPDwgaW5kZW50KCkgPDwgIlttcyBhcHBlbmRTdHJpbmc6IEBcIilcIl07IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICA8PCAicmV0dXJuIFtOU1N0cmluZyBzdHJpbmdXaXRoU3RyaW5nOiBtc107IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuICBJbiBPYmplY3RpdmUtQyB0aGlzIGNvbnNpc3RzIG9mIGEKLSAqIHByb3RvY29sIGRlZmluaXRpb24sIGEgY2xpZW50IGludGVyZmFjZSBhbmQgYSBjbGllbnQgaW1wbGVtZW50YXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfcHJvdG9jb2woZl9oZWFkZXJfLCB0c2VydmljZSk7Ci0gIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X2ludGVyZmFjZShmX2hlYWRlcl8sIHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9zZXJ2ZXJfaW50ZXJmYWNlKGZfaGVhZGVyXywgdHNlcnZpY2UpOwotICBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOwotICBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9pbXBsZW1lbnRhdGlvbihmX2ltcGxfLCB0c2VydmljZSk7Ci0gIGdlbmVyYXRlX2NvY29hX3NlcnZpY2Vfc2VydmVyX2ltcGxlbWVudGF0aW9uKGZfaW1wbF8sIHRzZXJ2aWNlKTsKLSAgaWYgKGFzeW5jX2NsaWVudHNfKSB7Ci0gICAgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9hc3luY19wcm90b2NvbChmX2hlYWRlcl8sIHRzZXJ2aWNlKTsKLSAgICBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9hc3luY19pbnRlcmZhY2UoZl9oZWFkZXJfLCB0c2VydmljZSk7Ci0gICAgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfYXN5bmNfaW1wbGVtZW50YXRpb24oZl9pbXBsXywgdHNlcnZpY2UpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHN0cnVjdHMgZm9yIGFsbCB0aGUgc2VydmljZSByZXR1cm4gdHlwZXMKLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UKLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbnRlcmZhY2UoZl9pbXBsXywgdHMsIGZhbHNlKTsKLSAgICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW1wbGVtZW50YXRpb24oZl9pbXBsXywgdHMsIGZhbHNlLCBmYWxzZSk7Ci0gICAgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKLSAgfQotfQotCi1zdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmZ1bmN0aW9uX3Jlc3VsdF9oZWxwZXJfc3RydWN0X3R5cGUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgcmV0dXJuIGNhcGl0YWxpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gY2FwaXRhbGl6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgIl9yZXN1bHQiOwotICB9Ci19Ci0KLXN0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6ZnVuY3Rpb25fYXJnc19oZWxwZXJfc3RydWN0X3R5cGUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIHJldHVybiB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIGNyZWF0ZSBhIHJlc3VsdCBzdHJ1Y3Qgd2l0aCBhIHN1Y2Nlc3MgZmllbGQgb2YgdGhlIHJldHVybiB0eXBlLAotICAvLyBhbmQgYSBmaWVsZCBmb3IgZWFjaCB0eXBlIG9mIGV4Y2VwdGlvbiB0aHJvd24KLSAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCBmdW5jdGlvbl9yZXN1bHRfaGVscGVyX3N0cnVjdF90eXBlKHRmdW5jdGlvbikpOwotICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOwotICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7Ci0gIH0KLQotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOwotICB9Ci0KLSAgLy8gZ2VuZXJhdGUgdGhlIHJlc3VsdCBzdHJ1Y3QKLSAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ludGVyZmFjZShmX2ltcGxfLCAmcmVzdWx0LCBmYWxzZSk7Ci0gIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbXBsZW1lbnRhdGlvbihmX2ltcGxfLCAmcmVzdWx0LCBmYWxzZSwgdHJ1ZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBwcm90b2NvbCBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHByb3RvY29sIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3NlcnZpY2VfcHJvdG9jb2wob2ZzdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBvdXQgPDwgIkBwcm90b2NvbCAiIDw8IGNvY29hX3ByZWZpeF8gPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIiA8TlNPYmplY3Q+IiA8PCBlbmRsOwotCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIG91dCA8PCAiLSAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiOyIKLSAgICAgICAgPDwgIiAgLy8gdGhyb3dzICI7Ci0gICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgIG91dCA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKSArICIsICI7Ci0gICAgfQotICAgIG91dCA8PCAiVEV4Y2VwdGlvbiIgPDwgZW5kbDsKLSAgfQotICBvdXQgPDwgIkBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYW4gYXN5bmNocm9ub3VzIHNlcnZpY2UgcHJvdG9jb2wgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBwcm90b2NvbCBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2FzeW5jX3Byb3RvY29sKG9mc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgb3V0IDw8ICJAcHJvdG9jb2wgIiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJBc3luYyIKLSAgICAgIDw8ICIgPE5TT2JqZWN0PiIgPDwgZW5kbDsKLQotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBvdXQgPDwgIi0gIiA8PCBhc3luY19mdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLSAgb3V0IDw8ICJAZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgaW50ZXJmYWNlIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgY2xpZW50IGludGVyZmFjZSBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9pbnRlcmZhY2Uob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIG91dCA8PCAiQGludGVyZmFjZSAiIDw8IGNvY29hX3ByZWZpeF8gPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkNsaWVudCA6IFRCYXNlQ2xpZW50IDwiCi0gICAgICA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICI+ICI7Ci0KLSAgb3V0IDw8ICItIChpZCkgaW5pdFdpdGhQcm90b2NvbDogKGlkIDxUUHJvdG9jb2w+KSBwcm90b2NvbDsiIDw8IGVuZGw7Ci0gIG91dCA8PCAiLSAoaWQpIGluaXRXaXRoSW5Qcm90b2NvbDogKGlkIDxUUHJvdG9jb2w+KSBpblByb3RvY29sIG91dFByb3RvY29sOiAoaWQgPFRQcm90b2NvbD4pICIKLSAgICAgICAgICJvdXRQcm90b2NvbDsiIDw8IGVuZGw7Ci0gIG91dCA8PCAiQGVuZCIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGludGVyZmFjZSBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGNsaWVudCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfYXN5bmNfaW50ZXJmYWNlKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBvdXQgPDwgIkBpbnRlcmZhY2UgIiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJDbGllbnRBc3luYyA6IFRCYXNlQ2xpZW50IDwiCi0gICAgICA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJBc3luYz4gIjsKLQotICBzY29wZV91cChvdXQpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgImlkIDxUQXN5bmNUcmFuc3BvcnQ+IGFzeW5jVHJhbnNwb3J0OyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIG91dCA8PCAiLSAoaWQpIGluaXRXaXRoUHJvdG9jb2xGYWN0b3J5OiAoaWQgPFRQcm90b2NvbEZhY3Rvcnk+KSBmYWN0b3J5ICIKLSAgICAgICAgICJ0cmFuc3BvcnQ6IChpZCA8VEFzeW5jVHJhbnNwb3J0PikgdHJhbnNwb3J0OyIgPDwgZW5kbDsKLSAgb3V0IDw8ICJAZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgaW50ZXJmYWNlIGRlZmluaXRpb24uIEluIG90aGVyIHdvcmRzLCB0aGUgVFByb2Nlc3MgaW1wbGVtZW50YXRpb24gZm9yCi0gKnRoZQotICogc2VydmljZSBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGNsaWVudCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc2VydmljZV9zZXJ2ZXJfaW50ZXJmYWNlKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBvdXQgPDwgIkBpbnRlcmZhY2UgIiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpCi0gICAgICA8PCAiUHJvY2Vzc29yIDogTlNPYmplY3QgPFRQcm9jZXNzb3I+ICI7Ci0KLSAgc2NvcGVfdXAob3V0KTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJpZCA8IiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICI+IG1TZXJ2aWNlOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJOU0RpY3Rpb25hcnkgKiBtTWV0aG9kTWFwOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIG91dCA8PCAiLSAoaWQpIGluaXRXaXRoIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiOiAoaWQgPCIgPDwgY29jb2FfcHJlZml4XwotICAgICAgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIj4pIHNlcnZpY2U7IiA8PCBlbmRsOwotICBvdXQgPDwgIi0gKGlkPCIgPDwgY29jb2FfcHJlZml4XyA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiPikgc2VydmljZTsiIDw8IGVuZGw7Ci0KLSAgb3V0IDw8ICJAZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X3NlbmRfZnVuY3Rpb25faW1wbGVtZW50YXRpb24oCi0gICAgb2ZzdHJlYW0mIG91dCwKLSAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgc3RyaW5nIGZ1bm5hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCk7Ci0KLSAgdF9mdW5jdGlvbiBzZW5kX2Z1bmN0aW9uKGdfdHlwZV92b2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJzZW5kXyIpICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKTsKLQotICBzdHJpbmcgYXJnc25hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiOwotCi0gIC8vIE9wZW4gZnVuY3Rpb24KLSAgaW5kZW50KG91dCkgPDwgIi0gIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnNlbmRfZnVuY3Rpb24pIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiW291dFByb3RvY29sIHdyaXRlTWVzc2FnZUJlZ2luV2l0aE5hbWU6IEBcIiIgPDwgZnVubmFtZSA8PCAiXCIiCi0gICAgICA8PCAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSA/ICIgdHlwZTogVE1lc3NhZ2VUeXBlX09ORVdBWSIgOiAiIHR5cGU6IFRNZXNzYWdlVHlwZV9DQUxMIikKLSAgICAgIDw8ICIgc2VxdWVuY2VJRDogMF07IiA8PCBlbmRsOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiW291dFByb3RvY29sIHdyaXRlU3RydWN0QmVnaW5XaXRoTmFtZTogQFwiIiA8PCBhcmdzbmFtZSA8PCAiXCJdOyIgPDwgZW5kbDsKLQotICAvLyB3cml0ZSBvdXQgZnVuY3Rpb24gcGFyYW1ldGVycwotICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7Ci0gIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgc3RyaW5nIGZpZWxkTmFtZSA9ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKCgqZmxkX2l0ZXIpLT5nZXRfdHlwZSgpKSkgewotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIiA8PCBmaWVsZE5hbWUgPDwgIiAhPSBuaWwpIjsKLSAgICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgfQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW291dFByb3RvY29sIHdyaXRlRmllbGRCZWdpbldpdGhOYW1lOiBAXCIiIDw8IGZpZWxkTmFtZQotICAgICAgICA8PCAiXCIiCi0gICAgICAgICAgICIgdHlwZTogIiA8PCB0eXBlX3RvX2VudW0oKCpmbGRfaXRlciktPmdldF90eXBlKCkpCi0gICAgICAgIDw8ICIgZmllbGRJRDogIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X2tleSgpIDw8ICJdOyIgPDwgZW5kbDsKLQotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmbGRfaXRlciwgZmllbGROYW1lKTsKLQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW291dFByb3RvY29sIHdyaXRlRmllbGRFbmRdOyIgPDwgZW5kbDsKLQotICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKCgqZmxkX2l0ZXIpLT5nZXRfdHlwZSgpKSkgewotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBvdXQgPDwgaW5kZW50KCkgPDwgIltvdXRQcm90b2NvbCB3cml0ZUZpZWxkU3RvcF07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIltvdXRQcm90b2NvbCB3cml0ZVN0cnVjdEVuZF07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIltvdXRQcm90b2NvbCB3cml0ZU1lc3NhZ2VFbmRdOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfcmVjdl9mdW5jdGlvbl9pbXBsZW1lbnRhdGlvbigKLSAgICBvZnN0cmVhbSYgb3V0LAotICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOwotICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24odGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vYXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpKTsKLSAgLy8gT3BlbiBmdW5jdGlvbgotICBpbmRlbnQob3V0KSA8PCAiLSAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbikgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLQotICAvLyBUT0RPKG1jc2xlZSk6IE1lc3NhZ2UgdmFsaWRhdGlvbiBoZXJlLCB3YXMgdGhlIHNlcWlkIGV0YyBvaz8KLQotICAvLyBjaGVjayBmb3IgYW4gZXhjZXB0aW9uCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uICogeCA9IFtzZWxmIGNoZWNrSW5jb21pbmdNZXNzYWdlRXhjZXB0aW9uXTsiIDw8IGVuZGwKLSAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoeCAhPSBuaWwpIjsKLSAgc2NvcGVfdXAob3V0KTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJAdGhyb3cgeDsiIDw8IGVuZGw7Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICAvLyBGSVhNRSAtIGNvdWxkIG9wdGltaXplIGhlcmUgdG8gcmVkdWNlIGNyZWF0aW9uIG9mIHRlbXBvcmFyeSBvYmplY3RzLgotICBzdHJpbmcgcmVzdWx0bmFtZSA9IGZ1bmN0aW9uX3Jlc3VsdF9oZWxwZXJfc3RydWN0X3R5cGUodGZ1bmN0aW9uKTsKLSAgb3V0IDw8IGluZGVudCgpIDw8IGNvY29hX3ByZWZpeF8gPDwgcmVzdWx0bmFtZSA8PCAiICogcmVzdWx0ID0gW1tbIiA8PCBjb2NvYV9wcmVmaXhfIDw8IHJlc3VsdG5hbWUKLSAgICAgIDw8ICIgYWxsb2NdIGluaXRdIGF1dG9yZWxlYXNlX3N0dWJdOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIltyZXN1bHQgcmVhZDogaW5Qcm90b2NvbF07IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiW2luUHJvdG9jb2wgcmVhZE1lc3NhZ2VFbmRdOyIgPDwgZW5kbDsKLQotICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKFtyZXN1bHQgc3VjY2Vzc0lzU2V0XSkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICA8PCAiICByZXR1cm4gW3Jlc3VsdCBzdWNjZXNzXTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLQotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKFtyZXN1bHQgIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIklzU2V0XSkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICA8PCAiICBAdGhyb3cgW3Jlc3VsdCAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBJZiB5b3UgZ2V0IGhlcmUgaXQncyBhbiBleGNlcHRpb24sIHVubGVzcyBhIHZvaWQgZnVuY3Rpb24KLSAgaWYgKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJAdGhyb3cgW1RBcHBsaWNhdGlvbkV4Y2VwdGlvbiBleGNlcHRpb25XaXRoVHlwZTogIgotICAgICAgICAgICAgICAgICAgICAgICAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uX01JU1NJTkdfUkVTVUxUIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjogQFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKLSAgICAgICAgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0XCJdOyIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIENsb3NlIGZ1bmN0aW9uCi0gIHNjb3BlX2Rvd24ob3V0KTsKLSAgb3V0IDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGFuIGludm9jYXRpb24gb2YgYSBnaXZlbiAnc2VuZF8nIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYW4gaW1wbGVtZW50YXRpb24gZm9yCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X3NlbmRfZnVuY3Rpb25faW52b2NhdGlvbigKLSAgICBvZnN0cmVhbSYgb3V0LAotICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7Ci0gIGluZGVudChvdXQpIDw8ICJbc2VsZiBzZW5kXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICBzdHJpbmcgZmllbGROYW1lID0gKCpmbGRfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgb3V0IDw8ICIgIjsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICBvdXQgPDwgIjogIiA8PCBmaWVsZE5hbWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCBmaWVsZE5hbWUgPDwgIjogIiA8PCBmaWVsZE5hbWU7Ci0gICAgfQotICB9Ci0gIG91dCA8PCAiXTsiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgaW1wbGVtZW50YXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGFuIGltcGxlbWVudGF0aW9uIGZvcgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9pbXBsZW1lbnRhdGlvbihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBvdXQgPDwgIkBpbXBsZW1lbnRhdGlvbiAiIDw8IGNvY29hX3ByZWZpeF8gPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkNsaWVudCIgPDwgZW5kbDsKLQotICAvLyBpbml0aWFsaXplcnMKLSAgb3V0IDw8ICItIChpZCkgaW5pdFdpdGhQcm90b2NvbDogKGlkIDxUUHJvdG9jb2w+KSBwcm90b2NvbCIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gW3NlbGYgaW5pdFdpdGhJblByb3RvY29sOiBwcm90b2NvbCBvdXRQcm90b2NvbDogcHJvdG9jb2xdOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLQotICBvdXQgPDwgIi0gKGlkKSBpbml0V2l0aEluUHJvdG9jb2w6IChpZCA8VFByb3RvY29sPikgYW5JblByb3RvY29sIG91dFByb3RvY29sOiAoaWQgPFRQcm90b2NvbD4pICIKLSAgICAgICAgICJhbk91dFByb3RvY29sIiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgInNlbGYgPSBbc3VwZXIgaW5pdF07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgImluUHJvdG9jb2wgPSBbYW5JblByb3RvY29sIHJldGFpbl9zdHViXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAib3V0UHJvdG9jb2wgPSBbYW5PdXRQcm90b2NvbCByZXRhaW5fc3R1Yl07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBzZWxmOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLQotICAvLyBnZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLQotICAgIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X3NlbmRfZnVuY3Rpb25faW1wbGVtZW50YXRpb24ob3V0LCAqZl9pdGVyKTsKLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfcmVjdl9mdW5jdGlvbl9pbXBsZW1lbnRhdGlvbihvdXQsICpmX2l0ZXIpOwotICAgIH0KLQotICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICBpbmRlbnQob3V0KSA8PCAiLSAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfc2VuZF9mdW5jdGlvbl9pbnZvY2F0aW9uKG91dCwgKmZfaXRlcik7Ci0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltbb3V0UHJvdG9jb2wgdHJhbnNwb3J0XSBmbHVzaF07IiA8PCBlbmRsOwotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgb3V0IDw8IGluZGVudCgpOwotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBvdXQgPDwgInJldHVybiAiOwotICAgICAgfQotICAgICAgb3V0IDw8ICJbc2VsZiByZWN2XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJdOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICAgIG91dCA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PCAiQGVuZCIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGltcGxlbWVudGF0aW9uIGZvciBpdHMgYXN5bmNocm9ub3VzIGludGVyZmFjZS4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYW4gaW1wbGVtZW50YXRpb24gZm9yCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X2FzeW5jX2ltcGxlbWVudGF0aW9uKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIG91dCA8PCAiQGltcGxlbWVudGF0aW9uICIgPDwgY29jb2FfcHJlZml4XyA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiQ2xpZW50QXN5bmMiIDw8IGVuZGwKLSAgICAgIDw8IGVuZGwgPDwgIi0gKGlkKSBpbml0V2l0aFByb3RvY29sRmFjdG9yeTogKGlkIDxUUHJvdG9jb2xGYWN0b3J5PikgZmFjdG9yeSAiCi0gICAgICAgICAgICAgICAgICJ0cmFuc3BvcnQ6IChpZCA8VEFzeW5jVHJhbnNwb3J0PikgdHJhbnNwb3J0OyIgPDwgZW5kbDsKLQotICBzY29wZV91cChvdXQpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgInNlbGYgPSBbc3VwZXIgaW5pdF07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgImluUHJvdG9jb2wgPSBbW2ZhY3RvcnkgbmV3UHJvdG9jb2xPblRyYW5zcG9ydDp0cmFuc3BvcnRdIHJldGFpbl9zdHViXTsiCi0gICAgICA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIm91dFByb3RvY29sID0gaW5Qcm90b2NvbDsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiYXN5bmNUcmFuc3BvcnQgPSB0cmFuc3BvcnQ7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBzZWxmOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLQotICAvLyBnZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLQotICAgIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X3NlbmRfZnVuY3Rpb25faW1wbGVtZW50YXRpb24ob3V0LCAqZl9pdGVyKTsKLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfcmVjdl9mdW5jdGlvbl9pbXBsZW1lbnRhdGlvbihvdXQsICpmX2l0ZXIpOwotICAgIH0KLQotICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICBpbmRlbnQob3V0KSA8PCAiLSAiIDw8IGFzeW5jX2Z1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIkB0cnkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9zZW5kX2Z1bmN0aW9uX2ludm9jYXRpb24ob3V0LCAqZl9pdGVyKTsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBAY2F0Y2goVEV4Y2VwdGlvbiAqIHRleGNlcHRpb24pIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJmYWlsdXJlQmxvY2sodGV4Y2VwdGlvbik7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlthc3luY1RyYW5zcG9ydCBmbHVzaDpeeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiQHRyeSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgc3RyaW5nIHJlY3ZfaW52b2NhdGlvbiA9ICJbc2VsZiByZWN2XyIgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiXSI7Ci0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpICYmICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgcmVjdl9pbnZvY2F0aW9uIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJlc3BvbnNlQmxvY2soIjsKLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkgJiYgISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICBvdXQgPDwgcmVjdl9pbnZvY2F0aW9uOwotICAgIH0KLSAgICBvdXQgPDwgIik7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBAY2F0Y2goVEV4Y2VwdGlvbiAqIHRleGNlcHRpb24pIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImZhaWx1cmVCbG9jayh0ZXhjZXB0aW9uKTsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IGZhaWx1cmU6ZmFpbHVyZUJsb2NrXTsiIDw8IGVuZGw7Ci0KLSAgICBzY29wZV9kb3duKG91dCk7Ci0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfQotCi0gIG91dCA8PCAiQGVuZCIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGltcGxlbWVudGF0aW9uLiAgSW4gb3RoZXIgd29yZHMgdGhlIGFjdHVhbCBUUHJvY2Vzc29yIGltcGxlbWVudGF0aW9uCi0gKiBmb3IgdGhlIHNlcnZpY2UuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGFuIGltcGxlbWVudGF0aW9uIGZvcgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX3NlcnZlcl9pbXBsZW1lbnRhdGlvbihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBvdXQgPDwgIkBpbXBsZW1lbnRhdGlvbiAiIDw8IGNvY29hX3ByZWZpeF8gPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIlByb2Nlc3NvciIgPDwgZW5kbDsKLQotICAvLyBpbml0aWFsaXplcgotICBvdXQgPDwgZW5kbDsKLSAgb3V0IDw8ICItIChpZCkgaW5pdFdpdGgiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICI6IChpZCA8IiA8PCBjb2NvYV9wcmVmaXhfCi0gICAgICA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiPikgc2VydmljZSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJzZWxmID0gW3N1cGVyIGluaXRdOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIXNlbGYpIHsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gbmlsOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIm1TZXJ2aWNlID0gW3NlcnZpY2UgcmV0YWluX3N0dWJdOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJtTWV0aG9kTWFwID0gW1tOU011dGFibGVEaWN0aW9uYXJ5IGRpY3Rpb25hcnldIHJldGFpbl9zdHViXTsiIDw8IGVuZGw7Ci0KLSAgLy8gZ2VuZXJhdGUgbWV0aG9kIG1hcCBmb3Igcm91dGluZyBpbmNvbWluZyBjYWxscwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICBzY29wZV91cChvdXQpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiU0VMIHMgPSBAc2VsZWN0b3IocHJvY2Vzc18iIDw8IGZ1bm5hbWUKLSAgICAgICAgPDwgIl93aXRoU2VxdWVuY2VJRDppblByb3RvY29sOm91dFByb3RvY29sOik7IiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiTlNNZXRob2RTaWduYXR1cmUgKiBzaWcgPSBbc2VsZiBtZXRob2RTaWduYXR1cmVGb3JTZWxlY3Rvcjogc107IiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKQotICAgICAgICA8PCAiTlNJbnZvY2F0aW9uICogaW52b2NhdGlvbiA9IFtOU0ludm9jYXRpb24gaW52b2NhdGlvbldpdGhNZXRob2RTaWduYXR1cmU6IHNpZ107IiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW2ludm9jYXRpb24gc2V0U2VsZWN0b3I6IHNdOyIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltpbnZvY2F0aW9uIHJldGFpbkFyZ3VtZW50c107IiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW21NZXRob2RNYXAgc2V0VmFsdWU6IGludm9jYXRpb24gZm9yS2V5OiBAXCIiIDw8IGZ1bm5hbWUgPDwgIlwiXTsiIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICB9Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHNlbGY7IiA8PCBlbmRsOwotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgLy8gaW1wbGVtZW50YXRpb24gb2YgdGhlICdzZXJ2aWNlJyBtZXRob2Qgd2hpY2ggcmV0dXJucyB0aGUgc2VydmljZSBhc3NvY2lhdGVkIHdpdGggdGhpcwotICAvLyBwcm9jZXNzb3IKLSAgb3V0IDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiLSAoaWQ8IiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICI+KSBzZXJ2aWNlIiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gW1ttU2VydmljZSByZXRhaW5fc3R1Yl0gYXV0b3JlbGVhc2Vfc3R1Yl07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgLy8gaW1wbGVtZW50YXRpb24gb2YgdGhlIFRQcm9jZXNzIG1ldGhvZCwgd2hpY2ggZGlzcGF0Y2hlcyB0aGUgaW5jb21pbmcgY2FsbCB1c2luZyB0aGUgbWV0aG9kIG1hcAotICBvdXQgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICItIChCT09MKSBwcm9jZXNzT25JbnB1dFByb3RvY29sOiAoaWQgPFRQcm90b2NvbD4pIGluUHJvdG9jb2wiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbDogKGlkIDxUUHJvdG9jb2w+KSBvdXRQcm90b2NvbCIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgTlNTdHJpbmcgKiBtZXNzYWdlTmFtZTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICBpbnQgbWVzc2FnZVR5cGU7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgaW50IHNlcUlEOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgIFtpblByb3RvY29sIHJlYWRNZXNzYWdlQmVnaW5SZXR1cm5pbmdOYW1lOiAmbWVzc2FnZU5hbWUiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJm1lc3NhZ2VUeXBlIiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6ICZzZXFJRF07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgTlNJbnZvY2F0aW9uICogaW52b2NhdGlvbiA9IFttTWV0aG9kTWFwIHZhbHVlRm9yS2V5OiBtZXNzYWdlTmFtZV07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgaWYgKGludm9jYXRpb24gPT0gbmlsKSB7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICBbVFByb3RvY29sVXRpbCBza2lwVHlwZTogVFR5cGVfU1RSVUNUIG9uUHJvdG9jb2w6IGluUHJvdG9jb2xdOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgW2luUHJvdG9jb2wgcmVhZE1lc3NhZ2VFbmRdOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uICogeCA9IFtUQXBwbGljYXRpb25FeGNlcHRpb24gZXhjZXB0aW9uV2l0aFR5cGU6ICIKLSAgICAgICAgICAgICAgICAgICAgICJUQXBwbGljYXRpb25FeGNlcHRpb25fVU5LTk9XTl9NRVRIT0QgcmVhc29uOiBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDogIgotICAgICAgICAgICAgICAgICAgICAgIkBcIkludmFsaWQgbWV0aG9kIG5hbWU6ICclQCdcIiwgbWVzc2FnZU5hbWVdXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgIFtvdXRQcm90b2NvbCB3cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lOiBtZXNzYWdlTmFtZSIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFRNZXNzYWdlVHlwZV9FWENFUFRJT04iIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOiBzZXFJRF07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICBbeCB3cml0ZTogb3V0UHJvdG9jb2xdOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgW291dFByb3RvY29sIHdyaXRlTWVzc2FnZUVuZF07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICBbW291dFByb3RvY29sIHRyYW5zcG9ydF0gZmx1c2hdOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgcmV0dXJuIFlFUzsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgLy8gTlNJbnZvY2F0aW9uIGRvZXMgbm90IGNvbmZvcm0gdG8gTlNDb3B5aW5nIHByb3RvY29sIiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgTlNJbnZvY2F0aW9uICogaSA9IFtOU0ludm9jYXRpb24gaW52b2NhdGlvbldpdGhNZXRob2RTaWduYXR1cmU6ICIKLSAgICAgICAgICAgICAgICAgICAgICJbaW52b2NhdGlvbiBtZXRob2RTaWduYXR1cmVdXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICBbaSBzZXRTZWxlY3RvcjogW2ludm9jYXRpb24gc2VsZWN0b3JdXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICBbaSBzZXRBcmd1bWVudDogJnNlcUlEIGF0SW5kZXg6IDJdOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgIFtpIHNldEFyZ3VtZW50OiAmaW5Qcm90b2NvbCBhdEluZGV4OiAzXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICBbaSBzZXRBcmd1bWVudDogJm91dFByb3RvY29sIGF0SW5kZXg6IDRdOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgIFtpIHNldFRhcmdldDogc2VsZl07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgW2kgaW52b2tlXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gWUVTOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIC8vIGdlbmVyYXRlIGEgcHJvY2Vzc19YWFhYIG1ldGhvZCBmb3IgZWFjaCBzZXJ2aWNlIGZ1bmN0aW9uLCB3aGljaCByZWFkcyBhcmdzLCBjYWxscyB0aGUgc2VydmljZSwKLSAgLy8gYW5kIHdyaXRlcyByZXN1bHRzCi0gIGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgb3V0IDw8IGVuZGw7Ci0gICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICItICh2b2lkKSBwcm9jZXNzXyIgPDwgZnVubmFtZQotICAgICAgICA8PCAiX3dpdGhTZXF1ZW5jZUlEOiAoaW50MzJfdCkgc2VxSUQgaW5Qcm90b2NvbDogKGlkPFRQcm90b2NvbD4pIGluUHJvdG9jb2wgb3V0UHJvdG9jb2w6ICIKLSAgICAgICAgICAgIihpZDxUUHJvdG9jb2w+KSBvdXRQcm90b2NvbCIgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotICAgIHN0cmluZyBhcmdzdHlwZSA9IGNvY29hX3ByZWZpeF8gKyBmdW5jdGlvbl9hcmdzX2hlbHBlcl9zdHJ1Y3RfdHlwZSgqZl9pdGVyKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgYXJnc3R5cGUgPDwgIiAqIGFyZ3MgPSBbWyIgPDwgYXJnc3R5cGUgPDwgIiBhbGxvY10gaW5pdF07IiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW2FyZ3MgcmVhZDogaW5Qcm90b2NvbF07IiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW2luUHJvdG9jb2wgcmVhZE1lc3NhZ2VFbmRdOyIgPDwgZW5kbDsKLQotICAgIC8vIHByZXBhcmUgdGhlIHJlc3VsdCBpZiBub3Qgb25ld2F5Ci0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBzdHJpbmcgcmVzdWx0dHlwZSA9IGNvY29hX3ByZWZpeF8gKyBmdW5jdGlvbl9yZXN1bHRfaGVscGVyX3N0cnVjdF90eXBlKCpmX2l0ZXIpOwotICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHJlc3VsdHR5cGUgPDwgIiAqIHJlc3VsdCA9IFtbIiA8PCByZXN1bHR0eXBlIDw8ICIgYWxsb2NdIGluaXRdOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICAvLyBtYWtlIHRoZSBjYWxsIHRvIHRoZSBhY3R1YWwgc2VydmljZSBvYmplY3QKLSAgICBvdXQgPDwgaW5kZW50KCk7Ci0gICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgb3V0IDw8ICJbcmVzdWx0IHNldFN1Y2Nlc3M6ICI7Ci0gICAgfQotICAgIG91dCA8PCAiW21TZXJ2aWNlICIgPDwgZnVubmFtZTsKLSAgICAvLyBzdXBwbHlpbmcgYXJndW1lbnRzCi0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgc3RyaW5nIGZpZWxkTmFtZSA9ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgIG91dCA8PCAiOiBbYXJncyAiIDw8IGZpZWxkTmFtZSA8PCAiXSI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgIiAiIDw8IGZpZWxkTmFtZSA8PCAiOiBbYXJncyAiIDw8IGZpZWxkTmFtZSA8PCAiXSI7Ci0gICAgICB9Ci0gICAgfQotICAgIG91dCA8PCAiXSI7Ci0gICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgb3V0IDw8ICJdIjsKLSAgICB9Ci0gICAgb3V0IDw8ICI7IiA8PCBlbmRsOwotCi0gICAgLy8gd3JpdGUgb3V0IHRoZSByZXN1bHQgaWYgbm90IG9uZXdheQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbb3V0UHJvdG9jb2wgd3JpdGVNZXNzYWdlQmVnaW5XaXRoTmFtZTogQFwiIiA8PCBmdW5uYW1lIDw8ICJcIiIgPDwgZW5kbDsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFRNZXNzYWdlVHlwZV9SRVBMWSIgPDwgZW5kbDsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6IHNlcUlEXTsiIDw8IGVuZGw7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltyZXN1bHQgd3JpdGU6IG91dFByb3RvY29sXTsiIDw8IGVuZGw7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltvdXRQcm90b2NvbCB3cml0ZU1lc3NhZ2VFbmRdOyIgPDwgZW5kbDsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW1tvdXRQcm90b2NvbCB0cmFuc3BvcnRdIGZsdXNoXTsiIDw8IGVuZGw7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltyZXN1bHQgcmVsZWFzZV9zdHViXTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW2FyZ3MgcmVsZWFzZV9zdHViXTsiIDw8IGVuZGw7Ci0KLSAgICBzY29wZV9kb3duKG91dCk7Ci0gIH0KLQotICAvLyBkZWFsbG9jCi0gIG91dCA8PCBlbmRsOwotICBvdXQgPDwgIi0gKHZvaWQpIGRlYWxsb2MiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiW21TZXJ2aWNlIHJlbGVhc2Vfc3R1Yl07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIlttTWV0aG9kTWFwIHJlbGVhc2Vfc3R1Yl07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIltzdXBlciBkZWFsbG9jX3N0dWJdOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLQotICBvdXQgPDwgIkBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZAotICogQHBhcmFtIGZpZWxkTmFtZSBUaGUgdmFyaWFibGUgbmFtZSBmb3IgdGhpcyBmaWVsZAotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkTmFtZSkgewotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIGZpZWxkTmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBmaWVsZE5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICIgPDwgZmllbGROYW1lIDw8ICIgPSBbaW5Qcm90b2NvbCAiOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgICAgb3V0IDw8ICJyZWFkQmluYXJ5XTsiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG91dCA8PCAicmVhZFN0cmluZ107IjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgb3V0IDw8ICJyZWFkQm9vbF07IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIG91dCA8PCAicmVhZEJ5dGVdOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIG91dCA8PCAicmVhZEkxNl07IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgb3V0IDw8ICJyZWFkSTMyXTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICBvdXQgPDwgInJlYWRJNjRdOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIG91dCA8PCAicmVhZERvdWJsZV07IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIE9iamVjdGl2ZS1DIG5hbWUgZm9yIGJhc2UgdHlwZSAiCi0gICAgICAgICAgICArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIG91dCA8PCAicmVhZEkzMl07IjsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAotICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHN0cnVjdCwgYWxsb2NhdGVzIHRoZSBzdHJ1Y3QgYW5kIGludm9rZXMgcmVhZDoKLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkTmFtZSkgewotICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgZmllbGROYW1lIDw8ICIgPSBbWyIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QsIHRydWUpCi0gICAgICAgICAgICAgIDw8ICIgYWxsb2NdIGluaXRdOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIlsiIDw8IGZpZWxkTmFtZSA8PCAiIHJlYWQ6IGluUHJvdG9jb2xdOyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBjb250YWluZXIgYnkgcmVhZGluZyBpdHMgc2l6ZSBhbmQgdGhlbiBpdGVyYXRpbmcKLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGROYW1lKSB7Ci0gIHN0cmluZyBzaXplID0gdG1wKCJfc2l6ZSIpOwotICBpbmRlbnQob3V0KSA8PCAiaW50ICIgPDwgc2l6ZSA8PCAiOyIgPDwgZW5kbDsKLQotICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJbaW5Qcm90b2NvbCByZWFkTWFwQmVnaW5SZXR1cm5pbmdLZXlUeXBlOiBOVUxMIHZhbHVlVHlwZTogTlVMTCBzaXplOiAmIiA8PCBzaXplCi0gICAgICAgICAgICAgICAgPDwgIl07IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJOU011dGFibGVEaWN0aW9uYXJ5ICogIiA8PCBmaWVsZE5hbWUKLSAgICAgICAgICAgICAgICA8PCAiID0gW1tOU011dGFibGVEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aENhcGFjaXR5OiAiIDw8IHNpemUgPDwgIl07IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJbaW5Qcm90b2NvbCByZWFkU2V0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZTogTlVMTCBzaXplOiAmIiA8PCBzaXplIDw8ICJdOyIKLSAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJOU011dGFibGVTZXQgKiAiIDw8IGZpZWxkTmFtZQotICAgICAgICAgICAgICAgIDw8ICIgPSBbW05TTXV0YWJsZVNldCBhbGxvY10gaW5pdFdpdGhDYXBhY2l0eTogIiA8PCBzaXplIDw8ICJdOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIltpblByb3RvY29sIHJlYWRMaXN0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZTogTlVMTCBzaXplOiAmIiA8PCBzaXplIDw8ICJdOyIKLSAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJOU011dGFibGVBcnJheSAqICIgPDwgZmllbGROYW1lCi0gICAgICAgICAgICAgICAgPDwgIiA9IFtbTlNNdXRhYmxlQXJyYXkgYWxsb2NdIGluaXRXaXRoQ2FwYWNpdHk6ICIgPDwgc2l6ZSA8PCAiXTsiIDw8IGVuZGw7Ci0gIH0KLSAgLy8gRklYTUUgLSB0aGUgY29kZSBhYm92ZSBkb2VzIG5vdCB2ZXJpZnkgdGhhdCB0aGUgZWxlbWVudCB0eXBlcyBvZgotICAvLyB0aGUgY29udGFpbmVycyBiZWluZyByZWFkIG1hdGNoIHRoZSBlbGVtZW50IHR5cGVzIG9mIHRoZQotICAvLyBjb250YWluZXJzIHdlIGFyZSByZWFkaW5nIGludG8uICBEb2VzIHRoYXQgbWF0dGVyPwotCi0gIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKLSAgc3RyaW5nIGkgPSB0bXAoIl9pIik7Ci0gIGluZGVudChvdXQpIDw8ICJpbnQgIiA8PCBpIDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJmb3IgKCIgPDwgaSA8PCAiID0gMDsgIiA8PCBpIDw8ICIgPCAiCi0gICAgICAgICAgICAgIDw8IHNpemUgPDwgIjsgIgotICAgICAgICAgICAgICA8PCAiKysiIDw8IGkgPDwgIikiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfdXAob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBmaWVsZE5hbWUpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgZmllbGROYW1lKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGZpZWxkTmFtZSk7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgLy8gUmVhZCBjb250YWluZXIgZW5kCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiW2luUHJvdG9jb2wgcmVhZE1hcEVuZF07IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJbaW5Qcm90b2NvbCByZWFkU2V0RW5kXTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJbaW5Qcm90b2NvbCByZWFkTGlzdEVuZF07IiA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogVGFrZSBhIHZhcmlhYmxlIG9mIGEgZ2l2ZW4gdHlwZSBhbmQgd3JhcCBpdCBpbiBjb2RlIHRvIG1ha2UgaXQKLSAqIHN1aXRhYmxlIGZvciBwdXR0aW5nIGludG8gYSBjb250YWluZXIsIGlmIG5lY2Vzc2FyeS4gIEJhc2ljYWxseSwKLSAqIHdyYXAgc2NhbGVyIHByaW1pdGl2ZXMgaW4gTlNOdW1iZXIgb2JqZWN0cy4KLSAqLwotc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpjb250YWluZXJpemUodF90eXBlKiB0dHlwZSwgc3RyaW5nIGZpZWxkTmFtZSkgewotICAvLyBGSVhNRSAtIG9wdGltaXplIGhlcmUgdG8gYXZvaWQgYXV0b3JlbGVhc2UgcG9vbD8KLSAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKLSAgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIltOU051bWJlciBudW1iZXJXaXRoSW50OiAiICsgZmllbGROYW1lICsgIl0iOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJjYW4ndCBjb250YWluZXJpemUgdm9pZCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJbTlNOdW1iZXIgbnVtYmVyV2l0aEJvb2w6ICIgKyBmaWVsZE5hbWUgKyAiXSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJbTlNOdW1iZXIgbnVtYmVyV2l0aFVuc2lnbmVkQ2hhcjogIiArIGZpZWxkTmFtZSArICJdIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiW05TTnVtYmVyIG51bWJlcldpdGhTaG9ydDogIiArIGZpZWxkTmFtZSArICJdIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiW05TTnVtYmVyIG51bWJlcldpdGhMb25nOiAiICsgZmllbGROYW1lICsgIl0iOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJbTlNOdW1iZXIgbnVtYmVyV2l0aExvbmdMb25nOiAiICsgZmllbGROYW1lICsgIl0iOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJbTlNOdW1iZXIgbnVtYmVyV2l0aERvdWJsZTogIiArIGZpZWxkTmFtZSArICJdIjsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgLy8gZG8gbm90aGluZwotICByZXR1cm4gZmllbGROYW1lOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIHRvIGRlc2VyaWFsaXplIGEgbWFwIGVsZW1lbnQKLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkTmFtZSkgewotICBzdHJpbmcga2V5ID0gdG1wKCJfa2V5Iik7Ci0gIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKLSAgdF90eXBlKiBrZXlUeXBlID0gdG1hcC0+Z2V0X2tleV90eXBlKCk7Ci0gIHRfdHlwZSogdmFsVHlwZSA9IHRtYXAtPmdldF92YWxfdHlwZSgpOwotICB0X2ZpZWxkIGZrZXkoa2V5VHlwZSwga2V5KTsKLSAgdF9maWVsZCBmdmFsKHZhbFR5cGUsIHZhbCk7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSwga2V5KTsKLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCwgdmFsKTsKLQotICBpbmRlbnQob3V0KSA8PCAiWyIgPDwgZmllbGROYW1lIDw8ICIgc2V0T2JqZWN0OiAiIDw8IGNvbnRhaW5lcml6ZSh2YWxUeXBlLCB2YWwpCi0gICAgICAgICAgICAgIDw8ICIgZm9yS2V5OiAiIDw8IGNvbnRhaW5lcml6ZShrZXlUeXBlLCBrZXkpIDw8ICJdOyIgPDwgZW5kbDsKLQotICBpZiAodHlwZV9jYW5fYmVfbnVsbChrZXlUeXBlKSkgewotICAgIGlmICghKGdldF90cnVlX3R5cGUoa2V5VHlwZSktPmlzX3N0cmluZygpKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIlsiIDw8IGNvbnRhaW5lcml6ZShrZXlUeXBlLCBrZXkpIDw8ICIgcmVsZWFzZV9zdHViXTsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaWYgKHR5cGVfY2FuX2JlX251bGwodmFsVHlwZSkpIHsKLSAgICBpZiAoIShnZXRfdHJ1ZV90eXBlKHZhbFR5cGUpLT5pc19zdHJpbmcoKSkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJbIiA8PCBjb250YWluZXJpemUodmFsVHlwZSwgdmFsKSA8PCAiIHJlbGVhc2Vfc3R1Yl07IiA8PCBlbmRsOwotICAgIH0KLSAgfQotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIHNldCBlbGVtZW50Ci0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZE5hbWUpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7Ci0gIHRfdHlwZSogdHlwZSA9IHRzZXQtPmdldF9lbGVtX3R5cGUoKTsKLSAgdF9maWVsZCBmZWxlbSh0eXBlLCBlbGVtKTsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSwgZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwgIlsiIDw8IGZpZWxkTmFtZSA8PCAiIGFkZE9iamVjdDogIiA8PCBjb250YWluZXJpemUodHlwZSwgZWxlbSkgPDwgIl07IiA8PCBlbmRsOwotCi0gIGlmICh0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7Ci0gICAgLy8gZGVzZXJpYWxpemVkIHN0cmluZ3MgYXJlIGF1dG9yZWxlYXNlLCBzbyBkb24ndCByZWxlYXNlIHRoZW0KLSAgICBpZiAoIShnZXRfdHJ1ZV90eXBlKHR5cGUpLT5pc19zdHJpbmcoKSkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJbIiA8PCBjb250YWluZXJpemUodHlwZSwgZWxlbSkgPDwgIiByZWxlYXNlX3N0dWJdOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBsaXN0IGVsZW1lbnQKLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGROYW1lKSB7Ci0gIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOwotICB0X3R5cGUqIHR5cGUgPSB0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpOwotICB0X2ZpZWxkIGZlbGVtKHR5cGUsIGVsZW0pOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtLCBlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PCAiWyIgPDwgZmllbGROYW1lIDw8ICIgYWRkT2JqZWN0OiAiIDw8IGNvbnRhaW5lcml6ZSh0eXBlLCBlbGVtKSA8PCAiXTsiIDw8IGVuZGw7Ci0KLSAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKLSAgICBpZiAoIShnZXRfdHJ1ZV90eXBlKHR5cGUpLT5pc19zdHJpbmcoKSkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJbIiA8PCBjb250YWluZXJpemUodHlwZSwgZWxlbSkgPDwgIiByZWxlYXNlX3N0dWJdOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCi0gKgotICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gZmllbGROYW1lIE5hbWUgdG8gb2YgdGhlIHZhcmlhYmxlIGhvbGRpbmcgdGhlIGZpZWxkCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBmaWVsZE5hbWUpIHsKLSAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotCi0gIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgZmllbGROYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBmaWVsZE5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotICAgIGluZGVudChvdXQpIDw8ICJbb3V0UHJvdG9jb2wgIjsKLQotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIGZpZWxkTmFtZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgICAgIG91dCA8PCAid3JpdGVCaW5hcnk6ICIgPDwgZmllbGROYW1lIDw8ICJdOyI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZzogIiA8PCBmaWVsZE5hbWUgPDwgIl07IjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUJvb2w6ICIgPDwgZmllbGROYW1lIDw8ICJdOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBvdXQgPDwgIndyaXRlQnl0ZTogIiA8PCBmaWVsZE5hbWUgPDwgIl07IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNjogIiA8PCBmaWVsZE5hbWUgPDwgIl07IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMjogIiA8PCBmaWVsZE5hbWUgPDwgIl07IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUk2NDogIiA8PCBmaWVsZE5hbWUgPDwgIl07IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZTogIiA8PCBmaWVsZE5hbWUgPDwgIl07IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIE9iamVjdGl2ZS1DIG5hbWUgZm9yIGJhc2UgdHlwZSAiCi0gICAgICAgICAgICArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIG91dCA8PCAid3JpdGVJMzI6ICIgPDwgZmllbGROYW1lIDw8ICJdOyI7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCi0gICAgICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKLSAgfQotfQotCi0vKioKLSAqIFNlcmlhbGl6ZSBhIHN0cnVjdC4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IHRvIHNlcmlhbGl6ZQotICogQHBhcmFtIGZpZWxkTmFtZSBOYW1lIG9mIHZhcmlhYmxlIGhvbGRpbmcgc3RydWN0Ci0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZE5hbWUpIHsKLSAgKHZvaWQpdHN0cnVjdDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJbIiA8PCBmaWVsZE5hbWUgPDwgIiB3cml0ZTogb3V0UHJvdG9jb2xdOyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHdyaXRpbmcgaXRzIHNpemUgdGhlbiB0aGUgZWxlbWVudHMuCi0gKgotICogQHBhcmFtIHR0eXBlICBUaGUgdHlwZSBvZiBjb250YWluZXIKLSAqIEBwYXJhbSBmaWVsZE5hbWUgTmFtZSBvZiB2YXJpYWJsZSBob2xkaW5nIGNvbnRhaW5lcgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZE5hbWUpIHsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIltvdXRQcm90b2NvbCB3cml0ZU1hcEJlZ2luV2l0aEtleVR5cGU6ICIKLSAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkKLSAgICAgICAgICAgICAgICA8PCAiIHZhbHVlVHlwZTogIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiBzaXplOiBbIgotICAgICAgICAgICAgICAgIDw8IGZpZWxkTmFtZSA8PCAiIGNvdW50XV07IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJbb3V0UHJvdG9jb2wgd3JpdGVTZXRCZWdpbldpdGhFbGVtZW50VHlwZTogIgotICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiBzaXplOiBbIiA8PCBmaWVsZE5hbWUKLSAgICAgICAgICAgICAgICA8PCAiIGNvdW50XV07IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiW291dFByb3RvY29sIHdyaXRlTGlzdEJlZ2luV2l0aEVsZW1lbnRUeXBlOiAiCi0gICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiBzaXplOiBbIiA8PCBmaWVsZE5hbWUKLSAgICAgICAgICAgICAgICA8PCAiIGNvdW50XV07IiA8PCBlbmRsOwotICB9Ci0KLSAgc3RyaW5nIGl0ZXIgPSB0bXAoIl9pdGVyIik7Ci0gIHN0cmluZyBrZXk7Ci0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBrZXkgPSB0bXAoImtleSIpOwotICAgIGluZGVudChvdXQpIDw8ICJOU0VudW1lcmF0b3IgKiAiIDw8IGl0ZXIgPDwgIiA9IFsiIDw8IGZpZWxkTmFtZSA8PCAiIGtleUVudW1lcmF0b3JdOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiaWQgIiA8PCBrZXkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIndoaWxlICgoIiA8PCBrZXkgPDwgIiA9IFsiIDw8IGl0ZXIgPDwgIiBuZXh0T2JqZWN0XSkpIiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGtleSA9IHRtcCgib2JqIik7Ci0gICAgaW5kZW50KG91dCkgPDwgIk5TRW51bWVyYXRvciAqICIgPDwgaXRlciA8PCAiID0gWyIgPDwgZmllbGROYW1lIDw8ICIgb2JqZWN0RW51bWVyYXRvcl07IgotICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgImlkICIgPDwga2V5IDw8ICI7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJ3aGlsZSAoKCIgPDwga2V5IDw8ICIgPSBbIiA8PCBpdGVyIDw8ICIgbmV4dE9iamVjdF0pKSIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAga2V5ID0gdG1wKCJpZHgiKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiaW50ICIgPDwga2V5IDw8ICI7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJmb3IgKCIgPDwga2V5IDw8ICIgPSAwOyAiIDw8IGtleSA8PCAiIDwgWyIgPDwgZmllbGROYW1lIDw8ICIgY291bnRdOyAiIDw8IGtleQotICAgICAgICAgICAgICAgIDw8ICIrKykiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV91cChvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBrZXksIGZpZWxkTmFtZSk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwga2V5KTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBrZXksIGZpZWxkTmFtZSk7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJbb3V0UHJvdG9jb2wgd3JpdGVNYXBFbmRdOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiW291dFByb3RvY29sIHdyaXRlU2V0RW5kXTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJbb3V0UHJvdG9jb2wgd3JpdGVMaXN0RW5kXTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci19Ci0KLS8qKgotICogR2l2ZW4gYSBmaWVsZCB2YXJpYWJsZSBuYW1lLCB3cmFwIGl0IGluIGNvZGUgdGhhdCBjb252ZXJ0cyBpdCB0byBhCi0gKiBwcmltaXRpdmUgdHlwZSwgaWYgbmVjZXNzYXJ5LgotICovCi1zdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmRlY29udGFpbmVyaXplKHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIGZpZWxkTmFtZSkgewotICB0X3R5cGUqIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotICBpZiAodHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiWyIgKyBmaWVsZE5hbWUgKyAiIGludFZhbHVlXSI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgImNhbid0IGRlY29udGFpbmVyaXplIHZvaWQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiWyIgKyBmaWVsZE5hbWUgKyAiIGJvb2xWYWx1ZV0iOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJldHVybiAiWyIgKyBmaWVsZE5hbWUgKyAiIHVuc2lnbmVkQ2hhclZhbHVlXSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gIlsiICsgZmllbGROYW1lICsgIiBzaG9ydFZhbHVlXSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gIlsiICsgZmllbGROYW1lICsgIiBsb25nVmFsdWVdIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiWyIgKyBmaWVsZE5hbWUgKyAiIGxvbmdMb25nVmFsdWVdIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiWyIgKyBmaWVsZE5hbWUgKyAiIGRvdWJsZVZhbHVlXSI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIC8vIGRvIG5vdGhpbmcKLSAgcmV0dXJuIGZpZWxkTmFtZTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBtYXBOYW1lKSB7Ci0gIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCBkZWNvbnRhaW5lcml6ZSgma2ZpZWxkLCBrZXkpKTsKLSAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksICJbIiArIG1hcE5hbWUgKyAiIG9iamVjdEZvcktleTogIiArIGtleSArICJdIik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQsIGRlY29udGFpbmVyaXplKCZ2ZmllbGQsIHZmaWVsZC5nZXRfbmFtZSgpKSk7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbWVudE5hbWUpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCBkZWNvbnRhaW5lcml6ZSgmZWZpZWxkLCBlbGVtZW50TmFtZSkpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGxpc3ROYW1lKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksICJbIiArIGxpc3ROYW1lICsgIiBvYmplY3RBdEluZGV4OiAiICsgaW5kZXggKyAiXSIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCBkZWNvbnRhaW5lcml6ZSgmZWZpZWxkLCBlZmllbGQuZ2V0X25hbWUoKSkpOwotfQotCi0vKioKLSAqIFJldHVybnMgYW4gT2JqZWN0aXZlLUMgbmFtZQotICoKLSAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQotICogQHBhcmFtIGNsYXNzX3JlZiBEbyB3ZSB3YW50IGEgQ2xhc3MgcmVmZXJlbmNlIGlzdGVhZCBvZiBhIHR5cGUgcmVmZXJlbmNlPwotICogQHJldHVybiBKYXZhIHR5cGUgbmFtZSwgaS5lLiBIYXNoTWFwPEtleSxWYWx1ZT4KLSAqLwotc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBjbGFzc19yZWYpIHsKLSAgaWYgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKLSAgICByZXR1cm4gcHJvZ3JhbSA/IChwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJjb2NvYSIpICsgdHR5cGUtPmdldF9uYW1lKCkpIDogdHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBzdHJpbmcgcmVzdWx0OwotICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgcmV0dXJuIGJhc2VfdHlwZV9uYW1lKCh0X2Jhc2VfdHlwZSopdHR5cGUpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gImludCI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmVzdWx0ID0gIk5TTXV0YWJsZURpY3Rpb25hcnkiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIHJlc3VsdCA9ICJOU011dGFibGVTZXQiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXN1bHQgPSAiTlNNdXRhYmxlQXJyYXkiOwotICB9IGVsc2UgewotICAgIC8vIENoZWNrIGZvciBwcmVmaXgKLSAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKLSAgICBpZiAocHJvZ3JhbSAhPSBOVUxMKSB7Ci0gICAgICByZXN1bHQgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJjb2NvYSIpICsgdHR5cGUtPmdldF9uYW1lKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCA9IHR0eXBlLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgfQotCi0gIGlmICghY2xhc3NfcmVmKSB7Ci0gICAgcmVzdWx0ICs9ICIgKiI7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBPYmplY3RpdmUtQyB0eXBlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHRocmlmdCB0eXBlLgotICoKLSAqIEBwYXJhbSB0YmFzZSBUaGUgYmFzZSB0eXBlCi0gKi8KLXN0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6YmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHR5cGUpIHsKLSAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9IHR5cGUtPmdldF9iYXNlKCk7Ci0KLSAgc3dpdGNoICh0YmFzZSkgewotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgcmV0dXJuICJ2b2lkIjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7Ci0gICAgICByZXR1cm4gIk5TRGF0YSAqIjsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuICJOU1N0cmluZyAqIjsKLSAgICB9Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICByZXR1cm4gIkJPT0wiOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgcmV0dXJuICJ1aW50OF90IjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgcmV0dXJuICJpbnQxNl90IjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgcmV0dXJuICJpbnQzMl90IjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgcmV0dXJuICJpbnQ2NF90IjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgcmV0dXJuICJkb3VibGUiOwotICBkZWZhdWx0OgotICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gT2JqZWN0aXZlLUMgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICB9Ci19Ci0KLS8qKgotICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCi0gKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQotICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWZ2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Byb3BlcnR5KSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGluZGVudChvdXQpOwotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICBzdHJpbmcgdjIgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCB0eXBlLCB2YWx1ZSk7Ci0gICAgaWYgKGRlZnZhbCkKLSAgICAgIG91dCA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiOwotICAgIG91dCA8PCBuYW1lIDw8ICIgPSAiIDw8IHYyIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgaWYgKGRlZnZhbCkKLSAgICAgIG91dCA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiOwotICAgIG91dCA8PCBuYW1lIDw8ICIgPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIHR5cGUsIHZhbHVlKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBpZiAoZGVmdmFsKQotICAgICAgb3V0IDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICI7Ci0gICAgaWYgKGRlZnZhbCB8fCBpc19wcm9wZXJ0eSkKLSAgICAgIG91dCA8PCBuYW1lIDw8ICIgPSBbW1siIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlKSA8PCAiIGFsbG9jXSBpbml0XSBhdXRvcmVsZWFzZV9zdHViXTsiCi0gICAgICAgICAgPDwgZW5kbDsKLSAgICBlbHNlCi0gICAgICBvdXQgPDwgbmFtZSA8PCAiID0gW1siIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlKSA8PCAiIGFsbG9jXSBpbml0XTsiIDw8IGVuZGw7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7Ci0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgewotICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgIH0KLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGNhcGl0YWxpemUodl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJbIiA8PCBuYW1lIDw8ICIgc2V0IiA8PCBjYXBfbmFtZSA8PCAiOiIgPDwgdmFsIDw8ICJdOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBpZiAoZGVmdmFsKQotICAgICAgb3V0IDw8ICJOU011dGFibGVEaWN0aW9uYXJ5ICoiOwotICAgIGlmIChkZWZ2YWwgfHwgaXNfcHJvcGVydHkpCi0gICAgICBvdXQgPDwgbmFtZSA8PCAiID0gW1tbTlNNdXRhYmxlRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhDYXBhY2l0eToiIDw8IHZhbC5zaXplKCkKLSAgICAgICAgICA8PCAiXSBhdXRvcmVsZWFzZV9zdHViXTsgIiA8PCBlbmRsOwotICAgIGVsc2UKLSAgICAgIG91dCA8PCBuYW1lIDw8ICIgPSBbW05TTXV0YWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoQ2FwYWNpdHk6IiA8PCB2YWwuc2l6ZSgpIDw8ICJdOyAiCi0gICAgICAgICAgPDwgZW5kbDsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgc3RyaW5nIGtleSA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIGt0eXBlLCB2X2l0ZXItPmZpcnN0LCB0cnVlKTsKLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCB2dHlwZSwgdl9pdGVyLT5zZWNvbmQsIHRydWUpOwotICAgICAgaW5kZW50KG91dCkgPDwgIlsiIDw8IG5hbWUgPDwgIiBzZXRPYmplY3Q6IiA8PCB2YWwgPDwgIiBmb3JLZXk6IiA8PCBrZXkgPDwgIl07IiA8PCBlbmRsOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGlmIChkZWZ2YWwpCi0gICAgICBvdXQgPDwgIk5TTXV0YWJsZUFycmF5ICoiOwotICAgIGlmIChkZWZ2YWwgfHwgaXNfcHJvcGVydHkpCi0gICAgICBvdXQgPDwgbmFtZSA8PCAiID0gW1tbTlNNdXRhYmxlQXJyYXkgYWxsb2NdIGluaXRXaXRoQ2FwYWNpdHk6IiA8PCB2YWwuc2l6ZSgpCi0gICAgICAgICAgPDwgIl0gYXV0b3JlbGVhc2Vfc3R1Yl07IiA8PCBlbmRsOwotICAgIGVsc2UKLSAgICAgIG91dCA8PCBuYW1lIDw8ICIgPSBbW05TTXV0YWJsZUFycmF5IGFsbG9jXSBpbml0V2l0aENhcGFjaXR5OiIgPDwgdmFsLnNpemUoKSA8PCAiXTsiIDw8IGVuZGw7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBldHlwZSwgKnZfaXRlciwgdHJ1ZSk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiWyIgPDwgbmFtZSA8PCAiIGFkZE9iamVjdDoiIDw8IHZhbCA8PCAiXTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgdF90eXBlKiBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGlmIChkZWZ2YWwpCi0gICAgICBvdXQgPDwgIk5TTXV0YWJsZVNldCAqIjsKLSAgICBpZiAoZGVmdmFsIHx8IGlzX3Byb3BlcnR5KQotICAgICAgb3V0IDw8IG5hbWUgPDwgIiA9IFtbW05TTXV0YWJsZVNldCBhbGxvY10gaW5pdFdpdGhDYXBhY2l0eToiIDw8IHZhbC5zaXplKCkKLSAgICAgICAgICA8PCAiXSBhdXRvcmVsZWFzZV9zdHViXTsiIDw8IGVuZGw7Ci0gICAgZWxzZQotICAgICAgb3V0IDw8IG5hbWUgPDwgIiA9IFtbTlNNdXRhYmxlU2V0IGFsbG9jXSBpbml0V2l0aENhcGFjaXR5OiIgPDwgdmFsLnNpemUoKSA8PCAiXTsiIDw8IGVuZGw7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBldHlwZSwgKnZfaXRlciwgdHJ1ZSk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiWyIgPDwgbmFtZSA8PCAiIGFkZE9iamVjdDoiIDw8IHZhbCA8PCAiXTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgdHlwZSAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotfQotCi1zdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZShvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNvbnRhaW5lcml6ZV9pdCkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlbmRlcjsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgLy8gV2UgbXVzdCBoYW5kbGUgYmluYXJ5IGNvbnN0YW50IGJ1dCB0aGUgc3ludGF4IG9mIElETCBkZWZpbmVzCi0gICAgICAvLyBub3RoaW5nIGFib3V0IGJpbmFyeSBjb25zdGFudC4KLSAgICAgIC8vICAgaWYgKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKQotICAgICAgLy8gICAgICAvLyBiaW5hcnkgY29kZQotICAgICAgcmVuZGVyIDw8ICJAXCIiIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmVuZGVyIDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwKSA/ICJZRVMiIDogIk5PIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7Ci0gICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gIH0gZWxzZSB7Ci0gICAgc3RyaW5nIHQgPSB0bXAoInRtcCIpOwotICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwgdCwgdHlwZSwgdmFsdWUsIHRydWUsIGZhbHNlKTsKLSAgICByZW5kZXIgPDwgdDsKLSAgfQotCi0gIGlmIChjb250YWluZXJpemVfaXQpIHsKLSAgICByZXR1cm4gY29udGFpbmVyaXplKHR5cGUsIHJlbmRlci5zdHIoKSk7Ci0gIH0KLSAgcmV0dXJuIHJlbmRlci5zdHIoKTsKLX0KLQotI2lmIDAKLS8qKgotT1JJR0lOQUwKLSAqIFNwaXQgb3V0IGNvZGUgdGhhdCBldmFsdWF0ZXMgdG8gdGhlIHNwZWNpZmllZCBjb25zdGFudCB2YWx1ZS4KLSAqLwotc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUoc3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY29udGFpbmVyaXplX2l0KSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVuZGVyOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZW5kZXIgPDwgIkBcIiIgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZW5kZXIgPDwgKCh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDApID8gIllFUyIgOiAiTk8iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgaWYgKHZhbC5zaXplKCkgPiAwKQotICAgICAgcmVuZGVyIDw8ICJbWyIgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUpIDw8ICIgYWxsb2NdIGluaXRXaXRoIjsKLSAgICBlbHNlCi0gICAgICByZW5kZXIgPDwgIltbIiA8PCB0eXBlX25hbWUodHlwZSwgdHJ1ZSkgPDwgIiBhbGxvY10gaW5pdCI7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIC8vIEZJWE1FIFRoZSBnZW5lcmF0ZWQgY29kZSBkb2VzIG5vdCBtYXRjaCB3aXRoIGluaXRXaXRoWFhYCi0gICAgICAvLyAgICAgICBpbml0aWFsaXplciBhbmQgY2F1c2VzIGNvbXBpbGUgZXJyb3IuCi0gICAgICAvLyAgICAgICBUcnk6IHRlc3QvRGVidWdQcm90b1Rlc3QudGhyaWZ0IGFuZCB0ZXN0L1NtYWxsVGVzdC50aHJpZnQKLSAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7Ci0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgewotICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgIH0KLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICByZW5kZXIgPDwgY2FwaXRhbGl6ZSh2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpOwotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVuZGVyIDw8ICIgIiA8PCB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgICByZW5kZXIgPDwgIjogIiA8PCByZW5kZXJfY29uc3RfdmFsdWUobmFtZSwgZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgIH0KLSAgICByZW5kZXIgPDwgIl0iOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmVuZGVyIDw8ICJbW05TRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhPYmplY3RzQW5kS2V5czogIjsKLSAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgc3RyaW5nIGtleSA9IHJlbmRlcl9jb25zdF92YWx1ZShuYW1lLCBrdHlwZSwgdl9pdGVyLT5maXJzdCwgdHJ1ZSk7Ci0gICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG5hbWUsIHZ0eXBlLCB2X2l0ZXItPnNlY29uZCwgdHJ1ZSk7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlbmRlciA8PCAiLCAiOwotICAgICAgfQotICAgICAgcmVuZGVyIDw8IHZhbCA8PCAiLCAiIDw8IGtleTsKLSAgICB9Ci0gICAgaWYgKGZpcnN0KQotICAgICAgcmVuZGVyIDw8ICIgbmlsXSI7Ci0gICAgZWxzZQotICAgICAgcmVuZGVyIDw8ICIsIG5pbF0iOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJlbmRlciA8PCAiW1tOU0FycmF5IGFsbG9jXSBpbml0V2l0aE9iamVjdHM6ICI7Ci0gICAgdF90eXBlICogZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVuZGVyIDw8ICIsICI7Ci0gICAgICB9Ci0gICAgICByZW5kZXIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKG5hbWUsIGV0eXBlLCAqdl9pdGVyLCB0cnVlKTsKLSAgICB9Ci0gICAgaWYgKGZpcnN0KQotICAgICAgcmVuZGVyIDw8ICIgbmlsXSI7Ci0gICAgZWxzZQotICAgICAgcmVuZGVyIDw8ICIsIG5pbF0iOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmVuZGVyIDw8ICJbW05TU2V0IGFsbG9jXSBpbml0V2l0aE9iamVjdHM6ICI7Ci0gICAgdF90eXBlICogZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZW5kZXIgPDwgIiwgIjsKLSAgICAgIH0KLSAgICAgIHJlbmRlciA8PCByZW5kZXJfY29uc3RfdmFsdWUobmFtZSwgZXR5cGUsICp2X2l0ZXIsIHRydWUpOwotICAgIH0KLSAgICBpZiAoZmlyc3QpCi0gICAgICByZW5kZXIgPDwgIiBuaWxdIjsKLSAgICBlbHNlCi0gICAgICByZW5kZXIgPDwgIiwgbmlsXSI7Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgImRvbid0IGtub3cgaG93IHRvIHJlbmRlciBjb25zdGFudCBmb3IgdHlwZTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBpZiAoY29udGFpbmVyaXplX2l0KSB7Ci0gICAgcmV0dXJuIGNvbnRhaW5lcml6ZSh0eXBlLCByZW5kZXIuc3RyKCkpOwotICB9Ci0KLSAgcmV0dXJuIHJlbmRlci5zdHIoKTsKLX0KLSNlbmRpZgotCi0vKioKLSAqIERlY2xhcmVzIGEgZmllbGQuCi0gKgotICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCi0gKi8KLXN0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQpIHsKLSAgcmV0dXJuIHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpICsgIiBfXyIgKyB0ZmllbGQtPmdldF9uYW1lKCkgKyAiOyI7Ci19Ci0KLS8qKgotICogRGVjbGFyZXMgYW4gT2JqZWN0aXZlLUMgMi4wIHByb3BlcnR5LgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIGRlY2xhcmUgYSBwcm9wZXJ0eSBmb3IKLSAqLwotc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpkZWNsYXJlX3Byb3BlcnR5KHRfZmllbGQqIHRmaWVsZCkgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVuZGVyOwotICByZW5kZXIgPDwgIkBwcm9wZXJ0eSAobm9uYXRvbWljLCAiOwotCi0gIGlmICh0eXBlX2Nhbl9iZV9udWxsKHRmaWVsZC0+Z2V0X3R5cGUoKSkpCi0gICAgcmVuZGVyIDw8ICJyZXRhaW4sICI7Ci0KLSAgcmVuZGVyIDw8ICJnZXR0ZXI9IiA8PCBkZWNhcGl0YWxpemUodGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiLCBzZXR0ZXI9c2V0IgotICAgICAgICAgPDwgY2FwaXRhbGl6ZSh0ZmllbGQtPmdldF9uYW1lKCkpICsgIjopICIgPDwgdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSkgPDwgIiAiCi0gICAgICAgICA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIjsiOwotCi0gIHJldHVybiByZW5kZXIuc3RyKCk7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZQotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgotICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgotICovCi1zdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgdF90eXBlKiB0dHlwZSA9IHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKLSAgc3RkOjpzdHJpbmcgcmVzdWx0ID0gIigiICsgdHlwZV9uYW1lKHR0eXBlKSArICIpICIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSB0aGF0IHJldHVybnMgYXN5bmNocm9ub3VzbHkgaW5zdGVhZCBvZgotICogbGl0ZXJhbGx5IHJldHVybmluZy4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KLSAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KLSAqLwotc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjphc3luY19mdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIHRfdHlwZSogdHR5cGUgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7Ci0gIHRfc3RydWN0KiB0YXJnbGlzdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKLSAgc3RkOjpzdHJpbmcgcmVzcG9uc2VfcGFyYW0gPSAiZGlzcGF0Y2hfYmxvY2tfdCI7Ci0gIGlmICghdHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHJlc3BvbnNlX3BhcmFtID0gInZvaWQgKF4pKCIgKyB0eXBlX25hbWUodHR5cGUpICsgIikiOwotICB9Ci0gIHN0ZDo6c3RyaW5nIHJlc3VsdCA9ICIodm9pZCkgIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKQotICAgICAgICAgICAgICAgICAgICAgICArICh0YXJnbGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPyAiIHJlc3BvbnNlIiA6ICIiKSArICI6ICgiCi0gICAgICAgICAgICAgICAgICAgICAgICsgcmVzcG9uc2VfcGFyYW0gKyAiKSByZXNwb25zZUJsb2NrICIKLSAgICAgICAgICAgICAgICAgICAgICAgKyAiZmFpbHVyZSA6IChUQXN5bmNGYWlsdXJlQmxvY2spIGZhaWx1cmVCbG9jayI7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGNvbG9uIHNlcGFyYXRlZCBsaXN0IG9mIHR5cGVzIGFuZCBuYW1lcywgc3VpdGFibGUgZm9yIGFuCi0gKiBvYmplY3RpdmUtYyBwYXJhbWV0ZXIgbGlzdAotICovCi1zdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyaW5nIGFyZ1ByZWZpeCA9ICIiOwotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgYXJnUHJlZml4ID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgcmVzdWx0ICs9ICIgIjsKLSAgICB9Ci0gICAgcmVzdWx0ICs9IGFyZ1ByZWZpeCArICI6ICgiICsgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgKyAiKSAiICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYW4gT2JqZWN0aXZlLUMgZW51bSBzdHJpbmcgZm9yIHRoZSBnaXZlbiB0eXBlLgotICovCi1zdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gIlRUeXBlX1NUUklORyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJUVHlwZV9CT09MIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIlRUeXBlX0JZVEUiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICJUVHlwZV9JMTYiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICJUVHlwZV9JMzIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJUVHlwZV9JNjQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJUVHlwZV9ET1VCTEUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlX0kzMiI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiVFR5cGVfU1RSVUNUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiVFR5cGVfTUFQIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiVFR5cGVfU0VUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlX0xJU1QiOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0vKioKLSAqIFJldHVybnMgYSBmb3JtYXQgc3RyaW5nIHNwZWNpZmllciBmb3IgdGhlIHN1cHBsaWVkIHBhcnNlIHR5cGUuCi0gKi8KLXN0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6Zm9ybWF0X3N0cmluZ19mb3JfdHlwZSh0X3R5cGUqIHR5cGUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gIlxcXCIlQFxcXCIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiJWkiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJldHVybiAiJWkiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICIlaGkiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICIlaSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gIiVxaSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gIiVmIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICIlaSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiJUAiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICIlQCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIiVAIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIiVAIjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gZm9ybWF0X3N0cmluZ19mb3JfdHlwZTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGUgYSBjYWxsIHRvIGEgZmllbGQncyBzZXR0ZXIuCi0gKgotICogQHBhcmFtIHRmaWVsZCBGaWVsZCB0aGUgc2V0dGVyIGlzIGJlaW5nIGNhbGxlZCBvbgotICogQHBhcmFtIGZpZWxkTmFtZSBOYW1lIG9mIHZhcmlhYmxlIHRvIHBhc3MgdG8gc2V0dGVyCi0gKi8KLQotc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpjYWxsX2ZpZWxkX3NldHRlcih0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBmaWVsZE5hbWUpIHsKLSAgcmV0dXJuICJbc2VsZiBzZXQiICsgY2FwaXRhbGl6ZSh0ZmllbGQtPmdldF9uYW1lKCkpICsgIjogIiArIGZpZWxkTmFtZSArICJdOyI7Ci19Ci0KLVRIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoCi0gICAgY29jb2EsCi0gICAgIkNvY29hIiwKLSAgICAiICAgIGxvZ191bmV4cGVjdGVkOiAgTG9nIGV2ZXJ5IHRpbWUgYW4gdW5leHBlY3RlZCBmaWVsZCBJRCBvciB0eXBlIGlzIGVuY291bnRlcmVkLlxuIgotICAgICIgICAgdmFsaWRhdGVfcmVxdWlyZWQ6XG4iCi0gICAgIiAgICAgICAgICAgICAgICAgICAgIFRocm93cyBleGNlcHRpb24gaWYgYW55IHJlcXVpcmVkIGZpZWxkIGlzIG5vdCBzZXQuXG4iCi0gICAgIiAgICBhc3luY19jbGllbnRzOiAgIEdlbmVyYXRlIGNsaWVudHMgd2hpY2ggaW52b2tlIGFzeW5jaHJvbm91c2x5IHZpYSBibG9jayBzeW50YXguXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2NwcF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfY3BwX2dlbmVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUwM2Q5NC4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfY3BwX2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDQzNjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgotICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKLSAqIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGNhc3NlcnQ+Ci0KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0KLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotI2luY2x1ZGUgInRfb29wX2dlbmVyYXRvci5oIgotCi11c2luZyBzdGQ6Om1hcDsKLXVzaW5nIHN0ZDo6b2ZzdHJlYW07Ci11c2luZyBzdGQ6Om9zdHJlYW07Ci11c2luZyBzdGQ6OnN0cmluZzsKLXVzaW5nIHN0ZDo6dmVjdG9yOwotCi1zdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCi0KLS8qKgotICogQysrIGNvZGUgZ2VuZXJhdG9yLiBUaGlzIGlzIGxlZ2l0aW1hY3kgaW5jYXJuYXRlLgotICoKLSAqLwotY2xhc3MgdF9jcHBfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7Ci1wdWJsaWM6Ci0gIHRfY3BwX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKLSAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQotICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKLSAgICAodm9pZClvcHRpb25fc3RyaW5nOwotICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgicHVyZV9lbnVtcyIpOwotICAgIGdlbl9wdXJlX2VudW1zXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJpbmNsdWRlX3ByZWZpeCIpOwotICAgIHVzZV9pbmNsdWRlX3ByZWZpeF8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgiY29iX3N0eWxlIik7Ci0gICAgZ2VuX2NvYl9zdHlsZV8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgibm9fY2xpZW50X2NvbXBsZXRpb24iKTsKLSAgICBnZW5fbm9fY2xpZW50X2NvbXBsZXRpb25fID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoIm5vX2RlZmF1bHRfb3BlcmF0b3JzIik7Ci0gICAgZ2VuX25vX2RlZmF1bHRfb3BlcmF0b3JzXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJ0ZW1wbGF0ZXMiKTsKLSAgICBnZW5fdGVtcGxhdGVzXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGdlbl90ZW1wbGF0ZXNfb25seV8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSAmJiBpdGVyLT5zZWNvbmQgPT0gIm9ubHkiKTsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJtb3ZlYWJsZV90eXBlcyIpOwotICAgIGdlbl9tb3ZlYWJsZV8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1jcHAiOwotICB9Ci0KLSAgLyoqCi0gICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKLSAgICovCi0KLSAgdm9pZCBpbml0X2dlbmVyYXRvcigpOwotICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOwotCi0gIHZvaWQgZ2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpOwotCi0gIC8qKgotICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKLSAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOwotICB2b2lkIGdlbmVyYXRlX2ZvcndhcmRfZGVjbGFyYXRpb24odF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeyBnZW5lcmF0ZV9jcHBfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsgfQotICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsgZ2VuZXJhdGVfY3BwX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOyB9Ci0gIHZvaWQgZ2VuZXJhdGVfY3BwX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLQotICB2b2lkIHByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZShzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0X2RlY2xhcmF0aW9uKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlcnMgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZWFkID0gdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB3cml0ZSA9IHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3dhcCA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN0cmVhbSA9IGZhbHNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvZnN0cmVhbSYgZm9yY2VfY3BwX291dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNldHRlcnMgPSB0cnVlKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb3B5X2NvbnN0cnVjdG9yKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9tb3ZlX2NvbnN0cnVjdG9yKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb25zdHJ1Y3Rvcl9oZWxwZXIoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNwZXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfbW92ZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfYXNzaWdubWVudF9vcGVyYXRvcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9tb3ZlX2Fzc2lnbm1lbnRfb3BlcmF0b3Ioc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfYXNzaWdubWVudF9oZWxwZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19tb3ZlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3RfcmVhZGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgcG9pbnRlcnMgPSBmYWxzZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0X3dyaXRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIHBvaW50ZXJzID0gZmFsc2UpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdF9yZXN1bHRfd3JpdGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgcG9pbnRlcnMgPSBmYWxzZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0X3N3YXAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0X3ByaW50X21ldGhvZChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9leGNlcHRpb25fd2hhdF9tZXRob2Qoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0KLSAgLyoqCi0gICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlLCBzdHJpbmcgc3R5bGUpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlX2ZhY3RvcnkodF9zZXJ2aWNlKiB0c2VydmljZSwgc3RyaW5nIHN0eWxlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX251bGwodF9zZXJ2aWNlKiB0c2VydmljZSwgc3RyaW5nIHN0eWxlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX211bHRpZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSwgc3RyaW5nIHN0eWxlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0X3NlcnZpY2UqIHRzZXJ2aWNlLCBzdHJpbmcgc3R5bGUpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2tlbGV0b24odF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHN0eWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzcGVjaWFsaXplZCA9IGZhbHNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9hc3luY19za2VsZXRvbih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLQotICAvKioKLSAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzdWZmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlciA9IGZhbHNlKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwdXNoX2JhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGluZGV4KTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHN1ZmZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlciA9IGZhbHNlKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbl9jYWxsKG9zdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0YXJnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgYXJnX3ByZWZpeCk7Ci0gIC8qCi0gICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCi0gICAqLwotCi0gIHN0ZDo6c3RyaW5nIG5hbWVzcGFjZV9wcmVmaXgoc3RkOjpzdHJpbmcgbnMpOwotICBzdGQ6OnN0cmluZyBuYW1lc3BhY2Vfb3BlbihzdGQ6OnN0cmluZyBucyk7Ci0gIHN0ZDo6c3RyaW5nIG5hbWVzcGFjZV9jbG9zZShzdGQ6OnN0cmluZyBucyk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGluX3R5cGVkZWYgPSBmYWxzZSwgYm9vbCBhcmcgPSBmYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIGJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UpOwotICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluaXQgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXIgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNvbnN0YW50ID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZWZlcmVuY2UgPSBmYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzdHlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBuYW1lX3BhcmFtcyA9IHRydWUpOwotICBzdGQ6OnN0cmluZyBjb2JfZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5hbWVfcGFyYW1zID0gdHJ1ZSk7Ci0gIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgbmFtZV9wYXJhbXMgPSB0cnVlLCBib29sIHN0YXJ0X2NvbW1hID0gZmFsc2UpOwotICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9lbnVtX2NvbnN0YW50X2xpc3Qoc3RkOjpvZnN0cmVhbSYgZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjdG9yPHRfZW51bV92YWx1ZSo+JiBjb25zdGFudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc3VmZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2x1ZGVfdmFsdWVzKTsKLQotICB2b2lkIGdlbmVyYXRlX3N0cnVjdF9vc3RyZWFtX29wZXJhdG9yKHN0ZDo6b2ZzdHJlYW0mIGYsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3RfcHJpbnRfbWV0aG9kX2RlY2woc3RkOjpvZnN0cmVhbSYgZiwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2V4Y2VwdGlvbl93aGF0X21ldGhvZF9kZWNsKHN0ZDo6b2ZzdHJlYW0mIGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBleHRlcm5hbCA9IGZhbHNlKTsKLQotICBib29sIGlzX3JlZmVyZW5jZSh0X2ZpZWxkKiB0ZmllbGQpIHsgcmV0dXJuIHRmaWVsZC0+Z2V0X3JlZmVyZW5jZSgpOyB9Ci0KLSAgYm9vbCBpc19jb21wbGV4X3R5cGUodF90eXBlKiB0dHlwZSkgewotICAgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7Ci0KLSAgICByZXR1cm4gdHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKQotICAgICAgICAgICB8fCAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpCi0gICAgICAgICAgICAgICAmJiAoKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpID09IHRfYmFzZV90eXBlOjpUWVBFX1NUUklORykpOwotICB9Ci0KLSAgdm9pZCBzZXRfdXNlX2luY2x1ZGVfcHJlZml4KGJvb2wgdXNlX2luY2x1ZGVfcHJlZml4KSB7IHVzZV9pbmNsdWRlX3ByZWZpeF8gPSB1c2VfaW5jbHVkZV9wcmVmaXg7IH0KLQotcHJpdmF0ZToKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGluY2x1ZGUgcHJlZml4IHRvIHVzZSBmb3IgYSBmaWxlIGdlbmVyYXRlZCBieSBwcm9ncmFtLCBvciB0aGUKLSAgICogZW1wdHkgc3RyaW5nIGlmIG5vIGluY2x1ZGUgcHJlZml4IHNob3VsZCBiZSB1c2VkLgotICAgKi8KLSAgc3RkOjpzdHJpbmcgZ2V0X2luY2x1ZGVfcHJlZml4KGNvbnN0IHRfcHJvZ3JhbSYgcHJvZ3JhbSkgY29uc3Q7Ci0KLSAgLyoqCi0gICAqIFRydWUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIHB1cmUgZW51bXMgZm9yIFRocmlmdCBlbnVtcywgaW5zdGVhZCBvZiB3cmFwcGVyIGNsYXNzZXMuCi0gICAqLwotICBib29sIGdlbl9wdXJlX2VudW1zXzsKLQotICAvKioKLSAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgdGVtcGxhdGl6ZWQgcmVhZGVyL3dyaXRlciBtZXRob2RzLgotICAgKi8KLSAgYm9vbCBnZW5fdGVtcGxhdGVzXzsKLQotICAvKioKLSAgICogVHJ1ZSBpZmYgd2Ugc2hvdWxkIGdlbmVyYXRlIHByb2Nlc3MgZnVuY3Rpb24gcG9pbnRlcnMgZm9yIG9ubHkgdGVtcGxhdGl6ZWQKLSAgICogcmVhZGVyL3dyaXRlciBtZXRob2RzLgotICAgKi8KLSAgYm9vbCBnZW5fdGVtcGxhdGVzX29ubHlfOwotCi0gIC8qKgotICAgKiBUcnVlIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSBtb3ZlIGNvbnN0cnVjdG9ycyAmIGFzc2lnbm1lbnQgb3BlcmF0b3JzLgotICAgKi8KLSAgYm9vbCBnZW5fbW92ZWFibGVfOwotCi0gIC8qKgotICAgKiBUcnVlIGlmZiB3ZSBzaG91bGQgdXNlIGEgcGF0aCBwcmVmaXggaW4gb3VyICNpbmNsdWRlIHN0YXRlbWVudHMgZm9yIG90aGVyCi0gICAqIHRocmlmdC1nZW5lcmF0ZWQgaGVhZGVyIGZpbGVzLgotICAgKi8KLSAgYm9vbCB1c2VfaW5jbHVkZV9wcmVmaXhfOwotCi0gIC8qKgotICAgKiBUcnVlIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSAiQ29udGludWF0aW9uIE9CamVjdCItc3R5bGUgY2xhc3NlcyBhcyB3ZWxsLgotICAgKi8KLSAgYm9vbCBnZW5fY29iX3N0eWxlXzsKLQotICAvKioKLSAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgb21pdCBjYWxscyB0byBjb21wbGV0aW9uX18oKSBpbiBDb2JDbGllbnQgY2xhc3MuCi0gICAqLwotICBib29sIGdlbl9ub19jbGllbnRfY29tcGxldGlvbl87Ci0KLSAgLyoqCi0gICAqIFRydWUgaWYgd2Ugc2hvdWxkIG9taXQgZ2VuZXJhdGluZyB0aGUgZGVmYXVsdCBvcGVhcnRvcnMgPT0sICE9IGFuZCA8LgotICAgKi8KLSAgYm9vbCBnZW5fbm9fZGVmYXVsdF9vcGVyYXRvcnNfOwotCi0gIC8qKgotICAgKiBTdHJpbmdzIGZvciBuYW1lc3BhY2UsIGNvbXB1dGVkIG9uY2UgdXAgZnJvbnQgdGhlbiB1c2VkIGRpcmVjdGx5Ci0gICAqLwotCi0gIHN0ZDo6c3RyaW5nIG5zX29wZW5fOwotICBzdGQ6OnN0cmluZyBuc19jbG9zZV87Ci0KLSAgLyoqCi0gICAqIEZpbGUgc3RyZWFtcywgc3RvcmVkIGhlcmUgdG8gYXZvaWQgcGFzc2luZyB0aGVtIGFzIHBhcmFtZXRlcnMgdG8gZXZlcnkKLSAgICogZnVuY3Rpb24uCi0gICAqLwotCi0gIHN0ZDo6b2ZzdHJlYW0gZl90eXBlc187Ci0gIHN0ZDo6b2ZzdHJlYW0gZl90eXBlc19pbXBsXzsKLSAgc3RkOjpvZnN0cmVhbSBmX3R5cGVzX3RjY187Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9oZWFkZXJfOwotICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZV87Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9zZXJ2aWNlX3RjY187Ci0KLSAgLy8gVGhlIFByb2Nlc3NvckdlbmVyYXRvciBpcyB1c2VkIHRvIGdlbmVyYXRlIHBhcnRzIG9mIHRoZSBjb2RlLAotICAvLyBzbyBpdCBuZWVkcyBhY2Nlc3MgdG8gbWFueSBvZiBvdXIgcHJvdGVjdGVkIG1lbWJlcnMgYW5kIG1ldGhvZHMuCi0gIC8vCi0gIC8vIFRPRE86IFRoZSBjb2RlIHJlYWxseSBzaG91bGQgYmUgY2xlYW5lZCB1cCBzbyB0aGF0IGhlbHBlciBtZXRob2RzIGZvcgotICAvLyB3cml0aW5nIHRvIHRoZSBvdXRwdXQgZmlsZXMgYXJlIHNlcGFyYXRlIGZyb20gdGhlIGdlbmVyYXRvciBjbGFzc2VzCi0gIC8vIHRoZW1zZWx2ZXMuCi0gIGZyaWVuZCBjbGFzcyBQcm9jZXNzb3JHZW5lcmF0b3I7Ci19OwotCi0vKioKLSAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0Ci0gKiBzdHJlYW1zLgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQotICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOwotCi0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwcm9ncmFtX25hbWVfICsgIl90eXBlcy5oIjsKLSAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7Ci0KLSAgc3RyaW5nIGZfdHlwZXNfaW1wbF9uYW1lID0gZ2V0X291dF9kaXIoKSArIHByb2dyYW1fbmFtZV8gKyAiX3R5cGVzLmNwcCI7Ci0gIGZfdHlwZXNfaW1wbF8ub3BlbihmX3R5cGVzX2ltcGxfbmFtZS5jX3N0cigpKTsKLQotICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKLSAgICAvLyBJZiB3ZSBkb24ndCBvcGVuIHRoZSBzdHJlYW0sIGl0IGFwcGVhcnMgdG8ganVzdCBkaXNjYXJkIGRhdGEsCi0gICAgLy8gd2hpY2ggaXMgZmluZS4KLSAgICBzdHJpbmcgZl90eXBlc190Y2NfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwcm9ncmFtX25hbWVfICsgIl90eXBlcy50Y2MiOwotICAgIGZfdHlwZXNfdGNjXy5vcGVuKGZfdHlwZXNfdGNjX25hbWUuY19zdHIoKSk7Ci0gIH0KLQotICAvLyBQcmludCBoZWFkZXIKLSAgZl90eXBlc18gPDwgYXV0b2dlbl9jb21tZW50KCk7Ci0gIGZfdHlwZXNfaW1wbF8gPDwgYXV0b2dlbl9jb21tZW50KCk7Ci0gIGZfdHlwZXNfdGNjXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKTsKLQotICAvLyBTdGFydCBpZm5kZWYKLSAgZl90eXBlc18gPDwgIiNpZm5kZWYgIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJfVFlQRVNfSCIgPDwgZW5kbCA8PCAiI2RlZmluZSAiIDw8IHByb2dyYW1fbmFtZV8KLSAgICAgICAgICAgPDwgIl9UWVBFU19IIiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGZfdHlwZXNfdGNjXyA8PCAiI2lmbmRlZiAiIDw8IHByb2dyYW1fbmFtZV8gPDwgIl9UWVBFU19UQ0MiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIiA8PCBwcm9ncmFtX25hbWVfCi0gICAgICAgICAgICAgICA8PCAiX1RZUEVTX1RDQyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIEluY2x1ZGUgYmFzZSB0eXBlcwotICBmX3R5cGVzXyA8PCAiI2luY2x1ZGUgPGlvc2Z3ZD4iIDw8IGVuZGwKLSAgICAgICAgICAgPDwgZW5kbAotICAgICAgICAgICA8PCAiI2luY2x1ZGUgPHRocmlmdC9UaHJpZnQuaD4iIDw8IGVuZGwKLSAgICAgICAgICAgPDwgIiNpbmNsdWRlIDx0aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmg+IiA8PCBlbmRsCi0gICAgICAgICAgIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oPiIgPDwgZW5kbAotICAgICAgICAgICA8PCAiI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5oPiIgPDwgZW5kbAotICAgICAgICAgICA8PCBlbmRsOwotICAvLyBJbmNsdWRlIEMrK3h4IGNvbXBhdGliaWxpdHkgaGVhZGVyCi0gIGZfdHlwZXNfIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L2N4eGZ1bmN0aW9uYWwuaD4iIDw8IGVuZGw7Ci0KLSAgLy8gSW5jbHVkZSBvdGhlciBUaHJpZnQgaW5jbHVkZXMKLSAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgewotICAgIGZfdHlwZXNfIDw8ICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCooaW5jbHVkZXNbaV0pKSA8PCBpbmNsdWRlc1tpXS0+Z2V0X25hbWUoKQotICAgICAgICAgICAgIDw8ICJfdHlwZXMuaFwiIiA8PCBlbmRsOwotCi0gICAgLy8gWFhYKHNpbXBraW5zKTogSWYgZ2VuX3RlbXBsYXRlc18gaXMgZW5hYmxlZCwgd2UgY3VycmVudGx5IGFzc3VtZSBhbGwKLSAgICAvLyBpbmNsdWRlZCBmaWxlcyB3ZXJlIGFsc28gZ2VuZXJhdGVkIHdpdGggdGVtcGxhdGVzIGVuYWJsZWQuCi0gICAgZl90eXBlc190Y2NfIDw8ICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCooaW5jbHVkZXNbaV0pKSA8PCBpbmNsdWRlc1tpXS0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgICA8PCAiX3R5cGVzLnRjY1wiIiA8PCBlbmRsOwotICB9Ci0gIGZfdHlwZXNfIDw8IGVuZGw7Ci0KLSAgLy8gSW5jbHVkZSBjdXN0b20gaGVhZGVycwotICBjb25zdCB2ZWN0b3I8c3RyaW5nPiYgY3BwX2luY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9jcHBfaW5jbHVkZXMoKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjcHBfaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKLSAgICBpZiAoY3BwX2luY2x1ZGVzW2ldWzBdID09ICc8JykgewotICAgICAgZl90eXBlc18gPDwgIiNpbmNsdWRlICIgPDwgY3BwX2luY2x1ZGVzW2ldIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfdHlwZXNfIDw8ICIjaW5jbHVkZSBcIiIgPDwgY3BwX2luY2x1ZGVzW2ldIDw8ICJcIiIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLSAgZl90eXBlc18gPDwgZW5kbDsKLQotICAvLyBJbmNsdWRlIHRoZSB0eXBlcyBmaWxlCi0gIGZfdHlwZXNfaW1wbF8gPDwgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpIDw8IHByb2dyYW1fbmFtZV8KLSAgICAgICAgICAgICAgICA8PCAiX3R5cGVzLmhcIiIgPDwgZW5kbCA8PCBlbmRsOwotICBmX3R5cGVzX3RjY18gPDwgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpIDw8IHByb2dyYW1fbmFtZV8KLSAgICAgICAgICAgICAgIDw8ICJfdHlwZXMuaFwiIiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gVGhlIHN3YXAoKSBjb2RlIG5lZWRzIDxhbGdvcml0aG0+IGZvciBzdGQ6OnN3YXAoKQotICBmX3R5cGVzX2ltcGxfIDw8ICIjaW5jbHVkZSA8YWxnb3JpdGhtPiIgPDwgZW5kbDsKLSAgLy8gZm9yIG9wZXJhdG9yPDwKLSAgZl90eXBlc19pbXBsXyA8PCAiI2luY2x1ZGUgPG9zdHJlYW0+IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGZfdHlwZXNfaW1wbF8gPDwgIiNpbmNsdWRlIDx0aHJpZnQvVFRvU3RyaW5nLmg+IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gT3BlbiBuYW1lc3BhY2UKLSAgbnNfb3Blbl8gPSBuYW1lc3BhY2Vfb3Blbihwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiY3BwIikpOwotICBuc19jbG9zZV8gPSBuYW1lc3BhY2VfY2xvc2UocHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoImNwcCIpKTsKLQotICBmX3R5cGVzXyA8PCBuc19vcGVuXyA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZl90eXBlc19pbXBsXyA8PCBuc19vcGVuXyA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZl90eXBlc190Y2NfIDw8IG5zX29wZW5fIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBDbG9zZXMgdGhlIG91dHB1dCBmaWxlcy4KLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKLSAgLy8gQ2xvc2UgbmFtZXNwYWNlCi0gIGZfdHlwZXNfIDw8IG5zX2Nsb3NlXyA8PCBlbmRsIDw8IGVuZGw7Ci0gIGZfdHlwZXNfaW1wbF8gPDwgbnNfY2xvc2VfIDw8IGVuZGw7Ci0gIGZfdHlwZXNfdGNjXyA8PCBuc19jbG9zZV8gPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIEluY2x1ZGUgdGhlIHR5cGVzLnRjYyBmaWxlIGZyb20gdGhlIHR5cGVzIGhlYWRlciBmaWxlLAotICAvLyBzbyBjbGllbnRzIGRvbid0IGhhdmUgdG8gZXhwbGljaXRseSBpbmNsdWRlIHRoZSB0Y2MgZmlsZS4KLSAgLy8gVE9ETyhzaW1wa2lucyk6IE1ha2UgdGhpcyBhIHNlcGFyYXRlIG9wdGlvbi4KLSAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgZl90eXBlc18gPDwgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpIDw8IHByb2dyYW1fbmFtZV8KLSAgICAgICAgICAgICA8PCAiX3R5cGVzLnRjY1wiIiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBDbG9zZSBpZm5kZWYKLSAgZl90eXBlc18gPDwgIiNlbmRpZiIgPDwgZW5kbDsKLSAgZl90eXBlc190Y2NfIDw8ICIjZW5kaWYiIDw8IGVuZGw7Ci0KLSAgLy8gQ2xvc2Ugb3V0cHV0IGZpbGUKLSAgZl90eXBlc18uY2xvc2UoKTsKLSAgZl90eXBlc19pbXBsXy5jbG9zZSgpOwotICBmX3R5cGVzX3RjY18uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBUaGlzIGlzIGp1c3QgYSBzaW1wbGUgMS1saW5lciBpbiBDKysKLSAqCi0gKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7Ci0gIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ0eXBlZGVmICIgPDwgdHlwZV9uYW1lKHR0eXBlZGVmLT5nZXRfdHlwZSgpLCB0cnVlKSA8PCAiICIKLSAgICAgICAgICAgPDwgdHR5cGVkZWYtPmdldF9zeW1ib2xpYygpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtX2NvbnN0YW50X2xpc3Qoc3RkOjpvZnN0cmVhbSYgZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjdG9yPHRfZW51bV92YWx1ZSo+JiBjb25zdGFudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc3VmZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2x1ZGVfdmFsdWVzKSB7Ci0gIGYgPDwgIiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGNfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBmIDw8ICIsIiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnQoZikgPDwgcHJlZml4IDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCBzdWZmaXg7Ci0gICAgaWYgKGluY2x1ZGVfdmFsdWVzKSB7Ci0gICAgICBmIDw8ICIgPSAiIDw8ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgfQotICB9Ci0KLSAgZiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZikgPDwgIn07IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuIEluIEMrKywgdGhpcyBpcyBlc3NlbnRpYWxseSB0aGUgc2FtZQotICogYXMgdGhlIHRocmlmdCBkZWZpbml0aW9uIGl0c2VsZiwgdXNpbmcgdGhlIGVudW0ga2V5d29yZCBpbiBDKysuCi0gKgotICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOwotCi0gIHN0ZDo6c3RyaW5nIGVudW1fbmFtZSA9IHRlbnVtLT5nZXRfbmFtZSgpOwotICBpZiAoIWdlbl9wdXJlX2VudW1zXykgewotICAgIGVudW1fbmFtZSA9ICJ0eXBlIjsKLSAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAic3RydWN0ICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIiB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICB9Ci0gIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJlbnVtICIgPDwgZW51bV9uYW1lOwotCi0gIGdlbmVyYXRlX2VudW1fY29uc3RhbnRfbGlzdChmX3R5cGVzXywgY29uc3RhbnRzLCAiIiwgIiIsIHRydWUpOwotCi0gIGlmICghZ2VuX3B1cmVfZW51bXNfKSB7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3R5cGVzXyA8PCAifTsiIDw8IGVuZGw7Ci0gIH0KLQotICBmX3R5cGVzXyA8PCBlbmRsOwotCi0gIC8qKgotICAgICBHZW5lcmF0ZSBhIGNoYXJhY3RlciBhcnJheSBvZiBlbnVtIG5hbWVzIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuCi0gICovCi0gIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiOwotICBpZiAoIWdlbl9wdXJlX2VudW1zXykgewotICAgIHByZWZpeCA9IHRlbnVtLT5nZXRfbmFtZSgpICsgIjo6IjsKLSAgfQotCi0gIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImludCBfayIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIlZhbHVlc1tdID0iOwotICBnZW5lcmF0ZV9lbnVtX2NvbnN0YW50X2xpc3QoZl90eXBlc19pbXBsXywgY29uc3RhbnRzLCBwcmVmaXguY19zdHIoKSwgIiIsIGZhbHNlKTsKLQotICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJjb25zdCBjaGFyKiBfayIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIk5hbWVzW10gPSI7Ci0gIGdlbmVyYXRlX2VudW1fY29uc3RhbnRfbGlzdChmX3R5cGVzX2ltcGxfLCBjb25zdGFudHMsICJcIiIsICJcIiIsIGZhbHNlKTsKLQotICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiZXh0ZXJuIGNvbnN0IHN0ZDo6bWFwPGludCwgY29uc3QgY2hhcio+IF8iIDw8IHRlbnVtLT5nZXRfbmFtZSgpCi0gICAgICAgICAgIDw8ICJfVkFMVUVTX1RPX05BTUVTOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImNvbnN0IHN0ZDo6bWFwPGludCwgY29uc3QgY2hhcio+IF8iIDw8IHRlbnVtLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgPDwgIl9WQUxVRVNfVE9fTkFNRVMoOjphcGFjaGU6OnRocmlmdDo6VEVudW1JdGVyYXRvcigiIDw8IGNvbnN0YW50cy5zaXplKCkgPDwgIiwgX2siCi0gICAgICAgICAgICAgICAgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIlZhbHVlcyIKLSAgICAgICAgICAgICAgICA8PCAiLCBfayIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIk5hbWVzKSwgIgotICAgICAgICAgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0OjpURW51bUl0ZXJhdG9yKC0xLCBOVUxMLCBOVUxMKSk7IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgY2xhc3MgdGhhdCBob2xkcyBhbGwgdGhlIGNvbnN0YW50cy4KLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKSB7Ci0gIHN0cmluZyBmX2NvbnN0c19uYW1lID0gZ2V0X291dF9kaXIoKSArIHByb2dyYW1fbmFtZV8gKyAiX2NvbnN0YW50cy5oIjsKLSAgb2ZzdHJlYW0gZl9jb25zdHM7Ci0gIGZfY29uc3RzLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKLQotICBzdHJpbmcgZl9jb25zdHNfaW1wbF9uYW1lID0gZ2V0X291dF9kaXIoKSArIHByb2dyYW1fbmFtZV8gKyAiX2NvbnN0YW50cy5jcHAiOwotICBvZnN0cmVhbSBmX2NvbnN0c19pbXBsOwotICBmX2NvbnN0c19pbXBsLm9wZW4oZl9jb25zdHNfaW1wbF9uYW1lLmNfc3RyKCkpOwotCi0gIC8vIFByaW50IGhlYWRlcgotICBmX2NvbnN0cyA8PCBhdXRvZ2VuX2NvbW1lbnQoKTsKLSAgZl9jb25zdHNfaW1wbCA8PCBhdXRvZ2VuX2NvbW1lbnQoKTsKLQotICAvLyBTdGFydCBpZm5kZWYKLSAgZl9jb25zdHMgPDwgIiNpZm5kZWYgIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJfQ09OU1RBTlRTX0giIDw8IGVuZGwgPDwgIiNkZWZpbmUgIiA8PCBwcm9ncmFtX25hbWVfCi0gICAgICAgICAgIDw8ICJfQ09OU1RBTlRTX0giIDw8IGVuZGwgPDwgZW5kbCA8PCAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkKLSAgICAgICAgICAgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX3R5cGVzLmhcIiIgPDwgZW5kbCA8PCBlbmRsIDw8IG5zX29wZW5fIDw8IGVuZGwgPDwgZW5kbDsKLQotICBmX2NvbnN0c19pbXBsIDw8ICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCpnZXRfcHJvZ3JhbSgpKSA8PCBwcm9ncmFtX25hbWVfCi0gICAgICAgICAgICAgICAgPDwgIl9jb25zdGFudHMuaFwiIiA8PCBlbmRsIDw8IGVuZGwgPDwgbnNfb3Blbl8gPDwgZW5kbCA8PCBlbmRsOwotCi0gIGZfY29uc3RzIDw8ICJjbGFzcyAiIDw8IHByb2dyYW1fbmFtZV8gPDwgIkNvbnN0YW50cyB7IiA8PCBlbmRsIDw8ICIgcHVibGljOiIgPDwgZW5kbCA8PCAiICAiCi0gICAgICAgICAgIDw8IHByb2dyYW1fbmFtZV8gPDwgIkNvbnN0YW50cygpOyIgPDwgZW5kbCA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY19pdGVyOwotICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgewotICAgIHN0cmluZyBuYW1lID0gKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIHRfdHlwZSogdHlwZSA9ICgqY19pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICBmX2NvbnN0cyA8PCBpbmRlbnQoKSA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiIDw8IG5hbWUgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9jb25zdHMgPDwgIn07IiA8PCBlbmRsOwotCi0gIGZfY29uc3RzX2ltcGwgPDwgImNvbnN0ICIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiQ29uc3RhbnRzIGdfIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJfY29uc3RhbnRzOyIKLSAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGwgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiQ29uc3RhbnRzOjoiIDw8IHByb2dyYW1fbmFtZV8KLSAgICAgICAgICAgICAgICA8PCAiQ29uc3RhbnRzKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgcHJpbnRfY29uc3RfdmFsdWUoZl9jb25zdHNfaW1wbCwKLSAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkpOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX2NvbnN0c19pbXBsKSA8PCAifSIgPDwgZW5kbDsKLQotICBmX2NvbnN0cyA8PCBlbmRsIDw8ICJleHRlcm4gY29uc3QgIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJDb25zdGFudHMgZ18iIDw8IHByb2dyYW1fbmFtZV8KLSAgICAgICAgICAgPDwgIl9jb25zdGFudHM7IiA8PCBlbmRsIDw8IGVuZGwgPDwgbnNfY2xvc2VfIDw8IGVuZGwgPDwgZW5kbCA8PCAiI2VuZGlmIiA8PCBlbmRsOwotICBmX2NvbnN0cy5jbG9zZSgpOwotCi0gIGZfY29uc3RzX2ltcGwgPDwgZW5kbCA8PCBuc19jbG9zZV8gPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZwotICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKLSAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpwcmludF9jb25zdF92YWx1ZShvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgc3RyaW5nIHYyID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOwotICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIiA9ICIgPDwgdjIgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIgPSAoIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIikiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICI7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgYm9vbCBpc19ub25yZXF1aXJlZF9maWVsZCA9IGZhbHNlOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOwotICAgICAgaXNfbm9ucmVxdWlyZWRfZmllbGQgPSBmYWxzZTsKLSAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7Ci0gICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICAgICAgICBpc19ub25yZXF1aXJlZF9maWVsZCA9ICgqZl9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgIH0KLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuIiA8PCB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkgPDwgIiA9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOwotICAgICAgaWYgKGlzX25vbnJlcXVpcmVkX2ZpZWxkKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi5fX2lzc2V0LiIgPDwgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpIDw8ICIgPSB0cnVlOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgc3RyaW5nIGtleSA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLmluc2VydChzdGQ6Om1ha2VfcGFpcigiIDw8IGtleSA8PCAiLCAiIDw8IHZhbCA8PCAiKSk7IiA8PCBlbmRsOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgZXR5cGUsICp2X2l0ZXIpOwotICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLnB1c2hfYmFjaygiIDw8IHZhbCA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgdF90eXBlKiBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgZXR5cGUsICp2X2l0ZXIpOwotICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLmluc2VydCgiIDw8IHZhbCA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gcHJpbnRfY29uc3RfdmFsdWU6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotICB9Ci19Ci0KLS8qKgotICoKLSAqLwotc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7Ci0gICh2b2lkKW5hbWU7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSByZW5kZXI7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJlbmRlciA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZW5kZXIgPDwgKCh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDApID8gInRydWUiIDogImZhbHNlIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiTEwiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmVuZGVyIDw8ICIoIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIikiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICB9IGVsc2UgewotICAgIHN0cmluZyB0ID0gdG1wKCJ0bXAiKTsKLSAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiIDw8IHQgPDwgIjsiIDw8IGVuZGw7Ci0gICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCB0LCB0eXBlLCB2YWx1ZSk7Ci0gICAgcmVuZGVyIDw8IHQ7Ci0gIH0KLQotICByZXR1cm4gcmVuZGVyLnN0cigpOwotfQotCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZm9yd2FyZF9kZWNsYXJhdGlvbih0X3N0cnVjdCogdHN0cnVjdCkgewotICAvLyBGb3J3YXJkIGRlY2xhcmUgc3RydWN0IGRlZgotICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4gVGhpcyBpcyBhIGNsYXNzCi0gKiB3aXRoIGRhdGEgbWVtYmVycyBhbmQgYSByZWFkL3dyaXRlKCkgZnVuY3Rpb24sIHBsdXMgYSBtaXJyb3JpbmcgaXNzZXQKLSAqIGlubmVyIGNsYXNzLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3BwX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfc3RydWN0X2RlY2xhcmF0aW9uKGZfdHlwZXNfLCB0c3RydWN0LCBpc19leGNlcHRpb24sIGZhbHNlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlKTsKLSAgZ2VuZXJhdGVfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc19pbXBsXywgZl90eXBlc19pbXBsXywgdHN0cnVjdCk7Ci0KLSAgc3RkOjpvZnN0cmVhbSYgb3V0ID0gKGdlbl90ZW1wbGF0ZXNfID8gZl90eXBlc190Y2NfIDogZl90eXBlc19pbXBsXyk7Ci0gIGdlbmVyYXRlX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9zdHJ1Y3Rfc3dhcChmX3R5cGVzX2ltcGxfLCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfY29weV9jb25zdHJ1Y3RvcihmX3R5cGVzX2ltcGxfLCB0c3RydWN0LCBpc19leGNlcHRpb24pOwotICBpZiAoZ2VuX21vdmVhYmxlXykgewotICAgIGdlbmVyYXRlX21vdmVfY29uc3RydWN0b3IoZl90eXBlc19pbXBsXywgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKLSAgfQotICBnZW5lcmF0ZV9hc3NpZ25tZW50X29wZXJhdG9yKGZfdHlwZXNfaW1wbF8sIHRzdHJ1Y3QpOwotICBpZiAoZ2VuX21vdmVhYmxlXykgewotICAgIGdlbmVyYXRlX21vdmVfYXNzaWdubWVudF9vcGVyYXRvcihmX3R5cGVzX2ltcGxfLCB0c3RydWN0KTsKLSAgfQotICBnZW5lcmF0ZV9zdHJ1Y3RfcHJpbnRfbWV0aG9kKGZfdHlwZXNfaW1wbF8sIHRzdHJ1Y3QpOwotICBpZiAoaXNfZXhjZXB0aW9uKSB7Ci0gICAgZ2VuZXJhdGVfZXhjZXB0aW9uX3doYXRfbWV0aG9kKGZfdHlwZXNfaW1wbF8sIHRzdHJ1Y3QpOwotICB9Ci19Ci0KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb3B5X2NvbnN0cnVjdG9yKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX2NvbnN0cnVjdG9yX2hlbHBlcihvdXQsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbiwgLyppc19tb3ZlPSovZmFsc2UpOwotfQotCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbW92ZV9jb25zdHJ1Y3RvcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9jb25zdHJ1Y3Rvcl9oZWxwZXIob3V0LCB0c3RydWN0LCBpc19leGNlcHRpb24sIC8qaXNfbW92ZT0qL3RydWUpOwotfQotCi1uYW1lc3BhY2UgewotLy8gSGVscGVyIHRvIGNvbnZlcnQgYSB2YXJpYWJsZSB0byBydmFsdWUsIGlmIG1vdmUgaXMgZW5hYmxlZAotc3RkOjpzdHJpbmcgbWF5YmVNb3ZlKHN0ZDo6c3RyaW5nIGNvbnN0JiBvdGhlciwgYm9vbCBtb3ZlKSB7Ci0gIGlmIChtb3ZlKSB7Ci0gICAgcmV0dXJuICJzdGQ6Om1vdmUoIiArIG90aGVyICsgIikiOwotICB9Ci0gIHJldHVybiBvdGhlcjsKLX0KLX0KLQotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cnVjdG9yX2hlbHBlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfbW92ZSkgewotCi0gIHN0ZDo6c3RyaW5nIHRtcF9uYW1lID0gdG1wKCJvdGhlciIpOwotCi0gIGluZGVudChvdXQpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIjo6IiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpOwotCi0gIGlmIChpc19tb3ZlKSB7Ci0gICAgb3V0IDw8ICIoICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJiYgIjsKLSAgfSBlbHNlIHsKLSAgICBvdXQgPDwgIihjb25zdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiYgIjsKLSAgfQotICBvdXQgPDwgdG1wX25hbWUgPDwgIikgIjsKLSAgaWYgKGlzX2V4Y2VwdGlvbikKLSAgICBvdXQgPDwgIjogVEV4Y2VwdGlvbigpICI7Ci0gIG91dCA8PCAieyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0KLSAgLy8gZWxpbWluYXRlIGNvbXBpbGVyIHVudXNlZCB3YXJuaW5nCi0gIGlmIChtZW1iZXJzLmVtcHR5KCkpCi0gICAgaW5kZW50KG91dCkgPDwgIih2b2lkKSAiIDw8IHRtcF9uYW1lIDw8ICI7IiA8PCBlbmRsOwotCi0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBoYXNfbm9ucmVxdWlyZWRfZmllbGRzID0gZmFsc2U7Ci0gIGZvciAoZl9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBmX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkKLSAgICAgIGhhc19ub25yZXF1aXJlZF9maWVsZHMgPSB0cnVlOwotICAgIGluZGVudChvdXQpIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIgotICAgICAgICAgICAgICAgIDw8IG1heWJlTW92ZSh0bXBfbmFtZSArICIuIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwgaXNfbW92ZSkgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAoaGFzX25vbnJlcXVpcmVkX2ZpZWxkcykgewotICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0ID0gIiA8PCBtYXliZU1vdmUodG1wX25hbWUgKyAiLl9faXNzZXQiLCBpc19tb3ZlKSA8PCAiOyIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotfQotCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXNzaWdubWVudF9vcGVyYXRvcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBnZW5lcmF0ZV9hc3NpZ25tZW50X2hlbHBlcihvdXQsIHRzdHJ1Y3QsIC8qaXNfbW92ZT0qL2ZhbHNlKTsKLX0KLQotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX21vdmVfYXNzaWdubWVudF9vcGVyYXRvcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBnZW5lcmF0ZV9hc3NpZ25tZW50X2hlbHBlcihvdXQsIHRzdHJ1Y3QsIC8qaXNfbW92ZT0qL3RydWUpOwotfQotCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXNzaWdubWVudF9oZWxwZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfbW92ZSkgewotICBzdGQ6OnN0cmluZyB0bXBfbmFtZSA9IHRtcCgib3RoZXIiKTsKLQotICBpbmRlbnQob3V0KSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICImICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiOjpvcGVyYXRvcj0oIjsKLQotICBpZiAoaXNfbW92ZSkgewotICAgIG91dCA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICImJiAiOwotICB9IGVsc2UgewotICAgIG91dCA8PCAiY29uc3QgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICImICI7Ci0gIH0KLSAgb3V0IDw8IHRtcF9uYW1lIDw8ICIpIHsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0KLSAgLy8gZWxpbWluYXRlIGNvbXBpbGVyIHVudXNlZCB3YXJuaW5nCi0gIGlmIChtZW1iZXJzLmVtcHR5KCkpCi0gICAgaW5kZW50KG91dCkgPDwgIih2b2lkKSAiIDw8IHRtcF9uYW1lIDw8ICI7IiA8PCBlbmRsOwotCi0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBoYXNfbm9ucmVxdWlyZWRfZmllbGRzID0gZmFsc2U7Ci0gIGZvciAoZl9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBmX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkKLSAgICAgIGhhc19ub25yZXF1aXJlZF9maWVsZHMgPSB0cnVlOwotICAgIGluZGVudChvdXQpIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIgotICAgICAgICAgICAgICAgIDw8IG1heWJlTW92ZSh0bXBfbmFtZSArICIuIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwgaXNfbW92ZSkgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLSAgaWYgKGhhc19ub25yZXF1aXJlZF9maWVsZHMpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldCA9ICIgPDwgbWF5YmVNb3ZlKHRtcF9uYW1lICsgIi5fX2lzc2V0IiwgaXNfbW92ZSkgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICp0aGlzOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogV3JpdGVzIHRoZSBzdHJ1Y3QgZGVjbGFyYXRpb24gaW50byB0aGUgaGVhZGVyIGZpbGUKLSAqCi0gKiBAcGFyYW0gb3V0IE91dHB1dCBzdHJlYW0KLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QKLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF9kZWNsYXJhdGlvbihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB3cml0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzd2FwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN0cmVhbSkgewotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBpZiAoaXNfZXhjZXB0aW9uKSB7Ci0gICAgZXh0ZW5kcyA9ICIgOiBwdWJsaWMgOjphcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbiI7Ci0gIH0KLQotICAvLyBHZXQgbWVtYmVycwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotCi0gIC8vIFdyaXRlIHRoZSBpc3NldCBzdHJ1Y3R1cmUgZGVjbGFyYXRpb24gb3V0c2lkZSB0aGUgY2xhc3MuIFRoaXMgbWFrZXMKLSAgLy8gdGhlIGdlbmVyYXRlZCBjb2RlIGFtZW5hYmxlIHRvIHByb2Nlc3NpbmcgYnkgU1dJRy4KLSAgLy8gV2Ugb25seSBkZWNsYXJlIHRoZSBzdHJ1Y3QgaWYgaXQgZ2V0cyB1c2VkIGluIHRoZSBjbGFzcy4KLQotICAvLyBJc3NldCBzdHJ1Y3QgaGFzIGJvb2xlYW4gZmllbGRzLCBidXQgb25seSBmb3Igbm9uLXJlcXVpcmVkIGZpZWxkcy4KLSAgYm9vbCBoYXNfbm9ucmVxdWlyZWRfZmllbGRzID0gZmFsc2U7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkKLSAgICAgIGhhc19ub25yZXF1aXJlZF9maWVsZHMgPSB0cnVlOwotICB9Ci0KLSAgaWYgKGhhc19ub25yZXF1aXJlZF9maWVsZHMgJiYgKCFwb2ludGVycyB8fCByZWFkKSkgewotCi0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0eXBlZGVmIHN0cnVjdCBfIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJfX2lzc2V0IHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAiXyIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiX19pc3NldCgpICI7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBzdHJpbmcgaXNTZXQgPSAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSA/ICJ0cnVlIiA6ICJmYWxzZSI7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgb3V0IDw8ICI6ICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCBpc1NldCA8PCAiKSI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgIiwgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIigiIDw8IGlzU2V0IDw8ICIpIjsKLSAgICAgIH0KLSAgICB9Ci0gICAgb3V0IDw8ICIge30iIDw8IGVuZGw7Ci0KLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAiYm9vbCAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIDoxOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IF8iIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIl9faXNzZXQ7IiA8PCBlbmRsOwotICB9Ci0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgLy8gT3BlbiBzdHJ1Y3QgZGVmCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8IGV4dGVuZHMgPDwgIiB7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICA8PCAiIHB1YmxpYzoiIDw8IGVuZGwgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaWYgKCFwb2ludGVycykgewotICAgIC8vIENvcHkgY29uc3RydWN0b3IKLSAgICBpbmRlbnQob3V0KSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoY29uc3QgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICImKTsiIDw8IGVuZGw7Ci0KLSAgICAvLyBNb3ZlIGNvbnN0cnVjdG9yCi0gICAgaWYgKGdlbl9tb3ZlYWJsZV8pIHsKLSAgICAgIGluZGVudChvdXQpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiYmKTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gQXNzaWdubWVudCBPcGVyYXRvcgotICAgIGluZGVudChvdXQpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiYgb3BlcmF0b3I9KGNvbnN0ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJik7IgotICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0KLSAgICAvLyBNb3ZlIGFzc2lnbm1lbnQgb3BlcmF0b3IKLSAgICBpZiAoZ2VuX21vdmVhYmxlXykgewotICAgICAgaW5kZW50KG91dCkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJiBvcGVyYXRvcj0oIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICImJik7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIC8vIERlZmF1bHQgY29uc3RydWN0b3IKLSAgICBpbmRlbnQob3V0KSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoKSI7Ci0KLSAgICBib29sIGluaXRfY3RvciA9IGZhbHNlOwotCi0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgICAgaWYgKHQtPmlzX2Jhc2VfdHlwZSgpIHx8IHQtPmlzX2VudW0oKSB8fCBpc19yZWZlcmVuY2UoKm1faXRlcikpIHsKLSAgICAgICAgc3RyaW5nIGR2YWw7Ci0gICAgICAgIGlmICh0LT5pc19lbnVtKCkpIHsKLSAgICAgICAgICBkdmFsICs9ICIoIiArIHR5cGVfbmFtZSh0KSArICIpIjsKLSAgICAgICAgfQotICAgICAgICBkdmFsICs9ICh0LT5pc19zdHJpbmcoKSB8fCBpc19yZWZlcmVuY2UoKm1faXRlcikpID8gIiIgOiAiMCI7Ci0gICAgICAgIHRfY29uc3RfdmFsdWUqIGN2ID0gKCptX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICAgICAgaWYgKGN2ICE9IE5VTEwpIHsKLSAgICAgICAgICBkdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpLCB0LCBjdik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFpbml0X2N0b3IpIHsKLSAgICAgICAgICBpbml0X2N0b3IgPSB0cnVlOwotICAgICAgICAgIG91dCA8PCAiIDogIjsKLSAgICAgICAgICBvdXQgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCBkdmFsIDw8ICIpIjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBvdXQgPDwgIiwgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIigiIDw8IGR2YWwgPDwgIikiOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIG91dCA8PCAiIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgLy8gVE9ETyhkcmVpc3MpOiBXaGVuIGV2ZXJ5dGhpbmcgZWxzZSBpbiBUaHJpZnQgaXMgcGVyZmVjdCwKLSAgICAvLyBkbyBtb3JlIG9mIHRoZXNlIGluIHRoZSBpbml0aWFsaXplciBsaXN0LgotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLQotICAgICAgaWYgKCF0LT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgICB0X2NvbnN0X3ZhbHVlKiBjdiA9ICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgICAgIGlmIChjdiAhPSBOVUxMKSB7Ci0gICAgICAgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCAoKm1faXRlciktPmdldF9uYW1lKCksIHQsIGN2KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBzY29wZV9kb3duKG91dCk7Ci0gIH0KLQotICBpZiAodHN0cnVjdC0+YW5ub3RhdGlvbnNfLmZpbmQoImZpbmFsIikgPT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpKSB7Ci0gICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInZpcnR1YWwgfiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCkgdGhyb3coKTsiIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBEZWNsYXJlIGFsbCBmaWVsZHMKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoKm1faXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBvaW50ZXJzICYmICEoKm1faXRlciktPmdldF90eXBlKCktPmlzX3hjZXB0aW9uKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXJlYWQpIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBBZGQgdGhlIF9faXNzZXQgZGF0YSBtZW1iZXIgaWYgd2UgbmVlZCBpdCwgdXNpbmcgdGhlIGRlZmluaXRpb24gZnJvbSBhYm92ZQotICBpZiAoaGFzX25vbnJlcXVpcmVkX2ZpZWxkcyAmJiAoIXBvaW50ZXJzIHx8IHJlYWQpKSB7Ci0gICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIl8iIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIl9faXNzZXQgX19pc3NldDsiIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBDcmVhdGUgYSBzZXR0ZXIgZnVuY3Rpb24gZm9yIGVhY2ggZmllbGQKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGlmIChwb2ludGVycykgewotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGlmIChpc19yZWZlcmVuY2UoKCptX2l0ZXIpKSkgewotICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInZvaWQgX19zZXRfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIihib29zdDo6c2hhcmVkX3B0cjwiCi0gICAgICAgICAgPDwgdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSA8PCAiPiI7Ci0gICAgICBvdXQgPDwgIiB2YWwpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInZvaWQgX19zZXRfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIigiCi0gICAgICAgICAgPDwgdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIHRydWUpOwotICAgICAgb3V0IDw8ICIgdmFsKTsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0gIG91dCA8PCBlbmRsOwotCi0gIGlmICghcG9pbnRlcnMpIHsKLSAgICAvLyBTaG91bGQgd2UgZ2VuZXJhdGUgZGVmYXVsdCBvcGVyYXRvcnM/Ci0gICAgaWYgKCFnZW5fbm9fZGVmYXVsdF9vcGVyYXRvcnNfKSB7Ci0gICAgICAvLyBHZW5lcmF0ZSBhbiBlcXVhbGl0eSB0ZXN0aW5nIG9wZXJhdG9yLiAgTWFrZSBpdCBpbmxpbmUgc2luY2UgdGhlIGNvbXBpbGVyCi0gICAgICAvLyB3aWxsIGRvIGEgYmV0dGVyIGpvYiB0aGFuIHdlIHdvdWxkIHdoZW4gZGVjaWRpbmcgd2hldGhlciB0byBpbmxpbmUgaXQuCi0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiICYgIgotICAgICAgICAgIDw8IChtZW1iZXJzLnNpemUoKSA+IDAgPyAicmhzIiA6ICIvKiByaHMgKi8iKSA8PCAiKSBjb25zdCIgPDwgZW5kbDsKLSAgICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICAgIC8vIE1vc3QgZXhpc3RpbmcgVGhyaWZ0IGNvZGUgZG9lcyBub3QgdXNlIGlzc2V0IG9yIG9wdGlvbmFsL3JlcXVpcmVkLAotICAgICAgICAvLyBzbyB3ZSB0cmVhdCAiZGVmYXVsdCIgZmllbGRzIGFzIHJlcXVpcmVkLgotICAgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9PUFRJT05BTCkgewotICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCEoIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9PSByaHMuIgotICAgICAgICAgICAgICA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIikpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBmYWxzZTsiIDw8IGVuZGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoX19pc3NldC4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9IHJocy5fX2lzc2V0LiIKLSAgICAgICAgICAgICAgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBmYWxzZTsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImVsc2UgaWYgKF9faXNzZXQuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiAmJiAhKCIKLSAgICAgICAgICAgICAgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPT0gcmhzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpKSIgPDwgZW5kbAotICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gZmFsc2U7IiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOwotICAgICAgc2NvcGVfZG93bihvdXQpOwotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJib29sIG9wZXJhdG9yICE9IChjb25zdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiAmcmhzKSBjb25zdCB7IgotICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICEoKnRoaXMgPT0gcmhzKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKLSAgICAgICAgICA8PCBlbmRsOwotCi0gICAgICAvLyBHZW5lcmF0ZSB0aGUgZGVjbGFyYXRpb24gb2YgYSBsZXNzLXRoYW4gb3BlcmF0b3IuICBUaGlzIG11c3QgYmUKLSAgICAgIC8vIGltcGxlbWVudGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiBkZXZlbG9wZXIgaWYgdGhleSB3aXNoIHRvIHVzZSBpdC4gIChUaGV5Ci0gICAgICAvLyB3aWxsIGdldCBhIGxpbmsgZXJyb3IgaWYgdGhleSB0cnkgdG8gdXNlIGl0IHdpdGhvdXQgYW4gaW1wbGVtZW50YXRpb24uKQotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJib29sIG9wZXJhdG9yIDwgKGNvbnN0ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiICYgKSBjb25zdDsiIDw8IGVuZGwKLSAgICAgICAgICA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGlmIChyZWFkKSB7Ci0gICAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgPDwgInVpbnQzMl90IHJlYWQoUHJvdG9jb2xfKiBpcHJvdCk7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInVpbnQzMl90IHJlYWQoIgotICAgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBpcHJvdCk7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotICBpZiAod3JpdGUpIHsKLSAgICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4iIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICA8PCAidWludDMyX3Qgd3JpdGUoUHJvdG9jb2xfKiBvcHJvdCkgY29uc3Q7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInVpbnQzMl90IHdyaXRlKCIKLSAgICAgICAgICA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogb3Byb3QpIGNvbnN0OyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgaWYgKHN0cmVhbSkgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidmlydHVhbCAiOwotICAgIGdlbmVyYXRlX3N0cnVjdF9wcmludF9tZXRob2RfZGVjbChvdXQsIE5VTEwpOwotICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIHN0ZDo6ZXhjZXB0aW9uOjp3aGF0KCkKLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAibXV0YWJsZSBzdGQ6OnN0cmluZyB0aHJpZnRURXhjZXB0aW9uTWVzc2FnZUhvbGRlcl87IiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKTsKLSAgICBnZW5lcmF0ZV9leGNlcHRpb25fd2hhdF9tZXRob2RfZGVjbChvdXQsIHRzdHJ1Y3QsIGZhbHNlKTsKLSAgICBvdXQgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifTsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpZiAoc3dhcCkgewotICAgIC8vIEdlbmVyYXRlIGEgbmFtZXNwYWNlLXNjb3BlIHN3YXAoKSBmdW5jdGlvbgotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidm9pZCBzd2FwKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiICZhLCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKLSAgICAgICAgPDwgIiAmYik7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAoc3RyZWFtKSB7Ci0gICAgZ2VuZXJhdGVfc3RydWN0X29zdHJlYW1fb3BlcmF0b3Iob3V0LCB0c3RydWN0KTsKLSAgfQotfQotCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X2RlZmluaXRpb24ob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZnN0cmVhbSYgZm9yY2VfY3BwX291dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNldHRlcnMpIHsKLSAgLy8gR2V0IG1lbWJlcnMKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLQotICAvLyBEZXN0cnVjdG9yCi0gIGlmICh0c3RydWN0LT5hbm5vdGF0aW9uc18uZmluZCgiZmluYWwiKSA9PSB0c3RydWN0LT5hbm5vdGF0aW9uc18uZW5kKCkpIHsKLSAgICBmb3JjZV9jcHBfb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiOjp+IiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgICA8PCAiKCkgdGhyb3coKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmb3JjZV9jcHBfb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBDcmVhdGUgYSBzZXR0ZXIgZnVuY3Rpb24gZm9yIGVhY2ggZmllbGQKLSAgaWYgKHNldHRlcnMpIHsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBpZiAoaXNfcmVmZXJlbmNlKCgqbV9pdGVyKSkpIHsKLSAgICAgICAgc3RkOjpzdHJpbmcgdHlwZSA9IHR5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidm9pZCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIjo6X19zZXRfIgotICAgICAgICAgICAgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoYm9vc3Q6OnNoYXJlZF9wdHI8IgotICAgICAgICAgICAgPDwgdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSA8PCAiPiI7Ci0gICAgICAgIG91dCA8PCAiIHZhbCkgeyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ2b2lkICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiOjpfX3NldF8iCi0gICAgICAgICAgICA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIigiIDw8IHR5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCksIGZhbHNlLCB0cnVlKTsKLSAgICAgICAgb3V0IDw8ICIgdmFsKSB7IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRoaXMtPiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSB2YWw7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLQotICAgICAgLy8gYXNzdW1lIGFsbCBmaWVsZHMgYXJlIHJlcXVpcmVkIGV4Y2VwdCBvcHRpb25hbCBmaWVsZHMuCi0gICAgICAvLyBmb3Igb3B0aW9uYWwgZmllbGRzIGNoYW5nZSBfX2lzc2V0Lm5hbWUgdG8gdHJ1ZQotICAgICAgYm9vbCBpc19vcHRpb25hbCA9ICgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7Ci0gICAgICBpZiAoaXNfb3B0aW9uYWwpIHsKLSAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGluZGVudCgpIDw8ICJfX2lzc2V0LiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSB0cnVlOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLSAgb3V0IDw8IGVuZGw7Ci19Ci0KLS8qKgotICogTWFrZXMgYSBoZWxwZXIgZnVuY3Rpb24gdG8gZ2VuIGEgc3RydWN0IHJlYWRlci4KLSAqCi0gKiBAcGFyYW0gb3V0IFN0cmVhbSB0byB3cml0ZSB0bwotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdAotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X3JlYWRlcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBwb2ludGVycykgewotICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ1aW50MzJfdCAiCi0gICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIjo6cmVhZChQcm90b2NvbF8qIGlwcm90KSB7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGluZGVudChvdXQpIDw8ICJ1aW50MzJfdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICA8PCAiOjpyZWFkKDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIGlwcm90KSB7IiA8PCBlbmRsOwotICB9Ci0gIGluZGVudF91cCgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICAvLyBEZWNsYXJlIHN0YWNrIHRtcCB2YXJpYWJsZXMKLSAgb3V0IDw8IGVuZGwKLSAgICAgIDw8IGluZGVudCgpIDw8ICJhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRJbnB1dFJlY3Vyc2lvblRyYWNrZXIgdHJhY2tlcigqaXByb3QpOyIgPDwgZW5kbAotICAgICAgPDwgaW5kZW50KCkgPDwgInVpbnQzMl90IHhmZXIgPSAwOyIgPDwgZW5kbAotICAgICAgPDwgaW5kZW50KCkgPDwgInN0ZDo6c3RyaW5nIGZuYW1lOyIgPDwgZW5kbAotICAgICAgPDwgaW5kZW50KCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUVHlwZSBmdHlwZTsiIDw8IGVuZGwKLSAgICAgIDw8IGluZGVudCgpIDw8ICJpbnQxNl90IGZpZDsiIDw8IGVuZGwKLSAgICAgIDw8IGVuZGwKLSAgICAgIDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IGlwcm90LT5yZWFkU3RydWN0QmVnaW4oZm5hbWUpOyIgPDwgZW5kbAotICAgICAgPDwgZW5kbAotICAgICAgPDwgaW5kZW50KCkgPDwgInVzaW5nIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xFeGNlcHRpb247IiA8PCBlbmRsCi0gICAgICA8PCBlbmRsOwotCi0gIC8vIFJlcXVpcmVkIHZhcmlhYmxlcyBhcmVuJ3QgaW4gX19pc3NldCwgc28gd2UgbmVlZCB0bXAgdmFycyB0byBjaGVjayB0aGVtLgotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKQotICAgICAgaW5kZW50KG91dCkgPDwgImJvb2wgaXNzZXRfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IGZhbHNlOyIgPDwgZW5kbDsKLSAgfQotICBvdXQgPDwgZW5kbDsKLQotICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKLSAgaW5kZW50KG91dCkgPDwgIndoaWxlICh0cnVlKSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLQotICAvLyBSZWFkIGJlZ2lubmluZyBmaWVsZCBtYXJrZXIKLSAgaW5kZW50KG91dCkgPDwgInhmZXIgKz0gaXByb3QtPnJlYWRGaWVsZEJlZ2luKGZuYW1lLCBmdHlwZSwgZmlkKTsiIDw8IGVuZGw7Ci0KLSAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKGZ0eXBlID09IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUT1ApIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgIDw8ICIgIGJyZWFrOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLQotICBpZiAoZmllbGRzLmVtcHR5KCkpIHsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gaXByb3QtPnNraXAoZnR5cGUpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICAvLyBTd2l0Y2ggc3RhdGVtZW50IG9uIHRoZSBmaWVsZCB3ZSBhcmUgcmVhZGluZwotICAgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZCkiIDw8IGVuZGw7Ci0KLSAgICBzY29wZV91cChvdXQpOwotCi0gICAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCi0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjoiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoZnR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0KLSAgICAgIGNvbnN0IGNoYXIqIGlzc2V0X3ByZWZpeCA9ICgoKmZfaXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSA/ICJ0aGlzLT5fX2lzc2V0LiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJpc3NldF8iOwotCi0jaWYgMAotICAgICAgICAgIC8vIFRoaXMgY29kZSB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZSBzYW1lIGZpZWxkIGlzIGVuY291bnRlcmVkIHR3aWNlLgotICAgICAgICAgIC8vIFdlJ3ZlIGRlY2lkZWQgdG8gbGVhdmUgaXQgb3V0IGZvciBwZXJmb3JtYW5jZSByZWFzb25zLgotICAgICAgICAgIC8vIFRPRE8oZHJlaXNzKTogR2VuZXJhdGUgdGhpcyBjb2RlIGFuZCAiaWYiIGl0IG91dCB0byBtYWtlIGl0IGVhc2llcgotICAgICAgICAgIC8vIGZvciBwZW9wbGUgcmVjb21waWxpbmcgdGhyaWZ0IHRvIGluY2x1ZGUgaXQuCi0gICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgaXNzZXRfcHJlZml4IDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsiIDw8IGVuZGw7Ci0jZW5kaWYKLQotICAgICAgaWYgKHBvaW50ZXJzICYmICEoKmZfaXRlciktPmdldF90eXBlKCktPmlzX3hjZXB0aW9uKCkpIHsKLSAgICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAiKCoodGhpcy0+IiwgIikpIik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLT4iKTsKLSAgICAgIH0KLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBpc3NldF9wcmVmaXggPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSB0cnVlOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHhmZXIgKz0gaXByb3QtPnNraXAoZnR5cGUpOyIgPDwgZW5kbAotICAgICAgICAgIDw8Ci0gICAgICAgICAgLy8gVE9ETyhkcmVpc3MpOiBNYWtlIHRoaXMgYW4gb3B0aW9uIHdoZW4gdGhyaWZ0IHN0cnVjdHMKLSAgICAgICAgICAvLyBoYXZlIGEgY29tbW9uIGJhc2UgY2xhc3MuCi0gICAgICAgICAgLy8gaW5kZW50KCkgPDwgIiAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICB9Ci0KLSAgICAvLyBJbiB0aGUgZGVmYXVsdCBjYXNlIHdlIHNraXAgdGhlIGZpZWxkCi0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICB4ZmVyICs9IGlwcm90LT5za2lwKGZ0eXBlKTsiIDw8IGVuZGwKLSAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgYnJlYWs7IiA8PCBlbmRsOwotCi0gICAgc2NvcGVfZG93bihvdXQpOwotICB9IC8vIWZpZWxkcy5lbXB0eSgpCi0gIC8vIFJlYWQgZmllbGQgZW5kIG1hcmtlcgotICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBpcHJvdC0+cmVhZEZpZWxkRW5kKCk7IiA8PCBlbmRsOwotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSBpcHJvdC0+cmVhZFN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKLQotICAvLyBUaHJvdyBpZiBhbnkgcmVxdWlyZWQgZmllbGRzIGFyZSBtaXNzaW5nLgotICAvLyBXZSBkbyB0aGlzIGFmdGVyIHJlYWRpbmcgdGhlIHN0cnVjdCBlbmQgc28gdGhhdAotICAvLyB0aGVyZSBtaWdodCBwb3NzaWJseSBiZSBhIGNoYW5jZSBvZiBjb250aW51aW5nLgotICBvdXQgPDwgZW5kbDsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFpc3NldF8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAnKScgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgIDw8ICIgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7IiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwgInJldHVybiB4ZmVyOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgd3JpdGUgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtIG91dCBTdHJlYW0gdG8gd3JpdGUgdG8KLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QKLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF93cml0ZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgcG9pbnRlcnMpIHsKLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGlmIChnZW5fdGVtcGxhdGVzXykgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInVpbnQzMl90ICIKLSAgICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiOjp3cml0ZShQcm90b2NvbF8qIG9wcm90KSBjb25zdCB7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGluZGVudChvdXQpIDw8ICJ1aW50MzJfdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICA8PCAiOjp3cml0ZSg6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBvcHJvdCkgY29uc3QgeyIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfdXAoKTsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgInVpbnQzMl90IHhmZXIgPSAwOyIgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAiYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUT3V0cHV0UmVjdXJzaW9uVHJhY2tlciB0cmFja2VyKCpvcHJvdCk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBvcHJvdC0+d3JpdGVTdHJ1Y3RCZWdpbihcIiIgPDwgbmFtZSA8PCAiXCIpOyIgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGJvb2wgY2hlY2tfaWZfc2V0ID0gKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTAotICAgICAgICAgICAgICAgICAgICAgICAgfHwgKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLT5pc194Y2VwdGlvbigpOwotICAgIGlmIChjaGVja19pZl9zZXQpIHsKLSAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiAodGhpcy0+X19pc3NldC4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCBlbmRsOwotICAgIH0KLQotICAgIC8vIFdyaXRlIGZpZWxkIGhlYWRlcgotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSBvcHJvdC0+d3JpdGVGaWVsZEJlZ2luKCIKLSAgICAgICAgPDwgIlwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiLCAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIsICIKLSAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIik7IiA8PCBlbmRsOwotICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCi0gICAgaWYgKHBvaW50ZXJzICYmICEoKmZfaXRlciktPmdldF90eXBlKCktPmlzX3hjZXB0aW9uKCkpIHsKLSAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICIoKih0aGlzLT4iLCAiKSkiKTsKLSAgICB9IGVsc2UgewotICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMtPiIpOwotICAgIH0KLSAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKLSAgICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBvcHJvdC0+d3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKLSAgICBpZiAoY2hlY2tfaWZfc2V0KSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgJ30nOwotICAgIH0KLSAgfQotCi0gIG91dCA8PCBlbmRsOwotCi0gIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSBvcHJvdC0+d3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgPDwgInJldHVybiB4ZmVyOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIFN0cnVjdCB3cml0ZXIgZm9yIHJlc3VsdCBvZiBhIGZ1bmN0aW9uLCB3aGljaCBjYW4gaGF2ZSBvbmx5IG9uZSBvZiBpdHMKLSAqIGZpZWxkcyBzZXQgYW5kIGRvZXMgYSBjb25kaXRpb25hbCBpZiBlbHNlIGxvb2sgdXAgaW50byB0aGUgX19pc3NldCBmaWVsZAotICogb2YgdGhlIHN0cnVjdC4KLSAqCi0gKiBAcGFyYW0gb3V0IE91dHB1dCBzdHJlYW0KLSAqIEBwYXJhbSB0c3RydWN0IFRoZSByZXN1bHQgc3RydWN0Ci0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlcnMpIHsKLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGlmIChnZW5fdGVtcGxhdGVzXykgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInVpbnQzMl90ICIKLSAgICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiOjp3cml0ZShQcm90b2NvbF8qIG9wcm90KSBjb25zdCB7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGluZGVudChvdXQpIDw8ICJ1aW50MzJfdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICA8PCAiOjp3cml0ZSg6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBvcHJvdCkgY29uc3QgeyIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfdXAoKTsKLQotICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidWludDMyX3QgeGZlciA9IDA7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgInhmZXIgKz0gb3Byb3QtPndyaXRlU3RydWN0QmVnaW4oXCIiIDw8IG5hbWUgPDwgIlwiKTsiIDw8IGVuZGw7Ci0KLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmICI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCAiIGVsc2UgaWYgIjsKLSAgICB9Ci0KLSAgICBvdXQgPDwgIih0aGlzLT5fX2lzc2V0LiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGhlYWRlcgotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSBvcHJvdC0+d3JpdGVGaWVsZEJlZ2luKCIKLSAgICAgICAgPDwgIlwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiLCAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIsICIKLSAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIik7IiA8PCBlbmRsOwotICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCi0gICAgaWYgKHBvaW50ZXJzKSB7Ci0gICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAiKCoodGhpcy0+IiwgIikpIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLT4iKTsKLSAgICB9Ci0gICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCi0gICAgaW5kZW50KG91dCkgPDwgInhmZXIgKz0gb3Byb3QtPndyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IjsKLSAgfQotCi0gIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCi0gIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgPDwgInhmZXIgKz0gb3Byb3QtPndyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXR1cm4geGZlcjsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgdGhlIHN3YXAgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtIG91dCBTdHJlYW0gdG8gd3JpdGUgdG8KLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QKLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF9zd2FwKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAidm9pZCBzd2FwKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiICZhLCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKLSAgICAgIDw8ICIgJmIpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIC8vIExldCBhcmd1bWVudC1kZXBlbmRlbnQgbmFtZSBsb29rdXAgZmluZCB0aGUgY29ycmVjdCBzd2FwKCkgZnVuY3Rpb24gdG8KLSAgLy8gdXNlIGJhc2VkIG9uIHRoZSBhcmd1bWVudCB0eXBlcy4gIElmIG5vbmUgaXMgZm91bmQgaW4gdGhlIGFyZ3VtZW50cycKLSAgLy8gbmFtZXNwYWNlcywgZmFsbCBiYWNrIHRvIDo6c3RkOjpzd2FwKCkuCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAidXNpbmcgOjpzdGQ6OnN3YXA7IiA8PCBlbmRsOwotCi0gIGJvb2wgaGFzX25vbnJlcXVpcmVkX2ZpZWxkcyA9IGZhbHNlOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfZmllbGQqIHRmaWVsZCA9ICpmX2l0ZXI7Ci0KLSAgICBpZiAodGZpZWxkLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgaGFzX25vbnJlcXVpcmVkX2ZpZWxkcyA9IHRydWU7Ci0gICAgfQotCi0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJzd2FwKGEuIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIiwgYi4iIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKTsiCi0gICAgICAgIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAoaGFzX25vbnJlcXVpcmVkX2ZpZWxkcykgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAic3dhcChhLl9faXNzZXQsIGIuX19pc3NldCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gaGFuZGxlIGVtcHR5IHN0cnVjdHMKLSAgaWYgKGZpZWxkcy5zaXplKCkgPT0gMCkgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiKHZvaWQpIGE7IiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiKHZvaWQpIGI7IiA8PCBlbmRsOwotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF9vc3RyZWFtX29wZXJhdG9yKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8ICJpbmxpbmUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3V0LCBjb25zdCAiCi0gICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCi0gICAgICA8PCAiJiBvYmopIiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIm9iai5wcmludFRvKG91dCk7IiA8PCBlbmRsCi0gICAgICA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIG91dDsiIDw8IGVuZGw7Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLSAgb3V0IDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3RfcHJpbnRfbWV0aG9kX2RlY2woc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBvdXQgPDwgInZvaWQgIjsKLSAgaWYgKHRzdHJ1Y3QpIHsKLSAgICBvdXQgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiOjoiOwotICB9Ci0gIG91dCA8PCAicHJpbnRUbyhzdGQ6Om9zdHJlYW0mIG91dCkgY29uc3QiOwotfQotCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZXhjZXB0aW9uX3doYXRfbWV0aG9kX2RlY2woc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZXh0ZXJuYWwpIHsKLSAgb3V0IDw8ICJjb25zdCBjaGFyKiAiOwotICBpZiAoZXh0ZXJuYWwpIHsKLSAgICBvdXQgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiOjoiOwotICB9Ci0gIG91dCA8PCAid2hhdCgpIGNvbnN0IHRocm93KCkiOwotfQotCi1uYW1lc3BhY2Ugc3RydWN0X29zdHJlYW1fb3BlcmF0b3JfZ2VuZXJhdG9yIHsKLXZvaWQgZ2VuZXJhdGVfcmVxdWlyZWRfZmllbGRfdmFsdWUoc3RkOjpvZnN0cmVhbSYgb3V0LCBjb25zdCB0X2ZpZWxkKiBmaWVsZCkgewotICBvdXQgPDwgIiA8PCB0b19zdHJpbmcoIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKSI7Ci19Ci0KLXZvaWQgZ2VuZXJhdGVfb3B0aW9uYWxfZmllbGRfdmFsdWUoc3RkOjpvZnN0cmVhbSYgb3V0LCBjb25zdCB0X2ZpZWxkKiBmaWVsZCkgewotICBvdXQgPDwgIjsgKF9faXNzZXQuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiID8gKG91dCI7Ci0gIGdlbmVyYXRlX3JlcXVpcmVkX2ZpZWxkX3ZhbHVlKG91dCwgZmllbGQpOwotICBvdXQgPDwgIikgOiAob3V0IDw8IFwiPG51bGw+XCIpKSI7Ci19Ci0KLXZvaWQgZ2VuZXJhdGVfZmllbGRfdmFsdWUoc3RkOjpvZnN0cmVhbSYgb3V0LCBjb25zdCB0X2ZpZWxkKiBmaWVsZCkgewotICBpZiAoZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKQotICAgIGdlbmVyYXRlX29wdGlvbmFsX2ZpZWxkX3ZhbHVlKG91dCwgZmllbGQpOwotICBlbHNlCi0gICAgZ2VuZXJhdGVfcmVxdWlyZWRfZmllbGRfdmFsdWUob3V0LCBmaWVsZCk7Ci19Ci0KLXZvaWQgZ2VuZXJhdGVfZmllbGRfbmFtZShzdGQ6Om9mc3RyZWFtJiBvdXQsIGNvbnN0IHRfZmllbGQqIGZpZWxkKSB7Ci0gIG91dCA8PCAiXCIiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICI9XCIiOwotfQotCi12b2lkIGdlbmVyYXRlX2ZpZWxkKHN0ZDo6b2ZzdHJlYW0mIG91dCwgY29uc3QgdF9maWVsZCogZmllbGQpIHsKLSAgZ2VuZXJhdGVfZmllbGRfbmFtZShvdXQsIGZpZWxkKTsKLSAgZ2VuZXJhdGVfZmllbGRfdmFsdWUob3V0LCBmaWVsZCk7Ci19Ci0KLXZvaWQgZ2VuZXJhdGVfZmllbGRzKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcywKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbmRlbnQpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgYmVnID0gZmllbGRzLmJlZ2luKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IGZpZWxkcy5lbmQoKTsKLQotICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYmVnOyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAgICBvdXQgPDwgaW5kZW50IDw8ICJvdXQgPDwgIjsKLQotICAgIGlmIChpdCAhPSBiZWcpIHsKLSAgICAgIG91dCA8PCAiXCIsIFwiIDw8ICI7Ci0gICAgfQotCi0gICAgZ2VuZXJhdGVfZmllbGQob3V0LCAqaXQpOwotICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKLSAgfQotfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBvcGVyYXRvcjw8Ci0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3RfcHJpbnRfbWV0aG9kKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8IGluZGVudCgpOwotICBnZW5lcmF0ZV9zdHJ1Y3RfcHJpbnRfbWV0aG9kX2RlY2wob3V0LCB0c3RydWN0KTsKLSAgb3V0IDw8ICIgeyIgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgInVzaW5nIDo6YXBhY2hlOjp0aHJpZnQ6OnRvX3N0cmluZzsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAib3V0IDw8IFwiIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoXCI7IiA8PCBlbmRsOwotICBzdHJ1Y3Rfb3N0cmVhbV9vcGVyYXRvcl9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkcyhvdXQsIHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCksIGluZGVudCgpKTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJvdXQgPDwgXCIpXCI7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyB3aGF0KCkgbWV0aG9kIGZvciBleGNlcHRpb25zCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9leGNlcHRpb25fd2hhdF9tZXRob2Qoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBvdXQgPDwgaW5kZW50KCk7Ci0gIGdlbmVyYXRlX2V4Y2VwdGlvbl93aGF0X21ldGhvZF9kZWNsKG91dCwgdHN0cnVjdCwgdHJ1ZSk7Ci0gIG91dCA8PCAiIHsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAidHJ5IHsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAic3RkOjpzdHJpbmdzdHJlYW0gc3M7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgInNzIDw8IFwiVEV4Y2VwdGlvbiAtIHNlcnZpY2UgaGFzIHRocm93bjogXCIgPDwgKnRoaXM7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgInRoaXMtPnRocmlmdFRFeGNlcHRpb25NZXNzYWdlSG9sZGVyXyA9IHNzLnN0cigpOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdGhpcy0+dGhyaWZ0VEV4Y2VwdGlvbk1lc3NhZ2VIb2xkZXJfLmNfc3RyKCk7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAifSBjYXRjaCAoY29uc3Qgc3RkOjpleGNlcHRpb24mKSB7IiA8PCBlbmRsOwotCi0gIGluZGVudF91cCgpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBcIlRFeGNlcHRpb24gLSBzZXJ2aWNlIGhhcyB0aHJvd246ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiXCI7IgotICAgICAgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuIEluIEMrKywgdGhpcyBjb21wcmlzZXMgYW4gZW50aXJlbHkgc2VwYXJhdGUKLSAqIGhlYWRlciBhbmQgc291cmNlIGZpbGUuIFRoZSBoZWFkZXIgZmlsZSBkZWZpbmVzIHRoZSBtZXRob2RzIGFuZCBpbmNsdWRlcwotICogdGhlIGRhdGEgdHlwZXMgZGVmaW5lZCBpbiB0aGUgbWFpbiBoZWFkZXIgZmlsZSwgYW5kIHRoZSBpbXBsZW1lbnRhdGlvbgotICogZmlsZSBjb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGJhc2ljIHByaW50ZXIgYW5kIGRlZmF1bHQgaW50ZXJmYWNlcy4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBzdmNuYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCk7Ci0KLSAgLy8gTWFrZSBvdXRwdXQgZmlsZXMKLSAgc3RyaW5nIGZfaGVhZGVyX25hbWUgPSBnZXRfb3V0X2RpcigpICsgc3ZjbmFtZSArICIuaCI7Ci0gIGZfaGVhZGVyXy5vcGVuKGZfaGVhZGVyX25hbWUuY19zdHIoKSk7Ci0KLSAgLy8gUHJpbnQgaGVhZGVyIGZpbGUgaW5jbHVkZXMKLSAgZl9oZWFkZXJfIDw8IGF1dG9nZW5fY29tbWVudCgpOwotICBmX2hlYWRlcl8gPDwgIiNpZm5kZWYgIiA8PCBzdmNuYW1lIDw8ICJfSCIgPDwgZW5kbCA8PCAiI2RlZmluZSAiIDw8IHN2Y25hbWUgPDwgIl9IIiA8PCBlbmRsCi0gICAgICAgICAgICA8PCBlbmRsOwotICBpZiAoZ2VuX2NvYl9zdHlsZV8pIHsKLSAgICBmX2hlYWRlcl8gPDwgIiNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+IiA8PCBlbmRsIDw8IC8vIFRNZW1vcnlCdWZmZXIKLSAgICAgICAgIiNpbmNsdWRlIDx0aHJpZnQvY3h4ZnVuY3Rpb25hbC5oPiIgPDwgZW5kbAotICAgICAgICAgICAgICA8PCAibmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgYXN5bmMgeyIgPDwgZW5kbAotICAgICAgICAgICAgICA8PCAiY2xhc3MgVEFzeW5jQ2hhbm5lbDsiIDw8IGVuZGwgPDwgIn19fSIgPDwgZW5kbDsKLSAgfQotICBmX2hlYWRlcl8gPDwgIiNpbmNsdWRlIDx0aHJpZnQvVERpc3BhdGNoUHJvY2Vzc29yLmg+IiA8PCBlbmRsOwotICBpZiAoZ2VuX2NvYl9zdHlsZV8pIHsKLSAgICBmX2hlYWRlcl8gPDwgIiNpbmNsdWRlIDx0aHJpZnQvYXN5bmMvVEFzeW5jRGlzcGF0Y2hQcm9jZXNzb3IuaD4iIDw8IGVuZGw7Ci0gIH0KLSAgZl9oZWFkZXJfIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RDb25jdXJyZW50Q2xpZW50U3luY0luZm8uaD4iIDw8IGVuZGw7Ci0gIGZfaGVhZGVyXyA8PCAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX3R5cGVzLmhcIiIKLSAgICAgICAgICAgIDw8IGVuZGw7Ci0KLSAgdF9zZXJ2aWNlKiBleHRlbmRzX3NlcnZpY2UgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKLSAgaWYgKGV4dGVuZHNfc2VydmljZSAhPSBOVUxMKSB7Ci0gICAgZl9oZWFkZXJfIDw8ICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCooZXh0ZW5kc19zZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSkKLSAgICAgICAgICAgICAgPDwgZXh0ZW5kc19zZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICIuaFwiIiA8PCBlbmRsOwotICB9Ci0KLSAgZl9oZWFkZXJfIDw8IGVuZGwgPDwgbnNfb3Blbl8gPDwgZW5kbCA8PCBlbmRsOwotCi0gIGZfaGVhZGVyXyA8PAotICAgICIjaWZkZWYgX1dJTjMyXG4iCi0gICAgIiAgI3ByYWdtYSB3YXJuaW5nKCBwdXNoIClcbiIKLSAgICAiICAjcHJhZ21hIHdhcm5pbmcgKGRpc2FibGUgOiA0MjUwICkgLy9pbmhlcml0aW5nIG1ldGhvZHMgdmlhIGRvbWluYW5jZSBcbiIKLSAgICAiI2VuZGlmXG5cbiI7Ci0KLSAgLy8gU2VydmljZSBpbXBsZW1lbnRhdGlvbiBmaWxlIGluY2x1ZGVzCi0gIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBzdmNuYW1lICsgIi5jcHAiOwotICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7Ci0gIGZfc2VydmljZV8gPDwgYXV0b2dlbl9jb21tZW50KCk7Ci0gIGZfc2VydmljZV8gPDwgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpIDw8IHN2Y25hbWUgPDwgIi5oXCIiIDw8IGVuZGw7Ci0gIGlmIChnZW5fY29iX3N0eWxlXykgewotICAgIGZfc2VydmljZV8gPDwgIiNpbmNsdWRlIFwidGhyaWZ0L2FzeW5jL1RBc3luY0NoYW5uZWwuaFwiIiA8PCBlbmRsOwotICB9Ci0gIGlmIChnZW5fdGVtcGxhdGVzXykgewotICAgIGZfc2VydmljZV8gPDwgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpIDw8IHN2Y25hbWUgPDwgIi50Y2NcIiIKLSAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0KLSAgICBzdHJpbmcgZl9zZXJ2aWNlX3RjY19uYW1lID0gZ2V0X291dF9kaXIoKSArIHN2Y25hbWUgKyAiLnRjYyI7Ci0gICAgZl9zZXJ2aWNlX3RjY18ub3BlbihmX3NlcnZpY2VfdGNjX25hbWUuY19zdHIoKSk7Ci0gICAgZl9zZXJ2aWNlX3RjY18gPDwgYXV0b2dlbl9jb21tZW50KCk7Ci0gICAgZl9zZXJ2aWNlX3RjY18gPDwgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpIDw8IHN2Y25hbWUgPDwgIi5oXCIiCi0gICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLQotICAgIGZfc2VydmljZV90Y2NfIDw8ICIjaWZuZGVmICIgPDwgc3ZjbmFtZSA8PCAiX1RDQyIgPDwgZW5kbCA8PCAiI2RlZmluZSAiIDw8IHN2Y25hbWUgPDwgIl9UQ0MiCi0gICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgaWYgKGdlbl9jb2Jfc3R5bGVfKSB7Ci0gICAgICBmX3NlcnZpY2VfdGNjXyA8PCAiI2luY2x1ZGUgXCJ0aHJpZnQvYXN5bmMvVEFzeW5jQ2hhbm5lbC5oXCIiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8IG5zX29wZW5fIDw8IGVuZGwgPDwgZW5kbDsKLSAgZl9zZXJ2aWNlX3RjY18gPDwgZW5kbCA8PCBuc19vcGVuXyA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgYWxsIHRoZSBjb21wb25lbnRzCi0gIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlLCAiIik7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlX2ZhY3RvcnkodHNlcnZpY2UsICIiKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9udWxsKHRzZXJ2aWNlLCAiIik7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlLCAiIik7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRzZXJ2aWNlLCAiIik7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfbXVsdGlmYWNlKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9za2VsZXRvbih0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlLCAiQ29uY3VycmVudCIpOwotCi0gIC8vIEdlbmVyYXRlIGFsbCB0aGUgY29iIGNvbXBvbmVudHMKLSAgaWYgKGdlbl9jb2Jfc3R5bGVfKSB7Ci0gICAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UsICJDb2JDbCIpOwotICAgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlLCAiQ29iU3YiKTsKLSAgICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZV9mYWN0b3J5KHRzZXJ2aWNlLCAiQ29iU3YiKTsKLSAgICBnZW5lcmF0ZV9zZXJ2aWNlX251bGwodHNlcnZpY2UsICJDb2JTdiIpOwotICAgIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlLCAiQ29iIik7Ci0gICAgZ2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodHNlcnZpY2UsICJDb2IiKTsKLSAgICBnZW5lcmF0ZV9zZXJ2aWNlX2FzeW5jX3NrZWxldG9uKHRzZXJ2aWNlKTsKLSAgfQotCi0gIGZfaGVhZGVyXyA8PAotICAgICIjaWZkZWYgX1dJTjMyXG4iCi0gICAgIiAgI3ByYWdtYSB3YXJuaW5nKCBwb3AgKVxuIgotICAgICIjZW5kaWZcblxuIjsKLQotICAvLyBDbG9zZSB0aGUgbmFtZXNwYWNlCi0gIGZfc2VydmljZV8gPDwgbnNfY2xvc2VfIDw8IGVuZGwgPDwgZW5kbDsKLSAgZl9zZXJ2aWNlX3RjY18gPDwgbnNfY2xvc2VfIDw8IGVuZGwgPDwgZW5kbDsKLSAgZl9oZWFkZXJfIDw8IG5zX2Nsb3NlXyA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gVE9ETyhzaW1wa2lucyk6IE1ha2UgdGhpcyBhIHNlcGFyYXRlIG9wdGlvbgotICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKLSAgICBmX2hlYWRlcl8gPDwgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpIDw8IHN2Y25hbWUgPDwgIi50Y2NcIiIgPDwgZW5kbAotICAgICAgICAgICAgICA8PCAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkgPDwgcHJvZ3JhbV9uYW1lXwotICAgICAgICAgICAgICA8PCAiX3R5cGVzLnRjY1wiIiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLQotICBmX2hlYWRlcl8gPDwgIiNlbmRpZiIgPDwgZW5kbDsKLSAgZl9zZXJ2aWNlX3RjY18gPDwgIiNlbmRpZiIgPDwgZW5kbDsKLQotICAvLyBDbG9zZSB0aGUgZmlsZXMKLSAgZl9zZXJ2aWNlX3RjY18uY2xvc2UoKTsKLSAgZl9zZXJ2aWNlXy5jbG9zZSgpOwotICBmX2hlYWRlcl8uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgYSBzZXJ2aWNlLiBCYXNpY2FsbHksIHRoaXMgZ2VuZXJhdGVzIHR5cGVzCi0gKiBmb3IgYWxsIHRoZSBhcmd1bWVudHMgYW5kIHJlc3VsdHMgdG8gZnVuY3Rpb25zLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIHN0ZDo6b2ZzdHJlYW0mIG91dCA9IChnZW5fdGVtcGxhdGVzXyA/IGZfc2VydmljZV90Y2NfIDogZl9zZXJ2aWNlXyk7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgc3RyaW5nIG5hbWVfb3JpZyA9IHRzLT5nZXRfbmFtZSgpOwotCi0gICAgLy8gVE9ETyhkcmVpc3MpOiBXaHkgaXMgdGhpcyBzdHVmZiBub3QgaW4gZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycz8KLSAgICB0cy0+c2V0X25hbWUodHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiKTsKLSAgICBnZW5lcmF0ZV9zdHJ1Y3RfZGVjbGFyYXRpb24oZl9oZWFkZXJfLCB0cywgZmFsc2UpOwotICAgIGdlbmVyYXRlX3N0cnVjdF9kZWZpbml0aW9uKG91dCwgZl9zZXJ2aWNlXywgdHMsIGZhbHNlKTsKLSAgICBnZW5lcmF0ZV9zdHJ1Y3RfcmVhZGVyKG91dCwgdHMpOwotICAgIGdlbmVyYXRlX3N0cnVjdF93cml0ZXIob3V0LCB0cyk7Ci0gICAgdHMtPnNldF9uYW1lKHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIl8iICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9wYXJncyIpOwotICAgIGdlbmVyYXRlX3N0cnVjdF9kZWNsYXJhdGlvbihmX2hlYWRlcl8sIHRzLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIHRydWUpOwotICAgIGdlbmVyYXRlX3N0cnVjdF9kZWZpbml0aW9uKG91dCwgZl9zZXJ2aWNlXywgdHMsIGZhbHNlKTsKLSAgICBnZW5lcmF0ZV9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHMsIHRydWUpOwotICAgIHRzLT5zZXRfbmFtZShuYW1lX29yaWcpOwotCi0gICAgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0c2VydmljZSwgKmZfaXRlcik7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGludGVyZmFjZSBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSwgc3RyaW5nIHN0eWxlKSB7Ci0KLSAgc3RyaW5nIHNlcnZpY2VfaWZfbmFtZSA9IHNlcnZpY2VfbmFtZV8gKyBzdHlsZSArICJJZiI7Ci0gIGlmIChzdHlsZSA9PSAiQ29iQ2wiKSB7Ci0gICAgLy8gRm9yd2FyZCBkZWNsYXJlIHRoZSBjbGllbnQuCi0gICAgc3RyaW5nIGNsaWVudF9uYW1lID0gc2VydmljZV9uYW1lXyArICJDb2JDbGllbnQiOwotICAgIGlmIChnZW5fdGVtcGxhdGVzXykgewotICAgICAgY2xpZW50X25hbWUgKz0gIlQiOwotICAgICAgc2VydmljZV9pZl9uYW1lICs9ICJUIjsKLSAgICAgIGluZGVudChmX2hlYWRlcl8pIDw8ICJ0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPiIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KGZfaGVhZGVyXykgPDwgImNsYXNzICIgPDwgY2xpZW50X25hbWUgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotCi0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9ICIgOiB2aXJ0dWFsIHB1YmxpYyAiICsgdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKSArIHN0eWxlICsgIklmIjsKLSAgICBpZiAoc3R5bGUgPT0gIkNvYkNsIiAmJiBnZW5fdGVtcGxhdGVzXykgewotICAgICAgLy8gVE9ETyhzaW1wa2lucyk6IElmIGdlbl90ZW1wbGF0ZXNfIGlzIGVuYWJsZWQsIHdlIGN1cnJlbnRseSBhc3N1bWUgYWxsCi0gICAgICAvLyBwYXJlbnQgc2VydmljZXMgd2VyZSBhbHNvIGdlbmVyYXRlZCB3aXRoIHRlbXBsYXRlcyBlbmFibGVkLgotICAgICAgZXh0ZW5kcyArPSAiVDxQcm90b2NvbF8+IjsKLSAgICB9Ci0gIH0KLQotICBpZiAoc3R5bGUgPT0gIkNvYkNsIiAmJiBnZW5fdGVtcGxhdGVzXykgewotICAgIGZfaGVhZGVyXyA8PCAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4iIDw8IGVuZGw7Ci0gIH0KLSAgZl9oZWFkZXJfIDw8ICJjbGFzcyAiIDw8IHNlcnZpY2VfaWZfbmFtZSA8PCBleHRlbmRzIDw8ICIgeyIgPDwgZW5kbCA8PCAiIHB1YmxpYzoiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInZpcnR1YWwgfiIgPDwgc2VydmljZV9pZl9uYW1lIDw8ICIoKSB7fSIgPDwgZW5kbDsKLQotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoKCpmX2l0ZXIpLT5oYXNfZG9jKCkpCi0gICAgICBmX2hlYWRlcl8gPDwgZW5kbDsKLSAgICBnZW5lcmF0ZV9qYXZhX2RvYyhmX2hlYWRlcl8sICpmX2l0ZXIpOwotICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAidmlydHVhbCAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCBzdHlsZSkgPDwgIiA9IDA7IiA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfaGVhZGVyXyA8PCAifTsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpZiAoc3R5bGUgPT0gIkNvYkNsIiAmJiBnZW5fdGVtcGxhdGVzXykgewotICAgIC8vIGdlbmVyYXRlIGEgYmFja3dhcmRzLWNvbXBhdGlibGUgdHlwZWRlZiBmb3IgY2xpZW50cyB0aGF0IGRvIG5vdAotICAgIC8vIGtub3cgYWJvdXQgdGhlIG5ldyB0ZW1wbGF0ZS1zdHlsZSBjb2RlCi0gICAgZl9oZWFkZXJfIDw8ICJ0eXBlZGVmICIgPDwgc2VydmljZV9pZl9uYW1lIDw8ICI8IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+ICIKLSAgICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lXyA8PCBzdHlsZSA8PCAiSWY7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGludGVyZmFjZSBmYWN0b3J5LgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhbiBpbnRlcmZhY2UgZmFjdG9yeSBmb3IuCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZV9mYWN0b3J5KHRfc2VydmljZSogdHNlcnZpY2UsIHN0cmluZyBzdHlsZSkgewotICBzdHJpbmcgc2VydmljZV9pZl9uYW1lID0gc2VydmljZV9uYW1lXyArIHN0eWxlICsgIklmIjsKLQotICAvLyBGaWd1cmUgb3V0IHRoZSBuYW1lIG9mIHRoZSB1cHBlci1tb3N0IHBhcmVudCBjbGFzcy4KLSAgLy8gR2V0dGluZyBldmVyeXRoaW5nIHRvIHdvcmsgb3V0IHByb3Blcmx5IHdpdGggaW5oZXJpdGFuY2UgaXMgYW5ub3lpbmcuCi0gIC8vIEhlcmUncyB3aGF0IHdlJ3JlIGRvaW5nIGZvciBub3c6Ci0gIC8vCi0gIC8vIC0gQWxsIGhhbmRsZXJzIGltcGxlbWVudCBnZXRIYW5kbGVyKCksIGJ1dCBzdWJjbGFzc2VzIHVzZSBjb3ZhcmlhbnQgcmV0dXJuCi0gIC8vICAgdHlwZXMgdG8gcmV0dXJuIHRoZWlyIHNwZWNpZmljIHNlcnZpY2UgaW50ZXJmYWNlIGNsYXNzIHR5cGUuICBXZSBoYXZlIHRvCi0gIC8vICAgdXNlIHJhdyBwb2ludGVycyBiZWNhdXNlIG9mIHRoaXM7IHNoYXJlZF9wdHI8PiBjYW4ndCBiZSB1c2VkIGZvcgotICAvLyAgIGNvdmFyaWFudCByZXR1cm4gdHlwZXMuCi0gIC8vCi0gIC8vIC0gU2luY2Ugd2UncmUgbm90IHVzaW5nIHNoYXJlZF9wdHI8Piwgd2UgYWxzbyBwcm92aWRlIGEgcmVsZWFzZUhhbmRsZXIoKQotICAvLyAgIGZ1bmN0aW9uIHRoYXQgbXVzdCBiZSBjYWxsZWQgdG8gcmVsZWFzZSBhIHBvaW50ZXIgdG8gYSBoYW5kbGVyIG9idGFpbmVkCi0gIC8vICAgdmlhIGdldEhhbmRsZXIoKS4KLSAgLy8KLSAgLy8gICByZWxlYXNlSGFuZGxlcigpIGFsd2F5cyBhY2NlcHRzIGEgcG9pbnRlciB0byB0aGUgdXBwZXItbW9zdCBwYXJlbnQgY2xhc3MKLSAgLy8gICB0eXBlLiAgVGhpcyBpcyBuZWNlc3Nhcnkgc2luY2UgdGhlIHBhcmVudCB2ZXJzaW9ucyBvZiByZWxlYXNlSGFuZGxlcigpCi0gIC8vICAgbWF5IGFjY2VwdCBhbnkgb2YgdGhlIHBhcmVudCB0eXBlcywgbm90IGp1c3QgdGhlIG1vc3Qgc3BlY2lmaWMgc3ViY2xhc3MKLSAgLy8gICB0eXBlLiAgSW1wbGVtZW50YXRpb25zIGNhbiB1c2UgZHluYW1pY19jYXN0IHRvIGNhc3QgdGhlIHBvaW50ZXIgdG8gdGhlCi0gIC8vICAgc3ViY2xhc3MgdHlwZSBpZiBkZXNpcmVkLgotICB0X3NlcnZpY2UqIGJhc2Vfc2VydmljZSA9IHRzZXJ2aWNlOwotICB3aGlsZSAoYmFzZV9zZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBiYXNlX3NlcnZpY2UgPSBiYXNlX3NlcnZpY2UtPmdldF9leHRlbmRzKCk7Ci0gIH0KLSAgc3RyaW5nIGJhc2VfaWZfbmFtZSA9IHR5cGVfbmFtZShiYXNlX3NlcnZpY2UpICsgc3R5bGUgKyAiSWYiOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBhYnN0cmFjdCBmYWN0b3J5IGNsYXNzCi0gIHN0cmluZyBmYWN0b3J5X25hbWUgPSBzZXJ2aWNlX2lmX25hbWUgKyAiRmFjdG9yeSI7Ci0gIHN0cmluZyBleHRlbmRzOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSAiIDogdmlydHVhbCBwdWJsaWMgIiArIHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSkgKyBzdHlsZSArICJJZkZhY3RvcnkiOwotICB9Ci0KLSAgZl9oZWFkZXJfIDw8ICJjbGFzcyAiIDw8IGZhY3RvcnlfbmFtZSA8PCBleHRlbmRzIDw8ICIgeyIgPDwgZW5kbCA8PCAiIHB1YmxpYzoiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInR5cGVkZWYgIiA8PCBzZXJ2aWNlX2lmX25hbWUgPDwgIiBIYW5kbGVyOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICA8PCAidmlydHVhbCB+IiA8PCBmYWN0b3J5X25hbWUgPDwgIigpIHt9IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInZpcnR1YWwgIgotICAgICAgICAgICAgPDwgc2VydmljZV9pZl9uYW1lIDw8ICIqIGdldEhhbmRsZXIoIgotICAgICAgICAgICAgPDwgImNvbnN0IDo6YXBhY2hlOjp0aHJpZnQ6OlRDb25uZWN0aW9uSW5mbyYgY29ubkluZm8pID0gMDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgIDw8ICJ2aXJ0dWFsIHZvaWQgcmVsZWFzZUhhbmRsZXIoIiA8PCBiYXNlX2lmX25hbWUgPDwgIiogLyogaGFuZGxlciAqLykgPSAwOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBmX2hlYWRlcl8gPDwgIn07IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHNpbmdsZXRvbiBmYWN0b3J5IGNsYXNzCi0gIHN0cmluZyBzaW5nbGV0b25fZmFjdG9yeV9uYW1lID0gc2VydmljZV9pZl9uYW1lICsgIlNpbmdsZXRvbkZhY3RvcnkiOwotICBmX2hlYWRlcl8gPDwgImNsYXNzICIgPDwgc2luZ2xldG9uX2ZhY3RvcnlfbmFtZSA8PCAiIDogdmlydHVhbCBwdWJsaWMgIiA8PCBmYWN0b3J5X25hbWUgPDwgIiB7IgotICAgICAgICAgICAgPDwgZW5kbCA8PCAiIHB1YmxpYzoiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgc2luZ2xldG9uX2ZhY3RvcnlfbmFtZSA8PCAiKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPCIgPDwgc2VydmljZV9pZl9uYW1lCi0gICAgICAgICAgICA8PCAiPiYgaWZhY2UpIDogaWZhY2VfKGlmYWNlKSB7fSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidmlydHVhbCB+IgotICAgICAgICAgICAgPDwgc2luZ2xldG9uX2ZhY3RvcnlfbmFtZSA8PCAiKCkge30iIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidmlydHVhbCAiCi0gICAgICAgICAgICA8PCBzZXJ2aWNlX2lmX25hbWUgPDwgIiogZ2V0SGFuZGxlcigiCi0gICAgICAgICAgICA8PCAiY29uc3QgOjphcGFjaGU6OnRocmlmdDo6VENvbm5lY3Rpb25JbmZvJikgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgPDwgIiAgcmV0dXJuIGlmYWNlXy5nZXQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgIDw8ICJ2aXJ0dWFsIHZvaWQgcmVsZWFzZUhhbmRsZXIoIiA8PCBiYXNlX2lmX25hbWUgPDwgIiogLyogaGFuZGxlciAqLykge30iIDw8IGVuZGw7Ci0KLSAgZl9oZWFkZXJfIDw8IGVuZGwgPDwgIiBwcm90ZWN0ZWQ6IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJib29zdDo6c2hhcmVkX3B0cjwiIDw8IHNlcnZpY2VfaWZfbmFtZQotICAgICAgICAgICAgPDwgIj4gaWZhY2VfOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBmX2hlYWRlcl8gPDwgIn07IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgbnVsbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc2VydmljZS4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfbnVsbCh0X3NlcnZpY2UqIHRzZXJ2aWNlLCBzdHJpbmcgc3R5bGUpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gIiAsIHZpcnR1YWwgcHVibGljICIgKyB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpICsgc3R5bGUgKyAiTnVsbCI7Ci0gIH0KLSAgZl9oZWFkZXJfIDw8ICJjbGFzcyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgc3R5bGUgPDwgIk51bGwgOiB2aXJ0dWFsIHB1YmxpYyAiIDw8IHNlcnZpY2VfbmFtZV8KLSAgICAgICAgICAgIDw8IHN0eWxlIDw8ICJJZiIgPDwgZXh0ZW5kcyA8PCAiIHsiIDw8IGVuZGwgPDwgIiBwdWJsaWM6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ2aXJ0dWFsIH4iIDw8IHNlcnZpY2VfbmFtZV8gPDwgc3R5bGUgPDwgIk51bGwoKSB7fSIgPDwgZW5kbDsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCBzdHlsZSwgIiIsIGZhbHNlKSA8PCAiIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICB0X3R5cGUqIHJldHVybnR5cGUgPSAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCk7Ci0gICAgdF9maWVsZCByZXR1cm5maWVsZChyZXR1cm50eXBlLCAiX3JldHVybiIpOwotCi0gICAgaWYgKHN0eWxlID09ICIiKSB7Ci0gICAgICBpZiAocmV0dXJudHlwZS0+aXNfdm9pZCgpIHx8IGlzX2NvbXBsZXhfdHlwZShyZXR1cm50eXBlKSkgewotICAgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgZGVjbGFyZV9maWVsZCgmcmV0dXJuZmllbGQsIHRydWUpIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICAgIDw8ICJyZXR1cm4gX3JldHVybjsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChzdHlsZSA9PSAiQ29iU3YiKSB7Ci0gICAgICBpZiAocmV0dXJudHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGNvYigpOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRfZmllbGQgcmV0dXJuZmllbGQocmV0dXJudHlwZSwgIl9yZXR1cm4iKTsKLSAgICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8IGRlY2xhcmVfZmllbGQoJnJldHVybmZpZWxkLCB0cnVlKSA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgICA8PCAicmV0dXJuIGNvYihfcmV0dXJuKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICB9IGVsc2UgewotICAgICAgdGhyb3cgIlVOS05PV04gU1RZTEUiOwotICAgIH0KLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfaGVhZGVyXyA8PCAifTsiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2NhbGwob3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBhcmdfcHJlZml4KSB7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICB0X3R5cGUqIHJldF90eXBlID0gZ2V0X3RydWVfdHlwZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpOwotICBvdXQgPDwgaW5kZW50KCk7Ci0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhcmV0X3R5cGUtPmlzX3ZvaWQoKSkgewotICAgIGlmIChpc19jb21wbGV4X3R5cGUocmV0X3R5cGUpKSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgb3V0IDw8IGlmYWNlIDw8ICItPiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCB0YXJnZXQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCB0YXJnZXQgPDwgIiA9ICIgPDwgaWZhY2UgPDwgIi0+IiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBvdXQgPDwgaWZhY2UgPDwgIi0+IiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOwotICB9Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwgIiwgIjsKLSAgICB9Ci0gICAgb3V0IDw8IGFyZ19wcmVmaXggPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICB9Ci0gIG91dCA8PCAiKTsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2FzeW5jX3NrZWxldG9uKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIHN2Y25hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKTsKLQotICAvLyBTZXJ2aWNlIGltcGxlbWVudGF0aW9uIGZpbGUgaW5jbHVkZXMKLSAgc3RyaW5nIGZfc2tlbGV0b25fbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBzdmNuYW1lICsgIl9hc3luY19zZXJ2ZXIuc2tlbGV0b24uY3BwIjsKLQotICBzdHJpbmcgbnMgPSBuYW1lc3BhY2VfcHJlZml4KHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZXNwYWNlKCJjcHAiKSk7Ci0KLSAgb2ZzdHJlYW0gZl9za2VsZXRvbjsKLSAgZl9za2VsZXRvbi5vcGVuKGZfc2tlbGV0b25fbmFtZS5jX3N0cigpKTsKLSAgZl9za2VsZXRvbiA8PCAiLy8gVGhpcyBhdXRvZ2VuZXJhdGVkIHNrZWxldG9uIGZpbGUgaWxsdXN0cmF0ZXMgb25lIHdheSB0byBhZGFwdCBhIHN5bmNocm9ub3VzIgotICAgICAgICAgICAgIDw8IGVuZGwgPDwgIi8vIGludGVyZmFjZSBpbnRvIGFuIGFzeW5jaHJvbm91cyBpbnRlcmZhY2UuIFlvdSBzaG91bGQgY29weSBpdCB0byBhbm90aGVyIgotICAgICAgICAgICAgIDw8IGVuZGwKLSAgICAgICAgICAgICA8PCAiLy8gZmlsZW5hbWUgdG8gYXZvaWQgb3ZlcndyaXRpbmcgaXQgYW5kIHJld3JpdGUgYXMgYXN5bmNocm9ub3VzIGFueSBmdW5jdGlvbnMiCi0gICAgICAgICAgICAgPDwgZW5kbCA8PCAiLy8gdGhhdCB3b3VsZCBvdGhlcndpc2UgaW50cm9kdWNlIHVud2FudGVkIGxhdGVuY3kuIiA8PCBlbmRsIDw8IGVuZGwKLSAgICAgICAgICAgICA8PCAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkgPDwgc3ZjbmFtZSA8PCAiLmhcIiIgPDwgZW5kbAotICAgICAgICAgICAgIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPiIgPDwgZW5kbCA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgInVzaW5nIG5hbWVzcGFjZSA6OmFwYWNoZTo6dGhyaWZ0OyIgPDwgZW5kbAotICAgICAgICAgICAgIDw8ICJ1c2luZyBuYW1lc3BhY2UgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7IiA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgInVzaW5nIG5hbWVzcGFjZSA6OmFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7IiA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgInVzaW5nIG5hbWVzcGFjZSA6OmFwYWNoZTo6dGhyaWZ0Ojphc3luYzsiIDw8IGVuZGwgPDwgZW5kbAotICAgICAgICAgICAgIDw8ICJ1c2luZyBib29zdDo6c2hhcmVkX3B0cjsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyB0aGUgZm9sbG93aW5nIGNvZGUgd291bGQgbm90IGNvbXBpbGU6Ci0gIC8vIHVzaW5nIG5hbWVzcGFjZSA7Ci0gIC8vIHVzaW5nIG5hbWVzcGFjZSA6OjsKLSAgaWYgKCghbnMuZW1wdHkoKSkgJiYgKG5zLmNvbXBhcmUoIiA6OiIpICE9IDApKSB7Ci0gICAgZl9za2VsZXRvbiA8PCAidXNpbmcgbmFtZXNwYWNlICIgPDwgc3RyaW5nKG5zLCAwLCBucy5zaXplKCkgLSAyKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0KLSAgZl9za2VsZXRvbiA8PCAiY2xhc3MgIiA8PCBzdmNuYW1lIDw8ICJBc3luY0hhbmRsZXIgOiAiCi0gICAgICAgICAgICAgPDwgInB1YmxpYyAiIDw8IHN2Y25hbWUgPDwgIkNvYlN2SWYgeyIgPDwgZW5kbCA8PCAiIHB1YmxpYzoiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmX3NrZWxldG9uIDw8IGluZGVudCgpIDw8IHN2Y25hbWUgPDwgIkFzeW5jSGFuZGxlcigpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICA8PCAiICBzeW5jSGFuZGxlcl8gPSBzdGQ6OmF1dG9fcHRyPCIgPDwgc3ZjbmFtZSA8PCAiSGFuZGxlcj4obmV3ICIgPDwgc3ZjbmFtZQotICAgICAgICAgICAgIDw8ICJIYW5kbGVyKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgLy8gWW91ciBpbml0aWFsaXphdGlvbiBnb2VzIGhlcmUiIDw8IGVuZGwKLSAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgZl9za2VsZXRvbiA8PCBpbmRlbnQoKSA8PCAidmlydHVhbCB+IiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJBc3luY0hhbmRsZXIoKTsiIDw8IGVuZGw7Ci0KLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZl9za2VsZXRvbiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCAiQ29iU3YiLCAiIiwgdHJ1ZSkgPDwgIiB7IgotICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIHRfdHlwZSogcmV0dXJudHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKTsKLSAgICB0X2ZpZWxkIHJldHVybmZpZWxkKHJldHVybnR5cGUsICJfcmV0dXJuIik7Ci0KLSAgICBzdHJpbmcgdGFyZ2V0ID0gcmV0dXJudHlwZS0+aXNfdm9pZCgpID8gIiIgOiAiX3JldHVybiI7Ci0gICAgaWYgKCFyZXR1cm50eXBlLT5pc192b2lkKCkpIHsKLSAgICAgIGZfc2tlbGV0b24gPDwgaW5kZW50KCkgPDwgZGVjbGFyZV9maWVsZCgmcmV0dXJuZmllbGQsIHRydWUpIDw8IGVuZGw7Ci0gICAgfQotICAgIGdlbmVyYXRlX2Z1bmN0aW9uX2NhbGwoZl9za2VsZXRvbiwgKmZfaXRlciwgdGFyZ2V0LCAic3luY0hhbmRsZXJfIiwgIiIpOwotICAgIGZfc2tlbGV0b24gPDwgaW5kZW50KCkgPDwgInJldHVybiBjb2IoIiA8PCB0YXJnZXQgPDwgIik7IiA8PCBlbmRsOwotCi0gICAgc2NvcGVfZG93bihmX3NrZWxldG9uKTsKLSAgfQotICBmX3NrZWxldG9uIDw8IGVuZGwgPDwgIiBwcm90ZWN0ZWQ6IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJzdGQ6OmF1dG9fcHRyPCIgPDwgc3ZjbmFtZQotICAgICAgICAgICAgIDw8ICJIYW5kbGVyPiBzeW5jSGFuZGxlcl87IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBmX3NrZWxldG9uIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIG11bHRpZmFjZSwgd2hpY2ggaXMgYSBzaW5nbGUgc2VydmVyIHRoYXQganVzdCB0YWtlcyBhIHNldAotICogb2Ygb2JqZWN0cyBpbXBsZW1lbnRpbmcgdGhlIGludGVyZmFjZSBhbmQgY2FsbHMgdGhlbSBhbGwsIHJldHVybmluZyB0aGUKLSAqIHZhbHVlIG9mIHRoZSBsYXN0IG9uZSB0byBiZSBjYWxsZWQuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgbXVsdGlzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9tdWx0aWZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19tdWx0aWZhY2UgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX211bHRpZmFjZSA9ICIsIHB1YmxpYyAiICsgZXh0ZW5kcyArICJNdWx0aWZhY2UiOwotICB9Ci0KLSAgc3RyaW5nIGxpc3RfdHlwZSA9IHN0cmluZygic3RkOjp2ZWN0b3I8Ym9vc3Q6OnNoYXJlZF9wdHI8IikgKyBzZXJ2aWNlX25hbWVfICsgIklmPiA+IjsKLQotICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KLSAgZl9oZWFkZXJfIDw8ICJjbGFzcyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIk11bHRpZmFjZSA6ICIKLSAgICAgICAgICAgIDw8ICJ2aXJ0dWFsIHB1YmxpYyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmIiA8PCBleHRlbmRzX211bHRpZmFjZSA8PCAiIHsiIDw8IGVuZGwKLSAgICAgICAgICAgIDw8ICIgcHVibGljOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJNdWx0aWZhY2UoIiA8PCBsaXN0X3R5cGUKLSAgICAgICAgICAgIDw8ICImIGlmYWNlcykgOiBpZmFjZXNfKGlmYWNlcykgeyIgPDwgZW5kbDsKLSAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgPDwgIiAgc3RkOjp2ZWN0b3I8Ym9vc3Q6OnNoYXJlZF9wdHI8IiArIHNlcnZpY2VfbmFtZV8gKyAiSWY+ID46Oml0ZXJhdG9yIGl0ZXI7IgotICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIGZvciAoaXRlciA9IGlmYWNlcy5iZWdpbigpOyBpdGVyICE9IGlmYWNlcy5lbmQoKTsgKytpdGVyKSB7IgotICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgICAgIiA8PCBleHRlbmRzIDw8ICJNdWx0aWZhY2U6OmFkZCgqaXRlcik7IiA8PCBlbmRsCi0gICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gIH0KLSAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ2aXJ0dWFsIH4iIDw8IHNlcnZpY2VfbmFtZV8KLSAgICAgICAgICAgIDw8ICJNdWx0aWZhY2UoKSB7fSIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLQotICAvLyBQcm90ZWN0ZWQgZGF0YSBtZW1iZXJzCi0gIGZfaGVhZGVyXyA8PCAiIHByb3RlY3RlZDoiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgbGlzdF90eXBlIDw8ICIgaWZhY2VzXzsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgc2VydmljZV9uYW1lXwotICAgICAgICAgICAgPDwgIk11bHRpZmFjZSgpIHt9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ2b2lkIGFkZChib29zdDo6c2hhcmVkX3B0cjwiCi0gICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZj4gaWZhY2UpIHsiIDw8IGVuZGw7Ci0gIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICIgICIgPDwgZXh0ZW5kcyA8PCAiTXVsdGlmYWNlOjphZGQoaWZhY2UpOyIgPDwgZW5kbDsKLSAgfQotICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIiAgaWZhY2VzXy5wdXNoX2JhY2soaWZhY2UpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLQotICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIiBwdWJsaWM6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiBhcmdsaXN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGFyZ3MgPSBhcmdsaXN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGFfaXRlcjsKLQotICAgIHN0cmluZyBjYWxsID0gc3RyaW5nKCJpZmFjZXNfW2ldLT4iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICIoIjsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBpZiAoaXNfY29tcGxleF90eXBlKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSkpIHsKLSAgICAgIGNhbGwgKz0gIl9yZXR1cm4iOwotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9Ci0gICAgZm9yIChhX2l0ZXIgPSBhcmdzLmJlZ2luKCk7IGFfaXRlciAhPSBhcmdzLmVuZCgpOyArK2FfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjYWxsICs9ICIsICI7Ci0gICAgICB9Ci0gICAgICBjYWxsICs9ICgqYV9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICB9Ci0gICAgY2FsbCArPSAiKSI7Ci0KLSAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsICIiKSA8PCAiIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJzaXplX3Qgc3ogPSBpZmFjZXNfLnNpemUoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInNpemVfdCBpID0gMDsiCi0gICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImZvciAoOyBpIDwgKHN6IC0gMSk7ICsraSkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgY2FsbCA8PCAiOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLQotICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgIGlmIChpc19jb21wbGV4X3R5cGUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSkgewotICAgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgY2FsbCA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICIgPDwgY2FsbCA8PCAiOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8IGNhbGwgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAifTsiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlLCBzdHJpbmcgc3R5bGUpIHsKLSAgc3RyaW5nIGlmc3R5bGU7Ci0gIGlmIChzdHlsZSA9PSAiQ29iIikgewotICAgIGlmc3R5bGUgPSAiQ29iQ2wiOwotICB9Ci0KLSAgc3RkOjpvZnN0cmVhbSYgb3V0ID0gKGdlbl90ZW1wbGF0ZXNfID8gZl9zZXJ2aWNlX3RjY18gOiBmX3NlcnZpY2VfKTsKLSAgc3RyaW5nIHRlbXBsYXRlX2hlYWRlciwgdGVtcGxhdGVfc3VmZml4LCBzaG9ydF9zdWZmaXgsIHByb3RvY29sX3R5cGUsIF90aGlzOwotICBzdHJpbmcgY29uc3QgcHJvdF9mYWN0b3J5X3R5cGUgPSAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3RvcnkiOwotICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKLSAgICB0ZW1wbGF0ZV9oZWFkZXIgPSAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz5cbiI7Ci0gICAgc2hvcnRfc3VmZml4ID0gIlQiOwotICAgIHRlbXBsYXRlX3N1ZmZpeCA9ICJUPFByb3RvY29sXz4iOwotICAgIHByb3RvY29sX3R5cGUgPSAiUHJvdG9jb2xfIjsKLSAgICBfdGhpcyA9ICJ0aGlzLT4iOwotICB9IGVsc2UgewotICAgIHByb3RvY29sX3R5cGUgPSAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCI7Ci0gIH0KLSAgc3RyaW5nIHByb3RfcHRyID0gImJvb3N0OjpzaGFyZWRfcHRyPCAiICsgcHJvdG9jb2xfdHlwZSArICI+IjsKLSAgc3RyaW5nIGNsaWVudF9zdWZmaXggPSAiQ2xpZW50IiArIHRlbXBsYXRlX3N1ZmZpeDsKLSAgc3RyaW5nIGlmX3N1ZmZpeCA9ICJJZiI7Ci0gIGlmIChzdHlsZSA9PSAiQ29iIikgewotICAgIGlmX3N1ZmZpeCArPSB0ZW1wbGF0ZV9zdWZmaXg7Ci0gIH0KLQotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICAvLyBUT0RPKHNpbXBraW5zKTogSWYgZ2VuX3RlbXBsYXRlc18gaXMgZW5hYmxlZCwgd2UgY3VycmVudGx5IGFzc3VtZSBhbGwKLSAgICAvLyBwYXJlbnQgc2VydmljZXMgd2VyZSBhbHNvIGdlbmVyYXRlZCB3aXRoIHRlbXBsYXRlcyBlbmFibGVkLgotICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIGV4dGVuZHNfY2xpZW50ID0gIiwgcHVibGljICIgKyBleHRlbmRzICsgc3R5bGUgKyBjbGllbnRfc3VmZml4OwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCi0gIGlmKHN0eWxlID09ICJDb25jdXJyZW50IikKLSAgewotICAgIGZfaGVhZGVyXyA8PCAKLSAgICAgICIvLyBUaGUgXCdjb25jdXJyZW50XCcgY2xpZW50IGlzIGEgdGhyZWFkIHNhZmUgY2xpZW50IHRoYXQgY29ycmVjdGx5IGhhbmRsZXNcbiIKLSAgICAgICIvLyBvdXQgb2Ygb3JkZXIgcmVzcG9uc2VzLiAgSXQgaXMgc2xvd2VyIHRoYW4gdGhlIHJlZ3VsYXIgY2xpZW50LCBzbyBzaG91bGRcbiIKLSAgICAgICIvLyBvbmx5IGJlIHVzZWQgd2hlbiB5b3UgbmVlZCB0byBzaGFyZSBhIGNvbm5lY3Rpb24gYW1vbmcgbXVsdGlwbGUgdGhyZWFkc1xuIjsKLSAgfQotICBmX2hlYWRlcl8gPDwgdGVtcGxhdGVfaGVhZGVyIDw8ICJjbGFzcyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgc3R5bGUgPDwgIkNsaWVudCIgPDwgc2hvcnRfc3VmZml4Ci0gICAgICAgICAgICA8PCAiIDogIgotICAgICAgICAgICAgPDwgInZpcnR1YWwgcHVibGljICIgPDwgc2VydmljZV9uYW1lXyA8PCBpZnN0eWxlIDw8IGlmX3N1ZmZpeCA8PCBleHRlbmRzX2NsaWVudCA8PCAiIHsiCi0gICAgICAgICAgICA8PCBlbmRsIDw8ICIgcHVibGljOiIgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLSAgaWYgKHN0eWxlICE9ICJDb2IiKSB7Ci0gICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8IHNlcnZpY2VfbmFtZV8gPDwgc3R5bGUgPDwgIkNsaWVudCIgPDwgc2hvcnRfc3VmZml4IDw8ICIoIiA8PCBwcm90X3B0cgotICAgICAgICAgICAgICA8PCAiIHByb3QpICI7Ci0KLSAgICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgICBmX2hlYWRlcl8gPDwgInsiIDw8IGVuZGw7Ci0gICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIiAgc2V0UHJvdG9jb2wiIDw8IHNob3J0X3N1ZmZpeCA8PCAiKHByb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX2hlYWRlcl8gPDwgIjoiIDw8IGVuZGw7Ci0gICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIiAgIiA8PCBleHRlbmRzIDw8IHN0eWxlIDw8IGNsaWVudF9zdWZmaXggPDwgIihwcm90LCBwcm90KSB7fSIKLSAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgIH0KLQotICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCBzZXJ2aWNlX25hbWVfIDw8IHN0eWxlIDw8ICJDbGllbnQiIDw8IHNob3J0X3N1ZmZpeCA8PCAiKCIgPDwgcHJvdF9wdHIKLSAgICAgICAgICAgICAgPDwgIiBpcHJvdCwgIiA8PCBwcm90X3B0ciA8PCAiIG9wcm90KSAiOwotICAgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICAgIGZfaGVhZGVyXyA8PCAieyIgPDwgZW5kbDsKLSAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiICBzZXRQcm90b2NvbCIgPDwgc2hvcnRfc3VmZml4IDw8ICIoaXByb3Qsb3Byb3QpOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX2hlYWRlcl8gPDwgIjoiIDw8IGluZGVudCgpIDw8ICIgICIgPDwgZXh0ZW5kcyA8PCBzdHlsZSA8PCBjbGllbnRfc3VmZml4Ci0gICAgICAgICAgICAgICAgPDwgIihpcHJvdCwgb3Byb3QpIHt9IiA8PCBlbmRsOwotICAgIH0KLQotICAgIC8vIGNyZWF0ZSB0aGUgc2V0UHJvdG9jb2wgbWV0aG9kcwotICAgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICAgIGZfaGVhZGVyXyA8PCAiIHByaXZhdGU6IiA8PCBlbmRsOwotICAgICAgLy8gMTogb25lIHBhcmFtZXRlcgotICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ2b2lkIHNldFByb3RvY29sIiA8PCBzaG9ydF9zdWZmaXggPDwgIigiIDw8IHByb3RfcHRyIDw8ICIgcHJvdCkgeyIKLSAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJzZXRQcm90b2NvbCIgPDwgc2hvcnRfc3VmZml4IDw8ICIocHJvdCxwcm90KTsiIDw8IGVuZGw7Ci0gICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICAvLyAyOiB0d28gcGFyYW1ldGVyCi0gICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInZvaWQgc2V0UHJvdG9jb2wiIDw8IHNob3J0X3N1ZmZpeCA8PCAiKCIgPDwgcHJvdF9wdHIgPDwgIiBpcHJvdCwgIgotICAgICAgICAgICAgICAgIDw8IHByb3RfcHRyIDw8ICIgb3Byb3QpIHsiIDw8IGVuZGw7Ci0KLSAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiICBwaXByb3RfPWlwcm90OyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBwb3Byb3RfPW9wcm90OyIgPDwgZW5kbAotICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIGlwcm90XyA9IGlwcm90LmdldCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgIDw8ICIgIG9wcm90XyA9IG9wcm90LmdldCgpOyIgPDwgZW5kbDsKLQotICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgZl9oZWFkZXJfIDw8ICIgcHVibGljOiIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICAvLyBHZW5lcmF0ZSBnZXR0ZXJzIGZvciB0aGUgcHJvdG9jb2xzLgotICAgIC8vIE5vdGUgdGhhdCB0aGVzZSBhcmUgbm90IGN1cnJlbnRseSB0ZW1wbGF0ZWQgZm9yIHNpbXBsaWNpdHkuCi0gICAgLy8gVE9ETyhzaW1wa2lucyk6IHNob3VsZCB0aGV5IGJlIHRlbXBsYXRlZD8KLSAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgPDwgImJvb3N0OjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBnZXRJbnB1dFByb3RvY29sKCkgeyIKLSAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBfdGhpcyA8PCAicGlwcm90XzsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iCi0gICAgICAgICAgICAgIDw8IGVuZGw7Ci0KLSAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgPDwgImJvb3N0OjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBnZXRPdXRwdXRQcm90b2NvbCgpIHsiCi0gICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgX3RoaXMgPDwgInBvcHJvdF87IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IgotICAgICAgICAgICAgICA8PCBlbmRsOwotCi0gIH0gZWxzZSAvKiBpZiAoc3R5bGUgPT0gIkNvYiIpICovIHsKLSAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgc2VydmljZV9uYW1lXyA8PCBzdHlsZSA8PCAiQ2xpZW50IiA8PCBzaG9ydF9zdWZmaXggPDwgIigiCi0gICAgICAgICAgICAgIDw8ICJib29zdDo6c2hhcmVkX3B0cjwgOjphcGFjaGU6OnRocmlmdDo6YXN5bmM6OlRBc3luY0NoYW5uZWw+IGNoYW5uZWwsICIKLSAgICAgICAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5KiBwcm90b2NvbEZhY3RvcnkpIDoiIDw8IGVuZGw7Ci0gICAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICIgIGNoYW5uZWxfKGNoYW5uZWwpLCIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgIDw8ICIgIGl0cmFuc18obmV3IDo6YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcigpKSwiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICBvdHJhbnNfKG5ldyA6OmFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIoKSksIgotICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKLSAgICAgICAgLy8gVFByb3RvY29sRmFjdG9yeSBjbGFzc2VzIHJldHVybiBnZW5lcmljIFRQcm90b2NvbCBwb2ludGVycy4KLSAgICAgICAgLy8gV2UgaGF2ZSB0byBkeW5hbWljIGNhc3QgdG8gdGhlIFByb3RvY29sXyB0eXBlIHdlIGFyZSBleHBlY3RpbmcuCi0gICAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiICBwaXByb3RfKGJvb3N0OjpkeW5hbWljX3BvaW50ZXJfY2FzdDxQcm90b2NvbF8+KCIKLSAgICAgICAgICAgICAgICAgIDw8ICJwcm90b2NvbEZhY3RvcnktPmdldFByb3RvY29sKGl0cmFuc18pKSksIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgICA8PCAiICBwb3Byb3RfKGJvb3N0OjpkeW5hbWljX3BvaW50ZXJfY2FzdDxQcm90b2NvbF8+KCIKLSAgICAgICAgICAgICAgICAgIDw8ICJwcm90b2NvbEZhY3RvcnktPmdldFByb3RvY29sKG90cmFuc18pKSkgeyIgPDwgZW5kbDsKLSAgICAgICAgLy8gVGhyb3cgYSBURXhjZXB0aW9uIGlmIGVpdGhlciBkeW5hbWljIGNhc3QgZmFpbGVkLgotICAgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIiAgaWYgKCFwaXByb3RfIHx8ICFwb3Byb3RfKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgICA8PCAiICAgIHRocm93IDo6YXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24oXCIiCi0gICAgICAgICAgICAgICAgICA8PCAiVFByb3RvY29sRmFjdG9yeSByZXR1cm5lZCB1bmV4cGVjdGVkIHByb3RvY29sIHR5cGUgaW4gIiA8PCBzZXJ2aWNlX25hbWVfCi0gICAgICAgICAgICAgICAgICA8PCBzdHlsZSA8PCAiQ2xpZW50IiA8PCBzaG9ydF9zdWZmaXggPDwgIiBjb25zdHJ1Y3RvclwiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICAgIDw8ICIgIH0iIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIiAgcGlwcm90Xyhwcm90b2NvbEZhY3RvcnktPmdldFByb3RvY29sKGl0cmFuc18pKSwiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHBvcHJvdF8ocHJvdG9jb2xGYWN0b3J5LT5nZXRQcm90b2NvbChvdHJhbnNfKSkgeyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiICBpcHJvdF8gPSBwaXByb3RfLmdldCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgIDw8ICIgIG9wcm90XyA9IHBvcHJvdF8uZ2V0KCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIiAgIiA8PCBleHRlbmRzIDw8IHN0eWxlIDw8IGNsaWVudF9zdWZmaXgKLSAgICAgICAgICAgICAgICA8PCAiKGNoYW5uZWwsIHByb3RvY29sRmFjdG9yeSkge30iIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaWYgKHN0eWxlID09ICJDb2IiKSB7Ci0gICAgZl9oZWFkZXJfIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgIDw8ICJib29zdDo6c2hhcmVkX3B0cjwgOjphcGFjaGU6OnRocmlmdDo6YXN5bmM6OlRBc3luY0NoYW5uZWw+IGdldENoYW5uZWwoKSB7IiA8PCBlbmRsCi0gICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IF90aGlzIDw8ICJjaGFubmVsXzsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgaWYgKCFnZW5fbm9fY2xpZW50X2NvbXBsZXRpb25fKSB7Ci0gICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInZpcnR1YWwgdm9pZCBjb21wbGV0ZWRfXyhib29sIC8qIHN1Y2Nlc3MgKi8pIHt9IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGluZGVudChmX2hlYWRlcl8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCBpZnN0eWxlKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAvLyBUT0RPKGRyZWlzcyk6IFVzZSBwcml2YXRlIGluaGVyaXRhbmNlIHRvIGF2b2lkIGdlbmVyYXRpbmcgdGhpc2UgaW4gY29iLXN0eWxlLgotICAgIGlmKHN0eWxlID09ICJDb25jdXJyZW50IiAmJiAhKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgLy8gY29uY3VycmVudCBjbGllbnRzIG5lZWQgdG8gbW92ZSB0aGUgc2VxaWQgZnJvbSB0aGUgc2VuZCBmdW5jdGlvbiB0byB0aGUKLSAgICAgIC8vIHJlY3YgZnVuY3Rpb24uICBPbmV3YXkgbWV0aG9kcyBkb24ndCBoYXZlIGEgcmVjdiBmdW5jdGlvbiwgc28gd2UgZG9uJ3QgbmVlZCB0bwotICAgICAgLy8gbW92ZSB0aGUgc2VxaWQgZm9yIHRoZW0uICBBdHRlbXB0aW5nIHRvIGRvIHNvIHdvdWxkIHJlc3VsdCBpbiBhIHNlcWlkIGxlYWsuCi0gICAgICB0X2Z1bmN0aW9uIHNlbmRfZnVuY3Rpb24oZ190eXBlX2kzMiwgLypyZXR1cm5pbmcgc2VxaWQqLwotICAgICAgICAgIHN0cmluZygic2VuZF8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAoKmZfaXRlciktPmdldF9hcmdsaXN0KCkpOwotICAgICAgaW5kZW50KGZfaGVhZGVyXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZzZW5kX2Z1bmN0aW9uLCAiIikgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgdF9mdW5jdGlvbiBzZW5kX2Z1bmN0aW9uKGdfdHlwZV92b2lkLAotICAgICAgICAgIHN0cmluZygic2VuZF8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAoKmZfaXRlciktPmdldF9hcmdsaXN0KCkpOwotICAgICAgaW5kZW50KGZfaGVhZGVyXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZzZW5kX2Z1bmN0aW9uLCAiIikgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgaWYoc3R5bGUgPT0gIkNvbmN1cnJlbnQiKSB7Ci0gICAgICAgIHRfZmllbGQgc2VxSWRBcmcoZ190eXBlX2kzMiwgInNlcWlkIik7Ci0gICAgICAgIHRfc3RydWN0IHNlcUlkQXJnU3RydWN0KHByb2dyYW1fKTsKLSAgICAgICAgc2VxSWRBcmdTdHJ1Y3QuYXBwZW5kKCZzZXFJZEFyZyk7Ci0gICAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCi0gICAgICAgICAgICBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAmc2VxSWRBcmdTdHJ1Y3QpOwotICAgICAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24sICIiKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOwotICAgICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAotICAgICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgJm5vYXJncyk7Ci0gICAgICAgIGluZGVudChmX2hlYWRlcl8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbiwgIiIpIDw8ICI7IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgfQotICBpbmRlbnRfZG93bigpOwotCi0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX2hlYWRlcl8gPDwgIiBwcm90ZWN0ZWQ6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgaWYgKHN0eWxlID09ICJDb2IiKSB7Ci0gICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICA8PCAiYm9vc3Q6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OmFzeW5jOjpUQXN5bmNDaGFubmVsPiBjaGFubmVsXzsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgIDw8ICJib29zdDo6c2hhcmVkX3B0cjwgOjphcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyPiBpdHJhbnNfOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgPDwgImJvb3N0OjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI+IG90cmFuc187IgotICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgfQotICAgIGZfaGVhZGVyXyA8PCAKLSAgICAgIGluZGVudCgpIDw8IHByb3RfcHRyIDw8ICIgcGlwcm90XzsiIDw8IGVuZGwgPDwgCi0gICAgICBpbmRlbnQoKSA8PCBwcm90X3B0ciA8PCAiIHBvcHJvdF87IiA8PCBlbmRsIDw8IAotICAgICAgaW5kZW50KCkgPDwgcHJvdG9jb2xfdHlwZSA8PCAiKiBpcHJvdF87IiA8PCBlbmRsIDw8IAotICAgICAgaW5kZW50KCkgPDwgcHJvdG9jb2xfdHlwZSA8PCAiKiBvcHJvdF87IiA8PCBlbmRsOwotCi0gICAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IikgewotICAgICAgZl9oZWFkZXJfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojphc3luYzo6VENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbyBzeW5jXzsiPDxlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0KLSAgZl9oZWFkZXJfIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGlmIChnZW5fdGVtcGxhdGVzXykgewotICAgIC8vIE91dHB1dCBhIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHR5cGVkZWYgdXNpbmcKLSAgICAvLyBUUHJvdG9jb2wgYXMgdGhlIHRlbXBsYXRlIHBhcmFtZXRlci4KLSAgICBmX2hlYWRlcl8gPDwgInR5cGVkZWYgIiA8PCBzZXJ2aWNlX25hbWVfIDw8IHN0eWxlCi0gICAgICAgICAgICAgIDw8ICJDbGllbnRUPCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgc3R5bGUKLSAgICAgICAgICAgICAgPDwgIkNsaWVudDsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotCi0gIHN0cmluZyBzY29wZSA9IHNlcnZpY2VfbmFtZV8gKyBzdHlsZSArIGNsaWVudF9zdWZmaXggKyAiOjoiOwotCi0gIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyaW5nIHNlcUlkQ2FwdHVyZTsKLSAgICBzdHJpbmcgc2VxSWRVc2U7Ci0gICAgc3RyaW5nIHNlcUlkQ29tbWFVc2U7Ci0gICAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IiAmJiAhKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgc2VxSWRDYXB0dXJlID0gImludDMyX3Qgc2VxaWQgPSAiOwotICAgICAgc2VxSWRVc2UgPSAic2VxaWQiOwotICAgICAgc2VxSWRDb21tYVVzZSA9ICIsIHNlcWlkIjsKLSAgICB9Ci0KLSAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLQotICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKLSAgICAgIGluZGVudChvdXQpIDw8IHRlbXBsYXRlX2hlYWRlcjsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsIGlmc3R5bGUsIHNjb3BlKSA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgaW5kZW50KG91dCkgPDwgc2VxSWRDYXB0dXJlIDw8ICJzZW5kXyIgPDwgZnVubmFtZSA8PCAiKCI7Ci0KLSAgICAvLyBHZXQgdGhlIHN0cnVjdCBvZiBmdW5jdGlvbiBjYWxsIHBhcmFtcwotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotCi0gICAgLy8gRGVjbGFyZSB0aGUgZnVuY3Rpb24gYXJndW1lbnRzCi0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgIiwgIjsKLSAgICAgIH0KLSAgICAgIG91dCA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICB9Ci0gICAgb3V0IDw8ICIpOyIgPDwgZW5kbDsKLQotICAgIGlmIChzdHlsZSAhPSAiQ29iIikgewotICAgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICAgIG91dCA8PCBpbmRlbnQoKTsKLSAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICAgIGlmIChpc19jb21wbGV4X3R5cGUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSkgewotICAgICAgICAgICAgb3V0IDw8ICJyZWN2XyIgPDwgZnVubmFtZSA8PCAiKF9yZXR1cm4iIDw8IHNlcUlkQ29tbWFVc2UgPDwgIik7IiA8PCBlbmRsOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvdXQgPDwgInJldHVybiByZWN2XyIgPDwgZnVubmFtZSA8PCAiKCIgPDwgc2VxSWRVc2UgPDwgIik7IiA8PCBlbmRsOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBvdXQgPDwgInJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoIiA8PCBzZXFJZFVzZSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBfdGhpcyA8PCAiY2hhbm5lbF8tPnNlbmRBbmRSZWN2TWVzc2FnZSgiCi0gICAgICAgICAgICA8PCAidGN4eDo6YmluZChjb2IsIHRoaXMpLCAiIDw8IF90aGlzIDw8ICJvdHJhbnNfLmdldCgpLCAiIDw8IF90aGlzIDw8ICJpdHJhbnNfLmdldCgpKTsiCi0gICAgICAgICAgICA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IF90aGlzIDw8ICJjaGFubmVsXy0+c2VuZE1lc3NhZ2UoIgotICAgICAgICAgICAgPDwgInRjeHg6OmJpbmQoY29iLCB0aGlzKSwgIiA8PCBfdGhpcyA8PCAib3RyYW5zXy5nZXQoKSk7IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgb3V0IDw8IGVuZGw7Ci0KLSAgICAvLyBpZiAoc3R5bGUgIT0gIkNvYiIpIC8vIFRPRE8oZHJlaXNzKTogTGliaWZ5IHRoZSBjbGllbnQgYW5kIGRvbid0IGdlbmVyYXRlIHRoaXMgZm9yIGNvYi1zdHlsZQotICAgIGlmICh0cnVlKSB7Ci0gICAgICB0X3R5cGUgKnNlbmRfZnVuY19yZXR1cm5fdHlwZSA9IGdfdHlwZV92b2lkOwotICAgICAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IiAmJiAhKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgICBzZW5kX2Z1bmNfcmV0dXJuX3R5cGUgPSBnX3R5cGVfaTMyOwotICAgICAgfQotICAgICAgLy8gRnVuY3Rpb24gZm9yIHNlbmRpbmcKLSAgICAgIHRfZnVuY3Rpb24gc2VuZF9mdW5jdGlvbihzZW5kX2Z1bmNfcmV0dXJuX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJzZW5kXyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSk7Ci0KLSAgICAgIC8vIE9wZW4gdGhlIHNlbmQgZnVuY3Rpb24KLSAgICAgIGlmIChnZW5fdGVtcGxhdGVzXykgewotICAgICAgICBpbmRlbnQob3V0KSA8PCB0ZW1wbGF0ZV9oZWFkZXI7Ci0gICAgICB9Ci0gICAgICBpbmRlbnQob3V0KSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnNlbmRfZnVuY3Rpb24sICIiLCBzY29wZSkgPDwgZW5kbDsKLSAgICAgIHNjb3BlX3VwKG91dCk7Ci0KLSAgICAgIC8vIEZ1bmN0aW9uIGFyZ3VtZW50cyBhbmQgcmVzdWx0cwotICAgICAgc3RyaW5nIGFyZ3NuYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3BhcmdzIjsKLSAgICAgIHN0cmluZyByZXN1bHRuYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3ByZXN1bHQiOwotCi0gICAgICBzdHJpbmcgY3NlcWlkVmFsID0gIjAiOwotICAgICAgaWYoc3R5bGUgPT0gIkNvbmN1cnJlbnQiKSB7Ci0gICAgICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgICAgIGNzZXFpZFZhbCA9ICJ0aGlzLT5zeW5jXy5nZW5lcmF0ZVNlcUlkKCkiOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QKLSAgICAgIG91dCA8PCAKLSAgICAgICAgaW5kZW50KCkgPDwgImludDMyX3QgY3NlcWlkID0gIiA8PCBjc2VxaWRWYWwgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICBpZihzdHlsZSA9PSAiQ29uY3VycmVudCIpIHsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OmFzeW5jOjpUQ29uY3VycmVudFNlbmRTZW50cnkgc2VudHJ5KCZ0aGlzLT5zeW5jXyk7IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8IF90aGlzIDw8ICJvcHJvdF8tPndyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCAKLSAgICAgICAgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8IAotICAgICAgICAiXCIsIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjoiIDw8ICgoKmZfaXRlciktPmlzX29uZXdheSgpID8gIlRfT05FV0FZIiA6ICJUX0NBTEwiKSA8PCAKLSAgICAgICAgIiwgY3NlcWlkKTsiIDw8IGVuZGwgPDwgZW5kbCA8PCAKLSAgICAgICAgaW5kZW50KCkgPDwgYXJnc25hbWUgPDwgIiBhcmdzOyIgPDwgZW5kbDsKLQotICAgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhcmdzLiIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICYiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICA8PCAiOyIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhcmdzLndyaXRlKCIgPDwgX3RoaXMgPDwgIm9wcm90Xyk7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgX3RoaXMKLSAgICAgICAgICA8PCAib3Byb3RfLT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgX3RoaXMKLSAgICAgICAgICA8PCAib3Byb3RfLT5nZXRUcmFuc3BvcnQoKS0+d3JpdGVFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgX3RoaXMKLSAgICAgICAgICA8PCAib3Byb3RfLT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGw7Ci0KLSAgICAgIGlmIChzdHlsZSA9PSAiQ29uY3VycmVudCIpIHsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJzZW50cnkuY29tbWl0KCk7IiA8PCBlbmRsOwotCi0gICAgICAgIGlmKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAicmV0dXJuIGNzZXFpZDsiIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgICAgIG91dCA8PCBlbmRsOwotCi0gICAgICAvLyBHZW5lcmF0ZSByZWN2IGZ1bmN0aW9uIG9ubHkgaWYgbm90IGFuIG9uZXdheSBmdW5jdGlvbgotICAgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7Ci0KLSAgICAgICAgdF9maWVsZCBzZXFJZEFyZyhnX3R5cGVfaTMyLCAic2VxaWQiKTsKLSAgICAgICAgdF9zdHJ1Y3Qgc2VxSWRBcmdTdHJ1Y3QocHJvZ3JhbV8pOwotICAgICAgICBzZXFJZEFyZ1N0cnVjdC5hcHBlbmQoJnNlcUlkQXJnKTsKLQotICAgICAgICB0X3N0cnVjdCAqcmVjdl9mdW5jdGlvbl9hcmdzID0gJm5vYXJnczsKLSAgICAgICAgaWYoc3R5bGUgPT0gIkNvbmN1cnJlbnQiKSB7Ci0gICAgICAgICAgcmVjdl9mdW5jdGlvbl9hcmdzID0gJnNlcUlkQXJnU3RydWN0OwotICAgICAgICB9Ci0KLSAgICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3ZfZnVuY3Rpb25fYXJncyk7Ci0gICAgICAgIC8vIE9wZW4gdGhlIHJlY3YgZnVuY3Rpb24KLSAgICAgICAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgdGVtcGxhdGVfaGVhZGVyOwotICAgICAgICB9Ci0gICAgICAgIGluZGVudChvdXQpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbiwgIiIsIHNjb3BlKSA8PCBlbmRsOwotICAgICAgICBzY29wZV91cChvdXQpOwotCi0gICAgICAgIG91dCA8PCBlbmRsIDw8IAotICAgICAgICAgIGluZGVudCgpIDw8ICJpbnQzMl90IHJzZXFpZCA9IDA7IiA8PCBlbmRsIDw8IAotICAgICAgICAgIGluZGVudCgpIDw8ICJzdGQ6OnN0cmluZyBmbmFtZTsiIDw8IGVuZGwgPDwgCi0gICAgICAgICAgaW5kZW50KCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUTWVzc2FnZVR5cGUgbXR5cGU7IiA8PCBlbmRsOwotICAgICAgICBpZihzdHlsZSA9PSAiQ29uY3VycmVudCIpIHsKLSAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgIGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICIvLyB0aGUgcmVhZCBtdXRleCBnZXRzIGRyb3BwZWQgYW5kIHJlYWNxdWlyZWQgYXMgcGFydCBvZiB3YWl0Rm9yV29yaygpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiLy8gVGhlIGRlc3RydWN0b3Igb2YgdGhpcyBzZW50cnkgd2FrZXMgdXAgb3RoZXIgY2xpZW50cyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OmFzeW5jOjpUQ29uY3VycmVudFJlY3ZTZW50cnkgc2VudHJ5KCZ0aGlzLT5zeW5jXywgc2VxaWQpOyIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3R5bGUgPT0gIkNvYiIgJiYgIWdlbl9ub19jbGllbnRfY29tcGxldGlvbl8pIHsKLSAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImJvb2wgY29tcGxldGVkID0gZmFsc2U7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInRyeSB7IjsKLSAgICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgfQotICAgICAgICBvdXQgPDwgZW5kbDsKLSAgICAgICAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IikgewotICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIndoaWxlKHRydWUpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIGlmKCF0aGlzLT5zeW5jXy5nZXRQZW5kaW5nKGZuYW1lLCBtdHlwZSwgcnNlcWlkKSkgeyIgPDwgZW5kbDsKLSAgICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgfQotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCBfdGhpcyA8PCAiaXByb3RfLT5yZWFkTWVzc2FnZUJlZ2luKGZuYW1lLCBtdHlwZSwgcnNlcWlkKTsiIDw8IGVuZGw7Ci0gICAgICAgIGlmIChzdHlsZSA9PSAiQ29uY3VycmVudCIpIHsKLSAgICAgICAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZihzZXFpZCA9PSByc2VxaWQpIHsiIDw8IGVuZGw7Ci0gICAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmIChtdHlwZSA9PSA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9FWENFUFRJT04pIHsiIDw8IGVuZGwgPDwgCi0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgOjphcGFjaGU6OnRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uIHg7IiA8PCBlbmRsIDw8IAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHgucmVhZCgiIDw8IF90aGlzIDw8ICJpcHJvdF8pOyIgPDwgZW5kbCA8PCAKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IF90aGlzIDw8ICJpcHJvdF8tPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IAotICAgICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgX3RoaXMgPDwgImlwcm90Xy0+Z2V0VHJhbnNwb3J0KCktPnJlYWRFbmQoKTsiIDw8IGVuZGw7Ci0gICAgICAgIGlmIChzdHlsZSA9PSAiQ29iIiAmJiAhZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXykgewotICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBjb21wbGV0ZWQgPSB0cnVlOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBjb21wbGV0ZWRfXyh0cnVlKTsiCi0gICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IikgewotICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBzZW50cnkuY29tbWl0KCk7IiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICAgIG91dCA8PCAKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICB0aHJvdyB4OyIgPDwgZW5kbCA8PCAKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCAKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKG10eXBlICE9IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1JFUExZKSB7IiA8PCBlbmRsIDw8IAotICAgICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgX3RoaXMgPDwgImlwcm90Xy0+c2tpcCgiIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVFJVQ1QpOyIgPDwgZW5kbCA8PCAKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IF90aGlzIDw8ICJpcHJvdF8tPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IAotICAgICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgX3RoaXMgPDwgImlwcm90Xy0+Z2V0VHJhbnNwb3J0KCktPnJlYWRFbmQoKTsiIDw8IGVuZGw7Ci0gICAgICAgIGlmIChzdHlsZSA9PSAiQ29iIiAmJiAhZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXykgewotICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBjb21wbGV0ZWQgPSB0cnVlOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBjb21wbGV0ZWRfXyhmYWxzZSk7IgotICAgICAgICAgICAgICA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICAgIG91dCA8PCAKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCAKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKGZuYW1lLmNvbXBhcmUoXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIpICE9IDApIHsiIDw8IGVuZGwgPDwgCi0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCBfdGhpcyA8PCAiaXByb3RfLT5za2lwKCIgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUUlVDVCk7IiA8PCBlbmRsIDw8IAotICAgICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgX3RoaXMgPDwgImlwcm90Xy0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgCi0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCBfdGhpcyA8PCAiaXByb3RfLT5nZXRUcmFuc3BvcnQoKS0+cmVhZEVuZCgpOyIgPDwgZW5kbDsKLSAgICAgICAgaWYgKHN0eWxlID09ICJDb2IiICYmICFnZW5fbm9fY2xpZW50X2NvbXBsZXRpb25fKSB7Ci0gICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIGNvbXBsZXRlZCA9IHRydWU7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIGNvbXBsZXRlZF9fKGZhbHNlKTsiCi0gICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IikgewotICAgICAgICAgIG91dCA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiICAvLyBpbiBhIGJhZCBzdGF0ZSwgZG9uJ3QgY29tbWl0IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiICB1c2luZyA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRXhjZXB0aW9uOyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsiIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotCi0gICAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkKLSAgICAgICAgICAgICYmICFpc19jb21wbGV4X3R5cGUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSkgewotICAgICAgICAgIHRfZmllbGQgcmV0dXJuZmllbGQoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLCAiX3JldHVybiIpOwotICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBkZWNsYXJlX2ZpZWxkKCZyZXR1cm5maWVsZCkgPDwgZW5kbDsKLSAgICAgICAgfQotCi0gICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCByZXN1bHRuYW1lIDw8ICIgcmVzdWx0OyIgPDwgZW5kbDsKLQotICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXN1bHQuc3VjY2VzcyA9ICZfcmV0dXJuOyIgPDwgZW5kbDsKLSAgICAgICAgfQotCi0gICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LnJlYWQoIiA8PCBfdGhpcyA8PCAiaXByb3RfKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgX3RoaXMKLSAgICAgICAgICAgIDw8ICJpcHJvdF8tPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IF90aGlzCi0gICAgICAgICAgICA8PCAiaXByb3RfLT5nZXRUcmFuc3BvcnQoKS0+cmVhZEVuZCgpOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgICAgIC8vIENhcmVmdWwsIG9ubHkgbG9vayBmb3IgX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgICBpZiAoaXNfY29tcGxleF90eXBlKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSkpIHsKLSAgICAgICAgICAgIG91dCA8PCAKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuX19pc3NldC5zdWNjZXNzKSB7IiA8PCBlbmRsOwotICAgICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIC8vIF9yZXR1cm4gcG9pbnRlciBoYXMgbm93IGJlZW4gZmlsbGVkIiA8PCBlbmRsOwotICAgICAgICAgICAgaWYgKHN0eWxlID09ICJDb2IiICYmICFnZW5fbm9fY2xpZW50X2NvbXBsZXRpb25fKSB7Ci0gICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBjb21wbGV0ZWQgPSB0cnVlOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBjb21wbGV0ZWRfXyh0cnVlKTsiCi0gICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IikgewotICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgc2VudHJ5LmNvbW1pdCgpOyIgPDwgZW5kbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG91dCA8PCAKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuOyIgPDwgZW5kbCA8PCAKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC5fX2lzc2V0LnN1Y2Nlc3MpIHsiIDw8IGVuZGw7Ci0gICAgICAgICAgICBpZiAoc3R5bGUgPT0gIkNvYiIgJiYgIWdlbl9ub19jbGllbnRfY29tcGxldGlvbl8pIHsKLSAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIGNvbXBsZXRlZCA9IHRydWU7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIGNvbXBsZXRlZF9fKHRydWUpOyIKLSAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3R5bGUgPT0gIkNvbmN1cnJlbnQiKSB7Ci0gICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBzZW50cnkuY29tbWl0KCk7IiA8PCBlbmRsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBfcmV0dXJuOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICAgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC5fX2lzc2V0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICAgICAgaWYgKHN0eWxlID09ICJDb2IiICYmICFnZW5fbm9fY2xpZW50X2NvbXBsZXRpb25fKSB7Ci0gICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgY29tcGxldGVkID0gdHJ1ZTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgY29tcGxldGVkX18odHJ1ZSk7IgotICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChzdHlsZSA9PSAiQ29uY3VycmVudCIpIHsKLSAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBzZW50cnkuY29tbWl0KCk7IiA8PCBlbmRsOwotICAgICAgICAgIH0KLSAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgdGhyb3cgcmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gV2Ugb25seSBnZXQgaGVyZSBpZiB3ZSBhcmUgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICAgIGlmIChzdHlsZSA9PSAiQ29iIiAmJiAhZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXykgewotICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJjb21wbGV0ZWQgPSB0cnVlOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiY29tcGxldGVkX18odHJ1ZSk7IgotICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChzdHlsZSA9PSAiQ29uY3VycmVudCIpIHsKLSAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAic2VudHJ5LmNvbW1pdCgpOyIgPDwgZW5kbDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaWYgKHN0eWxlID09ICJDb2IiICYmICFnZW5fbm9fY2xpZW50X2NvbXBsZXRpb25fKSB7Ci0gICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImNvbXBsZXRlZCA9IHRydWU7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJjb21wbGV0ZWRfXyh0cnVlKTsiCi0gICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IikgewotICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIvLyBpbiBhIGJhZCBzdGF0ZSwgZG9uJ3QgY29tbWl0IiA8PCBlbmRsOwotICAgICAgICAgIH0KLSAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRocm93ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjo6YXBhY2hlOjp0aHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbig6OmFwYWNoZTo6dGhyaWZ0OjoiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUQXBwbGljYXRpb25FeGNlcHRpb246Ok1JU1NJTkdfUkVTVUxULCBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKTsiIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoc3R5bGUgPT0gIkNvbmN1cnJlbnQiKSB7Ci0gICAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgLy8gc2VxaWQgIT0gcnNlcWlkIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiICB0aGlzLT5zeW5jXy51cGRhdGVQZW5kaW5nKGZuYW1lLCBtdHlwZSwgcnNlcWlkKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIC8vIHRoaXMgd2lsbCB0ZW1wb3JhcmlseSB1bmxvY2sgdGhlIHJlYWRNdXRleCwgYW5kIGxldCBvdGhlciBjbGllbnRzIGdldCB3b3JrIGRvbmUiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIHRoaXMtPnN5bmNfLndhaXRGb3JXb3JrKHNlcWlkKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJ9IC8vIGVuZCB3aGlsZSh0cnVlKSIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3R5bGUgPT0gIkNvYiIgJiYgIWdlbl9ub19jbGllbnRfY29tcGxldGlvbl8pIHsKLSAgICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBjYXRjaCAoLi4uKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIGlmICghY29tcGxldGVkKSB7IiA8PCBlbmRsCi0gICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgICAgY29tcGxldGVkX18oZmFsc2UpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsCi0gICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHRocm93OyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgICAvLyBDbG9zZSBmdW5jdGlvbgotICAgICAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgICAgIG91dCA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi1jbGFzcyBQcm9jZXNzb3JHZW5lcmF0b3IgewotcHVibGljOgotICBQcm9jZXNzb3JHZW5lcmF0b3IodF9jcHBfZ2VuZXJhdG9yKiBnZW5lcmF0b3IsIHRfc2VydmljZSogc2VydmljZSwgY29uc3Qgc3RyaW5nJiBzdHlsZSk7Ci0KLSAgdm9pZCBydW4oKSB7Ci0gICAgZ2VuZXJhdGVfY2xhc3NfZGVmaW5pdGlvbigpOwotCi0gICAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoQ2FsbCgpIGZ1bmN0aW9uCi0gICAgZ2VuZXJhdGVfZGlzcGF0Y2hfY2FsbChmYWxzZSk7Ci0gICAgaWYgKGdlbmVyYXRvcl8tPmdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgICBnZW5lcmF0ZV9kaXNwYXRjaF9jYWxsKHRydWUpOwotICAgIH0KLQotICAgIC8vIEdlbmVyYXRlIGFsbCBvZiB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKLSAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9ucygpOwotCi0gICAgZ2VuZXJhdGVfZmFjdG9yeSgpOwotICB9Ci0KLSAgdm9pZCBnZW5lcmF0ZV9jbGFzc19kZWZpbml0aW9uKCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZGlzcGF0Y2hfY2FsbChib29sIHRlbXBsYXRlX3Byb3RvY29sKTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9ucygpOwotICB2b2lkIGdlbmVyYXRlX2ZhY3RvcnkoKTsKLQotcHJvdGVjdGVkOgotICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl90eXBlZGVmID0gZmFsc2UsIGJvb2wgYXJnID0gZmFsc2UpIHsKLSAgICByZXR1cm4gZ2VuZXJhdG9yXy0+dHlwZV9uYW1lKHR0eXBlLCBpbl90eXBlZGVmLCBhcmcpOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgaW5kZW50KCkgeyByZXR1cm4gZ2VuZXJhdG9yXy0+aW5kZW50KCk7IH0KLSAgc3RkOjpvc3RyZWFtJiBpbmRlbnQoc3RkOjpvc3RyZWFtJiBvcykgeyByZXR1cm4gZ2VuZXJhdG9yXy0+aW5kZW50KG9zKTsgfQotCi0gIHZvaWQgaW5kZW50X3VwKCkgeyBnZW5lcmF0b3JfLT5pbmRlbnRfdXAoKTsgfQotICB2b2lkIGluZGVudF9kb3duKCkgeyBnZW5lcmF0b3JfLT5pbmRlbnRfZG93bigpOyB9Ci0KLSAgdF9jcHBfZ2VuZXJhdG9yKiBnZW5lcmF0b3JfOwotICB0X3NlcnZpY2UqIHNlcnZpY2VfOwotICBzdGQ6Om9mc3RyZWFtJiBmX2hlYWRlcl87Ci0gIHN0ZDo6b2ZzdHJlYW0mIGZfb3V0XzsKLSAgc3RyaW5nIHNlcnZpY2VfbmFtZV87Ci0gIHN0cmluZyBzdHlsZV87Ci0gIHN0cmluZyBwc3R5bGVfOwotICBzdHJpbmcgY2xhc3NfbmFtZV87Ci0gIHN0cmluZyBpZl9uYW1lXzsKLSAgc3RyaW5nIGZhY3RvcnlfY2xhc3NfbmFtZV87Ci0gIHN0cmluZyBmaW5pc2hfY29iXzsKLSAgc3RyaW5nIGZpbmlzaF9jb2JfZGVjbF87Ci0gIHN0cmluZyByZXRfdHlwZV87Ci0gIHN0cmluZyBjYWxsX2NvbnRleHRfOwotICBzdHJpbmcgY29iX2FyZ187Ci0gIHN0cmluZyBjYWxsX2NvbnRleHRfYXJnXzsKLSAgc3RyaW5nIGNhbGxfY29udGV4dF9kZWNsXzsKLSAgc3RyaW5nIHRlbXBsYXRlX2hlYWRlcl87Ci0gIHN0cmluZyB0ZW1wbGF0ZV9zdWZmaXhfOwotICBzdHJpbmcgdHlwZW5hbWVfc3RyXzsKLSAgc3RyaW5nIGNsYXNzX3N1ZmZpeF87Ci0gIHN0cmluZyBleHRlbmRzXzsKLX07Ci0KLVByb2Nlc3NvckdlbmVyYXRvcjo6UHJvY2Vzc29yR2VuZXJhdG9yKHRfY3BwX2dlbmVyYXRvciogZ2VuZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXJ2aWNlKiBzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBzdHlsZSkKLSAgOiBnZW5lcmF0b3JfKGdlbmVyYXRvciksCi0gICAgc2VydmljZV8oc2VydmljZSksCi0gICAgZl9oZWFkZXJfKGdlbmVyYXRvci0+Zl9oZWFkZXJfKSwKLSAgICBmX291dF8oZ2VuZXJhdG9yLT5nZW5fdGVtcGxhdGVzXyA/IGdlbmVyYXRvci0+Zl9zZXJ2aWNlX3RjY18gOiBnZW5lcmF0b3ItPmZfc2VydmljZV8pLAotICAgIHNlcnZpY2VfbmFtZV8oZ2VuZXJhdG9yLT5zZXJ2aWNlX25hbWVfKSwKLSAgICBzdHlsZV8oc3R5bGUpIHsKLSAgaWYgKHN0eWxlXyA9PSAiQ29iIikgewotICAgIHBzdHlsZV8gPSAiQXN5bmMiOwotICAgIGNsYXNzX25hbWVfID0gc2VydmljZV9uYW1lXyArIHBzdHlsZV8gKyAiUHJvY2Vzc29yIjsKLSAgICBpZl9uYW1lXyA9IHNlcnZpY2VfbmFtZV8gKyAiQ29iU3ZJZiI7Ci0KLSAgICBmaW5pc2hfY29iXyA9ICJ0Y3h4OjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiBjb2IsICI7Ci0gICAgZmluaXNoX2NvYl9kZWNsXyA9ICJ0Y3h4OjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiwgIjsKLSAgICBjb2JfYXJnXyA9ICJjb2IsICI7Ci0gICAgcmV0X3R5cGVfID0gInZvaWQgIjsKLSAgfSBlbHNlIHsKLSAgICBjbGFzc19uYW1lXyA9IHNlcnZpY2VfbmFtZV8gKyAiUHJvY2Vzc29yIjsKLSAgICBpZl9uYW1lXyA9IHNlcnZpY2VfbmFtZV8gKyAiSWYiOwotCi0gICAgcmV0X3R5cGVfID0gImJvb2wgIjsKLSAgICAvLyBUT0RPKGVkaGFsbCkgY2FsbENvbnRleHQgc2hvdWxkIGV2ZW50dWFsbHkgYmUgYWRkZWQgdG8gVEFzeW5jUHJvY2Vzc29yCi0gICAgY2FsbF9jb250ZXh0XyA9ICIsIHZvaWQqIGNhbGxDb250ZXh0IjsKLSAgICBjYWxsX2NvbnRleHRfYXJnXyA9ICIsIGNhbGxDb250ZXh0IjsKLSAgICBjYWxsX2NvbnRleHRfZGVjbF8gPSAiLCB2b2lkKiI7Ci0gIH0KLQotICBmYWN0b3J5X2NsYXNzX25hbWVfID0gY2xhc3NfbmFtZV8gKyAiRmFjdG9yeSI7Ci0KLSAgaWYgKGdlbmVyYXRvci0+Z2VuX3RlbXBsYXRlc18pIHsKLSAgICB0ZW1wbGF0ZV9oZWFkZXJfID0gInRlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+XG4iOwotICAgIHRlbXBsYXRlX3N1ZmZpeF8gPSAiPFByb3RvY29sXz4iOwotICAgIHR5cGVuYW1lX3N0cl8gPSAidHlwZW5hbWUgIjsKLSAgICBjbGFzc19uYW1lXyArPSAiVCI7Ci0gICAgZmFjdG9yeV9jbGFzc19uYW1lXyArPSAiVCI7Ci0gIH0KLQotICBpZiAoc2VydmljZV8tPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHNfID0gdHlwZV9uYW1lKHNlcnZpY2VfLT5nZXRfZXh0ZW5kcygpKSArIHBzdHlsZV8gKyAiUHJvY2Vzc29yIjsKLSAgICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc18pIHsKLSAgICAgIC8vIFRPRE8oc2ltcGtpbnMpOiBJZiBnZW5fdGVtcGxhdGVzXyBpcyBlbmFibGVkLCB3ZSBjdXJyZW50bHkgYXNzdW1lIGFsbAotICAgICAgLy8gcGFyZW50IHNlcnZpY2VzIHdlcmUgYWxzbyBnZW5lcmF0ZWQgd2l0aCB0ZW1wbGF0ZXMgZW5hYmxlZC4KLSAgICAgIGV4dGVuZHNfICs9ICJUPFByb3RvY29sXz4iOwotICAgIH0KLSAgfQotfQotCi12b2lkIFByb2Nlc3NvckdlbmVyYXRvcjo6Z2VuZXJhdGVfY2xhc3NfZGVmaW5pdGlvbigpIHsKLSAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSBzZXJ2aWNlXy0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgc3RyaW5nIHBhcmVudF9jbGFzczsKLSAgaWYgKHNlcnZpY2VfLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBwYXJlbnRfY2xhc3MgPSBleHRlbmRzXzsKLSAgfSBlbHNlIHsKLSAgICBpZiAoc3R5bGVfID09ICJDb2IiKSB7Ci0gICAgICBwYXJlbnRfY2xhc3MgPSAiOjphcGFjaGU6OnRocmlmdDo6YXN5bmM6OlRBc3luY0Rpc3BhdGNoUHJvY2Vzc29yIjsKLSAgICB9IGVsc2UgewotICAgICAgcGFyZW50X2NsYXNzID0gIjo6YXBhY2hlOjp0aHJpZnQ6OlREaXNwYXRjaFByb2Nlc3NvciI7Ci0gICAgfQotCi0gICAgaWYgKGdlbmVyYXRvcl8tPmdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgICBwYXJlbnRfY2xhc3MgKz0gIlQ8UHJvdG9jb2xfPiI7Ci0gICAgfQotICB9Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCi0gIGZfaGVhZGVyXyA8PCB0ZW1wbGF0ZV9oZWFkZXJfIDw8ICJjbGFzcyAiIDw8IGNsYXNzX25hbWVfIDw8ICIgOiBwdWJsaWMgIiA8PCBwYXJlbnRfY2xhc3MgPDwgIiB7IgotICAgICAgICAgICAgPDwgZW5kbDsKLQotICAvLyBQcm90ZWN0ZWQgZGF0YSBtZW1iZXJzCi0gIGZfaGVhZGVyXyA8PCAiIHByb3RlY3RlZDoiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgImJvb3N0OjpzaGFyZWRfcHRyPCIgPDwgaWZfbmFtZV8gPDwgIj4gaWZhY2VfOyIgPDwgZW5kbDsKLSAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ2aXJ0dWFsICIgPDwgcmV0X3R5cGVfIDw8ICJkaXNwYXRjaENhbGwoIiA8PCBmaW5pc2hfY29iXwotICAgICAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIGlwcm90LCAiCi0gICAgICAgICAgICA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogb3Byb3QsICIKLSAgICAgICAgICAgIDw8ICJjb25zdCBzdGQ6OnN0cmluZyYgZm5hbWUsIGludDMyX3Qgc2VxaWQiIDw8IGNhbGxfY29udGV4dF8gPDwgIik7IiA8PCBlbmRsOwotICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc18pIHsKLSAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInZpcnR1YWwgIiA8PCByZXRfdHlwZV8gPDwgImRpc3BhdGNoQ2FsbFRlbXBsYXRlZCgiIDw8IGZpbmlzaF9jb2JfCi0gICAgICAgICAgICAgIDw8ICJQcm90b2NvbF8qIGlwcm90LCBQcm90b2NvbF8qIG9wcm90LCAiCi0gICAgICAgICAgICAgIDw8ICJjb25zdCBzdGQ6OnN0cmluZyYgZm5hbWUsIGludDMyX3Qgc2VxaWQiIDw8IGNhbGxfY29udGV4dF8gPDwgIik7IiA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgLy8gUHJvY2VzcyBmdW5jdGlvbiBkZWNsYXJhdGlvbnMKLSAgZl9oZWFkZXJfIDw8ICIgcHJpdmF0ZToiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIC8vIERlY2xhcmUgcHJvY2Vzc01hcF8KLSAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ0eXBlZGVmICB2b2lkICgiIDw8IGNsYXNzX25hbWVfIDw8ICI6OioiCi0gICAgICAgICAgICA8PCAiUHJvY2Vzc0Z1bmN0aW9uKSgiIDw8IGZpbmlzaF9jb2JfZGVjbF8gPDwgImludDMyX3QsICIKLSAgICAgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiwgIgotICAgICAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIiA8PCBjYWxsX2NvbnRleHRfZGVjbF8gPDwgIik7IiA8PCBlbmRsOwotICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc18pIHsKLSAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInR5cGVkZWYgdm9pZCAoIiA8PCBjbGFzc19uYW1lXyA8PCAiOjoqIgotICAgICAgICAgICAgICA8PCAiU3BlY2lhbGl6ZWRQcm9jZXNzRnVuY3Rpb24pKCIgPDwgZmluaXNoX2NvYl9kZWNsXyA8PCAiaW50MzJfdCwgIgotICAgICAgICAgICAgICA8PCAiUHJvdG9jb2xfKiwgUHJvdG9jb2xfKiIgPDwgY2FsbF9jb250ZXh0X2RlY2xfIDw8ICIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICA8PCAic3RydWN0IFByb2Nlc3NGdW5jdGlvbnMgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBQcm9jZXNzRnVuY3Rpb24gZ2VuZXJpYzsiCi0gICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgU3BlY2lhbGl6ZWRQcm9jZXNzRnVuY3Rpb24gc3BlY2lhbGl6ZWQ7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgIDw8ICIgIFByb2Nlc3NGdW5jdGlvbnMoUHJvY2Vzc0Z1bmN0aW9uIGcsICIKLSAgICAgICAgICAgICAgPDwgIlNwZWNpYWxpemVkUHJvY2Vzc0Z1bmN0aW9uIHMpIDoiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgICBnZW5lcmljKGcpLCIgPDwgZW5kbAotICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAgIHNwZWNpYWxpemVkKHMpIHt9IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgIDw8ICIgIFByb2Nlc3NGdW5jdGlvbnMoKSA6IGdlbmVyaWMoTlVMTCksIHNwZWNpYWxpemVkKE5VTEwpICIKLSAgICAgICAgICAgICAgPDwgInt9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9OyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICA8PCAidHlwZWRlZiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgUHJvY2Vzc0Z1bmN0aW9ucz4gIgotICAgICAgICAgICAgICA8PCAiUHJvY2Vzc01hcDsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBQcm9jZXNzRnVuY3Rpb24+ICIKLSAgICAgICAgICAgICAgPDwgIlByb2Nlc3NNYXA7IiA8PCBlbmRsOwotICB9Ci0gIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiUHJvY2Vzc01hcCBwcm9jZXNzTWFwXzsiIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCAidm9pZCBwcm9jZXNzXyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCBmaW5pc2hfY29iXwotICAgICAgICAgICAgICAgICAgICAgIDw8ICJpbnQzMl90IHNlcWlkLCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBpcHJvdCwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBvcHJvdCIgPDwgY2FsbF9jb250ZXh0XyA8PCAiKTsiCi0gICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc18pIHsKLSAgICAgIGluZGVudChmX2hlYWRlcl8pIDw8ICJ2b2lkIHByb2Nlc3NfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIigiIDw8IGZpbmlzaF9jb2JfCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCAiaW50MzJfdCBzZXFpZCwgUHJvdG9jb2xfKiBpcHJvdCwgUHJvdG9jb2xfKiBvcHJvdCIgPDwgY2FsbF9jb250ZXh0XwotICAgICAgICAgICAgICAgICAgICAgICAgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpZiAoc3R5bGVfID09ICJDb2IiKSB7Ci0gICAgICAvLyBYWFggRmFjdG9yIHRoaXMgb3V0LCBldmVuIGlmIGl0IGlzIGEgcGFpbi4KLSAgICAgIHN0cmluZyByZXRfYXJnID0gKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAiIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIiwgY29uc3QgIiArIHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpICsgIiYgX3JldHVybiIpOwotICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ2b2lkIHJldHVybl8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgIDw8ICIodGN4eDo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gY29iLCBpbnQzMl90IHNlcWlkLCAiCi0gICAgICAgICAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIG9wcm90LCAiCi0gICAgICAgICAgICAgICAgPDwgInZvaWQqIGN0eCIgPDwgcmV0X2FyZyA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc18pIHsKLSAgICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ2b2lkIHJldHVybl8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgICAgPDwgIih0Y3h4OjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiBjb2IsIGludDMyX3Qgc2VxaWQsICIKLSAgICAgICAgICAgICAgICAgIDw8ICJQcm90b2NvbF8qIG9wcm90LCB2b2lkKiBjdHgiIDw8IHJldF9hcmcgPDwgIik7IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgLy8gWFhYIERvbid0IGRlY2xhcmUgdGhyb3cgaWYgaXQgZG9lc24ndCBleGlzdAotICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ2b2lkIHRocm93XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgPDwgIih0Y3h4OjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiBjb2IsIGludDMyX3Qgc2VxaWQsICIKLSAgICAgICAgICAgICAgICA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogb3Byb3QsIHZvaWQqIGN0eCwgIgotICAgICAgICAgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0OjpURGVsYXllZEV4Y2VwdGlvbiogX3Rocm93KTsiIDw8IGVuZGw7Ci0gICAgICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc18pIHsKLSAgICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ2b2lkIHRocm93XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgICA8PCAiKHRjeHg6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+IGNvYiwgaW50MzJfdCBzZXFpZCwgIgotICAgICAgICAgICAgICAgICAgPDwgIlByb3RvY29sXyogb3Byb3QsIHZvaWQqIGN0eCwgIgotICAgICAgICAgICAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OlREZWxheWVkRXhjZXB0aW9uKiBfdGhyb3cpOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmX2hlYWRlcl8gPDwgIiBwdWJsaWM6IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IGNsYXNzX25hbWVfIDw8ICIoYm9vc3Q6OnNoYXJlZF9wdHI8IiA8PCBpZl9uYW1lXwotICAgICAgICAgICAgPDwgIj4gaWZhY2UpIDoiIDw8IGVuZGw7Ci0gIGlmICghZXh0ZW5kc18uZW1wdHkoKSkgewotICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiICAiIDw8IGV4dGVuZHNfIDw8ICIoaWZhY2UpLCIgPDwgZW5kbDsKLSAgfQotICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIiAgaWZhY2VfKGlmYWNlKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAicHJvY2Vzc01hcF9bXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdID0gIjsKLSAgICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc18pIHsKLSAgICAgIGZfaGVhZGVyXyA8PCAiUHJvY2Vzc0Z1bmN0aW9ucygiIDw8IGVuZGw7Ci0gICAgICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc19vbmx5XykgewotICAgICAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCAiICBOVUxMLCIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGluZGVudChmX2hlYWRlcl8pIDw8ICIgICYiIDw8IGNsYXNzX25hbWVfIDw8ICI6OnByb2Nlc3NfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCAiICAmIiA8PCBjbGFzc19uYW1lXyA8PCAiOjpwcm9jZXNzXyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIjsKLSAgICB9IGVsc2UgewotICAgICAgZl9oZWFkZXJfIDw8ICImIiA8PCBjbGFzc19uYW1lXyA8PCAiOjpwcm9jZXNzXyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgICBmX2hlYWRlcl8gPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidmlydHVhbCB+IiA8PCBjbGFzc19uYW1lXyA8PCAiKCkge30iCi0gICAgICAgICAgICA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBmX2hlYWRlcl8gPDwgIn07IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaWYgKGdlbmVyYXRvcl8tPmdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgLy8gR2VuZXJhdGUgYSBiYWNrd2FyZHMgY29tcGF0aWJsZSB0eXBlZGVmLCBmb3IgY2FsbGVycyB3aG8gZG9uJ3Qga25vdwotICAgIC8vIGFib3V0IHRoZSBuZXcgdGVtcGxhdGUtc3R5bGUgY29kZS4KLSAgICAvLwotICAgIC8vIFdlIGNhbid0IHVzZSBUUHJvdG9jb2wgYXMgdGhlIHRlbXBsYXRlIHBhcmFtZXRlciwgc2luY2UgUHJvY2Vzc29yVAotICAgIC8vIHByb3ZpZGVzIG92ZXJsb2FkZWQgdmVyc2lvbnMgb2YgbW9zdCBtZXRob2RzLCBvbmUgb2Ygd2hpY2ggYWNjZXB0cwotICAgIC8vIFRQcm90b2NvbCBwb2ludGVycywgYW5kIG9uZSB3aGljaCBhY2NlcHRzIFByb3RvY29sXyBwb2ludGVycy4gIFRoaXMKLSAgICAvLyByZXN1bHRzIGluIGEgY29tcGlsZSBlcnJvciBpZiBpbnN0YW50aWF0ZWQgd2l0aCBQcm90b2NvbF8gPT0gVFByb3RvY29sLgotICAgIC8vIFRoZXJlZm9yZSwgd2UgZGVmaW5lIFREdW1teVByb3RvY29sIHNvbGVseSBzbyB3ZSBjYW4gdXNlIGl0IGFzIHRoZQotICAgIC8vIHRlbXBsYXRlIHBhcmFtZXRlciBoZXJlLgotICAgIGZfaGVhZGVyXyA8PCAidHlwZWRlZiAiIDw8IGNsYXNzX25hbWVfIDw8ICI8IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpURHVtbXlQcm90b2NvbCA+ICIKLSAgICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lXyA8PCBwc3R5bGVfIDw8ICJQcm9jZXNzb3I7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLX0KLQotdm9pZCBQcm9jZXNzb3JHZW5lcmF0b3I6OmdlbmVyYXRlX2Rpc3BhdGNoX2NhbGwoYm9vbCB0ZW1wbGF0ZV9wcm90b2NvbCkgewotICBzdHJpbmcgcHJvdG9jb2wgPSAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCI7Ci0gIHN0cmluZyBmdW5jdGlvbl9zdWZmaXg7Ci0gIGlmICh0ZW1wbGF0ZV9wcm90b2NvbCkgewotICAgIHByb3RvY29sID0gIlByb3RvY29sXyI7Ci0gICAgLy8gV2UgY2FsbCB0aGUgZ2VuZXJpYyB2ZXJzaW9uIGRpc3BhdGNoQ2FsbCgpLCBhbmQgdGhlIHNwZWNpYWxpemVkCi0gICAgLy8gdmVyc2lvbiBkaXNwYXRjaENhbGxUZW1wbGF0ZWQoKS4gIFdlIGNhbid0IGNhbGwgdGhlbSBib3RoCi0gICAgLy8gZGlzcGF0Y2hDYWxsKCksIHNpbmNlIHRoaXMgd2lsbCBjYXVzZSB0aGUgY29tcGlsZXIgdG8gaXNzdWUgYSB3YXJuaW5nIGlmCi0gICAgLy8gYSBzZXJ2aWNlIHRoYXQgZG9lc24ndCB1c2UgdGVtcGxhdGVzIGluaGVyaXRzIGZyb20gYSBzZXJ2aWNlIHRoYXQgZG9lcwotICAgIC8vIHVzZSB0ZW1wbGF0ZXM6IHRoZSBjb21waWxlciBjb21wbGFpbnMgdGhhdCB0aGUgc3ViY2xhc3Mgb25seSBpbXBsZW1lbnRzCi0gICAgLy8gdGhlIGdlbmVyaWMgdmVyc2lvbiBvZiBkaXNwYXRjaENhbGwoKSwgYW5kIGhpZGVzIHRoZSB0ZW1wbGF0ZWQgdmVyc2lvbi4KLSAgICAvLyBVc2luZyBkaWZmZXJlbnQgbmFtZXMgZm9yIHRoZSB0d28gZnVuY3Rpb25zIHByZXZlbnRzIHRoaXMuCi0gICAgZnVuY3Rpb25fc3VmZml4ID0gIlRlbXBsYXRlZCI7Ci0gIH0KLQotICBmX291dF8gPDwgdGVtcGxhdGVfaGVhZGVyXyA8PCByZXRfdHlwZV8gPDwgY2xhc3NfbmFtZV8gPDwgdGVtcGxhdGVfc3VmZml4XyA8PCAiOjpkaXNwYXRjaENhbGwiCi0gICAgICAgICA8PCBmdW5jdGlvbl9zdWZmaXggPDwgIigiIDw8IGZpbmlzaF9jb2JfIDw8IHByb3RvY29sIDw8ICIqIGlwcm90LCAiIDw8IHByb3RvY29sCi0gICAgICAgICA8PCAiKiBvcHJvdCwgIgotICAgICAgICAgPDwgImNvbnN0IHN0ZDo6c3RyaW5nJiBmbmFtZSwgaW50MzJfdCBzZXFpZCIgPDwgY2FsbF9jb250ZXh0XyA8PCAiKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICAvLyBIT1Q6IG1lbWJlciBmdW5jdGlvbiBwb2ludGVyIG1hcAotICBmX291dF8gPDwgaW5kZW50KCkgPDwgdHlwZW5hbWVfc3RyXyA8PCAiUHJvY2Vzc01hcDo6aXRlcmF0b3IgcGZuOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgPDwgInBmbiA9IHByb2Nlc3NNYXBfLmZpbmQoZm5hbWUpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgPDwgImlmIChwZm4gPT0gcHJvY2Vzc01hcF8uZW5kKCkpIHsiIDw8IGVuZGw7Ci0gIGlmIChleHRlbmRzXy5lbXB0eSgpKSB7Ci0gICAgZl9vdXRfIDw8IGluZGVudCgpIDw8ICIgIGlwcm90LT5za2lwKDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUUlVDVCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgIDw8ICIgIGlwcm90LT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICA8PCAiICBpcHJvdC0+Z2V0VHJhbnNwb3J0KCktPnJlYWRFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgPDwgIiAgOjphcGFjaGU6OnRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uICIKLSAgICAgICAgICAgICAgIngoOjphcGFjaGU6OnRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpVTktOT1dOX01FVEhPRCwgXCJJbnZhbGlkIG1ldGhvZCBuYW1lOiAiCi0gICAgICAgICAgICAgICInXCIrZm5hbWUrXCInXCIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICA8PCAiICBvcHJvdC0+d3JpdGVNZXNzYWdlQmVnaW4oZm5hbWUsIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0VYQ0VQVElPTiwgc2VxaWQpOyIKLSAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICB4LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgPDwgIiAgb3Byb3QtPndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICA8PCAiICBvcHJvdC0+Z2V0VHJhbnNwb3J0KCktPndyaXRlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgIDw8ICIgIG9wcm90LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgPDwgKHN0eWxlXyA9PSAiQ29iIiA/ICIgIHJldHVybiBjb2IodHJ1ZSk7IiA6ICIgIHJldHVybiB0cnVlOyIpIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgZl9vdXRfIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGV4dGVuZHNfIDw8ICI6OmRpc3BhdGNoQ2FsbCgiCi0gICAgICAgICAgIDw8IChzdHlsZV8gPT0gIkNvYiIgPyAiY29iLCAiIDogIiIpIDw8ICJpcHJvdCwgb3Byb3QsIGZuYW1lLCBzZXFpZCIgPDwgY2FsbF9jb250ZXh0X2FyZ18KLSAgICAgICAgICAgPDwgIik7IiA8PCBlbmRsOwotICB9Ci0gIGZfb3V0XyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgaWYgKHRlbXBsYXRlX3Byb3RvY29sKSB7Ci0gICAgZl9vdXRfIDw8IGluZGVudCgpIDw8ICIodGhpcy0+KihwZm4tPnNlY29uZC5zcGVjaWFsaXplZCkpIjsKLSAgfSBlbHNlIHsKLSAgICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc19vbmx5XykgewotICAgICAgLy8gVE9ETzogVGhpcyBpcyBhIG51bGwgcG9pbnRlciwgc28gbm90aGluZyBnb29kIHdpbGwgY29tZSBmcm9tIGNhbGxpbmcKLSAgICAgIC8vIGl0LiAgVGhyb3cgYW4gZXhjZXB0aW9uIGluc3RlYWQuCi0gICAgICBmX291dF8gPDwgaW5kZW50KCkgPDwgIih0aGlzLT4qKHBmbi0+c2Vjb25kLmdlbmVyaWMpKSI7Ci0gICAgfSBlbHNlIGlmIChnZW5lcmF0b3JfLT5nZW5fdGVtcGxhdGVzXykgewotICAgICAgZl9vdXRfIDw8IGluZGVudCgpIDw8ICIodGhpcy0+KihwZm4tPnNlY29uZC5nZW5lcmljKSkiOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX291dF8gPDwgaW5kZW50KCkgPDwgIih0aGlzLT4qKHBmbi0+c2Vjb25kKSkiOwotICAgIH0KLSAgfQotICBmX291dF8gPDwgIigiIDw8IGNvYl9hcmdfIDw8ICJzZXFpZCwgaXByb3QsIG9wcm90IiA8PCBjYWxsX2NvbnRleHRfYXJnXyA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgLy8gVE9ETyhkcmVpc3MpOiByZXR1cm4gcGZuIHJldD8KLSAgaWYgKHN0eWxlXyA9PSAiQ29iIikgewotICAgIGZfb3V0XyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBmX291dF8gPDwgaW5kZW50KCkgPDwgInJldHVybiB0cnVlOyIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfb3V0XyA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIFByb2Nlc3NvckdlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbnMoKSB7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gc2VydmljZV8tPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChnZW5lcmF0b3JfLT5nZW5fdGVtcGxhdGVzXykgewotICAgICAgZ2VuZXJhdG9yXy0+Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbihzZXJ2aWNlXywgKmZfaXRlciwgc3R5bGVfLCBmYWxzZSk7Ci0gICAgICBnZW5lcmF0b3JfLT5nZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHNlcnZpY2VfLCAqZl9pdGVyLCBzdHlsZV8sIHRydWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICBnZW5lcmF0b3JfLT5nZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHNlcnZpY2VfLCAqZl9pdGVyLCBzdHlsZV8sIGZhbHNlKTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBQcm9jZXNzb3JHZW5lcmF0b3I6OmdlbmVyYXRlX2ZhY3RvcnkoKSB7Ci0gIHN0cmluZyBpZl9mYWN0b3J5X25hbWUgPSBpZl9uYW1lXyArICJGYWN0b3J5IjsKLQotICAvLyBHZW5lcmF0ZSB0aGUgZmFjdG9yeSBjbGFzcyBkZWZpbml0aW9uCi0gIGZfaGVhZGVyXyA8PCB0ZW1wbGF0ZV9oZWFkZXJfIDw8ICJjbGFzcyAiIDw8IGZhY3RvcnlfY2xhc3NfbmFtZV8gPDwgIiA6IHB1YmxpYyA6OmFwYWNoZTo6dGhyaWZ0OjoiCi0gICAgICAgICAgICA8PCAoc3R5bGVfID09ICJDb2IiID8gImFzeW5jOjpUQXN5bmNQcm9jZXNzb3JGYWN0b3J5IiA6ICJUUHJvY2Vzc29yRmFjdG9yeSIpIDw8ICIgeyIKLSAgICAgICAgICAgIDw8IGVuZGwgPDwgIiBwdWJsaWM6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgZmFjdG9yeV9jbGFzc19uYW1lXyA8PCAiKGNvbnN0IDo6Ym9vc3Q6OnNoYXJlZF9wdHI8ICIgPDwgaWZfZmFjdG9yeV9uYW1lCi0gICAgICAgICAgICA8PCAiID4mIGhhbmRsZXJGYWN0b3J5KSA6IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICA8PCAiICAgIGhhbmRsZXJGYWN0b3J5XyhoYW5kbGVyRmFjdG9yeSkge30iIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgPDwgIjo6Ym9vc3Q6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OiIKLSAgICAgICAgICAgIDw8IChzdHlsZV8gPT0gIkNvYiIgPyAiYXN5bmM6OlRBc3luY1Byb2Nlc3NvciIgOiAiVFByb2Nlc3NvciIpIDw8ICIgPiAiCi0gICAgICAgICAgICA8PCAiZ2V0UHJvY2Vzc29yKGNvbnN0IDo6YXBhY2hlOjp0aHJpZnQ6OlRDb25uZWN0aW9uSW5mbyYgY29ubkluZm8pOyIgPDwgZW5kbDsKLQotICBmX2hlYWRlcl8gPDwgZW5kbCA8PCAiIHByb3RlY3RlZDoiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIjo6Ym9vc3Q6OnNoYXJlZF9wdHI8ICIKLSAgICAgICAgICAgIDw8IGlmX2ZhY3RvcnlfbmFtZSA8PCAiID4gaGFuZGxlckZhY3RvcnlfOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBmX2hlYWRlcl8gPDwgIn07IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gSWYgd2UgYXJlIGdlbmVyYXRpbmcgdGVtcGxhdGVzLCBvdXRwdXQgYSB0eXBlZGVmIGZvciB0aGUgcGxhaW4KLSAgLy8gZmFjdG9yeSBuYW1lLgotICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc18pIHsKLSAgICBmX2hlYWRlcl8gPDwgInR5cGVkZWYgIiA8PCBmYWN0b3J5X2NsYXNzX25hbWVfCi0gICAgICAgICAgICAgIDw8ICI8IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpURHVtbXlQcm90b2NvbCA+ICIgPDwgc2VydmljZV9uYW1lXyA8PCBwc3R5bGVfCi0gICAgICAgICAgICAgIDw8ICJQcm9jZXNzb3JGYWN0b3J5OyIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGdldFByb2Nlc3NvcigpIG1ldGhvZAotICBmX291dF8gPDwgdGVtcGxhdGVfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiOjpib29zdDo6c2hhcmVkX3B0cjwgOjphcGFjaGU6OnRocmlmdDo6IgotICAgICAgICAgPDwgKHN0eWxlXyA9PSAiQ29iIiA/ICJhc3luYzo6VEFzeW5jUHJvY2Vzc29yIiA6ICJUUHJvY2Vzc29yIikgPDwgIiA+ICIKLSAgICAgICAgIDw8IGZhY3RvcnlfY2xhc3NfbmFtZV8gPDwgdGVtcGxhdGVfc3VmZml4XyA8PCAiOjpnZXRQcm9jZXNzb3IoIgotICAgICAgICAgPDwgImNvbnN0IDo6YXBhY2hlOjp0aHJpZnQ6OlRDb25uZWN0aW9uSW5mbyYgY29ubkluZm8pIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZfb3V0XyA8PCBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6UmVsZWFzZUhhbmRsZXI8ICIgPDwgaWZfZmFjdG9yeV9uYW1lCi0gICAgICAgICA8PCAiID4gY2xlYW51cChoYW5kbGVyRmFjdG9yeV8pOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiOjpib29zdDo6c2hhcmVkX3B0cjwgIgotICAgICAgICAgPDwgaWZfbmFtZV8gPDwgIiA+IGhhbmRsZXIoIgotICAgICAgICAgPDwgImhhbmRsZXJGYWN0b3J5Xy0+Z2V0SGFuZGxlcihjb25uSW5mbyksIGNsZWFudXApOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgPDwgIjo6Ym9vc3Q6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OiIKLSAgICAgICAgIDw8IChzdHlsZV8gPT0gIkNvYiIgPyAiYXN5bmM6OlRBc3luY1Byb2Nlc3NvciIgOiAiVFByb2Nlc3NvciIpIDw8ICIgPiAiCi0gICAgICAgICA8PCAicHJvY2Vzc29yKG5ldyAiIDw8IGNsYXNzX25hbWVfIDw8IHRlbXBsYXRlX3N1ZmZpeF8gPDwgIihoYW5kbGVyKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICA8PCAicmV0dXJuIHByb2Nlc3NvcjsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9vdXRfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBwcm9jZXNzb3IgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBwcm9jZXNzb3IgZm9yLgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodF9zZXJ2aWNlKiB0c2VydmljZSwgc3RyaW5nIHN0eWxlKSB7Ci0gIFByb2Nlc3NvckdlbmVyYXRvciBnZW5lcmF0b3IodGhpcywgdHNlcnZpY2UsIHN0eWxlKTsKLSAgZ2VuZXJhdG9yLnJ1bigpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdGQ6Om9mc3RyZWFtJiBvdXQgPSAoZ2VuX3RlbXBsYXRlc18gPyBmX3NlcnZpY2VfdGNjXyA6IGZfc2VydmljZV8pOwotCi0gIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOwotICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOwotICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7Ci0gIH0KLQotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOwotICB9Ci0KLSAgZ2VuZXJhdGVfc3RydWN0X2RlY2xhcmF0aW9uKGZfaGVhZGVyXywgJnJlc3VsdCwgZmFsc2UpOwotICBnZW5lcmF0ZV9zdHJ1Y3RfZGVmaW5pdGlvbihvdXQsIGZfc2VydmljZV8sICZyZXN1bHQsIGZhbHNlKTsKLSAgZ2VuZXJhdGVfc3RydWN0X3JlYWRlcihvdXQsICZyZXN1bHQpOwotICBnZW5lcmF0ZV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvdXQsICZyZXN1bHQpOwotCi0gIHJlc3VsdC5zZXRfbmFtZSh0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcHJlc3VsdCIpOwotICBnZW5lcmF0ZV9zdHJ1Y3RfZGVjbGFyYXRpb24oZl9oZWFkZXJfLCAmcmVzdWx0LCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgZ2VuX2NvYl9zdHlsZV8pOwotICBnZW5lcmF0ZV9zdHJ1Y3RfZGVmaW5pdGlvbihvdXQsIGZfc2VydmljZV8sICZyZXN1bHQsIGZhbHNlKTsKLSAgZ2VuZXJhdGVfc3RydWN0X3JlYWRlcihvdXQsICZyZXN1bHQsIHRydWUpOwotICBpZiAoZ2VuX2NvYl9zdHlsZV8pIHsKLSAgICBnZW5lcmF0ZV9zdHJ1Y3Rfd3JpdGVyKG91dCwgJnJlc3VsdCwgdHJ1ZSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBwcm9jZXNzIGZ1bmN0aW9uIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgYSBkaXNwYXRjaGVyIGZvcgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHN0eWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzcGVjaWFsaXplZCkgewotICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgc3RyaW5nIHNlcnZpY2VfZnVuY19uYW1lID0gIlwiIiArIHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIi4iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIlwiIjsKLQotICBzdGQ6Om9mc3RyZWFtJiBvdXQgPSAoZ2VuX3RlbXBsYXRlc18gPyBmX3NlcnZpY2VfdGNjXyA6IGZfc2VydmljZV8pOwotCi0gIHN0cmluZyBwcm90X3R5cGUgPSAoc3BlY2lhbGl6ZWQgPyAiUHJvdG9jb2xfIiA6ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sIik7Ci0gIHN0cmluZyBjbGFzc19zdWZmaXg7Ci0gIGlmIChnZW5fdGVtcGxhdGVzXykgewotICAgIGNsYXNzX3N1ZmZpeCA9ICJUPFByb3RvY29sXz4iOwotICB9Ci0KLSAgLy8gSSB0cmllZCB0byBkbyB0aGlzIGFzIG9uZSBmdW5jdGlvbi4gIEkgcmVhbGx5IGRpZC4gIEJ1dCBpdCB3YXMgdG9vIGhhcmQuCi0gIGlmIChzdHlsZSAhPSAiQ29iIikgewotICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4iIDw8IGVuZGw7Ci0gICAgfQotICAgIGNvbnN0IGJvb2wgdW5uYW1lZF9vcHJvdF9zZXFpZCA9IHRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIShnZW5fdGVtcGxhdGVzXyAmJiAhc3BlY2lhbGl6ZWQpOwotICAgIG91dCA8PCAidm9pZCAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJQcm9jZXNzb3IiIDw8IGNsYXNzX3N1ZmZpeCA8PCAiOjoiCi0gICAgICAgIDw8ICJwcm9jZXNzXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIgotICAgICAgICA8PCAiaW50MzJfdCIgPDwgKHVubmFtZWRfb3Byb3Rfc2VxaWQgPyAiLCAiIDogIiBzZXFpZCwgIikgPDwgcHJvdF90eXBlIDw8ICIqIGlwcm90LCAiCi0gICAgICAgIDw8IHByb3RfdHlwZSA8PCAiKiIgPDwgKHVubmFtZWRfb3Byb3Rfc2VxaWQgPyAiLCAiIDogIiBvcHJvdCwgIikgPDwgInZvaWQqIGNhbGxDb250ZXh0KSIKLSAgICAgICAgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotCi0gICAgc3RyaW5nIGFyZ3NuYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiOwotICAgIHN0cmluZyByZXN1bHRuYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7Ci0KLSAgICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdW5uYW1lZF9vcHJvdF9zZXFpZCkgewotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIodm9pZCkgc2VxaWQ7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIodm9pZCkgb3Byb3Q7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidm9pZCogY3R4ID0gTlVMTDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgPDwgIiAgY3R4ID0gdGhpcy0+ZXZlbnRIYW5kbGVyXy0+Z2V0Q29udGV4dCgiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIsIGNhbGxDb250ZXh0KTsiCi0gICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3JDb250ZXh0RnJlZXIgZnJlZXIoIgotICAgICAgICA8PCAidGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSwgY3R4LCAiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIpOyIgPDwgZW5kbCA8PCBlbmRsCi0gICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgIDw8ICIgIHRoaXMtPmV2ZW50SGFuZGxlcl8tPnByZVJlYWQoY3R4LCAiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICA8PCAifSIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpIDw8IGFyZ3NuYW1lIDw8ICIgYXJnczsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgPDwgImFyZ3MucmVhZChpcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpcHJvdC0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgPDwgInVpbnQzMl90IGJ5dGVzID0gaXByb3QtPmdldFRyYW5zcG9ydCgpLT5yZWFkRW5kKCk7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgPDwgIiAgdGhpcy0+ZXZlbnRIYW5kbGVyXy0+cG9zdFJlYWQoY3R4LCAiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIsIGJ5dGVzKTsiIDw8IGVuZGwKLSAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIC8vIERlY2xhcmUgcmVzdWx0Ci0gICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgcmVzdWx0bmFtZSA8PCAiIHJlc3VsdDsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gVHJ5IGJsb2NrIGZvciBmdW5jdGlvbnMgd2l0aCBleGNlcHRpb25zCi0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0cnkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCi0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgb3V0IDw8IGluZGVudCgpOwotICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgIGlmIChpc19jb21wbGV4X3R5cGUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICBvdXQgPDwgImlmYWNlXy0+IiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIihyZXN1bHQuc3VjY2VzcyI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgInJlc3VsdC5zdWNjZXNzID0gaWZhY2VfLT4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCAiaWZhY2VfLT4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7Ci0gICAgfQotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCAiLCAiOwotICAgICAgfQotICAgICAgb3V0IDw8ICJhcmdzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgICBvdXQgPDwgIik7IiA8PCBlbmRsOwotCi0gICAgLy8gU2V0IGlzc2V0IG9uIHN1Y2Nlc3MgZmllbGQKLSAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJlc3VsdC5fX2lzc2V0LnN1Y2Nlc3MgPSB0cnVlOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSI7Ci0KLSAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICAgIG91dCA8PCAiIGNhdGNoICgiIDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCkpIDw8ICIgJiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJlc3VsdC5fX2lzc2V0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSB0cnVlOyIKLSAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgb3V0IDw8ICJ9IjsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgb3V0IDw8ICIgY2F0Y2ggKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uJiBlKSB7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwgIiBjYXRjaCAoY29uc3Qgc3RkOjpleGNlcHRpb24mKSB7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGluZGVudF91cCgpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICA8PCAiICB0aGlzLT5ldmVudEhhbmRsZXJfLT5oYW5kbGVyRXJyb3IoY3R4LCAiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIpOyIgPDwgZW5kbAotICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLQotICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4KGUud2hhdCgpKTsiIDw8IGVuZGwKLSAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3QtPndyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKLSAgICAgICAgICA8PCAiXCIsIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0VYQ0VQVElPTiwgc2VxaWQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgIDw8ICJ4LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwKLSAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3QtPmdldFRyYW5zcG9ydCgpLT53cml0ZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgIDw8ICJvcHJvdC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsOwotICAgIH0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIC8vIFNob3J0Y3V0IG91dCBoZXJlIGZvciBvbmV3YXkgZnVuY3Rpb25zCi0gICAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgIDw8ICIgIHRoaXMtPmV2ZW50SGFuZGxlcl8tPmFzeW5jQ29tcGxldGUoY3R4LCAiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIpOyIgPDwgZW5kbAotICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgb3V0IDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gU2VyaWFsaXplIHRoZSByZXN1bHQgaW50byBhIHN0cnVjdAotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICA8PCAiICB0aGlzLT5ldmVudEhhbmRsZXJfLT5wcmVXcml0ZShjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIik7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LT53cml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCi0gICAgICAgIDw8ICJcIiwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfUkVQTFksIHNlcWlkKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgPDwgInJlc3VsdC53cml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC0+d3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsCi0gICAgICAgIDw8IGluZGVudCgpIDw8ICJieXRlcyA9IG9wcm90LT5nZXRUcmFuc3BvcnQoKS0+d3JpdGVFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgPDwgIm9wcm90LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICA8PCAiICB0aGlzLT5ldmVudEhhbmRsZXJfLT5wb3N0V3JpdGUoY3R4LCAiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIsIGJ5dGVzKTsiIDw8IGVuZGwKLSAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgICAvLyBDbG9zZSBmdW5jdGlvbgotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgICBvdXQgPDwgZW5kbDsKLSAgfQotCi0gIC8vIENvYiBzdHlsZS4KLSAgZWxzZSB7Ci0gICAgLy8gUHJvY2Vzc29yIGVudHJ5IHBvaW50LgotICAgIC8vIFRPRE8oZWRoYWxsKSB1cGRhdGUgZm9yIGNhbGxDb250ZXh0IHdoZW4gVEV2ZW50U2VydmVyIGlzIHJlYWR5Ci0gICAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+IiA8PCBlbmRsOwotICAgIH0KLSAgICBvdXQgPDwgInZvaWQgIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiQXN5bmNQcm9jZXNzb3IiIDw8IGNsYXNzX3N1ZmZpeCA8PCAiOjpwcm9jZXNzXyIKLSAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIodGN4eDo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gY29iLCBpbnQzMl90IHNlcWlkLCAiCi0gICAgICAgIDw8IHByb3RfdHlwZSA8PCAiKiBpcHJvdCwgIiA8PCBwcm90X3R5cGUgPDwgIiogb3Byb3QpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0KLSAgICAvLyBUT0RPKHNpbXBraW5zKTogd2UgY291bGQgdHJ5IHRvIGNvbnNvbGRhdGUgdGhpcwotICAgIC8vIHdpdGggdGhlIG5vbi1jb2IgY29kZSBhYm92ZQotICAgIGlmIChnZW5fdGVtcGxhdGVzXyAmJiAhc3BlY2lhbGl6ZWQpIHsKLSAgICAgIC8vIElmIHRoZXNlIGFyZSBpbnN0YW5jZXMgb2YgUHJvdG9jb2xfLCBpbnN0ZWFkIG9mIGFueSBvbGQgVFByb3RvY29sLAotICAgICAgLy8gdXNlIHRoZSBzcGVjaWFsaXplZCBwcm9jZXNzIGZ1bmN0aW9uIGluc3RlYWQuCi0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlByb3RvY29sXyogX2lwcm90ID0gZHluYW1pY19jYXN0PFByb3RvY29sXyo+KGlwcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICA8PCAiUHJvdG9jb2xfKiBfb3Byb3QgPSBkeW5hbWljX2Nhc3Q8UHJvdG9jb2xfKj4ob3Byb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgIDw8ICJpZiAoX2lwcm90ICYmIF9vcHJvdCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gcHJvY2Vzc18iCi0gICAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoY29iLCBzZXFpZCwgX2lwcm90LCBfb3Byb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIKLSAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJUX0dFTkVSSUNfUFJPVE9DT0wodGhpcywgaXByb3QsIF9pcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgPDwgIlRfR0VORVJJQ19QUk9UT0NPTCh0aGlzLCBvcHJvdCwgX29wcm90KTsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIodm9pZCkgc2VxaWQ7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIodm9pZCkgb3Byb3Q7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiX2FyZ3MgYXJnczsiIDw8IGVuZGwKLSAgICAgICAgPDwgaW5kZW50KCkgPDwgInZvaWQqIGN0eCA9IE5VTEw7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgIDw8ICIgIGN0eCA9IHRoaXMtPmV2ZW50SGFuZGxlcl8tPmdldENvbnRleHQoIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiLCBOVUxMKTsiIDw8IGVuZGwKLSAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3JDb250ZXh0RnJlZXIgZnJlZXIoIgotICAgICAgICA8PCAidGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSwgY3R4LCAiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIpOyIgPDwgZW5kbCA8PCBlbmRsCi0gICAgICAgIDw8IGluZGVudCgpIDw8ICJ0cnkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgPDwgIiAgdGhpcy0+ZXZlbnRIYW5kbGVyXy0+cHJlUmVhZChjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIik7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJhcmdzLnJlYWQoaXByb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICA8PCAiaXByb3QtPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgIDw8ICJ1aW50MzJfdCBieXRlcyA9IGlwcm90LT5nZXRUcmFuc3BvcnQoKS0+cmVhZEVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICA8PCAiICB0aGlzLT5ldmVudEhhbmRsZXJfLT5wb3N0UmVhZChjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIiwgYnl0ZXMpOyIgPDwgZW5kbAotICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0KLSAgICAvLyBUT0RPKGRyZWlzcyk6IEhhbmRsZSBURXhjZXB0aW9ucz8gIEV4cG9zZSB0byBzZXJ2ZXI/Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJjYXRjaCAoY29uc3Qgc3RkOjpleGNlcHRpb24mKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgIDw8ICIgIGlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgPDwgIiAgICB0aGlzLT5ldmVudEhhbmRsZXJfLT5oYW5kbGVyRXJyb3IoY3R4LCAiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIpOyIgPDwgZW5kbAotICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBjb2IoZmFsc2UpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICA8PCAifSIgPDwgZW5kbDsKLQotICAgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICA8PCAiICB0aGlzLT5ldmVudEhhbmRsZXJfLT5hc3luY0NvbXBsZXRlKGN0eCwgIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiKTsiIDw8IGVuZGwKLSAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgLy8gVE9ETyhkcmVpc3MpOiBGaWd1cmUgb3V0IGEgc3RyYXRlZ3kgZm9yIGV4Y2VwdGlvbnMgaW4gYXN5bmMgaGFuZGxlcnMuCi0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJmcmVlci51bnJlZ2lzdGVyKCk7IiA8PCBlbmRsOwotICAgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICAvLyBObyByZXR1cm4uICBKdXN0IGhhbmQgb2ZmIG91ciBjb2IuCi0gICAgICAvLyBUT0RPKGRyZWlzcyk6IENhbGwgdGhlIGNvYiBpbW1lZGlhdGVseT8KLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWZhY2VfLT4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCIKLSAgICAgICAgICA8PCAidGN4eDo6YmluZChjb2IsIHRydWUpIiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9IGVsc2UgewotICAgICAgc3RyaW5nIHJldF9hcmcsIHJldF9wbGFjZWhvbGRlcjsKLSAgICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgcmV0X2FyZyA9ICIsIGNvbnN0ICIgKyB0eXBlX25hbWUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSArICImIF9yZXR1cm4iOwotICAgICAgICByZXRfcGxhY2Vob2xkZXIgPSAiLCB0Y3h4OjpwbGFjZWhvbGRlcnM6Ol8xIjsKLSAgICAgIH0KLQotICAgICAgLy8gV2hlbiBnZW5fdGVtcGxhdGVzXyBpcyB0cnVlLCB0aGUgcmV0dXJuXyBhbmQgdGhyb3dfIGZ1bmN0aW9ucyBhcmUKLSAgICAgIC8vIG92ZXJsb2FkZWQuICBXZSBoYXZlIHRvIGRlY2xhcmUgcG9pbnRlcnMgdG8gdGhlbSBzbyB0aGF0IHRoZSBjb21waWxlcgotICAgICAgLy8gY2FuIHJlc29sdmUgdGhlIGNvcnJlY3Qgb3ZlcmxvYWRlZCB2ZXJzaW9uLgotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2b2lkICgiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJBc3luY1Byb2Nlc3NvciIgPDwgY2xhc3Nfc3VmZml4Ci0gICAgICAgICAgPDwgIjo6KnJldHVybl9mbikodGN4eDo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gIgotICAgICAgICAgIDw8ICJjb2IsIGludDMyX3Qgc2VxaWQsICIgPDwgcHJvdF90eXBlIDw8ICIqIG9wcm90LCB2b2lkKiBjdHgiIDw8IHJldF9hcmcKLSAgICAgICAgICA8PCAiKSA9IiA8PCBlbmRsOwotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgICYiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJBc3luY1Byb2Nlc3NvciIgPDwgY2xhc3Nfc3VmZml4Ci0gICAgICAgICAgPDwgIjo6cmV0dXJuXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgICAgaWYgKCF4Y2VwdGlvbnMuZW1wdHkoKSkgewotICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInZvaWQgKCIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkFzeW5jUHJvY2Vzc29yIiA8PCBjbGFzc19zdWZmaXgKLSAgICAgICAgICAgIDw8ICI6Oip0aHJvd19mbikodGN4eDo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gIgotICAgICAgICAgICAgPDwgImNvYiwgaW50MzJfdCBzZXFpZCwgIiA8PCBwcm90X3R5cGUgPDwgIiogb3Byb3QsIHZvaWQqIGN0eCwgIgotICAgICAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OlREZWxheWVkRXhjZXB0aW9uKiBfdGhyb3cpID0iIDw8IGVuZGw7Ci0gICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAmIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiQXN5bmNQcm9jZXNzb3IiIDw8IGNsYXNzX3N1ZmZpeAotICAgICAgICAgICAgPDwgIjo6dGhyb3dfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWZhY2VfLT4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRjeHg6OmJpbmQocmV0dXJuX2ZuLCB0aGlzLCBjb2IsIHNlcWlkLCBvcHJvdCwgY3R4IiA8PCByZXRfcGxhY2Vob2xkZXIKLSAgICAgICAgICA8PCAiKSI7Ci0gICAgICBpZiAoIXhjZXB0aW9ucy5lbXB0eSgpKSB7Ci0gICAgICAgIG91dCA8PCAnLCcgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidGN4eDo6YmluZCh0aHJvd19mbiwgdGhpcywgY29iLCBzZXFpZCwgb3Byb3QsICIKLSAgICAgICAgICAgIDw8ICJjdHgsIHRjeHg6OnBsYWNlaG9sZGVyczo6XzEpIjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBYWFggV2hpdGVzcGFjZSBjbGVhbnVwLgotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICBvdXQgPDwgJywnIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgfQotICAgIG91dCA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgICBvdXQgPDwgZW5kbDsKLQotICAgIC8vIE5vcm1hbCByZXR1cm4uCi0gICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICBzdHJpbmcgcmV0X2FyZ19kZWNsLCByZXRfYXJnX25hbWU7Ci0gICAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIHJldF9hcmdfZGVjbCA9ICIsIGNvbnN0ICIgKyB0eXBlX25hbWUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSArICImIF9yZXR1cm4iOwotICAgICAgICByZXRfYXJnX25hbWUgPSAiLCBfcmV0dXJuIjsKLSAgICAgIH0KLSAgICAgIGlmIChnZW5fdGVtcGxhdGVzXykgewotICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgb3V0IDw8ICJ2b2lkICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkFzeW5jUHJvY2Vzc29yIiA8PCBjbGFzc19zdWZmaXggPDwgIjo6cmV0dXJuXyIKLSAgICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIih0Y3h4OjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiBjb2IsIGludDMyX3Qgc2VxaWQsICIKLSAgICAgICAgICA8PCBwcm90X3R5cGUgPDwgIiogb3Byb3QsIHZvaWQqIGN0eCIgPDwgcmV0X2FyZ19kZWNsIDw8ICcpJyA8PCBlbmRsOwotICAgICAgc2NvcGVfdXAob3V0KTsKLQotICAgICAgaWYgKGdlbl90ZW1wbGF0ZXNfICYmICFzcGVjaWFsaXplZCkgewotICAgICAgICAvLyBJZiBvcHJvdCBpcyBhIFByb3RvY29sXyBpbnN0YW5jZSwKLSAgICAgICAgLy8gdXNlIHRoZSBzcGVjaWFsaXplZCByZXR1cm4gZnVuY3Rpb24gaW5zdGVhZC4KLSAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJQcm90b2NvbF8qIF9vcHJvdCA9IGR5bmFtaWNfY2FzdDxQcm90b2NvbF8qPihvcHJvdCk7IiA8PCBlbmRsCi0gICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKF9vcHJvdCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gcmV0dXJuXyIKLSAgICAgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKGNvYiwgc2VxaWQsIF9vcHJvdCwgY3R4IiA8PCByZXRfYXJnX25hbWUgPDwgIik7IiA8PCBlbmRsCi0gICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiVF9HRU5FUklDX1BST1RPQ09MKHRoaXMsIG9wcm90LCBfb3Byb3QpOyIKLSAgICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIl9wcmVzdWx0IHJlc3VsdDsiCi0gICAgICAgICAgPDwgZW5kbDsKLSAgICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgLy8gVGhlIGNvbnN0X2Nhc3QgaGVyZSBpcyB1bmZvcnR1bmF0ZSwgYnV0IGl0IHdvdWxkIGJlIGEgcGFpbiB0byBhdm9pZCwKLSAgICAgICAgLy8gYW5kIHdlIG9ubHkgZG8gYSB3cml0ZSB3aXRoIHRoaXMgc3RydWN0LCB3aGljaCBpcyBjb25zdC1zYWZlLgotICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJlc3VsdC5zdWNjZXNzID0gY29uc3RfY2FzdDwiIDw8IHR5cGVfbmFtZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpCi0gICAgICAgICAgICA8PCAiKj4oJl9yZXR1cm4pOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0Ll9faXNzZXQuc3VjY2VzcyA9IHRydWU7IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgLy8gU2VyaWFsaXplIHRoZSByZXN1bHQgaW50byBhIHN0cnVjdAotICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICA8PCAiICBjdHggPSB0aGlzLT5ldmVudEhhbmRsZXJfLT5nZXRDb250ZXh0KCIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIiwgTlVMTCk7IiA8PCBlbmRsCi0gICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICA8PCAiOjphcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvckNvbnRleHRGcmVlciBmcmVlcigiCi0gICAgICAgICAgPDwgInRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCksIGN0eCwgIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiKTsiIDw8IGVuZGwgPDwgZW5kbAotICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgPDwgIiAgdGhpcy0+ZXZlbnRIYW5kbGVyXy0+cHJlV3JpdGUoY3R4LCAiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIpOyIgPDwgZW5kbAotICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LT53cml0ZU1lc3NhZ2VCZWdpbihcIiIKLSAgICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiLCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9SRVBMWSwgc2VxaWQpOyIgPDwgZW5kbAotICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXN1bHQud3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3QtPndyaXRlTWVzc2FnZUVuZCgpOyIKLSAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ1aW50MzJfdCBieXRlcyA9IG9wcm90LT5nZXRUcmFuc3BvcnQoKS0+d3JpdGVFbmQoKTsiIDw8IGVuZGwKLSAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3QtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgPDwgIiAgdGhpcy0+ZXZlbnRIYW5kbGVyXy0+cG9zdFdyaXRlKGN0eCwgIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiLCBieXRlcyk7IiA8PCBlbmRsCi0gICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJldHVybiBjb2IodHJ1ZSk7IiA8PCBlbmRsOwotICAgICAgc2NvcGVfZG93bihvdXQpOwotICAgICAgb3V0IDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gRXhjZXB0aW9uIHJldHVybi4KLSAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXhjZXB0aW9ucy5lbXB0eSgpKSB7Ci0gICAgICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKLSAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPiIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIG91dCA8PCAidm9pZCAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJBc3luY1Byb2Nlc3NvciIgPDwgY2xhc3Nfc3VmZml4IDw8ICI6OnRocm93XyIKLSAgICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIih0Y3h4OjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiBjb2IsIGludDMyX3Qgc2VxaWQsICIKLSAgICAgICAgICA8PCBwcm90X3R5cGUgPDwgIiogb3Byb3QsIHZvaWQqIGN0eCwgIgotICAgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0OjpURGVsYXllZEV4Y2VwdGlvbiogX3Rocm93KSIgPDwgZW5kbDsKLSAgICAgIHNjb3BlX3VwKG91dCk7Ci0KLSAgICAgIGlmIChnZW5fdGVtcGxhdGVzXyAmJiAhc3BlY2lhbGl6ZWQpIHsKLSAgICAgICAgLy8gSWYgb3Byb3QgaXMgYSBQcm90b2NvbF8gaW5zdGFuY2UsCi0gICAgICAgIC8vIHVzZSB0aGUgc3BlY2lhbGl6ZWQgdGhyb3cgZnVuY3Rpb24gaW5zdGVhZC4KLSAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJQcm90b2NvbF8qIF9vcHJvdCA9IGR5bmFtaWNfY2FzdDxQcm90b2NvbF8qPihvcHJvdCk7IiA8PCBlbmRsCi0gICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKF9vcHJvdCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyb3dfIgotICAgICAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoY29iLCBzZXFpZCwgX29wcm90LCBjdHgsIF90aHJvdyk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiVF9HRU5FUklDX1BST1RPQ09MKHRoaXMsIG9wcm90LCBfb3Byb3QpOyIgPDwgZW5kbAotICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgLy8gR2V0IHRoZSBldmVudCBoYW5kbGVyIGNvbnRleHQKLSAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgPDwgIiAgY3R4ID0gdGhpcy0+ZXZlbnRIYW5kbGVyXy0+Z2V0Q29udGV4dCgiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIsIE5VTEwpOyIgPDwgZW5kbAotICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3JDb250ZXh0RnJlZXIgZnJlZXIoIgotICAgICAgICAgIDw8ICJ0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpLCBjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIik7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICAgIC8vIFRocm93IHRoZSBURGVsYXllZEV4Y2VwdGlvbiwgYW5kIGNhdGNoIHRoZSByZXN1bHQKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJfcmVzdWx0IHJlc3VsdDsiCi0gICAgICAgICAgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ0cnkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJfdGhyb3ctPnRocm93X2l0KCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gY29iKGZhbHNlKTsiCi0gICAgICAgICAgPDwgZW5kbDsgLy8gSXMgdGhpcyBwb3NzaWJsZT8gIFRCRC4KLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgJ30nOwotICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgb3V0IDw8ICIgIGNhdGNoICgiIDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCkpIDw8ICIgJiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0Ll9faXNzZXQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHRydWU7IgotICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgICAgc2NvcGVfZG93bihvdXQpOwotICAgICAgfQotCi0gICAgICAvLyBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgYW4gdW5kZWNsYXJlZCBleGNlcHRpb24gaXMgdGhyb3duCi0gICAgICBvdXQgPDwgIiBjYXRjaCAoc3RkOjpleGNlcHRpb24mIGUpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgIDw8ICIgIHRoaXMtPmV2ZW50SGFuZGxlcl8tPmhhbmRsZXJFcnJvcihjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIik7IiA8PCBlbmRsCi0gICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb24geChlLndoYXQoKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgPDwgIm9wcm90LT53cml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCi0gICAgICAgICAgPDwgIlwiLCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9FWENFUFRJT04sIHNlcWlkKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICA8PCAieC53cml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC0+d3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsCi0gICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LT5nZXRUcmFuc3BvcnQoKS0+d3JpdGVFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICA8PCAib3Byb3QtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIC8vIFdlIHBhc3MgdHJ1ZSB0byB0aGUgY29iIGhlcmUsIHNpbmNlIHdlIGRpZCBzdWNjZXNzZnVsbHkgd3JpdGUgYQotICAgICAgICAgIC8vIHJlc3BvbnNlLCBldmVuIHRob3VnaCBpdCBpcyBhbiBleGNlcHRpb24gcmVzcG9uc2UuCi0gICAgICAgICAgLy8gSXQgbG9va3MgbGlrZSB0aGUgYXJndW1lbnQgaXMgY3VycmVudGx5IGlnbm9yZWQsIGFueXdheS4KLSAgICAgICAgICBpbmRlbnQoKSA8PCAicmV0dXJuIGNvYih0cnVlKTsiIDw8IGVuZGw7Ci0gICAgICBzY29wZV9kb3duKG91dCk7Ci0KLSAgICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVzdWx0IGludG8gYSBzdHJ1Y3QKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgIDw8ICIgIHRoaXMtPmV2ZW50SGFuZGxlcl8tPnByZVdyaXRlKGN0eCwgIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiKTsiIDw8IGVuZGwKLSAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC0+d3JpdGVNZXNzYWdlQmVnaW4oXCIiCi0gICAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIiwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfUkVQTFksIHNlcWlkKTsiIDw8IGVuZGwKLSAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LT53cml0ZU1lc3NhZ2VFbmQoKTsiCi0gICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidWludDMyX3QgYnl0ZXMgPSBvcHJvdC0+Z2V0VHJhbnNwb3J0KCktPndyaXRlRW5kKCk7IiA8PCBlbmRsCi0gICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgIDw8ICIgIHRoaXMtPmV2ZW50SGFuZGxlcl8tPnBvc3RXcml0ZShjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIiwgYnl0ZXMpOyIgPDwgZW5kbAotICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gY29iKHRydWUpOyIgPDwgZW5kbDsKLSAgICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgICAgIG91dCA8PCBlbmRsOwotICAgIH0gLy8gZm9yIGVhY2ggZnVuY3Rpb24KLSAgfSAgIC8vIGNvYiBzdHlsZQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNrZWxldG9uIGZpbGUgb2YgYSBzZXJ2ZXIKLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9za2VsZXRvbih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBzdmNuYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCk7Ci0KLSAgLy8gU2VydmljZSBpbXBsZW1lbnRhdGlvbiBmaWxlIGluY2x1ZGVzCi0gIHN0cmluZyBmX3NrZWxldG9uX25hbWUgPSBnZXRfb3V0X2RpcigpICsgc3ZjbmFtZSArICJfc2VydmVyLnNrZWxldG9uLmNwcCI7Ci0KLSAgc3RyaW5nIG5zID0gbmFtZXNwYWNlX3ByZWZpeCh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWVzcGFjZSgiY3BwIikpOwotCi0gIG9mc3RyZWFtIGZfc2tlbGV0b247Ci0gIGZfc2tlbGV0b24ub3BlbihmX3NrZWxldG9uX25hbWUuY19zdHIoKSk7Ci0gIGZfc2tlbGV0b24gPDwgIi8vIFRoaXMgYXV0b2dlbmVyYXRlZCBza2VsZXRvbiBmaWxlIGlsbHVzdHJhdGVzIGhvdyB0byBidWlsZCBhIHNlcnZlci4iIDw8IGVuZGwKLSAgICAgICAgICAgICA8PCAiLy8gWW91IHNob3VsZCBjb3B5IGl0IHRvIGFub3RoZXIgZmlsZW5hbWUgdG8gYXZvaWQgb3ZlcndyaXRpbmcgaXQuIiA8PCBlbmRsIDw8IGVuZGwKLSAgICAgICAgICAgICA8PCAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkgPDwgc3ZjbmFtZSA8PCAiLmhcIiIgPDwgZW5kbAotICAgICAgICAgICAgIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPiIgPDwgZW5kbAotICAgICAgICAgICAgIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmg+IiA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgIiNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaD4iIDw8IGVuZGwKLSAgICAgICAgICAgICA8PCAiI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4iIDw8IGVuZGwgPDwgZW5kbAotICAgICAgICAgICAgIDw8ICJ1c2luZyBuYW1lc3BhY2UgOjphcGFjaGU6OnRocmlmdDsiIDw8IGVuZGwKLSAgICAgICAgICAgICA8PCAidXNpbmcgbmFtZXNwYWNlIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOyIgPDwgZW5kbAotICAgICAgICAgICAgIDw8ICJ1c2luZyBuYW1lc3BhY2UgOjphcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OyIgPDwgZW5kbAotICAgICAgICAgICAgIDw8ICJ1c2luZyBuYW1lc3BhY2UgOjphcGFjaGU6OnRocmlmdDo6c2VydmVyOyIgPDwgZW5kbCA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgInVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIHRoZSBmb2xsb3dpbmcgY29kZSB3b3VsZCBub3QgY29tcGlsZToKLSAgLy8gdXNpbmcgbmFtZXNwYWNlIDsKLSAgLy8gdXNpbmcgbmFtZXNwYWNlIDo6OwotICBpZiAoKCFucy5lbXB0eSgpKSAmJiAobnMuY29tcGFyZSgiIDo6IikgIT0gMCkpIHsKLSAgICBmX3NrZWxldG9uIDw8ICJ1c2luZyBuYW1lc3BhY2UgIiA8PCBzdHJpbmcobnMsIDAsIG5zLnNpemUoKSAtIDIpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLQotICBmX3NrZWxldG9uIDw8ICJjbGFzcyAiIDw8IHN2Y25hbWUgPDwgIkhhbmRsZXIgOiB2aXJ0dWFsIHB1YmxpYyAiIDw8IHN2Y25hbWUgPDwgIklmIHsiIDw8IGVuZGwKLSAgICAgICAgICAgICA8PCAiIHB1YmxpYzoiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmX3NrZWxldG9uIDw8IGluZGVudCgpIDw8IHN2Y25hbWUgPDwgIkhhbmRsZXIoKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgPDwgIiAgLy8gWW91ciBpbml0aWFsaXphdGlvbiBnb2VzIGhlcmUiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9qYXZhX2RvYyhmX3NrZWxldG9uLCAqZl9pdGVyKTsKLSAgICBmX3NrZWxldG9uIDw8IGluZGVudCgpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCAiIikgPDwgIiB7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICA8PCAiICAvLyBZb3VyIGltcGxlbWVudGF0aW9uIGdvZXMgaGVyZSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBwcmludGYoXCIiCi0gICAgICAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlxcblwiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2tlbGV0b24gPDwgIn07IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZl9za2VsZXRvbiA8PCBpbmRlbnQoKSA8PCAiaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZl9za2VsZXRvbgotICAgICAgPDwgaW5kZW50KCkgPDwgImludCBwb3J0ID0gOTA5MDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInNoYXJlZF9wdHI8IiA8PCBzdmNuYW1lCi0gICAgICA8PCAiSGFuZGxlcj4gaGFuZGxlcihuZXcgIiA8PCBzdmNuYW1lIDw8ICJIYW5kbGVyKCkpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgPDwgInNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yKG5ldyAiIDw8IHN2Y25hbWUgPDwgIlByb2Nlc3NvcihoYW5kbGVyKSk7IiA8PCBlbmRsCi0gICAgICA8PCBpbmRlbnQoKSA8PCAic2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiBzZXJ2ZXJUcmFuc3BvcnQobmV3IFRTZXJ2ZXJTb2NrZXQocG9ydCkpOyIKLSAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgIDw8ICJzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkpOyIgPDwgZW5kbAotICAgICAgPDwgaW5kZW50KCkgPDwgInNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpOyIKLSAgICAgIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgPDwgIlRTaW1wbGVTZXJ2ZXIgc2VydmVyKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpOyIKLSAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInNlcnZlci5zZXJ2ZSgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIDA7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBmX3NrZWxldG9uIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gQ2xvc2UgdGhlIGZpbGVzCi0gIGZfc2tlbGV0b24uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHN1ZmZpeCkgewotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkgKyBzdWZmaXg7Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUsIGlzX3JlZmVyZW5jZSh0ZmllbGQpKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInhmZXIgKz0gaXByb3QtPiI7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgb3V0IDw8ICJyZWFkQmluYXJ5KCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgb3V0IDw8ICJyZWFkQm9vbCgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIG91dCA8PCAicmVhZEJ5dGUoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIG91dCA8PCAicmVhZEkxNigiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgb3V0IDw8ICJyZWFkSTMyKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICBvdXQgPDwgInJlYWRJNjQoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIG91dCA8PCAicmVhZERvdWJsZSgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMrKyByZWFkZXIgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKSArIG5hbWU7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHN0cmluZyB0ID0gdG1wKCJlY2FzdCIpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaW50MzJfdCAiIDw8IHQgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gaXByb3QtPnJlYWRJMzIoIiA8PCB0Ci0gICAgICAgIDw8ICIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBuYW1lIDw8ICIgPSAoIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIikiIDw8IHQgPDwgIjsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAotICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHZhcmlhYmxlLiBUaGlzIG1ha2VzIHR3byBrZXkgYXNzdW1wdGlvbnMsCi0gKiBmaXJzdCB0aGF0IHRoZXJlIGlzIGEgY29uc3QgY2hhciogdmFyaWFibGUgbmFtZWQgZGF0YSB0aGF0IHBvaW50cyB0byB0aGUKLSAqIGJ1ZmZlciBmb3IgZGVzZXJpYWxpemF0aW9uLCBhbmQgdGhhdCB0aGVyZSBpcyBhIHZhcmlhYmxlIHByb3RvY29sIHdoaWNoCi0gKiBpcyBhIHJlZmVyZW5jZSB0byBhIFRQcm90b2NvbCBzZXJpYWxpemF0aW9uIG9iamVjdC4KLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVyKSB7Ci0gIGlmIChwb2ludGVyKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImlmICghIiA8PCBwcmVmaXggPDwgIikgeyAiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgIiA8PCBwcmVmaXggPDwgIiA9IGJvb3N0OjpzaGFyZWRfcHRyPCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICI+KG5ldyAiCi0gICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAieGZlciArPSAiIDw8IHByZWZpeCA8PCAiLT5yZWFkKGlwcm90KTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgImJvb2wgd2FzU2V0ID0gZmFsc2U7IiA8PCBlbmRsOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBmb3IgKGZfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgZl9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0KLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBwcmVmaXggPDwgIi0+X19pc3NldC4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgICAgPDwgIikgeyB3YXNTZXQgPSB0cnVlOyB9IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCF3YXNTZXQpIHsgIiA8PCBwcmVmaXggPDwgIi5yZXNldCgpOyB9IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9ICIgPDwgcHJlZml4IDw8ICIucmVhZChpcHJvdCk7IiA8PCBlbmRsOwotICB9Ci19Ci0KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgewotICBzY29wZV91cChvdXQpOwotCi0gIHN0cmluZyBzaXplID0gdG1wKCJfc2l6ZSIpOwotICBzdHJpbmcga3R5cGUgPSB0bXAoIl9rdHlwZSIpOwotICBzdHJpbmcgdnR5cGUgPSB0bXAoIl92dHlwZSIpOwotICBzdHJpbmcgZXR5cGUgPSB0bXAoIl9ldHlwZSIpOwotCi0gIHRfY29udGFpbmVyKiB0Y29udGFpbmVyID0gKHRfY29udGFpbmVyKil0dHlwZTsKLSAgYm9vbCB1c2VfcHVzaCA9IHRjb250YWluZXItPmhhc19jcHBfbmFtZSgpOwotCi0gIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLmNsZWFyKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ1aW50MzJfdCAiIDw8IHNpemUgPDwgIjsiIDw8IGVuZGw7Ci0KLSAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUVHlwZSAiIDw8IGt0eXBlIDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFR5cGUgIiA8PCB2dHlwZSA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICA8PCAieGZlciArPSBpcHJvdC0+cmVhZE1hcEJlZ2luKCIgPDwga3R5cGUgPDwgIiwgIiA8PCB2dHlwZSA8PCAiLCAiIDw8IHNpemUgPDwgIik7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlICIgPDwgZXR5cGUgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgPDwgInhmZXIgKz0gaXByb3QtPnJlYWRTZXRCZWdpbigiIDw8IGV0eXBlIDw8ICIsICIgPDwgc2l6ZSA8PCAiKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlICIgPDwgZXR5cGUgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgPDwgInhmZXIgKz0gaXByb3QtPnJlYWRMaXN0QmVnaW4oIiA8PCBldHlwZSA8PCAiLCAiIDw8IHNpemUgPDwgIik7IiA8PCBlbmRsOwotICAgIGlmICghdXNlX3B1c2gpIHsKLSAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLnJlc2l6ZSgiIDw8IHNpemUgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKLSAgc3RyaW5nIGkgPSB0bXAoIl9pIik7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAidWludDMyX3QgIiA8PCBpIDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJmb3IgKCIgPDwgaSA8PCAiID0gMDsgIiA8PCBpCi0gICAgICA8PCAiIDwgIiA8PCBzaXplIDw8ICI7ICsrIiA8PCBpIDw8ICIpIiA8PCBlbmRsOwotCi0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgcHJlZml4KTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgsIHVzZV9wdXNoLCBpKTsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICAvLyBSZWFkIGNvbnRhaW5lciBlbmQKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9IGlwcm90LT5yZWFkTWFwRW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9IGlwcm90LT5yZWFkU2V0RW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBpcHJvdC0+cmVhZExpc3RFbmQoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBrZXkgPSB0bXAoIl9rZXkiKTsKLSAgc3RyaW5nIHZhbCA9IHRtcCgiX3ZhbCIpOwotICB0X2ZpZWxkIGZrZXkodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7Ci0gIHRfZmllbGQgZnZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgZGVjbGFyZV9maWVsZCgmZmtleSkgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5KTsKLSAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZnZhbCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSkgPDwgIiA9ICIgPDwgcHJlZml4IDw8ICJbIiA8PCBrZXkKLSAgICAgICAgICAgICAgPDwgIl07IiA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwpOwotfQotCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7Ci0gIHRfZmllbGQgZmVsZW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIuaW5zZXJ0KCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VfcHVzaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGluZGV4KSB7Ci0gIGlmICh1c2VfcHVzaCkgewotICAgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOwotICAgIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7Ci0gICAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmVsZW0pIDw8IGVuZGw7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOwotICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLnB1c2hfYmFjaygiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgcHJlZml4ICsgIlsiICsgaW5kZXggKyAiXSIpOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKLSAgfQotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzdWZmaXgpIHsKLSAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotCi0gIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpICsgc3VmZml4OwotCi0gIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIG5hbWU7Ci0gIH0KLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUsIGlzX3JlZmVyZW5jZSh0ZmllbGQpKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKLQotICAgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9IG9wcm90LT4iOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgICAgIG91dCA8PCAid3JpdGVCaW5hcnkoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZygiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUJvb2woIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBvdXQgPDwgIndyaXRlQnl0ZSgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNigiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUk2NCgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMrKyB3cml0ZXIgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKQotICAgICAgICAgICAgKyBuYW1lOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBvdXQgPDwgIndyaXRlSTMyKChpbnQzMl90KSIgPDwgbmFtZSA8PCAiKTsiOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIG5hbWUuY19zdHIoKSwKLSAgICAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOwotICB9Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlcikgewotICBpZiAocG9pbnRlcikgewotICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBwcmVmaXggPDwgIikgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICB4ZmVyICs9ICIgPDwgcHJlZml4IDw8ICItPndyaXRlKG9wcm90KTsgIiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIKLSAgICAgICAgICAgICAgICA8PCAib3Byb3QtPndyaXRlU3RydWN0QmVnaW4oXCIiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlwiKTsgIiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIG9wcm90LT53cml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICBvcHJvdC0+d3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInhmZXIgKz0gIiA8PCBwcmVmaXggPDwgIi53cml0ZShvcHJvdCk7IiA8PCBlbmRsOwotICB9Ci19Ci0KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInhmZXIgKz0gb3Byb3QtPndyaXRlTWFwQmVnaW4oIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkKLSAgICAgICAgICAgICAgICA8PCAiLCAiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCAiCi0gICAgICAgICAgICAgICAgPDwgInN0YXRpY19jYXN0PHVpbnQzMl90PigiIDw8IHByZWZpeCA8PCAiLnNpemUoKSkpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBvcHJvdC0+d3JpdGVTZXRCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkKLSAgICAgICAgICAgICAgICA8PCAiLCAiCi0gICAgICAgICAgICAgICAgPDwgInN0YXRpY19jYXN0PHVpbnQzMl90PigiIDw8IHByZWZpeCA8PCAiLnNpemUoKSkpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInhmZXIgKz0gb3Byb3QtPndyaXRlTGlzdEJlZ2luKCIKLSAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiCi0gICAgICAgICAgICAgICAgPDwgInN0YXRpY19jYXN0PHVpbnQzMl90PigiIDw8IHByZWZpeCA8PCAiLnNpemUoKSkpOyIgPDwgZW5kbDsKLSAgfQotCi0gIHN0cmluZyBpdGVyID0gdG1wKCJfaXRlciIpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgdHlwZV9uYW1lKHR0eXBlKSA8PCAiOjpjb25zdF9pdGVyYXRvciAiIDw8IGl0ZXIgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgIDw8ICJmb3IgKCIgPDwgaXRlciA8PCAiID0gIiA8PCBwcmVmaXggPDwgIi5iZWdpbigpOyAiIDw8IGl0ZXIgPDwgIiAhPSAiIDw8IHByZWZpeAotICAgICAgPDwgIi5lbmQoKTsgKysiIDw8IGl0ZXIgPDwgIikiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBpdGVyKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyKTsKLSAgfQotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZU1hcEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBvcHJvdC0+d3JpdGVTZXRFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZUxpc3RFbmQoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KLSAqCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBpdGVyICsgIi0+Zmlyc3QiKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCwgIiIpOwotCi0gIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCBpdGVyICsgIi0+c2Vjb25kIik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQsICIiKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgaXRlcikgewotICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksICIoKiIgKyBpdGVyICsgIikiKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgaXRlcikgewotICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCAiKCoiICsgaXRlciArICIpIik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKLX0KLQotLyoqCi0gKiBNYWtlcyBhIDo6IHByZWZpeCBmb3IgYSBuYW1lc3BhY2UKLSAqCi0gKiBAcGFyYW0gbnMgVGhlIG5hbWVzcGFjZSwgdy8gcGVyaW9kcyBpbiBpdAotICogQHJldHVybiBOYW1lc3BhY2VzCi0gKi8KLXN0cmluZyB0X2NwcF9nZW5lcmF0b3I6Om5hbWVzcGFjZV9wcmVmaXgoc3RyaW5nIG5zKSB7Ci0gIC8vIEFsd2F5cyBzdGFydCB3aXRoICI6OiIsIHRvIGF2b2lkIHBvc3NpYmxlIG5hbWUgY29sbGlzaW9ucyB3aXRoCi0gIC8vIG90aGVyIG5hbWVzIGluIG9uZSBvZiB0aGUgY3VycmVudCBuYW1lc3BhY2VzLgotICAvLwotICAvLyBXZSBhbHNvIG5lZWQgYSBsZWFkaW5nIHNwYWNlLCBpbiBjYXNlIHRoZSBuYW1lIGlzIHVzZWQgaW5zaWRlIG9mIGEKLSAgLy8gdGVtcGxhdGUgcGFyYW1ldGVyLiAgIk15VGVtcGxhdGU8Ojpmb286OkJhcj4iIGlzIG5vdCB2YWxpZCBDKyssCi0gIC8vIHNpbmNlICI8OiIgaXMgYW4gYWx0ZXJuYXRpdmUgdG9rZW4gZm9yICJbIi4KLSAgc3RyaW5nIHJlc3VsdCA9ICIgOjoiOwotCi0gIGlmIChucy5zaXplKCkgPT0gMCkgewotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgc3RyaW5nOjpzaXplX3R5cGUgbG9jOwotICB3aGlsZSAoKGxvYyA9IG5zLmZpbmQoIi4iKSkgIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgcmVzdWx0ICs9IG5zLnN1YnN0cigwLCBsb2MpOwotICAgIHJlc3VsdCArPSAiOjoiOwotICAgIG5zID0gbnMuc3Vic3RyKGxvYyArIDEpOwotICB9Ci0gIGlmIChucy5zaXplKCkgPiAwKSB7Ci0gICAgcmVzdWx0ICs9IG5zICsgIjo6IjsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIE9wZW5zIG5hbWVzcGFjZS4KLSAqCi0gKiBAcGFyYW0gbnMgVGhlIG5hbWVzcGFjZSwgdy8gcGVyaW9kcyBpbiBpdAotICogQHJldHVybiBOYW1lc3BhY2VzCi0gKi8KLXN0cmluZyB0X2NwcF9nZW5lcmF0b3I6Om5hbWVzcGFjZV9vcGVuKHN0cmluZyBucykgewotICBpZiAobnMuc2l6ZSgpID09IDApIHsKLSAgICByZXR1cm4gIiI7Ci0gIH0KLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotICBzdHJpbmcgc2VwYXJhdG9yID0gIiI7Ci0gIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKLSAgd2hpbGUgKChsb2MgPSBucy5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykgewotICAgIHJlc3VsdCArPSBzZXBhcmF0b3I7Ci0gICAgcmVzdWx0ICs9ICJuYW1lc3BhY2UgIjsKLSAgICByZXN1bHQgKz0gbnMuc3Vic3RyKDAsIGxvYyk7Ci0gICAgcmVzdWx0ICs9ICIgeyI7Ci0gICAgc2VwYXJhdG9yID0gIiAiOwotICAgIG5zID0gbnMuc3Vic3RyKGxvYyArIDEpOwotICB9Ci0gIGlmIChucy5zaXplKCkgPiAwKSB7Ci0gICAgcmVzdWx0ICs9IHNlcGFyYXRvciArICJuYW1lc3BhY2UgIiArIG5zICsgIiB7IjsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIENsb3NlcyBuYW1lc3BhY2UuCi0gKgotICogQHBhcmFtIG5zIFRoZSBuYW1lc3BhY2UsIHcvIHBlcmlvZHMgaW4gaXQKLSAqIEByZXR1cm4gTmFtZXNwYWNlcwotICovCi1zdHJpbmcgdF9jcHBfZ2VuZXJhdG9yOjpuYW1lc3BhY2VfY2xvc2Uoc3RyaW5nIG5zKSB7Ci0gIGlmIChucy5zaXplKCkgPT0gMCkgewotICAgIHJldHVybiAiIjsKLSAgfQotICBzdHJpbmcgcmVzdWx0ID0gIn0iOwotICBzdHJpbmc6OnNpemVfdHlwZSBsb2M7Ci0gIHdoaWxlICgobG9jID0gbnMuZmluZCgiLiIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICByZXN1bHQgKz0gIn0iOwotICAgIG5zID0gbnMuc3Vic3RyKGxvYyArIDEpOwotICB9Ci0gIHJlc3VsdCArPSAiIC8vIG5hbWVzcGFjZSI7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogUmV0dXJucyBhIEMrKyB0eXBlIG5hbWUKLSAqCi0gKiBAcGFyYW0gdHR5cGUgVGhlIHR5cGUKLSAqIEByZXR1cm4gU3RyaW5nIG9mIHRoZSB0eXBlIG5hbWUsIGkuZS4gc3RkOjpzZXQ8dHlwZT4KLSAqLwotc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgaW5fdHlwZWRlZiwgYm9vbCBhcmcpIHsKLSAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHN0cmluZyBibmFtZSA9IGJhc2VfdHlwZV9uYW1lKCgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKSk7Ci0gICAgc3RkOjptYXA8c3RyaW5nLCBzdHJpbmc+OjppdGVyYXRvciBpdCA9IHR0eXBlLT5hbm5vdGF0aW9uc18uZmluZCgiY3BwLnR5cGUiKTsKLSAgICBpZiAoaXQgIT0gdHR5cGUtPmFubm90YXRpb25zXy5lbmQoKSkgewotICAgICAgYm5hbWUgPSBpdC0+c2Vjb25kOwotICAgIH0KLQotICAgIGlmICghYXJnKSB7Ci0gICAgICByZXR1cm4gYm5hbWU7Ci0gICAgfQotCi0gICAgaWYgKCgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcpIHsKLSAgICAgIHJldHVybiAiY29uc3QgIiArIGJuYW1lICsgIiYiOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gImNvbnN0ICIgKyBibmFtZTsKLSAgICB9Ci0gIH0KLQotICAvLyBDaGVjayBmb3IgYSBjdXN0b20gb3ZlcmxvYWRlZCBDKysgbmFtZQotICBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgc3RyaW5nIGNuYW1lOwotCi0gICAgdF9jb250YWluZXIqIHRjb250YWluZXIgPSAodF9jb250YWluZXIqKXR0eXBlOwotICAgIGlmICh0Y29udGFpbmVyLT5oYXNfY3BwX25hbWUoKSkgewotICAgICAgY25hbWUgPSB0Y29udGFpbmVyLT5nZXRfY3BwX25hbWUoKTsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgICAgdF9tYXAqIHRtYXAgPSAodF9tYXAqKXR0eXBlOwotICAgICAgY25hbWUgPSAic3RkOjptYXA8IiArIHR5cGVfbmFtZSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwgaW5fdHlwZWRlZikgKyAiLCAiCi0gICAgICAgICAgICAgICsgdHlwZV9uYW1lKHRtYXAtPmdldF92YWxfdHlwZSgpLCBpbl90eXBlZGVmKSArICI+ICI7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIHRfc2V0KiB0c2V0ID0gKHRfc2V0Kil0dHlwZTsKLSAgICAgIGNuYW1lID0gInN0ZDo6c2V0PCIgKyB0eXBlX25hbWUodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpbl90eXBlZGVmKSArICI+ICI7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICB0X2xpc3QqIHRsaXN0ID0gKHRfbGlzdCopdHR5cGU7Ci0gICAgICBjbmFtZSA9ICJzdGQ6OnZlY3RvcjwiICsgdHlwZV9uYW1lKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGluX3R5cGVkZWYpICsgIj4gIjsKLSAgICB9Ci0KLSAgICBpZiAoYXJnKSB7Ci0gICAgICByZXR1cm4gImNvbnN0ICIgKyBjbmFtZSArICImIjsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIGNuYW1lOwotICAgIH0KLSAgfQotCi0gIHN0cmluZyBjbGFzc19wcmVmaXg7Ci0gIGlmIChpbl90eXBlZGVmICYmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkpKSB7Ci0gICAgY2xhc3NfcHJlZml4ID0gImNsYXNzICI7Ci0gIH0KLQotICAvLyBDaGVjayBpZiBpdCBuZWVkcyB0byBiZSBuYW1lc3BhY2VkCi0gIHN0cmluZyBwbmFtZTsKLSAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7Ci0gIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgewotICAgIHBuYW1lID0gY2xhc3NfcHJlZml4ICsgbmFtZXNwYWNlX3ByZWZpeChwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJjcHAiKSkgKyB0dHlwZS0+Z2V0X25hbWUoKTsKLSAgfSBlbHNlIHsKLSAgICBwbmFtZSA9IGNsYXNzX3ByZWZpeCArIHR0eXBlLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgaWYgKHR0eXBlLT5pc19lbnVtKCkgJiYgIWdlbl9wdXJlX2VudW1zXykgewotICAgIHBuYW1lICs9ICI6OnR5cGUiOwotICB9Ci0KLSAgaWYgKGFyZykgewotICAgIGlmIChpc19jb21wbGV4X3R5cGUodHR5cGUpKSB7Ci0gICAgICByZXR1cm4gImNvbnN0ICIgKyBwbmFtZSArICImIjsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuICJjb25zdCAiICsgcG5hbWU7Ci0gICAgfQotICB9IGVsc2UgewotICAgIHJldHVybiBwbmFtZTsKLSAgfQotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIEMrKyB0eXBlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHRocmlmdCB0eXBlLgotICoKLSAqIEBwYXJhbSB0YmFzZSBUaGUgYmFzZSB0eXBlCi0gKiBAcmV0dXJuIEV4cGxpY2l0IEMrKyB0eXBlLCBpLmUuICJpbnQzMl90IgotICovCi1zdHJpbmcgdF9jcHBfZ2VuZXJhdG9yOjpiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlKSB7Ci0gIHN3aXRjaCAodGJhc2UpIHsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgIHJldHVybiAidm9pZCI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgIHJldHVybiAic3RkOjpzdHJpbmciOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgcmV0dXJuICJib29sIjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIHJldHVybiAiaW50OF90IjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgcmV0dXJuICJpbnQxNl90IjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgcmV0dXJuICJpbnQzMl90IjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgcmV0dXJuICJpbnQ2NF90IjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgcmV0dXJuICJkb3VibGUiOwotICBkZWZhdWx0OgotICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQysrIGJhc2UgdHlwZSBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBEZWNsYXJlcyBhIGZpZWxkLCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCi0gKgotICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCi0gKiBAcmV0dXJuIEZpZWxkIGRlY2xhcmF0aW9uLCBpLmUuIGludCB4ID0gMDsKLSAqLwotc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNvbnN0YW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlZmVyZW5jZSkgewotICAvLyBUT0RPKG1jc2xlZSk6IGRvIHdlIGV2ZXIgbmVlZCB0byBpbml0aWFsaXplIHRoZSBmaWVsZD8KLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotICBpZiAoY29uc3RhbnQpIHsKLSAgICByZXN1bHQgKz0gImNvbnN0ICI7Ci0gIH0KLSAgcmVzdWx0ICs9IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpOwotICBpZiAoaXNfcmVmZXJlbmNlKHRmaWVsZCkpIHsKLSAgICByZXN1bHQgPSAiYm9vc3Q6OnNoYXJlZF9wdHI8IiArIHJlc3VsdCArICI+IjsKLSAgfQotICBpZiAocG9pbnRlcikgewotICAgIHJlc3VsdCArPSAiKiI7Ci0gIH0KLSAgaWYgKHJlZmVyZW5jZSkgewotICAgIHJlc3VsdCArPSAiJiI7Ci0gIH0KLSAgcmVzdWx0ICs9ICIgIiArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgaWYgKGluaXQpIHsKLSAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgcmVzdWx0ICs9ICIgPSBmYWxzZSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICByZXN1bHQgKz0gIiA9IDAiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICByZXN1bHQgKz0gIiA9IChkb3VibGUpMCI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDKysgaW5pdGlhbGl6ZXIgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgcmVzdWx0ICs9ICIgPSAoIiArIHR5cGVfbmFtZSh0eXBlKSArICIpMCI7Ci0gICAgfQotICB9Ci0gIGlmICghcmVmZXJlbmNlKSB7Ci0gICAgcmVzdWx0ICs9ICI7IjsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KLSAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KLSAqLwotc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3R5bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5hbWVfcGFyYW1zKSB7Ci0gIHRfdHlwZSogdHR5cGUgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7Ci0gIHRfc3RydWN0KiBhcmdsaXN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOwotICBib29sIGhhc194Y2VwdGlvbnMgPSAhdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCkuZW1wdHkoKTsKLQotICBpZiAoc3R5bGUgPT0gIiIpIHsKLSAgICBpZiAoaXNfY29tcGxleF90eXBlKHR0eXBlKSkgewotICAgICAgcmV0dXJuICJ2b2lkICIgKyBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiKCIgKyB0eXBlX25hbWUodHR5cGUpCi0gICAgICAgICAgICAgKyAobmFtZV9wYXJhbXMgPyAiJiBfcmV0dXJuIiA6ICImIC8qIF9yZXR1cm4gKi8iKQotICAgICAgICAgICAgICsgYXJndW1lbnRfbGlzdChhcmdsaXN0LCBuYW1lX3BhcmFtcywgdHJ1ZSkgKyAiKSI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiB0eXBlX25hbWUodHR5cGUpICsgIiAiICsgcHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIigiCi0gICAgICAgICAgICAgKyBhcmd1bWVudF9saXN0KGFyZ2xpc3QsIG5hbWVfcGFyYW1zKSArICIpIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAoc3R5bGUuc3Vic3RyKDAsIDMpID09ICJDb2IiKSB7Ci0gICAgc3RyaW5nIGNvYl90eXBlOwotICAgIHN0cmluZyBleG5fY29iOwotICAgIGlmIChzdHlsZSA9PSAiQ29iQ2wiKSB7Ci0gICAgICBjb2JfdHlwZSA9ICIoIiArIHNlcnZpY2VfbmFtZV8gKyAiQ29iQ2xpZW50IjsKLSAgICAgIGlmIChnZW5fdGVtcGxhdGVzXykgewotICAgICAgICBjb2JfdHlwZSArPSAiVDxQcm90b2NvbF8+IjsKLSAgICAgIH0KLSAgICAgIGNvYl90eXBlICs9ICIqIGNsaWVudCkiOwotICAgIH0gZWxzZSBpZiAoc3R5bGUgPT0gIkNvYlN2IikgewotICAgICAgY29iX3R5cGUgPSAodHR5cGUtPmlzX3ZvaWQoKSA/ICIoKSIgOiAoIigiICsgdHlwZV9uYW1lKHR0eXBlKSArICIgY29uc3QmIF9yZXR1cm4pIikpOwotICAgICAgaWYgKGhhc194Y2VwdGlvbnMpIHsKLSAgICAgICAgZXhuX2NvYgotICAgICAgICAgICAgPSAiLCB0Y3h4OjpmdW5jdGlvbjx2b2lkKDo6YXBhY2hlOjp0aHJpZnQ6OlREZWxheWVkRXhjZXB0aW9uKiBfdGhyb3cpPiAvKiBleG5fY29iICovIjsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgdGhyb3cgIlVOS05PV04gU1RZTEUiOwotICAgIH0KLQotICAgIHJldHVybiAidm9pZCAiICsgcHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIih0Y3h4OjpmdW5jdGlvbjx2b2lkIiArIGNvYl90eXBlICsgIj4gY29iIgotICAgICAgICAgICArIGV4bl9jb2IgKyBhcmd1bWVudF9saXN0KGFyZ2xpc3QsIG5hbWVfcGFyYW1zLCB0cnVlKSArICIpIjsKLSAgfSBlbHNlIHsKLSAgICB0aHJvdyAiVU5LTk9XTiBTVFlMRSI7Ci0gIH0KLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZmllbGQgbGlzdAotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICogQHJldHVybiBDb21tYSBzZXBlYXJhdGVkIGxpc3Qgb2YgYWxsIGZpZWxkIG5hbWVzIGluIHRoYXQgc3RydWN0Ci0gKi8KLXN0cmluZyB0X2NwcF9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgbmFtZV9wYXJhbXMsIGJvb2wgc3RhcnRfY29tbWEpIHsKLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBmaXJzdCA9ICFzdGFydF9jb21tYTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiLCAiOwotICAgIH0KLSAgICByZXN1bHQgKz0gdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIHRydWUpICsgIiAiCi0gICAgICAgICAgICAgICsgKG5hbWVfcGFyYW1zID8gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDogIi8qICIgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiICovIik7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIEMrKyBlbnVtIHN0cmluZyBmb3IgdGhlIGdpdmVuIHR5cGUuCi0gKgotICogQHBhcmFtIHR5cGUgVGhyaWZ0IFR5cGUKLSAqIEByZXR1cm4gU3RyaW5nIG9mIEMrKyBjb2RlIHRvIGRlZmluaXRpb24gb2YgdGhhdCB0eXBlIGNvbnN0YW50Ci0gKi8KLXN0cmluZyB0X2NwcF9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUUklORyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9CT09MIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0JZVEUiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9JMTYiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9JMzIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9JNjQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9ET1VCTEUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0kzMiI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkpIHsKLSAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUUlVDVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RSVUNUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfTUFQIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU0VUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0xJU1QiOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi1zdHJpbmcgdF9jcHBfZ2VuZXJhdG9yOjpnZXRfaW5jbHVkZV9wcmVmaXgoY29uc3QgdF9wcm9ncmFtJiBwcm9ncmFtKSBjb25zdCB7Ci0gIHN0cmluZyBpbmNsdWRlX3ByZWZpeCA9IHByb2dyYW0uZ2V0X2luY2x1ZGVfcHJlZml4KCk7Ci0gIGlmICghdXNlX2luY2x1ZGVfcHJlZml4XyB8fCAoaW5jbHVkZV9wcmVmaXguc2l6ZSgpID4gMCAmJiBpbmNsdWRlX3ByZWZpeFswXSA9PSAnLycpKSB7Ci0gICAgLy8gaWYgZmxhZyBpcyB0dXJuZWQgb2ZmIG9yIHRoaXMgaXMgYWJzb2x1dGUgcGF0aCwgcmV0dXJuIGVtcHR5IHByZWZpeAotICAgIHJldHVybiAiIjsKLSAgfQotCi0gIHN0cmluZzo6c2l6ZV90eXBlIGxhc3Rfc2xhc2ggPSBzdHJpbmc6Om5wb3M7Ci0gIGlmICgobGFzdF9zbGFzaCA9IGluY2x1ZGVfcHJlZml4LnJmaW5kKCIvIikpICE9IHN0cmluZzo6bnBvcykgewotICAgIHJldHVybiBpbmNsdWRlX3ByZWZpeC5zdWJzdHIoMCwgbGFzdF9zbGFzaCkKLSAgICAgICAgICAgKyAoZ2V0X3Byb2dyYW0oKS0+aXNfb3V0X3BhdGhfYWJzb2x1dGUoKSA/ICIvIiA6ICIvIiArIG91dF9kaXJfYmFzZV8gKyAiLyIpOwotICB9Ci0KLSAgcmV0dXJuICIiOwotfQotCi1USFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAotICAgIGNwcCwKLSAgICAiQysrIiwKLSAgICAiICAgIGNvYl9zdHlsZTogICAgICAgR2VuZXJhdGUgXCJDb250aW51YXRpb24gT0JqZWN0XCItc3R5bGUgY2xhc3Nlcy5cbiIKLSAgICAiICAgIG5vX2NsaWVudF9jb21wbGV0aW9uOlxuIgotICAgICIgICAgICAgICAgICAgICAgICAgICBPbWl0IGNhbGxzIHRvIGNvbXBsZXRpb25fXygpIGluIENvYkNsaWVudCBjbGFzcy5cbiIKLSAgICAiICAgIG5vX2RlZmF1bHRfb3BlcmF0b3JzOlxuIgotICAgICIgICAgICAgICAgICAgICAgICAgICBPbWl0cyBnZW5lcmF0aW9uIG9mIGRlZmF1bHQgb3BlcmF0b3JzID09LCAhPSBhbmQgPFxuIgotICAgICIgICAgdGVtcGxhdGVzOiAgICAgICBHZW5lcmF0ZSB0ZW1wbGF0aXplZCByZWFkZXIvd3JpdGVyIG1ldGhvZHMuXG4iCi0gICAgIiAgICBwdXJlX2VudW1zOiAgICAgIEdlbmVyYXRlIHB1cmUgZW51bXMgaW5zdGVhZCBvZiB3cmFwcGVyIGNsYXNzZXMuXG4iCi0gICAgIiAgICBpbmNsdWRlX3ByZWZpeDogIFVzZSBmdWxsIGluY2x1ZGUgcGF0aHMgaW4gZ2VuZXJhdGVkIGZpbGVzLlxuIgotICAgICIgICAgbW92ZWFibGVfdHlwZXM6ICBHZW5lcmF0ZSBtb3ZlIGNvbnN0cnVjdG9ycyBhbmQgYXNzaWdubWVudCBvcGVyYXRvcnMuXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2NzaGFycF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfY3NoYXJwX2dlbmVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmEyMTgwMS4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfY3NoYXJwX2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDI4NjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgotICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKLSAqIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGNhc3NlcnQ+Ci0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8Y2N0eXBlPgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzc3RyZWFtPgotCi0jaW5jbHVkZSAicGxhdGZvcm0uaCIKLSNpbmNsdWRlICJ0X29vcF9nZW5lcmF0b3IuaCIKLQotdXNpbmcgc3RkOjptYXA7Ci11c2luZyBzdGQ6Om9mc3RyZWFtOwotdXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwotdXNpbmcgc3RkOjpzdHJpbmc7Ci11c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKLXVzaW5nIHN0ZDo6dmVjdG9yOwotCi1zdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCi0KLWNsYXNzIHRfY3NoYXJwX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgewotcHVibGljOgotICB0X2NzaGFycF9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAotICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKLSAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKSB7Ci0gICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKLQotICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgiYXN5bmMiKTsKLSAgICBhc3luY18gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoImFzeW5jY3RwIik7Ci0gICAgYXN5bmNfY3RwXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLSAgICBpZiAoYXN5bmNfICYmIGFzeW5jX2N0cF8pIHsKLSAgICAgIHRocm93ICJhcmd1bWVudCBlcnJvcjogQ2Fubm90IHNwZWNpZnkgYm90aCBhc3luYyBhbmQgYXN5bmNjdHA7IHRoZXkgYXJlIGluY29tcGF0aWJsZS4iOwotICAgIH0KLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJudWxsYWJsZSIpOwotICAgIG51bGxhYmxlXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJoYXNoY29kZSIpOwotICAgIGhhc2hjb2RlXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJ1bmlvbiIpOwotICAgIHVuaW9uXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJzZXJpYWwiKTsKLSAgICBzZXJpYWxpemVfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotICAgIGlmIChzZXJpYWxpemVfKSB7Ci0gICAgICB3Y2ZfbmFtZXNwYWNlXyA9IGl0ZXItPnNlY29uZDsgLy8gc2luY2UgdGhlcmUgY2FuIGJlIG9ubHkgb25lIG5hbWVzcGFjZQotICAgIH0KLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJ3Y2YiKTsKLSAgICB3Y2ZfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotICAgIGlmICh3Y2ZfKSB7Ci0gICAgICB3Y2ZfbmFtZXNwYWNlXyA9IGl0ZXItPnNlY29uZDsKLSAgICB9Ci0KLSAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1jc2hhcnAiOwotICB9Ci0gIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKLSAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKLQotICB2b2lkIGdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKTsKLQotICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7Ci0gIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3VuaW9uKHRfc3RydWN0KiB0dW5pb24pOwotICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcHJvcGVydHkob2ZzdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBib29sIGlzUHVibGljLCBib29sIGdlbmVyYXRlSXNzZXQpOwotICB2b2lkIGdlbmVyYXRlX2NzaGFycF9wcm9wZXJ0eShvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNQdWJsaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbHVkZUlzc2V0ID0gdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRQcmVmaXggPSAiIik7Ci0gIGJvb2wgcHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fc3RhdGljLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVmdmFsID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBuZWVkdHlwZSA9IGZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0gIHZvaWQgcHJpbnRfY29uc3RfY29uc3RydWN0b3Ioc3RkOjpvZnN0cmVhbSYgb3V0LCBzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKTsKLSAgdm9pZCBwcmludF9jb25zdF9kZWZfdmFsdWUoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKLQotICB2b2lkIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfdW5pb24odF9zdHJ1Y3QqIHR1bmlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jbGFzcyA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCA9IGZhbHNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfdW5pb25fZGVmaW5pdGlvbihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0dW5pb24pOwotICB2b2lkIGdlbmVyYXRlX2NzaGFycF91bmlvbl9jbGFzcyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0dW5pb24sIHRfZmllbGQqIHRmaWVsZCk7Ci0gIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3djZmZhdWx0KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfcmVhZGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3dyaXRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3Rvc3RyaW5nKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfZXF1YWxzKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfaGFzaGNvZGUoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3VuaW9uX3JlYWRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0dW5pb24pOwotCi0gIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIGZ1bmN0aW9uKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19wcm9wZXJ0eWxlc3MgPSBmYWxzZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2xpc3QqIGxpc3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2VsZW1lbnQgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19wcm9wZXJ0eWxlc3MgPSBmYWxzZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWFwKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0ZDo6c3RyaW5nIGl0ZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX2RvYyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKTsKLSAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfZG9jKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpOwotICB2b2lkIGdlbmVyYXRlX2NzaGFycF9kb2Moc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZG9jKTsKLSAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfZG9jc3RyaW5nX2NvbW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCBzdHJpbmcgY29udGVudHMpOwotCi0gIHZvaWQgc3RhcnRfY3NoYXJwX25hbWVzcGFjZShzdGQ6Om9mc3RyZWFtJiBvdXQpOwotICB2b2lkIGVuZF9jc2hhcnBfbmFtZXNwYWNlKHN0ZDo6b2ZzdHJlYW0mIG91dCk7Ci0KLSAgc3RkOjpzdHJpbmcgY3NoYXJwX3R5cGVfdXNpbmdzKCk7Ci0gIHN0ZDo6c3RyaW5nIGNzaGFycF90aHJpZnRfdXNpbmdzKCk7Ci0KLSAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NvdW50YWluZXIgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5faW5pdCA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9wYXJhbSA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXF1aXJlZCA9IGZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgYmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHRiYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NvbnRhaW5lciA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX3BhcmFtID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVxdWlyZWQgPSBmYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIGRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQgPSBmYWxzZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmNfYmVnaW4odF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0gIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luY19lbmQodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0gIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luYyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKLSAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOwotICBzdGQ6OnN0cmluZyBwcm9wX25hbWUodF9maWVsZCogdGZpZWxkLCBib29sIHN1cHByZXNzX21hcHBpbmcgPSBmYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIGdldF9lbnVtX2NsYXNzX25hbWUodF90eXBlKiB0eXBlKTsKLQotICBib29sIGZpZWxkX2hhc19kZWZhdWx0KHRfZmllbGQqIHRmaWVsZCkgeyByZXR1cm4gdGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMOyB9Ci0KLSAgYm9vbCBmaWVsZF9pc19yZXF1aXJlZCh0X2ZpZWxkKiB0ZmllbGQpIHsgcmV0dXJuIHRmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQ7IH0KLQotICBib29sIHR5cGVfY2FuX2JlX251bGwodF90eXBlKiB0dHlwZSkgewotICAgIHdoaWxlICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgICB0dHlwZSA9ICgodF90eXBlZGVmKil0dHlwZSktPmdldF90eXBlKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHR0eXBlLT5pc19jb250YWluZXIoKSB8fCB0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkKLSAgICAgICAgICAgfHwgdHR5cGUtPmlzX3N0cmluZygpOwotICB9Ci0KLXByaXZhdGU6Ci0gIHN0ZDo6c3RyaW5nIG5hbWVzcGFjZV9uYW1lXzsKLSAgc3RkOjpvZnN0cmVhbSBmX3NlcnZpY2VfOwotICBzdGQ6OnN0cmluZyBuYW1lc3BhY2VfZGlyXzsKLSAgYm9vbCBhc3luY187Ci0gIGJvb2wgYXN5bmNfY3RwXzsKLSAgYm9vbCBudWxsYWJsZV87Ci0gIGJvb2wgdW5pb25fOwotICBib29sIGhhc2hjb2RlXzsKLSAgYm9vbCBzZXJpYWxpemVfOwotICBib29sIHdjZl87Ci0gIHN0ZDo6c3RyaW5nIHdjZl9uYW1lc3BhY2VfOwotCi0gIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IGNzaGFycF9rZXl3b3JkczsKLQotICB2b2lkKiBtZW1iZXJfbWFwcGluZ19zY29wZTsKLSAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBtZW1iZXJfbmFtZV9tYXBwaW5nOwotCi0gIHZvaWQgaW5pdF9rZXl3b3JkcygpOwotICBzdGQ6OnN0cmluZyBub3JtYWxpemVfbmFtZShzdGQ6OnN0cmluZyBuYW1lKTsKLSAgc3RkOjpzdHJpbmcgbWFrZV92YWxpZF9jc2hhcnBfaWRlbnRpZmllcihzdGQ6OnN0cmluZyBjb25zdCYgZnJvbU5hbWUpOwotICB2b2lkIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyh0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKHZvaWQqIHNjb3BlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHN0cnVjdG5hbWUpOwotICB2b2lkIGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZyh2b2lkKiBzY29wZSk7Ci0gIHN0cmluZyBnZXRfbWFwcGVkX21lbWJlcl9uYW1lKHN0cmluZyBvbGRuYW1lKTsKLX07Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKLSAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKLSAgbmFtZXNwYWNlX25hbWVfID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoImNzaGFycCIpOwotCi0gIHN0cmluZyBkaXIgPSBuYW1lc3BhY2VfbmFtZV87Ci0gIHN0cmluZyBzdWJkaXIgPSBnZXRfb3V0X2RpcigpLmNfc3RyKCk7Ci0gIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKLQotICB3aGlsZSAoKGxvYyA9IGRpci5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykgewotICAgIHN1YmRpciA9IHN1YmRpciArICIvIiArIGRpci5zdWJzdHIoMCwgbG9jKTsKLSAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7Ci0gICAgZGlyID0gZGlyLnN1YnN0cihsb2MgKyAxKTsKLSAgfQotICBpZiAoZGlyLnNpemUoKSA+IDApIHsKLSAgICBzdWJkaXIgPSBzdWJkaXIgKyAiLyIgKyBkaXI7Ci0gICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOwotICB9Ci0KLSAgbmFtZXNwYWNlX2Rpcl8gPSBzdWJkaXI7Ci0gIGluaXRfa2V5d29yZHMoKTsKLSAgbWVtYmVyX21hcHBpbmdfc2NvcGUgPSBOVUxMOwotCi0gIHB2ZXJib3NlKCJDIyBvcHRpb25zOlxuIik7Ci0gIHB2ZXJib3NlKCItIGFzeW5jIC4uLi4uLiAlc1xuIiwgKGFzeW5jXyA/ICJPTiIgOiAib2ZmIikpOwotICBwdmVyYm9zZSgiLSBhc3luY19jdHAgLi4gJXNcbiIsIChhc3luY19jdHBfID8gIk9OIiA6ICJvZmYiKSk7Ci0gIHB2ZXJib3NlKCItIG51bGxhYmxlIC4uLiAlc1xuIiwgKG51bGxhYmxlXyA/ICJPTiIgOiAib2ZmIikpOwotICBwdmVyYm9zZSgiLSB1bmlvbiAuLi4uLi4gJXNcbiIsICh1bmlvbl8gPyAiT04iIDogIm9mZiIpKTsKLSAgcHZlcmJvc2UoIi0gaGFzaGNvZGUgLi4uICVzXG4iLCAoaGFzaGNvZGVfID8gIk9OIiA6ICJvZmYiKSk7Ci0gIHB2ZXJib3NlKCItIHNlcmlhbGl6ZSAuLiAlc1xuIiwgKHNlcmlhbGl6ZV8gPyAiT04iIDogIm9mZiIpKTsKLSAgcHZlcmJvc2UoIi0gd2NmIC4uLi4uLi4uICVzXG4iLCAod2NmXyA/ICJPTiIgOiAib2ZmIikpOwotfQotCi1zdGQ6OnN0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6Om5vcm1hbGl6ZV9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpIHsKLSAgc3RyaW5nIHRtcChuYW1lKTsKLSAgc3RkOjp0cmFuc2Zvcm0odG1wLmJlZ2luKCksIHRtcC5lbmQoKSwgdG1wLmJlZ2luKCksIHN0YXRpY19jYXN0PGludCAoKikoaW50KT4oc3RkOjp0b2xvd2VyKSk7Ci0KLSAgLy8gdW4tY29uZmxpY3Qga2V5d29yZHMgYnkgcHJlZml4aW5nIHdpdGggIkAiCi0gIGlmIChjc2hhcnBfa2V5d29yZHMuZmluZCh0bXApICE9IGNzaGFycF9rZXl3b3Jkcy5lbmQoKSkgewotICAgIHJldHVybiAiQCIgKyBuYW1lOwotICB9Ci0KLSAgLy8gbm8gY2hhbmdlcyBuZWNlc3NhcnkKLSAgcmV0dXJuIG5hbWU7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjppbml0X2tleXdvcmRzKCkgewotICBjc2hhcnBfa2V5d29yZHMuY2xlYXIoKTsKLQotICAvLyBDIyBrZXl3b3JkcwotICBjc2hhcnBfa2V5d29yZHNbImFic3RyYWN0Il0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbImFzIl0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbImJhc2UiXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1siYm9vbCJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJicmVhayJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJieXRlIl0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbImNhc2UiXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1siY2F0Y2giXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1siY2hhciJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJjaGVja2VkIl0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbImNsYXNzIl0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbImNvbnN0Il0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbImNvbnRpbnVlIl0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbImRlY2ltYWwiXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1siZGVmYXVsdCJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJkZWxlZ2F0ZSJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJkbyJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJkb3VibGUiXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1siZWxzZSJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJlbnVtIl0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbImV2ZW50Il0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbImV4cGxpY2l0Il0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbImV4dGVybiJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJmYWxzZSJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJmaW5hbGx5Il0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbImZpeGVkIl0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbImZsb2F0Il0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbImZvciJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJmb3JlYWNoIl0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbImdvdG8iXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1siaWYiXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1siaW1wbGljaXQiXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1siaW4iXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1siaW50Il0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbImludGVyZmFjZSJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJpbnRlcm5hbCJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJpcyJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJsb2NrIl0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbImxvbmciXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1sibmFtZXNwYWNlIl0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbIm5ldyJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJudWxsIl0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbIm9iamVjdCJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJvcGVyYXRvciJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJvdXQiXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1sib3ZlcnJpZGUiXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1sicGFyYW1zIl0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbInByaXZhdGUiXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1sicHJvdGVjdGVkIl0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbInB1YmxpYyJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJyZWFkb25seSJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJyZWYiXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1sicmV0dXJuIl0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbInNieXRlIl0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbInNlYWxlZCJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJzaG9ydCJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJzaXplb2YiXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1sic3RhY2thbGxvYyJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJzdGF0aWMiXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1sic3RyaW5nIl0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbInN0cnVjdCJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJzd2l0Y2giXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1sidGhpcyJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJ0aHJvdyJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJ0cnVlIl0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbInRyeSJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJ0eXBlb2YiXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1sidWludCJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJ1bG9uZyJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJ1bmNoZWNrZWQiXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1sidW5zYWZlIl0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbInVzaG9ydCJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJ1c2luZyJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJ2aXJ0dWFsIl0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbInZvaWQiXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1sidm9sYXRpbGUiXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1sid2hpbGUiXSA9IDE7Ci0KLSAgLy8gQyMgY29udGV4dHVhbCBrZXl3b3JkcwotICBjc2hhcnBfa2V5d29yZHNbImFkZCJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJhbGlhcyJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJhc2NlbmRpbmciXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1siYXN5bmMiXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1siYXdhaXQiXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1siZGVzY2VuZGluZyJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJkeW5hbWljIl0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbImZyb20iXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1siZ2V0Il0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbImdsb2JhbCJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJncm91cCJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJpbnRvIl0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbImpvaW4iXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1sibGV0Il0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbIm9yZGVyYnkiXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1sicGFydGlhbCJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJyZW1vdmUiXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1sic2VsZWN0Il0gPSAxOwotICBjc2hhcnBfa2V5d29yZHNbInNldCJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJ2YWx1ZSJdID0gMTsKLSAgY3NoYXJwX2tleXdvcmRzWyJ2YXIiXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1sid2hlcmUiXSA9IDE7Ci0gIGNzaGFycF9rZXl3b3Jkc1sieWllbGQiXSA9IDE7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpzdGFydF9jc2hhcnBfbmFtZXNwYWNlKG9mc3RyZWFtJiBvdXQpIHsKLSAgaWYgKCFuYW1lc3BhY2VfbmFtZV8uZW1wdHkoKSkgewotICAgIG91dCA8PCAibmFtZXNwYWNlICIgPDwgbmFtZXNwYWNlX25hbWVfIDw8ICJcbiI7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgfQotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6ZW5kX2NzaGFycF9uYW1lc3BhY2Uob2ZzdHJlYW0mIG91dCkgewotICBpZiAoIW5hbWVzcGFjZV9uYW1lXy5lbXB0eSgpKSB7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICB9Ci19Ci0KLXN0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OmNzaGFycF90eXBlX3VzaW5ncygpIHsKLSAgcmV0dXJuIHN0cmluZygpICsgInVzaW5nIFN5c3RlbTtcbiIgKyAidXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zO1xuIgotICAgICAgICAgKyAidXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7XG4iICsgInVzaW5nIFN5c3RlbS5UZXh0O1xuIiArICJ1c2luZyBTeXN0ZW0uSU87XG4iCi0gICAgICAgICArICgoYXN5bmNfIHx8IGFzeW5jX2N0cF8pID8gInVzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7XG4iIDogIiIpICsgInVzaW5nIFRocmlmdDtcbiIKLSAgICAgICAgICsgInVzaW5nIFRocmlmdC5Db2xsZWN0aW9ucztcbiIgKyAoKHNlcmlhbGl6ZV8gfHwgd2NmXykgPyAiI2lmICFTSUxWRVJMSUdIVFxuIiA6ICIiKQotICAgICAgICAgKyAoKHNlcmlhbGl6ZV8gfHwgd2NmXykgPyAidXNpbmcgU3lzdGVtLlhtbC5TZXJpYWxpemF0aW9uO1xuIiA6ICIiKQotICAgICAgICAgKyAoKHNlcmlhbGl6ZV8gfHwgd2NmXykgPyAiI2VuZGlmXG4iIDogIiIpICsgKHdjZl8gPyAiLy91c2luZyBTeXN0ZW0uU2VydmljZU1vZGVsO1xuIiA6ICIiKQotICAgICAgICAgKyAidXNpbmcgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbjtcbiI7Ci19Ci0KLXN0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OmNzaGFycF90aHJpZnRfdXNpbmdzKCkgewotICByZXR1cm4gc3RyaW5nKCkgKyAidXNpbmcgVGhyaWZ0LlByb3RvY29sO1xuIiArICJ1c2luZyBUaHJpZnQuVHJhbnNwb3J0O1xuIjsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKLX0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKLSAgKHZvaWQpdHR5cGVkZWY7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKLSAgc3RyaW5nIGZfZW51bV9uYW1lID0gbmFtZXNwYWNlX2Rpcl8gKyAiLyIgKyAodGVudW0tPmdldF9uYW1lKCkpICsgIi5jcyI7Ci0gIG9mc3RyZWFtIGZfZW51bTsKLSAgZl9lbnVtLm9wZW4oZl9lbnVtX25hbWUuY19zdHIoKSk7Ci0KLSAgZl9lbnVtIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7Ci0KLSAgc3RhcnRfY3NoYXJwX25hbWVzcGFjZShmX2VudW0pOwotCi0gIGdlbmVyYXRlX2NzaGFycF9kb2MoZl9lbnVtLCB0ZW51bSk7Ci0KLSAgaW5kZW50KGZfZW51bSkgPDwgInB1YmxpYyBlbnVtICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIlxuIjsKLSAgc2NvcGVfdXAoZl9lbnVtKTsKLQotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfY3NoYXJwX2RvYyhmX2VudW0sICpjX2l0ZXIpOwotCi0gICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICBpbmRlbnQoZl9lbnVtKSA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgdmFsdWUgPDwgIiwiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKGZfZW51bSk7Ci0KLSAgZW5kX2NzaGFycF9uYW1lc3BhY2UoZl9lbnVtKTsKLQotICBmX2VudW0uY2xvc2UoKTsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKSB7Ci0gIGlmIChjb25zdHMuZW1wdHkoKSkgewotICAgIHJldHVybjsKLSAgfQotICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IG5hbWVzcGFjZV9kaXJfICsgJy8nICsgcHJvZ3JhbV9uYW1lXyArICIuQ29uc3RhbnRzLmNzIjsKLSAgb2ZzdHJlYW0gZl9jb25zdHM7Ci0gIGZfY29uc3RzLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKLQotICBmX2NvbnN0cyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBjc2hhcnBfdHlwZV91c2luZ3MoKSA8PCBlbmRsOwotCi0gIHN0YXJ0X2NzaGFycF9uYW1lc3BhY2UoZl9jb25zdHMpOwotCi0gIGluZGVudChmX2NvbnN0cykgPDwgInB1YmxpYyBzdGF0aWMgY2xhc3MgIiA8PCBtYWtlX3ZhbGlkX2NzaGFycF9pZGVudGlmaWVyKHByb2dyYW1fbmFtZV8pCi0gICAgICAgICAgICAgICAgICAgPDwgIkNvbnN0YW50cyIgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9jb25zdHMpOwotCi0gIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgYm9vbCBuZWVkX3N0YXRpY19jb25zdHJ1Y3RvciA9IGZhbHNlOwotICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGdlbmVyYXRlX2NzaGFycF9kb2MoZl9jb25zdHMsICgqY19pdGVyKSk7Ci0gICAgaWYgKHByaW50X2NvbnN0X3ZhbHVlKGZfY29uc3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpKSB7Ci0gICAgICBuZWVkX3N0YXRpY19jb25zdHJ1Y3RvciA9IHRydWU7Ci0gICAgfQotICB9Ci0KLSAgaWYgKG5lZWRfc3RhdGljX2NvbnN0cnVjdG9yKSB7Ci0gICAgcHJpbnRfY29uc3RfY29uc3RydWN0b3IoZl9jb25zdHMsIGNvbnN0cyk7Ci0gIH0KLQotICBzY29wZV9kb3duKGZfY29uc3RzKTsKLSAgZW5kX2NzaGFycF9uYW1lc3BhY2UoZl9jb25zdHMpOwotICBmX2NvbnN0cy5jbG9zZSgpOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfZGVmX3ZhbHVlKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcoKHRfc3RydWN0Kil0eXBlKTsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgdF9maWVsZCogZmllbGQgPSBOVUxMOwotICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKLSAgICAgICAgICBmaWVsZCA9ICgqZl9pdGVyKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGZpZWxkID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgIH0KLSAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IGZpZWxkLT5nZXRfdHlwZSgpOwotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi4iIDw8IHByb3BfbmFtZShmaWVsZCkgPDwgIiA9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLSAgICBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcoKHRfc3RydWN0Kil0eXBlKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwga3R5cGUsIHZfaXRlci0+Zmlyc3QpOwotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICJbIiA8PCBrZXkgPDwgIl0iCi0gICAgICAgICAgICAgICAgICA8PCAiID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgewotICAgIHRfdHlwZSogZXR5cGU7Ci0gICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9IGVsc2UgewotICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0KLQotICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGV0eXBlLCAqdl9pdGVyKTsKLSAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi5BZGQoIiA8PCB2YWwgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfY29uc3RydWN0b3Ioc3RkOjpvZnN0cmVhbSYgb3V0LCBzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKSB7Ci0gIGluZGVudChvdXQpIDw8ICJzdGF0aWMgIiA8PCBtYWtlX3ZhbGlkX2NzaGFycF9pZGVudGlmaWVyKHByb2dyYW1fbmFtZV8pLmNfc3RyKCkgPDwgIkNvbnN0YW50cygpIgotICAgICAgICAgICAgICA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgc3RyaW5nIG5hbWUgPSAoKmNfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgdF90eXBlKiB0eXBlID0gKCpjX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLQotICAgIHByaW50X2NvbnN0X2RlZl92YWx1ZShvdXQsIG5hbWUsIHR5cGUsIHZhbHVlKTsKLSAgfQotICBzY29wZV9kb3duKG91dCk7Ci19Ci0KLS8vIGl0IHNlZW1zIGxpa2UgYWxsIHRoYXQgbWV0aG9kcyB0aGF0IGNhbGwgdGhpcyBhcmUgdXNpbmcgaW5fc3RhdGljIHRvIGJlIHRoZSBvcHBvc2l0ZSBvZiB3aGF0IGl0Ci0vLyB3b3VsZCBpbXBseQotYm9vbCB0X2NzaGFycF9nZW5lcmF0b3I6OnByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9zdGF0aWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWZ2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBuZWVkdHlwZSkgewotICBpbmRlbnQob3V0KTsKLSAgYm9vbCBuZWVkX3N0YXRpY19jb25zdHJ1Y3Rpb24gPSAhaW5fc3RhdGljOwotICB3aGlsZSAodHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgdHlwZSA9ICgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKTsKLSAgfQotCi0gIGlmICghZGVmdmFsIHx8IG5lZWR0eXBlKSB7Ci0gICAgb3V0IDw8IChpbl9zdGF0aWMgPyAiIiA6IHR5cGUtPmlzX2Jhc2VfdHlwZSgpID8gInB1YmxpYyBjb25zdCAiIDogInB1YmxpYyBzdGF0aWMgIikKLSAgICAgICAgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIjsKLSAgfQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICBzdHJpbmcgdjIgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSk7Ci0gICAgb3V0IDw8IG5hbWUgPDwgIiA9ICIgPDwgdjIgPDwgIjsiIDw8IGVuZGw7Ci0gICAgbmVlZF9zdGF0aWNfY29uc3RydWN0aW9uID0gZmFsc2U7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgb3V0IDw8IG5hbWUgPDwgIiA9ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiLiIgPDwgdmFsdWUtPmdldF9pZGVudGlmaWVyX25hbWUoKQotICAgICAgICA8PCAiOyIgPDwgZW5kbDsKLSAgICBuZWVkX3N0YXRpY19jb25zdHJ1Y3Rpb24gPSBmYWxzZTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgb3V0IDw8IG5hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgb3V0IDw8IG5hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgewotICAgIG91dCA8PCBuYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIigpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGlmIChkZWZ2YWwgJiYgIXR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICF0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBwcmludF9jb25zdF9kZWZfdmFsdWUob3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSk7Ci0gIH0KLQotICByZXR1cm4gbmVlZF9zdGF0aWNfY29uc3RydWN0aW9uOwotfQotCi1zdGQ6OnN0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZShvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewotICAodm9pZCluYW1lOwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVuZGVyOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZW5kZXIgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmVuZGVyIDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmVuZGVyIDw8IHR5cGUtPmdldF9uYW1lKCkgPDwgIi4iIDw8IHZhbHVlLT5nZXRfaWRlbnRpZmllcl9uYW1lKCk7Ci0gIH0gZWxzZSB7Ci0gICAgc3RyaW5nIHQgPSB0bXAoInRtcCIpOwotICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwgdCwgdHlwZSwgdmFsdWUsIHRydWUsIHRydWUsIHRydWUpOwotICAgIHJlbmRlciA8PCB0OwotICB9Ci0KLSAgcmV0dXJuIHJlbmRlci5zdHIoKTsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBpZiAodW5pb25fICYmIHRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9jc2hhcnBfdW5pb24odHN0cnVjdCk7Ci0gIH0gZWxzZSB7Ci0gICAgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Ci0gIH0KLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgc3RyaW5nIGZfc3RydWN0X25hbWUgPSBuYW1lc3BhY2VfZGlyXyArICIvIiArICh0c3RydWN0LT5nZXRfbmFtZSgpKSArICIuY3MiOwotICBvZnN0cmVhbSBmX3N0cnVjdDsKLQotICBmX3N0cnVjdC5vcGVuKGZfc3RydWN0X25hbWUuY19zdHIoKSk7Ci0KLSAgZl9zdHJ1Y3QgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgY3NoYXJwX3R5cGVfdXNpbmdzKCkgPDwgY3NoYXJwX3RocmlmdF91c2luZ3MoKSA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3N0cnVjdCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKLQotICBmX3N0cnVjdC5jbG9zZSgpOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9kZWZpbml0aW9uKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQpIHsKLQotICBpZiAoIWluX2NsYXNzKSB7Ci0gICAgc3RhcnRfY3NoYXJwX25hbWVzcGFjZShvdXQpOwotICB9Ci0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfY3NoYXJwX2RvYyhvdXQsIHRzdHJ1Y3QpOwotICBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcodHN0cnVjdCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgIiNpZiAhU0lMVkVSTElHSFQiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJbU2VyaWFsaXphYmxlXSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiNlbmRpZiIgPDwgZW5kbDsKLSAgaWYgKChzZXJpYWxpemVfIHx8IHdjZl8pICYmICFpc19leGNlcHRpb24pIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiW0RhdGFDb250cmFjdChOYW1lc3BhY2U9XCIiIDw8IHdjZl9uYW1lc3BhY2VfIDw8ICJcIildIgotICAgICAgICAgICAgICAgIDw8IGVuZGw7IC8vIGRvIG5vdCBtYWtlIGV4Y2VwdGlvbiBjbGFzc2VzIGRpcmVjdGx5IFdDRiBzZXJpYWxpemFibGUsIHdlIHByb3ZpZGUgYQotICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlcGFyYXRlICJmYXVsdCIgZm9yIHRoYXQKLSAgfQotICBib29sIGlzX2ZpbmFsID0gKHRzdHJ1Y3QtPmFubm90YXRpb25zXy5maW5kKCJmaW5hbCIpICE9IHRzdHJ1Y3QtPmFubm90YXRpb25zXy5lbmQoKSk7Ci0KLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IChpc19maW5hbCA/ICJzZWFsZWQgIiA6ICIiKSA8PCAicGFydGlhbCBjbGFzcyAiCi0gICAgICAgICAgICAgIDw8IG5vcm1hbGl6ZV9uYW1lKHRzdHJ1Y3QtPmdldF9uYW1lKCkpIDw8ICIgOiAiOwotCi0gIGlmIChpc19leGNlcHRpb24pIHsKLSAgICBvdXQgPDwgIlRFeGNlcHRpb24sICI7Ci0gIH0KLSAgb3V0IDw8ICJUQmFzZSI7Ci0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgc2NvcGVfdXAob3V0KTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIC8vIG1ha2UgcHJpdmF0ZSBtZW1iZXJzIHdpdGggcHVibGljIFByb3BlcnRpZXMKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIC8vIGlmIHRoZSBmaWVsZCBpcyByZXF1aWVkLCB0aGVuIHdlIHVzZSBhdXRvLXByb3BlcnRpZXMKLSAgICBpZiAoIWZpZWxkX2lzX3JlcXVpcmVkKCgqbV9pdGVyKSkgJiYgKCFudWxsYWJsZV8gfHwgZmllbGRfaGFzX2RlZmF1bHQoKCptX2l0ZXIpKSkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJwcml2YXRlICIgPDwgZGVjbGFyZV9maWVsZCgqbV9pdGVyLCBmYWxzZSwgIl8iKSA8PCBlbmRsOwotICAgIH0KLSAgfQotICBvdXQgPDwgZW5kbDsKLQotICBib29sIGhhc19ub25fcmVxdWlyZWRfZmllbGRzID0gZmFsc2U7Ci0gIGJvb2wgaGFzX25vbl9yZXF1aXJlZF9kZWZhdWx0X3ZhbHVlX2ZpZWxkcyA9IGZhbHNlOwotICBib29sIGhhc19yZXF1aXJlZF9maWVsZHMgPSBmYWxzZTsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGdlbmVyYXRlX2NzaGFycF9kb2Mob3V0LCAqbV9pdGVyKTsKLSAgICBnZW5lcmF0ZV9wcm9wZXJ0eShvdXQsICptX2l0ZXIsIHRydWUsIHRydWUpOwotICAgIGJvb2wgaXNfcmVxdWlyZWQgPSBmaWVsZF9pc19yZXF1aXJlZCgoKm1faXRlcikpOwotICAgIGJvb2wgaGFzX2RlZmF1bHQgPSBmaWVsZF9oYXNfZGVmYXVsdCgoKm1faXRlcikpOwotICAgIGlmIChpc19yZXF1aXJlZCkgewotICAgICAgaGFzX3JlcXVpcmVkX2ZpZWxkcyA9IHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChoYXNfZGVmYXVsdCkgewotICAgICAgICBoYXNfbm9uX3JlcXVpcmVkX2RlZmF1bHRfdmFsdWVfZmllbGRzID0gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGhhc19ub25fcmVxdWlyZWRfZmllbGRzID0gdHJ1ZTsKLSAgICB9Ci0gIH0KLQotICBib29sIGdlbmVyYXRlX2lzc2V0ID0gKG51bGxhYmxlXyAmJiBoYXNfbm9uX3JlcXVpcmVkX2RlZmF1bHRfdmFsdWVfZmllbGRzKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgKCFudWxsYWJsZV8gJiYgaGFzX25vbl9yZXF1aXJlZF9maWVsZHMpOwotICBpZiAoZ2VuZXJhdGVfaXNzZXQpIHsKLSAgICBvdXQgPDwgZW5kbDsKLSAgICBpZiAoc2VyaWFsaXplXyB8fCB3Y2ZfKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltYbWxJZ25vcmVdIC8vIFhtbFNlcmlhbGl6ZXIiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICA8PCAiW0RhdGFNZW1iZXIoT3JkZXIgPSAxKV0gIC8vIFhtbE9iamVjdFNlcmlhbGl6ZXIsIERhdGFDb250cmFjdEpzb25TZXJpYWxpemVyLCBldGMuIgotICAgICAgICAgIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIElzc2V0IF9faXNzZXQ7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIjaWYgIVNJTFZFUkxJR0hUIiA8PCBlbmRsCi0gICAgICAgIDw8IGluZGVudCgpIDw8ICJbU2VyaWFsaXphYmxlXSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiI2VuZGlmIiA8PCBlbmRsOwotICAgIGlmIChzZXJpYWxpemVfIHx8IHdjZl8pIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJbRGF0YUNvbnRyYWN0XSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBzdHJ1Y3QgSXNzZXQgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBib29sIGlzX3JlcXVpcmVkID0gZmllbGRfaXNfcmVxdWlyZWQoKCptX2l0ZXIpKTsKLSAgICAgIGJvb2wgaGFzX2RlZmF1bHQgPSBmaWVsZF9oYXNfZGVmYXVsdCgoKm1faXRlcikpOwotICAgICAgLy8gaWYgaXQgaXMgcmVxdWlyZWQsIGRvbid0IG5lZWQgSXNzZXQgZm9yIHRoYXQgdmFyaWFibGUKLSAgICAgIC8vIGlmIGl0IGlzIG5vdCByZXF1aXJlZCwgaWYgaXQgaGFzIGEgZGVmYXVsdCB2YWx1ZSwgd2UgbmVlZCB0byBnZW5lcmF0ZSBJc3NldAotICAgICAgLy8gaWYgd2UgYXJlIG5vdCBudWxsYWJsZSwgdGhlbiB3ZSBnZW5lcmF0ZSBJc3NldAotICAgICAgaWYgKCFpc19yZXF1aXJlZCAmJiAoIW51bGxhYmxlXyB8fCBoYXNfZGVmYXVsdCkpIHsKLSAgICAgICAgaWYgKHNlcmlhbGl6ZV8gfHwgd2NmXykgewotICAgICAgICAgIGluZGVudChvdXQpIDw8ICJbRGF0YU1lbWJlcl0iIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBib29sICIgPDwgbm9ybWFsaXplX25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICBpZiAoZ2VuZXJhdGVfaXNzZXQgJiYgKHNlcmlhbGl6ZV8gfHwgd2NmXykpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICIjcmVnaW9uIFhtbFNlcmlhbGl6ZXIgc3VwcG9ydCIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICAgIGJvb2wgaXNfcmVxdWlyZWQgPSBmaWVsZF9pc19yZXF1aXJlZCgoKm1faXRlcikpOwotICAgICAgICBib29sIGhhc19kZWZhdWx0ID0gZmllbGRfaGFzX2RlZmF1bHQoKCptX2l0ZXIpKTsKLSAgICAgICAgLy8gaWYgaXQgaXMgcmVxdWlyZWQsIGRvbid0IG5lZWQgSXNzZXQgZm9yIHRoYXQgdmFyaWFibGUKLSAgICAgICAgLy8gaWYgaXQgaXMgbm90IHJlcXVpcmVkLCBpZiBpdCBoYXMgYSBkZWZhdWx0IHZhbHVlLCB3ZSBuZWVkIHRvIGdlbmVyYXRlIElzc2V0Ci0gICAgICAgIC8vIGlmIHdlIGFyZSBub3QgbnVsbGFibGUsIHRoZW4gd2UgZ2VuZXJhdGUgSXNzZXQKLSAgICAgICAgaWYgKCFpc19yZXF1aXJlZCAmJiAoIW51bGxhYmxlXyB8fCBoYXNfZGVmYXVsdCkpIHsKLSAgICAgICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGJvb2wgU2hvdWxkU2VyaWFsaXplIiA8PCBwcm9wX25hbWUoKCptX2l0ZXIpKSA8PCAiKCkiIDw8IGVuZGw7Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7Ci0gICAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiBfX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaW5kZW50KG91dCkgPDwgIiNlbmRyZWdpb24gWG1sU2VyaWFsaXplciBzdXBwb3J0IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgLy8gV2UgYWx3YXlzIHdhbnQgYSBkZWZhdWx0LCBubyBhcmd1bWVudCBjb25zdHJ1Y3RvciBmb3IgUmVhZGluZwotICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgbm9ybWFsaXplX25hbWUodHN0cnVjdC0+Z2V0X25hbWUoKSkgPDwgIigpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X3R5cGUqIHQgPSAoKm1faXRlciktPmdldF90eXBlKCk7Ci0gICAgd2hpbGUgKHQtPmlzX3R5cGVkZWYoKSkgewotICAgICAgdCA9ICgodF90eXBlZGVmKil0KS0+Z2V0X3R5cGUoKTsKLSAgICB9Ci0gICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgewotICAgICAgaWYgKGZpZWxkX2lzX3JlcXVpcmVkKCgqbV9pdGVyKSkpIHsKLSAgICAgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCAidGhpcy4iICsgcHJvcF9uYW1lKCptX2l0ZXIpLCB0LCAoKm1faXRlciktPmdldF92YWx1ZSgpLCB0cnVlLCB0cnVlKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMuXyIgKyAoKm1faXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwotICAgICAgICAvLyBPcHRpb25hbHMgd2l0aCBkZWZhdWx0cyBhcmUgbWFya2VkIHNldAotICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy5fX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiID0gdHJ1ZTsiCi0gICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaWYgKGhhc19yZXF1aXJlZF9maWVsZHMpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCI7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgaWYgKGZpZWxkX2lzX3JlcXVpcmVkKCgqbV9pdGVyKSkpIHsKLSAgICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBvdXQgPDwgIiwgIjsKLSAgICAgICAgfQotICAgICAgICBvdXQgPDwgdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgb3V0IDw8ICIpIDogdGhpcygpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBpZiAoZmllbGRfaXNfcmVxdWlyZWQoKCptX2l0ZXIpKSkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IHByb3BfbmFtZSgoKm1faXRlcikpIDw8ICIgPSAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIKLSAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLQotICBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOwotICBpZiAoaXNfcmVzdWx0KSB7Ci0gICAgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG91dCwgdHN0cnVjdCk7Ci0gIH0gZWxzZSB7Ci0gICAgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKLSAgfQotICBpZiAoaGFzaGNvZGVfKSB7Ci0gICAgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9lcXVhbHMob3V0LCB0c3RydWN0KTsKLSAgICBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X2hhc2hjb2RlKG91dCwgdHN0cnVjdCk7Ci0gIH0KLSAgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF90b3N0cmluZyhvdXQsIHRzdHJ1Y3QpOwotICBzY29wZV9kb3duKG91dCk7Ci0gIG91dCA8PCBlbmRsOwotCi0gIC8vIGdlbmVyYXRlIGEgY29ycmVzcG9uZGluZyBXQ0YgZmF1bHQgdG8gd3JhcCB0aGUgZXhjZXB0aW9uCi0gIGlmICgoc2VyaWFsaXplXyB8fCB3Y2ZfKSAmJiBpc19leGNlcHRpb24pIHsKLSAgICBnZW5lcmF0ZV9jc2hhcnBfd2NmZmF1bHQob3V0LCB0c3RydWN0KTsKLSAgfQotCi0gIGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZyh0c3RydWN0KTsKLSAgaWYgKCFpbl9jbGFzcykgewotICAgIGVuZF9jc2hhcnBfbmFtZXNwYWNlKG91dCk7Ci0gIH0KLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF93Y2ZmYXVsdChvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBvdXQgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiNpZiAhU0lMVkVSTElHSFQiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJbU2VyaWFsaXphYmxlXSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiNlbmRpZiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIltEYXRhQ29udHJhY3RdIiA8PCBlbmRsOwotICBib29sIGlzX2ZpbmFsID0gKHRzdHJ1Y3QtPmFubm90YXRpb25zXy5maW5kKCJmaW5hbCIpICE9IHRzdHJ1Y3QtPmFubm90YXRpb25zXy5lbmQoKSk7Ci0KLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IChpc19maW5hbCA/ICJzZWFsZWQgIiA6ICIiKSA8PCAicGFydGlhbCBjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgPDwgIkZhdWx0IiA8PCBlbmRsOwotCi0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICAvLyBtYWtlIHByaXZhdGUgbWVtYmVycyB3aXRoIHB1YmxpYyBQcm9wZXJ0aWVzCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSAiIDw8IGRlY2xhcmVfZmllbGQoKm1faXRlciwgZmFsc2UsICJfIikgPDwgZW5kbDsKLSAgfQotICBvdXQgPDwgZW5kbDsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfcHJvcGVydHkob3V0LCAqbV9pdGVyLCB0cnVlLCBmYWxzZSk7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci0gIG91dCA8PCBlbmRsOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9yZWFkZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIFJlYWQgKFRQcm90b2NvbCBpcHJvdCkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICJpcHJvdC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ0cnkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIC8vIFJlcXVpcmVkIHZhcmlhYmxlcyBhcmVuJ3QgaW4gX19pc3NldCwgc28gd2UgbmVlZCB0bXAgdmFycyB0byBjaGVjayB0aGVtCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpZWxkX2lzX3JlcXVpcmVkKCgqZl9pdGVyKSkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJib29sIGlzc2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBmYWxzZTsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwgIlRGaWVsZCBmaWVsZDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlwcm90LlJlYWRTdHJ1Y3RCZWdpbigpOyIgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAid2hpbGUgKHRydWUpIiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotCi0gIGluZGVudChvdXQpIDw8ICJmaWVsZCA9IGlwcm90LlJlYWRGaWVsZEJlZ2luKCk7IiA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGQuVHlwZSA9PSBUVHlwZS5TdG9wKSB7ICIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJicmVhazsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkLklEKSIgPDwgZW5kbDsKLQotICBzY29wZV91cChvdXQpOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgYm9vbCBpc19yZXF1aXJlZCA9IGZpZWxkX2lzX3JlcXVpcmVkKCgqZl9pdGVyKSk7Ci0gICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGZpZWxkLlR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyKTsKLSAgICBpZiAoaXNfcmVxdWlyZWQpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpc3NldF8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gdHJ1ZTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7ICIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBUUHJvdG9jb2xVdGlsLlNraXAoaXByb3QsIGZpZWxkLlR5cGUpOyIKLSAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDogIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgIlRQcm90b2NvbFV0aWwuU2tpcChpcHJvdCwgZmllbGQuVHlwZSk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiYnJlYWs7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICBpbmRlbnQob3V0KSA8PCAiaXByb3QuUmVhZEZpZWxkRW5kKCk7IiA8PCBlbmRsOwotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICBpbmRlbnQob3V0KSA8PCAiaXByb3QuUmVhZFN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaWVsZF9pc19yZXF1aXJlZCgoKmZfaXRlcikpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFpc3NldF8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwgInRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICB9Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiZmluYWxseSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJpcHJvdC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIGluZGVudF9kb3duKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9zdHJ1Y3Rfd3JpdGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIHZvaWQgV3JpdGUoVFByb3RvY29sIG9wcm90KSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3QuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAidHJ5IiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotCi0gIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBpbmRlbnQob3V0KSA8PCAiVFN0cnVjdCBzdHJ1YyA9IG5ldyBUU3RydWN0KFwiIiA8PCBuYW1lIDw8ICJcIik7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAib3Byb3QuV3JpdGVTdHJ1Y3RCZWdpbihzdHJ1Yyk7IiA8PCBlbmRsOwotCi0gIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgewotICAgIGluZGVudChvdXQpIDw8ICJURmllbGQgZmllbGQgPSBuZXcgVEZpZWxkKCk7IiA8PCBlbmRsOwotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICBib29sIGlzX3JlcXVpcmVkID0gZmllbGRfaXNfcmVxdWlyZWQoKCpmX2l0ZXIpKTsKLSAgICAgIGJvb2wgaGFzX2RlZmF1bHQgPSBmaWVsZF9oYXNfZGVmYXVsdCgoKmZfaXRlcikpOwotICAgICAgaWYgKG51bGxhYmxlXyAmJiAhaGFzX2RlZmF1bHQgJiYgIWlzX3JlcXVpcmVkKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiICE9IG51bGwpIHsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgfSBlbHNlIGlmICghaXNfcmVxdWlyZWQpIHsKLSAgICAgICAgYm9vbCBudWxsX2FsbG93ZWQgPSB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgICAgIGlmIChudWxsX2FsbG93ZWQpIHsKLSAgICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIiAhPSBudWxsICYmIF9faXNzZXQuIgotICAgICAgICAgICAgICAgICAgICAgIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKF9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGluZGVudChvdXQpIDw8ICJmaWVsZC5OYW1lID0gXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCI7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgImZpZWxkLlR5cGUgPSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICI7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgImZpZWxkLklEID0gIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oZmllbGQpOyIgPDwgZW5kbDsKLQotICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlcik7Ci0KLSAgICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOwotICAgICAgaWYgKCFpc19yZXF1aXJlZCkgewotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAib3Byb3QuV3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKLQotICBzY29wZV9kb3duKG91dCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiZmluYWxseSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIAotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCBXcml0ZShUUHJvdG9jb2wgb3Byb3QpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3QuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAidHJ5IiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotCi0gIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBpbmRlbnQob3V0KSA8PCAiVFN0cnVjdCBzdHJ1YyA9IG5ldyBUU3RydWN0KFwiIiA8PCBuYW1lIDw8ICJcIik7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAib3Byb3QuV3JpdGVTdHJ1Y3RCZWdpbihzdHJ1Yyk7IiA8PCBlbmRsOwotCi0gIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgewotICAgIGluZGVudChvdXQpIDw8ICJURmllbGQgZmllbGQgPSBuZXcgVEZpZWxkKCk7IiA8PCBlbmRsOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmICI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgIiBlbHNlIGlmICI7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChudWxsYWJsZV8pIHsKLSAgICAgICAgb3V0IDw8ICIodGhpcy4iIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIgIT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCAiKHRoaXMuX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGluZGVudF91cCgpOwotCi0gICAgICBib29sIG51bGxfYWxsb3dlZCA9ICFudWxsYWJsZV8gJiYgdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpOwotICAgICAgaWYgKG51bGxfYWxsb3dlZCkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIpIDw8ICIgIT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICB9Ci0KLSAgICAgIGluZGVudChvdXQpIDw8ICJmaWVsZC5OYW1lID0gXCIiIDw8IHByb3BfbmFtZSgqZl9pdGVyKSA8PCAiXCI7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgImZpZWxkLlR5cGUgPSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICI7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgImZpZWxkLklEID0gIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oZmllbGQpOyIgPDwgZW5kbDsKLQotICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlcik7Ci0KLSAgICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOwotCi0gICAgICBpZiAobnVsbF9hbGxvd2VkKSB7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iOwotICAgIH0KLSAgfQotCi0gIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC5Xcml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgPDwgIm9wcm90LldyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsOwotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJmaW5hbGx5IiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOwotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3N0cnVjdF90b3N0cmluZyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAicHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChvdXQpIDw8ICJTdHJpbmdCdWlsZGVyIF9fc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihcIiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKFwiKTsiCi0gICAgICAgICAgICAgIDw8IGVuZGw7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGJvb2wgdXNlRmlyc3RGbGFnID0gZmFsc2U7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKCFmaWVsZF9pc19yZXF1aXJlZCgoKmZfaXRlcikpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiYm9vbCBfX2ZpcnN0ID0gdHJ1ZTsiIDw8IGVuZGw7Ci0gICAgICB1c2VGaXJzdEZsYWcgPSB0cnVlOwotICAgIH0KLSAgICBicmVhazsKLSAgfQotCi0gIGJvb2wgaGFkX3JlcXVpcmVkID0gZmFsc2U7IC8vIHNldCB0byB0cnVlIGFmdGVyIGZpcnN0IHJlcXVpcmVkIGZpZWxkIGhhcyBiZWVuIHByb2Nlc3NlZAotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgYm9vbCBpc19yZXF1aXJlZCA9IGZpZWxkX2lzX3JlcXVpcmVkKCgqZl9pdGVyKSk7Ci0gICAgYm9vbCBoYXNfZGVmYXVsdCA9IGZpZWxkX2hhc19kZWZhdWx0KCgqZl9pdGVyKSk7Ci0gICAgaWYgKG51bGxhYmxlXyAmJiAhaGFzX2RlZmF1bHQgJiYgIWlzX3JlcXVpcmVkKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfSBlbHNlIGlmICghaXNfcmVxdWlyZWQpIHsKLSAgICAgIGJvb2wgbnVsbF9hbGxvd2VkID0gdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpOwotICAgICAgaWYgKG51bGxfYWxsb3dlZCkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIiAhPSBudWxsICYmIF9faXNzZXQuIgotICAgICAgICAgICAgICAgICAgICA8PCBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgImlmIChfX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAodXNlRmlyc3RGbGFnICYmICghaGFkX3JlcXVpcmVkKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgImlmKCFfX2ZpcnN0KSB7IF9fc2IuQXBwZW5kKFwiLCBcIik7IH0iIDw8IGVuZGw7Ci0gICAgICBpZiAoIWlzX3JlcXVpcmVkKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJfX2ZpcnN0ID0gZmFsc2U7IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgaW5kZW50KG91dCkgPDwgIl9fc2IuQXBwZW5kKFwiIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiOiBcIik7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiX19zYi5BcHBlbmQoXCIsICIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIjogXCIpOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICB0X3R5cGUqIHR0eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgIGlmICh0dHlwZS0+aXNfeGNlcHRpb24oKSB8fCB0dHlwZS0+aXNfc3RydWN0KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJfX3NiLkFwcGVuZCgiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpCi0gICAgICAgICAgICAgICAgICA8PCAiPT0gbnVsbCA/IFwiPG51bGw+XCIgOiAiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIuVG9TdHJpbmcoKSk7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiX19zYi5BcHBlbmQoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaWYgKCFpc19yZXF1aXJlZCkgewotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBoYWRfcmVxdWlyZWQgPSB0cnVlOyAvLyBub3cgX19maXJzdCBtdXN0IGJlIGZhbHNlLCBzbyB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIGl0IGFueW1vcmUKLSAgICB9Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAiX19zYi5BcHBlbmQoXCIpXCIpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInJldHVybiBfX3NiLlRvU3RyaW5nKCk7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfdW5pb24odF9zdHJ1Y3QqIHR1bmlvbikgewotICBzdHJpbmcgZl91bmlvbl9uYW1lID0gbmFtZXNwYWNlX2Rpcl8gKyAiLyIgKyAodHVuaW9uLT5nZXRfbmFtZSgpKSArICIuY3MiOwotICBvZnN0cmVhbSBmX3VuaW9uOwotCi0gIGZfdW5pb24ub3BlbihmX3VuaW9uX25hbWUuY19zdHIoKSk7Ci0KLSAgZl91bmlvbiA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBjc2hhcnBfdHlwZV91c2luZ3MoKSA8PCBjc2hhcnBfdGhyaWZ0X3VzaW5ncygpIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfY3NoYXJwX3VuaW9uX2RlZmluaXRpb24oZl91bmlvbiwgdHVuaW9uKTsKLQotICBmX3VuaW9uLmNsb3NlKCk7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfdW5pb25fZGVmaW5pdGlvbihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0dW5pb24pIHsKLSAgLy8gTGV0J3MgZGVmaW5lIHRoZSBjbGFzcyBmaXJzdAotICBzdGFydF9jc2hhcnBfbmFtZXNwYWNlKG91dCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBhYnN0cmFjdCBwYXJ0aWFsIGNsYXNzICIgPDwgdHVuaW9uLT5nZXRfbmFtZSgpIDw8ICIgOiBUQWJzdHJhY3RCYXNlIHsiCi0gICAgICAgICAgICAgIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlKFRQcm90b2NvbCBwcm90b2NvbCk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicHVibGljIHJlYWRvbmx5IGJvb2wgSXNzZXQ7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicHVibGljIGFic3RyYWN0IG9iamVjdCBEYXRhIHsgZ2V0OyB9IiA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJwcm90ZWN0ZWQgIiA8PCB0dW5pb24tPmdldF9uYW1lKCkgPDwgIihib29sIGlzc2V0KSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgIklzc2V0ID0gaXNzZXQ7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgY2xhc3MgX19fdW5kZWZpbmVkIDogIiA8PCB0dW5pb24tPmdldF9uYW1lKCkgPDwgIiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQob3V0KSA8PCAicHVibGljIG92ZXJyaWRlIG9iamVjdCBEYXRhIHsgZ2V0IHsgcmV0dXJuIG51bGw7IH0gfSIgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAicHVibGljIF9fX3VuZGVmaW5lZCgpIDogYmFzZShmYWxzZSkge30iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAicHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGUoVFByb3RvY29sIHByb3RvY29sKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgInRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsIFwiQ2Fubm90IHBlcnNpc3QgIgotICAgICAgICAgICAgICAgICAiYW4gdW5pb24gdHlwZSB3aGljaCBpcyBub3Qgc2V0LlwiKTsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0dW5pb24tPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGdlbmVyYXRlX2NzaGFycF91bmlvbl9jbGFzcyhvdXQsIHR1bmlvbiwgKCpmX2l0ZXIpKTsKLSAgfQotCi0gIGdlbmVyYXRlX2NzaGFycF91bmlvbl9yZWFkZXIob3V0LCB0dW5pb24pOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZW5kX2NzaGFycF9uYW1lc3BhY2Uob3V0KTsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF91bmlvbl9jbGFzcyhzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0dW5pb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCkgewotICBpbmRlbnQob3V0KSA8PCAicHVibGljIGNsYXNzICIgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgOiAiIDw8IHR1bmlvbi0+Z2V0X25hbWUoKSA8PCAiIHsiCi0gICAgICAgICAgICAgIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSAiIDw8IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpIDw8ICIgX2RhdGE7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicHVibGljIG92ZXJyaWRlIG9iamVjdCBEYXRhIHsgZ2V0IHsgcmV0dXJuIF9kYXRhOyB9IH0iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIigiIDw8IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpCi0gICAgICAgICAgICAgIDw8ICIgZGF0YSkgOiBiYXNlKHRydWUpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAidGhpcy5fZGF0YSA9IGRhdGE7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlKFRQcm90b2NvbCBvcHJvdCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ0cnkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgIlRTdHJ1Y3Qgc3RydWMgPSBuZXcgVFN0cnVjdChcIiIgPDwgdHVuaW9uLT5nZXRfbmFtZSgpIDw8ICJcIik7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAib3Byb3QuV3JpdGVTdHJ1Y3RCZWdpbihzdHJ1Yyk7IiA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJURmllbGQgZmllbGQgPSBuZXcgVEZpZWxkKCk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiZmllbGQuTmFtZSA9IFwiIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIlwiOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgImZpZWxkLlR5cGUgPSAiIDw8IHR5cGVfdG9fZW51bSh0ZmllbGQtPmdldF90eXBlKCkpIDw8ICI7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiZmllbGQuSUQgPSAiIDw8IHRmaWVsZC0+Z2V0X2tleSgpIDw8ICI7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAib3Byb3QuV3JpdGVGaWVsZEJlZ2luKGZpZWxkKTsiIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgdGZpZWxkLCAiX2RhdGEiLCB0cnVlLCB0cnVlKTsKLQotICBpbmRlbnQob3V0KSA8PCAib3Byb3QuV3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIm9wcm90LldyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAib3Byb3QuV3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgImZpbmFsbHkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9lcXVhbHMob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3QgdGhhdCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgInZhciBvdGhlciA9IHRoYXQgYXMgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIjsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJpZiAob3RoZXIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgImlmIChSZWZlcmVuY2VFcXVhbHModGhpcywgb3RoZXIpKSByZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGJvb2wgZmlyc3QgPSB0cnVlOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiAiOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiYmICI7Ci0gICAgfQotICAgIGlmICghZmllbGRfaXNfcmVxdWlyZWQoKCpmX2l0ZXIpKSAmJiAhKG51bGxhYmxlXyAmJiAhZmllbGRfaGFzX2RlZmF1bHQoKCpmX2l0ZXIpKSkpIHsKLSAgICAgIG91dCA8PCAiKChfX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiID09IG90aGVyLl9faXNzZXQuIgotICAgICAgICAgIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIikgJiYgKCghX19pc3NldC4iCi0gICAgICAgICAgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKSB8fCAoIjsKLSAgICB9Ci0gICAgdF90eXBlKiB0dHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8ICh0dHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgKCgodF9iYXNlX3R5cGUqKXR0eXBlKS0+aXNfYmluYXJ5KCkpKSkgewotICAgICAgb3V0IDw8ICJUQ29sbGVjdGlvbnMuRXF1YWxzKCI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCAiU3lzdGVtLk9iamVjdC5FcXVhbHMoIjsKLSAgICB9Ci0gICAgb3V0IDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIsIG90aGVyLiIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIikiOwotICAgIGlmICghZmllbGRfaXNfcmVxdWlyZWQoKCpmX2l0ZXIpKSAmJiAhKG51bGxhYmxlXyAmJiAhZmllbGRfaGFzX2RlZmF1bHQoKCpmX2l0ZXIpKSkpIHsKLSAgICAgIG91dCA8PCAiKSkpIjsKLSAgICB9Ci0gIH0KLSAgaWYgKGZpcnN0KSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInJldHVybiB0cnVlOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBvdXQgPDwgIjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X2hhc2hjb2RlKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgImludCBoYXNoY29kZSA9IDA7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAidW5jaGVja2VkIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfdHlwZSogdHR5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgImhhc2hjb2RlID0gKGhhc2hjb2RlICogMzk3KSBeICI7Ci0gICAgaWYgKGZpZWxkX2lzX3JlcXVpcmVkKCgqZl9pdGVyKSkpIHsKLSAgICAgIG91dCA8PCAiKCI7Ci0gICAgfSBlbHNlIGlmIChudWxsYWJsZV8pIHsKLSAgICAgIG91dCA8PCAiKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIiA9PSBudWxsID8gMCA6ICI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCAiKCFfX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiID8gMCA6ICI7Ci0gICAgfQotICAgIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICAgIG91dCA8PCAiKFRDb2xsZWN0aW9ucy5HZXRIYXNoQ29kZSgiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIpKSI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCAiKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIi5HZXRIYXNoQ29kZSgpKSI7Ci0gICAgfQotICAgIG91dCA8PCAiKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInJldHVybiBoYXNoY29kZTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBuYW1lc3BhY2VfZGlyXyArICIvIiArIHNlcnZpY2VfbmFtZV8gKyAiLmNzIjsKLSAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOwotCi0gIGZfc2VydmljZV8gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgY3NoYXJwX3R5cGVfdXNpbmdzKCkgPDwgY3NoYXJwX3RocmlmdF91c2luZ3MoKSA8PCBlbmRsOwotCi0gIHN0YXJ0X2NzaGFycF9uYW1lc3BhY2UoZl9zZXJ2aWNlXyk7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgcGFydGlhbCBjbGFzcyAiIDw8IG5vcm1hbGl6ZV9uYW1lKHNlcnZpY2VfbmFtZV8pIDw8ICIgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKLQotICBpbmRlbnRfZG93bigpOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKLSAgZW5kX2NzaGFycF9uYW1lc3BhY2UoZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8uY2xvc2UoKTsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfaWZhY2UgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX2lmYWNlID0gIiA6ICIgKyBleHRlbmRzICsgIi5JZmFjZSI7Ci0gIH0KLQotICBnZW5lcmF0ZV9jc2hhcnBfZG9jKGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKLQotICBpZiAod2NmXykgewotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiW1NlcnZpY2VDb250cmFjdChOYW1lc3BhY2U9XCIiIDw8IHdjZl9uYW1lc3BhY2VfIDw8ICJcIildIiA8PCBlbmRsOwotICB9Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGludGVyZmFjZSBJZmFjZSIgPDwgZXh0ZW5kc19pZmFjZSA8PCAiIHsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGdlbmVyYXRlX2NzaGFycF9kb2MoZl9zZXJ2aWNlXywgKmZfaXRlcik7Ci0KLSAgICAvLyBpZiB3ZSdyZSB1c2luZyBXQ0YsIGFkZCB0aGUgY29ycmVzcG9uZGluZyBhdHRyaWJ1dGVzCi0gICAgaWYgKHdjZl8pIHsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiW09wZXJhdGlvbkNvbnRyYWN0XSIgPDwgZW5kbDsKLQotICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKTsKLSAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiW0ZhdWx0Q29udHJhY3QodHlwZW9mKCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSArICJGYXVsdCkpXSIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8ICI7IiA8PCBlbmRsOwotICAgIGlmICghYXN5bmNfKSB7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiNpZiBTSUxWRVJMSUdIVCIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luY19iZWdpbigqZl9pdGVyLCAiQmVnaW5fIikgPDwgIjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luY19lbmQoKmZfaXRlciwgIkVuZF8iKSA8PCAiOyIgPDwgZW5kbDsKLSAgICBpZiAoYXN5bmNfIHx8IGFzeW5jX2N0cF8pIHsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmMoKmZfaXRlcikgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGlmICghYXN5bmNfKSB7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiNlbmRpZiIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sIHRzLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKLSAgfQotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX2NsaWVudCA9IGV4dGVuZHMgKyAiLkNsaWVudCwgIjsKLSAgfSBlbHNlIHsKLSAgICBleHRlbmRzX2NsaWVudCA9ICJJRGlzcG9zYWJsZSwgIjsKLSAgfQotCi0gIGdlbmVyYXRlX2NzaGFycF9kb2MoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGNsYXNzIENsaWVudCA6ICIgPDwgZXh0ZW5kc19jbGllbnQgPDwgIklmYWNlIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBDbGllbnQoVFByb3RvY29sIHByb3QpIDogdGhpcyhwcm90LCBwcm90KSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBDbGllbnQoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpIjsKLSAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8ICIgOiBiYXNlKGlwcm90LCBvcHJvdCkiOwotICB9Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlwcm90XyA9IGlwcm90OyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3RfID0gb3Byb3Q7IiA8PCBlbmRsOwotICB9Ci0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0KLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgVFByb3RvY29sIGlwcm90XzsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgIDw8ICJwcm90ZWN0ZWQgVFByb3RvY29sIG9wcm90XzsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInByb3RlY3RlZCBpbnQgc2VxaWRfOyIKLSAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInB1YmxpYyBUUHJvdG9jb2wgSW5wdXRQcm90b2NvbCIgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImdldCB7IHJldHVybiBpcHJvdF87IH0iIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLQotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInB1YmxpYyBUUHJvdG9jb2wgT3V0cHV0UHJvdG9jb2wiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJnZXQgeyByZXR1cm4gb3Byb3RfOyB9IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiNyZWdpb24gXCIgSURpc3Bvc2FibGUgU3VwcG9ydCBcIiIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByaXZhdGUgYm9vbCBfSXNEaXNwb3NlZDsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIi8vIElEaXNwb3NhYmxlIiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIHZvaWQgRGlzcG9zZSgpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiRGlzcG9zZSh0cnVlKTsiIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZW5kbCA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJvdGVjdGVkIHZpcnR1YWwgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmICghX0lzRGlzcG9zZWQpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKGRpc3Bvc2luZykiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAoaXByb3RfICE9IG51bGwpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiKChJRGlzcG9zYWJsZSlpcHJvdF8pLkRpc3Bvc2UoKTsiIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmIChvcHJvdF8gIT0gbnVsbCkiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIoKElEaXNwb3NhYmxlKW9wcm90XykuRGlzcG9zZSgpOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIl9Jc0Rpc3Bvc2VkID0gdHJ1ZTsiIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiNlbmRyZWdpb24iIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLQotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBlbmRsOwotCi0gICAgaWYgKCFhc3luY18pIHsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiI2lmIFNJTFZFUkxJR0hUIiA8PCBlbmRsOwotICAgIH0KLSAgICAvLyBCZWdpbl8KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luY19iZWdpbigqZl9pdGVyLCAiQmVnaW5fIikgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiAiCi0gICAgICAgICAgICAgICAgICAgICAgIDw8ICJzZW5kXyIgPDwgZnVubmFtZSA8PCAiKGNhbGxiYWNrLCBzdGF0ZSI7Ci0KLSAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcoYXJnX3N0cnVjdCk7Ci0KLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOwotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICIsICI7Ci0gICAgICBmX3NlcnZpY2VfIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgICAvLyBFbmQKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luY19lbmQoKmZfaXRlciwgIkVuZF8iKSA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAib3Byb3RfLlRyYW5zcG9ydC5FbmRGbHVzaChhc3luY1Jlc3VsdCk7IiA8PCBlbmRsOwotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAicmV0dXJuICI7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8ICJyZWN2XyIgPDwgZnVubmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotICAgIH0KLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAgIC8vIGFzeW5jCi0gICAgYm9vbCBmaXJzdDsKLSAgICBpZiAoYXN5bmNfIHx8IGFzeW5jX2N0cF8pIHsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGFzeW5jICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jKCpmX2l0ZXIsICIiKSA8PCBlbmRsOwotICAgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpIDw8ICIgcmV0dmFsOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR2YWwgPSAiOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pOwotICAgICAgfQotICAgICAgaWYgKGFzeW5jXykgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICJhd2FpdCBUYXNrLlJ1bigoKSA9PiIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgImF3YWl0IFRhc2tFeC5SdW4oKCkgPT4iIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKTsKLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAicmV0dXJuICI7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8IGZ1bm5hbWUgPDwgIigiOwotICAgICAgZmlyc3QgPSB0cnVlOwotICAgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7Ci0gICAgICAgIH0KLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSk7IiA8PCBlbmRsOwotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiByZXR2YWw7IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpZiAoIWFzeW5jXykgewotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIjZW5kaWYiIDw8IGVuZGwgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICAvLyAiTm9ybWFsIiBTeW5jaHJvbm91cyBpbnZva2UKLSAgICBnZW5lcmF0ZV9jc2hhcnBfZG9jKGZfc2VydmljZV8sICpmX2l0ZXIpOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgICBpZiAoIWFzeW5jXykgewotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIjaWYgIVNJTFZFUkxJR0hUIiA8PCBlbmRsOwotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJzZW5kXyIgPDwgZnVubmFtZSA8PCAiKCI7Ci0KLSAgICAgIGZpcnN0ID0gdHJ1ZTsKLSAgICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICAgIGlmIChmaXJzdCkgewotICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOwotICAgICAgICB9Ci0gICAgICAgIGZfc2VydmljZV8gPDwgbm9ybWFsaXplX25hbWUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpOwotICAgICAgfQotICAgICAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgICAgZl9zZXJ2aWNlXyA8PCAicmV0dXJuICI7Ci0gICAgICAgIH0KLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAicmVjdl8iIDw8IGZ1bm5hbWUgPDwgIigpOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIjZWxzZSIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICAvLyBTaWx2ZXJsaWdodCBzeW5jaHJvbm91cyBpbnZva2UKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInZhciBhc3luY1Jlc3VsdCA9IEJlZ2luXyIgPDwgZnVubmFtZSA8PCAiKG51bGwsIG51bGwiOwotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICIsICIgPDwgbm9ybWFsaXplX25hbWUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAicmV0dXJuICI7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8ICJFbmRfIiA8PCBmdW5uYW1lIDw8ICIoYXN5bmNSZXN1bHQpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gICAgaWYgKCFhc3luY18pIHsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiI2VuZGlmIiA8PCBlbmRsOwotICAgIH0KLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotCi0gICAgLy8gU2VuZAotICAgIHRfZnVuY3Rpb24gc2VuZF9mdW5jdGlvbihnX3R5cGVfdm9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJzZW5kXyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF9hcmdsaXN0KCkpOwotCi0gICAgc3RyaW5nIGFyZ3NuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKLQotICAgIGlmICghYXN5bmNfKSB7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiNpZiBTSUxWRVJMSUdIVCIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmNfYmVnaW4oJnNlbmRfZnVuY3Rpb24pIDw8IGVuZGw7Ci0gICAgaWYgKCFhc3luY18pIHsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiI2Vsc2UiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VuZF9mdW5jdGlvbikgPDwgZW5kbDsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiI2VuZGlmIiA8PCBlbmRsOwotICAgIH0KLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90Xy5Xcml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoXCIiIDw8IGZ1bm5hbWUgPDwgIlwiLCAiCi0gICAgICAgICAgICAgICA8PCAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJUTWVzc2FnZVR5cGUuT25ld2F5IiA6ICJUTWVzc2FnZVR5cGUuQ2FsbCIpCi0gICAgICAgICAgICAgICA8PCAiLCBzZXFpZF8pKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgYXJnc25hbWUgPDwgIiBhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUKLSAgICAgICAgICAgICAgIDw8ICIoKTsiIDw8IGVuZGw7Ci0KLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncy4iIDw8IHByb3BfbmFtZSgqZmxkX2l0ZXIpIDw8ICIgPSAiCi0gICAgICAgICAgICAgICAgIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzLldyaXRlKG9wcm90Xyk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICA8PCAib3Byb3RfLldyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKLSAgICA7Ci0KLSAgICBpZiAoIWFzeW5jXykgewotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIjaWYgU0lMVkVSTElHSFQiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIG9wcm90Xy5UcmFuc3BvcnQuQmVnaW5GbHVzaChjYWxsYmFjaywgc3RhdGUpOyIgPDwgZW5kbDsKLSAgICBpZiAoIWFzeW5jXykgewotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIjZWxzZSIgPDwgZW5kbDsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAib3Byb3RfLlRyYW5zcG9ydC5GbHVzaCgpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiI2VuZGlmIiA8PCBlbmRsOwotICAgIH0KLQotICAgIGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZyhhcmdfc3RydWN0KTsKLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgc3RyaW5nIHJlc3VsdG5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7Ci0KLSAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7Ci0gICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9hcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpKTsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uKSA8PCBlbmRsOwotICAgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOwotICAgICAgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKHhzLCB4cy0+Z2V0X21lbWJlcnMoKSwgcmVzdWx0bmFtZSk7Ci0KLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIlRNZXNzYWdlIG1zZyA9IGlwcm90Xy5SZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgIDw8ICJpZiAobXNnLlR5cGUgPT0gVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbikgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHggPSBUQXBwbGljYXRpb25FeGNlcHRpb24uUmVhZChpcHJvdF8pOyIKLSAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaXByb3RfLlJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ0aHJvdyB4OyIKLSAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHJlc3VsdG5hbWUgPDwgIiByZXN1bHQgPSBuZXcgIgotICAgICAgICAgICAgICAgICA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJlc3VsdC5SZWFkKGlwcm90Xyk7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpcHJvdF8uUmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgaWYgKG51bGxhYmxlXykgewotICAgICAgICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSkpIHsKLSAgICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuU3VjY2VzcyAhPSBudWxsKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgICAgICAgIDw8ICIgIHJldHVybiByZXN1bHQuU3VjY2VzczsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuU3VjY2Vzcy5IYXNWYWx1ZSkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgICAgICAgICA8PCAiICByZXR1cm4gcmVzdWx0LlN1Y2Nlc3MuVmFsdWU7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0Ll9faXNzZXQuc3VjY2VzcykgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgICAgICAgPDwgIiAgcmV0dXJuIHJlc3VsdC5TdWNjZXNzOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgaWYgKG51bGxhYmxlXykgewotICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuIiA8PCBwcm9wX25hbWUoKnhfaXRlcikgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICB0aHJvdyByZXN1bHQuIiA8PCBwcm9wX25hbWUoKnhfaXRlcikgPDwgIjsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X25hbWUoKSkKLSAgICAgICAgICAgICAgICAgICAgIDw8ICIpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgdGhyb3cgcmVzdWx0LiIgPDwgcHJvcF9uYW1lKCp4X2l0ZXIpIDw8ICI7IgotICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgICAgIDw8ICJ0aHJvdyBuZXcgIgotICAgICAgICAgICAgICAgICAgICAgICJUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTWlzc2luZ1Jlc3VsdCwgXCIiCi0gICAgICAgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZygoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKSk7Ci0gICAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfcHJvY2Vzc29yID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgZXh0ZW5kc19wcm9jZXNzb3IgPSBleHRlbmRzICsgIi5Qcm9jZXNzb3IsICI7Ci0gIH0KLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBjbGFzcyBQcm9jZXNzb3IgOiAiIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8ICJUUHJvY2Vzc29yIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIFByb2Nlc3NvcihJZmFjZSBpZmFjZSkiOwotICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwgIiA6IGJhc2UoaWZhY2UpIjsKLSAgfQotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZmFjZV8gPSBpZmFjZTsiIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwcm9jZXNzTWFwX1tcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICA8PCAiXCJdID0gIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIl9Qcm9jZXNzOyIgPDwgZW5kbDsKLSAgfQotCi0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXwotICAgICAgICA8PCBpbmRlbnQoKQotICAgICAgICA8PCAicHJvdGVjdGVkIGRlbGVnYXRlIHZvaWQgUHJvY2Vzc0Z1bmN0aW9uKGludCBzZXFpZCwgVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpOyIKLSAgICAgICAgPDwgZW5kbDsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInByaXZhdGUgSWZhY2UgaWZhY2VfOyIgPDwgZW5kbDsKLQotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIERpY3Rpb25hcnk8c3RyaW5nLCBQcm9jZXNzRnVuY3Rpb24+IHByb2Nlc3NNYXBfID0gbmV3ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEaWN0aW9uYXJ5PHN0cmluZywgUHJvY2Vzc0Z1bmN0aW9uPigpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgYm9vbCBQcm9jZXNzKFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBuZXcgYm9vbCBQcm9jZXNzKFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSIgPDwgZW5kbDsKLSAgfQotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0cnkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIlRNZXNzYWdlIG1zZyA9IGlwcm90LlJlYWRNZXNzYWdlQmVnaW4oKTsiIDw8IGVuZGw7Ci0KLSAgZl9zZXJ2aWNlXwotICAgICAgPDwgaW5kZW50KCkgPDwgIlByb2Nlc3NGdW5jdGlvbiBmbjsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgIDw8ICJwcm9jZXNzTWFwXy5UcnlHZXRWYWx1ZShtc2cuTmFtZSwgb3V0IGZuKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmIChmbiA9PSBudWxsKSB7IgotICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBUUHJvdG9jb2xVdGlsLlNraXAoaXByb3QsIFRUeXBlLlN0cnVjdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICA8PCAiICBpcHJvdC5SZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgPDwgIiAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uICIKLSAgICAgICAgICIoVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuVW5rbm93bk1ldGhvZCwgXCJJbnZhbGlkIG1ldGhvZCBuYW1lOiAnXCIgKyAiCi0gICAgICAgICAibXNnLk5hbWUgKyBcIidcIik7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICA8PCAiICBvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UobXNnLk5hbWUsIFRNZXNzYWdlVHlwZS5FeGNlcHRpb24sIG1zZy5TZXFJRCkpOyIKLSAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgeC5Xcml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LldyaXRlTWVzc2FnZUVuZCgpOyIKLSAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgb3Byb3QuVHJhbnNwb3J0LkZsdXNoKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0cnVlOyIKLSAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImZuKG1zZy5TZXFJRCwgaXByb3QsIG9wcm90KTsiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJjYXRjaCAoSU9FeGNlcHRpb24pIiA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOwotICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOwotICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7Ci0gIH0KLQotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOwotICB9Ci0KLSAgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sICZyZXN1bHQsIGZhbHNlLCB0cnVlLCB0cnVlKTsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gICh2b2lkKXRzZXJ2aWNlOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyB2b2lkICIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICA8PCAiX1Byb2Nlc3MoaW50IHNlcWlkLCBUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0gIHN0cmluZyBhcmdzbmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyI7Ci0gIHN0cmluZyByZXN1bHRuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOwotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgYXJnc25hbWUgPDwgIiBhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgIDw8ICJhcmdzLlJlYWQoaXByb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaXByb3QuUmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLQotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IHJlc3VsdG5hbWUgPDwgIiByZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0cnkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgfQotCi0gIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAicmVzdWx0LlN1Y2Nlc3MgPSAiOwotICB9Ci0gIGZfc2VydmljZV8gPDwgImlmYWNlXy4iIDw8IG5vcm1hbGl6ZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgPDwgIigiOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKGFyZ19zdHJ1Y3QpOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICJhcmdzLiIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIpOwotICAgIGlmIChudWxsYWJsZV8gJiYgIXR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSkgewotICAgICAgZl9zZXJ2aWNlXyA8PCAiLlZhbHVlIjsKLSAgICB9Ci0gIH0KLSAgY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKGFyZ19zdHJ1Y3QpOwotICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKLQotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iOwotICAgIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyh4cywgeHMtPmdldF9tZW1iZXJzKCksIHJlc3VsdG5hbWUpOwotICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICIgY2F0Y2ggKCIgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSA8PCAiICIKLSAgICAgICAgICAgICAgICAgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJlc3VsdC4iIDw8IHByb3BfbmFtZSgqeF9pdGVyKSA8PCAiID0gIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgICA8PCAiOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICJ9IjsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKHhzKTsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLQotICAgIHJldHVybjsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90LldyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgPDwgIlwiLCBUTWVzc2FnZVR5cGUuUmVwbHksIHNlcWlkKSk7ICIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LldyaXRlKG9wcm90KTsiCi0gICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3QuV3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgPDwgIm9wcm90LlRyYW5zcG9ydC5GbHVzaCgpOyIgPDwgZW5kbDsKLQotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotCi0gIGZfc2VydmljZV8gPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF91bmlvbl9yZWFkZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHVuaW9uKSB7Ci0gIC8vIFRoYW5rcyB0byBUSFJJRlQtMTc2OCwgd2UgZG9uJ3QgbmVlZCB0byBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIGluIHRoZSB1bmlvbgotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0dW5pb24tPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBpbmRlbnQob3V0KSA8PCAicHVibGljIHN0YXRpYyAiIDw8IHR1bmlvbi0+Z2V0X25hbWUoKSA8PCAiIFJlYWQoVFByb3RvY29sIGlwcm90KSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgImlwcm90LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgInRyeSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBpbmRlbnQob3V0KSA8PCB0dW5pb24tPmdldF9uYW1lKCkgPDwgIiByZXR2YWw7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiaXByb3QuUmVhZFN0cnVjdEJlZ2luKCk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiVEZpZWxkIGZpZWxkID0gaXByb3QuUmVhZEZpZWxkQmVnaW4oKTsiIDw8IGVuZGw7Ci0gIC8vIHdlIGNhbm5vdCBoYXZlIHRoZSBmaXJzdCBmaWVsZCBiZSBhIHN0b3AgLS0gd2UgbXVzdCBoYXZlIGEgc2luZ2xlIGZpZWxkIGRlZmluZWQKLSAgaW5kZW50KG91dCkgPDwgImlmIChmaWVsZC5UeXBlID09IFRUeXBlLlN0b3ApIiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotICBpbmRlbnQob3V0KSA8PCAiaXByb3QuUmVhZEZpZWxkRW5kKCk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicmV0dmFsID0gbmV3IF9fX3VuZGVmaW5lZCgpOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotICBpbmRlbnQob3V0KSA8PCAiZWxzZSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLSAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGQuSUQpIiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGZpZWxkLlR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiB0ZW1wOyIgPDwgZW5kbDsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICgqZl9pdGVyKSwgInRlbXAiLCB0cnVlKTsKLSAgICBpbmRlbnQob3V0KSA8PCAicmV0dmFsID0gbmV3ICIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIodGVtcCk7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7ICIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBUUHJvdG9jb2xVdGlsLlNraXAoaXByb3QsIGZpZWxkLlR5cGUpOyIKLSAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR2YWwgPSBuZXcgX19fdW5kZWZpbmVkKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCi0gICAgICAgIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiAiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAiVFByb3RvY29sVXRpbC5Ta2lwKGlwcm90LCBmaWVsZC5UeXBlKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgPDwgInJldHZhbCA9IG5ldyBfX191bmRlZmluZWQoKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJicmVhazsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIGluZGVudChvdXQpIDw8ICJpcHJvdC5SZWFkRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgImlmIChpcHJvdC5SZWFkRmllbGRCZWdpbigpLlR5cGUgIT0gVFR5cGUuU3RvcCkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0gIGluZGVudChvdXQpIDw8ICJ0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEpOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIC8vIGVuZCBvZiBlbHNlIGZvciBUU3RvcAotICBzY29wZV9kb3duKG91dCk7Ci0gIGluZGVudChvdXQpIDw8ICJpcHJvdC5SZWFkU3RydWN0RW5kKCk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHJldHZhbDsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgImZpbmFsbHkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiaXByb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Byb3BlcnR5bGVzcykgewotICB0X3R5cGUqIHR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7Ci0gIHdoaWxlICh0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICB0eXBlID0gKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpOwotICB9Ci0KLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyAoaXNfcHJvcGVydHlsZXNzID8gIiIgOiBwcm9wX25hbWUodGZpZWxkKSk7Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gIjsKLQotICAgIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIG91dCA8PCAiKCIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKSI7Ci0gICAgfQotCi0gICAgb3V0IDw8ICJpcHJvdC4iOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgICAgIG91dCA8PCAiUmVhZEJpbmFyeSgpOyI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgb3V0IDw8ICJSZWFkU3RyaW5nKCk7IjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgb3V0IDw8ICJSZWFkQm9vbCgpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBvdXQgPDwgIlJlYWRCeXRlKCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgb3V0IDw8ICJSZWFkSTE2KCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgb3V0IDw8ICJSZWFkSTMyKCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgb3V0IDw8ICJSZWFkSTY0KCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgb3V0IDw8ICJSZWFkRG91YmxlKCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMjIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgb3V0IDw8ICJSZWFkSTMyKCk7IjsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAotICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7Ci0gIH0KLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBpZiAodW5pb25fICYmIHRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiLlJlYWQoaXByb3QpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICA8PCBwcmVmaXggPDwgIi5SZWFkKGlwcm90KTsiIDw8IGVuZGw7Ci0gIH0KLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgc3RyaW5nIG9iajsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgb2JqID0gdG1wKCJfbWFwIik7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgb2JqID0gdG1wKCJfc2V0Iik7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIG9iaiA9IHRtcCgiX2xpc3QiKTsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiVE1hcCAiIDw8IG9iaiA8PCAiID0gaXByb3QuUmVhZE1hcEJlZ2luKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiVFNldCAiIDw8IG9iaiA8PCAiID0gaXByb3QuUmVhZFNldEJlZ2luKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlRMaXN0ICIgPDwgb2JqIDw8ICIgPSBpcHJvdC5SZWFkTGlzdEJlZ2luKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgc3RyaW5nIGkgPSB0bXAoIl9pIik7Ci0gIGluZGVudChvdXQpIDw8ICJmb3IoIGludCAiIDw8IGkgPDwgIiA9IDA7ICIgPDwgaSA8PCAiIDwgIiA8PCBvYmogPDwgIi5Db3VudCIKLSAgICAgICAgICAgICAgPDwgIjsgIgotICAgICAgICAgICAgICA8PCAiKysiIDw8IGkgPDwgIikiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgcHJlZml4KTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgpOwotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QuUmVhZE1hcEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QuUmVhZFNldEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImlwcm90LlJlYWRMaXN0RW5kKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBrZXkgPSB0bXAoIl9rZXkiKTsKLSAgc3RyaW5nIHZhbCA9IHRtcCgiX3ZhbCIpOwotCi0gIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKLSAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOwotCi0gIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZrZXkpIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZ2YWwpIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSk7Ci0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwpOwotCi0gIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiWyIgPDwga2V5IDw8ICJdID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7Ci0gIHRfZmllbGQgZmVsZW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIuQWRkKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKLSAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIuQWRkKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2VsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcHJvcGVydHlsZXNzKSB7Ci0gIHRfdHlwZSogdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKLSAgd2hpbGUgKHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgIHR5cGUgPSAoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCk7Ci0gIH0KLQotICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIChpc19wcm9wZXJ0eWxlc3MgPyAiIiA6IHByb3BfbmFtZSh0ZmllbGQpKTsKLQotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgbmFtZTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90LiI7Ci0KLSAgICBzdHJpbmcgbnVsbGFibGVfbmFtZSA9IG51bGxhYmxlXyAmJiAhaXNfZWxlbWVudCAmJiAhZmllbGRfaXNfcmVxdWlyZWQodGZpZWxkKSA/IG5hbWUgKyAiLlZhbHVlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbmFtZTsKLQotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgICBvdXQgPDwgIldyaXRlQmluYXJ5KCI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgb3V0IDw8ICJXcml0ZVN0cmluZygiOwotICAgICAgICB9Ci0gICAgICAgIG91dCA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBvdXQgPDwgIldyaXRlQm9vbCgiIDw8IG51bGxhYmxlX25hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIG91dCA8PCAiV3JpdGVCeXRlKCIgPDwgbnVsbGFibGVfbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBvdXQgPDwgIldyaXRlSTE2KCIgPDwgbnVsbGFibGVfbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBvdXQgPDwgIldyaXRlSTMyKCIgPDwgbnVsbGFibGVfbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICBvdXQgPDwgIldyaXRlSTY0KCIgPDwgbnVsbGFibGVfbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgIldyaXRlRG91YmxlKCIgPDwgbnVsbGFibGVfbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQyMgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBvdXQgPDwgIldyaXRlSTMyKChpbnQpIiA8PCBudWxsYWJsZV9uYW1lIDw8ICIpOyI7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSAnJXMlcycgVFlQRSAnJXMnXG4iLAotICAgICAgICAgICBwcmVmaXguY19zdHIoKSwKLSAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCi0gICAgICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKLSAgfQotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gICh2b2lkKXRzdHJ1Y3Q7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIi5Xcml0ZShvcHJvdCk7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZU1hcEJlZ2luKG5ldyBUTWFwKCIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpCi0gICAgICAgICAgICAgICAgPDwgIiwgIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIiA8PCBwcmVmaXgKLSAgICAgICAgICAgICAgICA8PCAiLkNvdW50KSk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZVNldEJlZ2luKG5ldyBUU2V0KCIgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKQotICAgICAgICAgICAgICAgIDw8ICIsICIgPDwgcHJlZml4IDw8ICIuQ291bnQpKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZUxpc3RCZWdpbihuZXcgVExpc3QoIgotICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwgcHJlZml4IDw8ICIuQ291bnQpKTsiCi0gICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgfQotCi0gIHN0cmluZyBpdGVyID0gdG1wKCJfaXRlciIpOwotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImZvcmVhY2ggKCIgPDwgdHlwZV9uYW1lKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIgIiA8PCBpdGVyCi0gICAgICAgICAgICAgICAgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiLktleXMpIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiZm9yZWFjaCAoIiA8PCB0eXBlX25hbWUoKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIgIiA8PCBpdGVyCi0gICAgICAgICAgICAgICAgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiKSI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJmb3JlYWNoICgiIDw8IHR5cGVfbmFtZSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIgIiA8PCBpdGVyCi0gICAgICAgICAgICAgICAgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiKSI7Ci0gIH0KLQotICBvdXQgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgaXRlciwgcHJlZml4KTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyKTsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90LldyaXRlTWFwRW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC5Xcml0ZVNldEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90LldyaXRlTGlzdEVuZCgpOyIgPDwgZW5kbDsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBtYXApIHsKLSAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCAiIiwgdHJ1ZSk7Ci0gIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCBtYXAgKyAiWyIgKyBpdGVyICsgIl0iKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCwgIiIsIHRydWUpOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgaXRlcikgewotICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIiwgdHJ1ZSk7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIpIHsKLSAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiLCB0cnVlKTsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb3BlcnR5KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNQdWJsaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBnZW5lcmF0ZUlzc2V0KSB7Ci0gIGdlbmVyYXRlX2NzaGFycF9wcm9wZXJ0eShvdXQsIHRmaWVsZCwgaXNQdWJsaWMsIGdlbmVyYXRlSXNzZXQsICJfIik7Ci19Ci12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3Byb3BlcnR5KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1B1YmxpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBnZW5lcmF0ZUlzc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWVsZFByZWZpeCkgewotICBpZiAoKHNlcmlhbGl6ZV8gfHwgd2NmXykgJiYgaXNQdWJsaWMpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiW0RhdGFNZW1iZXIoT3JkZXIgPSAwKV0iIDw8IGVuZGw7Ci0gIH0KLSAgYm9vbCBoYXNfZGVmYXVsdCA9IGZpZWxkX2hhc19kZWZhdWx0KHRmaWVsZCk7Ci0gIGJvb2wgaXNfcmVxdWlyZWQgPSBmaWVsZF9pc19yZXF1aXJlZCh0ZmllbGQpOwotICBpZiAoKG51bGxhYmxlXyAmJiAhaGFzX2RlZmF1bHQpIHx8IChpc19yZXF1aXJlZCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAoaXNQdWJsaWMgPyAicHVibGljICIgOiAicHJpdmF0ZSAiKQotICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgaXNfcmVxdWlyZWQpIDw8ICIgIgotICAgICAgICAgICAgICAgIDw8IHByb3BfbmFtZSh0ZmllbGQpIDw8ICIgeyBnZXQ7IHNldDsgfSIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQob3V0KSA8PCAoaXNQdWJsaWMgPyAicHVibGljICIgOiAicHJpdmF0ZSAiKQotICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSwgdHJ1ZSkgPDwgIiAiIDw8IHByb3BfbmFtZSh0ZmllbGQpCi0gICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotICAgIGluZGVudChvdXQpIDw8ICJnZXQiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBib29sIHVzZV9udWxsYWJsZSA9IGZhbHNlOwotICAgIGlmIChudWxsYWJsZV8pIHsKLSAgICAgIHRfdHlwZSogdHR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7Ci0gICAgICB3aGlsZSAodHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgICAgICB0dHlwZSA9ICgodF90eXBlZGVmKil0dHlwZSktPmdldF90eXBlKCk7Ci0gICAgICB9Ci0gICAgICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICAgIHVzZV9udWxsYWJsZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKSAhPSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc7Ci0gICAgICB9Ci0gICAgfQotICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gIiA8PCBmaWVsZFByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInNldCIgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotICAgIGlmICh1c2VfbnVsbGFibGUpIHsKLSAgICAgIGlmIChnZW5lcmF0ZUlzc2V0KSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUodGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiID0gdmFsdWUuSGFzVmFsdWU7IgotICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgICAgfQotICAgICAgaW5kZW50KG91dCkgPDwgImlmICh2YWx1ZS5IYXNWYWx1ZSkgdGhpcy4iIDw8IGZpZWxkUHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgICA8PCAiID0gdmFsdWUuVmFsdWU7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoZ2VuZXJhdGVJc3NldCkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKHRmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIiA9IHRydWU7IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZFByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiID0gdmFsdWU7IiA8PCBlbmRsOwotICAgIH0KLSAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICB9Ci0gIG91dCA8PCBlbmRsOwotfQotCi1zdGQ6OnN0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6Om1ha2VfdmFsaWRfY3NoYXJwX2lkZW50aWZpZXIoc3RkOjpzdHJpbmcgY29uc3QmIGZyb21OYW1lKSB7Ci0gIHN0ZDo6c3RyaW5nIHN0ciA9IGZyb21OYW1lOwotICBpZiAoc3RyLmVtcHR5KCkpIHsKLSAgICByZXR1cm4gc3RyOwotICB9Ci0KLSAgLy8gdGVzdHMgcmVseSBvbiB0aGlzCi0gIGFzc2VydCgoJ0EnIDwgJ1onKSAmJiAoJ2EnIDwgJ3onKSAmJiAoJzAnIDwgJzknKSk7Ci0KLSAgLy8gaWYgdGhlIGZpcnN0IGxldHRlciBpcyBhIG51bWJlciwgd2UgYWRkIGFuIGFkZGl0aW9uYWwgdW5kZXJzY29yZSBpbiBmcm9udCBvZiBpdAotICBjaGFyIGMgPSBzdHIuYXQoMCk7Ci0gIGlmICgoJzAnIDw9IGMpICYmIChjIDw9ICc5JykpIHsKLSAgICBzdHIgPSAiXyIgKyBzdHI7Ci0gIH0KLQotICAvLyBmb2xsb3dpbmcgY2hhcnM6IGxldHRlciwgbnVtYmVyIG9yIHVuZGVyc2NvcmUKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdHIuc2l6ZSgpOyArK2kpIHsKLSAgICBjID0gc3RyLmF0KGkpOwotICAgIGlmICgoKCdBJyA+IGMpIHx8IChjID4gJ1onKSkgJiYgKCgnYScgPiBjKSB8fCAoYyA+ICd6JykpICYmICgoJzAnID4gYykgfHwgKGMgPiAnOScpKQotICAgICAgICAmJiAoJ18nICE9IGMpKSB7Ci0gICAgICBzdHIucmVwbGFjZShpLCAxLCAiXyIpOwotICAgIH0KLSAgfQotCi0gIHJldHVybiBzdHI7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcodm9pZCogc2NvcGUpIHsKLSAgaWYgKG1lbWJlcl9tYXBwaW5nX3Njb3BlICE9IHNjb3BlKSB7Ci0gICAgaWYgKG1lbWJlcl9tYXBwaW5nX3Njb3BlID09IE5VTEwpIHsKLSAgICAgIHRocm93ICJpbnRlcm5hbCBlcnJvcjogY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKCkgbm90IGFjdGl2ZSI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRocm93ICJpbnRlcm5hbCBlcnJvcjogY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKCkgY2FsbGVkIGZvciB3cm9uZyBzdHJ1Y3QiOwotICAgIH0KLSAgfQotCi0gIG1lbWJlcl9tYXBwaW5nX3Njb3BlID0gTlVMTDsKLSAgbWVtYmVyX25hbWVfbWFwcGluZy5jbGVhcigpOwotfQotCi1zdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZXRfbWFwcGVkX21lbWJlcl9uYW1lKHN0cmluZyBuYW1lKSB7Ci0gIG1hcDxzdHJpbmcsIHN0cmluZz46Oml0ZXJhdG9yIGl0ZXIgPSBtZW1iZXJfbmFtZV9tYXBwaW5nLmZpbmQobmFtZSk7Ci0gIGlmIChtZW1iZXJfbmFtZV9tYXBwaW5nLmVuZCgpICE9IGl0ZXIpIHsKLSAgICByZXR1cm4gaXRlci0+c2Vjb25kOwotICB9Ci0gIHB2ZXJib3NlKCJubyBtYXBwaW5nIGZvciBtZW1iZXIgJXNcbiIsIG5hbWUuY19zdHIoKSk7Ci0gIHJldHVybiBuYW1lOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6cHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyh0c3RydWN0LCB0c3RydWN0LT5nZXRfbWVtYmVycygpLCB0c3RydWN0LT5nZXRfbmFtZSgpKTsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OnByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyh2b2lkKiBzY29wZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBzdHJ1Y3RuYW1lKSB7Ci0gIGlmIChtZW1iZXJfbWFwcGluZ19zY29wZSAhPSBOVUxMKSB7Ci0gICAgaWYgKG1lbWJlcl9tYXBwaW5nX3Njb3BlICE9IHNjb3BlKSB7Ci0gICAgICB0aHJvdyAiaW50ZXJuYWwgZXJyb3I6IHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZygpIGFscmVhZHkgYWN0aXZlIGZvciBkaWZmZXJlbnQgc3RydWN0IjsKLSAgICB9IGVsc2UgewotICAgICAgdGhyb3cgImludGVybmFsIGVycm9yOiBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcoKSBhbHJlYWR5IGFjdGl2ZSBmb3IgdGhpcyBzdHJ1Y3QiOwotICAgIH0KLSAgfQotCi0gIG1lbWJlcl9tYXBwaW5nX3Njb3BlID0gc2NvcGU7Ci0gIG1lbWJlcl9uYW1lX21hcHBpbmcuY2xlYXIoKTsKLQotICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gdXNlZF9tZW1iZXJfbmFtZXM7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7Ci0KLSAgLy8gY3VycmVudCBDIyBnZW5lcmF0b3IgcG9saWN5OgotICAvLyAtIHByb3AgbmFtZXMgYXJlIGFsd2F5cyByZW5kZXJlZCB3aXRoIGFuIFVwcGVyY2FzZSBmaXJzdCBsZXR0ZXIKLSAgLy8gLSBzdHJ1Y3QgbmFtZXMgYXJlIHVzZWQgYXMgZ2l2ZW4KLQotICAvLyBwcmV2ZW50IG5hbWUgY29uZmxpY3RzIHdpdGggc3RydWN0IChDUzA1NDIgZXJyb3IpCi0gIHVzZWRfbWVtYmVyX25hbWVzLmluc2VydChzdHJ1Y3RuYW1lKTsKLQotICAvLyBwcmV2ZW50IG5hbWUgY29uZmxpY3RzIHdpdGgga25vd24gbWV0aG9kcyAoVEhSSUZULTI5NDIpCi0gIHVzZWRfbWVtYmVyX25hbWVzLmluc2VydCgiUmVhZCIpOwotICB1c2VkX21lbWJlcl9uYW1lcy5pbnNlcnQoIldyaXRlIik7Ci0KLSAgZm9yIChpdGVyID0gbWVtYmVycy5iZWdpbigpOyBpdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsraXRlcikgewotICAgIHN0cmluZyBvbGRuYW1lID0gKCppdGVyKS0+Z2V0X25hbWUoKTsKLSAgICBzdHJpbmcgbmV3bmFtZSA9IHByb3BfbmFtZSgqaXRlciwgdHJ1ZSk7Ci0gICAgd2hpbGUgKHRydWUpIHsKLQotICAgICAgLy8gbmV3IG5hbWUgY29uZmxpY3RzIHdpdGggYW5vdGhlciBtZW1iZXIKLSAgICAgIGlmICh1c2VkX21lbWJlcl9uYW1lcy5maW5kKG5ld25hbWUpICE9IHVzZWRfbWVtYmVyX25hbWVzLmVuZCgpKSB7Ci0gICAgICAgIHB2ZXJib3NlKCJzdHJ1Y3QgJXM6IG1lbWJlciAlcyBjb25mbGljdHMgd2l0aCBhbm90aGVyIG1lbWJlclxuIiwKLSAgICAgICAgICAgICAgICAgc3RydWN0bmFtZS5jX3N0cigpLAotICAgICAgICAgICAgICAgICBuZXduYW1lLmNfc3RyKCkpOwotICAgICAgICBuZXduYW1lICs9ICdfJzsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIC8vIGFkZCBhbHdheXMsIHRoaXMgaGVscHMgdXMgdG8gZGV0ZWN0IGVkZ2UgY2FzZXMgbGlrZQotICAgICAgLy8gZGlmZmVyZW50IHNwZWxsaW5ncyAoImZvbyIgYW5kICJGb28iKSB3aXRoaW4gdGhlIHNhbWUgc3RydWN0Ci0gICAgICBwdmVyYm9zZSgic3RydWN0ICVzOiBtZW1iZXIgbWFwcGluZyAlcyA9PiAlc1xuIiwKLSAgICAgICAgICAgICAgIHN0cnVjdG5hbWUuY19zdHIoKSwKLSAgICAgICAgICAgICAgIG9sZG5hbWUuY19zdHIoKSwKLSAgICAgICAgICAgICAgIG5ld25hbWUuY19zdHIoKSk7Ci0gICAgICBtZW1iZXJfbmFtZV9tYXBwaW5nW29sZG5hbWVdID0gbmV3bmFtZTsKLSAgICAgIHVzZWRfbWVtYmVyX25hbWVzLmluc2VydChuZXduYW1lKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotfQotCi1zdGQ6OnN0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OnByb3BfbmFtZSh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgc3VwcHJlc3NfbWFwcGluZykgewotICBzdHJpbmcgbmFtZSh0ZmllbGQtPmdldF9uYW1lKCkpOwotICBpZiAoc3VwcHJlc3NfbWFwcGluZykgewotICAgIG5hbWVbMF0gPSB0b3VwcGVyKG5hbWVbMF0pOwotICB9IGVsc2UgewotICAgIG5hbWUgPSBnZXRfbWFwcGVkX21lbWJlcl9uYW1lKG5hbWUpOwotICB9Ci0gIHJldHVybiBuYW1lOwotfQotCi1zdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NvbnRhaW5lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2luaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9wYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3JlcXVpcmVkKSB7Ci0gICh2b2lkKWluX2luaXQ7Ci0gIHdoaWxlICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgdHR5cGUgPSAoKHRfdHlwZWRlZiopdHR5cGUpLT5nZXRfdHlwZSgpOwotICB9Ci0KLSAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHJldHVybiBiYXNlX3R5cGVfbmFtZSgodF9iYXNlX3R5cGUqKXR0eXBlLCBpbl9jb250YWluZXIsIGluX3BhcmFtLCBpc19yZXF1aXJlZCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgdF9tYXAqIHRtYXAgPSAodF9tYXAqKXR0eXBlOwotICAgIHJldHVybiAiRGljdGlvbmFyeTwiICsgdHlwZV9uYW1lKHRtYXAtPmdldF9rZXlfdHlwZSgpLCB0cnVlKSArICIsICIKLSAgICAgICAgICAgKyB0eXBlX25hbWUodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHRydWUpICsgIj4iOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIHRfc2V0KiB0c2V0ID0gKHRfc2V0Kil0dHlwZTsKLSAgICByZXR1cm4gIlRIYXNoU2V0PCIgKyB0eXBlX25hbWUodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCB0cnVlKSArICI+IjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgdF9saXN0KiB0bGlzdCA9ICh0X2xpc3QqKXR0eXBlOwotICAgIHJldHVybiAiTGlzdDwiICsgdHlwZV9uYW1lKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIHRydWUpICsgIj4iOwotICB9Ci0KLSAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7Ci0gIHN0cmluZyBwb3N0Zml4ID0gKCFpc19yZXF1aXJlZCAmJiBudWxsYWJsZV8gJiYgaW5fcGFyYW0gJiYgdHR5cGUtPmlzX2VudW0oKSkgPyAiPyIgOiAiIjsKLSAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7Ci0gICAgc3RyaW5nIG5zID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiY3NoYXJwIik7Ci0gICAgaWYgKCFucy5lbXB0eSgpKSB7Ci0gICAgICByZXR1cm4gbnMgKyAiLiIgKyBub3JtYWxpemVfbmFtZSh0dHlwZS0+Z2V0X25hbWUoKSkgKyBwb3N0Zml4OwotICAgIH0KLSAgfQotCi0gIHJldHVybiBub3JtYWxpemVfbmFtZSh0dHlwZS0+Z2V0X25hbWUoKSkgKyBwb3N0Zml4OwotfQotCi1zdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjpiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdGJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NvbnRhaW5lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3JlcXVpcmVkKSB7Ci0gICh2b2lkKWluX2NvbnRhaW5lcjsKLSAgc3RyaW5nIHBvc3RmaXggPSAoIWlzX3JlcXVpcmVkICYmIG51bGxhYmxlXyAmJiBpbl9wYXJhbSkgPyAiPyIgOiAiIjsKLSAgc3dpdGNoICh0YmFzZS0+Z2V0X2Jhc2UoKSkgewotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgcmV0dXJuICJ2b2lkIjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgaWYgKHRiYXNlLT5pc19iaW5hcnkoKSkgewotICAgICAgcmV0dXJuICJieXRlW10iOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gInN0cmluZyI7Ci0gICAgfQotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgcmV0dXJuICJib29sIiArIHBvc3RmaXg7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICByZXR1cm4gInNieXRlIiArIHBvc3RmaXg7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIHJldHVybiAic2hvcnQiICsgcG9zdGZpeDsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgcmV0dXJuICJpbnQiICsgcG9zdGZpeDsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgcmV0dXJuICJsb25nIiArIHBvc3RmaXg7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgIHJldHVybiAiZG91YmxlIiArIHBvc3RmaXg7Ci0gIGRlZmF1bHQ6Ci0gICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDIyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZS0+Z2V0X2Jhc2UoKSk7Ci0gIH0KLX0KLQotc3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCwgc3RkOjpzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyByZXN1bHQgPSB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpKSArICIgIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgaWYgKGluaXQpIHsKLSAgICB0X3R5cGUqIHR0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOwotICAgIHdoaWxlICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgICB0dHlwZSA9ICgodF90eXBlZGVmKil0dHlwZSktPmdldF90eXBlKCk7Ci0gICAgfQotICAgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgZmllbGRfaGFzX2RlZmF1bHQodGZpZWxkKSkgewotICAgICAgb2ZzdHJlYW0gZHVtbXk7Ci0gICAgICByZXN1bHQgKz0gIiA9ICIgKyByZW5kZXJfY29uc3RfdmFsdWUoZHVtbXksIHRmaWVsZC0+Z2V0X25hbWUoKSwgdHR5cGUsIHRmaWVsZC0+Z2V0X3ZhbHVlKCkpOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIHJlc3VsdCArPSAiID0gZmFsc2UiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgcmVzdWx0ICs9ICIgPSAoZG91YmxlKTAiOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIHJlc3VsdCArPSAiID0gKCIgKyB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKSArICIpMCI7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKSArICIoKSI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKSArICIoKSI7Ci0gICAgfQotICB9Ci0gIHJldHVybiByZXN1bHQgKyAiOyI7Ci19Ci0KLXN0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpIHsKLSAgdF90eXBlKiB0dHlwZSA9IHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKLSAgcmV0dXJuIHR5cGVfbmFtZSh0dHlwZSkgKyAiICIgKyBub3JtYWxpemVfbmFtZShwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgIigiCi0gICAgICAgICArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSArICIpIjsKLX0KLQotc3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jX2JlZ2luKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcgY29tbWEgPSAodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpLnNpemUoKSA+IDAgPyAiLCAiIDogIiIpOwotICByZXR1cm4gIklBc3luY1Jlc3VsdCAiICsgbm9ybWFsaXplX25hbWUocHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpKQotICAgICAgICAgKyAiKEFzeW5jQ2FsbGJhY2sgY2FsbGJhY2ssIG9iamVjdCBzdGF0ZSIgKyBjb21tYSArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKQotICAgICAgICAgKyAiKSI7Ci19Ci0KLXN0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luY19lbmQodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4KSB7Ci0gIHRfdHlwZSogdHR5cGUgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7Ci0gIHJldHVybiB0eXBlX25hbWUodHR5cGUpICsgIiAiICsgbm9ybWFsaXplX25hbWUocHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpKQotICAgICAgICAgKyAiKElBc3luY1Jlc3VsdCBhc3luY1Jlc3VsdCkiOwotfQotCi1zdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmModF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4KSB7Ci0gIHRfdHlwZSogdHR5cGUgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7Ci0gIHN0cmluZyB0YXNrID0gIlRhc2siOwotICBpZiAoIXR0eXBlLT5pc192b2lkKCkpCi0gICAgdGFzayArPSAiPCIgKyB0eXBlX25hbWUodHR5cGUpICsgIj4iOwotICByZXR1cm4gdGFzayArICIgIiArIG5vcm1hbGl6ZV9uYW1lKHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiQXN5bmMoIgotICAgICAgICAgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkgKyAiKSI7Ci19Ci0KLXN0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ICs9ICIsICI7Ci0gICAgfQotICAgIHJlc3VsdCArPSB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSArICIgIiArIG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgewotICB3aGlsZSAodHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgdHlwZSA9ICgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICJUVHlwZS5TdHJpbmciOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiVFR5cGUuQm9vbCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJUVHlwZS5CeXRlIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiVFR5cGUuSTE2IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiVFR5cGUuSTMyIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiVFR5cGUuSTY0IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiVFR5cGUuRG91YmxlIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5JMzIiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLlN0cnVjdCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLk1hcCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLlNldCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5MaXN0IjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9kb2NzdHJpbmdfY29tbWVudChvZnN0cmVhbSYgb3V0LCBzdHJpbmcgY29udGVudHMpIHsKLSAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiLy8vIDxzdW1tYXJ5PlxuIiwgIi8vLyAiLCBjb250ZW50cywgIi8vLyA8L3N1bW1hcnk+XG4iKTsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9kb2Mob2ZzdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpIHsKLSAgaWYgKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19lbnVtKCkpIHsKLSAgICBzdHJpbmcgY29tYmluZWRfbWVzc2FnZSA9IGZpZWxkLT5nZXRfZG9jKCkgKyAiXG48c2VlYWxzbyBjcmVmPVwiIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBnZXRfZW51bV9jbGFzc19uYW1lKGZpZWxkLT5nZXRfdHlwZSgpKSArICJcIi8+IjsKLSAgICBnZW5lcmF0ZV9jc2hhcnBfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCBjb21iaW5lZF9tZXNzYWdlKTsKLSAgfSBlbHNlIHsKLSAgICBnZW5lcmF0ZV9jc2hhcnBfZG9jKG91dCwgKHRfZG9jKilmaWVsZCk7Ci0gIH0KLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9kb2Mob2ZzdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpIHsKLSAgaWYgKHRkb2MtPmhhc19kb2MoKSkgewotICAgIGdlbmVyYXRlX2NzaGFycF9kb2NzdHJpbmdfY29tbWVudChvdXQsIHRkb2MtPmdldF9kb2MoKSk7Ci0gIH0KLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9kb2Mob2ZzdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIGlmICh0ZnVuY3Rpb24tPmhhc19kb2MoKSkgewotICAgIHN0cmluZ3N0cmVhbSBwczsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgcF9pdGVyOwotICAgIGZvciAocF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IHBfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrcF9pdGVyKSB7Ci0gICAgICB0X2ZpZWxkKiBwID0gKnBfaXRlcjsKLSAgICAgIHBzIDw8ICJcbjxwYXJhbSBuYW1lPVwiIiA8PCBwLT5nZXRfbmFtZSgpIDw8ICJcIj4iOwotICAgICAgaWYgKHAtPmhhc19kb2MoKSkgewotICAgICAgICBzdGQ6OnN0cmluZyBzdHIgPSBwLT5nZXRfZG9jKCk7Ci0gICAgICAgIHN0ci5lcmFzZShzdGQ6OnJlbW92ZShzdHIuYmVnaW4oKSwgc3RyLmVuZCgpLCAnXG4nKSwKLSAgICAgICAgICAgICAgICAgIHN0ci5lbmQoKSk7IC8vIHJlbW92ZSB0aGUgbmV3bGluZXMgdGhhdCBhcHBlYXIgZnJvbSB0aGUgcGFyc2VyCi0gICAgICAgIHBzIDw8IHN0cjsKLSAgICAgIH0KLSAgICAgIHBzIDw8ICI8L3BhcmFtPiI7Ci0gICAgfQotICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLy8vICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxzdW1tYXJ5PlxuIiArIHRmdW5jdGlvbi0+Z2V0X2RvYygpICsgIjwvc3VtbWFyeT4iICsgcHMuc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIpOwotICB9Ci19Ci0KLXN0ZDo6c3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2V0X2VudW1fY2xhc3NfbmFtZSh0X3R5cGUqIHR5cGUpIHsKLSAgc3RyaW5nIHBhY2thZ2UgPSAiIjsKLSAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHlwZS0+Z2V0X3Byb2dyYW0oKTsKLSAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7Ci0gICAgcGFja2FnZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImNzaGFycCIpICsgIi4iOwotICB9Ci0gIHJldHVybiBwYWNrYWdlICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUigKLSAgICBjc2hhcnAsCi0gICAgIkMjIiwKLSAgICAiICAgIGFzeW5jOiAgICAgICAgICAgQWRkcyBBc3luYyBzdXBwb3J0IHVzaW5nIFRhc2suUnVuLlxuIgotICAgICIgICAgYXN5bmNjdHA6ICAgICAgICBBZGRzIEFzeW5jIENUUCBzdXBwb3J0IHVzaW5nIFRhc2tFeC5SdW4uXG4iCi0gICAgIiAgICB3Y2Y6ICAgICAgICAgICAgIEFkZHMgYmluZGluZ3MgZm9yIFdDRiB0byBnZW5lcmF0ZWQgY2xhc3Nlcy5cbiIKLSAgICAiICAgIHNlcmlhbDogICAgICAgICAgQWRkIHNlcmlhbGl6YXRpb24gc3VwcG9ydCB0byBnZW5lcmF0ZWQgY2xhc3Nlcy5cbiIKLSAgICAiICAgIG51bGxhYmxlOiAgICAgICAgVXNlIG51bGxhYmxlIHR5cGVzIGZvciBwcm9wZXJ0aWVzLlxuIgotICAgICIgICAgaGFzaGNvZGU6ICAgICAgICBHZW5lcmF0ZSBhIGhhc2hjb2RlIGFuZCBlcXVhbHMgaW1wbGVtZW50YXRpb24gZm9yIGNsYXNzZXMuXG4iCi0gICAgIiAgICB1bmlvbjogICAgICAgICAgIFVzZSBuZXcgdW5pb24gdHlwaW5nLCB3aGljaCBpbmNsdWRlcyBhIHN0YXRpYyByZWFkIGZ1bmN0aW9uIGZvciB1bmlvbiAiCi0gICAgInR5cGVzLlxuIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9kX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9kX2dlbmVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E3NjQ4NS4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfZF9nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw3MjIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgotICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKLSAqIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGNhc3NlcnQ+Ci0KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHNldD4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotCi0jaW5jbHVkZSAicGxhdGZvcm0uaCIKLSNpbmNsdWRlICJ0X29vcF9nZW5lcmF0b3IuaCIKLQotdXNpbmcgc3RkOjptYXA7Ci11c2luZyBzdGQ6Om9mc3RyZWFtOwotdXNpbmcgc3RkOjpvc3RyZWFtOwotdXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwotdXNpbmcgc3RkOjpzZXQ7Ci11c2luZyBzdGQ6OnN0cmluZzsKLXVzaW5nIHN0ZDo6dmVjdG9yOwotCi1zdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCi0KLS8qKgotICogRCBjb2RlIGdlbmVyYXRvci4KLSAqCi0gKiBnZW5lcmF0ZV8qKCkgZnVuY3Rpb25zIGFyZSBjYWxsZWQgYnkgdGhlIGJhc2UgY2xhc3MgdG8gZW1pdCBjb2RlIGZvciB0aGUKLSAqIGdpdmVuIGVudGl0eSwgcHJpbnRfKigpIGZ1bmN0aW9ucyB3cml0ZSBhIHBpZWNlIG9mIGNvZGUgdG8gdGhlIHBhc3NlZAotICogc3RyZWFtLCBhbmQgcmVuZGVyXyooKSByZXR1cm4gYSBzdHJpbmcgY29udGFpbmluZyB0aGUgRCByZXByZXNlbnRhdGlvbiBvZgotICogdGhlIHBhc3NlZCBlbnRpdHkuCi0gKi8KLWNsYXNzIHRfZF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKLXB1YmxpYzoKLSAgdF9kX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RyaW5nLCBzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKLSAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCi0gICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgewotICAgICh2b2lkKXBhcnNlZF9vcHRpb25zOwotICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7Ci0gICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tZCI7Ci0gIH0KLQotcHJvdGVjdGVkOgotICB2aXJ0dWFsIHZvaWQgaW5pdF9nZW5lcmF0b3IoKSB7Ci0gICAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5Ci0gICAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKLQotICAgIHN0cmluZyBkaXIgPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiZCIpOwotICAgIHN0cmluZyBzdWJkaXIgPSBnZXRfb3V0X2RpcigpOwotICAgIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKLSAgICB3aGlsZSAoKGxvYyA9IGRpci5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykgewotICAgICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyLnN1YnN0cigwLCBsb2MpOwotICAgICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOwotICAgICAgZGlyID0gZGlyLnN1YnN0cihsb2MgKyAxKTsKLSAgICB9Ci0gICAgaWYgKCFkaXIuZW1wdHkoKSkgewotICAgICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyOwotICAgICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOwotICAgIH0KLQotICAgIHBhY2thZ2VfZGlyXyA9IHN1YmRpciArICIvIjsKLQotICAgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgICBzdHJpbmcgZl90eXBlc19uYW1lID0gcGFja2FnZV9kaXJfICsgcHJvZ3JhbV9uYW1lXyArICJfdHlwZXMuZCI7Ci0gICAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7Ci0KLSAgICAvLyBQcmludCBoZWFkZXIKLSAgICBmX3R5cGVzXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCAibW9kdWxlICIgPDwgcmVuZGVyX3BhY2thZ2UoKnByb2dyYW1fKSA8PCBwcm9ncmFtX25hbWVfCi0gICAgICAgICAgICAgPDwgIl90eXBlczsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIHByaW50X2RlZmF1bHRfaW1wb3J0cyhmX3R5cGVzXyk7Ci0KLSAgICAvLyBJbmNsdWRlIHR5cGUgbW9kdWxlcyBmcm9tIG90aGVyIGltcG9ydGVkIHByb2dyYW1zLgotICAgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgewotICAgICAgZl90eXBlc18gPDwgImltcG9ydCAiIDw8IHJlbmRlcl9wYWNrYWdlKCooaW5jbHVkZXNbaV0pKSA8PCBpbmNsdWRlc1tpXS0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgPDwgIl90eXBlczsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGlmICghaW5jbHVkZXMuZW1wdHkoKSkKLSAgICAgIGZfdHlwZXNfIDw8IGVuZGw7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCkgewotICAgIC8vIENsb3NlIG91dHB1dCBmaWxlCi0gICAgZl90eXBlc18uY2xvc2UoKTsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgewotICAgIGlmICghY29uc3RzLmVtcHR5KCkpIHsKLSAgICAgIHN0cmluZyBmX2NvbnN0c19uYW1lID0gcGFja2FnZV9kaXJfICsgcHJvZ3JhbV9uYW1lXyArICJfY29uc3RhbnRzLmQiOwotICAgICAgb2ZzdHJlYW0gZl9jb25zdHM7Ci0gICAgICBmX2NvbnN0cy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7Ci0KLSAgICAgIGZfY29uc3RzIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8ICJtb2R1bGUgIiA8PCByZW5kZXJfcGFja2FnZSgqcHJvZ3JhbV8pIDw8IHByb2dyYW1fbmFtZV8KLSAgICAgICAgICAgICAgIDw8ICJfY29uc3RhbnRzOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgICBwcmludF9kZWZhdWx0X2ltcG9ydHMoZl9jb25zdHMpOwotCi0gICAgICBmX2NvbnN0cyA8PCAiaW1wb3J0ICIgPDwgcmVuZGVyX3BhY2thZ2UoKmdldF9wcm9ncmFtKCkpIDw8IHByb2dyYW1fbmFtZV8gPDwgIl90eXBlczsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0KLSAgICAgIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgICAgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgICAgIHN0cmluZyBuYW1lID0gKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgICB0X3R5cGUqIHR5cGUgPSAoKmNfaXRlciktPmdldF90eXBlKCk7Ci0gICAgICAgIGluZGVudChmX2NvbnN0cykgPDwgImltbXV0YWJsZSgiIDw8IHJlbmRlcl90eXBlX25hbWUodHlwZSkgPDwgIikgIiA8PCBuYW1lIDw8ICI7IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICBmX2NvbnN0cyA8PCBlbmRsIDw8ICJzdGF0aWMgdGhpcygpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLQotICAgICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgewotICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGZfY29uc3RzIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgICAgdF90eXBlKiB0eXBlID0gKCpjX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgICBpbmRlbnQoZl9jb25zdHMpIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIjsKLSAgICAgICAgaWYgKCFpc19pbW11dGFibGVfdHlwZSh0eXBlKSkgewotICAgICAgICAgIGZfY29uc3RzIDw8ICJjYXN0KGltbXV0YWJsZSgiIDw8IHJlbmRlcl90eXBlX25hbWUodHlwZSkgPDwgIikpICI7Ci0gICAgICAgIH0KLSAgICAgICAgZl9jb25zdHMgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkpIDw8ICI7IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChmX2NvbnN0cykgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgewotICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJhbGlhcyAiIDw8IHJlbmRlcl90eXBlX25hbWUodHR5cGVkZWYtPmdldF90eXBlKCkpIDw8ICIgIgotICAgICAgICAgICAgIDw8IHR0eXBlZGVmLT5nZXRfc3ltYm9saWMoKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgewotICAgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOwotCi0gICAgc3RyaW5nIGVudW1fbmFtZSA9IHRlbnVtLT5nZXRfbmFtZSgpOwotICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJlbnVtICIgPDwgZW51bV9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKLQotICAgIGluZGVudF91cCgpOwotCi0gICAgdmVjdG9yPHRfZW51bV92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBjX2l0ZXI7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl90eXBlc18gPDwgIiwiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBpbmRlbnQoZl90eXBlc18pIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgIGZfdHlwZXNfIDw8ICIgPSAiIDw8ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgfQotCi0gICAgZl90eXBlc18gPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChmX3R5cGVzXykgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgICBmX3R5cGVzXyA8PCBlbmRsOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICAgIHByaW50X3N0cnVjdF9kZWZpbml0aW9uKGZfdHlwZXNfLCB0c3RydWN0LCBmYWxzZSk7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgewotICAgIHByaW50X3N0cnVjdF9kZWZpbml0aW9uKGZfdHlwZXNfLCB0eGNlcHRpb24sIHRydWUpOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAgIHN0cmluZyBzdmNfbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpOwotCi0gICAgLy8gU2VydmljZSBpbXBsZW1lbnRhdGlvbiBmaWxlIGluY2x1ZGVzCi0gICAgc3RyaW5nIGZfc2VydmljZW5hbWUgPSBwYWNrYWdlX2Rpcl8gKyBzdmNfbmFtZSArICIuZCI7Ci0gICAgc3RkOjpvZnN0cmVhbSBmX3NlcnZpY2U7Ci0gICAgZl9zZXJ2aWNlLm9wZW4oZl9zZXJ2aWNlbmFtZS5jX3N0cigpKTsKLSAgICBmX3NlcnZpY2UgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgIm1vZHVsZSAiIDw8IHJlbmRlcl9wYWNrYWdlKCpwcm9ncmFtXykgPDwgc3ZjX25hbWUgPDwgIjsiCi0gICAgICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIHByaW50X2RlZmF1bHRfaW1wb3J0cyhmX3NlcnZpY2UpOwotCi0gICAgZl9zZXJ2aWNlIDw8ICJpbXBvcnQgIiA8PCByZW5kZXJfcGFja2FnZSgqZ2V0X3Byb2dyYW0oKSkgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX3R5cGVzOyIgPDwgZW5kbDsKLQotICAgIHRfc2VydmljZSogZXh0ZW5kc19zZXJ2aWNlID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7Ci0gICAgaWYgKGV4dGVuZHNfc2VydmljZSAhPSBOVUxMKSB7Ci0gICAgICBmX3NlcnZpY2UgPDwgImltcG9ydCAiIDw8IHJlbmRlcl9wYWNrYWdlKCooZXh0ZW5kc19zZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSkKLSAgICAgICAgICAgICAgICA8PCBleHRlbmRzX3NlcnZpY2UtPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgZl9zZXJ2aWNlIDw8IGVuZGw7Ci0KLSAgICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICAgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgICBleHRlbmRzID0gIiA6ICIgKyByZW5kZXJfdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICB9Ci0KLSAgICBmX3NlcnZpY2UgPDwgaW5kZW50KCkgPDwgImludGVyZmFjZSAiIDw8IHN2Y19uYW1lIDw8IGV4dGVuZHMgPDwgIiB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgLy8gQ29sbGVjdCBhbGwgdGhlIGV4Y2VwdGlvbiB0eXBlcyBzZXJ2aWNlIG1ldGhvZHMgY2FuIHRocm93IHNvIHdlIGNhbgotICAgIC8vIGVtaXQgdGhlIG5lY2Vzc2FyeSBhbGlhc2VzIGxhdGVyLgotICAgIHNldDx0X3R5cGUqPiBleGNlcHRpb25fdHlwZXM7Ci0KLSAgICAvLyBQcmludCB0aGUgbWV0aG9kIHNpZ25hdHVyZXMuCi0gICAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZuX2l0ZXI7Ci0gICAgZm9yIChmbl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZuX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZuX2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZSA8PCBpbmRlbnQoKTsKLSAgICAgIHByaW50X2Z1bmN0aW9uX3NpZ25hdHVyZShmX3NlcnZpY2UsICpmbl9pdGVyKTsKLSAgICAgIGZfc2VydmljZSA8PCAiOyIgPDwgZW5kbDsKLQotICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZXhjZXB0aW9ucyA9ICgqZm5faXRlciktPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKTsKLSAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGV4X2l0ZXI7Ci0gICAgICBmb3IgKGV4X2l0ZXIgPSBleGNlcHRpb25zLmJlZ2luKCk7IGV4X2l0ZXIgIT0gZXhjZXB0aW9ucy5lbmQoKTsgKytleF9pdGVyKSB7Ci0gICAgICAgIGV4Y2VwdGlvbl90eXBlcy5pbnNlcnQoKCpleF9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gQWxpYXMgdGhlIGV4Y2VwdGlvbiB0eXBlcyBpbnRvIHRoZSBjdXJyZW50IHNjb3BlLgotICAgIGlmICghZXhjZXB0aW9uX3R5cGVzLmVtcHR5KCkpCi0gICAgICBmX3NlcnZpY2UgPDwgZW5kbDsKLSAgICBzZXQ8dF90eXBlKj46OmNvbnN0X2l0ZXJhdG9yIGV0X2l0ZXI7Ci0gICAgZm9yIChldF9pdGVyID0gZXhjZXB0aW9uX3R5cGVzLmJlZ2luKCk7IGV0X2l0ZXIgIT0gZXhjZXB0aW9uX3R5cGVzLmVuZCgpOyArK2V0X2l0ZXIpIHsKLSAgICAgIGluZGVudChmX3NlcnZpY2UpIDw8ICJhbGlhcyAiIDw8IHJlbmRlcl9wYWNrYWdlKCooKmV0X2l0ZXIpLT5nZXRfcHJvZ3JhbSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgPDwgKCpldF9pdGVyKS0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKSA8PCAiX3R5cGVzIgotICAgICAgICAgICAgICAgICAgICAgICAgPDwgIi4iIDw8ICgqZXRfaXRlciktPmdldF9uYW1lKCkgPDwgIiAiIDw8ICgqZXRfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgIH0KLQotICAgIC8vIFdyaXRlIHRoZSBtZXRob2QgbWV0YWRhdGEuCi0gICAgb3N0cmluZ3N0cmVhbSBtZXRhOwotICAgIGluZGVudF91cCgpOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAoZm5faXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmbl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmbl9pdGVyKSB7Ci0gICAgICBpZiAoKCpmbl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKS5lbXB0eSgpCi0gICAgICAgICAgJiYgKCpmbl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpLmVtcHR5KCkgJiYgISgqZm5faXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG1ldGEgPDwgIiwiOwotICAgICAgfQotCi0gICAgICBtZXRhIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIlRNZXRob2RNZXRhKGAiIDw8ICgqZm5faXRlciktPmdldF9uYW1lKCkgPDwgImAsICIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG1ldGEpIDw8ICJbIjsKLQotICAgICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBwYXJhbXMgPSAoKmZuX2l0ZXIpLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOwotICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgcF9pdGVyOwotICAgICAgZm9yIChwX2l0ZXIgPSBwYXJhbXMuYmVnaW4oKTsgcF9pdGVyICE9IHBhcmFtcy5lbmQoKTsgKytwX2l0ZXIpIHsKLSAgICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBtZXRhIDw8ICIsICI7Ci0gICAgICAgIH0KLQotICAgICAgICBtZXRhIDw8ICJUUGFyYW1NZXRhKGAiIDw8ICgqcF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiYCwgIiA8PCAoKnBfaXRlciktPmdldF9rZXkoKTsKLQotICAgICAgICB0X2NvbnN0X3ZhbHVlKiBjdiA9ICgqcF9pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgICAgIGlmIChjdiAhPSBOVUxMKSB7Ci0gICAgICAgICAgbWV0YSA8PCAiLCBxeyIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKCgqcF9pdGVyKS0+Z2V0X3R5cGUoKSwgY3YpIDw8ICJ9IjsKLSAgICAgICAgfQotICAgICAgICBtZXRhIDw8ICIpIjsKLSAgICAgIH0KLQotICAgICAgbWV0YSA8PCAiXSI7Ci0KLSAgICAgIGlmICghKCpmbl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpLmVtcHR5KCkgfHwgKCpmbl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgbWV0YSA8PCAiLCIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiWyI7Ci0KLSAgICAgICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGV4Y2VwdGlvbnMgPSAoKmZuX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCk7Ci0gICAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGV4X2l0ZXI7Ci0gICAgICAgIGZvciAoZXhfaXRlciA9IGV4Y2VwdGlvbnMuYmVnaW4oKTsgZXhfaXRlciAhPSBleGNlcHRpb25zLmVuZCgpOyArK2V4X2l0ZXIpIHsKLSAgICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1ldGEgPDwgIiwgIjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBtZXRhIDw8ICJURXhjZXB0aW9uTWV0YShgIiA8PCAoKmV4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJgLCAiIDw8ICgqZXhfaXRlciktPmdldF9rZXkoKQotICAgICAgICAgICAgICAgPDwgIiwgYCIgPDwgKCpleF9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSA8PCAiYCkiOwotICAgICAgICB9Ci0KLSAgICAgICAgbWV0YSA8PCAiXSI7Ci0gICAgICB9Ci0KLSAgICAgIGlmICgoKmZuX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgICBtZXRhIDw8ICIsIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJUTWV0aG9kVHlwZS5PTkVXQVkiOwotICAgICAgfQotCi0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgbWV0YSA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIpIjsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLQotICAgIHN0cmluZyBtZXRhX3N0cihtZXRhLnN0cigpKTsKLSAgICBpZiAoIW1ldGFfc3RyLmVtcHR5KCkpIHsKLSAgICAgIGZfc2VydmljZSA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJlbnVtIG1ldGhvZE1ldGEgPSBbIiA8PCBtZXRhX3N0ciA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJdOyIKLSAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgIH0KLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KGZfc2VydmljZSkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgICAvLyBTZXJ2ZXIgc2tlbGV0b24gZ2VuZXJhdGlvbi4KLSAgICBzdHJpbmcgZl9za2VsZXRvbm5hbWUgPSBwYWNrYWdlX2Rpcl8gKyBzdmNfbmFtZSArICJfc2VydmVyLnNrZWxldG9uLmQiOwotICAgIHN0ZDo6b2ZzdHJlYW0gZl9za2VsZXRvbjsKLSAgICBmX3NrZWxldG9uLm9wZW4oZl9za2VsZXRvbm5hbWUuY19zdHIoKSk7Ci0gICAgcHJpbnRfc2VydmVyX3NrZWxldG9uKGZfc2tlbGV0b24sIHRzZXJ2aWNlKTsKLSAgICBmX3NrZWxldG9uLmNsb3NlKCk7Ci0gIH0KLQotcHJpdmF0ZToKLSAgLyoqCi0gICAqIFdyaXRlcyBhIHNlcnZlciBza2VsZXRvbiBmb3IgdGhlIHBhc3NlZCBzZXJ2aWNlIHRvIG91dC4KLSAgICovCi0gIHZvaWQgcHJpbnRfc2VydmVyX3NrZWxldG9uKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAgIHN0cmluZyBzdmNfbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpOwotCi0gICAgb3V0IDw8ICIvKiIgPDwgZW5kbAotICAgICAgICA8PCAiICogVGhpcyBhdXRvLWdlbmVyYXRlZCBza2VsZXRvbiBmaWxlIGlsbHVzdHJhdGVzIGhvdyB0byBidWlsZCBhIHNlcnZlci4gSWYgeW91IiA8PCBlbmRsCi0gICAgICAgIDw8ICIgKiBpbnRlbmQgdG8gY3VzdG9taXplIGl0LCB5b3Ugc2hvdWxkIGVkaXQgYSBjb3B5IHdpdGggYW5vdGhlciBmaWxlIG5hbWUgdG8gIiA8PCBlbmRsCi0gICAgICAgIDw8ICIgKiBhdm9pZCBvdmVyd3JpdGluZyBpdCB3aGVuIHJ1bm5pbmcgdGhlIGdlbmVyYXRvciBhZ2Fpbi4iIDw8IGVuZGwgPDwgIiAqLyIgPDwgZW5kbAotICAgICAgICA8PCAibW9kdWxlICIgPDwgcmVuZGVyX3BhY2thZ2UoKnRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCBzdmNfbmFtZSA8PCAiX3NlcnZlcjsiIDw8IGVuZGwKLSAgICAgICAgPDwgZW5kbCA8PCAiaW1wb3J0IHN0ZC5zdGRpbzsiIDw8IGVuZGwgPDwgImltcG9ydCB0aHJpZnQuY29kZWdlbi5wcm9jZXNzb3I7IiA8PCBlbmRsCi0gICAgICAgIDw8ICJpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmJpbmFyeTsiIDw8IGVuZGwgPDwgImltcG9ydCB0aHJpZnQuc2VydmVyLnNpbXBsZTsiIDw8IGVuZGwKLSAgICAgICAgPDwgImltcG9ydCB0aHJpZnQuc2VydmVyLnRyYW5zcG9ydC5zb2NrZXQ7IiA8PCBlbmRsIDw8ICJpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5idWZmZXJlZDsiCi0gICAgICAgIDw8IGVuZGwgPDwgImltcG9ydCB0aHJpZnQudXRpbC5oYXNoc2V0OyIgPDwgZW5kbCA8PCBlbmRsIDw8ICJpbXBvcnQgIgotICAgICAgICA8PCByZW5kZXJfcGFja2FnZSgqdHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8IHN2Y19uYW1lIDw8ICI7IiA8PCBlbmRsIDw8ICJpbXBvcnQgIgotICAgICAgICA8PCByZW5kZXJfcGFja2FnZSgqZ2V0X3Byb2dyYW0oKSkgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX3R5cGVzOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGVuZGwKLSAgICAgICAgPDwgImNsYXNzICIgPDwgc3ZjX25hbWUgPDwgIkhhbmRsZXIgOiAiIDw8IHN2Y19uYW1lIDw8ICIgeyIgPDwgZW5kbDsKLQotICAgIGluZGVudF91cCgpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGhpcygpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgLy8gWW91ciBpbml0aWFsaXphdGlvbiBnb2VzIGhlcmUuIgotICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gICAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICAgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCk7Ci0gICAgICBwcmludF9mdW5jdGlvbl9zaWduYXR1cmUob3V0LCAqZl9pdGVyKTsKLSAgICAgIG91dCA8PCAiIHsiIDw8IGVuZGw7Ci0KLSAgICAgIGluZGVudF91cCgpOwotCi0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIi8vIFlvdXIgaW1wbGVtZW50YXRpb24gZ29lcyBoZXJlLiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAid3JpdGVsbihcIiIKLSAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiBjYWxsZWRcIik7IiA8PCBlbmRsOwotCi0gICAgICB0X2Jhc2VfdHlwZSogcnQgPSAodF9iYXNlX3R5cGUqKSgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKTsKLSAgICAgIGlmIChydC0+Z2V0X2Jhc2UoKSAhPSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdHlwZW9mKHJldHVybikuaW5pdDsiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAgIH0KLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgb3V0IDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgInZvaWQgbWFpbigpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJhdXRvIHByb3RvY29sRmFjdG9yeSA9IG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5ISgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICA8PCAiYXV0byBwcm9jZXNzb3IgPSBuZXcgVFNlcnZpY2VQcm9jZXNzb3IhIiA8PCBzdmNfbmFtZSA8PCAiKG5ldyAiIDw8IHN2Y19uYW1lCi0gICAgICAgIDw8ICJIYW5kbGVyKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImF1dG8gc2VydmVyVHJhbnNwb3J0ID0gbmV3IFRTZXJ2ZXJTb2NrZXQoOTA5MCk7IgotICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJhdXRvIHRyYW5zcG9ydEZhY3RvcnkgPSBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeTsiIDw8IGVuZGwKLSAgICAgICAgPDwgaW5kZW50KCkgPDwgImF1dG8gc2VydmVyID0gbmV3IFRTaW1wbGVTZXJ2ZXIoIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgIDw8ICIgIHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICA8PCAic2VydmVyLnNlcnZlKCk7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgb3V0IDw8ICJ9IiA8PCBlbmRsOwotICB9Ci0KLSAgLyoqCi0gICAqIFdyaXRlcyB0aGUgZGVmaW5pdGlvbiBvZiBhIHN0cnVjdCBvciBhbiBleGNlcHRpb24gdHlwZSB0byBvdXQuCi0gICAqLwotICB2b2lkIHByaW50X3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0KLSAgICBpZiAoaXNfZXhjZXB0aW9uKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgOiBURXhjZXB0aW9uIHsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJzdHJ1Y3QgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgeyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICAvLyBEZWNsYXJlIGFsbCBmaWVsZHMuCi0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIGluZGVudChvdXQpIDw8IHJlbmRlcl90eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IgotICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpZiAoIW1lbWJlcnMuZW1wdHkoKSkKLSAgICAgIGluZGVudChvdXQpIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIm1peGluIFRTdHJ1Y3RIZWxwZXJzISgiOwotCi0gICAgaWYgKCFtZW1iZXJzLmVtcHR5KCkpIHsKLSAgICAgIC8vIElmIHRoZXJlIGFyZSBhbnkgZmllbGRzLCBjb25zdHJ1Y3QgdGhlIFRGaWVsZE1ldGEgYXJyYXkgdG8gcGFzcyB0bwotICAgICAgLy8gVFN0cnVjdEhlbHBlcnMuIFdlIGNhbid0IGp1c3QgcGFzcyBhbiBlbXB0eSBhcnJheSBpZiBub3QgYmVjYXVzZSBbXQotICAgICAgLy8gZG9lc24ndCBwYXNzIHRoZSBURmllbGRNZXRhW10gY29uc3RyYWludC4KLSAgICAgIG91dCA8PCAiWyI7Ci0gICAgICBpbmRlbnRfdXAoKTsKLQotICAgICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICAgIGlmIChmaXJzdCkgewotICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgb3V0IDw8ICIsIjsKLSAgICAgICAgfQotICAgICAgICBvdXQgPDwgZW5kbDsKLQotICAgICAgICBpbmRlbnQob3V0KSA8PCAiVEZpZWxkTWV0YShgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgImAsICIgPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCk7Ci0KLSAgICAgICAgdF9jb25zdF92YWx1ZSogY3YgPSAoKm1faXRlciktPmdldF92YWx1ZSgpOwotICAgICAgICB0X2ZpZWxkOjplX3JlcSByZXEgPSAoKm1faXRlciktPmdldF9yZXEoKTsKLSAgICAgICAgb3V0IDw8ICIsICIgPDwgcmVuZGVyX3JlcShyZXEpOwotICAgICAgICBpZiAoY3YgIT0gTlVMTCkgewotICAgICAgICAgIG91dCA8PCAiLCBxeyIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSwgY3YpIDw8ICJ9IjsKLSAgICAgICAgfQotICAgICAgICBvdXQgPDwgIikiOwotICAgICAgfQotCi0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIl0iOwotICAgIH0KLQotICAgIG91dCA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLQotICAvKioKLSAgICogUHJpbnRzIHRoZSBEIGZ1bmN0aW9uIHNpZ25hdHVyZSAoaW5jbHVkaW5nIHJldHVybiB0eXBlKSBmb3IgdGhlIGdpdmVuCi0gICAqIG1ldGhvZC4KLSAgICovCi0gIHZvaWQgcHJpbnRfZnVuY3Rpb25fc2lnbmF0dXJlKG9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogZm4pIHsKLSAgICBvdXQgPDwgcmVuZGVyX3R5cGVfbmFtZShmbi0+Z2V0X3JldHVybnR5cGUoKSkgPDwgIiAiIDw8IGZuLT5nZXRfbmFtZSgpIDw8ICIoIjsKLQotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGZuLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgIiwgIjsKLSAgICAgIH0KLSAgICAgIG91dCA8PCByZW5kZXJfdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSwgdHJ1ZSkgPDwgIiAiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICB9Ci0KLSAgICBvdXQgPDwgIikiOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIEQgcmVwcmVzZW50YXRpb24gb2YgdmFsdWUuIFRoZSByZXN1bHQgaXMgZ3VhcmFudGVlZCB0byBiZSBhCi0gICAqIHNpbmdsZSBleHByZXNzaW9uOyBmb3IgY29tcGxleCB0eXBlcywgaW1tZWRpYXRlbHkgY2FsbGVkIGRlbGVnYXRlCi0gICAqIGxpdGVyYWxzIGFyZSB1c2VkIHRvIGFjaGlldmUgdGhpcy4KLSAgICovCi0gIHN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewotICAgIC8vIFJlc29sdmUgYW55IHR5cGVkZWZzLgotICAgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gICAgb3N0cmluZ3N0cmVhbSBvdXQ7Ci0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgb3V0IDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIG91dCA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgb3V0IDw8ICJjYXN0KCIgPDwgcmVuZGVyX3R5cGVfbmFtZSh0eXBlKSA8PCAiKSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICJMIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiQ29tcGlsZXIgZXJyb3I6IE5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgb3V0IDw8ICJjYXN0KCIgPDwgcmVuZGVyX3R5cGVfbmFtZSh0eXBlKSA8PCAiKSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCAieyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotCi0gICAgICBpbmRlbnQob3V0KSA8PCByZW5kZXJfdHlwZV9uYW1lKHR5cGUpIDw8ICIgdjsiIDw8IGVuZGw7Ci0gICAgICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAidiA9ICIgPDwgKHR5cGUtPmlzX3hjZXB0aW9uKCkgPyAibmV3ICIgOiAiIikgPDwgcmVuZGVyX3R5cGVfbmFtZSh0eXBlKQotICAgICAgICAgICAgICAgICAgICA8PCAiKCk7IiA8PCBlbmRsOwotCi0gICAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOwotICAgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgICAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgICAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7Ci0gICAgICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7Ci0gICAgICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKLSAgICAgICAgICAgIHRocm93ICJUeXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIKLSAgICAgICAgICAgICAgICArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgInYuc2V0IWAiIDw8IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSA8PCAiYCgiIDw8IHZhbCA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICAgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICAgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICAgICAgc3RyaW5nIGtleSA9IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgdl9pdGVyLT5maXJzdCk7Ci0gICAgICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgICAgIGluZGVudChvdXQpIDw8ICJ2WyI7Ci0gICAgICAgICAgaWYgKCFpc19pbW11dGFibGVfdHlwZShrdHlwZSkpIHsKLSAgICAgICAgICAgIG91dCA8PCAiY2FzdChpbW11dGFibGUoIiA8PCByZW5kZXJfdHlwZV9uYW1lKGt0eXBlKSA8PCAiKSkiOwotICAgICAgICAgIH0KLSAgICAgICAgICBvdXQgPDwga2V5IDw8ICJdID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICAgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICAgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKTsKLSAgICAgICAgICBpbmRlbnQob3V0KSA8PCAidiB+PSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgICAgICB0X3R5cGUqIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICAgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICAgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKTsKLSAgICAgICAgICBpbmRlbnQob3V0KSA8PCAidiB+PSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdGhyb3cgIkNvbXBpbGVyIGVycm9yOiBJbnZhbGlkIHR5cGUgaW4gcmVuZGVyX2NvbnN0X3ZhbHVlOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLSAgICAgIH0KLSAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdjsiIDw8IGVuZGw7Ci0KLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSgpIjsKLSAgICB9Ci0KLSAgICByZXR1cm4gb3V0LnN0cigpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIEQgcGFja2FnZSB0byB3aGljaCBtb2R1bGVzIGZvciBwcm9ncmFtIGFyZSB3cml0dGVuICh3aXRoIGEKLSAgICogdHJhaWxpbmcgZG90LCBpZiBub3QgZW1wdHkpLgotICAgKi8KLSAgc3RyaW5nIHJlbmRlcl9wYWNrYWdlKGNvbnN0IHRfcHJvZ3JhbSYgcHJvZ3JhbSkgY29uc3QgewotICAgIHN0cmluZyBwYWNrYWdlID0gcHJvZ3JhbS5nZXRfbmFtZXNwYWNlKCJkIik7Ci0gICAgaWYgKHBhY2thZ2Uuc2l6ZSgpID09IDApCi0gICAgICByZXR1cm4gIiI7Ci0gICAgcmV0dXJuIHBhY2thZ2UgKyAiLiI7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgRCByZXBlc2VudGF0aW9uIG9mIHR0eXBlLgotICAgKgotICAgKiBJZiBpc0FyZyBpcyB0cnVlLCBhIGNvbnN0IHJlZmVyZW5jZSB0byB0aGUgdHlwZSB3aWxsIGJlIHJldHVybmVkIGZvcgotICAgKiBzdHJ1Y3RzLgotICAgKi8KLSAgc3RyaW5nIHJlbmRlcl90eXBlX25hbWUoY29uc3QgdF90eXBlKiB0dHlwZSwgYm9vbCBpc0FyZyA9IGZhbHNlKSBjb25zdCB7Ci0gICAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgcmV0dXJuICJ2b2lkIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICByZXR1cm4gInN0cmluZyI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIHJldHVybiAiYm9vbCI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIHJldHVybiAiYnl0ZSI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgcmV0dXJuICJzaG9ydCI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgcmV0dXJuICJpbnQiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIHJldHVybiAibG9uZyI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgcmV0dXJuICJkb3VibGUiOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgIkNvbXBpbGVyIGVycm9yOiBObyBEIHR5cGUgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotICAgIH0KLQotICAgIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICAgIHRfY29udGFpbmVyKiB0Y29udGFpbmVyID0gKHRfY29udGFpbmVyKil0dHlwZTsKLSAgICAgIGlmICh0Y29udGFpbmVyLT5oYXNfY3BwX25hbWUoKSkgewotICAgICAgICByZXR1cm4gdGNvbnRhaW5lci0+Z2V0X2NwcF9uYW1lKCk7Ci0gICAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgICAgICB0X21hcCogdG1hcCA9ICh0X21hcCopdHR5cGU7Ci0gICAgICAgIHRfdHlwZSoga3R5cGUgPSB0bWFwLT5nZXRfa2V5X3R5cGUoKTsKLQotICAgICAgICBzdHJpbmcgbmFtZSA9IHJlbmRlcl90eXBlX25hbWUodG1hcC0+Z2V0X3ZhbF90eXBlKCkpICsgIlsiOwotICAgICAgICBpZiAoIWlzX2ltbXV0YWJsZV90eXBlKGt0eXBlKSkgewotICAgICAgICAgIG5hbWUgKz0gImltbXV0YWJsZSgiOwotICAgICAgICB9Ci0gICAgICAgIG5hbWUgKz0gcmVuZGVyX3R5cGVfbmFtZShrdHlwZSk7Ci0gICAgICAgIGlmICghaXNfaW1tdXRhYmxlX3R5cGUoa3R5cGUpKSB7Ci0gICAgICAgICAgbmFtZSArPSAiKSI7Ci0gICAgICAgIH0KLSAgICAgICAgbmFtZSArPSAiXSI7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgICAgdF9zZXQqIHRzZXQgPSAodF9zZXQqKXR0eXBlOwotICAgICAgICByZXR1cm4gIkhhc2hTZXQhKCIgKyByZW5kZXJfdHlwZV9uYW1lKHRzZXQtPmdldF9lbGVtX3R5cGUoKSkgKyAiKSI7Ci0gICAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgICAgdF9saXN0KiB0bGlzdCA9ICh0X2xpc3QqKXR0eXBlOwotICAgICAgICByZXR1cm4gcmVuZGVyX3R5cGVfbmFtZSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpKSArICJbXSI7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSAmJiBpc0FyZykgewotICAgICAgcmV0dXJuICJyZWYgY29uc3QoIiArIHR0eXBlLT5nZXRfbmFtZSgpICsgIikiOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gdHR5cGUtPmdldF9uYW1lKCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIEQgVFJlcSBlbnVtIG1lbWJlciBjb3JyZXNwb25kaW5nIHRvIHJlcS4KLSAgICovCi0gIHN0cmluZyByZW5kZXJfcmVxKHRfZmllbGQ6OmVfcmVxIHJlcSkgY29uc3QgewotICAgIHN3aXRjaCAocmVxKSB7Ci0gICAgY2FzZSB0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUOgotICAgICAgcmV0dXJuICJUUmVxLk9QVF9JTl9SRVFfT1VUIjsKLSAgICBjYXNlIHRfZmllbGQ6OlRfT1BUSU9OQUw6Ci0gICAgICByZXR1cm4gIlRSZXEuT1BUSU9OQUwiOwotICAgIGNhc2UgdF9maWVsZDo6VF9SRVFVSVJFRDoKLSAgICAgIHJldHVybiAiVFJlcS5SRVFVSVJFRCI7Ci0gICAgZGVmYXVsdDogewotICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7Ci0gICAgICBzcyA8PCAiQ29tcGlsZXIgZXJyb3I6IEludmFsaWQgcmVxdWlyZW1lbnQgbGV2ZWwgIiA8PCByZXE7Ci0gICAgICB0aHJvdyBzcy5zdHIoKTsKLSAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFdyaXRlcyB0aGUgZGVmYXVsdCBsaXN0IG9mIGltcG9ydHMgKHdoaWNoIGFyZSB3cml0dGVuIHRvIGV2ZXJ5IGdlbmVyYXRlZAotICAgKiBtb2R1bGUpIHRvIGYuCi0gICAqLwotICB2b2lkIHByaW50X2RlZmF1bHRfaW1wb3J0cyhvc3RyZWFtJiBvdXQpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaW1wb3J0IHRocmlmdC5iYXNlOyIgPDwgZW5kbCA8PCAiaW1wb3J0IHRocmlmdC5jb2RlZ2VuLmJhc2U7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgPDwgImltcG9ydCB0aHJpZnQudXRpbC5oYXNoc2V0OyIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgd2hldGhlciB0eXBlIGlzIMK7aW50cmluc2ljYWxseSBpbW11dGFibGXCqywgaW4gdGhlIHNlbnNlIHRoYXQKLSAgICogYSB2YWx1ZSBvZiB0aGF0IHR5cGUgaXMgaW1wbGljaXRseSBjYXN0YWJsZSB0byBpbW11dGFibGUodHlwZSksIGFuZCBpdCBpcwotICAgKiBhbGxvd2VkIGZvciBBQSBrZXlzIHdpdGhvdXQgYW4gaW1tdXRhYmxlKCkgcXVhbGlmaWVyLgotICAgKi8KLSAgYm9vbCBpc19pbW11dGFibGVfdHlwZSh0X3R5cGUqIHR5cGUpIGNvbnN0IHsKLSAgICB0X3R5cGUqIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLSAgICByZXR1cm4gdHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR0eXBlLT5pc19lbnVtKCk7Ci0gIH0KLQotICAvKgotICAgKiBGaWxlIHN0cmVhbXMsIHN0b3JlZCBoZXJlIHRvIGF2b2lkIHBhc3NpbmcgdGhlbSBhcyBwYXJhbWV0ZXJzIHRvIGV2ZXJ5Ci0gICAqIGZ1bmN0aW9uLgotICAgKi8KLSAgb2ZzdHJlYW0gZl90eXBlc187Ci0gIG9mc3RyZWFtIGZfaGVhZGVyXzsKLQotICBzdHJpbmcgcGFja2FnZV9kaXJfOwotfTsKLQotVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihkLCAiRCIsICIiKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2RlbHBoaV9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfZGVscGhpX2dlbmVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RmNDljNi4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfZGVscGhpX2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDM5MDAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgotICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKLSAqIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGNhc3NlcnQ+Ci0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8bGlzdD4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxjY3R5cGU+Ci0KLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotI2luY2x1ZGUgInRfb29wX2dlbmVyYXRvci5oIgotCi11c2luZyBzdGQ6Om1hcDsKLXVzaW5nIHN0ZDo6b2ZzdHJlYW07Ci11c2luZyBzdGQ6Om9zdHJlYW07Ci11c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Ci11c2luZyBzdGQ6OnN0cmluZzsKLXVzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwotdXNpbmcgc3RkOjp2ZWN0b3I7Ci0KLXN0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKLQotY2xhc3MgdF9kZWxwaGlfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7Ci1wdWJsaWM6Ci0gIHRfZGVscGhpX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQotICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKLSAgICAodm9pZClvcHRpb25fc3RyaW5nOwotICAgIGluZGVudF9pbXBsXyA9IDA7Ci0gICAgaGFzX2ZvcndhcmQgPSBmYWxzZTsKLSAgICBoYXNfZW51bSA9IGZhbHNlOwotICAgIGhhc19jb25zdCA9IGZhbHNlOwotICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgiYW5zaXN0cl9iaW5hcnkiKTsKLSAgICBhbnNpc3RyX2JpbmFyeV8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoInJlZ2lzdGVyX3R5cGVzIik7Ci0gICAgcmVnaXN0ZXJfdHlwZXNfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJjb25zdHByZWZpeCIpOwotICAgIGNvbnN0cHJlZml4XyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgiZXZlbnRzIik7Ci0gICAgZXZlbnRzXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgieG1sZG9jIik7Ci0gICAgeG1sZG9jXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWRlbHBoaSI7Ci0gICAgZXNjYXBlXy5jbGVhcigpOwotICAgIGVzY2FwZV9bJ1wnJ10gPSAiJyciOwotICB9Ci0KLSAgdm9pZCBpbml0X2dlbmVyYXRvcigpOwotICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOwotCi0gIHZvaWQgZ2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpOwotCi0gIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKLSAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOwotICB2b2lkIGdlbmVyYXRlX2ZvcndhcmRfZGVjbGFyYXRpb24odF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9wZXJ0eShvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpc1B1YmxpYywgYm9vbCBpc194Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfcHJvcGVydHlfd3JpdGVyXyhvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpc1B1YmxpYyk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHkob3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN0cnVjdF9pc19leGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1B1YmxpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRQcmVmaXggPSAiIik7Ci0gIHZvaWQgZ2VuZXJhdGVfZGVscGhpX2lzc2V0X3JlYWRlcl9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBib29sIGlzX3hjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHlfcmVhZGVyX2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb25fY2xhc3MpOwotICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9wcm9wZXJ0eV93cml0ZXJfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbl9jbGFzcyk7Ci0gIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5X3JlYWRlcl9pbXBsKG9zdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkUHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uX2NsYXNzKTsKLSAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHlfd3JpdGVyX2ltcGwob3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjbHNfcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRQcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb25fY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfdW5pb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb25fZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgeGNlcHRpb25fZmFjdHJveV9uYW1lKTsKLSAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfY2xlYXJfdW5pb25fdmFsdWUob3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjbHNfcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRQcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb25fY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfdW5pb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb25fZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgeGNlcHRpb25fZmFjdHJveV9uYW1lKTsKLSAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfaXNzZXRfcmVhZGVyX2ltcGwob3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjbHNfcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRQcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3Rfd3JpdGVyX2ltcGwob3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcl9pbXBsKG9zdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjbHNfcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKTsKLQotICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfdG9zdHJpbmdfaW1wbChvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNsc19wcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194X2ZhY3RvcnkpOwotCi0gIHZvaWQgYWRkX2RlbHBoaV91c2VzX2xpc3Qoc3RyaW5nIHVuaXRuYW1lKTsKLQotICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfcmVhZGVyX2ltcGwob3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9jcmVhdGVfZXhjZXB0aW9uX2ltcGwob3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNsc19wcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKTsKLQotICBib29sIGNvbnN0X25lZWRzX3Zhcih0X3R5cGUqIHR5cGUpOwotICB2b2lkIHByaW50X2NvbnN0X3Byb3Aoc3RkOjpvc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKLSAgdm9pZCBwcmludF9wcml2YXRlX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0gIHZvaWQgcHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvc3RyZWFtJiB2YXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKLSAgdm9pZCBpbml0aWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgdmFycywKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKLSAgdm9pZCBmaW5hbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjbHNfbm0gPSAiIik7Ci0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZShzdGQ6Om9zdHJlYW0mIGxvY2FsX3ZhcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0gIHZvaWQgcHJpbnRfY29uc3RfZGVmX3ZhbHVlKHN0ZDo6b3N0cmVhbSYgdmFycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNsc19ubSA9ICIiKTsKLSAgc3RkOjpzdHJpbmcgbWFrZV9jb25zdGFudHNfY2xhc3NuYW1lKCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9pbXBsKG9zdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hfZmFjdG9yeSA9IGZhbHNlKTsKLSAgdm9pZCBwcmludF9kZWxwaGlfc3RydWN0X3R5cGVfZmFjdG9yeV9mdW5jKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfdHlwZV9mYWN0b3J5KG9zdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjbHNfcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194X2ZhY3RvcnkgPSBmYWxzZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF90eXBlX2ZhY3RvcnlfcmVnaXN0cmF0aW9uKG9zdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hfZmFjdG9yeSA9IGZhbHNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY2xhc3MgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194X2ZhY3RvcnkgPSBmYWxzZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9yZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3Jlc3VsdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfdG9zdHJpbmcoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLQotICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiBmdW5jdGlvbik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBsb2NhbF92YXJzKTsKLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXgpOwotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIGxvY2FsX3ZhcnMpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBsb2NhbF92YXJzKTsKLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIGxvY2FsX3ZhcnMpOwotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiBsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgbG9jYWxfdmFycyk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIGxvY2FsX3ZhcnMpOwotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgbG9jYWxfdmFycyk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBsb2NhbF92YXJzKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgbG9jYWxfdmFycyk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBsb2NhbF92YXJzKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBsb2NhbF92YXJzKTsKLQotICB2b2lkIGRlbHBoaV90eXBlX3VzaW5ncyhzdGQ6Om9zdHJlYW0mIG91dCk7Ci0gIHN0ZDo6c3RyaW5nIGRlbHBoaV90aHJpZnRfdXNpbmdzKCk7Ci0KLSAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sIGJfY2xzID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sIGJfbm9fcG9zdGZpeCA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiX2V4Y2VwdGlvbl9mYWN0b3J5ID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sIGJfZnVsbF9leGNlcHRpb25fZmFjdG9yeSA9IGZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgbm9ybWFsaXplX2Nsc25tKHN0ZDo6c3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJfbm9fY2hlY2tfa2V5d29yZCA9IGZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgbWFrZV92YWxpZF9kZWxwaGlfaWRlbnRpZmllcihzdGQ6OnN0cmluZyBjb25zdCYgZnJvbU5hbWUpOwotICBzdGQ6OnN0cmluZyBpbnB1dF9hcmdfcHJlZml4KHRfdHlwZSogdHR5cGUpOwotCi0gIHN0ZDo6c3RyaW5nIGJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0YmFzZSk7Ci0gIHN0ZDo6c3RyaW5nIGRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5pdCA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb25fY2xhc3MgPSBmYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmdWxsX2NscyA9ICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHN0ZDo6c3RyaW5nIGNvbnN0cnVjdG9yX2FyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIGN1cnJlbnRfaW5kZW50KTsKLSAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOwotICBzdGQ6OnN0cmluZyBwcm9wX25hbWUodF9maWVsZCogdGZpZWxkLCBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UpOwotICBzdGQ6OnN0cmluZyBwcm9wX25hbWUoc3RkOjpzdHJpbmcgbmFtZSwgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgY29uc3RydWN0b3JfcGFyYW1fbmFtZShzdHJpbmcgbmFtZSk7Ci0KLSAgdm9pZCB3cml0ZV9lbnVtKHN0ZDo6c3RyaW5nIGxpbmUpOwotICB2b2lkIHdyaXRlX2ZvcndhcmRfZGVjcihzdGQ6OnN0cmluZyBsaW5lKTsKLSAgdm9pZCB3cml0ZV9jb25zdChzdGQ6OnN0cmluZyBsaW5lKTsKLSAgdm9pZCB3cml0ZV9zdHJ1Y3Qoc3RkOjpzdHJpbmcgbGluZSk7Ci0gIHZvaWQgd3JpdGVfc2VydmljZShzdGQ6OnN0cmluZyBsaW5lKTsKLQotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGF1dG9nZW5fY29tbWVudCgpIHsKLSAgICByZXR1cm4gc3RkOjpzdHJpbmcoIigqKlxuIikgKyAiICogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKCIgKyBUSFJJRlRfVkVSU0lPTiArICIpXG4iCi0gICAgICAgICAgICsgIiAqXG4iICsgIiAqIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkdcbiIKLSAgICAgICAgICAgKyAiICopXG4iOwotICB9Ci0KLSAgc3RyaW5nIHJlcGxhY2VfYWxsKHN0cmluZyBjb250ZW50cywgc3RyaW5nIHNlYXJjaCwgc3RyaW5nIHJlcGxhY2UpOwotICBzdHJpbmcgeG1sX2VuY29kZShzdHJpbmcgY29udGVudHMpOwotICBzdHJpbmcgeG1sZG9jX2VuY29kZShzdHJpbmcgY29udGVudHMpOwotICBzdHJpbmcgeG1sYXR0cmliX2VuY29kZShzdHJpbmcgY29udGVudHMpOwotICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9kb2Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKTsKLSAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfZG9jKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2RvYyogdGRvYyk7Ci0gIHZvaWQgZ2VuZXJhdGVfZGVscGhpX2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGRvYyk7Ci0gIHZvaWQgZ2VuZXJhdGVfZGVscGhpX2RvY3N0cmluZ19jb21tZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCBzdHJpbmcgY29udGVudHMpOwotCi0gIGJvb2wgdHlwZV9jYW5fYmVfbnVsbCh0X3R5cGUqIHR0eXBlKSB7Ci0gICAgd2hpbGUgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICAgIHR0eXBlID0gKCh0X3R5cGVkZWYqKXR0eXBlKS0+Z2V0X3R5cGUoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKTsKLSAgfQotCi1wcml2YXRlOgotICBzdGQ6OnN0cmluZyBuYW1lc3BhY2VfbmFtZV87Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBzX2ZvcndhcmRfZGVjcjsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIHNfZW51bTsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIHNfY29uc3Q7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBzX3N0cnVjdDsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIHNfc2VydmljZTsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIHNfY29uc3RfaW1wbDsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIHNfc3RydWN0X2ltcGw7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBzX3NlcnZpY2VfaW1wbDsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIHNfdHlwZV9mYWN0b3J5X3JlZ2lzdHJhdGlvbjsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIHNfdHlwZV9mYWN0b3J5X2Z1bmNzOwotICBib29sIGhhc19mb3J3YXJkOwotICBib29sIGhhc19lbnVtOwotICBib29sIGhhc19jb25zdDsKLSAgc3RkOjpzdHJpbmcgbmFtZXNwYWNlX2Rpcl87Ci0gIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IGRlbHBoaV9rZXl3b3JkczsKLSAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gZGVscGhpX3Jlc2VydmVkX21ldGhvZDsKLSAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb247Ci0gIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IHR5cGVzX2tub3duOwotICBzdGQ6Omxpc3Q8dF90eXBlZGVmKj4gdHlwZWRlZnNfcGVuZGluZzsKLSAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHVzZXNfbGlzdDsKLSAgdm9pZCBjcmVhdGVfa2V5d29yZHMoKTsKLSAgYm9vbCBmaW5kX2tleXdvcmQoc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4mIGtleXdvcmRfbWFwLCBzdGQ6OnN0cmluZyBuYW1lKTsKLSAgc3RkOjpzdHJpbmcgbm9ybWFsaXplX25hbWUoc3RkOjpzdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiX21ldGhvZCA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJfZXhjZXB0aW9uX21ldGhvZCA9IGZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgZW1wdHlfdmFsdWUodF90eXBlKiB0eXBlKTsKLSAgYm9vbCBpc19mdWxseV9kZWZpbmVkX3R5cGUodF90eXBlKiB0dHlwZSk7Ci0gIHZvaWQgYWRkX2RlZmluZWRfdHlwZSh0X3R5cGUqIHR0eXBlKTsKLSAgdm9pZCBpbml0X2tub3duX3R5cGVzX2xpc3QoKTsKLSAgYm9vbCBpc192b2lkKHRfdHlwZSogdHlwZSk7Ci0gIGludCBpbmRlbnRfaW1wbF87Ci0gIGJvb2wgYW5zaXN0cl9iaW5hcnlfOwotICBib29sIHJlZ2lzdGVyX3R5cGVzXzsKLSAgYm9vbCBjb25zdHByZWZpeF87Ci0gIGJvb2wgZXZlbnRzXzsKLSAgYm9vbCB4bWxkb2NfOwotICB2b2lkIGluZGVudF91cF9pbXBsKCkgeyArK2luZGVudF9pbXBsXzsgfTsKLSAgdm9pZCBpbmRlbnRfZG93bl9pbXBsKCkgeyAtLWluZGVudF9pbXBsXzsgfTsKLSAgc3RkOjpzdHJpbmcgaW5kZW50X2ltcGwoKSB7Ci0gICAgc3RkOjpzdHJpbmcgaW5kID0gIiI7Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGluZGVudF9pbXBsXzsgKytpKSB7Ci0gICAgICBpbmQgKz0gIiAgIjsKLSAgICB9Ci0gICAgcmV0dXJuIGluZDsKLSAgfTsKLSAgc3RkOjpvc3RyZWFtJiBpbmRlbnRfaW1wbChzdGQ6Om9zdHJlYW0mIG9zKSB7IHJldHVybiBvcyA8PCBpbmRlbnRfaW1wbCgpOyB9OwotfTsKLQotc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6cmVwbGFjZV9hbGwoc3RyaW5nIGNvbnRlbnRzLCBzdHJpbmcgc2VhcmNoLCBzdHJpbmcgcmVwbCkgewotICBzdHJpbmcgc3RyKGNvbnRlbnRzKTsKLQotICBzaXplX3Qgc2xlbiA9IHNlYXJjaC5sZW5ndGgoKTsKLSAgc2l6ZV90IHJsZW4gPSByZXBsLmxlbmd0aCgpOwotICBzaXplX3QgaW5jciA9IChybGVuID4gMCkgPyBybGVuIDogMTsKLQotICBpZiAoc2xlbiA+IDApIHsKLSAgICBzaXplX3QgZm91bmQgPSBzdHIuZmluZChzZWFyY2gpOwotICAgIHdoaWxlICgoZm91bmQgIT0gc3RyaW5nOjpucG9zKSAmJiAoZm91bmQgPCBzdHIubGVuZ3RoKCkpKSB7Ci0gICAgICBzdHIucmVwbGFjZShmb3VuZCwgc2xlbiwgcmVwbCk7Ci0gICAgICBmb3VuZCA9IHN0ci5maW5kKHNlYXJjaCwgZm91bmQgKyBpbmNyKTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gc3RyOwotfQotCi0vLyBYTUwgZW5jb2RpbmcKLXN0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6OnhtbF9lbmNvZGUoc3RyaW5nIGNvbnRlbnRzKSB7Ci0gIHN0cmluZyBzdHIoY29udGVudHMpOwotCi0gIC8vIGVzY2FwZSB0aGUgZXNjYXBlCi0gIHN0ciA9IHJlcGxhY2VfYWxsKHN0ciwgIiYiLCAiJmFtcDsiKTsKLQotICAvLyBvdGhlciBzdGFuZGFyZCBYTUwgZW50aXRpZXMKLSAgc3RyID0gcmVwbGFjZV9hbGwoc3RyLCAiPCIsICImbHQ7Iik7Ci0gIHN0ciA9IHJlcGxhY2VfYWxsKHN0ciwgIj4iLCAiJmd0OyIpOwotCi0gIHJldHVybiBzdHI7Ci19Ci0KLS8vIFhNTCBhdHRyaWJ1dGUgZW5jb2RpbmcKLXN0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6OnhtbGF0dHJpYl9lbmNvZGUoc3RyaW5nIGNvbnRlbnRzKSB7Ci0gIHN0cmluZyBzdHIoeG1sX2VuY29kZShjb250ZW50cykpOwotCi0gIC8vIG91ciBhdHRyaWJzIGFyZSBlbmNsb3NlZCBpbiAiCi0gIHN0ciA9IHJlcGxhY2VfYWxsKHN0ciwgIlwiIiwgIlxcXCIiKTsKLQotICByZXR1cm4gc3RyOwotfQotCi0vLyBYTUwgZW5jb2RpbmcgZm9yIGRvYyBjb21tZW50cwotc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6eG1sZG9jX2VuY29kZShzdHJpbmcgY29udGVudHMpIHsKLSAgc3RyaW5nIHN0cih4bWxfZW5jb2RlKGNvbnRlbnRzKSk7Ci0KLSAgLy8gWE1MRG9jIHNwZWNpZmljOiBjb252ZXJ0IGxpbmVicmVha3MgaW50byA8cGFyYT5ncmFwaHM8L3BhcmE+Ci0gIHN0ciA9IHJlcGxhY2VfYWxsKHN0ciwgIlxyXG4iLCAiXHIiKTsKLSAgc3RyID0gcmVwbGFjZV9hbGwoc3RyLCAiXG4iLCAiXHIiKTsKLSAgc3RyID0gcmVwbGFjZV9hbGwoc3RyLCAiXHIiLCAiPC9wYXJhPlxuPHBhcmE+Iik7Ci0KLSAgcmV0dXJuIHN0cjsKLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9kb2NzdHJpbmdfY29tbWVudChvc3RyZWFtJiBvdXQsIHN0cmluZyBjb250ZW50cykgewotICBpZiAoeG1sZG9jXykgewotICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieyRSRUdJT04gJ1hNTERvYyd9Ly8vIDxzdW1tYXJ5PlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLy8vICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxwYXJhPiIgKyBjb250ZW50cyArICI8L3BhcmE+IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLy8vIDwvc3VtbWFyeT5cbnskRU5EUkVHSU9OfVxuIik7Ci0gIH0KLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9kb2Mob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCkgewotICBpZiAoeG1sZG9jXykgewotICAgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfZW51bSgpKSB7Ci0gICAgICBzdHJpbmcgY29tYmluZWRfbWVzc2FnZSA9IHhtbGRvY19lbmNvZGUoZmllbGQtPmdldF9kb2MoKSkgKyAiXG48c2VlYWxzbyBjcmVmPVwiIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHhtbGRvY19lbmNvZGUodHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpKSkgKyAiXCIvPiI7Ci0gICAgICBnZW5lcmF0ZV9kZWxwaGlfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCBjb21iaW5lZF9tZXNzYWdlKTsKLSAgICB9IGVsc2UgewotICAgICAgZ2VuZXJhdGVfZGVscGhpX2RvYyhvdXQsICh0X2RvYyopZmllbGQpOwotICAgIH0KLSAgfQotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX2RvYyhvc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKSB7Ci0gIGlmICh0ZG9jLT5oYXNfZG9jKCkgJiYgeG1sZG9jXykgewotICAgIGdlbmVyYXRlX2RlbHBoaV9kb2NzdHJpbmdfY29tbWVudChvdXQsIHhtbGRvY19lbmNvZGUodGRvYy0+Z2V0X2RvYygpKSk7Ci0gIH0KLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9kb2Mob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgaWYgKHRmdW5jdGlvbi0+aGFzX2RvYygpICYmIHhtbGRvY18pIHsKLSAgICBzdHJpbmdzdHJlYW0gcHM7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHBfaXRlcjsKLSAgICBmb3IgKHBfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBwX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK3BfaXRlcikgewotICAgICAgdF9maWVsZCogcCA9ICpwX2l0ZXI7Ci0gICAgICBwcyA8PCAiXG48cGFyYW0gbmFtZT1cIiIgPDwgeG1sYXR0cmliX2VuY29kZShwLT5nZXRfbmFtZSgpKSA8PCAiXCI+IjsKLSAgICAgIGlmIChwLT5oYXNfZG9jKCkpIHsKLSAgICAgICAgc3RkOjpzdHJpbmcgc3RyID0gcC0+Z2V0X2RvYygpOwotICAgICAgICBzdHIuZXJhc2Uoc3RkOjpyZW1vdmUoc3RyLmJlZ2luKCksIHN0ci5lbmQoKSwgJ1xuJyksCi0gICAgICAgICAgICAgICAgICBzdHIuZW5kKCkpOyAvLyByZW1vdmUgdGhlIG5ld2xpbmVzIHRoYXQgYXBwZWFyIGZyb20gdGhlIHBhcnNlcgotICAgICAgICBwcyA8PCB4bWxkb2NfZW5jb2RlKHN0cik7Ci0gICAgICB9Ci0gICAgICBwcyA8PCAiPC9wYXJhbT4iOwotICAgIH0KLSAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInskUkVHSU9OICdYTUxEb2MnfSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8vLyAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8c3VtbWFyeT48cGFyYT4iICsgeG1sZG9jX2VuY29kZSh0ZnVuY3Rpb24tPmdldF9kb2MoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI8L3BhcmE+PC9zdW1tYXJ5PiIgKyBwcy5zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieyRFTkRSRUdJT059XG4iKTsKLSAgfQotfQotCi1ib29sIHRfZGVscGhpX2dlbmVyYXRvcjo6ZmluZF9rZXl3b3JkKHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+JiBrZXl3b3JkX21hcCwgc3RkOjpzdHJpbmcgbmFtZSkgewotICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGxlbiA9IG5hbWUubGVuZ3RoKCk7Ci0KLSAgaWYgKGxlbiA8PSAwKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBubGFzdCA9IG5hbWUuZmluZF9sYXN0X29mKCdfJyk7Ci0KLSAgaWYgKG5sYXN0ID49IDEpIHsKLSAgICBpZiAobmxhc3QgPT0gKGxlbiAtIDEpKSB7Ci0gICAgICBzdHJpbmcgbmV3X25hbWUobmFtZSwgMCwgbmxhc3QpOwotICAgICAgcmV0dXJuIGZpbmRfa2V5d29yZChrZXl3b3JkX21hcCwgbmV3X25hbWUpOwotICAgIH0KLSAgfQotICByZXR1cm4gKGtleXdvcmRfbWFwW25hbWVdID09IDEpOwotfQotCi1zdGQ6OnN0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6Om5vcm1hbGl6ZV9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9tZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9leGNlcHRpb25fbWV0aG9kKSB7Ci0gIHN0cmluZyB0bXAobmFtZSk7Ci0gIHN0ZDo6dHJhbnNmb3JtKHRtcC5iZWdpbigpLCB0bXAuZW5kKCksIHRtcC5iZWdpbigpLCBzdGF0aWNfY2FzdDxpbnQgKCopKGludCk+KHN0ZDo6dG9sb3dlcikpOwotCi0gIGJvb2wgYl9mb3VuZCA9IGZhbHNlOwotCi0gIGlmIChmaW5kX2tleXdvcmQoZGVscGhpX2tleXdvcmRzLCB0bXApKSB7Ci0gICAgYl9mb3VuZCA9IHRydWU7Ci0gIH0gZWxzZSBpZiAoYl9tZXRob2QgJiYgZmluZF9rZXl3b3JkKGRlbHBoaV9yZXNlcnZlZF9tZXRob2QsIHRtcCkpIHsKLSAgICBiX2ZvdW5kID0gdHJ1ZTsKLSAgfSBlbHNlIGlmIChiX2V4Y2VwdGlvbl9tZXRob2QgJiYgZmluZF9rZXl3b3JkKGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uLCB0bXApKSB7Ci0gICAgYl9mb3VuZCA9IHRydWU7Ci0gIH0KLQotICBpZiAoYl9mb3VuZCkgewotICAgIHJldHVybiBuYW1lICsgIl8iOwotICB9IGVsc2UgewotICAgIHJldHVybiBuYW1lOwotICB9Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpjcmVhdGVfa2V5d29yZHMoKSB7Ci0gIGRlbHBoaV9rZXl3b3Jkc1siYW5kIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbImVuZCJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJpbnRlcmZhY2UiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1sicmFpc2UiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1sidXNlcyJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJhcnJheSJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJleGNlcHQiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1siaXMiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1sicmVjb3JkIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbInZhciJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJhcyJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJleHBvcnRzIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbImxhYmVsIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbInJlcGVhdCJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJ3aGlsZSJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJhc20iXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1siZmlsZSJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJsaWJyYXJ5Il0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbInJlc291cmNlc3RyaW5nIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbIndpdGgiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1siYmVnaW4iXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1siZmluYWxpemF0aW9uIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbIm1vZCJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJzZXQiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1sieG9yIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbImNhc2UiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1siZmluYWxseSJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJuaWwiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1sic2hsIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbImNsYXNzIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbImZvciJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJub3QiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1sic2hyIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbImNvbnN0Il0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbImZ1bmN0aW9uIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbIm9iamVjdCJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJzdHJpbmciXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1siY29uc3RydWN0b3IiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1siZ290byJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJvZiJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJ0aGVuIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbImRlc3RydWN0b3IiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1siaWYiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1sib3IiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1sidGhyZWFkdmFyIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbImRpc3BpbnRlcmZhY2UiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1siaW1wbGVtZW50YXRpb24iXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1sib3V0Il0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbInRvIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbImRpdiJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJpbiJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJwYWNrZWQiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1sidHJ5Il0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbImRvIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbImluaGVyaXRlZCJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJwcm9jZWR1cmUiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1sidHlwZSJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJkb3dudG8iXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1siaW5pdGlhbGl6YXRpb24iXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1sicHJvZ3JhbSJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJ1bml0Il0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbImVsc2UiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1siaW5saW5lIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbInByb3BlcnR5Il0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbInVudGlsIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbInByaXZhdGUiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1sicHJvdGVjdGVkIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbInB1YmxpYyJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJwdWJsaXNoZWQiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1siYXV0b21hdGVkIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbImF0Il0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbIm9uIl0gPSAxOwotCi0gIC8vIHJlc2VydmVkL3ByZWRlZmluZWQgdmFyaWFibGVzIGFuZCB0eXBlcyAobG93ZXJjYXNlISkKLSAgZGVscGhpX2tleXdvcmRzWyJyZXN1bHQiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1sidGJ5dGVzIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbInRvYmplY3QiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1sidGNsYXNzIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbInRpbnRlcmZhY2Vkb2JqZWN0Il0gPSAxOwotCi0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImNyZWF0ZSJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiZnJlZSJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiaW5pdGluc3RhbmNlIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJjbGVhbnVwaW5zdGFuY2UiXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImNsYXNzdHlwZSJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiY2xhc3NuYW1lIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJjbGFzc25hbWVpcyJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiY2xhc3NwYXJlbnQiXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImNsYXNzaW5mbyJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiaW5zdGFuY2VzaXplIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJpbmhlcml0c2Zyb20iXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbIm1ldGhvZGFkZHJlc3MiXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbIm1ldGhvZGFkZHJlc3MiXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbIm1ldGhvZG5hbWUiXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImZpZWxkYWRkcmVzcyJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiZmllbGRhZGRyZXNzIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJnZXRpbnRlcmZhY2UiXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImdldGludGVyZmFjZWVudHJ5Il0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJnZXRpbnRlcmZhY2V0YWJsZSJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsidW5pdG5hbWUiXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImVxdWFscyJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiZ2V0aGFzaGNvZGUiXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbInRvc3RyaW5nIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJzYWZlY2FsbGV4Y2VwdGlvbiJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiYWZ0ZXJjb25zdHJ1Y3Rpb24iXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImJlZm9yZWRlc3RydWN0aW9uIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJkaXNwYXRjaCJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiZGVmYXVsdGhhbmRsZXIiXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbIm5ld2luc3RhbmNlIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJmcmVlaW5zdGFuY2UiXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImRlc3Ryb3kiXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbInJlYWQiXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbIndyaXRlIl0gPSAxOwotCi0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJzZXRpbm5lcmV4Y2VwdGlvbiJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bInNldHN0YWNraW5mbyJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bImdldHN0YWNrdHJhY2UiXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJyYWlzaW5nZXhjZXB0aW9uIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsiY3JlYXRlZm10Il0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsiY3JlYXRlcmVzIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsiY3JlYXRlcmVzZm10Il0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsiY3JlYXRlaGVscCJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bImNyZWF0ZWZtdGhlbHAiXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJjcmVhdGVyZXNoZWxwIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsiY3JlYXRlcmVzZm10aGVscCJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bImdldGJhc2VleGNlcHRpb24iXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJiYXNlZXhjZXB0aW9uIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsiaGVscGNvbnRleHQiXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJpbm5lcmV4Y2VwdGlvbiJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bIm1lc3NhZ2UiXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJzdGFja3RyYWNlIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsic3RhY2tpbmZvIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsiZ2V0ZXhjZXB0aW9uc3RhY2tpbmZvcHJvYyJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bImdldHN0YWNraW5mb3N0cmluZ3Byb2MiXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJjbGVhbnVwc3RhY2tpbmZvcHJvYyJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bInJhaXNlb3V0ZXJleGNlcHRpb24iXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJ0aHJvd291dGVyZXhjZXB0aW9uIl0gPSAxOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6YWRkX2RlbHBoaV91c2VzX2xpc3Qoc3RyaW5nIHVuaXRuYW1lKSB7Ci0gIHZlY3RvcjxzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIHNfaXRlcjsKLSAgYm9vbCBmb3VuZCA9IGZhbHNlOwotICBmb3IgKHNfaXRlciA9IHVzZXNfbGlzdC5iZWdpbigpOyBzX2l0ZXIgIT0gdXNlc19saXN0LmVuZCgpOyArK3NfaXRlcikgewotICAgIGlmICgoKnNfaXRlcikgPT0gdW5pdG5hbWUpIHsKLSAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICBpZiAoIWZvdW5kKSB7Ci0gICAgdXNlc19saXN0LnB1c2hfYmFjayh1bml0bmFtZSk7Ci0gIH0KLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgewotICBpbmRlbnRfaW1wbF8gPSAwOwotICBuYW1lc3BhY2VfbmFtZV8gPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiZGVscGhpIik7Ci0gIGhhc19mb3J3YXJkID0gZmFsc2U7Ci0gIGhhc19lbnVtID0gZmFsc2U7Ci0gIGhhc19jb25zdCA9IGZhbHNlOwotICBjcmVhdGVfa2V5d29yZHMoKTsKLSAgYWRkX2RlbHBoaV91c2VzX2xpc3QoIkNsYXNzZXMiKTsKLSAgYWRkX2RlbHBoaV91c2VzX2xpc3QoIlN5c1V0aWxzIik7Ci0gIGFkZF9kZWxwaGlfdXNlc19saXN0KCJHZW5lcmljcy5Db2xsZWN0aW9ucyIpOwotICBhZGRfZGVscGhpX3VzZXNfbGlzdCgiVGhyaWZ0Iik7Ci0gIGFkZF9kZWxwaGlfdXNlc19saXN0KCJUaHJpZnQuVXRpbHMiKTsKLSAgYWRkX2RlbHBoaV91c2VzX2xpc3QoIlRocmlmdC5Db2xsZWN0aW9ucyIpOwotICBhZGRfZGVscGhpX3VzZXNfbGlzdCgiVGhyaWZ0LlByb3RvY29sIik7Ci0gIGFkZF9kZWxwaGlfdXNlc19saXN0KCJUaHJpZnQuVHJhbnNwb3J0Iik7Ci0KLSAgaWYgKHJlZ2lzdGVyX3R5cGVzXykgewotICAgIGFkZF9kZWxwaGlfdXNlc19saXN0KCJUaHJpZnQuVHlwZVJlZ2lzdHJ5Iik7Ci0gIH0KLQotICBpbml0X2tub3duX3R5cGVzX2xpc3QoKTsKLQotICBzdHJpbmcgdW5pdG5hbWUsIG5zbmFtZTsKLSAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgewotICAgIHVuaXRuYW1lID0gaW5jbHVkZXNbaV0tPmdldF9uYW1lKCk7Ci0gICAgbnNuYW1lID0gaW5jbHVkZXNbaV0tPmdldF9uYW1lc3BhY2UoImRlbHBoaSIpOwotICAgIGlmICgiIiAhPSBuc25hbWUpIHsKLSAgICAgIHVuaXRuYW1lID0gbnNuYW1lOwotICAgIH0KLSAgICBhZGRfZGVscGhpX3VzZXNfbGlzdCh1bml0bmFtZSk7Ci0gIH0KLQotICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgewotICBzdGQ6OnN0cmluZyB1bml0bmFtZSA9IHByb2dyYW1fbmFtZV87Ci0gIGlmICgiIiAhPSBuYW1lc3BhY2VfbmFtZV8pIHsKLSAgICB1bml0bmFtZSA9IG5hbWVzcGFjZV9uYW1lXzsKLSAgfQotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgKGludCl1bml0bmFtZS5zaXplKCk7IGkrKykgewotICAgIGlmICh1bml0bmFtZVtpXSA9PSAnICcpIHsKLSAgICAgIHVuaXRuYW1lLnJlcGxhY2UoaSwgMSwgIl8iKTsKLSAgICB9Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBmX25hbWUgPSBnZXRfb3V0X2RpcigpICsgIi8iICsgdW5pdG5hbWUgKyAiLnBhcyI7Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9hbGw7Ci0KLSAgZl9hbGwub3BlbihmX25hbWUuY19zdHIoKSk7Ci0KLSAgZl9hbGwgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKLSAgZ2VuZXJhdGVfZGVscGhpX2RvYyhmX2FsbCwgcHJvZ3JhbV8pOwotICBmX2FsbCA8PCAidW5pdCAiIDw8IHVuaXRuYW1lIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGZfYWxsIDw8ICJpbnRlcmZhY2UiIDw8IGVuZGwgPDwgZW5kbDsKLSAgZl9hbGwgPDwgInVzZXMiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgdmVjdG9yPHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3Igc19pdGVyOwotICBmb3IgKHNfaXRlciA9IHVzZXNfbGlzdC5iZWdpbigpOyBzX2l0ZXIgIT0gdXNlc19saXN0LmVuZCgpOyArK3NfaXRlcikgewotICAgIGlmIChzX2l0ZXIgIT0gdXNlc19saXN0LmJlZ2luKCkpIHsKLSAgICAgIGZfYWxsIDw8ICIsIjsKLSAgICAgIGZfYWxsIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudChmX2FsbCkgPDwgKnNfaXRlcjsKLSAgfQotCi0gIGZfYWxsIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBzdHJpbmcgdG1wX3VuaXQodW5pdG5hbWUpOwotICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpdG1wX3VuaXQuc2l6ZSgpOyBpKyspIHsKLSAgICBpZiAodG1wX3VuaXRbaV0gPT0gJy4nKSB7Ci0gICAgICB0bXBfdW5pdC5yZXBsYWNlKGksIDEsICJfIik7Ci0gICAgfQotICB9Ci0KLSAgZl9hbGwgPDwgImNvbnN0IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KGZfYWxsKSA8PCAiYyIgPDwgdG1wX3VuaXQKLSAgICAgICAgICAgICAgICA8PCAiX09wdGlvbl9BbnNpU3RyX0JpbmFyeSA9ICIgPDwgKGFuc2lzdHJfYmluYXJ5XyA/ICJUcnVlIiA6ICJGYWxzZSIpIDw8ICI7IgotICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gIGluZGVudChmX2FsbCkgPDwgImMiIDw8IHRtcF91bml0Ci0gICAgICAgICAgICAgICAgPDwgIl9PcHRpb25fUmVnaXN0ZXJfVHlwZXMgPSAiIDw8IChyZWdpc3Rlcl90eXBlc18gPyAiVHJ1ZSIgOiAiRmFsc2UiKSA8PCAiOyIKLSAgICAgICAgICAgICAgICA8PCBlbmRsOwotICBpbmRlbnQoZl9hbGwpIDw8ICJjIiA8PCB0bXBfdW5pdAotICAgICAgICAgICAgICAgIDw8ICJfT3B0aW9uX0NvbnN0UHJlZml4ICAgID0gIiA8PCAoY29uc3RwcmVmaXhfID8gIlRydWUiIDogIkZhbHNlIikgPDwgIjsiIDw8IGVuZGw7Ci0gIGluZGVudChmX2FsbCkgPDwgImMiIDw8IHRtcF91bml0IDw8ICJfT3B0aW9uX0V2ZW50cyAgICAgICAgID0gIiA8PCAoZXZlbnRzXyA/ICJUcnVlIiA6ICJGYWxzZSIpCi0gICAgICAgICAgICAgICAgPDwgIjsiIDw8IGVuZGw7Ci0gIGluZGVudChmX2FsbCkgPDwgImMiIDw8IHRtcF91bml0IDw8ICJfT3B0aW9uX1htbERvYyAgICAgICAgID0gIiA8PCAoeG1sZG9jXyA/ICJUcnVlIiA6ICJGYWxzZSIpCi0gICAgICAgICAgICAgICAgPDwgIjsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgZl9hbGwgPDwgZW5kbDsKLSAgZl9hbGwgPDwgInR5cGUiIDw8IGVuZGw7Ci0gIGlmIChoYXNfZm9yd2FyZCkgewotICAgIGZfYWxsIDw8IHNfZm9yd2FyZF9kZWNyLnN0cigpIDw8IGVuZGw7Ci0gIH0KLSAgaWYgKGhhc19lbnVtKSB7Ci0gICAgaW5kZW50KGZfYWxsKSA8PCBlbmRsOwotICAgIGluZGVudChmX2FsbCkgPDwgInskU0NPUEVERU5VTVMgT059IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgZl9hbGwgPDwgc19lbnVtLnN0cigpOwotICAgIGluZGVudChmX2FsbCkgPDwgInskU0NPUEVERU5VTVMgT0ZGfSIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0gIGZfYWxsIDw8IHNfc3RydWN0LnN0cigpOwotICBmX2FsbCA8PCBzX3NlcnZpY2Uuc3RyKCk7Ci0gIGZfYWxsIDw8IHNfY29uc3Quc3RyKCk7Ci0gIGZfYWxsIDw8ICJpbXBsZW1lbnRhdGlvbiIgPDwgZW5kbCA8PCBlbmRsOwotICBmX2FsbCA8PCBzX3N0cnVjdF9pbXBsLnN0cigpOwotICBmX2FsbCA8PCBzX3NlcnZpY2VfaW1wbC5zdHIoKTsKLSAgZl9hbGwgPDwgc19jb25zdF9pbXBsLnN0cigpOwotCi0gIGlmIChyZWdpc3Rlcl90eXBlc18pIHsKLSAgICBmX2FsbCA8PCBlbmRsOwotICAgIGZfYWxsIDw8ICIvLyBUeXBlIGZhY3RvcnkgbWV0aG9kcyBhbmQgcmVnaXN0cmF0aW9uIiA8PCBlbmRsOwotICAgIGZfYWxsIDw8IHNfdHlwZV9mYWN0b3J5X2Z1bmNzLnN0cigpOwotICAgIGZfYWxsIDw8ICJwcm9jZWR1cmUgUmVnaXN0ZXJUeXBlRmFjdG9yaWVzOyIgPDwgZW5kbDsKLSAgICBmX2FsbCA8PCAiYmVnaW4iIDw8IGVuZGw7Ci0gICAgZl9hbGwgPDwgc190eXBlX2ZhY3RvcnlfcmVnaXN0cmF0aW9uLnN0cigpOwotICAgIGZfYWxsIDw8ICJlbmQ7IiA8PCBlbmRsOwotICB9Ci0gIGZfYWxsIDw8IGVuZGw7Ci0KLSAgc3RyaW5nIGNvbnN0YW50c19jbGFzcyA9IG1ha2VfY29uc3RhbnRzX2NsYXNzbmFtZSgpOwotCi0gIGZfYWxsIDw8ICJpbml0aWFsaXphdGlvbiIgPDwgZW5kbDsKLSAgaWYgKGhhc19jb25zdCkgewotICAgIGZfYWxsIDw8ICJ7JElGIENvbXBpbGVyVmVyc2lvbiA8IDIxLjB9ICAvLyBEMjAxMCIgPDwgZW5kbDsKLSAgICBmX2FsbCA8PCAiICAiIDw8IGNvbnN0YW50c19jbGFzcy5jX3N0cigpIDw8ICJfSW5pdGlhbGl6ZTsiIDw8IGVuZGw7Ci0gICAgZl9hbGwgPDwgInskSUZFTkR9IiA8PCBlbmRsOwotICB9Ci0gIGlmIChyZWdpc3Rlcl90eXBlc18pIHsKLSAgICBmX2FsbCA8PCAiICBSZWdpc3RlclR5cGVGYWN0b3JpZXM7IiA8PCBlbmRsOwotICB9Ci0gIGZfYWxsIDw8IGVuZGw7Ci0KLSAgZl9hbGwgPDwgImZpbmFsaXphdGlvbiIgPDwgZW5kbDsKLSAgaWYgKGhhc19jb25zdCkgewotICAgIGZfYWxsIDw8ICJ7JElGIENvbXBpbGVyVmVyc2lvbiA8IDIxLjB9ICAvLyBEMjAxMCIgPDwgZW5kbDsKLSAgICBmX2FsbCA8PCAiICAiIDw8IGNvbnN0YW50c19jbGFzcy5jX3N0cigpIDw8ICJfRmluYWxpemU7IiA8PCBlbmRsOwotICAgIGZfYWxsIDw8ICJ7JElGRU5EfSIgPDwgZW5kbDsKLSAgfQotICBmX2FsbCA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZl9hbGwgPDwgImVuZC4iIDw8IGVuZGw7Ci0gIGZfYWxsLmNsb3NlKCk7Ci0KLSAgaWYgKCF0eXBlZGVmc19wZW5kaW5nLmVtcHR5KCkpIHsKLSAgICBwd2FybmluZygwLCAiJWQgdHlwZWRlZnMgd2l0aCB1bnJlc29sdmVkIHR5cGUgcmVmZXJlbmNlcyBsZWZ0OlxuIiwgdHlwZWRlZnNfcGVuZGluZy5zaXplKCkpOwotICAgIGZvciAoc3RkOjpsaXN0PHRfdHlwZWRlZio+OjppdGVyYXRvciBpdGVyID0gdHlwZWRlZnNfcGVuZGluZy5iZWdpbigpOwotICAgICAgICAgdHlwZWRlZnNfcGVuZGluZy5lbmQoKSAhPSBpdGVyOwotICAgICAgICAgKytpdGVyKSB7Ci0gICAgICBwd2FybmluZygwLCAiLSAlc1xuIiwgKCppdGVyKS0+Z2V0X3N5bWJvbGljKCkuY19zdHIoKSk7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpkZWxwaGlfdHlwZV91c2luZ3Mob3N0cmVhbSYgb3V0KSB7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAiQ2xhc3NlcywgU3lzVXRpbHMsIEdlbmVyaWNzLkNvbGxlY3Rpb25zLCBUaHJpZnQuQ29sbGVjdGlvbnMsIFRocmlmdC5Qcm90b2NvbCwiCi0gICAgICAgICAgICAgIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJUaHJpZnQuVHJhbnNwb3J0OyIgPDwgZW5kbCA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZm9yd2FyZF9kZWNsYXJhdGlvbih0X3N0cnVjdCogdHN0cnVjdCkgewotICAvLyBGb3J3YXJkIGRlY2xhcmUgc3RydWN0IGRlZgotICBoYXNfZm9yd2FyZCA9IHRydWU7Ci0gIHB2ZXJib3NlKCJmb3J3YXJkIGRlY2xhcmF0aW9uIG9mICVzXG4iLCB0eXBlX25hbWUodHN0cnVjdCkuY19zdHIoKSk7Ci0KLSAgc3RyaW5nIHdoYXQgPSB0c3RydWN0LT5pc194Y2VwdGlvbigpID8gImNsYXNzIiA6ICJpbnRlcmZhY2UiOwotCi0gIGluZGVudF91cCgpOwotICBpbmRlbnQoc19mb3J3YXJkX2RlY3IpIDw8IHR5cGVfbmFtZSh0c3RydWN0LCB0c3RydWN0LT5pc194Y2VwdGlvbigpLCB0cnVlKSA8PCAiID0gIiA8PCB3aGF0IDw8ICI7IgotICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgYWRkX2RlZmluZWRfdHlwZSh0c3RydWN0KTsKLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgewotICB0X3R5cGUqIHR5cGUgPSB0dHlwZWRlZi0+Z2V0X3R5cGUoKTsKLQotICAvLyB3cml0ZSBub3cgb3Igc2F2ZSBmb3IgbGF0ZXI/Ci0gIGlmICghaXNfZnVsbHlfZGVmaW5lZF90eXBlKHR5cGUpKSB7Ci0gICAgcHZlcmJvc2UoInR5cGVkZWYgJXM6IHVucmVzb2x2ZWQgZGVwZW5kZW5jaWVzIGZvdW5kXG4iLCB0eXBlX25hbWUodHR5cGVkZWYpLmNfc3RyKCkpOwotICAgIHR5cGVkZWZzX3BlbmRpbmcucHVzaF9iYWNrKHR0eXBlZGVmKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpbmRlbnRfdXAoKTsKLSAgZ2VuZXJhdGVfZGVscGhpX2RvYyhzX3N0cnVjdCwgdHR5cGVkZWYpOwotICBpbmRlbnQoc19zdHJ1Y3QpIDw8IHR5cGVfbmFtZSh0dHlwZWRlZikgPDwgIiA9ICI7Ci0KLSAgLy8gY29tbWVudGVkIG91dDogdGhlIGJlbmVmaXQgaXMgbm90IGJpZyBlbm91Z2ggdG8gcmlzayBicmVha2luZyBleGlzdGluZyBjb2RlCi0gIC8vIGJvb2wgY29udGFpbmVyID0gdHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX21hcCgpIHx8IHR5cGUtPmlzX3NldCgpOwotICAvLyBpZiggISBjb250YWluZXIpCi0gIC8vICBzX3N0cnVjdCA8PCAidHlwZSAiOyAgLy90aGUgInR5cGUgQSA9IHR5cGUgQiIgc3ludGF4IGxlYWRzIHRvIEUyNTc0IHdpdGggZ2VuZXJpY3MKLQotICBzX3N0cnVjdCA8PCB0eXBlX25hbWUodHR5cGVkZWYtPmdldF90eXBlKCkpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgYWRkX2RlZmluZWRfdHlwZSh0dHlwZWRlZik7Ci19Ci0KLWJvb2wgdF9kZWxwaGlfZ2VuZXJhdG9yOjppc19mdWxseV9kZWZpbmVkX3R5cGUodF90eXBlKiB0dHlwZSkgewotICBpZiAoKE5VTEwgIT0gdHR5cGUtPmdldF9wcm9ncmFtKCkpICYmICh0dHlwZS0+Z2V0X3Byb2dyYW0oKSAhPSBwcm9ncmFtXykpIHsKLSAgICB0X3Njb3BlKiBzY29wZSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpLT5zY29wZSgpOwotICAgIGlmIChOVUxMICE9IHNjb3BlLT5nZXRfdHlwZSh0dHlwZS0+Z2V0X25hbWUoKSkpIHsKLSAgICAgIC8vIHByaW50ZigidHlwZSAlcyBmb3VuZCBpbiBpbmNsdWRlZCBzY29wZSAlc1xuIiwgdHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSwKLSAgICAgIC8vIHR0eXBlLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpLmNfc3RyKCkpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci0KLSAgaWYgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICByZXR1cm4gKDEgPT0gdHlwZXNfa25vd25bdHlwZV9uYW1lKHR0eXBlKV0pOwotICB9Ci0KLSAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHJldHVybiAoMSA9PSB0eXBlc19rbm93bltiYXNlX3R5cGVfbmFtZSgodF9iYXNlX3R5cGUqKXR0eXBlKV0pOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gdHJ1ZTsgLy8gZW51bXMgYXJlIHdyaXR0ZW4gZmlyc3QsIGJlZm9yZSBhbGwgb3RoZXIgdHlwZXMKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X21hcCogdG1hcCA9ICh0X21hcCopdHR5cGU7Ci0gICAgcmV0dXJuIGlzX2Z1bGx5X2RlZmluZWRfdHlwZSh0bWFwLT5nZXRfa2V5X3R5cGUoKSkKLSAgICAgICAgICAgJiYgaXNfZnVsbHlfZGVmaW5lZF90eXBlKHRtYXAtPmdldF92YWxfdHlwZSgpKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3NldCogdHNldCA9ICh0X3NldCopdHR5cGU7Ci0gICAgcmV0dXJuIGlzX2Z1bGx5X2RlZmluZWRfdHlwZSh0c2V0LT5nZXRfZWxlbV90eXBlKCkpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICB0X2xpc3QqIHRsaXN0ID0gKHRfbGlzdCopdHR5cGU7Ci0gICAgcmV0dXJuIGlzX2Z1bGx5X2RlZmluZWRfdHlwZSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpKTsKLSAgfQotCi0gIHJldHVybiAoMSA9PSB0eXBlc19rbm93blt0eXBlX25hbWUodHR5cGUpXSk7Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjphZGRfZGVmaW5lZF90eXBlKHRfdHlwZSogdHR5cGUpIHsKLSAgLy8gbWFyayBhcyBrbm93biB0eXBlCi0gIHR5cGVzX2tub3duW3R5cGVfbmFtZSh0dHlwZSldID0gMTsKLQotICAvLyBjaGVjayBhbGwgcGVuZGluZyB0eXBlZGVmcwotICBzdGQ6Omxpc3Q8dF90eXBlZGVmKj46Oml0ZXJhdG9yIGl0ZXI7Ci0gIGJvb2wgbW9yZSA9IHRydWU7Ci0gIHdoaWxlIChtb3JlICYmICghdHlwZWRlZnNfcGVuZGluZy5lbXB0eSgpKSkgewotICAgIG1vcmUgPSBmYWxzZTsKLQotICAgIGZvciAoaXRlciA9IHR5cGVkZWZzX3BlbmRpbmcuYmVnaW4oKTsgdHlwZWRlZnNfcGVuZGluZy5lbmQoKSAhPSBpdGVyOyArK2l0ZXIpIHsKLSAgICAgIHRfdHlwZWRlZiogdHR5cGVkZWYgPSAoKml0ZXIpOwotICAgICAgaWYgKGlzX2Z1bGx5X2RlZmluZWRfdHlwZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSkpIHsKLSAgICAgICAgcHZlcmJvc2UoInR5cGVkZWYgJXM6IGFsbCBwZW5kaW5nIHJlZmVyZW5jZXMgYXJlIG5vdyByZXNvbHZlZFxuIiwKLSAgICAgICAgICAgICAgICAgdHlwZV9uYW1lKHR0eXBlZGVmKS5jX3N0cigpKTsKLSAgICAgICAgdHlwZWRlZnNfcGVuZGluZy5lcmFzZShpdGVyKTsKLSAgICAgICAgZ2VuZXJhdGVfdHlwZWRlZih0dHlwZWRlZik7Ci0gICAgICAgIG1vcmUgPSB0cnVlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmluaXRfa25vd25fdHlwZXNfbGlzdCgpIHsKLSAgLy8ga25vd24gYmFzZSB0eXBlcwotICB0eXBlc19rbm93blt0eXBlX25hbWUoZ190eXBlX3N0cmluZyldID0gMTsKLSAgdHlwZXNfa25vd25bdHlwZV9uYW1lKGdfdHlwZV9iaW5hcnkpXSA9IDE7Ci0gIHR5cGVzX2tub3duW3R5cGVfbmFtZShnX3R5cGVfYm9vbCldID0gMTsKLSAgdHlwZXNfa25vd25bdHlwZV9uYW1lKGdfdHlwZV9ieXRlKV0gPSAxOwotICB0eXBlc19rbm93blt0eXBlX25hbWUoZ190eXBlX2kxNildID0gMTsKLSAgdHlwZXNfa25vd25bdHlwZV9uYW1lKGdfdHlwZV9pMzIpXSA9IDE7Ci0gIHR5cGVzX2tub3duW3R5cGVfbmFtZShnX3R5cGVfaTY0KV0gPSAxOwotICB0eXBlc19rbm93blt0eXBlX25hbWUoZ190eXBlX2RvdWJsZSldID0gMTsKLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgewotICBoYXNfZW51bSA9IHRydWU7Ci0gIGluZGVudF91cCgpOwotICBnZW5lcmF0ZV9kZWxwaGlfZG9jKHNfZW51bSwgdGVudW0pOwotICBpbmRlbnQoc19lbnVtKSA8PCB0eXBlX25hbWUodGVudW0sIHRydWUsIHRydWUpIDw8ICIgPSAiCi0gICAgICAgICAgICAgICAgIDw8ICIoIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7Ci0gIGlmIChjb25zdGFudHMuZW1wdHkoKSkgewotICAgIGluZGVudChzX2VudW0pIDw8ICJkdW1teSA9IDAgIC8vIGVtcHR5IGVudW1zIGFyZSBub3QgYWxsb3dlZCI7Ci0gIH0gZWxzZSB7Ci0gICAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gICAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgICBpZiAoY19pdGVyICE9IGNvbnN0YW50cy5iZWdpbigpKSB7Ci0gICAgICAgIHNfZW51bSA8PCAiLCI7Ci0gICAgICAgIHNfZW51bSA8PCBlbmRsOwotICAgICAgfQotICAgICAgZ2VuZXJhdGVfZGVscGhpX2RvYyhzX2VudW0sICpjX2l0ZXIpOwotICAgICAgaW5kZW50KHNfZW51bSkgPDwgbm9ybWFsaXplX25hbWUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiID0gIiA8PCB2YWx1ZTsKLSAgICB9Ci0gIH0KLSAgc19lbnVtIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChzX2VudW0pIDw8ICIpOyIgPDwgZW5kbCA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotfQotCi1zdGQ6OnN0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6Om1ha2VfdmFsaWRfZGVscGhpX2lkZW50aWZpZXIoc3RkOjpzdHJpbmcgY29uc3QmIGZyb21OYW1lKSB7Ci0gIHN0ZDo6c3RyaW5nIHN0ciA9IGZyb21OYW1lOwotICBpZiAoc3RyLmVtcHR5KCkpIHsKLSAgICByZXR1cm4gc3RyOwotICB9Ci0KLSAgLy8gdGVzdHMgcmVseSBvbiB0aGlzCi0gIGFzc2VydCgoJ0EnIDwgJ1onKSAmJiAoJ2EnIDwgJ3onKSAmJiAoJzAnIDwgJzknKSk7Ci0KLSAgLy8gaWYgdGhlIGZpcnN0IGxldHRlciBpcyBhIG51bWJlciwgd2UgYWRkIGFuIGFkZGl0aW9uYWwgdW5kZXJzY29yZSBpbiBmcm9udCBvZiBpdAotICBjaGFyIGMgPSBzdHIuYXQoMCk7Ci0gIGlmICgoJzAnIDw9IGMpICYmIChjIDw9ICc5JykpIHsKLSAgICBzdHIgPSAiXyIgKyBzdHI7Ci0gIH0KLQotICAvLyBmb2xsb3dpbmcgY2hhcnM6IGxldHRlciwgbnVtYmVyIG9yIHVuZGVyc2NvcmUKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdHIuc2l6ZSgpOyArK2kpIHsKLSAgICBjID0gc3RyLmF0KGkpOwotICAgIGlmICgoKCdBJyA+IGMpIHx8IChjID4gJ1onKSkgJiYgKCgnYScgPiBjKSB8fCAoYyA+ICd6JykpICYmICgoJzAnID4gYykgfHwgKGMgPiAnOScpKQotICAgICAgICAmJiAoJ18nICE9IGMpKSB7Ci0gICAgICBzdHIucmVwbGFjZShpLCAxLCAiXyIpOwotICAgIH0KLSAgfQotCi0gIHJldHVybiBzdHI7Ci19Ci0KLXN0ZDo6c3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6bWFrZV9jb25zdGFudHNfY2xhc3NuYW1lKCkgewotICBpZiAoY29uc3RwcmVmaXhfKSB7Ci0gICAgcmV0dXJuIG1ha2VfdmFsaWRfZGVscGhpX2lkZW50aWZpZXIoIlQiICsgcHJvZ3JhbV9uYW1lXyArICJDb25zdGFudHMiKTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gIlRDb25zdGFudHMiOyAvLyBjb21wYXRpYmlsaXR5Ci0gIH0KLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKSB7Ci0gIGlmIChjb25zdHMuZW1wdHkoKSkgewotICAgIHJldHVybjsKLSAgfQotCi0gIGhhc19jb25zdCA9IHRydWU7Ci0gIHN0cmluZyBjb25zdGFudHNfY2xhc3MgPSBtYWtlX2NvbnN0YW50c19jbGFzc25hbWUoKTsKLQotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KHNfY29uc3QpIDw8IGNvbnN0YW50c19jbGFzcy5jX3N0cigpIDw8ICIgPSBjbGFzcyIgPDwgZW5kbDsKLSAgaW5kZW50KHNfY29uc3QpIDw8ICJwcml2YXRlIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY19pdGVyOwotICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGlmIChjb25zdF9uZWVkc192YXIoKCpjX2l0ZXIpLT5nZXRfdHlwZSgpKSkgewotICAgICAgcHJpbnRfcHJpdmF0ZV9maWVsZChzX2NvbnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVfbmFtZSgoKmNfaXRlciktPmdldF9uYW1lKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF90eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkpOwotICAgIH0KLSAgfQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoc19jb25zdCkgPDwgInB1YmxpYyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfZGVscGhpX2RvYyhzX2NvbnN0LCAqY19pdGVyKTsKLSAgICBwcmludF9jb25zdF9wcm9wKHNfY29uc3QsCi0gICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVfbmFtZSgoKmNfaXRlciktPmdldF9uYW1lKCkpLAotICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSk7Ci0gIH0KLSAgaW5kZW50KHNfY29uc3QpIDw8ICJ7JElGIENvbXBpbGVyVmVyc2lvbiA+PSAyMS4wfSIgPDwgZW5kbDsKLSAgaW5kZW50KHNfY29uc3QpIDw8ICJjbGFzcyBjb25zdHJ1Y3RvciBDcmVhdGU7IiA8PCBlbmRsOwotICBpbmRlbnQoc19jb25zdCkgPDwgImNsYXNzIGRlc3RydWN0b3IgRGVzdHJveTsiIDw8IGVuZGw7Ci0gIGluZGVudChzX2NvbnN0KSA8PCAieyRJRkVORH0iIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChzX2NvbnN0KSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotCi0gIHN0ZDo6b3N0cmluZ3N0cmVhbSB2YXJzLCBjb2RlOwotCi0gIGluZGVudF91cF9pbXBsKCk7Ci0gIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaW5pdGlhbGl6ZV9maWVsZCh2YXJzLAotICAgICAgICAgICAgICAgICAgICAgY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICJGIiArIHByb3BfbmFtZSgoKmNfaXRlciktPmdldF9uYW1lKCkpLAotICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSk7Ci0gIH0KLSAgaW5kZW50X2Rvd25faW1wbCgpOwotCi0gIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgInskSUYgQ29tcGlsZXJWZXJzaW9uID49IDIxLjB9IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJjbGFzcyBjb25zdHJ1Y3RvciAiIDw8IGNvbnN0YW50c19jbGFzcy5jX3N0cigpIDw8ICIuQ3JlYXRlOyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwotCi0gIGlmICghdmFycy5zdHIoKS5lbXB0eSgpKSB7Ci0gICAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAidmFyIiA8PCBlbmRsOwotICAgIHNfY29uc3RfaW1wbCA8PCB2YXJzLnN0cigpOwotICB9Ci0gIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOwotICBpZiAoIWNvZGUuc3RyKCkuZW1wdHkoKSkgewotICAgIHNfY29uc3RfaW1wbCA8PCBjb2RlLnN0cigpOwotICB9Ci0gIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAiY2xhc3MgZGVzdHJ1Y3RvciAiIDw8IGNvbnN0YW50c19jbGFzcy5jX3N0cigpIDw8ICIuRGVzdHJveTsiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7Ci0gIGluZGVudF91cF9pbXBsKCk7Ci0gIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaWYgKGNvbnN0X25lZWRzX3ZhcigoKmNfaXRlciktPmdldF90eXBlKCkpKSB7Ci0gICAgICBmaW5hbGl6ZV9maWVsZChzX2NvbnN0X2ltcGwsCi0gICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVfbmFtZSgoKmNfaXRlciktPmdldF9uYW1lKCkpLAotICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSk7Ci0gICAgfQotICB9Ci0gIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgImluaGVyaXRlZDsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAieyRFTFNFfSIgPDwgZW5kbDsKLQotICB2YXJzLnN0cigiIik7Ci0gIGNvZGUuc3RyKCIiKTsKLQotICBpbmRlbnRfdXBfaW1wbCgpOwotICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGlmIChjb25zdF9uZWVkc192YXIoKCpjX2l0ZXIpLT5nZXRfdHlwZSgpKSkgewotICAgICAgaW5pdGlhbGl6ZV9maWVsZCh2YXJzLAotICAgICAgICAgICAgICAgICAgICAgICBjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdGFudHNfY2xhc3MgKyAiLkYiICsgcHJvcF9uYW1lKCgqY19pdGVyKS0+Z2V0X25hbWUoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSk7Ci0gICAgfQotICB9Ci0gIGluZGVudF9kb3duX2ltcGwoKTsKLQotICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJwcm9jZWR1cmUgIiA8PCBjb25zdGFudHNfY2xhc3MuY19zdHIoKSA8PCAiX0luaXRpYWxpemU7IiA8PCBlbmRsOwotICBpZiAoIXZhcnMuc3RyKCkuZW1wdHkoKSkgewotICAgIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgInZhciIgPDwgZW5kbDsKLSAgICBzX2NvbnN0X2ltcGwgPDwgdmFycy5zdHIoKTsKLSAgfQotICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgaWYgKCFjb2RlLnN0cigpLmVtcHR5KCkpIHsKLSAgICBzX2NvbnN0X2ltcGwgPDwgY29kZS5zdHIoKTsKLSAgfQotICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAicHJvY2VkdXJlICIgPDwgY29uc3RhbnRzX2NsYXNzLmNfc3RyKCkgPDwgIl9GaW5hbGl6ZTsiIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOwotICBpbmRlbnRfdXBfaW1wbCgpOwotICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGZpbmFsaXplX2ZpZWxkKHNfY29uc3RfaW1wbCwKLSAgICAgICAgICAgICAgICAgICBub3JtYWxpemVfbmFtZSgoKmNfaXRlciktPmdldF9uYW1lKCkpLAotICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF92YWx1ZSgpLAotICAgICAgICAgICAgICAgICAgIGNvbnN0YW50c19jbGFzcyk7Ci0gIH0KLSAgaW5kZW50X2Rvd25faW1wbCgpOwotICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJ7JElGRU5EfSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfZGVmX3ZhbHVlKHN0ZDo6b3N0cmVhbSYgdmFycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2xzX25tKSB7Ci0KLSAgc3RyaW5nIGNsc19wcmVmaXg7Ci0KLSAgaWYgKGNsc19ubSA9PSAiIikgewotICAgIGNsc19wcmVmaXggPSAiIjsKLSAgfSBlbHNlIHsKLSAgICBjbHNfcHJlZml4ID0gY2xzX25tICsgIi4iOwotICB9Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKLSAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7Ci0gICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOwotICAgICAgfQotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZSh2YXJzLCBvdXQsIG5hbWUsIGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgIGluZGVudF9pbXBsKG91dCkgPDwgY2xzX3ByZWZpeCA8PCBub3JtYWxpemVfbmFtZShuYW1lKSA8PCAiLiIKLSAgICAgICAgICAgICAgICAgICAgICAgPDwgcHJvcF9uYW1lKHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSwgdHlwZS0+aXNfeGNlcHRpb24oKSkKLSAgICAgICAgICAgICAgICAgICAgICAgPDwgIiA6PSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgc3RyaW5nIGtleSA9IHJlbmRlcl9jb25zdF92YWx1ZSh2YXJzLCBvdXQsIG5hbWUsIGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUodmFycywgb3V0LCBuYW1lLCB2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCBjbHNfcHJlZml4IDw8IG5vcm1hbGl6ZV9uYW1lKG5hbWUpIDw8ICJbIiA8PCBrZXkgPDwgIl0iCi0gICAgICAgICAgICAgICAgICAgICAgIDw8ICIgOj0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgewotICAgIHRfdHlwZSogZXR5cGU7Ci0gICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9IGVsc2UgewotICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0KLQotICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZSh2YXJzLCBvdXQsIG5hbWUsIGV0eXBlLCAqdl9pdGVyKTsKLSAgICAgIGluZGVudF9pbXBsKG91dCkgPDwgY2xzX3ByZWZpeCA8PCBub3JtYWxpemVfbmFtZShuYW1lKSA8PCAiLkFkZCgiIDw8IHZhbCA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpwcmludF9wcml2YXRlX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewotICAodm9pZCl2YWx1ZTsKLSAgaW5kZW50KG91dCkgPDwgImNsYXNzIHZhciBGIiA8PCBuYW1lIDw8ICI6ICIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICI7IiA8PCBlbmRsOwotfQotCi1ib29sIHRfZGVscGhpX2dlbmVyYXRvcjo6Y29uc3RfbmVlZHNfdmFyKHRfdHlwZSogdHlwZSkgewotICB0X3R5cGUqIHRydWV0eXBlID0gdHlwZTsKLSAgd2hpbGUgKHRydWV0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICB0cnVldHlwZSA9ICgodF90eXBlZGVmKil0cnVldHlwZSktPmdldF90eXBlKCk7Ci0gIH0KLSAgcmV0dXJuICghdHJ1ZXR5cGUtPmlzX2Jhc2VfdHlwZSgpKTsKLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OnByaW50X2NvbnN0X3Byb3Aoc3RkOjpvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7Ci0gICh2b2lkKXZhbHVlOwotICBpZiAoY29uc3RfbmVlZHNfdmFyKHR5cGUpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImNsYXNzIHByb3BlcnR5ICIgPDwgbmFtZSA8PCAiOiAiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiIHJlYWQgRiIgPDwgbmFtZSA8PCAiOyIKLSAgICAgICAgICAgICAgICA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSB2YXJzOyAvLyBkdW1teQotICAgIHN0cmluZyB2MiA9IHJlbmRlcl9jb25zdF92YWx1ZSh2YXJzLCBvdXQsIG5hbWUsIHR5cGUsIHZhbHVlKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiY29uc3QgIiA8PCBuYW1lIDw8ICIgPSAiIDw8IHYyIDw8ICI7IiA8PCBlbmRsOwotICB9Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpwcmludF9jb25zdF92YWx1ZShzdGQ6Om9zdHJlYW0mIHZhcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7Ci0gIHRfdHlwZSogdHJ1ZXR5cGUgPSB0eXBlOwotICB3aGlsZSAodHJ1ZXR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgIHRydWV0eXBlID0gKCh0X3R5cGVkZWYqKXRydWV0eXBlKS0+Z2V0X3R5cGUoKTsKLSAgfQotCi0gIGlmICh0cnVldHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAvLyBhbHJlYWR5IGRvbmUKLSAgICAvLyBzdHJpbmcgdjIgPSByZW5kZXJfY29uc3RfdmFsdWUoIHZhcnMsIG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOwotICAgIC8vIGluZGVudF9pbXBsKG91dCkgPDwgbmFtZSA8PCAiIDo9ICIgPDwgdjIgPDwgIjsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHJ1ZXR5cGUtPmlzX2VudW0oKSkgewotICAgIGluZGVudF9pbXBsKG91dCkgPDwgbmFtZSA8PCAiIDo9ICIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIuIiA8PCB2YWx1ZS0+Z2V0X2lkZW50aWZpZXJfbmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICA8PCAiOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBzdHJpbmcgdHlwbmFtZTsKLSAgICB0eXBuYW1lID0gdHlwZV9uYW1lKHRydWV0eXBlLCB0cnVlLCBmYWxzZSwgdHlwZS0+aXNfeGNlcHRpb24oKSwgdHlwZS0+aXNfeGNlcHRpb24oKSk7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCBuYW1lIDw8ICIgOj0gIiA8PCB0eXBuYW1lIDw8ICIuQ3JlYXRlOyIgPDwgZW5kbDsKLSAgICBwcmludF9jb25zdF9kZWZfdmFsdWUodmFycywgb3V0LCBuYW1lLCB0cnVldHlwZSwgdmFsdWUpOwotICB9Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjppbml0aWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgdmFycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewotICBwcmludF9jb25zdF92YWx1ZSh2YXJzLCBvdXQsIG5hbWUsIHR5cGUsIHZhbHVlKTsKLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmZpbmFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2xzX25tKSB7Ci0gICh2b2lkKW91dDsKLSAgKHZvaWQpbmFtZTsKLSAgKHZvaWQpdHlwZTsKLSAgKHZvaWQpdmFsdWU7Ci0gICh2b2lkKWNsc19ubTsKLX0KLQotc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKG9zdHJlYW0mIHZhcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewotICAodm9pZCluYW1lOwotCi0gIHRfdHlwZSogdHJ1ZXR5cGUgPSB0eXBlOwotICB3aGlsZSAodHJ1ZXR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgIHRydWV0eXBlID0gKCh0X3R5cGVkZWYqKXRydWV0eXBlKS0+Z2V0X3R5cGUoKTsKLSAgfQotCi0gIHN0ZDo6b3N0cmluZ3N0cmVhbSByZW5kZXI7Ci0KLSAgaWYgKHRydWV0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0cnVldHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmVuZGVyIDw8ICInIiA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICInIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJlbmRlciA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCkgPyAiVHJ1ZSIgOiAiRmFsc2UiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJlbmRlciA8PCAiU2hvcnRJbnQoICIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIikiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZW5kZXIgPDwgIlNtYWxsSW50KCAiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICIpIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmVuZGVyIDw8ICJMb25nSW50KCAiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICIpIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmVuZGVyIDw8ICJJbnQ2NCggIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiKSI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7Ci0gICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiLjAiOyAvLyBtYWtlIGl0IGEgZG91YmxlIGNvbnN0YW50IGJ5IGFkZGluZyAiLjAiCi0gICAgICB9IGVsc2UgewotICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHJ1ZXR5cGUtPmlzX2VudW0oKSkgewotICAgIHJlbmRlciA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UpIDw8ICIuIiA8PCB2YWx1ZS0+Z2V0X2lkZW50aWZpZXJfbmFtZSgpOwotICB9IGVsc2UgewotICAgIHN0cmluZyB0ID0gdG1wKCJ0bXAiKTsKLSAgICB2YXJzIDw8ICIgICIgPDwgdCA8PCAiIDogIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgcHJpbnRfY29uc3RfdmFsdWUodmFycywgb3V0LCB0LCB0eXBlLCB2YWx1ZSk7Ci0gICAgcmVuZGVyIDw8IHQ7Ci0gIH0KLQotICByZXR1cm4gcmVuZGVyLnN0cigpOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgewotICBpbmRlbnRfdXAoKTsKLSAgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9kZWZpbml0aW9uKHNfc3RydWN0LCB0c3RydWN0LCBpc19leGNlcHRpb24pOwotICBpbmRlbnRfZG93bigpOwotCi0gIGFkZF9kZWZpbmVkX3R5cGUodHN0cnVjdCk7Ci0KLSAgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9pbXBsKHNfc3RydWN0X2ltcGwsICIiLCB0c3RydWN0LCBpc19leGNlcHRpb24pOwotICBpZiAocmVnaXN0ZXJfdHlwZXNfKSB7Ci0gICAgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF90eXBlX2ZhY3Rvcnkoc190eXBlX2ZhY3RvcnlfZnVuY3MsICIiLCB0c3RydWN0LCBpc19leGNlcHRpb24pOwotICAgIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfdHlwZV9mYWN0b3J5X3JlZ2lzdHJhdGlvbihzX3R5cGVfZmFjdG9yeV9yZWdpc3RyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leGNlcHRpb24pOwotICB9Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X2ltcGwob3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2xzX3ByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194X2ZhY3RvcnkpIHsKLQotICBpZiAoaXNfZXhjZXB0aW9uICYmICghaXNfeF9mYWN0b3J5KSkgewotICAgIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfaW1wbChvdXQsIGNsc19wcmVmaXgsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbiwgaXNfcmVzdWx0LCB0cnVlKTsKLSAgfQotCi0gIHN0cmluZyBjbHNfbm07Ci0KLSAgc3RyaW5nIGV4Y2VwdGlvbl9mYWN0b3J5X25hbWU7Ci0KLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIGV4Y2VwdGlvbl9mYWN0b3J5X25hbWUgPSBub3JtYWxpemVfY2xzbm0odHN0cnVjdC0+Z2V0X25hbWUoKSwgIiIsIHRydWUpICsgIkZhY3RvcnkiOwotICB9Ci0KLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIGNsc19ubSA9IHR5cGVfbmFtZSh0c3RydWN0LCB0cnVlLCAoIWlzX3hfZmFjdG9yeSksIGlzX3hfZmFjdG9yeSwgdHJ1ZSk7Ci0gIH0gZWxzZSB7Ci0gICAgY2xzX25tID0gdHlwZV9uYW1lKHRzdHJ1Y3QsIHRydWUsIGZhbHNlKTsKLSAgfQotCi0gIHN0ZDo6b3N0cmluZ3N0cmVhbSB2YXJzLCBjb2RlOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgaW5kZW50X3VwX2ltcGwoKTsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfdHlwZSogdCA9ICgqbV9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICB3aGlsZSAodC0+aXNfdHlwZWRlZigpKSB7Ci0gICAgICB0ID0gKCh0X3R5cGVkZWYqKXQpLT5nZXRfdHlwZSgpOwotICAgIH0KLSAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7Ci0gICAgICBpbml0aWFsaXplX2ZpZWxkKHZhcnMsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICJGIiArIHByb3BfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCksIGlzX2V4Y2VwdGlvbiksCi0gICAgICAgICAgICAgICAgICAgICAgIHQsCi0gICAgICAgICAgICAgICAgICAgICAgICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkpOwotICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICAgICAgaW5kZW50X2ltcGwoY29kZSkgPDwgIkZfX2lzc2V0XyIgPDwgcHJvcF9uYW1lKCgqbV9pdGVyKSwgaXNfZXhjZXB0aW9uKSA8PCAiIDo9IFRydWU7IgotICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgfQotICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0KLSAgaW5kZW50X2ltcGwob3V0KSA8PCAiY29uc3RydWN0b3IgIiA8PCBjbHNfcHJlZml4IDw8IGNsc19ubSA8PCAiLiIKLSAgICAgICAgICAgICAgICAgICA8PCAiQ3JlYXRlOyIgPDwgZW5kbDsKLQotICBpZiAoIXZhcnMuc3RyKCkuZW1wdHkoKSkgewotICAgIG91dCA8PCAidmFyIiA8PCBlbmRsOwotICAgIG91dCA8PCB2YXJzLnN0cigpOwotICB9Ci0KLSAgaW5kZW50X2ltcGwob3V0KSA8PCAiYmVnaW4iIDw8IGVuZGw7Ci0gIGluZGVudF91cF9pbXBsKCk7Ci0gIGlmIChpc19leGNlcHRpb24gJiYgKCFpc194X2ZhY3RvcnkpKSB7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCAiaW5oZXJpdGVkIENyZWF0ZSgnJyk7IiA8PCBlbmRsOwotICAgIGluZGVudF9pbXBsKG91dCkgPDwgIkYiIDw8IGV4Y2VwdGlvbl9mYWN0b3J5X25hbWUgPDwgIiA6PSBUIiA8PCBleGNlcHRpb25fZmFjdG9yeV9uYW1lCi0gICAgICAgICAgICAgICAgICAgICA8PCAiSW1wbC5DcmVhdGU7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGluZGVudF9pbXBsKG91dCkgPDwgImluaGVyaXRlZDsiIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAoIWNvZGUuc3RyKCkuZW1wdHkoKSkgewotICAgIG91dCA8PCBjb2RlLnN0cigpOwotICB9Ci0KLSAgaW5kZW50X2Rvd25faW1wbCgpOwotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaWYgKChtZW1iZXJzLnNpemUoKSA+IDApICYmIGlzX2V4Y2VwdGlvbiAmJiAoIWlzX3hfZmFjdG9yeSkpIHsKLSAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJjb25zdHJ1Y3RvciAiIDw8IGNsc19wcmVmaXggPDwgY2xzX25tIDw8ICIuIgotICAgICAgICAgICAgICAgICAgICAgPDwgIkNyZWF0ZSgiIDw8IGNvbnN0cnVjdG9yX2FyZ3VtZW50X2xpc3QodHN0cnVjdCwgaW5kZW50X2ltcGwoKSkgPDwgIik7IgotICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXBfaW1wbCgpOwotICAgIGluZGVudF9pbXBsKG91dCkgPDwgIkNyZWF0ZTsiIDw8IGVuZGw7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgc3RyaW5nIHByb3BuYW1lID0gcHJvcF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSwgaXNfZXhjZXB0aW9uKTsKLSAgICAgIHN0cmluZyBwYXJhbV9uYW1lID0gY29uc3RydWN0b3JfcGFyYW1fbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpOwotICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCBwcm9wbmFtZSA8PCAiIDo9ICIgPDwgcGFyYW1fbmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCAiVXBkYXRlTWVzc2FnZVByb3BlcnR5OyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50X2ltcGwob3V0KSA8PCAiZGVzdHJ1Y3RvciAiIDw8IGNsc19wcmVmaXggPDwgY2xzX25tIDw8ICIuIgotICAgICAgICAgICAgICAgICAgIDw8ICJEZXN0cm95OyIgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwob3V0KSA8PCAiYmVnaW4iIDw8IGVuZGw7Ci0gIGluZGVudF91cF9pbXBsKCk7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfdHlwZSogdCA9ICgqbV9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICB3aGlsZSAodC0+aXNfdHlwZWRlZigpKSB7Ci0gICAgICB0ID0gKCh0X3R5cGVkZWYqKXQpLT5nZXRfdHlwZSgpOwotICAgIH0KLSAgICBmaW5hbGl6ZV9maWVsZChvdXQsIHByb3BfbmFtZSgqbV9pdGVyLCBpc19leGNlcHRpb24pLCB0LCAoKm1faXRlciktPmdldF92YWx1ZSgpKTsKLSAgfQotCi0gIGluZGVudF9pbXBsKG91dCkgPDwgImluaGVyaXRlZDsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGlmICh0c3RydWN0LT5pc191bmlvbigpKSB7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCAicHJvY2VkdXJlICIgPDwgY2xzX3ByZWZpeCA8PCBjbHNfbm0gPDwgIi4iCi0gICAgICAgICAgICAgICAgICAgICA8PCAiQ2xlYXJVbmlvblZhbHVlczsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCAiYmVnaW4iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwX2ltcGwoKTsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIHQgPSAoKm1faXRlciktPmdldF90eXBlKCk7Ci0gICAgICB3aGlsZSAodC0+aXNfdHlwZWRlZigpKSB7Ci0gICAgICAgIHQgPSAoKHRfdHlwZWRlZiopdCktPmdldF90eXBlKCk7Ci0gICAgICB9Ci0KLSAgICAgIGdlbmVyYXRlX2RlbHBoaV9jbGVhcl91bmlvbl92YWx1ZShvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xzX3ByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHNfbm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbV9pdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHN0cnVjdC0+aXNfdW5pb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc194X2ZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uX2ZhY3RvcnlfbmFtZSk7Ci0gICAgfQotICAgIGluZGVudF9kb3duX2ltcGwoKTsKLSAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF90eXBlKiB0ID0gKCptX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgIHdoaWxlICh0LT5pc190eXBlZGVmKCkpIHsKLSAgICAgIHQgPSAoKHRfdHlwZWRlZiopdCktPmdldF90eXBlKCk7Ci0gICAgfQotICAgIGdlbmVyYXRlX2RlbHBoaV9wcm9wZXJ0eV9yZWFkZXJfaW1wbChvdXQsIGNsc19wcmVmaXgsIGNsc19ubSwgdCwgKm1faXRlciwgIkYiLCBpc19leGNlcHRpb24pOwotICAgIGdlbmVyYXRlX2RlbHBoaV9wcm9wZXJ0eV93cml0ZXJfaW1wbChvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsc19wcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsc19ubSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1faXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkYiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzdHJ1Y3QtPmlzX3VuaW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3hfZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uX2ZhY3RvcnlfbmFtZSk7Ci0gICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICAgIGdlbmVyYXRlX2RlbHBoaV9pc3NldF9yZWFkZXJfaW1wbChvdXQsIGNsc19wcmVmaXgsIGNsc19ubSwgdCwgKm1faXRlciwgIkYiLCBpc19leGNlcHRpb24pOwotICAgIH0KLSAgfQotCi0gIGlmICgoIWlzX2V4Y2VwdGlvbikgfHwgaXNfeF9mYWN0b3J5KSB7Ci0gICAgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9yZWFkZXJfaW1wbChvdXQsIGNsc19wcmVmaXgsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Ci0gICAgaWYgKGlzX3Jlc3VsdCkgewotICAgICAgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9yZXN1bHRfd3JpdGVyX2ltcGwob3V0LCBjbHNfcHJlZml4LCB0c3RydWN0LCBpc19leGNlcHRpb24pOwotICAgIH0gZWxzZSB7Ci0gICAgICBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3dyaXRlcl9pbXBsKG91dCwgY2xzX3ByZWZpeCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKLSAgICB9Ci0gIH0KLSAgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF90b3N0cmluZ19pbXBsKG91dCwgY2xzX3ByZWZpeCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uLCBpc194X2ZhY3RvcnkpOwotCi0gIGlmIChpc19leGNlcHRpb24gJiYgaXNfeF9mYWN0b3J5KSB7Ci0gICAgZ2VuZXJhdGVfZGVscGhpX2NyZWF0ZV9leGNlcHRpb25faW1wbChvdXQsIGNsc19wcmVmaXgsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Ci0gIH0KLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OnByaW50X2RlbHBoaV9zdHJ1Y3RfdHlwZV9mYWN0b3J5X2Z1bmMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgc3RydWN0X2ludGZfbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKLSAgb3V0IDw8ICJDcmVhdGVfIjsKLSAgb3V0IDw8IHN0cnVjdF9pbnRmX25hbWU7Ci0gIG91dCA8PCAiX0ltcGwiOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX3N0cnVjdF90eXBlX2ZhY3Rvcnkob3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjbHNfcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeF9mYWN0b3J5KSB7Ci0gICh2b2lkKWNsc19wcmVmaXg7Ci0gIGlmIChpc19leGNlcHRpb24pCi0gICAgcmV0dXJuOwotICBpZiAoaXNfcmVzdWx0KQotICAgIHJldHVybjsKLSAgaWYgKGlzX3hfZmFjdG9yeSkKLSAgICByZXR1cm47Ci0KLSAgc3RyaW5nIHN0cnVjdF9pbnRmX25hbWUgPSB0eXBlX25hbWUodHN0cnVjdCk7Ci0gIHN0cmluZyBjbHNfbm0gPSB0eXBlX25hbWUodHN0cnVjdCwgdHJ1ZSwgZmFsc2UpOwotCi0gIG91dCA8PCAiZnVuY3Rpb24gIjsKLSAgcHJpbnRfZGVscGhpX3N0cnVjdF90eXBlX2ZhY3RvcnlfZnVuYyhvdXQsIHRzdHJ1Y3QpOwotICBvdXQgPDwgIjogIjsKLSAgb3V0IDw8IHN0cnVjdF9pbnRmX25hbWU7Ci0gIG91dCA8PCAiOyIgPDwgZW5kbDsKLSAgb3V0IDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJSZXN1bHQgOj0gIiA8PCBjbHNfbm0gPDwgIi5DcmVhdGU7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfdHlwZV9mYWN0b3J5X3JlZ2lzdHJhdGlvbihvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjbHNfcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hfZmFjdG9yeSkgewotICAodm9pZCljbHNfcHJlZml4OwotICBpZiAoaXNfZXhjZXB0aW9uKQotICAgIHJldHVybjsKLSAgaWYgKGlzX3Jlc3VsdCkKLSAgICByZXR1cm47Ci0gIGlmIChpc194X2ZhY3RvcnkpCi0gICAgcmV0dXJuOwotCi0gIHN0cmluZyBzdHJ1Y3RfaW50Zl9uYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOwotCi0gIGluZGVudChvdXQpIDw8ICIgIFR5cGVSZWdpc3RyeS5SZWdpc3RlclR5cGVGYWN0b3J5PCIgPDwgc3RydWN0X2ludGZfbmFtZSA8PCAiPigiOwotICBwcmludF9kZWxwaGlfc3RydWN0X3R5cGVfZmFjdG9yeV9mdW5jKG91dCwgdHN0cnVjdCk7Ci0gIG91dCA8PCAiKTsiOwotICBvdXQgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeF9mYWN0b3J5KSB7Ci0gIGJvb2wgaXNfZmluYWwgPSAodHN0cnVjdC0+YW5ub3RhdGlvbnNfLmZpbmQoImZpbmFsIikgIT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpKTsKLSAgc3RyaW5nIHN0cnVjdF9pbnRmX25hbWU7Ci0gIHN0cmluZyBzdHJ1Y3RfbmFtZTsKLSAgc3RyaW5nIGlzc2V0X25hbWU7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgc3RyaW5nIGV4Y2VwdGlvbl9mYWN0b3J5X25hbWUgPSBub3JtYWxpemVfY2xzbm0odHN0cnVjdC0+Z2V0X25hbWUoKSwgIiIsIHRydWUpICsgIkZhY3RvcnkiOwotCi0gIGlmIChpc19leGNlcHRpb24pIHsKLSAgICBzdHJ1Y3RfaW50Zl9uYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0gIH0gZWxzZSB7Ci0gICAgc3RydWN0X2ludGZfbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKLSAgfQotCi0gIGlmIChpc19leGNlcHRpb24pIHsKLSAgICBzdHJ1Y3RfbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0LCB0cnVlLCAoIWlzX3hfZmFjdG9yeSksIGlzX3hfZmFjdG9yeSk7Ci0gIH0gZWxzZSB7Ci0gICAgc3RydWN0X25hbWUgPSB0eXBlX25hbWUodHN0cnVjdCwgdHJ1ZSk7Ci0gIH0KLQotICBpZiAoKCFpc19leGNlcHRpb24pIHx8IGlzX3hfZmFjdG9yeSkgewotCi0gICAgZ2VuZXJhdGVfZGVscGhpX2RvYyhvdXQsIHRzdHJ1Y3QpOwotICAgIGluZGVudChvdXQpIDw8IHN0cnVjdF9pbnRmX25hbWUgPDwgIiA9IGludGVyZmFjZShJQmFzZSkiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHlfcmVhZGVyX2RlZmluaXRpb24ob3V0LCAqbV9pdGVyLCBpc19leGNlcHRpb24pOwotICAgICAgZ2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5X3dyaXRlcl9kZWZpbml0aW9uKG91dCwgKm1faXRlciwgaXNfZXhjZXB0aW9uKTsKLSAgICB9Ci0KLSAgICBpZiAoaXNfeF9mYWN0b3J5KSB7Ci0gICAgICBvdXQgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIvLyBDcmVhdGUgRXhjZXB0aW9uIE9iamVjdCIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJmdW5jdGlvbiBDcmVhdGVFeGNlcHRpb246ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QsIHRydWUsIHRydWUpIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICAgIG91dCA8PCBlbmRsOwotICAgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgICBnZW5lcmF0ZV9wcm9wZXJ0eShvdXQsICptX2l0ZXIsIHRydWUsIGlzX2V4Y2VwdGlvbik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgewotICAgICAgb3V0IDw8IGVuZGw7Ci0gICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICAgICAgZ2VuZXJhdGVfZGVscGhpX2lzc2V0X3JlYWRlcl9kZWZpbml0aW9uKG91dCwgKm1faXRlciwgaXNfZXhjZXB0aW9uKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICAgIG91dCA8PCBlbmRsOwotICAgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgICAgIGlzc2V0X25hbWUgPSAiX19pc3NldF8iICsgcHJvcF9uYW1lKCptX2l0ZXIsIGlzX2V4Y2VwdGlvbik7Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgInByb3BlcnR5ICIgPDwgaXNzZXRfbmFtZSA8PCAiOiBCb29sZWFuIHJlYWQgR2V0IiA8PCBpc3NldF9uYW1lIDw8ICI7IgotICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLQotICBnZW5lcmF0ZV9kZWxwaGlfZG9jKG91dCwgdHN0cnVjdCk7Ci0gIGluZGVudChvdXQpIDw8IHN0cnVjdF9uYW1lIDw8ICIgPSAiOwotICBpZiAoaXNfZmluYWwpIHsKLSAgICBvdXQgPDwgInNlYWxlZCAiOwotICB9Ci0gIG91dCA8PCAiY2xhc3MoIjsKLSAgaWYgKGlzX2V4Y2VwdGlvbiAmJiAoIWlzX3hfZmFjdG9yeSkpIHsKLSAgICBvdXQgPDwgIlRFeGNlcHRpb24iOwotICB9IGVsc2UgewotICAgIG91dCA8PCAiVEludGVyZmFjZWRPYmplY3QsIElCYXNlLCAiIDw8IHN0cnVjdF9pbnRmX25hbWU7Ci0gIH0KLSAgb3V0IDw8ICIpIiA8PCBlbmRsOwotCi0gIGlmIChpc19leGNlcHRpb24gJiYgKCFpc194X2ZhY3RvcnkpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAidHlwZSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X2RlZmluaXRpb24ob3V0LCB0c3RydWN0LCBpc19leGNlcHRpb24sIGluX2NsYXNzLCBpc19yZXN1bHQsIHRydWUpOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8ICJwcml2YXRlIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpZiAoaXNfZXhjZXB0aW9uICYmICghaXNfeF9mYWN0b3J5KSkgewotICAgIGluZGVudChvdXQpIDw8ICJGIiA8PCBleGNlcHRpb25fZmFjdG9yeV9uYW1lIDw8ICIgOiIgPDwgc3RydWN0X2ludGZfbmFtZSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoKm1faXRlciwgZmFsc2UsICJGIiwgaXNfZXhjZXB0aW9uKSA8PCBlbmRsOwotICB9Ci0KLSAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgewotICAgIGluZGVudChvdXQpIDw8IGVuZGw7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICAgICAgaXNzZXRfbmFtZSA9ICJGX19pc3NldF8iICsgcHJvcF9uYW1lKCptX2l0ZXIsIGlzX2V4Y2VwdGlvbik7Ci0gICAgICAgIGluZGVudChvdXQpIDw8IGlzc2V0X25hbWUgPDwgIjogQm9vbGVhbjsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwgZW5kbDsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5X3JlYWRlcl9kZWZpbml0aW9uKG91dCwgKm1faXRlciwgaXNfZXhjZXB0aW9uKTsKLSAgICBnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHlfd3JpdGVyX2RlZmluaXRpb24ob3V0LCAqbV9pdGVyLCBpc19leGNlcHRpb24pOwotICB9Ci0KLSAgaWYgKHRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKLSAgICBvdXQgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiLy8gQ2xlYXIgdmFsdWVzKGZvciB1bmlvbidzIHByb3BlcnR5IHNldHRlcikiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgInByb2NlZHVyZSBDbGVhclVuaW9uVmFsdWVzOyIgPDwgZW5kbDsKLSAgfQotCi0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICBvdXQgPDwgZW5kbDsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgICBpc3NldF9uYW1lID0gIl9faXNzZXRfIiArIHByb3BfbmFtZSgqbV9pdGVyLCBpc19leGNlcHRpb24pOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAiZnVuY3Rpb24gR2V0IiA8PCBpc3NldF9uYW1lIDw8ICI6IEJvb2xlYW47IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaWYgKChtZW1iZXJzLnNpemUoKSA+IDApICYmIGlzX2V4Y2VwdGlvbiAmJiAoIWlzX3hfZmFjdG9yeSkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiY29uc3RydWN0b3IgQ3JlYXRlOyBvdmVybG9hZDsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgImNvbnN0cnVjdG9yIENyZWF0ZSgiIDw8IGNvbnN0cnVjdG9yX2FyZ3VtZW50X2xpc3QodHN0cnVjdCwgaW5kZW50KCkpCi0gICAgICAgICAgICAgICAgPDwgIik7IG92ZXJsb2FkOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiY29uc3RydWN0b3IgQ3JlYXRlOyIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8ICJkZXN0cnVjdG9yIERlc3Ryb3k7IG92ZXJyaWRlOyIgPDwgZW5kbDsKLQotICBvdXQgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgImZ1bmN0aW9uIFRvU3RyaW5nOiBzdHJpbmc7IG92ZXJyaWRlOyIgPDwgZW5kbDsKLQotICBpZiAoaXNfZXhjZXB0aW9uICYmICghaXNfeF9mYWN0b3J5KSkgewotICAgIG91dCA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIvLyBFeGNlcHRpb24gRmFjdG9yeSIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAicHJvcGVydHkgIiA8PCBleGNlcHRpb25fZmFjdG9yeV9uYW1lIDw8ICI6ICIgPDwgc3RydWN0X2ludGZfbmFtZSA8PCAiIHJlYWQgRiIKLSAgICAgICAgICAgICAgICA8PCBleGNlcHRpb25fZmFjdG9yeV9uYW1lIDw8ICIgd3JpdGUgRiIgPDwgZXhjZXB0aW9uX2ZhY3RvcnlfbmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgfQotCi0gIGlmICgoIWlzX2V4Y2VwdGlvbikgfHwgaXNfeF9mYWN0b3J5KSB7Ci0gICAgb3V0IDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIi8vIElCYXNlIiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJwcm9jZWR1cmUgUmVhZCggY29uc3QgaXByb3Q6IElQcm90b2NvbCk7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IG9wcm90OiBJUHJvdG9jb2wpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGlmIChpc19leGNlcHRpb24gJiYgaXNfeF9mYWN0b3J5KSB7Ci0gICAgb3V0IDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIi8vIENyZWF0ZSBFeGNlcHRpb24gT2JqZWN0IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJmdW5jdGlvbiBDcmVhdGVFeGNlcHRpb246ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QsIHRydWUsIHRydWUpIDw8ICI7IiA8PCBlbmRsOwotICB9Ci0KLSAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgewotICAgIG91dCA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIvLyBQcm9wZXJ0aWVzIiA8PCBlbmRsOwotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIGdlbmVyYXRlX3Byb3BlcnR5KG91dCwgKm1faXRlciwgdHJ1ZSwgaXNfZXhjZXB0aW9uKTsKLSAgICB9Ci0gIH0KLQotICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7Ci0gICAgb3V0IDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIi8vIGlzc2V0IiA8PCBlbmRsOwotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICAgIGlzc2V0X25hbWUgPSAiX19pc3NldF8iICsgcHJvcF9uYW1lKCptX2l0ZXIsIGlzX2V4Y2VwdGlvbik7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJwcm9wZXJ0eSAiIDw8IGlzc2V0X25hbWUgPDwgIjogQm9vbGVhbiByZWFkIEdldCIgPDwgaXNzZXRfbmFtZSA8PCAiOyIKLSAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIGluZGVudF91cCgpOwotICBnZW5lcmF0ZV9kZWxwaGlfZG9jKHNfc2VydmljZSwgdHNlcnZpY2UpOwotICBpbmRlbnQoc19zZXJ2aWNlKSA8PCBub3JtYWxpemVfY2xzbm0oc2VydmljZV9uYW1lXywgIlQiKSA8PCAiID0gY2xhc3MiIDw8IGVuZGw7Ci0gIGluZGVudChzX3NlcnZpY2UpIDw8ICJwdWJsaWMiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAidHlwZSIgPDwgZW5kbDsKLSAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KHNfc2VydmljZSkgPDwgImVuZDsiIDw8IGVuZGw7Ci0gIGluZGVudChzX3NlcnZpY2UpIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX2lmYWNlID0gIiI7Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgZ2VuZXJhdGVfZGVscGhpX2RvYyhzX3NlcnZpY2UsIHRzZXJ2aWNlKTsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLCB0cnVlLCB0cnVlKTsKLSAgICBleHRlbmRzX2lmYWNlID0gZXh0ZW5kcyArICIuSWZhY2UiOwotICAgIGdlbmVyYXRlX2RlbHBoaV9kb2Moc19zZXJ2aWNlLCB0c2VydmljZSk7Ci0gICAgaW5kZW50KHNfc2VydmljZSkgPDwgIklmYWNlID0gaW50ZXJmYWNlKCIgPDwgZXh0ZW5kc19pZmFjZSA8PCAiKSIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiSWZhY2UgPSBpbnRlcmZhY2UiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnRfdXAoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfZGVscGhpX2RvYyhzX3NlcnZpY2UsICpmX2l0ZXIpOwotICAgIGluZGVudChzX3NlcnZpY2UpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChzX3NlcnZpY2UpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfZGVmaW5pdGlvbihzX3NlcnZpY2UsIHRzLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9pbXBsKHNfc2VydmljZV9pbXBsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVfY2xzbm0oc2VydmljZV9uYW1lXywgIlQiKSArICIuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLSAgICBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOwotICB9Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIGluZGVudF91cCgpOwotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX2NsaWVudCA9IGV4dGVuZHMgKyAiLkNsaWVudCwgIjsKLSAgfQotCi0gIGdlbmVyYXRlX2RlbHBoaV9kb2Moc19zZXJ2aWNlLCB0c2VydmljZSk7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgZXh0ZW5kc19jbGllbnQgPSBleHRlbmRzICsgIi5UQ2xpZW50IjsKLSAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiVENsaWVudCA9IGNsYXNzKCIgPDwgZXh0ZW5kc19jbGllbnQgPDwgIiwgSWZhY2UpIiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJUQ2xpZW50ID0gY2xhc3MoIFRJbnRlcmZhY2VkT2JqZWN0LCBJZmFjZSkiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAicHVibGljIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiY29uc3RydWN0b3IgQ3JlYXRlKCBwcm90OiBJUHJvdG9jb2wpOyBvdmVybG9hZDsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJjb25zdHJ1Y3RvciAiIDw8IG5vcm1hbGl6ZV9jbHNubShzZXJ2aWNlX25hbWVfLCAiVCIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLlRDbGllbnQuQ3JlYXRlKCBwcm90OiBJUHJvdG9jb2wpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJDcmVhdGUoIHByb3QsIHByb3QgKTsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KHNfc2VydmljZSkKLSAgICAgIDw8ICJjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IGlwcm90OiBJUHJvdG9jb2w7IGNvbnN0IG9wcm90OiBJUHJvdG9jb2wpOyBvdmVybG9hZDsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJjb25zdHJ1Y3RvciAiIDw8IG5vcm1hbGl6ZV9jbHNubShzZXJ2aWNlX25hbWVfLCAiVCIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLlRDbGllbnQuQ3JlYXRlKCBjb25zdCBpcHJvdDogSVByb3RvY29sOyBjb25zdCBvcHJvdDogSVByb3RvY29sKTsiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOwotICBpbmRlbnRfdXBfaW1wbCgpOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImluaGVyaXRlZCBDcmVhdGU7IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlwcm90XyA6PSBpcHJvdDsiIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAib3Byb3RfIDo9IG9wcm90OyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd25faW1wbCgpOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotCi0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAicHJvdGVjdGVkIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJpcHJvdF86IElQcm90b2NvbDsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KHNfc2VydmljZSkgPDwgIm9wcm90XzogSVByb3RvY29sOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAic2VxaWRfOiBJbnRlZ2VyOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotCi0gICAgaW5kZW50KHNfc2VydmljZSkgPDwgInB1YmxpYyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAicHJvcGVydHkgSW5wdXRQcm90b2NvbDogSVByb3RvY29sIHJlYWQgaXByb3RfOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAicHJvcGVydHkgT3V0cHV0UHJvdG9jb2w6IElQcm90b2NvbCByZWFkIG9wcm90XzsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGluZGVudChzX3NlcnZpY2UpIDw8ICJwcm90ZWN0ZWQiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiLy8gSWZhY2UiIDw8IGVuZGw7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgZ2VuZXJhdGVfZGVscGhpX2RvYyhzX3NlcnZpY2UsICpmX2l0ZXIpOwotICAgIGluZGVudChzX3NlcnZpY2UpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgaW5kZW50KHNfc2VydmljZSkgPDwgInB1YmxpYyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgc3RyaW5nIGZ1bGxfY2xzID0gbm9ybWFsaXplX2Nsc25tKHNlcnZpY2VfbmFtZV8sICJUIikgKyAiLlRDbGllbnQiOwotCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0KLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsIGZ1bGxfY2xzKSA8PCBlbmRsOwotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwX2ltcGwoKTsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIjsKLQotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotCi0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzX3NlcnZpY2VfaW1wbCA8PCAiLCAiOwotICAgICAgfQotICAgICAgc19zZXJ2aWNlX2ltcGwgPDwgbm9ybWFsaXplX25hbWUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpOwotICAgIH0KLSAgICBzX3NlcnZpY2VfaW1wbCA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIHNfc2VydmljZV9pbXBsIDw8IGluZGVudF9pbXBsKCk7Ci0gICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIHNfc2VydmljZV9pbXBsIDw8ICJSZXN1bHQgOj0gIjsKLSAgICAgIH0KLSAgICAgIHNfc2VydmljZV9pbXBsIDw8ICJyZWN2XyIgPDwgZnVubmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGluZGVudF9kb3duX2ltcGwoKTsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIHRfZnVuY3Rpb24gc2VuZF9mdW5jdGlvbihnX3R5cGVfdm9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJzZW5kXyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF9hcmdsaXN0KCkpOwotCi0gICAgc3RyaW5nIGFyZ3NuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKLSAgICBzdHJpbmcgYXJnc19jbHNubSA9IG5vcm1hbGl6ZV9jbHNubShhcmdzbmFtZSwgIlQiKTsKLSAgICBzdHJpbmcgYXJnc19pbnRmbm0gPSBub3JtYWxpemVfY2xzbm0oYXJnc25hbWUsICJJIik7Ci0KLSAgICBzdHJpbmcgYXJnc3ZhciA9IHRtcCgiX2FyZ3MiKTsKLSAgICBzdHJpbmcgbXNndmFyID0gdG1wKCJfbXNnIik7Ci0KLSAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnNlbmRfZnVuY3Rpb24pIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VuZF9mdW5jdGlvbiwgZnVsbF9jbHMpIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJ2YXIiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwX2ltcGwoKTsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgYXJnc3ZhciA8PCAiIDogIiA8PCBhcmdzX2ludGZubSA8PCAiOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgbXNndmFyIDw8ICIgOiBUaHJpZnQuUHJvdG9jb2wuSU1lc3NhZ2U7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duX2ltcGwoKTsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOwotICAgIGluZGVudF91cF9pbXBsKCk7Ci0KLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInNlcWlkXyA6PSBzZXFpZF8gKyAxOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgbXNndmFyIDw8ICIgOj0gVGhyaWZ0LlByb3RvY29sLlRNZXNzYWdlSW1wbC5DcmVhdGUoJyIgPDwgZnVubmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiJywgIiA8PCAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJUTWVzc2FnZVR5cGUuT25ld2F5IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJUTWVzc2FnZVR5cGUuQ2FsbCIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIHNlcWlkXyk7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvcHJvdF8uV3JpdGVNZXNzYWdlQmVnaW4oICIgPDwgbXNndmFyIDw8ICIgKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IGFyZ3N2YXIgPDwgIiA6PSAiIDw8IGFyZ3NfY2xzbm0gPDwgIkltcGwuQ3JlYXRlKCk7IiA8PCBlbmRsOwotCi0gICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCBhcmdzdmFyIDw8ICIuIiA8PCBwcm9wX25hbWUoKmZsZF9pdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgOj0gIiA8PCBub3JtYWxpemVfbmFtZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjsiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IGFyZ3N2YXIgPDwgIi5Xcml0ZShvcHJvdF8pOyIgPDwgZW5kbDsKLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IGFyZ3N2YXIgPDwgIi4iIDw8IHByb3BfbmFtZSgqZmxkX2l0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiA6PSAiIDw8IGVtcHR5X3ZhbHVlKCgqZmxkX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9wcm90Xy5Xcml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvcHJvdF8uVHJhbnNwb3J0LkZsdXNoKCk7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X2Rvd25faW1wbCgpOwotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBzdHJpbmcgb3JnX3Jlc3VsdG5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7Ci0gICAgICBzdHJpbmcgcmVzdWx0X2Nsc25tID0gbm9ybWFsaXplX2Nsc25tKG9yZ19yZXN1bHRuYW1lLCAiVCIpOwotICAgICAgc3RyaW5nIHJlc3VsdF9pbnRmbm0gPSBub3JtYWxpemVfY2xzbm0ob3JnX3Jlc3VsdG5hbWUsICJJIik7Ci0KLSAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7Ci0gICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9hcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpKTsKLQotICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotCi0gICAgICBzdHJpbmcgZXhjZXB0dmFyID0gdG1wKCJfZXgiKTsKLSAgICAgIHN0cmluZyBhcHBleHZhciA9IHRtcCgiX2F4Iik7Ci0gICAgICBzdHJpbmcgcmV0dmFyID0gdG1wKCJfcmV0Iik7Ci0KLSAgICAgIGluZGVudChzX3NlcnZpY2UpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbikgPDwgZW5kbDsKLSAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24sIGZ1bGxfY2xzKSA8PCBlbmRsOwotICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJ2YXIiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXBfaW1wbCgpOwotICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IG1zZ3ZhciA8PCAiIDogVGhyaWZ0LlByb3RvY29sLklNZXNzYWdlOyIgPDwgZW5kbDsKLSAgICAgIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgZXhjZXB0dmFyIDw8ICIgOiBFeGNlcHRpb247IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IGFwcGV4dmFyIDw8ICIgOiBUQXBwbGljYXRpb25FeGNlcHRpb247IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IHJldHZhciA8PCAiIDogIiA8PCByZXN1bHRfaW50Zm5tIDw8ICI7IiA8PCBlbmRsOwotCi0gICAgICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwX2ltcGwoKTsKLSAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCBtc2d2YXIgPDwgIiA6PSBpcHJvdF8uUmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaWYgKCIgPDwgbXNndmFyIDw8ICIuVHlwZV8gPSBUTWVzc2FnZVR5cGUuRXhjZXB0aW9uKSB0aGVuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwX2ltcGwoKTsKLSAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCBhcHBleHZhciA8PCAiIDo9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5SZWFkKGlwcm90Xyk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpcHJvdF8uUmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInJhaXNlICIgPDwgYXBwZXh2YXIgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGw7Ci0KLSAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCByZXR2YXIgPDwgIiA6PSAiIDw8IHJlc3VsdF9jbHNubSA8PCAiSW1wbC5DcmVhdGUoKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgcmV0dmFyIDw8ICIuUmVhZChpcHJvdF8pOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaXByb3RfLlJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOwotCi0gICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaWYgKCIgPDwgcmV0dmFyIDw8ICIuX19pc3NldF9zdWNjZXNzKSB0aGVuIiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXBfaW1wbCgpOwotICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIlJlc3VsdCA6PSAiIDw8IHJldHZhciA8PCAiLlN1Y2Nlc3M7IiA8PCBlbmRsOwotICAgICAgICB0X3R5cGUqIHR5cGUgPSAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCk7Ci0gICAgICAgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpIHx8IHR5cGUtPmlzX21hcCgpIHx8IHR5cGUtPmlzX2xpc3QoKQotICAgICAgICAgICAgfHwgdHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgcmV0dmFyIDw8ICIuU3VjY2VzcyA6PSBuaWw7IiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiRXhpdDsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9kb3duX2ltcGwoKTsKLSAgICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlmICgiIDw8IHJldHZhciA8PCAiLl9faXNzZXRfIiA8PCBwcm9wX25hbWUoKnhfaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIpIHRoZW4iIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cF9pbXBsKCk7Ci0gICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCBleGNlcHR2YXIgPDwgIiA6PSAiIDw8IHJldHZhciA8PCAiLiIgPDwgcHJvcF9uYW1lKCp4X2l0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLkNyZWF0ZUV4Y2VwdGlvbjsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAicmFpc2UgIiA8PCBleGNlcHR2YXIgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9kb3duX2ltcGwoKTsKLSAgICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKQotICAgICAgICAgICAgPDwgInJhaXNlICIKLSAgICAgICAgICAgICAgICJUQXBwbGljYXRpb25FeGNlcHRpb24uQ3JlYXRlKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5URXhjZXB0aW9uVHlwZS5NaXNzaW5nUmVzdWx0LCAnIgotICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdCcpOyIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgaW5kZW50X2Rvd25faW1wbCgpOwotICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KHNfc2VydmljZSkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfcHJvY2Vzc29yID0gIiI7Ci0KLSAgc3RyaW5nIGZ1bGxfY2xzID0gbm9ybWFsaXplX2Nsc25tKHNlcnZpY2VfbmFtZV8sICJUIikgKyAiLlRQcm9jZXNzb3JJbXBsIjsKLQotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCksIHRydWUsIHRydWUpOwotICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gZXh0ZW5kcyArICIuVFByb2Nlc3NvckltcGwiOwotICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJUUHJvY2Vzc29ySW1wbCA9IGNsYXNzKCIgPDwgZXh0ZW5kc19wcm9jZXNzb3IgPDwgIiwgSVByb2Nlc3NvcikiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KHNfc2VydmljZSkgPDwgIlRQcm9jZXNzb3JJbXBsID0gY2xhc3MoIFRJbnRlcmZhY2VkT2JqZWN0LCBJUHJvY2Vzc29yKSIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudChzX3NlcnZpY2UpIDw8ICJwdWJsaWMiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiY29uc3RydWN0b3IgQ3JlYXRlKCBpZmFjZV86IElmYWNlICk7IiA8PCBlbmRsOwotICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiZGVzdHJ1Y3RvciBEZXN0cm95OyBvdmVycmlkZTsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJjb25zdHJ1Y3RvciAiIDw8IGZ1bGxfY2xzIDw8ICIuQ3JlYXRlKCBpZmFjZV86IElmYWNlICk7IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOwotICBpbmRlbnRfdXBfaW1wbCgpOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaW5oZXJpdGVkIENyZWF0ZSggaWZhY2VfKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpbmhlcml0ZWQgQ3JlYXRlOyIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIlNlbGYuaWZhY2VfIDo9IGlmYWNlXzsiIDw8IGVuZGw7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJBU1NFUlQoIHByb2Nlc3NNYXBfIDw+IG5pbCk7ICAvLyBpbmhlcml0ZWQiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpCi0gICAgICAgIDw8ICJwcm9jZXNzTWFwXyA6PSBUVGhyaWZ0RGljdGlvbmFyeUltcGw8c3RyaW5nLCBUUHJvY2Vzc0Z1bmN0aW9uPi5DcmVhdGU7IiA8PCBlbmRsOwotICB9Ci0KLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInByb2Nlc3NNYXBfLkFkZE9yU2V0VmFsdWUoICciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJywgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIl9Qcm9jZXNzKTsiIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd25faW1wbCgpOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImRlc3RydWN0b3IgIiA8PCBmdWxsX2NscyA8PCAiLkRlc3Ryb3k7IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOwotICBpbmRlbnRfdXBfaW1wbCgpOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImluaGVyaXRlZDsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KHNfc2VydmljZSkgPDwgInByaXZhdGUiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiaWZhY2VfOiBJZmFjZTsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpID09IE5VTEwpIHsKLSAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAicHJvdGVjdGVkIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJ0eXBlIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJUUHJvY2Vzc0Z1bmN0aW9uID0gcmVmZXJlbmNlIHRvIHByb2NlZHVyZSggc2VxaWQ6IEludGVnZXI7IGNvbnN0IGlwcm90OiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIklQcm90b2NvbDsgY29uc3Qgb3Byb3Q6IElQcm90b2NvbCIKLSAgICAgICAgICAgICAgICAgICAgICA8PCAoZXZlbnRzXyA/ICI7IGNvbnN0IGV2ZW50cyA6IElSZXF1ZXN0RXZlbnRzIiA6ICIiKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJwcm90ZWN0ZWQiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KHNfc2VydmljZSkgPDwgInByb2Nlc3NNYXBfOiBJVGhyaWZ0RGljdGlvbmFyeTxzdHJpbmcsIFRQcm9jZXNzRnVuY3Rpb24+OyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0KLSAgaW5kZW50KHNfc2VydmljZSkgPDwgInB1YmxpYyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiZnVuY3Rpb24gUHJvY2VzcyggY29uc3QgaXByb3Q6IElQcm90b2NvbDsgY29uc3Qgb3Byb3Q6IElQcm90b2NvbDsgY29uc3QgIgotICAgICAgICAgICAgICAgICAgICAgICAgICJldmVudHMgOiBJUHJvY2Vzc29yRXZlbnRzKTogQm9vbGVhbjsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KHNfc2VydmljZSkgPDwgImZ1bmN0aW9uIFByb2Nlc3MoIGNvbnN0IGlwcm90OiBJUHJvdG9jb2w7IGNvbnN0IG9wcm90OiBJUHJvdG9jb2w7IGNvbnN0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiZXZlbnRzIDogSVByb2Nlc3NvckV2ZW50cyk6IEJvb2xlYW47IHJlaW50cm9kdWNlOyIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZnVuY3Rpb24gIiA8PCBmdWxsX2NscyA8PCAiLlByb2Nlc3MoIGNvbnN0IGlwcm90OiBJUHJvdG9jb2w7ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb25zdCBvcHJvdDogSVByb3RvY29sOyBjb25zdCBldmVudHMgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjogSVByb2Nlc3NvckV2ZW50cyk6IEJvb2xlYW47IiA8PCBlbmRsOwotICA7Ci0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAidmFyIiA8PCBlbmRsOwotICBpbmRlbnRfdXBfaW1wbCgpOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm1zZyA6IFRocmlmdC5Qcm90b2NvbC5JTWVzc2FnZTsiIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZm4gOiBUUHJvY2Vzc0Z1bmN0aW9uOyIgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJ4IDogVEFwcGxpY2F0aW9uRXhjZXB0aW9uOyIgPDwgZW5kbDsKLSAgaWYgKGV2ZW50c18pIHsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImNvbnRleHQgOiBJUmVxdWVzdEV2ZW50czsiIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd25faW1wbCgpOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOwotICBpbmRlbnRfdXBfaW1wbCgpOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInRyeSIgPDwgZW5kbDsKLSAgaW5kZW50X3VwX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJtc2cgOj0gaXByb3QuUmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJmbiA6PSBuaWw7IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlmIG5vdCBwcm9jZXNzTWFwXy5UcnlHZXRWYWx1ZShtc2cuTmFtZSwgZm4pIiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9yIG5vdCBBc3NpZ25lZChmbikgdGhlbiIgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJUUHJvdG9jb2xVdGlsLlNraXAoaXByb3QsIFRUeXBlLlN0cnVjdCk7IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlwcm90LlJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInggOj0gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5DcmVhdGUoVEFwcGxpY2F0aW9uRXhjZXB0aW9uLiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJURXhjZXB0aW9uVHlwZS5Vbmtub3duTWV0aG9kLCAnSW52YWxpZCBtZXRob2QgbmFtZTogJycnICsgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1zZy5OYW1lICsgJycnJyk7IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkKLSAgICAgIDw8ICJtc2cgOj0gVGhyaWZ0LlByb3RvY29sLlRNZXNzYWdlSW1wbC5DcmVhdGUobXNnLk5hbWUsIFRNZXNzYWdlVHlwZS5FeGNlcHRpb24sIG1zZy5TZXFJRCk7IgotICAgICAgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbiggbXNnKTsiIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAieC5Xcml0ZShvcHJvdCk7IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9wcm90LldyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvcHJvdC5UcmFuc3BvcnQuRmx1c2goKTsiIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiUmVzdWx0IDo9IFRydWU7IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIkV4aXQ7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbDsKLSAgaWYgKGV2ZW50c18pIHsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlmIGV2ZW50cyA8PiBuaWwiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJ0aGVuIGNvbnRleHQgOj0gZXZlbnRzLkNyZWF0ZVJlcXVlc3RDb250ZXh0KG1zZy5OYW1lKSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVsc2UgY29udGV4dCA6PSBuaWw7IiA8PCBlbmRsOwotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAidHJ5IiA8PCBlbmRsOwotICAgIGluZGVudF91cF9pbXBsKCk7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJmbihtc2cuU2VxSUQsIGlwcm90LCBvcHJvdCwgY29udGV4dCk7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duX2ltcGwoKTsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImZpbmFsbHkiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwX2ltcGwoKTsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlmIGNvbnRleHQgPD4gbmlsIHRoZW4gYmVnaW4iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwX2ltcGwoKTsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImNvbnRleHQuQ2xlYW51cENvbnRleHQ7IiA8PCBlbmRsOwotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiY29udGV4dCA6PSBuaWw7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duX2ltcGwoKTsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd25faW1wbCgpOwotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImZuKG1zZy5TZXFJRCwgaXByb3QsIG9wcm90KTsiIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd25faW1wbCgpOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImV4Y2VwdCIgPDwgZW5kbDsKLSAgaW5kZW50X3VwX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJSZXN1bHQgOj0gRmFsc2U7IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIkV4aXQ7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJSZXN1bHQgOj0gVHJ1ZTsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChzX3NlcnZpY2UpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIHJldHVybjsKLSAgfQotCi0gIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKLSAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgIlN1Y2Nlc3MiLCAwKTsKLSAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOwotICB9Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKLSAgfQotCi0gIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfZGVmaW5pdGlvbihzX3NlcnZpY2UsICZyZXN1bHQsIGZhbHNlLCB0cnVlLCB0cnVlKTsKLSAgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9pbXBsKHNfc2VydmljZV9pbXBsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplX2Nsc25tKHNlcnZpY2VfbmFtZV8sICJUIikgKyAiLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgKHZvaWQpdHNlcnZpY2U7Ci0gIHN0cmluZyBmdW5jbmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKTsKLSAgc3RyaW5nIGZ1bGxfY2xzID0gbm9ybWFsaXplX2Nsc25tKHNlcnZpY2VfbmFtZV8sICJUIikgKyAiLlRQcm9jZXNzb3JJbXBsIjsKLQotICBzdHJpbmcgb3JnX2FyZ3NuYW1lID0gZnVuY25hbWUgKyAiX2FyZ3MiOwotICBzdHJpbmcgYXJnc19jbHNubSA9IG5vcm1hbGl6ZV9jbHNubShvcmdfYXJnc25hbWUsICJUIik7Ci0gIHN0cmluZyBhcmdzX2ludGZubSA9IG5vcm1hbGl6ZV9jbHNubShvcmdfYXJnc25hbWUsICJJIik7Ci0KLSAgc3RyaW5nIG9yZ19yZXN1bHRuYW1lID0gZnVuY25hbWUgKyAiX3Jlc3VsdCI7Ci0gIHN0cmluZyByZXN1bHRfY2xzbm0gPSBub3JtYWxpemVfY2xzbm0ob3JnX3Jlc3VsdG5hbWUsICJUIik7Ci0gIHN0cmluZyByZXN1bHRfaW50Zm5tID0gbm9ybWFsaXplX2Nsc25tKG9yZ19yZXN1bHRuYW1lLCAiSSIpOwotCi0gIGluZGVudChzX3NlcnZpY2UpIDw8ICJwcm9jZWR1cmUgIiA8PCBmdW5jbmFtZQotICAgICAgICAgICAgICAgICAgICA8PCAiX1Byb2Nlc3MoIHNlcWlkOiBJbnRlZ2VyOyBjb25zdCBpcHJvdDogSVByb3RvY29sOyBjb25zdCBvcHJvdDogSVByb3RvY29sIgotICAgICAgICAgICAgICAgICAgICA8PCAoZXZlbnRzXyA/ICI7IGNvbnN0IGV2ZW50cyA6IElSZXF1ZXN0RXZlbnRzIiA6ICIiKSA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIi8vIG9uZSB3YXkgcHJvY2Vzc29yIiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiLy8gYm90aCB3YXkgcHJvY2Vzc29yIiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpCi0gICAgICA8PCAicHJvY2VkdXJlICIgPDwgZnVsbF9jbHMgPDwgIi4iIDw8IGZ1bmNuYW1lCi0gICAgICA8PCAiX1Byb2Nlc3MoIHNlcWlkOiBJbnRlZ2VyOyBjb25zdCBpcHJvdDogSVByb3RvY29sOyBjb25zdCBvcHJvdDogSVByb3RvY29sIgotICAgICAgPDwgKGV2ZW50c18gPyAiOyBjb25zdCBldmVudHMgOiBJUmVxdWVzdEV2ZW50cyIgOiAiIikgPDwgIik7IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInZhciIgPDwgZW5kbDsKLSAgaW5kZW50X3VwX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJhcmdzOiAiIDw8IGFyZ3NfaW50Zm5tIDw8ICI7IiA8PCBlbmRsOwotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm1zZzogVGhyaWZ0LlByb3RvY29sLklNZXNzYWdlOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInJldDogIiA8PCByZXN1bHRfaW50Zm5tIDw8ICI7IiA8PCBlbmRsOwotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYXBweCA6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7Ci0gIGluZGVudF91cF9pbXBsKCk7Ci0KLSAgaWYgKGV2ZW50c18pIHsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlmIGV2ZW50cyA8PiBuaWwgdGhlbiBldmVudHMuUHJlUmVhZDsiIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJhcmdzIDo9ICIgPDwgYXJnc19jbHNubSA8PCAiSW1wbC5DcmVhdGU7IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImFyZ3MuUmVhZChpcHJvdCk7IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlwcm90LlJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOwotICBpZiAoZXZlbnRzXykgewotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaWYgZXZlbnRzIDw+IG5pbCB0aGVuIGV2ZW50cy5Qb3N0UmVhZDsiIDw8IGVuZGw7Ci0gIH0KLQotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotCi0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAicmV0IDo9ICIgPDwgcmVzdWx0X2Nsc25tIDw8ICJJbXBsLkNyZWF0ZTsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInRyeSIgPDwgZW5kbDsKLSAgaW5kZW50X3VwX2ltcGwoKTsKLQotICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgc19zZXJ2aWNlX2ltcGwgPDwgaW5kZW50X2ltcGwoKTsKLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgIHNfc2VydmljZV9pbXBsIDw8ICJyZXQuU3VjY2VzcyA6PSAiOwotICB9Ci0gIHNfc2VydmljZV9pbXBsIDw8ICJpZmFjZV8uIiA8PCBub3JtYWxpemVfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCksIHRydWUpIDw8ICIoIjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBzX3NlcnZpY2VfaW1wbCA8PCAiLCAiOwotICAgIH0KLSAgICBzX3NlcnZpY2VfaW1wbCA8PCAiYXJncy4iIDw8IHByb3BfbmFtZSgqZl9pdGVyKTsKLSAgfQotICBzX3NlcnZpY2VfaW1wbCA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImFyZ3MuIiA8PCBwcm9wX25hbWUoKmZfaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiA6PSAiIDw8IGVtcHR5X3ZhbHVlKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZXhjZXB0IiA8PCBlbmRsOwotICBpbmRlbnRfdXBfaW1wbCgpOwotCi0gIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvbiBFOiAiIDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCksIHRydWUsIHRydWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgZG8gYmVnaW4iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwX2ltcGwoKTsKLSAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICAgIHN0cmluZyBmYWN0b3J5X25hbWUgPSBub3JtYWxpemVfY2xzbm0oKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpLCAiIiwgdHJ1ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJGYWN0b3J5IjsKLSAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAicmV0LiIgPDwgcHJvcF9uYW1lKCp4X2l0ZXIpIDw8ICIgOj0gRS4iIDw8IGZhY3RvcnlfbmFtZSA8PCAiOyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvbiBFOiBFeGNlcHRpb24gZG8gYmVnaW4iIDw8IGVuZGw7Ci0gIGluZGVudF91cF9pbXBsKCk7Ci0gIGlmKGV2ZW50c18pIHsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlmIGV2ZW50cyA8PiBuaWwgdGhlbiBldmVudHMuVW5oYW5kbGVkRXJyb3IoRSk7IiA8PCBlbmRsOwotICB9Ci0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYXBweCA6PSBUQXBwbGljYXRpb25FeGNlcHRpb24uQ3JlYXRlKCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUQXBwbGljYXRpb25FeGNlcHRpb24uVEV4Y2VwdGlvblR5cGUuSW50ZXJuYWxFcnJvciwgRS5NZXNzYWdlKTsiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJ0cnkiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwX2ltcGwoKTsKLSAgICBpZihldmVudHNfKSB7Ci0gICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlmIGV2ZW50cyA8PiBuaWwgdGhlbiBldmVudHMuUHJlV3JpdGU7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm1zZyA6PSBUaHJpZnQuUHJvdG9jb2wuVE1lc3NhZ2VJbXBsLkNyZWF0ZSgnIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIicsIFRNZXNzYWdlVHlwZS5FeGNlcHRpb24sIHNlcWlkKTsiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbiggbXNnKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJhcHB4LldyaXRlKG9wcm90KTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvcHJvdC5Xcml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvcHJvdC5UcmFuc3BvcnQuRmx1c2goKTsiIDw8IGVuZGw7Ci0gICAgaWYoZXZlbnRzXykgewotICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpZiBldmVudHMgPD4gbmlsIHRoZW4gZXZlbnRzLlBvc3RXcml0ZTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiRXhpdDsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd25faW1wbCgpOwotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZmluYWxseSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXBfaW1wbCgpOwotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYXBweC5GcmVlOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsOwotCi0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGlmIChldmVudHNfKSB7Ci0gICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlmIGV2ZW50cyA8PiBuaWwgdGhlbiBldmVudHMuUHJlV3JpdGU7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm1zZyA6PSBUaHJpZnQuUHJvdG9jb2wuVE1lc3NhZ2VJbXBsLkNyZWF0ZSgnIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIicsIFRNZXNzYWdlVHlwZS5SZXBseSwgc2VxaWQpOyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbiggbXNnKTsgIiA8PCBlbmRsOwotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAicmV0LldyaXRlKG9wcm90KTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvcHJvdC5Xcml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvcHJvdC5UcmFuc3BvcnQuRmx1c2goKTsiIDw8IGVuZGw7Ci0gICAgaWYgKGV2ZW50c18pIHsKLSAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaWYgZXZlbnRzIDw+IG5pbCB0aGVuIGV2ZW50cy5Qb3N0V3JpdGU7IiA8PCBlbmRsOwotICAgIH0KLSAgfSBlbHNlIGlmIChldmVudHNfKSB7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpZiBldmVudHMgPD4gbmlsIHRoZW4gZXZlbnRzLk9uZXdheUNvbXBsZXRlOyIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudF9kb3duX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3RyZWFtJiBsb2NhbF92YXJzKSB7Ci0gIHRfdHlwZSogdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKLSAgd2hpbGUgKHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgIHR5cGUgPSAoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCk7Ci0gIH0KLQotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHByb3BfbmFtZSh0ZmllbGQsIGlzX3hjZXB0aW9uKTsKLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSwgIiIpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgaXNfeGNlcHRpb24sIHR5cGUsIG5hbWUsIGxvY2FsX3ZhcnMpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotICAgIGluZGVudF9pbXBsKG91dCkgPDwgbmFtZSA8PCAiIDo9ICI7Ci0KLSAgICBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBvdXQgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlKSA8PCAiKCI7Ci0gICAgfQotCi0gICAgb3V0IDw8ICJpcHJvdC4iOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgICAgIGlmIChhbnNpc3RyX2JpbmFyeV8pIHsKLSAgICAgICAgICAgIG91dCA8PCAiUmVhZEFuc2lTdHJpbmcoKTsiOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvdXQgPDwgIlJlYWRCaW5hcnkoKTsiOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBvdXQgPDwgIlJlYWRTdHJpbmcoKTsiOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBvdXQgPDwgIlJlYWRCb29sKCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIG91dCA8PCAiUmVhZEJ5dGUoKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBvdXQgPDwgIlJlYWRJMTYoKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBvdXQgPDwgIlJlYWRJMzIoKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICBvdXQgPDwgIlJlYWRJNjQoKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgIlJlYWREb3VibGUoKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gRGVscGhpIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgb3V0IDw8ICJSZWFkSTMyKCkiOwotICAgICAgb3V0IDw8ICIpOyI7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAotICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKLSAgICAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOwotICB9Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIHR5cF9uYW1lOwotCi0gIGlmICh0c3RydWN0LT5pc194Y2VwdGlvbigpKSB7Ci0gICAgdHlwX25hbWUgPSB0eXBlX25hbWUodHN0cnVjdCwgdHJ1ZSwgZmFsc2UsIHRydWUsIHRydWUpOwotICB9IGVsc2UgewotICAgIHR5cF9uYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QsIHRydWUsIGZhbHNlKTsKLSAgfQotCi0gIGluZGVudF9pbXBsKG91dCkgPDwgcHJlZml4IDw8IG5hbWUgPDwgIiA6PSAiIDw8IHR5cF9uYW1lIDw8ICIuQ3JlYXRlOyIgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwob3V0KSA8PCBwcmVmaXggPDwgbmFtZSA8PCAiLlJlYWQoaXByb3QpOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIGxvY2FsX3ZhcnMpIHsKLQotICBzdHJpbmcgb2JqOwotICBzdHJpbmcgY291bnRlcjsKLSAgc3RyaW5nIGxvY2FsX3ZhcjsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgb2JqID0gdG1wKCJfbWFwIik7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgb2JqID0gdG1wKCJfc2V0Iik7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIG9iaiA9IHRtcCgiX2xpc3QiKTsKLSAgfQotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBsb2NhbF92YXIgPSBvYmogKyAiOiBJTWFwOyI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgbG9jYWxfdmFyID0gb2JqICsgIjogSVNldDsiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBsb2NhbF92YXIgPSBvYmogKyAiOiBJTGlzdDsiOwotICB9Ci0gIGxvY2FsX3ZhcnMgPDwgIiAgIiA8PCBsb2NhbF92YXIgPDwgZW5kbDsKLSAgY291bnRlciA9IHRtcCgiX2kiKTsKLSAgbG9jYWxfdmFyID0gY291bnRlciArICI6IEludGVnZXI7IjsKLSAgbG9jYWxfdmFycyA8PCAiICAiIDw8IGxvY2FsX3ZhciA8PCBlbmRsOwotCi0gIGluZGVudF9pbXBsKG91dCkgPDwgbmFtZSA8PCAiIDo9ICIgPDwgdHlwZV9uYW1lKHR0eXBlLCB0cnVlKSA8PCAiLkNyZWF0ZTsiIDw8IGVuZGw7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudF9pbXBsKG91dCkgPDwgb2JqIDw8ICIgOj0gaXByb3QuUmVhZE1hcEJlZ2luKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudF9pbXBsKG91dCkgPDwgb2JqIDw8ICIgOj0gaXByb3QuUmVhZFNldEJlZ2luKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnRfaW1wbChvdXQpIDw8IG9iaiA8PCAiIDo9IGlwcm90LlJlYWRMaXN0QmVnaW4oKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJmb3IgIiA8PCBjb3VudGVyIDw8ICIgOj0gMCB0byAiIDw8IG9iaiA8PCAiLkNvdW50IC0gMSBkbyIgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwob3V0KSA8PCAiYmVnaW4iIDw8IGVuZGw7Ci0gIGluZGVudF91cF9pbXBsKCk7Ci0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsIGlzX3hjZXB0aW9uLCAodF9tYXAqKXR0eXBlLCBuYW1lLCBsb2NhbF92YXJzKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsIGlzX3hjZXB0aW9uLCAodF9zZXQqKXR0eXBlLCBuYW1lLCBsb2NhbF92YXJzKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgaXNfeGNlcHRpb24sICh0X2xpc3QqKXR0eXBlLCBuYW1lLCBsb2NhbF92YXJzKTsKLSAgfQotICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKG91dCkgPDwgImVuZDsiIDw8IGVuZGw7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudF9pbXBsKG91dCkgPDwgImlwcm90LlJlYWRNYXBFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCAiaXByb3QuUmVhZFNldEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCAiaXByb3QuUmVhZExpc3RFbmQoKTsiIDw8IGVuZGw7Ci0gIH0KLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3N0cmVhbSYgbG9jYWxfdmFycykgewotCi0gIHN0cmluZyBrZXkgPSB0bXAoIl9rZXkiKTsKLSAgc3RyaW5nIHZhbCA9IHRtcCgiX3ZhbCIpOwotICBzdHJpbmcgbG9jYWxfdmFyOwotCi0gIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKLSAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOwotCi0gIGxvY2FsX3ZhcnMgPDwgIiAgIiA8PCBkZWNsYXJlX2ZpZWxkKCZma2V5KSA8PCBlbmRsOwotICBsb2NhbF92YXJzIDw8ICIgICIgPDwgZGVjbGFyZV9maWVsZCgmZnZhbCkgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsIGlzX3hjZXB0aW9uLCAmZmtleSwgIiIsIGxvY2FsX3ZhcnMpOwotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsIGlzX3hjZXB0aW9uLCAmZnZhbCwgIiIsIGxvY2FsX3ZhcnMpOwotCi0gIGluZGVudF9pbXBsKG91dCkgPDwgcHJlZml4IDw8ICIuQWRkT3JTZXRWYWx1ZSggIiA8PCBrZXkgPDwgIiwgIiA8PCB2YWwgPDwgIik7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3RyZWFtJiBsb2NhbF92YXJzKSB7Ci0gIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOwotICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7Ci0gIGxvY2FsX3ZhcnMgPDwgIiAgIiA8PCBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCBpc194Y2VwdGlvbiwgJmZlbGVtLCAiIiwgbG9jYWxfdmFycyk7Ci0gIGluZGVudF9pbXBsKG91dCkgPDwgcHJlZml4IDw8ICIuQWRkKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3RyZWFtJiBsb2NhbF92YXJzKSB7Ci0gIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOwotICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwotICBsb2NhbF92YXJzIDw8ICIgICIgPDwgZGVjbGFyZV9maWVsZCgmZmVsZW0pIDw8IGVuZGw7Ci0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgaXNfeGNlcHRpb24sICZmZWxlbSwgIiIsIGxvY2FsX3ZhcnMpOwotICBpbmRlbnRfaW1wbChvdXQpIDw8IHByZWZpeCA8PCAiLkFkZCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3RyZWFtJiBsb2NhbF92YXJzKSB7Ci0gICh2b2lkKWxvY2FsX3ZhcnM7Ci0KLSAgdF90eXBlKiB0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOwotICB3aGlsZSAodHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgdHlwZSA9ICgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKTsKLSAgfQotCi0gIHN0cmluZyBuYW1lID0gcHJlZml4ICsgcHJvcF9uYW1lKHRmaWVsZCwgaXNfeGNlcHRpb24pOwotCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBuYW1lOwotICB9Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lLCBsb2NhbF92YXJzKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCBpc194Y2VwdGlvbiwgdHlwZSwgbmFtZSwgbG9jYWxfdmFycyk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7Ci0KLSAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJvcHJvdC4iOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0KLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgICAgaWYgKGFuc2lzdHJfYmluYXJ5XykgewotICAgICAgICAgICAgb3V0IDw8ICJXcml0ZUFuc2lTdHJpbmcoIjsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb3V0IDw8ICJXcml0ZUJpbmFyeSgiOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBvdXQgPDwgIldyaXRlU3RyaW5nKCI7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0IDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIG91dCA8PCAiV3JpdGVCb29sKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgb3V0IDw8ICJXcml0ZUJ5dGUoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIG91dCA8PCAiV3JpdGVJMTYoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIG91dCA8PCAiV3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIG91dCA8PCAiV3JpdGVJNjQoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIG91dCA8PCAiV3JpdGVEb3VibGUoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBEZWxwaGkgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBvdXQgPDwgIldyaXRlSTMyKEludGVnZXIoIiA8PCBuYW1lIDw8ICIpKTsiOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgJyVzJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgcHJlZml4LmNfc3RyKCksCi0gICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAotICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7Ci0gIH0KLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3N0cmVhbSYgbG9jYWxfdmFycykgewotICAodm9pZClsb2NhbF92YXJzOwotICAodm9pZCl0c3RydWN0OwotICBvdXQgPDwgaW5kZW50X2ltcGwoKSA8PCBwcmVmaXggPDwgIi5Xcml0ZShvcHJvdCk7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3RyZWFtJiBsb2NhbF92YXJzKSB7Ci0gIHN0cmluZyBvYmo7Ci0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBvYmogPSB0bXAoIm1hcCIpOwotICAgIGxvY2FsX3ZhcnMgPDwgIiAgIiA8PCBvYmogPDwgIiA6IElNYXA7IiA8PCBlbmRsOwotICAgIGluZGVudF9pbXBsKG91dCkgPDwgb2JqIDw8ICIgOj0gVE1hcEltcGwuQ3JlYXRlKCAiCi0gICAgICAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiwgIgotICAgICAgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIgPDwgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICA8PCAiLkNvdW50KTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCAib3Byb3QuV3JpdGVNYXBCZWdpbiggIiA8PCBvYmogPDwgIik7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIG9iaiA9IHRtcCgic2V0XyIpOwotICAgIGxvY2FsX3ZhcnMgPDwgIiAgIiA8PCBvYmogPDwgIiA6IElTZXQ7IiA8PCBlbmRsOwotICAgIGluZGVudF9pbXBsKG91dCkgPDwgb2JqIDw8ICIgOj0gVFNldEltcGwuQ3JlYXRlKCIKLSAgICAgICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PCBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgIDw8ICIuQ291bnQpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJvcHJvdC5Xcml0ZVNldEJlZ2luKCAiIDw8IG9iaiA8PCAiKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIG9iaiA9IHRtcCgibGlzdF8iKTsKLSAgICBsb2NhbF92YXJzIDw8ICIgICIgPDwgb2JqIDw8ICIgOiBJTGlzdDsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCBvYmogPDwgIiA6PSBUTGlzdEltcGwuQ3JlYXRlKCIKLSAgICAgICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICA8PCAiLkNvdW50KTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCAib3Byb3QuV3JpdGVMaXN0QmVnaW4oICIgPDwgb2JqIDw8ICIpOyIgPDwgZW5kbDsKLSAgfQotCi0gIHN0cmluZyBpdGVyID0gdG1wKCJfaXRlciIpOwotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgbG9jYWxfdmFycyA8PCAiICAiIDw8IGl0ZXIgPDwgIjogIiA8PCB0eXBlX25hbWUoKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCAiZm9yICIgPDwgaXRlciA8PCAiIGluICIgPDwgcHJlZml4IDw8ICIuS2V5cyBkbyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXBfaW1wbCgpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGxvY2FsX3ZhcnMgPDwgIiAgIiA8PCBpdGVyIDw8ICI6ICIgPDwgdHlwZV9uYW1lKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiOyIKLSAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCAiZm9yICIgPDwgaXRlciA8PCAiIGluICIgPDwgcHJlZml4IDw8ICIgZG8iIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCAiYmVnaW4iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwX2ltcGwoKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgbG9jYWxfdmFycyA8PCAiICAiIDw8IGl0ZXIgPDwgIjogIiA8PCB0eXBlX25hbWUoKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiOyIKLSAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCAiZm9yICIgPDwgaXRlciA8PCAiIGluICIgPDwgcHJlZml4IDw8ICIgZG8iIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCAiYmVnaW4iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwX2ltcGwoKTsKLSAgfQotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCBpc194Y2VwdGlvbiwgKHRfbWFwKil0dHlwZSwgaXRlciwgcHJlZml4LCBsb2NhbF92YXJzKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCBpc194Y2VwdGlvbiwgKHRfc2V0Kil0dHlwZSwgaXRlciwgbG9jYWxfdmFycyk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCBpc194Y2VwdGlvbiwgKHRfbGlzdCopdHR5cGUsIGl0ZXIsIGxvY2FsX3ZhcnMpOwotICB9Ci0KLSAgaW5kZW50X2Rvd25faW1wbCgpOwotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJvcHJvdC5Xcml0ZU1hcEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJvcHJvdC5Xcml0ZVNldEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCAib3Byb3QuV3JpdGVMaXN0RW5kKCk7IiA8PCBlbmRsOwotICB9Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0mIGxvY2FsX3ZhcnMpIHsKLSAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCBpc194Y2VwdGlvbiwgJmtmaWVsZCwgIiIsIGxvY2FsX3ZhcnMpOwotICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgbWFwICsgIlsiICsgaXRlciArICJdIik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsIGlzX3hjZXB0aW9uLCAmdmZpZWxkLCAiIiwgbG9jYWxfdmFycyk7Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0mIGxvY2FsX3ZhcnMpIHsKLSAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgaXNfeGNlcHRpb24sICZlZmllbGQsICIiLCBsb2NhbF92YXJzKTsKLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0mIGxvY2FsX3ZhcnMpIHsKLSAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsIGlzX3hjZXB0aW9uLCAmZWZpZWxkLCAiIiwgbG9jYWxfdmFycyk7Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9wZXJ0eShvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNQdWJsaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbikgewotICBnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHkob3V0LCBpc194Y2VwdGlvbiwgdGZpZWxkLCBpc1B1YmxpYywgIkdldCIpOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5KG9zdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdHJ1Y3RfaXNfeGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1B1YmxpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRQcmVmaXgpIHsKLSAgKHZvaWQpaXNQdWJsaWM7Ci0KLSAgdF90eXBlKiBmdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKLSAgYm9vbCBpc194Y2VwdGlvbiA9IGZ0eXBlLT5pc194Y2VwdGlvbigpOwotICBnZW5lcmF0ZV9kZWxwaGlfZG9jKG91dCwgdGZpZWxkKTsKLSAgaW5kZW50KG91dCkgPDwgInByb3BlcnR5ICIgPDwgcHJvcF9uYW1lKHRmaWVsZCwgc3RydWN0X2lzX3hjZXB0aW9uKSA8PCAiOiAiCi0gICAgICAgICAgICAgIDw8IHR5cGVfbmFtZShmdHlwZSwgZmFsc2UsIHRydWUsIGlzX3hjZXB0aW9uLCB0cnVlKSA8PCAiIHJlYWQgIgotICAgICAgICAgICAgICA8PCBmaWVsZFByZWZpeCArIHByb3BfbmFtZSh0ZmllbGQsIHN0cnVjdF9pc194Y2VwdGlvbikgPDwgIiB3cml0ZSBTZXQiCi0gICAgICAgICAgICAgIDw8IHByb3BfbmFtZSh0ZmllbGQsIHN0cnVjdF9pc194Y2VwdGlvbikgPDwgIjsiIDw8IGVuZGw7Ci19Ci0KLXN0ZDo6c3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6cHJvcF9uYW1lKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpc194Y2VwdGlvbikgewotICByZXR1cm4gcHJvcF9uYW1lKHRmaWVsZC0+Z2V0X25hbWUoKSwgaXNfeGNlcHRpb24pOwotfQotCi1zdGQ6OnN0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6OnByb3BfbmFtZShzdHJpbmcgbmFtZSwgYm9vbCBpc194Y2VwdGlvbikgewotICBzdHJpbmcgcmV0ID0gbmFtZTsKLSAgcmV0WzBdID0gdG91cHBlcihyZXRbMF0pOwotICByZXR1cm4gbm9ybWFsaXplX25hbWUocmV0LCB0cnVlLCBpc194Y2VwdGlvbik7Ci19Ci0KLXN0ZDo6c3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6Y29uc3RydWN0b3JfcGFyYW1fbmFtZShzdHJpbmcgbmFtZSkgewotICBzdHJpbmcgcmV0ID0gbmFtZTsKLSAgcmV0WzBdID0gdG91cHBlcihyZXRbMF0pOwotICByZXQgPSAiQSIgKyByZXQ7Ci0gIHJldHVybiBub3JtYWxpemVfbmFtZShyZXQsIGZhbHNlLCBmYWxzZSk7Ci19Ci0KLXN0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6Om5vcm1hbGl6ZV9jbHNubShzdHJpbmcgY2xzbm0sIHN0cmluZyBwcmVmaXgsIGJvb2wgYl9ub19jaGVja19rZXl3b3JkKSB7Ci0gIGlmIChjbHNubS5zaXplKCkgPiAwKSB7Ci0gICAgY2xzbm1bMF0gPSB0b3VwcGVyKGNsc25tWzBdKTsKLSAgfQotICBpZiAoYl9ub19jaGVja19rZXl3b3JkKSB7Ci0gICAgcmV0dXJuIHByZWZpeCArIGNsc25tOwotICB9IGVsc2UgewotICAgIHJldHVybiBub3JtYWxpemVfbmFtZShwcmVmaXggKyBjbHNubSk7Ci0gIH0KLX0KLQotc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiX2NscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJfbm9fcG9zdGZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJfZXhjZXB0aW9uX2ZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiX2Z1bGxfZXhjZXB0aW9uX2ZhY3RvcnkpIHsKLQotICBpZiAodHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgIHRfdHlwZWRlZiogdGRlZiA9ICh0X3R5cGVkZWYqKXR0eXBlOwotICAgIGlmICh0ZGVmLT5pc19mb3J3YXJkX3R5cGVkZWYoKSkgeyAvLyBmb3J3YXJkIHR5cGVzIGFjY29yZGluZyB0byBUSFJJRlQtMjQyMQotICAgICAgaWYgKHRkZWYtPmdldF90eXBlKCkgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gdHlwZV9uYW1lKHRkZWYtPmdldF90eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgYl9jbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYl9ub19wb3N0Zml4LAotICAgICAgICAgICAgICAgICAgICAgICAgIGJfZXhjZXB0aW9uX2ZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgYl9mdWxsX2V4Y2VwdGlvbl9mYWN0b3J5KTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRocm93ICJ1bnJlc29sdmVkIGZvcndhcmQgZGVjbGFyYXRpb246ICIgKyB0ZGVmLT5nZXRfc3ltYm9saWMoKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIG5vcm1hbGl6ZV9uYW1lKCJUIiArIHRkZWYtPmdldF9zeW1ib2xpYygpKTsKLSAgICB9Ci0gIH0KLQotICBzdHJpbmcgdHlwX25tOwotCi0gIHN0cmluZyBzX2ZhY3Rvcnk7Ci0KLSAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHJldHVybiBiYXNlX3R5cGVfbmFtZSgodF9iYXNlX3R5cGUqKXR0eXBlKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgYl9jbHMgPSB0cnVlOwotICAgIGJfbm9fcG9zdGZpeCA9IHRydWU7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgdF9tYXAqIHRtYXAgPSAodF9tYXAqKXR0eXBlOwotICAgIGlmIChiX2NscykgewotICAgICAgdHlwX25tID0gIlRUaHJpZnREaWN0aW9uYXJ5SW1wbCI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHR5cF9ubSA9ICJJVGhyaWZ0RGljdGlvbmFyeSI7Ci0gICAgfQotICAgIHJldHVybiB0eXBfbm0gKyAiPCIgKyB0eXBlX25hbWUodG1hcC0+Z2V0X2tleV90eXBlKCkpICsgIiwgIiArIHR5cGVfbmFtZSh0bWFwLT5nZXRfdmFsX3R5cGUoKSkKLSAgICAgICAgICAgKyAiPiI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgdF9zZXQqIHRzZXQgPSAodF9zZXQqKXR0eXBlOwotICAgIGlmIChiX2NscykgewotICAgICAgdHlwX25tID0gIlRIYXNoU2V0SW1wbCI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHR5cF9ubSA9ICJJSGFzaFNldCI7Ci0gICAgfQotICAgIHJldHVybiB0eXBfbm0gKyAiPCIgKyB0eXBlX25hbWUodHNldC0+Z2V0X2VsZW1fdHlwZSgpKSArICI+IjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgdF9saXN0KiB0bGlzdCA9ICh0X2xpc3QqKXR0eXBlOwotICAgIGlmIChiX2NscykgewotICAgICAgdHlwX25tID0gIlRUaHJpZnRMaXN0SW1wbCI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHR5cF9ubSA9ICJJVGhyaWZ0TGlzdCI7Ci0gICAgfQotICAgIHJldHVybiB0eXBfbm0gKyAiPCIgKyB0eXBlX25hbWUodGxpc3QtPmdldF9lbGVtX3R5cGUoKSkgKyAiPiI7Ci0gIH0KLQotICBzdHJpbmcgdHlwZV9wcmVmaXg7Ci0KLSAgaWYgKGJfY2xzKSB7Ci0gICAgdHlwZV9wcmVmaXggPSAiVCI7Ci0gIH0gZWxzZSB7Ci0gICAgdHlwZV9wcmVmaXggPSAiSSI7Ci0gIH0KLQotICBzdHJpbmcgbm0gPSBub3JtYWxpemVfY2xzbm0odHR5cGUtPmdldF9uYW1lKCksIHR5cGVfcHJlZml4KTsKLQotICBpZiAoYl9leGNlcHRpb25fZmFjdG9yeSkgewotICAgIG5tID0gbm0gKyAiRmFjdG9yeSI7Ci0gIH0KLQotICBpZiAoYl9jbHMpIHsKLSAgICBpZiAoIWJfbm9fcG9zdGZpeCkgewotICAgICAgbm0gPSBubSArICJJbXBsIjsKLSAgICB9Ci0gIH0KLQotICBpZiAoYl9leGNlcHRpb25fZmFjdG9yeSAmJiBiX2Z1bGxfZXhjZXB0aW9uX2ZhY3RvcnkpIHsKLSAgICByZXR1cm4gdHlwZV9uYW1lKHR0eXBlLCB0cnVlLCB0cnVlLCBmYWxzZSwgZmFsc2UpICsgIi4iICsgbm07Ci0gIH0KLQotICByZXR1cm4gbm07Ci19Ci0KLS8vIHJldHVybnMgImNvbnN0ICIgZm9yIHNvbWUgYXJndW1lbnQgdHlwZXMKLXN0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6OmlucHV0X2FyZ19wcmVmaXgodF90eXBlKiB0dHlwZSkgewotCi0gIC8vIGJhc2UgdHlwZXMKLSAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHN3aXRjaCAoKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpKSB7Ci0KLSAgICAvLyB0aGVzZSBzaG91bGQgYmUgY29uc3QnZWQgZm9yIG9wdGltYWwgcGVyZm9ybWFtY2UKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzogLy8gcmVmY291bnRlZCBwb2ludGVyCi0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6ICAgIC8vIGxhcmdlciB0aGFuIDMyIGJpdAotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOiAvLyBsYXJnZXIgdGhhbiAzMiBiaXQKLSAgICAgIHJldHVybiAiY29uc3QgIjsKLQotICAgIC8vIGFsbCBvdGhlcnMgZG9uJ3QgbmVlZCB0byBiZQotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgcmV0dXJuICIiOwotCi0gICAgLy8gd2UgYmV0dGVyIGFsd2F5cyByZXBvcnQgYW55IHVua25vd24gdHlwZXMKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBpbnB1dF9hcmdfcHJlZml4KCkgZm9yIGJhc2UgdHlwZSAiCi0gICAgICAgICAgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUoKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpKTsKLSAgICB9Ci0KLSAgICAvLyBlbnVtcwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIiI7IC8vIHVzdWFsbHkgPD0gMzIgYml0Ci0KLSAgICAvLyBjb250YWluZXJzCi0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICJjb25zdCAiOyAvLyByZWZjb3VudGVkIHBvaW50ZXIKLQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiY29uc3QgIjsgLy8gcmVmY291bnRlZCBwb2ludGVyCi0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJjb25zdCAiOyAvLyByZWZjb3VudGVkIHBvaW50ZXIKLSAgfQotCi0gIC8vIGFueSBvdGhlciB0eXBlLCBlaXRoZXIgVFNvbWV0aGluZyBvciBJU29tZXRoaW5nCi0gIHJldHVybiAiY29uc3QgIjsgLy8gcG9zc2libHkgcmVmY291bnRlZCBwb2ludGVyCi19Ci0KLXN0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6OmJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0YmFzZSkgewotICBzd2l0Y2ggKHRiYXNlLT5nZXRfYmFzZSgpKSB7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAvLyBubyAidm9pZCIgaW4gRGVscGhpIGxhbmd1YWdlCi0gICAgcmV0dXJuICIiOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICBpZiAodGJhc2UtPmlzX2JpbmFyeSgpKSB7Ci0gICAgICBpZiAoYW5zaXN0cl9iaW5hcnlfKSB7Ci0gICAgICAgIHJldHVybiAiQW5zaVN0cmluZyI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gIlRCeXRlcyI7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAic3RyaW5nIjsKLSAgICB9Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICByZXR1cm4gIkJvb2xlYW4iOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgcmV0dXJuICJTaG9ydEludCI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIHJldHVybiAiU21hbGxJbnQiOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICByZXR1cm4gIkludGVnZXIiOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICByZXR1cm4gIkludDY0IjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgcmV0dXJuICJEb3VibGUiOwotICBkZWZhdWx0OgotICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gRGVscGhpIG5hbWUgZm9yIGJhc2UgdHlwZSAiCi0gICAgICAgICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlLT5nZXRfYmFzZSgpKTsKLSAgfQotfQotCi1zdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjpkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbml0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb25fY2xhc3MpIHsKLSAgKHZvaWQpaW5pdDsKLQotICB0X3R5cGUqIGZ0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOwotICBib29sIGlzX3hjZXB0aW9uID0gZnR5cGUtPmlzX3hjZXB0aW9uKCk7Ci0KLSAgc3RyaW5nIHJlc3VsdCA9IHByZWZpeCArIHByb3BfbmFtZSh0ZmllbGQsIGlzX3hjZXB0aW9uX2NsYXNzKSArICI6ICIKLSAgICAgICAgICAgICAgICAgICsgdHlwZV9uYW1lKGZ0eXBlLCBmYWxzZSwgdHJ1ZSwgaXNfeGNlcHRpb24sIHRydWUpICsgIjsiOwotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZ1bGxfY2xzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24pIHsKLSAgdF90eXBlKiB0dHlwZSA9IHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKLSAgc3RyaW5nIHByZWZpeDsKLSAgaWYgKGZ1bGxfY2xzID09ICIiKSB7Ci0gICAgcHJlZml4ID0gIiI7Ci0gIH0gZWxzZSB7Ci0gICAgcHJlZml4ID0gZnVsbF9jbHMgKyAiLiI7Ci0gIH0KLSAgaWYgKGlzX3ZvaWQodHR5cGUpKSB7Ci0gICAgcmV0dXJuICJwcm9jZWR1cmUgIiArIHByZWZpeCArIG5vcm1hbGl6ZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSwgdHJ1ZSwgaXNfeGNlcHRpb24pICsgIigiCi0gICAgICAgICAgICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpICsgIik7IjsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gImZ1bmN0aW9uICIgKyBwcmVmaXggKyBub3JtYWxpemVfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCksIHRydWUsIGlzX3hjZXB0aW9uKSArICIoIgotICAgICAgICAgICArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSArICIpOiAiCi0gICAgICAgICAgICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSwgaXNfeGNlcHRpb24sIHRydWUpICsgIjsiOwotICB9Ci19Ci0KLXN0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICB0X3R5cGUqIHR0OwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgKz0gIjsgIjsKLSAgICB9Ci0KLSAgICB0dCA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICByZXN1bHQgKz0gaW5wdXRfYXJnX3ByZWZpeCh0dCk7IC8vIGNvbnN0PwotICAgIHJlc3VsdCArPSBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpICsgIjogIgotICAgICAgICAgICAgICArIHR5cGVfbmFtZSh0dCwgZmFsc2UsIHRydWUsIHR0LT5pc194Y2VwdGlvbigpLCB0cnVlKTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjpjb25zdHJ1Y3Rvcl9hcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgY3VycmVudF9pbmRlbnQpIHsKLSAgb3N0cmluZ3N0cmVhbSByZXN1bHQ7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIHRfdHlwZSogdHQ7Ci0gIHN0cmluZyBsaW5lID0gIiI7Ci0gIHN0cmluZyBuZXdsaW5lX2luZGVudCA9IGN1cnJlbnRfaW5kZW50ICsgIiAgIjsKLQotICBib29sIGZpcnN0bGluZSA9IHRydWU7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGxpbmUgKz0gIjsiOwotICAgIH0KLQotICAgIGlmIChsaW5lLnNpemUoKSA+IDgwKSB7Ci0gICAgICBpZiAoZmlyc3RsaW5lKSB7Ci0gICAgICAgIHJlc3VsdCA8PCBlbmRsIDw8IG5ld2xpbmVfaW5kZW50OwotICAgICAgICBmaXJzdGxpbmUgPSBmYWxzZTsKLSAgICAgIH0KLSAgICAgIHJlc3VsdCA8PCBsaW5lIDw8IGVuZGw7Ci0gICAgICBsaW5lID0gbmV3bGluZV9pbmRlbnQ7Ci0gICAgfSBlbHNlIGlmIChsaW5lLnNpemUoKSA+IDApIHsKLSAgICAgIGxpbmUgKz0gIiAiOwotICAgIH0KLQotICAgIHR0ID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgIGxpbmUgKz0gaW5wdXRfYXJnX3ByZWZpeCh0dCk7IC8vIGNvbnN0PwotICAgIGxpbmUgKz0gY29uc3RydWN0b3JfcGFyYW1fbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpICsgIjogIgotICAgICAgICAgICAgKyB0eXBlX25hbWUodHQsIGZhbHNlLCB0cnVlLCB0dC0+aXNfeGNlcHRpb24oKSwgdHJ1ZSk7Ci0gIH0KLQotICBpZiAobGluZS5zaXplKCkgPiAwKSB7Ci0gICAgcmVzdWx0IDw8IGxpbmU7Ci0gIH0KLQotICBzdHJpbmcgcmVzdWx0X3N0cjsKLQotICBpZiAoZmlyc3RsaW5lKSB7Ci0gICAgcmVzdWx0X3N0ciA9ICIgIiArIHJlc3VsdC5zdHIoKTsKLSAgfSBlbHNlIHsKLSAgICByZXN1bHRfc3RyID0gcmVzdWx0LnN0cigpOwotICB9Ci0KLSAgcmV0dXJuIHJlc3VsdF9zdHI7Ci19Ci0KLXN0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKLSAgd2hpbGUgKHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgIHR5cGUgPSAoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCk7Ci0gIH0KLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJldHVybiAiVFR5cGUuU3RyaW5nXyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJUVHlwZS5Cb29sXyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJUVHlwZS5CeXRlXyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gIlRUeXBlLkkxNiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gIlRUeXBlLkkzMiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gIlRUeXBlLkk2NCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gIlRUeXBlLkRvdWJsZV8iOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLkkzMiI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiVFR5cGUuU3RydWN0IjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiVFR5cGUuTWFwIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiVFR5cGUuU2V0XyI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5MaXN0IjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6ZW1wdHlfdmFsdWUodF90eXBlKiB0eXBlKSB7Ci0gIHdoaWxlICh0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICB0eXBlID0gKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpOwotICB9Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICByZXR1cm4gIjAiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgICBpZiAoYW5zaXN0cl9iaW5hcnlfKSB7Ci0gICAgICAgICAgcmV0dXJuICInJyI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcmV0dXJuICJuaWwiOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gIicnIjsKLSAgICAgIH0KLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gIkZhbHNlIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gIjAiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICIwLjAiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIlQiICsgdHlwZS0+Z2V0X25hbWUoKSArICIoMCkiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIm5pbCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIm5pbCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIm5pbCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJuaWwiOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5X3dyaXRlcl9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uX2NsYXNzKSB7Ci0gIHRfdHlwZSogZnR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7Ci0gIGJvb2wgaXNfeGNlcHRpb24gPSBmdHlwZS0+aXNfeGNlcHRpb24oKTsKLQotICBpbmRlbnQob3V0KSA8PCAicHJvY2VkdXJlIFNldCIgPDwgcHJvcF9uYW1lKHRmaWVsZCwgaXNfeGNlcHRpb25fY2xhc3MpCi0gICAgICAgICAgICAgIDw8ICIoIGNvbnN0IFZhbHVlOiAiIDw8IHR5cGVfbmFtZShmdHlwZSwgZmFsc2UsIHRydWUsIGlzX3hjZXB0aW9uLCB0cnVlKSA8PCAiKTsiCi0gICAgICAgICAgICAgIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHlfcmVhZGVyX2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb25fY2xhc3MpIHsKLSAgdF90eXBlKiBmdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKLSAgYm9vbCBpc194Y2VwdGlvbiA9IGZ0eXBlLT5pc194Y2VwdGlvbigpOwotCi0gIGluZGVudChvdXQpIDw8ICJmdW5jdGlvbiBHZXQiIDw8IHByb3BfbmFtZSh0ZmllbGQsIGlzX3hjZXB0aW9uX2NsYXNzKSA8PCAiOiAiCi0gICAgICAgICAgICAgIDw8IHR5cGVfbmFtZShmdHlwZSwgZmFsc2UsIHRydWUsIGlzX3hjZXB0aW9uLCB0cnVlKSA8PCAiOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9pc3NldF9yZWFkZXJfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbikgewotICBpbmRlbnQob3V0KSA8PCAiZnVuY3Rpb24gR2V0X19pc3NldF8iIDw8IHByb3BfbmFtZSh0ZmllbGQsIGlzX3hjZXB0aW9uKSA8PCAiOiBCb29sZWFuOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9jbGVhcl91bmlvbl92YWx1ZShvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNsc19wcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWVsZFByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbl9jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc191bmlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbl9mYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB4Y2VwdGlvbl9mYWN0b3J5X25hbWUpIHsKLSAgKHZvaWQpY2xzX3ByZWZpeDsKLSAgKHZvaWQpbmFtZTsKLSAgKHZvaWQpdHlwZTsKLSAgKHZvaWQpaXNfdW5pb247Ci0gICh2b2lkKWlzX3hjZXB0aW9uX2ZhY3Rvcnk7Ci0gICh2b2lkKXhjZXB0aW9uX2ZhY3RvcnlfbmFtZTsKLQotICB0X3R5cGUqIGZ0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOwotICBib29sIGlzX3hjZXB0aW9uID0gZnR5cGUtPmlzX3hjZXB0aW9uKCk7Ci0KLSAgaW5kZW50X2ltcGwob3V0KSA8PCAiaWYgRl9faXNzZXRfIiA8PCBwcm9wX25hbWUodGZpZWxkLCBpc194Y2VwdGlvbl9jbGFzcykgPDwgIiB0aGVuIGJlZ2luIgotICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gIGluZGVudF91cF9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKG91dCkgPDwgIkZfX2lzc2V0XyIgPDwgcHJvcF9uYW1lKHRmaWVsZCwgaXNfeGNlcHRpb25fY2xhc3MpIDw8ICIgOj0gRmFsc2U7IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChvdXQpIDw8IGZpZWxkUHJlZml4IDw8IHByb3BfbmFtZSh0ZmllbGQsIGlzX3hjZXB0aW9uX2NsYXNzKSA8PCAiIDo9ICIKLSAgICAgICAgICAgICAgICAgICA8PCAiRGVmYXVsdCggIiA8PCB0eXBlX25hbWUoZnR5cGUsIGZhbHNlLCB0cnVlLCBpc194Y2VwdGlvbiwgdHJ1ZSkgPDwgIik7IgotICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9wcm9wZXJ0eV93cml0ZXJfaW1wbChvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNsc19wcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWVsZFByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbl9jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc191bmlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbl9mYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB4Y2VwdGlvbl9mYWN0cm95X25hbWUpIHsKLSAgKHZvaWQpdHlwZTsKLQotICB0X3R5cGUqIGZ0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOwotICBib29sIGlzX3hjZXB0aW9uID0gZnR5cGUtPmlzX3hjZXB0aW9uKCk7Ci0KLSAgaW5kZW50X2ltcGwob3V0KSA8PCAicHJvY2VkdXJlICIgPDwgY2xzX3ByZWZpeCA8PCBuYW1lIDw8ICIuIgotICAgICAgICAgICAgICAgICAgIDw8ICJTZXQiIDw8IHByb3BfbmFtZSh0ZmllbGQsIGlzX3hjZXB0aW9uX2NsYXNzKQotICAgICAgICAgICAgICAgICAgIDw8ICIoIGNvbnN0IFZhbHVlOiAiIDw8IHR5cGVfbmFtZShmdHlwZSwgZmFsc2UsIHRydWUsIGlzX3hjZXB0aW9uLCB0cnVlKSA8PCAiKTsiCi0gICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwob3V0KSA8PCAiYmVnaW4iIDw8IGVuZGw7Ci0gIGluZGVudF91cF9pbXBsKCk7Ci0gIGlmIChpc191bmlvbikgewotICAgIGluZGVudF9pbXBsKG91dCkgPDwgIkNsZWFyVW5pb25WYWx1ZXM7IiA8PCBlbmRsOwotICB9Ci0gIGlmICh0ZmllbGQtPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCAiRl9faXNzZXRfIiA8PCBwcm9wX25hbWUodGZpZWxkLCBpc194Y2VwdGlvbl9jbGFzcykgPDwgIiA6PSBUcnVlOyIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfaW1wbChvdXQpIDw8IGZpZWxkUHJlZml4IDw8IHByb3BfbmFtZSh0ZmllbGQsIGlzX3hjZXB0aW9uX2NsYXNzKSA8PCAiIDo9IFZhbHVlOyIgPDwgZW5kbDsKLQotICBpZiAoaXNfeGNlcHRpb25fY2xhc3MgJiYgKCFpc194Y2VwdGlvbl9mYWN0b3J5KSkgewotICAgIGluZGVudF9pbXBsKG91dCkgPDwgIkYiIDw8IHhjZXB0aW9uX2ZhY3Ryb3lfbmFtZSA8PCAiLiIgPDwgcHJvcF9uYW1lKHRmaWVsZCwgaXNfeGNlcHRpb25fY2xhc3MpCi0gICAgICAgICAgICAgICAgICAgICA8PCAiIDo9IFZhbHVlOyIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudF9kb3duX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5X3JlYWRlcl9pbXBsKG9zdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkUHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uX2NsYXNzKSB7Ci0gICh2b2lkKXR5cGU7Ci0KLSAgdF90eXBlKiBmdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKLSAgYm9vbCBpc194Y2VwdGlvbiA9IGZ0eXBlLT5pc194Y2VwdGlvbigpOwotCi0gIGluZGVudF9pbXBsKG91dCkgPDwgImZ1bmN0aW9uICIgPDwgY2xzX3ByZWZpeCA8PCBuYW1lIDw8ICIuIgotICAgICAgICAgICAgICAgICAgIDw8ICJHZXQiIDw8IHByb3BfbmFtZSh0ZmllbGQsIGlzX3hjZXB0aW9uX2NsYXNzKSA8PCAiOiAiCi0gICAgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKGZ0eXBlLCBmYWxzZSwgdHJ1ZSwgaXNfeGNlcHRpb24sIHRydWUpIDw8ICI7IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwob3V0KSA8PCAiUmVzdWx0IDo9ICIgPDwgZmllbGRQcmVmaXggPDwgcHJvcF9uYW1lKHRmaWVsZCwgaXNfeGNlcHRpb25fY2xhc3MpIDw8ICI7IgotICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX2lzc2V0X3JlYWRlcl9pbXBsKG9zdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkUHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uKSB7Ci0gICh2b2lkKXR5cGU7Ci0KLSAgc3RyaW5nIGlzc2V0X25hbWUgPSAiX19pc3NldF8iICsgcHJvcF9uYW1lKHRmaWVsZCwgaXNfeGNlcHRpb24pOwotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJmdW5jdGlvbiAiIDw8IGNsc19wcmVmaXggPDwgbmFtZSA8PCAiLiIKLSAgICAgICAgICAgICAgICAgICA8PCAiR2V0IiA8PCBpc3NldF9uYW1lIDw8ICI6IEJvb2xlYW47IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwob3V0KSA8PCAiUmVzdWx0IDo9ICIgPDwgZmllbGRQcmVmaXggPDwgaXNzZXRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd25faW1wbCgpOwotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfY3JlYXRlX2V4Y2VwdGlvbl9pbXBsKG9zdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjbHNfcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgewotICAodm9pZCljbHNfcHJlZml4OwotCi0gIHN0cmluZyBleGNlcHRpb25fY2xzX25tID0gdHlwZV9uYW1lKHRzdHJ1Y3QsIHRydWUsIHRydWUpOwotICBzdHJpbmcgY2xzX25tID0gdHlwZV9uYW1lKHRzdHJ1Y3QsIHRydWUsIGZhbHNlLCBpc19leGNlcHRpb24sIGlzX2V4Y2VwdGlvbik7Ci0KLSAgaW5kZW50X2ltcGwob3V0KSA8PCAiZnVuY3Rpb24gIiA8PCBjbHNfbm0gPDwgIi5DcmVhdGVFeGNlcHRpb246ICIgPDwgZXhjZXB0aW9uX2Nsc19ubSA8PCAiOyIKLSAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwotCi0gIGluZGVudF9pbXBsKG91dCkgPDwgImJlZ2luIiA8PCBlbmRsOwotICBpbmRlbnRfdXBfaW1wbCgpOwotCi0gIGluZGVudF9pbXBsKG91dCkgPDwgIlJlc3VsdCA6PSAiIDw8IGV4Y2VwdGlvbl9jbHNfbm0gPDwgIi5DcmVhdGU7IiA8PCBlbmRsOwotICBzdHJpbmcgZmFjdG9yeV9uYW1lID0gbm9ybWFsaXplX2Nsc25tKHRzdHJ1Y3QtPmdldF9uYW1lKCksICIiLCB0cnVlKSArICJGYWN0b3J5IjsKLSAgaW5kZW50X2ltcGwob3V0KSA8PCAiUmVzdWx0LiIgPDwgZmFjdG9yeV9uYW1lIDw8ICIgOj0gU2VsZjsiIDw8IGVuZGw7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIHN0cmluZyBwcm9wbmFtZTsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHByb3BuYW1lID0gcHJvcF9uYW1lKCpmX2l0ZXIsIGlzX2V4Y2VwdGlvbik7Ci0gICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICAgIGluZGVudF9pbXBsKG91dCkgPDwgImlmIF9faXNzZXRfIiA8PCBwcm9wbmFtZSA8PCAiIHRoZW4iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cF9pbXBsKCk7Ci0gICAgfQotICAgIGluZGVudF9pbXBsKG91dCkgPDwgIlJlc3VsdC4iIDw8IHByb3BuYW1lIDw8ICIgOj0gIiA8PCBwcm9wbmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgaW5kZW50X2Rvd25faW1wbCgpOwotICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJSZXN1bHQuVXBkYXRlTWVzc2FnZVByb3BlcnR5OyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKG91dCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfcmVhZGVyX2ltcGwob3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNsc19wcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0KLSAgb3N0cmluZ3N0cmVhbSBsb2NhbF92YXJzOwotICBvc3RyaW5nc3RyZWFtIGNvZGVfYmxvY2s7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwX2ltcGwoKTsKLQotICBpbmRlbnRfaW1wbChsb2NhbF92YXJzKSA8PCAidHJhY2tlciA6IElQcm90b2NvbFJlY3Vyc2lvblRyYWNrZXI7IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAidHJhY2tlciA6PSBpcHJvdC5OZXh0UmVjdXJzaW9uTGV2ZWw7IiA8PCBlbmRsOwotCi0gIC8vIGxvY2FsIGJvb2xzIGZvciByZXF1aXJlZCBmaWVsZHMKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgaW5kZW50X2ltcGwobG9jYWxfdmFycykgPDwgIl9yZXFfaXNzZXRfIiA8PCBwcm9wX25hbWUoKmZfaXRlciwgaXNfZXhjZXB0aW9uKSA8PCAiIDogQm9vbGVhbjsiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIl9yZXFfaXNzZXRfIiA8PCBwcm9wX25hbWUoKmZfaXRlciwgaXNfZXhjZXB0aW9uKSA8PCAiIDo9IEZBTFNFOyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgInN0cnVjIDo9IGlwcm90LlJlYWRTdHJ1Y3RCZWdpbjsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgInRyeSIgPDwgZW5kbDsKLSAgaW5kZW50X3VwX2ltcGwoKTsKLQotICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAid2hpbGUgKHRydWUpIGRvIiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiYmVnaW4iIDw8IGVuZGw7Ci0gIGluZGVudF91cF9pbXBsKCk7Ci0KLSAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImZpZWxkXyA6PSBpcHJvdC5SZWFkRmllbGRCZWdpbigpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiaWYgKGZpZWxkXy5UeXBlXyA9IFRUeXBlLlN0b3ApIHRoZW4iIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIkJyZWFrOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd25faW1wbCgpOwotICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZW5kOyIgPDwgZW5kbDsKLQotICBib29sIGZpcnN0ID0gdHJ1ZTsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotCi0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiY2FzZSBmaWVsZF8uSUQgb2YiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXBfaW1wbCgpOwotICAgIH0KLQotICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgaWYgKGZfaXRlciAhPSBmaWVsZHMuYmVnaW4oKSkgewotICAgICAgY29kZV9ibG9jayA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjogYmVnaW4iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwX2ltcGwoKTsKLSAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiaWYgKGZpZWxkXy5UeXBlXyA9ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKSB0aGVuIiA8PCBlbmRsOwotICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXBfaW1wbCgpOwotCi0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoY29kZV9ibG9jaywgaXNfZXhjZXB0aW9uLCAqZl9pdGVyLCAiIiwgbG9jYWxfdmFycyk7Ci0KLSAgICAvLyByZXF1aXJlZCBmaWVsZD8KLSAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIl9yZXFfaXNzZXRfIiA8PCBwcm9wX25hbWUoKmZfaXRlciwgaXNfZXhjZXB0aW9uKSA8PCAiIDo9IFRSVUU7IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0KLSAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZW5kIGVsc2UiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImJlZ2luIiA8PCBlbmRsOwotICAgIGluZGVudF91cF9pbXBsKCk7Ci0gICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIlRQcm90b2NvbFV0aWwuU2tpcChpcHJvdCwgZmllbGRfLlR5cGVfKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd25faW1wbCgpOwotICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJlbmQ7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duX2ltcGwoKTsKLSAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZW5kIjsKLSAgfQotCi0gIGlmICghZmlyc3QpIHsKLSAgICBjb2RlX2Jsb2NrIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImVsc2UgYmVnaW4iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwX2ltcGwoKTsKLSAgfQotCi0gIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJUUHJvdG9jb2xVdGlsLlNraXAoaXByb3QsIGZpZWxkXy5UeXBlXyk7IiA8PCBlbmRsOwotCi0gIGlmICghZmlyc3QpIHsKLSAgICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImVuZDsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd25faW1wbCgpOwotICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJlbmQ7IiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImlwcm90LlJlYWRGaWVsZEVuZDsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd25faW1wbCgpOwotCi0gIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJlbmQ7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0KLSAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImZpbmFsbHkiIDw8IGVuZGw7Ci0gIGluZGVudF91cF9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJpcHJvdC5SZWFkU3RydWN0RW5kOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd25faW1wbCgpOwotICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZW5kOyIgPDwgZW5kbDsKLQotICAvLyBhbGwgcmVxdWlyZWQgZmllbGRzIGhhdmUgYmVlbiByZWFkPwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiaWYgbm90IF9yZXFfaXNzZXRfIiA8PCBwcm9wX25hbWUoKmZfaXRlciwgaXNfZXhjZXB0aW9uKSA8PCBlbmRsOwotICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykKLSAgICAgICAgICA8PCAidGhlbiByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24uQ3JlYXRlKCBUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAnIgotICAgICAgICAgIDw8IHByb3BfbmFtZSgqZl9pdGVyLCBpc19leGNlcHRpb24pIDw8ICInKTsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50X2Rvd25faW1wbCgpOwotICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIHN0cmluZyBjbHNfbm07Ci0KLSAgY2xzX25tID0gdHlwZV9uYW1lKHRzdHJ1Y3QsIHRydWUsIGZhbHNlLCBpc19leGNlcHRpb24sIGlzX2V4Y2VwdGlvbik7Ci0KLSAgaW5kZW50X2ltcGwob3V0KSA8PCAicHJvY2VkdXJlICIgPDwgY2xzX3ByZWZpeCA8PCBjbHNfbm0gPDwgIi5SZWFkKCBjb25zdCBpcHJvdDogSVByb3RvY29sKTsiCi0gICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwob3V0KSA8PCAidmFyIiA8PCBlbmRsOwotICBpbmRlbnRfdXBfaW1wbCgpOwotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJmaWVsZF8gOiBJRmllbGQ7IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJzdHJ1YyA6IElTdHJ1Y3Q7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gIG91dCA8PCBsb2NhbF92YXJzLnN0cigpIDw8IGVuZGw7Ci0gIG91dCA8PCBjb2RlX2Jsb2NrLnN0cigpOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX3N0cnVjdF9yZXN1bHRfd3JpdGVyX2ltcGwob3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjbHNfcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0KLSAgb3N0cmluZ3N0cmVhbSBsb2NhbF92YXJzOwotICBvc3RyaW5nc3RyZWFtIGNvZGVfYmxvY2s7Ci0KLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwX2ltcGwoKTsKLQotICBpbmRlbnRfaW1wbChsb2NhbF92YXJzKSA8PCAidHJhY2tlciA6IElQcm90b2NvbFJlY3Vyc2lvblRyYWNrZXI7IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAidHJhY2tlciA6PSBvcHJvdC5OZXh0UmVjdXJzaW9uTGV2ZWw7IiA8PCBlbmRsOwotICAKLSAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgInN0cnVjIDo9IFRTdHJ1Y3RJbXBsLkNyZWF0ZSgnIiA8PCBuYW1lIDw8ICInKTsiIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJvcHJvdC5Xcml0ZVN0cnVjdEJlZ2luKHN0cnVjKTsiIDw8IGVuZGw7Ci0KLSAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7Ci0gICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImZpZWxkXyA6PSBURmllbGRJbXBsLkNyZWF0ZTsiIDw8IGVuZGw7Ci0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJpZiAoX19pc3NldF8iIDw8IHByb3BfbmFtZSgqZl9pdGVyLCBpc19leGNlcHRpb24pIDw8ICIpIHRoZW4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImJlZ2luIiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwX2ltcGwoKTsKLSAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJmaWVsZF8uTmFtZSA6PSAnIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIic7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImZpZWxkXy5UeXBlXyAgOj0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiOyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZmllbGRfLklEIDo9ICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAib3Byb3QuV3JpdGVGaWVsZEJlZ2luKGZpZWxkXyk7IiA8PCBlbmRsOwotICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKGNvZGVfYmxvY2ssIGlzX2V4Y2VwdGlvbiwgKmZfaXRlciwgIiIsIGxvY2FsX3ZhcnMpOwotICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIm9wcm90LldyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIm9wcm90LldyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAib3Byb3QuV3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd25faW1wbCgpOwotICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIHN0cmluZyBjbHNfbm07Ci0KLSAgY2xzX25tID0gdHlwZV9uYW1lKHRzdHJ1Y3QsIHRydWUsIGZhbHNlLCBpc19leGNlcHRpb24sIGlzX2V4Y2VwdGlvbik7Ci0KLSAgaW5kZW50X2ltcGwob3V0KSA8PCAicHJvY2VkdXJlICIgPDwgY2xzX3ByZWZpeCA8PCBjbHNfbm0gPDwgIi5Xcml0ZSggY29uc3Qgb3Byb3Q6IElQcm90b2NvbCk7IgotICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKG91dCkgPDwgInZhciIgPDwgZW5kbDsKLSAgaW5kZW50X3VwX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwob3V0KSA8PCAic3RydWMgOiBJU3RydWN0OyIgPDwgZW5kbDsKLQotICBpZiAoZmllbGRzLnNpemUoKSA+IDApIHsKLSAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJmaWVsZF8gOiBJRmllbGQ7IiA8PCBlbmRsOwotICB9Ci0KLSAgb3V0IDw8IGxvY2FsX3ZhcnMuc3RyKCk7Ci0gIGluZGVudF9kb3duX2ltcGwoKTsKLSAgb3V0IDw8IGNvZGVfYmxvY2suc3RyKCk7Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3dyaXRlcl9pbXBsKG9zdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjbHNfcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgewotCi0gIG9zdHJpbmdzdHJlYW0gbG9jYWxfdmFyczsKLSAgb3N0cmluZ3N0cmVhbSBjb2RlX2Jsb2NrOwotCi0gIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiYmVnaW4iIDw8IGVuZGw7Ci0gIGluZGVudF91cF9pbXBsKCk7Ci0KLSAgaW5kZW50X2ltcGwobG9jYWxfdmFycykgPDwgInRyYWNrZXIgOiBJUHJvdG9jb2xSZWN1cnNpb25UcmFja2VyOyIgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgInRyYWNrZXIgOj0gb3Byb3QuTmV4dFJlY3Vyc2lvbkxldmVsOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAic3RydWMgOj0gVFN0cnVjdEltcGwuQ3JlYXRlKCciIDw8IG5hbWUgPDwgIicpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIm9wcm90LldyaXRlU3RydWN0QmVnaW4oc3RydWMpOyIgPDwgZW5kbDsKLQotICBpZiAoZmllbGRzLnNpemUoKSA+IDApIHsKLSAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZmllbGRfIDo9IFRGaWVsZEltcGwuQ3JlYXRlOyIgPDwgZW5kbDsKLSAgfQotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgYm9vbCBudWxsX2FsbG93ZWQgPSB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgYm9vbCBpc19vcHRpb25hbCA9ICgoKmZfaXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKTsKLSAgICBpZiAobnVsbF9hbGxvd2VkKSB7Ci0gICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiaWYgKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSwgaXNfZXhjZXB0aW9uKSA8PCAiIDw+IG5pbCkiOwotICAgICAgaWYgKGlzX29wdGlvbmFsKSB7Ci0gICAgICAgIGNvZGVfYmxvY2sgPDwgIiBhbmQgX19pc3NldF8iIDw8IHByb3BfbmFtZSgqZl9pdGVyLCBpc19leGNlcHRpb24pOwotICAgICAgfQotICAgICAgY29kZV9ibG9jayA8PCAiIHRoZW4iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiYmVnaW4iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXBfaW1wbCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoaXNfb3B0aW9uYWwpIHsKLSAgICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImlmIChfX2lzc2V0XyIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIsIGlzX2V4Y2VwdGlvbikgPDwgIikgdGhlbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImJlZ2luIiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXBfaW1wbCgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIi8vIHJlcXVpcmVkIGZpZWxkIiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZmllbGRfLk5hbWUgOj0gJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZmllbGRfLlR5cGVfICA6PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICI7IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImZpZWxkXy5JRCA6PSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI7IiA8PCBlbmRsOwotICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oZmllbGRfKTsiIDw8IGVuZGw7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKGNvZGVfYmxvY2ssIGlzX2V4Y2VwdGlvbiwgKmZfaXRlciwgIiIsIGxvY2FsX3ZhcnMpOwotICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOwotICAgIGlmIChudWxsX2FsbG93ZWQgfHwgaXNfb3B0aW9uYWwpIHsKLSAgICAgIGluZGVudF9kb3duX2ltcGwoKTsKLSAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJlbmQ7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJvcHJvdC5Xcml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIm9wcm90LldyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBzdHJpbmcgY2xzX25tOwotCi0gIGNsc19ubSA9IHR5cGVfbmFtZSh0c3RydWN0LCB0cnVlLCBmYWxzZSwgaXNfZXhjZXB0aW9uLCBpc19leGNlcHRpb24pOwotCi0gIGluZGVudF9pbXBsKG91dCkgPDwgInByb2NlZHVyZSAiIDw8IGNsc19wcmVmaXggPDwgY2xzX25tIDw8ICIuV3JpdGUoIGNvbnN0IG9wcm90OiBJUHJvdG9jb2wpOyIKLSAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJ2YXIiIDw8IGVuZGw7Ci0gIGluZGVudF91cF9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKG91dCkgPDwgInN0cnVjIDogSVN0cnVjdDsiIDw8IGVuZGw7Ci0gIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgewotICAgIGluZGVudF9pbXBsKG91dCkgPDwgImZpZWxkXyA6IElGaWVsZDsiIDw8IGVuZGw7Ci0gIH0KLSAgb3V0IDw8IGxvY2FsX3ZhcnMuc3RyKCk7Ci0gIGluZGVudF9kb3duX2ltcGwoKTsKLSAgb3V0IDw8IGNvZGVfYmxvY2suc3RyKCk7Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3Rvc3RyaW5nX2ltcGwob3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2xzX3ByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hfZmFjdG9yeSkgewotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBzdHJpbmcgY2xzX25tOwotCi0gIGlmIChpc19leGNlcHRpb24pIHsKLSAgICBjbHNfbm0gPSB0eXBlX25hbWUodHN0cnVjdCwgdHJ1ZSwgKCFpc194X2ZhY3RvcnkpLCBpc194X2ZhY3RvcnksIHRydWUpOwotICB9IGVsc2UgewotICAgIGNsc19ubSA9IHR5cGVfbmFtZSh0c3RydWN0LCB0cnVlLCBmYWxzZSk7Ci0gIH0KLQotICBzdHJpbmcgdG1wX3NiID0gdG1wKCJfc2IiKTsKLSAgc3RyaW5nIHRtcF9maXJzdCA9IHRtcCgiX2ZpcnN0Iik7Ci0gIGJvb2wgdXNlRmlyc3RGbGFnID0gZmFsc2U7Ci0KLSAgaW5kZW50X2ltcGwob3V0KSA8PCAiZnVuY3Rpb24gIiA8PCBjbHNfcHJlZml4IDw8IGNsc19ubSA8PCAiLlRvU3RyaW5nOiBzdHJpbmc7IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJ2YXIiIDw8IGVuZGw7Ci0gIGluZGVudF91cF9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKG91dCkgPDwgdG1wX3NiIDw8ICIgOiBUVGhyaWZ0U3RyaW5nQnVpbGRlcjsiIDw8IGVuZGw7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgYm9vbCBpc19vcHRpb25hbCA9ICgoKmZfaXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKTsKLSAgICBpZiAoaXNfb3B0aW9uYWwpIHsKLSAgICAgIGluZGVudF9pbXBsKG91dCkgPDwgdG1wX2ZpcnN0IDw8ICIgOiBCb29sZWFuOyIgPDwgZW5kbDsKLSAgICAgIHVzZUZpcnN0RmxhZyA9IHRydWU7Ci0gICAgfQotICAgIGJyZWFrOwotICB9Ci0gIGluZGVudF9kb3duX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwob3V0KSA8PCAiYmVnaW4iIDw8IGVuZGw7Ci0gIGluZGVudF91cF9pbXBsKCk7Ci0KLSAgaW5kZW50X2ltcGwob3V0KSA8PCB0bXBfc2IgPDwgIiA6PSBUVGhyaWZ0U3RyaW5nQnVpbGRlci5DcmVhdGUoJygnKTsiIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKG91dCkgPDwgInRyeSIgPDwgZW5kbDsKLSAgaW5kZW50X3VwX2ltcGwoKTsKLQotICBpZiAodXNlRmlyc3RGbGFnKSB7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCB0bXBfZmlyc3QgPDwgIiA6PSBUUlVFOyIgPDwgZW5kbDsKLSAgfQotCi0gIGJvb2wgaGFkX3JlcXVpcmVkID0gZmFsc2U7IC8vIHNldCB0byB0cnVlIGFmdGVyIGZpcnN0IHJlcXVpcmVkIGZpZWxkIGhhcyBiZWVuIHByb2Nlc3NlZAotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgYm9vbCBudWxsX2FsbG93ZWQgPSB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgYm9vbCBpc19vcHRpb25hbCA9ICgoKmZfaXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKTsKLSAgICBpZiAobnVsbF9hbGxvd2VkKSB7Ci0gICAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJpZiAoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpLCBpc19leGNlcHRpb24pIDw8ICIgPD4gbmlsKSI7Ci0gICAgICBpZiAoaXNfb3B0aW9uYWwpIHsKLSAgICAgICAgb3V0IDw8ICIgYW5kIF9faXNzZXRfIiA8PCBwcm9wX25hbWUoKmZfaXRlciwgaXNfZXhjZXB0aW9uKTsKLSAgICAgIH0KLSAgICAgIG91dCA8PCAiIHRoZW4gYmVnaW4iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXBfaW1wbCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoaXNfb3B0aW9uYWwpIHsKLSAgICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiaWYgKF9faXNzZXRfIiA8PCBwcm9wX25hbWUoKmZfaXRlciwgaXNfZXhjZXB0aW9uKSA8PCAiKSB0aGVuIGJlZ2luIgotICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cF9pbXBsKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHVzZUZpcnN0RmxhZyAmJiAoIWhhZF9yZXF1aXJlZCkpIHsKLSAgICAgIGluZGVudF9pbXBsKG91dCkgPDwgImlmIG5vdCAiIDw8IHRtcF9maXJzdCA8PCAiIHRoZW4gIiA8PCB0bXBfc2IgPDwgIi5BcHBlbmQoJywnKTsiIDw8IGVuZGw7Ci0gICAgICBpZiAoaXNfb3B0aW9uYWwpIHsKLSAgICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCB0bXBfZmlyc3QgPDwgIiA6PSBGQUxTRTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBpbmRlbnRfaW1wbChvdXQpIDw8IHRtcF9zYiA8PCAiLkFwcGVuZCgnIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpLCBpc19leGNlcHRpb24pIDw8ICI6ICcpOyIKLSAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCB0bXBfc2IgPDwgIi5BcHBlbmQoJywgIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpLCBpc19leGNlcHRpb24pIDw8ICI6ICcpOyIKLSAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICB0X3R5cGUqIHR0eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgIHdoaWxlICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgICB0dHlwZSA9ICgodF90eXBlZGVmKil0dHlwZSktPmdldF90eXBlKCk7Ci0gICAgfQotCi0gICAgaWYgKHR0eXBlLT5pc194Y2VwdGlvbigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSkgewotICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiaWYgKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSwgaXNfZXhjZXB0aW9uKSA8PCAiID0gbmlsKSB0aGVuICIgPDwgdG1wX3NiCi0gICAgICAgICAgICAgICAgICAgICAgIDw8ICIuQXBwZW5kKCc8bnVsbD4nKSBlbHNlICIgPDwgdG1wX3NiIDw8ICIuQXBwZW5kKCIKLSAgICAgICAgICAgICAgICAgICAgICAgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSwgaXNfZXhjZXB0aW9uKSA8PCAiLlRvU3RyaW5nKCkpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIGluZGVudF9pbXBsKG91dCkgPDwgdG1wX3NiIDw8ICIuQXBwZW5kKEludGVnZXIoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpLCBpc19leGNlcHRpb24pCi0gICAgICAgICAgICAgICAgICAgICAgIDw8ICIpKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudF9pbXBsKG91dCkgPDwgdG1wX3NiIDw8ICIuQXBwZW5kKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSwgaXNfZXhjZXB0aW9uKSA8PCAiKTsiCi0gICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaWYgKG51bGxfYWxsb3dlZCB8fCBpc19vcHRpb25hbCkgewotICAgICAgaW5kZW50X2Rvd25faW1wbCgpOwotICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpZiAoIWlzX29wdGlvbmFsKSB7Ci0gICAgICBoYWRfcmVxdWlyZWQgPSB0cnVlOyAvLyBub3cgX19maXJzdCBtdXN0IGJlIGZhbHNlLCBzbyB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIGl0IGFueW1vcmUKLSAgICB9Ci0gIH0KLQotICBpbmRlbnRfaW1wbChvdXQpIDw8IHRtcF9zYiA8PCAiLkFwcGVuZCgnKScpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwob3V0KSA8PCAiUmVzdWx0IDo9ICIgPDwgdG1wX3NiIDw8ICIuVG9TdHJpbmc7IiA8PCBlbmRsOwotICBpZiAodXNlRmlyc3RGbGFnKSB7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCAiaWYgIiA8PCB0bXBfZmlyc3QgPDwgIiB0aGVuIHtwcmV2ZW50IHdhcm5pbmd9OyIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudF9kb3duX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwob3V0KSA8PCAiZmluYWxseSIgPDwgZW5kbDsKLSAgaW5kZW50X3VwX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwob3V0KSA8PCB0bXBfc2IgPDwgIi5GcmVlOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd25faW1wbCgpOwotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi1ib29sIHRfZGVscGhpX2dlbmVyYXRvcjo6aXNfdm9pZCh0X3R5cGUqIHR5cGUpIHsKLSAgd2hpbGUgKHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgIHR5cGUgPSAoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCk7Ci0gIH0KLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgaWYgKHRiYXNlID09IHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLVRIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoCi0gICAgZGVscGhpLAotICAgICJkZWxwaGkiLAotICAgICIgICAgYW5zaXN0cl9iaW5hcnk6ICBVc2UgQW5zaVN0cmluZyBmb3IgYmluYXJ5IGRhdGF0eXBlIChkZWZhdWx0IGlzIFRCeXRlcykuXG4iCi0gICAgIiAgICByZWdpc3Rlcl90eXBlczogIEVuYWJsZSBUeXBlUmVnaXN0cnksIGFsbG93cyBmb3IgY3JlYXRpb24gb2Ygc3RydWN0LCB1bmlvblxuIgotICAgICIgICAgICAgICAgICAgICAgICAgICBhbmQgY29udGFpbmVyIGluc3RhbmNlcyBieSBpbnRlcmZhY2Ugb3IgVHlwZUluZm8oKVxuIgotICAgICIgICAgY29uc3RwcmVmaXg6ICAgICBOYW1lIFRDb25zdGFudHMgY2xhc3NlcyBhZnRlciBJREwgdG8gcmVkdWNlIGFtYmlndWl0aWVzXG4iCi0gICAgIiAgICBldmVudHM6ICAgICAgICAgIEVuYWJsZSBhbmQgdXNlIHByb2Nlc3NpbmcgZXZlbnRzIGluIHRoZSBnZW5lcmF0ZWQgY29kZS5cbiIKLSAgICAiICAgIHhtbGRvYzogICAgICAgICAgRW5hYmxlIFhNTERvYyBjb21tZW50cyBmb3IgSGVscCBJbnNpZ2h0IGV0Yy5cbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfZXJsX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9lcmxfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDY2NjM2Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9lcmxfZ2VuZXJhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTA0NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSAidF9nZW5lcmF0b3IuaCIKLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotI2luY2x1ZGUgInZlcnNpb24uaCIKLQotdXNpbmcgc3RkOjptYXA7Ci11c2luZyBzdGQ6Om9mc3RyZWFtOwotdXNpbmcgc3RkOjpvc3RyZWFtOwotdXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwotdXNpbmcgc3RkOjpzdHJpbmc7Ci11c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKLXVzaW5nIHN0ZDo6dmVjdG9yOwotCi1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKLQotLyoqCi0gKiBFcmxhbmcgY29kZSBnZW5lcmF0b3IuCi0gKgotICovCi1jbGFzcyB0X2VybF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9nZW5lcmF0b3IgewotcHVibGljOgotICB0X2VybF9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAotICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKLSAgICA6IHRfZ2VuZXJhdG9yKHByb2dyYW0pIHsKLSAgICAodm9pZClwYXJzZWRfb3B0aW9uczsKLSAgICAodm9pZClvcHRpb25fc3RyaW5nOwotICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWVybCI7Ci0KLSAgICBsZWdhY3lfbmFtZXNfID0gKHBhcnNlZF9vcHRpb25zLmZpbmQoImxlZ2FjeW5hbWVzIikgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotICAgIG1hcHNfID0gKHBhcnNlZF9vcHRpb25zLmZpbmQoIm1hcHMiKSAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0gICAgb3RwMTZfID0gKHBhcnNlZF9vcHRpb25zLmZpbmQoIm90cDE2IikgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotICAgIGlmIChtYXBzXyAmJiBvdHAxNl8pIHsKLSAgICAgIHRocm93ICJhcmd1bWVudCBlcnJvcjogQ2Fubm90IHNwZWNpZnkgYm90aCBtYXBzIGFuZCBvdHAxNjsgbWFwcyBhcmUgbm90IGF2YWlsYWJsZSBmb3IgRXJsYW5nL09UUCBSMTYgb3Igb2xkZXIiOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCi0gICAqLwotCi0gIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKLSAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKLQotICAvKioKLSAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7Ci0gIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9tZW1iZXJfdHlwZShzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlKTsKLSAgdm9pZCBnZW5lcmF0ZV9tZW1iZXJfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOwotCi0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9tZW1iZXJfdHlwZSh0X2ZpZWxkKiBmaWVsZCk7Ci0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9tZW1iZXJfdmFsdWUodF9maWVsZCogZmllbGQpOwotICBzdGQ6OnN0cmluZyByZW5kZXJfbWVtYmVyX3JlcXVpcmVkbmVzcyh0X2ZpZWxkKiBmaWVsZCk7Ci0KLSAgLy8gIHN0ZDo6c3RyaW5nIHJlbmRlcl9kZWZhdWx0X3ZhbHVlKHRfdHlwZSogdHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9kZWZhdWx0X3ZhbHVlKHRfZmllbGQqIGZpZWxkKTsKLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOwotICBzdGQ6OnN0cmluZyByZW5kZXJfdHlwZV90ZXJtKHRfdHlwZSogdHR5cGUsIGJvb2wgZXhwYW5kX3N0cnVjdHMsIGJvb2wgZXh0ZW5kZWRfaW5mbyA9IGZhbHNlKTsKLQotICAvKioKLSAgICogU3RydWN0IGdlbmVyYXRpb24gY29kZQotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX2VybF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9lcmxfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9lcmxfc3RydWN0X21lbWJlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdG1lbWJlcik7Ci0gIHZvaWQgZ2VuZXJhdGVfZXJsX3N0cnVjdF9pbmZvKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZXJsX2V4dGVuZGVkX3N0cnVjdF9pbmZvKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZXJsX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICAvKioKLSAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbl9pbmZvKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0KLSAgLyoqCi0gICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCi0gICAqLwotCi0gIHN0ZDo6c3RyaW5nIGVybF9hdXRvZ2VuX2NvbW1lbnQoKTsKLSAgc3RkOjpzdHJpbmcgZXJsX2ltcG9ydHMoKTsKLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2luY2x1ZGVzKCk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKTsKLQotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKLSAgc3RkOjpzdHJpbmcgdHlwZV9tb2R1bGUodF90eXBlKiB0dHlwZSk7Ci0KLSAgc3RkOjpzdHJpbmcgbWFrZV9zYWZlX2Zvcl9tb2R1bGVfbmFtZShzdGQ6OnN0cmluZyBpbikgewotICAgIGlmIChsZWdhY3lfbmFtZXNfKSB7Ci0gICAgICByZXR1cm4gZGVjYXBpdGFsaXplKGluKTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIHVuZGVyc2NvcmUoaW4pOwotICAgIH0KLSAgfQotCi0gIHN0ZDo6c3RyaW5nIGF0b21pZnkoc3RkOjpzdHJpbmcgaW4pIHsKLSAgICBpZiAobGVnYWN5X25hbWVzXykgewotICAgICAgcmV0dXJuICInIiArIGRlY2FwaXRhbGl6ZShpbikgKyAiJyI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAiJyIgKyBpbiArICInIjsKLSAgICB9Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBjb25zdGlmeShzdGQ6OnN0cmluZyBpbikgewotICAgIGlmIChsZWdhY3lfbmFtZXNfKSB7Ci0gICAgICByZXR1cm4gY2FwaXRhbGl6ZShpbik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiB1cHBlcmNhc2UoaW4pOwotICAgIH0KLSAgfQotCi0gIHN0YXRpYyBzdGQ6OnN0cmluZyBjb21tZW50KHN0cmluZyBpbik7Ci0KLXByaXZhdGU6Ci0gIGJvb2wgaGFzX2RlZmF1bHRfdmFsdWUodF9maWVsZCopOwotCi0gIC8qIGlmIHRydWUgcmV0YWluIHByZSAwLjkuMiBuYW1pbmcgc2NoZW1lIGZvciBmdW5jdGlvbnMsIGF0b21zIGFuZCBjb25zdHMgKi8KLSAgYm9vbCBsZWdhY3lfbmFtZXNfOwotCi0gIC8qIGlmIHRydWUgdXNlIG1hcHMgaW5zdGVhZCBvZiBkaWN0cyBpbiBnZW5lcmF0ZWQgY29kZSAqLwotICBib29sIG1hcHNfOwotCi0gIC8qIGlmIHRydWUgdXNlIG5vbi1uYW1lc3BhY2VkIGRpY3QgYW5kIHNldCBpbnN0ZWFkIG9mIGRpY3Q6ZGljdCBhbmQgc2V0czpzZXQgKi8KLSAgYm9vbCBvdHAxNl87Ci0KLSAgLyoqCi0gICAqIGFkZCBmdW5jdGlvbiB0byBleHBvcnQgbGlzdAotICAgKi8KLQotICB2b2lkIGV4cG9ydF9mdW5jdGlvbih0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLSAgdm9pZCBleHBvcnRfc3RyaW5nKHN0ZDo6c3RyaW5nIG5hbWUsIGludCBudW0pOwotCi0gIHZvaWQgZXhwb3J0X3R5cGVzX2Z1bmN0aW9uKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotICB2b2lkIGV4cG9ydF90eXBlc19zdHJpbmcoc3RkOjpzdHJpbmcgbmFtZSwgaW50IG51bSk7Ci0KLSAgLyoqCi0gICAqIHdyaXRlIG91dCBoZWFkZXJzIGFuZCBmb290ZXJzIGZvciBocmwgZmlsZXMKLSAgICovCi0KLSAgdm9pZCBocmxfaGVhZGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBuYW1lKTsKLSAgdm9pZCBocmxfZm9vdGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBuYW1lKTsKLQotICAvKioKLSAgICogc3R1ZmYgdG8gc3BpdCBvdXQgYXQgdGhlIHRvcCBvZiBnZW5lcmF0ZWQgZmlsZXMKLSAgICovCi0KLSAgYm9vbCBleHBvcnRfbGluZXNfZmlyc3RfOwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gZXhwb3J0X2xpbmVzXzsKLQotICBib29sIGV4cG9ydF90eXBlc19saW5lc19maXJzdF87Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBleHBvcnRfdHlwZXNfbGluZXNfOwotCi0gIC8qKgotICAgKiBGaWxlIHN0cmVhbXMKLSAgICovCi0KLSAgc3RkOjpvc3RyaW5nc3RyZWFtIGZfaW5mb187Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBmX2luZm9fZXh0XzsKLQotICBzdGQ6Om9mc3RyZWFtIGZfdHlwZXNfZmlsZV87Ci0gIHN0ZDo6b2ZzdHJlYW0gZl90eXBlc19ocmxfZmlsZV87Ci0KLSAgc3RkOjpvZnN0cmVhbSBmX2NvbnN0c187Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBmX3NlcnZpY2VfOwotICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZV9maWxlXzsKLSAgc3RkOjpvZnN0cmVhbSBmX3NlcnZpY2VfaHJsXzsKLX07Ci0KLS8qKgotICogVUkgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKLSAqIHN0cmVhbXMuCi0gKgotICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCi0gKi8KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKLSAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5Ci0gIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7Ci0KLSAgLy8gc2V0dXAgZXhwb3J0IGxpbmVzCi0gIGV4cG9ydF9saW5lc19maXJzdF8gPSB0cnVlOwotICBleHBvcnRfdHlwZXNfbGluZXNfZmlyc3RfID0gdHJ1ZTsKLQotICAvLyB0eXBlcyBmaWxlcwotICBzdHJpbmcgZl90eXBlc19uYW1lID0gZ2V0X291dF9kaXIoKSArIG1ha2Vfc2FmZV9mb3JfbW9kdWxlX25hbWUocHJvZ3JhbV9uYW1lXykgKyAiX3R5cGVzLmVybCI7Ci0gIHN0cmluZyBmX3R5cGVzX2hybF9uYW1lID0gZ2V0X291dF9kaXIoKSArIG1ha2Vfc2FmZV9mb3JfbW9kdWxlX25hbWUocHJvZ3JhbV9uYW1lXykgKyAiX3R5cGVzLmhybCI7Ci0KLSAgZl90eXBlc19maWxlXy5vcGVuKGZfdHlwZXNfbmFtZS5jX3N0cigpKTsKLSAgZl90eXBlc19ocmxfZmlsZV8ub3BlbihmX3R5cGVzX2hybF9uYW1lLmNfc3RyKCkpOwotCi0gIGhybF9oZWFkZXIoZl90eXBlc19ocmxfZmlsZV8sIG1ha2Vfc2FmZV9mb3JfbW9kdWxlX25hbWUocHJvZ3JhbV9uYW1lXykgKyAiX3R5cGVzIik7Ci0KLSAgZl90eXBlc19maWxlXyA8PCBlcmxfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PCAiLW1vZHVsZSgiCi0gICAgICAgICAgICAgICAgPDwgbWFrZV9zYWZlX2Zvcl9tb2R1bGVfbmFtZShwcm9ncmFtX25hbWVfKSA8PCAiX3R5cGVzKS4iIDw8IGVuZGwgPDwgZXJsX2ltcG9ydHMoKQotICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0KLSAgZl90eXBlc19maWxlXyA8PCAiLWluY2x1ZGUoXCIiIDw8IG1ha2Vfc2FmZV9mb3JfbW9kdWxlX25hbWUocHJvZ3JhbV9uYW1lXykgPDwgIl90eXBlcy5ocmxcIikuIgotICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbDsKLQotICBmX3R5cGVzX2hybF9maWxlXyA8PCByZW5kZXJfaW5jbHVkZXMoKSA8PCBlbmRsOwotCi0gIC8vIGNvbnN0cyBmaWxlCi0gIHN0cmluZyBmX2NvbnN0c19uYW1lID0gZ2V0X291dF9kaXIoKSArIG1ha2Vfc2FmZV9mb3JfbW9kdWxlX25hbWUocHJvZ3JhbV9uYW1lXykKLSAgICAgICAgICAgICAgICAgICAgICAgICArICJfY29uc3RhbnRzLmhybCI7Ci0gIGZfY29uc3RzXy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7Ci0KLSAgZl9jb25zdHNfIDw8IGVybF9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8IGVybF9pbXBvcnRzKCkgPDwgZW5kbCA8PCAiLWluY2x1ZGUoXCIiCi0gICAgICAgICAgICA8PCBtYWtlX3NhZmVfZm9yX21vZHVsZV9uYW1lKHByb2dyYW1fbmFtZV8pIDw8ICJfdHlwZXMuaHJsXCIpLiIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEJvaWxlcnBsYXRlIGF0IGJlZ2lubmluZyBhbmQgZW5kIG9mIGhlYWRlciBmaWxlcwotICovCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6aHJsX2hlYWRlcihvc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lKSB7Ci0gIG91dCA8PCAiLWlmbmRlZihfIiA8PCBuYW1lIDw8ICJfaW5jbHVkZWQpLiIgPDwgZW5kbCA8PCAiLWRlZmluZShfIiA8PCBuYW1lIDw8ICJfaW5jbHVkZWQsIHllYWgpLiIKLSAgICAgIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpocmxfZm9vdGVyKG9zdHJlYW0mIG91dCwgc3RyaW5nIG5hbWUpIHsKLSAgKHZvaWQpbmFtZTsKLSAgb3V0IDw8ICItZW5kaWYuIiA8PCBlbmRsOwotfQotCi0vKioKLSAqIFJlbmRlcnMgYWxsIHRoZSBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgaW5jbHVkaW5nIGFub3RoZXIgVGhyaWZ0IHByb2dyYW0KLSAqLwotc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6cmVuZGVyX2luY2x1ZGVzKCkgewotICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOwotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKLSAgICByZXN1bHQgKz0gIi1pbmNsdWRlKFwiIiArIG1ha2Vfc2FmZV9mb3JfbW9kdWxlX25hbWUoaW5jbHVkZXNbaV0tPmdldF9uYW1lKCkpCi0gICAgICAgICAgICAgICsgIl90eXBlcy5ocmxcIikuXG4iOwotICB9Ci0gIGlmIChpbmNsdWRlcy5zaXplKCkgPiAwKSB7Ci0gICAgcmVzdWx0ICs9ICJcbiI7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBBdXRvZ2VuJ2QgY29tbWVudAotICovCi1zdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjplcmxfYXV0b2dlbl9jb21tZW50KCkgewotICByZXR1cm4gc3RkOjpzdHJpbmcoIiUlXG4iKSArICIlJSBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoIiArIFRIUklGVF9WRVJTSU9OICsgIilcbiIKLSAgICAgICAgICsgIiUlXG4iICsgIiUlIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkdcbiIKLSAgICAgICAgICsgIiUlXG4iOwotfQotCi0vKioKLSAqIENvbW1lbnQgb3V0IHRleHQKLSAqLwotCi1zdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjpjb21tZW50KHN0cmluZyBpbikgewotICBzaXplX3QgcG9zID0gMDsKLSAgaW4uaW5zZXJ0KHBvcywgIiUlICIpOwotICB3aGlsZSAoKHBvcyA9IGluLmZpbmRfZmlyc3Rfb2YoJ1xuJywgcG9zKSkgIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgaW4uaW5zZXJ0KCsrcG9zLCAiJSUgIik7Ci0gIH0KLSAgcmV0dXJuIGluOwotfQotCi0vKioKLSAqIFByaW50cyBzdGFuZGFyZCB0aHJpZnQgaW1wb3J0cwotICovCi1zdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjplcmxfaW1wb3J0cygpIHsKLSAgcmV0dXJuICIiOwotfQotCi0vKioKLSAqIENsb3NlcyB0aGUgdHlwZSBmaWxlcwotICovCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgewotCi0gIGV4cG9ydF90eXBlc19zdHJpbmcoInN0cnVjdF9pbmZvIiwgMSk7Ci0gIGV4cG9ydF90eXBlc19zdHJpbmcoInN0cnVjdF9pbmZvX2V4dCIsIDEpOwotICBmX3R5cGVzX2ZpbGVfIDw8ICItZXhwb3J0KFsiIDw8IGV4cG9ydF90eXBlc19saW5lc18uc3RyKCkgPDwgIl0pLiIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGZfdHlwZXNfZmlsZV8gPDwgZl9pbmZvXy5zdHIoKTsKLSAgZl90eXBlc19maWxlXyA8PCAic3RydWN0X2luZm8oXykgLT4gZXJsYW5nOmVycm9yKGZ1bmN0aW9uX2NsYXVzZSkuIiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZl90eXBlc19maWxlXyA8PCBmX2luZm9fZXh0Xy5zdHIoKTsKLSAgZl90eXBlc19maWxlXyA8PCAic3RydWN0X2luZm9fZXh0KF8pIC0+IGVybGFuZzplcnJvcihmdW5jdGlvbl9jbGF1c2UpLiIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGhybF9mb290ZXIoZl90eXBlc19ocmxfZmlsZV8sIHN0cmluZygiQk9HVVMiKSk7Ci0KLSAgZl90eXBlc19maWxlXy5jbG9zZSgpOwotICBmX3R5cGVzX2hybF9maWxlXy5jbG9zZSgpOwotICBmX2NvbnN0c18uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBubyBvcAotICoKLSAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKLSAgKHZvaWQpdHR5cGVkZWY7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4gRG9uZSB1c2luZyBhIGNsYXNzIHRvIHNjb3BlCi0gKiB0aGUgdmFsdWVzLgotICoKLSAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KLSAqLwotdm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgewotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7Ci0KLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgIHN0cmluZyBuYW1lID0gKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIGluZGVudChmX3R5cGVzX2hybF9maWxlXykgPDwgIi1kZWZpbmUoIiA8PCBjb25zdGlmeShtYWtlX3NhZmVfZm9yX21vZHVsZV9uYW1lKHByb2dyYW1fbmFtZV8pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIl8iIDw8IGNvbnN0aWZ5KHRlbnVtLT5nZXRfbmFtZSgpKSA8PCAiXyIgPDwgY29uc3RpZnkobmFtZSkgPDwgIiwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgdmFsdWUgPDwgIikuIiA8PCBlbmRsOwotICB9Ci0KLSAgZl90eXBlc19ocmxfZmlsZV8gPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZSBhIGNvbnN0YW50IHZhbHVlCi0gKi8KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKLSAgdF90eXBlKiB0eXBlID0gdGNvbnN0LT5nZXRfdHlwZSgpOwotICBzdHJpbmcgbmFtZSA9IHRjb25zdC0+Z2V0X25hbWUoKTsKLSAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSB0Y29uc3QtPmdldF92YWx1ZSgpOwotCi0gIGZfY29uc3RzXyA8PCAiLWRlZmluZSgiIDw8IGNvbnN0aWZ5KG1ha2Vfc2FmZV9mb3JfbW9kdWxlX25hbWUocHJvZ3JhbV9uYW1lXykpIDw8ICJfIgotICAgICAgICAgICAgPDwgY29uc3RpZnkobmFtZSkgPDwgIiwgIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpIDw8ICIpLiIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZwotICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKLSAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCi0gKi8KLXN0cmluZyB0X2VybF9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICBvdXQgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgb3V0IDw8ICh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDAgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIGluZGVudChvdXQpIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotCi0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIG91dCA8PCAiIyIgPDwgYXRvbWlmeSh0eXBlLT5nZXRfbmFtZSgpKSA8PCAieyI7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0KLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKLSAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7Ci0gICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOwotICAgICAgfQotCi0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCAiLCI7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOwotICAgICAgb3V0IDw8ICIgPSAiOwotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iOwotCi0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0KLSAgICBpZiAobWFwc18pIHsKLSAgICAgIG91dCA8PCAibWFwczpmcm9tX2xpc3QoWyI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCAiZGljdDpmcm9tX2xpc3QoWyI7Ci0gICAgfQotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBpLCBlbmQgPSB2YWx1ZS0+Z2V0X21hcCgpLmVuZCgpOwotICAgIGZvciAoaSA9IHZhbHVlLT5nZXRfbWFwKCkuYmVnaW4oKTsgaSAhPSBlbmQ7KSB7Ci0gICAgICBvdXQgPDwgInsiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgaS0+Zmlyc3QpIDw8ICIsIgotICAgICAgICAgIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgaS0+c2Vjb25kKSA8PCAifSI7Ci0gICAgICBpZiAoKytpICE9IGVuZCkgewotICAgICAgICBvdXQgPDwgIiwiOwotICAgICAgfQotICAgIH0KLSAgICBvdXQgPDwgIl0pIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIG91dCA8PCAic2V0czpmcm9tX2xpc3QoWyI7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IgaSwgZW5kID0gdmFsdWUtPmdldF9saXN0KCkuZW5kKCk7Ci0gICAgZm9yIChpID0gdmFsdWUtPmdldF9saXN0KCkuYmVnaW4oKTsgaSAhPSBlbmQ7KSB7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqaSk7Ci0gICAgICBpZiAoKytpICE9IGVuZCkgewotICAgICAgICBvdXQgPDwgIiwiOwotICAgICAgfQotICAgIH0KLSAgICBvdXQgPDwgIl0pIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlOwotICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgb3V0IDw8ICJbIjsKLQotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgIiwiOwotICAgICAgfQotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlcik7Ci0gICAgfQotICAgIG91dCA8PCAiXSI7Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBDT05TVEFOVCBGT1IgVFlQRTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLSAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6cmVuZGVyX2RlZmF1bHRfdmFsdWUodF9maWVsZCogZmllbGQpIHsKLSAgdF90eXBlKiB0eXBlID0gZmllbGQtPmdldF90eXBlKCk7Ci0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuICIjIiArIGF0b21pZnkodHlwZS0+Z2V0X25hbWUoKSkgKyAie30iOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaWYgKG1hcHNfKSB7Ci0gICAgICByZXR1cm4gIiN7fSI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAiZGljdDpuZXcoKSI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICJzZXRzOm5ldygpIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIltdIjsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gInVuZGVmaW5lZCI7Ci0gIH0KLX0KLQotc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6cmVuZGVyX21lbWJlcl90eXBlKHRfZmllbGQqIGZpZWxkKSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoZmllbGQtPmdldF90eXBlKCkpOwotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICJzdHJpbmcoKSB8IGJpbmFyeSgpIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gImJvb2xlYW4oKSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJpbnRlZ2VyKCkiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJmbG9hdCgpIjsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiB1bnN1cHBvcnRlZCBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiaW50ZWdlcigpIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuIGF0b21pZnkodHlwZS0+Z2V0X25hbWUoKSkgKyAiKCkiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaWYgKG1hcHNfKSB7Ci0gICAgICByZXR1cm4gIiN7fSI7Ci0gICAgfSBlbHNlIGlmIChvdHAxNl8pIHsKLSAgICAgIHJldHVybiAiZGljdCgpIjsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuICJkaWN0OmRpY3QoKSI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaWYgKG90cDE2XykgewotICAgICAgcmV0dXJuICJzZXQoKSI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAic2V0czpzZXQoKSI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiAibGlzdCgpIjsKLSAgfSBlbHNlIHsKLSAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IHVuc3VwcG9ydGVkIHR5cGUgIiArIHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLX0KLQotc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6cmVuZGVyX21lbWJlcl9yZXF1aXJlZG5lc3ModF9maWVsZCogZmllbGQpIHsKLSAgc3dpdGNoIChmaWVsZC0+Z2V0X3JlcSgpKSB7Ci0gIGNhc2UgdF9maWVsZDo6VF9SRVFVSVJFRDoKLSAgICByZXR1cm4gInJlcXVpcmVkIjsKLSAgY2FzZSB0X2ZpZWxkOjpUX09QVElPTkFMOgotICAgIHJldHVybiAib3B0aW9uYWwiOwotICBkZWZhdWx0OgotICAgIHJldHVybiAidW5kZWZpbmVkIjsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdAotICovCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGdlbmVyYXRlX2VybF9zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBleGNlcHRpb24uIEJhc2ljYWxseSB0aGUgc2FtZQotICogYXMgYSBzdHJ1Y3QgYnV0IGV4dGVuZHMgdGhlIEV4Y2VwdGlvbiBjbGFzcy4KLSAqCi0gKiBAcGFyYW0gdHhjZXB0aW9uIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9lcmxfc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0Ci0gKi8KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lcmxfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgewotICAodm9pZClpc19leGNlcHRpb247Ci0gIGdlbmVyYXRlX2VybF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3R5cGVzX2hybF9maWxlXywgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX2VybF9zdHJ1Y3RfaW5mbyhmX2luZm9fLCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfZXJsX2V4dGVuZGVkX3N0cnVjdF9pbmZvKGZfaW5mb19leHRfLCB0c3RydWN0KTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZXJsX3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwgIiUlIHN0cnVjdCAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgc3RkOjpzdHJpbmdzdHJlYW0gYnVmOwotICBidWYgPDwgaW5kZW50KCkgPDwgIi1yZWNvcmQoIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiwgeyI7Ci0gIHN0cmluZyBmaWVsZF9pbmRlbnQoYnVmLnN0cigpLnNpemUoKSwgJyAnKTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOykgewotICAgIGdlbmVyYXRlX2VybF9zdHJ1Y3RfbWVtYmVyKGJ1ZiwgKm1faXRlcik7Ci0gICAgaWYgKCsrbV9pdGVyICE9IG1lbWJlcnMuZW5kKCkpIHsKLSAgICAgIGJ1ZiA8PCAiLCIgPDwgZW5kbCA8PCBmaWVsZF9pbmRlbnQ7Ci0gICAgfQotICB9Ci0gIGJ1ZiA8PCAifSkuIjsKLQotICBvdXQgPDwgYnVmLnN0cigpIDw8IGVuZGw7Ci0gIG91dCA8PCAiLXR5cGUgIiArIHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKCkgOjogIyIgKyB0eXBlX25hbWUodHN0cnVjdCkgKyAie30uIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSByZWNvcmQgZmllbGQgZGVmaW5pdGlvbgotICovCi0KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lcmxfc3RydWN0X21lbWJlcihvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRtZW1iZXIpIHsKLSAgb3V0IDw8IGF0b21pZnkodG1lbWJlci0+Z2V0X25hbWUoKSk7Ci0gIGlmIChoYXNfZGVmYXVsdF92YWx1ZSh0bWVtYmVyKSkKLSAgICBvdXQgPDwgIiA9ICIgPDwgcmVuZGVyX21lbWJlcl92YWx1ZSh0bWVtYmVyKTsKLSAgb3V0IDw8ICIgOjogIiA8PCByZW5kZXJfbWVtYmVyX3R5cGUodG1lbWJlcik7Ci19Ci0KLWJvb2wgdF9lcmxfZ2VuZXJhdG9yOjpoYXNfZGVmYXVsdF92YWx1ZSh0X2ZpZWxkKiBmaWVsZCkgewotICB0X3R5cGUqIHR5cGUgPSBmaWVsZC0+Z2V0X3R5cGUoKTsKLSAgaWYgKCFmaWVsZC0+Z2V0X3ZhbHVlKCkpIHsKLSAgICBpZiAoZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSB8fCB0eXBlLT5pc19tYXAoKSB8fCB0eXBlLT5pc19zZXQoKQotICAgICAgICAgIHx8IHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotfQotCi1zdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjpyZW5kZXJfbWVtYmVyX3ZhbHVlKHRfZmllbGQqIGZpZWxkKSB7Ci0gIGlmICghZmllbGQtPmdldF92YWx1ZSgpKSB7Ci0gICAgcmV0dXJuIHJlbmRlcl9kZWZhdWx0X3ZhbHVlKGZpZWxkKTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkLT5nZXRfdHlwZSgpLCBmaWVsZC0+Z2V0X3ZhbHVlKCkpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSByZWFkIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKLSAqLwotdm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VybF9zdHJ1Y3RfaW5mbyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJzdHJ1Y3RfaW5mbygiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKSAtPiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCByZW5kZXJfdHlwZV90ZXJtKHRzdHJ1Y3QsIHRydWUpIDw8ICI7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VybF9leHRlbmRlZF9zdHJ1Y3RfaW5mbyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJzdHJ1Y3RfaW5mb19leHQoIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIikgLT4iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgcmVuZGVyX3R5cGVfdGVybSh0c3RydWN0LCB0cnVlLCB0cnVlKSA8PCAiOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzZXJ2aWNlX25hbWVfID0gbWFrZV9zYWZlX2Zvcl9tb2R1bGVfbmFtZShzZXJ2aWNlX25hbWVfKTsKLQotICBzdHJpbmcgZl9zZXJ2aWNlX2hybF9uYW1lID0gZ2V0X291dF9kaXIoKSArIHNlcnZpY2VfbmFtZV8gKyAiX3RocmlmdC5ocmwiOwotICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBnZXRfb3V0X2RpcigpICsgc2VydmljZV9uYW1lXyArICJfdGhyaWZ0LmVybCI7Ci0gIGZfc2VydmljZV9maWxlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOwotICBmX3NlcnZpY2VfaHJsXy5vcGVuKGZfc2VydmljZV9ocmxfbmFtZS5jX3N0cigpKTsKLQotICAvLyBSZXNldCBzZXJ2aWNlIHRleHQgYWdncmVnYXRpbmcgc3RyZWFtIHN0cmVhbXMKLSAgZl9zZXJ2aWNlXy5zdHIoIiIpOwotICBleHBvcnRfbGluZXNfLnN0cigiIik7Ci0gIGV4cG9ydF9saW5lc19maXJzdF8gPSB0cnVlOwotCi0gIGhybF9oZWFkZXIoZl9zZXJ2aWNlX2hybF8sIHNlcnZpY2VfbmFtZV8pOwotCi0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZl9zZXJ2aWNlX2hybF8gPDwgIi1pbmNsdWRlKFwiIgotICAgICAgICAgICAgICAgICAgIDw8IG1ha2Vfc2FmZV9mb3JfbW9kdWxlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkpCi0gICAgICAgICAgICAgICAgICAgPDwgIl90aHJpZnQuaHJsXCIpLiAlIGluaGVyaXQgIiA8PCBlbmRsOwotICB9Ci0KLSAgZl9zZXJ2aWNlX2hybF8gPDwgIi1pbmNsdWRlKFwiIiA8PCBtYWtlX3NhZmVfZm9yX21vZHVsZV9uYW1lKHByb2dyYW1fbmFtZV8pIDw8ICJfdHlwZXMuaHJsXCIpLiIKLSAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSB0aHJlZSBtYWluIHBhcnRzIG9mIHRoZSBzZXJ2aWNlICh3ZWxsLCB0d28gZm9yIG5vdyBpbiBQSFApCi0gIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7IC8vIGNwaXJvOiBOZXcgRXJsYW5nIE9yZGVyCi0KLSAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOwotCi0gIC8vIGluZGVudF9kb3duKCk7Ci0KLSAgZl9zZXJ2aWNlX2ZpbGVfIDw8IGVybF9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8ICItbW9kdWxlKCIgPDwgc2VydmljZV9uYW1lXyA8PCAiX3RocmlmdCkuIgotICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCAiLWJlaGF2aW91cih0aHJpZnRfc2VydmljZSkuIiA8PCBlbmRsIDw8IGVuZGwgPDwgZXJsX2ltcG9ydHMoKSA8PCBlbmRsOwotCi0gIGZfc2VydmljZV9maWxlXyA8PCAiLWluY2x1ZGUoXCIiIDw8IG1ha2Vfc2FmZV9mb3JfbW9kdWxlX25hbWUodHNlcnZpY2UtPmdldF9uYW1lKCkpCi0gICAgICAgICAgICAgICAgICA8PCAiX3RocmlmdC5ocmxcIikuIiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZl9zZXJ2aWNlX2ZpbGVfIDw8ICItZXhwb3J0KFsiIDw8IGV4cG9ydF9saW5lc18uc3RyKCkgPDwgIl0pLiIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGZfc2VydmljZV9maWxlXyA8PCBmX3NlcnZpY2VfLnN0cigpOwotCi0gIGhybF9mb290ZXIoZl9zZXJ2aWNlX2hybF8sIGZfc2VydmljZV9uYW1lKTsKLQotICAvLyBDbG9zZSBzZXJ2aWNlIGZpbGUKLSAgZl9zZXJ2aWNlX2ZpbGVfLmNsb3NlKCk7Ci0gIGZfc2VydmljZV9ocmxfLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGhlbHBlciBmdW5jdGlvbnMgZm9yIGEgc2VydmljZS4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gIC8vICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgLy8gICIlIEhFTFBFUiBGVU5DVElPTlMgQU5EIFNUUlVDVFVSRVMiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBleHBvcnRfc3RyaW5nKCJzdHJ1Y3RfaW5mbyIsIDEpOwotCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfZXJsX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PCAic3RydWN0X2luZm8oXykgLT4gZXJsYW5nOmVycm9yKGZ1bmN0aW9uX2NsYXVzZSkuIiA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgotICovCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZXJsX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gICh2b2lkKXRmdW5jdGlvbjsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGludGVyZmFjZSBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotCi0gIGV4cG9ydF9zdHJpbmcoImZ1bmN0aW9uX2luZm8iLCAyKTsKLQotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZl9zZXJ2aWNlXyA8PCAiJSUlIGludGVyZmFjZSIgPDwgZW5kbDsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIlICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7Ci0KLSAgICBnZW5lcmF0ZV9mdW5jdGlvbl9pbmZvKHRzZXJ2aWNlLCAqZl9pdGVyKTsKLSAgfQotCi0gIC8vIEluaGVyaXRhbmNlIC0gcGFzcyB1bmtub3duIGZ1bmN0aW9ucyB0byBiYXNlIGNsYXNzCi0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJmdW5jdGlvbl9pbmZvKEZ1bmN0aW9uLCBJbmZvVHlwZSkgLT4iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8IG1ha2Vfc2FmZV9mb3JfbW9kdWxlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkpCi0gICAgICAgICAgICAgICAgICAgICAgIDw8ICJfdGhyaWZ0OmZ1bmN0aW9uX2luZm8oRnVuY3Rpb24sIEluZm9UeXBlKS4iIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfSBlbHNlIHsKLSAgICAvLyByZXR1cm4gZnVuY3Rpb25fY2xhdXNlIGVycm9yIGZvciBub24tZXhpc3RlbnQgZnVuY3Rpb25zCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJmdW5jdGlvbl9pbmZvKF9GdW5jLCBfSW5mbykgLT4gZXJsYW5nOmVycm9yKGZ1bmN0aW9uX2NsYXVzZSkuIiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgZnVuY3Rpb25faW5mbyhGdW5jdGlvbk5hbWUsIHBhcmFtc190eXBlKSBhbmQKLSAqIGZ1bmN0aW9uX2luZm8oRnVuY3Rpb25OYW1lLCByZXBseV90eXBlKQotICovCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnVuY3Rpb25faW5mbyh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgKHZvaWQpdHNlcnZpY2U7Ci0gIHN0cmluZyBuYW1lX2F0b20gPSBhdG9taWZ5KHRmdW5jdGlvbi0+Z2V0X25hbWUoKSk7Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOwotCi0gIC8vIGZ1bmN0aW9uX2luZm8oRnVuY3Rpb24sIHBhcmFtc190eXBlKToKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJmdW5jdGlvbl9pbmZvKCIgPDwgbmFtZV9hdG9tIDw8ICIsIHBhcmFtc190eXBlKSAtPiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8IHJlbmRlcl90eXBlX3Rlcm0oYXJnX3N0cnVjdCwgdHJ1ZSkgPDwgIjsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLQotICAvLyBmdW5jdGlvbl9pbmZvKEZ1bmN0aW9uLCByZXBseV90eXBlKToKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJmdW5jdGlvbl9pbmZvKCIgPDwgbmFtZV9hdG9tIDw8ICIsIHJlcGx5X3R5cGUpIC0+IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCByZW5kZXJfdHlwZV90ZXJtKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgZmFsc2UpIDw8ICI7IiA8PCBlbmRsOwotICBlbHNlIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAib25ld2F5X3ZvaWQ7IiA8PCBlbmRsOwotICBlbHNlCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ7c3RydWN0LCBbXX0iCi0gICAgICAgICAgICAgICAgICAgICAgIDw8ICI7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotCi0gIC8vIGZ1bmN0aW9uX2luZm8oRnVuY3Rpb24sIGV4Y2VwdGlvbnMpOgotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImZ1bmN0aW9uX2luZm8oIiA8PCBuYW1lX2F0b20gPDwgIiwgZXhjZXB0aW9ucykgLT4iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgcmVuZGVyX3R5cGVfdGVybSh4cywgdHJ1ZSkgPDwgIjsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJwotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgotICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgotICovCi1zdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4KSB7Ci0gIHJldHVybiBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiKFRoaXMiCi0gICAgICAgICArIGNhcGl0YWxpemUoYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpKSArICIpIjsKLX0KLQotLyoqCi0gKiBBZGQgYSBmdW5jdGlvbiB0byB0aGUgZXhwb3J0cyBsaXN0Ci0gKi8KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpleHBvcnRfc3RyaW5nKHN0cmluZyBuYW1lLCBpbnQgbnVtKSB7Ci0gIGlmIChleHBvcnRfbGluZXNfZmlyc3RfKSB7Ci0gICAgZXhwb3J0X2xpbmVzX2ZpcnN0XyA9IGZhbHNlOwotICB9IGVsc2UgewotICAgIGV4cG9ydF9saW5lc18gPDwgIiwgIjsKLSAgfQotICBleHBvcnRfbGluZXNfIDw8IG5hbWUgPDwgIi8iIDw8IG51bTsKLX0KLQotdm9pZCB0X2VybF9nZW5lcmF0b3I6OmV4cG9ydF90eXBlc19mdW5jdGlvbih0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpIHsKLQotICBleHBvcnRfdHlwZXNfc3RyaW5nKHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAxIC8vIFRoaXMKLSAgICAgICAgICAgICAgICAgICAgICArICgodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKS0+Z2V0X21lbWJlcnMoKSkuc2l6ZSgpKTsKLX0KLQotdm9pZCB0X2VybF9nZW5lcmF0b3I6OmV4cG9ydF90eXBlc19zdHJpbmcoc3RyaW5nIG5hbWUsIGludCBudW0pIHsKLSAgaWYgKGV4cG9ydF90eXBlc19saW5lc19maXJzdF8pIHsKLSAgICBleHBvcnRfdHlwZXNfbGluZXNfZmlyc3RfID0gZmFsc2U7Ci0gIH0gZWxzZSB7Ci0gICAgZXhwb3J0X3R5cGVzX2xpbmVzXyA8PCAiLCAiOwotICB9Ci0gIGV4cG9ydF90eXBlc19saW5lc18gPDwgbmFtZSA8PCAiLyIgPDwgbnVtOwotfQotCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6ZXhwb3J0X2Z1bmN0aW9uKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RyaW5nIHByZWZpeCkgewotCi0gIGV4cG9ydF9zdHJpbmcocHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgIDEgLy8gVGhpcwotICAgICAgICAgICAgICAgICsgKCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpLT5nZXRfbWVtYmVycygpKS5zaXplKCkpOwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmaWVsZCBsaXN0Ci0gKi8KLXN0cmluZyB0X2VybF9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgcmVzdWx0ICs9ICIsICI7IC8vIGluaXRpYWwgY29tbWEgdG8gY29tcGVuc2F0ZSBmb3IgaW5pdGlhbCBUaGlzCi0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiLCAiOwotICAgIH0KLSAgICByZXN1bHQgKz0gY2FwaXRhbGl6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkpOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0cmluZyB0X2VybF9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKSB7Ci0gIHN0cmluZyBwcmVmaXggPSAiIjsKLSAgc3RyaW5nIG5hbWUgPSB0dHlwZS0+Z2V0X25hbWUoKTsKLQotICBpZiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpIHx8IHR0eXBlLT5pc19zZXJ2aWNlKCkpIHsKLSAgICBuYW1lID0gdHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLQotICByZXR1cm4gYXRvbWlmeShwcmVmaXggKyBuYW1lKTsKLX0KLQotLyoqCi0gKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIEVybGFuZyAidHlwZSIgKG1hY3JvIGZvciBpbnQgY29uc3RhbnRzKQotICovCi1zdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICI/dFR5cGVfU1RSSU5HIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gIj90VHlwZV9CT09MIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIj90VHlwZV9CWVRFIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiP3RUeXBlX0kxNiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gIj90VHlwZV9JMzIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICI/dFR5cGVfSTY0IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiP3RUeXBlX0RPVUJMRSI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiP3RUeXBlX0kzMiI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiP3RUeXBlX1NUUlVDVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIj90VHlwZV9NQVAiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICI/dFR5cGVfU0VUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIj90VHlwZV9MSVNUIjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZSBhbiBFcmxhbmcgdGVybSB3aGljaCByZXByZXNlbnRzIGEgdGhyaWZ0IHR5cGUKLSAqLwotc3RkOjpzdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjpyZW5kZXJfdHlwZV90ZXJtKHRfdHlwZSogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGV4cGFuZF9zdHJ1Y3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZXh0ZW5kZWRfaW5mbykgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJldHVybiAic3RyaW5nIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gImJvb2wiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJldHVybiAiYnl0ZSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gImkxNiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gImkzMiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gImk2NCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gImRvdWJsZSI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiaTMyIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgaWYgKGV4cGFuZF9zdHJ1Y3RzKSB7Ci0KLSAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGJ1ZjsKLSAgICAgIGJ1ZiA8PCAie3N0cnVjdCwgWyI7Ci0gICAgICBzdHJpbmcgZmllbGRfaW5kZW50KGJ1Zi5zdHIoKS5zaXplKCksICcgJyk7Ci0KLSAgICAgIHRfc3RydWN0OjptZW1iZXJzX3R5cGUgY29uc3QmIGZpZWxkcyA9IHN0YXRpY19jYXN0PHRfc3RydWN0Kj4odHlwZSktPmdldF9tZW1iZXJzKCk7Ci0gICAgICB0X3N0cnVjdDo6bWVtYmVyc190eXBlOjpjb25zdF9pdGVyYXRvciBpLCBlbmQgPSBmaWVsZHMuZW5kKCk7Ci0gICAgICBmb3IgKGkgPSBmaWVsZHMuYmVnaW4oKTsgaSAhPSBlbmQ7KSB7Ci0gICAgICAgIHRfc3RydWN0OjptZW1iZXJzX3R5cGU6OnZhbHVlX3R5cGUgbWVtYmVyID0gKmk7Ci0gICAgICAgIGludDMyX3Qga2V5ID0gbWVtYmVyLT5nZXRfa2V5KCk7Ci0gICAgICAgIHN0cmluZyB0eXBlID0gcmVuZGVyX3R5cGVfdGVybShtZW1iZXItPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSk7IC8vIHJlY3Vyc2l2ZSBjYWxsCi0KLSAgICAgICAgaWYgKCFleHRlbmRlZF9pbmZvKSB7Ci0gICAgICAgICAgLy8gQ29udmVydCB0byBmb3JtYXQ6IHtzdHJ1Y3QsIFt7RmlkLCBUeXBlfXwuLi5dfQotICAgICAgICAgIGJ1ZiA8PCAieyIgPDwga2V5IDw8ICIsICIgPDwgdHlwZSA8PCAifSI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgLy8gQ29udmVydCB0byBmb3JtYXQ6IHtzdHJ1Y3QsIFt7RmlkLCBSZXEsIFR5cGUsIE5hbWUsIERlZn18Li4uXX0KLSAgICAgICAgICBzdHJpbmcgbmFtZSA9IG1lbWJlci0+Z2V0X25hbWUoKTsKLSAgICAgICAgICBzdHJpbmcgdmFsdWUgPSByZW5kZXJfbWVtYmVyX3ZhbHVlKG1lbWJlcik7Ci0gICAgICAgICAgc3RyaW5nIHJlcXVpcmVkbmVzcyA9IHJlbmRlcl9tZW1iZXJfcmVxdWlyZWRuZXNzKG1lbWJlcik7Ci0gICAgICAgICAgYnVmIDw8ICJ7IiA8PCBrZXkgPDwgIiwgIiA8PCByZXF1aXJlZG5lc3MgPDwgIiwgIiA8PCB0eXBlIDw8ICIsICIgPDwgYXRvbWlmeShuYW1lKSA8PCAiLCAiCi0gICAgICAgICAgICAgIDw8IHZhbHVlIDw8ICJ9IjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgrK2kgIT0gZW5kKSB7Ci0gICAgICAgICAgYnVmIDw8ICIsIiA8PCBlbmRsIDw8IGZpZWxkX2luZGVudDsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBidWYgPDwgIl19IiA8PCBlbmRsOwotICAgICAgcmV0dXJuIGJ1Zi5zdHIoKTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuICJ7c3RydWN0LCB7IiArIGF0b21pZnkodHlwZV9tb2R1bGUodHlwZSkpICsgIiwgIiArIHR5cGVfbmFtZSh0eXBlKSArICJ9fSI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgLy8ge21hcCwgS2V5VHlwZSwgVmFsVHlwZX0KLSAgICB0X3R5cGUqIGtleV90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdmFsX3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0KLSAgICByZXR1cm4gInttYXAsICIgKyByZW5kZXJfdHlwZV90ZXJtKGtleV90eXBlLCBmYWxzZSkgKyAiLCAiICsgcmVuZGVyX3R5cGVfdGVybSh2YWxfdHlwZSwgZmFsc2UpCi0gICAgICAgICAgICsgIn0iOwotCi0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0KLSAgICByZXR1cm4gIntzZXQsICIgKyByZW5kZXJfdHlwZV90ZXJtKGVsZW1fdHlwZSwgZmFsc2UpICsgIn0iOwotCi0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLQotICAgIHJldHVybiAie2xpc3QsICIgKyByZW5kZXJfdHlwZV90ZXJtKGVsZW1fdHlwZSwgZmFsc2UpICsgIn0iOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi1zdGQ6OnN0cmluZyB0X2VybF9nZW5lcmF0b3I6OnR5cGVfbW9kdWxlKHRfdHlwZSogdHR5cGUpIHsKLSAgcmV0dXJuIG1ha2Vfc2FmZV9mb3JfbW9kdWxlX25hbWUodHR5cGUtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lKCkpICsgIl90eXBlcyI7Ci19Ci0KLVRIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoCi0gICAgZXJsLAotICAgICJFcmxhbmciLAotICAgICIgICAgbGVnYWN5bmFtZXM6IE91dHB1dCBmaWxlcyByZXRhaW4gbmFtaW5nIGNvbnZlbnRpb25zIG9mIFRocmlmdCAwLjkuMSBhbmQgZWFybGllci5cbiIKLSAgICAiICAgIG1hcHM6ICAgICAgICBHZW5lcmF0ZSBtYXBzIGluc3RlYWQgb2YgZGljdHMuXG4iCi0gICAgIiAgICBvdHAxNjogICAgICAgR2VuZXJhdGUgbm9uLW5hbWVzcGFjZWQgZGljdCBhbmQgc2V0IGluc3RlYWQgb2YgZGljdDpkaWN0IGFuZCBzZXRzOnNldC5cbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2dlbmVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc3NjBkNy4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInRfZ2VuZXJhdG9yLmgiCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCi0vKioKLSAqIFRvcCBsZXZlbCBwcm9ncmFtIGdlbmVyYXRpb24gZnVuY3Rpb24uIENhbGxzIHRoZSBnZW5lcmF0b3Igc3ViY2xhc3MgbWV0aG9kcwotICogZm9yIHByZXBhcmluZyBmaWxlIHN0cmVhbXMgZXRjLiB0aGVuIGl0ZXJhdGVzIG92ZXIgYWxsIHRoZSBwYXJ0cyBvZiB0aGUKLSAqIHByb2dyYW0gdG8gcGVyZm9ybSB0aGUgY29ycmVjdCBhY3Rpb25zLgotICoKLSAqIEBwYXJhbSBwcm9ncmFtIFRoZSB0aHJpZnQgcHJvZ3JhbSB0byBjb21waWxlIGludG8gQysrIHNvdXJjZQotICovCi12b2lkIHRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9ncmFtKCkgewotICAvLyBJbml0aWFsaXplIHRoZSBnZW5lcmF0b3IKLSAgaW5pdF9nZW5lcmF0b3IoKTsKLQotICAvLyBHZW5lcmF0ZSBlbnVtcwotICB2ZWN0b3I8dF9lbnVtKj4gZW51bXMgPSBwcm9ncmFtXy0+Z2V0X2VudW1zKCk7Ci0gIHZlY3Rvcjx0X2VudW0qPjo6aXRlcmF0b3IgZW5faXRlcjsKLSAgZm9yIChlbl9pdGVyID0gZW51bXMuYmVnaW4oKTsgZW5faXRlciAhPSBlbnVtcy5lbmQoKTsgKytlbl9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfZW51bSgqZW5faXRlcik7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSB0eXBlZGVmcwotICB2ZWN0b3I8dF90eXBlZGVmKj4gdHlwZWRlZnMgPSBwcm9ncmFtXy0+Z2V0X3R5cGVkZWZzKCk7Ci0gIHZlY3Rvcjx0X3R5cGVkZWYqPjo6aXRlcmF0b3IgdGRfaXRlcjsKLSAgZm9yICh0ZF9pdGVyID0gdHlwZWRlZnMuYmVnaW4oKTsgdGRfaXRlciAhPSB0eXBlZGVmcy5lbmQoKTsgKyt0ZF9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfdHlwZWRlZigqdGRfaXRlcik7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSBzdHJ1Y3RzLCBleGNlcHRpb25zLCBhbmQgdW5pb25zIGluIGRlY2xhcmVkIG9yZGVyCi0gIHZlY3Rvcjx0X3N0cnVjdCo+IG9iamVjdHMgPSBwcm9ncmFtXy0+Z2V0X29iamVjdHMoKTsKLQotICB2ZWN0b3I8dF9zdHJ1Y3QqPjo6aXRlcmF0b3Igb19pdGVyOwotICBmb3IgKG9faXRlciA9IG9iamVjdHMuYmVnaW4oKTsgb19pdGVyICE9IG9iamVjdHMuZW5kKCk7ICsrb19pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfZm9yd2FyZF9kZWNsYXJhdGlvbigqb19pdGVyKTsKLSAgfQotICBmb3IgKG9faXRlciA9IG9iamVjdHMuYmVnaW4oKTsgb19pdGVyICE9IG9iamVjdHMuZW5kKCk7ICsrb19pdGVyKSB7Ci0gICAgaWYgKCgqb19pdGVyKS0+aXNfeGNlcHRpb24oKSkgewotICAgICAgZ2VuZXJhdGVfeGNlcHRpb24oKm9faXRlcik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGdlbmVyYXRlX3N0cnVjdCgqb19pdGVyKTsKLSAgICB9Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSBjb25zdGFudHMKLSAgdmVjdG9yPHRfY29uc3QqPiBjb25zdHMgPSBwcm9ncmFtXy0+Z2V0X2NvbnN0cygpOwotICBnZW5lcmF0ZV9jb25zdHMoY29uc3RzKTsKLQotICAvLyBHZW5lcmF0ZSBzZXJ2aWNlcwotICB2ZWN0b3I8dF9zZXJ2aWNlKj4gc2VydmljZXMgPSBwcm9ncmFtXy0+Z2V0X3NlcnZpY2VzKCk7Ci0gIHZlY3Rvcjx0X3NlcnZpY2UqPjo6aXRlcmF0b3Igc3ZfaXRlcjsKLSAgZm9yIChzdl9pdGVyID0gc2VydmljZXMuYmVnaW4oKTsgc3ZfaXRlciAhPSBzZXJ2aWNlcy5lbmQoKTsgKytzdl9pdGVyKSB7Ci0gICAgc2VydmljZV9uYW1lXyA9IGdldF9zZXJ2aWNlX25hbWUoKnN2X2l0ZXIpOwotICAgIGdlbmVyYXRlX3NlcnZpY2UoKnN2X2l0ZXIpOwotICB9Ci0KLSAgLy8gQ2xvc2UgdGhlIGdlbmVyYXRvcgotICBjbG9zZV9nZW5lcmF0b3IoKTsKLX0KLQotc3RyaW5nIHRfZ2VuZXJhdG9yOjplc2NhcGVfc3RyaW5nKGNvbnN0IHN0cmluZyYgaW4pIGNvbnN0IHsKLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotICBmb3IgKHN0cmluZzo6Y29uc3RfaXRlcmF0b3IgaXQgPSBpbi5iZWdpbigpOyBpdCA8IGluLmVuZCgpOyBpdCsrKSB7Ci0gICAgc3RkOjptYXA8Y2hhciwgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciByZXMgPSBlc2NhcGVfLmZpbmQoKml0KTsKLSAgICBpZiAocmVzICE9IGVzY2FwZV8uZW5kKCkpIHsKLSAgICAgIHJlc3VsdC5hcHBlbmQocmVzLT5zZWNvbmQpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQucHVzaF9iYWNrKCppdCk7Ci0gICAgfQotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXZvaWQgdF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cyh2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgewotICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfY29uc3QoKmNfaXRlcik7Ci0gIH0KLX0KLQotdm9pZCB0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBjb21tZW50X3N0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBsaW5lX3ByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgY29udGVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGNvbW1lbnRfZW5kKSB7Ci0gIGlmIChjb21tZW50X3N0YXJ0ICE9ICIiKQotICAgIGluZGVudChvdXQpIDw8IGNvbW1lbnRfc3RhcnQ7Ci0gIHN0cmluZ3N0cmVhbSBkb2NzKGNvbnRlbnRzLCBpb3NfYmFzZTo6aW4pOwotICB3aGlsZSAoIShkb2NzLmVvZigpIHx8IGRvY3MuZmFpbCgpKSkgewotICAgIGNoYXIgbGluZVsxMDI0XTsKLSAgICBkb2NzLmdldGxpbmUobGluZSwgMTAyNCk7Ci0KLSAgICAvLyBKdXN0IHBybnQgYSBuZXdsaW5lIHdoZW4gdGhlIGxpbmUgJiBwcmVmaXggYXJlIGVtcHR5LgotICAgIGlmIChzdHJsZW4obGluZSkgPT0gMCAmJiBsaW5lX3ByZWZpeCA9PSAiIiAmJiAhZG9jcy5lb2YoKSkgewotICAgICAgb3V0IDw8IHN0ZDo6ZW5kbDsKLSAgICB9IGVsc2UgaWYgKHN0cmxlbihsaW5lKSA+IDAgfHwgIWRvY3MuZW9mKCkpIHsgLy8gc2tpcCB0aGUgZW1wdHkgbGFzdCBsaW5lCi0gICAgICBpbmRlbnQob3V0KSA8PCBsaW5lX3ByZWZpeCA8PCBsaW5lIDw8IHN0ZDo6ZW5kbDsKLSAgICB9Ci0gIH0KLSAgaWYgKGNvbW1lbnRfZW5kICE9ICIiKQotICAgIGluZGVudChvdXQpIDw8IGNvbW1lbnRfZW5kOwotfQotCi12b2lkIHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpyZWdpc3Rlcl9nZW5lcmF0b3IodF9nZW5lcmF0b3JfZmFjdG9yeSogZmFjdG9yeSkgewotICBnZW5fbWFwX3QmIHRoZV9tYXAgPSBnZXRfZ2VuZXJhdG9yX21hcCgpOwotICBpZiAodGhlX21hcC5maW5kKGZhY3RvcnktPmdldF9zaG9ydF9uYW1lKCkpICE9IHRoZV9tYXAuZW5kKCkpIHsKLSAgICBmYWlsdXJlKCJEdXBsaWNhdGUgZ2VuZXJhdG9ycyBmb3IgbGFuZ3VhZ2UgXCIlc1wiIVxuIiwgZmFjdG9yeS0+Z2V0X3Nob3J0X25hbWUoKS5jX3N0cigpKTsKLSAgfQotICB0aGVfbWFwW2ZhY3RvcnktPmdldF9zaG9ydF9uYW1lKCldID0gZmFjdG9yeTsKLX0KLQotdF9nZW5lcmF0b3IqIHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpnZXRfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwgY29uc3Qgc3RyaW5nJiBvcHRpb25zKSB7Ci0gIHN0cmluZzo6c2l6ZV90eXBlIGNvbG9uID0gb3B0aW9ucy5maW5kKCc6Jyk7Ci0gIHN0cmluZyBsYW5ndWFnZSA9IG9wdGlvbnMuc3Vic3RyKDAsIGNvbG9uKTsKLQotICBtYXA8c3RyaW5nLCBzdHJpbmc+IHBhcnNlZF9vcHRpb25zOwotICBpZiAoY29sb24gIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgc3RyaW5nOjpzaXplX3R5cGUgcG9zID0gY29sb24gKyAxOwotICAgIHdoaWxlIChwb3MgIT0gc3RyaW5nOjpucG9zICYmIHBvcyA8IG9wdGlvbnMuc2l6ZSgpKSB7Ci0gICAgICBzdHJpbmc6OnNpemVfdHlwZSBuZXh0X3BvcyA9IG9wdGlvbnMuZmluZCgnLCcsIHBvcyk7Ci0gICAgICBzdHJpbmcgb3B0aW9uID0gb3B0aW9ucy5zdWJzdHIocG9zLCBuZXh0X3BvcyAtIHBvcyk7Ci0gICAgICBwb3MgPSAoKG5leHRfcG9zID09IHN0cmluZzo6bnBvcykgPyBuZXh0X3BvcyA6IG5leHRfcG9zICsgMSk7Ci0KLSAgICAgIHN0cmluZzo6c2l6ZV90eXBlIHNlcGFyYXRvciA9IG9wdGlvbi5maW5kKCc9Jyk7Ci0gICAgICBzdHJpbmcga2V5LCB2YWx1ZTsKLSAgICAgIGlmIChzZXBhcmF0b3IgPT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgICAgIGtleSA9IG9wdGlvbjsKLSAgICAgICAgdmFsdWUgPSAiIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGtleSA9IG9wdGlvbi5zdWJzdHIoMCwgc2VwYXJhdG9yKTsKLSAgICAgICAgdmFsdWUgPSBvcHRpb24uc3Vic3RyKHNlcGFyYXRvciArIDEpOwotICAgICAgfQotCi0gICAgICBwYXJzZWRfb3B0aW9uc1trZXldID0gdmFsdWU7Ci0gICAgfQotICB9Ci0KLSAgZ2VuX21hcF90JiB0aGVfbWFwID0gZ2V0X2dlbmVyYXRvcl9tYXAoKTsKLSAgZ2VuX21hcF90OjppdGVyYXRvciBpdGVyID0gdGhlX21hcC5maW5kKGxhbmd1YWdlKTsKLQotICBpZiAoaXRlciA9PSB0aGVfbWFwLmVuZCgpKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICByZXR1cm4gaXRlci0+c2Vjb25kLT5nZXRfZ2VuZXJhdG9yKHByb2dyYW0sIHBhcnNlZF9vcHRpb25zLCBvcHRpb25zKTsKLX0KLQotdF9nZW5lcmF0b3JfcmVnaXN0cnk6Omdlbl9tYXBfdCYgdF9nZW5lcmF0b3JfcmVnaXN0cnk6OmdldF9nZW5lcmF0b3JfbWFwKCkgewotICAvLyBodHRwOi8vd3d3LnBhcmFzaGlmdC5jb20vYysrLWZhcS1saXRlL2N0b3JzLmh0bWwjZmFxLTEwLjEyCi0gIHN0YXRpYyBnZW5fbWFwX3QqIHRoZV9tYXAgPSBuZXcgZ2VuX21hcF90KCk7Ci0gIHJldHVybiAqdGhlX21hcDsKLX0KLQotdF9nZW5lcmF0b3JfZmFjdG9yeTo6dF9nZW5lcmF0b3JfZmFjdG9yeShjb25zdCBzdGQ6OnN0cmluZyYgc2hvcnRfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGxvbmdfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRvY3VtZW50YXRpb24pCi0gIDogc2hvcnRfbmFtZV8oc2hvcnRfbmFtZSksIGxvbmdfbmFtZV8obG9uZ19uYW1lKSwgZG9jdW1lbnRhdGlvbl8oZG9jdW1lbnRhdGlvbikgewotICB0X2dlbmVyYXRvcl9yZWdpc3RyeTo6cmVnaXN0ZXJfZ2VuZXJhdG9yKHRoaXMpOwotfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2dlbmVyYXRvci5oIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2dlbmVyYXRvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWQ4NzhhLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDI4NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVF9HRU5FUkFUT1JfSAotI2RlZmluZSBUX0dFTkVSQVRPUl9ICi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgInBhcnNlL3RfcHJvZ3JhbS5oIgotI2luY2x1ZGUgImdsb2JhbHMuaCIKLSNpbmNsdWRlICJ0X2dlbmVyYXRvcl9yZWdpc3RyeS5oIgotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIGEgdGhyaWZ0IGNvZGUgZ2VuZXJhdG9yLiBUaGlzIGNsYXNzIGRlZmluZXMgdGhlIGJhc2ljCi0gKiByb3V0aW5lcyBmb3IgY29kZSBnZW5lcmF0aW9uIGFuZCBjb250YWlucyB0aGUgdG9wIGxldmVsIG1ldGhvZCB0aGF0Ci0gKiBkaXNwYXRjaGVzIGNvZGUgZ2VuZXJhdGlvbiBhY3Jvc3MgdmFyaW91cyBjb21wb25lbnRzLgotICoKLSAqLwotY2xhc3MgdF9nZW5lcmF0b3IgewotcHVibGljOgotICB0X2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0pIHsKLSAgICB0bXBfID0gMDsKLSAgICBpbmRlbnRfID0gMDsKLSAgICBwcm9ncmFtXyA9IHByb2dyYW07Ci0gICAgcHJvZ3JhbV9uYW1lXyA9IGdldF9wcm9ncmFtX25hbWUocHJvZ3JhbSk7Ci0gICAgZXNjYXBlX1snXG4nXSA9ICJcXG4iOwotICAgIGVzY2FwZV9bJ1xyJ10gPSAiXFxyIjsKLSAgICBlc2NhcGVfWydcdCddID0gIlxcdCI7Ci0gICAgZXNjYXBlX1snIiddID0gIlxcXCIiOwotICAgIGVzY2FwZV9bJ1xcJ10gPSAiXFxcXCI7Ci0gIH0KLQotICB2aXJ0dWFsIH50X2dlbmVyYXRvcigpIHt9Ci0KLSAgLyoqCi0gICAqIEZyYW1ld29yayBnZW5lcmF0b3IgbWV0aG9kIHRoYXQgaXRlcmF0ZXMgb3ZlciBhbGwgdGhlIHBhcnRzIG9mIGEgcHJvZ3JhbQotICAgKiBhbmQgcGVyZm9ybXMgZ2VuZXJhbCBhY3Rpb25zLiBUaGlzIGlzIGltcGxlbWVudGVkIGJ5IHRoZSBiYXNlIGNsYXNzIGFuZAotICAgKiBzaG91bGQgbm90IG5vcm1hbGx5IGJlIG92ZXJ3cml0dGVuIGluIHRoZSBzdWJjbGFzc2VzLgotICAgKi8KLSAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX3Byb2dyYW0oKTsKLQotICBjb25zdCB0X3Byb2dyYW0qIGdldF9wcm9ncmFtKCkgY29uc3QgeyByZXR1cm4gcHJvZ3JhbV87IH0KLQotICB2b2lkIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjb21tZW50X3N0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBsaW5lX3ByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY29udGVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNvbW1lbnRfZW5kKTsKLQotICAvKioKLSAgICogY2hlY2sgd2hldGhlciBzdWItbmFtZXNwYWNlIGRlY2xhcmFjdGlvbiBpcyB1c2VkIGJ5IGdlbmVyYXRvci4KLSAgICogZS5nLiBhbGxvdwotICAgKiBuYW1lc3BhY2UgcHkudHdpc3RlZCBiYXIKLSAgICogdG8gc3BlY2lmeSBuYW1lc3BhY2UgdG8gdXNlIHdoZW4gLWdlbiBweTp0d2lzdGVkIGlzIHNwZWNpZmllZC4KLSAgICogV2lsbCBiZSBjYWxsZWQgd2l0aCBzdWJuYW1lc3BhY2UsIGkuZS4gaXNfdmFsaWRfbmFtZXNwYWNlKCJ0d2lzdGVkIikKLSAgICogd2lsbCBiZSBjYWxsZWQgZm9yIHRoZSBhYm92ZSBleGFtcGxlLgotICAgKi8KLSAgc3RhdGljIGJvb2wgaXNfdmFsaWRfbmFtZXNwYWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWJfbmFtZXNwYWNlKSB7Ci0gICAgKHZvaWQpc3ViX25hbWVzcGFjZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogRXNjYXBlIHN0cmluZyB0byB1c2Ugb25lIGluIGdlbmVyYXRlZCBzb3VyY2VzLgotICAgKi8KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBlc2NhcGVfc3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBpbikgY29uc3Q7Ci0KLSAgc3RkOjpzdHJpbmcgZ2V0X2VzY2FwZWRfc3RyaW5nKHRfY29uc3RfdmFsdWUqIGNvbnN0dmFsKSB7Ci0gICAgcmV0dXJuIGVzY2FwZV9zdHJpbmcoY29uc3R2YWwtPmdldF9zdHJpbmcoKSk7Ci0gIH0KLQotcHJvdGVjdGVkOgotICAvKioKLSAgICogT3B0aW9uYWwgbWV0aG9kcyB0aGF0IG1heSBiZSBpbWxlbWVudGVkIGJ5IHN1YmNsYXNzZXMgdG8gdGFrZSBuZWNlc3NhcnkKLSAgICogc3RlcHMgYXQgdGhlIGJlZ2lubmluZyBvciBlbmQgb2YgY29kZSBnZW5lcmF0aW9uLgotICAgKi8KLQotICB2aXJ0dWFsIHZvaWQgaW5pdF9nZW5lcmF0b3IoKSB7fQotICB2aXJ0dWFsIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCkge30KLQotICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpOwotCi0gIC8qKgotICAgKiBQdXJlIHZpcnR1YWwgbWV0aG9kcyBpbXBsZW1lbnRlZCBieSB0aGUgZ2VuZXJhdG9yIHN1YmNsYXNzZXMuCi0gICAqLwotCi0gIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpID0gMDsKLSAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgPSAwOwotICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7ICh2b2lkKXRjb25zdDsgfQotICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpID0gMDsKLSAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX2ZvcndhcmRfZGVjbGFyYXRpb24odF9zdHJ1Y3QqKSB7fQotICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgewotICAgIC8vIEJ5IGRlZmF1bHQgZXhjZXB0aW9ucyBhcmUgdGhlIHNhbWUgYXMgc3RydWN0cwotICAgIGdlbmVyYXRlX3N0cnVjdCh0eGNlcHRpb24pOwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCB0byBnZXQgdGhlIHByb2dyYW0gbmFtZSwgbWF5IGJlIG92ZXJyaWRkZW4KLSAgICovCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0X3Byb2dyYW1fbmFtZSh0X3Byb2dyYW0qIHRwcm9ncmFtKSB7IHJldHVybiB0cHJvZ3JhbS0+Z2V0X25hbWUoKTsgfQotCi0gIC8qKgotICAgKiBNZXRob2QgdG8gZ2V0IHRoZSBzZXJ2aWNlIG5hbWUsIG1heSBiZSBvdmVycmlkZGVuCi0gICAqLwotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldF9zZXJ2aWNlX25hbWUodF9zZXJ2aWNlKiB0c2VydmljZSkgeyByZXR1cm4gdHNlcnZpY2UtPmdldF9uYW1lKCk7IH0KLQotICAvKioKLSAgICogR2V0IHRoZSBjdXJyZW50IG91dHB1dCBkaXJlY3RvcnkKLSAgICovCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0X291dF9kaXIoKSBjb25zdCB7Ci0gICAgaWYgKHByb2dyYW1fLT5pc19vdXRfcGF0aF9hYnNvbHV0ZSgpKSB7Ci0gICAgICByZXR1cm4gcHJvZ3JhbV8tPmdldF9vdXRfcGF0aCgpICsgIi8iOwotICAgIH0KLQotICAgIHJldHVybiBwcm9ncmFtXy0+Z2V0X291dF9wYXRoKCkgKyBvdXRfZGlyX2Jhc2VfICsgIi8iOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSB1bmlxdWUgdGVtcG9yYXJ5IHZhcmlhYmxlIG5hbWUsIHdoaWNoIGlzIGp1c3QgIm5hbWUiIHdpdGggYQotICAgKiBudW1iZXIgYXBwZW5kZWQgdG8gaXQgKGkuZS4gbmFtZTM1KQotICAgKi8KLSAgc3RkOjpzdHJpbmcgdG1wKHN0ZDo6c3RyaW5nIG5hbWUpIHsKLSAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotICAgIG91dCA8PCBuYW1lIDw8IHRtcF8rKzsKLSAgICByZXR1cm4gb3V0LnN0cigpOwotICB9Ci0KLSAgLyoqCi0gICAqIEluZGVudGF0aW9uIGxldmVsIG1vZGlmaWVycwotICAgKi8KLQotICB2b2lkIGluZGVudF91cCgpIHsgKytpbmRlbnRfOyB9Ci0KLSAgdm9pZCBpbmRlbnRfZG93bigpIHsgLS1pbmRlbnRfOyB9Ci0KLSAgLyoqCi0gICAqIEluZGVudGF0aW9uIHByaW50IGZ1bmN0aW9uCi0gICAqLwotICBzdGQ6OnN0cmluZyBpbmRlbnQoKSB7Ci0gICAgc3RkOjpzdHJpbmcgaW5kID0gIiI7Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGluZGVudF87ICsraSkgewotICAgICAgaW5kICs9ICIgICI7Ci0gICAgfQotICAgIHJldHVybiBpbmQ7Ci0gIH0KLQotICAvKioKLSAgICogSW5kZW50YXRpb24gdXRpbGl0eSB3cmFwcGVyCi0gICAqLwotICBzdGQ6Om9zdHJlYW0mIGluZGVudChzdGQ6Om9zdHJlYW0mIG9zKSB7IHJldHVybiBvcyA8PCBpbmRlbnQoKTsgfQotCi0gIC8qKgotICAgKiBDYXBpdGFsaXphdGlvbiBoZWxwZXJzCi0gICAqLwotICBzdGQ6OnN0cmluZyBjYXBpdGFsaXplKHN0ZDo6c3RyaW5nIGluKSB7Ci0gICAgaW5bMF0gPSB0b3VwcGVyKGluWzBdKTsKLSAgICByZXR1cm4gaW47Ci0gIH0KLSAgc3RkOjpzdHJpbmcgZGVjYXBpdGFsaXplKHN0ZDo6c3RyaW5nIGluKSB7Ci0gICAgaW5bMF0gPSB0b2xvd2VyKGluWzBdKTsKLSAgICByZXR1cm4gaW47Ci0gIH0KLSAgc3RhdGljIHN0ZDo6c3RyaW5nIGxvd2VyY2FzZShzdGQ6OnN0cmluZyBpbikgewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW4uc2l6ZSgpOyArK2kpIHsKLSAgICAgIGluW2ldID0gdG9sb3dlcihpbltpXSk7Ci0gICAgfQotICAgIHJldHVybiBpbjsKLSAgfQotICBzdGF0aWMgc3RkOjpzdHJpbmcgdXBwZXJjYXNlKHN0ZDo6c3RyaW5nIGluKSB7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbi5zaXplKCk7ICsraSkgewotICAgICAgaW5baV0gPSB0b3VwcGVyKGluW2ldKTsKLSAgICB9Ci0gICAgcmV0dXJuIGluOwotICB9Ci0gIC8qKgotICAgKiBUcmFuc2Zvcm1zIGEgY2FtZWwgY2FzZSBzdHJpbmcgdG8gYW4gZXF1aXZhbGVudCBvbmUgc2VwYXJhdGVkIGJ5IHVuZGVyc2NvcmVzCi0gICAqIGUuZy4gYU11bHRpV29yZCAtPiBhX211bHRpX3dvcmQKLSAgICogICAgICBzb21lTmFtZSAgIC0+IHNvbWVfbmFtZQotICAgKiAgICAgIENhbWVsQ2FzZSAgLT4gY2FtZWxfY2FzZQotICAgKiAgICAgIG5hbWUgICAgICAgLT4gbmFtZQotICAgKiAgICAgIE5hbWUgICAgICAgLT4gbmFtZQotICAgKi8KLSAgc3RkOjpzdHJpbmcgdW5kZXJzY29yZShzdGQ6OnN0cmluZyBpbikgewotICAgIGluWzBdID0gdG9sb3dlcihpblswXSk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBpbi5zaXplKCk7ICsraSkgewotICAgICAgaWYgKGlzdXBwZXIoaW5baV0pKSB7Ci0gICAgICAgIGluW2ldID0gdG9sb3dlcihpbltpXSk7Ci0gICAgICAgIGluLmluc2VydChpLCAiXyIpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gaW47Ci0gIH0KLSAgLyoqCi0gICAgKiBUcmFuc2Zvcm1zIGEgc3RyaW5nIHdpdGggd29yZHMgc2VwYXJhdGVkIGJ5IHVuZGVyc2NvcmVzIHRvIGEgY2FtZWwgY2FzZSBlcXVpdmFsZW50Ci0gICAgKiBlLmcuIGFfbXVsdGlfd29yZCAtPiBhTXVsdGlXb3JkCi0gICAgKiAgICAgIHNvbWVfbmFtZSAgICAtPiAgc29tZU5hbWUKLSAgICAqICAgICAgbmFtZSAgICAgICAgIC0+ICBuYW1lCi0gICAgKi8KLSAgc3RkOjpzdHJpbmcgY2FtZWxjYXNlKHN0ZDo6c3RyaW5nIGluKSB7Ci0gICAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKLSAgICBib29sIHVuZGVyc2NvcmUgPSBmYWxzZTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW4uc2l6ZSgpOyBpKyspIHsKLSAgICAgIGlmIChpbltpXSA9PSAnXycpIHsKLSAgICAgICAgdW5kZXJzY29yZSA9IHRydWU7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgaWYgKHVuZGVyc2NvcmUpIHsKLSAgICAgICAgb3V0IDw8IChjaGFyKXRvdXBwZXIoaW5baV0pOwotICAgICAgICB1bmRlcnNjb3JlID0gZmFsc2U7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgb3V0IDw8IGluW2ldOwotICAgIH0KLQotICAgIHJldHVybiBvdXQuc3RyKCk7Ci0gIH0KLQotcHVibGljOgotICAvKioKLSAgICogR2V0IHRoZSB0cnVlIHR5cGUgYmVoaW5kIGEgc2VyaWVzIG9mIHR5cGVkZWZzLgotICAgKi8KLSAgc3RhdGljIHRfdHlwZSogZ2V0X3RydWVfdHlwZSh0X3R5cGUqIHR5cGUpIHsgcmV0dXJuIHR5cGUtPmdldF90cnVlX3R5cGUoKTsgfQotCi1wcm90ZWN0ZWQ6Ci0gIC8qKgotICAgKiBUaGUgcHJvZ3JhbSBiZWluZyBnZW5lcmF0ZWQKLSAgICovCi0gIHRfcHJvZ3JhbSogcHJvZ3JhbV87Ci0KLSAgLyoqCi0gICAqIFF1aWNrIGFjY2Vzc29yIGZvciBmb3JtYXR0ZWQgcHJvZ3JhbSBuYW1lIHRoYXQgaXMgY3VycmVudGx5IGJlaW5nCi0gICAqIGdlbmVyYXRlZC4KLSAgICovCi0gIHN0ZDo6c3RyaW5nIHByb2dyYW1fbmFtZV87Ci0KLSAgLyoqCi0gICAqIFF1aWNrIGFjY2Vzc29yIGZvciBmb3JtYXR0ZWQgc2VydmljZSBuYW1lIHRoYXQgaXMgY3VycmVudGx5IGJlaW5nCi0gICAqIGdlbmVyYXRlZC4KLSAgICovCi0gIHN0ZDo6c3RyaW5nIHNlcnZpY2VfbmFtZV87Ci0KLSAgLyoqCi0gICAqIE91dHB1dCB0eXBlLXNwZWNpZmMgZGlyZWN0b3J5IG5hbWUgKCJnZW4tKiIpCi0gICAqLwotICBzdGQ6OnN0cmluZyBvdXRfZGlyX2Jhc2VfOwotCi0gIC8qKgotICAgKiBNYXAgb2YgY2hhcmFjdGVycyB0byBlc2NhcGUgaW4gc3RyaW5nIGxpdGVyYWxzLgotICAgKi8KLSAgc3RkOjptYXA8Y2hhciwgc3RkOjpzdHJpbmc+IGVzY2FwZV87Ci0KLXByaXZhdGU6Ci0gIC8qKgotICAgKiBDdXJyZW50IGNvZGUgaW5kZW50YXRpb24gbGV2ZWwKLSAgICovCi0gIGludCBpbmRlbnRfOwotCi0gIC8qKgotICAgKiBUZW1wb3JhcnkgdmFyaWFibGUgY291bnRlciwgZm9yIG1ha2luZyB1bmlxdWUgdmFyaWFibGUgbmFtZXMKLSAgICovCi0gIGludCB0bXBfOwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfZ2VuZXJhdG9yX3JlZ2lzdHJ5LmggYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfZ2VuZXJhdG9yX3JlZ2lzdHJ5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4NTIzODUuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2dlbmVyYXRvcl9yZWdpc3RyeS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX0dFTkVSQVRPUl9SRUdJU1RSWV9ICi0jZGVmaW5lIFRfR0VORVJBVE9SX1JFR0lTVFJZX0gKLQotY2xhc3MgdF9nZW5lcmF0b3I7Ci0KLS8qKgotICogQSBmYWN0b3J5IGZvciBwcm9kdWNpbmcgZ2VuZXJhdG9yIGNsYXNzZXMgb2YgYSBwYXJ0aWN1bGFyIGxhbmd1YWdlLgotICoKLSAqIFRoaXMgY2xhc3MgaXMgYWxzbyByZXNwb25zaWJsZSBmb3I6Ci0gKiAgLSBSZWdpc3RlcmluZyBpdHNlbGYgd2l0aCB0aGUgZ2VuZXJhdG9yIHJlZ2lzdHJ5LgotICogIC0gUHJvdmlkaW5nIGRvY3VtZW50YXRpb24gZm9yIHRoZSBnZW5lcmF0b3JzIGl0IHByb2R1Y2VzLgotICovCi1jbGFzcyB0X2dlbmVyYXRvcl9mYWN0b3J5IHsKLXB1YmxpYzoKLSAgdF9nZW5lcmF0b3JfZmFjdG9yeShjb25zdCBzdGQ6OnN0cmluZyYgc2hvcnRfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbG9uZ19uYW1lLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkb2N1bWVudGF0aW9uKTsKLQotICB2aXJ0dWFsIH50X2dlbmVyYXRvcl9mYWN0b3J5KCkge30KLQotICB2aXJ0dWFsIHRfZ2VuZXJhdG9yKiBnZXRfZ2VuZXJhdG9yKAotICAgICAgLy8gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUuCi0gICAgICB0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICAvLyBOb3RlOiBwYXJzZWRfb3B0aW9ucyB3aWxsIG5vdCBleGlzdCBiZXlvbmQgdGhlIGNhbGwgdG8gZ2V0X2dlbmVyYXRvci4KLSAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgLy8gTm90ZTogb3B0aW9uX3N0cmluZyBtaWdodCBub3QgZXhpc3QgYmV5b25kIHRoZSBjYWxsIHRvIGdldF9nZW5lcmF0b3IuCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykgPSAwOwotCi0gIHZpcnR1YWwgYm9vbCBpc192YWxpZF9uYW1lc3BhY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHN1Yl9uYW1lc3BhY2UpID0gMDsKLQotICBzdGQ6OnN0cmluZyBnZXRfc2hvcnRfbmFtZSgpIHsgcmV0dXJuIHNob3J0X25hbWVfOyB9Ci0gIHN0ZDo6c3RyaW5nIGdldF9sb25nX25hbWUoKSB7IHJldHVybiBsb25nX25hbWVfOyB9Ci0gIHN0ZDo6c3RyaW5nIGdldF9kb2N1bWVudGF0aW9uKCkgeyByZXR1cm4gZG9jdW1lbnRhdGlvbl87IH0KLQotcHJpdmF0ZToKLSAgc3RkOjpzdHJpbmcgc2hvcnRfbmFtZV87Ci0gIHN0ZDo6c3RyaW5nIGxvbmdfbmFtZV87Ci0gIHN0ZDo6c3RyaW5nIGRvY3VtZW50YXRpb25fOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIGdlbmVyYXRvcj4KLWNsYXNzIHRfZ2VuZXJhdG9yX2ZhY3RvcnlfaW1wbCA6IHB1YmxpYyB0X2dlbmVyYXRvcl9mYWN0b3J5IHsKLXB1YmxpYzoKLSAgdF9nZW5lcmF0b3JfZmFjdG9yeV9pbXBsKGNvbnN0IHN0ZDo6c3RyaW5nJiBzaG9ydF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGxvbmdfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkb2N1bWVudGF0aW9uKQotICAgIDogdF9nZW5lcmF0b3JfZmFjdG9yeShzaG9ydF9uYW1lLCBsb25nX25hbWUsIGRvY3VtZW50YXRpb24pIHt9Ci0KLSAgdmlydHVhbCB0X2dlbmVyYXRvciogZ2V0X2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpIHsKLSAgICByZXR1cm4gbmV3IGdlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9uX3N0cmluZyk7Ci0gIH0KLQotICB2aXJ0dWFsIGJvb2wgaXNfdmFsaWRfbmFtZXNwYWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWJfbmFtZXNwYWNlKSB7Ci0gICAgcmV0dXJuIGdlbmVyYXRvcjo6aXNfdmFsaWRfbmFtZXNwYWNlKHN1Yl9uYW1lc3BhY2UpOwotICB9Ci19OwotCi1jbGFzcyB0X2dlbmVyYXRvcl9yZWdpc3RyeSB7Ci1wdWJsaWM6Ci0gIHN0YXRpYyB2b2lkIHJlZ2lzdGVyX2dlbmVyYXRvcih0X2dlbmVyYXRvcl9mYWN0b3J5KiBmYWN0b3J5KTsKLQotICBzdGF0aWMgdF9nZW5lcmF0b3IqIGdldF9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLCBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9ucyk7Ci0KLSAgdHlwZWRlZiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgdF9nZW5lcmF0b3JfZmFjdG9yeSo+IGdlbl9tYXBfdDsKLSAgc3RhdGljIGdlbl9tYXBfdCYgZ2V0X2dlbmVyYXRvcl9tYXAoKTsKLQotcHJpdmF0ZToKLSAgdF9nZW5lcmF0b3JfcmVnaXN0cnkoKTsKLSAgdF9nZW5lcmF0b3JfcmVnaXN0cnkoY29uc3QgdF9nZW5lcmF0b3JfcmVnaXN0cnkmKTsKLX07Ci0KLSNkZWZpbmUgVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihsYW5ndWFnZSwgbG9uZ19uYW1lLCBkb2MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY2xhc3MgdF8jI2xhbmd1YWdlIyNfZ2VuZXJhdG9yX2ZhY3RvcnlfaW1wbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIDogcHVibGljIHRfZ2VuZXJhdG9yX2ZhY3RvcnlfaW1wbDx0XyMjbGFuZ3VhZ2UjI19nZW5lcmF0b3I+IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB0XyMjbGFuZ3VhZ2UjI19nZW5lcmF0b3JfZmFjdG9yeV9pbXBsKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIDogdF9nZW5lcmF0b3JfZmFjdG9yeV9pbXBsPHRfIyNsYW5ndWFnZSMjX2dlbmVyYXRvcj4oI2xhbmd1YWdlLCBsb25nX25hbWUsIGRvYykge30gICAgICAgICAgIFwKLSAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgc3RhdGljIHRfIyNsYW5ndWFnZSMjX2dlbmVyYXRvcl9mYWN0b3J5X2ltcGwgX3JlZ2lzdGVyZXI7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2dvX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9nb19nZW5lcmF0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwNGJjNDguLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2dvX2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDM1ODIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogVGhpcyBmaWxlIGlzIHByb2dyYW1tYXRpY2FsbHkgc2FuaXRpemVkIGZvciBzdHlsZToKLSAqIGFzdHlsZSAtLXN0eWxlPTF0YnMgLWYgLXAgLUggLWogLVUgdF9nb19nZW5lcmF0b3IuY2MKLSAqCi0gKiBUaGUgb3V0cHV0IG9mIGFzdHlsZSBzaG91bGQgbm90IGJlIHRha2VuIHVucXVlc3Rpb25pbmdseSwgYnV0IGl0IGlzIGEgZ29vZAotICogZ3VpZGUgZm9yIGVuc3VyaW5nIHVuaWZvcm1pdHkgYW5kIHJlYWRhYmlsaXR5LgotICovCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGNsb2NhbGU+Ci0jaW5jbHVkZSAidF9nZW5lcmF0b3IuaCIKLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotI2luY2x1ZGUgInZlcnNpb24uaCIKLQotdXNpbmcgc3RkOjptYXA7Ci11c2luZyBzdGQ6Om9mc3RyZWFtOwotdXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwotdXNpbmcgc3RkOjpzdHJpbmc7Ci11c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKLXVzaW5nIHN0ZDo6dmVjdG9yOwotCi1zdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCi0KLS8qKgotICogQSBoZWxwZXIgZm9yIGF1dG9tYXRpY2FsbHkgZm9ybWF0dGluZyB0aGUgZW1pdHRlZCBHbyBjb2RlIGZyb20gdGhlIFRocmlmdAotICogSURMIHBlciB0aGUgR28gc3R5bGUgZ3VpZGUuCi0gKgotICogUmV0dXJuczoKLSAqICAtIHRydWUsIGlmIHRoZSBmb3JtYXR0aW5nIHByb2Nlc3Mgc3VjY2VlZGVkLgotICogIC0gZmFsc2UsIGlmIHRoZSBmb3JtYXR0aW5nIHByb2Nlc3MgZmFpbGVkLCB3aGljaCBtZWFucyB0aGUgYmFzaWMgb3V0cHV0IHdhcwotICogICAgICAgICAgIHN0aWxsIGdlbmVyYXRlZC4KLSAqLwotYm9vbCBmb3JtYXRfZ29fb3V0cHV0KGNvbnN0IHN0cmluZyYgZmlsZV9wYXRoKTsKLQotY29uc3Qgc3RyaW5nIGRlZmF1bHRfdGhyaWZ0X2ltcG9ydCA9ICJnaXQuYXBhY2hlLm9yZy90aHJpZnQuZ2l0L2xpYi9nby90aHJpZnQiOwotc3RhdGljIHN0ZDo6c3RyaW5nIHBhY2thZ2VfZmxhZzsKLQotLyoqCi0gKiBHbyBjb2RlIGdlbmVyYXRvci4KLSAqLwotY2xhc3MgdF9nb19nZW5lcmF0b3IgOiBwdWJsaWMgdF9nZW5lcmF0b3IgewotcHVibGljOgotICB0X2dvX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKLSAgICA6IHRfZ2VuZXJhdG9yKHByb2dyYW0pIHsKLSAgICAodm9pZClvcHRpb25fc3RyaW5nOwotICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7Ci0gICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tZ28iOwotICAgIGdlbl90aHJpZnRfaW1wb3J0XyA9IGRlZmF1bHRfdGhyaWZ0X2ltcG9ydDsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJwYWNrYWdlX3ByZWZpeCIpOwotCi0gICAgaWYgKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpIHsKLSAgICAgIGdlbl9wYWNrYWdlX3ByZWZpeF8gPSAoaXRlci0+c2Vjb25kKTsKLSAgICB9Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgidGhyaWZ0X2ltcG9ydCIpOwotCi0gICAgaWYgKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpIHsKLSAgICAgIGdlbl90aHJpZnRfaW1wb3J0XyA9IChpdGVyLT5zZWNvbmQpOwotICAgIH0KLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJwYWNrYWdlIik7Ci0KLSAgICBpZiAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSkgewotICAgICAgcGFja2FnZV9mbGFnID0gKGl0ZXItPnNlY29uZCk7Ci0gICAgfQotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoInJlYWRfd3JpdGVfcHJpdmF0ZSIpOwotICAgIHJlYWRfd3JpdGVfcHJpdmF0ZV8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgiaWdub3JlX2luaXRpYWxpc21zIik7Ci0gICAgaWdub3JlX2luaXRpYWxpc21zXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLSAgfQotCi0gIC8qKgotICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCi0gICAqLwotCi0gIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKLSAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKLQotICAvKioKLSAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7Ci0gIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLQotICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwgY29uc3Qgc3RyaW5nJiBuYW1lKTsKLQotICAvKioKLSAgICogU3RydWN0IGdlbmVyYXRpb24gY29kZQotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX2dvX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX2dvX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2FyZ3MgPSBmYWxzZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfZ29fc3RydWN0X2luaXRpYWxpemVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfYXJnc19vcl9yZXN1bHQgPSBmYWxzZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfaXNzZXRfaGVscGVycyhzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgdHN0cnVjdF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQgPSBmYWxzZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY291bnRzZXRmaWVsZHNfaGVscGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgdHN0cnVjdF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCA9IGZhbHNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9nb19zdHJ1Y3RfcmVhZGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiB0c3RydWN0X25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCA9IGZhbHNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9nb19zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiB0c3RydWN0X25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VzX2NvdW50c2V0ZmllbGRzID0gZmFsc2UpOwotICB2b2lkIGdlbmVyYXRlX2dvX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLSAgdm9pZCBnZXRfcHVibGljaXplZF9uYW1lX2FuZF9kZWZfdmFsdWUodF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcqIE9VVF9wdWJfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSoqIE9VVF9kZWZfdmFsdWUpIGNvbnN0OwotCi0gIC8qKgotICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfcmVtb3RlKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICAvKioKLSAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlY2xhcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsYXNzID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjb2VyY2VEYXRhID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmtleSA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY29udGFpbmVyID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VfdHJ1ZV90eXBlID0gZmFsc2UpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcG9pbnRlcl9maWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWNsYXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXJfZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVjbGFyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVjbGFyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWNsYXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVjbGFyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmtleSA9IGZhbHNlKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVyX2ZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGtpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2aXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9nb19kb2NzdHJpbmcoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9nb19kb2NzdHJpbmcoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gIHZvaWQgZ2VuZXJhdGVfZ29fZG9jc3RyaW5nKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9kb2MqIHRkb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzdWJoZWFkZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZ29fZG9jc3RyaW5nKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpOwotCi0gIC8qKgotICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucwotICAgKi8KLQotICBzdGQ6OnN0cmluZyBnb19hdXRvZ2VuX2NvbW1lbnQoKTsKLSAgc3RkOjpzdHJpbmcgZ29fcGFja2FnZSgpOwotICBzdGQ6OnN0cmluZyBnb19pbXBvcnRzX2JlZ2luKCk7Ci0gIHN0ZDo6c3RyaW5nIGdvX2ltcG9ydHNfZW5kKCk7Ci0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9pbmNsdWRlcygpOwotICBzdGQ6OnN0cmluZyByZW5kZXJfaW1wb3J0X3Byb3RlY3Rpb24oKTsKLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2Zhc3RiaW5hcnlfaW5jbHVkZXMoKTsKLSAgc3RkOjpzdHJpbmcgZGVjbGFyZV9hcmd1bWVudCh0X2ZpZWxkKiB0ZmllbGQpOwotICBzdGQ6OnN0cmluZyByZW5kZXJfZmllbGRfaW5pdGlhbF92YWx1ZSh0X2ZpZWxkKiB0ZmllbGQsIGNvbnN0IHN0cmluZyYgbmFtZSwgYm9vbCBvcHRpb25hbF9maWVsZCk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKTsKLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmVfaWYodF9mdW5jdGlvbiogdGZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFkZEVycm9yID0gZmFsc2UpOwotICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKLSAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOwotICBzdGQ6OnN0cmluZyB0eXBlX3RvX2dvX3R5cGUodF90eXBlKiB0dHlwZSwgYm9vbCBpc19jb250YWluZXJfdmFsdWUgPSBmYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZ29fdHlwZV93aXRoX29wdCh0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvcHRpb25hbF9maWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfY29udGFpbmVyX3ZhbHVlID0gZmFsc2UpOwotICBzdGQ6OnN0cmluZyB0eXBlX3RvX2dvX2tleV90eXBlKHRfdHlwZSogdHR5cGUpOwotICBzdGQ6OnN0cmluZyB0eXBlX3RvX3NwZWNfYXJncyh0X3R5cGUqIHR0eXBlKTsKLQotICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0X3JlYWxfZ29fbW9kdWxlKGNvbnN0IHRfcHJvZ3JhbSogcHJvZ3JhbSkgewotCi0gICAgaWYgKCFwYWNrYWdlX2ZsYWcuZW1wdHkoKSkgewotICAgICAgcmV0dXJuIHBhY2thZ2VfZmxhZzsKLSAgICB9Ci0gICAgc3RkOjpzdHJpbmcgcmVhbF9tb2R1bGUgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJnbyIpOwotICAgIGlmICghcmVhbF9tb2R1bGUuZW1wdHkoKSkgewotICAgICAgcmV0dXJuIHJlYWxfbW9kdWxlOwotICAgIH0KLQotICAgIHJldHVybiBsb3dlcmNhc2UocHJvZ3JhbS0+Z2V0X25hbWUoKSk7Ci0gIH0KLQotcHJpdmF0ZToKLSAgc3RkOjpzdHJpbmcgZ2VuX3BhY2thZ2VfcHJlZml4XzsKLSAgc3RkOjpzdHJpbmcgZ2VuX3RocmlmdF9pbXBvcnRfOwotICBib29sIHJlYWRfd3JpdGVfcHJpdmF0ZV87Ci0gIGJvb2wgaWdub3JlX2luaXRpYWxpc21zXzsKLQotICAvKioKLSAgICogRmlsZSBzdHJlYW1zCi0gICAqLwotCi0gIHN0ZDo6b2ZzdHJlYW0gZl90eXBlc187Ci0gIHN0ZDo6c3RyaW5nIGZfdHlwZXNfbmFtZV87Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9jb25zdHNfOwotICBzdGQ6OnN0cmluZyBmX2NvbnN0c19uYW1lXzsKLSAgc3RkOjpzdHJpbmdzdHJlYW0gZl9jb25zdF92YWx1ZXNfOwotICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZV87Ci0KLSAgc3RkOjpzdHJpbmcgcGFja2FnZV9uYW1lXzsKLSAgc3RkOjpzdHJpbmcgcGFja2FnZV9kaXJfOwotICBzdGQ6OnN0cmluZyByZWFkX21ldGhvZF9uYW1lXzsKLSAgc3RkOjpzdHJpbmcgd3JpdGVfbWV0aG9kX25hbWVfOwotCi0gIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBjb21tb25Jbml0aWFsaXNtczsKLQotICBzdGQ6OnN0cmluZyBjYW1lbGNhc2UoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSBjb25zdDsKLSAgdm9pZCBmaXhfY29tbW9uX2luaXRpYWxpc20oc3RkOjpzdHJpbmcmIHZhbHVlLCBpbnQgaSkgY29uc3Q7Ci0gIHN0ZDo6c3RyaW5nIHB1YmxpY2l6ZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUsIGJvb2wgaXNfYXJnc19vcl9yZXN1bHQgPSBmYWxzZSkgY29uc3Q7Ci0gIHN0ZDo6c3RyaW5nIHByaXZhdGl6ZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIGNvbnN0OwotICBzdGQ6OnN0cmluZyBuZXdfcHJlZml4KGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgY29uc3Q7Ci0gIHN0YXRpYyBzdGQ6OnN0cmluZyB2YXJpYWJsZV9uYW1lX3RvX2dvX25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKTsKLSAgc3RhdGljIGJvb2wgaXNfcG9pbnRlcl9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5fY29udGFpbmVyID0gZmFsc2UpOwotICBzdGF0aWMgYm9vbCBvbWl0X2luaXRpYWxpemF0aW9uKHRfZmllbGQqIHRmaWVsZCk7Ci19OwotCi0vLyByZXR1cm5zIHRydWUgaWYgZmllbGQgaW5pdGlhbGl6YXRpb24gY2FuIGJlIG9taXR0ZWQgc2luY2UgaXQgaGFzIGNvcnJlc3BvbmRpbmcgZ28gdHlwZSB6ZXJvIHZhbHVlCi0vLyBvciBkZWZhdWx0IHZhbHVlIGlzIG5vdCBzZXQKLWJvb2wgdF9nb19nZW5lcmF0b3I6Om9taXRfaW5pdGlhbGl6YXRpb24odF9maWVsZCogdGZpZWxkKSB7Ci0gIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gdGZpZWxkLT5nZXRfdmFsdWUoKTsKLSAgaWYgKCF2YWx1ZSkgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHRfdHlwZSogdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKS0+Z2V0X3RydWVfdHlwZSgpOwotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0KLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgIiI7Ci0KLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgLy9bXWJ5dGUgYXJlIGFsd2F5cyBpbmxpbmUKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgLy8gc3RyaW5ncyBhcmUgcG9pbnRlcnMgaWYgaGFzIG5vIGRlZmF1bHQKLSAgICAgIHJldHVybiB2YWx1ZS0+Z2V0X3N0cmluZygpLmVtcHR5KCk7Ci0KLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuIHZhbHVlLT5nZXRfaW50ZWdlcigpID09IDA7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICByZXR1cm4gdmFsdWUtPmdldF9pbnRlZ2VyKCkgPT0gMDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZS0+Z2V0X2RvdWJsZSgpID09IDAuOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHlwZSBuZWVkIGEgcmVmZXJlbmNlIGlmIHVzZWQgYXMgb3B0aW9uYWwgd2l0aG91dCBkZWZhdWx0Ci1zdGF0aWMgYm9vbCB0eXBlX25lZWRfcmVmZXJlbmNlKHRfdHlwZSogdHlwZSkgewotICB0eXBlID0gdHlwZS0+Z2V0X3RydWVfdHlwZSgpOwotICBpZiAodHlwZS0+aXNfbWFwKCkgfHwgdHlwZS0+aXNfc2V0KCkgfHwgdHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3N0cnVjdCgpCi0gICAgICB8fCB0eXBlLT5pc194Y2VwdGlvbigpIHx8ICh0eXBlLT5pc19zdHJpbmcoKSAmJiAoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vLyByZXR1cm5zIGZhbHNlIGlmIGZpZWxkIGNvdWxkIG5vdCB1c2UgY29tcGFyaXNvbiB0byBkZWZhdWx0IHZhbHVlIGFzICFJc1NldCoKLWJvb2wgdF9nb19nZW5lcmF0b3I6OmlzX3BvaW50ZXJfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluX2NvbnRhaW5lcl92YWx1ZSkgewotICAodm9pZClpbl9jb250YWluZXJfdmFsdWU7Ci0gIGlmICh0ZmllbGQtPmFubm90YXRpb25zXy5jb3VudCgiY3BwLnJlZiIpICE9IDApIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICB0X3R5cGUqIHR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCktPmdldF90cnVlX3R5cGUoKTsKLSAgLy8gU3RydWN0cyBpbiBjb250YWluZXJzIGFyZSBwb2ludGVycwotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIGlmICghKHRmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgYm9vbCBoYXNfZGVmYXVsdCA9IHRmaWVsZC0+Z2V0X3ZhbHVlKCk7Ci0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLQotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiIjsKLQotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgICAvL1tdYnl0ZSBhcmUgYWx3YXlzIGlubGluZQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICAvLyBzdHJpbmdzIGFyZSBwb2ludGVycyBpZiBoYXMgbm8gZGVmYXVsdAotICAgICAgcmV0dXJuICFoYXNfZGVmYXVsdDsKLQotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gIWhhc19kZWZhdWx0OwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIWhhc19kZWZhdWx0OwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiBoYXNfZGVmYXVsdDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiBoYXNfZGVmYXVsdDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gaGFzX2RlZmF1bHQ7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgcmV0dXJuIGhhc19kZWZhdWx0OwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2dvX3R5cGU6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi1zdGQ6OnN0cmluZyB0X2dvX2dlbmVyYXRvcjo6Y2FtZWxjYXNlKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgY29uc3QgewotICBzdGQ6OnN0cmluZyB2YWx1ZTIodmFsdWUpOwotICBzdGQ6OnNldGxvY2FsZShMQ19BTEwsICJDIik7IC8vIHNldCBsb2NhbGUgdG8gY2xhc3NpYwotCi0gIC8vIEZpeCBjb21tb24gaW5pdGlhbGlzbSBpbiBmaXJzdCB3b3JkCi0gIGZpeF9jb21tb25faW5pdGlhbGlzbSh2YWx1ZTIsIDApOwotCi0gIC8vIGFzIGxvbmcgYXMgd2UgYXJlIGNoYW5naW5nIHRoaW5ncywgbGV0J3MgY2hhbmdlIF8gZm9sbG93ZWQgYnkgbG93ZXJjYXNlIHRvCi0gIC8vIGNhcGl0YWwgYW5kIGZpeCBjb21tb24gaW5pdGlhbGlzbXMKLSAgZm9yIChzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGkgPSAxOyBpIDwgdmFsdWUyLnNpemUoKSAtIDE7ICsraSkgewotICAgIGlmICh2YWx1ZTJbaV0gPT0gJ18nKSB7Ci0gICAgICBpZiAoaXNsb3dlcih2YWx1ZTJbaSArIDFdKSkgewotICAgICAgICB2YWx1ZTIucmVwbGFjZShpLCAyLCAxLCB0b3VwcGVyKHZhbHVlMltpICsgMV0pKTsKLSAgICAgIH0KLSAgICAgIGZpeF9jb21tb25faW5pdGlhbGlzbSh2YWx1ZTIsIGkpOwotICAgIH0KLSAgfQotCi0gIHJldHVybiB2YWx1ZTI7Ci19Ci0KLS8vIENoZWNrcyB0byBzZWUgaWYgdGhlIHdvcmQgc3RhcnRpbmcgYXQgaSBpbiB2YWx1ZSBjb250YWlucyBhIGNvbW1vbiBpbml0aWFsaXNtCi0vLyBhbmQgaWYgc28gcmVwbGFjZXMgaXQgd2l0aCB0aGUgdXBwZXIgY2FzZSB2ZXJzaW9uIG9mIHRoZSB3b3JkLgotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Zml4X2NvbW1vbl9pbml0aWFsaXNtKHN0ZDo6c3RyaW5nJiB2YWx1ZSwgaW50IGkpIGNvbnN0IHsKLSAgaWYgKCFpZ25vcmVfaW5pdGlhbGlzbXNfKSB7Ci0gICAgc2l6ZV90IHdvcmRMZW4gPSB2YWx1ZS5maW5kKCdfJywgaSk7Ci0gICAgaWYgKHdvcmRMZW4gIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKLSAgICAgIHdvcmRMZW4gLT0gaTsKLSAgICB9Ci0gICAgc3RkOjpzdHJpbmcgd29yZCA9IHZhbHVlLnN1YnN0cihpLCB3b3JkTGVuKTsKLSAgICBzdGQ6OnRyYW5zZm9ybSh3b3JkLmJlZ2luKCksIHdvcmQuZW5kKCksIHdvcmQuYmVnaW4oKSwgOjp0b3VwcGVyKTsKLSAgICBpZiAoY29tbW9uSW5pdGlhbGlzbXMuZmluZCh3b3JkKSAhPSBjb21tb25Jbml0aWFsaXNtcy5lbmQoKSkgewotICAgICAgdmFsdWUucmVwbGFjZShpLCB3b3JkLmxlbmd0aCgpLCB3b3JkKTsKLSAgICB9Ci0gIH0KLX0KLQotc3RkOjpzdHJpbmcgdF9nb19nZW5lcmF0b3I6OnB1YmxpY2l6ZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUsIGJvb2wgaXNfYXJnc19vcl9yZXN1bHQpIGNvbnN0IHsKLSAgaWYgKHZhbHVlLnNpemUoKSA8PSAwKSB7Ci0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgdmFsdWUyKHZhbHVlKSwgcHJlZml4OwotCi0gIHN0cmluZzo6c2l6ZV90eXBlIGRvdF9wb3MgPSB2YWx1ZS5yZmluZCgnLicpOwotICBpZiAoZG90X3BvcyAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICBwcmVmaXggPSB2YWx1ZS5zdWJzdHIoMCwgZG90X3BvcyArIDEpICsgcHJlZml4OwotICAgIHZhbHVlMiA9IHZhbHVlLnN1YnN0cihkb3RfcG9zICsgMSk7Ci0gIH0KLQotICBpZiAoIWlzdXBwZXIodmFsdWUyWzBdKSkgewotICAgIHZhbHVlMlswXSA9IHRvdXBwZXIodmFsdWUyWzBdKTsKLSAgfQotCi0gIHZhbHVlMiA9IGNhbWVsY2FzZSh2YWx1ZTIpOwotCi0gIC8vIGZpbmFsIGxlbmd0aCBiZWZvcmUgZnVydGhlciBjaGVja3MsIHRoZSBzdHJpbmcgbWF5IGJlY29tZSBsb25nZXIKLSAgc2l6ZV90IGxlbl9iZWZvcmUgPSB2YWx1ZTIubGVuZ3RoKCk7Ci0KLSAgLy8gSURMIGlkZW50aWZpZXJzIG1heSBzdGFydCB3aXRoICJOZXciIHdoaWNoIGludGVyZmVyZXMgd2l0aCB0aGUgQ1RPUiBwYXR0ZXJuCi0gIC8vIEFkZGluZyBhbiBleHRyYSB1bmRlcnNjb3JlIHRvIGFsbCB0aG9zZSBpZGVudGlmaWVycyBzb2x2ZXMgdGhpcwotICBpZiAoKGxlbl9iZWZvcmUgPj0gMykgJiYgKHZhbHVlMi5zdWJzdHIoMCwgMykgPT0gIk5ldyIpKSB7Ci0gICAgdmFsdWUyICs9ICdfJzsKLSAgfQotCi0gIC8vIElETCBpZGVudGlmaWVycyBtYXkgZW5kIHdpdGggIkFyZ3MiLyJSZXN1bHQiIHdoaWNoIGludGVyZmVyZXMgd2l0aCB0aGUgaW1wbGljaXQgc2VydmljZQotICAvLyBmdW5jdGlvbiBzdHJ1Y3RzCi0gIC8vIEFkZGluZyBhbm90aGVyIGV4dHJhIHVuZGVyc2NvcmUgdG8gYWxsIHRob3NlIGlkZW50aWZpZXJzIHNvbHZlcyB0aGlzCi0gIC8vIFN1cHByZXNzIHRoaXMgY2hlY2sgZm9yIHRoZSBhY3R1YWwgaGVscGVyIHN0cnVjdCBuYW1lcwotICBpZiAoIWlzX2FyZ3Nfb3JfcmVzdWx0KSB7Ci0gICAgYm9vbCBlbmRzX3dpdGhfYXJncyA9IChsZW5fYmVmb3JlID49IDQpICYmICh2YWx1ZTIuc3Vic3RyKGxlbl9iZWZvcmUgLSA0LCA0KSA9PSAiQXJncyIpOwotICAgIGJvb2wgZW5kc193aXRoX3JzbHQgPSAobGVuX2JlZm9yZSA+PSA2KSAmJiAodmFsdWUyLnN1YnN0cihsZW5fYmVmb3JlIC0gNiwgNikgPT0gIlJlc3VsdCIpOwotICAgIGlmIChlbmRzX3dpdGhfYXJncyB8fCBlbmRzX3dpdGhfcnNsdCkgewotICAgICAgdmFsdWUyICs9ICdfJzsKLSAgICB9Ci0gIH0KLQotICAvLyBBdm9pZCBuYW1pbmcgY29sbGlzaW9ucyB3aXRoIG90aGVyIHNlcnZpY2VzCi0gIGlmIChpc19hcmdzX29yX3Jlc3VsdCkgewotICAgIHByZWZpeCArPSBwdWJsaWNpemUoc2VydmljZV9uYW1lXyk7Ci0gIH0KLQotICByZXR1cm4gcHJlZml4ICsgdmFsdWUyOwotfQotCi1zdGQ6OnN0cmluZyB0X2dvX2dlbmVyYXRvcjo6bmV3X3ByZWZpeChjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIGNvbnN0IHsKLSAgaWYgKHZhbHVlLnNpemUoKSA8PSAwKSB7Ci0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci0KLSAgc3RyaW5nOjpzaXplX3R5cGUgZG90X3BvcyA9IHZhbHVlLnJmaW5kKCcuJyk7Ci0gIGlmIChkb3RfcG9zICE9IHN0cmluZzo6bnBvcykgewotICAgIHJldHVybiB2YWx1ZS5zdWJzdHIoMCwgZG90X3BvcyArIDEpICsgIk5ldyIgKyBwdWJsaWNpemUodmFsdWUuc3Vic3RyKGRvdF9wb3MgKyAxKSk7Ci0gIH0KLSAgcmV0dXJuICJOZXciICsgcHVibGljaXplKHZhbHVlKTsKLX0KLQotc3RkOjpzdHJpbmcgdF9nb19nZW5lcmF0b3I6OnByaXZhdGl6ZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIGNvbnN0IHsKLSAgaWYgKHZhbHVlLnNpemUoKSA8PSAwKSB7Ci0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgdmFsdWUyKHZhbHVlKTsKLQotICBpZiAoIWlzbG93ZXIodmFsdWUyWzBdKSkgewotICAgIHZhbHVlMlswXSA9IHRvbG93ZXIodmFsdWUyWzBdKTsKLSAgfQotCi0gIHZhbHVlMiA9IGNhbWVsY2FzZSh2YWx1ZTIpOwotCi0gIHJldHVybiB2YWx1ZTI7Ci19Ci0KLXN0ZDo6c3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjp2YXJpYWJsZV9uYW1lX3RvX2dvX25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7Ci0gIGlmICh2YWx1ZS5zaXplKCkgPD0gMCkgewotICAgIHJldHVybiB2YWx1ZTsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIHZhbHVlMih2YWx1ZSk7Ci0gIHN0ZDo6dHJhbnNmb3JtKHZhbHVlMi5iZWdpbigpLCB2YWx1ZTIuZW5kKCksIHZhbHVlMi5iZWdpbigpLCA6OnRvbG93ZXIpOwotCi0gIHN3aXRjaCAodmFsdWVbMF0pIHsKLSAgY2FzZSAnYic6Ci0gIGNhc2UgJ0InOgotICAgIGlmICh2YWx1ZTIgIT0gImJyZWFrIikgewotICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIGJyZWFrOwotCi0gIGNhc2UgJ2MnOgotICBjYXNlICdDJzoKLSAgICBpZiAodmFsdWUyICE9ICJjYXNlIiAmJiB2YWx1ZTIgIT0gImNoYW4iICYmIHZhbHVlMiAhPSAiY29uc3QiICYmIHZhbHVlMiAhPSAiY29udGludWUiKSB7Ci0gICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgYnJlYWs7Ci0KLSAgY2FzZSAnZCc6Ci0gIGNhc2UgJ0QnOgotICAgIGlmICh2YWx1ZTIgIT0gImRlZmF1bHQiICYmIHZhbHVlMiAhPSAiZGVmZXIiKSB7Ci0gICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgYnJlYWs7Ci0KLSAgY2FzZSAnZSc6Ci0gIGNhc2UgJ0UnOgotICAgIGlmICh2YWx1ZTIgIT0gImVsc2UiICYmIHZhbHVlMiAhPSAiZXJyb3IiKSB7Ci0gICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgYnJlYWs7Ci0KLSAgY2FzZSAnZic6Ci0gIGNhc2UgJ0YnOgotICAgIGlmICh2YWx1ZTIgIT0gImZhbGx0aHJvdWdoIiAmJiB2YWx1ZTIgIT0gImZvciIgJiYgdmFsdWUyICE9ICJmdW5jIikgewotICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIGJyZWFrOwotCi0gIGNhc2UgJ2cnOgotICBjYXNlICdHJzoKLSAgICBpZiAodmFsdWUyICE9ICJnbyIgJiYgdmFsdWUyICE9ICJnb3RvIikgewotICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIGJyZWFrOwotCi0gIGNhc2UgJ2knOgotICBjYXNlICdJJzoKLSAgICBpZiAodmFsdWUyICE9ICJpZiIgJiYgdmFsdWUyICE9ICJpbXBvcnQiICYmIHZhbHVlMiAhPSAiaW50ZXJmYWNlIikgewotICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIGJyZWFrOwotCi0gIGNhc2UgJ20nOgotICBjYXNlICdNJzoKLSAgICBpZiAodmFsdWUyICE9ICJtYXAiKSB7Ci0gICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgYnJlYWs7Ci0KLSAgY2FzZSAncCc6Ci0gIGNhc2UgJ1AnOgotICAgIGlmICh2YWx1ZTIgIT0gInBhY2thZ2UiKSB7Ci0gICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgYnJlYWs7Ci0KLSAgY2FzZSAncic6Ci0gIGNhc2UgJ1InOgotICAgIGlmICh2YWx1ZTIgIT0gInJhbmdlIiAmJiB2YWx1ZTIgIT0gInJldHVybiIpIHsKLSAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICBicmVhazsKLQotICBjYXNlICdzJzoKLSAgY2FzZSAnUyc6Ci0gICAgaWYgKHZhbHVlMiAhPSAic2VsZWN0IiAmJiB2YWx1ZTIgIT0gInN0cnVjdCIgJiYgdmFsdWUyICE9ICJzd2l0Y2giKSB7Ci0gICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgYnJlYWs7Ci0KLSAgY2FzZSAndCc6Ci0gIGNhc2UgJ1QnOgotICAgIGlmICh2YWx1ZTIgIT0gInR5cGUiKSB7Ci0gICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgYnJlYWs7Ci0KLSAgY2FzZSAndic6Ci0gIGNhc2UgJ1YnOgotICAgIGlmICh2YWx1ZTIgIT0gInZhciIpIHsKLSAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICBicmVhazsKLQotICBkZWZhdWx0OgotICAgIHJldHVybiB2YWx1ZTsKLSAgfQotCi0gIHJldHVybiB2YWx1ZTIgKyAiX2ExIjsKLX0KLQotLyoqCi0gKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAotICogc3RyZWFtcy4KLSAqCi0gKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQotICBzdHJpbmcgbW9kdWxlID0gZ2V0X3JlYWxfZ29fbW9kdWxlKHByb2dyYW1fKTsKLSAgc3RyaW5nIHRhcmdldCA9IG1vZHVsZTsKLSAgcGFja2FnZV9kaXJfID0gZ2V0X291dF9kaXIoKTsKLQotICAvLyBUaGlzIHNldCBpcyB0YWtlbiBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9nb2xhbmcvbGludC9ibG9iL21hc3Rlci9saW50LmdvI0w2OTIKLSAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJBUEkiKTsKLSAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJBU0NJSSIpOwotICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIkNQVSIpOwotICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIkNTUyIpOwotICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIkROUyIpOwotICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIkVPRiIpOwotICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIkdVSUQiKTsKLSAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJIVE1MIik7Ci0gIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiSFRUUCIpOwotICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIkhUVFBTIik7Ci0gIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiSUQiKTsKLSAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJJUCIpOwotICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIkpTT04iKTsKLSAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJMSFMiKTsKLSAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJRUFMiKTsKLSAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJSQU0iKTsKLSAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJSSFMiKTsKLSAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJSUEMiKTsKLSAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJTTEEiKTsKLSAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJTTVRQIik7Ci0gIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiU1NIIik7Ci0gIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiVENQIik7Ci0gIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiVExTIik7Ci0gIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiVFRMIik7Ci0gIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiVURQIik7Ci0gIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiVUkiKTsKLSAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJVSUQiKTsKLSAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJVVUlEIik7Ci0gIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiVVJJIik7Ci0gIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiVVJMIik7Ci0gIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiVVRGOCIpOwotICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIlZNIik7Ci0gIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiWE1MIik7Ci0gIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiWFNSRiIpOwotICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIlhTUyIpOwotCi0gIC8vIG5hbWVzIG9mIHJlYWQgYW5kIHdyaXRlIG1ldGhvZHMKLSAgaWYgKHJlYWRfd3JpdGVfcHJpdmF0ZV8pIHsKLSAgICByZWFkX21ldGhvZF9uYW1lXyA9ICJyZWFkIjsKLSAgICB3cml0ZV9tZXRob2RfbmFtZV8gPSAid3JpdGUiOwotICB9IGVsc2UgewotICAgIHJlYWRfbWV0aG9kX25hbWVfID0gIlJlYWQiOwotICAgIHdyaXRlX21ldGhvZF9uYW1lXyA9ICJXcml0ZSI7Ci0gIH0KLQotICB3aGlsZSAodHJ1ZSkgewotICAgIC8vIFRPRE86IERvIGJldHRlciBlcnJvciBjaGVja2luZyBoZXJlLgotICAgIE1LRElSKHBhY2thZ2VfZGlyXy5jX3N0cigpKTsKLQotICAgIGlmIChtb2R1bGUuZW1wdHkoKSkgewotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgc3RyaW5nOjpzaXplX3R5cGUgcG9zID0gbW9kdWxlLmZpbmQoJy4nKTsKLQotICAgIGlmIChwb3MgPT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgICBwYWNrYWdlX2Rpcl8gKz0gIi8iOwotICAgICAgcGFja2FnZV9kaXJfICs9IG1vZHVsZTsKLSAgICAgIHBhY2thZ2VfbmFtZV8gPSBtb2R1bGU7Ci0gICAgICBtb2R1bGUuY2xlYXIoKTsKLSAgICB9IGVsc2UgewotICAgICAgcGFja2FnZV9kaXJfICs9ICIvIjsKLSAgICAgIHBhY2thZ2VfZGlyXyArPSBtb2R1bGUuc3Vic3RyKDAsIHBvcyk7Ci0gICAgICBtb2R1bGUuZXJhc2UoMCwgcG9zICsgMSk7Ci0gICAgfQotICB9Ci0KLSAgc3RyaW5nOjpzaXplX3R5cGUgbG9jOwotCi0gIHdoaWxlICgobG9jID0gdGFyZ2V0LmZpbmQoIi4iKSkgIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgdGFyZ2V0LnJlcGxhY2UobG9jLCAxLCAxLCAnLycpOwotICB9Ci0KLSAgLy8gTWFrZSBvdXRwdXQgZmlsZXMKLSAgZl90eXBlc19uYW1lXyA9IHBhY2thZ2VfZGlyXyArICIvIiArICJ0dHlwZXMuZ28iOwotICBmX3R5cGVzXy5vcGVuKGZfdHlwZXNfbmFtZV8uY19zdHIoKSk7Ci0KLSAgZl9jb25zdHNfbmFtZV8gPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyAiY29uc3RhbnRzLmdvIjsKLSAgZl9jb25zdHNfLm9wZW4oZl9jb25zdHNfbmFtZV8uY19zdHIoKSk7Ci0KLSAgdmVjdG9yPHRfc2VydmljZSo+IHNlcnZpY2VzID0gcHJvZ3JhbV8tPmdldF9zZXJ2aWNlcygpOwotICB2ZWN0b3I8dF9zZXJ2aWNlKj46Oml0ZXJhdG9yIHN2X2l0ZXI7Ci0KLSAgZm9yIChzdl9pdGVyID0gc2VydmljZXMuYmVnaW4oKTsgc3ZfaXRlciAhPSBzZXJ2aWNlcy5lbmQoKTsgKytzdl9pdGVyKSB7Ci0gICAgc3RyaW5nIHNlcnZpY2VfZGlyID0gcGFja2FnZV9kaXJfICsgIi8iICsgdW5kZXJzY29yZSgoKnN2X2l0ZXIpLT5nZXRfbmFtZSgpKSArICItcmVtb3RlIjsKLSAgICBNS0RJUihzZXJ2aWNlX2Rpci5jX3N0cigpKTsKLSAgfQotCi0gIC8vIFByaW50IGhlYWRlcgotICBmX3R5cGVzXyA8PCBnb19hdXRvZ2VuX2NvbW1lbnQoKSA8PCBnb19wYWNrYWdlKCkgPDwgcmVuZGVyX2luY2x1ZGVzKCkKLSAgICAgICAgICAgPDwgcmVuZGVyX2ltcG9ydF9wcm90ZWN0aW9uKCk7Ci0KLSAgZl9jb25zdHNfIDw8IGdvX2F1dG9nZW5fY29tbWVudCgpIDw8IGdvX3BhY2thZ2UoKSA8PCByZW5kZXJfaW5jbHVkZXMoKTsKLQotICBmX2NvbnN0X3ZhbHVlc18gPDwgZW5kbCA8PCAiZnVuYyBpbml0KCkgeyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGFsbCB0aGUgaW1wb3J0cyBuZWNlc3NhcnkgZm9yIGluY2x1ZGluZyBhbm90aGVyIFRocmlmdCBwcm9ncmFtCi0gKi8KLXN0cmluZyB0X2dvX2dlbmVyYXRvcjo6cmVuZGVyX2luY2x1ZGVzKCkgewotICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOwotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0gIHN0cmluZyB1bnVzZWRfcHJvdCA9ICIiOwotCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKLSAgICBzdHJpbmcgZ29fbW9kdWxlID0gZ2V0X3JlYWxfZ29fbW9kdWxlKGluY2x1ZGVzW2ldKTsKLSAgICBzaXplX3QgZm91bmQgPSAwOwotICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgZ29fbW9kdWxlLnNpemUoKTsgaisrKSB7Ci0gICAgICAvLyBJbXBvcnQgc3RhdGVtZW50IHVzZXMgc2xhc2hlcyAoJy8nKSBpbiBuYW1lc3BhY2UKLSAgICAgIGlmIChnb19tb2R1bGVbal0gPT0gJy4nKSB7Ci0gICAgICAgIGdvX21vZHVsZVtqXSA9ICcvJzsKLSAgICAgICAgZm91bmQgPSBqICsgMTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXN1bHQgKz0gIlx0XCIiICsgZ2VuX3BhY2thZ2VfcHJlZml4XyArIGdvX21vZHVsZSArICJcIlxuIjsKLSAgICB1bnVzZWRfcHJvdCArPSAidmFyIF8gPSAiICsgZ29fbW9kdWxlLnN1YnN0cihmb3VuZCkgKyAiLkdvVW51c2VkUHJvdGVjdGlvbl9fXG4iOwotICB9Ci0KLSAgaWYgKGluY2x1ZGVzLnNpemUoKSA+IDApIHsKLSAgICByZXN1bHQgKz0gIlxuIjsKLSAgfQotCi0gIHJldHVybiBnb19pbXBvcnRzX2JlZ2luKCkgKyByZXN1bHQgKyBnb19pbXBvcnRzX2VuZCgpICsgdW51c2VkX3Byb3Q7Ci19Ci0KLXN0cmluZyB0X2dvX2dlbmVyYXRvcjo6cmVuZGVyX2ltcG9ydF9wcm90ZWN0aW9uKCkgewotICByZXR1cm4gc3RyaW5nKCJ2YXIgR29VbnVzZWRQcm90ZWN0aW9uX18gaW50O1xuXG4iKTsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGFsbCB0aGUgaW1wb3J0cyBuZWNlc3NhcnkgdG8gdXNlIHRoZSBhY2NlbGVyYXRlZCBUQmluYXJ5UHJvdG9jb2wKLSAqLwotc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpyZW5kZXJfZmFzdGJpbmFyeV9pbmNsdWRlcygpIHsKLSAgcmV0dXJuICIiOwotfQotCi0vKioKLSAqIEF1dG9nZW4nZCBjb21tZW50Ci0gKi8KLXN0cmluZyB0X2dvX2dlbmVyYXRvcjo6Z29fYXV0b2dlbl9jb21tZW50KCkgewotICByZXR1cm4KLSAgICAgICAgc3RkOjpzdHJpbmcoKSArCi0gICAgICAgICIvLyBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoIiArIFRIUklGVF9WRVJTSU9OICsgIilcbiIKLSAgICAgICAgIi8vIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkdcblxuIjsKLX0KLQotLyoqCi0gKiBQcmludHMgc3RhbmRhcmQgdGhyaWZ0IHBhY2thZ2UKLSAqLwotc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpnb19wYWNrYWdlKCkgewotICByZXR1cm4gc3RyaW5nKCJwYWNrYWdlICIpICsgcGFja2FnZV9uYW1lXyArICJcblxuIjsKLX0KLQotLyoqCi0gKiBSZW5kZXIgdGhlIGJlZ2lubmluZyBvZiB0aGUgaW1wb3J0IHN0YXRlbWVudAotICovCi1zdHJpbmcgdF9nb19nZW5lcmF0b3I6OmdvX2ltcG9ydHNfYmVnaW4oKSB7Ci0gIHJldHVybiBzdHJpbmcoCi0gICAgICAiaW1wb3J0IChcbiIKLSAgICAgICJcdFwiYnl0ZXNcIlxuIgotICAgICAgIlx0XCJmbXRcIlxuIgotICAgICAgIlx0XCIiICsgZ2VuX3RocmlmdF9pbXBvcnRfICsgIlwiXG4iKTsKLX0KLQotLyoqCi0gKiBFbmQgdGhlIGltcG9ydCBzdGF0ZW1lbnQsIGluY2x1ZGUgdW5kc2NvcmUtYXNzaWdubWVudHMKLSAqCi0gKiBUaGVzZSAiXyA9IiBwcmV2ZW50IHRoZSBnbyBjb21waWxlciBjb21wbGFpbmluZyBhYm91dCB1c2VkIGltcG9ydHMuCi0gKiBUaGlzIHdpbGwgaGF2ZSB0byBkbyBpbiBsaWV1IG9mIG1vcmUgaW50ZWxsaWdlbnQgaW1wb3J0IHN0YXRlbWVudCBjb25zdHJ1Y3Rpb24KLSAqLwotc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpnb19pbXBvcnRzX2VuZCgpIHsKLSAgcmV0dXJuIHN0cmluZygKLSAgICAgICIpXG5cbiIKLSAgICAgICIvLyAobmVlZGVkIHRvIGVuc3VyZSBzYWZldHkgYmVjYXVzZSBvZiBuYWl2ZSBpbXBvcnQgbGlzdCBjb25zdHJ1Y3Rpb24uKVxuIgotICAgICAgInZhciBfID0gdGhyaWZ0LlpFUk9cbiIKLSAgICAgICJ2YXIgXyA9IGZtdC5QcmludGZcbiIKLSAgICAgICJ2YXIgXyA9IGJ5dGVzLkVxdWFsXG5cbiIpOwotfQotCi0vKioKLSAqIENsb3NlcyB0aGUgdHlwZSBmaWxlcwotICovCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7Ci0gIGZfY29uc3RfdmFsdWVzXyA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICBmX2NvbnN0c18gPDwgZl9jb25zdF92YWx1ZXNfLnN0cigpOwotCi0gIC8vIENsb3NlIHR5cGVzIGFuZCBjb25zdGFudHMgZmlsZXMKLSAgZl9jb25zdHNfLmNsb3NlKCk7Ci0gIGZfdHlwZXNfLmNsb3NlKCk7Ci0gIGZvcm1hdF9nb19vdXRwdXQoZl90eXBlc19uYW1lXyk7Ci0gIGZvcm1hdF9nb19vdXRwdXQoZl9jb25zdHNfbmFtZV8pOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuCi0gKgotICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7Ci0gIGdlbmVyYXRlX2dvX2RvY3N0cmluZyhmX3R5cGVzXywgdHR5cGVkZWYpOwotICBzdHJpbmcgbmV3X3R5cGVfbmFtZShwdWJsaWNpemUodHR5cGVkZWYtPmdldF9zeW1ib2xpYygpKSk7Ci0gIHN0cmluZyBiYXNlX3R5cGUodHlwZV90b19nb190eXBlKHR0eXBlZGVmLT5nZXRfdHlwZSgpKSk7Ci0KLSAgaWYgKGJhc2VfdHlwZSA9PSBuZXdfdHlwZV9uYW1lKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZl90eXBlc18gPDwgInR5cGUgIiA8PCBuZXdfdHlwZV9uYW1lIDw8ICIgIiA8PCBiYXNlX3R5cGUgPDwgZW5kbCA8PCBlbmRsOwotICAvLyBHZW5lcmF0ZSBhIGNvbnZlbmllbmNlIGZ1bmN0aW9uIHRoYXQgY29udmVydHMgYW4gaW5zdGFuY2Ugb2YgYSB0eXBlCi0gIC8vICh3aGljaCBtYXkgYmUgYSBjb25zdGFudCkgaW50byBhIHBvaW50ZXIgdG8gYW4gaW5zdGFuY2Ugb2YgYSB0eXBlLgotICBmX3R5cGVzXyA8PCAiZnVuYyAiIDw8IG5ld190eXBlX25hbWUgPDwgIlB0cih2ICIgPDwgbmV3X3R5cGVfbmFtZSA8PCAiKSAqIiA8PCBuZXdfdHlwZV9uYW1lCi0gICAgICAgICAgIDw8ICIgeyByZXR1cm4gJnYgfSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuIERvbmUgdXNpbmcgYSBjbGFzcyB0byBzY29wZQotICogdGhlIHZhbHVlcy4KLSAqCi0gKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCi0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gdG9fc3RyaW5nX21hcHBpbmcsIGZyb21fc3RyaW5nX21hcHBpbmc7Ci0gIHN0ZDo6c3RyaW5nIHRlbnVtX25hbWUocHVibGljaXplKHRlbnVtLT5nZXRfbmFtZSgpKSk7Ci0gIGdlbmVyYXRlX2dvX2RvY3N0cmluZyhmX3R5cGVzXywgdGVudW0pOwotICBmX3R5cGVzXyA8PCAidHlwZSAiIDw8IHRlbnVtX25hbWUgPDwgIiBpbnQ2NCIgPDwgZW5kbCA8PCAiY29uc3QgKCIgPDwgZW5kbDsKLQotICB0b19zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAiZnVuYyAocCAiIDw8IHRlbnVtX25hbWUgPDwgIikgU3RyaW5nKCkgc3RyaW5nIHsiIDw8IGVuZGw7Ci0gIHRvX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICIgIHN3aXRjaCBwIHsiIDw8IGVuZGw7Ci0KLSAgZnJvbV9zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAiZnVuYyAiIDw8IHRlbnVtX25hbWUgPDwgIkZyb21TdHJpbmcocyBzdHJpbmcpICgiIDw8IHRlbnVtX25hbWUKLSAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBlcnJvcikgeyIgPDwgZW5kbDsKLSAgZnJvbV9zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAiICBzd2l0Y2ggcyB7IiA8PCBlbmRsOwotCi0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOwotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgaW50IHZhbHVlID0gLTE7Ci0KLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0KLSAgICBzdHJpbmcgaXRlcl9zdGRfbmFtZShlc2NhcGVfc3RyaW5nKCgqY19pdGVyKS0+Z2V0X25hbWUoKSkpOwotICAgIHN0cmluZyBpdGVyX25hbWUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICAiIDw8IHRlbnVtX25hbWUgPDwgIl8iIDw8IGl0ZXJfbmFtZSA8PCAnICcgPDwgdGVudW1fbmFtZSA8PCAiID0gIgotICAgICAgICAgICAgIDw8IHZhbHVlIDw8IGVuZGw7Ci0gICAgLy8gRGljdGlvbmFyaWVzIHRvL2Zyb20gc3RyaW5nIG5hbWVzIG9mIGVudW1zCi0gICAgdG9fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgIiAgY2FzZSAiIDw8IHRlbnVtX25hbWUgPDwgIl8iIDw8IGl0ZXJfbmFtZSA8PCAiOiByZXR1cm4gXCIiCi0gICAgICAgICAgICAgICAgICAgICAgPDwgaXRlcl9zdGRfbmFtZSA8PCAiXCIiIDw8IGVuZGw7Ci0KLSAgICBpZiAoaXRlcl9zdGRfbmFtZSAhPSBlc2NhcGVfc3RyaW5nKGl0ZXJfbmFtZSkpIHsKLSAgICAgIGZyb21fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgIiAgY2FzZSBcIiIgPDwgaXRlcl9zdGRfbmFtZSA8PCAiXCIsIFwiIgotICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlc2NhcGVfc3RyaW5nKGl0ZXJfbmFtZSkgPDwgIlwiOiByZXR1cm4gIiA8PCB0ZW51bV9uYW1lIDw8ICJfIgotICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBpdGVyX25hbWUgPDwgIiwgbmlsICIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgZnJvbV9zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAiICBjYXNlIFwiIiA8PCBpdGVyX3N0ZF9uYW1lIDw8ICJcIjogcmV0dXJuICIgPDwgdGVudW1fbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXyIgPDwgaXRlcl9uYW1lIDw8ICIsIG5pbCAiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgdG9fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbDsKLSAgdG9fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIFwiPFVOU0VUPlwiIiA8PCBlbmRsOwotICB0b19zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgZnJvbV9zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsOwotICBmcm9tX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IHRlbnVtX25hbWUgPDwgIigwKSwiCi0gICAgICAgICAgICAgICAgICAgICAgPDwgIiBmbXQuRXJyb3JmKFwibm90IGEgdmFsaWQgIiA8PCB0ZW51bV9uYW1lIDw8ICIgc3RyaW5nXCIpIiA8PCBlbmRsOwotICBmcm9tX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIGZfdHlwZXNfIDw8ICIpIiA8PCBlbmRsIDw8IGVuZGwgPDwgdG9fc3RyaW5nX21hcHBpbmcuc3RyKCkgPDwgZW5kbCA8PCBmcm9tX3N0cmluZ19tYXBwaW5nLnN0cigpCi0gICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSBhIGNvbnZlbmllbmNlIGZ1bmN0aW9uIHRoYXQgY29udmVydHMgYW4gaW5zdGFuY2Ugb2YgYW4gZW51bQotICAvLyAod2hpY2ggbWF5IGJlIGEgY29uc3RhbnQpIGludG8gYSBwb2ludGVyIHRvIGFuIGluc3RhbmNlIG9mIHRoYXQgZW51bQotICAvLyB0eXBlLgotICBmX3R5cGVzXyA8PCAiZnVuYyAiIDw8IHRlbnVtX25hbWUgPDwgIlB0cih2ICIgPDwgdGVudW1fbmFtZSA8PCAiKSAqIiA8PCB0ZW51bV9uYW1lCi0gICAgICAgICAgIDw8ICIgeyByZXR1cm4gJnYgfSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIE1hcnNoYWxUZXh0Ci0gIGZfdHlwZXNfIDw8ICJmdW5jIChwICIgPDwgdGVudW1fbmFtZSA8PCAiKSBNYXJzaGFsVGV4dCgpIChbXWJ5dGUsIGVycm9yKSB7IiA8PCBlbmRsOwotICBmX3R5cGVzXyA8PCAicmV0dXJuIFtdYnl0ZShwLlN0cmluZygpKSwgbmlsIiA8PCBlbmRsOwotICBmX3R5cGVzXyA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIFVubWFyc2hhbFRleHQKLSAgZl90eXBlc18gPDwgImZ1bmMgKHAgKiIgPDwgdGVudW1fbmFtZSA8PCAiKSBVbm1hcnNoYWxUZXh0KHRleHQgW11ieXRlKSBlcnJvciB7IiA8PCBlbmRsOwotICBmX3R5cGVzXyA8PCAicSwgZXJyIDo9ICIgPDwgdGVudW1fbmFtZSA8PCAiRnJvbVN0cmluZyhzdHJpbmcodGV4dCkpIiA8PCBlbmRsOwotICBmX3R5cGVzXyA8PCAiaWYgKGVyciAhPSBuaWwpIHsiIDw8IGVuZGwgPDwgInJldHVybiBlcnIiIDw8IGVuZGwgPDwgIn0iIDw8IGVuZGw7Ci0gIGZfdHlwZXNfIDw8ICIqcCA9IHEiIDw8IGVuZGw7Ci0gIGZfdHlwZXNfIDw8ICJyZXR1cm4gbmlsIiA8PCBlbmRsOwotICBmX3R5cGVzXyA8PCAifSIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZSBhIGNvbnN0YW50IHZhbHVlCi0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgewotICB0X3R5cGUqIHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7Ci0gIHN0cmluZyBuYW1lID0gcHVibGljaXplKHRjb25zdC0+Z2V0X25hbWUoKSk7Ci0gIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gdGNvbnN0LT5nZXRfdmFsdWUoKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgaW5kZW50KGZfY29uc3RzXykgPDwgImNvbnN0ICIgPDwgbmFtZSA8PCAiID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUsIG5hbWUpIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgZl9jb25zdF92YWx1ZXNfIDw8IGluZGVudCgpIDw8IG5hbWUgPDwgIiA9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlLCBuYW1lKSA8PCBlbmRsCi0gICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0KLSAgICBmX2NvbnN0c18gPDwgaW5kZW50KCkgPDwgInZhciAiIDw8IG5hbWUgPDwgIiAiIDw8IHR5cGVfdG9fZ29fdHlwZSh0eXBlKSA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCi0gKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQotICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKLSAqLwotc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwgY29uc3Qgc3RyaW5nJiBuYW1lKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLQotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgb3V0IDw8ICJbXWJ5dGUoXCIiIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgIlwiKSI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOwotICAgICAgfQotCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIG91dCA8PCAodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwID8gInRydWUiIDogImZhbHNlIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKLSAgICAgIH0KLQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIGluZGVudChvdXQpIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBvdXQgPDwgIiYiIDw8IHB1YmxpY2l6ZSh0eXBlX25hbWUodHlwZSkpIDw8ICJ7IjsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLQotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOwotCi0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgewotICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOwotICAgICAgfQotCi0gICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBwdWJsaWNpemUodl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSA8PCAiOiAiCi0gICAgICAgICAgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kLCBuYW1lKSA8PCAiLCIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIG91dCA8PCAifSI7Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBvdXQgPDwgIm1hcFsiIDw8IHR5cGVfdG9fZ29fdHlwZShrdHlwZSkgPDwgIl0iIDw8IHR5cGVfdG9fZ29fdHlwZSh2dHlwZSwgdHJ1ZSkgPDwgInsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLQotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGt0eXBlLCB2X2l0ZXItPmZpcnN0LCBuYW1lKSA8PCAiOiAiCi0gICAgICAgICAgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHZ0eXBlLCB2X2l0ZXItPnNlY29uZCwgbmFtZSkgPDwgIiwiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICBvdXQgPDwgIltdIiA8PCB0eXBlX3RvX2dvX3R5cGUoZXR5cGUpIDw8ICJ7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLQotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyLCBuYW1lKSA8PCAiLCAiOwotICAgIH0KLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIG91dCA8PCAibWFwWyIgPDwgdHlwZV90b19nb19rZXlfdHlwZShldHlwZSkgPDwgIl1ib29seyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0KLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlciwgbmFtZSkgPDwgIjogdHJ1ZSwiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iOwotICB9IGVsc2UgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgQ09OU1RBTlQgRk9SIFRZUEU6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBnbyBzdHJ1Y3QKLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGdlbmVyYXRlX2dvX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGV4Y2VwdGlvbi4gQmFzaWNhbGx5IHRoZSBzYW1lCi0gKiBhcyBhIHN0cnVjdCBidXQgZXh0ZW5kcyB0aGUgRXhjZXB0aW9uIGNsYXNzLgotICoKLSAqIEBwYXJhbSB0eGNlcHRpb24gVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfZ29fc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgZ28gc3RydWN0Ci0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2dvX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfZ29fc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Ci19Ci0KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdldF9wdWJsaWNpemVkX25hbWVfYW5kX2RlZl92YWx1ZSh0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKiBPVVRfcHViX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSoqIE9VVF9kZWZfdmFsdWUpIGNvbnN0IHsKLSAgY29uc3Qgc3RyaW5nIGJhc2VfZmllbGRfbmFtZSA9IHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgY29uc3Qgc3RyaW5nIGVzY2FwZWRfZmllbGRfbmFtZSA9IGVzY2FwZV9zdHJpbmcoYmFzZV9maWVsZF9uYW1lKTsKLSAgKk9VVF9wdWJfbmFtZSA9IHB1YmxpY2l6ZShlc2NhcGVkX2ZpZWxkX25hbWUpOwotICAqT1VUX2RlZl92YWx1ZSA9IHRmaWVsZC0+Z2V0X3ZhbHVlKCk7Ci19Ci0KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2dvX3N0cnVjdF9pbml0aWFsaXplcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfYXJnc19vcl9yZXN1bHQpIHsKLSAgb3V0IDw8IHB1YmxpY2l6ZSh0eXBlX25hbWUodHN0cnVjdCksIGlzX2FyZ3Nfb3JfcmVzdWx0KSA8PCAieyI7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7Ci0gICAgICAgKyttX2l0ZXIpIHsKLSAgICBib29sIHBvaW50ZXJfZmllbGQgPSBpc19wb2ludGVyX2ZpZWxkKCptX2l0ZXIpOwotICAgIHN0cmluZyBwdWJsaWNpemVkX25hbWU7Ci0gICAgdF9jb25zdF92YWx1ZSogZGVmX3ZhbHVlOwotICAgIGdldF9wdWJsaWNpemVkX25hbWVfYW5kX2RlZl92YWx1ZSgqbV9pdGVyLCAmcHVibGljaXplZF9uYW1lLCAmZGVmX3ZhbHVlKTsKLSAgICBpZiAoIXBvaW50ZXJfZmllbGQgJiYgZGVmX3ZhbHVlICE9IE5VTEwgJiYgIW9taXRfaW5pdGlhbGl6YXRpb24oKm1faXRlcikpIHsKLSAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHB1YmxpY2l6ZWRfbmFtZSA8PCAiOiAiCi0gICAgICAgICAgPDwgcmVuZGVyX2ZpZWxkX2luaXRpYWxfdmFsdWUoKm1faXRlciwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpLCBwb2ludGVyX2ZpZWxkKSA8PCAiLCIKLSAgICAgICAgICA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIG91dCA8PCAifSIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nb19zdHJ1Y3RfZGVmaW5pdGlvbihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19hcmdzKSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBzb3J0ZWRfbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgc3RkOjpzdHJpbmcgdHN0cnVjdF9uYW1lKHB1YmxpY2l6ZSh0c3RydWN0LT5nZXRfbmFtZSgpLCBpc19hcmdzIHx8IGlzX3Jlc3VsdCkpOwotICBnZW5lcmF0ZV9nb19kb2NzdHJpbmcob3V0LCB0c3RydWN0KTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ0eXBlICIgPDwgdHN0cnVjdF9uYW1lIDw8ICIgc3RydWN0IHsiIDw8IGVuZGw7Ci0gIC8qCi0gICAgIEhlcmUgd2UgZ2VuZXJhdGUgdGhlIHN0cnVjdHVyZSBzcGVjaWZpY2F0aW9uIGZvciB0aGUgZmFzdGJpbmFyeSBjb2RlYy4KLSAgICAgVGhlc2Ugc3BlY2lmaWNhdGlvbnMgaGF2ZSB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZToKLSAgICAgdGhyaWZ0X3NwZWMgLT4gdHVwbGUgb2YgaXRlbV9zcGVjCi0gICAgIGl0ZW1fc3BlYyAtPiBuaWwgfCAodGFnLCB0eXBlX2VudW0sIG5hbWUsIHNwZWNfYXJncywgZGVmYXVsdCkKLSAgICAgdGFnIC0+IGludGVnZXIKLSAgICAgdHlwZV9lbnVtIC0+IFRUeXBlLkkzMiB8IFRUeXBlLlNUUklORyB8IFRUeXBlLlNUUlVDVCB8IC4uLgotICAgICBuYW1lIC0+IHN0cmluZ19saXRlcmFsCi0gICAgIGRlZmF1bHQgLT4gbmlsICAjIEhhbmRsZWQgYnkgX19pbml0X18KLSAgICAgc3BlY19hcmdzIC0+IG5pbCAgIyBGb3Igc2ltcGxlIHR5cGVzCi0gICAgICAgICAgICAgICAgfCAodHlwZV9lbnVtLCBzcGVjX2FyZ3MpICAjIFZhbHVlIHR5cGUgZm9yIGxpc3Qvc2V0Ci0gICAgICAgICAgICAgICAgfCAodHlwZV9lbnVtLCBzcGVjX2FyZ3MsIHR5cGVfZW51bSwgc3BlY19hcmdzKQotICAgICAgICAgICAgICAgICAgIyBLZXkgYW5kIHZhbHVlIGZvciBtYXAKLSAgICAgICAgICAgICAgICB8IChjbGFzc19uYW1lLCBzcGVjX2FyZ3NfcHRyKSAjIEZvciBzdHJ1Y3QvZXhjZXB0aW9uCi0gICAgIGNsYXNzX25hbWUgLT4gaWRlbnRpZmllciAgIyBCYXNpY2FsbHkgYSBwb2ludGVyIHRvIHRoZSBjbGFzcwotICAgICBzcGVjX2FyZ3NfcHRyIC0+IGV4cHJlc3Npb24gICMganVzdCBjbGFzc19uYW1lLnNwZWNfYXJncwotCi0gICAgIFRPRE8oZHJlaXNzKTogQ29uc2lkZXIgbWFraW5nIHRoaXMgd29yayBmb3Igc3RydWN0cyB3aXRoIG5lZ2F0aXZlIHRhZ3MuCi0gICovCi0gIC8vIFRPRE8oZHJlaXNzKTogTG9vayBpbnRvIGdlbmVyYXRpbmcgYW4gZW1wdHkgdHVwbGUgaW5zdGVhZCBvZiBuaWwKLSAgLy8gZm9yIHN0cnVjdHVyZXMgd2l0aCBubyBtZW1iZXJzLgotICAvLyBUT0RPKGRyZWlzcyk6IFRlc3QgZW5jb2Rpbmcgb2Ygc3RydWN0cyB3aGVyZSBzb21lIGlubmVyIHN0cnVjdHMKLSAgLy8gZG9uJ3QgaGF2ZSB0aHJpZnRfc3BlYy4KLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW50IG51bV9zZXRhYmxlID0gMDsKLSAgaWYgKHNvcnRlZF9tZW1iZXJzLmVtcHR5KCkgfHwgKHNvcnRlZF9tZW1iZXJzWzBdLT5nZXRfa2V5KCkgPj0gMCkpIHsKLSAgICBpbnQgc29ydGVkX2tleXNfcG9zID0gMDsKLQotICAgIGZvciAobV9pdGVyID0gc29ydGVkX21lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IHNvcnRlZF9tZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgLy8gU2V0IGZpZWxkIHRvIG9wdGlvbmFsIGlmIGZpZWxkIGlzIHVuaW9uLCB0aGlzIGlzIHNvIHdlIGNhbiBnZXQgYQotICAgICAgLy8gcG9pbnRlciB0byB0aGUgZmllbGQuCi0gICAgICBpZiAodHN0cnVjdC0+aXNfdW5pb24oKSkKLSAgICAgICAgKCptX2l0ZXIpLT5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUSU9OQUwpOwotICAgICAgaWYgKHNvcnRlZF9rZXlzX3BvcyAhPSAoKm1faXRlciktPmdldF9rZXkoKSkgewotICAgICAgICBpbnQgZmlyc3RfdW51c2VkID0gc3RkOjptYXgoMSwgc29ydGVkX2tleXNfcG9zKyspOwotICAgICAgICB3aGlsZSAoc29ydGVkX2tleXNfcG9zICE9ICgqbV9pdGVyKS0+Z2V0X2tleSgpKSB7Ci0gICAgICAgICAgKytzb3J0ZWRfa2V5c19wb3M7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGxhc3RfdW51c2VkID0gc29ydGVkX2tleXNfcG9zIC0gMTsKLSAgICAgICAgaWYgKGZpcnN0X3VudXNlZCA8IGxhc3RfdW51c2VkKSB7Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgIi8vIHVudXNlZCBmaWVsZHMgIyAiIDw8IGZpcnN0X3VudXNlZCA8PCAiIHRvICIgPDwgbGFzdF91bnVzZWQgPDwgZW5kbDsKLSAgICAgICAgfSBlbHNlIGlmIChmaXJzdF91bnVzZWQgPT0gbGFzdF91bnVzZWQpIHsKLSAgICAgICAgICBpbmRlbnQob3V0KSA8PCAiLy8gdW51c2VkIGZpZWxkICMgIiA8PCBmaXJzdF91bnVzZWQgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICB0X3R5cGUqIGZpZWxkVHlwZSA9ICgqbV9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICAgIHN0cmluZyBnb1R5cGUgPSB0eXBlX3RvX2dvX3R5cGVfd2l0aF9vcHQoZmllbGRUeXBlLCBpc19wb2ludGVyX2ZpZWxkKCptX2l0ZXIpKTsKLSAgICAgIHN0cmluZyBnb3RhZzsKLSAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7Ci0gICAgICAgIGdvdGFnID0gImpzb246XCIiICsgZXNjYXBlX3N0cmluZygoKm1faXRlciktPmdldF9uYW1lKCkpICsgIixvbWl0ZW1wdHlcIiI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBnb3RhZyA9ICJqc29uOlwiIiArIGVzY2FwZV9zdHJpbmcoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSArICJcIiI7Ci0gICAgICB9Ci0gICAgICBzdGQ6Om1hcDxzdHJpbmcsIHN0cmluZz46Oml0ZXJhdG9yIGl0ID0gKCptX2l0ZXIpLT5hbm5vdGF0aW9uc18uZmluZCgiZ28udGFnIik7Ci0gICAgICBpZiAoaXQgIT0gKCptX2l0ZXIpLT5hbm5vdGF0aW9uc18uZW5kKCkpIHsKLSAgICAgICAgZ290YWcgPSBpdC0+c2Vjb25kOwotICAgICAgfQotICAgICAgaW5kZW50KG91dCkgPDwgcHVibGljaXplKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiAiIDw8IGdvVHlwZSA8PCAiIGB0aHJpZnQ6XCIiCi0gICAgICAgICAgICAgICAgICA8PCBlc2NhcGVfc3RyaW5nKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiwiIDw8IHNvcnRlZF9rZXlzX3BvczsKLQotICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICAgICAgb3V0IDw8ICIscmVxdWlyZWQiOwotICAgICAgfQotCi0gICAgICBvdXQgPDwgIlwiICIgPDwgZ290YWcgPDwgImAiIDw8IGVuZGw7Ci0gICAgICBzb3J0ZWRfa2V5c19wb3MrKzsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgLy8gVGhpcyBmaWxscyBpbiBkZWZhdWx0IHZhbHVlcywgYXMgb3Bwb3NlZCB0byBudWxscwotICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHB1YmxpY2l6ZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8ICIgIgotICAgICAgICAgIDw8IHR5cGVfdG9fZ29fdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiZnVuYyBOZXciIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiKCkgKiIgPDwgdHN0cnVjdF9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAmIjsKLSAgZ2VuZXJhdGVfZ29fc3RydWN0X2luaXRpYWxpemVyKG91dCwgdHN0cnVjdCwgaXNfcmVzdWx0IHx8IGlzX2FyZ3MpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgLy8gRGVmYXVsdCB2YWx1ZXMgZm9yIG9wdGlvbmFsIGZpZWxkcwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgc3RyaW5nIHB1YmxpY2l6ZWRfbmFtZTsKLSAgICB0X2NvbnN0X3ZhbHVlKiBkZWZfdmFsdWU7Ci0gICAgZ2V0X3B1YmxpY2l6ZWRfbmFtZV9hbmRfZGVmX3ZhbHVlKCptX2l0ZXIsICZwdWJsaWNpemVkX25hbWUsICZkZWZfdmFsdWUpOwotICAgIHRfdHlwZSogZmllbGRUeXBlID0gKCptX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgIHN0cmluZyBnb1R5cGUgPSB0eXBlX3RvX2dvX3R5cGVfd2l0aF9vcHQoZmllbGRUeXBlLCBmYWxzZSk7Ci0gICAgc3RyaW5nIGRlZl92YXJfbmFtZSA9IHRzdHJ1Y3RfbmFtZSArICJfIiArIHB1YmxpY2l6ZWRfbmFtZSArICJfREVGQVVMVCI7Ci0gICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwgfHwgaXNfcG9pbnRlcl9maWVsZCgqbV9pdGVyKSkgewotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgIiA8PCBkZWZfdmFyX25hbWUgPDwgIiAiIDw8IGdvVHlwZTsKLSAgICAgIGlmIChkZWZfdmFsdWUgIT0gTlVMTCkgewotICAgICAgICBvdXQgPDwgIiA9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkVHlwZSwgZGVmX3ZhbHVlLCAoKm1faXRlciktPmdldF9uYW1lKCkpOwotICAgICAgfQotICAgICAgb3V0IDw8IGVuZGw7Ci0gICAgfQotICAgIGlmIChpc19wb2ludGVyX2ZpZWxkKCptX2l0ZXIpKSB7Ci0gICAgICBzdHJpbmcgZ29PcHRUeXBlID0gdHlwZV90b19nb190eXBlX3dpdGhfb3B0KGZpZWxkVHlwZSwgdHJ1ZSk7Ci0gICAgICBzdHJpbmcgbWF5YmVwb2ludGVyID0gZ29PcHRUeXBlICE9IGdvVHlwZSA/ICIqIiA6ICIiOwotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiKSBHZXQiIDw8IHB1YmxpY2l6ZWRfbmFtZSA8PCAiKCkgIgotICAgICAgICAgIDw8IGdvVHlwZSA8PCAiIHsiIDw8IGVuZGw7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgaWYgIXAuSXNTZXQiIDw8IHB1YmxpY2l6ZWRfbmFtZSA8PCAiKCkgeyIgPDwgZW5kbDsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgIHJldHVybiAiIDw8IGRlZl92YXJfbmFtZSA8PCBlbmRsOwotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IG1heWJlcG9pbnRlciA8PCAicC4iIDw8IHB1YmxpY2l6ZWRfbmFtZSA8PCBlbmRsOwotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgbnVtX3NldGFibGUgKz0gMTsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8IGVuZGw7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgdHN0cnVjdF9uYW1lIDw8ICIpIEdldCIgPDwgcHVibGljaXplZF9uYW1lIDw8ICIoKSAiCi0gICAgICAgICAgPDwgZ29UeXBlIDw8ICIgeyIgPDwgZW5kbDsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gcC4iIDw8IHB1YmxpY2l6ZWRfbmFtZSA8PCBlbmRsOwotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGlmICh0c3RydWN0LT5pc191bmlvbigpICYmIG51bV9zZXRhYmxlID4gMCkgewotICAgIGdlbmVyYXRlX2NvdW50c2V0ZmllbGRzX2hlbHBlcihvdXQsIHRzdHJ1Y3QsIHRzdHJ1Y3RfbmFtZSwgaXNfcmVzdWx0KTsKLSAgfQotCi0gIGdlbmVyYXRlX2lzc2V0X2hlbHBlcnMob3V0LCB0c3RydWN0LCB0c3RydWN0X25hbWUsIGlzX3Jlc3VsdCk7Ci0gIGdlbmVyYXRlX2dvX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0LCB0c3RydWN0X25hbWUsIGlzX3Jlc3VsdCk7Ci0gIGdlbmVyYXRlX2dvX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0LCB0c3RydWN0X25hbWUsIGlzX3Jlc3VsdCwgbnVtX3NldGFibGUgPiAwKTsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgdHN0cnVjdF9uYW1lIDw8ICIpIFN0cmluZygpIHN0cmluZyB7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgaWYgcCA9PSBuaWwgeyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgcmV0dXJuIFwiPG5pbD5cIiIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gZm10LlNwcmludGYoXCIiIDw8IGVzY2FwZV9zdHJpbmcodHN0cnVjdF9uYW1lKSA8PCAiKCUrdilcIiwgKnApIgotICAgICAgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCB0c3RydWN0X25hbWUgPDwgIikgRXJyb3IoKSBzdHJpbmcgeyIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHAuU3RyaW5nKCkiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgdGhlIElzU2V0IGhlbHBlciBtZXRob2RzIGZvciBhIHN0cnVjdAotICovCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9oZWxwZXJzKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHRzdHJ1Y3RfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQpIHsKLSAgKHZvaWQpaXNfcmVzdWx0OwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGNvbnN0IHN0cmluZyBlc2NhcGVkX3RzdHJ1Y3RfbmFtZShlc2NhcGVfc3RyaW5nKHRzdHJ1Y3QtPmdldF9uYW1lKCkpKTsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGNvbnN0IHN0cmluZyBmaWVsZF9uYW1lKHB1YmxpY2l6ZShlc2NhcGVfc3RyaW5nKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkpKTsKLSAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCB8fCBpc19wb2ludGVyX2ZpZWxkKCpmX2l0ZXIpKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgdHN0cnVjdF9uYW1lIDw8ICIpIElzU2V0IiA8PCBmaWVsZF9uYW1lIDw8ICIoKSBib29sIHsiCi0gICAgICAgICAgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgdF90eXBlKiB0dHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X3RydWVfdHlwZSgpOwotICAgICAgYm9vbCBpc19ieXRlc2xpY2UgPSB0dHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5pc19iaW5hcnkoKTsKLSAgICAgIGJvb2wgY29tcGFyZV90b19uaWxfb25seSA9IHR0eXBlLT5pc19zZXQoKSB8fCB0dHlwZS0+aXNfbGlzdCgpIHx8IHR0eXBlLT5pc19tYXAoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGlzX2J5dGVzbGljZSAmJiAhKCpmX2l0ZXIpLT5nZXRfdmFsdWUoKSk7Ci0gICAgICBpZiAoaXNfcG9pbnRlcl9maWVsZCgqZl9pdGVyKSB8fCBjb21wYXJlX3RvX25pbF9vbmx5KSB7Ci0gICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHAuIiA8PCBmaWVsZF9uYW1lIDw8ICIgIT0gbmlsIiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3RyaW5nIGRlZl92YXJfbmFtZSA9IHRzdHJ1Y3RfbmFtZSArICJfIiArIGZpZWxkX25hbWUgKyAiX0RFRkFVTFQiOwotICAgICAgICBpZiAoaXNfYnl0ZXNsaWNlKSB7Ci0gICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIWJ5dGVzLkVxdWFsKHAuIiA8PCBmaWVsZF9uYW1lIDw8ICIsICIgPDwgZGVmX3Zhcl9uYW1lIDw8ICIpIgotICAgICAgICAgICAgICA8PCBlbmRsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHAuIiA8PCBmaWVsZF9uYW1lIDw8ICIgIT0gIiA8PCBkZWZfdmFyX25hbWUgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAgIH0KLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgQ291bnRTZXRGaWVsZHMgaGVscGVyIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY291bnRzZXRmaWVsZHNfaGVscGVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiB0c3RydWN0X25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQpIHsKLSAgKHZvaWQpaXNfcmVzdWx0OwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGNvbnN0IHN0cmluZyBlc2NhcGVkX3RzdHJ1Y3RfbmFtZShlc2NhcGVfc3RyaW5nKHRzdHJ1Y3QtPmdldF9uYW1lKCkpKTsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgdHN0cnVjdF9uYW1lIDw8ICIpIENvdW50U2V0RmllbGRzIiA8PCB0c3RydWN0X25hbWUgPDwgIigpIGludCB7IgotICAgICAgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiY291bnQgOj0gMCIgPDwgZW5kbDsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgaWYgKCFpc19wb2ludGVyX2ZpZWxkKCpmX2l0ZXIpKQotICAgICAgY29udGludWU7Ci0KLSAgICBjb25zdCBzdHJpbmcgZmllbGRfbmFtZShwdWJsaWNpemUoZXNjYXBlX3N0cmluZygoKmZfaXRlciktPmdldF9uYW1lKCkpKSk7Ci0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChwLklzU2V0IiA8PCBmaWVsZF9uYW1lIDw8ICIoKSkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImNvdW50KysiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLQotICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBjb3VudCIgPDwgZW5kbCA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgdGhlIHJlYWQgbWV0aG9kIGZvciBhIHN0cnVjdAotICovCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nb19zdHJ1Y3RfcmVhZGVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHRzdHJ1Y3RfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQpIHsKLSAgKHZvaWQpaXNfcmVzdWx0OwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIHN0cmluZyBlc2NhcGVkX3RzdHJ1Y3RfbmFtZShlc2NhcGVfc3RyaW5nKHRzdHJ1Y3QtPmdldF9uYW1lKCkpKTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiKSAiIDw8IHJlYWRfbWV0aG9kX25hbWVfIDw8ICIoaXByb3QgdGhyaWZ0LlRQcm90b2NvbCkgZXJyb3IgeyIKLSAgICAgIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIF8sIGVyciA6PSBpcHJvdC5SZWFkU3RydWN0QmVnaW4oKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoZm10LlNwcmludGYoXCIlVCByZWFkIGVycm9yOiBcIiwgcCksIGVycikiCi0gICAgICA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBSZXF1aXJlZCB2YXJpYWJsZXMgZG9lcyBub3QgaGF2ZSBJc1NldCBmdW5jdGlvbnMsIHNvIHdlIG5lZWQgdG1wIHZhcnMgdG8gY2hlY2sgdGhlbS4KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgY29uc3Qgc3RyaW5nIGZpZWxkX25hbWUocHVibGljaXplKGVzY2FwZV9zdHJpbmcoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSkpOwotICAgICAgaW5kZW50KG91dCkgPDwgInZhciBpc3NldCIgPDwgZmllbGRfbmFtZSA8PCAiIGJvb2wgPSBmYWxzZTsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0gIG91dCA8PCBlbmRsOwotCi0gIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcwotICBpbmRlbnQob3V0KSA8PCAiZm9yIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICAvLyBSZWFkIGJlZ2lubmluZyBmaWVsZCBtYXJrZXIKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJfLCBmaWVsZFR5cGVJZCwgZmllbGRJZCwgZXJyIDo9IGlwcm90LlJlYWRGaWVsZEJlZ2luKCkiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyICE9IG5pbCB7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIgotICAgICAgICAgICAgICAgICAgICAgIlwiJVQgZmllbGQgJWQgcmVhZCBlcnJvcjogXCIsIHAsIGZpZWxkSWQpLCBlcnIpIiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBmaWVsZFR5cGVJZCA9PSB0aHJpZnQuU1RPUCB7IGJyZWFrOyB9IiA8PCBlbmRsOwotCi0gIHN0cmluZyB0aHJpZnRGaWVsZFR5cGVJZDsKLSAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCi0gIGludDMyX3QgZmllbGRfaWQgPSAtMTsKLQotICAvLyBTd2l0Y2ggc3RhdGVtZW50IG9uIHRoZSBmaWVsZCB3ZSBhcmUgcmVhZGluZywgZmFsc2UgaWYgbm8gZmllbGRzIHByZXNlbnQKLSAgYm9vbCBoYXZlX3N3aXRjaCA9ICFmaWVsZHMuZW1wdHkoKTsKLSAgaWYgKGhhdmVfc3dpdGNoKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInN3aXRjaCBmaWVsZElkIHsiIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBBbGwgdGhlIGZpZWxkcyB3ZSBrbm93Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZmllbGRfaWQgPSAoKmZfaXRlciktPmdldF9rZXkoKTsKLQotICAgIC8vIGlmIG5lZ2F0aXZlIGlkLCBlbnN1cmUgd2UgZ2VuZXJhdGUgYSB2YWxpZCBtZXRob2QgbmFtZQotICAgIHN0cmluZyBmaWVsZF9tZXRob2RfcHJlZml4KCJyZWFkRmllbGQiKTsKLQotICAgIGlmIChmaWVsZF9pZCA8IDApIHsKLSAgICAgIGZpZWxkX21ldGhvZF9wcmVmaXggKz0gIl8iOwotICAgICAgZmllbGRfaWQgKj0gLTE7Ci0gICAgfQotCi0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJjYXNlICIgPDwgZmllbGRfaWQgPDwgIjoiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgdGhyaWZ0RmllbGRUeXBlSWQgPSB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLQotICAgIGlmICh0aHJpZnRGaWVsZFR5cGVJZCA9PSAidGhyaWZ0LkJJTkFSWSIpIHsKLSAgICAgIHRocmlmdEZpZWxkVHlwZUlkID0gInRocmlmdC5TVFJJTkciOwotICAgIH0KLQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IHAuIiA8PCBmaWVsZF9tZXRob2RfcHJlZml4IDw8IGZpZWxkX2lkIDw8ICIoaXByb3QpOyBlcnIgIT0gbmlsIHsiCi0gICAgICAgIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBlcnIiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotCi0gICAgLy8gTWFyayByZXF1aXJlZCBmaWVsZCBhcyByZWFkCi0gICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICAgIGNvbnN0IHN0cmluZyBmaWVsZF9uYW1lKHB1YmxpY2l6ZShlc2NhcGVfc3RyaW5nKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkpKTsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaXNzZXQiIDw8IGZpZWxkX25hbWUgPDwgIiA9IHRydWUiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotCi0gIC8vIEJlZ2luIHN3aXRjaCBkZWZhdWx0IGNhc2UKLSAgaWYgKGhhdmVfc3dpdGNoKSB7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgfQotCi0gIC8vIFNraXAgdW5rbm93biBmaWVsZHMgaW4gZWl0aGVyIGNhc2UKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gaXByb3QuU2tpcChmaWVsZFR5cGVJZCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBlcnIiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLQotICAvLyBFbmQgc3dpdGNoIGRlZmF1bHQgY2FzZQotICBpZiAoaGF2ZV9zd2l0Y2gpIHsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIFJlYWQgZmllbGQgZW5kIG1hcmtlcgotICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSBpcHJvdC5SZWFkRmllbGRFbmQoKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGVyciIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IGlwcm90LlJlYWRTdHJ1Y3RFbmQoKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIgotICAgICAgICAgICAgICAgICAgICAgIlwiJVQgcmVhZCBzdHJ1Y3QgZW5kIGVycm9yOiBcIiwgcCksIGVycikiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLQotICAvLyBSZXR1cm4gZXJyb3IgaWYgYW55IHJlcXVpcmVkIGZpZWxkcyBhcmUgbWlzc2luZy4KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgY29uc3Qgc3RyaW5nIGZpZWxkX25hbWUocHVibGljaXplKGVzY2FwZV9zdHJpbmcoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSkpOwotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAhaXNzZXQiIDw8IGZpZWxkX25hbWUgPDwgInsiIDw8IGVuZGw7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5OZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZSh0aHJpZnQuSU5WQUxJRF9EQVRBLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgImZtdC5FcnJvcmYoXCJSZXF1aXJlZCBmaWVsZCAiIDw8IGZpZWxkX25hbWUgPDwgIiBpcyBub3Qgc2V0XCIpKTsiIDw8IGVuZGw7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gbmlsIiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHN0cmluZyBmaWVsZF90eXBlX25hbWUocHVibGljaXplKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSkpOwotICAgIHN0cmluZyBmaWVsZF9uYW1lKHB1YmxpY2l6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkpKTsKLSAgICBzdHJpbmcgZmllbGRfbWV0aG9kX3ByZWZpeCgicmVhZEZpZWxkIik7Ci0gICAgaW50MzJfdCBmaWVsZF9pZCA9ICgqZl9pdGVyKS0+Z2V0X2tleSgpOwotCi0gICAgaWYgKGZpZWxkX2lkIDwgMCkgewotICAgICAgZmllbGRfbWV0aG9kX3ByZWZpeCArPSAiXyI7Ci0gICAgICBmaWVsZF9pZCAqPSAtMTsKLSAgICB9Ci0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgdHN0cnVjdF9uYW1lIDw8ICIpICAiIDw8IGZpZWxkX21ldGhvZF9wcmVmaXggPDwgZmllbGRfaWQKLSAgICAgICAgPDwgIihpcHJvdCB0aHJpZnQuVFByb3RvY29sKSBlcnJvciB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgZmFsc2UsICJwLiIpOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBuaWwiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLX0KLQotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ29fc3RydWN0X3dyaXRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiB0c3RydWN0X25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHVzZXNfY291bnRzZXRmaWVsZHMpIHsKLSAgKHZvaWQpaXNfcmVzdWx0OwotICBzdHJpbmcgbmFtZSh0c3RydWN0LT5nZXRfbmFtZSgpKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgaW5kZW50KG91dCkgPDwgImZ1bmMgKHAgKiIgPDwgdHN0cnVjdF9uYW1lIDw8ICIpICIgPDwgd3JpdGVfbWV0aG9kX25hbWVfIDw8ICIob3Byb3QgdGhyaWZ0LlRQcm90b2NvbCkgZXJyb3IgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGlmICh0c3RydWN0LT5pc191bmlvbigpICYmIHVzZXNfY291bnRzZXRmaWVsZHMpIHsKLSAgICBzdGQ6OnN0cmluZyB0c3RydWN0X25hbWUocHVibGljaXplKHRzdHJ1Y3QtPmdldF9uYW1lKCkpKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGMgOj0gcC5Db3VudFNldEZpZWxkcyIgPDwgdHN0cnVjdF9uYW1lIDw8ICIoKTsgYyAhPSAxIHsiIDw8IGVuZGwKLSAgICAgICAgPDwgaW5kZW50KCkKLSAgICAgICAgPDwgIiAgcmV0dXJuIGZtdC5FcnJvcmYoXCIlVCB3cml0ZSB1bmlvbjogZXhhY3RseSBvbmUgZmllbGQgbXVzdCBiZSBzZXQgKCVkIHNldCkuXCIsIHAsIGMpIgotICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICB9Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IG9wcm90LldyaXRlU3RydWN0QmVnaW4oXCIiIDw8IG5hbWUgPDwgIlwiKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIgotICAgICAgICAgICAgICAgICAgICAgIlwiJVQgd3JpdGUgc3RydWN0IGJlZ2luIGVycm9yOiBcIiwgcCksIGVycikgfSIgPDwgZW5kbDsKLQotICBzdHJpbmcgZmllbGRfbmFtZTsKLSAgc3RyaW5nIGVzY2FwZV9maWVsZF9uYW1lOwotICAvLyB0X2NvbnN0X3ZhbHVlKiBmaWVsZF9kZWZhdWx0X3ZhbHVlOwotICB0X2ZpZWxkOjplX3JlcSBmaWVsZF9yZXF1aXJlZDsKLSAgaW50MzJfdCBmaWVsZF9pZCA9IC0xOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyaW5nIGZpZWxkX21ldGhvZF9wcmVmaXgoIndyaXRlRmllbGQiKTsKLSAgICBmaWVsZF9uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIGVzY2FwZV9maWVsZF9uYW1lID0gZXNjYXBlX3N0cmluZyhmaWVsZF9uYW1lKTsKLSAgICBmaWVsZF9pZCA9ICgqZl9pdGVyKS0+Z2V0X2tleSgpOwotCi0gICAgaWYgKGZpZWxkX2lkIDwgMCkgewotICAgICAgZmllbGRfbWV0aG9kX3ByZWZpeCArPSAiXyI7Ci0gICAgICBmaWVsZF9pZCAqPSAtMTsKLSAgICB9Ci0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSBwLiIgPDwgZmllbGRfbWV0aG9kX3ByZWZpeCA8PCBmaWVsZF9pZAotICAgICAgICA8PCAiKG9wcm90KTsgZXJyICE9IG5pbCB7IHJldHVybiBlcnIgfSIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IG9wcm90LldyaXRlRmllbGRTdG9wKCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKFwid3JpdGUgZmllbGQgc3RvcCBlcnJvcjogXCIsIGVycikgfSIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gb3Byb3QuV3JpdGVTdHJ1Y3RFbmQoKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoXCJ3cml0ZSBzdHJ1Y3Qgc3RvcCBlcnJvcjogXCIsIGVycikgfSIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gbmlsIiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHN0cmluZyBmaWVsZF9tZXRob2RfcHJlZml4KCJ3cml0ZUZpZWxkIik7Ci0gICAgZmllbGRfaWQgPSAoKmZfaXRlciktPmdldF9rZXkoKTsKLSAgICBmaWVsZF9uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIGVzY2FwZV9maWVsZF9uYW1lID0gZXNjYXBlX3N0cmluZyhmaWVsZF9uYW1lKTsKLSAgICAvLyBmaWVsZF9kZWZhdWx0X3ZhbHVlID0gKCpmX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICBmaWVsZF9yZXF1aXJlZCA9ICgqZl9pdGVyKS0+Z2V0X3JlcSgpOwotCi0gICAgaWYgKGZpZWxkX2lkIDwgMCkgewotICAgICAgZmllbGRfbWV0aG9kX3ByZWZpeCArPSAiXyI7Ci0gICAgICBmaWVsZF9pZCAqPSAtMTsKLSAgICB9Ci0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgdHN0cnVjdF9uYW1lIDw8ICIpICIgPDwgZmllbGRfbWV0aG9kX3ByZWZpeCA8PCBmaWVsZF9pZAotICAgICAgICA8PCAiKG9wcm90IHRocmlmdC5UUHJvdG9jb2wpIChlcnIgZXJyb3IpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBpZiAoZmllbGRfcmVxdWlyZWQgPT0gdF9maWVsZDo6VF9PUFRJT05BTCkgewotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBwLklzU2V0IiA8PCBwdWJsaWNpemUoZmllbGRfbmFtZSkgPDwgIigpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oXCIiIDw8IGVzY2FwZV9maWVsZF9uYW1lIDw8ICJcIiwgIgotICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiIDw8IGZpZWxkX2lkIDw8ICIpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKFwiJVQgd3JpdGUgZmllbGQgYmVnaW4gZXJyb3IgIgotICAgICAgICA8PCBmaWVsZF9pZCA8PCAiOiIgPDwgZXNjYXBlX2ZpZWxkX25hbWUgPDwgIjogXCIsIHApLCBlcnIpIH0iIDw8IGVuZGw7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJwLiIpOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCi0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEVuZCgpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKFwiJVQgd3JpdGUgZmllbGQgZW5kIGVycm9yICIKLSAgICAgICAgPDwgZmllbGRfaWQgPDwgIjoiIDw8IGVzY2FwZV9maWVsZF9uYW1lIDw8ICI6IFwiLCBwKSwgZXJyKSB9IiA8PCBlbmRsOwotCi0gICAgaWYgKGZpZWxkX3JlcXVpcmVkID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGVyciIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgdGVzdF9zdWZmaXgoIl90ZXN0Iik7Ci0gIHN0cmluZyBmaWxlbmFtZSA9IGxvd2VyY2FzZShzZXJ2aWNlX25hbWVfKTsKLSAgc3RyaW5nIGZfc2VydmljZV9uYW1lOwotCi0gIHNpemVfdCBmbmFtZV9sZW4gPSBmaWxlbmFtZS5sZW5ndGgoKTsKLSAgc2l6ZV90IHN1ZmZpeF9sZW4gPSB0ZXN0X3N1ZmZpeC5sZW5ndGgoKTsKLQotICBpZiAoKGZuYW1lX2xlbiA+PSBzdWZmaXhfbGVuKQotICAgICAgJiYgKGZpbGVuYW1lLmNvbXBhcmUoZm5hbWVfbGVuIC0gc3VmZml4X2xlbiwgc3VmZml4X2xlbiwgdGVzdF9zdWZmaXgpID09IDApKSB7Ci0gICAgZl9zZXJ2aWNlX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBmaWxlbmFtZSArICJfLmdvIjsKLSAgfSBlbHNlIHsKLSAgICBmX3NlcnZpY2VfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIGZpbGVuYW1lICsgIi5nbyI7Ci0gIH0KLSAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOwotICBmX3NlcnZpY2VfIDw8IGdvX2F1dG9nZW5fY29tbWVudCgpIDw8IGdvX3BhY2thZ2UoKSA8PCByZW5kZXJfaW5jbHVkZXMoKTsKLQotICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX3JlbW90ZSh0c2VydmljZSk7Ci0gIC8vIENsb3NlIHNlcnZpY2UgZmlsZQotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gIGZfc2VydmljZV8uY2xvc2UoKTsKLSAgZm9ybWF0X2dvX291dHB1dChmX3NlcnZpY2VfbmFtZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGhlbHBlciBmdW5jdGlvbnMgZm9yIGEgc2VydmljZS4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZfc2VydmljZV8gPDwgIi8vIEhFTFBFUiBGVU5DVElPTlMgQU5EIFNUUlVDVFVSRVMiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBnZW5lcmF0ZV9nb19zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCB0cywgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLSAgICBnZW5lcmF0ZV9nb19mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCi0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2dvX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKLSAgICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOwotICAgIHN1Y2Nlc3Muc2V0X3JlcSh0X2ZpZWxkOjpUX09QVElPTkFMKTsKLQotICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOwotICAgIH0KLQotICAgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICB0X2ZpZWxkKiBmID0gKmZfaXRlcjsKLSAgICAgIGYtPnNldF9yZXEodF9maWVsZDo6VF9PUFRJT05BTCk7Ci0gICAgICByZXN1bHQuYXBwZW5kKGYpOwotICAgIH0KLQotICAgIGdlbmVyYXRlX2dvX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sICZyZXN1bHQsIGZhbHNlLCB0cnVlKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfaWYgPSAiIjsKLSAgc3RyaW5nIHNlcnZpY2VOYW1lKHB1YmxpY2l6ZSh0c2VydmljZS0+Z2V0X25hbWUoKSkpOwotICBzdHJpbmcgaW50ZXJmYWNlTmFtZSA9IHNlcnZpY2VOYW1lOwotCi0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgc2l6ZV90IGluZGV4ID0gZXh0ZW5kcy5yZmluZCgiLiIpOwotCi0gICAgaWYgKGluZGV4ICE9IHN0cmluZzo6bnBvcykgewotICAgICAgZXh0ZW5kc19pZiA9ICJcbiIgKyBpbmRlbnQoKSArICIgICIgKyBleHRlbmRzLnN1YnN0cigwLCBpbmRleCArIDEpCi0gICAgICAgICAgICAgICAgICAgKyBwdWJsaWNpemUoZXh0ZW5kcy5zdWJzdHIoaW5kZXggKyAxKSkgKyAiXG4iOwotICAgIH0gZWxzZSB7Ci0gICAgICBleHRlbmRzX2lmID0gIlxuIiArIGluZGVudCgpICsgcHVibGljaXplKGV4dGVuZHMpICsgIlxuIjsKLSAgICB9Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0eXBlICIgPDwgaW50ZXJmYWNlTmFtZSA8PCAiIGludGVyZmFjZSB7IiA8PCBleHRlbmRzX2lmOwotICBpbmRlbnRfdXAoKTsKLSAgZ2VuZXJhdGVfZ29fZG9jc3RyaW5nKGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotCi0gIGlmICghZnVuY3Rpb25zLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gICAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gICAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIGdlbmVyYXRlX2dvX2RvY3N0cmluZyhmX3NlcnZpY2VfLCAoKmZfaXRlcikpOwotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBmdW5jdGlvbl9zaWduYXR1cmVfaWYoKmZfaXRlciwgIiIsIHRydWUpIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19maWVsZCA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfY2xpZW50X25ldyA9ICIiOwotICBzdHJpbmcgc2VydmljZU5hbWUocHVibGljaXplKHRzZXJ2aWNlLT5nZXRfbmFtZSgpKSk7Ci0KLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBzaXplX3QgaW5kZXggPSBleHRlbmRzLnJmaW5kKCIuIik7Ci0KLSAgICBpZiAoaW5kZXggIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgICBleHRlbmRzX2NsaWVudCA9IGV4dGVuZHMuc3Vic3RyKDAsIGluZGV4ICsgMSkgKyBwdWJsaWNpemUoZXh0ZW5kcy5zdWJzdHIoaW5kZXggKyAxKSkKLSAgICAgICAgICAgICAgICAgICAgICAgKyAiQ2xpZW50IjsKLSAgICAgIGV4dGVuZHNfY2xpZW50X25ldyA9IGV4dGVuZHMuc3Vic3RyKDAsIGluZGV4ICsgMSkgKyAiTmV3IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwdWJsaWNpemUoZXh0ZW5kcy5zdWJzdHIoaW5kZXggKyAxKSkgKyAiQ2xpZW50IjsKLSAgICB9IGVsc2UgewotICAgICAgZXh0ZW5kc19jbGllbnQgPSBwdWJsaWNpemUoZXh0ZW5kcykgKyAiQ2xpZW50IjsKLSAgICAgIGV4dGVuZHNfY2xpZW50X25ldyA9ICJOZXciICsgZXh0ZW5kc19jbGllbnQ7Ci0gICAgfQotICB9Ci0KLSAgZXh0ZW5kc19maWVsZCA9IGV4dGVuZHNfY2xpZW50LnN1YnN0cihleHRlbmRzX2NsaWVudC5maW5kKCIuIikgKyAxKTsKLQotICBnZW5lcmF0ZV9nb19kb2NzdHJpbmcoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0eXBlICIgPDwgc2VydmljZU5hbWUgPDwgIkNsaWVudCBzdHJ1Y3QgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaWYgKCFleHRlbmRzX2NsaWVudC5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiKiIgPDwgZXh0ZW5kc19jbGllbnQgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJUcmFuc3BvcnQgdGhyaWZ0LlRUcmFuc3BvcnQiIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiUHJvdG9jb2xGYWN0b3J5IHRocmlmdC5UUHJvdG9jb2xGYWN0b3J5IiA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIklucHV0UHJvdG9jb2wgdGhyaWZ0LlRQcm90b2NvbCIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJPdXRwdXRQcm90b2NvbCB0aHJpZnQuVFByb3RvY29sIiA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIlNlcUlkIGludDMyIiA8PCBlbmRsOwotICAgIC8qZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVxcyBtYXBbaW50MzJdRGVmZXJyZWQiIDw8IGVuZGwqLzsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgLy8gQ29uc3RydWN0b3IgZnVuY3Rpb24KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZnVuYyBOZXciIDw8IHNlcnZpY2VOYW1lCi0gICAgICAgICAgICAgPDwgIkNsaWVudEZhY3RvcnkodCB0aHJpZnQuVFRyYW5zcG9ydCwgZiB0aHJpZnQuVFByb3RvY29sRmFjdG9yeSkgKiIgPDwgc2VydmljZU5hbWUKLSAgICAgICAgICAgICA8PCAiQ2xpZW50IHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gJiIgPDwgc2VydmljZU5hbWUgPDwgIkNsaWVudCI7Ci0KLSAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8ICJ7IiA8PCBleHRlbmRzX2ZpZWxkIDw8ICI6ICIgPDwgZXh0ZW5kc19jbGllbnRfbmV3IDw8ICJGYWN0b3J5KHQsIGYpfSI7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCAie1RyYW5zcG9ydDogdCwiIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiUHJvdG9jb2xGYWN0b3J5OiBmLCIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJJbnB1dFByb3RvY29sOiBmLkdldFByb3RvY29sKHQpLCIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJPdXRwdXRQcm90b2NvbDogZi5HZXRQcm90b2NvbCh0KSwiIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiU2VxSWQ6IDAsIiA8PCBlbmRsOwotICAgIC8qZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiUmVxczogbWFrZShtYXBbaW50MzJdRGVmZXJyZWQpIiA8PCBlbmRsKi87Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAvLyBDb25zdHJ1Y3RvciBmdW5jdGlvbgotICBmX3NlcnZpY2VfCi0gICAgICA8PCBpbmRlbnQoKSA8PCAiZnVuYyBOZXciIDw8IHNlcnZpY2VOYW1lCi0gICAgICA8PCAiQ2xpZW50UHJvdG9jb2wodCB0aHJpZnQuVFRyYW5zcG9ydCwgaXByb3QgdGhyaWZ0LlRQcm90b2NvbCwgb3Byb3QgdGhyaWZ0LlRQcm90b2NvbCkgKiIKLSAgICAgIDw8IHNlcnZpY2VOYW1lIDw8ICJDbGllbnQgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiAmIiA8PCBzZXJ2aWNlTmFtZSA8PCAiQ2xpZW50IjsKLQotICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwgInsiIDw8IGV4dGVuZHNfZmllbGQgPDwgIjogIiA8PCBleHRlbmRzX2NsaWVudF9uZXcgPDwgIlByb3RvY29sKHQsIGlwcm90LCBvcHJvdCl9IgotICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmX3NlcnZpY2VfIDw8ICJ7VHJhbnNwb3J0OiB0LCIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJQcm90b2NvbEZhY3Rvcnk6IG5pbCwiIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiSW5wdXRQcm90b2NvbDogaXByb3QsIiA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIk91dHB1dFByb3RvY29sOiBvcHJvdCwiIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiU2VxSWQ6IDAsIiA8PCBlbmRsOwotICAgIC8qZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiUmVxczogbWFrZShtYXBbaW50MzJdaW50ZXJmYWNle30pIiA8PCBlbmRsKi87Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7Ci0gICAgc3RyaW5nIGZ1bm5hbWUgPSBwdWJsaWNpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgZ2VuZXJhdGVfZ29fZG9jc3RyaW5nKGZfc2VydmljZV8sICgqZl9pdGVyKSk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCBzZXJ2aWNlTmFtZSA8PCAiQ2xpZW50KSAiCi0gICAgICAgICAgICAgICA8PCBmdW5jdGlvbl9zaWduYXR1cmVfaWYoKmZfaXRlciwgIiIsIHRydWUpIDw8ICIgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICAvKgotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJwLlNlcUlkICs9IDEiIDw8IGVuZGw7Ci0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJkIDo9IGRlZmVyLkRlZmVycmVkKCkiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInAuUmVxc1twLlNlcUlkXSA9IGQiIDw8IGVuZGw7Ci0gICAgfQotICAgICovCi0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyID0gcC5zZW5kIiA8PCBmdW5uYW1lIDw8ICIoIjsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLQotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICAgIH0KLQotICAgICAgZl9zZXJ2aWNlXyA8PCB2YXJpYWJsZV9uYW1lX3RvX2dvX25hbWUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpOwotICAgIH0KLQotICAgIGZfc2VydmljZV8gPDwgIik7IGVyciAhPSBuaWwgeyByZXR1cm4gfSIgPDwgZW5kbDsKLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHAucmVjdiIgPDwgZnVubmFtZSA8PCAiKCkiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHNlcnZpY2VOYW1lIDw8ICJDbGllbnQpIHNlbmQiCi0gICAgICAgICAgICAgICA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgIihlcnIgZXJyb3IpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgc3RkOjpzdHJpbmcgYXJnc25hbWUgPSBwdWJsaWNpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIiwgdHJ1ZSk7Ci0gICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0IGhlYWRlcgotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90IDo9IHAuT3V0cHV0UHJvdG9jb2wiIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgb3Byb3QgPT0gbmlsIHsiIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICBvcHJvdCA9IHAuUHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHAuVHJhbnNwb3J0KSIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIHAuT3V0cHV0UHJvdG9jb2wgPSBvcHJvdCIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInAuU2VxSWQrKyIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiBlcnIgPSBvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICA8PCAiXCIsICIgPDwgKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkgPyAidGhyaWZ0Lk9ORVdBWSIgOiAidGhyaWZ0LkNBTEwiKQotICAgICAgICAgICAgICAgPDwgIiwgcC5TZXFJZCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncyA6PSAiIDw8IGFyZ3NuYW1lIDw8ICJ7IiA8PCBlbmRsOwotCi0gICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgcHVibGljaXplKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiIDogIgotICAgICAgICAgICAgICAgICA8PCB2YXJpYWJsZV9uYW1lX3RvX2dvX25hbWUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpIDw8ICIsIiA8PCBlbmRsOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotCi0gICAgLy8gV3JpdGUgdG8gdGhlIHN0cmVhbQotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIGVyciA9IGFyZ3MuIiA8PCB3cml0ZV9tZXRob2RfbmFtZV8gPDwgIihvcHJvdCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyID0gb3Byb3QuV3JpdGVNZXNzYWdlRW5kKCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIG9wcm90LkZsdXNoKCkiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdG5hbWUgPSBwdWJsaWNpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiLCB0cnVlKTsKLSAgICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICAgIGZfc2VydmljZV8gPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCBzZXJ2aWNlTmFtZSA8PCAiQ2xpZW50KSByZWN2IgotICAgICAgICAgICAgICAgICA8PCBwdWJsaWNpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKCkgKCI7Ci0KLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAidmFsdWUgIiA8PCB0eXBlX3RvX2dvX3R5cGUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSA8PCAiLCAiOwotICAgICAgfQotCi0gICAgICBmX3NlcnZpY2VfIDw8ICJlcnIgZXJyb3IpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIC8vIFRPRE8obWNzbGVlKTogVmFsaWRhdGUgbWVzc2FnZSByZXBseSBoZXJlLCBzZXEgaWRzIGV0Yy4KLSAgICAgIHN0cmluZyBlcnJvcih0bXAoImVycm9yIikpOwotICAgICAgc3RyaW5nIGVycm9yMih0bXAoImVycm9yIikpOwotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaXByb3QgOj0gcC5JbnB1dFByb3RvY29sIiA8PCBlbmRsOwotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgaXByb3QgPT0gbmlsIHsiIDw8IGVuZGw7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIGlwcm90ID0gcC5Qcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wocC5UcmFuc3BvcnQpIiA8PCBlbmRsOwotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICBwLklucHV0UHJvdG9jb2wgPSBpcHJvdCIgPDwgZW5kbDsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJtZXRob2QsIG1UeXBlSWQsIHNlcUlkLCBlcnIgOj0gaXByb3QuUmVhZE1lc3NhZ2VCZWdpbigpIiA8PCBlbmRsOwotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyICE9IG5pbCB7IiA8PCBlbmRsOwotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGw7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgbWV0aG9kICE9IFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiIHsiIDw8IGVuZGw7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIGVyciA9IHRocmlmdC5OZXdUQXBwbGljYXRpb25FeGNlcHRpb24oIgotICAgICAgICAgICAgICAgICA8PCAidGhyaWZ0LldST05HX01FVEhPRF9OQU1FLCBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgIDw8ICIgZmFpbGVkOiB3cm9uZyBtZXRob2QgbmFtZVwiKSIgPDwgZW5kbDsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIiA8PCBlbmRsOwotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIHAuU2VxSWQgIT0gc2VxSWQgeyIgPDwgZW5kbDsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgZXJyID0gdGhyaWZ0Lk5ld1RBcHBsaWNhdGlvbkV4Y2VwdGlvbigiCi0gICAgICAgICAgICAgICAgIDw8ICJ0aHJpZnQuQkFEX1NFUVVFTkNFX0lELCBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgIDw8ICIgZmFpbGVkOiBvdXQgb2Ygc2VxdWVuY2UgcmVzcG9uc2VcIikiIDw8IGVuZGw7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiIgPDwgZW5kbDsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiBtVHlwZUlkID09IHRocmlmdC5FWENFUFRJT04geyIgPDwgZW5kbDsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgIiA8PCBlcnJvcgotICAgICAgICAgICAgICAgICA8PCAiIDo9IHRocmlmdC5OZXdUQXBwbGljYXRpb25FeGNlcHRpb24odGhyaWZ0LlVOS05PV05fQVBQTElDQVRJT05fRVhDRVBUSU9OLCAiCi0gICAgICAgICAgICAgICAgICAgICJcIlVua25vd24gRXhjZXB0aW9uXCIpIiA8PCBlbmRsOwotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICB2YXIgIiA8PCBlcnJvcjIgPDwgIiBlcnJvciIgPDwgZW5kbDsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgIiA8PCBlcnJvcjIgPDwgIiwgZXJyID0gIiA8PCBlcnJvciA8PCAiLiIgPDwgcmVhZF9tZXRob2RfbmFtZV8gPDwgIihpcHJvdCkiIDw8IGVuZGw7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIGlmIGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgICByZXR1cm4iIDw8IGVuZGw7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIGlmIGVyciA9IGlwcm90LlJlYWRNZXNzYWdlRW5kKCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgICByZXR1cm4iIDw8IGVuZGw7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIGVyciA9ICIgPDwgZXJyb3IyIDw8IGVuZGw7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiIgPDwgZW5kbDsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiBtVHlwZUlkICE9IHRocmlmdC5SRVBMWSB7IiA8PCBlbmRsOwotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICBlcnIgPSB0aHJpZnQuTmV3VEFwcGxpY2F0aW9uRXhjZXB0aW9uKCIKLSAgICAgICAgICAgICAgICAgPDwgInRocmlmdC5JTlZBTElEX01FU1NBR0VfVFlQRV9FWENFUFRJT04sIFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgPDwgIiBmYWlsZWQ6IGludmFsaWQgbWVzc2FnZSB0eXBlXCIpIiA8PCBlbmRsOwotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGw7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0IDo9ICIgPDwgcmVzdWx0bmFtZSA8PCAie30iIDw8IGVuZGw7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiBlcnIgPSByZXN1bHQuIiA8PCByZWFkX21ldGhvZF9uYW1lXyA8PCAiKGlwcm90KTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOwotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGw7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyID0gaXByb3QuUmVhZE1lc3NhZ2VFbmQoKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOwotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGw7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotCi0gICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0KLSAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHB1Ym5hbWUgPSBwdWJsaWNpemUoKCp4X2l0ZXIpLT5nZXRfbmFtZSgpKTsKLQotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiByZXN1bHQuIiA8PCBwdWJuYW1lIDw8ICIgIT0gbmlsIHsiIDw8IGVuZGw7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgZXJyID0gcmVzdWx0LiIgPDwgcHVibmFtZSA8PCBlbmRsOwotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVuZGw7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iOwotCi0gICAgICAgIGlmICgoeF9pdGVyICsgMSkgIT0geGNlcHRpb25zLmVuZCgpKSB7Ci0gICAgICAgICAgZl9zZXJ2aWNlXyA8PCAiIGVsc2UgIjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInZhbHVlID0gcmVzdWx0LkdldFN1Y2Nlc3MoKSIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIiA8PCBlbmRsOwotICAgICAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgLy8gaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGNvbW1hbmQgbGluZSB0b29sIGZvciBtYWtpbmcgcmVtb3RlIHJlcXVlc3RzCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgcmVtb3RlIGZvci4KLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9yZW1vdGUodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHRfc2VydmljZSogcGFyZW50ID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7Ci0KLSAgLy8gY29sbGVjdCBpbmhlcml0ZWQgZnVuY3Rpb25zCi0gIHdoaWxlIChwYXJlbnQgIT0gTlVMTCkgewotICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gcF9mdW5jdGlvbnMgPSBwYXJlbnQtPmdldF9mdW5jdGlvbnMoKTsKLSAgICBmdW5jdGlvbnMuaW5zZXJ0KGZ1bmN0aW9ucy5lbmQoKSwgcF9mdW5jdGlvbnMuYmVnaW4oKSwgcF9mdW5jdGlvbnMuZW5kKCkpOwotICAgIHBhcmVudCA9IHBhcmVudC0+Z2V0X2V4dGVuZHMoKTsKLSAgfQotCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgc3RyaW5nIGZfcmVtb3RlX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyB1bmRlcnNjb3JlKHNlcnZpY2VfbmFtZV8pICsgIi1yZW1vdGUvIgotICAgICAgICAgICAgICAgICAgICAgICAgICsgdW5kZXJzY29yZShzZXJ2aWNlX25hbWVfKSArICItcmVtb3RlLmdvIjsKLSAgb2ZzdHJlYW0gZl9yZW1vdGU7Ci0gIGZfcmVtb3RlLm9wZW4oZl9yZW1vdGVfbmFtZS5jX3N0cigpKTsKLSAgc3RyaW5nIHNlcnZpY2VfbW9kdWxlID0gZ2V0X3JlYWxfZ29fbW9kdWxlKHByb2dyYW1fKTsKLSAgc3RyaW5nOjpzaXplX3R5cGUgbG9jOwotCi0gIHdoaWxlICgobG9jID0gc2VydmljZV9tb2R1bGUuZmluZCgiLiIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICBzZXJ2aWNlX21vZHVsZS5yZXBsYWNlKGxvYywgMSwgMSwgJy8nKTsKLSAgfQotICBpZiAoIWdlbl9wYWNrYWdlX3ByZWZpeF8uZW1wdHkoKSkgewotICAgIHNlcnZpY2VfbW9kdWxlID0gZ2VuX3BhY2thZ2VfcHJlZml4XyArIHNlcnZpY2VfbW9kdWxlOwotICB9Ci0KLSAgZl9yZW1vdGUgPDwgZ29fYXV0b2dlbl9jb21tZW50KCk7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJwYWNrYWdlIG1haW4iIDw8IGVuZGwgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImltcG9ydCAoIiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgICAgICBcImZsYWdcIiIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgXCJmbXRcIiIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgXCJtYXRoXCIiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgICAgIFwibmV0XCIiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgICAgIFwibmV0L3VybFwiIiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgICAgICBcIm9zXCIiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgICAgIFwic3RyY29udlwiIiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgICAgICBcInN0cmluZ3NcIiIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgXCIiICsgZ2VuX3RocmlmdF9pbXBvcnRfICsgIlwiIiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgICAgICBcIiIgPDwgc2VydmljZV9tb2R1bGUgPDwgIlwiIiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiKSIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImZ1bmMgVXNhZ2UoKSB7IiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBmbXQuRnByaW50bG4ob3MuU3RkZXJyLCBcIlVzYWdlIG9mIFwiLCBvcy5BcmdzWzBdLCBcIiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJbLWggaG9zdDpwb3J0XSBbLXUgdXJsXSBbLWZbcmFtZWRdXSBmdW5jdGlvbiBbYXJnMSBbYXJnMi4uLl1dOlwiKSIKLSAgICAgICAgICAgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgZmxhZy5QcmludERlZmF1bHRzKCkiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGZtdC5GcHJpbnRsbihvcy5TdGRlcnIsIFwiXFxuRnVuY3Rpb25zOlwiKSIgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGZfcmVtb3RlIDw8ICIgIGZtdC5GcHJpbnRsbihvcy5TdGRlcnIsIFwiICAiIDw8ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+Z2V0X25hbWUoKSA8PCAiICIKLSAgICAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIigiOwotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgYXJncyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgYV9pdGVyOwotICAgIHN0ZDo6dmVjdG9yPHRfZmllbGQqPjo6c2l6ZV90eXBlIG51bV9hcmdzID0gYXJncy5zaXplKCk7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0KLSAgICBmb3IgKHN0ZDo6dmVjdG9yPHRfZmllbGQqPjo6c2l6ZV90eXBlIGkgPSAwOyBpIDwgbnVtX2FyZ3M7ICsraSkgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3JlbW90ZSA8PCAiLCAiOwotICAgICAgfQotCi0gICAgICBmX3JlbW90ZSA8PCBhcmdzW2ldLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpIDw8ICIgIiA8PCBhcmdzW2ldLT5nZXRfbmFtZSgpOwotICAgIH0KLQotICAgIGZfcmVtb3RlIDw8ICIpXCIpIiA8PCBlbmRsOwotICB9Ci0KLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgZm10LkZwcmludGxuKG9zLlN0ZGVycikiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIG9zLkV4aXQoMCkiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZnVuYyBtYWluKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJmbGFnLlVzYWdlID0gVXNhZ2UiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ2YXIgaG9zdCBzdHJpbmciIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ2YXIgcG9ydCBpbnQiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ2YXIgcHJvdG9jb2wgc3RyaW5nIiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAidmFyIHVybFN0cmluZyBzdHJpbmciIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ2YXIgZnJhbWVkIGJvb2wiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ2YXIgdXNlSHR0cCBib29sIiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAidmFyIHBhcnNlZFVybCB1cmwuVVJMIiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAidmFyIHRyYW5zIHRocmlmdC5UVHJhbnNwb3J0IiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiXyA9IHN0cmNvbnYuQXRvaSIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIl8gPSBtYXRoLkFicyIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImZsYWcuVXNhZ2UgPSBVc2FnZSIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImZsYWcuU3RyaW5nVmFyKCZob3N0LCBcImhcIiwgXCJsb2NhbGhvc3RcIiwgXCJTcGVjaWZ5IGhvc3QgYW5kIHBvcnRcIikiCi0gICAgICAgICAgIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJmbGFnLkludFZhcigmcG9ydCwgXCJwXCIsIDkwOTAsIFwiU3BlY2lmeSBwb3J0XCIpIiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZmxhZy5TdHJpbmdWYXIoJnByb3RvY29sLCBcIlBcIiwgXCJiaW5hcnlcIiwgXCIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJTcGVjaWZ5IHRoZSBwcm90b2NvbCAoYmluYXJ5LCBjb21wYWN0LCBzaW1wbGVqc29uLCBqc29uKVwiKSIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImZsYWcuU3RyaW5nVmFyKCZ1cmxTdHJpbmcsIFwidVwiLCBcIlwiLCBcIlNwZWNpZnkgdGhlIHVybFwiKSIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImZsYWcuQm9vbFZhcigmZnJhbWVkLCBcImZyYW1lZFwiLCBmYWxzZSwgXCJVc2UgZnJhbWVkIHRyYW5zcG9ydFwiKSIKLSAgICAgICAgICAgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImZsYWcuQm9vbFZhcigmdXNlSHR0cCwgXCJodHRwXCIsIGZhbHNlLCBcIlVzZSBodHRwXCIpIiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZmxhZy5QYXJzZSgpIiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiaWYgbGVuKHVybFN0cmluZykgPiAwIHsiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHBhcnNlZFVybCwgZXJyIDo9IHVybC5QYXJzZSh1cmxTdHJpbmcpIiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBpZiBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgZm10LkZwcmludGxuKG9zLlN0ZGVyciwgXCJFcnJvciBwYXJzaW5nIFVSTDogXCIsIGVycikiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgZmxhZy5Vc2FnZSgpIiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBob3N0ID0gcGFyc2VkVXJsLkhvc3QiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHVzZUh0dHAgPSBsZW4ocGFyc2VkVXJsLlNjaGVtZSkgPD0gMCB8fCBwYXJzZWRVcmwuU2NoZW1lID09IFwiaHR0cFwiIgotICAgICAgICAgICA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIGlmIHVzZUh0dHAgeyIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgXywgZXJyIDo9IHVybC5QYXJzZShmbXQuU3ByaW50KFwiaHR0cDovL1wiLCBob3N0LCBcIjpcIiwgcG9ydCkpIgotICAgICAgICAgICA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBpZiBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgZm10LkZwcmludGxuKG9zLlN0ZGVyciwgXCJFcnJvciBwYXJzaW5nIFVSTDogXCIsIGVycikiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgZmxhZy5Vc2FnZSgpIiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImNtZCA6PSBmbGFnLkFyZygwKSIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInZhciBlcnIgZXJyb3IiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJpZiB1c2VIdHRwIHsiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHRyYW5zLCBlcnIgPSB0aHJpZnQuTmV3VEh0dHBDbGllbnQocGFyc2VkVXJsLlN0cmluZygpKSIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBwb3J0U3RyIDo9IGZtdC5TcHJpbnQocG9ydCkiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGlmIHN0cmluZ3MuQ29udGFpbnMoaG9zdCwgXCI6XCIpIHsiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgICAgICBob3N0LCBwb3J0U3RyLCBlcnIgPSBuZXQuU3BsaXRIb3N0UG9ydChob3N0KSIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgIGlmIGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgZm10LkZwcmludGxuKG9zLlN0ZGVyciwgXCJlcnJvciB3aXRoIGhvc3Q6XCIsIGVycikiCi0gICAgICAgICAgIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgIG9zLkV4aXQoMSkiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgICAgICB9IiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICB0cmFucywgZXJyID0gdGhyaWZ0Lk5ld1RTb2NrZXQobmV0LkpvaW5Ib3N0UG9ydChob3N0LCBwb3J0U3RyKSkiCi0gICAgICAgICAgIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGlmIGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICBmbXQuRnByaW50bG4ob3MuU3RkZXJyLCBcImVycm9yIHJlc29sdmluZyBhZGRyZXNzOlwiLCBlcnIpIiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgIG9zLkV4aXQoMSkiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGlmIGZyYW1lZCB7IiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgIHRyYW5zID0gdGhyaWZ0Lk5ld1RGcmFtZWRUcmFuc3BvcnQodHJhbnMpIiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImlmIGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgZm10LkZwcmludGxuKG9zLlN0ZGVyciwgXCJFcnJvciBjcmVhdGluZyB0cmFuc3BvcnRcIiwgZXJyKSIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgb3MuRXhpdCgxKSIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJkZWZlciB0cmFucy5DbG9zZSgpIiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAidmFyIHByb3RvY29sRmFjdG9yeSB0aHJpZnQuVFByb3RvY29sRmFjdG9yeSIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInN3aXRjaCBwcm90b2NvbCB7IiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiY2FzZSBcImNvbXBhY3RcIjoiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHByb3RvY29sRmFjdG9yeSA9IHRocmlmdC5OZXdUQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpIiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBicmVhayIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImNhc2UgXCJzaW1wbGVqc29uXCI6IiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBwcm90b2NvbEZhY3RvcnkgPSB0aHJpZnQuTmV3VFNpbXBsZUpTT05Qcm90b2NvbEZhY3RvcnkoKSIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgYnJlYWsiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJjYXNlIFwianNvblwiOiIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgcHJvdG9jb2xGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RKU09OUHJvdG9jb2xGYWN0b3J5KCkiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGJyZWFrIiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiY2FzZSBcImJpbmFyeVwiLCBcIlwiOiIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgcHJvdG9jb2xGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RCaW5hcnlQcm90b2NvbEZhY3RvcnlEZWZhdWx0KCkiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGJyZWFrIiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGZtdC5GcHJpbnRsbihvcy5TdGRlcnIsIFwiSW52YWxpZCBwcm90b2NvbCBzcGVjaWZpZWQ6IFwiLCBwcm90b2NvbCkiCi0gICAgICAgICAgIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIFVzYWdlKCkiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIG9zLkV4aXQoMSkiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiY2xpZW50IDo9ICIgPDwgcGFja2FnZV9uYW1lXyA8PCAiLk5ldyIgPDwgcHVibGljaXplKHNlcnZpY2VfbmFtZV8pCi0gICAgICAgICAgIDw8ICJDbGllbnRGYWN0b3J5KHRyYW5zLCBwcm90b2NvbEZhY3RvcnkpIiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IHRyYW5zLk9wZW4oKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBmbXQuRnByaW50bG4ob3MuU3RkZXJyLCBcIkVycm9yIG9wZW5pbmcgc29ja2V0IHRvIFwiLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJob3N0LCBcIjpcIiwgcG9ydCwgXCIgXCIsIGVycikiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIG9zLkV4aXQoMSkiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAic3dpdGNoIGNtZCB7IiA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBhcmdzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBhX2l0ZXI7Ci0gICAgc3RkOjp2ZWN0b3I8dF9maWVsZCo+OjpzaXplX3R5cGUgbnVtX2FyZ3MgPSBhcmdzLnNpemUoKTsKLSAgICBzdHJpbmcgZnVuY05hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICBzdHJpbmcgcHViTmFtZShwdWJsaWNpemUoZnVuY05hbWUpKTsKLSAgICBzdHJpbmcgYXJndW1lbnRzTmFtZShwdWJsaWNpemUoZnVuY05hbWUgKyAiX2FyZ3MiLCB0cnVlKSk7Ci0gICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImNhc2UgXCIiIDw8IGVzY2FwZV9zdHJpbmcoZnVuY05hbWUpIDw8ICJcIjoiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImlmIGZsYWcuTkFyZygpIC0gMSAhPSAiIDw8IG51bV9hcmdzIDw8ICIgeyIgPDwgZW5kbDsKLSAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBmbXQuRnByaW50bG4ob3MuU3RkZXJyLCBcIiIgPDwgZXNjYXBlX3N0cmluZyhwdWJOYW1lKSA8PCAiIHJlcXVpcmVzICIKLSAgICAgICAgICAgICA8PCBudW1fYXJncyA8PCAiIGFyZ3NcIikiIDw8IGVuZGw7Ci0gICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgZmxhZy5Vc2FnZSgpIiA8PCBlbmRsOwotICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotCi0gICAgZm9yIChzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj46OnNpemVfdHlwZSBpID0gMDsgaSA8IG51bV9hcmdzOyArK2kpIHsKLSAgICAgIGludCBmbGFnQXJnID0gaSArIDE7Ci0gICAgICB0X3R5cGUqIHRoZV90eXBlKGFyZ3NbaV0tPmdldF90eXBlKCkpOwotICAgICAgdF90eXBlKiB0aGVfdHlwZTIoZ2V0X3RydWVfdHlwZSh0aGVfdHlwZSkpOwotCi0gICAgICBpZiAodGhlX3R5cGUyLT5pc19lbnVtKCkpIHsKLSAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInRtcCIgPDwgaSA8PCAiLCBlcnIgOj0gKHN0cmNvbnYuQXRvaShmbGFnLkFyZygiIDw8IGZsYWdBcmcgPDwgIikpKSIKLSAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImlmIGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKLSAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgVXNhZ2UoKSIgPDwgZW5kbDsKLSAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiByZXR1cm4iIDw8IGVuZGw7Ci0gICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiYXJndmFsdWUiIDw8IGkgPDwgIiA6PSAiIDw8IHBhY2thZ2VfbmFtZV8gPDwgIi4iCi0gICAgICAgICAgICAgICAgIDw8IHB1YmxpY2l6ZSh0aGVfdHlwZS0+Z2V0X25hbWUoKSkgPDwgIih0bXAiIDw8IGkgPDwgIikiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgaWYgKHRoZV90eXBlMi0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSBlID0gKCh0X2Jhc2VfdHlwZSopdGhlX3R5cGUyKS0+Z2V0X2Jhc2UoKTsKLSAgICAgICAgc3RyaW5nIGVycih0bXAoImVyciIpKTsKLQotICAgICAgICBzd2l0Y2ggKGUpIHsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0aGVfdHlwZTIpLT5pc19iaW5hcnkoKSkgewotICAgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImFyZ3ZhbHVlIiA8PCBpIDw8ICIgOj0gW11ieXRlKGZsYWcuQXJnKCIgPDwgZmxhZ0FyZyA8PCAiKSkiCi0gICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiYXJndmFsdWUiIDw8IGkgPDwgIiA6PSBmbGFnLkFyZygiIDw8IGZsYWdBcmcgPDwgIikiIDw8IGVuZGw7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiYXJndmFsdWUiIDw8IGkgPDwgIiA6PSBmbGFnLkFyZygiIDw8IGZsYWdBcmcgPDwgIikgPT0gXCJ0cnVlXCIiCi0gICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInRtcCIgPDwgaSA8PCAiLCAiIDw8IGVyciA8PCAiIDo9IChzdHJjb252LkF0b2koZmxhZy5BcmcoIgotICAgICAgICAgICAgICAgICAgIDw8IGZsYWdBcmcgPDwgIikpKSIgPDwgZW5kbDsKLSAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiaWYgIiA8PCBlcnIgPDwgIiAhPSBuaWwgeyIgPDwgZW5kbDsKLSAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBVc2FnZSgpIiA8PCBlbmRsOwotICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiIgPDwgZW5kbDsKLSAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiYXJndmFsdWUiIDw8IGkgPDwgIiA6PSBieXRlKHRtcCIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAidG1wIiA8PCBpIDw8ICIsICIgPDwgZXJyIDw8ICIgOj0gKHN0cmNvbnYuQXRvaShmbGFnLkFyZygiCi0gICAgICAgICAgICAgICAgICAgPDwgZmxhZ0FyZyA8PCAiKSkpIiA8PCBlbmRsOwotICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJpZiAiIDw8IGVyciA8PCAiICE9IG5pbCB7IiA8PCBlbmRsOwotICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIFVzYWdlKCkiIDw8IGVuZGw7Ci0gICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIiA8PCBlbmRsOwotICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJhcmd2YWx1ZSIgPDwgaSA8PCAiIDo9IGJ5dGUodG1wIiA8PCBpIDw8ICIpIiA8PCBlbmRsOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ0bXAiIDw8IGkgPDwgIiwgIiA8PCBlcnIgPDwgIiA6PSAoc3RyY29udi5BdG9pKGZsYWcuQXJnKCIKLSAgICAgICAgICAgICAgICAgICA8PCBmbGFnQXJnIDw8ICIpKSkiIDw8IGVuZGw7Ci0gICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImlmICIgPDwgZXJyIDw8ICIgIT0gbmlsIHsiIDw8IGVuZGw7Ci0gICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgVXNhZ2UoKSIgPDwgZW5kbDsKLSAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGw7Ci0gICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImFyZ3ZhbHVlIiA8PCBpIDw8ICIgOj0gaW50MzIodG1wIiA8PCBpIDw8ICIpIiA8PCBlbmRsOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJhcmd2YWx1ZSIgPDwgaSA8PCAiLCAiIDw8IGVycgotICAgICAgICAgICAgICAgICAgIDw8ICIgOj0gKHN0cmNvbnYuUGFyc2VJbnQoZmxhZy5BcmcoIiA8PCBmbGFnQXJnIDw8ICIpLCAxMCwgNjQpKSIgPDwgZW5kbDsKLSAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiaWYgIiA8PCBlcnIgPDwgIiAhPSBuaWwgeyIgPDwgZW5kbDsKLSAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBVc2FnZSgpIiA8PCBlbmRsOwotICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiIgPDwgZW5kbDsKLSAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiYXJndmFsdWUiIDw8IGkgPDwgIiwgIiA8PCBlcnIKLSAgICAgICAgICAgICAgICAgICA8PCAiIDo9IChzdHJjb252LlBhcnNlRmxvYXQoZmxhZy5BcmcoIiA8PCBmbGFnQXJnIDw8ICIpLCA2NCkpIiA8PCBlbmRsOwotICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJpZiAiIDw8IGVyciA8PCAiICE9IG5pbCB7IiA8PCBlbmRsOwotICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIFVzYWdlKCkiIDw8IGVuZGw7Ci0gICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIiA8PCBlbmRsOwotICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgdGhyb3coIkludmFsaWQgYmFzZSB0eXBlIGluIGdlbmVyYXRlX3NlcnZpY2VfcmVtb3RlIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBmX3JlbW90ZSA8PCBwdWJsaWNpemUoYXJnc1tpXS0+Z2V0X25hbWUoKSkgPDwgIihzdHJjb252LkF0b2koZmxhZy5BcmcoIiA8PCBmbGFnQXJnIDw8Ci0gICAgICAgIC8vICIpKSkiOwotICAgICAgfSBlbHNlIGlmICh0aGVfdHlwZTItPmlzX3N0cnVjdCgpKSB7Ci0gICAgICAgIHN0cmluZyBhcmcodG1wKCJhcmciKSk7Ci0gICAgICAgIHN0cmluZyBtYlRyYW5zKHRtcCgibWJUcmFucyIpKTsKLSAgICAgICAgc3RyaW5nIGVycjEodG1wKCJlcnIiKSk7Ci0gICAgICAgIHN0cmluZyBmYWN0b3J5KHRtcCgiZmFjdG9yeSIpKTsKLSAgICAgICAgc3RyaW5nIGpzUHJvdCh0bXAoImpzUHJvdCIpKTsKLSAgICAgICAgc3RyaW5nIGVycjIodG1wKCJlcnIiKSk7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIHRzdHJ1Y3RfbmFtZShwdWJsaWNpemUodGhlX3R5cGUtPmdldF9uYW1lKCkpKTsKLSAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgYXJnIDw8ICIgOj0gZmxhZy5BcmcoIiA8PCBmbGFnQXJnIDw8ICIpIiA8PCBlbmRsOwotICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBtYlRyYW5zIDw8ICIgOj0gdGhyaWZ0Lk5ld1RNZW1vcnlCdWZmZXJMZW4obGVuKCIgPDwgYXJnIDw8ICIpKSIKLSAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImRlZmVyICIgPDwgbWJUcmFucyA8PCAiLkNsb3NlKCkiIDw8IGVuZGw7Ci0gICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJfLCAiIDw8IGVycjEgPDwgIiA6PSAiIDw8IG1iVHJhbnMgPDwgIi5Xcml0ZVN0cmluZygiIDw8IGFyZyA8PCAiKSIKLSAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImlmICIgPDwgZXJyMSA8PCAiICE9IG5pbCB7IiA8PCBlbmRsOwotICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBVc2FnZSgpIiA8PCBlbmRsOwotICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGw7Ci0gICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBmYWN0b3J5IDw8ICIgOj0gdGhyaWZ0Lk5ld1RTaW1wbGVKU09OUHJvdG9jb2xGYWN0b3J5KCkiIDw8IGVuZGw7Ci0gICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8IGpzUHJvdCA8PCAiIDo9ICIgPDwgZmFjdG9yeSA8PCAiLkdldFByb3RvY29sKCIgPDwgbWJUcmFucyA8PCAiKSIKLSAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImFyZ3ZhbHVlIiA8PCBpIDw8ICIgOj0gIiA8PCBwYWNrYWdlX25hbWVfIDw8ICIuTmV3IiA8PCB0c3RydWN0X25hbWUKLSAgICAgICAgICAgICAgICAgPDwgIigpIiA8PCBlbmRsOwotICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBlcnIyIDw8ICIgOj0gYXJndmFsdWUiIDw8IGkgPDwgIi4iIDw8IHJlYWRfbWV0aG9kX25hbWVfIDw8ICAiKCIgPDwganNQcm90IDw8ICIpIiA8PCBlbmRsOwotICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiaWYgIiA8PCBlcnIyIDw8ICIgIT0gbmlsIHsiIDw8IGVuZGw7Ci0gICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIFVzYWdlKCkiIDw8IGVuZGw7Ci0gICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiIgPDwgZW5kbDsKLSAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgaWYgKHRoZV90eXBlMi0+aXNfY29udGFpbmVyKCkgfHwgdGhlX3R5cGUyLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICAgIHN0cmluZyBhcmcodG1wKCJhcmciKSk7Ci0gICAgICAgIHN0cmluZyBtYlRyYW5zKHRtcCgibWJUcmFucyIpKTsKLSAgICAgICAgc3RyaW5nIGVycjEodG1wKCJlcnIiKSk7Ci0gICAgICAgIHN0cmluZyBmYWN0b3J5KHRtcCgiZmFjdG9yeSIpKTsKLSAgICAgICAgc3RyaW5nIGpzUHJvdCh0bXAoImpzUHJvdCIpKTsKLSAgICAgICAgc3RyaW5nIGVycjIodG1wKCJlcnIiKSk7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIGFyZ05hbWUocHVibGljaXplKGFyZ3NbaV0tPmdldF9uYW1lKCkpKTsKLSAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgYXJnIDw8ICIgOj0gZmxhZy5BcmcoIiA8PCBmbGFnQXJnIDw8ICIpIiA8PCBlbmRsOwotICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBtYlRyYW5zIDw8ICIgOj0gdGhyaWZ0Lk5ld1RNZW1vcnlCdWZmZXJMZW4obGVuKCIgPDwgYXJnIDw8ICIpKSIKLSAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImRlZmVyICIgPDwgbWJUcmFucyA8PCAiLkNsb3NlKCkiIDw8IGVuZGw7Ci0gICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJfLCAiIDw8IGVycjEgPDwgIiA6PSAiIDw8IG1iVHJhbnMgPDwgIi5Xcml0ZVN0cmluZygiIDw8IGFyZyA8PCAiKSIKLSAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImlmICIgPDwgZXJyMSA8PCAiICE9IG5pbCB7ICIgPDwgZW5kbDsKLSAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgVXNhZ2UoKSIgPDwgZW5kbDsKLSAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIiA8PCBlbmRsOwotICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgZmFjdG9yeSA8PCAiIDo9IHRocmlmdC5OZXdUU2ltcGxlSlNPTlByb3RvY29sRmFjdG9yeSgpIiA8PCBlbmRsOwotICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBqc1Byb3QgPDwgIiA6PSAiIDw8IGZhY3RvcnkgPDwgIi5HZXRQcm90b2NvbCgiIDw8IG1iVHJhbnMgPDwgIikiCi0gICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJjb250YWluZXJTdHJ1Y3QiIDw8IGkgPDwgIiA6PSAiIDw8IHBhY2thZ2VfbmFtZV8gPDwgIi5OZXciCi0gICAgICAgICAgICAgICAgIDw8IGFyZ3VtZW50c05hbWUgPDwgIigpIiA8PCBlbmRsOwotICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBlcnIyIDw8ICIgOj0gY29udGFpbmVyU3RydWN0IiA8PCBpIDw8ICIuUmVhZEZpZWxkIiA8PCAoaSArIDEpIDw8ICIoIgotICAgICAgICAgICAgICAgICA8PCBqc1Byb3QgPDwgIikiIDw8IGVuZGw7Ci0gICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJpZiAiIDw8IGVycjIgPDwgIiAhPSBuaWwgeyIgPDwgZW5kbDsKLSAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgVXNhZ2UoKSIgPDwgZW5kbDsKLSAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIiA8PCBlbmRsOwotICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImFyZ3ZhbHVlIiA8PCBpIDw8ICIgOj0gY29udGFpbmVyU3RydWN0IiA8PCBpIDw8ICIuIiA8PCBhcmdOYW1lCi0gICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB0aHJvdygiSW52YWxpZCBhcmd1bWVudCB0eXBlIGluIGdlbmVyYXRlX3NlcnZpY2VfcmVtb3RlIik7Ci0gICAgICB9Ci0KLSAgICAgIGlmICh0aGVfdHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ2YWx1ZSIgPDwgaSA8PCAiIDo9ICIgPDwgcGFja2FnZV9uYW1lXyA8PCAiLiIKLSAgICAgICAgICAgICAgICAgPDwgcHVibGljaXplKHRoZV90eXBlLT5nZXRfbmFtZSgpKSA8PCAiKGFyZ3ZhbHVlIiA8PCBpIDw8ICIpIiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInZhbHVlIiA8PCBpIDw8ICIgOj0gYXJndmFsdWUiIDw8IGkgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZm10LlByaW50KGNsaWVudC4iIDw8IHB1Yk5hbWUgPDwgIigiOwotICAgIGJvb2wgYXJnRmlyc3QgPSB0cnVlOwotCi0gICAgZm9yIChzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj46OnNpemVfdHlwZSBpID0gMDsgaSA8IG51bV9hcmdzOyArK2kpIHsKLSAgICAgIGlmIChhcmdGaXJzdCkgewotICAgICAgICBhcmdGaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9yZW1vdGUgPDwgIiwgIjsKLSAgICAgIH0KLQotICAgICAgaWYgKGFyZ3NbaV0tPmdldF90eXBlKCktPmlzX2VudW0oKSkgewotICAgICAgICBmX3JlbW90ZSA8PCAidmFsdWUiIDw8IGk7Ci0gICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0tPmdldF90eXBlKCktPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgZSA9ICgodF9iYXNlX3R5cGUqKShhcmdzW2ldLT5nZXRfdHlwZSgpKSktPmdldF9iYXNlKCk7Ci0KLSAgICAgICAgc3dpdGNoIChlKSB7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICAgIGZfcmVtb3RlIDw8ICJ2YWx1ZSIgPDwgaTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHRocm93KCJJbnZhbGlkIGJhc2UgdHlwZSBpbiBnZW5lcmF0ZV9zZXJ2aWNlX3JlbW90ZSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZl9yZW1vdGUgPDwgcHVibGljaXplKGFyZ3NbaV0tPmdldF9uYW1lKCkpIDw8ICIoc3RyY29udi5BdG9pKGZsYWcuQXJnKCIgPDwgZmxhZ0FyZyA8PAotICAgICAgICAvLyAiKSkpIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfcmVtb3RlIDw8ICJ2YWx1ZSIgPDwgaTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBmX3JlbW90ZSA8PCAiKSkiIDw8IGVuZGw7Ci0gICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImZtdC5QcmludChcIlxcblwiKSIgPDwgZW5kbDsKLSAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiYnJlYWsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotCi0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJjYXNlIFwiXCI6IiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBVc2FnZSgpIiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBicmVhayIgPDwgZW5kbDsKLSAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBmbXQuRnByaW50bG4ob3MuU3RkZXJyLCBcIkludmFsaWQgZnVuY3Rpb24gXCIsIGNtZCkiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgLy8gQ2xvc2Ugc2VydmljZSBmaWxlCi0gIGZfcmVtb3RlLmNsb3NlKCk7Ci0gIGZvcm1hdF9nb19vdXRwdXQoZl9yZW1vdGVfbmFtZSk7Ci0jaWZuZGVmIF9NU0NfVkVSCi0gIC8vIE1ha2UgZmlsZSBleGVjdXRhYmxlLCBsb3ZlIHRoYXQgYml0d2lzZSBPUiBhY3Rpb24KLSAgY2htb2QoZl9yZW1vdGVfbmFtZS5jX3N0cigpLAotICAgICAgICBTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVhVU1IKLSNpZm5kZWYgX1dJTjMyCi0gICAgICAgIHwgU19JUkdSUCB8IFNfSVhHUlAgfCBTX0lST1RIIHwgU19JWE9USAotI2VuZGlmCi0gICAgICAgICk7Ci0jZW5kaWYKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3JfbmV3ID0gIiI7Ci0gIHN0cmluZyBzZXJ2aWNlTmFtZShwdWJsaWNpemUodHNlcnZpY2UtPmdldF9uYW1lKCkpKTsKLQotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIHNpemVfdCBpbmRleCA9IGV4dGVuZHMucmZpbmQoIi4iKTsKLQotICAgIGlmIChpbmRleCAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gZXh0ZW5kcy5zdWJzdHIoMCwgaW5kZXggKyAxKSArIHB1YmxpY2l6ZShleHRlbmRzLnN1YnN0cihpbmRleCArIDEpKQotICAgICAgICAgICAgICAgICAgICAgICAgICArICJQcm9jZXNzb3IiOwotICAgICAgZXh0ZW5kc19wcm9jZXNzb3JfbmV3ID0gZXh0ZW5kcy5zdWJzdHIoMCwgaW5kZXggKyAxKSArICJOZXciCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHB1YmxpY2l6ZShleHRlbmRzLnN1YnN0cihpbmRleCArIDEpKSArICJQcm9jZXNzb3IiOwotICAgIH0gZWxzZSB7Ci0gICAgICBleHRlbmRzX3Byb2Nlc3NvciA9IHB1YmxpY2l6ZShleHRlbmRzKSArICJQcm9jZXNzb3IiOwotICAgICAgZXh0ZW5kc19wcm9jZXNzb3JfbmV3ID0gIk5ldyIgKyBleHRlbmRzX3Byb2Nlc3NvcjsKLSAgICB9Ci0gIH0KLQotICBzdHJpbmcgcFNlcnZpY2VOYW1lKHByaXZhdGl6ZSh0c2VydmljZS0+Z2V0X25hbWUoKSkpOwotICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KLSAgc3RyaW5nIHNlbGYodG1wKCJzZWxmIikpOwotCi0gIGlmIChleHRlbmRzX3Byb2Nlc3Nvci5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHlwZSAiIDw8IHNlcnZpY2VOYW1lIDw8ICJQcm9jZXNzb3Igc3RydWN0IHsiIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICBwcm9jZXNzb3JNYXAgbWFwW3N0cmluZ110aHJpZnQuVFByb2Nlc3NvckZ1bmN0aW9uIiA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgaGFuZGxlciAiIDw8IHNlcnZpY2VOYW1lIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgc2VydmljZU5hbWUKLSAgICAgICAgICAgICAgIDw8ICJQcm9jZXNzb3IpIEFkZFRvUHJvY2Vzc29yTWFwKGtleSBzdHJpbmcsIHByb2Nlc3NvciB0aHJpZnQuVFByb2Nlc3NvckZ1bmN0aW9uKSB7IgotICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIHAucHJvY2Vzc29yTWFwW2tleV0gPSBwcm9jZXNzb3IiIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgc2VydmljZU5hbWUKLSAgICAgICAgICAgICAgIDw8ICJQcm9jZXNzb3IpIEdldFByb2Nlc3NvckZ1bmN0aW9uKGtleSBzdHJpbmcpICIKLSAgICAgICAgICAgICAgICAgICIocHJvY2Vzc29yIHRocmlmdC5UUHJvY2Vzc29yRnVuY3Rpb24sIG9rIGJvb2wpIHsiIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICBwcm9jZXNzb3IsIG9rID0gcC5wcm9jZXNzb3JNYXBba2V5XSIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBwcm9jZXNzb3IsIG9rIiA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHNlcnZpY2VOYW1lCi0gICAgICAgICAgICAgICA8PCAiUHJvY2Vzc29yKSBQcm9jZXNzb3JNYXAoKSBtYXBbc3RyaW5nXXRocmlmdC5UUHJvY2Vzc29yRnVuY3Rpb24geyIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBwLnByb2Nlc3Nvck1hcCIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZnVuYyBOZXciIDw8IHNlcnZpY2VOYW1lIDw8ICJQcm9jZXNzb3IoaGFuZGxlciAiIDw8IHNlcnZpY2VOYW1lCi0gICAgICAgICAgICAgICA8PCAiKSAqIiA8PCBzZXJ2aWNlTmFtZSA8PCAiUHJvY2Vzc29yIHsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfCi0gICAgICAgIDw8IGluZGVudCgpIDw8ICIgICIgPDwgc2VsZiA8PCAiIDo9ICYiIDw8IHNlcnZpY2VOYW1lCi0gICAgICAgIDw8ICJQcm9jZXNzb3J7aGFuZGxlcjpoYW5kbGVyLCBwcm9jZXNzb3JNYXA6bWFrZShtYXBbc3RyaW5nXXRocmlmdC5UUHJvY2Vzc29yRnVuY3Rpb24pfSIKLSAgICAgICAgPDwgZW5kbDsKLQotICAgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICBzdHJpbmcgZXNjYXBlZEZ1bmNOYW1lKGVzY2FwZV9zdHJpbmcoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgICIgPDwgc2VsZiA8PCAiLnByb2Nlc3Nvck1hcFtcIiIgPDwgZXNjYXBlZEZ1bmNOYW1lIDw8ICJcIl0gPSAmIgotICAgICAgICAgICAgICAgICA8PCBwU2VydmljZU5hbWUgPDwgIlByb2Nlc3NvciIgPDwgcHVibGljaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkKLSAgICAgICAgICAgICAgICAgPDwgIntoYW5kbGVyOmhhbmRsZXJ9IiA8PCBlbmRsOwotICAgIH0KLQotICAgIHN0cmluZyB4KHRtcCgieCIpKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBzZWxmIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgc2VydmljZU5hbWUKLSAgICAgICAgICAgICAgIDw8ICJQcm9jZXNzb3IpIFByb2Nlc3MoaXByb3QsIG9wcm90IHRocmlmdC5UUHJvdG9jb2wpIChzdWNjZXNzIGJvb2wsIGVyciAiCi0gICAgICAgICAgICAgICAgICAidGhyaWZ0LlRFeGNlcHRpb24pIHsiIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICBuYW1lLCBfLCBzZXFJZCwgZXJyIDo9IGlwcm90LlJlYWRNZXNzYWdlQmVnaW4oKSIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIGlmIGVyciAhPSBuaWwgeyByZXR1cm4gZmFsc2UsIGVyciB9IiA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgaWYgcHJvY2Vzc29yLCBvayA6PSBwLkdldFByb2Nlc3NvckZ1bmN0aW9uKG5hbWUpOyBvayB7IiA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgICByZXR1cm4gcHJvY2Vzc29yLlByb2Nlc3Moc2VxSWQsIGlwcm90LCBvcHJvdCkiIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgaXByb3QuU2tpcCh0aHJpZnQuU1RSVUNUKSIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIGlwcm90LlJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICAiIDw8IHgKLSAgICAgICAgICAgICAgIDw8ICIgOj0gdGhyaWZ0Lk5ld1RBcHBsaWNhdGlvbkV4Y2VwdGlvbih0aHJpZnQuVU5LTk9XTl9NRVRIT0QsIFwiVW5rbm93biBmdW5jdGlvbiAiCi0gICAgICAgICAgICAgICAgICAiXCIgKyBuYW1lKSIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LldyaXRlTWVzc2FnZUJlZ2luKG5hbWUsIHRocmlmdC5FWENFUFRJT04sIHNlcUlkKSIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgICIgPDwgeCA8PCAiLiIgPDwgd3JpdGVfbWV0aG9kX25hbWVfIDw8ICIob3Byb3QpIiA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgb3Byb3QuV3JpdGVNZXNzYWdlRW5kKCkiIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICBvcHJvdC5GbHVzaCgpIiA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlLCAiIDw8IHggPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIiIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInR5cGUgIiA8PCBzZXJ2aWNlTmFtZSA8PCAiUHJvY2Vzc29yIHN0cnVjdCB7IiA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgKiIgPDwgZXh0ZW5kc19wcm9jZXNzb3IgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZnVuYyBOZXciIDw8IHNlcnZpY2VOYW1lIDw8ICJQcm9jZXNzb3IoaGFuZGxlciAiIDw8IHNlcnZpY2VOYW1lCi0gICAgICAgICAgICAgICA8PCAiKSAqIiA8PCBzZXJ2aWNlTmFtZSA8PCAiUHJvY2Vzc29yIHsiIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICAiIDw8IHNlbGYgPDwgIiA6PSAmIiA8PCBzZXJ2aWNlTmFtZSA8PCAiUHJvY2Vzc29yeyIKLSAgICAgICAgICAgICAgIDw8IGV4dGVuZHNfcHJvY2Vzc29yX25ldyA8PCAiKGhhbmRsZXIpfSIgPDwgZW5kbDsKLQotICAgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICBzdHJpbmcgZXNjYXBlZEZ1bmNOYW1lKGVzY2FwZV9zdHJpbmcoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgICIgPDwgc2VsZiA8PCAiLkFkZFRvUHJvY2Vzc29yTWFwKFwiIiA8PCBlc2NhcGVkRnVuY05hbWUKLSAgICAgICAgICAgICAgICAgPDwgIlwiLCAmIiA8PCBwU2VydmljZU5hbWUgPDwgIlByb2Nlc3NvciIgPDwgcHVibGljaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkKLSAgICAgICAgICAgICAgICAgPDwgIntoYW5kbGVyOmhhbmRsZXJ9KSIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IHNlbGYgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBwcm9jZXNzIGZ1bmN0aW9uIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgYSBkaXNwYXRjaGVyIGZvcgotICovCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICAvLyBPcGVuIGZ1bmN0aW9uCi0gIHN0cmluZyBwcm9jZXNzb3JOYW1lID0gcHJpdmF0aXplKHRzZXJ2aWNlLT5nZXRfbmFtZSgpKSArICJQcm9jZXNzb3IiCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyBwdWJsaWNpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKTsKLSAgc3RyaW5nIGFyZ3NuYW1lID0gcHVibGljaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyIsIHRydWUpOwotICBzdHJpbmcgcmVzdWx0bmFtZSA9IHB1YmxpY2l6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIsIHRydWUpOwotICAvLyB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgLy8gY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0eXBlICIgPDwgcHJvY2Vzc29yTmFtZSA8PCAiIHN0cnVjdCB7IiA8PCBlbmRsOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIGhhbmRsZXIgIiA8PCBwdWJsaWNpemUodHNlcnZpY2UtPmdldF9uYW1lKCkpIDw8IGVuZGw7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCBwcm9jZXNzb3JOYW1lCi0gICAgICAgICAgICAgPDwgIikgUHJvY2VzcyhzZXFJZCBpbnQzMiwgaXByb3QsIG9wcm90IHRocmlmdC5UUHJvdG9jb2wpIChzdWNjZXNzIGJvb2wsIGVyciAiCi0gICAgICAgICAgICAgICAgInRocmlmdC5URXhjZXB0aW9uKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncyA6PSAiIDw8IGFyZ3NuYW1lIDw8ICJ7fSIgPDwgZW5kbDsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyID0gYXJncy4iIDw8IHJlYWRfbWV0aG9kX25hbWVfIDw8ICAiKGlwcm90KTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIGlwcm90LlJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGw7Ci0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgIDw8ICIgIHggOj0gdGhyaWZ0Lk5ld1RBcHBsaWNhdGlvbkV4Y2VwdGlvbih0aHJpZnQuUFJPVE9DT0xfRVJST1IsIGVyci5FcnJvcigpKSIKLSAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICBvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwgZXNjYXBlX3N0cmluZyh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpCi0gICAgICAgICAgICAgICA8PCAiXCIsIHRocmlmdC5FWENFUFRJT04sIHNlcUlkKSIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIHguIiA8PCB3cml0ZV9tZXRob2RfbmFtZV8gPDwgIihvcHJvdCkiIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICBvcHJvdC5Xcml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LkZsdXNoKCkiIDw8IGVuZGw7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gZmFsc2UsIGVyciIgPDwgZW5kbDsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpcHJvdC5SZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsOwotCi0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJlc3VsdCA6PSAiIDw8IHJlc3VsdG5hbWUgPDwgInt9IiA8PCBlbmRsOwotICB9Ci0gIGJvb2wgbmVlZF9yZWZlcmVuY2UgPSB0eXBlX25lZWRfcmVmZXJlbmNlKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSk7Ci0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8ICJ2YXIgcmV0dmFsICIgPDwgdHlwZV90b19nb190eXBlKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkgPDwgZW5kbDsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInZhciBlcnIyIGVycm9yIiA8PCBlbmRsOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAiOwotCi0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgInJldHZhbCwgIjsKLSAgICB9Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAotICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZfc2VydmljZV8gPDwgImVycjIgPSBwLmhhbmRsZXIuIiA8PCBwdWJsaWNpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSA8PCAiKCI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICIsICI7Ci0gICAgfQotCi0gICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8IHB1YmxpY2l6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkpOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PCAiKTsgZXJyMiAhPSBuaWwgeyIgPDwgZW5kbDsKLQotICB0X3N0cnVjdCogZXhjZXB0aW9ucyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB4X2ZpZWxkcyA9IGV4Y2VwdGlvbnMtPmdldF9tZW1iZXJzKCk7Ci0gIGlmICgheF9maWVsZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInN3aXRjaCB2IDo9IGVycjIuKHR5cGUpIHsiIDw8IGVuZGw7Ci0KLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4Zl9pdGVyOwotCi0gICAgZm9yICh4Zl9pdGVyID0geF9maWVsZHMuYmVnaW4oKTsgeGZfaXRlciAhPSB4X2ZpZWxkcy5lbmQoKTsgKyt4Zl9pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIGNhc2UgIiA8PCB0eXBlX3RvX2dvX3R5cGUoKCgqeGZfaXRlciktPmdldF90eXBlKCkpKSA8PCAiOiIKLSAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJlc3VsdC4iIDw8IHB1YmxpY2l6ZSgoKnhmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiID0gdiIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIGRlZmF1bHQ6IiA8PCBlbmRsOwotICB9Ci0KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICB4IDo9IHRocmlmdC5OZXdUQXBwbGljYXRpb25FeGNlcHRpb24odGhyaWZ0LklOVEVSTkFMX0VSUk9SLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJJbnRlcm5hbCBlcnJvciBwcm9jZXNzaW5nICIgPDwgZXNjYXBlX3N0cmluZyh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpCi0gICAgICAgICAgICAgICA8PCAiOiBcIiArIGVycjIuRXJyb3IoKSkiIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICBvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwgZXNjYXBlX3N0cmluZyh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpCi0gICAgICAgICAgICAgICA8PCAiXCIsIHRocmlmdC5FWENFUFRJT04sIHNlcUlkKSIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIHguIiA8PCB3cml0ZV9tZXRob2RfbmFtZV8gPDwgIihvcHJvdCkiIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICBvcHJvdC5Xcml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LkZsdXNoKCkiIDw8IGVuZGw7Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0cnVlLCBlcnIyIiA8PCBlbmRsOwotCi0gIGlmICgheF9maWVsZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IjsgLy8gY2xvc2VzIGVycjIgIT0gbmlsCi0KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgZl9zZXJ2aWNlXyA8PCAiIGVsc2UgeyIgPDwgZW5kbDsgLy8gbWFrZSBzdXJlIHdlIHNldCBTdWNjZXNzIHJldHZhbCBvbmx5IG9uIHN1Y2Nlc3MKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LlN1Y2Nlc3MgPSAiOwotICAgICAgaWYgKG5lZWRfcmVmZXJlbmNlKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgIiYiOwotICAgICAgfQotICAgICAgZl9zZXJ2aWNlXyA8PCAicmV0dmFsIiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGZfc2VydmljZV8gPDwgIn0iIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyMiA9IG9wcm90LldyaXRlTWVzc2FnZUJlZ2luKFwiIgotICAgICAgICAgICAgICAgPDwgZXNjYXBlX3N0cmluZyh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpIDw8ICJcIiwgdGhyaWZ0LlJFUExZLCBzZXFJZCk7IGVycjIgIT0gbmlsIHsiCi0gICAgICAgICAgICAgICA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgZXJyID0gZXJyMiIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIGVycjIgPSByZXN1bHQuIiA8PCB3cml0ZV9tZXRob2RfbmFtZV8gPDwgIihvcHJvdCk7IGVyciA9PSBuaWwgJiYgZXJyMiAhPSBuaWwgeyIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIGVyciA9IGVycjIiIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiBlcnIyID0gb3Byb3QuV3JpdGVNZXNzYWdlRW5kKCk7IGVyciA9PSBuaWwgJiYgZXJyMiAhPSBuaWwgeyIKLSAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICBlcnIgPSBlcnIyIiA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyMiA9IG9wcm90LkZsdXNoKCk7IGVyciA9PSBuaWwgJiYgZXJyMiAhPSBuaWwgeyIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIGVyciA9IGVycjIiIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdHJ1ZSwgZXJyIiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdHJ1ZSwgbmlsIiA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVjbGFyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNvZXJjZURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlua2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jb250YWluZXJfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHVzZV90cnVlX3R5cGUpIHsKLSAgKHZvaWQpaW5jbGFzczsKLSAgKHZvaWQpY29lcmNlRGF0YTsKLSAgdF90eXBlKiBvcmlnX3R5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUob3JpZ190eXBlKTsKLSAgc3RyaW5nIG5hbWUocHJlZml4ICsgcHVibGljaXplKHRmaWVsZC0+Z2V0X25hbWUoKSkpOwotCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIG5hbWU7Ci0gIH0KLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0X3N0cnVjdCopdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfcG9pbnRlcl9maWVsZCh0ZmllbGQsIGluX2NvbnRhaW5lcl92YWx1ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xhcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgb3JpZ190eXBlLCBpc19wb2ludGVyX2ZpZWxkKHRmaWVsZCksIGRlY2xhcmUsIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotCi0gICAgaWYgKGRlY2xhcmUpIHsKLSAgICAgIHRfdHlwZSogYWN0dWFsX3R5cGUgPSB1c2VfdHJ1ZV90eXBlID8gdGZpZWxkLT5nZXRfdHlwZSgpLT5nZXRfdHJ1ZV90eXBlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdGZpZWxkLT5nZXRfdHlwZSgpOwotCi0gICAgICBzdHJpbmcgdHlwZV9uYW1lID0gaW5rZXkgPyB0eXBlX3RvX2dvX2tleV90eXBlKGFjdHVhbF90eXBlKSA6IHR5cGVfdG9fZ29fdHlwZShhY3R1YWxfdHlwZSk7Ci0KLSAgICAgIG91dCA8PCAidmFyICIgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgIiA8PCB0eXBlX25hbWUgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAiaWYgdiwgZXJyIDo9IGlwcm90LiI7Ci0KLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLQotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSAmJiAhaW5rZXkpIHsKLSAgICAgICAgICBvdXQgPDwgIlJlYWRCaW5hcnkoKSI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgb3V0IDw8ICJSZWFkU3RyaW5nKCkiOwotICAgICAgICB9Ci0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgb3V0IDw8ICJSZWFkQm9vbCgpIjsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgb3V0IDw8ICJSZWFkQnl0ZSgpIjsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBvdXQgPDwgIlJlYWRJMTYoKSI7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgb3V0IDw8ICJSZWFkSTMyKCkiOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIG91dCA8PCAiUmVhZEk2NCgpIjsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgIlJlYWREb3VibGUoKSI7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEdvIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgb3V0IDw8ICJSZWFkSTMyKCkiOwotICAgIH0KLQotICAgIG91dCA8PCAiOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihcImVycm9yIHJlYWRpbmcgZmllbGQgIiA8PCB0ZmllbGQtPmdldF9rZXkoKQotICAgICAgICA8PCAiOiBcIiwgZXJyKSIgPDwgZW5kbDsKLQotICAgIG91dCA8PCAifSBlbHNlIHsiIDw8IGVuZGw7Ci0gICAgc3RyaW5nIHdyYXA7Ci0KLSAgICBpZiAodHlwZS0+aXNfZW51bSgpIHx8IChvcmlnX3R5cGUtPmlzX3R5cGVkZWYoKSAmJiAhdXNlX3RydWVfdHlwZSkpIHsKLSAgICAgIHdyYXAgPSBwdWJsaWNpemUodHlwZV9uYW1lKG9yaWdfdHlwZSkpOwotICAgIH0gZWxzZSBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCkgPT0gdF9iYXNlX3R5cGU6OlRZUEVfQllURSkgewotICAgICAgd3JhcCA9ICJpbnQ4IjsKLSAgICB9Ci0KLSAgICBzdHJpbmcgbWF5YmVfYWRkcmVzcyA9IChpc19wb2ludGVyX2ZpZWxkKHRmaWVsZCkgPyAiJiIgOiAiIik7Ci0gICAgaWYgKHdyYXAgPT0gIiIpIHsKLSAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIiA9ICIgPDwgbWF5YmVfYWRkcmVzcyA8PCAidiIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgInRlbXAgOj0gIiA8PCB3cmFwIDw8ICIodikiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIgPSAiIDw8IG1heWJlX2FkZHJlc3MgPDwgInRlbXAiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgb3V0IDw8ICJ9IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQgJyIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIicgZm9yIGZpZWxkICciCi0gICAgICAgICsgdGZpZWxkLT5nZXRfbmFtZSgpICsgIiciOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGFuIHVuc2VyaWFsaXplciBmb3IgYSBzdHJ1Y3QsIGNhbGxpbmcgcmVhZCgpCi0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlcl9maWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlY2xhcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcgZXEoZGVjbGFyZSA/ICIgOj0gIiA6ICIgPSAiKTsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8IGVxIDw8IChwb2ludGVyX2ZpZWxkID8gIiYiIDogIiIpOwotICBnZW5lcmF0ZV9nb19zdHJ1Y3RfaW5pdGlhbGl6ZXIob3V0LCB0c3RydWN0KTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gIiA8PCBwcmVmaXggPDwgIi4iIDw8IHJlYWRfbWV0aG9kX25hbWVfIDw8ICAiKGlwcm90KTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoZm10LlNwcmludGYoXCIlVCBlcnJvciByZWFkaW5nIHN0cnVjdDogXCIsICIKLSAgICAgIDw8IHByZWZpeCA8PCAiKSwgZXJyKSIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZSBhIGNvbnRhaW5lciBieSB3cml0aW5nIG91dCB0aGUgaGVhZGVyIGZvbGxvd2VkIGJ5Ci0gKiBkYXRhIGFuZCB0aGVuIGEgZm9vdGVyLgotICovCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIG9yaWdfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXJfZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWNsYXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgdF90eXBlKiB0dHlwZSA9IGdldF90cnVlX3R5cGUob3JpZ190eXBlKTsKLSAgc3RyaW5nIGVxKCIgPSAiKTsKLQotICBpZiAoZGVjbGFyZSkgewotICAgIGVxID0gIiA6PSAiOwotICB9Ci0KLSAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIl8sIF8sIHNpemUsIGVyciA6PSBpcHJvdC5SZWFkTWFwQmVnaW4oKSIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoXCJlcnJvciByZWFkaW5nIG1hcCBiZWdpbjogXCIsIGVycikiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidE1hcCA6PSBtYWtlKCIgPDwgdHlwZV90b19nb190eXBlKG9yaWdfdHlwZSkgPDwgIiwgc2l6ZSkiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCBlcSA8PCAiICIgPDwgKHBvaW50ZXJfZmllbGQgPyAiJiIgOiAiIikgPDwgInRNYXAiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgdF9zZXQqIHQgPSAodF9zZXQqKXR0eXBlOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiXywgc2l6ZSwgZXJyIDo9IGlwcm90LlJlYWRTZXRCZWdpbigpIiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyICE9IG5pbCB7IiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihcImVycm9yIHJlYWRpbmcgc2V0IGJlZ2luOiBcIiwgZXJyKSIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0U2V0IDo9IG1ha2UobWFwWyIKLSAgICAgICAgPDwgdHlwZV90b19nb19rZXlfdHlwZSh0LT5nZXRfZWxlbV90eXBlKCktPmdldF90cnVlX3R5cGUoKSkgPDwgIl1ib29sLCBzaXplKSIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8IGVxIDw8ICIgIiA8PCAocG9pbnRlcl9maWVsZCA/ICImIiA6ICIiKSA8PCAidFNldCIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJfLCBzaXplLCBlcnIgOj0gaXByb3QuUmVhZExpc3RCZWdpbigpIiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyICE9IG5pbCB7IiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihcImVycm9yIHJlYWRpbmcgbGlzdCBiZWdpbjogXCIsIGVycikiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidFNsaWNlIDo9IG1ha2UoIiA8PCB0eXBlX3RvX2dvX3R5cGUob3JpZ190eXBlKSA8PCAiLCAwLCBzaXplKSIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8IGVxIDw8ICIgIiA8PCAocG9pbnRlcl9maWVsZCA/ICImIiA6ICIiKSA8PCAidFNsaWNlIiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyICciICsgdHR5cGUtPmdldF9uYW1lKCkgKyAiJyBmb3IgcHJlZml4ICciCi0gICAgICAgICsgcHJlZml4ICsgIiciOwotICB9Ci0KLSAgLy8gRm9yIGxvb3AgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cwotICBvdXQgPDwgaW5kZW50KCkgPDwgImZvciBpIDo9IDA7IGkgPCBzaXplOyBpICsrIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGlmIChwb2ludGVyX2ZpZWxkKSB7Ci0gICAgcHJlZml4ID0gIigqIiArIHByZWZpeCArICIpIjsKLSAgfQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBkZWNsYXJlLCBwcmVmaXgpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgZGVjbGFyZSwgcHJlZml4KTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGRlY2xhcmUsIHByZWZpeCk7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgLy8gUmVhZCBjb250YWluZXIgZW5kCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSBpcHJvdC5SZWFkTWFwRW5kKCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoXCJlcnJvciByZWFkaW5nIG1hcCBlbmQ6IFwiLCBlcnIpIiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSBpcHJvdC5SZWFkU2V0RW5kKCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoXCJlcnJvciByZWFkaW5nIHNldCBlbmQ6IFwiLCBlcnIpIiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gaXByb3QuUmVhZExpc3RFbmQoKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihcImVycm9yIHJlYWRpbmcgbGlzdCBlbmQ6IFwiLCBlcnIpIiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIHRvIGRlc2VyaWFsaXplIGEgbWFwCi0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVjbGFyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgKHZvaWQpZGVjbGFyZTsKLSAgc3RyaW5nIGtleSA9IHRtcCgiX2tleSIpOwotICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7Ci0gIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKLSAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOwotICBma2V5LnNldF9yZXEodF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCk7Ci0gIGZ2YWwuc2V0X3JlcSh0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUKTsKLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSwgdHJ1ZSwgIiIsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwsIHRydWUsICIiLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLSAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICJbIiA8PCBrZXkgPDwgIl0gPSAiIDw8IHZhbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIFdyaXRlIGEgc2V0IGVsZW1lbnQKLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWNsYXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICAodm9pZClkZWNsYXJlOwotICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKLSAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwotICBmZWxlbS5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQpOwotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSwgdHJ1ZSwgIiIsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUsIHRydWUpOwotICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIlsiIDw8IGVsZW0gPDwgIl0gPSB0cnVlIiA8PCBlbmRsOwotfQotCi0vKioKLSAqIFdyaXRlIGEgbGlzdCBlbGVtZW50Ci0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWNsYXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgKHZvaWQpZGVjbGFyZTsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7Ci0gIHRfZmllbGQgZmVsZW0oKCh0X2xpc3QqKXRsaXN0KS0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKLSAgZmVsZW0uc2V0X3JlcSh0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUKTsKLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0sIHRydWUsICIiLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlLCB0cnVlKTsKLSAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIgPSBhcHBlbmQoIiA8PCBwcmVmaXggPDwgIiwgIiA8PCBlbGVtIDw8ICIpIiA8PCBlbmRsOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmtleSkgewotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gIHN0cmluZyBuYW1lKHByZWZpeCArIHB1YmxpY2l6ZSh0ZmllbGQtPmdldF9uYW1lKCkpKTsKLQotICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBnZW5lcmF0ZSBzZXJpYWxpemUgZm9yIHZvaWQgdHlwZTogIiArIG5hbWU7Ci0gIH0KLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIGlzX3BvaW50ZXJfZmllbGQodGZpZWxkKSwgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImlmIGVyciA6PSBvcHJvdC4iOwotCi0gICAgaWYgKGlzX3BvaW50ZXJfZmllbGQodGZpZWxkKSkgewotICAgICAgbmFtZSA9ICIqIiArIG5hbWU7Ci0gICAgfQotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0KLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkgJiYgIWlua2V5KSB7Ci0gICAgICAgICAgb3V0IDw8ICJXcml0ZUJpbmFyeSgiIDw8IG5hbWUgPDwgIikiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG91dCA8PCAiV3JpdGVTdHJpbmcoc3RyaW5nKCIgPDwgbmFtZSA8PCAiKSkiOwotICAgICAgICB9Ci0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgb3V0IDw8ICJXcml0ZUJvb2woYm9vbCgiIDw8IG5hbWUgPDwgIikpIjsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgb3V0IDw8ICJXcml0ZUJ5dGUoaW50OCgiIDw8IG5hbWUgPDwgIikpIjsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBvdXQgPDwgIldyaXRlSTE2KGludDE2KCIgPDwgbmFtZSA8PCAiKSkiOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIG91dCA8PCAiV3JpdGVJMzIoaW50MzIoIiA8PCBuYW1lIDw8ICIpKSI7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgb3V0IDw8ICJXcml0ZUk2NChpbnQ2NCgiIDw8IG5hbWUgPDwgIikpIjsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgIldyaXRlRG91YmxlKGZsb2F0NjQoIiA8PCBuYW1lIDw8ICIpKSI7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEdvIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgb3V0IDw8ICJXcml0ZUkzMihpbnQzMigiIDw8IG5hbWUgPDwgIikpIjsKLSAgICB9Ci0KLSAgICBvdXQgPDwgIjsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoZm10LlNwcmludGYoXCIlVC4iCi0gICAgICAgIDw8IGVzY2FwZV9zdHJpbmcodGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiICgiIDw8IHRmaWVsZC0+Z2V0X2tleSgpCi0gICAgICAgIDw8ICIpIGZpZWxkIHdyaXRlIGVycm9yOiBcIiwgcCksIGVycikgfSIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IEludmFsaWQgdHlwZSBpbiBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQgJyIgKyB0eXBlLT5nZXRfbmFtZSgpCi0gICAgICAgICsgIicgZm9yIGZpZWxkICciICsgbmFtZSArICInIjsKLSAgfQotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCi0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKLSAgKHZvaWQpdHN0cnVjdDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gIiA8PCBwcmVmaXggPDwgIi4iIDw8IHdyaXRlX21ldGhvZF9uYW1lXyA8PCAiKG9wcm90KTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoZm10LlNwcmludGYoXCIlVCBlcnJvciB3cml0aW5nIHN0cnVjdDogXCIsICIKLSAgICAgIDw8IHByZWZpeCA8PCAiKSwgZXJyKSIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotfQotCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlcl9maWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBpZiAocG9pbnRlcl9maWVsZCkgewotICAgIHByZWZpeCA9ICIqIiArIHByZWZpeDsKLSAgfQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gb3Byb3QuV3JpdGVNYXBCZWdpbigiCi0gICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiLCAiCi0gICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCAiCi0gICAgICAgIDw8ICJsZW4oIiA8PCBwcmVmaXggPDwgIikpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKFwiZXJyb3Igd3JpdGluZyBtYXAgYmVnaW46IFwiLCBlcnIpIiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSBvcHJvdC5Xcml0ZVNldEJlZ2luKCIKLSAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiCi0gICAgICAgIDw8ICJsZW4oIiA8PCBwcmVmaXggPDwgIikpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKFwiZXJyb3Igd3JpdGluZyBzZXQgYmVnaW46IFwiLCBlcnIpIiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gb3Byb3QuV3JpdGVMaXN0QmVnaW4oIgotICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiCi0gICAgICAgIDw8ICJsZW4oIiA8PCBwcmVmaXggPDwgIikpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKFwiZXJyb3Igd3JpdGluZyBsaXN0IGJlZ2luOiBcIiwgZXJyKSIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBJbnZhbGlkIHR5cGUgaW4gZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lciAnIiArIHR0eXBlLT5nZXRfbmFtZSgpCi0gICAgICAgICsgIicgZm9yIHByZWZpeCAnIiArIHByZWZpeCArICInIjsKLSAgfQotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X21hcCogdG1hcCA9ICh0X21hcCopdHR5cGU7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJmb3IgaywgdiA6PSByYW5nZSAiIDw8IHByZWZpeCA8PCAiIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgdG1hcCwgImsiLCAidiIpOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgdF9zZXQqIHRzZXQgPSAodF9zZXQqKXR0eXBlOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZm9yIHYsIF8gOj0gcmFuZ2UgIiA8PCBwcmVmaXggPDwgIiB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsIHRzZXQsICJ2Iik7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgdF9saXN0KiB0bGlzdCA9ICh0X2xpc3QqKXR0eXBlOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZm9yIF8sIHYgOj0gcmFuZ2UgIiA8PCBwcmVmaXggPDwgIiB7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X3VwKCk7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsIHRsaXN0LCAidiIpOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gb3Byb3QuV3JpdGVNYXBFbmQoKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihcImVycm9yIHdyaXRpbmcgbWFwIGVuZDogXCIsIGVycikiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IG9wcm90LldyaXRlU2V0RW5kKCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoXCJlcnJvciB3cml0aW5nIHNldCBlbmQ6IFwiLCBlcnIpIiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gb3Byb3QuV3JpdGVMaXN0RW5kKCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoXCJlcnJvciB3cml0aW5nIGxpc3QgZW5kOiBcIiwgZXJyKSIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgotICoKLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGtpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB2aXRlcikgewotICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwgIiIpOwotICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgIiIpOwotICBrZmllbGQuc2V0X3JlcSh0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUKTsKLSAgdmZpZWxkLnNldF9yZXEodF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCk7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsIGtpdGVyLCB0cnVlKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCwgdml0ZXIpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBzZXQuCi0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIHByZWZpeCkgewotICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksICIiKTsKLSAgZWZpZWxkLnNldF9yZXEodF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCk7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsIHByZWZpeCk7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCi0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIHByZWZpeCkgewotICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCAiIik7Ci0gIGVmaWVsZC5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCBwcmVmaXgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgZG9jc3RyaW5nIGZvciBhIGdpdmVuIHN0cnVjdC4KLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ29fZG9jc3RyaW5nKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGdlbmVyYXRlX2dvX2RvY3N0cmluZyhvdXQsIHRzdHJ1Y3QsIHRzdHJ1Y3QsICJBdHRyaWJ1dGVzIik7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSBkb2NzdHJpbmcgZm9yIGEgZ2l2ZW4gZnVuY3Rpb24uCi0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2dvX2RvY3N0cmluZyhvZnN0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgZ2VuZXJhdGVfZ29fZG9jc3RyaW5nKG91dCwgdGZ1bmN0aW9uLCB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCksICJQYXJhbWV0ZXJzIik7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSBkb2NzdHJpbmcgZm9yIGEgc3RydWN0IG9yIGZ1bmN0aW9uLgotICovCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nb19kb2NzdHJpbmcob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2RvYyogdGRvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzdWJoZWFkZXIpIHsKLSAgYm9vbCBoYXNfZG9jID0gZmFsc2U7Ci0gIHN0cmluZ3N0cmVhbSBzczsKLQotICBpZiAodGRvYy0+aGFzX2RvYygpKSB7Ci0gICAgaGFzX2RvYyA9IHRydWU7Ci0gICAgc3MgPDwgdGRvYy0+Z2V0X2RvYygpOwotICB9Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLQotICBpZiAoZmllbGRzLnNpemUoKSA+IDApIHsKLSAgICBpZiAoaGFzX2RvYykgewotICAgICAgc3MgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBoYXNfZG9jID0gdHJ1ZTsKLSAgICBzcyA8PCBzdWJoZWFkZXIgPDwgIjpcbiI7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgcF9pdGVyOwotCi0gICAgZm9yIChwX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgcF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytwX2l0ZXIpIHsKLSAgICAgIHRfZmllbGQqIHAgPSAqcF9pdGVyOwotICAgICAgc3MgPDwgIiAtICIgPDwgcHVibGljaXplKHAtPmdldF9uYW1lKCkpOwotCi0gICAgICBpZiAocC0+aGFzX2RvYygpKSB7Ci0gICAgICAgIHNzIDw8ICI6ICIgPDwgcC0+Z2V0X2RvYygpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3MgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBpZiAoaGFzX2RvYykgewotICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwgIiIsICIvLyAiLCBzcy5zdHIoKSwgIiIpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSBkb2NzdHJpbmcgZm9yIGEgZ2VuZXJpYyBvYmplY3QuCi0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2dvX2RvY3N0cmluZyhvZnN0cmVhbSYgb3V0LCB0X2RvYyogdGRvYykgewotICBpZiAodGRvYy0+aGFzX2RvYygpKSB7Ci0gICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiIiwgIi8vIiwgdGRvYy0+Z2V0X2RvYygpLCAiIik7Ci0gIH0KLX0KLQotLyoqCi0gKiBEZWNsYXJlcyBhbiBhcmd1bWVudCwgd2hpY2ggbWF5IGluY2x1ZGUgaW5pdGlhbGl6YXRpb24gYXMgbmVjZXNzYXJ5LgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkCi0gKi8KLXN0cmluZyB0X2dvX2dlbmVyYXRvcjo6ZGVjbGFyZV9hcmd1bWVudCh0X2ZpZWxkKiB0ZmllbGQpIHsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlc3VsdDsKLSAgcmVzdWx0IDw8IHB1YmxpY2l6ZSh0ZmllbGQtPmdldF9uYW1lKCkpIDw8ICI9IjsKLQotICBpZiAodGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7Ci0gICAgcmVzdWx0IDw8ICJ0aHJpZnRfc3BlY1siIDw8IHRmaWVsZC0+Z2V0X2tleSgpIDw8ICJdWzRdIjsKLSAgfSBlbHNlIHsKLSAgICByZXN1bHQgPDwgIm5pbCI7Ci0gIH0KLQotICByZXR1cm4gcmVzdWx0LnN0cigpOwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBzdHJ1Y3QgZmllbGQgaW5pdGlhbCB2YWx1ZS4KLSAqCi0gKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCwgd2hpY2ggbXVzdCBoYXZlIGB0ZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTExgCi0gKi8KLXN0cmluZyB0X2dvX2dlbmVyYXRvcjo6cmVuZGVyX2ZpZWxkX2luaXRpYWxfdmFsdWUodF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb3B0aW9uYWxfZmllbGQpIHsKLSAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotCi0gIGlmIChvcHRpb25hbF9maWVsZCkgewotICAgIC8vIFRoZSBjYWxsZXIgd2lsbCBtYWtlIGEgc2Vjb25kIHBhc3MgZm9yIG9wdGlvbmFsIGZpZWxkcywKLSAgICAvLyBhc3NpZ25pbmcgdGhlIHJlc3VsdCBvZiByZW5kZXJfY29uc3RfdmFsdWUgdG8gIipmaWVsZF9uYW1lIi4gSXQKLSAgICAvLyBpcyBtYWRkZW5pbmcgdGhhdCBHbyBzeW50YXggZG9lcyBub3QgYWxsb3cgZm9yIGEgdHlwZS1hZ25vc3RpYwotICAgIC8vIHdheSB0byBpbml0aWFsaXplIGEgcG9pbnRlciB0byBhIGNvbnN0IHZhbHVlLCBidXQgc28gaXQgZ29lcy4KLSAgICAvLyBUaGUgYWx0ZXJuYXRpdmUgd291bGQgYmUgdG8gd3JpdGUgdHlwZSBzcGVjaWZpYyBmdW5jdGlvbnMgdGhhdAotICAgIC8vIGNvbnZlcnQgZnJvbSBjb25zdCB2YWx1ZXMgdG8gcG9pbnRlciB0eXBlcywgYnV0IGdpdmVuIHRoZSBsYWNrCi0gICAgLy8gb2Ygb3ZlcmxvYWRpbmcgaXQgd291bGQgYmUgbWVzc3kuCi0gICAgcmV0dXJuICJuZXcoIiArIHR5cGVfdG9fZ29fdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpICsgIikiOwotICB9IGVsc2UgewotICAgIHJldHVybiByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdGZpZWxkLT5nZXRfdmFsdWUoKSwgbmFtZSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCi0gKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCi0gKi8KLXN0cmluZyB0X2dvX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RyaW5nIHByZWZpeCkgewotICAvLyBUT0RPKG1jc2xlZSk6IE5pdHBpY2t5LCBubyAnLCcgaWYgYXJndW1lbnRfbGlzdCBpcyBlbXB0eQotICByZXR1cm4gcHVibGljaXplKHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiKCIgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkKLSAgICAgICAgICsgIikiOwotfQotCi0vKioKLSAqIFJlbmRlcnMgYW4gaW50ZXJmYWNlIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJwotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgotICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgotICovCi1zdHJpbmcgdF9nb19nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZV9pZih0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgsIGJvb2wgYWRkRXJyb3IpIHsKLSAgLy8gVE9ETyhtY3NsZWUpOiBOaXRwaWNreSwgbm8gJywnIGlmIGFyZ3VtZW50X2xpc3QgaXMgZW1wdHkKLSAgc3RyaW5nIHNpZ25hdHVyZSA9IHB1YmxpY2l6ZShwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgIigiOwotICBzaWduYXR1cmUgKz0gYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpICsgIikgKCI7Ci0gIHRfdHlwZSogcmV0ID0gdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOwotICB0X3N0cnVjdCogZXhjZXB0aW9ucyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBzdHJpbmcgZXJycyA9IGFyZ3VtZW50X2xpc3QoZXhjZXB0aW9ucyk7Ci0KLSAgaWYgKCFyZXQtPmlzX3ZvaWQoKSkgewotICAgIHNpZ25hdHVyZSArPSAiciAiICsgdHlwZV90b19nb190eXBlKHJldCk7Ci0KLSAgICBpZiAoYWRkRXJyb3IgfHwgZXJycy5zaXplKCkgPT0gMCkgewotICAgICAgc2lnbmF0dXJlICs9ICIsICI7Ci0gICAgfQotICB9Ci0KLSAgaWYgKGFkZEVycm9yKSB7Ci0gICAgc2lnbmF0dXJlICs9ICJlcnIgZXJyb3IiOwotICB9Ci0KLSAgc2lnbmF0dXJlICs9ICIpIjsKLSAgcmV0dXJuIHNpZ25hdHVyZTsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZmllbGQgbGlzdAotICovCi1zdHJpbmcgdF9nb19nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgKz0gIiwgIjsKLSAgICB9Ci0KLSAgICByZXN1bHQgKz0gdmFyaWFibGVfbmFtZV90b19nb19uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgKyAiICIKLSAgICAgICAgICAgICAgKyB0eXBlX3RvX2dvX3R5cGUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgfQotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0cmluZyB0X2dvX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpIHsKLSAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7Ci0KLSAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7Ci0gICAgc3RyaW5nIG1vZHVsZShnZXRfcmVhbF9nb19tb2R1bGUocHJvZ3JhbSkpOwotICAgIC8vIGZvciBuYW1lc3BhY2VkIGluY2x1ZGVzLCBvbmx5IGtlZXAgcGFydCBhZnRlciBkb3QuCi0gICAgc2l6ZV90IGRvdCA9IG1vZHVsZS5yZmluZCgnLicpOwotICAgIGlmIChkb3QgIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgICBtb2R1bGUgPSBtb2R1bGUuc3Vic3RyKGRvdCArIDEpOwotICAgIH0KLSAgICByZXR1cm4gbW9kdWxlICsgIi4iICsgdHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLQotICByZXR1cm4gdHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLS8qKgotICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBnbyB0eW9lCi0gKi8KLXN0cmluZyB0X2dvX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0KLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOwotCi0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAvKiB0aGlzIGlzIHdyb25nLCBiaW5hcnkgaXMgc3RpbGwgYSBzdHJpbmcgdHlwZSBpbnRlcm5hbGx5Ci0gICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgICAgcmV0dXJuICJ0aHJpZnQuQklOQVJZIjsKLSAgICAgIH0KLSAgICAgICovCi0gICAgICByZXR1cm4gInRocmlmdC5TVFJJTkciOwotCi0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJ0aHJpZnQuQk9PTCI7Ci0KLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gInRocmlmdC5CWVRFIjsKLQotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICJ0aHJpZnQuSTE2IjsKLQotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICJ0aHJpZnQuSTMyIjsKLQotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJ0aHJpZnQuSTY0IjsKLQotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJ0aHJpZnQuRE9VQkxFIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJ0aHJpZnQuSTMyIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuICJ0aHJpZnQuU1RSVUNUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAidGhyaWZ0Lk1BUCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gInRocmlmdC5TRVQiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiAidGhyaWZ0LkxJU1QiOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0vKioKLSAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgZ28gbWFwIHR5cGUsIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGl0IHdpbGwKLSAqIG5vdCBwcm9kdWNlIGEgdmFsaWQgZ28gbWFwIHR5cGUuCi0gKi8KLXN0cmluZyB0X2dvX2dlbmVyYXRvcjo6dHlwZV90b19nb19rZXlfdHlwZSh0X3R5cGUqIHR5cGUpIHsKLSAgdF90eXBlKiByZXNvbHZlZF90eXBlID0gdHlwZTsKLQotICB3aGlsZSAocmVzb2x2ZWRfdHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgcmVzb2x2ZWRfdHlwZSA9ICgodF90eXBlZGVmKilyZXNvbHZlZF90eXBlKS0+Z2V0X3R5cGUoKS0+Z2V0X3RydWVfdHlwZSgpOwotICB9Ci0KLSAgaWYgKHJlc29sdmVkX3R5cGUtPmlzX21hcCgpIHx8IHJlc29sdmVkX3R5cGUtPmlzX2xpc3QoKSB8fCByZXNvbHZlZF90eXBlLT5pc19zZXQoKSkgewotICAgIHRocm93ICJDYW5ub3QgcHJvZHVjZSBhIHZhbGlkIHR5cGUgZm9yIGEgR28gbWFwIGtleTogIiArIHR5cGVfdG9fZ29fdHlwZSh0eXBlKSArICIgLSBhYm9ydGluZy4iOwotICB9Ci0KLSAgaWYgKHJlc29sdmVkX3R5cGUtPmlzX3N0cmluZygpICYmICgodF9iYXNlX3R5cGUqKXJlc29sdmVkX3R5cGUpLT5pc19iaW5hcnkoKSkKLSAgICByZXR1cm4gInN0cmluZyI7Ci0KLSAgcmV0dXJuIHR5cGVfdG9fZ29fdHlwZSh0eXBlLCB0cnVlKTsKLX0KLQotLyoqCi0gKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIGdvIHR5cGUKLSAqLwotc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjp0eXBlX3RvX2dvX3R5cGUodF90eXBlKiB0eXBlLCBib29sIGlzX2NvbnRhaW5lcl92YWx1ZSkgewotICByZXR1cm4gdHlwZV90b19nb190eXBlX3dpdGhfb3B0KHR5cGUsIGZhbHNlLCBpc19jb250YWluZXJfdmFsdWUpOwotfQotCi0vKioKLSAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgZ28gdHlwZSwgdGFraW5nIGludG8gYWNjb3VudCB3aGV0aGVyIHRoZSBmaWVsZAotICogYXNzb2NpYXRlZCB3aXRoIHRoZSB0eXBlIGlzIFRfT1BUSU9OQUwuCi0gKi8KLXN0cmluZyB0X2dvX2dlbmVyYXRvcjo6dHlwZV90b19nb190eXBlX3dpdGhfb3B0KHRfdHlwZSogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb3B0aW9uYWxfZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2NvbnRhaW5lcl92YWx1ZSkgewotICAodm9pZClpc19jb250YWluZXJfdmFsdWU7Ci0gIHN0cmluZyBtYXliZV9wb2ludGVyKG9wdGlvbmFsX2ZpZWxkID8gIioiIDogIiIpOwotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0KLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgIiI7Ci0KLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgcmV0dXJuIG1heWJlX3BvaW50ZXIgKyAiW11ieXRlIjsKLSAgICAgIH0KLQotICAgICAgcmV0dXJuIG1heWJlX3BvaW50ZXIgKyAic3RyaW5nIjsKLQotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiBtYXliZV9wb2ludGVyICsgImJvb2wiOwotCi0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuIG1heWJlX3BvaW50ZXIgKyAiaW50OCI7Ci0KLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiBtYXliZV9wb2ludGVyICsgImludDE2IjsKLQotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuIG1heWJlX3BvaW50ZXIgKyAiaW50MzIiOwotCi0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gbWF5YmVfcG9pbnRlciArICJpbnQ2NCI7Ci0KLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiBtYXliZV9wb2ludGVyICsgImZsb2F0NjQiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gbWF5YmVfcG9pbnRlciArIHB1YmxpY2l6ZSh0eXBlX25hbWUodHlwZSkpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIioiICsgcHVibGljaXplKHR5cGVfbmFtZSh0eXBlKSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X21hcCogdCA9ICh0X21hcCopdHlwZTsKLSAgICBzdHJpbmcga2V5VHlwZSA9IHR5cGVfdG9fZ29fa2V5X3R5cGUodC0+Z2V0X2tleV90eXBlKCkpOwotICAgIHN0cmluZyB2YWx1ZVR5cGUgPSB0eXBlX3RvX2dvX3R5cGUodC0+Z2V0X3ZhbF90eXBlKCksIHRydWUpOwotICAgIHJldHVybiBtYXliZV9wb2ludGVyICsgc3RyaW5nKCJtYXBbIikgKyBrZXlUeXBlICsgIl0iICsgdmFsdWVUeXBlOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgdF9zZXQqIHQgPSAodF9zZXQqKXR5cGU7Ci0gICAgc3RyaW5nIGVsZW1UeXBlID0gdHlwZV90b19nb19rZXlfdHlwZSh0LT5nZXRfZWxlbV90eXBlKCktPmdldF90cnVlX3R5cGUoKSk7Ci0gICAgcmV0dXJuIG1heWJlX3BvaW50ZXIgKyBzdHJpbmcoIm1hcFsiKSArIGVsZW1UeXBlICsgc3RyaW5nKCJdYm9vbCIpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHRfbGlzdCogdCA9ICh0X2xpc3QqKXR5cGU7Ci0gICAgc3RyaW5nIGVsZW1UeXBlID0gdHlwZV90b19nb190eXBlKHQtPmdldF9lbGVtX3R5cGUoKS0+Z2V0X3RydWVfdHlwZSgpLCB0cnVlKTsKLSAgICByZXR1cm4gbWF5YmVfcG9pbnRlciArIHN0cmluZygiW10iKSArIGVsZW1UeXBlOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgIHJldHVybiBtYXliZV9wb2ludGVyICsgcHVibGljaXplKHR5cGVfbmFtZSh0eXBlKSk7Ci0gIH0KLQotICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZ29fdHlwZTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLS8qKiBTZWUgdGhlIGNvbW1lbnQgaW5zaWRlIGdlbmVyYXRlX2dvX3N0cnVjdF9kZWZpbml0aW9uIGZvciB3aGF0IHRoaXMgaXMuICovCi1zdHJpbmcgdF9nb19nZW5lcmF0b3I6OnR5cGVfdG9fc3BlY19hcmdzKHRfdHlwZSogdHR5cGUpIHsKLSAgd2hpbGUgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICB0dHlwZSA9ICgodF90eXBlZGVmKil0dHlwZSktPmdldF90eXBlKCk7Ci0gIH0KLQotICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIm5pbCI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuICIoIiArIHR5cGVfbmFtZSh0dHlwZSkgKyAiLCAiICsgdHlwZV9uYW1lKHR0eXBlKSArICIudGhyaWZ0X3NwZWMpIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIigiICsgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpICsgIiwiCi0gICAgICAgICAgICsgdHlwZV90b19zcGVjX2FyZ3MoKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgKyAiLCIKLSAgICAgICAgICAgKyB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgKyAiLCIKLSAgICAgICAgICAgKyB0eXBlX3RvX3NwZWNfYXJncygoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSArICIpIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIigiICsgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSArICIsIgotICAgICAgICAgICArIHR5cGVfdG9fc3BlY19hcmdzKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSArICIpIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICIoIiArIHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpICsgIiwiCi0gICAgICAgICAgICsgdHlwZV90b19zcGVjX2FyZ3MoKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSArICIpIjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19zcGVjX2FyZ3M6ICIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotYm9vbCBmb3JtYXRfZ29fb3V0cHV0KGNvbnN0IHN0cmluZyYgZmlsZV9wYXRoKSB7Ci0gIGNvbnN0IHN0cmluZyBjb21tYW5kID0gImdvZm10IC13ICIgKyBmaWxlX3BhdGg7Ci0KLSAgaWYgKHN5c3RlbShjb21tYW5kLmNfc3RyKCkpID09IDApIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIGZwcmludGYoc3RkZXJyLCAiV0FSTklORyAtIFJ1bm5pbmcgJyVzJyBmYWlsZWQuXG4iLCBjb21tYW5kLmNfc3RyKCkpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLVRIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoZ28sICJHbyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgcGFja2FnZV9wcmVmaXg9ICBQYWNrYWdlIHByZWZpeCBmb3IgZ2VuZXJhdGVkIGZpbGVzLlxuIiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgdGhyaWZ0X2ltcG9ydD0gICBPdmVycmlkZSB0aHJpZnQgcGFja2FnZSBpbXBvcnQgcGF0aCAoZGVmYXVsdDoiICsgZGVmYXVsdF90aHJpZnRfaW1wb3J0ICsgIilcbiIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIHBhY2thZ2U9ICAgICAgICAgUGFja2FnZSBuYW1lIChkZWZhdWx0OiBpbmZlcnJlZCBmcm9tIHRocmlmdCBmaWxlIG5hbWUpXG4iIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBpZ25vcmVfaW5pdGlhbGlzbXNcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgIERpc2FibGUgYXV0b21hdGljIHNwZWxsaW5nIGNvcnJlY3Rpb24gb2YgaW5pdGlhbGlzbXMgKGUuZy4gXCJVUkxcIilcbiIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIHJlYWRfd3JpdGVfcHJpdmF0ZVxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgTWFrZSByZWFkL3dyaXRlIG1ldGhvZHMgcHJpdmF0ZSwgZGVmYXVsdCBpcyBwdWJsaWMgUmVhZC9Xcml0ZVxuIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9ndl9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfZ3ZfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzBmMmNhLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9ndl9nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzMzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxsaXN0PgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgInRfZ2VuZXJhdG9yLmgiCi0jaW5jbHVkZSAicGxhdGZvcm0uaCIKLQotdXNpbmcgc3RkOjptYXA7Ci11c2luZyBzdGQ6Om9mc3RyZWFtOwotdXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwotdXNpbmcgc3RkOjpwYWlyOwotdXNpbmcgc3RkOjpzdHJpbmc7Ci11c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKLXVzaW5nIHN0ZDo6dmVjdG9yOwotCi1zdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCi0KLS8qKgotICogR3JhcGh2aXogY29kZSBnZW5lcmF0b3IKLSAqLwotY2xhc3MgdF9ndl9nZW5lcmF0b3IgOiBwdWJsaWMgdF9nZW5lcmF0b3IgewotcHVibGljOgotICB0X2d2X2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKLSAgICA6IHRfZ2VuZXJhdG9yKHByb2dyYW0pIHsKLSAgICAodm9pZClwYXJzZWRfb3B0aW9uczsKLSAgICAodm9pZClvcHRpb25fc3RyaW5nOwotICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWd2IjsKLQotICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7Ci0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoImV4Y2VwdGlvbnMiKTsKLSAgICBleGNlcHRpb25fYXJyb3dzID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEluaXQgYW5kIGVuZCBvZiBnZW5lcmF0b3IKLSAgICovCi0gIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKLSAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKLQotICAvKioKLSAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLSAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOwotICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0KLXByb3RlY3RlZDoKLSAgLyoqCi0gICAqIEhlbHBlcnMKLSAgICovCi0gIHZvaWQgcHJpbnRfdHlwZSh0X3R5cGUqIHR0eXBlLCBzdHJpbmcgc3RydWN0X2ZpZWxkX3JlZik7Ci0gIHZvaWQgcHJpbnRfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB0dmFsdWUpOwotCi1wcml2YXRlOgotICBzdGQ6Om9mc3RyZWFtIGZfb3V0XzsKLSAgc3RkOjpsaXN0PHN0cmluZz4gZWRnZXM7Ci0gIGJvb2wgZXhjZXB0aW9uX2Fycm93czsKLX07Ci0KLS8qKgotICogSW5pdCBnZW5lcmF0b3I6Ci0gKiAtIEFkZHMgc29tZSBlc2NhcGluZyBmb3IgdGhlIEdyYXBodml6IGRvbWFpbi4KLSAqIC0gQ3JlYXRlIG91dHB1dCBkaXJlY3RvcnkgYW5kIG9wZW4gZmlsZSBmb3Igd3JpdHRpbmcuCi0gKiAtIFdyaXRlIHRoZSBmaWxlIGhlYWRlci4KLSAqLwotdm9pZCB0X2d2X2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7Ci0gIGVzY2FwZV9bJ3snXSA9ICJcXHsiOwotICBlc2NhcGVfWyd9J10gPSAiXFx9IjsKLQotICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKLSAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKLSAgc3RyaW5nIGZuYW1lID0gZ2V0X291dF9kaXIoKSArIHByb2dyYW1fLT5nZXRfbmFtZSgpICsgIi5ndiI7Ci0gIGZfb3V0Xy5vcGVuKGZuYW1lLmNfc3RyKCkpOwotICBmX291dF8gPDwgImRpZ3JhcGggXCIiIDw8IGVzY2FwZV9zdHJpbmcocHJvZ3JhbV9uYW1lXykgPDwgIlwiIHsiIDw8IGVuZGw7Ci0gIGZfb3V0XyA8PCAibm9kZSBbc3R5bGU9ZmlsbGVkLCBzaGFwZT1yZWNvcmRdOyIgPDwgZW5kbDsKLSAgZl9vdXRfIDw8ICJlZGdlIFthcnJvd3NpemU9MC41XTsiIDw8IGVuZGw7Ci0gIGZfb3V0XyA8PCAicmFua2Rpcj1MUiIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBDbG9zZXMgZ2VuZXJhdG9yOgotICogLSBQcmludCBhY2N1bXVsYXRlZCBub2RlcyBjb25uZWN0aW9ucy4KLSAqIC0gUHJpbnQgZm9vdG5vdGUuCi0gKiAtIENsb3NlcyBmaWxlLgotICovCi12b2lkIHRfZ3ZfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7Ci0gIC8vIFByaW50IGVkZ2VzCi0gIHN0ZDo6bGlzdDxzdHJpbmc+OjppdGVyYXRvciBpdGVyID0gZWRnZXMuYmVnaW4oKTsKLSAgZm9yICg7IGl0ZXIgIT0gZWRnZXMuZW5kKCk7IGl0ZXIrKykgewotICAgIGZfb3V0XyA8PCAoKml0ZXIpIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBQcmludCBncmFwaCBlbmQgfSBhbmQgY2xvc2UgZmlsZQotICBmX291dF8gPDwgIn0iIDw8IGVuZGw7Ci0gIGZfb3V0Xy5jbG9zZSgpOwotfQotCi12b2lkIHRfZ3ZfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKLSAgc3RyaW5nIG5hbWUgPSB0dHlwZWRlZi0+Z2V0X25hbWUoKTsKLSAgZl9vdXRfIDw8ICJub2RlIFtmaWxsY29sb3I9YXp1cmVdOyIgPDwgZW5kbDsKLSAgZl9vdXRfIDw8IG5hbWUgPDwgIiBbbGFiZWw9XCIiOwotCi0gIGZfb3V0XyA8PCBlc2NhcGVfc3RyaW5nKG5hbWUpOwotICBmX291dF8gPDwgIiA6OiAiOwotICBwcmludF90eXBlKHR0eXBlZGVmLT5nZXRfdHlwZSgpLCBuYW1lKTsKLQotICBmX291dF8gPDwgIlwiXTsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9ndl9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgewotICBzdHJpbmcgbmFtZSA9IHRlbnVtLT5nZXRfbmFtZSgpOwotICBmX291dF8gPDwgIm5vZGUgW2ZpbGxjb2xvcj13aGl0ZV07IiA8PCBlbmRsOwotICBmX291dF8gPDwgbmFtZSA8PCAiIFtsYWJlbD1cImVudW0gIiA8PCBlc2NhcGVfc3RyaW5nKG5hbWUpOwotCi0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiB2YWx1ZXMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOwotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIHZhbF9pdGVyOwotICBmb3IgKHZhbF9pdGVyID0gdmFsdWVzLmJlZ2luKCk7IHZhbF9pdGVyICE9IHZhbHVlcy5lbmQoKTsgKyt2YWxfaXRlcikgewotICAgIGZfb3V0XyA8PCAnfCcgPDwgKCp2YWxfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgZl9vdXRfIDw8ICIgPSAiOwotICAgIGZfb3V0XyA8PCAoKnZhbF9pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gIH0KLQotICBmX291dF8gPDwgIlwiXTsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9ndl9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgewotICBzdHJpbmcgbmFtZSA9IHRjb25zdC0+Z2V0X25hbWUoKTsKLQotICBmX291dF8gPDwgIm5vZGUgW2ZpbGxjb2xvcj1hbGljZWJsdWVdOyIgPDwgZW5kbDsKLSAgZl9vdXRfIDw8ICJjb25zdF8iIDw8IG5hbWUgPDwgIiBbbGFiZWw9XCIiOwotCi0gIGZfb3V0XyA8PCBlc2NhcGVfc3RyaW5nKG5hbWUpOwotICBmX291dF8gPDwgIiA9ICI7Ci0gIHByaW50X2NvbnN0X3ZhbHVlKHRjb25zdC0+Z2V0X3R5cGUoKSwgdGNvbnN0LT5nZXRfdmFsdWUoKSk7Ci0gIGZfb3V0XyA8PCAiIDo6ICI7Ci0gIHByaW50X3R5cGUodGNvbnN0LT5nZXRfdHlwZSgpLCAiY29uc3RfIiArIG5hbWUpOwotCi0gIGZfb3V0XyA8PCAiXCJdOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2d2X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLQotICBpZiAodHN0cnVjdC0+aXNfeGNlcHRpb24oKSkgewotICAgIGZfb3V0XyA8PCAibm9kZSBbZmlsbGNvbG9yPWxpZ2h0cGlua107IiA8PCBlbmRsOwotICAgIGZfb3V0XyA8PCBuYW1lIDw8ICIgW2xhYmVsPVwiIjsKLSAgICBmX291dF8gPDwgImV4Y2VwdGlvbiAiIDw8IGVzY2FwZV9zdHJpbmcobmFtZSk7Ci0gIH0gZWxzZSBpZiAodHN0cnVjdC0+aXNfdW5pb24oKSkgewotICAgIGZfb3V0XyA8PCAibm9kZSBbZmlsbGNvbG9yPWxpZ2h0Y3lhbl07IiA8PCBlbmRsOwotICAgIGZfb3V0XyA8PCBuYW1lIDw8ICIgW2xhYmVsPVwiIjsKLSAgICBmX291dF8gPDwgInVuaW9uICIgPDwgZXNjYXBlX3N0cmluZyhuYW1lKTsKLSAgfSBlbHNlIHsKLSAgICBmX291dF8gPDwgIm5vZGUgW2ZpbGxjb2xvcj1iZWlnZV07IiA8PCBlbmRsOwotICAgIGZfb3V0XyA8PCBuYW1lIDw8ICIgW2xhYmVsPVwiIjsKLSAgICBmX291dF8gPDwgInN0cnVjdCAiIDw8IGVzY2FwZV9zdHJpbmcobmFtZSk7Ci0gIH0KLQotICB2ZWN0b3I8dF9maWVsZCo+IG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+OjppdGVyYXRvciBtZW1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsKLSAgZm9yICg7IG1lbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7IG1lbV9pdGVyKyspIHsKLSAgICBzdHJpbmcgZmllbGRfbmFtZSA9ICgqbWVtX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgLy8gcHJpbnQgcG9ydCAoYW5jaG9yIHJlZmVyZW5jZSkKLSAgICBmX291dF8gPDwgInw8ZmllbGRfIiA8PCBmaWVsZF9uYW1lIDw8ICc+JzsKLQotICAgIC8vIGZpZWxkIG5hbWUgOjogZmllbGQgdHlwZQotICAgIGZfb3V0XyA8PCAoKm1lbV9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICBmX291dF8gPDwgIiA6OiAiOwotICAgIHByaW50X3R5cGUoKCptZW1faXRlciktPmdldF90eXBlKCksIG5hbWUgKyAiOmZpZWxkXyIgKyBmaWVsZF9uYW1lKTsKLSAgfQotCi0gIGZfb3V0XyA8PCAiXCJdOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2d2X2dlbmVyYXRvcjo6cHJpbnRfdHlwZSh0X3R5cGUqIHR0eXBlLCBzdHJpbmcgc3RydWN0X2ZpZWxkX3JlZikgewotICBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGZfb3V0XyA8PCAibGlzdFxcPCI7Ci0gICAgICBwcmludF90eXBlKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSwgc3RydWN0X2ZpZWxkX3JlZik7Ci0gICAgICBmX291dF8gPDwgIlxcPiI7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIGZfb3V0XyA8PCAic2V0XFw8IjsKLSAgICAgIHByaW50X3R5cGUoKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCksIHN0cnVjdF9maWVsZF9yZWYpOwotICAgICAgZl9vdXRfIDw8ICJcXD4iOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICBmX291dF8gPDwgIm1hcFxcPCI7Ci0gICAgICBwcmludF90eXBlKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCksIHN0cnVjdF9maWVsZF9yZWYpOwotICAgICAgZl9vdXRfIDw8ICIsICI7Ci0gICAgICBwcmludF90eXBlKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCksIHN0cnVjdF9maWVsZF9yZWYpOwotICAgICAgZl9vdXRfIDw8ICJcXD4iOwotICAgIH0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICBmX291dF8gPDwgKCgodF9iYXNlX3R5cGUqKXR0eXBlKS0+aXNfYmluYXJ5KCkgPyAiYmluYXJ5IiA6IHR0eXBlLT5nZXRfbmFtZSgpKTsKLSAgfSBlbHNlIHsKLSAgICBmX291dF8gPDwgdHR5cGUtPmdldF9uYW1lKCk7Ci0gICAgZWRnZXMucHVzaF9iYWNrKHN0cnVjdF9maWVsZF9yZWYgKyAiIC0+ICIgKyB0dHlwZS0+Z2V0X25hbWUoKSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBQcmludHMgb3V0IGFuIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgcHJvdmlkZWQgY29uc3RhbnQgdmFsdWUKLSAqLwotdm9pZCB0X2d2X2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB0dmFsdWUpIHsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIHN3aXRjaCAodHZhbHVlLT5nZXRfdHlwZSgpKSB7Ci0gIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUjoKLSAgICBmX291dF8gPDwgdHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgIGJyZWFrOwotICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0RPVUJMRToKLSAgICBmX291dF8gPDwgdHZhbHVlLT5nZXRfZG91YmxlKCk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfU1RSSU5HOgotICAgIGZfb3V0XyA8PCAiXFxcIiIgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHR2YWx1ZSkgPDwgIlxcXCIiOwotICAgIGJyZWFrOwotICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX01BUDogewotICAgIGZfb3V0XyA8PCAiXFx7ICI7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4gbWFwX2VsZW1zID0gdHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46Oml0ZXJhdG9yIG1hcF9pdGVyOwotICAgIGZvciAobWFwX2l0ZXIgPSBtYXBfZWxlbXMuYmVnaW4oKTsgbWFwX2l0ZXIgIT0gbWFwX2VsZW1zLmVuZCgpOyBtYXBfaXRlcisrKSB7Ci0gICAgICBpZiAoIWZpcnN0KSB7Ci0gICAgICAgIGZfb3V0XyA8PCAiLCAiOwotICAgICAgfQotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIHByaW50X2NvbnN0X3ZhbHVlKCgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKSwgbWFwX2l0ZXItPmZpcnN0KTsKLSAgICAgIGZfb3V0XyA8PCAiID0gIjsKLSAgICAgIHByaW50X2NvbnN0X3ZhbHVlKCgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKSwgbWFwX2l0ZXItPnNlY29uZCk7Ci0gICAgfQotICAgIGZfb3V0XyA8PCAiIFxcfSI7Ci0gIH0gYnJlYWs7Ci0gIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfTElTVDogewotICAgIGZfb3V0XyA8PCAiXFx7ICI7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiBsaXN0X2VsZW1zID0gdHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIDsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+OjppdGVyYXRvciBsaXN0X2l0ZXI7Ci0gICAgZm9yIChsaXN0X2l0ZXIgPSBsaXN0X2VsZW1zLmJlZ2luKCk7IGxpc3RfaXRlciAhPSBsaXN0X2VsZW1zLmVuZCgpOyBsaXN0X2l0ZXIrKykgewotICAgICAgaWYgKCFmaXJzdCkgewotICAgICAgICBmX291dF8gPDwgIiwgIjsKLSAgICAgIH0KLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICAgIHByaW50X2NvbnN0X3ZhbHVlKCgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCAqbGlzdF9pdGVyKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHByaW50X2NvbnN0X3ZhbHVlKCgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCksICpsaXN0X2l0ZXIpOwotICAgICAgfQotICAgIH0KLSAgICBmX291dF8gPDwgIiBcXH0iOwotICB9IGJyZWFrOwotICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0lERU5USUZJRVI6Ci0gICAgZl9vdXRfIDw8IGVzY2FwZV9zdHJpbmcodHlwZS0+Z2V0X25hbWUoKSkgPDwgIi4iCi0gICAgICAgICAgIDw8IGVzY2FwZV9zdHJpbmcodHZhbHVlLT5nZXRfaWRlbnRpZmllcl9uYW1lKCkpOwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIGZfb3V0XyA8PCAiVU5LTk9XTiI7Ci0gICAgYnJlYWs7Ci0gIH0KLX0KLQotdm9pZCB0X2d2X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBzZXJ2aWNlX25hbWUgPSBnZXRfc2VydmljZV9uYW1lKHRzZXJ2aWNlKTsKLSAgZl9vdXRfIDw8ICJzdWJncmFwaCBjbHVzdGVyXyIgPDwgc2VydmljZV9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKLSAgZl9vdXRfIDw8ICJub2RlIFtmaWxsY29sb3I9YmlzcXVlXTsiIDw8IGVuZGw7Ci0gIGZfb3V0XyA8PCAic3R5bGU9ZGFzaGVkOyIgPDwgZW5kbDsKLSAgZl9vdXRfIDw8ICJsYWJlbCA9IFwiIiA8PCBlc2NhcGVfc3RyaW5nKHNlcnZpY2VfbmFtZSkgPDwgIiBzZXJ2aWNlXCI7IiA8PCBlbmRsOwotCi0gIC8vIFRPRE86IHNlcnZpY2UgZXh0ZW5kcwotCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZm5faXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOwotICBmb3IgKDsgZm5faXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7IGZuX2l0ZXIrKykgewotICAgIHN0cmluZyBmbl9uYW1lID0gKCpmbl9pdGVyKS0+Z2V0X25hbWUoKTsKLQotICAgIGZfb3V0XyA8PCAiZnVuY3Rpb25fIiA8PCBzZXJ2aWNlX25hbWUgPDwgZm5fbmFtZTsKLSAgICBmX291dF8gPDwgIltsYWJlbD1cIjxyZXR1cm5fdHlwZT5mdW5jdGlvbiAiIDw8IGVzY2FwZV9zdHJpbmcoZm5fbmFtZSk7Ci0gICAgZl9vdXRfIDw8ICIgOjogIjsKLSAgICBwcmludF90eXBlKCgqZm5faXRlciktPmdldF9yZXR1cm50eXBlKCksICJmdW5jdGlvbl8iICsgc2VydmljZV9uYW1lICsgZm5fbmFtZSArICI6cmV0dXJuX3R5cGUiKTsKLQotICAgIHZlY3Rvcjx0X2ZpZWxkKj4gYXJncyA9ICgqZm5faXRlciktPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgYXJnX2l0ZXIgPSBhcmdzLmJlZ2luKCk7Ci0gICAgZm9yICg7IGFyZ19pdGVyICE9IGFyZ3MuZW5kKCk7IGFyZ19pdGVyKyspIHsKLSAgICAgIGZfb3V0XyA8PCAifDxwYXJhbV8iIDw8ICgqYXJnX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI+IjsKLSAgICAgIGZfb3V0XyA8PCAoKmFyZ19pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgIGlmICgoKmFyZ19pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgewotICAgICAgICBmX291dF8gPDwgIiA9ICI7Ci0gICAgICAgIHByaW50X2NvbnN0X3ZhbHVlKCgqYXJnX2l0ZXIpLT5nZXRfdHlwZSgpLCAoKmFyZ19pdGVyKS0+Z2V0X3ZhbHVlKCkpOwotICAgICAgfQotICAgICAgZl9vdXRfIDw8ICIgOjogIjsKLSAgICAgIHByaW50X3R5cGUoKCphcmdfaXRlciktPmdldF90eXBlKCksCi0gICAgICAgICAgICAgICAgICJmdW5jdGlvbl8iICsgc2VydmljZV9uYW1lICsgZm5fbmFtZSArICI6cGFyYW1fIiArICgqYXJnX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICB9Ci0gICAgLy8gZW5kIG9mIG5vZGUKLSAgICBmX291dF8gPDwgIlwiXTsiIDw8IGVuZGw7Ci0KLSAgICAvLyBFeGNlcHRpb24gZWRnZXMKLSAgICBpZiAoZXhjZXB0aW9uX2Fycm93cykgewotICAgICAgdmVjdG9yPHRfZmllbGQqPiBleGNlcHRzID0gKCpmbl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpOwotICAgICAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgZXhfaXRlciA9IGV4Y2VwdHMuYmVnaW4oKTsKLSAgICAgIGZvciAoOyBleF9pdGVyICE9IGV4Y2VwdHMuZW5kKCk7IGV4X2l0ZXIrKykgewotICAgICAgICBlZGdlcy5wdXNoX2JhY2soImZ1bmN0aW9uXyIgKyBzZXJ2aWNlX25hbWUgKyBmbl9uYW1lICsgIiAtPiAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICgqZXhfaXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCkgKyAiIFtjb2xvcj1yZWRdIik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZl9vdXRfIDw8ICIgfSIgPDwgZW5kbDsKLX0KLQotVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUigKLSAgICBndiwKLSAgICAiR3JhcGh2aXoiLAotICAgICIgICAgZXhjZXB0aW9uczogICAgICBXaGV0aGVyIHRvIGRyYXcgYXJyb3dzIGZyb20gZnVuY3Rpb25zIHRvIGV4Y2VwdGlvbi5cbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfaGF4ZV9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfaGF4ZV9nZW5lcmF0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmYTM2YzUuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2hheGVfZ2VuZXJhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjk2NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxjY3R5cGU+Ci0KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KLQotI2luY2x1ZGUgInBsYXRmb3JtLmgiCi0jaW5jbHVkZSAidF9vb3BfZ2VuZXJhdG9yLmgiCi0KLXVzaW5nIHN0ZDo6bWFwOwotdXNpbmcgc3RkOjpvZnN0cmVhbTsKLXVzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKLXVzaW5nIHN0ZDo6c3RyaW5nOwotdXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Ci11c2luZyBzdGQ6OnZlY3RvcjsKLQotc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcwotCi0vKioKLSAqIEhheGUgY29kZSBnZW5lcmF0b3IuCi0gKgotICovCi1jbGFzcyB0X2hheGVfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7Ci1wdWJsaWM6Ci0gIHRfaGF4ZV9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQotICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKLSAgICAodm9pZClvcHRpb25fc3RyaW5nOwotICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgiY2FsbGJhY2tzIik7Ci0gICAgY2FsbGJhY2tzXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJydHRpIik7Ci0gICAgcnR0aV8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgiYnVpbGRtYWNybyIpOwotICAgIGJ1aWxkbWFjcm9fID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpID8gKGl0ZXItPnNlY29uZCkgOiAiIjsKLQotICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWhheGUiOwotICB9Ci0KLSAgLyoqCi0gICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKLSAgICovCi0KLSAgdm9pZCBpbml0X2dlbmVyYXRvcigpOwotICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOwotCi0gIHZvaWQgZ2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpOwotCi0gIC8qKgotICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKLSAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLQotICB2b2lkIHByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX3N0YXRpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlZnZhbCA9IGZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpOwotCi0gIC8qKgotICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfaGF4ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uLCBib29sIGlzX3Jlc3VsdCA9IGZhbHNlKTsKLQotICB2b2lkIGdlbmVyYXRlX2hheGVfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCA9IGZhbHNlKTsKLSAgLy8gcmVtb3ZlZCAtLSBlcXVhbGl0eSxjb21wYXJlX3RvCi0gIHZvaWQgZ2VuZXJhdGVfaGF4ZV9zdHJ1Y3RfcmVhZGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2hheGVfdmFsaWRhdG9yKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2hheGVfc3RydWN0X3Jlc3VsdF93cml0ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfaGF4ZV9zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2hheGVfc3RydWN0X3Rvc3RyaW5nKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2hheGVfbWV0YV9kYXRhX21hcChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUpOwotICBzdGQ6OnN0cmluZyBnZXRfaGF4ZV90eXBlX3N0cmluZyh0X3R5cGUqIHR5cGUpOwotICB2b2lkIGdlbmVyYXRlX3JlZmxlY3Rpb25fc2V0dGVycyhzdGQ6Om9zdHJpbmdzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcmVmbGVjdGlvbl9nZXR0ZXJzKHN0ZDo6b3N0cmluZ3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lKTsKLSAgdm9pZCBnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnNfc2V0dGVycyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9nZW5lcmljX2lzc2V0X21ldGhvZChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9wZXJ0eV9nZXR0ZXJzX3NldHRlcnMoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0gIHN0ZDo6c3RyaW5nIGdldF9jYXBfbmFtZShzdGQ6OnN0cmluZyBuYW1lKTsKLSAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVfaXNzZXRfY2hlY2sodF9maWVsZCogZmllbGQpOwotICBzdGQ6OnN0cmluZyBnZW5lcmF0ZV9pc3NldF9jaGVjayhzdGQ6OnN0cmluZyBmaWVsZCk7Ci0gIHZvaWQgZ2VuZXJhdGVfaXNzZXRfc2V0KG9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKTsKLSAgLy8gcmVtb3ZlZCBzdGQ6OnN0cmluZyBpc3NldF9maWVsZF9pZCh0X2ZpZWxkKiBmaWVsZCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfbWV0aG9kX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIGJvb2wgaXNfaW50ZXJmYWNlKTsKLQotICAvKioKLSAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIpOwotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdGQ6OnN0cmluZyBpdGVyKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWFwKTsKLQotICB2b2lkIGdlbmVyYXRlX2hheGVfZG9jKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpOwotICB2b2lkIGdlbmVyYXRlX2hheGVfZG9jKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGRvYyk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9ydHRpX2RlY29yYXRpb24oc3RkOjpvZnN0cmVhbSYgb3V0KTsKLSAgdm9pZCBnZW5lcmF0ZV9tYWNyb19kZWNvcmF0aW9uKHN0ZDo6b2ZzdHJlYW0mIG91dCk7Ci0KLSAgLyoqCi0gICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCi0gICAqLwotCi0gIHN0ZDo6c3RyaW5nIGhheGVfcGFja2FnZSgpOwotICBzdGQ6OnN0cmluZyBoYXhlX3R5cGVfaW1wb3J0cygpOwotICBzdGQ6OnN0cmluZyBoYXhlX3RocmlmdF9pbXBvcnRzKCk7Ci0gIHN0ZDo6c3RyaW5nIGhheGVfdGhyaWZ0X2dlbl9pbXBvcnRzKHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcmIGltcG9ydHMpOwotICBzdGQ6OnN0cmluZyBoYXhlX3RocmlmdF9nZW5faW1wb3J0cyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgaW5fY29udGFpbmVyID0gZmFsc2UsIGJvb2wgaW5faW5pdCA9IGZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgYmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHRiYXNlLCBib29sIGluX2NvbnRhaW5lciA9IGZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCA9IGZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlX2NhbGxiYWNrKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0gIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZV9ub3JtYWwodF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLSAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKLSAgc3RkOjpzdHJpbmcgZ2V0X2VudW1fY2xhc3NfbmFtZSh0X3R5cGUqIHR5cGUpOwotICBzdHJpbmcgZ2VuZXJhdGVfc2VydmljZV9tZXRob2Rfb25zdWNjZXNzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgYm9vbCBhc190eXBlLCBib29sIG9taXRfbmFtZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9tZXRob2Rfc2lnbmF0dXJlX2NhbGxiYWNrKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgYm9vbCBpc19pbnRlcmZhY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfbWV0aG9kX3NpZ25hdHVyZV9ub3JtYWwodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBib29sIGlzX2ludGVyZmFjZSk7Ci0KLSAgYm9vbCB0eXBlX2Nhbl9iZV9udWxsKHRfdHlwZSogdHR5cGUpIHsKLSAgICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOwotCi0gICAgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSB8fCB0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkgfHwgdHR5cGUtPmlzX3N0cmluZygpKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIC8vIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OiAgLSBJbnQ2NCBpcyBub3QgcmVhbGx5IG51bGxhYmxlLCBldmVuIHRob3VnaCBpdCBiZWhhdmVkIHRoYXQKLSAgICAgICAgLy8gd2F5IGJlZm9yZSBIYXhlIDMuMi4wCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIGNvbnN0YW50X25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7Ci0KLXByaXZhdGU6Ci0gIGJvb2wgY2FsbGJhY2tzXzsKLSAgYm9vbCBydHRpXzsKLSAgc3RyaW5nIGJ1aWxkbWFjcm9fOwotCi0gIC8qKgotICAgKiBGaWxlIHN0cmVhbXMKLSAgICovCi0KLSAgc3RkOjpzdHJpbmcgcGFja2FnZV9uYW1lXzsKLSAgc3RkOjpvZnN0cmVhbSBmX3NlcnZpY2VfOwotICBzdGQ6OnN0cmluZyBwYWNrYWdlX2Rpcl87Ci19OwotCi0vKioKLSAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0Ci0gKiBzdHJlYW1zLgotICoKLSAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQotICovCi12b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgewotICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKLSAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKLSAgcGFja2FnZV9uYW1lXyA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJoYXhlIik7Ci0KLSAgLy8gSGF4ZSBwYWNrYWdlIG5hbWVzIGFyZSBsb3dlcmNhc2UKLSAgaWYgKHBhY2thZ2VfbmFtZV8ubGVuZ3RoKCkgPiAwKSB7Ci0gICAgcGFja2FnZV9uYW1lX1swXSA9IHRvbG93ZXIocGFja2FnZV9uYW1lX1swXSk7Ci0gICAgc2l6ZV90IGluZGV4ID0gcGFja2FnZV9uYW1lXy5maW5kKCcuJyk7Ci0gICAgd2hpbGUgKGluZGV4ICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7Ci0gICAgICBpZiAoKytpbmRleCA8IHBhY2thZ2VfbmFtZV8ubGVuZ3RoKCkpIHsKLSAgICAgICAgcGFja2FnZV9uYW1lX1tpbmRleF0gPSB0b2xvd2VyKHBhY2thZ2VfbmFtZV9baW5kZXhdKTsKLSAgICAgIH0KLSAgICAgIGluZGV4ID0gcGFja2FnZV9uYW1lXy5maW5kKCcuJywgaW5kZXgpOwotICAgIH0KLSAgfQotCi0gIHN0cmluZyBkaXIgPSBwYWNrYWdlX25hbWVfOwotICBzdHJpbmcgc3ViZGlyID0gZ2V0X291dF9kaXIoKTsKLSAgc3RyaW5nOjpzaXplX3R5cGUgbG9jOwotICB3aGlsZSAoKGxvYyA9IGRpci5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykgewotICAgIHN1YmRpciA9IHN1YmRpciArICIvIiArIGRpci5zdWJzdHIoMCwgbG9jKTsKLSAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7Ci0gICAgZGlyID0gZGlyLnN1YnN0cihsb2MgKyAxKTsKLSAgfQotICBpZiAoZGlyLnNpemUoKSA+IDApIHsKLSAgICBzdWJkaXIgPSBzdWJkaXIgKyAiLyIgKyBkaXI7Ci0gICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOwotICB9Ci0KLSAgcGFja2FnZV9kaXJfID0gc3ViZGlyOwotfQotCi0vKioKLSAqIFBhY2thZ2VzIHRoZSBnZW5lcmF0ZWQgZmlsZQotICoKLSAqIEByZXR1cm4gU3RyaW5nIG9mIHRoZSBwYWNrYWdlLCBpLmUuICJwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0ZGVtbzsiCi0gKi8KLXN0cmluZyB0X2hheGVfZ2VuZXJhdG9yOjpoYXhlX3BhY2thZ2UoKSB7Ci0gIGlmICghcGFja2FnZV9uYW1lXy5lbXB0eSgpKSB7Ci0gICAgcmV0dXJuIHN0cmluZygicGFja2FnZSAiKSArIHBhY2thZ2VfbmFtZV87Ci0gIH0KLSAgcmV0dXJuICJwYWNrYWdlIjsKLX0KLQotLyoqCi0gKiBQcmludHMgc3RhbmRhcmQgaGF4ZSBpbXBvcnRzCi0gKgotICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgZm9yIGhheGUgdHlwZXMgdGhhdCBhcmUgdXNlZCBpbiBoZXJlCi0gKi8KLXN0cmluZyB0X2hheGVfZ2VuZXJhdG9yOjpoYXhlX3R5cGVfaW1wb3J0cygpIHsKLSAgcmV0dXJuIHN0cmluZygpICsgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5oZWxwZXIuKjtcbiIgKyAiaW1wb3J0IGhheGUuaW8uQnl0ZXM7XG4iCi0gICAgICAgICArICJpbXBvcnQgaGF4ZS5kcy5JbnRNYXA7XG4iICsgImltcG9ydCBoYXhlLmRzLlN0cmluZ01hcDtcbiIKLSAgICAgICAgICsgImltcG9ydCBoYXhlLmRzLk9iamVjdE1hcDtcbiIgKyAiXG4iICsgIiNpZiBmbGFzaFxuIgotICAgICAgICAgKyAiaW1wb3J0IGZsYXNoLmVycm9ycy5Bcmd1bWVudEVycm9yO1xuIiArICIjZW5kXG4iICsgIlxuIjsKLX0KLQotLyoqCi0gKiBQcmludHMgc3RhbmRhcmQgaGF4ZSBpbXBvcnRzCi0gKgotICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgbmVjZXNzYXJ5IGZvciB0aHJpZnQKLSAqLwotc3RyaW5nIHRfaGF4ZV9nZW5lcmF0b3I6OmhheGVfdGhyaWZ0X2ltcG9ydHMoKSB7Ci0gIHJldHVybiBzdHJpbmcoKSArICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuKjtcbiIgKyAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS4qO1xuIgotICAgICAgICAgKyAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLio7XG4iICsgIlxuIjsKLX0KLQotLyoqCi0gKiBQcmludHMgaW1wb3J0cyBuZWVkZWQgZm9yIGEgZ2l2ZW4gdHlwZQotICoKLSAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgYSBnaXZlbiB0X3N0cnVjdAotICovCi1zdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6aGF4ZV90aHJpZnRfZ2VuX2ltcG9ydHModF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyYgaW1wb3J0cykgewotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgLy8gRm9yIGVhY2ggdHlwZSBjaGVjayBpZiBpdCBpcyBmcm9tIGEgZGlmZmVyZW50IG5hbWVzcGFjZQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gKCptX2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfcHJvZ3JhbSgpOwotICAgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgewotICAgICAgc3RyaW5nIHBhY2thZ2UgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJoYXhlIik7Ci0gICAgICBpZiAoIXBhY2thZ2UuZW1wdHkoKSkgewotICAgICAgICBpZiAoaW1wb3J0cy5maW5kKHBhY2thZ2UgKyAiLiIgKyAoKm1faXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCkpID09IHN0cmluZzo6bnBvcykgewotICAgICAgICAgIGltcG9ydHMuYXBwZW5kKCJpbXBvcnQgIiArIHBhY2thZ2UgKyAiLiIgKyAoKm1faXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCkgKyAiO1xuIik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGltcG9ydHM7Ci19Ci0KLS8qKgotICogUHJpbnRzIGltcG9ydHMgbmVlZGVkIGZvciBhIGdpdmVuIHR5cGUKLSAqCi0gKiBAcmV0dXJuIExpc3Qgb2YgaW1wb3J0cyBuZWNlc3NhcnkgZm9yIGEgZ2l2ZW4gdF9zZXJ2aWNlCi0gKi8KLXN0cmluZyB0X2hheGVfZ2VuZXJhdG9yOjpoYXhlX3RocmlmdF9nZW5faW1wb3J0cyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBpbXBvcnRzOwotICBjb25zdCB2ZWN0b3I8dF9mdW5jdGlvbio+JiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gRm9yIGVhY2ggdHlwZSBjaGVjayBpZiBpdCBpcyBmcm9tIGEgZGlmZmVyZW50IG5hbWVzcGFjZQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+Z2V0X3Byb2dyYW0oKTsKLSAgICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKLSAgICAgIHN0cmluZyBwYWNrYWdlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiaGF4ZSIpOwotICAgICAgaWYgKCFwYWNrYWdlLmVtcHR5KCkpIHsKLSAgICAgICAgaWYgKGltcG9ydHMuZmluZChwYWNrYWdlICsgIi4iICsgKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5nZXRfbmFtZSgpKSA9PSBzdHJpbmc6Om5wb3MpIHsKLSAgICAgICAgICBpbXBvcnRzLmFwcGVuZCgiaW1wb3J0ICIgKyBwYWNrYWdlICsgIi4iICsgKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyAiO1xuIik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBoYXhlX3RocmlmdF9nZW5faW1wb3J0cygoKmZfaXRlciktPmdldF9hcmdsaXN0KCksIGltcG9ydHMpOwotICAgIGhheGVfdGhyaWZ0X2dlbl9pbXBvcnRzKCgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpLCBpbXBvcnRzKTsKLSAgfQotCi0gIHJldHVybiBpbXBvcnRzOwotfQotCi0vKioKLSAqIE5vdGhpbmcgaW4gaGF4ZQotICovCi12b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBUaGlzIGlzIG5vdCBkb25lIGluIGhheGUsIHNpbmNlIGl0IGRvZXMKLSAqIG5vdCBzdXBwb3J0IGFyYml0cmFyeSBuYW1lIHJlcGxhY2VtZW50cywgYW5kIGl0J2QgYmUgYSB3YWNreSB3YXN0ZQotICogb2Ygb3ZlcmhlYWQgdG8gbWFrZSB3cmFwcGVyIGNsYXNzZXMuCi0gKgotICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKLSAgKHZvaWQpdHR5cGVkZWY7Ci19Ci0KLS8qKgotICogRW51bXMgYXJlIGEgY2xhc3Mgd2l0aCBhIHNldCBvZiBzdGF0aWMgY29uc3RhbnRzLgotICoKLSAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KLSAqLwotdm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKLSAgLy8gTWFrZSBvdXRwdXQgZmlsZQotICBzdHJpbmcgZl9lbnVtX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBnZXRfY2FwX25hbWUodGVudW0tPmdldF9uYW1lKCkpICsgIi5oeCI7Ci0gIG9mc3RyZWFtIGZfZW51bTsKLSAgZl9lbnVtLm9wZW4oZl9lbnVtX25hbWUuY19zdHIoKSk7Ci0KLSAgLy8gQ29tbWVudCBhbmQgcGFja2FnZSBpdAotICBmX2VudW0gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgaGF4ZV9wYWNrYWdlKCkgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBBZGQgaGF4ZSBpbXBvcnRzCi0gIGZfZW51bSA8PCBzdHJpbmcoKSArICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuaGVscGVyLio7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfcnR0aV9kZWNvcmF0aW9uKGZfZW51bSk7Ci0gIGdlbmVyYXRlX21hY3JvX2RlY29yYXRpb24oZl9lbnVtKTsKLSAgaW5kZW50KGZfZW51bSkgPDwgImNsYXNzICIgPDwgZ2V0X2NhcF9uYW1lKHRlbnVtLT5nZXRfbmFtZSgpKSA8PCAiICI7Ci0gIHNjb3BlX3VwKGZfZW51bSk7Ci0KLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOwotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgaW5kZW50KGZfZW51bSkgPDwgInB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciAiIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIDogSW50ID0gIiA8PCB2YWx1ZQotICAgICAgICAgICAgICAgICAgIDw8ICI7IiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gQ3JlYXRlIGEgc3RhdGljIFNldCB3aXRoIGFsbCB2YWxpZCB2YWx1ZXMgZm9yIHRoaXMgZW51bQotICBmX2VudW0gPDwgZW5kbDsKLQotICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIHN0YXRpYyB2YXIgVkFMSURfVkFMVUVTID0geyBuZXcgSW50U2V0KCBbIjsKLSAgaW5kZW50X3VwKCk7Ci0gIGJvb2wgZmlyc3RWYWx1ZSA9IHRydWU7Ci0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgLy8gcG9wdWxhdGUgc2V0Ci0gICAgZl9lbnVtIDw8IChmaXJzdFZhbHVlID8gIiIgOiAiLCAiKSA8PCAoKmNfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgZmlyc3RWYWx1ZSA9IGZhbHNlOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfZW51bSA8PCAiXSk7IH07IiA8PCBlbmRsOwotCi0gIGluZGVudChmX2VudW0pIDw8ICJwdWJsaWMgc3RhdGljIHZhciBWQUxVRVNfVE9fTkFNRVMgPSB7IFsiOwotICBpbmRlbnRfdXAoKTsKLSAgZmlyc3RWYWx1ZSA9IHRydWU7Ci0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgZl9lbnVtIDw8IChmaXJzdFZhbHVlID8gIiIgOiAiLCIpIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfZW51bSkgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPT4gXCIiIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIiOwotICAgIGZpcnN0VmFsdWUgPSBmYWxzZTsKLSAgfQotICBmX2VudW0gPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfZW51bSkgPDwgIl07IH07IiA8PCBlbmRsOwotCi0gIHNjb3BlX2Rvd24oZl9lbnVtKTsgLy8gZW5kIGNsYXNzCi0KLSAgZl9lbnVtLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgY2xhc3MgdGhhdCBob2xkcyBhbGwgdGhlIGNvbnN0YW50cy4KLSAqLwotdm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgewotICBpZiAoY29uc3RzLmVtcHR5KCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIGdldF9jYXBfbmFtZShwcm9ncmFtX25hbWVfKSArICJDb25zdGFudHMuaHgiOwotICBvZnN0cmVhbSBmX2NvbnN0czsKLSAgZl9jb25zdHMub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOwotCi0gIC8vIFByaW50IGhlYWRlcgotICBmX2NvbnN0cyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBoYXhlX3BhY2thZ2UoKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGZfY29uc3RzIDw8IGVuZGw7Ci0KLSAgZl9jb25zdHMgPDwgaGF4ZV90eXBlX2ltcG9ydHMoKTsKLQotICBnZW5lcmF0ZV9ydHRpX2RlY29yYXRpb24oZl9jb25zdHMpOwotICBnZW5lcmF0ZV9tYWNyb19kZWNvcmF0aW9uKGZfY29uc3RzKTsKLSAgaW5kZW50KGZfY29uc3RzKSA8PCAiY2xhc3MgIiA8PCBnZXRfY2FwX25hbWUocHJvZ3JhbV9uYW1lXykgPDwgIkNvbnN0YW50cyB7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgcHJpbnRfY29uc3RfdmFsdWUoZl9jb25zdHMsCi0gICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF92YWx1ZSgpLAotICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9jb25zdHMpIDw8ICJ9IiA8PCBlbmRsOwotICBmX2NvbnN0cy5jbG9zZSgpOwotfQotCi12b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OnByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fc3RhdGljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlZnZhbCkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpbmRlbnQob3V0KTsKLSAgaWYgKCFkZWZ2YWwpIHsKLSAgICBvdXQgPDwgKGluX3N0YXRpYyA/ICJ2YXIgIiA6ICJwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgICIpOwotICB9Ci0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHN0cmluZyB2MiA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIHR5cGUsIHZhbHVlKTsKLSAgICBvdXQgPDwgbmFtZTsKLSAgICBpZiAoIWRlZnZhbCkgewotICAgICAgb3V0IDw8ICI6IiA8PCB0eXBlX25hbWUodHlwZSk7Ci0gICAgfQotICAgIG91dCA8PCAiID0gIiA8PCB2MiA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIG91dCA8PCBuYW1lOwotICAgIGlmICghZGVmdmFsKSB7Ci0gICAgICBvdXQgPDwgIjoiIDw8IHR5cGVfbmFtZSh0eXBlKTsKLSAgICB9Ci0gICAgb3V0IDw8ICIgPSAiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIG91dCA8PCBuYW1lIDw8ICI6IiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIKLSAgICAgICAgPDwgZW5kbDsKLSAgICBpZiAoIWluX3N0YXRpYykgewotICAgICAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgZnVuY3Rpb24oKSA6IFZvaWQgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKLSAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7Ci0gICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOwotICAgICAgfQotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi4iOwotICAgICAgb3V0IDw8IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSA8PCAiID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGlmICghaW5fc3RhdGljKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0oKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgb3V0IDw8IG5hbWU7Ci0gICAgaWYgKCFkZWZ2YWwpIHsKLSAgICAgIG91dCA8PCAiOiIgPDwgdHlwZV9uYW1lKHR5cGUpOwotICAgIH0KLSAgICBvdXQgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKLSAgICBpZiAoIWluX3N0YXRpYykgewotICAgICAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgZnVuY3Rpb24oKSA6IFZvaWQgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLSAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgc3RyaW5nIGtleSA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiWyIgPDwga2V5IDw8ICJdID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGlmICghaW5fc3RhdGljKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0oKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgewotICAgIG91dCA8PCBuYW1lOwotICAgIGlmICghZGVmdmFsKSB7Ci0gICAgICBvdXQgPDwgIjoiIDw8IHR5cGVfbmFtZSh0eXBlKTsKLSAgICB9Ci0gICAgb3V0IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7Ci0gICAgaWYgKCFpbl9zdGF0aWMpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAibmV3IGZ1bmN0aW9uKCkgOiBWb2lkIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0gICAgdF90eXBlKiBldHlwZTsKLSAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfQotICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGV0eXBlLCAqdl9pdGVyKTsKLSAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi4iIDw8ICh0eXBlLT5pc19saXN0KCkgPyAicHVzaCIgOiAiYWRkIikgPDwgIigiIDw8IHZhbCA8PCAiKTsiCi0gICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgIH0KLSAgICBpZiAoIWluX3N0YXRpYykgewotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9KCk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIHR5cGUgIiArIHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLX0KLQotc3RyaW5nIHRfaGF4ZV9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZShvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewotICAodm9pZCluYW1lOwotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlbmRlcjsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmVuZGVyIDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJlbmRlciA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJlbmRlciA8PCAiKGJ5dGUpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmVuZGVyIDw8ICIoc2hvcnQpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIkwiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICByZW5kZXIgPDwgIihkb3VibGUpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gIH0gZWxzZSB7Ci0gICAgc3RyaW5nIHQgPSB0bXAoInRtcCIpOwotICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwgdCwgdHlwZSwgdmFsdWUsIHRydWUpOwotICAgIHJlbmRlciA8PCB0OwotICB9Ci0KLSAgcmV0dXJuIHJlbmRlci5zdHIoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLiBUaGlzIGlzIGEgY2xhc3MKLSAqIHdpdGggZGF0YSBtZW1iZXJzLCByZWFkKCksIHdyaXRlKCksIGFuZCBhbiBpbm5lciBJc3NldCBjbGFzcy4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgZ2VuZXJhdGVfaGF4ZV9zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOwotfQotCi0vKioKLSAqIEV4Y2VwdGlvbnMgYXJlIHN0cnVjdHMsIGJ1dCB0aGV5IGluaGVyaXQgZnJvbSBFeGNlcHRpb24KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX2hheGVfc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7Ci19Ci0KLS8qKgotICogSGF4ZSBzdHJ1Y3QgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oYXhlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24sIGJvb2wgaXNfcmVzdWx0KSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfc3RydWN0X25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBnZXRfY2FwX25hbWUodHN0cnVjdC0+Z2V0X25hbWUoKSkgKyAiLmh4IjsKLSAgb2ZzdHJlYW0gZl9zdHJ1Y3Q7Ci0gIGZfc3RydWN0Lm9wZW4oZl9zdHJ1Y3RfbmFtZS5jX3N0cigpKTsKLQotICBmX3N0cnVjdCA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBoYXhlX3BhY2thZ2UoKSA8PCAiOyIgPDwgZW5kbDsKLQotICBmX3N0cnVjdCA8PCBlbmRsOwotCi0gIHN0cmluZyBpbXBvcnRzOwotCi0gIGZfc3RydWN0IDw8IGhheGVfdHlwZV9pbXBvcnRzKCkgPDwgaGF4ZV90aHJpZnRfaW1wb3J0cygpCi0gICAgICAgICAgIDw8IGhheGVfdGhyaWZ0X2dlbl9pbXBvcnRzKHRzdHJ1Y3QsIGltcG9ydHMpIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfaGF4ZV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3N0cnVjdCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uLCBpc19yZXN1bHQpOwotCi0gIGZfc3RydWN0LmNsb3NlKCk7Ci19Ci0KLS8qKgotICogaGF4ZSBzdHJ1Y3QgZGVmaW5pdGlvbi4gVGhpcyBoYXMgdmFyaW91cyBwYXJhbWV0ZXJzLCBhcyBpdCBjb3VsZCBiZQotICogZ2VuZXJhdGVkIHN0YW5kYWxvbmUgb3IgaW5zaWRlIGFub3RoZXIgY2xhc3MgYXMgYSBoZWxwZXIuIElmIGl0Ci0gKiBpcyBhIGhlbHBlciB0aGFuIGl0IGlzIGEgc3RhdGljIGNsYXNzLgotICoKLSAqIEBwYXJhbSB0c3RydWN0ICAgICAgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKiBAcGFyYW0gaXNfZXhjZXB0aW9uIElzIHRoaXMgYW4gZXhjZXB0aW9uPwotICogQHBhcmFtIGluX2NsYXNzICAgICBJZiBpbnNpZGUgYSBjbGFzcywgbmVlZHMgdG8gYmUgc3RhdGljIGNsYXNzCi0gKiBAcGFyYW0gaXNfcmVzdWx0ICAgIElmIHRoaXMgaXMgYSByZXN1bHQgaXQgbmVlZHMgYSBkaWZmZXJlbnQgd3JpdGVyCi0gKi8KLXZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaGF4ZV9zdHJ1Y3RfZGVmaW5pdGlvbihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0KSB7Ci0gIGdlbmVyYXRlX2hheGVfZG9jKG91dCwgdHN0cnVjdCk7Ci0KLSAgc3RyaW5nIGNsc25hbWUgPSBnZXRfY2FwX25hbWUodHN0cnVjdC0+Z2V0X25hbWUoKSk7Ci0KLSAgZ2VuZXJhdGVfcnR0aV9kZWNvcmF0aW9uKG91dCk7Ci0gIGdlbmVyYXRlX21hY3JvX2RlY29yYXRpb24ob3V0KTsKLSAgaW5kZW50KG91dCkgPDwgImNsYXNzICIgPDwgY2xzbmFtZSA8PCAiICI7Ci0KLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIG91dCA8PCAiZXh0ZW5kcyBURXhjZXB0aW9uICI7Ci0gIH0KLSAgb3V0IDw8ICJpbXBsZW1lbnRzIFRCYXNlICI7Ci0KLSAgc2NvcGVfdXAob3V0KTsKLSAgaW5kZW50KG91dCkgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAic3RhdGljIHZhciBTVFJVQ1RfREVTQyA9IHsgbmV3IFRTdHJ1Y3QoXCIiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlwiKTsgfTsiCi0gICAgICAgICAgICAgIDw8IGVuZGw7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInN0YXRpYyB2YXIgIiA8PCBjb25zdGFudF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkKLSAgICAgICAgICAgICAgICA8PCAiX0ZJRUxEX0RFU0MgPSB7IG5ldyBURmllbGQoXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsICIKLSAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpOyB9OyIKLSAgICAgICAgICAgICAgICA8PCBlbmRsOwotICB9Ci0gIG91dCA8PCBlbmRsOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9oYXhlX2RvYyhvdXQsICptX2l0ZXIpOwotICAgIC8vIGluZGVudChvdXQpIDw8ICJwcml2YXRlIHZhciBfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgKyAiIDogIiArCi0gICAgLy8gdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIkA6aXNWYXIiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2YXIgIgotICAgICAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSArICIoZ2V0LHNldCkgOiAiCi0gICAgICAgICAgICAgICAgICAgKyBnZXRfY2FwX25hbWUodHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkpIDw8ICI7IiA8PCBlbmRsOwotICB9Ci0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGluZGVudChvdXQpIDw8ICJpbmxpbmUgc3RhdGljIHZhciAiIDw8IHVwY2FzZV9zdHJpbmcoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKQotICAgICAgICAgICAgICAgIDw8ICJfRklFTERfSUQgOiBJbnQgPSAiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICI7IiA8PCBlbmRsOwotICB9Ci0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgLy8gSW5uZXIgSXNzZXQgY2xhc3MKLSAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgewotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIGlmICghdHlwZV9jYW5fYmVfbnVsbCgoKm1faXRlciktPmdldF90eXBlKCkpKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJwcml2YXRlIHZhciBfX2lzc2V0XyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgOiBCb29sID0gZmFsc2U7IgotICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIG91dCA8PCBlbmRsOwotCi0gIC8vIFN0YXRpYyBpbml0aWFsaXplciB0byBwb3B1bGF0ZSBnbG9iYWwgY2xhc3MgdG8gc3RydWN0IG1ldGFkYXRhIG1hcAotICBpZiAoZmFsc2UpIHsKLSAgICAvLyBUT0RPOiByZWFjdGl2YXRlIHdoZW4gbmVlZGVkCi0gICAgZ2VuZXJhdGVfaGF4ZV9tZXRhX2RhdGFfbWFwKG91dCwgdHN0cnVjdCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIkZpZWxkTWV0YURhdGEuYWRkU3RydWN0TWV0YURhdGFNYXAoIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiwgbWV0YURhdGFNYXApOyIKLSAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gbmV3KCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGlmIChpc19leGNlcHRpb24pIHsKLSAgICBpbmRlbnQob3V0KSA8PCAic3VwZXIoKTsiIDw8IGVuZGw7Ci0gIH0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiCi0gICAgICAgICAgICAgICAgICA8PCAoKm1faXRlciktPmdldF92YWx1ZSgpLT5nZXRfaW50ZWdlcigpIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX3Byb3BlcnR5X2dldHRlcnNfc2V0dGVycyhvdXQsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnNfc2V0dGVycyhvdXQsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9nZW5lcmljX2lzc2V0X21ldGhvZChvdXQsIHRzdHJ1Y3QpOwotCi0gIGdlbmVyYXRlX2hheGVfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOwotICBpZiAoaXNfcmVzdWx0KSB7Ci0gICAgZ2VuZXJhdGVfaGF4ZV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOwotICB9IGVsc2UgewotICAgIGdlbmVyYXRlX2hheGVfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOwotICB9Ci0gIGdlbmVyYXRlX2hheGVfc3RydWN0X3Rvc3RyaW5nKG91dCwgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX2hheGVfdmFsaWRhdG9yKG91dCwgdHN0cnVjdCk7Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLSAgb3V0IDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gcmVhZCBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0LgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2hheGVfc3RydWN0X3JlYWRlcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiByZWFkKCBpcHJvdCA6IFRQcm90b2NvbCkgOiBWb2lkIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBpbmRlbnQob3V0KSA8PCAiaXByb3QuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ0cnkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgLy8gRGVjbGFyZSBzdGFjayB0bXAgdmFyaWFibGVzIGFuZCByZWFkIHN0cnVjdCBoZWFkZXIKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgZmllbGQgOiBURmllbGQ7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpcHJvdC5yZWFkU3RydWN0QmVnaW4oKTsiCi0gICAgICA8PCBlbmRsOwotCi0gIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcwotICBpbmRlbnQob3V0KSA8PCAid2hpbGUgKHRydWUpIiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotCi0gIC8vIFJlYWQgYmVnaW5uaW5nIGZpZWxkIG1hcmtlcgotICBpbmRlbnQob3V0KSA8PCAiZmllbGQgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpOyIgPDwgZW5kbDsKLQotICAvLyBDaGVjayBmb3IgZmllbGQgU1RPUCBtYXJrZXIgYW5kIGJyZWFrCi0gIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5TVE9QKSB7ICIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJicmVhazsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIC8vIFN3aXRjaCBzdGF0ZW1lbnQgb24gdGhlIGZpZWxkIHdlIGFyZSByZWFkaW5nCi0gIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkLmlkKSIgPDwgZW5kbDsKLQotICBzY29wZV91cChvdXQpOwotCi0gIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgdXBjYXNlX3N0cmluZygoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICJfRklFTERfSUQ6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGQudHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLiIpOwotICAgIGdlbmVyYXRlX2lzc2V0X3NldChvdXQsICpmX2l0ZXIpOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyAiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsiCi0gICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotCi0gIC8vIEluIHRoZSBkZWZhdWx0IGNhc2Ugd2Ugc2tpcCB0aGUgZmllbGQKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOyIKLSAgICAgIDw8IGVuZGw7Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIC8vIFJlYWQgZmllbGQgZW5kIG1hcmtlcgotICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZEZpZWxkRW5kKCk7IiA8PCBlbmRsOwotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgImlwcm90LnJlYWRTdHJ1Y3RFbmQoKTsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAiaXByb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLSAgaW5kZW50KG91dCkgPDwgImNhdGNoKGU6RHluYW1pYykiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0gIGluZGVudChvdXQpIDw8ICJpcHJvdC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInRocm93IGU7IiA8PCBlbmRsOwotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgLy8gY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcyBvZiBwcmltaXRpdmUgdHlwZQotICAvLyAod2hpY2ggY2FuIGJlIGNoZWNrZWQgaGVyZSBidXQgbm90IGluIHRoZSBnZW5lcmFsIHZhbGlkYXRlIG1ldGhvZCkKLSAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIi8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMgb2YgcHJpbWl0aXZlIHR5cGUsIHdoaWNoIGNhbid0IGJlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoZWNrZWQgaW4gdGhlIHZhbGlkYXRlIG1ldGhvZCIgPDwgZW5kbDsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCAmJiAhdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghX19pc3NldF8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgPDwgIiAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uVU5LTk9XTiwgXCJSZXF1aXJlZCBmaWVsZCAnIgotICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQotICAgICAgICAgIDw8ICInIHdhcyBub3QgZm91bmQgaW4gc2VyaWFsaXplZCBkYXRhISBTdHJ1Y3Q6IFwiICsgdG9TdHJpbmcoKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgLy8gcGVyZm9ybXMgdmFyaW91cyBjaGVja3MgKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCi0gIGluZGVudChvdXQpIDw8ICJ2YWxpZGF0ZSgpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLy8gZ2VuZXJhdGVzIGhheGUgbWV0aG9kIHRvIHBlcmZvcm0gdmFyaW91cyBjaGVja3MKLS8vIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQotdm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oYXhlX3ZhbGlkYXRvcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIHZhbGlkYXRlKCkgOiBWb2lkIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgIi8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMiIDw8IGVuZGw7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID09IG51bGwpIHsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudChvdXQpCi0gICAgICAgICAgICA8PCAiICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5VTktOT1dOLCBcIlJlcXVpcmVkIGZpZWxkICciCi0gICAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicgd2FzIG5vdCBwcmVzZW50ISBTdHJ1Y3Q6IFwiICsgdG9TdHJpbmcoKSk7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICIvLyBhbGFzLCB3ZSBjYW5ub3QgY2hlY2sgJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgICAgIDw8ICInIGJlY2F1c2UgaXQncyBhIHByaW1pdGl2ZS4iIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLy8gY2hlY2sgdGhhdCBmaWVsZHMgb2YgdHlwZSBlbnVtIGhhdmUgdmFsaWQgdmFsdWVzCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiLy8gY2hlY2sgdGhhdCBmaWVsZHMgb2YgdHlwZSBlbnVtIGhhdmUgdmFsaWQgdmFsdWVzIiA8PCBlbmRsOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKCpmX2l0ZXIpOwotICAgIHRfdHlwZSogdHlwZSA9IGZpZWxkLT5nZXRfdHlwZSgpOwotICAgIC8vIGlmIGZpZWxkIGlzIGFuIGVudW0sIGNoZWNrIHRoYXQgaXRzIHZhbHVlIGlzIHZhbGlkCi0gICAgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkKSA8PCAiICYmICEiCi0gICAgICAgICAgICAgICAgICA8PCBnZXRfY2FwX25hbWUoZ2V0X2VudW1fY2xhc3NfbmFtZSh0eXBlKSkgPDwgIi5WQUxJRF9WQUxVRVMuY29udGFpbnMoIgotICAgICAgICAgICAgICAgICAgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIikpeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwgInRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLlVOS05PV04sIFwiVGhlIGZpZWxkICciCi0gICAgICAgICAgICAgICAgICA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiJyBoYXMgYmVlbiBhc3NpZ25lZCB0aGUgaW52YWxpZCB2YWx1ZSBcIiArICIKLSAgICAgICAgICAgICAgICAgIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHdyaXRlIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QKLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oYXhlX3N0cnVjdF93cml0ZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gd3JpdGUob3Byb3Q6VFByb3RvY29sKSA6IFZvaWQgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIC8vIHBlcmZvcm1zIHZhcmlvdXMgY2hlY2tzIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQotICBpbmRlbnQob3V0KSA8PCAidmFsaWRhdGUoKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJvcHJvdC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInRyeSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihTVFJVQ1RfREVTQyk7IiA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgYm9vbCBudWxsX2FsbG93ZWQgPSB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKG51bGxfYWxsb3dlZCkgewotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAodGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9IG51bGwpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEJlZ2luKCIgPDwgY29uc3RhbnRfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpCi0gICAgICAgICAgICAgICAgPDwgIl9GSUVMRF9ERVNDKTsiIDw8IGVuZGw7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLiIpOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCi0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgICBpZiAobnVsbF9hbGxvd2VkKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0gIAotICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKLSAgCi0gIGluZGVudChvdXQpIDw8ICJvcHJvdC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotICBpbmRlbnQob3V0KSA8PCAiY2F0Y2goZTpEeW5hbWljKSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLSAgaW5kZW50KG91dCkgPDwgIm9wcm90LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAidGhyb3cgZTsiIDw8IGVuZGw7Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLSAgCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHdyaXRlIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QsCi0gKiB3aGljaCBpcyBhIGZ1bmN0aW9uIHJlc3VsdC4gVGhlc2UgZmllbGRzIGFyZSBvbmx5IHdyaXR0ZW4KLSAqIGlmIHRoZXkgYXJlIHNldCBpbiB0aGUgSXNzZXQgYXJyYXksIGFuZCBvbmx5IG9uZSBvZiB0aGVtCi0gKiBjYW4gYmUgc2V0IGF0IGEgdGltZS4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oYXhlX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGZ1bmN0aW9uIHdyaXRlKG9wcm90OlRQcm90b2NvbCkgOiBWb2lkIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBpbmRlbnQob3V0KSA8PCAib3Byb3QuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ0cnkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0gIAotICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihTVFJVQ1RfREVTQyk7IiA8PCBlbmRsOwotCi0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiAiOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwgIiBlbHNlIGlmICI7Ci0gICAgfQotCi0gICAgb3V0IDw8ICIodGhpcy4iIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCpmX2l0ZXIpIDw8ICIpIHsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkQmVnaW4oIiA8PCBjb25zdGFudF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkKLSAgICAgICAgICAgICAgICA8PCAiX0ZJRUxEX0RFU0MpOyIgPDwgZW5kbDsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCi0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMuIik7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iOwotICB9Ci0gIAotICBpbmRlbnQob3V0KSA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKLSAgCi0gIGluZGVudChvdXQpIDw8ICJvcHJvdC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotICBpbmRlbnQob3V0KSA8PCAiY2F0Y2goZTpEeW5hbWljKSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLSAgaW5kZW50KG91dCkgPDwgIm9wcm90LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAidGhyb3cgZTsiIDw8IGVuZGw7Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLSAgCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3JlZmxlY3Rpb25fZ2V0dGVycyhvc3RyaW5nc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGRfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjYXBfbmFtZSkgewotICAodm9pZCl0eXBlOwotICAodm9pZCljYXBfbmFtZTsKLSAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCB1cGNhc2Vfc3RyaW5nKGZpZWxkX25hbWUpIDw8ICJfRklFTERfSUQ6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgInJldHVybiB0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotdm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yZWZsZWN0aW9uX3NldHRlcnMob3N0cmluZ3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2FwX25hbWUpIHsKLSAgKHZvaWQpdHlwZTsKLSAgKHZvaWQpY2FwX25hbWU7Ci0gIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgdXBjYXNlX3N0cmluZyhmaWVsZF9uYW1lKSA8PCAiX0ZJRUxEX0lEOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJpZiAodmFsdWUgPT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgdW5zZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKSA8PCAiKCk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSB2YWx1ZTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotdm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnNfc2V0dGVycyhzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0KLSAgc3RkOjpvc3RyaW5nc3RyZWFtIGdldHRlcl9zdHJlYW07Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBzZXR0ZXJfc3RyZWFtOwotCi0gIC8vIGJ1aWxkIHVwIHRoZSBib2RpZXMgb2YgYm90aCB0aGUgZ2V0dGVyIGFuZCBzZXR0ZXIgYXQgb25jZQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOwotICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoZmllbGQtPmdldF90eXBlKCkpOwotICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKLSAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKTsKLQotICAgIGluZGVudF91cCgpOwotICAgIGdlbmVyYXRlX3JlZmxlY3Rpb25fc2V0dGVycyhzZXR0ZXJfc3RyZWFtLCB0eXBlLCBmaWVsZF9uYW1lLCBjYXBfbmFtZSk7Ci0gICAgZ2VuZXJhdGVfcmVmbGVjdGlvbl9nZXR0ZXJzKGdldHRlcl9zdHJlYW0sIHR5cGUsIGZpZWxkX25hbWUsIGNhcF9uYW1lKTsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0KLSAgLy8gY3JlYXRlIHRoZSBzZXR0ZXIKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiBzZXRGaWVsZFZhbHVlKGZpZWxkSUQgOiBJbnQsIHZhbHVlIDogRHluYW1pYykgOiBWb2lkIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgewotICAgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkSUQpIHsiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IHNldHRlcl9zdHJlYW0uc3RyKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKFwiRmllbGQgXCIgKyBmaWVsZElEICsgXCIgZG9lc24ndCBleGlzdCFcIik7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihcIkZpZWxkIFwiICsgZmllbGRJRCArIFwiIGRvZXNuJ3QgZXhpc3QhXCIpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gY3JlYXRlIHRoZSBnZXR0ZXIKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiBnZXRGaWVsZFZhbHVlKGZpZWxkSUQgOiBJbnQpIDogRHluYW1pYyB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpZiAoZmllbGRzLnNpemUoKSA+IDApIHsKLSAgICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZElEKSB7IiA8PCBlbmRsOwotICAgIG91dCA8PCBnZXR0ZXJfc3RyZWFtLnN0cigpOwotICAgIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihcIkZpZWxkIFwiICsgZmllbGRJRCArIFwiIGRvZXNuJ3QgZXhpc3QhXCIpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQob3V0KSA8PCAidGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoXCJGaWVsZCBcIiArIGZpZWxkSUQgKyBcIiBkb2Vzbid0IGV4aXN0IVwiKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotCi0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8vIENyZWF0ZXMgYSBnZW5lcmljIGlzU2V0IG1ldGhvZCB0aGF0IHRha2VzIHRoZSBmaWVsZCBudW1iZXIgYXMgYXJndW1lbnQKLXZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ2VuZXJpY19pc3NldF9tZXRob2Qoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gY3JlYXRlIHRoZSBpc1NldCBtZXRob2QKLSAgaW5kZW50KG91dCkgPDwgIi8vIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBjb3JyZXNwb25kaW5nIHRvIGZpZWxkSUQgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhICIKLSAgICAgICAgICAgICAgICAgInZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIGlzU2V0KGZpZWxkSUQgOiBJbnQpIDogQm9vbCB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGRJRCkgeyIgPDwgZW5kbDsKLQotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IHVwY2FzZV9zdHJpbmcoZmllbGQtPmdldF9uYW1lKCkpIDw8ICJfRklFTERfSUQ6IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpIDw8ICI7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICB9Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoXCJGaWVsZCBcIiArIGZpZWxkSUQgKyBcIiBkb2Vzbid0IGV4aXN0IVwiKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInRocm93IG5ldyBBcmd1bWVudEVycm9yKFwiRmllbGQgXCIgKyBmaWVsZElEICsgXCIgZG9lc24ndCBleGlzdCFcIik7IiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXQgb2YgcHJvcGVydHkgc2V0dGVycy9nZXR0ZXJzIGZvciB0aGUgZ2l2ZW4gc3RydWN0LgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb3BlcnR5X2dldHRlcnNfc2V0dGVycyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOwotICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoZmllbGQtPmdldF90eXBlKCkpOwotICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKLSAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKTsKLQotICAgIC8vIFNpbXBsZSBnZXR0ZXIKLSAgICBnZW5lcmF0ZV9oYXhlX2RvYyhvdXQsIGZpZWxkKTsKLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIGdldF8iIDw8IGZpZWxkX25hbWUgPDwgIigpIDogIiA8PCBnZXRfY2FwX25hbWUodHlwZV9uYW1lKHR5cGUpKQotICAgICAgICAgICAgICAgIDw8ICIgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIC8vIFNpbXBsZSBzZXR0ZXIKLSAgICBnZW5lcmF0ZV9oYXhlX2RvYyhvdXQsIGZpZWxkKTsKLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIHNldF8iIDw8IGZpZWxkX25hbWUgPDwgIigiIDw8IGZpZWxkX25hbWUgPDwgIjoiCi0gICAgICAgICAgICAgICAgPDwgZ2V0X2NhcF9uYW1lKHR5cGVfbmFtZSh0eXBlKSkgPDwgIikgOiAiIDw8IGdldF9jYXBfbmFtZSh0eXBlX25hbWUodHlwZSkpIDw8ICIgeyIKLSAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOwotICAgIGdlbmVyYXRlX2lzc2V0X3NldChvdXQsIGZpZWxkKTsKLSAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgLy8gVW5zZXR0ZXIKLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIHVuc2V0IiA8PCBjYXBfbmFtZSA8PCAiKCkgOiBWb2lkIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gbnVsbDsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLl9faXNzZXRfIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBmYWxzZTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIC8vIGlzU2V0IG1ldGhvZAotICAgIGluZGVudChvdXQpIDw8ICIvLyBSZXR1cm5zIHRydWUgaWYgZmllbGQgIiA8PCBmaWVsZF9uYW1lCi0gICAgICAgICAgICAgICAgPDwgIiBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiBpcyIgPDwgZ2V0X2NhcF9uYW1lKCJzZXQiKSA8PCBjYXBfbmFtZSA8PCAiKCkgOiBCb29sIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiAhPSBudWxsOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiB0aGlzLl9faXNzZXRfIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0b1N0cmluZygpIG1ldGhvZCBmb3IgdGhlIGdpdmVuIHN0cnVjdAotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2hheGVfc3RydWN0X3Rvc3RyaW5nKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljICIKLSAgICAgIDw8ICJmdW5jdGlvbiB0b1N0cmluZygpIDogU3RyaW5nIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyIHJldCA6IFN0cmluZyA9IFwiIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoXCI7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciBmaXJzdCA6IEJvb2wgPSB0cnVlOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgYm9vbCBjb3VsZF9iZV91bnNldCA9ICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7Ci0gICAgaWYgKGNvdWxkX2JlX3Vuc2V0KSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLQotICAgIHRfZmllbGQqIGZpZWxkID0gKCpmX2l0ZXIpOwotCi0gICAgaWYgKCFmaXJzdCkgewotICAgICAgaW5kZW50KG91dCkgPDwgImlmICghZmlyc3QpIHJldCArPSAgXCIsIFwiOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgInJldCArPSBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6XCI7IiA8PCBlbmRsOwotICAgIGJvb2wgY2FuX2JlX251bGwgPSB0eXBlX2Nhbl9iZV9udWxsKGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAoY2FuX2JlX251bGwpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID09IG51bGwpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICByZXQgKz0gXCJudWxsXCI7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotCi0gICAgaWYgKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19iYXNlX3R5cGUoKSAmJiAoKHRfYmFzZV90eXBlKikoZmllbGQtPmdldF90eXBlKCkpKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIHJldCArPSBcIkJJTkFSWVwiOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19lbnVtKCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ2YXIgIiA8PCBmaWVsZC0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgICAgPDwgIl9uYW1lIDogU3RyaW5nID0gIiA8PCBnZXRfY2FwX25hbWUoZ2V0X2VudW1fY2xhc3NfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSkpCi0gICAgICAgICAgICAgICAgICA8PCAiLlZBTFVFU19UT19OQU1FU1t0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJdOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiX25hbWUgIT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIHJldCArPSAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICJfbmFtZTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICByZXQgKz0gXCIgKFwiOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgInJldCArPSB0aGlzLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIl9uYW1lICE9IG51bGwpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICByZXQgKz0gXCIpXCI7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJyZXQgKz0gdGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpZiAoY2FuX2JlX251bGwpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgImZpcnN0ID0gZmFsc2U7IiA8PCBlbmRsOwotCi0gICAgaWYgKGNvdWxkX2JlX3Vuc2V0KSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIGZpcnN0ID0gZmFsc2U7Ci0gIH0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXQgKz0gXCIpXCI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gcmV0OyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0YXRpYyBtYXAgd2l0aCBtZXRhIGRhdGEgdG8gc3RvcmUgaW5mb3JtYXRpb24gc3VjaCBhcyBmaWVsZElEIHRvCi0gKiBmaWVsZE5hbWUgbWFwcGluZwotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2hheGVfbWV0YV9kYXRhX21hcChvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gU3RhdGljIE1hcCB3aXRoIGZpZWxkSUQgLT4gRmllbGRNZXRhRGF0YSBtYXBwaW5ncwotICBpbmRlbnQob3V0KSA8PCAiaW5saW5lIHN0YXRpYyB2YXIgbWV0YURhdGFNYXAgOiBJbnRNYXAgPSBuZXcgSW50TWFwKCk7IiA8PCBlbmRsOwotCi0gIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgewotICAgIC8vIFBvcHVsYXRlIG1hcAotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKLSAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJtZXRhRGF0YU1hcFsiIDw8IHVwY2FzZV9zdHJpbmcoZmllbGRfbmFtZSkKLSAgICAgICAgICAgICAgICAgIDw8ICJfRklFTERfSURdID0gbmV3IEZpZWxkTWV0YURhdGEoXCIiIDw8IGZpZWxkX25hbWUgPDwgIlwiLCAiOwotCi0gICAgICAvLyBTZXQgZmllbGQgcmVxdWlyZW1lbnQgdHlwZSAocmVxdWlyZWQsIG9wdGlvbmFsLCBldGMuKQotICAgICAgaWYgKGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgICBvdXQgPDwgIlRGaWVsZFJlcXVpcmVtZW50VHlwZS5SRVFVSVJFRCwgIjsKLSAgICAgIH0gZWxzZSBpZiAoZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7Ci0gICAgICAgIG91dCA8PCAiVEZpZWxkUmVxdWlyZW1lbnRUeXBlLk9QVElPTkFMLCAiOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8ICJURmllbGRSZXF1aXJlbWVudFR5cGUuREVGQVVMVCwgIjsKLSAgICAgIH0KLQotICAgICAgLy8gQ3JlYXRlIHZhbHVlIG1ldGEgZGF0YQotICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgZmllbGQtPmdldF90eXBlKCkpOwotICAgICAgb3V0IDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICB9Ci19Ci0KLS8qKgotICogUmV0dXJucyBhIHN0cmluZyB3aXRoIHRoZSBoYXhlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiB0aHJpZnQgdHlwZQotICogKGUuZy4gZm9yIHRoZSB0eXBlIHN0cnVjdCBpdCByZXR1cm5zICJUVHlwZS5TVFJVQ1QiKQotICovCi1zdGQ6OnN0cmluZyB0X2hheGVfZ2VuZXJhdG9yOjpnZXRfaGF4ZV90eXBlX3N0cmluZyh0X3R5cGUqIHR5cGUpIHsKLSAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiAiVFR5cGUuTElTVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLk1BUCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLlNFVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiVFR5cGUuU1RSVUNUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLkkzMiI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgcmV0dXJuIGdldF9oYXhlX3R5cGVfc3RyaW5nKCgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICBzd2l0Y2ggKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgcmV0dXJuICJUVHlwZS5WT0lEIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICJUVHlwZS5TVFJJTkciOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJUVHlwZS5CT09MIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJldHVybiAiVFR5cGUuQllURSI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiVFR5cGUuSTE2IjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICJUVHlwZS5JMzIiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gIlRUeXBlLkk2NCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiVFR5cGUuRE9VQkxFIjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIlVua25vd24gdGhyaWZ0IHR5cGUgXCIiICsgdHlwZS0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiIHBhc3NlZCB0byB0X2hheGVfZ2VuZXJhdG9yOjpnZXRfaGF4ZV90eXBlX3N0cmluZyEiKTsKLSAgICAgIGJyZWFrOyAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4hCi0gICAgfQotICB9IGVsc2UgewotICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigKLSAgICAgICAgIlVua25vd24gdGhyaWZ0IHR5cGUgXCIiICsgdHlwZS0+Z2V0X25hbWUoKQotICAgICAgICArICJcIiBwYXNzZWQgdG8gdF9oYXhlX2dlbmVyYXRvcjo6Z2V0X2hheGVfdHlwZV9zdHJpbmchIik7IC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiEKLSAgfQotfQotCi12b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSkgewotICBvdXQgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudF91cCgpOwotICBpZiAodHlwZS0+aXNfc3RydWN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAibmV3IFN0cnVjdE1ldGFEYXRhKFRUeXBlLlNUUlVDVCwgIiA8PCB0eXBlX25hbWUodHlwZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAibmV3IExpc3RNZXRhRGF0YShUVHlwZS5MSVNULCAiOwotICAgICAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGVsZW1fdHlwZSk7Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBTZXRNZXRhRGF0YShUVHlwZS5TRVQsICI7Ci0gICAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgZWxlbV90eXBlKTsKLSAgICB9IGVsc2UgeyAvLyBtYXAKLSAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgTWFwTWV0YURhdGEoVFR5cGUuTUFQLCAiOwotICAgICAgdF90eXBlKiBrZXlfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICAgIHRfdHlwZSogdmFsX3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCBrZXlfdHlwZSk7Ci0gICAgICBvdXQgPDwgIiwgIjsKLSAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIHZhbF90eXBlKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIm5ldyBGaWVsZFZhbHVlTWV0YURhdGEoIiA8PCBnZXRfaGF4ZV90eXBlX3N0cmluZyh0eXBlKTsKLSAgfQotICBvdXQgPDwgIikiOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnRfZG93bigpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLiBJbiBDKyssIHRoaXMgY29tcHJpc2VzIGFuIGVudGlyZWx5IHNlcGFyYXRlCi0gKiBoZWFkZXIgYW5kIHNvdXJjZSBmaWxlLiBUaGUgaGVhZGVyIGZpbGUgZGVmaW5lcyB0aGUgbWV0aG9kcyBhbmQgaW5jbHVkZXMKLSAqIHRoZSBkYXRhIHR5cGVzIGRlZmluZWQgaW4gdGhlIG1haW4gaGVhZGVyIGZpbGUsIGFuZCB0aGUgaW1wbGVtZW50YXRpb24KLSAqIGZpbGUgY29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBiYXNpYyBwcmludGVyIGFuZCBkZWZhdWx0IGludGVyZmFjZXMuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgLy8gTWFrZSBpbnRlcmZhY2UgZmlsZQotICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBnZXRfY2FwX25hbWUoc2VydmljZV9uYW1lXykgKyAiLmh4IjsKLSAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOwotCi0gIGZfc2VydmljZV8gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgaGF4ZV9wYWNrYWdlKCkgPDwgIjsiIDw8IGVuZGw7Ci0KLSAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8IGhheGVfdHlwZV9pbXBvcnRzKCkgPDwgaGF4ZV90aHJpZnRfaW1wb3J0cygpCi0gICAgICAgICAgICAgPDwgaGF4ZV90aHJpZnRfZ2VuX2ltcG9ydHModHNlcnZpY2UpOwotCi0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgdF90eXBlKiBwYXJlbnQgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKLSAgICBzdHJpbmcgcGFyZW50X25hbWVzcGFjZSA9IHBhcmVudC0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWVzcGFjZSgiaGF4ZSIpOwotICAgIGlmICghcGFyZW50X25hbWVzcGFjZS5lbXB0eSgpICYmIHBhcmVudF9uYW1lc3BhY2UgIT0gcGFja2FnZV9uYW1lXykgewotICAgICAgZl9zZXJ2aWNlXyA8PCAiaW1wb3J0ICIgPDwgdHlwZV9uYW1lKHBhcmVudCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKLQotICBmX3NlcnZpY2VfLmNsb3NlKCk7Ci0KLSAgLy8gTm93IG1ha2UgdGhlIGltcGxlbWVudGF0aW9uL2NsaWVudCBmaWxlCi0gIGZfc2VydmljZV9uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgZ2V0X2NhcF9uYW1lKHNlcnZpY2VfbmFtZV8pICsgIkltcGwuaHgiOwotICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7Ci0KLSAgZl9zZXJ2aWNlXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBoYXhlX3BhY2thZ2UoKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGhheGVfdHlwZV9pbXBvcnRzKCkKLSAgICAgICAgICAgICA8PCBoYXhlX3RocmlmdF9pbXBvcnRzKCkgPDwgaGF4ZV90aHJpZnRfZ2VuX2ltcG9ydHModHNlcnZpY2UpIDw8IGVuZGw7Ci0KLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICB0X3R5cGUqIHBhcmVudCA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOwotICAgIHN0cmluZyBwYXJlbnRfbmFtZXNwYWNlID0gcGFyZW50LT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZXNwYWNlKCJoYXhlIik7Ci0gICAgaWYgKCFwYXJlbnRfbmFtZXNwYWNlLmVtcHR5KCkgJiYgcGFyZW50X25hbWVzcGFjZSAhPSBwYWNrYWdlX25hbWVfKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICJpbXBvcnQgIiA8PCB0eXBlX25hbWUocGFyZW50KSA8PCAiSW1wbDsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKLQotICBmX3NlcnZpY2VfLmNsb3NlKCk7Ci0KLSAgLy8gTm93IG1ha2UgdGhlIGhlbHBlciBjbGFzcyBmaWxlcwotICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOwotCi0gIC8vIE5vdyBtYWtlIHRoZSBwcm9jZXNzb3Ivc2VydmVyIGZpbGUKLSAgZl9zZXJ2aWNlX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBnZXRfY2FwX25hbWUoc2VydmljZV9uYW1lXykgKyAiUHJvY2Vzc29yLmh4IjsKLSAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOwotCi0gIGZfc2VydmljZV8gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgaGF4ZV9wYWNrYWdlKCkgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbCA8PCBoYXhlX3R5cGVfaW1wb3J0cygpCi0gICAgICAgICAgICAgPDwgaGF4ZV90aHJpZnRfaW1wb3J0cygpIDw8IGhheGVfdGhyaWZ0X2dlbl9pbXBvcnRzKHRzZXJ2aWNlKSA8PCBlbmRsOwotCi0gIGlmICghcGFja2FnZV9uYW1lXy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAiaW1wb3J0ICIgPDwgcGFja2FnZV9uYW1lXyA8PCAiLio7IiA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgImltcG9ydCAiIDw8IHBhY2thZ2VfbmFtZV8gPDwgIi4iIDw8IGdldF9jYXBfbmFtZShzZXJ2aWNlX25hbWVfKS5jX3N0cigpCi0gICAgICAgICAgICAgICA8PCAiSW1wbDsiIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotICB9Ci0KLSAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOwotCi0gIGZfc2VydmljZV8uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgdGhlIGNvZGUgc25pcHBldCBmb3IgdGhlIG9uU3VjY2VzcyBjYWxsYmFja3MKLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBzZXJ2aWNlIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIGNvZGUgZm9yLgotICovCi1zdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9tZXRob2Rfb25zdWNjZXNzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhc190eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9taXRfbmFtZSkgewotICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIHJldHVybiAiIjsKLSAgfQotCi0gIHN0cmluZyBuYW1lID0gIiI7Ci0gIGlmICghb21pdF9uYW1lKSB7Ci0gICAgbmFtZSA9ICJvblN1Y2Nlc3MiOwotICAgIGlmIChhc190eXBlKSB7Ci0gICAgICBuYW1lICs9ICIgOiAiOwotICAgIH0KLSAgfQotCi0gIGlmICh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgIGlmIChhc190eXBlKSB7Ci0gICAgICByZXR1cm4gbmFtZSArICJWb2lkLT5Wb2lkID0gbnVsbCI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBuYW1lICsgIigpIDogVm9pZCI7Ci0gICAgfQotICB9Ci0KLSAgaWYgKGFzX3R5cGUpIHsKLSAgICByZXR1cm4gbmFtZSArIHR5cGVfbmFtZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpICsgIi0+Vm9pZCA9IG51bGwiOwotICB9IGVsc2UgewotICAgIHJldHVybiBuYW1lICsgIiggcmV0dmFsIDogIiArIHR5cGVfbmFtZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpICsgIikiOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBtZXRob2QgaGVhZGVyCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgc2VydmljZSBmdW5jdGlvbiB0byBnZW5lcmF0ZSBjb2RlIGZvci4KLSAqLwotdm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX21ldGhvZF9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBib29sIGlzX2ludGVyZmFjZSkgewotICBpZiAoY2FsbGJhY2tzXykgewotICAgIGdlbmVyYXRlX3NlcnZpY2VfbWV0aG9kX3NpZ25hdHVyZV9jYWxsYmFjayh0ZnVuY3Rpb24sIGlzX2ludGVyZmFjZSk7Ci0gIH0gZWxzZSB7Ci0gICAgZ2VuZXJhdGVfc2VydmljZV9tZXRob2Rfc2lnbmF0dXJlX25vcm1hbCh0ZnVuY3Rpb24sIGlzX2ludGVyZmFjZSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIG1ldGhvZCBoZWFkZXIgaW4gIm5vcm1hbCIgc3R5bGUKLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBzZXJ2aWNlIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIGNvZGUgZm9yLgotICovCi12b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfbWV0aG9kX3NpZ25hdHVyZV9ub3JtYWwodF9mdW5jdGlvbiogdGZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfaW50ZXJmYWNlKSB7Ci0gIGlmIChpc19pbnRlcmZhY2UpIHsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlX25vcm1hbCh0ZnVuY3Rpb24pIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmVfbm9ybWFsKHRmdW5jdGlvbikgPDwgIiB7IiA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBtZXRob2QgaGVhZGVyIGluICJjYWxsYmFjayIgc3R5bGUKLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBzZXJ2aWNlIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIGNvZGUgZm9yLgotICovCi12b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfbWV0aG9kX3NpZ25hdHVyZV9jYWxsYmFjayh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2ludGVyZmFjZSkgewotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBzdGQ6OnN0cmluZyBvbl9zdWNjZXNzX2ltcGwgPSBnZW5lcmF0ZV9zZXJ2aWNlX21ldGhvZF9vbnN1Y2Nlc3ModGZ1bmN0aW9uLCBmYWxzZSwgZmFsc2UpOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLy8gZnVuY3Rpb24gb25FcnJvcihEeW5hbWljKSA6IFZvaWQ7IiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLy8gZnVuY3Rpb24gIiA8PCBvbl9zdWNjZXNzX2ltcGwuY19zdHIoKSA8PCAiOyIgPDwgZW5kbDsKLSAgfQotCi0gIGlmIChpc19pbnRlcmZhY2UpIHsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlX2NhbGxiYWNrKHRmdW5jdGlvbikgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9jYWxsYmFjayh0ZnVuY3Rpb24pIDw8ICIgeyIgPDwgZW5kbDsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZXh0ZW5kc19pZmFjZSA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHNfaWZhY2UgPSAiIGV4dGVuZHMgIiArIHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgZ2VuZXJhdGVfaGF4ZV9kb2MoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOwotICAvLyBnZW5lcmF0ZV9ydHRpX2RlY29yYXRpb24oZl9zZXJ2aWNlXyk7IC0gbm90IHlldCwgYmVjYXVzZSBvZgotICAvLyBodHRwczovL2dpdGh1Yi5jb20vSGF4ZUZvdW5kYXRpb24vaGF4ZS9pc3N1ZXMvMzYyNgotICBnZW5lcmF0ZV9tYWNyb19kZWNvcmF0aW9uKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpbnRlcmZhY2UgIiA8PCBnZXRfY2FwX25hbWUoc2VydmljZV9uYW1lXykgPDwgZXh0ZW5kc19pZmFjZSA8PCAiIHsiCi0gICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfaGF4ZV9kb2MoZl9zZXJ2aWNlXywgKmZfaXRlcik7Ci0gICAgZ2VuZXJhdGVfc2VydmljZV9tZXRob2Rfc2lnbmF0dXJlKCpmX2l0ZXIsIHRydWUpOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgc3RydWN0cyBmb3IgYWxsIHRoZSBzZXJ2aWNlIGFyZ3MgYW5kIHJldHVybiB0eXBlcwotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZQotICovCi12b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIGZfc2VydmljZV8gPDwgZW5kbCA8PCBlbmRsOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgZ2VuZXJhdGVfaGF4ZV9zdHJ1Y3QodHMsIGZhbHNlKTsKLSAgICBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IGdldF9jYXBfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSk7Ci0gICAgZXh0ZW5kc19jbGllbnQgPSAiIGV4dGVuZHMgIiArIGV4dGVuZHMgKyAiSW1wbCI7Ci0gIH0KLQotICBnZW5lcmF0ZV9ydHRpX2RlY29yYXRpb24oZl9zZXJ2aWNlXyk7Ci0gIC8vIGJ1aWxkIG1hY3JvIGlzIGluaGVyaXRlZCBmcm9tIGludGVyZmFjZQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImNsYXNzICIgPDwgZ2V0X2NhcF9uYW1lKHNlcnZpY2VfbmFtZV8pIDw8ICJJbXBsIiA8PCBleHRlbmRzX2NsaWVudAotICAgICAgICAgICAgICAgICAgICAgPDwgIiBpbXBsZW1lbnRzICIgPDwgZ2V0X2NhcF9uYW1lKHNlcnZpY2VfbmFtZV8pIDw8ICIgeyIgPDwgZW5kbCA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBmdW5jdGlvbiBuZXcoIGlwcm90IDogVFByb3RvY29sLCBvcHJvdCA6IFRQcm90b2NvbCA9IG51bGwpIiA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlwcm90XyA9IGlwcm90OyIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAob3Byb3QgPT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdF8gPSBpcHJvdDsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdF8gPSBvcHJvdDsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInN1cGVyKGlwcm90LCBvcHJvdCk7IiA8PCBlbmRsOwotICB9Ci0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHJpdmF0ZSB2YXIgaXByb3RfIDogVFByb3RvY29sOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgPDwgInByaXZhdGUgdmFyIG9wcm90XyA6IFRQcm90b2NvbDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgIDw8ICJwcml2YXRlIHZhciBzZXFpZF8gOiBJbnQ7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBmdW5jdGlvbiBnZXRJbnB1dFByb3RvY29sKCkgOiBUUHJvdG9jb2wiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gdGhpcy5pcHJvdF87IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgZnVuY3Rpb24gZ2V0T3V0cHV0UHJvdG9jb2woKSA6IFRQcm90b2NvbCIgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiB0aGlzLm9wcm90XzsiIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLQotICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICBnZW5lcmF0ZV9zZXJ2aWNlX21ldGhvZF9zaWduYXR1cmUoKmZfaXRlciwgZmFsc2UpOwotCi0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICAvLyBHZXQgdGhlIHN0cnVjdCBvZiBmdW5jdGlvbiBjYWxsIHBhcmFtcwotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotCi0gICAgc3RyaW5nIGFyZ3NuYW1lID0gZ2V0X2NhcF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfYXJncyIpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0KLSAgICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QKLSAgICBzdHJpbmcgY2FsbHR5cGUgPSAoKmZfaXRlciktPmlzX29uZXdheSgpID8gIk9ORVdBWSIgOiAiQ0FMTCI7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3RfLndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgZnVubmFtZQotICAgICAgICAgICAgICAgPDwgIlwiLCBUTWVzc2FnZVR5cGUuIiA8PCBjYWxsdHlwZSA8PCAiLCBzZXFpZF8pKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgIDw8ICJ2YXIgYXJncyA6ICIgPDwgYXJnc25hbWUgPDwgIiA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0KLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncy4iIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiCi0gICAgICAgICAgICAgICAgIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3Mud3JpdGUob3Byb3RfKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgIDw8ICJvcHJvdF8ud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOwotCi0gICAgaWYgKCEoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSB8fCAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInZhciByZXR2YWwgOiAiIDw8IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpIDw8ICI7IgotICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgIH0KLQotICAgIGlmICgoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdF8uZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAib3Byb3RfLmdldFRyYW5zcG9ydCgpLmZsdXNoKGZ1bmN0aW9uKGVycm9yOkR5bmFtaWMpIDogVm9pZCB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpZiAoY2FsbGJhY2tzXykgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRyeSB7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIH0KLSAgICAgIHN0cmluZyByZXN1bHRuYW1lID0gZ2V0X2NhcF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmIChlcnJvciAhPSBudWxsKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpZiAoY2FsbGJhY2tzXykgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmIChvbkVycm9yICE9IG51bGwpIG9uRXJyb3IoZXJyb3IpOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ0aHJvdyBlcnJvcjsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ2YXIgbXNnIDogVE1lc3NhZ2UgPSBpcHJvdF8ucmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKG1zZy50eXBlID09IFRNZXNzYWdlVHlwZS5FWENFUFRJT04pIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidmFyIHggPSBUQXBwbGljYXRpb25FeGNlcHRpb24ucmVhZChpcHJvdF8pOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaXByb3RfLnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOwotICAgICAgaWYgKGNhbGxiYWNrc18pIHsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAob25FcnJvciAhPSBudWxsKSBvbkVycm9yKHgpOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ0aHJvdyB4OyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInZhciByZXN1bHQgOiAiIDw8IHJlc3VsdG5hbWUgPDwgIiA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIKLSAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXN1bHQucmVhZChpcHJvdF8pOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaXByb3RfLnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOwotCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAocmVzdWx0LiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soInN1Y2Nlc3MiKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgaWYgKGNhbGxiYWNrc18pIHsKLSAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmIChvblN1Y2Nlc3MgIT0gbnVsbCkgb25TdWNjZXNzKHJlc3VsdC5zdWNjZXNzKTsiIDw8IGVuZGw7Ci0gICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dmFsID0gcmVzdWx0LnN1Y2Nlc3M7IiA8PCBlbmRsOwotICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOwotICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9IG51bGwpIHsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBpZiAoY2FsbGJhY2tzXykgewotICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKG9uRXJyb3IgIT0gbnVsbCkgb25FcnJvcihyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIik7IiA8PCBlbmRsOwotICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRocm93IHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIC8vIElmIHlvdSBnZXQgaGVyZSBpdCdzIGFuIGV4Y2VwdGlvbiwgdW5sZXNzIGEgdm9pZCBmdW5jdGlvbgotICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGlmIChjYWxsYmFja3NfKSB7Ci0gICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAob25TdWNjZXNzICE9IG51bGwpIG9uU3VjY2VzcygpOyIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAoY2FsbGJhY2tzXykgewotICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKG9uRXJyb3IgIT0gbnVsbCkiIDw8IGVuZGw7Ci0gICAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pCi0gICAgICAgICAgICAgIDw8ICJvbkVycm9yKCBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5NSVNTSU5HX1JFU1VMVCwiIDw8IGVuZGw7Ci0gICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIikpOyIgPDwgZW5kbDsKLSAgICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKQotICAgICAgICAgICAgICA8PCAidGhyb3cgbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uTUlTU0lOR19SRVNVTFQsIiA8PCBlbmRsOwotICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0XCIpOyIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoY2FsbGJhY2tzXykgewotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0gY2F0Y2goIGUgOiBURXhjZXB0aW9uKSB7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAob25FcnJvciAhPSBudWxsKSBvbkVycm9yKGUpOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9KTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaWYgKCEoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSB8fCAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiByZXR2YWw7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIC8vIENsb3NlIGZ1bmN0aW9uCi0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gRXh0ZW5kcyBzdHVmZgotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gZ2V0X2NhcF9uYW1lKHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSkpOwotICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gIiBleHRlbmRzICIgKyBleHRlbmRzICsgIlByb2Nlc3NvciI7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KLSAgZ2VuZXJhdGVfcnR0aV9kZWNvcmF0aW9uKGZfc2VydmljZV8pOwotICBnZW5lcmF0ZV9tYWNyb19kZWNvcmF0aW9uKGZfc2VydmljZV8pOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImNsYXNzICIgPDwgZ2V0X2NhcF9uYW1lKHNlcnZpY2VfbmFtZV8pIDw8ICJQcm9jZXNzb3IiIDw8IGV4dGVuZHNfcHJvY2Vzc29yCi0gICAgICAgICAgICAgICAgICAgICA8PCAiIGltcGxlbWVudHMgVFByb2Nlc3NvciB7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInByaXZhdGUgdmFyICIgPDwgZ2V0X2NhcF9uYW1lKHNlcnZpY2VfbmFtZV8pCi0gICAgICAgICAgICAgPDwgIl9pZmFjZV8gOiAiIDw8IGdldF9jYXBfbmFtZShzZXJ2aWNlX25hbWVfKSA8PCAiOyIgPDwgZW5kbDsKLQotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgPDwgInByaXZhdGUgdmFyIFBST0NFU1NfTUFQID0gbmV3IFN0cmluZ01hcDwgSW50LT5UUHJvdG9jb2wtPlRQcm90b2NvbC0+Vm9pZCA+KCk7IgotICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBmdW5jdGlvbiBuZXcoIGlmYWNlIDogIiA8PCBnZXRfY2FwX25hbWUoc2VydmljZV9uYW1lXykgPDwgIikiCi0gICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzdXBlcihpZmFjZSk7IiA8PCBlbmRsOwotICB9Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgZ2V0X2NhcF9uYW1lKHNlcnZpY2VfbmFtZV8pIDw8ICJfaWZhY2VfID0gaWZhY2U7IiA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiUFJPQ0VTU19NQVAuc2V0KFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiLCAiCi0gICAgICAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIigpKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHNlcnZlciBpbXBsZW1lbnRhdGlvbgotICBzdHJpbmcgb3ZlcnJpZGUgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBvdmVycmlkZSA9ICJvdmVycmlkZSAiOwotICB9Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCBvdmVycmlkZQotICAgICAgICAgICAgICAgICAgICAgPDwgInB1YmxpYyBmdW5jdGlvbiBwcm9jZXNzKCBpcHJvdCA6IFRQcm90b2NvbCwgb3Byb3QgOiBUUHJvdG9jb2wpIDogQm9vbCIKLSAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInZhciBtc2cgOiBUTWVzc2FnZSA9IGlwcm90LnJlYWRNZXNzYWdlQmVnaW4oKTsiIDw8IGVuZGw7Ci0KLSAgLy8gVE9ETyhtY3NsZWUpOiB2YWxpZGF0ZSBtZXNzYWdlLCB3YXMgdGhlIHNlcWlkIGV0Yy4gbGVnaXQ/Ci0gIC8vIEFTLSBJZiBhbGwgbWV0aG9kIGlzIG9uZXdheToKLSAgLy8gZG8geW91IGhhdmUgYW4gb3Byb3Q/Ci0gIC8vIGRvIHlvdSB5b3UgbmVlZCBudWxsY2hlY2s/Ci0gIGZfc2VydmljZV8KLSAgICAgIDw8IGluZGVudCgpIDw8ICJ2YXIgZm4gID0gUFJPQ0VTU19NQVAuZ2V0KG1zZy5uYW1lKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgIDw8ICJpZiAoZm4gPT0gbnVsbCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIFRUeXBlLlNUUlVDVCk7IgotICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBpcHJvdC5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgPDwgIiAgdmFyIHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5VTktOT1dOX01FVEhPRCwgXCJJbnZhbGlkICIKLSAgICAgICAgICJtZXRob2QgbmFtZTogJ1wiK21zZy5uYW1lK1wiJ1wiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgIDw8ICIgIG9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShtc2cubmFtZSwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgbXNnLnNlcWlkKSk7IgotICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICB4LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgb3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7IgotICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgPDwgIiAgcmV0dXJuIHRydWU7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICA8PCAiZm4oIG1zZy5zZXFpZCwgaXByb3QsIG9wcm90KTsiIDw8IGVuZGw7Ci0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOwotCi0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgotICovCi12b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3RyaW5nIHJlc3VsdG5hbWUgPSBnZXRfY2FwX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKLSAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCByZXN1bHRuYW1lKTsKLSAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKLSAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOwotICB9Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKLSAgfQotCi0gIGdlbmVyYXRlX2hheGVfc3RydWN0KCZyZXN1bHQsIGZhbHNlLCB0cnVlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBwcm9jZXNzIGZ1bmN0aW9uIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgYSBkaXNwYXRjaGVyIGZvcgotICovCi12b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gICh2b2lkKXRzZXJ2aWNlOwotICAvLyBPcGVuIGNsYXNzCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJpdmF0ZSBmdW5jdGlvbiAiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgICAgICAgPDwgIigpIDogSW50LT5UUHJvdG9jb2wtPlRQcm90b2NvbC0+Vm9pZCB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICAvLyBPcGVuIGZ1bmN0aW9uCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIGZ1bmN0aW9uKCBzZXFpZCA6IEludCwgaXByb3QgOiBUUHJvdG9jb2wsIG9wcm90IDogVFByb3RvY29sKSA6IFZvaWQiCi0gICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICBzdHJpbmcgYXJnc25hbWUgPSBnZXRfY2FwX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIik7Ci0gIHN0cmluZyByZXN1bHRuYW1lID0gZ2V0X2NhcF9uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7Ci0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidmFyIGFyZ3MgOiAiIDw8IGFyZ3NuYW1lIDw8ICIgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImFyZ3MucmVhZChpcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpcHJvdC5yZWFkTWVzc2FnZUVuZCgpOyIKLSAgICAgICAgICAgICA8PCBlbmRsOwotCi0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0KLSAgLy8gRGVjbGFyZSByZXN1bHQgZm9yIG5vbiBvbmV3YXkgZnVuY3Rpb24KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidmFyIHJlc3VsdCA6ICIgPDwgcmVzdWx0bmFtZSA8PCAiID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IgotICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgfQotCi0gIC8vIFRyeSBibG9jayBmb3IgYW55ICBmdW5jdGlvbiB0byBjYXRjaCAoZGVmaW5lZCBvciB1bmRlZmluZWQpIGV4Y2VwdGlvbnMKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJ5IHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGlmIChjYWxsYmFja3NfKSB7Ci0gICAgLy8gY2FsbGJhY2sgZnVuY3Rpb24gc3R5bGUgb25FcnJvci9vblN1Y2Nlc3MKLQotICAgIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCi0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7Ci0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBnZXRfY2FwX25hbWUoc2VydmljZV9uYW1lXykgPDwgIl9pZmFjZV8uIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgfQotCi0gICAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICAgIH0KLSAgICAgIHN0cmluZyBvbl9zdWNjZXNzID0gZ2VuZXJhdGVfc2VydmljZV9tZXRob2Rfb25zdWNjZXNzKHRmdW5jdGlvbiwgZmFsc2UsIHRydWUpOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm51bGwsICAvLyBlcnJvcnMgYXJlIHRocm93biBieSB0aGUgaGFuZGxlciIgPDwgZW5kbDsKLSAgICAgIGlmICh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm51bGwpOyAvLyBubyByZXR2YWwiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImZ1bmN0aW9uIiA8PCBvbl9zdWNjZXNzLmNfc3RyKCkgPDwgIiB7IiA8PCBlbmRsOwotICAgICAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXN1bHQuc3VjY2VzcyA9IHJldHZhbDsiIDw8IGVuZGw7Ci0gICAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgfQotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0pOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgfQotCi0gIH0gZWxzZSB7Ci0gICAgLy8gbm9ybWFsIGZ1bmN0aW9uKCk6cmVzdWx0IHN0eWxlCi0KLSAgICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOwotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICAgIGlmICghKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkgfHwgdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICJyZXN1bHQuc3VjY2VzcyA9ICI7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgZ2V0X2NhcF9uYW1lKHNlcnZpY2VfbmFtZV8pIDw8ICJfaWZhY2VfLiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8ICJhcmdzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iOwotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICAvLyBjYXRjaCBleGNlcHRpb25zIGRlZmluZWQgaW4gdGhlIElETAotICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICIgY2F0Y2ggKCIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6IgotICAgICAgICAgICAgICAgICA8PCBnZXRfY2FwX25hbWUodHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiCi0gICAgICAgICAgICAgICAgICAgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgIn0iOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8vIGFsd2F5cyBjYXRjaCBhbGwgZXhjZXB0aW9ucyB0byBwcmV2ZW50IGZyb20gc2VydmljZSBkZW5pYWwKLSAgZl9zZXJ2aWNlXyA8PCAiIGNhdGNoICh0aCA6IER5bmFtaWMpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRyYWNlKFwiSW50ZXJuYWwgZXJyb3IgcHJvY2Vzc2luZyAiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIsIHRoKTsiCi0gICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInZhciB4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uSU5URVJOQUxfRVJST1IsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiSW50ZXJuYWwgZXJyb3IgcHJvY2Vzc2luZyAiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgIDw8ICJcIiwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgc2VxaWQpKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ4LndyaXRlKG9wcm90KTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgLy8gU2hvcnRjdXQgb3V0IGhlcmUgZm9yIG9uZXdheSBmdW5jdGlvbnMKLSAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0KLSAgICAvLyBDbG9zZSBjbGFzcwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAgIHJldHVybjsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgPDwgIlwiLCBUTWVzc2FnZVR5cGUuUkVQTFksIHNlcWlkKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXN1bHQud3JpdGUob3Byb3QpOyIKLSAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICA8PCAib3Byb3QuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsiIDw8IGVuZGw7Ci0KLSAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIC8vIENsb3NlIGNsYXNzCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZAotICogQHBhcmFtIHByZWZpeCBUaGUgdmFyaWFibGUgbmFtZSBvciBjb250YWluZXIgZm9yIHRoaXMgZmllbGQKLSAqLwotdm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKLSAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotCi0gICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gaXByb3QuIjsKLQotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgICBvdXQgPDwgInJlYWRCaW5hcnkoKTsiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG91dCA8PCAicmVhZFN0cmluZygpOyI7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIG91dCA8PCAicmVhZEJvb2woKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgb3V0IDw8ICJyZWFkQnl0ZSgpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIG91dCA8PCAicmVhZEkxNigpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIG91dCA8PCAicmVhZEkzMigpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIG91dCA8PCAicmVhZEk2NCgpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIG91dCA8PCAicmVhZERvdWJsZSgpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBIYXhlIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgb3V0IDw8ICJyZWFkSTMyKCk7IjsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAotICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHN0cnVjdCwgaW52b2tlcyByZWFkKCkKLSAqLwotdm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCBnZXRfY2FwX25hbWUodHlwZV9uYW1lKHRzdHJ1Y3QpKSA8PCAiKCk7IiA8PCBlbmRsCi0gICAgICA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIi5yZWFkKGlwcm90KTsiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHJlYWRpbmcgaXRzIHNpemUgYW5kIHRoZW4gaXRlcmF0aW5nCi0gKi8KLXZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBzdHJpbmcgb2JqOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBvYmogPSB0bXAoIl9tYXAiKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBvYmogPSB0bXAoIl9zZXQiKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgb2JqID0gdG1wKCJfbGlzdCIpOwotICB9Ci0KLSAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAidmFyICIgPDwgb2JqIDw8ICIgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInZhciAiIDw8IG9iaiA8PCAiID0gaXByb3QucmVhZFNldEJlZ2luKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAidmFyICIgPDwgb2JqIDw8ICIgPSBpcHJvdC5yZWFkTGlzdEJlZ2luKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKQotICAgICAgICAgICAgICAvLyBzaXplIHRoZSBjb2xsZWN0aW9uIGNvcnJlY3RseQotICAgICAgICAgICAgICA8PCAiKCIKLSAgICAgICAgICAgICAgPDwgIik7IiA8PCBlbmRsOwotCi0gIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKLSAgc3RyaW5nIGkgPSB0bXAoIl9pIik7Ci0gIGluZGVudChvdXQpIDw8ICJmb3IoICIgPDwgaSA8PCAiIGluIDAgLi4uICIgPDwgb2JqIDw8ICIuc2l6ZSkiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfdXAob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBwcmVmaXgpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgcHJlZml4KTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIHByZWZpeCk7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgLy8gUmVhZCBjb250YWluZXIgZW5kCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZE1hcEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZFNldEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRMaXN0RW5kKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIHRvIGRlc2VyaWFsaXplIGEgbWFwCi0gKi8KLXZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGtleSA9IHRtcCgiX2tleSIpOwotICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7Ci0gIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKLSAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOwotCi0gIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZrZXkpIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZ2YWwpIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSk7Ci0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwpOwotCi0gIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLnNldCggIiA8PCBrZXkgPDwgIiwgIiA8PCB2YWwgPDwgIik7IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIHNldCBlbGVtZW50Ci0gKi8KLXZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7Ci0gIHRfZmllbGQgZmVsZW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIuYWRkKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgbGlzdCBlbGVtZW50Ci0gKi8KLXZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKLSAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIuYWRkKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQotICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQotICovCi12b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKLSAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotCi0gIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotCi0gICAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90LiI7Ci0KLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgICAgb3V0IDw8ICJ3cml0ZUJpbmFyeSgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBvdXQgPDwgIndyaXRlU3RyaW5nKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIG91dCA8PCAid3JpdGVCeXRlKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBvdXQgPDwgIndyaXRlSTE2KCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICBvdXQgPDwgIndyaXRlSTY0KCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgIndyaXRlRG91YmxlKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gSGF4ZSBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSBGSUVMRCAnJXMlcycgVFlQRSAnJXMnXG4iLAotICAgICAgICAgICBwcmVmaXguY19zdHIoKSwKLSAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCi0gICAgICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKLSAgfQotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCi0gKi8KLXZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgewotICAodm9pZCl0c3RydWN0OwotICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIud3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHdyaXRpbmcgaXRzIHNpemUgdGhlbiB0aGUgZWxlbWVudHMuCi0gKgotICogQHBhcmFtIHR0eXBlICBUaGUgdHlwZSBvZiBjb250YWluZXIKLSAqIEBwYXJhbSBwcmVmaXggU3RyaW5nIHByZWZpeCBmb3IgZmllbGRzCi0gKi8KLXZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIHN0cmluZyBpdGVyID0gdG1wKCJfa2V5Iik7Ci0gICAgc3RyaW5nIGNvdW50ZXIgPSB0bXAoIl9zaXplQ291bnRlciIpOwotICAgIGluZGVudChvdXQpIDw8ICJ2YXIgIiA8PCBjb3VudGVyIDw8ICIgOiBJbnQgPSAwOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiZm9yKCAiIDw8IGl0ZXIgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiKSB7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgICIgPDwgY291bnRlciA8PCArIisrOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZU1hcEJlZ2luKG5ldyBUTWFwKCIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpCi0gICAgICAgICAgICAgICAgPDwgIiwgIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIiA8PCBjb3VudGVyIDw8ICIpKTsiCi0gICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTZXRCZWdpbihuZXcgVFNldCgiIDw8IHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkKLSAgICAgICAgICAgICAgICA8PCAiLCAiIDw8IHByZWZpeCA8PCAiLnNpemUpKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUxpc3RCZWdpbihuZXcgVExpc3QoIgotICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwgcHJlZml4IDw8ICIubGVuZ3RoKSk7IgotICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gIH0KLQotICBzdHJpbmcgaXRlciA9IHRtcCgiZWxlbSIpOwotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImZvciggIiA8PCBpdGVyIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIi5rZXlzKCkpIiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJmb3IoICIgPDwgaXRlciA8PCAiIGluICIgPDwgcHJlZml4IDw8ICIudG9BcnJheSgpKSIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImZvciggIiA8PCBpdGVyIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIikiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV91cChvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBpdGVyLCBwcmVmaXgpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOwotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVNYXBFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlU2V0RW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVMaXN0RW5kKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBtYXAuCi0gKi8KLXZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG1hcCkgewotICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsICIiKTsKLSAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIG1hcCArICIuZ2V0KCIgKyBpdGVyICsgIikiKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCwgIiIpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBzZXQuCi0gKi8KLXZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgaXRlcikgewotICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCi0gKi8KLXZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgaXRlcikgewotICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOwotfQotCi0vKioKLSAqIFJldHVybnMgYSBoYXhlIHR5cGUgbmFtZQotICoKLSAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQotICogQHBhcmFtIGNvbnRhaW5lciBJcyB0aGUgdHlwZSBnb2luZyBpbnNpZGUgYSBjb250YWluZXI/Ci0gKiBAcmV0dXJuIGhheGUgdHlwZSBuYW1lLCBpLmUuIEhhc2hNYXA8S2V5LFZhbHVlPgotICovCi1zdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgaW5fY29udGFpbmVyLCBib29sIGluX2luaXQpIHsKLSAgKHZvaWQpaW5faW5pdDsKLQotICAvLyB0eXBlZGVmcyBhcmUganVzdCByZXNvbHZlZCB0byB0aGVpciByZWFsIHR5cGUKLSAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKLSAgc3RyaW5nIHByZWZpeDsKLQotICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgcmV0dXJuIGJhc2VfdHlwZV9uYW1lKCh0X2Jhc2VfdHlwZSopdHR5cGUsIGluX2NvbnRhaW5lcik7Ci0gIH0KLQotICBpZiAodHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiSW50IjsKLSAgfQotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X3R5cGUqIHRrZXkgPSBnZXRfdHJ1ZV90eXBlKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpOwotICAgIHRfdHlwZSogdHZhbCA9IGdldF90cnVlX3R5cGUoKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSk7Ci0gICAgaWYgKHRrZXktPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdGtleSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgaWYgKCEoKCh0X2Jhc2VfdHlwZSopdGtleSktPmlzX2JpbmFyeSgpKSkgewotICAgICAgICAgIHJldHVybiAiU3RyaW5nTWFwPCAiICsgdHlwZV9uYW1lKHR2YWwpICsgIj4iOwotICAgICAgICB9Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICByZXR1cm4gIkludE1hcDwgIiArIHR5cGVfbmFtZSh0dmFsKSArICI+IjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICByZXR1cm4gIkludDY0TWFwPCAiICsgdHlwZV9uYW1lKHR2YWwpICsgIj4iOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7IC8vIGRlZmF1bHQgdG8gT2JqZWN0TWFwPD4KLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHRrZXktPmlzX2VudW0oKSkgewotICAgICAgcmV0dXJuICJJbnRNYXA8ICIgKyB0eXBlX25hbWUodHZhbCkgKyAiPiI7Ci0gICAgfQotICAgIHJldHVybiAiT2JqZWN0TWFwPCAiICsgdHlwZV9uYW1lKHRrZXkpICsgIiwgIiArIHR5cGVfbmFtZSh0dmFsKSArICI+IjsKLSAgfQotCi0gIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIHRrZXkgPSBnZXRfdHJ1ZV90eXBlKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSk7Ci0gICAgaWYgKHRrZXktPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdGtleSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgaWYgKCEoKCh0X2Jhc2VfdHlwZSopdGtleSktPmlzX2JpbmFyeSgpKSkgewotICAgICAgICAgIHJldHVybiAiU3RyaW5nU2V0IjsKLSAgICAgICAgfQotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgcmV0dXJuICJJbnRTZXQiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIHJldHVybiAiSW50NjRTZXQiOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7IC8vIGRlZmF1bHQgdG8gT2JqZWN0U2V0Ci0gICAgICB9Ci0gICAgfQotICAgIGlmICh0a2V5LT5pc19lbnVtKCkpIHsKLSAgICAgIHJldHVybiAiSW50U2V0IjsKLSAgICB9Ci0gICAgcmV0dXJuICJPYmplY3RTZXQ8ICIgKyB0eXBlX25hbWUodGtleSkgKyAiPiI7Ci0gIH0KLQotICBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHRfdHlwZSogdGVsbSA9ICgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICByZXR1cm4gIkxpc3Q8ICIgKyB0eXBlX25hbWUodGVsbSkgKyAiPiI7Ci0gIH0KLQotICAvLyBDaGVjayBmb3IgbmFtZXNwYWNpbmcKLSAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7Ci0gIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgewotICAgIHN0cmluZyBwYWNrYWdlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiaGF4ZSIpOwotICAgIGlmICghcGFja2FnZS5lbXB0eSgpKSB7Ci0gICAgICByZXR1cm4gcGFja2FnZSArICIuIiArIHR0eXBlLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgfQotCi0gIHJldHVybiB0dHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBoYXhlIHR5cGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgdGhyaWZ0IHR5cGUuCi0gKgotICogQHBhcmFtIHRiYXNlIFRoZSBiYXNlIHR5cGUKLSAqIEBwYXJhbSBjb250YWluZXIgSXMgaXQgZ29pbmcgaW4gYSBoYXhlIGNvbnRhaW5lcj8KLSAqLwotc3RyaW5nIHRfaGF4ZV9nZW5lcmF0b3I6OmJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0eXBlLCBib29sIGluX2NvbnRhaW5lcikgewotICAodm9pZClpbl9jb250YWluZXI7Ci0gIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSB0eXBlLT5nZXRfYmFzZSgpOwotCi0gIHN3aXRjaCAodGJhc2UpIHsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgIHJldHVybiAiVm9pZCI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgewotICAgICAgcmV0dXJuICJoYXhlLmlvLkJ5dGVzIjsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuICJTdHJpbmciOwotICAgIH0KLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgIHJldHVybiAiQm9vbCI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgIHJldHVybiAiaGF4ZS5JbnQzMiI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgIHJldHVybiAiaGF4ZS5JbnQ2NCI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgIHJldHVybiAiRmxvYXQiOwotICBkZWZhdWx0OgotICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gSGF4ZSBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBEZWNsYXJlcyBhIGZpZWxkLCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCi0gKgotICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCi0gKi8KLXN0cmluZyB0X2hheGVfZ2VuZXJhdG9yOjpkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0KSB7Ci0gIC8vIFRPRE8obWNzbGVlKTogZG8gd2UgZXZlciBuZWVkIHRvIGluaXRpYWxpemUgdGhlIGZpZWxkPwotICBzdHJpbmcgcmVzdWx0ID0gInZhciAiICsgdGZpZWxkLT5nZXRfbmFtZSgpICsgIiA6ICIgKyB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgaWYgKGluaXQpIHsKLSAgICB0X3R5cGUqIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotICAgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgdGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7Ci0gICAgICBvZnN0cmVhbSBkdW1teTsKLSAgICAgIHJlc3VsdCArPSAiID0gIiArIHJlbmRlcl9jb25zdF92YWx1ZShkdW1teSwgdGZpZWxkLT5nZXRfbmFtZSgpLCB0dHlwZSwgdGZpZWxkLT5nZXRfdmFsdWUoKSk7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICByZXN1bHQgKz0gIiA9IG51bGwiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgcmVzdWx0ICs9ICIgPSBmYWxzZSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICByZXN1bHQgKz0gIiA9IDAiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICByZXN1bHQgKz0gIiA9IChkb3VibGUpMCI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICByZXN1bHQgKz0gIiA9IDAiOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgKyAiKCkiOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgKyAiKCkiOwotICAgIH0KLSAgfQotICByZXR1cm4gcmVzdWx0ICsgIjsiOwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KLSAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KLSAqLwotc3RyaW5nIHRfaGF4ZV9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZV9jYWxsYmFjayh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgc3RkOjpzdHJpbmcgb25fZXJyb3Jfc3VjY2VzcyA9ICJvbkVycm9yIDogRHluYW1pYy0+Vm9pZCA9IG51bGwsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2VuZXJhdGVfc2VydmljZV9tZXRob2Rfb25zdWNjZXNzKHRmdW5jdGlvbiwgdHJ1ZSwgZmFsc2UpOwotCi0gIHN0ZDo6c3RyaW5nIGFyZ3VtZW50cyA9IGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKTsKLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgaWYgKGFyZ3VtZW50cyAhPSAiIikgewotICAgICAgYXJndW1lbnRzICs9ICIsICI7Ci0gICAgfQotICAgIGFyZ3VtZW50cyArPSBvbl9lcnJvcl9zdWNjZXNzOyAvLyJvbkVycm9yIDogRnVuY3Rpb24sIG9uU3VjY2VzcyA6IEZ1bmN0aW9uIjsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIHJlc3VsdCA9ICJmdW5jdGlvbiAiICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIigiICsgYXJndW1lbnRzICsgIikgOiBWb2lkIjsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCi0gKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCi0gKi8KLXN0cmluZyB0X2hheGVfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmVfbm9ybWFsKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICBzdGQ6OnN0cmluZyBhcmd1bWVudHMgPSBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSk7Ci0KLSAgc3RkOjpzdHJpbmcgcmVzdWx0dHlwZTsKLSAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkgfHwgdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICByZXN1bHR0eXBlID0gIlZvaWQiOwotICB9IGVsc2UgewotICAgIHJlc3VsdHR5cGUgPSB0eXBlX25hbWUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKTsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIHJlc3VsdCA9ICJmdW5jdGlvbiAiICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIigiICsgYXJndW1lbnRzICsgIikgOiAiICsgcmVzdWx0dHlwZTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgY29tbWEgc2VwYXJhdGVkIGZpZWxkIGxpc3QsIHdpdGggdHlwZSBuYW1lcwotICovCi1zdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiLCAiOwotICAgIH0KLSAgICByZXN1bHQgKz0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIiA6ICIgKyB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgQysrIGVudW0gc3RyaW5nIGZvciB0aGUgZ2l2ZW4gdHlwZS4KLSAqLwotc3RyaW5nIHRfaGF4ZV9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gIlRUeXBlLlNUUklORyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJUVHlwZS5CT09MIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIlRUeXBlLkJZVEUiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICJUVHlwZS5JMTYiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICJUVHlwZS5JMzIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJUVHlwZS5JNjQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJUVHlwZS5ET1VCTEUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLkkzMiI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiVFR5cGUuU1RSVUNUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiVFR5cGUuTUFQIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiVFR5cGUuU0VUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLkxJU1QiOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0vKioKLSAqIEhheGUgY2xhc3MgbmFtZXMgbXVzdCBzdGFydCB3aXRoIHVwcGVyY2FzZSBsZXR0ZXIsIGJ1dCBIYXhlIG5hbWVzcGFjZXMgbXVzdCBub3QuCi0gKi8KLXN0ZDo6c3RyaW5nIHRfaGF4ZV9nZW5lcmF0b3I6OmdldF9jYXBfbmFtZShzdGQ6OnN0cmluZyBuYW1lKSB7Ci0gIGlmIChuYW1lLmxlbmd0aCgpID09IDApIHsKLSAgICByZXR1cm4gbmFtZTsKLSAgfQotCi0gIC8vIHRlc3QuZm9yLkdlbmVyaWM8IGRhdGEuVHlwZSwgb3IudGhlLkxpa2U+IGFuZCBoYW5kbGUgaXQgcmVjdXJzaXZlbHkKLSAgc2l6ZV90IGdlbmVyaWNfZmlyc3QgPSBuYW1lLmZpbmQoJzwnKTsKLSAgc2l6ZV90IGdlbmVyaWNfbGFzdCA9IG5hbWUucmZpbmQoJz4nKTsKLSAgaWYgKChnZW5lcmljX2ZpcnN0ICE9IHN0ZDo6c3RyaW5nOjpucG9zKSAmJiAoZ2VuZXJpY19sYXN0ICE9IHN0ZDo6c3RyaW5nOjpucG9zKSkgewotICAgIHN0cmluZyBvdXRlcl90eXBlID0gbmFtZS5zdWJzdHIoMCwgZ2VuZXJpY19maXJzdCk7Ci0gICAgc3RyaW5nIGlubmVyX3R5cGVzID0gbmFtZS5zdWJzdHIoZ2VuZXJpY19maXJzdCArIDEsIGdlbmVyaWNfbGFzdCAtIGdlbmVyaWNfZmlyc3QgLSAxKTsKLQotICAgIHN0cmluZyBuZXdfaW5uZXIgPSAiIjsKLSAgICBzaXplX3QgY29tbWFfc3RhcnQgPSAwOwotICAgIHdoaWxlIChjb21tYV9zdGFydCA8IGlubmVyX3R5cGVzLmxlbmd0aCgpKSB7Ci0gICAgICBzaXplX3QgY29tbWFfcG9zID0gY29tbWFfc3RhcnQ7Ci0gICAgICBpbnQgbmVzdGVkID0gMDsKLQotICAgICAgd2hpbGUgKGNvbW1hX3BvcyA8IGlubmVyX3R5cGVzLmxlbmd0aCgpKSB7Ci0gICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKLSAgICAgICAgc3dpdGNoIChpbm5lcl90eXBlc1tjb21tYV9wb3NdKSB7Ci0gICAgICAgIGNhc2UgJzwnOgotICAgICAgICAgICsrbmVzdGVkOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICc+JzoKLSAgICAgICAgICAtLW5lc3RlZDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnLCc6Ci0gICAgICAgICAgZm91bmQgPSAobmVzdGVkID09IDApOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChmb3VuZCkgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgICsrY29tbWFfcG9zOwotICAgICAgfQotCi0gICAgICBpZiAobmV3X2lubmVyLmxlbmd0aCgpID4gMCkgewotICAgICAgICBuZXdfaW5uZXIgKz0gIiwiOwotICAgICAgfQotCi0gICAgICBzdHJpbmcgaW5uZXIgPSBpbm5lcl90eXBlcy5zdWJzdHIoY29tbWFfc3RhcnQsIGNvbW1hX3BvcyAtIGNvbW1hX3N0YXJ0KTsKLSAgICAgIG5ld19pbm5lciArPSBnZXRfY2FwX25hbWUoaW5uZXIpOwotICAgICAgY29tbWFfc3RhcnQgPSArK2NvbW1hX3BvczsKLSAgICB9Ci0KLSAgICByZXR1cm4gZ2V0X2NhcF9uYW1lKG91dGVyX3R5cGUpICsgIjwiICsgbmV3X2lubmVyICsgIj4iOwotICB9Ci0KLSAgLy8gcGFja2FnZSBuYW1lCi0gIHNpemVfdCBpbmRleCA9IG5hbWUuZmluZF9maXJzdF9ub3Rfb2YoIiBcblxyXHQiKTsKLSAgaWYgKGluZGV4IDwgbmFtZS5sZW5ndGgoKSkgewotICAgIG5hbWVbaW5kZXhdID0gdG9sb3dlcihuYW1lW2luZGV4XSk7Ci0gICAgaW5kZXggPSBuYW1lLmZpbmQoJy4nKTsKLSAgICB3aGlsZSAoaW5kZXggIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKLSAgICAgIGlmICgrK2luZGV4IDwgbmFtZS5sZW5ndGgoKSkgewotICAgICAgICBuYW1lW2luZGV4XSA9IHRvbG93ZXIobmFtZVtpbmRleF0pOwotICAgICAgfQotICAgICAgaW5kZXggPSBuYW1lLmZpbmQoJy4nLCBpbmRleCk7Ci0gICAgfQotICB9Ci0KLSAgLy8gY2xhc3MgbmFtZQotICBpbmRleCA9IG5hbWUucmZpbmQoJy4nKTsKLSAgaWYgKGluZGV4ICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7Ci0gICAgKytpbmRleDsKLSAgfSBlbHNlIHsKLSAgICBpbmRleCA9IG5hbWUuZmluZF9maXJzdF9ub3Rfb2YoIiBcblxyXHQiKTsKLSAgfQotCi0gIGlmIChpbmRleCA8IG5hbWUubGVuZ3RoKCkpIHsKLSAgICBuYW1lW2luZGV4XSA9IHRvdXBwZXIobmFtZVtpbmRleF0pOwotICB9Ci0KLSAgcmV0dXJuIG5hbWU7Ci19Ci0KLXN0cmluZyB0X2hheGVfZ2VuZXJhdG9yOjpjb25zdGFudF9uYW1lKHN0cmluZyBuYW1lKSB7Ci0gIHN0cmluZyBjb25zdGFudF9uYW1lOwotCi0gIGJvb2wgaXNfZmlyc3QgPSB0cnVlOwotICBib29sIHdhc19wcmV2aW91c19jaGFyX3VwcGVyID0gZmFsc2U7Ci0gIGZvciAoc3RyaW5nOjppdGVyYXRvciBpdGVyID0gbmFtZS5iZWdpbigpOyBpdGVyICE9IG5hbWUuZW5kKCk7ICsraXRlcikgewotICAgIHN0cmluZzo6dmFsdWVfdHlwZSBjaGFyYWN0ZXIgPSAoKml0ZXIpOwotCi0gICAgYm9vbCBpc191cHBlciA9IGlzdXBwZXIoY2hhcmFjdGVyKTsKLQotICAgIGlmIChpc191cHBlciAmJiAhaXNfZmlyc3QgJiYgIXdhc19wcmV2aW91c19jaGFyX3VwcGVyKSB7Ci0gICAgICBjb25zdGFudF9uYW1lICs9ICdfJzsKLSAgICB9Ci0gICAgY29uc3RhbnRfbmFtZSArPSB0b3VwcGVyKGNoYXJhY3Rlcik7Ci0KLSAgICBpc19maXJzdCA9IGZhbHNlOwotICAgIHdhc19wcmV2aW91c19jaGFyX3VwcGVyID0gaXNfdXBwZXI7Ci0gIH0KLQotICByZXR1cm4gY29uc3RhbnRfbmFtZTsKLX0KLQotLyoqCi0gKiBFbmFibGVzIFJUVEkgZm9yIGEgY2xhc3Mgb3IgaW50ZXJmYWNlCi0gKi8KLXZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcnR0aV9kZWNvcmF0aW9uKG9mc3RyZWFtJiBvdXQpIHsKLSAgaWYgKHJ0dGlfKSB7Ci0gICAgb3V0IDw8ICJAOnJ0dGkiIDw8IGVuZGw7Ci0gIH0KLX0KLQotLyoqCi0gKiBBZGRzIGJ1aWxkIG1hY3JvcyB0byBhIGNsYXNzIG9yIGludGVyZmFjZQotICovCi12b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX21hY3JvX2RlY29yYXRpb24ob2ZzdHJlYW0mIG91dCkgewotICBpZiAoIWJ1aWxkbWFjcm9fLmVtcHR5KCkpIHsKLSAgICBvdXQgPDwgIiNpZiAhIG1hY3JvIiA8PCBlbmRsOwotICAgIG91dCA8PCAiQDpidWlsZCggIiA8PCBidWlsZG1hY3JvXyA8PCAiKSIgPDwgZW5kbDsgICAgIC8vIGN1cnJlbnQgY2xhc3MvaW50ZXJmYWNlCi0gICAgb3V0IDw8ICJAOmF1dG9CdWlsZCggIiA8PCBidWlsZG1hY3JvXyA8PCAiKSIgPDwgZW5kbDsgLy8gaW5oZXJpdGVkIGNsYXNzZXMvaW50ZXJmYWNlcwotICAgIG91dCA8PCAiI2VuZCIgPDwgZW5kbDsKLSAgfQotfQotCi0vKioKLSAqIEVtaXRzIGEgaGF4ZURvYyBjb21tZW50IGlmIHRoZSBwcm92aWRlZCBvYmplY3QgaGFzIGEgZG9jIGluIFRocmlmdAotICovCi12b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2hheGVfZG9jKG9mc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKSB7Ci0gIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKLSAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsICIvKipcbiIsICIgKiAiLCB0ZG9jLT5nZXRfZG9jKCksICIgKi9cbiIpOwotICB9Ci19Ci0KLS8qKgotICogRW1pdHMgYSBoYXhlRG9jIGNvbW1lbnQgaWYgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIG9iamVjdCBoYXMgYSBkb2MgaW4gVGhyaWZ0Ci0gKi8KLXZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaGF4ZV9kb2Mob2ZzdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIGlmICh0ZnVuY3Rpb24tPmhhc19kb2MoKSkgewotICAgIHN0cmluZ3N0cmVhbSBzczsKLSAgICBzcyA8PCB0ZnVuY3Rpb24tPmdldF9kb2MoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgcF9pdGVyOwotICAgIGZvciAocF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IHBfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrcF9pdGVyKSB7Ci0gICAgICB0X2ZpZWxkKiBwID0gKnBfaXRlcjsKLSAgICAgIHNzIDw8ICJcbkBwYXJhbSAiIDw8IHAtPmdldF9uYW1lKCk7Ci0gICAgICBpZiAocC0+aGFzX2RvYygpKSB7Ci0gICAgICAgIHNzIDw8ICIgIiA8PCBwLT5nZXRfZG9jKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwgIi8qKlxuIiwgIiAqICIsIHNzLnN0cigpLCAiICovXG4iKTsKLSAgfQotfQotCi1zdGQ6OnN0cmluZyB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9jaGVjayh0X2ZpZWxkKiBmaWVsZCkgewotICByZXR1cm4gZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQtPmdldF9uYW1lKCkpOwotfQotCi1zdGQ6OnN0cmluZyB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9jaGVjayhzdGQ6OnN0cmluZyBmaWVsZF9uYW1lKSB7Ci0gIHJldHVybiAiaXMiICsgZ2V0X2NhcF9uYW1lKCJzZXQiKSArIGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKSArICIoKSI7Ci19Ci0KLXZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfc2V0KG9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKSB7Ci0gIGlmICghdHlwZV9jYW5fYmVfbnVsbChmaWVsZC0+Z2V0X3R5cGUoKSkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAidGhpcy5fX2lzc2V0XyIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiA9IHRydWU7IiA8PCBlbmRsOwotICB9Ci19Ci0KLXN0ZDo6c3RyaW5nIHRfaGF4ZV9nZW5lcmF0b3I6OmdldF9lbnVtX2NsYXNzX25hbWUodF90eXBlKiB0eXBlKSB7Ci0gIHN0cmluZyBwYWNrYWdlID0gIiI7Ci0gIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR5cGUtPmdldF9wcm9ncmFtKCk7Ci0gIGlmIChwcm9ncmFtICE9IE5VTEwgLyomJiBwcm9ncmFtICE9IHByb2dyYW1fKi8pIHsKLSAgICBwYWNrYWdlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiaGF4ZSIpICsgIi4iOwotICB9Ci0gIHJldHVybiBwYWNrYWdlICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUigKLSAgICBoYXhlLAotICAgICJIYXhlIiwKLSAgICAiICAgIGNhbGxiYWNrcyAgICAgICAgVXNlIG9uRXJyb3IoKS9vblN1Y2Nlc3MoKSBjYWxsYmFja3MgZm9yIHNlcnZpY2UgbWV0aG9kcyAobGlrZSBBUzMpXG4iCi0gICAgIiAgICBydHRpICAgICAgICAgICAgIEVuYWJsZSBAOnJ0dGkgZm9yIGdlbmVyYXRlZCBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzXG4iCi0gICAgIiAgICBidWlsZG1hY3JvPW15Lm1hY3Jvcy5DbGFzcy5tZXRob2QoYXJncylcbiIKLSAgICAiICAgICAgICAgICAgICAgICAgICAgQWRkIEA6YnVpbGQgbWFjcm8gY2FsbHMgdG8gZ2VuZXJhdGVkIGNsYXNzZXMgYW5kIGludGVyZmFjZXNcbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfaHNfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2hzX2dlbmVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI5NzM5Ny4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfaHNfZ2VuZXJhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTcyMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0KLSNpbmNsdWRlICJ0X29vcF9nZW5lcmF0b3IuaCIKLQotI2luY2x1ZGUgInBsYXRmb3JtLmgiCi0jaW5jbHVkZSAidmVyc2lvbi5oIgotCi11c2luZyBzdGQ6Om1hcDsKLXVzaW5nIHN0ZDo6b2ZzdHJlYW07Ci11c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Ci11c2luZyBzdGQ6OnN0cmluZzsKLXVzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwotdXNpbmcgc3RkOjp2ZWN0b3I7Ci0KLXN0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKLQotLyoqCi0gKiBIYXNrZWxsIGNvZGUgZ2VuZXJhdG9yLgotICoKLSAqLwotY2xhc3MgdF9oc19nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKLXB1YmxpYzoKLSAgdF9oc19nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAotICAgICAgICAgICAgICAgICBjb25zdCBtYXA8c3RyaW5nLCBzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKLSAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBvcHRpb25fc3RyaW5nKQotICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKLSAgICAodm9pZClwYXJzZWRfb3B0aW9uczsKLSAgICAodm9pZClvcHRpb25fc3RyaW5nOwotICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWhzIjsKLSAgfQotCi0gIC8qKgotICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCi0gICAqLwotCi0gIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKLSAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKLQotICAvKioKLSAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLSAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOwotICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0KLSAgc3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKLQotICAvKioKLSAgICogU3RydWN0IGdlbmVyYXRpb24gY29kZQotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX2hzX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOwotCi0gIHZvaWQgZ2VuZXJhdGVfaHNfc3RydWN0X2RlZmluaXRpb24ob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoZWxwZXIgPSBmYWxzZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9oc19zdHJ1Y3RfcmVhZGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLQotICB2b2lkIGdlbmVyYXRlX2hzX3N0cnVjdF93cml0ZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotCi0gIHZvaWQgZ2VuZXJhdGVfaHNfc3RydWN0X2FyYml0cmFyeShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9oc19mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9oc190eXBlbWFwKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLQotICB2b2lkIGdlbmVyYXRlX2hzX2RlZmF1bHQob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotCi0gIC8qKgotICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICAvKioKLSAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob2ZzdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4KTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIG5hbWUgPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIGFyZyA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0KTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUsIHN0cmluZyBhcmcgPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfdHlwZShvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUsIHN0cmluZyBuYW1lID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RyaW5nIGtpdGVyLCBzdHJpbmcgdml0ZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0bWFwLCBzdHJpbmcgaXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBpdGVyKTsKLQotICAvKioKLSAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKLSAgICovCi0KLSAgc3RyaW5nIGhzX2F1dG9nZW5fY29tbWVudCgpOwotICBzdHJpbmcgaHNfbGFuZ3VhZ2VfcHJhZ21hKCk7Ci0gIHN0cmluZyBoc19pbXBvcnRzKCk7Ci0KLSAgc3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBzdHJpbmcgZnVuY3Rpb25fcHJlZml4ID0gIiIpOwotCi0gIHN0cmluZyBmaWVsZF9uYW1lKHN0cmluZyB0bmFtZSwgc3RyaW5nIGZuYW1lKTsKLQotICBzdHJpbmcgZnVuY3Rpb25fdHlwZSh0X2Z1bmN0aW9uKiB0ZnVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvcHRpb25zID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW8gPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBtZXRob2QgPSBmYWxzZSk7Ci0KLSAgc3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKLQotICBzdHJpbmcgdHlwZV90b19kZWZhdWx0KHRfdHlwZSogdHR5cGUpOwotCi0gIHN0cmluZyByZW5kZXJfaHNfdHlwZSh0X3R5cGUqIHR5cGUsIGJvb2wgbmVlZHNfcGFyZW5zKTsKLQotICBzdHJpbmcgdHlwZV90b19jb25zdHJ1Y3Rvcih0X3R5cGUqIHR0eXBlKTsKLQotICBzdHJpbmcgcmVuZGVyX2hzX3R5cGVfZm9yX2Z1bmN0aW9uX25hbWUodF90eXBlKiB0eXBlKTsKLQotcHJpdmF0ZToKLSAgb2ZzdHJlYW0gZl90eXBlc187Ci0gIG9mc3RyZWFtIGZfY29uc3RzXzsKLSAgb2ZzdHJlYW0gZl9zZXJ2aWNlXzsKLSAgb2ZzdHJlYW0gZl9pZmFjZV87Ci0gIG9mc3RyZWFtIGZfY2xpZW50XzsKLX07Ci0KLS8qKgotICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKLSAqIHN0cmVhbXMuCi0gKgotICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgewotICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKLSAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKLQotICAvLyBNYWtlIG91dHB1dCBmaWxlCi0gIHN0cmluZyBwbmFtZSA9IGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXyk7Ci0gIHN0cmluZyBmX3R5cGVzX25hbWUgPSBnZXRfb3V0X2RpcigpICsgcG5hbWUgKyAiX1R5cGVzLmhzIjsKLSAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7Ci0KLSAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBnZXRfb3V0X2RpcigpICsgcG5hbWUgKyAiX0NvbnN0cy5ocyI7Ci0gIGZfY29uc3RzXy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7Ci0KLSAgLy8gUHJpbnQgaGVhZGVyCi0gIGZfdHlwZXNfIDw8IGhzX2xhbmd1YWdlX3ByYWdtYSgpIDw8IGVuZGw7Ci0gIGZfdHlwZXNfIDw8IGhzX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7Ci0gIGZfdHlwZXNfIDw8ICJtb2R1bGUgIiA8PCBwbmFtZSA8PCAiX1R5cGVzIHdoZXJlIiA8PCBlbmRsOwotICBmX3R5cGVzXyA8PCBoc19pbXBvcnRzKCkgPDwgZW5kbDsKLQotICBmX2NvbnN0c18gPDwgaHNfbGFuZ3VhZ2VfcHJhZ21hKCkgPDwgZW5kbDsKLSAgZl9jb25zdHNfIDw8IGhzX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7Ci0gIGZfY29uc3RzXyA8PCAibW9kdWxlICIgPDwgcG5hbWUgPDwgIl9Db25zdHMgd2hlcmUiIDw8IGVuZGw7Ci0gIGZfY29uc3RzXyA8PCBoc19pbXBvcnRzKCkgPDwgZW5kbDsKLSAgZl9jb25zdHNfIDw8ICJpbXBvcnQgIiA8PCBwbmFtZSA8PCAiX1R5cGVzIiA8PCBlbmRsOwotfQotCi1zdHJpbmcgdF9oc19nZW5lcmF0b3I6OmhzX2xhbmd1YWdlX3ByYWdtYSgpIHsKLSAgcmV0dXJuIHN0cmluZygKLSAgICAgICJ7LSMgTEFOR1VBR0UgRGVyaXZlRGF0YVR5cGVhYmxlICMtfVxuIgotICAgICAgInstIyBMQU5HVUFHRSBEZXJpdmVHZW5lcmljICMtfVxuIgotICAgICAgInstIyBMQU5HVUFHRSBPdmVybG9hZGVkU3RyaW5ncyAjLX1cbiIKLSAgICAgICJ7LSMgT1BUSU9OU19HSEMgLWZuby13YXJuLW1pc3NpbmctZmllbGRzICMtfVxuIgotICAgICAgInstIyBPUFRJT05TX0dIQyAtZm5vLXdhcm4tbWlzc2luZy1zaWduYXR1cmVzICMtfVxuIgotICAgICAgInstIyBPUFRJT05TX0dIQyAtZm5vLXdhcm4tbmFtZS1zaGFkb3dpbmcgIy19XG4iCi0gICAgICAiey0jIE9QVElPTlNfR0hDIC1mbm8td2Fybi11bnVzZWQtaW1wb3J0cyAjLX1cbiIKLSAgICAgICJ7LSMgT1BUSU9OU19HSEMgLWZuby13YXJuLXVudXNlZC1tYXRjaGVzICMtfVxuIik7Ci19Ci0KLS8qKgotICogQXV0b2dlbidkIGNvbW1lbnQKLSAqLwotc3RyaW5nIHRfaHNfZ2VuZXJhdG9yOjpoc19hdXRvZ2VuX2NvbW1lbnQoKSB7Ci0gIHJldHVybiBzdHJpbmcoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKQotICAgICAgICAgKyAiLS0gQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKCIgKyBUSFJJRlRfVkVSU0lPTiArICIpICAgICAgICAgICAgICAgICAgICAgIC0tXG4iCi0gICAgICAgICArICItLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLVxuIgotICAgICAgICAgKyAiLS0gRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkcgLS1cbiIKLSAgICAgICAgICsgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iOwotfQotCi0vKioKLSAqIFByaW50cyBzdGFuZGFyZCB0aHJpZnQgaW1wb3J0cwotICovCi1zdHJpbmcgdF9oc19nZW5lcmF0b3I6OmhzX2ltcG9ydHMoKSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7Ci0gIHN0cmluZyByZXN1bHQgPSBzdHJpbmcoCi0gICAgICAiaW1wb3J0IFByZWx1ZGUgKCgkKSwgKC4pLCAoPj49KSwgKD09KSwgKCsrKSlcbiIKLSAgICAgICJpbXBvcnQgcXVhbGlmaWVkIFByZWx1ZGUgYXMgUFxuIgotICAgICAgImltcG9ydCBxdWFsaWZpZWQgQ29udHJvbC5FeGNlcHRpb24gYXMgWFxuIgotICAgICAgImltcG9ydCBxdWFsaWZpZWQgQ29udHJvbC5Nb25hZCBhcyBNICggbGlmdE0sIGFwLCB3aGVuIClcbiIKLSAgICAgICJpbXBvcnQgRGF0YS5GdW5jdG9yICggKDwkPikgKVxuIgotICAgICAgImltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkxhenkgYXMgTEJTXG4iCi0gICAgICAiaW1wb3J0IHF1YWxpZmllZCBEYXRhLkhhc2hhYmxlIGFzIEhcbiIKLSAgICAgICJpbXBvcnQgcXVhbGlmaWVkIERhdGEuSW50IGFzIElcbiIKLSAgICAgICJpbXBvcnQgcXVhbGlmaWVkIERhdGEuTWF5YmUgYXMgTSAoY2F0TWF5YmVzKVxuIgotICAgICAgImltcG9ydCBxdWFsaWZpZWQgRGF0YS5UZXh0LkxhenkuRW5jb2RpbmcgYXMgRSAoIGRlY29kZVV0ZjgsIGVuY29kZVV0ZjggKVxuIgotICAgICAgImltcG9ydCBxdWFsaWZpZWQgRGF0YS5UZXh0LkxhenkgYXMgTFRcbiIKLSAgICAgICJpbXBvcnQgcXVhbGlmaWVkIEdIQy5HZW5lcmljcyBhcyBHIChHZW5lcmljKVxuIgotICAgICAgImltcG9ydCBxdWFsaWZpZWQgRGF0YS5UeXBlYWJsZSBhcyBUWSAoIFR5cGVhYmxlIClcbiIKLSAgICAgICJpbXBvcnQgcXVhbGlmaWVkIERhdGEuSGFzaE1hcC5TdHJpY3QgYXMgTWFwXG4iCi0gICAgICAiaW1wb3J0IHF1YWxpZmllZCBEYXRhLkhhc2hTZXQgYXMgU2V0XG4iCi0gICAgICAiaW1wb3J0IHF1YWxpZmllZCBEYXRhLlZlY3RvciBhcyBWZWN0b3JcbiIKLSAgICAgICJpbXBvcnQgcXVhbGlmaWVkIFRlc3QuUXVpY2tDaGVjay5BcmJpdHJhcnkgYXMgUUMgKCBBcmJpdHJhcnkoLi4pIClcbiIKLSAgICAgICJpbXBvcnQgcXVhbGlmaWVkIFRlc3QuUXVpY2tDaGVjayBhcyBRQyAoIGVsZW1lbnRzIClcbiIKLSAgICAgICJcbiIKLSAgICAgICJpbXBvcnQgcXVhbGlmaWVkIFRocmlmdCBhcyBUXG4iCi0gICAgICAiaW1wb3J0IHF1YWxpZmllZCBUaHJpZnQuVHlwZXMgYXMgVFxuIgotICAgICAgImltcG9ydCBxdWFsaWZpZWQgVGhyaWZ0LkFyYml0cmFyaWVzIGFzIFRcbiIKLSAgICAgICJcbiIpOwotCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5jbHVkZXMuc2l6ZSgpOyArK2kpCi0gICAgcmVzdWx0ICs9ICJpbXBvcnQgcXVhbGlmaWVkICIgKyBjYXBpdGFsaXplKGluY2x1ZGVzW2ldLT5nZXRfbmFtZSgpKSArICJfVHlwZXNcbiI7Ci0KLSAgaWYgKGluY2x1ZGVzLnNpemUoKSA+IDApCi0gICAgcmVzdWx0ICs9ICJcbiI7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBDbG9zZXMgdGhlIHR5cGUgZmlsZXMKLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgewotICAvLyBDbG9zZSB0eXBlcyBmaWxlCi0gIGZfdHlwZXNfLmNsb3NlKCk7Ci0gIGZfY29uc3RzXy5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIEV6LgotICoKLSAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgewotICBzdHJpbmcgdG5hbWUgPSBjYXBpdGFsaXplKHR0eXBlZGVmLT5nZXRfc3ltYm9saWMoKSk7Ci0gIHN0cmluZyB0ZGVmID0gcmVuZGVyX2hzX3R5cGUodHR5cGVkZWYtPmdldF90eXBlKCksIGZhbHNlKTsKLSAgaW5kZW50KGZfdHlwZXNfKSA8PCAidHlwZSAiIDw8IHRuYW1lIDw8ICIgPSAiIDw8IHRkZWYgPDwgZW5kbDsKLSAgZl90eXBlc18gPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgY29kZSBmb3IgYW4gZW51bWVyYXRlZCB0eXBlLgotICogdGhlIHZhbHVlcy4KLSAqCi0gKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgewotICBpbmRlbnQoZl90eXBlc18pIDw8ICJkYXRhICIgPDwgY2FwaXRhbGl6ZSh0ZW51bS0+Z2V0X25hbWUoKSkgPDwgIiA9ICI7Ci0gIGluZGVudF91cCgpOwotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7Ci0KLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgc3RyaW5nIG5hbWUgPSBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgZl90eXBlc18gPDwgKGZpcnN0ID8gIiIgOiAifCIpOwotICAgIGZfdHlwZXNfIDw8IG5hbWU7Ci0gICAgZmlyc3QgPSBmYWxzZTsKLSAgfQotICBpbmRlbnQoZl90eXBlc18pIDw8ICJkZXJpdmluZyAoUC5TaG93LCBQLkVxLCBHLkdlbmVyaWMsIFRZLlR5cGVhYmxlLCBQLk9yZCwgUC5Cb3VuZGVkKSIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLQotICBzdHJpbmcgZW5hbWUgPSBjYXBpdGFsaXplKHRlbnVtLT5nZXRfbmFtZSgpKTsKLQotICBpbmRlbnQoZl90eXBlc18pIDw8ICJpbnN0YW5jZSBQLkVudW0gIiA8PCBlbmFtZSA8PCAiIHdoZXJlIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KGZfdHlwZXNfKSA8PCAiZnJvbUVudW0gdCA9IGNhc2UgdCBvZiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICBzdHJpbmcgbmFtZSA9IGNhcGl0YWxpemUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICBpbmRlbnQoZl90eXBlc18pIDw8IG5hbWUgPDwgIiAtPiAiIDw8IHZhbHVlIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfdHlwZXNfKSA8PCAidG9FbnVtIHQgPSBjYXNlIHQgb2YiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgc3RyaW5nIG5hbWUgPSBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgaW5kZW50KGZfdHlwZXNfKSA8PCB2YWx1ZSA8PCAiIC0+ICIgPDwgbmFtZSA8PCBlbmRsOwotICB9Ci0gIGluZGVudChmX3R5cGVzXykgPDwgIl8gLT4gWC50aHJvdyBULlRocmlmdEV4Y2VwdGlvbiIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50X2Rvd24oKTsKLQotICBpbmRlbnQoZl90eXBlc18pIDw8ICJpbnN0YW5jZSBILkhhc2hhYmxlICIgPDwgZW5hbWUgPDwgIiB3aGVyZSIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChmX3R5cGVzXykgPDwgImhhc2hXaXRoU2FsdCBzYWx0ID0gSC5oYXNoV2l0aFNhbHQgc2FsdCBQLi4gUC5mcm9tRW51bSIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLQotICBpbmRlbnQoZl90eXBlc18pIDw8ICJpbnN0YW5jZSBRQy5BcmJpdHJhcnkgIiA8PCBlbmFtZSA8PCAiIHdoZXJlIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KGZfdHlwZXNfKSA8PCAiYXJiaXRyYXJ5ID0gUUMuZWxlbWVudHMgKFAuZW51bUZyb21UbyBQLm1pbkJvdW5kIFAubWF4Qm91bmQpIiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlIGEgY29uc3RhbnQgdmFsdWUKLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7Ci0gIHRfdHlwZSogdHlwZSA9IHRjb25zdC0+Z2V0X3R5cGUoKTsKLSAgc3RyaW5nIG5hbWUgPSBkZWNhcGl0YWxpemUodGNvbnN0LT5nZXRfbmFtZSgpKTsKLQotICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IHRjb25zdC0+Z2V0X3ZhbHVlKCk7Ci0KLSAgaW5kZW50KGZfY29uc3RzXykgPDwgbmFtZSA8PCAiIDo6ICIgPDwgcmVuZGVyX2hzX3R5cGUodHlwZSwgZmFsc2UpIDw8IGVuZGw7Ci0gIGluZGVudChmX2NvbnN0c18pIDw8IG5hbWUgPDwgIiA9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlKSA8PCBlbmRsOwotICBmX2NvbnN0c18gPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKLSAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCi0gKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYwotICovCi1zdHJpbmcgdF9oc19nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7Ci0gIGlmICh2YWx1ZSA9PSBOVUxMKQotICAgIHJldHVybiB0eXBlX3RvX2RlZmF1bHQodHlwZSk7Ci0KLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0gIG9zdHJpbmdzdHJlYW0gb3V0OwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0KLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIG91dCA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIG91dCA8PCAodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwID8gIlAuVHJ1ZSIgOiAiUC5GYWxzZSIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICB0X2VudW0qIHRlbnVtID0gKHRfZW51bSopdHlwZTsKLSAgICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgICBmb3IgKHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7Ci0gICAgICAgICArK2NfaXRlcikgewotICAgICAgaW50IHZhbCA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgICBpZiAodmFsID09IHZhbHVlLT5nZXRfaW50ZWdlcigpKSB7Ci0gICAgICAgIHRfcHJvZ3JhbSogcHJvZyA9IHR5cGUtPmdldF9wcm9ncmFtKCk7Ci0gICAgICAgIGlmIChwcm9nICE9IE5VTEwgJiYgcHJvZyAhPSBwcm9ncmFtXykKLSAgICAgICAgICBvdXQgPDwgY2FwaXRhbGl6ZShwcm9nLT5nZXRfbmFtZSgpKSA8PCAiX1R5cGVzLiI7Ci0gICAgICAgIG91dCA8PCBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBzdHJpbmcgY25hbWUgPSB0eXBlX25hbWUodHlwZSk7Ci0gICAgb3V0IDw8ICJkZWZhdWx0XyIgPDwgY25hbWUgPDwgInsiOwotCi0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0KLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXIgPSB2YWwuYmVnaW4oKTsKLSAgICAgICAgIHZfaXRlciAhPSB2YWwuZW5kKCk7Ci0gICAgICAgICArK3ZfaXRlcikgewotICAgICAgdF9maWVsZCogZmllbGQgPSBOVUxMOwotCi0gICAgICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOwotICAgICAgICAgICArK2ZfaXRlcikKLSAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpCi0gICAgICAgICAgZmllbGQgPSAoKmZfaXRlcik7Ci0KLSAgICAgIGlmIChmaWVsZCA9PSBOVUxMKQotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIGNuYW1lICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLQotICAgICAgc3RyaW5nIGZuYW1lID0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOwotICAgICAgc3RyaW5nIGNvbnN0X3ZhbHVlID0gcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkLT5nZXRfdHlwZSgpLCB2X2l0ZXItPnNlY29uZCk7Ci0KLSAgICAgIG91dCA8PCAoZmlyc3QgPyAiIiA6ICIsICIpOwotICAgICAgb3V0IDw8IGZpZWxkX25hbWUoY25hbWUsIGZuYW1lKSA8PCAiID0gIjsKLSAgICAgIGlmIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwgfHwgKCh0X3R5cGUqKWZpZWxkLT5nZXRfdHlwZSgpKS0+aXNfeGNlcHRpb24oKSkgewotICAgICAgICBvdXQgPDwgIlAuSnVzdCAiOwotICAgICAgfQotICAgICAgb3V0IDw8IGNvbnN0X3ZhbHVlOwotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBvdXQgPDwgIn0iOwotCi0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0KLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotCi0gICAgb3V0IDw8ICIoTWFwLmZyb21MaXN0IFsiOwotCi0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHN0cmluZyBrZXkgPSByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIHZfaXRlci0+Zmlyc3QpOwotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgb3V0IDw8IChmaXJzdCA/ICIiIDogIiwiKTsKLSAgICAgIG91dCA8PCAiKCIgPDwga2V5IDw8ICIsIiA8PCB2YWwgPDwgIikiOwotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9Ci0gICAgb3V0IDw8ICJdKSI7Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlID0gdHlwZS0+aXNfbGlzdCgpID8gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLQotICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLQotICAgIGlmICh0eXBlLT5pc19zZXQoKSkKLSAgICAgIG91dCA8PCAiKFNldC5mcm9tTGlzdCBbIjsKLSAgICBlbHNlCi0gICAgICBvdXQgPDwgIihWZWN0b3IuZnJvbUxpc3QgWyI7Ci0KLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgb3V0IDw8IChmaXJzdCA/ICIiIDogIiwiKTsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpOwotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBvdXQgPDwgIl0pIjsKLQotICB9IGVsc2UgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgQ09OU1RBTlQgRk9SIFRZUEU6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSAic3RydWN0IgotICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgZ2VuZXJhdGVfaHNfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZXhjZXB0aW9uLiBCYXNpY2FsbHkgdGhlIHNhbWUKLSAqIGFzIGEgc3RydWN0LCBidXQgYWxzbyBoYXMgYW4gZXhjZXB0aW9uIGRlY2xhcmF0aW9uLgotICoKLSAqIEBwYXJhbSB0eGNlcHRpb24gVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfaHNfc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgSGFza2VsbCBzdHJ1Y3QKLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaHNfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9oc19zdHJ1Y3RfZGVmaW5pdGlvbihmX3R5cGVzXywgdHN0cnVjdCwgaXNfZXhjZXB0aW9uLCBmYWxzZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaHNfc3RydWN0X2RlZmluaXRpb24ob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhlbHBlcikgewotICAodm9pZCloZWxwZXI7Ci0gIHN0cmluZyB0bmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLQotICBpbmRlbnQob3V0KSA8PCAiZGF0YSAiIDw8IHRuYW1lIDw8ICIgPSAiIDw8IHRuYW1lOwotICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOwotICAgICAgICAgKyttX2l0ZXIpIHsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAieyAiOwotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIiwgIjsKLSAgICAgIH0KLSAgICAgIHN0cmluZyBtbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgIG91dCA8PCBmaWVsZF9uYW1lKHRuYW1lLCBtbmFtZSkgPDwgIiA6OiAiOwotICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwKLSAgICAgICAgICB8fCAoKHRfdHlwZSopKCptX2l0ZXIpLT5nZXRfdHlwZSgpKS0+aXNfeGNlcHRpb24oKSkgewotICAgICAgICBvdXQgPDwgIlAuTWF5YmUgIjsKLSAgICAgIH0KLSAgICAgIG91dCA8PCByZW5kZXJfaHNfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCksIHRydWUpIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudChvdXQpIDw8ICJ9IjsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0KLSAgb3V0IDw8ICIgZGVyaXZpbmcgKFAuU2hvdyxQLkVxLEcuR2VuZXJpYyxUWS5UeXBlYWJsZSkiIDw8IGVuZGw7Ci0KLSAgaWYgKGlzX2V4Y2VwdGlvbikKLSAgICBvdXQgPDwgImluc3RhbmNlIFguRXhjZXB0aW9uICIgPDwgdG5hbWUgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAiaW5zdGFuY2UgSC5IYXNoYWJsZSAiIDw8IHRuYW1lIDw8ICIgd2hlcmUiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAiaGFzaFdpdGhTYWx0IHNhbHQgcmVjb3JkID0gc2FsdCI7Ci0gIGZvciAodmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsKLSAgICAgICArK21faXRlcikgewotICAgIHN0cmluZyBtbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiIGBILmhhc2hXaXRoU2FsdGAgIiA8PCBmaWVsZF9uYW1lKHRuYW1lLCBtbmFtZSkgPDwgIiByZWNvcmQiOwotICB9Ci0gIGluZGVudChvdXQpIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgZ2VuZXJhdGVfaHNfc3RydWN0X2FyYml0cmFyeShvdXQsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9oc19zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX2hzX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfaHNfdHlwZW1hcChvdXQsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9oc19kZWZhdWx0KG91dCwgdHN0cnVjdCk7Ci19Ci0KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2hzX3N0cnVjdF9hcmJpdHJhcnkob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RyaW5nIHRuYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOwotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgaW5kZW50KG91dCkgPDwgImluc3RhbmNlIFFDLkFyYml0cmFyeSAiIDw8IHRuYW1lIDw8ICIgd2hlcmUgIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgewotICAgIGluZGVudChvdXQpIDw8ICJhcmJpdHJhcnkgPSBNLmxpZnRNICIgPDwgdG5hbWU7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOwotICAgICAgICAgKyttX2l0ZXIpIHsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICBvdXQgPDwgIiAiOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgImBNLmFwYCI7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgIigiOwotICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwKLSAgICAgICAgICB8fCAoKHRfdHlwZSopKCptX2l0ZXIpLT5nZXRfdHlwZSgpKS0+aXNfeGNlcHRpb24oKSkgewotICAgICAgICBvdXQgPDwgIk0ubGlmdE0gUC5KdXN0ICI7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgIlFDLmFyYml0cmFyeSkiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICAvLyBTaHJpbmsKLSAgICBpbmRlbnQob3V0KSA8PCAic2hyaW5rIG9iaiB8IG9iaiA9PSBkZWZhdWx0XyIgPDwgdG5hbWUgPDwgIiA9IFtdIiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgICAgICAgICAgIHwgUC5vdGhlcndpc2UgPSBNLmNhdE1heWJlcyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmaXJzdCA9IHRydWU7Ci0gICAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOwotICAgICAgICAgKyttX2l0ZXIpIHsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAiWyAiOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIiwgIjsKLSAgICAgIH0KLSAgICAgIHN0cmluZyBmbmFtZSA9IGZpZWxkX25hbWUodG5hbWUsICgqbV9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgICBvdXQgPDwgImlmIG9iaiA9PSBkZWZhdWx0XyIgPDwgdG5hbWU7Ci0gICAgICBvdXQgPDwgInsiIDw8IGZuYW1lIDw8ICIgPSAiIDw8IGZuYW1lIDw8ICIgb2JqfSAiOwotICAgICAgb3V0IDw8ICJ0aGVuIFAuTm90aGluZyAiOwotICAgICAgb3V0IDw8ICJlbHNlIFAuSnVzdCAkIGRlZmF1bHRfIiA8PCB0bmFtZTsKLSAgICAgIG91dCA8PCAieyIgPDwgZm5hbWUgPDwgIiA9ICIgPDwgZm5hbWUgPDwgIiBvYmp9IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnQob3V0KSA8PCAiXSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICB9IGVsc2UgeyAvKiAwID09IG1lbWJlcnMuc2l6ZSgpICovCi0gICAgaW5kZW50KG91dCkgPDwgImFyYml0cmFyeSA9IFFDLmVsZW1lbnRzIFsiIDw8IHRuYW1lIDw8ICJdIiA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSByZWFkIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaHNfc3RydWN0X3JlYWRlcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgc3RyaW5nIHNuYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOwotICBzdHJpbmcgaWQgPSB0bXAoIl9pZCIpOwotICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7Ci0KLSAgaW5kZW50KG91dCkgPDwgInRvXyIgPDwgc25hbWUgPDwgIiA6OiBULlRocmlmdFZhbCAtPiAiIDw8IHNuYW1lIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ0b18iIDw8IHNuYW1lIDw8ICIgKFQuVFN0cnVjdCBmaWVsZHMpID0gIiA8PCBzbmFtZSA8PCAieyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0KLSAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCi0gIGZvciAodmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaW50MzJfdCBrZXkgPSAoKmZfaXRlciktPmdldF9rZXkoKTsKLSAgICBzdHJpbmcgZXR5cGUgPSB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBzdHJpbmcgZm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0KLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICAvLyBGaWxsIGluIEZpZWxkCi0gICAgaW5kZW50KG91dCkgPDwgZmllbGRfbmFtZShzbmFtZSwgZm5hbWUpIDw8ICIgPSAiOwotCi0gICAgb3V0IDw8ICJQLm1heWJlICgiOwotICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICBvdXQgPDwgIlAuZXJyb3IgXCJNaXNzaW5nIHJlcXVpcmVkIGZpZWxkOiAiIDw8IGZuYW1lIDw8ICJcIiI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmICgoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTAotICAgICAgICAgICB8fCAoKHRfdHlwZSopKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKS0+aXNfeGNlcHRpb24oKSkgJiYgKCpmX2l0ZXIpLT5nZXRfdmFsdWUoKSA9PSBOVUxMKSB7Ci0gICAgICAgIG91dCA8PCAiUC5Ob3RoaW5nIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCBmaWVsZF9uYW1lKHNuYW1lLCBmbmFtZSkgPDwgIiBkZWZhdWx0XyIgPDwgc25hbWU7Ci0gICAgICB9Ci0gICAgfQotICAgIG91dCA8PCAiKSAiOwotCi0gICAgb3V0IDw8ICIoXFwoXywiIDw8IHZhbCA8PCAiKSAtPiAiOwotICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMCi0gICAgICAgIHx8ICgodF90eXBlKikoKmZfaXRlciktPmdldF90eXBlKCkpLT5pc194Y2VwdGlvbigpKQotICAgICAgb3V0IDw8ICJQLkp1c3QgIjsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsIHZhbCk7Ci0gICAgb3V0IDw8ICIpIjsKLSAgICBvdXQgPDwgIiAoTWFwLmxvb2t1cCAoIiA8PCBrZXkgPDwgIikgZmllbGRzKSI7Ci0gIH0KLQotICBvdXQgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgLy8gcmVhZAotICBzdHJpbmcgdG1hcCA9IHR5cGVfbmFtZSh0c3RydWN0LCAidHlwZW1hcF8iKTsKLSAgaW5kZW50KG91dCkgPDwgInRvXyIgPDwgc25hbWUgPDwgIiBfID0gUC5lcnJvciBcIm5vdCBhIHN0cnVjdFwiIiA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJyZWFkXyIgPDwgc25hbWUgPDwgIiA6OiAoVC5UcmFuc3BvcnQgdCwgVC5Qcm90b2NvbCBwKSA9PiBwIHQgLT4gUC5JTyAiIDw8IHNuYW1lCi0gICAgICAgICAgICAgIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJyZWFkXyIgPDwgc25hbWUgPDwgIiBpcHJvdCA9IHRvXyIgPDwgc25hbWU7Ci0gIG91dCA8PCAiIDwkPiBULnJlYWRWYWwgaXByb3QgKFQuVF9TVFJVQ1QgIiA8PCB0bWFwIDw8ICIpIiA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJkZWNvZGVfIiA8PCBzbmFtZQotICAgICAgICAgICAgICA8PCAiIDo6IChULlByb3RvY29sIHAsIFQuVHJhbnNwb3J0IHQpID0+IHAgdCAtPiBMQlMuQnl0ZVN0cmluZyAtPiAiIDw8IHNuYW1lIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJkZWNvZGVfIiA8PCBzbmFtZSA8PCAiIGlwcm90IGJzID0gdG9fIiA8PCBzbmFtZSA8PCAiICQgIjsKLSAgb3V0IDw8ICJULmRlc2VyaWFsaXplVmFsIGlwcm90IChULlRfU1RSVUNUICIgPDwgdG1hcCA8PCAiKSBicyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaHNfc3RydWN0X3dyaXRlcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgc3RyaW5nIHN0ciA9IHRtcCgiX3N0ciIpOwotICBzdHJpbmcgZiA9IHRtcCgiX2YiKTsKLSAgc3RyaW5nIHYgPSB0bXAoIl92Iik7Ci0KLSAgaW5kZW50KG91dCkgPDwgImZyb21fIiA8PCBuYW1lIDw8ICIgOjogIiA8PCBuYW1lIDw8ICIgLT4gVC5UaHJpZnRWYWwiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJmcm9tXyIgPDwgbmFtZSA8PCAiIHJlY29yZCA9IFQuVFN0cnVjdCAkIE1hcC5mcm9tTGlzdCAiOwotICBpbmRlbnRfdXAoKTsKLQotICAvLyBHZXQgRXhjZXB0aW9ucwotICBib29sIGhhc0V4biA9IGZhbHNlOwotICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmICgoKHRfdHlwZSopKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKS0+aXNfeGNlcHRpb24oKSkgewotICAgICAgaGFzRXhuID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIGJvb2wgaXNmaXJzdCA9IHRydWU7Ci0gIGlmIChoYXNFeG4pIHsKLSAgICBvdXQgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiKGxldCBleG5zID0gTS5jYXRNYXliZXMgIjsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOwotICAgICAgICAgKytmX2l0ZXIpIHsKLSAgICAgIGlmICgoKHRfdHlwZSopKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKS0+aXNfeGNlcHRpb24oKSkgewotICAgICAgICBpZiAoaXNmaXJzdCkgewotICAgICAgICAgIG91dCA8PCAiWyAiOwotICAgICAgICAgIGlzZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBvdXQgPDwgIiwgIjsKLSAgICAgICAgfQotICAgICAgICBzdHJpbmcgbW5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgICAgIGludDMyX3Qga2V5ID0gKCpmX2l0ZXIpLT5nZXRfa2V5KCk7Ci0gICAgICAgIG91dCA8PCAiKFxcIiA8PCB2IDw8ICIgLT4gKCIgPDwga2V5IDw8ICIsIChcIiIgPDwgbW5hbWUgPDwgIlwiLCI7Ci0gICAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV90eXBlKG91dCwgKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLCB2KTsKLSAgICAgICAgb3V0IDw8ICIpKSkgPCQ+ICIgPDwgZmllbGRfbmFtZShuYW1lLCBtbmFtZSkgPDwgIiByZWNvcmQiOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoIWlzZmlyc3QpIHsKLSAgICAgIG91dCA8PCAiXSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiaW4gaWYgUC5ub3QgKFAubnVsbCBleG5zKSB0aGVuIGV4bnMgZWxzZSAiOwotICAgIGluZGVudF91cCgpOwotICB9IGVsc2UgewotICAgIG91dCA8PCAiJCAiOwotICB9Ci0KLSAgb3V0IDw8ICJNLmNhdE1heWJlcyIgPDwgZW5kbDsKLSAgLy8gR2V0IHRoZSBSZXN0Ci0gIGlzZmlyc3QgPSB0cnVlOwotICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIC8vIFdyaXRlIGZpZWxkIGhlYWRlcgotICAgIGlmIChpc2ZpcnN0KSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiWyAiOwotICAgICAgaXNmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiLCAiOwotICAgIH0KLSAgICBzdHJpbmcgbW5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgaW50MzJfdCBrZXkgPSAoKmZfaXRlciktPmdldF9rZXkoKTsKLSAgICBvdXQgPDwgIihcXCI7Ci0gICAgb3V0IDw8IHYgPDwgIiAtPiAiOwotICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX09QVElPTkFMCi0gICAgICAgICYmICEoKHRfdHlwZSopKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKS0+aXNfeGNlcHRpb24oKSkgewotICAgICAgb3V0IDw8ICJQLkp1c3QgIjsKLSAgICB9Ci0gICAgb3V0IDw8ICIoIiA8PCBrZXkgPDwgIiwgKFwiIiA8PCBtbmFtZSA8PCAiXCIsIjsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfdHlwZShvdXQsICgqZl9pdGVyKS0+Z2V0X3R5cGUoKSwgdik7Ci0gICAgb3V0IDw8ICIpKSkgIjsKLSAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9PUFRJT05BTAotICAgICAgICAmJiAhKCh0X3R5cGUqKSgqZl9pdGVyKS0+Z2V0X3R5cGUoKSktPmlzX3hjZXB0aW9uKCkpIHsKLSAgICAgIG91dCA8PCAiJCI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCAiPCQ+IjsKLSAgICB9Ci0gICAgb3V0IDw8ICIgIiA8PCBmaWVsZF9uYW1lKG5hbWUsIG1uYW1lKSA8PCAiIHJlY29yZCIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCi0gIGlmIChpc2ZpcnN0KSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIltdIiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGluZGVudChvdXQpIDw8ICJdIiA8PCBlbmRsOwotICB9Ci0gIGlmIChoYXNFeG4pIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiKSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgLy8gd3JpdGUKLSAgaW5kZW50KG91dCkgPDwgIndyaXRlXyIgPDwgbmFtZSA8PCAiIDo6IChULlByb3RvY29sIHAsIFQuVHJhbnNwb3J0IHQpID0+IHAgdCAtPiAiIDw8IG5hbWUKLSAgICAgICAgICAgICAgPDwgIiAtPiBQLklPICgpIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAid3JpdGVfIiA8PCBuYW1lIDw8ICIgb3Byb3QgcmVjb3JkID0gVC53cml0ZVZhbCBvcHJvdCAkIGZyb21fIjsKLSAgb3V0IDw8IG5hbWUgPDwgIiByZWNvcmQiIDw8IGVuZGw7Ci0KLSAgLy8gZW5jb2RlCi0gIGluZGVudChvdXQpIDw8ICJlbmNvZGVfIiA8PCBuYW1lIDw8ICIgOjogKFQuUHJvdG9jb2wgcCwgVC5UcmFuc3BvcnQgdCkgPT4gcCB0IC0+ICIgPDwgbmFtZQotICAgICAgICAgICAgICA8PCAiIC0+IExCUy5CeXRlU3RyaW5nIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiZW5jb2RlXyIgPDwgbmFtZSA8PCAiIG9wcm90IHJlY29yZCA9IFQuc2VyaWFsaXplVmFsIG9wcm90ICQgIjsKLSAgb3V0IDw8ICJmcm9tXyIgPDwgbmFtZSA8PCAiIHJlY29yZCIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgotICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gZ2V0X291dF9kaXIoKSArIGNhcGl0YWxpemUoc2VydmljZV9uYW1lXykgKyAiLmhzIjsKLSAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOwotCi0gIGZfc2VydmljZV8gPDwgaHNfbGFuZ3VhZ2VfcHJhZ21hKCkgPDwgZW5kbDsKLSAgZl9zZXJ2aWNlXyA8PCBoc19hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOwotICBmX3NlcnZpY2VfIDw8ICJtb2R1bGUgIiA8PCBjYXBpdGFsaXplKHNlcnZpY2VfbmFtZV8pIDw8ICIgd2hlcmUiIDw8IGVuZGw7Ci0gIGZfc2VydmljZV8gPDwgaHNfaW1wb3J0cygpIDw8IGVuZGw7Ci0KLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAiaW1wb3J0IHF1YWxpZmllZCAiIDw8IGNhcGl0YWxpemUodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkpIDw8IGVuZGw7Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8ICJpbXBvcnQgIiA8PCBjYXBpdGFsaXplKHByb2dyYW1fbmFtZV8pIDw8ICJfVHlwZXMiIDw8IGVuZGw7Ci0gIGZfc2VydmljZV8gPDwgImltcG9ydCBxdWFsaWZpZWQgIiA8PCBjYXBpdGFsaXplKHNlcnZpY2VfbmFtZV8pIDw8ICJfSWZhY2UgYXMgSWZhY2UiIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHRocmVlIG1haW4gcGFydHMgb2YgdGhlIHNlcnZpY2UKLSAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRzZXJ2aWNlKTsKLQotICAvLyBDbG9zZSBzZXJ2aWNlIGZpbGUKLSAgZl9zZXJ2aWNlXy5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBoZWxwZXIgZnVuY3Rpb25zIGZvciBhIHNlcnZpY2UuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLS0gSEVMUEVSIEZVTkNUSU9OUyBBTkQgU1RSVUNUVVJFUyAtLSIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgZ2VuZXJhdGVfaHNfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgdHMsIGZhbHNlKTsKLSAgICBnZW5lcmF0ZV9oc19mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2hzX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgZmllbGRfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCksICJyZXN1bHQiKSk7Ci0gIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7Ci0KLSAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkKLSAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKLQotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7Ci0KLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikKLSAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOwotCi0gIGdlbmVyYXRlX2hzX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sICZyZXN1bHQsIGZhbHNlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZSB0aGUgbWFwIGZyb20gZmllbGQgbmFtZXMgdG8gKHR5cGUsIGlkKQotICogQHBhcmFtIHRzdHJ1Y3QgdGhlIFN0cnVjdAotICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oc190eXBlbWFwKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyBuYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGluZGVudChvdXQpIDw8ICJ0eXBlbWFwXyIgPDwgbmFtZSA8PCAiIDo6IFQuVHlwZU1hcCIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInR5cGVtYXBfIiA8PCBuYW1lIDw8ICIgPSBNYXAuZnJvbUxpc3QgWyI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHN0cmluZyBtbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICBpZiAoIWZpcnN0KSB7Ci0gICAgICBvdXQgPDwgIiwiOwotICAgIH0KLQotICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBpbnQzMl90IGtleSA9ICgqZl9pdGVyKS0+Z2V0X2tleSgpOwotICAgIG91dCA8PCAiKCIgPDwga2V5IDw8ICIsKFwiIiA8PCBtbmFtZSA8PCAiXCIsIiA8PCB0eXBlX3RvX2VudW0odHlwZSkgPDwgIikpIjsKLSAgICBmaXJzdCA9IGZhbHNlOwotICB9Ci0gIG91dCA8PCAiXSIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBnZW5lcmF0ZSB0aGUgc3RydWN0IHdpdGggZGVmYXVsdCB2YWx1ZXMgZmlsbGVkIGluCi0gKiBAcGFyYW0gdHN0cnVjdCB0aGUgU3RydWN0Ci0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2hzX2RlZmF1bHQob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RyaW5nIG5hbWUgPSB0eXBlX25hbWUodHN0cnVjdCk7Ci0gIHN0cmluZyBmbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0LCAiZGVmYXVsdF8iKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgZm5hbWUgPDwgIiA6OiAiIDw8IG5hbWUgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgZm5hbWUgPDwgIiA9ICIgPDwgbmFtZSA8PCAieyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHN0cmluZyBtbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSAoKmZfaXRlciktPmdldF92YWx1ZSgpOwotICAgIGluZGVudChvdXQpIDw8IGZpZWxkX25hbWUobmFtZSwgbW5hbWUpIDw8ICIgPSAiOwotICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMCi0gICAgICAgIHx8ICgodF90eXBlKikoKmZfaXRlciktPmdldF90eXBlKCkpLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICBpZiAodmFsdWUgPT0gTlVMTCkgewotICAgICAgICBvdXQgPDwgIlAuTm90aGluZyI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgIlAuSnVzdCAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB2YWx1ZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpOwotICAgIH0KLSAgfQotICBvdXQgPDwgIn0iIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZl9pZmFjZV9uYW1lID0gZ2V0X291dF9kaXIoKSArIGNhcGl0YWxpemUoc2VydmljZV9uYW1lXykgKyAiX0lmYWNlLmhzIjsKLSAgZl9pZmFjZV8ub3BlbihmX2lmYWNlX25hbWUuY19zdHIoKSk7Ci0KLSAgZl9pZmFjZV8gPDwgaHNfbGFuZ3VhZ2VfcHJhZ21hKCkgPDwgZW5kbDsKLSAgZl9pZmFjZV8gPDwgaHNfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKLQotICBmX2lmYWNlXyA8PCAibW9kdWxlICIgPDwgY2FwaXRhbGl6ZShzZXJ2aWNlX25hbWVfKSA8PCAiX0lmYWNlIHdoZXJlIiA8PCBlbmRsOwotCi0gIGZfaWZhY2VfIDw8IGhzX2ltcG9ydHMoKSA8PCBlbmRsOwotICBmX2lmYWNlXyA8PCAiaW1wb3J0ICIgPDwgY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKSA8PCAiX1R5cGVzIiA8PCBlbmRsOwotICBmX2lmYWNlXyA8PCBlbmRsOwotCi0gIHN0cmluZyBzbmFtZSA9IGNhcGl0YWxpemUoc2VydmljZV9uYW1lXyk7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgc3RyaW5nIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotCi0gICAgaW5kZW50KGZfaWZhY2VfKSA8PCAiaW1wb3J0ICIgPDwgZXh0ZW5kcyA8PCAiX0lmYWNlIiA8PCBlbmRsOwotICAgIGluZGVudChmX2lmYWNlXykgPDwgImNsYXNzICIgPDwgZXh0ZW5kcyA8PCAiX0lmYWNlIGEgPT4gIiA8PCBzbmFtZSA8PCAiX0lmYWNlIGEgd2hlcmUiIDw8IGVuZGw7Ci0KLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQoZl9pZmFjZV8pIDw8ICJjbGFzcyAiIDw8IHNuYW1lIDw8ICJfSWZhY2UgYSB3aGVyZSIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudF91cCgpOwotCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHN0cmluZyBmdCA9IGZ1bmN0aW9uX3R5cGUoKmZfaXRlciwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgaW5kZW50KGZfaWZhY2VfKSA8PCBkZWNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiIDo6IGEgLT4gIiA8PCBmdCA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9pZmFjZV8uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLiBOb3RlIHRoYXQgaW4gSGFza2VsbCwgdGhlIGNsaWVudCBkb2Vzbid0IGltcGxlbWVudCBpZmFjZS4KLSAqVGhpcyBpcyBiZWNhdXNlCi0gKiBUaGUgY2xpZW50IGRvZXMgbm90IChhbmQgc2hvdWxkIG5vdCBoYXZlIHRvKSBkZWFsIHdpdGggYXJndW1lbnRzIGJlaW5nIE5vdGhpbmcuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZl9jbGllbnRfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBjYXBpdGFsaXplKHNlcnZpY2VfbmFtZV8pICsgIl9DbGllbnQuaHMiOwotICBmX2NsaWVudF8ub3BlbihmX2NsaWVudF9uYW1lLmNfc3RyKCkpOwotICBmX2NsaWVudF8gPDwgaHNfbGFuZ3VhZ2VfcHJhZ21hKCkgPDwgZW5kbDsKLSAgZl9jbGllbnRfIDw8IGhzX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7Ci0KLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4cG9ydHMgPSAiIjsKLQotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBleHBvcnRzICs9IChmaXJzdCA/ICIiIDogIiwiKTsKLSAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICBleHBvcnRzICs9IGRlY2FwaXRhbGl6ZShmdW5uYW1lKTsKLSAgICBmaXJzdCA9IGZhbHNlOwotICB9Ci0KLSAgc3RyaW5nIHNuYW1lID0gY2FwaXRhbGl6ZShzZXJ2aWNlX25hbWVfKTsKLSAgaW5kZW50KGZfY2xpZW50XykgPDwgIm1vZHVsZSAiIDw8IHNuYW1lIDw8ICJfQ2xpZW50KCIgPDwgZXhwb3J0cyA8PCAiKSB3aGVyZSIgPDwgZW5kbDsKLQotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJpbXBvcnQgIiA8PCBleHRlbmRzIDw8ICJfQ2xpZW50IiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50KGZfY2xpZW50XykgPDwgImltcG9ydCBxdWFsaWZpZWQgRGF0YS5JT1JlZiBhcyBSIiA8PCBlbmRsOwotICBpbmRlbnQoZl9jbGllbnRfKSA8PCBoc19pbXBvcnRzKCkgPDwgZW5kbDsKLSAgaW5kZW50KGZfY2xpZW50XykgPDwgImltcG9ydCAiIDw8IGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXykgPDwgIl9UeXBlcyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfY2xpZW50XykgPDwgImltcG9ydCAiIDw8IGNhcGl0YWxpemUoc2VydmljZV9uYW1lXykgPDwgZW5kbDsKLQotICAvLyBEQVRTIFJJVEUgQSBHTE9CQUwgVkFSCi0gIGluZGVudChmX2NsaWVudF8pIDw8ICJzZXFpZCA9IFIubmV3SU9SZWYgMCIgPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7Ci0gICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0KLSAgICBzdHJpbmcgZmFyZ3MgPSAiIjsKLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikKLSAgICAgIGZhcmdzICs9ICIgYXJnXyIgKyAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKLQotICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCBkZWNhcGl0YWxpemUoZnVubmFtZSkgPDwgIiAoaXAsb3ApIiA8PCBmYXJncyA8PCAiID0gZG8iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KGZfY2xpZW50XykgPDwgInNlbmRfIiA8PCBmdW5uYW1lIDw8ICIgb3AiIDw8IGZhcmdzOwotCi0gICAgZl9jbGllbnRfIDw8IGVuZGw7Ci0KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpCi0gICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAicmVjdl8iIDw8IGZ1bm5hbWUgPDwgIiBpcCIgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAic2VuZF8iIDw8IGZ1bm5hbWUgPDwgIiBvcCIgPDwgZmFyZ3MgPDwgIiA9IGRvIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgaW5kZW50KGZfY2xpZW50XykgPDwgInNlcSA8LSBzZXFpZCIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAic2VxbiA8LSBSLnJlYWRJT1JlZiBzZXEiIDw8IGVuZGw7Ci0gICAgc3RyaW5nIGFyZ3NuYW1lID0gY2FwaXRhbGl6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiKTsKLQotICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdCBoZWFkZXIKLSAgICBzdHJpbmcgZm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgc3RyaW5nIG1zZ1R5cGUgPSAoKmZfaXRlciktPmlzX29uZXdheSgpID8gIlQuTV9PTkVXQVkiIDogIlQuTV9DQUxMIjsKLSAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiVC53cml0ZU1lc3NhZ2VCZWdpbiBvcCAoXCIiIDw8IGZuYW1lIDw8ICJcIiwgIiA8PCBtc2dUeXBlIDw8ICIsIHNlcW4pIgotICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfY2xpZW50XykgPDwgIndyaXRlXyIgPDwgYXJnc25hbWUgPDwgIiBvcCAoIiA8PCBhcmdzbmFtZSA8PCAieyI7Ci0KLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsKLSAgICAgICAgICsrZmxkX2l0ZXIpIHsKLSAgICAgIHN0cmluZyBmaWVsZG5hbWUgPSAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgIGZfY2xpZW50XyA8PCAoZmlyc3QgPyAiIiA6ICIsIik7Ci0gICAgICBmX2NsaWVudF8gPDwgZmllbGRfbmFtZShhcmdzbmFtZSwgZmllbGRuYW1lKSA8PCAiPSI7Ci0gICAgICBpZiAoKCpmbGRfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMCi0gICAgICAgICAgfHwgKCh0X3R5cGUqKSgqZmxkX2l0ZXIpLT5nZXRfdHlwZSgpKS0+aXNfeGNlcHRpb24oKSkKLSAgICAgICAgZl9jbGllbnRfIDw8ICJQLkp1c3QgIjsKLSAgICAgIGZfY2xpZW50XyA8PCAiYXJnXyIgPDwgZmllbGRuYW1lOwotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9Ci0gICAgZl9jbGllbnRfIDw8ICJ9KSIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiVC53cml0ZU1lc3NhZ2VFbmQgb3AiIDw8IGVuZGw7Ci0KLSAgICAvLyBXcml0ZSB0byB0aGUgc3RyZWFtCi0gICAgaW5kZW50KGZfY2xpZW50XykgPDwgIlQudEZsdXNoIChULmdldFRyYW5zcG9ydCBvcCkiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgc3RyaW5nIHJlc3VsdG5hbWUgPSBjYXBpdGFsaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7Ci0gICAgICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOwotCi0gICAgICBzdHJpbmcgZnVubmFtZSA9IHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksIGZ1bm5hbWUsICZub2FyZ3MpOwotCi0gICAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCBmdW5uYW1lIDw8ICIgaXAgPSBkbyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotCi0gICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiKGZuYW1lLCBtdHlwZSwgcnNlcWlkKSA8LSBULnJlYWRNZXNzYWdlQmVnaW4gaXAiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiTS53aGVuIChtdHlwZSA9PSBULk1fRVhDRVBUSU9OKSAkIGRvIHsgZXhuIDwtIFQucmVhZEFwcEV4biBpcCA7ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJULnJlYWRNZXNzYWdlRW5kIGlwIDsgWC50aHJvdyBleG4gfSIgPDwgZW5kbDsKLQotICAgICAgaW5kZW50KGZfY2xpZW50XykgPDwgInJlcyA8LSByZWFkXyIgPDwgcmVzdWx0bmFtZSA8PCAiIGlwIiA8PCBlbmRsOwotICAgICAgaW5kZW50KGZfY2xpZW50XykgPDwgIlQucmVhZE1lc3NhZ2VFbmQgaXAiIDw8IGVuZGw7Ci0KLSAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOwotICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0KLSAgICAgIGZvciAodmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7Ci0gICAgICAgICAgICsreF9pdGVyKSB7Ci0gICAgICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJQLm1heWJlIChQLnJldHVybiAoKSkgWC50aHJvdyAoIgotICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBmaWVsZF9uYW1lKHJlc3VsdG5hbWUsICgqeF9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiByZXMpIiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKQotICAgICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiUC5yZXR1cm4gJCAiIDw8IGZpZWxkX25hbWUocmVzdWx0bmFtZSwgInN1Y2Nlc3MiKSA8PCAiIHJlcyIgPDwgZW5kbDsKLSAgICAgIGVsc2UKLSAgICAgICAgaW5kZW50KGZfY2xpZW50XykgPDwgIlAucmV0dXJuICgpIiA8PCBlbmRsOwotCi0gICAgICAvLyBDbG9zZSBmdW5jdGlvbgotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICB9Ci0gIH0KLQotICBmX2NsaWVudF8uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKQotICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJvY18gaGFuZGxlciAoaXByb3Qsb3Byb3QpIChuYW1lLHR5cCxzZXFpZCkgPSBjYXNlIG5hbWUgb2YiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyaW5nIGZuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiXCIiIDw8IGZuYW1lIDw8ICJcIiAtPiBwcm9jZXNzXyIgPDwgZGVjYXBpdGFsaXplKGZuYW1lKQotICAgICAgICAgICAgICAgICAgICAgICA8PCAiIChzZXFpZCxpcHJvdCxvcHJvdCxoYW5kbGVyKSIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiXyAtPiAiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGZfc2VydmljZV8gPDwgdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKQotICAgICAgICAgICAgICAgPDwgIi5wcm9jXyBoYW5kbGVyIChpcHJvdCxvcHJvdCkgKG5hbWUsdHlwLHNlcWlkKSIgPDwgZW5kbDsKLQotICB9IGVsc2UgewotICAgIGZfc2VydmljZV8gPDwgImRvIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiXyA8LSBULnJlYWRWYWwgaXByb3QgKFQuVF9TVFJVQ1QgTWFwLmVtcHR5KSIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlQud3JpdGVNZXNzYWdlQmVnaW4gb3Byb3QgKG5hbWUsVC5NX0VYQ0VQVElPTixzZXFpZCkiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJULndyaXRlQXBwRXhuIG9wcm90IChULkFwcEV4biBULkFFX1VOS05PV05fTUVUSE9EIChcIlVua25vd24gZnVuY3Rpb24gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIgKysgTFQudW5wYWNrIG5hbWUpKSIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlQud3JpdGVNZXNzYWdlRW5kIG9wcm90IiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVC50Rmx1c2ggKFQuZ2V0VHJhbnNwb3J0IG9wcm90KSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLQotICAvLyBHZW5lcmF0ZSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJvY2VzcyBoYW5kbGVyIChpcHJvdCwgb3Byb3QpID0gZG8iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiKG5hbWUsIHR5cCwgc2VxaWQpIDwtIFQucmVhZE1lc3NhZ2VCZWdpbiBpcHJvdCIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm9jXyBoYW5kbGVyIChpcHJvdCxvcHJvdCkgKG5hbWUsdHlwLHNlcWlkKSIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJULnJlYWRNZXNzYWdlRW5kIGlwcm90IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlAucmV0dXJuIFAuVHJ1ZSIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotYm9vbCBoYXNOb0FyZ3VtZW50cyh0X2Z1bmN0aW9uKiBmdW5jKSB7Ci0gIHJldHVybiAoZnVuYy0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKS5lbXB0eSgpKTsKLX0KLQotc3RyaW5nIHRfaHNfZ2VuZXJhdG9yOjpyZW5kZXJfaHNfdHlwZV9mb3JfZnVuY3Rpb25fbmFtZSh0X3R5cGUqIHR5cGUpIHsKLSAgc3RyaW5nIHR5cGVfc3RyID0gcmVuZGVyX2hzX3R5cGUodHlwZSwgZmFsc2UpOwotICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGZvdW5kID0gLTE7Ci0KLSAgd2hpbGUgKHRydWUpIHsKLSAgICBmb3VuZCA9IHR5cGVfc3RyLmZpbmRfZmlyc3Rfb2YoIltdLiAiLCBmb3VuZCArIDEpOwotICAgIGlmIChzdHJpbmc6Om5wb3MgPT0gc2l6ZV90KGZvdW5kKSkgewotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKHR5cGVfc3RyW2ZvdW5kXSA9PSAnLicpCi0gICAgICB0eXBlX3N0cltmb3VuZF0gPSAnXyc7Ci0gICAgZWxzZQotICAgICAgdHlwZV9zdHJbZm91bmRdID0gJ1onOwotICB9Ci0gIHJldHVybiB0eXBlX3N0cjsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBwcm9jZXNzIGZ1bmN0aW9uIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgYSBkaXNwYXRjaGVyIGZvcgotICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICAodm9pZCl0c2VydmljZTsKLSAgLy8gT3BlbiBmdW5jdGlvbgotICBzdHJpbmcgZnVubmFtZSA9IGRlY2FwaXRhbGl6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByb2Nlc3NfIiA8PCBmdW5uYW1lIDw8ICIgKHNlcWlkLCBpcHJvdCwgb3Byb3QsIGhhbmRsZXIpID0gZG8iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIHN0cmluZyBhcmdzbmFtZSA9IGNhcGl0YWxpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICJfYXJncyI7Ci0gIHN0cmluZyByZXN1bHRuYW1lID0gY2FwaXRhbGl6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgIl9yZXN1bHQiOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCi0gIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJhcmdzIDwtIHJlYWRfIiA8PCBhcmdzbmFtZSA8PCAiIGlwcm90IiA8PCBlbmRsOwotCi0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotCi0gIHNpemVfdCBuID0geGNlcHRpb25zLnNpemUoKSArIDE7Ci0gIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKLSAgaWYgKG4gPiAwKSB7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuOyBpKyspIHsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiKFguY2F0Y2giIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0gIH0KLQotICBpZiAobiA+IDApIHsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIihkbyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgfQotICBpbmRlbnQoZl9zZXJ2aWNlXyk7Ci0KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkKLSAgICBmX3NlcnZpY2VfIDw8ICJ2YWwgPC0gIjsKLQotICBmX3NlcnZpY2VfIDw8ICJJZmFjZS4iIDw8IGRlY2FwaXRhbGl6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpIDw8ICIgaGFuZGxlciI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQotICAgIGZfc2VydmljZV8gPDwgIiAoIiA8PCBmaWVsZF9uYW1lKGFyZ3NuYW1lLCAoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgYXJncykiOwotCi0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJsZXQgcmVzID0gZGVmYXVsdF8iIDw8IHJlc3VsdG5hbWUgPDwgInsiCi0gICAgICAgICAgICAgICAgICAgICAgIDw8IGZpZWxkX25hbWUocmVzdWx0bmFtZSwgInN1Y2Nlc3MiKSA8PCAiID0gdmFsfSI7Ci0KLSAgfSBlbHNlIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImxldCByZXMgPSBkZWZhdWx0XyIgPDwgcmVzdWx0bmFtZTsKLSAgfQotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgLy8gU2hvcnRjdXQgb3V0IGhlcmUgZm9yIG9uZXdheSBmdW5jdGlvbnMKLSAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlAucmV0dXJuICgpIjsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlQud3JpdGVNZXNzYWdlQmVnaW4gb3Byb3QgKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgPDwgIlwiLCBULk1fUkVQTFksIHNlcWlkKSIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIndyaXRlXyIgPDwgcmVzdWx0bmFtZSA8PCAiIG9wcm90IHJlcyIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlQud3JpdGVNZXNzYWdlRW5kIG9wcm90IiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVC50Rmx1c2ggKFQuZ2V0VHJhbnNwb3J0IG9wcm90KSI7Ci0gIH0KLSAgaWYgKG4gPiAwKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAiKSI7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgaWYgKG4gPiAwKSB7Ci0gICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiKFxcZSAgLT4gZG8iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLQotICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAibGV0IHJlcyA9IGRlZmF1bHRfIiA8PCByZXN1bHRuYW1lIDw8ICJ7IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZmllbGRfbmFtZShyZXN1bHRuYW1lLCAoKnhfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgPSBQLkp1c3QgZX0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlQud3JpdGVNZXNzYWdlQmVnaW4gb3Byb3QgKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcIiwgVC5NX1JFUExZLCBzZXFpZCkiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAid3JpdGVfIiA8PCByZXN1bHRuYW1lIDw8ICIgb3Byb3QgcmVzIiA8PCBlbmRsOwotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlQud3JpdGVNZXNzYWdlRW5kIG9wcm90IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlQudEZsdXNoIChULmdldFRyYW5zcG9ydCBvcHJvdCkiOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJQLnJldHVybiAoKSI7Ci0gICAgICB9Ci0KLSAgICAgIGZfc2VydmljZV8gPDwgIikpIiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgfQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiKChcXF8gLT4gZG8iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVC53cml0ZU1lc3NhZ2VCZWdpbiBvcHJvdCAoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcIiwgVC5NX0VYQ0VQVElPTiwgc2VxaWQpIiA8PCBlbmRsOwotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJULndyaXRlQXBwRXhuIG9wcm90IChULkFwcEV4biBULkFFX1VOS05PV04gXCJcIikiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlQud3JpdGVNZXNzYWdlRW5kIG9wcm90IiA8PCBlbmRsOwotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJULnRGbHVzaCAoVC5nZXRUcmFuc3BvcnQgb3Byb3QpIjsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJQLnJldHVybiAoKSI7Ci0gICAgfQotCi0gICAgZl9zZXJ2aWNlXyA8PCAiKSA6OiBYLlNvbWVFeGNlcHRpb24gLT4gUC5JTyAoKSkpIiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotICAvLyBDbG9zZSBmdW5jdGlvbgotICBpbmRlbnRfZG93bigpOwotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKLSAgKHZvaWQpcHJlZml4OwotICB0X3R5cGUqIHR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7Ci0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3V0LCB0eXBlLCBwcmVmaXgpOwotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSwgc3RyaW5nIGFyZykgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLSAgc3RyaW5nIHZhbCA9IHRtcCgiX3ZhbCIpOwotICBvdXQgPDwgIihjYXNlICIgPDwgYXJnIDw8ICIgb2YgeyIgPDwgdHlwZV90b19jb25zdHJ1Y3Rvcih0eXBlKSA8PCAiICIgPDwgdmFsIDw8ICIgLT4gIjsKLQotICBpZiAodHlwZS0+aXNfdm9pZCgpKQotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFIjsKLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgdmFsKTsKLQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgdmFsKTsKLQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIGlmICh0YmFzZSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcgJiYgISgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgb3V0IDw8ICJFLmRlY29kZVV0ZjggIjsKLSAgICB9Ci0gICAgb3V0IDw8IHZhbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBvdXQgPDwgIlAudG9FbnVtICQgUC5mcm9tSW50ZWdyYWwgIiA8PCB2YWw7Ci0KLSAgfSBlbHNlIHsKLSAgICB0aHJvdyAiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIFRZUEUgIiArIHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLSAgb3V0IDw8ICI7IF8gLT4gUC5lcnJvciBcIndyb25nIHR5cGVcIn0pIjsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHN0cnVjdCwgY2FsbGluZyByZWFkKCkKLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgbmFtZSkgewotCi0gIG91dCA8PCAiKCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QsICJ0b18iKSA8PCAiIChULlRTdHJ1Y3QgIiA8PCBuYW1lIDw8ICIpKSI7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplIGEgY29udGFpbmVyIGJ5IHdyaXRpbmcgb3V0IHRoZSBoZWFkZXIgZm9sbG93ZWQgYnkKLSAqIGRhdGEgYW5kIHRoZW4gYSBmb290ZXIuCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgYXJnKSB7Ci0KLSAgc3RyaW5nIHZhbCA9IHRtcCgiX3YiKTsKLSAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBzdHJpbmcga2V5ID0gdG1wKCJfayIpOwotICAgIG91dCA8PCAiKE1hcC5mcm9tTGlzdCAkIFAubWFwIChcXCgiIDw8IGtleSA8PCAiLCIgPDwgdmFsIDw8ICIpIC0+ICgiOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3V0LCAoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpLCBrZXkpOwotCi0gICAgb3V0IDw8ICIsIjsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG91dCwgKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKLQotICAgIG91dCA8PCAiKSkgIiA8PCBhcmcgPDwgIikiOwotCi0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgb3V0IDw8ICIoU2V0LmZyb21MaXN0ICQgUC5tYXAgKFxcIiA8PCB2YWwgPDwgIiAtPiAiOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3V0LCAoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpLCB2YWwpOwotICAgIG91dCA8PCAiKSAiIDw8IGFyZyA8PCAiKSI7Ci0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgb3V0IDw8ICIoVmVjdG9yLmZyb21MaXN0ICQgUC5tYXAgKFxcIiA8PCB2YWwgPDwgIiAtPiAiOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3V0LCAoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpLCB2YWwpOwotICAgIG91dCA8PCAiKSAiIDw8IGFyZyA8PCAiKSI7Ci0gIH0KLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCi0gKgotICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gcHJlZml4IE5hbWUgdG8gcHJlcGVuZCB0byBmaWVsZCBuYW1lCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV90eXBlKG9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSwgc3RyaW5nIG5hbWUpIHsKLQotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLSAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcwotICBpZiAodHlwZS0+aXNfdm9pZCgpKQotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRSI7Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lKTsKLQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOwotCi0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBvdXQgPDwgdHlwZV90b19jb25zdHJ1Y3Rvcih0eXBlKSA8PCAiICI7Ci0gICAgICBpZiAodGJhc2UgPT0gdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HICYmICEoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgb3V0IDw8ICIkIEUuZW5jb2RlVXRmOCAiOwotICAgICAgfQotICAgICAgb3V0IDw8IG5hbWU7Ci0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgc3RyaW5nIGVuYW1lID0gY2FwaXRhbGl6ZSh0eXBlLT5nZXRfbmFtZSgpKTsKLSAgICAgIG91dCA8PCAiVC5USTMyICQgUC5mcm9tSW50ZWdyYWwgJCBQLmZyb21FbnVtICIgPDwgbmFtZTsKLSAgICB9Ci0KLSAgfSBlbHNlIHsKLSAgICB0aHJvdyAiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSBGSUVMRCBPRiBUWVBFICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotICB9Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgewotICBvdXQgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QsICJmcm9tXyIpIDw8ICIgIiA8PCBwcmVmaXg7Ci19Ci0KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcgayA9IHRtcCgiX2siKTsKLSAgc3RyaW5nIHYgPSB0bXAoIl92Iik7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpOwotICAgIG91dCA8PCAiVC5UTWFwICIgPDwgdHlwZV90b19lbnVtKGt0eXBlKSA8PCAiICIgPDwgdHlwZV90b19lbnVtKHZ0eXBlKTsKLSAgICBvdXQgPDwgIiAkIFAubWFwIChcXCgiIDw8IGsgPDwgIiwiIDw8IHYgPDwgIikgLT4gKCI7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3R5cGUob3V0LCBrdHlwZSwgayk7Ci0gICAgb3V0IDw8ICIsICI7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3R5cGUob3V0LCB2dHlwZSwgdik7Ci0gICAgb3V0IDw8ICIpKSAkIE1hcC50b0xpc3QgIiA8PCBwcmVmaXg7Ci0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBvdXQgPDwgIlQuVFNldCAiIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpOwotICAgIG91dCA8PCAiICQgUC5tYXAgKFxcIiA8PCB2IDw8ICIgLT4gIjsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfdHlwZShvdXQsICgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSwgdik7Ci0gICAgb3V0IDw8ICIpICQgU2V0LnRvTGlzdCAiIDw8IHByZWZpeDsKLQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBvdXQgPDwgIlQuVExpc3QgIiA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKTsKLSAgICBvdXQgPDwgIiAkIFAubWFwIChcXCIgPDwgdiA8PCAiIC0+ICI7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3R5cGUob3V0LCAoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCksIHYpOwotICAgIG91dCA8PCAiKSAkIFZlY3Rvci50b0xpc3QgIiA8PCBwcmVmaXg7Ci0gIH0KLX0KLQotc3RyaW5nIHRfaHNfZ2VuZXJhdG9yOjpmdW5jdGlvbl90eXBlKHRfZnVuY3Rpb24qIHRmdW5jLCBib29sIG9wdGlvbnMsIGJvb2wgaW8sIGJvb2wgbWV0aG9kKSB7Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0ZnVuYy0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKLSAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTAotICAgICAgICB8fCAoKHRfdHlwZSopKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKS0+aXNfeGNlcHRpb24oKSkKLSAgICAgIHJlc3VsdCArPSAiUC5NYXliZSAiOwotICAgIHJlc3VsdCArPSByZW5kZXJfaHNfdHlwZSgoKmZfaXRlciktPmdldF90eXBlKCksIG9wdGlvbnMpOwotICAgIHJlc3VsdCArPSAiIC0+ICI7Ci0gIH0KLQotICBpZiAoZmllbGRzLmVtcHR5KCkgJiYgIW1ldGhvZCkKLSAgICByZXN1bHQgKz0gIigpIC0+ICI7Ci0KLSAgaWYgKGlvKQotICAgIHJlc3VsdCArPSAiUC5JTyAiOwotCi0gIHJlc3VsdCArPSByZW5kZXJfaHNfdHlwZSh0ZnVuYy0+Z2V0X3JldHVybnR5cGUoKSwgaW8pOwotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdHJpbmcgdF9oc19nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBzdHJpbmcgZnVuY3Rpb25fcHJlZml4KSB7Ci0gIHN0cmluZyBwcmVmaXggPSAiIjsKLSAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7Ci0KLSAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKQotICAgIGlmICghdHR5cGUtPmlzX3NlcnZpY2UoKSkKLSAgICAgIHByZWZpeCA9IGNhcGl0YWxpemUocHJvZ3JhbS0+Z2V0X25hbWUoKSkgKyAiX1R5cGVzLiI7Ci0KLSAgcmV0dXJuIHByZWZpeCArIGZ1bmN0aW9uX3ByZWZpeCArIGNhcGl0YWxpemUodHR5cGUtPmdldF9uYW1lKCkpOwotfQotCi1zdHJpbmcgdF9oc19nZW5lcmF0b3I6OmZpZWxkX25hbWUoc3RyaW5nIHRuYW1lLCBzdHJpbmcgZm5hbWUpIHsKLSAgcmV0dXJuIGRlY2FwaXRhbGl6ZSh0bmFtZSkgKyAiXyIgKyBmbmFtZTsKLX0KLQotLyoqCi0gKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIFByb3RvY29sLnRfdHlwZSBlbnVtCi0gKi8KLXN0cmluZyB0X2hzX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHJldHVybiAiVC5UX1ZPSUQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICJULlRfU1RSSU5HIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gIlQuVF9CT09MIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIlQuVF9CWVRFIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiVC5UX0kxNiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gIlQuVF9JMzIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJULlRfSTY0IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiVC5UX0RPVUJMRSI7Ci0gICAgfQotCi0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJULlRfSTMyIjsKLQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIihULlRfU1RSVUNUICIgKyB0eXBlX25hbWUoKHRfc3RydWN0Kil0eXBlLCAidHlwZW1hcF8iKSArICIpIjsKLQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgc3RyaW5nIGt0eXBlID0gdHlwZV90b19lbnVtKCgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKSk7Ci0gICAgc3RyaW5nIHZ0eXBlID0gdHlwZV90b19lbnVtKCgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKSk7Ci0gICAgcmV0dXJuICIoVC5UX01BUCAiICsga3R5cGUgKyAiICIgKyB2dHlwZSArICIpIjsKLQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICIoVC5UX1NFVCAiICsgdHlwZV90b19lbnVtKCgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSArICIpIjsKLQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiAiKFQuVF9MSVNUICIgKyB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCkpICsgIikiOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0vKioKLSAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgZGVmYXVsdCB2YWx1ZQotICovCi1zdHJpbmcgdF9oc19nZW5lcmF0b3I6OnR5cGVfdG9fZGVmYXVsdCh0X3R5cGUqIHR5cGUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICByZXR1cm4gIlAuZXJyb3IgXCJObyBkZWZhdWx0IHZhbHVlIGZvciB0eXBlIFRfVk9JRFwiIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJldHVybiAiXCJcIiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJQLkZhbHNlIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIjAiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICIwIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiMCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gIjAiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICIwIjsKLSAgICB9Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIihQLnRvRW51bSAwKSI7Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuIHR5cGVfbmFtZSgodF9zdHJ1Y3QqKXR5cGUsICJkZWZhdWx0XyIpOwotCi0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIk1hcC5lbXB0eSI7Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiU2V0LmVtcHR5IjsKLQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiAiVmVjdG9yLmVtcHR5IjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19kZWZhdWx0OiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotLyoqCi0gKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhbiBoYXNrZWxsIHR5cGUKLSAqLwotc3RyaW5nIHRfaHNfZ2VuZXJhdG9yOjpyZW5kZXJfaHNfdHlwZSh0X3R5cGUqIHR5cGUsIGJvb2wgbmVlZHNfcGFyZW5zKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotICBzdHJpbmcgdHlwZV9yZXByOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgcmV0dXJuICIoKSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSA/ICJMQlMuQnl0ZVN0cmluZyIgOiAiTFQuVGV4dCIpOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiUC5Cb29sIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIkkuSW50OCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gIkkuSW50MTYiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICJJLkludDMyIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiSS5JbnQ2NCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gIlAuRG91YmxlIjsKLSAgICB9Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gdHlwZV9uYW1lKCh0X2VudW0qKXR5cGUpOwotCi0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiB0eXBlX25hbWUoKHRfc3RydWN0Kil0eXBlKTsKLQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotICAgIHR5cGVfcmVwciA9ICJNYXAuSGFzaE1hcCAiICsgcmVuZGVyX2hzX3R5cGUoa3R5cGUsIHRydWUpICsgIiAiICsgcmVuZGVyX2hzX3R5cGUodnR5cGUsIHRydWUpOwotCi0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB0eXBlX3JlcHIgPSAiU2V0Lkhhc2hTZXQgIiArIHJlbmRlcl9oc190eXBlKGV0eXBlLCB0cnVlKTsKLQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB0eXBlX3JlcHIgPSAiVmVjdG9yLlZlY3RvciAiICsgcmVuZGVyX2hzX3R5cGUoZXR5cGUsIHRydWUpOwotCi0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgcmV0dXJuIG5lZWRzX3BhcmVucyA/ICIoIiArIHR5cGVfcmVwciArICIpIiA6IHR5cGVfcmVwcjsKLX0KLQotLyoqCi0gKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIGhhc2tlbGwgY29uc3RydWN0b3IKLSAqLwotc3RyaW5nIHRfaHNfZ2VuZXJhdG9yOjp0eXBlX3RvX2NvbnN0cnVjdG9yKHRfdHlwZSogdHlwZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJpbnZhbGlkIHR5cGU6IFRfVk9JRCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gIlQuVFN0cmluZyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJULlRCb29sIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIlQuVEJ5dGUiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICJULlRJMTYiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICJULlRJMzIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJULlRJNjQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJULlREb3VibGUiOwotICAgIH0KLQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiVC5USTMyIjsKLQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIlQuVFN0cnVjdCI7Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiVC5UTWFwIF8gXyI7Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiVC5UU2V0IF8iOwotCi0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJULlRMaXN0IF8iOwotICB9Ci0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihocywgIkhhc2tlbGwiLCAiIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9odG1sX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9odG1sX2dlbmVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFmM2QwYS4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfaHRtbF9nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDgxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxtYXA+Ci0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSAidF9nZW5lcmF0b3IuaCIKLSNpbmNsdWRlICJ0X2h0bWxfZ2VuZXJhdG9yLmgiCi0jaW5jbHVkZSAicGxhdGZvcm0uaCIKLQotdXNpbmcgc3RkOjptYXA7Ci11c2luZyBzdGQ6Om9mc3RyZWFtOwotdXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwotdXNpbmcgc3RkOjpwYWlyOwotdXNpbmcgc3RkOjpzdHJpbmc7Ci11c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKLXVzaW5nIHN0ZDo6dmVjdG9yOwotCi1zdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCi0KLWVudW0gaW5wdXRfdHlwZSB7IElOUFVUX1VOS05PV04sIElOUFVUX1VURjgsIElOUFVUX1BMQUlOIH07Ci0KLS8qKgotICogSFRNTCBjb2RlIGdlbmVyYXRvcgotICoKLSAqIG1vc3RseSBjb3B5L3Bhc3RpbmcvdHdlYWtpbmcgZnJvbSBtY3NsZWUncyB3b3JrLgotICovCi1jbGFzcyB0X2h0bWxfZ2VuZXJhdG9yIDogcHVibGljIHRfZ2VuZXJhdG9yIHsKLXB1YmxpYzoKLSAgdF9odG1sX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCi0gICAgOiB0X2dlbmVyYXRvcihwcm9ncmFtKSB7Ci0gICAgKHZvaWQpcGFyc2VkX29wdGlvbnM7Ci0gICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKLSAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1odG1sIjsKLSAgICBpbnB1dF90eXBlXyA9IElOUFVUX1VOS05PV047Ci0KLSAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOwotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJzdGFuZGFsb25lIik7Ci0gICAgc3RhbmRhbG9uZV8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgibm9lc2NhcGUiKTsKLSAgICB1bnNhZmVfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgZXNjYXBlXy5jbGVhcigpOwotICAgIGVzY2FwZV9bJyYnXSA9ICImYW1wOyI7Ci0gICAgZXNjYXBlX1snPCddID0gIiZsdDsiOwotICAgIGVzY2FwZV9bJz4nXSA9ICImZ3Q7IjsKLSAgICBlc2NhcGVfWyciJ10gPSAiJnF1b3Q7IjsKLSAgICBlc2NhcGVfWydcJyddID0gIiZhcG9zOyI7Ci0KLSAgICBpbml0X2FsbG93ZWRfX21hcmt1cCgpOwotICB9Ci0KLSAgdm9pZCBnZW5lcmF0ZV9wcm9ncmFtKCk7Ci0gIHZvaWQgZ2VuZXJhdGVfcHJvZ3JhbV90b2MoKTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9ncmFtX3RvY19yb3codF9wcm9ncmFtKiB0cHJvZyk7Ci0gIHZvaWQgZ2VuZXJhdGVfcHJvZ3JhbV90b2Nfcm93cyh0X3Byb2dyYW0qIHRwcm9nLCBzdGQ6OnZlY3Rvcjx0X3Byb2dyYW0qPiYgZmluaXNoZWQpOwotICB2b2lkIGdlbmVyYXRlX2luZGV4KCk7Ci0gIHN0ZDo6c3RyaW5nIGVzY2FwZV9odG1sKHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIpOwotICBzdGQ6OnN0cmluZyBlc2NhcGVfaHRtbF90YWdzKHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIpOwotICB2b2lkIGdlbmVyYXRlX2NzcygpOwotICB2b2lkIGdlbmVyYXRlX2Nzc19jb250ZW50KHN0ZDo6b2ZzdHJlYW0mIGZfdGFyZ2V0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHlsZV90YWcoKTsKLSAgc3RkOjpzdHJpbmcgbWFrZV9maWxlX2xpbmsoc3RkOjpzdHJpbmcgbmFtZSk7Ci0gIGJvb2wgaXNfdXRmOF9zZXF1ZW5jZShzdGQ6OnN0cmluZyBjb25zdCYgc3RyLCBzaXplX3QgZmlyc3Rwb3MpOwotICB2b2lkIGRldGVjdF9pbnB1dF9lbmNvZGluZyhzdGQ6OnN0cmluZyBjb25zdCYgc3RyLCBzaXplX3QgZmlyc3Rwb3MpOwotICB2b2lkIGluaXRfYWxsb3dlZF9fbWFya3VwKCk7Ci0KLSAgLyoqCi0gICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOwotICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7Ci0KLSAgdm9pZCBwcmludF9kb2ModF9kb2MqIHRkb2MpOwotICBpbnQgcHJpbnRfdHlwZSh0X3R5cGUqIHR0eXBlKTsKLSAgdm9pZCBwcmludF9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHR2YWx1ZSk7Ci0gIHZvaWQgcHJpbnRfZm5fYXJnc19kb2ModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotcHJpdmF0ZToKLSAgc3RkOjpvZnN0cmVhbSBmX291dF87Ci0gIHN0ZDo6c3RyaW5nIGN1cnJlbnRfZmlsZV87Ci0gIGlucHV0X3R5cGUgaW5wdXRfdHlwZV87Ci0gIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IGFsbG93ZWRfbWFya3VwOwotICBib29sIHN0YW5kYWxvbmVfOwotICBib29sIHVuc2FmZV87Ci19OwotCi0vKioKLSAqIEVtaXRzIHRoZSBUYWJsZSBvZiBDb250ZW50cyBsaW5rcyBhdCB0aGUgdG9wIG9mIHRoZSBtb2R1bGUncyBwYWdlCi0gKi8KLXZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvZ3JhbV90b2MoKSB7Ci0gIGZfb3V0XyA8PCAiPHRhYmxlIGNsYXNzPVwidGFibGUtYm9yZGVyZWQgdGFibGUtc3RyaXBlZCAiCi0gICAgICAgICAgICAidGFibGUtY29uZGVuc2VkXCI+PHRoZWFkPjx0aD5Nb2R1bGU8L3RoPjx0aD5TZXJ2aWNlczwvdGg+IgotICAgICAgICAgPDwgIjx0aD5EYXRhIHR5cGVzPC90aD48dGg+Q29uc3RhbnRzPC90aD48L3RoZWFkPiIgPDwgZW5kbDsKLSAgZ2VuZXJhdGVfcHJvZ3JhbV90b2Nfcm93KHByb2dyYW1fKTsKLSAgZl9vdXRfIDw8ICI8L3RhYmxlPiIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBSZWN1cnNlcyB0aHJvdWdoIGZyb20gdGhlIHByb3ZpZGVkIHByb2dyYW0gYW5kIGdlbmVyYXRlcyBhIFRvQyByb3cKLSAqIGZvciBlYWNoIGRpc2NvdmVyZWQgcHJvZ3JhbSBleGFjdGx5IG9uY2UgYnkgbWFpbnRhaW5pbmcgdGhlIGxpc3Qgb2YKLSAqIGNvbXBsZXRlZCByb3dzIGluICdmaW5pc2hlZCcKLSAqLwotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9ncmFtX3RvY19yb3dzKHRfcHJvZ3JhbSogdHByb2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dF9wcm9ncmFtKj4mIGZpbmlzaGVkKSB7Ci0gIGZvciAodmVjdG9yPHRfcHJvZ3JhbSo+OjppdGVyYXRvciBpdGVyID0gZmluaXNoZWQuYmVnaW4oKTsgaXRlciAhPSBmaW5pc2hlZC5lbmQoKTsgaXRlcisrKSB7Ci0gICAgaWYgKHRwcm9nLT5nZXRfcGF0aCgpID09ICgqaXRlciktPmdldF9wYXRoKCkpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLSAgZmluaXNoZWQucHVzaF9iYWNrKHRwcm9nKTsKLSAgZ2VuZXJhdGVfcHJvZ3JhbV90b2Nfcm93KHRwcm9nKTsKLSAgdmVjdG9yPHRfcHJvZ3JhbSo+IGluY2x1ZGVzID0gdHByb2ctPmdldF9pbmNsdWRlcygpOwotICBmb3IgKHZlY3Rvcjx0X3Byb2dyYW0qPjo6aXRlcmF0b3IgaXRlciA9IGluY2x1ZGVzLmJlZ2luKCk7IGl0ZXIgIT0gaW5jbHVkZXMuZW5kKCk7IGl0ZXIrKykgewotICAgIGdlbmVyYXRlX3Byb2dyYW1fdG9jX3Jvd3MoKml0ZXIsIGZpbmlzaGVkKTsKLSAgfQotfQotCi0vKioKLSAqIEVtaXRzIHRoZSBUYWJsZSBvZiBDb250ZW50cyBsaW5rcyBhdCB0aGUgdG9wIG9mIHRoZSBtb2R1bGUncyBwYWdlCi0gKi8KLXZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvZ3JhbV90b2Nfcm93KHRfcHJvZ3JhbSogdHByb2cpIHsKLSAgc3RyaW5nIGZuYW1lID0gdHByb2ctPmdldF9uYW1lKCkgKyAiLmh0bWwiOwotICBmX291dF8gPDwgIjx0cj4iIDw8IGVuZGwgPDwgIjx0ZD4iIDw8IHRwcm9nLT5nZXRfbmFtZSgpIDw8ICI8L3RkPjx0ZD4iOwotICBpZiAoIXRwcm9nLT5nZXRfc2VydmljZXMoKS5lbXB0eSgpKSB7Ci0gICAgdmVjdG9yPHRfc2VydmljZSo+IHNlcnZpY2VzID0gdHByb2ctPmdldF9zZXJ2aWNlcygpOwotICAgIHZlY3Rvcjx0X3NlcnZpY2UqPjo6aXRlcmF0b3Igc3ZfaXRlcjsKLSAgICBmb3IgKHN2X2l0ZXIgPSBzZXJ2aWNlcy5iZWdpbigpOyBzdl9pdGVyICE9IHNlcnZpY2VzLmVuZCgpOyArK3N2X2l0ZXIpIHsKLSAgICAgIHN0cmluZyBuYW1lID0gZ2V0X3NlcnZpY2VfbmFtZSgqc3ZfaXRlcik7Ci0gICAgICBmX291dF8gPDwgIjxhIGhyZWY9XCIiIDw8IG1ha2VfZmlsZV9saW5rKGZuYW1lKSA8PCAiI1N2Y18iIDw8IG5hbWUgPDwgIlwiPiIgPDwgbmFtZQotICAgICAgICAgICAgIDw8ICI8L2E+PGJyLz4iIDw8IGVuZGw7Ci0gICAgICBmX291dF8gPDwgIjx1bD4iIDw8IGVuZGw7Ci0gICAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IGZuX2h0bWw7Ci0gICAgICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9ICgqc3ZfaXRlciktPmdldF9mdW5jdGlvbnMoKTsKLSAgICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZuX2l0ZXI7Ci0gICAgICBmb3IgKGZuX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZm5faXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZm5faXRlcikgewotICAgICAgICBzdHJpbmcgZm5fbmFtZSA9ICgqZm5faXRlciktPmdldF9uYW1lKCk7Ci0gICAgICAgIHN0cmluZyBodG1sID0gIjxsaT48YSBocmVmPVwiIiArIG1ha2VfZmlsZV9saW5rKGZuYW1lKSArICIjRm5fIiArIG5hbWUgKyAiXyIgKyBmbl9uYW1lCi0gICAgICAgICAgICAgICAgICAgICAgKyAiXCI+IiArIGZuX25hbWUgKyAiPC9hPjwvbGk+IjsKLSAgICAgICAgZm5faHRtbC5pbnNlcnQocGFpcjxzdHJpbmcsIHN0cmluZz4oZm5fbmFtZSwgaHRtbCkpOwotICAgICAgfQotICAgICAgZm9yIChtYXA8c3RyaW5nLCBzdHJpbmc+OjppdGVyYXRvciBodG1sX2l0ZXIgPSBmbl9odG1sLmJlZ2luKCk7IGh0bWxfaXRlciAhPSBmbl9odG1sLmVuZCgpOwotICAgICAgICAgICBodG1sX2l0ZXIrKykgewotICAgICAgICBmX291dF8gPDwgaHRtbF9pdGVyLT5zZWNvbmQgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGZfb3V0XyA8PCAiPC91bD4iIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0gIGZfb3V0XyA8PCAiPC90ZD4iIDw8IGVuZGwgPDwgIjx0ZD4iOwotICBtYXA8c3RyaW5nLCBzdHJpbmc+IGRhdGFfdHlwZXM7Ci0gIGlmICghdHByb2ctPmdldF9lbnVtcygpLmVtcHR5KCkpIHsKLSAgICB2ZWN0b3I8dF9lbnVtKj4gZW51bXMgPSB0cHJvZy0+Z2V0X2VudW1zKCk7Ci0gICAgdmVjdG9yPHRfZW51bSo+OjppdGVyYXRvciBlbl9pdGVyOwotICAgIGZvciAoZW5faXRlciA9IGVudW1zLmJlZ2luKCk7IGVuX2l0ZXIgIT0gZW51bXMuZW5kKCk7ICsrZW5faXRlcikgewotICAgICAgc3RyaW5nIG5hbWUgPSAoKmVuX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgLy8gZl9vdXRfIDw8ICI8YSBocmVmPVwiIiA8PCBtYWtlX2ZpbGVfbGluayhmbmFtZSkgPDwgIiNFbnVtXyIgPDwgbmFtZSA8PCAiXCI+IiA8PCBuYW1lCi0gICAgICAvLyA8PCAgIjwvYT48YnIvPiIgPDwgZW5kbDsKLSAgICAgIHN0cmluZyBodG1sID0gIjxhIGhyZWY9XCIiICsgbWFrZV9maWxlX2xpbmsoZm5hbWUpICsgIiNFbnVtXyIgKyBuYW1lICsgIlwiPiIgKyBuYW1lICsgIjwvYT4iOwotICAgICAgZGF0YV90eXBlcy5pbnNlcnQocGFpcjxzdHJpbmcsIHN0cmluZz4obmFtZSwgaHRtbCkpOwotICAgIH0KLSAgfQotICBpZiAoIXRwcm9nLT5nZXRfdHlwZWRlZnMoKS5lbXB0eSgpKSB7Ci0gICAgdmVjdG9yPHRfdHlwZWRlZio+IHR5cGVkZWZzID0gdHByb2ctPmdldF90eXBlZGVmcygpOwotICAgIHZlY3Rvcjx0X3R5cGVkZWYqPjo6aXRlcmF0b3IgdGRfaXRlcjsKLSAgICBmb3IgKHRkX2l0ZXIgPSB0eXBlZGVmcy5iZWdpbigpOyB0ZF9pdGVyICE9IHR5cGVkZWZzLmVuZCgpOyArK3RkX2l0ZXIpIHsKLSAgICAgIHN0cmluZyBuYW1lID0gKCp0ZF9pdGVyKS0+Z2V0X3N5bWJvbGljKCk7Ci0gICAgICAvLyBmX291dF8gPDwgIjxhIGhyZWY9XCIiIDw8IG1ha2VfZmlsZV9saW5rKGZuYW1lKSA8PCAiI1R5cGVkZWZfIiA8PCBuYW1lIDw8ICJcIj4iIDw8IG5hbWUKLSAgICAgIC8vIDw8ICI8L2E+PGJyLz4iIDw8IGVuZGw7Ci0gICAgICBzdHJpbmcgaHRtbCA9ICI8YSBocmVmPVwiIiArIG1ha2VfZmlsZV9saW5rKGZuYW1lKSArICIjVHlwZWRlZl8iICsgbmFtZSArICJcIj4iICsgbmFtZQotICAgICAgICAgICAgICAgICAgICArICI8L2E+IjsKLSAgICAgIGRhdGFfdHlwZXMuaW5zZXJ0KHBhaXI8c3RyaW5nLCBzdHJpbmc+KG5hbWUsIGh0bWwpKTsKLSAgICB9Ci0gIH0KLSAgaWYgKCF0cHJvZy0+Z2V0X29iamVjdHMoKS5lbXB0eSgpKSB7Ci0gICAgdmVjdG9yPHRfc3RydWN0Kj4gb2JqZWN0cyA9IHRwcm9nLT5nZXRfb2JqZWN0cygpOwotICAgIHZlY3Rvcjx0X3N0cnVjdCo+OjppdGVyYXRvciBvX2l0ZXI7Ci0gICAgZm9yIChvX2l0ZXIgPSBvYmplY3RzLmJlZ2luKCk7IG9faXRlciAhPSBvYmplY3RzLmVuZCgpOyArK29faXRlcikgewotICAgICAgc3RyaW5nIG5hbWUgPSAoKm9faXRlciktPmdldF9uYW1lKCk7Ci0gICAgICAvLyBmX291dF8gPDwgIjxhIGhyZWY9XCIiIDw8IG1ha2VfZmlsZV9saW5rKGZuYW1lKSA8PCAiI1N0cnVjdF8iIDw8IG5hbWUgPDwgIlwiPiIgPDwgbmFtZQotICAgICAgLy88PCAiPC9hPjxici8+IiA8PCBlbmRsOwotICAgICAgc3RyaW5nIGh0bWwgPSAiPGEgaHJlZj1cIiIgKyBtYWtlX2ZpbGVfbGluayhmbmFtZSkgKyAiI1N0cnVjdF8iICsgbmFtZSArICJcIj4iICsgbmFtZQotICAgICAgICAgICAgICAgICAgICArICI8L2E+IjsKLSAgICAgIGRhdGFfdHlwZXMuaW5zZXJ0KHBhaXI8c3RyaW5nLCBzdHJpbmc+KG5hbWUsIGh0bWwpKTsKLSAgICB9Ci0gIH0KLSAgZm9yIChtYXA8c3RyaW5nLCBzdHJpbmc+OjppdGVyYXRvciBkdF9pdGVyID0gZGF0YV90eXBlcy5iZWdpbigpOyBkdF9pdGVyICE9IGRhdGFfdHlwZXMuZW5kKCk7Ci0gICAgICAgZHRfaXRlcisrKSB7Ci0gICAgZl9vdXRfIDw8IGR0X2l0ZXItPnNlY29uZCA8PCAiPGJyLz4iIDw8IGVuZGw7Ci0gIH0KLSAgZl9vdXRfIDw8ICI8L3RkPiIgPDwgZW5kbCA8PCAiPHRkPiI7Ci0gIGlmICghdHByb2ctPmdldF9jb25zdHMoKS5lbXB0eSgpKSB7Ci0gICAgbWFwPHN0cmluZywgc3RyaW5nPiBjb25zdF9odG1sOwotICAgIHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzID0gdHByb2ctPmdldF9jb25zdHMoKTsKLSAgICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjb25faXRlcjsKLSAgICBmb3IgKGNvbl9pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNvbl9pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjb25faXRlcikgewotICAgICAgc3RyaW5nIG5hbWUgPSAoKmNvbl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgIHN0cmluZyBodG1sID0gIjxjb2RlPjxhIGhyZWY9XCIiICsgbWFrZV9maWxlX2xpbmsoZm5hbWUpICsgIiNDb25zdF8iICsgbmFtZSArICJcIj4iICsgbmFtZQotICAgICAgICAgICAgICAgICAgICArICI8L2E+PC9jb2RlPiI7Ci0gICAgICBjb25zdF9odG1sLmluc2VydChwYWlyPHN0cmluZywgc3RyaW5nPihuYW1lLCBodG1sKSk7Ci0gICAgfQotICAgIGZvciAobWFwPHN0cmluZywgc3RyaW5nPjo6aXRlcmF0b3IgY29uX2l0ZXIgPSBjb25zdF9odG1sLmJlZ2luKCk7IGNvbl9pdGVyICE9IGNvbnN0X2h0bWwuZW5kKCk7Ci0gICAgICAgICBjb25faXRlcisrKSB7Ci0gICAgICBmX291dF8gPDwgY29uX2l0ZXItPnNlY29uZCA8PCAiPGJyLz4iIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0gIGZfb3V0XyA8PCAiPC9jb2RlPjwvdGQ+IiA8PCBlbmRsIDw8ICI8L3RyPiI7Ci19Ci0KLS8qKgotICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKLSAqIHN0cmVhbS4KLSAqLwotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9ncmFtKCkgewotICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKLSAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKLSAgY3VycmVudF9maWxlXyA9IHByb2dyYW1fLT5nZXRfbmFtZSgpICsgIi5odG1sIjsKLSAgc3RyaW5nIGZuYW1lID0gZ2V0X291dF9kaXIoKSArIGN1cnJlbnRfZmlsZV87Ci0gIGZfb3V0Xy5vcGVuKGZuYW1lLmNfc3RyKCkpOwotICBmX291dF8gPDwgIjwhRE9DVFlQRSBodG1sIFBVQkxJQyBcIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOXCIiIDw8IGVuZGw7Ci0gIGZfb3V0XyA8PCAiICAgIFwiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZFwiPiIgPDwgZW5kbDsKLSAgZl9vdXRfIDw8ICI8aHRtbCB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWxcIj4iIDw8IGVuZGw7Ci0gIGZfb3V0XyA8PCAiPGhlYWQ+IiA8PCBlbmRsOwotICBmX291dF8gPDwgIjxtZXRhIGh0dHAtZXF1aXY9XCJDb250ZW50LVR5cGVcIiBjb250ZW50PVwidGV4dC9odG1sO2NoYXJzZXQ9dXRmLThcIiAvPiIgPDwgZW5kbDsKLSAgZ2VuZXJhdGVfc3R5bGVfdGFnKCk7Ci0gIGZfb3V0XyA8PCAiPHRpdGxlPlRocmlmdCBtb2R1bGU6ICIgPDwgcHJvZ3JhbV8tPmdldF9uYW1lKCkgPDwgIjwvdGl0bGU+PC9oZWFkPjxib2R5PiIgPDwgZW5kbAotICAgICAgICAgPDwgIjxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj4iIDw8IGVuZGwKLSAgICAgICAgIDw8ICI8aDE+VGhyaWZ0IG1vZHVsZTogIiA8PCBwcm9ncmFtXy0+Z2V0X25hbWUoKSA8PCAiPC9oMT4iIDw8IGVuZGw7Ci0KLSAgcHJpbnRfZG9jKHByb2dyYW1fKTsKLQotICBnZW5lcmF0ZV9wcm9ncmFtX3RvYygpOwotCi0gIGlmICghcHJvZ3JhbV8tPmdldF9jb25zdHMoKS5lbXB0eSgpKSB7Ci0gICAgZl9vdXRfIDw8ICI8aHIvPjxoMiBpZD1cIkNvbnN0YW50c1wiPkNvbnN0YW50czwvaDI+IiA8PCBlbmRsOwotICAgIHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzID0gcHJvZ3JhbV8tPmdldF9jb25zdHMoKTsKLSAgICBmX291dF8gPDwgIjx0YWJsZSBjbGFzcz1cInRhYmxlLWJvcmRlcmVkIHRhYmxlLXN0cmlwZWQgdGFibGUtY29uZGVuc2VkXCI+IjsKLSAgICBmX291dF8gPDwgIjx0aGVhZD48dGg+Q29uc3RhbnQ8L3RoPjx0aD5UeXBlPC90aD48dGg+VmFsdWU8L3RoPjwvdGhlYWQ+IiA8PCBlbmRsOwotICAgIGdlbmVyYXRlX2NvbnN0cyhjb25zdHMpOwotICAgIGZfb3V0XyA8PCAiPC90YWJsZT4iOwotICB9Ci0KLSAgaWYgKCFwcm9ncmFtXy0+Z2V0X2VudW1zKCkuZW1wdHkoKSkgewotICAgIGZfb3V0XyA8PCAiPGhyLz48aDIgaWQ9XCJFbnVtZXJhdGlvbnNcIj5FbnVtZXJhdGlvbnM8L2gyPiIgPDwgZW5kbDsKLSAgICAvLyBHZW5lcmF0ZSBlbnVtcwotICAgIHZlY3Rvcjx0X2VudW0qPiBlbnVtcyA9IHByb2dyYW1fLT5nZXRfZW51bXMoKTsKLSAgICB2ZWN0b3I8dF9lbnVtKj46Oml0ZXJhdG9yIGVuX2l0ZXI7Ci0gICAgZm9yIChlbl9pdGVyID0gZW51bXMuYmVnaW4oKTsgZW5faXRlciAhPSBlbnVtcy5lbmQoKTsgKytlbl9pdGVyKSB7Ci0gICAgICBnZW5lcmF0ZV9lbnVtKCplbl9pdGVyKTsKLSAgICB9Ci0gIH0KLQotICBpZiAoIXByb2dyYW1fLT5nZXRfdHlwZWRlZnMoKS5lbXB0eSgpKSB7Ci0gICAgZl9vdXRfIDw8ICI8aHIvPjxoMiBpZD1cIlR5cGVkZWZzXCI+VHlwZSBkZWNsYXJhdGlvbnM8L2gyPiIgPDwgZW5kbDsKLSAgICAvLyBHZW5lcmF0ZSB0eXBlZGVmcwotICAgIHZlY3Rvcjx0X3R5cGVkZWYqPiB0eXBlZGVmcyA9IHByb2dyYW1fLT5nZXRfdHlwZWRlZnMoKTsKLSAgICB2ZWN0b3I8dF90eXBlZGVmKj46Oml0ZXJhdG9yIHRkX2l0ZXI7Ci0gICAgZm9yICh0ZF9pdGVyID0gdHlwZWRlZnMuYmVnaW4oKTsgdGRfaXRlciAhPSB0eXBlZGVmcy5lbmQoKTsgKyt0ZF9pdGVyKSB7Ci0gICAgICBnZW5lcmF0ZV90eXBlZGVmKCp0ZF9pdGVyKTsKLSAgICB9Ci0gIH0KLQotICBpZiAoIXByb2dyYW1fLT5nZXRfb2JqZWN0cygpLmVtcHR5KCkpIHsKLSAgICBmX291dF8gPDwgIjxoci8+PGgyIGlkPVwiU3RydWN0c1wiPkRhdGEgc3RydWN0dXJlczwvaDI+IiA8PCBlbmRsOwotICAgIC8vIEdlbmVyYXRlIHN0cnVjdHMgYW5kIGV4Y2VwdGlvbnMgaW4gZGVjbGFyZWQgb3JkZXIKLSAgICB2ZWN0b3I8dF9zdHJ1Y3QqPiBvYmplY3RzID0gcHJvZ3JhbV8tPmdldF9vYmplY3RzKCk7Ci0gICAgdmVjdG9yPHRfc3RydWN0Kj46Oml0ZXJhdG9yIG9faXRlcjsKLSAgICBmb3IgKG9faXRlciA9IG9iamVjdHMuYmVnaW4oKTsgb19pdGVyICE9IG9iamVjdHMuZW5kKCk7ICsrb19pdGVyKSB7Ci0gICAgICBpZiAoKCpvX2l0ZXIpLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICAgIGdlbmVyYXRlX3hjZXB0aW9uKCpvX2l0ZXIpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZ2VuZXJhdGVfc3RydWN0KCpvX2l0ZXIpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGlmICghcHJvZ3JhbV8tPmdldF9zZXJ2aWNlcygpLmVtcHR5KCkpIHsKLSAgICBmX291dF8gPDwgIjxoci8+PGgyIGlkPVwiU2VydmljZXNcIj5TZXJ2aWNlczwvaDI+IiA8PCBlbmRsOwotICAgIC8vIEdlbmVyYXRlIHNlcnZpY2VzCi0gICAgdmVjdG9yPHRfc2VydmljZSo+IHNlcnZpY2VzID0gcHJvZ3JhbV8tPmdldF9zZXJ2aWNlcygpOwotICAgIHZlY3Rvcjx0X3NlcnZpY2UqPjo6aXRlcmF0b3Igc3ZfaXRlcjsKLSAgICBmb3IgKHN2X2l0ZXIgPSBzZXJ2aWNlcy5iZWdpbigpOyBzdl9pdGVyICE9IHNlcnZpY2VzLmVuZCgpOyArK3N2X2l0ZXIpIHsKLSAgICAgIHNlcnZpY2VfbmFtZV8gPSBnZXRfc2VydmljZV9uYW1lKCpzdl9pdGVyKTsKLSAgICAgIGdlbmVyYXRlX3NlcnZpY2UoKnN2X2l0ZXIpOwotICAgIH0KLSAgfQotCi0gIGZfb3V0XyA8PCAiPC9kaXY+PC9ib2R5PjwvaHRtbD4iIDw8IGVuZGw7Ci0gIGZfb3V0Xy5jbG9zZSgpOwotCi0gIGdlbmVyYXRlX2luZGV4KCk7Ci0gIGdlbmVyYXRlX2NzcygpOwotfQotCi0vKioKLSAqIEVtaXRzIHRoZSBpbmRleC5odG1sIGZpbGUgZm9yIHRoZSByZWN1cnNpdmUgc2V0IG9mIFRocmlmdCBwcm9ncmFtcwotICovCi12b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2luZGV4KCkgewotICBjdXJyZW50X2ZpbGVfID0gImluZGV4Lmh0bWwiOwotICBzdHJpbmcgaW5kZXhfZm5hbWUgPSBnZXRfb3V0X2RpcigpICsgY3VycmVudF9maWxlXzsKLSAgZl9vdXRfLm9wZW4oaW5kZXhfZm5hbWUuY19zdHIoKSk7Ci0gIGZfb3V0XyA8PCAiPGh0bWw+PGhlYWQ+IiA8PCBlbmRsOwotICBnZW5lcmF0ZV9zdHlsZV90YWcoKTsKLSAgZl9vdXRfIDw8ICI8dGl0bGU+QWxsIFRocmlmdCBkZWNsYXJhdGlvbnM8L3RpdGxlPjwvaGVhZD48Ym9keT4iIDw8IGVuZGwKLSAgICAgICAgIDw8ICI8ZGl2IGNsYXNzPVwiY29udGFpbmVyLWZsdWlkXCI+IiA8PCBlbmRsIDw8ICI8aDE+QWxsIFRocmlmdCBkZWNsYXJhdGlvbnM8L2gxPiIgPDwgZW5kbDsKLSAgZl9vdXRfIDw8ICI8dGFibGUgY2xhc3M9XCJ0YWJsZS1ib3JkZXJlZCB0YWJsZS1zdHJpcGVkICIKLSAgICAgICAgICAgICJ0YWJsZS1jb25kZW5zZWRcIj48dGhlYWQ+PHRoPk1vZHVsZTwvdGg+PHRoPlNlcnZpY2VzPC90aD48dGg+RGF0YSB0eXBlczwvdGg+IgotICAgICAgICAgPDwgIjx0aD5Db25zdGFudHM8L3RoPjwvdGhlYWQ+IiA8PCBlbmRsOwotICB2ZWN0b3I8dF9wcm9ncmFtKj4gcHJvZ3JhbXM7Ci0gIGdlbmVyYXRlX3Byb2dyYW1fdG9jX3Jvd3MocHJvZ3JhbV8sIHByb2dyYW1zKTsKLSAgZl9vdXRfIDw8ICI8L3RhYmxlPiIgPDwgZW5kbDsKLSAgZl9vdXRfIDw8ICI8L2Rpdj48L2JvZHk+PC9odG1sPiIgPDwgZW5kbDsKLSAgZl9vdXRfLmNsb3NlKCk7Ci19Ci0KLXZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NzKCkgewotICBpZiAoIXN0YW5kYWxvbmVfKSB7Ci0gICAgY3VycmVudF9maWxlXyA9ICJzdHlsZS5jc3MiOwotICAgIHN0cmluZyBjc3NfZm5hbWUgPSBnZXRfb3V0X2RpcigpICsgY3VycmVudF9maWxlXzsKLSAgICBmX291dF8ub3Blbihjc3NfZm5hbWUuY19zdHIoKSk7Ci0gICAgZ2VuZXJhdGVfY3NzX2NvbnRlbnQoZl9vdXRfKTsKLSAgICBmX291dF8uY2xvc2UoKTsKLSAgfQotfQotCi12b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Nzc19jb250ZW50KHN0ZDo6b2ZzdHJlYW0mIGZfdGFyZ2V0KSB7Ci0gIGZfdGFyZ2V0IDw8IEJPT1RTVFJBUF9DU1MoKSA8PCBlbmRsOwotICBmX3RhcmdldCA8PCAiLyogQXV0by1nZW5lcmF0ZWQgQ1NTIGZvciBnZW5lcmF0ZWQgVGhyaWZ0IGRvY3MgKi8iIDw8IGVuZGw7Ci0gIGZfdGFyZ2V0IDw8ICJoMywgaDQgeyBtYXJnaW4tYm90dG9tOiA2cHg7IH0iIDw8IGVuZGw7Ci0gIGZfdGFyZ2V0IDw8ICJkaXYuZGVmaW5pdGlvbiB7IGJvcmRlcjogMXB4IHNvbGlkICNDQ0M7IG1hcmdpbi1ib3R0b206IDEwcHg7IHBhZGRpbmc6IDEwcHg7IH0iCi0gICAgICAgICAgIDw8IGVuZGw7Ci0gIGZfdGFyZ2V0IDw8ICJkaXYuZXh0ZW5kcyB7IG1hcmdpbjogLTAuNWVtIDAgMWVtIDVlbSB9IiA8PCBlbmRsOwotICBmX3RhcmdldCA8PCAidGQgeyB2ZXJ0aWNhbC1hbGlnbjogdG9wOyB9IiA8PCBlbmRsOwotICBmX3RhcmdldCA8PCAidGFibGUgeyBlbXB0eS1jZWxsczogc2hvdzsgfSIgPDwgZW5kbDsKLSAgZl90YXJnZXQgPDwgImNvZGUgeyBsaW5lLWhlaWdodDogMjBweDsgfSIgPDwgZW5kbDsKLSAgZl90YXJnZXQgPDwgIi50YWJsZS1ib3JkZXJlZCB0aCwgLnRhYmxlLWJvcmRlcmVkIHRkIHsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNEREREREQ7IH0iCi0gICAgICAgICAgIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSBDU1MgdGFnLgotICogRGVwZW5kaW5nIG9uICJzdGFuZGFsb25lIiwgZWl0aGVyIGEgQ1NTIGZpbGUgbGluayAoZGVmYXVsdCksIG9yIHRoZSBlbnRpcmUgQ1NTIGlzIGVtYmVkZGVkCi0gKiBpbmxpbmUuCi0gKi8KLXZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3R5bGVfdGFnKCkgewotICBpZiAoIXN0YW5kYWxvbmVfKSB7Ci0gICAgZl9vdXRfIDw8ICI8bGluayBocmVmPVwic3R5bGUuY3NzXCIgcmVsPVwic3R5bGVzaGVldFwiIHR5cGU9XCJ0ZXh0L2Nzc1wiLz4iIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgZl9vdXRfIDw8ICI8c3R5bGUgdHlwZT1cInRleHQvY3NzXCIvPjwhLS0iIDw8IGVuZGw7Ci0gICAgZ2VuZXJhdGVfY3NzX2NvbnRlbnQoZl9vdXRfKTsKLSAgICBmX291dF8gPDwgIi0tPjwvc3R5bGU+IiA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogUmV0dXJucyB0aGUgdGFyZ2V0IGZpbGUgZm9yIGEgPGEgaHJlZj4gbGluawotICogVGhlIHJldHVybmVkIHN0cmluZyBpcyBlbXB0eSwgd2hlbmV2ZXIgZmlsZW5hbWUgcmVmZXJzIHRvIHRoZSBjdXJyZW50IGZpbGUuCi0gKi8KLXN0ZDo6c3RyaW5nIHRfaHRtbF9nZW5lcmF0b3I6Om1ha2VfZmlsZV9saW5rKHN0ZDo6c3RyaW5nIGZpbGVuYW1lKSB7Ci0gIHJldHVybiAoY3VycmVudF9maWxlXy5jb21wYXJlKGZpbGVuYW1lKSAhPSAwKSA/IGZpbGVuYW1lIDogIiI7Ci19Ci0KLS8qKgotICogSWYgdGhlIHByb3ZpZGVkIGRvY3VtZW50YWJsZSBvYmplY3QgaGFzIGRvY3VtZW50YXRpb24gYXR0YWNoZWQsIHRoaXMKLSAqIHdpbGwgZW1pdCBpdCB0byB0aGUgb3V0cHV0IHN0cmVhbSBpbiBIVE1MIGZvcm1hdC4KLSAqLwotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpwcmludF9kb2ModF9kb2MqIHRkb2MpIHsKLSAgaWYgKHRkb2MtPmhhc19kb2MoKSkgewotICAgIGlmICh1bnNhZmVfKSB7Ci0gICAgICBmX291dF8gPDwgdGRvYy0+Z2V0X2RvYygpIDw8ICI8YnIvPiI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfb3V0XyA8PCBlc2NhcGVfaHRtbCh0ZG9jLT5nZXRfZG9jKCkpIDw8ICI8YnIvPiI7Ci0gICAgfQotICB9Ci19Ci0KLWJvb2wgdF9odG1sX2dlbmVyYXRvcjo6aXNfdXRmOF9zZXF1ZW5jZShzdGQ6OnN0cmluZyBjb25zdCYgc3RyLCBzaXplX3QgZmlyc3Rwb3MpIHsKLSAgLy8gbGVhZGluZyBjaGFyIGRldGVybWluZXMgdGhlIGxlbmd0aCBvZiB0aGUgc2VxdWVuY2UKLSAgdW5zaWduZWQgY2hhciBjID0gc3RyLmF0KGZpcnN0cG9zKTsKLSAgaW50IGNvdW50ID0gMDsKLSAgaWYgKChjICYgMHhFMCkgPT0gMHhDMCkgewotICAgIGNvdW50ID0gMTsKLSAgfSBlbHNlIGlmICgoYyAmIDB4RjApID09IDB4RTApIHsKLSAgICBjb3VudCA9IDI7Ci0gIH0gZWxzZSBpZiAoKGMgJiAweEY4KSA9PSAweEYwKSB7Ci0gICAgY291bnQgPSAzOwotICB9IGVsc2UgaWYgKChjICYgMHhGQykgPT0gMHhGOCkgewotICAgIGNvdW50ID0gNDsKLSAgfSBlbHNlIGlmICgoYyAmIDB4RkUpID09IDB4RkMpIHsKLSAgICBjb3VudCA9IDU7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gcGRlYnVnKCJVVEYtOCB0ZXN0OiBjaGFyICclYycgKCVkKSBpcyBub3QgYSB2YWxpZCBVVEYtOCBsZWFkaW5nIGJ5dGUiLCBjLCBpbnQoYykpOwotICAgIHJldHVybiBmYWxzZTsgLy8gbm8gVVRGLTgKLSAgfQotCi0gIC8vIGZvbGxvd2luZyBjaGFycwotICBzaXplX3QgcG9zID0gZmlyc3Rwb3MgKyAxOwotICB3aGlsZSAoKHBvcyA8IHN0ci5sZW5ndGgoKSkgJiYgKDAgPCBjb3VudCkpIHsKLSAgICBjID0gc3RyLmF0KHBvcyk7Ci0gICAgaWYgKChjICYgMHhDMCkgIT0gMHg4MCkgewotICAgICAgLy8gcGRlYnVnKCJVVEYtOCB0ZXN0OiBjaGFyICclYycgKCVkKSBpcyBub3QgYSB2YWxpZCBVVEYtOCBmb2xsb3dpbmcgYnl0ZSIsIGMsIGludChjKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7IC8vIG5vIFVURi04Ci0gICAgfQotICAgIC0tY291bnQ7Ci0gICAgKytwb3M7Ci0gIH0KLQotICAvLyB0cnVlIGlmIHRoZSBzZXF1ZW5jZSBpcyBjb21wbGV0ZQotICByZXR1cm4gKDAgPT0gY291bnQpOwotfQotCi12b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmRldGVjdF9pbnB1dF9lbmNvZGluZyhzdGQ6OnN0cmluZyBjb25zdCYgc3RyLCBzaXplX3QgZmlyc3Rwb3MpIHsKLSAgaWYgKGlzX3V0Zjhfc2VxdWVuY2Uoc3RyLCBmaXJzdHBvcykpIHsKLSAgICBwZGVidWcoIklucHV0IHNlZW1zIHRvIGJlIGFscmVhZHkgVVRGLTggZW5jb2RlZCIpOwotICAgIGlucHV0X3R5cGVfID0gSU5QVVRfVVRGODsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBmYWxsYmFjawotICBwd2FybmluZygxLCAiSW5wdXQgaXMgbm90IFVURi04LCB0cmVhdGluZyBhcyBwbGFpbiBBTlNJIik7Ci0gIGlucHV0X3R5cGVfID0gSU5QVVRfUExBSU47Ci19Ci0KLXZvaWQgdF9odG1sX2dlbmVyYXRvcjo6aW5pdF9hbGxvd2VkX19tYXJrdXAoKSB7Ci0gIGFsbG93ZWRfbWFya3VwLmNsZWFyKCk7Ci0gIC8vIHN0YW5kYWxvbmUgdGFncwotICBhbGxvd2VkX21hcmt1cFsiYnIiXSA9IDE7Ci0gIGFsbG93ZWRfbWFya3VwWyJici8iXSA9IDE7Ci0gIGFsbG93ZWRfbWFya3VwWyJpbWciXSA9IDE7Ci0gIC8vIHBhaXJlZCB0YWdzCi0gIGFsbG93ZWRfbWFya3VwWyJiIl0gPSAxOwotICBhbGxvd2VkX21hcmt1cFsiL2IiXSA9IDE7Ci0gIGFsbG93ZWRfbWFya3VwWyJ1Il0gPSAxOwotICBhbGxvd2VkX21hcmt1cFsiL3UiXSA9IDE7Ci0gIGFsbG93ZWRfbWFya3VwWyJpIl0gPSAxOwotICBhbGxvd2VkX21hcmt1cFsiL2kiXSA9IDE7Ci0gIGFsbG93ZWRfbWFya3VwWyJzIl0gPSAxOwotICBhbGxvd2VkX21hcmt1cFsiL3MiXSA9IDE7Ci0gIGFsbG93ZWRfbWFya3VwWyJiaWciXSA9IDE7Ci0gIGFsbG93ZWRfbWFya3VwWyIvYmlnIl0gPSAxOwotICBhbGxvd2VkX21hcmt1cFsic21hbGwiXSA9IDE7Ci0gIGFsbG93ZWRfbWFya3VwWyIvc21hbGwiXSA9IDE7Ci0gIGFsbG93ZWRfbWFya3VwWyJzdXAiXSA9IDE7Ci0gIGFsbG93ZWRfbWFya3VwWyIvc3VwIl0gPSAxOwotICBhbGxvd2VkX21hcmt1cFsic3ViIl0gPSAxOwotICBhbGxvd2VkX21hcmt1cFsiL3N1YiJdID0gMTsKLSAgYWxsb3dlZF9tYXJrdXBbInByZSJdID0gMTsKLSAgYWxsb3dlZF9tYXJrdXBbIi9wcmUiXSA9IDE7Ci0gIGFsbG93ZWRfbWFya3VwWyJ0dCJdID0gMTsKLSAgYWxsb3dlZF9tYXJrdXBbIi90dCJdID0gMTsKLSAgYWxsb3dlZF9tYXJrdXBbInVsIl0gPSAxOwotICBhbGxvd2VkX21hcmt1cFsiL3VsIl0gPSAxOwotICBhbGxvd2VkX21hcmt1cFsib2wiXSA9IDE7Ci0gIGFsbG93ZWRfbWFya3VwWyIvb2wiXSA9IDE7Ci0gIGFsbG93ZWRfbWFya3VwWyJsaSJdID0gMTsKLSAgYWxsb3dlZF9tYXJrdXBbIi9saSJdID0gMTsKLSAgYWxsb3dlZF9tYXJrdXBbImEiXSA9IDE7Ci0gIGFsbG93ZWRfbWFya3VwWyIvYSJdID0gMTsKLSAgYWxsb3dlZF9tYXJrdXBbInAiXSA9IDE7Ci0gIGFsbG93ZWRfbWFya3VwWyIvcCJdID0gMTsKLSAgYWxsb3dlZF9tYXJrdXBbImNvZGUiXSA9IDE7Ci0gIGFsbG93ZWRfbWFya3VwWyIvY29kZSJdID0gMTsKLSAgYWxsb3dlZF9tYXJrdXBbImRsIl0gPSAxOwotICBhbGxvd2VkX21hcmt1cFsiL2RsIl0gPSAxOwotICBhbGxvd2VkX21hcmt1cFsiZHQiXSA9IDE7Ci0gIGFsbG93ZWRfbWFya3VwWyIvZHQiXSA9IDE7Ci0gIGFsbG93ZWRfbWFya3VwWyJkZCJdID0gMTsKLSAgYWxsb3dlZF9tYXJrdXBbIi9kZCJdID0gMTsKLSAgYWxsb3dlZF9tYXJrdXBbImgxIl0gPSAxOwotICBhbGxvd2VkX21hcmt1cFsiL2gxIl0gPSAxOwotICBhbGxvd2VkX21hcmt1cFsiaDIiXSA9IDE7Ci0gIGFsbG93ZWRfbWFya3VwWyIvaDIiXSA9IDE7Ci0gIGFsbG93ZWRfbWFya3VwWyJoMyJdID0gMTsKLSAgYWxsb3dlZF9tYXJrdXBbIi9oMyJdID0gMTsKLSAgYWxsb3dlZF9tYXJrdXBbImg0Il0gPSAxOwotICBhbGxvd2VkX21hcmt1cFsiL2g0Il0gPSAxOwotICBhbGxvd2VkX21hcmt1cFsiaDUiXSA9IDE7Ci0gIGFsbG93ZWRfbWFya3VwWyIvaDUiXSA9IDE7Ci0gIGFsbG93ZWRfbWFya3VwWyJoNiJdID0gMTsKLSAgYWxsb3dlZF9tYXJrdXBbIi9oNiJdID0gMTsKLX0KLQotc3RkOjpzdHJpbmcgdF9odG1sX2dlbmVyYXRvcjo6ZXNjYXBlX2h0bWxfdGFncyhzdGQ6OnN0cmluZyBjb25zdCYgc3RyKSB7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSByZXN1bHQ7Ci0KLSAgdW5zaWduZWQgY2hhciBjID0gJz8nOwotICBzaXplX3QgbGFzdHBvczsKLSAgc2l6ZV90IGZpcnN0cG9zID0gMDsKLSAgd2hpbGUgKGZpcnN0cG9zIDwgc3RyLmxlbmd0aCgpKSB7Ci0KLSAgICAvLyBsb29rIGZvciBub24tQVNDSUkgY2hhcgotICAgIGxhc3Rwb3MgPSBmaXJzdHBvczsKLSAgICB3aGlsZSAobGFzdHBvcyA8IHN0ci5sZW5ndGgoKSkgewotICAgICAgYyA9IHN0ci5hdChsYXN0cG9zKTsKLSAgICAgIGlmICgoJzwnID09IGMpIHx8ICgnPicgPT0gYykpIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICArK2xhc3Rwb3M7Ci0gICAgfQotCi0gICAgLy8gY29weSB3aGF0IHdlIGdvdCBzbyBmYXIKLSAgICBpZiAobGFzdHBvcyA+IGZpcnN0cG9zKSB7Ci0gICAgICByZXN1bHQgPDwgc3RyLnN1YnN0cihmaXJzdHBvcywgbGFzdHBvcyAtIGZpcnN0cG9zKTsKLSAgICAgIGZpcnN0cG9zID0gbGFzdHBvczsKLSAgICB9Ci0KLSAgICAvLyByZWFjaGVkIHRoZSBlbmQ/Ci0gICAgaWYgKGZpcnN0cG9zID49IHN0ci5sZW5ndGgoKSkgewotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLy8gdGFnIGVuZCB3aXRob3V0IGNvcnJlc3BvbmRpbmcgYmVnaW4KLSAgICArK2ZpcnN0cG9zOwotICAgIGlmICgnPicgPT0gYykgewotICAgICAgcmVzdWx0IDw8ICImZ3Q7IjsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIC8vIGV4dHJhY3QgdGhlIHRhZwotICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSB0YWdzdHJlYW07Ci0gICAgd2hpbGUgKGZpcnN0cG9zIDwgc3RyLmxlbmd0aCgpKSB7Ci0gICAgICBjID0gc3RyLmF0KGZpcnN0cG9zKTsKLSAgICAgICsrZmlyc3Rwb3M7Ci0gICAgICBpZiAoJzwnID09IGMpIHsKLSAgICAgICAgdGFnc3RyZWFtIDw8ICImbHQ7IjsgLy8gbmVzdGVkIGJlZ2luPwotICAgICAgfSBlbHNlIGlmICgnPicgPT0gYykgewotICAgICAgICBicmVhazsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRhZ3N0cmVhbSA8PCBjOyAvLyBub3QgdmVyeSBlZmZpY2llbnQsIGJ1dCB0YWdzIHNob3VsZCBiZSBxdWl0ZSBzaG9ydAotICAgICAgfQotICAgIH0KLQotICAgIC8vIHdlIGFsbG93IGZvciBzZXZlcmFsIG1hcmt1cCBpbiBkb2NzdHJpbmdzLCBhbGwgZWxzZSB3aWxsIGJlY29tZSBlc2NhcGVkCi0gICAgc3RyaW5nIHRhZ19jb250ZW50ID0gdGFnc3RyZWFtLnN0cigpOwotICAgIHN0cmluZyB0YWdfa2V5ID0gdGFnX2NvbnRlbnQ7Ci0gICAgc2l6ZV90IGZpcnN0X3doaXRlID0gdGFnX2tleS5maW5kX2ZpcnN0X29mKCIgXHRcZlx2XG5cciIpOwotICAgIGlmIChmaXJzdF93aGl0ZSAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICAgIHRhZ19rZXkuZXJhc2UoZmlyc3Rfd2hpdGUpOwotICAgIH0KLSAgICBmb3IgKHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgaSA9IDA7IGkgPCB0YWdfa2V5Lmxlbmd0aCgpOyArK2kpIHsKLSAgICAgIHRhZ19rZXlbaV0gPSB0b2xvd2VyKHRhZ19rZXlbaV0pOwotICAgIH0KLSAgICBpZiAoYWxsb3dlZF9tYXJrdXAuZmluZCh0YWdfa2V5KSAhPSBhbGxvd2VkX21hcmt1cC5lbmQoKSkgewotICAgICAgcmVzdWx0IDw8ICI8IiA8PCB0YWdfY29udGVudCA8PCAiPiI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCA8PCAiJmx0OyIgPDwgdGFnc3RyZWFtLnN0cigpIDw8ICImZ3Q7IjsKLSAgICAgIHB2ZXJib3NlKCJpbGxlZ2FsIG1hcmt1cCA8JXM+IGluIGRvYy1jb21tZW50XG4iLCB0YWdfa2V5LmNfc3RyKCkpOwotICAgIH0KLSAgfQotCi0gIHJldHVybiByZXN1bHQuc3RyKCk7Ci19Ci0KLXN0ZDo6c3RyaW5nIHRfaHRtbF9nZW5lcmF0b3I6OmVzY2FwZV9odG1sKHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIpIHsKLSAgLy8gdGhlIGdlbmVyYXRlZCBIVE1MIGhlYWRlciBzYXlzIGl0IGlzIFVURi04IGVuY29kZWQKLSAgLy8gaWYgVVRGLTggaW5wdXQgaGFzIGJlZW4gZGV0ZWN0ZWQgYmVmb3JlLCB3ZSBkb24ndCBuZWVkIHRvIGNoYW5nZSBhbnl0aGluZwotICBpZiAoaW5wdXRfdHlwZV8gPT0gSU5QVVRfVVRGOCkgewotICAgIHJldHVybiBlc2NhcGVfaHRtbF90YWdzKHN0cik7Ci0gIH0KLQotICAvLyBjb252ZXJ0IHVuc2FmZSBjaGFycyB0byB0aGVpciAmIzxudW0+OyBlcXVpdmFsZW50Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSByZXN1bHQ7Ci0gIHVuc2lnbmVkIGNoYXIgYyA9ICc/JzsKLSAgdW5zaWduZWQgaW50IGljID0gMDsKLSAgc2l6ZV90IGxhc3Rwb3M7Ci0gIHNpemVfdCBmaXJzdHBvcyA9IDA7Ci0gIHdoaWxlIChmaXJzdHBvcyA8IHN0ci5sZW5ndGgoKSkgewotCi0gICAgLy8gbG9vayBmb3Igbm9uLUFTQ0lJIGNoYXIKLSAgICBsYXN0cG9zID0gZmlyc3Rwb3M7Ci0gICAgd2hpbGUgKGxhc3Rwb3MgPCBzdHIubGVuZ3RoKCkpIHsKLSAgICAgIGMgPSBzdHIuYXQobGFzdHBvcyk7Ci0gICAgICBpYyA9IGM7Ci0gICAgICBpZiAoKDMyID4gaWMpIHx8ICgxMjcgPCBpYykpIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICArK2xhc3Rwb3M7Ci0gICAgfQotCi0gICAgLy8gY29weSB3aGF0IHdlIGdvdCBzbyBmYXIKLSAgICBpZiAobGFzdHBvcyA+IGZpcnN0cG9zKSB7Ci0gICAgICByZXN1bHQgPDwgc3RyLnN1YnN0cihmaXJzdHBvcywgbGFzdHBvcyAtIGZpcnN0cG9zKTsKLSAgICAgIGZpcnN0cG9zID0gbGFzdHBvczsKLSAgICB9Ci0KLSAgICAvLyByZWFjaGVkIHRoZSBlbmQ/Ci0gICAgaWYgKGZpcnN0cG9zID49IHN0ci5sZW5ndGgoKSkgewotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLy8gc29tZSBjb250cm9sIGNvZGU/Ci0gICAgaWYgKGljIDw9IDMxKSB7Ci0gICAgICBzd2l0Y2ggKGMpIHsKLSAgICAgIGNhc2UgJ1xyJzoKLSAgICAgIGNhc2UgJ1xuJzoKLSAgICAgIGNhc2UgJ1x0JzoKLSAgICAgICAgcmVzdWx0IDw8IGM7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDogLy8gc2lsZW50bHkgY29uc3VtZSBhbGwgb3RoZXIgY3RybCBjaGFycwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgICsrZmlyc3Rwb3M7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICAvLyByZWFjaGVkIHRoZSBlbmQ/Ci0gICAgaWYgKGZpcnN0cG9zID49IHN0ci5sZW5ndGgoKSkgewotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLy8gdHJ5IHRvIGRldGVjdCBpbnB1dCBlbmNvZGluZwotICAgIGlmIChpbnB1dF90eXBlXyA9PSBJTlBVVF9VTktOT1dOKSB7Ci0gICAgICBkZXRlY3RfaW5wdXRfZW5jb2Rpbmcoc3RyLCBmaXJzdHBvcyk7Ci0gICAgICBpZiAoaW5wdXRfdHlwZV8gPT0gSU5QVVRfVVRGOCkgewotICAgICAgICBsYXN0cG9zID0gc3RyLmxlbmd0aCgpOwotICAgICAgICByZXN1bHQgPDwgc3RyLnN1YnN0cihmaXJzdHBvcywgbGFzdHBvcyAtIGZpcnN0cG9zKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gY29udmVydCB0aGUgY2hhcmFjdGVyIHRvIHNvbWV0aGluZyB1c2VmdWwgYmFzZWQgb24gdGhlIGRldGVjdGVkIGVuY29kaW5nCi0gICAgc3dpdGNoIChpbnB1dF90eXBlXykgewotICAgIGNhc2UgSU5QVVRfUExBSU46Ci0gICAgICByZXN1bHQgPDwgIiYjIiA8PCBpYyA8PCAiOyI7Ci0gICAgICArK2ZpcnN0cG9zOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJVbmV4cGVjdGVkIG9yIHVucmVjb2duaXplZCBpbnB1dCBlbmNvZGluZyI7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIGVzY2FwZV9odG1sX3RhZ3MocmVzdWx0LnN0cigpKTsKLX0KLQotLyoqCi0gKiBQcmludHMgb3V0IHRoZSBwcm92aWRlZCB0eXBlIGluIEhUTUwKLSAqLwotaW50IHRfaHRtbF9nZW5lcmF0b3I6OnByaW50X3R5cGUodF90eXBlKiB0dHlwZSkgewotICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGxlbiA9IDA7Ci0gIGZfb3V0XyA8PCAiPGNvZGU+IjsKLSAgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBmX291dF8gPDwgImxpc3QmbHQ7IjsKLSAgICAgIGxlbiA9IDYgKyBwcmludF90eXBlKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSk7Ci0gICAgICBmX291dF8gPDwgIiZndDsiOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICBmX291dF8gPDwgInNldCZsdDsiOwotICAgICAgbGVuID0gNSArIHByaW50X3R5cGUoKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpOwotICAgICAgZl9vdXRfIDw8ICImZ3Q7IjsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgICAgZl9vdXRfIDw8ICJtYXAmbHQ7IjsKLSAgICAgIGxlbiA9IDUgKyBwcmludF90eXBlKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpOwotICAgICAgZl9vdXRfIDw8ICIsICI7Ci0gICAgICBsZW4gKz0gcHJpbnRfdHlwZSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKTsKLSAgICAgIGZfb3V0XyA8PCAiJmd0OyI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIGZfb3V0XyA8PCAoKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5pc19iaW5hcnkoKSA/ICJiaW5hcnkiIDogdHR5cGUtPmdldF9uYW1lKCkpOwotICAgIGxlbiA9IHR0eXBlLT5nZXRfbmFtZSgpLnNpemUoKTsKLSAgfSBlbHNlIHsKLSAgICBzdHJpbmcgcHJvZ19uYW1lID0gdHR5cGUtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lKCk7Ci0gICAgc3RyaW5nIHR5cGVfbmFtZSA9IHR0eXBlLT5nZXRfbmFtZSgpOwotICAgIGZfb3V0XyA8PCAiPGEgaHJlZj1cIiIgPDwgbWFrZV9maWxlX2xpbmsocHJvZ19uYW1lICsgIi5odG1sIikgPDwgIiMiOwotICAgIGlmICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgICBmX291dF8gPDwgIlR5cGVkZWZfIjsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgICAgZl9vdXRfIDw8ICJTdHJ1Y3RfIjsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIGZfb3V0XyA8PCAiRW51bV8iOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NlcnZpY2UoKSkgewotICAgICAgZl9vdXRfIDw8ICJTdmNfIjsKLSAgICB9Ci0gICAgZl9vdXRfIDw8IHR5cGVfbmFtZSA8PCAiXCI+IjsKLSAgICBsZW4gPSB0eXBlX25hbWUuc2l6ZSgpOwotICAgIGlmICh0dHlwZS0+Z2V0X3Byb2dyYW0oKSAhPSBwcm9ncmFtXykgewotICAgICAgZl9vdXRfIDw8IHByb2dfbmFtZSA8PCAiLiI7Ci0gICAgICBsZW4gKz0gcHJvZ19uYW1lLnNpemUoKSArIDE7Ci0gICAgfQotICAgIGZfb3V0XyA8PCB0eXBlX25hbWUgPDwgIjwvYT4iOwotICB9Ci0gIGZfb3V0XyA8PCAiPC9jb2RlPiI7Ci0gIHJldHVybiAoaW50KWxlbjsKLX0KLQotLyoqCi0gKiBQcmludHMgb3V0IGFuIEhUTUwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHByb3ZpZGVkIGNvbnN0YW50IHZhbHVlCi0gKi8KLXZvaWQgdF9odG1sX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB0dmFsdWUpIHsKLQotICAvLyBpZiB0dmFsdWUgaXMgYW4gaWRlbnRpZmllciwgdGhlIGNvbnN0YW50IGNvbnRlbnQgaXMgYWxyZWFkeSBzaG93biBlbHNld2hlcmUKLSAgaWYgKHR2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JREVOVElGSUVSKSB7Ci0gICAgc3RyaW5nIGZuYW1lID0gcHJvZ3JhbV8tPmdldF9uYW1lKCkgKyAiLmh0bWwiOwotICAgIHN0cmluZyBuYW1lID0gZXNjYXBlX2h0bWwodHZhbHVlLT5nZXRfaWRlbnRpZmllcigpKTsKLSAgICBmX291dF8gPDwgIjxjb2RlPjxhIGhyZWY9XCIiICsgbWFrZV9maWxlX2xpbmsoZm5hbWUpICsgIiNDb25zdF8iICsgbmFtZSArICJcIj4iICsgbmFtZQotICAgICAgICAgICAgICArICI8L2E+PC9jb2RlPiI7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdF90eXBlKiB0cnVldHlwZSA9IHR5cGU7Ci0gIHdoaWxlICh0cnVldHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgdHJ1ZXR5cGUgPSAoKHRfdHlwZWRlZiopdHJ1ZXR5cGUpLT5nZXRfdHlwZSgpOwotICB9Ci0KLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGlmICh0cnVldHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHJ1ZXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIGZfb3V0XyA8PCAnIicgPDwgZXNjYXBlX2h0bWwoZ2V0X2VzY2FwZWRfc3RyaW5nKHR2YWx1ZSkpIDw8ICciJzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIGZfb3V0XyA8PCAoKHR2YWx1ZS0+Z2V0X2ludGVnZXIoKSAhPSAwKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgZl9vdXRfIDw8IHR2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgZl9vdXRfIDw8IHR2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgZl9vdXRfIDw8IHR2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgZl9vdXRfIDw8IHR2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgaWYgKHR2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7Ci0gICAgICAgIGZfb3V0XyA8PCB0dmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX291dF8gPDwgdHZhbHVlLT5nZXRfZG91YmxlKCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgZl9vdXRfIDw8ICJVTktOT1dOIEJBU0UgVFlQRSI7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHJ1ZXR5cGUtPmlzX2VudW0oKSkgewotICAgIGZfb3V0XyA8PCBlc2NhcGVfaHRtbCh0cnVldHlwZS0+Z2V0X25hbWUoKSkgPDwgIi4iCi0gICAgICAgICAgIDw8IGVzY2FwZV9odG1sKHR2YWx1ZS0+Z2V0X2lkZW50aWZpZXJfbmFtZSgpKTsKLSAgfSBlbHNlIGlmICh0cnVldHlwZS0+aXNfc3RydWN0KCkgfHwgdHJ1ZXR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBmX291dF8gPDwgInsgIjsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0cnVldHlwZSktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB0dmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOwotICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKLSAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHJ1ZXR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiCi0gICAgICAgICAgICArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgIH0KLSAgICAgIGlmICghZmlyc3QpIHsKLSAgICAgICAgZl9vdXRfIDw8ICIsICI7Ci0gICAgICB9Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgZl9vdXRfIDw8IGVzY2FwZV9odG1sKHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgPDwgIiA9ICI7Ci0gICAgICBwcmludF9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgfQotICAgIGZfb3V0XyA8PCAiIH0iOwotICB9IGVsc2UgaWYgKHRydWV0eXBlLT5pc19tYXAoKSkgewotICAgIGZfb3V0XyA8PCAieyAiOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+IG1hcF9lbGVtcyA9IHR2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+OjppdGVyYXRvciBtYXBfaXRlcjsKLSAgICBmb3IgKG1hcF9pdGVyID0gbWFwX2VsZW1zLmJlZ2luKCk7IG1hcF9pdGVyICE9IG1hcF9lbGVtcy5lbmQoKTsgbWFwX2l0ZXIrKykgewotICAgICAgaWYgKCFmaXJzdCkgewotICAgICAgICBmX291dF8gPDwgIiwgIjsKLSAgICAgIH0KLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICBwcmludF9jb25zdF92YWx1ZSgoKHRfbWFwKil0cnVldHlwZSktPmdldF9rZXlfdHlwZSgpLCBtYXBfaXRlci0+Zmlyc3QpOwotICAgICAgZl9vdXRfIDw8ICIgPSAiOwotICAgICAgcHJpbnRfY29uc3RfdmFsdWUoKCh0X21hcCopdHJ1ZXR5cGUpLT5nZXRfdmFsX3R5cGUoKSwgbWFwX2l0ZXItPnNlY29uZCk7Ci0gICAgfQotICAgIGZfb3V0XyA8PCAiIH0iOwotICB9IGVsc2UgaWYgKHRydWV0eXBlLT5pc19saXN0KCkpIHsKLSAgICBmX291dF8gPDwgInsgIjsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+IGxpc3RfZWxlbXMgPSB0dmFsdWUtPmdldF9saXN0KCk7Ci0gICAgOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46Oml0ZXJhdG9yIGxpc3RfaXRlcjsKLSAgICBmb3IgKGxpc3RfaXRlciA9IGxpc3RfZWxlbXMuYmVnaW4oKTsgbGlzdF9pdGVyICE9IGxpc3RfZWxlbXMuZW5kKCk7IGxpc3RfaXRlcisrKSB7Ci0gICAgICBpZiAoIWZpcnN0KSB7Ci0gICAgICAgIGZfb3V0XyA8PCAiLCAiOwotICAgICAgfQotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIHByaW50X2NvbnN0X3ZhbHVlKCgodF9saXN0Kil0cnVldHlwZSktPmdldF9lbGVtX3R5cGUoKSwgKmxpc3RfaXRlcik7Ci0gICAgfQotICAgIGZfb3V0XyA8PCAiIH0iOwotICB9IGVsc2UgaWYgKHRydWV0eXBlLT5pc19zZXQoKSkgewotICAgIGZfb3V0XyA8PCAieyAiOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4gbGlzdF9lbGVtcyA9IHR2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICA7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6aXRlcmF0b3IgbGlzdF9pdGVyOwotICAgIGZvciAobGlzdF9pdGVyID0gbGlzdF9lbGVtcy5iZWdpbigpOyBsaXN0X2l0ZXIgIT0gbGlzdF9lbGVtcy5lbmQoKTsgbGlzdF9pdGVyKyspIHsKLSAgICAgIGlmICghZmlyc3QpIHsKLSAgICAgICAgZl9vdXRfIDw8ICIsICI7Ci0gICAgICB9Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgcHJpbnRfY29uc3RfdmFsdWUoKCh0X3NldCopdHJ1ZXR5cGUpLT5nZXRfZWxlbV90eXBlKCksICpsaXN0X2l0ZXIpOwotICAgIH0KLSAgICBmX291dF8gPDwgIiB9IjsKLSAgfSBlbHNlIHsKLSAgICBmX291dF8gPDwgIlVOS05PV04gVFlQRSI7Ci0gIH0KLX0KLQotLyoqCi0gKiBQcmludHMgb3V0IGRvY3VtZW50YXRpb24gZm9yIGFyZ3VtZW50cy9leGNlcHRpb25zIG9mIGEgZnVuY3Rpb24sIGlmIGFueSBkb2N1bWVudGF0aW9uIGhhcyBiZWVuCi0gKiBzdXBwbGllZC4KLSAqLwotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpwcmludF9mbl9hcmdzX2RvYyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgYm9vbCBoYXNfZG9jcyA9IGZhbHNlOwotICB2ZWN0b3I8dF9maWVsZCo+IGFyZ3MgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIGFyZ19pdGVyID0gYXJncy5iZWdpbigpOwotICBpZiAoYXJnX2l0ZXIgIT0gYXJncy5lbmQoKSkgewotICAgIGZvciAoOyBhcmdfaXRlciAhPSBhcmdzLmVuZCgpOyBhcmdfaXRlcisrKSB7Ci0gICAgICBpZiAoKCphcmdfaXRlciktPmhhc19kb2MoKSAmJiAhKCphcmdfaXRlciktPmdldF9kb2MoKS5lbXB0eSgpKQotICAgICAgICBoYXNfZG9jcyA9IHRydWU7Ci0gICAgfQotICAgIGlmIChoYXNfZG9jcykgewotICAgICAgYXJnX2l0ZXIgPSBhcmdzLmJlZ2luKCk7Ci0gICAgICBmX291dF8gPDwgIjxici8+PGg0IGlkPVwiUGFyYW1ldGVyc18iIDw8IHNlcnZpY2VfbmFtZV8gPDwgIl8iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQotICAgICAgICAgICAgIDw8ICJcIj5QYXJhbWV0ZXJzPC9oND4iIDw8IGVuZGw7Ci0gICAgICBmX291dF8gPDwgIjx0YWJsZSBjbGFzcz1cInRhYmxlLWJvcmRlcmVkIHRhYmxlLXN0cmlwZWQgdGFibGUtY29uZGVuc2VkXCI+IjsKLSAgICAgIGZfb3V0XyA8PCAiPHRoZWFkPjx0aD5OYW1lPC90aD48dGg+RGVzY3JpcHRpb248L3RoPjwvdGhlYWQ+IjsKLSAgICAgIGZvciAoOyBhcmdfaXRlciAhPSBhcmdzLmVuZCgpOyBhcmdfaXRlcisrKSB7Ci0gICAgICAgIGZfb3V0XyA8PCAiPHRyPjx0ZD4iIDw8ICgqYXJnX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgICBmX291dF8gPDwgIjwvdGQ+PHRkPiI7Ci0gICAgICAgIGZfb3V0XyA8PCBlc2NhcGVfaHRtbCgoKmFyZ19pdGVyKS0+Z2V0X2RvYygpKTsKLSAgICAgICAgZl9vdXRfIDw8ICI8L3RkPjwvdHI+IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgZl9vdXRfIDw8ICI8L3RhYmxlPiI7Ci0gICAgfQotICB9Ci0KLSAgaGFzX2RvY3MgPSBmYWxzZTsKLSAgdmVjdG9yPHRfZmllbGQqPiBleGNlcHRzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIGV4X2l0ZXIgPSBleGNlcHRzLmJlZ2luKCk7Ci0gIGlmIChleF9pdGVyICE9IGV4Y2VwdHMuZW5kKCkpIHsKLSAgICBmb3IgKDsgZXhfaXRlciAhPSBleGNlcHRzLmVuZCgpOyBleF9pdGVyKyspIHsKLSAgICAgIGlmICgoKmV4X2l0ZXIpLT5oYXNfZG9jKCkgJiYgISgqZXhfaXRlciktPmdldF9kb2MoKS5lbXB0eSgpKQotICAgICAgICBoYXNfZG9jcyA9IHRydWU7Ci0gICAgfQotICAgIGlmIChoYXNfZG9jcykgewotICAgICAgZXhfaXRlciA9IGV4Y2VwdHMuYmVnaW4oKTsKLSAgICAgIGZfb3V0XyA8PCAiPGJyLz48aDQgaWQ9XCJFeGNlcHRpb25zXyIgPDwgc2VydmljZV9uYW1lXyA8PCAiXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgPDwgIlwiPkV4Y2VwdGlvbnM8L2g0PiIgPDwgZW5kbDsKLSAgICAgIGZfb3V0XyA8PCAiPHRhYmxlIGNsYXNzPVwidGFibGUtYm9yZGVyZWQgdGFibGUtc3RyaXBlZCB0YWJsZS1jb25kZW5zZWRcIj4iOwotICAgICAgZl9vdXRfIDw8ICI8dGhlYWQ+PHRoPlR5cGU8L3RoPjx0aD5EZXNjcmlwdGlvbjwvdGg+PC90aGVhZD4iOwotICAgICAgZm9yICg7IGV4X2l0ZXIgIT0gZXhjZXB0cy5lbmQoKTsgZXhfaXRlcisrKSB7Ci0gICAgICAgIGZfb3V0XyA8PCAiPHRyPjx0ZD4iIDw8ICgqZXhfaXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCk7Ci0gICAgICAgIGZfb3V0XyA8PCAiPC90ZD48dGQ+IjsKLSAgICAgICAgZl9vdXRfIDw8IGVzY2FwZV9odG1sKCgqZXhfaXRlciktPmdldF9kb2MoKSk7Ci0gICAgICAgIGZfb3V0XyA8PCAiPC90ZD48L3RyPiIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGZfb3V0XyA8PCAiPC90YWJsZT4iOwotICAgIH0KLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuCi0gKgotICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKLSAgc3RyaW5nIG5hbWUgPSB0dHlwZWRlZi0+Z2V0X25hbWUoKTsKLSAgZl9vdXRfIDw8ICI8ZGl2IGNsYXNzPVwiZGVmaW5pdGlvblwiPiI7Ci0gIGZfb3V0XyA8PCAiPGgzIGlkPVwiVHlwZWRlZl8iIDw8IG5hbWUgPDwgIlwiPlR5cGVkZWY6ICIgPDwgbmFtZSA8PCAiPC9oMz4iIDw8IGVuZGw7Ci0gIGZfb3V0XyA8PCAiPHA+PHN0cm9uZz5CYXNlIHR5cGU6PC9zdHJvbmc+Jm5ic3A7IjsKLSAgcHJpbnRfdHlwZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSk7Ci0gIGZfb3V0XyA8PCAiPC9wPiIgPDwgZW5kbDsKLSAgcHJpbnRfZG9jKHR0eXBlZGVmKTsKLSAgZl9vdXRfIDw8ICI8L2Rpdj4iIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCi0gKi8KLXZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0gIHN0cmluZyBuYW1lID0gdGVudW0tPmdldF9uYW1lKCk7Ci0gIGZfb3V0XyA8PCAiPGRpdiBjbGFzcz1cImRlZmluaXRpb25cIj4iOwotICBmX291dF8gPDwgIjxoMyBpZD1cIkVudW1fIiA8PCBuYW1lIDw8ICJcIj5FbnVtZXJhdGlvbjogIiA8PCBuYW1lIDw8ICI8L2gzPiIgPDwgZW5kbDsKLSAgcHJpbnRfZG9jKHRlbnVtKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IHZhbHVlcyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgdmFsX2l0ZXI7Ci0gIGZfb3V0XyA8PCAiPGJyLz48dGFibGUgY2xhc3M9XCJ0YWJsZS1ib3JkZXJlZCB0YWJsZS1zdHJpcGVkIHRhYmxlLWNvbmRlbnNlZFwiPiIgPDwgZW5kbDsKLSAgZm9yICh2YWxfaXRlciA9IHZhbHVlcy5iZWdpbigpOyB2YWxfaXRlciAhPSB2YWx1ZXMuZW5kKCk7ICsrdmFsX2l0ZXIpIHsKLSAgICBmX291dF8gPDwgIjx0cj48dGQ+PGNvZGU+IjsKLSAgICBmX291dF8gPDwgKCp2YWxfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgZl9vdXRfIDw8ICI8L2NvZGU+PC90ZD48dGQ+PGNvZGU+IjsKLSAgICBmX291dF8gPDwgKCp2YWxfaXRlciktPmdldF92YWx1ZSgpOwotICAgIGZfb3V0XyA8PCAiPC9jb2RlPjwvdGQ+PHRkPiIgPDwgZW5kbDsKLSAgICBwcmludF9kb2MoKCp2YWxfaXRlcikpOwotICAgIGZfb3V0XyA8PCAiPC90ZD48L3RyPiIgPDwgZW5kbDsKLSAgfQotICBmX291dF8gPDwgIjwvdGFibGU+PC9kaXY+IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGNvbnN0YW50IHZhbHVlCi0gKi8KLXZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7Ci0gIHN0cmluZyBuYW1lID0gdGNvbnN0LT5nZXRfbmFtZSgpOwotICBmX291dF8gPDwgIjx0ciBpZD1cIkNvbnN0XyIgPDwgbmFtZSA8PCAiXCI+PHRkPjxjb2RlPiIgPDwgbmFtZSA8PCAiPC9jb2RlPjwvdGQ+PHRkPiI7Ci0gIHByaW50X3R5cGUodGNvbnN0LT5nZXRfdHlwZSgpKTsKLSAgZl9vdXRfIDw8ICI8L3RkPjx0ZD48Y29kZT4iOwotICBwcmludF9jb25zdF92YWx1ZSh0Y29uc3QtPmdldF90eXBlKCksIHRjb25zdC0+Z2V0X3ZhbHVlKCkpOwotICBmX291dF8gPDwgIjwvY29kZT48L3RkPjwvdHI+IjsKLSAgaWYgKHRjb25zdC0+aGFzX2RvYygpKSB7Ci0gICAgZl9vdXRfIDw8ICI8dHI+PHRkIGNvbHNwYW49XCIzXCI+PGJsb2NrcXVvdGU+IjsKLSAgICBwcmludF9kb2ModGNvbnN0KTsKLSAgICBmX291dF8gPDwgIjwvYmxvY2txdW90ZT48L3RkPjwvdHI+IjsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgZl9vdXRfIDw8ICI8ZGl2IGNsYXNzPVwiZGVmaW5pdGlvblwiPiI7Ci0gIGZfb3V0XyA8PCAiPGgzIGlkPVwiU3RydWN0XyIgPDwgbmFtZSA8PCAiXCI+IjsKLSAgaWYgKHRzdHJ1Y3QtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBmX291dF8gPDwgIkV4Y2VwdGlvbjogIjsKLSAgfSBlbHNlIGlmICh0c3RydWN0LT5pc191bmlvbigpKSB7Ci0gICAgZl9vdXRfIDw8ICJVbmlvbjogIjsKLSAgfSBlbHNlIHsKLSAgICBmX291dF8gPDwgIlN0cnVjdDogIjsKLSAgfQotICBmX291dF8gPDwgbmFtZSA8PCAiPC9oMz4iIDw8IGVuZGw7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj4gbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIG1lbV9pdGVyID0gbWVtYmVycy5iZWdpbigpOwotICBmX291dF8gPDwgIjx0YWJsZSBjbGFzcz1cInRhYmxlLWJvcmRlcmVkIHRhYmxlLXN0cmlwZWQgdGFibGUtY29uZGVuc2VkXCI+IjsKLSAgZl9vdXRfIDw8ICI8dGhlYWQ+PHRoPktleTwvdGg+PHRoPkZpZWxkPC90aD48dGg+VHlwZTwvdGg+PHRoPkRlc2NyaXB0aW9uPC90aD48dGg+UmVxdWlyZWRuZXNzPC8iCi0gICAgICAgICAgICAidGg+PHRoPkRlZmF1bHQgdmFsdWU8L3RoPjwvdGhlYWQ+IiA8PCBlbmRsOwotICBmb3IgKDsgbWVtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgbWVtX2l0ZXIrKykgewotICAgIGZfb3V0XyA8PCAiPHRyPjx0ZD4iIDw8ICgqbWVtX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjwvdGQ+PHRkPiI7Ci0gICAgZl9vdXRfIDw8ICgqbWVtX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIGZfb3V0XyA8PCAiPC90ZD48dGQ+IjsKLSAgICBwcmludF90eXBlKCgqbWVtX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBmX291dF8gPDwgIjwvdGQ+PHRkPiI7Ci0gICAgZl9vdXRfIDw8IGVzY2FwZV9odG1sKCgqbWVtX2l0ZXIpLT5nZXRfZG9jKCkpOwotICAgIGZfb3V0XyA8PCAiPC90ZD48dGQ+IjsKLSAgICBpZiAoKCptZW1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7Ci0gICAgICBmX291dF8gPDwgIm9wdGlvbmFsIjsKLSAgICB9IGVsc2UgaWYgKCgqbWVtX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgZl9vdXRfIDw8ICJyZXF1aXJlZCI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfb3V0XyA8PCAiZGVmYXVsdCI7Ci0gICAgfQotICAgIGZfb3V0XyA8PCAiPC90ZD48dGQ+IjsKLSAgICB0X2NvbnN0X3ZhbHVlKiBkZWZhdWx0X3ZhbCA9ICgqbWVtX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICBpZiAoZGVmYXVsdF92YWwgIT0gTlVMTCkgewotICAgICAgZl9vdXRfIDw8ICI8Y29kZT4iOwotICAgICAgcHJpbnRfY29uc3RfdmFsdWUoKCptZW1faXRlciktPmdldF90eXBlKCksIGRlZmF1bHRfdmFsKTsKLSAgICAgIGZfb3V0XyA8PCAiPC9jb2RlPiI7Ci0gICAgfQotICAgIGZfb3V0XyA8PCAiPC90ZD48L3RyPiIgPDwgZW5kbDsKLSAgfQotICBmX291dF8gPDwgIjwvdGFibGU+PGJyLz4iOwotICBwcmludF9kb2ModHN0cnVjdCk7Ci0gIGZfb3V0XyA8PCAiPC9kaXY+IjsKLX0KLQotLyoqCi0gKiBFeGNlcHRpb25zIGFyZSBzcGVjaWFsIHN0cnVjdHMKLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX3N0cnVjdCh0eGNlcHRpb24pOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgSFRNTCBibG9jayBmb3IgYSBUaHJpZnQgc2VydmljZS4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgotICovCi12b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBmX291dF8gPDwgIjxoMyBpZD1cIlN2Y18iIDw8IHNlcnZpY2VfbmFtZV8gPDwgIlwiPlNlcnZpY2U6ICIgPDwgc2VydmljZV9uYW1lXyA8PCAiPC9oMz4iIDw8IGVuZGw7Ci0KLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKSB7Ci0gICAgZl9vdXRfIDw8ICI8ZGl2IGNsYXNzPVwiZXh0ZW5kc1wiPjxlbT5leHRlbmRzPC9lbT4gIjsKLSAgICBwcmludF90eXBlKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBmX291dF8gPDwgIjwvZGl2PlxuIjsKLSAgfQotICBwcmludF9kb2ModHNlcnZpY2UpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZuX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsKLSAgZm9yICg7IGZuX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyBmbl9pdGVyKyspIHsKLSAgICBzdHJpbmcgZm5fbmFtZSA9ICgqZm5faXRlciktPmdldF9uYW1lKCk7Ci0gICAgZl9vdXRfIDw8ICI8ZGl2IGNsYXNzPVwiZGVmaW5pdGlvblwiPiI7Ci0gICAgZl9vdXRfIDw8ICI8aDQgaWQ9XCJGbl8iIDw8IHNlcnZpY2VfbmFtZV8gPDwgIl8iIDw8IGZuX25hbWUgPDwgIlwiPkZ1bmN0aW9uOiAiIDw8IHNlcnZpY2VfbmFtZV8KLSAgICAgICAgICAgPDwgIi4iIDw8IGZuX25hbWUgPDwgIjwvaDQ+IiA8PCBlbmRsOwotICAgIGZfb3V0XyA8PCAiPHByZT4iOwotICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgb2Zmc2V0ID0gcHJpbnRfdHlwZSgoKmZuX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKTsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmX291dF8gPDwgIiAiIDw8IGZuX25hbWUgPDwgIigiOwotICAgIG9mZnNldCArPSBmbl9uYW1lLnNpemUoKSArIDI7Ci0gICAgdmVjdG9yPHRfZmllbGQqPiBhcmdzID0gKCpmbl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+OjppdGVyYXRvciBhcmdfaXRlciA9IGFyZ3MuYmVnaW4oKTsKLSAgICBmb3IgKDsgYXJnX2l0ZXIgIT0gYXJncy5lbmQoKTsgYXJnX2l0ZXIrKykgewotICAgICAgaWYgKCFmaXJzdCkgewotICAgICAgICBmX291dF8gPDwgIiwiIDw8IGVuZGw7Ci0gICAgICAgIGZvciAoc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBpID0gMDsgaSA8IG9mZnNldDsgKytpKSB7Ci0gICAgICAgICAgZl9vdXRfIDw8ICIgIjsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIHByaW50X3R5cGUoKCphcmdfaXRlciktPmdldF90eXBlKCkpOwotICAgICAgZl9vdXRfIDw8ICIgIiA8PCAoKmFyZ19pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgIGlmICgoKmFyZ19pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgewotICAgICAgICBmX291dF8gPDwgIiA9ICI7Ci0gICAgICAgIHByaW50X2NvbnN0X3ZhbHVlKCgqYXJnX2l0ZXIpLT5nZXRfdHlwZSgpLCAoKmFyZ19pdGVyKS0+Z2V0X3ZhbHVlKCkpOwotICAgICAgfQotICAgIH0KLSAgICBmX291dF8gPDwgIikiIDw8IGVuZGw7Ci0gICAgZmlyc3QgPSB0cnVlOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj4gZXhjZXB0cyA9ICgqZm5faXRlciktPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+OjppdGVyYXRvciBleF9pdGVyID0gZXhjZXB0cy5iZWdpbigpOwotICAgIGlmIChleF9pdGVyICE9IGV4Y2VwdHMuZW5kKCkpIHsKLSAgICAgIGZfb3V0XyA8PCAiICAgIHRocm93cyAiOwotICAgICAgZm9yICg7IGV4X2l0ZXIgIT0gZXhjZXB0cy5lbmQoKTsgZXhfaXRlcisrKSB7Ci0gICAgICAgIGlmICghZmlyc3QpIHsKLSAgICAgICAgICBmX291dF8gPDwgIiwgIjsKLSAgICAgICAgfQotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICBwcmludF90eXBlKCgqZXhfaXRlciktPmdldF90eXBlKCkpOwotICAgICAgfQotICAgICAgZl9vdXRfIDw8IGVuZGw7Ci0gICAgfQotICAgIGZfb3V0XyA8PCAiPC9wcmU+IjsKLSAgICBwcmludF9kb2MoKmZuX2l0ZXIpOwotICAgIHByaW50X2ZuX2FyZ3NfZG9jKCpmbl9pdGVyKTsKLSAgICBmX291dF8gPDwgIjwvZGl2PiI7Ci0gIH0KLX0KLQotVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUigKLSAgICBodG1sLAotICAgICJIVE1MIiwKLSAgICAiICAgIHN0YW5kYWxvbmU6ICAgICAgU2VsZi1jb250YWluZWQgbW9kZSwgaW5jbHVkZXMgYWxsIENTUyBpbiB0aGUgSFRNTCBmaWxlcy5cbiIKLSAgICAiICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGVzIG5vIHN0eWxlLmNzcyBmaWxlLCBidXQgSFRNTCBmaWxlcyB3aWxsIGJlIGxhcmdlci5cbiIKLSAgICAiICAgIG5vZXNjYXBlOiAgICAgICAgRG8gbm90IGVzY2FwZSBodG1sIGluIGRvYyB0ZXh0LlxuIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9qYXZhX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9qYXZhX2dlbmVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRjYmM0NS4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfamF2YV9nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1MTQ2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGNhc3NlcnQ+Ci0jaW5jbHVkZSA8Y3RpbWU+Ci0KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvbWFuaXA+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPGNjdHlwZT4KLQotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3RkZXhjZXB0PgotCi0jaW5jbHVkZSAicGxhdGZvcm0uaCIKLSNpbmNsdWRlICJ0X29vcF9nZW5lcmF0b3IuaCIKLQotdXNpbmcgc3RkOjptYXA7Ci11c2luZyBzdGQ6Om9mc3RyZWFtOwotdXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwotdXNpbmcgc3RkOjpzZXRmaWxsOwotdXNpbmcgc3RkOjpzZXR3OwotdXNpbmcgc3RkOjpzdHJpbmc7Ci11c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKLXVzaW5nIHN0ZDo6dmVjdG9yOwotCi1zdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCi0KLS8qKgotICogSmF2YSBjb2RlIGdlbmVyYXRvci4KLSAqCi0gKi8KLWNsYXNzIHRfamF2YV9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKLXB1YmxpYzoKLSAgdF9qYXZhX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCi0gICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgewotICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7Ci0gICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJiZWFucyIpOwotICAgIGJlYW5fc3R5bGVfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoImFuZHJvaWQiKTsKLSAgICBhbmRyb2lkX3N0eWxlXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJwcml2YXRlLW1lbWJlcnMiKTsKLSAgICBwcml2YXRlX21lbWJlcnNfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoIm5vY2FtZWwiKTsKLSAgICBub2NhbWVsX3N0eWxlXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJmdWxsY2FtZWwiKTsKLSAgICBmdWxsY2FtZWxfc3R5bGVfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoImFuZHJvaWRfbGVnYWN5Iik7Ci0gICAgYW5kcm9pZF9sZWdhY3lfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoInNvcnRlZF9jb250YWluZXJzIik7Ci0gICAgc29ydGVkX2NvbnRhaW5lcnNfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoImphdmE1Iik7Ci0gICAgamF2YTVfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotICAgIGlmIChqYXZhNV8pIHsKLSAgICAgIGFuZHJvaWRfbGVnYWN5XyA9IHRydWU7Ci0gICAgfQotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoInJldXNlLW9iamVjdHMiKTsKLSAgICByZXVzZV9vYmplY3RzXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJvcHRpb25fdHlwZSIpOwotICAgIHVzZV9vcHRpb25fdHlwZV8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgiZ2VuZXJhdGVkX2Fubm90YXRpb25zIik7Ci0gICAgaWYgKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpIHsKLSAgICAgIHVuZGF0ZWRfZ2VuZXJhdGVkX2Fubm90YXRpb25zXyAgPSAoaXRlci0+c2Vjb25kLmNvbXBhcmUoInVuZGF0ZWQiKSA9PSAwKTsKLSAgICAgIHN1cHByZXNzX2dlbmVyYXRlZF9hbm5vdGF0aW9uc18gPSAoaXRlci0+c2Vjb25kLmNvbXBhcmUoInN1cHByZXNzIikgPT0gMCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHVuZGF0ZWRfZ2VuZXJhdGVkX2Fubm90YXRpb25zXyAgPSBmYWxzZTsKLSAgICAgIHN1cHByZXNzX2dlbmVyYXRlZF9hbm5vdGF0aW9uc18gPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBvdXRfZGlyX2Jhc2VfID0gKGJlYW5fc3R5bGVfID8gImdlbi1qYXZhYmVhbiIgOiAiZ2VuLWphdmEiKTsKLSAgfQotCi0gIC8qKgotICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCi0gICAqLwotCi0gIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKLSAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKLQotICB2b2lkIGdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKTsKLQotICAvKioKLSAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7Ci0gIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3VuaW9uKHRfc3RydWN0KiB0dW5pb24pOwotICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0KLSAgdm9pZCBwcmludF9jb25zdF92YWx1ZShzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9zdGF0aWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWZ2YWwgPSBmYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZShzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOwotCi0gIC8qKgotICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKLQotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NsYXNzID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCA9IGZhbHNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9wYXJjZWxhYmxlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2VxdWFsaXR5KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2NvbXBhcmVfdG8oc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVhZGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfdmFsaWRhdG9yKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3Jlc3VsdF93cml0ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3Rvc3RyaW5nKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2NsZWFyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3dyaXRlX29iamVjdChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZWFkX29iamVjdChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX21ldGFfZGF0YV9tYXAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlKTsKLSAgc3RkOjpzdHJpbmcgZ2V0X2phdmFfdHlwZV9zdHJpbmcodF90eXBlKiB0eXBlKTsKLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9maWVsZF9ieV9pZChvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfcmVmbGVjdGlvbl9zZXR0ZXJzKHN0ZDo6b3N0cmluZ3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lKTsKLSAgdm9pZCBnZW5lcmF0ZV9yZWZsZWN0aW9uX2dldHRlcnMoc3RkOjpvc3RyaW5nc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUpOwotICB2b2lkIGdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2dlbmVyaWNfaXNzZXRfbWV0aG9kKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfYmVhbl9ib2lsZXJwbGF0ZShzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLQotICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLSAgc3RkOjpzdHJpbmcgYXNfY2FtZWxfY2FzZShzdGQ6OnN0cmluZyBuYW1lLCBib29sIHVjZmlyc3QgPSB0cnVlKTsKLSAgc3RkOjpzdHJpbmcgZ2V0X3JwY19tZXRob2RfbmFtZShzdGQ6OnN0cmluZyBuYW1lKTsKLSAgc3RkOjpzdHJpbmcgZ2V0X2NhcF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpOwotICBzdGQ6OnN0cmluZyBnZW5lcmF0ZV9pc3NldF9jaGVjayh0X2ZpZWxkKiBmaWVsZCk7Ci0gIHN0ZDo6c3RyaW5nIGdlbmVyYXRlX2lzc2V0X2NoZWNrKHN0ZDo6c3RyaW5nIGZpZWxkKTsKLSAgdm9pZCBnZW5lcmF0ZV9pc3NldF9zZXQob2ZzdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCk7Ci0gIHN0ZDo6c3RyaW5nIGlzc2V0X2ZpZWxkX2lkKHRfZmllbGQqIGZpZWxkKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfYXN5bmNfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2FzeW5jX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2FzeW5jX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19hc3luY19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gIHZvaWQgZ2VuZXJhdGVfamF2YV91bmlvbih0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfdW5pb25fY29uc3RydWN0b3Iob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3VuaW9uX2dldHRlcnNfYW5kX3NldHRlcnMob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3VuaW9uX2lzX3NldF9tZXRob2RzKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV91bmlvbl9hYnN0cmFjdF9tZXRob2RzKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9jaGVja190eXBlKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zdGFuZGFyZF9zY2hlbWVfcmVhZF92YWx1ZShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RhbmRhcmRfc2NoZW1lX3dyaXRlX3ZhbHVlKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV90dXBsZV9zY2hlbWVfcmVhZF92YWx1ZShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfdHVwbGVfc2NoZW1lX3dyaXRlX3ZhbHVlKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9nZXRfZmllbGRfZGVzYyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZ2V0X3N0cnVjdF9kZXNjKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9nZXRfZmllbGRfbmFtZShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV91bmlvbl9jb21wYXJpc29ucyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfdW5pb25faGFzaGNvZGUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2NoZW1lX21hcChvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RhbmRhcmRfd3JpdGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3Jlc3VsdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RhbmRhcmRfcmVhZGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9zdGFuZGFyZF9zY2hlbWUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfcmVzdWx0KTsKLQotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3R1cGxlX3NjaGVtZShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfdHVwbGVfcmVhZGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF90dXBsZV93cml0ZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotCi0gIHZvaWQgZ2VuZXJhdGVfamF2YXhfZ2VuZXJhdGVkX2Fubm90YXRpb24ob2ZzdHJlYW0mIG91dCk7Ci0gIC8qKgotICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhID0gdHJ1ZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhID0gdHJ1ZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgb2JqID0gIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEgPSB0cnVlKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBvYmogPSAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSA9IHRydWUpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG9iaiA9ICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSA9IHRydWUpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEgPSB0cnVlKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSA9IHRydWUpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEgPSB0cnVlKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSA9IHRydWUpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhID0gdHJ1ZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lX3AxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc291cmNlX25hbWVfcDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyByZXN1bHRfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRlc3RfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUpOwotCi0gIGVudW0gaXNzZXRfdHlwZSB7IElTU0VUX05PTkUsIElTU0VUX1BSSU1JVElWRSwgSVNTRVRfQklUU0VUIH07Ci0gIGlzc2V0X3R5cGUgbmVlZHNfaXNzZXQodF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nKiBvdXRQcmltaXRpdmVUeXBlID0gTlVMTCk7Ci0KLSAgLyoqCi0gICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCi0gICAqLwotCi0gIHN0ZDo6c3RyaW5nIGphdmFfcGFja2FnZSgpOwotICBzdGQ6OnN0cmluZyBqYXZhX3R5cGVfaW1wb3J0cygpOwotICBzdGQ6OnN0cmluZyBqYXZhX3N1cHByZXNzaW9ucygpOwotICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY29udGFpbmVyID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2luaXQgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2tpcF9nZW5lcmljID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlX25hbWVzcGFjZSA9IGZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgYmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHRiYXNlLCBib29sIGluX2NvbnRhaW5lciA9IGZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCA9IGZhbHNlLCBib29sIGNvbW1lbnQgPSBmYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlX2Jhc2VfbWV0aG9kID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0gIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaW5jbHVkZV90eXBlcyA9IHRydWUpOwotICBzdGQ6OnN0cmluZyBhc3luY19mdW5jdGlvbl9jYWxsX2FyZ2xpc3QodF9mdW5jdGlvbiogdGZ1bmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHVzZV9iYXNlX21ldGhvZCA9IHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2x1ZGVfdHlwZXMgPSB0cnVlKTsKLSAgc3RkOjpzdHJpbmcgYXN5bmNfYXJndW1lbnRfbGlzdCh0X2Z1bmN0aW9uKiB0ZnVuY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2x1ZGVfdHlwZXMgPSBmYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3RfZGVzYyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZmllbGRfZGVzY3Mob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2ZpZWxkX25hbWVfY29uc3RhbnRzKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLQotICBzdGQ6OnN0cmluZyBtYWtlX3ZhbGlkX2phdmFfZmlsZW5hbWUoc3RkOjpzdHJpbmcgY29uc3QmIGZyb21OYW1lKTsKLSAgc3RkOjpzdHJpbmcgbWFrZV92YWxpZF9qYXZhX2lkZW50aWZpZXIoc3RkOjpzdHJpbmcgY29uc3QmIGZyb21OYW1lKTsKLQotICBib29sIHR5cGVfY2FuX2JlX251bGwodF90eXBlKiB0dHlwZSkgewotICAgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7Ci0KLSAgICByZXR1cm4gdHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSB8fCB0dHlwZS0+aXNfc3RyaW5nKCkKLSAgICAgICAgICAgfHwgdHR5cGUtPmlzX2VudW0oKTsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIGNvbnN0YW50X25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7Ci0KLXByaXZhdGU6Ci0gIC8qKgotICAgKiBGaWxlIHN0cmVhbXMKLSAgICovCi0KLSAgc3RkOjpzdHJpbmcgcGFja2FnZV9uYW1lXzsKLSAgc3RkOjpvZnN0cmVhbSBmX3NlcnZpY2VfOwotICBzdGQ6OnN0cmluZyBwYWNrYWdlX2Rpcl87Ci0KLSAgYm9vbCBiZWFuX3N0eWxlXzsKLSAgYm9vbCBhbmRyb2lkX3N0eWxlXzsKLSAgYm9vbCBwcml2YXRlX21lbWJlcnNfOwotICBib29sIG5vY2FtZWxfc3R5bGVfOwotICBib29sIGZ1bGxjYW1lbF9zdHlsZV87Ci0gIGJvb2wgYW5kcm9pZF9sZWdhY3lfOwotICBib29sIGphdmE1XzsKLSAgYm9vbCBzb3J0ZWRfY29udGFpbmVyc187Ci0gIGJvb2wgcmV1c2Vfb2JqZWN0c187Ci0gIGJvb2wgdXNlX29wdGlvbl90eXBlXzsKLSAgYm9vbCB1bmRhdGVkX2dlbmVyYXRlZF9hbm5vdGF0aW9uc187Ci0gIGJvb2wgc3VwcHJlc3NfZ2VuZXJhdGVkX2Fubm90YXRpb25zXzsKLSAgCi19OwotCi0vKioKLSAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0Ci0gKiBzdHJlYW1zLgotICoKLSAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgewotICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKLSAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKLSAgcGFja2FnZV9uYW1lXyA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJqYXZhIik7Ci0KLSAgc3RyaW5nIGRpciA9IHBhY2thZ2VfbmFtZV87Ci0gIHN0cmluZyBzdWJkaXIgPSBnZXRfb3V0X2RpcigpOwotICBzdHJpbmc6OnNpemVfdHlwZSBsb2M7Ci0gIHdoaWxlICgobG9jID0gZGlyLmZpbmQoIi4iKSkgIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyLnN1YnN0cigwLCBsb2MpOwotICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKLSAgICBkaXIgPSBkaXIuc3Vic3RyKGxvYyArIDEpOwotICB9Ci0gIGlmIChkaXIuc2l6ZSgpID4gMCkgewotICAgIHN1YmRpciA9IHN1YmRpciArICIvIiArIGRpcjsKLSAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7Ci0gIH0KLQotICBwYWNrYWdlX2Rpcl8gPSBzdWJkaXI7Ci19Ci0KLS8qKgotICogUGFja2FnZXMgdGhlIGdlbmVyYXRlZCBmaWxlCi0gKgotICogQHJldHVybiBTdHJpbmcgb2YgdGhlIHBhY2thZ2UsIGkuZS4gInBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnRkZW1vOyIKLSAqLwotc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmphdmFfcGFja2FnZSgpIHsKLSAgaWYgKCFwYWNrYWdlX25hbWVfLmVtcHR5KCkpIHsKLSAgICByZXR1cm4gc3RyaW5nKCJwYWNrYWdlICIpICsgcGFja2FnZV9uYW1lXyArICI7XG5cbiI7Ci0gIH0KLSAgcmV0dXJuICIiOwotfQotCi0vKioKLSAqIFByaW50cyBzdGFuZGFyZCBqYXZhIGltcG9ydHMKLSAqCi0gKiBAcmV0dXJuIExpc3Qgb2YgaW1wb3J0cyBmb3IgSmF2YSB0eXBlcyB0aGF0IGFyZSB1c2VkIGluIGhlcmUKLSAqLwotc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmphdmFfdHlwZV9pbXBvcnRzKCkgewotICBzdHJpbmcgaGFzaF9idWlsZGVyOwotICBzdHJpbmcgdHJlZV9zZXRfYW5kX21hcDsKLSAgc3RyaW5nIGFubm90YXRpb25fZ2VuZXJhdGVkOwotCi0gIHN0cmluZyBvcHRpb247Ci0gIGlmIChzb3J0ZWRfY29udGFpbmVyc18pIHsKLSAgICB0cmVlX3NldF9hbmRfbWFwID0gc3RyaW5nKCkgKyAiaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0O1xuIiArICJpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7XG4iOwotICB9Ci0KLSAgaWYgKHVzZV9vcHRpb25fdHlwZV8pIHsKLSAgICBvcHRpb24gPSBzdHJpbmcoKSArICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuT3B0aW9uO1xuIjsKLSAgfQotCi0gIC8vIGFuZHJvaWQgZG9lcyBub3Qgc3VwcG9ydCBAR2VuZXJhdGVkIEFubm90YXRpb24KLSAgaWYgKCFzdXBwcmVzc19nZW5lcmF0ZWRfYW5ub3RhdGlvbnNfKSB7Ci0gICAgYW5ub3RhdGlvbl9nZW5lcmF0ZWQgPSBzdHJpbmcoKSArICJpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQ7XG4iOwotICB9Ci0KLSAgcmV0dXJuIHN0cmluZygpICsgaGFzaF9idWlsZGVyICsgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuSVNjaGVtZTtcbiIKLSAgICAgICAgICsgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuU2NoZW1lRmFjdG9yeTtcbiIKLSAgICAgICAgICsgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuU3RhbmRhcmRTY2hlbWU7XG5cbiIKLSAgICAgICAgICsgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuVHVwbGVTY2hlbWU7XG4iCi0gICAgICAgICArICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR1cGxlUHJvdG9jb2w7XG4iCi0gICAgICAgICArICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRXhjZXB0aW9uO1xuIgotICAgICAgICAgKyAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LkVuY29kaW5nVXRpbHM7XG4iCi0gICAgICAgICArIG9wdGlvbgotICAgICAgICAgKyAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247XG4iCi0gICAgICAgICArICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuQXN5bmNNZXRob2RDYWxsYmFjaztcbiIKLSAgICAgICAgICsgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlci4qO1xuIgotICAgICAgICAgKyAiaW1wb3J0IGphdmEudXRpbC5MaXN0O1xuIiArICJpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDtcbiIgKyAiaW1wb3J0IGphdmEudXRpbC5NYXA7XG4iCi0gICAgICAgICArICJpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7XG4iICsgImltcG9ydCBqYXZhLnV0aWwuRW51bU1hcDtcbiIgKyAiaW1wb3J0IGphdmEudXRpbC5TZXQ7XG4iCi0gICAgICAgICArICJpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7XG4iICsgImltcG9ydCBqYXZhLnV0aWwuRW51bVNldDtcbiIgKyB0cmVlX3NldF9hbmRfbWFwCi0gICAgICAgICArICJpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zO1xuIiArICJpbXBvcnQgamF2YS51dGlsLkJpdFNldDtcbiIKLSAgICAgICAgICsgImltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyO1xuIgotICAgICAgICAgKyAiaW1wb3J0IGphdmEudXRpbC5BcnJheXM7XG4iICsgYW5ub3RhdGlvbl9nZW5lcmF0ZWQKLSAgICAgICAgICsgImltcG9ydCBvcmcuc2xmNGouTG9nZ2VyO1xuIiArICJpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7XG5cbiI7Ci19Ci0KLXN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjpqYXZhX3N1cHByZXNzaW9ucygpIHsKLSAgcmV0dXJuICJAU3VwcHJlc3NXYXJuaW5ncyh7XCJjYXN0XCIsIFwicmF3dHlwZXNcIiwgXCJzZXJpYWxcIiwgXCJ1bmNoZWNrZWRcIn0pXG4iOwotfQotCi0vKioKLSAqIE5vdGhpbmcgaW4gSmF2YQotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBUaGlzIGlzIG5vdCBkb25lIGluIEphdmEsIHNpbmNlIGl0IGRvZXMKLSAqIG5vdCBzdXBwb3J0IGFyYml0cmFyeSBuYW1lIHJlcGxhY2VtZW50cywgYW5kIGl0J2QgYmUgYSB3YWNreSB3YXN0ZQotICogb2Ygb3ZlcmhlYWQgdG8gbWFrZSB3cmFwcGVyIGNsYXNzZXMuCi0gKgotICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKLSAgKHZvaWQpdHR5cGVkZWY7Ci19Ci0KLS8qKgotICogRW51bXMgYXJlIGEgY2xhc3Mgd2l0aCBhIHNldCBvZiBzdGF0aWMgY29uc3RhbnRzLgotICoKLSAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKLSAgLy8gTWFrZSBvdXRwdXQgZmlsZQotICBzdHJpbmcgZl9lbnVtX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBtYWtlX3ZhbGlkX2phdmFfZmlsZW5hbWUodGVudW0tPmdldF9uYW1lKCkpICsgIi5qYXZhIjsKLSAgb2ZzdHJlYW0gZl9lbnVtOwotICBmX2VudW0ub3BlbihmX2VudW1fbmFtZS5jX3N0cigpKTsKLQotICAvLyBDb21tZW50IGFuZCBwYWNrYWdlIGl0Ci0gIGZfZW51bSA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBqYXZhX3BhY2thZ2UoKSA8PCBlbmRsOwotCi0gIC8vIEFkZCBqYXZhIGltcG9ydHMKLSAgZl9lbnVtIDw8IHN0cmluZygpICsgImltcG9ydCBqYXZhLnV0aWwuTWFwO1xuIiArICJpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7XG4iCi0gICAgICAgICAgICArICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEVudW07IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfamF2YV9kb2MoZl9lbnVtLCB0ZW51bSk7Ci0gIGluZGVudChmX2VudW0pIDw8ICJwdWJsaWMgZW51bSAiIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICIgaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5URW51bSAiOwotICBzY29wZV91cChmX2VudW0pOwotCi0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOwotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLQotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgZl9lbnVtIDw8ICIsIiA8PCBlbmRsOwotICAgIH0KLQotICAgIGdlbmVyYXRlX2phdmFfZG9jKGZfZW51bSwgKmNfaXRlcik7Ci0gICAgaW5kZW50KGZfZW51bSkgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCB2YWx1ZSA8PCAiKSI7Ci0gIH0KLSAgZl9lbnVtIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gRmllbGQgZm9yIHRocmlmdENvZGUKLSAgaW5kZW50KGZfZW51bSkgPDwgInByaXZhdGUgZmluYWwgaW50IHZhbHVlOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChmX2VudW0pIDw8ICJwcml2YXRlICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIihpbnQgdmFsdWUpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChmX2VudW0pIDw8ICIgIHRoaXMudmFsdWUgPSB2YWx1ZTsiIDw8IGVuZGw7Ci0gIGluZGVudChmX2VudW0pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KGZfZW51bSkgPDwgIi8qKiIgPDwgZW5kbDsKLSAgaW5kZW50KGZfZW51bSkgPDwgIiAqIEdldCB0aGUgaW50ZWdlciB2YWx1ZSBvZiB0aGlzIGVudW0gdmFsdWUsIGFzIGRlZmluZWQgaW4gdGhlIFRocmlmdCBJREwuIgotICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAiICovIiA8PCBlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIGludCBnZXRWYWx1ZSgpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChmX2VudW0pIDw8ICIgIHJldHVybiB2YWx1ZTsiIDw8IGVuZGw7Ci0gIGluZGVudChmX2VudW0pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KGZfZW51bSkgPDwgIi8qKiIgPDwgZW5kbDsKLSAgaW5kZW50KGZfZW51bSkgPDwgIiAqIEZpbmQgYSB0aGUgZW51bSB0eXBlIGJ5IGl0cyBpbnRlZ2VyIHZhbHVlLCBhcyBkZWZpbmVkIGluIHRoZSBUaHJpZnQgSURMLiIKLSAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgaW5kZW50KGZfZW51bSkgPDwgIiAqIEByZXR1cm4gbnVsbCBpZiB0aGUgdmFsdWUgaXMgbm90IGZvdW5kLiIgPDwgZW5kbDsKLSAgaW5kZW50KGZfZW51bSkgPDwgIiAqLyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfZW51bSkgPDwgInB1YmxpYyBzdGF0aWMgIiArIHRlbnVtLT5nZXRfbmFtZSgpICsgIiBmaW5kQnlWYWx1ZShpbnQgdmFsdWUpIHsgIiA8PCBlbmRsOwotCi0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChmX2VudW0pIDw8ICJzd2l0Y2ggKHZhbHVlKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgaW5kZW50KGZfZW51bSkgPDwgImNhc2UgIiA8PCB2YWx1ZSA8PCAiOiIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9lbnVtKSA8PCAiICByZXR1cm4gIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQoZl9lbnVtKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gIGluZGVudChmX2VudW0pIDw8ICIgIHJldHVybiBudWxsOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotCi0gIGluZGVudChmX2VudW0pIDw8ICJ9IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0KLSAgaW5kZW50KGZfZW51bSkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgc2NvcGVfZG93bihmX2VudW0pOwotCi0gIGZfZW51bS5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGNsYXNzIHRoYXQgaG9sZHMgYWxsIHRoZSBjb25zdGFudHMuCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpIHsKLSAgaWYgKGNvbnN0cy5lbXB0eSgpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAnLycgKyBtYWtlX3ZhbGlkX2phdmFfZmlsZW5hbWUocHJvZ3JhbV9uYW1lXykKLSAgICAgICAgICAgICAgICAgICAgICAgICArICJDb25zdGFudHMuamF2YSI7Ci0gIG9mc3RyZWFtIGZfY29uc3RzOwotICBmX2NvbnN0cy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7Ci0KLSAgLy8gUHJpbnQgaGVhZGVyCi0gIGZfY29uc3RzIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGphdmFfcGFja2FnZSgpIDw8IGphdmFfdHlwZV9pbXBvcnRzKCkgPDwgamF2YV9zdXBwcmVzc2lvbnMoKTsKLQotICBmX2NvbnN0cyA8PCAicHVibGljIGNsYXNzICIgPDwgbWFrZV92YWxpZF9qYXZhX2lkZW50aWZpZXIocHJvZ3JhbV9uYW1lXykgPDwgIkNvbnN0YW50cyB7IiA8PCBlbmRsCi0gICAgICAgICAgIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfamF2YV9kb2MoZl9jb25zdHMsICgqY19pdGVyKSk7Ci0gICAgcHJpbnRfY29uc3RfdmFsdWUoZl9jb25zdHMsCi0gICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF92YWx1ZSgpLAotICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9jb25zdHMpIDw8ICJ9IiA8PCBlbmRsOwotICBmX2NvbnN0cy5jbG9zZSgpOwotfQotCi0vKioKLSAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZwotICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKLSAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9zdGF0aWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVmdmFsKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGluZGVudChvdXQpOwotICBpZiAoIWRlZnZhbCkgewotICAgIG91dCA8PCAoaW5fc3RhdGljID8gIiIgOiAicHVibGljIHN0YXRpYyBmaW5hbCAiKSA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiOwotICB9Ci0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHN0cmluZyB2MiA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIHR5cGUsIHZhbHVlKTsKLSAgICBvdXQgPDwgbmFtZSA8PCAiID0gIiA8PCB2MiA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIG91dCA8PCBuYW1lIDw8ICIgPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIHR5cGUsIHZhbHVlKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBvdXQgPDwgbmFtZSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOwotICAgIGlmICghaW5fc3RhdGljKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAic3RhdGljIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7Ci0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgewotICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgIH0KLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuIjsKLSAgICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lID0gZ2V0X2NhcF9uYW1lKHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSk7Ci0gICAgICBvdXQgPDwgInNldCIgPDwgY2FwX25hbWUgPDwgIigiIDw8IHZhbCA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGlmICghaW5fc3RhdGljKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgb3V0IDw8IG5hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKLSAgICBpZiAoIWluX3N0YXRpYykgewotICAgICAgaW5kZW50KG91dCkgPDwgInN0YXRpYyB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwga3R5cGUsIHZfaXRlci0+Zmlyc3QpOwotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIucHV0KCIgPDwga2V5IDw8ICIsICIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaWYgKCFpbl9zdGF0aWMpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgb3V0IDw8IG5hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKLSAgICBpZiAoIWluX3N0YXRpYykgewotICAgICAgaW5kZW50KG91dCkgPDwgInN0YXRpYyB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotICAgIHRfdHlwZSogZXR5cGU7Ci0gICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9IGVsc2UgewotICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0KLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBldHlwZSwgKnZfaXRlcik7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuYWRkKCIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaWYgKCFpbl9zdGF0aWMpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiB0eXBlICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotICB9Ci19Ci0KLXN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUob2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlbmRlcjsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmVuZGVyIDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJlbmRlciA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJlbmRlciA8PCAiKGJ5dGUpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmVuZGVyIDw8ICIoc2hvcnQpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIkwiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICByZW5kZXIgPDwgIihkb3VibGUpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBzdGQ6OnN0cmluZyBuYW1lc3BhY2VfcHJlZml4ID0gdHlwZS0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWVzcGFjZSgiamF2YSIpOwotICAgIGlmIChuYW1lc3BhY2VfcHJlZml4Lmxlbmd0aCgpID4gMCkgewotICAgICAgbmFtZXNwYWNlX3ByZWZpeCArPSAiLiI7Ci0gICAgfQotICAgIHJlbmRlciA8PCBuYW1lc3BhY2VfcHJlZml4IDw8IHZhbHVlLT5nZXRfaWRlbnRpZmllcl93aXRoX3BhcmVudCgpOwotICB9IGVsc2UgewotICAgIHN0cmluZyB0ID0gdG1wKCJ0bXAiKTsKLSAgICBwcmludF9jb25zdF92YWx1ZShvdXQsIHQsIHR5cGUsIHZhbHVlLCB0cnVlKTsKLSAgICByZW5kZXIgPDwgdDsKLSAgfQotCi0gIHJldHVybiByZW5kZXIuc3RyKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4gVGhpcyB3aWxsIGJlIGEgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2UKLSAqIGltcGxlbWVudG9yLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBpZiAodHN0cnVjdC0+aXNfdW5pb24oKSkgewotICAgIGdlbmVyYXRlX2phdmFfdW5pb24odHN0cnVjdCk7Ci0gIH0gZWxzZSB7Ci0gICAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOwotICB9Ci19Ci0KLS8qKgotICogRXhjZXB0aW9ucyBhcmUgc3RydWN0cywgYnV0IHRoZXkgaW5oZXJpdCBmcm9tIEV4Y2VwdGlvbgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKLX0KLQotLyoqCi0gKiBKYXZhIHN0cnVjdCBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgewotICAvLyBNYWtlIG91dHB1dCBmaWxlCi0gIHN0cmluZyBmX3N0cnVjdF9uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgbWFrZV92YWxpZF9qYXZhX2ZpbGVuYW1lKHRzdHJ1Y3QtPmdldF9uYW1lKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyAiLmphdmEiOwotICBvZnN0cmVhbSBmX3N0cnVjdDsKLSAgZl9zdHJ1Y3Qub3BlbihmX3N0cnVjdF9uYW1lLmNfc3RyKCkpOwotCi0gIGZfc3RydWN0IDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGphdmFfcGFja2FnZSgpIDw8IGphdmFfdHlwZV9pbXBvcnRzKCkgPDwgamF2YV9zdXBwcmVzc2lvbnMoKTsKLQotICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9kZWZpbml0aW9uKGZfc3RydWN0LCB0c3RydWN0LCBpc19leGNlcHRpb24pOwotICBmX3N0cnVjdC5jbG9zZSgpOwotfQotCi0vKioKLSAqIEphdmEgdW5pb24gZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3VuaW9uKHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfc3RydWN0X25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBtYWtlX3ZhbGlkX2phdmFfZmlsZW5hbWUodHN0cnVjdC0+Z2V0X25hbWUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICArICIuamF2YSI7Ci0gIG9mc3RyZWFtIGZfc3RydWN0OwotICBmX3N0cnVjdC5vcGVuKGZfc3RydWN0X25hbWUuY19zdHIoKSk7Ci0KLSAgZl9zdHJ1Y3QgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgamF2YV9wYWNrYWdlKCkgPDwgamF2YV90eXBlX2ltcG9ydHMoKSA8PCBqYXZhX3N1cHByZXNzaW9ucygpOwotCi0gIGdlbmVyYXRlX2phdmFfZG9jKGZfc3RydWN0LCB0c3RydWN0KTsKLQotICBib29sIGlzX2ZpbmFsID0gKHRzdHJ1Y3QtPmFubm90YXRpb25zXy5maW5kKCJmaW5hbCIpICE9IHRzdHJ1Y3QtPmFubm90YXRpb25zXy5lbmQoKSk7Ci0KLSAgaW5kZW50KGZfc3RydWN0KSA8PCAicHVibGljICIgPDwgKGlzX2ZpbmFsID8gImZpbmFsICIgOiAiIikgPDwgImNsYXNzICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgICAgIDw8ICIgZXh0ZW5kcyBvcmcuYXBhY2hlLnRocmlmdC5UVW5pb248IiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIsICIKLSAgICAgICAgICAgICAgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIuX0ZpZWxkcz4gIjsKLQotICBzY29wZV91cChmX3N0cnVjdCk7Ci0KLSAgZ2VuZXJhdGVfc3RydWN0X2Rlc2MoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9maWVsZF9kZXNjcyhmX3N0cnVjdCwgdHN0cnVjdCk7Ci0KLSAgZl9zdHJ1Y3QgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9maWVsZF9uYW1lX2NvbnN0YW50cyhmX3N0cnVjdCwgdHN0cnVjdCk7Ci0KLSAgZl9zdHJ1Y3QgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9qYXZhX21ldGFfZGF0YV9tYXAoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOwotCi0gIGdlbmVyYXRlX3VuaW9uX2NvbnN0cnVjdG9yKGZfc3RydWN0LCB0c3RydWN0KTsKLQotICBmX3N0cnVjdCA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX3VuaW9uX2Fic3RyYWN0X21ldGhvZHMoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOwotCi0gIGZfc3RydWN0IDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZmllbGRfYnlfaWQoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOwotCi0gIGZfc3RydWN0IDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfdW5pb25fZ2V0dGVyc19hbmRfc2V0dGVycyhmX3N0cnVjdCwgdHN0cnVjdCk7Ci0KLSAgZl9zdHJ1Y3QgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV91bmlvbl9pc19zZXRfbWV0aG9kcyhmX3N0cnVjdCwgdHN0cnVjdCk7Ci0KLSAgZl9zdHJ1Y3QgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV91bmlvbl9jb21wYXJpc29ucyhmX3N0cnVjdCwgdHN0cnVjdCk7Ci0KLSAgZl9zdHJ1Y3QgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV91bmlvbl9oYXNoY29kZShmX3N0cnVjdCwgdHN0cnVjdCk7Ci0KLSAgZl9zdHJ1Y3QgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF93cml0ZV9vYmplY3QoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOwotCi0gIGZfc3RydWN0IDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVhZF9vYmplY3QoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOwotCi0gIGZfc3RydWN0IDw8IGVuZGw7Ci0KLSAgc2NvcGVfZG93bihmX3N0cnVjdCk7Ci0KLSAgZl9zdHJ1Y3QuY2xvc2UoKTsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9jb25zdHJ1Y3RvcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBib29sIGRlZmF1bHRfdmFsdWUgPSBmYWxzZTsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAic3VwZXIoX0ZpZWxkcy4iIDw8IGNvbnN0YW50X25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiLCAiCi0gICAgICAgICAgICAgICAgICA8PCByZW5kZXJfY29uc3RfdmFsdWUob3V0LCB0eXBlLCAoKm1faXRlciktPmdldF92YWx1ZSgpKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICBkZWZhdWx0X3ZhbHVlID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICBpZiAoZGVmYXVsdF92YWx1ZSA9PSBmYWxzZSkgewotICAgIGluZGVudChvdXQpIDw8ICJzdXBlcigpOyIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIihfRmllbGRzIHNldEZpZWxkLCBPYmplY3QgdmFsdWUpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHN1cGVyKHNldEZpZWxkLCB2YWx1ZSk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiIG90aGVyKSB7IgotICAgICAgICAgICAgICA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICBzdXBlcihvdGhlcik7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIGRlZXBDb3B5KCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIG5ldyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIih0aGlzKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gZ2VuZXJhdGUgImNvbnN0cnVjdG9ycyIgZm9yIGVhY2ggZmllbGQKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfdHlwZSogdHlwZSA9ICgqbV9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHN0YXRpYyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIgotICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiIHZhbHVlKSB7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgeCA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKCk7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIHguc2V0IiA8PCBnZXRfY2FwX25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKHZhbHVlKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIHg7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHN0YXRpYyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgICA8PCAiKGJ5dGVbXSB2YWx1ZSkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgeCA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKCk7IgotICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIHguc2V0IiA8PCBnZXRfY2FwX25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKQotICAgICAgICAgICAgICAgICAgPDwgIihCeXRlQnVmZmVyLndyYXAoQXJyYXlzLmNvcHlPZih2YWx1ZSwgdmFsdWUubGVuZ3RoKSkpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiB4OyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdW5pb25fZ2V0dGVyc19hbmRfc2V0dGVycyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKLSAgICB0X3R5cGUqIHR5cGUgPSBmaWVsZC0+Z2V0X3R5cGUoKTsKLSAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSk7Ci0KLSAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsIGZpZWxkKTsKLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGJ5dGVbXSBnZXQiIDw8IGNhcF9uYW1lIDw8ICIoKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgc2V0IiA8PCBjYXBfbmFtZSA8PCAiKG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLnJpZ2h0U2l6ZShidWZmZXIiCi0gICAgICAgICAgICAgICAgICA8PCBnZXRfY2FwX25hbWUoImZvciIpIDw8IGNhcF9uYW1lIDw8ICIoKSkpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIEJ5dGVCdWZmZXIgYiA9IGJ1ZmZlciIgPDwgZ2V0X2NhcF9uYW1lKCJmb3IiKSA8PCBjYXBfbmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIGIgPT0gbnVsbCA/IG51bGwgOiBiLmFycmF5KCk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgICAgIG91dCA8PCBlbmRsOwotCi0gICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIEJ5dGVCdWZmZXIgYnVmZmVyIiA8PCBnZXRfY2FwX25hbWUoImZvciIpCi0gICAgICAgICAgICAgICAgICA8PCBnZXRfY2FwX25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICIoKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgaWYgKGdldFNldEZpZWxkKCkgPT0gX0ZpZWxkcy4iIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICIpIHsiCi0gICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkKLSAgICAgICAgICA8PCAiICAgIHJldHVybiBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb3B5QmluYXJ5KChCeXRlQnVmZmVyKWdldEZpZWxkVmFsdWUoKSk7IgotICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICB9IGVsc2UgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oXCJDYW5ub3QgZ2V0IGZpZWxkICciIDw8IGZpZWxkLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgICA8PCAiJyBiZWNhdXNlIHVuaW9uIGlzIGN1cnJlbnRseSBzZXQgdG8gXCIgKyBnZXRGaWVsZERlc2MoZ2V0U2V0RmllbGQoKSkubmFtZSk7IgotICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSkgPDwgIiBnZXQiCi0gICAgICAgICAgICAgICAgICA8PCBnZXRfY2FwX25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICIoKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgaWYgKGdldFNldEZpZWxkKCkgPT0gX0ZpZWxkcy4iIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICIpIHsiCi0gICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgICByZXR1cm4gKCIgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlKSA8PCAiKWdldEZpZWxkVmFsdWUoKTsiCi0gICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgfSBlbHNlIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKFwiQ2Fubm90IGdldCBmaWVsZCAnIiA8PCBmaWVsZC0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgICAgPDwgIicgYmVjYXVzZSB1bmlvbiBpcyBjdXJyZW50bHkgc2V0IHRvIFwiICsgZ2V0RmllbGREZXNjKGdldFNldEZpZWxkKCkpLm5hbWUpOyIKLSAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgb3V0IDw8IGVuZGw7Ci0KLSAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsIGZpZWxkKTsKLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgc2V0IiA8PCBnZXRfY2FwX25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICIoYnl0ZVtdIHZhbHVlKSB7IgotICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIHNldCIgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKQotICAgICAgICAgICAgICAgICAgPDwgIihCeXRlQnVmZmVyLndyYXAoQXJyYXlzLmNvcHlPZih2YWx1ZSwgdmFsdWUubGVuZ3RoKSkpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gICAgICBvdXQgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIHNldCIgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiKCIKLSAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCkpIDw8ICIgdmFsdWUpIHsiIDw8IGVuZGw7Ci0gICAgaWYgKHR5cGVfY2FuX2JlX251bGwoZmllbGQtPmdldF90eXBlKCkpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICBpZiAodmFsdWUgPT0gbnVsbCkgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnQob3V0KSA8PCAiICBzZXRGaWVsZF8gPSBfRmllbGRzLiIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgdmFsdWVfID0gdmFsdWU7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICB9Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdW5pb25faXNfc2V0X21ldGhvZHMob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8IGVuZGw7Ci0gICAgfQotCi0gICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKLQotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgYm9vbGVhbiBpcyIgPDwgZ2V0X2NhcF9uYW1lKCJzZXQiKSA8PCBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSkgPDwgIigpIHsiCi0gICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHNldEZpZWxkXyA9PSBfRmllbGRzLiIgPDwgY29uc3RhbnRfbmFtZShmaWVsZF9uYW1lKSA8PCAiOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9hYnN0cmFjdF9tZXRob2RzKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGdlbmVyYXRlX2NoZWNrX3R5cGUob3V0LCB0c3RydWN0KTsKLSAgb3V0IDw8IGVuZGw7Ci0gIGdlbmVyYXRlX3N0YW5kYXJkX3NjaGVtZV9yZWFkX3ZhbHVlKG91dCwgdHN0cnVjdCk7Ci0gIG91dCA8PCBlbmRsOwotICBnZW5lcmF0ZV9zdGFuZGFyZF9zY2hlbWVfd3JpdGVfdmFsdWUob3V0LCB0c3RydWN0KTsKLSAgb3V0IDw8IGVuZGw7Ci0gIGdlbmVyYXRlX3R1cGxlX3NjaGVtZV9yZWFkX3ZhbHVlKG91dCwgdHN0cnVjdCk7Ci0gIG91dCA8PCBlbmRsOwotICBnZW5lcmF0ZV90dXBsZV9zY2hlbWVfd3JpdGVfdmFsdWUob3V0LCB0c3RydWN0KTsKLSAgb3V0IDw8IGVuZGw7Ci0gIGdlbmVyYXRlX2dldF9maWVsZF9kZXNjKG91dCwgdHN0cnVjdCk7Ci0gIG91dCA8PCBlbmRsOwotICBnZW5lcmF0ZV9nZXRfc3RydWN0X2Rlc2Mob3V0LCB0c3RydWN0KTsKLSAgb3V0IDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJwcm90ZWN0ZWQgX0ZpZWxkcyBlbnVtRm9ySWQoc2hvcnQgaWQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBfRmllbGRzLmZpbmRCeVRocmlmdElkT3JUaHJvdyhpZCk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jaGVja190eXBlKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpCi0gICAgICA8PCAicHJvdGVjdGVkIHZvaWQgY2hlY2tUeXBlKF9GaWVsZHMgc2V0RmllbGQsIE9iamVjdCB2YWx1ZSkgdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiB7IgotICAgICAgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoc2V0RmllbGQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKCptX2l0ZXIpOwotCi0gICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiOiIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICBpZiAodmFsdWUgaW5zdGFuY2VvZiAiIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSwgZmFsc2UsIHRydWUpCi0gICAgICAgICAgICAgICAgPDwgIikgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICAgIGJyZWFrOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBDbGFzc0Nhc3RFeGNlcHRpb24oXCJXYXMgZXhwZWN0aW5nIHZhbHVlIG9mIHR5cGUgIgotICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSwgZmFsc2UpIDw8ICIgZm9yIGZpZWxkICciIDw8IGZpZWxkLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgPDwgIicsIGJ1dCBnb3QgXCIgKyB2YWx1ZS5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSk7IiA8PCBlbmRsOwotICAgIC8vIGRvIHRoZSByZWFsIGNoZWNrIGhlcmUKLSAgfQotCi0gIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihcIlVua25vd24gZmllbGQgaWQgXCIgKyBzZXRGaWVsZCk7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0YW5kYXJkX3NjaGVtZV9yZWFkX3ZhbHVlKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJwcm90ZWN0ZWQgT2JqZWN0IHN0YW5kYXJkU2NoZW1lUmVhZFZhbHVlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCAiCi0gICAgICAgICAgICAgICAgICJpcHJvdCwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIGZpZWxkKSB0aHJvd3MgIgotICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOwotCi0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChvdXQpIDw8ICJfRmllbGRzIHNldEZpZWxkID0gX0ZpZWxkcy5maW5kQnlUaHJpZnRJZChmaWVsZC5pZCk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiaWYgKHNldEZpZWxkICE9IG51bGwpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChzZXRGaWVsZCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGQudHlwZSA9PSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICJfRklFTERfREVTQy50eXBlKSB7IgotICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICI7IgotICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCBmaWVsZCwgIiIpOwotICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gbnVsbDsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihcInNldEZpZWxkIHdhc24ndCBudWxsLCBidXQgZGlkbid0IG1hdGNoIGFueSAiCi0gICAgICAgICAgICAgICAgICJvZiB0aGUgY2FzZSBzdGF0ZW1lbnRzIVwiKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIG51bGw7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdGFuZGFyZF9zY2hlbWVfd3JpdGVfdmFsdWUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCB2b2lkIHN0YW5kYXJkU2NoZW1lV3JpdGVWYWx1ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgIgotICAgICAgICAgICAgICAgICAib3Byb3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoc2V0RmllbGRfKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKLQotICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIjoiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPSAoIgotICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSwgZmFsc2UpIDw8ICIpdmFsdWVfOyIgPDwgZW5kbDsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCBmaWVsZCwgIiIpOwotICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oXCJDYW5ub3Qgd3JpdGUgdW5pb24gd2l0aCB1bmtub3duIGZpZWxkIFwiICsgIgotICAgICAgICAgICAgICAgICAic2V0RmllbGRfKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90dXBsZV9zY2hlbWVfcmVhZF92YWx1ZShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicHJvdGVjdGVkIE9iamVjdCB0dXBsZVNjaGVtZVJlYWRWYWx1ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgIgotICAgICAgICAgICAgICAgICAiaXByb3QsIHNob3J0IGZpZWxkSUQpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgIl9GaWVsZHMgc2V0RmllbGQgPSBfRmllbGRzLmZpbmRCeVRocmlmdElkKGZpZWxkSUQpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgImlmIChzZXRGaWVsZCAhPSBudWxsKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoc2V0RmllbGQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKCptX2l0ZXIpOwotCi0gICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiOiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIjsiCi0gICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsIGZpZWxkLCAiIik7Ci0gICAgaW5kZW50KG91dCkgPDwgInJldHVybiAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oXCJzZXRGaWVsZCB3YXNuJ3QgbnVsbCwgYnV0IGRpZG4ndCBtYXRjaCBhbnkgIgotICAgICAgICAgICAgICAgICAib2YgdGhlIGNhc2Ugc3RhdGVtZW50cyFcIik7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFwiQ291bGRuJ3QgZmluZCBhIGZpZWxkIHdpdGggZmllbGQgaWQgXCIgKyBmaWVsZElEKTsiCi0gICAgICAgICAgICAgIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90dXBsZV9zY2hlbWVfd3JpdGVfdmFsdWUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCB2b2lkIHR1cGxlU2NoZW1lV3JpdGVWYWx1ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgb3Byb3QpICIKLSAgICAgICAgICAgICAgICAgInRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoc2V0RmllbGRfKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKLQotICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIjoiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPSAoIgotICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSwgZmFsc2UpIDw8ICIpdmFsdWVfOyIgPDwgZW5kbDsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCBmaWVsZCwgIiIpOwotICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oXCJDYW5ub3Qgd3JpdGUgdW5pb24gd2l0aCB1bmtub3duIGZpZWxkIFwiICsgIgotICAgICAgICAgICAgICAgICAic2V0RmllbGRfKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nZXRfZmllbGRfZGVzYyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicHJvdGVjdGVkIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBnZXRGaWVsZERlc2MoX0ZpZWxkcyBzZXRGaWVsZCkgeyIKLSAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChzZXRGaWVsZCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKCptX2l0ZXIpOwotICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIjoiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIl9GSUVMRF9ERVNDOyIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihcIlVua25vd24gZmllbGQgaWQgXCIgKyBzZXRGaWVsZCk7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2dldF9zdHJ1Y3RfZGVzYyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICAodm9pZCl0c3RydWN0OwotICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicHJvdGVjdGVkIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QgZ2V0U3RydWN0RGVzYygpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBTVFJVQ1RfREVTQzsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3VuaW9uX2NvbXBhcmlzb25zKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIC8vIGVxdWFsaXR5Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICBpZiAob3RoZXIgaW5zdGFuY2VvZiAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgICByZXR1cm4gZXF1YWxzKCgiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIilvdGhlcik7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB9IGVsc2UgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgICByZXR1cm4gZmFsc2U7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICBvdXQgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAicHVibGljIGJvb2xlYW4gZXF1YWxzKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIG90aGVyKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gb3RoZXIgIT0gbnVsbCAmJiBnZXRTZXRGaWVsZCgpID09IG90aGVyLmdldFNldEZpZWxkKCkgJiYgIgotICAgICAgICAgICAgICAgICAiZ2V0RmllbGRWYWx1ZSgpLmVxdWFscyhvdGhlci5nZXRGaWVsZFZhbHVlKCkpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIG91dCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgaW50IGNvbXBhcmVUbygiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiIG90aGVyKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICBpbnQgbGFzdENvbXBhcmlzb24gPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8oZ2V0U2V0RmllbGQoKSwgIgotICAgICAgICAgICAgICAgICAib3RoZXIuZ2V0U2V0RmllbGQoKSk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICBpZiAobGFzdENvbXBhcmlzb24gPT0gMCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgICByZXR1cm4gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29tcGFyZVRvKGdldEZpZWxkVmFsdWUoKSwgIgotICAgICAgICAgICAgICAgICAib3RoZXIuZ2V0RmllbGRWYWx1ZSgpKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICBvdXQgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9oYXNoY29kZShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICAodm9pZCl0c3RydWN0OwotICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicHVibGljIGludCBoYXNoQ29kZSgpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIExpc3Q8T2JqZWN0PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICBsaXN0LmFkZCh0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZElkRW51bSBzZXRGaWVsZCA9IGdldFNldEZpZWxkKCk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICBpZiAoc2V0RmllbGQgIT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgICBsaXN0LmFkZChzZXRGaWVsZC5nZXRUaHJpZnRGaWVsZElkKCkpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgICBPYmplY3QgdmFsdWUgPSBnZXRGaWVsZFZhbHVlKCk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIG9yZy5hcGFjaGUudGhyaWZ0LlRFbnVtKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICAgICAgbGlzdC5hZGQoKChvcmcuYXBhY2hlLnRocmlmdC5URW51bSlnZXRGaWVsZFZhbHVlKCkpLmdldFZhbHVlKCkpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgICB9IGVsc2UgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgICAgIGxpc3QuYWRkKHZhbHVlKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgICAgfSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIGxpc3QuaGFzaENvZGUoKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IjsKLX0KLQotLyoqCi0gKiBKYXZhIHN0cnVjdCBkZWZpbml0aW9uLiBUaGlzIGhhcyB2YXJpb3VzIHBhcmFtZXRlcnMsIGFzIGl0IGNvdWxkIGJlCi0gKiBnZW5lcmF0ZWQgc3RhbmRhbG9uZSBvciBpbnNpZGUgYW5vdGhlciBjbGFzcyBhcyBhIGhlbHBlci4gSWYgaXQKLSAqIGlzIGEgaGVscGVyIHRoYW4gaXQgaXMgYSBzdGF0aWMgY2xhc3MuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgICAgICBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqIEBwYXJhbSBpc19leGNlcHRpb24gSXMgdGhpcyBhbiBleGNlcHRpb24/Ci0gKiBAcGFyYW0gaW5fY2xhc3MgICAgIElmIGluc2lkZSBhIGNsYXNzLCBuZWVkcyB0byBiZSBzdGF0aWMgY2xhc3MKLSAqIEBwYXJhbSBpc19yZXN1bHQgICAgSWYgdGhpcyBpcyBhIHJlc3VsdCBpdCBuZWVkcyBhIGRpZmZlcmVudCB3cml0ZXIKLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9kZWZpbml0aW9uKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCkgewotICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsIHRzdHJ1Y3QpOwotCi0gIGJvb2wgaXNfZmluYWwgPSAodHN0cnVjdC0+YW5ub3RhdGlvbnNfLmZpbmQoImZpbmFsIikgIT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpKTsKLQotICBpZiAoIWluX2NsYXNzICYmICFzdXBwcmVzc19nZW5lcmF0ZWRfYW5ub3RhdGlvbnNfKSB7Ci0gICAgZ2VuZXJhdGVfamF2YXhfZ2VuZXJhdGVkX2Fubm90YXRpb24ob3V0KTsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCAoaXNfZmluYWwgPyAiZmluYWwgIiA6ICIiKSA8PCAoaW5fY2xhc3MgPyAic3RhdGljICIgOiAiIikgPDwgImNsYXNzICIKLSAgICAgICAgICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiICI7Ci0KLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIG91dCA8PCAiZXh0ZW5kcyBURXhjZXB0aW9uICI7Ci0gIH0KLSAgb3V0IDw8ICJpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlPCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiLCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKLSAgICAgIDw8ICIuX0ZpZWxkcz4sIGphdmEuaW8uU2VyaWFsaXphYmxlLCBDbG9uZWFibGUsIENvbXBhcmFibGU8IiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI+IjsKLQotICBpZiAoYW5kcm9pZF9zdHlsZV8pIHsKLSAgICBvdXQgPDwgIiwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlIjsKLSAgfQotCi0gIG91dCA8PCAiICI7Ci0KLSAgc2NvcGVfdXAob3V0KTsKLQotICBnZW5lcmF0ZV9zdHJ1Y3RfZGVzYyhvdXQsIHRzdHJ1Y3QpOwotCi0gIC8vIE1lbWJlcnMgYXJlIHB1YmxpYyBmb3IgLWphdmEsIHByaXZhdGUgZm9yIC1qYXZhYmVhbgotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIG91dCA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2ZpZWxkX2Rlc2NzKG91dCwgdHN0cnVjdCk7Ci0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfc2NoZW1lX21hcChvdXQsIHRzdHJ1Y3QpOwotCi0gIG91dCA8PCBlbmRsOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBpZiAoYmVhbl9zdHlsZV8gfHwgcHJpdmF0ZV9tZW1iZXJzXykgewotICAgICAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgIjsKLSAgICB9IGVsc2UgewotICAgICAgZ2VuZXJhdGVfamF2YV9kb2Mob3V0LCAqbV9pdGVyKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIjsKLSAgICB9Ci0gICAgb3V0IDw8IGRlY2xhcmVfZmllbGQoKm1faXRlciwgZmFsc2UsIHRydWUpIDw8IGVuZGw7Ci0gIH0KLQotICBvdXQgPDwgZW5kbDsKLQotICBpZiAoYW5kcm9pZF9zdHlsZV8pIHsKLSAgICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9wYXJjZWxhYmxlKG91dCwgdHN0cnVjdCk7Ci0gIH0KLQotICBnZW5lcmF0ZV9maWVsZF9uYW1lX2NvbnN0YW50cyhvdXQsIHRzdHJ1Y3QpOwotCi0gIC8vIGlzc2V0IGRhdGEKLSAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgewotICAgIG91dCA8PCBlbmRsOwotCi0gICAgaW5kZW50KG91dCkgPDwgIi8vIGlzc2V0IGlkIGFzc2lnbm1lbnRzIiA8PCBlbmRsOwotCi0gICAgaW50IGkgPSAwOwotICAgIGludCBvcHRpb25hbHMgPSAwOwotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7Ci0gICAgICAgIG9wdGlvbmFscysrOwotICAgICAgfQotICAgICAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgc3RhdGljIGZpbmFsIGludCAiIDw8IGlzc2V0X2ZpZWxkX2lkKCptX2l0ZXIpIDw8ICIgPSAiIDw8IGkgPDwgIjsiCi0gICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICAgIGkrKzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGQ6OnN0cmluZyBwcmltaXRpdmVUeXBlOwotICAgIHN3aXRjaCAobmVlZHNfaXNzZXQodHN0cnVjdCwgJnByaW1pdGl2ZVR5cGUpKSB7Ci0gICAgY2FzZSBJU1NFVF9OT05FOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJU1NFVF9QUklNSVRJVkU6Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSAiIDw8IHByaW1pdGl2ZVR5cGUgPDwgIiBfX2lzc2V0X2JpdGZpZWxkID0gMDsiIDw8IGVuZGw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElTU0VUX0JJVFNFVDoKLSAgICAgIGluZGVudChvdXQpIDw8ICJwcml2YXRlIEJpdFNldCBfX2lzc2V0X2JpdF92ZWN0b3IgPSBuZXcgQml0U2V0KCIgPDwgaSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAob3B0aW9uYWxzID4gMCkgewotICAgICAgc3RkOjpzdHJpbmcgb3V0cHV0X3N0cmluZyA9ICJwcml2YXRlIHN0YXRpYyBmaW5hbCBfRmllbGRzIG9wdGlvbmFsc1tdID0geyI7Ci0gICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7Ci0gICAgICAgICAgb3V0cHV0X3N0cmluZyA9IG91dHB1dF9zdHJpbmcgKyAiX0ZpZWxkcy4iICsgY29uc3RhbnRfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpICsgIiwiOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpbmRlbnQob3V0KSA8PCBvdXRwdXRfc3RyaW5nLnN1YnN0cigwLCBvdXRwdXRfc3RyaW5nLmxlbmd0aCgpIC0gMSkgPDwgIn07IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGdlbmVyYXRlX2phdmFfbWV0YV9kYXRhX21hcChvdXQsIHRzdHJ1Y3QpOwotCi0gIGJvb2wgYWxsX29wdGlvbmFsX21lbWJlcnMgPSB0cnVlOwotCi0gIC8vIERlZmF1bHQgY29uc3RydWN0b3IKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKLSAgICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzLiIgKyAoKm1faXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICB0LAotICAgICAgICAgICAgICAgICAgICAgICAgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKLSAgICB9Ci0gICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKLSAgICAgIGFsbF9vcHRpb25hbF9tZW1iZXJzID0gZmFsc2U7Ci0gICAgfQotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaWYgKCFtZW1iZXJzLmVtcHR5KCkgJiYgIWFsbF9vcHRpb25hbF9tZW1iZXJzKSB7Ci0gICAgLy8gRnVsbCBjb25zdHJ1Y3RvciBmb3IgYWxsIGZpZWxkcwotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7Ci0gICAgICAgIGlmICghZmlyc3QpIHsKLSAgICAgICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgb3V0IDw8ICIpIiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInRoaXMoKTsiIDw8IGVuZGw7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKLSAgICAgICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgICAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICA8PCAiID0gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29weUJpbmFyeSgiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgICAgICAgIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjsiCi0gICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgICBnZW5lcmF0ZV9pc3NldF9zZXQob3V0LCAoKm1faXRlciksICIiKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBjb3B5IGNvbnN0cnVjdG9yCi0gIGluZGVudChvdXQpIDw8ICIvKioiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgKiBQZXJmb3JtcyBhIGRlZXAgY29weSBvbiA8aT5vdGhlcjwvaT4uIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICovIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIG90aGVyKSB7IgotICAgICAgICAgICAgICA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBzd2l0Y2ggKG5lZWRzX2lzc2V0KHRzdHJ1Y3QpKSB7Ci0gIGNhc2UgSVNTRVRfTk9ORToKLSAgICBicmVhazsKLSAgY2FzZSBJU1NFVF9QUklNSVRJVkU6Ci0gICAgaW5kZW50KG91dCkgPDwgIl9faXNzZXRfYml0ZmllbGQgPSBvdGhlci5fX2lzc2V0X2JpdGZpZWxkOyIgPDwgZW5kbDsKLSAgICBicmVhazsKLSAgY2FzZSBJU1NFVF9CSVRTRVQ6Ci0gICAgaW5kZW50KG91dCkgPDwgIl9faXNzZXRfYml0X3ZlY3Rvci5jbGVhcigpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldF9iaXRfdmVjdG9yLm9yKG90aGVyLl9faXNzZXRfYml0X3ZlY3Rvcik7IiA8PCBlbmRsOwotICAgIGJyZWFrOwotICB9Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKCptX2l0ZXIpOwotICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKLSAgICB0X3R5cGUqIHR5cGUgPSBmaWVsZC0+Z2V0X3R5cGUoKTsKLSAgICBib29sIGNhbl9iZV9udWxsID0gdHlwZV9jYW5fYmVfbnVsbCh0eXBlKTsKLQotICAgIGlmIChjYW5fYmVfbnVsbCkgewotICAgICAgaW5kZW50KG91dCkgPDwgImlmIChvdGhlci4iIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotCi0gICAgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKG91dCwgIm90aGVyIiwgZmllbGRfbmFtZSwgIl9fdGhpc19fIiArIGZpZWxkX25hbWUsIHR5cGUpOwotICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBfX3RoaXNfXyIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSAiOwotICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIob3V0LCAib3RoZXIuIiArIGZpZWxkX25hbWUsIGZpZWxkX25hbWUsIHR5cGUpOwotICAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGlmIChjYW5fYmVfbnVsbCkgewotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gY2xvbmUgbWV0aG9kLCBzbyB0aGF0IHlvdSBjYW4gZGVlcCBjb3B5IGFuIG9iamVjdCB3aGVuIHlvdSBkb24ndCBrbm93IGl0cyBjbGFzcy4KLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiBkZWVwQ29weSgpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBuZXcgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIodGhpcyk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2phdmFfc3RydWN0X2NsZWFyKG91dCwgdHN0cnVjdCk7Ci0KLSAgZ2VuZXJhdGVfamF2YV9iZWFuX2JvaWxlcnBsYXRlKG91dCwgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKG91dCwgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX2dlbmVyaWNfaXNzZXRfbWV0aG9kKG91dCwgdHN0cnVjdCk7Ci0KLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZXF1YWxpdHkob3V0LCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfY29tcGFyZV90byhvdXQsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9maWVsZF9ieV9pZChvdXQsIHRzdHJ1Y3QpOwotCi0gIGdlbmVyYXRlX2phdmFfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOwotICBpZiAoaXNfcmVzdWx0KSB7Ci0gICAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOwotICB9IGVsc2UgewotICAgIGdlbmVyYXRlX2phdmFfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOwotICB9Ci0gIGdlbmVyYXRlX2phdmFfc3RydWN0X3Rvc3RyaW5nKG91dCwgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX2phdmFfdmFsaWRhdG9yKG91dCwgdHN0cnVjdCk7Ci0KLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3Rfd3JpdGVfb2JqZWN0KG91dCwgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX2phdmFfc3RydWN0X3JlYWRfb2JqZWN0KG91dCwgdHN0cnVjdCk7Ci0KLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3Rfc3RhbmRhcmRfc2NoZW1lKG91dCwgdHN0cnVjdCwgaXNfcmVzdWx0KTsKLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfdHVwbGVfc2NoZW1lKG91dCwgdHN0cnVjdCk7Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBnZW5lcmF0ZXMgcGFyY2VsYWJsZSBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24KLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9wYXJjZWxhYmxlKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyB0bmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgPDwgInB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgb3V0LCBpbnQgZmxhZ3MpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBzdHJpbmcgYml0c2V0UHJpbWl0aXZlVHlwZSA9ICIiOwotICBzd2l0Y2ggKG5lZWRzX2lzc2V0KHRzdHJ1Y3QsICZiaXRzZXRQcmltaXRpdmVUeXBlKSkgewotICBjYXNlIElTU0VUX05PTkU6Ci0gICAgYnJlYWs7Ci0gIGNhc2UgSVNTRVRfUFJJTUlUSVZFOgotICAgIGluZGVudChvdXQpIDw8ICIvL3ByaW1pdGl2ZSBiaXRmaWVsZCBvZiB0eXBlOiAiIDw8IGJpdHNldFByaW1pdGl2ZVR5cGUgPDwgZW5kbDsKLSAgICBpZiAoYml0c2V0UHJpbWl0aXZlVHlwZSA9PSAiYnl0ZSIpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJvdXQud3JpdGVCeXRlKF9faXNzZXRfYml0ZmllbGQpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKGJpdHNldFByaW1pdGl2ZVR5cGUgPT0gInNob3J0IikgewotICAgICAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZUludChuZXcgU2hvcnQoX19pc3NldF9iaXRmaWVsZCkuaW50VmFsdWUoKSk7IiA8PCBlbmRsOwotICAgIH0gZWxzZSBpZiAoYml0c2V0UHJpbWl0aXZlVHlwZSA9PSAiaW50IikgewotICAgICAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZUludChfX2lzc2V0X2JpdGZpZWxkKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmIChiaXRzZXRQcmltaXRpdmVUeXBlID09ICJsb25nIikgewotICAgICAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZUxvbmcoX19pc3NldF9iaXRmaWVsZCk7IiA8PCBlbmRsOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgICBicmVhazsKLSAgY2FzZSBJU1NFVF9CSVRTRVQ6Ci0gICAgaW5kZW50KG91dCkgPDwgIi8vQml0U2V0IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJvdXQud3JpdGVTZXJpYWxpemFibGUoX19pc3NldF9iaXRfdmVjdG9yKTsiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGVuZGw7Ci0gICAgYnJlYWs7Ci0gIH0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBzdHJpbmcgbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKLQotICAgIGlmICh0LT5pc19zdHJ1Y3QoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZVBhcmNlbGFibGUoIiA8PCBuYW1lIDw8ICIsIGZsYWdzKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmICh0eXBlX25hbWUodCkgPT0gImZsb2F0IikgewotICAgICAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZUZsb2F0KCIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmICh0LT5pc19lbnVtKCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJvdXQud3JpdGVJbnQoIiA8PCBuYW1lIDw8ICIuZ2V0VmFsdWUoKSk7IiA8PCBlbmRsOwotICAgIH0gZWxzZSBpZiAodC0+aXNfbGlzdCgpKSB7Ci0gICAgICBpZiAoKCh0X2xpc3QqKXQpLT5nZXRfZWxlbV90eXBlKCktPmdldF90cnVlX3R5cGUoKS0+aXNfc3RydWN0KCkpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZVR5cGVkTGlzdCgiIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZUxpc3QoIiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHQtPmlzX21hcCgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAib3V0LndyaXRlTWFwKCIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmICh0LT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXQpLT5pc19iaW5hcnkoKSkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAib3V0LndyaXRlSW50KCIgPDwgbmFtZSA8PCAiIT1udWxsID8gMSA6IDApOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgImlmKCIgPDwgbmFtZSA8PCAiICE9IG51bGwpIHsgIiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZUJ5dGVBcnJheSgiIDw8IG5hbWUgPDwgIi5hcnJheSgpLCAiIDw8IG5hbWUgPDwgIi5wb3NpdGlvbigpICsgIgotICAgICAgICAgICAgICAgICAgICA8PCBuYW1lIDw8ICIuYXJyYXlPZmZzZXQoKSwgIiA8PCBuYW1lIDw8ICIubGltaXQoKSAtICIgPDwgbmFtZQotICAgICAgICAgICAgICAgICAgICA8PCAiLnBvc2l0aW9uKCkgKTsiIDw8IGVuZGw7Ci0gICAgICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN3aXRjaCAoKCh0X2Jhc2VfdHlwZSopdCktPmdldF9iYXNlKCkpIHsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZUludChuZXcgU2hvcnQoIiA8PCBuYW1lIDw8ICIpLmludFZhbHVlKCkpOyIgPDwgZW5kbDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZUludCgiIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgICBpbmRlbnQob3V0KSA8PCAib3V0LndyaXRlTG9uZygiIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZUludCgiIDw8IG5hbWUgPDwgIiA/IDEgOiAwKTsiIDw8IGVuZGw7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgICBpbmRlbnQob3V0KSA8PCAib3V0LndyaXRlQnl0ZSgiIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgICBpbmRlbnQob3V0KSA8PCAib3V0LndyaXRlRG91YmxlKCIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICAgIGluZGVudChvdXQpIDw8ICJvdXQud3JpdGVTdHJpbmcoIiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLSAgb3V0IDw8IGVuZGw7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAwOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdG5hbWUgPDwgIihhbmRyb2lkLm9zLlBhcmNlbCBpbikgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIC8vIHJlYWQgaW4gdGhlIHJlcXVpcmVkIGJpdGZpZWxkCi0gIHN3aXRjaCAobmVlZHNfaXNzZXQodHN0cnVjdCwgJmJpdHNldFByaW1pdGl2ZVR5cGUpKSB7Ci0gIGNhc2UgSVNTRVRfTk9ORToKLSAgICBicmVhazsKLSAgY2FzZSBJU1NFVF9QUklNSVRJVkU6Ci0gICAgaW5kZW50KG91dCkgPDwgIi8vcHJpbWl0aXZlIGJpdGZpZWxkIG9mIHR5cGU6ICIgPDwgYml0c2V0UHJpbWl0aXZlVHlwZSA8PCBlbmRsOwotICAgIGlmIChiaXRzZXRQcmltaXRpdmVUeXBlID09ICJieXRlIikgewotICAgICAgaW5kZW50KG91dCkgPDwgIl9faXNzZXRfYml0ZmllbGQgPSBpbi5yZWFkQnl0ZSgpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKGJpdHNldFByaW1pdGl2ZVR5cGUgPT0gInNob3J0IikgewotICAgICAgaW5kZW50KG91dCkgPDwgIl9faXNzZXRfYml0ZmllbGQgPSAoc2hvcnQpIGluLnJlYWRJbnQoKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmIChiaXRzZXRQcmltaXRpdmVUeXBlID09ICJpbnQiKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldF9iaXRmaWVsZCA9IGluLnJlYWRJbnQoKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmIChiaXRzZXRQcmltaXRpdmVUeXBlID09ICJsb25nIikgewotICAgICAgaW5kZW50KG91dCkgPDwgIl9faXNzZXRfYml0ZmllbGQgPSBpbi5yZWFkTG9uZygpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgSVNTRVRfQklUU0VUOgotICAgIGluZGVudChvdXQpIDw8ICIvL0JpdFNldCIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldF9iaXRfdmVjdG9yID0gKEJpdFNldCkgaW4ucmVhZFNlcmlhbGl6YWJsZSgpOyIgPDwgZW5kbDsKLSAgICBvdXQgPDwgZW5kbDsKLSAgICBicmVhazsKLSAgfQotICAvLyByZWFkIGFsbCB0aGUgZmllbGRzCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgc3RyaW5nIG5hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7Ci0gICAgc3RyaW5nIHByZWZpeCA9ICJ0aGlzLiIgKyBuYW1lOwotCi0gICAgaWYgKHQtPmlzX3N0cnVjdCgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIj0gaW4ucmVhZFBhcmNlbGFibGUoIiA8PCB0bmFtZSA8PCAiLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOyIKLSAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmICh0LT5pc19lbnVtKCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gIiA8PCB0eXBlX25hbWUodCkgPDwgIi5maW5kQnlWYWx1ZShpbi5yZWFkSW50KCkpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKHQtPmlzX2xpc3QoKSkgewotICAgICAgdF9saXN0KiBsaXN0ID0gKHRfbGlzdCopdDsKLSAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHQsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOwotICAgICAgaWYgKGxpc3QtPmdldF9lbGVtX3R5cGUoKS0+Z2V0X3RydWVfdHlwZSgpLT5pc19zdHJ1Y3QoKSkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAiaW4ucmVhZFR5cGVkTGlzdCgiIDw8IHByZWZpeCA8PCAiLCAiIDw8IHR5cGVfbmFtZShsaXN0LT5nZXRfZWxlbV90eXBlKCkpCi0gICAgICAgICAgICAgICAgICAgIDw8ICIuQ1JFQVRPUik7IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgImluLnJlYWRMaXN0KCIgPDwgcHJlZml4IDw8ICIsICIgPDwgdG5hbWUgPDwgIi5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsiCi0gICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0LT5pc19tYXAoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodCwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiIGluLnJlYWRNYXAoIiA8PCBwcmVmaXggPDwgIiwgIiA8PCB0bmFtZSA8PCAiLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOyIKLSAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmICh0eXBlX25hbWUodCkgPT0gImZsb2F0IikgewotICAgICAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIgPSBpbi5yZWFkRmxvYXQoKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmICh0LT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGUqIGJ0ID0gKHRfYmFzZV90eXBlKil0OwotICAgICAgaWYgKGJ0LT5pc19iaW5hcnkoKSkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYoaW4ucmVhZEludCgpPT0xKSB7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIgPSBCeXRlQnVmZmVyLndyYXAoaW4uY3JlYXRlQnl0ZUFycmF5KCkpOyIgPDwgZW5kbDsKLSAgICAgICAgc2NvcGVfZG93bihvdXQpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3dpdGNoIChidC0+Z2V0X2Jhc2UoKSkgewotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IChzaG9ydCkgaW4ucmVhZEludCgpOyIgPDwgZW5kbDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIgPSBpbi5yZWFkSW50KCk7IiA8PCBlbmRsOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IGluLnJlYWRMb25nKCk7IiA8PCBlbmRsOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIgPSAoaW4ucmVhZEludCgpPT0xKTsiIDw8IGVuZGw7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IGluLnJlYWRCeXRlKCk7IiA8PCBlbmRsOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IGluLnJlYWREb3VibGUoKTsiIDw8IGVuZGw7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiPSBpbi5yZWFkU3RyaW5nKCk7IiA8PCBlbmRsOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci0gIG91dCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQub3MuUGFyY2VsYWJsZS5DcmVhdG9yPCIgPDwgdG5hbWUKLSAgICAgICAgICAgICAgPDwgIj4gQ1JFQVRPUiA9IG5ldyBhbmRyb2lkLm9zLlBhcmNlbGFibGUuQ3JlYXRvcjwiIDw8IHRuYW1lIDw8ICI+KCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicHVibGljICIgPDwgdG5hbWUgPDwgIltdIG5ld0FycmF5KGludCBzaXplKSB7IgotICAgICAgICAgICAgICA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgInJldHVybiBuZXcgIiA8PCB0bmFtZSA8PCAiW3NpemVdOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgIiA8PCB0bmFtZQotICAgICAgICAgICAgICA8PCAiIGNyZWF0ZUZyb21QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgaW4pIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIG5ldyAiIDw8IHRuYW1lIDw8ICIoaW4pOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9OyIgPDwgZW5kbDsKLSAgb3V0IDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGVxdWFscyBtZXRob2RzIGFuZCBhIGhhc2hDb2RlIG1ldGhvZCBmb3IgYSBzdHJ1Y3R1cmUuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfZXF1YWxpdHkob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgdGhhdCkgeyIKLSAgICAgIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICh0aGF0ID09IG51bGwpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBmYWxzZTsiIDw8IGVuZGwKLSAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAodGhhdCBpbnN0YW5jZW9mICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKSIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgPDwgIiAgcmV0dXJuIHRoaXMuZXF1YWxzKCgiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIil0aGF0KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgIDw8ICJyZXR1cm4gZmFsc2U7IiA8PCBlbmRsOwotICBzY29wZV9kb3duKG91dCk7Ci0gIG91dCA8PCBlbmRsOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGJvb2xlYW4gZXF1YWxzKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIHRoYXQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICh0aGF0ID09IG51bGwpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBmYWxzZTsiIDw8IGVuZGw7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIG91dCA8PCBlbmRsOwotCi0gICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgIC8vIE1vc3QgZXhpc3RpbmcgVGhyaWZ0IGNvZGUgZG9lcyBub3QgdXNlIGlzc2V0IG9yIG9wdGlvbmFsL3JlcXVpcmVkLAotICAgIC8vIHNvIHdlIHRyZWF0ICJkZWZhdWx0IiBmaWVsZHMgYXMgcmVxdWlyZWQuCi0gICAgYm9vbCBpc19vcHRpb25hbCA9ICgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7Ci0gICAgYm9vbCBjYW5fYmVfbnVsbCA9IHR5cGVfY2FuX2JlX251bGwodCk7Ci0gICAgc3RyaW5nIG5hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7Ci0KLSAgICBzdHJpbmcgdGhpc19wcmVzZW50ID0gInRydWUiOwotICAgIHN0cmluZyB0aGF0X3ByZXNlbnQgPSAidHJ1ZSI7Ci0gICAgc3RyaW5nIHVuZXF1YWw7Ci0KLSAgICBpZiAoaXNfb3B0aW9uYWwgfHwgY2FuX2JlX251bGwpIHsKLSAgICAgIHRoaXNfcHJlc2VudCArPSAiICYmIHRoaXMuIiArIGdlbmVyYXRlX2lzc2V0X2NoZWNrKCptX2l0ZXIpOwotICAgICAgdGhhdF9wcmVzZW50ICs9ICIgJiYgdGhhdC4iICsgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKm1faXRlcik7Ci0gICAgfQotCi0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJib29sZWFuIHRoaXNfcHJlc2VudF8iIDw8IG5hbWUgPDwgIiA9ICIgPDwgdGhpc19wcmVzZW50IDw8ICI7IiA8PCBlbmRsCi0gICAgICAgIDw8IGluZGVudCgpIDw8ICJib29sZWFuIHRoYXRfcHJlc2VudF8iIDw8IG5hbWUgPDwgIiA9ICIgPDwgdGhhdF9wcmVzZW50IDw8ICI7IiA8PCBlbmRsCi0gICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoIgotICAgICAgICA8PCAidGhpc19wcmVzZW50XyIgPDwgbmFtZSA8PCAiIHx8IHRoYXRfcHJlc2VudF8iIDw8IG5hbWUgPDwgIikgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghKCIKLSAgICAgICAgPDwgInRoaXNfcHJlc2VudF8iIDw8IG5hbWUgPDwgIiAmJiB0aGF0X3ByZXNlbnRfIiA8PCBuYW1lIDw8ICIpKSIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICA8PCAiICByZXR1cm4gZmFsc2U7IiA8PCBlbmRsOwotCi0gICAgaWYgKHQtPmlzX2Jhc2VfdHlwZSgpICYmICgodF9iYXNlX3R5cGUqKXQpLT5pc19iaW5hcnkoKSkgewotICAgICAgdW5lcXVhbCA9ICIhdGhpcy4iICsgbmFtZSArICIuZXF1YWxzKHRoYXQuIiArIG5hbWUgKyAiKSI7Ci0gICAgfSBlbHNlIGlmIChjYW5fYmVfbnVsbCkgewotICAgICAgdW5lcXVhbCA9ICIhdGhpcy4iICsgbmFtZSArICIuZXF1YWxzKHRoYXQuIiArIG5hbWUgKyAiKSI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHVuZXF1YWwgPSAidGhpcy4iICsgbmFtZSArICIgIT0gdGhhdC4iICsgbmFtZTsKLSAgICB9Ci0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgiIDw8IHVuZXF1YWwgPDwgIikiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKLQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgfQotICBvdXQgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInJldHVybiB0cnVlOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGludCBoYXNoQ29kZSgpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAiTGlzdDxPYmplY3Q+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsiIDw8IGVuZGw7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIG91dCA8PCBlbmRsOwotCi0gICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgIGJvb2wgaXNfb3B0aW9uYWwgPSAoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMOwotICAgIGJvb2wgY2FuX2JlX251bGwgPSB0eXBlX2Nhbl9iZV9udWxsKHQpOwotICAgIHN0cmluZyBuYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgc3RyaW5nIHByZXNlbnQgPSAidHJ1ZSI7Ci0KLSAgICBpZiAoaXNfb3B0aW9uYWwgfHwgY2FuX2JlX251bGwpIHsKLSAgICAgIHByZXNlbnQgKz0gIiAmJiAoIiArIGdlbmVyYXRlX2lzc2V0X2NoZWNrKCptX2l0ZXIpICsgIikiOwotICAgIH0KLQotICAgIGluZGVudChvdXQpIDw8ICJib29sZWFuIHByZXNlbnRfIiA8PCBuYW1lIDw8ICIgPSAiIDw8IHByZXNlbnQgPDwgIjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgImxpc3QuYWRkKHByZXNlbnRfIiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHByZXNlbnRfIiA8PCBuYW1lIDw8ICIpIiA8PCBlbmRsOwotICAgIGlmICh0LT5pc19lbnVtKCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIGxpc3QuYWRkKCIgPDwgbmFtZSA8PCAiLmdldFZhbHVlKCkpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgIiAgbGlzdC5hZGQoIiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBvdXQgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInJldHVybiBsaXN0Lmhhc2hDb2RlKCk7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X2NvbXBhcmVfdG8ob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBpbnQgY29tcGFyZVRvKCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgb3RoZXIpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChvdXQpIDw8ICJpZiAoIWdldENsYXNzKCkuZXF1YWxzKG90aGVyLmdldENsYXNzKCkpKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCkuY29tcGFyZVRvKG90aGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICBvdXQgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAiaW50IGxhc3RDb21wYXJpc29uID0gMDsiIDw8IGVuZGw7Ci0gIG91dCA8PCBlbmRsOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICptX2l0ZXI7Ci0gICAgaW5kZW50KG91dCkgPDwgImxhc3RDb21wYXJpc29uID0gQm9vbGVhbi52YWx1ZU9mKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpCi0gICAgICAgICAgICAgICAgPDwgIikuY29tcGFyZVRvKG90aGVyLiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIGxhc3RDb21wYXJpc29uOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZCkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICBsYXN0Q29tcGFyaXNvbiA9IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvbXBhcmVUbyh0aGlzLiIKLSAgICAgICAgICAgICAgICA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiLCBvdGhlci4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8ICJyZXR1cm4gMDsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byByZWFkIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVhZGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gICh2b2lkKXRzdHJ1Y3Q7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCByZWFkKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBpcHJvdCkgdGhyb3dzICIKLSAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJzY2hlbWVzLmdldChpcHJvdC5nZXRTY2hlbWUoKSkuZ2V0U2NoZW1lKCkucmVhZChpcHJvdCwgdGhpcyk7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vLyBnZW5lcmF0ZXMgamF2YSBtZXRob2QgdG8gcGVyZm9ybSB2YXJpb3VzIGNoZWNrcwotLy8gKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfdmFsaWRhdG9yKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgIi8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMiIDw8IGVuZGw7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICAgIGlmIChiZWFuX3N0eWxlXykgewotICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICA8PCAiICB0aHJvdyBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRXhjZXB0aW9uKFwiUmVxdWlyZWQgZmllbGQgJyIKLSAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJyBpcyB1bnNldCEgU3RydWN0OlwiICsgdG9TdHJpbmcoKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSkgewotICAgICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOwotICAgICAgICAgIGluZGVudChvdXQpCi0gICAgICAgICAgICAgIDw8ICIgIHRocm93IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xFeGNlcHRpb24oXCJSZXF1aXJlZCBmaWVsZCAnIgotICAgICAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicgd2FzIG5vdCBwcmVzZW50ISBTdHJ1Y3Q6IFwiICsgdG9TdHJpbmcoKSk7IiA8PCBlbmRsOwotICAgICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGluZGVudChvdXQpIDw8ICIvLyBhbGFzLCB3ZSBjYW5ub3QgY2hlY2sgJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgPDwgIicgYmVjYXVzZSBpdCdzIGEgcHJpbWl0aXZlIGFuZCB5b3UgY2hvc2UgdGhlIG5vbi1iZWFucyBnZW5lcmF0b3IuIgotICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBvdXQgPDwgaW5kZW50KCkgPDwgIi8vIGNoZWNrIGZvciBzdWItc3RydWN0IHZhbGlkaXR5IiA8PCBlbmRsOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfdHlwZSogdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICBpZiAodHlwZS0+aXNfc3RydWN0KCkgJiYgISgodF9zdHJ1Y3QqKXR5cGUpLT5pc191bmlvbigpKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9IG51bGwpIHsiIDw8IGVuZGw7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIi52YWxpZGF0ZSgpOyIgPDwgZW5kbDsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHdyaXRlIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QKLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF93cml0ZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgKHZvaWQpdHN0cnVjdDsKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIHdyaXRlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBvcHJvdCkgdGhyb3dzICIKLSAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJzY2hlbWVzLmdldChvcHJvdC5nZXRTY2hlbWUoKSkuZ2V0U2NoZW1lKCkud3JpdGUob3Byb3QsIHRoaXMpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHdyaXRlIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QsCi0gKiB3aGljaCBpcyBhIGZ1bmN0aW9uIHJlc3VsdC4gVGhlc2UgZmllbGRzIGFyZSBvbmx5IHdyaXR0ZW4KLSAqIGlmIHRoZXkgYXJlIHNldCBpbiB0aGUgSXNzZXQgYXJyYXksIGFuZCBvbmx5IG9uZSBvZiB0aGVtCi0gKiBjYW4gYmUgc2V0IGF0IGEgdGltZS4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gICh2b2lkKXRzdHJ1Y3Q7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgb3Byb3QpIHRocm93cyAiCi0gICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAic2NoZW1lcy5nZXQob3Byb3QuZ2V0U2NoZW1lKCkpLmdldFNjaGVtZSgpLndyaXRlKG9wcm90LCB0aGlzKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X2ZpZWxkX2J5X2lkKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gICh2b2lkKXRzdHJ1Y3Q7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgX0ZpZWxkcyBmaWVsZEZvcklkKGludCBmaWVsZElkKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gX0ZpZWxkcy5maW5kQnlUaHJpZnRJZChmaWVsZElkKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmVmbGVjdGlvbl9nZXR0ZXJzKG9zdHJpbmdzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNhcF9uYW1lKSB7Ci0gIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZF9uYW1lKSA8PCAiOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJyZXR1cm4gIiA8PCAodHlwZS0+aXNfYm9vbCgpID8gImlzIiA6ICJnZXQiKSA8PCBjYXBfbmFtZSA8PCAiKCk7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmVmbGVjdGlvbl9zZXR0ZXJzKG9zdHJpbmdzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNhcF9uYW1lKSB7Ci0gIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZF9uYW1lKSA8PCAiOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJpZiAodmFsdWUgPT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgdW5zZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKSA8PCAiKCk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHNldCIgPDwgY2FwX25hbWUgPDwgIigoIiA8PCB0eXBlX25hbWUodHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIpdmFsdWUpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJicmVhazsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIGdldHRlcl9zdHJlYW07Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBzZXR0ZXJfc3RyZWFtOwotCi0gIC8vIGJ1aWxkIHVwIHRoZSBib2RpZXMgb2YgYm90aCB0aGUgZ2V0dGVyIGFuZCBzZXR0ZXIgYXQgb25jZQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOwotICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoZmllbGQtPmdldF90eXBlKCkpOwotICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKLSAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKTsKLQotICAgIGluZGVudF91cCgpOwotICAgIGdlbmVyYXRlX3JlZmxlY3Rpb25fc2V0dGVycyhzZXR0ZXJfc3RyZWFtLCB0eXBlLCBmaWVsZF9uYW1lLCBjYXBfbmFtZSk7Ci0gICAgZ2VuZXJhdGVfcmVmbGVjdGlvbl9nZXR0ZXJzKGdldHRlcl9zdHJlYW0sIHR5cGUsIGZpZWxkX25hbWUsIGNhcF9uYW1lKTsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0KLSAgLy8gY3JlYXRlIHRoZSBzZXR0ZXIKLQotICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgc2V0RmllbGRWYWx1ZShfRmllbGRzIGZpZWxkLCBPYmplY3QgdmFsdWUpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHN3aXRjaCAoZmllbGQpIHsiIDw8IGVuZGw7Ci0gIG91dCA8PCBzZXR0ZXJfc3RyZWFtLnN0cigpOwotICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIGNyZWF0ZSB0aGUgZ2V0dGVyCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgT2JqZWN0IGdldEZpZWxkVmFsdWUoX0ZpZWxkcyBmaWVsZCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkKSB7IiA8PCBlbmRsOwotICBvdXQgPDwgZ2V0dGVyX3N0cmVhbS5zdHIoKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vLyBDcmVhdGVzIGEgZ2VuZXJpYyBpc1NldCBtZXRob2QgdGhhdCB0YWtlcyB0aGUgZmllbGQgbnVtYmVyIGFzIGFyZ3VtZW50Ci12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2dlbmVyaWNfaXNzZXRfbWV0aG9kKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIC8vIGNyZWF0ZSB0aGUgaXNTZXQgbWV0aG9kCi0gIGluZGVudChvdXQpIDw8ICIvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIGNvcnJlc3BvbmRpbmcgdG8gZmllbGRJRCBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgIgotICAgICAgICAgICAgICAgICAidmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgYm9vbGVhbiBpc1NldChfRmllbGRzIGZpZWxkKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgImlmIChmaWVsZCA9PSBudWxsKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkKSB7IiA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOwotICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIjoiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInJldHVybiAiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkKSA8PCAiOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNldCBvZiBKYXZhIEJlYW4gYm9pbGVycGxhdGUgZnVuY3Rpb25zIChzZXR0ZXJzLCBnZXR0ZXJzLCBldGMuKQotICogZm9yIHRoZSBnaXZlbiBzdHJ1Y3QuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9iZWFuX2JvaWxlcnBsYXRlKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGlzc2V0X3R5cGUgaXNzZXRUeXBlID0gbmVlZHNfaXNzZXQodHN0cnVjdCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7Ci0gICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOwotICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lID0gZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpOwotICAgIGJvb2wgb3B0aW9uYWwgPSB1c2Vfb3B0aW9uX3R5cGVfICYmIGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKLQotICAgIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgLy8gTWV0aG9kIHRvIHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgY29sbGVjdGlvbgotICAgICAgaWYgKG9wdGlvbmFsKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgT3B0aW9uPEludGVnZXI+IGdldCIgPDwgY2FwX25hbWU7Ci0gICAgICAgIG91dCA8PCBnZXRfY2FwX25hbWUoInNpemUoKSB7IikgPDwgZW5kbDsKLQotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgImlmICh0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID09IG51bGwpIHsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIE9wdGlvbi5ub25lKCk7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIE9wdGlvbi5zb21lKHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIuc2l6ZSgpKTsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBpbnQgZ2V0IiA8PCBjYXBfbmFtZTsKLSAgICAgICAgb3V0IDw8IGdldF9jYXBfbmFtZSgic2l6ZSgpIHsiKSA8PCBlbmRsOwotCi0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICh0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID09IG51bGwpID8gMCA6ICIKLSAgICAgICAgICAgICAgICAgICAgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIuc2l6ZSgpOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAodHlwZS0+aXNfc2V0KCkgfHwgdHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICB0X3R5cGUqIGVsZW1lbnRfdHlwZTsKLSAgICAgIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgICAgICBlbGVtZW50X3R5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZWxlbWVudF90eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIEl0ZXJhdG9yIGdldHRlciBmb3Igc2V0cyBhbmQgbGlzdHMKLSAgICAgIGlmIChvcHRpb25hbCkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIE9wdGlvbjxqYXZhLnV0aWwuSXRlcmF0b3I8IiA8PCB0eXBlX25hbWUoZWxlbWVudF90eXBlLCB0cnVlLCBmYWxzZSkKLSAgICAgICAgICAgICAgICAgICAgPDwgIj4+IGdldCIgPDwgY2FwX25hbWU7Ci0gICAgICAgIG91dCA8PCBnZXRfY2FwX25hbWUoIml0ZXJhdG9yKCkgeyIpIDw8IGVuZGw7Ci0KLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiBPcHRpb24ubm9uZSgpOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiBPcHRpb24uc29tZSh0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiLml0ZXJhdG9yKCkpOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGphdmEudXRpbC5JdGVyYXRvcjwiIDw8IHR5cGVfbmFtZShlbGVtZW50X3R5cGUsIHRydWUsIGZhbHNlKQotICAgICAgICAgICAgICAgICAgICA8PCAiPiBnZXQiIDw8IGNhcF9uYW1lOwotICAgICAgICBvdXQgPDwgZ2V0X2NhcF9uYW1lKCJpdGVyYXRvcigpIHsiKSA8PCBlbmRsOwotCi0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICh0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID09IG51bGwpID8gbnVsbCA6ICIKLSAgICAgICAgICAgICAgICAgICAgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIuaXRlcmF0b3IoKTsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIC8vIEFkZCB0byBzZXQgb3IgbGlzdCwgY3JlYXRlIGlmIHRoZSBzZXQvbGlzdCBpcyBudWxsCi0gICAgICBpbmRlbnQob3V0KTsKLSAgICAgIG91dCA8PCAicHVibGljIHZvaWQgYWRkIiA8PCBnZXRfY2FwX25hbWUoInRvIik7Ci0gICAgICBvdXQgPDwgY2FwX25hbWUgPDwgIigiIDw8IHR5cGVfbmFtZShlbGVtZW50X3R5cGUpIDw8ICIgZWxlbSkgeyIgPDwgZW5kbDsKLQotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiCi0gICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIuYWRkKGVsZW0pOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgIC8vIFB1dCB0byBtYXAKLSAgICAgIHRfdHlwZSoga2V5X3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgICB0X3R5cGUqIHZhbF90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotCi0gICAgICBpbmRlbnQob3V0KTsKLSAgICAgIG91dCA8PCAicHVibGljIHZvaWQgcHV0IiA8PCBnZXRfY2FwX25hbWUoInRvIik7Ci0gICAgICBvdXQgPDwgY2FwX25hbWUgPDwgIigiIDw8IHR5cGVfbmFtZShrZXlfdHlwZSkgPDwgIiBrZXksICIgPDwgdHlwZV9uYW1lKHZhbF90eXBlKSA8PCAiIHZhbCkgeyIKLSAgICAgICAgICA8PCBlbmRsOwotCi0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIKLSAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIi5wdXQoa2V5LCB2YWwpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAgIH0KLQotICAgIC8vIFNpbXBsZSBnZXR0ZXIKLSAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsIGZpZWxkKTsKLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGJ5dGVbXSBnZXQiIDw8IGNhcF9uYW1lIDw8ICIoKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgc2V0IiA8PCBjYXBfbmFtZSA8PCAiKG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLnJpZ2h0U2l6ZSgiCi0gICAgICAgICAgICAgICAgICA8PCBmaWVsZF9uYW1lIDw8ICIpKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT0gbnVsbCA/IG51bGwgOiAiIDw8IGZpZWxkX25hbWUgPDwgIi5hcnJheSgpOyIKLSAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIEJ5dGVCdWZmZXIgYnVmZmVyIiA8PCBnZXRfY2FwX25hbWUoImZvciIpIDw8IGNhcF9uYW1lIDw8ICIoKSB7IgotICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb3B5QmluYXJ5KCIgPDwgZmllbGRfbmFtZSA8PCAiKTsiCi0gICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaWYgKG9wdGlvbmFsKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgT3B0aW9uPCIgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUpIDw8ICI+IjsKLSAgICAgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpID09IHRfYmFzZV90eXBlOjpUWVBFX0JPT0wpIHsKLSAgICAgICAgICBvdXQgPDwgIiBpcyI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgb3V0IDw8ICIgZ2V0IjsKLSAgICAgICAgfQotICAgICAgICBvdXQgPDwgY2FwX25hbWUgPDwgIigpIHsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotCi0gICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodGhpcy5pc1NldCIgPDwgY2FwX25hbWUgPDwgIigpKSB7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiBPcHRpb24uc29tZSh0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gT3B0aW9uLm5vbmUoKTsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHR5cGVfbmFtZSh0eXBlKTsKLSAgICAgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpID09IHRfYmFzZV90eXBlOjpUWVBFX0JPT0wpIHsKLSAgICAgICAgICBvdXQgPDwgIiBpcyI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgb3V0IDw8ICIgZ2V0IjsKLSAgICAgICAgfQotICAgICAgICBvdXQgPDwgY2FwX25hbWUgPDwgIigpIHsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIFNpbXBsZSBzZXR0ZXIKLSAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsIGZpZWxkKTsKLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICI7Ci0gICAgICBpZiAoYmVhbl9zdHlsZV8pIHsKLSAgICAgICAgb3V0IDw8ICJ2b2lkIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCB0eXBlX25hbWUodHN0cnVjdCk7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgIiBzZXQiIDw8IGNhcF9uYW1lIDw8ICIoYnl0ZVtdICIgPDwgZmllbGRfbmFtZSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9ICIgPDwgZmllbGRfbmFtZSA8PCAiID09IG51bGwgPyAoQnl0ZUJ1ZmZlciludWxsIgotICAgICAgICAgICAgICAgICAgPDwgIiA6IEJ5dGVCdWZmZXIud3JhcChBcnJheXMuY29weU9mKCIgPDwgZmllbGRfbmFtZSA8PCAiLCAiIDw8IGZpZWxkX25hbWUKLSAgICAgICAgICAgICAgICAgIDw8ICIubGVuZ3RoKSk7IiA8PCBlbmRsOwotICAgICAgaWYgKCFiZWFuX3N0eWxlXykgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gdGhpczsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICI7Ci0gICAgaWYgKGJlYW5fc3R5bGVfKSB7Ci0gICAgICBvdXQgPDwgInZvaWQiOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpOwotICAgIH0KLSAgICBvdXQgPDwgIiBzZXQiIDw8IGNhcF9uYW1lIDw8ICIoIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiIDw8IGZpZWxkX25hbWUgPDwgIikgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9ICI7Ci0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgb3V0IDw8ICJvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb3B5QmluYXJ5KCIgPDwgZmllbGRfbmFtZSA8PCAiKSI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCBmaWVsZF9uYW1lOwotICAgIH0KLSAgICBvdXQgPDwgIjsiIDw8IGVuZGw7Ci0gICAgZ2VuZXJhdGVfaXNzZXRfc2V0KG91dCwgZmllbGQsICIiKTsKLSAgICBpZiAoIWJlYW5fc3R5bGVfKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXM7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIC8vIFVuc2V0dGVyCi0gICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIHVuc2V0IiA8PCBjYXBfbmFtZSA8PCAiKCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBudWxsOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKGlzc2V0VHlwZSA9PSBJU1NFVF9QUklNSVRJVkUpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X2JpdGZpZWxkID0gRW5jb2RpbmdVdGlscy5jbGVhckJpdChfX2lzc2V0X2JpdGZpZWxkLCAiCi0gICAgICAgICAgICAgICAgICA8PCBpc3NldF9maWVsZF9pZChmaWVsZCkgPDwgIik7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldF9iaXRfdmVjdG9yLmNsZWFyKCIgPDwgaXNzZXRfZmllbGRfaWQoZmllbGQpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgLy8gaXNTZXQgbWV0aG9kCi0gICAgaW5kZW50KG91dCkgPDwgIi8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgIiA8PCBmaWVsZF9uYW1lCi0gICAgICAgICAgICAgICAgPDwgIiBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8iIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBib29sZWFuIGlzIiA8PCBnZXRfY2FwX25hbWUoInNldCIpIDw8IGNhcF9uYW1lIDw8ICIoKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgIT0gbnVsbDsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmIChpc3NldFR5cGUgPT0gSVNTRVRfUFJJTUlUSVZFKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIEVuY29kaW5nVXRpbHMudGVzdEJpdChfX2lzc2V0X2JpdGZpZWxkLCAiIDw8IGlzc2V0X2ZpZWxkX2lkKGZpZWxkKQotICAgICAgICAgICAgICAgICAgPDwgIik7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIF9faXNzZXRfYml0X3ZlY3Rvci5nZXQoIiA8PCBpc3NldF9maWVsZF9pZChmaWVsZCkgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgc2V0IiA8PCBjYXBfbmFtZSA8PCBnZXRfY2FwX25hbWUoImlzU2V0IikgPDwgIihib29sZWFuIHZhbHVlKSB7IgotICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIXZhbHVlKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG51bGw7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmIChpc3NldFR5cGUgPT0gSVNTRVRfUFJJTUlUSVZFKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldF9iaXRmaWVsZCA9IEVuY29kaW5nVXRpbHMuc2V0Qml0KF9faXNzZXRfYml0ZmllbGQsICIKLSAgICAgICAgICAgICAgICAgIDw8IGlzc2V0X2ZpZWxkX2lkKGZpZWxkKSA8PCAiLCB2YWx1ZSk7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldF9iaXRfdmVjdG9yLnNldCgiIDw8IGlzc2V0X2ZpZWxkX2lkKGZpZWxkKSA8PCAiLCB2YWx1ZSk7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0b1N0cmluZygpIG1ldGhvZCBmb3IgdGhlIGdpdmVuIHN0cnVjdAotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3Rvc3RyaW5nKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICJTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoXCIiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIihcIik7IgotICAgICAgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJib29sZWFuIGZpcnN0ID0gdHJ1ZTsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGJvb2wgY291bGRfYmVfdW5zZXQgPSAoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMOwotICAgIGlmIChjb3VsZF9iZV91bnNldCkgewotICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCpmX2l0ZXIpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0KLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqZl9pdGVyKTsKLQotICAgIGlmICghZmlyc3QpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIWZpcnN0KSBzYi5hcHBlbmQoXCIsIFwiKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudChvdXQpIDw8ICJzYi5hcHBlbmQoXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOlwiKTsiIDw8IGVuZGw7Ci0gICAgYm9vbCBjYW5fYmVfbnVsbCA9IHR5cGVfY2FuX2JlX251bGwoZmllbGQtPmdldF90eXBlKCkpOwotICAgIGlmIChjYW5fYmVfbnVsbCkgewotICAgICAgaW5kZW50KG91dCkgPDwgImlmICh0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIHNiLmFwcGVuZChcIm51bGxcIik7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotCi0gICAgaWYgKGdldF90cnVlX3R5cGUoZmllbGQtPmdldF90eXBlKCkpLT5pc19iYXNlX3R5cGUoKQotICAgICAgICAmJiAoKHRfYmFzZV90eXBlKikoZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSkpKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci50b1N0cmluZyh0aGlzLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiwgc2IpOyIKLSAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmICgoZmllbGQtPmdldF90eXBlKCktPmlzX3NldCgpKQotICAgICAgICAgICAgICAgJiYgKGdldF90cnVlX3R5cGUoKCh0X3NldCopZmllbGQtPmdldF90eXBlKCkpLT5nZXRfZWxlbV90eXBlKCkpLT5pc19iYXNlX3R5cGUoKSkKLSAgICAgICAgICAgICAgICYmICgoKHRfYmFzZV90eXBlKilnZXRfdHJ1ZV90eXBlKCgodF9zZXQqKWZpZWxkLT5nZXRfdHlwZSgpKS0+Z2V0X2VsZW1fdHlwZSgpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgLT5pc19iaW5hcnkoKSkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci50b1N0cmluZyh0aGlzLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiwgc2IpOyIKLSAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmICgoZmllbGQtPmdldF90eXBlKCktPmlzX2xpc3QoKSkKLSAgICAgICAgICAgICAgICYmIChnZXRfdHJ1ZV90eXBlKCgodF9saXN0KilmaWVsZC0+Z2V0X3R5cGUoKSktPmdldF9lbGVtX3R5cGUoKSktPmlzX2Jhc2VfdHlwZSgpKQotICAgICAgICAgICAgICAgJiYgKCgodF9iYXNlX3R5cGUqKWdldF90cnVlX3R5cGUoKCh0X2xpc3QqKWZpZWxkLT5nZXRfdHlwZSgpKS0+Z2V0X2VsZW1fdHlwZSgpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgLT5pc19iaW5hcnkoKSkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci50b1N0cmluZyh0aGlzLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiwgc2IpOyIKLSAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJzYi5hcHBlbmQodGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaWYgKGNhbl9iZV9udWxsKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudChvdXQpIDw8ICJmaXJzdCA9IGZhbHNlOyIgPDwgZW5kbDsKLQotICAgIGlmIChjb3VsZF9iZV91bnNldCkgewotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgICBmaXJzdCA9IGZhbHNlOwotICB9Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAic2IuYXBwZW5kKFwiKVwiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJldHVybiBzYi50b1N0cmluZygpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0YXRpYyBtYXAgd2l0aCBtZXRhIGRhdGEgdG8gc3RvcmUgaW5mb3JtYXRpb24gc3VjaCBhcyBmaWVsZElEIHRvCi0gKiBmaWVsZE5hbWUgbWFwcGluZwotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfbWV0YV9kYXRhX21hcChvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gU3RhdGljIE1hcCB3aXRoIGZpZWxkSUQgLT4gb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEgbWFwcGluZ3MKLSAgaW5kZW50KG91dCkKLSAgICAgIDw8ICJwdWJsaWMgc3RhdGljIGZpbmFsIE1hcDxfRmllbGRzLCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YT4gbWV0YURhdGFNYXA7IgotICAgICAgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInN0YXRpYyB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQob3V0KSA8PCAiTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPiB0bXBNYXAgPSBuZXcgIgotICAgICAgICAgICAgICAgICAiRW51bU1hcDxfRmllbGRzLCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YT4oX0ZpZWxkcy5jbGFzcyk7IgotICAgICAgICAgICAgICA8PCBlbmRsOwotCi0gIC8vIFBvcHVsYXRlIG1hcAotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKLSAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZmllbGQtPmdldF9uYW1lKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInRtcE1hcC5wdXQoX0ZpZWxkcy4iIDw8IGNvbnN0YW50X25hbWUoZmllbGRfbmFtZSkKLSAgICAgICAgICAgICAgICA8PCAiLCBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEoXCIiIDw8IGZpZWxkX25hbWUgPDwgIlwiLCAiOwotCi0gICAgLy8gU2V0IGZpZWxkIHJlcXVpcmVtZW50IHR5cGUgKHJlcXVpcmVkLCBvcHRpb25hbCwgZXRjLikKLSAgICBpZiAoZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICBvdXQgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZFJlcXVpcmVtZW50VHlwZS5SRVFVSVJFRCwgIjsKLSAgICB9IGVsc2UgaWYgKGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCkgewotICAgICAgb3V0IDw8ICJvcmcuYXBhY2hlLnRocmlmdC5URmllbGRSZXF1aXJlbWVudFR5cGUuT1BUSU9OQUwsICI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCAib3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLkRFRkFVTFQsICI7Ci0gICAgfQotCi0gICAgLy8gQ3JlYXRlIHZhbHVlIG1ldGEgZGF0YQotICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgICBvdXQgPDwgIikpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8ICJtZXRhRGF0YU1hcCA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcCh0bXBNYXApOyIgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAib3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEuYWRkU3RydWN0TWV0YURhdGFNYXAoIgotICAgICAgICAgICAgICA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIi5jbGFzcywgbWV0YURhdGFNYXApOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIGEgc3RyaW5nIHdpdGggdGhlIGphdmEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIHRocmlmdCB0eXBlCi0gKiAoZS5nLiBmb3IgdGhlIHR5cGUgc3RydWN0IGl0IHJldHVybnMgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCIpCi0gKi8KLXN0ZDo6c3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmdldF9qYXZhX3R5cGVfc3RyaW5nKHRfdHlwZSogdHlwZSkgewotICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5MSVNUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTUFQIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU0VUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuRU5VTSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgcmV0dXJuIGdldF9qYXZhX3R5cGVfc3RyaW5nKCgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICBzd2l0Y2ggKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5WT0lEIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkciOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5CT09MIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuQllURSI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTE2IjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JMzIiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkk2NCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuRE9VQkxFIjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIlVua25vd24gdGhyaWZ0IHR5cGUgXCIiICsgdHlwZS0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiIHBhc3NlZCB0byB0X2phdmFfZ2VuZXJhdG9yOjpnZXRfamF2YV90eXBlX3N0cmluZyEiKTsKLSAgICAgIHJldHVybiAiVW5rbm93biB0aHJpZnQgdHlwZSBcIiIgKyB0eXBlLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgKyAiXCIgcGFzc2VkIHRvIHRfamF2YV9nZW5lcmF0b3I6OmdldF9qYXZhX3R5cGVfc3RyaW5nISI7Ci0gICAgICBicmVhazsgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIQotICAgIH0KLSAgfSBlbHNlIHsKLSAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIlVua25vd24gdGhyaWZ0IHR5cGUgXCIiICsgdHlwZS0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJcIiBwYXNzZWQgdG8gdF9qYXZhX2dlbmVyYXRvcjo6Z2V0X2phdmFfdHlwZV9zdHJpbmchIik7Ci0gICAgcmV0dXJuICJVbmtub3duIHRocmlmdCB0eXBlIFwiIiArIHR5cGUtPmdldF9uYW1lKCkKLSAgICAgICAgICAgKyAiXCIgcGFzc2VkIHRvIHRfamF2YV9nZW5lcmF0b3I6OmdldF9qYXZhX3R5cGVfc3RyaW5nISI7Ci0gICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIQotICB9Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlKSB7Ci0gIG91dCA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50X3VwKCk7Ci0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJuZXcgIgotICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuU3RydWN0TWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuIgotICAgICAgICAgICAgICAgICAgICJTVFJVQ1QsICIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIuY2xhc3MiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgaW5kZW50KG91dCkKLSAgICAgICAgICA8PCAibmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5MaXN0TWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTElTVCwgIjsKLSAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCBlbGVtX3R5cGUpOwotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIGluZGVudChvdXQpCi0gICAgICAgICAgPDwgIm5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuU2V0TWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU0VULCAiOwotICAgICAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGVsZW1fdHlwZSk7Ci0gICAgfSBlbHNlIHsgLy8gbWFwCi0gICAgICBpbmRlbnQob3V0KQotICAgICAgICAgIDw8ICJuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLk1hcE1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLk1BUCwgIjsKLSAgICAgIHRfdHlwZSoga2V5X3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgICB0X3R5cGUqIHZhbF90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwga2V5X3R5cGUpOwotICAgICAgb3V0IDw8ICIsICI7Ci0gICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCB2YWxfdHlwZSk7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIGluZGVudChvdXQpCi0gICAgICAgIDw8ICJuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkVudW1NZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5FTlVNLCAiCi0gICAgICAgIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiLmNsYXNzIjsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQob3V0KSA8PCAibmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZFZhbHVlTWV0YURhdGEoIgotICAgICAgICAgICAgICAgIDw8IGdldF9qYXZhX3R5cGVfc3RyaW5nKHR5cGUpOwotICAgIGlmICh0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICIsIFwiIiA8PCAoKHRfdHlwZWRlZiopdHlwZSktPmdldF9zeW1ib2xpYygpIDw8ICJcIiI7Ci0gICAgfSBlbHNlIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICIsIHRydWUiOwotICAgIH0KLSAgfQotICBvdXQgPDwgIikiOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnRfZG93bigpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLiBJbiBDKyssIHRoaXMgY29tcHJpc2VzIGFuIGVudGlyZWx5IHNlcGFyYXRlCi0gKiBoZWFkZXIgYW5kIHNvdXJjZSBmaWxlLiBUaGUgaGVhZGVyIGZpbGUgZGVmaW5lcyB0aGUgbWV0aG9kcyBhbmQgaW5jbHVkZXMKLSAqIHRoZSBkYXRhIHR5cGVzIGRlZmluZWQgaW4gdGhlIG1haW4gaGVhZGVyIGZpbGUsIGFuZCB0aGUgaW1wbGVtZW50YXRpb24KLSAqIGZpbGUgY29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBiYXNpYyBwcmludGVyIGFuZCBkZWZhdWx0IGludGVyZmFjZXMuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgLy8gTWFrZSBvdXRwdXQgZmlsZQotICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBtYWtlX3ZhbGlkX2phdmFfZmlsZW5hbWUoc2VydmljZV9uYW1lXykgKyAiLmphdmEiOwotICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7Ci0KLSAgZl9zZXJ2aWNlXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBqYXZhX3BhY2thZ2UoKSA8PCBqYXZhX3R5cGVfaW1wb3J0cygpIDw8IGphdmFfc3VwcHJlc3Npb25zKCk7Ci0KLSAgaWYgKCFzdXBwcmVzc19nZW5lcmF0ZWRfYW5ub3RhdGlvbnNfKSB7Ci0gICAgZ2VuZXJhdGVfamF2YXhfZ2VuZXJhdGVkX2Fubm90YXRpb24oZl9zZXJ2aWNlXyk7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PCAicHVibGljIGNsYXNzICIgPDwgc2VydmljZV9uYW1lXyA8PCAiIHsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHRocmVlIG1haW4gcGFydHMgb2YgdGhlIHNlcnZpY2UKLSAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2FzeW5jX2ludGVyZmFjZSh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9hc3luY19jbGllbnQodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfYXN5bmNfc2VydmVyKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKLQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsOwotICBmX3NlcnZpY2VfLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX2lmYWNlID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgZXh0ZW5kc19pZmFjZSA9ICIgZXh0ZW5kcyAiICsgZXh0ZW5kcyArICIuSWZhY2UiOwotICB9Ci0KLSAgZ2VuZXJhdGVfamF2YV9kb2MoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgaW50ZXJmYWNlIElmYWNlIiA8PCBleHRlbmRzX2lmYWNlIDw8ICIgeyIgPDwgZW5kbCA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfamF2YV9kb2MoZl9zZXJ2aWNlXywgKmZfaXRlcik7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9hc3luY19pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19pZmFjZSA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIGV4dGVuZHNfaWZhY2UgPSAiIGV4dGVuZHMgIiArIGV4dGVuZHMgKyAiIC5Bc3luY0lmYWNlIjsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInB1YmxpYyBpbnRlcmZhY2UgQXN5bmNJZmFjZSIgPDwgZXh0ZW5kc19pZmFjZSA8PCAiIHsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jKCpmX2l0ZXIsIHRydWUpCi0gICAgICAgICAgICAgICAgICAgICAgIDw8ICIgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBzdHJ1Y3RzIGZvciBhbGwgdGhlIHNlcnZpY2UgYXJncyBhbmQgcmV0dXJuIHR5cGVzCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGdlbmVyYXRlX2phdmFfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgdHMsIGZhbHNlLCB0cnVlKTsKLSAgICBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSA9PSBOVUxMKSB7Ci0gICAgZXh0ZW5kc19jbGllbnQgPSAib3JnLmFwYWNoZS50aHJpZnQuVFNlcnZpY2VDbGllbnQiOwotICB9IGVsc2UgewotICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIGV4dGVuZHNfY2xpZW50ID0gZXh0ZW5kcyArICIuQ2xpZW50IjsKLSAgfQotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIHN0YXRpYyBjbGFzcyBDbGllbnQgZXh0ZW5kcyAiIDw8IGV4dGVuZHNfY2xpZW50Ci0gICAgICAgICAgICAgICAgICAgICA8PCAiIGltcGxlbWVudHMgSWZhY2UgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pCi0gICAgICA8PCAicHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5IGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVFNlcnZpY2VDbGllbnRGYWN0b3J5PENsaWVudD4geyIKLSAgICAgIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBGYWN0b3J5KCkge30iIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIENsaWVudCBnZXRDbGllbnQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3QpIHsiCi0gICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gbmV3IENsaWVudChwcm90KTsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgQ2xpZW50IGdldENsaWVudChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaXByb3QsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgb3Byb3QpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiBuZXcgQ2xpZW50KGlwcm90LCBvcHJvdCk7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIENsaWVudChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgcHJvdCkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInN1cGVyKHByb3QsIHByb3QpOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIENsaWVudChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaXByb3QsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgb3Byb3QpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBzdXBlcihpcHJvdCwgb3Byb3QpOyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgc3RyaW5nIHNlcCA9ICJfIjsKLSAgICBzdHJpbmcgamF2YW5hbWUgPSBmdW5uYW1lOwotICAgIGlmIChmdWxsY2FtZWxfc3R5bGVfKSB7Ci0gICAgICBzZXAgPSAiIjsKLSAgICAgIGphdmFuYW1lID0gYXNfY2FtZWxfY2FzZShmdW5uYW1lKTsKLSAgICB9Ci0KLSAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInNlbmQiIDw8IHNlcCA8PCBqYXZhbmFtZSA8PCAiKCI7Ci0KLSAgICAvLyBHZXQgdGhlIHN0cnVjdCBvZiBmdW5jdGlvbiBjYWxsIHBhcmFtcwotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotCi0gICAgLy8gRGVjbGFyZSB0aGUgZnVuY3Rpb24gYXJndW1lbnRzCi0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAicmV0dXJuICI7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8ICJyZWN2IiA8PCBzZXAgPDwgamF2YW5hbWUgPDwgIigpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgICB0X2Z1bmN0aW9uIHNlbmRfZnVuY3Rpb24oZ190eXBlX3ZvaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygic2VuZCIpICsgc2VwICsgamF2YW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSk7Ci0KLSAgICBzdHJpbmcgYXJnc25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiOwotCi0gICAgLy8gT3BlbiBmdW5jdGlvbgotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZzZW5kX2Z1bmN0aW9uKSA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0gICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGFyZ3NuYW1lIDw8ICIgYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0KLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJhcmdzLnNldCIgPDwgZ2V0X2NhcF9uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKCIKLSAgICAgICAgICAgICAgICAgICAgICAgICA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgY29uc3Qgc3RyaW5nIHNlbmRCYXNlTmFtZSA9ICgqZl9pdGVyKS0+aXNfb25ld2F5KCkgPyAic2VuZEJhc2VPbmV3YXkiIDogInNlbmRCYXNlIjsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgc2VuZEJhc2VOYW1lIDw8ICIoXCIiIDw8IGZ1bm5hbWUgPDwgIlwiLCBhcmdzKTsiIDw8IGVuZGw7Ci0KLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgc3RyaW5nIHJlc3VsdG5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7Ci0KLSAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7Ci0gICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygicmVjdiIpICsgc2VwICsgamF2YW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vYXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKSk7Ci0gICAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbikgPDwgZW5kbDsKLSAgICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IHJlc3VsdG5hbWUgPDwgIiByZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInJlY2VpdmVCYXNlKHJlc3VsdCwgXCIiIDw8IGZ1bm5hbWUgPDwgIlwiKTsiIDw8IGVuZGw7Ci0KLSAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0LiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soInN1Y2Nlc3MiKSA8PCAiKSB7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHJlc3VsdC5zdWNjZXNzOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9IG51bGwpIHsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICB0aHJvdyByZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgLy8gSWYgeW91IGdldCBoZXJlIGl0J3MgYW4gZXhjZXB0aW9uLCB1bmxlc3MgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidGhyb3cgbmV3ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKG9yZy5hcGFjaGUudGhyaWZ0LiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uLk1JU1NJTkdfUkVTVUxULCBcIiIKLSAgICAgICAgICAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0XCIpOyIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfYXN5bmNfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAib3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuVEFzeW5jQ2xpZW50IjsKLSAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSkgKyAiLkFzeW5jQ2xpZW50IjsKLSAgfQotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIHN0YXRpYyBjbGFzcyBBc3luY0NsaWVudCBleHRlbmRzICIgPDwgZXh0ZW5kcwotICAgICAgICAgICAgICAgICAgICAgPDwgIiBpbXBsZW1lbnRzIEFzeW5jSWZhY2UgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgLy8gRmFjdG9yeSBtZXRob2QKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3RvcnkgaW1wbGVtZW50cyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuVEFzeW5jQ2xpZW50RmFjdG9yeTxBc3luY0NsaWVudD4geyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHByaXZhdGUgb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuVEFzeW5jQ2xpZW50TWFuYWdlciBjbGllbnRNYW5hZ2VyOyIKLSAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBwcml2YXRlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5OyIKLSAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBwdWJsaWMgRmFjdG9yeShvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5UQXN5bmNDbGllbnRNYW5hZ2VyICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJjbGllbnRNYW5hZ2VyLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xGYWN0b3J5ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJwcm90b2NvbEZhY3RvcnkpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICAgIHRoaXMuY2xpZW50TWFuYWdlciA9IGNsaWVudE1hbmFnZXI7IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgICB0aGlzLnByb3RvY29sRmFjdG9yeSA9IHByb3RvY29sRmFjdG9yeTsiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICB9IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgcHVibGljIEFzeW5jQ2xpZW50ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJnZXRBc3luY0NsaWVudChvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE5vbmJsb2NraW5nVHJhbnNwb3J0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc3BvcnQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICAgIHJldHVybiBuZXcgQXN5bmNDbGllbnQocHJvdG9jb2xGYWN0b3J5LCBjbGllbnRNYW5hZ2VyLCB0cmFuc3BvcnQpOyIKLSAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICB9IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBBc3luY0NsaWVudChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xGYWN0b3J5ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJwcm90b2NvbEZhY3RvcnksIG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLlRBc3luY0NsaWVudE1hbmFnZXIgIgotICAgICAgICAgICAgICAgICAgICAgICAgImNsaWVudE1hbmFnZXIsIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTm9uYmxvY2tpbmdUcmFuc3BvcnQgIgotICAgICAgICAgICAgICAgICAgICAgICAgInRyYW5zcG9ydCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHN1cGVyKHByb3RvY29sRmFjdG9yeSwgY2xpZW50TWFuYWdlciwgdHJhbnNwb3J0KTsiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIHN0cmluZyBzZXAgPSAiXyI7Ci0gICAgc3RyaW5nIGphdmFuYW1lID0gZnVubmFtZTsKLSAgICBpZiAoZnVsbGNhbWVsX3N0eWxlXykgewotICAgICAgc2VwID0gIiI7Ci0gICAgICBqYXZhbmFtZSA9IGFzX2NhbWVsX2Nhc2UoamF2YW5hbWUpOwotICAgIH0KLSAgICB0X3R5cGUqIHJldF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpOwotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIHN0cmluZyBmdW5jbGFzc25hbWUgPSBmdW5uYW1lICsgIl9jYWxsIjsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7Ci0gICAgc3RyaW5nIGFyZ3NfbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfYXJncyI7Ci0gICAgc3RyaW5nIHJlc3VsdF9uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOwotCi0gICAgLy8gTWFpbiBtZXRob2QgYm9keQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jKCpmX2l0ZXIsIGZhbHNlKQotICAgICAgICAgICAgICAgICAgICAgICA8PCAiIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIGNoZWNrUmVhZHkoKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgICIgPDwgZnVuY2xhc3NuYW1lIDw8ICIgbWV0aG9kX2NhbGwgPSBuZXcgIiArIGZ1bmNsYXNzbmFtZSArICIoIgotICAgICAgICAgICAgICAgICAgICAgICA8PCBhc3luY19hcmd1bWVudF9saXN0KCpmX2l0ZXIsIGFyZ19zdHJ1Y3QsIHJldF90eXBlKQotICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCB0aGlzLCBfX19wcm90b2NvbEZhY3RvcnksIF9fX3RyYW5zcG9ydCk7IiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICB0aGlzLl9fX2N1cnJlbnRNZXRob2QgPSBtZXRob2RfY2FsbDsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIF9fX21hbmFnZXIuY2FsbChtZXRob2RfY2FsbCk7IiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKLQotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAgIC8vIFRBc3luY01ldGhvZCBvYmplY3QgZm9yIHRoaXMgZnVuY3Rpb24gY2FsbAotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIHN0YXRpYyBjbGFzcyAiICsgZnVuY2xhc3NuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBleHRlbmRzIG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLlRBc3luY01ldGhvZENhbGwgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIC8vIE1lbWJlciB2YXJpYWJsZXMKLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcml2YXRlICIgKyB0eXBlX25hbWUoKCpmbGRfaXRlciktPmdldF90eXBlKCkpICsgIiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSArICI7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIC8vIE5PVEUgc2luY2Ugd2UgdXNlIGEgbmV3IENsaWVudCBpbnN0YW5jZSB0byBkZXNlcmlhbGl6ZSwgbGV0J3Mga2VlcCBzZXFpZCB0byAwIGZvciBub3cKLSAgICAvLyBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByaXZhdGUgaW50IHNlcWlkOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgLy8gQ29uc3RydWN0b3IKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiICsgZnVuY2xhc3NuYW1lICsgIigiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICsgYXN5bmNfYXJndW1lbnRfbGlzdCgqZl9pdGVyLCBhcmdfc3RydWN0LCByZXRfdHlwZSwgdHJ1ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuVEFzeW5jQ2xpZW50IGNsaWVudCwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnksICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTm9uYmxvY2tpbmdUcmFuc3BvcnQgdHJhbnNwb3J0KSB0aHJvd3MgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBzdXBlcihjbGllbnQsIHByb3RvY29sRmFjdG9yeSwgdHJhbnNwb3J0LCByZXN1bHRIYW5kbGVyLCAiCi0gICAgICAgICAgICAgICAgICAgICAgIDw8ICgoKmZfaXRlciktPmlzX29uZXdheSgpID8gInRydWUiIDogImZhbHNlIikgPDwgIik7IiA8PCBlbmRsOwotCi0gICAgLy8gQXNzaWduIG1lbWJlciB2YXJpYWJsZXMKLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHRoaXMuIiArICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpICsgIiA9ICIgKyAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyB2b2lkIHdyaXRlX2FyZ3Mob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3QpICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgInRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICAvLyBTZXJpYWxpemUgcmVxdWVzdAotICAgIC8vIE5PVEUgd2UgYXJlIGxlYXZpbmcgc2VxaWQgYXMgMCwgZm9yIG5vdyAoc2VlIGFib3ZlKQotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInByb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlKFwiIgotICAgICAgICAgICAgICAgPDwgZnVubmFtZSA8PCAiXCIsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLiIKLSAgICAgICAgICAgICAgIDw8ICgoKmZfaXRlciktPmlzX29uZXdheSgpID8gIlRNZXNzYWdlVHlwZS5PTkVXQVkiIDogIlRNZXNzYWdlVHlwZS5DQUxMIikgPDwgIiwgMCkpOyIKLSAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgYXJnc19uYW1lIDw8ICIgYXJncyA9IG5ldyAiIDw8IGFyZ3NfbmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotCi0gICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3Muc2V0IiA8PCBnZXRfY2FwX25hbWUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpIDw8ICIoIgotICAgICAgICAgICAgICAgICA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncy53cml0ZShwcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInByb3Qud3JpdGVNZXNzYWdlRW5kKCk7IgotICAgICAgICAgICAgICAgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICAvLyBSZXR1cm4gbWV0aG9kCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiArIHR5cGVfbmFtZShyZXRfdHlwZSkgKyAiIGdldFJlc3VsdCgpIHRocm93cyAiOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpICsgIiwgIjsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAib3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X3VwKCk7Ci0gICAgZl9zZXJ2aWNlXwotICAgICAgICA8PCBpbmRlbnQoKQotICAgICAgICA8PCAiaWYgKGdldFN0YXRlKCkgIT0gb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuVEFzeW5jTWV0aG9kQ2FsbC5TdGF0ZS5SRVNQT05TRV9SRUFEKSB7IgotICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oXCJNZXRob2QgY2FsbCBub3QgZmluaXNoZWQhXCIpOyIKLSAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICA8PCAib3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRNZW1vcnlJbnB1dFRyYW5zcG9ydCBtZW1vcnlUcmFuc3BvcnQgPSBuZXcgIgotICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRNZW1vcnlJbnB1dFRyYW5zcG9ydChnZXRGcmFtZUJ1ZmZlcigpLmFycmF5KCkpOyIgPDwgZW5kbAotICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3QgPSAiCi0gICAgICAgICAgICAgICAgICAgICAgICJjbGllbnQuZ2V0UHJvdG9jb2xGYWN0b3J5KCkuZ2V0UHJvdG9jb2wobWVtb3J5VHJhbnNwb3J0KTsiIDw8IGVuZGw7Ci0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXyk7Ci0gICAgICBpZiAoIXJldF90eXBlLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAicmV0dXJuICI7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8ICIobmV3IENsaWVudChwcm90KSkucmVjdiIgKyBzZXAgKyBqYXZhbmFtZSArICIoKTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKLQotICAgIC8vIENsb3NlIGNsYXNzCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotCi0gIC8vIENsb3NlIEFzeW5jQ2xpZW50Ci0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICAvLyBFeHRlbmRzIHN0dWZmCi0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgPT0gTlVMTCkgewotICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gIm9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlUHJvY2Vzc29yPEk+IjsKLSAgfSBlbHNlIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX3Byb2Nlc3NvciA9IGV4dGVuZHMgKyAiLlByb2Nlc3NvcjxJPiI7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgc3RhdGljIGNsYXNzIFByb2Nlc3NvcjxJIGV4dGVuZHMgSWZhY2U+IGV4dGVuZHMgIgotICAgICAgICAgICAgICAgICAgICAgPDwgZXh0ZW5kc19wcm9jZXNzb3IgPDwgIiBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRQcm9jZXNzb3IgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pCi0gICAgICA8PCAicHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFByb2Nlc3Nvci5jbGFzcy5nZXROYW1lKCkpOyIKLSAgICAgIDw8IGVuZGw7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgUHJvY2Vzc29yKEkgaWZhY2UpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBzdXBlcihpZmFjZSwgZ2V0UHJvY2Vzc01hcChuZXcgSGFzaE1hcDxTdHJpbmcsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5Qcm9jZXNzRnVuY3Rpb248SSwgPyBleHRlbmRzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5UQmFzZT4+KCkpKTsiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJvdGVjdGVkIFByb2Nlc3NvcihJIGlmYWNlLCBNYXA8U3RyaW5nLCAgIgotICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LlByb2Nlc3NGdW5jdGlvbjxJLCA/IGV4dGVuZHMgIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlPj4gIgotICAgICAgICAgICAgICAgICAgICAgICAgInByb2Nlc3NNYXApIHsiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBzdXBlcihpZmFjZSwgZ2V0UHJvY2Vzc01hcChwcm9jZXNzTWFwKSk7IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByaXZhdGUgc3RhdGljIDxJIGV4dGVuZHMgSWZhY2U+IE1hcDxTdHJpbmcsICAiCi0gICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQuUHJvY2Vzc0Z1bmN0aW9uPEksID8gZXh0ZW5kcyAgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2U+PiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiZ2V0UHJvY2Vzc01hcChNYXA8U3RyaW5nLCAgb3JnLmFwYWNoZS50aHJpZnQuUHJvY2Vzc0Z1bmN0aW9uPEksID8gZXh0ZW5kcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlPj4gcHJvY2Vzc01hcCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm9jZXNzTWFwLnB1dChcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiwgbmV3ICIKLSAgICAgICAgICAgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoKSk7IiA8PCBlbmRsOwotICB9Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIHByb2Nlc3NNYXA7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2FzeW5jX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gIC8vIEV4dGVuZHMgc3R1ZmYKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfcHJvY2Vzc29yID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSA9PSBOVUxMKSB7Ci0gICAgZXh0ZW5kc19wcm9jZXNzb3IgPSAib3JnLmFwYWNoZS50aHJpZnQuVEJhc2VBc3luY1Byb2Nlc3NvcjxJPiI7Ci0gIH0gZWxzZSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgZXh0ZW5kc19wcm9jZXNzb3IgPSBleHRlbmRzICsgIi5Bc3luY1Byb2Nlc3NvcjxJPiI7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgc3RhdGljIGNsYXNzIEFzeW5jUHJvY2Vzc29yPEkgZXh0ZW5kcyBBc3luY0lmYWNlPiBleHRlbmRzICIKLSAgICAgICAgICAgICAgICAgICAgIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8ICIgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gIgotICAgICAgICAgICAgICAgICAgICAgICAgIkxvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEFzeW5jUHJvY2Vzc29yLmNsYXNzLmdldE5hbWUoKSk7IiA8PCBlbmRsOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIEFzeW5jUHJvY2Vzc29yKEkgaWZhY2UpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBzdXBlcihpZmFjZSwgZ2V0UHJvY2Vzc01hcChuZXcgSGFzaE1hcDxTdHJpbmcsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5Bc3luY1Byb2Nlc3NGdW5jdGlvbjxJLCA/IGV4dGVuZHMgIgotICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlLCA/Pj4oKSkpOyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm90ZWN0ZWQgQXN5bmNQcm9jZXNzb3IoSSBpZmFjZSwgTWFwPFN0cmluZywgICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5Bc3luY1Byb2Nlc3NGdW5jdGlvbjxJLCA/IGV4dGVuZHMgICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5UQmFzZSwgPz4+IHByb2Nlc3NNYXApIHsiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBzdXBlcihpZmFjZSwgZ2V0UHJvY2Vzc01hcChwcm9jZXNzTWFwKSk7IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByaXZhdGUgc3RhdGljIDxJIGV4dGVuZHMgQXN5bmNJZmFjZT4gTWFwPFN0cmluZywgICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5Bc3luY1Byb2Nlc3NGdW5jdGlvbjxJLCA/IGV4dGVuZHMgICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5UQmFzZSw/Pj4gZ2V0UHJvY2Vzc01hcChNYXA8U3RyaW5nLCAgIgotICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LkFzeW5jUHJvY2Vzc0Z1bmN0aW9uPEksID8gZXh0ZW5kcyAgIgotICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlLCA/Pj4gcHJvY2Vzc01hcCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm9jZXNzTWFwLnB1dChcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiwgbmV3ICIKLSAgICAgICAgICAgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoKSk7IiA8PCBlbmRsOwotICB9Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIHByb2Nlc3NNYXA7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9wcm9jZXNzX2FzeW5jX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOwotICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOwotICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7Ci0gIH0KLQotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOwotICB9Ci0KLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCAmcmVzdWx0LCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2FzeW5jX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICBzdHJpbmcgYXJnc25hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiOwotCi0gIHN0cmluZyByZXN1bHRuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOwotICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIHJlc3VsdG5hbWUgPSAib3JnLmFwYWNoZS50aHJpZnQuVEJhc2UiOwotICB9Ci0KLSAgc3RyaW5nIHJlc3VsdHR5cGUgPSB0eXBlX25hbWUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCB0cnVlKTsKLQotICAodm9pZCl0c2VydmljZTsKLSAgLy8gT3BlbiBjbGFzcwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBzdGF0aWMgY2xhc3MgIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgIDw8ICI8SSBleHRlbmRzIEFzeW5jSWZhY2U+IGV4dGVuZHMgb3JnLmFwYWNoZS50aHJpZnQuQXN5bmNQcm9jZXNzRnVuY3Rpb248SSwgIgotICAgICAgICAgICAgICAgICAgICAgPDwgYXJnc25hbWUgPDwgIiwgIiA8PCByZXN1bHR0eXBlIDw8ICI+IHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoKSB7IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgc3VwZXIoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIpOyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCBhcmdzbmFtZSA8PCAiIGdldEVtcHR5QXJnc0luc3RhbmNlKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHJldHVybiBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBBc3luY01ldGhvZENhbGxiYWNrPCIgPDwgcmVzdWx0dHlwZQotICAgICAgICAgICAgICAgICAgICAgPDwgIj4gZ2V0UmVzdWx0SGFuZGxlcihmaW5hbCBBc3luY0ZyYW1lQnVmZmVyIGZiLCBmaW5hbCBpbnQgc2VxaWQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LkFzeW5jUHJvY2Vzc0Z1bmN0aW9uIGZjYWxsID0gdGhpczsiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIG5ldyBBc3luY01ldGhvZENhbGxiYWNrPCIgPDwgcmVzdWx0dHlwZSA8PCAiPigpIHsgIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgdm9pZCBvbkNvbXBsZXRlKCIgPDwgcmVzdWx0dHlwZSA8PCAiIG8pIHsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCByZXN1bHRuYW1lIDw8ICIgcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotCi0gICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXN1bHQuc3VjY2VzcyA9IG87IiA8PCBlbmRsOwotICAgICAgLy8gU2V0IGlzc2V0IG9uIHN1Y2Nlc3MgZmllbGQKLSAgICAgIGlmICghdHlwZV9jYW5fYmVfbnVsbCh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpKSB7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmVzdWx0LnNldCIgPDwgZ2V0X2NhcF9uYW1lKCJzdWNjZXNzIikgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKHRydWUpOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRyeSB7IiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKQotICAgICAgICA8PCAiICBmY2FsbC5zZW5kUmVzcG9uc2UoZmIscmVzdWx0LCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWVzc2FnZVR5cGUuUkVQTFksc2VxaWQpOyIKLSAgICAgICAgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgcmV0dXJuOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7IiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBMT0dHRVIuZXJyb3IoXCJFeGNlcHRpb24gd3JpdGluZyB0byBpbnRlcm5hbCBmcmFtZSBidWZmZXJcIiwgZSk7IgotICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImZiLmNsb3NlKCk7IiA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyB2b2lkIG9uRXJyb3IoRXhjZXB0aW9uIGUpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiYnl0ZSBtc2dUeXBlID0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1lc3NhZ2VUeXBlLlJFUExZOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlIG1zZzsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8IHJlc3VsdG5hbWUgPDwgIiByZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0KLSAgICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICAgIGlmICh4X2l0ZXIgIT0geGNlcHRpb25zLmJlZ2luKCkpCi0gICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJlbHNlICI7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKGUgaW5zdGFuY2VvZiAiIDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAoIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSA8PCAiKSBlOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuc2V0IiA8PCBnZXRfY2FwX25hbWUoKCp4X2l0ZXIpLT5nZXRfbmFtZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpIDw8ICIodHJ1ZSk7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgaW5kZW50KCkgPDwgIm1zZyA9IHJlc3VsdDsiIDw8IGVuZGw7Ci0KLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgZWxzZSAiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAibXNnVHlwZSA9IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlVHlwZS5FWENFUFRJT047IiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAibXNnID0gKG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlKW5ldyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24ob3JnLmFwYWNoZS50aHJpZnQuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uLklOVEVSTkFMX0VSUk9SLCBlLmdldE1lc3NhZ2UoKSk7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOwotCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ0cnkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgZmNhbGwuc2VuZFJlc3BvbnNlKGZiLG1zZyxtc2dUeXBlLHNlcWlkKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHJldHVybjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIExPR0dFUi5lcnJvcihcIkV4Y2VwdGlvbiB3cml0aW5nIHRvIGludGVybmFsIGZyYW1lIGJ1ZmZlclwiLCBleCk7IgotICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImZiLmNsb3NlKCk7IiA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9OyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm90ZWN0ZWQgYm9vbGVhbiBpc09uZXdheSgpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICByZXR1cm4gIiA8PCAoKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpID8gInRydWUiIDogImZhbHNlIikgPDwgIjsiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIHZvaWQgc3RhcnQoSSBpZmFjZSwgIiA8PCBhcmdzbmFtZQotICAgICAgICAgICAgICAgICAgICAgPDwgIiBhcmdzLCBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5Bc3luY01ldGhvZENhbGxiYWNrPCIgPDwgcmVzdWx0dHlwZQotICAgICAgICAgICAgICAgICAgICAgPDwgIj4gcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24geyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKLSAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotCi0gIGZfc2VydmljZV8gPDwgImlmYWNlLiIgPDwgZ2V0X3JwY19tZXRob2RfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpIDw8ICIoIjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICIsICI7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gIH0KLSAgaWYgKCFmaXJzdCkKLSAgICBmX3NlcnZpY2VfIDw8ICIsIjsKLSAgZl9zZXJ2aWNlXyA8PCAicmVzdWx0SGFuZGxlciI7Ci0gIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSI7Ci0KLSAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIC8vIENsb3NlIGNsYXNzCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBwcm9jZXNzIGZ1bmN0aW9uIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgYSBkaXNwYXRjaGVyIGZvcgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIHN0cmluZyBhcmdzbmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyI7Ci0gIHN0cmluZyByZXN1bHRuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOwotICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIHJlc3VsdG5hbWUgPSAib3JnLmFwYWNoZS50aHJpZnQuVEJhc2UiOwotICB9Ci0KLSAgKHZvaWQpdHNlcnZpY2U7Ci0gIC8vIE9wZW4gY2xhc3MKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgc3RhdGljIGNsYXNzICIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICA8PCAiPEkgZXh0ZW5kcyBJZmFjZT4gZXh0ZW5kcyBvcmcuYXBhY2hlLnRocmlmdC5Qcm9jZXNzRnVuY3Rpb248SSwgIgotICAgICAgICAgICAgICAgICAgICAgPDwgYXJnc25hbWUgPDwgIj4geyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBzdXBlcihcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIik7IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGFyZ3NuYW1lIDw8ICIgZ2V0RW1wdHlBcmdzSW5zdGFuY2UoKSB7IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgcmV0dXJuIG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJvdGVjdGVkIGJvb2xlYW4gaXNPbmV3YXkoKSB7IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgcmV0dXJuICIgPDwgKCh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSA/ICJ0cnVlIiA6ICJmYWxzZSIpIDw8ICI7IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IHJlc3VsdG5hbWUgPDwgIiBnZXRSZXN1bHQoSSBpZmFjZSwgIiA8PCBhcmdzbmFtZQotICAgICAgICAgICAgICAgICAgICAgPDwgIiBhcmdzKSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8IHJlc3VsdG5hbWUgPDwgIiByZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotCi0gIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKLSAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJ5IHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAotICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgIGZfc2VydmljZV8gPDwgInJlc3VsdC5zdWNjZXNzID0gIjsKLSAgfQotICBmX3NlcnZpY2VfIDw8ICJpZmFjZS4iIDw8IGdldF9ycGNfbWV0aG9kX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSA8PCAiKCI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICJhcmdzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICB9Ci0gIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOwotCi0gIC8vIFNldCBpc3NldCBvbiBzdWNjZXNzIGZpZWxkCi0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkKLSAgICAgICYmICF0eXBlX2Nhbl9iZV9udWxsKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkpIHsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJlc3VsdC5zZXQiIDw8IGdldF9jYXBfbmFtZSgic3VjY2VzcyIpIDw8IGdldF9jYXBfbmFtZSgiaXNTZXQiKQotICAgICAgICAgICAgICAgICAgICAgICA8PCAiKHRydWUpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiB4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSI7Ci0gICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgIiBjYXRjaCAoIiA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpIDw8ICIgIgotICAgICAgICAgICAgICAgICA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiCi0gICAgICAgICAgICAgICAgICAgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgIn0iOwotICAgICAgfQotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIG51bGw7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIHJlc3VsdDsiIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IjsKLQotICAvLyBDbG9zZSBmdW5jdGlvbgotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgLy8gQ2xvc2UgY2xhc3MKLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkCi0gKiBAcGFyYW0gcHJlZml4IFRoZSB2YXJpYWJsZSBuYW1lIG9yIGNvbnRhaW5lciBmb3IgdGhpcyBmaWVsZAotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEpIHsKLSAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUsIGhhc19tZXRhZGF0YSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIgPSBpcHJvdC4iOwotCi0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgb3V0IDw8ICJyZWFkQmluYXJ5KCk7IjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCAicmVhZFN0cmluZygpOyI7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICBvdXQgPDwgInJlYWRCb29sKCk7IjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIG91dCA8PCAicmVhZEJ5dGUoKTsiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICBvdXQgPDwgInJlYWRJMTYoKTsiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICBvdXQgPDwgInJlYWRJMzIoKTsiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICBvdXQgPDwgInJlYWRJNjQoKTsiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBvdXQgPDwgInJlYWREb3VibGUoKTsiOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gSmF2YSBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIiA9ICIKLSAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSwgZmFsc2UsIHRydWUpCi0gICAgICAgICAgICAgICAgICAgKyAiLmZpbmRCeVZhbHVlKGlwcm90LnJlYWRJMzIoKSk7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAotICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKLSAgICAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGFuIHVuc2VyaWFsaXplciBmb3IgYSBzdHJ1Y3QsIGludm9rZXMgcmVhZCgpCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLQotICBpZiAocmV1c2Vfb2JqZWN0c18pIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgcHJlZml4IDw8ICIgPT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgfQotICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKCk7IiA8PCBlbmRsOwotICBpZiAocmV1c2Vfb2JqZWN0c18pIHsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICB9Ci0gIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLnJlYWQoaXByb3QpOyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBjb250YWluZXIgYnkgcmVhZGluZyBpdHMgc2l6ZSBhbmQgdGhlbiBpdGVyYXRpbmcKLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEpIHsKLQotICBzY29wZV91cChvdXQpOwotCi0gIHN0cmluZyBvYmo7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIG9iaiA9IHRtcCgiX21hcCIpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIG9iaiA9IHRtcCgiX3NldCIpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBvYmogPSB0bXAoIl9saXN0Iik7Ci0gIH0KLQotICBpZiAoaGFzX21ldGFkYXRhKSB7Ci0gICAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCi0gICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgIiA8PCBvYmogPDwgIiA9IGlwcm90LnJlYWRNYXBCZWdpbigpOyIKLSAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU2V0ICIgPDwgb2JqIDw8ICIgPSBpcHJvdC5yZWFkU2V0QmVnaW4oKTsiCi0gICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRMaXN0ICIgPDwgb2JqIDw8ICIgPSBpcHJvdC5yZWFkTGlzdEJlZ2luKCk7IgotICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCi0gICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgIiA8PCBvYmoKLSAgICAgICAgICAgICAgICAgIDw8ICIgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCgiCi0gICAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiwgIgotICAgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIKLSAgICAgICAgICAgICAgICAgIDw8ICJpcHJvdC5yZWFkSTMyKCkpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTZXQgIiA8PCBvYmoKLSAgICAgICAgICAgICAgICAgIDw8ICIgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFNldCgiCi0gICAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsIGlwcm90LnJlYWRJMzIoKSk7IgotICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdCAiIDw8IG9iagotICAgICAgICAgICAgICAgICAgPDwgIiA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdCgiCi0gICAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsIGlwcm90LnJlYWRJMzIoKSk7IgotICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBpZiAocmV1c2Vfb2JqZWN0c18pIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgcHJlZml4IDw8ICIgPT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgfQotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpOwotCi0gIC8vIHNpemUgdGhlIGNvbGxlY3Rpb24gY29ycmVjdGx5Ci0gIGlmIChzb3J0ZWRfY29udGFpbmVyc18gJiYgKHR0eXBlLT5pc19tYXAoKSB8fCB0dHlwZS0+aXNfc2V0KCkpKSB7Ci0gICAgLy8gVHJlZVNldCBhbmQgVHJlZU1hcCBkb24ndCBoYXZlIGFueSBjb25zdHJ1Y3RvciB3aGljaCB0YWtlcyBhIGNhcGFjdGl0eSBhcyBhbiBhcmd1bWVudAotICAgIG91dCA8PCAiKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIG91dCA8PCAiKCIgPDwgKHR0eXBlLT5pc19saXN0KCkgPyAiIiA6ICIyKiIpIDw8IG9iaiA8PCAiLnNpemUiCi0gICAgICAgIDw8ICIpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGlmIChyZXVzZV9vYmplY3RzXykgewotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBwcmVmaXgsIG9iaiwgaGFzX21ldGFkYXRhKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCwgb2JqLCBoYXNfbWV0YWRhdGEpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4LCBvYmosIGhhc19tZXRhZGF0YSk7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgaWYgKGhhc19tZXRhZGF0YSkgewotICAgIC8vIFJlYWQgY29udGFpbmVyIGVuZAotICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTWFwRW5kKCk7IiA8PCBlbmRsOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZFNldEVuZCgpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTGlzdEVuZCgpOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLSAgc2NvcGVfZG93bihvdXQpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIHRvIGRlc2VyaWFsaXplIGEgbWFwCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBvYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhKSB7Ci0gIHN0cmluZyBrZXkgPSB0bXAoIl9rZXkiKTsKLSAgc3RyaW5nIHZhbCA9IHRtcCgiX3ZhbCIpOwotICB0X2ZpZWxkIGZrZXkodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7Ci0gIHRfZmllbGQgZnZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKLQotICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZma2V5LCByZXVzZV9vYmplY3RzXywgZmFsc2UpIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZ2YWwsIHJldXNlX29iamVjdHNfLCBmYWxzZSkgPDwgZW5kbDsKLQotICAvLyBGb3IgbG9vcCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCi0gIHN0cmluZyBpID0gdG1wKCJfaSIpOwotICBpbmRlbnQob3V0KSA8PCAiZm9yIChpbnQgIiA8PCBpIDw8ICIgPSAwOyAiIDw8IGkgPDwgIiA8ICIgPDwgb2JqIDw8ICIuc2l6ZSIKLSAgICAgICAgICAgICAgPDwgIjsgIgotICAgICAgICAgICAgICA8PCAiKysiIDw8IGkgPDwgIikiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfdXAob3V0KTsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5LCAiIiwgaGFzX21ldGFkYXRhKTsKLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCwgIiIsIGhhc19tZXRhZGF0YSk7Ci0KLSAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIucHV0KCIgPDwga2V5IDw8ICIsICIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKLQotICBpZiAocmV1c2Vfb2JqZWN0c18gJiYgIWdldF90cnVlX3R5cGUoZmtleS5nZXRfdHlwZSgpKS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCBrZXkgPDwgIiA9IG51bGw7IiA8PCBlbmRsOwotICB9Ci0KLSAgaWYgKHJldXNlX29iamVjdHNfICYmICFnZXRfdHJ1ZV90eXBlKGZ2YWwuZ2V0X3R5cGUoKSktPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgdmFsIDw8ICIgPSBudWxsOyIgPDwgZW5kbDsKLSAgfQotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIHNldCBlbGVtZW50Ci0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBvYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhKSB7Ci0gIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOwotICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmVsZW0sIHJldXNlX29iamVjdHNfLCBmYWxzZSkgPDwgZW5kbDsKLQotICAvLyBGb3IgbG9vcCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCi0gIHN0cmluZyBpID0gdG1wKCJfaSIpOwotICBpbmRlbnQob3V0KSA8PCAiZm9yIChpbnQgIiA8PCBpIDw8ICIgPSAwOyAiIDw8IGkgPDwgIiA8ICIgPDwgb2JqIDw8ICIuc2l6ZSIKLSAgICAgICAgICAgICAgPDwgIjsgIgotICAgICAgICAgICAgICA8PCAiKysiIDw8IGkgPDwgIikiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0sICIiLCBoYXNfbWV0YWRhdGEpOwotCi0gIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLmFkZCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOwotCi0gIGlmIChyZXVzZV9vYmplY3RzXyAmJiAhZ2V0X3RydWVfdHlwZShmZWxlbS5nZXRfdHlwZSgpKS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCBlbGVtIDw8ICIgPSBudWxsOyIgPDwgZW5kbDsKLSAgfQotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIGxpc3QgZWxlbWVudAotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgb2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7Ci0gIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmVsZW0sIHJldXNlX29iamVjdHNfLCBmYWxzZSkgPDwgZW5kbDsKLQotICAvLyBGb3IgbG9vcCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCi0gIHN0cmluZyBpID0gdG1wKCJfaSIpOwotICBpbmRlbnQob3V0KSA8PCAiZm9yIChpbnQgIiA8PCBpIDw8ICIgPSAwOyAiIDw8IGkgPDwgIiA8ICIgPDwgb2JqIDw8ICIuc2l6ZSIKLSAgICAgICAgICAgICAgPDwgIjsgIgotICAgICAgICAgICAgICA8PCAiKysiIDw8IGkgPDwgIikiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0sICIiLCBoYXNfbWV0YWRhdGEpOwotCi0gIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLmFkZCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOwotCi0gIGlmIChyZXVzZV9vYmplY3RzXyAmJiAhZ2V0X3RydWVfdHlwZShmZWxlbS5nZXRfdHlwZSgpKS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCBlbGVtIDw8ICIgPSBudWxsOyIgPDwgZW5kbDsKLSAgfQotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSkgewotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcwotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSwgaGFzX21ldGFkYXRhKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVJMzIoIiA8PCBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIi5nZXRWYWx1ZSgpKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3QuIjsKLQotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgICBvdXQgPDwgIndyaXRlQmluYXJ5KCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIG91dCA8PCAid3JpdGVCb29sKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUJ5dGUoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJMTYoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJNjQoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIG91dCA8PCAid3JpdGVEb3VibGUoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBKYXZhIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgb3V0IDw8ICJ3cml0ZUkzMihzdHJ1Y3QuIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSBGSUVMRCAnJXMlcycgVFlQRSAnJXMnXG4iLAotICAgICAgICAgICBwcmVmaXguY19zdHIoKSwKLSAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCi0gICAgICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKLSAgfQotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgewotICAodm9pZCl0c3RydWN0OwotICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIud3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHdyaXRpbmcgaXRzIHNpemUgdGhlbiB0aGUgZWxlbWVudHMuCi0gKgotICogQHBhcmFtIHR0eXBlICBUaGUgdHlwZSBvZiBjb250YWluZXIKLSAqIEBwYXJhbSBwcmVmaXggU3RyaW5nIHByZWZpeCBmb3IgZmllbGRzCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSkgewotICBzY29wZV91cChvdXQpOwotCi0gIGlmIChoYXNfbWV0YWRhdGEpIHsKLSAgICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVNYXBCZWdpbihuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCgiCi0gICAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiwgIgotICAgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIgPDwgcHJlZml4IDw8ICIuc2l6ZSgpKSk7IgotICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlU2V0QmVnaW4obmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTZXQoIgotICAgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8IHByZWZpeAotICAgICAgICAgICAgICAgICAgPDwgIi5zaXplKCkpKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVMaXN0QmVnaW4obmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRMaXN0KCIKLSAgICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwgcHJlZml4Ci0gICAgICAgICAgICAgICAgICA8PCAiLnNpemUoKSkpOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlSTMyKCIgPDwgcHJlZml4IDw8ICIuc2l6ZSgpKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzdHJpbmcgaXRlciA9IHRtcCgiX2l0ZXIiKTsKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJmb3IgKE1hcC5FbnRyeTwiIDw8IHR5cGVfbmFtZSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpLCB0cnVlLCBmYWxzZSkKLSAgICAgICAgICAgICAgICA8PCAiLCAiIDw8IHR5cGVfbmFtZSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpLCB0cnVlLCBmYWxzZSkgPDwgIj4gIiA8PCBpdGVyCi0gICAgICAgICAgICAgICAgPDwgIiA6ICIgPDwgcHJlZml4IDw8ICIuZW50cnlTZXQoKSkiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJmb3IgKCIgPDwgdHlwZV9uYW1lKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiICIgPDwgaXRlciA8PCAiIDogIgotICAgICAgICAgICAgICAgIDw8IHByZWZpeCA8PCAiKSI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJmb3IgKCIgPDwgdHlwZV9uYW1lKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiAiIDw8IGl0ZXIgPDwgIiA6ICIKLSAgICAgICAgICAgICAgICA8PCBwcmVmaXggPDwgIikiOwotICB9Ci0KLSAgb3V0IDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBpdGVyLCBwcmVmaXgsIGhhc19tZXRhZGF0YSk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgaXRlciwgaGFzX21ldGFkYXRhKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyLCBoYXNfbWV0YWRhdGEpOwotICB9Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICBpZiAoaGFzX21ldGFkYXRhKSB7Ci0gICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlTWFwRW5kKCk7IiA8PCBlbmRsOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTZXRFbmQoKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVMaXN0RW5kKCk7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSkgewotICAodm9pZCltYXA7Ci0gIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBpdGVyICsgIi5nZXRLZXkoKSIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCAiIiwgaGFzX21ldGFkYXRhKTsKLSAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIGl0ZXIgKyAiLmdldFZhbHVlKCkiKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCwgIiIsIGhhc19tZXRhZGF0YSk7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSkgewotICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIiwgaGFzX21ldGFkYXRhKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbGlzdC4KLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSkgewotICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIsIGhhc19tZXRhZGF0YSk7Ci19Ci0KLS8qKgotICogUmV0dXJucyBhIEphdmEgdHlwZSBuYW1lCi0gKgotICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCi0gKiBAcGFyYW0gY29udGFpbmVyIElzIHRoZSB0eXBlIGdvaW5nIGluc2lkZSBhIGNvbnRhaW5lcj8KLSAqIEByZXR1cm4gSmF2YSB0eXBlIG5hbWUsIGkuZS4gSGFzaE1hcDxLZXksVmFsdWU+Ci0gKi8KLXN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jb250YWluZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5faW5pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBza2lwX2dlbmVyaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2VfbmFtZXNwYWNlKSB7Ci0gIC8vIEluIEphdmEgdHlwZWRlZnMgYXJlIGp1c3QgcmVzb2x2ZWQgdG8gdGhlaXIgcmVhbCB0eXBlCi0gIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7Ci0gIHN0cmluZyBwcmVmaXg7Ci0KLSAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHJldHVybiBiYXNlX3R5cGVfbmFtZSgodF9iYXNlX3R5cGUqKXR0eXBlLCBpbl9jb250YWluZXIpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIHRfbWFwKiB0bWFwID0gKHRfbWFwKil0dHlwZTsKLSAgICBpZiAoaW5faW5pdCkgewotICAgICAgaWYgKHNvcnRlZF9jb250YWluZXJzXykgewotICAgICAgICBwcmVmaXggPSAiVHJlZU1hcCI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBwcmVmaXggPSAiSGFzaE1hcCI7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIHByZWZpeCA9ICJNYXAiOwotICAgIH0KLSAgICByZXR1cm4gcHJlZml4ICsgKHNraXBfZ2VuZXJpYyA/ICIiIDogIjwiICsgdHlwZV9uYW1lKHRtYXAtPmdldF9rZXlfdHlwZSgpLCB0cnVlKSArICIsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHR5cGVfbmFtZSh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdHJ1ZSkgKyAiPiIpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIHRfc2V0KiB0c2V0ID0gKHRfc2V0Kil0dHlwZTsKLSAgICBpZiAoaW5faW5pdCkgewotICAgICAgaWYgKHNvcnRlZF9jb250YWluZXJzXykgewotICAgICAgICBwcmVmaXggPSAiVHJlZVNldCI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBwcmVmaXggPSAiSGFzaFNldCI7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIHByZWZpeCA9ICJTZXQiOwotICAgIH0KLSAgICByZXR1cm4gcHJlZml4ICsgKHNraXBfZ2VuZXJpYyA/ICIiIDogIjwiICsgdHlwZV9uYW1lKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgdHJ1ZSkgKyAiPiIpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICB0X2xpc3QqIHRsaXN0ID0gKHRfbGlzdCopdHR5cGU7Ci0gICAgaWYgKGluX2luaXQpIHsKLSAgICAgIHByZWZpeCA9ICJBcnJheUxpc3QiOwotICAgIH0gZWxzZSB7Ci0gICAgICBwcmVmaXggPSAiTGlzdCI7Ci0gICAgfQotICAgIHJldHVybiBwcmVmaXggKyAoc2tpcF9nZW5lcmljID8gIiIgOiAiPCIgKyB0eXBlX25hbWUodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgdHJ1ZSkgKyAiPiIpOwotICB9Ci0KLSAgLy8gQ2hlY2sgZm9yIG5hbWVzcGFjaW5nCi0gIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOwotICBpZiAoKHByb2dyYW0gIT0gTlVMTCkgJiYgKChwcm9ncmFtICE9IHByb2dyYW1fKSB8fCBmb3JjZV9uYW1lc3BhY2UpKSB7Ci0gICAgc3RyaW5nIHBhY2thZ2UgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJqYXZhIik7Ci0gICAgaWYgKCFwYWNrYWdlLmVtcHR5KCkpIHsKLSAgICAgIHJldHVybiBwYWNrYWdlICsgIi4iICsgdHR5cGUtPmdldF9uYW1lKCk7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHR0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIEphdmEgdHlwZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSB0aHJpZnQgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGJhc2UgVGhlIGJhc2UgdHlwZQotICogQHBhcmFtIGNvbnRhaW5lciBJcyBpdCBnb2luZyBpbiBhIEphdmEgY29udGFpbmVyPwotICovCi1zdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6YmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHR5cGUsIGJvb2wgaW5fY29udGFpbmVyKSB7Ci0gIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSB0eXBlLT5nZXRfYmFzZSgpOwotCi0gIHN3aXRjaCAodGJhc2UpIHsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgIHJldHVybiAoaW5fY29udGFpbmVyID8gIlZvaWQiIDogInZvaWQiKTsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7Ci0gICAgICByZXR1cm4gIkJ5dGVCdWZmZXIiOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gIlN0cmluZyI7Ci0gICAgfQotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiQm9vbGVhbiIgOiAiYm9vbGVhbiIpOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiQnl0ZSIgOiAiYnl0ZSIpOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICByZXR1cm4gKGluX2NvbnRhaW5lciA/ICJTaG9ydCIgOiAic2hvcnQiKTsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiSW50ZWdlciIgOiAiaW50Iik7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgIHJldHVybiAoaW5fY29udGFpbmVyID8gIkxvbmciIDogImxvbmciKTsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiRG91YmxlIiA6ICJkb3VibGUiKTsKLSAgZGVmYXVsdDoKLSAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEphdmEgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICB9Ci19Ci0KLS8qKgotICogRGVjbGFyZXMgYSBmaWVsZCwgd2hpY2ggbWF5IGluY2x1ZGUgaW5pdGlhbGl6YXRpb24gYXMgbmVjZXNzYXJ5LgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkCi0gKiBAcGFyYW0gaW5pdCBXaGV0aGVyIHRvIGluaXRpYWxpemUgdGhlIGZpZWxkCi0gKi8KLXN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjpkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0LCBib29sIGNvbW1lbnQpIHsKLSAgLy8gVE9ETyhtY3NsZWUpOiBkbyB3ZSBldmVyIG5lZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGQ/Ci0gIHN0cmluZyByZXN1bHQgPSB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpKSArICIgIiArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgaWYgKGluaXQpIHsKLSAgICB0X3R5cGUqIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotICAgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgdGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7Ci0gICAgICBvZnN0cmVhbSBkdW1teTsKLSAgICAgIHJlc3VsdCArPSAiID0gIiArIHJlbmRlcl9jb25zdF92YWx1ZShkdW1teSwgdHR5cGUsIHRmaWVsZC0+Z2V0X3ZhbHVlKCkpOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIHJlc3VsdCArPSAiID0gZmFsc2UiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgcmVzdWx0ICs9ICIgPSAoZG91YmxlKTAiOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIHJlc3VsdCArPSAiID0gbnVsbCI7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKSArICIoKSI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKSArICIoKSI7Ci0gICAgICA7Ci0gICAgfQotICB9Ci0gIHJlc3VsdCArPSAiOyI7Ci0gIGlmIChjb21tZW50KSB7Ci0gICAgcmVzdWx0ICs9ICIgLy8gIjsKLSAgICBpZiAodGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCkgewotICAgICAgcmVzdWx0ICs9ICJvcHRpb25hbCI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAicmVxdWlyZWQiOwotICAgIH0KLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KLSAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KLSAqLwotc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpIHsKLSAgdF90eXBlKiB0dHlwZSA9IHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKLSAgc3RkOjpzdHJpbmcgZm5fbmFtZSA9IGdldF9ycGNfbWV0aG9kX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKTsKLSAgc3RkOjpzdHJpbmcgcmVzdWx0ID0gdHlwZV9uYW1lKHR0eXBlKSArICIgIiArIHByZWZpeCArIGZuX25hbWUgKyAiKCIKLSAgICAgICAgICAgICAgICAgICAgICAgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkgKyAiKSB0aHJvd3MgIjsKLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICByZXN1bHQgKz0gdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSArICIsICI7Ci0gIH0KLSAgcmVzdWx0ICs9ICJvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIjsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd2b2lkIG5hbWUoYXJncywgcmVzdWx0SGFuZGxlciknCi0gKgotICogQHBhcmFtcyB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgotICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgotICovCi1zdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VfYmFzZV9tZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RkOjpzdHJpbmcgYXJnbGlzdCA9IGFzeW5jX2Z1bmN0aW9uX2NhbGxfYXJnbGlzdCh0ZnVuY3Rpb24sIHVzZV9iYXNlX21ldGhvZCwgdHJ1ZSk7Ci0KLSAgc3RkOjpzdHJpbmcgcmV0X3R5cGUgPSAiIjsKLSAgaWYgKHVzZV9iYXNlX21ldGhvZCkgewotICAgIHJldF90eXBlICs9ICJBc3luY0NsaWVudC4iOwotICB9Ci0gIHJldF90eXBlICs9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfY2FsbCI7Ci0KLSAgc3RkOjpzdHJpbmcgZm5fbmFtZSA9IGdldF9ycGNfbWV0aG9kX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKTsKLQotICBzdGQ6OnN0cmluZyByZXN1bHQgPSBwcmVmaXggKyAidm9pZCAiICsgZm5fbmFtZSArICIoIiArIGFyZ2xpc3QgKyAiKSI7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjphc3luY19mdW5jdGlvbl9jYWxsX2FyZ2xpc3QodF9mdW5jdGlvbiogdGZ1bmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlX2Jhc2VfbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2x1ZGVfdHlwZXMpIHsKLSAgKHZvaWQpdXNlX2Jhc2VfbWV0aG9kOwotICBzdGQ6OnN0cmluZyBhcmdsaXN0ID0gIiI7Ci0gIGlmICh0ZnVuYy0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPiAwKSB7Ci0gICAgYXJnbGlzdCA9IGFyZ3VtZW50X2xpc3QodGZ1bmMtPmdldF9hcmdsaXN0KCksIGluY2x1ZGVfdHlwZXMpICsgIiwgIjsKLSAgfQotCi0gIGlmIChpbmNsdWRlX3R5cGVzKSB7Ci0gICAgYXJnbGlzdCArPSAib3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuQXN5bmNNZXRob2RDYWxsYmFjayAiOwotICB9Ci0gIGFyZ2xpc3QgKz0gInJlc3VsdEhhbmRsZXIiOwotCi0gIHJldHVybiBhcmdsaXN0OwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBjb21tYSBzZXBhcmF0ZWQgZmllbGQgbGlzdCwgd2l0aCB0eXBlIG5hbWVzCi0gKi8KLXN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGluY2x1ZGVfdHlwZXMpIHsKLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgKz0gIiwgIjsKLSAgICB9Ci0gICAgaWYgKGluY2x1ZGVfdHlwZXMpIHsKLSAgICAgIHJlc3VsdCArPSB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSArICIgIjsKLSAgICB9Ci0gICAgcmVzdWx0ICs9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6YXN5bmNfYXJndW1lbnRfbGlzdCh0X2Z1bmN0aW9uKiB0ZnVuY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2x1ZGVfdHlwZXMpIHsKLSAgKHZvaWQpdGZ1bmN0OwotICAodm9pZCl0dHlwZTsKLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ICs9ICIsICI7Ci0gICAgfQotICAgIGlmIChpbmNsdWRlX3R5cGVzKSB7Ci0gICAgICByZXN1bHQgKz0gdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgKyAiICI7Ci0gICAgfQotICAgIHJlc3VsdCArPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gIH0KLSAgaWYgKCFmaXJzdCkgewotICAgIHJlc3VsdCArPSAiLCAiOwotICB9Ci0gIGlmIChpbmNsdWRlX3R5cGVzKSB7Ci0gICAgcmVzdWx0ICs9ICJvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5Bc3luY01ldGhvZENhbGxiYWNrICI7Ci0gIH0KLSAgcmVzdWx0ICs9ICJyZXN1bHRIYW5kbGVyIjsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIEphdmEgZW51bSBzdHJpbmcgZm9yIHRoZSBnaXZlbiB0eXBlLgotICovCi1zdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkJPT0wiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuQllURSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkkxNiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkkzMiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkk2NCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkRPVUJMRSI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTMyIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5NQVAiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TRVQiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTElTVCI7Ci0gIH0KLQotICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLS8qKgotICogVGFrZXMgYSBuYW1lIGFuZCBwcm9kdWVzIGEgdmFsaWQgSmF2YSBzb3VyY2UgZmlsZSBuYW1lIGZyb20gaXQKLSAqCi0gKiBAcGFyYW0gZnJvbU5hbWUgVGhlIG5hbWUgd2hpY2ggc2hhbGwgYmVjb21lIGEgdmFsaWQgSmF2YSBzb3VyY2UgZmlsZSBuYW1lCi0gKiBAcmV0dXJuIFRoZSBwcm9kdWNlZCBpZGVudGlmaWVyCi0gKi8KLXN0ZDo6c3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6Om1ha2VfdmFsaWRfamF2YV9maWxlbmFtZShzdGQ6OnN0cmluZyBjb25zdCYgZnJvbU5hbWUpIHsKLSAgLy8gaWYgYW55IGZ1cnRoZXIgcnVsZXMgYXBwbHkgdG8gc291cmNlIGZpbGUgbmFtZXMgaW4gSmF2YSwgbW9kaWZ5IGFzIG5lY2Vzc2FyeQotICByZXR1cm4gbWFrZV92YWxpZF9qYXZhX2lkZW50aWZpZXIoZnJvbU5hbWUpOwotfQotCi0vKioKLSAqIFRha2VzIGEgbmFtZSBhbmQgcHJvZHVlcyBhIHZhbGlkIEphdmEgaWRlbnRpZmllciBmcm9tIGl0Ci0gKgotICogQHBhcmFtIGZyb21OYW1lIFRoZSBuYW1lIHdoaWNoIHNoYWxsIGJlY29tZSBhIHZhbGlkIEphdmEgaWRlbnRpZmllcgotICogQHJldHVybiBUaGUgcHJvZHVjZWQgaWRlbnRpZmllcgotICovCi1zdGQ6OnN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjptYWtlX3ZhbGlkX2phdmFfaWRlbnRpZmllcihzdGQ6OnN0cmluZyBjb25zdCYgZnJvbU5hbWUpIHsKLSAgc3RkOjpzdHJpbmcgc3RyID0gZnJvbU5hbWU7Ci0gIGlmIChzdHIuZW1wdHkoKSkgewotICAgIHJldHVybiBzdHI7Ci0gIH0KLQotICAvLyB0ZXN0cyByZWx5IG9uIHRoaXMKLSAgYXNzZXJ0KCgnQScgPCAnWicpICYmICgnYScgPCAneicpICYmICgnMCcgPCAnOScpKTsKLQotICAvLyBpZiB0aGUgZmlyc3QgbGV0dGVyIGlzIGEgbnVtYmVyLCB3ZSBhZGQgYW4gYWRkaXRpb25hbCB1bmRlcnNjb3JlIGluIGZyb250IG9mIGl0Ci0gIGNoYXIgYyA9IHN0ci5hdCgwKTsKLSAgaWYgKCgnMCcgPD0gYykgJiYgKGMgPD0gJzknKSkgewotICAgIHN0ciA9ICJfIiArIHN0cjsKLSAgfQotCi0gIC8vIGZvbGxvd2luZyBjaGFyczogbGV0dGVyLCBudW1iZXIgb3IgdW5kZXJzY29yZQotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0ci5zaXplKCk7ICsraSkgewotICAgIGMgPSBzdHIuYXQoaSk7Ci0gICAgaWYgKCgoJ0EnID4gYykgfHwgKGMgPiAnWicpKSAmJiAoKCdhJyA+IGMpIHx8IChjID4gJ3onKSkgJiYgKCgnMCcgPiBjKSB8fCAoYyA+ICc5JykpCi0gICAgICAgICYmICgnXycgIT0gYykpIHsKLSAgICAgIHN0ci5yZXBsYWNlKGksIDEsICJfIik7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHN0cjsKLX0KLQotc3RkOjpzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6YXNfY2FtZWxfY2FzZShzdGQ6OnN0cmluZyBuYW1lLCBib29sIHVjZmlyc3QpIHsKLSAgc3RkOjpzdHJpbmcgbmV3X25hbWU7Ci0gIHNpemVfdCBpID0gMDsKLSAgZm9yIChpID0gMDsgaSA8IG5hbWUuc2l6ZSgpOyBpKyspIHsKLSAgICBpZiAobmFtZVtpXSAhPSAnXycpCi0gICAgICBicmVhazsKLSAgfQotICBpZiAodWNmaXJzdCkgewotICAgIG5ld19uYW1lICs9IHRvdXBwZXIobmFtZVtpKytdKTsKLSAgfSBlbHNlIHsKLSAgICBuZXdfbmFtZSArPSB0b2xvd2VyKG5hbWVbaSsrXSk7Ci0gIH0KLSAgZm9yICg7IGkgPCBuYW1lLnNpemUoKTsgaSsrKSB7Ci0gICAgaWYgKG5hbWVbaV0gPT0gJ18nKSB7Ci0gICAgICBpZiAoaSA8IG5hbWUuc2l6ZSgpIC0gMSkgewotICAgICAgICBpKys7Ci0gICAgICAgIG5ld19uYW1lICs9IHRvdXBwZXIobmFtZVtpXSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIG5ld19uYW1lICs9IG5hbWVbaV07Ci0gICAgfQotICB9Ci0gIHJldHVybiBuZXdfbmFtZTsKLX0KLQotc3RkOjpzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6Z2V0X3JwY19tZXRob2RfbmFtZShzdGQ6OnN0cmluZyBuYW1lKSB7Ci0gIGlmIChmdWxsY2FtZWxfc3R5bGVfKSB7Ci0gICAgcmV0dXJuIGFzX2NhbWVsX2Nhc2UobmFtZSwgZmFsc2UpOwotICB9IGVsc2UgewotICAgIHJldHVybiBuYW1lOwotICB9Ci19Ci0KLS8qKgotICogQXBwbGllcyB0aGUgY29ycmVjdCBzdHlsZSB0byBhIHN0cmluZyBiYXNlZCBvbiB0aGUgdmFsdWUgb2Ygbm9jYW1lbF9zdHlsZV8KLSAqIGFuZC9vciBmdWxsY2FtZWxfc3R5bGVfCi0gKi8KLXN0ZDo6c3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmdldF9jYXBfbmFtZShzdGQ6OnN0cmluZyBuYW1lKSB7Ci0gIGlmIChub2NhbWVsX3N0eWxlXykgewotICAgIHJldHVybiAiXyIgKyBuYW1lOwotICB9IGVsc2UgaWYgKGZ1bGxjYW1lbF9zdHlsZV8pIHsKLSAgICByZXR1cm4gYXNfY2FtZWxfY2FzZShuYW1lKTsKLSAgfSBlbHNlIHsKLSAgICBuYW1lWzBdID0gdG91cHBlcihuYW1lWzBdKTsKLSAgICByZXR1cm4gbmFtZTsKLSAgfQotfQotCi1zdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6Y29uc3RhbnRfbmFtZShzdHJpbmcgbmFtZSkgewotICBzdHJpbmcgY29uc3RhbnRfbmFtZTsKLQotICBib29sIGlzX2ZpcnN0ID0gdHJ1ZTsKLSAgYm9vbCB3YXNfcHJldmlvdXNfY2hhcl91cHBlciA9IGZhbHNlOwotICBmb3IgKHN0cmluZzo6aXRlcmF0b3IgaXRlciA9IG5hbWUuYmVnaW4oKTsgaXRlciAhPSBuYW1lLmVuZCgpOyArK2l0ZXIpIHsKLSAgICBzdHJpbmc6OnZhbHVlX3R5cGUgY2hhcmFjdGVyID0gKCppdGVyKTsKLQotICAgIGJvb2wgaXNfdXBwZXIgPSBpc3VwcGVyKGNoYXJhY3Rlcik7Ci0KLSAgICBpZiAoaXNfdXBwZXIgJiYgIWlzX2ZpcnN0ICYmICF3YXNfcHJldmlvdXNfY2hhcl91cHBlcikgewotICAgICAgY29uc3RhbnRfbmFtZSArPSAnXyc7Ci0gICAgfQotICAgIGNvbnN0YW50X25hbWUgKz0gdG91cHBlcihjaGFyYWN0ZXIpOwotCi0gICAgaXNfZmlyc3QgPSBmYWxzZTsKLSAgICB3YXNfcHJldmlvdXNfY2hhcl91cHBlciA9IGlzX3VwcGVyOwotICB9Ci0KLSAgcmV0dXJuIGNvbnN0YW50X25hbWU7Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVlcF9jb3B5X2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lX3AxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lX3AyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSkgewotCi0gIHRfY29udGFpbmVyKiBjb250YWluZXIgPSAodF9jb250YWluZXIqKXR5cGU7Ci0gIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lOwotICBpZiAoc291cmNlX25hbWVfcDIgPT0gIiIpCi0gICAgc291cmNlX25hbWUgPSBzb3VyY2VfbmFtZV9wMTsKLSAgZWxzZQotICAgIHNvdXJjZV9uYW1lID0gc291cmNlX25hbWVfcDEgKyAiLiIgKyBzb3VyY2VfbmFtZV9wMjsKLQotICBib29sIGNvcHlfY29uc3RydWN0X2NvbnRhaW5lcjsKLSAgaWYgKGNvbnRhaW5lci0+aXNfbWFwKCkpIHsKLSAgICB0X21hcCogdG1hcCA9ICh0X21hcCopY29udGFpbmVyOwotICAgIGNvcHlfY29uc3RydWN0X2NvbnRhaW5lciA9IHRtYXAtPmdldF9rZXlfdHlwZSgpLT5pc19iYXNlX3R5cGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHRtYXAtPmdldF92YWxfdHlwZSgpLT5pc19iYXNlX3R5cGUoKTsKLSAgfSBlbHNlIHsKLSAgICB0X3R5cGUqIGVsZW1fdHlwZSA9IGNvbnRhaW5lci0+aXNfbGlzdCgpID8gKCh0X2xpc3QqKWNvbnRhaW5lciktPmdldF9lbGVtX3R5cGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoKHRfc2V0Kiljb250YWluZXIpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgY29weV9jb25zdHJ1Y3RfY29udGFpbmVyID0gZWxlbV90eXBlLT5pc19iYXNlX3R5cGUoKTsKLSAgfQotCi0gIGlmIChjb3B5X2NvbnN0cnVjdF9jb250YWluZXIpIHsKLSAgICAvLyBkZWVwIGNvcHkgb2YgYmFzZSB0eXBlcyBjYW4gYmUgZG9uZSBtdWNoIG1vcmUgZWZmaWNpZW50bHkgdGhhbiBpdGVyYXRpbmcgb3ZlciBhbGwgdGhlCi0gICAgLy8gZWxlbWVudHMgbWFudWFsbHkKLSAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUodHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCByZXN1bHRfbmFtZSA8PCAiID0gbmV3ICIKLSAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUoY29udGFpbmVyLCBmYWxzZSwgdHJ1ZSkgPDwgIigiIDw8IHNvdXJjZV9uYW1lIDw8ICIpOyIgPDwgZW5kbDsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBjYXBhY2l0eTsKLSAgaWYgKCEoc29ydGVkX2NvbnRhaW5lcnNfICYmIChjb250YWluZXItPmlzX21hcCgpIHx8IGNvbnRhaW5lci0+aXNfc2V0KCkpKSkgewotICAgIC8vIHVuc29ydGVkIGNvbnRhaW5lcnMgYWNjZXB0IGEgY2FwYWNpdHkgdmFsdWUKLSAgICBjYXBhY2l0eSA9IHNvdXJjZV9uYW1lICsgIi5zaXplKCkiOwotICB9Ci0gIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IHJlc3VsdF9uYW1lIDw8ICIgPSBuZXcgIgotICAgICAgICAgICAgICA8PCB0eXBlX25hbWUoY29udGFpbmVyLCBmYWxzZSwgdHJ1ZSkgPDwgIigiIDw8IGNhcGFjaXR5IDw8ICIpOyIgPDwgZW5kbDsKLQotICBzdGQ6OnN0cmluZyBpdGVyYXRvcl9lbGVtZW50X25hbWUgPSBzb3VyY2VfbmFtZV9wMSArICJfZWxlbWVudCI7Ci0gIHN0ZDo6c3RyaW5nIHJlc3VsdF9lbGVtZW50X25hbWUgPSByZXN1bHRfbmFtZSArICJfY29weSI7Ci0KLSAgaWYgKGNvbnRhaW5lci0+aXNfbWFwKCkpIHsKLSAgICB0X3R5cGUqIGtleV90eXBlID0gKCh0X21hcCopY29udGFpbmVyKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2YWxfdHlwZSA9ICgodF9tYXAqKWNvbnRhaW5lciktPmdldF92YWxfdHlwZSgpOwotCi0gICAgaW5kZW50KG91dCkgPDwgImZvciAoTWFwLkVudHJ5PCIgPDwgdHlwZV9uYW1lKGtleV90eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiwgIgotICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSh2YWxfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICI+ICIgPDwgaXRlcmF0b3JfZWxlbWVudF9uYW1lIDw8ICIgOiAiCi0gICAgICAgICAgICAgICAgPDwgc291cmNlX25hbWUgPDwgIi5lbnRyeVNldCgpKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgb3V0IDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoa2V5X3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgaXRlcmF0b3JfZWxlbWVudF9uYW1lCi0gICAgICAgICAgICAgICAgPDwgIl9rZXkgPSAiIDw8IGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSA8PCAiLmdldEtleSgpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUodmFsX3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgaXRlcmF0b3JfZWxlbWVudF9uYW1lCi0gICAgICAgICAgICAgICAgPDwgIl92YWx1ZSA9ICIgPDwgaXRlcmF0b3JfZWxlbWVudF9uYW1lIDw8ICIuZ2V0VmFsdWUoKTsiIDw8IGVuZGw7Ci0KLSAgICBvdXQgPDwgZW5kbDsKLQotICAgIGlmIChrZXlfdHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9jb250YWluZXIob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcl9lbGVtZW50X25hbWUgKyAiX2tleSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfZWxlbWVudF9uYW1lICsgIl9rZXkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfdHlwZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZShrZXlfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCByZXN1bHRfZWxlbWVudF9uYW1lIDw8ICJfa2V5ID0gIjsKLSAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSArICJfa2V5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdF9lbGVtZW50X25hbWUgKyAiX2tleSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfdHlwZSk7Ci0gICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgb3V0IDw8IGVuZGw7Ci0KLSAgICBpZiAodmFsX3R5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3JfZWxlbWVudF9uYW1lICsgIl92YWx1ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfZWxlbWVudF9uYW1lICsgIl92YWx1ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbF90eXBlKTsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKHZhbF90eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IHJlc3VsdF9lbGVtZW50X25hbWUgPDwgIl92YWx1ZSA9ICI7Ci0gICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcl9lbGVtZW50X25hbWUgKyAiX3ZhbHVlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdF9lbGVtZW50X25hbWUgKyAiX3ZhbHVlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbF90eXBlKTsKLSAgICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBvdXQgPDwgZW5kbDsKLQotICAgIGluZGVudChvdXQpIDw8IHJlc3VsdF9uYW1lIDw8ICIucHV0KCIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZSA8PCAiX2tleSwgIiA8PCByZXN1bHRfZWxlbWVudF9uYW1lCi0gICAgICAgICAgICAgICAgPDwgIl92YWx1ZSk7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICB9IGVsc2UgewotICAgIHRfdHlwZSogZWxlbV90eXBlOwotCi0gICAgaWYgKGNvbnRhaW5lci0+aXNfc2V0KCkpIHsKLSAgICAgIGVsZW1fdHlwZSA9ICgodF9zZXQqKWNvbnRhaW5lciktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9IGVsc2UgewotICAgICAgZWxlbV90eXBlID0gKCh0X2xpc3QqKWNvbnRhaW5lciktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAiZm9yICgiIDw8IHR5cGVfbmFtZShlbGVtX3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgaXRlcmF0b3JfZWxlbWVudF9uYW1lCi0gICAgICAgICAgICAgICAgPDwgIiA6ICIgPDwgc291cmNlX25hbWUgPDwgIikgeyIgPDwgZW5kbDsKLQotICAgIGluZGVudF91cCgpOwotCi0gICAgaWYgKGVsZW1fdHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICAgIC8vIHJlY3Vyc2l2ZSBkZWVwIGNvcHkKLSAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9jb250YWluZXIob3V0LCBpdGVyYXRvcl9lbGVtZW50X25hbWUsICIiLCByZXN1bHRfZWxlbWVudF9uYW1lLCBlbGVtX3R5cGUpOwotICAgICAgaW5kZW50KG91dCkgPDwgcmVzdWx0X25hbWUgPDwgIi5hZGQoIiA8PCByZXN1bHRfZWxlbWVudF9uYW1lIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgLy8gaXRlcmF0aXZlIGNvcHkKLSAgICAgIGlmICgoKHRfYmFzZV90eXBlKillbGVtX3R5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAiQnl0ZUJ1ZmZlciB0ZW1wX2JpbmFyeV9lbGVtZW50ID0gIjsKLSAgICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcl9lbGVtZW50X25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZW1wX2JpbmFyeV9lbGVtZW50IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbV90eXBlKTsKLSAgICAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnQob3V0KSA8PCByZXN1bHRfbmFtZSA8PCAiLmFkZCh0ZW1wX2JpbmFyeV9lbGVtZW50KTsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpbmRlbnQob3V0KSA8PCByZXN1bHRfbmFtZSA8PCAiLmFkZCgiOwotICAgICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihvdXQsIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSwgcmVzdWx0X25hbWUsIGVsZW1fdHlwZSk7Ci0gICAgICAgIG91dCA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaW5kZW50X2Rvd24oKTsKLQotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICB9Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc291cmNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRlc3RfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlKSB7Ci0gICh2b2lkKWRlc3RfbmFtZTsKLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSB8fCB0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICBvdXQgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvcHlCaW5hcnkoIiA8PCBzb3VyY2VfbmFtZSA8PCAiKSI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIGV2ZXJ5dGhpbmcgZWxzZSBjYW4gYmUgY29waWVkIGRpcmVjdGx5Ci0gICAgICBvdXQgPDwgc291cmNlX25hbWU7Ci0gICAgfQotICB9IGVsc2UgewotICAgIG91dCA8PCAibmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUsIHRydWUpIDw8ICIoIiA8PCBzb3VyY2VfbmFtZSA8PCAiKSI7Ci0gIH0KLX0KLQotc3RkOjpzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfY2hlY2sodF9maWVsZCogZmllbGQpIHsKLSAgcmV0dXJuIGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkLT5nZXRfbmFtZSgpKTsKLX0KLQotc3RkOjpzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6aXNzZXRfZmllbGRfaWQodF9maWVsZCogZmllbGQpIHsKLSAgcmV0dXJuICJfXyIgKyB1cGNhc2Vfc3RyaW5nKGZpZWxkLT5nZXRfbmFtZSgpICsgIl9pc3NldF9pZCIpOwotfQotCi1zdGQ6OnN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9jaGVjayhzdGQ6OnN0cmluZyBmaWVsZF9uYW1lKSB7Ci0gIHJldHVybiAiaXMiICsgZ2V0X2NhcF9uYW1lKCJzZXQiKSArIGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKSArICIoKSI7Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfc2V0KG9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkLCBzdHJpbmcgcHJlZml4KSB7Ci0gIGlmICghdHlwZV9jYW5fYmVfbnVsbChmaWVsZC0+Z2V0X3R5cGUoKSkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgInNldCIgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCBnZXRfY2FwX25hbWUoImlzU2V0IikKLSAgICAgICAgICAgICAgICA8PCAiKHRydWUpOyIgPDwgZW5kbDsKLSAgfQotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF9kZXNjKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0IFNUUlVDVF9ERVNDID0gbmV3ICIKLSAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QoXCIiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlwiKTsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRfZGVzY3Mob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCAiCi0gICAgICAgICAgICAgICAgPDwgY29uc3RhbnRfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpCi0gICAgICAgICAgICAgICAgPDwgIl9GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZChcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgPDwgIlwiLCAiIDw8IHR5cGVfdG9fZW51bSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICIsICIKLSAgICAgICAgICAgICAgICA8PCAiKHNob3J0KSIgPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIik7IiA8PCBlbmRsOwotICB9Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2NoZW1lX21hcChvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPENsYXNzPD8gZXh0ZW5kcyBJU2NoZW1lPiwgU2NoZW1lRmFjdG9yeT4gc2NoZW1lcyA9IG5ldyAiCi0gICAgICAgICAgICAgICAgICJIYXNoTWFwPENsYXNzPD8gZXh0ZW5kcyBJU2NoZW1lPiwgU2NoZW1lRmFjdG9yeT4oKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJzdGF0aWMgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgc2NoZW1lcy5wdXQoU3RhbmRhcmRTY2hlbWUuY2xhc3MsIG5ldyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgPDwgIlN0YW5kYXJkU2NoZW1lRmFjdG9yeSgpKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHNjaGVtZXMucHV0KFR1cGxlU2NoZW1lLmNsYXNzLCBuZXcgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgIDw8ICJUdXBsZVNjaGVtZUZhY3RvcnkoKSk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9maWVsZF9uYW1lX2NvbnN0YW50cyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAiLyoqIFRoZSBzZXQgb2YgZmllbGRzIHRoaXMgc3RydWN0IGNvbnRhaW5zLCBhbG9uZyB3aXRoIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yICIKLSAgICAgICAgICAgICAgICAgImZpbmRpbmcgYW5kIG1hbmlwdWxhdGluZyB0aGVtLiAqLyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBlbnVtIF9GaWVsZHMgaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRJZEVudW0geyIgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBpZiAoIWZpcnN0KSB7Ci0gICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7Ci0gICAgfQotICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgZ2VuZXJhdGVfamF2YV9kb2Mob3V0LCAqbV9pdGVyKTsKLSAgICBpbmRlbnQob3V0KSA8PCBjb25zdGFudF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIigoc2hvcnQpIiA8PCAoKm1faXRlciktPmdldF9rZXkoKQotICAgICAgICAgICAgICAgIDw8ICIsIFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiKSI7Ci0gIH0KLQotICBvdXQgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KQotICAgICAgPDwgInByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIF9GaWVsZHM+IGJ5TmFtZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgX0ZpZWxkcz4oKTsiCi0gICAgICA8PCBlbmRsOwotICBvdXQgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAic3RhdGljIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIGZvciAoX0ZpZWxkcyBmaWVsZCA6IEVudW1TZXQuYWxsT2YoX0ZpZWxkcy5jbGFzcykpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgICAgYnlOYW1lLnB1dChmaWVsZC5nZXRGaWVsZE5hbWUoKSwgZmllbGQpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAiLyoqIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICogRmluZCB0aGUgX0ZpZWxkcyBjb25zdGFudCB0aGF0IG1hdGNoZXMgZmllbGRJZCwgb3IgbnVsbCBpZiBpdHMgbm90IGZvdW5kLiIKLSAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAqLyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBzdGF0aWMgX0ZpZWxkcyBmaW5kQnlUaHJpZnRJZChpbnQgZmllbGRJZCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJzd2l0Y2goZmllbGRJZCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjogLy8gIgotICAgICAgICAgICAgICAgIDw8IGNvbnN0YW50X25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiAiIDw8IGNvbnN0YW50X25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOyIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIG51bGw7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgIi8qKiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAqIEZpbmQgdGhlIF9GaWVsZHMgY29uc3RhbnQgdGhhdCBtYXRjaGVzIGZpZWxkSWQsIHRocm93aW5nIGFuIGV4Y2VwdGlvbiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAqIGlmIGl0IGlzIG5vdCBmb3VuZC4iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgKi8iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RhdGljIF9GaWVsZHMgZmluZEJ5VGhyaWZ0SWRPclRocm93KGludCBmaWVsZElkKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICBfRmllbGRzIGZpZWxkcyA9IGZpbmRCeVRocmlmdElkKGZpZWxkSWQpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgaWYgKGZpZWxkcyA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFwiRmllbGQgXCIgKyBmaWVsZElkICsgIgotICAgICAgICAgICAgICAgICAiXCIgZG9lc24ndCBleGlzdCFcIik7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gZmllbGRzOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAiLyoqIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICogRmluZCB0aGUgX0ZpZWxkcyBjb25zdGFudCB0aGF0IG1hdGNoZXMgbmFtZSwgb3IgbnVsbCBpZiBpdHMgbm90IGZvdW5kLiIKLSAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAqLyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBzdGF0aWMgX0ZpZWxkcyBmaW5kQnlOYW1lKFN0cmluZyBuYW1lKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gYnlOYW1lLmdldChuYW1lKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgZmluYWwgc2hvcnQgX3RocmlmdElkOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgZmluYWwgU3RyaW5nIF9maWVsZE5hbWU7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgIl9GaWVsZHMoc2hvcnQgdGhyaWZ0SWQsIFN0cmluZyBmaWVsZE5hbWUpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIF90aHJpZnRJZCA9IHRocmlmdElkOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgX2ZpZWxkTmFtZSA9IGZpZWxkTmFtZTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBzaG9ydCBnZXRUaHJpZnRGaWVsZElkKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIF90aHJpZnRJZDsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBTdHJpbmcgZ2V0RmllbGROYW1lKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIF9maWVsZE5hbWU7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotCi0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotfQotCi10X2phdmFfZ2VuZXJhdG9yOjppc3NldF90eXBlIHRfamF2YV9nZW5lcmF0b3I6Om5lZWRzX2lzc2V0KHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogb3V0UHJpbWl0aXZlVHlwZSkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIGludCBjb3VudCA9IDA7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBpZiAoIXR5cGVfY2FuX2JlX251bGwoZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpKSkgewotICAgICAgY291bnQrKzsKLSAgICB9Ci0gIH0KLSAgaWYgKGNvdW50ID09IDApIHsKLSAgICByZXR1cm4gSVNTRVRfTk9ORTsKLSAgfSBlbHNlIGlmIChjb3VudCA8PSA2NCkgewotICAgIGlmIChvdXRQcmltaXRpdmVUeXBlICE9IE5VTEwpIHsKLSAgICAgIGlmIChjb3VudCA8PSA4KQotICAgICAgICAqb3V0UHJpbWl0aXZlVHlwZSA9ICJieXRlIjsKLSAgICAgIGVsc2UgaWYgKGNvdW50IDw9IDE2KQotICAgICAgICAqb3V0UHJpbWl0aXZlVHlwZSA9ICJzaG9ydCI7Ci0gICAgICBlbHNlIGlmIChjb3VudCA8PSAzMikKLSAgICAgICAgKm91dFByaW1pdGl2ZVR5cGUgPSAiaW50IjsKLSAgICAgIGVsc2UgaWYgKGNvdW50IDw9IDY0KQotICAgICAgICAqb3V0UHJpbWl0aXZlVHlwZSA9ICJsb25nIjsKLSAgICB9Ci0gICAgcmV0dXJuIElTU0VUX1BSSU1JVElWRTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gSVNTRVRfQklUU0VUOwotICB9Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfY2xlYXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpZiAoIWphdmE1XykgewotICAgIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIGNsZWFyKCkgeyIgPDwgZW5kbDsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIGluZGVudF91cCgpOwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAqbV9pdGVyOwotICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoZmllbGQtPmdldF90eXBlKCkpOwotCi0gICAgaWYgKGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7Ci0gICAgICBwcmludF9jb25zdF92YWx1ZShvdXQsICJ0aGlzLiIgKyBmaWVsZC0+Z2V0X25hbWUoKSwgdCwgZmllbGQtPmdldF92YWx1ZSgpLCB0cnVlLCB0cnVlKTsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHQpKSB7Ci0KLSAgICAgIGlmIChyZXVzZV9vYmplY3RzXyAmJiAodC0+aXNfY29udGFpbmVyKCkgfHwgdC0+aXNfc3RydWN0KCkpKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgIT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIi5jbGVhcigpOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiID0gbnVsbDsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICAvLyBtdXN0IGJlIGEgYmFzZSB0eXBlCi0gICAgLy8gbWVhbnMgaXQgYWxzbyBuZWVkcyB0byBiZSBleHBsaWNpdGx5IHVuc2V0Ci0gICAgaW5kZW50KG91dCkgPDwgInNldCIgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCBnZXRfY2FwX25hbWUoImlzU2V0IikgPDwgIihmYWxzZSk7IgotICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgdF9iYXNlX3R5cGUqIGJhc2VfdHlwZSA9ICh0X2Jhc2VfdHlwZSopdDsKLQotICAgIHN3aXRjaCAoYmFzZV90eXBlLT5nZXRfYmFzZSgpKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiID0gMDsiIDw8IGVuZGw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiA9IDAuMDsiIDw8IGVuZGw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPSBmYWxzZTsiIDw8IGVuZGw7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgInVuc3VwcG9ydGVkIHR5cGU6ICIgKyBiYXNlX3R5cGUtPmdldF9uYW1lKCkgKyAiIGZvciBmaWVsZCAiICsgZmllbGQtPmdldF9uYW1lKCk7Ci0gICAgfQotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLy8gZ2VuZXJhdGVzIGphdmEgbWV0aG9kIHRvIHNlcmlhbGl6ZSAoaW4gdGhlIEphdmEgc2Vuc2UpIHRoZSBvYmplY3QKLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3Rfd3JpdGVfb2JqZWN0KG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gICh2b2lkKXRzdHJ1Y3Q7Ci0gIGluZGVudChvdXQpCi0gICAgICA8PCAicHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geyIKLSAgICAgIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHRyeSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICAgIHdyaXRlKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQ29tcGFjdFByb3RvY29sKG5ldyAiCi0gICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVElPU3RyZWFtVHJhbnNwb3J0KG91dCkpKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIH0gY2F0Y2ggKG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24gdGUpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgICAgdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24odGUiIDw8IChhbmRyb2lkX2xlZ2FjeV8gPyAiLmdldE1lc3NhZ2UoKSIgOiAiIikKLSAgICAgICAgICAgICAgPDwgIik7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vLyBnZW5lcmF0ZXMgamF2YSBtZXRob2QgdG8gc2VyaWFsaXplIChpbiB0aGUgSmF2YSBzZW5zZSkgdGhlIG9iamVjdAotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZWFkX29iamVjdChvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBpbikgdGhyb3dzICIKLSAgICAgICAgICAgICAgICAgImphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgdHJ5IHsiIDw8IGVuZGw7Ci0gIGlmICghdHN0cnVjdC0+aXNfdW5pb24oKSkgewotICAgIHN3aXRjaCAobmVlZHNfaXNzZXQodHN0cnVjdCkpIHsKLSAgICBjYXNlIElTU0VUX05PTkU6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElTU0VUX1BSSU1JVElWRToKLSAgICAgIGluZGVudChvdXQpIDw8ICIgICAgLy8gaXQgZG9lc24ndCBzZWVtIGxpa2UgeW91IHNob3VsZCBoYXZlIHRvIGRvIHRoaXMsIGJ1dCBqYXZhICIKLSAgICAgICAgICAgICAgICAgICAgICJzZXJpYWxpemF0aW9uIGlzIHdhY2t5LCBhbmQgZG9lc24ndCBjYWxsIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yLiIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgICAgX19pc3NldF9iaXRmaWVsZCA9IDA7IiA8PCBlbmRsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJU1NFVF9CSVRTRVQ6Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICAgIC8vIGl0IGRvZXNuJ3Qgc2VlbSBsaWtlIHlvdSBzaG91bGQgaGF2ZSB0byBkbyB0aGlzLCBidXQgamF2YSAiCi0gICAgICAgICAgICAgICAgICAgICAic2VyaWFsaXphdGlvbiBpcyB3YWNreSwgYW5kIGRvZXNuJ3QgY2FsbCB0aGUgZGVmYXVsdCBjb25zdHJ1Y3Rvci4iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICAgIF9faXNzZXRfYml0X3ZlY3RvciA9IG5ldyBCaXRTZXQoMSk7IiA8PCBlbmRsOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIGluZGVudChvdXQpIDw8ICIgICAgcmVhZChuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbChuZXcgIgotICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRJT1N0cmVhbVRyYW5zcG9ydChpbikpKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIH0gY2F0Y2ggKG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24gdGUpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgICAgdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24odGUiIDw8IChhbmRyb2lkX2xlZ2FjeV8gPyAiLmdldE1lc3NhZ2UoKSIgOiAiIikKLSAgICAgICAgICAgICAgPDwgIik7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0YW5kYXJkX3JlYWRlcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyB2b2lkIHJlYWQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIGlwcm90LCAiCi0gICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gRGVjbGFyZSBzdGFjayB0bXAgdmFyaWFibGVzIGFuZCByZWFkIHN0cnVjdCBoZWFkZXIKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgc2NoZW1lRmllbGQ7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICA8PCAiaXByb3QucmVhZFN0cnVjdEJlZ2luKCk7IiA8PCBlbmRsOwotCi0gIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcwotICBpbmRlbnQob3V0KSA8PCAid2hpbGUgKHRydWUpIiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotCi0gIC8vIFJlYWQgYmVnaW5uaW5nIGZpZWxkIG1hcmtlcgotICBpbmRlbnQob3V0KSA8PCAic2NoZW1lRmllbGQgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpOyIgPDwgZW5kbDsKLQotICAvLyBDaGVjayBmb3IgZmllbGQgU1RPUCBtYXJrZXIgYW5kIGJyZWFrCi0gIGluZGVudChvdXQpIDw8ICJpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVE9QKSB7ICIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJicmVhazsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIC8vIFN3aXRjaCBzdGF0ZW1lbnQgb24gdGhlIGZpZWxkIHdlIGFyZSByZWFkaW5nCi0gIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKHNjaGVtZUZpZWxkLmlkKSB7IiA8PCBlbmRsOwotCi0gIGluZGVudF91cCgpOwotCi0gIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjogLy8gIgotICAgICAgICAgICAgICAgIDw8IGNvbnN0YW50X25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJpZiAoc2NoZW1lRmllbGQudHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpIHsiCi0gICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInN0cnVjdC4iLCB0cnVlKTsKLSAgICBpbmRlbnQob3V0KSA8PCAic3RydWN0LiIKLSAgICAgICAgICAgICAgICA8PCAic2V0IiA8PCBnZXRfY2FwX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCBnZXRfY2FwX25hbWUoImlzU2V0IikKLSAgICAgICAgICAgICAgICA8PCAiKHRydWUpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsgIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgIDw8ICIgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgc2NoZW1lRmllbGQudHlwZSk7IiA8PCBlbmRsCi0gICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsiCi0gICAgICAgICAgICAgIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgLy8gUmVhZCBmaWVsZCBlbmQgbWFya2VyCi0gIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICJpcHJvdC5yZWFkU3RydWN0RW5kKCk7IiA8PCBlbmRsOwotCi0gIC8vIGluIG5vbi1iZWFucyBzdHlsZSwgY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcyBvZiBwcmltaXRpdmUgdHlwZQotICAvLyAod2hpY2ggY2FuIGJlIGNoZWNrZWQgaGVyZSBidXQgbm90IGluIHRoZSBnZW5lcmFsIHZhbGlkYXRlIG1ldGhvZCkKLSAgaWYgKCFiZWFuX3N0eWxlXykgewotICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIvLyBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIG9mIHByaW1pdGl2ZSB0eXBlLCB3aGljaCBjYW4ndCBiZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoZWNrZWQgaW4gdGhlIHZhbGlkYXRlIG1ldGhvZCIgPDwgZW5kbDsKLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQgJiYgIXR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSkgewotICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghc3RydWN0LiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikgeyIgPDwgZW5kbAotICAgICAgICAgICAgPDwgaW5kZW50KCkKLSAgICAgICAgICAgIDw8ICIgIHRocm93IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xFeGNlcHRpb24oXCJSZXF1aXJlZCBmaWVsZCAnIgotICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICA8PCAiJyB3YXMgbm90IGZvdW5kIGluIHNlcmlhbGl6ZWQgZGF0YSEgU3RydWN0OiBcIiArIHRvU3RyaW5nKCkpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLy8gcGVyZm9ybXMgdmFyaW91cyBjaGVja3MgKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCi0gIGluZGVudChvdXQpIDw8ICJzdHJ1Y3QudmFsaWRhdGUoKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0YW5kYXJkX3dyaXRlcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19yZXN1bHQpIHsKLSAgaW5kZW50X3VwKCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIHZvaWQgd3JpdGUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIG9wcm90LCAiCi0gICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICAvLyBwZXJmb3JtcyB2YXJpb3VzIGNoZWNrcyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKLSAgaW5kZW50KG91dCkgPDwgInN0cnVjdC52YWxpZGF0ZSgpOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEJlZ2luKFNUUlVDVF9ERVNDKTsiIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBib29sIG51bGxfYWxsb3dlZCA9IHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAobnVsbF9hbGxvd2VkKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChzdHJ1Y3QuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotICAgIGJvb2wgb3B0aW9uYWwgPSAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCkgfHwgKGlzX3Jlc3VsdCAmJiAhbnVsbF9hbGxvd2VkKTsKLSAgICBpZiAob3B0aW9uYWwpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIgotICAgICAgICAgICAgICAgICAgPDwgInN0cnVjdC4iIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCgqZl9pdGVyKSkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLQotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkQmVnaW4oIiA8PCBjb25zdGFudF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkKLSAgICAgICAgICAgICAgICA8PCAiX0ZJRUxEX0RFU0MpOyIgPDwgZW5kbDsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCi0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInN0cnVjdC4iLCB0cnVlKTsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOwotCi0gICAgaWYgKG9wdGlvbmFsKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIGlmIChudWxsX2FsbG93ZWQpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLSAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsiCi0gICAgICA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3N0YW5kYXJkX3NjaGVtZShvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCkgewotICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBzdGF0aWMgY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgIDw8ICJTdGFuZGFyZFNjaGVtZUZhY3RvcnkgaW1wbGVtZW50cyBTY2hlbWVGYWN0b3J5IHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiU3RhbmRhcmRTY2hlbWUgZ2V0U2NoZW1lKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJyZXR1cm4gbmV3ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiU3RhbmRhcmRTY2hlbWUoKTsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAicHJpdmF0ZSBzdGF0aWMgY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCi0gICAgICA8PCAiU3RhbmRhcmRTY2hlbWUgZXh0ZW5kcyBTdGFuZGFyZFNjaGVtZTwiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIj4geyIgPDwgZW5kbCA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZ2VuZXJhdGVfc3RhbmRhcmRfcmVhZGVyKG91dCwgdHN0cnVjdCk7Ci0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PCBlbmRsOwotICBnZW5lcmF0ZV9zdGFuZGFyZF93cml0ZXIob3V0LCB0c3RydWN0LCBpc19yZXN1bHQpOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3R1cGxlX3JlYWRlcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgcHJvdCwgIgotICAgICAgICAgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgIlRUdXBsZVByb3RvY29sIGlwcm90ID0gKFRUdXBsZVByb3RvY29sKSBwcm90OyIgPDwgZW5kbDsKLSAgaW50IG9wdGlvbmFsX2NvdW50ID0gMDsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMCi0gICAgICAgIHx8ICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQpIHsKLSAgICAgIG9wdGlvbmFsX2NvdW50Kys7Ci0gICAgfQotICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICgqZl9pdGVyKSwgInN0cnVjdC4iLCBmYWxzZSk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAic3RydWN0LnNldCIgPDwgZ2V0X2NhcF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpCi0gICAgICAgICAgICAgICAgICA8PCAiKHRydWUpOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLSAgaWYgKG9wdGlvbmFsX2NvdW50ID4gMCkgewotICAgIGluZGVudChvdXQpIDw8ICJCaXRTZXQgaW5jb21pbmcgPSBpcHJvdC5yZWFkQml0U2V0KCIgPDwgb3B0aW9uYWxfY291bnQgPDwgIik7IiA8PCBlbmRsOwotICAgIGludCBpID0gMDsKLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwKLSAgICAgICAgICB8fCAoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoaW5jb21pbmcuZ2V0KCIgPDwgaSA8PCAiKSkgeyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKCpmX2l0ZXIpLCAic3RydWN0LiIsIGZhbHNlKTsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgInN0cnVjdC5zZXQiIDw8IGdldF9jYXBfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8IGdldF9jYXBfbmFtZSgiaXNTZXQiKQotICAgICAgICAgICAgICAgICAgICA8PCAiKHRydWUpOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICAgIGkrKzsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfdHVwbGVfd3JpdGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgcHJvdCwgIgotICAgICAgICAgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgIlRUdXBsZVByb3RvY29sIG9wcm90ID0gKFRUdXBsZVByb3RvY29sKSBwcm90OyIgPDwgZW5kbDsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGJvb2wgaGFzX29wdGlvbmFsID0gZmFsc2U7Ci0gIGludCBvcHRpb25hbF9jb3VudCA9IDA7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwKLSAgICAgICAgfHwgKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCkgewotICAgICAgb3B0aW9uYWxfY291bnQrKzsKLSAgICAgIGhhc19vcHRpb25hbCA9IHRydWU7Ci0gICAgfQotICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAoKmZfaXRlciksICJzdHJ1Y3QuIiwgZmFsc2UpOwotICAgIH0KLSAgfQotICBpZiAoaGFzX29wdGlvbmFsKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIkJpdFNldCBvcHRpb25hbHMgPSBuZXcgQml0U2V0KCk7IiA8PCBlbmRsOwotICAgIGludCBpID0gMDsKLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwKLSAgICAgICAgICB8fCAoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoc3RydWN0LiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKCpmX2l0ZXIpKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIm9wdGlvbmFscy5zZXQoIiA8PCBpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICAgIGkrKzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVCaXRTZXQob3B0aW9uYWxzLCAiIDw8IG9wdGlvbmFsX2NvdW50IDw8ICIpOyIgPDwgZW5kbDsKLSAgICBpbnQgaiA9IDA7Ci0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMCi0gICAgICAgICAgfHwgKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHN0cnVjdC4iIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCpmX2l0ZXIpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAoKmZfaXRlciksICJzdHJ1Y3QuIiwgZmFsc2UpOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICAgICAgaisrOwotICAgICAgfQotICAgIH0KLSAgfQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF90dXBsZV9zY2hlbWUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgc3RhdGljIGNsYXNzICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICA8PCAiVHVwbGVTY2hlbWVGYWN0b3J5IGltcGxlbWVudHMgU2NoZW1lRmFjdG9yeSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlR1cGxlU2NoZW1lIGdldFNjaGVtZSgpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIG5ldyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlR1cGxlU2NoZW1lKCk7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJwcml2YXRlIHN0YXRpYyBjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKLSAgICAgIDw8ICJUdXBsZVNjaGVtZSBleHRlbmRzIFR1cGxlU2NoZW1lPCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiPiB7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF90dXBsZV93cml0ZXIob3V0LCB0c3RydWN0KTsKLSAgb3V0IDw8IGVuZGw7Ci0gIGdlbmVyYXRlX2phdmFfc3RydWN0X3R1cGxlX3JlYWRlcihvdXQsIHRzdHJ1Y3QpOwotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZheF9nZW5lcmF0ZWRfYW5ub3RhdGlvbihvZnN0cmVhbSYgb3V0KSB7Ci0gIHRpbWVfdCBzZWNvbmRzID0gdGltZShOVUxMKTsKLSAgc3RydWN0IHRtKiBub3cgPSBsb2NhbHRpbWUoJnNlY29uZHMpOwotICBpbmRlbnQob3V0KSA8PCAiQEdlbmVyYXRlZCh2YWx1ZSA9IFwiIiA8PCBhdXRvZ2VuX3N1bW1hcnkoKSA8PCAiXCIiOwotICBpZiAodW5kYXRlZF9nZW5lcmF0ZWRfYW5ub3RhdGlvbnNfKSB7Ci0gICAgb3V0IDw8ICIpIiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGluZGVudChvdXQpIDw8ICIsIGRhdGUgPSBcIiIgPDwgKG5vdy0+dG1feWVhciArIDE5MDApIDw8ICItIiA8PCBzZXRmaWxsKCcwJykgPDwgc2V0dygyKQotICAgICAgICAgICAgICAgIDw8IChub3ctPnRtX21vbiArIDEpIDw8ICItIiA8PCBzZXRmaWxsKCcwJykgPDwgc2V0dygyKSA8PCBub3ctPnRtX21kYXkKLSAgICAgICAgICAgICAgICA8PCAiXCIpIiA8PCBlbmRsOwotICB9Ci19Ci0KLVRIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoCi0gICAgamF2YSwKLSAgICAiSmF2YSIsCi0gICAgIiAgICBiZWFuczogICAgICAgICAgIE1lbWJlcnMgd2lsbCBiZSBwcml2YXRlLCBhbmQgc2V0dGVyIG1ldGhvZHMgd2lsbCByZXR1cm4gdm9pZC5cbiIKLSAgICAiICAgIHByaXZhdGUtbWVtYmVyczogTWVtYmVycyB3aWxsIGJlIHByaXZhdGUsIGJ1dCBzZXR0ZXIgbWV0aG9kcyB3aWxsIHJldHVybiAndGhpcycgbGlrZSAiCi0gICAgInVzdWFsLlxuIgotICAgICIgICAgbm9jYW1lbDogICAgICAgICBEbyBub3QgdXNlIENhbWVsQ2FzZSBmaWVsZCBhY2Nlc3NvcnMgd2l0aCBiZWFucy5cbiIKLSAgICAiICAgIGZ1bGxjYW1lbDogICAgICAgQ29udmVydCB1bmRlcnNjb3JlZF9hY2Nlc3Nvcl9vcl9zZXJ2aWNlX25hbWVzIHRvIGNhbWVsQ2FzZS5cbiIKLSAgICAiICAgIGFuZHJvaWQ6ICAgICAgICAgR2VuZXJhdGVkIHN0cnVjdHVyZXMgYXJlIFBhcmNlbGFibGUuXG4iCi0gICAgIiAgICBhbmRyb2lkX2xlZ2FjeTogIERvIG5vdCB1c2UgamF2YS5pby5JT0V4Y2VwdGlvbih0aHJvd2FibGUpIChhdmFpbGFibGUgZm9yIEFuZHJvaWQgMi4zIGFuZCAiCi0gICAgImFib3ZlKS5cbiIKLSAgICAiICAgIG9wdGlvbl90eXBlOiAgICAgV3JhcCBvcHRpb25hbCBmaWVsZHMgaW4gYW4gT3B0aW9uIHR5cGUuXG4iCi0gICAgIiAgICBqYXZhNTogICAgICAgICAgIEdlbmVyYXRlIEphdmEgMS41IGNvbXBsaWFudCBjb2RlIChpbmNsdWRlcyBhbmRyb2lkX2xlZ2FjeSBmbGFnKS5cbiIKLSAgICAiICAgIHJldXNlLW9iamVjdHM6ICAgRGF0YSBvYmplY3RzIHdpbGwgbm90IGJlIGFsbG9jYXRlZCwgYnV0IGV4aXN0aW5nIGluc3RhbmNlcyB3aWxsIGJlIHVzZWQgIgotICAgICIocmVhZCBhbmQgd3JpdGUpLlxuIgotICAgICIgICAgc29ydGVkX2NvbnRhaW5lcnM6XG4iCi0gICAgIiAgICAgICAgICAgICAgICAgICAgIFVzZSBUcmVlU2V0L1RyZWVNYXAgaW5zdGVhZCBvZiBIYXNoU2V0L0hhc2hNYXAgYXMgYSBpbXBsZW1lbnRhdGlvbiBvZiAiCi0gICAgInNldC9tYXAuXG4iCi0gICAgIiAgICBnZW5lcmF0ZWRfYW5ub3RhdGlvbnM9W3VuZGF0ZWR8c3VwcHJlc3NdOlxuIgotICAgICIgICAgICAgICAgICAgICAgICAgICB1bmRhdGVkOiBzdXBwcmVzcyB0aGUgZGF0ZSBhdCBAR2VuZXJhdGVkIGFubm90YXRpb25zXG4iCi0gICAgIiAgICAgICAgICAgICAgICAgICAgIHN1cHByZXNzOiBzdXBwcmVzcyBAR2VuZXJhdGVkIGFubm90YXRpb25zIGVudGlyZWx5XG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2phdmFtZV9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfamF2YW1lX2dlbmVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRhMTNmYy4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfamF2YW1lX2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDMyODkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8Y2N0eXBlPgotCi0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzdGRleGNlcHQ+Ci0KLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotI2luY2x1ZGUgInRfb29wX2dlbmVyYXRvci5oIgotCi11c2luZyBzdGQ6Om1hcDsKLXVzaW5nIHN0ZDo6b2ZzdHJlYW07Ci11c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Ci11c2luZyBzdGQ6OnN0cmluZzsKLXVzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwotdXNpbmcgc3RkOjp2ZWN0b3I7Ci0KLXN0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKLQotLyoqCi0gKiBKYXZhIGNvZGUgZ2VuZXJhdG9yLgotICoKLSAqLwotY2xhc3MgdF9qYXZhbWVfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7Ci1wdWJsaWM6Ci0gIHRfamF2YW1lX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQotICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKLSAgICAodm9pZClwYXJzZWRfb3B0aW9uczsKLSAgICAodm9pZClvcHRpb25fc3RyaW5nOwotICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7Ci0gICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tamF2YW1lIjsKLSAgfQotCi0gIC8qKgotICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCi0gICAqLwotCi0gIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKLSAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKLQotICB2b2lkIGdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKTsKLQotICAvKioKLSAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7Ci0gIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3VuaW9uKHRfc3RydWN0KiB0dW5pb24pOwotICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0KLSAgdm9pZCBwcmludF9jb25zdF92YWx1ZShzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9zdGF0aWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWZ2YWwgPSBmYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZShzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpOwotCi0gIC8qKgotICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKLQotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NsYXNzID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCA9IGZhbHNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9lcXVhbGl0eShzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9jb21wYXJlX3RvKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3JlYWRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX3ZhbGlkYXRvcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZXN1bHRfd3JpdGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3dyaXRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF90b3N0cmluZyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9jbGVhcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUpOwotICBzdGQ6OnN0cmluZyBnZXRfamF2YV90eXBlX3N0cmluZyh0X3R5cGUqIHR5cGUpOwotICB2b2lkIGdlbmVyYXRlX3JlZmxlY3Rpb25fc2V0dGVycyhzdGQ6Om9zdHJpbmdzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcmVmbGVjdGlvbl9nZXR0ZXJzKHN0ZDo6b3N0cmluZ3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lKTsKLSAgdm9pZCBnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnNfc2V0dGVycyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX2JlYW5fYm9pbGVycGxhdGUoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0gIHN0ZDo6c3RyaW5nIGdldF9jYXBfbmFtZShzdGQ6OnN0cmluZyBuYW1lKTsKLSAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVfaXNzZXRfY2hlY2sodF9maWVsZCogZmllbGQpOwotICBzdGQ6OnN0cmluZyBnZW5lcmF0ZV9pc3NldF9jaGVjayhzdGQ6OnN0cmluZyBmaWVsZCk7Ci0gIHZvaWQgZ2VuZXJhdGVfaXNzZXRfc2V0KG9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKTsKLSAgc3RkOjpzdHJpbmcgaXNzZXRfZmllbGRfaWQodF9maWVsZCogZmllbGQpOwotCi0gIHZvaWQgZ2VuZXJhdGVfcHJpbWl0aXZlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX3VuaW9uKHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV91bmlvbl9jb25zdHJ1Y3RvcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfdW5pb25fZ2V0dGVyc19hbmRfc2V0dGVycyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfdW5pb25fYWJzdHJhY3RfbWV0aG9kcyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfY2hlY2tfdHlwZShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfcmVhZF92YWx1ZShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfd3JpdGVfdmFsdWUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2dldF9maWVsZF9kZXNjKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9nZXRfc3RydWN0X2Rlc2Mob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2dldF9maWVsZF9uYW1lKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLQotICB2b2lkIGdlbmVyYXRlX3VuaW9uX2NvbXBhcmlzb25zKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV91bmlvbl9oYXNoY29kZShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0KLSAgLyoqCi0gICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWFwKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0bWFwLCBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX2phdmFfZG9jKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpOwotCi0gIHZvaWQgZ2VuZXJhdGVfamF2YV9kb2Moc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2RvYyogdGRvYyk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX2RvYyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRkb2MpOwotCi0gIHZvaWQgZ2VuZXJhdGVfamF2YV9kb2NzdHJpbmdfY29tbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0cmluZyBjb250ZW50cyk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lX3AxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc291cmNlX25hbWVfcDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyByZXN1bHRfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRlc3RfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUpOwotCi0gIGJvb2wgaGFzX2JpdF92ZWN0b3IodF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotCi0gIC8qKgotICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucwotICAgKi8KLQotICBzdGQ6OnN0cmluZyBqYXZhX3BhY2thZ2UoKTsKLSAgc3RkOjpzdHJpbmcgamF2YV90eXBlX2ltcG9ydHMoKTsKLSAgc3RkOjpzdHJpbmcgamF2YV90aHJpZnRfaW1wb3J0cygpOwotICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY29udGFpbmVyID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2luaXQgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2tpcF9nZW5lcmljID0gZmFsc2UpOwotICBzdGQ6OnN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdGJhc2UsIGJvb2wgaW5fY29udGFpbmVyID0gZmFsc2UpOwotICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0ID0gZmFsc2UpOwotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0gIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaW5jbHVkZV90eXBlcyA9IHRydWUpOwotICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIGdldF9lbnVtX2NsYXNzX25hbWUodF90eXBlKiB0eXBlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3RfZGVzYyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZmllbGRfZGVzY3Mob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICBzdGQ6OnN0cmluZyBib3hfdHlwZSh0X3R5cGUqIHR5cGUsIHN0cmluZyB2YWx1ZSk7Ci0KLSAgYm9vbCB0eXBlX2Nhbl9iZV9udWxsKHRfdHlwZSogdHR5cGUpIHsKLSAgICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOwotCi0gICAgcmV0dXJuIHR0eXBlLT5pc19jb250YWluZXIoKSB8fCB0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkgfHwgdHR5cGUtPmlzX3N0cmluZygpCi0gICAgICAgICAgIHx8IHR0eXBlLT5pc19lbnVtKCk7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBjb25zdGFudF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpOwotCi1wcml2YXRlOgotICAvKioKLSAgICogRmlsZSBzdHJlYW1zCi0gICAqLwotCi0gIHN0ZDo6c3RyaW5nIHBhY2thZ2VfbmFtZV87Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9zZXJ2aWNlXzsKLSAgc3RkOjpzdHJpbmcgcGFja2FnZV9kaXJfOwotfTsKLQotLyoqCi0gKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAotICogc3RyZWFtcy4KLSAqCi0gKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgewotICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKLSAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKLSAgcGFja2FnZV9uYW1lXyA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJqYXZhIik7Ci0KLSAgc3RyaW5nIGRpciA9IHBhY2thZ2VfbmFtZV87Ci0gIHN0cmluZyBzdWJkaXIgPSBnZXRfb3V0X2RpcigpOwotICBzdHJpbmc6OnNpemVfdHlwZSBsb2M7Ci0gIHdoaWxlICgobG9jID0gZGlyLmZpbmQoIi4iKSkgIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyLnN1YnN0cigwLCBsb2MpOwotICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKLSAgICBkaXIgPSBkaXIuc3Vic3RyKGxvYyArIDEpOwotICB9Ci0gIGlmIChkaXIuc2l6ZSgpID4gMCkgewotICAgIHN1YmRpciA9IHN1YmRpciArICIvIiArIGRpcjsKLSAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7Ci0gIH0KLQotICBwYWNrYWdlX2Rpcl8gPSBzdWJkaXI7Ci19Ci0KLS8qKgotICogUGFja2FnZXMgdGhlIGdlbmVyYXRlZCBmaWxlCi0gKgotICogQHJldHVybiBTdHJpbmcgb2YgdGhlIHBhY2thZ2UsIGkuZS4gInBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnRkZW1vOyIKLSAqLwotc3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6amF2YV9wYWNrYWdlKCkgewotICBpZiAoIXBhY2thZ2VfbmFtZV8uZW1wdHkoKSkgewotICAgIHJldHVybiBzdHJpbmcoInBhY2thZ2UgIikgKyBwYWNrYWdlX25hbWVfICsgIjtcblxuIjsKLSAgfQotICByZXR1cm4gIiI7Ci19Ci0KLS8qKgotICogUHJpbnRzIHN0YW5kYXJkIGphdmEgaW1wb3J0cwotICoKLSAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIGZvciBKYXZhIHR5cGVzIHRoYXQgYXJlIHVzZWQgaW4gaGVyZQotICovCi1zdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpqYXZhX3R5cGVfaW1wb3J0cygpIHsKLSAgcmV0dXJuIHN0cmluZygpICsgImltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlO1xuIiArICJpbXBvcnQgamF2YS51dGlsLlZlY3RvcjtcbiIKLSAgICAgICAgICsgImltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247XG5cbiI7Ci19Ci0KLS8qKgotICogUHJpbnRzIHN0YW5kYXJkIGphdmEgaW1wb3J0cwotICoKLSAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgdGhyaWZ0Ci0gKi8KLXN0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OmphdmFfdGhyaWZ0X2ltcG9ydHMoKSB7Ci0gIHJldHVybiBzdHJpbmcoKSArICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuKjtcbiIgKyAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS4qO1xuIgotICAgICAgICAgKyAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC4qO1xuIiArICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuKjtcblxuIjsKLX0KLQotLyoqCi0gKiBOb3RoaW5nIGluIEphdmEKLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBUaGlzIGlzIG5vdCBkb25lIGluIEphdmEsIHNpbmNlIGl0IGRvZXMKLSAqIG5vdCBzdXBwb3J0IGFyYml0cmFyeSBuYW1lIHJlcGxhY2VtZW50cywgYW5kIGl0J2QgYmUgYSB3YWNreSB3YXN0ZQotICogb2Ygb3ZlcmhlYWQgdG8gbWFrZSB3cmFwcGVyIGNsYXNzZXMuCi0gKgotICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgewotICAodm9pZCl0dHlwZWRlZjsKLX0KLQotLyoqCi0gKiBFbnVtcyBhcmUgYSBjbGFzcyB3aXRoIGEgc2V0IG9mIHN0YXRpYyBjb25zdGFudHMuCi0gKgotICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfZW51bV9uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgKHRlbnVtLT5nZXRfbmFtZSgpKSArICIuamF2YSI7Ci0gIG9mc3RyZWFtIGZfZW51bTsKLSAgZl9lbnVtLm9wZW4oZl9lbnVtX25hbWUuY19zdHIoKSk7Ci0KLSAgLy8gQ29tbWVudCBhbmQgcGFja2FnZSBpdAotICBmX2VudW0gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgamF2YV9wYWNrYWdlKCk7Ci0KLSAgZ2VuZXJhdGVfamF2YV9kb2MoZl9lbnVtLCB0ZW51bSk7Ci0gIGluZGVudChmX2VudW0pIDw8ICJwdWJsaWMgY2xhc3MgIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiIGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEVudW0gIjsKLSAgc2NvcGVfdXAoZl9lbnVtKTsKLSAgZl9lbnVtIDw8IGVuZGw7Ci0KLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOwotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgZ2VuZXJhdGVfamF2YV9kb2MoZl9lbnVtLCAqY19pdGVyKTsKLSAgICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIHN0YXRpYyBmaW5hbCAiIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICIgIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgICA8PCAiID0gbmV3ICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIigiIDw8IHZhbHVlIDw8ICIpOyIgPDwgZW5kbDsKLSAgfQotICBmX2VudW0gPDwgZW5kbDsKLQotICAvLyBGaWVsZCBmb3IgdGhyaWZ0Q29kZQotICBpbmRlbnQoZl9lbnVtKSA8PCAicHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KGZfZW51bSkgPDwgInByaXZhdGUgIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiKGludCB2YWx1ZSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfZW51bSkgPDwgIiAgdGhpcy52YWx1ZSA9IHZhbHVlOyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfZW51bSkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQoZl9lbnVtKSA8PCAiLyoqIiA8PCBlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAiICogR2V0IHRoZSBpbnRlZ2VyIHZhbHVlIG9mIHRoaXMgZW51bSB2YWx1ZSwgYXMgZGVmaW5lZCBpbiB0aGUgVGhyaWZ0IElETC4iCi0gICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gIGluZGVudChmX2VudW0pIDw8ICIgKi8iIDw8IGVuZGw7Ci0gIGluZGVudChmX2VudW0pIDw8ICJwdWJsaWMgaW50IGdldFZhbHVlKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfZW51bSkgPDwgIiAgcmV0dXJuIHZhbHVlOyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfZW51bSkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQoZl9lbnVtKSA8PCAiLyoqIiA8PCBlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAiICogRmluZCBhIHRoZSBlbnVtIHR5cGUgYnkgaXRzIGludGVnZXIgdmFsdWUsIGFzIGRlZmluZWQgaW4gdGhlIFRocmlmdCBJREwuIgotICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAiICogQHJldHVybiBudWxsIGlmIHRoZSB2YWx1ZSBpcyBub3QgZm91bmQuIiA8PCBlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAiICovIiA8PCBlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIHN0YXRpYyAiICsgdGVudW0tPmdldF9uYW1lKCkgKyAiIGZpbmRCeVZhbHVlKGludCB2YWx1ZSkgeyAiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KGZfZW51bSkgPDwgInN3aXRjaCAodmFsdWUpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICBpbmRlbnQoZl9lbnVtKSA8PCAiY2FzZSAiIDw8IHZhbHVlIDw8ICI6IiA8PCBlbmRsOwotICAgIGluZGVudChmX2VudW0pIDw8ICIgIHJldHVybiAiIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudChmX2VudW0pIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKLSAgaW5kZW50KGZfZW51bSkgPDwgIiAgcmV0dXJuIG51bGw7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0KLSAgaW5kZW50KGZfZW51bSkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBpbmRlbnQoZl9lbnVtKSA8PCAifSIgPDwgZW5kbDsKLQotICBzY29wZV9kb3duKGZfZW51bSk7Ci0KLSAgZl9lbnVtLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgY2xhc3MgdGhhdCBob2xkcyBhbGwgdGhlIGNvbnN0YW50cy4KLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKSB7Ci0gIGlmIChjb25zdHMuZW1wdHkoKSkgewotICAgIHJldHVybjsKLSAgfQotCi0gIHN0cmluZyBmX2NvbnN0c19uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgcHJvZ3JhbV9uYW1lXyArICJDb25zdGFudHMuamF2YSI7Ci0gIG9mc3RyZWFtIGZfY29uc3RzOwotICBmX2NvbnN0cy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7Ci0KLSAgLy8gUHJpbnQgaGVhZGVyCi0gIGZfY29uc3RzIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGphdmFfcGFja2FnZSgpIDw8IGphdmFfdHlwZV9pbXBvcnRzKCk7Ci0KLSAgZl9jb25zdHMgPDwgInB1YmxpYyBjbGFzcyAiIDw8IHByb2dyYW1fbmFtZV8gPDwgIkNvbnN0YW50cyB7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgcHJpbnRfY29uc3RfdmFsdWUoZl9jb25zdHMsCi0gICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF92YWx1ZSgpLAotICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9jb25zdHMpIDw8ICJ9IiA8PCBlbmRsOwotICBmX2NvbnN0cy5jbG9zZSgpOwotfQotCi0vKioKLSAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZwotICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKLSAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpwcmludF9jb25zdF92YWx1ZShzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fc3RhdGljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVmdmFsKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGluZGVudChvdXQpOwotICBpZiAoIWRlZnZhbCkgewotICAgIG91dCA8PCAoaW5fc3RhdGljID8gIiIgOiAicHVibGljIHN0YXRpYyBmaW5hbCAiKSA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiOwotICB9Ci0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHN0cmluZyB2MiA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIHR5cGUsIHZhbHVlKTsKLSAgICBvdXQgPDwgbmFtZSA8PCAiID0gIiA8PCB2MiA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIG91dCA8PCBuYW1lIDw8ICIgPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIHR5cGUsIHZhbHVlKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBvdXQgPDwgbmFtZSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOwotICAgIGlmICghaW5fc3RhdGljKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAic3RhdGljIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7Ci0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgewotICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgIH0KLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuIjsKLSAgICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lID0gZ2V0X2NhcF9uYW1lKHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSk7Ci0gICAgICBvdXQgPDwgInNldCIgPDwgY2FwX25hbWUgPDwgIigiIDw8IHZhbCA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGlmICghaW5fc3RhdGljKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgb3V0IDw8IG5hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKLSAgICBpZiAoIWluX3N0YXRpYykgewotICAgICAgaW5kZW50KG91dCkgPDwgInN0YXRpYyB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwga3R5cGUsIHZfaXRlci0+Zmlyc3QpOwotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIucHV0KCIgPDwgYm94X3R5cGUoa3R5cGUsIGtleSkgPDwgIiwgIiA8PCBib3hfdHlwZSh2dHlwZSwgdmFsKSA8PCAiKTsiCi0gICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgIH0KLSAgICBpZiAoIWluX3N0YXRpYykgewotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKLSAgICBvdXQgPDwgbmFtZSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOwotICAgIGlmICghaW5fc3RhdGljKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAic3RhdGljIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0gICAgdF90eXBlKiBldHlwZTsKLSAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfQotICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGV0eXBlLCAqdl9pdGVyKTsKLSAgICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLmFkZEVsZW1lbnQoIiA8PCBib3hfdHlwZShldHlwZSwgdmFsKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIucHV0KCIgPDwgYm94X3R5cGUoZXR5cGUsIHZhbCkgPDwgIiwgIiA8PCBib3hfdHlwZShldHlwZSwgdmFsKQotICAgICAgICAgICAgICAgICAgICA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmICghaW5fc3RhdGljKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgdHlwZSAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotfQotCi1zdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKLSAgKHZvaWQpbmFtZTsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSByZW5kZXI7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJlbmRlciA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZW5kZXIgPDwgKCh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDApID8gInRydWUiIDogImZhbHNlIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZW5kZXIgPDwgIihieXRlKSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJlbmRlciA8PCAiKHNob3J0KSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICJMIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgcmVuZGVyIDw8ICIoZG91YmxlKSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmVuZGVyIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgZmFsc2UpIDw8ICIuIiA8PCB2YWx1ZS0+Z2V0X2lkZW50aWZpZXIoKTsKLSAgfSBlbHNlIHsKLSAgICBzdHJpbmcgdCA9IHRtcCgidG1wIik7Ci0gICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCB0LCB0eXBlLCB2YWx1ZSwgdHJ1ZSk7Ci0gICAgcmVuZGVyIDw8IHQ7Ci0gIH0KLQotICByZXR1cm4gcmVuZGVyLnN0cigpOwotfQotCi1zdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpib3hfdHlwZSh0X3R5cGUqIHR5cGUsIHN0cmluZyB2YWx1ZSkgewotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICBzd2l0Y2ggKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJuZXcgQm9vbGVhbigiICsgdmFsdWUgKyAiKSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJuZXcgQnl0ZSgiICsgdmFsdWUgKyAiKSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gIm5ldyBTaG9ydCgiICsgdmFsdWUgKyAiKSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gIm5ldyBJbnRlZ2VyKCIgKyB2YWx1ZSArICIpIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAibmV3IExvbmcoIiArIHZhbHVlICsgIikiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJuZXcgRG91YmxlKCIgKyB2YWx1ZSArICIpIjsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIHJldHVybiB2YWx1ZTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLiBUaGlzIHdpbGwgYmUgYSBUQmFzZQotICogaW1wbGVtZW50b3IuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaWYgKHRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9qYXZhX3VuaW9uKHRzdHJ1Y3QpOwotICB9IGVsc2UgewotICAgIGdlbmVyYXRlX2phdmFfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKLSAgfQotfQotCi0vKioKLSAqIEV4Y2VwdGlvbnMgYXJlIHN0cnVjdHMsIGJ1dCB0aGV5IGluaGVyaXQgZnJvbSBFeGNlcHRpb24KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKLX0KLQotLyoqCi0gKiBKYXZhIHN0cnVjdCBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfc3RydWN0X25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyAodHN0cnVjdC0+Z2V0X25hbWUoKSkgKyAiLmphdmEiOwotICBvZnN0cmVhbSBmX3N0cnVjdDsKLSAgZl9zdHJ1Y3Qub3BlbihmX3N0cnVjdF9uYW1lLmNfc3RyKCkpOwotCi0gIGZfc3RydWN0IDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGphdmFfcGFja2FnZSgpIDw8IGphdmFfdHlwZV9pbXBvcnRzKCkgPDwgamF2YV90aHJpZnRfaW1wb3J0cygpOwotCi0gIGdlbmVyYXRlX2phdmFfc3RydWN0X2RlZmluaXRpb24oZl9zdHJ1Y3QsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Ci0gIGZfc3RydWN0LmNsb3NlKCk7Ci19Ci0KLS8qKgotICogSmF2YSB1bmlvbiBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV91bmlvbih0X3N0cnVjdCogdHN0cnVjdCkgewotICAvLyBNYWtlIG91dHB1dCBmaWxlCi0gIHN0cmluZyBmX3N0cnVjdF9uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgKHRzdHJ1Y3QtPmdldF9uYW1lKCkpICsgIi5qYXZhIjsKLSAgb2ZzdHJlYW0gZl9zdHJ1Y3Q7Ci0gIGZfc3RydWN0Lm9wZW4oZl9zdHJ1Y3RfbmFtZS5jX3N0cigpKTsKLQotICBmX3N0cnVjdCA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBqYXZhX3BhY2thZ2UoKSA8PCBqYXZhX3R5cGVfaW1wb3J0cygpIDw8IGphdmFfdGhyaWZ0X2ltcG9ydHMoKTsKLQotICBnZW5lcmF0ZV9qYXZhX2RvYyhmX3N0cnVjdCwgdHN0cnVjdCk7Ci0KLSAgYm9vbCBpc19maW5hbCA9ICh0c3RydWN0LT5hbm5vdGF0aW9uc18uZmluZCgiZmluYWwiKSAhPSB0c3RydWN0LT5hbm5vdGF0aW9uc18uZW5kKCkpOwotCi0gIGluZGVudChmX3N0cnVjdCkgPDwgInB1YmxpYyAiIDw8IChpc19maW5hbCA/ICJmaW5hbCAiIDogIiIpIDw8ICJjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgICA8PCAiIGV4dGVuZHMgVFVuaW9uICI7Ci0KLSAgc2NvcGVfdXAoZl9zdHJ1Y3QpOwotCi0gIGdlbmVyYXRlX3N0cnVjdF9kZXNjKGZfc3RydWN0LCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfZmllbGRfZGVzY3MoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOwotCi0gIGZfc3RydWN0IDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfdW5pb25fY29uc3RydWN0b3IoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOwotCi0gIGZfc3RydWN0IDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfdW5pb25fYWJzdHJhY3RfbWV0aG9kcyhmX3N0cnVjdCwgdHN0cnVjdCk7Ci0KLSAgZl9zdHJ1Y3QgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV91bmlvbl9nZXR0ZXJzX2FuZF9zZXR0ZXJzKGZfc3RydWN0LCB0c3RydWN0KTsKLQotICBmX3N0cnVjdCA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX3VuaW9uX2NvbXBhcmlzb25zKGZfc3RydWN0LCB0c3RydWN0KTsKLQotICBmX3N0cnVjdCA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX3VuaW9uX2hhc2hjb2RlKGZfc3RydWN0LCB0c3RydWN0KTsKLQotICBmX3N0cnVjdCA8PCBlbmRsOwotCi0gIHNjb3BlX2Rvd24oZl9zdHJ1Y3QpOwotCi0gIGZfc3RydWN0LmNsb3NlKCk7Ci19Ci0KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9jb25zdHJ1Y3RvcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICBzdXBlcigpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoX0ZpZWxkcyBzZXRGaWVsZCwgT2JqZWN0IHZhbHVlKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICBzdXBlcihzZXRGaWVsZCwgdmFsdWUpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiBvdGhlcikgeyIKLSAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgc3VwZXIob3RoZXIpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiBkZWVwQ29weSgpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBuZXcgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIodGhpcyk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIGdlbmVyYXRlICJjb25zdHJ1Y3RvcnMiIGZvciBlYWNoIGZpZWxkCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHN0YXRpYyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIgotICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICIgdmFsdWUpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiB4ID0gbmV3ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgeC5zZXQiIDw8IGdldF9jYXBfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8ICIodmFsdWUpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4geDsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotfQotCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdW5pb25fZ2V0dGVyc19hbmRfc2V0dGVycyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKLQotICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgZmllbGQpOwotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCkpIDw8ICIgZ2V0IgotICAgICAgICAgICAgICAgIDw8IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIigpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgaWYgKGdldFNldEZpZWxkKCkgPT0gX0ZpZWxkcy4iIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICIpIHsiCi0gICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICAgIHJldHVybiAoIiA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCksIHRydWUpIDw8ICIpZ2V0RmllbGRWYWx1ZSgpOyIKLSAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIH0gZWxzZSB7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oXCJDYW5ub3QgZ2V0IGZpZWxkICciIDw8IGZpZWxkLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgPDwgIicgYmVjYXVzZSB1bmlvbiBpcyBjdXJyZW50bHkgc2V0IHRvIFwiICsgZ2V0RmllbGREZXNjKGdldFNldEZpZWxkKCkpLm5hbWUpOyIKLSAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgICBvdXQgPDwgZW5kbDsKLQotICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgZmllbGQpOwotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCBzZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIigiCi0gICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiIHZhbHVlKSB7IiA8PCBlbmRsOwotICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKGZpZWxkLT5nZXRfdHlwZSgpKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIiAgaWYgKHZhbHVlID09IG51bGwpIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgc2V0RmllbGRfID0gX0ZpZWxkcy4iIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIHZhbHVlXyA9IHZhbHVlOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgfQotfQotCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdW5pb25fYWJzdHJhY3RfbWV0aG9kcyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBnZW5lcmF0ZV9jaGVja190eXBlKG91dCwgdHN0cnVjdCk7Ci0gIG91dCA8PCBlbmRsOwotICBnZW5lcmF0ZV9yZWFkX3ZhbHVlKG91dCwgdHN0cnVjdCk7Ci0gIG91dCA8PCBlbmRsOwotICBnZW5lcmF0ZV93cml0ZV92YWx1ZShvdXQsIHRzdHJ1Y3QpOwotICBvdXQgPDwgZW5kbDsKLSAgZ2VuZXJhdGVfZ2V0X2ZpZWxkX2Rlc2Mob3V0LCB0c3RydWN0KTsKLSAgb3V0IDw8IGVuZGw7Ci0gIGdlbmVyYXRlX2dldF9zdHJ1Y3RfZGVzYyhvdXQsIHRzdHJ1Y3QpOwotICBvdXQgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NoZWNrX3R5cGUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkKLSAgICAgIDw8ICJwcm90ZWN0ZWQgdm9pZCBjaGVja1R5cGUoX0ZpZWxkcyBzZXRGaWVsZCwgT2JqZWN0IHZhbHVlKSB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIHsiCi0gICAgICA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChzZXRGaWVsZCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIGlmICh2YWx1ZSBpbnN0YW5jZW9mICIgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSwgdHJ1ZSkKLSAgICAgICAgICAgICAgICA8PCAiKSB7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgICAgYnJlYWs7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IENsYXNzQ2FzdEV4Y2VwdGlvbihcIldhcyBleHBlY3RpbmcgdmFsdWUgb2YgdHlwZSAiCi0gICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSkgPDwgIiBmb3IgZmllbGQgJyIgPDwgZmllbGQtPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICA8PCAiJywgYnV0IGdvdCBcIiArIHZhbHVlLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsiIDw8IGVuZGw7Ci0gICAgLy8gZG8gdGhlIHJlYWwgY2hlY2sgaGVyZQotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFwiVW5rbm93biBmaWVsZCBpZCBcIiArIHNldEZpZWxkKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yZWFkX3ZhbHVlKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJwcm90ZWN0ZWQgT2JqZWN0IHJlYWRWYWx1ZShUUHJvdG9jb2wgaXByb3QsIFRGaWVsZCBmaWVsZCkgdGhyb3dzIFRFeGNlcHRpb24geyIKLSAgICAgICAgICAgICAgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQob3V0KSA8PCAiX0ZpZWxkcyBzZXRGaWVsZCA9IF9GaWVsZHMuZmluZEJ5VGhyaWZ0SWQoZmllbGQuaWQpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgImlmIChzZXRGaWVsZCAhPSBudWxsKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoc2V0RmllbGQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKCptX2l0ZXIpOwotCi0gICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiOiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGZpZWxkLnR5cGUgPT0gIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiX0ZJRUxEX0RFU0MudHlwZSkgeyIKLSAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiOyIKLSAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgZmllbGQsICIiKTsKLSAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIG51bGw7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oXCJzZXRGaWVsZCB3YXNuJ3QgbnVsbCwgYnV0IGRpZG4ndCBtYXRjaCBhbnkgIgotICAgICAgICAgICAgICAgICAib2YgdGhlIGNhc2Ugc3RhdGVtZW50cyFcIik7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInJldHVybiBudWxsOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV93cml0ZV92YWx1ZShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAicHJvdGVjdGVkIHZvaWQgd3JpdGVWYWx1ZShUUHJvdG9jb2wgb3Byb3QpIHRocm93cyBURXhjZXB0aW9uIHsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoc2V0RmllbGRfKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKLQotICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIjoiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPSAoIgotICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSwgZmFsc2UpIDw8ICIpdmFsdWVfOyIgPDwgZW5kbDsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCBmaWVsZCwgIiIpOwotICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oXCJDYW5ub3Qgd3JpdGUgdW5pb24gd2l0aCB1bmtub3duIGZpZWxkIFwiICsgIgotICAgICAgICAgICAgICAgICAic2V0RmllbGRfKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2dldF9maWVsZF9kZXNjKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJwcm90ZWN0ZWQgVEZpZWxkIGdldEZpZWxkRGVzYyhfRmllbGRzIHNldEZpZWxkKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKHNldEZpZWxkKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7Ci0gICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiOiIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiX0ZJRUxEX0RFU0M7IiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFwiVW5rbm93biBmaWVsZCBpZCBcIiArIHNldEZpZWxkKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nZXRfc3RydWN0X2Rlc2Mob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgKHZvaWQpdHN0cnVjdDsKLSAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCBUU3RydWN0IGdldFN0cnVjdERlc2MoKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gU1RSVUNUX0RFU0M7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3VuaW9uX2NvbXBhcmlzb25zKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIC8vIGVxdWFsaXR5Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICBpZiAob3RoZXIgaW5zdGFuY2VvZiAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgICByZXR1cm4gZXF1YWxzKCgiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIilvdGhlcik7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB9IGVsc2UgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgICByZXR1cm4gZmFsc2U7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICBvdXQgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAicHVibGljIGJvb2xlYW4gZXF1YWxzKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIG90aGVyKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gb3RoZXIgIT0gbnVsbCAmJiBnZXRTZXRGaWVsZCgpID09IG90aGVyLmdldFNldEZpZWxkKCkgJiYgIgotICAgICAgICAgICAgICAgICAiZ2V0RmllbGRWYWx1ZSgpLmVxdWFscyhvdGhlci5nZXRGaWVsZFZhbHVlKCkpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIG91dCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgaW50IGNvbXBhcmVUbygiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiIG90aGVyKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICBpbnQgbGFzdENvbXBhcmlzb24gPSBUQmFzZUhlbHBlci5jb21wYXJlVG8oZ2V0U2V0RmllbGQoKSwgb3RoZXIuZ2V0U2V0RmllbGQoKSk7IgotICAgICAgICAgICAgICA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICBpZiAobGFzdENvbXBhcmlzb24gPT0gMCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgICByZXR1cm4gVEJhc2VIZWxwZXIuY29tcGFyZVRvKGdldEZpZWxkVmFsdWUoKSwgb3RoZXIuZ2V0RmllbGRWYWx1ZSgpKTsiCi0gICAgICAgICAgICAgIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICBvdXQgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3VuaW9uX2hhc2hjb2RlKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gICh2b2lkKXRzdHJ1Y3Q7Ci0gIGluZGVudChvdXQpIDw8ICIvKioiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpCi0gICAgICA8PCAiICogSWYgeW91J2QgbGlrZSB0aGlzIHRvIHBlcmZvcm0gbW9yZSByZXNwZWN0YWJseSwgdXNlIHRoZSBoYXNoY29kZSBnZW5lcmF0b3Igb3B0aW9uLiIKLSAgICAgIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgKi8iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgaW50IGhhc2hDb2RlKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIDA7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBKYXZhIHN0cnVjdCBkZWZpbml0aW9uLiBUaGlzIGhhcyB2YXJpb3VzIHBhcmFtZXRlcnMsIGFzIGl0IGNvdWxkIGJlCi0gKiBnZW5lcmF0ZWQgc3RhbmRhbG9uZSBvciBpbnNpZGUgYW5vdGhlciBjbGFzcyBhcyBhIGhlbHBlci4gSWYgaXQKLSAqIGlzIGEgaGVscGVyIHRoYW4gaXQgaXMgYSBzdGF0aWMgY2xhc3MuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgICAgICBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqIEBwYXJhbSBpc19leGNlcHRpb24gSXMgdGhpcyBhbiBleGNlcHRpb24/Ci0gKiBAcGFyYW0gaW5fY2xhc3MgICAgIElmIGluc2lkZSBhIGNsYXNzLCBuZWVkcyB0byBiZSBzdGF0aWMgY2xhc3MKLSAqIEBwYXJhbSBpc19yZXN1bHQgICAgSWYgdGhpcyBpcyBhIHJlc3VsdCBpdCBuZWVkcyBhIGRpZmZlcmVudCB3cml0ZXIKLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X2RlZmluaXRpb24ob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQpIHsKLSAgZ2VuZXJhdGVfamF2YV9kb2Mob3V0LCB0c3RydWN0KTsKLQotICBib29sIGlzX2ZpbmFsID0gKHRzdHJ1Y3QtPmFubm90YXRpb25zXy5maW5kKCJmaW5hbCIpICE9IHRzdHJ1Y3QtPmFubm90YXRpb25zXy5lbmQoKSk7Ci0KLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IChpc19maW5hbCA/ICJmaW5hbCAiIDogIiIpIDw8IChpbl9jbGFzcyA/ICJzdGF0aWMgIiA6ICIiKSA8PCAiY2xhc3MgIgotICAgICAgICAgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgIjsKLQotICBpZiAoaXNfZXhjZXB0aW9uKSB7Ci0gICAgb3V0IDw8ICJleHRlbmRzIEV4Y2VwdGlvbiAiOwotICB9Ci0gIG91dCA8PCAiaW1wbGVtZW50cyBUQmFzZSAiOwotCi0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgZ2VuZXJhdGVfc3RydWN0X2Rlc2Mob3V0LCB0c3RydWN0KTsKLQotICAvLyBNZW1iZXJzIGFyZSBwdWJsaWMgZm9yIC1qYXZhLCBwcml2YXRlIGZvciAtamF2YWJlYW4KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBvdXQgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9maWVsZF9kZXNjcyhvdXQsIHRzdHJ1Y3QpOwotCi0gIG91dCA8PCBlbmRsOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSAiOwotICAgIG91dCA8PCBkZWNsYXJlX2ZpZWxkKCptX2l0ZXIsIGZhbHNlKSA8PCBlbmRsOwotICB9Ci0KLSAgLy8gaXNzZXQgZGF0YQotICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7Ci0gICAgb3V0IDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAiLy8gaXNzZXQgaWQgYXNzaWdubWVudHMiIDw8IGVuZGw7Ci0KLSAgICBpbnQgaSA9IDA7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgc3RhdGljIGZpbmFsIGludCAiIDw8IGlzc2V0X2ZpZWxkX2lkKCptX2l0ZXIpIDw8ICIgPSAiIDw8IGkgPDwgIjsiCi0gICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICAgIGkrKzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoaSA+IDApIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJwcml2YXRlIGJvb2xlYW5bXSBfX2lzc2V0X3ZlY3RvciA9IG5ldyBib29sZWFuWyIgPDwgaSA8PCAiXTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgb3V0IDw8IGVuZGw7Ci0gIH0KLQotICBib29sIGFsbF9vcHRpb25hbF9tZW1iZXJzID0gdHJ1ZTsKLQotICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7Ci0gICAgICBwcmludF9jb25zdF92YWx1ZShvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAidGhpcy4iICsgKCptX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7Ci0gICAgfQotICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7Ci0gICAgICBhbGxfb3B0aW9uYWxfbWVtYmVycyA9IGZhbHNlOwotICAgIH0KLSAgfQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGlmICghbWVtYmVycy5lbXB0eSgpICYmICFhbGxfb3B0aW9uYWxfbWVtYmVycykgewotICAgIC8vIEZ1bGwgY29uc3RydWN0b3IgZm9yIGFsbCBmaWVsZHMKLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9PUFRJT05BTCkgewotICAgICAgICBpZiAoIWZpcnN0KSB7Ci0gICAgICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICIgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIG91dCA8PCAiKSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJ0aGlzKCk7IiA8PCBlbmRsOwotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIKLSAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgICAgZ2VuZXJhdGVfaXNzZXRfc2V0KG91dCwgKCptX2l0ZXIpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0KLSAgLy8gY29weSBjb25zdHJ1Y3RvcgotICBpbmRlbnQob3V0KSA8PCAiLyoqIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICogUGVyZm9ybXMgYSBkZWVwIGNvcHkgb24gPGk+b3RoZXI8L2k+LiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAqLyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiBvdGhlcikgeyIKLSAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaWYgKGhhc19iaXRfdmVjdG9yKHRzdHJ1Y3QpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIlN5c3RlbS5hcnJheWNvcHkob3RoZXIuX19pc3NldF92ZWN0b3IsIDAsIF9faXNzZXRfdmVjdG9yLCAwLCAiCi0gICAgICAgICAgICAgICAgICAgIm90aGVyLl9faXNzZXRfdmVjdG9yLmxlbmd0aCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKCptX2l0ZXIpOwotICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKLSAgICB0X3R5cGUqIHR5cGUgPSBmaWVsZC0+Z2V0X3R5cGUoKTsKLSAgICBib29sIGNhbl9iZV9udWxsID0gdHlwZV9jYW5fYmVfbnVsbCh0eXBlKTsKLQotICAgIGlmIChjYW5fYmVfbnVsbCkgewotICAgICAgaW5kZW50KG91dCkgPDwgImlmIChvdGhlci4iIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotCi0gICAgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKG91dCwgIm90aGVyIiwgZmllbGRfbmFtZSwgIl9fdGhpc19fIiArIGZpZWxkX25hbWUsIHR5cGUpOwotICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBfX3RoaXNfXyIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSAiOwotICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIob3V0LCAib3RoZXIuIiArIGZpZWxkX25hbWUsIGZpZWxkX25hbWUsIHR5cGUpOwotICAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGlmIChjYW5fYmVfbnVsbCkgewotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gY2xvbmUgbWV0aG9kLCBzbyB0aGF0IHlvdSBjYW4gZGVlcCBjb3B5IGFuIG9iamVjdCB3aGVuIHlvdSBkb24ndCBrbm93IGl0cyBjbGFzcy4KLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiBkZWVwQ29weSgpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBuZXcgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIodGhpcyk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2phdmFfc3RydWN0X2NsZWFyKG91dCwgdHN0cnVjdCk7Ci0KLSAgZ2VuZXJhdGVfamF2YV9iZWFuX2JvaWxlcnBsYXRlKG91dCwgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKG91dCwgdHN0cnVjdCk7Ci0KLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZXF1YWxpdHkob3V0LCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfY29tcGFyZV90byhvdXQsIHRzdHJ1Y3QpOwotCi0gIGdlbmVyYXRlX2phdmFfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOwotICBpZiAoaXNfcmVzdWx0KSB7Ci0gICAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOwotICB9IGVsc2UgewotICAgIGdlbmVyYXRlX2phdmFfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOwotICB9Ci0gIGdlbmVyYXRlX2phdmFfc3RydWN0X3Rvc3RyaW5nKG91dCwgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX2phdmFfdmFsaWRhdG9yKG91dCwgdHN0cnVjdCk7Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLSAgb3V0IDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGVxdWFscyBtZXRob2RzIGFuZCBhIGhhc2hDb2RlIG1ldGhvZCBmb3IgYSBzdHJ1Y3R1cmUuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9lcXVhbGl0eShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgdGhhdCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoYXQgPT0gbnVsbCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbAotICAgICAgPDwgaW5kZW50KCkgPDwgImlmICh0aGF0IGluc3RhbmNlb2YgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICA8PCAiICByZXR1cm4gdGhpcy5lcXVhbHMoKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKXRoYXQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgPDwgInJldHVybiBmYWxzZTsiIDw8IGVuZGw7Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLSAgb3V0IDw8IGVuZGw7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgYm9vbGVhbiBlcXVhbHMoIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgdGhhdCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoYXQgPT0gbnVsbCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgb3V0IDw8IGVuZGw7Ci0KLSAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgLy8gTW9zdCBleGlzdGluZyBUaHJpZnQgY29kZSBkb2VzIG5vdCB1c2UgaXNzZXQgb3Igb3B0aW9uYWwvcmVxdWlyZWQsCi0gICAgLy8gc28gd2UgdHJlYXQgImRlZmF1bHQiIGZpZWxkcyBhcyByZXF1aXJlZC4KLSAgICBib29sIGlzX29wdGlvbmFsID0gKCptX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKLSAgICBib29sIGNhbl9iZV9udWxsID0gdHlwZV9jYW5fYmVfbnVsbCh0KTsKLSAgICBzdHJpbmcgbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKLQotICAgIHN0cmluZyB0aGlzX3ByZXNlbnQgPSAidHJ1ZSI7Ci0gICAgc3RyaW5nIHRoYXRfcHJlc2VudCA9ICJ0cnVlIjsKLSAgICBzdHJpbmcgdW5lcXVhbDsKLQotICAgIGlmIChpc19vcHRpb25hbCB8fCBjYW5fYmVfbnVsbCkgewotICAgICAgdGhpc19wcmVzZW50ICs9ICIgJiYgdGhpcy4iICsgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKm1faXRlcik7Ci0gICAgICB0aGF0X3ByZXNlbnQgKz0gIiAmJiB0aGF0LiIgKyBnZW5lcmF0ZV9pc3NldF9jaGVjaygqbV9pdGVyKTsKLSAgICB9Ci0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImJvb2xlYW4gdGhpc19wcmVzZW50XyIgPDwgbmFtZSA8PCAiID0gIiA8PCB0aGlzX3ByZXNlbnQgPDwgIjsiIDw8IGVuZGwKLSAgICAgICAgPDwgaW5kZW50KCkgPDwgImJvb2xlYW4gdGhhdF9wcmVzZW50XyIgPDwgbmFtZSA8PCAiID0gIiA8PCB0aGF0X3ByZXNlbnQgPDwgIjsiIDw8IGVuZGwKLSAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmICgiCi0gICAgICAgIDw8ICJ0aGlzX3ByZXNlbnRfIiA8PCBuYW1lIDw8ICIgfHwgdGhhdF9wcmVzZW50XyIgPDwgbmFtZSA8PCAiKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCEoIgotICAgICAgICA8PCAidGhpc19wcmVzZW50XyIgPDwgbmFtZSA8PCAiICYmIHRoYXRfcHJlc2VudF8iIDw8IG5hbWUgPDwgIikpIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgIDw8ICIgIHJldHVybiBmYWxzZTsiIDw8IGVuZGw7Ci0KLSAgICBpZiAodC0+aXNfYmFzZV90eXBlKCkgJiYgKCh0X2Jhc2VfdHlwZSopdCktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICB1bmVxdWFsID0gIlRCYXNlSGVscGVyLmNvbXBhcmVUbyh0aGlzLiIgKyBuYW1lICsgIiwgdGhhdC4iICsgbmFtZSArICIpICE9IDAiOwotICAgIH0gZWxzZSBpZiAoY2FuX2JlX251bGwpIHsKLSAgICAgIHVuZXF1YWwgPSAiIXRoaXMuIiArIG5hbWUgKyAiLmVxdWFscyh0aGF0LiIgKyBuYW1lICsgIikiOwotICAgIH0gZWxzZSB7Ci0gICAgICB1bmVxdWFsID0gInRoaXMuIiArIG5hbWUgKyAiICE9IHRoYXQuIiArIG5hbWU7Ci0gICAgfQotCi0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIiA8PCB1bmVxdWFsIDw8ICIpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBmYWxzZTsiIDw8IGVuZGw7Ci0KLSAgICBzY29wZV9kb3duKG91dCk7Ci0gIH0KLSAgb3V0IDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLSAgb3V0IDw8IGVuZGw7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgaW50IGhhc2hDb2RlKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJyZXR1cm4gMDsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9jb21wYXJlX3RvKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgaW50IGNvbXBhcmVUbyhPYmplY3Qgb3RoZXJPYmplY3QpIHsiIDw8IGVuZGw7Ci0gIC8vICBpbmRlbnQob3V0KSA8PCAicHVibGljIGludCBjb21wYXJlVG8oIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiBvdGhlcikgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgImlmICghZ2V0Q2xhc3MoKS5lcXVhbHMob3RoZXJPYmplY3QuZ2V0Q2xhc3MoKSkpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKS5jb21wYXJlVG8ob3RoZXJPYmplY3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOyIKLSAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIG91dCA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiBvdGhlciA9ICgiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKW90aGVyT2JqZWN0OyI7Ci0KLSAgaW5kZW50KG91dCkgPDwgImludCBsYXN0Q29tcGFyaXNvbiA9IDA7IiA8PCBlbmRsOwotICBvdXQgPDwgZW5kbDsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAqbV9pdGVyOwotICAgIGluZGVudChvdXQpIDw8ICJsYXN0Q29tcGFyaXNvbiA9IFRCYXNlSGVscGVyLmNvbXBhcmVUbygiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkKQotICAgICAgICAgICAgICAgIDw8ICIsIG90aGVyLiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIGxhc3RDb21wYXJpc29uOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZCkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX3N0cnVjdCgpIHx8IGZpZWxkLT5nZXRfdHlwZSgpLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICBsYXN0Q29tcGFyaXNvbiA9IHRoaXMuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiLmNvbXBhcmVUbyhvdGhlci4iCi0gICAgICAgICAgICAgICAgICA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIGxhc3RDb21wYXJpc29uID0gVEJhc2VIZWxwZXIuY29tcGFyZVRvKHRoaXMuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgICAgPDwgIiwgb3RoZXIuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaW5kZW50KG91dCkgPDwgIiAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgICByZXR1cm4gbGFzdENvbXBhcmlzb247IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIDA7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gcmVhZCBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0LgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVhZGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIHZvaWQgcmVhZChUUHJvdG9jb2wgaXByb3QpIHRocm93cyBURXhjZXB0aW9uIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICAvLyBEZWNsYXJlIHN0YWNrIHRtcCB2YXJpYWJsZXMgYW5kIHJlYWQgc3RydWN0IGhlYWRlcgotICBvdXQgPDwgaW5kZW50KCkgPDwgIlRGaWVsZCBmaWVsZDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpOyIgPDwgZW5kbDsKLQotICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKLSAgaW5kZW50KG91dCkgPDwgIndoaWxlICh0cnVlKSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLQotICAvLyBSZWFkIGJlZ2lubmluZyBmaWVsZCBtYXJrZXIKLSAgaW5kZW50KG91dCkgPDwgImZpZWxkID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKTsiIDw8IGVuZGw7Ci0KLSAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyIGFuZCBicmVhawotICBpbmRlbnQob3V0KSA8PCAiaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuU1RPUCkgeyAiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAiYnJlYWs7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICAvLyBTd2l0Y2ggc3RhdGVtZW50IG9uIHRoZSBmaWVsZCB3ZSBhcmUgcmVhZGluZwotICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZC5pZCkgeyIgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLQotICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI6IC8vICIKLSAgICAgICAgICAgICAgICA8PCBjb25zdGFudF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGZpZWxkLnR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy4iKTsKLSAgICBnZW5lcmF0ZV9pc3NldF9zZXQob3V0LCAqZl9pdGVyKTsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsgIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7IgotICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgLy8gUmVhZCBmaWVsZCBlbmQgbWFya2VyCi0gIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICJpcHJvdC5yZWFkU3RydWN0RW5kKCk7IiA8PCBlbmRsOwotCi0gIC8vIHBlcmZvcm1zIHZhcmlvdXMgY2hlY2tzIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQotICBpbmRlbnQob3V0KSA8PCAidmFsaWRhdGUoKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8vIGdlbmVyYXRlcyBqYXZhIG1ldGhvZCB0byBwZXJmb3JtIHZhcmlvdXMgY2hlY2tzCi0vLyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3ZhbGlkYXRvcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgdmFsaWRhdGUoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICIvLyBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIiA8PCBlbmRsOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgPDwgIiAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihcIlJlcXVpcmVkIGZpZWxkICciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQotICAgICAgICAgIDw8ICInIGlzIHVuc2V0ISBTdHJ1Y3Q6XCIgKyB0b1N0cmluZygpKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHdyaXRlIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QKLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3dyaXRlcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyB2b2lkIHdyaXRlKFRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24geyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIC8vIHBlcmZvcm1zIHZhcmlvdXMgY2hlY2tzIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQotICBpbmRlbnQob3V0KSA8PCAidmFsaWRhdGUoKTsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihTVFJVQ1RfREVTQyk7IiA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgYm9vbCBudWxsX2FsbG93ZWQgPSB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKG51bGxfYWxsb3dlZCkgewotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAodGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9IG51bGwpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0gICAgYm9vbCBvcHRpb25hbCA9ICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7Ci0gICAgaWYgKG9wdGlvbmFsKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKCpmX2l0ZXIpKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotCi0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRCZWdpbigiIDw8IGNvbnN0YW50X25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKQotICAgICAgICAgICAgICAgIDw8ICJfRklFTERfREVTQyk7IiA8PCBlbmRsOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy4iKTsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOwotCi0gICAgaWYgKG9wdGlvbmFsKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIGlmIChudWxsX2FsbG93ZWQpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLSAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsiCi0gICAgICA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHdyaXRlIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QsCi0gKiB3aGljaCBpcyBhIGZ1bmN0aW9uIHJlc3VsdC4gVGhlc2UgZmllbGRzIGFyZSBvbmx5IHdyaXR0ZW4KLSAqIGlmIHRoZXkgYXJlIHNldCBpbiB0aGUgSXNzZXQgYXJyYXksIGFuZCBvbmx5IG9uZSBvZiB0aGVtCi0gKiBjYW4gYmUgc2V0IGF0IGEgdGltZS4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3Jlc3VsdF93cml0ZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgdm9pZCB3cml0ZShUUHJvdG9jb2wgb3Byb3QpIHRocm93cyBURXhjZXB0aW9uIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihTVFJVQ1RfREVTQyk7IiA8PCBlbmRsOwotCi0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiAiOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwgIiBlbHNlIGlmICI7Ci0gICAgfQotCi0gICAgb3V0IDw8ICIodGhpcy4iIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCpmX2l0ZXIpIDw8ICIpIHsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkQmVnaW4oIiA8PCBjb25zdGFudF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkKLSAgICAgICAgICAgICAgICA8PCAiX0ZJRUxEX0RFU0MpOyIgPDwgZW5kbDsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCi0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMuIik7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iOwotICB9Ci0gIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCi0gIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgPDwgIm9wcm90LndyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmVmbGVjdGlvbl9nZXR0ZXJzKG9zdHJpbmdzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGRfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNhcF9uYW1lKSB7Ci0gIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZF9uYW1lKSA8PCAiOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICF0eXBlLT5pc19zdHJpbmcoKSkgewotICAgIHRfYmFzZV90eXBlKiBiYXNlX3R5cGUgPSAodF9iYXNlX3R5cGUqKXR5cGU7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlLCBmYWxzZSkgPDwgIigiCi0gICAgICAgICAgICAgICAgPDwgKGJhc2VfdHlwZS0+aXNfYm9vbCgpID8gImlzIiA6ICJnZXQiKSA8PCBjYXBfbmFtZSA8PCAiKCkpOyIgPDwgZW5kbCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gZ2V0IiA8PCBjYXBfbmFtZSA8PCAiKCk7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotfQotCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmVmbGVjdGlvbl9zZXR0ZXJzKG9zdHJpbmdzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGRfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNhcF9uYW1lKSB7Ci0gIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZF9uYW1lKSA8PCAiOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJpZiAodmFsdWUgPT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgdW5zZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKSA8PCAiKCk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHNldCIgPDwgY2FwX25hbWUgPDwgIigoIiA8PCB0eXBlX25hbWUodHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIpdmFsdWUpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJicmVhazsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotfQotCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ2VuZXJpY19maWVsZF9nZXR0ZXJzX3NldHRlcnMoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gICh2b2lkKW91dDsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIGdldHRlcl9zdHJlYW07Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBzZXR0ZXJfc3RyZWFtOwotCi0gIC8vIGJ1aWxkIHVwIHRoZSBib2RpZXMgb2YgYm90aCB0aGUgZ2V0dGVyIGFuZCBzZXR0ZXIgYXQgb25jZQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOwotICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoZmllbGQtPmdldF90eXBlKCkpOwotICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKLSAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKTsKLQotICAgIGluZGVudF91cCgpOwotICAgIGdlbmVyYXRlX3JlZmxlY3Rpb25fc2V0dGVycyhzZXR0ZXJfc3RyZWFtLCB0eXBlLCBmaWVsZF9uYW1lLCBjYXBfbmFtZSk7Ci0gICAgZ2VuZXJhdGVfcmVmbGVjdGlvbl9nZXR0ZXJzKGdldHRlcl9zdHJlYW0sIHR5cGUsIGZpZWxkX25hbWUsIGNhcF9uYW1lKTsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2V0IG9mIEphdmEgQmVhbiBib2lsZXJwbGF0ZSBmdW5jdGlvbnMgKHNldHRlcnMsIGdldHRlcnMsIGV0Yy4pCi0gKiBmb3IgdGhlIGdpdmVuIHN0cnVjdC4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfYmVhbl9ib2lsZXJwbGF0ZShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOwotICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoZmllbGQtPmdldF90eXBlKCkpOwotICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKLSAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKTsKLQotICAgIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgLy8gTWV0aG9kIHRvIHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgY29sbGVjdGlvbgotICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBpbnQgZ2V0IiA8PCBjYXBfbmFtZTsKLSAgICAgIG91dCA8PCBnZXRfY2FwX25hbWUoInNpemUoKSB7IikgPDwgZW5kbDsKLQotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICh0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID09IG51bGwpID8gMCA6ICIKLSAgICAgICAgICAgICAgICAgIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiLnNpemUoKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpZiAodHlwZS0+aXNfc2V0KCkgfHwgdHlwZS0+aXNfbGlzdCgpKSB7Ci0KLSAgICAgIHRfdHlwZSogZWxlbWVudF90eXBlOwotICAgICAgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICAgIGVsZW1lbnRfdHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBlbGVtZW50X3R5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICAgIH0KLQotICAgICAgLy8gSXRlcmF0b3IgZ2V0dGVyIGZvciBzZXRzIGFuZCBsaXN0cwotICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBFbnVtZXJhdGlvbiBnZXQiIDw8IGNhcF9uYW1lOwotICAgICAgb3V0IDw8IGdldF9jYXBfbmFtZSgiRW51bWVyYXRpb24oKSB7IikgPDwgZW5kbDsKLQotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICh0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID09IG51bGwpID8gbnVsbCA6ICIKLSAgICAgICAgICAgICAgICAgIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiLmVsZW1lbnRzKCk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICAgIC8vIEFkZCB0byBzZXQgb3IgbGlzdCwgY3JlYXRlIGlmIHRoZSBzZXQvbGlzdCBpcyBudWxsCi0gICAgICBpbmRlbnQob3V0KTsKLSAgICAgIG91dCA8PCAicHVibGljIHZvaWQgYWRkIiA8PCBnZXRfY2FwX25hbWUoInRvIik7Ci0gICAgICBvdXQgPDwgY2FwX25hbWUgPDwgIigiIDw8IHR5cGVfbmFtZShlbGVtZW50X3R5cGUpIDw8ICIgZWxlbSkgeyIgPDwgZW5kbDsKLQotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiCi0gICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiLnB1dCgiIDw8IGJveF90eXBlKGVsZW1lbnRfdHlwZSwgImVsZW0iKSA8PCAiLCAiCi0gICAgICAgICAgICAgICAgICAgIDw8IGJveF90eXBlKGVsZW1lbnRfdHlwZSwgImVsZW0iKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIi5hZGRFbGVtZW50KCIgPDwgYm94X3R5cGUoZWxlbWVudF90eXBlLCAiZWxlbSIpCi0gICAgICAgICAgICAgICAgICAgIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgICAgLy8gUHV0IHRvIG1hcAotICAgICAgdF90eXBlKiBrZXlfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICAgIHRfdHlwZSogdmFsX3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0KLSAgICAgIGluZGVudChvdXQpOwotICAgICAgb3V0IDw8ICJwdWJsaWMgdm9pZCBwdXRUbyIgPDwgY2FwX25hbWUgPDwgIigiIDw8IHR5cGVfbmFtZShrZXlfdHlwZSwgdHJ1ZSkgPDwgIiBrZXksICIKLSAgICAgICAgICA8PCB0eXBlX25hbWUodmFsX3R5cGUsIHRydWUpIDw8ICIgdmFsKSB7IiA8PCBlbmRsOwotCi0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIKLSAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIi5wdXQoa2V5LCB2YWwpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAgIH0KLQotICAgIC8vIFNpbXBsZSBnZXR0ZXIKLSAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsIGZpZWxkKTsKLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHlwZV9uYW1lKHR5cGUpOwotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MKSB7Ci0gICAgICBvdXQgPDwgIiBpcyI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCAiIGdldCI7Ci0gICAgfQotICAgIG91dCA8PCBjYXBfbmFtZSA8PCAiKCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIC8vIFNpbXBsZSBzZXR0ZXIKLSAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsIGZpZWxkKTsKLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICI7Ci0gICAgb3V0IDw8ICJ2b2lkIjsKLSAgICBvdXQgPDwgIiBzZXQiIDw8IGNhcF9uYW1lIDw8ICIoIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiIDw8IGZpZWxkX25hbWUgPDwgIikgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9ICIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgICBnZW5lcmF0ZV9pc3NldF9zZXQob3V0LCBmaWVsZCk7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICAvLyBVbnNldHRlcgotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCB1bnNldCIgPDwgY2FwX25hbWUgPDwgIigpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gbnVsbDsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X3ZlY3RvclsiIDw8IGlzc2V0X2ZpZWxkX2lkKGZpZWxkKSA8PCAiXSA9IGZhbHNlOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgLy8gaXNTZXQgbWV0aG9kCi0gICAgaW5kZW50KG91dCkgPDwgIi8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgIiA8PCBmaWVsZF9uYW1lCi0gICAgICAgICAgICAgICAgPDwgIiBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8iIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBib29sZWFuIGlzIiA8PCBnZXRfY2FwX25hbWUoInNldCIpIDw8IGNhcF9uYW1lIDw8ICIoKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgIT0gbnVsbDsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gX19pc3NldF92ZWN0b3JbIiA8PCBpc3NldF9maWVsZF9pZChmaWVsZCkgPDwgIl07IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgc2V0IiA8PCBjYXBfbmFtZSA8PCBnZXRfY2FwX25hbWUoImlzU2V0IikgPDwgIihib29sZWFuIHZhbHVlKSB7IgotICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIXZhbHVlKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG51bGw7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X3ZlY3RvclsiIDw8IGlzc2V0X2ZpZWxkX2lkKGZpZWxkKSA8PCAiXSA9IHZhbHVlOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdG9TdHJpbmcoKSBtZXRob2QgZm9yIHRoZSBnaXZlbiBzdHJ1Y3QKLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3Rvc3RyaW5nKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIFN0cmluZyB0b1N0cmluZygpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihcIiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKFwiKTsiCi0gICAgICA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgImJvb2xlYW4gZmlyc3QgPSB0cnVlOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgYm9vbCBjb3VsZF9iZV91bnNldCA9ICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7Ci0gICAgaWYgKGNvdWxkX2JlX3Vuc2V0KSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLQotICAgIHRfZmllbGQqIGZpZWxkID0gKCpmX2l0ZXIpOwotCi0gICAgaWYgKCFmaXJzdCkgewotICAgICAgaW5kZW50KG91dCkgPDwgImlmICghZmlyc3QpIHNiLmFwcGVuZChcIiwgXCIpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgInNiLmFwcGVuZChcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6XCIpOyIgPDwgZW5kbDsKLSAgICBib29sIGNhbl9iZV9udWxsID0gdHlwZV9jYW5fYmVfbnVsbChmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKGNhbl9iZV9udWxsKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHRoaXMuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgc2IuYXBwZW5kKFwibnVsbFwiKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0KLSAgICBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX2Jhc2VfdHlwZSgpICYmICgodF9iYXNlX3R5cGUqKShmaWVsZC0+Z2V0X3R5cGUoKSkpLT5pc19iaW5hcnkoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIlRCYXNlSGVscGVyLnRvU3RyaW5nKHRoaXMuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiLCBzYik7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAic2IuYXBwZW5kKHRoaXMuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGlmIChjYW5fYmVfbnVsbCkgewotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnQob3V0KSA8PCAiZmlyc3QgPSBmYWxzZTsiIDw8IGVuZGw7Ci0KLSAgICBpZiAoY291bGRfYmVfdW5zZXQpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgZmlyc3QgPSBmYWxzZTsKLSAgfQotICBvdXQgPDwgaW5kZW50KCkgPDwgInNiLmFwcGVuZChcIilcIik7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gc2IudG9TdHJpbmcoKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIGEgc3RyaW5nIHdpdGggdGhlIGphdmEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIHRocmlmdCB0eXBlCi0gKiAoZS5nLiBmb3IgdGhlIHR5cGUgc3RydWN0IGl0IHJldHVybnMgIlRUeXBlLlNUUlVDVCIpCi0gKi8KLXN0ZDo6c3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2V0X2phdmFfdHlwZV9zdHJpbmcodF90eXBlKiB0eXBlKSB7Ci0gIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLkxJU1QiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5NQVAiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5TRVQiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLlNUUlVDVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5FTlVNIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICByZXR1cm4gZ2V0X2phdmFfdHlwZV9zdHJpbmcoKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHN3aXRjaCAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCkpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICByZXR1cm4gIlRUeXBlLlZPSUQiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gIlRUeXBlLlNUUklORyI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gIlRUeXBlLkJPT0wiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJUVHlwZS5CWVRFIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICJUVHlwZS5JMTYiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gIlRUeXBlLkkzMiI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiVFR5cGUuSTY0IjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJUVHlwZS5ET1VCTEUiOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiVW5rbm93biB0aHJpZnQgdHlwZSBcIiIgKyB0eXBlLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIgcGFzc2VkIHRvIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2V0X2phdmFfdHlwZV9zdHJpbmchIik7Ci0gICAgICBicmVhazsgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIQotICAgIH0KLSAgfSBlbHNlIHsKLSAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoCi0gICAgICAgICJVbmtub3duIHRocmlmdCB0eXBlIFwiIiArIHR5cGUtPmdldF9uYW1lKCkKLSAgICAgICAgKyAiXCIgcGFzc2VkIHRvIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2V0X2phdmFfdHlwZV9zdHJpbmchIik7IC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiEKLSAgfQotfQotCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlKSB7Ci0gIG91dCA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50X3VwKCk7Ci0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJuZXcgU3RydWN0TWV0YURhdGEoVFR5cGUuU1RSVUNULCAiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiLmNsYXNzIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgTGlzdE1ldGFEYXRhKFRUeXBlLkxJU1QsICI7Ci0gICAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgZWxlbV90eXBlKTsKLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAibmV3IFNldE1ldGFEYXRhKFRUeXBlLlNFVCwgIjsKLSAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCBlbGVtX3R5cGUpOwotICAgIH0gZWxzZSB7IC8vIG1hcAotICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBNYXBNZXRhRGF0YShUVHlwZS5NQVAsICI7Ci0gICAgICB0X3R5cGUqIGtleV90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgICAgdF90eXBlKiB2YWxfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGtleV90eXBlKTsKLSAgICAgIG91dCA8PCAiLCAiOwotICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgdmFsX3R5cGUpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAibmV3IEVudW1NZXRhRGF0YShUVHlwZS5FTlVNLCAiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiLmNsYXNzIjsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQob3V0KSA8PCAibmV3IEZpZWxkVmFsdWVNZXRhRGF0YSgiIDw8IGdldF9qYXZhX3R5cGVfc3RyaW5nKHR5cGUpOwotICAgIGlmICh0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICIsIFwiIiA8PCAoKHRfdHlwZWRlZiopdHlwZSktPmdldF9zeW1ib2xpYygpIDw8ICJcIiI7Ci0gICAgfQotICB9Ci0gIG91dCA8PCAiKSI7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudF9kb3duKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuIEluIEMrKywgdGhpcyBjb21wcmlzZXMgYW4gZW50aXJlbHkgc2VwYXJhdGUKLSAqIGhlYWRlciBhbmQgc291cmNlIGZpbGUuIFRoZSBoZWFkZXIgZmlsZSBkZWZpbmVzIHRoZSBtZXRob2RzIGFuZCBpbmNsdWRlcwotICogdGhlIGRhdGEgdHlwZXMgZGVmaW5lZCBpbiB0aGUgbWFpbiBoZWFkZXIgZmlsZSwgYW5kIHRoZSBpbXBsZW1lbnRhdGlvbgotICogZmlsZSBjb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGJhc2ljIHByaW50ZXIgYW5kIGRlZmF1bHQgaW50ZXJmYWNlcy4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgc2VydmljZV9uYW1lXyArICIuamF2YSI7Ci0gIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKLQotICBmX3NlcnZpY2VfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGphdmFfcGFja2FnZSgpIDw8IGphdmFfdHlwZV9pbXBvcnRzKCkgPDwgamF2YV90aHJpZnRfaW1wb3J0cygpOwotCi0gIGZfc2VydmljZV8gPDwgInB1YmxpYyBjbGFzcyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIiB7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIC8vIEdlbmVyYXRlIHRoZSB0aHJlZSBtYWluIHBhcnRzIG9mIHRoZSBzZXJ2aWNlCi0gIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PCAifSIgPDwgZW5kbDsKLSAgZl9zZXJ2aWNlXy5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcmltaXRpdmVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgaW50ZXJmYWNlIElmYWNlIGV4dGVuZHMgIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZmFjZSB7IH0iCi0gICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsOwotCi0gIHN0cmluZyBmX2ludGVyZmFjZV9uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgc2VydmljZV9uYW1lXyArICJJZmFjZS5qYXZhIjsKLSAgc3RkOjpvZnN0cmVhbSBmX2lmYWNlOwotICBmX2lmYWNlLm9wZW4oZl9pbnRlcmZhY2VfbmFtZS5jX3N0cigpKTsKLQotICBzdHJpbmcgZXh0ZW5kc19pZmFjZSA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHNfaWZhY2UgPSAiIGV4dGVuZHMgIiArIHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSkgKyAiSWZhY2UiOwotICB9Ci0KLSAgZl9pZmFjZSA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBqYXZhX3BhY2thZ2UoKSA8PCBqYXZhX3R5cGVfaW1wb3J0cygpIDw8IGphdmFfdGhyaWZ0X2ltcG9ydHMoKTsKLSAgZ2VuZXJhdGVfamF2YV9kb2MoZl9pZmFjZSwgdHNlcnZpY2UpOwotICBmX2lmYWNlIDw8ICJwdWJsaWMgaW50ZXJmYWNlICIgPDwgc2VydmljZV9uYW1lXyA8PCAiSWZhY2UiIDw8IGV4dGVuZHNfaWZhY2UgPDwgIiB7IiA8PCBlbmRsCi0gICAgICAgICAgPDwgZW5kbDsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfamF2YV9kb2MoZl9pZmFjZSwgKmZfaXRlcik7Ci0gICAgZl9pZmFjZSA8PCAiICBwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotICBmX2lmYWNlIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfaWZhY2UgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX2lmYWNlID0gIiBleHRlbmRzICIgKyBleHRlbmRzICsgIi5JZmFjZSI7Ci0gIH0KLQotICBnZW5lcmF0ZV9qYXZhX2RvYyhmX3NlcnZpY2VfLCB0c2VydmljZSk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInB1YmxpYyBpbnRlcmZhY2UgSWZhY2UiIDw8IGV4dGVuZHNfaWZhY2UgPDwgIiB7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9qYXZhX2RvYyhmX3NlcnZpY2VfLCAqZl9pdGVyKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgc3RydWN0cyBmb3IgYWxsIHRoZSBzZXJ2aWNlIGFyZ3MgYW5kIHJldHVybiB0eXBlcwotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZQotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGdlbmVyYXRlX2phdmFfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgdHMsIGZhbHNlLCB0cnVlKTsKLSAgICBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX2NsaWVudCA9ICIgZXh0ZW5kcyAiICsgZXh0ZW5kcyArICIuQ2xpZW50IjsKLSAgfQotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIHN0YXRpYyBjbGFzcyBDbGllbnQiIDw8IGV4dGVuZHNfY2xpZW50Ci0gICAgICAgICAgICAgICAgICAgICA8PCAiIGltcGxlbWVudHMgVFNlcnZpY2VDbGllbnQsIElmYWNlIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIENsaWVudChUUHJvdG9jb2wgcHJvdCkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRoaXMocHJvdCwgcHJvdCk7IiA8PCBlbmRsOwotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgQ2xpZW50KFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpcHJvdF8gPSBpcHJvdDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90XyA9IG9wcm90OyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzdXBlcihpcHJvdCwgb3Byb3QpOyIgPDwgZW5kbDsKLSAgfQotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInByb3RlY3RlZCBUUHJvdG9jb2wgaXByb3RfOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgPDwgInByb3RlY3RlZCBUUHJvdG9jb2wgb3Byb3RfOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICA8PCAicHJvdGVjdGVkIGludCBzZXFpZF87IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBUUHJvdG9jb2wgZ2V0SW5wdXRQcm90b2NvbCgpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIHRoaXMuaXByb3RfOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIFRQcm90b2NvbCBnZXRPdXRwdXRQcm90b2NvbCgpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIHRoaXMub3Byb3RfOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgLy8gT3BlbiBmdW5jdGlvbgotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJzZW5kXyIgPDwgZnVubmFtZSA8PCAiKCI7Ci0KLSAgICAvLyBHZXQgdGhlIHN0cnVjdCBvZiBmdW5jdGlvbiBjYWxsIHBhcmFtcwotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotCi0gICAgLy8gRGVjbGFyZSB0aGUgZnVuY3Rpb24gYXJndW1lbnRzCi0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAicmV0dXJuICI7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8ICJyZWN2XyIgPDwgZnVubmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotICAgIH0KLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAgIHRfZnVuY3Rpb24gc2VuZF9mdW5jdGlvbihnX3R5cGVfdm9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJzZW5kXyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF9hcmdsaXN0KCkpOwotCi0gICAgc3RyaW5nIGFyZ3NuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKLQotICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VuZF9mdW5jdGlvbikgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdAotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90Xy53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoXCIiIDw8IGZ1bm5hbWUgPDwgIlwiLCAiCi0gICAgICAgICAgICAgICA8PCAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJUTWVzc2FnZVR5cGUuT05FV0FZIiA6ICJUTWVzc2FnZVR5cGUuQ0FMTCIpCi0gICAgICAgICAgICAgICA8PCAiLCArK3NlcWlkXykpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBhcmdzbmFtZSA8PCAiIGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZQotICAgICAgICAgICAgICAgPDwgIigpOyIgPDwgZW5kbDsKLQotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzLnNldCIgPDwgZ2V0X2NhcF9uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKCIKLSAgICAgICAgICAgICAgICAgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3Mud3JpdGUob3Byb3RfKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgIDw8ICJvcHJvdF8ud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICA8PCAib3Byb3RfLmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7IiA8PCBlbmRsOwotCi0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIHN0cmluZyByZXN1bHRuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOwotCi0gICAgICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOwotICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vYXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKSk7Ci0gICAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbikgPDwgZW5kbDsKLSAgICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJUTWVzc2FnZSBtc2cgPSBpcHJvdF8ucmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgICA8PCAiaWYgKG1zZy50eXBlID09IFRNZXNzYWdlVHlwZS5FWENFUFRJT04pIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICAgPDwgIiAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHggPSBUQXBwbGljYXRpb25FeGNlcHRpb24ucmVhZChpcHJvdF8pOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICBpcHJvdF8ucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgdGhyb3cgeDsiCi0gICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmIChtc2cuc2VxaWQgIT0gc2VxaWRfKSB7IgotICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgIDw8ICIgIHRocm93IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkJBRF9TRVFVRU5DRV9JRCwgXCIiCi0gICAgICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogb3V0IG9mIHNlcXVlbmNlIHJlc3BvbnNlXCIpOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCByZXN1bHRuYW1lIDw8ICIgcmVzdWx0ID0gbmV3ICIKLSAgICAgICAgICAgICAgICAgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXN1bHQucmVhZChpcHJvdF8pOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaXByb3RfLnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOwotCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC4iIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCJzdWNjZXNzIikgPDwgIikgeyIgPDwgZW5kbAotICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiByZXN1bHQuc3VjY2VzczsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOwotICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgdGhyb3cgcmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIC8vIElmIHlvdSBnZXQgaGVyZSBpdCdzIGFuIGV4Y2VwdGlvbiwgdW5sZXNzIGEgdm9pZCBmdW5jdGlvbgotICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICAgICA8PCAidGhyb3cgbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uTUlTU0lOR19SRVNVTFQsIFwiIgotICAgICAgICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIik7IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICAvLyBDbG9zZSBmdW5jdGlvbgotICAgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICAvLyBFeHRlbmRzIHN0dWZmCi0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gIiBleHRlbmRzICIgKyBleHRlbmRzICsgIi5Qcm9jZXNzb3IiOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIHN0YXRpYyBjbGFzcyBQcm9jZXNzb3IiIDw8IGV4dGVuZHNfcHJvY2Vzc29yCi0gICAgICAgICAgICAgICAgICAgICA8PCAiIGltcGxlbWVudHMgVFByb2Nlc3NvciB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBQcm9jZXNzb3IoSWZhY2UgaWZhY2UpIiA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzdXBlcihpZmFjZSk7IiA8PCBlbmRsOwotICB9Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmYWNlXyA9IGlmYWNlOyIgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInByb2Nlc3NNYXBfLnB1dChcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiwgbmV3ICIKLSAgICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCkpOyIgPDwgZW5kbDsKLSAgfQotCi0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXwotICAgICAgICA8PCBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIHN0YXRpYyBpbnRlcmZhY2UgUHJvY2Vzc0Z1bmN0aW9uIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgPDwgIiAgcHVibGljIHZvaWQgcHJvY2VzcyhpbnQgc2VxaWQsIFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSB0aHJvd3MgVEV4Y2VwdGlvbjsiCi0gICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInByaXZhdGUgSWZhY2UgaWZhY2VfOyIgPDwgZW5kbDsKLQotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIGZpbmFsIEhhc2h0YWJsZSBwcm9jZXNzTWFwXyA9IG5ldyBIYXNodGFibGUoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHNlcnZlciBpbXBsZW1lbnRhdGlvbgotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBib29sZWFuIHByb2Nlc3MoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpIHRocm93cyBURXhjZXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiVE1lc3NhZ2UgbXNnID0gaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbDsKLQotICAvLyBUT0RPKG1jc2xlZSk6IHZhbGlkYXRlIG1lc3NhZ2UsIHdhcyB0aGUgc2VxaWQgZXRjLiBsZWdpdD8KLQotICBmX3NlcnZpY2VfCi0gICAgICA8PCBpbmRlbnQoKSA8PCAiUHJvY2Vzc0Z1bmN0aW9uIGZuID0gKFByb2Nlc3NGdW5jdGlvbilwcm9jZXNzTWFwXy5nZXQobXNnLm5hbWUpOyIgPDwgZW5kbAotICAgICAgPDwgaW5kZW50KCkgPDwgImlmIChmbiA9PSBudWxsKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICA8PCAiICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIFRUeXBlLlNUUlVDVCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICA8PCAiICBpcHJvdC5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgPDwgIiAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHggPSBuZXcgIgotICAgICAgICAgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uVU5LTk9XTl9NRVRIT0QsIFwiSW52YWxpZCBtZXRob2QgbmFtZTogIgotICAgICAgICAgIidcIittc2cubmFtZStcIidcIik7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICA8PCAiICBvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UobXNnLm5hbWUsIFRNZXNzYWdlVHlwZS5FWENFUFRJT04sIG1zZy5zZXFpZCkpOyIKLSAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgeC53cml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIKLSAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgb3Byb3QuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgIDw8ICIgIHJldHVybiB0cnVlOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgPDwgImZuLnByb2Nlc3MobXNnLnNlcWlkLCBpcHJvdCwgb3Byb3QpOyIgPDwgZW5kbDsKLQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIHJldHVybjsKLSAgfQotCi0gIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKLSAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKLSAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOwotICB9Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKLSAgfQotCi0gIGdlbmVyYXRlX2phdmFfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UsIHRydWUsIHRydWUpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICAodm9pZCl0c2VydmljZTsKLSAgLy8gT3BlbiBjbGFzcwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByaXZhdGUgY2xhc3MgIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIiBpbXBsZW1lbnRzIFByb2Nlc3NGdW5jdGlvbiB7IgotICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgLy8gT3BlbiBmdW5jdGlvbgotICBpbmRlbnQoZl9zZXJ2aWNlXykKLSAgICAgIDw8ICJwdWJsaWMgdm9pZCBwcm9jZXNzKGludCBzZXFpZCwgVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpIHRocm93cyBURXhjZXB0aW9uIgotICAgICAgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgc3RyaW5nIGFyZ3NuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKLSAgc3RyaW5nIHJlc3VsdG5hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7Ci0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBhcmdzbmFtZSA8PCAiIGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgPDwgInRyeSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncy5yZWFkKGlwcm90KTsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0gY2F0Y2ggKFRQcm90b2NvbEV4Y2VwdGlvbiBlKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaXByb3QucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICA8PCAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHggPSBuZXcgIgotICAgICAgICAgICAgICAgICJUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlBST1RPQ09MX0VSUk9SLCBlLmdldE1lc3NhZ2UoKSk7IgotICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIKLSAgICAgICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBzZXFpZCkpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgIDw8ICJ4LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbAotICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuOyIKLSAgICAgICAgICAgICA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpcHJvdC5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKLQotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotCi0gIC8vIERlY2xhcmUgcmVzdWx0IGZvciBub24gb25ld2F5IGZ1bmN0aW9uCi0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgcmVzdWx0bmFtZSA8PCAiIHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKLSAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJ5IHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAotICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgIGZfc2VydmljZV8gPDwgInJlc3VsdC5zdWNjZXNzID0gIjsKLSAgfQotICBmX3NlcnZpY2VfIDw8ICJpZmFjZV8uIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgfQotICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKLQotICAvLyBTZXQgaXNzZXQgb24gc3VjY2VzcyBmaWVsZAotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpCi0gICAgICAmJiAhdHlwZV9jYW5fYmVfbnVsbCh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LnNldCIgPDwgZ2V0X2NhcF9uYW1lKCJzdWNjZXNzIikgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpCi0gICAgICAgICAgICAgICA8PCAiKHRydWUpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiB4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSI7Ci0gICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgIiBjYXRjaCAoIiA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpIDw8ICIgIgotICAgICAgICAgICAgICAgICA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiCi0gICAgICAgICAgICAgICAgICAgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgIn0iOwotICAgICAgfQotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICIgY2F0Y2ggKFRocm93YWJsZSB0aCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IG5ldyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5JTlRFUk5BTF9FUlJPUiwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiSW50ZXJuYWwgZXJyb3IgcHJvY2Vzc2luZyAiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIpOyIKLSAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIKLSAgICAgICAgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIsIFRNZXNzYWdlVHlwZS5FWENFUFRJT04sIHNlcWlkKSk7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieC53cml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsiCi0gICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gU2hvcnRjdXQgb3V0IGhlcmUgZm9yIG9uZXdheSBmdW5jdGlvbnMKLSAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0KLSAgICAvLyBDbG9zZSBjbGFzcwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAgIHJldHVybjsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgPDwgIlwiLCBUTWVzc2FnZVR5cGUuUkVQTFksIHNlcWlkKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXN1bHQud3JpdGUob3Byb3QpOyIKLSAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICA8PCAib3Byb3QuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsiIDw8IGVuZGw7Ci0KLSAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIC8vIENsb3NlIGNsYXNzCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZAotICogQHBhcmFtIHByZWZpeCBUaGUgdmFyaWFibGUgbmFtZSBvciBjb250YWluZXIgZm9yIHRoaXMgZmllbGQKLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCkgewotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIgPSBpcHJvdC4iOwotCi0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIGlmICghKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgIG91dCA8PCAicmVhZFN0cmluZygpOyI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgInJlYWRCaW5hcnkoKTsiOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgb3V0IDw8ICJyZWFkQm9vbCgpOyI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICBvdXQgPDwgInJlYWRCeXRlKCk7IjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgb3V0IDw8ICJyZWFkSTE2KCk7IjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgb3V0IDw8ICJyZWFkSTMyKCk7IjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgb3V0IDw8ICJyZWFkSTY0KCk7IjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgb3V0IDw8ICJyZWFkRG91YmxlKCk7IjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEphdmEgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIgPSAiCi0gICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSwgZmFsc2UpICsgIi5maW5kQnlWYWx1ZShpcHJvdC5yZWFkSTMyKCkpOyIKLSAgICAgICAgICAgICAgICA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAotICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKLSAgICAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGFuIHVuc2VyaWFsaXplciBmb3IgYSBzdHJ1Y3QsIGludm9rZXMgcmVhZCgpCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgIDw8IHByZWZpeCA8PCAiLnJlYWQoaXByb3QpOyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBjb250YWluZXIgYnkgcmVhZGluZyBpdHMgc2l6ZSBhbmQgdGhlbiBpdGVyYXRpbmcKLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgc3RyaW5nIG9iajsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgb2JqID0gdG1wKCJfbWFwIik7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgb2JqID0gdG1wKCJfc2V0Iik7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIG9iaiA9IHRtcCgiX2xpc3QiKTsKLSAgfQotCi0gIC8vIERlY2xhcmUgdmFyaWFibGVzLCByZWFkIGhlYWRlcgotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIlRNYXAgIiA8PCBvYmogPDwgIiA9IGlwcm90LnJlYWRNYXBCZWdpbigpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiVFNldCAiIDw8IG9iaiA8PCAiID0gaXByb3QucmVhZFNldEJlZ2luKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiVExpc3QgIiA8PCBvYmogPDwgIiA9IGlwcm90LnJlYWRMaXN0QmVnaW4oKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpCi0gICAgICAgICAgICAgIC8vIHNpemUgdGhlIGNvbGxlY3Rpb24gY29ycmVjdGx5Ci0gICAgICAgICAgICAgIDw8ICIoIiA8PCAodHR5cGUtPmlzX2xpc3QoKSA/ICIiIDogIjIqIikgPDwgb2JqIDw8ICIuc2l6ZSIKLSAgICAgICAgICAgICAgPDwgIik7IiA8PCBlbmRsOwotCi0gIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKLSAgc3RyaW5nIGkgPSB0bXAoIl9pIik7Ci0gIGluZGVudChvdXQpIDw8ICJmb3IgKGludCAiIDw8IGkgPDwgIiA9IDA7ICIgPDwgaSA8PCAiIDwgIiA8PCBvYmogPDwgIi5zaXplIgotICAgICAgICAgICAgICA8PCAiOyAiCi0gICAgICAgICAgICAgIDw8ICIrKyIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKLQotICBzY29wZV91cChvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBwcmVmaXgpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4KTsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICAvLyBSZWFkIGNvbnRhaW5lciBlbmQKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTWFwRW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkU2V0RW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZExpc3RFbmQoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcga2V5ID0gdG1wKCJfa2V5Iik7Ci0gIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKLSAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOwotICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmtleSkgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZnZhbCkgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5KTsKLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIucHV0KCIgPDwgYm94X3R5cGUodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSkgPDwgIiwgIgotICAgICAgICAgICAgICA8PCBib3hfdHlwZSh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKSA8PCAiKTsiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgc2V0IGVsZW1lbnQKLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKLSAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5wdXQoIiA8PCBib3hfdHlwZSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pIDw8ICIsICIKLSAgICAgICAgICAgICAgPDwgYm94X3R5cGUodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKSA8PCAiKTsiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgbGlzdCBlbGVtZW50Ci0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKLSAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIuYWRkRWxlbWVudCgiIDw8IGJveF90eXBlKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pIDw8ICIpOyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCi0gKgotICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gcHJlZml4IE5hbWUgdG8gcHJlcGVuZCB0byBmaWVsZCBuYW1lCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob2ZzdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4KSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVJMzIoIiA8PCBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIi5nZXRWYWx1ZSgpKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3QuIjsKLQotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgICBvdXQgPDwgIndyaXRlQmluYXJ5KCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIG91dCA8PCAid3JpdGVCb29sKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUJ5dGUoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJMTYoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJNjQoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIG91dCA8PCAid3JpdGVEb3VibGUoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBKYXZhIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIik7IjsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHByZWZpeC5jX3N0cigpLAotICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKLSAgICAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOwotICB9Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICAodm9pZCl0c3RydWN0OwotICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIud3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHdyaXRpbmcgaXRzIHNpemUgdGhlbiB0aGUgZWxlbWVudHMuCi0gKgotICogQHBhcmFtIHR0eXBlICBUaGUgdHlwZSBvZiBjb250YWluZXIKLSAqIEBwYXJhbSBwcmVmaXggU3RyaW5nIHByZWZpeCBmb3IgZmllbGRzCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlTWFwQmVnaW4obmV3IFRNYXAoIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkKLSAgICAgICAgICAgICAgICA8PCAiLCAiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCAiIDw8IHByZWZpeAotICAgICAgICAgICAgICAgIDw8ICIuc2l6ZSgpKSk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVNldEJlZ2luKG5ldyBUU2V0KCIgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKQotICAgICAgICAgICAgICAgIDw8ICIsICIgPDwgcHJlZml4IDw8ICIuc2l6ZSgpKSk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVMaXN0QmVnaW4obmV3IFRMaXN0KCIKLSAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8IHByZWZpeCA8PCAiLnNpemUoKSkpOyIKLSAgICAgICAgICAgICAgICA8PCBlbmRsOwotICB9Ci0KLSAgc3RyaW5nIGl0ZXIgPSB0bXAoIl9pdGVyIik7Ci0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBzdHJpbmcgZW51bWVyID0gaXRlciArICJfZW51bSI7Ci0gICAgc3RyaW5nIGtleV90eXBlID0gdHlwZV9uYW1lKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCksIHRydWUsIGZhbHNlKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiZm9yIChFbnVtZXJhdGlvbiAiIDw8IGVudW1lciA8PCAiID0gIiA8PCBwcmVmaXggPDwgIi5rZXlzKCk7ICIgPDwgZW51bWVyCi0gICAgICAgICAgICAgICAgPDwgIi5oYXNNb3JlRWxlbWVudHMoKTsgKSAiOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgaW5kZW50KG91dCkgPDwga2V5X3R5cGUgPDwgIiAiIDw8IGl0ZXIgPDwgIiA9ICgiIDw8IGtleV90eXBlIDw8ICIpIiA8PCBlbnVtZXIKLSAgICAgICAgICAgICAgICA8PCAiLm5leHRFbGVtZW50KCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIHN0cmluZyBlbnVtZXIgPSBpdGVyICsgIl9lbnVtIjsKLSAgICBzdHJpbmcgZWxlX3R5cGUgPSB0eXBlX25hbWUoKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCB0cnVlKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiZm9yIChFbnVtZXJhdGlvbiAiIDw8IGVudW1lciA8PCAiID0gIiA8PCBwcmVmaXggPDwgIi5rZXlzKCk7ICIgPDwgZW51bWVyCi0gICAgICAgICAgICAgICAgPDwgIi5oYXNNb3JlRWxlbWVudHMoKTsgKSAiOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgaW5kZW50KG91dCkgPDwgZWxlX3R5cGUgPDwgIiAiIDw8IGl0ZXIgPDwgIiA9ICgiIDw8IGVsZV90eXBlIDw8ICIpIiA8PCBlbnVtZXIKLSAgICAgICAgICAgICAgICA8PCAiLm5leHRFbGVtZW50KCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBzdHJpbmcgZW51bWVyID0gaXRlciArICJfZW51bSI7Ci0gICAgaW5kZW50KG91dCkgPDwgImZvciAoRW51bWVyYXRpb24gIiA8PCBlbnVtZXIgPDwgIiA9ICIgPDwgcHJlZml4IDw8ICIuZWxlbWVudHMoKTsgIiA8PCBlbnVtZXIKLSAgICAgICAgICAgICAgICA8PCAiLmhhc01vcmVFbGVtZW50cygpOyApICI7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBzdHJpbmcgZWxlX3R5cGUgPSB0eXBlX25hbWUoKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCB0cnVlKTsKLSAgICBpbmRlbnQob3V0KSA8PCBlbGVfdHlwZSA8PCAiICIgPDwgaXRlciA8PCAiID0gKCIgPDwgZWxlX3R5cGUgPDwgIikiIDw8IGVudW1lcgotICAgICAgICAgICAgICAgIDw8ICIubmV4dEVsZW1lbnQoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgaXRlciwgcHJlZml4KTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyKTsKLSAgfQotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZU1hcEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTZXRFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUxpc3RFbmQoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBtYXApIHsKLSAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCAiIik7Ci0gIHN0cmluZyB2YWxfdHlwZSA9IHR5cGVfbmFtZSh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdHJ1ZSwgZmFsc2UpOwotICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgIigoIiArIHZhbF90eXBlICsgIikiICsgbWFwICsgIi5nZXQoIiArIGl0ZXIgKyAiKSkiKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCwgIiIpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBzZXQuCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbGlzdC4KLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlcikgewotICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOwotfQotCi0vKioKLSAqIFJldHVybnMgYSBKYXZhIHR5cGUgbmFtZQotICoKLSAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQotICogQHBhcmFtIGNvbnRhaW5lciBJcyB0aGUgdHlwZSBnb2luZyBpbnNpZGUgYSBjb250YWluZXI/Ci0gKiBAcmV0dXJuIEphdmEgdHlwZSBuYW1lLCBpLmUuIFZlY3RvcgotICovCi1zdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NvbnRhaW5lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2luaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBza2lwX2dlbmVyaWMpIHsKLSAgKHZvaWQpaW5faW5pdDsKLSAgKHZvaWQpc2tpcF9nZW5lcmljOwotICAvLyBJbiBKYXZhIHR5cGVkZWZzIGFyZSBqdXN0IHJlc29sdmVkIHRvIHRoZWlyIHJlYWwgdHlwZQotICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOwotICBzdHJpbmcgcHJlZml4OwotCi0gIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICByZXR1cm4gYmFzZV90eXBlX25hbWUoKHRfYmFzZV90eXBlKil0dHlwZSwgaW5fY29udGFpbmVyKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIkhhc2h0YWJsZSI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICJIYXNodGFibGUiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIlZlY3RvciI7Ci0gIH0KLQotICAvLyBDaGVjayBmb3IgbmFtZXNwYWNpbmcKLSAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7Ci0gIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgewotICAgIHN0cmluZyBwYWNrYWdlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiamF2YSIpOwotICAgIGlmICghcGFja2FnZS5lbXB0eSgpKSB7Ci0gICAgICByZXR1cm4gcGFja2FnZSArICIuIiArIHR0eXBlLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgfQotCi0gIHJldHVybiB0dHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBDKysgdHlwZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSB0aHJpZnQgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGJhc2UgVGhlIGJhc2UgdHlwZQotICogQHBhcmFtIGNvbnRhaW5lciBJcyBpdCBnb2luZyBpbiBhIEphdmEgY29udGFpbmVyPwotICovCi1zdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdHlwZSwgYm9vbCBpbl9jb250YWluZXIpIHsKLSAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9IHR5cGUtPmdldF9iYXNlKCk7Ci0KLSAgc3dpdGNoICh0YmFzZSkgewotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgcmV0dXJuICJ2b2lkIjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgaWYgKCF0eXBlLT5pc19iaW5hcnkoKSkgewotICAgICAgcmV0dXJuICJTdHJpbmciOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gImJ5dGVbXSI7Ci0gICAgfQotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiQm9vbGVhbiIgOiAiYm9vbGVhbiIpOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiQnl0ZSIgOiAiYnl0ZSIpOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICByZXR1cm4gKGluX2NvbnRhaW5lciA/ICJTaG9ydCIgOiAic2hvcnQiKTsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiSW50ZWdlciIgOiAiaW50Iik7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgIHJldHVybiAoaW5fY29udGFpbmVyID8gIkxvbmciIDogImxvbmciKTsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiRG91YmxlIiA6ICJkb3VibGUiKTsKLSAgZGVmYXVsdDoKLSAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEphdmEgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICB9Ci19Ci0KLS8qKgotICogRGVjbGFyZXMgYSBmaWVsZCwgd2hpY2ggbWF5IGluY2x1ZGUgaW5pdGlhbGl6YXRpb24gYXMgbmVjZXNzYXJ5LgotICoKLSAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQotICovCi1zdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0KSB7Ci0gIC8vIFRPRE8obWNzbGVlKTogZG8gd2UgZXZlciBuZWVkIHRvIGluaXRpYWxpemUgdGhlIGZpZWxkPwotICBzdHJpbmcgcmVzdWx0ID0gdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSkgKyAiICIgKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIGlmIChpbml0KSB7Ci0gICAgdF90eXBlKiB0dHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmIHRmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgewotICAgICAgb2ZzdHJlYW0gZHVtbXk7Ci0gICAgICByZXN1bHQgKz0gIiA9ICIgKyByZW5kZXJfY29uc3RfdmFsdWUoZHVtbXksIHRmaWVsZC0+Z2V0X25hbWUoKSwgdHR5cGUsIHRmaWVsZC0+Z2V0X3ZhbHVlKCkpOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIHJlc3VsdCArPSAiID0gZmFsc2UiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgcmVzdWx0ICs9ICIgPSAoZG91YmxlKTAiOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIigpIjsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIigpIjsKLSAgICAgIDsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdCArICI7IjsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCi0gKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCi0gKi8KLXN0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpIHsKLSAgdF90eXBlKiB0dHlwZSA9IHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKLSAgc3RkOjpzdHJpbmcgcmVzdWx0ID0gdHlwZV9uYW1lKHR0eXBlKSArICIgIiArIHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIoIgotICAgICAgICAgICAgICAgICAgICAgICArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSArICIpIHRocm93cyAiOwotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgIHJlc3VsdCArPSB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpICsgIiwgIjsKLSAgfQotICByZXN1bHQgKz0gIlRFeGNlcHRpb24iOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBjb21tYSBzZXBhcmF0ZWQgZmllbGQgbGlzdCwgd2l0aCB0eXBlIG5hbWVzCi0gKi8KLXN0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaW5jbHVkZV90eXBlcykgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiLCAiOwotICAgIH0KLSAgICBpZiAoaW5jbHVkZV90eXBlcykgewotICAgICAgcmVzdWx0ICs9IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCkpICsgIiAiOwotICAgIH0KLSAgICByZXN1bHQgKz0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBDKysgZW51bSBzdHJpbmcgZm9yIHRoZSBnaXZlbiB0eXBlLgotICovCi1zdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICJUVHlwZS5TVFJJTkciOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiVFR5cGUuQk9PTCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJUVHlwZS5CWVRFIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiVFR5cGUuSTE2IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiVFR5cGUuSTMyIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiVFR5cGUuSTY0IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiVFR5cGUuRE9VQkxFIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5JMzIiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLlNUUlVDVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLk1BUCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLlNFVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5MSVNUIjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotLyoqCi0gKiBBcHBsaWVzIHRoZSBjb3JyZWN0IHN0eWxlIHRvIGEgc3RyaW5nIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiBub2NhbWVsX3N0eWxlXwotICovCi1zdGQ6OnN0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OmdldF9jYXBfbmFtZShzdGQ6OnN0cmluZyBuYW1lKSB7Ci0gIG5hbWVbMF0gPSB0b3VwcGVyKG5hbWVbMF0pOwotICByZXR1cm4gbmFtZTsKLX0KLQotc3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6Y29uc3RhbnRfbmFtZShzdHJpbmcgbmFtZSkgewotICBzdHJpbmcgY29uc3RhbnRfbmFtZTsKLQotICBib29sIGlzX2ZpcnN0ID0gdHJ1ZTsKLSAgYm9vbCB3YXNfcHJldmlvdXNfY2hhcl91cHBlciA9IGZhbHNlOwotICBmb3IgKHN0cmluZzo6aXRlcmF0b3IgaXRlciA9IG5hbWUuYmVnaW4oKTsgaXRlciAhPSBuYW1lLmVuZCgpOyArK2l0ZXIpIHsKLSAgICBzdHJpbmc6OnZhbHVlX3R5cGUgY2hhcmFjdGVyID0gKCppdGVyKTsKLQotICAgIGJvb2wgaXNfdXBwZXIgPSBpc3VwcGVyKGNoYXJhY3Rlcik7Ci0KLSAgICBpZiAoaXNfdXBwZXIgJiYgIWlzX2ZpcnN0ICYmICF3YXNfcHJldmlvdXNfY2hhcl91cHBlcikgewotICAgICAgY29uc3RhbnRfbmFtZSArPSAnXyc7Ci0gICAgfQotICAgIGNvbnN0YW50X25hbWUgKz0gdG91cHBlcihjaGFyYWN0ZXIpOwotCi0gICAgaXNfZmlyc3QgPSBmYWxzZTsKLSAgICB3YXNfcHJldmlvdXNfY2hhcl91cHBlciA9IGlzX3VwcGVyOwotICB9Ci0KLSAgcmV0dXJuIGNvbnN0YW50X25hbWU7Ci19Ci0KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX2RvY3N0cmluZ19jb21tZW50KG9mc3RyZWFtJiBvdXQsIHN0cmluZyBjb250ZW50cykgewotICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsICIvKipcbiIsICIgKiAiLCBjb250ZW50cywgIiAqL1xuIik7Ci19Ci0KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX2RvYyhvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCkgewotICBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX2VudW0oKSkgewotICAgIHN0cmluZyBjb21iaW5lZF9tZXNzYWdlID0gZmllbGQtPmdldF9kb2MoKSArICJcbkBzZWUgIiArIGdldF9lbnVtX2NsYXNzX25hbWUoZmllbGQtPmdldF90eXBlKCkpOwotICAgIGdlbmVyYXRlX2phdmFfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCBjb21iaW5lZF9tZXNzYWdlKTsKLSAgfSBlbHNlIHsKLSAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsICh0X2RvYyopZmllbGQpOwotICB9Ci19Ci0KLS8qKgotICogRW1pdHMgYSBKYXZhRG9jIGNvbW1lbnQgaWYgdGhlIHByb3ZpZGVkIG9iamVjdCBoYXMgYSBkb2MgaW4gVGhyaWZ0Ci0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX2RvYyhvZnN0cmVhbSYgb3V0LCB0X2RvYyogdGRvYykgewotICBpZiAodGRvYy0+aGFzX2RvYygpKSB7Ci0gICAgZ2VuZXJhdGVfamF2YV9kb2NzdHJpbmdfY29tbWVudChvdXQsIHRkb2MtPmdldF9kb2MoKSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBFbWl0cyBhIEphdmFEb2MgY29tbWVudCBpZiB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gb2JqZWN0IGhhcyBhIGRvYyBpbiBUaHJpZnQKLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfZG9jKG9mc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICBpZiAodGZ1bmN0aW9uLT5oYXNfZG9jKCkpIHsKLSAgICBzdHJpbmdzdHJlYW0gc3M7Ci0gICAgc3MgPDwgdGZ1bmN0aW9uLT5nZXRfZG9jKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHBfaXRlcjsKLSAgICBmb3IgKHBfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBwX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK3BfaXRlcikgewotICAgICAgdF9maWVsZCogcCA9ICpwX2l0ZXI7Ci0gICAgICBzcyA8PCAiXG5AcGFyYW0gIiA8PCBwLT5nZXRfbmFtZSgpOwotICAgICAgaWYgKHAtPmhhc19kb2MoKSkgewotICAgICAgICBzcyA8PCAiICIgPDwgcC0+Z2V0X2RvYygpOwotICAgICAgfQotICAgIH0KLSAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsICIvKipcbiIsICIgKiAiLCBzcy5zdHIoKSwgIiAqL1xuIik7Ci0gIH0KLX0KLQotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlZXBfY29weV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lX3AxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc291cmNlX25hbWVfcDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyByZXN1bHRfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSkgewotCi0gIHRfY29udGFpbmVyKiBjb250YWluZXIgPSAodF9jb250YWluZXIqKXR5cGU7Ci0gIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lOwotICBpZiAoc291cmNlX25hbWVfcDIgPT0gIiIpCi0gICAgc291cmNlX25hbWUgPSBzb3VyY2VfbmFtZV9wMTsKLSAgZWxzZQotICAgIHNvdXJjZV9uYW1lID0gc291cmNlX25hbWVfcDEgKyAiLiIgKyBzb3VyY2VfbmFtZV9wMjsKLQotICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUodHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCByZXN1bHRfbmFtZSA8PCAiID0gbmV3ICIKLSAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKGNvbnRhaW5lciwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7Ci0KLSAgc3RkOjpzdHJpbmcgaXRlcmF0b3JfZWxlbWVudF9uYW1lID0gc291cmNlX25hbWVfcDEgKyAiX2VsZW1lbnQiOwotICBzdGQ6OnN0cmluZyBlbnVtZXJhdGlvbl9uYW1lID0gc291cmNlX25hbWVfcDEgKyAiX2VudW0iOwotICBzdGQ6OnN0cmluZyByZXN1bHRfZWxlbWVudF9uYW1lID0gcmVzdWx0X25hbWUgKyAiX2NvcHkiOwotCi0gIGlmIChjb250YWluZXItPmlzX21hcCgpKSB7Ci0gICAgdF90eXBlKiBrZXlfdHlwZSA9ICgodF9tYXAqKWNvbnRhaW5lciktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdmFsX3R5cGUgPSAoKHRfbWFwKiljb250YWluZXIpLT5nZXRfdmFsX3R5cGUoKTsKLQotICAgIGluZGVudChvdXQpIDw8ICJmb3IgKEVudW1lcmF0aW9uICIgPDwgZW51bWVyYXRpb25fbmFtZSA8PCAiID0gIiA8PCBzb3VyY2VfbmFtZSA8PCAiLmtleXMoKTsgIgotICAgICAgICAgICAgICAgIDw8IGVudW1lcmF0aW9uX25hbWUgPDwgIi5oYXNNb3JlRWxlbWVudHMoKTsgKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgb3V0IDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoa2V5X3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgaXRlcmF0b3JfZWxlbWVudF9uYW1lIDw8ICJfa2V5ID0gKCIKLSAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUoa2V5X3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiKSIgPDwgZW51bWVyYXRpb25fbmFtZSA8PCAiLm5leHRFbGVtZW50KCk7IgotICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKHZhbF90eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSA8PCAiX3ZhbHVlID0gKCIKLSAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUodmFsX3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiKSIgPDwgc291cmNlX25hbWUgPDwgIi5nZXQoIgotICAgICAgICAgICAgICAgIDw8IGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSA8PCAiX2tleSk7IiA8PCBlbmRsOwotCi0gICAgb3V0IDw8IGVuZGw7Ci0KLSAgICBpZiAoa2V5X3R5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3JfZWxlbWVudF9uYW1lICsgIl9rZXkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0X2VsZW1lbnRfbmFtZSArICJfa2V5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X3R5cGUpOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoa2V5X3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZSA8PCAiX2tleSA9ICI7Ci0gICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcl9lbGVtZW50X25hbWUgKyAiX2tleSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfZWxlbWVudF9uYW1lICsgIl9rZXkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X3R5cGUpOwotICAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIG91dCA8PCBlbmRsOwotCi0gICAgaWYgKHZhbF90eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X2NvbnRhaW5lcihvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSArICJfdmFsdWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0X2VsZW1lbnRfbmFtZSArICJfdmFsdWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxfdHlwZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh2YWxfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCByZXN1bHRfZWxlbWVudF9uYW1lIDw8ICJfdmFsdWUgPSAiOwotICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3JfZWxlbWVudF9uYW1lICsgIl92YWx1ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfZWxlbWVudF9uYW1lICsgIl92YWx1ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxfdHlwZSk7Ci0gICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgb3V0IDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCByZXN1bHRfbmFtZSA8PCAiLnB1dCgiIDw8IHJlc3VsdF9lbGVtZW50X25hbWUgPDwgIl9rZXksICIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZQotICAgICAgICAgICAgICAgIDw8ICJfdmFsdWUpOyIgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgfSBlbHNlIHsKLSAgICB0X3R5cGUqIGVsZW1fdHlwZTsKLQotICAgIGlmIChjb250YWluZXItPmlzX3NldCgpKSB7Ci0gICAgICBlbGVtX3R5cGUgPSAoKHRfc2V0Kiljb250YWluZXIpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGVsZW1fdHlwZSA9ICgodF9saXN0Kiljb250YWluZXIpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfQotCi0gICAgaW5kZW50KG91dCkgPDwgImZvciAoRW51bWVyYXRpb24gIiA8PCBlbnVtZXJhdGlvbl9uYW1lIDw8ICIgPSAiIDw8IHNvdXJjZV9uYW1lCi0gICAgICAgICAgICAgICAgPDwgIi5lbGVtZW50cygpOyAiIDw8IGVudW1lcmF0aW9uX25hbWUgPDwgIi5oYXNNb3JlRWxlbWVudHMoKTsgKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZShlbGVtX3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgaXRlcmF0b3JfZWxlbWVudF9uYW1lIDw8ICIgPSAoIgotICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZShlbGVtX3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiKSIgPDwgZW51bWVyYXRpb25fbmFtZSA8PCAiLm5leHRFbGVtZW50KCk7IgotICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgaWYgKGVsZW1fdHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICAgIC8vIHJlY3Vyc2l2ZSBkZWVwIGNvcHkKLSAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9jb250YWluZXIob3V0LCBpdGVyYXRvcl9lbGVtZW50X25hbWUsICIiLCByZXN1bHRfZWxlbWVudF9uYW1lLCBlbGVtX3R5cGUpOwotICAgICAgaWYgKGVsZW1fdHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8IHJlc3VsdF9uYW1lIDw8ICIuYWRkRWxlbWVudCgiIDw8IHJlc3VsdF9lbGVtZW50X25hbWUgPDwgIik7IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgcmVzdWx0X25hbWUgPDwgIi5wdXQoIiA8PCByZXN1bHRfZWxlbWVudF9uYW1lIDw8ICIsICIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZQotICAgICAgICAgICAgICAgICAgICA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIGl0ZXJhdGl2ZSBjb3B5Ci0gICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopZWxlbV90eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKGVsZW1fdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgdGVtcF9iaW5hcnlfZWxlbWVudCA9ICI7Ci0gICAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3JfZWxlbWVudF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGVtcF9iaW5hcnlfZWxlbWVudCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1fdHlwZSk7Ci0gICAgICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKLSAgICAgICAgaWYgKGVsZW1fdHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgcmVzdWx0X25hbWUgPDwgIi5hZGRFbGVtZW50KHRlbXBfYmluYXJ5X2VsZW1lbnQpOyIgPDwgZW5kbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpbmRlbnQob3V0KSA8PCByZXN1bHRfbmFtZSA8PCAiLnB1dCh0ZW1wX2JpbmFyeV9lbGVtZW50LCB0ZW1wX2JpbmFyeV9lbGVtZW50KTsiIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8IHJlc3VsdF9uYW1lIDw8ICIuYWRkRWxlbWVudCgiOwotICAgICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihvdXQsIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSwgcmVzdWx0X25hbWUsIGVsZW1fdHlwZSk7Ci0gICAgICAgIG91dCA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaW5kZW50X2Rvd24oKTsKLQotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICB9Ci19Ci0KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRlc3RfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUpIHsKLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSB8fCB0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICAvLyBiaW5hcnkgZmllbGRzIG5lZWQgdG8gYmUgY29waWVkIHdpdGggU3lzdGVtLmFycmF5Y29weQotICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgIG91dCA8PCAibmV3IGJ5dGVbIiA8PCBzb3VyY2VfbmFtZSA8PCAiLmxlbmd0aF07IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIlN5c3RlbS5hcnJheWNvcHkoIiA8PCBzb3VyY2VfbmFtZSA8PCAiLCAwLCAiIDw8IGRlc3RfbmFtZSA8PCAiLCAwLCAiCi0gICAgICAgICAgICAgICAgICA8PCBzb3VyY2VfbmFtZSA8PCAiLmxlbmd0aCkiOwotICAgIH0KLSAgICAvLyBldmVyeXRoaW5nIGVsc2UgY2FuIGJlIGNvcGllZCBkaXJlY3RseQotICAgIGVsc2UKLSAgICAgIG91dCA8PCBzb3VyY2VfbmFtZTsKLSAgfSBlbHNlIHsKLSAgICBvdXQgPDwgIm5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlLCB0cnVlKSA8PCAiKCIgPDwgc291cmNlX25hbWUgPDwgIikiOwotICB9Ci19Ci0KLXN0ZDo6c3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfY2hlY2sodF9maWVsZCogZmllbGQpIHsKLSAgcmV0dXJuIGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkLT5nZXRfbmFtZSgpKTsKLX0KLQotc3RkOjpzdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjppc3NldF9maWVsZF9pZCh0X2ZpZWxkKiBmaWVsZCkgewotICByZXR1cm4gIl9fIiArIHVwY2FzZV9zdHJpbmcoZmllbGQtPmdldF9uYW1lKCkgKyAiX2lzc2V0X2lkIik7Ci19Ci0KLXN0ZDo6c3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfY2hlY2soc3RkOjpzdHJpbmcgZmllbGRfbmFtZSkgewotICByZXR1cm4gImlzIiArIGdldF9jYXBfbmFtZSgic2V0IikgKyBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSkgKyAiKCkiOwotfQotCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfc2V0KG9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKSB7Ci0gIGlmICghdHlwZV9jYW5fYmVfbnVsbChmaWVsZC0+Z2V0X3R5cGUoKSkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAic2V0IiA8PCBnZXRfY2FwX25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8IGdldF9jYXBfbmFtZSgiaXNTZXQiKSA8PCAiKHRydWUpOyIKLSAgICAgICAgICAgICAgICA8PCBlbmRsOwotICB9Ci19Ci0KLXN0ZDo6c3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2V0X2VudW1fY2xhc3NfbmFtZSh0X3R5cGUqIHR5cGUpIHsKLSAgc3RyaW5nIHBhY2thZ2UgPSAiIjsKLSAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHlwZS0+Z2V0X3Byb2dyYW0oKTsKLSAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7Ci0gICAgcGFja2FnZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImphdmEiKSArICIuIjsKLSAgfQotICByZXR1cm4gcGFja2FnZSArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3RfZGVzYyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBzdGF0aWMgZmluYWwgVFN0cnVjdCBTVFJVQ1RfREVTQyA9IG5ldyBUU3RydWN0KFwiIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgIDw8ICJcIik7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRfZGVzY3Mob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgc3RhdGljIGZpbmFsIFRGaWVsZCAiIDw8IGNvbnN0YW50X25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKQotICAgICAgICAgICAgICAgIDw8ICJfRklFTERfREVTQyA9IG5ldyBURmllbGQoXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsICIKLSAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiCi0gICAgICAgICAgICAgICAgPDwgIihzaG9ydCkiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpOyIgPDwgZW5kbDsKLSAgfQotfQotCi1ib29sIHRfamF2YW1lX2dlbmVyYXRvcjo6aGFzX2JpdF92ZWN0b3IodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSkpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9jbGVhcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCBjbGVhcigpIHsiIDw8IGVuZGw7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBpbmRlbnRfdXAoKTsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7Ci0gICAgICBwcmludF9jb25zdF92YWx1ZShvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAidGhpcy4iICsgKCptX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHQpKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBudWxsOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIG11c3QgYmUgYSBiYXNlIHR5cGUKLSAgICAgICAgLy8gbWVhbnMgaXQgYWxzbyBuZWVkcyB0byBiZSBleHBsaWNpdGx5IHVuc2V0Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJzZXQiIDw8IGdldF9jYXBfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8IGdldF9jYXBfbmFtZSgiaXNTZXQiKQotICAgICAgICAgICAgICAgICAgICA8PCAiKGZhbHNlKTsiIDw8IGVuZGw7Ci0gICAgICAgIHN3aXRjaCAoKCh0X2Jhc2VfdHlwZSopdCktPmdldF9iYXNlKCkpIHsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAwOyIgPDwgZW5kbDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9IDAuMDsiIDw8IGVuZGw7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gZmFsc2U7IiA8PCBlbmRsOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OiAvLyBwcmV2ZW50IGdjYyBjb21waWxlciB3YXJuaW5nCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi1USFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKGphdmFtZSwgIkphdmEgTUUiLCAiIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9qc19nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfanNfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzQ4Nzc0Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9qc19nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMTc5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8bGlzdD4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotI2luY2x1ZGUgInZlcnNpb24uaCIKLQotdXNpbmcgc3RkOjptYXA7Ci11c2luZyBzdGQ6Om9mc3RyZWFtOwotdXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwotdXNpbmcgc3RkOjpzdHJpbmc7Ci11c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKLXVzaW5nIHN0ZDo6dmVjdG9yOwotCi1zdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCi0KLSNpbmNsdWRlICJ0X29vcF9nZW5lcmF0b3IuaCIKLQotCi0vKioKLSAqIEpTIGNvZGUgZ2VuZXJhdG9yLgotICovCi1jbGFzcyB0X2pzX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgewotcHVibGljOgotICB0X2pzX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKLSAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKSB7Ci0gICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKLQotICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgibm9kZSIpOwotICAgIGdlbl9ub2RlXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJqcXVlcnkiKTsKLSAgICBnZW5fanF1ZXJ5XyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGlmICghZ2VuX25vZGVfKSB7Ci0gICAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgidHMiKTsKLSAgICAgIGdlbl90c18gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGdlbl90c18gPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAoZ2VuX25vZGVfICYmIGdlbl9qcXVlcnlfKSB7Ci0gICAgICB0aHJvdyAiSW52YWxpZCBzd2l0Y2g6IFstZ2VuIGpzOm5vZGUsanF1ZXJ5XSBvcHRpb25zIG5vdCBjb21wYXRpYmxlLCB0cnk6IFstZ2VuIGpzOm5vZGUgLWdlbiAiCi0gICAgICAgICAgICAianM6anF1ZXJ5XSI7Ci0gICAgfQotCi0gICAgaWYgKGdlbl9ub2RlXykgewotICAgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tbm9kZWpzIjsKLSAgICB9IGVsc2UgewotICAgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tanMiOwotICAgIH0KLQotICAgIGVzY2FwZV9bJ1wnJ10gPSAiXFwnIjsKLSAgfQotCi0gIC8qKgotICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCi0gICAqLwotCi0gIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKLSAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKLQotICAvKioKLSAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7Ci0gIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLQotICBzdGQ6OnN0cmluZyByZW5kZXJfcmVjdl90aHJvdyhzdGQ6OnN0cmluZyB2YXIpOwotICBzdGQ6OnN0cmluZyByZW5kZXJfcmVjdl9yZXR1cm4oc3RkOjpzdHJpbmcgdmFyKTsKLQotICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFN0cnVjdHMhCi0gICAqLwotICB2b2lkIGdlbmVyYXRlX2pzX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX2pzX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leHBvcnRlZCA9IHRydWUpOwotICB2b2lkIGdlbmVyYXRlX2pzX3N0cnVjdF9yZWFkZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfanNfc3RydWN0X3dyaXRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9qc19mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0KLSAgLyoqCi0gICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfcmVzdCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0KLSAgLyoqCi0gICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsYXNzID0gZmFsc2UpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGtpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2aXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgLyoqCi0gICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCi0gICAqLwotCi0gIHN0ZDo6c3RyaW5nIGpzX2luY2x1ZGVzKCk7Ci0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9pbmNsdWRlcygpOwotICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0ID0gZmFsc2UsIGJvb2wgb2JqID0gZmFsc2UpOwotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2x1ZGVfY2FsbGJhY2sgPSBmYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaW5jbHVkZV9jYWxsYmFjayA9IGZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOwotCi0gIHN0ZDo6c3RyaW5nIGF1dG9nZW5fY29tbWVudCgpIHsKLSAgICByZXR1cm4gc3RkOjpzdHJpbmcoIi8vXG4iKSArICIvLyBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoIiArIFRIUklGVF9WRVJTSU9OICsgIilcbiIKLSAgICAgICAgICAgKyAiLy9cbiIgKyAiLy8gRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lOR1xuIgotICAgICAgICAgICArICIvL1xuIjsKLSAgfQotCi0gIHRfdHlwZSogZ2V0X2NvbnRhaW5lZF90eXBlKHRfdHlwZSogdCk7Ci0KLSAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGpzX25hbWVzcGFjZV9waWVjZXModF9wcm9ncmFtKiBwKSB7Ci0gICAgc3RkOjpzdHJpbmcgbnMgPSBwLT5nZXRfbmFtZXNwYWNlKCJqcyIpOwotCi0gICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBsb2M7Ci0gICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHBpZWNlczsKLQotICAgIGlmIChucy5zaXplKCkgPiAwKSB7Ci0gICAgICB3aGlsZSAoKGxvYyA9IG5zLmZpbmQoIi4iKSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKLSAgICAgICAgcGllY2VzLnB1c2hfYmFjayhucy5zdWJzdHIoMCwgbG9jKSk7Ci0gICAgICAgIG5zID0gbnMuc3Vic3RyKGxvYyArIDEpOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChucy5zaXplKCkgPiAwKSB7Ci0gICAgICBwaWVjZXMucHVzaF9iYWNrKG5zKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcGllY2VzOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcganNfdHlwZV9uYW1lc3BhY2UodF9wcm9ncmFtKiBwKSB7Ci0gICAgaWYgKGdlbl9ub2RlXykgewotICAgICAgaWYgKHAgIT0gTlVMTCAmJiBwICE9IHByb2dyYW1fKSB7Ci0gICAgICAgIHJldHVybiBwLT5nZXRfbmFtZSgpICsgIl90dHlwZXMuIjsKLSAgICAgIH0KLSAgICAgIHJldHVybiAidHR5cGVzLiI7Ci0gICAgfQotICAgIHJldHVybiBqc19uYW1lc3BhY2UocCk7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBqc19leHBvcnRfbmFtZXNwYWNlKHRfcHJvZ3JhbSogcCkgewotICAgIGlmIChnZW5fbm9kZV8pIHsKLSAgICAgIHJldHVybiAiZXhwb3J0cy4iOwotICAgIH0KLSAgICByZXR1cm4ganNfbmFtZXNwYWNlKHApOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcganNfbmFtZXNwYWNlKHRfcHJvZ3JhbSogcCkgewotICAgIHN0ZDo6c3RyaW5nIG5zID0gcC0+Z2V0X25hbWVzcGFjZSgianMiKTsKLSAgICBpZiAobnMuc2l6ZSgpID4gMCkgewotICAgICAgbnMgKz0gIi4iOwotICAgIH0KLQotICAgIHJldHVybiBuczsKLSAgfQotCi0gIC8qKgotICAgKiBUeXBlU2NyaXB0IERlZmluaXRpb24gRmlsZSBoZWxwZXIgZnVuY3Rpb25zCi0gICAqLwotCi0gIHN0cmluZyB0c19mdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBib29sIGluY2x1ZGVfY2FsbGJhY2spOwotICBzdHJpbmcgdHNfZ2V0X3R5cGUodF90eXBlKiB0eXBlKTsKLQotICAvKioKLSAgICogU3BlY2lhbCBpbmRlbnRhdGlvbiBmb3IgVHlwZVNjcmlwdCBEZWZpbml0aW9ucyBiZWNhdXNlIG9mIHRoZSBtb2R1bGUuCi0gICAqIFJldHVybnMgdGhlIG5vcm1hbCBpbmRlbnRhdGlvbiArICIgICIgaWYgYSBtb2R1bGUgd2FzIGRlZmluZWQuCi0gICAqIEByZXR1cm4gc3RyaW5nCi0gICAqLwotICBzdHJpbmcgdHNfaW5kZW50KCkgeyByZXR1cm4gaW5kZW50KCkgKyAoIXRzX21vZHVsZV8uZW1wdHkoKSA/ICIgICIgOiAiIik7IH0KLQotICAvKioKLSAgICogUmV0dXJucyAiZGVjbGFyZSAiIGlmIG5vIG1vZHVsZSB3YXMgZGVmaW5lZC4KLSAgICogQHJldHVybiBzdHJpbmcKLSAgICovCi0gIHN0cmluZyB0c19kZWNsYXJlKCkgeyByZXR1cm4gKHRzX21vZHVsZV8uZW1wdHkoKSA/ICJkZWNsYXJlICIgOiAiIik7IH0KLQotICAvKioKLSAgICogUmV0dXJucyAiPyIgaWYgdGhlIGdpdmVuIGZpZWxkIGlzIG9wdGlvbmFsLgotICAgKiBAcGFyYW0gdF9maWVsZCBUaGUgZmllbGQgdG8gY2hlY2sKLSAgICogQHJldHVybiBzdHJpbmcKLSAgICovCi0gIHN0cmluZyB0c19nZXRfcmVxKHRfZmllbGQqIGZpZWxkKSB7IHJldHVybiAoZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMID8gIj8iIDogIiIpOyB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGRvY3VtZW50YXRpb24sIGlmIHRoZSBwcm92aWRlZCBkb2N1bWVudGFibGUgb2JqZWN0IGhhcyBvbmUuCi0gICAqIEBwYXJhbSB0X2RvYyBUaGUgb2JqZWN0IHRvIGdldCB0aGUgZG9jdW1lbnRhdGlvbiBmcm9tCi0gICAqIEByZXR1cm4gc3RyaW5nIFRoZSBkb2N1bWVudGF0aW9uCi0gICAqLwotICBzdHJpbmcgdHNfcHJpbnRfZG9jKHRfZG9jKiB0ZG9jKSB7Ci0gICAgc3RyaW5nIHJlc3VsdCA9IGVuZGw7Ci0KLSAgICBpZiAodGRvYy0+aGFzX2RvYygpKSB7Ci0gICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBkb2ModGRvYy0+Z2V0X2RvYygpKTsKLSAgICAgIHN0cmluZyBpdGVtOwotCi0gICAgICByZXN1bHQgKz0gdHNfaW5kZW50KCkgKyAiLyoqIiArIGVuZGw7Ci0gICAgICB3aGlsZSAoc3RkOjpnZXRsaW5lKGRvYywgaXRlbSkpIHsKLSAgICAgICAgcmVzdWx0ICs9IHRzX2luZGVudCgpICsgIiAqICIgKyBpdGVtICsgZW5kbDsKLSAgICAgIH0KLSAgICAgIHJlc3VsdCArPSB0c19pbmRlbnQoKSArICIgKi8iICsgZW5kbDsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi1wcml2YXRlOgotICAvKioKLSAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgTm9kZUpTLWZyaWVuZGx5IFJQQyBzZXJ2aWNlcy4KLSAgICovCi0gIGJvb2wgZ2VuX25vZGVfOwotCi0gIC8qKgotICAgKiBUcnVlIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSBzZXJ2aWNlcyB0aGF0IHVzZSBqUXVlcnkgYWpheCAoYXN5bmMvc3luYykuCi0gICAqLwotICBib29sIGdlbl9qcXVlcnlfOwotCi0gIC8qKgotICAgKiBUcnVlIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSBhIFR5cGVTY3JpcHQgRGVmaW5pdGlvbiBGaWxlIGZvciBlYWNoIHNlcnZpY2UuCi0gICAqLwotICBib29sIGdlbl90c187Ci0KLSAgLyoqCi0gICAqIFRoZSBuYW1lIG9mIHRoZSBkZWZpbmVkIG1vZHVsZShzKSwgZm9yIFR5cGVTY3JpcHQgRGVmaW5pdGlvbiBGaWxlcy4KLSAgICovCi0gIHN0cmluZyB0c19tb2R1bGVfOwotCi0gIC8qKgotICAgKiBGaWxlIHN0cmVhbXMKLSAgICovCi0gIHN0ZDo6b2ZzdHJlYW0gZl90eXBlc187Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9zZXJ2aWNlXzsKLSAgc3RkOjpvZnN0cmVhbSBmX3R5cGVzX3RzXzsKLSAgc3RkOjpvZnN0cmVhbSBmX3NlcnZpY2VfdHNfOwotfTsKLQotLyoqCi0gKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAotICogc3RyZWFtcy4KLSAqCi0gKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQotICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOwotCi0gIHN0cmluZyBvdXRkaXIgPSBnZXRfb3V0X2RpcigpOwotCi0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUocykKLSAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IG91dGRpciArIHByb2dyYW1fLT5nZXRfbmFtZSgpICsgIl90eXBlcy5qcyI7Ci0gIGZfdHlwZXNfLm9wZW4oZl90eXBlc19uYW1lLmNfc3RyKCkpOwotCi0gIGlmIChnZW5fdHNfKSB7Ci0gICAgc3RyaW5nIGZfdHlwZXNfdHNfbmFtZSA9IG91dGRpciArIHByb2dyYW1fLT5nZXRfbmFtZSgpICsgIl90eXBlcy5kLnRzIjsKLSAgICBmX3R5cGVzX3RzXy5vcGVuKGZfdHlwZXNfdHNfbmFtZS5jX3N0cigpKTsKLSAgfQotCi0gIC8vIFByaW50IGhlYWRlcgotICBmX3R5cGVzXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBqc19pbmNsdWRlcygpIDw8IGVuZGwgPDwgcmVuZGVyX2luY2x1ZGVzKCkgPDwgZW5kbDsKLQotICBpZiAoZ2VuX3RzXykgewotICAgIGZfdHlwZXNfdHNfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAoZ2VuX25vZGVfKSB7Ci0gICAgZl90eXBlc18gPDwgInZhciB0dHlwZXMgPSBtb2R1bGUuZXhwb3J0cyA9IHt9OyIgPDwgZW5kbDsKLSAgfQotCi0gIHN0cmluZyBwbnM7Ci0KLSAgLy8gc2V0dXAgdGhlIG5hbWVzcGFjZQotICAvLyBUT0RPIHNob3VsZCB0aGUgbmFtZXNwYWNlIGp1c3QgYmUgaW4gdGhlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgZm9yIG5vZGU/Ci0gIHZlY3RvcjxzdHJpbmc+IG5zX3BpZWNlcyA9IGpzX25hbWVzcGFjZV9waWVjZXMocHJvZ3JhbV8pOwotICBpZiAobnNfcGllY2VzLnNpemUoKSA+IDApIHsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5zX3BpZWNlcy5zaXplKCk7ICsraSkgewotICAgICAgcG5zICs9ICgoaSA9PSAwKSA/ICIiIDogIi4iKSArIG5zX3BpZWNlc1tpXTsKLSAgICAgIGZfdHlwZXNfIDw8ICJpZiAodHlwZW9mICIgPDwgcG5zIDw8ICIgPT09ICd1bmRlZmluZWQnKSB7IiA8PCBlbmRsOwotICAgICAgZl90eXBlc18gPDwgIiAgIiA8PCBwbnMgPDwgIiA9IHt9OyIgPDwgZW5kbDsKLSAgICAgIGZfdHlwZXNfIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgICBpZiAoZ2VuX3RzXykgewotICAgICAgdHNfbW9kdWxlXyA9IHBuczsKLSAgICAgIGZfdHlwZXNfdHNfIDw8ICJkZWNsYXJlIG1vZHVsZSAiIDw8IHRzX21vZHVsZV8gPDwgIiB7IjsKLSAgICB9Ci0gIH0KLX0KLQotLyoqCi0gKiBQcmludHMgc3RhbmRhcmQganMgaW1wb3J0cwotICovCi1zdHJpbmcgdF9qc19nZW5lcmF0b3I6OmpzX2luY2x1ZGVzKCkgewotICBpZiAoZ2VuX25vZGVfKSB7Ci0gICAgcmV0dXJuIHN0cmluZygKLSAgICAgICAgInZhciB0aHJpZnQgPSByZXF1aXJlKCd0aHJpZnQnKTtcbiIKLSAgICAgICAgInZhciBUaHJpZnQgPSB0aHJpZnQuVGhyaWZ0O1xuIgotICAgICAgICAidmFyIFEgPSB0aHJpZnQuUTtcbiIpOwotICB9Ci0KLSAgcmV0dXJuICIiOwotfQotCi0vKioKLSAqIFJlbmRlcnMgYWxsIHRoZSBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgaW5jbHVkaW5nIGFub3RoZXIgVGhyaWZ0IHByb2dyYW0KLSAqLwotc3RyaW5nIHRfanNfZ2VuZXJhdG9yOjpyZW5kZXJfaW5jbHVkZXMoKSB7Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLQotICBpZiAoZ2VuX25vZGVfKSB7Ci0gICAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluY2x1ZGVzLnNpemUoKTsgKytpKSB7Ci0gICAgICByZXN1bHQgKz0gInZhciAiICsgaW5jbHVkZXNbaV0tPmdldF9uYW1lKCkgKyAiX3R0eXBlcyA9IHJlcXVpcmUoJy4vIiArIGluY2x1ZGVzW2ldLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgKyAiX3R5cGVzJylcbiI7Ci0gICAgfQotICAgIGlmIChpbmNsdWRlcy5zaXplKCkgPiAwKSB7Ci0gICAgICByZXN1bHQgKz0gIlxuIjsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIENsb3NlIHVwIChvciBkb3duKSBzb21lIGZpbGV6LgotICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7Ci0gIC8vIENsb3NlIHR5cGVzIGZpbGUocykKLQotICBmX3R5cGVzXy5jbG9zZSgpOwotCi0gIGlmIChnZW5fdHNfKSB7Ci0gICAgaWYgKCF0c19tb2R1bGVfLmVtcHR5KCkpIHsKLSAgICAgIGZfdHlwZXNfdHNfIDw8ICJ9IjsKLSAgICB9Ci0gICAgZl90eXBlc190c18uY2xvc2UoKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gSlMsIHR5cGVzIGFyZSBhbGwgaW1wbGljaXQuCi0gKgotICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7Ci0gICh2b2lkKXR0eXBlZGVmOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuIFNpbmNlIGRlZmluZSBpcyBleHBlbnNpdmUgdG8gbG9va3VwCi0gKiBpbiBKUywgd2UgdXNlIGEgZ2xvYmFsIGFycmF5IGZvciB0aGlzLgotICoKLSAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0gIGZfdHlwZXNfIDw8IGpzX3R5cGVfbmFtZXNwYWNlKHRlbnVtLT5nZXRfcHJvZ3JhbSgpKSA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiID0geyIgPDwgZW5kbDsKLQotICBpZiAoZ2VuX3RzXykgewotICAgIGZfdHlwZXNfdHNfIDw8IHRzX3ByaW50X2RvYyh0ZW51bSkgPDwgdHNfaW5kZW50KCkgPDwgdHNfZGVjbGFyZSgpIDw8ICJlbnVtICIKLSAgICAgICAgICAgICAgICA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiIHsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnRfdXAoKTsKLQotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICBpZiAoZ2VuX3RzXykgewotICAgICAgZl90eXBlc190c18gPDwgdHNfaW5kZW50KCkgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8IHZhbHVlIDw8ICIsIiA8PCBlbmRsOwotICAgICAgLy8gYWRkICd2YWx1ZToga2V5JyBpbiBhZGRpdGlvbiB0byAna2V5OiB2YWx1ZScgZm9yIFR5cGVTY3JpcHQgZW51bXMKLSAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICInIiA8PCB2YWx1ZSA8PCAiJyA6ICciIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJywiIDw8IGVuZGw7Ci0gICAgfQotICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICInIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIicgOiAiIDw8IHZhbHVlOwotICAgIGlmIChjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpIC0gMSkgewotICAgICAgZl90eXBlc18gPDwgIiwiOwotICAgIH0KLSAgICBmX3R5cGVzXyA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBmX3R5cGVzXyA8PCAifTsiIDw8IGVuZGw7Ci0KLSAgaWYgKGdlbl90c18pIHsKLSAgICBmX3R5cGVzX3RzXyA8PCB0c19pbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlIGEgY29uc3RhbnQgdmFsdWUKLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7Ci0gIHRfdHlwZSogdHlwZSA9IHRjb25zdC0+Z2V0X3R5cGUoKTsKLSAgc3RyaW5nIG5hbWUgPSB0Y29uc3QtPmdldF9uYW1lKCk7Ci0gIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gdGNvbnN0LT5nZXRfdmFsdWUoKTsKLQotICBmX3R5cGVzXyA8PCBqc190eXBlX25hbWVzcGFjZShwcm9ncmFtXykgPDwgbmFtZSA8PCAiID0gIjsKLSAgZl90eXBlc18gPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlKSA8PCAiOyIgPDwgZW5kbDsKLQotICBpZiAoZ2VuX3RzXykgewotICAgIGZfdHlwZXNfdHNfIDw8IHRzX3ByaW50X2RvYyh0Y29uc3QpIDw8IHRzX2luZGVudCgpIDw8IHRzX2RlY2xhcmUoKSA8PCAidmFyICIgPDwgbmFtZSA8PCAiOiAiCi0gICAgICAgICAgICAgICAgPDwgdHNfZ2V0X3R5cGUodHlwZSkgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLX0KLQotLyoqCi0gKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKLSAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCi0gKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYwotICovCi1zdHJpbmcgdF9qc19nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7Ci0KLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIG91dCA8PCAiJyIgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAiJyI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICBvdXQgPDwgKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBvdXQgPDwgIm5ldyAiIDw8IGpzX3R5cGVfbmFtZXNwYWNlKHR5cGUtPmdldF9wcm9ncmFtKCkpIDw8IHR5cGUtPmdldF9uYW1lKCkgPDwgIih7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOwotICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKLSAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgICBpZiAodl9pdGVyICE9IHZhbC5iZWdpbigpKQotICAgICAgICBvdXQgPDwgIiwiOwotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShnX3R5cGVfc3RyaW5nLCB2X2l0ZXItPmZpcnN0KTsKLSAgICAgIG91dCA8PCAiIDogIjsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgIH0KLQotICAgIG91dCA8PCAifSkiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLQotICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgb3V0IDw8ICJ7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgaWYgKHZfaXRlciAhPSB2YWwuYmVnaW4oKSkKLSAgICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOwotCi0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKLQotICAgICAgb3V0IDw8ICIgOiAiOwotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgIH0KLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgb3V0IDw8IGVuZGwgPDwgIn0iOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgewotICAgIHRfdHlwZSogZXR5cGU7Ci0gICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9IGVsc2UgewotICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0KLSAgICBvdXQgPDwgIlsiOwotICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgaWYgKHZfaXRlciAhPSB2YWwuYmVnaW4oKSkKLSAgICAgICAgb3V0IDw8ICIsIjsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpOwotICAgIH0KLSAgICBvdXQgPDwgIl0iOwotICB9Ci0gIHJldHVybiBvdXQuc3RyKCk7Ci19Ci0KLS8qKgotICogTWFrZSBhIHN0cnVjdAotICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgZ2VuZXJhdGVfanNfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZXhjZXB0aW9uLiBCYXNpY2FsbHkgdGhlIHNhbWUKLSAqIGFzIGEgc3RydWN0IGJ1dCBleHRlbmRzIHRoZSBFeGNlcHRpb24gY2xhc3MuCi0gKgotICogQHBhcmFtIHR4Y2VwdGlvbiBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9qc19zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKLX0KLQotLyoqCi0gKiBTdHJ1Y3RzIGNhbiBiZSBub3JtYWwgb3IgZXhjZXB0aW9ucy4KLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfanNfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9qc19zdHJ1Y3RfZGVmaW5pdGlvbihmX3R5cGVzXywgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKLX0KLQotLyoqCi0gKiBSZXR1cm4gdHlwZSBvZiBjb250YWluZWQgZWxlbWVudHMgZm9yIGEgY29udGFpbmVyIHR5cGUuIEZvciBtYXBzCi0gKiB0aGlzIGlzIHR5cGUgb2YgdmFsdWUgKGtleXMgYXJlIGFsd2F5cyBzdHJpbmdzIGluIGpzKQotICovCi10X3R5cGUqIHRfanNfZ2VuZXJhdG9yOjpnZXRfY29udGFpbmVkX3R5cGUodF90eXBlKiB0KSB7Ci0gIHRfdHlwZSogZXR5cGU7Ci0gIGlmICh0LT5pc19saXN0KCkpIHsKLSAgICBldHlwZSA9ICgodF9saXN0Kil0KS0+Z2V0X2VsZW1fdHlwZSgpOwotICB9IGVsc2UgaWYgKHQtPmlzX3NldCgpKSB7Ci0gICAgZXR5cGUgPSAoKHRfc2V0Kil0KS0+Z2V0X2VsZW1fdHlwZSgpOwotICB9IGVsc2UgewotICAgIGV0eXBlID0gKCh0X21hcCopdCktPmdldF92YWxfdHlwZSgpOwotICB9Ci0gIHJldHVybiBldHlwZTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLiBUaGlzIGlzIG5vdGhpbmcgaW4gSlMKLSAqIHdoZXJlIHRoZSBvYmplY3RzIGFyZSBhbGwganVzdCBhc3NvY2lhdGl2ZSBhcnJheXMgKHVubGVzcyBvZiBjb3Vyc2Ugd2UKLSAqIGRlY2lkZSB0byBzdGFydCB1c2luZyBvYmplY3RzIGZvciB0aGVtLi4uKQotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qc19zdHJ1Y3RfZGVmaW5pdGlvbihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhwb3J0ZWQpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBpZiAoZ2VuX25vZGVfKSB7Ci0gICAgaWYgKGlzX2V4cG9ydGVkKSB7Ci0gICAgICBvdXQgPDwganNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiA9ICIKLSAgICAgICAgICA8PCAibW9kdWxlLmV4cG9ydHMuIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgPSBmdW5jdGlvbihhcmdzKSB7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwganNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiA9IGZ1bmN0aW9uKGFyZ3MpIHsiCi0gICAgICAgICAgPDwgZW5kbDsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgb3V0IDw8IGpzX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgPSBmdW5jdGlvbihhcmdzKSB7IgotICAgICAgICA8PCBlbmRsOwotICAgIGlmIChnZW5fdHNfKSB7Ci0gICAgICBmX3R5cGVzX3RzXyA8PCB0c19wcmludF9kb2ModHN0cnVjdCkgPDwgdHNfaW5kZW50KCkgPDwgdHNfZGVjbGFyZSgpIDw8ICJjbGFzcyAiCi0gICAgICAgICAgICAgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8IChpc19leGNlcHRpb24gPyAiIGV4dGVuZHMgVGhyaWZ0LlRFeGNlcHRpb24iIDogIiIpCi0gICAgICAgICAgICAgICAgICA8PCAiIHsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgaWYgKGdlbl9ub2RlXyAmJiBpc19leGNlcHRpb24pIHsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlRocmlmdC5URXhjZXB0aW9uLmNhbGwodGhpcywgXCIiIDw8IGpzX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKQotICAgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJcIikiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0aGlzLm5hbWUgPSBcIiIgPDwganNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpCi0gICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlwiIiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gbWVtYmVycyB3aXRoIGFyZ3VtZW50cwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgc3RyaW5nIGR2YWwgPSBkZWNsYXJlX2ZpZWxkKCptX2l0ZXIsIGZhbHNlLCB0cnVlKTsKLSAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCAmJiAhKHQtPmlzX3N0cnVjdCgpIHx8IHQtPmlzX3hjZXB0aW9uKCkpKSB7Ci0gICAgICBkdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSwgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSk7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgZHZhbCA8PCAiOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGR2YWwgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGlmIChnZW5fdHNfKSB7Ci0gICAgICBmX3R5cGVzX3RzXyA8PCB0c19pbmRlbnQoKSA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjogIgotICAgICAgICAgICAgICAgICAgPDwgdHNfZ2V0X3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSBjb25zdHJ1Y3RvciBmcm9tIGFycmF5Ci0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLQotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwgJiYgKHQtPmlzX3N0cnVjdCgpIHx8IHQtPmlzX3hjZXB0aW9uKCkpKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiCi0gICAgICAgICAgICAgICAgICAgIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0LCAoKm1faXRlciktPmdldF92YWx1ZSgpKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBFYXJseSByZXR1cm5zIGZvciBleGNlcHRpb25zCi0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgICAgaWYgKHQtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoYXJncyBpbnN0YW5jZW9mICIgPDwganNfdHlwZV9uYW1lc3BhY2UodC0+Z2V0X3Byb2dyYW0oKSkKLSAgICAgICAgICAgIDw8IHQtPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBpbmRlbnQoKSA8PCAidGhpcy4iCi0gICAgICAgICAgICA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9IGFyZ3M7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IGluZGVudCgpIDw8ICJyZXR1cm47IgotICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChhcmdzKSB7IiA8PCBlbmRsOwotICAgIGlmIChnZW5fdHNfKSB7Ci0gICAgICBmX3R5cGVzX3RzXyA8PCBlbmRsIDw8IHRzX2luZGVudCgpIDw8ICJjb25zdHJ1Y3RvcihhcmdzPzogeyAiOwotICAgIH0KLQotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBpbmRlbnQoKSA8PCAiaWYgKGFyZ3MuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiAhPT0gdW5kZWZpbmVkICYmIGFyZ3MuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiAhPT0gbnVsbCkgeyIKLSAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8IGluZGVudCgpIDw8IGluZGVudCgpIDw8ICJ0aGlzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgICBpZiAodC0+aXNfc3RydWN0KCkpIHsKLSAgICAgICAgb3V0IDw8ICgiID0gbmV3ICIgKyBqc190eXBlX25hbWVzcGFjZSh0LT5nZXRfcHJvZ3JhbSgpKSArIHQtPmdldF9uYW1lKCkgKwotICAgICAgICAgICAgICAgICIoYXJncy4iKygqbV9pdGVyKS0+Z2V0X25hbWUoKSArIik7Iik7Ci0gICAgICAgIG91dCA8PCBlbmRsOwotICAgICAgfSBlbHNlIGlmICh0LT5pc19jb250YWluZXIoKSkgewotICAgICAgICB0X3R5cGUqIGV0eXBlID0gZ2V0X2NvbnRhaW5lZF90eXBlKHQpOwotICAgICAgICBzdHJpbmcgY29weUZ1bmMgPSB0LT5pc19tYXAoKSA/ICJUaHJpZnQuY29weU1hcCIgOiAiVGhyaWZ0LmNvcHlMaXN0IjsKLSAgICAgICAgc3RyaW5nIHR5cGVfbGlzdCA9ICIiOwotCi0gICAgICAgIHdoaWxlIChldHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICAgICAgICBpZiAodHlwZV9saXN0Lmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgdHlwZV9saXN0ICs9ICIsICI7Ci0gICAgICAgICAgfQotICAgICAgICAgIHR5cGVfbGlzdCArPSBldHlwZS0+aXNfbWFwKCkgPyAiVGhyaWZ0LmNvcHlNYXAiIDogIlRocmlmdC5jb3B5TGlzdCI7Ci0gICAgICAgICAgZXR5cGUgPSBnZXRfY29udGFpbmVkX3R5cGUoZXR5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGV0eXBlLT5pc19zdHJ1Y3QoKSkgewotICAgICAgICAgIGlmICh0eXBlX2xpc3QubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICB0eXBlX2xpc3QgKz0gIiwgIjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgdHlwZV9saXN0ICs9IGpzX3R5cGVfbmFtZXNwYWNlKGV0eXBlLT5nZXRfcHJvZ3JhbSgpKSArIGV0eXBlLT5nZXRfbmFtZSgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgIGlmICh0eXBlX2xpc3QubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICB0eXBlX2xpc3QgKz0gIiwgIjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgdHlwZV9saXN0ICs9ICJudWxsIjsKLSAgICAgICAgfQotCi0gICAgICAgIG91dCA8PCAoIiA9ICIgKyBjb3B5RnVuYyArICIoYXJncy4iICsgKCptX2l0ZXIpLT5nZXRfbmFtZSgpICsKLSAgICAgICAgICAgICAgICAiLCBbIiArIHR5cGVfbGlzdCArICJdKTsiKTsKLSAgICAgICAgb3V0IDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgIiA9IGFyZ3MuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIGlmICghKCptX2l0ZXIpLT5nZXRfcmVxKCkpIHsKLSAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBpbmRlbnQoKSA8PCBpbmRlbnQoKQotICAgICAgICAgICAgPDwgInRocm93IG5ldyBUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uKFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb25UeXBlLlVOS05PV04sICIKLSAgICAgICAgICAgICAgICInUmVxdWlyZWQgZmllbGQgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiBpcyB1bnNldCEnKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICBpZiAoZ2VuX3RzXykgewotICAgICAgICBmX3R5cGVzX3RzXyA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgdHNfZ2V0X3JlcSgqbV9pdGVyKSA8PCAiOiAiCi0gICAgICAgICAgICAgICAgICAgIDw8IHRzX2dldF90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjsgIjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgaWYgKGdlbl90c18pIHsKLSAgICAgIGZfdHlwZXNfdHNfIDw8ICJ9KTsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8ICJ9OyIgPDwgZW5kbDsKLSAgaWYgKGdlbl90c18pIHsKLSAgICBmX3R5cGVzX3RzXyA8PCB0c19pbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgfQotCi0gIGlmIChpc19leGNlcHRpb24pIHsKLSAgICBvdXQgPDwgIlRocmlmdC5pbmhlcml0cygiIDw8IGpzX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCi0gICAgICAgIDw8ICIsIFRocmlmdC5URXhjZXB0aW9uKTsiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGpzX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIucHJvdG90eXBlLm5hbWUgPSAnIgotICAgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICInOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICAvLyBpbml0IHByb3RvdHlwZQotICAgIG91dCA8PCBqc19uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiLnByb3RvdHlwZSA9IHt9OyIKLSAgICAgICAgPDwgZW5kbDsKLSAgfQotCi0gIGdlbmVyYXRlX2pzX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfanNfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgcmVhZCgpIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfanNfc3RydWN0X3JlYWRlcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgb3V0IDw8IGpzX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCi0gICAgICA8PCAiLnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24oaW5wdXQpIHsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgImlucHV0LnJlYWRTdHJ1Y3RCZWdpbigpOyIgPDwgZW5kbDsKLQotICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKLSAgaW5kZW50KG91dCkgPDwgIndoaWxlICh0cnVlKSIgPDwgZW5kbDsKLQotICBzY29wZV91cChvdXQpOwotCi0gIGluZGVudChvdXQpIDw8ICJ2YXIgcmV0ID0gaW5wdXQucmVhZEZpZWxkQmVnaW4oKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ2YXIgZm5hbWUgPSByZXQuZm5hbWU7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAidmFyIGZ0eXBlID0gcmV0LmZ0eXBlOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInZhciBmaWQgPSByZXQuZmlkOyIgPDwgZW5kbDsKLQotICAvLyBDaGVjayBmb3IgZmllbGQgU1RPUCBtYXJrZXIgYW5kIGJyZWFrCi0gIGluZGVudChvdXQpIDw8ICJpZiAoZnR5cGUgPT0gVGhyaWZ0LlR5cGUuU1RPUCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJicmVhazsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICBpZiAoIWZpZWxkcy5lbXB0eSgpKSB7Ci0gICAgLy8gU3dpdGNoIHN0YXRlbWVudCBvbiB0aGUgZmllbGQgd2UgYXJlIHJlYWRpbmcKLSAgICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWQpIiA8PCBlbmRsOwotCi0gICAgc2NvcGVfdXAob3V0KTsKLQotICAgIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcwotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0KLSAgICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjoiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGZ0eXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgeyIgPDwgZW5kbDsKLQotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLiIpOwotICAgICAgaW5kZW50X2Rvd24oKTsKLQotICAgICAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOwotCi0gICAgICBpbmRlbnQob3V0KSA8PCAiICBpbnB1dC5za2lwKGZ0eXBlKTsiIDw8IGVuZGw7Ci0KLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpZiAoZmllbGRzLnNpemUoKSA9PSAxKSB7Ci0gICAgICAvLyBwc2V1ZG8gY2FzZSB0byBtYWtlIGpzbGludCBoYXBweQotICAgICAgaW5kZW50KG91dCkgPDwgImNhc2UgMDoiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICBpbnB1dC5za2lwKGZ0eXBlKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICBicmVhazsiIDw8IGVuZGw7Ci0gICAgfQotICAgIC8vIEluIHRoZSBkZWZhdWx0IGNhc2Ugd2Ugc2tpcCB0aGUgZmllbGQKLSAgICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgaW5wdXQuc2tpcChmdHlwZSk7IiA8PCBlbmRsOwotCi0gICAgc2NvcGVfZG93bihvdXQpOwotICB9IGVsc2UgewotICAgIGluZGVudChvdXQpIDw8ICJpbnB1dC5za2lwKGZ0eXBlKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAiaW5wdXQucmVhZEZpZWxkRW5kKCk7IiA8PCBlbmRsOwotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICBpbmRlbnQob3V0KSA8PCAiaW5wdXQucmVhZFN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIn07IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSB3cml0ZSgpIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfanNfc3RydWN0X3dyaXRlcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBvdXQgPDwganNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKLSAgICAgIDw8ICIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24ob3V0cHV0KSB7IiA8PCBlbmRsOwotCi0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChvdXQpIDw8ICJvdXRwdXQud3JpdGVTdHJ1Y3RCZWdpbignIiA8PCBuYW1lIDw8ICInKTsiIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT09IG51bGwgJiYgdGhpcy4iCi0gICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9PSB1bmRlZmluZWQpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAib3V0cHV0LndyaXRlRmllbGRCZWdpbigiCi0gICAgICAgICAgICAgICAgPDwgIiciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJywgIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKQotICAgICAgICAgICAgICAgIDw8ICIsICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIik7IiA8PCBlbmRsOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy4iKTsKLQotICAgIGluZGVudChvdXQpIDw8ICJvdXRwdXQud3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLQotICBvdXQgPDwgaW5kZW50KCkgPDwgIm91dHB1dC53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3V0cHV0LndyaXRlU3RydWN0RW5kKCk7IgotICAgICAgPDwgZW5kbDsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBnZXRfb3V0X2RpcigpICsgc2VydmljZV9uYW1lXyArICIuanMiOwotICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7Ci0KLSAgaWYgKGdlbl90c18pIHsKLSAgICBzdHJpbmcgZl9zZXJ2aWNlX3RzX25hbWUgPSBnZXRfb3V0X2RpcigpICsgc2VydmljZV9uYW1lXyArICIuZC50cyI7Ci0gICAgZl9zZXJ2aWNlX3RzXy5vcGVuKGZfc2VydmljZV90c19uYW1lLmNfc3RyKCkpOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBqc19pbmNsdWRlcygpIDw8IGVuZGwgPDwgcmVuZGVyX2luY2x1ZGVzKCkgPDwgZW5kbDsKLQotICBpZiAoZ2VuX3RzXykgewotICAgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgICBmX3NlcnZpY2VfdHNfIDw8ICIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiIiA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgICAgICA8PCAiLmQudHNcIiAvPiIgPDwgZW5kbDsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlX3RzXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOwotICAgIGlmICghdHNfbW9kdWxlXy5lbXB0eSgpKSB7Ci0gICAgICBmX3NlcnZpY2VfdHNfIDw8ICJkZWNsYXJlIG1vZHVsZSAiIDw8IHRzX21vZHVsZV8gPDwgIiB7IjsKLSAgICB9Ci0gIH0KLQotICBpZiAoZ2VuX25vZGVfKSB7Ci0gICAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgInZhciAiIDw8IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpIDw8ICIgPSByZXF1aXJlKCcuLyIKLSAgICAgICAgICAgICAgICAgPDwgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgPDwgIicpIiA8PCBlbmRsIDw8ICJ2YXIgIgotICAgICAgICAgICAgICAgICA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgICA8PCAiQ2xpZW50ID0gIiA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSA8PCAiLkNsaWVudCIgPDwgZW5kbAotICAgICAgICAgICAgICAgICA8PCAidmFyICIgPDwgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgPDwgIlByb2Nlc3NvciA9ICIgPDwgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgPDwgIi5Qcm9jZXNzb3IiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgZl9zZXJ2aWNlXyA8PCAidmFyIHR0eXBlcyA9IHJlcXVpcmUoJy4vIiArIHByb2dyYW1fLT5nZXRfbmFtZSgpICsgIl90eXBlcycpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOwotCi0gIGlmIChnZW5fbm9kZV8pIHsKLSAgICBnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0c2VydmljZSk7Ci0gIH0KLQotICBmX3NlcnZpY2VfLmNsb3NlKCk7Ci0gIGlmIChnZW5fdHNfKSB7Ci0gICAgaWYgKCF0c19tb2R1bGVfLmVtcHR5KCkpIHsKLSAgICAgIGZfc2VydmljZV90c18gPDwgIn0iOwotICAgIH0KLSAgICBmX3NlcnZpY2VfdHNfLmNsb3NlKCk7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgZl9zZXJ2aWNlXyA8PCBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8IHNlcnZpY2VfbmFtZV8gPDwgIlByb2Nlc3NvciA9ICIKLSAgICAgICAgICAgICA8PCAiZXhwb3J0cy5Qcm9jZXNzb3IgPSBmdW5jdGlvbihoYW5kbGVyKSAiOwotCi0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRoaXMuX2hhbmRsZXIgPSBoYW5kbGVyIiA8PCBlbmRsOwotCi0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0KLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlRocmlmdC5pbmhlcml0cygiIDw8IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkKLSAgICAgICAgICAgICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lXyA8PCAiUHJvY2Vzc29yLCAiIDw8IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgIDw8ICJQcm9jZXNzb3IpIiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHNlcnZlciBpbXBsZW1lbnRhdGlvbgotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCBzZXJ2aWNlX25hbWVfCi0gICAgICAgICAgICAgICAgICAgICA8PCAiUHJvY2Vzc29yLnByb3RvdHlwZS5wcm9jZXNzID0gZnVuY3Rpb24oaW5wdXQsIG91dHB1dCkgIjsKLQotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ2YXIgciA9IGlucHV0LnJlYWRNZXNzYWdlQmVnaW4oKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICA8PCAiaWYgKHRoaXNbJ3Byb2Nlc3NfJyArIHIuZm5hbWVdKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgPDwgIiAgcmV0dXJuIHRoaXNbJ3Byb2Nlc3NfJyArIHIuZm5hbWVdLmNhbGwodGhpcywgci5yc2VxaWQsIGlucHV0LCBvdXRwdXQpOyIgPDwgZW5kbAotICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBpbnB1dC5za2lwKFRocmlmdC5UeXBlLlNUUlVDVCk7IgotICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgaW5wdXQucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICA8PCAiICB2YXIgeCA9IG5ldyAiCi0gICAgICAgICAgICAgICAgIlRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24oVGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUuVU5LTk9XTl9NRVRIT0QsICIKLSAgICAgICAgICAgICAgICAiJ1Vua25vd24gZnVuY3Rpb24gJyArIHIuZm5hbWUpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgIDw8ICIgIG91dHB1dC53cml0ZU1lc3NhZ2VCZWdpbihyLmZuYW1lLCBUaHJpZnQuTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCByLnJzZXFpZCk7IgotICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgeC53cml0ZShvdXRwdXQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgIDw8ICIgIG91dHB1dC53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgb3V0cHV0LmZsdXNoKCk7IiA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc2VydmljZV9uYW1lXwotICAgICAgICAgICAgICAgICAgICAgPDwgIlByb2Nlc3Nvci5wcm90b3R5cGUucHJvY2Vzc18iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgPSBmdW5jdGlvbihzZXFpZCwgaW5wdXQsIG91dHB1dCkgIjsKLQotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICBzdHJpbmcgYXJnc25hbWUgPSBqc19uYW1lc3BhY2UocHJvZ3JhbV8pICsgc2VydmljZV9uYW1lXyArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyI7Ci0gIHN0cmluZyByZXN1bHRuYW1lID0ganNfbmFtZXNwYWNlKHByb2dyYW1fKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICArICJfcmVzdWx0IjsKLQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ2YXIgYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICA8PCAiYXJncy5yZWFkKGlucHV0KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlucHV0LnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCi0gIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICAvLyBTaG9ydGN1dCBvdXQgaGVyZSBmb3Igb25ld2F5IGZ1bmN0aW9ucwotICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidGhpcy5faGFuZGxlci4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7Ci0KLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8ICJhcmdzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIH0KLQotICAgIGZfc2VydmljZV8gPDwgIikiIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoaXMuX2hhbmRsZXIuIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKLSAgICAgICAgICAgICA8PCAiLmxlbmd0aCA9PT0gIiA8PCBmaWVsZHMuc2l6ZSgpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlEuZmNhbGwodGhpcy5faGFuZGxlci4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKTsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGZfc2VydmljZV8gPDwgIiwgYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwgIikiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIi50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInZhciByZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoe3N1Y2Nlc3M6IHJlc3VsdH0pOyIgPDwgZW5kbAotICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvdXRwdXQud3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQotICAgICAgICAgICAgIDw8ICJcIiwgVGhyaWZ0Lk1lc3NhZ2VUeXBlLlJFUExZLCBzZXFpZCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgPDwgInJlc3VsdC53cml0ZShvdXRwdXQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3V0cHV0LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbAotICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvdXRwdXQuZmx1c2goKTsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSwgZnVuY3Rpb24gKGVycikgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgYm9vbCBoYXNfZXhjZXB0aW9uID0gZmFsc2U7Ci0gIHRfc3RydWN0KiBleGNlcHRpb25zID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGlmIChleGNlcHRpb25zKSB7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IGV4Y2VwdGlvbnMtPmdldF9tZW1iZXJzKCk7Ci0gICAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1lbWJlcnMuYmVnaW4oKTsgaXQgIT0gbWVtYmVycy5lbmQoKTsgKytpdCkgewotICAgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKml0KS0+Z2V0X3R5cGUoKSk7Ci0gICAgICBpZiAodC0+aXNfeGNlcHRpb24oKSkgewotICAgICAgICBpZiAoIWhhc19leGNlcHRpb24pIHsKLSAgICAgICAgICBoYXNfZXhjZXB0aW9uID0gdHJ1ZTsKLSAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmIChlcnIgaW5zdGFuY2VvZiAiIDw8IGpzX3R5cGVfbmFtZXNwYWNlKHQtPmdldF9wcm9ncmFtKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHQtPmdldF9uYW1lKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZl9zZXJ2aWNlXyA8PCAiIHx8IGVyciBpbnN0YW5jZW9mICIgPDwganNfdHlwZV9uYW1lc3BhY2UodC0+Z2V0X3Byb2dyYW0oKSkKLSAgICAgICAgICAgICAgICAgICAgIDw8IHQtPmdldF9uYW1lKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBpZiAoaGFzX2V4Y2VwdGlvbikgewotICAgIGZfc2VydmljZV8gPDwgIikgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ2YXIgcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKGVycik7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICA8PCAib3V0cHV0LndyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgIDw8ICJcIiwgVGhyaWZ0Lk1lc3NhZ2VUeXBlLlJFUExZLCBzZXFpZCk7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidmFyIHJlc3VsdCA9IG5ldyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24oVGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUuVU5LTk9XTiwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBlcnIubWVzc2FnZSk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvdXRwdXQud3JpdGVNZXNzYWdlQmVnaW4oXCIiCi0gICAgICAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIiwgVGhyaWZ0Lk1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgc2VxaWQpOyIgPDwgZW5kbDsKLQotICBpZiAoaGFzX2V4Y2VwdGlvbikgewotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LndyaXRlKG91dHB1dCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgPDwgIm91dHB1dC53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm91dHB1dC5mbHVzaCgpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9KTsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRoaXMuX2hhbmRsZXIuIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiLCAiOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PCAiZnVuY3Rpb24gKGVyciwgcmVzdWx0KSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmIChlcnIgPT0gbnVsbCI7Ci0gIGlmIChoYXNfZXhjZXB0aW9uKSB7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IGV4Y2VwdGlvbnMtPmdldF9tZW1iZXJzKCk7Ci0gICAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1lbWJlcnMuYmVnaW4oKTsgaXQgIT0gbWVtYmVycy5lbmQoKTsgKytpdCkgewotICAgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKml0KS0+Z2V0X3R5cGUoKSk7Ci0gICAgICBpZiAodC0+aXNfeGNlcHRpb24oKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICIgfHwgZXJyIGluc3RhbmNlb2YgIiA8PCBqc190eXBlX25hbWVzcGFjZSh0LT5nZXRfcHJvZ3JhbSgpKSA8PCB0LT5nZXRfbmFtZSgpOwotICAgICAgfQotICAgIH0KLSAgfQotICBmX3NlcnZpY2VfIDw8ICIpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ2YXIgcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZQotICAgICAgICAgICAgIDw8ICIoKGVyciAhPSBudWxsID8gZXJyIDoge3N1Y2Nlc3M6IHJlc3VsdH0pKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICA8PCAib3V0cHV0LndyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKLSAgICAgICAgICAgICA8PCAiXCIsIFRocmlmdC5NZXNzYWdlVHlwZS5SRVBMWSwgc2VxaWQpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInZhciByZXN1bHQgPSBuZXcgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb25UeXBlLlVOS05PV04sIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZXJyLm1lc3NhZ2UpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3V0cHV0LndyaXRlTWVzc2FnZUJlZ2luKFwiIgotICAgICAgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIsIFRocmlmdC5NZXNzYWdlVHlwZS5FWENFUFRJT04sIHNlcWlkKTsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvdXRwdXQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgIDw8ICJvdXRwdXQud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvdXRwdXQuZmx1c2goKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9KTsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBoZWxwZXIgZnVuY3Rpb25zIGZvciBhIHNlcnZpY2UuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIC8vIERvIG5vdCBnZW5lcmF0ZSBUUyBkZWZpbml0aW9ucyBmb3IgaGVscGVyIGZ1bmN0aW9ucwotICBib29sIGdlbl90c190bXAgPSBnZW5fdHNfOwotICBnZW5fdHNfID0gZmFsc2U7Ci0KLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgZl9zZXJ2aWNlXyA8PCAiLy9IRUxQRVIgRlVOQ1RJT05TIEFORCBTVFJVQ1RVUkVTIiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgc3RyaW5nIG5hbWUgPSB0cy0+Z2V0X25hbWUoKTsKLSAgICB0cy0+c2V0X25hbWUoc2VydmljZV9uYW1lXyArICJfIiArIG5hbWUpOwotICAgIGdlbmVyYXRlX2pzX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sIHRzLCBmYWxzZSwgZmFsc2UpOwotICAgIGdlbmVyYXRlX2pzX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7Ci0gICAgdHMtPnNldF9uYW1lKG5hbWUpOwotICB9Ci0KLSAgZ2VuX3RzXyA9IGdlbl90c190bXA7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2pzX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgc2VydmljZV9uYW1lXyArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7Ci0gIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7Ci0gIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKLSAgfQotCi0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7Ci0gIH0KLQotICBnZW5lcmF0ZV9qc19zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCAmcmVzdWx0LCBmYWxzZSwgZmFsc2UpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgKHZvaWQpdHNlcnZpY2U7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgUkVTVCBpbnRlcmZhY2UKLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9yZXN0KHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgKHZvaWQpdHNlcnZpY2U7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIGlmIChnZW5fbm9kZV8pIHsKLSAgICBmX3NlcnZpY2VfIDw8IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50ID0gIgotICAgICAgICAgICAgICAgPDwgImV4cG9ydHMuQ2xpZW50ID0gZnVuY3Rpb24ob3V0cHV0LCBwQ2xhc3MpIHsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8IHNlcnZpY2VfbmFtZV8KLSAgICAgICAgICAgICAgIDw8ICJDbGllbnQgPSBmdW5jdGlvbihpbnB1dCwgb3V0cHV0KSB7IiA8PCBlbmRsOwotICAgIGlmIChnZW5fdHNfKSB7Ci0gICAgICBmX3NlcnZpY2VfdHNfIDw8IHRzX3ByaW50X2RvYyh0c2VydmljZSkgPDwgdHNfaW5kZW50KCkgPDwgdHNfZGVjbGFyZSgpIDw8ICJjbGFzcyAiCi0gICAgICAgICAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudCAiOwotICAgICAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICAgICAgZl9zZXJ2aWNlX3RzXyA8PCAiZXh0ZW5kcyAiIDw8IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpIDw8ICJDbGllbnQgIjsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV90c18gPDwgInsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgaWYgKGdlbl9ub2RlXykgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgdGhpcy5vdXRwdXQgPSBvdXRwdXQ7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICA8PCAiICB0aGlzLnBDbGFzcyA9IHBDbGFzczsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgdGhpcy5fc2VxaWQgPSAwOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgdGhpcy5fcmVxcyA9IHt9OyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIHRoaXMuaW5wdXQgPSBpbnB1dDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgIDw8ICIgIHRoaXMub3V0cHV0ID0gKCFvdXRwdXQpID8gaW5wdXQgOiBvdXRwdXQ7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICA8PCAiICB0aGlzLnNlcWlkID0gMDsiIDw8IGVuZGw7Ci0gICAgaWYgKGdlbl90c18pIHsKLSAgICAgIGZfc2VydmljZV90c18gPDwgdHNfaW5kZW50KCkgPDwgImlucHV0OiBUaHJpZnQuVEpTT05Qcm90b2NvbDsiIDw8IGVuZGwgPDwgdHNfaW5kZW50KCkKLSAgICAgICAgICAgICAgICAgICAgPDwgIm91dHB1dDogVGhyaWZ0LlRKU09OUHJvdG9jb2w7IiA8PCBlbmRsIDw8IHRzX2luZGVudCgpIDw8ICJzZXFpZDogbnVtYmVyOyIKLSAgICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsIDw8IHRzX2luZGVudCgpCi0gICAgICAgICAgICAgICAgICAgIDw8ICJjb25zdHJ1Y3RvcihpbnB1dDogVGhyaWZ0LlRKU09OUHJvdG9jb2wsIG91dHB1dD86IFRocmlmdC5USlNPTlByb3RvY29sKTsiCi0gICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9OyIgPDwgZW5kbDsKLQotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVGhyaWZ0LmluaGVyaXRzKCIgPDwganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKQotICAgICAgICAgICAgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnQsICIKLSAgICAgICAgICAgICAgICAgICAgICAgPDwganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfcHJvZ3JhbSgpKQotICAgICAgICAgICAgICAgICAgICAgICA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSA8PCAiQ2xpZW50KTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gaW5pdCBwcm90b3R5cGUKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCBzZXJ2aWNlX25hbWVfCi0gICAgICAgICAgICAgICAgICAgICAgIDw8ICJDbGllbnQucHJvdG90eXBlID0ge307IiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gdXRpbHMgZm9yIG11bHRpcGxleGVkIHNlcnZpY2VzCi0gIGlmIChnZW5fbm9kZV8pIHsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCBzZXJ2aWNlX25hbWVfCi0gICAgICAgICAgICAgICAgICAgICAgIDw8ICJDbGllbnQucHJvdG90eXBlLnNlcWlkID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl9zZXFpZDsgfSIgPDwgZW5kbAotICAgICAgICAgICAgICAgICAgICAgICA8PCBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8IHNlcnZpY2VfbmFtZV8KLSAgICAgICAgICAgICAgICAgICAgICAgPDwgIkNsaWVudC5wcm90b3R5cGUubmV3X3NlcWlkID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl9zZXFpZCArPSAxOyB9IgotICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICB9Ci0gIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7Ci0gICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgc3RyaW5nIGFyZ2xpc3QgPSBhcmd1bWVudF9saXN0KGFyZ19zdHJ1Y3QpOwotCi0gICAgLy8gT3BlbiBmdW5jdGlvbgotICAgIGZfc2VydmljZV8gPDwganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnQucHJvdG90eXBlLiIKLSAgICAgICAgICAgICAgIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCAiIiwgdHJ1ZSkgPDwgIiB7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBpZiAoZ2VuX3RzXykgewotICAgICAgZl9zZXJ2aWNlX3RzXyA8PCB0c19wcmludF9kb2MoKmZfaXRlcikgPDwKLSAgICAgICAgICAvLyBmdW5jdGlvbiBkZWZpbml0aW9uIHdpdGhvdXQgY2FsbGJhY2sKLSAgICAgICAgICB0c19pbmRlbnQoKSA8PCB0c19mdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgZmFsc2UpIDw8IGVuZGwgPDwgdHNfcHJpbnRfZG9jKCpmX2l0ZXIpIDw8Ci0gICAgICAgICAgLy8gb3ZlcmxvYWQgd2l0aCBjYWxsYmFjawotICAgICAgICAgIHRzX2luZGVudCgpIDw8IHRzX2Z1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCB0cnVlKSA8PCBlbmRsOwotICAgIH0KLQotICAgIGlmIChnZW5fbm9kZV8pIHsgLy8gTm9kZS5qcyBvdXRwdXQgICAgICAuL2dlbi1ub2RlanMKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRoaXMuX3NlcWlkID0gdGhpcy5uZXdfc2VxaWQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICAgPDwgImlmIChjYWxsYmFjayA9PT0gdW5kZWZpbmVkKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ2YXIgX2RlZmVyID0gUS5kZWZlcigpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgICA8PCAidGhpcy5fcmVxc1t0aGlzLnNlcWlkKCldID0gZnVuY3Rpb24oZXJyb3IsIHJlc3VsdCkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAoZXJyb3IpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiX2RlZmVyLnJlamVjdChlcnJvcik7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiX2RlZmVyLnJlc29sdmUocmVzdWx0KTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifTsiIDw8IGVuZGw7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0aGlzLnNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIiA8PCBhcmdsaXN0IDw8ICIpOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIF9kZWZlci5wcm9taXNlOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0aGlzLl9yZXFzW3RoaXMuc2VxaWQoKV0gPSBjYWxsYmFjazsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICAgPDwgInRoaXMuc2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiIDw8IGFyZ2xpc3QgPDwgIik7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKGdlbl9qcXVlcnlfKSB7IC8vIGpRdWVyeSBvdXRwdXQgICAgICAgLi9nZW4tanMKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChjYWxsYmFjayA9PT0gdW5kZWZpbmVkKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0aGlzLnNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIiA8PCBhcmdsaXN0IDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgICAgZl9zZXJ2aWNlXyA8PCAicmV0dXJuICI7Ci0gICAgICAgIH0KLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAidGhpcy5yZWN2XyIgPDwgZnVubmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ2YXIgcG9zdERhdGEgPSB0aGlzLnNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIiA8PCBhcmdsaXN0Ci0gICAgICAgICAgICAgICAgIDw8IChhcmdsaXN0LmVtcHR5KCkgPyAiIiA6ICIsICIpIDw8ICJ0cnVlKTsiIDw8IGVuZGw7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdGhpcy5vdXRwdXQuZ2V0VHJhbnNwb3J0KCkiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIi5qcVJlcXVlc3QodGhpcywgcG9zdERhdGEsIGFyZ3VtZW50cywgdGhpcy5yZWN2XyIgPDwgZnVubmFtZQotICAgICAgICAgICAgICAgICA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsgLy8gU3RhbmRhcmQgSmF2YVNjcmlwdCAuL2dlbi1qcwotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidGhpcy5zZW5kXyIgPDwgZnVubmFtZSA8PCAiKCIgPDwgYXJnbGlzdAotICAgICAgICAgICAgICAgICA8PCAoYXJnbGlzdC5lbXB0eSgpID8gIiIgOiAiLCAiKSA8PCAiY2FsbGJhY2spOyAiIDw8IGVuZGw7Ci0gICAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKCFjYWxsYmFjaykgeyIgPDwgZW5kbDsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKLSAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICAgIGZfc2VydmljZV8gPDwgIiAgcmV0dXJuICI7Ci0gICAgICAgIH0KLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAidGhpcy5yZWN2XyIgPDwgZnVubmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLQotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICBmX3NlcnZpY2VfIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgLy8gU2VuZCBmdW5jdGlvbgotICAgIGZfc2VydmljZV8gPDwganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnQucHJvdG90eXBlLnNlbmRfIgotICAgICAgICAgICAgICAgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsICIiLCAhZ2VuX25vZGVfKSA8PCAiIHsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIHN0ZDo6c3RyaW5nIG91dHB1dFZhcjsKLSAgICBpZiAoZ2VuX25vZGVfKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ2YXIgb3V0cHV0ID0gbmV3IHRoaXMucENsYXNzKHRoaXMub3V0cHV0KTsiIDw8IGVuZGw7Ci0gICAgICBvdXRwdXRWYXIgPSAib3V0cHV0IjsKLSAgICB9IGVsc2UgewotICAgICAgb3V0cHV0VmFyID0gInRoaXMub3V0cHV0IjsKLSAgICB9Ci0KLSAgICBzdGQ6OnN0cmluZyBhcmdzbmFtZSA9IGpzX25hbWVzcGFjZShwcm9ncmFtXykgKyBzZXJ2aWNlX25hbWVfICsgIl8iICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICArICJfYXJncyI7Ci0KLSAgICBzdGQ6OnN0cmluZyBtZXNzYWdlVHlwZSA9ICgqZl9pdGVyKS0+aXNfb25ld2F5KCkgPyAiVGhyaWZ0Lk1lc3NhZ2VUeXBlLk9ORVdBWSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiVGhyaWZ0Lk1lc3NhZ2VUeXBlLkNBTEwiOwotCi0gICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0IGhlYWRlcgotICAgIGlmIChnZW5fbm9kZV8pIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgb3V0cHV0VmFyIDw8ICIud3JpdGVNZXNzYWdlQmVnaW4oJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgIDw8ICInLCAiIDw8IG1lc3NhZ2VUeXBlIDw8ICIsIHRoaXMuc2VxaWQoKSk7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IG91dHB1dFZhciA8PCAiLndyaXRlTWVzc2FnZUJlZ2luKCciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgICA8PCAiJywgIiA8PCBtZXNzYWdlVHlwZSA8PCAiLCB0aGlzLnNlcWlkKTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidmFyIGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotCi0gICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3MuIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIgotICAgICAgICAgICAgICAgICA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICAvLyBXcml0ZSB0byB0aGUgc3RyZWFtCi0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncy53cml0ZSgiIDw8IG91dHB1dFZhciA8PCAiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgb3V0cHV0VmFyCi0gICAgICAgICAgICAgICA8PCAiLndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKLQotICAgIGlmIChnZW5fbm9kZV8pIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiB0aGlzLm91dHB1dC5mbHVzaCgpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaWYgKGdlbl9qcXVlcnlfKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiB0aGlzLm91dHB1dC5nZXRUcmFuc3BvcnQoKS5mbHVzaChjYWxsYmFjayk7IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKGNhbGxiYWNrKSB7IiA8PCBlbmRsOwotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIHZhciBzZWxmID0gdGhpczsiIDw8IGVuZGw7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgdGhpcy5vdXRwdXQuZ2V0VHJhbnNwb3J0KCkuZmx1c2godHJ1ZSwgZnVuY3Rpb24oKSB7IiA8PCBlbmRsOwotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgICAgdmFyIHJlc3VsdCA9IG51bGw7IiA8PCBlbmRsOwotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgICAgdHJ5IHsiIDw8IGVuZGw7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgICAgIHJlc3VsdCA9IHNlbGYucmVjdl8iIDw8IGZ1bm5hbWUgPDwgIigpOyIgPDwgZW5kbDsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICAgIH0gY2F0Y2ggKGUpIHsiIDw8IGVuZGw7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgICAgIHJlc3VsdCA9IGU7IiA8PCBlbmRsOwotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgICAgfSIgPDwgZW5kbDsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICAgIGNhbGxiYWNrKHJlc3VsdCk7IiA8PCBlbmRsOwotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIH0pOyIgPDwgZW5kbDsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRoaXMub3V0cHV0LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7IiA8PCBlbmRsOwotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLQotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICBmX3NlcnZpY2VfIDw8ICJ9OyIgPDwgZW5kbDsKLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0bmFtZSA9IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgKyBzZXJ2aWNlX25hbWVfICsgIl8iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7Ci0KLSAgICAgIGlmIChnZW5fbm9kZV8pIHsKLSAgICAgICAgLy8gT3BlbiBmdW5jdGlvbgotICAgICAgICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCBzZXJ2aWNlX25hbWVfCi0gICAgICAgICAgICAgICAgICAgPDwgIkNsaWVudC5wcm90b3R5cGUucmVjdl8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgICAgIDw8ICIgPSBmdW5jdGlvbihpbnB1dCxtdHlwZSxyc2VxaWQpIHsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOwotCi0gICAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9hcmdzKTsKLSAgICAgICAgLy8gT3BlbiBmdW5jdGlvbgotICAgICAgICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCBzZXJ2aWNlX25hbWVfCi0gICAgICAgICAgICAgICAgICAgPDwgIkNsaWVudC5wcm90b3R5cGUuIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24pIDw8ICIgeyIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgaW5kZW50X3VwKCk7Ci0KLSAgICAgIHN0ZDo6c3RyaW5nIGlucHV0VmFyOwotICAgICAgaWYgKGdlbl9ub2RlXykgewotICAgICAgICBpbnB1dFZhciA9ICJpbnB1dCI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpbnB1dFZhciA9ICJ0aGlzLmlucHV0IjsKLSAgICAgIH0KLQotICAgICAgaWYgKGdlbl9ub2RlXykgewotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ2YXIgY2FsbGJhY2sgPSB0aGlzLl9yZXFzW3JzZXFpZF0gfHwgZnVuY3Rpb24oKSB7fTsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZGVsZXRlIHRoaXMuX3JlcXNbcnNlcWlkXTsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ2YXIgcmV0ID0gdGhpcy5pbnB1dC5yZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgICAgPDwgInZhciBmbmFtZSA9IHJldC5mbmFtZTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInZhciBtdHlwZSA9IHJldC5tdHlwZTsiCi0gICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidmFyIHJzZXFpZCA9IHJldC5yc2VxaWQ7IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAobXR5cGUgPT0gVGhyaWZ0Lk1lc3NhZ2VUeXBlLkVYQ0VQVElPTikgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgICA8PCAiICB2YXIgeCA9IG5ldyBUaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgIDw8ICIgIHgucmVhZCgiIDw8IGlucHV0VmFyIDw8ICIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICAiIDw8IGlucHV0VmFyCi0gICAgICAgICAgICAgICAgIDw8ICIucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgIiA8PCByZW5kZXJfcmVjdl90aHJvdygieCIpCi0gICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInZhciByZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICAgPDwgInJlc3VsdC5yZWFkKCIgPDwgaW5wdXRWYXIgPDwgIik7IiA8PCBlbmRsOwotCi0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGlucHV0VmFyIDw8ICIucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKG51bGwgIT09IHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgIiA8PCByZW5kZXJfcmVjdl90aHJvdygicmVzdWx0LiIgKyAoKnhfaXRlciktPmdldF9uYW1lKCkpCi0gICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKG51bGwgIT09IHJlc3VsdC5zdWNjZXNzKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgICIKLSAgICAgICAgICAgICAgICAgICA8PCByZW5kZXJfcmVjdl9yZXR1cm4oInJlc3VsdC5zdWNjZXNzIikgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgICAgIDw8IHJlbmRlcl9yZWN2X3Rocm93KCInIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdCciKQotICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAoZ2VuX25vZGVfKSB7Ci0gICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJjYWxsYmFjayhudWxsKSIgPDwgZW5kbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICJ9OyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBpZiAoZ2VuX3RzXykgewotICAgIGZfc2VydmljZV90c18gPDwgdHNfaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLX0KLQotc3RkOjpzdHJpbmcgdF9qc19nZW5lcmF0b3I6OnJlbmRlcl9yZWN2X3Rocm93KHN0ZDo6c3RyaW5nIHZhcikgewotICBpZiAoZ2VuX25vZGVfKSB7Ci0gICAgcmV0dXJuICJyZXR1cm4gY2FsbGJhY2soIiArIHZhciArICIpOyI7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuICJ0aHJvdyAiICsgdmFyICsgIjsiOwotICB9Ci19Ci0KLXN0ZDo6c3RyaW5nIHRfanNfZ2VuZXJhdG9yOjpyZW5kZXJfcmVjdl9yZXR1cm4oc3RkOjpzdHJpbmcgdmFyKSB7Ci0gIGlmIChnZW5fbm9kZV8pIHsKLSAgICByZXR1cm4gInJldHVybiBjYWxsYmFjayhudWxsLCAiICsgdmFyICsgIik7IjsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gInJldHVybiAiICsgdmFyICsgIjsiOwotICB9Ci19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsYXNzKSB7Ci0gICh2b2lkKWluY2xhc3M7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIgPSBpbnB1dC4iOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgb3V0IDw8ICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkgPyAicmVhZEJpbmFyeSgpIiA6ICJyZWFkU3RyaW5nKCkiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIG91dCA8PCAicmVhZEJvb2woKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBvdXQgPDwgInJlYWRCeXRlKCkiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBvdXQgPDwgInJlYWRJMTYoKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIG91dCA8PCAicmVhZEkzMigpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgb3V0IDw8ICJyZWFkSTY0KCkiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgInJlYWREb3VibGUoKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBKUyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIG91dCA8PCAicmVhZEkzMigpIjsKLSAgICB9Ci0KLSAgICBpZiAoIWdlbl9ub2RlXykgewotICAgICAgb3V0IDw8ICIudmFsdWUiOwotICAgIH0KLQotICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCi0gICAgICAgICAgIHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHZhcmlhYmxlLiBUaGlzIG1ha2VzIHR3byBrZXkgYXNzdW1wdGlvbnMsCi0gKiBmaXJzdCB0aGF0IHRoZXJlIGlzIGEgY29uc3QgY2hhciogdmFyaWFibGUgbmFtZWQgZGF0YSB0aGF0IHBvaW50cyB0byB0aGUKLSAqIGJ1ZmZlciBmb3IgZGVzZXJpYWxpemF0aW9uLCBhbmQgdGhhdCB0aGVyZSBpcyBhIHZhcmlhYmxlIHByb3RvY29sIHdoaWNoCi0gKiBpcyBhIHJlZmVyZW5jZSB0byBhIFRQcm90b2NvbCBzZXJpYWxpemF0aW9uIG9iamVjdC4KLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IGpzX3R5cGVfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpCi0gICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIucmVhZChpbnB1dCk7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcgc2l6ZSA9IHRtcCgiX3NpemUiKTsKLSAgc3RyaW5nIGt0eXBlID0gdG1wKCJfa3R5cGUiKTsKLSAgc3RyaW5nIHZ0eXBlID0gdG1wKCJfdnR5cGUiKTsKLSAgc3RyaW5nIGV0eXBlID0gdG1wKCJfZXR5cGUiKTsKLSAgc3RyaW5nIHJ0bXAzID0gdG1wKCJfcnRtcDMiKTsKLQotICB0X2ZpZWxkIGZzaXplKGdfdHlwZV9pMzIsIHNpemUpOwotICB0X2ZpZWxkIGZrdHlwZShnX3R5cGVfYnl0ZSwga3R5cGUpOwotICB0X2ZpZWxkIGZ2dHlwZShnX3R5cGVfYnl0ZSwgdnR5cGUpOwotICB0X2ZpZWxkIGZldHlwZShnX3R5cGVfYnl0ZSwgZXR5cGUpOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyICIgPDwgc2l6ZSA8PCAiID0gMDsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyICIgPDwgcnRtcDMgPDwgIjsiIDw8IGVuZGw7Ci0KLSAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSB7fTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInZhciAiIDw8IGt0eXBlIDw8ICIgPSAwOyIgPDwgZW5kbAotICAgICAgICA8PCBpbmRlbnQoKSA8PCAidmFyICIgPDwgdnR5cGUgPDwgIiA9IDA7IiA8PCBlbmRsOwotCi0gICAgb3V0IDw8IGluZGVudCgpIDw8IHJ0bXAzIDw8ICIgPSBpbnB1dC5yZWFkTWFwQmVnaW4oKTsiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8IGt0eXBlIDw8ICIgPSAiIDw8IHJ0bXAzIDw8ICIua3R5cGU7IiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCB2dHlwZSA8PCAiID0gIiA8PCBydG1wMyA8PCAiLnZ0eXBlOyIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgc2l6ZSA8PCAiID0gIiA8PCBydG1wMyA8PCAiLnNpemU7IiA8PCBlbmRsOwotCi0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBbXTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInZhciAiIDw8IGV0eXBlIDw8ICIgPSAwOyIgPDwgZW5kbAotICAgICAgICA8PCBpbmRlbnQoKSA8PCBydG1wMyA8PCAiID0gaW5wdXQucmVhZFNldEJlZ2luKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IGV0eXBlIDw8ICIgPSAiCi0gICAgICAgIDw8IHJ0bXAzIDw8ICIuZXR5cGU7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHNpemUgPDwgIiA9ICIgPDwgcnRtcDMgPDwgIi5zaXplOyIgPDwgZW5kbDsKLQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IFtdOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidmFyICIgPDwgZXR5cGUgPDwgIiA9IDA7IiA8PCBlbmRsCi0gICAgICAgIDw8IGluZGVudCgpIDw8IHJ0bXAzIDw8ICIgPSBpbnB1dC5yZWFkTGlzdEJlZ2luKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IGV0eXBlIDw8ICIgPSAiCi0gICAgICAgIDw8IHJ0bXAzIDw8ICIuZXR5cGU7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHNpemUgPDwgIiA9ICIgPDwgcnRtcDMgPDwgIi5zaXplOyIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKLSAgc3RyaW5nIGkgPSB0bXAoIl9pIik7Ci0gIGluZGVudChvdXQpIDw8ICJmb3IgKHZhciAiIDw8IGkgPDwgIiA9IDA7ICIgPDwgaSA8PCAiIDwgIiA8PCBzaXplIDw8ICI7ICsrIiA8PCBpIDw8ICIpIiA8PCBlbmRsOwotCi0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGlmICghZ2VuX25vZGVfKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgiIDw8IGkgPDwgIiA+IDAgKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgPDwgIiAgaWYgKGlucHV0LnJzdGFjay5sZW5ndGggPiBpbnB1dC5ycG9zW2lucHV0LnJwb3MubGVuZ3RoIC0xXSArIDEpIHsiIDw8IGVuZGwKLSAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAgIGlucHV0LnJzdGFjay5wb3AoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgcHJlZml4KTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgpOwotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIC8vIFJlYWQgY29udGFpbmVyIGVuZAotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImlucHV0LnJlYWRNYXBFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImlucHV0LnJlYWRTZXRFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJpbnB1dC5yZWFkTGlzdEVuZCgpOyIgPDwgZW5kbDsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIHRvIGRlc2VyaWFsaXplIGEgbWFwCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBrZXkgPSB0bXAoImtleSIpOwotICBzdHJpbmcgdmFsID0gdG1wKCJ2YWwiKTsKLSAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOwotICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmtleSwgZmFsc2UsIGZhbHNlKSA8PCAiOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZnZhbCwgZmFsc2UsIGZhbHNlKSA8PCAiOyIgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5KTsKLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICJbIiA8PCBrZXkgPDwgIl0gPSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoImVsZW0iKTsKLSAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8ICJ2YXIgIiA8PCBlbGVtIDw8ICIgPSBudWxsOyIgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIucHVzaCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoImVsZW0iKTsKLSAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PCAidmFyICIgPDwgZWxlbSA8PCAiID0gbnVsbDsiIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLnB1c2goIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCi0gKgotICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gcHJlZml4IE5hbWUgdG8gcHJlcGVuZCB0byBmaWVsZCBuYW1lCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKLSAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotCi0gIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotCi0gICAgc3RyaW5nIG5hbWUgPSB0ZmllbGQtPmdldF9uYW1lKCk7Ci0KLSAgICAvLyBIYWNrIGZvciB3aGVuIHByZWZpeCBpcyBkZWZpbmVkIChhbHdheXMgYSBoYXNoIHJlZikKLSAgICBpZiAoIXByZWZpeC5lbXB0eSgpKQotICAgICAgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLQotICAgIGluZGVudChvdXQpIDw8ICJvdXRwdXQuIjsKLQotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIG91dCA8PCAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpID8gIndyaXRlQmluYXJ5KCIgOiAid3JpdGVTdHJpbmcoIikgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgiIDw8IG5hbWUgPDwgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUJ5dGUoIiA8PCBuYW1lIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNigiIDw8IG5hbWUgPDwgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJNjQoIiA8PCBuYW1lIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSgiIDw8IG5hbWUgPDwgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gSlMgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgfQotICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKLQotICB9IGVsc2UgewotICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSBGSUVMRCAnJXMlcycgVFlQRSAnJXMnXG4iLAotICAgICAgICAgICBwcmVmaXguY19zdHIoKSwKLSAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCi0gICAgICAgICAgIHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGFsbCB0aGUgbWVtYmVycyBvZiBhIHN0cnVjdC4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IHRvIHNlcmlhbGl6ZQotICogQHBhcmFtIHByZWZpeCAgU3RyaW5nIHByZWZpeCB0byBhdHRhY2ggdG8gYWxsIGZpZWxkcwotICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7Ci0gICh2b2lkKXRzdHJ1Y3Q7Ci0gIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLndyaXRlKG91dHB1dCk7IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIFdyaXRlcyBvdXQgYSBjb250YWluZXIKLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7Ci0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAib3V0cHV0LndyaXRlTWFwQmVnaW4oIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiwgIgotICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCAiCi0gICAgICAgICAgICAgICAgPDwgIlRocmlmdC5vYmplY3RMZW5ndGgoIiA8PCBwcmVmaXggPDwgIikpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAib3V0cHV0LndyaXRlU2V0QmVnaW4oIiA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIKLSAgICAgICAgICAgICAgICA8PCBwcmVmaXggPDwgIi5sZW5ndGgpOyIgPDwgZW5kbDsKLQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLQotICAgIGluZGVudChvdXQpIDw8ICJvdXRwdXQud3JpdGVMaXN0QmVnaW4oIiA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKQotICAgICAgICAgICAgICAgIDw8ICIsICIgPDwgcHJlZml4IDw8ICIubGVuZ3RoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgc3RyaW5nIGtpdGVyID0gdG1wKCJraXRlciIpOwotICAgIHN0cmluZyB2aXRlciA9IHRtcCgidml0ZXIiKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiZm9yICh2YXIgIiA8PCBraXRlciA8PCAiIGluICIgPDwgcHJlZml4IDw8ICIpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IHByZWZpeCA8PCAiLmhhc093blByb3BlcnR5KCIgPDwga2l0ZXIgPDwgIikpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInZhciAiIDw8IHZpdGVyIDw8ICIgPSAiIDw8IHByZWZpeCA8PCAiWyIgPDwga2l0ZXIgPDwgIl07IiA8PCBlbmRsOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGtpdGVyLCB2aXRlcik7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIHN0cmluZyBpdGVyID0gdG1wKCJpdGVyIik7Ci0gICAgaW5kZW50KG91dCkgPDwgImZvciAodmFyICIgPDwgaXRlciA8PCAiIGluICIgPDwgcHJlZml4IDw8ICIpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IHByZWZpeCA8PCAiLmhhc093blByb3BlcnR5KCIgPDwgaXRlciA8PCAiKSkiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBpbmRlbnQob3V0KSA8PCBpdGVyIDw8ICIgPSAiIDw8IHByZWZpeCA8PCAiWyIgPDwgaXRlciA8PCAiXTsiIDw8IGVuZGw7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgaXRlcik7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBzdHJpbmcgaXRlciA9IHRtcCgiaXRlciIpOwotICAgIGluZGVudChvdXQpIDw8ICJmb3IgKHZhciAiIDw8IGl0ZXIgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiKSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBwcmVmaXggPDwgIi5oYXNPd25Qcm9wZXJ0eSgiIDw8IGl0ZXIgPDwgIikpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgaW5kZW50KG91dCkgPDwgaXRlciA8PCAiID0gIiA8PCBwcmVmaXggPDwgIlsiIDw8IGl0ZXIgPDwgIl07IiA8PCBlbmRsOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgaXRlcik7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgfQotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAib3V0cHV0LndyaXRlTWFwRW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJvdXRwdXQud3JpdGVTZXRFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJvdXRwdXQud3JpdGVMaXN0RW5kKCk7IiA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KLSAqCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBraXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdml0ZXIpIHsKLSAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGtpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCk7Ci0KLSAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCk7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgaXRlcikgewotICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbGlzdC4KLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgaXRlcikgewotICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCk7Ci19Ci0KLS8qKgotICogRGVjbGFyZXMgYSBmaWVsZCwgd2hpY2ggbWF5IGluY2x1ZGUgaW5pdGlhbGl6YXRpb24gYXMgbmVjZXNzYXJ5LgotICoKLSAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQotICovCi1zdHJpbmcgdF9qc19nZW5lcmF0b3I6OmRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQsIGJvb2wgb2JqKSB7Ci0gIHN0cmluZyByZXN1bHQgPSAidGhpcy4iICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotCi0gIGlmICghb2JqKSB7Ci0gICAgcmVzdWx0ID0gInZhciAiICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgaWYgKGluaXQpIHsKLSAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEpTIGluaXRpYWxpemVyIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIHJlc3VsdCArPSAiID0gbnVsbCI7Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICByZXN1bHQgKz0gIiA9IG51bGwiOwotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgICAgaWYgKG9iaikgewotICAgICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsganNfdHlwZV9uYW1lc3BhY2UodHlwZS0+Z2V0X3Byb2dyYW0oKSkgKyB0eXBlLT5nZXRfbmFtZSgpICsgIigpIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlc3VsdCArPSAiID0gbnVsbCI7Ci0gICAgICB9Ci0gICAgfQotICB9IGVsc2UgewotICAgIHJlc3VsdCArPSAiID0gbnVsbCI7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCi0gKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCi0gKi8KLXN0cmluZyB0X2pzX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2x1ZGVfY2FsbGJhY2spIHsKLQotICBzdHJpbmcgc3RyOwotCi0gIHN0ciA9IHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIgPSBmdW5jdGlvbigiOwotCi0gIHN0ciArPSBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSwgaW5jbHVkZV9jYWxsYmFjayk7Ci0KLSAgc3RyICs9ICIpIjsKLSAgcmV0dXJuIHN0cjsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZmllbGQgbGlzdAotICovCi1zdHJpbmcgdF9qc19nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaW5jbHVkZV9jYWxsYmFjaykgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiLCAiOwotICAgIH0KLSAgICByZXN1bHQgKz0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgaWYgKGluY2x1ZGVfY2FsbGJhY2spIHsKLSAgICBpZiAoIWZpZWxkcy5lbXB0eSgpKSB7Ci0gICAgICByZXN1bHQgKz0gIiwgIjsKLSAgICB9Ci0gICAgcmVzdWx0ICs9ICJjYWxsYmFjayI7Ci0gIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgQysrIGVudW0gc3RyaW5nIGZvciB0aGUgZ2l2ZW4gdHlwZS4KLSAqLwotc3RyaW5nIHRfanNfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICJUaHJpZnQuVHlwZS5TVFJJTkciOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuQk9PTCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJUaHJpZnQuVHlwZS5CWVRFIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuSTE2IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuSTMyIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuSTY0IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuRE9VQkxFIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJUaHJpZnQuVHlwZS5JMzIiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIlRocmlmdC5UeXBlLlNUUlVDVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIlRocmlmdC5UeXBlLk1BUCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIlRocmlmdC5UeXBlLlNFVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJUaHJpZnQuVHlwZS5MSVNUIjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotLyoqCi0gKiBDb252ZXJ0cyBhIHRfdHlwZSB0byBhIFR5cGVTY3JpcHQgdHlwZSAoc3RyaW5nKS4KLSAqIEBwYXJhbSB0X3R5cGUgVHlwZSB0byBjb252ZXJ0IHRvIFR5cGVTY3JpcHQKLSAqIEByZXR1cm4gU3RyaW5nIFR5cGVTY3JpcHQgdHlwZQotICovCi1zdHJpbmcgdF9qc19nZW5lcmF0b3I6OnRzX2dldF90eXBlKHRfdHlwZSogdHlwZSkgewotICBzdGQ6OnN0cmluZyB0c190eXBlOwotCi0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICB0c190eXBlID0gInN0cmluZyI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICB0c190eXBlID0gImJvb2xlYW4iOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgdHNfdHlwZSA9ICJhbnkiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICB0c190eXBlID0gIm51bWJlciI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0c190eXBlID0gInZvaWQiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkgfHwgdHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZTsKLSAgICBpZiAodHlwZS0+Z2V0X3Byb2dyYW0oKSkgewotICAgICAgdHlwZV9uYW1lID0ganNfbmFtZXNwYWNlKHR5cGUtPmdldF9wcm9ncmFtKCkpOwotICAgIH0KLSAgICB0eXBlX25hbWUuYXBwZW5kKHR5cGUtPmdldF9uYW1lKCkpOwotICAgIHRzX3R5cGUgPSB0eXBlX25hbWU7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgdF90eXBlKiBldHlwZTsKLQotICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9Ci0KLSAgICB0c190eXBlID0gdHNfZ2V0X3R5cGUoZXR5cGUpICsgIltdIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHN0cmluZyBrdHlwZSA9IHRzX2dldF90eXBlKCgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKSk7Ci0gICAgc3RyaW5nIHZ0eXBlID0gdHNfZ2V0X3R5cGUoKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpKTsKLQotCi0gICAgaWYgKGt0eXBlID09ICJudW1iZXIiIHx8IGt0eXBlID09ICJzdHJpbmciICkgewotICAgICAgdHNfdHlwZSA9ICJ7IFtrOiAiICsga3R5cGUgKyAiXTogIiArIHZ0eXBlICsgIjsgfSI7Ci0gICAgfSBlbHNlIGlmICgoKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpKS0+aXNfZW51bSgpKSB7Ci0gICAgICAvLyBOb3QgeWV0IHN1cHBvcnRlZCAoZW51bSBtYXApOiBodHRwczovL2dpdGh1Yi5jb20vTWljcm9zb2Z0L1R5cGVTY3JpcHQvcHVsbC8yNjUyCi0gICAgICAvL3RzX3R5cGUgPSAieyBbazogIiArIGt0eXBlICsgIl06ICIgKyB2dHlwZSArICI7IH0iOwotICAgICAgdHNfdHlwZSA9ICJ7IFtrOiBudW1iZXIgLyoiICsga3R5cGUgKyAiKi9dOiAiICsgdnR5cGUgKyAiOyB9IjsKLSAgICB9IGVsc2UgewotICAgICAgdHNfdHlwZSA9ICJhbnkiOwotICAgIH0KLSAgfQotCi0gIHJldHVybiB0c190eXBlOwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBUeXBlU2NyaXB0IGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAnbmFtZShhcmdzOiB0eXBlcyk6IHR5cGU7JwotICoKLSAqIEBwYXJhbSB0X2Z1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KLSAqIEBwYXJhbSBib29sIGluLS9leGNsdWRlIHRoZSBjYWxsYmFjayBhcmd1bWVudAotICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgotICovCi1zdGQ6OnN0cmluZyB0X2pzX2dlbmVyYXRvcjo6dHNfZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgYm9vbCBpbmNsdWRlX2NhbGxiYWNrKSB7Ci0gIHN0cmluZyBzdHI7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIHN0ciA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIoIjsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHN0ciArPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyB0c19nZXRfcmVxKCpmX2l0ZXIpICsgIjogIiArIHRzX2dldF90eXBlKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0KLSAgICBpZiAoZl9pdGVyICsgMSAhPSBmaWVsZHMuZW5kKCkgfHwgKGluY2x1ZGVfY2FsbGJhY2sgJiYgZmllbGRzLnNpemUoKSA+IDApKSB7Ci0gICAgICBzdHIgKz0gIiwgIjsKLSAgICB9Ci0gIH0KLQotICBpZiAoaW5jbHVkZV9jYWxsYmFjaykgewotICAgIHN0ciArPSAiY2FsbGJhY2s6IEZ1bmN0aW9uKTogIjsKLQotICAgIGlmIChnZW5fanF1ZXJ5XykgewotICAgICAgc3RyICs9ICJKUXVlcnlYSFI7IjsKLSAgICB9IGVsc2UgewotICAgICAgc3RyICs9ICJ2b2lkOyI7Ci0gICAgfQotICB9IGVsc2UgewotICAgIHN0ciArPSAiKTogIiArIHRzX2dldF90eXBlKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkgKyAiOyI7Ci0gIH0KLQotICByZXR1cm4gc3RyOwotfQotCi1USFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKGpzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiSmF2YXNjcmlwdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIgICAganF1ZXJ5OiAgICAgICAgICBHZW5lcmF0ZSBqUXVlcnkgY29tcGF0aWJsZSBjb2RlLlxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIG5vZGU6ICAgICAgICAgICAgR2VuZXJhdGUgbm9kZS5qcyBjb21wYXRpYmxlIGNvZGUuXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgdHM6ICAgICAgICAgICAgICBHZW5lcmF0ZSBUeXBlU2NyaXB0IGRlZmluaXRpb24gZmlsZXMuXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2pzb25fZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2pzb25fZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjQ0YTgyLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9qc29uX2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDcxNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCi0gKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgotICogZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPGxpbWl0cz4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLQotI2luY2x1ZGUgInRfZ2VuZXJhdG9yLmgiCi0jaW5jbHVkZSAicGxhdGZvcm0uaCIKLQotdXNpbmcgc3RkOjptYXA7Ci11c2luZyBzdGQ6Om9mc3RyZWFtOwotdXNpbmcgc3RkOjpvc3RyZWFtOwotdXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwotdXNpbmcgc3RkOjpzdHJpbmc7Ci11c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKLXVzaW5nIHN0ZDo6dmVjdG9yOwotdXNpbmcgc3RkOjpzdGFjazsKLQotc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsKLXN0YXRpYyBjb25zdCBzdHJpbmcgcXVvdCA9ICJcIiI7Ci1zdGF0aWMgY29uc3QgYm9vbCBOT19JTkRFTlQgPSBmYWxzZTsKLXN0YXRpYyBjb25zdCBib29sIEZPUkNFX1NUUklORyA9IHRydWU7Ci0KLWNsYXNzIHRfanNvbl9nZW5lcmF0b3IgOiBwdWJsaWMgdF9nZW5lcmF0b3IgewotcHVibGljOgotICB0X2pzb25fZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKLSAgICA6IHRfZ2VuZXJhdG9yKHByb2dyYW0pIHsKLSAgICAodm9pZClwYXJzZWRfb3B0aW9uczsKLSAgICAodm9pZClvcHRpb25fc3RyaW5nOwotICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWpzb24iOwotCi0gICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgibWVyZ2UiKTsKLSAgICBzaG91bGRfbWVyZ2VfaW5jbHVkZXNfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotICB9Ci0KLSAgdmlydHVhbCB+dF9qc29uX2dlbmVyYXRvcigpIHt9Ci0KLSAgLyoqCi0gICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcwotICAqLwotCi0gIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKLSAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKLQotICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7Ci0gIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9ncmFtKCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb24odF9mdW5jdGlvbiogdGZ1bmMpOwotICB2b2lkIGdlbmVyYXRlX2ZpZWxkKHRfZmllbGQqIGZpZWxkKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKLQotcHJpdmF0ZToKLSAgYm9vbCBzaG91bGRfbWVyZ2VfaW5jbHVkZXNfOwotCi0gIHN0ZDo6b2ZzdHJlYW0gZl9qc29uXzsKLSAgc3RkOjpzdGFjazxib29sPiBjb21tYV9uZWVkZWRfOwotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBzdHJpbmcgbnVtYmVyX3RvX3N0cmluZyhUIHQpIHsKLSAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotICAgIG91dC5pbWJ1ZShzdGQ6OmxvY2FsZTo6Y2xhc3NpYygpKTsKLSAgICBvdXQucHJlY2lzaW9uKHN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmRpZ2l0czEwKTsKLSAgICBvdXQgPDwgdDsKLSAgICByZXR1cm4gb3V0LnN0cigpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIHZvaWQgd3JpdGVfbnVtYmVyKFQgbikgewotICAgIGZfanNvbl8gPDwgbnVtYmVyX3RvX3N0cmluZyhuKTsKLSAgfQotCi0gIHN0cmluZyBnZXRfdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpOwotICBzdHJpbmcgZ2V0X3F1YWxpZmllZF9uYW1lKHRfdHlwZSogdHR5cGUpOwotCi0gIHZvaWQgc3RhcnRfb2JqZWN0KGJvb2wgc2hvdWxkX2luZGVudCA9IHRydWUpOwotICB2b2lkIHN0YXJ0X2FycmF5KCk7Ci0gIHZvaWQgZW5kX29iamVjdCgpOwotICB2b2lkIGVuZF9hcnJheSgpOwotICB2b2lkIHdyaXRlX2NvbW1hX2lmX25lZWRlZCgpOwotICB2b2lkIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOwotICBzdHJpbmcgZXNjYXBlX2pzb25fc3RyaW5nKGNvbnN0IHN0cmluZyYgaW5wdXQpOwotICBzdHJpbmcganNvbl9zdHIoY29uc3Qgc3RyaW5nJiBzdHIpOwotICB2b2lkIG1lcmdlX2luY2x1ZGVzKHRfcHJvZ3JhbSopOwotCi0gIHZvaWQgZ2VuZXJhdGVfY29uc3RhbnQodF9jb25zdCogY29uKTsKLQotICB2b2lkIHdyaXRlX3R5cGVfc3BlY19lbnRyeShjb25zdCBjaGFyKiBuYW1lLCB0X3R5cGUqIHR0eXBlKTsKLSAgdm9pZCB3cml0ZV90eXBlX3NwZWNfb2JqZWN0KGNvbnN0IGNoYXIqIG5hbWUsIHRfdHlwZSogdHR5cGUpOwotICB2b2lkIHdyaXRlX3R5cGVfc3BlYyh0X3R5cGUqIHR0eXBlKTsKLSAgdm9pZCB3cml0ZV9zdHJpbmcoY29uc3Qgc3RyaW5nJiB2YWx1ZSk7Ci0gIHZvaWQgd3JpdGVfdmFsdWUodF90eXBlKiB0dmFsdWUpOwotICB2b2lkIHdyaXRlX2NvbnN0X3ZhbHVlKHRfY29uc3RfdmFsdWUqIHZhbHVlLCBib29sIGZvcmNlX3N0cmluZyA9IGZhbHNlKTsKLSAgdm9pZCB3cml0ZV9rZXlfYW5kKHN0cmluZyBrZXkpOwotICB2b2lkIHdyaXRlX2tleV9hbmRfc3RyaW5nKHN0cmluZyBrZXksIHN0cmluZyB2YWwpOwotICB2b2lkIHdyaXRlX2tleV9hbmRfaW50ZWdlcihzdHJpbmcga2V5LCBpbnQgdmFsKTsKLSAgdm9pZCB3cml0ZV9rZXlfYW5kX2Jvb2woc3RyaW5nIGtleSwgYm9vbCB2YWwpOwotfTsKLQotdm9pZCB0X2pzb25fZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKLSAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKLQotICBzdHJpbmcgZl9qc29uX25hbWUgPSBnZXRfb3V0X2RpcigpICsgcHJvZ3JhbV8tPmdldF9uYW1lKCkgKyAiLmpzb24iOwotICBmX2pzb25fLm9wZW4oZl9qc29uX25hbWUuY19zdHIoKSk7Ci0KLSAgLy8gTWVyZ2UgYWxsIGluY2x1ZGVkIHByb2dyYW1zIGludG8gdGhpcyBvbmUgc28gd2UgY2FuIG91dHB1dCBvbmUgYmlnIGZpbGUuCi0gIGlmIChzaG91bGRfbWVyZ2VfaW5jbHVkZXNfKSB7Ci0gICAgbWVyZ2VfaW5jbHVkZXMocHJvZ3JhbV8pOwotICB9Ci19Ci0KLXN0cmluZyB0X2pzb25fZ2VuZXJhdG9yOjplc2NhcGVfanNvbl9zdHJpbmcoY29uc3Qgc3RyaW5nJiBpbnB1dCkgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gc3M7Ci0gIGZvciAoc3RkOjpzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBpbnB1dC5iZWdpbigpOyBpdGVyICE9IGlucHV0LmVuZCgpOyBpdGVyKyspIHsKLSAgICBzd2l0Y2ggKCppdGVyKSB7Ci0gICAgY2FzZSAnXFwnOgotICAgICAgc3MgPDwgIlxcXFwiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnIic6Ci0gICAgICBzcyA8PCAiXFxcIiI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICcvJzoKLSAgICAgIHNzIDw8ICJcXC8iOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnXGInOgotICAgICAgc3MgPDwgIlxcYiI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdcZic6Ci0gICAgICBzcyA8PCAiXFxmIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ1xuJzoKLSAgICAgIHNzIDw8ICJcXG4iOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnXHInOgotICAgICAgc3MgPDwgIlxcciI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdcdCc6Ci0gICAgICBzcyA8PCAiXFx0IjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBzcyA8PCAqaXRlcjsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICByZXR1cm4gc3Muc3RyKCk7Ci19Ci0KLXZvaWQgdF9qc29uX2dlbmVyYXRvcjo6c3RhcnRfb2JqZWN0KGJvb2wgc2hvdWxkX2luZGVudCkgewotICBmX2pzb25fIDw8IChzaG91bGRfaW5kZW50ID8gaW5kZW50KCkgOiAiIikgPDwgInsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBjb21tYV9uZWVkZWRfLnB1c2goZmFsc2UpOwotfQotCi12b2lkIHRfanNvbl9nZW5lcmF0b3I6OnN0YXJ0X2FycmF5KCkgewotICBmX2pzb25fIDw8ICJbIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgY29tbWFfbmVlZGVkXy5wdXNoKGZhbHNlKTsKLX0KLQotdm9pZCB0X2pzb25fZ2VuZXJhdG9yOjp3cml0ZV9jb21tYV9pZl9uZWVkZWQoKSB7Ci0gIGlmIChjb21tYV9uZWVkZWRfLnRvcCgpKSB7Ci0gICAgZl9qc29uXyA8PCAiLCIgPDwgZW5kbDsKLSAgfQotfQotCi12b2lkIHRfanNvbl9nZW5lcmF0b3I6OmluZGljYXRlX2NvbW1hX25lZWRlZCgpIHsKLSAgY29tbWFfbmVlZGVkXy5wb3AoKTsKLSAgY29tbWFfbmVlZGVkXy5wdXNoKHRydWUpOwotfQotCi12b2lkIHRfanNvbl9nZW5lcmF0b3I6OndyaXRlX2tleV9hbmQoc3RyaW5nIGtleSkgewotICB3cml0ZV9jb21tYV9pZl9uZWVkZWQoKTsKLSAgaW5kZW50KGZfanNvbl8pIDw8IGpzb25fc3RyKGtleSkgPDwgIjogIjsKLSAgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7Ci19Ci0KLXZvaWQgdF9qc29uX2dlbmVyYXRvcjo6d3JpdGVfa2V5X2FuZF9pbnRlZ2VyKHN0cmluZyBrZXksIGludCB2YWwpIHsKLSAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7Ci0gIGluZGVudChmX2pzb25fKSA8PCBqc29uX3N0cihrZXkpIDw8ICI6ICIgPDwgbnVtYmVyX3RvX3N0cmluZyh2YWwpOwotICBpbmRpY2F0ZV9jb21tYV9uZWVkZWQoKTsKLX0KLQotdm9pZCB0X2pzb25fZ2VuZXJhdG9yOjp3cml0ZV9rZXlfYW5kX3N0cmluZyhzdHJpbmcga2V5LCBzdHJpbmcgdmFsKSB7Ci0gIHdyaXRlX2NvbW1hX2lmX25lZWRlZCgpOwotICBpbmRlbnQoZl9qc29uXykgPDwganNvbl9zdHIoa2V5KSA8PCAiOiAiIDw8IGpzb25fc3RyKHZhbCk7Ci0gIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOwotfQotCi12b2lkIHRfanNvbl9nZW5lcmF0b3I6OndyaXRlX2tleV9hbmRfYm9vbChzdHJpbmcga2V5LCBib29sIHZhbCkgewotICB3cml0ZV9jb21tYV9pZl9uZWVkZWQoKTsKLSAgaW5kZW50KGZfanNvbl8pIDw8IGpzb25fc3RyKGtleSkgPDwgIjogIiA8PCAodmFsID8gInRydWUiIDogImZhbHNlIik7Ci0gIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOwotfQotCi12b2lkIHRfanNvbl9nZW5lcmF0b3I6OmVuZF9vYmplY3QoKSB7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfanNvbl8gPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSI7Ci0gIGNvbW1hX25lZWRlZF8ucG9wKCk7Ci19Ci0KLXZvaWQgdF9qc29uX2dlbmVyYXRvcjo6ZW5kX2FycmF5KCkgewotICBpbmRlbnRfZG93bigpOwotICBpZiAoY29tbWFfbmVlZGVkXy50b3AoKSkgewotICAgIGZfanNvbl8gPDwgZW5kbDsKLSAgfQotICBpbmRlbnQoZl9qc29uXykgPDwgIl0iOwotICBjb21tYV9uZWVkZWRfLnBvcCgpOwotfQotCi12b2lkIHRfanNvbl9nZW5lcmF0b3I6OndyaXRlX3R5cGVfc3BlY19vYmplY3QoY29uc3QgY2hhciogbmFtZSwgdF90eXBlKiB0dHlwZSkgewotICB0dHlwZSA9IHR0eXBlLT5nZXRfdHJ1ZV90eXBlKCk7Ci0gIGlmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkgfHwgdHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgd3JpdGVfa2V5X2FuZChuYW1lKTsKLSAgICBzdGFydF9vYmplY3QoTk9fSU5ERU5UKTsKLSAgICB3cml0ZV9rZXlfYW5kKCJ0eXBlSWQiKTsKLSAgICB3cml0ZV90eXBlX3NwZWModHR5cGUpOwotICAgIGVuZF9vYmplY3QoKTsKLSAgfQotfQotCi12b2lkIHRfanNvbl9nZW5lcmF0b3I6OndyaXRlX3R5cGVfc3BlY19lbnRyeShjb25zdCBjaGFyKiBuYW1lLCB0X3R5cGUqIHR0eXBlKSB7Ci0gIHdyaXRlX2tleV9hbmQobmFtZSk7Ci0gIHdyaXRlX3R5cGVfc3BlYyh0dHlwZSk7Ci19Ci0KLXZvaWQgdF9qc29uX2dlbmVyYXRvcjo6d3JpdGVfdHlwZV9zcGVjKHRfdHlwZSogdHR5cGUpIHsKLSAgdHR5cGUgPSB0dHlwZS0+Z2V0X3RydWVfdHlwZSgpOwotCi0gIHdyaXRlX3N0cmluZyhnZXRfdHlwZV9uYW1lKHR0eXBlKSk7Ci0KLSAgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJjbGFzcyIsIGdldF9xdWFsaWZpZWRfbmFtZSh0dHlwZSkpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpOwotICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJrZXlUeXBlSWQiLCBnZXRfdHlwZV9uYW1lKGt0eXBlKSk7Ci0gICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoInZhbHVlVHlwZUlkIiwgZ2V0X3R5cGVfbmFtZSh2dHlwZSkpOwotICAgIHdyaXRlX3R5cGVfc3BlY19vYmplY3QoImtleVR5cGUiLCBrdHlwZSk7Ci0gICAgd3JpdGVfdHlwZV9zcGVjX29iamVjdCgidmFsdWVUeXBlIiwgdnR5cGUpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkgfHwgdHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgdF90eXBlKiBldHlwZSA9ICgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB3cml0ZV9rZXlfYW5kX3N0cmluZygiZWxlbVR5cGVJZCIsIGdldF90eXBlX25hbWUoZXR5cGUpKTsKLSAgICB3cml0ZV90eXBlX3NwZWNfb2JqZWN0KCJlbGVtVHlwZSIsIGV0eXBlKTsKLSAgfQotfQotCi12b2lkIHRfanNvbl9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKLSAgZl9qc29uXyA8PCBlbmRsOwotICBmX2pzb25fLmNsb3NlKCk7Ci19Ci0KLXZvaWQgdF9qc29uX2dlbmVyYXRvcjo6bWVyZ2VfaW5jbHVkZXModF9wcm9ncmFtKiBwcm9ncmFtKSB7Ci0gIHZlY3Rvcjx0X3Byb2dyYW0qPiBpbmNsdWRlcyA9IHByb2dyYW0tPmdldF9pbmNsdWRlcygpOwotICB2ZWN0b3I8dF9wcm9ncmFtKj46Oml0ZXJhdG9yIGluY19pdGVyOwotICBmb3IgKGluY19pdGVyID0gaW5jbHVkZXMuYmVnaW4oKTsgaW5jX2l0ZXIgIT0gaW5jbHVkZXMuZW5kKCk7ICsraW5jX2l0ZXIpIHsKLSAgICB0X3Byb2dyYW0qIGluY2x1ZGUgPSAqaW5jX2l0ZXI7Ci0gICAgLy8gcmVjdXJzZSBpbiBjYXNlIHdlIGdldCBjcmF6eQotICAgIG1lcmdlX2luY2x1ZGVzKGluY2x1ZGUpOwotICAgIC8vIG1lcmdlIGVudW1zCi0gICAgdmVjdG9yPHRfZW51bSo+IGVudW1zID0gaW5jbHVkZS0+Z2V0X2VudW1zKCk7Ci0gICAgdmVjdG9yPHRfZW51bSo+OjppdGVyYXRvciBlbl9pdGVyOwotICAgIGZvciAoZW5faXRlciA9IGVudW1zLmJlZ2luKCk7IGVuX2l0ZXIgIT0gZW51bXMuZW5kKCk7ICsrZW5faXRlcikgewotICAgICAgcHJvZ3JhbS0+YWRkX2VudW0oKmVuX2l0ZXIpOwotICAgIH0KLSAgICAvLyBtZXJnZSB0eXBlZGVmcwotICAgIHZlY3Rvcjx0X3R5cGVkZWYqPiB0eXBlZGVmcyA9IGluY2x1ZGUtPmdldF90eXBlZGVmcygpOwotICAgIHZlY3Rvcjx0X3R5cGVkZWYqPjo6aXRlcmF0b3IgdGRfaXRlcjsKLSAgICBmb3IgKHRkX2l0ZXIgPSB0eXBlZGVmcy5iZWdpbigpOyB0ZF9pdGVyICE9IHR5cGVkZWZzLmVuZCgpOyArK3RkX2l0ZXIpIHsKLSAgICAgIHByb2dyYW0tPmFkZF90eXBlZGVmKCp0ZF9pdGVyKTsKLSAgICB9Ci0gICAgLy8gbWVyZ2Ugc3RydWN0cwotICAgIHZlY3Rvcjx0X3N0cnVjdCo+IG9iamVjdHMgPSBpbmNsdWRlLT5nZXRfb2JqZWN0cygpOwotICAgIHZlY3Rvcjx0X3N0cnVjdCo+OjppdGVyYXRvciBvX2l0ZXI7Ci0gICAgZm9yIChvX2l0ZXIgPSBvYmplY3RzLmJlZ2luKCk7IG9faXRlciAhPSBvYmplY3RzLmVuZCgpOyArK29faXRlcikgewotICAgICAgcHJvZ3JhbS0+YWRkX3N0cnVjdCgqb19pdGVyKTsKLSAgICB9Ci0gICAgLy8gbWVyZ2UgY29uc3RhbnRzCi0gICAgdmVjdG9yPHRfY29uc3QqPiBjb25zdHMgPSBpbmNsdWRlLT5nZXRfY29uc3RzKCk7Ci0gICAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY19pdGVyOwotICAgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgICBwcm9ncmFtLT5hZGRfY29uc3QoKmNfaXRlcik7Ci0gICAgfQotCi0gICAgLy8gbWVyZ2Ugc2VydmljZXMKLSAgICB2ZWN0b3I8dF9zZXJ2aWNlKj4gc2VydmljZXMgPSBpbmNsdWRlLT5nZXRfc2VydmljZXMoKTsKLSAgICB2ZWN0b3I8dF9zZXJ2aWNlKj46Oml0ZXJhdG9yIHN2X2l0ZXI7Ci0gICAgZm9yIChzdl9pdGVyID0gc2VydmljZXMuYmVnaW4oKTsgc3ZfaXRlciAhPSBzZXJ2aWNlcy5lbmQoKTsgKytzdl9pdGVyKSB7Ci0gICAgICBwcm9ncmFtLT5hZGRfc2VydmljZSgqc3ZfaXRlcik7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgdF9qc29uX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvZ3JhbSgpIHsKLQotICBpbml0X2dlbmVyYXRvcigpOwotCi0gIHN0YXJ0X29iamVjdCgpOwotICB3cml0ZV9rZXlfYW5kX3N0cmluZygibmFtZSIsIHByb2dyYW1fLT5nZXRfbmFtZSgpKTsKLSAgaWYgKHByb2dyYW1fLT5oYXNfZG9jKCkpIHsKLSAgICB3cml0ZV9rZXlfYW5kX3N0cmluZygiZG9jIiwgcHJvZ3JhbV8tPmdldF9kb2MoKSk7Ci0gIH0KLQotICAvLyBXaGVuIG1lcmdpbmcgaW5jbHVkZXMsIHRoZSAibmFtZXNwYWNlcyIgYW5kICJpbmNsdWRlcyIgc2VjdGlvbnMKLSAgLy8gYmVjb21lIGFtYmlndW91cywgc28ganVzdCBza2lwIHRoZW0uCi0gIGlmICghc2hvdWxkX21lcmdlX2luY2x1ZGVzXykgewotICAgIC8vIEdlbmVyYXRlIG5hbWVzcGFjZXMKLSAgICB3cml0ZV9rZXlfYW5kKCJuYW1lc3BhY2VzIik7Ci0gICAgc3RhcnRfb2JqZWN0KE5PX0lOREVOVCk7Ci0gICAgY29uc3QgbWFwPHN0cmluZywgc3RyaW5nPiYgbmFtZXNwYWNlcyA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlcygpOwotICAgIG1hcDxzdHJpbmcsIHN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIG5zX2l0OwotICAgIGZvciAobnNfaXQgPSBuYW1lc3BhY2VzLmJlZ2luKCk7IG5zX2l0ICE9IG5hbWVzcGFjZXMuZW5kKCk7ICsrbnNfaXQpIHsKLSAgICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKG5zX2l0LT5maXJzdCwgbnNfaXQtPnNlY29uZCk7Ci0gICAgICBpbmRpY2F0ZV9jb21tYV9uZWVkZWQoKTsKLSAgICB9Ci0gICAgZW5kX29iamVjdCgpOwotCi0gICAgLy8gR2VuZXJhdGUgaW5jbHVkZXMKLSAgICB3cml0ZV9rZXlfYW5kKCJpbmNsdWRlcyIpOwotICAgIHN0YXJ0X2FycmF5KCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+IGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOwotICAgIHZlY3Rvcjx0X3Byb2dyYW0qPjo6Y29uc3RfaXRlcmF0b3IgaW5jX2l0OwotICAgIGZvciAoaW5jX2l0ID0gaW5jbHVkZXMuYmVnaW4oKTsgaW5jX2l0ICE9IGluY2x1ZGVzLmVuZCgpOyArK2luY19pdCkgewotICAgICAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7Ci0gICAgICB3cml0ZV9zdHJpbmcoKCppbmNfaXQpLT5nZXRfbmFtZSgpKTsKLSAgICAgIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOwotICAgIH0KLSAgICBlbmRfYXJyYXkoKTsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIGVudW1zCi0gIHdyaXRlX2tleV9hbmQoImVudW1zIik7Ci0gIHN0YXJ0X2FycmF5KCk7Ci0gIHZlY3Rvcjx0X2VudW0qPiBlbnVtcyA9IHByb2dyYW1fLT5nZXRfZW51bXMoKTsKLSAgdmVjdG9yPHRfZW51bSo+OjppdGVyYXRvciBlbl9pdGVyOwotICBmb3IgKGVuX2l0ZXIgPSBlbnVtcy5iZWdpbigpOyBlbl9pdGVyICE9IGVudW1zLmVuZCgpOyArK2VuX2l0ZXIpIHsKLSAgICB3cml0ZV9jb21tYV9pZl9uZWVkZWQoKTsKLSAgICBnZW5lcmF0ZV9lbnVtKCplbl9pdGVyKTsKLSAgICBpbmRpY2F0ZV9jb21tYV9uZWVkZWQoKTsKLSAgfQotICBlbmRfYXJyYXkoKTsKLQotICAvLyBHZW5lcmF0ZSB0eXBlZGVmcwotICB3cml0ZV9rZXlfYW5kKCJ0eXBlZGVmcyIpOwotICBzdGFydF9hcnJheSgpOwotICB2ZWN0b3I8dF90eXBlZGVmKj4gdHlwZWRlZnMgPSBwcm9ncmFtXy0+Z2V0X3R5cGVkZWZzKCk7Ci0gIHZlY3Rvcjx0X3R5cGVkZWYqPjo6aXRlcmF0b3IgdGRfaXRlcjsKLSAgZm9yICh0ZF9pdGVyID0gdHlwZWRlZnMuYmVnaW4oKTsgdGRfaXRlciAhPSB0eXBlZGVmcy5lbmQoKTsgKyt0ZF9pdGVyKSB7Ci0gICAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7Ci0gICAgZ2VuZXJhdGVfdHlwZWRlZigqdGRfaXRlcik7Ci0gICAgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7Ci0gIH0KLSAgZW5kX2FycmF5KCk7Ci0KLSAgLy8gR2VuZXJhdGUgc3RydWN0cywgZXhjZXB0aW9ucywgYW5kIHVuaW9ucyBpbiBkZWNsYXJlZCBvcmRlcgotICB3cml0ZV9rZXlfYW5kKCJzdHJ1Y3RzIik7Ci0gIHN0YXJ0X2FycmF5KCk7Ci0gIHZlY3Rvcjx0X3N0cnVjdCo+IG9iamVjdHMgPSBwcm9ncmFtXy0+Z2V0X29iamVjdHMoKTsKLSAgdmVjdG9yPHRfc3RydWN0Kj46Oml0ZXJhdG9yIG9faXRlcjsKLSAgZm9yIChvX2l0ZXIgPSBvYmplY3RzLmJlZ2luKCk7IG9faXRlciAhPSBvYmplY3RzLmVuZCgpOyArK29faXRlcikgewotICAgIHdyaXRlX2NvbW1hX2lmX25lZWRlZCgpOwotICAgIGlmICgoKm9faXRlciktPmlzX3hjZXB0aW9uKCkpIHsKLSAgICAgIGdlbmVyYXRlX3hjZXB0aW9uKCpvX2l0ZXIpOwotICAgIH0gZWxzZSB7Ci0gICAgICBnZW5lcmF0ZV9zdHJ1Y3QoKm9faXRlcik7Ci0gICAgfQotICAgIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOwotICB9Ci0gIGVuZF9hcnJheSgpOwotCi0gIC8vIEdlbmVyYXRlIGNvbnN0YW50cwotICB3cml0ZV9rZXlfYW5kKCJjb25zdGFudHMiKTsKLSAgc3RhcnRfYXJyYXkoKTsKLSAgdmVjdG9yPHRfY29uc3QqPiBjb25zdHMgPSBwcm9ncmFtXy0+Z2V0X2NvbnN0cygpOwotICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7Ci0gICAgZ2VuZXJhdGVfY29uc3RhbnQoKmNfaXRlcik7Ci0gICAgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7Ci0gIH0KLSAgZW5kX2FycmF5KCk7Ci0KLSAgLy8gR2VuZXJhdGUgc2VydmljZXMKLSAgd3JpdGVfa2V5X2FuZCgic2VydmljZXMiKTsKLSAgc3RhcnRfYXJyYXkoKTsKLSAgdmVjdG9yPHRfc2VydmljZSo+IHNlcnZpY2VzID0gcHJvZ3JhbV8tPmdldF9zZXJ2aWNlcygpOwotICB2ZWN0b3I8dF9zZXJ2aWNlKj46Oml0ZXJhdG9yIHN2X2l0ZXI7Ci0gIGZvciAoc3ZfaXRlciA9IHNlcnZpY2VzLmJlZ2luKCk7IHN2X2l0ZXIgIT0gc2VydmljZXMuZW5kKCk7ICsrc3ZfaXRlcikgewotICAgIHdyaXRlX2NvbW1hX2lmX25lZWRlZCgpOwotICAgIGdlbmVyYXRlX3NlcnZpY2UoKnN2X2l0ZXIpOwotICAgIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOwotICB9Ci0gIGVuZF9hcnJheSgpOwotCi0gIGVuZF9vYmplY3QoKTsKLQotICAvLyBDbG9zZSB0aGUgZ2VuZXJhdG9yCi0gIGNsb3NlX2dlbmVyYXRvcigpOwotfQotCi12b2lkIHRfanNvbl9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgewotICBzdGFydF9vYmplY3QoKTsKLSAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoIm5hbWUiLCBnZXRfcXVhbGlmaWVkX25hbWUodHR5cGVkZWYpKTsKLSAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoInR5cGVJZCIsIGdldF90eXBlX25hbWUodHR5cGVkZWYtPmdldF90cnVlX3R5cGUoKSkpOwotICB3cml0ZV90eXBlX3NwZWNfb2JqZWN0KCJ0eXBlIiwgdHR5cGVkZWYtPmdldF90cnVlX3R5cGUoKSk7Ci0gIGlmICh0dHlwZWRlZi0+aGFzX2RvYygpKSB7Ci0gICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoImRvYyIsIHR0eXBlZGVmLT5nZXRfZG9jKCkpOwotICB9Ci0gIGVuZF9vYmplY3QoKTsKLX0KLQotdm9pZCB0X2pzb25fZ2VuZXJhdG9yOjp3cml0ZV9zdHJpbmcoY29uc3Qgc3RyaW5nJiB2YWx1ZSkgewotICBmX2pzb25fIDw8IHF1b3QgPDwgZXNjYXBlX2pzb25fc3RyaW5nKHZhbHVlKSA8PCBxdW90OwotfQotCi12b2lkIHRfanNvbl9nZW5lcmF0b3I6OndyaXRlX2NvbnN0X3ZhbHVlKHRfY29uc3RfdmFsdWUqIHZhbHVlLCBib29sIHNob3VsZF9mb3JjZV9zdHJpbmcpIHsKLQotICBzd2l0Y2ggKHZhbHVlLT5nZXRfdHlwZSgpKSB7Ci0KLSAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9JREVOVElGSUVSOgotICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVI6Ci0gICAgaWYgKHNob3VsZF9mb3JjZV9zdHJpbmcpIHsKLSAgICAgIHdyaXRlX3N0cmluZyhudW1iZXJfdG9fc3RyaW5nKHZhbHVlLT5nZXRfaW50ZWdlcigpKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHdyaXRlX251bWJlcih2YWx1ZS0+Z2V0X2ludGVnZXIoKSk7Ci0gICAgfQotICAgIGJyZWFrOwotCi0gIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfRE9VQkxFOgotICAgIGlmIChzaG91bGRfZm9yY2Vfc3RyaW5nKSB7Ci0gICAgICB3cml0ZV9zdHJpbmcobnVtYmVyX3RvX3N0cmluZyh2YWx1ZS0+Z2V0X2RvdWJsZSgpKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHdyaXRlX251bWJlcih2YWx1ZS0+Z2V0X2RvdWJsZSgpKTsKLSAgICB9Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9TVFJJTkc6Ci0gICAgd3JpdGVfc3RyaW5nKHZhbHVlLT5nZXRfc3RyaW5nKCkpOwotICAgIGJyZWFrOwotCi0gIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfTElTVDogewotICAgIHN0YXJ0X2FycmF5KCk7Ci0gICAgc3RkOjp2ZWN0b3I8dF9jb25zdF92YWx1ZSo+IGxpc3QgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46Oml0ZXJhdG9yIGxpdDsKLSAgICBmb3IgKGxpdCA9IGxpc3QuYmVnaW4oKTsgbGl0ICE9IGxpc3QuZW5kKCk7ICsrbGl0KSB7Ci0gICAgICB3cml0ZV9jb21tYV9pZl9uZWVkZWQoKTsKLSAgICAgIGZfanNvbl8gPDwgaW5kZW50KCk7Ci0gICAgICB3cml0ZV9jb25zdF92YWx1ZSgqbGl0KTsKLSAgICAgIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOwotICAgIH0KLSAgICBlbmRfYXJyYXkoKTsKLSAgICBicmVhazsKLSAgfQotCi0gIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfTUFQOiB7Ci0gICAgc3RhcnRfb2JqZWN0KE5PX0lOREVOVCk7Ci0gICAgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiBtYXAgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46Oml0ZXJhdG9yIG1pdDsKLSAgICBmb3IgKG1pdCA9IG1hcC5iZWdpbigpOyBtaXQgIT0gbWFwLmVuZCgpOyArK21pdCkgewotICAgICAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7Ci0gICAgICBmX2pzb25fIDw8IGluZGVudCgpOwotICAgICAgLy8gSlNPTiBvYmplY3RzIG9ubHkgYWxsb3cgc3RyaW5nIGtleXMKLSAgICAgIHdyaXRlX2NvbnN0X3ZhbHVlKG1pdC0+Zmlyc3QsIEZPUkNFX1NUUklORyk7Ci0gICAgICBmX2pzb25fIDw8ICI6ICI7Ci0gICAgICB3cml0ZV9jb25zdF92YWx1ZShtaXQtPnNlY29uZCk7Ci0gICAgICBpbmRpY2F0ZV9jb21tYV9uZWVkZWQoKTsKLSAgICB9Ci0gICAgZW5kX29iamVjdCgpOwotICAgIGJyZWFrOwotICB9Ci0KLSAgZGVmYXVsdDoKLSAgICBmX2pzb25fIDw8ICJudWxsIjsKLSAgICBicmVhazsKLSAgfQotfQotCi1zdHJpbmcgdF9qc29uX2dlbmVyYXRvcjo6anNvbl9zdHIoY29uc3Qgc3RyaW5nJiBzdHIpIHsKLSAgcmV0dXJuIHF1b3QgKyBlc2NhcGVfanNvbl9zdHJpbmcoc3RyKSArIHF1b3Q7Ci19Ci0KLXZvaWQgdF9qc29uX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RhbnQodF9jb25zdCogY29uKSB7Ci0gIHN0YXJ0X29iamVjdCgpOwotCi0gIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJuYW1lIiwgY29uLT5nZXRfbmFtZSgpKTsKLSAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoInR5cGVJZCIsIGdldF90eXBlX25hbWUoY29uLT5nZXRfdHlwZSgpKSk7Ci0gIHdyaXRlX3R5cGVfc3BlY19vYmplY3QoInR5cGUiLCBjb24tPmdldF90eXBlKCkpOwotCi0gIGlmIChjb24tPmhhc19kb2MoKSkgewotICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJkb2MiLCBjb24tPmdldF9kb2MoKSk7Ci0gIH0KLQotICB3cml0ZV9rZXlfYW5kKCJ2YWx1ZSIpOwotICB3cml0ZV9jb25zdF92YWx1ZShjb24tPmdldF92YWx1ZSgpKTsKLQotICBlbmRfb2JqZWN0KCk7Ci19Ci0KLXZvaWQgdF9qc29uX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0gIHN0YXJ0X29iamVjdCgpOwotCi0gIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJuYW1lIiwgdGVudW0tPmdldF9uYW1lKCkpOwotCi0gIGlmICh0ZW51bS0+aGFzX2RvYygpKSB7Ci0gICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoImRvYyIsIHRlbnVtLT5nZXRfZG9jKCkpOwotICB9Ci0KLSAgd3JpdGVfa2V5X2FuZCgibWVtYmVycyIpOwotICBzdGFydF9hcnJheSgpOwotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gdmFsdWVzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciB2YWxfaXRlcjsKLSAgZm9yICh2YWxfaXRlciA9IHZhbHVlcy5iZWdpbigpOyB2YWxfaXRlciAhPSB2YWx1ZXMuZW5kKCk7ICsrdmFsX2l0ZXIpIHsKLSAgICB3cml0ZV9jb21tYV9pZl9uZWVkZWQoKTsKLSAgICB0X2VudW1fdmFsdWUqIHZhbCA9ICgqdmFsX2l0ZXIpOwotICAgIHN0YXJ0X29iamVjdCgpOwotICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJuYW1lIiwgdmFsLT5nZXRfbmFtZSgpKTsKLSAgICB3cml0ZV9rZXlfYW5kX2ludGVnZXIoInZhbHVlIiwgdmFsLT5nZXRfdmFsdWUoKSk7Ci0gICAgaWYgKHZhbC0+aGFzX2RvYygpKSB7Ci0gICAgICB3cml0ZV9rZXlfYW5kX3N0cmluZygiZG9jIiwgdmFsLT5nZXRfZG9jKCkpOwotICAgIH0KLSAgICBlbmRfb2JqZWN0KCk7Ci0gICAgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7Ci0gIH0KLSAgZW5kX2FycmF5KCk7Ci0KLSAgZW5kX29iamVjdCgpOwotfQotCi12b2lkIHRfanNvbl9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdGFydF9vYmplY3QoKTsKLQotICB3cml0ZV9rZXlfYW5kX3N0cmluZygibmFtZSIsIHRzdHJ1Y3QtPmdldF9uYW1lKCkpOwotCi0gIGlmICh0c3RydWN0LT5oYXNfZG9jKCkpIHsKLSAgICB3cml0ZV9rZXlfYW5kX3N0cmluZygiZG9jIiwgdHN0cnVjdC0+Z2V0X2RvYygpKTsKLSAgfQotCi0gIHdyaXRlX2tleV9hbmRfYm9vbCgiaXNFeGNlcHRpb24iLCB0c3RydWN0LT5pc194Y2VwdGlvbigpKTsKLQotICB3cml0ZV9rZXlfYW5kX2Jvb2woImlzVW5pb24iLCB0c3RydWN0LT5pc191bmlvbigpKTsKLQotICB3cml0ZV9rZXlfYW5kKCJmaWVsZHMiKTsKLSAgc3RhcnRfYXJyYXkoKTsKLSAgdmVjdG9yPHRfZmllbGQqPiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgbWVtX2l0ZXI7Ci0gIGZvciAobWVtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1lbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7IG1lbV9pdGVyKyspIHsKLSAgICB3cml0ZV9jb21tYV9pZl9uZWVkZWQoKTsKLSAgICBnZW5lcmF0ZV9maWVsZCgqbWVtX2l0ZXIpOwotICAgIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOwotICB9Ci0gIGVuZF9hcnJheSgpOwotCi0gIGVuZF9vYmplY3QoKTsKLX0KLQotdm9pZCB0X2pzb25fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RhcnRfb2JqZWN0KCk7Ci0KLSAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoIm5hbWUiLCBnZXRfcXVhbGlmaWVkX25hbWUodHNlcnZpY2UpKTsKLQotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpIHsKLSAgICB3cml0ZV9rZXlfYW5kX3N0cmluZygiZXh0ZW5kcyIsIGdldF9xdWFsaWZpZWRfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSkpOwotICB9Ci0KLSAgaWYgKHRzZXJ2aWNlLT5oYXNfZG9jKCkpIHsKLSAgICB3cml0ZV9rZXlfYW5kX3N0cmluZygiZG9jIiwgdHNlcnZpY2UtPmdldF9kb2MoKSk7Ci0gIH0KLQotICB3cml0ZV9rZXlfYW5kKCJmdW5jdGlvbnMiKTsKLSAgc3RhcnRfYXJyYXkoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmbl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7Ci0gIGZvciAoOyBmbl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgZm5faXRlcisrKSB7Ci0gICAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7Ci0gICAgZ2VuZXJhdGVfZnVuY3Rpb24oKmZuX2l0ZXIpOwotICAgIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOwotICB9Ci0gIGVuZF9hcnJheSgpOwotCi0gIGVuZF9vYmplY3QoKTsKLX0KLQotdm9pZCB0X2pzb25fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mdW5jdGlvbih0X2Z1bmN0aW9uKiB0ZnVuYykgewotICBzdGFydF9vYmplY3QoKTsKLQotICB3cml0ZV9rZXlfYW5kX3N0cmluZygibmFtZSIsIHRmdW5jLT5nZXRfbmFtZSgpKTsKLQotICB3cml0ZV9rZXlfYW5kX3N0cmluZygicmV0dXJuVHlwZUlkIiwgZ2V0X3R5cGVfbmFtZSh0ZnVuYy0+Z2V0X3JldHVybnR5cGUoKSkpOwotICB3cml0ZV90eXBlX3NwZWNfb2JqZWN0KCJyZXR1cm5UeXBlIiwgdGZ1bmMtPmdldF9yZXR1cm50eXBlKCkpOwotCi0gIHdyaXRlX2tleV9hbmRfYm9vbCgib25ld2F5IiwgdGZ1bmMtPmlzX29uZXdheSgpKTsKLQotICBpZiAodGZ1bmMtPmhhc19kb2MoKSkgewotICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJkb2MiLCB0ZnVuYy0+Z2V0X2RvYygpKTsKLSAgfQotCi0gIHdyaXRlX2tleV9hbmQoImFyZ3VtZW50cyIpOwotICBzdGFydF9hcnJheSgpOwotICB2ZWN0b3I8dF9maWVsZCo+IG1lbWJlcnMgPSB0ZnVuYy0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgbWVtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7Ci0gIGZvciAoOyBtZW1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyBtZW1faXRlcisrKSB7Ci0gICAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7Ci0gICAgZ2VuZXJhdGVfZmllbGQoKm1lbV9pdGVyKTsKLSAgICBpbmRpY2F0ZV9jb21tYV9uZWVkZWQoKTsKLSAgfQotICBlbmRfYXJyYXkoKTsKLQotICB3cml0ZV9rZXlfYW5kKCJleGNlcHRpb25zIik7Ci0gIHN0YXJ0X2FycmF5KCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj4gZXhjZXB0cyA9IHRmdW5jLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIGV4X2l0ZXIgPSBleGNlcHRzLmJlZ2luKCk7Ci0gIGZvciAoOyBleF9pdGVyICE9IGV4Y2VwdHMuZW5kKCk7IGV4X2l0ZXIrKykgewotICAgIHdyaXRlX2NvbW1hX2lmX25lZWRlZCgpOwotICAgIGdlbmVyYXRlX2ZpZWxkKCpleF9pdGVyKTsKLSAgICBpbmRpY2F0ZV9jb21tYV9uZWVkZWQoKTsKLSAgfQotICBlbmRfYXJyYXkoKTsKLQotICBlbmRfb2JqZWN0KCk7Ci19Ci0KLXZvaWQgdF9qc29uX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGQodF9maWVsZCogZmllbGQpIHsKLSAgc3RhcnRfb2JqZWN0KCk7Ci0KLSAgd3JpdGVfa2V5X2FuZF9pbnRlZ2VyKCJrZXkiLCBmaWVsZC0+Z2V0X2tleSgpKTsKLSAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoIm5hbWUiLCBmaWVsZC0+Z2V0X25hbWUoKSk7Ci0gIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJ0eXBlSWQiLCBnZXRfdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpKSk7Ci0gIHdyaXRlX3R5cGVfc3BlY19vYmplY3QoInR5cGUiLCBmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgaWYgKGZpZWxkLT5oYXNfZG9jKCkpIHsKLSAgICB3cml0ZV9rZXlfYW5kX3N0cmluZygiZG9jIiwgZmllbGQtPmdldF9kb2MoKSk7Ci0gIH0KLQotICB3cml0ZV9rZXlfYW5kKCJyZXF1aXJlZCIpOwotICBzd2l0Y2ggKGZpZWxkLT5nZXRfcmVxKCkpIHsKLSAgY2FzZSB0X2ZpZWxkOjpUX1JFUVVJUkVEOgotICAgIHdyaXRlX3N0cmluZygicmVxdWlyZWQiKTsKLSAgICBicmVhazsKLSAgY2FzZSB0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUOgotICAgIHdyaXRlX3N0cmluZygicmVxX291dCIpOwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIHdyaXRlX3N0cmluZygib3B0aW9uYWwiKTsKLSAgICBicmVhazsKLSAgfQotCi0gIGlmIChmaWVsZC0+Z2V0X3ZhbHVlKCkpIHsKLSAgICB3cml0ZV9rZXlfYW5kKCJkZWZhdWx0Iik7Ci0gICAgd3JpdGVfY29uc3RfdmFsdWUoZmllbGQtPmdldF92YWx1ZSgpKTsKLSAgfQotCi0gIGVuZF9vYmplY3QoKTsKLX0KLQotc3RyaW5nIHRfanNvbl9nZW5lcmF0b3I6OmdldF90eXBlX25hbWUodF90eXBlKiB0dHlwZSkgewotICB0dHlwZSA9IHR0eXBlLT5nZXRfdHJ1ZV90eXBlKCk7Ci0gIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJsaXN0IjsKLSAgfQotICBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICJzZXQiOwotICB9Ci0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIm1hcCI7Ci0gIH0KLSAgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gImkzMiI7Ci0gIH0KLSAgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSkgewotICAgIHJldHVybiAoKHRfc3RydWN0Kil0dHlwZSktPmlzX3VuaW9uKCkgPyAidW5pb24iIDogInN0cnVjdCI7Ci0gIH0KLSAgaWYgKHR0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuICJleGNlcHRpb24iOwotICB9Ci0gIC8vaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAoKHRfYmFzZV90eXBlKil0dHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gIHJldHVybiAiYmluYXJ5IjsKLX0KLQotc3RyaW5nIHRfanNvbl9nZW5lcmF0b3I6OmdldF9xdWFsaWZpZWRfbmFtZSh0X3R5cGUqIHR0eXBlKSB7Ci0gIGlmIChzaG91bGRfbWVyZ2VfaW5jbHVkZXNfIHx8IHR0eXBlLT5nZXRfcHJvZ3JhbSgpID09IHByb2dyYW1fKSB7Ci0gICAgcmV0dXJuIHR0eXBlLT5nZXRfbmFtZSgpOwotICB9Ci0gIHJldHVybiB0dHlwZS0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKSArICIuIiArIHR0eXBlLT5nZXRfbmFtZSgpOwotfQotCi1USFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKGpzb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJKU09OIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBtZXJnZTogICAgICAgICAgIEdlbmVyYXRlIG91dHB1dCB3aXRoIGluY2x1ZGVkIGZpbGVzIG1lcmdlZFxuIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9sdWFfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2x1YV9nZW5lcmF0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjYThhZTAuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2x1YV9nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMTI3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSAidF9vb3BfZ2VuZXJhdG9yLmgiCi0jaW5jbHVkZSAicGxhdGZvcm0uaCIKLQotdXNpbmcgc3RkOjpvZnN0cmVhbTsKLXVzaW5nIHN0ZDo6c3RyaW5nOwotdXNpbmcgc3RkOjp2ZWN0b3I7Ci11c2luZyBzdGQ6Om1hcDsKLQotc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcwotCi0vKioKLSAqIExVQSBjb2RlIGdlbmVyYXRvci4KLSAqCi0gKi8KLWNsYXNzIHRfbHVhX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgewotcHVibGljOgotICB0X2x1YV9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAotICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKLSAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKSB7Ci0gICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKLSAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoIm9taXRfcmVxdWlyZXMiKTsKLSAgICBnZW5fcmVxdWlyZXNfID0gKGl0ZXIgPT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tbHVhIjsKLSAgfQotCi0gIC8qKgotICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCi0gICAqLwotICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7Ci0gIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7Ci0KLSAgLyoqCi0gICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0gIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKLSAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOwotICB2b2lkIGdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOwotCi0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKLQotcHJpdmF0ZToKLSAgLyoqCi0gICAqIFRydWUgaWZmIHdlIHNob3VsZCBnZW5lcmF0ZSBsdWEgcmVxdWlyZSBzdGF0ZW1lbnRzLgotICAgKi8KLSAgYm9vbCBnZW5fcmVxdWlyZXNfOwotCi0gIC8qKgotICAgKiBTdHJ1Y3QtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0gIHZvaWQgZ2VuZXJhdGVfbHVhX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfbHVhX3N0cnVjdF9yZWFkZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfbHVhX3N0cnVjdF93cml0ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0KLSAgLyoqCi0gICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZShzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKG9mc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnMob2ZzdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICAvKioKLSAgICogRGVzZXJpYWxpemF0aW9uIChSZWFkKQotICAgKi8KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbG9jYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbG9jYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbG9jYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICAvKioKLSAgICogU2VyaWFsaXphdGlvbiAoV3JpdGUpCi0gICAqLwotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGtpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2aXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgLyoqCi0gICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCi0gICAqLwotICBzdGQ6OnN0cmluZyBsdWFfaW5jbHVkZXMoKTsKLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKLSAgc3RhdGljIHN0ZDo6c3RyaW5nIGdldF9uYW1lc3BhY2UoY29uc3QgdF9wcm9ncmFtKiBwcm9ncmFtKTsKLQotICBzdGQ6OnN0cmluZyBhdXRvZ2VuX2NvbW1lbnQoKSB7Ci0gICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCItLVxuIikgKyAiLS0gQXV0b2dlbmVyYXRlZCBieSBUaHJpZnRcbiIgKyAiLS1cbiIKLSAgICAgICAgICAgKyAiLS0gRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lOR1xuIiArICItLSBAIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdlbmVyYXRlZFxuIgotICAgICAgICAgICArICItLVxuIjsKLSAgfQotCi0gIC8qKgotICAgKiBGaWxlIHN0cmVhbXMKLSAgICovCi0gIHN0ZDo6b2ZzdHJlYW0gZl90eXBlc187Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9jb25zdHNfOwotICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZV87Ci19OwotCi0vKioKLSAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKLSAqLwotdm9pZCB0X2x1YV9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgewotICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKLSAgc3RyaW5nIG91dGRpciA9IGdldF9vdXRfZGlyKCk7Ci0gIE1LRElSKG91dGRpci5jX3N0cigpKTsKLQotICAvLyBNYWtlIG91dHB1dCBmaWxlcwotICBzdHJpbmcgY3VyX25hbWVzcGFjZSA9IGdldF9uYW1lc3BhY2UocHJvZ3JhbV8pOwotICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IG91dGRpciArIGN1cl9uYW1lc3BhY2UgKyAiY29uc3RhbnRzLmx1YSI7Ci0gIGZfY29uc3RzXy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7Ci0gIHN0cmluZyBmX3R5cGVzX25hbWUgPSBvdXRkaXIgKyBjdXJfbmFtZXNwYWNlICsgInR0eXBlcy5sdWEiOwotICBmX3R5cGVzXy5vcGVuKGZfdHlwZXNfbmFtZS5jX3N0cigpKTsKLQotICAvLyBBZGQgaGVhZGVycwotICBmX2NvbnN0c18gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgbHVhX2luY2x1ZGVzKCk7Ci0gIGZfdHlwZXNfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGx1YV9pbmNsdWRlcygpOwotICBpZiAoZ2VuX3JlcXVpcmVzXykgewotICAgIGZfdHlwZXNfIDw8IGVuZGwgPDwgInJlcXVpcmUgJyIgPDwgY3VyX25hbWVzcGFjZSA8PCAiY29uc3RhbnRzJyI7Ci0gIH0KLX0KLQotdm9pZCB0X2x1YV9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKLSAgLy8gQ2xvc2UgdHlwZXMgZmlsZQotICBmX3R5cGVzXy5jbG9zZSgpOwotICBmX2NvbnN0c18uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZSBhIHR5cGVkZWYgKGVzc2VudGlhbGx5IGEgY29uc3RhbnQpCi0gKi8KLXZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKLSAgZl90eXBlc18gPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHR0eXBlZGVmLT5nZXRfc3ltYm9saWMoKSA8PCAiID0gIgotICAgICAgICAgICA8PCB0dHlwZWRlZi0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgY29kZSBmb3IgYW4gZW51bWVyYXRlZCB0eXBlICh0YWJsZSkKLSAqLwotdm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgewotICBmX3R5cGVzXyA8PCBlbmRsIDw8IGVuZGwgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIiA9IHsiIDw8IGVuZGw7Ci0KLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOwotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOykgewotICAgIGludDMyX3QgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotCi0gICAgZl90eXBlc18gPDwgIiAgIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgdmFsdWU7Ci0gICAgKytjX2l0ZXI7Ci0gICAgaWYgKGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCkpIHsKLSAgICAgIGZfdHlwZXNfIDw8ICIsIjsKLSAgICB9Ci0gICAgZl90eXBlc18gPDwgZW5kbDsKLSAgfQotICBmX3R5cGVzXyA8PCAifSI7Ci19Ci0KLS8qKgotICogR2VuZXJhdGUgYSBjb25zdGFudCAobm9uLWxvY2FsKSB2YWx1ZQotICovCi12b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7Ci0gIHRfdHlwZSogdHlwZSA9IHRjb25zdC0+Z2V0X3R5cGUoKTsKLSAgc3RyaW5nIG5hbWUgPSB0Y29uc3QtPmdldF9uYW1lKCk7Ci0gIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gdGNvbnN0LT5nZXRfdmFsdWUoKTsKLQotICBmX2NvbnN0c18gPDwgZW5kbCA8PCBlbmRsIDw8IG5hbWUgPDwgIiA9ICI7Ci0gIGZfY29uc3RzXyA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpOwotfQotCi0vKioKLSAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLgotICovCi1zdHJpbmcgdF9sdWFfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotCi0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgb3V0IDw8ICInIiA8PCB2YWx1ZS0+Z2V0X3N0cmluZygpIDw8ICInIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIG91dCA8PCAodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwID8gInRydWUiIDogImZhbHNlIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIG91dCA8PCAibHVhbG9uZ251bWJlci5uZXcoJyIgPDwgdmFsdWUtPmdldF9zdHJpbmcoKSA8PCAiJykiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBvdXQgPDwgdHlwZS0+Z2V0X25hbWUoKSA8PCAiID0geyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7KSB7Ci0gICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOwotICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKLSAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICB9Ci0KLSAgICAgIGluZGVudChvdXQpOwotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShnX3R5cGVfc3RyaW5nLCB2X2l0ZXItPmZpcnN0KTsKLSAgICAgIG91dCA8PCAiID0gIjsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgKyt2X2l0ZXI7Ci0gICAgICBpZiAodl9pdGVyICE9IHZhbC5lbmQoKSkgewotICAgICAgICBvdXQgPDwgIiwiOwotICAgICAgfQotICAgIH0KLQotICAgIG91dCA8PCAifSI7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIG91dCA8PCB0eXBlLT5nZXRfbmFtZSgpIDw8ICJ7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotCi0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOykgewotICAgICAgaW5kZW50KG91dCkgPDwgIlsiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgdl9pdGVyLT5maXJzdCkKLSAgICAgICAgICAgICAgICAgIDw8ICJdID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgICsrdl9pdGVyOwotICAgICAgaWYgKHZfaXRlciAhPSB2YWwuZW5kKCkpIHsKLSAgICAgICAgb3V0IDw8ICIsIjsKLSAgICAgIH0KLSAgICAgIG91dCA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlOwotICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9Ci0gICAgb3V0IDw8IHR5cGUtPmdldF9uYW1lKCkgPDwgIiA9IHsiIDw8IGVuZGw7Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7KSB7Ci0gICAgICBpbmRlbnQob3V0KTsKLSAgICAgIG91dCA8PCAiWyIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKSA8PCAiXSI7Ci0gICAgICBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgICAgb3V0IDw8ICIgPSB0cnVlIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCAiID0gZmFsc2UiOwotICAgICAgfQotICAgICAgKyt2X2l0ZXI7Ci0gICAgICBpZiAodl9pdGVyICE9IHZhbC5lbmQoKSkgewotICAgICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICAgIG91dCA8PCAifSI7Ci0gIH0KLSAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZSBhIHRocmlmdCBzdHJ1Y3QKLSAqLwotdm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBnZW5lcmF0ZV9sdWFfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHRzdHJ1Y3QsIGZhbHNlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZSBhIHRocmlmdCBleGNlcHRpb24KLSAqLwotdm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfbHVhX3N0cnVjdF9kZWZpbml0aW9uKGZfdHlwZXNfLCB0eGNlcHRpb24sIHRydWUpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlIGEgdGhyaWZ0IHN0cnVjdCBvciBleGNlcHRpb24gKGx1YSB0YWJsZSkKLSAqLwotdm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2x1YV9zdHJ1Y3RfZGVmaW5pdGlvbihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLQotICBpbmRlbnQob3V0KSA8PCBlbmRsIDw8IGVuZGwgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIG91dCA8PCAiID0gVEV4Y2VwdGlvbjpuZXd7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIF9fdHlwZSA9ICciIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiciOwotICAgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICAgIG91dCA8PCAiLCI7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIG91dCA8PCAiID0gX19UT2JqZWN0Om5ld3siIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X3VwKCk7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTspIHsKLSAgICBpbmRlbnQob3V0KTsKLSAgICBvdXQgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICsrbV9pdGVyOwotICAgIGlmIChtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKSkgewotICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOwotICAgIH0KLSAgfQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KTsKLSAgb3V0IDw8IGVuZGwgPDwgIn0iOwotCi0gIGdlbmVyYXRlX2x1YV9zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX2x1YV9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGUgYSBzdHJ1Y3QvZXhjZXB0aW9uIHJlYWRlcgotICovCi12b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbHVhX3N0cnVjdF9yZWFkZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIC8vIGZ1bmN0aW9uCi0gIGluZGVudChvdXQpIDw8IGVuZGwgPDwgZW5kbCA8PCAiZnVuY3Rpb24gIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI6cmVhZChpcHJvdCkiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChvdXQpIDw8ICJpcHJvdDpyZWFkU3RydWN0QmVnaW4oKSIgPDwgZW5kbDsKLQotICAvLyB3aGlsZTogUmVhZCBpbiBmaWVsZHMKLSAgaW5kZW50KG91dCkgPDwgIndoaWxlIHRydWUgZG8iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIC8vIGlmOiBDaGVjayB3aGF0IHRvIHJlYWQKLSAgaW5kZW50KG91dCkgPDwgImxvY2FsIGZuYW1lLCBmdHlwZSwgZmlkID0gaXByb3Q6cmVhZEZpZWxkQmVnaW4oKSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgImlmIGZ0eXBlID09IFRUeXBlLlNUT1AgdGhlbiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJicmVhayIgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgImVsc2VpZiBmaWQgPT0gIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiIHRoZW4iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgImlmIGZ0eXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiB0aGVuIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgLy8gUmVhZCBmaWVsZCBjb250ZW50cwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgZmFsc2UsICJzZWxmLiIpOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiZWxzZSIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICBpcHJvdDpza2lwKGZ0eXBlKSIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gZW5kIGlmCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJlbHNlIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICBpcHJvdDpza2lwKGZ0eXBlKSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgImlwcm90OnJlYWRGaWVsZEVuZCgpIiA8PCBlbmRsOwotCi0gIC8vIGVuZCB3aGlsZQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiaXByb3Q6cmVhZFN0cnVjdEVuZCgpIiA8PCBlbmRsOwotCi0gIC8vIGVuZCBmdW5jdGlvbgotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KTsKLSAgb3V0IDw8ICJlbmQiOwotfQotCi0vKioKLSAqIEdlbmVyYXRlIGEgc3RydWN0L2V4Y2VwdGlvbiB3cml0ZXIKLSAqLwotdm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2x1YV9zdHJ1Y3Rfd3JpdGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICAvLyBmdW5jdGlvbgotICBpbmRlbnQob3V0KSA8PCBlbmRsIDw8IGVuZGwgPDwgImZ1bmN0aW9uICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiOndyaXRlKG9wcm90KSIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgIm9wcm90OndyaXRlU3RydWN0QmVnaW4oJyIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJykiIDw8IGVuZGw7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImlmIHNlbGYuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiB0aGVuIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdDp3cml0ZUZpZWxkQmVnaW4oJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCAiCi0gICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiKSIKLSAgICAgICAgICAgICAgICA8PCBlbmRsOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAic2VsZi4iKTsKLQotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdDp3cml0ZUZpZWxkRW5kKCkiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOwotICB9Ci0gIGluZGVudChvdXQpIDw8ICJvcHJvdDp3cml0ZUZpZWxkU3RvcCgpIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAib3Byb3Q6d3JpdGVTdHJ1Y3RFbmQoKSIgPDwgZW5kbDsKLQotICAvLyBlbmQgZnVuY3Rpb24KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCk7Ci0gIG91dCA8PCAiZW5kIjsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZSBhIHRocmlmdCBzZXJ2aWNlCi0gKi8KLXZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgLy8gR2V0IG91dHB1dCBkaXJlY3RvcnkKLSAgc3RyaW5nIG91dGRpciA9IGdldF9vdXRfZGlyKCk7Ci0KLSAgLy8gT3BlbiB0aGUgZmlsZSBmb3Igd3JpdGluZwotICBzdHJpbmcgY3VyX25zID0gZ2V0X25hbWVzcGFjZShwcm9ncmFtXyk7Ci0gIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IG91dGRpciArIGN1cl9ucyArIHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIi5sdWEiOwotICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7Ci0KLSAgLy8gSGVhZGVycwotICBmX3NlcnZpY2VfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGx1YV9pbmNsdWRlcygpOwotICBpZiAoZ2VuX3JlcXVpcmVzXykgewotICAgIGZfc2VydmljZV8gPDwgZW5kbCA8PCAicmVxdWlyZSAnIiA8PCBjdXJfbnMgPDwgInR0eXBlcyciIDw8IGVuZGw7Ci0KLSAgICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgICAgZl9zZXJ2aWNlXyA8PCAicmVxdWlyZSAnIiA8PCBnZXRfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfcHJvZ3JhbSgpKQotICAgICAgICAgICAgICAgICA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSA8PCAiJyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZShmX3NlcnZpY2VfLCB0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKLQotICAvLyBDbG9zZSB0aGUgZmlsZQotICBmX3NlcnZpY2VfLmNsb3NlKCk7Ci19Ci0KLXZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZShvZnN0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBjbGFzc25hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKSArICJJZmFjZSI7Ci0gIHRfc2VydmljZSogZXh0ZW5kc19zID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7Ci0KLSAgLy8gSW50ZXJmYWNlIG9iamVjdCBkZWZpbml0aW9uCi0gIG91dCA8PCBjbGFzc25hbWUgPDwgIiA9ICI7Ci0gIGlmIChleHRlbmRzX3MpIHsKLSAgICBvdXQgPDwgZXh0ZW5kc19zLT5nZXRfbmFtZSgpIDw8ICJJZmFjZTpuZXd7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIG91dCA8PCAiX19UT2JqZWN0Om5ld3siIDw8IGVuZGw7Ci0gIH0KLSAgb3V0IDw8ICIgIF9fdHlwZSA9ICciIDw8IGNsYXNzbmFtZSA8PCAiJyIgPDwgZW5kbCA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQob2ZzdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgY2xhc3NuYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiQ2xpZW50IjsKLSAgdF9zZXJ2aWNlKiBleHRlbmRzX3MgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKLQotICAvLyBDbGllbnQgb2JqZWN0IGRlZmluaXRpb24KLSAgb3V0IDw8IGNsYXNzbmFtZSA8PCAiID0gX19UT2JqZWN0Lm5ldygiOwotICBpZiAoZXh0ZW5kc19zICE9IE5VTEwpIHsKLSAgICBvdXQgPDwgZXh0ZW5kc19zLT5nZXRfbmFtZSgpIDw8ICJDbGllbnQiOwotICB9IGVsc2UgewotICAgIG91dCA8PCAiX19UQ2xpZW50IjsKLSAgfQotICBvdXQgPDwgIiwgeyIgPDwgZW5kbCA8PCAiICBfX3R5cGUgPSAnIiA8PCBjbGFzc25hbWUgPDwgIiciIDw8IGVuZGwgPDwgIn0pIiA8PCBlbmRsOwotCi0gIC8vIFNlbmQvUmVjdiBmdW5jdGlvbnMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyaW5nIHNpZyA9IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKTsKLSAgICBzdHJpbmcgZnVuY25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0KLSAgICAvLyBXcmFwcGVyIGZ1bmN0aW9uCi0gICAgaW5kZW50KG91dCkgPDwgZW5kbCA8PCAiZnVuY3Rpb24gIiA8PCBjbGFzc25hbWUgPDwgIjoiIDw8IHNpZyA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgaW5kZW50KG91dCkgPDwgInNlbGY6c2VuZF8iIDw8IHNpZyA8PCBlbmRsIDw8IGluZGVudCgpOwotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBvdXQgPDwgInJldHVybiAiOwotICAgICAgfQotICAgICAgb3V0IDw8ICJzZWxmOnJlY3ZfIiA8PCBzaWcgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGw7Ci0KLSAgICAvLyBTZW5kIGZ1bmN0aW9uCi0gICAgaW5kZW50KG91dCkgPDwgZW5kbCA8PCAiZnVuY3Rpb24gIiA8PCBjbGFzc25hbWUgPDwgIjpzZW5kXyIgPDwgc2lnIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAic2VsZi5vcHJvdDp3cml0ZU1lc3NhZ2VCZWdpbignIiA8PCBmdW5jbmFtZSA8PCAiJywgIgotICAgICAgICAgICAgICAgIDw8ICgoKmZfaXRlciktPmlzX29uZXdheSgpID8gIlRNZXNzYWdlVHlwZS5PTkVXQVkiIDogIlRNZXNzYWdlVHlwZS5DQUxMIikKLSAgICAgICAgICAgICAgICA8PCAiLCBzZWxmLl9zZXFpZCkiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgImxvY2FsIGFyZ3MgPSAiIDw8IGZ1bmNuYW1lIDw8ICJfYXJnczpuZXd7fSIgPDwgZW5kbDsKLQotICAgIC8vIFNldCB0aGUgYXJncwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGFyZ3MgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7Ci0gICAgZm9yIChmbGRfaXRlciA9IGFyZ3MuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gYXJncy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgc3RkOjpzdHJpbmcgYXJnbmFtZSA9ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgaW5kZW50KG91dCkgPDwgImFyZ3MuIiA8PCBhcmduYW1lIDw8ICIgPSAiIDw8IGFyZ25hbWUgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAiYXJnczp3cml0ZShzZWxmLm9wcm90KSIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAic2VsZi5vcHJvdDp3cml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAic2VsZi5vcHJvdC50cmFuczpmbHVzaCgpIiA8PCBlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOwotCi0gICAgLy8gUmVjdiBmdW5jdGlvbgotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgZW5kbCA8PCAiZnVuY3Rpb24gIiA8PCBjbGFzc25hbWUgPDwgIjpyZWN2XyIgPDwgc2lnIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLQotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJsb2NhbCBmbmFtZSwgbXR5cGUsIHJzZXFpZCA9IHNlbGYuaXByb3Q6IgotICAgICAgICAgIDw8ICJyZWFkTWVzc2FnZUJlZ2luKCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmIG10eXBlID09IFRNZXNzYWdlVHlwZS5FWENFUFRJT04gdGhlbiIKLSAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIGxvY2FsIHggPSBUQXBwbGljYXRpb25FeGNlcHRpb246bmV3e30iIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICA8PCAiICB4OnJlYWQoc2VsZi5pcHJvdCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgc2VsZi5pcHJvdDpyZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsCi0gICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgZXJyb3IoeCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgIDw8ICJsb2NhbCByZXN1bHQgPSAiIDw8IGZ1bmNuYW1lIDw8ICJfcmVzdWx0Om5ld3t9IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgPDwgInJlc3VsdDpyZWFkKHNlbGYuaXByb3QpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJzZWxmLmlwcm90OnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGw7Ci0KLSAgICAgIC8vIFJldHVybiB0aGUgcmVzdWx0IGlmIGl0J3Mgbm90IGEgdm9pZCBmdW5jdGlvbgotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIHJlc3VsdC5zdWNjZXNzIHRoZW4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHJlc3VsdC5zdWNjZXNzIgotICAgICAgICAgICAgPDwgZW5kbDsKLQotICAgICAgICAvLyBUaHJvdyBjdXN0b20gZXhjZXB0aW9ucwotICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhmID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCk7Ci0gICAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgICAgICAgZm9yICh4X2l0ZXIgPSB4Zi5iZWdpbigpOyB4X2l0ZXIgIT0geGYuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJlbHNlaWYgcmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgdGhlbiIgPDwgZW5kbAotICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICBlcnJvcihyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIikiIDw8IGVuZGw7Ci0gICAgICAgIH0KLQotICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgPDwgImVycm9yKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjpuZXd7ZXJyb3JDb2RlID0gIgotICAgICAgICAgICAgPDwgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5NSVNTSU5HX1JFU1VMVH0pIiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKG9mc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGNsYXNzbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIlByb2Nlc3NvciI7Ci0gIHRfc2VydmljZSogZXh0ZW5kc19zID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7Ci0KLSAgLy8gRGVmaW5lIHByb2Nlc3NvciB0YWJsZQotICBvdXQgPDwgZW5kbCA8PCBjbGFzc25hbWUgPDwgIiA9IF9fVE9iamVjdC5uZXcoIjsKLSAgaWYgKGV4dGVuZHNfcyAhPSBOVUxMKSB7Ci0gICAgb3V0IDw8IGV4dGVuZHNfcyA8PCAiUHJvY2Vzc29yIiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIG91dCA8PCAiX19UUHJvY2Vzc29yIiA8PCBlbmRsOwotICB9Ci0gIG91dCA8PCAiLCB7IiA8PCBlbmRsIDw8ICIgX190eXBlID0gJyIgPDwgY2xhc3NuYW1lIDw8ICInIiA8PCBlbmRsIDw8ICJ9KSIgPDwgZW5kbDsKLQotICAvLyBQcm9jZXNzIGZ1bmN0aW9uCi0gIGluZGVudChvdXQpIDw8IGVuZGwgPDwgImZ1bmN0aW9uICIgPDwgY2xhc3NuYW1lIDw8ICI6cHJvY2VzcyhpcHJvdCwgb3Byb3QsIHNlcnZlcl9jdHgpIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQob3V0KSA8PCAibG9jYWwgbmFtZSwgbXR5cGUsIHNlcWlkID0gaXByb3Q6cmVhZE1lc3NhZ2VCZWdpbigpIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAibG9jYWwgZnVuY19uYW1lID0gJ3Byb2Nlc3NfJyAuLiBuYW1lIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiaWYgbm90IHNlbGZbZnVuY19uYW1lXSBvciB0dHlwZShzZWxmW2Z1bmNfbmFtZV0pIH49ICdmdW5jdGlvbicgdGhlbiI7Ci0gIGluZGVudF91cCgpOwotICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaXByb3Q6c2tpcChUVHlwZS5TVFJVQ1QpIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICA8PCAiaXByb3Q6cmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieCA9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjpuZXd7IiA8PCBlbmRsCi0gICAgICA8PCBpbmRlbnQoKSA8PCAiICBlcnJvckNvZGUgPSBUQXBwbGljYXRpb25FeGNlcHRpb24uVU5LTk9XTl9NRVRIT0QiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iCi0gICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdDp3cml0ZU1lc3NhZ2VCZWdpbihuYW1lLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCAiCi0gICAgICA8PCAic2VxaWQpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ4OndyaXRlKG9wcm90KSIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgPDwgIm9wcm90OndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC50cmFuczpmbHVzaCgpIiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAiZWxzZSIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICA8PCAiICBzZWxmW2Z1bmNfbmFtZV0oc2VsZiwgc2VxaWQsIGlwcm90LCBvcHJvdCwgc2VydmVyX2N0eCkiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgPDwgImVuZCIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKG91dCwgdHNlcnZpY2UsICpmX2l0ZXIpOwotICB9Ci19Ci0KLXZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UqIHRzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIHN0cmluZyBjbGFzc25hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKSArICJQcm9jZXNzb3IiOwotICBzdHJpbmcgYXJnc25hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiOwotICBzdHJpbmcgcmVzdWx0bmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKLSAgc3RyaW5nIGZuX25hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgZW5kbCA8PCAiZnVuY3Rpb24gIiA8PCBjbGFzc25hbWUgPDwgIjpwcm9jZXNzXyIgPDwgZm5fbmFtZQotICAgICAgICAgICAgICA8PCAiKHNlcWlkLCBpcHJvdCwgb3Byb3QsIHNlcnZlcl9jdHgpIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICAvLyBSZWFkIHRoZSByZXF1ZXN0Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAibG9jYWwgYXJncyA9ICIgPDwgYXJnc25hbWUgPDwgIjpuZXd7fSIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgPDwgImxvY2FsIHJlcGx5X3R5cGUgPSBUTWVzc2FnZVR5cGUuUkVQTFkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImFyZ3M6cmVhZChpcHJvdCkiIDw8IGVuZGwKLSAgICAgIDw8IGluZGVudCgpIDw8ICJpcHJvdDpyZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJsb2NhbCByZXN1bHQgPSAiIDw8IHJlc3VsdG5hbWUKLSAgICAgIDw8ICI6bmV3e30iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImxvY2FsIHN0YXR1cywgcmVzID0gcGNhbGwoc2VsZi5oYW5kbGVyLiIgPDwgZm5fbmFtZQotICAgICAgPDwgIiwgc2VsZi5oYW5kbGVyIjsKLQotICAvLyBQcmludCBhcmd1bWVudHMKLSAgdF9zdHJ1Y3QqIGFyZ3MgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7Ci0gIGlmIChhcmdzLT5nZXRfbWVtYmVycygpLnNpemUoKSA+IDApIHsKLSAgICBvdXQgPDwgIiwgIiA8PCBhcmd1bWVudF9saXN0KGFyZ3MsICJhcmdzLiIpOwotICB9Ci0KLSAgLy8gQ2hlY2sgZm9yIGVycm9ycwotICBvdXQgPDwgIikiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmIG5vdCBzdGF0dXMgdGhlbiIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgPDwgIiAgcmVwbHlfdHlwZSA9IFRNZXNzYWdlVHlwZS5FWENFUFRJT04iIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgIDw8ICIgIHJlc3VsdCA9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjpuZXd7bWVzc2FnZSA9IHJlc30iIDw8IGVuZGw7Ci0KLSAgLy8gSGFuZGxlIGN1c3RvbSBleGNlcHRpb25zCi0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGYgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKTsKLSAgaWYgKHhmLnNpemUoKSA+IDApIHsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gICAgZm9yICh4X2l0ZXIgPSB4Zi5iZWdpbigpOyB4X2l0ZXIgIT0geGYuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImVsc2VpZiB0dHlwZShyZXMpID09ICciIDw8ICgqeF9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSA8PCAiJyB0aGVuIgotICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSByZXMiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgLy8gU2V0IHRoZSByZXN1bHQgYW5kIHdyaXRlIHRoZSByZXBseQotICBvdXQgPDwgaW5kZW50KCkgPDwgImVsc2UiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmVzdWx0LnN1Y2Nlc3MgPSByZXMiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgIDw8ICJlbmQiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90OndyaXRlTWVzc2FnZUJlZ2luKCciIDw8IGZuX25hbWUgPDwgIicsIHJlcGx5X3R5cGUsICIKLSAgICAgIDw8ICJzZXFpZCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJlc3VsdDp3cml0ZShvcHJvdCkiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgIDw8ICJvcHJvdDp3cml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3QudHJhbnM6Zmx1c2goKSIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOwotfQotCi0vLyBTZXJ2aWNlIGhlbHBlcnMKLXZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnMob2ZzdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSkgewotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICBvdXQgPDwgZW5kbCA8PCAiLS0gSEVMUEVSIEZVTkNUSU9OUyBBTkQgU1RSVUNUVVJFUyI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGdlbmVyYXRlX2x1YV9zdHJ1Y3RfZGVmaW5pdGlvbihvdXQsIHRzLCBmYWxzZSk7Ci0gICAgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyhvdXQsICpmX2l0ZXIpOwotICB9Ci19Ci0KLXZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKG9mc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7Ci0gICAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKLSAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKLSAgICB9Ci0KLSAgICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7Ci0gICAgfQotICAgIGdlbmVyYXRlX2x1YV9zdHJ1Y3RfZGVmaW5pdGlvbihvdXQsICZyZXN1bHQsIGZhbHNlKTsKLSAgfQotfQotCi0vKioKLSAqIERlc2VyaWFsaXplIChSZWFkKQotICovCi12b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsb2NhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbG9jYWwsIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbG9jYWwsIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotICAgIGluZGVudChvdXQpIDw8IChsb2NhbCA/ICJsb2NhbCAiIDogIiIpIDw8IG5hbWUgPDwgIiA9IGlwcm90OiI7Ci0KLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBvdXQgPDwgInJlYWRTdHJpbmcoKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBvdXQgPDwgInJlYWRCb29sKCkiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgb3V0IDw8ICJyZWFkQnl0ZSgpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgb3V0IDw8ICJyZWFkSTE2KCkiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBvdXQgPDwgInJlYWRJMzIoKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIG91dCA8PCAicmVhZEk2NCgpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgb3V0IDw8ICJyZWFkRG91YmxlKCkiOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gUEhQIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgb3V0IDw8ICJyZWFkSTMyKCkiOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLQotICB9IGVsc2UgewotICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAotICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKLSAgICAgICAgICAgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKLSAgfQotfQotCi12b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGxvY2FsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIGluZGVudChvdXQpIDw8IChsb2NhbCA/ICJsb2NhbCAiIDogIiIpIDw8IHByZWZpeCA8PCAiID0gIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI6bmV3e30iCi0gICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICI6cmVhZChpcHJvdCkiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsb2NhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcgc2l6ZSA9IHRtcCgiX3NpemUiKTsKLSAgc3RyaW5nIGt0eXBlID0gdG1wKCJfa3R5cGUiKTsKLSAgc3RyaW5nIHZ0eXBlID0gdG1wKCJfdnR5cGUiKTsKLSAgc3RyaW5nIGV0eXBlID0gdG1wKCJfZXR5cGUiKTsKLQotICB0X2ZpZWxkIGZzaXplKGdfdHlwZV9pMzIsIHNpemUpOwotICB0X2ZpZWxkIGZrdHlwZShnX3R5cGVfYnl0ZSwga3R5cGUpOwotICB0X2ZpZWxkIGZ2dHlwZShnX3R5cGVfYnl0ZSwgdnR5cGUpOwotICB0X2ZpZWxkIGZldHlwZShnX3R5cGVfYnl0ZSwgZXR5cGUpOwotCi0gIC8vIERlY2xhcmUgdmFyaWFibGVzLCByZWFkIGhlYWRlcgotICBpbmRlbnQob3V0KSA8PCAobG9jYWwgPyAibG9jYWwgIiA6ICIiKSA8PCBwcmVmaXggPDwgIiA9IHt9IiA8PCBlbmRsOwotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImxvY2FsICIgPDwga3R5cGUgPDwgIiwgIiA8PCB2dHlwZSA8PCAiLCAiIDw8IHNpemUgPDwgIiA9IGlwcm90OnJlYWRNYXBCZWdpbigpICIKLSAgICAgICAgICAgICAgICA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJsb2NhbCAiIDw8IGV0eXBlIDw8ICIsICIgPDwgc2l6ZSA8PCAiID0gaXByb3Q6cmVhZFNldEJlZ2luKCkiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJsb2NhbCAiIDw8IGV0eXBlIDw8ICIsICIgPDwgc2l6ZSA8PCAiID0gaXByb3Q6cmVhZExpc3RCZWdpbigpIiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gRGVzZXJpYWxpemUKLSAgaW5kZW50KG91dCkgPDwgImZvciBfaT0xLCIgPDwgc2l6ZSA8PCAiIGRvIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBwcmVmaXgpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgcHJlZml4KTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIHByZWZpeCk7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOwotCi0gIC8vIFJlYWQgY29udGFpbmVyIGVuZAotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImlwcm90OnJlYWRNYXBFbmQoKSIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaXByb3Q6cmVhZFNldEVuZCgpIiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaXByb3Q6cmVhZExpc3RFbmQoKSIgPDwgZW5kbDsKLSAgfQotfQotCi12b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBwcmVmaXgpIHsKLSAgLy8gQSBtYXAgaXMgcmVwcmVzZW50ZWQgYnkgYSB0YWJsZSBpbmRleGFibGUgYnkgYW55IGx1YSB0eXBlCi0gIHN0cmluZyBrZXkgPSB0bXAoIl9rZXkiKTsKLSAgc3RyaW5nIHZhbCA9IHRtcCgiX3ZhbCIpOwotICB0X2ZpZWxkIGZrZXkodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7Ci0gIHRfZmllbGQgZnZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5LCB0cnVlKTsKLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCwgdHJ1ZSk7Ci0KLSAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICJbIiA8PCBrZXkgPDwgIl0gPSAiIDw8IHZhbCA8PCBlbmRsOwotfQotCi12b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBwcmVmaXgpIHsKLSAgLy8gQSBzZXQgaXMgcmVwcmVzZW50ZWQgYnkgYSB0YWJsZSBpbmRleGVkIGJ5IHRoZSB2YWx1ZQotICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKLSAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtLCB0cnVlKTsKLQotICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIlsiIDw8IGVsZW0gPDwgIl0gPSAiIDw8IGVsZW0gPDwgZW5kbDsKLX0KLQotdm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIC8vIEEgbGlzdCBpcyByZXByZXNlbnRlZCBieSBhIHRhYmxlIGluZGV4ZWQgYnkgaW50ZWdlciB2YWx1ZXMKLSAgLy8gTFVBIG5hdGl2ZWx5IHByb3ZpZGVzIGFsbCBvZiB0aGUgZnVuY3Rpb25zIHJlcXVpcmVkIHRvIG1haW50YWluIGEgbGlzdAotICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKLSAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSwgdHJ1ZSk7Ci0KLSAgaW5kZW50KG91dCkgPDwgInRhYmxlLmluc2VydCgiIDw8IHByZWZpeCA8PCAiLCAiIDw8IGVsZW0gPDwgIikiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplIChXcml0ZSkKLSAqLwotdm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKLSAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLQotICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBuYW1lOwotICB9Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Q6IjsKLQotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoIiA8PCBuYW1lIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIG91dCA8PCAid3JpdGVCb29sKCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBvdXQgPDwgIndyaXRlQnl0ZSgiIDw8IG5hbWUgPDwgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBvdXQgPDwgIndyaXRlSTE2KCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUk2NCgiIDw8IG5hbWUgPDwgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgIndyaXRlRG91YmxlKCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBQSFAgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgbmFtZS5jX3N0cigpLAotICAgICAgICAgICB0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOwotICB9Ci19Ci0KLXZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7Ci0gICh2b2lkKXRzdHJ1Y3Q7Ci0gIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiOndyaXRlKG9wcm90KSIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgewotICAvLyBCZWdpbiB3cml0aW5nCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Q6d3JpdGVNYXBCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiLCAiCi0gICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIKLSAgICAgICAgICAgICAgICA8PCAidHRhYmxlX3NpemUoIiA8PCBwcmVmaXggPDwgIikpIiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdDp3cml0ZVNldEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiCi0gICAgICAgICAgICAgICAgPDwgInR0YWJsZV9zaXplKCIgPDwgcHJlZml4IDw8ICIpKSIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90OndyaXRlTGlzdEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkKLSAgICAgICAgICAgICAgICA8PCAiLCAiCi0gICAgICAgICAgICAgICAgPDwgIiMiIDw8IHByZWZpeCA8PCAiKSIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIFNlcmlhbGl6ZQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgc3RyaW5nIGtpdGVyID0gdG1wKCJraXRlciIpOwotICAgIHN0cmluZyB2aXRlciA9IHRtcCgidml0ZXIiKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiZm9yICIgPDwga2l0ZXIgPDwgIiwiIDw8IHZpdGVyIDw8ICIgaW4gcGFpcnMoIiA8PCBwcmVmaXggPDwgIikgZG8iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwga2l0ZXIsIHZpdGVyKTsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgc3RyaW5nIGl0ZXIgPSB0bXAoIml0ZXIiKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiZm9yICIgPDwgaXRlciA8PCAiLF8gaW4gcGFpcnMoIiA8PCBwcmVmaXggPDwgIikgZG8iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgaXRlcik7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBzdHJpbmcgaXRlciA9IHRtcCgiaXRlciIpOwotICAgIGluZGVudChvdXQpIDw8ICJmb3IgXywiIDw8IGl0ZXIgPDwgIiBpbiBpcGFpcnMoIiA8PCBwcmVmaXggPDwgIikgZG8iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyKTsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBGaW5pc2ggd3JpdGluZwotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90OndyaXRlTWFwRW5kKCkiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90OndyaXRlU2V0RW5kKCkiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdDp3cml0ZUxpc3RFbmQoKSIgPDwgZW5kbDsKLSAgfQotfQotCi12b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcga2l0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB2aXRlcikgewotICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2l0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCAiIik7Ci0KLSAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCwgIiIpOwotfQotCi12b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgaXRlcikgewotICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Ci19Ci0KLXZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Ci19Ci0KLS8qKgotICogIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCi0gKi8KLXN0cmluZyB0X2x1YV9nZW5lcmF0b3I6Omx1YV9pbmNsdWRlcygpIHsKLSAgaWYgKGdlbl9yZXF1aXJlc18pIHsKLSAgICByZXR1cm4gIlxuXG5yZXF1aXJlICdUaHJpZnQnIjsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gIiI7Ci0gIH0KLX0KLQotc3RyaW5nIHRfbHVhX2dlbmVyYXRvcjo6Z2V0X25hbWVzcGFjZShjb25zdCB0X3Byb2dyYW0qIHByb2dyYW0pIHsKLSAgc3RkOjpzdHJpbmcgcmVhbF9tb2R1bGUgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJsdWEiKTsKLSAgaWYgKHJlYWxfbW9kdWxlLmVtcHR5KCkpIHsKLSAgICByZXR1cm4gcHJvZ3JhbS0+Z2V0X25hbWUoKSArICJfIjsKLSAgfQotICByZXR1cm4gcmVhbF9tb2R1bGUgKyAiXyI7Ci19Ci0KLXN0cmluZyB0X2x1YV9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpIHsKLSAgKHZvaWQpcHJlZml4OwotICBzdGQ6OnN0cmluZyByZXQgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiKCIgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkgKyAiKSI7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXN0cmluZyB0X2x1YV9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7Ci0gIHN0ZDo6c3RyaW5nIHJldCA9ICIiOwotICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTspIHsKLSAgICByZXQgKz0gcHJlZml4ICsgKCpmbGRfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgKytmbGRfaXRlcjsKLSAgICBpZiAoZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpKSB7Ci0gICAgICByZXQgKz0gIiwgIjsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHJldDsKLX0KLQotc3RyaW5nIHRfbHVhX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJldHVybiAiVFR5cGUuU1RSSU5HIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gIlRUeXBlLkJPT0wiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJldHVybiAiVFR5cGUuQllURSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gIlRUeXBlLkkxNiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gIlRUeXBlLkkzMiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gIlRUeXBlLkk2NCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gIlRUeXBlLkRPVUJMRSI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiVFR5cGUuSTMyIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5TVFJVQ1QiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5NQVAiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5TRVQiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiAiVFR5cGUuTElTVCI7Ci0gIH0KLQotICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLVRIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IobHVhLCAiTHVhIiwgIiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3Rfb2NhbWxfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X29jYW1sX2dlbmVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzViYzEyZC4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3Rfb2NhbWxfZ2VuZXJhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTc1NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSAidF9vb3BfZ2VuZXJhdG9yLmgiCi0jaW5jbHVkZSAicGxhdGZvcm0uaCIKLSNpbmNsdWRlICJ2ZXJzaW9uLmgiCi0KLXVzaW5nIHN0ZDo6aW9zOwotdXNpbmcgc3RkOjptYXA7Ci11c2luZyBzdGQ6Om9mc3RyZWFtOwotdXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwotdXNpbmcgc3RkOjpzdHJpbmc7Ci11c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKLXVzaW5nIHN0ZDo6dmVjdG9yOwotCi1zdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCi0KLS8qKgotICogT0NhbWwgY29kZSBnZW5lcmF0b3IuCi0gKgotICovCi1jbGFzcyB0X29jYW1sX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgewotcHVibGljOgotICB0X29jYW1sX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKLSAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKSB7Ci0gICAgKHZvaWQpcGFyc2VkX29wdGlvbnM7Ci0gICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKLSAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1vY2FtbCI7Ci0gIH0KLQotICAvKioKLSAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcwotICAgKi8KLQotICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7Ci0gIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7Ci0KLSAgLyoqCi0gICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0gIHZvaWQgZ2VuZXJhdGVfcHJvZ3JhbSgpOwotICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7Ci0gIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLQotICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0gIGJvb2wgc3RydWN0X21lbWJlcl9wZXJzaXN0ZW50KHRfZmllbGQqIHRtZW1iZXIpOwotICBib29sIHN0cnVjdF9tZW1iZXJfb21pdGFibGUodF9maWVsZCogdG1lbWJlcik7Ci0gIGJvb2wgc3RydWN0X21lbWJlcl9kZWZhdWx0X2NoZWFwbHlfY29tcGFyYWJsZSh0X2ZpZWxkKiB0bWVtYmVyKTsKLSAgc3RkOjpzdHJpbmcgc3RydWN0X21lbWJlcl9jb3B5X29mKHRfdHlwZSogdHlwZSwgc3RyaW5nIHdoYXQpOwotCi0gIC8qKgotICAgKiBTdHJ1Y3QgZ2VuZXJhdGlvbiBjb2RlCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfb2NhbWxfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X21lbWJlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0cmluZyB0bmFtZSwgdF9maWVsZCogdG1lbWJlcik7Ci0gIHZvaWQgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X3NpZyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X3JlYWRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX29jYW1sX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9vY2FtbF9tZXRob2RfY29weShzdGQ6Om9mc3RyZWFtJiBvdXQsIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMpOwotICB2b2lkIGdlbmVyYXRlX29jYW1sX21lbWJlcl9jb3B5KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9maWVsZCogbWVtYmVyKTsKLQotICAvKioKLSAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0KLSAgLyoqCi0gICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXgpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0KTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgbmFtZSA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBraXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdml0ZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0ZDo6c3RyaW5nIGl0ZXIpOwotCi0gIC8qKgotICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucwotICAgKi8KLQotICBzdGQ6OnN0cmluZyBvY2FtbF9hdXRvZ2VuX2NvbW1lbnQoKTsKLSAgc3RkOjpzdHJpbmcgb2NhbWxfaW1wb3J0cygpOwotICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fdHlwZSh0X2Z1bmN0aW9uKiB0ZnVuYywgYm9vbCBtZXRob2QgPSBmYWxzZSwgYm9vbCBvcHRpb25zID0gZmFsc2UpOwotICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKLSAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOwotICBzdGQ6OnN0cmluZyByZW5kZXJfb2NhbWxfdHlwZSh0X3R5cGUqIHR5cGUpOwotCi1wcml2YXRlOgotICAvKioKLSAgICogRmlsZSBzdHJlYW1zCi0gICAqLwotCi0gIHN0ZDo6b2ZzdHJlYW0gZl90eXBlc187Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9jb25zdHNfOwotICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZV87Ci0KLSAgc3RkOjpvZnN0cmVhbSBmX3R5cGVzX2lfOwotICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZV9pXzsKLX07Ci0KLS8qCi0gKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHdlIHdhbnQgdHlwZWRlZnMgdG8gYXBwZWFyIGxhdGVyLAotICogYWZ0ZXIgYWxsIHRoZSB0eXBlcyBoYXZlIGJlZW4gZGVjbGFyZWQuCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2dyYW0oKSB7Ci0gIC8vIEluaXRpYWxpemUgdGhlIGdlbmVyYXRvcgotICBpbml0X2dlbmVyYXRvcigpOwotCi0gIC8vIEdlbmVyYXRlIGVudW1zCi0gIHZlY3Rvcjx0X2VudW0qPiBlbnVtcyA9IHByb2dyYW1fLT5nZXRfZW51bXMoKTsKLSAgdmVjdG9yPHRfZW51bSo+OjppdGVyYXRvciBlbl9pdGVyOwotICBmb3IgKGVuX2l0ZXIgPSBlbnVtcy5iZWdpbigpOyBlbl9pdGVyICE9IGVudW1zLmVuZCgpOyArK2VuX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9lbnVtKCplbl9pdGVyKTsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHN0cnVjdHMKLSAgdmVjdG9yPHRfc3RydWN0Kj4gc3RydWN0cyA9IHByb2dyYW1fLT5nZXRfc3RydWN0cygpOwotICB2ZWN0b3I8dF9zdHJ1Y3QqPjo6aXRlcmF0b3Igc3RfaXRlcjsKLSAgZm9yIChzdF9pdGVyID0gc3RydWN0cy5iZWdpbigpOyBzdF9pdGVyICE9IHN0cnVjdHMuZW5kKCk7ICsrc3RfaXRlcikgewotICAgIGdlbmVyYXRlX3N0cnVjdCgqc3RfaXRlcik7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSB4Y2VwdGlvbnMKLSAgdmVjdG9yPHRfc3RydWN0Kj4geGNlcHRpb25zID0gcHJvZ3JhbV8tPmdldF94Y2VwdGlvbnMoKTsKLSAgdmVjdG9yPHRfc3RydWN0Kj46Oml0ZXJhdG9yIHhfaXRlcjsKLSAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV94Y2VwdGlvbigqeF9pdGVyKTsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHR5cGVkZWZzCi0gIHZlY3Rvcjx0X3R5cGVkZWYqPiB0eXBlZGVmcyA9IHByb2dyYW1fLT5nZXRfdHlwZWRlZnMoKTsKLSAgdmVjdG9yPHRfdHlwZWRlZio+OjppdGVyYXRvciB0ZF9pdGVyOwotICBmb3IgKHRkX2l0ZXIgPSB0eXBlZGVmcy5iZWdpbigpOyB0ZF9pdGVyICE9IHR5cGVkZWZzLmVuZCgpOyArK3RkX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV90eXBlZGVmKCp0ZF9pdGVyKTsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHNlcnZpY2VzCi0gIHZlY3Rvcjx0X3NlcnZpY2UqPiBzZXJ2aWNlcyA9IHByb2dyYW1fLT5nZXRfc2VydmljZXMoKTsKLSAgdmVjdG9yPHRfc2VydmljZSo+OjppdGVyYXRvciBzdl9pdGVyOwotICBmb3IgKHN2X2l0ZXIgPSBzZXJ2aWNlcy5iZWdpbigpOyBzdl9pdGVyICE9IHNlcnZpY2VzLmVuZCgpOyArK3N2X2l0ZXIpIHsKLSAgICBzZXJ2aWNlX25hbWVfID0gZ2V0X3NlcnZpY2VfbmFtZSgqc3ZfaXRlcik7Ci0gICAgZ2VuZXJhdGVfc2VydmljZSgqc3ZfaXRlcik7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSBjb25zdGFudHMKLSAgdmVjdG9yPHRfY29uc3QqPiBjb25zdHMgPSBwcm9ncmFtXy0+Z2V0X2NvbnN0cygpOwotICBnZW5lcmF0ZV9jb25zdHMoY29uc3RzKTsKLQotICAvLyBDbG9zZSB0aGUgZ2VuZXJhdG9yCi0gIGNsb3NlX2dlbmVyYXRvcigpOwotfQotCi0vKioKLSAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0Ci0gKiBzdHJlYW1zLgotICoKLSAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKLSAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5Ci0gIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7Ci0KLSAgLy8gTWFrZSBvdXRwdXQgZmlsZQotICBzdHJpbmcgZl90eXBlc19uYW1lID0gZ2V0X291dF9kaXIoKSArIHByb2dyYW1fbmFtZV8gKyAiX3R5cGVzLm1sIjsKLSAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7Ci0gIHN0cmluZyBmX3R5cGVzX2lfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwcm9ncmFtX25hbWVfICsgIl90eXBlcy5tbGkiOwotICBmX3R5cGVzX2lfLm9wZW4oZl90eXBlc19pX25hbWUuY19zdHIoKSk7Ci0KLSAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBnZXRfb3V0X2RpcigpICsgcHJvZ3JhbV9uYW1lXyArICJfY29uc3RzLm1sIjsKLSAgZl9jb25zdHNfLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKLQotICAvLyBQcmludCBoZWFkZXIKLSAgZl90eXBlc18gPDwgb2NhbWxfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PCBvY2FtbF9pbXBvcnRzKCkgPDwgZW5kbDsKLSAgZl90eXBlc19pXyA8PCBvY2FtbF9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8IG9jYW1sX2ltcG9ydHMoKSA8PCBlbmRsOwotICBmX2NvbnN0c18gPDwgb2NhbWxfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PCBvY2FtbF9pbXBvcnRzKCkgPDwgZW5kbCA8PCAib3BlbiAiCi0gICAgICAgICAgICA8PCBjYXBpdGFsaXplKHByb2dyYW1fbmFtZV8pIDw8ICJfdHlwZXMiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogQXV0b2dlbidkIGNvbW1lbnQKLSAqLwotc3RyaW5nIHRfb2NhbWxfZ2VuZXJhdG9yOjpvY2FtbF9hdXRvZ2VuX2NvbW1lbnQoKSB7Ci0gIHJldHVybiBzdGQ6OnN0cmluZygiKCpcbiIpICsgIiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoIiArIFRIUklGVF9WRVJTSU9OICsgIilcbiIgKyAiXG4iCi0gICAgICAgICArICIgRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkdcbiIgKyAiKilcbiI7Ci19Ci0KLS8qKgotICogUHJpbnRzIHN0YW5kYXJkIHRocmlmdCBpbXBvcnRzCi0gKi8KLXN0cmluZyB0X29jYW1sX2dlbmVyYXRvcjo6b2NhbWxfaW1wb3J0cygpIHsKLSAgcmV0dXJuICJvcGVuIFRocmlmdCI7Ci19Ci0KLS8qKgotICogQ2xvc2VzIHRoZSB0eXBlIGZpbGVzCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKLSAgLy8gQ2xvc2UgdHlwZXMgZmlsZQotICBmX3R5cGVzXy5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIEV6LgotICoKLSAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgewotICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAidHlwZSAiIDw8IGRlY2FwaXRhbGl6ZSh0dHlwZWRlZi0+Z2V0X3N5bWJvbGljKCkpIDw8ICIgPSAiCi0gICAgICAgICAgIDw8IHJlbmRlcl9vY2FtbF90eXBlKHR0eXBlZGVmLT5nZXRfdHlwZSgpKSA8PCBlbmRsIDw8IGVuZGw7Ci0gIGZfdHlwZXNfaV8gPDwgaW5kZW50KCkgPDwgInR5cGUgIiA8PCBkZWNhcGl0YWxpemUodHR5cGVkZWYtPmdldF9zeW1ib2xpYygpKSA8PCAiID0gIgotICAgICAgICAgICAgIDw8IHJlbmRlcl9vY2FtbF90eXBlKHR0eXBlZGVmLT5nZXRfdHlwZSgpKSA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4KLSAqIHRoZSB2YWx1ZXMuCi0gKgotICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKLSAgaW5kZW50KGZfdHlwZXNfKSA8PCAibW9kdWxlICIgPDwgY2FwaXRhbGl6ZSh0ZW51bS0+Z2V0X25hbWUoKSkgPDwgIiA9ICIgPDwgZW5kbCA8PCAic3RydWN0IgotICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gIGluZGVudChmX3R5cGVzX2lfKSA8PCAibW9kdWxlICIgPDwgY2FwaXRhbGl6ZSh0ZW51bS0+Z2V0X25hbWUoKSkgPDwgIiA6ICIgPDwgZW5kbCA8PCAic2lnIgotICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChmX3R5cGVzXykgPDwgInR5cGUgdCA9ICIgPDwgZW5kbDsKLSAgaW5kZW50KGZfdHlwZXNfaV8pIDw8ICJ0eXBlIHQgPSAiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgc3RyaW5nIG5hbWUgPSBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgaW5kZW50KGZfdHlwZXNfKSA8PCAifCAiIDw8IG5hbWUgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl90eXBlc19pXykgPDwgInwgIiA8PCBuYW1lIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBpbmRlbnQoZl90eXBlc18pIDw8ICJsZXQgdG9faSA9IGZ1bmN0aW9uIiA8PCBlbmRsOwotICBpbmRlbnQoZl90eXBlc19pXykgPDwgInZhbCB0b19pIDogdCAtPiBJbnQzMi50IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgIHN0cmluZyBuYW1lID0gY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOwotICAgIGluZGVudChmX3R5cGVzXykgPDwgInwgIiA8PCBuYW1lIDw8ICIgLT4gIiA8PCB2YWx1ZSA8PCAibCIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotCi0gIGluZGVudChmX3R5cGVzXykgPDwgImxldCBvZl9pID0gZnVuY3Rpb24iIDw8IGVuZGw7Ci0gIGluZGVudChmX3R5cGVzX2lfKSA8PCAidmFsIG9mX2kgOiBJbnQzMi50IC0+IHQiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgc3RyaW5nIG5hbWUgPSBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgaW5kZW50KGZfdHlwZXNfKSA8PCAifCAiIDw8IHZhbHVlIDw8ICJsIC0+ICIgPDwgbmFtZSA8PCBlbmRsOwotICB9Ci0gIGluZGVudChmX3R5cGVzXykgPDwgInwgXyAtPiByYWlzZSBUaHJpZnRfZXJyb3IiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX3R5cGVzXykgPDwgImVuZCIgPDwgZW5kbDsKLSAgaW5kZW50KGZfdHlwZXNfaV8pIDw8ICJlbmQiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGUgYSBjb25zdGFudCB2YWx1ZQotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKLSAgdF90eXBlKiB0eXBlID0gdGNvbnN0LT5nZXRfdHlwZSgpOwotICBzdHJpbmcgbmFtZSA9IGRlY2FwaXRhbGl6ZSh0Y29uc3QtPmdldF9uYW1lKCkpOwotICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IHRjb25zdC0+Z2V0X3ZhbHVlKCk7Ci0KLSAgaW5kZW50KGZfY29uc3RzXykgPDwgImxldCAiIDw8IG5hbWUgPDwgIiA9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlKSA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCi0gKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQotICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKLSAqLwotc3RyaW5nIHRfb2NhbWxfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKLSAgLy8gT0NhbWwgcmVxdWlyZXMgYWxsIGZsb2F0aW5nIHBvaW50IG51bWJlcnMgY29udGFpbiBhIGRlY2ltYWwgcG9pbnQKLSAgb3V0LnNldGYoaW9zOjpzaG93cG9pbnQpOwotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgb3V0IDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIG91dCA8PCAodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwID8gInRydWUiIDogImZhbHNlIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAibCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiTCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7Ci0gICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiLjAiOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHRfZW51bSogdGVudW0gPSAodF9lbnVtKil0eXBlOwotICAgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOwotICAgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOwotICAgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgICBpbnQgdmFsID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICAgIGlmICh2YWwgPT0gdmFsdWUtPmdldF9pbnRlZ2VyKCkpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgY2FwaXRhbGl6ZSh0ZW51bS0+Z2V0X25hbWUoKSkgPDwgIi4iIDw8IGNhcGl0YWxpemUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBzdHJpbmcgY25hbWUgPSB0eXBlX25hbWUodHlwZSk7Ci0gICAgc3RyaW5nIGN0ID0gdG1wKCJfYyIpOwotICAgIG91dCA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICIobGV0ICIgPDwgY3QgPDwgIiA9IG5ldyAiIDw8IGNuYW1lIDw8ICIgaW4iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7Ci0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgewotICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgIH0KLSAgICAgIHN0cmluZyBmbmFtZSA9IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgIG91dCA8PCBpbmRlbnQoKTsKLSAgICAgIG91dCA8PCBjdCA8PCAiI3NldF8iIDw8IGZuYW1lIDw8ICIgIjsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnQob3V0KSA8PCBjdCA8PCAiKSI7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnRfZG93bigpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgc3RyaW5nIGhtID0gdG1wKCJfaG0iKTsKLSAgICBvdXQgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiKGxldCAiIDw8IGhtIDw8ICIgPSBIYXNodGJsLmNyZWF0ZSAiIDw8IHZhbC5zaXplKCkgPDwgIiBpbiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgc3RyaW5nIGtleSA9IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgdl9pdGVyLT5maXJzdCk7Ci0gICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiSGFzaHRibC5hZGQgIiA8PCBobSA8PCAiICIgPDwga2V5IDw8ICIgIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudChvdXQpIDw8IGhtIDw8ICIpIjsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgdF90eXBlKiBldHlwZTsKLSAgICBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIG91dCA8PCAiWyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKTsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpOwotICAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJdIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBzdHJpbmcgaG0gPSB0bXAoIl9obSIpOwotICAgIGluZGVudChvdXQpIDw8ICIobGV0ICIgPDwgaG0gPDwgIiA9IEhhc2h0YmwuY3JlYXRlICIgPDwgdmFsLnNpemUoKSA8PCAiIGluIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJIYXNodGJsLmFkZCAiIDw8IGhtIDw8ICIgIiA8PCB2YWwgPDwgIiB0cnVlOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgaG0gPDwgIikiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIENPTlNUQU5UIEZPUiBUWVBFOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotICByZXR1cm4gb3V0LnN0cigpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhICJzdHJ1Y3QiCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBleGNlcHRpb24uIEJhc2ljYWxseSB0aGUgc2FtZQotICogYXMgYSBzdHJ1Y3QsIGJ1dCBhbHNvIGhhcyBhbiBleGNlcHRpb24gZGVjbGFyYXRpb24uCi0gKgotICogQHBhcmFtIHR4Y2VwdGlvbiBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYW4gT0NhbWwgc3RydWN0Ci0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX29jYW1sX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Ci0gIGdlbmVyYXRlX29jYW1sX3N0cnVjdF9zaWcoZl90eXBlc19pXywgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKLX0KLQotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2NhbWxfbWV0aG9kX2NvcHkob2ZzdHJlYW0mIG91dCwgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycykgewotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgLyogQ3JlYXRlIGEgY29weSBvZiB0aGUgY3VycmVudCBvYmplY3QgKi8KLSAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCBjb3B5ID0iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgImxldCBfbmV3ID0gT28uY29weSBzZWxmIGluIiA8PCBlbmRsOwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKQotICAgIGdlbmVyYXRlX29jYW1sX21lbWJlcl9jb3B5KG91dCwgKm1faXRlcik7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIl9uZXciIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci19Ci0KLXN0cmluZyB0X29jYW1sX2dlbmVyYXRvcjo6c3RydWN0X21lbWJlcl9jb3B5X29mKHRfdHlwZSogdHlwZSwgc3RyaW5nIHdoYXQpIHsKLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gd2hhdCArIHN0cmluZygiI2NvcHkiKTsKLSAgfQotICBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICBzdHJpbmcgY29weV9vZl9rID0gc3RydWN0X21lbWJlcl9jb3B5X29mKCgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKSwgImsiKTsKLSAgICBzdHJpbmcgY29weV9vZl92ID0gc3RydWN0X21lbWJlcl9jb3B5X29mKCgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKSwgInYiKTsKLQotICAgIGlmIChjb3B5X29mX2sgPT0gImsiICYmIGNvcHlfb2ZfdiA9PSAidiIpIHsKLSAgICAgIHJldHVybiBzdHJpbmcoIihIYXNodGJsLmNvcHkgIikgKyB3aGF0ICsgc3RyaW5nKCIpIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBzdHJpbmcoCi0gICAgICAgICAgICAgICAgICIoKGZ1biBvaCAtPiBsZXQgbmggPSBIYXNodGJsLmNyZWF0ZSAoSGFzaHRibC5sZW5ndGggb2gpIGluIEhhc2h0YmwuaXRlciAoZnVuIGsgdiAiCi0gICAgICAgICAgICAgICAgICItPiBIYXNodGJsLmFkZCBuaCAiKSArIGNvcHlfb2ZfayArIHN0cmluZygiICIpICsgY29weV9vZl92ICsgc3RyaW5nKCIpIG9oOyBuaCkgIikKLSAgICAgICAgICAgICArIHdoYXQgKyAiKSI7Ci0gICAgfQotICB9Ci0gIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHN0cmluZyBjb3B5X29mID0gc3RydWN0X21lbWJlcl9jb3B5X29mKCgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCksICJrIik7Ci0KLSAgICBpZiAoY29weV9vZiA9PSAiayIpIHsKLSAgICAgIHJldHVybiBzdHJpbmcoIihIYXNodGJsLmNvcHkgIikgKyB3aGF0ICsgc3RyaW5nKCIpIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBzdHJpbmcoCi0gICAgICAgICAgICAgICAgICIoKGZ1biBvaCAtPiBsZXQgbmggPSBIYXNodGJsLmNyZWF0ZSAoSGFzaHRibC5sZW5ndGggb2gpIGluIEhhc2h0YmwuaXRlciAoZnVuIGsgdiAiCi0gICAgICAgICAgICAgICAgICItPiBIYXNodGJsLmFkZCBuaCAiKSArIGNvcHlfb2YgKyBzdHJpbmcoIiB0cnVlIikgKyBzdHJpbmcoIikgb2g7IG5oKSAiKSArIHdoYXQKLSAgICAgICAgICAgICArICIpIjsKLSAgICB9Ci0gIH0KLSAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHN0cmluZyBjb3B5X29mID0gc3RydWN0X21lbWJlcl9jb3B5X29mKCgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCAieCIpOwotICAgIGlmIChjb3B5X29mICE9ICJ4IikgewotICAgICAgcmV0dXJuIHN0cmluZygiKExpc3QubWFwIChmdW4geCAtPiAiKSArIGNvcHlfb2YgKyBzdHJpbmcoIikgIikgKyB3aGF0ICsgc3RyaW5nKCIpIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiB3aGF0OwotICAgIH0KLSAgfQotICByZXR1cm4gd2hhdDsKLX0KLQotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2NhbWxfbWVtYmVyX2NvcHkob2ZzdHJlYW0mIG91dCwgdF9maWVsZCogdG1lbWJlcikgewotICBzdHJpbmcgbW5hbWUgPSBkZWNhcGl0YWxpemUodG1lbWJlci0+Z2V0X25hbWUoKSk7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodG1lbWJlci0+Z2V0X3R5cGUoKSk7Ci0KLSAgc3RyaW5nIGdyYWJfZmllbGQgPSBzdHJpbmcoInNlbGYjZ3JhYl8iKSArIG1uYW1lOwotICBzdHJpbmcgY29weV9vZiA9IHN0cnVjdF9tZW1iZXJfY29weV9vZih0eXBlLCBncmFiX2ZpZWxkKTsKLSAgaWYgKGNvcHlfb2YgIT0gZ3JhYl9maWVsZCkgewotICAgIGluZGVudChvdXQpOwotICAgIGlmICghc3RydWN0X21lbWJlcl9wZXJzaXN0ZW50KHRtZW1iZXIpKSB7Ci0gICAgICBvdXQgPDwgImlmIF8iIDw8IG1uYW1lIDw8ICIgPD4gTm9uZSB0aGVuIiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgIjsKLSAgICB9Ci0gICAgb3V0IDw8ICJfbmV3I3NldF8iIDw8IG1uYW1lIDw8ICIgIiA8PCBjb3B5X29mIDw8ICI7IiA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2NhbWxfc3RydWN0X2RlZmluaXRpb24ob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgc3RyaW5nIHRuYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOwotICBpbmRlbnQob3V0KSA8PCAiY2xhc3MgIiA8PCB0bmFtZSA8PCAiID0iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJvYmplY3QgKHNlbGYpIiA8PCBlbmRsOwotCi0gIGluZGVudF91cCgpOwotCi0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3RfbWVtYmVyKG91dCwgdG5hbWUsICgqbV9pdGVyKSk7Ci0gICAgICBvdXQgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLSAgZ2VuZXJhdGVfb2NhbWxfbWV0aG9kX2NvcHkob3V0LCBtZW1iZXJzKTsKLSAgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOwotCi0gIGlmIChpc19leGNlcHRpb24pIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiZXhjZXB0aW9uICIgPDwgY2FwaXRhbGl6ZSh0bmFtZSkgPDwgIiBvZiAiIDw8IHRuYW1lIDw8IGVuZGw7Ci0gIH0KLQotICBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0dXJlIG1lbWJlciBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLgotICoKLSAqIEBwYXJhbSB0bmFtZSBOYW1lIG9mIHRoZSBwYXJlbnQgc3RydWN0dXJlIGZvciB0aGUgbWVtYmVyCi0gKiBAcGFyYW0gdG1lbWJlciBNZW1iZXIgZGVmaW5pdGlvbgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3RfbWVtYmVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0bmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdG1lbWJlcikgewotICBzdHJpbmcgeCA9IHRtcCgiX3giKTsKLSAgc3RyaW5nIG1uYW1lID0gZGVjYXBpdGFsaXplKHRtZW1iZXItPmdldF9uYW1lKCkpOwotCi0gIGluZGVudChvdXQpIDw8ICJ2YWwgbXV0YWJsZSBfIiA8PCBtbmFtZSA8PCAiIDogIiA8PCByZW5kZXJfb2NhbWxfdHlwZSh0bWVtYmVyLT5nZXRfdHlwZSgpKTsKLSAgdF9jb25zdF92YWx1ZSogdmFsID0gdG1lbWJlci0+Z2V0X3ZhbHVlKCk7Ci0gIGlmICh2YWwpIHsKLSAgICBpZiAoc3RydWN0X21lbWJlcl9wZXJzaXN0ZW50KHRtZW1iZXIpKQotICAgICAgb3V0IDw8ICIgPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0bWVtYmVyLT5nZXRfdHlwZSgpLCB0bWVtYmVyLT5nZXRfdmFsdWUoKSkgPDwgZW5kbDsKLSAgICBlbHNlCi0gICAgICBvdXQgPDwgIiBvcHRpb24gPSBTb21lICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHRtZW1iZXItPmdldF90eXBlKCksIHRtZW1iZXItPmdldF92YWx1ZSgpKQotICAgICAgICAgIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gYXNzZXJ0KCFzdHJ1Y3RfbWVtYmVyX3BlcnNpc3RlbnQodG1lbWJlcikpCi0gICAgb3V0IDw8ICIgb3B0aW9uID0gTm9uZSIgPDwgZW5kbDsKLSAgfQotCi0gIGlmIChzdHJ1Y3RfbWVtYmVyX3BlcnNpc3RlbnQodG1lbWJlcikpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIGdldF8iIDw8IG1uYW1lIDw8ICIgPSBTb21lIF8iIDw8IG1uYW1lIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCBncmFiXyIgPDwgbW5hbWUgPDwgIiA9IF8iIDw8IG1uYW1lIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCBzZXRfIiA8PCBtbmFtZSA8PCAiICIgPDwgeCA8PCAiID0gXyIgPDwgbW5hbWUgPDwgIiA8LSAiIDw8IHggPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIGdldF8iIDw8IG1uYW1lIDw8ICIgPSBfIiA8PCBtbmFtZSA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJtZXRob2QgZ3JhYl8iIDw8IG1uYW1lIDw8ICIgPSBtYXRjaCBfIiA8PCBtbmFtZQotICAgICAgICAgICAgICAgIDw8ICIgd2l0aCBOb25lLT5yYWlzZSAoRmllbGRfZW1wdHkgXCIiIDw8IHRuYW1lIDw8ICIuIiA8PCBtbmFtZSA8PCAiXCIpIHwgU29tZSAiCi0gICAgICAgICAgICAgICAgPDwgeCA8PCAiIC0+ICIgPDwgeCA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJtZXRob2Qgc2V0XyIgPDwgbW5hbWUgPDwgIiAiIDw8IHggPDwgIiA9IF8iIDw8IG1uYW1lIDw8ICIgPC0gU29tZSAiIDw8IHgKLSAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJtZXRob2QgdW5zZXRfIiA8PCBtbmFtZSA8PCAiID0gXyIgPDwgbW5hbWUgPDwgIiA8LSBOb25lIiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCByZXNldF8iIDw8IG1uYW1lIDw8ICIgPSBfIiA8PCBtbmFtZSA8PCAiIDwtICI7Ci0gIGlmICh2YWwpIHsKLSAgICBpZiAoc3RydWN0X21lbWJlcl9wZXJzaXN0ZW50KHRtZW1iZXIpKQotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0bWVtYmVyLT5nZXRfdHlwZSgpLCB0bWVtYmVyLT5nZXRfdmFsdWUoKSkgPDwgZW5kbDsKLSAgICBlbHNlCi0gICAgICBvdXQgPDwgIlNvbWUgIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodG1lbWJlci0+Z2V0X3R5cGUoKSwgdG1lbWJlci0+Z2V0X3ZhbHVlKCkpIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgb3V0IDw8ICJOb25lIiA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogQ2hlY2sgd2hldGhlciBhIG1lbWJlciBvZiB0aGUgc3RydWN0dXJlIGNhbiBub3QgaGF2ZSB1bmRlZmluZWQgdmFsdWUKLSAqCi0gKiBAcGFyYW0gdG1lbWJlciBNZW1iZXIgZGVmaW5pdGlvbgotICovCi1ib29sIHRfb2NhbWxfZ2VuZXJhdG9yOjpzdHJ1Y3RfbWVtYmVyX3BlcnNpc3RlbnQodF9maWVsZCogdG1lbWJlcikgewotICB0X2NvbnN0X3ZhbHVlKiB2YWwgPSB0bWVtYmVyLT5nZXRfdmFsdWUoKTsKLSAgcmV0dXJuICh2YWwgPyB0cnVlIDogZmFsc2UpOwotfQotCi0vKioKLSAqIENoZWNrIHdoZXRoZXIgYSBtZW1iZXIgb2YgdGhlIHN0cnVjdHVyZSBjYW4gYmUgc2tpcHBlZCBkdXJpbmcgZW5jb2RpbmcKLSAqCi0gKiBAcGFyYW0gdG1lbWJlciBNZW1iZXIgZGVmaW5pdGlvbgotICovCi1ib29sIHRfb2NhbWxfZ2VuZXJhdG9yOjpzdHJ1Y3RfbWVtYmVyX29taXRhYmxlKHRfZmllbGQqIHRtZW1iZXIpIHsKLSAgcmV0dXJuICh0bWVtYmVyLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCk7Ci19Ci0KLS8qKgotICogRmlndXJlIG91dCB3aGV0aGVyIGEgbWVtYmVyIG9mIHRoZSBzdHJ1Y3R1cmUgaGFzCi0gKiBhIGNoZWFwbHkgY29tcGFyYWJsZSBkZWZhdWx0IHZhbHVlLgotICoKLSAqIEBwYXJhbSB0bWVtYmVyIE1lbWJlciBkZWZpbml0aW9uCi0gKi8KLWJvb2wgdF9vY2FtbF9nZW5lcmF0b3I6OnN0cnVjdF9tZW1iZXJfZGVmYXVsdF9jaGVhcGx5X2NvbXBhcmFibGUodF9maWVsZCogdG1lbWJlcikgewotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRtZW1iZXItPmdldF90eXBlKCkpOwotICB0X2NvbnN0X3ZhbHVlKiB2YWwgPSB0bWVtYmVyLT5nZXRfdmFsdWUoKTsKLSAgaWYgKCF2YWwpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAvLyBCYXNlIHR5cGVzIGFyZSBnZW5lcmFsbHkgY2hlYXBseSBjb21wYXJlZCBmb3Igc3RydWN0dXJhbCBlcXVpdmFsZW5jZS4KLSAgICBzd2l0Y2ggKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBpZiAodmFsLT5nZXRfZG91YmxlKCkgPT0gMC4wKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgLy8gRW1wdHkgbGlzdHMgYXJlIGNoZWFwbHkgY29tcGFyZWQgZm9yIHN0cnVjdHVyYWwgZXF1aXZhbGVuY2UuCi0gICAgLy8gSXMgZW1wdHkgbGlzdD8KLSAgICBpZiAodmFsLT5nZXRfbGlzdCgpLnNpemUoKSA9PSAwKQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIGZhbHNlOwotICB9IGVsc2UgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX29jYW1sX3N0cnVjdF9zaWcob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIHN0cmluZyB0bmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKLSAgaW5kZW50KG91dCkgPDwgImNsYXNzICIgPDwgdG5hbWUgPDwgIiA6IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAib2JqZWN0ICgnYSkiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgc3RyaW5nIHggPSB0bXAoIl94Iik7Ci0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBzdHJpbmcgbW5hbWUgPSBkZWNhcGl0YWxpemUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICAgIHN0cmluZyB0eXBlID0gcmVuZGVyX29jYW1sX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJtZXRob2QgZ2V0XyIgPDwgbW5hbWUgPDwgIiA6ICIgPDwgdHlwZSA8PCAiIG9wdGlvbiIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJtZXRob2QgZ3JhYl8iIDw8IG1uYW1lIDw8ICIgOiAiIDw8IHR5cGUgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJtZXRob2Qgc2V0XyIgPDwgbW5hbWUgPDwgIiA6ICIgPDwgdHlwZSA8PCAiIC0+IHVuaXQiIDw8IGVuZGw7Ci0gICAgICBpZiAoIXN0cnVjdF9tZW1iZXJfcGVyc2lzdGVudCgqbV9pdGVyKSkKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCB1bnNldF8iIDw8IG1uYW1lIDw8ICIgOiB1bml0IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCByZXNldF8iIDw8IG1uYW1lIDw8ICIgOiB1bml0IiA8PCBlbmRsOwotICAgIH0KLSAgfQotICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIGNvcHkgOiAnYSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCB3cml0ZSA6IFByb3RvY29sLnQgLT4gdW5pdCIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbDsKLQotICBpZiAoaXNfZXhjZXB0aW9uKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImV4Y2VwdGlvbiAiIDw8IGNhcGl0YWxpemUodG5hbWUpIDw8ICIgb2YgIiA8PCB0bmFtZSA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwgInZhbCByZWFkXyIgPDwgdG5hbWUgPDwgIiA6IFByb3RvY29sLnQgLT4gIiA8PCB0bmFtZSA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgcmVhZCBtZXRob2QgZm9yIGEgc3RydWN0Ci0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX29jYW1sX3N0cnVjdF9yZWFkZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBzdHJpbmcgc25hbWUgPSB0eXBlX25hbWUodHN0cnVjdCk7Ci0gIHN0cmluZyBzdHIgPSB0bXAoIl9zdHIiKTsKLSAgc3RyaW5nIHQgPSB0bXAoIl90Iik7Ci0gIHN0cmluZyBpZCA9IHRtcCgiX2lkIik7Ci0gIGluZGVudChvdXQpIDw8ICJsZXQgcmVjIHJlYWRfIiA8PCBzbmFtZSA8PCAiIChpcHJvdCA6IFByb3RvY29sLnQpID0iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAibGV0ICIgPDwgc3RyIDw8ICIgPSBuZXcgIiA8PCBzbmFtZSA8PCAiIGluIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgImlnbm9yZShpcHJvdCNyZWFkU3RydWN0QmVnaW4pOyIgPDwgZW5kbDsKLQotICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKLSAgaW5kZW50KG91dCkgPDwgIih0cnkgd2hpbGUgdHJ1ZSBkbyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudF91cCgpOwotCi0gIC8vIFJlYWQgYmVnaW5uaW5nIGZpZWxkIG1hcmtlcgotICBpbmRlbnQob3V0KSA8PCAibGV0IChfLCIgPDwgdCA8PCAiLCIgPDwgaWQgPDwgIikgPSBpcHJvdCNyZWFkRmllbGRCZWdpbiBpbiIgPDwgZW5kbDsKLQotICAvLyBDaGVjayBmb3IgZmllbGQgU1RPUCBtYXJrZXIgYW5kIGJyZWFrCi0gIGluZGVudChvdXQpIDw8ICJpZiAiIDw8IHQgPDwgIiA9IFByb3RvY29sLlRfU1RPUCB0aGVuIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgInJhaXNlIEJyZWFrIiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAiZWxzZSAoKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgIihtYXRjaCAiIDw8IGlkIDw8ICIgd2l0aCAiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAifCAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIgLT4gKCI7Ci0gICAgb3V0IDw8ICJpZiAiIDw8IHQgPDwgIiA9ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiB0aGVuIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudF91cCgpOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgc3RyKTsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZWxzZSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBpcHJvdCNza2lwICIgPDwgdCA8PCAiKSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0KLSAgLy8gSW4gdGhlIGRlZmF1bHQgY2FzZSB3ZSBza2lwIHRoZSBmaWVsZAotICBvdXQgPDwgaW5kZW50KCkgPDwgInwgXyAtPiAiCi0gICAgICA8PCAiaXByb3Qjc2tpcCAiIDw8IHQgPDwgIik7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICAvLyBSZWFkIGZpZWxkIGVuZCBtYXJrZXIKLSAgaW5kZW50KG91dCkgPDwgImlwcm90I3JlYWRGaWVsZEVuZDsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJkb25lOyAoKSIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIndpdGggQnJlYWsgLT4gKCkpOyIgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAiaXByb3QjcmVhZFN0cnVjdEVuZDsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgc3RyIDw8IGVuZGwgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2NhbWxfc3RydWN0X3dyaXRlcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIHN0cmluZyBzdHIgPSB0bXAoIl9zdHIiKTsKLSAgc3RyaW5nIGYgPSB0bXAoIl9mIik7Ci0KLSAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCB3cml0ZSAob3Byb3QgOiBQcm90b2NvbC50KSA9IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgIm9wcm90I3dyaXRlU3RydWN0QmVnaW4gXCIiIDw8IG5hbWUgPDwgIlwiOyIgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfZmllbGQqIHRtZW1iZXIgPSAoKmZfaXRlcik7Ci0gICAgc3RyaW5nIG1uYW1lID0gIl8iICsgZGVjYXBpdGFsaXplKHRtZW1iZXItPmdldF9uYW1lKCkpOwotICAgIHN0cmluZyBfdjsKLQotICAgIGlmIChzdHJ1Y3RfbWVtYmVyX3BlcnNpc3RlbnQodG1lbWJlcikpIHsKLQotICAgICAgaWYgKHN0cnVjdF9tZW1iZXJfb21pdGFibGUodG1lbWJlcikgJiYgc3RydWN0X21lbWJlcl9kZWZhdWx0X2NoZWFwbHlfY29tcGFyYWJsZSh0bWVtYmVyKSkgewotICAgICAgICBfdiA9ICJfdiI7Ci0gICAgICAgIC8vIEF2b2lkIHJlZHVuZGFudCBlbmNvZGluZyBvZiBtZW1iZXJzIGhhdmluZyBkZWZhdWx0IHZhbHVlcy4KLSAgICAgICAgaW5kZW50KG91dCkgPDwgIihtYXRjaCAiIDw8IG1uYW1lIDw8ICIgd2l0aCAiCi0gICAgICAgICAgICAgICAgICAgIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0bWVtYmVyLT5nZXRfdHlwZSgpLCB0bWVtYmVyLT5nZXRfdmFsdWUoKSkgPDwgIiAtPiAoKSB8ICIKLSAgICAgICAgICAgICAgICAgICAgPDwgX3YgPDwgIiAtPiAiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBfdiA9IG1uYW1lOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAiKCIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgIH0gZWxzZSB7Ci0KLSAgICAgIGluZGVudChvdXQpIDw8ICIobWF0Y2ggIiA8PCBtbmFtZSA8PCAiIHdpdGggIjsKLQotICAgICAgaWYgKHN0cnVjdF9tZW1iZXJfb21pdGFibGUodG1lbWJlcikpIHsKLSAgICAgICAgb3V0IDw8ICJOb25lIC0+ICgpIjsKLQotICAgICAgICBpZiAoc3RydWN0X21lbWJlcl9kZWZhdWx0X2NoZWFwbHlfY29tcGFyYWJsZSh0bWVtYmVyKSkgewotICAgICAgICAgIC8vIEF2b2lkIHJlZHVuZGFudCBlbmNvZGluZyBvZiBtZW1iZXJzIGhhdmluZyBkZWZhdWx0IHZhbHVlcy4KLSAgICAgICAgICBvdXQgPDwgIiB8IFNvbWUgIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodG1lbWJlci0+Z2V0X3R5cGUoKSwgdG1lbWJlci0+Z2V0X3ZhbHVlKCkpCi0gICAgICAgICAgICAgIDw8ICIgLT4gKCkiOwotICAgICAgICB9Ci0gICAgICAgIG91dCA8PCAiIHwgU29tZSBfdiAtPiAiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgInwgTm9uZSAtPiByYWlzZSAoRmllbGRfZW1wdHkgXCIiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiLiIgPDwgbW5hbWUKLSAgICAgICAgICAgICAgICAgICAgPDwgIlwiKSIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgInwgU29tZSBfdiAtPiAiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIF92ID0gIl92IjsKLSAgICB9Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgLy8gV3JpdGUgZmllbGQgaGVhZGVyCi0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90I3dyaXRlRmllbGRCZWdpbihcIiIgPDwgdG1lbWJlci0+Z2V0X25hbWUoKSA8PCAiXCIsIgotICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSh0bWVtYmVyLT5nZXRfdHlwZSgpKSA8PCAiLCIgPDwgdG1lbWJlci0+Z2V0X2tleSgpIDw8ICIpOyIgPDwgZW5kbDsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCi0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgdG1lbWJlciwgX3YpOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCi0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90I3dyaXRlRmllbGRFbmQiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICIpOyIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qjd3JpdGVGaWVsZFN0b3A7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdCN3cml0ZVN0cnVjdEVuZCIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBnZXRfb3V0X2RpcigpICsgY2FwaXRhbGl6ZShzZXJ2aWNlX25hbWVfKSArICIubWwiOwotICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7Ci0gIHN0cmluZyBmX3NlcnZpY2VfaV9uYW1lID0gZ2V0X291dF9kaXIoKSArIGNhcGl0YWxpemUoc2VydmljZV9uYW1lXykgKyAiLm1saSI7Ci0gIGZfc2VydmljZV9pXy5vcGVuKGZfc2VydmljZV9pX25hbWUuY19zdHIoKSk7Ci0KLSAgZl9zZXJ2aWNlXyA8PCBvY2FtbF9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8IG9jYW1sX2ltcG9ydHMoKSA8PCBlbmRsOwotICBmX3NlcnZpY2VfaV8gPDwgb2NhbWxfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PCBvY2FtbF9pbXBvcnRzKCkgPDwgZW5kbDsKLQotICAvKiBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICJvcGVuICIgPDwgY2FwaXRhbGl6ZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSkgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfaV8gPDwKLSAgICAgICJvcGVuICIgPDwgY2FwaXRhbGl6ZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSkgPDwgZW5kbDsKLSAgfQotICAqLwotICBmX3NlcnZpY2VfIDw8ICJvcGVuICIgPDwgY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKSA8PCAiX3R5cGVzIiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZl9zZXJ2aWNlX2lfIDw8ICJvcGVuICIgPDwgY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKSA8PCAiX3R5cGVzIiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHRocmVlIG1haW4gcGFydHMgb2YgdGhlIHNlcnZpY2UKLSAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRzZXJ2aWNlKTsKLQotICAvLyBDbG9zZSBzZXJ2aWNlIGZpbGUKLSAgZl9zZXJ2aWNlXy5jbG9zZSgpOwotICBmX3NlcnZpY2VfaV8uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgYSBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgewotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIigqIEhFTFBFUiBGVU5DVElPTlMgQU5EIFNUUlVDVFVSRVMgKikiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCB0cywgZmFsc2UpOwotICAgIGdlbmVyYXRlX29jYW1sX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2NhbWxfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCBkZWNhcGl0YWxpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICJfcmVzdWx0Iik7Ci0gIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7Ci0gIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKLSAgfQotCi0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7Ci0gIH0KLSAgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiY2xhc3MgdmlydHVhbCBpZmFjZSA9IiA8PCBlbmRsIDw8ICJvYmplY3QgKHNlbGYpIiA8PCBlbmRsOwotICBmX3NlcnZpY2VfaV8gPDwgaW5kZW50KCkgPDwgImNsYXNzIHZpcnR1YWwgaWZhY2UgOiIgPDwgZW5kbCA8PCAib2JqZWN0IiA8PCBlbmRsOwotCi0gIGluZGVudF91cCgpOwotCi0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgc3RyaW5nIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaW5oZXJpdCAiIDw8IGV4dGVuZHMgPDwgIi5pZmFjZSIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlX2lfKSA8PCAiaW5oZXJpdCAiIDw8IGV4dGVuZHMgPDwgIi5pZmFjZSIgPDwgZW5kbDsKLSAgfQotCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHN0cmluZyBmdCA9IGZ1bmN0aW9uX3R5cGUoKmZfaXRlciwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibWV0aG9kIHZpcnR1YWwgIiA8PCBkZWNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiIDogIgotICAgICAgICAgICAgICAgPDwgZnQgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfaV8gPDwgaW5kZW50KCkgPDwgIm1ldGhvZCB2aXJ0dWFsICIgPDwgZGVjYXBpdGFsaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA6ICIKLSAgICAgICAgICAgICAgICAgPDwgZnQgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlX2lfKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4gTm90ZSB0aGF0IGluIE9DYW1sLCB0aGUgY2xpZW50IGRvZXNuJ3QgaW1wbGVtZW50IGlmYWNlLgotICpUaGlzIGlzIGJlY2F1c2UKLSAqIFRoZSBjbGllbnQgZG9lcyBub3QgKGFuZCBzaG91bGQgbm90IGhhdmUgdG8pIGRlYWwgd2l0aCBhcmd1bWVudHMgYmVpbmcgTm9uZS4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiY2xhc3MgY2xpZW50IChpcHJvdCA6IFByb3RvY29sLnQpIChvcHJvdCA6IFByb3RvY29sLnQpID0iIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgICAgIDw8ICJvYmplY3QgKHNlbGYpIiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlX2lfKSA8PCAiY2xhc3MgY2xpZW50IDogUHJvdG9jb2wudCAtPiBQcm90b2NvbC50IC0+ICIgPDwgZW5kbCA8PCAib2JqZWN0IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaW5oZXJpdCAiIDw8IGV4dGVuZHMgPDwgIi5jbGllbnQgaXByb3Qgb3Byb3QgYXMgc3VwZXIiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV9pXykgPDwgImluaGVyaXQgIiA8PCBleHRlbmRzIDw8ICIuY2xpZW50IiA8PCBlbmRsOwotICB9Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAidmFsIG11dGFibGUgc2VxaWQgPSAwIiA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7Ci0gICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0KLSAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJtZXRob2QgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgIiA9ICIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlX2lfKSA8PCAibWV0aG9kICIgPDwgZGVjYXBpdGFsaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICA8PCBmdW5jdGlvbl90eXBlKCpmX2l0ZXIsIHRydWUsIGZhbHNlKSA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAic2VsZiNzZW5kXyIgPDwgZnVubmFtZTsKLQotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICIgIiA8PCBkZWNhcGl0YWxpemUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICI7IiA8PCBlbmRsOwotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICAgICAgZl9zZXJ2aWNlXyA8PCAic2VsZiNyZWN2XyIgPDwgZnVubmFtZSA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJtZXRob2QgcHJpdmF0ZSBzZW5kXyIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8ICIgPSAiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBzdGQ6OnN0cmluZyBhcmdzbmFtZSA9IGRlY2FwaXRhbGl6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiKTsKLQotICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdCBoZWFkZXIKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdCN3cml0ZU1lc3NhZ2VCZWdpbiAoXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsICIKLSAgICAgICAgICAgICAgIDw8ICgoKmZfaXRlciktPmlzX29uZXdheSgpID8gIlByb3RvY29sLk9ORVdBWSIgOiAiUHJvdG9jb2wuQ0FMTCIpIDw8ICIsIHNlcWlkKTsiCi0gICAgICAgICAgICAgICA8PCBlbmRsOwotCi0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibGV0IGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiIGluIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3Mjc2V0XyIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIiAiCi0gICAgICAgICAgICAgICAgIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIC8vIFdyaXRlIHRvIHRoZSBzdHJlYW0KLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzI3dyaXRlIG9wcm90OyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qjd3JpdGVNZXNzYWdlRW5kOyIKLSAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90I2dldFRyYW5zcG9ydCNmbHVzaCIgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50X2Rvd24oKTsKLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0bmFtZSA9IGRlY2FwaXRhbGl6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOwotICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKLQotICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vYXJncyk7Ci0gICAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJtZXRob2QgcHJpdmF0ZSAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbikgPDwgIiA9IgotICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0KLSAgICAgIC8vIFRPRE8obWNzbGVlKTogVmFsaWRhdGUgbWVzc2FnZSByZXBseSBoZXJlLCBzZXEgaWRzIGV0Yy4KLQotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibGV0IChmbmFtZSwgbXR5cGUsIHJzZXFpZCkgPSBpcHJvdCNyZWFkTWVzc2FnZUJlZ2luIGluIiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIoaWYgbXR5cGUgPSBQcm90b2NvbC5FWENFUFRJT04gdGhlbiIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgICA8PCAiICBsZXQgeCA9IEFwcGxpY2F0aW9uX0V4bi5yZWFkIGlwcm90IGluIiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIChpcHJvdCNyZWFkTWVzc2FnZUVuZDsiIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgIDw8ICIgICByYWlzZSAoQXBwbGljYXRpb25fRXhuLkUgeCkpIiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImVsc2UgKCkpOyIgPDwgZW5kbDsKLSAgICAgIHN0cmluZyByZXMgPSAiXyI7Ci0KLSAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOwotICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLQotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSB8fCB4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotICAgICAgICByZXMgPSAicmVzdWx0IjsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImxldCAiIDw8IHJlcyA8PCAiID0gcmVhZF8iIDw8IHJlc3VsdG5hbWUgPDwgIiBpcHJvdCBpbiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaXByb3QjcmVhZE1lc3NhZ2VFbmQ7IiA8PCBlbmRsOwotCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibWF0Y2ggcmVzdWx0I2dldF9zdWNjZXNzIHdpdGggU29tZSB2IC0+IHYgfCBOb25lIC0+ICgiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgfQotCi0gICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIobWF0Y2ggcmVzdWx0I2dldF8iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgICAgIDw8ICIgd2l0aCBOb25lIC0+ICgpIHwgU29tZSBfdiAtPiIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHJhaXNlICgiIDw8IGNhcGl0YWxpemUodHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIF92KSk7IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIigpIiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXwotICAgICAgICAgICAgPDwgaW5kZW50KCkKLSAgICAgICAgICAgIDw8ICJyYWlzZSAoQXBwbGljYXRpb25fRXhuLkUgKEFwcGxpY2F0aW9uX0V4bi5jcmVhdGUgQXBwbGljYXRpb25fRXhuLk1JU1NJTkdfUkVTVUxUIFwiIgotICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKSkpIiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgfQotCi0gICAgICAvLyBDbG9zZSBmdW5jdGlvbgotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgIH0KLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfaV8pIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiY2xhc3MgcHJvY2Vzc29yIChoYW5kbGVyIDogaWZhY2UpID0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9iamVjdCAoc2VsZikiCi0gICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlX2lfKSA8PCAiY2xhc3MgcHJvY2Vzc29yIDogaWZhY2UgLT4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9iamVjdCIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaW5oZXJpdCBQcm9jZXNzb3IudCIgPDwgZW5kbCA8PCBlbmRsOwotICBmX3NlcnZpY2VfaV8gPDwgaW5kZW50KCkgPDwgImluaGVyaXQgUHJvY2Vzc29yLnQiIDw8IGVuZGwgPDwgZW5kbDsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLQotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaW5oZXJpdCAiICsgZXh0ZW5kcyArICIucHJvY2Vzc29yIChoYW5kbGVyIDo+ICIgKyBleHRlbmRzICsgIi5pZmFjZSkiCi0gICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV9pXykgPDwgImluaGVyaXQgIiArIGV4dGVuZHMgKyAiLnByb2Nlc3NvciIgPDwgZW5kbDsKLSAgfQotCi0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInZhbCBwcm9jZXNzTWFwID0gSGFzaHRibC5jcmVhdGUgIiA8PCBmdW5jdGlvbnMuc2l6ZSgpIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50KGZfc2VydmljZV9pXykKLSAgICAgIDw8ICJ2YWwgcHJvY2Vzc01hcCA6IChzdHJpbmcsIGludCAqIFByb3RvY29sLnQgKiBQcm90b2NvbC50IC0+IHVuaXQpIEhhc2h0YmwudCIgPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAibWV0aG9kIHByb2Nlc3MgaXByb3Qgb3Byb3QgPSIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV9pXykgPDwgIm1ldGhvZCBwcm9jZXNzIDogUHJvdG9jb2wudCAtPiBQcm90b2NvbC50IC0+IGJvb2wiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImxldCAobmFtZSwgdHlwLCBzZXFpZCkgID0gaXByb3QjcmVhZE1lc3NhZ2VCZWdpbiBpbiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIC8vIFRPRE8obWNzbGVlKTogdmFsaWRhdGUgbWVzc2FnZQotCi0gIC8vIEhPVDogZGljdGlvbmFyeSBmdW5jdGlvbiBsb29rdXAKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgSGFzaHRibC5tZW0gcHJvY2Vzc01hcCBuYW1lIHRoZW4iIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICA8PCAiICAoSGFzaHRibC5maW5kIHByb2Nlc3NNYXAgbmFtZSkgKHNlcWlkLCBpcHJvdCwgb3Byb3QpIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgPDwgImVsc2UgKCIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBpcHJvdCNza2lwKFByb3RvY29sLlRfU1RSVUNUKTsiIDw8IGVuZGwKLSAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICBpcHJvdCNyZWFkTWVzc2FnZUVuZDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICA8PCAiICBsZXQgeCA9IEFwcGxpY2F0aW9uX0V4bi5jcmVhdGUgQXBwbGljYXRpb25fRXhuLlVOS05PV05fTUVUSE9EIChcIlVua25vd24gIgotICAgICAgICAgICAgICAgICJmdW5jdGlvbiBcIl5uYW1lKSBpbiIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgIDw8ICIgICAgb3Byb3Qjd3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgUHJvdG9jb2wuRVhDRVBUSU9OLCBzZXFpZCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgPDwgIiAgICB4I3dyaXRlIG9wcm90OyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICAgIG9wcm90I3dyaXRlTWVzc2FnZUVuZDsiIDw8IGVuZGwKLSAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAgIG9wcm90I2dldFRyYW5zcG9ydCNmbHVzaCIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgLy8gUmVhZCBlbmQgb2YgYXJncyBmaWVsZCwgdGhlIFRfU1RPUCwgYW5kIHRoZSBzdHJ1Y3QgY2xvc2UKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJ1ZSIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50X2Rvd24oKTsKLSAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7Ci0gIH0KLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImluaXRpYWxpemVyIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJIYXNodGJsLmFkZCBwcm9jZXNzTWFwIFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgIDw8ICJcIiBzZWxmI3Byb2Nlc3NfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlX2lfKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgKHZvaWQpdHNlcnZpY2U7Ci0gIC8vIE9wZW4gZnVuY3Rpb24KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJtZXRob2QgcHJpdmF0ZSBwcm9jZXNzXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICA8PCAiIChzZXFpZCwgaXByb3QsIG9wcm90KSA9IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBzdHJpbmcgYXJnc25hbWUgPSBkZWNhcGl0YWxpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICJfYXJncyI7Ci0gIHN0cmluZyByZXN1bHRuYW1lID0gZGVjYXBpdGFsaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiX3Jlc3VsdCI7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKLSAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIHN0cmluZyBhcmdzID0gImFyZ3MiOwotICBpZiAoZmllbGRzLnNpemUoKSA9PSAwKSB7Ci0gICAgYXJncyA9ICJfIjsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImxldCAiIDw8IGFyZ3MgPDwgIiA9IHJlYWRfIiA8PCBhcmdzbmFtZSA8PCAiIGlwcm90IGluIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaXByb3QjcmVhZE1lc3NhZ2VFbmQ7IiA8PCBlbmRsOwotCi0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0KLSAgLy8gRGVjbGFyZSByZXN1bHQgZm9yIG5vbiBvbmV3YXkgZnVuY3Rpb24KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibGV0IHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIiBpbiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgfQotCi0gIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKLSAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiKHRyeSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8ICJyZXN1bHQjc2V0X3N1Y2Nlc3MgIjsKLSAgfQotICBmX3NlcnZpY2VfIDw8ICIoaGFuZGxlciMiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBmX3NlcnZpY2VfIDw8ICIgYXJncyNnZXRfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIndpdGgiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInwgIiA8PCBjYXBpdGFsaXplKHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCkpKSA8PCAiICIKLSAgICAgICAgICAgICAgICAgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgLT4gIiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQjc2V0XyIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIgotICAgICAgICAgICAgICAgICAgIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIoKSI7Ci0gICAgICB9Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIpOyIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIFNob3J0Y3V0IG91dCBoZXJlIGZvciBvbmV3YXkgZnVuY3Rpb25zCi0gIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiKCkiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90I3dyaXRlTWVzc2FnZUJlZ2luIChcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgPDwgIlwiLCBQcm90b2NvbC5SRVBMWSwgc2VxaWQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0I3dyaXRlIG9wcm90OyIgPDwgZW5kbAotICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdCN3cml0ZU1lc3NhZ2VFbmQ7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgPDwgIm9wcm90I2dldFRyYW5zcG9ydCNmbHVzaCIgPDwgZW5kbDsKLQotICAvLyBDbG9zZSBmdW5jdGlvbgotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnRfZG93bigpOwotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKLSAgdF90eXBlKiB0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOwotCi0gIHN0cmluZyBuYW1lID0gZGVjYXBpdGFsaXplKHRmaWVsZC0+Z2V0X25hbWUoKSk7Ci0gIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiI3NldF8iIDw8IG5hbWUgPDwgIiAiOwotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG91dCwgdHlwZSk7Ci0gIG91dCA8PCBlbmRsOwotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEUiOwotICB9Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICBvdXQgPDwgImlwcm90IyI7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIG91dCA8PCAicmVhZFN0cmluZyI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICBvdXQgPDwgInJlYWRCb29sIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIG91dCA8PCAicmVhZEJ5dGUiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICBvdXQgPDwgInJlYWRJMTYiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICBvdXQgPDwgInJlYWRJMzIiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICBvdXQgPDwgInJlYWRJNjQiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBvdXQgPDwgInJlYWREb3VibGUiOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gb2NhbWwgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBzdHJpbmcgZW5hbWUgPSBjYXBpdGFsaXplKHR5cGUtPmdldF9uYW1lKCkpOwotICAgIG91dCA8PCAiKCIgPDwgZW5hbWUgPDwgIi5vZl9pIGlwcm90I3JlYWRJMzIpIjsKLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBUWVBFICclcydcbiIsIHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHN0cnVjdCwgY2FsbGluZyByZWFkKCkKLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyBwcmVmaXggPSAiIjsKLSAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHN0cnVjdC0+Z2V0X3Byb2dyYW0oKTsKLSAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7Ci0gICAgcHJlZml4ID0gY2FwaXRhbGl6ZShwcm9ncmFtLT5nZXRfbmFtZSgpKSArICJfdHlwZXMuIjsKLSAgfQotICBzdHJpbmcgbmFtZSA9IGRlY2FwaXRhbGl6ZSh0c3RydWN0LT5nZXRfbmFtZSgpKTsKLSAgb3V0IDw8ICIoIiA8PCBwcmVmaXggPDwgInJlYWRfIiA8PCBuYW1lIDw8ICIgaXByb3QpIjsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemUgYSBjb250YWluZXIgYnkgd3JpdGluZyBvdXQgdGhlIGhlYWRlciBmb2xsb3dlZCBieQotICogZGF0YSBhbmQgdGhlbiBhIGZvb3Rlci4KLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUpIHsKLSAgc3RyaW5nIHNpemUgPSB0bXAoIl9zaXplIik7Ci0gIHN0cmluZyBrdHlwZSA9IHRtcCgiX2t0eXBlIik7Ci0gIHN0cmluZyB2dHlwZSA9IHRtcCgiX3Z0eXBlIik7Ci0gIHN0cmluZyBldHlwZSA9IHRtcCgiX2V0eXBlIik7Ci0gIHN0cmluZyBjb24gPSB0bXAoIl9jb24iKTsKLQotICB0X2ZpZWxkIGZzaXplKGdfdHlwZV9pMzIsIHNpemUpOwotICB0X2ZpZWxkIGZrdHlwZShnX3R5cGVfYnl0ZSwga3R5cGUpOwotICB0X2ZpZWxkIGZ2dHlwZShnX3R5cGVfYnl0ZSwgdnR5cGUpOwotICB0X2ZpZWxkIGZldHlwZShnX3R5cGVfYnl0ZSwgZXR5cGUpOwotCi0gIG91dCA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiKGxldCAoIiA8PCBrdHlwZSA8PCAiLCIgPDwgdnR5cGUgPDwgIiwiIDw8IHNpemUgPDwgIikgPSBpcHJvdCNyZWFkTWFwQmVnaW4gaW4iCi0gICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAibGV0ICIgPDwgY29uIDw8ICIgPSBIYXNodGJsLmNyZWF0ZSAiIDw8IHNpemUgPDwgIiBpbiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiZm9yIGkgPSAxIHRvICIgPDwgc2l6ZSA8PCAiIGRvIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJsZXQgX2sgPSAiOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3V0LCAoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKTsKLSAgICBvdXQgPDwgIiBpbiIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAibGV0IF92ID0gIjsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG91dCwgKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSk7Ci0gICAgb3V0IDw8ICIgaW4iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIkhhc2h0YmwuYWRkICIgPDwgY29uIDw8ICIgX2sgX3YiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJkb25lOyBpcHJvdCNyZWFkTWFwRW5kOyAiIDw8IGNvbiA8PCAiKSI7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiKGxldCAoIiA8PCBldHlwZSA8PCAiLCIgPDwgc2l6ZSA8PCAiKSA9IGlwcm90I3JlYWRTZXRCZWdpbiBpbiIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAibGV0ICIgPDwgY29uIDw8ICIgPSBIYXNodGJsLmNyZWF0ZSAiIDw8IHNpemUgPDwgIiBpbiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiZm9yIGkgPSAxIHRvICIgPDwgc2l6ZSA8PCAiIGRvIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJIYXNodGJsLmFkZCAiIDw8IGNvbiA8PCAiICI7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvdXQsICgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKTsKLSAgICBvdXQgPDwgIiB0cnVlIiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgImRvbmU7IGlwcm90I3JlYWRTZXRFbmQ7ICIgPDwgY29uIDw8ICIpIjsKLSAgICBpbmRlbnRfZG93bigpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiKGxldCAoIiA8PCBldHlwZSA8PCAiLCIgPDwgc2l6ZSA8PCAiKSA9IGlwcm90I3JlYWRMaXN0QmVnaW4gaW4iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgImxldCAiIDw8IGNvbiA8PCAiID0gKEFycmF5LnRvX2xpc3QgKEFycmF5LmluaXQgIiA8PCBzaXplIDw8ICIgKGZ1biBfIC0+ICI7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvdXQsICgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSk7Ci0gICAgb3V0IDw8ICIpKSkgaW4iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgImlwcm90I3JlYWRMaXN0RW5kOyAiIDw8IGNvbiA8PCAiKSI7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQotICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob2ZzdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgbmFtZSkgewotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcwotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgaWYgKG5hbWUubGVuZ3RoKCkgPT0gMCkgewotICAgIG5hbWUgPSBkZWNhcGl0YWxpemUodGZpZWxkLT5nZXRfbmFtZSgpKTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3QjIjsKLQotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoIiA8PCBuYW1lIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIG91dCA8PCAid3JpdGVCb29sKCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBvdXQgPDwgIndyaXRlQnl0ZSgiIDw8IG5hbWUgPDwgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBvdXQgPDwgIndyaXRlSTE2KCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUk2NCgiIDw8IG5hbWUgPDwgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgIndyaXRlRG91YmxlKCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBvY2FtbCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIHN0cmluZyBlbmFtZSA9IGNhcGl0YWxpemUodHlwZS0+Z2V0X25hbWUoKSk7Ci0gICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgZW5hbWUgPDwgIi50b19pICIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgfQotCi0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAotICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKLSAgICAgICAgICAgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKLSAgfQotICBvdXQgPDwgIjsiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgewotICAodm9pZCl0c3RydWN0OwotICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiN3cml0ZShvcHJvdCkiOwotfQotCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdCN3cml0ZU1hcEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIsIjsKLSAgICBvdXQgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsIjsKLSAgICBvdXQgPDwgIkhhc2h0YmwubGVuZ3RoICIgPDwgcHJlZml4IDw8ICIpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qjd3JpdGVTZXRCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwiOwotICAgIG91dCA8PCAiSGFzaHRibC5sZW5ndGggIiA8PCBwcmVmaXggPDwgIik7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qjd3JpdGVMaXN0QmVnaW4oIiA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKQotICAgICAgICAgICAgICAgIDw8ICIsIjsKLSAgICBvdXQgPDwgIkxpc3QubGVuZ3RoICIgPDwgcHJlZml4IDw8ICIpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBzdHJpbmcga2l0ZXIgPSB0bXAoIl9raXRlciIpOwotICAgIHN0cmluZyB2aXRlciA9IHRtcCgiX3ZpdGVyIik7Ci0gICAgaW5kZW50KG91dCkgPDwgIkhhc2h0YmwuaXRlciAoZnVuICIgPDwga2l0ZXIgPDwgIiAtPiBmdW4gIiA8PCB2aXRlciA8PCAiIC0+ICIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBraXRlciwgdml0ZXIpOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIikgIiA8PCBwcmVmaXggPDwgIjsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgc3RyaW5nIGl0ZXIgPSB0bXAoIl9pdGVyIik7Ci0gICAgaW5kZW50KG91dCkgPDwgIkhhc2h0YmwuaXRlciAoZnVuICIgPDwgaXRlciA8PCAiIC0+IGZ1biBfIC0+ICI7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgaXRlcik7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiKSAiIDw8IHByZWZpeCA8PCAiOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgc3RyaW5nIGl0ZXIgPSB0bXAoIl9pdGVyIik7Ci0gICAgaW5kZW50KG91dCkgPDwgIkxpc3QuaXRlciAoZnVuICIgPDwgaXRlciA8PCAiIC0+ICI7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyKTsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICIpICIgPDwgcHJlZml4IDw8ICI7IiA8PCBlbmRsOwotICB9Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdCN3cml0ZU1hcEVuZCI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90I3dyaXRlU2V0RW5kIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90I3dyaXRlTGlzdEVuZCI7Ci0gIH0KLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgotICoKLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGtpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB2aXRlcikgewotICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2l0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkKTsKLQotICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdml0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkKTsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICduYW1lIGFyZ3MnCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCi0gKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCi0gKi8KLXN0cmluZyB0X29jYW1sX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RyaW5nIHByZWZpeCkgewotICByZXR1cm4gcHJlZml4ICsgZGVjYXBpdGFsaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiICIKLSAgICAgICAgICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpOwotfQotCi1zdHJpbmcgdF9vY2FtbF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3R5cGUodF9mdW5jdGlvbiogdGZ1bmMsIGJvb2wgbWV0aG9kLCBib29sIG9wdGlvbnMpIHsKLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRmdW5jLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgcmVzdWx0ICs9IHJlbmRlcl9vY2FtbF90eXBlKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKG9wdGlvbnMpCi0gICAgICByZXN1bHQgKz0gIiBvcHRpb24iOwotICAgIHJlc3VsdCArPSAiIC0+ICI7Ci0gIH0KLSAgaWYgKGZpZWxkcy5lbXB0eSgpICYmICFtZXRob2QpIHsKLSAgICByZXN1bHQgKz0gInVuaXQgLT4gIjsKLSAgfQotICByZXN1bHQgKz0gcmVuZGVyX29jYW1sX3R5cGUodGZ1bmMtPmdldF9yZXR1cm50eXBlKCkpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmaWVsZCBsaXN0Ci0gKi8KLXN0cmluZyB0X29jYW1sX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiICI7Ci0gICAgfQotICAgIHJlc3VsdCArPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RyaW5nIHRfb2NhbWxfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSkgewotICBzdHJpbmcgcHJlZml4ID0gIiI7Ci0gIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOwotICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKLSAgICBpZiAoIXR0eXBlLT5pc19zZXJ2aWNlKCkpIHsKLSAgICAgIHByZWZpeCA9IGNhcGl0YWxpemUocHJvZ3JhbS0+Z2V0X25hbWUoKSkgKyAiX3R5cGVzLiI7Ci0gICAgfQotICB9Ci0KLSAgc3RyaW5nIG5hbWUgPSB0dHlwZS0+Z2V0X25hbWUoKTsKLSAgaWYgKHR0eXBlLT5pc19zZXJ2aWNlKCkpIHsKLSAgICBuYW1lID0gY2FwaXRhbGl6ZShuYW1lKTsKLSAgfSBlbHNlIHsKLSAgICBuYW1lID0gZGVjYXBpdGFsaXplKG5hbWUpOwotICB9Ci0gIHJldHVybiBwcmVmaXggKyBuYW1lOwotfQotCi0vKioKLSAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgUHJvdG9jb2wudF90eXBlIGVudW0KLSAqLwotc3RyaW5nIHRfb2NhbWxfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgcmV0dXJuICJQcm90b2NvbC5UX1ZPSUQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICJQcm90b2NvbC5UX1NUUklORyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJQcm90b2NvbC5UX0JPT0wiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJldHVybiAiUHJvdG9jb2wuVF9CWVRFIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiUHJvdG9jb2wuVF9JMTYiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICJQcm90b2NvbC5UX0kzMiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gIlByb3RvY29sLlRfSTY0IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiUHJvdG9jb2wuVF9ET1VCTEUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIlByb3RvY29sLlRfSTMyIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuICJQcm90b2NvbC5UX1NUUlVDVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIlByb3RvY29sLlRfTUFQIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiUHJvdG9jb2wuVF9TRVQiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiAiUHJvdG9jb2wuVF9MSVNUIjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotLyoqCi0gKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhbiBvY2FtbCB0eXBlCi0gKi8KLXN0cmluZyB0X29jYW1sX2dlbmVyYXRvcjo6cmVuZGVyX29jYW1sX3R5cGUodF90eXBlKiB0eXBlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgcmV0dXJuICJ1bml0IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJldHVybiAic3RyaW5nIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gImJvb2wiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJldHVybiAiaW50IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiaW50IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiSW50MzIudCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gIkludDY0LnQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJmbG9hdCI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiBjYXBpdGFsaXplKCgodF9lbnVtKil0eXBlKS0+Z2V0X25hbWUoKSkgKyAiLnQiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gdHlwZV9uYW1lKCh0X3N0cnVjdCopdHlwZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgcmV0dXJuICIoIiArIHJlbmRlcl9vY2FtbF90eXBlKGt0eXBlKSArICIsIiArIHJlbmRlcl9vY2FtbF90eXBlKHZ0eXBlKSArICIpIEhhc2h0YmwudCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICByZXR1cm4gIigiICsgcmVuZGVyX29jYW1sX3R5cGUoZXR5cGUpICsgIixib29sKSBIYXNodGJsLnQiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICByZXR1cm4gcmVuZGVyX29jYW1sX3R5cGUoZXR5cGUpICsgIiBsaXN0IjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihvY2FtbCwgIk9DYW1sIiwgIiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI1ZDEwOC4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX09PUF9HRU5FUkFUT1JfSAotI2RlZmluZSBUX09PUF9HRU5FUkFUT1JfSAotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotCi0jaW5jbHVkZSAiZ2xvYmFscy5oIgotI2luY2x1ZGUgInRfZ2VuZXJhdG9yLmgiCi0jaW5jbHVkZSAidmVyc2lvbi5oIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotCi0vKioKLSAqIENsYXNzIHdpdGggdXRpbGl0eSBtZXRob2RzIHNoYXJlZCBhY3Jvc3MgY29tbW9uIG9iamVjdCBvcmllbnRlZCBsYW5ndWFnZXMuCi0gKiBTcGVjaWZpY2FsbHksIG1vc3Qgb2YgdGhpcyBzdHVmZiBpcyBmb3IgQysrL0phdmEuCi0gKgotICovCi1jbGFzcyB0X29vcF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9nZW5lcmF0b3IgewotcHVibGljOgotICB0X29vcF9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtKSA6IHRfZ2VuZXJhdG9yKHByb2dyYW0pIHt9Ci0KLSAgLyoqCi0gICAqIFNjb3BpbmcsIHVzaW5nIGN1cmx5IGJyYWNlcyEKLSAgICovCi0KLSAgdm9pZCBzY29wZV91cChzdGQ6Om9zdHJlYW0mIG91dCkgewotICAgIGluZGVudChvdXQpIDw8ICJ7IiA8PCBzdGQ6OmVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gIH0KLQotICB2b2lkIHNjb3BlX2Rvd24oc3RkOjpvc3RyZWFtJiBvdXQpIHsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBzdGQ6OmVuZGw7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyB1cGNhc2Vfc3RyaW5nKHN0ZDo6c3RyaW5nIG9yaWdpbmFsKSB7Ci0gICAgc3RkOjp0cmFuc2Zvcm0ob3JpZ2luYWwuYmVnaW4oKSwgb3JpZ2luYWwuZW5kKCksIG9yaWdpbmFsLmJlZ2luKCksIChpbnQgKCopKGludCkpdG91cHBlcik7Ci0gICAgcmV0dXJuIG9yaWdpbmFsOwotICB9Ci0KLSAgLyoqCi0gICAqIEdlbmVyYXRlcyBhIGNvbW1lbnQgYWJvdXQgdGhpcyBjb2RlIGJlaW5nIGF1dG9nZW5lcmF0ZWQsIHVzaW5nIEMrKyBzdHlsZQotICAgKiBjb21tZW50cywgd2hpY2ggYXJlIGFsc28gZmFpciBnYW1lIGluIEphdmEgLyBQSFAsIHlheSEKLSAgICoKLSAgICogQHJldHVybiBDLXN0eWxlIGNvbW1lbnQgbWVudGlvbmluZyB0aGF0IHRoaXMgZmlsZSBpcyBhdXRvZ2VuZXJhdGVkLgotICAgKi8KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBhdXRvZ2VuX2NvbW1lbnQoKSB7Ci0gICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCIvKipcbiIpICsgIiAqICIgKyBhdXRvZ2VuX3N1bW1hcnkoKSArICJcbiIgKyAiICpcbiIKLSAgICAgICAgICAgKyAiICogRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lOR1xuIgotICAgICAgICAgICArICIgKiAgQGdlbmVyYXRlZFxuIiArICIgKi9cbiI7Ci0gIH0KLQotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGF1dG9nZW5fc3VtbWFyeSgpIHsKLSAgICByZXR1cm4gc3RkOjpzdHJpbmcoIkF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgiKSArIFRIUklGVF9WRVJTSU9OICsgIikiOwotICB9Ci0KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRfZW51bV9jbGFzc19uYW1lKHRfdHlwZSogdHlwZSkgewotICAgIHN0ZDo6c3RyaW5nIHBhY2thZ2UgPSAiIjsKLSAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0eXBlLT5nZXRfcHJvZ3JhbSgpOwotICAgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgewotICAgICAgcGFja2FnZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImphdmEiKSArICIuIjsKLSAgICB9Ci0gICAgcmV0dXJuIHBhY2thZ2UgKyB0eXBlLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX2phdmFfZG9jc3RyaW5nX2NvbW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBjb250ZW50cykgewotICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwgIi8qKlxuIiwgIiAqICIsIGNvbnRlbnRzLCAiICovXG4iKTsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9qYXZhX2RvYyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKSB7Ci0gICAgaWYgKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19lbnVtKCkpIHsKLSAgICAgIHN0ZDo6c3RyaW5nIGNvbWJpbmVkX21lc3NhZ2UgPSBmaWVsZC0+Z2V0X2RvYygpICsgIlxuQHNlZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBnZXRfZW51bV9jbGFzc19uYW1lKGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgICAgIGdlbmVyYXRlX2phdmFfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCBjb21iaW5lZF9tZXNzYWdlKTsKLSAgICB9IGVsc2UgewotICAgICAgZ2VuZXJhdGVfamF2YV9kb2Mob3V0LCAodF9kb2MqKWZpZWxkKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogRW1pdHMgYSBKYXZhRG9jIGNvbW1lbnQgaWYgdGhlIHByb3ZpZGVkIG9iamVjdCBoYXMgYSBkb2MgaW4gVGhyaWZ0Ci0gICAqLwotICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfamF2YV9kb2Moc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2RvYyogdGRvYykgewotICAgIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKLSAgICAgIGdlbmVyYXRlX2phdmFfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCB0ZG9jLT5nZXRfZG9jKCkpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBFbWl0cyBhIEphdmFEb2MgY29tbWVudCBpZiB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gb2JqZWN0IGhhcyBhIGRvYyBpbiBUaHJpZnQKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9qYXZhX2RvYyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICAgIGlmICh0ZnVuY3Rpb24tPmhhc19kb2MoKSkgewotICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7Ci0gICAgICBzcyA8PCB0ZnVuY3Rpb24tPmdldF9kb2MoKTsKLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOwotICAgICAgc3RkOjp2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBwX2l0ZXI7Ci0gICAgICBmb3IgKHBfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBwX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK3BfaXRlcikgewotICAgICAgICB0X2ZpZWxkKiBwID0gKnBfaXRlcjsKLSAgICAgICAgc3MgPDwgIlxuQHBhcmFtICIgPDwgcC0+Z2V0X25hbWUoKTsKLSAgICAgICAgaWYgKHAtPmhhc19kb2MoKSkgewotICAgICAgICAgIHNzIDw8ICIgIiA8PCBwLT5nZXRfZG9jKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwgIi8qKlxuIiwgIiAqICIsIHNzLnN0cigpLCAiICovXG4iKTsKLSAgICB9Ci0gIH0KLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3BlcmxfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3BlcmxfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjUyYzI0Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9wZXJsX2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDE2NDIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPGxpc3Q+Ci0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSAidF9vb3BfZ2VuZXJhdG9yLmgiCi0jaW5jbHVkZSAicGxhdGZvcm0uaCIKLSNpbmNsdWRlICJ2ZXJzaW9uLmgiCi0KLXVzaW5nIHN0ZDo6bWFwOwotdXNpbmcgc3RkOjpvZnN0cmVhbTsKLXVzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKLXVzaW5nIHN0ZDo6c3RyaW5nOwotdXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Ci11c2luZyBzdGQ6OnZlY3RvcjsKLQotc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcwotCi0vKioKLSAqIFBFUkwgY29kZSBnZW5lcmF0b3IuCi0gKgotICovCi1jbGFzcyB0X3BlcmxfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7Ci1wdWJsaWM6Ci0gIHRfcGVybF9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQotICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKLSAgICAodm9pZClwYXJzZWRfb3B0aW9uczsKLSAgICAodm9pZClvcHRpb25fc3RyaW5nOwotICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLXBlcmwiOwotICAgIGVzY2FwZV9bJyQnXSA9ICJcXCQiOwotICAgIGVzY2FwZV9bJ0AnXSA9ICJcXEAiOwotICB9Ci0KLSAgLyoqCi0gICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKLSAgICovCi0KLSAgdm9pZCBpbml0X2dlbmVyYXRvcigpOwotICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOwotCi0gIC8qKgotICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKLSAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOwotICB2b2lkIGdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOwotCi0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKLQotICAvKioKLSAgICogU3RydWN0cyEKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9wZXJsX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX3Blcmxfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UpOwotICB2b2lkIGdlbmVyYXRlX3Blcmxfc3RydWN0X3JlYWRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9wZXJsX3N0cnVjdF93cml0ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfcGVybF9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0KLSAgLyoqCi0gICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9yZXN0KHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICAvKioKLSAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2xhc3MgPSBmYWxzZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcga2l0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHZpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0bWFwLCBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICAvKioKLSAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKLSAgICovCi0KLSAgc3RkOjpzdHJpbmcgcGVybF9pbmNsdWRlcygpOwotICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0ID0gZmFsc2UsIGJvb2wgb2JqID0gZmFsc2UpOwotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0gIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7Ci0KLSAgc3RkOjpzdHJpbmcgYXV0b2dlbl9jb21tZW50KCkgewotICAgIHJldHVybiBzdGQ6OnN0cmluZygiI1xuIikgKyAiIyBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoIiArIFRIUklGVF9WRVJTSU9OICsgIilcbiIKLSAgICAgICAgICAgKyAiI1xuIiArICIjIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkdcbiIgKyAiI1xuIjsKLSAgfQotCi0gIHZvaWQgcGVybF9uYW1lc3BhY2VfZGlycyh0X3Byb2dyYW0qIHAsIHN0ZDo6bGlzdDxzdGQ6OnN0cmluZz4mIGRpcnMpIHsKLSAgICBzdGQ6OnN0cmluZyBucyA9IHAtPmdldF9uYW1lc3BhY2UoInBlcmwiKTsKLSAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGxvYzsKLQotICAgIGlmIChucy5zaXplKCkgPiAwKSB7Ci0gICAgICB3aGlsZSAoKGxvYyA9IG5zLmZpbmQoIi4iKSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKLSAgICAgICAgZGlycy5wdXNoX2JhY2sobnMuc3Vic3RyKDAsIGxvYykpOwotICAgICAgICBucyA9IG5zLnN1YnN0cihsb2MgKyAxKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobnMuc2l6ZSgpID4gMCkgewotICAgICAgZGlycy5wdXNoX2JhY2sobnMpOwotICAgIH0KLSAgfQotCi0gIHN0ZDo6c3RyaW5nIHBlcmxfbmFtZXNwYWNlKHRfcHJvZ3JhbSogcCkgewotICAgIHN0ZDo6c3RyaW5nIG5zID0gcC0+Z2V0X25hbWVzcGFjZSgicGVybCIpOwotICAgIHN0ZDo6c3RyaW5nIHJlc3VsdCA9ICIiOwotICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgbG9jOwotCi0gICAgaWYgKG5zLnNpemUoKSA+IDApIHsKLSAgICAgIHdoaWxlICgobG9jID0gbnMuZmluZCgiLiIpKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgewotICAgICAgICByZXN1bHQgKz0gbnMuc3Vic3RyKDAsIGxvYyk7Ci0gICAgICAgIHJlc3VsdCArPSAiOjoiOwotICAgICAgICBucyA9IG5zLnN1YnN0cihsb2MgKyAxKTsKLSAgICAgIH0KLQotICAgICAgaWYgKG5zLnNpemUoKSA+IDApIHsKLSAgICAgICAgcmVzdWx0ICs9IG5zICsgIjo6IjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgZ2V0X25hbWVzcGFjZV9vdXRfZGlyKCkgewotICAgIHN0ZDo6c3RyaW5nIG91dGRpciA9IGdldF9vdXRfZGlyKCk7Ci0gICAgc3RkOjpsaXN0PHN0ZDo6c3RyaW5nPiBkaXJzOwotICAgIHBlcmxfbmFtZXNwYWNlX2RpcnMocHJvZ3JhbV8sIGRpcnMpOwotICAgIHN0ZDo6bGlzdDxzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIGl0OwotICAgIGZvciAoaXQgPSBkaXJzLmJlZ2luKCk7IGl0ICE9IGRpcnMuZW5kKCk7IGl0KyspIHsKLSAgICAgIG91dGRpciArPSAqaXQgKyAiLyI7Ci0gICAgfQotICAgIHJldHVybiBvdXRkaXI7Ci0gIH0KLQotcHJpdmF0ZToKLSAgLyoqCi0gICAqIEZpbGUgc3RyZWFtcwotICAgKi8KLSAgc3RkOjpvZnN0cmVhbSBmX3R5cGVzXzsKLSAgc3RkOjpvZnN0cmVhbSBmX2NvbnN0c187Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9oZWxwZXJzXzsKLSAgc3RkOjpvZnN0cmVhbSBmX3NlcnZpY2VfOwotfTsKLQotLyoqCi0gKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAotICogc3RyZWFtcy4KLSAqCi0gKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKLSAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5Ci0gIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7Ci0KLSAgc3RyaW5nIG91dGRpciA9IGdldF9vdXRfZGlyKCk7Ci0gIHN0ZDo6bGlzdDxzdGQ6OnN0cmluZz4gZGlyczsKLSAgcGVybF9uYW1lc3BhY2VfZGlycyhwcm9ncmFtXywgZGlycyk7Ci0gIHN0ZDo6bGlzdDxzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIGl0OwotICBmb3IgKGl0ID0gZGlycy5iZWdpbigpOyBpdCAhPSBkaXJzLmVuZCgpOyBpdCsrKSB7Ci0gICAgb3V0ZGlyICs9ICppdCArICIvIjsKLSAgICBNS0RJUihvdXRkaXIuY19zdHIoKSk7Ci0gIH0KLQotICAvLyBNYWtlIG91dHB1dCBmaWxlCi0gIHN0cmluZyBmX3R5cGVzX25hbWUgPSBvdXRkaXIgKyAiVHlwZXMucG0iOwotICBmX3R5cGVzXy5vcGVuKGZfdHlwZXNfbmFtZS5jX3N0cigpKTsKLSAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBvdXRkaXIgKyAiQ29uc3RhbnRzLnBtIjsKLSAgZl9jb25zdHNfLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKLQotICAvLyBQcmludCBoZWFkZXIKLSAgZl90eXBlc18gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgcGVybF9pbmNsdWRlcygpOwotCi0gIC8vIFByaW50IGhlYWRlcgotICBmX2NvbnN0c18gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgInBhY2thZ2UgIiA8PCBwZXJsX25hbWVzcGFjZShwcm9ncmFtXykgPDwgIkNvbnN0YW50czsiIDw8IGVuZGwKLSAgICAgICAgICAgIDw8IHBlcmxfaW5jbHVkZXMoKSA8PCBlbmRsOwotfQotCi0vKioKLSAqIFByaW50cyBzdGFuZGFyZCBqYXZhIGltcG9ydHMKLSAqLwotc3RyaW5nIHRfcGVybF9nZW5lcmF0b3I6OnBlcmxfaW5jbHVkZXMoKSB7Ci0gIHN0cmluZyBpbmM7Ci0KLSAgaW5jID0gInJlcXVpcmUgNS42LjA7XG4iOwotICBpbmMgKz0gInVzZSBzdHJpY3Q7XG4iOwotICBpbmMgKz0gInVzZSB3YXJuaW5ncztcbiI7Ci0gIGluYyArPSAidXNlIFRocmlmdDtcblxuIjsKLQotICByZXR1cm4gaW5jOwotfQotCi0vKioKLSAqIENsb3NlIHVwIChvciBkb3duKSBzb21lIGZpbGV6LgotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKLSAgLy8gQ2xvc2UgdHlwZXMgZmlsZQotICBmX3R5cGVzXyA8PCAiMTsiIDw8IGVuZGw7Ci0gIGZfdHlwZXNfLmNsb3NlKCk7Ci0KLSAgZl9jb25zdHNfIDw8ICIxOyIgPDwgZW5kbDsKLSAgZl9jb25zdHNfLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBub3QgZG9uZSBpbiBQRVJMLCB0eXBlcyBhcmUgYWxsIGltcGxpY2l0LgotICoKLSAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7Ci0gICh2b2lkKXR0eXBlZGVmOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuIFNpbmNlIGRlZmluZSBpcyBleHBlbnNpdmUgdG8gbG9va3VwCi0gKiBpbiBQRVJMLCB3ZSB1c2UgYSBnbG9iYWwgYXJyYXkgZm9yIHRoaXMuCi0gKgotICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgewotICBmX3R5cGVzXyA8PCAicGFja2FnZSAiIDw8IHBlcmxfbmFtZXNwYWNlKHByb2dyYW1fKSA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLQotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICBmX3R5cGVzXyA8PCAidXNlIGNvbnN0YW50ICIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPT4gIiA8PCB2YWx1ZSA8PCAiOyIgPDwgZW5kbDsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlIGEgY29uc3RhbnQgdmFsdWUKLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKLSAgdF90eXBlKiB0eXBlID0gdGNvbnN0LT5nZXRfdHlwZSgpOwotICBzdHJpbmcgbmFtZSA9IHRjb25zdC0+Z2V0X25hbWUoKTsKLSAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSB0Y29uc3QtPmdldF92YWx1ZSgpOwotCi0gIGZfY29uc3RzXyA8PCAidXNlIGNvbnN0YW50ICIgPDwgbmFtZSA8PCAiID0+ICI7Ci0gIGZfY29uc3RzXyA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpOwotICBmX2NvbnN0c18gPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKLSAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCi0gKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYwotICovCi1zdHJpbmcgdF9wZXJsX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKLQotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgb3V0IDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIG91dCA8PCAodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwID8gIjEiIDogIjAiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgb3V0IDw8ICJuZXcgIiA8PCBwZXJsX25hbWVzcGFjZSh0eXBlLT5nZXRfcHJvZ3JhbSgpKSA8PCB0eXBlLT5nZXRfbmFtZSgpIDw8ICIoeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKLSAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7Ci0gICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOwotICAgICAgfQotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShnX3R5cGVfc3RyaW5nLCB2X2l0ZXItPmZpcnN0KTsKLSAgICAgIG91dCA8PCAiID0+ICI7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgIG91dCA8PCAiLCI7Ci0gICAgICBvdXQgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBvdXQgPDwgIn0pIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICBvdXQgPDwgInsiIDw8IGVuZGw7Ci0KLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKLSAgICAgIG91dCA8PCAiID0+ICI7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgb3V0IDw8ICJ9IjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlOwotICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9Ci0gICAgb3V0IDw8ICJbIiA8PCBlbmRsOwotICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotCi0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKTsKLSAgICAgIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgICAgICBvdXQgPDwgIiA9PiAxIjsKLSAgICAgIH0KLSAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0IDw8ICJdIjsKLSAgfQotICByZXR1cm4gb3V0LnN0cigpOwotfQotCi0vKioKLSAqIE1ha2UgYSBzdHJ1Y3QKLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgZ2VuZXJhdGVfcGVybF9zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBleGNlcHRpb24uIEJhc2ljYWxseSB0aGUgc2FtZQotICogYXMgYSBzdHJ1Y3QgYnV0IGV4dGVuZHMgdGhlIEV4Y2VwdGlvbiBjbGFzcy4KLSAqCi0gKiBAcGFyYW0gdHhjZXB0aW9uIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfcGVybF9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKLX0KLQotLyoqCi0gKiBTdHJ1Y3RzIGNhbiBiZSBub3JtYWwgb3IgZXhjZXB0aW9ucy4KLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wZXJsX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfcGVybF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3R5cGVzXywgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLiBUaGlzIGlzIG5vdGhpbmcgaW4gUEVSTAotICogd2hlcmUgdGhlIG9iamVjdHMgYXJlIGFsbCBqdXN0IGFzc29jaWF0aXZlIGFycmF5cyAodW5sZXNzIG9mIGNvdXJzZSB3ZQotICogZGVjaWRlIHRvIHN0YXJ0IHVzaW5nIG9iamVjdHMgZm9yIHRoZW0uLi4pCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGVybF9zdHJ1Y3RfZGVmaW5pdGlvbihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgb3V0IDw8ICJwYWNrYWdlICIgPDwgcGVybF9uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiO1xuIjsKLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIG91dCA8PCAidXNlIGJhc2UgcXcoVGhyaWZ0OjpURXhjZXB0aW9uKTtcbiI7Ci0gIH0KLQotICAvLyBDcmVhdGUgc2ltcGxlIGFjZXNzb3IgbWV0aG9kcwotICBvdXQgPDwgInVzZSBiYXNlIHF3KENsYXNzOjpBY2Nlc3Nvcik7XG4iOwotCi0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICBvdXQgPDwgcGVybF9uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiLT5ta19hY2Nlc3NvcnMoIHF3KCAiOwotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICAgIGlmICghdC0+aXNfeGNlcHRpb24oKSkgewotICAgICAgICBvdXQgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBvdXQgPDwgIikgKTtcbiI7Ci0gIH0KLQotICBvdXQgPDwgZW5kbDsKLQotICAvLyBuZXcoKQotICBpbmRlbnRfdXAoKTsKLSAgb3V0IDw8ICJzdWIgbmV3IHsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm15ICRjbGFzc25hbWUgPSBzaGlmdDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgIDw8ICJteSAkc2VsZiAgICAgID0ge307IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJteSAkdmFscyAgICAgID0gc2hpZnQgfHwge307IiA8PCBlbmRsOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBzdHJpbmcgZHZhbCA9ICJ1bmRlZiI7Ci0gICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwgJiYgISh0LT5pc19zdHJ1Y3QoKSB8fCB0LT5pc194Y2VwdGlvbigpKSkgewotICAgICAgZHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZSgoKm1faXRlciktPmdldF90eXBlKCksICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkpOwotICAgIH0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiRzZWxmLT57IiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIn0gPSAiIDw8IGR2YWwgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSBjb25zdHJ1Y3RvciBmcm9tIGFycmF5Ci0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLQotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwgJiYgKHQtPmlzX3N0cnVjdCgpIHx8IHQtPmlzX3hjZXB0aW9uKCkpKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICIkc2VsZi0+eyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgICAgIDw8ICJ9ID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodCwgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoVU5JVkVSU0FMOjppc2EoJHZhbHMsJ0hBU0gnKSkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChkZWZpbmVkICR2YWxzLT57IiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIn0pIHsiIDw8IGVuZGwKLSAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAkc2VsZi0+eyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJ9ID0gJHZhbHMtPnsiCi0gICAgICAgICAgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJ9OyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLQotICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBibGVzcyAoJHNlbGYsICRjbGFzc25hbWUpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8ICJ9XG5cbiI7Ci0KLSAgb3V0IDw8ICJzdWIgZ2V0TmFtZSB7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAnIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICInOyIgPDwgZW5kbAotICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9wZXJsX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfcGVybF9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSByZWFkKCkgbWV0aG9kIGZvciBhIHN0cnVjdAotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Blcmxfc3RydWN0X3JlYWRlcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgb3V0IDw8ICJzdWIgcmVhZCB7IiA8PCBlbmRsOwotCi0gIGluZGVudF91cCgpOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAibXkgKCRzZWxmLCAkaW5wdXQpID0gQF87IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJteSAkeGZlciAgPSAwOyIgPDwgZW5kbAotICAgICAgPDwgaW5kZW50KCkgPDwgIm15ICRmbmFtZTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm15ICRmdHlwZSA9IDA7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICA8PCAibXkgJGZpZCAgID0gMDsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZFN0cnVjdEJlZ2luKFxcJGZuYW1lKTsiIDw8IGVuZGw7Ci0KLSAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCi0gIGluZGVudChvdXQpIDw8ICJ3aGlsZSAoMSkgIiA8PCBlbmRsOwotCi0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZEZpZWxkQmVnaW4oXFwkZm5hbWUsIFxcJGZ0eXBlLCBcXCRmaWQpOyIgPDwgZW5kbDsKLQotICAvLyBDaGVjayBmb3IgZmllbGQgU1RPUCBtYXJrZXIgYW5kIGJyZWFrCi0gIGluZGVudChvdXQpIDw8ICJpZiAoJGZ0eXBlID09IFRUeXBlOjpTVE9QKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgImxhc3Q7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICAvLyBTd2l0Y2ggc3RhdGVtZW50IG9uIHRoZSBmaWVsZCB3ZSBhcmUgcmVhZGluZwotICBpbmRlbnQob3V0KSA8PCAiU1dJVENIOiBmb3IoJGZpZCkiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfdXAob3V0KTsKLQotICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLQotICAgIGluZGVudChvdXQpIDw8ICIvXiIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiQvICYmIGRveyI7Ci0gICAgaW5kZW50KG91dCkgPDwgImlmICgkZnR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSB7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X3VwKCk7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAic2VsZi0+Iik7Ci0gICAgaW5kZW50X2Rvd24oKTsKLQotICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKLQotICAgIGluZGVudChvdXQpIDw8ICIgICR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOyIgPDwgZW5kbDsKLQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAibGFzdDsgfTsiIDw8IGVuZGw7Ci0gIH0KLSAgLy8gSW4gdGhlIGRlZmF1bHQgY2FzZSB3ZSBza2lwIHRoZSBmaWVsZAotCi0gIGluZGVudChvdXQpIDw8ICIgICR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOyIgPDwgZW5kbDsKLQotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZEZpZWxkRW5kKCk7IiA8PCBlbmRsOwotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RydWN0RW5kKCk7IiA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJyZXR1cm4gJHhmZXI7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgd3JpdGUoKSBtZXRob2QgZm9yIGEgc3RydWN0Ci0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGVybF9zdHJ1Y3Rfd3JpdGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBvdXQgPDwgInN1YiB3cml0ZSB7IiA8PCBlbmRsOwotCi0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAibXkgKCRzZWxmLCAkb3V0cHV0KSA9IEBfOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIm15ICR4ZmVyICAgPSAwOyIgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RCZWdpbignIiA8PCBuYW1lIDw8ICInKTsiIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChkZWZpbmVkICRzZWxmLT57IiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIn0pIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEJlZ2luKCIKLSAgICAgICAgICAgICAgICA8PCAiJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpCi0gICAgICAgICAgICAgICAgPDwgIiwgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJzZWxmLT4iKTsKLQotICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgfQotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAkeGZlcjsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gZ2V0X25hbWVzcGFjZV9vdXRfZGlyKCkgKyBzZXJ2aWNlX25hbWVfICsgIi5wbSI7Ci0gIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgICAvLy8gICAgICAicGFja2FnZSAiPDxzZXJ2aWNlX25hbWVfPDwiOyI8PGVuZGw8PAotICAgICAgYXV0b2dlbl9jb21tZW50KCkgPDwgcGVybF9pbmNsdWRlcygpOwotCi0gIGZfc2VydmljZV8gPDwgInVzZSAiIDw8IHBlcmxfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCAiVHlwZXM7IiA8PCBlbmRsOwotCi0gIHRfc2VydmljZSogZXh0ZW5kc19zID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7Ci0gIGlmIChleHRlbmRzX3MgIT0gTlVMTCkgewotICAgIGZfc2VydmljZV8gPDwgInVzZSAiIDw8IHBlcmxfbmFtZXNwYWNlKGV4dGVuZHNfcy0+Z2V0X3Byb2dyYW0oKSkgPDwgZXh0ZW5kc19zLT5nZXRfbmFtZSgpIDw8ICI7IgotICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgdGhyZWUgbWFpbiBwYXJ0cyBvZiB0aGUgc2VydmljZSAod2VsbCwgdHdvIGZvciBub3cgaW4gUEVSTCkKLSAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX3Jlc3QodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRzZXJ2aWNlKTsKLQotICAvLyBDbG9zZSBzZXJ2aWNlIGZpbGUKLSAgZl9zZXJ2aWNlXyA8PCAiMTsiIDw8IGVuZGw7Ci0gIGZfc2VydmljZV8uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKLSAgdF9zZXJ2aWNlKiBleHRlbmRzX3MgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKLSAgaWYgKGV4dGVuZHNfcyAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHBlcmxfbmFtZXNwYWNlKGV4dGVuZHNfcy0+Z2V0X3Byb2dyYW0oKSkgKyBleHRlbmRzX3MtPmdldF9uYW1lKCk7Ci0gICAgZXh0ZW5kc19wcm9jZXNzb3IgPSAidXNlIGJhc2UgcXcoIiArIGV4dGVuZHMgKyAiUHJvY2Vzc29yKTsiOwotICB9Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCi0gIGZfc2VydmljZV8gPDwgInBhY2thZ2UgIiA8PCBwZXJsX25hbWVzcGFjZShwcm9ncmFtXykgPDwgc2VydmljZV9uYW1lXyA8PCAiUHJvY2Vzc29yOyIgPDwgZW5kbAotICAgICAgICAgICAgIDw8IGVuZGwgPDwgInVzZSBzdHJpY3Q7IiA8PCBlbmRsIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAic3ViIG5ldyB7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJteSAoJGNsYXNzbmFtZSwgJGhhbmRsZXIpID0gQF87IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICA8PCAibXkgJHNlbGYgICAgICA9IHt9OyIgPDwgZW5kbDsKLQotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiRzZWxmLT57aGFuZGxlcn0gPSAkaGFuZGxlcjsiIDw8IGVuZGw7Ci0KLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gYmxlc3MgKCRzZWxmLCAkY2xhc3NuYW1lKTsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotCi0gICAgZl9zZXJ2aWNlXyA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHNlcnZlciBpbXBsZW1lbnRhdGlvbgotICBmX3NlcnZpY2VfIDw8ICJzdWIgcHJvY2VzcyB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJteSAoJHNlbGYsICRpbnB1dCwgJG91dHB1dCkgPSBAXzsiIDw8IGVuZGw7Ci0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibXkgJHJzZXFpZCA9IDA7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJteSAkZm5hbWUgID0gdW5kZWY7IiA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm15ICRtdHlwZSAgPSAwOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiRpbnB1dC0+cmVhZE1lc3NhZ2VCZWdpbihcXCRmbmFtZSwgXFwkbXR5cGUsIFxcJHJzZXFpZCk7IiA8PCBlbmRsOwotCi0gIC8vIEhPVDogY2hlY2sgZm9yIG1ldGhvZCBpbXBsZW1lbnRhdGlvbgotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJteSAkbWV0aG9kbmFtZSA9ICdwcm9jZXNzXycuJGZuYW1lOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgIDw8ICJpZiAoISRzZWxmLT5jYW4oJG1ldGhvZG5hbWUpKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkaW5wdXQtPnNraXAoVFR5cGU6OlNUUlVDVCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgPDwgIiRpbnB1dC0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICA8PCAibXkgJHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKCdGdW5jdGlvbiAnLiRmbmFtZS4nIG5vdCBpbXBsZW1lbnRlZC4nLCAiCi0gICAgICAgICAgICAgICAgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6VU5LTk9XTl9NRVRIT0QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgIDw8ICIkb3V0cHV0LT53cml0ZU1lc3NhZ2VCZWdpbigkZm5hbWUsIFRNZXNzYWdlVHlwZTo6RVhDRVBUSU9OLCAkcnNlcWlkKTsiIDw8IGVuZGwKLSAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJHgtPndyaXRlKCRvdXRwdXQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgIDw8ICIkb3V0cHV0LT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICA8PCAiJG91dHB1dC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICA8PCAiJHNlbGYtPiRtZXRob2RuYW1lKCRyc2VxaWQsICRpbnB1dCwgJG91dHB1dCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gMTsiCi0gICAgICAgICAgICAgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotCi0gIGZfc2VydmljZV8gPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgLy8gT3BlbiBmdW5jdGlvbgotICBmX3NlcnZpY2VfIDw8ICJzdWIgcHJvY2Vzc18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiIHsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibXkgKCRzZWxmLCAkc2VxaWQsICRpbnB1dCwgJG91dHB1dCkgPSBAXzsiIDw8IGVuZGw7Ci0KLSAgc3RyaW5nIGFyZ3NuYW1lID0gcGVybF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpICsgc2VydmljZV9uYW1lXyArICJfIgotICAgICAgICAgICAgICAgICAgICArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyI7Ci0gIHN0cmluZyByZXN1bHRuYW1lID0gcGVybF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpICsgc2VydmljZV9uYW1lXyArICJfIgotICAgICAgICAgICAgICAgICAgICAgICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOwotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm15ICRhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgIDw8ICIkYXJncy0+cmVhZCgkaW5wdXQpOyIgPDwgZW5kbDsKLQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkaW5wdXQtPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOwotCi0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0KLSAgLy8gRGVjbGFyZSByZXN1bHQgZm9yIG5vbiBvbmV3YXkgZnVuY3Rpb24KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibXkgJHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKLSAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZXZhbCB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKLSAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8ICIkcmVzdWx0LT57c3VjY2Vzc30gPSAiOwotICB9Ci0gIGZfc2VydmljZV8gPDwgIiRzZWxmLT57aGFuZGxlcn0tPiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICIsICI7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgIiRhcmdzLT4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgfQotICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKLQotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9OyBpZiggVU5JVkVSU0FMOjppc2EoJEAsJyIKLSAgICAgICAgICAgICAgICAgPDwgcGVybF9uYW1lc3BhY2UoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfcHJvZ3JhbSgpKQotICAgICAgICAgICAgICAgICA8PCAoKnhfaXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCkgPDwgIicpICl7ICIgPDwgZW5kbDsKLQotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkcmVzdWx0LT57IiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIn0gPSAkQDsiIDw8IGVuZGw7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkQCA9IHVuZGVmOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsOwotCi0gICAgLy8gY2F0Y2gtYWxsIGZvciB1bmV4cGVjdGVkIGV4Y2VwdGlvbnMgKFRIUklGVC0zMTkxKQotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmICgkQCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkQCA9fiBzL15cXHMrfFxccyskLy9nOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm15ICRlcnIgPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFwiVW5leHBlY3RlZCBFeGNlcHRpb246IFwiIC4gJEAsIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6SU5URVJOQUxfRVJST1IpOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQtPndyaXRlTWVzc2FnZUJlZ2luKCciIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiJywgVE1lc3NhZ2VUeXBlOjpFWENFUFRJT04sICRzZXFpZCk7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJGVyci0+d3JpdGUoJG91dHB1dCk7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dC0+d3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJEAgPSB1bmRlZjsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIFNob3J0Y3V0IG91dCBoZXJlIGZvciBvbmV3YXkgZnVuY3Rpb25zCi0gIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwgIn0iIDw8IGVuZGw7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gU2VyaWFsaXplIHRoZSByZXBseQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkb3V0cHV0LT53cml0ZU1lc3NhZ2VCZWdpbignIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIicsIFRNZXNzYWdlVHlwZTo6UkVQTFksICRzZXFpZCk7IiA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRyZXN1bHQtPndyaXRlKCRvdXRwdXQpOyIgPDwgZW5kbAotICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkb3V0cHV0LT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwKLSAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsOwotCi0gIC8vIENsb3NlIGZ1bmN0aW9uCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgYSBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gIGZfc2VydmljZV8gPDwgIiMgSEVMUEVSIEZVTkNUSU9OUyBBTkQgU1RSVUNUVVJFUyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIHN0cmluZyBuYW1lID0gdHMtPmdldF9uYW1lKCk7Ci0gICAgdHMtPnNldF9uYW1lKHNlcnZpY2VfbmFtZV8gKyAiXyIgKyBuYW1lKTsKLSAgICBnZW5lcmF0ZV9wZXJsX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sIHRzLCBmYWxzZSk7Ci0gICAgZ2VuZXJhdGVfcGVybF9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOwotICAgIHRzLT5zZXRfbmFtZShuYW1lKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BlcmxfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCBzZXJ2aWNlX25hbWVfICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKLSAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKLSAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOwotICB9Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKLSAgfQotCi0gIGdlbmVyYXRlX3Blcmxfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZXh0ZW5kc19pZiA9ICIiOwotICB0X3NlcnZpY2UqIGV4dGVuZHNfcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOwotICBpZiAoZXh0ZW5kc19zICE9IE5VTEwpIHsKLSAgICBleHRlbmRzX2lmID0gInVzZSBiYXNlIHF3KCIgKyBwZXJsX25hbWVzcGFjZShleHRlbmRzX3MtPmdldF9wcm9ncmFtKCkpICsgZXh0ZW5kc19zLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgICsgIklmKTsiOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PCAicGFja2FnZSAiIDw8IHBlcmxfbmFtZXNwYWNlKHByb2dyYW1fKSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZjsiIDw8IGVuZGwgPDwgZW5kbAotICAgICAgICAgICAgIDw8ICJ1c2Ugc3RyaWN0OyIgPDwgZW5kbCA8PCBleHRlbmRzX2lmIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAic3ViICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGwgPDwgIiAgZGllICdpbXBsZW1lbnQgaW50ZXJmYWNlJztcbn0iCi0gICAgICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBSRVNUIGludGVyZmFjZQotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfcmVzdCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX2lmID0gIiI7Ci0gIHRfc2VydmljZSogZXh0ZW5kc19zID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7Ci0gIGlmIChleHRlbmRzX3MgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSBleHRlbmRzX3MtPmdldF9uYW1lKCk7Ci0gICAgZXh0ZW5kc19pZiA9ICJ1c2UgYmFzZSBxdygiICsgcGVybF9uYW1lc3BhY2UoZXh0ZW5kc19zLT5nZXRfcHJvZ3JhbSgpKSArIGV4dGVuZHNfcy0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgICArICJSZXN0KTsiOwotICB9Ci0gIGZfc2VydmljZV8gPDwgInBhY2thZ2UgIiA8PCBwZXJsX25hbWVzcGFjZShwcm9ncmFtXykgPDwgc2VydmljZV9uYW1lXyA8PCAiUmVzdDsiIDw8IGVuZGwgPDwgZW5kbAotICAgICAgICAgICAgIDw8ICJ1c2Ugc3RyaWN0OyIgPDwgZW5kbCA8PCBleHRlbmRzX2lmIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAic3ViIG5ldyB7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJteSAoJGNsYXNzbmFtZSwgJGltcGwpID0gQF87IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICA8PCAibXkgJHNlbGYgICAgID17IGltcGwgPT4gJGltcGwgfTsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgPDwgInJldHVybiBibGVzcygkc2VsZiwkY2xhc3NuYW1lKTsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotCi0gICAgZl9zZXJ2aWNlXyA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0KLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAic3ViICIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJ7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJteSAoJHNlbGYsICRyZXF1ZXN0KSA9IEBfOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgYXJncyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBhX2l0ZXI7Ci0gICAgZm9yIChhX2l0ZXIgPSBhcmdzLmJlZ2luKCk7IGFfaXRlciAhPSBhcmdzLmVuZCgpOyArK2FfaXRlcikgewotICAgICAgdF90eXBlKiBhdHlwZSA9IGdldF90cnVlX3R5cGUoKCphX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICAgIHN0cmluZyByZXEgPSAiJHJlcXVlc3QtPnsnIiArICgqYV9pdGVyKS0+Z2V0X25hbWUoKSArICInfSI7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJteSAkIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICgiIDw8IHJlcSA8PCAiKSA/ICIgPDwgcmVxCi0gICAgICAgICAgICAgICAgIDw8ICIgOiB1bmRlZjsiIDw8IGVuZGw7Ci0gICAgICBpZiAoYXR5cGUtPmlzX3N0cmluZygpICYmICgodF9iYXNlX3R5cGUqKWF0eXBlKS0+aXNfc3RyaW5nX2xpc3QoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJteSBAIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHNwbGl0KC8sLywgJCIKLSAgICAgICAgICAgICAgICAgICA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIik7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkIgotICAgICAgICAgICAgICAgICAgIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gXFxAIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICRzZWxmLT57aW1wbH0tPiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIgotICAgICAgICAgICAgICAgPDwgYXJndW1lbnRfbGlzdCgoKmZfaXRlciktPmdldF9hcmdsaXN0KCkpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7Ci0gIHRfc2VydmljZSogZXh0ZW5kc19zID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7Ci0gIGlmIChleHRlbmRzX3MgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSBwZXJsX25hbWVzcGFjZShleHRlbmRzX3MtPmdldF9wcm9ncmFtKCkpICsgZXh0ZW5kc19zLT5nZXRfbmFtZSgpOwotICAgIGV4dGVuZHNfY2xpZW50ID0gInVzZSBiYXNlIHF3KCIgKyBleHRlbmRzICsgIkNsaWVudCk7IjsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwgInBhY2thZ2UgIiA8PCBwZXJsX25hbWVzcGFjZShwcm9ncmFtXykgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50OyIgPDwgZW5kbCA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgZXh0ZW5kc19jbGllbnQgPDwgZW5kbCA8PCAidXNlIGJhc2UgcXcoIiA8PCBwZXJsX25hbWVzcGFjZShwcm9ncmFtXykKLSAgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZik7IiA8PCBlbmRsOwotCi0gIC8vIENvbnN0cnVjdG9yIGZ1bmN0aW9uCi0gIGZfc2VydmljZV8gPDwgInN1YiBuZXcgeyIgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJteSAoJGNsYXNzbmFtZSwgJGlucHV0LCAkb3V0cHV0KSA9IEBfOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgIDw8ICJteSAkc2VsZiAgICAgID0ge307IiA8PCBlbmRsOwotCi0gIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJHNlbGYgPSAkY2xhc3NuYW1lLT5TVVBFUjo6bmV3KCRpbnB1dCwgJG91dHB1dCk7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiRzZWxmLT57aW5wdXR9ICA9ICRpbnB1dDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgIDw8ICIkc2VsZi0+e291dHB1dH0gPSBkZWZpbmVkICRvdXRwdXQgPyAkb3V0cHV0IDogJGlucHV0OyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgPDwgIiRzZWxmLT57c2VxaWR9ICA9IDA7IiA8PCBlbmRsOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGJsZXNzKCRzZWxmLCRjbGFzc25hbWUpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotCi0gIGZfc2VydmljZV8gPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOwotICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgLy8gT3BlbiBmdW5jdGlvbgotICAgIGZfc2VydmljZV8gPDwgInN1YiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOwotCi0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgaW5kZW50KCkgPDwgIiRzZWxmLT5zZW5kXyIgPDwgZnVubmFtZSA8PCAiKCI7Ci0KLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8ICIkIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgInJldHVybiAiOwotICAgICAgfQotICAgICAgZl9zZXJ2aWNlXyA8PCAiJHNlbGYtPnJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaW5kZW50X2Rvd24oKTsKLQotICAgIGZfc2VydmljZV8gPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIGZfc2VydmljZV8gPDwgInN1YiBzZW5kXyIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIHN0ZDo6c3RyaW5nIGFyZ3NuYW1lID0gcGVybF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpICsgc2VydmljZV9uYW1lXyArICJfIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiOwotCi0gICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0IGhlYWRlcgotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiRzZWxmLT57b3V0cHV0fS0+d3JpdGVNZXNzYWdlQmVnaW4oJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICA8PCAiJywgIiA8PCAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJUTWVzc2FnZVR5cGU6Ok9ORVdBWSIgOiAiVE1lc3NhZ2VUeXBlOjpDQUxMIikKLSAgICAgICAgICAgICAgIDw8ICIsICRzZWxmLT57c2VxaWR9KTsiIDw8IGVuZGw7Ci0KLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJteSAkYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0KLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJGFyZ3MtPnsiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJ9ID0gJCIKLSAgICAgICAgICAgICAgICAgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gV3JpdGUgdG8gdGhlIHN0cmVhbQotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiRhcmdzLT53cml0ZSgkc2VsZi0+e291dHB1dH0pOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgPDwgIiRzZWxmLT57b3V0cHV0fS0+d3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICA8PCAiJHNlbGYtPntvdXRwdXR9LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotCi0gICAgZl9zZXJ2aWNlXyA8PCAifSIgPDwgZW5kbDsKLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0bmFtZSA9IHBlcmxfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKLSAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7Ci0KLSAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MpOwotICAgICAgLy8gT3BlbiBmdW5jdGlvbgotICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8ICJzdWIgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24pIDw8IGVuZGw7Ci0KLSAgICAgIGluZGVudF91cCgpOwotCi0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJteSAkcnNlcWlkID0gMDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm15ICRmbmFtZTsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm15ICRtdHlwZSA9IDA7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiRzZWxmLT57aW5wdXR9LT5yZWFkTWVzc2FnZUJlZ2luKFxcJGZuYW1lLCBcXCRtdHlwZSwgXFwkcnNlcWlkKTsiCi0gICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmICgkbXR5cGUgPT0gVE1lc3NhZ2VUeXBlOjpFWENFUFRJT04pIHsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgbXkgJHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgIDw8ICIgICR4LT5yZWFkKCRzZWxmLT57aW5wdXR9KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICAgPDwgIiAgJHNlbGYtPntpbnB1dH0tPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIGRpZSAkeDsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm15ICRyZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICAgPDwgIiRyZXN1bHQtPnJlYWQoJHNlbGYtPntpbnB1dH0pOyIgPDwgZW5kbDsKLQotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJHNlbGYtPntpbnB1dH0tPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIHJlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChkZWZpbmVkICRyZXN1bHQtPntzdWNjZXNzfSApIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICAgICA8PCAiICByZXR1cm4gJHJlc3VsdC0+e3N1Y2Nlc3N9OyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKGRlZmluZWQgJHJlc3VsdC0+eyIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJ9KSB7IgotICAgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgZGllICRyZXN1bHQtPnsiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAifTsiCi0gICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZGllIFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0XCI7IgotICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIC8vIENsb3NlIGZ1bmN0aW9uCi0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgZl9zZXJ2aWNlXyA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbGFzcykgewotICAodm9pZClpbmNsYXNzOwotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgc3RyaW5nIG5hbWUgPSB0ZmllbGQtPmdldF9uYW1lKCk7Ci0KLSAgLy8gSGFjayBmb3Igd2hlbiBwcmVmaXggaXMgZGVmaW5lZCAoYWx3YXlzIGEgaGFzaCByZWYpCi0gIGlmICghcHJlZml4LmVtcHR5KCkpIHsKLSAgICBuYW1lID0gcHJlZml4ICsgInsiICsgdGZpZWxkLT5nZXRfbmFtZSgpICsgIn0iOwotICB9Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+IjsKLQotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIG91dCA8PCAicmVhZFN0cmluZyhcXCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIG91dCA8PCAicmVhZEJvb2woXFwkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBvdXQgPDwgInJlYWRCeXRlKFxcJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBvdXQgPDwgInJlYWRJMTYoXFwkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIG91dCA8PCAicmVhZEkzMihcXCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgb3V0IDw8ICJyZWFkSTY0KFxcJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgInJlYWREb3VibGUoXFwkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBQRVJMIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgb3V0IDw8ICJyZWFkSTMyKFxcJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLQotICB9IGVsc2UgewotICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAotICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKLSAgICAgICAgICAgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhbiB1bnNlcmlhbGl6ZXIgZm9yIGEgdmFyaWFibGUuIFRoaXMgbWFrZXMgdHdvIGtleSBhc3N1bXB0aW9ucywKLSAqIGZpcnN0IHRoYXQgdGhlcmUgaXMgYSBjb25zdCBjaGFyKiB2YXJpYWJsZSBuYW1lZCBkYXRhIHRoYXQgcG9pbnRzIHRvIHRoZQotICogYnVmZmVyIGZvciBkZXNlcmlhbGl6YXRpb24sIGFuZCB0aGF0IHRoZXJlIGlzIGEgdmFyaWFibGUgcHJvdG9jb2wgd2hpY2gKLSAqIGlzIGEgcmVmZXJlbmNlIHRvIGEgVFByb3RvY29sIHNlcmlhbGl6YXRpb24gb2JqZWN0LgotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCBwZXJsX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKQotICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkeGZlciArPSAkIiA8PCBwcmVmaXgKLSAgICAgIDw8ICItPnJlYWQoJGlucHV0KTsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBzdHJpbmcgc2l6ZSA9IHRtcCgiX3NpemUiKTsKLSAgc3RyaW5nIGt0eXBlID0gdG1wKCJfa3R5cGUiKTsKLSAgc3RyaW5nIHZ0eXBlID0gdG1wKCJfdnR5cGUiKTsKLSAgc3RyaW5nIGV0eXBlID0gdG1wKCJfZXR5cGUiKTsKLQotICB0X2ZpZWxkIGZzaXplKGdfdHlwZV9pMzIsIHNpemUpOwotICB0X2ZpZWxkIGZrdHlwZShnX3R5cGVfYnl0ZSwga3R5cGUpOwotICB0X2ZpZWxkIGZ2dHlwZShnX3R5cGVfYnl0ZSwgdnR5cGUpOwotICB0X2ZpZWxkIGZldHlwZShnX3R5cGVfYnl0ZSwgZXR5cGUpOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAibXkgJCIgPDwgc2l6ZSA8PCAiID0gMDsiIDw8IGVuZGw7Ci0KLSAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiQiIDw8IHByZWZpeCA8PCAiID0ge307IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJteSAkIiA8PCBrdHlwZSA8PCAiID0gMDsiCi0gICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm15ICQiIDw8IHZ0eXBlIDw8ICIgPSAwOyIgPDwgZW5kbDsKLQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkTWFwQmVnaW4oIgotICAgICAgICA8PCAiXFwkIiA8PCBrdHlwZSA8PCAiLCBcXCQiIDw8IHZ0eXBlIDw8ICIsIFxcJCIgPDwgc2l6ZSA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgcHJlZml4IDw8ICIgPSB7fTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm15ICQiIDw8IGV0eXBlIDw8ICIgPSAwOyIKLSAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkU2V0QmVnaW4oIgotICAgICAgICA8PCAiXFwkIiA8PCBldHlwZSA8PCAiLCBcXCQiIDw8IHNpemUgPDwgIik7IiA8PCBlbmRsOwotCi0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotCi0gICAgb3V0IDw8IGluZGVudCgpIDw8ICIkIiA8PCBwcmVmaXggPDwgIiA9IFtdOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAibXkgJCIgPDwgZXR5cGUgPDwgIiA9IDA7IgotICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRMaXN0QmVnaW4oIgotICAgICAgICA8PCAiXFwkIiA8PCBldHlwZSA8PCAiLCBcXCQiIDw8IHNpemUgPDwgIik7IiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gRm9yIGxvb3AgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cwotICBzdHJpbmcgaSA9IHRtcCgiX2kiKTsKLSAgaW5kZW50KG91dCkgPDwgImZvciAobXkgJCIgPDwgaSA8PCAiID0gMDsgJCIgPDwgaSA8PCAiIDwgJCIgPDwgc2l6ZSA8PCAiOyArKyQiIDw8IGkgPDwgIikiCi0gICAgICAgICAgICAgIDw8IGVuZGw7Ci0KLSAgc2NvcGVfdXAob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBwcmVmaXgpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgcHJlZml4KTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIHByZWZpeCk7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgLy8gUmVhZCBjb250YWluZXIgZW5kCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkTWFwRW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRTZXRFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRMaXN0RW5kKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIHRvIGRlc2VyaWFsaXplIGEgbWFwCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGtleSA9IHRtcCgia2V5Iik7Ci0gIHN0cmluZyB2YWwgPSB0bXAoInZhbCIpOwotICB0X2ZpZWxkIGZrZXkodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7Ci0gIHRfZmllbGQgZnZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKLQotICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZma2V5LCB0cnVlLCB0cnVlKSA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmdmFsLCB0cnVlLCB0cnVlKSA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXkpOwotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsKTsKLQotICBpbmRlbnQob3V0KSA8PCAiJCIgPDwgcHJlZml4IDw8ICItPnskIiA8PCBrZXkgPDwgIn0gPSAkIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoImVsZW0iKTsKLSAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8ICJteSAkIiA8PCBlbGVtIDw8ICIgPSB1bmRlZjsiIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8ICIkIiA8PCBwcmVmaXggPDwgIi0+eyQiIDw8IGVsZW0gPDwgIn0gPSAxOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBlbGVtID0gdG1wKCJlbGVtIik7Ci0gIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwgIm15ICQiIDw8IGVsZW0gPDwgIiA9IHVuZGVmOyIgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwgInB1c2goQHskIiA8PCBwcmVmaXggPDwgIn0sJCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQotICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKLSAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotCi0gIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgcHJlZml4ICsgInsiICsgdGZpZWxkLT5nZXRfbmFtZSgpICsgIn0iKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBwcmVmaXggKyAieyIgKyB0ZmllbGQtPmdldF9uYW1lKCkgKyAifSIpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotCi0gICAgc3RyaW5nIG5hbWUgPSB0ZmllbGQtPmdldF9uYW1lKCk7Ci0KLSAgICAvLyBIYWNrIGZvciB3aGVuIHByZWZpeCBpcyBkZWZpbmVkIChhbHdheXMgYSBoYXNoIHJlZikKLSAgICBpZiAoIXByZWZpeC5lbXB0eSgpKQotICAgICAgbmFtZSA9IHByZWZpeCArICJ7IiArIHRmaWVsZC0+Z2V0X25hbWUoKSArICJ9IjsKLQotICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT4iOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZygkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBvdXQgPDwgIndyaXRlQnl0ZSgkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJMTYoJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBvdXQgPDwgIndyaXRlSTMyKCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUk2NCgkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIG91dCA8PCAid3JpdGVEb3VibGUoJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gUEVSTCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIG91dCA8PCAid3JpdGVJMzIoJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLQotICB9IGVsc2UgewotICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSBGSUVMRCAnJXMlcycgVFlQRSAnJXMnXG4iLAotICAgICAgICAgICBwcmVmaXguY19zdHIoKSwKLSAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCi0gICAgICAgICAgIHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGFsbCB0aGUgbWVtYmVycyBvZiBhIHN0cnVjdC4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IHRvIHNlcmlhbGl6ZQotICogQHBhcmFtIHByZWZpeCAgU3RyaW5nIHByZWZpeCB0byBhdHRhY2ggdG8gYWxsIGZpZWxkcwotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKLSAgKHZvaWQpdHN0cnVjdDsKLSAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICQiIDw8IHByZWZpeCA8PCAiLT53cml0ZSgkb3V0cHV0KTsiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogV3JpdGVzIG91dCBhIGNvbnRhaW5lcgotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgewotICBzY29wZV91cChvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVNYXBCZWdpbigiCi0gICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIsICIKLSAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIgotICAgICAgICAgICAgICAgIDw8ICJzY2FsYXIoa2V5cyAleyQiIDw8IHByZWZpeCA8PCAifSkpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTZXRCZWdpbigiCi0gICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiCi0gICAgICAgICAgICAgICAgPDwgInNjYWxhcihAeyQiIDw8IHByZWZpeCA8PCAifSkpOyIgPDwgZW5kbDsKLQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLQotICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZUxpc3RCZWdpbigiCi0gICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIgotICAgICAgICAgICAgICAgIDw8ICJzY2FsYXIoQHskIiA8PCBwcmVmaXggPDwgIn0pKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV91cChvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBzdHJpbmcga2l0ZXIgPSB0bXAoImtpdGVyIik7Ci0gICAgc3RyaW5nIHZpdGVyID0gdG1wKCJ2aXRlciIpOwotICAgIGluZGVudChvdXQpIDw8ICJ3aGlsZSggbXkgKCQiIDw8IGtpdGVyIDw8ICIsJCIgPDwgdml0ZXIgPDwgIikgPSBlYWNoICV7JCIgPDwgcHJlZml4IDw8ICJ9KSAiCi0gICAgICAgICAgICAgICAgPDwgZW5kbDsKLQotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwga2l0ZXIsIHZpdGVyKTsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBzdHJpbmcgaXRlciA9IHRtcCgiaXRlciIpOwotICAgIGluZGVudChvdXQpIDw8ICJmb3JlYWNoIG15ICQiIDw8IGl0ZXIgPDwgIiAoQHskIiA8PCBwcmVmaXggPDwgIn0pIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgaXRlcik7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotCi0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHN0cmluZyBpdGVyID0gdG1wKCJpdGVyIik7Ci0gICAgaW5kZW50KG91dCkgPDwgImZvcmVhY2ggbXkgJCIgPDwgaXRlciA8PCAiIChAeyQiIDw8IHByZWZpeCA8PCAifSkgIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyKTsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZU1hcEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTZXRFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZUxpc3RFbmQoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KLSAqCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBraXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB2aXRlcikgewotICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2l0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkKTsKLQotICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdml0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIGl0ZXIpIHsKLSAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCk7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgaXRlcikgewotICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCk7Ci19Ci0KLS8qKgotICogRGVjbGFyZXMgYSBmaWVsZCwgd2hpY2ggbWF5IGluY2x1ZGUgaW5pdGlhbGl6YXRpb24gYXMgbmVjZXNzYXJ5LgotICoKLSAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQotICovCi1zdHJpbmcgdF9wZXJsX2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCwgYm9vbCBvYmopIHsKLSAgc3RyaW5nIHJlc3VsdCA9ICJteSAkIiArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgaWYgKGluaXQpIHsKLSAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIHJlc3VsdCArPSAiID0gJyciOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIHJlc3VsdCArPSAiID0gMCI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIHJlc3VsdCArPSAiID0gMC4wIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFBFUkwgaW5pdGlhbGl6ZXIgZm9yIGJhc2UgdHlwZSAiCi0gICAgICAgICAgICArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIHJlc3VsdCArPSAiID0gMCI7Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgcmVzdWx0ICs9ICIgPSBbXSI7Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICBpZiAob2JqKSB7Ci0gICAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyBwZXJsX25hbWVzcGFjZSh0eXBlLT5nZXRfcHJvZ3JhbSgpKSArIHR5cGUtPmdldF9uYW1lKCkgKyAiKCkiOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVzdWx0ICs9ICIgPSB1bmRlZiI7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiByZXN1bHQgKyAiOyI7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJwotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgotICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgotICovCi1zdHJpbmcgdF9wZXJsX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RyaW5nIHByZWZpeCkgewotCi0gIHN0cmluZyBzdHI7Ci0KLSAgc3RyID0gcHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIntcbiI7Ci0gIHN0ciArPSAiICBteSAkc2VsZiA9IHNoaWZ0O1xuIjsKLQotICAvLyBOZWVkIHRvIGNyZWF0ZSBwZXJsIGZ1bmN0aW9uIGFyZyBpbnB1dHMKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBzdHIgKz0gIiAgbXkgJCIgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiID0gc2hpZnQ7XG4iOwotICB9Ci0KLSAgcmV0dXJuIHN0cjsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZmllbGQgbGlzdAotICovCi1zdHJpbmcgdF9wZXJsX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiLCAiOwotICAgIH0KLSAgICByZXN1bHQgKz0gIiQiICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBDKysgZW51bSBzdHJpbmcgZm9yIHRoZSBnaXZlbiB0eXBlLgotICovCi1zdHJpbmcgdF9wZXJsX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJldHVybiAiVFR5cGU6OlNUUklORyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJUVHlwZTo6Qk9PTCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJUVHlwZTo6QllURSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gIlRUeXBlOjpJMTYiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICJUVHlwZTo6STMyIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiVFR5cGU6Okk2NCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gIlRUeXBlOjpET1VCTEUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlOjpJMzIiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlOjpTVFJVQ1QiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZTo6TUFQIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiVFR5cGU6OlNFVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZTo6TElTVCI7Ci0gIH0KLQotICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLVRIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IocGVybCwgIlBlcmwiLCAiIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9waHBfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3BocF9nZW5lcmF0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMjZkNzAuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3BocF9nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyNTI2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlICJ0X29vcF9nZW5lcmF0b3IuaCIKLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotCi11c2luZyBzdGQ6Om1hcDsKLXVzaW5nIHN0ZDo6b2ZzdHJlYW07Ci11c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Ci11c2luZyBzdGQ6OnN0cmluZzsKLXVzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwotdXNpbmcgc3RkOjp2ZWN0b3I7Ci0KLXN0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKLQotI2RlZmluZSBOU0dMT0JBTCAobnNnbG9iYWxfLnNpemUoKSA/IG5zZ2xvYmFsXyA6ICIiKQotI2RlZmluZSBOU0dMT0JBTF9BICgiXFwiICsgTlNHTE9CQUwpCi0jZGVmaW5lIE5TR0xPQkFMX0IgKE5TR0xPQkFMICsgIlxcIikKLSNkZWZpbmUgTlNHTE9CQUxfQUIgKCJcXCIgKyBOU0dMT0JBTCArICJcXCIpCi0KLS8qKgotICogUEhQIGNvZGUgZ2VuZXJhdG9yLgotICoKLSAqLwotY2xhc3MgdF9waHBfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7Ci1wdWJsaWM6Ci0gIHRfcGhwX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKLSAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQotICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKLSAgICAodm9pZClvcHRpb25fc3RyaW5nOwotICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgiaW5saW5lZCIpOwotICAgIGJpbmFyeV9pbmxpbmVfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoInJlc3QiKTsKLSAgICByZXN0XyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJzZXJ2ZXIiKTsKLSAgICBwaHBzXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJvb3AiKTsKLSAgICBvb3BfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoInZhbGlkYXRlIik7Ci0gICAgdmFsaWRhdGVfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoImpzb24iKTsKLSAgICBqc29uX3NlcmlhbGl6YWJsZV8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgibnNnbG9iYWwiKTsKLSAgICBpZiAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSkgewotICAgICAgbnNnbG9iYWxfID0gaXRlci0+c2Vjb25kOwotICAgIH0gZWxzZSB7Ci0gICAgICBuc2dsb2JhbF8gPSAiIjsgLy8gYnkgZGVmYXVsdCBnbG9iYWwgbmFtZXNwYWNlIGlzIGVtcHR5Ci0gICAgfQotCi0gICAgaWYgKG9vcF8gJiYgYmluYXJ5X2lubGluZV8pIHsKLSAgICAgIHRocm93ICJvb3AgYW5kIGlubGluZWQgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4iOwotICAgIH0KLQotICAgIG91dF9kaXJfYmFzZV8gPSAoYmluYXJ5X2lubGluZV8gPyAiZ2VuLXBocGkiIDogImdlbi1waHAiKTsKLSAgICBlc2NhcGVfWyckJ10gPSAiXFwkIjsKLSAgfQotCi0gIHN0YXRpYyBib29sIGlzX3ZhbGlkX25hbWVzcGFjZShjb25zdCBzdGQ6OnN0cmluZyYgc3ViX25hbWVzcGFjZSk7Ci0KLSAgLyoqCi0gICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKLSAgICovCi0KLSAgdm9pZCBpbml0X2dlbmVyYXRvcigpOwotICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOwotCi0gIC8qKgotICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKLSAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOwotICB2b2lkIGdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29uc3RzKHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0KLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOwotCi0gIC8qKgotICAgKiBTdHJ1Y3RzIQotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3BocF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9waHBfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCA9IGZhbHNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9waHBfc3RydWN0X3JlYWRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3Jlc3VsdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfcGhwX3N0cnVjdF93cml0ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19yZXN1bHQpOwotICB2b2lkIGdlbmVyYXRlX3BocF9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfcGhwX3N0cnVjdF9yZXF1aXJlZF92YWxpZGF0b3Iob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBtZXRob2RfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHdyaXRlX21vZGUpOwotICB2b2lkIGdlbmVyYXRlX3BocF9zdHJ1Y3RfcmVhZF92YWxpZGF0b3Iob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3BocF9zdHJ1Y3Rfd3JpdGVfdmFsaWRhdG9yKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9waHBfc3RydWN0X2pzb25fc2VyaWFsaXplKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3Jlc3VsdCk7Ci0gIGJvb2wgbmVlZHNfcGhwX3dyaXRlX3ZhbGlkYXRvcih0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19yZXN1bHQpOwotICBib29sIG5lZWRzX3BocF9yZWFkX3ZhbGlkYXRvcih0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19yZXN1bHQpOwotICBpbnQgZ2V0X3BocF9udW1fcmVxdWlyZWRfZmllbGRzKGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcywgYm9vbCB3cml0ZV9tb2RlKTsKLQotICB2b2lkIGdlbmVyYXRlX3BocF90eXBlX3NwZWMoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHQpOwotICB2b2lkIGdlbmVyYXRlX3BocF9zdHJ1Y3Rfc3BlYyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLQotICAvKioKLSAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3Jlc3QodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gIC8qKgotICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbGFzcyA9IGZhbHNlKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBraXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdml0ZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0ZDo6c3RyaW5nIGl0ZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfcGhwX2RvYyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKTsKLQotICB2b2lkIGdlbmVyYXRlX3BocF9kb2Moc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQpOwotCi0gIHZvaWQgZ2VuZXJhdGVfcGhwX2RvYyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9waHBfZG9jc3RyaW5nX2NvbW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCBzdHJpbmcgY29udGVudHMpOwotCi0gIC8qKgotICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucwotICAgKi8KLQotICBzdGQ6OnN0cmluZyBwaHBfaW5jbHVkZXMoKTsKLSAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCA9IGZhbHNlLCBib29sIG9iaiA9IGZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGFkZFR5cGVIaW50cyA9IHRydWUpOwotICBzdGQ6OnN0cmluZyB0eXBlX3RvX2Nhc3QodF90eXBlKiB0dHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKLSAgc3RkOjpzdHJpbmcgdHlwZV90b19waHBkb2ModF90eXBlKiB0dHlwZSk7Ci0KLSAgc3RkOjpzdHJpbmcgcGhwX25hbWVzcGFjZV9iYXNlKGNvbnN0IHRfcHJvZ3JhbSogcCkgewotICAgIHN0ZDo6c3RyaW5nIG5zID0gcC0+Z2V0X25hbWVzcGFjZSgicGhwIik7Ci0gICAgY29uc3QgY2hhciogZGVsaW1pdGVyID0gIlxcIjsKLSAgICBzaXplX3QgcG9zaXRpb24gPSBucy5maW5kKCcuJyk7Ci0gICAgd2hpbGUgKHBvc2l0aW9uICE9IHN0cmluZzo6bnBvcykgewotICAgICAgbnMucmVwbGFjZShwb3NpdGlvbiwgMSwgZGVsaW1pdGVyKTsKLSAgICAgIHBvc2l0aW9uID0gbnMuZmluZCgnLicsIHBvc2l0aW9uICsgMSk7Ci0gICAgfQotICAgIHJldHVybiBuczsKLSAgfQotCi0gIC8vIGdlbmVyYWwgdXNlIG5hbWVzcGFjZSBwcmVmaXhpbmc6IFxteVxuYW1lc3BhY2VcIG9yIG15X25hbWVzcGFjZV8KLSAgc3RyaW5nIHBocF9uYW1lc3BhY2UoY29uc3QgdF9wcm9ncmFtKiBwKSB7Ci0gICAgc3RyaW5nIG5zID0gcGhwX25hbWVzcGFjZV9iYXNlKHApOwotICAgIHJldHVybiAobnNnbG9iYWxfLnNpemUoKSA/IE5TR0xPQkFMX0FCIDogTlNHTE9CQUxfQikgKyAobnMuc2l6ZSgpID8gKG5zICsgIlxcIikgOiAiIik7Ci0gIH0KLQotICAvLyBzZXR0aW5nIHRoZSBuYW1lc3BhY2Ugb2YgYSBmaWxlOiBteVxuYW1lc3BhY2UKLSAgc3RyaW5nIHBocF9uYW1lc3BhY2Vfc3VmZml4KGNvbnN0IHRfcHJvZ3JhbSogcCkgewotICAgIHN0cmluZyBucyA9IHBocF9uYW1lc3BhY2VfYmFzZShwKTsKLQotICAgIHJldHVybiAobnNnbG9iYWxfLnNpemUoKSA/IE5TR0xPQkFMX0IgOiBOU0dMT0JBTCkgKyBuczsKLSAgfQotCi0gIC8vIGFkZCBhIGRpcmVjdG9yeSB0byBhbHJlYWR5IGV4aXN0aW5nIG5hbWVzcGFjZQotICBzdHJpbmcgcGhwX25hbWVzcGFjZV9kaXJlY3Rvcnkoc3RyaW5nIGRpcmVjdG9yeSwgYm9vbCBlbmQgPSB0cnVlKSB7Ci0gICAgKHZvaWQpZGlyZWN0b3J5OwotICAgIGlmIChlbmQpIHsKLSAgICAgIHJldHVybiAiOyI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAiIjsKLSAgICB9Ci0gIH0KLQotICAvLyB3cml0aW5nIGFuIGF1dGxvYWQgaWRlbnRpZmllciBpbnRvIGdsb2JhO2xzOiBteVxuYW1lc3BhY2VcIG9yIG15X25hbWVzcGFjZV8KLSAgc3RyaW5nIHBocF9uYW1lc3BhY2VfYXV0b2xvYWQoY29uc3QgdF9wcm9ncmFtKiBwKSB7Ci0gICAgc3RkOjpzdHJpbmcgbnMgPSBwaHBfbmFtZXNwYWNlX2Jhc2UocCk7Ci0gICAgcmV0dXJuIChuc2dsb2JhbF8uc2l6ZSgpID8gTlNHTE9CQUxfQiA6IE5TR0xPQkFMKSArIChucy5zaXplKCkgPyAobnMgKyAiXFwiKSA6ICIiKTsKLSAgfQotCi0gIC8vIGRlY2xhcmluZyBhIHR5cGU6IHR5cGVuYW1lIG9yIG15X25hbWVzcGFjZV90eXBlbmFtZQotICBzdHJpbmcgcGhwX25hbWVzcGFjZV9kZWNsYXJhdGlvbih0X3R5cGUqIHQpIHsgcmV0dXJuIHQtPmdldF9uYW1lKCk7IH0KLQotICBzdGQ6OnN0cmluZyBwaHBfcGF0aCh0X3Byb2dyYW0qIHApIHsKLSAgICBzdGQ6OnN0cmluZyBucyA9IHAtPmdldF9uYW1lc3BhY2UoInBocC5wYXRoIik7Ci0gICAgaWYgKG5zLmVtcHR5KCkpIHsKLSAgICAgIHJldHVybiBwLT5nZXRfbmFtZSgpOwotICAgIH0KLQotICAgIC8vIFRyYW5zZm9ybSB0aGUgamF2YS1zdHlsZSBuYW1lc3BhY2UgaW50byBhIHBhdGguCi0gICAgZm9yIChzdGQ6OnN0cmluZzo6aXRlcmF0b3IgaXQgPSBucy5iZWdpbigpOyBpdCAhPSBucy5lbmQoKTsgKytpdCkgewotICAgICAgaWYgKCppdCA9PSAnLicpIHsKLSAgICAgICAgKml0ID0gJy8nOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBucyArICcvJzsKLSAgfQotCi0gIC8qKgotICAgKiBUcmFuc2Zvcm0gY2xhc3NfbWV0aG9kIGludG8gQ2xhc3NNZXRob2QKLSAgICoKLSAgICogQHBhcmFtIHN0cgotICAgKiBAcmV0dXJuIHN0aXJuZwotICAgKi8KLSAgc3RyaW5nIGNsYXNzaWZ5KHN0cmluZyBzdHIpIHsKLSAgICBzdHJpbmcgY2xhc3NlID0gIiI7Ci0KLSAgICB2ZWN0b3I8c3RyaW5nPiB4ID0gc3BsaXQoc3RyLCAnXycpOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB4LnNpemUoKTsgKytpKSB7Ci0gICAgICBjbGFzc2UgPSBjbGFzc2UgKyBjYXBpdGFsaXplKHhbaV0pOwotICAgIH0KLQotICAgIHJldHVybiBjbGFzc2U7Ci0gIH0KLQotICAvKioKLSAgICogU3BsaXQgbWV0aG9kCi0gICAqIEBwYXJhbSBzCi0gICAqIEBwYXJhbSBkZWxpbQotICAgKiBAcGFyYW0gZWxlbXMKLSAgICogQHJldHVybgotICAgKi8KLSAgdmVjdG9yPHN0cmluZz4mIHNwbGl0KGNvbnN0IHN0cmluZyYgcywgY2hhciBkZWxpbSwgdmVjdG9yPHN0cmluZz4mIGVsZW1zKSB7Ci0gICAgc3RyaW5nc3RyZWFtIHNzKHMpOwotICAgIHN0cmluZyBpdGVtOwotCi0gICAgd2hpbGUgKGdldGxpbmUoc3MsIGl0ZW0sIGRlbGltKSkgewotICAgICAgZWxlbXMucHVzaF9iYWNrKGl0ZW0pOwotICAgIH0KLQotICAgIHJldHVybiBlbGVtczsKLSAgfQotCi0gIHZlY3RvcjxzdHJpbmc+IHNwbGl0KGNvbnN0IHN0cmluZyYgcywgY2hhciBkZWxpbSkgewotICAgIHZlY3RvcjxzdHJpbmc+IGVsZW1zOwotCi0gICAgcmV0dXJuIHNwbGl0KHMsIGRlbGltLCBlbGVtcyk7Ci0gIH0KLQotICAvKioKLSAgICogQ2FwaXRhbGl6ZSBtZXRob2QKLSAgICogQHBhcmFtIHN0cgotICAgKiBAcmV0dXJuCi0gICAqLwotICBzdHJpbmcgY2FwaXRhbGl6ZShzdHJpbmcgc3RyKSB7Ci0gICAgc3RyaW5nOjppdGVyYXRvciBpdChzdHIuYmVnaW4oKSk7Ci0KLSAgICBpZiAoaXQgIT0gc3RyLmVuZCgpKQotICAgICAgc3RyWzBdID0gdG91cHBlcigodW5zaWduZWQgY2hhcilzdHJbMF0pOwotCi0gICAgLy8gICAgd2hpbGUoKytpdCAhPSBzdHIuZW5kKCkpCi0gICAgLy8gICAgewotICAgIC8vICAgICAgKml0ID0gdG9sb3dlcigodW5zaWduZWQgY2hhcikqaXQpOwotICAgIC8vICAgIH0KLSAgICByZXR1cm4gc3RyOwotICB9Ci0KLXByaXZhdGU6Ci0gIC8qKgotICAgKiBGaWxlIHN0cmVhbXMKLSAgICovCi0gIHN0ZDo6b2ZzdHJlYW0gZl90eXBlc187Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9oZWxwZXJzXzsKLSAgc3RkOjpvZnN0cmVhbSBmX3NlcnZpY2VfOwotCi0gIHN0ZDo6c3RyaW5nIHBhY2thZ2VfZGlyXzsKLSAgLyoqCi0gICAqIEdlbmVyYXRlIHByb3RvY29sLWluZGVwZW5kZW50IHRlbXBsYXRlPyBPciBCaW5hcnkgaW5saW5lIGNvZGU/Ci0gICAqLwotICBib29sIGJpbmFyeV9pbmxpbmVfOwotCi0gIC8qKgotICAgKiBHZW5lcmF0ZSBhIFJFU1QgaGFuZGxlciBjbGFzcwotICAgKi8KLSAgYm9vbCByZXN0XzsKLQotICAvKioKLSAgICogR2VuZXJhdGUgc3R1YnMgZm9yIGEgUEhQIHNlcnZlcgotICAgKi8KLSAgYm9vbCBwaHBzXzsKLQotICAvKioKLSAgICogV2hldGhlciB0byB1c2UgT09QIGJhc2UgY2xhc3MgVEJhc2UKLSAgICovCi0gIGJvb2wgb29wXzsKLQotICAvKioKLSAgICogV2hldGhlciB0byBnZW5lcmF0ZSB2YWxpZGF0b3IgY29kZQotICAgKi8KLSAgYm9vbCB2YWxpZGF0ZV87Ci0KLSAgLyoqCi0gICAqIFdoZXRoZXIgdG8gZ2VuZXJhdGUgSnNvblNlcmlhbGl6YWJsZSBjbGFzc2VzCi0gICAqLwotICBib29sIGpzb25fc2VyaWFsaXphYmxlXzsKLQotICAvKioKLSAgICogR2xvYmFsIG5hbWVzcGFjZSBmb3IgUEhQIDUuMwotICAgKi8KLSAgc3RkOjpzdHJpbmcgbnNnbG9iYWxfOwotfTsKLQotYm9vbCB0X3BocF9nZW5lcmF0b3I6OmlzX3ZhbGlkX25hbWVzcGFjZShjb25zdCBzdGQ6OnN0cmluZyYgc3ViX25hbWVzcGFjZSkgewotICByZXR1cm4gc3ViX25hbWVzcGFjZSA9PSAicGF0aCI7Ci19Ci0KLS8qKgotICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKLSAqIHN0cmVhbXMuCi0gKgotICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKLSAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5Ci0gIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7Ci0KLSAgLy8gQ3JlYXRlIFJlYWwgZGlyZWN0b3J5IE5hbWVzcGFjZXMKLSAgdmVjdG9yPHN0cmluZz4gTlN4ID0gc3BsaXQocGhwX25hbWVzcGFjZV9zdWZmaXgoZ2V0X3Byb2dyYW0oKSksICdcXCcpOwotICBwYWNrYWdlX2Rpcl8gPSBnZXRfb3V0X2RpcigpOwotCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTlN4LnNpemUoKTsgKytpKSB7Ci0gICAgcGFja2FnZV9kaXJfID0gcGFja2FnZV9kaXJfICsgIi8iICsgTlN4W2ldICsgIi8iOwotICAgIE1LRElSKHBhY2thZ2VfZGlyXy5jX3N0cigpKTsKLSAgfQotCi0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IHBhY2thZ2VfZGlyXyArICJUeXBlcy5waHAiOwotICBmX3R5cGVzXy5vcGVuKGZfdHlwZXNfbmFtZS5jX3N0cigpKTsKLQotICAvLyBQcmludCBoZWFkZXIKLSAgZl90eXBlc18gPDwgIjw/cGhwIiA8PCBlbmRsOwotICBpZiAoICEgcGhwX25hbWVzcGFjZV9zdWZmaXgoZ2V0X3Byb2dyYW0oKSkuZW1wdHkoKSApICB7Ci0gICAgZl90eXBlc18gPDwgIm5hbWVzcGFjZSAiIDw8IHBocF9uYW1lc3BhY2Vfc3VmZml4KGdldF9wcm9ncmFtKCkpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLSAgZl90eXBlc18gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgcGhwX2luY2x1ZGVzKCk7Ci0KLSAgZl90eXBlc18gPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBQcmludHMgc3RhbmRhcmQgcGhwIGluY2x1ZGVzCi0gKi8KLXN0cmluZyB0X3BocF9nZW5lcmF0b3I6OnBocF9pbmNsdWRlcygpIHsKLSAgc3RyaW5nIGluY2x1ZGVzID0gInVzZSBUaHJpZnRcXEJhc2VcXFRCYXNlO1xuIgotICAgICAgICAgICAgICAgICAgICAidXNlIFRocmlmdFxcVHlwZVxcVFR5cGU7XG4iCi0gICAgICAgICAgICAgICAgICAgICJ1c2UgVGhyaWZ0XFxUeXBlXFxUTWVzc2FnZVR5cGU7XG4iCi0gICAgICAgICAgICAgICAgICAgICJ1c2UgVGhyaWZ0XFxFeGNlcHRpb25cXFRFeGNlcHRpb247XG4iCi0gICAgICAgICAgICAgICAgICAgICJ1c2UgVGhyaWZ0XFxFeGNlcHRpb25cXFRQcm90b2NvbEV4Y2VwdGlvbjtcbiIKLSAgICAgICAgICAgICAgICAgICAgInVzZSBUaHJpZnRcXFByb3RvY29sXFxUUHJvdG9jb2w7XG4iCi0gICAgICAgICAgICAgICAgICAgICJ1c2UgVGhyaWZ0XFxQcm90b2NvbFxcVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQ7XG4iCi0gICAgICAgICAgICAgICAgICAgICJ1c2UgVGhyaWZ0XFxFeGNlcHRpb25cXFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjtcbiI7Ci0KLSAgaWYgKGpzb25fc2VyaWFsaXphYmxlXykgewotICAgIGluY2x1ZGVzICs9ICJ1c2UgSnNvblNlcmlhbGl6YWJsZTtcbiIKLSAgICAgICAgICAgICAgICAidXNlIHN0ZENsYXNzO1xuIjsKLSAgfQotCi0gIHJldHVybiBpbmNsdWRlcyArICJcbiI7Ci19Ci0KLS8qKgotICogQ2xvc2UgdXAgKG9yIGRvd24pIHNvbWUgZmlsZXouCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7Ci0gIC8vIENsb3NlIHR5cGVzIGZpbGUKLSAgZl90eXBlc18gPDwgZW5kbDsKLSAgZl90eXBlc18uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBUaGlzIGlzIG5vdCBkb25lIGluIFBIUCwgdHlwZXMgYXJlIGFsbCBpbXBsaWNpdC4KLSAqCi0gKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7Ci0gICh2b2lkKXR0eXBlZGVmOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuIFNpbmNlIGRlZmluZSBpcyBleHBlbnNpdmUgdG8gbG9va3VwCi0gKiBpbiBQSFAsIHdlIHVzZSBhIGdsb2JhbCBhcnJheSBmb3IgdGhpcy4KLSAqCi0gKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOwotCi0gIC8vIFdlJ3JlIGFsc28gZG9pbmcgaXQgdGhpcyB3YXkgdG8gc2VlIGhvdyBpdCBwZXJmb3Jtcy4gSXQncyBtb3JlIGxlZ2libGUKLSAgLy8gY29kZSBidXQgeW91IGNhbid0IGRvIHRoaW5ncyBsaWtlIGFuICdleHRyYWN0JyBvbiBpdCwgd2hpY2ggaXMgYSBiaXQgb2YKLSAgLy8gYSBkb3duZXIuCi0gIGdlbmVyYXRlX3BocF9kb2MoZl90eXBlc18sIHRlbnVtKTsKLSAgZl90eXBlc18gPDwgImZpbmFsIGNsYXNzICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgZ2VuZXJhdGVfcGhwX2RvYyhmX3R5cGVzXywgKmNfaXRlcik7Ci0gICAgaW5kZW50KGZfdHlwZXNfKSA8PCAiY29uc3QgIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgdmFsdWUgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQoZl90eXBlc18pIDw8ICJzdGF0aWMgcHVibGljICRfX25hbWVzID0gYXJyYXkoIiA8PCBlbmRsOwotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgaW5kZW50KGZfdHlwZXNfKSA8PCAiICAiIDw8IHZhbHVlIDw8ICIgPT4gJyIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnQoZl90eXBlc18pIDw8ICIpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBmX3R5cGVzXyA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlIGNvbnN0YW50IGNsYXNzCi0gKgotICogT3ZlcnJpZGUgdGhlIG9uZSBmcm9tIHRfZ2VuZXJhdG9yCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHModmVjdG9yPHRfY29uc3QqPiBjb25zdHMpIHsKLSAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY19pdGVyOwotCi0gIC8vIENyZWF0ZSBjbGFzcyBvbmx5IGlmIG5lZWRlZAotICBpZiAoY29uc3RzLnNpemUoKSA+IDApIHsKLSAgICBmX3R5cGVzXyA8PCAiZmluYWwgY2xhc3MgQ29uc3RhbnQgZXh0ZW5kcyBcXFRocmlmdFxcVHlwZVxcVENvbnN0YW50IHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICAvLyBDcmVhdGUgc3RhdGljIHByb3BlcnR5Ci0gICAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICAgIHN0cmluZyBuYW1lID0gKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgICBpbmRlbnQoZl90eXBlc18pIDw8ICJzdGF0aWMgcHJvdGVjdGVkICQiIDw8IG5hbWUgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gQ3JlYXRlIGluaXQgZnVuY3Rpb24KLSAgICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgewotICAgICAgc3RyaW5nIG5hbWUgPSAoKmNfaXRlciktPmdldF9uYW1lKCk7Ci0KLSAgICAgIGZfdHlwZXNfIDw8IGVuZGw7Ci0KLSAgICAgIGluZGVudChmX3R5cGVzXykgPDwgInN0YXRpYyBwcm90ZWN0ZWQgZnVuY3Rpb24gaW5pdF8iIDw8IG5hbWUgPDwgIigpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLQotICAgICAgaW5kZW50KGZfdHlwZXNfKSA8PCAicmV0dXJuICI7Ci0gICAgICBnZW5lcmF0ZV9jb25zdCgqY19pdGVyKTsKLSAgICAgIGZfdHlwZXNfIDw8ICI7IiA8PCBlbmRsOwotCi0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KGZfdHlwZXNfKSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfdHlwZXNfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZSBhIGNvbnN0YW50IHZhbHVlCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKLSAgdF90eXBlKiB0eXBlID0gdGNvbnN0LT5nZXRfdHlwZSgpOwotICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IHRjb25zdC0+Z2V0X3ZhbHVlKCk7Ci0KLSAgZ2VuZXJhdGVfcGhwX2RvYyhmX3R5cGVzXywgdGNvbnN0KTsKLSAgZl90eXBlc18gPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlKTsKLX0KLQotLyoqCi0gKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKLSAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCi0gKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYwotICovCi1zdHJpbmcgdF9waHBfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIG91dCA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICBvdXQgPDwgKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIG91dCA8PCAibmV3ICIgPDwgcGhwX25hbWVzcGFjZSh0eXBlLT5nZXRfcHJvZ3JhbSgpKSA8PCB0eXBlLT5nZXRfbmFtZSgpIDw8ICIoYXJyYXkoIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOwotICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKLSAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgaW5kZW50KCk7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGdfdHlwZV9zdHJpbmcsIHZfaXRlci0+Zmlyc3QpOwotICAgICAgb3V0IDw8ICIgPT4gIjsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICIpKSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgb3V0IDw8ICJhcnJheSgiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgb3V0IDw8IGluZGVudCgpOwotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgdl9pdGVyLT5maXJzdCk7Ci0gICAgICBvdXQgPDwgIiA9PiAiOwotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICIpIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlOwotICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9Ci0gICAgb3V0IDw8ICJhcnJheSgiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCk7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKTsKLSAgICAgIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgICAgICBvdXQgPDwgIiA9PiB0cnVlIjsKLSAgICAgIH0KLSAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiKSI7Ci0gIH0KLSAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotLyoqCi0gKiBNYWtlIGEgc3RydWN0Ci0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgZ2VuZXJhdGVfcGhwX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGV4Y2VwdGlvbi4gQmFzaWNhbGx5IHRoZSBzYW1lCi0gKiBhcyBhIHN0cnVjdCBidXQgZXh0ZW5kcyB0aGUgRXhjZXB0aW9uIGNsYXNzLgotICoKLSAqIEBwYXJhbSB0eGNlcHRpb24gVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX3BocF9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKLX0KLQotLyoqCi0gKiBTdHJ1Y3RzIGNhbiBiZSBub3JtYWwgb3IgZXhjZXB0aW9ucy4KLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX3BocF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3R5cGVzXywgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKLX0KLQotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF90eXBlX3NwZWMob2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0KSB7Ci0gIHQgPSBnZXRfdHJ1ZV90eXBlKHQpOwotICBpbmRlbnQob3V0KSA8PCAiJ3R5cGUnID0+ICIgPDwgdHlwZV90b19lbnVtKHQpIDw8ICIsIiA8PCBlbmRsOwotCi0gIGlmICh0LT5pc19iYXNlX3R5cGUoKSB8fCB0LT5pc19lbnVtKCkpIHsKLSAgICAvLyBOb29wLCB0eXBlIGlzIGFsbCB3ZSBuZWVkCi0gIH0gZWxzZSBpZiAodC0+aXNfc3RydWN0KCkgfHwgdC0+aXNfeGNlcHRpb24oKSkgewotICAgIGluZGVudChvdXQpIDw8ICInY2xhc3MnID0+ICciIDw8IHBocF9uYW1lc3BhY2UodC0+Z2V0X3Byb2dyYW0oKSkgPDwgdC0+Z2V0X25hbWUoKSA8PCAiJywiCi0gICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0LT5pc19tYXAoKSkgewotICAgIHRfdHlwZSoga3R5cGUgPSBnZXRfdHJ1ZV90eXBlKCgodF9tYXAqKXQpLT5nZXRfa2V5X3R5cGUoKSk7Ci0gICAgdF90eXBlKiB2dHlwZSA9IGdldF90cnVlX3R5cGUoKCh0X21hcCopdCktPmdldF92YWxfdHlwZSgpKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiJ2t0eXBlJyA9PiAiIDw8IHR5cGVfdG9fZW51bShrdHlwZSkgPDwgIiwiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIid2dHlwZScgPT4gIiA8PCB0eXBlX3RvX2VudW0odnR5cGUpIDw8ICIsIiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIna2V5JyA9PiBhcnJheSgiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZ2VuZXJhdGVfcGhwX3R5cGVfc3BlYyhvdXQsIGt0eXBlKTsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICIpLCIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiJ3ZhbCcgPT4gYXJyYXkoIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGdlbmVyYXRlX3BocF90eXBlX3NwZWMob3V0LCB2dHlwZSk7Ci0gICAgaW5kZW50KG91dCkgPDwgIiksIiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0gZWxzZSBpZiAodC0+aXNfbGlzdCgpIHx8IHQtPmlzX3NldCgpKSB7Ci0gICAgdF90eXBlKiBldHlwZTsKLSAgICBpZiAodC0+aXNfbGlzdCgpKSB7Ci0gICAgICBldHlwZSA9IGdldF90cnVlX3R5cGUoKCh0X2xpc3QqKXQpLT5nZXRfZWxlbV90eXBlKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBldHlwZSA9IGdldF90cnVlX3R5cGUoKCh0X3NldCopdCktPmdldF9lbGVtX3R5cGUoKSk7Ci0gICAgfQotICAgIGluZGVudChvdXQpIDw8ICInZXR5cGUnID0+ICIgPDwgdHlwZV90b19lbnVtKGV0eXBlKSA8PCAiLCIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiJ2VsZW0nID0+IGFycmF5KCIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBnZW5lcmF0ZV9waHBfdHlwZV9zcGVjKG91dCwgZXR5cGUpOwotICAgIGluZGVudChvdXQpIDw8ICIpLCIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICB9IGVsc2UgewotICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gdHlwZSBmb3IgcGhwIHN0cnVjdCBzcGVjIGZpZWxkIjsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgc3RydWN0IHNwZWNpZmljYXRpb24gc3RydWN0dXJlLCB3aGljaCBmdWxseSBxdWFsaWZpZXMgZW5vdWdoCi0gKiB0eXBlIGluZm9ybWF0aW9uIHRvIGdlbmVyYWxpemUgc2VyaWFsaXphdGlvbiByb3V0aW5lcy4KLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9zdHJ1Y3Rfc3BlYyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAiaWYgKCFpc3NldChzZWxmOjokX1RTUEVDKSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgInNlbGY6OiRfVFNQRUMgPSBhcnJheSgiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgaW5kZW50KG91dCkgPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiA9PiBhcnJheSgiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICIndmFyJyA9PiAnIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIicsIiA8PCBlbmRsOwotICAgIGdlbmVyYXRlX3BocF90eXBlX3NwZWMob3V0LCB0KTsKLSAgICBpbmRlbnQob3V0KSA8PCAiKSwiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICIgICk7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLiBUaGlzIGlzIG5vdGhpbmcgaW4gUEhQCi0gKiB3aGVyZSB0aGUgb2JqZWN0cyBhcmUgYWxsIGp1c3QgYXNzb2NpYXRpdmUgYXJyYXlzICh1bmxlc3Mgb2YgY291cnNlIHdlCi0gKiBkZWNpZGUgdG8gc3RhcnQgdXNpbmcgb2JqZWN0cyBmb3IgdGhlbS4uLikKLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9zdHJ1Y3RfZGVmaW5pdGlvbihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgZ2VuZXJhdGVfcGhwX2RvYyhvdXQsIHRzdHJ1Y3QpOwotICBvdXQgPDwgImNsYXNzICIgPDwgcGhwX25hbWVzcGFjZV9kZWNsYXJhdGlvbih0c3RydWN0KTsKLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIG91dCA8PCAiIGV4dGVuZHMgIgotICAgICAgICA8PCAiVEV4Y2VwdGlvbiI7Ci0gIH0gZWxzZSBpZiAob29wXykgewotICAgIG91dCA8PCAiIGV4dGVuZHMgIgotICAgICAgICA8PCAiVEJhc2UiOwotICB9Ci0gIGlmIChqc29uX3NlcmlhbGl6YWJsZV8pIHsKLSAgICBvdXQgPDwgIiBpbXBsZW1lbnRzIEpzb25TZXJpYWxpemFibGUiOwotICB9Ci0gIG91dCA8PCAiIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChvdXQpIDw8ICJzdGF0aWMgJF9UU1BFQzsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgc3RyaW5nIGR2YWwgPSAibnVsbCI7Ci0gICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwgJiYgISh0LT5pc19zdHJ1Y3QoKSB8fCB0LT5pc194Y2VwdGlvbigpKSkgewotICAgICAgZHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZSgoKm1faXRlciktPmdldF90eXBlKCksICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkpOwotICAgIH0KLSAgICBnZW5lcmF0ZV9waHBfZG9jKG91dCwgKm1faXRlcik7Ci0gICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAkIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgZHZhbCA8PCAiOyIgPDwgZW5kbDsKLSAgfQotCi0gIG91dCA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIGNvbnN0cnVjdG9yIGZyb20gYXJyYXkKLSAgc3RyaW5nIHBhcmFtID0gKG1lbWJlcnMuc2l6ZSgpID4gMCkgPyAiJHZhbHM9bnVsbCIgOiAiIjsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoIiA8PCBwYXJhbSA8PCAiKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBnZW5lcmF0ZV9waHBfc3RydWN0X3NwZWMob3V0LCB0c3RydWN0KTsKLQotICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCAmJiAodC0+aXNfc3RydWN0KCkgfHwgdC0+aXNfeGNlcHRpb24oKSkpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIiR0aGlzLT4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIgotICAgICAgICAgICAgICAgICAgICA8PCByZW5kZXJfY29uc3RfdmFsdWUodCwgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKGlzX2FycmF5KCR2YWxzKSkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpZiAob29wXykgewotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwYXJlbnQ6Ol9fY29uc3RydWN0KHNlbGY6OiRfVFNQRUMsICR2YWxzKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoaXNzZXQoJHZhbHNbJyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInXSkpIHsiIDw8IGVuZGwKLSAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgICR0aGlzLT4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gJHZhbHNbJyIKLSAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJ107IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgfQotICBzY29wZV9kb3duKG91dCk7Ci0gIG91dCA8PCBlbmRsOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGZ1bmN0aW9uIGdldE5hbWUoKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAnIgotICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJzsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9waHBfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QsIGlzX3Jlc3VsdCk7Ci0gIGdlbmVyYXRlX3BocF9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCwgaXNfcmVzdWx0KTsKLSAgaWYgKG5lZWRzX3BocF9yZWFkX3ZhbGlkYXRvcih0c3RydWN0LCBpc19yZXN1bHQpKSB7Ci0gICAgZ2VuZXJhdGVfcGhwX3N0cnVjdF9yZWFkX3ZhbGlkYXRvcihvdXQsIHRzdHJ1Y3QpOwotICB9Ci0gIGlmIChuZWVkc19waHBfd3JpdGVfdmFsaWRhdG9yKHRzdHJ1Y3QsIGlzX3Jlc3VsdCkpIHsKLSAgICBnZW5lcmF0ZV9waHBfc3RydWN0X3dyaXRlX3ZhbGlkYXRvcihvdXQsIHRzdHJ1Y3QpOwotICB9Ci0gIGlmIChqc29uX3NlcmlhbGl6YWJsZV8pIHsKLSAgICBnZW5lcmF0ZV9waHBfc3RydWN0X2pzb25fc2VyaWFsaXplKG91dCwgdHN0cnVjdCwgaXNfcmVzdWx0KTsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgcmVhZCgpIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9zdHJ1Y3RfcmVhZGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3Jlc3VsdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiByZWFkKCRpbnB1dCkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgaWYgKG9vcF8pIHsKLSAgICBpZiAobmVlZHNfcGhwX3JlYWRfdmFsaWRhdG9yKHRzdHJ1Y3QsIGlzX3Jlc3VsdCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICIkdG1wID0gJHRoaXMtPl9yZWFkKCciIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIicsIHNlbGY6OiRfVFNQRUMsICRpbnB1dCk7IgotICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIkdGhpcy0+X3ZhbGlkYXRlRm9yUmVhZCgpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gJHRtcDsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gJHRoaXMtPl9yZWFkKCciIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIicsIHNlbGY6OiRfVFNQRUMsICRpbnB1dCk7IgotICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICB9Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICAgIG91dCA8PCBlbmRsOwotICAgIHJldHVybjsKLSAgfQotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiJHhmZXIgPSAwOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJGZuYW1lID0gbnVsbDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgIDw8ICIkZnR5cGUgPSAwOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJGZpZCA9IDA7IiA8PCBlbmRsOwotCi0gIC8vIERlY2xhcmUgc3RhY2sgdG1wIHZhcmlhYmxlcwotICBpZiAoIWJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZFN0cnVjdEJlZ2luKCRmbmFtZSk7IiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCi0gIGluZGVudChvdXQpIDw8ICJ3aGlsZSAodHJ1ZSkiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfdXAob3V0KTsKLQotICAvLyBSZWFkIGJlZ2lubmluZyBmaWVsZCBtYXJrZXIKLSAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgdF9maWVsZCBmZnR5cGUoZ190eXBlX2J5dGUsICJmdHlwZSIpOwotICAgIHRfZmllbGQgZmZpZChnX3R5cGVfaTE2LCAiZmlkIik7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmZ0eXBlKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgkZnR5cGUgPT0gIgotICAgICAgICA8PCAiVFR5cGU6OlNUT1ApIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgYnJlYWs7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZmaWQpOwotICB9IGVsc2UgewotICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRGaWVsZEJlZ2luKCRmbmFtZSwgJGZ0eXBlLCAkZmlkKTsiIDw8IGVuZGw7Ci0gICAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyIGFuZCBicmVhawotICAgIGluZGVudChvdXQpIDw8ICJpZiAoJGZ0eXBlID09ICIKLSAgICAgICAgICAgICAgICA8PCAiVFR5cGU6OlNUT1ApIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gU3dpdGNoIHN0YXRlbWVudCBvbiB0aGUgZmllbGQgd2UgYXJlIHJlYWRpbmcKLSAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoJGZpZCkiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfdXAob3V0KTsKLQotICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJpZiAoJGZ0eXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLT4iKTsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7Ci0gICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICAkeGZlciArPSAiCi0gICAgICAgICAgICAgICAgICA8PCAiVFByb3RvY29sOjpza2lwQmluYXJ5KCRpbnB1dCwgJGZ0eXBlKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgICR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotCi0gIC8vIEluIHRoZSBkZWZhdWx0IGNhc2Ugd2Ugc2tpcCB0aGUgZmllbGQKLSAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOwotICBpZiAoYmluYXJ5X2lubGluZV8pIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiICAkeGZlciArPSAiCi0gICAgICAgICAgICAgICAgPDwgIlRQcm90b2NvbDo6c2tpcEJpbmFyeSgkaW5wdXQsICRmdHlwZSk7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGluZGVudChvdXQpIDw8ICIgICR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOyIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnQob3V0KSA8PCAiICBicmVhazsiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIGlmICghYmluYXJ5X2lubGluZV8pIHsKLSAgICAvLyBSZWFkIGZpZWxkIGVuZCBtYXJrZXIKLSAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgaWYgKCFiaW5hcnlfaW5saW5lXykgewotICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAobmVlZHNfcGhwX3JlYWRfdmFsaWRhdG9yKHRzdHJ1Y3QsIGlzX3Jlc3VsdCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiJHRoaXMtPl92YWxpZGF0ZUZvclJlYWQoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICR4ZmVyOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgdGhlIHdyaXRlKCkgbWV0aG9kIGZvciBhIHN0cnVjdAotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX3N0cnVjdF93cml0ZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfcmVzdWx0KSB7Ci0gIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBpZiAoYmluYXJ5X2lubGluZV8pIHsKLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIHdyaXRlKCYkb3V0cHV0KSB7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJG91dHB1dCkgeyIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfdXAoKTsKLQotICBpZiAobmVlZHNfcGhwX3dyaXRlX3ZhbGlkYXRvcih0c3RydWN0LCBpc19yZXN1bHQpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIiR0aGlzLT5fdmFsaWRhdGVGb3JXcml0ZSgpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGlmIChvb3BfKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInJldHVybiAkdGhpcy0+X3dyaXRlKCciIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIicsIHNlbGY6OiRfVFNQRUMsICRvdXRwdXQpOyIKLSAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgICBvdXQgPDwgZW5kbDsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgPSAwOyIgPDwgZW5kbDsKLQotICBpZiAoIWJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0QmVnaW4oJyIgPDwgbmFtZSA8PCAiJyk7IiA8PCBlbmRsOwotICB9Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgkdGhpcy0+IiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBzdHJpbmcgZXhwZWN0OwotICAgIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgZXhwZWN0ID0gImFycmF5IjsKLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpKSB7Ci0gICAgICBleHBlY3QgPSAib2JqZWN0IjsKLSAgICB9Ci0gICAgaWYgKCFleHBlY3QuZW1wdHkoKSkgewotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIWlzXyIgPDwgZXhwZWN0IDw8ICIoJHRoaXMtPiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpKSB7IgotICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGhyb3cgbmV3ICIKLSAgICAgICAgICA8PCAiVFByb3RvY29sRXhjZXB0aW9uKCdCYWQgdHlwZSBpbiBzdHJ1Y3R1cmUuJywgIgotICAgICAgICAgIDw8ICJUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7IiA8PCBlbmRsOwotICAgICAgc2NvcGVfZG93bihvdXQpOwotICAgIH0KLQotICAgIC8vIFdyaXRlIGZpZWxkIGhlYWRlcgotICAgIGlmIChiaW5hcnlfaW5saW5lXykgewotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ2MnLCAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpOyIKLSAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ24nLCAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRCZWdpbigiCi0gICAgICAgICAgICAgICAgICA8PCAiJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpCi0gICAgICAgICAgICAgICAgICA8PCAiLCAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLT4iKTsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgotICAgIGlmICghYmluYXJ5X2lubGluZV8pIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAoYmluYXJ5X2lubGluZV8pIHsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gcGFjaygnYycsICIKLSAgICAgICAgPDwgIlRUeXBlOjpTVE9QKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICA8PCAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAkeGZlcjsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfc3RydWN0X3JlYWRfdmFsaWRhdG9yKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGdlbmVyYXRlX3BocF9zdHJ1Y3RfcmVxdWlyZWRfdmFsaWRhdG9yKG91dCwgdHN0cnVjdCwgIl92YWxpZGF0ZUZvclJlYWQiLCBmYWxzZSk7Ci19Ci0KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfc3RydWN0X3dyaXRlX3ZhbGlkYXRvcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBnZW5lcmF0ZV9waHBfc3RydWN0X3JlcXVpcmVkX3ZhbGlkYXRvcihvdXQsIHRzdHJ1Y3QsICJfdmFsaWRhdGVGb3JXcml0ZSIsIHRydWUpOwotfQotCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX3N0cnVjdF9yZXF1aXJlZF92YWxpZGF0b3Iob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBtZXRob2RfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHdyaXRlX21vZGUpIHsKLSAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgZnVuY3Rpb24gIiA8PCBtZXRob2RfbmFtZSA8PCAiKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLQotICBpZiAoZmllbGRzLnNpemUoKSA+IDApIHsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgdF9maWVsZCogZmllbGQgPSAoKmZfaXRlcik7Ci0gICAgICBpZiAoZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVECi0gICAgICAgICAgfHwgKGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCAmJiB3cml0ZV9tb2RlKSkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCR0aGlzLT4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPT09IG51bGwpIHsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbignUmVxdWlyZWQgZmllbGQgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIuIgotICAgICAgICAgICAgICAgICAgICA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiIGlzIHVuc2V0IScpOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9zdHJ1Y3RfanNvbl9zZXJpYWxpemUob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQpIHsKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiBqc29uU2VyaWFsaXplKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaWYgKG5lZWRzX3BocF93cml0ZV92YWxpZGF0b3IodHN0cnVjdCwgaXNfcmVzdWx0KSkgewotICAgIGluZGVudChvdXQpIDw8ICIkdGhpcy0+X3ZhbGlkYXRlRm9yV3JpdGUoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAiJGpzb24gPSBuZXcgc3RkQ2xhc3M7IiA8PCBlbmRsOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0KLSAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqZl9pdGVyKTsKLSAgICAgIHRfdHlwZSogdHlwZSA9IGZpZWxkLT5nZXRfdHlwZSgpOwotICAgICAgY29uc3Qgc3RyaW5nJiBuYW1lID0gZmllbGQtPmdldF9uYW1lKCk7Ci0gICAgICBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgICAgdF90eXBlKiBrZXlfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICAgICAgaWYgKCEoa2V5X3R5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IGtleV90eXBlLT5pc19lbnVtKCkpKSB7Ci0gICAgICAgICAgLy8gSlNPTiBvYmplY3Qga2V5cyBtdXN0IGJlIHN0cmluZ3MuIFBIUCdzIGpzb25fZW5jb2RlKCkKLSAgICAgICAgICAvLyBmdW5jdGlvbiB3aWxsIGNvbnZlcnQgYW55IHNjYWxhciBrZXkgdG8gc3RyaW5ncywgYnV0Ci0gICAgICAgICAgLy8gd2Ugc2tpcCB0aHJpZnQgbWFwcyB3aXRoIG5vbi1zY2FsYXIga2V5cy4KLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaW5kZW50KG91dCkgPDwgImlmICgkdGhpcy0+IiA8PCBuYW1lIDw8ICIgIT09IG51bGwpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICIkanNvbi0+IiA8PCBuYW1lIDw8ICIgPSAiOwotICAgICAgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICAgIG91dCA8PCAiKG9iamVjdCkiOwotICAgICAgfQotICAgICAgb3V0IDw8ICIkdGhpcy0+IiA8PCBuYW1lIDw8ICI7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGluZGVudChvdXQpIDw8ICJyZXR1cm4gJGpzb247IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotCi0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLWludCB0X3BocF9nZW5lcmF0b3I6OmdldF9waHBfbnVtX3JlcXVpcmVkX2ZpZWxkcyhjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMsIGJvb2wgd3JpdGVfbW9kZSkgewotICBpbnQgbnVtX3JlcSA9IDA7Ci0KLSAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRAotICAgICAgICAgIHx8ICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUICYmIHdyaXRlX21vZGUpKSB7Ci0gICAgICAgICsrbnVtX3JlcTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIG51bV9yZXE7Ci19Ci0KLWJvb2wgdF9waHBfZ2VuZXJhdG9yOjpuZWVkc19waHBfd3JpdGVfdmFsaWRhdG9yKHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3Jlc3VsdCkgewotICByZXR1cm4gKHZhbGlkYXRlXyAmJiAhaXNfcmVzdWx0ICYmICF0c3RydWN0LT5pc191bmlvbigpCi0gICAgICAgICAgJiYgZ2V0X3BocF9udW1fcmVxdWlyZWRfZmllbGRzKHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCksIHRydWUpID4gMCk7Ci19Ci0KLWJvb2wgdF9waHBfZ2VuZXJhdG9yOjpuZWVkc19waHBfcmVhZF92YWxpZGF0b3IodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfcmVzdWx0KSB7Ci0gIHJldHVybiAodmFsaWRhdGVfICYmICFpc19yZXN1bHQKLSAgICAgICAgICAmJiAoZ2V0X3BocF9udW1fcmVxdWlyZWRfZmllbGRzKHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCksIGZhbHNlKSA+IDApKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IHBhY2thZ2VfZGlyXyArIHNlcnZpY2VfbmFtZV8gKyAiLnBocCI7Ci0gIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKLQotICBmX3NlcnZpY2VfIDw8ICI8P3BocCIgPDwgZW5kbDsKLSAgaWYgKCAhIHBocF9uYW1lc3BhY2Vfc3VmZml4KHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKS5lbXB0eSgpICkgewotICAgIGZfc2VydmljZV8gPDwgIm5hbWVzcGFjZSAiIDw8IHBocF9uYW1lc3BhY2Vfc3VmZml4KHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCAiOyIgPDwgZW5kbDsKLSAgfQotICBmX3NlcnZpY2VfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IHBocF9pbmNsdWRlcygpOwotCi0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgdGhyZWUgbWFpbiBwYXJ0cyBvZiB0aGUgc2VydmljZSAod2VsbCwgdHdvIGZvciBub3cgaW4gUEhQKQotICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7Ci0gIGlmIChyZXN0XykgewotICAgIGdlbmVyYXRlX3NlcnZpY2VfcmVzdCh0c2VydmljZSk7Ci0gIH0KLSAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOwotICBpZiAocGhwc18pIHsKLSAgICBnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0c2VydmljZSk7Ci0gIH0KLQotICAvLyBDbG9zZSBzZXJ2aWNlIGZpbGUKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotICBmX3NlcnZpY2VfLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCk7Ci0gICAgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIGV4dGVuZHMgIiArIHBocF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9wcm9ncmFtKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICArIGV4dGVuZHMgKyAiUHJvY2Vzc29yIjsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgotICBmX3NlcnZpY2VfIDw8ICJjbGFzcyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIlByb2Nlc3NvciIgPDwgZXh0ZW5kc19wcm9jZXNzb3IgPDwgIiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHJvdGVjdGVkICRoYW5kbGVyXyA9IG51bGw7IiA8PCBlbmRsOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRoYW5kbGVyKSB7IiA8PCBlbmRsOwotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICAkdGhpcy0+aGFuZGxlcl8gPSAkaGFuZGxlcjsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRoYW5kbGVyKTsiIDw8IGVuZGw7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBzZXJ2ZXIgaW1wbGVtZW50YXRpb24KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgZnVuY3Rpb24gcHJvY2VzcygkaW5wdXQsICRvdXRwdXQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiRyc2VxaWQgPSAwOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJGZuYW1lID0gbnVsbDsiIDw8IGVuZGwKLSAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJG10eXBlID0gMDsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpZiAoYmluYXJ5X2lubGluZV8pIHsKLSAgICB0X2ZpZWxkIGZmbmFtZShnX3R5cGVfc3RyaW5nLCAiZm5hbWUiKTsKLSAgICB0X2ZpZWxkIGZtdHlwZShnX3R5cGVfYnl0ZSwgIm10eXBlIik7Ci0gICAgdF9maWVsZCBmc2VxaWQoZ190eXBlX2kzMiwgInJzZXFpZCIpOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKGZfc2VydmljZV8sICZmZm5hbWUsICIiLCB0cnVlKTsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChmX3NlcnZpY2VfLCAmZm10eXBlLCAiIiwgdHJ1ZSk7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoZl9zZXJ2aWNlXywgJmZzZXFpZCwgIiIsIHRydWUpOwotICB9IGVsc2UgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiRpbnB1dC0+cmVhZE1lc3NhZ2VCZWdpbigkZm5hbWUsICRtdHlwZSwgJHJzZXFpZCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gSE9UOiBjaGVjayBmb3IgbWV0aG9kIGltcGxlbWVudGF0aW9uCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiRtZXRob2RuYW1lID0gJ3Byb2Nlc3NfJy4kZm5hbWU7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgPDwgImlmICghbWV0aG9kX2V4aXN0cygkdGhpcywgJG1ldGhvZG5hbWUpKSB7IiA8PCBlbmRsOwotICBpZiAoYmluYXJ5X2lubGluZV8pIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIHRocm93IG5ldyBcXEV4Y2VwdGlvbignRnVuY3Rpb24gJy4kZm5hbWUuJyBub3QgaW1wbGVtZW50ZWQuJyk7IgotICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgICRpbnB1dC0+c2tpcCgiCi0gICAgICAgICAgICAgICA8PCAiVFR5cGU6OlNUUlVDVCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgICRpbnB1dC0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgICR4ID0gbmV3ICIKLSAgICAgICAgICAgICAgIDw8ICJUQXBwbGljYXRpb25FeGNlcHRpb24oJ0Z1bmN0aW9uICcuJGZuYW1lLicgbm90IGltcGxlbWVudGVkLicsICIKLSAgICAgICAgICAgICAgIDw8ICJUQXBwbGljYXRpb25FeGNlcHRpb246OlVOS05PV05fTUVUSE9EKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgIDw8ICIgICRvdXRwdXQtPndyaXRlTWVzc2FnZUJlZ2luKCRmbmFtZSwgIgotICAgICAgICAgICAgICAgPDwgIlRNZXNzYWdlVHlwZTo6RVhDRVBUSU9OLCAkcnNlcWlkKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgIDw8ICIgICR4LT53cml0ZSgkb3V0cHV0KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgJG91dHB1dC0+d3JpdGVNZXNzYWdlRW5kKCk7IgotICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICAkb3V0cHV0LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgIDw8ICIgIHJldHVybjsiIDw8IGVuZGw7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgIDw8ICIkdGhpcy0+JG1ldGhvZG5hbWUoJHJzZXFpZCwgJGlucHV0LCAkb3V0cHV0KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICAvLyBPcGVuIGZ1bmN0aW9uCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJvdGVjdGVkIGZ1bmN0aW9uIHByb2Nlc3NfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgIDw8ICIoJHNlcWlkLCAkaW5wdXQsICRvdXRwdXQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIHN0cmluZyBhcmdzbmFtZSA9IHBocF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpICsgc2VydmljZV9uYW1lXyArICJfIgotICAgICAgICAgICAgICAgICAgICArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyI7Ci0gIHN0cmluZyByZXN1bHRuYW1lID0gcGhwX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgKyBzZXJ2aWNlX25hbWVfICsgIl8iCi0gICAgICAgICAgICAgICAgICAgICAgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7Ci0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgPDwgIiRhcmdzLT5yZWFkKCRpbnB1dCk7IiA8PCBlbmRsOwotICBpZiAoIWJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJGlucHV0LT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKLSAgfQotCi0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0KLSAgLy8gRGVjbGFyZSByZXN1bHQgZm9yIG5vbiBvbmV3YXkgZnVuY3Rpb24KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKLSAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJ5IHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAotICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgIGZfc2VydmljZV8gPDwgIiRyZXN1bHQtPnN1Y2Nlc3MgPSAiOwotICB9Ci0gIGZfc2VydmljZV8gPDwgIiR0aGlzLT5oYW5kbGVyXy0+IiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAiJGFyZ3MtPiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICB9Ci0gIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOwotCi0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiB4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0gY2F0Y2ggKCIKLSAgICAgICAgICAgICAgICAgPDwgcGhwX25hbWVzcGFjZShnZXRfdHJ1ZV90eXBlKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSktPmdldF9wcm9ncmFtKCkpCi0gICAgICAgICAgICAgICAgIDw8ICgqeF9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSA8PCAiICQiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IgotICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkcmVzdWx0LT4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gJCIKLSAgICAgICAgICAgICAgICAgICA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBTaG9ydGN1dCBvdXQgaGVyZSBmb3Igb25ld2F5IGZ1bmN0aW9ucwotICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgIHJldHVybjsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiRiaW5fYWNjZWwgPSAoJG91dHB1dCBpbnN0YW5jZW9mICIKLSAgICAgICAgICAgICA8PCAiVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQpICYmIGZ1bmN0aW9uX2V4aXN0cygndGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeScpOyIKLSAgICAgICAgICAgICA8PCBlbmRsOwotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmICgkYmluX2FjY2VsKSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSgkb3V0cHV0LCAnIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKLSAgICAgICAgICAgICA8PCAiJywgIgotICAgICAgICAgICAgIDw8ICJUTWVzc2FnZVR5cGU6OlJFUExZLCAkcmVzdWx0LCAkc2VxaWQsICRvdXRwdXQtPmlzU3RyaWN0V3JpdGUoKSk7IiA8PCBlbmRsOwotCi0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImVsc2UiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0gIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdCBoZWFkZXIKLSAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJGJ1ZmYgPSBwYWNrKCdOJywgKDB4ODAwMTAwMDAgfCAiCi0gICAgICAgICAgICAgICA8PCAiVE1lc3NhZ2VUeXBlOjpSRVBMWSkpOyAiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiRidWZmIC49IHBhY2soJ04nLCBzdHJsZW4oJyIKLSAgICAgICAgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiJykpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJGJ1ZmYgLj0gJyIKLSAgICAgICAgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiJzsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiRidWZmIC49IHBhY2soJ04nLCAkc2VxaWQpOyIKLSAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiRyZXN1bHQtPndyaXRlKCRidWZmKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgIDw8ICIkb3V0cHV0LT53cml0ZSgkYnVmZik7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkb3V0cHV0LT5mbHVzaCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkb3V0cHV0LT53cml0ZU1lc3NhZ2VCZWdpbignIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIicsICIKLSAgICAgICAgICAgICAgIDw8ICJUTWVzc2FnZVR5cGU6OlJFUExZLCAkc2VxaWQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJHJlc3VsdC0+d3JpdGUoJG91dHB1dCk7IgotICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dC0+d3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICA8PCAiJG91dHB1dC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLQotICAvLyBDbG9zZSBmdW5jdGlvbgotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBoZWxwZXIgZnVuY3Rpb25zIGZvciBhIHNlcnZpY2UuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgewotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICBmX3NlcnZpY2VfIDw8ICIvLyBIRUxQRVIgRlVOQ1RJT05TIEFORCBTVFJVQ1RVUkVTIiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgc3RyaW5nIG5hbWUgPSB0cy0+Z2V0X25hbWUoKTsKLSAgICB0cy0+c2V0X25hbWUoc2VydmljZV9uYW1lXyArICJfIiArIG5hbWUpOwotICAgIGdlbmVyYXRlX3BocF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCB0cyk7Ci0gICAgZ2VuZXJhdGVfcGhwX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7Ci0gICAgdHMtPnNldF9uYW1lKG5hbWUpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCBzZXJ2aWNlX25hbWVfICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKLSAgICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOwotICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOwotICAgIH0KLQotICAgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKLSAgICB9Ci0KLSAgICBnZW5lcmF0ZV9waHBfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UsIHRydWUpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfaWYgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gIiBleHRlbmRzICIgKyBwaHBfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfcHJvZ3JhbSgpKQotICAgICAgICAgICAgICArIHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpOwotICAgIGV4dGVuZHNfaWYgPSAiIGV4dGVuZHMgIiArIHBocF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9wcm9ncmFtKCkpCi0gICAgICAgICAgICAgICAgICsgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgKyAiSWYiOwotICB9Ci0gIGdlbmVyYXRlX3BocF9kb2MoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOwotICBmX3NlcnZpY2VfIDw8ICJpbnRlcmZhY2UgIiA8PCBwaHBfbmFtZXNwYWNlX2RlY2xhcmF0aW9uKHRzZXJ2aWNlKSA8PCAiSWYiIDw8IGV4dGVuZHNfaWYgPDwgIiB7IgotICAgICAgICAgICAgIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9waHBfZG9jKGZfc2VydmljZV8sICpmX2l0ZXIpOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGZ1bmN0aW9uICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8ICI7IiA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBSRVNUIGludGVyZmFjZQotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9yZXN0KHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfaWYgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gIiBleHRlbmRzICIgKyBwaHBfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfcHJvZ3JhbSgpKQotICAgICAgICAgICAgICArIHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpOwotICAgIGV4dGVuZHNfaWYgPSAiIGV4dGVuZHMgIiArIHBocF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9wcm9ncmFtKCkpCi0gICAgICAgICAgICAgICAgICsgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgKyAiUmVzdCI7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PCAiY2xhc3MgIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJSZXN0IiA8PCBleHRlbmRzX2lmIDw8ICIgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInByb3RlY3RlZCAkaW1wbF87IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGltcGwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICA8PCAiICAkdGhpcy0+aW1wbF8gPSAkaW1wbDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBmdW5jdGlvbiAiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCRyZXF1ZXN0KSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGFyZ3MgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgYV9pdGVyOwotICAgIGZvciAoYV9pdGVyID0gYXJncy5iZWdpbigpOyBhX2l0ZXIgIT0gYXJncy5lbmQoKTsgKythX2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogYXR5cGUgPSBnZXRfdHJ1ZV90eXBlKCgqYV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgICBzdHJpbmcgY2FzdCA9IHR5cGVfdG9fY2FzdChhdHlwZSk7Ci0gICAgICBzdHJpbmcgcmVxID0gIiRyZXF1ZXN0WyciICsgKCphX2l0ZXIpLT5nZXRfbmFtZSgpICsgIiddIjsKLSAgICAgIGlmIChhdHlwZS0+aXNfYm9vbCgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiQiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCBjYXN0IDw8ICIoIWVtcHR5KCIgPDwgcmVxCi0gICAgICAgICAgICAgICAgICAgPDwgIikgJiYgKCIgPDwgcmVxIDw8ICIgIT09ICdmYWxzZScpKTsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IGlzc2V0KCIgPDwgcmVxIDw8ICIpID8gIgotICAgICAgICAgICAgICAgICAgIDw8IGNhc3QgPDwgcmVxIDw8ICIgOiBudWxsOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGlmIChhdHlwZS0+aXNfc3RyaW5nKCkgJiYgKCh0X2Jhc2VfdHlwZSopYXR5cGUpLT5pc19zdHJpbmdfbGlzdCgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiQiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gZXhwbG9kZSgnLCcsICQiCi0gICAgICAgICAgICAgICAgICAgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSBpZiAoYXR5cGUtPmlzX21hcCgpIHx8IGF0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBqc29uX2RlY29kZSgkIgotICAgICAgICAgICAgICAgICAgIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiLCB0cnVlKTsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgaWYgKGF0eXBlLT5pc19zZXQoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IGFycmF5X2ZpbGxfa2V5cyhqc29uX2RlY29kZSgkIgotICAgICAgICAgICAgICAgICAgIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiLCB0cnVlKSwgMSk7IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIGlmIChhdHlwZS0+aXNfc3RydWN0KCkgfHwgYXR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKCQiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9PSBudWxsKSB7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgJCIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBuZXcgIgotICAgICAgICAgICAgICAgICAgIDw8IHBocF9uYW1lc3BhY2UoYXR5cGUtPmdldF9wcm9ncmFtKCkpIDw8IGF0eXBlLT5nZXRfbmFtZSgpIDw8ICIoanNvbl9kZWNvZGUoJCIKLSAgICAgICAgICAgICAgICAgICA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIiwgdHJ1ZSkpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICR0aGlzLT5pbXBsXy0+IiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIigiCi0gICAgICAgICAgICAgICA8PCBhcmd1bWVudF9saXN0KCgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSwgZmFsc2UpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKTsKLSAgICBleHRlbmRzX2NsaWVudCA9ICIgZXh0ZW5kcyAiICsgcGhwX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X3Byb2dyYW0oKSkgKyBleHRlbmRzCi0gICAgICAgICAgICAgICAgICAgICArICJDbGllbnQiOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PCAiY2xhc3MgIiA8PCBwaHBfbmFtZXNwYWNlX2RlY2xhcmF0aW9uKHRzZXJ2aWNlKSA8PCAiQ2xpZW50IiA8PCBleHRlbmRzX2NsaWVudAotICAgICAgICAgICAgIDw8ICIgaW1wbGVtZW50cyAiIDw8IHBocF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmIHsiCi0gICAgICAgICAgICAgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgLy8gUHJpdmF0ZSBtZW1iZXJzCi0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgJGlucHV0XyA9IG51bGw7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICA8PCAicHJvdGVjdGVkICRvdXRwdXRfID0gbnVsbDsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgJHNlcWlkXyA9IDA7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBDb25zdHJ1Y3RvciBmdW5jdGlvbgotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGlucHV0LCAkb3V0cHV0PW51bGwpIHsiIDw8IGVuZGw7Ci0gIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRpbnB1dCwgJG91dHB1dCk7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgJHRoaXMtPmlucHV0XyA9ICRpbnB1dDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgIDw8ICIgICR0aGlzLT5vdXRwdXRfID0gJG91dHB1dCA/ICRvdXRwdXQgOiAkaW5wdXQ7IiA8PCBlbmRsOwotICB9Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOwotICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgLy8gT3BlbiBmdW5jdGlvbgotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGZ1bmN0aW9uICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIkdGhpcy0+c2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiOwotCi0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOwotICAgICAgfQotICAgICAgZl9zZXJ2aWNlXyA8PCAiJCIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOwotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICJyZXR1cm4gIjsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwgIiR0aGlzLT5yZWN2XyIgPDwgZnVubmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotICAgIH0KLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGZ1bmN0aW9uIHNlbmRfIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICAgIHN0ZDo6c3RyaW5nIGFyZ3NuYW1lID0gcGhwX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgKyBzZXJ2aWNlX25hbWVfICsgIl8iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfYXJncyI7Ci0KLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0KLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJGFyZ3MtPiIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICQiCi0gICAgICAgICAgICAgICAgIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiRiaW5fYWNjZWwgPSAoJHRoaXMtPm91dHB1dF8gaW5zdGFuY2VvZiAiCi0gICAgICAgICAgICAgICA8PCAiVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQpICYmIGZ1bmN0aW9uX2V4aXN0cygndGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeScpOyIKLSAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0KLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAoJGJpbl9hY2NlbCkiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgICBzdHJpbmcgbWVzc2FnZVR5cGUgPSAoKmZfaXRlciktPmlzX29uZXdheSgpID8gIlRNZXNzYWdlVHlwZTo6T05FV0FZIiA6ICJUTWVzc2FnZVR5cGU6OkNBTEwiOwotCi0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSgkdGhpcy0+b3V0cHV0XywgJyIKLSAgICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJywgIiA8PCBtZXNzYWdlVHlwZQotICAgICAgICAgICAgICAgPDwgIiwgJGFyZ3MsICR0aGlzLT5zZXFpZF8sICR0aGlzLT5vdXRwdXRfLT5pc1N0cmljdFdyaXRlKCkpOyIgPDwgZW5kbDsKLQotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZWxzZSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdCBoZWFkZXIKLSAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiRidWZmID0gcGFjaygnTicsICgweDgwMDEwMDAwIHwgIiA8PCBtZXNzYWdlVHlwZSA8PCAiKSk7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkYnVmZiAuPSBwYWNrKCdOJywgc3RybGVuKCciIDw8IGZ1bm5hbWUgPDwgIicpKTsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRidWZmIC49ICciIDw8IGZ1bm5hbWUgPDwgIic7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgIDw8ICIkYnVmZiAuPSBwYWNrKCdOJywgJHRoaXMtPnNlcWlkXyk7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkdGhpcy0+b3V0cHV0Xy0+d3JpdGVNZXNzYWdlQmVnaW4oJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgIDw8ICInLCAiIDw8IG1lc3NhZ2VUeXBlIDw8ICIsICR0aGlzLT5zZXFpZF8pOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICAvLyBXcml0ZSB0byB0aGUgc3RyZWFtCi0gICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkYXJncy0+d3JpdGUoJGJ1ZmYpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgICA8PCAiJHRoaXMtPm91dHB1dF8tPndyaXRlKCRidWZmKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICAgPDwgIiR0aGlzLT5vdXRwdXRfLT5mbHVzaCgpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJGFyZ3MtPndyaXRlKCR0aGlzLT5vdXRwdXRfKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICAgPDwgIiR0aGlzLT5vdXRwdXRfLT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICAgPDwgIiR0aGlzLT5vdXRwdXRfLT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLQotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdG5hbWUgPSBwaHBfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKLSAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7Ci0KLSAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MpOwotICAgICAgLy8gT3BlbiBmdW5jdGlvbgotICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24pCi0gICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJGJpbl9hY2NlbCA9ICgkdGhpcy0+aW5wdXRfIGluc3RhbmNlb2YgIgotICAgICAgICAgICAgICAgICA8PCAiVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQpIgotICAgICAgICAgICAgICAgICA8PCAiICYmIGZ1bmN0aW9uX2V4aXN0cygndGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5Jyk7IiA8PCBlbmRsOwotCi0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgIDw8ICJpZiAoJGJpbl9hY2NlbCkgJHJlc3VsdCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2JpbmFyeSgkdGhpcy0+aW5wdXRfLCAnIgotICAgICAgICAgICAgICAgICA8PCByZXN1bHRuYW1lIDw8ICInLCAkdGhpcy0+aW5wdXRfLT5pc1N0cmljdFJlYWQoKSk7IiA8PCBlbmRsOwotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZWxzZSIgPDwgZW5kbDsKLSAgICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkcnNlcWlkID0gMDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiRmbmFtZSA9IG51bGw7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkbXR5cGUgPSAwOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKLSAgICAgICAgdF9maWVsZCBmZm5hbWUoZ190eXBlX3N0cmluZywgImZuYW1lIik7Ci0gICAgICAgIHRfZmllbGQgZnNlcWlkKGdfdHlwZV9pMzIsICJyc2VxaWQiKTsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJHZlciA9IHVucGFjaygnTicsICR0aGlzLT5pbnB1dF8tPnJlYWRBbGwoNCkpOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkdmVyID0gJHZlclsxXTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiRtdHlwZSA9ICR2ZXIgJiAweGZmOyIKLSAgICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkdmVyID0gJHZlciAmIDB4ZmZmZjAwMDA7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgICAgPDwgImlmICgkdmVyICE9IDB4ODAwMTAwMDApIHRocm93IG5ldyAiCi0gICAgICAgICAgICAgICAgICAgPDwgIlRQcm90b2NvbEV4Y2VwdGlvbignQmFkIHZlcnNpb24gaWRlbnRpZmllcjogJy4kdmVyLCAiCi0gICAgICAgICAgICAgICAgICAgPDwgIlRQcm90b2NvbEV4Y2VwdGlvbjo6QkFEX1ZFUlNJT04pOyIgPDwgZW5kbDsKLSAgICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoZl9zZXJ2aWNlXywgJmZmbmFtZSwgIiIsIHRydWUpOwotICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChmX3NlcnZpY2VfLCAmZnNlcWlkLCAiIiwgdHJ1ZSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkdGhpcy0+aW5wdXRfLT5yZWFkTWVzc2FnZUJlZ2luKCRmbmFtZSwgJG10eXBlLCAkcnNlcWlkKTsiCi0gICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgKCRtdHlwZSA9PSAiCi0gICAgICAgICAgICAgICAgICAgPDwgIlRNZXNzYWdlVHlwZTo6RVhDRVBUSU9OKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgICR4ID0gbmV3ICIKLSAgICAgICAgICAgICAgICAgICA8PCAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgICR4LT5yZWFkKCR0aGlzLT5pbnB1dF8pOyIKLSAgICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgICR0aGlzLT5pbnB1dF8tPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgICAgPDwgIiAgdGhyb3cgJHg7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgIDw8ICIkcmVzdWx0LT5yZWFkKCR0aGlzLT5pbnB1dF8pOyIgPDwgZW5kbDsKLQotICAgICAgaWYgKCFiaW5hcnlfaW5saW5lXykgewotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkdGhpcy0+aW5wdXRfLT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLQotICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKCRyZXN1bHQtPnN1Y2Nlc3MgIT09IG51bGwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICAgICA8PCAiICByZXR1cm4gJHJlc3VsdC0+c3VjY2VzczsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOwotICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmICgkcmVzdWx0LT4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9PSBudWxsKSB7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgdGhyb3cgJHJlc3VsdC0+IiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidGhyb3cgbmV3IFxcRXhjZXB0aW9uKFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgICA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIik7IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICAvLyBDbG9zZSBmdW5jdGlvbgotICAgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbGFzcykgewotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUpOwotICB9IGVsc2UgewotCi0gICAgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotCi0gICAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKLSAgICAgICAgc3RkOjpzdHJpbmcgaXRyYW5zID0gKGluY2xhc3MgPyAiJHRoaXMtPmlucHV0XyIgOiAiJGlucHV0Iik7Ci0KLSAgICAgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJGxlbiA9IHVucGFjaygnTicsICIgPDwgaXRyYW5zIDw8ICItPnJlYWRBbGwoNCkpOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkbGVuID0gJGxlblsxXTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmICgkbGVuID4gMHg3ZmZmZmZmZikgeyIKLSAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgICRsZW4gPSAwIC0gKCgkbGVuIC0gMSkgXiAweGZmZmZmZmZmKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgbmFtZSA8PCAiID0gIiA8PCBpdHJhbnMgPDwgIi0+cmVhZEFsbCgkbGVuKTsiCi0gICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgbmFtZSA8PCAiID0gdW5wYWNrKCdjJywgIiA8PCBpdHJhbnMgPDwgIi0+cmVhZEFsbCgxKSk7IgotICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiQiIDw8IG5hbWUgPDwgIiA9IChib29sKSQiIDw8IG5hbWUgPDwgIlsxXTsiIDw8IGVuZGw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiQiIDw8IG5hbWUgPDwgIiA9IHVucGFjaygnYycsICIgPDwgaXRyYW5zIDw8ICItPnJlYWRBbGwoMSkpOyIKLSAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkIiA8PCBuYW1lIDw8ICIgPSAkIiA8PCBuYW1lIDw8ICJbMV07IiA8PCBlbmRsOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiR2YWwgPSB1bnBhY2soJ24nLCAiIDw8IGl0cmFucyA8PCAiLT5yZWFkQWxsKDIpKTsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJHZhbCA9ICR2YWxbMV07IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiAoJHZhbCA+IDB4N2ZmZikgeyIKLSAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgICR2YWwgPSAwIC0gKCgkdmFsIC0gMSkgXiAweGZmZmYpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkIiA8PCBuYW1lIDw8ICIgPSAkdmFsOyIgPDwgZW5kbDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkdmFsID0gdW5wYWNrKCdOJywgIiA8PCBpdHJhbnMgPDwgIi0+cmVhZEFsbCg0KSk7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiR2YWwgPSAkdmFsWzFdOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgKCR2YWwgPiAweDdmZmZmZmZmKSB7IgotICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgJHZhbCA9IDAgLSAoKCR2YWwgLSAxKSBeIDB4ZmZmZmZmZmYpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkIiA8PCBuYW1lIDw8ICIgPSAkdmFsOyIgPDwgZW5kbDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkYXJyID0gdW5wYWNrKCdOMicsICIgPDwgaXRyYW5zIDw8ICItPnJlYWRBbGwoOCkpOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoJGFyclsxXSAmIDB4ODAwMDAwMDApIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICA8PCAiICAkYXJyWzFdID0gJGFyclsxXSBeIDB4RkZGRkZGRkY7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgPDwgIiAgJGFyclsyXSA9ICRhcnJbMl0gXiAweEZGRkZGRkZGOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICAkIiA8PCBuYW1lCi0gICAgICAgICAgICAgICAgPDwgIiA9IDAgLSAkYXJyWzFdKjQyOTQ5NjcyOTYgLSAkYXJyWzJdIC0gMTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IgotICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgJCIgPDwgbmFtZSA8PCAiID0gJGFyclsxXSo0Mjk0OTY3Mjk2ICsgJGFyclsyXTsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkYXJyID0gdW5wYWNrKCdkJywgc3RycmV2KCIgPDwgaXRyYW5zIDw8ICItPnJlYWRBbGwoOCkpKTsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgbmFtZSA8PCAiID0gJGFyclsxXTsiIDw8IGVuZGw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBQSFAgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpCi0gICAgICAgICAgICAgICAgKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJHZhbCA9IHVucGFjaygnTicsICIgPDwgaXRyYW5zIDw8ICItPnJlYWRBbGwoNCkpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICA8PCAiJHZhbCA9ICR2YWxbMV07IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiAoJHZhbCA+IDB4N2ZmZmZmZmYpIHsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgJHZhbCA9IDAgLSAoKCR2YWwgLSAxKSBeIDB4ZmZmZmZmZmYpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIKLSAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgbmFtZSA8PCAiID0gJHZhbDsiIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+IjsKLQotICAgICAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nKCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgICAgIG91dCA8PCAicmVhZEJvb2woJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICAgICAgb3V0IDw8ICJyZWFkQnl0ZSgkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgICAgIG91dCA8PCAicmVhZEkxNigkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgICAgIG91dCA8PCAicmVhZEkzMigkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgICAgIG91dCA8PCAicmVhZEk2NCgkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgICAgIG91dCA8PCAicmVhZERvdWJsZSgkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBQSFAgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgICAgICBvdXQgPDwgInJlYWRJMzIoJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICB9Ci0gICAgICAgIG91dCA8PCBlbmRsOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKLSAgICAgICAgICAgICB0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOwotICAgIH0KLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhbiB1bnNlcmlhbGl6ZXIgZm9yIGEgdmFyaWFibGUuIFRoaXMgbWFrZXMgdHdvIGtleSBhc3N1bXB0aW9ucywKLSAqIGZpcnN0IHRoYXQgdGhlcmUgaXMgYSBjb25zdCBjaGFyKiB2YXJpYWJsZSBuYW1lZCBkYXRhIHRoYXQgcG9pbnRzIHRvIHRoZQotICogYnVmZmVyIGZvciBkZXNlcmlhbGl6YXRpb24sIGFuZCB0aGF0IHRoZXJlIGlzIGEgdmFyaWFibGUgcHJvdG9jb2wgd2hpY2gKLSAqIGlzIGEgcmVmZXJlbmNlIHRvIGEgVFByb3RvY29sIHNlcmlhbGl6YXRpb24gb2JqZWN0LgotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCBwaHBfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpCi0gICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiR4ZmVyICs9ICQiIDw8IHByZWZpeAotICAgICAgPDwgIi0+cmVhZCgkaW5wdXQpOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBzaXplID0gdG1wKCJfc2l6ZSIpOwotICBzdHJpbmcga3R5cGUgPSB0bXAoIl9rdHlwZSIpOwotICBzdHJpbmcgdnR5cGUgPSB0bXAoIl92dHlwZSIpOwotICBzdHJpbmcgZXR5cGUgPSB0bXAoIl9ldHlwZSIpOwotCi0gIHRfZmllbGQgZnNpemUoZ190eXBlX2kzMiwgc2l6ZSk7Ci0gIHRfZmllbGQgZmt0eXBlKGdfdHlwZV9ieXRlLCBrdHlwZSk7Ci0gIHRfZmllbGQgZnZ0eXBlKGdfdHlwZV9ieXRlLCB2dHlwZSk7Ci0gIHRfZmllbGQgZmV0eXBlKGdfdHlwZV9ieXRlLCBldHlwZSk7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICIkIiA8PCBwcmVmaXggPDwgIiA9IGFycmF5KCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkIiA8PCBzaXplIDw8ICIgPSAwOyIKLSAgICAgIDw8IGVuZGw7Ci0KLSAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiQiIDw8IGt0eXBlIDw8ICIgPSAwOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgdnR5cGUgPDwgIiA9IDA7IgotICAgICAgICA8PCBlbmRsOwotICAgIGlmIChiaW5hcnlfaW5saW5lXykgewotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmt0eXBlKTsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2dHlwZSk7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmc2l6ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkTWFwQmVnaW4oIgotICAgICAgICAgIDw8ICIkIiA8PCBrdHlwZSA8PCAiLCAkIiA8PCB2dHlwZSA8PCAiLCAkIiA8PCBzaXplIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZXR5cGUpOwotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnNpemUpOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiQiIDw8IGV0eXBlIDw8ICIgPSAwOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRTZXRCZWdpbigiCi0gICAgICAgICAgPDwgIiQiIDw8IGV0eXBlIDw8ICIsICQiIDw8IHNpemUgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZXR5cGUpOwotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnNpemUpOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiQiIDw8IGV0eXBlIDw8ICIgPSAwOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRMaXN0QmVnaW4oIgotICAgICAgICAgIDw8ICIkIiA8PCBldHlwZSA8PCAiLCAkIiA8PCBzaXplIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICAvLyBGb3IgbG9vcCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCi0gIHN0cmluZyBpID0gdG1wKCJfaSIpOwotICBpbmRlbnQob3V0KSA8PCAiZm9yICgkIiA8PCBpIDw8ICIgPSAwOyAkIiA8PCBpIDw8ICIgPCAkIiA8PCBzaXplIDw8ICI7ICsrJCIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKLQotICBzY29wZV91cChvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBwcmVmaXgpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4KTsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICBpZiAoIWJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgLy8gUmVhZCBjb250YWluZXIgZW5kCi0gICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZE1hcEVuZCgpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZFNldEVuZCgpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRMaXN0RW5kKCk7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIHRvIGRlc2VyaWFsaXplIGEgbWFwCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcga2V5ID0gdG1wKCJrZXkiKTsKLSAgc3RyaW5nIHZhbCA9IHRtcCgidmFsIik7Ci0gIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKLSAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOwotCi0gIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZrZXksIHRydWUsIHRydWUpIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZ2YWwsIHRydWUsIHRydWUpIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSk7Ci0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwpOwotCi0gIGluZGVudChvdXQpIDw8ICIkIiA8PCBwcmVmaXggPDwgIlskIiA8PCBrZXkgPDwgIl0gPSAkIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcgZWxlbSA9IHRtcCgiZWxlbSIpOwotICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwgIiQiIDw8IGVsZW0gPDwgIiA9IG51bGw7IiA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PCAiaWYgKGlzX3NjYWxhcigkIiA8PCBlbGVtIDw8ICIpKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICAkIiA8PCBwcmVmaXggPDwgIlskIiA8PCBlbGVtIDw8ICJdID0gdHJ1ZTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgJCIgPDwgcHJlZml4IDw8ICIgW109ICQiIDw8IGVsZW0gPDwgIjsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotfQotCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoImVsZW0iKTsKLSAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PCAiJCIgPDwgZWxlbSA8PCAiID0gbnVsbDsiIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8ICIkIiA8PCBwcmVmaXggPDwgIiBbXT0gJCIgPDwgZWxlbSA8PCAiOyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCi0gKgotICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gcHJlZml4IE5hbWUgdG8gcHJlcGVuZCB0byBmaWVsZCBuYW1lCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob2ZzdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4KSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKLQotICAgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotCi0gICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCdOJywgc3RybGVuKCQiIDw8IG5hbWUgPDwgIikpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICA8PCAiJG91dHB1dCAuPSAkIiA8PCBuYW1lIDw8ICI7IiA8PCBlbmRsOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ2MnLCAkIiA8PCBuYW1lIDw8ICIgPyAxIDogMCk7IiA8PCBlbmRsOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ2MnLCAkIiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ24nLCAkIiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ04nLCAkIiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ04yJywgJCIgPDwgbmFtZSA8PCAiID4+IDMyLCAkIiA8PCBuYW1lCi0gICAgICAgICAgICAgIDw8ICIgJiAweEZGRkZGRkZGKTsiIDw8IGVuZGw7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBzdHJyZXYocGFjaygnZCcsICQiIDw8IG5hbWUgPDwgIikpOyIgPDwgZW5kbDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFBIUCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCdOJywgJCIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLQotICAgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRvdXRwdXQtPiI7Ci0KLSAgICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZygkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgICBvdXQgPDwgIndyaXRlQnl0ZSgkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICAgIG91dCA8PCAid3JpdGVJMTYoJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgICBvdXQgPDwgIndyaXRlSTMyKCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgICAgb3V0IDw8ICJ3cml0ZUk2NCgkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICAgIG91dCA8PCAid3JpdGVEb3VibGUoJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gUEhQIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgZW5kbDsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHByZWZpeC5jX3N0cigpLAotICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKLSAgICAgICAgICAgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKLSAgfQotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7Ci0gICh2b2lkKXRzdHJ1Y3Q7Ci0gIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkIiA8PCBwcmVmaXggPDwgIi0+d3JpdGUoJG91dHB1dCk7IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIFdyaXRlcyBvdXQgYSBjb250YWluZXIKLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgewotICBzY29wZV91cChvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCdjJywgIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkKLSAgICAgICAgICA8PCAiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gcGFjaygnYycsICIKLSAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIik7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgPDwgIiRvdXRwdXQgLj0gc3RycmV2KHBhY2soJ2wnLCBjb3VudCgkIiA8PCBwcmVmaXggPDwgIikpKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICIkb3V0cHV0LT53cml0ZU1hcEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpCi0gICAgICAgICAgICAgICAgICA8PCAiLCAiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCAiCi0gICAgICAgICAgICAgICAgICA8PCAiY291bnQoJCIgPDwgcHJlZml4IDw8ICIpKTsiIDw8IGVuZGw7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGlmIChiaW5hcnlfaW5saW5lXykgewotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ2MnLCAiIDw8IHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkKLSAgICAgICAgICA8PCAiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gc3RycmV2KHBhY2soJ2wnLCBjb3VudCgkIiA8PCBwcmVmaXggPDwgIikpKTsiCi0gICAgICAgICAgPDwgZW5kbDsKLQotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiJG91dHB1dC0+d3JpdGVTZXRCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkKLSAgICAgICAgICAgICAgICAgIDw8ICIsICIKLSAgICAgICAgICAgICAgICAgIDw8ICJjb3VudCgkIiA8PCBwcmVmaXggPDwgIikpOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGlmIChiaW5hcnlfaW5saW5lXykgewotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ2MnLCAiIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpCi0gICAgICAgICAgPDwgIik7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHN0cnJldihwYWNrKCdsJywgY291bnQoJCIgPDwgcHJlZml4IDw8ICIpKSk7IgotICAgICAgICAgIDw8IGVuZGw7Ci0KLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgIiRvdXRwdXQtPndyaXRlTGlzdEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkKLSAgICAgICAgICAgICAgICAgIDw8ICIsICIKLSAgICAgICAgICAgICAgICAgIDw8ICJjb3VudCgkIiA8PCBwcmVmaXggPDwgIikpOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBzY29wZV91cChvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBzdHJpbmcga2l0ZXIgPSB0bXAoImtpdGVyIik7Ci0gICAgc3RyaW5nIHZpdGVyID0gdG1wKCJ2aXRlciIpOwotICAgIGluZGVudChvdXQpIDw8ICJmb3JlYWNoICgkIiA8PCBwcmVmaXggPDwgIiBhcyAiCi0gICAgICAgICAgICAgICAgPDwgIiQiIDw8IGtpdGVyIDw8ICIgPT4gJCIgPDwgdml0ZXIgPDwgIikiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBraXRlciwgdml0ZXIpOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBzdHJpbmcgaXRlciA9IHRtcCgiaXRlciIpOwotICAgIHN0cmluZyBpdGVyX3ZhbCA9IHRtcCgiaXRlciIpOwotICAgIGluZGVudChvdXQpIDw8ICJmb3JlYWNoICgkIiA8PCBwcmVmaXggPDwgIiBhcyAkIiA8PCBpdGVyIDw8ICIgPT4gJCIgPDwgaXRlcl92YWwgPDwgIikiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGlzX3NjYWxhcigkIiA8PCBpdGVyX3ZhbCA8PCAiKSkgeyIgPDwgZW5kbDsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgaXRlcl92YWwpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgc3RyaW5nIGl0ZXIgPSB0bXAoIml0ZXIiKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiZm9yZWFjaCAoJCIgPDwgcHJlZml4IDw8ICIgYXMgJCIgPDwgaXRlciA8PCAiKSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgaXRlcik7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIGlmICghYmluYXJ5X2lubGluZV8pIHsKLSAgICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiJG91dHB1dC0+d3JpdGVNYXBFbmQoKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICIkb3V0cHV0LT53cml0ZVNldEVuZCgpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICIkb3V0cHV0LT53cml0ZUxpc3RFbmQoKTsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBtYXAuCi0gKgotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcga2l0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB2aXRlcikgewotICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2l0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCAiIik7Ci0KLSAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCwgIiIpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBzZXQuCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbGlzdC4KLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIGl0ZXIpIHsKLSAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKLX0KLQotLyoqCi0gKiBFbWl0cyBhIFBIUERvYyBjb21tZW50IGZvciB0aGUgZ2l2ZW4gY29udGVudHMKLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9kb2NzdHJpbmdfY29tbWVudChvZnN0cmVhbSYgb3V0LCBzdHJpbmcgY29udGVudHMpIHsKLSAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiLyoqXG4iLCAiICogIiwgY29udGVudHMsICIgKi9cbiIpOwotfQotCi0vKioKLSAqIEVtaXRzIGEgUEhQRG9jIGNvbW1lbnQgaWYgdGhlIHByb3ZpZGVkIG9iamVjdCBoYXMgYSBkb2MgaW4gVGhyaWZ0Ci0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfZG9jKG9mc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKSB7Ci0gIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKLSAgICBnZW5lcmF0ZV9waHBfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCB0ZG9jLT5nZXRfZG9jKCkpOwotICB9Ci19Ci0KLS8qKgotICogRW1pdHMgYSBQSFBEb2MgY29tbWVudCBmb3IgYSBmaWVsZAotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX2RvYyhvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCkgewotICBzdHJpbmdzdHJlYW0gc3M7Ci0KLSAgLy8gcHJlcGVuZCBmcmVlLXN0eWxlIGRvYyBpZiBhdmFpbGFibGUKLSAgaWYgKGZpZWxkLT5oYXNfZG9jKCkpIHsKLSAgICBzcyA8PCBmaWVsZC0+Z2V0X2RvYygpIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBhcHBlbmQgQHZhciB0YWcKLSAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gIHNzIDw8ICJAdmFyICIgPDwgdHlwZV90b19waHBkb2ModHlwZSkgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9waHBfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCBzcy5zdHIoKSk7Ci19Ci0KLS8qKgotICogRW1pdHMgYSBQSFBEb2MgY29tbWVudCBmb3IgYSBmdW5jdGlvbgotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX2RvYyhvZnN0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiBmdW5jdGlvbikgewotICBzdHJpbmdzdHJlYW0gc3M7Ci0gIGlmIChmdW5jdGlvbi0+aGFzX2RvYygpKSB7Ci0gICAgc3MgPDwgZnVuY3Rpb24tPmdldF9kb2MoKSA8PCBlbmRsOwotICB9Ci0KLSAgLy8gZ2VuZXJhdGUgcGFyYW1ldGVyIHR5cGVzIGRvYwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBhcmdzID0gZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGFfaXRlcjsKLSAgZm9yIChhX2l0ZXIgPSBhcmdzLmJlZ2luKCk7IGFfaXRlciAhPSBhcmdzLmVuZCgpOyArK2FfaXRlcikgewotICAgIHRfZmllbGQqIGFyZyA9ICphX2l0ZXI7Ci0gICAgc3MgPDwgIkBwYXJhbSAiIDw8IHR5cGVfdG9fcGhwZG9jKGFyZy0+Z2V0X3R5cGUoKSkgPDwgIiAkIiA8PCBhcmctPmdldF9uYW1lKCk7Ci0gICAgaWYgKGFyZy0+aGFzX2RvYygpKSB7Ci0gICAgICBzcyA8PCAiICIgPDwgYXJnLT5nZXRfZG9jKCk7Ci0gICAgfQotICAgIHNzIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBnZW5lcmF0ZSByZXR1cm4gdHlwZSBkb2MKLSAgdF90eXBlKiByZXRfdHlwZSA9IGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOwotICBpZiAoIXJldF90eXBlLT5pc192b2lkKCkgfHwgcmV0X3R5cGUtPmhhc19kb2MoKSkgewotICAgIHNzIDw8ICJAcmV0dXJuICIgPDwgdHlwZV90b19waHBkb2MocmV0X3R5cGUpOwotICAgIGlmIChyZXRfdHlwZS0+aGFzX2RvYygpKSB7Ci0gICAgICBzcyA8PCAiICIgPDwgcmV0X3R5cGUtPmdldF9kb2MoKTsKLSAgICB9Ci0gICAgc3MgPDwgZW5kbDsKLSAgfQotCi0gIC8vIGdlbmVyYXRlIGV4Y2VwdGlvbnMgZG9jCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGV4Y3MgPSBmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBlX2l0ZXI7Ci0gIGZvciAoZV9pdGVyID0gZXhjcy5iZWdpbigpOyBlX2l0ZXIgIT0gZXhjcy5lbmQoKTsgKytlX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBleGMgPSAqZV9pdGVyOwotICAgIHNzIDw8ICJAdGhyb3dzICIgPDwgdHlwZV90b19waHBkb2MoZXhjLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAoZXhjLT5oYXNfZG9jKCkpIHsKLSAgICAgIHNzIDw8ICIgIiA8PCBleGMtPmdldF9kb2MoKTsKLSAgICB9Ci0gICAgc3MgPDwgZW5kbDsKLSAgfQotCi0gIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwgIi8qKlxuIiwgIiAqICIsIHNzLnN0cigpLCAiICovXG4iKTsKLX0KLQotLyoqCi0gKiBEZWNsYXJlcyBhIGZpZWxkLCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCi0gKgotICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCi0gKi8KLXN0cmluZyB0X3BocF9nZW5lcmF0b3I6OmRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQsIGJvb2wgb2JqKSB7Ci0gIHN0cmluZyByZXN1bHQgPSAiJCIgKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIGlmIChpbml0KSB7Ci0gICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICByZXN1bHQgKz0gIiA9ICcnIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIHJlc3VsdCArPSAiID0gZmFsc2UiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgcmVzdWx0ICs9ICIgPSAwLjAiOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gUEhQIGluaXRpYWxpemVyIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIHJlc3VsdCArPSAiID0gMCI7Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgcmVzdWx0ICs9ICIgPSBhcnJheSgpIjsKLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICAgIGlmIChvYmopIHsKLSAgICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHBocF9uYW1lc3BhY2UodHlwZS0+Z2V0X3Byb2dyYW0oKSkgKyB0eXBlLT5nZXRfbmFtZSgpICsgIigpIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlc3VsdCArPSAiID0gbnVsbCI7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiByZXN1bHQgKyAiOyI7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJwotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgotICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgotICovCi1zdHJpbmcgdF9waHBfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4KSB7Ci0gIHJldHVybiBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiKCIgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkgKyAiKSI7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZpZWxkIGxpc3QKLSAqLwotc3RyaW5nIHRfcGhwX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBhZGRUeXBlSGludHMpIHsKLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgKz0gIiwgIjsKLSAgICB9Ci0KLSAgICB0X3R5cGUqIHR5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0KLSAgICAvLyBTZXQgdHlwZSBuYW1lCi0gICAgaWYgKGFkZFR5cGVIaW50cykgewotICAgICAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpKSB7Ci0gICAgICAgIHN0cmluZyBjbGFzc05hbWUgPSBwaHBfbmFtZXNwYWNlKHR5cGUtPmdldF9wcm9ncmFtKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICArIHBocF9uYW1lc3BhY2VfZGlyZWN0b3J5KCJEZWZpbml0aW9uIiwgZmFsc2UpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICArIGNsYXNzaWZ5KHR5cGUtPmdldF9uYW1lKCkpOwotCi0gICAgICAgIHJlc3VsdCArPSBjbGFzc05hbWUgKyAiICI7Ci0gICAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICAgIHJlc3VsdCArPSAiYXJyYXkgIjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXN1bHQgKz0gIiQiICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogR2V0cyBhIHR5cGVjYXN0IHN0cmluZyBmb3IgYSBwYXJ0aWN1bGFyIHR5cGUuCi0gKi8KLXN0cmluZyB0X3BocF9nZW5lcmF0b3I6OnR5cGVfdG9fY2FzdCh0X3R5cGUqIHR5cGUpIHsKLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGUqIGJ0eXBlID0gKHRfYmFzZV90eXBlKil0eXBlOwotICAgIHN3aXRjaCAoYnR5cGUtPmdldF9iYXNlKCkpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gIihib29sKSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICIoaW50KSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gIihkb3VibGUpIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJldHVybiAiKHN0cmluZykiOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gIiI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiKGludCkiOwotICB9Ci0gIHJldHVybiAiIjsKLX0KLQotLyoqCi0gKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIEMrKyBlbnVtIHN0cmluZyBmb3IgdGhlIGdpdmVuIHR5cGUuCi0gKi8KLXN0cmluZyB0X3BocF9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gIlRUeXBlOjpTVFJJTkciOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiVFR5cGU6OkJPT0wiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJldHVybiAiVFR5cGU6OkJZVEUiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICJUVHlwZTo6STE2IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiVFR5cGU6OkkzMiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gIlRUeXBlOjpJNjQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJUVHlwZTo6RE9VQkxFIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZTo6STMyIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuICJUVHlwZTo6U1RSVUNUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiVFR5cGU6Ok1BUCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlOjpTRVQiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiAiVFR5cGU6OkxTVCI7Ci0gIH0KLQotICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLS8qKgotICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBQSFBEb2Mgc3RyaW5nIGZvciB0aGUgZ2l2ZW4gdHlwZS4KLSAqLwotc3RyaW5nIHRfcGhwX2dlbmVyYXRvcjo6dHlwZV90b19waHBkb2ModF90eXBlKiB0eXBlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgcmV0dXJuICJ2b2lkIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJldHVybiAic3RyaW5nIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gImJvb2wiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJldHVybiAiaW50IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiaW50IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiaW50IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiaW50IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiZG91YmxlIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJpbnQiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gcGhwX25hbWVzcGFjZSh0eXBlLT5nZXRfcHJvZ3JhbSgpKSArIHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gImFycmF5IjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHRfc2V0KiB0c2V0ID0gc3RhdGljX2Nhc3Q8dF9zZXQqPih0eXBlKTsKLSAgICB0X3R5cGUqIHRfZWxlbSA9IHRzZXQtPmdldF9lbGVtX3R5cGUoKTsKLSAgICBpZiAodF9lbGVtLT5pc19jb250YWluZXIoKSkgewotICAgICAgcmV0dXJuICIoIiArIHR5cGVfdG9fcGhwZG9jKHRfZWxlbSkgKyAiKVtdIjsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIHR5cGVfdG9fcGhwZG9jKHRfZWxlbSkgKyAiW10iOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICB0X2xpc3QqIHRsaXN0ID0gc3RhdGljX2Nhc3Q8dF9saXN0Kj4odHlwZSk7Ci0gICAgdF90eXBlKiB0X2VsZW0gPSB0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIGlmICh0X2VsZW0tPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICByZXR1cm4gIigiICsgdHlwZV90b19waHBkb2ModF9lbGVtKSArICIpW10iOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gdHlwZV90b19waHBkb2ModF9lbGVtKSArICJbXSI7Ci0gICAgfQotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi1USFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAotICAgIHBocCwKLSAgICAiUEhQIiwKLSAgICAiICAgIGlubGluZWQ6ICAgICAgICAgR2VuZXJhdGUgUEhQIGlubGluZWQgZmlsZXNcbiIKLSAgICAiICAgIHNlcnZlcjogICAgICAgICAgR2VuZXJhdGUgUEhQIHNlcnZlciBzdHVic1xuIgotICAgICIgICAgb29wOiAgICAgICAgICAgICBHZW5lcmF0ZSBQSFAgd2l0aCBvYmplY3Qgb3JpZW50ZWQgc3ViY2xhc3Nlc1xuIgotICAgICIgICAgcmVzdDogICAgICAgICAgICBHZW5lcmF0ZSBQSFAgUkVTVCBwcm9jZXNzb3JzXG4iCi0gICAgIiAgICBuc2dsb2JhbD1OQU1FOiAgIFNldCBnbG9iYWwgbmFtZXNwYWNlXG4iCi0gICAgIiAgICB2YWxpZGF0ZTogICAgICAgIEdlbmVyYXRlIFBIUCB2YWxpZGF0b3IgbWV0aG9kc1xuIgotICAgICIgICAganNvbjogICAgICAgICAgICBHZW5lcmF0ZSBKc29uU2VyaWFsaXphYmxlIGNsYXNzZXMgKHJlcXVpcmVzIFBIUCA+PSA1LjQpXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3B5X2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9weV9nZW5lcmF0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNDNiMWYuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3B5X2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDI0NjEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlICJ0X2dlbmVyYXRvci5oIgotI2luY2x1ZGUgInBsYXRmb3JtLmgiCi0jaW5jbHVkZSAidmVyc2lvbi5oIgotCi11c2luZyBzdGQ6Om1hcDsKLXVzaW5nIHN0ZDo6b2ZzdHJlYW07Ci11c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Ci11c2luZyBzdGQ6OnN0cmluZzsKLXVzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwotdXNpbmcgc3RkOjp2ZWN0b3I7Ci0KLXN0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKLQotLyoqCi0gKiBQeXRob24gY29kZSBnZW5lcmF0b3IuCi0gKgotICovCi1jbGFzcyB0X3B5X2dlbmVyYXRvciA6IHB1YmxpYyB0X2dlbmVyYXRvciB7Ci1wdWJsaWM6Ci0gIHRfcHlfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQotICAgIDogdF9nZW5lcmF0b3IocHJvZ3JhbSkgewotICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7Ci0gICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJuZXdfc3R5bGUiKTsKLSAgICBnZW5fbmV3c3R5bGVfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoInNsb3RzIik7Ci0gICAgZ2VuX3Nsb3RzXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJkeW5hbWljIik7Ci0gICAgZ2VuX2R5bmFtaWNfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaWYgKGdlbl9keW5hbWljXykgewotICAgICAgZ2VuX25ld3N0eWxlXyA9IDA7IC8vIGR5bmFtaWMgaXMgbmV3c3R5bGUKLSAgICAgIGdlbl9keW5iYXNlY2xhc3NfID0gIlRCYXNlIjsKLSAgICAgIGdlbl9keW5iYXNlY2xhc3NfZXhjXyA9ICJURXhjZXB0aW9uQmFzZSI7Ci0gICAgICBpbXBvcnRfZHluYmFzZV8gPSAiZnJvbSB0aHJpZnQucHJvdG9jb2wuVEJhc2UgaW1wb3J0IFRCYXNlLCBURXhjZXB0aW9uQmFzZSwgVFRyYW5zcG9ydFxuIjsKLSAgICB9Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgiZHluYmFzZSIpOwotICAgIGlmIChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKSB7Ci0gICAgICBnZW5fZHluYmFzZV8gPSB0cnVlOwotICAgICAgZ2VuX2R5bmJhc2VjbGFzc18gPSAoaXRlci0+c2Vjb25kKTsKLSAgICB9Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgiZHluZXhjIik7Ci0gICAgaWYgKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpIHsKLSAgICAgIGdlbl9keW5iYXNlY2xhc3NfZXhjXyA9IChpdGVyLT5zZWNvbmQpOwotICAgIH0KLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJkeW5pbXBvcnQiKTsKLSAgICBpZiAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSkgewotICAgICAgZ2VuX2R5bmJhc2VfID0gdHJ1ZTsKLSAgICAgIGltcG9ydF9keW5iYXNlXyA9IChpdGVyLT5zZWNvbmQpOwotICAgIH0KLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJ0d2lzdGVkIik7Ci0gICAgZ2VuX3R3aXN0ZWRfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoInRvcm5hZG8iKTsKLSAgICBnZW5fdG9ybmFkb18gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICBpZiAoZ2VuX3R3aXN0ZWRfICYmIGdlbl90b3JuYWRvXykgewotICAgICAgdGhyb3cgImF0IG1vc3Qgb25lIG9mICd0d2lzdGVkJyBhbmQgJ3Rvcm5hZG8nIGFyZSBhbGxvd2VkIjsKLSAgICB9Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgidXRmOHN0cmluZ3MiKTsKLSAgICBnZW5fdXRmOHN0cmluZ3NfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoImNvZGluZyIpOwotICAgIGlmIChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKSB7Ci0gICAgICAgIGNvZGluZ18gPSBpdGVyLT5zZWNvbmQ7Ci0gICAgfQotCi0gICAgY29weV9vcHRpb25zXyA9IG9wdGlvbl9zdHJpbmc7Ci0KLSAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1weS50d2lzdGVkIjsKLSAgICB9IGVsc2UgaWYgKGdlbl90b3JuYWRvXykgewotICAgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tcHkudG9ybmFkbyI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLXB5IjsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcwotICAgKi8KLQotICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7Ci0gIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7Ci0KLSAgLyoqCi0gICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOwotICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0KLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOwotCi0gIC8qKgotICAgKiBTdHJ1Y3QgZ2VuZXJhdGlvbiBjb2RlCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfcHlfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfcHlfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCA9IGZhbHNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9weV9zdHJ1Y3RfcmVhZGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3B5X3N0cnVjdF93cml0ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfcHlfc3RydWN0X3JlcXVpcmVkX3ZhbGlkYXRvcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9weV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0KLSAgLyoqCi0gICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9yZW1vdGUodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gIC8qKgotICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbGFzcyA9IGZhbHNlKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBraXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdml0ZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0ZDo6c3RyaW5nIGl0ZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLQotICB2b2lkIGdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gIHZvaWQgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2RvYyogdGRvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc3ViaGVhZGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2RvYyogdGRvYyk7Ci0KLSAgLyoqCi0gICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCi0gICAqLwotCi0gIHN0ZDo6c3RyaW5nIHB5X2F1dG9nZW5fY29tbWVudCgpOwotICBzdGQ6OnN0cmluZyBweV9pbXBvcnRzKCk7Ci0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9pbmNsdWRlcygpOwotICBzdGQ6OnN0cmluZyByZW5kZXJfZmFzdGJpbmFyeV9pbmNsdWRlcygpOwotICBzdGQ6OnN0cmluZyBkZWNsYXJlX2FyZ3VtZW50KHRfZmllbGQqIHRmaWVsZCk7Ci0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9maWVsZF9kZWZhdWx0X3ZhbHVlKHRfZmllbGQqIHRmaWVsZCk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKTsKLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgYm9vbCBpbnRlcmZhY2UgPSBmYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBwcmUgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogcG9zdCA9IE5VTEwpOwotICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfdG9fc3BlY19hcmdzKHRfdHlwZSogdHR5cGUpOwotCi0gIHN0YXRpYyBib29sIGlzX3ZhbGlkX25hbWVzcGFjZShjb25zdCBzdGQ6OnN0cmluZyYgc3ViX25hbWVzcGFjZSkgewotICAgIHJldHVybiBzdWJfbmFtZXNwYWNlID09ICJ0d2lzdGVkIjsKLSAgfQotCi0gIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXRfcmVhbF9weV9tb2R1bGUoY29uc3QgdF9wcm9ncmFtKiBwcm9ncmFtLCBib29sIGdlbl90d2lzdGVkKSB7Ci0gICAgaWYgKGdlbl90d2lzdGVkKSB7Ci0gICAgICBzdGQ6OnN0cmluZyB0d2lzdGVkX21vZHVsZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoInB5LnR3aXN0ZWQiKTsKLSAgICAgIGlmICghdHdpc3RlZF9tb2R1bGUuZW1wdHkoKSkgewotICAgICAgICByZXR1cm4gdHdpc3RlZF9tb2R1bGU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgc3RkOjpzdHJpbmcgcmVhbF9tb2R1bGUgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJweSIpOwotICAgIGlmIChyZWFsX21vZHVsZS5lbXB0eSgpKSB7Ci0gICAgICByZXR1cm4gcHJvZ3JhbS0+Z2V0X25hbWUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlYWxfbW9kdWxlOwotICB9Ci0KLXByaXZhdGU6Ci0gIC8qKgotICAgKiBUcnVlIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSBuZXctc3R5bGUgY2xhc3Nlcy4KLSAgICovCi0gIGJvb2wgZ2VuX25ld3N0eWxlXzsKLQotICAvKioKLSAgKiBUcnVlIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSBkeW5hbWljIHN0eWxlIGNsYXNzZXMuCi0gICovCi0gIGJvb2wgZ2VuX2R5bmFtaWNfOwotCi0gIGJvb2wgZ2VuX2R5bmJhc2VfOwotICBzdGQ6OnN0cmluZyBnZW5fZHluYmFzZWNsYXNzXzsKLSAgc3RkOjpzdHJpbmcgZ2VuX2R5bmJhc2VjbGFzc19leGNfOwotCi0gIHN0ZDo6c3RyaW5nIGltcG9ydF9keW5iYXNlXzsKLQotICBib29sIGdlbl9zbG90c187Ci0KLSAgc3RkOjpzdHJpbmcgY29weV9vcHRpb25zXzsKLQotICAvKioKLSAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgVHdpc3RlZC1mcmllbmRseSBSUEMgc2VydmljZXMuCi0gICAqLwotICBib29sIGdlbl90d2lzdGVkXzsKLQotICAvKioKLSAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgY29kZSBmb3IgdXNlIHdpdGggVG9ybmFkbwotICAgKi8KLSAgYm9vbCBnZW5fdG9ybmFkb187Ci0KLSAgLyoqCi0gICAqIFRydWUgaWYgc3RyaW5ncyBzaG91bGQgYmUgZW5jb2RlZCB1c2luZyB1dGYtOC4KLSAgICovCi0gIGJvb2wgZ2VuX3V0ZjhzdHJpbmdzXzsKLQotICAvKioKLSAgICogc3BlY2lmeSBnZW5lcmF0ZWQgZmlsZSBlbmNvZGluZwotICAgKiBlZy4gIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KLSAgICovCi0gIHN0cmluZyBjb2RpbmdfOwotCi0gIC8qKgotICAgKiBGaWxlIHN0cmVhbXMKLSAgICovCi0KLSAgc3RkOjpvZnN0cmVhbSBmX3R5cGVzXzsKLSAgc3RkOjpvZnN0cmVhbSBmX2NvbnN0c187Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9zZXJ2aWNlXzsKLQotICBzdGQ6OnN0cmluZyBwYWNrYWdlX2Rpcl87Ci0gIHN0ZDo6c3RyaW5nIG1vZHVsZV87Ci19OwotCi0vKioKLSAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0Ci0gKiBzdHJlYW1zLgotICoKLSAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKLSAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5Ci0gIHN0cmluZyBtb2R1bGUgPSBnZXRfcmVhbF9weV9tb2R1bGUocHJvZ3JhbV8sIGdlbl90d2lzdGVkXyk7Ci0gIHBhY2thZ2VfZGlyXyA9IGdldF9vdXRfZGlyKCk7Ci0gIG1vZHVsZV8gPSBtb2R1bGU7Ci0gIHdoaWxlICh0cnVlKSB7Ci0gICAgLy8gVE9ETzogRG8gYmV0dGVyIGVycm9yIGNoZWNraW5nIGhlcmUuCi0gICAgTUtESVIocGFja2FnZV9kaXJfLmNfc3RyKCkpOwotICAgIHN0ZDo6b2ZzdHJlYW0gaW5pdF9weSgocGFja2FnZV9kaXJfICsgIi9fX2luaXRfXy5weSIpLmNfc3RyKCksIHN0ZDo6aW9zX2Jhc2U6OmFwcCk7Ci0gICAgaW5pdF9weS5jbG9zZSgpOwotICAgIGlmIChtb2R1bGUuZW1wdHkoKSkgewotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHN0cmluZzo6c2l6ZV90eXBlIHBvcyA9IG1vZHVsZS5maW5kKCcuJyk7Ci0gICAgaWYgKHBvcyA9PSBzdHJpbmc6Om5wb3MpIHsKLSAgICAgIHBhY2thZ2VfZGlyXyArPSAiLyI7Ci0gICAgICBwYWNrYWdlX2Rpcl8gKz0gbW9kdWxlOwotICAgICAgbW9kdWxlLmNsZWFyKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHBhY2thZ2VfZGlyXyArPSAiLyI7Ci0gICAgICBwYWNrYWdlX2Rpcl8gKz0gbW9kdWxlLnN1YnN0cigwLCBwb3MpOwotICAgICAgbW9kdWxlLmVyYXNlKDAsIHBvcyArIDEpOwotICAgIH0KLSAgfQotCi0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArICJ0dHlwZXMucHkiOwotICBmX3R5cGVzXy5vcGVuKGZfdHlwZXNfbmFtZS5jX3N0cigpKTsKLQotICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArICJjb25zdGFudHMucHkiOwotICBmX2NvbnN0c18ub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOwotCi0gIHN0cmluZyBmX2luaXRfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvX19pbml0X18ucHkiOwotICBvZnN0cmVhbSBmX2luaXQ7Ci0gIGZfaW5pdC5vcGVuKGZfaW5pdF9uYW1lLmNfc3RyKCkpOwotICBmX2luaXQgPDwgIl9fYWxsX18gPSBbJ3R0eXBlcycsICdjb25zdGFudHMnIjsKLSAgdmVjdG9yPHRfc2VydmljZSo+IHNlcnZpY2VzID0gcHJvZ3JhbV8tPmdldF9zZXJ2aWNlcygpOwotICB2ZWN0b3I8dF9zZXJ2aWNlKj46Oml0ZXJhdG9yIHN2X2l0ZXI7Ci0gIGZvciAoc3ZfaXRlciA9IHNlcnZpY2VzLmJlZ2luKCk7IHN2X2l0ZXIgIT0gc2VydmljZXMuZW5kKCk7ICsrc3ZfaXRlcikgewotICAgIGZfaW5pdCA8PCAiLCAnIiA8PCAoKnN2X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInIjsKLSAgfQotICBmX2luaXQgPDwgIl0iIDw8IGVuZGw7Ci0gIGZfaW5pdC5jbG9zZSgpOwotCi0gIC8vIFByaW50IGhlYWRlcgotICBmX3R5cGVzXyA8PCBweV9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8IHB5X2ltcG9ydHMoKSA8PCBlbmRsIDw8IHJlbmRlcl9pbmNsdWRlcygpIDw8IGVuZGwKLSAgICAgICAgICAgPDwgcmVuZGVyX2Zhc3RiaW5hcnlfaW5jbHVkZXMoKSA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZl9jb25zdHNfIDw8IHB5X2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwgcHlfaW1wb3J0cygpIDw8IGVuZGwgPDwgImZyb20gdHR5cGVzIGltcG9ydCAqIgotICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIFJlbmRlcnMgYWxsIHRoZSBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgaW5jbHVkaW5nIGFub3RoZXIgVGhyaWZ0IHByb2dyYW0KLSAqLwotc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjpyZW5kZXJfaW5jbHVkZXMoKSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgewotICAgIHJlc3VsdCArPSAiaW1wb3J0ICIgKyBnZXRfcmVhbF9weV9tb2R1bGUoaW5jbHVkZXNbaV0sIGdlbl90d2lzdGVkXykgKyAiLnR0eXBlc1xuIjsKLSAgfQotICBpZiAoaW5jbHVkZXMuc2l6ZSgpID4gMCkgewotICAgIHJlc3VsdCArPSAiXG4iOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhbGwgdGhlIGltcG9ydHMgbmVjZXNzYXJ5IHRvIHVzZSB0aGUgYWNjZWxlcmF0ZWQgVEJpbmFyeVByb3RvY29sCi0gKi8KLXN0cmluZyB0X3B5X2dlbmVyYXRvcjo6cmVuZGVyX2Zhc3RiaW5hcnlfaW5jbHVkZXMoKSB7Ci0gIHN0cmluZyBoZHIgPSAiIjsKLSAgaWYgKGdlbl9keW5hbWljXykgewotICAgIGhkciArPSBzdGQ6OnN0cmluZyhpbXBvcnRfZHluYmFzZV8pOwotICB9IGVsc2UgewotICAgIGhkciArPSAiZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0XG4iCi0gICAgICAgICAgICJmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sLCBUUHJvdG9jb2xcbiIKLSAgICAgICAgICAgInRyeTpcbiIKLSAgICAgICAgICAgIiAgZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IGZhc3RiaW5hcnlcbiIKLSAgICAgICAgICAgImV4Y2VwdDpcbiIKLSAgICAgICAgICAgIiAgZmFzdGJpbmFyeSA9IE5vbmVcbiI7Ci0gIH0KLSAgcmV0dXJuIGhkcjsKLX0KLQotLyoqCi0gKiBBdXRvZ2VuJ2QgY29tbWVudAotICovCi1zdHJpbmcgdF9weV9nZW5lcmF0b3I6OnB5X2F1dG9nZW5fY29tbWVudCgpIHsKLSAgc3RyaW5nIGNvZGluZzsKLSAgaWYgKCFjb2RpbmdfLmVtcHR5KCkpIHsKLSAgICAgIGNvZGluZyA9ICIjIC0qLSBjb2Rpbmc6ICIgKyBjb2RpbmdfICsgIiAtKi1cbiI7Ci0gIH0KLSAgcmV0dXJuIGNvZGluZyArIHN0ZDo6c3RyaW5nKCIjXG4iKSArICIjIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgiICsgVEhSSUZUX1ZFUlNJT04gKyAiKVxuIgotICAgICAgICAgKyAiI1xuIiArICIjIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkdcbiIgKyAiI1xuIgotICAgICAgICAgKyAiIyAgb3B0aW9ucyBzdHJpbmc6ICIgKyBjb3B5X29wdGlvbnNfICsgIlxuIiArICIjXG4iOwotfQotCi0vKioKLSAqIFByaW50cyBzdGFuZGFyZCB0aHJpZnQgaW1wb3J0cwotICovCi1zdHJpbmcgdF9weV9nZW5lcmF0b3I6OnB5X2ltcG9ydHMoKSB7Ci0gIHJldHVybiBzdHJpbmcoImZyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgVFR5cGUsIFRNZXNzYWdlVHlwZSwgVEV4Y2VwdGlvbiwgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIik7Ci19Ci0KLS8qKgotICogQ2xvc2VzIHRoZSB0eXBlIGZpbGVzCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKLSAgLy8gQ2xvc2UgdHlwZXMgZmlsZQotICBmX3R5cGVzXy5jbG9zZSgpOwotICBmX2NvbnN0c18uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBUaGlzIGlzIG5vdCBkb25lIGluIFB5dGhvbiwgdHlwZXMgYXJlIGFsbCBpbXBsaWNpdC4KLSAqCi0gKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKLSAgKHZvaWQpdHR5cGVkZWY7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4gRG9uZSB1c2luZyBhIGNsYXNzIHRvIHNjb3BlCi0gKiB0aGUgdmFsdWVzLgotICoKLSAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSB0b19zdHJpbmdfbWFwcGluZywgZnJvbV9zdHJpbmdfbWFwcGluZzsKLQotICBmX3R5cGVzXyA8PCAiY2xhc3MgIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAoZ2VuX25ld3N0eWxlXyA/ICIob2JqZWN0KSIgOiAiIikKLSAgICAgICAgICAgPDwgKGdlbl9keW5hbWljXyA/ICIoIiArIGdlbl9keW5iYXNlY2xhc3NfICsgIikiIDogIiIpIDw8ICI6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhmX3R5cGVzXywgdGVudW0pOwotCi0gIHRvX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICJfVkFMVUVTX1RPX05BTUVTID0geyIgPDwgZW5kbDsKLSAgZnJvbV9zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAiX05BTUVTX1RPX1ZBTFVFUyA9IHsiIDw8IGVuZGw7Ci0KLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOwotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgaW5kZW50KGZfdHlwZXNfKSA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgdmFsdWUgPDwgZW5kbDsKLQotICAgIC8vIERpY3Rpb25hcmllcyB0by9mcm9tIHN0cmluZyBuYW1lcyBvZiBlbnVtcwotICAgIHRvX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8IGluZGVudCgpIDw8IHZhbHVlIDw8ICI6IFwiIgotICAgICAgICAgICAgICAgICAgICAgIDw8IGVzY2FwZV9zdHJpbmcoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiXCIsIiA8PCBlbmRsOwotICAgIGZyb21fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgaW5kZW50KCkgPDwgJyInIDw8IGVzY2FwZV9zdHJpbmcoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlwiOiAiIDw8IHZhbHVlIDw8ICcsJyA8PCBlbmRsOwotICB9Ci0gIHRvX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICBmcm9tX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfdHlwZXNfIDw8IGVuZGw7Ci0gIGZfdHlwZXNfIDw8IHRvX3N0cmluZ19tYXBwaW5nLnN0cigpIDw8IGVuZGwgPDwgZnJvbV9zdHJpbmdfbWFwcGluZy5zdHIoKSA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlIGEgY29uc3RhbnQgdmFsdWUKLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7Ci0gIHRfdHlwZSogdHlwZSA9IHRjb25zdC0+Z2V0X3R5cGUoKTsKLSAgc3RyaW5nIG5hbWUgPSB0Y29uc3QtPmdldF9uYW1lKCk7Ci0gIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gdGNvbnN0LT5nZXRfdmFsdWUoKTsKLQotICBpbmRlbnQoZl9jb25zdHNfKSA8PCBuYW1lIDw8ICIgPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB2YWx1ZSk7Ci0gIGZfY29uc3RzXyA8PCBlbmRsOwotfQotCi0vKioKLSAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZwotICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKLSAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCi0gKi8KLXN0cmluZyB0X3B5X2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIG91dCA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICBvdXQgPDwgKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCA/ICJUcnVlIiA6ICJGYWxzZSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIG91dCA8PCB0eXBlX25hbWUodHlwZSkgPDwgIigqKnsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7Ci0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgewotICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgIH0KLSAgICAgIG91dCA8PCBpbmRlbnQoKTsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZ190eXBlX3N0cmluZywgdl9pdGVyLT5maXJzdCk7Ci0gICAgICBvdXQgPDwgIiA6ICI7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSkiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotICAgIG91dCA8PCAieyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCk7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKLSAgICAgIG91dCA8PCAiIDogIjsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUodnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgdF90eXBlKiBldHlwZTsKLSAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfQotICAgIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgICAgb3V0IDw8ICJzZXQoIjsKLSAgICB9Ci0gICAgb3V0IDw8ICJbIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgb3V0IDw8IGluZGVudCgpOwotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlcik7Ci0gICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIl0iOwotICAgIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgICAgb3V0IDw8ICIpIjsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBDT05TVEFOVCBGT1IgVFlQRTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLQotICByZXR1cm4gb3V0LnN0cigpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHB5dGhvbiBzdHJ1Y3QKLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGdlbmVyYXRlX3B5X3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGV4Y2VwdGlvbi4gQmFzaWNhbGx5IHRoZSBzYW1lCi0gKiBhcyBhIHN0cnVjdCBidXQgZXh0ZW5kcyB0aGUgRXhjZXB0aW9uIGNsYXNzLgotICoKLSAqIEBwYXJhbSB0eGNlcHRpb24gVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfcHlfc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgcHl0aG9uIHN0cnVjdAotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9weV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX3B5X3N0cnVjdF9kZWZpbml0aW9uKGZfdHlwZXNfLCB0c3RydWN0LCBpc19leGNlcHRpb24pOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3B5X3N0cnVjdF9kZWZpbml0aW9uKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQpIHsKLSAgKHZvaWQpaXNfcmVzdWx0OwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgc29ydGVkX21lbWJlcnMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIG91dCA8PCBzdGQ6OmVuZGwgPDwgImNsYXNzICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIGlmIChnZW5fZHluYW1pY18pIHsKLSAgICAgIG91dCA8PCAiKCIgPDwgZ2VuX2R5bmJhc2VjbGFzc19leGNfIDw8ICIpIjsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8ICIoVEV4Y2VwdGlvbikiOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBpZiAoZ2VuX25ld3N0eWxlXykgewotICAgICAgb3V0IDw8ICIob2JqZWN0KSI7Ci0gICAgfSBlbHNlIGlmIChnZW5fZHluYW1pY18pIHsKLSAgICAgIG91dCA8PCAiKCIgPDwgZ2VuX2R5bmJhc2VjbGFzc18gPDwgIikiOwotICAgIH0KLSAgfQotICBvdXQgPDwgIjoiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKG91dCwgdHN0cnVjdCk7Ci0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgLyoKLSAgICAgSGVyZSB3ZSBnZW5lcmF0ZSB0aGUgc3RydWN0dXJlIHNwZWNpZmljYXRpb24gZm9yIHRoZSBmYXN0YmluYXJ5IGNvZGVjLgotICAgICBUaGVzZSBzcGVjaWZpY2F0aW9ucyBoYXZlIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOgotICAgICB0aHJpZnRfc3BlYyAtPiB0dXBsZSBvZiBpdGVtX3NwZWMKLSAgICAgaXRlbV9zcGVjIC0+IE5vbmUgfCAodGFnLCB0eXBlX2VudW0sIG5hbWUsIHNwZWNfYXJncywgZGVmYXVsdCkKLSAgICAgdGFnIC0+IGludGVnZXIKLSAgICAgdHlwZV9lbnVtIC0+IFRUeXBlLkkzMiB8IFRUeXBlLlNUUklORyB8IFRUeXBlLlNUUlVDVCB8IC4uLgotICAgICBuYW1lIC0+IHN0cmluZ19saXRlcmFsCi0gICAgIGRlZmF1bHQgLT4gTm9uZSAgIyBIYW5kbGVkIGJ5IF9faW5pdF9fCi0gICAgIHNwZWNfYXJncyAtPiBOb25lICAjIEZvciBzaW1wbGUgdHlwZXMKLSAgICAgICAgICAgICAgICB8ICh0eXBlX2VudW0sIHNwZWNfYXJncykgICMgVmFsdWUgdHlwZSBmb3IgbGlzdC9zZXQKLSAgICAgICAgICAgICAgICB8ICh0eXBlX2VudW0sIHNwZWNfYXJncywgdHlwZV9lbnVtLCBzcGVjX2FyZ3MpCi0gICAgICAgICAgICAgICAgICAjIEtleSBhbmQgdmFsdWUgZm9yIG1hcAotICAgICAgICAgICAgICAgIHwgKGNsYXNzX25hbWUsIHNwZWNfYXJnc19wdHIpICMgRm9yIHN0cnVjdC9leGNlcHRpb24KLSAgICAgY2xhc3NfbmFtZSAtPiBpZGVudGlmaWVyICAjIEJhc2ljYWxseSBhIHBvaW50ZXIgdG8gdGhlIGNsYXNzCi0gICAgIHNwZWNfYXJnc19wdHIgLT4gZXhwcmVzc2lvbiAgIyBqdXN0IGNsYXNzX25hbWUuc3BlY19hcmdzCi0KLSAgICAgVE9ETyhkcmVpc3MpOiBDb25zaWRlciBtYWtpbmcgdGhpcyB3b3JrIGZvciBzdHJ1Y3RzIHdpdGggbmVnYXRpdmUgdGFncy4KLSAgKi8KLQotICBpZiAoZ2VuX3Nsb3RzXykgewotICAgIGluZGVudChvdXQpIDw8ICJfX3Nsb3RzX18gPSBbICIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmb3IgKG1faXRlciA9IHNvcnRlZF9tZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBzb3J0ZWRfbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICInIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIicsIiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICIgXSIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0KLSAgLy8gVE9ETyhkcmVpc3MpOiBMb29rIGludG8gZ2VuZXJhdGluZyBhbiBlbXB0eSB0dXBsZSBpbnN0ZWFkIG9mIE5vbmUKLSAgLy8gZm9yIHN0cnVjdHVyZXMgd2l0aCBubyBtZW1iZXJzLgotICAvLyBUT0RPKGRyZWlzcyk6IFRlc3QgZW5jb2Rpbmcgb2Ygc3RydWN0cyB3aGVyZSBzb21lIGlubmVyIHN0cnVjdHMKLSAgLy8gZG9uJ3QgaGF2ZSB0aHJpZnRfc3BlYy4KLSAgaWYgKHNvcnRlZF9tZW1iZXJzLmVtcHR5KCkgfHwgKHNvcnRlZF9tZW1iZXJzWzBdLT5nZXRfa2V5KCkgPj0gMCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAidGhyaWZ0X3NwZWMgPSAoIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgaW50IHNvcnRlZF9rZXlzX3BvcyA9IDA7Ci0gICAgZm9yIChtX2l0ZXIgPSBzb3J0ZWRfbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gc29ydGVkX21lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0KLSAgICAgIGZvciAoOyBzb3J0ZWRfa2V5c19wb3MgIT0gKCptX2l0ZXIpLT5nZXRfa2V5KCk7IHNvcnRlZF9rZXlzX3BvcysrKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJOb25lLCAjICIgPDwgc29ydGVkX2tleXNfcG9zIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIGluZGVudChvdXQpIDw8ICIoIiA8PCAoKm1faXRlciktPmdldF9rZXkoKSA8PCAiLCAiIDw8IHR5cGVfdG9fZW51bSgoKm1faXRlciktPmdldF90eXBlKCkpCi0gICAgICAgICAgICAgICAgICA8PCAiLCAiCi0gICAgICAgICAgICAgICAgICA8PCAiJyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInIgotICAgICAgICAgICAgICAgICAgPDwgIiwgIiA8PCB0eXBlX3RvX3NwZWNfYXJncygoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICIsICIKLSAgICAgICAgICAgICAgICAgIDw8IHJlbmRlcl9maWVsZF9kZWZhdWx0X3ZhbHVlKCptX2l0ZXIpIDw8ICIsICIKLSAgICAgICAgICAgICAgICAgIDw8ICIpLCIKLSAgICAgICAgICAgICAgICAgIDw8ICIgIyAiIDw8IHNvcnRlZF9rZXlzX3BvcyA8PCBlbmRsOwotCi0gICAgICBzb3J0ZWRfa2V5c19wb3MrKzsKLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICIpIiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInRocmlmdF9zcGVjID0gTm9uZSIgPDwgZW5kbDsKLSAgfQotCi0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImRlZiBfX2luaXRfXyhzZWxmLCI7Ci0KLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICAvLyBUaGlzIGZpbGxzIGluIGRlZmF1bHQgdmFsdWVzLCBhcyBvcHBvc2VkIHRvIG51bGxzCi0gICAgICBvdXQgPDwgIiAiIDw8IGRlY2xhcmVfYXJndW1lbnQoKm1faXRlcikgPDwgIiwiOwotICAgIH0KLQotICAgIG91dCA8PCAiKToiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIC8vIEluaXRpYWxpemUgZmllbGRzCi0gICAgICB0X3R5cGUqIHR5cGUgPSAoKm1faXRlciktPmdldF90eXBlKCk7Ci0gICAgICBpZiAoIXR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICF0eXBlLT5pc19lbnVtKCkgJiYgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGlzICIKLSAgICAgICAgICAgICAgICAgICAgPDwgInNlbGYudGhyaWZ0X3NwZWNbIiA8PCAoKm1faXRlciktPmdldF9rZXkoKSA8PCAiXVs0XToiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICIgICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8IHJlbmRlcl9maWVsZF9kZWZhdWx0X3ZhbHVlKCptX2l0ZXIpCi0gICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBpbmRlbnQob3V0KSA8PCAic2VsZi4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotCi0gICAgb3V0IDw8IGVuZGw7Ci0gIH0KLQotICBpZiAoIWdlbl9keW5hbWljXykgewotICAgIGdlbmVyYXRlX3B5X3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKLSAgICBnZW5lcmF0ZV9weV9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7Ci0gIH0KLQotICAvLyBGb3IgZXhjZXB0aW9ucyBvbmx5LCBnZW5lcmF0ZSBhIF9fc3RyX18gbWV0aG9kLiBUaGlzIGlzCi0gIC8vIGJlY2F1c2Ugd2hlbiByYWlzZWQgZXhjZXB0aW9ucyBhcmUgcHJpbnRlZCB0byB0aGUgY29uc29sZSwgX19yZXByX18KLSAgLy8gaXNuJ3QgdXNlZC4gU2VlIHB5dGhvbiBidWcgIzU4ODIKLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmIF9fc3RyX18oc2VsZik6IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiByZXByKHNlbGYpIiA8PCBlbmRsCi0gICAgICAgIDw8IGVuZGw7Ci0gIH0KLQotICBvdXQgPDwgaW5kZW50KCkgPDwgImRlZiBfX2hhc2hfXyhzZWxmKToiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAidmFsdWUgPSAxNyIgPDwgZW5kbDsgLy8gUFlUSE9OSEFTSFNFRUQgd291bGQgYmUgYmV0dGVyLCBidXQgcmVxdWlyZXMgUHl0aG9uIDMuMi4zCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAidmFsdWUgPSAodmFsdWUgKiAzMSkgXiBoYXNoKHNlbGYuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgKyAiKSIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHZhbHVlIiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwgZW5kbDsKLQotICBpZiAoIWdlbl9zbG90c18pIHsKLSAgICAvLyBQcmludGluZyB1dGlsaXRpZXMgc28gdGhhdCBvbiB0aGUgY29tbWFuZCBsaW5lIHRocmlmdAotICAgIC8vIHN0cnVjdHMgbG9vayBwcmV0dHkgbGlrZSBkaWN0aW9uYXJpZXMKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImRlZiBfX3JlcHJfXyhzZWxmKToiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgTCA9IFsnJXM9JXInICUgKGtleSwgdmFsdWUpIgotICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgICAgZm9yIGtleSwgdmFsdWUgaW4gc2VsZi5fX2RpY3RfXy5pdGVyaXRlbXMoKV0iIDw8IGVuZGwKLSAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICclcyglcyknICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCAnLCAnLmpvaW4oTCkpIiA8PCBlbmRsCi0gICAgICAgIDw8IGVuZGw7Ci0KLSAgICAvLyBFcXVhbGl0eSBhbmQgaW5lcXVhbGl0eSBtZXRob2RzIHRoYXQgY29tcGFyZSBieSB2YWx1ZQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKSBhbmQgIgotICAgICAgICAgICAgICAgICAgICAgICAic2VsZi5fX2RpY3RfXyA9PSBvdGhlci5fX2RpY3RfXyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIG91dCA8PCBlbmRsOwotCi0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJkZWYgX19uZV9fKHNlbGYsIG90aGVyKToiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBub3QgKHNlbGYgPT0gb3RoZXIpIiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0gZWxzZSBpZiAoIWdlbl9keW5hbWljXykgewotICAgIC8vIG5vIGJhc2UgY2xhc3MgYXZhaWxhYmxlIHRvIGltcGxlbWVudCBfX2VxX18gYW5kIF9fcmVwcl9fIGFuZCBfX25lX18gZm9yIHVzCi0gICAgLy8gc28gd2UgbXVzdCBwcm92aWRlIG9uZSB0aGF0IHVzZXMgX19zbG90c19fCi0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJkZWYgX19yZXByX18oc2VsZik6IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgIDw8ICIgIEwgPSBbJyVzPSVyJyAlIChrZXksIGdldGF0dHIoc2VsZiwga2V5KSkiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgPDwgIiAgICBmb3Iga2V5IGluIHNlbGYuX19zbG90c19fXSIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICA8PCAiICByZXR1cm4gJyVzKCVzKScgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sICcsICcuam9pbihMKSkiIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIC8vIEVxdWFsaXR5IG1ldGhvZCB0aGF0IGNvbXBhcmVzIGVhY2ggYXR0cmlidXRlIGJ5IHZhbHVlIGFuZCB0eXBlLCB3YWxraW5nIF9fc2xvdHNfXwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgIDw8ICIgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXyk6IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgICAgcmV0dXJuIEZhbHNlIgotICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIGZvciBhdHRyIGluIHNlbGYuX19zbG90c19fOiIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICA8PCAiICAgIG15X3ZhbCA9IGdldGF0dHIoc2VsZiwgYXR0cikiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgPDwgIiAgICBvdGhlcl92YWwgPSBnZXRhdHRyKG90aGVyLCBhdHRyKSIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICA8PCAiICAgIGlmIG15X3ZhbCAhPSBvdGhlcl92YWw6IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgICAgICByZXR1cm4gRmFsc2UiIDw8IGVuZGwKLSAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIFRydWUiIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgIDw8ICIgIHJldHVybiBub3QgKHNlbGYgPT0gb3RoZXIpIiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgdGhlIHJlYWQgbWV0aG9kIGZvciBhIHN0cnVjdAotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9weV9zdHJ1Y3RfcmVhZGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBpbmRlbnQob3V0KSA8PCAiZGVmIHJlYWQoc2VsZiwgaXByb3QpOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgImlmIGlwcm90Ll9fY2xhc3NfXyA9PSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgIgotICAgICAgICAgICAgICAgICAiYW5kIGlzaW5zdGFuY2UoaXByb3QudHJhbnMsIFRUcmFuc3BvcnQuQ1JlYWRhYmxlVHJhbnNwb3J0KSAiCi0gICAgICAgICAgICAgICAgICJhbmQgc2VsZi50aHJpZnRfc3BlYyBpcyBub3QgTm9uZSAiCi0gICAgICAgICAgICAgICAgICJhbmQgZmFzdGJpbmFyeSBpcyBub3QgTm9uZToiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChvdXQpIDw8ICJmYXN0YmluYXJ5LmRlY29kZV9iaW5hcnkoc2VsZiwgaXByb3QudHJhbnMsIChzZWxmLl9fY2xhc3NfXywgc2VsZi50aHJpZnRfc3BlYykpIgotICAgICAgICAgICAgICA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotCi0gIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkU3RydWN0QmVnaW4oKSIgPDwgZW5kbDsKLQotICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKLSAgaW5kZW50KG91dCkgPDwgIndoaWxlIFRydWU6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICAvLyBSZWFkIGJlZ2lubmluZyBmaWVsZCBtYXJrZXIKLSAgaW5kZW50KG91dCkgPDwgIihmbmFtZSwgZnR5cGUsIGZpZCkgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpIiA8PCBlbmRsOwotCi0gIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKLSAgaW5kZW50KG91dCkgPDwgImlmIGZ0eXBlID09IFRUeXBlLlNUT1A6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgImJyZWFrIiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotCi0gIC8vIFN3aXRjaCBzdGF0ZW1lbnQgb24gdGhlIGZpZWxkIHdlIGFyZSByZWFkaW5nCi0gIGJvb2wgZmlyc3QgPSB0cnVlOwotCi0gIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgIjsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJlbGlmICI7Ci0gICAgfQotICAgIG91dCA8PCAiZmlkID09ICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjoiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgImlmIGZ0eXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjoiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAic2VsZi4iKTsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZWxzZToiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgaXByb3Quc2tpcChmdHlwZSkiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotCi0gIC8vIEluIHRoZSBkZWZhdWx0IGNhc2Ugd2Ugc2tpcCB0aGUgZmllbGQKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJlbHNlOiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBpcHJvdC5za2lwKGZ0eXBlKSIgPDwgZW5kbDsKLQotICAvLyBSZWFkIGZpZWxkIGVuZCBtYXJrZXIKLSAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRGaWVsZEVuZCgpIiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRTdHJ1Y3RFbmQoKSIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwgZW5kbDsKLX0KLQotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHlfc3RydWN0X3dyaXRlcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgaW5kZW50KG91dCkgPDwgImRlZiB3cml0ZShzZWxmLCBvcHJvdCk6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQob3V0KSA8PCAiaWYgb3Byb3QuX19jbGFzc19fID09IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCAiCi0gICAgICAgICAgICAgICAgICJhbmQgc2VsZi50aHJpZnRfc3BlYyBpcyBub3QgTm9uZSAiCi0gICAgICAgICAgICAgICAgICJhbmQgZmFzdGJpbmFyeSBpcyBub3QgTm9uZToiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChvdXQpCi0gICAgICA8PCAib3Byb3QudHJhbnMud3JpdGUoZmFzdGJpbmFyeS5lbmNvZGVfYmluYXJ5KHNlbGYsIChzZWxmLl9fY2xhc3NfXywgc2VsZi50aHJpZnRfc3BlYykpKSIKLSAgICAgIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJyZXR1cm4iIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlU3RydWN0QmVnaW4oJyIgPDwgbmFtZSA8PCAiJykiIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAvLyBXcml0ZSBmaWVsZCBoZWFkZXIKLSAgICBpbmRlbnQob3V0KSA8PCAiaWYgc2VsZi4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGlzIG5vdCBOb25lOiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEJlZ2luKCIKLSAgICAgICAgICAgICAgICA8PCAiJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpCi0gICAgICAgICAgICAgICAgPDwgIiwgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiKSIgPDwgZW5kbDsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCi0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInNlbGYuIik7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEVuZCgpIiA8PCBlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotCi0gIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVGaWVsZFN0b3AoKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKSIKLSAgICAgIDw8IGVuZGw7Ci0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZ2VuZXJhdGVfcHlfc3RydWN0X3JlcXVpcmVkX3ZhbGlkYXRvcihvdXQsIHRzdHJ1Y3QpOwotICBvdXQgPDwgZW5kbDsKLX0KLQotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHlfc3RydWN0X3JlcXVpcmVkX3ZhbGlkYXRvcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAiZGVmIHZhbGlkYXRlKHNlbGYpOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLQotICBpZiAoZmllbGRzLnNpemUoKSA+IDApIHsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgdF9maWVsZCogZmllbGQgPSAoKmZfaXRlcik7Ci0gICAgICBpZiAoZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJpZiBzZWxmLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiBpcyBOb25lOiIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmFpc2UgVFByb3RvY29sLlRQcm90b2NvbEV4Y2VwdGlvbihtZXNzYWdlPSdSZXF1aXJlZCBmaWVsZCAiCi0gICAgICAgICAgICAgICAgICAgIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgaXMgdW5zZXQhJykiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwgInJldHVybiIgPDwgZW5kbCA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBzZXJ2aWNlX25hbWVfICsgIi5weSI7Ci0gIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKLQotICBmX3NlcnZpY2VfIDw8IHB5X2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwgcHlfaW1wb3J0cygpIDw8IGVuZGw7Ci0KLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBmX3NlcnZpY2VfIDw8ICJpbXBvcnQgIgotICAgICAgICAgICAgICAgPDwgZ2V0X3JlYWxfcHlfbW9kdWxlKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfcHJvZ3JhbSgpLCBnZW5fdHdpc3RlZF8pIDw8ICIuIgotICAgICAgICAgICAgICAgPDwgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgPDwgZW5kbDsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwgImltcG9ydCBsb2dnaW5nIiA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgImZyb20gdHR5cGVzIGltcG9ydCAqIiA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgImZyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgVFByb2Nlc3NvciIgPDwgZW5kbAotICAgICAgICAgICAgIDw8IHJlbmRlcl9mYXN0YmluYXJ5X2luY2x1ZGVzKCkgPDwgZW5kbDsKLQotICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAiZnJvbSB6b3BlLmludGVyZmFjZSBpbXBvcnQgSW50ZXJmYWNlLCBpbXBsZW1lbnRzIiA8PCBlbmRsCi0gICAgICAgICAgICAgICA8PCAiZnJvbSB0d2lzdGVkLmludGVybmV0IGltcG9ydCBkZWZlciIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgImZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFR3aXN0ZWQiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAoZ2VuX3Rvcm5hZG9fKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAiZnJvbSB0b3JuYWRvIGltcG9ydCBnZW4iIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCAiZnJvbSB0b3JuYWRvIGltcG9ydCBjb25jdXJyZW50IiA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgImZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydCIgPDwgZW5kbDsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgdGhyZWUgbWFpbiBwYXJ0cyBvZiB0aGUgc2VydmljZQotICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX3JlbW90ZSh0c2VydmljZSk7Ci0KLSAgLy8gQ2xvc2Ugc2VydmljZSBmaWxlCi0gIGZfc2VydmljZV8uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgYSBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgewotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICBmX3NlcnZpY2VfIDw8ICIjIEhFTFBFUiBGVU5DVElPTlMgQU5EIFNUUlVDVFVSRVMiIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgZ2VuZXJhdGVfcHlfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgdHMsIGZhbHNlKTsKLSAgICBnZW5lcmF0ZV9weV9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3B5X2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKLSAgICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOwotICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOwotICAgIH0KLQotICAgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKLSAgICB9Ci0gICAgZ2VuZXJhdGVfcHlfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UsIHRydWUpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19pZiA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIGV4dGVuZHNfaWYgPSAiKCIgKyBleHRlbmRzICsgIi5JZmFjZSkiOwotICB9IGVsc2UgewotICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICAgIGV4dGVuZHNfaWYgPSAiKEludGVyZmFjZSkiOwotICAgIH0gZWxzZSBpZiAoZ2VuX25ld3N0eWxlXyB8fCBnZW5fZHluYW1pY18gfHwgZ2VuX3Rvcm5hZG9fKSB7Ci0gICAgICBleHRlbmRzX2lmID0gIihvYmplY3QpIjsKLSAgICB9Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8ICJjbGFzcyBJZmFjZSIgPDwgZXh0ZW5kc19pZiA8PCAiOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIGlmIChmdW5jdGlvbnMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInBhc3MiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICAgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkZWYgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgdHJ1ZSkgPDwgIjoiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcoZl9zZXJ2aWNlXywgKCpmX2l0ZXIpKTsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInBhc3MiIDw8IGVuZGwgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgICBleHRlbmRzX2NsaWVudCA9ICIoIiArIGV4dGVuZHMgKyAiLkNsaWVudCkiOwotICAgIH0gZWxzZSB7Ci0gICAgICBleHRlbmRzX2NsaWVudCA9IGV4dGVuZHMgKyAiLkNsaWVudCwgIjsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGdlbl90d2lzdGVkXyAmJiAoZ2VuX25ld3N0eWxlXyB8fCBnZW5fZHluYW1pY18pKSB7Ci0gICAgICBleHRlbmRzX2NsaWVudCA9ICIob2JqZWN0KSI7Ci0gICAgfQotICB9Ci0KLSAgaWYgKGdlbl90d2lzdGVkXykgewotICAgIGZfc2VydmljZV8gPDwgImNsYXNzIENsaWVudCIgPDwgZXh0ZW5kc19jbGllbnQgPDwgIjoiIDw8IGVuZGwgPDwgIiAgaW1wbGVtZW50cyhJZmFjZSkiIDw8IGVuZGwKLSAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAiY2xhc3MgQ2xpZW50KCIgPDwgZXh0ZW5kc19jbGllbnQgPDwgIklmYWNlKToiIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X3VwKCk7Ci0gIGdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOwotCi0gIC8vIENvbnN0cnVjdG9yIGZ1bmN0aW9uCi0gIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkZWYgX19pbml0X18oc2VsZiwgdHJhbnNwb3J0LCBvcHJvdF9mYWN0b3J5KToiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAoZ2VuX3Rvcm5hZG9fKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgPDwgImRlZiBfX2luaXRfXyhzZWxmLCB0cmFuc3BvcnQsIGlwcm90X2ZhY3RvcnksIG9wcm90X2ZhY3Rvcnk9Tm9uZSk6IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImRlZiBfX2luaXRfXyhzZWxmLCBpcHJvdCwgb3Byb3Q9Tm9uZSk6IiA8PCBlbmRsOwotICB9Ci0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIHNlbGYuX3RyYW5zcG9ydCA9IHRyYW5zcG9ydCIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgICA8PCAiICBzZWxmLl9vcHJvdF9mYWN0b3J5ID0gb3Byb3RfZmFjdG9yeSIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgICA8PCAiICBzZWxmLl9zZXFpZCA9IDAiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgc2VsZi5fcmVxcyA9IHt9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmIChnZW5fdG9ybmFkb18pIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgc2VsZi5fdHJhbnNwb3J0ID0gdHJhbnNwb3J0IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgIDw8ICIgIHNlbGYuX2lwcm90X2ZhY3RvcnkgPSBpcHJvdF9mYWN0b3J5IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgIDw8ICIgIHNlbGYuX29wcm90X2ZhY3RvcnkgPSAob3Byb3RfZmFjdG9yeSBpZiBvcHJvdF9mYWN0b3J5IGlzIG5vdCBOb25lIiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpcHJvdF9mYWN0b3J5KSIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgICA8PCAiICBzZWxmLl9zZXFpZCA9IDAiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgc2VsZi5fcmVxcyA9IHt9IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHNlbGYuX3RyYW5zcG9ydC5pb19sb29wLnNwYXduX2NhbGxiYWNrKHNlbGYuX3N0YXJ0X3JlY2VpdmluZykiCi0gICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICBzZWxmLl9pcHJvdCA9IHNlbGYuX29wcm90ID0gaXByb3QiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICAgPDwgIiAgaWYgb3Byb3QgaXMgbm90IE5vbmU6IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgICAgc2VsZi5fb3Byb3QgPSBvcHJvdCIKLSAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBzZWxmLl9zZXFpZCA9IDAiIDw8IGVuZGwgPDwgZW5kbDsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGdlbl90d2lzdGVkXykgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICAiIDw8IGV4dGVuZHMKLSAgICAgICAgICAgICAgICAgPDwgIi5DbGllbnQuX19pbml0X18oc2VsZiwgdHJhbnNwb3J0LCBvcHJvdF9mYWN0b3J5KSIgPDwgZW5kbCA8PCBlbmRsOwotICAgIH0gZWxzZSBpZiAoZ2VuX3Rvcm5hZG9fKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgICIgPDwgZXh0ZW5kcwotICAgICAgICAgICAgICAgICA8PCAiLkNsaWVudC5fX2luaXRfXyhzZWxmLCB0cmFuc3BvcnQsIGlwcm90X2ZhY3RvcnksIG9wcm90X2ZhY3RvcnkpIiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgIiA8PCBleHRlbmRzIDw8ICIuQ2xpZW50Ll9faW5pdF9fKHNlbGYsIGlwcm90LCBvcHJvdCkiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBpZiAoZ2VuX3Rvcm5hZG9fICYmIGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIkBnZW4uZW5naW5lIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICA8PCAiZGVmIF9zdGFydF9yZWNlaXZpbmcoc2VsZik6IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHdoaWxlIFRydWU6IiA8PCBlbmRsCi0gICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAgIHRyeToiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgIDw8ICIgICAgICBmcmFtZSA9IHlpZWxkIHNlbGYuX3RyYW5zcG9ydC5yZWFkRnJhbWUoKSIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgPDwgIiAgICBleGNlcHQgVFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uIGFzIGU6IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICA8PCAiICAgICAgZm9yIGZ1dHVyZSBpbiBzZWxmLl9yZXFzLml0ZXJ2YWx1ZXMoKToiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgIDw8ICIgICAgICAgIGZ1dHVyZS5zZXRfZXhjZXB0aW9uKGUpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgICAgICBzZWxmLl9yZXFzID0ge30iCi0gICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgICAgICByZXR1cm4iIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgIDw8ICIgICAgdHIgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoZnJhbWUpIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICA8PCAiICAgIGlwcm90ID0gc2VsZi5faXByb3RfZmFjdG9yeS5nZXRQcm90b2NvbCh0cikiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgIDw8ICIgICAgKGZuYW1lLCBtdHlwZSwgcnNlcWlkKSA9IGlwcm90LnJlYWRNZXNzYWdlQmVnaW4oKSIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgPDwgIiAgICBmdXR1cmUgPSBzZWxmLl9yZXFzLnBvcChyc2VxaWQsIE5vbmUpIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICA8PCAiICAgIGlmIG5vdCBmdXR1cmU6IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICA8PCAiICAgICAgIyBmdXR1cmUgaGFzIGFscmVhZHkgYmVlbiBkaXNjYXJkZWQiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgIDw8ICIgICAgICBjb250aW51ZSIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgPDwgIiAgICBtZXRob2QgPSBnZXRhdHRyKHNlbGYsICdyZWN2XycgKyBmbmFtZSkiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgIDw8ICIgICAgdHJ5OiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICAgICAgcmVzdWx0ID0gbWV0aG9kKGlwcm90LCBtdHlwZSwgcnNlcWlkKSIKLSAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICA8PCAiICAgICAgZnV0dXJlLnNldF9leGNlcHRpb24oZSkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgICBlbHNlOiIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgICAgIGZ1dHVyZS5zZXRfcmVzdWx0KHJlc3VsdCkiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7Ci0gICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0KLSAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJkZWYgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgZmFsc2UpIDw8ICI6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcoZl9zZXJ2aWNlXywgKCpmX2l0ZXIpKTsKLSAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInNlcWlkID0gc2VsZi5fc2VxaWQgPSBzZWxmLl9zZXFpZCArIDEiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInNlbGYuX3JlcXNbc2VxaWRdID0gZGVmZXIuRGVmZXJyZWQoKSIgPDwgZW5kbCA8PCBlbmRsOwotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJkID0gZGVmZXIubWF5YmVEZWZlcnJlZChzZWxmLnNlbmRfIiA8PCBmdW5uYW1lOwotCi0gICAgfSBlbHNlIGlmIChnZW5fdG9ybmFkb18pIHsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAic2VsZi5fc2VxaWQgKz0gMSIgPDwgZW5kbDsKLSAgICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImZ1dHVyZSA9IHNlbGYuX3JlcXNbc2VsZi5fc2VxaWRdID0gY29uY3VycmVudC5GdXR1cmUoKSIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAic2VsZi5zZW5kXyIgPDwgZnVubmFtZSA8PCAiKCI7Ci0KLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJzZWxmLnNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIjsKLSAgICB9Ci0KLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgICAvLyB3ZSBuZWVkIGEgbGVhZGluZyBjb21tYSBpZiB0aGVyZSBhcmUgYXJncywgc2luY2UgaXQncyBjYWxsZWQgYXMgbWF5YmVEZWZlcnJlZChmdW5jbmFtZSwKLSAgICAgIC8vIGFyZykKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfQotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgfQotCi0gICAgZl9zZXJ2aWNlXyA8PCAiKSIgPDwgZW5kbDsKLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgaWYgKGdlbl90d2lzdGVkXykgewotICAgICAgICAvLyBub3RoaW5nLiBTZWUgdGhlIG5leHQgYmxvY2suCi0gICAgICB9IGVsc2UgaWYgKGdlbl90b3JuYWRvXykgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiBmdXR1cmUiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgICAgZl9zZXJ2aWNlXyA8PCAicmV0dXJuICI7Ci0gICAgICAgIH0KLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAic2VsZi5yZWN2XyIgPDwgZnVubmFtZSA8PCAiKCkiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgICAvLyBUaGlzIGJsb2NrIGluamVjdHMgdGhlIGJvZHkgb2YgdGhlIHNlbmRfPD4gbWV0aG9kIGZvciB0d2lzdGVkIChhbmQgYSBjYi9lYiBwYWlyKQotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImQuYWRkQ2FsbGJhY2tzKCIgPDwgZW5kbDsKLQotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJjYWxsYmFjaz1zZWxmLmNiX3NlbmRfIiA8PCBmdW5uYW1lIDw8ICIsIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgIDw8ICJjYWxsYmFja0FyZ3M9KHNlcWlkLCksIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJlcnJiYWNrPXNlbGYuZWJfc2VuZF8iCi0gICAgICAgICAgICAgICAgIDw8IGZ1bm5hbWUgPDwgIiwiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImVycmJhY2tBcmdzPShzZXFpZCwpKSIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIGQiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImRlZiBjYl9zZW5kXyIgPDwgZnVubmFtZSA8PCAiKHNlbGYsIF8sIHNlcWlkKToiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGlmICgoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICAgIC8vIGlmIG9uZS13YXksIGZpcmUgdGhlIGRlZmVycmVkICYgcmVtb3ZlIGl0IGZyb20gX3JlcXMKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZCA9IHNlbGYuX3JlcXMucG9wKHNlcWlkKSIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgICAgIDw8ICJkLmNhbGxiYWNrKE5vbmUpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gZCIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiBzZWxmLl9yZXFzW3NlcWlkXSIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgICAgIC8vIGFkZCBhbiBlcnJiYWNrIHRvIGZhaWwgdGhlIHJlcXVlc3QgaWYgdGhlIGNhbGwgdG8gc2VuZF88PiByYWlzZWQgYW4gZXhjZXB0aW9uCi0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImRlZiBlYl9zZW5kXyIgPDwgZnVubmFtZSA8PCAiKHNlbGYsIGYsIHNlcWlkKToiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImQgPSBzZWxmLl9yZXFzLnBvcChzZXFpZCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImQuZXJyYmFjayhmKSIKLSAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGQiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgIH0KLQotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImRlZiBzZW5kXyIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsIGZhbHNlKSA8PCAiOiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIHN0ZDo6c3RyaW5nIGFyZ3NuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKLSAgICBzdGQ6OnN0cmluZyBtZXNzYWdlVHlwZSA9ICgqZl9pdGVyKS0+aXNfb25ld2F5KCkgPyAiVE1lc3NhZ2VUeXBlLk9ORVdBWSIgOiAiVE1lc3NhZ2VUeXBlLkNBTEwiOwotCi0gICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0IGhlYWRlcgotICAgIGlmIChnZW5fdHdpc3RlZF8gfHwgZ2VuX3Rvcm5hZG9fKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdCA9IHNlbGYuX29wcm90X2ZhY3RvcnkuZ2V0UHJvdG9jb2woc2VsZi5fdHJhbnNwb3J0KSIgPDwgZW5kbAotICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4oJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCAiCi0gICAgICAgICAgICAgICAgIDw8IG1lc3NhZ2VUeXBlIDw8ICIsIHNlbGYuX3NlcWlkKSIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAic2VsZi5fb3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4oJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCAiCi0gICAgICAgICAgICAgICAgIDw8IG1lc3NhZ2VUeXBlIDw8ICIsIHNlbGYuX3NlcWlkKSIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzID0gIiA8PCBhcmdzbmFtZSA8PCAiKCkiIDw8IGVuZGw7Ci0KLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncy4iIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiCi0gICAgICAgICAgICAgICAgIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gV3JpdGUgdG8gdGhlIHN0cmVhbQotICAgIGlmIChnZW5fdHdpc3RlZF8gfHwgZ2VuX3Rvcm5hZG9fKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzLndyaXRlKG9wcm90KSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlRW5kKCkiCi0gICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LnRyYW5zLmZsdXNoKCkiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3Mud3JpdGUoc2VsZi5fb3Byb3QpIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgIDw8ICJzZWxmLl9vcHJvdC53cml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgICA8PCAic2VsZi5fb3Byb3QudHJhbnMuZmx1c2goKSIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBzdGQ6OnN0cmluZyByZXN1bHRuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOwotICAgICAgLy8gT3BlbiBmdW5jdGlvbgotICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotICAgICAgaWYgKGdlbl90d2lzdGVkXyB8fCBnZW5fdG9ybmFkb18pIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZGVmIHJlY3ZfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgICA8PCAiKHNlbGYsIGlwcm90LCBtdHlwZSwgcnNlcWlkKToiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOwotICAgICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vYXJncyk7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImRlZiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbikgPDwgIjoiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBpbmRlbnRfdXAoKTsKLQotICAgICAgLy8gVE9ETyhtY3NsZWUpOiBWYWxpZGF0ZSBtZXNzYWdlIHJlcGx5IGhlcmUsIHNlcSBpZHMgZXRjLgotCi0gICAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImQgPSBzZWxmLl9yZXFzLnBvcChyc2VxaWQpIiA8PCBlbmRsOwotICAgICAgfSBlbHNlIGlmIChnZW5fdG9ybmFkb18pIHsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlwcm90ID0gc2VsZi5faXByb3QiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICAgICA8PCAiKGZuYW1lLCBtdHlwZSwgcnNlcWlkKSA9IGlwcm90LnJlYWRNZXNzYWdlQmVnaW4oKSIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgbXR5cGUgPT0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTjoiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICAgPDwgIiAgeCA9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbigpIiA8PCBlbmRsOwotCi0gICAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgeC5yZWFkKGlwcm90KSIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgICAgIDw8ICIgIGlwcm90LnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGQuZXJyYmFjayh4KSIKLSAgICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXN1bHQgPSAiIDw8IHJlc3VsdG5hbWUgPDwgIigpIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgICAgPDwgInJlc3VsdC5yZWFkKGlwcm90KSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaXByb3QucmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgeC5yZWFkKGlwcm90KSIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgICAgIDw8ICIgIGlwcm90LnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmFpc2UgeCIgPDwgZW5kbAotICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXN1bHQgPSAiIDw8IHJlc3VsdG5hbWUgPDwgIigpIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgICAgPDwgInJlc3VsdC5yZWFkKGlwcm90KSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaXByb3QucmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIHJlc3VsdC5zdWNjZXNzIGlzIG5vdCBOb25lOiIgPDwgZW5kbDsKLSAgICAgICAgaWYgKGdlbl90d2lzdGVkXykgewotICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGQuY2FsbGJhY2socmVzdWx0LnN1Y2Nlc3MpIiA8PCBlbmRsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHJlc3VsdC5zdWNjZXNzIiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOwotICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGlzIG5vdCBOb25lOiIgPDwgZW5kbDsKLSAgICAgICAgaWYgKGdlbl90d2lzdGVkXykgewotICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGQuZXJyYmFjayhyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIikiCi0gICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgcmFpc2UgcmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIiIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgaWYgKGdlbl90d2lzdGVkXykgewotICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiBkLmNhbGxiYWNrKE5vbmUpIiA8PCBlbmRsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGdlbl90d2lzdGVkXykgewotICAgICAgICAgIGZfc2VydmljZV8KLSAgICAgICAgICAgICAgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgPDwgInJldHVybiBkLmVycmJhY2soVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5NSVNTSU5HX1JFU1VMVCwgXCIiCi0gICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIikpIiA8PCBlbmRsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICAgICAgIDw8ICJyYWlzZSBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLk1JU1NJTkdfUkVTVUxULCBcIiIKLSAgICAgICAgICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIikiIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGNvbW1hbmQgbGluZSB0b29sIGZvciBtYWtpbmcgcmVtb3RlIHJlcXVlc3RzCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgcmVtb3RlIGZvci4KLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9yZW1vdGUodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIC8vIEdldCBhbGwgZnVuY3Rpb24gZnJvbSBwYXJlbnRzCi0gIHRfc2VydmljZSogcGFyZW50ID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7Ci0gIHdoaWxlIChwYXJlbnQgIT0gTlVMTCkgewotICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gcF9mdW5jdGlvbnMgPSBwYXJlbnQtPmdldF9mdW5jdGlvbnMoKTsKLSAgICBmdW5jdGlvbnMuaW5zZXJ0KGZ1bmN0aW9ucy5lbmQoKSwgcF9mdW5jdGlvbnMuYmVnaW4oKSwgcF9mdW5jdGlvbnMuZW5kKCkpOwotICAgIHBhcmVudCA9IHBhcmVudC0+Z2V0X2V4dGVuZHMoKTsKLSAgfQotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgc3RyaW5nIGZfcmVtb3RlX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBzZXJ2aWNlX25hbWVfICsgIi1yZW1vdGUiOwotICBvZnN0cmVhbSBmX3JlbW90ZTsKLSAgZl9yZW1vdGUub3BlbihmX3JlbW90ZV9uYW1lLmNfc3RyKCkpOwotCi0gIGZfcmVtb3RlIDw8ICIjIS91c3IvYmluL2VudiBweXRob24iIDw8IGVuZGwgPDwgcHlfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PCAiaW1wb3J0IHN5cyIKLSAgICAgICAgICAgPDwgZW5kbCA8PCAiaW1wb3J0IHBwcmludCIgPDwgZW5kbCA8PCAiZnJvbSB1cmxwYXJzZSBpbXBvcnQgdXJscGFyc2UiIDw8IGVuZGwKLSAgICAgICAgICAgPDwgImZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydCIgPDwgZW5kbAotICAgICAgICAgICA8PCAiZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUU29ja2V0IiA8PCBlbmRsCi0gICAgICAgICAgIDw8ICJmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRTU0xTb2NrZXQiIDw8IGVuZGwKLSAgICAgICAgICAgPDwgImZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVEh0dHBDbGllbnQiIDw8IGVuZGwKLSAgICAgICAgICAgPDwgImZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBmX3JlbW90ZSA8PCAiZnJvbSAiIDw8IG1vZHVsZV8gPDwgIiBpbXBvcnQgIiA8PCBzZXJ2aWNlX25hbWVfIDw8IGVuZGwgPDwgImZyb20gIiA8PCBtb2R1bGVfCi0gICAgICAgICAgIDw8ICIudHR5cGVzIGltcG9ydCAqIiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZl9yZW1vdGUgPDwgImlmIGxlbihzeXMuYXJndikgPD0gMSBvciBzeXMuYXJndlsxXSA9PSAnLS1oZWxwJzoiIDw8IGVuZGwgPDwgIiAgcHJpbnQoJycpIiA8PCBlbmRsCi0gICAgICAgICAgIDw8ICIgIHByaW50KCdVc2FnZTogJyArIHN5cy5hcmd2WzBdICsgJyBbLWggaG9zdFs6cG9ydF1dIFstdSB1cmxdIFstZltyYW1lZF1dIFstc1tzbF1dICIKLSAgICAgICAgICAgICAgImZ1bmN0aW9uIFthcmcxIFthcmcyLi4uXV0nKSIgPDwgZW5kbCA8PCAiICBwcmludCgnJykiIDw8IGVuZGwKLSAgICAgICAgICAgPDwgIiAgcHJpbnQoJ0Z1bmN0aW9uczonKSIgPDwgZW5kbDsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBmX3JlbW90ZSA8PCAiICBwcmludCgnICAiIDw8ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+Z2V0X25hbWUoKSA8PCAiICIKLSAgICAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIigiOwotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgYXJncyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgYV9pdGVyOwotICAgIHN0ZDo6dmVjdG9yPHRfZmllbGQqPjo6c2l6ZV90eXBlIG51bV9hcmdzID0gYXJncy5zaXplKCk7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yIChzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj46OnNpemVfdHlwZSBpID0gMDsgaSA8IG51bV9hcmdzOyArK2kpIHsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9yZW1vdGUgPDwgIiwgIjsKLSAgICAgIH0KLSAgICAgIGZfcmVtb3RlIDw8IGFyZ3NbaV0tPmdldF90eXBlKCktPmdldF9uYW1lKCkgPDwgIiAiIDw8IGFyZ3NbaV0tPmdldF9uYW1lKCk7Ci0gICAgfQotICAgIGZfcmVtb3RlIDw8ICIpJykiIDw8IGVuZGw7Ci0gIH0KLSAgZl9yZW1vdGUgPDwgIiAgcHJpbnQoJycpIiA8PCBlbmRsIDw8ICIgIHN5cy5leGl0KDApIiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZl9yZW1vdGUgPDwgInBwID0gcHByaW50LlByZXR0eVByaW50ZXIoaW5kZW50ID0gMikiIDw8IGVuZGwgPDwgImhvc3QgPSAnbG9jYWxob3N0JyIgPDwgZW5kbAotICAgICAgICAgICA8PCAicG9ydCA9IDkwOTAiIDw8IGVuZGwgPDwgInVyaSA9ICcnIiA8PCBlbmRsIDw8ICJmcmFtZWQgPSBGYWxzZSIgPDwgZW5kbAotICAgICAgICAgICA8PCAic3NsID0gRmFsc2UiIDw8IGVuZGwgPDwgImh0dHAgPSBGYWxzZSIgPDwgZW5kbCA8PCAiYXJnaSA9IDEiIDw8IGVuZGwgPDwgZW5kbAotICAgICAgICAgICA8PCAiaWYgc3lzLmFyZ3ZbYXJnaV0gPT0gJy1oJzoiIDw8IGVuZGwgPDwgIiAgcGFydHMgPSBzeXMuYXJndlthcmdpKzFdLnNwbGl0KCc6JykiCi0gICAgICAgICAgIDw8IGVuZGwgPDwgIiAgaG9zdCA9IHBhcnRzWzBdIiA8PCBlbmRsIDw8ICIgIGlmIGxlbihwYXJ0cykgPiAxOiIgPDwgZW5kbAotICAgICAgICAgICA8PCAiICAgIHBvcnQgPSBpbnQocGFydHNbMV0pIiA8PCBlbmRsIDw8ICIgIGFyZ2kgKz0gMiIgPDwgZW5kbCA8PCBlbmRsCi0gICAgICAgICAgIDw8ICJpZiBzeXMuYXJndlthcmdpXSA9PSAnLXUnOiIgPDwgZW5kbCA8PCAiICB1cmwgPSB1cmxwYXJzZShzeXMuYXJndlthcmdpKzFdKSIgPDwgZW5kbAotICAgICAgICAgICA8PCAiICBwYXJ0cyA9IHVybFsxXS5zcGxpdCgnOicpIiA8PCBlbmRsIDw8ICIgIGhvc3QgPSBwYXJ0c1swXSIgPDwgZW5kbAotICAgICAgICAgICA8PCAiICBpZiBsZW4ocGFydHMpID4gMToiIDw8IGVuZGwgPDwgIiAgICBwb3J0ID0gaW50KHBhcnRzWzFdKSIgPDwgZW5kbAotICAgICAgICAgICA8PCAiICBlbHNlOiIgPDwgZW5kbCA8PCAiICAgIHBvcnQgPSA4MCIgPDwgZW5kbCA8PCAiICB1cmkgPSB1cmxbMl0iIDw8IGVuZGwKLSAgICAgICAgICAgPDwgIiAgaWYgdXJsWzRdOiIgPDwgZW5kbCA8PCAiICAgIHVyaSArPSAnPyVzJyAlIHVybFs0XSIgPDwgZW5kbCA8PCAiICBodHRwID0gVHJ1ZSIKLSAgICAgICAgICAgPDwgZW5kbCA8PCAiICBhcmdpICs9IDIiIDw8IGVuZGwgPDwgZW5kbAotICAgICAgICAgICA8PCAiaWYgc3lzLmFyZ3ZbYXJnaV0gPT0gJy1mJyBvciBzeXMuYXJndlthcmdpXSA9PSAnLWZyYW1lZCc6IiA8PCBlbmRsCi0gICAgICAgICAgIDw8ICIgIGZyYW1lZCA9IFRydWUiIDw8IGVuZGwgPDwgIiAgYXJnaSArPSAxIiA8PCBlbmRsIDw8IGVuZGwKLSAgICAgICAgICAgPDwgImlmIHN5cy5hcmd2W2FyZ2ldID09ICctcycgb3Igc3lzLmFyZ3ZbYXJnaV0gPT0gJy1zc2wnOiIgPDwgZW5kbCA8PCAiICBzc2wgPSBUcnVlIgotICAgICAgICAgICA8PCBlbmRsIDw8ICIgIGFyZ2kgKz0gMSIgPDwgZW5kbCA8PCBlbmRsIDw8ICJjbWQgPSBzeXMuYXJndlthcmdpXSIgPDwgZW5kbAotICAgICAgICAgICA8PCAiYXJncyA9IHN5cy5hcmd2W2FyZ2krMTpdIiA8PCBlbmRsIDw8IGVuZGwgPDwgImlmIGh0dHA6IiA8PCBlbmRsCi0gICAgICAgICAgIDw8ICIgIHRyYW5zcG9ydCA9IFRIdHRwQ2xpZW50LlRIdHRwQ2xpZW50KGhvc3QsIHBvcnQsIHVyaSkiIDw8IGVuZGwgPDwgImVsc2U6IiA8PCBlbmRsCi0gICAgICAgICAgIDw8ICIgIHNvY2tldCA9IFRTU0xTb2NrZXQuVFNTTFNvY2tldChob3N0LCBwb3J0LCB2YWxpZGF0ZT1GYWxzZSkgaWYgc3NsIGVsc2UgIgotICAgICAgICAgICAgICAiVFNvY2tldC5UU29ja2V0KGhvc3QsIHBvcnQpIiA8PCBlbmRsIDw8ICIgIGlmIGZyYW1lZDoiIDw8IGVuZGwKLSAgICAgICAgICAgPDwgIiAgICB0cmFuc3BvcnQgPSBUVHJhbnNwb3J0LlRGcmFtZWRUcmFuc3BvcnQoc29ja2V0KSIgPDwgZW5kbCA8PCAiICBlbHNlOiIgPDwgZW5kbAotICAgICAgICAgICA8PCAiICAgIHRyYW5zcG9ydCA9IFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0KHNvY2tldCkiIDw8IGVuZGwKLSAgICAgICAgICAgPDwgInByb3RvY29sID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpIiA8PCBlbmRsCi0gICAgICAgICAgIDw8ICJjbGllbnQgPSAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIi5DbGllbnQocHJvdG9jb2wpIiA8PCBlbmRsIDw8ICJ0cmFuc3BvcnQub3BlbigpIgotICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfcmVtb3RlIDw8ICJlbCI7Ci0gICAgfQotCi0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBhcmdzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBhX2l0ZXI7Ci0gICAgc3RkOjp2ZWN0b3I8dF9maWVsZCo+OjpzaXplX3R5cGUgbnVtX2FyZ3MgPSBhcmdzLnNpemUoKTsKLQotICAgIGZfcmVtb3RlIDw8ICJpZiBjbWQgPT0gJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInOiIgPDwgZW5kbAotICAgICAgICAgICAgIDw8ICIgIGlmIGxlbihhcmdzKSAhPSAiIDw8IG51bV9hcmdzIDw8ICI6IiA8PCBlbmRsIDw8ICIgICAgcHJpbnQoJyIKLSAgICAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiByZXF1aXJlcyAiIDw8IG51bV9hcmdzIDw8ICIgYXJncycpIiA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgIiAgICBzeXMuZXhpdCgxKSIgPDwgZW5kbCA8PCAiICBwcC5wcHJpbnQoY2xpZW50LiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIjsKLSAgICBmb3IgKHN0ZDo6dmVjdG9yPHRfZmllbGQqPjo6c2l6ZV90eXBlIGkgPSAwOyBpIDwgbnVtX2FyZ3M7ICsraSkgewotICAgICAgaWYgKGFyZ3NbaV0tPmdldF90eXBlKCktPmlzX3N0cmluZygpKSB7Ci0gICAgICAgIGZfcmVtb3RlIDw8ICJhcmdzWyIgPDwgaSA8PCAiXSwiOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9yZW1vdGUgPDwgImV2YWwoYXJnc1siIDw8IGkgPDwgIl0pLCI7Ci0gICAgICB9Ci0gICAgfQotICAgIGZfcmVtb3RlIDw8ICIpKSIgPDwgZW5kbDsKLQotICAgIGZfcmVtb3RlIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAoZnVuY3Rpb25zLnNpemUoKSA+IDApIHsKLSAgICBmX3JlbW90ZSA8PCAiZWxzZToiIDw8IGVuZGw7Ci0gICAgZl9yZW1vdGUgPDwgIiAgcHJpbnQoJ1VucmVjb2duaXplZCBtZXRob2QgJXMnICUgY21kKSIgPDwgZW5kbDsKLSAgICBmX3JlbW90ZSA8PCAiICBzeXMuZXhpdCgxKSIgPDwgZW5kbDsKLSAgICBmX3JlbW90ZSA8PCBlbmRsOwotICB9Ci0KLSAgZl9yZW1vdGUgPDwgInRyYW5zcG9ydC5jbG9zZSgpIiA8PCBlbmRsOwotCi0gIC8vIENsb3NlIHNlcnZpY2UgZmlsZQotICBmX3JlbW90ZS5jbG9zZSgpOwotCi0jaWZuZGVmIF9NU0NfVkVSCi0KLSAgLy8gTWFrZSBmaWxlIGV4ZWN1dGFibGUsIGxvdmUgdGhhdCBiaXR3aXNlIE9SIGFjdGlvbgotICBjaG1vZChmX3JlbW90ZV9uYW1lLmNfc3RyKCksCi0gICAgICAgIFNfSVJVU1IgfCBTX0lXVVNSIHwgU19JWFVTUgotI2lmbmRlZiBfV0lOMzIKLSAgICAgICAgfCBTX0lSR1JQIHwgU19JWEdSUCB8IFNfSVJPVEggfCBTX0lYT1RICi0jZW5kaWYKLSAgICAgICAgKTsKLQotI2VuZGlmIC8vIF9NU0NfVkVSCi19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gZXh0ZW5kcyArICIuUHJvY2Vzc29yLCAiOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCi0gIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICBmX3NlcnZpY2VfIDw8ICJjbGFzcyBQcm9jZXNzb3IoIiA8PCBleHRlbmRzX3Byb2Nlc3NvciA8PCAiVFByb2Nlc3Nvcik6IiA8PCBlbmRsCi0gICAgICAgICAgICAgICA8PCAiICBpbXBsZW1lbnRzKElmYWNlKSIgPDwgZW5kbCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGZfc2VydmljZV8gPDwgImNsYXNzIFByb2Nlc3NvcigiIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8ICJJZmFjZSwgVFByb2Nlc3Nvcik6IiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJkZWYgX19pbml0X18oc2VsZiwgaGFuZGxlcik6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInNlbGYuX2hhbmRsZXIgPSBJZmFjZShoYW5kbGVyKSIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAic2VsZi5faGFuZGxlciA9IGhhbmRsZXIiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAic2VsZi5fcHJvY2Vzc01hcCA9IHt9IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgZXh0ZW5kcyA8PCAiLlByb2Nlc3Nvci5fX2luaXRfXyhzZWxmLCBJZmFjZShoYW5kbGVyKSkiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgZXh0ZW5kcyA8PCAiLlByb2Nlc3Nvci5fX2luaXRfXyhzZWxmLCBoYW5kbGVyKSIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzZWxmLl9wcm9jZXNzTWFwW1wiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgIDw8ICJcIl0gPSBQcm9jZXNzb3IucHJvY2Vzc18iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImRlZiBwcm9jZXNzKHNlbGYsIGlwcm90LCBvcHJvdCk6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIobmFtZSwgdHlwZSwgc2VxaWQpID0gaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpIiA8PCBlbmRsOwotCi0gIC8vIFRPRE8obWNzbGVlKTogdmFsaWRhdGUgbWVzc2FnZQotCi0gIC8vIEhPVDogZGljdGlvbmFyeSBmdW5jdGlvbiBsb29rdXAKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgbmFtZSBub3QgaW4gc2VsZi5fcHJvY2Vzc01hcDoiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICA8PCAiICBpcHJvdC5za2lwKFRUeXBlLlNUUlVDVCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgaXByb3QucmVhZE1lc3NhZ2VFbmQoKSIKLSAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgPDwgIiAgeCA9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uVU5LTk9XTl9NRVRIT0QsICdVbmtub3duICIKLSAgICAgICAgICAgICAgICAiZnVuY3Rpb24gJXMnICUgKG5hbWUpKSIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgIDw8ICIgIG9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5hbWUsIFRNZXNzYWdlVHlwZS5FWENFUFRJT04sIHNlcWlkKSIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgIDw8ICIgIHgud3JpdGUob3Byb3QpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgb3Byb3QudHJhbnMuZmx1c2goKSIgPDwgZW5kbDsKLQotICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gZGVmZXIuc3VjY2VlZChOb25lKSIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiIgPDwgZW5kbDsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImVsc2U6IiA8PCBlbmRsOwotCi0gIGlmIChnZW5fdHdpc3RlZF8gfHwgZ2VuX3Rvcm5hZG9fKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gc2VsZi5fcHJvY2Vzc01hcFtuYW1lXShzZWxmLCBzZXFpZCwgaXByb3QsIG9wcm90KSIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIHNlbGYuX3Byb2Nlc3NNYXBbbmFtZV0oc2VsZiwgc2VxaWQsIGlwcm90LCBvcHJvdCkiIDw8IGVuZGw7Ci0KLSAgICAvLyBSZWFkIGVuZCBvZiBhcmdzIGZpZWxkLCB0aGUgVF9TVE9QLCBhbmQgdGhlIHN0cnVjdCBjbG9zZQotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiBUcnVlIiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gICh2b2lkKXRzZXJ2aWNlOwotICAvLyBPcGVuIGZ1bmN0aW9uCi0gIGlmIChnZW5fdG9ybmFkb18pIHsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJAZ2VuLmNvcm91dGluZSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiZGVmIHByb2Nlc3NfIgotICAgICAgICAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoc2VsZiwgc2VxaWQsIGlwcm90LCBvcHJvdCk6IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImRlZiBwcm9jZXNzXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICA8PCAiKHNlbGYsIHNlcWlkLCBpcHJvdCwgb3Byb3QpOiIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudF91cCgpOwotCi0gIHN0cmluZyBhcmdzbmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyI7Ci0gIHN0cmluZyByZXN1bHRuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOwotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3MgPSAiIDw8IGFyZ3NuYW1lIDw8ICIoKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYXJncy5yZWFkKGlwcm90KSIKLSAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpcHJvdC5yZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsOwotCi0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0KLSAgLy8gRGVjbGFyZSByZXN1bHQgZm9yIG5vbiBvbmV3YXkgZnVuY3Rpb24KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0ID0gIiA8PCByZXN1bHRuYW1lIDw8ICIoKSIgPDwgZW5kbDsKLSAgfQotCi0gIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICAvLyBUT0RPOiBQcm9wYWdhdGUgYXJiaXRyYXJ5IGV4Y2VwdGlvbiByYWlzZWQgYnkgaGFuZGxlciB0byBjbGllbnQgYXMgZG9lcyBwbGFpbiAicHkiCi0KLSAgICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOwotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkID0gZGVmZXIubWF5YmVEZWZlcnJlZChzZWxmLl9oYW5kbGVyLiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICA8PCAiLCAiOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgIikiIDw8IGVuZGw7Ci0KLSAgICAvLyBTaG9ydGN1dCBvdXQgaGVyZSBmb3Igb25ld2F5IGZ1bmN0aW9ucwotICAgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gZCIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZC5hZGRDYWxsYmFjayhzZWxmLndyaXRlX3Jlc3VsdHNfc3VjY2Vzc18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgPDwgIiwgcmVzdWx0LCBzZXFpZCwgb3Byb3QpIiA8PCBlbmRsOwotCi0gICAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkLmFkZEVycmJhY2soc2VsZi53cml0ZV9yZXN1bHRzX2V4Y2VwdGlvbl8iCi0gICAgICAgICAgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiLCByZXN1bHQsIHNlcWlkLCBvcHJvdCkiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGQiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZGVmIHdyaXRlX3Jlc3VsdHNfc3VjY2Vzc18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICA8PCAiKHNlbGYsIHN1Y2Nlc3MsIHJlc3VsdCwgc2VxaWQsIG9wcm90KToiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LnN1Y2Nlc3MgPSBzdWNjZXNzIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgPDwgIlwiLCBUTWVzc2FnZVR5cGUuUkVQTFksIHNlcWlkKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LndyaXRlKG9wcm90KSIKLSAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICA8PCAib3Byb3QudHJhbnMuZmx1c2goKSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAgIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKLSAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZGVmIHdyaXRlX3Jlc3VsdHNfZXhjZXB0aW9uXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgPDwgIihzZWxmLCBlcnJvciwgcmVzdWx0LCBzZXFpZCwgb3Byb3QpOiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJ5OiIgPDwgZW5kbDsKLQotICAgICAgLy8gS2luZGEgYWJzdXJkCi0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIGVycm9yLnJhaXNlRXhjZXB0aW9uKCkiIDw8IGVuZGw7Ci0gICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJleGNlcHQgIiA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiIGFzICIKLSAgICAgICAgICAgICAgICAgICA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjoiIDw8IGVuZGw7Ci0gICAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgICAgIGluZGVudF91cCgpOwotICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIgotICAgICAgICAgICAgICAgICAgICAgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGVuZGw7Ci0gICAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwYXNzIiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgIDw8ICJcIiwgVE1lc3NhZ2VUeXBlLlJFUExZLCBzZXFpZCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvcHJvdCkiCi0gICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgIDw8ICJvcHJvdC50cmFucy5mbHVzaCgpIiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgICB9Ci0KLSAgfSBlbHNlIGlmIChnZW5fdG9ybmFkb18pIHsKLSAgICAvKgotICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiB4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJkZWYgaGFuZGxlX2V4Y2VwdGlvbih4dHlwZSwgdmFsdWUsIHRyYWNlYmFjayk6IiA8PCBlbmRsOwotCi0gICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgaWYgeHR5cGUgPT0gIiA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiOiIgPDwgZW5kbDsKLSAgICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgICByZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHZhbHVlIiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICAgIHJldHVybiBUcnVlIiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInRyeToiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0gICAgKi8KLQotICAgIC8vIFRPRE86IFByb3BhZ2F0ZSBhcmJpdHJhcnkgZXhjZXB0aW9uIHJhaXNlZCBieSBoYW5kbGVyIHRvIGNsaWVudCBhcyBkb2VzIHBsYWluICJweSIKLQotICAgIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCi0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7Ci0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICAgIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJ5OiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgInJlc3VsdC5zdWNjZXNzID0gIjsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAieWllbGQgZ2VuLm1heWJlX2Z1dHVyZShzZWxmLl9oYW5kbGVyLiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8ICJhcmdzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICIpKSIgPDwgZW5kbDsKLQotICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiB4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImV4Y2VwdCAiIDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCkpIDw8ICIgYXMgIgotICAgICAgICAgICAgICAgICAgIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOiIgPDwgZW5kbDsKLSAgICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiCi0gICAgICAgICAgICAgICAgICAgICA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgZW5kbDsKLSAgICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInBhc3MiIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgPDwgIlwiLCBUTWVzc2FnZVR5cGUuUkVQTFksIHNlcWlkKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LndyaXRlKG9wcm90KSIKLSAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlRW5kKCkiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICAgPDwgIm9wcm90LnRyYW5zLmZsdXNoKCkiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICB9IGVsc2UgeyAvLyBweQotICAgIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKLSAgICAvLyBJdCBhbHNvIGNhdGNoZXMgYXJiaXRyYXJ5IGV4Y2VwdGlvbnMgcmFpc2VkIGJ5IGhhbmRsZXIgbWV0aG9kIHRvIHByb3BhZ2F0ZSB0aGVtIHRvIHRoZSBjbGllbnQKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0cnk6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKLSAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKLSAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICJyZXN1bHQuc3VjY2VzcyA9ICI7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgInNlbGYuX2hhbmRsZXIuIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgIikiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLlJFUExZIiA8PCBlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICA8PCAiZXhjZXB0IChUVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb24sIEtleWJvYXJkSW50ZXJydXB0LCBTeXN0ZW1FeGl0KToiIDw8IGVuZGwKLSAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHJhaXNlIiA8PCBlbmRsOwotCi0gICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJleGNlcHQgIiA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiIGFzICIKLSAgICAgICAgICAgICAgICAgICA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjoiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5SRVBMWSIgPDwgZW5kbAotICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIKLSAgICAgICAgICAgICAgICAgICA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIH0KLQotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZXhjZXB0IEV4Y2VwdGlvbiBhcyBleDoiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgbXNnX3R5cGUgPSBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OIiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIGxvZ2dpbmcuZXhjZXB0aW9uKGV4KSIgPDwgZW5kbAotICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgICA8PCAiICByZXN1bHQgPSBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLklOVEVSTkFMX0VSUk9SLCAiCi0gICAgICAgICAgICAgICAgICAgICInSW50ZXJuYWwgZXJyb3InKSIgPDwgZW5kbAotICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgICA8PCAiXCIsIG1zZ190eXBlLCBzZXFpZCkiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvcHJvdCkiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdC50cmFucy5mbHVzaCgpIiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJleGNlcHQ6IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHBhc3MiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgfQotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbGFzcykgewotICAodm9pZClpbmNsYXNzOwotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gaXByb3QuIjsKLQotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkgfHwgIWdlbl91dGY4c3RyaW5nc18pIHsKLSAgICAgICAgICBvdXQgPDwgInJlYWRTdHJpbmcoKSI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nKCkuZGVjb2RlKCd1dGYtOCcpIjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgb3V0IDw8ICJyZWFkQm9vbCgpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIG91dCA8PCAicmVhZEJ5dGUoKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIG91dCA8PCAicmVhZEkxNigpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgb3V0IDw8ICJyZWFkSTMyKCkiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICBvdXQgPDwgInJlYWRJNjQoKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIG91dCA8PCAicmVhZERvdWJsZSgpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFB5dGhvbiBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIG91dCA8PCAicmVhZEkzMigpIjsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0KLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCi0gICAgICAgICAgIHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHN0cnVjdCwgY2FsbGluZyByZWFkKCkKLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBwcmVmaXgKLSAgICAgIDw8ICIucmVhZChpcHJvdCkiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplIGEgY29udGFpbmVyIGJ5IHdyaXRpbmcgb3V0IHRoZSBoZWFkZXIgZm9sbG93ZWQgYnkKLSAqIGRhdGEgYW5kIHRoZW4gYSBmb290ZXIuCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBzaXplID0gdG1wKCJfc2l6ZSIpOwotICBzdHJpbmcga3R5cGUgPSB0bXAoIl9rdHlwZSIpOwotICBzdHJpbmcgdnR5cGUgPSB0bXAoIl92dHlwZSIpOwotICBzdHJpbmcgZXR5cGUgPSB0bXAoIl9ldHlwZSIpOwotCi0gIHRfZmllbGQgZnNpemUoZ190eXBlX2kzMiwgc2l6ZSk7Ci0gIHRfZmllbGQgZmt0eXBlKGdfdHlwZV9ieXRlLCBrdHlwZSk7Ci0gIHRfZmllbGQgZnZ0eXBlKGdfdHlwZV9ieXRlLCB2dHlwZSk7Ci0gIHRfZmllbGQgZmV0eXBlKGdfdHlwZV9ieXRlLCBldHlwZSk7Ci0KLSAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSB7fSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiKCIgPDwga3R5cGUgPDwgIiwgIiA8PCB2dHlwZQotICAgICAgICA8PCAiLCAiIDw8IHNpemUgPDwgIiApID0gaXByb3QucmVhZE1hcEJlZ2luKCkiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gc2V0KCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIigiIDw8IGV0eXBlIDw8ICIsICIgPDwgc2l6ZQotICAgICAgICA8PCAiKSA9IGlwcm90LnJlYWRTZXRCZWdpbigpIiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBbXSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiKCIgPDwgZXR5cGUgPDwgIiwgIiA8PCBzaXplCi0gICAgICAgIDw8ICIpID0gaXByb3QucmVhZExpc3RCZWdpbigpIiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gRm9yIGxvb3AgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cwotICBzdHJpbmcgaSA9IHRtcCgiX2kiKTsKLSAgaW5kZW50KG91dCkgPDwgImZvciAiIDw8IGkgPDwgIiBpbiB4cmFuZ2UoIiA8PCBzaXplIDw8ICIpOiIgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBwcmVmaXgpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgcHJlZml4KTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIHByZWZpeCk7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotCi0gIC8vIFJlYWQgY29udGFpbmVyIGVuZAotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRNYXBFbmQoKSIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZFNldEVuZCgpIiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZExpc3RFbmQoKSIgPDwgZW5kbDsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIHRvIGRlc2VyaWFsaXplIGEgbWFwCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBrZXkgPSB0bXAoIl9rZXkiKTsKLSAgc3RyaW5nIHZhbCA9IHRtcCgiX3ZhbCIpOwotICB0X2ZpZWxkIGZrZXkodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7Ci0gIHRfZmllbGQgZnZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5KTsKLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICJbIiA8PCBrZXkgPDwgIl0gPSAiIDw8IHZhbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIFdyaXRlIGEgc2V0IGVsZW1lbnQKLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7Ci0gIHRfZmllbGQgZmVsZW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIuYWRkKCIgPDwgZWxlbSA8PCAiKSIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBXcml0ZSBhIGxpc3QgZWxlbWVudAotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7Ci0gIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLmFwcGVuZCgiIDw8IGVsZW0gPDwgIikiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQotICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob2ZzdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4KSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKLQotICAgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotCi0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90LiI7Ci0KLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpIHx8ICFnZW5fdXRmOHN0cmluZ3NfKSB7Ci0gICAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZygiIDw8IG5hbWUgPDwgIikiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoIiA8PCBuYW1lIDw8ICIuZW5jb2RlKCd1dGYtOCcpKSI7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIG91dCA8PCAid3JpdGVCb29sKCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBvdXQgPDwgIndyaXRlQnl0ZSgiIDw8IG5hbWUgPDwgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBvdXQgPDwgIndyaXRlSTE2KCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUk2NCgiIDw8IG5hbWUgPDwgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgIndyaXRlRG91YmxlKCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBQeXRob24gbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSBGSUVMRCAnJXMlcycgVFlQRSAnJXMnXG4iLAotICAgICAgICAgICBwcmVmaXguY19zdHIoKSwKLSAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCi0gICAgICAgICAgIHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGFsbCB0aGUgbWVtYmVycyBvZiBhIHN0cnVjdC4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IHRvIHNlcmlhbGl6ZQotICogQHBhcmFtIHByZWZpeCAgU3RyaW5nIHByZWZpeCB0byBhdHRhY2ggdG8gYWxsIGZpZWxkcwotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7Ci0gICh2b2lkKXRzdHJ1Y3Q7Ci0gIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLndyaXRlKG9wcm90KSIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7Ci0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVNYXBCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiLCAiCi0gICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIKLSAgICAgICAgICAgICAgICA8PCAibGVuKCIgPDwgcHJlZml4IDw8ICIpKSIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTZXRCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIgotICAgICAgICAgICAgICAgIDw8ICJsZW4oIiA8PCBwcmVmaXggPDwgIikpIiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVMaXN0QmVnaW4oIiA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKQotICAgICAgICAgICAgICAgIDw8ICIsICIKLSAgICAgICAgICAgICAgICA8PCAibGVuKCIgPDwgcHJlZml4IDw8ICIpKSIgPDwgZW5kbDsKLSAgfQotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBzdHJpbmcga2l0ZXIgPSB0bXAoImtpdGVyIik7Ci0gICAgc3RyaW5nIHZpdGVyID0gdG1wKCJ2aXRlciIpOwotICAgIGluZGVudChvdXQpIDw8ICJmb3IgIiA8PCBraXRlciA8PCAiLCIgPDwgdml0ZXIgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiLml0ZW1zKCk6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGtpdGVyLCB2aXRlcik7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBzdHJpbmcgaXRlciA9IHRtcCgiaXRlciIpOwotICAgIGluZGVudChvdXQpIDw8ICJmb3IgIiA8PCBpdGVyIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIjoiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgaXRlcik7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgc3RyaW5nIGl0ZXIgPSB0bXAoIml0ZXIiKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiZm9yICIgPDwgaXRlciA8PCAiIGluICIgPDwgcHJlZml4IDw8ICI6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgaXRlcik7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVNYXBFbmQoKSIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTZXRFbmQoKSIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlTGlzdEVuZCgpIiA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KLSAqCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBraXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdml0ZXIpIHsKLSAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGtpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCwgIiIpOwotCi0gIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2aXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQsICIiKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbGlzdC4KLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgaXRlcikgewotICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgZG9jc3RyaW5nIGZvciBhIGdpdmVuIHN0cnVjdC4KLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKG91dCwgdHN0cnVjdCwgdHN0cnVjdCwgIkF0dHJpYnV0ZXMiKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgdGhlIGRvY3N0cmluZyBmb3IgYSBnaXZlbiBmdW5jdGlvbi4KLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhvZnN0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhvdXQsIHRmdW5jdGlvbiwgdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLCAiUGFyYW1ldGVycyIpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgZG9jc3RyaW5nIGZvciBhIHN0cnVjdCBvciBmdW5jdGlvbi4KLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2RvYyogdGRvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHN1YmhlYWRlcikgewotICBib29sIGhhc19kb2MgPSBmYWxzZTsKLSAgc3RyaW5nc3RyZWFtIHNzOwotICBpZiAodGRvYy0+aGFzX2RvYygpKSB7Ci0gICAgaGFzX2RvYyA9IHRydWU7Ci0gICAgc3MgPDwgdGRvYy0+Z2V0X2RvYygpOwotICB9Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7Ci0gICAgaWYgKGhhc19kb2MpIHsKLSAgICAgIHNzIDw8IGVuZGw7Ci0gICAgfQotICAgIGhhc19kb2MgPSB0cnVlOwotICAgIHNzIDw8IHN1YmhlYWRlciA8PCAiOlxuIjsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBwX2l0ZXI7Ci0gICAgZm9yIChwX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgcF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytwX2l0ZXIpIHsKLSAgICAgIHRfZmllbGQqIHAgPSAqcF9pdGVyOwotICAgICAgc3MgPDwgIiAtICIgPDwgcC0+Z2V0X25hbWUoKTsKLSAgICAgIGlmIChwLT5oYXNfZG9jKCkpIHsKLSAgICAgICAgc3MgPDwgIjogIiA8PCBwLT5nZXRfZG9jKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzcyA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGlmIChoYXNfZG9jKSB7Ci0gICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiXCJcIlwiXG4iLCAiIiwgc3Muc3RyKCksICJcIlwiXCJcbiIpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSBkb2NzdHJpbmcgZm9yIGEgZ2VuZXJpYyBvYmplY3QuCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcob2ZzdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpIHsKLSAgaWYgKHRkb2MtPmhhc19kb2MoKSkgewotICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwgIlwiXCJcIlxuIiwgIiIsIHRkb2MtPmdldF9kb2MoKSwgIlwiXCJcIlxuIik7Ci0gIH0KLX0KLQotLyoqCi0gKiBEZWNsYXJlcyBhbiBhcmd1bWVudCwgd2hpY2ggbWF5IGluY2x1ZGUgaW5pdGlhbGl6YXRpb24gYXMgbmVjZXNzYXJ5LgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkCi0gKi8KLXN0cmluZyB0X3B5X2dlbmVyYXRvcjo6ZGVjbGFyZV9hcmd1bWVudCh0X2ZpZWxkKiB0ZmllbGQpIHsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlc3VsdDsKLSAgcmVzdWx0IDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiPSI7Ci0gIGlmICh0ZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKLSAgICByZXN1bHQgPDwgInRocmlmdF9zcGVjWyIgPDwgdGZpZWxkLT5nZXRfa2V5KCkgPDwgIl1bNF0iOwotICB9IGVsc2UgewotICAgIHJlc3VsdCA8PCAiTm9uZSI7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdC5zdHIoKTsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZmllbGQgZGVmYXVsdCB2YWx1ZSwgcmV0dXJucyBOb25lIG90aGVyd2lzZS4KLSAqCi0gKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZAotICovCi1zdHJpbmcgdF9weV9nZW5lcmF0b3I6OnJlbmRlcl9maWVsZF9kZWZhdWx0X3ZhbHVlKHRfZmllbGQqIHRmaWVsZCkgewotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gIGlmICh0ZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKLSAgICByZXR1cm4gcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHRmaWVsZC0+Z2V0X3ZhbHVlKCkpOwotICB9IGVsc2UgewotICAgIHJldHVybiAiTm9uZSI7Ci0gIH0KLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCi0gKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCi0gKi8KLXN0cmluZyB0X3B5X2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgYm9vbCBpbnRlcmZhY2UpIHsKLSAgdmVjdG9yPHN0cmluZz4gcHJlOwotICB2ZWN0b3I8c3RyaW5nPiBwb3N0OwotICBzdHJpbmcgc2lnbmF0dXJlID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIigiOwotCi0gIGlmICghKGdlbl90d2lzdGVkXyAmJiBpbnRlcmZhY2UpKSB7Ci0gICAgcHJlLnB1c2hfYmFjaygic2VsZiIpOwotICB9Ci0KLSAgc2lnbmF0dXJlICs9IGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLCAmcHJlLCAmcG9zdCkgKyAiKSI7Ci0gIHJldHVybiBzaWduYXR1cmU7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZpZWxkIGxpc3QKLSAqLwotc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LCB2ZWN0b3I8c3RyaW5nPiogcHJlLCB2ZWN0b3I8c3RyaW5nPiogcG9zdCkgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICB2ZWN0b3I8c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3Igc19pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgaWYgKHByZSkgewotICAgIGZvciAoc19pdGVyID0gcHJlLT5iZWdpbigpOyBzX2l0ZXIgIT0gcHJlLT5lbmQoKTsgKytzX2l0ZXIpIHsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVzdWx0ICs9ICIsICI7Ci0gICAgICB9Ci0gICAgICByZXN1bHQgKz0gKnNfaXRlcjsKLSAgICB9Ci0gIH0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiLCAiOwotICAgIH0KLSAgICByZXN1bHQgKz0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICB9Ci0gIGlmIChwb3N0KSB7Ci0gICAgZm9yIChzX2l0ZXIgPSBwb3N0LT5iZWdpbigpOyBzX2l0ZXIgIT0gcG9zdC0+ZW5kKCk7ICsrc19pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlc3VsdCArPSAiLCAiOwotICAgICAgfQotICAgICAgcmVzdWx0ICs9ICpzX2l0ZXI7Ci0gICAgfQotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0cmluZyB0X3B5X2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpIHsKLSAgd2hpbGUgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICB0dHlwZSA9ICgodF90eXBlZGVmKil0dHlwZSktPmdldF90eXBlKCk7Ci0gIH0KLQotICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKLSAgaWYgKHR0eXBlLT5pc19zZXJ2aWNlKCkpIHsKLSAgICByZXR1cm4gZ2V0X3JlYWxfcHlfbW9kdWxlKHByb2dyYW0sIGdlbl90d2lzdGVkXykgKyAiLiIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKLSAgICByZXR1cm4gZ2V0X3JlYWxfcHlfbW9kdWxlKHByb2dyYW0sIGdlbl90d2lzdGVkXykgKyAiLnR0eXBlcy4iICsgdHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLSAgcmV0dXJuIHR0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0vKioKLSAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgUHl0aG9uIHR5b2UKLSAqLwotc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICJUVHlwZS5TVFJJTkciOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiVFR5cGUuQk9PTCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJUVHlwZS5CWVRFIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiVFR5cGUuSTE2IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiVFR5cGUuSTMyIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiVFR5cGUuSTY0IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiVFR5cGUuRE9VQkxFIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5JMzIiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLlNUUlVDVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLk1BUCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLlNFVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5MSVNUIjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotLyoqIFNlZSB0aGUgY29tbWVudCBpbnNpZGUgZ2VuZXJhdGVfcHlfc3RydWN0X2RlZmluaXRpb24gZm9yIHdoYXQgdGhpcyBpcy4gKi8KLXN0cmluZyB0X3B5X2dlbmVyYXRvcjo6dHlwZV90b19zcGVjX2FyZ3ModF90eXBlKiB0dHlwZSkgewotICB3aGlsZSAodHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgIHR0eXBlID0gKCh0X3R5cGVkZWYqKXR0eXBlKS0+Z2V0X3R5cGUoKTsKLSAgfQotCi0gIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiTm9uZSI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuICIoIiArIHR5cGVfbmFtZSh0dHlwZSkgKyAiLCAiICsgdHlwZV9uYW1lKHR0eXBlKSArICIudGhyaWZ0X3NwZWMpIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIigiICsgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpICsgIiwiCi0gICAgICAgICAgICsgdHlwZV90b19zcGVjX2FyZ3MoKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgKyAiLCIKLSAgICAgICAgICAgKyB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgKyAiLCIKLSAgICAgICAgICAgKyB0eXBlX3RvX3NwZWNfYXJncygoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSArICIpIjsKLQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiKCIgKyB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpICsgIiwiCi0gICAgICAgICAgICsgdHlwZV90b19zcGVjX2FyZ3MoKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpICsgIikiOwotCi0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiAiKCIgKyB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSArICIsIgotICAgICAgICAgICArIHR5cGVfdG9fc3BlY19hcmdzKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgKyAiKSI7Ci0gIH0KLQotICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fc3BlY19hcmdzOiAiICsgdHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLVRIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoCi0gICAgcHksCi0gICAgIlB5dGhvbiIsCi0gICAgIiAgICBuZXdfc3R5bGU6ICAgICAgIEdlbmVyYXRlIG5ldy1zdHlsZSBjbGFzc2VzLlxuIgotICAgICIgICAgdHdpc3RlZDogICAgICAgICBHZW5lcmF0ZSBUd2lzdGVkLWZyaWVuZGx5IFJQQyBzZXJ2aWNlcy5cbiIKLSAgICAiICAgIHRvcm5hZG86ICAgICAgICAgR2VuZXJhdGUgY29kZSBmb3IgdXNlIHdpdGggVG9ybmFkby5cbiIKLSAgICAiICAgIHV0ZjhzdHJpbmdzOiAgICAgRW5jb2RlL2RlY29kZSBzdHJpbmdzIHVzaW5nIHV0ZjggaW4gdGhlIGdlbmVyYXRlZCBjb2RlLlxuIgotICAgICIgICAgY29kaW5nPUNPRElORzogICBBZGQgZmlsZSBlbmNvZGluZyBkZWNsYXJlIGluIGdlbmVyYXRlZCBmaWxlLlxuIgotICAgICIgICAgc2xvdHM6ICAgICAgICAgICBHZW5lcmF0ZSBjb2RlIHVzaW5nIHNsb3RzIGZvciBpbnN0YW5jZSBtZW1iZXJzLlxuIgotICAgICIgICAgZHluYW1pYzogICAgICAgICBHZW5lcmF0ZSBkeW5hbWljIGNvZGUsIGxlc3MgY29kZSBnZW5lcmF0ZWQgYnV0IHNsb3dlci5cbiIKLSAgICAiICAgIGR5bmJhc2U9Q0xTICAgICAgRGVyaXZlIGdlbmVyYXRlZCBjbGFzc2VzIGZyb20gY2xhc3MgQ0xTIGluc3RlYWQgb2YgVEJhc2UuXG4iCi0gICAgIiAgICBkeW5leGM9Q0xTICAgICAgIERlcml2ZSBnZW5lcmF0ZWQgZXhjZXB0aW9ucyBmcm9tIENMUyBpbnN0ZWFkIG9mIFRFeGNlcHRpb25CYXNlLlxuIgotICAgICIgICAgZHluaW1wb3J0PSdmcm9tIGZvby5iYXIgaW1wb3J0IENMUydcbiIKLSAgICAiICAgICAgICAgICAgICAgICAgICAgQWRkIGFuIGltcG9ydCBsaW5lIHRvIGdlbmVyYXRlZCBjb2RlIHRvIGZpbmQgdGhlIGR5bmJhc2UgY2xhc3MuXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3JiX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9yYl9nZW5lcmF0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNWMyNDguLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3JiX2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDEyNTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgotICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKLSAqIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0KLSNpbmNsdWRlICJ0X29vcF9nZW5lcmF0b3IuaCIKLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotI2luY2x1ZGUgInZlcnNpb24uaCIKLQotdXNpbmcgc3RkOjptYXA7Ci11c2luZyBzdGQ6Om9mc3RyZWFtOwotdXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwotdXNpbmcgc3RkOjpzdHJpbmc7Ci11c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKLXVzaW5nIHN0ZDo6dmVjdG9yOwotCi1zdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCi0KLS8qKgotICogQSBzdWJjbGFzcyBvZiBzdGQ6Om9mc3RyZWFtIHRoYXQgaW5jbHVkZXMgaW5kZW50aW5nIGZ1bmN0aW9uYWxpdHkuCi0gKi8KLWNsYXNzIHRfcmJfb2ZzdHJlYW0gOiBwdWJsaWMgc3RkOjpvZnN0cmVhbSB7Ci1wcml2YXRlOgotICBpbnQgaW5kZW50XzsKLQotcHVibGljOgotICB0X3JiX29mc3RyZWFtKCkgOiBzdGQ6Om9mc3RyZWFtKCksIGluZGVudF8oMCkge30KLSAgZXhwbGljaXQgdF9yYl9vZnN0cmVhbShjb25zdCBjaGFyKiBmaWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6b3Blbm1vZGUgbW9kZSA9IGlvc19iYXNlOjpvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGVudCA9IDApCi0gICAgOiBzdGQ6Om9mc3RyZWFtKGZpbGVuYW1lLCBtb2RlKSwgaW5kZW50XyhpbmRlbnQpIHt9Ci0KLSAgdF9yYl9vZnN0cmVhbSYgaW5kZW50KCkgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50XzsgKytpKSB7Ci0gICAgICAqdGhpcyA8PCAiICAiOwotICAgIH0KLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICB2b2lkIGluZGVudF91cCgpIHsgaW5kZW50XysrOyB9Ci0gIHZvaWQgaW5kZW50X2Rvd24oKSB7IGluZGVudF8tLTsgfQotfTsKLQotLyoqCi0gKiBSdWJ5IGNvZGUgZ2VuZXJhdG9yLgotICoKLSAqLwotY2xhc3MgdF9yYl9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKLXB1YmxpYzoKLSAgdF9yYl9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAotICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKLSAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCi0gICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgewotICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7Ci0gICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tcmIiOwotCi0gICAgcmVxdWlyZV9ydWJ5Z2Vtc18gPSAocGFyc2VkX29wdGlvbnMuZmluZCgicnVieWdlbXMiKSAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0gICAgbmFtZXNwYWNlZF8gPSAocGFyc2VkX29wdGlvbnMuZmluZCgibmFtZXNwYWNlZCIpICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLSAgfQotCi0gIC8qKgotICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCi0gICAqLwotCi0gIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKLSAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKLQotICAvKioKLSAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7Ci0gIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfdW5pb24odF9zdHJ1Y3QqIHR1bmlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLQotICB0X3JiX29mc3RyZWFtJiByZW5kZXJfY29uc3RfdmFsdWUodF9yYl9vZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKLQotICAvKioKLSAgICogU3RydWN0IGdlbmVyYXRpb24gY29kZQotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3JiX3N0cnVjdCh0X3JiX29mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfcmJfc3RydWN0X3JlcXVpcmVkX3ZhbGlkYXRvcih0X3JiX29mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9yYl91bmlvbih0X3JiX29mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfcmJfdW5pb25fdmFsaWRhdG9yKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3JiX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9yYl9zaW1wbGVfY29uc3RydWN0b3IodF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfcmJfc2ltcGxlX2V4Y2VwdGlvbl9jb25zdHJ1Y3Rvcih0X3JiX29mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9maWVsZF9jb25zdGFudHModF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZmllbGRfY29uc3RydWN0b3JzKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2ZpZWxkX2RlZm5zKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2ZpZWxkX2RhdGEodF9yYl9vZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiBmaWVsZF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpZWxkX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiBmaWVsZF92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb3B0aW9uYWwpOwotCi0gIC8qKgotICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICAvKioKLSAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQodF9yYl9vZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2xhc3MgPSBmYWxzZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3QodF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQodF9yYl9vZnN0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQodF9yYl9vZnN0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KHRfcmJfb2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIodF9yYl9vZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQodF9yYl9vZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcga2l0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHZpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudCh0X3JiX29mc3RyZWFtJiBvdXQsIHRfc2V0KiB0bWFwLCBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQodF9yYl9vZnN0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3Jkb2ModF9yYl9vZnN0cmVhbSYgb3V0LCB0X2RvYyogdGRvYyk7Ci0KLSAgLyoqCi0gICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCi0gICAqLwotCi0gIHN0ZDo6c3RyaW5nIHJiX2F1dG9nZW5fY29tbWVudCgpOwotICBzdGQ6OnN0cmluZyByZW5kZXJfcmVxdWlyZV90aHJpZnQoKTsKLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2luY2x1ZGVzKCk7Ci0gIHN0ZDo6c3RyaW5nIGRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkKTsKLSAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpOwotICBzdGQ6OnN0cmluZyBmdWxsX3R5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKTsKLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKLSAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOwotICBzdGQ6OnN0cmluZyByYl9uYW1lc3BhY2VfdG9fcGF0aF9wcmVmaXgoc3RkOjpzdHJpbmcgcmJfbmFtZXNwYWNlKTsKLQotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcnVieV9tb2R1bGVzKHRfcHJvZ3JhbSogcCkgewotICAgIHN0ZDo6c3RyaW5nIG5zID0gcC0+Z2V0X25hbWVzcGFjZSgicmIiKTsKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbW9kdWxlczsKLSAgICBpZiAobnMuZW1wdHkoKSkgewotICAgICAgcmV0dXJuIG1vZHVsZXM7Ci0gICAgfQotCi0gICAgc3RkOjpzdHJpbmc6Oml0ZXJhdG9yIHBvcyA9IG5zLmJlZ2luKCk7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHN0ZDo6c3RyaW5nOjppdGVyYXRvciBkZWxpbSA9IHN0ZDo6ZmluZChwb3MsIG5zLmVuZCgpLCAnLicpOwotICAgICAgbW9kdWxlcy5wdXNoX2JhY2soY2FwaXRhbGl6ZShzdGQ6OnN0cmluZyhwb3MsIGRlbGltKSkpOwotICAgICAgcG9zID0gZGVsaW07Ci0gICAgICBpZiAocG9zID09IG5zLmVuZCgpKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgKytwb3M7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1vZHVsZXM7Ci0gIH0KLQotICB2b2lkIGJlZ2luX25hbWVzcGFjZSh0X3JiX29mc3RyZWFtJiwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KTsKLSAgdm9pZCBlbmRfbmFtZXNwYWNlKHRfcmJfb2ZzdHJlYW0mLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4pOwotCi1wcml2YXRlOgotICAvKioKLSAgICogRmlsZSBzdHJlYW1zCi0gICAqLwotCi0gIHRfcmJfb2ZzdHJlYW0gZl90eXBlc187Ci0gIHRfcmJfb2ZzdHJlYW0gZl9jb25zdHNfOwotICB0X3JiX29mc3RyZWFtIGZfc2VydmljZV87Ci0KLSAgc3RkOjpzdHJpbmcgbmFtZXNwYWNlX2Rpcl87Ci0gIHN0ZDo6c3RyaW5nIHJlcXVpcmVfcHJlZml4XzsKLQotICAvKiogSWYgdHJ1ZSwgYWRkIGEgInJlcXVpcmUgJ3J1YnlnZW1zJyIgbGluZSB0byB0aGUgdG9wIG9mIGVhY2ggZ2VuLXJiIGZpbGUuICovCi0gIGJvb2wgcmVxdWlyZV9ydWJ5Z2Vtc187Ci0KLSAgLyoqIElmIHRydWUsIGdlbmVyYXRlIGZpbGVzIGluIGlkaW9tYXRpYyBuYW1lc3BhY2VkIGRpcmVjdG9yaWVzLiAqLwotICBib29sIG5hbWVzcGFjZWRfOwotfTsKLQotLyoqCi0gKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAotICogc3RyZWFtcy4KLSAqCi0gKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKLSAqLwotdm9pZCB0X3JiX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7Ci0gIHN0cmluZyBzdWJkaXIgPSBnZXRfb3V0X2RpcigpOwotCi0gIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQotICBNS0RJUihzdWJkaXIuY19zdHIoKSk7Ci0KLSAgaWYgKG5hbWVzcGFjZWRfKSB7Ci0gICAgcmVxdWlyZV9wcmVmaXhfID0gcmJfbmFtZXNwYWNlX3RvX3BhdGhfcHJlZml4KHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJyYiIpKTsKLQotICAgIHN0cmluZyBkaXIgPSByZXF1aXJlX3ByZWZpeF87Ci0gICAgc3RyaW5nOjpzaXplX3R5cGUgbG9jOwotCi0gICAgd2hpbGUgKChsb2MgPSBkaXIuZmluZCgiLyIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICAgIHN1YmRpciA9IHN1YmRpciArIGRpci5zdWJzdHIoMCwgbG9jKSArICIvIjsKLSAgICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKLSAgICAgIGRpciA9IGRpci5zdWJzdHIobG9jICsgMSk7Ci0gICAgfQotICB9Ci0KLSAgbmFtZXNwYWNlX2Rpcl8gPSBzdWJkaXI7Ci0KLSAgLy8gTWFrZSBvdXRwdXQgZmlsZQotICBzdHJpbmcgZl90eXBlc19uYW1lID0gbmFtZXNwYWNlX2Rpcl8gKyB1bmRlcnNjb3JlKHByb2dyYW1fbmFtZV8pICsgIl90eXBlcy5yYiI7Ci0gIGZfdHlwZXNfLm9wZW4oZl90eXBlc19uYW1lLmNfc3RyKCkpOwotCi0gIHN0cmluZyBmX2NvbnN0c19uYW1lID0gbmFtZXNwYWNlX2Rpcl8gKyB1bmRlcnNjb3JlKHByb2dyYW1fbmFtZV8pICsgIl9jb25zdGFudHMucmIiOwotICBmX2NvbnN0c18ub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOwotCi0gIC8vIFByaW50IGhlYWRlcgotICBmX3R5cGVzXyA8PCByYl9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8IHJlbmRlcl9yZXF1aXJlX3RocmlmdCgpIDw8IHJlbmRlcl9pbmNsdWRlcygpIDw8IGVuZGw7Ci0gIGJlZ2luX25hbWVzcGFjZShmX3R5cGVzXywgcnVieV9tb2R1bGVzKHByb2dyYW1fKSk7Ci0KLSAgZl9jb25zdHNfIDw8IHJiX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwgcmVuZGVyX3JlcXVpcmVfdGhyaWZ0KCkgPDwgInJlcXVpcmUgJyIKLSAgICAgICAgICAgIDw8IHJlcXVpcmVfcHJlZml4XyA8PCB1bmRlcnNjb3JlKHByb2dyYW1fbmFtZV8pIDw8ICJfdHlwZXMnIiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGJlZ2luX25hbWVzcGFjZShmX2NvbnN0c18sIHJ1YnlfbW9kdWxlcyhwcm9ncmFtXykpOwotfQotCi0vKioKLSAqIFJlbmRlcnMgdGhlIHJlcXVpcmUgb2YgdGhyaWZ0IGl0c2VsZiwgYW5kIHBvc3NpYmx5IG9mIHRoZSBydWJ5Z2VtcyBkZXBlbmRlbmN5LgotICovCi1zdHJpbmcgdF9yYl9nZW5lcmF0b3I6OnJlbmRlcl9yZXF1aXJlX3RocmlmdCgpIHsKLSAgaWYgKHJlcXVpcmVfcnVieWdlbXNfKSB7Ci0gICAgcmV0dXJuICJyZXF1aXJlICdydWJ5Z2VtcydcbnJlcXVpcmUgJ3RocmlmdCdcbiI7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuICJyZXF1aXJlICd0aHJpZnQnXG4iOwotICB9Ci19Ci0KLS8qKgotICogUmVuZGVycyBhbGwgdGhlIGltcG9ydHMgbmVjZXNzYXJ5IGZvciBpbmNsdWRpbmcgYW5vdGhlciBUaHJpZnQgcHJvZ3JhbQotICovCi1zdHJpbmcgdF9yYl9nZW5lcmF0b3I6OnJlbmRlcl9pbmNsdWRlcygpIHsKLSAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluY2x1ZGVzLnNpemUoKTsgKytpKSB7Ci0gICAgaWYgKG5hbWVzcGFjZWRfKSB7Ci0gICAgICB0X3Byb2dyYW0qIGluY2x1ZGVkID0gaW5jbHVkZXNbaV07Ci0gICAgICBzdGQ6OnN0cmluZyBpbmNsdWRlZF9yZXF1aXJlX3ByZWZpeAotICAgICAgICAgID0gcmJfbmFtZXNwYWNlX3RvX3BhdGhfcHJlZml4KGluY2x1ZGVkLT5nZXRfbmFtZXNwYWNlKCJyYiIpKTsKLSAgICAgIHN0ZDo6c3RyaW5nIGluY2x1ZGVkX25hbWUgPSBpbmNsdWRlZC0+Z2V0X25hbWUoKTsKLSAgICAgIHJlc3VsdCArPSAicmVxdWlyZSAnIiArIGluY2x1ZGVkX3JlcXVpcmVfcHJlZml4ICsgdW5kZXJzY29yZShpbmNsdWRlZF9uYW1lKSArICJfdHlwZXMnXG4iOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgKz0gInJlcXVpcmUgJyIgKyB1bmRlcnNjb3JlKGluY2x1ZGVzW2ldLT5nZXRfbmFtZSgpKSArICJfdHlwZXMnXG4iOwotICAgIH0KLSAgfQotICBpZiAoaW5jbHVkZXMuc2l6ZSgpID4gMCkgewotICAgIHJlc3VsdCArPSAiXG4iOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogQXV0b2dlbidkIGNvbW1lbnQKLSAqLwotc3RyaW5nIHRfcmJfZ2VuZXJhdG9yOjpyYl9hdXRvZ2VuX2NvbW1lbnQoKSB7Ci0gIHJldHVybiBzdGQ6OnN0cmluZygiI1xuIikgKyAiIyBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoIiArIFRIUklGVF9WRVJTSU9OICsgIilcbiIKLSAgICAgICAgICsgIiNcbiIgKyAiIyBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HXG4iICsgIiNcbiI7Ci19Ci0KLS8qKgotICogQ2xvc2VzIHRoZSB0eXBlIGZpbGVzCi0gKi8KLXZvaWQgdF9yYl9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKLSAgLy8gQ2xvc2UgdHlwZXMgZmlsZQotICBlbmRfbmFtZXNwYWNlKGZfdHlwZXNfLCBydWJ5X21vZHVsZXMocHJvZ3JhbV8pKTsKLSAgZW5kX25hbWVzcGFjZShmX2NvbnN0c18sIHJ1YnlfbW9kdWxlcyhwcm9ncmFtXykpOwotICBmX3R5cGVzXy5jbG9zZSgpOwotICBmX2NvbnN0c18uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBUaGlzIGlzIG5vdCBkb25lIGluIFJ1YnksIHR5cGVzIGFyZSBhbGwgaW1wbGljaXQuCi0gKgotICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7Ci0gICh2b2lkKXR0eXBlZGVmOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuIERvbmUgdXNpbmcgYSBjbGFzcyB0byBzY29wZQotICogdGhlIHZhbHVlcy4KLSAqCi0gKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCi0gKi8KLXZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgewotICBmX3R5cGVzXy5pbmRlbnQoKSA8PCAibW9kdWxlICIgPDwgY2FwaXRhbGl6ZSh0ZW51bS0+Z2V0X25hbWUoKSkgPDwgZW5kbDsKLSAgZl90eXBlc18uaW5kZW50X3VwKCk7Ci0KLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOwotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0KLSAgICAvLyBSdWJ5IGNsYXNzIGNvbnN0YW50cyBoYXZlIHRvIGJlIGNhcGl0YWxpemVkLi4uIG9tZyBpIGFtIHNvIG9uIHRoZSBmZW5jZQotICAgIC8vIGFib3V0IGxhbmd1YWdlcyBzdHJpY3RseSBlbmZvcmNpbmcgY2FwaXRhbGl6YXRpb24gd2h5IGNhbid0IHdlIGp1c3QgYWxsCi0gICAgLy8gYWdyZWUgYW5kIHBsYXkgbmljZS4KLSAgICBzdHJpbmcgbmFtZSA9IGNhcGl0YWxpemUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLQotICAgIGdlbmVyYXRlX3Jkb2MoZl90eXBlc18sICpjX2l0ZXIpOwotICAgIGZfdHlwZXNfLmluZGVudCgpIDw8IG5hbWUgPDwgIiA9ICIgPDwgdmFsdWUgPDwgZW5kbDsKLSAgfQotCi0gIC8vIENyZWF0ZSBhIGhhc2ggbWFwcGluZyB2YWx1ZXMgYmFjayB0byB0aGVpciBuYW1lcyAoYXMgc3RyaW5ncykgc2luY2UgcnVieSBoYXMgbm8gbmF0aXZlIGVudW0KLSAgLy8gdHlwZQotICBmX3R5cGVzXy5pbmRlbnQoKSA8PCAiVkFMVUVfTUFQID0geyI7Ci0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgLy8gUG9wdWxhdGUgdGhlIGhhc2gKLSAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgIGlmIChjX2l0ZXIgIT0gY29uc3RhbnRzLmJlZ2luKCkpCi0gICAgICBmX3R5cGVzXyA8PCAiLCAiOwotICAgIGZfdHlwZXNfIDw8IHZhbHVlIDw8ICIgPT4gXCIiIDw8IGNhcGl0YWxpemUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiXCIiOwotICB9Ci0gIGZfdHlwZXNfIDw8ICJ9IiA8PCBlbmRsOwotCi0gIC8vIENyZWF0ZSBhIHNldCB3aXRoIHZhbGlkIHZhbHVlcyBmb3IgdGhpcyBlbnVtCi0gIGZfdHlwZXNfLmluZGVudCgpIDw8ICJWQUxJRF9WQUxVRVMgPSBTZXQubmV3KFsiOwotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIC8vIFBvcHVsYXRlIHRoZSBzZXQKLSAgICBpZiAoY19pdGVyICE9IGNvbnN0YW50cy5iZWdpbigpKQotICAgICAgZl90eXBlc18gPDwgIiwgIjsKLSAgICBmX3R5cGVzXyA8PCBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gIH0KLSAgZl90eXBlc18gPDwgIl0pLmZyZWV6ZSIgPDwgZW5kbDsKLQotICBmX3R5cGVzXy5pbmRlbnRfZG93bigpOwotICBmX3R5cGVzXy5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGUgYSBjb25zdGFudCB2YWx1ZQotICovCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKLSAgdF90eXBlKiB0eXBlID0gdGNvbnN0LT5nZXRfdHlwZSgpOwotICBzdHJpbmcgbmFtZSA9IHRjb25zdC0+Z2V0X25hbWUoKTsKLSAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSB0Y29uc3QtPmdldF92YWx1ZSgpOwotCi0gIG5hbWVbMF0gPSB0b3VwcGVyKG5hbWVbMF0pOwotCi0gIGZfY29uc3RzXy5pbmRlbnQoKSA8PCBuYW1lIDw8ICIgPSAiOwotICByZW5kZXJfY29uc3RfdmFsdWUoZl9jb25zdHNfLCB0eXBlLCB2YWx1ZSkgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZwotICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKLSAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCi0gKi8KLXRfcmJfb2ZzdHJlYW0mIHRfcmJfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUodF9yYl9vZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgb3V0IDw8ICIlcVwiIiA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIG91dCA8PCAodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwID8gInRydWUiIDogImZhbHNlIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7Ci0gICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBvdXQuaW5kZW50KCkgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIG91dCA8PCBmdWxsX3R5cGVfbmFtZSh0eXBlKSA8PCAiLm5ldyh7IiA8PCBlbmRsOwotICAgIG91dC5pbmRlbnRfdXAoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKLSAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7Ci0gICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOwotICAgICAgfQotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgZ190eXBlX3N0cmluZywgdl9pdGVyLT5maXJzdCkgPDwgIiA9PiAiOwotICAgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpIDw8ICIsIiA8PCBlbmRsOwotICAgIH0KLSAgICBvdXQuaW5kZW50X2Rvd24oKTsKLSAgICBvdXQuaW5kZW50KCkgPDwgIn0pIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICBvdXQgPDwgInsiIDw8IGVuZGw7Ci0gICAgb3V0LmluZGVudF91cCgpOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIGt0eXBlLCB2X2l0ZXItPmZpcnN0KSA8PCAiID0+ICI7Ci0gICAgICByZW5kZXJfY29uc3RfdmFsdWUob3V0LCB2dHlwZSwgdl9pdGVyLT5zZWNvbmQpIDw8ICIsIiA8PCBlbmRsOwotICAgIH0KLSAgICBvdXQuaW5kZW50X2Rvd24oKTsKLSAgICBvdXQuaW5kZW50KCkgPDwgIn0iOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgewotICAgIHRfdHlwZSogZXR5cGU7Ci0gICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9IGVsc2UgewotICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0KLSAgICBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIG91dCA8PCAiU2V0Lm5ldyhbIiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwgIlsiIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dC5pbmRlbnRfdXAoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIGV0eXBlLCAqdl9pdGVyKSA8PCAiLCIgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0LmluZGVudF9kb3duKCk7Ci0gICAgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICBvdXQuaW5kZW50KCkgPDwgIl0pIjsKLSAgICB9IGVsc2UgewotICAgICAgb3V0LmluZGVudCgpIDw8ICJdIjsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBDT05TVEFOVCBGT1IgVFlQRTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLSAgcmV0dXJuIG91dDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBydWJ5IHN0cnVjdAotICovCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaWYgKHRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9yYl91bmlvbihmX3R5cGVzXywgdHN0cnVjdCwgZmFsc2UpOwotICB9IGVsc2UgewotICAgIGdlbmVyYXRlX3JiX3N0cnVjdChmX3R5cGVzXywgdHN0cnVjdCwgZmFsc2UpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGV4Y2VwdGlvbi4gQmFzaWNhbGx5IHRoZSBzYW1lCi0gKiBhcyBhIHN0cnVjdCBidXQgZXh0ZW5kcyB0aGUgRXhjZXB0aW9uIGNsYXNzLgotICoKLSAqIEBwYXJhbSB0eGNlcHRpb24gVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfcmJfc3RydWN0KGZfdHlwZXNfLCB0eGNlcHRpb24sIHRydWUpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHJ1Ynkgc3RydWN0Ci0gKi8KLXZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3JiX3N0cnVjdCh0X3JiX29mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24gPSBmYWxzZSkgewotICBnZW5lcmF0ZV9yZG9jKG91dCwgdHN0cnVjdCk7Ci0gIG91dC5pbmRlbnQoKSA8PCAiY2xhc3MgIiA8PCB0eXBlX25hbWUodHN0cnVjdCk7Ci0gIGlmIChpc19leGNlcHRpb24pIHsKLSAgICBvdXQgPDwgIiA8IDo6VGhyaWZ0OjpFeGNlcHRpb24iOwotICB9Ci0gIG91dCA8PCBlbmRsOwotCi0gIG91dC5pbmRlbnRfdXAoKTsKLSAgb3V0LmluZGVudCgpIDw8ICJpbmNsdWRlIDo6VGhyaWZ0OjpTdHJ1Y3QsIDo6VGhyaWZ0OjpTdHJ1Y3RfVW5pb24iIDw8IGVuZGw7Ci0KLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIGdlbmVyYXRlX3JiX3NpbXBsZV9leGNlcHRpb25fY29uc3RydWN0b3Iob3V0LCB0c3RydWN0KTsKLSAgfQotCi0gIGdlbmVyYXRlX2ZpZWxkX2NvbnN0YW50cyhvdXQsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9maWVsZF9kZWZucyhvdXQsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9yYl9zdHJ1Y3RfcmVxdWlyZWRfdmFsaWRhdG9yKG91dCwgdHN0cnVjdCk7Ci0KLSAgb3V0LmluZGVudCgpIDw8ICI6OlRocmlmdDo6U3RydWN0LmdlbmVyYXRlX2FjY2Vzc29ycyBzZWxmIiA8PCBlbmRsOwotCi0gIG91dC5pbmRlbnRfZG93bigpOwotICBvdXQuaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHJ1YnkgdW5pb24KLSAqLwotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmJfdW5pb24odF9yYl9vZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiA9IGZhbHNlKSB7Ci0gICh2b2lkKWlzX2V4Y2VwdGlvbjsKLSAgZ2VuZXJhdGVfcmRvYyhvdXQsIHRzdHJ1Y3QpOwotICBvdXQuaW5kZW50KCkgPDwgImNsYXNzICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgPCA6OlRocmlmdDo6VW5pb24iIDw8IGVuZGw7Ci0KLSAgb3V0LmluZGVudF91cCgpOwotICBvdXQuaW5kZW50KCkgPDwgImluY2x1ZGUgOjpUaHJpZnQ6OlN0cnVjdF9VbmlvbiIgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9maWVsZF9jb25zdHJ1Y3RvcnMob3V0LCB0c3RydWN0KTsKLQotICBnZW5lcmF0ZV9maWVsZF9jb25zdGFudHMob3V0LCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfZmllbGRfZGVmbnMob3V0LCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfcmJfdW5pb25fdmFsaWRhdG9yKG91dCwgdHN0cnVjdCk7Ci0KLSAgb3V0LmluZGVudCgpIDw8ICI6OlRocmlmdDo6VW5pb24uZ2VuZXJhdGVfYWNjZXNzb3JzIHNlbGYiIDw8IGVuZGw7Ci0KLSAgb3V0LmluZGVudF9kb3duKCk7Ci0gIG91dC5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkX2NvbnN0cnVjdG9ycyh0X3JiX29mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0KLSAgb3V0LmluZGVudCgpIDw8ICJjbGFzcyA8PCBzZWxmIiA8PCBlbmRsOwotICBvdXQuaW5kZW50X3VwKCk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZfaXRlciAhPSBmaWVsZHMuYmVnaW4oKSkgewotICAgICAgb3V0IDw8IGVuZGw7Ci0gICAgfQotICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0KLSAgICBvdXQuaW5kZW50KCkgPDwgImRlZiAiIDw8IGZpZWxkX25hbWUgPDwgIih2YWwpIiA8PCBlbmRsOwotICAgIG91dC5pbmRlbnQoKSA8PCAiICAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIi5uZXcoOiIgPDwgZmllbGRfbmFtZSA8PCAiLCB2YWwpIiA8PCBlbmRsOwotICAgIG91dC5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsOwotICB9Ci0KLSAgb3V0LmluZGVudF9kb3duKCk7Ci0gIG91dC5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsOwotCi0gIG91dCA8PCBlbmRsOwotfQotCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yYl9zaW1wbGVfZXhjZXB0aW9uX2NvbnN0cnVjdG9yKHRfcmJfb2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0KLSAgaWYgKG1lbWJlcnMuc2l6ZSgpID09IDEpIHsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7Ci0KLSAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdHlwZSgpLT5pc19zdHJpbmcoKSkgewotICAgICAgc3RyaW5nIG5hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7Ci0KLSAgICAgIG91dC5pbmRlbnQoKSA8PCAiZGVmIGluaXRpYWxpemUobWVzc2FnZT1uaWwpIiA8PCBlbmRsOwotICAgICAgb3V0LmluZGVudF91cCgpOwotICAgICAgb3V0LmluZGVudCgpIDw8ICJzdXBlcigpIiA8PCBlbmRsOwotICAgICAgb3V0LmluZGVudCgpIDw8ICJzZWxmLiIgPDwgbmFtZSA8PCAiID0gbWVzc2FnZSIgPDwgZW5kbDsKLSAgICAgIG91dC5pbmRlbnRfZG93bigpOwotICAgICAgb3V0LmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgICAgaWYgKG5hbWUgIT0gIm1lc3NhZ2UiKSB7Ci0gICAgICAgIG91dC5pbmRlbnQoKSA8PCAiZGVmIG1lc3NhZ2U7ICIgPDwgbmFtZSA8PCAiIGVuZCIgPDwgZW5kbCA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9maWVsZF9jb25zdGFudHModF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIHN0ZDo6c3RyaW5nIGNhcF9maWVsZF9uYW1lID0gdXBjYXNlX3N0cmluZyhmaWVsZF9uYW1lKTsKLQotICAgIG91dC5pbmRlbnQoKSA8PCBjYXBfZmllbGRfbmFtZSA8PCAiID0gIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCBlbmRsOwotICB9Ci0gIG91dCA8PCBlbmRsOwotfQotCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9maWVsZF9kZWZucyh0X3JiX29mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBvdXQuaW5kZW50KCkgPDwgIkZJRUxEUyA9IHsiIDw8IGVuZGw7Ci0gIG91dC5pbmRlbnRfdXAoKTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZl9pdGVyICE9IGZpZWxkcy5iZWdpbigpKSB7Ci0gICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gZ2VuZXJhdGUgdGhlIGZpZWxkIGRvY3N0cmluZ3Mgd2l0aGluIHRoZSBGSUVMRFMgY29uc3RhbnQuIG5vIHJlYWwgYmV0dGVyIHBsYWNlLi4uCi0gICAgZ2VuZXJhdGVfcmRvYyhvdXQsICpmX2l0ZXIpOwotCi0gICAgb3V0LmluZGVudCgpIDw8IHVwY2FzZV9zdHJpbmcoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiID0+ICI7Ci0KLSAgICBnZW5lcmF0ZV9maWVsZF9kYXRhKG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X3R5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X3ZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKTsKLSAgfQotICBvdXQuaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8IGVuZGw7Ci0gIG91dC5pbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIG91dC5pbmRlbnQoKSA8PCAiZGVmIHN0cnVjdF9maWVsZHM7IEZJRUxEUzsgZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkX2RhdGEodF9yYl9vZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWVsZF9uYW1lID0gIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIGZpZWxkX3ZhbHVlID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvcHRpb25hbCA9IGZhbHNlKSB7Ci0gIGZpZWxkX3R5cGUgPSBnZXRfdHJ1ZV90eXBlKGZpZWxkX3R5cGUpOwotCi0gIC8vIEJlZ2luIHRoaXMgZmllbGQncyBkZWZuCi0gIG91dCA8PCAiezp0eXBlID0+ICIgPDwgdHlwZV90b19lbnVtKGZpZWxkX3R5cGUpOwotCi0gIGlmICghZmllbGRfbmFtZS5lbXB0eSgpKSB7Ci0gICAgb3V0IDw8ICIsIDpuYW1lID0+ICciIDw8IGZpZWxkX25hbWUgPDwgIiciOwotICB9Ci0KLSAgaWYgKGZpZWxkX3ZhbHVlICE9IE5VTEwpIHsKLSAgICBvdXQgPDwgIiwgOmRlZmF1bHQgPT4gIjsKLSAgICByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBmaWVsZF90eXBlLCBmaWVsZF92YWx1ZSk7Ci0gIH0KLQotICBpZiAoIWZpZWxkX3R5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgaWYgKGZpZWxkX3R5cGUtPmlzX3N0cnVjdCgpIHx8IGZpZWxkX3R5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICAgIG91dCA8PCAiLCA6Y2xhc3MgPT4gIiA8PCBmdWxsX3R5cGVfbmFtZSgodF9zdHJ1Y3QqKWZpZWxkX3R5cGUpOwotICAgIH0gZWxzZSBpZiAoZmllbGRfdHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBvdXQgPDwgIiwgOmVsZW1lbnQgPT4gIjsKLSAgICAgIGdlbmVyYXRlX2ZpZWxkX2RhdGEob3V0LCAoKHRfbGlzdCopZmllbGRfdHlwZSktPmdldF9lbGVtX3R5cGUoKSk7Ci0gICAgfSBlbHNlIGlmIChmaWVsZF90eXBlLT5pc19tYXAoKSkgewotICAgICAgb3V0IDw8ICIsIDprZXkgPT4gIjsKLSAgICAgIGdlbmVyYXRlX2ZpZWxkX2RhdGEob3V0LCAoKHRfbWFwKilmaWVsZF90eXBlKS0+Z2V0X2tleV90eXBlKCkpOwotICAgICAgb3V0IDw8ICIsIDp2YWx1ZSA9PiAiOwotICAgICAgZ2VuZXJhdGVfZmllbGRfZGF0YShvdXQsICgodF9tYXAqKWZpZWxkX3R5cGUpLT5nZXRfdmFsX3R5cGUoKSk7Ci0gICAgfSBlbHNlIGlmIChmaWVsZF90eXBlLT5pc19zZXQoKSkgewotICAgICAgb3V0IDw8ICIsIDplbGVtZW50ID0+ICI7Ci0gICAgICBnZW5lcmF0ZV9maWVsZF9kYXRhKG91dCwgKCh0X3NldCopZmllbGRfdHlwZSktPmdldF9lbGVtX3R5cGUoKSk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGlmICgoKHRfYmFzZV90eXBlKilmaWVsZF90eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgIG91dCA8PCAiLCA6YmluYXJ5ID0+IHRydWUiOwotICAgIH0KLSAgfQotCi0gIGlmIChvcHRpb25hbCkgewotICAgIG91dCA8PCAiLCA6b3B0aW9uYWwgPT4gdHJ1ZSI7Ci0gIH0KLQotICBpZiAoZmllbGRfdHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgb3V0IDw8ICIsIDplbnVtX2NsYXNzID0+ICIgPDwgZnVsbF90eXBlX25hbWUoZmllbGRfdHlwZSk7Ci0gIH0KLQotICAvLyBFbmQgb2YgdGhpcyBmaWVsZCdzIGRlZm4KLSAgb3V0IDw8ICJ9IjsKLX0KLQotdm9pZCB0X3JiX2dlbmVyYXRvcjo6YmVnaW5fbmFtZXNwYWNlKHRfcmJfb2ZzdHJlYW0mIG91dCwgdmVjdG9yPHN0ZDo6c3RyaW5nPiBtb2R1bGVzKSB7Ci0gIGZvciAodmVjdG9yPHN0ZDo6c3RyaW5nPjo6aXRlcmF0b3IgbV9pdGVyID0gbW9kdWxlcy5iZWdpbigpOyBtX2l0ZXIgIT0gbW9kdWxlcy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBvdXQuaW5kZW50KCkgPDwgIm1vZHVsZSAiIDw8ICptX2l0ZXIgPDwgZW5kbDsKLSAgICBvdXQuaW5kZW50X3VwKCk7Ci0gIH0KLX0KLQotdm9pZCB0X3JiX2dlbmVyYXRvcjo6ZW5kX25hbWVzcGFjZSh0X3JiX29mc3RyZWFtJiBvdXQsIHZlY3RvcjxzdGQ6OnN0cmluZz4gbW9kdWxlcykgewotICBmb3IgKHZlY3RvcjxzdGQ6OnN0cmluZz46OnJldmVyc2VfaXRlcmF0b3IgbV9pdGVyID0gbW9kdWxlcy5yYmVnaW4oKTsgbV9pdGVyICE9IG1vZHVsZXMucmVuZCgpOwotICAgICAgICsrbV9pdGVyKSB7Ci0gICAgb3V0LmluZGVudF9kb3duKCk7Ci0gICAgb3V0LmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGw7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgotICovCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gbmFtZXNwYWNlX2Rpcl8gKyB1bmRlcnNjb3JlKHNlcnZpY2VfbmFtZV8pICsgIi5yYiI7Ci0gIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKLQotICBmX3NlcnZpY2VfIDw8IHJiX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwgcmVuZGVyX3JlcXVpcmVfdGhyaWZ0KCk7Ci0KLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBpZiAobmFtZXNwYWNlZF8pIHsKLSAgICAgIGZfc2VydmljZV8gPDwgInJlcXVpcmUgJyIgPDwgcmJfbmFtZXNwYWNlX3RvX3BhdGhfcHJlZml4KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9wcm9ncmFtKCktPmdldF9uYW1lc3BhY2UoInJiIikpCi0gICAgICAgICAgICAgICAgIDw8IHVuZGVyc2NvcmUodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkpIDw8ICInIiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICJyZXF1aXJlICciIDw8IHJlcXVpcmVfcHJlZml4XwotICAgICAgICAgICAgICAgICA8PCB1bmRlcnNjb3JlKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpKSA8PCAiJyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8ICJyZXF1aXJlICciIDw8IHJlcXVpcmVfcHJlZml4XyA8PCB1bmRlcnNjb3JlKHByb2dyYW1fbmFtZV8pIDw8ICJfdHlwZXMnIiA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgZW5kbDsKLQotICBiZWdpbl9uYW1lc3BhY2UoZl9zZXJ2aWNlXywgcnVieV9tb2R1bGVzKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSk7Ci0KLSAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAibW9kdWxlICIgPDwgY2FwaXRhbGl6ZSh0c2VydmljZS0+Z2V0X25hbWUoKSkgPDwgZW5kbDsKLSAgZl9zZXJ2aWNlXy5pbmRlbnRfdXAoKTsKLQotICAvLyBHZW5lcmF0ZSB0aGUgdGhyZWUgbWFpbiBwYXJ0cyBvZiB0aGUgc2VydmljZSAod2VsbCwgdHdvIGZvciBub3cgaW4gUEhQKQotICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKLQotICBmX3NlcnZpY2VfLmluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGVuZF9uYW1lc3BhY2UoZl9zZXJ2aWNlXywgcnVieV9tb2R1bGVzKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSk7Ci0KLSAgLy8gQ2xvc2Ugc2VydmljZSBmaWxlCi0gIGZfc2VydmljZV8uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgYSBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgewotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICIjIEhFTFBFUiBGVU5DVElPTlMgQU5EIFNUUlVDVFVSRVMiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBnZW5lcmF0ZV9yYl9zdHJ1Y3QoZl9zZXJ2aWNlXywgdHMpOwotICAgIGdlbmVyYXRlX3JiX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KLSAqLwotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmJfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOwotICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOwotICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7Ci0gIH0KLQotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOwotICB9Ci0gIGdlbmVyYXRlX3JiX3N0cnVjdChmX3NlcnZpY2VfLCAmcmVzdWx0KTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IGZ1bGxfdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX2NsaWVudCA9ICIgPCAiICsgZXh0ZW5kcyArICI6OkNsaWVudCAiOwotICB9Ci0KLSAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiY2xhc3MgQ2xpZW50IiA8PCBleHRlbmRzX2NsaWVudCA8PCBlbmRsOwotICBmX3NlcnZpY2VfLmluZGVudF91cCgpOwotCi0gIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImluY2x1ZGUgOjpUaHJpZnQ6OkNsaWVudCIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7Ci0gICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0KLSAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiZGVmICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXy5pbmRlbnRfdXAoKTsKLSAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJzZW5kXyIgPDwgZnVubmFtZSA8PCAiKCI7Ci0KLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICIpIiA8PCBlbmRsOwotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBmX3NlcnZpY2VfLmluZGVudCgpOwotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICJyZXR1cm4gIjsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwgInJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoKSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXy5pbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJkZWYgc2VuZF8iIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOwotICAgIGZfc2VydmljZV8uaW5kZW50X3VwKCk7Ci0KLSAgICBzdGQ6OnN0cmluZyBhcmdzbmFtZSA9IGNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIik7Ci0gICAgc3RkOjpzdHJpbmcgbWVzc2FnZVNlbmRQcm9jID0gKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJzZW5kX29uZXdheV9tZXNzYWdlIiA6ICJzZW5kX21lc3NhZ2UiOwotCi0gICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCBtZXNzYWdlU2VuZFByb2MgPDwgIignIiA8PCBmdW5uYW1lIDw8ICInLCAiIDw8IGFyZ3NuYW1lOwotCi0gICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgIiwgOiIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9PiAiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIH0KLQotICAgIGZfc2VydmljZV8gPDwgIikiIDw8IGVuZGw7Ci0KLSAgICBmX3NlcnZpY2VfLmluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsOwotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBzdGQ6OnN0cmluZyByZXN1bHRuYW1lID0gY2FwaXRhbGl6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOwotICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKLQotICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vYXJncyk7Ci0gICAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gICAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJkZWYgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24pIDw8IGVuZGw7Ci0gICAgICBmX3NlcnZpY2VfLmluZGVudF91cCgpOwotCi0gICAgICAvLyBUT0RPKG1jc2xlZSk6IFZhbGlkYXRlIG1lc3NhZ2UgcmVwbHkgaGVyZSwgc2VxIGlkcyBldGMuCi0KLSAgICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgInJlc3VsdCA9IHJlY2VpdmVfbWVzc2FnZSgiIDw8IHJlc3VsdG5hbWUgPDwgIikiIDw8IGVuZGw7Ci0KLSAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJyZXR1cm4gcmVzdWx0LnN1Y2Nlc3MgdW5sZXNzIHJlc3VsdC5zdWNjZXNzLm5pbD8iIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOwotICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgInJhaXNlIHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIHVubGVzcyByZXN1bHQuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiLm5pbD8iIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgotICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgInJldHVybiIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgInJhaXNlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOjpUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uLm5ldyg6OlRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb246OiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTUlTU0lOR19SRVNVTFQsICciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdCcpIiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICAvLyBDbG9zZSBmdW5jdGlvbgotICAgICAgZl9zZXJ2aWNlXy5pbmRlbnRfZG93bigpOwotICAgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgZl9zZXJ2aWNlXy5pbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfcHJvY2Vzc29yID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IGZ1bGxfdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX3Byb2Nlc3NvciA9ICIgPCAiICsgZXh0ZW5kcyArICI6OlByb2Nlc3NvciAiOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCi0gIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImNsYXNzIFByb2Nlc3NvciIgPDwgZXh0ZW5kc19wcm9jZXNzb3IgPDwgZW5kbDsKLSAgZl9zZXJ2aWNlXy5pbmRlbnRfdXAoKTsKLQotICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJpbmNsdWRlIDo6VGhyaWZ0OjpQcm9jZXNzb3IiIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKLSAgfQotCi0gIGZfc2VydmljZV8uaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKLSAqLwotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgKHZvaWQpdHNlcnZpY2U7Ci0gIC8vIE9wZW4gZnVuY3Rpb24KLSAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiZGVmIHByb2Nlc3NfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIihzZXFpZCwgaXByb3QsIG9wcm90KSIgPDwgZW5kbDsKLSAgZl9zZXJ2aWNlXy5pbmRlbnRfdXAoKTsKLQotICBzdHJpbmcgYXJnc25hbWUgPSBjYXBpdGFsaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiX2FyZ3MiOwotICBzdHJpbmcgcmVzdWx0bmFtZSA9IGNhcGl0YWxpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICJfcmVzdWx0IjsKLQotICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJhcmdzID0gcmVhZF9hcmdzKGlwcm90LCAiIDw8IGFyZ3NuYW1lIDw8ICIpIiA8PCBlbmRsOwotCi0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0KLSAgLy8gRGVjbGFyZSByZXN1bHQgZm9yIG5vbiBvbmV3YXkgZnVuY3Rpb24KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAicmVzdWx0ID0gIiA8PCByZXN1bHRuYW1lIDw8ICIubmV3KCkiIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBUcnkgYmxvY2sgZm9yIGEgZnVuY3Rpb24gd2l0aCBleGNlcHRpb25zCi0gIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImJlZ2luIiA8PCBlbmRsOwotICAgIGZfc2VydmljZV8uaW5kZW50X3VwKCk7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAotICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgZl9zZXJ2aWNlXy5pbmRlbnQoKTsKLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgIGZfc2VydmljZV8gPDwgInJlc3VsdC5zdWNjZXNzID0gIjsKLSAgfQotICBmX3NlcnZpY2VfIDw8ICJAaGFuZGxlci4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICJhcmdzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICB9Ci0gIGZfc2VydmljZV8gPDwgIikiIDw8IGVuZGw7Ci0KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmIHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgZl9zZXJ2aWNlXy5pbmRlbnRfZG93bigpOwotICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJyZXNjdWUgIiA8PCBmdWxsX3R5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCkpIDw8ICIgPT4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgZW5kbDsKLSAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgICBmX3NlcnZpY2VfLmluZGVudF91cCgpOwotICAgICAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgICAgZl9zZXJ2aWNlXy5pbmRlbnRfZG93bigpOwotICAgICAgfQotICAgIH0KLSAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBTaG9ydGN1dCBvdXQgaGVyZSBmb3Igb25ld2F5IGZ1bmN0aW9ucwotICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgInJldHVybiIgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfLmluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAid3JpdGVfcmVzdWx0KHJlc3VsdCwgb3Byb3QsICciIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiJywgc2VxaWQpIgotICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0KLSAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgZl9zZXJ2aWNlXy5pbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCi0gKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCi0gKi8KLXN0cmluZyB0X3JiX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RyaW5nIHByZWZpeCkgewotICAvLyBUT0RPKG1jc2xlZSk6IE5pdHBpY2t5LCBubyAnLCcgaWYgYXJndW1lbnRfbGlzdCBpcyBlbXB0eQotICByZXR1cm4gcHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIigiICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpICsgIikiOwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmaWVsZCBsaXN0Ci0gKi8KLXN0cmluZyB0X3JiX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiLCAiOwotICAgIH0KLSAgICByZXN1bHQgKz0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0cmluZyB0X3JiX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpIHsKLSAgc3RyaW5nIHByZWZpeCA9ICIiOwotCi0gIHN0cmluZyBuYW1lID0gdHR5cGUtPmdldF9uYW1lKCk7Ci0gIGlmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkgfHwgdHR5cGUtPmlzX2VudW0oKSkgewotICAgIG5hbWUgPSBjYXBpdGFsaXplKHR0eXBlLT5nZXRfbmFtZSgpKTsKLSAgfQotCi0gIHJldHVybiBwcmVmaXggKyBuYW1lOwotfQotCi1zdHJpbmcgdF9yYl9nZW5lcmF0b3I6OmZ1bGxfdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpIHsKLSAgc3RyaW5nIHByZWZpeCA9ICI6OiI7Ci0gIHZlY3RvcjxzdGQ6OnN0cmluZz4gbW9kdWxlcyA9IHJ1YnlfbW9kdWxlcyh0dHlwZS0+Z2V0X3Byb2dyYW0oKSk7Ci0gIGZvciAodmVjdG9yPHN0ZDo6c3RyaW5nPjo6aXRlcmF0b3IgbV9pdGVyID0gbW9kdWxlcy5iZWdpbigpOyBtX2l0ZXIgIT0gbW9kdWxlcy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBwcmVmaXggKz0gKm1faXRlciArICI6OiI7Ci0gIH0KLSAgcmV0dXJuIHByZWZpeCArIHR5cGVfbmFtZSh0dHlwZSk7Ci19Ci0KLS8qKgotICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBSdWJ5IHR5b2UKLSAqLwotc3RyaW5nIHRfcmJfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICI6OlRocmlmdDo6VHlwZXM6OlNUUklORyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICI6OlRocmlmdDo6VHlwZXM6OkJPT0wiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpCWVRFIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpJMTYiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICI6OlRocmlmdDo6VHlwZXM6OkkzMiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gIjo6VGhyaWZ0OjpUeXBlczo6STY0IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpET1VCTEUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIjo6VGhyaWZ0OjpUeXBlczo6STMyIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuICI6OlRocmlmdDo6VHlwZXM6OlNUUlVDVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIjo6VGhyaWZ0OjpUeXBlczo6TUFQIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpTRVQiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpMSVNUIjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotc3RyaW5nIHRfcmJfZ2VuZXJhdG9yOjpyYl9uYW1lc3BhY2VfdG9fcGF0aF9wcmVmaXgoc3RyaW5nIHJiX25hbWVzcGFjZSkgewotICBzdHJpbmcgbmFtZXNwYWNlc19sZWZ0ID0gcmJfbmFtZXNwYWNlOwotICBzdHJpbmc6OnNpemVfdHlwZSBsb2M7Ci0KLSAgc3RyaW5nIHBhdGhfcHJlZml4ID0gIiI7Ci0KLSAgd2hpbGUgKChsb2MgPSBuYW1lc3BhY2VzX2xlZnQuZmluZCgiLiIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICBwYXRoX3ByZWZpeCA9IHBhdGhfcHJlZml4ICsgdW5kZXJzY29yZShuYW1lc3BhY2VzX2xlZnQuc3Vic3RyKDAsIGxvYykpICsgIi8iOwotICAgIG5hbWVzcGFjZXNfbGVmdCA9IG5hbWVzcGFjZXNfbGVmdC5zdWJzdHIobG9jICsgMSk7Ci0gIH0KLSAgaWYgKG5hbWVzcGFjZXNfbGVmdC5zaXplKCkgPiAwKSB7Ci0gICAgcGF0aF9wcmVmaXggPSBwYXRoX3ByZWZpeCArIHVuZGVyc2NvcmUobmFtZXNwYWNlc19sZWZ0KSArICIvIjsKLSAgfQotICByZXR1cm4gcGF0aF9wcmVmaXg7Ci19Ci0KLXZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3Jkb2ModF9yYl9vZnN0cmVhbSYgb3V0LCB0X2RvYyogdGRvYykgewotICBpZiAodGRvYy0+aGFzX2RvYygpKSB7Ci0gICAgb3V0LmluZGVudCgpOwotICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwgIiIsICIjICIsIHRkb2MtPmdldF9kb2MoKSwgIiIpOwotICB9Ci19Ci0KLXZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3JiX3N0cnVjdF9yZXF1aXJlZF92YWxpZGF0b3IodF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBvdXQuaW5kZW50KCkgPDwgImRlZiB2YWxpZGF0ZSIgPDwgZW5kbDsKLSAgb3V0LmluZGVudF91cCgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKCpmX2l0ZXIpOwotICAgIGlmIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICAgIG91dC5pbmRlbnQoKSA8PCAicmFpc2UgOjpUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uLm5ldyg6OlRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb246OlVOS05PV04sICIKLSAgICAgICAgICAgICAgICAgICAgICAiJ1JlcXVpcmVkIGZpZWxkICIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiBpcyB1bnNldCEnKSI7Ci0gICAgICBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX2Jvb2woKSkgewotICAgICAgICBvdXQgPDwgIiBpZiBAIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiLm5pbD8iOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8ICIgdW5sZXNzIEAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpOwotICAgICAgfQotICAgICAgb3V0IDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgLy8gaWYgZmllbGQgaXMgYW4gZW51bSwgY2hlY2sgdGhhdCBpdHMgdmFsdWUgaXMgdmFsaWQKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqZl9pdGVyKTsKLQotICAgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfZW51bSgpKSB7Ci0gICAgICBvdXQuaW5kZW50KCkgPDwgInVubGVzcyBAIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiLm5pbD8gfHwgIgotICAgICAgICAgICAgICAgICAgIDw8IGZ1bGxfdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiOjpWQUxJRF9WQUxVRVMuaW5jbHVkZT8oQCIKLSAgICAgICAgICAgICAgICAgICA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKSIgPDwgZW5kbDsKLSAgICAgIG91dC5pbmRlbnRfdXAoKTsKLSAgICAgIG91dC5pbmRlbnQoKSA8PCAicmFpc2UgOjpUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uLm5ldyg6OlRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb246OlVOS05PV04sICIKLSAgICAgICAgICAgICAgICAgICAgICAiJ0ludmFsaWQgdmFsdWUgb2YgZmllbGQgIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiIScpIiA8PCBlbmRsOwotICAgICAgb3V0LmluZGVudF9kb3duKCk7Ci0gICAgICBvdXQuaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBvdXQuaW5kZW50X2Rvd24oKTsKLSAgb3V0LmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmJfdW5pb25fdmFsaWRhdG9yKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0LmluZGVudCgpIDw8ICJkZWYgdmFsaWRhdGUiIDw8IGVuZGw7Ci0gIG91dC5pbmRlbnRfdXAoKTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgb3V0LmluZGVudCgpCi0gICAgICA8PCAicmFpc2UoU3RhbmRhcmRFcnJvciwgJ1VuaW9uIGZpZWxkcyBhcmUgbm90IHNldC4nKSBpZiBnZXRfc2V0X2ZpZWxkLm5pbD8gfHwgZ2V0X3ZhbHVlLm5pbD8iCi0gICAgICA8PCBlbmRsOwotCi0gIC8vIGlmIGZpZWxkIGlzIGFuIGVudW0sIGNoZWNrIHRoYXQgaXRzIHZhbHVlIGlzIHZhbGlkCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgY29uc3QgdF9maWVsZCogZmllbGQgPSAoKmZfaXRlcik7Ci0KLSAgICBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX2VudW0oKSkgewotICAgICAgb3V0LmluZGVudCgpIDw8ICJpZiBnZXRfc2V0X2ZpZWxkID09IDoiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8IGVuZGw7Ci0gICAgICBvdXQuaW5kZW50KCkgPDwgIiAgcmFpc2UgIgotICAgICAgICAgICAgICAgICAgICAgICI6OlRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24ubmV3KDo6VGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbjo6VU5LTk9XTiwgIgotICAgICAgICAgICAgICAgICAgICAgICInSW52YWxpZCB2YWx1ZSBvZiBmaWVsZCAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIhJykgdW5sZXNzICIKLSAgICAgICAgICAgICAgICAgICA8PCBmdWxsX3R5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSkgPDwgIjo6VkFMSURfVkFMVUVTLmluY2x1ZGU/KGdldF92YWx1ZSkiCi0gICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgIG91dC5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIG91dC5pbmRlbnRfZG93bigpOwotICBvdXQuaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi1USFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAotICAgIHJiLAotICAgICJSdWJ5IiwKLSAgICAiICAgIHJ1YnlnZW1zOiAgICAgICAgQWRkIGEgXCJyZXF1aXJlICdydWJ5Z2VtcydcIiBsaW5lIHRvIHRoZSB0b3Agb2YgZWFjaCBnZW5lcmF0ZWQgZmlsZS5cbiIKLSAgICAiICAgIG5hbWVzcGFjZWQ6ICAgICAgR2VuZXJhdGUgZmlsZXMgaW4gaWRpb21hdGljIG5hbWVzcGFjZWQgZGlyZWN0b3JpZXMuXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3N0X2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9zdF9nZW5lcmF0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMzVmNjguLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3N0X2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDEwNDkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgotICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKLSAqIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0KLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotI2luY2x1ZGUgInRfb29wX2dlbmVyYXRvci5oIgotI2luY2x1ZGUgInZlcnNpb24uaCIKLQotdXNpbmcgc3RkOjptYXA7Ci11c2luZyBzdGQ6Om9mc3RyZWFtOwotdXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwotdXNpbmcgc3RkOjpzdHJpbmc7Ci11c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKLXVzaW5nIHN0ZDo6dmVjdG9yOwotCi1zdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCi0KLS8qKgotICogU21hbGx0YWxrIGNvZGUgZ2VuZXJhdG9yLgotICoKLSAqLwotY2xhc3MgdF9zdF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKLXB1YmxpYzoKLSAgdF9zdF9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAotICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKLSAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCi0gICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgewotICAgICh2b2lkKXBhcnNlZF9vcHRpb25zOwotICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7Ci0gICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tc3QiOwotICB9Ci0KLSAgLyoqCi0gICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKLSAgICovCi0KLSAgdm9pZCBpbml0X2dlbmVyYXRvcigpOwotICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOwotCi0gIC8qKgotICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKLSAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOwotICB2b2lkIGdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX2NsYXNzX3NpZGVfZGVmaW5pdGlvbigpOwotICB2b2lkIGdlbmVyYXRlX2ZvcmNlX2NvbnN0cygpOwotCi0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKLQotICAvKioKLSAgICogU3RydWN0IGdlbmVyYXRpb24gY29kZQotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3N0X3N0cnVjdChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfYWNjZXNzb3JzKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotCi0gIC8qKgotICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZW5kX21ldGhvZCh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotICB2b2lkIGdlbmVyYXRlX3JlY3ZfbWV0aG9kKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0KLSAgc3RkOjpzdHJpbmcgbWFwX3JlYWRlcih0X21hcCogdG1hcCk7Ci0gIHN0ZDo6c3RyaW5nIGxpc3RfcmVhZGVyKHRfbGlzdCogdGxpc3QpOwotICBzdGQ6OnN0cmluZyBzZXRfcmVhZGVyKHRfc2V0KiB0c2V0KTsKLSAgc3RkOjpzdHJpbmcgc3RydWN0X3JlYWRlcih0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgY2xzTmFtZSk7Ci0KLSAgc3RkOjpzdHJpbmcgbWFwX3dyaXRlcih0X21hcCogdG1hcCwgc3RkOjpzdHJpbmcgbmFtZSk7Ci0gIHN0ZDo6c3RyaW5nIGxpc3Rfd3JpdGVyKHRfbGlzdCogdGxpc3QsIHN0ZDo6c3RyaW5nIG5hbWUpOwotICBzdGQ6OnN0cmluZyBzZXRfd3JpdGVyKHRfc2V0KiB0c2V0LCBzdGQ6OnN0cmluZyBuYW1lKTsKLSAgc3RkOjpzdHJpbmcgc3RydWN0X3dyaXRlcih0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgZm5hbWUpOwotCi0gIHN0ZDo6c3RyaW5nIHdyaXRlX3ZhbCh0X3R5cGUqIHQsIHN0ZDo6c3RyaW5nIGZuYW1lKTsKLSAgc3RkOjpzdHJpbmcgcmVhZF92YWwodF90eXBlKiB0KTsKLQotICAvKioKLSAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKLSAgICovCi0KLSAgc3RkOjpzdHJpbmcgc3RfYXV0b2dlbl9jb21tZW50KCk7Ci0KLSAgdm9pZCBzdF9jbGFzc19kZWYoc3RkOjpvZnN0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBuYW1lKTsKLSAgdm9pZCBzdF9tZXRob2Qoc3RkOjpvZnN0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBjbHMsIHN0ZDo6c3RyaW5nIG5hbWUpOwotICB2b2lkIHN0X21ldGhvZChzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIGNscywgc3RkOjpzdHJpbmcgbmFtZSwgc3RkOjpzdHJpbmcgY2F0ZWdvcnkpOwotICB2b2lkIHN0X2Nsb3NlX21ldGhvZChzdGQ6Om9mc3RyZWFtJiBvdXQpOwotICB2b2lkIHN0X2NsYXNzX21ldGhvZChzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIGNscywgc3RkOjpzdHJpbmcgbmFtZSk7Ci0gIHZvaWQgc3RfY2xhc3NfbWV0aG9kKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgY2xzLCBzdGQ6OnN0cmluZyBuYW1lLCBzdGQ6OnN0cmluZyBjYXRlZ29yeSk7Ci0gIHZvaWQgc3Rfc2V0dGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgY2xzLCBzdGQ6OnN0cmluZyBuYW1lLCBzdGQ6OnN0cmluZyB0eXBlKTsKLSAgdm9pZCBzdF9nZXR0ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBjbHMsIHN0ZDo6c3RyaW5nIG5hbWUpOwotICB2b2lkIHN0X2FjY2Vzc29ycyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIGNscywgc3RkOjpzdHJpbmcgbmFtZSwgc3RkOjpzdHJpbmcgdHlwZSk7Ci0KLSAgc3RkOjpzdHJpbmcgY2xhc3NfbmFtZSgpOwotICBzdGF0aWMgYm9vbCBpc192YWxpZF9uYW1lc3BhY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHN1Yl9uYW1lc3BhY2UpOwotICBzdGQ6OnN0cmluZyBjbGllbnRfY2xhc3NfbmFtZSgpOwotICBzdGQ6OnN0cmluZyBwcmVmaXgoc3RkOjpzdHJpbmcgbmFtZSk7Ci0gIHN0ZDo6c3RyaW5nIGRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkKTsKLSAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpOwotCi0gIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fdHlwZXNfY29tbWVudCh0X2Z1bmN0aW9uKiBmbik7Ci0KLSAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOwotICBzdGQ6OnN0cmluZyBhX3R5cGUodF90eXBlKiB0eXBlKTsKLSAgYm9vbCBpc192b3dlbChjaGFyIGMpOwotICBzdGQ6OnN0cmluZyB0ZW1wX25hbWUoKTsKLSAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVkX2NhdGVnb3J5KCk7Ci0KLXByaXZhdGU6Ci0gIC8qKgotICAgKiBGaWxlIHN0cmVhbXMKLSAgICovCi0gIGludCB0ZW1wb3JhcnlfdmFyOwotICBzdGQ6Om9mc3RyZWFtIGZfOwotfTsKLQotLyoqCi0gKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAotICogc3RyZWFtcy4KLSAqCi0gKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKLSAqLwotdm9pZCB0X3N0X2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQotICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOwotCi0gIHRlbXBvcmFyeV92YXIgPSAwOwotCi0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyAiLyIgKyBwcm9ncmFtX25hbWVfICsgIi5zdCI7Ci0gIGZfLm9wZW4oZl9uYW1lLmNfc3RyKCkpOwotCi0gIC8vIFByaW50IGhlYWRlcgotICBmXyA8PCBzdF9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOwotCi0gIHN0X2NsYXNzX2RlZihmXywgcHJvZ3JhbV9uYW1lXyk7Ci0gIGdlbmVyYXRlX2NsYXNzX3NpZGVfZGVmaW5pdGlvbigpOwotCi0gIC8vIEdlbmVyYXRlIGVudW1zCi0gIHZlY3Rvcjx0X2VudW0qPiBlbnVtcyA9IHByb2dyYW1fLT5nZXRfZW51bXMoKTsKLSAgdmVjdG9yPHRfZW51bSo+OjppdGVyYXRvciBlbl9pdGVyOwotICBmb3IgKGVuX2l0ZXIgPSBlbnVtcy5iZWdpbigpOyBlbl9pdGVyICE9IGVudW1zLmVuZCgpOyArK2VuX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9lbnVtKCplbl9pdGVyKTsKLSAgfQotfQotCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6OmNsYXNzX25hbWUoKSB7Ci0gIHJldHVybiBjYXBpdGFsaXplKHByb2dyYW1fbmFtZV8pOwotfQotCi1ib29sIHRfc3RfZ2VuZXJhdG9yOjppc192YWxpZF9uYW1lc3BhY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHN1Yl9uYW1lc3BhY2UpIHsKLSAgcmV0dXJuIHN1Yl9uYW1lc3BhY2UgPT0gInByZWZpeCIgfHwgc3ViX25hbWVzcGFjZSA9PSAiY2F0ZWdvcnkiOwotfQotCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6OnByZWZpeChzdHJpbmcgY2xhc3NfbmFtZSkgewotICBzdHJpbmcgcHJlZml4ID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoInNtYWxsdGFsay5wcmVmaXgiKTsKLSAgc3RyaW5nIG5hbWUgPSBjYXBpdGFsaXplKGNsYXNzX25hbWUpOwotICBuYW1lID0gcHJlZml4LmVtcHR5KCkgPyBuYW1lIDogKHByZWZpeCArIG5hbWUpOwotICByZXR1cm4gbmFtZTsKLX0KLQotc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjpjbGllbnRfY2xhc3NfbmFtZSgpIHsKLSAgcmV0dXJuIGNhcGl0YWxpemUoc2VydmljZV9uYW1lXykgKyAiQ2xpZW50IjsKLX0KLQotLyoqCi0gKiBBdXRvZ2VuJ2QgY29tbWVudAotICovCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6OnN0X2F1dG9nZW5fY29tbWVudCgpIHsKLSAgcmV0dXJuIHN0ZDo6c3RyaW5nKCInIikgKyAiQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKCIgKyBUSFJJRlRfVkVSU0lPTiArICIpXG4iICsgIlxuIgotICAgICAgICAgKyAiRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lOR1xuIiArICInIVxuIjsKLX0KLQotdm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZm9yY2VfY29uc3RzKCkgewotICBmXyA8PCBwcmVmaXgoY2xhc3NfbmFtZSgpKSA8PCAiIGVudW1zIGtleXNBbmRWYWx1ZXNEbzogWzprIDp2IHwgIiA8PCBwcmVmaXgoY2xhc3NfbmFtZSgpKQotICAgICA8PCAiIGVudW1zIGF0OiBrIHB1dDogdiB2YWx1ZV0uISIgPDwgZW5kbDsKLQotICBmXyA8PCBwcmVmaXgoY2xhc3NfbmFtZSgpKSA8PCAiIGNvbnN0YW50cyBrZXlzQW5kVmFsdWVzRG86IFs6ayA6diB8ICIgPDwgcHJlZml4KGNsYXNzX25hbWUoKSkKLSAgICAgPDwgIiBjb25zdGFudHMgYXQ6IGsgcHV0OiB2IHZhbHVlXS4hIiA8PCBlbmRsOwotfQotCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7Ci0gIGdlbmVyYXRlX2ZvcmNlX2NvbnN0cygpOwotICBmXy5jbG9zZSgpOwotfQotCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlZF9jYXRlZ29yeSgpIHsKLSAgc3RyaW5nIGNhdCA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJzbWFsbHRhbGsuY2F0ZWdvcnkiKTsKLSAgLy8gRm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgVGhyaWZ0IGdyYW1tYXIsIHRoZSBjYXRlZ29yeSBtdXN0Ci0gIC8vIGJlIHB1bmN0dWF0ZWQgYnkgZG90cy4gIFJlcGxhY2VzIHRoZW0gd2l0aCBkYXNoZXMgaGVyZS4KLSAgZm9yIChzdHJpbmc6Oml0ZXJhdG9yIGl0ZXIgPSBjYXQuYmVnaW4oKTsgaXRlciAhPSBjYXQuZW5kKCk7ICsraXRlcikgewotICAgIGlmICgqaXRlciA9PSAnLicpIHsKLSAgICAgICppdGVyID0gJy0nOwotICAgIH0KLSAgfQotICByZXR1cm4gY2F0LnNpemUoKSA/IGNhdCA6ICJHZW5lcmF0ZWQtIiArIGNsYXNzX25hbWUoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBUaGlzIGlzIG5vdCBkb25lIGluIFNtYWxsdGFsaywgdHlwZXMgYXJlIGFsbCBpbXBsaWNpdC4KLSAqCi0gKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgotICovCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKLSAgKHZvaWQpdHR5cGVkZWY7Ci19Ci0KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OnN0X2NsYXNzX2RlZihzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lKSB7Ci0gIG91dCA8PCAiT2JqZWN0IHN1YmNsYXNzOiAjIiA8PCBwcmVmaXgobmFtZSkgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiaW5zdGFuY2VWYXJpYWJsZU5hbWVzOiAnJyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiY2xhc3NWYXJpYWJsZU5hbWVzOiAnJyIKLSAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInBvb2xEaWN0aW9uYXJpZXM6ICcnIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJjYXRlZ29yeTogJyIKLSAgICAgIDw8IGdlbmVyYXRlZF9jYXRlZ29yeSgpIDw8ICInISIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpzdF9tZXRob2Qoc3RkOjpvZnN0cmVhbSYgb3V0LCBzdHJpbmcgY2xzLCBzdHJpbmcgbmFtZSkgewotICBzdF9tZXRob2Qob3V0LCBjbHMsIG5hbWUsICJhcyB5ZXQgdW5jYXRlZ29yaXplZCIpOwotfQotCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpzdF9jbGFzc19tZXRob2Qoc3RkOjpvZnN0cmVhbSYgb3V0LCBzdHJpbmcgY2xzLCBzdHJpbmcgbmFtZSkgewotICBzdF9tZXRob2Qob3V0LCBjbHMgKyAiIGNsYXNzIiwgbmFtZSk7Ci19Ci0KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OnN0X2NsYXNzX21ldGhvZChzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0cmluZyBjbHMsIHN0cmluZyBuYW1lLCBzdHJpbmcgY2F0ZWdvcnkpIHsKLSAgc3RfbWV0aG9kKG91dCwgY2xzLCBuYW1lLCBjYXRlZ29yeSk7Ci19Ci0KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OnN0X21ldGhvZChzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0cmluZyBjbHMsIHN0cmluZyBuYW1lLCBzdHJpbmcgY2F0ZWdvcnkpIHsKLSAgY2hhciB0aW1lc3RyWzUwXTsKLSAgdGltZV90IHJhd3RpbWU7Ci0gIHN0cnVjdCB0bSogdGluZm87Ci0KLSAgdGltZSgmcmF3dGltZSk7Ci0gIHRpbmZvID0gbG9jYWx0aW1lKCZyYXd0aW1lKTsKLSAgc3RyZnRpbWUodGltZXN0ciwgNTAsICIlbS8lZC8lWSAlSDolTSIsIHRpbmZvKTsKLQotICBvdXQgPDwgIiEiIDw8IHByZWZpeChjbHMpIDw8ICIgbWV0aG9kc0ZvcjogJyIgKyBjYXRlZ29yeSArICInIHN0YW1wOiAndGhyaWZ0ICIgPDwgdGltZXN0cgotICAgICAgPDwgIichXG4iIDw8IG5hbWUgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLSAgb3V0IDw8IGluZGVudCgpOwotfQotCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpzdF9jbG9zZV9tZXRob2Qoc3RkOjpvZnN0cmVhbSYgb3V0KSB7Ci0gIG91dCA8PCAiISAhIiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci19Ci0KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OnN0X3NldHRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdHlwZSA9ICJhbk9iamVjdCIpIHsKLSAgc3RfbWV0aG9kKG91dCwgY2xzLCBuYW1lICsgIjogIiArIHR5cGUpOwotICBvdXQgPDwgbmFtZSA8PCAiIDo9ICIgKyB0eXBlOwotICBzdF9jbG9zZV9tZXRob2Qob3V0KTsKLX0KLQotdm9pZCB0X3N0X2dlbmVyYXRvcjo6c3RfZ2V0dGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RyaW5nIGNscywgc3RyaW5nIG5hbWUpIHsKLSAgc3RfbWV0aG9kKG91dCwgY2xzLCBuYW1lICsgIiIpOwotICBvdXQgPDwgIl4gIiA8PCBuYW1lOwotICBzdF9jbG9zZV9tZXRob2Qob3V0KTsKLX0KLQotdm9pZCB0X3N0X2dlbmVyYXRvcjo6c3RfYWNjZXNzb3JzKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2xzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0eXBlID0gImFuT2JqZWN0IikgewotICBzdF9zZXR0ZXIob3V0LCBjbHMsIG5hbWUsIHR5cGUpOwotICBzdF9nZXR0ZXIob3V0LCBjbHMsIG5hbWUpOwotfQotCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jbGFzc19zaWRlX2RlZmluaXRpb24oKSB7Ci0gIGZfIDw8IHByZWZpeChjbGFzc19uYW1lKCkpIDw8ICIgY2xhc3MiIDw8IGVuZGwgPDwgIlx0aW5zdGFuY2VWYXJpYWJsZU5hbWVzOiAnY29uc3RhbnRzIGVudW1zJyEiCi0gICAgIDw8IGVuZGwgPDwgZW5kbDsKLQotICBzdF9hY2Nlc3NvcnMoZl8sIGNsYXNzX25hbWUoKSArICIgY2xhc3MiLCAiZW51bXMiKTsKLSAgc3RfYWNjZXNzb3JzKGZfLCBjbGFzc19uYW1lKCkgKyAiIGNsYXNzIiwgImNvbnN0YW50cyIpOwotCi0gIGZfIDw8IHByZWZpeChjbGFzc19uYW1lKCkpIDw8ICIgZW51bXM6IERpY3Rpb25hcnkgbmV3ISIgPDwgZW5kbDsKLSAgZl8gPDwgcHJlZml4KGNsYXNzX25hbWUoKSkgPDwgIiBjb25zdGFudHM6IERpY3Rpb25hcnkgbmV3ISIgPDwgZW5kbDsKLQotICBmXyA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuIERvbmUgdXNpbmcgYSBjbGFzcyB0byBzY29wZQotICogdGhlIHZhbHVlcy4KLSAqCi0gKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCi0gKi8KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgewotICBzdHJpbmcgY2xzX25hbWUgPSBwcm9ncmFtX25hbWVfICsgY2FwaXRhbGl6ZSh0ZW51bS0+Z2V0X25hbWUoKSk7Ci0KLSAgZl8gPDwgcHJlZml4KGNsYXNzX25hbWUoKSkgPDwgIiBlbnVtcyBhdDogJyIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIicgcHV0OiBbIgotICAgICA8PCAiKERpY3Rpb25hcnkgbmV3ICIgPDwgZW5kbDsKLQotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICBmXyA8PCAiXHRhdDogJyIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInIHB1dDogIiA8PCB2YWx1ZSA8PCAiOyIgPDwgZW5kbDsKLSAgfQotCi0gIGZfIDw8ICJcdHlvdXJzZWxmKV0hIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGUgYSBjb25zdGFudCB2YWx1ZQotICovCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKLSAgdF90eXBlKiB0eXBlID0gdGNvbnN0LT5nZXRfdHlwZSgpOwotICBzdHJpbmcgbmFtZSA9IHRjb25zdC0+Z2V0X25hbWUoKTsKLSAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSB0Y29uc3QtPmdldF92YWx1ZSgpOwotCi0gIGZfIDw8IHByZWZpeChjbGFzc19uYW1lKCkpIDw8ICIgY29uc3RhbnRzIGF0OiAnIiA8PCBuYW1lIDw8ICInIHB1dDogWyIKLSAgICAgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlKSA8PCAiXSEiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKLSAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCi0gKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYwotICovCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgb3V0IDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIG91dCA8PCAodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwID8gInRydWUiIDogImZhbHNlIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7Ci0gICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgb3V0IDw8ICIoIiA8PCBjYXBpdGFsaXplKHR5cGUtPmdldF9uYW1lKCkpIDw8ICIgbmV3ICIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotCi0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7Ci0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgewotICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgIH0KLQotICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSA8PCAiOiAiCi0gICAgICAgICAgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKSA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJ5b3Vyc2VsZikiOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICBvdXQgPDwgIihEaWN0aW9uYXJ5IG5ldyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgaW5kZW50KCk7Ci0gICAgICBvdXQgPDwgImF0OiAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgdl9pdGVyLT5maXJzdCk7Ci0gICAgICBvdXQgPDwgIiBwdXQ6ICI7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCBpbmRlbnQoKSA8PCAieW91cnNlbGYpIjsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgdF90eXBlKiBldHlwZTsKLSAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfQotICAgIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgICAgb3V0IDw8ICIoU2V0IG5ldyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8ICIoT3JkZXJlZENvbGxlY3Rpb24gbmV3IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBpbmRlbnQoKTsKLSAgICAgIG91dCA8PCAiYWRkOiAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlcik7Ci0gICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCBpbmRlbnQoKSA8PCAieW91cnNlbGYpIjsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBDT05TVEFOVCBGT1IgVFlQRTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLSAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBTbWFsbHRhbGsgc3RydWN0Ci0gKi8KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBnZW5lcmF0ZV9zdF9zdHJ1Y3QoZl8sIHRzdHJ1Y3QsIGZhbHNlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZXhjZXB0aW9uLiBCYXNpY2FsbHkgdGhlIHNhbWUKLSAqIGFzIGEgc3RydWN0IGJ1dCBleHRlbmRzIHRoZSBFeGNlcHRpb24gY2xhc3MuCi0gKgotICogQHBhcmFtIHR4Y2VwdGlvbiBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9zdF9zdHJ1Y3QoZl8sIHR4Y2VwdGlvbiwgdHJ1ZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc21hbGx0YWxrIGNsYXNzIHRvIHJlcHJlc2VudCBhIHN0cnVjdAotICovCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdF9zdHJ1Y3Qoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uID0gZmFsc2UpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBpZiAoaXNfZXhjZXB0aW9uKQotICAgIG91dCA8PCAiRXJyb3IiOwotICBlbHNlCi0gICAgb3V0IDw8ICJPYmplY3QiOwotCi0gIG91dCA8PCAiIHN1YmNsYXNzOiAjIiA8PCBwcmVmaXgodHlwZV9uYW1lKHRzdHJ1Y3QpKSA8PCBlbmRsIDw8ICJcdGluc3RhbmNlVmFyaWFibGVOYW1lczogJyI7Ci0KLSAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgewotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIGlmIChtX2l0ZXIgIT0gbWVtYmVycy5iZWdpbigpKQotICAgICAgICBvdXQgPDwgIiAiOwotICAgICAgb3V0IDw8IGNhbWVsY2FzZSgoKm1faXRlciktPmdldF9uYW1lKCkpOwotICAgIH0KLSAgfQotCi0gIG91dCA8PCAiJ1xuIgotICAgICAgPDwgIlx0Y2xhc3NWYXJpYWJsZU5hbWVzOiAnJ1xuIgotICAgICAgPDwgIlx0cG9vbERpY3Rpb25hcmllczogJydcbiIKLSAgICAgIDw8ICJcdGNhdGVnb3J5OiAnIiA8PCBnZW5lcmF0ZWRfY2F0ZWdvcnkoKSA8PCAiJyFcblxuIjsKLQotICBnZW5lcmF0ZV9hY2Nlc3NvcnMob3V0LCB0c3RydWN0KTsKLX0KLQotYm9vbCB0X3N0X2dlbmVyYXRvcjo6aXNfdm93ZWwoY2hhciBjKSB7Ci0gIHN3aXRjaCAodG9sb3dlcihjKSkgewotICBjYXNlICdhJzoKLSAgY2FzZSAnZSc6Ci0gIGNhc2UgJ2knOgotICBjYXNlICdvJzoKLSAgY2FzZSAndSc6Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6OmFfdHlwZSh0X3R5cGUqIHR5cGUpIHsKLSAgc3RyaW5nIHByZWZpeDsKLQotICBpZiAoaXNfdm93ZWwodHlwZV9uYW1lKHR5cGUpWzBdKSkKLSAgICBwcmVmaXggPSAiYW4iOwotICBlbHNlCi0gICAgcHJlZml4ID0gImEiOwotCi0gIHJldHVybiBwcmVmaXggKyBjYXBpdGFsaXplKHR5cGVfbmFtZSh0eXBlKSk7Ci19Ci0KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX2FjY2Vzc29ycyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIHN0cmluZyB0eXBlOwotICBzdHJpbmcgcHJlZml4OwotCi0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBzdF9hY2Nlc3NvcnMob3V0LAotICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUodHlwZV9uYW1lKHRzdHJ1Y3QpKSwKLSAgICAgICAgICAgICAgICAgICBjYW1lbGNhc2UoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSwKLSAgICAgICAgICAgICAgICAgICBhX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSk7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKLSAgLy8gZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOwotfQotCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6OnRlbXBfbmFtZSgpIHsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKLSAgb3V0IDw8ICJ0ZW1wIiA8PCB0ZW1wb3JhcnlfdmFyKys7Ci0gIHJldHVybiBvdXQuc3RyKCk7Ci19Ci0KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6bWFwX3dyaXRlcih0X21hcCogdG1hcCwgc3RyaW5nIGZuYW1lKSB7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7Ci0gIHN0cmluZyBrZXkgPSB0ZW1wX25hbWUoKTsKLSAgc3RyaW5nIHZhbCA9IHRlbXBfbmFtZSgpOwotCi0gIG91dCA8PCAiW29wcm90IHdyaXRlTWFwQmVnaW46IChUTWFwIG5ldyBrZXlUeXBlOiAiIDw8IHR5cGVfdG9fZW51bSh0bWFwLT5nZXRfa2V5X3R5cGUoKSkKLSAgICAgIDw8ICI7IHZhbHVlVHlwZTogIiA8PCB0eXBlX3RvX2VudW0odG1hcC0+Z2V0X3ZhbF90eXBlKCkpIDw8ICI7IHNpemU6ICIgPDwgZm5hbWUgPDwgIiBzaXplKS4iCi0gICAgICA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgZm5hbWUgPDwgIiBrZXlzQW5kVmFsdWVzRG86IFs6IiA8PCBrZXkgPDwgIiA6IiA8PCB2YWwgPDwgIiB8IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgd3JpdGVfdmFsKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpIDw8ICIuIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICA8PCB3cml0ZV92YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgb3V0IDw8ICJdLiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qgd3JpdGVNYXBFbmRdIHZhbHVlIjsKLSAgaW5kZW50X2Rvd24oKTsKLQotICByZXR1cm4gb3V0LnN0cigpOwotfQotCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6Om1hcF9yZWFkZXIodF9tYXAqIHRtYXApIHsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKLSAgc3RyaW5nIGRlc2MgPSB0ZW1wX25hbWUoKTsKLSAgc3RyaW5nIHZhbCA9IHRlbXBfbmFtZSgpOwotCi0gIG91dCA8PCAiW3wiIDw8IGRlc2MgPDwgIiAiIDw8IHZhbCA8PCAifCAiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCBkZXNjIDw8ICIgOj0gaXByb3QgcmVhZE1hcEJlZ2luLiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCB2YWwKLSAgICAgIDw8ICIgOj0gRGljdGlvbmFyeSBuZXcuIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IGRlc2MgPDwgIiBzaXplIHRpbWVzUmVwZWF0OiBbIiA8PCBlbmRsOwotCi0gIGluZGVudF91cCgpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgdmFsIDw8ICIgYXQ6ICIgPDwgcmVhZF92YWwodG1hcC0+Z2V0X2tleV90eXBlKCkpCi0gICAgICA8PCAiIHB1dDogIiA8PCByZWFkX3ZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSk7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgb3V0IDw8ICJdLiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaXByb3QgcmVhZE1hcEVuZC4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgdmFsIDw8ICJdIHZhbHVlIjsKLSAgaW5kZW50X2Rvd24oKTsKLQotICByZXR1cm4gb3V0LnN0cigpOwotfQotCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6Omxpc3Rfd3JpdGVyKHRfbGlzdCogdGxpc3QsIHN0cmluZyBmbmFtZSkgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotICBzdHJpbmcgdmFsID0gdGVtcF9uYW1lKCk7Ci0KLSAgb3V0IDw8ICJbb3Byb3Qgd3JpdGVMaXN0QmVnaW46IChUTGlzdCBuZXcgZWxlbVR5cGU6ICIgPDwgdHlwZV90b19lbnVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCkpCi0gICAgICA8PCAiOyBzaXplOiAiIDw8IGZuYW1lIDw8ICIgc2l6ZSkuIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgZm5hbWUgPDwgIiBkbzogWzoiIDw8IHZhbCA8PCAifCIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8IHdyaXRlX3ZhbCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCB2YWwpIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgb3V0IDw8ICJdLiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qgd3JpdGVMaXN0RW5kXSB2YWx1ZSI7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjpsaXN0X3JlYWRlcih0X2xpc3QqIHRsaXN0KSB7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7Ci0gIHN0cmluZyBkZXNjID0gdGVtcF9uYW1lKCk7Ci0gIHN0cmluZyB2YWwgPSB0ZW1wX25hbWUoKTsKLQotICBvdXQgPDwgIlt8IiA8PCBkZXNjIDw8ICIgIiA8PCB2YWwgPDwgInwgIiA8PCBkZXNjIDw8ICIgOj0gaXByb3QgcmVhZExpc3RCZWdpbi4iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCB2YWwgPDwgIiA6PSBPcmRlcmVkQ29sbGVjdGlvbiBuZXcuIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IGRlc2MKLSAgICAgIDw8ICIgc2l6ZSB0aW1lc1JlcGVhdDogWyIgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLSAgb3V0IDw8IGluZGVudCgpIDw8IHZhbCA8PCAiIGFkZDogIiA8PCByZWFkX3ZhbCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpKTsKLSAgaW5kZW50X2Rvd24oKTsKLQotICBvdXQgPDwgIl0uIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpcHJvdCByZWFkTGlzdEVuZC4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgdmFsIDw8ICJdIHZhbHVlIjsKLSAgaW5kZW50X2Rvd24oKTsKLQotICByZXR1cm4gb3V0LnN0cigpOwotfQotCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6OnNldF93cml0ZXIodF9zZXQqIHRzZXQsIHN0cmluZyBmbmFtZSkgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotICBzdHJpbmcgdmFsID0gdGVtcF9uYW1lKCk7Ci0KLSAgb3V0IDw8ICJbb3Byb3Qgd3JpdGVTZXRCZWdpbjogKFRTZXQgbmV3IGVsZW1UeXBlOiAiIDw8IHR5cGVfdG9fZW51bSh0c2V0LT5nZXRfZWxlbV90eXBlKCkpCi0gICAgICA8PCAiOyBzaXplOiAiIDw8IGZuYW1lIDw8ICIgc2l6ZSkuIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgZm5hbWUgPDwgIiBkbzogWzoiIDw8IHZhbCA8PCAifCIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8IHdyaXRlX3ZhbCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIHZhbCkgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLQotICBvdXQgPDwgIl0uIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdCB3cml0ZVNldEVuZF0gdmFsdWUiOwotICBpbmRlbnRfZG93bigpOwotCi0gIHJldHVybiBvdXQuc3RyKCk7Ci19Ci0KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6c2V0X3JlYWRlcih0X3NldCogdHNldCkgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotICBzdHJpbmcgZGVzYyA9IHRlbXBfbmFtZSgpOwotICBzdHJpbmcgdmFsID0gdGVtcF9uYW1lKCk7Ci0KLSAgb3V0IDw8ICJbfCIgPDwgZGVzYyA8PCAiICIgPDwgdmFsIDw8ICJ8ICIgPDwgZGVzYyA8PCAiIDo9IGlwcm90IHJlYWRTZXRCZWdpbi4iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCB2YWwgPDwgIiA6PSBTZXQgbmV3LiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBkZXNjIDw8ICIgc2l6ZSB0aW1lc1JlcGVhdDogWyIKLSAgICAgIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCB2YWwgPDwgIiBhZGQ6ICIgPDwgcmVhZF92YWwodHNldC0+Z2V0X2VsZW1fdHlwZSgpKTsKLSAgaW5kZW50X2Rvd24oKTsKLQotICBvdXQgPDwgIl0uIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpcHJvdCByZWFkU2V0RW5kLiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCB2YWwgPDwgIl0gdmFsdWUiOwotICBpbmRlbnRfZG93bigpOwotCi0gIHJldHVybiBvdXQuc3RyKCk7Ci19Ci0KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6c3RydWN0X3dyaXRlcih0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHNuYW1lKSB7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLQotICBvdXQgPDwgIltvcHJvdCB3cml0ZVN0cnVjdEJlZ2luOiAiCi0gICAgICA8PCAiKFRTdHJ1Y3QgbmV3IG5hbWU6ICciICsgdHN0cnVjdC0+Z2V0X25hbWUoKSArICInKS4iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgYm9vbCBvcHRpb25hbCA9ICgqZmxkX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKLSAgICBzdHJpbmcgZm5hbWUgPSBjYW1lbGNhc2UoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpOwotICAgIHN0cmluZyBhY2Nlc3NvciA9IHNuYW1lICsgIiAiICsgY2FtZWxjYXNlKGZuYW1lKTsKLQotICAgIGlmIChvcHRpb25hbCkgewotICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGFjY2Vzc29yIDw8ICIgaWZOb3ROaWw6IFsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90IHdyaXRlRmllbGRCZWdpbjogKFRGaWVsZCBuZXcgbmFtZTogJyIgPDwgZm5hbWUKLSAgICAgICAgPDwgIic7IHR5cGU6ICIgPDwgdHlwZV90b19lbnVtKCgqZmxkX2l0ZXIpLT5nZXRfdHlwZSgpKQotICAgICAgICA8PCAiOyBpZDogIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpLiIgPDwgZW5kbDsKLQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCB3cml0ZV92YWwoKCpmbGRfaXRlciktPmdldF90eXBlKCksIGFjY2Vzc29yKSA8PCAiLiIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICA8PCAib3Byb3Qgd3JpdGVGaWVsZEVuZCI7Ci0KLSAgICBpZiAob3B0aW9uYWwpIHsKLSAgICAgIG91dCA8PCAiXSI7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgIH0KLQotICAgIG91dCA8PCAiLiIgPDwgZW5kbDsKLSAgfQotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qgd3JpdGVGaWVsZFN0b3A7IHdyaXRlU3RydWN0RW5kXSB2YWx1ZSI7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjpzdHJ1Y3RfcmVhZGVyKHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgY2xzTmFtZSA9ICIiKSB7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOwotICBzdHJpbmcgdmFsID0gdGVtcF9uYW1lKCk7Ci0gIHN0cmluZyBkZXNjID0gdGVtcF9uYW1lKCk7Ci0gIHN0cmluZyBmb3VuZCA9IHRlbXBfbmFtZSgpOwotCi0gIGlmIChjbHNOYW1lLnNpemUoKSA9PSAwKSB7Ci0gICAgY2xzTmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBvdXQgPDwgIlt8IiA8PCBkZXNjIDw8ICIgIiA8PCB2YWwgPDwgInwiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIC8vIFRoaXMgaXMgbmFzdHksIGJ1dCB3aXRob3V0IGl0IHdlJ2xsIGJyZWFrIHRoaW5ncyBieSBwcmVmaXhpbmcgVFJlc3VsdC4KLSAgc3RyaW5nIG5hbWUgPSAoKGNhcGl0YWxpemUoY2xzTmFtZSkgPT0gIlRSZXN1bHQiKSA/IGNhcGl0YWxpemUoY2xzTmFtZSkgOiBwcmVmaXgoY2xzTmFtZSkpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgdmFsIDw8ICIgOj0gIiA8PCBuYW1lIDw8ICIgbmV3LiIgPDwgZW5kbDsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgImlwcm90IHJlYWRTdHJ1Y3RCZWdpbi4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIlsiIDw8IGRlc2MKLSAgICAgIDw8ICIgOj0gaXByb3QgcmVhZEZpZWxkQmVnaW4uIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IGRlc2MKLSAgICAgIDw8ICIgdHlwZSA9IFRUeXBlIHN0b3BdIHdoaWxlRmFsc2U6IFt8IiA8PCBmb3VuZCA8PCAifCIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgZGVzYyA8PCAiIGlkID0gIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X2tleSgpIDw8ICIgaWZUcnVlOiBbIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgb3V0IDw8IGluZGVudCgpIDw8IGZvdW5kIDw8ICIgOj0gdHJ1ZS4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgdmFsIDw8ICIgIgotICAgICAgICA8PCBjYW1lbGNhc2UoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpIDw8ICI6ICIgPDwgcmVhZF92YWwoKCpmbGRfaXRlciktPmdldF90eXBlKCkpOwotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICBvdXQgPDwgIl0uIiA8PCBlbmRsOwotICB9Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8IGZvdW5kIDw8ICIgaWZOaWw6IFtpcHJvdCBza2lwOiAiIDw8IGRlc2MgPDwgIiB0eXBlXV0uIiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3QgcmVhZFN0cnVjdEVuZC4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgdmFsIDw8ICJdIHZhbHVlIjsKLSAgaW5kZW50X2Rvd24oKTsKLQotICByZXR1cm4gb3V0LnN0cigpOwotfQotCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6OndyaXRlX3ZhbCh0X3R5cGUqIHQsIHN0cmluZyBmbmFtZSkgewotICB0ID0gZ2V0X3RydWVfdHlwZSh0KTsKLQotICBpZiAodC0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdCktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJpcHJvdCB3cml0ZURvdWJsZTogIiArIGZuYW1lICsgIiBhc0Zsb2F0IjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiaXByb3Qgd3JpdGUiICsgY2FwaXRhbGl6ZSh0eXBlX25hbWUodCkpICsgIjogIiArIGZuYW1lICsgIiBhc0ludGVnZXIiOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gImlwcm90IHdyaXRlIiArIGNhcGl0YWxpemUodHlwZV9uYW1lKHQpKSArICI6ICIgKyBmbmFtZTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodC0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gbWFwX3dyaXRlcigodF9tYXAqKXQsIGZuYW1lKTsKLSAgfSBlbHNlIGlmICh0LT5pc19zdHJ1Y3QoKSB8fCB0LT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuIHN0cnVjdF93cml0ZXIoKHRfc3RydWN0Kil0LCBmbmFtZSk7Ci0gIH0gZWxzZSBpZiAodC0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuIGxpc3Rfd3JpdGVyKCh0X2xpc3QqKXQsIGZuYW1lKTsKLSAgfSBlbHNlIGlmICh0LT5pc19zZXQoKSkgewotICAgIHJldHVybiBzZXRfd3JpdGVyKCh0X3NldCopdCwgZm5hbWUpOwotICB9IGVsc2UgaWYgKHQtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiaXByb3Qgd3JpdGVJMzI6ICIgKyBmbmFtZTsKLSAgfSBlbHNlIHsKLSAgICB0aHJvdyAiU29ycnksIEkgZG9uJ3Qga25vdyBob3cgdG8gd3JpdGUgdGhpczogIiArIHR5cGVfbmFtZSh0KTsKLSAgfQotfQotCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6OnJlYWRfdmFsKHRfdHlwZSogdCkgewotICB0ID0gZ2V0X3RydWVfdHlwZSh0KTsKLQotICBpZiAodC0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICByZXR1cm4gImlwcm90IHJlYWQiICsgY2FwaXRhbGl6ZSh0eXBlX25hbWUodCkpOwotICB9IGVsc2UgaWYgKHQtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuIG1hcF9yZWFkZXIoKHRfbWFwKil0KTsKLSAgfSBlbHNlIGlmICh0LT5pc19zdHJ1Y3QoKSB8fCB0LT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuIHN0cnVjdF9yZWFkZXIoKHRfc3RydWN0Kil0KTsKLSAgfSBlbHNlIGlmICh0LT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gbGlzdF9yZWFkZXIoKHRfbGlzdCopdCk7Ci0gIH0gZWxzZSBpZiAodC0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gc2V0X3JlYWRlcigodF9zZXQqKXQpOwotICB9IGVsc2UgaWYgKHQtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiaXByb3QgcmVhZEkzMiI7Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgIlNvcnJ5LCBJIGRvbid0IGtub3cgaG93IHRvIHJlYWQgdGhpczogIiArIHR5cGVfbmFtZSh0KTsKLSAgfQotfQotCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZW5kX21ldGhvZCh0X2Z1bmN0aW9uKiBmdW5jdGlvbikgewotICBzdHJpbmcgZnVubmFtZSA9IGZ1bmN0aW9uLT5nZXRfbmFtZSgpOwotICBzdHJpbmcgc2lnbmF0dXJlID0gZnVuY3Rpb25fc2lnbmF0dXJlKGZ1bmN0aW9uKTsKLSAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSBmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7Ci0KLSAgc3RfbWV0aG9kKGZfLCBjbGllbnRfY2xhc3NfbmFtZSgpLCAic2VuZCIgKyBjYXBpdGFsaXplKHNpZ25hdHVyZSkpOwotICBmXyA8PCAib3Byb3Qgd3JpdGVNZXNzYWdlQmVnaW46IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBmXyA8PCBpbmRlbnQoKSA8PCAiKFRDYWxsTWVzc2FnZSBuZXciIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZfIDw8IGluZGVudCgpIDw8ICJuYW1lOiAnIiA8PCBmdW5uYW1lIDw8ICInOyAiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInNlcWlkOiBzZWxmIG5leHRTZXFpZCkuIgotICAgICA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnRfZG93bigpOwotCi0gIGZfIDw8IGluZGVudCgpIDw8ICJvcHJvdCB3cml0ZVN0cnVjdEJlZ2luOiAiCi0gICAgIDw8ICIoVFN0cnVjdCBuZXcgbmFtZTogJyIgKyBjYXBpdGFsaXplKGNhbWVsY2FzZShmdW5uYW1lKSkgKyAiX2FyZ3MnKS4iIDw8IGVuZGw7Ci0KLSAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICBzdHJpbmcgZm5hbWUgPSBjYW1lbGNhc2UoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpOwotCi0gICAgZl8gPDwgaW5kZW50KCkgPDwgIm9wcm90IHdyaXRlRmllbGRCZWdpbjogKFRGaWVsZCBuZXcgbmFtZTogJyIgPDwgZm5hbWUKLSAgICAgICA8PCAiJzsgdHlwZTogIiA8PCB0eXBlX3RvX2VudW0oKCpmbGRfaXRlciktPmdldF90eXBlKCkpIDw8ICI7IGlkOiAiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfa2V5KCkKLSAgICAgICA8PCAiKS4iIDw8IGVuZGw7Ci0KLSAgICBmXyA8PCBpbmRlbnQoKSA8PCB3cml0ZV92YWwoKCpmbGRfaXRlciktPmdldF90eXBlKCksIGZuYW1lKSA8PCAiLiIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgIDw8ICJvcHJvdCB3cml0ZUZpZWxkRW5kLiIgPDwgZW5kbDsKLSAgfQotCi0gIGZfIDw8IGluZGVudCgpIDw8ICJvcHJvdCB3cml0ZUZpZWxkU3RvcDsgd3JpdGVTdHJ1Y3RFbmQ7IHdyaXRlTWVzc2FnZUVuZC4iIDw8IGVuZGw7Ci0gIGZfIDw8IGluZGVudCgpIDw8ICJvcHJvdCB0cmFuc3BvcnQgZmx1c2giOwotCi0gIHN0X2Nsb3NlX21ldGhvZChmXyk7Ci19Ci0KLS8vIFdlIG9ubHkgc3VwcG9ydCByZWNlaXZpbmcgVFJlc3VsdCBzdHJ1Y3R1cmVzIChzbyB0aGlzIHdvbid0IHdvcmsgb24gdGhlIHNlcnZlciBzaWRlKQotdm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmVjdl9tZXRob2QodF9mdW5jdGlvbiogZnVuY3Rpb24pIHsKLSAgc3RyaW5nIGZ1bm5hbWUgPSBjYW1lbGNhc2UoZnVuY3Rpb24tPmdldF9uYW1lKCkpOwotICBzdHJpbmcgc2lnbmF0dXJlID0gZnVuY3Rpb25fc2lnbmF0dXJlKGZ1bmN0aW9uKTsKLQotICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sICJUUmVzdWx0Iik7Ci0gIHRfZmllbGQgc3VjY2VzcyhmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKLSAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAvLyBkdXBsaWNhdGUgdGhlIGZpZWxkLCBidXQgY2FsbCBpdCAiZXhjZXB0aW9uIi4uLiB3ZSBkb24ndCBuZWVkIGEgZHluYW1pYyBuYW1lCi0gICAgdF9maWVsZCogZXhjZXB0aW9uID0gbmV3IHRfZmllbGQoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLCAiZXhjZXB0aW9uIiwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkpOwotICAgIHJlc3VsdC5hcHBlbmQoZXhjZXB0aW9uKTsKLSAgfQotCi0gIHN0X21ldGhvZChmXywgY2xpZW50X2NsYXNzX25hbWUoKSwgInJlY3YiICsgY2FwaXRhbGl6ZShmdW5uYW1lKSk7Ci0gIGZfIDw8ICJ8IGYgbXNnIHJlcyB8ICIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAibXNnIDo9IG9wcm90IHJlYWRNZXNzYWdlQmVnaW4uIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgIDw8ICJzZWxmIHZhbGlkYXRlUmVtb3RlTWVzc2FnZTogbXNnLiIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICA8PCAicmVzIDo9ICIgPDwgc3RydWN0X3JlYWRlcigmcmVzdWx0KSA8PCAiLiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3QgcmVhZE1lc3NhZ2VFbmQuIgotICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdCB0cmFuc3BvcnQgZmx1c2guIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgIDw8ICJyZXMgZXhjZXB0aW9uIGlmTm90TmlsOiBbcmVzIGV4Y2VwdGlvbiBzaWduYWxdLiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiXiByZXMiOwotICBzdF9jbG9zZV9tZXRob2QoZl8pOwotfQotCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3R5cGVzX2NvbW1lbnQodF9mdW5jdGlvbiogZm4pIHsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gZm4tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBvdXQgPDwgIlwiIjsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIG91dCA8PCBjYW1lbGNhc2UoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOiAiIDw8IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCkpOwotICAgIGlmICgoZl9pdGVyICsgMSkgIT0gZmllbGRzLmVuZCgpKSB7Ci0gICAgICBvdXQgPDwgIiwgIjsKLSAgICB9Ci0gIH0KLQotICBvdXQgPDwgIlwiIjsKLQotICByZXR1cm4gb3V0LnN0cigpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiVENsaWVudCI7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgZXh0ZW5kc19jbGllbnQgPSBleHRlbmRzICsgIkNsaWVudCI7Ci0gIH0KLQotICBmXyA8PCBleHRlbmRzX2NsaWVudCA8PCAiIHN1YmNsYXNzOiAjIiA8PCBwcmVmaXgoY2xpZW50X2NsYXNzX25hbWUoKSkgPDwgZW5kbAotICAgICA8PCAiXHRpbnN0YW5jZVZhcmlhYmxlTmFtZXM6ICcnXG4iCi0gICAgIDw8ICJcdGNsYXNzVmFyaWFibGVOYW1lczogJydcbiIKLSAgICAgPDwgIlx0cG9vbERpY3Rpb25hcmllczogJydcbiIKLSAgICAgPDwgIlx0Y2F0ZWdvcnk6ICciIDw8IGdlbmVyYXRlZF9jYXRlZ29yeSgpIDw8ICInIVxuXG4iOwotCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyaW5nIGZ1bm5hbWUgPSBjYW1lbGNhc2UoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICBzdHJpbmcgc2lnbmF0dXJlID0gZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpOwotCi0gICAgc3RfbWV0aG9kKGZfLCBjbGllbnRfY2xhc3NfbmFtZSgpLCBzaWduYXR1cmUpOwotICAgIGZfIDw8IGZ1bmN0aW9uX3R5cGVzX2NvbW1lbnQoKmZfaXRlcikgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAic2VsZiBzZW5kIgotICAgICAgIDw8IGNhcGl0YWxpemUoc2lnbmF0dXJlKSA8PCAiLiIgPDwgZW5kbDsKLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgZl8gPDwgaW5kZW50KCkgPDwgIl4gc2VsZiByZWN2IiA8PCBjYXBpdGFsaXplKGZ1bm5hbWUpIDw8ICIgc3VjY2VzcyAiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgc3RfY2xvc2VfbWV0aG9kKGZfKTsKLQotICAgIGdlbmVyYXRlX3NlbmRfbWV0aG9kKCpmX2l0ZXIpOwotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgZ2VuZXJhdGVfcmVjdl9tZXRob2QoKmZfaXRlcik7Ci0gICAgfQotICB9Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJwotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgotICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgotICovCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgcmV0dXJuIGNhbWVsY2FzZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgY2FwaXRhbGl6ZShhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkpOwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmaWVsZCBsaXN0Ci0gKi8KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiICI7Ci0gICAgfQotICAgIHN0cmluZyBuYW1lID0gY2FtZWxjYXNlKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgcmVzdWx0ICs9IG5hbWUgKyAiOiAiICsgbmFtZTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKSB7Ci0gIHN0cmluZyBwcmVmaXggPSAiIjsKLSAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7Ci0gIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgewotICAgIGlmICghdHR5cGUtPmlzX3NlcnZpY2UoKSkgewotICAgICAgcHJlZml4ID0gcHJvZ3JhbS0+Z2V0X25hbWUoKSArICJfdHlwZXMuIjsKLSAgICB9Ci0gIH0KLQotICBzdHJpbmcgbmFtZSA9IHR0eXBlLT5nZXRfbmFtZSgpOwotICBpZiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgbmFtZSA9IGNhcGl0YWxpemUodHR5cGUtPmdldF9uYW1lKCkpOwotICB9Ci0KLSAgcmV0dXJuIHByZWZpeCArIG5hbWU7Ci19Ci0KLS8qIENvbnZlcnQgdF90eXBlIHRvIFNtYWxsdGFsayB0eXBlIGNvZGUgKi8KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJldHVybiAiVFR5cGUgc3RyaW5nIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gIlRUeXBlIGJvb2wiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJldHVybiAiVFR5cGUgYnl0ZSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gIlRUeXBlIGkxNiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gIlRUeXBlIGkzMiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gIlRUeXBlIGk2NCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gIlRUeXBlIGRvdWJsZSI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiVFR5cGUgaTMyIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuICJUVHlwZSBzdHJ1Y3QiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZSBtYXAiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZSBzZXQiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiAiVFR5cGUgbGlzdCI7Ci0gIH0KLQotICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLVRIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1Ioc3QsICJTbWFsbHRhbGsiLCAiIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF94c2RfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3hzZF9nZW5lcmF0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNzZiZWMuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3hzZF9nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzNTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxzc3RyZWFtPgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgInRfZ2VuZXJhdG9yLmgiCi0jaW5jbHVkZSAicGxhdGZvcm0uaCIKLQotdXNpbmcgc3RkOjptYXA7Ci11c2luZyBzdGQ6Om9mc3RyZWFtOwotdXNpbmcgc3RkOjpvc3RyZWFtOwotdXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwotdXNpbmcgc3RkOjpzdHJpbmc7Ci11c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKLXVzaW5nIHN0ZDo6dmVjdG9yOwotCi1zdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCi0KLS8qKgotICogWFNEIGdlbmVyYXRvciwgY3JlYXRlcyBhbiBYU0QgZm9yIHRoZSBiYXNlIHR5cGVzIGV0Yy4KLSAqCi0gKi8KLWNsYXNzIHRfeHNkX2dlbmVyYXRvciA6IHB1YmxpYyB0X2dlbmVyYXRvciB7Ci1wdWJsaWM6Ci0gIHRfeHNkX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKLSAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQotICAgIDogdF9nZW5lcmF0b3IocHJvZ3JhbSkgewotICAgICh2b2lkKXBhcnNlZF9vcHRpb25zOwotICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7Ci0gICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4teHNkIjsKLSAgfQotCi0gIHZpcnR1YWwgfnRfeHNkX2dlbmVyYXRvcigpIHt9Ci0KLSAgLyoqCi0gICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKLSAgICovCi0KLSAgdm9pZCBpbml0X2dlbmVyYXRvcigpOwotICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOwotCi0gIC8qKgotICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKLSAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsgKHZvaWQpdGVudW07IH0KLQotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKLQotcHJpdmF0ZToKLSAgdm9pZCBnZW5lcmF0ZV9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogYXR0cnMgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvcHRpb25hbCA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBuaWxsYWJsZSA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsaXN0X2VsZW1lbnQgPSBmYWxzZSk7Ci0KLSAgc3RkOjpzdHJpbmcgbnMoc3RkOjpzdHJpbmcgaW4sIHN0ZDo6c3RyaW5nIG5zKSB7IHJldHVybiBucyArICI6IiArIGluOyB9Ci0KLSAgc3RkOjpzdHJpbmcgeHNkKHN0ZDo6c3RyaW5nIGluKSB7IHJldHVybiBucyhpbiwgInhzZCIpOyB9Ci0KLSAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpOwotICBzdGQ6OnN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlKTsKLQotICAvKioKLSAgICogT3V0cHV0IHhzZC9waHAgZmlsZQotICAgKi8KLSAgc3RkOjpvZnN0cmVhbSBmX3hzZF87Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9waHBfOwotCi0gIC8qKgotICAgKiBPdXRwdXQgc3RyaW5nIHN0cmVhbQotICAgKi8KLSAgc3RkOjpvc3RyaW5nc3RyZWFtIHNfeHNkX3R5cGVzXzsKLX07Ci0KLXZvaWQgdF94c2RfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKLSAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5Ci0gIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7Ci0KLSAgLy8gTWFrZSBvdXRwdXQgZmlsZQotICBzdHJpbmcgZl9waHBfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwcm9ncmFtXy0+Z2V0X25hbWUoKSArICJfeHNkLnBocCI7Ci0gIGZfcGhwXy5vcGVuKGZfcGhwX25hbWUuY19zdHIoKSk7Ci0KLSAgZl9waHBfIDw8ICI8P3BocCIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X3hzZF9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKLSAgZl9waHBfIDw8ICI/PiIgPDwgZW5kbDsKLSAgZl9waHBfLmNsb3NlKCk7Ci19Ci0KLXZvaWQgdF94c2RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKLSAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwgIjx4c2Q6c2ltcGxlVHlwZSBuYW1lPVwiIiA8PCB0dHlwZWRlZi0+Z2V0X25hbWUoKSA8PCAiXCI+IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaWYgKHR0eXBlZGVmLT5nZXRfdHlwZSgpLT5pc19zdHJpbmcoKSAmJiAoKHRfYmFzZV90eXBlKil0dHlwZWRlZi0+Z2V0X3R5cGUoKSktPmlzX3N0cmluZ19lbnVtKCkpIHsKLSAgICBpbmRlbnQoc194c2RfdHlwZXNfKSA8PCAiPHhzZDpyZXN0cmljdGlvbiBiYXNlPVwiIiA8PCB0eXBlX25hbWUodHR5cGVkZWYtPmdldF90eXBlKCkpIDw8ICJcIj4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBjb25zdCB2ZWN0b3I8c3RyaW5nPiYgdmFsdWVzID0gKCh0X2Jhc2VfdHlwZSopdHR5cGVkZWYtPmdldF90eXBlKCkpLT5nZXRfc3RyaW5nX2VudW1fdmFscygpOwotICAgIHZlY3RvcjxzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWx1ZXMuYmVnaW4oKTsgdl9pdGVyICE9IHZhbHVlcy5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIGluZGVudChzX3hzZF90eXBlc18pIDw8ICI8eHNkOmVudW1lcmF0aW9uIHZhbHVlPVwiIiA8PCAoKnZfaXRlcikgPDwgIlwiIC8+IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChzX3hzZF90eXBlc18pIDw8ICI8L3hzZDpyZXN0cmljdGlvbj4iIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwgIjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT1cIiIgPDwgdHlwZV9uYW1lKHR0eXBlZGVmLT5nZXRfdHlwZSgpKSA8PCAiXCIgLz4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoc194c2RfdHlwZXNfKSA8PCAiPC94c2Q6c2ltcGxlVHlwZT4iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X3hzZF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICBib29sIHhzZF9hbGwgPSB0c3RydWN0LT5nZXRfeHNkX2FsbCgpOwotCi0gIGluZGVudChzX3hzZF90eXBlc18pIDw8ICI8eHNkOmNvbXBsZXhUeXBlIG5hbWU9XCIiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlwiPiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGlmICh4c2RfYWxsKSB7Ci0gICAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwgIjx4c2Q6YWxsPiIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQoc194c2RfdHlwZXNfKSA8PCAiPHhzZDpzZXF1ZW5jZT4iIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGdlbmVyYXRlX2VsZW1lbnQoc194c2RfdHlwZXNfLAotICAgICAgICAgICAgICAgICAgICAgKCptX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgKCptX2l0ZXIpLT5nZXRfdHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgKCptX2l0ZXIpLT5nZXRfeHNkX2F0dHJzKCksCi0gICAgICAgICAgICAgICAgICAgICAoKm1faXRlciktPmdldF94c2Rfb3B0aW9uYWwoKSB8fCB4c2RfYWxsLAotICAgICAgICAgICAgICAgICAgICAgKCptX2l0ZXIpLT5nZXRfeHNkX25pbGxhYmxlKCkpOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaWYgKHhzZF9hbGwpIHsKLSAgICBpbmRlbnQoc194c2RfdHlwZXNfKSA8PCAiPC94c2Q6YWxsPiIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQoc194c2RfdHlwZXNfKSA8PCAiPC94c2Q6c2VxdWVuY2U+IiA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChzX3hzZF90eXBlc18pIDw8ICI8L3hzZDpjb21wbGV4VHlwZT4iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X3hzZF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VsZW1lbnQob3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIGF0dHJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvcHRpb25hbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbmlsbGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGxpc3RfZWxlbWVudCkgewotICBzdHJpbmcgc21pbk9jY3VycyA9IChvcHRpb25hbCB8fCBsaXN0X2VsZW1lbnQpID8gIiBtaW5PY2N1cnM9XCIwXCIiIDogIiI7Ci0gIHN0cmluZyBzbWF4T2NjdXJzID0gbGlzdF9lbGVtZW50ID8gIiBtYXhPY2N1cnM9XCJ1bmJvdW5kZWRcIiIgOiAiIjsKLSAgc3RyaW5nIHNvcHRpb25hbCA9IHNtaW5PY2N1cnMgKyBzbWF4T2NjdXJzOwotICBzdHJpbmcgc25pbGxhYmxlID0gbmlsbGFibGUgPyAiIG5pbGxhYmxlPVwidHJ1ZVwiIiA6ICIiOwotCi0gIGlmICh0dHlwZS0+aXNfdm9pZCgpIHx8IHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiPHhzZDplbGVtZW50IG5hbWU9XCIiIDw8IG5hbWUgPDwgIlwiIiA8PCBzb3B0aW9uYWwgPDwgc25pbGxhYmxlIDw8ICI+IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGlmIChhdHRycyA9PSBOVUxMICYmIHR0eXBlLT5pc192b2lkKCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICI8eHNkOmNvbXBsZXhUeXBlIC8+IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiPHhzZDpjb21wbGV4VHlwZT4iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICI8eHNkOnNlcXVlbmNlIG1pbk9jY3Vycz1cIjBcIiBtYXhPY2N1cnM9XCJ1bmJvdW5kZWRcIj4iIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBzdHJpbmcgc3VibmFtZTsKLSAgICAgICAgdF90eXBlKiBzdWJ0eXBlID0gKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgICAgICBpZiAoc3VidHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgc3VidHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICAgICAgICBzdWJuYW1lID0gbmFtZSArICJfZWx0IjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBzdWJuYW1lID0gdHlwZV9uYW1lKHN1YnR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIGZfcGhwXyA8PCAiJEdMT0JBTFNbJyIgPDwgcHJvZ3JhbV8tPmdldF9uYW1lKCkgPDwgIl94c2RfZWx0XyIgPDwgbmFtZSA8PCAiJ10gPSAnIiA8PCBzdWJuYW1lCi0gICAgICAgICAgICAgICA8PCAiJzsiIDw8IGVuZGw7Ci0gICAgICAgIGdlbmVyYXRlX2VsZW1lbnQob3V0LCBzdWJuYW1lLCBzdWJ0eXBlLCBOVUxMLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAiPC94c2Q6c2VxdWVuY2U+IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAiPHhzZDphdHRyaWJ1dGUgbmFtZT1cImxpc3RcIiB0eXBlPVwieHNkOmJvb2xlYW5cIiAvPiIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGlmIChhdHRycyAhPSBOVUxMKSB7Ci0gICAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSBhdHRycy0+Z2V0X21lbWJlcnMoKTsKLSAgICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgYV9pdGVyOwotICAgICAgICBmb3IgKGFfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgYV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrYV9pdGVyKSB7Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgIjx4c2Q6YXR0cmlidXRlIG5hbWU9XCIiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIgdHlwZT1cIiIKLSAgICAgICAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUoKCphX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiXCIgLz4iIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiPC94c2Q6Y29tcGxleFR5cGU+IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICI8L3hzZDplbGVtZW50PiIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBpZiAoYXR0cnMgPT0gTlVMTCkgewotICAgICAgaW5kZW50KG91dCkgPDwgIjx4c2Q6ZWxlbWVudCBuYW1lPVwiIiA8PCBuYW1lIDw8ICJcIiIKLSAgICAgICAgICAgICAgICAgIDw8ICIgdHlwZT1cIiIgPDwgdHlwZV9uYW1lKHR0eXBlKSA8PCAiXCIiIDw8IHNvcHRpb25hbCA8PCBzbmlsbGFibGUgPDwgIiAvPiIKLSAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIFdvdywgYWxsIHRoaXMgd29yayBmb3IgYSBTSU1QTEUgVFlQRSB3aXRoIGF0dHJpYnV0ZXM/IT8hPyEKLSAgICAgIGluZGVudChvdXQpIDw8ICI8eHNkOmVsZW1lbnQgbmFtZT1cIiIgPDwgbmFtZSA8PCAiXCIiIDw8IHNvcHRpb25hbCA8PCBzbmlsbGFibGUgPDwgIj4iCi0gICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiPHhzZDpjb21wbGV4VHlwZT4iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICI8eHNkOmNvbXBsZXhDb250ZW50PiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwgIjx4c2Q6ZXh0ZW5zaW9uIGJhc2U9XCIiIDw8IHR5cGVfbmFtZSh0dHlwZSkgPDwgIlwiPiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IGF0dHJzLT5nZXRfbWVtYmVycygpOwotICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgYV9pdGVyOwotICAgICAgZm9yIChhX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IGFfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK2FfaXRlcikgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAiPHhzZDphdHRyaWJ1dGUgbmFtZT1cIiIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiB0eXBlPVwiIgotICAgICAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUoKCphX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiXCIgLz4iIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIjwveHNkOmV4dGVuc2lvbj4iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIjwveHNkOmNvbXBsZXhDb250ZW50PiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiPC94c2Q6Y29tcGxleFR5cGU+IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICI8L3hzZDplbGVtZW50PiIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCB0X3hzZF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAvLyBNYWtlIG91dHB1dCBmaWxlCi0gIHN0cmluZyBmX3hzZF9uYW1lID0gZ2V0X291dF9kaXIoKSArIHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIi54c2QiOwotICBmX3hzZF8ub3BlbihmX3hzZF9uYW1lLmNfc3RyKCkpOwotCi0gIHN0cmluZyBucyA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJ4c2QiKTsKLSAgaWYgKG5zLnNpemUoKSA+IDApIHsKLSAgICBucyA9ICIgdGFyZ2V0TmFtZXNwYWNlPVwiIiArIG5zICsgIlwiIHhtbG5zPVwiIiArIG5zICsgIlwiICIKLSAgICAgICAgICsgImVsZW1lbnRGb3JtRGVmYXVsdD1cInF1YWxpZmllZFwiIjsKLSAgfQotCi0gIC8vIFByaW50IHRoZSBYU0QgaGVhZGVyCi0gIGZfeHNkXyA8PCAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIiA/PiIgPDwgZW5kbAotICAgICAgICAgPDwgIjx4c2Q6c2NoZW1hIHhtbG5zOnhzZD1cImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hXCIiIDw8IG5zIDw8ICI+IiA8PCBlbmRsCi0gICAgICAgICA8PCBlbmRsIDw8ICI8IS0tIFlvIHlvIHlvLCB0aGlzIFhTRCB3b3ogYmUgZ2VuZXJhdGVkIGJ5IFRocmlmdC4gLS0+IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gUHJpbnQgb3V0IHRoZSB0eXBlIGRlZmluaXRpb25zCi0gIGluZGVudChmX3hzZF8pIDw8IHNfeHNkX3R5cGVzXy5zdHIoKTsKLQotICAvLyBLZWVwIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGV4Y2VwdGlvbnMgdGhhdCBtaWdodCBnZXQgdGhyb3duCi0gIG1hcDxzdHJpbmcsIHRfc3RydWN0Kj4gYWxsX3hjZXB0aW9uczsKLQotICAvLyBMaXN0IHRoZSBlbGVtZW50cyB0aGF0IHlvdSBtaWdodCBhY3R1YWxseSBnZXQKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyaW5nIGVsZW1uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXNwb25zZSI7Ci0gICAgdF90eXBlKiByZXR1cm50eXBlID0gKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpOwotICAgIGdlbmVyYXRlX2VsZW1lbnQoZl94c2RfLCBlbGVtbmFtZSwgcmV0dXJudHlwZSk7Ci0gICAgZl94c2RfIDw8IGVuZGw7Ci0KLSAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKLSAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgYWxsX3hjZXB0aW9uc1soKnhfaXRlciktPmdldF9uYW1lKCldID0gKHRfc3RydWN0KikoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICB9Ci0gIH0KLQotICBtYXA8c3RyaW5nLCB0X3N0cnVjdCo+OjppdGVyYXRvciBheF9pdGVyOwotICBmb3IgKGF4X2l0ZXIgPSBhbGxfeGNlcHRpb25zLmJlZ2luKCk7IGF4X2l0ZXIgIT0gYWxsX3hjZXB0aW9ucy5lbmQoKTsgKytheF9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfZWxlbWVudChmX3hzZF8sIGF4X2l0ZXItPmZpcnN0LCBheF9pdGVyLT5zZWNvbmQpOwotICB9Ci0KLSAgLy8gQ2xvc2UgdGhlIFhTRCBkb2N1bWVudAotICBmX3hzZF8gPDwgZW5kbCA8PCAiPC94c2Q6c2NoZW1hPiIgPDwgZW5kbDsKLSAgZl94c2RfLmNsb3NlKCk7Ci19Ci0KLXN0cmluZyB0X3hzZF9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKSB7Ci0gIGlmICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgcmV0dXJuIHR0eXBlLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHJldHVybiB4c2QoYmFzZV90eXBlX25hbWUoKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpKSk7Ci0gIH0KLQotICBpZiAodHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiB4c2QoImludCIpOwotICB9Ci0KLSAgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiB0dHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIHJldHVybiAiY29udGFpbmVyIjsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBYU0QgdHlwZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSB0aHJpZnQgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGJhc2UgVGhlIGJhc2UgdHlwZQotICogQHJldHVybiBFeHBsaWNpdCBYU0QgdHlwZSwgaS5lLiB4c2Q6c3RyaW5nCi0gKi8KLXN0cmluZyB0X3hzZF9nZW5lcmF0b3I6OmJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UpIHsKLSAgc3dpdGNoICh0YmFzZSkgewotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgcmV0dXJuICJ2b2lkIjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgcmV0dXJuICJzdHJpbmciOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgcmV0dXJuICJib29sZWFuIjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIHJldHVybiAiYnl0ZSI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIHJldHVybiAic2hvcnQiOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICByZXR1cm4gImludCI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgIHJldHVybiAibG9uZyI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgIHJldHVybiAiZGVjaW1hbCI7Ci0gIGRlZmF1bHQ6Ci0gICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBYU0QgYmFzZSB0eXBlIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgfQotfQotCi1USFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKHhzZCwgIlhTRCIsICIiKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nbG9iYWxzLmggYi9jb21waWxlci9jcHAvc3JjL2dsb2JhbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY5MDYxNi4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dsb2JhbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVF9HTE9CQUxTX0gKLSNkZWZpbmUgVF9HTE9CQUxTX0gKLQotI2luY2x1ZGUgPHNldD4KLSNpbmNsdWRlIDxxdWV1ZT4KLSNpbmNsdWRlIDxzdGFjaz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi0vKioKLSAqIFRoaXMgbW9kdWxlIGNvbnRhaW5zIGFsbCB0aGUgZ2xvYmFsIHZhcmlhYmxlcyAoc2xhcCBvbiB0aGUgd3Jpc3QpIHRoYXQgYXJlCi0gKiBzaGFyZWQgdGhyb3VnaG91dCB0aGUgcHJvZ3JhbS4gVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyB0byBmYWNpbGl0YXRlIHNpbXBsZQotICogaW50ZXJhY3Rpb24gYmV0d2VlbiB0aGUgcGFyc2VyIGFuZCB0aGUgcmVzdCBvZiB0aGUgcHJvZ3JhbS4gQmVmb3JlIGNhbGxpbmcKLSAqIHl5cGFyc2UoKSwgdGhlIG1haW4uY2MgcHJvZ3JhbSB3aWxsIG1ha2UgbmVjZXNzYXJ5IGFkanVzdG1lbnRzIHRvIHRoZXNlCi0gKiBnbG9iYWwgdmFyaWFibGVzIHN1Y2ggdGhhdCB0aGUgcGFyc2VyIGRvZXMgdGhlIHJpZ2h0IHRoaW5nIGFuZCBwdXRzIGVudHJpZXMKLSAqIGludG8gdGhlIHJpZ2h0IGNvbnRhaW5lcnMsIGV0Yy4KLSAqCi0gKi8KLQotLyoqCi0gKiBIb29yYXkgZm9yIGZvcndhcmQgZGVjbGFyYXRpb24gb2YgdHlwZXMhCi0gKi8KLQotY2xhc3MgdF9wcm9ncmFtOwotY2xhc3MgdF9zY29wZTsKLWNsYXNzIHRfdHlwZTsKLQotLyoqCi0gKiBQYXJzaW5nIG1vZGUsIHR3byBwYXNzZXMgdXAgaW4gdGhpcyBnaW4gcnVtbXkhCi0gKi8KLQotZW51bSBQQVJTRV9NT0RFIHsgSU5DTFVERVMgPSAxLCBQUk9HUkFNID0gMiB9OwotCi0vKioKLSAqIFN0cmljdG5lc3MgbGV2ZWwKLSAqLwotZXh0ZXJuIGludCBnX3N0cmljdDsKLQotLyoqCi0gKiBUaGUgbWFzdGVyIHByb2dyYW0gcGFyc2UgdHJlZS4gVGhpcyBpcyBhY2Nlc3NlZCBmcm9tIHdpdGhpbiB0aGUgcGFyc2VyIGNvZGUKLSAqIHRvIGJ1aWxkIHVwIHRoZSBwcm9ncmFtIGVsZW1lbnRzLgotICovCi1leHRlcm4gdF9wcm9ncmFtKiBnX3Byb2dyYW07Ci0KLS8qKgotICogR2xvYmFsIHR5cGVzIGZvciB0aGUgcGFyc2VyIHRvIGJlIGFibGUgdG8gcmVmZXJlbmNlCi0gKi8KLQotZXh0ZXJuIHRfdHlwZSogZ190eXBlX3ZvaWQ7Ci1leHRlcm4gdF90eXBlKiBnX3R5cGVfc3RyaW5nOwotZXh0ZXJuIHRfdHlwZSogZ190eXBlX2JpbmFyeTsKLWV4dGVybiB0X3R5cGUqIGdfdHlwZV9zbGlzdDsKLWV4dGVybiB0X3R5cGUqIGdfdHlwZV9ib29sOwotZXh0ZXJuIHRfdHlwZSogZ190eXBlX2J5dGU7Ci1leHRlcm4gdF90eXBlKiBnX3R5cGVfaTE2OwotZXh0ZXJuIHRfdHlwZSogZ190eXBlX2kzMjsKLWV4dGVybiB0X3R5cGUqIGdfdHlwZV9pNjQ7Ci1leHRlcm4gdF90eXBlKiBnX3R5cGVfZG91YmxlOwotCi0vKioKLSAqIFRoZSBzY29wZSB0aGF0IHdlIGFyZSBjdXJyZW50bHkgcGFyc2luZyBpbnRvCi0gKi8KLWV4dGVybiB0X3Njb3BlKiBnX3Njb3BlOwotCi0vKioKLSAqIFRoZSBwYXJlbnQgc2NvcGUgdG8gYWxzbyBsb2FkIHN5bWJvbHMgaW50bwotICovCi1leHRlcm4gdF9zY29wZSogZ19wYXJlbnRfc2NvcGU7Ci0KLS8qKgotICogVGhlIHByZWZpeCBmb3IgdGhlIHBhcmVudCBzY29wZSBlbnRyaWVzCi0gKi8KLWV4dGVybiBzdGQ6OnN0cmluZyBnX3BhcmVudF9wcmVmaXg7Ci0KLS8qKgotICogVGhlIHBhcnNpbmcgcGFzcyB0aGF0IHdlIGFyZSBvbi4gV2UgZG8gZGlmZmVyZW50IHRoaW5ncyBvbiBlYWNoIHBhc3MuCi0gKi8KLWV4dGVybiBQQVJTRV9NT0RFIGdfcGFyc2VfbW9kZTsKLQotLyoqCi0gKiBHbG9iYWwgdGltZSBzdHJpbmcsIHVzZWQgaW4gZm9ybWF0dGluZyBlcnJvciBtZXNzYWdlcyBldGMuCi0gKi8KLWV4dGVybiBjaGFyKiBnX3RpbWVfc3RyOwotCi0vKioKLSAqIFRoZSBsYXN0IHBhcnNlZCBkb2N0ZXh0IGNvbW1lbnQuCi0gKi8KLWV4dGVybiBjaGFyKiBnX2RvY3RleHQ7Ci0KLS8qKgotICogVGhlIGxvY2F0aW9uIG9mIHRoZSBsYXN0IHBhcnNlZCBkb2N0ZXh0IGNvbW1lbnQuCi0gKi8KLWV4dGVybiBpbnQgZ19kb2N0ZXh0X2xpbmVubzsKLQotLyoqCi0gKiBTdGF0dXMgb2YgcHJvZ3JhbSBsZXZlbCBkb2N0ZXh0IGNhbmRpZGF0ZQotICovCi1lbnVtIFBST0dET0NURVhUX1NUQVRVUyB7Ci0gIElOVkFMSUQgPSAwLAotICBTVElMTF9DQU5ESURBVEUgPSAxLCAgIC8vIHRoZSB0ZXh0IG1heSBvciBtYXkgbm90IGJlIHRoZSBwcm9ncmFtIGRvY3RleHQKLSAgQUxSRUFEWV9QUk9DRVNTRUQgPSAyLCAvLyBkb2N0ZXh0IGhhcyBiZWVuIHVzZWQgYW5kIGlzIG5vIGxvbmdlciBhdmFpbGFibGUKLSAgQUJTT0xVVEVMWV9TVVJFID0gMywgICAvLyB0aGlzIGlzIHRoZSBwcm9ncmFtIGRvY3RleHQKLSAgTk9fUFJPR1JBTV9ET0NURVhUID0gNCAvLyB0aGVyZSBpcyBubyBwcm9ncmFtIGRvY3RleHQKLX07Ci0KLS8qKgotICogVGhlIHByb2dyYW0gbGV2ZWwgZG9jdGV4dC4gU3RvcmVkIHNlcGFyYXRlbHkgdG8gbWFrZSBwYXJzaW5nIGVhc2llci4KLSAqLwotZXh0ZXJuIGNoYXIqIGdfcHJvZ3JhbV9kb2N0ZXh0X2NhbmRpZGF0ZTsKLWV4dGVybiBpbnQgZ19wcm9ncmFtX2RvY3RleHRfbGluZW5vOwotZXh0ZXJuIFBST0dET0NURVhUX1NUQVRVUyBnX3Byb2dyYW1fZG9jdGV4dF9zdGF0dXM7Ci0KLS8qKgotICogV2hldGhlciBvciBub3QgbmVnYXRpdmUgZmllbGQga2V5cyBhcmUgYWNjZXB0ZWQuCi0gKgotICogV2hlbiBhIGZpZWxkIGRvZXMgbm90IGhhdmUgYSB1c2VyLXNwZWNpZmllZCBrZXksIHRocmlmdCBhdXRvbWF0aWNhbGx5Ci0gKiBhc3NpZ25zIGEgbmVnYXRpdmUgdmFsdWUuICBIb3dldmVyLCB0aGlzIGlzIGZyYWdpbGUgc2luY2UgY2hhbmdlcyB0byB0aGUKLSAqIGZpbGUgbWF5IHVuaW50ZW50aW9uYWxseSBjaGFuZ2UgdGhlIGtleSBudW1iZXJpbmcsIHJlc3VsdGluZyBpbiBhIG5ldwotICogcHJvdG9jb2wgdGhhdCBpcyBub3QgYmFja3dhcmRzIGNvbXBhdGlibGUuCi0gKgotICogV2hlbiBnX2FsbG93X25lZ19maWVsZF9rZXlzIGlzIGVuYWJsZWQsIHVzZXJzIGNhbiBleHBsaWNpdGx5IHNwZWNpZnkKLSAqIG5lZ2F0aXZlIGtleXMuICBUaGlzIHdheSB0aGV5IGNhbiB3cml0ZSBhIC50aHJpZnQgZmlsZSB3aXRoIGV4cGxpY2l0bHkKLSAqIHNwZWNpZmllZCBrZXlzIHRoYXQgaXMgc3RpbGwgYmFja3dhcmRzIGNvbXBhdGlibGUgd2l0aCBvbGRlciAudGhyaWZ0IGZpbGVzCi0gKiB0aGF0IGRpZCBub3Qgc3BlY2lmeSBrZXkgdmFsdWVzLgotICovCi1leHRlcm4gaW50IGdfYWxsb3dfbmVnX2ZpZWxkX2tleXM7Ci0KLS8qKgotICogV2hldGhlciBvciBub3QgNjQtYml0IGNvbnN0YW50cyB3aWxsIGdlbmVyYXRlIGEgd2FybmluZy4KLSAqCi0gKiBTb21lIGxhbmd1YWdlcyBkb24ndCBzdXBwb3J0IDY0LWJpdCBjb25zdGFudHMsIGJ1dCBtYW55IGRvLCBzbyB3ZSBjYW4KLSAqIHN1cHByZXNzIHRoaXMgd2FybmluZyBmb3IgcHJvamVjdHMgdGhhdCBkb24ndCB1c2UgYW55IG5vbi02NC1iaXQtc2FmZQotICogbGFuZ3VhZ2VzLgotICovCi1leHRlcm4gaW50IGdfYWxsb3dfNjRiaXRfY29uc3RzOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvbG9nZ2luZy5oIGIvY29tcGlsZXIvY3BwL3NyYy9sb2dnaW5nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMWZjZTguLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9sb2dnaW5nLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVF9MT0dHSU5HX0gKLSNkZWZpbmUgVF9MT0dHSU5HX0gKLQotI2luY2x1ZGUgPHN0cmluZz4KLQotLyoqCi0gKiBQYXJzZSBkZWJ1Z2dpbmcgb3V0cHV0LCB1c2VkIHRvIHByaW50IGhlbHBmdWwgaW5mbwotICovCi12b2lkIHBkZWJ1Zyhjb25zdCBjaGFyKiBmbXQsIC4uLik7Ci0KLS8qKgotICogUGFyc2VyIHdhcm5pbmcKLSAqLwotdm9pZCBwd2FybmluZyhpbnQgbGV2ZWwsIGNvbnN0IGNoYXIqIGZtdCwgLi4uKTsKLQotLyoqCi0gKiBQcmludCB2ZXJib3NlIG91dHB1dCBtZXNzYWdlCi0gKi8KLXZvaWQgcHZlcmJvc2UoY29uc3QgY2hhciogZm10LCAuLi4pOwotCi0vKioKLSAqIEZhaWx1cmUhCi0gKi8KLXZvaWQgZmFpbHVyZShjb25zdCBjaGFyKiBmbXQsIC4uLik7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9tYWluLmNjIGIvY29tcGlsZXIvY3BwL3NyYy9tYWluLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTFkOWIwLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvbWFpbi5jYworKysgL2Rldi9udWxsCkBAIC0xLDEyOTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIHRocmlmdCAtIGEgbGlnaHR3ZWlnaHQgY3Jvc3MtbGFuZ3VhZ2UgcnBjL3NlcmlhbGl6YXRpb24gdG9vbAotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgbWFpbiBjb21waWxlciBlbmdpbmUgZm9yIFRocmlmdCwgd2hpY2ggaW52b2tlcyB0aGUKLSAqIHNjYW5uZXIvcGFyc2VyIHRvIGJ1aWxkIHRoZSB0aHJpZnQgb2JqZWN0IHRyZWUuIFRoZSBpbnRlcmZhY2UgZ2VuZXJhdGlvbgotICogY29kZSBmb3IgZWFjaCBsYW5ndWFnZSBsaXZlcyBpbiBhIGZpbGUgYnkgdGhlIGxhbmd1YWdlIG5hbWUgdW5kZXIgdGhlCi0gKiBnZW5lcmF0ZS8gZm9sZGVyLCBhbmQgYWxsIHBhcnNlIHN0cnVjdHVyZXMgbGl2ZSBpbiBwYXJzZS8KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGNhc3NlcnQ+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8bGltaXRzLmg+Ci0KLSNpZmRlZiBfV0lOMzIKLSNpbmNsdWRlIDx3aW5kb3dzLmg+IC8qIGZvciBHZXRGdWxsUGF0aE5hbWUgKi8KLSNlbmRpZgotCi0vLyBDYXJlZnVsOiBtdXN0IGluY2x1ZGUgZ2xvYmFscyBmaXJzdCBmb3IgZXh0ZXJuIGRlZmluaXRpb25zCi0jaW5jbHVkZSAiZ2xvYmFscy5oIgotCi0jaW5jbHVkZSAicGxhdGZvcm0uaCIKLSNpbmNsdWRlICJtYWluLmgiCi0jaW5jbHVkZSAicGFyc2UvdF9wcm9ncmFtLmgiCi0jaW5jbHVkZSAicGFyc2UvdF9zY29wZS5oIgotI2luY2x1ZGUgImdlbmVyYXRlL3RfZ2VuZXJhdG9yLmgiCi0jaW5jbHVkZSAiYXVkaXQvdF9hdWRpdC5oIgotCi0jaW5jbHVkZSAidmVyc2lvbi5oIgotCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCi0vKioKLSAqIEdsb2JhbCBwcm9ncmFtIHRyZWUKLSAqLwotdF9wcm9ncmFtKiBnX3Byb2dyYW07Ci0KLS8qKgotICogR2xvYmFsIHR5cGVzCi0gKi8KLQotdF90eXBlKiBnX3R5cGVfdm9pZDsKLXRfdHlwZSogZ190eXBlX3N0cmluZzsKLXRfdHlwZSogZ190eXBlX2JpbmFyeTsKLXRfdHlwZSogZ190eXBlX3NsaXN0OwotdF90eXBlKiBnX3R5cGVfYm9vbDsKLXRfdHlwZSogZ190eXBlX2J5dGU7Ci10X3R5cGUqIGdfdHlwZV9pMTY7Ci10X3R5cGUqIGdfdHlwZV9pMzI7Ci10X3R5cGUqIGdfdHlwZV9pNjQ7Ci10X3R5cGUqIGdfdHlwZV9kb3VibGU7Ci0KLS8qKgotICogR2xvYmFsIHNjb3BlCi0gKi8KLXRfc2NvcGUqIGdfc2NvcGU7Ci0KLS8qKgotICogUGFyZW50IHNjb3BlIHRvIGFsc28gcGFyc2UgdHlwZXMKLSAqLwotdF9zY29wZSogZ19wYXJlbnRfc2NvcGU7Ci0KLS8qKgotICogUHJlZml4IGZvciBwdXR0aW5nIHR5cGVzIGluIHBhcmVudCBzY29wZQotICovCi1zdHJpbmcgZ19wYXJlbnRfcHJlZml4OwotCi0vKioKLSAqIFBhcnNpbmcgcGFzcwotICovCi1QQVJTRV9NT0RFIGdfcGFyc2VfbW9kZTsKLQotLyoqCi0gKiBDdXJyZW50IGRpcmVjdG9yeSBvZiBmaWxlIGJlaW5nIHBhcnNlZAotICovCi1zdHJpbmcgZ19jdXJkaXI7Ci0KLS8qKgotICogQ3VycmVudCBmaWxlIGJlaW5nIHBhcnNlZAotICovCi1zdHJpbmcgZ19jdXJwYXRoOwotCi0vKioKLSAqIFNlYXJjaCBwYXRoIGZvciBpbmNsdXNpb25zCi0gKi8KLXZlY3RvcjxzdHJpbmc+IGdfaW5jbF9zZWFyY2hwYXRoOwotCi0vKioKLSAqIEdsb2JhbCBkZWJ1ZyBzdGF0ZQotICovCi1pbnQgZ19kZWJ1ZyA9IDA7Ci0KLS8qKgotICogU3RyaWN0bmVzcyBsZXZlbAotICovCi1pbnQgZ19zdHJpY3QgPSAxMjc7Ci0KLS8qKgotICogV2FybmluZyBsZXZlbAotICovCi1pbnQgZ193YXJuID0gMTsKLQotLyoqCi0gKiBWZXJib3NlIG91dHB1dAotICovCi1pbnQgZ192ZXJib3NlID0gMDsKLQotLyoqCi0gKiBHbG9iYWwgdGltZSBzdHJpbmcKLSAqLwotY2hhciogZ190aW1lX3N0cjsKLQotLyoqCi0gKiBUaGUgbGFzdCBwYXJzZWQgZG9jdGV4dCBjb21tZW50LgotICovCi1jaGFyKiBnX2RvY3RleHQ7Ci0KLS8qKgotICogVGhlIGxvY2F0aW9uIG9mIHRoZSBsYXN0IHBhcnNlZCBkb2N0ZXh0IGNvbW1lbnQuCi0gKi8KLWludCBnX2RvY3RleHRfbGluZW5vOwotCi0vKioKLSAqIFRoZSBGaXJzdCBkb2N0ZXh0IGNvbW1lbnQKLSAqLwotY2hhciogZ19wcm9ncmFtX2RvY3RleHRfY2FuZGlkYXRlOwotaW50IGdfcHJvZ3JhbV9kb2N0ZXh0X2xpbmVubyA9IDA7Ci1QUk9HRE9DVEVYVF9TVEFUVVMgZ19wcm9ncmFtX2RvY3RleHRfc3RhdHVzID0gSU5WQUxJRDsKLQotLyoqCi0gKiBXaGV0aGVyIG9yIG5vdCBuZWdhdGl2ZSBmaWVsZCBrZXlzIGFyZSBhY2NlcHRlZC4KLSAqLwotaW50IGdfYWxsb3dfbmVnX2ZpZWxkX2tleXM7Ci0KLS8qKgotICogV2hldGhlciBvciBub3QgNjQtYml0IGNvbnN0YW50cyB3aWxsIGdlbmVyYXRlIGEgd2FybmluZy4KLSAqLwotaW50IGdfYWxsb3dfNjRiaXRfY29uc3RzID0gMDsKLQotLyoqCi0gKiBGbGFncyB0byBjb250cm9sIGNvZGUgZ2VuZXJhdGlvbgotICovCi1ib29sIGdlbl9yZWN1cnNlID0gZmFsc2U7Ci0KLS8qKgotICogRmxhZ3MgdG8gY29udHJvbCB0aHJpZnQgYXVkaXQKLSAqLwotYm9vbCBnX2F1ZGl0ID0gZmFsc2U7Ci0KLS8qKgotICogRmxhZyB0byBjb250cm9sIHJldHVybiBzdGF0dXMKLSAqLwotYm9vbCBnX3JldHVybl9mYWlsdXJlID0gZmFsc2U7Ci1ib29sIGdfYXVkaXRfZmF0YWwgPSB0cnVlOwotCi0vKioKLSAqIFdpbjMyIGRvZXNuJ3QgaGF2ZSByZWFscGF0aCwgc28gdXNlIGZhbGxiYWNrIGltcGxlbWVudGF0aW9uIGluIHRoYXQgY2FzZSwKLSAqIG90aGVyd2lzZSB0aGlzIGp1c3QgY2FsbHMgdGhyb3VnaCB0byByZWFscGF0aAotICovCi1jaGFyKiBzYWZlcmVhbHBhdGgoY29uc3QgY2hhciogcGF0aCwgY2hhciogcmVzb2x2ZWRfcGF0aCkgewotI2lmZGVmIF9XSU4zMgotICBjaGFyIGJ1ZltNQVhfUEFUSF07Ci0gIGNoYXIqIGJhc2VuYW1lOwotICBEV09SRCBsZW4gPSBHZXRGdWxsUGF0aE5hbWUocGF0aCwgTUFYX1BBVEgsIGJ1ZiwgJmJhc2VuYW1lKTsKLSAgaWYgKGxlbiA9PSAwIHx8IGxlbiA+IE1BWF9QQVRIIC0gMSkgewotICAgIHN0cmNweShyZXNvbHZlZF9wYXRoLCBwYXRoKTsKLSAgfSBlbHNlIHsKLSAgICBzdHJjcHkocmVzb2x2ZWRfcGF0aCwgYnVmKTsKLSAgfQotCi0gIC8vIFJlcGxhY2UgYmFja3NsYXNoZXMgd2l0aCBmb3J3YXJkIHNsYXNoZXMgc28gdGhlCi0gIC8vIHJlc3Qgb2YgdGhlIGNvZGUgYmVoYXZlcyBjb3JyZWN0bHkuCi0gIHNpemVfdCByZXNvbHZlZF9sZW4gPSBzdHJsZW4ocmVzb2x2ZWRfcGF0aCk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVzb2x2ZWRfbGVuOyBpKyspIHsKLSAgICBpZiAocmVzb2x2ZWRfcGF0aFtpXSA9PSAnXFwnKSB7Ci0gICAgICByZXNvbHZlZF9wYXRoW2ldID0gJy8nOwotICAgIH0KLSAgfQotICByZXR1cm4gcmVzb2x2ZWRfcGF0aDsKLSNlbHNlCi0gIHJldHVybiByZWFscGF0aChwYXRoLCByZXNvbHZlZF9wYXRoKTsKLSNlbmRpZgotfQotCi1ib29sIGNoZWNrX2lzX2RpcmVjdG9yeShjb25zdCBjaGFyKiBkaXJfbmFtZSkgewotI2lmZGVmIF9XSU4zMgotICBEV09SRCBhdHRyaWJ1dGVzID0gOjpHZXRGaWxlQXR0cmlidXRlc0EoZGlyX25hbWUpOwotICBpZiAoYXR0cmlidXRlcyA9PSBJTlZBTElEX0ZJTEVfQVRUUklCVVRFUykgewotICAgIGZwcmludGYoc3RkZXJyLAotICAgICAgICAgICAgIk91dHB1dCBkaXJlY3RvcnkgJXMgaXMgdW51c2FibGU6IEdldExhc3RFcnJvcigpID0gJWxkXG4iLAotICAgICAgICAgICAgZGlyX25hbWUsCi0gICAgICAgICAgICBHZXRMYXN0RXJyb3IoKSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICgoYXR0cmlidXRlcyAmIEZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWSkgIT0gRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJPdXRwdXQgZGlyZWN0b3J5ICVzIGV4aXN0cyBidXQgaXMgbm90IGEgZGlyZWN0b3J5XG4iLCBkaXJfbmFtZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotI2Vsc2UKLSAgc3RydWN0IHN0YXQgc2I7Ci0gIGlmIChzdGF0KGRpcl9uYW1lLCAmc2IpIDwgMCkgewotICAgIGZwcmludGYoc3RkZXJyLCAiT3V0cHV0IGRpcmVjdG9yeSAlcyBpcyB1bnVzYWJsZTogJXNcbiIsIGRpcl9uYW1lLCBzdHJlcnJvcihlcnJubykpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIVNfSVNESVIoc2Iuc3RfbW9kZSkpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIk91dHB1dCBkaXJlY3RvcnkgJXMgZXhpc3RzIGJ1dCBpcyBub3QgYSBkaXJlY3RvcnlcbiIsIGRpcl9uYW1lKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci0jZW5kaWYKLX0KLQotLyoqCi0gKiBSZXBvcnQgYW4gZXJyb3IgdG8gdGhlIHVzZXIuIFRoaXMgaXMgY2FsbGVkIHl5ZXJyb3IgZm9yIGhpc3RvcmljYWwKLSAqIHJlYXNvbnMgKGxleCBhbmQgeWFjYyBleHBlY3QgdGhlIGVycm9yIHJlcG9ydGluZyByb3V0aW5lIHRvIGJlIGNhbGxlZAotICogdGhpcykuIENhbGwgdGhpcyBmdW5jdGlvbiB0byByZXBvcnQgYW55IGVycm9ycyB0byB0aGUgdXNlci4KLSAqIHl5ZXJyb3IgdGFrZXMgcHJpbnRmIHN0eWxlIGFyZ3VtZW50cy4KLSAqCi0gKiBAcGFyYW0gZm10IEMgZm9ybWF0IHN0cmluZyBmb2xsb3dlZCBieSBhZGRpdGlvbmFsIGFyZ3VtZW50cwotICovCi12b2lkIHl5ZXJyb3IoY29uc3QgY2hhciogZm10LCAuLi4pIHsKLSAgdmFfbGlzdCBhcmdzOwotICBmcHJpbnRmKHN0ZGVyciwgIltFUlJPUjolczolZF0gKGxhc3QgdG9rZW4gd2FzICclcycpXG4iLCBnX2N1cnBhdGguY19zdHIoKSwgeXlsaW5lbm8sIHl5dGV4dCk7Ci0KLSAgdmFfc3RhcnQoYXJncywgZm10KTsKLSAgdmZwcmludGYoc3RkZXJyLCBmbXQsIGFyZ3MpOwotICB2YV9lbmQoYXJncyk7Ci0KLSAgZnByaW50ZihzdGRlcnIsICJcbiIpOwotfQotCi0vKioKLSAqIFByaW50cyBhIGRlYnVnIG1lc3NhZ2UgZnJvbSB0aGUgcGFyc2VyLgotICoKLSAqIEBwYXJhbSBmbXQgQyBmb3JtYXQgc3RyaW5nIGZvbGxvd2VkIGJ5IGFkZGl0aW9uYWwgYXJndW1lbnRzCi0gKi8KLXZvaWQgcGRlYnVnKGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7Ci0gIGlmIChnX2RlYnVnID09IDApIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgdmFfbGlzdCBhcmdzOwotICBwcmludGYoIltQQVJTRTolZF0gIiwgeXlsaW5lbm8pOwotICB2YV9zdGFydChhcmdzLCBmbXQpOwotICB2cHJpbnRmKGZtdCwgYXJncyk7Ci0gIHZhX2VuZChhcmdzKTsKLSAgcHJpbnRmKCJcbiIpOwotfQotCi0vKioKLSAqIFByaW50cyBhIHZlcmJvc2Ugb3V0cHV0IG1vZGUgbWVzc2FnZQotICoKLSAqIEBwYXJhbSBmbXQgQyBmb3JtYXQgc3RyaW5nIGZvbGxvd2VkIGJ5IGFkZGl0aW9uYWwgYXJndW1lbnRzCi0gKi8KLXZvaWQgcHZlcmJvc2UoY29uc3QgY2hhciogZm10LCAuLi4pIHsKLSAgaWYgKGdfdmVyYm9zZSA9PSAwKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHZhX2xpc3QgYXJnczsKLSAgdmFfc3RhcnQoYXJncywgZm10KTsKLSAgdnByaW50ZihmbXQsIGFyZ3MpOwotICB2YV9lbmQoYXJncyk7Ci19Ci0KLS8qKgotICogUHJpbnRzIGEgd2FybmluZyBtZXNzYWdlCi0gKgotICogQHBhcmFtIGZtdCBDIGZvcm1hdCBzdHJpbmcgZm9sbG93ZWQgYnkgYWRkaXRpb25hbCBhcmd1bWVudHMKLSAqLwotdm9pZCBwd2FybmluZyhpbnQgbGV2ZWwsIGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7Ci0gIGlmIChnX3dhcm4gPCBsZXZlbCkgewotICAgIHJldHVybjsKLSAgfQotICB2YV9saXN0IGFyZ3M7Ci0gIHByaW50ZigiW1dBUk5JTkc6JXM6JWRdICIsIGdfY3VycGF0aC5jX3N0cigpLCB5eWxpbmVubyk7Ci0gIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0gIHZwcmludGYoZm10LCBhcmdzKTsKLSAgdmFfZW5kKGFyZ3MpOwotICBwcmludGYoIlxuIik7Ci19Ci0KLS8qKgotICogUHJpbnRzIGEgZmFpbHVyZSBtZXNzYWdlIGFuZCBleGl0cwotICoKLSAqIEBwYXJhbSBmbXQgQyBmb3JtYXQgc3RyaW5nIGZvbGxvd2VkIGJ5IGFkZGl0aW9uYWwgYXJndW1lbnRzCi0gKi8KLXZvaWQgZmFpbHVyZShjb25zdCBjaGFyKiBmbXQsIC4uLikgewotICB2YV9saXN0IGFyZ3M7Ci0gIGZwcmludGYoc3RkZXJyLCAiW0ZBSUxVUkU6JXM6JWRdICIsIGdfY3VycGF0aC5jX3N0cigpLCB5eWxpbmVubyk7Ci0gIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0gIHZmcHJpbnRmKHN0ZGVyciwgZm10LCBhcmdzKTsKLSAgdmFfZW5kKGFyZ3MpOwotICBwcmludGYoIlxuIik7Ci0gIGV4aXQoMSk7Ci19Ci0KLS8qKgotICogQ29udmVydHMgYSBzdHJpbmcgZmlsZW5hbWUgaW50byBhIHRocmlmdCBwcm9ncmFtIG5hbWUKLSAqLwotc3RyaW5nIHByb2dyYW1fbmFtZShzdHJpbmcgZmlsZW5hbWUpIHsKLSAgc3RyaW5nOjpzaXplX3R5cGUgc2xhc2ggPSBmaWxlbmFtZS5yZmluZCgiLyIpOwotICBpZiAoc2xhc2ggIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgZmlsZW5hbWUgPSBmaWxlbmFtZS5zdWJzdHIoc2xhc2ggKyAxKTsKLSAgfQotICBzdHJpbmc6OnNpemVfdHlwZSBkb3QgPSBmaWxlbmFtZS5yZmluZCgiLiIpOwotICBpZiAoZG90ICE9IHN0cmluZzo6bnBvcykgewotICAgIGZpbGVuYW1lID0gZmlsZW5hbWUuc3Vic3RyKDAsIGRvdCk7Ci0gIH0KLSAgcmV0dXJuIGZpbGVuYW1lOwotfQotCi0vKioKLSAqIEdldHMgdGhlIGRpcmVjdG9yeSBwYXRoIG9mIGEgZmlsZW5hbWUKLSAqLwotc3RyaW5nIGRpcmVjdG9yeV9uYW1lKHN0cmluZyBmaWxlbmFtZSkgewotICBzdHJpbmc6OnNpemVfdHlwZSBzbGFzaCA9IGZpbGVuYW1lLnJmaW5kKCIvIik7Ci0gIC8vIE5vIHNsYXNoLCBqdXN0IHVzZSB0aGUgY3VycmVudCBkaXJlY3RvcnkKLSAgaWYgKHNsYXNoID09IHN0cmluZzo6bnBvcykgewotICAgIHJldHVybiAiLiI7Ci0gIH0KLSAgcmV0dXJuIGZpbGVuYW1lLnN1YnN0cigwLCBzbGFzaCk7Ci19Ci0KLS8qKgotICogRmluZHMgdGhlIGFwcHJvcHJpYXRlIGZpbGUgcGF0aCBmb3IgdGhlIGdpdmVuIGZpbGVuYW1lCi0gKi8KLXN0cmluZyBpbmNsdWRlX2ZpbGUoc3RyaW5nIGZpbGVuYW1lKSB7Ci0gIC8vIEFic29sdXRlIHBhdGg/IEp1c3QgdHJ5IHRoYXQKLSAgaWYgKGZpbGVuYW1lWzBdID09ICcvJykgewotICAgIC8vIFJlYWxwYXRoIQotICAgIGNoYXIgcnBbVEhSSUZUX1BBVEhfTUFYXTsKLSAgICBpZiAoc2FmZXJlYWxwYXRoKGZpbGVuYW1lLmNfc3RyKCksIHJwKSA9PSBOVUxMKSB7Ci0gICAgICBwd2FybmluZygwLCAiQ2Fubm90IG9wZW4gaW5jbHVkZSBmaWxlICVzXG4iLCBmaWxlbmFtZS5jX3N0cigpKTsKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygpOwotICAgIH0KLQotICAgIC8vIFN0YXQgdGhpcyBmaWxlCi0gICAgc3RydWN0IHN0YXQgZmluZm87Ci0gICAgaWYgKHN0YXQocnAsICZmaW5mbykgPT0gMCkgewotICAgICAgcmV0dXJuIHJwOwotICAgIH0KLSAgfSBlbHNlIHsgLy8gcmVsYXRpdmUgcGF0aCwgc3RhcnQgc2VhcmNoaW5nCi0gICAgLy8gbmV3IHNlYXJjaCBwYXRoIHdpdGggY3VycmVudCBkaXIgZ2xvYmFsCi0gICAgdmVjdG9yPHN0cmluZz4gc3AgPSBnX2luY2xfc2VhcmNocGF0aDsKLSAgICBzcC5pbnNlcnQoc3AuYmVnaW4oKSwgZ19jdXJkaXIpOwotCi0gICAgLy8gaXRlcmF0ZSB0aHJvdWdoIHBhdGhzCi0gICAgdmVjdG9yPHN0cmluZz46Oml0ZXJhdG9yIGl0OwotICAgIGZvciAoaXQgPSBzcC5iZWdpbigpOyBpdCAhPSBzcC5lbmQoKTsgaXQrKykgewotICAgICAgc3RyaW5nIHNmaWxlbmFtZSA9ICooaXQpICsgIi8iICsgZmlsZW5hbWU7Ci0KLSAgICAgIC8vIFJlYWxwYXRoIQotICAgICAgY2hhciBycFtUSFJJRlRfUEFUSF9NQVhdOwotICAgICAgaWYgKHNhZmVyZWFscGF0aChzZmlsZW5hbWUuY19zdHIoKSwgcnApID09IE5VTEwpIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIC8vIFN0YXQgdGhpcyBmaWxlcwotICAgICAgc3RydWN0IHN0YXQgZmluZm87Ci0gICAgICBpZiAoc3RhdChycCwgJmZpbmZvKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBycDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvLyBVaCBvaAotICBwd2FybmluZygwLCAiQ291bGQgbm90IGZpbmQgaW5jbHVkZSBmaWxlICVzXG4iLCBmaWxlbmFtZS5jX3N0cigpKTsKLSAgcmV0dXJuIHN0ZDo6c3RyaW5nKCk7Ci19Ci0KLS8qKgotICogQ2xlYXJzIGFueSBwcmV2aW91c2x5IHN0b3JlZCBkb2N0ZXh0IHN0cmluZy4KLSAqIEFsc28gcHJpbnRzIGEgd2FybmluZyBpZiB3ZSBhcmUgZGlzY2FyZGluZyBpbmZvcm1hdGlvbi4KLSAqLwotdm9pZCBjbGVhcl9kb2N0ZXh0KCkgewotICBpZiAoZ19kb2N0ZXh0ICE9IE5VTEwpIHsKLSAgICBwd2FybmluZygyLCAiVW5jYXB0dXJlZCBkb2N0ZXh0IGF0IG9uIGxpbmUgJWQuIiwgZ19kb2N0ZXh0X2xpbmVubyk7Ci0gIH0KLSAgZnJlZShnX2RvY3RleHQpOwotICBnX2RvY3RleHQgPSBOVUxMOwotfQotCi0vKioKLSAqIFJlc2V0IHByb2dyYW0gZG9jdGV4dCBpbmZvcm1hdGlvbiBhZnRlciBwcm9jZXNzaW5nIGEgZmlsZQotICovCi12b2lkIHJlc2V0X3Byb2dyYW1fZG9jdGV4dF9pbmZvKCkgewotICBpZiAoZ19wcm9ncmFtX2RvY3RleHRfY2FuZGlkYXRlICE9IE5VTEwpIHsKLSAgICBmcmVlKGdfcHJvZ3JhbV9kb2N0ZXh0X2NhbmRpZGF0ZSk7Ci0gICAgZ19wcm9ncmFtX2RvY3RleHRfY2FuZGlkYXRlID0gTlVMTDsKLSAgfQotICBnX3Byb2dyYW1fZG9jdGV4dF9saW5lbm8gPSAwOwotICBnX3Byb2dyYW1fZG9jdGV4dF9zdGF0dXMgPSBJTlZBTElEOwotICBwZGVidWcoIiVzIiwgInByb2dyYW0gZG9jdGV4dCBzZXQgdG8gSU5WQUxJRCIpOwotfQotCi0vKioKLSAqIFdlIGFyZSBzdXJlIHRoZSBwcm9ncmFtIGRvY3RleHQgY2FuZGlkYXRlIGlzIHJlYWxseSB0aGUgcHJvZ3JhbSBkb2N0ZXh0LgotICovCi12b2lkIGRlY2xhcmVfdmFsaWRfcHJvZ3JhbV9kb2N0ZXh0KCkgewotICBpZiAoKGdfcHJvZ3JhbV9kb2N0ZXh0X2NhbmRpZGF0ZSAhPSBOVUxMKSAmJiAoZ19wcm9ncmFtX2RvY3RleHRfc3RhdHVzID09IFNUSUxMX0NBTkRJREFURSkpIHsKLSAgICBnX3Byb2dyYW1fZG9jdGV4dF9zdGF0dXMgPSBBQlNPTFVURUxZX1NVUkU7Ci0gICAgcGRlYnVnKCIlcyIsICJwcm9ncmFtIGRvY3RleHQgc2V0IHRvIEFCU09MVVRFTFlfU1VSRSIpOwotICB9IGVsc2UgewotICAgIGdfcHJvZ3JhbV9kb2N0ZXh0X3N0YXR1cyA9IE5PX1BST0dSQU1fRE9DVEVYVDsKLSAgICBwZGVidWcoIiVzIiwgInByb2dyYW0gZG9jdGV4dCBzZXQgdG8gTk9fUFJPR1JBTV9ET0NURVhUIik7Ci0gIH0KLX0KLQotLyoqCi0gKiBDbGVhbnMgdXAgdGV4dCBjb21tb25seSBmb3VuZCBpbiBkb3h5Z2VuLWxpa2UgY29tbWVudHMKLSAqCi0gKiBXYXJuaW5nOiBpZiB5b3UgbWl4IHRhYnMgYW5kIHNwYWNlcyBpbiBhIG5vbi11bmlmb3JtIHdheSwKLSAqIHlvdSB3aWxsIGdldCB3aGF0IHlvdSBkZXNlcnZlLgotICovCi1jaGFyKiBjbGVhbl91cF9kb2N0ZXh0KGNoYXIqIGRvY3RleHQpIHsKLSAgLy8gQ29udmVydCB0byBDKysgc3RyaW5nLCBhbmQgcmVtb3ZlIFdpbmRvd3MncyBjYXJyaWFnZSByZXR1cm5zLgotICBzdHJpbmcgZG9jc3RyaW5nID0gZG9jdGV4dDsKLSAgZG9jc3RyaW5nLmVyYXNlKHJlbW92ZShkb2NzdHJpbmcuYmVnaW4oKSwgZG9jc3RyaW5nLmVuZCgpLCAnXHInKSwgZG9jc3RyaW5nLmVuZCgpKTsKLQotICAvLyBTZXBhcmF0ZSBpbnRvIGxpbmVzLgotICB2ZWN0b3I8c3RyaW5nPiBsaW5lczsKLSAgc3RyaW5nOjpzaXplX3R5cGUgcG9zID0gc3RyaW5nOjpucG9zOwotICBzdHJpbmc6OnNpemVfdHlwZSBsYXN0OwotICB3aGlsZSAodHJ1ZSkgewotICAgIGxhc3QgPSAocG9zID09IHN0cmluZzo6bnBvcykgPyAwIDogcG9zICsgMTsKLSAgICBwb3MgPSBkb2NzdHJpbmcuZmluZCgnXG4nLCBsYXN0KTsKLSAgICBpZiAocG9zID09IHN0cmluZzo6bnBvcykgewotICAgICAgLy8gRmlyc3QgYml0IG9mIGNsZWFuaW5nLiAgSWYgdGhlIGxhc3QgbGluZSBpcyBvbmx5IHdoaXRlc3BhY2UsIGRyb3AgaXQuCi0gICAgICBzdHJpbmc6OnNpemVfdHlwZSBub253aGl0ZSA9IGRvY3N0cmluZy5maW5kX2ZpcnN0X25vdF9vZigiIFx0IiwgbGFzdCk7Ci0gICAgICBpZiAobm9ud2hpdGUgIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgICAgIGxpbmVzLnB1c2hfYmFjayhkb2NzdHJpbmcuc3Vic3RyKGxhc3QpKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBsaW5lcy5wdXNoX2JhY2soZG9jc3RyaW5nLnN1YnN0cihsYXN0LCBwb3MgLSBsYXN0KSk7Ci0gIH0KLQotICAvLyBBIHZlcnkgcHJvZm91bmQgZG9jc3RyaW5nLgotICBpZiAobGluZXMuZW1wdHkoKSkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgLy8gQ2xlYXIgbGVhZGluZyB3aGl0ZXNwYWNlIGZyb20gdGhlIGZpcnN0IGxpbmUuCi0gIHBvcyA9IGxpbmVzLmZyb250KCkuZmluZF9maXJzdF9ub3Rfb2YoIiBcdCIpOwotICBsaW5lcy5mcm9udCgpLmVyYXNlKDAsIHBvcyk7Ci0KLSAgLy8gSWYgZXZlcnkgbm9uYmxhbmsgbGluZSBhZnRlciB0aGUgZmlyc3QgaGFzIHRoZSBzYW1lIG51bWJlciBvZiBzcGFjZXMvdGFicywKLSAgLy8gdGhlbiBhIHN0YXIsIHJlbW92ZSB0aGVtLgotICBib29sIGhhdmVfcHJlZml4ID0gdHJ1ZTsKLSAgYm9vbCBmb3VuZF9wcmVmaXggPSBmYWxzZTsKLSAgc3RyaW5nOjpzaXplX3R5cGUgcHJlZml4X2xlbiA9IDA7Ci0gIHZlY3RvcjxzdHJpbmc+OjppdGVyYXRvciBsX2l0ZXI7Ci0gIGZvciAobF9pdGVyID0gbGluZXMuYmVnaW4oKSArIDE7IGxfaXRlciAhPSBsaW5lcy5lbmQoKTsgKytsX2l0ZXIpIHsKLSAgICBpZiAobF9pdGVyLT5lbXB0eSgpKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICBwb3MgPSBsX2l0ZXItPmZpbmRfZmlyc3Rfbm90X29mKCIgXHQiKTsKLSAgICBpZiAoIWZvdW5kX3ByZWZpeCkgewotICAgICAgaWYgKHBvcyAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICAgICAgaWYgKGxfaXRlci0+YXQocG9zKSA9PSAnKicpIHsKLSAgICAgICAgICBmb3VuZF9wcmVmaXggPSB0cnVlOwotICAgICAgICAgIHByZWZpeF9sZW4gPSBwb3M7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaGF2ZV9wcmVmaXggPSBmYWxzZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gV2hpdGVzcGFjZS1vbmx5IGxpbmUuICBUcnVuY2F0ZSBpdC4KLSAgICAgICAgbF9pdGVyLT5jbGVhcigpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAobF9pdGVyLT5zaXplKCkgPiBwb3MgJiYgbF9pdGVyLT5hdChwb3MpID09ICcqJyAmJiBwb3MgPT0gcHJlZml4X2xlbikgewotICAgICAgLy8gQnVzaW5lc3MgYXMgdXN1YWwuCi0gICAgfSBlbHNlIGlmIChwb3MgPT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgICAvLyBXaGl0ZXNwYWNlLW9ubHkgbGluZS4gIExldCdzIHRydW5jYXRlIGl0IGZvciB0aGVtLgotICAgICAgbF9pdGVyLT5jbGVhcigpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBUaGUgcGF0dGVybiBoYXMgYmVlbiBicm9rZW4uCi0gICAgICBoYXZlX3ByZWZpeCA9IGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgLy8gSWYgb3VyIHByZWZpeCBzdXJ2aXZlZCwgZGVsZXRlIGl0IGZyb20gZXZlcnkgbGluZS4KLSAgaWYgKGhhdmVfcHJlZml4KSB7Ci0gICAgLy8gR2V0IHRoZSBzdGFyIHRvby4KLSAgICBwcmVmaXhfbGVuKys7Ci0gICAgZm9yIChsX2l0ZXIgPSBsaW5lcy5iZWdpbigpICsgMTsgbF9pdGVyICE9IGxpbmVzLmVuZCgpOyArK2xfaXRlcikgewotICAgICAgbF9pdGVyLT5lcmFzZSgwLCBwcmVmaXhfbGVuKTsKLSAgICB9Ci0gIH0KLQotICAvLyBOb3cgZGVsZXRlIHRoZSBtaW5pbXVtIGFtb3VudCBvZiBsZWFkaW5nIHdoaXRlc3BhY2UgZnJvbSBlYWNoIGxpbmUuCi0gIHByZWZpeF9sZW4gPSBzdHJpbmc6Om5wb3M7Ci0gIGZvciAobF9pdGVyID0gbGluZXMuYmVnaW4oKSArIDE7IGxfaXRlciAhPSBsaW5lcy5lbmQoKTsgKytsX2l0ZXIpIHsKLSAgICBpZiAobF9pdGVyLT5lbXB0eSgpKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgcG9zID0gbF9pdGVyLT5maW5kX2ZpcnN0X25vdF9vZigiIFx0Iik7Ci0gICAgaWYgKHBvcyAhPSBzdHJpbmc6Om5wb3MgJiYgKHByZWZpeF9sZW4gPT0gc3RyaW5nOjpucG9zIHx8IHBvcyA8IHByZWZpeF9sZW4pKSB7Ci0gICAgICBwcmVmaXhfbGVuID0gcG9zOwotICAgIH0KLSAgfQotCi0gIC8vIElmIG91ciBwcmVmaXggc3Vydml2ZWQsIGRlbGV0ZSBpdCBmcm9tIGV2ZXJ5IGxpbmUuCi0gIGlmIChwcmVmaXhfbGVuICE9IHN0cmluZzo6bnBvcykgewotICAgIGZvciAobF9pdGVyID0gbGluZXMuYmVnaW4oKSArIDE7IGxfaXRlciAhPSBsaW5lcy5lbmQoKTsgKytsX2l0ZXIpIHsKLSAgICAgIGxfaXRlci0+ZXJhc2UoMCwgcHJlZml4X2xlbik7Ci0gICAgfQotICB9Ci0KLSAgLy8gUmVtb3ZlIHRyYWlsaW5nIHdoaXRlc3BhY2UgZnJvbSBldmVyeSBsaW5lLgotICBmb3IgKGxfaXRlciA9IGxpbmVzLmJlZ2luKCk7IGxfaXRlciAhPSBsaW5lcy5lbmQoKTsgKytsX2l0ZXIpIHsKLSAgICBwb3MgPSBsX2l0ZXItPmZpbmRfbGFzdF9ub3Rfb2YoIiBcdCIpOwotICAgIGlmIChwb3MgIT0gc3RyaW5nOjpucG9zICYmIHBvcyAhPSBsX2l0ZXItPmxlbmd0aCgpIC0gMSkgewotICAgICAgbF9pdGVyLT5lcmFzZShwb3MgKyAxKTsKLSAgICB9Ci0gIH0KLQotICAvLyBJZiB0aGUgZmlyc3QgbGluZSBpcyBlbXB0eSwgcmVtb3ZlIGl0LgotICAvLyBEb24ndCBkbyB0aGlzIGVhcmxpZXIgYmVjYXVzZSBhIGxvdCBvZiBzdGVwcyBza2lwIHRoZSBmaXJzdCBsaW5lLgotICBpZiAobGluZXMuZnJvbnQoKS5lbXB0eSgpKSB7Ci0gICAgbGluZXMuZXJhc2UobGluZXMuYmVnaW4oKSk7Ci0gIH0KLQotICAvLyBOb3cgcmVqb2luIHRoZSBsaW5lcyBhbmQgY29weSB0aGVtIGJhY2sgaW50byBkb2N0ZXh0LgotICBkb2NzdHJpbmcuY2xlYXIoKTsKLSAgZm9yIChsX2l0ZXIgPSBsaW5lcy5iZWdpbigpOyBsX2l0ZXIgIT0gbGluZXMuZW5kKCk7ICsrbF9pdGVyKSB7Ci0gICAgZG9jc3RyaW5nICs9ICpsX2l0ZXI7Ci0gICAgZG9jc3RyaW5nICs9ICdcbic7Ci0gIH0KLQotICAvLyBhc3NlcnQoZG9jc3RyaW5nLmxlbmd0aCgpIDw9IHN0cmxlbihkb2N0ZXh0KSk7ICBtYXkgaGFwcGVuLCBzZWUgVEhSSUZULTE3NTUKLSAgaWYgKGRvY3N0cmluZy5sZW5ndGgoKSA8PSBzdHJsZW4oZG9jdGV4dCkpIHsKLSAgICBzdHJjcHkoZG9jdGV4dCwgZG9jc3RyaW5nLmNfc3RyKCkpOwotICB9IGVsc2UgewotICAgIGZyZWUoZG9jdGV4dCk7IC8vIHRvbyBzaG9ydAotICAgIGRvY3RleHQgPSBzdHJkdXAoZG9jc3RyaW5nLmNfc3RyKCkpOwotICB9Ci0gIHJldHVybiBkb2N0ZXh0OwotfQotCi0vKiogU2V0IHRvIHRydWUgdG8gZGVidWcgZG9jc3RyaW5nIHBhcnNpbmcgKi8KLXN0YXRpYyBib29sIGR1bXBfZG9jcyA9IGZhbHNlOwotCi0vKioKLSAqIER1bXBzIGRvY3N0cmluZ3MgdG8gc3Rkb3V0Ci0gKiBPbmx5IHdvcmtzIGZvciB0b3AtbGV2ZWwgZGVmaW5pdGlvbnMgYW5kIHRoZSB3aG9sZSBwcm9ncmFtIGRvYwotICogKGkuZS4sIG5vdCBlbnVtIGNvbnN0YW50cywgc3RydWN0IGZpZWxkcywgb3IgZnVuY3Rpb25zLgotICovCi12b2lkIGR1bXBfZG9jc3RyaW5ncyh0X3Byb2dyYW0qIHByb2dyYW0pIHsKLSAgc3RyaW5nIHByb2dkb2MgPSBwcm9ncmFtLT5nZXRfZG9jKCk7Ci0gIGlmICghcHJvZ2RvYy5lbXB0eSgpKSB7Ci0gICAgcHJpbnRmKCJXaG9sZSBwcm9ncmFtIGRvYzpcbiVzXG4iLCBwcm9nZG9jLmNfc3RyKCkpOwotICB9Ci0gIGNvbnN0IHZlY3Rvcjx0X3R5cGVkZWYqPiYgdHlwZWRlZnMgPSBwcm9ncmFtLT5nZXRfdHlwZWRlZnMoKTsKLSAgdmVjdG9yPHRfdHlwZWRlZio+Ojpjb25zdF9pdGVyYXRvciB0X2l0ZXI7Ci0gIGZvciAodF9pdGVyID0gdHlwZWRlZnMuYmVnaW4oKTsgdF9pdGVyICE9IHR5cGVkZWZzLmVuZCgpOyArK3RfaXRlcikgewotICAgIHRfdHlwZWRlZiogdGQgPSAqdF9pdGVyOwotICAgIGlmICh0ZC0+aGFzX2RvYygpKSB7Ci0gICAgICBwcmludGYoInR5cGVkZWYgJXM6XG4lc1xuIiwgdGQtPmdldF9uYW1lKCkuY19zdHIoKSwgdGQtPmdldF9kb2MoKS5jX3N0cigpKTsKLSAgICB9Ci0gIH0KLSAgY29uc3QgdmVjdG9yPHRfZW51bSo+JiBlbnVtcyA9IHByb2dyYW0tPmdldF9lbnVtcygpOwotICB2ZWN0b3I8dF9lbnVtKj46OmNvbnN0X2l0ZXJhdG9yIGVfaXRlcjsKLSAgZm9yIChlX2l0ZXIgPSBlbnVtcy5iZWdpbigpOyBlX2l0ZXIgIT0gZW51bXMuZW5kKCk7ICsrZV9pdGVyKSB7Ci0gICAgdF9lbnVtKiBlbiA9ICplX2l0ZXI7Ci0gICAgaWYgKGVuLT5oYXNfZG9jKCkpIHsKLSAgICAgIHByaW50ZigiZW51bSAlczpcbiVzXG4iLCBlbi0+Z2V0X25hbWUoKS5jX3N0cigpLCBlbi0+Z2V0X2RvYygpLmNfc3RyKCkpOwotICAgIH0KLSAgfQotICBjb25zdCB2ZWN0b3I8dF9jb25zdCo+JiBjb25zdHMgPSBwcm9ncmFtLT5nZXRfY29uc3RzKCk7Ci0gIHZlY3Rvcjx0X2NvbnN0Kj46OmNvbnN0X2l0ZXJhdG9yIGNfaXRlcjsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICB0X2NvbnN0KiBjbyA9ICpjX2l0ZXI7Ci0gICAgaWYgKGNvLT5oYXNfZG9jKCkpIHsKLSAgICAgIHByaW50ZigiY29uc3QgJXM6XG4lc1xuIiwgY28tPmdldF9uYW1lKCkuY19zdHIoKSwgY28tPmdldF9kb2MoKS5jX3N0cigpKTsKLSAgICB9Ci0gIH0KLSAgY29uc3QgdmVjdG9yPHRfc3RydWN0Kj4mIHN0cnVjdHMgPSBwcm9ncmFtLT5nZXRfc3RydWN0cygpOwotICB2ZWN0b3I8dF9zdHJ1Y3QqPjo6Y29uc3RfaXRlcmF0b3Igc19pdGVyOwotICBmb3IgKHNfaXRlciA9IHN0cnVjdHMuYmVnaW4oKTsgc19pdGVyICE9IHN0cnVjdHMuZW5kKCk7ICsrc19pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIHN0ID0gKnNfaXRlcjsKLSAgICBpZiAoc3QtPmhhc19kb2MoKSkgewotICAgICAgcHJpbnRmKCJzdHJ1Y3QgJXM6XG4lc1xuIiwgc3QtPmdldF9uYW1lKCkuY19zdHIoKSwgc3QtPmdldF9kb2MoKS5jX3N0cigpKTsKLSAgICB9Ci0gIH0KLSAgY29uc3QgdmVjdG9yPHRfc3RydWN0Kj4mIHhjZXB0aW9ucyA9IHByb2dyYW0tPmdldF94Y2VwdGlvbnMoKTsKLSAgdmVjdG9yPHRfc3RydWN0Kj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogeG4gPSAqeF9pdGVyOwotICAgIGlmICh4bi0+aGFzX2RvYygpKSB7Ci0gICAgICBwcmludGYoInhjZXB0aW9uICVzOlxuJXNcbiIsIHhuLT5nZXRfbmFtZSgpLmNfc3RyKCksIHhuLT5nZXRfZG9jKCkuY19zdHIoKSk7Ci0gICAgfQotICB9Ci0gIGNvbnN0IHZlY3Rvcjx0X3NlcnZpY2UqPiYgc2VydmljZXMgPSBwcm9ncmFtLT5nZXRfc2VydmljZXMoKTsKLSAgdmVjdG9yPHRfc2VydmljZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gIGZvciAodl9pdGVyID0gc2VydmljZXMuYmVnaW4oKTsgdl9pdGVyICE9IHNlcnZpY2VzLmVuZCgpOyArK3ZfaXRlcikgewotICAgIHRfc2VydmljZSogc3YgPSAqdl9pdGVyOwotICAgIGlmIChzdi0+aGFzX2RvYygpKSB7Ci0gICAgICBwcmludGYoInNlcnZpY2UgJXM6XG4lc1xuIiwgc3YtPmdldF9uYW1lKCkuY19zdHIoKSwgc3YtPmdldF9kb2MoKS5jX3N0cigpKTsKLSAgICB9Ci0gIH0KLX0KLQotLyoqCi0gKiBFbWl0cyBhIHdhcm5pbmcgb24gbGlzdDxieXRlPiwgYmluYXJ5IHR5cGUgaXMgdHlwaWNhbGx5IGEgbXVjaCBiZXR0ZXIgY2hvaWNlLgotICovCi12b2lkIGNoZWNrX2Zvcl9saXN0X29mX2J5dGVzKHRfdHlwZSogbGlzdF9lbGVtX3R5cGUpIHsKLSAgaWYgKChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgJiYgKGxpc3RfZWxlbV90eXBlICE9IE5VTEwpICYmIGxpc3RfZWxlbV90eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlKiB0YmFzZSA9ICh0X2Jhc2VfdHlwZSopbGlzdF9lbGVtX3R5cGU7Ci0gICAgaWYgKHRiYXNlLT5nZXRfYmFzZSgpID09IHRfYmFzZV90eXBlOjpUWVBFX0JZVEUpIHsKLSAgICAgIHB3YXJuaW5nKDEsICJDb25zaWRlciB1c2luZyB0aGUgbW9yZSBlZmZpY2llbnQgXCJiaW5hcnlcIiB0eXBlIGluc3RlYWQgb2YgXCJsaXN0PGJ5dGU+XCIuIik7Ci0gICAgfQotICB9Ci19Ci0KLS8qKgotICogUHJpbnRzIHRoZSB2ZXJzaW9uIG51bWJlcgotICovCi12b2lkIHZlcnNpb24oKSB7Ci0gIHByaW50ZigiVGhyaWZ0IHZlcnNpb24gJXNcbiIsIFRIUklGVF9WRVJTSU9OKTsKLX0KLQotLyoqCi0gKiBEaXNwbGF5IHRoZSB1c2FnZSBtZXNzYWdlIGFuZCB0aGVuIGV4aXQgd2l0aCBhbiBlcnJvciBjb2RlLgotICovCi12b2lkIHVzYWdlKCkgewotICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiB0aHJpZnQgW29wdGlvbnNdIGZpbGVcblxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiVXNlIHRocmlmdCAtaGVscCBmb3IgYSBsaXN0IG9mIG9wdGlvbnNcbiIpOwotICBleGl0KDEpOwotfQotCi0vKioKLSAqIERpcGxheXMgdGhlIGhlbHAgbWVzc2FnZSBhbmQgdGhlbiBleGl0cyB3aXRoIGFuIGVycm9yIGNvZGUuCi0gKi8KLXZvaWQgaGVscCgpIHsKLSAgZnByaW50ZihzdGRlcnIsICJVc2FnZTogdGhyaWZ0IFtvcHRpb25zXSBmaWxlXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICJPcHRpb25zOlxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtdmVyc2lvbiAgICBQcmludCB0aGUgY29tcGlsZXIgdmVyc2lvblxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtbyBkaXIgICAgICBTZXQgdGhlIG91dHB1dCBkaXJlY3RvcnkgZm9yIGdlbi0qIHBhY2thZ2VzXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAoZGVmYXVsdDogY3VycmVudCBkaXJlY3RvcnkpXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC1vdXQgZGlyICAgIFNldCB0aGUgb3VwdXQgbG9jYXRpb24gZm9yIGdlbmVyYXRlZCBmaWxlcy5cbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgIChubyBnZW4tKiBmb2xkZXIgd2lsbCBiZSBjcmVhdGVkKVxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtSSBkaXIgICAgICBBZGQgYSBkaXJlY3RvcnkgdG8gdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXNcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICBzZWFyY2hlZCBmb3IgaW5jbHVkZSBkaXJlY3RpdmVzXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC1ub3dhcm4gICAgIFN1cHByZXNzIGFsbCBjb21waWxlciB3YXJuaW5ncyAoQkFEISlcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLXN0cmljdCAgICAgU3RyaWN0IGNvbXBpbGVyIHdhcm5pbmdzIG9uXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC12W2VyYm9zZV0gIFZlcmJvc2UgbW9kZVxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtcltlY3Vyc2VdICBBbHNvIGdlbmVyYXRlIGluY2x1ZGVkIGZpbGVzXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC1kZWJ1ZyAgICAgIFBhcnNlIGRlYnVnIHRyYWNlIHRvIHN0ZG91dFxuIik7Ci0gIGZwcmludGYoc3RkZXJyLAotICAgICAgICAgICIgIC0tYWxsb3ctbmVnLWtleXMgIEFsbG93IG5lZ2F0aXZlIGZpZWxkIGtleXMgKFVzZWQgdG8gIgotICAgICAgICAgICJwcmVzZXJ2ZSBwcm90b2NvbFxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciAudGhyaWZ0IGZpbGVzKVxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtLWFsbG93LTY0Yml0LWNvbnN0cyAgRG8gbm90IHByaW50IHdhcm5pbmdzIGFib3V0IHVzaW5nIDY0LWJpdCBjb25zdGFudHNcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLS1nZW4gU1RSICAgR2VuZXJhdGUgY29kZSB3aXRoIGEgZHluYW1pY2FsbHktcmVnaXN0ZXJlZCBnZW5lcmF0b3IuXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgU1RSIGhhcyB0aGUgZm9ybSBsYW5ndWFnZVs6a2V5MT12YWwxWyxrZXkyWyxrZXkzPXZhbDNdXV0uXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgS2V5cyBhbmQgdmFsdWVzIGFyZSBvcHRpb25zIHBhc3NlZCB0byB0aGUgZ2VuZXJhdG9yLlxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgIE1hbnkgb3B0aW9ucyB3aWxsIG5vdCByZXF1aXJlIHZhbHVlcy5cbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiT3B0aW9ucyByZWxhdGVkIHRvIGF1ZGl0IG9wZXJhdGlvblxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAgLS1hdWRpdCBPbGRGaWxlICAgT2xkIFRocmlmdCBmaWxlIHRvIGJlIGF1ZGl0ZWQgd2l0aCAnZmlsZSdcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLUlvbGQgZGlyICAgIEFkZCBhIGRpcmVjdG9yeSB0byB0aGUgbGlzdCBvZiBkaXJlY3Rvcmllc1xuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgIHNlYXJjaGVkIGZvciBpbmNsdWRlIGRpcmVjdGl2ZXMgZm9yIG9sZCB0aHJpZnQgZmlsZVxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtSW5ldyBkaXIgICAgQWRkIGEgZGlyZWN0b3J5IHRvIHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgc2VhcmNoZWQgZm9yIGluY2x1ZGUgZGlyZWN0aXZlcyBmb3IgbmV3IHRocmlmdCBmaWxlXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICJcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIkF2YWlsYWJsZSBnZW5lcmF0b3JzIChhbmQgb3B0aW9ucyk6XG4iKTsKLQotICB0X2dlbmVyYXRvcl9yZWdpc3RyeTo6Z2VuX21hcF90IGdlbl9tYXAgPSB0X2dlbmVyYXRvcl9yZWdpc3RyeTo6Z2V0X2dlbmVyYXRvcl9tYXAoKTsKLSAgdF9nZW5lcmF0b3JfcmVnaXN0cnk6Omdlbl9tYXBfdDo6aXRlcmF0b3IgaXRlcjsKLSAgZm9yIChpdGVyID0gZ2VuX21hcC5iZWdpbigpOyBpdGVyICE9IGdlbl9tYXAuZW5kKCk7ICsraXRlcikgewotICAgIGZwcmludGYoc3RkZXJyLAotICAgICAgICAgICAgIiAgJXMgKCVzKTpcbiIsCi0gICAgICAgICAgICBpdGVyLT5zZWNvbmQtPmdldF9zaG9ydF9uYW1lKCkuY19zdHIoKSwKLSAgICAgICAgICAgIGl0ZXItPnNlY29uZC0+Z2V0X2xvbmdfbmFtZSgpLmNfc3RyKCkpOwotICAgIGZwcmludGYoc3RkZXJyLCAiJXMiLCBpdGVyLT5zZWNvbmQtPmdldF9kb2N1bWVudGF0aW9uKCkuY19zdHIoKSk7Ci0gIH0KLSAgZXhpdCgxKTsKLX0KLQotLyoqCi0gKiBZb3Uga25vdywgd2hlbiBJIHN0YXJ0ZWQgd29ya2luZyBvbiBUaHJpZnQgSSByZWFsbHkgdGhvdWdodCBpdCB3YXNuJ3QgZ29pbmcKLSAqIHRvIGJlY29tZSBhIHByb2dyYW1taW5nIGxhbmd1YWdlIGJlY2F1c2UgaXQgd2FzIGp1c3QgYSBnZW5lcmF0b3IgYW5kIGl0Ci0gKiB3b3VsZG4ndCBuZWVkIHJ1bnRpbWUgdHlwZSBpbmZvcm1hdGlvbiBhbmQgYWxsIHRoYXQgamF6ei4gQnV0IHRoZW4gd2UKLSAqIGRlY2lkZWQgdG8gYWRkIGNvbnN0YW50cywgYW5kIGFsbCBvZiBhIHN1ZGRlbiB0aGF0IG1lYW5zIHJ1bnRpbWUgdHlwZQotICogdmFsaWRhdGlvbiBhbmQgaW5mZXJlbmNlLCBleGNlcHQgdGhlICJydW50aW1lIiBpcyB0aGUgY29kZSBnZW5lcmF0b3IKLSAqIHJ1bnRpbWUuCi0gKi8KLXZvaWQgdmFsaWRhdGVfY29uc3RfcmVjKHN0ZDo6c3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJ0eXBlIGVycm9yOiBjYW5ub3QgZGVjbGFyZSBhIHZvaWQgY29uc3Q6ICIgKyBuYW1lOwotICB9Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9TVFJJTkcpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6IGNvbnN0IFwiIiArIG5hbWUgKyAiXCIgd2FzIGRlY2xhcmVkIGFzIHN0cmluZyI7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogY29uc3QgXCIiICsgbmFtZSArICJcIiB3YXMgZGVjbGFyZWQgYXMgYm9vbCI7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogY29uc3QgXCIiICsgbmFtZSArICJcIiB3YXMgZGVjbGFyZWQgYXMgYnl0ZSI7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiBjb25zdCBcIiIgKyBuYW1lICsgIlwiIHdhcyBkZWNsYXJlZCBhcyBpMTYiOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogY29uc3QgXCIiICsgbmFtZSArICJcIiB3YXMgZGVjbGFyZWQgYXMgaTMyIjsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpICE9IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6IGNvbnN0IFwiIiArIG5hbWUgKyAiXCIgd2FzIGRlY2xhcmVkIGFzIGk2NCI7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSCi0gICAgICAgICAgJiYgdmFsdWUtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfRE9VQkxFKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiBjb25zdCBcIiIgKyBuYW1lICsgIlwiIHdhcyBkZWNsYXJlZCBhcyBkb3VibGUiOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpICsgbmFtZTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpICE9IHRfY29uc3RfdmFsdWU6OkNWX0lERU5USUZJRVIpIHsKLSAgICAgIHRocm93ICJ0eXBlIGVycm9yOiBjb25zdCBcIiIgKyBuYW1lICsgIlwiIHdhcyBkZWNsYXJlZCBhcyBlbnVtIjsKLSAgICB9Ci0KLSAgICAvLyBzZWUgaWYgdGhlcmUncyBhIGRvdCBpbiB0aGUgaWRlbnRpZmllcgotICAgIHN0ZDo6c3RyaW5nIG5hbWVfcG9ydGlvbiA9IHZhbHVlLT5nZXRfaWRlbnRpZmllcl9uYW1lKCk7Ci0KLSAgICBjb25zdCB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4mIGVudW1fdmFsdWVzID0gKCh0X2VudW0qKXR5cGUpLT5nZXRfY29uc3RhbnRzKCk7Ci0gICAgdmVjdG9yPHRfZW51bV92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBjX2l0ZXI7Ci0gICAgYm9vbCBmb3VuZCA9IGZhbHNlOwotCi0gICAgZm9yIChjX2l0ZXIgPSBlbnVtX3ZhbHVlcy5iZWdpbigpOyBjX2l0ZXIgIT0gZW51bV92YWx1ZXMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgICBpZiAoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpID09IG5hbWVfcG9ydGlvbikgewotICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoIWZvdW5kKSB7Ci0gICAgICB0aHJvdyAidHlwZSBlcnJvcjogY29uc3QgIiArIG5hbWUgKyAiIHdhcyBkZWNsYXJlZCBhcyB0eXBlICIgKyB0eXBlLT5nZXRfbmFtZSgpCi0gICAgICAgICAgKyAiIHdoaWNoIGlzIGFuIGVudW0sIGJ1dCAiICsgdmFsdWUtPmdldF9pZGVudGlmaWVyKCkKLSAgICAgICAgICArICIgaXMgbm90IGEgdmFsaWQgdmFsdWUgZm9yIHRoYXQgZW51bSI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfTUFQKSB7Ci0gICAgICB0aHJvdyAidHlwZSBlcnJvcjogY29uc3QgXCIiICsgbmFtZSArICJcIiB3YXMgZGVjbGFyZWQgYXMgc3RydWN0L3hjZXB0aW9uIjsKLSAgICB9Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgaWYgKHZfaXRlci0+Zmlyc3QtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfU1RSSU5HKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgbmFtZSArICIgc3RydWN0IGtleSBtdXN0IGJlIHN0cmluZyI7Ci0gICAgICB9Ci0gICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOwotICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKLSAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICB9Ci0KLSAgICAgIHZhbGlkYXRlX2NvbnN0X3JlYyhuYW1lICsgIi4iICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpLCBmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgdF90eXBlKiBrX3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2X3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgdmFsaWRhdGVfY29uc3RfcmVjKG5hbWUgKyAiPGtleT4iLCBrX3R5cGUsIHZfaXRlci0+Zmlyc3QpOwotICAgICAgdmFsaWRhdGVfY29uc3RfcmVjKG5hbWUgKyAiPHZhbD4iLCB2X3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgdF90eXBlKiBlX3R5cGU7Ci0gICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgZV90eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGVfdHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfQotICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgdmFsaWRhdGVfY29uc3RfcmVjKG5hbWUgKyAiPGVsZW0+IiwgZV90eXBlLCAqdl9pdGVyKTsKLSAgICB9Ci0gIH0KLX0KLQotLyoqCi0gKiBDaGVjayBzaW1wbGUgaWRlbnRpZmllciBuYW1lcwotICogSXQncyBlYXNpZXIgdG8gZG8gaXQgdGhpcyB3YXkgaW5zdGVhZCBvZiByZXdyaXRpbmcgdGhlIHdob2xlIGdyYW1tYXIgZXRjLgotICovCi12b2lkIHZhbGlkYXRlX3NpbXBsZV9pZGVudGlmaWVyKGNvbnN0IGNoYXIqIGlkZW50aWZpZXIpIHsKLSAgc3RyaW5nIG5hbWUoaWRlbnRpZmllcik7Ci0gIGlmIChuYW1lLmZpbmQoIi4iKSAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICB5eWVycm9yKCJJZGVudGlmaWVyICVzIGNhbid0IGhhdmUgYSBkb3QuIiwgaWRlbnRpZmllcik7Ci0gICAgZXhpdCgxKTsKLSAgfQotfQotCi0vKioKLSAqIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBwYXJzZWQgY29uc3QgaW5mb3JtYXRpb24gYWdhaW5zdCBpdHMgZGVjbGFyZWQgdHlwZQotICovCi12b2lkIHZhbGlkYXRlX2NvbnN0X3R5cGUodF9jb25zdCogYykgewotICB2YWxpZGF0ZV9jb25zdF9yZWMoYy0+Z2V0X25hbWUoKSwgYy0+Z2V0X3R5cGUoKSwgYy0+Z2V0X3ZhbHVlKCkpOwotfQotCi0vKioKLSAqIENoZWNrIHRoZSB0eXBlIG9mIGEgZGVmYXVsdCB2YWx1ZSBhc3NpZ25lZCB0byBhIGZpZWxkLgotICovCi12b2lkIHZhbGlkYXRlX2ZpZWxkX3ZhbHVlKHRfZmllbGQqIGZpZWxkLCB0X2NvbnN0X3ZhbHVlKiBjdikgewotICB2YWxpZGF0ZV9jb25zdF9yZWMoZmllbGQtPmdldF9uYW1lKCksIGZpZWxkLT5nZXRfdHlwZSgpLCBjdik7Ci19Ci0KLS8qKgotICogQ2hlY2sgdGhhdCBhbGwgdGhlIGVsZW1lbnRzIG9mIGEgdGhyb3dzIGJsb2NrIGFyZSBhY3R1YWxseSBleGNlcHRpb25zLgotICovCi1ib29sIHZhbGlkYXRlX3Rocm93cyh0X3N0cnVjdCogdGhyb3dzKSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0aHJvd3MtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGlmICghdF9nZW5lcmF0b3I6OmdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKS0+aXNfeGNlcHRpb24oKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqCi0gKiBTa2lwcyBVVEYtOCBCT00gaWYgdGhlcmUgaXMgb25lCi0gKi8KLWJvb2wgc2tpcF91dGY4X2JvbShGSUxFKiBmKSB7Ci0KLSAgLy8gcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZCwgYnV0IHdvcmtzCi0gIGlmIChmZ2V0YyhmKSA9PSAweEVGKSB7Ci0gICAgaWYgKGZnZXRjKGYpID09IDB4QkIpIHsKLSAgICAgIGlmIChmZ2V0YyhmKSA9PSAweEJGKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHJld2luZChmKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioKLSAqIFBhcnNlcyBhIHByb2dyYW0KLSAqLwotdm9pZCBwYXJzZSh0X3Byb2dyYW0qIHByb2dyYW0sIHRfcHJvZ3JhbSogcGFyZW50X3Byb2dyYW0pIHsKLSAgLy8gR2V0IHNjb3BlIGZpbGUgcGF0aAotICBzdHJpbmcgcGF0aCA9IHByb2dyYW0tPmdldF9wYXRoKCk7Ci0KLSAgLy8gU2V0IGN1cnJlbnQgZGlyIGdsb2JhbCwgd2hpY2ggaXMgdXNlZCBpbiB0aGUgaW5jbHVkZV9maWxlIGZ1bmN0aW9uCi0gIGdfY3VyZGlyID0gZGlyZWN0b3J5X25hbWUocGF0aCk7Ci0gIGdfY3VycGF0aCA9IHBhdGg7Ci0KLSAgLy8gT3BlbiB0aGUgZmlsZQotICAvLyBza2lwIFVURi04IEJPTSBpZiB0aGVyZSBpcyBvbmUKLSAgeXlpbiA9IGZvcGVuKHBhdGguY19zdHIoKSwgInIiKTsKLSAgaWYgKHl5aW4gPT0gMCkgewotICAgIGZhaWx1cmUoIkNvdWxkIG5vdCBvcGVuIGlucHV0IGZpbGU6IFwiJXNcIiIsIHBhdGguY19zdHIoKSk7Ci0gIH0KLSAgaWYgKHNraXBfdXRmOF9ib20oeXlpbikpCi0gICAgcHZlcmJvc2UoIlNraXBwZWQgVVRGLTggQk9NIGF0ICVzXG4iLCBwYXRoLmNfc3RyKCkpOwotCi0gIC8vIENyZWF0ZSBuZXcgc2NvcGUgYW5kIHNjYW4gZm9yIGluY2x1ZGVzCi0gIHB2ZXJib3NlKCJTY2FubmluZyAlcyBmb3IgaW5jbHVkZXNcbiIsIHBhdGguY19zdHIoKSk7Ci0gIGdfcGFyc2VfbW9kZSA9IElOQ0xVREVTOwotICBnX3Byb2dyYW0gPSBwcm9ncmFtOwotICBnX3Njb3BlID0gcHJvZ3JhbS0+c2NvcGUoKTsKLSAgdHJ5IHsKLSAgICB5eWxpbmVubyA9IDE7Ci0gICAgaWYgKHl5cGFyc2UoKSAhPSAwKSB7Ci0gICAgICBmYWlsdXJlKCJQYXJzZXIgZXJyb3IgZHVyaW5nIGluY2x1ZGUgcGFzcy4iKTsKLSAgICB9Ci0gIH0gY2F0Y2ggKHN0cmluZyB4KSB7Ci0gICAgZmFpbHVyZSh4LmNfc3RyKCkpOwotICB9Ci0gIGZjbG9zZSh5eWluKTsKLQotICAvLyBSZWN1cnNpdmVseSBwYXJzZSBhbGwgdGhlIGluY2x1ZGUgcHJvZ3JhbXMKLSAgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW0tPmdldF9pbmNsdWRlcygpOwotICB2ZWN0b3I8dF9wcm9ncmFtKj46Oml0ZXJhdG9yIGl0ZXI7Ci0gIGZvciAoaXRlciA9IGluY2x1ZGVzLmJlZ2luKCk7IGl0ZXIgIT0gaW5jbHVkZXMuZW5kKCk7ICsraXRlcikgewotICAgIHBhcnNlKCppdGVyLCBwcm9ncmFtKTsKLSAgfQotCi0gIC8vIHJlc2V0IHByb2dyYW0gZG9jdGV4dCBzdGF0dXMgYmVmb3JlIHBhcnNpbmcgYSBuZXcgZmlsZQotICByZXNldF9wcm9ncmFtX2RvY3RleHRfaW5mbygpOwotCi0gIC8vIFBhcnNlIHRoZSBwcm9ncmFtIGZpbGUKLSAgZ19wYXJzZV9tb2RlID0gUFJPR1JBTTsKLSAgZ19wcm9ncmFtID0gcHJvZ3JhbTsKLSAgZ19zY29wZSA9IHByb2dyYW0tPnNjb3BlKCk7Ci0gIGdfcGFyZW50X3Njb3BlID0gKHBhcmVudF9wcm9ncmFtICE9IE5VTEwpID8gcGFyZW50X3Byb2dyYW0tPnNjb3BlKCkgOiBOVUxMOwotICBnX3BhcmVudF9wcmVmaXggPSBwcm9ncmFtLT5nZXRfbmFtZSgpICsgIi4iOwotICBnX2N1cnBhdGggPSBwYXRoOwotCi0gIC8vIE9wZW4gdGhlIGZpbGUKLSAgLy8gc2tpcCBVVEYtOCBCT00gaWYgdGhlcmUgaXMgb25lCi0gIHl5aW4gPSBmb3BlbihwYXRoLmNfc3RyKCksICJyIik7Ci0gIGlmICh5eWluID09IDApIHsKLSAgICBmYWlsdXJlKCJDb3VsZCBub3Qgb3BlbiBpbnB1dCBmaWxlOiBcIiVzXCIiLCBwYXRoLmNfc3RyKCkpOwotICB9Ci0gIGlmIChza2lwX3V0ZjhfYm9tKHl5aW4pKQotICAgIHB2ZXJib3NlKCJTa2lwcGVkIFVURi04IEJPTSBhdCAlc1xuIiwgcGF0aC5jX3N0cigpKTsKLQotICBwdmVyYm9zZSgiUGFyc2luZyAlcyBmb3IgdHlwZXNcbiIsIHBhdGguY19zdHIoKSk7Ci0gIHl5bGluZW5vID0gMTsKLSAgdHJ5IHsKLSAgICBpZiAoeXlwYXJzZSgpICE9IDApIHsKLSAgICAgIGZhaWx1cmUoIlBhcnNlciBlcnJvciBkdXJpbmcgdHlwZXMgcGFzcy4iKTsKLSAgICB9Ci0gIH0gY2F0Y2ggKHN0cmluZyB4KSB7Ci0gICAgZmFpbHVyZSh4LmNfc3RyKCkpOwotICB9Ci0gIGZjbG9zZSh5eWluKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZSBjb2RlCi0gKi8KLXZvaWQgZ2VuZXJhdGUodF9wcm9ncmFtKiBwcm9ncmFtLCBjb25zdCB2ZWN0b3I8c3RyaW5nPiYgZ2VuZXJhdG9yX3N0cmluZ3MpIHsKLSAgLy8gT29vb2hoLCByZWN1cnNpdmUgY29kZSBnZW5lcmF0aW9uLCBob3QhIQotICBpZiAoZ2VuX3JlY3Vyc2UpIHsKLSAgICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbS0+Z2V0X2luY2x1ZGVzKCk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgewotICAgICAgLy8gUHJvcGFnYXRlIG91dHB1dCBwYXRoIGZyb20gcGFyZW50IHRvIGNoaWxkIHByb2dyYW1zCi0gICAgICBpbmNsdWRlc1tpXS0+c2V0X291dF9wYXRoKHByb2dyYW0tPmdldF9vdXRfcGF0aCgpLCBwcm9ncmFtLT5pc19vdXRfcGF0aF9hYnNvbHV0ZSgpKTsKLQotICAgICAgZ2VuZXJhdGUoaW5jbHVkZXNbaV0sIGdlbmVyYXRvcl9zdHJpbmdzKTsKLSAgICB9Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSBjb2RlIQotICB0cnkgewotICAgIHB2ZXJib3NlKCJQcm9ncmFtOiAlc1xuIiwgcHJvZ3JhbS0+Z2V0X3BhdGgoKS5jX3N0cigpKTsKLQotICAgIC8vIENvbXB1dGUgZmluZ2VycHJpbnRzLiAtIG5vdCBhbnltb3JlLCB3ZSBkbyBpdCBvbiB0aGUgZmx5IG5vdwotICAgIC8vIGdlbmVyYXRlX2FsbF9maW5nZXJwcmludHMocHJvZ3JhbSk7Ci0KLSAgICBpZiAoZHVtcF9kb2NzKSB7Ci0gICAgICBkdW1wX2RvY3N0cmluZ3MocHJvZ3JhbSk7Ci0gICAgfQotCi0gICAgdmVjdG9yPHN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7Ci0gICAgZm9yIChpdGVyID0gZ2VuZXJhdG9yX3N0cmluZ3MuYmVnaW4oKTsgaXRlciAhPSBnZW5lcmF0b3Jfc3RyaW5ncy5lbmQoKTsgKytpdGVyKSB7Ci0gICAgICB0X2dlbmVyYXRvciogZ2VuZXJhdG9yID0gdF9nZW5lcmF0b3JfcmVnaXN0cnk6OmdldF9nZW5lcmF0b3IocHJvZ3JhbSwgKml0ZXIpOwotCi0gICAgICBpZiAoZ2VuZXJhdG9yID09IE5VTEwpIHsKLSAgICAgICAgcHdhcm5pbmcoMSwgIlVuYWJsZSB0byBnZXQgYSBnZW5lcmF0b3IgZm9yIFwiJXNcIi5cbiIsIGl0ZXItPmNfc3RyKCkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcHZlcmJvc2UoIkdlbmVyYXRpbmcgXCIlc1wiXG4iLCBpdGVyLT5jX3N0cigpKTsKLSAgICAgICAgZ2VuZXJhdG9yLT5nZW5lcmF0ZV9wcm9ncmFtKCk7Ci0gICAgICAgIGRlbGV0ZSBnZW5lcmF0b3I7Ci0gICAgICB9Ci0gICAgfQotICB9IGNhdGNoIChzdHJpbmcgcykgewotICAgIHByaW50ZigiRXJyb3I6ICVzXG4iLCBzLmNfc3RyKCkpOwotICB9IGNhdGNoIChjb25zdCBjaGFyKiBleGMpIHsKLSAgICBwcmludGYoIkVycm9yOiAlc1xuIiwgZXhjKTsKLSAgfQotfQotCi12b2lkIGF1ZGl0KHRfcHJvZ3JhbSogbmV3X3Byb2dyYW0sIHRfcHJvZ3JhbSogb2xkX3Byb2dyYW0sIHN0cmluZyBuZXdfdGhyaWZ0X2luY2x1ZGVfcGF0aCwgc3RyaW5nIG9sZF90aHJpZnRfaW5jbHVkZV9wYXRoKQotewotICB2ZWN0b3I8c3RyaW5nPiB0ZW1wX2luY2xfc2VhcmNocGF0aCA9IGdfaW5jbF9zZWFyY2hwYXRoOwotICBpZighb2xkX3RocmlmdF9pbmNsdWRlX3BhdGguZW1wdHkoKSkgewotICAgIGdfaW5jbF9zZWFyY2hwYXRoLnB1c2hfYmFjayhvbGRfdGhyaWZ0X2luY2x1ZGVfcGF0aCk7Ci0gIH0KLQotICBwYXJzZShvbGRfcHJvZ3JhbSwgTlVMTCk7Ci0KLSAgZ19pbmNsX3NlYXJjaHBhdGggPSB0ZW1wX2luY2xfc2VhcmNocGF0aDsKLSAgaWYoIW5ld190aHJpZnRfaW5jbHVkZV9wYXRoLmVtcHR5KCkpIHsKLSAgICBnX2luY2xfc2VhcmNocGF0aC5wdXNoX2JhY2sobmV3X3RocmlmdF9pbmNsdWRlX3BhdGgpOwotICB9Ci0KLSAgcGFyc2UobmV3X3Byb2dyYW0sIE5VTEwpOwotCi0gIGNvbXBhcmVfbmFtZXNwYWNlKG5ld19wcm9ncmFtLCBvbGRfcHJvZ3JhbSk7Ci0gIGNvbXBhcmVfc2VydmljZXMobmV3X3Byb2dyYW0tPmdldF9zZXJ2aWNlcygpLCBvbGRfcHJvZ3JhbS0+Z2V0X3NlcnZpY2VzKCkpOwotICBjb21wYXJlX2VudW1zKG5ld19wcm9ncmFtLT5nZXRfZW51bXMoKSwgb2xkX3Byb2dyYW0tPmdldF9lbnVtcygpKTsKLSAgY29tcGFyZV9zdHJ1Y3RzKG5ld19wcm9ncmFtLT5nZXRfc3RydWN0cygpLCBvbGRfcHJvZ3JhbS0+Z2V0X3N0cnVjdHMoKSk7Ci0gIGNvbXBhcmVfc3RydWN0cyhuZXdfcHJvZ3JhbS0+Z2V0X3hjZXB0aW9ucygpLCBvbGRfcHJvZ3JhbS0+Z2V0X3hjZXB0aW9ucygpKTsKLSAgY29tcGFyZV9jb25zdHMobmV3X3Byb2dyYW0tPmdldF9jb25zdHMoKSwgb2xkX3Byb2dyYW0tPmdldF9jb25zdHMoKSk7Ci19Ci0KLS8qKgotICogUGFyc2UgaXQgdXAuLiB0aGVuIHNwaXQgaXQgYmFjayBvdXQsIGluIHByZXR0eSBtdWNoIGV2ZXJ5IGxhbmd1YWdlLiBBbHJpZ2h0Ci0gKiBub3QgdGhhdCBtYW55IGxhbmd1YWdlcywgYnV0IHRoZSBjb29sIG9uZXMgdGhhdCB3ZSBjYXJlIGFib3V0LgotICovCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKLSAgaW50IGk7Ci0gIHN0ZDo6c3RyaW5nIG91dF9wYXRoOwotICBib29sIG91dF9wYXRoX2lzX2Fic29sdXRlID0gZmFsc2U7Ci0KLSAgLy8gU2V0dXAgdGltZSBzdHJpbmcKLSAgdGltZV90IG5vdyA9IHRpbWUoTlVMTCk7Ci0gIGdfdGltZV9zdHIgPSBjdGltZSgmbm93KTsKLQotICAvLyBDaGVjayBmb3IgbmVjZXNzYXJ5IGFyZ3VtZW50cywgeW91IGdvdHRhIGhhdmUgYXQgbGVhc3QgYSBmaWxlbmFtZSBhbmQKLSAgLy8gYW4gb3V0cHV0IGxhbmd1YWdlIGZsYWcKLSAgaWYgKGFyZ2MgPCAyKSB7Ci0gICAgdXNhZ2UoKTsKLSAgfQotCi0gIHZlY3RvcjxzdHJpbmc+IGdlbmVyYXRvcl9zdHJpbmdzOwotICBzdHJpbmcgb2xkX3RocmlmdF9pbmNsdWRlX3BhdGg7Ci0gIHN0cmluZyBuZXdfdGhyaWZ0X2luY2x1ZGVfcGF0aDsKLSAgc3RyaW5nIG9sZF9pbnB1dF9maWxlOwotCi0gIC8vIFNldCB0aGUgY3VycmVudCBwYXRoIHRvIGEgZHVtbXkgdmFsdWUgdG8gbWFrZSB3YXJuaW5nIG1lc3NhZ2VzIGNsZWFyZXIuCi0gIGdfY3VycGF0aCA9ICJhcmd1bWVudHMiOwotCi0gIC8vIEhhY2t5IHBhcmFtZXRlciBoYW5kbGluZy4uLiBJIGRpZG4ndCBmZWVsIGxpa2UgdXNpbmcgYSBsaWJyYXJ5IHNvcnJ5IQotICBmb3IgKGkgPSAxOyBpIDwgYXJnYyAtIDE7IGkrKykgewotICAgIGNoYXIqIGFyZzsKLQotICAgIGFyZyA9IHN0cnRvayhhcmd2W2ldLCAiICIpOwotICAgIHdoaWxlIChhcmcgIT0gTlVMTCkgewotICAgICAgLy8gVHJlYXQgZG91YmxlIGRhc2hlcyBhcyBzaW5nbGUgZGFzaGVzCi0gICAgICBpZiAoYXJnWzBdID09ICctJyAmJiBhcmdbMV0gPT0gJy0nKSB7Ci0gICAgICAgICsrYXJnOwotICAgICAgfQotCi0gICAgICBpZiAoc3RyY21wKGFyZywgIi1oZWxwIikgPT0gMCkgewotICAgICAgICBoZWxwKCk7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItdmVyc2lvbiIpID09IDApIHsKLSAgICAgICAgdmVyc2lvbigpOwotICAgICAgICBleGl0KDApOwotICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLWRlYnVnIikgPT0gMCkgewotICAgICAgICBnX2RlYnVnID0gMTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1ub3dhcm4iKSA9PSAwKSB7Ci0gICAgICAgIGdfd2FybiA9IDA7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItc3RyaWN0IikgPT0gMCkgewotICAgICAgICBnX3N0cmljdCA9IDI1NTsKLSAgICAgICAgZ193YXJuID0gMjsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi12IikgPT0gMCB8fCBzdHJjbXAoYXJnLCAiLXZlcmJvc2UiKSA9PSAwKSB7Ci0gICAgICAgIGdfdmVyYm9zZSA9IDE7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItciIpID09IDAgfHwgc3RyY21wKGFyZywgIi1yZWN1cnNlIikgPT0gMCkgewotICAgICAgICBnZW5fcmVjdXJzZSA9IHRydWU7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItYWxsb3ctbmVnLWtleXMiKSA9PSAwKSB7Ci0gICAgICAgIGdfYWxsb3dfbmVnX2ZpZWxkX2tleXMgPSB0cnVlOwotICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLWFsbG93LTY0Yml0LWNvbnN0cyIpID09IDApIHsKLSAgICAgICAgZ19hbGxvd182NGJpdF9jb25zdHMgPSB0cnVlOwotICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLWdlbiIpID09IDApIHsKLSAgICAgICAgYXJnID0gYXJndlsrK2ldOwotICAgICAgICBpZiAoYXJnID09IE5VTEwpIHsKLSAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk1pc3NpbmcgZ2VuZXJhdG9yIHNwZWNpZmljYXRpb25cbiIpOwotICAgICAgICAgIHVzYWdlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZ2VuZXJhdG9yX3N0cmluZ3MucHVzaF9iYWNrKGFyZyk7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItSSIpID09IDApIHsKLSAgICAgICAgLy8gQW4gYXJndW1lbnQgb2YgIi1JXCBhc2RmIiBpcyBpbnZhbGlkIGFuZCBoYXMgdW5rbm93biByZXN1bHRzCi0gICAgICAgIGFyZyA9IGFyZ3ZbKytpXTsKLQotICAgICAgICBpZiAoYXJnID09IE5VTEwpIHsKLSAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk1pc3NpbmcgSW5jbHVkZSBkaXJlY3RvcnlcbiIpOwotICAgICAgICAgIHVzYWdlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZ19pbmNsX3NlYXJjaHBhdGgucHVzaF9iYWNrKGFyZyk7Ci0gICAgICB9IGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiLW8iKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIi1vdXQiKSA9PSAwKSkgewotICAgICAgICBvdXRfcGF0aF9pc19hYnNvbHV0ZSA9IChzdHJjbXAoYXJnLCAiLW91dCIpID09IDApID8gdHJ1ZSA6IGZhbHNlOwotICAgICAgICBhcmcgPSBhcmd2WysraV07Ci0gICAgICAgIGlmIChhcmcgPT0gTlVMTCkgewotICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiLW86IG1pc3Npbmcgb3V0cHV0IGRpcmVjdG9yeVxuIik7Ci0gICAgICAgICAgdXNhZ2UoKTsKLSAgICAgICAgfQotICAgICAgICBvdXRfcGF0aCA9IGFyZzsKLQotI2lmZGVmIF9XSU4zMgotICAgICAgICAvLyBzdHJpcCBvdXQgdHJhaWxpbmcgXCBvbiBXaW5kb3dzCi0gICAgICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgbGFzdCA9IG91dF9wYXRoLmxlbmd0aCgpIC0gMTsKLSAgICAgICAgaWYgKG91dF9wYXRoW2xhc3RdID09ICdcXCcpIHsKLSAgICAgICAgICBvdXRfcGF0aC5lcmFzZShsYXN0KTsKLSAgICAgICAgfQotI2VuZGlmCi0gICAgICAgIGlmICghY2hlY2tfaXNfZGlyZWN0b3J5KG91dF9wYXRoLmNfc3RyKCkpKQotICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1hdWRpdCIpID09IDApIHsKLSAgICAgICAgZ19hdWRpdCA9IHRydWU7Ci0gICAgICAgIGFyZyA9IGFyZ3ZbKytpXTsKLSAgICAgICAgaWYgKGFyZyA9PSBOVUxMKSB7Ci0gICAgICAgICAgZnByaW50ZihzdGRlcnIsICJNaXNzaW5nIG9sZCB0aHJpZnQgZmlsZSBuYW1lIGZvciBhdWRpdCBvcGVyYXRpb25cbiIpOwotICAgICAgICAgIHVzYWdlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2hhciBvbGRfdGhyaWZ0X2ZpbGVfcnBbVEhSSUZUX1BBVEhfTUFYXTsKLQotICAgICAgICBpZiAoc2FmZXJlYWxwYXRoKGFyZywgb2xkX3RocmlmdF9maWxlX3JwKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgZmFpbHVyZSgiQ291bGQgbm90IG9wZW4gaW5wdXQgZmlsZSB3aXRoIHJlYWxwYXRoOiAlcyIsIGFyZyk7Ci0gICAgICAgIH0KLSAgICAgICAgb2xkX2lucHV0X2ZpbGUgPSBzdHJpbmcob2xkX3RocmlmdF9maWxlX3JwKTsKLSAgICAgIH0gZWxzZSBpZihzdHJjbXAoYXJnLCAiLWF1ZGl0LW5vZmF0YWwiKSA9PSAwKXsKLSAgICAgICAgZ19hdWRpdF9mYXRhbCA9IGZhbHNlOwotICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLUlvbGQiKSA9PSAwKSB7Ci0gICAgICAgIGFyZyA9IGFyZ3ZbKytpXTsKLSAgICAgICAgaWYgKGFyZyA9PSBOVUxMKSB7Ci0gICAgICAgICAgZnByaW50ZihzdGRlcnIsICJNaXNzaW5nIEluY2x1ZGUgZGlyZWN0b3J5IGZvciBvbGQgdGhyaWZ0IGZpbGVcbiIpOwotICAgICAgICAgIHVzYWdlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgb2xkX3RocmlmdF9pbmNsdWRlX3BhdGggPSBzdHJpbmcoYXJnKTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1JbmV3IikgPT0gMCkgewotICAgICAgICBhcmcgPSBhcmd2WysraV07Ci0gICAgICAgIGlmKGFyZyA9PSBOVUxMKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiTWlzc2luZyBJbmNsdWRlIGRpcmVjdG9yeSBmb3IgbmV3IHRocmlmdCBmaWxlXG4iKTsKLSAgICAgICAgdXNhZ2UoKTsKLSAgICAgICAgfQotICAgICAgICBuZXdfdGhyaWZ0X2luY2x1ZGVfcGF0aCA9IHN0cmluZyhhcmcpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJVbnJlY29nbml6ZWQgb3B0aW9uOiAlc1xuIiwgYXJnKTsKLSAgICAgICAgdXNhZ2UoKTsKLSAgICAgIH0KLQotICAgICAgLy8gVG9rZW5pemUgbW9yZQotICAgICAgYXJnID0gc3RydG9rKE5VTEwsICIgIik7Ci0gICAgfQotICB9Ci0KLSAgLy8gZGlzcGxheSBoZWxwCi0gIGlmICgoc3RyY21wKGFyZ3ZbYXJnYyAtIDFdLCAiLWhlbHAiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbYXJnYyAtIDFdLCAiLS1oZWxwIikgPT0gMCkpIHsKLSAgICBoZWxwKCk7Ci0gIH0KLQotICAvLyBpZiB5b3UncmUgYXNraW5nIGZvciB2ZXJzaW9uLCB5b3UgaGF2ZSBhIHJpZ2h0IG5vdCB0byBwYXNzIGEgZmlsZQotICBpZiAoKHN0cmNtcChhcmd2W2FyZ2MgLSAxXSwgIi12ZXJzaW9uIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2W2FyZ2MgLSAxXSwgIi0tdmVyc2lvbiIpID09IDApKSB7Ci0gICAgdmVyc2lvbigpOwotICAgIGV4aXQoMCk7Ci0gIH0KLQotICAvLyBJbml0aWFsaXplIGdsb2JhbCB0eXBlcwotICBnX3R5cGVfdm9pZCA9IG5ldyB0X2Jhc2VfdHlwZSgidm9pZCIsIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQpOwotICBnX3R5cGVfc3RyaW5nID0gbmV3IHRfYmFzZV90eXBlKCJzdHJpbmciLCB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcpOwotICBnX3R5cGVfYmluYXJ5ID0gbmV3IHRfYmFzZV90eXBlKCJzdHJpbmciLCB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcpOwotICAoKHRfYmFzZV90eXBlKilnX3R5cGVfYmluYXJ5KS0+c2V0X2JpbmFyeSh0cnVlKTsKLSAgZ190eXBlX3NsaXN0ID0gbmV3IHRfYmFzZV90eXBlKCJzdHJpbmciLCB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcpOwotICAoKHRfYmFzZV90eXBlKilnX3R5cGVfc2xpc3QpLT5zZXRfc3RyaW5nX2xpc3QodHJ1ZSk7Ci0gIGdfdHlwZV9ib29sID0gbmV3IHRfYmFzZV90eXBlKCJib29sIiwgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTCk7Ci0gIGdfdHlwZV9ieXRlID0gbmV3IHRfYmFzZV90eXBlKCJieXRlIiwgdF9iYXNlX3R5cGU6OlRZUEVfQllURSk7Ci0gIGdfdHlwZV9pMTYgPSBuZXcgdF9iYXNlX3R5cGUoImkxNiIsIHRfYmFzZV90eXBlOjpUWVBFX0kxNik7Ci0gIGdfdHlwZV9pMzIgPSBuZXcgdF9iYXNlX3R5cGUoImkzMiIsIHRfYmFzZV90eXBlOjpUWVBFX0kzMik7Ci0gIGdfdHlwZV9pNjQgPSBuZXcgdF9iYXNlX3R5cGUoImk2NCIsIHRfYmFzZV90eXBlOjpUWVBFX0k2NCk7Ci0gIGdfdHlwZV9kb3VibGUgPSBuZXcgdF9iYXNlX3R5cGUoImRvdWJsZSIsIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRSk7Ci0KLSAgaWYoZ19hdWRpdCkKLSAgewotICAgIC8vIEF1ZGl0IG9wZXJhdGlvbgotCi0gICAgaWYgKG9sZF9pbnB1dF9maWxlLmVtcHR5KCkpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiTWlzc2luZyBmaWxlIG5hbWUgb2Ygb2xkIHRocmlmdCBmaWxlIGZvciBhdWRpdFxuIik7Ci0gICAgICB1c2FnZSgpOwotICAgIH0KLQotICAgIGNoYXIgbmV3X3RocmlmdF9maWxlX3JwW1RIUklGVF9QQVRIX01BWF07Ci0gICAgaWYgKGFyZ3ZbaV0gPT0gTlVMTCkgewotICAgICAgZnByaW50ZihzdGRlcnIsICJNaXNzaW5nIGZpbGUgbmFtZSBvZiBuZXcgdGhyaWZ0IGZpbGUgZm9yIGF1ZGl0XG4iKTsKLSAgICAgIHVzYWdlKCk7Ci0gICAgfQotICAgIGlmIChzYWZlcmVhbHBhdGgoYXJndltpXSwgbmV3X3RocmlmdF9maWxlX3JwKSA9PSBOVUxMKSB7Ci0gICAgICBmYWlsdXJlKCJDb3VsZCBub3Qgb3BlbiBpbnB1dCBmaWxlIHdpdGggcmVhbHBhdGg6ICVzIiwgYXJndltpXSk7Ci0gICAgfQotICAgIHN0cmluZyBuZXdfaW5wdXRfZmlsZShuZXdfdGhyaWZ0X2ZpbGVfcnApOwotCi0gICAgdF9wcm9ncmFtIG5ld19wcm9ncmFtKG5ld19pbnB1dF9maWxlKTsKLSAgICB0X3Byb2dyYW0gb2xkX3Byb2dyYW0ob2xkX2lucHV0X2ZpbGUpOwotCi0gICAgYXVkaXQoJm5ld19wcm9ncmFtLCAmb2xkX3Byb2dyYW0sIG5ld190aHJpZnRfaW5jbHVkZV9wYXRoLCBvbGRfdGhyaWZ0X2luY2x1ZGVfcGF0aCk7Ci0KLSAgfSBlbHNlIHsKLSAgICAvLyBHZW5lcmF0ZSBvcHRpb25zCi0gICAgCi0gICAgLy8gWW91IGdvdHRhIGdlbmVyYXRlIHNvbWV0aGluZyEKLSAgICBpZiAoZ2VuZXJhdG9yX3N0cmluZ3MuZW1wdHkoKSkgewotICAgICAgZnByaW50ZihzdGRlcnIsICJObyBvdXRwdXQgbGFuZ3VhZ2Uocykgc3BlY2lmaWVkXG4iKTsKLSAgICAgIHVzYWdlKCk7Ci0gICAgfQotCi0gICAgLy8gUmVhbC1wYXRoaWZ5IGl0Ci0gICAgY2hhciBycFtUSFJJRlRfUEFUSF9NQVhdOwotICAgIGlmIChhcmd2W2ldID09IE5VTEwpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiTWlzc2luZyBmaWxlIG5hbWVcbiIpOwotICAgICAgdXNhZ2UoKTsKLSAgICB9Ci0gICAgaWYgKHNhZmVyZWFscGF0aChhcmd2W2ldLCBycCkgPT0gTlVMTCkgewotICAgICAgZmFpbHVyZSgiQ291bGQgbm90IG9wZW4gaW5wdXQgZmlsZSB3aXRoIHJlYWxwYXRoOiAlcyIsIGFyZ3ZbaV0pOwotICAgIH0KLSAgICBzdHJpbmcgaW5wdXRfZmlsZShycCk7Ci0KLSAgICAvLyBJbnN0YW5jZSBvZiB0aGUgZ2xvYmFsIHBhcnNlIHRyZWUKLSAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSBuZXcgdF9wcm9ncmFtKGlucHV0X2ZpbGUpOwotICAgIGlmIChvdXRfcGF0aC5zaXplKCkpIHsKLSAgICAgIHByb2dyYW0tPnNldF9vdXRfcGF0aChvdXRfcGF0aCwgb3V0X3BhdGhfaXNfYWJzb2x1dGUpOwotICAgIH0KLQotICAgIC8vIENvbXB1dGUgdGhlIGNwcCBpbmNsdWRlIHByZWZpeC4KLSAgICAvLyBpbmZlciB0aGlzIGZyb20gdGhlIGZpbGVuYW1lIHBhc3NlZCBpbgotICAgIHN0cmluZyBpbnB1dF9maWxlbmFtZSA9IGFyZ3ZbaV07Ci0gICAgc3RyaW5nIGluY2x1ZGVfcHJlZml4OwotCi0gICAgc3RyaW5nOjpzaXplX3R5cGUgbGFzdF9zbGFzaCA9IHN0cmluZzo6bnBvczsKLSAgICBpZiAoKGxhc3Rfc2xhc2ggPSBpbnB1dF9maWxlbmFtZS5yZmluZCgiLyIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICAgIGluY2x1ZGVfcHJlZml4ID0gaW5wdXRfZmlsZW5hbWUuc3Vic3RyKDAsIGxhc3Rfc2xhc2gpOwotICAgIH0KLQotICAgIHByb2dyYW0tPnNldF9pbmNsdWRlX3ByZWZpeChpbmNsdWRlX3ByZWZpeCk7Ci0KLSAgICAvLyBQYXJzZSBpdCEKLSAgICBwYXJzZShwcm9ncmFtLCBOVUxMKTsKLQotICAgIC8vIFRoZSBjdXJyZW50IHBhdGggaXMgbm90IHJlYWxseSByZWxldmFudCB3aGVuIHdlIGFyZSBkb2luZyBnZW5lcmF0aW9uLgotICAgIC8vIFJlc2V0IHRoZSB2YXJpYWJsZSB0byBtYWtlIHdhcm5pbmcgbWVzc2FnZXMgY2xlYXJlci4KLSAgICBnX2N1cnBhdGggPSAiZ2VuZXJhdGlvbiI7Ci0gICAgLy8gUmVzZXQgeXlsaW5lbm8gZm9yIHRoZSBoZWNrIG9mIGl0LiAgVXNlIDEgaW5zdGVhZCBvZiAwIGJlY2F1c2UKLSAgICAvLyBUaGF0IGlzIHdoYXQgc2hvd3MgdXAgZHVyaW5nIGFyZ3VtZW50IHBhcnNpbmcuCi0gICAgeXlsaW5lbm8gPSAxOwotCi0gICAgLy8gR2VuZXJhdGUgaXQhCi0gICAgZ2VuZXJhdGUocHJvZ3JhbSwgZ2VuZXJhdG9yX3N0cmluZ3MpOwotICAgIGRlbGV0ZSBwcm9ncmFtOwotICB9Ci0KLSAgLy8gQ2xlYW4gdXAuIFdobyBhbSBJIGtpZGRpbmcuLi4gdGhpcyBwcm9ncmFtIHByb2JhYmx5IG9ycGhhbnMgaGVhcCBtZW1vcnkKLSAgLy8gYWxsIG92ZXIgdGhlIHBsYWNlLCBidXQgd2hvIGNhcmVzIGJlY2F1c2UgaXQgaXMgYWJvdXQgdG8gZXhpdCBhbmQgaXQgaXMKLSAgLy8gYWxsIHJlZmVyZW5jZWQgYW5kIHVzZWQgYnkgdGhpcyB3YWNreSBwYXJzZSB0cmVlIHVwIHVudGlsIG5vdyBhbnl3YXlzLgotCi0gIGRlbGV0ZSBnX3R5cGVfdm9pZDsKLSAgZGVsZXRlIGdfdHlwZV9zdHJpbmc7Ci0gIGRlbGV0ZSBnX3R5cGVfYm9vbDsKLSAgZGVsZXRlIGdfdHlwZV9ieXRlOwotICBkZWxldGUgZ190eXBlX2kxNjsKLSAgZGVsZXRlIGdfdHlwZV9pMzI7Ci0gIGRlbGV0ZSBnX3R5cGVfaTY0OwotICBkZWxldGUgZ190eXBlX2RvdWJsZTsKLQotICAvLyBGaW5pc2hlZAotICBpZiAoZ19yZXR1cm5fZmFpbHVyZSAmJiBnX2F1ZGl0X2ZhdGFsKSB7Ci0gICAgZXhpdCgyKTsKLSAgfQotICAvLyBGaW5pc2hlZAotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvbWFpbi5oIGIvY29tcGlsZXIvY3BwL3NyYy9tYWluLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNGIwMzIuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9tYWluLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfTUFJTl9ICi0jZGVmaW5lIFRfTUFJTl9ICi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8Y3N0ZGlvPgotCi0jaW5jbHVkZSAibG9nZ2luZy5oIgotCi0jaW5jbHVkZSAicGFyc2UvdF9jb25zdC5oIgotI2luY2x1ZGUgInBhcnNlL3RfZmllbGQuaCIKLQotLyoqCi0gKiBEZWZpbmVkIGluIHRoZSBmbGV4IGxpYnJhcnkKLSAqLwotCi1leHRlcm4gIkMiIHsgaW50IHl5bGV4KHZvaWQpOyB9Ci0KLWludCB5eXBhcnNlKHZvaWQpOwotCi0vKioKLSAqIEV4cGVjdGVkIHRvIGJlIGRlZmluZWQgYnkgRmxleC9CaXNvbgotICovCi12b2lkIHl5ZXJyb3IoY29uc3QgY2hhciogZm10LCAuLi4pOwotCi0vKioKLSAqIENoZWNrIHNpbXBsZSBpZGVudGlmaWVyIG5hbWVzCi0gKi8KLXZvaWQgdmFsaWRhdGVfc2ltcGxlX2lkZW50aWZpZXIoY29uc3QgY2hhciogaWRlbnRpZmllcik7Ci0KLS8qKgotICogQ2hlY2sgY29uc3RhbnQgdHlwZXMKLSAqLwotdm9pZCB2YWxpZGF0ZV9jb25zdF90eXBlKHRfY29uc3QqIGMpOwotCi0vKioKLSAqIENoZWNrIGNvbnN0YW50IHR5cGVzCi0gKi8KLXZvaWQgdmFsaWRhdGVfZmllbGRfdmFsdWUodF9maWVsZCogZmllbGQsIHRfY29uc3RfdmFsdWUqIGN2KTsKLQotLyoqCi0gKiBDaGVjayBtZW1iZXJzIG9mIGEgdGhyb3dzIGJsb2NrCi0gKi8KLWJvb2wgdmFsaWRhdGVfdGhyb3dzKHRfc3RydWN0KiB0aHJvd3MpOwotCi0vKioKLSAqIENvbnZlcnRzIGEgc3RyaW5nIGZpbGVuYW1lIGludG8gYSB0aHJpZnQgcHJvZ3JhbSBuYW1lCi0gKi8KLXN0ZDo6c3RyaW5nIHByb2dyYW1fbmFtZShzdGQ6OnN0cmluZyBmaWxlbmFtZSk7Ci0KLS8qKgotICogR2V0cyB0aGUgZGlyZWN0b3J5IHBhdGggb2YgYSBmaWxlbmFtZQotICovCi1zdGQ6OnN0cmluZyBkaXJlY3RvcnlfbmFtZShzdGQ6OnN0cmluZyBmaWxlbmFtZSk7Ci0KLS8qKgotICogR2V0IHRoZSBhYnNvbHV0ZSBwYXRoIGZvciBhbiBpbmNsdWRlIGZpbGUKLSAqLwotc3RkOjpzdHJpbmcgaW5jbHVkZV9maWxlKHN0ZDo6c3RyaW5nIGZpbGVuYW1lKTsKLQotLyoqCi0gKiBDbGVhcnMgYW55IHByZXZpb3VzbHkgc3RvcmVkIGRvY3RleHQgc3RyaW5nLgotICovCi12b2lkIGNsZWFyX2RvY3RleHQoKTsKLQotLyoqCi0gKiBDbGVhbnMgdXAgdGV4dCBjb21tb25seSBmb3VuZCBpbiBkb3h5Z2VuLWxpa2UgY29tbWVudHMKLSAqLwotY2hhciogY2xlYW5fdXBfZG9jdGV4dChjaGFyKiBkb2N0ZXh0KTsKLQotLyoqCi0gKiBXZSBhcmUgc3VyZSB0aGUgcHJvZ3JhbSBkb2N0ZXh0IGNhbmRpZGF0ZSBpcyByZWFsbHkgdGhlIHByb2dyYW0gZG9jdGV4dC4KLSAqLwotdm9pZCBkZWNsYXJlX3ZhbGlkX3Byb2dyYW1fZG9jdGV4dCgpOwotCi0vKioKLSAqIEVtaXRzIGEgd2FybmluZyBvbiBsaXN0PGJ5dGU+LCBiaW5hcnkgdHlwZSBpcyB0eXBpY2FsbHkgYSBtdWNoIGJldHRlciBjaG9pY2UuCi0gKi8KLXZvaWQgY2hlY2tfZm9yX2xpc3Rfb2ZfYnl0ZXModF90eXBlKiBsaXN0X2VsZW1fdHlwZSk7Ci0KLS8qKgotICogRmxleCB1dGlsaXRpZXMKLSAqLwotCi1leHRlcm4gaW50IHl5bGluZW5vOwotZXh0ZXJuIGNoYXIgeXl0ZXh0W107Ci1leHRlcm4gc3RkOjpGSUxFKiB5eWluOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvbWQ1LmMgYi9jb21waWxlci9jcHAvc3JjL21kNS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzVkOTZjLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvbWQ1LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzODEgKzAsMCBAQAotLyoKLSAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAyIEFsYWRkaW4gRW50ZXJwcmlzZXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCi0gIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKLSAgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KLQotICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKLSAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAotICBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6Ci0KLSAgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKLSAgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKLSAgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCi0gICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCi0gIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCi0gICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KLSAgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KLQotICBMLiBQZXRlciBEZXV0c2NoCi0gIGdob3N0QGFsYWRkaW4uY29tCi0KLSAqLwotLyogJElkOiBtZDUuYyx2IDEuNiAyMDAyLzA0LzEzIDE5OjIwOjI4IGxwZCBFeHAgJCAqLwotLyoKLSAgSW5kZXBlbmRlbnQgaW1wbGVtZW50YXRpb24gb2YgTUQ1IChSRkMgMTMyMSkuCi0KLSAgVGhpcyBjb2RlIGltcGxlbWVudHMgdGhlIE1ENSBBbGdvcml0aG0gZGVmaW5lZCBpbiBSRkMgMTMyMSwgd2hvc2UKLSAgdGV4dCBpcyBhdmFpbGFibGUgYXQKLQlodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMxMzIxLnR4dAotICBUaGUgY29kZSBpcyBkZXJpdmVkIGZyb20gdGhlIHRleHQgb2YgdGhlIFJGQywgaW5jbHVkaW5nIHRoZSB0ZXN0IHN1aXRlCi0gIChzZWN0aW9uIEEuNSkgYnV0IGV4Y2x1ZGluZyB0aGUgcmVzdCBvZiBBcHBlbmRpeCBBLiAgSXQgZG9lcyBub3QgaW5jbHVkZQotICBhbnkgY29kZSBvciBkb2N1bWVudGF0aW9uIHRoYXQgaXMgaWRlbnRpZmllZCBpbiB0aGUgUkZDIGFzIGJlaW5nCi0gIGNvcHlyaWdodGVkLgotCi0gIFRoZSBvcmlnaW5hbCBhbmQgcHJpbmNpcGFsIGF1dGhvciBvZiBtZDUuYyBpcyBMLiBQZXRlciBEZXV0c2NoCi0gIDxnaG9zdEBhbGFkZGluLmNvbT4uICBPdGhlciBhdXRob3JzIGFyZSBub3RlZCBpbiB0aGUgY2hhbmdlIGhpc3RvcnkKLSAgdGhhdCBmb2xsb3dzIChpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIpOgotCi0gIDIwMDItMDQtMTMgbHBkIENsYXJpZmllZCBkZXJpdmF0aW9uIGZyb20gUkZDIDEzMjE7IG5vdyBoYW5kbGVzIGJ5dGUgb3JkZXIKLQllaXRoZXIgc3RhdGljYWxseSBvciBkeW5hbWljYWxseTsgYWRkZWQgbWlzc2luZyAjaW5jbHVkZSA8c3RyaW5nLmg+Ci0JaW4gbGlicmFyeS4KLSAgMjAwMi0wMy0xMSBscGQgQ29ycmVjdGVkIGFyZ3VtZW50IGxpc3QgZm9yIG1haW4oKSwgYW5kIGFkZGVkIGludCByZXR1cm4KLQl0eXBlLCBpbiB0ZXN0IHByb2dyYW0gYW5kIFQgdmFsdWUgcHJvZ3JhbS4KLSAgMjAwMi0wMi0yMSBscGQgQWRkZWQgbWlzc2luZyAjaW5jbHVkZSA8c3RkaW8uaD4gaW4gdGVzdCBwcm9ncmFtLgotICAyMDAwLTA3LTAzIGxwZCBQYXRjaGVkIHRvIGVsaW1pbmF0ZSB3YXJuaW5ncyBhYm91dCAiY29uc3RhbnQgaXMKLQl1bnNpZ25lZCBpbiBBTlNJIEMsIHNpZ25lZCBpbiB0cmFkaXRpb25hbCI7IG1hZGUgdGVzdCBwcm9ncmFtCi0Jc2VsZi1jaGVja2luZy4KLSAgMTk5OS0xMS0wNCBscGQgRWRpdGVkIGNvbW1lbnRzIHNsaWdodGx5IGZvciBhdXRvbWF0aWMgVE9DIGV4dHJhY3Rpb24uCi0gIDE5OTktMTAtMTggbHBkIEZpeGVkIHR5cG8gaW4gaGVhZGVyIGNvbW1lbnQgKGFuc2kya25yIHJhdGhlciB0aGFuIG1kNSkuCi0gIDE5OTktMDUtMDMgbHBkIE9yaWdpbmFsIHZlcnNpb24uCi0gKi8KLQotI2luY2x1ZGUgIm1kNS5oIgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jdW5kZWYgQllURV9PUkRFUgkvKiAxID0gYmlnLWVuZGlhbiwgLTEgPSBsaXR0bGUtZW5kaWFuLCAwID0gdW5rbm93biAqLwotI2lmZGVmIEFSQ0hfSVNfQklHX0VORElBTgotIyAgZGVmaW5lIEJZVEVfT1JERVIgKEFSQ0hfSVNfQklHX0VORElBTiA/IDEgOiAtMSkKLSNlbHNlCi0jICBkZWZpbmUgQllURV9PUkRFUiAwCi0jZW5kaWYKLQotI2RlZmluZSBUX01BU0sgKChtZDVfd29yZF90KX4wKQotI2RlZmluZSBUMSAvKiAweGQ3NmFhNDc4ICovIChUX01BU0sgXiAweDI4OTU1Yjg3KQotI2RlZmluZSBUMiAvKiAweGU4YzdiNzU2ICovIChUX01BU0sgXiAweDE3Mzg0OGE5KQotI2RlZmluZSBUMyAgICAweDI0MjA3MGRiCi0jZGVmaW5lIFQ0IC8qIDB4YzFiZGNlZWUgKi8gKFRfTUFTSyBeIDB4M2U0MjMxMTEpCi0jZGVmaW5lIFQ1IC8qIDB4ZjU3YzBmYWYgKi8gKFRfTUFTSyBeIDB4MGE4M2YwNTApCi0jZGVmaW5lIFQ2ICAgIDB4NDc4N2M2MmEKLSNkZWZpbmUgVDcgLyogMHhhODMwNDYxMyAqLyAoVF9NQVNLIF4gMHg1N2NmYjllYykKLSNkZWZpbmUgVDggLyogMHhmZDQ2OTUwMSAqLyAoVF9NQVNLIF4gMHgwMmI5NmFmZSkKLSNkZWZpbmUgVDkgICAgMHg2OTgwOThkOAotI2RlZmluZSBUMTAgLyogMHg4YjQ0ZjdhZiAqLyAoVF9NQVNLIF4gMHg3NGJiMDg1MCkKLSNkZWZpbmUgVDExIC8qIDB4ZmZmZjViYjEgKi8gKFRfTUFTSyBeIDB4MDAwMGE0NGUpCi0jZGVmaW5lIFQxMiAvKiAweDg5NWNkN2JlICovIChUX01BU0sgXiAweDc2YTMyODQxKQotI2RlZmluZSBUMTMgICAgMHg2YjkwMTEyMgotI2RlZmluZSBUMTQgLyogMHhmZDk4NzE5MyAqLyAoVF9NQVNLIF4gMHgwMjY3OGU2YykKLSNkZWZpbmUgVDE1IC8qIDB4YTY3OTQzOGUgKi8gKFRfTUFTSyBeIDB4NTk4NmJjNzEpCi0jZGVmaW5lIFQxNiAgICAweDQ5YjQwODIxCi0jZGVmaW5lIFQxNyAvKiAweGY2MWUyNTYyICovIChUX01BU0sgXiAweDA5ZTFkYTlkKQotI2RlZmluZSBUMTggLyogMHhjMDQwYjM0MCAqLyAoVF9NQVNLIF4gMHgzZmJmNGNiZikKLSNkZWZpbmUgVDE5ICAgIDB4MjY1ZTVhNTEKLSNkZWZpbmUgVDIwIC8qIDB4ZTliNmM3YWEgKi8gKFRfTUFTSyBeIDB4MTY0OTM4NTUpCi0jZGVmaW5lIFQyMSAvKiAweGQ2MmYxMDVkICovIChUX01BU0sgXiAweDI5ZDBlZmEyKQotI2RlZmluZSBUMjIgICAgMHgwMjQ0MTQ1MwotI2RlZmluZSBUMjMgLyogMHhkOGExZTY4MSAqLyAoVF9NQVNLIF4gMHgyNzVlMTk3ZSkKLSNkZWZpbmUgVDI0IC8qIDB4ZTdkM2ZiYzggKi8gKFRfTUFTSyBeIDB4MTgyYzA0MzcpCi0jZGVmaW5lIFQyNSAgICAweDIxZTFjZGU2Ci0jZGVmaW5lIFQyNiAvKiAweGMzMzcwN2Q2ICovIChUX01BU0sgXiAweDNjYzhmODI5KQotI2RlZmluZSBUMjcgLyogMHhmNGQ1MGQ4NyAqLyAoVF9NQVNLIF4gMHgwYjJhZjI3OCkKLSNkZWZpbmUgVDI4ICAgIDB4NDU1YTE0ZWQKLSNkZWZpbmUgVDI5IC8qIDB4YTllM2U5MDUgKi8gKFRfTUFTSyBeIDB4NTYxYzE2ZmEpCi0jZGVmaW5lIFQzMCAvKiAweGZjZWZhM2Y4ICovIChUX01BU0sgXiAweDAzMTA1YzA3KQotI2RlZmluZSBUMzEgICAgMHg2NzZmMDJkOQotI2RlZmluZSBUMzIgLyogMHg4ZDJhNGM4YSAqLyAoVF9NQVNLIF4gMHg3MmQ1YjM3NSkKLSNkZWZpbmUgVDMzIC8qIDB4ZmZmYTM5NDIgKi8gKFRfTUFTSyBeIDB4MDAwNWM2YmQpCi0jZGVmaW5lIFQzNCAvKiAweDg3NzFmNjgxICovIChUX01BU0sgXiAweDc4OGUwOTdlKQotI2RlZmluZSBUMzUgICAgMHg2ZDlkNjEyMgotI2RlZmluZSBUMzYgLyogMHhmZGU1MzgwYyAqLyAoVF9NQVNLIF4gMHgwMjFhYzdmMykKLSNkZWZpbmUgVDM3IC8qIDB4YTRiZWVhNDQgKi8gKFRfTUFTSyBeIDB4NWI0MTE1YmIpCi0jZGVmaW5lIFQzOCAgICAweDRiZGVjZmE5Ci0jZGVmaW5lIFQzOSAvKiAweGY2YmI0YjYwICovIChUX01BU0sgXiAweDA5NDRiNDlmKQotI2RlZmluZSBUNDAgLyogMHhiZWJmYmM3MCAqLyAoVF9NQVNLIF4gMHg0MTQwNDM4ZikKLSNkZWZpbmUgVDQxICAgIDB4Mjg5YjdlYzYKLSNkZWZpbmUgVDQyIC8qIDB4ZWFhMTI3ZmEgKi8gKFRfTUFTSyBeIDB4MTU1ZWQ4MDUpCi0jZGVmaW5lIFQ0MyAvKiAweGQ0ZWYzMDg1ICovIChUX01BU0sgXiAweDJiMTBjZjdhKQotI2RlZmluZSBUNDQgICAgMHgwNDg4MWQwNQotI2RlZmluZSBUNDUgLyogMHhkOWQ0ZDAzOSAqLyAoVF9NQVNLIF4gMHgyNjJiMmZjNikKLSNkZWZpbmUgVDQ2IC8qIDB4ZTZkYjk5ZTUgKi8gKFRfTUFTSyBeIDB4MTkyNDY2MWEpCi0jZGVmaW5lIFQ0NyAgICAweDFmYTI3Y2Y4Ci0jZGVmaW5lIFQ0OCAvKiAweGM0YWM1NjY1ICovIChUX01BU0sgXiAweDNiNTNhOTlhKQotI2RlZmluZSBUNDkgLyogMHhmNDI5MjI0NCAqLyAoVF9NQVNLIF4gMHgwYmQ2ZGRiYikKLSNkZWZpbmUgVDUwICAgIDB4NDMyYWZmOTcKLSNkZWZpbmUgVDUxIC8qIDB4YWI5NDIzYTcgKi8gKFRfTUFTSyBeIDB4NTQ2YmRjNTgpCi0jZGVmaW5lIFQ1MiAvKiAweGZjOTNhMDM5ICovIChUX01BU0sgXiAweDAzNmM1ZmM2KQotI2RlZmluZSBUNTMgICAgMHg2NTViNTljMwotI2RlZmluZSBUNTQgLyogMHg4ZjBjY2M5MiAqLyAoVF9NQVNLIF4gMHg3MGYzMzM2ZCkKLSNkZWZpbmUgVDU1IC8qIDB4ZmZlZmY0N2QgKi8gKFRfTUFTSyBeIDB4MDAxMDBiODIpCi0jZGVmaW5lIFQ1NiAvKiAweDg1ODQ1ZGQxICovIChUX01BU0sgXiAweDdhN2JhMjJlKQotI2RlZmluZSBUNTcgICAgMHg2ZmE4N2U0ZgotI2RlZmluZSBUNTggLyogMHhmZTJjZTZlMCAqLyAoVF9NQVNLIF4gMHgwMWQzMTkxZikKLSNkZWZpbmUgVDU5IC8qIDB4YTMwMTQzMTQgKi8gKFRfTUFTSyBeIDB4NWNmZWJjZWIpCi0jZGVmaW5lIFQ2MCAgICAweDRlMDgxMWExCi0jZGVmaW5lIFQ2MSAvKiAweGY3NTM3ZTgyICovIChUX01BU0sgXiAweDA4YWM4MTdkKQotI2RlZmluZSBUNjIgLyogMHhiZDNhZjIzNSAqLyAoVF9NQVNLIF4gMHg0MmM1MGRjYSkKLSNkZWZpbmUgVDYzICAgIDB4MmFkN2QyYmIKLSNkZWZpbmUgVDY0IC8qIDB4ZWI4NmQzOTEgKi8gKFRfTUFTSyBeIDB4MTQ3OTJjNmUpCi0KLQotc3RhdGljIHZvaWQKLW1kNV9wcm9jZXNzKG1kNV9zdGF0ZV90ICpwbXMsIGNvbnN0IG1kNV9ieXRlX3QgKmRhdGEgLypbNjRdKi8pCi17Ci0gICAgbWQ1X3dvcmRfdAotCWEgPSBwbXMtPmFiY2RbMF0sIGIgPSBwbXMtPmFiY2RbMV0sCi0JYyA9IHBtcy0+YWJjZFsyXSwgZCA9IHBtcy0+YWJjZFszXTsKLSAgICBtZDVfd29yZF90IHQ7Ci0jaWYgQllURV9PUkRFUiA+IDAKLSAgICAvKiBEZWZpbmUgc3RvcmFnZSBvbmx5IGZvciBiaWctZW5kaWFuIENQVXMuICovCi0gICAgbWQ1X3dvcmRfdCBYWzE2XTsKLSNlbHNlCi0gICAgLyogRGVmaW5lIHN0b3JhZ2UgZm9yIGxpdHRsZS1lbmRpYW4gb3IgYm90aCB0eXBlcyBvZiBDUFVzLiAqLwotICAgIG1kNV93b3JkX3QgeGJ1ZlsxNl07Ci0gICAgY29uc3QgbWQ1X3dvcmRfdCAqWDsKLSNlbmRpZgotCi0gICAgewotI2lmIEJZVEVfT1JERVIgPT0gMAotCS8qCi0JICogRGV0ZXJtaW5lIGR5bmFtaWNhbGx5IHdoZXRoZXIgdGhpcyBpcyBhIGJpZy1lbmRpYW4gb3IKLQkgKiBsaXR0bGUtZW5kaWFuIG1hY2hpbmUsIHNpbmNlIHdlIGNhbiB1c2UgYSBtb3JlIGVmZmljaWVudAotCSAqIGFsZ29yaXRobSBvbiB0aGUgbGF0dGVyLgotCSAqLwotCXN0YXRpYyBjb25zdCBpbnQgdyA9IDE7Ci0KLQlpZiAoKigoY29uc3QgbWQ1X2J5dGVfdCAqKSZ3KSkgLyogZHluYW1pYyBsaXR0bGUtZW5kaWFuICovCi0jZW5kaWYKLSNpZiBCWVRFX09SREVSIDw9IDAJCS8qIGxpdHRsZS1lbmRpYW4gKi8KLQl7Ci0JICAgIC8qCi0JICAgICAqIE9uIGxpdHRsZS1lbmRpYW4gbWFjaGluZXMsIHdlIGNhbiBwcm9jZXNzIHByb3Blcmx5IGFsaWduZWQKLQkgICAgICogZGF0YSB3aXRob3V0IGNvcHlpbmcgaXQuCi0JICAgICAqLwotCSAgICBpZiAoISgoZGF0YSAtIChjb25zdCBtZDVfYnl0ZV90ICopMCkgJiAzKSkgewotCQkvKiBkYXRhIGFyZSBwcm9wZXJseSBhbGlnbmVkICovCi0JCVggPSAoY29uc3QgbWQ1X3dvcmRfdCAqKWRhdGE7Ci0JICAgIH0gZWxzZSB7Ci0JCS8qIG5vdCBhbGlnbmVkICovCi0JCW1lbWNweSh4YnVmLCBkYXRhLCA2NCk7Ci0JCVggPSB4YnVmOwotCSAgICB9Ci0JfQotI2VuZGlmCi0jaWYgQllURV9PUkRFUiA9PSAwCi0JZWxzZQkJCS8qIGR5bmFtaWMgYmlnLWVuZGlhbiAqLwotI2VuZGlmCi0jaWYgQllURV9PUkRFUiA+PSAwCQkvKiBiaWctZW5kaWFuICovCi0JewotCSAgICAvKgotCSAgICAgKiBPbiBiaWctZW5kaWFuIG1hY2hpbmVzLCB3ZSBtdXN0IGFycmFuZ2UgdGhlIGJ5dGVzIGluIHRoZQotCSAgICAgKiByaWdodCBvcmRlci4KLQkgICAgICovCi0JICAgIGNvbnN0IG1kNV9ieXRlX3QgKnhwID0gZGF0YTsKLQkgICAgaW50IGk7Ci0KLSMgIGlmIEJZVEVfT1JERVIgPT0gMAotCSAgICBYID0geGJ1ZjsJCS8qIChkeW5hbWljIG9ubHkpICovCi0jICBlbHNlCi0jICAgIGRlZmluZSB4YnVmIFgJCS8qIChzdGF0aWMgb25seSkgKi8KLSMgIGVuZGlmCi0JICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpLCB4cCArPSA0KQotCQl4YnVmW2ldID0geHBbMF0gKyAoeHBbMV0gPDwgOCkgKyAoeHBbMl0gPDwgMTYpICsgKHhwWzNdIDw8IDI0KTsKLQl9Ci0jZW5kaWYKLSAgICB9Ci0KLSNkZWZpbmUgUk9UQVRFX0xFRlQoeCwgbikgKCgoeCkgPDwgKG4pKSB8ICgoeCkgPj4gKDMyIC0gKG4pKSkpCi0KLSAgICAvKiBSb3VuZCAxLiAqLwotICAgIC8qIExldCBbYWJjZCBrIHMgaV0gZGVub3RlIHRoZSBvcGVyYXRpb24KLSAgICAgICBhID0gYiArICgoYSArIEYoYixjLGQpICsgWFtrXSArIFRbaV0pIDw8PCBzKS4gKi8KLSNkZWZpbmUgRih4LCB5LCB6KSAoKCh4KSAmICh5KSkgfCAofih4KSAmICh6KSkpCi0jZGVmaW5lIFNFVChhLCBiLCBjLCBkLCBrLCBzLCBUaSlcCi0gIHQgPSBhICsgRihiLGMsZCkgKyBYW2tdICsgVGk7XAotICBhID0gUk9UQVRFX0xFRlQodCwgcykgKyBiCi0gICAgLyogRG8gdGhlIGZvbGxvd2luZyAxNiBvcGVyYXRpb25zLiAqLwotICAgIFNFVChhLCBiLCBjLCBkLCAgMCwgIDcsICBUMSk7Ci0gICAgU0VUKGQsIGEsIGIsIGMsICAxLCAxMiwgIFQyKTsKLSAgICBTRVQoYywgZCwgYSwgYiwgIDIsIDE3LCAgVDMpOwotICAgIFNFVChiLCBjLCBkLCBhLCAgMywgMjIsICBUNCk7Ci0gICAgU0VUKGEsIGIsIGMsIGQsICA0LCAgNywgIFQ1KTsKLSAgICBTRVQoZCwgYSwgYiwgYywgIDUsIDEyLCAgVDYpOwotICAgIFNFVChjLCBkLCBhLCBiLCAgNiwgMTcsICBUNyk7Ci0gICAgU0VUKGIsIGMsIGQsIGEsICA3LCAyMiwgIFQ4KTsKLSAgICBTRVQoYSwgYiwgYywgZCwgIDgsICA3LCAgVDkpOwotICAgIFNFVChkLCBhLCBiLCBjLCAgOSwgMTIsIFQxMCk7Ci0gICAgU0VUKGMsIGQsIGEsIGIsIDEwLCAxNywgVDExKTsKLSAgICBTRVQoYiwgYywgZCwgYSwgMTEsIDIyLCBUMTIpOwotICAgIFNFVChhLCBiLCBjLCBkLCAxMiwgIDcsIFQxMyk7Ci0gICAgU0VUKGQsIGEsIGIsIGMsIDEzLCAxMiwgVDE0KTsKLSAgICBTRVQoYywgZCwgYSwgYiwgMTQsIDE3LCBUMTUpOwotICAgIFNFVChiLCBjLCBkLCBhLCAxNSwgMjIsIFQxNik7Ci0jdW5kZWYgU0VUCi0KLSAgICAgLyogUm91bmQgMi4gKi8KLSAgICAgLyogTGV0IFthYmNkIGsgcyBpXSBkZW5vdGUgdGhlIG9wZXJhdGlvbgotICAgICAgICAgIGEgPSBiICsgKChhICsgRyhiLGMsZCkgKyBYW2tdICsgVFtpXSkgPDw8IHMpLiAqLwotI2RlZmluZSBHKHgsIHksIHopICgoKHgpICYgKHopKSB8ICgoeSkgJiB+KHopKSkKLSNkZWZpbmUgU0VUKGEsIGIsIGMsIGQsIGssIHMsIFRpKVwKLSAgdCA9IGEgKyBHKGIsYyxkKSArIFhba10gKyBUaTtcCi0gIGEgPSBST1RBVEVfTEVGVCh0LCBzKSArIGIKLSAgICAgLyogRG8gdGhlIGZvbGxvd2luZyAxNiBvcGVyYXRpb25zLiAqLwotICAgIFNFVChhLCBiLCBjLCBkLCAgMSwgIDUsIFQxNyk7Ci0gICAgU0VUKGQsIGEsIGIsIGMsICA2LCAgOSwgVDE4KTsKLSAgICBTRVQoYywgZCwgYSwgYiwgMTEsIDE0LCBUMTkpOwotICAgIFNFVChiLCBjLCBkLCBhLCAgMCwgMjAsIFQyMCk7Ci0gICAgU0VUKGEsIGIsIGMsIGQsICA1LCAgNSwgVDIxKTsKLSAgICBTRVQoZCwgYSwgYiwgYywgMTAsICA5LCBUMjIpOwotICAgIFNFVChjLCBkLCBhLCBiLCAxNSwgMTQsIFQyMyk7Ci0gICAgU0VUKGIsIGMsIGQsIGEsICA0LCAyMCwgVDI0KTsKLSAgICBTRVQoYSwgYiwgYywgZCwgIDksICA1LCBUMjUpOwotICAgIFNFVChkLCBhLCBiLCBjLCAxNCwgIDksIFQyNik7Ci0gICAgU0VUKGMsIGQsIGEsIGIsICAzLCAxNCwgVDI3KTsKLSAgICBTRVQoYiwgYywgZCwgYSwgIDgsIDIwLCBUMjgpOwotICAgIFNFVChhLCBiLCBjLCBkLCAxMywgIDUsIFQyOSk7Ci0gICAgU0VUKGQsIGEsIGIsIGMsICAyLCAgOSwgVDMwKTsKLSAgICBTRVQoYywgZCwgYSwgYiwgIDcsIDE0LCBUMzEpOwotICAgIFNFVChiLCBjLCBkLCBhLCAxMiwgMjAsIFQzMik7Ci0jdW5kZWYgU0VUCi0KLSAgICAgLyogUm91bmQgMy4gKi8KLSAgICAgLyogTGV0IFthYmNkIGsgcyB0XSBkZW5vdGUgdGhlIG9wZXJhdGlvbgotICAgICAgICAgIGEgPSBiICsgKChhICsgSChiLGMsZCkgKyBYW2tdICsgVFtpXSkgPDw8IHMpLiAqLwotI2RlZmluZSBIKHgsIHksIHopICgoeCkgXiAoeSkgXiAoeikpCi0jZGVmaW5lIFNFVChhLCBiLCBjLCBkLCBrLCBzLCBUaSlcCi0gIHQgPSBhICsgSChiLGMsZCkgKyBYW2tdICsgVGk7XAotICBhID0gUk9UQVRFX0xFRlQodCwgcykgKyBiCi0gICAgIC8qIERvIHRoZSBmb2xsb3dpbmcgMTYgb3BlcmF0aW9ucy4gKi8KLSAgICBTRVQoYSwgYiwgYywgZCwgIDUsICA0LCBUMzMpOwotICAgIFNFVChkLCBhLCBiLCBjLCAgOCwgMTEsIFQzNCk7Ci0gICAgU0VUKGMsIGQsIGEsIGIsIDExLCAxNiwgVDM1KTsKLSAgICBTRVQoYiwgYywgZCwgYSwgMTQsIDIzLCBUMzYpOwotICAgIFNFVChhLCBiLCBjLCBkLCAgMSwgIDQsIFQzNyk7Ci0gICAgU0VUKGQsIGEsIGIsIGMsICA0LCAxMSwgVDM4KTsKLSAgICBTRVQoYywgZCwgYSwgYiwgIDcsIDE2LCBUMzkpOwotICAgIFNFVChiLCBjLCBkLCBhLCAxMCwgMjMsIFQ0MCk7Ci0gICAgU0VUKGEsIGIsIGMsIGQsIDEzLCAgNCwgVDQxKTsKLSAgICBTRVQoZCwgYSwgYiwgYywgIDAsIDExLCBUNDIpOwotICAgIFNFVChjLCBkLCBhLCBiLCAgMywgMTYsIFQ0Myk7Ci0gICAgU0VUKGIsIGMsIGQsIGEsICA2LCAyMywgVDQ0KTsKLSAgICBTRVQoYSwgYiwgYywgZCwgIDksICA0LCBUNDUpOwotICAgIFNFVChkLCBhLCBiLCBjLCAxMiwgMTEsIFQ0Nik7Ci0gICAgU0VUKGMsIGQsIGEsIGIsIDE1LCAxNiwgVDQ3KTsKLSAgICBTRVQoYiwgYywgZCwgYSwgIDIsIDIzLCBUNDgpOwotI3VuZGVmIFNFVAotCi0gICAgIC8qIFJvdW5kIDQuICovCi0gICAgIC8qIExldCBbYWJjZCBrIHMgdF0gZGVub3RlIHRoZSBvcGVyYXRpb24KLSAgICAgICAgICBhID0gYiArICgoYSArIEkoYixjLGQpICsgWFtrXSArIFRbaV0pIDw8PCBzKS4gKi8KLSNkZWZpbmUgSSh4LCB5LCB6KSAoKHkpIF4gKCh4KSB8IH4oeikpKQotI2RlZmluZSBTRVQoYSwgYiwgYywgZCwgaywgcywgVGkpXAotICB0ID0gYSArIEkoYixjLGQpICsgWFtrXSArIFRpO1wKLSAgYSA9IFJPVEFURV9MRUZUKHQsIHMpICsgYgotICAgICAvKiBEbyB0aGUgZm9sbG93aW5nIDE2IG9wZXJhdGlvbnMuICovCi0gICAgU0VUKGEsIGIsIGMsIGQsICAwLCAgNiwgVDQ5KTsKLSAgICBTRVQoZCwgYSwgYiwgYywgIDcsIDEwLCBUNTApOwotICAgIFNFVChjLCBkLCBhLCBiLCAxNCwgMTUsIFQ1MSk7Ci0gICAgU0VUKGIsIGMsIGQsIGEsICA1LCAyMSwgVDUyKTsKLSAgICBTRVQoYSwgYiwgYywgZCwgMTIsICA2LCBUNTMpOwotICAgIFNFVChkLCBhLCBiLCBjLCAgMywgMTAsIFQ1NCk7Ci0gICAgU0VUKGMsIGQsIGEsIGIsIDEwLCAxNSwgVDU1KTsKLSAgICBTRVQoYiwgYywgZCwgYSwgIDEsIDIxLCBUNTYpOwotICAgIFNFVChhLCBiLCBjLCBkLCAgOCwgIDYsIFQ1Nyk7Ci0gICAgU0VUKGQsIGEsIGIsIGMsIDE1LCAxMCwgVDU4KTsKLSAgICBTRVQoYywgZCwgYSwgYiwgIDYsIDE1LCBUNTkpOwotICAgIFNFVChiLCBjLCBkLCBhLCAxMywgMjEsIFQ2MCk7Ci0gICAgU0VUKGEsIGIsIGMsIGQsICA0LCAgNiwgVDYxKTsKLSAgICBTRVQoZCwgYSwgYiwgYywgMTEsIDEwLCBUNjIpOwotICAgIFNFVChjLCBkLCBhLCBiLCAgMiwgMTUsIFQ2Myk7Ci0gICAgU0VUKGIsIGMsIGQsIGEsICA5LCAyMSwgVDY0KTsKLSN1bmRlZiBTRVQKLQotICAgICAvKiBUaGVuIHBlcmZvcm0gdGhlIGZvbGxvd2luZyBhZGRpdGlvbnMuIChUaGF0IGlzIGluY3JlbWVudCBlYWNoCi0gICAgICAgIG9mIHRoZSBmb3VyIHJlZ2lzdGVycyBieSB0aGUgdmFsdWUgaXQgaGFkIGJlZm9yZSB0aGlzIGJsb2NrCi0gICAgICAgIHdhcyBzdGFydGVkLikgKi8KLSAgICBwbXMtPmFiY2RbMF0gKz0gYTsKLSAgICBwbXMtPmFiY2RbMV0gKz0gYjsKLSAgICBwbXMtPmFiY2RbMl0gKz0gYzsKLSAgICBwbXMtPmFiY2RbM10gKz0gZDsKLX0KLQotdm9pZAotbWQ1X2luaXQobWQ1X3N0YXRlX3QgKnBtcykKLXsKLSAgICBwbXMtPmNvdW50WzBdID0gcG1zLT5jb3VudFsxXSA9IDA7Ci0gICAgcG1zLT5hYmNkWzBdID0gMHg2NzQ1MjMwMTsKLSAgICBwbXMtPmFiY2RbMV0gPSAvKjB4ZWZjZGFiODkqLyBUX01BU0sgXiAweDEwMzI1NDc2OwotICAgIHBtcy0+YWJjZFsyXSA9IC8qMHg5OGJhZGNmZSovIFRfTUFTSyBeIDB4Njc0NTIzMDE7Ci0gICAgcG1zLT5hYmNkWzNdID0gMHgxMDMyNTQ3NjsKLX0KLQotdm9pZAotbWQ1X2FwcGVuZChtZDVfc3RhdGVfdCAqcG1zLCBjb25zdCBtZDVfYnl0ZV90ICpkYXRhLCBpbnQgbmJ5dGVzKQotewotICAgIGNvbnN0IG1kNV9ieXRlX3QgKnAgPSBkYXRhOwotICAgIGludCBsZWZ0ID0gbmJ5dGVzOwotICAgIGludCBvZmZzZXQgPSAocG1zLT5jb3VudFswXSA+PiAzKSAmIDYzOwotICAgIG1kNV93b3JkX3QgbmJpdHMgPSAobWQ1X3dvcmRfdCkobmJ5dGVzIDw8IDMpOwotCi0gICAgaWYgKG5ieXRlcyA8PSAwKQotCXJldHVybjsKLQotICAgIC8qIFVwZGF0ZSB0aGUgbWVzc2FnZSBsZW5ndGguICovCi0gICAgcG1zLT5jb3VudFsxXSArPSBuYnl0ZXMgPj4gMjk7Ci0gICAgcG1zLT5jb3VudFswXSArPSBuYml0czsKLSAgICBpZiAocG1zLT5jb3VudFswXSA8IG5iaXRzKQotCXBtcy0+Y291bnRbMV0rKzsKLQotICAgIC8qIFByb2Nlc3MgYW4gaW5pdGlhbCBwYXJ0aWFsIGJsb2NrLiAqLwotICAgIGlmIChvZmZzZXQpIHsKLQlpbnQgY29weSA9IChvZmZzZXQgKyBuYnl0ZXMgPiA2NCA/IDY0IC0gb2Zmc2V0IDogbmJ5dGVzKTsKLQotCW1lbWNweShwbXMtPmJ1ZiArIG9mZnNldCwgcCwgY29weSk7Ci0JaWYgKG9mZnNldCArIGNvcHkgPCA2NCkKLQkgICAgcmV0dXJuOwotCXAgKz0gY29weTsKLQlsZWZ0IC09IGNvcHk7Ci0JbWQ1X3Byb2Nlc3MocG1zLCBwbXMtPmJ1Zik7Ci0gICAgfQotCi0gICAgLyogUHJvY2VzcyBmdWxsIGJsb2Nrcy4gKi8KLSAgICBmb3IgKDsgbGVmdCA+PSA2NDsgcCArPSA2NCwgbGVmdCAtPSA2NCkKLQltZDVfcHJvY2VzcyhwbXMsIHApOwotCi0gICAgLyogUHJvY2VzcyBhIGZpbmFsIHBhcnRpYWwgYmxvY2suICovCi0gICAgaWYgKGxlZnQpCi0JbWVtY3B5KHBtcy0+YnVmLCBwLCBsZWZ0KTsKLX0KLQotdm9pZAotbWQ1X2ZpbmlzaChtZDVfc3RhdGVfdCAqcG1zLCBtZDVfYnl0ZV90IGRpZ2VzdFsxNl0pCi17Ci0gICAgc3RhdGljIGNvbnN0IG1kNV9ieXRlX3QgcGFkWzY0XSA9IHsKLQkweDgwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0JMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwCi0gICAgfTsKLSAgICBtZDVfYnl0ZV90IGRhdGFbOF07Ci0gICAgaW50IGk7Ci0KLSAgICAvKiBTYXZlIHRoZSBsZW5ndGggYmVmb3JlIHBhZGRpbmcuICovCi0gICAgZm9yIChpID0gMDsgaSA8IDg7ICsraSkKLQlkYXRhW2ldID0gKG1kNV9ieXRlX3QpKHBtcy0+Y291bnRbaSA+PiAyXSA+PiAoKGkgJiAzKSA8PCAzKSk7Ci0gICAgLyogUGFkIHRvIDU2IGJ5dGVzIG1vZCA2NC4gKi8KLSAgICBtZDVfYXBwZW5kKHBtcywgcGFkLCAoKDU1IC0gKHBtcy0+Y291bnRbMF0gPj4gMykpICYgNjMpICsgMSk7Ci0gICAgLyogQXBwZW5kIHRoZSBsZW5ndGguICovCi0gICAgbWQ1X2FwcGVuZChwbXMsIGRhdGEsIDgpOwotICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKQotCWRpZ2VzdFtpXSA9IChtZDVfYnl0ZV90KShwbXMtPmFiY2RbaSA+PiAyXSA+PiAoKGkgJiAzKSA8PCAzKSk7Ci19CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL21kNS5oIGIvY29tcGlsZXIvY3BwL3NyYy9tZDUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZiZTQ5OC4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL21kNS5oCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoKLSAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAyIEFsYWRkaW4gRW50ZXJwcmlzZXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCi0gIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKLSAgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KLQotICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKLSAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAotICBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6Ci0KLSAgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKLSAgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKLSAgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCi0gICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCi0gIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCi0gICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KLSAgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KLQotICBMLiBQZXRlciBEZXV0c2NoCi0gIGdob3N0QGFsYWRkaW4uY29tCi0KLSAqLwotLyogJElkOiBtZDUuaCx2IDEuNCAyMDAyLzA0LzEzIDE5OjIwOjI4IGxwZCBFeHAgJCAqLwotLyoKLSAgSW5kZXBlbmRlbnQgaW1wbGVtZW50YXRpb24gb2YgTUQ1IChSRkMgMTMyMSkuCi0KLSAgVGhpcyBjb2RlIGltcGxlbWVudHMgdGhlIE1ENSBBbGdvcml0aG0gZGVmaW5lZCBpbiBSRkMgMTMyMSwgd2hvc2UKLSAgdGV4dCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMxMzIxLnR4dAotICBUaGUgY29kZSBpcyBkZXJpdmVkIGZyb20gdGhlIHRleHQgb2YgdGhlIFJGQywgaW5jbHVkaW5nIHRoZSB0ZXN0IHN1aXRlCi0gIChzZWN0aW9uIEEuNSkgYnV0IGV4Y2x1ZGluZyB0aGUgcmVzdCBvZiBBcHBlbmRpeCBBLiAgSXQgZG9lcyBub3QgaW5jbHVkZQotICBhbnkgY29kZSBvciBkb2N1bWVudGF0aW9uIHRoYXQgaXMgaWRlbnRpZmllZCBpbiB0aGUgUkZDIGFzIGJlaW5nCi0gIGNvcHlyaWdodGVkLgotCi0gIFRoZSBvcmlnaW5hbCBhbmQgcHJpbmNpcGFsIGF1dGhvciBvZiBtZDUuaCBpcyBMLiBQZXRlciBEZXV0c2NoCi0gIDxnaG9zdEBhbGFkZGluLmNvbT4uICBPdGhlciBhdXRob3JzIGFyZSBub3RlZCBpbiB0aGUgY2hhbmdlIGhpc3RvcnkKLSAgdGhhdCBmb2xsb3dzIChpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIpOgotCi0gIDIwMDItMDQtMTMgbHBkIFJlbW92ZWQgc3VwcG9ydCBmb3Igbm9uLUFOU0kgY29tcGlsZXJzOyByZW1vdmVkCi0gICAgcmVmZXJlbmNlcyB0byBHaG9zdHNjcmlwdDsgY2xhcmlmaWVkIGRlcml2YXRpb24gZnJvbSBSRkMgMTMyMTsKLSAgICBub3cgaGFuZGxlcyBieXRlIG9yZGVyIGVpdGhlciBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5LgotICAxOTk5LTExLTA0IGxwZCBFZGl0ZWQgY29tbWVudHMgc2xpZ2h0bHkgZm9yIGF1dG9tYXRpYyBUT0MgZXh0cmFjdGlvbi4KLSAgMTk5OS0xMC0xOCBscGQgRml4ZWQgdHlwbyBpbiBoZWFkZXIgY29tbWVudCAoYW5zaTJrbnIgcmF0aGVyIHRoYW4gbWQ1KTsKLSAgICBhZGRlZCBjb25kaXRpb25hbGl6YXRpb24gZm9yIEMrKyBjb21waWxhdGlvbiBmcm9tIE1hcnRpbgotICAgIFB1cnNjaGtlIDxwdXJzY2hrZUBibmwuZ292Pi4KLSAgMTk5OS0wNS0wMyBscGQgT3JpZ2luYWwgdmVyc2lvbi4KLSAqLwotCi0jaWZuZGVmIG1kNV9JTkNMVURFRAotI2RlZmluZSBtZDVfSU5DTFVERUQKLQotLyoKLSAqIFRoaXMgcGFja2FnZSBzdXBwb3J0cyBib3RoIGNvbXBpbGUtdGltZSBhbmQgcnVuLXRpbWUgZGV0ZXJtaW5hdGlvbiBvZiBDUFUKLSAqIGJ5dGUgb3JkZXIuICBJZiBBUkNIX0lTX0JJR19FTkRJQU4gaXMgZGVmaW5lZCBhcyAwLCB0aGUgY29kZSB3aWxsIGJlCi0gKiBjb21waWxlZCB0byBydW4gb25seSBvbiBsaXR0bGUtZW5kaWFuIENQVXM7IGlmIEFSQ0hfSVNfQklHX0VORElBTiBpcwotICogZGVmaW5lZCBhcyBub24temVybywgdGhlIGNvZGUgd2lsbCBiZSBjb21waWxlZCB0byBydW4gb25seSBvbiBiaWctZW5kaWFuCi0gKiBDUFVzOyBpZiBBUkNIX0lTX0JJR19FTkRJQU4gaXMgbm90IGRlZmluZWQsIHRoZSBjb2RlIHdpbGwgYmUgY29tcGlsZWQgdG8KLSAqIHJ1biBvbiBlaXRoZXIgYmlnLSBvciBsaXR0bGUtZW5kaWFuIENQVXMsIGJ1dCB3aWxsIHJ1biBzbGlnaHRseSBsZXNzCi0gKiBlZmZpY2llbnRseSBvbiBlaXRoZXIgb25lIHRoYW4gaWYgQVJDSF9JU19CSUdfRU5ESUFOIGlzIGRlZmluZWQuCi0gKi8KLQotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIG1kNV9ieXRlX3Q7IC8qIDgtYml0IGJ5dGUgKi8KLXR5cGVkZWYgdW5zaWduZWQgaW50IG1kNV93b3JkX3Q7ICAvKiAzMi1iaXQgd29yZCAqLwotCi0vKiBEZWZpbmUgdGhlIHN0YXRlIG9mIHRoZSBNRDUgQWxnb3JpdGhtLiAqLwotdHlwZWRlZiBzdHJ1Y3QgbWQ1X3N0YXRlX3MgewotICBtZDVfd29yZF90IGNvdW50WzJdOyAvKiBtZXNzYWdlIGxlbmd0aCBpbiBiaXRzLCBsc3cgZmlyc3QgKi8KLSAgbWQ1X3dvcmRfdCBhYmNkWzRdOyAgLyogZGlnZXN0IGJ1ZmZlciAqLwotICBtZDVfYnl0ZV90IGJ1Zls2NF07ICAvKiBhY2N1bXVsYXRlIGJsb2NrICovCi19IG1kNV9zdGF0ZV90OwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qIEluaXRpYWxpemUgdGhlIGFsZ29yaXRobS4gKi8KLXZvaWQgbWQ1X2luaXQobWQ1X3N0YXRlX3QqIHBtcyk7Ci0KLS8qIEFwcGVuZCBhIHN0cmluZyB0byB0aGUgbWVzc2FnZS4gKi8KLXZvaWQgbWQ1X2FwcGVuZChtZDVfc3RhdGVfdCogcG1zLCBjb25zdCBtZDVfYnl0ZV90KiBkYXRhLCBpbnQgbmJ5dGVzKTsKLQotLyogRmluaXNoIHRoZSBtZXNzYWdlIGFuZCByZXR1cm4gdGhlIGRpZ2VzdC4gKi8KLXZvaWQgbWQ1X2ZpbmlzaChtZDVfc3RhdGVfdCogcG1zLCBtZDVfYnl0ZV90IGRpZ2VzdFsxNl0pOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0gLyogZW5kIGV4dGVybiAiQyIgKi8KLSNlbmRpZgotCi0jZW5kaWYgLyogbWQ1X0lOQ0xVREVEICovCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3BhcnNlLmNjIGIvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS9wYXJzZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIyZWU1Mi4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3BhcnNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAidF90eXBlLmgiCi0jaW5jbHVkZSAidF90eXBlZGVmLmgiCi0KLSNpbmNsdWRlICJtYWluLmgiCi0KLXRfdHlwZSogdF90eXBlOjpnZXRfdHJ1ZV90eXBlKCkgewotICB0X3R5cGUqIHR5cGUgPSB0aGlzOwotICB3aGlsZSAodHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgdHlwZSA9ICgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKTsKLSAgfQotICByZXR1cm4gdHlwZTsKLX0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9iYXNlX3R5cGUuaCBiL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9iYXNlX3R5cGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJlMWY4MC4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfYmFzZV90eXBlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfQkFTRV9UWVBFX0gKLSNkZWZpbmUgVF9CQVNFX1RZUEVfSAotCi0jaW5jbHVkZSA8Y3N0ZGxpYj4KLSNpbmNsdWRlICJ0X3R5cGUuaCIKLQotLyoqCi0gKiBBIHRocmlmdCBiYXNlIHR5cGUsIHdoaWNoIG11c3QgYmUgb25lIG9mIHRoZSBkZWZpbmVkIGVudW1lcmF0ZWQgdHlwZXMgaW5zaWRlCi0gKiB0aGlzIGRlZmluaXRpb24uCi0gKgotICovCi1jbGFzcyB0X2Jhc2VfdHlwZSA6IHB1YmxpYyB0X3R5cGUgewotcHVibGljOgotICAvKioKLSAgICogRW51bWVyYXRpb24gb2YgdGhyaWZ0IGJhc2UgdHlwZXMKLSAgICovCi0gIGVudW0gdF9iYXNlIHsKLSAgICBUWVBFX1ZPSUQsCi0gICAgVFlQRV9TVFJJTkcsCi0gICAgVFlQRV9CT09MLAotICAgIFRZUEVfQllURSwKLSAgICBUWVBFX0kxNiwKLSAgICBUWVBFX0kzMiwKLSAgICBUWVBFX0k2NCwKLSAgICBUWVBFX0RPVUJMRQotICB9OwotCi0gIHRfYmFzZV90eXBlKHN0ZDo6c3RyaW5nIG5hbWUsIHRfYmFzZSBiYXNlKQotICAgIDogdF90eXBlKG5hbWUpLCBiYXNlXyhiYXNlKSwgc3RyaW5nX2xpc3RfKGZhbHNlKSwgYmluYXJ5XyhmYWxzZSksIHN0cmluZ19lbnVtXyhmYWxzZSkge30KLQotICB0X2Jhc2UgZ2V0X2Jhc2UoKSBjb25zdCB7IHJldHVybiBiYXNlXzsgfQotCi0gIGJvb2wgaXNfdm9pZCgpIGNvbnN0IHsgcmV0dXJuIGJhc2VfID09IFRZUEVfVk9JRDsgfQotCi0gIGJvb2wgaXNfc3RyaW5nKCkgY29uc3QgeyByZXR1cm4gYmFzZV8gPT0gVFlQRV9TVFJJTkc7IH0KLQotICBib29sIGlzX2Jvb2woKSBjb25zdCB7IHJldHVybiBiYXNlXyA9PSBUWVBFX0JPT0w7IH0KLQotICB2b2lkIHNldF9zdHJpbmdfbGlzdChib29sIHZhbCkgeyBzdHJpbmdfbGlzdF8gPSB2YWw7IH0KLQotICBib29sIGlzX3N0cmluZ19saXN0KCkgY29uc3QgeyByZXR1cm4gKGJhc2VfID09IFRZUEVfU1RSSU5HKSAmJiBzdHJpbmdfbGlzdF87IH0KLQotICB2b2lkIHNldF9iaW5hcnkoYm9vbCB2YWwpIHsgYmluYXJ5XyA9IHZhbDsgfQotCi0gIGJvb2wgaXNfYmluYXJ5KCkgY29uc3QgeyByZXR1cm4gKGJhc2VfID09IFRZUEVfU1RSSU5HKSAmJiBiaW5hcnlfOyB9Ci0KLSAgdm9pZCBzZXRfc3RyaW5nX2VudW0oYm9vbCB2YWwpIHsgc3RyaW5nX2VudW1fID0gdmFsOyB9Ci0KLSAgYm9vbCBpc19zdHJpbmdfZW51bSgpIGNvbnN0IHsgcmV0dXJuIGJhc2VfID09IFRZUEVfU1RSSU5HICYmIHN0cmluZ19lbnVtXzsgfQotCi0gIHZvaWQgYWRkX3N0cmluZ19lbnVtX3ZhbChzdGQ6OnN0cmluZyB2YWwpIHsgc3RyaW5nX2VudW1fdmFsc18ucHVzaF9iYWNrKHZhbCk7IH0KLQotICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGdldF9zdHJpbmdfZW51bV92YWxzKCkgY29uc3QgeyByZXR1cm4gc3RyaW5nX2VudW1fdmFsc187IH0KLQotICBib29sIGlzX2Jhc2VfdHlwZSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLQotICBzdGF0aWMgc3RkOjpzdHJpbmcgdF9iYXNlX25hbWUodF9iYXNlIHRiYXNlKSB7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgVFlQRV9WT0lEOgotICAgICAgcmV0dXJuICJ2b2lkIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gInN0cmluZyI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiYm9vbCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRZUEVfQllURToKLSAgICAgIHJldHVybiAiYnl0ZSI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRZUEVfSTE2OgotICAgICAgcmV0dXJuICJpMTYiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiaTMyIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gImk2NCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJkb3VibGUiOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAiKHVua25vd24pIjsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi1wcml2YXRlOgotICB0X2Jhc2UgYmFzZV87Ci0KLSAgYm9vbCBzdHJpbmdfbGlzdF87Ci0gIGJvb2wgYmluYXJ5XzsKLSAgYm9vbCBzdHJpbmdfZW51bV87Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzdHJpbmdfZW51bV92YWxzXzsKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2NvbnN0LmggYi9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfY29uc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY2NGJiMS4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfY29uc3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX0NPTlNUX0gKLSNkZWZpbmUgVF9DT05TVF9ICi0KLSNpbmNsdWRlICJ0X3R5cGUuaCIKLSNpbmNsdWRlICJ0X2NvbnN0X3ZhbHVlLmgiCi0KLS8qKgotICogQSBjb25zdCBpcyBhIGNvbnN0YW50IHZhbHVlIGRlZmluZWQgYWNyb3NzIGxhbmd1YWdlcyB0aGF0IGhhcyBhIHR5cGUgYW5kCi0gKiBhIHZhbHVlLiBUaGUgdHJpY2sgaGVyZSBpcyB0aGF0IHRoZSBkZWNsYXJlZCB0eXBlIG1pZ2h0IG5vdCBtYXRjaCB0aGUgdHlwZQotICogb2YgdGhlIHZhbHVlIG9iamVjdCwgc2luY2UgdGhhdCBpcyBub3QgZGV0ZXJtaW5lZCB1bnRpbCBhZnRlciBwYXJzaW5nIHRoZQotICogd2hvbGUgdGhpbmcgb3V0LgotICoKLSAqLwotY2xhc3MgdF9jb25zdCA6IHB1YmxpYyB0X2RvYyB7Ci1wdWJsaWM6Ci0gIHRfY29uc3QodF90eXBlKiB0eXBlLCBzdGQ6OnN0cmluZyBuYW1lLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkKLSAgICA6IHR5cGVfKHR5cGUpLCBuYW1lXyhuYW1lKSwgdmFsdWVfKHZhbHVlKSB7fQotCi0gIHRfdHlwZSogZ2V0X3R5cGUoKSBjb25zdCB7IHJldHVybiB0eXBlXzsgfQotCi0gIHN0ZDo6c3RyaW5nIGdldF9uYW1lKCkgY29uc3QgeyByZXR1cm4gbmFtZV87IH0KLQotICB0X2NvbnN0X3ZhbHVlKiBnZXRfdmFsdWUoKSBjb25zdCB7IHJldHVybiB2YWx1ZV87IH0KLQotcHJpdmF0ZToKLSAgdF90eXBlKiB0eXBlXzsKLSAgc3RkOjpzdHJpbmcgbmFtZV87Ci0gIHRfY29uc3RfdmFsdWUqIHZhbHVlXzsKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2NvbnN0X3ZhbHVlLmggYi9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfY29uc3RfdmFsdWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U2ZTNmNi4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfY29uc3RfdmFsdWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVF9DT05TVF9WQUxVRV9ICi0jZGVmaW5lIFRfQ09OU1RfVkFMVUVfSAotCi0jaW5jbHVkZSAidF9lbnVtLmgiCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLS8qKgotICogQSBjb25zdCB2YWx1ZSBpcyBzb21ldGhpbmcgcGFyc2VkIHRoYXQgY291bGQgYmUgYSBtYXAsIHNldCwgbGlzdCwgc3RydWN0Ci0gKiBvciB3aGF0ZXZlci4KLSAqCi0gKi8KLWNsYXNzIHRfY29uc3RfdmFsdWUgewotcHVibGljOgotICBlbnVtIHRfY29uc3RfdmFsdWVfdHlwZSB7IENWX0lOVEVHRVIsIENWX0RPVUJMRSwgQ1ZfU1RSSU5HLCBDVl9NQVAsIENWX0xJU1QsIENWX0lERU5USUZJRVIgfTsKLQotICB0X2NvbnN0X3ZhbHVlKCkge30KLQotICB0X2NvbnN0X3ZhbHVlKGludDY0X3QgdmFsKSB7IHNldF9pbnRlZ2VyKHZhbCk7IH0KLQotICB0X2NvbnN0X3ZhbHVlKHN0ZDo6c3RyaW5nIHZhbCkgeyBzZXRfc3RyaW5nKHZhbCk7IH0KLQotICB2b2lkIHNldF9zdHJpbmcoc3RkOjpzdHJpbmcgdmFsKSB7Ci0gICAgdmFsVHlwZV8gPSBDVl9TVFJJTkc7Ci0gICAgc3RyaW5nVmFsXyA9IHZhbDsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIGdldF9zdHJpbmcoKSBjb25zdCB7IHJldHVybiBzdHJpbmdWYWxfOyB9Ci0KLSAgdm9pZCBzZXRfaW50ZWdlcihpbnQ2NF90IHZhbCkgewotICAgIHZhbFR5cGVfID0gQ1ZfSU5URUdFUjsKLSAgICBpbnRWYWxfID0gdmFsOwotICB9Ci0KLSAgaW50NjRfdCBnZXRfaW50ZWdlcigpIGNvbnN0IHsKLSAgICBpZiAodmFsVHlwZV8gPT0gQ1ZfSURFTlRJRklFUikgewotICAgICAgaWYgKGVudW1fID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cgImhhdmUgaWRlbnRpZmllciBcIiIgKyBnZXRfaWRlbnRpZmllcigpICsgIlwiLCBidXQgdW5zZXQgZW51bSBvbiBsaW5lISI7Ci0gICAgICB9Ci0gICAgICBzdGQ6OnN0cmluZyBpZGVudGlmaWVyID0gZ2V0X2lkZW50aWZpZXIoKTsKLSAgICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgZG90ID0gaWRlbnRpZmllci5yZmluZCgnLicpOwotICAgICAgaWYgKGRvdCAhPSBzdGQ6OnN0cmluZzo6bnBvcykgewotICAgICAgICBpZGVudGlmaWVyID0gaWRlbnRpZmllci5zdWJzdHIoZG90ICsgMSk7Ci0gICAgICB9Ci0gICAgICB0X2VudW1fdmFsdWUqIHZhbCA9IGVudW1fLT5nZXRfY29uc3RhbnRfYnlfbmFtZShpZGVudGlmaWVyKTsKLSAgICAgIGlmICh2YWwgPT0gTlVMTCkgewotICAgICAgICB0aHJvdyAiVW5hYmxlIHRvIGZpbmQgZW51bSB2YWx1ZSBcIiIgKyBpZGVudGlmaWVyICsgIlwiIGluIGVudW0gXCIiICsgZW51bV8tPmdldF9uYW1lKCkKLSAgICAgICAgICAgICsgIlwiIjsKLSAgICAgIH0KLSAgICAgIHJldHVybiB2YWwtPmdldF92YWx1ZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gaW50VmFsXzsKLSAgICB9Ci0gIH0KLQotICB2b2lkIHNldF9kb3VibGUoZG91YmxlIHZhbCkgewotICAgIHZhbFR5cGVfID0gQ1ZfRE9VQkxFOwotICAgIGRvdWJsZVZhbF8gPSB2YWw7Ci0gIH0KLQotICBkb3VibGUgZ2V0X2RvdWJsZSgpIGNvbnN0IHsgcmV0dXJuIGRvdWJsZVZhbF87IH0KLQotICB2b2lkIHNldF9tYXAoKSB7IHZhbFR5cGVfID0gQ1ZfTUFQOyB9Ci0KLSAgdm9pZCBhZGRfbWFwKHRfY29uc3RfdmFsdWUqIGtleSwgdF9jb25zdF92YWx1ZSogdmFsKSB7IG1hcFZhbF9ba2V5XSA9IHZhbDsgfQotCi0gIGNvbnN0IHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIGdldF9tYXAoKSBjb25zdCB7IHJldHVybiBtYXBWYWxfOyB9Ci0KLSAgdm9pZCBzZXRfbGlzdCgpIHsgdmFsVHlwZV8gPSBDVl9MSVNUOyB9Ci0KLSAgdm9pZCBhZGRfbGlzdCh0X2NvbnN0X3ZhbHVlKiB2YWwpIHsgbGlzdFZhbF8ucHVzaF9iYWNrKHZhbCk7IH0KLQotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIGdldF9saXN0KCkgY29uc3QgeyByZXR1cm4gbGlzdFZhbF87IH0KLQotICB2b2lkIHNldF9pZGVudGlmaWVyKHN0ZDo6c3RyaW5nIHZhbCkgewotICAgIHZhbFR5cGVfID0gQ1ZfSURFTlRJRklFUjsKLSAgICBpZGVudGlmaWVyVmFsXyA9IHZhbDsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIGdldF9pZGVudGlmaWVyKCkgY29uc3QgeyByZXR1cm4gaWRlbnRpZmllclZhbF87IH0KLQotICBzdGQ6OnN0cmluZyBnZXRfaWRlbnRpZmllcl9uYW1lKCkgY29uc3QgewotICAgIHN0ZDo6c3RyaW5nIHJldCA9IGdldF9pZGVudGlmaWVyKCk7Ci0gICAgc2l6ZV90IHMgPSByZXQuZmluZCgnLicpOwotICAgIGlmIChzID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7Ci0gICAgICB0aHJvdyAiZXJyb3I6IGlkZW50aWZpZXIgIiArIHJldCArICIgaXMgdW5xdWFsaWZpZWQhIjsKLSAgICB9Ci0gICAgcmV0ID0gcmV0LnN1YnN0cihzICsgMSk7Ci0gICAgcyA9IHJldC5maW5kKCcuJyk7Ci0gICAgaWYgKHMgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKLSAgICAgIHJldCA9IHJldC5zdWJzdHIocyArIDEpOwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgZ2V0X2lkZW50aWZpZXJfd2l0aF9wYXJlbnQoKSBjb25zdCB7Ci0gICAgc3RkOjpzdHJpbmcgcmV0ID0gZ2V0X2lkZW50aWZpZXIoKTsKLSAgICBzaXplX3QgcyA9IHJldC5maW5kKCcuJyk7Ci0gICAgaWYgKHMgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKLSAgICAgIHRocm93ICJlcnJvcjogaWRlbnRpZmllciAiICsgcmV0ICsgIiBpcyB1bnF1YWxpZmllZCEiOwotICAgIH0KLSAgICBzaXplX3QgczIgPSByZXQuZmluZCgnLicsIHMgKyAxKTsKLSAgICBpZiAoczIgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKLSAgICAgIHJldCA9IHJldC5zdWJzdHIocyArIDEpOwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotICB9Ci0KLSAgdm9pZCBzZXRfZW51bSh0X2VudW0qIHRlbnVtKSB7IGVudW1fID0gdGVudW07IH0KLQotICB0X2NvbnN0X3ZhbHVlX3R5cGUgZ2V0X3R5cGUoKSBjb25zdCB7IHJldHVybiB2YWxUeXBlXzsgfQotCi1wcml2YXRlOgotICBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+IG1hcFZhbF87Ci0gIHN0ZDo6dmVjdG9yPHRfY29uc3RfdmFsdWUqPiBsaXN0VmFsXzsKLSAgc3RkOjpzdHJpbmcgc3RyaW5nVmFsXzsKLSAgaW50NjRfdCBpbnRWYWxfOwotICBkb3VibGUgZG91YmxlVmFsXzsKLSAgc3RkOjpzdHJpbmcgaWRlbnRpZmllclZhbF87Ci0gIHRfZW51bSogZW51bV87Ci0KLSAgdF9jb25zdF92YWx1ZV90eXBlIHZhbFR5cGVfOwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfY29udGFpbmVyLmggYi9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfY29udGFpbmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkOTkyYjcuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2NvbnRhaW5lci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfQ09OVEFJTkVSX0gKLSNkZWZpbmUgVF9DT05UQUlORVJfSAotCi0jaW5jbHVkZSAidF90eXBlLmgiCi0KLWNsYXNzIHRfY29udGFpbmVyIDogcHVibGljIHRfdHlwZSB7Ci1wdWJsaWM6Ci0gIHRfY29udGFpbmVyKCkgOiBjcHBfbmFtZV8oKSwgaGFzX2NwcF9uYW1lXyhmYWxzZSkge30KLQotICB2aXJ0dWFsIH50X2NvbnRhaW5lcigpIHt9Ci0KLSAgdm9pZCBzZXRfY3BwX25hbWUoc3RkOjpzdHJpbmcgY3BwX25hbWUpIHsKLSAgICBjcHBfbmFtZV8gPSBjcHBfbmFtZTsKLSAgICBoYXNfY3BwX25hbWVfID0gdHJ1ZTsKLSAgfQotCi0gIGJvb2wgaGFzX2NwcF9uYW1lKCkgeyByZXR1cm4gaGFzX2NwcF9uYW1lXzsgfQotCi0gIHN0ZDo6c3RyaW5nIGdldF9jcHBfbmFtZSgpIHsgcmV0dXJuIGNwcF9uYW1lXzsgfQotCi0gIGJvb2wgaXNfY29udGFpbmVyKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotCi1wcml2YXRlOgotICBzdGQ6OnN0cmluZyBjcHBfbmFtZV87Ci0gIGJvb2wgaGFzX2NwcF9uYW1lXzsKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2RvYy5oIGIvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2RvYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDMxMGI3Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9kb2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX0RPQ19ICi0jZGVmaW5lIFRfRE9DX0gKLQotI2luY2x1ZGUgImdsb2JhbHMuaCIKLSNpbmNsdWRlICJsb2dnaW5nLmgiCi0KLS8qKgotICogRG9jdW1lbnRhdGlvbiBzdHVicwotICoKLSAqLwotY2xhc3MgdF9kb2MgewotCi1wdWJsaWM6Ci0gIHRfZG9jKCkgOiBoYXNfZG9jXyhmYWxzZSkge30KLQotICB2b2lkIHNldF9kb2MoY29uc3Qgc3RkOjpzdHJpbmcmIGRvYykgewotICAgIGRvY18gPSBkb2M7Ci0gICAgaGFzX2RvY18gPSB0cnVlOwotICAgIGlmICgoZ19wcm9ncmFtX2RvY3RleHRfbGluZW5vID09IGdfZG9jdGV4dF9saW5lbm8pCi0gICAgICAgICYmIChnX3Byb2dyYW1fZG9jdGV4dF9zdGF0dXMgPT0gU1RJTExfQ0FORElEQVRFKSkgewotICAgICAgZ19wcm9ncmFtX2RvY3RleHRfc3RhdHVzID0gQUxSRUFEWV9QUk9DRVNTRUQ7Ci0gICAgICBwZGVidWcoIiVzIiwgInByb2dyYW0gZG9jdGV4dCBzZXQgdG8gQUxSRUFEWV9QUk9DRVNTRUQiKTsKLSAgICB9Ci0gIH0KLQotICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0X2RvYygpIGNvbnN0IHsgcmV0dXJuIGRvY187IH0KLQotICBib29sIGhhc19kb2MoKSB7IHJldHVybiBoYXNfZG9jXzsgfQotCi1wcml2YXRlOgotICBzdGQ6OnN0cmluZyBkb2NfOwotICBib29sIGhhc19kb2NfOwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfZW51bS5oIGIvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2VudW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I2YTAyMC4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfZW51bS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX0VOVU1fSAotI2RlZmluZSBUX0VOVU1fSAotCi0jaW5jbHVkZSAidF9lbnVtX3ZhbHVlLmgiCi0jaW5jbHVkZSA8dmVjdG9yPgotCi0vKioKLSAqIEFuIGVudW1lcmF0ZWQgdHlwZS4gQSBsaXN0IG9mIGNvbnN0YW50IG9iamVjdHMgd2l0aCBhIG5hbWUgZm9yIHRoZSB0eXBlLgotICoKLSAqLwotY2xhc3MgdF9lbnVtIDogcHVibGljIHRfdHlwZSB7Ci1wdWJsaWM6Ci0gIHRfZW51bSh0X3Byb2dyYW0qIHByb2dyYW0pIDogdF90eXBlKHByb2dyYW0pIHt9Ci0KLSAgdm9pZCBzZXRfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgeyBuYW1lXyA9IG5hbWU7IH0KLQotICB2b2lkIGFwcGVuZCh0X2VudW1fdmFsdWUqIGNvbnN0YW50KSB7IGNvbnN0YW50c18ucHVzaF9iYWNrKGNvbnN0YW50KTsgfQotCi0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+JiBnZXRfY29uc3RhbnRzKCkgeyByZXR1cm4gY29uc3RhbnRzXzsgfQotCi0gIHRfZW51bV92YWx1ZSogZ2V0X2NvbnN0YW50X2J5X25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsKLSAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2VudW1fdmFsdWUqPiYgZW51bV92YWx1ZXMgPSBnZXRfY29uc3RhbnRzKCk7Ci0gICAgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGNfaXRlcjsKLSAgICBmb3IgKGNfaXRlciA9IGVudW1fdmFsdWVzLmJlZ2luKCk7IGNfaXRlciAhPSBlbnVtX3ZhbHVlcy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICAgIGlmICgoKmNfaXRlciktPmdldF9uYW1lKCkgPT0gbmFtZSkgewotICAgICAgICByZXR1cm4gKmNfaXRlcjsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICB0X2VudW1fdmFsdWUqIGdldF9jb25zdGFudF9ieV92YWx1ZShpbnQ2NF90IHZhbHVlKSB7Ci0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4mIGVudW1fdmFsdWVzID0gZ2V0X2NvbnN0YW50cygpOwotICAgIHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBjX2l0ZXI7Ci0gICAgZm9yIChjX2l0ZXIgPSBlbnVtX3ZhbHVlcy5iZWdpbigpOyBjX2l0ZXIgIT0gZW51bV92YWx1ZXMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgICBpZiAoKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSA9PSB2YWx1ZSkgewotICAgICAgICByZXR1cm4gKmNfaXRlcjsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICB0X2VudW1fdmFsdWUqIGdldF9taW5fdmFsdWUoKSB7Ci0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4mIGVudW1fdmFsdWVzID0gZ2V0X2NvbnN0YW50cygpOwotICAgIHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBjX2l0ZXI7Ci0gICAgdF9lbnVtX3ZhbHVlKiBtaW5fdmFsdWU7Ci0gICAgaWYgKGVudW1fdmFsdWVzLnNpemUoKSA9PSAwKSB7Ci0gICAgICBtaW5fdmFsdWUgPSBOVUxMOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbnQgbWluX3ZhbHVlX3ZhbHVlOwotICAgICAgbWluX3ZhbHVlID0gZW51bV92YWx1ZXMuZnJvbnQoKTsKLSAgICAgIG1pbl92YWx1ZV92YWx1ZSA9IG1pbl92YWx1ZS0+Z2V0X3ZhbHVlKCk7Ci0gICAgICBmb3IgKGNfaXRlciA9IGVudW1fdmFsdWVzLmJlZ2luKCk7IGNfaXRlciAhPSBlbnVtX3ZhbHVlcy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkgPCBtaW5fdmFsdWVfdmFsdWUpIHsKLSAgICAgICAgICBtaW5fdmFsdWUgPSAoKmNfaXRlcik7Ci0gICAgICAgICAgbWluX3ZhbHVlX3ZhbHVlID0gbWluX3ZhbHVlLT5nZXRfdmFsdWUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbWluX3ZhbHVlOwotICB9Ci0KLSAgdF9lbnVtX3ZhbHVlKiBnZXRfbWF4X3ZhbHVlKCkgewotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+JiBlbnVtX3ZhbHVlcyA9IGdldF9jb25zdGFudHMoKTsKLSAgICBzdGQ6OnZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IgY19pdGVyOwotICAgIHRfZW51bV92YWx1ZSogbWF4X3ZhbHVlOwotICAgIGlmIChlbnVtX3ZhbHVlcy5zaXplKCkgPT0gMCkgewotICAgICAgbWF4X3ZhbHVlID0gTlVMTDsKLSAgICB9IGVsc2UgewotICAgICAgaW50IG1heF92YWx1ZV92YWx1ZTsKLSAgICAgIG1heF92YWx1ZSA9IGVudW1fdmFsdWVzLmJhY2soKTsKLSAgICAgIG1heF92YWx1ZV92YWx1ZSA9IG1heF92YWx1ZS0+Z2V0X3ZhbHVlKCk7Ci0gICAgICBmb3IgKGNfaXRlciA9IGVudW1fdmFsdWVzLmJlZ2luKCk7IGNfaXRlciAhPSBlbnVtX3ZhbHVlcy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkgPiBtYXhfdmFsdWVfdmFsdWUpIHsKLSAgICAgICAgICBtYXhfdmFsdWUgPSAoKmNfaXRlcik7Ci0gICAgICAgICAgbWF4X3ZhbHVlX3ZhbHVlID0gbWF4X3ZhbHVlLT5nZXRfdmFsdWUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbWF4X3ZhbHVlOwotICB9Ci0KLSAgYm9vbCBpc19lbnVtKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0X2ZpbmdlcnByaW50X21hdGVyaWFsKCkgY29uc3QgeyByZXR1cm4gImVudW0iOyB9Ci0KLXByaXZhdGU6Ci0gIHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50c187Ci19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9lbnVtX3ZhbHVlLmggYi9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfZW51bV92YWx1ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTc5ZjA2Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9lbnVtX3ZhbHVlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVF9FTlVNX1ZBTFVFX0gKLSNkZWZpbmUgVF9FTlVNX1ZBTFVFX0gKLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlICJ0X2RvYy5oIgotCi0vKioKLSAqIEEgY29uc3RhbnQuIFRoZXNlIGFyZSB1c2VkIGluc2lkZSBvZiBlbnVtIGRlZmluaXRpb25zLiBDb25zdGFudHMgYXJlIGp1c3QKLSAqIHN5bWJvbCBpZGVudGlmaWVycyB0aGF0IG1heSBvciBtYXkgbm90IGhhdmUgYW4gZXhwbGljaXQgdmFsdWUgYXNzb2NpYXRlZAotICogd2l0aCB0aGVtLgotICoKLSAqLwotY2xhc3MgdF9lbnVtX3ZhbHVlIDogcHVibGljIHRfZG9jIHsKLXB1YmxpYzoKLSAgdF9lbnVtX3ZhbHVlKHN0ZDo6c3RyaW5nIG5hbWUsIGludCB2YWx1ZSkgOiBuYW1lXyhuYW1lKSwgdmFsdWVfKHZhbHVlKSB7fQotCi0gIH50X2VudW1fdmFsdWUoKSB7fQotCi0gIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG5hbWVfOyB9Ci0KLSAgaW50IGdldF92YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlXzsgfQotCi0gIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gYW5ub3RhdGlvbnNfOwotCi1wcml2YXRlOgotICBzdGQ6OnN0cmluZyBuYW1lXzsKLSAgaW50IHZhbHVlXzsKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2ZpZWxkLmggYi9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfZmllbGQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVjZTdiYi4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfZmllbGQuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVF9GSUVMRF9ICi0jZGVmaW5lIFRfRklFTERfSAotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0KLSNpbmNsdWRlICJ0X2RvYy5oIgotCi0vLyBGb3J3YXJkIGRlY2xhcmUgZm9yIHhzZF9hdHRycwotY2xhc3MgdF9zdHJ1Y3Q7Ci0KLS8qKgotICogQ2xhc3MgdG8gcmVwcmVzZW50IGEgZmllbGQgaW4gYSB0aHJpZnQgc3RydWN0dXJlLiBBIGZpZWxkIGhhcyBhIGRhdGEgdHlwZSwKLSAqIGEgc3ltYm9saWMgbmFtZSwgYW5kIGEgbnVtZXJpYyBpZGVudGlmaWVyLgotICoKLSAqLwotY2xhc3MgdF9maWVsZCA6IHB1YmxpYyB0X2RvYyB7Ci1wdWJsaWM6Ci0gIHRfZmllbGQodF90eXBlKiB0eXBlLCBzdGQ6OnN0cmluZyBuYW1lKQotICAgIDogdHlwZV8odHlwZSksCi0gICAgICBuYW1lXyhuYW1lKSwKLSAgICAgIGtleV8oMCksCi0gICAgICB2YWx1ZV8oTlVMTCksCi0gICAgICB4c2Rfb3B0aW9uYWxfKGZhbHNlKSwKLSAgICAgIHhzZF9uaWxsYWJsZV8oZmFsc2UpLAotICAgICAgeHNkX2F0dHJzXyhOVUxMKSwKLSAgICAgIHJlZmVyZW5jZV8oZmFsc2UpIHt9Ci0KLSAgdF9maWVsZCh0X3R5cGUqIHR5cGUsIHN0ZDo6c3RyaW5nIG5hbWUsIGludDMyX3Qga2V5KQotICAgIDogdHlwZV8odHlwZSksCi0gICAgICBuYW1lXyhuYW1lKSwKLSAgICAgIGtleV8oa2V5KSwKLSAgICAgIHJlcV8oVF9PUFRfSU5fUkVRX09VVCksCi0gICAgICB2YWx1ZV8oTlVMTCksCi0gICAgICB4c2Rfb3B0aW9uYWxfKGZhbHNlKSwKLSAgICAgIHhzZF9uaWxsYWJsZV8oZmFsc2UpLAotICAgICAgeHNkX2F0dHJzXyhOVUxMKSwKLSAgICAgIHJlZmVyZW5jZV8oZmFsc2UpIHt9Ci0KLSAgfnRfZmllbGQoKSB7fQotCi0gIHRfdHlwZSogZ2V0X3R5cGUoKSBjb25zdCB7IHJldHVybiB0eXBlXzsgfQotCi0gIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG5hbWVfOyB9Ci0KLSAgaW50MzJfdCBnZXRfa2V5KCkgY29uc3QgeyByZXR1cm4ga2V5XzsgfQotCi0gIGVudW0gZV9yZXEgeyBUX1JFUVVJUkVELCBUX09QVElPTkFMLCBUX09QVF9JTl9SRVFfT1VUIH07Ci0KLSAgdm9pZCBzZXRfcmVxKGVfcmVxIHJlcSkgeyByZXFfID0gcmVxOyB9Ci0KLSAgZV9yZXEgZ2V0X3JlcSgpIGNvbnN0IHsgcmV0dXJuIHJlcV87IH0KLQotICB2b2lkIHNldF92YWx1ZSh0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeyB2YWx1ZV8gPSB2YWx1ZTsgfQotCi0gIHRfY29uc3RfdmFsdWUqIGdldF92YWx1ZSgpIHsgcmV0dXJuIHZhbHVlXzsgfQotCi0gIHZvaWQgc2V0X3hzZF9vcHRpb25hbChib29sIHhzZF9vcHRpb25hbCkgeyB4c2Rfb3B0aW9uYWxfID0geHNkX29wdGlvbmFsOyB9Ci0KLSAgYm9vbCBnZXRfeHNkX29wdGlvbmFsKCkgY29uc3QgeyByZXR1cm4geHNkX29wdGlvbmFsXzsgfQotCi0gIHZvaWQgc2V0X3hzZF9uaWxsYWJsZShib29sIHhzZF9uaWxsYWJsZSkgeyB4c2RfbmlsbGFibGVfID0geHNkX25pbGxhYmxlOyB9Ci0KLSAgYm9vbCBnZXRfeHNkX25pbGxhYmxlKCkgY29uc3QgeyByZXR1cm4geHNkX25pbGxhYmxlXzsgfQotCi0gIHZvaWQgc2V0X3hzZF9hdHRycyh0X3N0cnVjdCogeHNkX2F0dHJzKSB7IHhzZF9hdHRyc18gPSB4c2RfYXR0cnM7IH0KLQotICB0X3N0cnVjdCogZ2V0X3hzZF9hdHRycygpIHsgcmV0dXJuIHhzZF9hdHRyc187IH0KLQotICAvKioKLSAgICogQ29tcGFyYXRvciB0byBzb3J0IGZpZWxkcyBpbiBhc2NlbmRpbmcgb3JkZXIgYnkga2V5LgotICAgKiBNYWtlIHRoaXMgYSBmdW5jdG9yIGluc3RlYWQgb2YgYSBmdW5jdGlvbiB0byBoZWxwIEdDQyBpbmxpbmUgaXQuCi0gICAqIFRoZSBhcmd1bWVudHMgYXJlIChjb25zdCkgcmVmZXJlbmNlcyB0byBjb25zdCBwb2ludGVycyB0byBjb25zdCB0X2ZpZWxkcy4KLSAgICovCi0gIHN0cnVjdCBrZXlfY29tcGFyZSB7Ci0gICAgYm9vbCBvcGVyYXRvcigpKHRfZmllbGQgY29uc3QqIGNvbnN0JiBhLCB0X2ZpZWxkIGNvbnN0KiBjb25zdCYgYikgewotICAgICAgcmV0dXJuIGEtPmdldF9rZXkoKSA8IGItPmdldF9rZXkoKTsKLSAgICB9Ci0gIH07Ci0KLSAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBhbm5vdGF0aW9uc187Ci0KLSAgYm9vbCBnZXRfcmVmZXJlbmNlKCkgeyByZXR1cm4gcmVmZXJlbmNlXzsgfQotCi0gIHZvaWQgc2V0X3JlZmVyZW5jZShib29sIHJlZmVyZW5jZSkgeyByZWZlcmVuY2VfID0gcmVmZXJlbmNlOyB9Ci0KLXByaXZhdGU6Ci0gIHRfdHlwZSogdHlwZV87Ci0gIHN0ZDo6c3RyaW5nIG5hbWVfOwotICBpbnQzMl90IGtleV87Ci0gIGVfcmVxIHJlcV87Ci0gIHRfY29uc3RfdmFsdWUqIHZhbHVlXzsKLQotICBib29sIHhzZF9vcHRpb25hbF87Ci0gIGJvb2wgeHNkX25pbGxhYmxlXzsKLSAgdF9zdHJ1Y3QqIHhzZF9hdHRyc187Ci0gIGJvb2wgcmVmZXJlbmNlXzsKLX07Ci0KLS8qKgotICogQSBzaW1wbGUgc3RydWN0IGZvciB0aGUgcGFyc2VyIHRvIHVzZSB0byBzdG9yZSBhIGZpZWxkIElELCBhbmQgd2hldGhlciBvcgotICogbm90IGl0IHdhcyBzcGVjaWZpZWQgYnkgdGhlIHVzZXIgb3IgYXV0b21hdGljYWxseSBjaG9zZW4uCi0gKi8KLXN0cnVjdCB0X2ZpZWxkX2lkIHsKLSAgaW50MzJfdCB2YWx1ZTsKLSAgYm9vbCBhdXRvX2Fzc2lnbmVkOwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfZnVuY3Rpb24uaCBiL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9mdW5jdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Njg4NmYzLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9mdW5jdGlvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfRlVOQ1RJT05fSAotI2RlZmluZSBUX0ZVTkNUSU9OX0gKLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlICJ0X3R5cGUuaCIKLSNpbmNsdWRlICJ0X3N0cnVjdC5oIgotI2luY2x1ZGUgInRfZG9jLmgiCi0KLS8qKgotICogUmVwcmVzZW50YXRpb24gb2YgYSBmdW5jdGlvbi4gS2V5IHBhcnRzIGFyZSByZXR1cm4gdHlwZSwgZnVuY3Rpb24gbmFtZSwKLSAqIG9wdGlvbmFsIG1vZGlmaWVycywgYW5kIGFuIGFyZ3VtZW50IGxpc3QsIHdoaWNoIGlzIGltcGxlbWVudGVkIGFzIGEgdGhyaWZ0Ci0gKiBzdHJ1Y3QuCi0gKgotICovCi1jbGFzcyB0X2Z1bmN0aW9uIDogcHVibGljIHRfZG9jIHsKLXB1YmxpYzoKLSAgdF9mdW5jdGlvbih0X3R5cGUqIHJldHVybnR5cGUsIHN0ZDo6c3RyaW5nIG5hbWUsIHRfc3RydWN0KiBhcmdsaXN0LCBib29sIG9uZXdheSA9IGZhbHNlKQotICAgIDogcmV0dXJudHlwZV8ocmV0dXJudHlwZSksIG5hbWVfKG5hbWUpLCBhcmdsaXN0XyhhcmdsaXN0KSwgb25ld2F5XyhvbmV3YXkpIHsKLSAgICB4Y2VwdGlvbnNfID0gbmV3IHRfc3RydWN0KE5VTEwpOwotICAgIGlmIChvbmV3YXlfICYmICghcmV0dXJudHlwZV8tPmlzX3ZvaWQoKSkpIHsKLSAgICAgIHB3YXJuaW5nKDEsICJPbmV3YXkgbWV0aG9kcyBzaG91bGQgcmV0dXJuIHZvaWQuXG4iKTsKLSAgICB9Ci0gIH0KLQotICB0X2Z1bmN0aW9uKHRfdHlwZSogcmV0dXJudHlwZSwKLSAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAotICAgICAgICAgICAgIHRfc3RydWN0KiBhcmdsaXN0LAotICAgICAgICAgICAgIHRfc3RydWN0KiB4Y2VwdGlvbnMsCi0gICAgICAgICAgICAgYm9vbCBvbmV3YXkgPSBmYWxzZSkKLSAgICA6IHJldHVybnR5cGVfKHJldHVybnR5cGUpLAotICAgICAgbmFtZV8obmFtZSksCi0gICAgICBhcmdsaXN0XyhhcmdsaXN0KSwKLSAgICAgIHhjZXB0aW9uc18oeGNlcHRpb25zKSwKLSAgICAgIG9uZXdheV8ob25ld2F5KSB7Ci0gICAgaWYgKG9uZXdheV8gJiYgIXhjZXB0aW9uc18tPmdldF9tZW1iZXJzKCkuZW1wdHkoKSkgewotICAgICAgdGhyb3cgc3RkOjpzdHJpbmcoIk9uZXdheSBtZXRob2RzIGNhbid0IHRocm93IGV4Y2VwdGlvbnMuIik7Ci0gICAgfQotICAgIGlmIChvbmV3YXlfICYmICghcmV0dXJudHlwZV8tPmlzX3ZvaWQoKSkpIHsKLSAgICAgIHB3YXJuaW5nKDEsICJPbmV3YXkgbWV0aG9kcyBzaG91bGQgcmV0dXJuIHZvaWQuXG4iKTsKLSAgICB9Ci0gIH0KLQotICB+dF9mdW5jdGlvbigpIHt9Ci0KLSAgdF90eXBlKiBnZXRfcmV0dXJudHlwZSgpIGNvbnN0IHsgcmV0dXJuIHJldHVybnR5cGVfOyB9Ci0KLSAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9uYW1lKCkgY29uc3QgeyByZXR1cm4gbmFtZV87IH0KLQotICB0X3N0cnVjdCogZ2V0X2FyZ2xpc3QoKSBjb25zdCB7IHJldHVybiBhcmdsaXN0XzsgfQotCi0gIHRfc3RydWN0KiBnZXRfeGNlcHRpb25zKCkgY29uc3QgeyByZXR1cm4geGNlcHRpb25zXzsgfQotCi0gIGJvb2wgaXNfb25ld2F5KCkgY29uc3QgeyByZXR1cm4gb25ld2F5XzsgfQotCi0gIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gYW5ub3RhdGlvbnNfOwotCi1wcml2YXRlOgotICB0X3R5cGUqIHJldHVybnR5cGVfOwotICBzdGQ6OnN0cmluZyBuYW1lXzsKLSAgdF9zdHJ1Y3QqIGFyZ2xpc3RfOwotICB0X3N0cnVjdCogeGNlcHRpb25zXzsKLSAgYm9vbCBvbmV3YXlfOwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfbGlzdC5oIGIvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2xpc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMwZDk4MS4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfbGlzdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfTElTVF9ICi0jZGVmaW5lIFRfTElTVF9ICi0KLSNpbmNsdWRlICJ0X2NvbnRhaW5lci5oIgotCi0vKioKLSAqIEEgbGlzdCBpcyBhIGxpZ2h0d2VpZ2h0IGNvbnRhaW5lciB0eXBlIHRoYXQganVzdCB3cmFwcyBhbm90aGVyIGRhdGEgdHlwZS4KLSAqCi0gKi8KLWNsYXNzIHRfbGlzdCA6IHB1YmxpYyB0X2NvbnRhaW5lciB7Ci1wdWJsaWM6Ci0gIHRfbGlzdCh0X3R5cGUqIGVsZW1fdHlwZSkgOiBlbGVtX3R5cGVfKGVsZW1fdHlwZSkge30KLQotICB0X3R5cGUqIGdldF9lbGVtX3R5cGUoKSBjb25zdCB7IHJldHVybiBlbGVtX3R5cGVfOyB9Ci0KLSAgYm9vbCBpc19saXN0KCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotCi1wcml2YXRlOgotICB0X3R5cGUqIGVsZW1fdHlwZV87Ci19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9tYXAuaCBiL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9tYXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY5YWVhYi4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfbWFwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVF9NQVBfSAotI2RlZmluZSBUX01BUF9ICi0KLSNpbmNsdWRlICJ0X2NvbnRhaW5lci5oIgotCi0vKioKLSAqIEEgbWFwIGlzIGEgbGlnaHR3ZWlnaHQgY29udGFpbmVyIHR5cGUgdGhhdCBqdXN0IHdyYXBzIGFub3RoZXIgdHdvIGRhdGEKLSAqIHR5cGVzLgotICoKLSAqLwotY2xhc3MgdF9tYXAgOiBwdWJsaWMgdF9jb250YWluZXIgewotcHVibGljOgotICB0X21hcCh0X3R5cGUqIGtleV90eXBlLCB0X3R5cGUqIHZhbF90eXBlKSA6IGtleV90eXBlXyhrZXlfdHlwZSksIHZhbF90eXBlXyh2YWxfdHlwZSkge30KLQotICB0X3R5cGUqIGdldF9rZXlfdHlwZSgpIGNvbnN0IHsgcmV0dXJuIGtleV90eXBlXzsgfQotCi0gIHRfdHlwZSogZ2V0X3ZhbF90eXBlKCkgY29uc3QgeyByZXR1cm4gdmFsX3R5cGVfOyB9Ci0KLSAgYm9vbCBpc19tYXAoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0KLXByaXZhdGU6Ci0gIHRfdHlwZSoga2V5X3R5cGVfOwotICB0X3R5cGUqIHZhbF90eXBlXzsKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3Byb2dyYW0uaCBiL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9wcm9ncmFtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NmVlNmMuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3Byb2dyYW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDM4MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVF9QUk9HUkFNX0gKLSNkZWZpbmUgVF9QUk9HUkFNX0gKLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0vLyBGb3IgcHJvZ3JhbV9uYW1lKCkKLSNpbmNsdWRlICJtYWluLmgiCi0KLSNpbmNsdWRlICJ0X2RvYy5oIgotI2luY2x1ZGUgInRfc2NvcGUuaCIKLSNpbmNsdWRlICJ0X2Jhc2VfdHlwZS5oIgotI2luY2x1ZGUgInRfdHlwZWRlZi5oIgotI2luY2x1ZGUgInRfZW51bS5oIgotI2luY2x1ZGUgInRfY29uc3QuaCIKLSNpbmNsdWRlICJ0X3N0cnVjdC5oIgotI2luY2x1ZGUgInRfc2VydmljZS5oIgotI2luY2x1ZGUgInRfbGlzdC5oIgotI2luY2x1ZGUgInRfbWFwLmgiCi0jaW5jbHVkZSAidF9zZXQuaCIKLSNpbmNsdWRlICJnZW5lcmF0ZS90X2dlbmVyYXRvcl9yZWdpc3RyeS5oIgotLy8jaW5jbHVkZSAidF9kb2MuaCIKLQotLyoqCi0gKiBUb3AgbGV2ZWwgY2xhc3MgcmVwcmVzZW50aW5nIGFuIGVudGlyZSB0aHJpZnQgcHJvZ3JhbS4gQSBwcm9ncmFtIGNvbnNpc3RzCi0gKiBmdW5kYW1lbnRhbGx5IG9mIHRoZSBmb2xsb3dpbmc6Ci0gKgotICogICBUeXBlZGVmcwotICogICBFbnVtZXJhdGlvbnMKLSAqICAgQ29uc3RhbnRzCi0gKiAgIFN0cnVjdHMKLSAqICAgRXhjZXB0aW9ucwotICogICBTZXJ2aWNlcwotICoKLSAqIFRoZSBwcm9ncmFtIG1vZHVsZSBhbHNvIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9ucyBvZiB0aGUgYmFzZSB0eXBlcy4KLSAqCi0gKi8KLWNsYXNzIHRfcHJvZ3JhbSA6IHB1YmxpYyB0X2RvYyB7Ci1wdWJsaWM6Ci0gIHRfcHJvZ3JhbShzdGQ6OnN0cmluZyBwYXRoLCBzdGQ6OnN0cmluZyBuYW1lKQotICAgIDogcGF0aF8ocGF0aCksIG5hbWVfKG5hbWUpLCBvdXRfcGF0aF8oIi4vIiksIG91dF9wYXRoX2lzX2Fic29sdXRlXyhmYWxzZSkgewotICAgIHNjb3BlXyA9IG5ldyB0X3Njb3BlKCk7Ci0gIH0KLQotICB0X3Byb2dyYW0oc3RkOjpzdHJpbmcgcGF0aCkgOiBwYXRoXyhwYXRoKSwgb3V0X3BhdGhfKCIuLyIpLCBvdXRfcGF0aF9pc19hYnNvbHV0ZV8oZmFsc2UpIHsKLSAgICBuYW1lXyA9IHByb2dyYW1fbmFtZShwYXRoKTsKLSAgICBzY29wZV8gPSBuZXcgdF9zY29wZSgpOwotICB9Ci0KLSAgfnRfcHJvZ3JhbSgpIHsKLSAgICBpZiAoc2NvcGVfKSB7Ci0gICAgICBkZWxldGUgc2NvcGVfOwotICAgICAgc2NvcGVfID0gTlVMTDsKLSAgICB9Ci0gIH0KLQotICAvLyBQYXRoIGFjY2Vzc29yCi0gIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRfcGF0aCgpIGNvbnN0IHsgcmV0dXJuIHBhdGhfOyB9Ci0KLSAgLy8gT3V0cHV0IHBhdGggYWNjZXNzb3IKLSAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9vdXRfcGF0aCgpIGNvbnN0IHsgcmV0dXJuIG91dF9wYXRoXzsgfQotCi0gIC8vIENyZWF0ZSBnZW4tKiBkaXIgYWNjZXNzb3IKLSAgYm9vbCBpc19vdXRfcGF0aF9hYnNvbHV0ZSgpIGNvbnN0IHsgcmV0dXJuIG91dF9wYXRoX2lzX2Fic29sdXRlXzsgfQotCi0gIC8vIE5hbWUgYWNjZXNzb3IKLSAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9uYW1lKCkgY29uc3QgeyByZXR1cm4gbmFtZV87IH0KLQotICAvLyBOYW1lc3BhY2UKLSAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9uYW1lc3BhY2UoKSBjb25zdCB7IHJldHVybiBuYW1lc3BhY2VfOyB9Ci0KLSAgLy8gSW5jbHVkZSBwcmVmaXggYWNjZXNzb3IKLSAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9pbmNsdWRlX3ByZWZpeCgpIGNvbnN0IHsgcmV0dXJuIGluY2x1ZGVfcHJlZml4XzsgfQotCi0gIC8vIEFjY2Vzc29ycyBmb3IgcHJvZ3JhbSBlbGVtZW50cwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X3R5cGVkZWYqPiYgZ2V0X3R5cGVkZWZzKCkgY29uc3QgeyByZXR1cm4gdHlwZWRlZnNfOyB9Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZW51bSo+JiBnZXRfZW51bXMoKSBjb25zdCB7IHJldHVybiBlbnVtc187IH0KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9jb25zdCo+JiBnZXRfY29uc3RzKCkgY29uc3QgeyByZXR1cm4gY29uc3RzXzsgfQotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X3N0cnVjdCo+JiBnZXRfc3RydWN0cygpIGNvbnN0IHsgcmV0dXJuIHN0cnVjdHNfOyB9Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfc3RydWN0Kj4mIGdldF94Y2VwdGlvbnMoKSBjb25zdCB7IHJldHVybiB4Y2VwdGlvbnNfOyB9Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfc3RydWN0Kj4mIGdldF9vYmplY3RzKCkgY29uc3QgeyByZXR1cm4gb2JqZWN0c187IH0KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9zZXJ2aWNlKj4mIGdldF9zZXJ2aWNlcygpIGNvbnN0IHsgcmV0dXJuIHNlcnZpY2VzXzsgfQotICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBnZXRfbmFtZXNwYWNlcygpIGNvbnN0IHsgcmV0dXJuIG5hbWVzcGFjZXNfOyB9Ci0KLSAgLy8gUHJvZ3JhbSBlbGVtZW50cwotICB2b2lkIGFkZF90eXBlZGVmKHRfdHlwZWRlZiogdGQpIHsgdHlwZWRlZnNfLnB1c2hfYmFjayh0ZCk7IH0KLSAgdm9pZCBhZGRfZW51bSh0X2VudW0qIHRlKSB7IGVudW1zXy5wdXNoX2JhY2sodGUpOyB9Ci0gIHZvaWQgYWRkX2NvbnN0KHRfY29uc3QqIHRjKSB7IGNvbnN0c18ucHVzaF9iYWNrKHRjKTsgfQotICB2b2lkIGFkZF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzKSB7Ci0gICAgb2JqZWN0c18ucHVzaF9iYWNrKHRzKTsKLSAgICBzdHJ1Y3RzXy5wdXNoX2JhY2sodHMpOwotICB9Ci0gIHZvaWQgYWRkX3hjZXB0aW9uKHRfc3RydWN0KiB0eCkgewotICAgIG9iamVjdHNfLnB1c2hfYmFjayh0eCk7Ci0gICAgeGNlcHRpb25zXy5wdXNoX2JhY2sodHgpOwotICB9Ci0gIHZvaWQgYWRkX3NlcnZpY2UodF9zZXJ2aWNlKiB0cykgeyBzZXJ2aWNlc18ucHVzaF9iYWNrKHRzKTsgfQotCi0gIC8vIFByb2dyYW1zIHRvIGluY2x1ZGUKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9wcm9ncmFtKj4mIGdldF9pbmNsdWRlcygpIGNvbnN0IHsgcmV0dXJuIGluY2x1ZGVzXzsgfQotCi0gIHZvaWQgc2V0X291dF9wYXRoKHN0ZDo6c3RyaW5nIG91dF9wYXRoLCBib29sIG91dF9wYXRoX2lzX2Fic29sdXRlKSB7Ci0gICAgb3V0X3BhdGhfID0gb3V0X3BhdGg7Ci0gICAgb3V0X3BhdGhfaXNfYWJzb2x1dGVfID0gb3V0X3BhdGhfaXNfYWJzb2x1dGU7Ci0gICAgLy8gRW5zdXJlIHRoYXQgaXQgZW5kcyB3aXRoIGEgdHJhaWxpbmcgJy8nIChvciAnXCcgZm9yIHdpbmRvd3MgbWFjaGluZXMpCi0gICAgY2hhciBjID0gb3V0X3BhdGhfLmF0KG91dF9wYXRoXy5zaXplKCkgLSAxKTsKLSAgICBpZiAoIShjID09ICcvJyB8fCBjID09ICdcXCcpKSB7Ci0gICAgICBvdXRfcGF0aF8ucHVzaF9iYWNrKCcvJyk7Ci0gICAgfQotICB9Ci0KLSAgLy8gVHlwZW5hbWUgY29sbGlzaW9uIGRldGVjdGlvbgotICAvKioKLSAgICogU2VhcmNoIGZvciB0eXBlbmFtZSBjb2xsaXNpb25zCi0gICAqIEBwYXJhbSB0ICAgIHRoZSB0eXBlIHRvIHRlc3QgZm9yIGNvbGxpc2lvbnMKLSAgICogQHJldHVybiAgICAgdHJ1ZSBpZiBhIGNlcnRhaW4gY29sbGlzaW9uIHdhcyBmb3VuZCwgb3RoZXJ3aXNlIGZhbHNlCi0gICAqLwotICBib29sIGlzX3VuaXF1ZV90eXBlbmFtZSh0X3R5cGUqIHQpIHsKLSAgICBpbnQgb2NjdXJyZW5jZXMgPSBwcm9ncmFtX3R5cGVuYW1lX2NvdW50KHRoaXMsIHQpOwotICAgIGZvciAoc3RkOjp2ZWN0b3I8dF9wcm9ncmFtKj46Oml0ZXJhdG9yIGl0ID0gaW5jbHVkZXNfLmJlZ2luKCk7IGl0ICE9IGluY2x1ZGVzXy5lbmQoKTsgKytpdCkgewotICAgICAgb2NjdXJyZW5jZXMgKz0gcHJvZ3JhbV90eXBlbmFtZV9jb3VudCgqaXQsIHQpOwotICAgIH0KLSAgICByZXR1cm4gMCA9PSBvY2N1cnJlbmNlczsKLSAgfQotCi0gIC8qKgotICAgKiBTZWFyY2ggYWxsIHR5cGUgY29sbGVjdGlvbnMgZm9yIGR1cGxpY2F0ZSB0eXBlbmFtZXMKLSAgICogQHBhcmFtIHByb2cgdGhlIHByb2dyYW0gdG8gc2VhcmNoCi0gICAqIEBwYXJhbSB0ICAgIHRoZSB0eXBlIHRvIHRlc3QgZm9yIGNvbGxpc2lvbnMKLSAgICogQHJldHVybiAgICAgdGhlIG51bWJlciBvZiBjZXJ0YWluIHR5cGVuYW1lIGNvbGxpc2lvbnMKLSAgICovCi0gIGludCBwcm9ncmFtX3R5cGVuYW1lX2NvdW50KHRfcHJvZ3JhbSogcHJvZywgdF90eXBlKiB0KSB7Ci0gICAgaW50IG9jY3VycmVuY2VzID0gMDsKLSAgICBvY2N1cnJlbmNlcyArPSBjb2xsZWN0aW9uX3R5cGVuYW1lX2NvdW50KHByb2csIHByb2ctPnR5cGVkZWZzXywgdCk7Ci0gICAgb2NjdXJyZW5jZXMgKz0gY29sbGVjdGlvbl90eXBlbmFtZV9jb3VudChwcm9nLCBwcm9nLT5lbnVtc18sIHQpOwotICAgIG9jY3VycmVuY2VzICs9IGNvbGxlY3Rpb25fdHlwZW5hbWVfY291bnQocHJvZywgcHJvZy0+b2JqZWN0c18sIHQpOwotICAgIG9jY3VycmVuY2VzICs9IGNvbGxlY3Rpb25fdHlwZW5hbWVfY291bnQocHJvZywgcHJvZy0+c2VydmljZXNfLCB0KTsKLSAgICByZXR1cm4gb2NjdXJyZW5jZXM7Ci0gIH0KLQotICAvKioKLSAgICogU2VhcmNoIGEgdHlwZSBjb2xsZWN0aW9uIGZvciBkdXBsaWNhdGUgdHlwZW5hbWVzCi0gICAqIEBwYXJhbSBwcm9nICAgICAgICAgICAgdGhlIHByb2dyYW0gdG8gc2VhcmNoCi0gICAqIEBwYXJhbSB0eXBlX2NvbGxlY3Rpb24gdGhlIHR5cGUgY29sbGVjdGlvbiB0byBzZWFyY2gKLSAgICogQHBhcmFtIHQgICAgICAgICAgICAgICB0aGUgdHlwZSB0byB0ZXN0IGZvciBjb2xsaXNpb25zCi0gICAqIEByZXR1cm4gICAgICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjZXJ0YWluIHR5cGVuYW1lIGNvbGxpc2lvbnMKLSAgICovCi0gIHRlbXBsYXRlIDxjbGFzcyBUPgotICBpbnQgY29sbGVjdGlvbl90eXBlbmFtZV9jb3VudCh0X3Byb2dyYW0qIHByb2csIFQgdHlwZV9jb2xsZWN0aW9uLCB0X3R5cGUqIHQpIHsKLSAgICBpbnQgb2NjdXJyZW5jZXMgPSAwOwotICAgIGZvciAodHlwZW5hbWUgVDo6aXRlcmF0b3IgaXQgPSB0eXBlX2NvbGxlY3Rpb24uYmVnaW4oKTsgaXQgIT0gdHlwZV9jb2xsZWN0aW9uLmVuZCgpOyArK2l0KQotICAgICAgaWYgKHQgIT0gKml0ICYmIDAgPT0gdC0+Z2V0X25hbWUoKS5jb21wYXJlKCgqaXQpLT5nZXRfbmFtZSgpKSAmJiBpc19jb21tb25fbmFtZXNwYWNlKHByb2csIHQpKQotICAgICAgICArK29jY3VycmVuY2VzOwotICAgIHJldHVybiBvY2N1cnJlbmNlczsKLSAgfQotCi0gIC8qKgotICAgKiBEZXRlcm1pbmUgd2hldGhlciBpZGVudGljYWwgdHlwZW5hbWVzIHdpbGwgY29sbGlkZSBiYXNlZCBvbiBuYW1lc3BhY2VzLgotICAgKgotICAgKiBCZWNhdXNlIHdlIGRvIG5vdCBrbm93IHdoaWNoIGxhbmd1YWdlcyB0aGUgdXNlciB3aWxsIGdlbmVyYXRlIGNvZGUgZm9yLAotICAgKiBjb2xsaXNpb25zIHdpdGhpbiBwcm9ncmFtcyAoSURMIGZpbGVzKSBoYXZpbmcgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucyBjYW4gYmUKLSAgICogZGlmZmljdWx0IHRvIGRldGVybWluZS4gT25seSBndWFyYW50ZWVkIGNvbGxpc2lvbnMgcmV0dXJuIHRydWUgKGNhdXNlIGFuIGVycm9yKS4KLSAgICogUG9zc2libGUgY29sbGlzaW9ucyBpbnZvbHZpbmcgZXhwbGljaXQgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucyBwcm9kdWNlIGEgd2FybmluZy4KLSAgICogT3RoZXIgcG9zc2libGUgY29sbGlzaW9ucyBnbyB1bnJlcG9ydGVkLgotICAgKiBAcGFyYW0gcHJvZyB0aGUgcHJvZ3JhbSBjb250YWluaW5nIHRoZSBwcmVleGlzdGluZyB0eXBlbmFtZQotICAgKiBAcGFyYW0gdCAgICB0aGUgdHlwZSBjb250YWluaW5nIHRoZSB0eXBlbmFtZSBtYXRjaAotICAgKiBAcmV0dXJuICAgICB0cnVlIGlmIGEgY29sbGlzaW9uIHdpdGhpbiBuYW1lc3BhY2VzIGlzIGZvdW5kLCBvdGhlcndpc2UgZmFsc2UKLSAgICovCi0gIGJvb2wgaXNfY29tbW9uX25hbWVzcGFjZSh0X3Byb2dyYW0qIHByb2csIHRfdHlwZSogdCkgewotICAgIC8vIENhc2UgMTogVHlwZW5hbWVzIGFyZSBpbiB0aGUgc2FtZSBwcm9ncmFtIFtjb2xsaXNpb25dCi0gICAgaWYgKHByb2cgPT0gdC0+Z2V0X3Byb2dyYW0oKSkgewotICAgICAgcHdhcm5pbmcoMSwKLSAgICAgICAgICAgICAgICJEdXBsaWNhdGUgdHlwZW5hbWUgJXMgZm91bmQgaW4gJXMiLAotICAgICAgICAgICAgICAgdC0+Z2V0X25hbWUoKS5jX3N0cigpLAotICAgICAgICAgICAgICAgdC0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8vIENhc2UgMjogQm90aCBwcm9ncmFtcyBoYXZlIGlkZW50aWNhbCBuYW1lc3BhY2Ugc2NvcGUvbmFtZSBkZWNsYXJhdGlvbnMgW2NvbGxpc2lvbl0KLSAgICBib29sIG1hdGNoID0gdHJ1ZTsKLSAgICBmb3IgKHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIGl0ID0gcHJvZy0+bmFtZXNwYWNlc18uYmVnaW4oKTsKLSAgICAgICAgIGl0ICE9IHByb2ctPm5hbWVzcGFjZXNfLmVuZCgpOwotICAgICAgICAgKytpdCkgewotICAgICAgaWYgKDAgPT0gaXQtPnNlY29uZC5jb21wYXJlKHQtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lc3BhY2UoaXQtPmZpcnN0KSkpIHsKLSAgICAgICAgcHdhcm5pbmcoMSwKLSAgICAgICAgICAgICAgICAgIkR1cGxpY2F0ZSB0eXBlbmFtZSAlcyBmb3VuZCBpbiAlcywlcywlcyBhbmQgJXMsJXMsJXMgW2ZpbGUsc2NvcGUsbnNdIiwKLSAgICAgICAgICAgICAgICAgdC0+Z2V0X25hbWUoKS5jX3N0cigpLAotICAgICAgICAgICAgICAgICB0LT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgIGl0LT5maXJzdC5jX3N0cigpLAotICAgICAgICAgICAgICAgICBpdC0+c2Vjb25kLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgIHByb2ctPmdldF9uYW1lKCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgaXQtPmZpcnN0LmNfc3RyKCksCi0gICAgICAgICAgICAgICAgIGl0LT5zZWNvbmQuY19zdHIoKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBtYXRjaCA9IGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgICBmb3IgKHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIGl0ID0gdC0+Z2V0X3Byb2dyYW0oKS0+bmFtZXNwYWNlc18uYmVnaW4oKTsKLSAgICAgICAgIGl0ICE9IHQtPmdldF9wcm9ncmFtKCktPm5hbWVzcGFjZXNfLmVuZCgpOwotICAgICAgICAgKytpdCkgewotICAgICAgaWYgKDAgPT0gaXQtPnNlY29uZC5jb21wYXJlKHByb2ctPmdldF9uYW1lc3BhY2UoaXQtPmZpcnN0KSkpIHsKLSAgICAgICAgcHdhcm5pbmcoMSwKLSAgICAgICAgICAgICAgICAgIkR1cGxpY2F0ZSB0eXBlbmFtZSAlcyBmb3VuZCBpbiAlcywlcywlcyBhbmQgJXMsJXMsJXMgW2ZpbGUsc2NvcGUsbnNdIiwKLSAgICAgICAgICAgICAgICAgdC0+Z2V0X25hbWUoKS5jX3N0cigpLAotICAgICAgICAgICAgICAgICB0LT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgIGl0LT5maXJzdC5jX3N0cigpLAotICAgICAgICAgICAgICAgICBpdC0+c2Vjb25kLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgIHByb2ctPmdldF9uYW1lKCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgaXQtPmZpcnN0LmNfc3RyKCksCi0gICAgICAgICAgICAgICAgIGl0LT5zZWNvbmQuY19zdHIoKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBtYXRjaCA9IGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoMCA9PSBwcm9nLT5uYW1lc3BhY2VzXy5zaXplKCkgJiYgMCA9PSB0LT5nZXRfcHJvZ3JhbSgpLT5uYW1lc3BhY2VzXy5zaXplKCkpIHsKLSAgICAgIHB3YXJuaW5nKDEsCi0gICAgICAgICAgICAgICAiRHVwbGljYXRlIHR5cGVuYW1lICVzIGZvdW5kIGluICVzIGFuZCAlcyIsCi0gICAgICAgICAgICAgICB0LT5nZXRfbmFtZSgpLmNfc3RyKCksCi0gICAgICAgICAgICAgICB0LT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpLmNfc3RyKCksCi0gICAgICAgICAgICAgICBwcm9nLT5nZXRfbmFtZSgpLmNfc3RyKCkpOwotICAgIH0KLSAgICByZXR1cm4gbWF0Y2g7Ci0gIH0KLQotICAvLyBTY29waW5nIGFuZCBuYW1lc3BhY2luZwotICB2b2lkIHNldF9uYW1lc3BhY2Uoc3RkOjpzdHJpbmcgbmFtZSkgeyBuYW1lc3BhY2VfID0gbmFtZTsgfQotCi0gIC8vIFNjb3BlIGFjY2Vzc29yCi0gIHRfc2NvcGUqIHNjb3BlKCkgY29uc3QgeyByZXR1cm4gc2NvcGVfOyB9Ci0KLSAgLy8gSW5jbHVkZXMKLQotICB2b2lkIGFkZF9pbmNsdWRlKHN0ZDo6c3RyaW5nIHBhdGgsIHN0ZDo6c3RyaW5nIGluY2x1ZGVfc2l0ZSkgewotICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IG5ldyB0X3Byb2dyYW0ocGF0aCk7Ci0KLSAgICAvLyBpbmNsdWRlIHByZWZpeCBmb3IgdGhpcyBwcm9ncmFtIGlzIHRoZSBzaXRlIGF0IHdoaWNoIGl0IHdhcyBpbmNsdWRlZAotICAgIC8vIChtaW51cyB0aGUgZmlsZW5hbWUpCi0gICAgc3RkOjpzdHJpbmcgaW5jbHVkZV9wcmVmaXg7Ci0gICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBsYXN0X3NsYXNoID0gc3RkOjpzdHJpbmc6Om5wb3M7Ci0gICAgaWYgKChsYXN0X3NsYXNoID0gaW5jbHVkZV9zaXRlLnJmaW5kKCIvIikpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7Ci0gICAgICBpbmNsdWRlX3ByZWZpeCA9IGluY2x1ZGVfc2l0ZS5zdWJzdHIoMCwgbGFzdF9zbGFzaCk7Ci0gICAgfQotCi0gICAgcHJvZ3JhbS0+c2V0X2luY2x1ZGVfcHJlZml4KGluY2x1ZGVfcHJlZml4KTsKLSAgICBpbmNsdWRlc18ucHVzaF9iYWNrKHByb2dyYW0pOwotICB9Ci0KLSAgc3RkOjp2ZWN0b3I8dF9wcm9ncmFtKj4mIGdldF9pbmNsdWRlcygpIHsgcmV0dXJuIGluY2x1ZGVzXzsgfQotCi0gIHZvaWQgc2V0X2luY2x1ZGVfcHJlZml4KHN0ZDo6c3RyaW5nIGluY2x1ZGVfcHJlZml4KSB7Ci0gICAgaW5jbHVkZV9wcmVmaXhfID0gaW5jbHVkZV9wcmVmaXg7Ci0KLSAgICAvLyB0aGlzIGlzIGludGVuZGVkIHRvIGJlIGEgZGlyZWN0b3J5OyBhZGQgYSB0cmFpbGluZyBzbGFzaCBpZiBuZWNlc3NhcnkKLSAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGxlbiA9IGluY2x1ZGVfcHJlZml4Xy5zaXplKCk7Ci0gICAgaWYgKGxlbiA+IDAgJiYgaW5jbHVkZV9wcmVmaXhfW2xlbiAtIDFdICE9ICcvJykgewotICAgICAgaW5jbHVkZV9wcmVmaXhfICs9ICcvJzsKLSAgICB9Ci0gIH0KLQotICAvLyBMYW5ndWFnZSBuZXV0cmFsIG5hbWVzcGFjZSAvIHBhY2thZ2luZwotICB2b2lkIHNldF9uYW1lc3BhY2Uoc3RkOjpzdHJpbmcgbGFuZ3VhZ2UsIHN0ZDo6c3RyaW5nIG5hbWVfc3BhY2UpIHsKLSAgICBpZiAobGFuZ3VhZ2UgIT0gIioiKSB7Ci0gICAgICBzaXplX3Qgc3ViX2luZGV4ID0gbGFuZ3VhZ2UuZmluZCgnLicpOwotICAgICAgc3RkOjpzdHJpbmcgYmFzZV9sYW5ndWFnZSA9IGxhbmd1YWdlLnN1YnN0cigwLCBzdWJfaW5kZXgpOwotICAgICAgc3RkOjpzdHJpbmcgc3ViX25hbWVzcGFjZTsKLQotICAgICAgaWYgKGJhc2VfbGFuZ3VhZ2UgPT0gInNtYWxsdGFsayIpIHsKLSAgICAgICAgcHdhcm5pbmcoMSwgIk5hbWVzcGFjZSAnc21hbGx0YWxrJyBpcyBkZXByZWNhdGVkLiBVc2UgJ3N0JyBpbnN0ZWFkIik7Ci0gICAgICAgIGJhc2VfbGFuZ3VhZ2UgPSAic3QiOwotICAgICAgfQotCi0gICAgICB0X2dlbmVyYXRvcl9yZWdpc3RyeTo6Z2VuX21hcF90IG15X2NvcHkgPSB0X2dlbmVyYXRvcl9yZWdpc3RyeTo6Z2V0X2dlbmVyYXRvcl9tYXAoKTsKLQotICAgICAgdF9nZW5lcmF0b3JfcmVnaXN0cnk6Omdlbl9tYXBfdDo6aXRlcmF0b3IgaXQ7Ci0gICAgICBpdCA9IG15X2NvcHkuZmluZChiYXNlX2xhbmd1YWdlKTsKLQotICAgICAgaWYgKGl0ID09IG15X2NvcHkuZW5kKCkpIHsKLSAgICAgICAgc3RkOjpzdHJpbmcgd2FybmluZyA9ICJObyBnZW5lcmF0b3IgbmFtZWQgJyIgKyBiYXNlX2xhbmd1YWdlICsgIicgY291bGQgYmUgZm91bmQhIjsKLSAgICAgICAgcHdhcm5pbmcoMSwgd2FybmluZy5jX3N0cigpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChzdWJfaW5kZXggIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKLSAgICAgICAgICBzdGQ6OnN0cmluZyBzdWJfbmFtZXNwYWNlID0gbGFuZ3VhZ2Uuc3Vic3RyKHN1Yl9pbmRleCArIDEpOwotICAgICAgICAgIGlmICghaXQtPnNlY29uZC0+aXNfdmFsaWRfbmFtZXNwYWNlKHN1Yl9uYW1lc3BhY2UpKSB7Ci0gICAgICAgICAgICBzdGQ6OnN0cmluZyB3YXJuaW5nID0gYmFzZV9sYW5ndWFnZSArICIgZ2VuZXJhdG9yIGRvZXMgbm90IGFjY2VwdCAnIiArIHN1Yl9uYW1lc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICInIGFzIHN1Yi1uYW1lc3BhY2UhIjsKLSAgICAgICAgICAgIHB3YXJuaW5nKDEsIHdhcm5pbmcuY19zdHIoKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgbmFtZXNwYWNlc19bbGFuZ3VhZ2VdID0gbmFtZV9zcGFjZTsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIGdldF9uYW1lc3BhY2Uoc3RkOjpzdHJpbmcgbGFuZ3VhZ2UpIGNvbnN0IHsKLSAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOwotICAgIGlmICgoaXRlciA9IG5hbWVzcGFjZXNfLmZpbmQobGFuZ3VhZ2UpKSAhPSBuYW1lc3BhY2VzXy5lbmQoKQotICAgICAgICB8fCAoaXRlciA9IG5hbWVzcGFjZXNfLmZpbmQoIioiKSkgIT0gbmFtZXNwYWNlc18uZW5kKCkpIHsKLSAgICAgIHJldHVybiBpdGVyLT5zZWNvbmQ7Ci0gICAgfQotICAgIHJldHVybiBzdGQ6OnN0cmluZygpOwotICB9Ci0KLSAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgZ2V0X2FsbF9uYW1lc3BhY2VzKCl7Ci0gICAgIHJldHVybiBuYW1lc3BhY2VzXzsKLSAgfQotICAvLyBMYW5ndWFnZSBzcGVjaWZpYyBuYW1lc3BhY2UgLyBwYWNrYWdpbmcKLQotICB2b2lkIGFkZF9jcHBfaW5jbHVkZShzdGQ6OnN0cmluZyBwYXRoKSB7IGNwcF9pbmNsdWRlc18ucHVzaF9iYWNrKHBhdGgpOyB9Ci0KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBnZXRfY3BwX2luY2x1ZGVzKCkgeyByZXR1cm4gY3BwX2luY2x1ZGVzXzsgfQotCi0gIHZvaWQgYWRkX2NfaW5jbHVkZShzdGQ6OnN0cmluZyBwYXRoKSB7IGNfaW5jbHVkZXNfLnB1c2hfYmFjayhwYXRoKTsgfQotCi0gIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgZ2V0X2NfaW5jbHVkZXMoKSB7IHJldHVybiBjX2luY2x1ZGVzXzsgfQotCi1wcml2YXRlOgotICAvLyBGaWxlIHBhdGgKLSAgc3RkOjpzdHJpbmcgcGF0aF87Ci0KLSAgLy8gTmFtZQotICBzdGQ6OnN0cmluZyBuYW1lXzsKLQotICAvLyBPdXRwdXQgZGlyZWN0b3J5Ci0gIHN0ZDo6c3RyaW5nIG91dF9wYXRoXzsKLQotICAvLyBPdXRwdXQgZGlyZWN0b3J5IGlzIGFic29sdXRlIGxvY2F0aW9uIGZvciBnZW5lcmF0ZWQgc291cmNlIChubyBnZW4tKikKLSAgYm9vbCBvdXRfcGF0aF9pc19hYnNvbHV0ZV87Ci0KLSAgLy8gTmFtZXNwYWNlCi0gIHN0ZDo6c3RyaW5nIG5hbWVzcGFjZV87Ci0KLSAgLy8gSW5jbHVkZWQgcHJvZ3JhbXMKLSAgc3RkOjp2ZWN0b3I8dF9wcm9ncmFtKj4gaW5jbHVkZXNfOwotCi0gIC8vIEluY2x1ZGUgcHJlZml4IGZvciB0aGlzIHByb2dyYW0sIGlmIGFueQotICBzdGQ6OnN0cmluZyBpbmNsdWRlX3ByZWZpeF87Ci0KLSAgLy8gSWRlbnRpZmllciBsb29rdXAgc2NvcGUKLSAgdF9zY29wZSogc2NvcGVfOwotCi0gIC8vIENvbXBvbmVudHMgdG8gZ2VuZXJhdGUgY29kZSBmb3IKLSAgc3RkOjp2ZWN0b3I8dF90eXBlZGVmKj4gdHlwZWRlZnNfOwotICBzdGQ6OnZlY3Rvcjx0X2VudW0qPiBlbnVtc187Ci0gIHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHNfOwotICBzdGQ6OnZlY3Rvcjx0X3N0cnVjdCo+IG9iamVjdHNfOwotICBzdGQ6OnZlY3Rvcjx0X3N0cnVjdCo+IHN0cnVjdHNfOwotICBzdGQ6OnZlY3Rvcjx0X3N0cnVjdCo+IHhjZXB0aW9uc187Ci0gIHN0ZDo6dmVjdG9yPHRfc2VydmljZSo+IHNlcnZpY2VzXzsKLQotICAvLyBEeW5hbWljIG5hbWVzcGFjZXMKLSAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBuYW1lc3BhY2VzXzsKLQotICAvLyBDKysgZXh0cmEgaW5jbHVkZXMKLSAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNwcF9pbmNsdWRlc187Ci0KLSAgLy8gQyBleHRyYSBpbmNsdWRlcwotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY19pbmNsdWRlc187Ci19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9zY29wZS5oIGIvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3Njb3BlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMDhmZGQuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3Njb3BlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfU0NPUEVfSAotI2RlZmluZSBUX1NDT1BFX0gKLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLQotI2luY2x1ZGUgInRfdHlwZS5oIgotI2luY2x1ZGUgInRfc2VydmljZS5oIgotI2luY2x1ZGUgInRfY29uc3QuaCIKLSNpbmNsdWRlICJ0X2NvbnN0X3ZhbHVlLmgiCi0jaW5jbHVkZSAidF9iYXNlX3R5cGUuaCIKLSNpbmNsdWRlICJ0X21hcC5oIgotI2luY2x1ZGUgInRfbGlzdC5oIgotCi0vKioKLSAqIFRoaXMgcmVwcmVzZW50cyBhIHZhcmlhYmxlIHNjb3BlIHVzZWQgZm9yIGxvb2tpbmcgdXAgcHJlZGVmaW5lZCB0eXBlcyBhbmQKLSAqIHNlcnZpY2VzLiBUeXBpY2FsbHksIGEgc2NvcGUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgdF9wcm9ncmFtLiBTY29wZXMgYXJlIG5vdAotICogdXNlZCB0byBkZXRlcm1pbmUgY29kZSBnZW5lcmF0aW9uLCBidXQgcmF0aGVyIHRvIHJlc29sdmUgaWRlbnRpZmllcnMgYXQKLSAqIHBhcnNlIHRpbWUuCi0gKgotICovCi1jbGFzcyB0X3Njb3BlIHsKLXB1YmxpYzoKLSAgdF9zY29wZSgpIHt9Ci0KLSAgdm9pZCBhZGRfdHlwZShzdGQ6OnN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUpIHsgdHlwZXNfW25hbWVdID0gdHlwZTsgfQotCi0gIHRfdHlwZSogZ2V0X3R5cGUoc3RkOjpzdHJpbmcgbmFtZSkgeyByZXR1cm4gdHlwZXNfW25hbWVdOyB9Ci0KLSAgdm9pZCBhZGRfc2VydmljZShzdGQ6OnN0cmluZyBuYW1lLCB0X3NlcnZpY2UqIHNlcnZpY2UpIHsgc2VydmljZXNfW25hbWVdID0gc2VydmljZTsgfQotCi0gIHRfc2VydmljZSogZ2V0X3NlcnZpY2Uoc3RkOjpzdHJpbmcgbmFtZSkgeyByZXR1cm4gc2VydmljZXNfW25hbWVdOyB9Ci0KLSAgdm9pZCBhZGRfY29uc3RhbnQoc3RkOjpzdHJpbmcgbmFtZSwgdF9jb25zdCogY29uc3RhbnQpIHsKLSAgICBpZiAoY29uc3RhbnRzXy5maW5kKG5hbWUpICE9IGNvbnN0YW50c18uZW5kKCkpIHsKLSAgICAgIHRocm93ICJFbnVtICIgKyBuYW1lICsgIiBpcyBhbHJlYWR5IGRlZmluZWQhIjsKLSAgICB9IGVsc2UgewotICAgICAgY29uc3RhbnRzX1tuYW1lXSA9IGNvbnN0YW50OwotICAgIH0KLSAgfQotCi0gIHRfY29uc3QqIGdldF9jb25zdGFudChzdGQ6OnN0cmluZyBuYW1lKSB7IHJldHVybiBjb25zdGFudHNfW25hbWVdOyB9Ci0KLSAgdm9pZCBwcmludCgpIHsKLSAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgdF90eXBlKj46Oml0ZXJhdG9yIGl0ZXI7Ci0gICAgZm9yIChpdGVyID0gdHlwZXNfLmJlZ2luKCk7IGl0ZXIgIT0gdHlwZXNfLmVuZCgpOyArK2l0ZXIpIHsKLSAgICAgIHByaW50ZigiJXMgPT4gJXNcbiIsIGl0ZXItPmZpcnN0LmNfc3RyKCksIGl0ZXItPnNlY29uZC0+Z2V0X25hbWUoKS5jX3N0cigpKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIHJlc29sdmVfY29uc3RfdmFsdWUodF9jb25zdF92YWx1ZSogY29uc3RfdmFsLCB0X3R5cGUqIHR0eXBlKSB7Ci0gICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgICAgY29uc3Qgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgbWFwID0gY29uc3RfdmFsLT5nZXRfbWFwKCk7Ci0gICAgICBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgICBmb3IgKHZfaXRlciA9IG1hcC5iZWdpbigpOyB2X2l0ZXIgIT0gbWFwLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgICByZXNvbHZlX2NvbnN0X3ZhbHVlKHZfaXRlci0+Zmlyc3QsICgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpOwotICAgICAgICByZXNvbHZlX2NvbnN0X3ZhbHVlKHZfaXRlci0+c2Vjb25kLCAoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkgfHwgdHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IGNvbnN0X3ZhbC0+Z2V0X2xpc3QoKTsKLSAgICAgIHN0ZDo6dmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgICAgcmVzb2x2ZV9jb25zdF92YWx1ZSgoKnZfaXRlciksICgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc3RydWN0KCkpIHsKLSAgICAgIHRfc3RydWN0KiB0c3RydWN0ID0gKHRfc3RydWN0Kil0dHlwZTsKLSAgICAgIGNvbnN0IHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIG1hcCA9IGNvbnN0X3ZhbC0+Z2V0X21hcCgpOwotICAgICAgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgICAgZm9yICh2X2l0ZXIgPSBtYXAuYmVnaW4oKTsgdl9pdGVyICE9IG1hcC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgICAgdF9maWVsZCogZmllbGQgPSB0c3RydWN0LT5nZXRfZmllbGRfYnlfbmFtZSh2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpOwotICAgICAgICBpZiAoZmllbGQgPT0gTlVMTCkgewotICAgICAgICAgIHRocm93ICJObyBmaWVsZCBuYW1lZCBcIiIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkKLSAgICAgICAgICAgICAgKyAiXCIgd2FzIGZvdW5kIGluIHN0cnVjdCBvZiB0eXBlIFwiIiArIHRzdHJ1Y3QtPmdldF9uYW1lKCkgKyAiXCIiOwotICAgICAgICB9Ci0gICAgICAgIHJlc29sdmVfY29uc3RfdmFsdWUodl9pdGVyLT5zZWNvbmQsIGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGNvbnN0X3ZhbC0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JREVOVElGSUVSKSB7Ci0gICAgICBpZiAodHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgICBjb25zdF92YWwtPnNldF9lbnVtKCh0X2VudW0qKXR0eXBlKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRfY29uc3QqIGNvbnN0YW50ID0gZ2V0X2NvbnN0YW50KGNvbnN0X3ZhbC0+Z2V0X2lkZW50aWZpZXIoKSk7Ci0gICAgICAgIGlmIChjb25zdGFudCA9PSBOVUxMKSB7Ci0gICAgICAgICAgdGhyb3cgIk5vIGVudW0gdmFsdWUgb3IgY29uc3RhbnQgZm91bmQgbmFtZWQgXCIiICsgY29uc3RfdmFsLT5nZXRfaWRlbnRpZmllcigpICsgIlwiISI7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSZXNvbHZlIHR5cGVkZWZzIHRvIHRoZSB1bmRlcmx5aW5nIHR5cGUKLSAgICAgICAgdF90eXBlKiBjb25zdF90eXBlID0gY29uc3RhbnQtPmdldF90eXBlKCktPmdldF90cnVlX3R5cGUoKTsKLQotICAgICAgICBpZiAoY29uc3RfdHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgICAgICBzd2l0Y2ggKCgodF9iYXNlX3R5cGUqKWNvbnN0X3R5cGUpLT5nZXRfYmFzZSgpKSB7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgICAgIGNvbnN0X3ZhbC0+c2V0X2ludGVnZXIoY29uc3RhbnQtPmdldF92YWx1ZSgpLT5nZXRfaW50ZWdlcigpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICAgICAgY29uc3RfdmFsLT5zZXRfc3RyaW5nKGNvbnN0YW50LT5nZXRfdmFsdWUoKS0+Z2V0X3N0cmluZygpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICAgICAgY29uc3RfdmFsLT5zZXRfZG91YmxlKGNvbnN0YW50LT5nZXRfdmFsdWUoKS0+Z2V0X2RvdWJsZSgpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgICAgIHRocm93ICJDb25zdGFudHMgY2Fubm90IGJlIG9mIHR5cGUgVk9JRCI7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGNvbnN0X3R5cGUtPmlzX21hcCgpKSB7Ci0gICAgICAgICAgY29uc3Qgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgbWFwID0gY29uc3RhbnQtPmdldF92YWx1ZSgpLT5nZXRfbWFwKCk7Ci0gICAgICAgICAgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotCi0gICAgICAgICAgY29uc3RfdmFsLT5zZXRfbWFwKCk7Ci0gICAgICAgICAgZm9yICh2X2l0ZXIgPSBtYXAuYmVnaW4oKTsgdl9pdGVyICE9IG1hcC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgICAgICAgIGNvbnN0X3ZhbC0+YWRkX21hcCh2X2l0ZXItPmZpcnN0LCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGNvbnN0X3R5cGUtPmlzX2xpc3QoKSkgewotICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gY29uc3RhbnQtPmdldF92YWx1ZSgpLT5nZXRfbGlzdCgpOwotICAgICAgICAgIHN0ZDo6dmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotCi0gICAgICAgICAgY29uc3RfdmFsLT5zZXRfbGlzdCgpOwotICAgICAgICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICAgICAgICBjb25zdF92YWwtPmFkZF9saXN0KCp2X2l0ZXIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgLy8gZW51bSBjb25zdGFudCB3aXRoIG5vbi1pZGVudGlmaWVyIHZhbHVlLiBzZXQgdGhlIGVudW0gYW5kIGZpbmQgdGhlCi0gICAgICAvLyB2YWx1ZSdzIG5hbWUuCi0gICAgICB0X2VudW0qIHRlbnVtID0gKHRfZW51bSopdHR5cGU7Ci0gICAgICB0X2VudW1fdmFsdWUqIGVudW1fdmFsdWUgPSB0ZW51bS0+Z2V0X2NvbnN0YW50X2J5X3ZhbHVlKGNvbnN0X3ZhbC0+Z2V0X2ludGVnZXIoKSk7Ci0gICAgICBpZiAoZW51bV92YWx1ZSA9PSBOVUxMKSB7Ci0gICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSB2YWxzdG07Ci0gICAgICAgIHZhbHN0bSA8PCBjb25zdF92YWwtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICAgIHRocm93ICJDb3VsZG4ndCBmaW5kIGEgbmFtZWQgdmFsdWUgaW4gZW51bSAiICsgdGVudW0tPmdldF9uYW1lKCkgKyAiIGZvciB2YWx1ZSAiCi0gICAgICAgICAgICArIHZhbHN0bS5zdHIoKTsKLSAgICAgIH0KLSAgICAgIGNvbnN0X3ZhbC0+c2V0X2lkZW50aWZpZXIodGVudW0tPmdldF9uYW1lKCkgKyAiLiIgKyBlbnVtX3ZhbHVlLT5nZXRfbmFtZSgpKTsKLSAgICAgIGNvbnN0X3ZhbC0+c2V0X2VudW0odGVudW0pOwotICAgIH0KLSAgfQotCi1wcml2YXRlOgotICAvLyBNYXAgb2YgbmFtZXMgdG8gdHlwZXMKLSAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHRfdHlwZSo+IHR5cGVzXzsKLQotICAvLyBNYXAgb2YgbmFtZXMgdG8gY29uc3RhbnRzCi0gIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB0X2NvbnN0Kj4gY29uc3RhbnRzXzsKLQotICAvLyBNYXAgb2YgbmFtZXMgdG8gc2VydmljZXMKLSAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHRfc2VydmljZSo+IHNlcnZpY2VzXzsKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3NlcnZpY2UuaCBiL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9zZXJ2aWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMDFmOWMuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3NlcnZpY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX1NFUlZJQ0VfSAotI2RlZmluZSBUX1NFUlZJQ0VfSAotCi0jaW5jbHVkZSAidF9mdW5jdGlvbi5oIgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotY2xhc3MgdF9wcm9ncmFtOwotCi0vKioKLSAqIEEgc2VydmljZSBjb25zaXN0cyBvZiBhIHNldCBvZiBmdW5jdGlvbnMuCi0gKgotICovCi1jbGFzcyB0X3NlcnZpY2UgOiBwdWJsaWMgdF90eXBlIHsKLXB1YmxpYzoKLSAgdF9zZXJ2aWNlKHRfcHJvZ3JhbSogcHJvZ3JhbSkgOiB0X3R5cGUocHJvZ3JhbSksIGV4dGVuZHNfKE5VTEwpIHt9Ci0KLSAgYm9vbCBpc19zZXJ2aWNlKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotCi0gIHZvaWQgc2V0X2V4dGVuZHModF9zZXJ2aWNlKiBleHRlbmRzKSB7IGV4dGVuZHNfID0gZXh0ZW5kczsgfQotCi0gIHZvaWQgYWRkX2Z1bmN0aW9uKHRfZnVuY3Rpb24qIGZ1bmMpIHsKLSAgICBzdGQ6OnZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7Ci0gICAgZm9yIChpdGVyID0gZnVuY3Rpb25zXy5iZWdpbigpOyBpdGVyICE9IGZ1bmN0aW9uc18uZW5kKCk7ICsraXRlcikgewotICAgICAgaWYgKGZ1bmMtPmdldF9uYW1lKCkgPT0gKCppdGVyKS0+Z2V0X25hbWUoKSkgewotICAgICAgICB0aHJvdyAiRnVuY3Rpb24gIiArIGZ1bmMtPmdldF9uYW1lKCkgKyAiIGlzIGFscmVhZHkgZGVmaW5lZCI7Ci0gICAgICB9Ci0gICAgfQotICAgIGZ1bmN0aW9uc18ucHVzaF9iYWNrKGZ1bmMpOwotICB9Ci0KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9mdW5jdGlvbio+JiBnZXRfZnVuY3Rpb25zKCkgY29uc3QgeyByZXR1cm4gZnVuY3Rpb25zXzsgfQotCi0gIHRfc2VydmljZSogZ2V0X2V4dGVuZHMoKSB7IHJldHVybiBleHRlbmRzXzsgfQotCi1wcml2YXRlOgotICBzdGQ6OnZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zXzsKLSAgdF9zZXJ2aWNlKiBleHRlbmRzXzsKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3NldC5oIGIvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3NldC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTQ2NDgwLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9zZXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX1NFVF9ICi0jZGVmaW5lIFRfU0VUX0gKLQotI2luY2x1ZGUgInRfY29udGFpbmVyLmgiCi0KLS8qKgotICogQSBzZXQgaXMgYSBsaWdodHdlaWdodCBjb250YWluZXIgdHlwZSB0aGF0IGp1c3Qgd3JhcHMgYW5vdGhlciBkYXRhIHR5cGUuCi0gKgotICovCi1jbGFzcyB0X3NldCA6IHB1YmxpYyB0X2NvbnRhaW5lciB7Ci1wdWJsaWM6Ci0gIHRfc2V0KHRfdHlwZSogZWxlbV90eXBlKSA6IGVsZW1fdHlwZV8oZWxlbV90eXBlKSB7fQotCi0gIHRfdHlwZSogZ2V0X2VsZW1fdHlwZSgpIGNvbnN0IHsgcmV0dXJuIGVsZW1fdHlwZV87IH0KLQotICBib29sIGlzX3NldCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLQotcHJpdmF0ZToKLSAgdF90eXBlKiBlbGVtX3R5cGVfOwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3Rfc3RydWN0LmggYi9jb21waWxlci9jcHAvc3JjL3BhcnNlL3Rfc3RydWN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzY2IwODkuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3N0cnVjdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX1NUUlVDVF9ICi0jZGVmaW5lIFRfU1RSVUNUX0gKLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJ0X3R5cGUuaCIKLSNpbmNsdWRlICJ0X2ZpZWxkLmgiCi0KLS8vIEZvcndhcmQgZGVjbGFyZSB0aGF0IHB1cHB5Ci1jbGFzcyB0X3Byb2dyYW07Ci0KLS8qKgotICogQSBzdHJ1Y3QgaXMgYSBjb250YWluZXIgZm9yIGEgc2V0IG9mIG1lbWJlciBmaWVsZHMgdGhhdCBoYXMgYSBuYW1lLiBTdHJ1Y3RzCi0gKiBhcmUgYWxzbyB1c2VkIHRvIGltcGxlbWVudCBleGNlcHRpb24gdHlwZXMuCi0gKgotICovCi1jbGFzcyB0X3N0cnVjdCA6IHB1YmxpYyB0X3R5cGUgewotcHVibGljOgotICB0eXBlZGVmIHN0ZDo6dmVjdG9yPHRfZmllbGQqPiBtZW1iZXJzX3R5cGU7Ci0KLSAgdF9zdHJ1Y3QodF9wcm9ncmFtKiBwcm9ncmFtKQotICAgIDogdF90eXBlKHByb2dyYW0pLAotICAgICAgaXNfeGNlcHRpb25fKGZhbHNlKSwKLSAgICAgIGlzX3VuaW9uXyhmYWxzZSksCi0gICAgICBtZW1iZXJzX3ZhbGlkYXRlZChmYWxzZSksCi0gICAgICBtZW1iZXJzX3dpdGhfdmFsdWUoMCksCi0gICAgICB4c2RfYWxsXyhmYWxzZSkge30KLQotICB0X3N0cnVjdCh0X3Byb2dyYW0qIHByb2dyYW0sIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKQotICAgIDogdF90eXBlKHByb2dyYW0sIG5hbWUpLAotICAgICAgaXNfeGNlcHRpb25fKGZhbHNlKSwKLSAgICAgIGlzX3VuaW9uXyhmYWxzZSksCi0gICAgICBtZW1iZXJzX3ZhbGlkYXRlZChmYWxzZSksCi0gICAgICBtZW1iZXJzX3dpdGhfdmFsdWUoMCksCi0gICAgICB4c2RfYWxsXyhmYWxzZSkge30KLQotICB2b2lkIHNldF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7Ci0gICAgbmFtZV8gPSBuYW1lOwotICAgIHZhbGlkYXRlX3VuaW9uX21lbWJlcnMoKTsKLSAgfQotCi0gIHZvaWQgc2V0X3hjZXB0aW9uKGJvb2wgaXNfeGNlcHRpb24pIHsgaXNfeGNlcHRpb25fID0gaXNfeGNlcHRpb247IH0KLQotICB2b2lkIHZhbGlkYXRlX3VuaW9uX21lbWJlcih0X2ZpZWxkKiBmaWVsZCkgewotICAgIGlmIChpc191bmlvbl8gJiYgKCFuYW1lXy5lbXB0eSgpKSkgewotCi0gICAgICAvLyB1bmlvbnMgY2FuJ3QgaGF2ZSByZXF1aXJlZCBmaWVsZHMKLSAgICAgIGlmIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICAgICAgcHdhcm5pbmcoMSwKLSAgICAgICAgICAgICAgICAgIlJlcXVpcmVkIGZpZWxkICVzIG9mIHVuaW9uICVzIHNldCB0byBvcHRpb25hbC5cbiIsCi0gICAgICAgICAgICAgICAgIGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgIG5hbWVfLmNfc3RyKCkpOwotICAgICAgICBmaWVsZC0+c2V0X3JlcSh0X2ZpZWxkOjpUX09QVElPTkFMKTsKLSAgICAgIH0KLQotICAgICAgLy8gdW5pb25zIG1heSBoYXZlIHVwIHRvIG9uZSBtZW1iZXIgZGVmYXVsdGVkLCBidXQgbm90IG1vcmUKLSAgICAgIGlmIChmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgewotICAgICAgICBpZiAoMSA8ICsrbWVtYmVyc193aXRoX3ZhbHVlKSB7Ci0gICAgICAgICAgdGhyb3cgIkVycm9yOiBGaWVsZCAiICsgZmllbGQtPmdldF9uYW1lKCkgKyAiIHByb3ZpZGVzIGFub3RoZXIgZGVmYXVsdCB2YWx1ZSBmb3IgdW5pb24gIgotICAgICAgICAgICAgICArIG5hbWVfOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgdm9pZCB2YWxpZGF0ZV91bmlvbl9tZW1iZXJzKCkgewotICAgIGlmIChpc191bmlvbl8gJiYgKCFuYW1lXy5lbXB0eSgpKSAmJiAoIW1lbWJlcnNfdmFsaWRhdGVkKSkgewotICAgICAgbWVtYmVyc190eXBlOjpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnNfaW5faWRfb3JkZXJfLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzX2luX2lkX29yZGVyXy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgICAgdmFsaWRhdGVfdW5pb25fbWVtYmVyKCptX2l0ZXIpOwotICAgICAgfQotICAgICAgbWVtYmVyc192YWxpZGF0ZWQgPSB0cnVlOwotICAgIH0KLSAgfQotCi0gIHZvaWQgc2V0X3VuaW9uKGJvb2wgaXNfdW5pb24pIHsKLSAgICBpc191bmlvbl8gPSBpc191bmlvbjsKLSAgICB2YWxpZGF0ZV91bmlvbl9tZW1iZXJzKCk7Ci0gIH0KLQotICB2b2lkIHNldF94c2RfYWxsKGJvb2wgeHNkX2FsbCkgeyB4c2RfYWxsXyA9IHhzZF9hbGw7IH0KLQotICBib29sIGdldF94c2RfYWxsKCkgY29uc3QgeyByZXR1cm4geHNkX2FsbF87IH0KLQotICBib29sIGFwcGVuZCh0X2ZpZWxkKiBlbGVtKSB7Ci0gICAgdHlwZWRlZiBtZW1iZXJzX3R5cGU6Oml0ZXJhdG9yIGl0ZXJfdHlwZTsKLSAgICBzdGQ6OnBhaXI8aXRlcl90eXBlLCBpdGVyX3R5cGU+IGJvdW5kcyA9IHN0ZDo6ZXF1YWxfcmFuZ2UobWVtYmVyc19pbl9pZF9vcmRlcl8uYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyc19pbl9pZF9vcmRlcl8uZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQ6OmtleV9jb21wYXJlKCkpOwotICAgIGlmIChib3VuZHMuZmlyc3QgIT0gYm91bmRzLnNlY29uZCkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAvLyByZXR1cm5zIGZhbHNlIHdoZW4gdGhlcmUgaXMgYSBjb25mbGljdCBvZiBmaWVsZCBuYW1lcwotICAgIGlmIChnZXRfZmllbGRfYnlfbmFtZShlbGVtLT5nZXRfbmFtZSgpKSAhPSBOVUxMKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIG1lbWJlcnNfLnB1c2hfYmFjayhlbGVtKTsKLSAgICBtZW1iZXJzX2luX2lkX29yZGVyXy5pbnNlcnQoYm91bmRzLnNlY29uZCwgZWxlbSk7Ci0gICAgdmFsaWRhdGVfdW5pb25fbWVtYmVyKGVsZW0pOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgY29uc3QgbWVtYmVyc190eXBlJiBnZXRfbWVtYmVycygpIHsgcmV0dXJuIG1lbWJlcnNfOyB9Ci0KLSAgY29uc3QgbWVtYmVyc190eXBlJiBnZXRfc29ydGVkX21lbWJlcnMoKSB7IHJldHVybiBtZW1iZXJzX2luX2lkX29yZGVyXzsgfQotCi0gIGJvb2wgaXNfc3RydWN0KCkgY29uc3QgeyByZXR1cm4gIWlzX3hjZXB0aW9uXzsgfQotCi0gIGJvb2wgaXNfeGNlcHRpb24oKSBjb25zdCB7IHJldHVybiBpc194Y2VwdGlvbl87IH0KLQotICBib29sIGlzX3VuaW9uKCkgY29uc3QgeyByZXR1cm4gaXNfdW5pb25fOyB9Ci0KLSAgdF9maWVsZCogZ2V0X2ZpZWxkX2J5X25hbWUoc3RkOjpzdHJpbmcgZmllbGRfbmFtZSkgewotICAgIG1lbWJlcnNfdHlwZTo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotICAgIGZvciAobV9pdGVyID0gbWVtYmVyc19pbl9pZF9vcmRlcl8uYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnNfaW5faWRfb3JkZXJfLmVuZCgpOyArK21faXRlcikgewotICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSA9PSBmaWVsZF9uYW1lKSB7Ci0gICAgICAgIHJldHVybiAqbV9pdGVyOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi1wcml2YXRlOgotICBtZW1iZXJzX3R5cGUgbWVtYmVyc187Ci0gIG1lbWJlcnNfdHlwZSBtZW1iZXJzX2luX2lkX29yZGVyXzsKLSAgYm9vbCBpc194Y2VwdGlvbl87Ci0gIGJvb2wgaXNfdW5pb25fOwotICBib29sIG1lbWJlcnNfdmFsaWRhdGVkOwotICBpbnQgbWVtYmVyc193aXRoX3ZhbHVlOwotCi0gIGJvb2wgeHNkX2FsbF87Ci19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF90eXBlLmggYi9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfdHlwZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTZjYzZmLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF90eXBlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfVFlQRV9ICi0jZGVmaW5lIFRfVFlQRV9ICi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPGNzdHJpbmc+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSAidF9kb2MuaCIKLQotY2xhc3MgdF9wcm9ncmFtOwotCi0vKioKLSAqIEdlbmVyaWMgcmVwcmVzZW50YXRpb24gb2YgYSB0aHJpZnQgdHlwZS4gVGhlc2Ugb2JqZWN0cyBhcmUgdXNlZCBieSB0aGUKLSAqIHBhcnNlciBtb2R1bGUgdG8gYnVpbGQgdXAgYSB0cmVlIG9mIG9iamVjdCB0aGF0IGFyZSBhbGwgZXhwbGljaXRseSB0eXBlZC4KLSAqIFRoZSBnZW5lcmljIHRfdHlwZSBjbGFzcyBleHBvcnRzIGEgdmFyaWV0eSBvZiB1c2VmdWwgbWV0aG9kcyB0aGF0IGFyZQotICogdXNlZCBieSB0aGUgY29kZSBnZW5lcmF0b3IgdG8gYnJhbmNoIGJhc2VkIHVwb24gZGlmZmVyZW50IGhhbmRsaW5nIGZvciB0aGUKLSAqIHZhcmlvdXMgdHlwZXMuCi0gKgotICovCi1jbGFzcyB0X3R5cGUgOiBwdWJsaWMgdF9kb2MgewotcHVibGljOgotICB2aXJ0dWFsIH50X3R5cGUoKSB7fQotCi0gIHZpcnR1YWwgdm9pZCBzZXRfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgeyBuYW1lXyA9IG5hbWU7IH0KLQotICB2aXJ0dWFsIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG5hbWVfOyB9Ci0KLSAgdmlydHVhbCBib29sIGlzX3ZvaWQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICB2aXJ0dWFsIGJvb2wgaXNfYmFzZV90eXBlKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgdmlydHVhbCBib29sIGlzX3N0cmluZygpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gIHZpcnR1YWwgYm9vbCBpc19ib29sKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgdmlydHVhbCBib29sIGlzX3R5cGVkZWYoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICB2aXJ0dWFsIGJvb2wgaXNfZW51bSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gIHZpcnR1YWwgYm9vbCBpc19zdHJ1Y3QoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICB2aXJ0dWFsIGJvb2wgaXNfeGNlcHRpb24oKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICB2aXJ0dWFsIGJvb2wgaXNfY29udGFpbmVyKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgdmlydHVhbCBib29sIGlzX2xpc3QoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICB2aXJ0dWFsIGJvb2wgaXNfc2V0KCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgdmlydHVhbCBib29sIGlzX21hcCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gIHZpcnR1YWwgYm9vbCBpc19zZXJ2aWNlKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLQotICB0X3Byb2dyYW0qIGdldF9wcm9ncmFtKCkgeyByZXR1cm4gcHJvZ3JhbV87IH0KLQotICBjb25zdCB0X3Byb2dyYW0qIGdldF9wcm9ncmFtKCkgY29uc3QgeyByZXR1cm4gcHJvZ3JhbV87IH0KLQotICB0X3R5cGUqIGdldF90cnVlX3R5cGUoKTsKLQotICAvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgYnJlYWsgKG1heWJlIGJhZGx5KSB1bmxlc3MgMCA8PSBudW0gPD0gMTYuCi0gIHN0YXRpYyBjaGFyIG55YmJsZV90b194ZGlnaXQoaW50IG51bSkgewotICAgIGlmIChudW0gPCAxMCkgewotICAgICAgcmV0dXJuICcwJyArIG51bTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuICdBJyArIG51bSAtIDEwOwotICAgIH0KLSAgfQotCi0gIHN0YXRpYyBzdGQ6OnN0cmluZyBieXRlX3RvX2hleCh1aW50OF90IGJ5dGUpIHsKLSAgICBzdGQ6OnN0cmluZyBydjsKLSAgICBydiArPSBueWJibGVfdG9feGRpZ2l0KGJ5dGUgPj4gNCk7Ci0gICAgcnYgKz0gbnliYmxlX3RvX3hkaWdpdChieXRlICYgMHgwZik7Ci0gICAgcmV0dXJuIHJ2OwotICB9Ci0KLSAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBhbm5vdGF0aW9uc187Ci0KLXByb3RlY3RlZDoKLSAgdF90eXBlKCkgOiBwcm9ncmFtXyhOVUxMKSB7IDsgfQotCi0gIHRfdHlwZSh0X3Byb2dyYW0qIHByb2dyYW0pIDogcHJvZ3JhbV8ocHJvZ3JhbSkgeyA7IH0KLQotICB0X3R5cGUodF9wcm9ncmFtKiBwcm9ncmFtLCBzdGQ6OnN0cmluZyBuYW1lKSA6IHByb2dyYW1fKHByb2dyYW0pLCBuYW1lXyhuYW1lKSB7IDsgfQotCi0gIHRfdHlwZShzdGQ6OnN0cmluZyBuYW1lKSA6IHByb2dyYW1fKE5VTEwpLCBuYW1lXyhuYW1lKSB7IDsgfQotCi0gIHRfcHJvZ3JhbSogcHJvZ3JhbV87Ci0gIHN0ZDo6c3RyaW5nIG5hbWVfOwotfTsKLQotLyoqCi0gKiBQbGFjZWhvbGRlciBzdHJ1Y3QgZm9yIHJldHVybmluZyB0aGUga2V5IGFuZCB2YWx1ZSBvZiBhbiBhbm5vdGF0aW9uCi0gKiBkdXJpbmcgcGFyc2luZy4KLSAqLwotc3RydWN0IHRfYW5ub3RhdGlvbiB7Ci0gIHN0ZDo6c3RyaW5nIGtleTsKLSAgc3RkOjpzdHJpbmcgdmFsOwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfdHlwZWRlZi5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF90eXBlZGVmLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGJlNzQ5Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF90eXBlZGVmLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI2luY2x1ZGUgPGNzdGRpbz4KLQotI2luY2x1ZGUgInRfdHlwZWRlZi5oIgotI2luY2x1ZGUgInRfcHJvZ3JhbS5oIgotCi10X3R5cGUqIHRfdHlwZWRlZjo6Z2V0X3R5cGUoKSBjb25zdCB7Ci0gIGlmICh0eXBlXyA9PSBOVUxMKSB7Ci0gICAgdF90eXBlKiB0eXBlID0gZ2V0X3Byb2dyYW0oKS0+c2NvcGUoKS0+Z2V0X3R5cGUoc3ltYm9saWNfKTsKLSAgICBpZiAodHlwZSA9PSBOVUxMKSB7Ci0gICAgICBwcmludGYoIlR5cGUgXCIlc1wiIG5vdCBkZWZpbmVkXG4iLCBzeW1ib2xpY18uY19zdHIoKSk7Ci0gICAgICBleGl0KDEpOwotICAgIH0KLSAgICByZXR1cm4gdHlwZTsKLSAgfQotICByZXR1cm4gdHlwZV87Ci19CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfdHlwZWRlZi5oIGIvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3R5cGVkZWYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM5YTI0Ni4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfdHlwZWRlZi5oCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfVFlQRURFRl9ICi0jZGVmaW5lIFRfVFlQRURFRl9ICi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSAidF90eXBlLmgiCi0KLS8qKgotICogQSB0eXBlZGVmIGlzIGEgbWFwcGluZyBmcm9tIGEgc3ltYm9saWMgbmFtZSB0byBhbm90aGVyIHR5cGUuIEluIGR5bWFuaWNhbGx5Ci0gKiB0eXBlZCBsYW5ndWFnZXMgKGkuZS4gcGhwL3B5dGhvbikgdGhlIGNvZGUgZ2VuZXJhdG9yIGNhbiBhY3R1YWxseSB1c3VhbGx5Ci0gKiBpZ25vcmUgdHlwZWRlZnMgYW5kIGp1c3QgdXNlIHRoZSB1bmRlcmx5aW5nIHR5cGUgZGlyZWN0bHksIHRob3VnaCBpbiBDKysKLSAqIHRoZSBzeW1ib2xpYyBuYW1pbmcgY2FuIGJlIHF1aXRlIHVzZWZ1bCBmb3IgY29kZSBjbGFyaXR5LgotICoKLSAqLwotY2xhc3MgdF90eXBlZGVmIDogcHVibGljIHRfdHlwZSB7Ci1wdWJsaWM6Ci0gIHRfdHlwZWRlZih0X3Byb2dyYW0qIHByb2dyYW0sIHRfdHlwZSogdHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHN5bWJvbGljKQotICAgIDogdF90eXBlKHByb2dyYW0sIHN5bWJvbGljKSwgdHlwZV8odHlwZSksIHN5bWJvbGljXyhzeW1ib2xpYyksIGZvcndhcmRfKGZhbHNlKSwgc2Vlbl8oZmFsc2UpIHt9Ci0KLSAgLyoqCi0gICAqIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCB0byByZWZlciB0byBhIHR5cGUgdGhhdCBpcyBsYXppbHkKLSAgICogcmVzb2x2ZWQgYXQgYSBsYXRlciB0aW1lLCBsaWtlIGZvciBmb3J3YXJkIGRlY2xhcmF0aW9ucyBvcgotICAgKiByZWN1cnNpdmUgdHlwZXMuCi0gICAqLwotICB0X3R5cGVkZWYodF9wcm9ncmFtKiBwcm9ncmFtLCBjb25zdCBzdGQ6OnN0cmluZyYgc3ltYm9saWMsIGJvb2wgZm9yd2FyZCkKLSAgICA6IHRfdHlwZShwcm9ncmFtLCBzeW1ib2xpYyksCi0gICAgICB0eXBlXyhOVUxMKSwKLSAgICAgIHN5bWJvbGljXyhzeW1ib2xpYyksCi0gICAgICBmb3J3YXJkXyhmb3J3YXJkKSwKLSAgICAgIHNlZW5fKGZhbHNlKSB7fQotCi0gIH50X3R5cGVkZWYoKSB7fQotCi0gIHRfdHlwZSogZ2V0X3R5cGUoKSBjb25zdDsKLQotICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0X3N5bWJvbGljKCkgY29uc3QgeyByZXR1cm4gc3ltYm9saWNfOyB9Ci0KLSAgYm9vbCBpc19mb3J3YXJkX3R5cGVkZWYoKSBjb25zdCB7IHJldHVybiBmb3J3YXJkXzsgfQotCi0gIGJvb2wgaXNfdHlwZWRlZigpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLQotcHJpdmF0ZToKLSAgdF90eXBlKiB0eXBlXzsKLSAgc3RkOjpzdHJpbmcgc3ltYm9saWNfOwotICBib29sIGZvcndhcmRfOwotICBtdXRhYmxlIGJvb2wgc2Vlbl87Ci19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvcGxhdGZvcm0uaCBiL2NvbXBpbGVyL2NwcC9zcmMvcGxhdGZvcm0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNiZTlkYi4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3BsYXRmb3JtLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogZGVmaW5lIGZvciBta2RpcixzaW5jZSB0aGUgbWV0aG9kIHNpZ25hdHVyZQotICogaXMgZGlmZmVyZW50IGZvciB0aGUgbm9uLVBPU0lYIE1pbkdXCi0gKi8KLQotI2lmZGVmIF9NU0NfVkVSCi0jaW5jbHVkZSAid2luZG93cy9jb25maWcuaCIKLSNlbmRpZgotCi0jaWZkZWYgX1dJTjMyCi0jaW5jbHVkZSA8ZGlyZWN0Lmg+Ci0jaW5jbHVkZSA8aW8uaD4KLSNlbHNlCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNlbmRpZgotCi0jaWZkZWYgX1dJTjMyCi0jZGVmaW5lIE1LRElSKHgpIG1rZGlyKHgpCi0jZWxzZQotI2RlZmluZSBNS0RJUih4KSBta2Rpcih4LCBTX0lSV1hVIHwgU19JUldYRyB8IFNfSVJXWE8pCi0jZW5kaWYKLQotI2lmZGVmIFBBVEhfTUFYCi0jZGVmaW5lIFRIUklGVF9QQVRIX01BWCBQQVRIX01BWAotI2Vsc2UKLSNkZWZpbmUgVEhSSUZUX1BBVEhfTUFYIE1BWF9QQVRICi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2F1ZGl0L3RfYXVkaXQuY3BwIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvYXVkaXQvdF9hdWRpdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYzOWQ2MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2F1ZGl0L3RfYXVkaXQuY3BwCkBAIC0wLDAgKzEsNDY0IEBACisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorCisvLyBDYXJlZnVsOiBtdXN0IGluY2x1ZGUgZ2xvYmFscyBmaXJzdCBmb3IgZXh0ZXJuIGRlZmluaXRpb25zCisjaW5jbHVkZSAidGhyaWZ0L2dsb2JhbHMuaCIKKworI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3Byb2dyYW0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9zY29wZS5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2NvbnN0LmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfZmllbGQuaCIKKworI2luY2x1ZGUgInRocmlmdC92ZXJzaW9uLmgiCisKKyNpbmNsdWRlICJ0aHJpZnQvYXVkaXQvdF9hdWRpdC5oIgorCitleHRlcm4gaW50IGdfd2FybjsKK2V4dGVybiBzdGQ6OnN0cmluZyBnX2N1cnBhdGg7CitleHRlcm4gYm9vbCBnX3JldHVybl9mYWlsdXJlOworCit2b2lkIHRocmlmdF9hdWRpdF93YXJuaW5nKGludCBsZXZlbCwgY29uc3QgY2hhciogZm10LCAuLi4pIHsKKyAgIGlmIChnX3dhcm4gPCBsZXZlbCkgeworICAgICAgcmV0dXJuOworICAgfQorICAgdmFfbGlzdCBhcmdzOworICAgcHJpbnRmKCJbVGhyaWZ0IEF1ZGl0IFdhcm5pbmc6JXNdICIsIGdfY3VycGF0aC5jX3N0cigpKTsKKyAgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisgICB2cHJpbnRmKGZtdCwgYXJncyk7CisgICB2YV9lbmQoYXJncyk7CisgICBwcmludGYoIlxuIik7Cit9CisKK3ZvaWQgdGhyaWZ0X2F1ZGl0X2ZhaWx1cmUoY29uc3QgY2hhciogZm10LCAuLi4pIHsKKyAgdmFfbGlzdCBhcmdzOworICBmcHJpbnRmKHN0ZGVyciwgIltUaHJpZnQgQXVkaXQgRmFpbHVyZTolc10gIiwgZ19jdXJwYXRoLmNfc3RyKCkpOworICB2YV9zdGFydChhcmdzLCBmbXQpOworICB2ZnByaW50ZihzdGRlcnIsIGZtdCwgYXJncyk7CisgIHZhX2VuZChhcmdzKTsKKyAgZnByaW50ZihzdGRlcnIsICJcbiIpOworICBnX3JldHVybl9mYWlsdXJlID0gdHJ1ZTsKK30KKwordm9pZCBjb21wYXJlX25hbWVzcGFjZSh0X3Byb2dyYW0qIG5ld1Byb2dyYW0sIHRfcHJvZ3JhbSogb2xkUHJvZ3JhbSkKK3sKKyAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIG5ld05hbWVzcGFjZU1hcCA9IG5ld1Byb2dyYW0tPmdldF9hbGxfbmFtZXNwYWNlcygpOworICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgb2xkTmFtZXNwYWNlTWFwID0gb2xkUHJvZ3JhbS0+Z2V0X2FsbF9uYW1lc3BhY2VzKCk7CisKKyAgIGZvcihzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBvbGROYW1lc3BhY2VNYXBJdCA9IG9sZE5hbWVzcGFjZU1hcC5iZWdpbigpOworICAgICAgICAgb2xkTmFtZXNwYWNlTWFwSXQgIT0gb2xkTmFtZXNwYWNlTWFwLmVuZCgpOworICAgICAgICAgb2xkTmFtZXNwYWNlTWFwSXQrKykKKyAgIHsKKyAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIG5ld05hbWVzcGFjZU1hcEl0ID0gbmV3TmFtZXNwYWNlTWFwLmZpbmQob2xkTmFtZXNwYWNlTWFwSXQtPmZpcnN0KTsKKyAgICAgIGlmKG5ld05hbWVzcGFjZU1hcEl0ID09IG5ld05hbWVzcGFjZU1hcC5lbmQoKSkKKyAgICAgIHsKKyAgICAgICAgIHRocmlmdF9hdWRpdF93YXJuaW5nKDEsICJMYW5ndWFnZSAlcyBub3QgZm91bmQgaW4gbmV3IHRocmlmdCBmaWxlXG4iLCAob2xkTmFtZXNwYWNlTWFwSXQtPmZpcnN0KS5jX3N0cigpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYoKG5ld05hbWVzcGFjZU1hcEl0LT5zZWNvbmQpICE9IG9sZE5hbWVzcGFjZU1hcEl0LT5zZWNvbmQpCisgICAgICB7CisgICAgICAgICB0aHJpZnRfYXVkaXRfd2FybmluZygxLCAiTmFtZXNwYWNlICVzIGNoYW5nZWQgaW4gbmV3IHRocmlmdCBmaWxlXG4iLCAob2xkTmFtZXNwYWNlTWFwSXQtPnNlY29uZCkuY19zdHIoKSk7CisgICAgICB9CisgICB9Cit9CisKK3ZvaWQgY29tcGFyZV9lbnVtX3ZhbHVlcyh0X2VudW0qIG5ld0VudW0sdF9lbnVtKiBvbGRFbnVtKQoreworICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4mIG9sZEVudW1WYWx1ZXMgPSBvbGRFbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgICBmb3Ioc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIG9sZEVudW1WYWx1ZXNJdCA9IG9sZEVudW1WYWx1ZXMuYmVnaW4oKTsKKyAgICAgICAgIG9sZEVudW1WYWx1ZXNJdCAhPSBvbGRFbnVtVmFsdWVzLmVuZCgpOworICAgICAgICAgb2xkRW51bVZhbHVlc0l0KyspCisgICB7CisgICAgICBpbnQgZW51bVZhbHVlID0gKCpvbGRFbnVtVmFsdWVzSXQpLT5nZXRfdmFsdWUoKTsKKyAgICAgIHRfZW51bV92YWx1ZSogbmV3RW51bVZhbHVlID0gbmV3RW51bS0+Z2V0X2NvbnN0YW50X2J5X3ZhbHVlKGVudW1WYWx1ZSk7CisgICAgICBpZihuZXdFbnVtVmFsdWUgIT0gTlVMTCkKKyAgICAgIHsKKyAgICAgICAgIHN0ZDo6c3RyaW5nIGVudW1OYW1lID0gKCpvbGRFbnVtVmFsdWVzSXQpLT5nZXRfbmFtZSgpOworICAgICAgICAgaWYoZW51bU5hbWUgIT0gbmV3RW51bVZhbHVlLT5nZXRfbmFtZSgpKQorICAgICAgICAgeworICAgICAgICAgICAgdGhyaWZ0X2F1ZGl0X3dhcm5pbmcoMSwgIk5hbWUgb2YgdGhlIHZhbHVlICVkIGNoYW5nZWQgaW4gZW51bSAlc1xuIiwgZW51bVZhbHVlLCBvbGRFbnVtLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgdGhyaWZ0X2F1ZGl0X2ZhaWx1cmUoIkVudW0gdmFsdWUgJWQgbWlzc2luZyBpbiAlc1xuIiwgZW51bVZhbHVlLCBvbGRFbnVtLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICAgICAgfQorCisgICB9Cit9CisKK3ZvaWQgY29tcGFyZV9lbnVtcyhjb25zdCBzdGQ6OnZlY3Rvcjx0X2VudW0qPiYgbmV3RW51bUxpc3QsIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZW51bSo+JiBvbGRFbnVtTGlzdCkKK3sKKyAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLHRfZW51bSo+IG5ld0VudW1NYXA7CisgICBzdGQ6OnZlY3Rvcjx0X2VudW0qPjo6Y29uc3RfaXRlcmF0b3IgbmV3RW51bUl0OworICAgZm9yKG5ld0VudW1JdCA9IG5ld0VudW1MaXN0LmJlZ2luKCk7IG5ld0VudW1JdCAhPSBuZXdFbnVtTGlzdC5lbmQoKTsgbmV3RW51bUl0KyspCisgICB7CisgICAgICBuZXdFbnVtTWFwWygqbmV3RW51bUl0KS0+Z2V0X25hbWUoKV0gPSAqbmV3RW51bUl0OworICAgfQorICAgc3RkOjp2ZWN0b3I8dF9lbnVtKj46OmNvbnN0X2l0ZXJhdG9yIG9sZEVudW1JdDsKKyAgIGZvcihvbGRFbnVtSXQgPSBvbGRFbnVtTGlzdC5iZWdpbigpOyBvbGRFbnVtSXQgIT0gb2xkRW51bUxpc3QuZW5kKCk7IG9sZEVudW1JdCsrKQorICAgeworICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsdF9lbnVtKj46Oml0ZXJhdG9yIG5ld0VudW1NYXBJdDsKKyAgICAgIG5ld0VudW1NYXBJdCA9IG5ld0VudW1NYXAuZmluZCgoKm9sZEVudW1JdCktPmdldF9uYW1lKCkpOworCisgICAgICBpZihuZXdFbnVtTWFwSXQgPT0gbmV3RW51bU1hcC5lbmQoKSkKKyAgICAgIHsKKyAgICAgICAgIHRocmlmdF9hdWRpdF93YXJuaW5nKDEsICJFbnVtICVzIG5vdCBmb3VuZCBpbiBuZXcgdGhyaWZ0IGZpbGVcbiIsKCpvbGRFbnVtSXQpLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgY29tcGFyZV9lbnVtX3ZhbHVlcyhuZXdFbnVtTWFwSXQtPnNlY29uZCwgKm9sZEVudW1JdCk7CisgICAgICB9CisgICB9Cit9CisKKy8vVGhpcyBmdW5jdGlvbiByZXR1cm5zICd0cnVlJyBpZiB0aGUgdHdvIGFyZ3VlbWVudHMgYXJlIG9mIHNhbWUgdHlwZXMuCisvL1JldHVybnMgZmFsc2UgaWYgdGhleSBhcmUgb2YgZGlmZmVyZW50IHR5cGUKK2Jvb2wgY29tcGFyZV90eXBlKHRfdHlwZSogbmV3VHlwZSwgdF90eXBlKiBvbGRUeXBlKQoreworICAgLy9Db21wYXJpbmcgbmFtZXMgb2YgdHdvIHR5cGVzIHdpbGwgd29yayB3aGVuIHRoZSBuZXdUeXBlIGFuZCBvbGRUeXBlIGFyZSBiYXNpYyB0eXBlcyBvciBzdHJ1Y3RzIG9yIGVudW1zLgorICAgLy9Ib3dldmVyLCB3aGVuIHRoZXkgYXJlIGNvbnRhaW5lcnMsIGdldF9uYW1lKCkgcmV0dXJucyBlbXB0eSBmb3Igd2hpY2ggd2UgaGF2ZSB0byBjb21wYXJlIHRoZSB0eXBlIG9mCisgICAvL3RoZWlyIGVsZW1lbnRzIGFzIHdlbGwuCisgICBpZigobmV3VHlwZS0+Z2V0X25hbWUoKSkuZW1wdHkoKSAmJiAob2xkVHlwZS0+Z2V0X25hbWUoKSkuZW1wdHkoKSkKKyAgIHsKKworICAgICAgaWYobmV3VHlwZS0+aXNfbGlzdCgpICYmIG9sZFR5cGUtPmlzX2xpc3QoKSkKKyAgICAgIHsKKyAgICAgICAgIHRfdHlwZSogbmV3RWxlbWVudFR5cGUgPSAoKHRfbGlzdCopbmV3VHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgICAgIHRfdHlwZSogb2xkRWxlbWVudFR5cGUgPSAoKHRfbGlzdCopb2xkVHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgICAgIHJldHVybiBjb21wYXJlX3R5cGUobmV3RWxlbWVudFR5cGUsIG9sZEVsZW1lbnRUeXBlKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYobmV3VHlwZS0+aXNfbWFwKCkgJiYgb2xkVHlwZS0+aXNfbWFwKCkpCisgICAgICB7CisgICAgICAgICB0X3R5cGUqIG5ld0tleVR5cGUgPSAoKHRfbWFwKiluZXdUeXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgICAgICB0X3R5cGUqIG9sZEtleVR5cGUgPSAoKHRfbWFwKilvbGRUeXBlKS0+Z2V0X2tleV90eXBlKCk7CisKKyAgICAgICAgIHRfdHlwZSogbmV3VmFsVHlwZSA9ICgodF9tYXAqKW5ld1R5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICAgICAgIHRfdHlwZSogb2xkVmFsVHlwZSA9ICgodF9tYXAqKW9sZFR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKworICAgICAgICAgcmV0dXJuIChjb21wYXJlX3R5cGUobmV3S2V5VHlwZSwgb2xkS2V5VHlwZSkgJiYgY29tcGFyZV90eXBlKG5ld1ZhbFR5cGUsIG9sZFZhbFR5cGUpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYobmV3VHlwZS0+aXNfc2V0KCkgJiYgb2xkVHlwZS0+aXNfc2V0KCkpCisgICAgICB7CisgICAgICAgICB0X3R5cGUqIG5ld0VsZW1lbnRUeXBlID0gKCh0X3NldCopbmV3VHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgICAgIHRfdHlwZSogb2xkRWxlbWVudFR5cGUgPSAoKHRfc2V0KilvbGRUeXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgICAgICAgcmV0dXJuIGNvbXBhcmVfdHlwZShuZXdFbGVtZW50VHlwZSwgb2xkRWxlbWVudFR5cGUpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgfQorICAgZWxzZSBpZihuZXdUeXBlLT5nZXRfbmFtZSgpID09IG9sZFR5cGUtPmdldF9uYW1lKCkpCisgICB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgIH0KKyAgIGVsc2UKKyAgIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgIH0KK30KKworYm9vbCBjb21wYXJlX3BhaXIoc3RkOjpwYWlyPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4gbmV3TWFwUGFpciwgc3RkOjpwYWlyPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4gb2xkTWFwUGFpcikKK3sKKyAgIHJldHVybiBjb21wYXJlX2RlZmF1bHRzKG5ld01hcFBhaXIuZmlyc3QsIG9sZE1hcFBhaXIuZmlyc3QpICYmIGNvbXBhcmVfZGVmYXVsdHMobmV3TWFwUGFpci5zZWNvbmQsIG9sZE1hcFBhaXIuc2Vjb25kKTsKK30KKworLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zICd0cnVlJyBpZiB0aGUgZGVmYXVsdCB2YWx1ZXMgYXJlIHNhbWUuIFJldHVybnMgZmFsc2UgaWYgdGhleSBhcmUgZGlmZmVyZW50LgorYm9vbCBjb21wYXJlX2RlZmF1bHRzKHRfY29uc3RfdmFsdWUqIG5ld1N0cnVjdERlZmF1bHQsIHRfY29uc3RfdmFsdWUqIG9sZFN0cnVjdERlZmF1bHQpCit7CisgICBpZihuZXdTdHJ1Y3REZWZhdWx0ID09IE5VTEwgJiYgb2xkU3RydWN0RGVmYXVsdCA9PSBOVUxMKSByZXR1cm4gdHJ1ZTsKKyAgIGVsc2UgaWYobmV3U3RydWN0RGVmYXVsdCA9PSBOVUxMICYmIG9sZFN0cnVjdERlZmF1bHQgIT0gTlVMTCkgcmV0dXJuIGZhbHNlOworICAgZWxzZSBpZiAobmV3U3RydWN0RGVmYXVsdCAhPSBOVUxMICYmIG9sZFN0cnVjdERlZmF1bHQgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworCisgICBpZihuZXdTdHJ1Y3REZWZhdWx0LT5nZXRfdHlwZSgpICE9IG9sZFN0cnVjdERlZmF1bHQtPmdldF90eXBlKCkpCisgICB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICB9CisKKyAgIHN3aXRjaChuZXdTdHJ1Y3REZWZhdWx0LT5nZXRfdHlwZSgpKQorICAgeworICAgICAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSOgorICAgICAgICAgcmV0dXJuIChuZXdTdHJ1Y3REZWZhdWx0LT5nZXRfaW50ZWdlcigpID09IG9sZFN0cnVjdERlZmF1bHQtPmdldF9pbnRlZ2VyKCkpOworICAgICAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9ET1VCTEU6CisgICAgICAgICByZXR1cm4gKG5ld1N0cnVjdERlZmF1bHQtPmdldF9kb3VibGUoKSA9PSBvbGRTdHJ1Y3REZWZhdWx0LT5nZXRfZG91YmxlKCkpOworICAgICAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9TVFJJTkc6CisgICAgICAgICByZXR1cm4gKG5ld1N0cnVjdERlZmF1bHQtPmdldF9zdHJpbmcoKSA9PSBvbGRTdHJ1Y3REZWZhdWx0LT5nZXRfc3RyaW5nKCkpOworICAgICAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9MSVNUOgorICAgICAgICAgeworICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiBvbGREZWZhdWx0TGlzdCA9IG9sZFN0cnVjdERlZmF1bHQtPmdldF9saXN0KCk7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIG5ld0RlZmF1bHRMaXN0ID0gbmV3U3RydWN0RGVmYXVsdC0+Z2V0X2xpc3QoKTsKKyAgICAgICAgICAgIGJvb2wgZGVmYXVsdFZhbHVlc0NvbXBhcmUgPSAob2xkRGVmYXVsdExpc3Quc2l6ZSgpID09IG5ld0RlZmF1bHRMaXN0LnNpemUoKSk7CisKKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWVzQ29tcGFyZSAmJiBzdGQ6OmVxdWFsKG5ld0RlZmF1bHRMaXN0LmJlZ2luKCksIG5ld0RlZmF1bHRMaXN0LmVuZCgpLCBvbGREZWZhdWx0TGlzdC5iZWdpbigpLCBjb21wYXJlX2RlZmF1bHRzKTsKKyAgICAgICAgIH0KKyAgICAgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfTUFQOgorICAgICAgICAgeworICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiBuZXdNYXAgPSBuZXdTdHJ1Y3REZWZhdWx0LT5nZXRfbWFwKCk7CisgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+IG9sZE1hcCA9IG9sZFN0cnVjdERlZmF1bHQtPmdldF9tYXAoKTsKKworICAgICAgICAgICAgYm9vbCBkZWZhdWx0VmFsdWVzQ29tcGFyZSA9IChvbGRNYXAuc2l6ZSgpID09IG5ld01hcC5zaXplKCkpOworCisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlc0NvbXBhcmUgJiYgc3RkOjplcXVhbChuZXdNYXAuYmVnaW4oKSwgbmV3TWFwLmVuZCgpLCBvbGRNYXAuYmVnaW4oKSwgY29tcGFyZV9wYWlyKTsKKyAgICAgICAgIH0KKyAgICAgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfSURFTlRJRklFUjoKKyAgICAgICAgIHJldHVybiAobmV3U3RydWN0RGVmYXVsdC0+Z2V0X2lkZW50aWZpZXIoKSA9PSBvbGRTdHJ1Y3REZWZhdWx0LT5nZXRfaWRlbnRpZmllcigpKTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgICByZXR1cm4gZmFsc2U7CisgICB9CisKK30KKwordm9pZCBjb21wYXJlX3N0cnVjdF9maWVsZCh0X2ZpZWxkKiBuZXdGaWVsZCwgdF9maWVsZCogb2xkRmllbGQsIHN0ZDo6c3RyaW5nIG9sZFN0cnVjdE5hbWUpCit7CisgICB0X3R5cGUqIG5ld0ZpZWxkVHlwZSA9IG5ld0ZpZWxkLT5nZXRfdHlwZSgpOworICAgdF90eXBlKiBvbGRGaWVsZFR5cGUgPSBvbGRGaWVsZC0+Z2V0X3R5cGUoKTsKKyAgIGlmKCFjb21wYXJlX3R5cGUobmV3RmllbGRUeXBlLCBvbGRGaWVsZFR5cGUpKQorICAgeworICAgICAgdGhyaWZ0X2F1ZGl0X2ZhaWx1cmUoIlN0cnVjdCBGaWVsZCBUeXBlIENoYW5nZWQgZm9yIElkID0gJWQgaW4gJXMgXG4iLCBuZXdGaWVsZC0+Z2V0X2tleSgpLCBvbGRTdHJ1Y3ROYW1lLmNfc3RyKCkpOworICAgfQorCisgICAvLyBBIFN0cnVjdCBtZW1iZXIgY2FuIGJlIG9wdGlvbmFsIGlmIGl0IGlzIG1lbnRpb25lZCBleHBsaWNpdGx5LCBvciBpZiBpdCBpcyBhc3NpZ25lZCB3aXRoIGRlZmF1bHQgdmFsdWVzLgorICAgYm9vbCBuZXdTdHJ1Y3RGaWVsZE9wdGlvbmFsID0gKG5ld0ZpZWxkLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCk7CisgICBib29sIG9sZFN0cnVjdEZpZWxkT3B0aW9uYWwgPSAob2xkRmllbGQtPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKTsKKworICAgaWYobmV3U3RydWN0RmllbGRPcHRpb25hbCAhPSBvbGRTdHJ1Y3RGaWVsZE9wdGlvbmFsKQorICAgeworICAgICAgdGhyaWZ0X2F1ZGl0X2ZhaWx1cmUoIlN0cnVjdCBGaWVsZCBSZXF1aXJlZG5lc3MgQ2hhbmdlZCBmb3IgSWQgPSAlZCBpbiAlcyBcbiIsIG5ld0ZpZWxkLT5nZXRfa2V5KCksIG9sZFN0cnVjdE5hbWUuY19zdHIoKSk7CisgICB9CisgICBpZihuZXdTdHJ1Y3RGaWVsZE9wdGlvbmFsIHx8IG9sZFN0cnVjdEZpZWxkT3B0aW9uYWwpCisgICB7CisgICAgICBpZighY29tcGFyZV9kZWZhdWx0cyhuZXdGaWVsZC0+Z2V0X3ZhbHVlKCksIG9sZEZpZWxkLT5nZXRfdmFsdWUoKSkpCisgICAgICB7CisgICAgICAgICB0aHJpZnRfYXVkaXRfd2FybmluZygxLCAiRGVmYXVsdCB2YWx1ZSBjaGFuZ2VkIGZvciBJZCA9ICVkIGluICVzIFxuIiwgbmV3RmllbGQtPmdldF9rZXkoKSwgb2xkU3RydWN0TmFtZS5jX3N0cigpKTsKKyAgICAgIH0KKyAgIH0KKworICAgc3RkOjpzdHJpbmcgZmllbGROYW1lID0gbmV3RmllbGQtPmdldF9uYW1lKCk7CisgICBpZihmaWVsZE5hbWUgIT0gb2xkRmllbGQtPmdldF9uYW1lKCkpCisgICB7CisgICAgICB0aHJpZnRfYXVkaXRfd2FybmluZygxLCAiU3RydWN0IGZpZWxkIG5hbWUgY2hhbmdlZCBmb3IgSWQgPSAlZCBpbiAlc1xuIiwgbmV3RmllbGQtPmdldF9rZXkoKSwgb2xkU3RydWN0TmFtZS5jX3N0cigpKTsKKyAgIH0KKworfQorCit2b2lkIGNvbXBhcmVfc2luZ2xlX3N0cnVjdCh0X3N0cnVjdCogbmV3U3RydWN0LCB0X3N0cnVjdCogb2xkU3RydWN0LCBjb25zdCBzdGQ6OnN0cmluZyYgb2xkU3RydWN0TmFtZSA9IHN0ZDo6c3RyaW5nKCkpCit7CisgICBzdGQ6OnN0cmluZyBzdHJ1Y3ROYW1lID0gb2xkU3RydWN0TmFtZS5lbXB0eSgpID8gb2xkU3RydWN0LT5nZXRfbmFtZSgpIDogb2xkU3RydWN0TmFtZTsKKyAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgb2xkU3RydWN0TWVtYmVyc0luSWRPcmRlciA9IG9sZFN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIG5ld1N0cnVjdE1lbWJlcnNJbklkT3JkZXIgPSBuZXdTdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICAgc3RkOjp2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBvbGRTdHJ1Y3RNZW1iZXJJdCA9IG9sZFN0cnVjdE1lbWJlcnNJbklkT3JkZXIuYmVnaW4oKTsKKyAgIHN0ZDo6dmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbmV3U3RydWN0TWVtYmVySXQgPSBuZXdTdHJ1Y3RNZW1iZXJzSW5JZE9yZGVyLmJlZ2luKCk7CisKKyAgIC8vIFNpbmNlIHdlIGhhdmUgdGhlIHN0cnVjdCBtZW1iZXJzIGluIHRoZWlyIElEIG9yZGVyLCBjb21wYXJpbmcgdGhlaXIgSURzIGNhbiBiZSBkb25lIGJ5IHRyYXZlcnNpbmcgdGhlIHR3byBtZW1iZXIKKyAgIC8vIGxpc3RzIHRvZ2V0aGVyLgorICAgd2hpbGUoIShvbGRTdHJ1Y3RNZW1iZXJJdCA9PSBvbGRTdHJ1Y3RNZW1iZXJzSW5JZE9yZGVyLmVuZCgpICYmIG5ld1N0cnVjdE1lbWJlckl0ID09IG5ld1N0cnVjdE1lbWJlcnNJbklkT3JkZXIuZW5kKCkpKQorICAgeworICAgICAgaWYobmV3U3RydWN0TWVtYmVySXQgPT0gbmV3U3RydWN0TWVtYmVyc0luSWRPcmRlci5lbmQoKSAmJiBvbGRTdHJ1Y3RNZW1iZXJJdCAhPSBvbGRTdHJ1Y3RNZW1iZXJzSW5JZE9yZGVyLmVuZCgpKQorICAgICAgeworICAgICAgICAgLy8gQSBmaWVsZCBJRCBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIGVuZC4KKyAgICAgICAgIHRocmlmdF9hdWRpdF9mYWlsdXJlKCJTdHJ1Y3QgRmllbGQgcmVtb3ZlZCBmb3IgSWQgPSAlZCBpbiAlcyBcbiIsICgqb2xkU3RydWN0TWVtYmVySXQpLT5nZXRfa2V5KCksIHN0cnVjdE5hbWUuY19zdHIoKSk7CisgICAgICAgICBvbGRTdHJ1Y3RNZW1iZXJJdCsrOworICAgICAgfQorICAgICAgZWxzZSBpZihuZXdTdHJ1Y3RNZW1iZXJJdCAhPSBuZXdTdHJ1Y3RNZW1iZXJzSW5JZE9yZGVyLmVuZCgpICYmIG9sZFN0cnVjdE1lbWJlckl0ID09IG9sZFN0cnVjdE1lbWJlcnNJbklkT3JkZXIuZW5kKCkpCisgICAgICB7CisgICAgICAgICAvL05ldyBmaWVsZCBJRCBoYXMgYmVlbiBhZGRlZCB0byB0aGUgZW5kLgorICAgICAgICAgaWYoKCpuZXdTdHJ1Y3RNZW1iZXJJdCktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKQorICAgICAgICAgeworICAgICAgICAgICAgdGhyaWZ0X2F1ZGl0X2ZhaWx1cmUoIlJlcXVpcmVkIFN0cnVjdCBGaWVsZCBBZGRlZCBmb3IgSWQgPSAlZCBpbiAlcyBcbiIsICgqbmV3U3RydWN0TWVtYmVySXQpLT5nZXRfa2V5KCksIHN0cnVjdE5hbWUuY19zdHIoKSk7CisgICAgICAgICB9CisgICAgICAgICBuZXdTdHJ1Y3RNZW1iZXJJdCsrOworICAgICAgfQorICAgICAgZWxzZSBpZigoKm5ld1N0cnVjdE1lbWJlckl0KS0+Z2V0X2tleSgpID09ICgqb2xkU3RydWN0TWVtYmVySXQpLT5nZXRfa2V5KCkpCisgICAgICB7CisgICAgICAgICAvL0ZpZWxkIElEIGZvdW5kIGluIGJvdGggc3RydWN0cy4gQ29tcGFyZSBmaWVsZCB0eXBlcywgZGVmYXVsdCB2YWx1ZXMuCisgICAgICAgICBjb21wYXJlX3N0cnVjdF9maWVsZCgqbmV3U3RydWN0TWVtYmVySXQsICpvbGRTdHJ1Y3RNZW1iZXJJdCwgc3RydWN0TmFtZSk7CisKKyAgICAgICAgIG5ld1N0cnVjdE1lbWJlckl0Kys7CisgICAgICAgICBvbGRTdHJ1Y3RNZW1iZXJJdCsrOworICAgICAgfQorICAgICAgZWxzZSBpZigoKm5ld1N0cnVjdE1lbWJlckl0KS0+Z2V0X2tleSgpIDwgKCpvbGRTdHJ1Y3RNZW1iZXJJdCktPmdldF9rZXkoKSkKKyAgICAgIHsKKyAgICAgICAgIC8vTmV3IEZpZWxkIElkIGlzIGluc2VydGVkIGluIGJldHdlZW4KKyAgICAgICAgIC8vQWRkaW5nIGZpZWxkcyB0byBzdHJ1Y3QgaXMgZmluZSwgYnV0IGFkZGluZyB0aGVtIGluIHRoZSBtaWRkbGUgaXMgc3VzcGljaW91cy4gRXJyb3IhIQorICAgICAgICAgdGhyaWZ0X2F1ZGl0X2ZhaWx1cmUoIlN0cnVjdCBmaWVsZCBpcyBhZGRlZCBpbiB0aGUgbWlkZGxlIHdpdGggSWQgPSAlZCBpbiAlc1xuIiwgICgqbmV3U3RydWN0TWVtYmVySXQpLT5nZXRfa2V5KCksICBzdHJ1Y3ROYW1lLmNfc3RyKCkpOworICAgICAgICAgbmV3U3RydWN0TWVtYmVySXQrKzsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYoKCpuZXdTdHJ1Y3RNZW1iZXJJdCktPmdldF9rZXkoKSA+ICgqb2xkU3RydWN0TWVtYmVySXQpLT5nZXRfa2V5KCkpCisgICAgICB7CisgICAgICAgICAvL0EgZmllbGQgaXMgZGVsZXRlZCBpbiBuZXdTdHJ1Y3QuCisgICAgICAgICB0aHJpZnRfYXVkaXRfZmFpbHVyZSgiU3RydWN0IEZpZWxkIHJlbW92ZWQgZm9yIElkID0gJWQgaW4gJXMgXG4iLCAgKCpvbGRTdHJ1Y3RNZW1iZXJJdCktPmdldF9rZXkoKSwgc3RydWN0TmFtZS5jX3N0cigpKTsKKyAgICAgICAgIG9sZFN0cnVjdE1lbWJlckl0Kys7CisgICAgICB9CisKKyAgIH0KK30KKwordm9pZCBjb21wYXJlX3N0cnVjdHMoY29uc3Qgc3RkOjp2ZWN0b3I8dF9zdHJ1Y3QqPiYgbmV3U3RydWN0TGlzdCwgY29uc3Qgc3RkOjp2ZWN0b3I8dF9zdHJ1Y3QqPiYgb2xkU3RydWN0TGlzdCkKK3sKKyAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLHRfc3RydWN0Kj4gbmV3U3RydWN0TWFwOworICAgc3RkOjp2ZWN0b3I8dF9zdHJ1Y3QqPjo6Y29uc3RfaXRlcmF0b3IgbmV3U3RydWN0TGlzdEl0OworICAgZm9yKG5ld1N0cnVjdExpc3RJdCA9IG5ld1N0cnVjdExpc3QuYmVnaW4oKTsgbmV3U3RydWN0TGlzdEl0ICE9IG5ld1N0cnVjdExpc3QuZW5kKCk7IG5ld1N0cnVjdExpc3RJdCsrKQorICAgeworICAgICAgbmV3U3RydWN0TWFwWygqbmV3U3RydWN0TGlzdEl0KS0+Z2V0X25hbWUoKV0gPSAqbmV3U3RydWN0TGlzdEl0OworICAgfQorCisgICBzdGQ6OnZlY3Rvcjx0X3N0cnVjdCo+Ojpjb25zdF9pdGVyYXRvciBvbGRTdHJ1Y3RMaXN0SXQ7CisgICBmb3Iob2xkU3RydWN0TGlzdEl0ID0gb2xkU3RydWN0TGlzdC5iZWdpbigpOyBvbGRTdHJ1Y3RMaXN0SXQgIT0gb2xkU3RydWN0TGlzdC5lbmQoKTsgb2xkU3RydWN0TGlzdEl0KyspCisgICB7CisgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgdF9zdHJ1Y3QqPjo6aXRlcmF0b3IgbmV3U3RydWN0TWFwSXQ7CisgICAgICBuZXdTdHJ1Y3RNYXBJdCA9IG5ld1N0cnVjdE1hcC5maW5kKCgqb2xkU3RydWN0TGlzdEl0KS0+Z2V0X25hbWUoKSk7CisgICAgICBpZihuZXdTdHJ1Y3RNYXBJdCA9PSBuZXdTdHJ1Y3RNYXAuZW5kKCkpCisgICAgICB7CisgICAgICAgICB0aHJpZnRfYXVkaXRfZmFpbHVyZSgiU3RydWN0ICVzIG5vdCBmb3VuZCBpbiBuZXcgdGhyaWZ0IGZpbGVcbiIsICgqb2xkU3RydWN0TGlzdEl0KS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIGNvbXBhcmVfc2luZ2xlX3N0cnVjdChuZXdTdHJ1Y3RNYXBJdC0+c2Vjb25kLCAqb2xkU3RydWN0TGlzdEl0KTsKKyAgICAgIH0KKyAgIH0KKworfQorCit2b2lkIGNvbXBhcmVfc2luZ2xlX2Z1bmN0aW9uKHRfZnVuY3Rpb24qIG5ld0Z1bmN0aW9uLCB0X2Z1bmN0aW9uKiBvbGRGdW5jdGlvbikKK3sKKyAgIHRfdHlwZSogbmV3RnVuY3Rpb25SZXR1cm5UeXBlID0gbmV3RnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7CisKKyAgIGlmKG5ld0Z1bmN0aW9uLT5pc19vbmV3YXkoKSAhPSBvbGRGdW5jdGlvbi0+aXNfb25ld2F5KCkpCisgICB7CisgICAgICB0aHJpZnRfYXVkaXRfZmFpbHVyZSgiT25ld2F5IGF0dHJpYnV0ZSBjaGFuZ2VkIGZvciBmdW5jdGlvbiAlc1xuIixvbGRGdW5jdGlvbi0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgIH0KKyAgIGlmKCFjb21wYXJlX3R5cGUobmV3RnVuY3Rpb25SZXR1cm5UeXBlLCBvbGRGdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkpCisgICB7CisgICAgICB0aHJpZnRfYXVkaXRfZmFpbHVyZSgiUmV0dXJuIHR5cGUgY2hhbmdlZCBmb3IgZnVuY3Rpb24gJXNcbiIsb2xkRnVuY3Rpb24tPmdldF9uYW1lKCkuY19zdHIoKSk7CisgICB9CisKKyAgIC8vQ29tcGFyZSBmdW5jdGlvbiBhcmd1bWVudHMuCisgICBjb21wYXJlX3NpbmdsZV9zdHJ1Y3QobmV3RnVuY3Rpb24tPmdldF9hcmdsaXN0KCksIG9sZEZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKTsKKyAgIHN0ZDo6c3RyaW5nIGV4Y2VwdGlvbk5hbWUgPSBvbGRGdW5jdGlvbi0+Z2V0X25hbWUoKTsKKyAgIGV4Y2VwdGlvbk5hbWUgKz0gIl9leGNlcHRpb24iOworICAgY29tcGFyZV9zaW5nbGVfc3RydWN0KG5ld0Z1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCksIG9sZEZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCksIGV4Y2VwdGlvbk5hbWUpOworfQorCit2b2lkIGNvbXBhcmVfZnVuY3Rpb25zKGNvbnN0IHN0ZDo6dmVjdG9yPHRfZnVuY3Rpb24qPiYgbmV3RnVuY3Rpb25MaXN0LCBjb25zdCBzdGQ6OnZlY3Rvcjx0X2Z1bmN0aW9uKj4mIG9sZEZ1bmN0aW9uTGlzdCkKK3sKKyAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB0X2Z1bmN0aW9uKj4gbmV3RnVuY3Rpb25NYXA7CisgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgdF9mdW5jdGlvbio+OjppdGVyYXRvciBuZXdGdW5jdGlvbk1hcEl0OworICAgZm9yKHN0ZDo6dmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgbmV3RnVuY3Rpb25JdCA9IG5ld0Z1bmN0aW9uTGlzdC5iZWdpbigpOworICAgICAgICAgbmV3RnVuY3Rpb25JdCAhPSBuZXdGdW5jdGlvbkxpc3QuZW5kKCk7CisgICAgICAgICBuZXdGdW5jdGlvbkl0KyspCisgICB7CisgICAgICBuZXdGdW5jdGlvbk1hcFsoKm5ld0Z1bmN0aW9uSXQpLT5nZXRfbmFtZSgpXSA9ICpuZXdGdW5jdGlvbkl0OworICAgfQorCisgICBmb3Ioc3RkOjp2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBvbGRGdW5jdGlvbkl0ID0gb2xkRnVuY3Rpb25MaXN0LmJlZ2luKCk7CisgICAgICAgICBvbGRGdW5jdGlvbkl0ICE9IG9sZEZ1bmN0aW9uTGlzdC5lbmQoKTsKKyAgICAgICAgIG9sZEZ1bmN0aW9uSXQrKykKKyAgIHsKKyAgICAgIG5ld0Z1bmN0aW9uTWFwSXQgPSBuZXdGdW5jdGlvbk1hcC5maW5kKCgqb2xkRnVuY3Rpb25JdCktPmdldF9uYW1lKCkpOworICAgICAgaWYobmV3RnVuY3Rpb25NYXBJdCA9PSBuZXdGdW5jdGlvbk1hcC5lbmQoKSkKKyAgICAgIHsKKyAgICAgICAgIHRocmlmdF9hdWRpdF9mYWlsdXJlKCJOZXcgVGhyaWZ0IEZpbGUgaGFzIG1pc3NpbmcgZnVuY3Rpb24gJXNcbiIsKCpvbGRGdW5jdGlvbkl0KS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgLy9GdW5jdGlvbiBpcyBmb3VuZCBpbiBib3RoIHRocmlmdCBmaWxlcy4gQ29tcGFyZSByZXR1cm4gdHlwZSBhbmQgYXJndW1lbnQgbGlzdAorICAgICAgICAgY29tcGFyZV9zaW5nbGVfZnVuY3Rpb24obmV3RnVuY3Rpb25NYXBJdC0+c2Vjb25kLCAqb2xkRnVuY3Rpb25JdCk7CisgICAgICB9CisgICB9CisKK30KKwordm9pZCBjb21wYXJlX3NlcnZpY2VzKGNvbnN0IHN0ZDo6dmVjdG9yPHRfc2VydmljZSo+JiBuZXdTZXJ2aWNlcywgY29uc3Qgc3RkOjp2ZWN0b3I8dF9zZXJ2aWNlKj4mIG9sZFNlcnZpY2VzKQoreworICAgc3RkOjp2ZWN0b3I8dF9zZXJ2aWNlKj46OmNvbnN0X2l0ZXJhdG9yIG9sZFNlcnZpY2VJdDsKKworICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHRfc2VydmljZSo+IG5ld1NlcnZpY2VNYXA7CisgICBmb3Ioc3RkOjp2ZWN0b3I8dF9zZXJ2aWNlKj46OmNvbnN0X2l0ZXJhdG9yIG5ld1NlcnZpY2VJdCA9IG5ld1NlcnZpY2VzLmJlZ2luKCk7CisgICAgICAgICBuZXdTZXJ2aWNlSXQgIT0gbmV3U2VydmljZXMuZW5kKCk7CisgICAgICAgICBuZXdTZXJ2aWNlSXQrKykKKyAgIHsKKyAgICAgIG5ld1NlcnZpY2VNYXBbKCpuZXdTZXJ2aWNlSXQpLT5nZXRfbmFtZSgpXSA9ICpuZXdTZXJ2aWNlSXQ7CisgICB9CisKKworICAgZm9yKG9sZFNlcnZpY2VJdCA9IG9sZFNlcnZpY2VzLmJlZ2luKCk7IG9sZFNlcnZpY2VJdCAhPSBvbGRTZXJ2aWNlcy5lbmQoKTsgb2xkU2VydmljZUl0KyspCisgICB7CisgICAgICBjb25zdCBzdGQ6OnN0cmluZyBvbGRTZXJ2aWNlTmFtZSA9ICgqb2xkU2VydmljZUl0KS0+Z2V0X25hbWUoKTsKKyAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB0X3NlcnZpY2UqPjo6aXRlcmF0b3IgbmV3U2VydmljZU1hcEl0ID0gbmV3U2VydmljZU1hcC5maW5kKG9sZFNlcnZpY2VOYW1lKTsKKworICAgICAgaWYobmV3U2VydmljZU1hcEl0ID09IG5ld1NlcnZpY2VNYXAuZW5kKCkpCisgICAgICB7CisgICAgICAgICB0aHJpZnRfYXVkaXRfZmFpbHVyZSgiTmV3IFRocmlmdCBmaWxlIGlzIG1pc3NpbmcgYSBzZXJ2aWNlICVzXG4iLCBvbGRTZXJ2aWNlTmFtZS5jX3N0cigpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIHRfc2VydmljZSogb2xkU2VydmljZUV4dGVuZHMgPSAoKm9sZFNlcnZpY2VJdCktPmdldF9leHRlbmRzKCk7CisgICAgICAgICB0X3NlcnZpY2UqIG5ld1NlcnZpY2VFeHRlbmRzID0gKG5ld1NlcnZpY2VNYXBJdC0+c2Vjb25kKS0+Z2V0X2V4dGVuZHMoKTsKKworICAgICAgICAgaWYob2xkU2VydmljZUV4dGVuZHMgPT0gTlVMTCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEl0IGlzIGZpbmUgdG8gYWRkIGV4dGVuZHMuIFNvIGlmIHNlcnZpY2UgaW4gb2xkZXIgdGhyaWZ0IGRpZCBub3QgaGF2ZSBhbnkgZXh0ZW5kcywgd2UgYXJlIGZpbmUuCisgICAgICAgICAgICAvLyBETyBOb3RoaW5nCisgICAgICAgICB9CisgICAgICAgICBlbHNlIGlmKG9sZFNlcnZpY2VFeHRlbmRzICE9IE5VTEwgJiYgbmV3U2VydmljZUV4dGVuZHMgPT0gTlVMTCkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIHRocmlmdF9hdWRpdF9mYWlsdXJlKCJDaGFuZ2UgaW4gU2VydmljZSBpbmhlcml0YW5jZSBmb3IgJXNcbiIsIG9sZFNlcnZpY2VOYW1lLmNfc3RyKCkpOworICAgICAgICAgfQorICAgICAgICAgZWxzZQorICAgICAgICAgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgb2xkRXh0ZW5kc05hbWUgPSBvbGRTZXJ2aWNlRXh0ZW5kcy0+Z2V0X25hbWUoKTsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5ld0V4dGVuZHNOYW1lID0gbmV3U2VydmljZUV4dGVuZHMtPmdldF9uYW1lKCk7CisKKyAgICAgICAgICAgIGlmKCBuZXdFeHRlbmRzTmFtZSAhPSBvbGRFeHRlbmRzTmFtZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIHRocmlmdF9hdWRpdF9mYWlsdXJlKCJDaGFuZ2UgaW4gU2VydmljZSBpbmhlcml0YW5jZSBmb3IgJXNcbiIsIG9sZFNlcnZpY2VOYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgfQorCisgICAgICAgICBjb21wYXJlX2Z1bmN0aW9ucygobmV3U2VydmljZU1hcEl0LT5zZWNvbmQpLT5nZXRfZnVuY3Rpb25zKCksICgqb2xkU2VydmljZUl0KS0+Z2V0X2Z1bmN0aW9ucygpKTsKKyAgICAgIH0KKworICAgfQorCit9CisKK3ZvaWQgY29tcGFyZV9jb25zdHMoY29uc3Qgc3RkOjp2ZWN0b3I8dF9jb25zdCo+JiBuZXdDb25zdCwgY29uc3Qgc3RkOjp2ZWN0b3I8dF9jb25zdCo+JiBvbGRDb25zdCkKK3sKKyAgIHN0ZDo6dmVjdG9yPHRfY29uc3QqPjo6Y29uc3RfaXRlcmF0b3IgbmV3Q29uc3RJdDsKKyAgIHN0ZDo6dmVjdG9yPHRfY29uc3QqPjo6Y29uc3RfaXRlcmF0b3Igb2xkQ29uc3RJdDsKKworICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHRfY29uc3QqPiBuZXdDb25zdE1hcDsKKworICAgZm9yKG5ld0NvbnN0SXQgPSBuZXdDb25zdC5iZWdpbigpOyBuZXdDb25zdEl0ICE9IG5ld0NvbnN0LmVuZCgpOyBuZXdDb25zdEl0KyspCisgICB7CisgICAgICBuZXdDb25zdE1hcFsoKm5ld0NvbnN0SXQpLT5nZXRfbmFtZSgpXSA9ICpuZXdDb25zdEl0OworICAgfQorCisgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgdF9jb25zdCo+Ojpjb25zdF9pdGVyYXRvciBuZXdDb25zdE1hcEl0OworICAgZm9yKG9sZENvbnN0SXQgPSBvbGRDb25zdC5iZWdpbigpOyBvbGRDb25zdEl0ICE9IG9sZENvbnN0LmVuZCgpOyBvbGRDb25zdEl0KyspCisgICB7CisgICAgICBuZXdDb25zdE1hcEl0ID0gbmV3Q29uc3RNYXAuZmluZCgoKm9sZENvbnN0SXQpLT5nZXRfbmFtZSgpKTsKKyAgICAgIGlmKG5ld0NvbnN0TWFwSXQgPT0gbmV3Q29uc3RNYXAuZW5kKCkpCisgICAgICB7CisgICAgICAgICB0aHJpZnRfYXVkaXRfd2FybmluZygxLCAiQ29uc3RhbnRzIE1pc3NpbmcgJXMgXG4iLCAoKCpvbGRDb25zdEl0KS0+Z2V0X25hbWUoKSkuY19zdHIoKSk7CisgICAgICB9CisgICAgICBlbHNlIGlmKCFjb21wYXJlX3R5cGUoKG5ld0NvbnN0TWFwSXQtPnNlY29uZCktPmdldF90eXBlKCksICgqb2xkQ29uc3RJdCktPmdldF90eXBlKCkpKQorICAgICAgeworICAgICAgICAgdGhyaWZ0X2F1ZGl0X3dhcm5pbmcoMSwgIkNvbnN0YW50ICVzIGlzIG9mIGRpZmZlcmVudCB0eXBlIFxuIiwgKCgqb2xkQ29uc3RJdCktPmdldF9uYW1lKCkpLmNfc3RyKCkpOworICAgICAgfQorICAgICAgZWxzZSBpZighY29tcGFyZV9kZWZhdWx0cygobmV3Q29uc3RNYXBJdC0+c2Vjb25kKS0+Z2V0X3ZhbHVlKCksICgqb2xkQ29uc3RJdCktPmdldF92YWx1ZSgpKSkKKyAgICAgIHsKKyAgICAgICAgIHRocmlmdF9hdWRpdF93YXJuaW5nKDEsICJDb25zdGFudCAlcyBoYXMgZGlmZmVyZW50IHZhbHVlXG4iLCAoKCpvbGRDb25zdEl0KS0+Z2V0X25hbWUoKSkuY19zdHIoKSk7CisgICAgICB9CisgICB9Cit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9hdWRpdC90X2F1ZGl0LmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9hdWRpdC90X2F1ZGl0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU3OWUzMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2F1ZGl0L3RfYXVkaXQuaApAQCAtMCwwICsxLDE0IEBACisjaWZuZGVmIFRfQVVESVRfSAorI2RlZmluZSBUX0FVRElUX0gKKwordm9pZCBjb21wYXJlX25hbWVzcGFjZSh0X3Byb2dyYW0qIG5ld1Byb2dyYW0sIHRfcHJvZ3JhbSogb2xkUHJvZ3JhbSk7Cit2b2lkIGNvbXBhcmVfZW51bXMoY29uc3Qgc3RkOjp2ZWN0b3I8dF9lbnVtKj4mIG5ld0VudW1MaXN0LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZW51bSo+JiBvbGRFbnVtTGlzdCk7Citib29sIGNvbXBhcmVfZGVmYXVsdHModF9jb25zdF92YWx1ZSogbmV3U3RydWN0RGVmYXVsdCwgdF9jb25zdF92YWx1ZSogb2xkU3RydWN0RGVmYXVsdCk7Cit2b2lkIGNvbXBhcmVfc3RydWN0cyhjb25zdCBzdGQ6OnZlY3Rvcjx0X3N0cnVjdCo+JiBuZXdTdHJ1Y3RMaXN0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9zdHJ1Y3QqPiYgb2xkU3RydWN0TGlzdCk7Cit2b2lkIGNvbXBhcmVfc2VydmljZXMoY29uc3Qgc3RkOjp2ZWN0b3I8dF9zZXJ2aWNlKj4mIG5ld1NlcnZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfc2VydmljZSo+JiBvbGRTZXJ2aWNlcyk7Cit2b2lkIGNvbXBhcmVfY29uc3RzKGNvbnN0IHN0ZDo6dmVjdG9yPHRfY29uc3QqPiYgbmV3Q29uc3QsIGNvbnN0IHN0ZDo6dmVjdG9yPHRfY29uc3QqPiYgb2xkQ29uc3QpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2NvbW1vbi5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2NvbW1vbi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTJiOWQzCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvY29tbW9uLmNjCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgInRocmlmdC9jb21tb24uaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9iYXNlX3R5cGUuaCIKKwordF90eXBlKiBnX3R5cGVfdm9pZDsKK3RfdHlwZSogZ190eXBlX3N0cmluZzsKK3RfdHlwZSogZ190eXBlX2JpbmFyeTsKK3RfdHlwZSogZ190eXBlX3NsaXN0OwordF90eXBlKiBnX3R5cGVfYm9vbDsKK3RfdHlwZSogZ190eXBlX2k4OwordF90eXBlKiBnX3R5cGVfaTE2OwordF90eXBlKiBnX3R5cGVfaTMyOwordF90eXBlKiBnX3R5cGVfaTY0OwordF90eXBlKiBnX3R5cGVfZG91YmxlOworCit2b2lkIGluaXRHbG9iYWxzKCkgeworICBnX3R5cGVfdm9pZCA9IG5ldyB0X2Jhc2VfdHlwZSgidm9pZCIsIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQpOworICBnX3R5cGVfc3RyaW5nID0gbmV3IHRfYmFzZV90eXBlKCJzdHJpbmciLCB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcpOworICBnX3R5cGVfYmluYXJ5ID0gbmV3IHRfYmFzZV90eXBlKCJzdHJpbmciLCB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcpOworICAoKHRfYmFzZV90eXBlKilnX3R5cGVfYmluYXJ5KS0+c2V0X2JpbmFyeSh0cnVlKTsKKyAgZ190eXBlX3NsaXN0ID0gbmV3IHRfYmFzZV90eXBlKCJzdHJpbmciLCB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcpOworICAoKHRfYmFzZV90eXBlKilnX3R5cGVfc2xpc3QpLT5zZXRfc3RyaW5nX2xpc3QodHJ1ZSk7CisgIGdfdHlwZV9ib29sID0gbmV3IHRfYmFzZV90eXBlKCJib29sIiwgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTCk7CisgIGdfdHlwZV9pOCA9IG5ldyB0X2Jhc2VfdHlwZSgiaTgiLCB0X2Jhc2VfdHlwZTo6VFlQRV9JOCk7CisgIGdfdHlwZV9pMTYgPSBuZXcgdF9iYXNlX3R5cGUoImkxNiIsIHRfYmFzZV90eXBlOjpUWVBFX0kxNik7CisgIGdfdHlwZV9pMzIgPSBuZXcgdF9iYXNlX3R5cGUoImkzMiIsIHRfYmFzZV90eXBlOjpUWVBFX0kzMik7CisgIGdfdHlwZV9pNjQgPSBuZXcgdF9iYXNlX3R5cGUoImk2NCIsIHRfYmFzZV90eXBlOjpUWVBFX0k2NCk7CisgIGdfdHlwZV9kb3VibGUgPSBuZXcgdF9iYXNlX3R5cGUoImRvdWJsZSIsIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRSk7Cit9CisKK3ZvaWQgY2xlYXJHbG9iYWxzKCkgeworICBkZWxldGUgZ190eXBlX3ZvaWQ7CisgIGRlbGV0ZSBnX3R5cGVfc3RyaW5nOworICBkZWxldGUgZ190eXBlX2Jvb2w7CisgIGRlbGV0ZSBnX3R5cGVfaTg7CisgIGRlbGV0ZSBnX3R5cGVfaTE2OworICBkZWxldGUgZ190eXBlX2kzMjsKKyAgZGVsZXRlIGdfdHlwZV9pNjQ7CisgIGRlbGV0ZSBnX3R5cGVfZG91YmxlOworfQorCisvKioKKyAqIFRob3NlIGFyZSBub3QgcmVhbGx5IG5lZWRlZCBmb3IgcGx1Z2lucyBidXQgY2F1c2VzIGxpbmsgZXJyb3JzIHdpdGhvdXQKKyAqLworCisvKioKKyAqIFRoZSBsb2NhdGlvbiBvZiB0aGUgbGFzdCBwYXJzZWQgZG9jdGV4dCBjb21tZW50LgorICovCitpbnQgZ19kb2N0ZXh0X2xpbmVubzsKK2ludCBnX3Byb2dyYW1fZG9jdGV4dF9saW5lbm8gPSAwOworUFJPR0RPQ1RFWFRfU1RBVFVTIGdfcHJvZ3JhbV9kb2N0ZXh0X3N0YXR1cyA9IElOVkFMSUQ7CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9jb21tb24uaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5NDg4NDYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9jb21tb24uaApAQCAtMCwwICsxLDQzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9DT01NT05fSAorI2RlZmluZSBUX0NPTU1PTl9ICisKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF90eXBlLmgiCisKKy8qKgorICogR2xvYmFsIHR5cGVzIGZvciB0aGUgcGFyc2VyIHRvIGJlIGFibGUgdG8gcmVmZXJlbmNlCisgKi8KKworZXh0ZXJuIHRfdHlwZSogZ190eXBlX3ZvaWQ7CitleHRlcm4gdF90eXBlKiBnX3R5cGVfc3RyaW5nOworZXh0ZXJuIHRfdHlwZSogZ190eXBlX2JpbmFyeTsKK2V4dGVybiB0X3R5cGUqIGdfdHlwZV9zbGlzdDsKK2V4dGVybiB0X3R5cGUqIGdfdHlwZV9ib29sOworZXh0ZXJuIHRfdHlwZSogZ190eXBlX2k4OworZXh0ZXJuIHRfdHlwZSogZ190eXBlX2kxNjsKK2V4dGVybiB0X3R5cGUqIGdfdHlwZV9pMzI7CitleHRlcm4gdF90eXBlKiBnX3R5cGVfaTY0OworZXh0ZXJuIHRfdHlwZSogZ190eXBlX2RvdWJsZTsKKwordm9pZCBpbml0R2xvYmFscygpOwordm9pZCBjbGVhckdsb2JhbHMoKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2FzM19nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2FzM19nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE3MjRmZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfYXMzX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDI1OTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGNjdHlwZT4KKworI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorCisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworCisvKioKKyAqIEFTMyBjb2RlIGdlbmVyYXRvci4KKyAqCisgKi8KK2NsYXNzIHRfYXMzX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X2FzM19nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgYmluZGFibGVfID0gZmFsc2U7CisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiYmluZGFibGUiKSA9PSAwKSB7CisgICAgICAgIGJpbmRhYmxlXyA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gYXMzOiIgKyBpdGVyLT5maXJzdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1hczMiOworICB9CisKKyAgLyoqCisgICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKKyAgICovCisKKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworCisgIHZvaWQgZ2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICB2b2lkIHByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fc3RhdGljLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVmdmFsID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKworICAvKioKKyAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX2FzM19zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKworICB2b2lkIGdlbmVyYXRlX2FzM19zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jbGFzcyA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCA9IGZhbHNlKTsKKyAgLy8gcmVtb3ZlZCAtLSBlcXVhbGl0eSxjb21wYXJlX3RvCisgIHZvaWQgZ2VuZXJhdGVfYXMzX3N0cnVjdF9yZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9hczNfdmFsaWRhdG9yKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfYXMzX3N0cnVjdF9yZXN1bHRfd3JpdGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfYXMzX3N0cnVjdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9hczNfc3RydWN0X3Rvc3RyaW5nKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBiaW5kYWJsZSk7CisgIHZvaWQgZ2VuZXJhdGVfYXMzX21ldGFfZGF0YV9tYXAoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSk7CisgIHN0ZDo6c3RyaW5nIGdldF9hczNfdHlwZV9zdHJpbmcodF90eXBlKiB0eXBlKTsKKyAgdm9pZCBnZW5lcmF0ZV9yZWZsZWN0aW9uX3NldHRlcnMoc3RkOjpvc3RyaW5nc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUpOworICB2b2lkIGdlbmVyYXRlX3JlZmxlY3Rpb25fZ2V0dGVycyhzdGQ6Om9zdHJpbmdzdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSk7CisgIHZvaWQgZ2VuZXJhdGVfZ2VuZXJpY19maWVsZF9nZXR0ZXJzX3NldHRlcnMoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9nZW5lcmljX2lzc2V0X21ldGhvZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2FzM19iZWFuX2JvaWxlcnBsYXRlKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBiaW5kYWJsZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHN0ZDo6c3RyaW5nIGdldF9jYXBfbmFtZShzdGQ6OnN0cmluZyBuYW1lKTsKKyAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVfaXNzZXRfY2hlY2sodF9maWVsZCogZmllbGQpOworICBzdGQ6OnN0cmluZyBnZW5lcmF0ZV9pc3NldF9jaGVjayhzdGQ6OnN0cmluZyBmaWVsZCk7CisgIHZvaWQgZ2VuZXJhdGVfaXNzZXRfc2V0KG9zdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpOworICAvLyByZW1vdmVkIHN0ZDo6c3RyaW5nIGlzc2V0X2ZpZWxkX2lkKHRfZmllbGQqIGZpZWxkKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgLyoqCisgICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBtYXApOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdGQ6OnN0cmluZyBpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX2FzM19kb2Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKTsKKworICB2b2lkIGdlbmVyYXRlX2FzM19kb2Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRkb2MpOworCisgIC8qKgorICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucworICAgKi8KKworICBzdGQ6OnN0cmluZyBhczNfcGFja2FnZSgpOworICBzdGQ6OnN0cmluZyBhczNfdHlwZV9pbXBvcnRzKCk7CisgIHN0ZDo6c3RyaW5nIGFzM190aHJpZnRfaW1wb3J0cygpOworICBzdGQ6OnN0cmluZyBhczNfdGhyaWZ0X2dlbl9pbXBvcnRzKHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcmIGltcG9ydHMpOworICBzdGQ6OnN0cmluZyBhczNfdGhyaWZ0X2dlbl9pbXBvcnRzKHRfc2VydmljZSogdHNlcnZpY2UpOworICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl9jb250YWluZXIgPSBmYWxzZSwgYm9vbCBpbl9pbml0ID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdGJhc2UsIGJvb2wgaW5fY29udGFpbmVyID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0ID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIGdldF9lbnVtX2NsYXNzX25hbWUodF90eXBlKiB0eXBlKTsKKworICBib29sIHR5cGVfY2FuX2JlX251bGwodF90eXBlKiB0dHlwZSkgeworICAgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisKKyAgICByZXR1cm4gdHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKQorICAgICAgICAgICB8fCB0dHlwZS0+aXNfc3RyaW5nKCk7CisgIH0KKworICBzdGQ6OnN0cmluZyBjb25zdGFudF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpOworCitwcml2YXRlOgorICAvKioKKyAgICogRmlsZSBzdHJlYW1zCisgICAqLworCisgIHN0ZDo6c3RyaW5nIHBhY2thZ2VfbmFtZV87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zZXJ2aWNlXzsKKyAgc3RkOjpzdHJpbmcgcGFja2FnZV9kaXJfOworCisgIGJvb2wgYmluZGFibGVfOworfTsKKworLyoqCisgKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAorICogc3RyZWFtcy4KKyAqCisgKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKKyAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKKyAgcGFja2FnZV9uYW1lXyA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJhczMiKTsKKworICBzdHJpbmcgZGlyID0gcGFja2FnZV9uYW1lXzsKKyAgc3RyaW5nIHN1YmRpciA9IGdldF9vdXRfZGlyKCk7CisgIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKKyAgd2hpbGUgKChsb2MgPSBkaXIuZmluZCgiLiIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICBzdWJkaXIgPSBzdWJkaXIgKyAiLyIgKyBkaXIuc3Vic3RyKDAsIGxvYyk7CisgICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOworICAgIGRpciA9IGRpci5zdWJzdHIobG9jICsgMSk7CisgIH0KKyAgaWYgKGRpci5zaXplKCkgPiAwKSB7CisgICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyOworICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKKyAgfQorCisgIHBhY2thZ2VfZGlyXyA9IHN1YmRpcjsKK30KKworLyoqCisgKiBQYWNrYWdlcyB0aGUgZ2VuZXJhdGVkIGZpbGUKKyAqCisgKiBAcmV0dXJuIFN0cmluZyBvZiB0aGUgcGFja2FnZSwgaS5lLiAicGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdGRlbW87IgorICovCitzdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjphczNfcGFja2FnZSgpIHsKKyAgaWYgKCFwYWNrYWdlX25hbWVfLmVtcHR5KCkpIHsKKyAgICByZXR1cm4gc3RyaW5nKCJwYWNrYWdlICIpICsgcGFja2FnZV9uYW1lXyArICIgIjsKKyAgfQorICByZXR1cm4gInBhY2thZ2UgIjsKK30KKworLyoqCisgKiBQcmludHMgc3RhbmRhcmQgYXMzIGltcG9ydHMKKyAqCisgKiBAcmV0dXJuIExpc3Qgb2YgaW1wb3J0cyBmb3IgQXMzIHR5cGVzIHRoYXQgYXJlIHVzZWQgaW4gaGVyZQorICovCitzdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjphczNfdHlwZV9pbXBvcnRzKCkgeworICByZXR1cm4gc3RyaW5nKCkgKyAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlNldDtcbiIgKyAiaW1wb3J0IGZsYXNoLnV0aWxzLkJ5dGVBcnJheTtcbiIKKyAgICAgICAgICsgImltcG9ydCBmbGFzaC51dGlscy5EaWN0aW9uYXJ5O1xuXG4iOworfQorCisvKioKKyAqIFByaW50cyBzdGFuZGFyZCBhczMgaW1wb3J0cworICoKKyAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgdGhyaWZ0CisgKi8KK3N0cmluZyB0X2FzM19nZW5lcmF0b3I6OmFzM190aHJpZnRfaW1wb3J0cygpIHsKKyAgcmV0dXJuIHN0cmluZygpICsgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC4qO1xuIiArICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLio7XG4iCisgICAgICAgICArICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuKjtcblxuIjsKK30KKworLyoqCisgKiBQcmludHMgaW1wb3J0cyBuZWVkZWQgZm9yIGEgZ2l2ZW4gdHlwZQorICoKKyAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgYSBnaXZlbiB0X3N0cnVjdAorICovCitzdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjphczNfdGhyaWZ0X2dlbl9pbXBvcnRzKHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcmIGltcG9ydHMpIHsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIC8vIEZvciBlYWNoIHR5cGUgY2hlY2sgaWYgaXQgaXMgZnJvbSBhIGRpZmZlcm5ldCBuYW1lc3BhY2UKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9ICgqbV9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X3Byb2dyYW0oKTsKKyAgICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKKyAgICAgIHN0cmluZyBwYWNrYWdlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiYXMzIik7CisgICAgICBpZiAoIXBhY2thZ2UuZW1wdHkoKSkgeworICAgICAgICBpZiAoaW1wb3J0cy5maW5kKHBhY2thZ2UgKyAiLiIgKyAoKm1faXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCkpID09IHN0cmluZzo6bnBvcykgeworICAgICAgICAgIGltcG9ydHMuYXBwZW5kKCJpbXBvcnQgIiArIHBhY2thZ2UgKyAiLiIgKyAoKm1faXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCkgKyAiO1xuIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIGltcG9ydHM7Cit9CisKKy8qKgorICogUHJpbnRzIGltcG9ydHMgbmVlZGVkIGZvciBhIGdpdmVuIHR5cGUKKyAqCisgKiBAcmV0dXJuIExpc3Qgb2YgaW1wb3J0cyBuZWNlc3NhcnkgZm9yIGEgZ2l2ZW4gdF9zZXJ2aWNlCisgKi8KK3N0cmluZyB0X2FzM19nZW5lcmF0b3I6OmFzM190aHJpZnRfZ2VuX2ltcG9ydHModF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgaW1wb3J0czsKKyAgY29uc3QgdmVjdG9yPHRfZnVuY3Rpb24qPiYgZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIC8vIEZvciBlYWNoIHR5cGUgY2hlY2sgaWYgaXQgaXMgZnJvbSBhIGRpZmZlcm5ldCBuYW1lc3BhY2UKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmdldF9wcm9ncmFtKCk7CisgICAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7CisgICAgICBzdHJpbmcgcGFja2FnZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImFzMyIpOworICAgICAgaWYgKCFwYWNrYWdlLmVtcHR5KCkpIHsKKyAgICAgICAgaWYgKGltcG9ydHMuZmluZChwYWNrYWdlICsgIi4iICsgKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5nZXRfbmFtZSgpKSA9PSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICBpbXBvcnRzLmFwcGVuZCgiaW1wb3J0ICIgKyBwYWNrYWdlICsgIi4iICsgKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgKyAiO1xuIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBhczNfdGhyaWZ0X2dlbl9pbXBvcnRzKCgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSwgaW1wb3J0cyk7CisgICAgYXMzX3RocmlmdF9nZW5faW1wb3J0cygoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKSwgaW1wb3J0cyk7CisgIH0KKworICByZXR1cm4gaW1wb3J0czsKK30KKworLyoqCisgKiBOb3RoaW5nIGluIEFzMworICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gQXMzLCBzaW5jZSBpdCBkb2VzCisgKiBub3Qgc3VwcG9ydCBhcmJpdHJhcnkgbmFtZSByZXBsYWNlbWVudHMsIGFuZCBpdCdkIGJlIGEgd2Fja3kgd2FzdGUKKyAqIG9mIG92ZXJoZWFkIHRvIG1ha2Ugd3JhcHBlciBjbGFzc2VzLgorICoKKyAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgKHZvaWQpdHR5cGVkZWY7Cit9CisKKy8qKgorICogRW51bXMgYXJlIGEgY2xhc3Mgd2l0aCBhIHNldCBvZiBzdGF0aWMgY29uc3RhbnRzLgorICoKKyAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICAvLyBNYWtlIG91dHB1dCBmaWxlCisgIHN0cmluZyBmX2VudW1fbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArICh0ZW51bS0+Z2V0X25hbWUoKSkgKyAiLmFzIjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2VudW07CisgIGZfZW51bS5vcGVuKGZfZW51bV9uYW1lKTsKKworICAvLyBDb21tZW50IGFuZCBwYWNrYWdlIGl0CisgIGZfZW51bSA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBhczNfcGFja2FnZSgpIDw8IGVuZGw7CisKKyAgc2NvcGVfdXAoZl9lbnVtKTsKKyAgLy8gQWRkIGFzMyBpbXBvcnRzCisgIGZfZW51bSA8PCBzdHJpbmcoKSArICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuU2V0OyIgPDwgZW5kbCA8PCAiaW1wb3J0IGZsYXNoLnV0aWxzLkRpY3Rpb25hcnk7IgorICAgICAgICAgPDwgZW5kbDsKKworICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIGNsYXNzICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIiAiOworICBzY29wZV91cChmX2VudW0pOworCisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworICAgIGluZGVudChmX2VudW0pIDw8ICJwdWJsaWMgc3RhdGljIGNvbnN0ICIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6aW50ID0gIiA8PCB2YWx1ZSA8PCAiOyIKKyAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICB9CisKKyAgLy8gQ3JlYXRlIGEgc3RhdGljIFNldCB3aXRoIGFsbCB2YWxpZCB2YWx1ZXMgZm9yIHRoaXMgZW51bQorICBmX2VudW0gPDwgZW5kbDsKKworICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIHN0YXRpYyBjb25zdCBWQUxJRF9WQUxVRVM6U2V0ID0gbmV3IFNldCgiOworICBpbmRlbnRfdXAoKTsKKyAgYm9vbCBmaXJzdFZhbHVlID0gdHJ1ZTsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICAvLyBwb3B1bGF0ZSBzZXQKKyAgICBmX2VudW0gPDwgKGZpcnN0VmFsdWUgPyAiIiA6ICIsICIpIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBmaXJzdFZhbHVlID0gZmFsc2U7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9lbnVtIDw8ICIpOyIgPDwgZW5kbDsKKworICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIHN0YXRpYyBjb25zdCBWQUxVRVNfVE9fTkFNRVM6RGljdGlvbmFyeSA9IG5ldyBEaWN0aW9uYXJ5KCk7IiA8PCBlbmRsOworCisgIHNjb3BlX3VwKGZfZW51bSk7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaW5kZW50KGZfZW51bSkgPDwgIlZBTFVFU19UT19OQU1FU1siIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXSA9IFwiIgorICAgICAgICAgICAgICAgICAgIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCI7IiA8PCBlbmRsOworICB9CisgIGZfZW51bSA8PCBlbmRsOworCisgIHNjb3BlX2Rvd24oZl9lbnVtKTsKKworICBzY29wZV9kb3duKGZfZW51bSk7IC8vIGVuZCBjbGFzcworCisgIHNjb3BlX2Rvd24oZl9lbnVtKTsgLy8gZW5kIHBhY2thZ2UKKworICBmX2VudW0uY2xvc2UoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBjbGFzcyB0aGF0IGhvbGRzIGFsbCB0aGUgY29uc3RhbnRzLgorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpIHsKKyAgaWYgKGNvbnN0cy5lbXB0eSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBwcm9ncmFtX25hbWVfICsgIkNvbnN0YW50cy5hcyI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9jb25zdHM7CisgIGZfY29uc3RzLm9wZW4oZl9jb25zdHNfbmFtZSk7CisKKyAgLy8gUHJpbnQgaGVhZGVyCisgIGZfY29uc3RzIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGFzM19wYWNrYWdlKCk7CisKKyAgc2NvcGVfdXAoZl9jb25zdHMpOworICBmX2NvbnN0cyA8PCBlbmRsOworCisgIGZfY29uc3RzIDw8IGFzM190eXBlX2ltcG9ydHMoKTsKKworICBpbmRlbnQoZl9jb25zdHMpIDw8ICJwdWJsaWMgY2xhc3MgIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJDb25zdGFudHMgeyIgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY19pdGVyOworICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgIHByaW50X2NvbnN0X3ZhbHVlKGZfY29uc3RzLAorICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF90eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfY29uc3RzKSA8PCAifSIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihmX2NvbnN0cyk7CisgIGZfY29uc3RzLmNsb3NlKCk7Cit9CisKK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpwcmludF9jb25zdF92YWx1ZShzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9zdGF0aWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWZ2YWwpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaW5kZW50KG91dCk7CisgIGlmICghZGVmdmFsKSB7CisgICAgb3V0IDw8IChpbl9zdGF0aWMgPyAidmFyICIgOiAicHVibGljIHN0YXRpYyBjb25zdCAiKTsKKyAgfQorICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBzdHJpbmcgdjIgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSk7CisgICAgb3V0IDw8IG5hbWU7CisgICAgaWYgKCFkZWZ2YWwpIHsKKyAgICAgIG91dCA8PCAiOiIgPDwgdHlwZV9uYW1lKHR5cGUpOworICAgIH0KKyAgICBvdXQgPDwgIiA9ICIgPDwgdjIgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBvdXQgPDwgbmFtZTsKKyAgICBpZiAoIWRlZnZhbCkgeworICAgICAgb3V0IDw8ICI6IiA8PCB0eXBlX25hbWUodHlwZSk7CisgICAgfQorICAgIG91dCA8PCAiID0gIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBvdXQgPDwgbmFtZSA8PCAiOiIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiCisgICAgICAgIDw8IGVuZGw7CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAibmV3IGZ1bmN0aW9uKCk6dm9pZCB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLiI7CisgICAgICBvdXQgPDwgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpIDw8ICIgPSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSgpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICBvdXQgPDwgbmFtZTsKKyAgICBpZiAoIWRlZnZhbCkgeworICAgICAgb3V0IDw8ICI6IiA8PCB0eXBlX25hbWUodHlwZSk7CisgICAgfQorICAgIG91dCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOworICAgIGlmICghaW5fc3RhdGljKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBmdW5jdGlvbigpOnZvaWQgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgc3RyaW5nIGtleSA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiWyIgPDwga2V5IDw8ICJdID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICAgIGlmICghaW5fc3RhdGljKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0oKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgeworICAgIG91dCA8PCBuYW1lOworICAgIGlmICghZGVmdmFsKSB7CisgICAgICBvdXQgPDwgIjoiIDw8IHR5cGVfbmFtZSh0eXBlKTsKKyAgICB9CisgICAgb3V0IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAibmV3IGZ1bmN0aW9uKCk6dm9pZCB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorICAgIHRfdHlwZSogZXR5cGU7CisgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0KKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBldHlwZSwgKnZfaXRlcik7CisgICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuIiA8PCAodHlwZS0+aXNfbGlzdCgpID8gInB1c2giIDogImFkZCIpIDw8ICIoIiA8PCB2YWwgPDwgIik7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSgpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiB0eXBlICIgKyB0eXBlLT5nZXRfbmFtZSgpOworICB9Cit9CisKK3N0cmluZyB0X2FzM19nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgICh2b2lkKW5hbWU7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVuZGVyOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZW5kZXIgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmVuZGVyIDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJlbmRlciA8PCAiKGJ5dGUpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmVuZGVyIDw8ICIoc2hvcnQpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIkwiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICByZW5kZXIgPDwgIihkb3VibGUpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgIH0gZWxzZSB7CisgICAgc3RyaW5nIHQgPSB0bXAoInRtcCIpOworICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwgdCwgdHlwZSwgdmFsdWUsIHRydWUpOworICAgIHJlbmRlciA8PCB0OworICB9CisKKyAgcmV0dXJuIHJlbmRlci5zdHIoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLiBUaGlzIGlzIGEgY2xhc3MKKyAqIHdpdGggZGF0YSBtZW1iZXJzLCByZWFkKCksIHdyaXRlKCksIGFuZCBhbiBpbm5lciBJc3NldCBjbGFzcy4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9hczNfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKK30KKworLyoqCisgKiBFeGNlcHRpb25zIGFyZSBzdHJ1Y3RzLCBidXQgdGhleSBpbmhlcml0IGZyb20gRXhjZXB0aW9uCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX2FzM19zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKK30KKworLyoqCisgKiBBczMgc3RydWN0IGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgeworICAvLyBNYWtlIG91dHB1dCBmaWxlCisgIHN0cmluZyBmX3N0cnVjdF9uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgKHRzdHJ1Y3QtPmdldF9uYW1lKCkpICsgIi5hcyI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zdHJ1Y3Q7CisgIGZfc3RydWN0Lm9wZW4oZl9zdHJ1Y3RfbmFtZS5jX3N0cigpKTsKKworICBmX3N0cnVjdCA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBhczNfcGFja2FnZSgpOworCisgIHNjb3BlX3VwKGZfc3RydWN0KTsKKyAgZl9zdHJ1Y3QgPDwgZW5kbDsKKworICBzdHJpbmcgaW1wb3J0czsKKworICBmX3N0cnVjdCA8PCBhczNfdHlwZV9pbXBvcnRzKCkgPDwgYXMzX3RocmlmdF9pbXBvcnRzKCkgPDwgYXMzX3RocmlmdF9nZW5faW1wb3J0cyh0c3RydWN0LCBpbXBvcnRzKQorICAgICAgICAgICA8PCBlbmRsOworCisgIGlmIChiaW5kYWJsZV8gJiYgIWlzX2V4Y2VwdGlvbikgeworICAgIGZfc3RydWN0IDw8ICJpbXBvcnQgZmxhc2guZXZlbnRzLkV2ZW50OyIgPDwgZW5kbCA8PCAiaW1wb3J0IGZsYXNoLmV2ZW50cy5FdmVudERpc3BhdGNoZXI7IgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgImltcG9ydCBteC5ldmVudHMuUHJvcGVydHlDaGFuZ2VFdmVudDsiIDw8IGVuZGw7CisgIH0KKworICBnZW5lcmF0ZV9hczNfc3RydWN0X2RlZmluaXRpb24oZl9zdHJ1Y3QsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7CisKKyAgc2NvcGVfZG93bihmX3N0cnVjdCk7IC8vIGVuZCBvZiBwYWNrYWdlCisgIGZfc3RydWN0LmNsb3NlKCk7Cit9CisKKy8qKgorICogQXMzIHN0cnVjdCBkZWZpbml0aW9uLiBUaGlzIGhhcyB2YXJpb3VzIHBhcmFtZXRlcnMsIGFzIGl0IGNvdWxkIGJlCisgKiBnZW5lcmF0ZWQgc3RhbmRhbG9uZSBvciBpbnNpZGUgYW5vdGhlciBjbGFzcyBhcyBhIGhlbHBlci4gSWYgaXQKKyAqIGlzIGEgaGVscGVyIHRoYW4gaXQgaXMgYSBzdGF0aWMgY2xhc3MuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgICAgICBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqIEBwYXJhbSBpc19leGNlcHRpb24gSXMgdGhpcyBhbiBleGNlcHRpb24/CisgKiBAcGFyYW0gaW5fY2xhc3MgICAgIElmIGluc2lkZSBhIGNsYXNzLCBuZWVkcyB0byBiZSBzdGF0aWMgY2xhc3MKKyAqIEBwYXJhbSBpc19yZXN1bHQgICAgSWYgdGhpcyBpcyBhIHJlc3VsdCBpdCBuZWVkcyBhIGRpZmZlcmVudCB3cml0ZXIKKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2FzM19zdHJ1Y3RfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQpIHsKKyAgZ2VuZXJhdGVfYXMzX2RvYyhvdXQsIHRzdHJ1Y3QpOworCisgIGJvb2wgaXNfZmluYWwgPSAodHN0cnVjdC0+YW5ub3RhdGlvbnNfLmZpbmQoImZpbmFsIikgIT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpKTsKKyAgYm9vbCBiaW5kYWJsZSA9ICFpc19leGNlcHRpb24gJiYgIWluX2NsYXNzICYmIGJpbmRhYmxlXzsKKworICBpbmRlbnQob3V0KSA8PCAoaW5fY2xhc3MgPyAiIiA6ICJwdWJsaWMgIikgPDwgKGlzX2ZpbmFsID8gImZpbmFsICIgOiAiIikgPDwgImNsYXNzICIKKyAgICAgICAgICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiICI7CisKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIG91dCA8PCAiZXh0ZW5kcyBFcnJvciAiOworICB9IGVsc2UgaWYgKGJpbmRhYmxlKSB7CisgICAgb3V0IDw8ICJleHRlbmRzIEV2ZW50RGlzcGF0Y2hlciAiOworICB9CisgIG91dCA8PCAiaW1wbGVtZW50cyBUQmFzZSAiOworCisgIHNjb3BlX3VwKG91dCk7CisKKyAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgc3RhdGljIGNvbnN0IFNUUlVDVF9ERVNDOlRTdHJ1Y3QgPSBuZXcgVFN0cnVjdChcIiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICA8PCAiXCIpOyIgPDwgZW5kbDsKKworICAvLyBNZW1iZXJzIGFyZSBwdWJsaWMgZm9yIC1hczMsIHByaXZhdGUgZm9yIC1hczNiZWFuCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGluZGVudChvdXQpIDw8ICJwcml2YXRlIHN0YXRpYyBjb25zdCAiIDw8IGNvbnN0YW50X25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgIDw8ICJfRklFTERfREVTQzpURmllbGQgPSBuZXcgVEZpZWxkKFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiLCAiCisgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIiA8PCAoKm1faXRlciktPmdldF9rZXkoKSA8PCAiKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfQorCisgIG91dCA8PCBlbmRsOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9hczNfZG9jKG91dCwgKm1faXRlcik7CisgICAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgdmFyIF8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSArICI6IiArIHR5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCkpCisgICAgICAgICAgICAgICAgPDwgIjsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHN0YXRpYyBjb25zdCAiIDw8IHVwY2FzZV9zdHJpbmcoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgIDw8ICI6aW50ID0gIiA8PCAoKm1faXRlciktPmdldF9rZXkoKSA8PCAiOyIgPDwgZW5kbDsKKyAgfQorCisgIG91dCA8PCBlbmRsOworCisgIC8vIElubmVyIElzc2V0IGNsYXNzCisgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBpZiAoIXR5cGVfY2FuX2JlX251bGwoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSB2YXIgX19pc3NldF8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOkJvb2xlYW4gPSBmYWxzZTsiCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICB9CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfYXMzX21ldGFfZGF0YV9tYXAob3V0LCB0c3RydWN0KTsKKworICAvLyBTdGF0aWMgaW5pdGlhbGl6ZXIgdG8gcG9wdWxhdGUgZ2xvYmFsIGNsYXNzIHRvIHN0cnVjdCBtZXRhZGF0YSBtYXAKKyAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiRmllbGRNZXRhRGF0YS5hZGRTdHJ1Y3RNZXRhRGF0YU1hcCgiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiLCBtZXRhRGF0YU1hcCk7IgorICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIERlZmF1bHQgY29uc3RydWN0b3IKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiCisgICAgICAgICAgICAgICAgICA8PCAoKm1faXRlciktPmdldF92YWx1ZSgpLT5nZXRfaW50ZWdlcigpIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgfQorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGdlbmVyYXRlX2FzM19iZWFuX2JvaWxlcnBsYXRlKG91dCwgdHN0cnVjdCwgYmluZGFibGUpOworICBnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnNfc2V0dGVycyhvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9nZW5lcmljX2lzc2V0X21ldGhvZChvdXQsIHRzdHJ1Y3QpOworCisgIGdlbmVyYXRlX2FzM19zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7CisgIGlmIChpc19yZXN1bHQpIHsKKyAgICBnZW5lcmF0ZV9hczNfc3RydWN0X3Jlc3VsdF93cml0ZXIob3V0LCB0c3RydWN0KTsKKyAgfSBlbHNlIHsKKyAgICBnZW5lcmF0ZV9hczNfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOworICB9CisgIGdlbmVyYXRlX2FzM19zdHJ1Y3RfdG9zdHJpbmcob3V0LCB0c3RydWN0LCBiaW5kYWJsZSk7CisgIGdlbmVyYXRlX2FzM192YWxpZGF0b3Iob3V0LCB0c3RydWN0KTsKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byByZWFkIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGZ1bmN0aW9uIHJlYWQoaXByb3Q6VFByb3RvY29sKTp2b2lkIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBEZWNsYXJlIHN0YWNrIHRtcCB2YXJpYWJsZXMgYW5kIHJlYWQgc3RydWN0IGhlYWRlcgorICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciBmaWVsZDpURmllbGQ7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpcHJvdC5yZWFkU3RydWN0QmVnaW4oKTsiIDw8IGVuZGw7CisKKyAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCisgIGluZGVudChvdXQpIDw8ICJ3aGlsZSAodHJ1ZSkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgLy8gUmVhZCBiZWdpbm5pbmcgZmllbGQgbWFya2VyCisgIGluZGVudChvdXQpIDw8ICJmaWVsZCA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCk7IiA8PCBlbmRsOworCisgIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKKyAgaW5kZW50KG91dCkgPDwgImlmIChmaWVsZC50eXBlID09IFRUeXBlLlNUT1ApIHsgIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgLy8gU3dpdGNoIHN0YXRlbWVudCBvbiB0aGUgZmllbGQgd2UgYXJlIHJlYWRpbmcKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGQuaWQpIiA8PCBlbmRsOworCisgIHNjb3BlX3VwKG91dCk7CisKKyAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCB1cGNhc2Vfc3RyaW5nKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgImlmIChmaWVsZC50eXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMuIik7CisgICAgZ2VuZXJhdGVfaXNzZXRfc2V0KG91dCwgKmZfaXRlcik7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7ICIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOyIKKyAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICAvLyBJbiB0aGUgZGVmYXVsdCBjYXNlIHdlIHNraXAgdGhlIGZpZWxkCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsiCisgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIGJyZWFrOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKG91dCk7CisKKyAgLy8gUmVhZCBmaWVsZCBlbmQgbWFya2VyCisgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkRmllbGRFbmQoKTsiIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaXByb3QucmVhZFN0cnVjdEVuZCgpOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIGluIG5vbi1iZWFucyBzdHlsZSwgY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcyBvZiBwcmltaXRpdmUgdHlwZQorICAvLyAod2hpY2ggY2FuIGJlIGNoZWNrZWQgaGVyZSBidXQgbm90IGluIHRoZSBnZW5lcmFsIHZhbGlkYXRlIG1ldGhvZCkKKyAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIi8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMgb2YgcHJpbWl0aXZlIHR5cGUsIHdoaWNoIGNhbid0IGJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoZWNrZWQgaW4gdGhlIHZhbGlkYXRlIG1ldGhvZCIgPDwgZW5kbDsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCAmJiAhdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghX19pc3NldF8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIiAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKFRQcm90b2NvbEVycm9yLlVOS05PV04sIFwiUmVxdWlyZWQgZmllbGQgJyIKKyAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICA8PCAiJyB3YXMgbm90IGZvdW5kIGluIHNlcmlhbGl6ZWQgZGF0YSEgU3RydWN0OiBcIiArIHRvU3RyaW5nKCkpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIC8vIHBlcmZvcm1zIHZhcmlvdXMgY2hlY2tzIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQorICBpbmRlbnQob3V0KSA8PCAidmFsaWRhdGUoKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8vIGdlbmVyYXRlcyBhczMgbWV0aG9kIHRvIHBlcmZvcm0gdmFyaW91cyBjaGVja3MKKy8vIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2FzM192YWxpZGF0b3Iob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIHZhbGlkYXRlKCk6dm9pZCB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIvLyBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIiA8PCBlbmRsOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoVFByb3RvY29sRXJyb3IuVU5LTk9XTiwgXCJSZXF1aXJlZCBmaWVsZCAnIgorICAgICAgICAgICAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicgd2FzIG5vdCBwcmVzZW50ISBTdHJ1Y3Q6IFwiICsgdG9TdHJpbmcoKSk7IgorICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICIvLyBhbGFzLCB3ZSBjYW5ub3QgY2hlY2sgJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgIDw8ICInIGJlY2F1c2UgaXQncyBhIHByaW1pdGl2ZSBhbmQgeW91IGNob3NlIHRoZSBub24tYmVhbnMgZ2VuZXJhdG9yLiIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBjaGVjayB0aGF0IGZpZWxkcyBvZiB0eXBlIGVudW0gaGF2ZSB2YWxpZCB2YWx1ZXMKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIvLyBjaGVjayB0aGF0IGZpZWxkcyBvZiB0eXBlIGVudW0gaGF2ZSB2YWxpZCB2YWx1ZXMiIDw8IGVuZGw7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAoKmZfaXRlcik7CisgICAgdF90eXBlKiB0eXBlID0gZmllbGQtPmdldF90eXBlKCk7CisgICAgLy8gaWYgZmllbGQgaXMgYW4gZW51bSwgY2hlY2sgdGhhdCBpdHMgdmFsdWUgaXMgdmFsaWQKKyAgICBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpIDw8ICIgJiYgISIgPDwgZ2V0X2VudW1fY2xhc3NfbmFtZSh0eXBlKQorICAgICAgICAgICAgICAgICAgPDwgIi5WQUxJRF9WQUxVRVMuY29udGFpbnMoIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKSl7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKFRQcm90b2NvbEVycm9yLlVOS05PV04sIFwiVGhlIGZpZWxkICciCisgICAgICAgICAgICAgICAgICA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiJyBoYXMgYmVlbiBhc3NpZ25lZCB0aGUgaW52YWxpZCB2YWx1ZSBcIiArICIKKyAgICAgICAgICAgICAgICAgIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHdyaXRlIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2FzM19zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gd3JpdGUob3Byb3Q6VFByb3RvY29sKTp2b2lkIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBwZXJmb3JtcyB2YXJpb3VzIGNoZWNrcyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKKyAgaW5kZW50KG91dCkgPDwgInZhbGlkYXRlKCk7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlU3RydWN0QmVnaW4oU1RSVUNUX0RFU0MpOyIgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGJvb2wgY291bGRfYmVfdW5zZXQgPSAoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMOworICAgIGlmIChjb3VsZF9iZV91bnNldCkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCpmX2l0ZXIpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisgICAgYm9vbCBudWxsX2FsbG93ZWQgPSB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKG51bGxfYWxsb3dlZCkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAodGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEJlZ2luKCIgPDwgY29uc3RhbnRfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgPDwgIl9GSUVMRF9ERVNDKTsiIDw8IGVuZGw7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLiIpOworCisgICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7CisKKyAgICBpZiAobnVsbF9hbGxvd2VkKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIGlmIChjb3VsZF9iZV91bnNldCkgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgfQorICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAorICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEVuZCgpOyIKKyAgICAgIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gd3JpdGUgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdCwKKyAqIHdoaWNoIGlzIGEgZnVuY3Rpb24gcmVzdWx0LiBUaGVzZSBmaWVsZHMgYXJlIG9ubHkgd3JpdHRlbgorICogaWYgdGhleSBhcmUgc2V0IGluIHRoZSBJc3NldCBhcnJheSwgYW5kIG9ubHkgb25lIG9mIHRoZW0KKyAqIGNhbiBiZSBzZXQgYXQgYSB0aW1lLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gd3JpdGUob3Byb3Q6VFByb3RvY29sKTp2b2lkIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihTVFJVQ1RfREVTQyk7IiA8PCBlbmRsOworCisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiAiOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgIiBlbHNlIGlmICI7CisgICAgfQorCisgICAgb3V0IDw8ICIodGhpcy4iIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCpmX2l0ZXIpIDw8ICIpIHsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkQmVnaW4oIiA8PCBjb25zdGFudF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICA8PCAiX0ZJRUxEX0RFU0MpOyIgPDwgZW5kbDsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMuIik7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iOworICB9CisgIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCisgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIm9wcm90LndyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmVmbGVjdGlvbl9nZXR0ZXJzKG9zdHJpbmdzdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNhcF9uYW1lKSB7CisgICh2b2lkKXR5cGU7CisgICh2b2lkKWNhcF9uYW1lOworICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IHVwY2FzZV9zdHJpbmcoZmllbGRfbmFtZSkgPDwgIjoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworfQorCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmVmbGVjdGlvbl9zZXR0ZXJzKG9zdHJpbmdzdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNhcF9uYW1lKSB7CisgICh2b2lkKXR5cGU7CisgICh2b2lkKWNhcF9uYW1lOworICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IHVwY2FzZV9zdHJpbmcoZmllbGRfbmFtZSkgPDwgIjoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiaWYgKHZhbHVlID09IG51bGwpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHVuc2V0IiA8PCBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gdmFsdWU7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7Cit9CisKK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnNfc2V0dGVycyhzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgeworCisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBnZXR0ZXJfc3RyZWFtOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc2V0dGVyX3N0cmVhbTsKKworICAvLyBidWlsZCB1cCB0aGUgYm9kaWVzIG9mIGJvdGggdGhlIGdldHRlciBhbmQgc2V0dGVyIGF0IG9uY2UKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKKyAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZmllbGQtPmdldF9uYW1lKCk7CisgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUgPSBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSk7CisKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9yZWZsZWN0aW9uX3NldHRlcnMoc2V0dGVyX3N0cmVhbSwgdHlwZSwgZmllbGRfbmFtZSwgY2FwX25hbWUpOworICAgIGdlbmVyYXRlX3JlZmxlY3Rpb25fZ2V0dGVycyhnZXR0ZXJfc3RyZWFtLCB0eXBlLCBmaWVsZF9uYW1lLCBjYXBfbmFtZSk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIC8vIGNyZWF0ZSB0aGUgc2V0dGVyCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gc2V0RmllbGRWYWx1ZShmaWVsZElEOmludCwgdmFsdWU6Kik6dm9pZCB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZElEKSB7IiA8PCBlbmRsOworCisgIG91dCA8PCBzZXR0ZXJfc3RyZWFtLnN0cigpOworCisgIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoXCJGaWVsZCBcIiArIGZpZWxkSUQgKyBcIiBkb2Vzbid0IGV4aXN0IVwiKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBjcmVhdGUgdGhlIGdldHRlcgorICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIGdldEZpZWxkVmFsdWUoZmllbGRJRDppbnQpOiogeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGRJRCkgeyIgPDwgZW5kbDsKKworICBvdXQgPDwgZ2V0dGVyX3N0cmVhbS5zdHIoKTsKKworICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKFwiRmllbGQgXCIgKyBmaWVsZElEICsgXCIgZG9lc24ndCBleGlzdCFcIik7IiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLy8gQ3JlYXRlcyBhIGdlbmVyaWMgaXNTZXQgbWV0aG9kIHRoYXQgdGFrZXMgdGhlIGZpZWxkIG51bWJlciBhcyBhcmd1bWVudAordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2dlbmVyaWNfaXNzZXRfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gY3JlYXRlIHRoZSBpc1NldCBtZXRob2QKKyAgaW5kZW50KG91dCkgPDwgIi8vIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBjb3JyZXNwb25kaW5nIHRvIGZpZWxkSUQgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhICIKKyAgICAgICAgICAgICAgICAgInZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIGlzU2V0KGZpZWxkSUQ6aW50KTpCb29sZWFuIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZElEKSB7IiA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOworICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgdXBjYXNlX3N0cmluZyhmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiAiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkKSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihcIkZpZWxkIFwiICsgZmllbGRJRCArIFwiIGRvZXNuJ3QgZXhpc3QhXCIpOyIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNldCBvZiBBczMgQmVhbiBib2lsZXJwbGF0ZSBmdW5jdGlvbnMgKHNldHRlcnMsIGdldHRlcnMsIGV0Yy4pCisgKiBmb3IgdGhlIGdpdmVuIHN0cnVjdC4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2FzM19iZWFuX2JvaWxlcnBsYXRlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJpbmRhYmxlKSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7CisgICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOworICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lID0gZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpOworCisgICAgLy8gU2ltcGxlIGdldHRlcgorICAgIGdlbmVyYXRlX2FzM19kb2Mob3V0LCBmaWVsZCk7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiBnZXQgIiA8PCBmaWVsZF9uYW1lIDw8ICIoKToiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiB0aGlzLl8iIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gU2ltcGxlIHNldHRlcgorICAgIGdlbmVyYXRlX2FzM19kb2Mob3V0LCBmaWVsZCk7CisgICAgc3RkOjpzdHJpbmcgcHJvcE5hbWUgPSB0bXAoInRocmlmdFByb3BlcnR5Q2hhbmdlIik7CisgICAgaWYgKGJpbmRhYmxlKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiW0JpbmRhYmxlKGV2ZW50PVwiIiA8PCBwcm9wTmFtZSA8PCAiXCIpXSIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiBzZXQgIiA8PCBmaWVsZF9uYW1lIDw8ICIoIiA8PCBmaWVsZF9uYW1lIDw8ICI6IgorICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKTp2b2lkIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgInRoaXMuXyIgPDwgZmllbGRfbmFtZSA8PCAiID0gIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOworICAgIGdlbmVyYXRlX2lzc2V0X3NldChvdXQsIGZpZWxkKTsKKworICAgIGlmIChiaW5kYWJsZSkgeworICAgICAgLy8gV2UgaGF2ZSB0byB1c2UgYSBjdXN0b20gZXZlbnQgcmF0aGVyIHRoYW4gdGhlIGRlZmF1bHQsIGJlY2F1c2UgaWYgeW91IHVzZSB0aGUgZGVmYXVsdCwKKyAgICAgIC8vIHRoZSBzZXR0ZXIgb25seSBnZXRzIGNhbGxlZCBpZiB0aGUgdmFsdWUgaGFzIGNoYW5nZWQgLSB0aGlzIG1lYW5zIGNhbGxpbmcKKyAgICAgIC8vIGZvby5zZXRJbnRWYWx1ZSgwKQorICAgICAgLy8gd2lsbCBub3QgY2F1c2UgZm9vLmlzSW50VmFsdWVTZXQoKSB0byByZXR1cm4gdHJ1ZSBzaW5jZSB0aGUgdmFsdWUgb2YgZm9vLl9pbnRWYWx1ZSB3YXNuJ3QKKyAgICAgIC8vIGNoYW5nZWQKKyAgICAgIC8vIHNvIHRoZSBzZXR0ZXIgd2FzIG5ldmVyIGNhbGxlZC4KKyAgICAgIGluZGVudChvdXQpIDw8ICJkaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcIiIgPDwgcHJvcE5hbWUgPDwgIlwiKSk7IiA8PCBlbmRsOworCisgICAgICAvLyBIb3dldmVyLCBpZiB5b3UganVzdCB1c2UgYSBjdXN0b20gZXZlbnQsIHRoZW4gY29sbGVjdGlvbnMgd29uJ3QgYmUgYWJsZSB0byBkZXRlY3Qgd2hlbgorICAgICAgLy8gZWxlbWVudHMKKyAgICAgIC8vIGluIHRoZSBjb2xsZWN0aW9ucyBoYXZlIGNoYW5nZWQgc2luY2UgdGhleSBsaXN0ZWQgZm9yIFByb3BlcnR5Q2hhbmdlRXZlbnRzLiAgU28sIHdlCisgICAgICAvLyBkaXNwYXRjaCBib3RoLgorICAgICAgaW5kZW50KG91dCkgPDwgImRpc3BhdGNoRXZlbnQobmV3IFByb3BlcnR5Q2hhbmdlRXZlbnQoUHJvcGVydHlDaGFuZ2VFdmVudC5QUk9QRVJUWV9DSEFOR0UpKTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAvLyBVbnNldHRlcgorICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gdW5zZXQiIDw8IGNhcF9uYW1lIDw8ICIoKTp2b2lkIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gbnVsbDsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLl9faXNzZXRfIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBmYWxzZTsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIC8vIGlzU2V0IG1ldGhvZAorICAgIGluZGVudChvdXQpIDw8ICIvLyBSZXR1cm5zIHRydWUgaWYgZmllbGQgIiA8PCBmaWVsZF9uYW1lCisgICAgICAgICAgICAgICAgPDwgIiBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiBpcyIgPDwgZ2V0X2NhcF9uYW1lKCJzZXQiKSA8PCBjYXBfbmFtZSA8PCAiKCk6Qm9vbGVhbiB7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiAhPSBudWxsOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiB0aGlzLl9faXNzZXRfIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0b1N0cmluZygpIG1ldGhvZCBmb3IgdGhlIGdpdmVuIHN0cnVjdAorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX3N0cnVjdF90b3N0cmluZyhvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYmluZGFibGUpIHsKKyAgLy8gSWYgaXQncyBiaW5kYWJsZSwgaXQgZXh0ZW5kcyBFdmVudERpc3BhdGNoZXIgc28gdG9TdHJpbmcgaXMgYW4gb3ZlcnJpZGUuCisgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljICIgPDwgKGJpbmRhYmxlID8gIm92ZXJyaWRlICIgOiAiIikgPDwgImZ1bmN0aW9uIHRvU3RyaW5nKCk6U3RyaW5nIHsiCisgICAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciByZXQ6U3RyaW5nID0gbmV3IFN0cmluZyhcIiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKFwiKTsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyIGZpcnN0OkJvb2xlYW4gPSB0cnVlOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgYm9vbCBjb3VsZF9iZV91bnNldCA9ICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7CisgICAgaWYgKGNvdWxkX2JlX3Vuc2V0KSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKworICAgIHRfZmllbGQqIGZpZWxkID0gKCpmX2l0ZXIpOworCisgICAgaWYgKCFmaXJzdCkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmICghZmlyc3QpIHJldCArPSAgXCIsIFwiOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgInJldCArPSBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6XCI7IiA8PCBlbmRsOworICAgIGJvb2wgY2FuX2JlX251bGwgPSB0eXBlX2Nhbl9iZV9udWxsKGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAoY2FuX2JlX251bGwpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID09IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICByZXQgKz0gXCJudWxsXCI7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorCisgICAgaWYgKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19iaW5hcnkoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0ICs9IFwiQklOQVJZXCI7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX2VudW0oKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgInZhciAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICA8PCAiX25hbWU6U3RyaW5nID0gIiA8PCBnZXRfZW51bV9jbGFzc19uYW1lKGZpZWxkLT5nZXRfdHlwZSgpKQorICAgICAgICAgICAgICAgICAgPDwgIi5WQUxVRVNfVE9fTkFNRVNbdGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIl9uYW1lICE9IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICByZXQgKz0gIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiX25hbWU7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0ICs9IFwiIChcIjsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXQgKz0gdGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICJfbmFtZSAhPSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0ICs9IFwiKVwiOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0ICs9IHRoaXMuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaWYgKGNhbl9iZV9udWxsKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICJmaXJzdCA9IGZhbHNlOyIgPDwgZW5kbDsKKworICAgIGlmIChjb3VsZF9iZV91bnNldCkgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgICBmaXJzdCA9IGZhbHNlOworICB9CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0ICs9IFwiKVwiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHJldDsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdGF0aWMgbWFwIHdpdGggbWV0YSBkYXRhIHRvIHN0b3JlIGluZm9ybWF0aW9uIHN1Y2ggYXMgZmllbGRJRCB0bworICogZmllbGROYW1lIG1hcHBpbmcKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2FzM19tZXRhX2RhdGFfbWFwKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIC8vIFN0YXRpYyBNYXAgd2l0aCBmaWVsZElEIC0+IEZpZWxkTWV0YURhdGEgbWFwcGluZ3MKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBzdGF0aWMgY29uc3QgbWV0YURhdGFNYXA6RGljdGlvbmFyeSA9IG5ldyBEaWN0aW9uYXJ5KCk7IiA8PCBlbmRsOworCisgIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgeworICAgIC8vIFBvcHVsYXRlIG1hcAorICAgIHNjb3BlX3VwKG91dCk7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKKyAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJtZXRhRGF0YU1hcFsiIDw8IHVwY2FzZV9zdHJpbmcoZmllbGRfbmFtZSkgPDwgIl0gPSBuZXcgRmllbGRNZXRhRGF0YShcIiIKKyAgICAgICAgICAgICAgICAgIDw8IGZpZWxkX25hbWUgPDwgIlwiLCAiOworCisgICAgICAvLyBTZXQgZmllbGQgcmVxdWlyZW1lbnQgdHlwZSAocmVxdWlyZWQsIG9wdGlvbmFsLCBldGMuKQorICAgICAgaWYgKGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgICBvdXQgPDwgIlRGaWVsZFJlcXVpcmVtZW50VHlwZS5SRVFVSVJFRCwgIjsKKyAgICAgIH0gZWxzZSBpZiAoZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7CisgICAgICAgIG91dCA8PCAiVEZpZWxkUmVxdWlyZW1lbnRUeXBlLk9QVElPTkFMLCAiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8ICJURmllbGRSZXF1aXJlbWVudFR5cGUuREVGQVVMVCwgIjsKKyAgICAgIH0KKworICAgICAgLy8gQ3JlYXRlIHZhbHVlIG1ldGEgZGF0YQorICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgZmllbGQtPmdldF90eXBlKCkpOworICAgICAgb3V0IDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgc2NvcGVfZG93bihvdXQpOworICB9Cit9CisKKy8qKgorICogUmV0dXJucyBhIHN0cmluZyB3aXRoIHRoZSBhczMgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIHRocmlmdCB0eXBlCisgKiAoZS5nLiBmb3IgdGhlIHR5cGUgc3RydWN0IGl0IHJldHVybnMgIlRUeXBlLlNUUlVDVCIpCisgKi8KK3N0ZDo6c3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6Z2V0X2FzM190eXBlX3N0cmluZyh0X3R5cGUqIHR5cGUpIHsKKyAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiVFR5cGUuTElTVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLk1BUCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLlNFVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiVFR5cGUuU1RSVUNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgcmV0dXJuIGdldF9hczNfdHlwZV9zdHJpbmcoKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHN3aXRjaCAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCkpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICByZXR1cm4gIlRUeXBlLlZPSUQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIlRUeXBlLlNUUklORyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIlRUeXBlLkJPT0wiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiVFR5cGUuQllURSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiVFR5cGUuSTE2IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJUVHlwZS5JMzIiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlRUeXBlLkk2NCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiVFR5cGUuRE9VQkxFIjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIlVua25vd24gdGhyaWZ0IHR5cGUgXCIiICsgdHlwZS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiIHBhc3NlZCB0byB0X2FzM19nZW5lcmF0b3I6OmdldF9hczNfdHlwZV9zdHJpbmchIik7CisgICAgICBicmVhazsgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoCisgICAgICAgICJVbmtub3duIHRocmlmdCB0eXBlIFwiIiArIHR5cGUtPmdldF9uYW1lKCkKKyAgICAgICAgKyAiXCIgcGFzc2VkIHRvIHRfYXMzX2dlbmVyYXRvcjo6Z2V0X2FzM190eXBlX3N0cmluZyEiKTsgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIQorICB9Cit9CisKK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSkgeworICBvdXQgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudF91cCgpOworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGluZGVudChvdXQpIDw8ICJuZXcgU3RydWN0TWV0YURhdGEoVFR5cGUuU1RSVUNULCAiIDw8IHR5cGVfbmFtZSh0eXBlKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgTGlzdE1ldGFEYXRhKFRUeXBlLkxJU1QsICI7CisgICAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgZWxlbV90eXBlKTsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAibmV3IFNldE1ldGFEYXRhKFRUeXBlLlNFVCwgIjsKKyAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCBlbGVtX3R5cGUpOworICAgIH0gZWxzZSB7IC8vIG1hcAorICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBNYXBNZXRhRGF0YShUVHlwZS5NQVAsICI7CisgICAgICB0X3R5cGUqIGtleV90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgICAgdF90eXBlKiB2YWxfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGtleV90eXBlKTsKKyAgICAgIG91dCA8PCAiLCAiOworICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgdmFsX3R5cGUpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAibmV3IEZpZWxkVmFsdWVNZXRhRGF0YSgiIDw8IGdldF9hczNfdHlwZV9zdHJpbmcodHlwZSk7CisgIH0KKyAgb3V0IDw8ICIpIjsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50X2Rvd24oKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4gSW4gQysrLCB0aGlzIGNvbXByaXNlcyBhbiBlbnRpcmVseSBzZXBhcmF0ZQorICogaGVhZGVyIGFuZCBzb3VyY2UgZmlsZS4gVGhlIGhlYWRlciBmaWxlIGRlZmluZXMgdGhlIG1ldGhvZHMgYW5kIGluY2x1ZGVzCisgKiB0aGUgZGF0YSB0eXBlcyBkZWZpbmVkIGluIHRoZSBtYWluIGhlYWRlciBmaWxlLCBhbmQgdGhlIGltcGxlbWVudGF0aW9uCisgKiBmaWxlIGNvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgYmFzaWMgcHJpbnRlciBhbmQgZGVmYXVsdCBpbnRlcmZhY2VzLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgLy8gTWFrZSBpbnRlcmZhY2UgZmlsZQorICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBzZXJ2aWNlX25hbWVfICsgIi5hcyI7CisgIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKKworICBmX3NlcnZpY2VfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGFzM19wYWNrYWdlKCk7CisKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8IGFzM190eXBlX2ltcG9ydHMoKSA8PCBhczNfdGhyaWZ0X2ltcG9ydHMoKQorICAgICAgICAgICAgIDw8IGFzM190aHJpZnRfZ2VuX2ltcG9ydHModHNlcnZpY2UpOworCisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgdF90eXBlKiBwYXJlbnQgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKyAgICBzdHJpbmcgcGFyZW50X25hbWVzcGFjZSA9IHBhcmVudC0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWVzcGFjZSgiYXMzIik7CisgICAgaWYgKCFwYXJlbnRfbmFtZXNwYWNlLmVtcHR5KCkgJiYgcGFyZW50X25hbWVzcGFjZSAhPSBwYWNrYWdlX25hbWVfKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICJpbXBvcnQgIiA8PCB0eXBlX25hbWUocGFyZW50KSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOworCisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8uY2xvc2UoKTsKKworICAvLyBOb3cgbWFrZSB0aGUgaW1wbGVtZW50YXRpb24vY2xpZW50IGZpbGUKKyAgZl9zZXJ2aWNlX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBzZXJ2aWNlX25hbWVfICsgIkltcGwuYXMiOworICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7CisKKyAgZl9zZXJ2aWNlXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBhczNfcGFja2FnZSgpOworCisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgIGZfc2VydmljZV8gPDwgZW5kbCA8PCBhczNfdHlwZV9pbXBvcnRzKCkgPDwgYXMzX3RocmlmdF9pbXBvcnRzKCkKKyAgICAgICAgICAgICA8PCBhczNfdGhyaWZ0X2dlbl9pbXBvcnRzKHRzZXJ2aWNlKTsKKworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIHRfdHlwZSogcGFyZW50ID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgICAgc3RyaW5nIHBhcmVudF9uYW1lc3BhY2UgPSBwYXJlbnQtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lc3BhY2UoImFzMyIpOworICAgIGlmICghcGFyZW50X25hbWVzcGFjZS5lbXB0eSgpICYmIHBhcmVudF9uYW1lc3BhY2UgIT0gcGFja2FnZV9uYW1lXykgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiaW1wb3J0ICIgPDwgdHlwZV9uYW1lKHBhcmVudCkgPDwgIkltcGw7IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisKKyAgZl9zZXJ2aWNlXyA8PCBhczNfdHlwZV9pbXBvcnRzKCk7CisgIGZfc2VydmljZV8gPDwgYXMzX3RocmlmdF9pbXBvcnRzKCk7CisgIGZfc2VydmljZV8gPDwgYXMzX3RocmlmdF9nZW5faW1wb3J0cyh0c2VydmljZSk7CisgIGlmICghcGFja2FnZV9uYW1lXy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiaW1wb3J0ICIgPDwgcGFja2FnZV9uYW1lXyA8PCAiLio7IiA8PCBlbmRsOworICB9CisKKyAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKKworICBmX3NlcnZpY2VfLmNsb3NlKCk7CisKKyAgLy8gTm93IG1ha2UgdGhlIHByb2Nlc3Nvci9zZXJ2ZXIgZmlsZQorICBmX3NlcnZpY2VfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIHNlcnZpY2VfbmFtZV8gKyAiUHJvY2Vzc29yLmFzIjsKKyAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOworCisgIGZfc2VydmljZV8gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgYXMzX3BhY2thZ2UoKTsKKworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwgYXMzX3R5cGVfaW1wb3J0cygpIDw8IGFzM190aHJpZnRfaW1wb3J0cygpCisgICAgICAgICAgICAgPDwgYXMzX3RocmlmdF9nZW5faW1wb3J0cyh0c2VydmljZSkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisKKyAgZl9zZXJ2aWNlXyA8PCBhczNfdHlwZV9pbXBvcnRzKCk7CisgIGZfc2VydmljZV8gPDwgYXMzX3RocmlmdF9pbXBvcnRzKCk7CisgIGZfc2VydmljZV8gPDwgYXMzX3RocmlmdF9nZW5faW1wb3J0cyh0c2VydmljZSkgPDwgZW5kbDsKKyAgaWYgKCFwYWNrYWdlX25hbWVfLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJpbXBvcnQgIiA8PCBwYWNrYWdlX25hbWVfIDw8ICIuKjsiIDw8IGVuZGw7CisgIH0KKworICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOworCisgIGZfc2VydmljZV8uY2xvc2UoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGludGVyZmFjZSBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kc19pZmFjZSA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHNfaWZhY2UgPSAiIGV4dGVuZHMgIiArIHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpOworICB9CisKKyAgZ2VuZXJhdGVfYXMzX2RvYyhmX3NlcnZpY2VfLCB0c2VydmljZSk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInB1YmxpYyBpbnRlcmZhY2UgIiA8PCBzZXJ2aWNlX25hbWVfIDw8IGV4dGVuZHNfaWZhY2UgPDwgIiB7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX2FzM19kb2MoZl9zZXJ2aWNlXywgKmZfaXRlcik7CisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIvL2Z1bmN0aW9uIG9uRXJyb3IoRXJyb3IpOnZvaWQ7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIi8vZnVuY3Rpb24gb25TdWNjZXNzKCk6dm9pZDsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIi8vZnVuY3Rpb24gb25FcnJvcihFcnJvcik6dm9pZDsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLy9mdW5jdGlvbiBvblN1Y2Nlc3MoIiA8PCB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIik6dm9pZDsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHN0cnVjdHMgZm9yIGFsbCB0aGUgc2VydmljZSBhcmdzIGFuZCByZXR1cm4gdHlwZXMKKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UKKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBnZW5lcmF0ZV9hczNfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgdHMsIGZhbHNlLCB0cnVlKTsKKyAgICBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCk7CisgICAgZXh0ZW5kc19jbGllbnQgPSAiIGV4dGVuZHMgIiArIGV4dGVuZHMgKyAiSW1wbCI7CisgIH0KKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBjbGFzcyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkltcGwiIDw8IGV4dGVuZHNfY2xpZW50CisgICAgICAgICAgICAgICAgICAgICA8PCAiIGltcGxlbWVudHMgIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgZnVuY3Rpb24gIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJbXBsIgorICAgICAgICAgICAgICAgICAgICAgPDwgIihpcHJvdDpUUHJvdG9jb2wsIG9wcm90OlRQcm90b2NvbD1udWxsKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpcHJvdF8gPSBpcHJvdDsiIDw8IGVuZGw7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKG9wcm90ID09IG51bGwpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3RfID0gaXByb3Q7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3RfID0gb3Byb3Q7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSI7CisgIH0gZWxzZSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAic3VwZXIoaXByb3QsIG9wcm90KTsiIDw8IGVuZGw7CisgIH0KKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgdmFyIGlwcm90XzpUUHJvdG9jb2w7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAicHJvdGVjdGVkIHZhciBvcHJvdF86VFByb3RvY29sOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAicHJvdGVjdGVkIHZhciBzZXFpZF86aW50OyIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgZnVuY3Rpb24gZ2V0SW5wdXRQcm90b2NvbCgpOlRQcm90b2NvbCIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiB0aGlzLmlwcm90XzsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBmdW5jdGlvbiBnZXRPdXRwdXRQcm90b2NvbCgpOlRQcm90b2NvbCIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiB0aGlzLm9wcm90XzsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgIH0KKworICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKworICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIi8vZnVuY3Rpb24gb25FcnJvcihFcnJvcik6dm9pZDsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLy9mdW5jdGlvbiBvblN1Y2Nlc3MoKTp2b2lkOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLy9mdW5jdGlvbiBvbkVycm9yKEVycm9yKTp2b2lkOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIvL2Z1bmN0aW9uIG9uU3VjY2VzcygiIDw8IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKTp2b2lkOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICAgIC8vIEdldCB0aGUgc3RydWN0IG9mIGZ1bmN0aW9uIGNhbGwgcGFyYW1zCisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisKKyAgICBzdHJpbmcgYXJnc25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisKKyAgICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdF8ud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCBmdW5uYW1lIDw8ICJcIiwgIgorICAgICAgICAgICAgICAgPDwgKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkgPyAiVE1lc3NhZ2VUeXBlLk9ORVdBWSIgOiAiVE1lc3NhZ2VUeXBlLkNBTEwiKQorICAgICAgICAgICAgICAgPDwgIiwgc2VxaWRfKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ2YXIgYXJnczoiIDw8IGFyZ3NuYW1lIDw8ICIgPSBuZXcgIgorICAgICAgICAgICAgICAgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbDsKKworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzLiIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICAgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncy53cml0ZShvcHJvdF8pOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIm9wcm90Xy53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisKKyAgICBpZiAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3RfLmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdF8uZ2V0VHJhbnNwb3J0KCkuZmx1c2goZnVuY3Rpb24oZXJyb3I6RXJyb3IpOnZvaWQgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJ5IHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIHN0cmluZyByZXN1bHRuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKGVycm9yICE9IG51bGwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgIiAgaWYgKG9uRXJyb3IgIT0gbnVsbCkgb25FcnJvcihlcnJvcik7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybjsiCisgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgInZhciBtc2c6VE1lc3NhZ2UgPSBpcHJvdF8ucmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiaWYgKG1zZy50eXBlID09IFRNZXNzYWdlVHlwZS5FWENFUFRJT04pIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgIiAgdmFyIHg6VEFwcGxpY2F0aW9uRXJyb3IgPSBUQXBwbGljYXRpb25FcnJvci5yZWFkKGlwcm90Xyk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIGlwcm90Xy5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiICBpZiAob25FcnJvciAhPSBudWxsKSBvbkVycm9yKHgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm47IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ2YXIgcmVzdWx0IDoiIDw8IHJlc3VsdG5hbWUgPDwgIiA9IG5ldyAiCisgICAgICAgICAgICAgICAgIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LnJlYWQoaXByb3RfKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImlwcm90Xy5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKworICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygic3VjY2VzcyIpIDw8ICIpIHsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICBpZiAob25TdWNjZXNzICE9IG51bGwpIG9uU3VjY2VzcyhyZXN1bHQuc3VjY2Vzcyk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9IG51bGwpIHsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICBpZiAob25FcnJvciAhPSBudWxsKSBvbkVycm9yKHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgIDw8ICIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm47IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICAvLyBJZiB5b3UgZ2V0IGhlcmUgaXQncyBhbiBleGNlcHRpb24sIHVubGVzcyBhIHZvaWQgZnVuY3Rpb24KKyAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAob25TdWNjZXNzICE9IG51bGwpIG9uU3VjY2VzcygpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAob25FcnJvciAhPSBudWxsKSBvbkVycm9yKG5ldyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRBcHBsaWNhdGlvbkVycm9yKFRBcHBsaWNhdGlvbkVycm9yLk1JU1NJTkdfUkVTVUxULCBcIiIKKyAgICAgICAgICAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0XCIpKTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSBjYXRjaCAoZTpURXJyb3IpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgIiAgaWYgKG9uRXJyb3IgIT0gbnVsbCkgb25FcnJvcihlKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0pOyIgPDwgZW5kbDsKKyAgICB9CisgICAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIC8vIEV4dGVuZHMgc3R1ZmYKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfcHJvY2Vzc29yID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIGV4dGVuZHMgIiArIGV4dGVuZHMgKyAiUHJvY2Vzc29yIjsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBjbGFzcyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIlByb2Nlc3NvciIgPDwgZXh0ZW5kc19wcm9jZXNzb3IKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgaW1wbGVtZW50cyBUUHJvY2Vzc29yIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGZ1bmN0aW9uICIgPDwgc2VydmljZV9uYW1lXyA8PCAiUHJvY2Vzc29yKGlmYWNlOiIgPDwgc2VydmljZV9uYW1lXworICAgICAgICAgICAgICAgICAgICAgPDwgIikiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInN1cGVyKGlmYWNlKTsiIDw8IGVuZGw7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWZhY2VfID0gaWZhY2U7IiA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiUFJPQ0VTU19NQVBbXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgPDwgIlwiXSA9ICIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoKTsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHJpdmF0ZSB2YXIgaWZhY2VfOiIgPDwgc2VydmljZV9uYW1lXyA8PCAiOyIgPDwgZW5kbDsKKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIGNvbnN0IFBST0NFU1NfTUFQOkRpY3Rpb25hcnkgPSBuZXcgRGljdGlvbmFyeSgpOyIgPDwgZW5kbDsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCisgIHN0cmluZyBvdmVycmlkZSA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIG92ZXJyaWRlID0gIm92ZXJyaWRlICI7CisgIH0KKyAgaW5kZW50KGZfc2VydmljZV8pIDw8IG92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICA8PCAicHVibGljIGZ1bmN0aW9uIHByb2Nlc3MoaXByb3Q6VFByb3RvY29sLCBvcHJvdDpUUHJvdG9jb2wpOkJvb2xlYW4iIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInZhciBtc2c6VE1lc3NhZ2UgPSBpcHJvdC5yZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsOworCisgIC8vIFRPRE8obWNzbGVlKTogdmFsaWRhdGUgbWVzc2FnZSwgd2FzIHRoZSBzZXFpZCBldGMuIGxlZ2l0PworICAvLyBBUy0gSWYgYWxsIG1ldGhvZCBpcyBvbmV3YXk6CisgIC8vIGRvIHlvdSBoYXZlIGFuIG9wcm90PworICAvLyBkbyB5b3UgeW91IG5lZWQgbnVsbGNoZWNrPworICBmX3NlcnZpY2VfCisgICAgICA8PCBpbmRlbnQoKSA8PCAidmFyIGZuOkZ1bmN0aW9uID0gUFJPQ0VTU19NQVBbbXNnLm5hbWVdOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgImlmIChmbiA9PSBudWxsKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgVFR5cGUuU1RSVUNUKTsiCisgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIGlwcm90LnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiICB2YXIgeDpUQXBwbGljYXRpb25FcnJvciA9IG5ldyBUQXBwbGljYXRpb25FcnJvcihUQXBwbGljYXRpb25FcnJvci5VTktOT1dOX01FVEhPRCwgIgorICAgICAgICAgIlwiSW52YWxpZCBtZXRob2QgbmFtZTogJ1wiK21zZy5uYW1lK1wiJ1wiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICIgIG9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShtc2cubmFtZSwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgbXNnLnNlcWlkKSk7IgorICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICB4LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgb3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7IgorICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIiAgcmV0dXJuIHRydWU7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiZm4uY2FsbCh0aGlzLG1zZy5zZXFpZCwgaXByb3QsIG9wcm90KTsiIDw8IGVuZGw7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOworCisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7CisgIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7CisgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKKyAgfQorCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7CisgIH0KKworICBnZW5lcmF0ZV9hczNfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UsIHRydWUsIHRydWUpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICAodm9pZCl0c2VydmljZTsKKyAgLy8gT3BlbiBjbGFzcworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByaXZhdGUgZnVuY3Rpb24gIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigpOkZ1bmN0aW9uIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIC8vIE9wZW4gZnVuY3Rpb24KKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gZnVuY3Rpb24oc2VxaWQ6aW50LCBpcHJvdDpUUHJvdG9jb2wsIG9wcm90OlRQcm90b2NvbCk6dm9pZCIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgc3RyaW5nIGFyZ3NuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKKyAgc3RyaW5nIHJlc3VsdG5hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidmFyIGFyZ3M6IiA8PCBhcmdzbmFtZSA8PCAiID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJhcmdzLnJlYWQoaXByb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaXByb3QucmVhZE1lc3NhZ2VFbmQoKTsiCisgICAgICAgICAgICAgPDwgZW5kbDsKKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworCisgIC8vIERlY2xhcmUgcmVzdWx0IGZvciBub24gb25ld2F5IGZ1bmN0aW9uCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInZhciByZXN1bHQ6IiA8PCByZXN1bHRuYW1lIDw8ICIgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiCisgICAgICAgICAgICAgICA8PCBlbmRsOworICB9CisKKyAgLy8gVHJ5IGJsb2NrIGZvciBhIGZ1bmN0aW9uIHdpdGggZXhjZXB0aW9ucworICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0cnkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCisgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGZfc2VydmljZV8gPDwgImlmYWNlXy4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiLy8gc29ycnkgdGhpcyBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCB5ZXQiIDw8IGVuZGw7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidGhyb3cgbmV3IEVycm9yKFwiVGhpcyBpcyBub3QgeWV0IHN1cHBvcnRlZFwiKTsiIDw8IGVuZGw7CisgIH0KKworICAvLyBTZXQgaXNzZXQgb24gc3VjY2VzcyBmaWVsZAorICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpCisgICAgICAmJiAhdHlwZV9jYW5fYmVfbnVsbCh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LnNldCIgPDwgZ2V0X2NhcF9uYW1lKCJzdWNjZXNzIikgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpCisgICAgICAgICAgICAgICA8PCAiKHRydWUpOyIgPDwgZW5kbDsKKyAgfQorCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiB4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSI7CisgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgIiBjYXRjaCAoIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjoiCisgICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiCisgICAgICAgICAgICAgICAgICAgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgIn0iOworICAgICAgfQorICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8ICIgY2F0Y2ggKHRoOkVycm9yKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRyYWNlKFwiSW50ZXJuYWwgZXJyb3IgcHJvY2Vzc2luZyAiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgPDwgIlwiLCB0aCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAidmFyIHg6VEFwcGxpY2F0aW9uRXJyb3IgPSBuZXcgIgorICAgICAgICAgICAgICAgICAgIlRBcHBsaWNhdGlvbkVycm9yKFRBcHBsaWNhdGlvbkVycm9yLklOVEVSTkFMX0VSUk9SLCBcIkludGVybmFsIGVycm9yIHByb2Nlc3NpbmcgIgorICAgICAgICAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIik7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgIDw8ICJcIiwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgc2VxaWQpKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIngud3JpdGUob3Byb3QpOyIKKyAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIm9wcm90LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfQorCisgIC8vIFNob3J0Y3V0IG91dCBoZXJlIGZvciBvbmV3YXkgZnVuY3Rpb25zCisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworCisgICAgLy8gQ2xvc2UgY2xhc3MKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICByZXR1cm47CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgIDw8ICJcIiwgVE1lc3NhZ2VUeXBlLlJFUExZLCBzZXFpZCkpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LndyaXRlKG9wcm90KTsiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIm9wcm90LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7IiA8PCBlbmRsOworCisgIC8vIENsb3NlIGZ1bmN0aW9uCisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAvLyBDbG9zZSBjbGFzcworICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCisgKgorICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQKKyAqIEBwYXJhbSBwcmVmaXggVGhlIHZhcmlhYmxlIG5hbWUgb3IgY29udGFpbmVyIGZvciB0aGlzIGZpZWxkCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCkgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICB9CisKKyAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisKKyAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIgPSBpcHJvdC4iOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgb3V0IDw8ICJyZWFkQmluYXJ5KCk7IjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgInJlYWRTdHJpbmcoKTsiOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgInJlYWRCb29sKCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgInJlYWRCeXRlKCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJyZWFkSTE2KCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJyZWFkSTMyKCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJyZWFkSTY0KCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJyZWFkRG91YmxlKCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEFzMyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCAicmVhZEkzMigpOyI7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGFuIHVuc2VyaWFsaXplciBmb3IgYSBzdHJ1Y3QsIGludm9rZXMgcmVhZCgpCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgcHJlZml4IDw8ICIucmVhZChpcHJvdCk7IiA8PCBlbmRsOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGNvbnRhaW5lciBieSByZWFkaW5nIGl0cyBzaXplIGFuZCB0aGVuIGl0ZXJhdGluZworICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgeworICBzY29wZV91cChvdXQpOworCisgIHN0cmluZyBvYmo7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIG9iaiA9IHRtcCgiX21hcCIpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIG9iaiA9IHRtcCgiX3NldCIpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBvYmogPSB0bXAoIl9saXN0Iik7CisgIH0KKworICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJ2YXIgIiA8PCBvYmogPDwgIjpUTWFwID0gaXByb3QucmVhZE1hcEJlZ2luKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJ2YXIgIiA8PCBvYmogPDwgIjpUU2V0ID0gaXByb3QucmVhZFNldEJlZ2luKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAidmFyICIgPDwgb2JqIDw8ICI6VExpc3QgPSBpcHJvdC5yZWFkTGlzdEJlZ2luKCk7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKQorICAgICAgICAgICAgICAvLyBzaXplIHRoZSBjb2xsZWN0aW9uIGNvcnJlY3RseQorICAgICAgICAgICAgICA8PCAiKCIKKyAgICAgICAgICAgICAgPDwgIik7IiA8PCBlbmRsOworCisgIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKKyAgc3RyaW5nIGkgPSB0bXAoIl9pIik7CisgIGluZGVudChvdXQpIDw8ICJmb3IgKHZhciAiIDw8IGkgPDwgIjppbnQgPSAwOyAiIDw8IGkgPDwgIiA8ICIgPDwgb2JqIDw8ICIuc2l6ZSIKKyAgICAgICAgICAgICAgPDwgIjsgIgorICAgICAgICAgICAgICA8PCAiKysiIDw8IGkgPDwgIikiIDw8IGVuZGw7CisKKyAgc2NvcGVfdXAob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgcHJlZml4KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIHByZWZpeCk7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7CisKKyAgLy8gUmVhZCBjb250YWluZXIgZW5kCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZE1hcEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZFNldEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRMaXN0RW5kKCk7IiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIHRvIGRlc2VyaWFsaXplIGEgbWFwCisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBrZXkgPSB0bXAoIl9rZXkiKTsKKyAgc3RyaW5nIHZhbCA9IHRtcCgiX3ZhbCIpOworICB0X2ZpZWxkIGZrZXkodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7CisgIHRfZmllbGQgZnZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKKworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZma2V5KSA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmdmFsKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXkpOworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsKTsKKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIlsiIDw8IGtleSA8PCAiXSA9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIHNldCBlbGVtZW50CisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmVsZW0pIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOworCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLmFkZCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGxpc3QgZWxlbWVudAorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIucHVzaCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCkgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisKKyAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICB9CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisKKyAgICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3QuIjsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICAgIG91dCA8PCAid3JpdGVCaW5hcnkoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZygiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUJvb2woIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUJ5dGUoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCAid3JpdGVJMTYoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAid3JpdGVJNjQoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIG91dCA8PCAid3JpdGVEb3VibGUoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBBczMgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKTsiOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgcHJlZml4LmNfc3RyKCksCisgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7CisgIH0KK30KKworLyoqCisgKiBTZXJpYWxpemVzIGFsbCB0aGUgbWVtYmVycyBvZiBhIHN0cnVjdC4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IHRvIHNlcmlhbGl6ZQorICogQHBhcmFtIHByZWZpeCAgU3RyaW5nIHByZWZpeCB0byBhdHRhY2ggdG8gYWxsIGZpZWxkcworICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7CisgICh2b2lkKXRzdHJ1Y3Q7CisgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIi53cml0ZShvcHJvdCk7IiA8PCBlbmRsOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYSBjb250YWluZXIgYnkgd3JpdGluZyBpdHMgc2l6ZSB0aGVuIHRoZSBlbGVtZW50cy4KKyAqCisgKiBAcGFyYW0gdHR5cGUgIFRoZSB0eXBlIG9mIGNvbnRhaW5lcgorICogQHBhcmFtIHByZWZpeCBTdHJpbmcgcHJlZml4IGZvciBmaWVsZHMKKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHN0cmluZyBpdGVyID0gdG1wKCJfa2V5Iik7CisgICAgc3RyaW5nIGNvdW50ZXIgPSB0bXAoIl9zaXplQ291bnRlciIpOworICAgIGluZGVudChvdXQpIDw8ICJ2YXIgIiA8PCBjb3VudGVyIDw8ICI6aW50ID0gMDsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgImZvciAodmFyICIgPDwgaXRlciA8PCAiOiogaW4gIiA8PCBwcmVmaXggPDwgIikgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICAiIDw8IGNvdW50ZXIgPDwgKyIrKzsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVNYXBCZWdpbihuZXcgVE1hcCgiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKQorICAgICAgICAgICAgICAgIDw8ICIsICIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIgPDwgY291bnRlciA8PCAiKSk7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlU2V0QmVnaW4obmV3IFRTZXQoIiA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpCisgICAgICAgICAgICAgICAgPDwgIiwgIiA8PCBwcmVmaXggPDwgIi5zaXplKSk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVMaXN0QmVnaW4obmV3IFRMaXN0KCIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8IHByZWZpeCA8PCAiLmxlbmd0aCkpOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICB9CisKKyAgc3RyaW5nIGl0ZXIgPSB0bXAoImVsZW0iKTsKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJmb3IgKHZhciAiIDw8IGl0ZXIgPDwgIjoqIGluICIgPDwgcHJlZml4IDw8ICIpIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yIGVhY2ggKHZhciAiIDw8IGl0ZXIgPDwgIjoqIGluICIgPDwgcHJlZml4IDw8ICIudG9BcnJheSgpKSI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJmb3IgZWFjaCAodmFyICIgPDwgaXRlciA8PCAiOiogaW4gIiA8PCBwcmVmaXggPDwgIikiOworICB9CisKKyAgc2NvcGVfdXAob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgaXRlciwgcHJlZml4KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyKTsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlTWFwRW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVNldEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlTGlzdEVuZCgpOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbWFwKSB7CisgIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCwgIiIpOworICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgbWFwICsgIlsiICsgaXRlciArICJdIik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQsICIiKTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgorICovCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBpdGVyKSB7CisgIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbGlzdC4KKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgaXRlcikgeworICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOworfQorCisvKioKKyAqIFJldHVybnMgYSBBczMgdHlwZSBuYW1lCisgKgorICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCisgKiBAcGFyYW0gY29udGFpbmVyIElzIHRoZSB0eXBlIGdvaW5nIGluc2lkZSBhIGNvbnRhaW5lcj8KKyAqIEByZXR1cm4gQXMzIHR5cGUgbmFtZSwgaS5lLiBIYXNoTWFwPEtleSxWYWx1ZT4KKyAqLworc3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgaW5fY29udGFpbmVyLCBib29sIGluX2luaXQpIHsKKyAgKHZvaWQpaW5faW5pdDsKKyAgLy8gSW4gQXMzIHR5cGVkZWZzIGFyZSBqdXN0IHJlc29sdmVkIHRvIHRoZWlyIHJlYWwgdHlwZQorICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworICBzdHJpbmcgcHJlZml4OworCisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICByZXR1cm4gYmFzZV90eXBlX25hbWUoKHRfYmFzZV90eXBlKil0dHlwZSwgaW5fY29udGFpbmVyKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJpbnQiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiRGljdGlvbmFyeSI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJTZXQiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIkFycmF5IjsKKyAgfQorCisgIC8vIENoZWNrIGZvciBuYW1lc3BhY2luZworICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKKyAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7CisgICAgc3RyaW5nIHBhY2thZ2UgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJhczMiKTsKKyAgICBpZiAoIXBhY2thZ2UuZW1wdHkoKSkgeworICAgICAgcmV0dXJuIHBhY2thZ2UgKyAiLiIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gdHR5cGUtPmdldF9uYW1lKCk7Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgQVMzIHR5cGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgdGhyaWZ0IHR5cGUuCisgKgorICogQHBhcmFtIHRiYXNlIFRoZSBiYXNlIHR5cGUKKyAqIEBwYXJhbSBjb250YWluZXIgSXMgaXQgZ29pbmcgaW4gYSBBczMgY29udGFpbmVyPworICovCitzdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjpiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdHlwZSwgYm9vbCBpbl9jb250YWluZXIpIHsKKyAgKHZvaWQpaW5fY29udGFpbmVyOworICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gdHlwZS0+Z2V0X2Jhc2UoKTsKKworICBzd2l0Y2ggKHRiYXNlKSB7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICByZXR1cm4gInZvaWQiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIHJldHVybiAiQnl0ZUFycmF5IjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuICJTdHJpbmciOworICAgIH0KKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgIHJldHVybiAiQm9vbGVhbiI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICByZXR1cm4gImludCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgIHRocm93ICJpNjQgaXMgbm90IHlldCBzdXBwb3J0ZWQgaW4gYXMzIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgcmV0dXJuICJOdW1iZXIiOworICBkZWZhdWx0OgorICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQXMzIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgfQorfQorCisvKioKKyAqIERlY2xhcmVzIGEgZmllbGQsIHdoaWNoIG1heSBpbmNsdWRlIGluaXRpYWxpemF0aW9uIGFzIG5lY2Vzc2FyeS4KKyAqCisgKiBAcGFyYW0gdHR5cGUgVGhlIHR5cGUKKyAqLworc3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCkgeworICAvLyBUT0RPKG1jc2xlZSk6IGRvIHdlIGV2ZXIgbmVlZCB0byBpbml0aWFsaXplIHRoZSBmaWVsZD8KKyAgc3RyaW5nIHJlc3VsdCA9ICJ2YXIgIiArIHRmaWVsZC0+Z2V0X25hbWUoKSArICI6IiArIHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpOworICBpZiAoaW5pdCkgeworICAgIHRfdHlwZSogdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiB0ZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKKyAgICAgIHN0ZDo6b2ZzdHJlYW0gZHVtbXk7CisgICAgICByZXN1bHQgKz0gIiA9ICIgKyByZW5kZXJfY29uc3RfdmFsdWUoZHVtbXksIHRmaWVsZC0+Z2V0X25hbWUoKSwgdHR5cGUsIHRmaWVsZC0+Z2V0X3ZhbHVlKCkpOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIHJlc3VsdCArPSAiID0gZmFsc2UiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIHJlc3VsdCArPSAiID0gMCI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIHJlc3VsdCArPSAiID0gKGRvdWJsZSkwIjsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIHJlc3VsdCArPSAiID0gMCI7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKSArICIoKSI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKSArICIoKSI7CisgICAgICA7CisgICAgfQorICB9CisgIHJldHVybiByZXN1bHQgKyAiOyI7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJworICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCitzdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4KSB7CisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50cyA9IGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgaWYgKGFyZ3VtZW50cyAhPSAiIikgeworICAgICAgYXJndW1lbnRzICs9ICIsICI7CisgICAgfQorICAgIGFyZ3VtZW50cyArPSAib25FcnJvcjpGdW5jdGlvbiwgb25TdWNjZXNzOkZ1bmN0aW9uIjsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIHJlc3VsdCA9ICJmdW5jdGlvbiAiICsgcHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIigiICsgYXJndW1lbnRzICsgIik6dm9pZCI7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGNvbW1hIHNlcGFyYXRlZCBmaWVsZCBsaXN0LCB3aXRoIHR5cGUgbmFtZXMKKyAqLworc3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSAiLCAiOworICAgIH0KKyAgICByZXN1bHQgKz0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIjoiICsgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIEMrKyBlbnVtIHN0cmluZyBmb3IgdGhlIGdpdmVuIHR5cGUuCisgKi8KK3N0cmluZyB0X2FzM19nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIlRUeXBlLlNUUklORyI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJUVHlwZS5CT09MIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJUVHlwZS5CWVRFIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiVFR5cGUuSTE2IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiVFR5cGUuSTMyIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiVFR5cGUuSTY0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiVFR5cGUuRE9VQkxFIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5JMzIiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLlNUUlVDVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLk1BUCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLlNFVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5MSVNUIjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworLyoqCisgKiBBcHBsaWVzIHRoZSBjb3JyZWN0IHN0eWxlIHRvIGEgc3RyaW5nIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiBub2NhbWVsX3N0eWxlXworICovCitzdGQ6OnN0cmluZyB0X2FzM19nZW5lcmF0b3I6OmdldF9jYXBfbmFtZShzdGQ6OnN0cmluZyBuYW1lKSB7CisgIG5hbWVbMF0gPSB0b3VwcGVyKG5hbWVbMF0pOworICByZXR1cm4gbmFtZTsKK30KKworc3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6Y29uc3RhbnRfbmFtZShzdHJpbmcgbmFtZSkgeworICBzdHJpbmcgY29uc3RhbnRfbmFtZTsKKworICBib29sIGlzX2ZpcnN0ID0gdHJ1ZTsKKyAgYm9vbCB3YXNfcHJldmlvdXNfY2hhcl91cHBlciA9IGZhbHNlOworICBmb3IgKHN0cmluZzo6aXRlcmF0b3IgaXRlciA9IG5hbWUuYmVnaW4oKTsgaXRlciAhPSBuYW1lLmVuZCgpOyArK2l0ZXIpIHsKKyAgICBzdHJpbmc6OnZhbHVlX3R5cGUgY2hhcmFjdGVyID0gKCppdGVyKTsKKworICAgIGJvb2wgaXNfdXBwZXIgPSBpc3VwcGVyKGNoYXJhY3Rlcik7CisKKyAgICBpZiAoaXNfdXBwZXIgJiYgIWlzX2ZpcnN0ICYmICF3YXNfcHJldmlvdXNfY2hhcl91cHBlcikgeworICAgICAgY29uc3RhbnRfbmFtZSArPSAnXyc7CisgICAgfQorICAgIGNvbnN0YW50X25hbWUgKz0gdG91cHBlcihjaGFyYWN0ZXIpOworCisgICAgaXNfZmlyc3QgPSBmYWxzZTsKKyAgICB3YXNfcHJldmlvdXNfY2hhcl91cHBlciA9IGlzX3VwcGVyOworICB9CisKKyAgcmV0dXJuIGNvbnN0YW50X25hbWU7Cit9CisKKy8qKgorICogRW1pdHMgYSBBczNEb2MgY29tbWVudCBpZiB0aGUgcHJvdmlkZWQgb2JqZWN0IGhhcyBhIGRvYyBpbiBUaHJpZnQKKyAqLwordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2FzM19kb2Mob3N0cmVhbSYgb3V0LCB0X2RvYyogdGRvYykgeworICBpZiAodGRvYy0+aGFzX2RvYygpKSB7CisgICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiLyoqXG4iLCAiICogIiwgdGRvYy0+Z2V0X2RvYygpLCAiICovXG4iKTsKKyAgfQorfQorCisvKioKKyAqIEVtaXRzIGEgQXMzRG9jIGNvbW1lbnQgaWYgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIG9iamVjdCBoYXMgYSBkb2MgaW4gVGhyaWZ0CisgKi8KK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfZG9jKG9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIGlmICh0ZnVuY3Rpb24tPmhhc19kb2MoKSkgeworICAgIHN0cmluZ3N0cmVhbSBzczsKKyAgICBzcyA8PCB0ZnVuY3Rpb24tPmdldF9kb2MoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgcF9pdGVyOworICAgIGZvciAocF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IHBfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrcF9pdGVyKSB7CisgICAgICB0X2ZpZWxkKiBwID0gKnBfaXRlcjsKKyAgICAgIHNzIDw8ICJcbkBwYXJhbSAiIDw8IHAtPmdldF9uYW1lKCk7CisgICAgICBpZiAocC0+aGFzX2RvYygpKSB7CisgICAgICAgIHNzIDw8ICIgIiA8PCBwLT5nZXRfZG9jKCk7CisgICAgICB9CisgICAgfQorICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwgIi8qKlxuIiwgIiAqICIsIHNzLnN0cigpLCAiICovXG4iKTsKKyAgfQorfQorCitzdGQ6OnN0cmluZyB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2lzc2V0X2NoZWNrKHRfZmllbGQqIGZpZWxkKSB7CisgIHJldHVybiBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZC0+Z2V0X25hbWUoKSk7Cit9CisKK3N0ZDo6c3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfY2hlY2soc3RkOjpzdHJpbmcgZmllbGRfbmFtZSkgeworICByZXR1cm4gImlzIiArIGdldF9jYXBfbmFtZSgic2V0IikgKyBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSkgKyAiKCkiOworfQorCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfc2V0KG9zdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpIHsKKyAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKGZpZWxkLT5nZXRfdHlwZSgpKSkgeworICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLl9faXNzZXRfIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiID0gdHJ1ZTsiIDw8IGVuZGw7CisgIH0KK30KKworc3RkOjpzdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjpnZXRfZW51bV9jbGFzc19uYW1lKHRfdHlwZSogdHlwZSkgeworICBzdHJpbmcgcGFja2FnZSA9ICIiOworICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0eXBlLT5nZXRfcHJvZ3JhbSgpOworICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKKyAgICBwYWNrYWdlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiYXMzIikgKyAiLiI7CisgIH0KKyAgcmV0dXJuIHBhY2thZ2UgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAorICAgIGFzMywKKyAgICAiQVMzIiwKKyAgICAiICAgIGJpbmRhYmxlOiAgICAgICAgQWRkIFtiaW5kYWJsZV0gbWV0YWRhdGEgdG8gYWxsIHRoZSBzdHJ1Y3QgY2xhc3Nlcy5cbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NfZ2xpYl9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NfZ2xpYl9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUzYmFkMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY19nbGliX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDQ1ODcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKworI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworLyogZm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KK3N0cmluZyBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoc3RyaW5nIG5hbWUpOworc3RyaW5nIHVuZGVyc2NvcmVzX3RvX2luaXRpYWxfY2FwcyhzdHJpbmcgbmFtZSk7CitzdHJpbmcgdG9fdXBwZXJfY2FzZShzdHJpbmcgbmFtZSk7CitzdHJpbmcgdG9fbG93ZXJfY2FzZShzdHJpbmcgbmFtZSk7CisKKy8qKgorICogQyBjb2RlIGdlbmVyYXRvciwgdXNpbmcgZ2xpYiBmb3IgQyB0eXBpbmcuCisgKi8KK2NsYXNzIHRfY19nbGliX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgeworcHVibGljOgorICAvKiBjb25zdHJ1Y3RvciAqLworICB0X2NfZ2xpYl9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWFwPHN0cmluZywgc3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIC8qIHNldCB0aGUgb3V0cHV0IGRpcmVjdG9yeSAqLworICAgIHRoaXMtPm91dF9kaXJfYmFzZV8gPSAiZ2VuLWNfZ2xpYiI7CisKKyAgICAvKiBubyBvcHRpb25zIHlldCAqLworICAgIGZvciggaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgeworICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIGNfZ2xpYjoiICsgaXRlci0+Zmlyc3Q7CisgICAgfQorCisgICAgLyogc2V0IHRoZSBuYW1lc3BhY2UgKi8KKyAgICB0aGlzLT5uc3BhY2UgPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiY19nbGliIik7CisKKyAgICBpZiAodGhpcy0+bnNwYWNlLmVtcHR5KCkpIHsKKyAgICAgIHRoaXMtPm5zcGFjZSA9ICIiOworICAgICAgdGhpcy0+bnNwYWNlX3UgPSAiIjsKKyAgICAgIHRoaXMtPm5zcGFjZV91YyA9ICIiOworICAgICAgdGhpcy0+bnNwYWNlX2xjID0gIiI7CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIHJlcGxhY2UgZG90cyB3aXRoIHVuZGVyc2NvcmVzICovCisgICAgICBjaGFyKiB0bXAgPSBzdHJkdXAodGhpcy0+bnNwYWNlLmNfc3RyKCkpOworICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBzdHJsZW4odG1wKTsgaSsrKSB7CisgICAgICAgIGlmICh0bXBbaV0gPT0gJy4nKSB7CisgICAgICAgICAgdG1wW2ldID0gJ18nOworICAgICAgICB9CisgICAgICB9CisgICAgICB0aGlzLT5uc3BhY2UgPSBzdHJpbmcodG1wLCBzdHJsZW4odG1wKSk7CisgICAgICBmcmVlKHRtcCk7CisKKyAgICAgIC8qIGNsZWFuIHVwIHRoZSBuYW1lc3BhY2UgZm9yIEMuCisgICAgICAgKiBBbiBpbnB1dCBvZiAnbmFtZXNwYWNlIGZvbycgc2hvdWxkIHJlc3VsdCBpbjoKKyAgICAgICAqICAtIG5zcGFjZSA9IGZvbyAgICAgICAtIGZvciB0aHJpZnQgb2JqZWN0cyBhbmQgdHlwZWRlZnMKKyAgICAgICAqICAtIG5zcGFjZV91ID0gRm9vICAgICAtIGZvciBpbnRlcm5hbCBHT2JqZWN0IHByZWZpeGVzCisgICAgICAgKiAgLSBuc3BhY2VfdWMgPSBGT09fICAgLSBmb3IgbWFjcm8gcHJlZml4ZXMKKyAgICAgICAqICAtIG5zcGFjZV9sYyA9IGZvb18gICAtIGZvciBmaWxlbmFtZSBhbmQgbWV0aG9kIHByZWZpeGVzCisgICAgICAgKiBUaGUgdW5kZXJzY29yZXMgYXJlIHRoZXJlIHNpbmNlIHVjIGFuZCBsYyBzdHJpbmdzIGFyZSB1c2VkIGFzIGZpbGUgYW5kCisgICAgICAgKiB2YXJpYWJsZSBwcmVmaXhlcy4KKyAgICAgICAqLworICAgICAgdGhpcy0+bnNwYWNlX3UgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXModGhpcy0+bnNwYWNlKTsKKyAgICAgIHRoaXMtPm5zcGFjZV91YyA9IHRvX3VwcGVyX2Nhc2UodGhpcy0+bnNwYWNlX3UpICsgIl8iOworICAgICAgdGhpcy0+bnNwYWNlX2xjID0gdG9fbG93ZXJfY2FzZSh0aGlzLT5uc3BhY2VfdSkgKyAiXyI7CisgICAgfQorICB9CisKKyAgLyogaW5pdGlhbGl6YXRpb24gYW5kIGRlc3RydWN0aW9uICovCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICAvKiBnZW5lcmF0aW9uIGZ1bmN0aW9ucyAqLworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdHModmVjdG9yPHRfY29uc3QqPiBjb25zdHMpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHN0cnVjdCk7CisKK3ByaXZhdGU6CisgIC8qIGZpbGUgc3RyZWFtcyAqLworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfdHlwZXNfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfdHlwZXNfaW1wbF87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9oZWFkZXJfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZV87CisKKyAgLyogbmFtZXNwYWNlIHZhcmlhYmxlcyAqLworICBzdHJpbmcgbnNwYWNlOworICBzdHJpbmcgbnNwYWNlX3U7CisgIHN0cmluZyBuc3BhY2VfdWM7CisgIHN0cmluZyBuc3BhY2VfbGM7CisKKyAgLyogaGVscGVyIGZ1bmN0aW9ucyAqLworICBib29sIGlzX2NvbXBsZXhfdHlwZSh0X3R5cGUqIHR0eXBlKTsKKyAgYm9vbCBpc19udW1lcmljKHRfdHlwZSogdHR5cGUpOworICBzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgaW5fdHlwZWRlZiA9IGZhbHNlLCBib29sIGlzX2NvbnN0ID0gZmFsc2UpOworICBzdHJpbmcgcHJvcGVydHlfdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgaW5fdHlwZWRlZiA9IGZhbHNlLCBib29sIGlzX2NvbnN0ID0gZmFsc2UpOworICBzdHJpbmcgYmFzZV90eXBlX25hbWUodF90eXBlKiB0eXBlKTsKKyAgc3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpOworICBzdHJpbmcgY29uc3RhbnRfbGl0ZXJhbCh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKyAgc3RyaW5nIGNvbnN0YW50X3ZhbHVlKHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKyAgc3RyaW5nIGNvbnN0YW50X3ZhbHVlX3dpdGhfc3RvcmFnZShzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisgIHN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgc3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICBzdHJpbmcgeGNlcHRpb25fbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbml0ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlciA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGNvbnN0YW50ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVmZXJlbmNlID0gZmFsc2UpOworICB2b2lkIGRlY2xhcmVfbG9jYWxfdmFyaWFibGUob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcmIGJhc2VfbmFtZSwgYm9vbCBmb3JfaGFzaF90YWJsZSk7CisgIHZvaWQgZGVjbG9yZV9sb2NhbF92YXJpYWJsZV9mb3Jfd3JpdGUob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcmIGJhc2VfbmFtZSk7CisKKyAgLyogZ2VuZXJhdGlvbiBmdW5jdGlvbnMgKi8KKyAgdm9pZCBnZW5lcmF0ZV9jb25zdF9pbml0aWFsaXplcihzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB0b3BfbGV2ZWwgPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGFuZGxlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9vYmplY3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdF93cml0ZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdGhpc19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHRoaXNfZ2V0ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2Z1bmN0aW9uID0gdHJ1ZSk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0aGlzX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdGhpc19nZXQgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZnVuY3Rpb24gPSB0cnVlKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCk7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4LCBpbnQgZXJyb3JfcmV0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCwgaW50IGVycm9yX3JldCk7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCk7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBlbGVtZW50LCBpbnQgZXJyb3JfcmV0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFsbG9jYXRlID0gdHJ1ZSk7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWxsb2NhdGUgPSB0cnVlKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4LCBpbnQgZXJyb3JfcmV0KTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdHJpbmcgcHJlZml4LCBpbnQgZXJyb3JfcmV0KTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgcHJlZml4LCBpbnQgZXJyb3JfcmV0KTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQpOworCisgIHN0cmluZyBnZW5lcmF0ZV9uZXdfaGFzaF9mcm9tX3R5cGUodF90eXBlKiBrZXksIHRfdHlwZSogdmFsdWUpOworICBzdHJpbmcgZ2VuZXJhdGVfbmV3X2FycmF5X2Zyb21fdHlwZSh0X3R5cGUqIHR0eXBlKTsKKworICBzdHJpbmcgZ2VuZXJhdGVfZnJlZV9mdW5jX2Zyb21fdHlwZSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RyaW5nIGdlbmVyYXRlX2hhc2hfZnVuY19mcm9tX3R5cGUodF90eXBlKiB0dHlwZSk7CisgIHN0cmluZyBnZW5lcmF0ZV9jbXBfZnVuY19mcm9tX3R5cGUodF90eXBlKiB0dHlwZSk7Cit9OworCisvKioKKyAqIFByZXBhcmUgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZQorICogb3V0cHV0IHN0cmVhbXMuCisgKi8KK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgLyogY3JlYXRlIG91dHB1dCBkaXJlY3RvcnkgKi8KKyAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKKworICBzdHJpbmcgcHJvZ3JhbV9uYW1lX3UgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMocHJvZ3JhbV9uYW1lXyk7CisgIHN0cmluZyBwcm9ncmFtX25hbWVfdWMgPSB0b191cHBlcl9jYXNlKHByb2dyYW1fbmFtZV91KTsKKyAgc3RyaW5nIHByb2dyYW1fbmFtZV9sYyA9IHRvX2xvd2VyX2Nhc2UocHJvZ3JhbV9uYW1lX3UpOworCisgIC8qIGNyZWF0ZSBvdXRwdXQgZmlsZXMgKi8KKyAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyB0aGlzLT5uc3BhY2VfbGMgKyBwcm9ncmFtX25hbWVfbGMgKyAiX3R5cGVzLmgiOworICBmX3R5cGVzXy5vcGVuKGZfdHlwZXNfbmFtZS5jX3N0cigpKTsKKyAgc3RyaW5nIGZfdHlwZXNfaW1wbF9uYW1lID0gZ2V0X291dF9kaXIoKSArIHRoaXMtPm5zcGFjZV9sYyArIHByb2dyYW1fbmFtZV9sYyArICJfdHlwZXMuYyI7CisgIGZfdHlwZXNfaW1wbF8ub3BlbihmX3R5cGVzX2ltcGxfbmFtZS5jX3N0cigpKTsKKworICAvKiBhZGQgdGhyaWZ0IGJvaWxlcnBsYXRlIGhlYWRlcnMgKi8KKyAgZl90eXBlc18gPDwgYXV0b2dlbl9jb21tZW50KCk7CisgIGZfdHlwZXNfaW1wbF8gPDwgYXV0b2dlbl9jb21tZW50KCk7CisKKyAgLyogaW5jbHVkZSBpbmNsdXNpb24gZ3VhcmQgKi8KKyAgZl90eXBlc18gPDwgIiNpZm5kZWYgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgcHJvZ3JhbV9uYW1lX3VjIDw8ICJfVFlQRVNfSCIgPDwgZW5kbCA8PCAiI2RlZmluZSAiCisgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBwcm9ncmFtX25hbWVfdWMgPDwgIl9UWVBFU19IIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLyogaW5jbHVkZSBiYXNlIHR5cGVzICovCisgIGZfdHlwZXNfIDw8ICIvKiBiYXNlIGluY2x1ZGVzICovIiA8PCBlbmRsIDw8ICIjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4iIDw8IGVuZGwKKyAgICAgICAgICAgPDwgIiNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdF9zdHJ1Y3QuaD4iIDw8IGVuZGwKKyAgICAgICAgICAgPDwgIiNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oPiIgPDwgZW5kbDsKKworICAvKiBpbmNsdWRlIG90aGVyIHRocmlmdCBpbmNsdWRlcyAqLworICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOworICBpZiAoIWluY2x1ZGVzLmVtcHR5KCkpIHsKKyAgICBmX3R5cGVzXyA8PCAiLyogb3RoZXIgdGhyaWZ0IGluY2x1ZGVzICovIiA8PCBlbmRsOworCisgICAgZm9yICh2ZWN0b3I8dF9wcm9ncmFtKj46OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBpbmNsdWRlcy5iZWdpbigpOworICAgICAgICAgaXRlciAhPSBpbmNsdWRlcy5lbmQoKTsKKyAgICAgICAgICsraXRlcikgeworICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGluY2x1ZGVfbnNwYWNlID0gKCppdGVyKS0+Z2V0X25hbWVzcGFjZSgiY19nbGliIik7CisgICAgICBzdGQ6OnN0cmluZyBpbmNsdWRlX25zcGFjZV9wcmVmaXggPQorICAgICAgICBpbmNsdWRlX25zcGFjZS5lbXB0eSgpID8gIiIgOiBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoaW5jbHVkZV9uc3BhY2UpICsgIl8iOworCisgICAgICBmX3R5cGVzXyA8PCAiI2luY2x1ZGUgXCIiIDw8IGluY2x1ZGVfbnNwYWNlX3ByZWZpeAorICAgICAgICAgICAgICAgPDwgaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqaXRlciktPmdldF9uYW1lKCkpIDw8ICJfdHlwZXMuaFwiIiA8PCBlbmRsOworICAgIH0KKyAgICBmX3R5cGVzXyA8PCBlbmRsOworICB9CisKKyAgLyogaW5jbHVkZSBjdXN0b20gaGVhZGVycyAqLworICBjb25zdCB2ZWN0b3I8c3RyaW5nPiYgY19pbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfY19pbmNsdWRlcygpOworICBmX3R5cGVzXyA8PCAiLyogY3VzdG9tIHRocmlmdCBpbmNsdWRlcyAqLyIgPDwgZW5kbDsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjX2luY2x1ZGVzLnNpemUoKTsgKytpKSB7CisgICAgaWYgKGNfaW5jbHVkZXNbaV1bMF0gPT0gJzwnKSB7CisgICAgICBmX3R5cGVzXyA8PCAiI2luY2x1ZGUgIiA8PCBjX2luY2x1ZGVzW2ldIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfdHlwZXNfIDw8ICIjaW5jbHVkZSBcIiIgPDwgY19pbmNsdWRlc1tpXSA8PCAiXCIiIDw8IGVuZGw7CisgICAgfQorICB9CisgIGZfdHlwZXNfIDw8IGVuZGw7CisKKyAgLyogaW5jbHVkZSBtYXRoLmggKGZvciAiSU5GSU5JVFkiKSBpbiB0aGUgaW1wbGVtZW50YXRpb24gZmlsZSwgaW4gY2FzZSB3ZQorICAgICBlbmNvdW50ZXIgYSBzdHJ1Y3Qgd2l0aCBhIG1lbWJlciBvZiB0eXBlIGRvdWJsZSAqLworICBmX3R5cGVzX2ltcGxfIDw8IGVuZGwgPDwgIiNpbmNsdWRlIDxtYXRoLmg+IiA8PCBlbmRsOworCisgIC8vIGluY2x1ZGUgdGhlIHR5cGVzIGZpbGUKKyAgZl90eXBlc19pbXBsXyA8PCBlbmRsIDw8ICIjaW5jbHVkZSBcIiIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHByb2dyYW1fbmFtZV91IDw8ICJfdHlwZXMuaFwiIgorICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgIiNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPiIgPDwgZW5kbCA8PCBlbmRsOworCisgIGZfdHlwZXNfIDw8ICIvKiBiZWdpbiB0eXBlcyAqLyIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqICBGaW5pc2ggdXAgZ2VuZXJhdGlvbiBhbmQgY2xvc2UgYWxsIGZpbGUgc3RyZWFtcy4KKyAqLwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKKyAgc3RyaW5nIHByb2dyYW1fbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHByb2dyYW1fbmFtZV8pKTsKKworICAvKiBlbmQgdGhlIGhlYWRlciBpbmNsdXNpb24gZ3VhcmQgKi8KKyAgZl90eXBlc18gPDwgIiNlbmRpZiAvKiAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBwcm9ncmFtX25hbWVfdWMgPDwgIl9UWVBFU19IICovIiA8PCBlbmRsOworCisgIC8qIGNsb3NlIG91dHB1dCBmaWxlICovCisgIGZfdHlwZXNfLmNsb3NlKCk7CisgIGZfdHlwZXNfaW1wbF8uY2xvc2UoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBUaHJpZnQgdHlwZWRlZiBpbiBDIGNvZGUuICBGb3IgZXhhbXBsZToKKyAqCisgKiBUaHJpZnQ6CisgKiB0eXBlZGVmIG1hcDxpMzIsaTMyPiBTb21lTWFwCisgKgorICogQzoKKyAqIHR5cGVkZWYgR0hhc2hUYWJsZSAqIFRocmlmdFNvbWVNYXA7CisgKi8KK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInR5cGVkZWYgIiA8PCB0eXBlX25hbWUodHR5cGVkZWYtPmdldF90eXBlKCksIHRydWUpIDw8ICIgIiA8PCB0aGlzLT5uc3BhY2UKKyAgICAgICAgICAgPDwgdHR5cGVkZWYtPmdldF9zeW1ib2xpYygpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgQyBlbnVtZXJhdGlvbi4gIEZvciBleGFtcGxlOgorICoKKyAqIFRocmlmdDoKKyAqIGVudW0gTXlFbnVtIHsKKyAqICAgT05FID0gMSwKKyAqICAgVFdPCisgKiB9CisgKgorICogQzoKKyAqIGVudW0gX1RocmlmdE15RW51bSB7CisgKiAgIFRIUklGVF9NWV9FTlVNX09ORSA9IDEsCisgKiAgIFRIUklGVF9NWV9FTlVNX1RXTworICogfTsKKyAqIHR5cGVkZWYgZW51bSBfVGhyaWZ0TXlFbnVtIFRocmlmdE15RW51bTsKKyAqLwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICBzdHJpbmcgbmFtZSA9IHRlbnVtLT5nZXRfbmFtZSgpOworICBzdHJpbmcgbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKG5hbWUpKTsKKworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiZW51bSBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiIHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKworICAvKiBvdXRwdXQgZWFjaCBvZiB0aGUgZW51bWVyYXRpb24gZWxlbWVudHMgKi8KKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfdHlwZXNfIDw8ICIsIiA8PCBlbmRsOworICAgIH0KKworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBuYW1lX3VjIDw8ICJfIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCk7CisgICAgZl90eXBlc18gPDwgIiA9ICIgPDwgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfdHlwZXNfIDw8IGVuZGwgPDwgIn07IiA8PCBlbmRsIDw8ICJ0eXBlZGVmIGVudW0gXyIgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIiAiCisgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZl90eXBlc18gPDwgIi8qIHJldHVybiB0aGUgbmFtZSBvZiB0aGUgY29uc3RhbnQgKi8iIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8ICJjb25zdCBjaGFyICoiIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8ICJ0b1N0cmluZ18iIDw8IG5hbWUgPDwgIihpbnQgdmFsdWUpOyAiIDw8IGVuZGwgPDwgZW5kbDsKKyAgOworICBmX3R5cGVzX2ltcGxfIDw8ICIvKiByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGNvbnN0YW50ICovIiA8PCBlbmRsOworICBmX3R5cGVzX2ltcGxfIDw8ICJjb25zdCBjaGFyICoiIDw8IGVuZGw7CisgIGZfdHlwZXNfaW1wbF8gPDwgInRvU3RyaW5nXyIgPDwgbmFtZSA8PCAiKGludCB2YWx1ZSkgIiA8PCBlbmRsOworICBmX3R5cGVzX2ltcGxfIDw8ICJ7IiA8PCBlbmRsOworICBmX3R5cGVzX2ltcGxfIDw8ICIgIHN0YXRpYyBfX3RocmVhZCBjaGFyIGJ1ZlsxNl0gPSB7MH07IiA8PCBlbmRsOworICBmX3R5cGVzX2ltcGxfIDw8ICIgIHN3aXRjaCh2YWx1ZSkgeyIgPDwgZW5kbDsKKyAgc3RkOjpzZXQ8aW50PiBkb25lOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgLy8gU2tpcHBpbmcgZHVwbGljYXRlIHZhbHVlCisgICAgaWYgKGRvbmUuZmluZCh2YWx1ZSkgPT0gZG9uZS5lbmQoKSkgeworICAgICAgZG9uZS5pbnNlcnQodmFsdWUpOworICAgICAgZl90eXBlc19pbXBsXyA8PCAiICBjYXNlICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IG5hbWVfdWMgPDwgIl8iIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICA8PCAiOiIKKyAgICAgICAgICAgICAgICAgICAgPDwgInJldHVybiBcIiIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IG5hbWVfdWMgPDwgIl8iIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICA8PCAiXCI7IiA8PCBlbmRsOworICAgIH0KKyAgfQorICBmX3R5cGVzX2ltcGxfIDw8ICIgIGRlZmF1bHQ6IGdfc25wcmludGYoYnVmLCAxNiwgXCIlZFwiLCB2YWx1ZSk7IHJldHVybiBidWY7IiA8PCBlbmRsOworICBmX3R5cGVzX2ltcGxfIDw8ICIgIH0iIDw8IGVuZGw7CisgIGZfdHlwZXNfaW1wbF8gPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgVGhyaWZ0IGNvbnN0YW50cyBpbiBDIGNvZGUuCisgKi8KK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHModmVjdG9yPHRfY29uc3QqPiBjb25zdHMpIHsKKyAgZl90eXBlc18gPDwgIi8qIGNvbnN0YW50cyAqLyIgPDwgZW5kbDsKKyAgZl90eXBlc19pbXBsXyA8PCAiLyogY29uc3RhbnRzICovIiA8PCBlbmRsOworCisgIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBzdHJpbmcgbmFtZSA9ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBzdHJpbmcgbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UobmFtZSk7CisgICAgc3RyaW5nIG5hbWVfbGMgPSB0b19sb3dlcl9jYXNlKG5hbWUpOworICAgIHRfdHlwZSogdHlwZSA9ICgqY19pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisKKyAgICBpZiAoaXNfY29tcGxleF90eXBlKHR5cGUpKSB7CisgICAgICBmX3R5cGVzXyA8PCB0eXBlX25hbWUodHlwZSkgPDwgaW5kZW50KCkgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfbGMKKyAgICAgICAgICAgICAgIDw8ICJfY29uc3RhbnQoKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgbmFtZV91YyA8PCAiICIKKyAgICAgICAgICAgICA8PCBjb25zdGFudF92YWx1ZShuYW1lX2xjLCB0eXBlLCB2YWx1ZSkgPDwgZW5kbDsKKworICAgIGdlbmVyYXRlX2NvbnN0X2luaXRpYWxpemVyKG5hbWVfbGMsIHR5cGUsIHZhbHVlLCB0cnVlKTsKKyAgfQorCisgIGZfdHlwZXNfIDw8IGVuZGw7CisgIGZfdHlwZXNfaW1wbF8gPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZSBUaHJpZnQgc3RydWN0cyBpbiBDIGNvZGUsIGFzIEdPYmplY3RzLiAgRXhhbXBsZToKKyAqCisgKiBUaHJpZnQ6CisgKiBzdHJ1Y3QgQm9uaworICogeworICogICAxOiBzdHJpbmcgbWVzc2FnZSwKKyAqICAgMjogaTMyIHR5cGUKKyAqIH0KKyAqCisgKiBDIEdPYmplY3QgaW5zdGFuY2UgaGVhZGVyOgorICogc3RydWN0IF9UaHJpZnRCb25rCisgKiB7CisgKiAgIEdPYmplY3QgcGFyZW50OworICoKKyAqICAgZ2NoYXIgKiBtZXNzYWdlOworICogICBnaW50MzIgdHlwZTsKKyAqIH07CisgKiB0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0Qm9uayBUaHJpZnRCb25rCisgKiAvLyAuLi4gYWRkaXRpb25hbCBHT2JqZWN0IGJvaWxlcnBsYXRlIC4uLgorICovCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGZfdHlwZXNfIDw8ICIvKiBzdHJ1Y3QgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgKi8iIDw8IGVuZGw7CisgIGdlbmVyYXRlX29iamVjdCh0c3RydWN0KTsKK30KKworLyoqCisgKiBHZW5lcmF0ZSBDIGNvZGUgdG8gcmVwcmVzZW50IFRocmlmdCBzZXJ2aWNlcy4gIENyZWF0ZXMgYSBuZXcgR09iamVjdAorICogd2hpY2ggY2FuIGJlIHVzZWQgdG8gYWNjZXNzIHRoZSBzZXJ2aWNlLgorICovCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBzdmNuYW1lX3UgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXModHNlcnZpY2UtPmdldF9uYW1lKCkpOworICBzdHJpbmcgc3ZjbmFtZV91YyA9IHRoaXMtPm5zcGFjZV91YyArIHRvX3VwcGVyX2Nhc2Uoc3ZjbmFtZV91KTsKKyAgc3RyaW5nIGZpbGVuYW1lID0gdGhpcy0+bnNwYWNlX2xjICsgdG9fbG93ZXJfY2FzZShzdmNuYW1lX3UpOworCisgIC8vIG1ha2Ugb3V0cHV0IGZpbGVzCisgIHN0cmluZyBmX2hlYWRlcl9uYW1lID0gZ2V0X291dF9kaXIoKSArIGZpbGVuYW1lICsgIi5oIjsKKyAgZl9oZWFkZXJfLm9wZW4oZl9oZWFkZXJfbmFtZS5jX3N0cigpKTsKKworICBzdHJpbmcgcHJvZ3JhbV9uYW1lX3UgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMocHJvZ3JhbV9uYW1lXyk7CisgIHN0cmluZyBwcm9ncmFtX25hbWVfbGMgPSB0b19sb3dlcl9jYXNlKHByb2dyYW1fbmFtZV91KTsKKworICAvLyBhZGQgaGVhZGVyIGZpbGUgYm9pbGVycGxhdGUKKyAgZl9oZWFkZXJfIDw8IGF1dG9nZW5fY29tbWVudCgpOworCisgIC8vIGFkZCBhbiBpbmNsdXNpb24gZ3VhcmQKKyAgZl9oZWFkZXJfIDw8ICIjaWZuZGVmICIgPDwgc3ZjbmFtZV91YyA8PCAiX0giIDw8IGVuZGwgPDwgIiNkZWZpbmUgIiA8PCBzdmNuYW1lX3VjIDw8ICJfSCIgPDwgZW5kbAorICAgICAgICAgICAgPDwgZW5kbDsKKworICAvLyBhZGQgc3RhbmRhcmQgaW5jbHVkZXMKKyAgZl9oZWFkZXJfIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X2Rpc3BhdGNoX3Byb2Nlc3Nvci5oPiIgPDwgZW5kbCA8PCBlbmRsOworICBmX2hlYWRlcl8gPDwgIiNpbmNsdWRlIFwiIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgcHJvZ3JhbV9uYW1lX2xjIDw8ICJfdHlwZXMuaFwiIiA8PCBlbmRsOworCisgIC8vIGlmIHdlIGFyZSBpbmhlcml0aW5nIGZyb20gYW5vdGhlciBzZXJ2aWNlLCBpbmNsdWRlIGl0cyBoZWFkZXIKKyAgdF9zZXJ2aWNlKiBleHRlbmRzX3NlcnZpY2UgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKyAgaWYgKGV4dGVuZHNfc2VydmljZSAhPSBOVUxMKSB7CisgICAgZl9oZWFkZXJfIDw8ICIjaW5jbHVkZSBcIiIgPDwgdGhpcy0+bnNwYWNlX2xjCisgICAgICAgICAgICAgIDw8IHRvX2xvd2VyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKGV4dGVuZHNfc2VydmljZS0+Z2V0X25hbWUoKSkpIDw8ICIuaFwiIgorICAgICAgICAgICAgICA8PCBlbmRsOworICB9CisgIGZfaGVhZGVyXyA8PCBlbmRsOworCisgIC8vIGNyZWF0ZSB0aGUgc2VydmljZSBpbXBsZW1lbnRhdGlvbgorICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBnZXRfb3V0X2RpcigpICsgZmlsZW5hbWUgKyAiLmMiOworICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7CisKKyAgLy8gYWRkIHRoZSBib2lsZXJwbGFjZSBoZWFkZXIKKyAgZl9zZXJ2aWNlXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKTsKKworICAvLyBpbmNsdWRlIHRoZSBoZWFkZXJzCisgIGZfc2VydmljZV8gPDwgIiNpbmNsdWRlIDxzdHJpbmcuaD4iIDw8IGVuZGwgPDwgIiNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPiIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uLmg+IiA8PCBlbmRsIDw8ICIjaW5jbHVkZSBcIiIKKyAgICAgICAgICAgICA8PCBmaWxlbmFtZSA8PCAiLmhcIiIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIGdlbmVyYXRlIHRoZSBzZXJ2aWNlLWhlbHBlciBjbGFzc2VzCisgIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7CisKKyAgLy8gZ2VuZXJhdGUgdGhlIGNsaWVudCBvYmplY3RzCisgIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKKworICAvLyBnZW5lcmF0ZSB0aGUgc2VydmVyIG9iamVjdHMKKyAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOworCisgIC8vIGVuZCB0aGUgaGVhZGVyIGluY2x1c2lvbiBndWFyZAorICBmX2hlYWRlcl8gPDwgIiNlbmRpZiAvKiAiIDw8IHN2Y25hbWVfdWMgPDwgIl9IICovIiA8PCBlbmRsOworCisgIC8vIGNsb3NlIHRoZSBmaWxlcworICBmX3NlcnZpY2VfLmNsb3NlKCk7CisgIGZfaGVhZGVyXy5jbG9zZSgpOworfQorCisvKioKKyAqCisgKi8KK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIHN0cmluZyBuYW1lX3UgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMobmFtZSk7CisgIHN0cmluZyBuYW1lX2xjID0gdG9fbG93ZXJfY2FzZShuYW1lX3UpOworICBzdHJpbmcgbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UobmFtZV91KTsKKworICBnZW5lcmF0ZV9vYmplY3QodHN0cnVjdCk7CisKKyAgZl90eXBlc18gPDwgIi8qIGV4Y2VwdGlvbiAqLyIgPDwgZW5kbAorICAgICAgICAgICA8PCAidHlwZWRlZiBlbnVtIiA8PCBlbmRsCisgICAgICAgICAgIDw8ICJ7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IG5hbWVfdWMgPDwgIl9FUlJPUl9DT0RFIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX3R5cGVzXyA8PCAifSAiIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICJFcnJvcjsiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICA8PCAiR1F1YXJrICIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfbGMKKyAgICAgICAgICAgPDwgIl9lcnJvcl9xdWFyayAodm9pZCk7IiA8PCBlbmRsCisgICAgICAgICAgIDw8ICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IG5hbWVfdWMgPDwgIl9FUlJPUiAoIgorICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV9sYyA8PCAiX2Vycm9yX3F1YXJrKCkpIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgPDwgZW5kbDsKKworICBmX3R5cGVzX2ltcGxfIDw8ICIvKiBkZWZpbmUgdGhlIEdFcnJvciBkb21haW4gZm9yIGV4Y2VwdGlvbnMgKi8iIDw8IGVuZGwgPDwgIiNkZWZpbmUgIgorICAgICAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBuYW1lX3VjIDw8ICJfRVJST1JfRE9NQUlOIFwiIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV9sYworICAgICAgICAgICAgICAgIDw8ICJfZXJyb3JfcXVhcmtcIiIgPDwgZW5kbCA8PCAiR1F1YXJrIiA8PCBlbmRsIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX2xjCisgICAgICAgICAgICAgICAgPDwgIl9lcnJvcl9xdWFyayAodm9pZCkiIDw8IGVuZGwgPDwgInsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCAiICByZXR1cm4gZ19xdWFya19mcm9tX3N0YXRpY19zdHJpbmcgKCIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IG5hbWVfdWMKKyAgICAgICAgICAgICAgICA8PCAiX0VSUk9SX0RPTUFJTik7IiA8PCBlbmRsIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKgorICogSEVMUEVSIEZVTkNUSU9OUyAqCisgKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogUmV0dXJucyB0cnVlIGlmIHR0eXBlIGlzIG5vdCBhIHByaW1pdGl2ZS4KKyAqLworYm9vbCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmlzX2NvbXBsZXhfdHlwZSh0X3R5cGUqIHR0eXBlKSB7CisgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisKKyAgcmV0dXJuIHR0eXBlLT5pc19jb250YWluZXIoKSB8fCB0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCk7Cit9CisKK2Jvb2wgdF9jX2dsaWJfZ2VuZXJhdG9yOjppc19udW1lcmljKHRfdHlwZSogdHR5cGUpIHsKKyAgcmV0dXJuIHR0eXBlLT5pc19lbnVtKCkgfHwgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAhdHR5cGUtPmlzX3N0cmluZygpKTsKK30KKworLyoqCisgKiBNYXBzIGEgVGhyaWZ0IHRfdHlwZSB0byBhIEMgdHlwZS4KKyAqLworc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgaW5fdHlwZWRlZiwgYm9vbCBpc19jb25zdCkgeworICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgc3RyaW5nIGJuYW1lID0gYmFzZV90eXBlX25hbWUodHR5cGUpOworCisgICAgaWYgKGlzX2NvbnN0KSB7CisgICAgICByZXR1cm4gImNvbnN0ICIgKyBibmFtZTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGJuYW1lOworICAgIH0KKyAgfQorCisgIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBzdHJpbmcgY25hbWU7CisKKyAgICB0X2NvbnRhaW5lciogdGNvbnRhaW5lciA9ICh0X2NvbnRhaW5lciopdHR5cGU7CisgICAgaWYgKHRjb250YWluZXItPmhhc19jcHBfbmFtZSgpKSB7CisgICAgICBjbmFtZSA9IHRjb250YWluZXItPmdldF9jcHBfbmFtZSgpOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgICBjbmFtZSA9ICJHSGFzaFRhYmxlIjsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgICAgLy8gc2luY2UgYSBzZXQgcmVxdWlyZXMgdW5pcXVlIGVsZW1lbnRzLCB1c2UgYSBHSGFzaFRhYmxlLCBhbmQKKyAgICAgIC8vIHBvcHVsYXRlIHRoZSBrZXlzIGFuZCB2YWx1ZXMgd2l0aCB0aGUgc2FtZSBkYXRhLCB1c2luZyBrZXlzIGZvcgorICAgICAgLy8gdGhlIGFjdHVhbCB3cml0ZXMgYW5kIHJlYWRzLgorICAgICAgLy8gVE9ETzogZGlzY3VzcyB3aGV0aGVyIG9yIG5vdCB0byBpbXBsZW1lbnQgVFNldCwgVEhhc2hTZXQgb3IgR0hhc2hTZXQKKyAgICAgIGNuYW1lID0gIkdIYXNoVGFibGUiOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgdF90eXBlKiBldHlwZSA9IGdldF90cnVlX3R5cGUoKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKTsKKyAgICAgIGlmIChldHlwZS0+aXNfdm9pZCgpKSB7CisgICAgICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiY29tcGlsZXIgZXJyb3I6IGxpc3QgZWxlbWVudCB0eXBlIGNhbm5vdCBiZSB2b2lkIik7CisgICAgICB9CisgICAgICAvLyBUT0RPOiBpbnZlc3RpZ2F0ZSBvdGhlciBpbXBsZW1lbnRhdGlvbnMgYmVzaWRlcyBHUHRyQXJyYXkKKyAgICAgIGNuYW1lID0gaXNfbnVtZXJpYyhldHlwZSkgPyAiR0FycmF5IiA6ICJHUHRyQXJyYXkiOworICAgIH0KKworICAgIC8qIE9taXQgdGhlIGRlcmVmZXJlbmNlIG9wZXJhdG9yIGlmIHdlIGFyZSBhbGlhc2luZyB0aGlzIHR5cGUgd2l0aGluIGEKKyAgICAgICB0eXBlZGVmLCB0byBhbGxvdyB0aGUgdHlwZSB0byBiZSB1c2VkIG1vcmUgbmF0dXJhbGx5IGluIGNsaWVudCBjb2RlOworICAgICAgIG90aGVyd2lzZSwgaW5jbHVkZSBpdCAqLworICAgIGlmICghaW5fdHlwZWRlZikgeworICAgICAgY25hbWUgKz0gIiAqIjsKKyAgICB9CisKKyAgICBpZiAoaXNfY29uc3QpIHsKKyAgICAgIHJldHVybiAiY29uc3QgIiArIGNuYW1lOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gY25hbWU7CisgICAgfQorICB9CisKKyAgLy8gY2hlY2sgZm9yIGEgbmFtZXNwYWNlCisgIHRfcHJvZ3JhbSogdHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKKyAgc3RyaW5nIHBuYW1lID0gKHRwcm9ncmFtID8gdHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImNfZ2xpYiIpIDogIiIpICsgdHR5cGUtPmdldF9uYW1lKCk7CisKKyAgaWYgKGlzX2NvbXBsZXhfdHlwZSh0dHlwZSkpIHsKKyAgICBwbmFtZSArPSAiICoiOworICB9CisKKyAgaWYgKGlzX2NvbnN0KSB7CisgICAgcmV0dXJuICJjb25zdCAiICsgcG5hbWU7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHBuYW1lOworICB9Cit9CisKKy8qKgorICogTWFwcyBhIFRocmlmdCBwcmltaXRpdmUgdG8gdGhlIHR5cGUgbmVlZGVkIHRvIGhvbGQgaXRzIHZhbHVlIHdoZW4gdXNlZCBhcyBhbgorICogb2JqZWN0IHByb3BlcnR5LgorICoKKyAqIFRoaXMgbWV0aG9kIGlzIG5lZWRlZCBiZWNhdXNlIGFsbCBpbnRlZ2VyIHByb3BlcnRpZXMgb2Ygd2lkdGggbGVzcyB0aGFuIDY0CisgKiBiaXRzIG1hcCB0byB0aGUgc2FtZSB0eXBlLCBnaW50LCBhcyBvcHBvc2VkIHRvIHRoZWlyIHdpZHRoLXNwZWNpZmljIHR5cGUKKyAqIChnaW50OCwgZ2ludDE2IG9yIGdpbnQzMikuCisgKi8KK3N0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OnByb3BlcnR5X3R5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGluX3R5cGVkZWYsIGJvb2wgaXNfY29uc3QpIHsKKyAgc3RyaW5nIHJlc3VsdDsKKworICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgc3dpdGNoICgoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCkpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgaWYgKGlzX2NvbnN0KSB7CisgICAgICAgIHJlc3VsdCA9ICJjb25zdCBnaW50IjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCA9ICJnaW50IjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIHJlc3VsdCA9IHR5cGVfbmFtZSh0dHlwZSwgaW5fdHlwZWRlZiwgaXNfY29uc3QpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICByZXN1bHQgPSB0eXBlX25hbWUodHR5cGUsIGluX3R5cGVkZWYsIGlzX2NvbnN0KTsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogTWFwcyBhIFRocmlmdCBwcmltaXRpdmUgdG8gYSBDIHByaW1pdGl2ZS4KKyAqLworc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6YmFzZV90eXBlX25hbWUodF90eXBlKiB0eXBlKSB7CisgIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gdHlwZV9uYW1lKHR5cGUpOworICB9CisgIGlmICghdHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0aHJvdyBzdGQ6OmludmFsaWRfYXJndW1lbnQoIk9ubHkgYmFzZSB0eXBlcyBhcmUgc3VwcHBvcnRlZC4iKTsKKyAgfQorICB0X2Jhc2VfdHlwZSogYmFzZV90eXBlID0gcmVpbnRlcnByZXRfY2FzdDx0X2Jhc2VfdHlwZSo+KHR5cGUpOworICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gYmFzZV90eXBlLT5nZXRfYmFzZSgpOworICBzd2l0Y2ggKHRiYXNlKSB7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICByZXR1cm4gInZvaWQiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICBpZiAoYmFzZV90eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgcmV0dXJuICJHQnl0ZUFycmF5ICoiOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gImdjaGFyICoiOworICAgIH0KKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgIHJldHVybiAiZ2Jvb2xlYW4iOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIHJldHVybiAiZ2ludDgiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICByZXR1cm4gImdpbnQxNiI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIHJldHVybiAiZ2ludDMyIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgcmV0dXJuICJnaW50NjQiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICByZXR1cm4gImdkb3VibGUiOworICBkZWZhdWx0OgorICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoImNvbXBpbGVyIGVycm9yOiBubyBDIGJhc2UgdHlwZSBuYW1lIGZvciBiYXNlIHR5cGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpKTsKKyAgfQorfQorCisvKioKKyAqIFJldHVybnMgYSBtZW1iZXIgb2YgdGhlIFRocmlmdFR5cGUgQyBlbnVtZXJhdGlvbiBpbiB0aHJpZnRfcHJvdG9jb2wuaAorICogZm9yIGEgVGhyaWZ0IHR5cGUuCisgKi8KK3N0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworCisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiVF9TVFJJTkciOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiVF9CT09MIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJUX0JZVEUiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJUX0kxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIlRfSTMyIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiVF9JNjQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJUX0RPVUJMRSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiVF9JMzIiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpKSB7CisgICAgcmV0dXJuICJUX1NUUlVDVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiVF9TVFJVQ1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJUX01BUCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIlRfU0VUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIlRfTElTVCI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKKy8qKgorICogUmV0dXJucyBhIFRocmlmdCBjb25zdGFudCBmb3JtYXR0ZWQgYXMgYSBsaXRlcmFsIGZvciBpbmNsdXNpb24gaW4gQyBjb2RlLgorICovCitzdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjpjb25zdGFudF9saXRlcmFsKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgb3N0cmluZ3N0cmVhbSByZW5kZXI7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgLyogcHJpbWl0aXZlcyAqLworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJlbmRlciA8PCAiXCIiICsgdmFsdWUtPmdldF9zdHJpbmcoKSArICJcIiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZW5kZXIgPDwgKCh2YWx1ZS0+Z2V0X2ludGVnZXIoKSAhPSAwKSA/ICJUUlVFIiA6ICJGQUxTRSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgfQorICB9IGVsc2UgeworICAgIHRfY29uc3RfdmFsdWU6OnRfY29uc3RfdmFsdWVfdHlwZSB2YWx1ZV90eXBlID0gdmFsdWUtPmdldF90eXBlKCk7CisKKyAgICBzd2l0Y2ggKHZhbHVlX3R5cGUpIHsKKyAgICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0lERU5USUZJRVI6CisgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0xJU1Q6CisgICAgICByZW5kZXIgPDwgInsgIjsKKyAgICAgIHsKKyAgICAgICAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgbGlzdCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgICAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBsaXN0X2l0ZXI7CisKKyAgICAgICAgaWYgKGxpc3Quc2l6ZSgpID4gMCkgeworICAgICAgICAgIGxpc3RfaXRlciA9IGxpc3QuYmVnaW4oKTsKKyAgICAgICAgICByZW5kZXIgPDwgY29uc3RhbnRfbGl0ZXJhbChlbGVtX3R5cGUsICpsaXN0X2l0ZXIpOworCisgICAgICAgICAgd2hpbGUgKCsrbGlzdF9pdGVyICE9IGxpc3QuZW5kKCkpIHsKKyAgICAgICAgICAgIHJlbmRlciA8PCAiLCAiIDw8IGNvbnN0YW50X2xpdGVyYWwoZWxlbV90eXBlLCAqbGlzdF9pdGVyKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJlbmRlciA8PCAiIH0iOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9NQVA6CisgICAgZGVmYXVsdDoKKyAgICAgIHJlbmRlciA8PCAiTlVMTCAvKiBub3Qgc3VwcG9ydGVkICovIjsKKyAgICB9CisgIH0KKworICByZXR1cm4gcmVuZGVyLnN0cigpOworfQorCisvKioKKyAqIFJldHVybnMgQyBjb2RlIHRoYXQgcmVwcmVzZW50cyBhIFRocmlmdCBjb25zdGFudC4KKyAqLworc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6Y29uc3RhbnRfdmFsdWUoc3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgb3N0cmluZ3N0cmVhbSByZW5kZXI7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgLyogcHJpbWl0aXZlcyAqLworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZW5kZXIgPDwgImdfc3RyZHVwIChcIiIgKyB2YWx1ZS0+Z2V0X3N0cmluZygpICsgIlwiKSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZW5kZXIgPDwgKCh2YWx1ZS0+Z2V0X2ludGVnZXIoKSAhPSAwKSA/IDEgOiAwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJlbmRlciA8PCAiR19HSU5UNjRfQ09OU1RBTlQgKCIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIikiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmVuZGVyIDw8ICIoIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIikiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICB9IGVsc2UgaWYgKGlzX2NvbXBsZXhfdHlwZSh0eXBlKSkgeworICAgIHJlbmRlciA8PCAiKCIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHRvX2xvd2VyX2Nhc2UobmFtZSkgPDwgIl9jb25zdGFudCgpKSI7CisgIH0gZWxzZSB7CisgICAgcmVuZGVyIDw8ICJOVUxMIC8qIG5vdCBzdXBwb3J0ZWQgKi8iOworICB9CisKKyAgcmV0dXJuIHJlbmRlci5zdHIoKTsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3N0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgdF90eXBlKiB0dHlwZSA9IHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKKyAgdF9zdHJ1Y3QqIGFyZ2xpc3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgIHRfc3RydWN0KiB4bGlzdCA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBzdHJpbmcgZm5hbWUgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXModGZ1bmN0aW9uLT5nZXRfbmFtZSgpKTsKKworICBib29sIGhhc19yZXR1cm4gPSAhdHR5cGUtPmlzX3ZvaWQoKTsKKyAgYm9vbCBoYXNfYXJncyA9IGFyZ2xpc3QtPmdldF9tZW1iZXJzKCkuc2l6ZSgpID09IDA7CisgIGJvb2wgaGFzX3hjZXB0aW9ucyA9IHhsaXN0LT5nZXRfbWVtYmVycygpLnNpemUoKSA9PSAwOworICByZXR1cm4gImdib29sZWFuICIgKyB0aGlzLT5uc3BhY2VfbGMgKyBmbmFtZSArICIgKCIgKyB0aGlzLT5uc3BhY2UgKyBzZXJ2aWNlX25hbWVfICsgIklmICogaWZhY2UiCisgICAgICAgICArIChoYXNfcmV0dXJuID8gIiwgIiArIHR5cGVfbmFtZSh0dHlwZSkgKyAiKiBfcmV0dXJuIiA6ICIiKQorICAgICAgICAgKyAoaGFzX2FyZ3MgPyAiIiA6ICgiLCAiICsgYXJndW1lbnRfbGlzdChhcmdsaXN0KSkpCisgICAgICAgICArIChoYXNfeGNlcHRpb25zID8gIiIgOiAoIiwgIiArIHhjZXB0aW9uX2xpc3QoeGxpc3QpKSkgKyAiLCBHRXJyb3IgKiogZXJyb3IpIjsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZmllbGQgbGlzdAorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICogQHJldHVybiBDb21tYSBzZXBlYXJhdGVkIGxpc3Qgb2YgYWxsIGZpZWxkIG5hbWVzIGluIHRoYXQgc3RydWN0CisgKi8KK3N0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICB9CisgICAgcmVzdWx0ICs9IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCB0cnVlKSArICIgIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIFJlbmRlcnMgbXV0YWJsZSBleGNlcHRpb24gbGlzdHMKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqIEByZXR1cm4gQ29tbWEgc2VwZWFyYXRlZCBsaXN0IG9mIGFsbCBmaWVsZCBuYW1lcyBpbiB0aGF0IHN0cnVjdAorICovCitzdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjp4Y2VwdGlvbl9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICIsICI7CisgICAgfQorICAgIHJlc3VsdCArPSB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpICsgIiogIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIERlY2xhcmVzIGEgZmllbGQsIGluY2x1ZGluZyBhbnkgbmVjZXNzYXJ5IGluaXRpYWxpemF0aW9uLgorICovCitzdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjpkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY29uc3RhbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVmZXJlbmNlKSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKyAgaWYgKGNvbnN0YW50KSB7CisgICAgcmVzdWx0ICs9ICJjb25zdCAiOworICB9CisgIHJlc3VsdCArPSB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgaWYgKHBvaW50ZXIpIHsKKyAgICByZXN1bHQgKz0gIioiOworICB9CisgIGlmIChyZWZlcmVuY2UpIHsKKyAgICByZXN1bHQgKz0gIioiOworICB9CisgIHJlc3VsdCArPSAiICIgKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIGlmIChpbml0KSB7CisgICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgcmVzdWx0ICs9ICIgPSAoZ2RvdWJsZSkgMCI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIHJlc3VsdCArPSAiID0gTlVMTCI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDIGludGlhbGl6ZXIgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgcmVzdWx0ICs9ICIgPSAoIiArIHR5cGVfbmFtZSh0eXBlKSArICIpIDAiOworICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIHJlc3VsdCArPSAiID0gTlVMTCI7CisgICAgfQorICB9CisKKyAgaWYgKCFyZWZlcmVuY2UpIHsKKyAgICByZXN1bHQgKz0gIjsiOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6Y29uc3RhbnRfdmFsdWVfd2l0aF9zdG9yYWdlKHN0cmluZyBmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIGV0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgIG9zdHJpbmdzdHJlYW0gcmVuZGVyOworICBpZiAoaXNfbnVtZXJpYyhldHlwZSkpIHsKKyAgICByZW5kZXIgPDwgIiAgICAiIDw8IHR5cGVfbmFtZShldHlwZSkgPDwgIiAqIiA8PCBmbmFtZSA8PCAiID0gIgorICAgICAgICAgICA8PCAiZ19uZXcgKCIgPDwgYmFzZV90eXBlX25hbWUoZXR5cGUpIDw8ICIsIDEpOyIgPDwgZW5kbAorICAgICAgICAgICA8PCAiICAgICoiIDw8IGZuYW1lIDw8ICIgPSAiIDw8IGNvbnN0YW50X3ZhbHVlKGZuYW1lLCAodF90eXBlKilldHlwZSwgdmFsdWUpIDw8ICI7IgorICAgICAgICAgICA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHJlbmRlciA8PCAiICAgICIgPDwgdHlwZV9uYW1lKGV0eXBlKSA8PCAiICIgPDwgZm5hbWUgPDwgIiA9ICIKKyAgICAgICAgICAgPDwgY29uc3RhbnRfdmFsdWUoZm5hbWUsICh0X3R5cGUqKWV0eXBlLCB2YWx1ZSkgPDwgIjsiIDw8IGVuZGw7CisgIH0KKyAgcmV0dXJuIHJlbmRlci5zdHIoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgQyBjb2RlIHRoYXQgaW5pdGlhbGl6ZXMgY29tcGxleCBjb25zdGFudHMuCisgKi8KK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdF9pbml0aWFsaXplcihzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB0b3BfbGV2ZWwpIHsKKyAgc3RyaW5nIG5hbWVfdSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhuYW1lKTsKKyAgc3RyaW5nIG5hbWVfbGMgPSB0b19sb3dlcl9jYXNlKG5hbWVfdSk7CisgIHN0cmluZyB0eXBlX3UgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXModHlwZS0+Z2V0X25hbWUoKSk7CisgIHN0cmluZyB0eXBlX3VjID0gdG9fdXBwZXJfY2FzZSh0eXBlX3UpOworICBzdHJpbmcgbWF5YmVfc3RhdGljID0gdG9wX2xldmVsID8gIiIgOiAic3RhdGljICI7CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBvc3RyaW5nc3RyZWFtIGluaXRpYWxpemVyczsKKworICAgIC8vIGluaXRpYWxpemUgYW55IGNvbnN0YW50cyB0aGF0IG1heSBiZSByZWZlcmVuY2VkIGJ5IHRoaXMgaW5pdGlhbGl6ZXIKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKKyAgICAgIHN0cmluZyBmaWVsZF9uYW1lID0gIiI7CisKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7CisgICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgICBmaWVsZF9uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIKKyAgICAgICAgICArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIH0KKyAgICAgIGZpZWxkX25hbWUgPSB0bXAoZmllbGRfbmFtZSk7CisKKyAgICAgIGdlbmVyYXRlX2NvbnN0X2luaXRpYWxpemVyKG5hbWUgKyAiX2NvbnN0YW50XyIgKyBmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgIGluaXRpYWxpemVycyA8PCAiICAgIGNvbnN0YW50LT4iIDw8IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSA8PCAiID0gIgorICAgICAgICAgICAgICAgICAgIDw8IGNvbnN0YW50X3ZhbHVlKG5hbWUgKyAiX2NvbnN0YW50XyIgKyBmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9pdGVyLT5zZWNvbmQpIDw8ICI7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgPDwgIiAgICBjb25zdGFudC0+X19pc3NldF8iIDw8IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKQorICAgICAgICAgICAgICAgICAgIDw8ICIgPSBUUlVFOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBpbXBsZW1lbnQgdGhlIGluaXRpYWxpemVyCisgICAgZl90eXBlc19pbXBsXyA8PCBtYXliZV9zdGF0aWMgPDwgdGhpcy0+bnNwYWNlIDw8IHR5cGUtPmdldF9uYW1lKCkgPDwgIiAqIgorICAgICAgICAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfbGMgPDwgIl9jb25zdGFudCAodm9pZCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl90eXBlc19pbXBsXyk7CisgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAic3RhdGljICIgPDwgdGhpcy0+bnNwYWNlIDw8IHR5cGUtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgIDw8ICIgKmNvbnN0YW50ID0gTlVMTDsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoY29uc3RhbnQgPT0gTlVMTCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl90eXBlc19pbXBsXyk7CisgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiY29uc3RhbnQgPSBnX29iamVjdF9uZXcgKCIgPDwgdGhpcy0+bnNwYWNlX3VjCisgICAgICAgICAgICAgICAgICA8PCAiVFlQRV8iIDw8IHR5cGVfdWMgPDwgIiwgTlVMTCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICA8PCBpbml0aWFsaXplcnMuc3RyKCk7CisgICAgc2NvcGVfZG93bihmX3R5cGVzX2ltcGxfKTsKKworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgc3RyaW5nIGZpZWxkX25hbWUgPSAiIjsKKworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICAgIGZpZWxkX25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIgorICAgICAgICAgICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOworICAgICAgfQorICAgICAgZmllbGRfbmFtZSA9IHRtcChmaWVsZF9uYW1lKTsKKyAgICB9CisKKyAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gY29uc3RhbnQ7IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24oZl90eXBlc19pbXBsXyk7CisgICAgZl90eXBlc19pbXBsXyA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHN0cmluZyBsaXN0X3R5cGUgPSAiR1B0ckFycmF5ICoiOworICAgIHN0cmluZyBmcmVlX2Z1bmMKKyAgICAgICAgPSBnZW5lcmF0ZV9mcmVlX2Z1bmNfZnJvbV90eXBlKHJlaW50ZXJwcmV0X2Nhc3Q8dF9saXN0Kj4odHlwZSktPmdldF9lbGVtX3R5cGUoKSk7CisgICAgc3RyaW5nIGxpc3RfaW5pdGlhbGl6ZXIgPSAiZ19wdHJfYXJyYXlfbmV3X3dpdGhfZnJlZV9mdW5jICgiICsgZnJlZV9mdW5jICsgIik7IjsKKyAgICBzdHJpbmcgbGlzdF9hcHBlbmRlciA9ICJnX3B0cl9hcnJheV9hZGQiOworICAgIGJvb2wgbGlzdF92YXJpYWJsZSA9IGZhbHNlOworCisgICAgdF90eXBlKiBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBvc3RyaW5nc3RyZWFtIGluaXRpYWxpemVyczsKKyAgICBvc3RyaW5nc3RyZWFtIGFwcGVuZGVyczsKKworICAgIGxpc3RfaW5pdGlhbGl6ZXIgPSBnZW5lcmF0ZV9uZXdfYXJyYXlfZnJvbV90eXBlKGV0eXBlKTsKKyAgICBpZiAoZXR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopZXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBkZXRlcm1pbmUgYXJyYXkgdHlwZSI7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIGxpc3RfdHlwZSA9ICJHQXJyYXkgKiI7CisgICAgICAgIGxpc3RfYXBwZW5kZXIgPSAiZ19hcnJheV9hcHBlbmRfdmFsIjsKKyAgICAgICAgbGlzdF92YXJpYWJsZSA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBhcnJheSBpbmZvIGZvciB0eXBlIjsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGV0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIGxpc3RfdHlwZSA9ICJHQXJyYXkgKiI7CisgICAgICBsaXN0X2FwcGVuZGVyID0gImdfYXJyYXlfYXBwZW5kX3ZhbCI7CisgICAgICBsaXN0X3ZhcmlhYmxlID0gdHJ1ZTsKKyAgICB9CisKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgc3RyaW5nIGZuYW1lID0gdG1wKG5hbWUpOworCisgICAgICBnZW5lcmF0ZV9jb25zdF9pbml0aWFsaXplcihmbmFtZSwgZXR5cGUsICgqdl9pdGVyKSk7CisgICAgICBpZiAobGlzdF92YXJpYWJsZSkgeworICAgICAgICBpbml0aWFsaXplcnMgPDwgIiAgICAiIDw8IHR5cGVfbmFtZShldHlwZSkgPDwgIiAiIDw8IGZuYW1lIDw8ICIgPSAiCisgICAgICAgICAgICAgICAgICAgICA8PCBjb25zdGFudF92YWx1ZShmbmFtZSwgKHRfdHlwZSopZXR5cGUsICgqdl9pdGVyKSkgPDwgIjsiCisgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICBhcHBlbmRlcnMgPDwgIiAgICAiIDw8IGxpc3RfYXBwZW5kZXIgPDwgIihjb25zdGFudCwgIiA8PCBmbmFtZSA8PCAiKTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYXBwZW5kZXJzIDw8ICIgICAgIiA8PCBsaXN0X2FwcGVuZGVyIDw8ICIoY29uc3RhbnQsICIKKyAgICAgICAgICAgICAgICAgIDw8IGNvbnN0YW50X3ZhbHVlKGZuYW1lLCAodF90eXBlKilldHlwZSwgKCp2X2l0ZXIpKSA8PCAiKTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgfQorICAgIH0KKworICAgIGZfdHlwZXNfaW1wbF8gPDwgbWF5YmVfc3RhdGljIDw8IGxpc3RfdHlwZSA8PCBlbmRsCisgICAgICAgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV9sYyA8PCAiX2NvbnN0YW50ICh2b2lkKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3R5cGVzX2ltcGxfKTsKKyAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJzdGF0aWMgIiA8PCBsaXN0X3R5cGUgPDwgIiBjb25zdGFudCA9IE5VTEw7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmIChjb25zdGFudCA9PSBOVUxMKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3R5cGVzX2ltcGxfKTsKKyAgICBpZiAoIWluaXRpYWxpemVycy5zdHIoKS5lbXB0eSgpKSB7CisgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluaXRpYWxpemVycy5zdHIoKQorICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0KKyAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJjb25zdGFudCA9ICIgPDwgbGlzdF9pbml0aWFsaXplciA8PCBlbmRsCisgICAgICAgICAgICAgICAgICA8PCBhcHBlbmRlcnMuc3RyKCk7CisgICAgc2NvcGVfZG93bihmX3R5cGVzX2ltcGxfKTsKKyAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gY29uc3RhbnQ7IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24oZl90eXBlc19pbXBsXyk7CisgICAgZl90eXBlc19pbXBsXyA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF90eXBlKiBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIG9zdHJpbmdzdHJlYW0gaW5pdGlhbGl6ZXJzOworICAgIG9zdHJpbmdzdHJlYW0gYXBwZW5kZXJzOworCisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyBmbmFtZSA9IHRtcChuYW1lKTsKKyAgICAgIHN0cmluZyBwdHIgPSBpc19udW1lcmljKGV0eXBlKSA/ICIqIiA6ICIiOworICAgICAgZ2VuZXJhdGVfY29uc3RfaW5pdGlhbGl6ZXIoZm5hbWUsIGV0eXBlLCAoKnZfaXRlcikpOworICAgICAgaW5pdGlhbGl6ZXJzIDw8IGNvbnN0YW50X3ZhbHVlX3dpdGhfc3RvcmFnZShmbmFtZSwgKHRfdHlwZSopZXR5cGUsICp2X2l0ZXIpOworICAgICAgYXBwZW5kZXJzIDw8ICIgICAgZ19oYXNoX3RhYmxlX2luc2VydCAoY29uc3RhbnQsICIgPDwgZm5hbWUgPDwgIiwgMCk7IiA8PCBlbmRsOworICAgIH0KKworICAgIGZfdHlwZXNfaW1wbF8gPDwgbWF5YmVfc3RhdGljIDw8ICJHSGFzaFRhYmxlICoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX2xjIDw8ICJfY29uc3RhbnQgKHZvaWQpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfdHlwZXNfaW1wbF8pOworICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInN0YXRpYyBHSGFzaFRhYmxlICpjb25zdGFudCA9IE5VTEw7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKGNvbnN0YW50ID09IE5VTEwpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfdHlwZXNfaW1wbF8pOworICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5pdGlhbGl6ZXJzLnN0cigpIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJjb25zdGFudCA9ICIgPDwgZ2VuZXJhdGVfbmV3X2hhc2hfZnJvbV90eXBlKGV0eXBlLCBOVUxMKSA8PCBlbmRsCisgICAgICAgICAgICAgICAgICA8PCBhcHBlbmRlcnMuc3RyKCk7CisgICAgc2NvcGVfZG93bihmX3R5cGVzX2ltcGxfKTsKKyAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gY29uc3RhbnQ7IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24oZl90eXBlc19pbXBsXyk7CisgICAgZl90eXBlc19pbXBsXyA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgb3N0cmluZ3N0cmVhbSBpbml0aWFsaXplcnM7CisgICAgb3N0cmluZ3N0cmVhbSBhcHBlbmRlcnM7CisKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgc3RyaW5nIGZuYW1lID0gdG1wKG5hbWUpOworICAgICAgc3RyaW5nIGtuYW1lID0gZm5hbWUgKyAia2V5IjsKKyAgICAgIHN0cmluZyB2bmFtZSA9IGZuYW1lICsgInZhbCI7CisgICAgICBnZW5lcmF0ZV9jb25zdF9pbml0aWFsaXplcihrbmFtZSwga3R5cGUsIHZfaXRlci0+Zmlyc3QpOworICAgICAgZ2VuZXJhdGVfY29uc3RfaW5pdGlhbGl6ZXIodm5hbWUsIHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7CisKKyAgICAgIGluaXRpYWxpemVycyA8PCBjb25zdGFudF92YWx1ZV93aXRoX3N0b3JhZ2Uoa25hbWUsICh0X3R5cGUqKWt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKKyAgICAgIGluaXRpYWxpemVycyA8PCBjb25zdGFudF92YWx1ZV93aXRoX3N0b3JhZ2Uodm5hbWUsICh0X3R5cGUqKXZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICBhcHBlbmRlcnMgPDwgIiAgICBnX2hhc2hfdGFibGVfaW5zZXJ0IChjb25zdGFudCwgIiA8PCBrbmFtZSA8PCAiLCAiIDw8IHZuYW1lIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBmX3R5cGVzX2ltcGxfIDw8IG1heWJlX3N0YXRpYyA8PCAiR0hhc2hUYWJsZSAqIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV9sYyA8PCAiX2NvbnN0YW50ICh2b2lkKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3R5cGVzX2ltcGxfKTsKKyAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJzdGF0aWMgR0hhc2hUYWJsZSAqY29uc3RhbnQgPSBOVUxMOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmIChjb25zdGFudCA9PSBOVUxMKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3R5cGVzX2ltcGxfKTsKKyAgICBmX3R5cGVzX2ltcGxfIDw8IGluaXRpYWxpemVycy5zdHIoKSA8PCBlbmRsCisgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiY29uc3RhbnQgPSAiIDw8IGdlbmVyYXRlX25ld19oYXNoX2Zyb21fdHlwZShrdHlwZSwgdnR5cGUpIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgIDw8IGFwcGVuZGVycy5zdHIoKTsKKyAgICBzY29wZV9kb3duKGZfdHlwZXNfaW1wbF8pOworICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInJldHVybiBjb25zdGFudDsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihmX3R5cGVzX2ltcGxfKTsKKyAgICBmX3R5cGVzX2ltcGxfIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgaGVscGVyIGNsYXNzZXMgZm9yIGEgc2VydmljZSwgY29uc2lzdGluZyBvZiBhIFRocmlmdFN0cnVjdCBzdWJjbGFzcworICogZm9yIHRoZSBhcmd1bWVudHMgdG8gYW5kIHRoZSByZXN1bHQgZnJvbSBlYWNoIG1ldGhvZC4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZm9yIHdoaWNoIHRvIGdlbmVyYXRlIGhlbHBlciBjbGFzc2VzCisgKi8KK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZ1bmN0aW9uX2l0ZXI7CisKKyAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBzZXJ2aWNlJ3MgbWV0aG9kcworICBmb3IgKGZ1bmN0aW9uX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZnVuY3Rpb25faXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZnVuY3Rpb25faXRlcikgeworICAgIHN0cmluZyBmdW5jdGlvbl9uYW1lID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB0X3N0cnVjdCogYXJnX2xpc3QgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIHN0cmluZyBhcmdfbGlzdF9uYW1lX29yaWcgPSBhcmdfbGlzdC0+Z2V0X25hbWUoKTsKKworICAgIC8vIEdlbmVyYXRlIHRoZSBhcmd1bWVudHMgY2xhc3MKKyAgICBhcmdfbGlzdC0+c2V0X25hbWUodHNlcnZpY2UtPmdldF9uYW1lKCkgKyB1bmRlcnNjb3Jlc190b19pbml0aWFsX2NhcHMoZnVuY3Rpb25fbmFtZSkgKyAiQXJncyIpOworICAgIGdlbmVyYXRlX3N0cnVjdChhcmdfbGlzdCk7CisKKyAgICBhcmdfbGlzdC0+c2V0X25hbWUoYXJnX2xpc3RfbmFtZV9vcmlnKTsKKworICAgIC8vIEdlbmVyYXRlIHRoZSByZXN1bHQgY2xhc3MKKyAgICBpZiAoISgqZnVuY3Rpb25faXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sCisgICAgICAgICAgICAgICAgICAgICAgdHNlcnZpY2UtPmdldF9uYW1lKCkgKyB1bmRlcnNjb3Jlc190b19pbml0aWFsX2NhcHMoZnVuY3Rpb25fbmFtZSkgKyAiUmVzdWx0Iik7CisgICAgICB0X2ZpZWxkIHN1Y2Nlc3MoKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKKyAgICAgIHN1Y2Nlc3Muc2V0X3JlcSh0X2ZpZWxkOjpUX09QVElPTkFMKTsKKyAgICAgIGlmICghKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOworICAgICAgfQorCisgICAgICB0X3N0cnVjdCogeHMgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZpZWxkX2l0ZXI7CisgICAgICBmb3IgKGZpZWxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmllbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmllbGRfaXRlcikgeworICAgICAgICAoKmZpZWxkX2l0ZXIpLT5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUSU9OQUwpOworICAgICAgICByZXN1bHQuYXBwZW5kKCpmaWVsZF9pdGVyKTsKKyAgICAgIH0KKworICAgICAgZ2VuZXJhdGVfc3RydWN0KCZyZXN1bHQpOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBDIGNvZGUgdGhhdCByZXByZXNlbnRzIGEgVGhyaWZ0IHNlcnZpY2UgY2xpZW50LgorICovCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICAvKiBnZXQgc29tZSBDIGZyaWVuZGx5IHNlcnZpY2UgbmFtZXMgKi8KKyAgc3RyaW5nIHNlcnZpY2VfbmFtZV9sYyA9IHRvX2xvd2VyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHNlcnZpY2VfbmFtZV8pKTsKKyAgc3RyaW5nIHNlcnZpY2VfbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2Uoc2VydmljZV9uYW1lX2xjKTsKKworICBzdHJpbmcgcGFyZW50X3NlcnZpY2VfbmFtZTsKKyAgc3RyaW5nIHBhcmVudF9zZXJ2aWNlX25hbWVfbGM7CisgIHN0cmluZyBwYXJlbnRfc2VydmljZV9uYW1lX3VjOworCisgIHN0cmluZyBwYXJlbnRfY2xhc3NfbmFtZSA9ICJHT2JqZWN0IjsKKyAgc3RyaW5nIHBhcmVudF90eXBlX25hbWUgPSAiR19UWVBFX09CSkVDVCI7CisKKyAgLy8gVGhlIHNlcnZpY2UgdGhpcyBzZXJ2aWNlIGV4dGVuZHMsIG9yIE5VTEwgaWYgaXQgZXh0ZW5kcyBubworICAvLyBzZXJ2aWNlCisgIHRfc2VydmljZSogZXh0ZW5kc19zZXJ2aWNlID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgIGlmIChleHRlbmRzX3NlcnZpY2UpIHsKKyAgICAvLyBUaGUgbmFtZSBvZiB0aGUgcGFyZW50IHNlcnZpY2UKKyAgICBwYXJlbnRfc2VydmljZV9uYW1lID0gZXh0ZW5kc19zZXJ2aWNlLT5nZXRfbmFtZSgpOworICAgIHBhcmVudF9zZXJ2aWNlX25hbWVfbGMgPSB0b19sb3dlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhwYXJlbnRfc2VydmljZV9uYW1lKSk7CisgICAgcGFyZW50X3NlcnZpY2VfbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UocGFyZW50X3NlcnZpY2VfbmFtZV9sYyk7CisKKyAgICAvLyBUaGUgbmFtZXMgb2YgdGhlIGNsaWVudCBjbGFzcycgcGFyZW50IGNsYXNzIGFuZCB0eXBlCisgICAgcGFyZW50X2NsYXNzX25hbWUgPSB0aGlzLT5uc3BhY2UgKyBwYXJlbnRfc2VydmljZV9uYW1lICsgIkNsaWVudCI7CisgICAgcGFyZW50X3R5cGVfbmFtZSA9IHRoaXMtPm5zcGFjZV91YyArICJUWVBFXyIgKyBwYXJlbnRfc2VydmljZV9uYW1lX3VjICsgIl9DTElFTlQiOworICB9CisKKyAgLy8gVGhlIGJhc2Ugc2VydmljZSAodGhlIHRvcG1vc3QgaW4gdGhlICJleHRlbmRzIiBoaWVyYXJjaHkpLCBvbgorICAvLyB3aG9zZSBjbGllbnQgY2xhc3MgdGhlICJpbnB1dF9wcm90b2NvbCIgYW5kICJvdXRwdXRfcHJvdG9jb2wiCisgIC8vIHByb3BlcnRpZXMgYXJlIGRlZmluZWQKKyAgdF9zZXJ2aWNlKiBiYXNlX3NlcnZpY2UgPSB0c2VydmljZTsKKyAgd2hpbGUgKGJhc2Vfc2VydmljZS0+Z2V0X2V4dGVuZHMoKSkgeworICAgIGJhc2Vfc2VydmljZSA9IGJhc2Vfc2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKyAgfQorCisgIHN0cmluZyBiYXNlX3NlcnZpY2VfbmFtZSA9IGJhc2Vfc2VydmljZS0+Z2V0X25hbWUoKTsKKyAgc3RyaW5nIGJhc2Vfc2VydmljZV9uYW1lX2xjID0gdG9fbG93ZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoYmFzZV9zZXJ2aWNlX25hbWUpKTsKKyAgc3RyaW5nIGJhc2Vfc2VydmljZV9uYW1lX3VjID0gdG9fdXBwZXJfY2FzZShiYXNlX3NlcnZpY2VfbmFtZV9sYyk7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGNsaWVudCBpbnRlcmZhY2UgZHVtbXkgb2JqZWN0IGluIHRoZSBoZWFkZXIuCisgIGZfaGVhZGVyXyA8PCAiLyogIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICIgc2VydmljZSBpbnRlcmZhY2UgKi8iIDw8IGVuZGwgPDwgInR5cGVkZWYgc3RydWN0IF8iCisgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiSWYgIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiSWY7ICIKKyAgICAgICAgICAgIDw8ICIgLyogZHVtbXkgb2JqZWN0ICovIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGNsaWVudCBpbnRlcmZhY2Ugb2JqZWN0IGluIHRoZSBoZWFkZXIuCisgIGZfaGVhZGVyXyA8PCAic3RydWN0IF8iIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZkludGVyZmFjZSIgPDwgZW5kbCA8PCAieyIgPDwgZW5kbAorICAgICAgICAgICAgPDwgIiAgR1R5cGVJbnRlcmZhY2UgcGFyZW50OyIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8qIHdyaXRlIG91dCB0aGUgZnVuY3Rpb25zIGZvciB0aGlzIGludGVyZmFjZSAqLworICBpbmRlbnRfdXAoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgLyogbWFrZSB0aGUgZnVuY3Rpb24gbmFtZSBDIGZyaWVuZGx5ICovCisgICAgc3RyaW5nIGZ1bm5hbWUgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICB0X3R5cGUqIHR0eXBlID0gKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpOworICAgIHRfc3RydWN0KiBhcmdsaXN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIHRfc3RydWN0KiB4bGlzdCA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgIGJvb2wgaGFzX3JldHVybiA9ICF0dHlwZS0+aXNfdm9pZCgpOworICAgIGJvb2wgaGFzX2FyZ3MgPSBhcmdsaXN0LT5nZXRfbWVtYmVycygpLnNpemUoKSA9PSAwOworICAgIGJvb2wgaGFzX3hjZXB0aW9ucyA9IHhsaXN0LT5nZXRfbWVtYmVycygpLnNpemUoKSA9PSAwOworCisgICAgc3RyaW5nIHBhcmFtcyA9ICIoIiArIHRoaXMtPm5zcGFjZSArIHNlcnZpY2VfbmFtZV8gKyAiSWYgKmlmYWNlIgorICAgICAgICAgICAgICAgICAgICArIChoYXNfcmV0dXJuID8gIiwgIiArIHR5cGVfbmFtZSh0dHlwZSkgKyAiKiBfcmV0dXJuIiA6ICIiKQorICAgICAgICAgICAgICAgICAgICArIChoYXNfYXJncyA/ICIiIDogKCIsICIgKyBhcmd1bWVudF9saXN0KGFyZ2xpc3QpKSkKKyAgICAgICAgICAgICAgICAgICAgKyAoaGFzX3hjZXB0aW9ucyA/ICIiIDogKCIsICIgKyB4Y2VwdGlvbl9saXN0KHhsaXN0KSkpICsgIiwgR0Vycm9yICoqZXJyb3IpIjsKKworICAgIGluZGVudChmX2hlYWRlcl8pIDw8ICJnYm9vbGVhbiAoKiIgPDwgZnVubmFtZSA8PCAiKSAiIDw8IHBhcmFtcyA8PCAiOyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworCisgIGZfaGVhZGVyXyA8PCAifTsiIDw8IGVuZGwgPDwgInR5cGVkZWYgc3RydWN0IF8iIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZkludGVyZmFjZSAiCisgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiSWZJbnRlcmZhY2U7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gZ2VuZXJhdGUgYWxsIHRoZSBpbnRlcmZhY2UgYm9pbGVycGxhdGUKKyAgZl9oZWFkZXJfIDw8ICJHVHlwZSAiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9pZl9nZXRfdHlwZSAodm9pZCk7IiA8PCBlbmRsCisgICAgICAgICAgICA8PCAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0lGICIKKyAgICAgICAgICAgIDw8ICIoIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfaWZfZ2V0X3R5cGUoKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIgorICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0lGKG9iaikgIgorICAgICAgICAgICAgPDwgIihHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIKKyAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0lGLCAiIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZikpIiA8PCBlbmRsCisgICAgICAgICAgICA8PCAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiSVNfIiA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9JRihvYmopICIKKyAgICAgICAgICAgIDw8ICIoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iCisgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9JRikpIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjCisgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9JRl9HRVRfSU5URVJGQUNFKGluc3QpIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0lOVEVSRkFDRSAoKGluc3QpLCAiCisgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIiA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9JRiwgIiA8PCB0aGlzLT5uc3BhY2UKKyAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmSW50ZXJmYWNlKSkiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyB3cml0ZSBvdXQgYWxsIHRoZSBpbnRlcmZhY2UgZnVuY3Rpb24gcHJvdG90eXBlcworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIC8qIG1ha2UgdGhlIGZ1bmN0aW9uIG5hbWUgQyBmcmllbmRseSAqLworICAgIHN0cmluZyBmdW5uYW1lID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgdF90eXBlKiB0dHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKTsKKyAgICB0X3N0cnVjdCogYXJnbGlzdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICB0X3N0cnVjdCogeGxpc3QgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKKyAgICBib29sIGhhc19yZXR1cm4gPSAhdHR5cGUtPmlzX3ZvaWQoKTsKKyAgICBib29sIGhhc19hcmdzID0gYXJnbGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPT0gMDsKKyAgICBib29sIGhhc194Y2VwdGlvbnMgPSB4bGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPT0gMDsKKworICAgIHN0cmluZyBwYXJhbXMgPSAiKCIgKyB0aGlzLT5uc3BhY2UgKyBzZXJ2aWNlX25hbWVfICsgIklmICppZmFjZSIKKyAgICAgICAgICAgICAgICAgICAgKyAoaGFzX3JldHVybiA/ICIsICIgKyB0eXBlX25hbWUodHR5cGUpICsgIiogX3JldHVybiIgOiAiIikKKyAgICAgICAgICAgICAgICAgICAgKyAoaGFzX2FyZ3MgPyAiIiA6ICgiLCAiICsgYXJndW1lbnRfbGlzdChhcmdsaXN0KSkpCisgICAgICAgICAgICAgICAgICAgICsgKGhhc194Y2VwdGlvbnMgPyAiIiA6ICgiLCAiICsgeGNlcHRpb25fbGlzdCh4bGlzdCkpKSArICIsIEdFcnJvciAqKmVycm9yKSI7CisKKyAgICBmX2hlYWRlcl8gPDwgImdib29sZWFuICIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2lmXyIgPDwgZnVubmFtZSA8PCAiICIKKyAgICAgICAgICAgICAgPDwgcGFyYW1zIDw8ICI7IiA8PCBlbmRsOworICB9CisgIGZfaGVhZGVyXyA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBjbGllbnQgb2JqZWN0IGluc3RhbmNlIGRlZmluaXRpb24gaW4gdGhlIGhlYWRlci4KKyAgZl9oZWFkZXJfIDw8ICIvKiAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIiBzZXJ2aWNlIGNsaWVudCAqLyIgPDwgZW5kbCA8PCAic3RydWN0IF8iIDw8IHRoaXMtPm5zcGFjZQorICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50IiA8PCBlbmRsIDw8ICJ7IiA8PCBlbmRsIDw8ICIgICIgPDwgcGFyZW50X2NsYXNzX25hbWUKKyAgICAgICAgICAgIDw8ICIgcGFyZW50OyIgPDwgZW5kbDsKKyAgaWYgKCFleHRlbmRzX3NlcnZpY2UpIHsKKyAgICAvLyBEZWZpbmUgImlucHV0X3Byb3RvY29sIiBhbmQgIm91dHB1dF9wcm90b2NvbCIgcHJvcGVydGllcyBvbmx5CisgICAgLy8gZm9yIGJhc2Ugc2VydmljZXM7IGNoaWxkIHNlcnZpY2UtY2xpZW50IGNsYXNzZXMgd2lsbCBpbmhlcml0CisgICAgLy8gdGhlc2UKKyAgICBmX2hlYWRlcl8gPDwgZW5kbCA8PCAiICBUaHJpZnRQcm90b2NvbCAqaW5wdXRfcHJvdG9jb2w7IiA8PCBlbmRsCisgICAgICAgICAgICAgIDw8ICIgIFRocmlmdFByb3RvY29sICpvdXRwdXRfcHJvdG9jb2w7IiA8PCBlbmRsOworICB9CisgIGZfaGVhZGVyXyA8PCAifTsiIDw8IGVuZGwgPDwgInR5cGVkZWYgc3RydWN0IF8iIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnQgIgorICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgY2xhc3MgZGVmaW5pdGlvbiBpbiB0aGUgaGVhZGVyLgorICBmX2hlYWRlcl8gPDwgInN0cnVjdCBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50Q2xhc3MiIDw8IGVuZGwgPDwgInsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8ICIgICIgPDwgcGFyZW50X2NsYXNzX25hbWUgPDwgIkNsYXNzIHBhcmVudDsiIDw8IGVuZGwgPDwgIn07IiA8PCBlbmRsCisgICAgICAgICAgICA8PCAidHlwZWRlZiBzdHJ1Y3QgXyIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudENsYXNzICIgPDwgdGhpcy0+bnNwYWNlCisgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnRDbGFzczsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBDcmVhdGUgYWxsIHRoZSBHT2JqZWN0IGJvaWxlcnBsYXRlCisgIGZfaGVhZGVyXyA8PCAiR1R5cGUgIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfY2xpZW50X2dldF90eXBlICh2b2lkKTsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8ICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfQ0xJRU5UICIKKyAgICAgICAgICAgIDw8ICIoIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfY2xpZW50X2dldF90eXBlKCkpIiA8PCBlbmRsCisgICAgICAgICAgICA8PCAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9DTElFTlQob2JqKSAiCisgICAgICAgICAgICA8PCAiKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIgorICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfQ0xJRU5ULCAiIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnQpKSIgPDwgZW5kbAorICAgICAgICAgICAgPDwgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfQ0xJRU5UX0NMQVNTKGMpICIKKyAgICAgICAgICAgIDw8ICIoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIiA8PCBzZXJ2aWNlX25hbWVfdWMKKyAgICAgICAgICAgIDw8ICJfQ0xJRU5ULCAiIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnRDbGFzcykpIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIKKyAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9JU19DTElFTlQob2JqKSAiCisgICAgICAgICAgICA8PCAiKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIgorICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfQ0xJRU5UKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMKKyAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0lTX0NMSUVOVF9DTEFTUyhjKSAiCisgICAgICAgICAgICA8PCAiKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgc2VydmljZV9uYW1lX3VjCisgICAgICAgICAgICA8PCAiX0NMSUVOVCkpIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YworICAgICAgICAgICAgPDwgIl9DTElFTlRfR0VUX0NMQVNTKG9iaikgIgorICAgICAgICAgICAgPDwgIihHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIgorICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfQ0xJRU5ULCAiIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnRDbGFzcykpIgorICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsOworCisgIC8qIHdyaXRlIG91dCB0aGUgZnVuY3Rpb24gcHJvdG90eXBlcyAqLworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIC8qIG1ha2UgdGhlIGZ1bmN0aW9uIG5hbWUgQyBmcmllbmRseSAqLworICAgIHN0cmluZyBmdW5uYW1lID0gdG9fbG93ZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSk7CisKKyAgICB0X2Z1bmN0aW9uIHNlcnZpY2VfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWVfbGMgKyBzdHJpbmcoIl9jbGllbnRfIikgKyBmdW5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF9hcmdsaXN0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpKTsKKyAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnNlcnZpY2VfZnVuY3Rpb24pIDw8ICI7IiA8PCBlbmRsOworCisgICAgdF9mdW5jdGlvbiBzZW5kX2Z1bmN0aW9uKGdfdHlwZV92b2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWVfbGMgKyBzdHJpbmcoIl9jbGllbnRfc2VuZF8iKSArIGZ1bm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSk7CisgICAgaW5kZW50KGZfaGVhZGVyXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZzZW5kX2Z1bmN0aW9uKSA8PCAiOyIgPDwgZW5kbDsKKworICAgIC8vIGltcGxlbWVudCByZWN2IGlmIG5vdCBhIG9uZXdheSBzZXJ2aWNlCisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOworICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWVfbGMgKyBzdHJpbmcoIl9jbGllbnRfcmVjdl8iKSArIGZ1bm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKSk7CisgICAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24pIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIC8qIHdyaXRlIG91dCB0aGUgZ2V0L3NldCBmdW5jdGlvbiBwcm90b3R5cGVzICovCisgIGZfaGVhZGVyXyA8PCAidm9pZCAiICsgc2VydmljZV9uYW1lX2xjICsgIl9jbGllbnRfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydHlfaWQsIGNvbnN0IEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKTsiCisgICAgICAgICAgICA8PCBlbmRsOworICBmX2hlYWRlcl8gPDwgInZvaWQgIiArIHNlcnZpY2VfbmFtZV9sYyArICJfY2xpZW50X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByb3BlcnR5X2lkLCBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYyk7IgorICAgICAgICAgICAgPDwgZW5kbDsKKworICBmX2hlYWRlcl8gPDwgZW5kbDsKKyAgLy8gZW5kIG9mIGhlYWRlciBjb2RlCisKKyAgLy8gR2VuZXJhdGUgaW50ZXJmYWNlIG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAvKiBtYWtlIHRoZSBmdW5jdGlvbiBuYW1lIEMgZnJpZW5kbHkgKi8KKyAgICBzdHJpbmcgZnVubmFtZSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcygoKmZfaXRlciktPmdldF9uYW1lKCkpOworICAgIHRfdHlwZSogdHR5cGUgPSAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCk7CisgICAgdF9zdHJ1Y3QqIGFyZ2xpc3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgdF9zdHJ1Y3QqIHhsaXN0ID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgYm9vbCBoYXNfcmV0dXJuID0gIXR0eXBlLT5pc192b2lkKCk7CisgICAgYm9vbCBoYXNfYXJncyA9IGFyZ2xpc3QtPmdldF9tZW1iZXJzKCkuc2l6ZSgpID09IDA7CisgICAgYm9vbCBoYXNfeGNlcHRpb25zID0geGxpc3QtPmdldF9tZW1iZXJzKCkuc2l6ZSgpID09IDA7CisKKyAgICBzdHJpbmcgcGFyYW1zID0gIigiICsgdGhpcy0+bnNwYWNlICsgc2VydmljZV9uYW1lXyArICJJZiAqaWZhY2UiCisgICAgICAgICAgICAgICAgICAgICsgKGhhc19yZXR1cm4gPyAiLCAiICsgdHlwZV9uYW1lKHR0eXBlKSArICIqIF9yZXR1cm4iIDogIiIpCisgICAgICAgICAgICAgICAgICAgICsgKGhhc19hcmdzID8gIiIgOiAoIiwgIiArIGFyZ3VtZW50X2xpc3QoYXJnbGlzdCkpKQorICAgICAgICAgICAgICAgICAgICArIChoYXNfeGNlcHRpb25zID8gIiIgOiAoIiwgIiArIHhjZXB0aW9uX2xpc3QoeGxpc3QpKSkgKyAiLCBHRXJyb3IgKiplcnJvcikiOworCisgICAgc3RyaW5nIHBhcmFtc193aXRob3V0X3R5cGUgPSBzdHJpbmcoImlmYWNlLCAiKSArIChoYXNfcmV0dXJuID8gIl9yZXR1cm4sICIgOiAiIik7CisKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdsaXN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcl9maWVsZDsKKyAgICBmb3IgKGZfaXRlcl9maWVsZCA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXJfZmllbGQgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcl9maWVsZCkgeworICAgICAgcGFyYW1zX3dpdGhvdXRfdHlwZSArPSAoKmZfaXRlcl9maWVsZCktPmdldF9uYW1lKCk7CisgICAgICBwYXJhbXNfd2l0aG91dF90eXBlICs9ICIsICI7CisgICAgfQorCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geGxpc3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICBwYXJhbXNfd2l0aG91dF90eXBlICs9ICgqeF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIHBhcmFtc193aXRob3V0X3R5cGUgKz0gIiwgIjsKKyAgICB9CisKKyAgICBmX3NlcnZpY2VfIDw8ICJnYm9vbGVhbiIgPDwgZW5kbCA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfaWZfIiA8PCBmdW5uYW1lCisgICAgICAgICAgICAgICA8PCAiICIgPDwgcGFyYW1zIDw8IGVuZGwgPDwgInsiIDw8IGVuZGwgPDwgIiAgcmV0dXJuICIgPDwgdGhpcy0+bnNwYWNlX3VjCisgICAgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9JRl9HRVRfSU5URVJGQUNFIChpZmFjZSktPiIgPDwgZnVubmFtZSA8PCAiICgiCisgICAgICAgICAgICAgICA8PCBwYXJhbXNfd2l0aG91dF90eXBlIDw8ICJlcnJvcik7IiA8PCBlbmRsIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICAvLyBHZW5lcmF0ZSBpbnRlcmZhY2UgYm9pbGVycGxhdGUKKyAgZl9zZXJ2aWNlXyA8PCAiR1R5cGUiIDw8IGVuZGwgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2lmX2dldF90eXBlICh2b2lkKSIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8ICJ7IiA8PCBlbmRsIDw8ICIgIHN0YXRpYyBHVHlwZSB0eXBlID0gMDsiIDw8IGVuZGwgPDwgIiAgaWYgKHR5cGUgPT0gMCkiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCAiICB7IiA8PCBlbmRsIDw8ICIgICAgc3RhdGljIGNvbnN0IEdUeXBlSW5mbyB0eXBlX2luZm8gPSIgPDwgZW5kbCA8PCAiICAgIHsiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCAiICAgICAgc2l6ZW9mICgiIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZkludGVyZmFjZSksIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgIiAgICAgIE5VTEwsICAvKiBiYXNlX2luaXQgKi8iIDw8IGVuZGwgPDwgIiAgICAgIE5VTEwsICAvKiBiYXNlX2ZpbmFsaXplICovIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgIiAgICAgIE5VTEwsICAvKiBjbGFzc19pbml0ICovIiA8PCBlbmRsIDw8ICIgICAgICBOVUxMLCAgLyogY2xhc3NfZmluYWxpemUgKi8iCisgICAgICAgICAgICAgPDwgZW5kbCA8PCAiICAgICAgTlVMTCwgIC8qIGNsYXNzX2RhdGEgKi8iIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiICAgICAgMCwgICAgIC8qIGluc3RhbmNlX3NpemUgKi8iIDw8IGVuZGwgPDwgIiAgICAgIDAsICAgICAvKiBuX3ByZWFsbG9jcyAqLyIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8ICIgICAgICBOVUxMLCAgLyogaW5zdGFuY2VfaW5pdCAqLyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICIgICAgICBOVUxMICAgLyogdmFsdWVfdGFibGUgKi8iIDw8IGVuZGwgPDwgIiAgICB9OyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICIgICAgdHlwZSA9IGdfdHlwZV9yZWdpc3Rlcl9zdGF0aWMgKEdfVFlQRV9JTlRFUkZBQ0UsIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIiIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZlwiLCIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0eXBlX2luZm8sIDApOyIgPDwgZW5kbCA8PCAiICB9IgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgIiAgcmV0dXJuIHR5cGU7IiA8PCBlbmRsIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgY2xpZW50IGJvaWxlcnBsYXRlCisgIGZfc2VydmljZV8gPDwgInN0YXRpYyB2b2lkICIgPDwgZW5kbCA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjCisgICAgICAgICAgICAgPDwgIl9pZl9pbnRlcmZhY2VfaW5pdCAoIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiSWZJbnRlcmZhY2UgKmlmYWNlKTsiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsIDw8ICJHX0RFRklORV9UWVBFX1dJVEhfQ09ERSAoIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXworICAgICAgICAgICAgIDw8ICJDbGllbnQsICIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2NsaWVudCwiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICIgPDwgcGFyZW50X3R5cGVfbmFtZSA8PCAiLCAiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgIEdfSU1QTEVNRU5UX0lOVEVSRkFDRSAoIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIgorICAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0lGLCIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIDw8IHRoaXMtPm5zcGFjZV9sYworICAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2lmX2ludGVyZmFjZV9pbml0KSkiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSBwcm9wZXJ0eS1yZWxhdGVkIGNvZGUgb25seSBmb3IgYmFzZSBzZXJ2aWNlcy0tLWNoaWxkCisgIC8vIHNlcnZpY2UtY2xpZW50IGNsYXNzZXMgaGF2ZSBvbmx5IHByb3BlcnRpZXMgaW5oZXJpdGVkIGZyb20gdGhlaXIKKyAgLy8gcGFyZW50IGNsYXNzCisgIGlmICghZXh0ZW5kc19zZXJ2aWNlKSB7CisgICAgLy8gR2VuZXJhdGUgY2xpZW50IHByb3BlcnRpZXMKKyAgICBmX3NlcnZpY2VfIDw8ICJlbnVtIF8iIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnRQcm9wZXJ0aWVzIiA8PCBlbmRsIDw8ICJ7IgorICAgICAgICAgICAgICAgPDwgZW5kbCA8PCAiICBQUk9QXzAsIiA8PCBlbmRsIDw8ICIgIFBST1BfIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjCisgICAgICAgICAgICAgICA8PCAiX0NMSUVOVF9JTlBVVF9QUk9UT0NPTCwiIDw8IGVuZGwgPDwgIiAgUFJPUF8iIDw8IHRoaXMtPm5zcGFjZV91YworICAgICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfQ0xJRU5UX09VVFBVVF9QUk9UT0NPTCIgPDwgZW5kbCA8PCAifTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIC8vIGdlbmVyYXRlIHByb3BlcnR5IHNldHRlcgorICAgIGZfc2VydmljZV8gPDwgInZvaWQiIDw8IGVuZGwgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2NsaWVudF9zZXRfcHJvcGVydHkgKCIKKyAgICAgICAgICAgICAgIDw8ICJHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLCBjb25zdCBHVmFsdWUgKnZhbHVlLCAiCisgICAgICAgICAgICAgICA8PCAiR1BhcmFtU3BlYyAqcHNwZWMpIiA8PCBlbmRsIDw8ICJ7IiA8PCBlbmRsIDw8ICIgICIgPDwgdGhpcy0+bnNwYWNlCisgICAgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnQgKmNsaWVudCA9ICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YworICAgICAgICAgICAgICAgPDwgIl9DTElFTlQgKG9iamVjdCk7IiA8PCBlbmRsIDw8IGVuZGwgPDwgIiAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgIiAgc3dpdGNoIChwcm9wZXJ0eV9pZCkiIDw8IGVuZGwgPDwgIiAgeyIgPDwgZW5kbCA8PCAiICAgIGNhc2UgUFJPUF8iCisgICAgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfQ0xJRU5UX0lOUFVUX1BST1RPQ09MOiIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgICAgIGNsaWVudC0+aW5wdXRfcHJvdG9jb2wgPSBnX3ZhbHVlX2dldF9vYmplY3QgKHZhbHVlKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICIgICAgICBicmVhazsiIDw8IGVuZGwgPDwgIiAgICBjYXNlIFBST1BfIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjCisgICAgICAgICAgICAgICA8PCAiX0NMSUVOVF9PVVRQVVRfUFJPVE9DT0w6IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiICAgICAgY2xpZW50LT5vdXRwdXRfcHJvdG9jb2wgPSBnX3ZhbHVlX2dldF9vYmplY3QgKHZhbHVlKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICIgICAgICBicmVhazsiIDw8IGVuZGwgPDwgIiAgfSIgPDwgZW5kbCA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gZ2VuZXJhdGUgcHJvcGVydHkgZ2V0dGVyCisgICAgZl9zZXJ2aWNlXyA8PCAidm9pZCIgPDwgZW5kbCA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfY2xpZW50X2dldF9wcm9wZXJ0eSAoIgorICAgICAgICAgICAgICAgPDwgIkdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsIEdWYWx1ZSAqdmFsdWUsICIKKyAgICAgICAgICAgICAgIDw8ICJHUGFyYW1TcGVjICpwc3BlYykiIDw8IGVuZGwgPDwgInsiIDw8IGVuZGwgPDwgIiAgIiA8PCB0aGlzLT5uc3BhY2UKKyAgICAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudCAqY2xpZW50ID0gIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjCisgICAgICAgICAgICAgICA8PCAiX0NMSUVOVCAob2JqZWN0KTsiIDw8IGVuZGwgPDwgZW5kbCA8PCAiICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgZW5kbCA8PCAiICBzd2l0Y2ggKHByb3BlcnR5X2lkKSIgPDwgZW5kbCA8PCAiICB7IiA8PCBlbmRsIDw8ICIgICAgY2FzZSBQUk9QXyIKKyAgICAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9DTElFTlRfSU5QVVRfUFJPVE9DT0w6IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiICAgICAgZ192YWx1ZV9zZXRfb2JqZWN0ICh2YWx1ZSwgY2xpZW50LT5pbnB1dF9wcm90b2NvbCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiICAgICAgYnJlYWs7IiA8PCBlbmRsIDw8ICIgICAgY2FzZSBQUk9QXyIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YworICAgICAgICAgICAgICAgPDwgIl9DTElFTlRfT1VUUFVUX1BST1RPQ09MOiIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgICAgIGdfdmFsdWVfc2V0X29iamVjdCAodmFsdWUsIGNsaWVudC0+b3V0cHV0X3Byb3RvY29sKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICIgICAgICBicmVhazsiIDw8IGVuZGwgPDwgIiAgfSIgPDwgZW5kbCA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHJpbmcgbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBzdHJpbmcgZnVubmFtZSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhuYW1lKTsKKworICAgIC8vIEdldCB0aGUgc3RydWN0IG9mIGZ1bmN0aW9uIGNhbGwgcGFyYW1zIGFuZCBleGNlcHRpb25zCisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisKKyAgICAvLyBGdW5jdGlvbiBmb3Igc2VuZGluZworICAgIHRfZnVuY3Rpb24gc2VuZF9mdW5jdGlvbihnX3R5cGVfdm9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lX2xjICsgc3RyaW5nKCJfY2xpZW50X3NlbmRfIikgKyBmdW5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF9hcmdsaXN0KCkpOworCisgICAgLy8gT3BlbiB0aGUgc2VuZCBmdW5jdGlvbgorICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnNlbmRfZnVuY3Rpb24pIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgICBzdHJpbmcgcmVxVHlwZSA9ICgqZl9pdGVyKS0+aXNfb25ld2F5KCkgPyAiVF9PTkVXQVkiIDogIlRfQ0FMTCI7CisKKyAgICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnaW50MzIgY3NlcWlkID0gMDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJUaHJpZnRQcm90b2NvbCAqIHByb3RvY29sID0gIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgYmFzZV9zZXJ2aWNlX25hbWVfdWMKKyAgICAgICAgICAgICAgIDw8ICJfQ0xJRU5UIChpZmFjZSktPm91dHB1dF9wcm90b2NvbDsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgImlmICh0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsIFwiIiA8PCBuYW1lIDw8ICJcIiwgIgorICAgICAgICAgICAgICAgPDwgcmVxVHlwZSA8PCAiLCBjc2VxaWQsIGVycm9yKSA8IDApIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBGQUxTRTsiCisgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBnZW5lcmF0ZV9zdHJ1Y3Rfd3JpdGVyKGZfc2VydmljZV8sIGFyZ19zdHJ1Y3QsICIiLCAiIiwgZmFsc2UpOworCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHRocmlmdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2VuZCAocHJvdG9jb2wsIGVycm9yKSA8IDApIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gRkFMU0U7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAiaWYgKCF0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoIChwcm90b2NvbC0+dHJhbnNwb3J0LCBlcnJvcikpIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAiICByZXR1cm4gRkFMU0U7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAiaWYgKCF0aHJpZnRfdHJhbnNwb3J0X3dyaXRlX2VuZCAocHJvdG9jb2wtPnRyYW5zcG9ydCwgZXJyb3IpKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIEZBTFNFOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gVFJVRTsiCisgICAgICAgICAgICAgICA8PCBlbmRsOworCisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgICAvLyBHZW5lcmF0ZSByZWN2IGZ1bmN0aW9uIG9ubHkgaWYgbm90IGFuIGFzeW5jIGZ1bmN0aW9uCisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOworICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWVfbGMgKyBzdHJpbmcoIl9jbGllbnRfcmVjdl8iKSArIGZ1bm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKSk7CisgICAgICAvLyBPcGVuIGZ1bmN0aW9uCisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uKSA8PCBlbmRsOworICAgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdpbnQzMiByc2VxaWQ7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJnY2hhciAqIGZuYW1lID0gTlVMTDsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIlRocmlmdE1lc3NhZ2VUeXBlIG10eXBlOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiVGhyaWZ0UHJvdG9jb2wgKiBwcm90b2NvbCA9ICIKKyAgICAgICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IGJhc2Vfc2VydmljZV9uYW1lX3VjCisgICAgICAgICAgICAgICAgIDw8ICJfQ0xJRU5UIChpZmFjZSktPmlucHV0X3Byb3RvY29sOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb24gKnhjZXB0aW9uOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAodGhyaWZ0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAiCisgICAgICAgICAgICAgICAgICAgICIocHJvdG9jb2wsICZmbmFtZSwgJm10eXBlLCAmcnNlcWlkLCBlcnJvcikgPCAwKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAoZm5hbWUpIGdfZnJlZSAoZm5hbWUpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIEZBTFNFOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmIChtdHlwZSA9PSBUX0VYQ0VQVElPTikgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKGZuYW1lKSBnX2ZyZWUgKGZuYW1lKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInhjZXB0aW9uID0gZ19vYmplY3RfbmV3ICIKKyAgICAgICAgICAgICAgICAgICAgIihUSFJJRlRfVFlQRV9BUFBMSUNBVElPTl9FWENFUFRJT04sIE5VTEwpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidGhyaWZ0X3N0cnVjdF9yZWFkIChUSFJJRlRfU1RSVUNUICh4Y2VwdGlvbiksICIKKyAgICAgICAgICAgICAgICAgICAgInByb3RvY29sLCBOVUxMKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInRocmlmdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfZW5kICIKKyAgICAgICAgICAgICAgICAgICAgIihwcm90b2NvbCwgTlVMTCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kICIKKyAgICAgICAgICAgICAgICAgICAgIihwcm90b2NvbC0+dHJhbnNwb3J0LCBOVUxMKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImdfc2V0X2Vycm9yIChlcnJvciwgIgorICAgICAgICAgICAgICAgICAgICAiVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUix4Y2VwdGlvbi0+dHlwZSwgIgorICAgICAgICAgICAgICAgICAgICAiXCJhcHBsaWNhdGlvbiBlcnJvcjogJXNcIiwgeGNlcHRpb24tPm1lc3NhZ2UpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZ19vYmplY3RfdW5yZWYgKHhjZXB0aW9uKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInJldHVybiBGQUxTRTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIGlmIChtdHlwZSAhPSBUX1JFUExZKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAoZm5hbWUpIGdfZnJlZSAoZm5hbWUpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidGhyaWZ0X3Byb3RvY29sX3NraXAgKHByb3RvY29sLCBUX1NUUlVDVCwgIgorICAgICAgICAgICAgICAgICAgICAiTlVMTCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0aHJpZnRfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2VuZCAocHJvdG9jb2wsICIKKyAgICAgICAgICAgICAgICAgICAgIk5VTEwpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZCAoIgorICAgICAgICAgICAgICAgICAgICAicHJvdG9jb2wtPnRyYW5zcG9ydCwgTlVMTCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJnX3NldF9lcnJvciAoZXJyb3IsICIKKyAgICAgICAgICAgICAgICAgICAgIlRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1IsICIKKyAgICAgICAgICAgICAgICAgICAgIlRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfSU5WQUxJRF9NRVNTQUdFX1RZUEUsICIKKyAgICAgICAgICAgICAgICAgICAgIlwiaW52YWxpZCBtZXNzYWdlIHR5cGUgJWQsIGV4cGVjdGVkIFRfUkVQTFlcIiwgbXR5cGUpOyIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIEZBTFNFOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgaWYgKHN0cm5jbXAgKGZuYW1lLCBcIiIgPDwgbmFtZQorICAgICAgICAgICAgICAgICA8PCAiXCIsICIgPDwgbmFtZS5sZW5ndGgoKSA8PCAiKSAhPSAwKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0aHJpZnRfcHJvdG9jb2xfc2tpcCAocHJvdG9jb2wsIFRfU1RSVUNULCAiCisgICAgICAgICAgICAgICAgICAgICJOVUxMKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInRocmlmdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfZW5kIChwcm90b2NvbCwiCisgICAgICAgICAgICAgICAgICAgICJlcnJvcik7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kICgiCisgICAgICAgICAgICAgICAgICAgICJwcm90b2NvbC0+dHJhbnNwb3J0LCBlcnJvcik7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJnX3NldF9lcnJvciAoZXJyb3IsICIKKyAgICAgICAgICAgICAgICAgICAgIlRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1IsICIKKyAgICAgICAgICAgICAgICAgICAgIlRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfV1JPTkdfTUVUSE9EX05BTUUsICIKKyAgICAgICAgICAgICAgICAgICAgIlwid3JvbmcgbWV0aG9kIG5hbWUgJXMsIGV4cGVjdGVkICIgPDwgbmFtZQorICAgICAgICAgICAgICAgICAgICA8PCAiXCIsIGZuYW1lKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmIChmbmFtZSkgZ19mcmVlIChmbmFtZSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gRkFMU0U7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmIChmbmFtZSkgZ19mcmVlIChmbmFtZSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKworICAgICAgeworICAgICAgICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIl8iICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKKyAgICAgICAgdF9maWVsZCBzdWNjZXNzKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwgIipfcmV0dXJuIiwgMCk7CisgICAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGFkZCByZWFkZXJzIGZvciBleGNlcHRpb25zLCBkZXJlZmVyZW5jaW5nIHRoZSBwb2ludGVyLgorICAgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyB4X2l0ZXIrKykgeworICAgICAgICAgIHRfZmllbGQqIHhjZXB0aW9uID0gbmV3IHRfZmllbGQoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIioiICsgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCp4X2l0ZXIpLT5nZXRfa2V5KCkpOworICAgICAgICAgIHJlc3VsdC5hcHBlbmQoeGNlcHRpb24pOworICAgICAgICB9CisKKyAgICAgICAgZ2VuZXJhdGVfc3RydWN0X3JlYWRlcihmX3NlcnZpY2VfLCAmcmVzdWx0LCAiIiwgIiIsIGZhbHNlKTsKKyAgICAgIH0KKworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHRocmlmdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfZW5kIChwcm90b2NvbCwgZXJyb3IpIDwgMCkiCisgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIEZBTFNFOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICJpZiAoIXRocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQgKHByb3RvY29sLT50cmFuc3BvcnQsIGVycm9yKSkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIEZBTFNFOyIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgICAvLyBjb3B5IG92ZXIgYW55IHRocm93IGV4Y2VwdGlvbnMgYW5kIHJldHVybiBmYWlsdXJlCisgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyB4X2l0ZXIrKykgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAoKiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT0gTlVMTCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICAgIGdfc2V0X2Vycm9yIChlcnJvciwgIgorICAgICAgICAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV91YworICAgICAgICAgICAgICAgICAgIDw8IHRvX3VwcGVyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSkpCisgICAgICAgICAgICAgICAgICAgPDwgIl9FUlJPUiwgIiA8PCB0aGlzLT5uc3BhY2VfdWMKKyAgICAgICAgICAgICAgICAgICA8PCB0b191cHBlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcygoKnhfaXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCkpKQorICAgICAgICAgICAgICAgICAgIDw8ICJfRVJST1JfQ09ERSwgXCIiIDw8ICgqeF9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSA8PCAiXCIpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgICAgcmV0dXJuIEZBTFNFOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIC8vIENsb3NlIGZ1bmN0aW9uCisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiBUUlVFOyIgPDwgZW5kbDsKKyAgICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgIHRfZnVuY3Rpb24gc2VydmljZV9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZV9sYyArIHN0cmluZygiX2NsaWVudF8iKSArIGZ1bm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCkpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnNlcnZpY2VfZnVuY3Rpb24pIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgICAvLyB3cmFwIGVhY2ggZnVuY3Rpb24KKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAoISIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2NsaWVudF9zZW5kXyIKKyAgICAgICAgICAgICAgIDw8IGZ1bm5hbWUgPDwgIiAoaWZhY2UiOworCisgICAgLy8gRGVjbGFyZSB0aGUgZnVuY3Rpb24gYXJndW1lbnRzCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8ICIsIGVycm9yKSkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIEZBTFNFOyIgPDwgZW5kbDsKKworICAgIC8vIGlmIG5vdCBvbmV3YXksIGltcGxlbWVudCByZWN2CisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBzdHJpbmcgcmV0ID0gKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkgPyAiIiA6ICJfcmV0dXJuLCAiOworCisgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgIHJldCArPSAoKnhfaXRlciktPmdldF9uYW1lKCk7CisgICAgICAgIHJldCArPSAiLCAiOworICAgICAgfQorCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAoISIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2NsaWVudF9yZWN2XyIKKyAgICAgICAgICAgICAgICAgPDwgZnVubmFtZSA8PCAiIChpZmFjZSwgIiA8PCByZXQgPDwgImVycm9yKSkiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgIiAgcmV0dXJuIEZBTFNFOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyByZXR1cm4gVFJVRSB3aGljaCBtZWFucyBhbGwgZnVuY3Rpb25zIHdlcmUgY2FsbGVkIE9LCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gVFJVRTsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgIH0KKworICAvLyBjcmVhdGUgdGhlIGludGVyZmFjZSBpbml0aWFsaXplcgorICBmX3NlcnZpY2VfIDw8ICJzdGF0aWMgdm9pZCIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9pZl9pbnRlcmZhY2VfaW5pdCAoIgorICAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZkludGVyZmFjZSAqaWZhY2UpIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgaWYgKGZ1bmN0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIC8qIG1ha2UgdGhlIGZ1bmN0aW9uIG5hbWUgQyBmcmllbmRseSAqLworICAgICAgc3RyaW5nIGZ1bm5hbWUgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWZhY2UtPiIgPDwgZnVubmFtZSA8PCAiID0gIiA8PCB0aGlzLT5uc3BhY2VfbGMKKyAgICAgICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfY2xpZW50XyIgPDwgZnVubmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiVEhSSUZUX1VOVVNFRF9WQVIgKGlmYWNlKTsiIDw8IGVuZGw7CisgIH0KKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIC8vIGNyZWF0ZSB0aGUgY2xpZW50IGluc3RhbmNlIGluaXRpYWxpemVyCisgIGZfc2VydmljZV8gPDwgInN0YXRpYyB2b2lkIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2NsaWVudF9pbml0ICgiCisgICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudCAqY2xpZW50KSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGlmICghZXh0ZW5kc19zZXJ2aWNlKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiY2xpZW50LT5pbnB1dF9wcm90b2NvbCA9IE5VTEw7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiY2xpZW50LT5vdXRwdXRfcHJvdG9jb2wgPSBOVUxMOyIgPDwgZW5kbDsKKyAgfQorICBlbHNlIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJUSFJJRlRfVU5VU0VEX1ZBUiAoY2xpZW50KTsiIDw8IGVuZGw7CisgIH0KKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIC8vIGNyZWF0ZSB0aGUgY2xpZW50IGNsYXNzIGluaXRpYWxpemVyCisgIGZfc2VydmljZV8gPDwgInN0YXRpYyB2b2lkIiA8PCBlbmRsIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMKKyAgICAgICAgICAgICA8PCAiX2NsaWVudF9jbGFzc19pbml0ICgiIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnRDbGFzcyAqY2xzKSIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8ICJ7IiA8PCBlbmRsOworICBpZiAoIWV4dGVuZHNfc2VydmljZSkgeworICAgIGZfc2VydmljZV8gPDwgIiAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGNscyk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiICBHUGFyYW1TcGVjICpwYXJhbV9zcGVjOyIgPDwgZW5kbCA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSAiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMKKyAgICAgICAgICAgICAgIDw8ICJfY2xpZW50X3NldF9wcm9wZXJ0eTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICIgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9ICIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYworICAgICAgICAgICAgICAgPDwgIl9jbGllbnRfZ2V0X3Byb3BlcnR5OyIgPDwgZW5kbCA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX29iamVjdCAoXCJpbnB1dF9wcm90b2NvbFwiLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiaW5wdXQgcHJvdG9jb2wgKGNvbnN0cnVjdClcIiwiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlNldCB0aGUgY2xpZW50IGlucHV0IHByb3RvY29sXCIsIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RZUEVfUFJPVE9DT0wsIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BfIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjCisgICAgICAgICAgICAgICA8PCAiX0NMSUVOVF9JTlBVVF9QUk9UT0NPTCwgcGFyYW1fc3BlYyk7IiA8PCBlbmRsIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICIgIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfb2JqZWN0IChcIm91dHB1dF9wcm90b2NvbFwiLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3V0cHV0IHByb3RvY29sIChjb25zdHJ1Y3QpXCIsIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJTZXQgdGhlIGNsaWVudCBvdXRwdXQgcHJvdG9jb2xcIiwiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9QUk9UT0NPTCwiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF8iIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMKKyAgICAgICAgICAgICAgIDw8ICJfQ0xJRU5UX09VVFBVVF9QUk9UT0NPTCwgcGFyYW1fc3BlYyk7IiA8PCBlbmRsOworICB9CisgIGVsc2UgeworICAgIGZfc2VydmljZV8gPDwgIiAgVEhSSUZUX1VOVVNFRF9WQVIgKGNscyk7IiA8PCBlbmRsOworICB9CisgIGZfc2VydmljZV8gPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgQyBjb2RlIHRoYXQgcmVwcmVzZW50cyBhIFRocmlmdCBzZXJ2aWNlIGhhbmRsZXIuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGZvciB3aGljaCB0byBnZW5lcmF0ZSBhIGhhbmRsZXIuCisgKi8KK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hhbmRsZXIodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZ1bmN0aW9uX2l0ZXI7CisKKyAgc3RyaW5nIHNlcnZpY2VfbmFtZV9sYyA9IHRvX2xvd2VyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHNlcnZpY2VfbmFtZV8pKTsKKyAgc3RyaW5nIHNlcnZpY2VfbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2Uoc2VydmljZV9uYW1lX2xjKTsKKworICBzdHJpbmcgc2VydmljZV9oYW5kbGVyX25hbWUgPSBzZXJ2aWNlX25hbWVfICsgIkhhbmRsZXIiOworCisgIHN0cmluZyBjbGFzc19uYW1lID0gdGhpcy0+bnNwYWNlICsgc2VydmljZV9oYW5kbGVyX25hbWU7CisgIHN0cmluZyBjbGFzc19uYW1lX2xjID0gdGhpcy0+bnNwYWNlX2xjICsgaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHNlcnZpY2VfaGFuZGxlcl9uYW1lKTsKKyAgc3RyaW5nIGNsYXNzX25hbWVfdWMgPSB0b191cHBlcl9jYXNlKGNsYXNzX25hbWVfbGMpOworCisgIHN0cmluZyBwYXJlbnRfY2xhc3NfbmFtZTsKKyAgc3RyaW5nIHBhcmVudF90eXBlX25hbWU7CisKKyAgc3RyaW5nIGFyZ3NfaW5kZW50OworCisgIC8vIFRoZSBzZXJ2aWNlIHRoaXMgc2VydmljZSBleHRlbmRzLCBvciBOVUxMIGlmIGl0IGV4dGVuZHMgbm8gc2VydmljZQorICB0X3NlcnZpY2UqIGV4dGVuZHNfc2VydmljZSA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworCisgIC8vIERldGVybWluZSB0aGUgbmFtZSBvZiBvdXIgcGFyZW50IHNlcnZpY2UgKGlmIGFueSkgYW5kIHRoZSBoYW5kbGVyIGNsYXNzJworICAvLyBwYXJlbnQgY2xhc3MgbmFtZSBhbmQgdHlwZQorICBpZiAoZXh0ZW5kc19zZXJ2aWNlKSB7CisgICAgc3RyaW5nIHBhcmVudF9zZXJ2aWNlX25hbWUgPSBleHRlbmRzX3NlcnZpY2UtPmdldF9uYW1lKCk7CisgICAgc3RyaW5nIHBhcmVudF9zZXJ2aWNlX25hbWVfbGMgPSB0b19sb3dlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhwYXJlbnRfc2VydmljZV9uYW1lKSk7CisgICAgc3RyaW5nIHBhcmVudF9zZXJ2aWNlX25hbWVfdWMgPSB0b191cHBlcl9jYXNlKHBhcmVudF9zZXJ2aWNlX25hbWVfbGMpOworCisgICAgcGFyZW50X2NsYXNzX25hbWUgPSB0aGlzLT5uc3BhY2UgKyBwYXJlbnRfc2VydmljZV9uYW1lICsgIkhhbmRsZXIiOworICAgIHBhcmVudF90eXBlX25hbWUgPSB0aGlzLT5uc3BhY2VfdWMgKyAiVFlQRV8iICsgcGFyZW50X3NlcnZpY2VfbmFtZV91YyArICJfSEFORExFUiI7CisgIH0gZWxzZSB7CisgICAgcGFyZW50X2NsYXNzX25hbWUgPSAiR09iamVjdCI7CisgICAgcGFyZW50X3R5cGVfbmFtZSA9ICJHX1RZUEVfT0JKRUNUIjsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBoYW5kbGVyIGNsYXNzJyBkZWZpbml0aW9uIGluIHRoZSBoZWFkZXIgZmlsZQorCisgIC8vIEdlbmVyYXRlIHRoZSBoYW5kbGVyIGluc3RhbmNlIGRlZmluaXRpb24KKyAgZl9oZWFkZXJfIDw8ICIvKiAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIiBoYW5kbGVyIChhYnN0cmFjdCBiYXNlIGNsYXNzKSAqLyIgPDwgZW5kbCA8PCAic3RydWN0IF8iCisgICAgICAgICAgICA8PCBjbGFzc19uYW1lIDw8IGVuZGwgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgcGFyZW50X2NsYXNzX25hbWUgPDwgIiBwYXJlbnQ7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2hlYWRlcl8gPDwgIn07IiA8PCBlbmRsIDw8ICJ0eXBlZGVmIHN0cnVjdCBfIiA8PCBjbGFzc19uYW1lIDw8ICIgIiA8PCBjbGFzc19uYW1lIDw8ICI7IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBoYW5kbGVyIGNsYXNzIGRlZmluaXRpb24sIGluY2x1ZGluZyBpdHMgY2xhc3MgbWVtYmVycworICAvLyAobWV0aG9kcykKKyAgZl9oZWFkZXJfIDw8ICJzdHJ1Y3QgXyIgPDwgY2xhc3NfbmFtZSA8PCAiQ2xhc3MiIDw8IGVuZGwgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgcGFyZW50X2NsYXNzX25hbWUgPDwgIkNsYXNzIHBhcmVudDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBmb3IgKGZ1bmN0aW9uX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZnVuY3Rpb25faXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZnVuY3Rpb25faXRlcikgeworICAgIHN0cmluZyBtZXRob2RfbmFtZSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcygoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICB0X3R5cGUqIHJldHVybl90eXBlID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKTsKKyAgICB0X3N0cnVjdCogYXJnX2xpc3QgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIHRfc3RydWN0KiB4X2xpc3QgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgYm9vbCBoYXNfcmV0dXJuID0gIXJldHVybl90eXBlLT5pc192b2lkKCk7CisgICAgYm9vbCBoYXNfYXJncyA9IGFyZ19saXN0LT5nZXRfbWVtYmVycygpLnNpemUoKSA9PSAwOworICAgIGJvb2wgaGFzX3hjZXB0aW9ucyA9IHhfbGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPT0gMDsKKworICAgIHN0cmluZyBwYXJhbXMgPSAiKCIgKyB0aGlzLT5uc3BhY2UgKyBzZXJ2aWNlX25hbWVfICsgIklmICppZmFjZSIKKyAgICAgICAgICAgICAgICAgICAgKyAoaGFzX3JldHVybiA/ICIsICIgKyB0eXBlX25hbWUocmV0dXJuX3R5cGUpICsgIiogX3JldHVybiIgOiAiIikKKyAgICAgICAgICAgICAgICAgICAgKyAoaGFzX2FyZ3MgPyAiIiA6ICgiLCAiICsgYXJndW1lbnRfbGlzdChhcmdfbGlzdCkpKQorICAgICAgICAgICAgICAgICAgICArIChoYXNfeGNlcHRpb25zID8gIiIgOiAoIiwgIiArIHhjZXB0aW9uX2xpc3QoeF9saXN0KSkpICsgIiwgR0Vycm9yICoqZXJyb3IpIjsKKworICAgIGluZGVudChmX2hlYWRlcl8pIDw8ICJnYm9vbGVhbiAoKiIgPDwgbWV0aG9kX25hbWUgPDwgIikgIiA8PCBwYXJhbXMgPDwgIjsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKworICBmX2hlYWRlcl8gPDwgIn07IiA8PCBlbmRsIDw8ICJ0eXBlZGVmIHN0cnVjdCBfIiA8PCBjbGFzc19uYW1lIDw8ICJDbGFzcyAiIDw8IGNsYXNzX25hbWUKKyAgICAgICAgICAgIDw8ICJDbGFzczsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgcmVtYWluaW5nIGhlYWRlciBib2lsZXJwbGF0ZQorICBmX2hlYWRlcl8gPDwgIkdUeXBlICIgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX2dldF90eXBlICh2b2lkKTsiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIgorICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSEFORExFUiAiCisgICAgICAgICAgICA8PCAiKCIgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX2dldF90eXBlKCkpIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIgPDwgY2xhc3NfbmFtZV91YworICAgICAgICAgICAgPDwgIihvYmopICIKKyAgICAgICAgICAgIDw8ICIoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iCisgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9IQU5ETEVSLCAiIDw8IGNsYXNzX25hbWUgPDwgIikpIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIKKyAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiSVNfIiA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9IQU5ETEVSKG9iaikgIgorICAgICAgICAgICAgPDwgIihHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIKKyAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0hBTkRMRVIpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiIDw8IGNsYXNzX25hbWVfdWMKKyAgICAgICAgICAgIDw8ICJfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIKKyAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0hBTkRMRVIsICIgPDwgY2xhc3NfbmFtZSA8PCAiQ2xhc3MpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiCisgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIklTXyIgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSEFORExFUl9DTEFTUyhjKSAiCisgICAgICAgICAgICA8PCAiKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgc2VydmljZV9uYW1lX3VjCisgICAgICAgICAgICA8PCAiX0hBTkRMRVIpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMKKyAgICAgICAgICAgIDw8ICJfSEFORExFUl9HRVRfQ0xBU1Mob2JqKSAiCisgICAgICAgICAgICA8PCAiKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iCisgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9IQU5ETEVSLCAiIDw8IGNsYXNzX25hbWUgPDwgIkNsYXNzKSkiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgaGFuZGxlciBjbGFzcycgbWV0aG9kIGRlZmluaXRpb25zCisgIGZvciAoZnVuY3Rpb25faXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmdW5jdGlvbl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmdW5jdGlvbl9pdGVyKSB7CisgICAgc3RyaW5nIG1ldGhvZF9uYW1lID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqZnVuY3Rpb25faXRlciktPmdldF9uYW1lKCkpOworICAgIHRfdHlwZSogcmV0dXJuX3R5cGUgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpOworICAgIHRfc3RydWN0KiBhcmdfbGlzdCA9ICgqZnVuY3Rpb25faXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgdF9zdHJ1Y3QqIHhfbGlzdCA9ICgqZnVuY3Rpb25faXRlciktPmdldF94Y2VwdGlvbnMoKTsKKyAgICBib29sIGhhc19yZXR1cm4gPSAhcmV0dXJuX3R5cGUtPmlzX3ZvaWQoKTsKKyAgICBib29sIGhhc19hcmdzID0gYXJnX2xpc3QtPmdldF9tZW1iZXJzKCkuc2l6ZSgpID09IDA7CisgICAgYm9vbCBoYXNfeGNlcHRpb25zID0geF9saXN0LT5nZXRfbWVtYmVycygpLnNpemUoKSA9PSAwOworCisgICAgc3RyaW5nIHBhcmFtcyA9ICIoIiArIHRoaXMtPm5zcGFjZSArIHNlcnZpY2VfbmFtZV8gKyAiSWYgKmlmYWNlIgorICAgICAgICAgICAgICAgICAgICArIChoYXNfcmV0dXJuID8gIiwgIiArIHR5cGVfbmFtZShyZXR1cm5fdHlwZSkgKyAiKiBfcmV0dXJuIiA6ICIiKQorICAgICAgICAgICAgICAgICAgICArIChoYXNfYXJncyA/ICIiIDogKCIsICIgKyBhcmd1bWVudF9saXN0KGFyZ19saXN0KSkpCisgICAgICAgICAgICAgICAgICAgICsgKGhhc194Y2VwdGlvbnMgPyAiIiA6ICgiLCAiICsgeGNlcHRpb25fbGlzdCh4X2xpc3QpKSkgKyAiLCBHRXJyb3IgKiplcnJvcikiOworCisgICAgZl9oZWFkZXJfIDw8ICJnYm9vbGVhbiAiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl8iIDw8IG1ldGhvZF9uYW1lIDw8ICIgIiA8PCBwYXJhbXMgPDwgIjsiIDw8IGVuZGw7CisgIH0KKyAgZl9oZWFkZXJfIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGhhbmRsZXIncyBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgaW1wbGVtZW50YXRpb24gZmlsZQorCisgIC8vIEdlbmVyYXRlIHRoZSBpbXBsZW1lbnRhdGlvbiBib2lsZXJwbGF0ZQorICBmX3NlcnZpY2VfIDw8ICJzdGF0aWMgdm9pZCIgPDwgZW5kbCA8PCBjbGFzc19uYW1lX2xjIDw8ICJfIiA8PCBzZXJ2aWNlX25hbWVfbGMKKyAgICAgICAgICAgICA8PCAiX2lmX2ludGVyZmFjZV9pbml0ICgiIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZkludGVyZmFjZSAqaWZhY2UpOyIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGw7CisKKyAgYXJnc19pbmRlbnQgPSBzdHJpbmcoMjUsICcgJyk7CisgIGZfc2VydmljZV8gPDwgIkdfREVGSU5FX1RZUEVfV0lUSF9DT0RFICgiIDw8IGNsYXNzX25hbWUgPDwgIiwgIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgPDwgY2xhc3NfbmFtZV9sYyA8PCAiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCBwYXJlbnRfdHlwZV9uYW1lIDw8ICIsIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgIkdfSU1QTEVNRU5UX0lOVEVSRkFDRSAoIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIgorICAgICAgICAgICAgIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0lGLCIgPDwgZW5kbDsKKyAgYXJnc19pbmRlbnQgKz0gc3RyaW5nKDIzLCAnICcpOworICBmX3NlcnZpY2VfIDw8IGFyZ3NfaW5kZW50IDw8IGNsYXNzX25hbWVfbGMgPDwgIl8iIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2lmX2ludGVyZmFjZV9pbml0KSkiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBoYW5kbGVyIG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKKyAgZm9yIChmdW5jdGlvbl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZ1bmN0aW9uX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2Z1bmN0aW9uX2l0ZXIpIHsKKyAgICBzdHJpbmcgZnVuY3Rpb25fbmFtZSA9ICgqZnVuY3Rpb25faXRlciktPmdldF9uYW1lKCk7CisgICAgc3RyaW5nIG1ldGhvZF9uYW1lID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKGZ1bmN0aW9uX25hbWUpOworICAgIHRfdHlwZSogcmV0dXJuX3R5cGUgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpOworICAgIHRfc3RydWN0KiBhcmdfbGlzdCA9ICgqZnVuY3Rpb25faXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgdF9zdHJ1Y3QqIHhfbGlzdCA9ICgqZnVuY3Rpb25faXRlciktPmdldF94Y2VwdGlvbnMoKTsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGFyZ3MgPSBhcmdfbGlzdC0+Z2V0X21lbWJlcnMoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4X2xpc3QtPmdldF9tZW1iZXJzKCk7CisKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmaWVsZF9pdGVyOworCisgICAgdF9mdW5jdGlvbiBpbXBsZW1lbnRpbmdfZnVuY3Rpb24ocmV0dXJuX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lX2xjICsgIl9oYW5kbGVyXyIgKyBtZXRob2RfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4X2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmdW5jdGlvbl9pdGVyKS0+aXNfb25ld2F5KCkpOworCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmaW1wbGVtZW50aW5nX2Z1bmN0aW9uKSA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfcmV0dXJuX3ZhbF9pZl9mYWlsICgiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiSVNfIgorICAgICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSEFORExFUiAoaWZhY2UpLCBGQUxTRSk7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJyZXR1cm4gIiA8PCBjbGFzc19uYW1lX3VjIDw8ICJfR0VUX0NMQVNTIChpZmFjZSkiCisgICAgICAgICAgICAgICA8PCAiLT4iIDw8IG1ldGhvZF9uYW1lIDw8ICIgKGlmYWNlLCAiOworCisgICAgaWYgKCFyZXR1cm5fdHlwZS0+aXNfdm9pZCgpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICJfcmV0dXJuLCAiOworICAgIH0KKyAgICBmb3IgKGZpZWxkX2l0ZXIgPSBhcmdzLmJlZ2luKCk7IGZpZWxkX2l0ZXIgIT0gYXJncy5lbmQoKTsgKytmaWVsZF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICgqZmllbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIiwgIjsKKyAgICB9CisgICAgZm9yIChmaWVsZF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IGZpZWxkX2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK2ZpZWxkX2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgKCpmaWVsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiLCAiOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8ICJlcnJvcik7IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIGhhbmRsZXIgaW50ZXJmYWNlIGluaXRpYWxpemVyCisgIGZfc2VydmljZV8gPDwgInN0YXRpYyB2b2lkIiA8PCBlbmRsIDw8IGNsYXNzX25hbWVfbGMgPDwgIl8iIDw8IHNlcnZpY2VfbmFtZV9sYworICAgICAgICAgICAgIDw8ICJfaWZfaW50ZXJmYWNlX2luaXQgKCIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmSW50ZXJmYWNlICppZmFjZSkiCisgICAgICAgICAgICAgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGlmIChmdW5jdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGZvciAoZnVuY3Rpb25faXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmdW5jdGlvbl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmdW5jdGlvbl9pdGVyKSB7CisgICAgICBzdHJpbmcgbWV0aG9kX25hbWUgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X25hbWUoKSk7CisKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmYWNlLT4iIDw8IG1ldGhvZF9uYW1lIDw8ICIgPSAiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl8iCisgICAgICAgICAgICAgICAgIDw8IG1ldGhvZF9uYW1lIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgfQorICBlbHNlIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJUSFJJRlRfVU5VU0VEX1ZBUiAoaWZhY2UpOyIgPDwgZW5kbDsKKyAgfQorICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGhhbmRsZXIgaW5zdGFuY2UgaW5pdGlhbGl6ZXIKKyAgZl9zZXJ2aWNlXyA8PCAic3RhdGljIHZvaWQiIDw8IGVuZGwgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX2luaXQgKCIgPDwgY2xhc3NfbmFtZSA8PCAiICpzZWxmKSIKKyAgICAgICAgICAgICA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiVEhSSUZUX1VOVVNFRF9WQVIgKHNlbGYpOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBoYW5kbGVyIGNsYXNzIGluaXRpYWxpemVyCisgIGZfc2VydmljZV8gPDwgInN0YXRpYyB2b2lkIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX2NsYXNzX2luaXQgKCIgPDwgY2xhc3NfbmFtZSA8PCAiQ2xhc3MgKmNscykiCisgICAgICAgICAgICAgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGlmIChmdW5jdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGZvciAoZnVuY3Rpb25faXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOworICAgICAgICAgZnVuY3Rpb25faXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7CisgICAgICAgICArK2Z1bmN0aW9uX2l0ZXIpIHsKKyAgICAgIHN0cmluZyBmdW5jdGlvbl9uYW1lID0gKCpmdW5jdGlvbl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIHN0cmluZyBtZXRob2RfbmFtZSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhmdW5jdGlvbl9uYW1lKTsKKworICAgICAgLy8gQWxsIG1ldGhvZHMgYXJlIHB1cmUgdmlydHVhbCBhbmQgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJjbHMtPiIgPDwgbWV0aG9kX25hbWUgPDwgIiA9IE5VTEw7IiA8PCBlbmRsOworICAgIH0KKyAgfQorICBlbHNlIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJUSFJJRlRfVU5VU0VEX1ZBUiAoY2xzKTsiIDw8IGVuZGw7CisgIH0KKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBDIGNvZGUgdGhhdCByZXByZXNlbnRzIGEgVGhyaWZ0IHNlcnZpY2UgcHJvY2Vzc29yLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBmb3Igd2hpY2ggdG8gZ2VuZXJhdGUgYSBwcm9jZXNzb3IKKyAqLwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmdW5jdGlvbl9pdGVyOworCisgIHN0cmluZyBzZXJ2aWNlX25hbWVfbGMgPSB0b19sb3dlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhzZXJ2aWNlX25hbWVfKSk7CisgIHN0cmluZyBzZXJ2aWNlX25hbWVfdWMgPSB0b191cHBlcl9jYXNlKHNlcnZpY2VfbmFtZV9sYyk7CisKKyAgc3RyaW5nIHNlcnZpY2VfcHJvY2Vzc29yX25hbWUgPSBzZXJ2aWNlX25hbWVfICsgIlByb2Nlc3NvciI7CisKKyAgc3RyaW5nIGNsYXNzX25hbWUgPSB0aGlzLT5uc3BhY2UgKyBzZXJ2aWNlX3Byb2Nlc3Nvcl9uYW1lOworICBzdHJpbmcgY2xhc3NfbmFtZV9sYyA9IHRoaXMtPm5zcGFjZV9sYyArIGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhzZXJ2aWNlX3Byb2Nlc3Nvcl9uYW1lKTsKKyAgc3RyaW5nIGNsYXNzX25hbWVfdWMgPSB0b191cHBlcl9jYXNlKGNsYXNzX25hbWVfbGMpOworCisgIHN0cmluZyBwYXJlbnRfY2xhc3NfbmFtZTsKKyAgc3RyaW5nIHBhcmVudF90eXBlX25hbWU7CisKKyAgc3RyaW5nIGhhbmRsZXJfY2xhc3NfbmFtZSA9IHRoaXMtPm5zcGFjZSArIHNlcnZpY2VfbmFtZV8gKyAiSGFuZGxlciI7CisgIHN0cmluZyBoYW5kbGVyX2NsYXNzX25hbWVfbGMgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoaGFuZGxlcl9jbGFzc19uYW1lKTsKKworICBzdHJpbmcgcHJvY2Vzc19mdW5jdGlvbl90eXBlX25hbWUgPSBjbGFzc19uYW1lICsgIlByb2Nlc3NGdW5jdGlvbiI7CisgIHN0cmluZyBwcm9jZXNzX2Z1bmN0aW9uX2RlZl90eXBlX25hbWUgPQorICAgIGNsYXNzX25hbWVfbGMgKyAiX3Byb2Nlc3NfZnVuY3Rpb25fZGVmIjsKKworICBzdHJpbmcgZnVuY3Rpb25fbmFtZTsKKyAgc3RyaW5nIGFyZ3NfaW5kZW50OworCisgIC8vIFRoZSBzZXJ2aWNlIHRoaXMgc2VydmljZSBleHRlbmRzLCBvciBOVUxMIGlmIGl0IGV4dGVuZHMgbm8gc2VydmljZQorICB0X3NlcnZpY2UqIGV4dGVuZHNfc2VydmljZSA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworCisgIC8vIERldGVybWluZSB0aGUgbmFtZSBvZiBvdXIgcGFyZW50IHNlcnZpY2UgKGlmIGFueSkgYW5kIHRoZQorICAvLyBwcm9jZXNzb3IgY2xhc3MnIHBhcmVudCBjbGFzcyBuYW1lIGFuZCB0eXBlCisgIGlmIChleHRlbmRzX3NlcnZpY2UpIHsKKyAgICBzdHJpbmcgcGFyZW50X3NlcnZpY2VfbmFtZSA9IGV4dGVuZHNfc2VydmljZS0+Z2V0X25hbWUoKTsKKyAgICBzdHJpbmcgcGFyZW50X3NlcnZpY2VfbmFtZV9sYyA9IHRvX2xvd2VyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHBhcmVudF9zZXJ2aWNlX25hbWUpKTsKKyAgICBzdHJpbmcgcGFyZW50X3NlcnZpY2VfbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UocGFyZW50X3NlcnZpY2VfbmFtZV9sYyk7CisKKyAgICBwYXJlbnRfY2xhc3NfbmFtZSA9IHRoaXMtPm5zcGFjZSArIHBhcmVudF9zZXJ2aWNlX25hbWUgKyAiUHJvY2Vzc29yIjsKKyAgICBwYXJlbnRfdHlwZV9uYW1lID0gdGhpcy0+bnNwYWNlX3VjICsgIlRZUEVfIiArIHBhcmVudF9zZXJ2aWNlX25hbWVfdWMgKyAiX1BST0NFU1NPUiI7CisgIH0gZWxzZSB7CisgICAgcGFyZW50X2NsYXNzX25hbWUgPSAiVGhyaWZ0RGlzcGF0Y2hQcm9jZXNzb3IiOworICAgIHBhcmVudF90eXBlX25hbWUgPSAiVEhSSUZUX1RZUEVfRElTUEFUQ0hfUFJPQ0VTU09SIjsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzb3IgY2xhc3MnIGRlZmluaXRpb24gaW4gdGhlIGhlYWRlciBmaWxlCisKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3NvciBpbnN0YW5jZSBkZWZpbml0aW9uCisgIGZfaGVhZGVyXyA8PCAiLyogIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICIgcHJvY2Vzc29yICovIiA8PCBlbmRsIDw8ICJzdHJ1Y3QgXyIgPDwgY2xhc3NfbmFtZSA8PCBlbmRsCisgICAgICAgICAgICA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCBwYXJlbnRfY2xhc3NfbmFtZSA8PCAiIHBhcmVudDsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgPDwgIi8qIHByb3RlY3RlZCAqLyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlICsgc2VydmljZV9uYW1lXyArICJIYW5kbGVyICpoYW5kbGVyOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgPDwgIkdIYXNoVGFibGUgKnByb2Nlc3NfbWFwOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9oZWFkZXJfIDw8ICJ9OyIgPDwgZW5kbCA8PCAidHlwZWRlZiBzdHJ1Y3QgXyIgPDwgY2xhc3NfbmFtZSA8PCAiICIgPDwgY2xhc3NfbmFtZSA8PCAiOyIgPDwgZW5kbAorICAgICAgICAgICAgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2Vzc29yIGNsYXNzIGRlZmluaXRpb24KKyAgZl9oZWFkZXJfIDw8ICJzdHJ1Y3QgXyIgPDwgY2xhc3NfbmFtZSA8PCAiQ2xhc3MiIDw8IGVuZGwgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgcGFyZW50X2NsYXNzX25hbWUgPDwgIkNsYXNzIHBhcmVudDsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgPDwgIi8qIHByb3RlY3RlZCAqLyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgPDwgImdib29sZWFuICgqZGlzcGF0Y2hfY2FsbCkgKFRocmlmdERpc3BhdGNoUHJvY2Vzc29yICpwcm9jZXNzb3IsIiA8PCBlbmRsOworICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgc3RyaW5nKDI3LCAnICcpOworICBmX2hlYWRlcl8gPDwgYXJnc19pbmRlbnQgPDwgIlRocmlmdFByb3RvY29sICppbiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIlRocmlmdFByb3RvY29sICpvdXQsIgorICAgICAgICAgICAgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiZ2NoYXIgKmZuYW1lLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiZ2ludDMyIHNlcWlkLCIKKyAgICAgICAgICAgIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIkdFcnJvciAqKmVycm9yKTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfaGVhZGVyXyA8PCAifTsiIDw8IGVuZGwgPDwgInR5cGVkZWYgc3RydWN0IF8iIDw8IGNsYXNzX25hbWUgPDwgIkNsYXNzICIgPDwgY2xhc3NfbmFtZQorICAgICAgICAgICAgPDwgIkNsYXNzOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSByZW1haW5pbmcgaGVhZGVyIGJvaWxlcnBsYXRlCisgIGZfaGVhZGVyXyA8PCAiR1R5cGUgIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfZ2V0X3R5cGUgKHZvaWQpOyIgPDwgZW5kbCA8PCAiI2RlZmluZSAiCisgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIiA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9QUk9DRVNTT1IgIgorICAgICAgICAgICAgPDwgIigiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9nZXRfdHlwZSgpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiIDw8IGNsYXNzX25hbWVfdWMKKyAgICAgICAgICAgIDw8ICIob2JqKSAiCisgICAgICAgICAgICA8PCAiKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIgorICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfUFJPQ0VTU09SLCAiIDw8IGNsYXNzX25hbWUgPDwgIikpIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIKKyAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiSVNfIiA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9QUk9DRVNTT1Iob2JqKSAiCisgICAgICAgICAgICA8PCAiKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIgorICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfUFJPQ0VTU09SKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIiA8PCBjbGFzc19uYW1lX3VjCisgICAgICAgICAgICA8PCAiX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iCisgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9QUk9DRVNTT1IsICIgPDwgY2xhc3NfbmFtZSA8PCAiQ2xhc3MpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiCisgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIklTXyIgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfUFJPQ0VTU09SX0NMQVNTKGMpICIKKyAgICAgICAgICAgIDw8ICIoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIiA8PCBzZXJ2aWNlX25hbWVfdWMKKyAgICAgICAgICAgIDw8ICJfUFJPQ0VTU09SKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjCisgICAgICAgICAgICA8PCAiX1BST0NFU1NPUl9HRVRfQ0xBU1Mob2JqKSAiCisgICAgICAgICAgICA8PCAiKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iCisgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9QUk9DRVNTT1IsICIgPDwgY2xhc3NfbmFtZSA8PCAiQ2xhc3MpKSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzb3IncyBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgaW1wbGVtZW50YXRpb24gZmlsZQorCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzb3IncyBwcm9wZXJ0aWVzIGVudW0KKyAgZl9zZXJ2aWNlXyA8PCAiZW51bSBfIiA8PCBjbGFzc19uYW1lIDw8ICJQcm9wZXJ0aWVzIiA8PCBlbmRsIDw8ICJ7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiUFJPUF8iIDw8IGNsYXNzX25hbWVfdWMgPDwgIl8wLCIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiUFJPUF8iCisgICAgICAgICAgICAgPDwgY2xhc3NfbmFtZV91YyA8PCAiX0hBTkRMRVIiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgIn07IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGltcGxlbWVudGF0aW9uIGJvaWxlcnBsYXRlCisgIGFyZ3NfaW5kZW50ID0gc3RyaW5nKDE1LCAnICcpOworICBmX3NlcnZpY2VfIDw8ICJHX0RFRklORV9UWVBFICgiIDw8IGNsYXNzX25hbWUgPDwgIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgY2xhc3NfbmFtZV9sYworICAgICAgICAgICAgIDw8ICIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8IHBhcmVudF90eXBlX25hbWUgPDwgIikiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2Vzc29yJ3MgcHJvY2Vzc2luZy1mdW5jdGlvbiB0eXBlCisgIGFyZ3NfaW5kZW50ID0gc3RyaW5nKHByb2Nlc3NfZnVuY3Rpb25fdHlwZV9uYW1lLmxlbmd0aCgpICsgMjMsICcgJyk7CisgIGZfc2VydmljZV8gPDwgInR5cGVkZWYgZ2Jvb2xlYW4gKCogIiA8PCBwcm9jZXNzX2Z1bmN0aW9uX3R5cGVfbmFtZSA8PCAiKSAoIgorICAgICAgICAgICAgIDw8IGNsYXNzX25hbWUgPDwgIiAqLCAiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAiZ2ludDMyLCIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8ICJUaHJpZnRQcm90b2NvbCAqLCIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8ICJUaHJpZnRQcm90b2NvbCAqLCIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8ICJHRXJyb3IgKiopOyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3NvcidzIHByb2Nlc3NpbmctZnVuY3Rpb24tZGVmaW5pdGlvbiB0eXBlCisgIGZfc2VydmljZV8gPDwgInR5cGVkZWYgc3RydWN0IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnY2hhciAqbmFtZTsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBwcm9jZXNzX2Z1bmN0aW9uX3R5cGVfbmFtZSA8PCAiIGZ1bmN0aW9uOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCAifSAiIDw8IHByb2Nlc3NfZnVuY3Rpb25fZGVmX3R5cGVfbmFtZSA8PCAiOyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgZm9yd2FyZCBkZWNsYXJhdGlvbnMgb2YgdGhlIHByb2Nlc3NvcidzIHByb2Nlc3NpbmcgZnVuY3Rpb25zIHNvIHdlCisgIC8vIGNhbiByZWZlciB0byB0aGVtIGluIHRoZSBwcm9jZXNzaW5nLWZ1bmN0aW9uLWRlZmluaXRpb24gc3RydWN0IGJlbG93IGFuZAorICAvLyBrZWVwIGFsbCBvZiB0aGUgcHJvY2Vzc29yJ3MgZGVjbGFyYXRpb25zIGluIG9uZSBwbGFjZQorICBmb3IgKGZ1bmN0aW9uX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsKKyAgICAgICBmdW5jdGlvbl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsKKyAgICAgICArK2Z1bmN0aW9uX2l0ZXIpIHsKKyAgICBmdW5jdGlvbl9uYW1lID0gY2xhc3NfbmFtZV9sYyArICJfcHJvY2Vzc18iCisgICAgICArIGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcygoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKworICAgIGFyZ3NfaW5kZW50ID0gc3RyaW5nKGZ1bmN0aW9uX25hbWUubGVuZ3RoKCkgKyAyLCAnICcpOworICAgIGZfc2VydmljZV8gPDwgInN0YXRpYyBnYm9vbGVhbiIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgZnVuY3Rpb25fbmFtZSA8PCAiICgiCisgICAgICAgICAgICAgICA8PCBjbGFzc19uYW1lIDw8ICIgKiwiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8ICJnaW50MzIsIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAiVGhyaWZ0UHJvdG9jb2wgKiwiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8ICJUaHJpZnRQcm90b2NvbCAqLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgIkdFcnJvciAqKik7IiA8PCBlbmRsOworICB9CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2Vzc29yJ3MgcHJvY2Vzc2luZy1mdW5jdGlvbiBkZWZpbml0aW9ucywgaWYgdGhlIHNlcnZpY2UKKyAgLy8gZGVmaW5lcyBhbnkgbWV0aG9kcworICBpZiAoZnVuY3Rpb25zLnNpemUoKSA+IDApIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzdGF0aWMgIiA8PCBwcm9jZXNzX2Z1bmN0aW9uX2RlZl90eXBlX25hbWUKKyAgICAgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9wcm9jZXNzX2Z1bmN0aW9uX2RlZnNbIgorICAgICAgICAgICAgICAgPDwgZnVuY3Rpb25zLnNpemUoKSA8PCAiXSA9IHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZm9yIChmdW5jdGlvbl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7CisgICAgICAgICBmdW5jdGlvbl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsKKyAgICAgICAgICsrZnVuY3Rpb25faXRlcikgeworICAgICAgc3RyaW5nIHNlcnZpY2VfZnVuY3Rpb25fbmFtZSA9ICgqZnVuY3Rpb25faXRlciktPmdldF9uYW1lKCk7CisgICAgICBzdHJpbmcgcHJvY2Vzc19mdW5jdGlvbl9uYW1lID0gY2xhc3NfbmFtZV9sYyArICJfcHJvY2Vzc18iCisgICAgICAgICsgaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHNlcnZpY2VfZnVuY3Rpb25fbmFtZSk7CisKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIlwiIiA8PCBzZXJ2aWNlX2Z1bmN0aW9uX25hbWUgPDwgIlwiLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBwcm9jZXNzX2Z1bmN0aW9uX25hbWUgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IgorICAgICAgICAgICAgICAgICA8PCAoZnVuY3Rpb25faXRlciA9PSAtLWZ1bmN0aW9ucy5lbmQoKSA/ICIiIDogIiwiKSA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn07IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBlbmRsOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3NvcidzIHByb2Nlc3NpbmcgZnVuY3Rpb25zCisgIGZvciAoZnVuY3Rpb25faXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmdW5jdGlvbl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmdW5jdGlvbl9pdGVyKSB7CisgICAgc3RyaW5nIHNlcnZpY2VfZnVuY3Rpb25fbmFtZSA9ICgqZnVuY3Rpb25faXRlciktPmdldF9uYW1lKCk7CisgICAgc3RyaW5nIHNlcnZpY2VfZnVuY3Rpb25fbmFtZV9pYyA9IHVuZGVyc2NvcmVzX3RvX2luaXRpYWxfY2FwcyhzZXJ2aWNlX2Z1bmN0aW9uX25hbWUpOworICAgIHN0cmluZyBzZXJ2aWNlX2Z1bmN0aW9uX25hbWVfbGMgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoc2VydmljZV9mdW5jdGlvbl9uYW1lKTsKKyAgICBzdHJpbmcgc2VydmljZV9mdW5jdGlvbl9uYW1lX3VjID0gdG9fdXBwZXJfY2FzZShzZXJ2aWNlX2Z1bmN0aW9uX25hbWVfbGMpOworCisgICAgdF90eXBlKiByZXR1cm5fdHlwZSA9ICgqZnVuY3Rpb25faXRlciktPmdldF9yZXR1cm50eXBlKCk7CisgICAgYm9vbCBoYXNfcmV0dXJuX3ZhbHVlID0gIXJldHVybl90eXBlLT5pc192b2lkKCk7CisKKyAgICB0X3N0cnVjdCogYXJnX2xpc3QgPSAoKmZ1bmN0aW9uX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGFyZ3MgPSBhcmdfbGlzdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBhcmdfaXRlcjsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9ICgqZnVuY3Rpb25faXRlciktPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4Y2VwdGlvbl9pdGVyOworCisgICAgc3RyaW5nIGFyZ3NfY2xhc3NfbmFtZSA9IHRoaXMtPm5zcGFjZSArIHNlcnZpY2VfbmFtZV8gKyBzZXJ2aWNlX2Z1bmN0aW9uX25hbWVfaWMgKyAiQXJncyI7CisgICAgc3RyaW5nIGFyZ3NfY2xhc3NfdHlwZSA9IHRoaXMtPm5zcGFjZV91YyArICJUWVBFXyIgKyBzZXJ2aWNlX25hbWVfdWMgKyAiXyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzZXJ2aWNlX2Z1bmN0aW9uX25hbWVfdWMgKyAiX0FSR1MiOworCisgICAgc3RyaW5nIHJlc3VsdF9jbGFzc19uYW1lID0gdGhpcy0+bnNwYWNlICsgc2VydmljZV9uYW1lXyArIHNlcnZpY2VfZnVuY3Rpb25fbmFtZV9pYyArICJSZXN1bHQiOworICAgIHN0cmluZyByZXN1bHRfY2xhc3NfdHlwZSA9IHRoaXMtPm5zcGFjZV91YyArICJUWVBFXyIgKyBzZXJ2aWNlX25hbWVfdWMgKyAiXyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNlcnZpY2VfZnVuY3Rpb25fbmFtZV91YyArICJfUkVTVUxUIjsKKworICAgIHN0cmluZyBoYW5kbGVyX2Z1bmN0aW9uX25hbWUgPSBoYW5kbGVyX2NsYXNzX25hbWVfbGMgKyAiXyIgKyBzZXJ2aWNlX2Z1bmN0aW9uX25hbWVfbGM7CisKKyAgICBmdW5jdGlvbl9uYW1lID0gY2xhc3NfbmFtZV9sYyArICJfcHJvY2Vzc18iCisgICAgICAgICAgICAgICAgICAgICsgaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHNlcnZpY2VfZnVuY3Rpb25fbmFtZSk7CisKKyAgICBhcmdzX2luZGVudCA9IHN0cmluZyhmdW5jdGlvbl9uYW1lLmxlbmd0aCgpICsgMiwgJyAnKTsKKyAgICBmX3NlcnZpY2VfIDw8ICJzdGF0aWMgZ2Jvb2xlYW4iIDw8IGVuZGwgPDwgZnVuY3Rpb25fbmFtZSA8PCAiICgiIDw8IGNsYXNzX25hbWUgPDwgIiAqc2VsZiwiCisgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJnaW50MzIgc2VxdWVuY2VfaWQsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICA8PCAiVGhyaWZ0UHJvdG9jb2wgKmlucHV0X3Byb3RvY29sLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgPDwgIlRocmlmdFByb3RvY29sICpvdXRwdXRfcHJvdG9jb2wsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJHRXJyb3IgKiplcnJvcikiCisgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdib29sZWFuIHJlc3VsdCA9IFRSVUU7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiVGhyaWZ0VHJhbnNwb3J0ICogdHJhbnNwb3J0OyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIlRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uICp4Y2VwdGlvbjsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGFyZ3NfY2xhc3NfbmFtZSArICIgKiBhcmdzID0iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19vYmplY3RfbmV3ICgiIDw8IGFyZ3NfY2xhc3NfdHlwZSA8PCAiLCBOVUxMKTsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGlmICgoKmZ1bmN0aW9uX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiVEhSSUZUX1VOVVNFRF9WQVIgKHNlcXVlbmNlX2lkKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgIlRIUklGVF9VTlVTRURfVkFSIChvdXRwdXRfcHJvdG9jb2wpOyIgPDwgZW5kbCA8PCBlbmRsOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF9nZXQgKGlucHV0X3Byb3RvY29sLCBcInRyYW5zcG9ydFwiLCAiCisgICAgICAgICAgICAgICA8PCAiJnRyYW5zcG9ydCwgTlVMTCk7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAvLyBSZWFkIHRoZSBtZXRob2QncyBhcmd1bWVudHMgZnJvbSB0aGUgY2FsbGVyCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKCh0aHJpZnRfc3RydWN0X3JlYWQgKFRIUklGVF9TVFJVQ1QgKGFyZ3MpLCAiCisgICAgICAgICAgICAgICA8PCAiaW5wdXRfcHJvdG9jb2wsIGVycm9yKSAhPSAtMSkgJiYiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICIgICAgKHRocmlmdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfZW5kIChpbnB1dF9wcm90b2NvbCwgIgorICAgICAgICAgICAgICAgPDwgImVycm9yKSAhPSAtMSkgJiYiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICIgICAgKHRocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQgKHRyYW5zcG9ydCwgZXJyb3IpICE9IEZBTFNFKSkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgICBmb3IgKGFyZ19pdGVyID0gYXJncy5iZWdpbigpOyBhcmdfaXRlciAhPSBhcmdzLmVuZCgpOyArK2FyZ19pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IHByb3BlcnR5X3R5cGVfbmFtZSgoKmFyZ19pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiAiCisgICAgICAgICAgICAgICAgIDw8ICgqYXJnX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgICBmb3IgKHhjZXB0aW9uX2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeGNlcHRpb25faXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreGNlcHRpb25faXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCB0eXBlX25hbWUoKCp4Y2VwdGlvbl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiAiCisgICAgICAgICAgICAgICAgIDw8IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcygoKnhjZXB0aW9uX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiID0gTlVMTDsiIDw8IGVuZGw7CisgICAgfQorICAgIGlmIChoYXNfcmV0dXJuX3ZhbHVlKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IHByb3BlcnR5X3R5cGVfbmFtZShyZXR1cm5fdHlwZSkgPDwgIiByZXR1cm5fdmFsdWU7IiA8PCBlbmRsOworICAgIH0KKyAgICBpZiAoISgqZnVuY3Rpb25faXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IHJlc3VsdF9jbGFzc19uYW1lIDw8ICIgKiByZXN1bHRfc3RydWN0OyIgPDwgZW5kbDsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgICAgaWYgKGFyZ3Muc2l6ZSgpID4gMCkgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19vYmplY3RfZ2V0IChhcmdzLCIgPDwgZW5kbDsKKyAgICAgIGFyZ3NfaW5kZW50ID0gaW5kZW50KCkgKyBzdHJpbmcoMTQsICcgJyk7CisgICAgICBmb3IgKGFyZ19pdGVyID0gYXJncy5iZWdpbigpOyBhcmdfaXRlciAhPSBhcmdzLmVuZCgpOyArK2FyZ19pdGVyKSB7CisgICAgICAgIHN0cmluZyBhcmdfbmFtZSA9ICgqYXJnX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgICAgIGZfc2VydmljZV8gPDwgYXJnc19pbmRlbnQgPDwgIlwiIiA8PCBhcmdfbmFtZSA8PCAiXCIsICYiIDw8IGFyZ19uYW1lIDw8ICIsIiA8PCBlbmRsOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCBhcmdzX2luZGVudCA8PCAiTlVMTCk7IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfQorCisgICAgaWYgKCEoKmZ1bmN0aW9uX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICJnX29iamVjdF9nZXQgKG91dHB1dF9wcm90b2NvbCwgXCJ0cmFuc3BvcnRcIiwgIgorICAgICAgICAgICAgICAgICA8PCAiJnRyYW5zcG9ydCwgTlVMTCk7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgInJlc3VsdF9zdHJ1Y3QgPSBnX29iamVjdF9uZXcgKCIgPDwgcmVzdWx0X2NsYXNzX3R5cGUgPDwgIiwgTlVMTCk7IiA8PCBlbmRsOworICAgICAgaWYgKGhhc19yZXR1cm5fdmFsdWUpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19vYmplY3RfZ2V0IChyZXN1bHRfc3RydWN0LCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwic3VjY2Vzc1wiLCAmcmV0dXJuX3ZhbHVlLCBOVUxMKTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gUGFzcyB0aGUgYXJndW1lbnRzIHRvIHRoZSBjb3JyZXNwb25kaW5nIG1ldGhvZCBpbiB0aGUgaGFuZGxlcgorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmICgiIDw8IGhhbmRsZXJfZnVuY3Rpb25fbmFtZSA8PCAiICgiIDw8IHRoaXMtPm5zcGFjZV91YworICAgICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSUYgKHNlbGYtPmhhbmRsZXIpLCIgPDwgZW5kbDsKKyAgICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgc3RyaW5nKGhhbmRsZXJfZnVuY3Rpb25fbmFtZS5sZW5ndGgoKSArIDYsICcgJyk7CisgICAgaWYgKGhhc19yZXR1cm5fdmFsdWUpIHsKKyAgICAgIHN0cmluZyByZXR1cm5fdHlwZV9uYW1lID0gdHlwZV9uYW1lKHJldHVybl90eXBlKTsKKworICAgICAgZl9zZXJ2aWNlXyA8PCBhcmdzX2luZGVudDsKKworICAgICAgLy8gQ2FzdCByZXR1cm5fdmFsdWUgaWYgaXQgd2FzIGRlY2xhcmVkIGFzIGEgdHlwZSBvdGhlciB0aGFuIHRoZSByZXR1cm4KKyAgICAgIC8vIHZhbHVlJ3MgYWN0dWFsIHR5cGUtLS10aGlzIGlzIHRydWUgZm9yIGludGVnZXIgdmFsdWVzIDMyIGJpdHMgb3IgZmV3ZXIKKyAgICAgIC8vIGluIHdpZHRoLCBmb3Igd2hpY2ggR0xpYiByZXF1aXJlcyBhIHBsYWluIGdpbnQgdHlwZSBiZSB1c2VkIHdoZW4KKyAgICAgIC8vIHN0b3Jpbmcgb3IgcmV0cmlldmluZyBhcyBhbiBvYmplY3QgcHJvcGVydHkKKyAgICAgIGlmIChyZXR1cm5fdHlwZV9uYW1lICE9IHByb3BlcnR5X3R5cGVfbmFtZShyZXR1cm5fdHlwZSkpIHsKKyAgICAgICAgaWYgKHJldHVybl90eXBlX25hbWVbcmV0dXJuX3R5cGVfbmFtZS5sZW5ndGgoKSAtIDFdICE9ICcqJykgeworICAgICAgICAgIHJldHVybl90eXBlX25hbWUgKz0gJyAnOworICAgICAgICB9CisgICAgICAgIHJldHVybl90eXBlX25hbWUgKz0gJyonOworCisgICAgICAgIGZfc2VydmljZV8gPDwgIigiIDw8IHJldHVybl90eXBlX25hbWUgPDwgIikiOworICAgICAgfQorCisgICAgICBmX3NlcnZpY2VfIDw8ICImcmV0dXJuX3ZhbHVlLCIgPDwgZW5kbDsKKyAgICB9CisgICAgZm9yIChhcmdfaXRlciA9IGFyZ3MuYmVnaW4oKTsgYXJnX2l0ZXIgIT0gYXJncy5lbmQoKTsgKythcmdfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCBhcmdzX2luZGVudCA8PCAoKmFyZ19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisgICAgZm9yICh4Y2VwdGlvbl9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhjZXB0aW9uX2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hjZXB0aW9uX2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgYXJnc19pbmRlbnQgPDwgIiYiIDw8IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcygoKnhjZXB0aW9uX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgICA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCBhcmdzX2luZGVudCA8PCAiZXJyb3IpID09IFRSVUUpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgICAgLy8gVGhlIGhhbmRsZXIgcmVwb3J0ZWQgc3VjY2VzczsgcmV0dXJuIHRoZSByZXN1bHQsIGlmIGFueSwgdG8gdGhlIGNhbGxlcgorICAgIGlmICghKCpmdW5jdGlvbl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGlmIChoYXNfcmV0dXJuX3ZhbHVlKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X3NldCAocmVzdWx0X3N0cnVjdCwgXCJzdWNjZXNzXCIsICI7CisgICAgICAgIGlmICh0eXBlX25hbWUocmV0dXJuX3R5cGUpICE9IHByb3BlcnR5X3R5cGVfbmFtZShyZXR1cm5fdHlwZSkpIHsKKyAgICAgICAgICAvLyBSb3VuZHRyaXAgY2FzdCB0byBmaXggdGhlIHBvc2l0aW9uIG9mIHNpZ24gYml0LgorICAgICAgICAgIGZfc2VydmljZV8gPDwgIigiIDw8IHByb3BlcnR5X3R5cGVfbmFtZShyZXR1cm5fdHlwZSkgPDwgIikiCisgICAgICAgICAgICAgICAgICAgICA8PCAiKCIgPDwgdHlwZV9uYW1lKHJldHVybl90eXBlKSA8PCAiKSI7CisgICAgICAgIH0KKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAicmV0dXJuX3ZhbHVlLCAiCisgICAgICAgICAgICAgICAgICAgPDwgIk5VTEwpOyIgPDwgZW5kbDsKKworICAgICAgICAvLyBEZWFsbG9jYXRlIChvciB1bnJlZikgcmV0dXJuX3ZhbHVlCisgICAgICAgIHJldHVybl90eXBlID0gZ2V0X3RydWVfdHlwZShyZXR1cm5fdHlwZSk7CisgICAgICAgIGlmIChyZXR1cm5fdHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgICAgICB0X2Jhc2VfdHlwZSogYmFzZV90eXBlID0gKCh0X2Jhc2VfdHlwZSopcmV0dXJuX3R5cGUpOworCisgICAgICAgICAgaWYgKGJhc2VfdHlwZS0+Z2V0X2Jhc2UoKSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcpIHsKKyAgICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChyZXR1cm5fdmFsdWUgIT0gTlVMTCkiIDw8IGVuZGw7CisgICAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICAgIGlmIChiYXNlX3R5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfYnl0ZV9hcnJheV91bnJlZiAocmV0dXJuX3ZhbHVlKTsiIDw8IGVuZGw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX2ZyZWUgKHJldHVybl92YWx1ZSk7IiA8PCBlbmRsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocmV0dXJuX3R5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHJldHVybl92YWx1ZSAhPSBOVUxMKSIgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgICAgIGlmIChyZXR1cm5fdHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICAgICAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9saXN0KilyZXR1cm5fdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKworICAgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgICAgICAgICAgIGlmIChpc19udW1lcmljKGVsZW1fdHlwZSkpIHsKKyAgICAgICAgICAgICAgZl9zZXJ2aWNlXyA8PCAiZ19hcnJheV91bnJlZiI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBmX3NlcnZpY2VfIDw8ICJnX3B0cl9hcnJheV91bnJlZiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmX3NlcnZpY2VfIDw8ICIgKHJldHVybl92YWx1ZSk7IiA8PCBlbmRsOworICAgICAgICAgIH0gZWxzZSBpZiAocmV0dXJuX3R5cGUtPmlzX21hcCgpIHx8IHJldHVybl90eXBlLT5pc19zZXQoKSkgeworICAgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19oYXNoX3RhYmxlX3VucmVmIChyZXR1cm5fdmFsdWUpOyIgPDwgZW5kbDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICB9IGVsc2UgaWYgKHJldHVybl90eXBlLT5pc19zdHJ1Y3QoKSkgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChyZXR1cm5fdmFsdWUgIT0gTlVMTCkiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19vYmplY3RfdW5yZWYgKHJldHVybl92YWx1ZSk7IiA8PCBlbmRsOworICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIH0KKworICAgICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQgPSIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiKCh0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAob3V0cHV0X3Byb3RvY29sLCIgPDwgZW5kbDsKKyAgICAgIGFyZ3NfaW5kZW50ID0gaW5kZW50KCkgKyBzdHJpbmcoMzksICcgJyk7CisgICAgICBmX3NlcnZpY2VfIDw8IGFyZ3NfaW5kZW50IDw8ICJcIiIgPDwgc2VydmljZV9mdW5jdGlvbl9uYW1lIDw8ICJcIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICAgICAgPDwgIlRfUkVQTFksIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJzZXF1ZW5jZV9pZCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICAgICAgPDwgImVycm9yKSAhPSAtMSkgJiYiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgIiAodGhyaWZ0X3N0cnVjdF93cml0ZSAoVEhSSUZUX1NUUlVDVCAocmVzdWx0X3N0cnVjdCksIiA8PCBlbmRsOworICAgICAgYXJnc19pbmRlbnQgPSBpbmRlbnQoKSArIHN0cmluZygyMywgJyAnKTsKKyAgICAgIGZfc2VydmljZV8gPDwgYXJnc19pbmRlbnQgPDwgIm91dHB1dF9wcm90b2NvbCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgImVycm9yKSAhPSAtMSkpOyIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgfQorICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZWxzZSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICAgIC8vIFRoZSBoYW5kbGVyIHJlcG9ydGVkIGZhaWx1cmU7IGNoZWNrIHRvIHNlZSBpZiBhbiBhcHBsaWNhdGlvbi1kZWZpbmVkCisgICAgLy8gZXhjZXB0aW9uIHdhcyByYWlzZWQgYW5kIGlmIHNvLCByZXR1cm4gaXQgdG8gdGhlIGNhbGxlcgorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CisgICAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgICBmb3IgKHhjZXB0aW9uX2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeGNlcHRpb25faXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreGNlcHRpb25faXRlcikgeworICAgICAgICBmX3NlcnZpY2VfIDw8ICJpZiAoIiA8PCBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoKCp4Y2VwdGlvbl9pdGVyKS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICAgICA8PCAiICE9IE5VTEwpIiA8PCBlbmRsOworICAgICAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19vYmplY3Rfc2V0IChyZXN1bHRfc3RydWN0LCIgPDwgZW5kbDsKKyAgICAgICAgYXJnc19pbmRlbnQgPSBpbmRlbnQoKSArIHN0cmluZygxNCwgJyAnKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBhcmdzX2luZGVudCA8PCAiXCIiIDw8ICgqeGNlcHRpb25faXRlciktPmdldF9uYW1lKCkgPDwgIlwiLCAiCisgICAgICAgICAgICAgICAgICAgPDwgKCp4Y2VwdGlvbl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiTlVMTCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0ID0iIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIoKHRocmlmdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChvdXRwdXRfcHJvdG9jb2wsIiA8PCBlbmRsOworICAgICAgICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgc3RyaW5nKDM5LCAnICcpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGFyZ3NfaW5kZW50IDw8ICJcIiIgPDwgc2VydmljZV9mdW5jdGlvbl9uYW1lIDw8ICJcIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICAgICAgICA8PCAiVF9SRVBMWSwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgInNlcXVlbmNlX2lkLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgICAgIDw8ICJlcnJvcikgIT0gLTEpICYmIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICAgPDwgIiAodGhyaWZ0X3N0cnVjdF93cml0ZSAoVEhSSUZUX1NUUlVDVCAocmVzdWx0X3N0cnVjdCksIiA8PCBlbmRsOworICAgICAgICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgc3RyaW5nKDIzLCAnICcpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGFyZ3NfaW5kZW50IDw8ICJvdXRwdXRfcHJvdG9jb2wsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJlcnJvcikgIT0gLTEpKTsiCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZWxzZSIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICAgIH0KKworICAgIC8vIElmIHRoZSBoYW5kbGVyIHJlcG9ydGVkIGZhaWx1cmUgYnV0IHJhaXNlZCBubyBhcHBsaWNhdGlvbi1kZWZpbmVkCisgICAgLy8gZXhjZXB0aW9uLCByZXR1cm4gYSBUaHJpZnQgYXBwbGljYXRpb24gZXhjZXB0aW9uIHdpdGggdGhlIGluZm9ybWF0aW9uCisgICAgLy8gcmV0dXJuZWQgdmlhIEdMaWIncyBvd24gZXJyb3ItcmVwb3J0aW5nIG1lY2hhbmlzbQorICAgIGZfc2VydmljZV8gPDwgImlmICgqZXJyb3IgPT0gTlVMTCkiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ193YXJuaW5nIChcIiIgPDwgc2VydmljZV9uYW1lXyA8PCAiLiIKKyAgICAgICAgICAgICAgIDw8ICgqZnVuY3Rpb25faXRlciktPmdldF9uYW1lKCkgPDwgIiBpbXBsZW1lbnRhdGlvbiByZXR1cm5lZCBGQUxTRSBcIiIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgc3RyaW5nKDExLCAnICcpIDw8ICJcImJ1dCBkaWQgbm90IHNldCBhbiBlcnJvclwiKTsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInhjZXB0aW9uID0iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9BUFBMSUNBVElPTl9FWENFUFRJT04sIiA8PCBlbmRsOworICAgIGFyZ3NfaW5kZW50ID0gaW5kZW50KCkgKyBzdHJpbmcoMTQsICcgJyk7CisgICAgZl9zZXJ2aWNlXyA8PCBhcmdzX2luZGVudCA8PCAiXCJ0eXBlXCIsICAgICplcnJvciAhPSBOVUxMID8gKCplcnJvciktPmNvZGUgOiIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgc3RyaW5nKDExLCAnICcpIDw8ICJUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX1VOS05PV04sIgorICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiXCJtZXNzYWdlXCIsICplcnJvciAhPSBOVUxMID8gKCplcnJvciktPm1lc3NhZ2UgOiBOVUxMLCIKKyAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIk5VTEwpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfY2xlYXJfZXJyb3IgKGVycm9yKTsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgInJlc3VsdCA9IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIigodGhyaWZ0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKG91dHB1dF9wcm90b2NvbCwiIDw8IGVuZGw7CisgICAgYXJnc19pbmRlbnQgPSBpbmRlbnQoKSArIHN0cmluZygzOSwgJyAnKTsKKyAgICBmX3NlcnZpY2VfIDw8IGFyZ3NfaW5kZW50IDw8ICJcIiIgPDwgc2VydmljZV9mdW5jdGlvbl9uYW1lIDw8ICJcIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICAgIDw8ICJUX0VYQ0VQVElPTiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgInNlcXVlbmNlX2lkLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgPDwgImVycm9yKSAhPSAtMSkgJiYiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICIgKHRocmlmdF9zdHJ1Y3Rfd3JpdGUgKFRIUklGVF9TVFJVQ1QgKHhjZXB0aW9uKSwiIDw8IGVuZGw7CisgICAgYXJnc19pbmRlbnQgPSBpbmRlbnQoKSArIHN0cmluZygyMywgJyAnKTsKKyAgICBmX3NlcnZpY2VfIDw8IGFyZ3NfaW5kZW50IDw8ICJvdXRwdXRfcHJvdG9jb2wsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJlcnJvcikgIT0gLTEpKTsiCisgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF91bnJlZiAoeGNlcHRpb24pOyIgPDwgZW5kbDsKKworICAgIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICB9CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgICAvLyBEZWxsb2NhdGUgb3IgdW5yZWYgcmV0cmlldmVkIGFyZ3VtZW50IHZhbHVlcyBhcyBuZWNlc3NhcnkKKyAgICBmb3IgKGFyZ19pdGVyID0gYXJncy5iZWdpbigpOyBhcmdfaXRlciAhPSBhcmdzLmVuZCgpOyArK2FyZ19pdGVyKSB7CisgICAgICBzdHJpbmcgYXJnX25hbWUgPSAoKmFyZ19pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIHRfdHlwZSogYXJnX3R5cGUgPSBnZXRfdHJ1ZV90eXBlKCgqYXJnX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKworICAgICAgaWYgKGFyZ190eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgICB0X2Jhc2VfdHlwZSogYmFzZV90eXBlID0gKCh0X2Jhc2VfdHlwZSopYXJnX3R5cGUpOworCisgICAgICAgIGlmIChiYXNlX3R5cGUtPmdldF9iYXNlKCkgPT0gdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HKSB7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgYXJnX25hbWUgPDwgIiAhPSBOVUxMKSIgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICBpZiAoYmFzZV90eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19ieXRlX2FycmF5X3VucmVmICgiIDw8IGFyZ19uYW1lIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19mcmVlICgiIDw8IGFyZ19uYW1lIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgICAgICB9CisgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChhcmdfdHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgYXJnX25hbWUgPDwgIiAhPSBOVUxMKSIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgICAgaWYgKGFyZ190eXBlLT5pc19saXN0KCkpIHsKKyAgICAgICAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9saXN0KilhcmdfdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CisgICAgICAgICAgaWYgKGlzX251bWVyaWMoZWxlbV90eXBlKSkgeworICAgICAgICAgICAgZl9zZXJ2aWNlXyA8PCAiZ19hcnJheV91bnJlZiI7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZfc2VydmljZV8gPDwgImdfcHRyX2FycmF5X3VucmVmIjsKKyAgICAgICAgICB9CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCAiICgiIDw8IGFyZ19uYW1lIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgICAgfSBlbHNlIGlmIChhcmdfdHlwZS0+aXNfbWFwKCkgfHwgYXJnX3R5cGUtPmlzX3NldCgpKSB7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19oYXNoX3RhYmxlX3VucmVmICgiIDw8IGFyZ19uYW1lIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgICAgfQorCisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICB9IGVsc2UgaWYgKGFyZ190eXBlLT5pc19zdHJ1Y3QoKSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAoIiA8PCBhcmdfbmFtZSA8PCAiICE9IE5VTEwpIiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19vYmplY3RfdW5yZWYgKCIgPDwgYXJnX25hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgfQorICAgIH0KKworICAgIGlmICghKCpmdW5jdGlvbl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X3VucmVmIChyZXN1bHRfc3RydWN0KTsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiaWYgKHJlc3VsdCA9PSBUUlVFKSIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0ID0iIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIigodGhyaWZ0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfZW5kICIKKyAgICAgICAgICAgICAgICAgPDwgIihvdXRwdXRfcHJvdG9jb2wsIGVycm9yKSAhPSAtMSkgJiYiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgIiAodGhyaWZ0X3RyYW5zcG9ydF93cml0ZV9lbmQgKHRyYW5zcG9ydCwgZXJyb3IpICIKKyAgICAgICAgICAgICAgICAgPDwgIiE9IEZBTFNFKSAmJiIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiICh0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIGVycm9yKSAiCisgICAgICAgICAgICAgICAgIDw8ICIhPSBGQUxTRSkpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnRfZG93bigpOworICAgIH0KKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImVsc2UiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0ID0gRkFMU0U7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgImdfb2JqZWN0X3VucmVmIChhcmdzKTsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHJlc3VsdDsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzb3IncyBkaXNwYXRjaF9jYWxsIGltcGxlbWVudGF0aW9uCisgIGZ1bmN0aW9uX25hbWUgPSBjbGFzc19uYW1lX2xjICsgIl9kaXNwYXRjaF9jYWxsIjsKKyAgYXJnc19pbmRlbnQgPSBpbmRlbnQoKSArIHN0cmluZyhmdW5jdGlvbl9uYW1lLmxlbmd0aCgpICsgMiwgJyAnKTsKKyAgZl9zZXJ2aWNlXyA8PCAic3RhdGljIGdib29sZWFuIiA8PCBlbmRsIDw8IGZ1bmN0aW9uX25hbWUKKyAgICAgICAgICAgICA8PCAiIChUaHJpZnREaXNwYXRjaFByb2Nlc3NvciAqZGlzcGF0Y2hfcHJvY2Vzc29yLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgIDw8ICJUaHJpZnRQcm90b2NvbCAqaW5wdXRfcHJvdG9jb2wsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgPDwgIlRocmlmdFByb3RvY29sICpvdXRwdXRfcHJvdG9jb2wsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJnY2hhciAqbWV0aG9kX25hbWUsIgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgImdpbnQzMiBzZXF1ZW5jZV9pZCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICA8PCAiR0Vycm9yICoqZXJyb3IpIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBjbGFzc19uYW1lX2xjIDw8ICJfcHJvY2Vzc19mdW5jdGlvbl9kZWYgKiIKKyAgICAgICAgICAgICA8PCAicHJvY2Vzc19mdW5jdGlvbl9kZWY7IiA8PCBlbmRsOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnYm9vbGVhbiBkaXNwYXRjaF9yZXN1bHQgPSBGQUxTRTsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8IGNsYXNzX25hbWUgPDwgIiAqc2VsZiA9ICIgPDwgY2xhc3NfbmFtZV91YyA8PCAiIChkaXNwYXRjaF9wcm9jZXNzb3IpOyIgPDwgZW5kbDsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBwYXJlbnRfY2xhc3NfbmFtZSA8PCAiQ2xhc3MgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIqcGFyZW50X2NsYXNzID0iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX3R5cGVfY2xhc3NfcGVla19wYXJlbnQgKCIgPDwgY2xhc3NfbmFtZV91YyA8PCAiX0dFVF9DTEFTUyAoc2VsZikpOyIKKyAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAicHJvY2Vzc19mdW5jdGlvbl9kZWYgPSAiCisgICAgICAgICAgICAgPDwgImdfaGFzaF90YWJsZV9sb29rdXAgKHNlbGYtPnByb2Nlc3NfbWFwLCBtZXRob2RfbmFtZSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmIChwcm9jZXNzX2Z1bmN0aW9uX2RlZiAhPSBOVUxMKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGFyZ3NfaW5kZW50ID0gaW5kZW50KCkgKyBzdHJpbmcoNTMsICcgJyk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfZnJlZSAobWV0aG9kX25hbWUpOyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJkaXNwYXRjaF9yZXN1bHQgPSAiCisgICAgICAgICAgICAgPDwgIigqcHJvY2Vzc19mdW5jdGlvbl9kZWYtPmZ1bmN0aW9uKSAoc2VsZiwiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAic2VxdWVuY2VfaWQsIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgImlucHV0X3Byb3RvY29sLCIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8ICJvdXRwdXRfcHJvdG9jb2wsIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgImVycm9yKTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImVsc2UiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgIC8vIE1ldGhvZCBuYW1lIG5vdCByZWNvZ25pemVkOyBjaGFpbiB1cCB0byBvdXIgcGFyZW50IHByb2Nlc3Nvci0tLW5vdGUgdGhlCisgIC8vIHRvcC1tb3N0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kLCBpbiBUaHJpZnREaXNwYXRjaFByb2Nlc3NvciBpdHNlbGYsCisgIC8vIHdpbGwgcmV0dXJuIGFuIGFwcGxpY2F0aW9uIGV4Y2VwdGlvbiB0byB0aGUgY2FsbGVyIGlmIG5vIGNsYXNzIGluIHRoZQorICAvLyBoaWVyYXJjaHkgcmVjb2duaXplcyB0aGUgbWV0aG9kIG5hbWUKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZGlzcGF0Y2hfcmVzdWx0ID0gcGFyZW50X2NsYXNzLT5kaXNwYXRjaF9jYWxsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKGRpc3BhdGNoX3Byb2Nlc3NvciwiIDw8IGVuZGw7CisgIGFyZ3NfaW5kZW50ID0gaW5kZW50KCkgKyBzdHJpbmcoNDcsICcgJyk7CisgIGZfc2VydmljZV8gPDwgYXJnc19pbmRlbnQgPDwgImlucHV0X3Byb3RvY29sLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAib3V0cHV0X3Byb3RvY29sLCIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJtZXRob2RfbmFtZSwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgInNlcXVlbmNlX2lkLCIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJlcnJvcik7IiA8PCBlbmRsOworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJldHVybiBkaXNwYXRjaF9yZXN1bHQ7IiA8PCBlbmRsOworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3NvcidzIHByb3BlcnR5IHNldHRlcgorICBmdW5jdGlvbl9uYW1lID0gY2xhc3NfbmFtZV9sYyArICJfc2V0X3Byb3BlcnR5IjsKKyAgYXJnc19pbmRlbnQgPSBzdHJpbmcoZnVuY3Rpb25fbmFtZS5sZW5ndGgoKSArIDIsICcgJyk7CisgIGZfc2VydmljZV8gPDwgInN0YXRpYyB2b2lkIiA8PCBlbmRsIDw8IGZ1bmN0aW9uX25hbWUgPDwgIiAoR09iamVjdCAqb2JqZWN0LCIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8ICJndWludCBwcm9wZXJ0eV9pZCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgImNvbnN0IEdWYWx1ZSAqdmFsdWUsIgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIkdQYXJhbVNwZWMgKnBzcGVjKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgY2xhc3NfbmFtZSA8PCAiICpzZWxmID0gIiA8PCBjbGFzc19uYW1lX3VjIDw8ICIgKG9iamVjdCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAic3dpdGNoIChwcm9wZXJ0eV9pZCkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJjYXNlIFBST1BfIiA8PCBjbGFzc19uYW1lX3VjIDw8ICJfSEFORExFUjoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAoc2VsZi0+aGFuZGxlciAhPSBOVUxMKSIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImdfb2JqZWN0X3VucmVmIChzZWxmLT5oYW5kbGVyKTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInNlbGYtPmhhbmRsZXIgPSBnX3ZhbHVlX2dldF9vYmplY3QgKHZhbHVlKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiZ19vYmplY3RfcmVmIChzZWxmLT5oYW5kbGVyKTsiIDw8IGVuZGw7CisgIGlmIChleHRlbmRzX3NlcnZpY2UpIHsKKyAgICAvLyBDaGFpbiB1cCB0byBzZXQgdGhlIGhhbmRsZXIgaW4gZXZlcnkgc3VwZXJjbGFzcyBhcyB3ZWxsCisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJHX09CSkVDVF9DTEFTUyAoIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfcGFyZW50X2NsYXNzKS0+IgorICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzZXRfcHJvcGVydHkgKG9iamVjdCwgcHJvcGVydHlfaWQsIHZhbHVlLCBwc3BlYyk7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIkdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wZXJ0eV9pZCwgcHNwZWMpOyIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSBwcm9jZXNzb3IncyBwcm9wZXJ0eSBnZXR0ZXIKKyAgZnVuY3Rpb25fbmFtZSA9IGNsYXNzX25hbWVfbGMgKyAiX2dldF9wcm9wZXJ0eSI7CisgIGFyZ3NfaW5kZW50ID0gc3RyaW5nKGZ1bmN0aW9uX25hbWUubGVuZ3RoKCkgKyAyLCAnICcpOworICBmX3NlcnZpY2VfIDw8ICJzdGF0aWMgdm9pZCIgPDwgZW5kbCA8PCBmdW5jdGlvbl9uYW1lIDw8ICIgKEdPYmplY3QgKm9iamVjdCwiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBhcmdzX2luZGVudCA8PCAiZ3VpbnQgcHJvcGVydHlfaWQsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJHVmFsdWUgKnZhbHVlLCIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJHUGFyYW1TcGVjICpwc3BlYykiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGNsYXNzX25hbWUgPDwgIiAqc2VsZiA9ICIgPDwgY2xhc3NfbmFtZV91YyA8PCAiIChvYmplY3QpOyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInN3aXRjaCAocHJvcGVydHlfaWQpIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiY2FzZSBQUk9QXyIgPDwgY2xhc3NfbmFtZV91YyA8PCAiX0hBTkRMRVI6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ192YWx1ZV9zZXRfb2JqZWN0ICh2YWx1ZSwgc2VsZi0+aGFuZGxlcik7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcGVydHlfaWQsIHBzcGVjKTsiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdG9yIHRoZSBwcm9jZXNzb3IncyBkaXNwb3NlIGZ1bmN0aW9uCisgIGZfc2VydmljZV8gPDwgInN0YXRpYyB2b2lkIiA8PCBlbmRsIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9kaXNwb3NlIChHT2JqZWN0ICpnb2JqZWN0KSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgY2xhc3NfbmFtZSA8PCAiICpzZWxmID0gIiA8PCBjbGFzc19uYW1lX3VjIDw8ICIgKGdvYmplY3QpOyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmIChzZWxmLT5oYW5kbGVyICE9IE5VTEwpIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19vYmplY3RfdW5yZWYgKHNlbGYtPmhhbmRsZXIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJzZWxmLT5oYW5kbGVyID0gTlVMTDsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiR19PQkpFQ1RfQ0xBU1MgKCIgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX3BhcmVudF9jbGFzcykiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLT5kaXNwb3NlIChnb2JqZWN0KTsiCisgICAgICAgICAgICAgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHByb2Nlc3NvciBmaW5hbGl6ZSBmdW5jdGlvbgorICBmX3NlcnZpY2VfIDw8ICJzdGF0aWMgdm9pZCIgPDwgZW5kbCA8PCBjbGFzc19uYW1lX2xjIDw8ICJfZmluYWxpemUgKEdPYmplY3QgKmdvYmplY3QpIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiUHJvY2Vzc29yICpzZWxmID0gIiA8PCB0aGlzLT5uc3BhY2VfdWMKKyAgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9QUk9DRVNTT1IgKGdvYmplY3QpOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgInRocmlmdF9zYWZlX2hhc2hfdGFibGVfZGVzdHJveSAoc2VsZi0+cHJvY2Vzc19tYXApOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIkdfT0JKRUNUX0NMQVNTICgiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9wYXJlbnRfY2xhc3MpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItPmZpbmFsaXplIChnb2JqZWN0KTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSBwcm9jZXNzb3IgaW5zdGFuY2UgaW5pdGlhbGl6ZXIKKyAgZl9zZXJ2aWNlXyA8PCAic3RhdGljIHZvaWQiIDw8IGVuZGwgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX2luaXQgKCIgPDwgY2xhc3NfbmFtZSA8PCAiICpzZWxmKSIKKyAgICAgICAgICAgICA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgaWYgKGZ1bmN0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ3VpbnQgaW5kZXg7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBlbmRsOworICB9CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInNlbGYtPmhhbmRsZXIgPSBOVUxMOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJzZWxmLT5wcm9jZXNzX21hcCA9ICIKKyAgICAgICAgICAgICAgICAiZ19oYXNoX3RhYmxlX25ldyAoZ19zdHJfaGFzaCwgZ19zdHJfZXF1YWwpOyIgPDwgZW5kbDsKKyAgaWYgKGZ1bmN0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgYXJnc19pbmRlbnQgPSBzdHJpbmcoMjEsICcgJyk7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZm9yIChpbmRleCA9IDA7IGluZGV4IDwgIgorICAgICAgICAgICAgICAgPDwgZnVuY3Rpb25zLnNpemUoKSA8PCAiOyBpbmRleCArPSAxKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJnX2hhc2hfdGFibGVfaW5zZXJ0IChzZWxmLT5wcm9jZXNzX21hcCwiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICA8PCBjbGFzc19uYW1lX2xjIDw8ICJfcHJvY2Vzc19mdW5jdGlvbl9kZWZzW2luZGV4XS5uYW1lLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICAgIDw8ICImIiA8PCBjbGFzc19uYW1lX2xjIDw8ICJfcHJvY2Vzc19mdW5jdGlvbl9kZWZzW2luZGV4XSIgPDwgIik7IgorICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSBwcm9jZXNzb3IgY2xhc3MgaW5pdGlhbGl6ZXIKKyAgZl9zZXJ2aWNlXyA8PCAic3RhdGljIHZvaWQiIDw8IGVuZGwgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX2NsYXNzX2luaXQgKCIgPDwgY2xhc3NfbmFtZQorICAgICAgICAgICAgIDw8ICJDbGFzcyAqY2xzKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIkdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChjbHMpOyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJUaHJpZnREaXNwYXRjaFByb2Nlc3NvckNsYXNzICpkaXNwYXRjaF9wcm9jZXNzb3JfY2xhc3MgPSIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIlRIUklGVF9ESVNQQVRDSF9QUk9DRVNTT1JfQ0xBU1MgKGNscyk7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJHUGFyYW1TcGVjICpwYXJhbV9zcGVjOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgImdvYmplY3RfY2xhc3MtPmRpc3Bvc2UgPSAiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9kaXNwb3NlOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9ICIgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX2ZpbmFsaXplOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSAiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9zZXRfcHJvcGVydHk7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9ICIgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX2dldF9wcm9wZXJ0eTsiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgImRpc3BhdGNoX3Byb2Nlc3Nvcl9jbGFzcy0+ZGlzcGF0Y2hfY2FsbCA9ICIgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX2Rpc3BhdGNoX2NhbGw7IgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImNscy0+ZGlzcGF0Y2hfY2FsbCA9ICIgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX2Rpc3BhdGNoX2NhbGw7IgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY19vYmplY3QgKFwiaGFuZGxlclwiLCIKKyAgICAgICAgICAgICA8PCBlbmRsOworICBhcmdzX2luZGVudCA9IGluZGVudCgpICsgc3RyaW5nKDM0LCAnICcpOworICBmX3NlcnZpY2VfIDw8IGFyZ3NfaW5kZW50IDw8ICJcIlNlcnZpY2UgaGFuZGxlciBpbXBsZW1lbnRhdGlvblwiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgIDw8ICJcIlRoZSBzZXJ2aWNlIGhhbmRsZXIgaW1wbGVtZW50YXRpb24gXCIiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICA8PCAiXCJ0byB3aGljaCBtZXRob2QgY2FsbHMgYXJlIGRpc3BhdGNoZWQuXCIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjICsgIlRZUEVfIiArIHNlcnZpY2VfbmFtZV91YyArICJfSEFORExFUiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICA8PCAiR19QQVJBTV9SRUFEV1JJVEUpOyIgPDwgZW5kbDsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywiIDw8IGVuZGw7CisgIGFyZ3NfaW5kZW50ID0gaW5kZW50KCkgKyBzdHJpbmcoMzMsICcgJyk7CisgIGZfc2VydmljZV8gPDwgYXJnc19pbmRlbnQgPDwgIlBST1BfIiA8PCBjbGFzc19uYW1lX3VjIDw8ICJfSEFORExFUiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICA8PCAicGFyYW1fc3BlYyk7IiA8PCBlbmRsOworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBDIGNvZGUgdGhhdCByZXByZXNlbnRzIGEgVGhyaWZ0IHNlcnZpY2Ugc2VydmVyLgorICovCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICAodm9pZCl0c2VydmljZTsKKyAgLy8gR2VuZXJhdGUgdGhlIHNlcnZpY2UncyBoYW5kbGVyIGNsYXNzCisgIGdlbmVyYXRlX3NlcnZpY2VfaGFuZGxlcih0c2VydmljZSk7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHNlcnZpY2UncyBwcm9jZXNzb3IgY2xhc3MKKyAgZ2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodHNlcnZpY2UpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBDIGNvZGUgdG8gcmVwcmVzZW50IGEgVEhyaWZ0IHN0cnVjdHVyZSBhcyBhIEdPYmplY3QuCisgKi8KK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9vYmplY3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBzdHJpbmcgbmFtZV91ID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKG5hbWUpOworICBzdHJpbmcgbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UobmFtZV91KTsKKworICBzdHJpbmcgY2xhc3NfbmFtZSA9IHRoaXMtPm5zcGFjZSArIG5hbWU7CisgIHN0cmluZyBjbGFzc19uYW1lX2xjID0gdGhpcy0+bnNwYWNlX2xjICsgaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKG5hbWUpOworICBzdHJpbmcgY2xhc3NfbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UoY2xhc3NfbmFtZV9sYyk7CisKKyAgc3RyaW5nIGZ1bmN0aW9uX25hbWU7CisgIHN0cmluZyBhcmdzX2luZGVudDsKKworICAvLyB3cml0ZSB0aGUgaW5zdGFuY2UgZGVmaW5pdGlvbgorICBmX3R5cGVzXyA8PCAic3RydWN0IF8iIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8IGVuZGwgPDwgInsgIiA8PCBlbmRsCisgICAgICAgICAgIDw8ICIgIFRocmlmdFN0cnVjdCBwYXJlbnQ7ICIgPDwgZW5kbCA8PCBlbmRsIDw8ICIgIC8qIHB1YmxpYyAqLyIgPDwgZW5kbDsKKworICAvLyBmb3IgZWFjaCBmaWVsZCwgYWRkIGEgbWVtYmVyIHZhcmlhYmxlCisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgZl90eXBlc18gPDwgIiAgIiA8PCB0eXBlX25hbWUodCkgPDwgIiAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgZl90eXBlc18gPDwgIiAgZ2Jvb2xlYW4gX19pc3NldF8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICAvLyBjbG9zZSB0aGUgc3RydWN0dXJlIGRlZmluaXRpb24gYW5kIGNyZWF0ZSBhIHR5cGVkZWYKKyAgZl90eXBlc18gPDwgIn07IiA8PCBlbmRsIDw8ICJ0eXBlZGVmIHN0cnVjdCBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiICIgPDwgdGhpcy0+bnNwYWNlCisgICAgICAgICAgIDw8IG5hbWUgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyB3cml0ZSB0aGUgY2xhc3MgZGVmaW5pdGlvbgorICBmX3R5cGVzXyA8PCAic3RydWN0IF8iIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICJDbGFzcyIgPDwgZW5kbCA8PCAieyIgPDwgZW5kbAorICAgICAgICAgICA8PCAiICBUaHJpZnRTdHJ1Y3RDbGFzcyBwYXJlbnQ7IiA8PCBlbmRsIDw8ICJ9OyIgPDwgZW5kbCA8PCAidHlwZWRlZiBzdHJ1Y3QgXyIKKyAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIkNsYXNzICIgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIkNsYXNzOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIHdyaXRlIHRoZSBzdGFuZGFyZCBHT2JqZWN0IGJvaWxlcnBsYXRlCisgIGZfdHlwZXNfIDw8ICJHVHlwZSAiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX3UgPDwgIl9nZXRfdHlwZSAodm9pZCk7IiA8PCBlbmRsIDw8ICIjZGVmaW5lICIKKyAgICAgICAgICAgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgbmFtZV91YyA8PCAiICgiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX3UKKyAgICAgICAgICAgPDwgIl9nZXRfdHlwZSgpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBuYW1lX3VjCisgICAgICAgICAgIDw8ICIob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IG5hbWVfdWMKKyAgICAgICAgICAgPDwgIiwgIiA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMKKyAgICAgICAgICAgPDwgbmFtZV91YyA8PCAiX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiX1RZUEVfIgorICAgICAgICAgICA8PCBuYW1lX3VjIDw8ICIsICIgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIkNsYXNzKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIgorICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIklTXyIgPDwgbmFtZV91YyA8PCAiKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgIgorICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIiA8PCBuYW1lX3VjIDw8ICIpKSIgPDwgZW5kbCA8PCAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YworICAgICAgICAgICA8PCAiSVNfIiA8PCBuYW1lX3VjIDw8ICJfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksICIgPDwgdGhpcy0+bnNwYWNlX3VjCisgICAgICAgICAgIDw8ICJUWVBFXyIgPDwgbmFtZV91YyA8PCAiKSkiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgbmFtZV91YworICAgICAgICAgICA8PCAiX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIgorICAgICAgICAgICA8PCBuYW1lX3VjIDw8ICIsICIgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIkNsYXNzKSkiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBzdGFydCB3cml0aW5nIHRoZSBvYmplY3QgaW1wbGVtZW50YXRpb24gLmMgZmlsZQorCisgIC8vIGdlbmVyYXRlIHByb3BlcnRpZXMgZW51bQorICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgZl90eXBlc19pbXBsXyA8PCAiZW51bSBfIiA8PCBjbGFzc19uYW1lIDw8ICJQcm9wZXJ0aWVzIiA8PCBlbmRsIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgIlBST1BfIiA8PCBjbGFzc19uYW1lX3VjIDw8ICJfMCI7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgc3RyaW5nIG1lbWJlcl9uYW1lX3VjCisgICAgICAgICAgPSB0b191cHBlcl9jYXNlKHRvX2xvd2VyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkpKTsKKworICAgICAgZl90eXBlc19pbXBsXyA8PCAiLCIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiUFJPUF8iIDw8IGNsYXNzX25hbWVfdWMgPDwgIl8iIDw8IG1lbWJlcl9uYW1lX3VjOworICAgIH0KKyAgICBmX3R5cGVzX2ltcGxfIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3R5cGVzX2ltcGxfIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgLy8gZ2VuZXJhdGUgc3RydWN0IEkvTyBtZXRob2RzCisgIHN0cmluZyB0aGlzX2dldCA9IHRoaXMtPm5zcGFjZSArIG5hbWUgKyAiICogdGhpc19vYmplY3QgPSAiICsgdGhpcy0+bnNwYWNlX3VjICsgbmFtZV91YworICAgICAgICAgICAgICAgICAgICArICIob2JqZWN0KTsiOworICBnZW5lcmF0ZV9zdHJ1Y3RfcmVhZGVyKGZfdHlwZXNfaW1wbF8sIHRzdHJ1Y3QsICJ0aGlzX29iamVjdC0+IiwgdGhpc19nZXQpOworICBnZW5lcmF0ZV9zdHJ1Y3Rfd3JpdGVyKGZfdHlwZXNfaW1wbF8sIHRzdHJ1Y3QsICJ0aGlzX29iamVjdC0+IiwgdGhpc19nZXQpOworCisgIC8vIGdlbmVyYXRlIHByb3BlcnR5IHNldHRlciBhbmQgZ2V0dGVyCisgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKKyAgICAvLyBnZW5lcmF0ZSBwcm9wZXJ0eSBzZXR0ZXIKKyAgICBmdW5jdGlvbl9uYW1lID0gY2xhc3NfbmFtZV9sYyArICJfc2V0X3Byb3BlcnR5IjsKKyAgICBhcmdzX2luZGVudCA9IHN0cmluZyhmdW5jdGlvbl9uYW1lLmxlbmd0aCgpICsgMiwgJyAnKTsKKyAgICBmX3R5cGVzX2ltcGxfIDw8ICJzdGF0aWMgdm9pZCIgPDwgZW5kbCA8PCBmdW5jdGlvbl9uYW1lIDw8ICIgKEdPYmplY3QgKm9iamVjdCwiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8ICJndWludCBwcm9wZXJ0eV9pZCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICAgICAgIDw8ICJjb25zdCBHVmFsdWUgKnZhbHVlLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiR1BhcmFtU3BlYyAqcHNwZWMpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfdHlwZXNfaW1wbF8pOworICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgY2xhc3NfbmFtZSA8PCAiICpzZWxmID0gIiA8PCBjbGFzc19uYW1lX3VjIDw8ICIgKG9iamVjdCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJzd2l0Y2ggKHByb3BlcnR5X2lkKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3R5cGVzX2ltcGxfKTsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICB0X2ZpZWxkKiBtZW1iZXIgPSAoKm1faXRlcik7CisgICAgICBzdHJpbmcgbWVtYmVyX25hbWUgPSBtZW1iZXItPmdldF9uYW1lKCk7CisgICAgICBzdHJpbmcgbWVtYmVyX25hbWVfdWMKKyAgICAgICAgICA9IHRvX3VwcGVyX2Nhc2UodG9fbG93ZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMobWVtYmVyX25hbWUpKSk7CisgICAgICB0X3R5cGUqIG1lbWJlcl90eXBlID0gZ2V0X3RydWVfdHlwZShtZW1iZXItPmdldF90eXBlKCkpOworCisgICAgICBzdHJpbmcgcHJvcGVydHlfaWRlbnRpZmllciA9ICJQUk9QXyIgKyBjbGFzc19uYW1lX3VjICsgIl8iICsgbWVtYmVyX25hbWVfdWM7CisKKyAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImNhc2UgIiA8PCBwcm9wZXJ0eV9pZGVudGlmaWVyICsgIjoiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgaWYgKG1lbWJlcl90eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgICB0X2Jhc2VfdHlwZSogYmFzZV90eXBlID0gKCh0X2Jhc2VfdHlwZSopbWVtYmVyX3R5cGUpOworICAgICAgICBzdHJpbmcgYXNzaWduX2Z1bmN0aW9uX25hbWU7CisKKyAgICAgICAgaWYgKGJhc2VfdHlwZS0+Z2V0X2Jhc2UoKSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcpIHsKKyAgICAgICAgICBzdHJpbmcgcmVsZWFzZV9mdW5jdGlvbl9uYW1lOworCisgICAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHNlbGYtPiIgPDwgbWVtYmVyX25hbWUgPDwgIiAhPSBOVUxMKSIgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgICAgIGlmIChiYXNlX3R5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgICByZWxlYXNlX2Z1bmN0aW9uX25hbWUgPSAiZ19ieXRlX2FycmF5X3VucmVmIjsKKyAgICAgICAgICAgIGFzc2lnbl9mdW5jdGlvbl9uYW1lID0gImdfdmFsdWVfZHVwX2JveGVkIjsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVsZWFzZV9mdW5jdGlvbl9uYW1lID0gImdfZnJlZSI7CisgICAgICAgICAgICBhc3NpZ25fZnVuY3Rpb25fbmFtZSA9ICJnX3ZhbHVlX2R1cF9zdHJpbmciOworICAgICAgICAgIH0KKworICAgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgcmVsZWFzZV9mdW5jdGlvbl9uYW1lIDw8ICIgKHNlbGYtPiIgPDwgbWVtYmVyX25hbWUgPDwgIik7IgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHN3aXRjaCAoYmFzZV90eXBlLT5nZXRfYmFzZSgpKSB7CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICAgICAgYXNzaWduX2Z1bmN0aW9uX25hbWUgPSAiZ192YWx1ZV9nZXRfYm9vbGVhbiI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgICAgICBhc3NpZ25fZnVuY3Rpb25fbmFtZSA9ICJnX3ZhbHVlX2dldF9pbnQiOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgICAgIGFzc2lnbl9mdW5jdGlvbl9uYW1lID0gImdfdmFsdWVfZ2V0X2ludDY0IjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgICAgICBhc3NpZ25fZnVuY3Rpb25fbmFtZSA9ICJnX3ZhbHVlX2dldF9kb3VibGUiOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiAiCisgICAgICAgICAgICAgICAgICAidW5yZWNvZ25pemVkIGJhc2UgdHlwZSBcIiIgKyBiYXNlX3R5cGUtPmdldF9uYW1lKCkgKyAiXCIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvciBzdHJ1Y3QgbWVtYmVyIFwiIgorICAgICAgICAgICAgICAgICsgbWVtYmVyX25hbWUgKyAiXCIiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAic2VsZi0+IiA8PCBtZW1iZXJfbmFtZSA8PCAiID0gIiA8PCBhc3NpZ25fZnVuY3Rpb25fbmFtZQorICAgICAgICAgICAgICAgICAgICAgIDw8ICIgKHZhbHVlKTsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgaWYgKG1lbWJlcl90eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAic2VsZi0+IiA8PCBtZW1iZXJfbmFtZSA8PCAiID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7IgorICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICB9IGVsc2UgaWYgKG1lbWJlcl90eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgICBzdHJpbmcgcmVsZWFzZV9mdW5jdGlvbl9uYW1lOworICAgICAgICBzdHJpbmcgYXNzaWduX2Z1bmN0aW9uX25hbWU7CisKKyAgICAgICAgaWYgKG1lbWJlcl90eXBlLT5pc19saXN0KCkpIHsKKyAgICAgICAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9saXN0KiltZW1iZXJfdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKworICAgICAgICAgIC8vIExpc3RzIG9mIGJhc2UgdHlwZXMgb3RoZXIgdGhhbiBzdHJpbmdzIGFyZSByZXByZXNlbnRlZCBhcyBHQXJyYXlzOworICAgICAgICAgIC8vIGFsbCBvdGhlcnMgYXMgR1B0ckFycmF5cworICAgICAgICAgIGlmIChpc19udW1lcmljKGVsZW1fdHlwZSkpIHsKKyAgICAgICAgICAgIHJlbGVhc2VfZnVuY3Rpb25fbmFtZSA9ICJnX2FycmF5X3VucmVmIjsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVsZWFzZV9mdW5jdGlvbl9uYW1lID0gImdfcHRyX2FycmF5X3VucmVmIjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBhc3NpZ25fZnVuY3Rpb25fbmFtZSA9ICJnX3ZhbHVlX2R1cF9ib3hlZCI7CisgICAgICAgIH0gZWxzZSBpZiAobWVtYmVyX3R5cGUtPmlzX3NldCgpIHx8IG1lbWJlcl90eXBlLT5pc19tYXAoKSkgeworICAgICAgICAgIHJlbGVhc2VfZnVuY3Rpb25fbmFtZSA9ICJnX2hhc2hfdGFibGVfdW5yZWYiOworICAgICAgICAgIGFzc2lnbl9mdW5jdGlvbl9uYW1lID0gImdfdmFsdWVfZHVwX2JveGVkIjsKKyAgICAgICAgfQorCisgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImlmIChzZWxmLT4iIDw8IG1lbWJlcl9uYW1lIDw8ICIgIT0gTlVMTCkiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8IHJlbGVhc2VfZnVuY3Rpb25fbmFtZSA8PCAiIChzZWxmLT4iIDw8IG1lbWJlcl9uYW1lIDw8ICIpOyIKKyAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJzZWxmLT4iIDw8IG1lbWJlcl9uYW1lIDw8ICIgPSAiIDw8IGFzc2lnbl9mdW5jdGlvbl9uYW1lCisgICAgICAgICAgICAgICAgICAgICAgPDwgIiAodmFsdWUpOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSBpZiAobWVtYmVyX3R5cGUtPmlzX3N0cnVjdCgpIHx8IG1lbWJlcl90eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImlmIChzZWxmLT4iIDw8IG1lbWJlcl9uYW1lIDw8ICIgIT0gTlVMTCkiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJnX29iamVjdF91bnJlZiAoc2VsZi0+IiA8PCBtZW1iZXJfbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInNlbGYtPiIgPDwgbWVtYmVyX25hbWUgPDwgIiA9IGdfdmFsdWVfZHVwX29iamVjdCAodmFsdWUpOyIKKyAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgfQorCisgICAgICBpZiAobWVtYmVyLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJzZWxmLT5fX2lzc2V0XyIgPDwgbWVtYmVyX25hbWUgPDwgIiA9IFRSVUU7IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgfQorICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgIkdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wZXJ0eV9pZCwgcHNwZWMpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIHNjb3BlX2Rvd24oZl90eXBlc19pbXBsXyk7CisgICAgc2NvcGVfZG93bihmX3R5cGVzX2ltcGxfKTsKKyAgICBmX3R5cGVzX2ltcGxfIDw8IGVuZGw7CisKKyAgICAvLyBnZW5lcmF0ZSBwcm9wZXJ0eSBnZXR0ZXIKKyAgICBmdW5jdGlvbl9uYW1lID0gY2xhc3NfbmFtZV9sYyArICJfZ2V0X3Byb3BlcnR5IjsKKyAgICBhcmdzX2luZGVudCA9IHN0cmluZyhmdW5jdGlvbl9uYW1lLmxlbmd0aCgpICsgMiwgJyAnKTsKKyAgICBmX3R5cGVzX2ltcGxfIDw8ICJzdGF0aWMgdm9pZCIgPDwgZW5kbCA8PCBmdW5jdGlvbl9uYW1lIDw8ICIgKEdPYmplY3QgKm9iamVjdCwiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8ICJndWludCBwcm9wZXJ0eV9pZCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIkdWYWx1ZSAqdmFsdWUsIgorICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiR1BhcmFtU3BlYyAqcHNwZWMpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfdHlwZXNfaW1wbF8pOworICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgY2xhc3NfbmFtZSA8PCAiICpzZWxmID0gIiA8PCBjbGFzc19uYW1lX3VjIDw8ICIgKG9iamVjdCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJzd2l0Y2ggKHByb3BlcnR5X2lkKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3R5cGVzX2ltcGxfKTsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICB0X2ZpZWxkKiBtZW1iZXIgPSAoKm1faXRlcik7CisgICAgICBzdHJpbmcgbWVtYmVyX25hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7CisgICAgICBzdHJpbmcgbWVtYmVyX25hbWVfdWMKKyAgICAgICAgICA9IHRvX3VwcGVyX2Nhc2UodG9fbG93ZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMobWVtYmVyX25hbWUpKSk7CisgICAgICB0X3R5cGUqIG1lbWJlcl90eXBlID0gZ2V0X3RydWVfdHlwZShtZW1iZXItPmdldF90eXBlKCkpOworCisgICAgICBzdHJpbmcgcHJvcGVydHlfaWRlbnRpZmllciA9ICJQUk9QXyIgKyBjbGFzc19uYW1lX3VjICsgIl8iICsgbWVtYmVyX25hbWVfdWM7CisKKyAgICAgIHN0cmluZyBzZXR0ZXJfZnVuY3Rpb25fbmFtZTsKKworICAgICAgaWYgKG1lbWJlcl90eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgICB0X2Jhc2VfdHlwZSogYmFzZV90eXBlID0gKCh0X2Jhc2VfdHlwZSopbWVtYmVyX3R5cGUpOworCisgICAgICAgIHN3aXRjaCAoYmFzZV90eXBlLT5nZXRfYmFzZSgpKSB7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICBzZXR0ZXJfZnVuY3Rpb25fbmFtZSA9ICJnX3ZhbHVlX3NldF9ib29sZWFuIjsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgICAgc2V0dGVyX2Z1bmN0aW9uX25hbWUgPSAiZ192YWx1ZV9zZXRfaW50IjsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgICBzZXR0ZXJfZnVuY3Rpb25fbmFtZSA9ICJnX3ZhbHVlX3NldF9pbnQ2NCI7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgICAgc2V0dGVyX2Z1bmN0aW9uX25hbWUgPSAiZ192YWx1ZV9zZXRfZG91YmxlIjsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgICBpZiAoYmFzZV90eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICAgICAgc2V0dGVyX2Z1bmN0aW9uX25hbWUgPSAiZ192YWx1ZV9zZXRfYm94ZWQiOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZXR0ZXJfZnVuY3Rpb25fbmFtZSA9ICJnX3ZhbHVlX3NldF9zdHJpbmciOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogIgorICAgICAgICAgICAgICAgICJ1bnJlY29nbml6ZWQgYmFzZSB0eXBlIFwiIiArIGJhc2VfdHlwZS0+Z2V0X25hbWUoKSArICJcIiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvciBzdHJ1Y3QgbWVtYmVyIFwiIgorICAgICAgICAgICAgICArIG1lbWJlcl9uYW1lICsgIlwiIjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChtZW1iZXJfdHlwZS0+aXNfZW51bSgpKSB7CisgICAgICAgIHNldHRlcl9mdW5jdGlvbl9uYW1lID0gImdfdmFsdWVfc2V0X2ludCI7CisgICAgICB9IGVsc2UgaWYgKG1lbWJlcl90eXBlLT5pc19zdHJ1Y3QoKSB8fCBtZW1iZXJfdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgICBzZXR0ZXJfZnVuY3Rpb25fbmFtZSA9ICJnX3ZhbHVlX3NldF9vYmplY3QiOworICAgICAgfSBlbHNlIGlmIChtZW1iZXJfdHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgICAgc2V0dGVyX2Z1bmN0aW9uX25hbWUgPSAiZ192YWx1ZV9zZXRfYm94ZWQiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiAiCisgICAgICAgICAgICAgICJ1bnJlY29nbml6ZWQgdHlwZSBmb3Igc3RydWN0IG1lbWJlciBcIiIgKyBtZW1iZXJfbmFtZSArICJcIiI7CisgICAgICB9CisKKyAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImNhc2UgIiA8PCBwcm9wZXJ0eV9pZGVudGlmaWVyICsgIjoiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgc2V0dGVyX2Z1bmN0aW9uX25hbWUgPDwgIiAodmFsdWUsIHNlbGYtPiIgPDwgbWVtYmVyX25hbWUgPDwgIik7IgorICAgICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgfQorICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgIkdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wZXJ0eV9pZCwgcHNwZWMpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIHNjb3BlX2Rvd24oZl90eXBlc19pbXBsXyk7CisgICAgc2NvcGVfZG93bihmX3R5cGVzX2ltcGxfKTsKKyAgICBmX3R5cGVzX2ltcGxfIDw8IGVuZGw7CisgIH0KKworICAvLyBnZW5lcmF0ZSB0aGUgaW5zdGFuY2UgaW5pdCBmdW5jdGlvbgorCisgIGZfdHlwZXNfaW1wbF8gPDwgInN0YXRpYyB2b2lkICIgPDwgZW5kbCA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV91IDw8ICJfaW5zdGFuY2VfaW5pdCAoIgorICAgICAgICAgICAgICAgIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICIgKiBvYmplY3QpIiA8PCBlbmRsIDw8ICJ7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICAvLyBnZW5lcmF0ZSBkZWZhdWx0LXZhbHVlIHN0cnVjdHVyZXMgZm9yIGNvbnRhaW5lci10eXBlIG1lbWJlcnMKKyAgYm9vbCBjb25zdGFudF9kZWNsYXJhdGlvbl9vdXRwdXQgPSBmYWxzZTsKKyAgYm9vbCBzdHJpbmdfbGlzdF9jb25zdGFudF9vdXRwdXQgPSBmYWxzZTsKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHRfZmllbGQqIG1lbWJlciA9ICptX2l0ZXI7CisgICAgdF9jb25zdF92YWx1ZSogbWVtYmVyX3ZhbHVlID0gbWVtYmVyLT5nZXRfdmFsdWUoKTsKKworICAgIGlmIChtZW1iZXJfdmFsdWUgIT0gTlVMTCkgeworICAgICAgc3RyaW5nIG1lbWJlcl9uYW1lID0gbWVtYmVyLT5nZXRfbmFtZSgpOworICAgICAgdF90eXBlKiBtZW1iZXJfdHlwZSA9IGdldF90cnVlX3R5cGUobWVtYmVyLT5nZXRfdHlwZSgpKTsKKworICAgICAgaWYgKG1lbWJlcl90eXBlLT5pc19saXN0KCkpIHsKKyAgICAgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgbGlzdCA9IG1lbWJlcl92YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICAgICAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfbGlzdCopbWVtYmVyX3R5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisKKyAgICAgICAgLy8gR2VuZXJhdGUgYW4gYXJyYXkgd2l0aCB0aGUgbGlzdCBsaXRlcmFsCisgICAgICAgIGluZGVudChmX3R5cGVzX2ltcGxfKSA8PCAic3RhdGljICIgPDwgdHlwZV9uYW1lKGVsZW1fdHlwZSwgZmFsc2UsIHRydWUpIDw8ICIgX19kZWZhdWx0XyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IG1lbWJlcl9uYW1lIDw8ICJbIiA8PCBsaXN0LnNpemUoKSA8PCAiXSA9ICIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgY29uc3RhbnRfbGl0ZXJhbChtZW1iZXJfdHlwZSwgbWVtYmVyX3ZhbHVlKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKworICAgICAgICBjb25zdGFudF9kZWNsYXJhdGlvbl9vdXRwdXQgPSB0cnVlOworCisgICAgICAgIC8vIElmIHdlIGFyZSBnZW5lcmF0aW5nIHZhbHVlcyBmb3IgYSBwb2ludGVyIGFycmF5IChpLmUuIGEgbGlzdCBvZgorICAgICAgICAvLyBzdHJpbmdzKSwgc2V0IGEgZmxhZyBzbyB3ZSBrbm93IHRvIGFsc28gZGVjbGFyZSBhbiBpbmRleCB2YXJpYWJsZSB0bworICAgICAgICAvLyB1c2UgaW4gcHJlLXBvcHVsYXRpbmcgdGhlIGFycmF5CisgICAgICAgIGlmIChlbGVtX3R5cGUtPmlzX3N0cmluZygpKSB7CisgICAgICAgICAgc3RyaW5nX2xpc3RfY29uc3RhbnRfb3V0cHV0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBUT0RPOiBIYW5kbGUgY29udGFpbmVyIHR5cGVzIG90aGVyIHRoYW4gbGlzdAorICAgIH0KKyAgfQorICBpZiAoY29uc3RhbnRfZGVjbGFyYXRpb25fb3V0cHV0KSB7CisgICAgaWYgKHN0cmluZ19saXN0X2NvbnN0YW50X291dHB1dCkgeworICAgICAgaW5kZW50KGZfdHlwZXNfaW1wbF8pIDw8ICJ1bnNpZ25lZCBpbnQgbGlzdF9pbmRleDsiIDw8IGVuZGw7CisgICAgfQorCisgICAgZl90eXBlc19pbXBsXyA8PCBlbmRsOworICB9CisKKyAgLy8gc2F0aXNmeSBjb21waWxlcnMgd2l0aCAtV2FsbCB0dXJuZWQgb24KKyAgaW5kZW50KGZfdHlwZXNfaW1wbF8pIDw8ICIvKiBzYXRpc2Z5IC1XYWxsICovIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiVEhSSUZUX1VOVVNFRF9WQVIgKG9iamVjdCk7IiA8PCBlbmRsOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X3R5cGUqIG1lbWJlcl90eXBlID0gKCptX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUobWVtYmVyX3R5cGUpOworICAgIGlmICh0LT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgc3RyaW5nIGR2YWwgPSAiID0gIjsKKyAgICAgIGlmICh0LT5pc19lbnVtKCkpIHsKKyAgICAgICAgZHZhbCArPSAiKCIgKyB0eXBlX25hbWUodCkgKyAiKSI7CisgICAgICB9CisgICAgICB0X2NvbnN0X3ZhbHVlKiBjdiA9ICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgICBpZiAoY3YgIT0gTlVMTCkgeworICAgICAgICBkdmFsICs9IGNvbnN0YW50X3ZhbHVlKCIiLCB0LCBjdik7CisgICAgICB9IGVsc2UgeworICAgICAgICBkdmFsICs9IHQtPmlzX3N0cmluZygpID8gIk5VTEwiIDogIjAiOworICAgICAgfQorICAgICAgaW5kZW50KGZfdHlwZXNfaW1wbF8pIDw8ICJvYmplY3QtPiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGR2YWwgPDwgIjsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmICh0LT5pc19zdHJ1Y3QoKSkgeworICAgICAgc3RyaW5nIG5hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7CisgICAgICB0X3Byb2dyYW0qIHR5cGVfcHJvZ3JhbSA9IG1lbWJlcl90eXBlLT5nZXRfcHJvZ3JhbSgpOworICAgICAgc3RyaW5nIHR5cGVfbnNwYWNlID0gdHlwZV9wcm9ncmFtID8gdHlwZV9wcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJjX2dsaWIiKSA6ICIiOworICAgICAgc3RyaW5nIHR5cGVfbnNwYWNlX3ByZWZpeCA9CisgICAgICAgIHR5cGVfbnNwYWNlLmVtcHR5KCkgPyAiIiA6IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3Jlcyh0eXBlX25zcGFjZSkgKyAiXyI7CisgICAgICBzdHJpbmcgdHlwZV9uYW1lX3VjID0gdG9fdXBwZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMobWVtYmVyX3R5cGUtPmdldF9uYW1lKCkpKTsKKyAgICAgIGluZGVudChmX3R5cGVzX2ltcGxfKSA8PCAib2JqZWN0LT4iIDw8IG5hbWUgPDwgIiA9IGdfb2JqZWN0X25ldyAoIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHRvX3VwcGVyX2Nhc2UodHlwZV9uc3BhY2VfcHJlZml4KSA8PCAiVFlQRV8iIDw8IHR5cGVfbmFtZV91YworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIE5VTEwpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHQtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgIHN0cmluZyBuYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgaW5kZW50KGZfdHlwZXNfaW1wbF8pIDw8ICJvYmplY3QtPiIgPDwgbmFtZSA8PCAiID0gTlVMTDsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmICh0LT5pc19jb250YWluZXIoKSkgeworICAgICAgc3RyaW5nIG5hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7CisgICAgICBzdHJpbmcgaW5pdF9mdW5jdGlvbjsKKyAgICAgIHRfdHlwZSogZXR5cGUgPSBOVUxMOworCisgICAgICBpZiAodC0+aXNfbWFwKCkpIHsKKyAgICAgICAgdF90eXBlKiBrZXkgPSAoKHRfbWFwKil0KS0+Z2V0X2tleV90eXBlKCk7CisgICAgICAgIHRfdHlwZSogdmFsdWUgPSAoKHRfbWFwKil0KS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgICAgIGluaXRfZnVuY3Rpb24gPSBnZW5lcmF0ZV9uZXdfaGFzaF9mcm9tX3R5cGUoa2V5LCB2YWx1ZSk7CisgICAgICB9IGVsc2UgaWYgKHQtPmlzX3NldCgpKSB7CisgICAgICAgIGV0eXBlID0gKCh0X3NldCopdCktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgICAgaW5pdF9mdW5jdGlvbiA9IGdlbmVyYXRlX25ld19oYXNoX2Zyb21fdHlwZShldHlwZSwgTlVMTCk7CisgICAgICB9IGVsc2UgaWYgKHQtPmlzX2xpc3QoKSkgeworICAgICAgICBldHlwZSA9ICgodF9saXN0Kil0KS0+Z2V0X2VsZW1fdHlwZSgpOworICAgICAgICBpbml0X2Z1bmN0aW9uID0gZ2VuZXJhdGVfbmV3X2FycmF5X2Zyb21fdHlwZShldHlwZSk7CisgICAgICB9CisKKyAgICAgIGluZGVudChmX3R5cGVzX2ltcGxfKSA8PCAib2JqZWN0LT4iIDw8IG5hbWUgPDwgIiA9ICIgPDwgaW5pdF9mdW5jdGlvbiA8PCBlbmRsOworCisgICAgICAvLyBQcmUtcG9wdWxhdGUgdGhlIGNvbnRhaW5lciB3aXRoIHRoZSBzcGVjaWZpZWQgZGVmYXVsdCB2YWx1ZXMsIGlmIGFueQorICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkpIHsKKyAgICAgICAgdF9jb25zdF92YWx1ZSogbWVtYmVyX3ZhbHVlID0gKCptX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKworICAgICAgICBpZiAodC0+aXNfbGlzdCgpKSB7CisgICAgICAgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgbGlzdCA9IG1lbWJlcl92YWx1ZS0+Z2V0X2xpc3QoKTsKKworICAgICAgICAgIGlmIChpc19udW1lcmljKGV0eXBlKSkgeworICAgICAgICAgICAgaW5kZW50KGZfdHlwZXNfaW1wbF8pIDw8CisgICAgICAgICAgICAgICJnX2FycmF5X2FwcGVuZF92YWxzIChvYmplY3QtPiIgPDwgbmFtZSA8PCAiLCAmX19kZWZhdWx0XyIgPDwKKyAgICAgICAgICAgICAgbmFtZSA8PCAiLCAiIDw8IGxpc3Quc2l6ZSgpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpbmRlbnQoZl90eXBlc19pbXBsXykgPDwKKyAgICAgICAgICAgICAgImZvciAobGlzdF9pbmRleCA9IDA7IGxpc3RfaW5kZXggPCAiIDw8IGxpc3Quc2l6ZSgpIDw8ICI7ICIgPDwKKyAgICAgICAgICAgICAgImxpc3RfaW5kZXggKz0gMSkiIDw8IGVuZGw7CisgICAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICAgIGluZGVudChmX3R5cGVzX2ltcGxfKSA8PAorICAgICAgICAgICAgICAiZ19wdHJfYXJyYXlfYWRkIChvYmplY3QtPiIgPDwgbmFtZSA8PCAiLCIgPDwgZW5kbCA8PAorICAgICAgICAgICAgICBpbmRlbnQoKSA8PCBzdHJpbmcoMTcsICcgJykgPDwgImdfc3RyZHVwIChfX2RlZmF1bHRfIiA8PAorICAgICAgICAgICAgICBuYW1lIDw8ICJbbGlzdF9pbmRleF0pKTsiIDw8IGVuZGw7CisgICAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFRPRE86IEhhbmRsZSBjb250YWluZXIgdHlwZXMgb3RoZXIgdGhhbiBsaXN0CisgICAgICB9CisgICAgfQorCisgICAgLyogaWYgbm90IHJlcXVpcmVkLCBpbml0aWFsaXplIHRoZSBfX2lzc2V0IHZhcmlhYmxlICovCisgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgIGluZGVudChmX3R5cGVzX2ltcGxfKSA8PCAib2JqZWN0LT5fX2lzc2V0XyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBGQUxTRTsiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl90eXBlc19pbXBsXyA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8qIGNyZWF0ZSB0aGUgZGVzdHJ1Y3RvciAqLworICBmX3R5cGVzX2ltcGxfIDw8ICJzdGF0aWMgdm9pZCAiIDw8IGVuZGwgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfdQorICAgICAgICAgICAgICAgIDw8ICJfZmluYWxpemUgKEdPYmplY3QgKm9iamVjdCkiIDw8IGVuZGwgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIiAqdG9iamVjdCA9ICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IG5hbWVfdWMKKyAgICAgICAgICAgICAgICA8PCAiIChvYmplY3QpOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgIi8qIHNhdGlzZnkgLVdhbGwgaW4gY2FzZSB3ZSBkb24ndCB1c2UgdG9iamVjdCAqLyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJUSFJJRlRfVU5VU0VEX1ZBUiAodG9iamVjdCk7IiA8PCBlbmRsOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKHQtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICBzdHJpbmcgbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIGlmICh0LT5pc19tYXAoKSB8fCB0LT5pc19zZXQoKSkgeworICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJpZiAodG9iamVjdC0+IiA8PCBuYW1lIDw8ICIgIT0gTlVMTCkiIDw8IGVuZGw7CisgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJnX2hhc2hfdGFibGVfZGVzdHJveSAodG9iamVjdC0+IiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAidG9iamVjdC0+IiA8PCBuYW1lIDw8ICIgPSBOVUxMOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSBpZiAodC0+aXNfbGlzdCgpKSB7CisgICAgICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfbGlzdCopdCktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgICAgc3RyaW5nIGRlc3RydWN0b3JfZnVuY3Rpb24gPSAiZ19wdHJfYXJyYXlfdW5yZWYiOworCisgICAgICAgIGlmIChldHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopZXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBkZXRlcm1pbmUgYXJyYXkgdHlwZSI7CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgICAgICBkZXN0cnVjdG9yX2Z1bmN0aW9uID0gImdfYXJyYXlfdW5yZWYiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBhcnJheSBpbmZvIGZvciB0eXBlIjsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoZXR5cGUtPmlzX2VudW0oKSkgeworICAgICAgICAgIGRlc3RydWN0b3JfZnVuY3Rpb24gPSAiZ19hcnJheV91bnJlZiI7CisgICAgICAgIH0KKworICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJpZiAodG9iamVjdC0+IiA8PCBuYW1lIDw8ICIgIT0gTlVMTCkiIDw8IGVuZGw7CisgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8IGRlc3RydWN0b3JfZnVuY3Rpb24gPDwgIiAodG9iamVjdC0+IiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAidG9iamVjdC0+IiA8PCBuYW1lIDw8ICIgPSBOVUxMOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHQtPmlzX3N0cnVjdCgpIHx8IHQtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgIHN0cmluZyBuYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgLy8gVE9ETzogZ19jbGVhcl9vYmplY3QgbmVlZHMgZ2xpYiA+PSAyLjI4CisgICAgICAvLyBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJnX2NsZWFyX29iamVjdCAoJih0b2JqZWN0LT4iIDw8IG5hbWUgPDwgIikpOyIgPDwgZW5kbDsKKyAgICAgIC8vIGRvZXMgZ19vYmplY3RfdW5yZWYgdGhlIHRyaWNrPworICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHRvYmplY3QtPiIgPDwgbmFtZSA8PCAiICE9IE5VTEwpIiA8PCBlbmRsOworICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiZ19vYmplY3RfdW5yZWYodG9iamVjdC0+IiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInRvYmplY3QtPiIgPDwgbmFtZSA8PCAiID0gTlVMTDsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHQtPmlzX3N0cmluZygpKSB7CisgICAgICBzdHJpbmcgbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImlmICh0b2JqZWN0LT4iIDw8IG5hbWUgPDwgIiAhPSBOVUxMKSIgPDwgZW5kbDsKKyAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgZ2VuZXJhdGVfZnJlZV9mdW5jX2Zyb21fdHlwZSh0KSA8PCAiKHRvYmplY3QtPiIgPDwgbmFtZSA8PCAiKTsiCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJ0b2JqZWN0LT4iIDw8IG5hbWUgPDwgIiA9IE5VTEw7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl90eXBlc19pbXBsXyA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIGdlbmVyYXRlIHRoZSBjbGFzcyBpbml0IGZ1bmN0aW9uCisKKyAgZl90eXBlc19pbXBsXyA8PCAic3RhdGljIHZvaWQiIDw8IGVuZGwgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX2NsYXNzX2luaXQgKCIgPDwgY2xhc3NfbmFtZQorICAgICAgICAgICAgICAgIDw8ICJDbGFzcyAqIGNscykiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfdHlwZXNfaW1wbF8pOworCisgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgIkdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChjbHMpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJUaHJpZnRTdHJ1Y3RDbGFzcyAqc3RydWN0X2NsYXNzID0gIgorICAgICAgICAgICAgICAgIDw8ICJUSFJJRlRfU1RSVUNUX0NMQVNTIChjbHMpOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgPDwgInN0cnVjdF9jbGFzcy0+cmVhZCA9ICIgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX3JlYWQ7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgPDwgInN0cnVjdF9jbGFzcy0+d3JpdGUgPSAiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl93cml0ZTsiIDw8IGVuZGwgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9ICIgPDwgY2xhc3NfbmFtZV9sYyA8PCAiX2ZpbmFsaXplOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gIiA8PCBjbGFzc19uYW1lX2xjCisgICAgICAgICAgICAgICAgICA8PCAiX2dldF9wcm9wZXJ0eTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgIDw8ICJnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSAiIDw8IGNsYXNzX25hbWVfbGMgPDwgIl9zZXRfcHJvcGVydHk7IiA8PCBlbmRsOworCisgICAgLy8gaW5zdGFsbCBhIHByb3BlcnR5IGZvciBlYWNoIG1lbWJlcgorICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIG1lbWJlciA9ICgqbV9pdGVyKTsKKyAgICAgIHN0cmluZyBtZW1iZXJfbmFtZSA9IG1lbWJlci0+Z2V0X25hbWUoKTsKKyAgICAgIHN0cmluZyBtZW1iZXJfbmFtZV91YworICAgICAgICAgID0gdG9fdXBwZXJfY2FzZSh0b19sb3dlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhtZW1iZXJfbmFtZSkpKTsKKyAgICAgIHRfdHlwZSogbWVtYmVyX3R5cGUgPSBnZXRfdHJ1ZV90eXBlKG1lbWJlci0+Z2V0X3R5cGUoKSk7CisgICAgICB0X2NvbnN0X3ZhbHVlKiBtZW1iZXJfdmFsdWUgPSBtZW1iZXItPmdldF92YWx1ZSgpOworCisgICAgICBzdHJpbmcgcHJvcGVydHlfaWRlbnRpZmllciA9ICJQUk9QXyIgKyBjbGFzc19uYW1lX3VjICsgIl8iICsgbWVtYmVyX25hbWVfdWM7CisKKyAgICAgIGZfdHlwZXNfaW1wbF8gPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgYXJnc19pbmRlbnQgPSBpbmRlbnQoKSArICcgJzsKKyAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgIihnb2JqZWN0X2NsYXNzLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCBwcm9wZXJ0eV9pZGVudGlmaWVyCisgICAgICAgICAgICAgICAgICAgIDw8ICIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50OworCisgICAgICBpZiAobWVtYmVyX3R5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgYmFzZV90eXBlID0gKCh0X2Jhc2VfdHlwZSopbWVtYmVyX3R5cGUpLT5nZXRfYmFzZSgpOworCisgICAgICAgIGlmIChiYXNlX3R5cGUgPT0gdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HKSB7CisgICAgICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKW1lbWJlcl90eXBlKS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgICAgIGFyZ3NfaW5kZW50ICs9IHN0cmluZygyMCwgJyAnKTsKKyAgICAgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgImdfcGFyYW1fc3BlY19ib3hlZCAoXCIiIDw8IG1lbWJlcl9uYW1lIDw8ICJcIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIk5VTEwsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJOVUxMLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiR19UWVBFX0JZVEVfQVJSQVksIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJHX1BBUkFNX1JFQURXUklURSkpOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXJnc19pbmRlbnQgKz0gc3RyaW5nKDIxLCAnICcpOworICAgICAgICAgICAgZl90eXBlc19pbXBsXyA8PCAiZ19wYXJhbV9zcGVjX3N0cmluZyAoXCIiIDw8IG1lbWJlcl9uYW1lIDw8ICJcIiwiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgYXJnc19pbmRlbnQgPDwgIk5VTEwsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJOVUxMLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAoKG1lbWJlcl92YWx1ZSAhPSBOVUxMKSA/ICJcIiIgKyBtZW1iZXJfdmFsdWUtPmdldF9zdHJpbmcoKSArICJcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiTlVMTCIpIDw8ICIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJHX1BBUkFNX1JFQURXUklURSkpOyIgPDwgZW5kbDsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoYmFzZV90eXBlID09IHRfYmFzZV90eXBlOjpUWVBFX0JPT0wpIHsKKyAgICAgICAgICBhcmdzX2luZGVudCArPSBzdHJpbmcoMjIsICcgJyk7CisgICAgICAgICAgZl90eXBlc19pbXBsXyA8PCAiZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKFwiIiA8PCBtZW1iZXJfbmFtZSA8PCAiXCIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiTlVMTCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIk5VTEwsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICAgICAgICAgICA8PCAoKChtZW1iZXJfdmFsdWUgIT0gTlVMTCkgJiYgKG1lbWJlcl92YWx1ZS0+Z2V0X2ludGVnZXIoKSAhPSAwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAiVFJVRSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiRkFMU0UiKSA8PCAiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiR19QQVJBTV9SRUFEV1JJVEUpKTsiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICB9IGVsc2UgaWYgKChiYXNlX3R5cGUgPT0gdF9iYXNlX3R5cGU6OlRZUEVfSTgpIHx8IChiYXNlX3R5cGUgPT0gdF9iYXNlX3R5cGU6OlRZUEVfSTE2KQorICAgICAgICAgICAgICAgICAgIHx8IChiYXNlX3R5cGUgPT0gdF9iYXNlX3R5cGU6OlRZUEVfSTMyKSB8fCAoYmFzZV90eXBlID09IHRfYmFzZV90eXBlOjpUWVBFX0k2NCkKKyAgICAgICAgICAgICAgICAgICB8fCAoYmFzZV90eXBlID09IHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRSkpIHsKKyAgICAgICAgICBzdHJpbmcgcGFyYW1fc3BlY19mdW5jdGlvbl9uYW1lID0gImdfcGFyYW1fc3BlY19pbnQiOworICAgICAgICAgIHN0cmluZyBtaW5fdmFsdWU7CisgICAgICAgICAgc3RyaW5nIG1heF92YWx1ZTsKKyAgICAgICAgICBvc3RyaW5nc3RyZWFtIGRlZmF1bHRfdmFsdWU7CisKKyAgICAgICAgICBzd2l0Y2ggKGJhc2VfdHlwZSkgeworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgICAgICBtaW5fdmFsdWUgPSAiR19NSU5JTlQ4IjsKKyAgICAgICAgICAgIG1heF92YWx1ZSA9ICJHX01BWElOVDgiOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgICAgIG1pbl92YWx1ZSA9ICJHX01JTklOVDE2IjsKKyAgICAgICAgICAgIG1heF92YWx1ZSA9ICJHX01BWElOVDE2IjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgICAgICBtaW5fdmFsdWUgPSAiR19NSU5JTlQzMiI7CisgICAgICAgICAgICBtYXhfdmFsdWUgPSAiR19NQVhJTlQzMiI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgICAgcGFyYW1fc3BlY19mdW5jdGlvbl9uYW1lID0gImdfcGFyYW1fc3BlY19pbnQ2NCI7CisgICAgICAgICAgICBtaW5fdmFsdWUgPSAiR19NSU5JTlQ2NCI7CisgICAgICAgICAgICBtYXhfdmFsdWUgPSAiR19NQVhJTlQ2NCI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICAgICAgcGFyYW1fc3BlY19mdW5jdGlvbl9uYW1lID0gImdfcGFyYW1fc3BlY19kb3VibGUiOworICAgICAgICAgICAgbWluX3ZhbHVlID0gIi1JTkZJTklUWSI7CisgICAgICAgICAgICBtYXhfdmFsdWUgPSAiSU5GSU5JVFkiOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiAiCisgICAgICAgICAgICAgICAgICAidW5yZWNvZ25pemVkIGJhc2UgdHlwZSBcIiIgKyBtZW1iZXJfdHlwZS0+Z2V0X25hbWUoKSArICJcIiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb3Igc3RydWN0IG1lbWJlciBcIiIKKyAgICAgICAgICAgICAgICArIG1lbWJlcl9uYW1lICsgIlwiIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChtZW1iZXJfdmFsdWUgIT0gTlVMTCkgeworICAgICAgICAgICAgZGVmYXVsdF92YWx1ZSA8PCAoYmFzZV90eXBlID09IHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRSA/IG1lbWJlcl92YWx1ZS0+Z2V0X2RvdWJsZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbWVtYmVyX3ZhbHVlLT5nZXRfaW50ZWdlcigpKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVmYXVsdF92YWx1ZSA8PCAiMCI7CisgICAgICAgICAgfQorCisgICAgICAgICAgYXJnc19pbmRlbnQgKz0gc3RyaW5nKHBhcmFtX3NwZWNfZnVuY3Rpb25fbmFtZS5sZW5ndGgoKSArIDIsICcgJyk7CisgICAgICAgICAgZl90eXBlc19pbXBsXyA8PCBwYXJhbV9zcGVjX2Z1bmN0aW9uX25hbWUgPDwgIiAoXCIiIDw8IG1lbWJlcl9uYW1lIDw8ICJcIiwiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8ICJOVUxMLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiTlVMTCwiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8IG1pbl92YWx1ZSA8PCAiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCBtYXhfdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8IGRlZmF1bHRfdmFsdWUuc3RyKCkgPDwgIiwiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8ICJHX1BBUkFNX1JFQURXUklURSkpOyIgPDwgZW5kbDsKKyAgICAgICAgfQorCisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICB9IGVsc2UgaWYgKG1lbWJlcl90eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgICAgdF9lbnVtX3ZhbHVlKiBlbnVtX21pbl92YWx1ZSA9ICgodF9lbnVtKiltZW1iZXJfdHlwZSktPmdldF9taW5fdmFsdWUoKTsKKyAgICAgICAgdF9lbnVtX3ZhbHVlKiBlbnVtX21heF92YWx1ZSA9ICgodF9lbnVtKiltZW1iZXJfdHlwZSktPmdldF9tYXhfdmFsdWUoKTsKKyAgICAgICAgaW50IG1pbl92YWx1ZSA9IChlbnVtX21pbl92YWx1ZSAhPSBOVUxMKSA/IGVudW1fbWluX3ZhbHVlLT5nZXRfdmFsdWUoKSA6IDA7CisgICAgICAgIGludCBtYXhfdmFsdWUgPSAoZW51bV9tYXhfdmFsdWUgIT0gTlVMTCkgPyBlbnVtX21heF92YWx1ZS0+Z2V0X3ZhbHVlKCkgOiAwOworCisgICAgICAgIGFyZ3NfaW5kZW50ICs9IHN0cmluZygxOCwgJyAnKTsKKyAgICAgICAgZl90eXBlc19pbXBsXyA8PCAiZ19wYXJhbV9zcGVjX2ludCAoXCIiIDw8IG1lbWJlcl9uYW1lIDw8ICJcIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiTlVMTCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIk5VTEwsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICAgICAgICAgPDwgbWluX3ZhbHVlIDw8ICIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8IG1heF92YWx1ZSA8PCAiLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgIDw8IGFyZ3NfaW5kZW50IDw8IG1pbl92YWx1ZSA8PCAiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgICAgICAgIDw8ICJHX1BBUkFNX1JFQURXUklURSkpOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIH0gZWxzZSBpZiAobWVtYmVyX3R5cGUtPmlzX3N0cnVjdCgpIHx8IG1lbWJlcl90eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgICAgIHRfcHJvZ3JhbSogdHlwZV9wcm9ncmFtID0gbWVtYmVyX3R5cGUtPmdldF9wcm9ncmFtKCk7CisgICAgICAgIHN0cmluZyB0eXBlX25zcGFjZSA9IHR5cGVfcHJvZ3JhbSA/IHR5cGVfcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiY19nbGliIikgOiAiIjsKKyAgICAgICAgc3RyaW5nIHR5cGVfbnNwYWNlX3ByZWZpeCA9CisgICAgICAgICAgdHlwZV9uc3BhY2UuZW1wdHkoKSA/ICIiIDogaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHR5cGVfbnNwYWNlKSArICJfIjsKKworICAgICAgICBzdHJpbmcgcGFyYW1fdHlwZSA9IHRvX3VwcGVyX2Nhc2UodHlwZV9uc3BhY2VfcHJlZml4KSArICJUWVBFXyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHRvX3VwcGVyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKG1lbWJlcl90eXBlLT5nZXRfbmFtZSgpKSk7CisKKyAgICAgICAgYXJnc19pbmRlbnQgKz0gc3RyaW5nKDIwLCAnICcpOworICAgICAgICBmX3R5cGVzX2ltcGxfIDw8ICJnX3BhcmFtX3NwZWNfb2JqZWN0IChcIiIgPDwgbWVtYmVyX25hbWUgPDwgIlwiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgICAgICAgIDw8ICJOVUxMLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiTlVMTCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICAgICAgICAgICA8PCBwYXJhbV90eXBlIDw8ICIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJHX1BBUkFNX1JFQURXUklURSkpOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIH0gZWxzZSBpZiAobWVtYmVyX3R5cGUtPmlzX2xpc3QoKSkgeworICAgICAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9saXN0KiltZW1iZXJfdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgICAgc3RyaW5nIHBhcmFtX3R5cGU7CisKKyAgICAgICAgaWYgKGVsZW1fdHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgIWVsZW1fdHlwZS0+aXNfc3RyaW5nKCkpIHsKKyAgICAgICAgICBwYXJhbV90eXBlID0gIkdfVFlQRV9BUlJBWSI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcGFyYW1fdHlwZSA9ICJHX1RZUEVfUFRSX0FSUkFZIjsKKyAgICAgICAgfQorCisgICAgICAgIGFyZ3NfaW5kZW50ICs9IHN0cmluZygyMCwgJyAnKTsKKyAgICAgICAgZl90eXBlc19pbXBsXyA8PCAiZ19wYXJhbV9zcGVjX2JveGVkIChcIiIgPDwgbWVtYmVyX25hbWUgPDwgIlwiLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudAorICAgICAgICAgICAgICAgICAgICAgIDw8ICJOVUxMLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiTlVMTCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICAgICAgICAgICA8PCBwYXJhbV90eXBlIDw8ICIsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50IDw8ICJHX1BBUkFNX1JFQURXUklURSkpOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIH0gZWxzZSBpZiAobWVtYmVyX3R5cGUtPmlzX3NldCgpIHx8IG1lbWJlcl90eXBlLT5pc19tYXAoKSkgeworICAgICAgICBhcmdzX2luZGVudCArPSBzdHJpbmcoMjAsICcgJyk7CisgICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgImdfcGFyYW1fc3BlY19ib3hlZCAoXCIiIDw8IG1lbWJlcl9uYW1lIDw8ICJcIiwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiTlVMTCwiIDw8IGVuZGwgPDwgYXJnc19pbmRlbnQgPDwgIk5VTEwsIiA8PCBlbmRsIDw8IGFyZ3NfaW5kZW50CisgICAgICAgICAgICAgICAgICAgICAgPDwgIkdfVFlQRV9IQVNIX1RBQkxFLCIgPDwgZW5kbCA8PCBhcmdzX2luZGVudCA8PCAiR19QQVJBTV9SRUFEV1JJVEUpKTsiCisgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgc2NvcGVfZG93bihmX3R5cGVzX2ltcGxfKTsKKyAgZl90eXBlc19pbXBsXyA8PCBlbmRsOworCisgIGZfdHlwZXNfaW1wbF8gPDwgIkdUeXBlIiA8PCBlbmRsIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX3UgPDwgIl9nZXRfdHlwZSAodm9pZCkiIDw8IGVuZGwgPDwgInsiCisgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCAiICBzdGF0aWMgR1R5cGUgdHlwZSA9IDA7IiA8PCBlbmRsIDw8IGVuZGwgPDwgIiAgaWYgKHR5cGUgPT0gMCkgIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgIiAgeyIgPDwgZW5kbCA8PCAiICAgIHN0YXRpYyBjb25zdCBHVHlwZUluZm8gdHlwZV9pbmZvID0gIiA8PCBlbmRsIDw8ICIgICAgeyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsIDw8ICIgICAgICBzaXplb2YgKCIgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIkNsYXNzKSwiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCAiICAgICAgTlVMTCwgLyogYmFzZV9pbml0ICovIiA8PCBlbmRsIDw8ICIgICAgICBOVUxMLCAvKiBiYXNlX2ZpbmFsaXplICovIgorICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgIiAgICAgIChHQ2xhc3NJbml0RnVuYykgIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV91IDw8ICJfY2xhc3NfaW5pdCwiCisgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCAiICAgICAgTlVMTCwgLyogY2xhc3NfZmluYWxpemUgKi8iIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCAiICAgICAgTlVMTCwgLyogY2xhc3NfZGF0YSAqLyIgPDwgZW5kbCA8PCAiICAgICAgc2l6ZW9mICgiIDw8IHRoaXMtPm5zcGFjZQorICAgICAgICAgICAgICAgIDw8IG5hbWUgPDwgIiksIiA8PCBlbmRsIDw8ICIgICAgICAwLCAvKiBuX3ByZWFsbG9jcyAqLyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8ICIgICAgICAoR0luc3RhbmNlSW5pdEZ1bmMpICIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfdSA8PCAiX2luc3RhbmNlX2luaXQsIgorICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgIiAgICAgIE5VTEwsIC8qIHZhbHVlX3RhYmxlICovIiA8PCBlbmRsIDw8ICIgICAgfTsiIDw8IGVuZGwgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8ICIgICAgdHlwZSA9IGdfdHlwZV9yZWdpc3Rlcl9zdGF0aWMgKFRIUklGVF9UWVBFX1NUUlVDVCwgIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIiIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICJUeXBlXCIsIgorICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnR5cGVfaW5mbywgMCk7IiA8PCBlbmRsIDw8ICIgIH0iCisgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsIDw8ICIgIHJldHVybiB0eXBlOyIgPDwgZW5kbCA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBmdW5jdGlvbnMgdG8gd3JpdGUgVGhyaWZ0IHN0cnVjdHVyZXMgdG8gYSBzdHJlYW0uCisgKi8KK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHRoaXNfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0aGlzX2dldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZnVuY3Rpb24pIHsKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBzdHJpbmcgbmFtZV91ID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKG5hbWUpOworICBzdHJpbmcgbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UobmFtZV91KTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGludCBlcnJvcl9yZXQgPSAwOworCisgIGlmIChpc19mdW5jdGlvbikgeworICAgIGVycm9yX3JldCA9IC0xOworICAgIGluZGVudChvdXQpIDw8ICJzdGF0aWMgZ2ludDMyIiA8PCBlbmRsIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX3UKKyAgICAgICAgICAgICAgICA8PCAiX3dyaXRlIChUaHJpZnRTdHJ1Y3QgKm9iamVjdCwgVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfQorICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJnaW50MzIgcmV0OyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiZ2ludDMyIHhmZXIgPSAwOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8IHRoaXNfZ2V0IDw8IGVuZGw7CisgIC8vIHNhdGlzZnkgLVdhbGwgaW4gdGhlIGNhc2Ugb2YgYW4gZW1wdHkgc3RydWN0CisgIGlmICghdGhpc19nZXQuZW1wdHkoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJUSFJJRlRfVU5VU0VEX1ZBUiAodGhpc19vYmplY3QpOyIgPDwgZW5kbDsKKyAgfQorCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2JlZ2luIChwcm90b2NvbCwgXCIiIDw8IG5hbWUKKyAgICAgIDw8ICJcIiwgZXJyb3IpKSA8IDApIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHRoaXNfb2JqZWN0LT5fX2lzc2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPT0gVFJVRSkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAiCisgICAgICAgIDw8ICJcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiwgIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiCisgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIsIGVycm9yKSkgPCAwKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQKKyAgICAgICAgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbDsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCB0aGlzX25hbWUsICIiLCBlcnJvcl9yZXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgZXJyb3IpKSA8IDApIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IgorICAgICAgICA8PCBlbmRsOworCisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICAvLyB3cml0ZSB0aGUgc3RydWN0IG1hcAorICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX3N0b3AgKHByb3RvY29sLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2VuZCAocHJvdG9jb2wsIGVycm9yKSkgPCAwKSIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGwKKyAgICAgIDw8IGVuZGw7CisKKyAgaWYgKGlzX2Z1bmN0aW9uKSB7CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiB4ZmVyOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgdG8gcmVhZCBUaHJpZnQgc3RydWN0dXJlcyBmcm9tIGEgc3RyZWFtLgorICovCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0aGlzX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdGhpc19nZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2Z1bmN0aW9uKSB7CisgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgc3RyaW5nIG5hbWVfdSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhuYW1lKTsKKyAgc3RyaW5nIG5hbWVfdWMgPSB0b191cHBlcl9jYXNlKG5hbWVfdSk7CisgIGludCBlcnJvcl9yZXQgPSAwOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgaWYgKGlzX2Z1bmN0aW9uKSB7CisgICAgZXJyb3JfcmV0ID0gLTE7CisgICAgaW5kZW50KG91dCkgPDwgIi8qIHJlYWRzIGEgIiA8PCBuYW1lX3UgPDwgIiBvYmplY3QgKi8iIDw8IGVuZGwgPDwgInN0YXRpYyBnaW50MzIiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV91CisgICAgICAgICAgICAgICAgPDwgIl9yZWFkIChUaHJpZnRTdHJ1Y3QgKm9iamVjdCwgVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gZGVjbGFyZSBzdGFjayB0ZW1wIHZhcmlhYmxlcworICBvdXQgPDwgaW5kZW50KCkgPDwgImdpbnQzMiByZXQ7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJnaW50MzIgeGZlciA9IDA7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiZ2NoYXIgKm5hbWUgPSBOVUxMOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiVGhyaWZ0VHlwZSBmdHlwZTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJnaW50MTYgZmlkOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiZ3VpbnQzMiBsZW4gPSAwOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgImdwb2ludGVyIGRhdGEgPSBOVUxMOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCB0aGlzX2dldCA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJnYm9vbGVhbiBpc3NldF8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gRkFMU0U7IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIG91dCA8PCBlbmRsOworCisgIC8vIHNhdGlzZnkgLVdhbGwgaW4gY2FzZSB3ZSBkb24ndCB1c2Ugc29tZSB2YXJpYWJsZXMKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIvKiBzYXRpc2Z5IC1XYWxsIGluIGNhc2UgdGhlc2UgYXJlbid0IHVzZWQgKi8iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJUSFJJRlRfVU5VU0VEX1ZBUiAobGVuKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIlRIUklGVF9VTlVTRURfVkFSIChkYXRhKTsiIDw8IGVuZGw7CisKKyAgaWYgKCF0aGlzX2dldC5lbXB0eSgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJUSFJJRlRfVU5VU0VEX1ZBUiAodGhpc19vYmplY3QpOyIgPDwgZW5kbDsKKyAgfQorICBvdXQgPDwgZW5kbDsKKworICAvLyByZWFkIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cnVjdHVyZSBtYXJrZXIKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIvKiByZWFkIHRoZSBzdHJ1Y3QgYmVnaW4gbWFya2VyICovIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfYmVnaW4gKHByb3RvY29sLCAmbmFtZSwgZXJyb3IpKSA8IDApIiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBpZiAobmFtZSkgZ19mcmVlIChuYW1lKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgKG5hbWUpIGdfZnJlZSAobmFtZSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAibmFtZSA9IE5VTEw7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gcmVhZCB0aGUgc3RydWN0IGZpZWxkcworICBvdXQgPDwgaW5kZW50KCkgPDwgIi8qIHJlYWQgdGhlIHN0cnVjdCBmaWVsZHMgKi8iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIndoaWxlICgxKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICAvLyByZWFkIGJlZ2lubmluZyBmaWVsZCBtYXJrZXIKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIvKiByZWFkIHRoZSBiZWdpbm5pbmcgb2YgYSBmaWVsZCAqLyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmbmFtZSwgJmZ0eXBlLCAmZmlkLCBlcnJvcikpIDwgMCkiCisgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIGlmIChuYW1lKSBnX2ZyZWUgKG5hbWUpOyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiAobmFtZSkgZ19mcmVlIChuYW1lKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJuYW1lID0gTlVMTDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBjaGVjayBmb3IgZmllbGQgU1RPUCBtYXJrZXIKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIvKiBicmVhayBpZiB3ZSBnZXQgYSBTVE9QIGZpZWxkICovIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiaWYgKGZ0eXBlID09IFRfU1RPUCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgYnJlYWs7IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIHN3aXRjaCBkZXBlbmRpbmcgb24gdGhlIGZpZWxkIHR5cGUKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmlkKSIgPDwgZW5kbDsKKworICAvLyBzdGFydCBzd2l0Y2gKKyAgc2NvcGVfdXAob3V0KTsKKworICAvLyBnZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gdHlwZXMKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJpZiAoZnR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworICAgIC8vIGdlbmVyYXRlIGRlc2VyaWFsaXplIGZpZWxkCisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCB0aGlzX25hbWUsICIiLCBlcnJvcl9yZXQsIGZhbHNlKTsKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9za2lwIChwcm90b2NvbCwgZnR5cGUsIGVycm9yKSkgPCAwKSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiICAgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICB4ZmVyICs9IHJldDsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgLy8gY3JlYXRlIHRoZSBkZWZhdWx0IGNhc2UKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIiAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfc2tpcCAocHJvdG9jb2wsIGZ0eXBlLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICIgICAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHhmZXIgKz0gcmV0OyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIiAgYnJlYWs7IiA8PCBlbmRsOworCisgIC8vIGVuZCBzd2l0Y2gKKyAgc2NvcGVfZG93bihvdXQpOworCisgIC8vIHJlYWQgZmllbGQgZW5kIG1hcmtlcgorICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChwcm90b2NvbCwgZXJyb3IpKSA8IDApIiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbDsKKworICAvLyBlbmQgd2hpbGUgbG9vcAorICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworCisgIC8vIHJlYWQgdGhlIGVuZCBvZiB0aGUgc3RydWN0dXJlCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfZW5kIChwcm90b2NvbCwgZXJyb3IpKSA8IDApIiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbAorICAgICAgPDwgZW5kbDsKKworICAvLyBpZiBhIHJlcXVpcmVkIGZpZWxkIGlzIG1pc3NpbmcsIHRocm93IGFuIGVycm9yCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFpc3NldF8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieyIKKyAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1BST1RPQ09MX0VSUk9SLCIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICIgICAgICAgICAgICAgICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfSU5WQUxJRF9EQVRBLCIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICIgICAgICAgICAgICAgICBcIm1pc3NpbmcgZmllbGRcIik7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAtMTsiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGlmIChpc19mdW5jdGlvbikgeworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4geGZlcjsiIDw8IGVuZGw7CisgIH0KKworICAvLyBlbmQgdGhlIGZ1bmN0aW9uL3N0cnVjdHVyZQorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0KSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkgKyBzdWZmaXg7CisKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIG5hbWU7CisgIH0KKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUsIGVycm9yX3JldCk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSwgZXJyb3JfcmV0KTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfIjsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgImJvb2wgKHByb3RvY29sLCAiIDw8IG5hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8ICJieXRlIChwcm90b2NvbCwgIiA8PCBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgImkxNiAocHJvdG9jb2wsICIgPDwgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJpMzIgKHByb3RvY29sLCAiIDw8IG5hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAiaTY0IChwcm90b2NvbCwgIiA8PCBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgImRvdWJsZSAocHJvdG9jb2wsICIgPDwgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgb3V0IDw8ICJiaW5hcnkgKHByb3RvY29sLCAiIDw8IG5hbWUgPDwgIiA/ICgoR0J5dGVBcnJheSAqKSAiIDw8IG5hbWUgPDwgIiktPmRhdGEgOiBOVUxMLCAiCisgICAgICAgICAgICAgIDw8IG5hbWUgPDwgIiA/ICgoR0J5dGVBcnJheSAqKSAiIDw8IG5hbWUgPDwgIiktPmxlbiA6IDAiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAic3RyaW5nIChwcm90b2NvbCwgIiA8PCBuYW1lOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDIHdyaXRlciBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpICsgbmFtZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICJpMzIgKHByb3RvY29sLCAoZ2ludDMyKSAiIDw8IG5hbWU7CisgICAgfQorICAgIG91dCA8PCAiLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICciICsgbmFtZSArICInIFRZUEUgJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdHlwZV9uYW1lKHR5cGUpKTsKKyAgfQorfQorCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0KSB7CisgICh2b2lkKXRzdHJ1Y3Q7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfc3RydWN0X3dyaXRlIChUSFJJRlRfU1RSVUNUICgiIDw8IHByZWZpeAorICAgICAgPDwgIiksIHByb3RvY29sLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCkgeworICBzY29wZV91cChvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X3R5cGUqIHRrZXkgPSAoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdHZhbCA9ICgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgc3RyaW5nIHRrZXlfbmFtZSA9IHR5cGVfbmFtZSh0a2V5KTsKKyAgICBzdHJpbmcgdHZhbF9uYW1lID0gdHlwZV9uYW1lKHR2YWwpOworICAgIHN0cmluZyB0a2V5X3B0cjsKKyAgICBzdHJpbmcgdHZhbF9wdHI7CisgICAgc3RyaW5nIGtleW5hbWUgPSB0bXAoImtleSIpOworICAgIHN0cmluZyB2YWxuYW1lID0gdG1wKCJ2YWwiKTsKKworICAgIGRlY2xvcmVfbG9jYWxfdmFyaWFibGVfZm9yX3dyaXRlKG91dCwgdGtleSwga2V5bmFtZSk7CisgICAgZGVjbG9yZV9sb2NhbF92YXJpYWJsZV9mb3Jfd3JpdGUob3V0LCB0dmFsLCB2YWxuYW1lKTsKKworICAgIC8qIElmIGVpdGhlciB0aGUga2V5IG9yIHZhbHVlIHR5cGUgaXMgYSB0eXBlZGVmLCBmaW5kIGl0cyB1bmRlcmx5aW5nIHR5cGUgc28KKyAgICAgICB3ZSBjYW4gY29ycmVjdGx5IGRldGVybWluZSBob3cgdG8gZ2VuZXJhdGUgYSBwb2ludGVyIHRvIGl0ICovCisgICAgdGtleSA9IGdldF90cnVlX3R5cGUodGtleSk7CisgICAgdHZhbCA9IGdldF90cnVlX3R5cGUodHZhbCk7CisKKyAgICB0a2V5X3B0ciA9IHRrZXktPmlzX3N0cmluZygpIHx8ICF0a2V5LT5pc19iYXNlX3R5cGUoKSA/ICIiIDogIioiOworICAgIHR2YWxfcHRyID0gdHZhbC0+aXNfc3RyaW5nKCkgfHwgIXR2YWwtPmlzX2Jhc2VfdHlwZSgpID8gIiIgOiAiKiI7CisKKyAgICAvKgorICAgICAqIFNvbWUgdWdsaW5lc3MgaGVyZS4gIFRvIG1heGltaXplIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCB3ZQorICAgICAqIGF2b2lkIHVzaW5nIEdIYXNoVGFibGVJdGVyIGFuZCBpbnN0ZWFkIGdldCBhIEdMaXN0IG9mIGFsbCBrZXlzLAorICAgICAqIHRoZW4gY29weSBpdCBpbnRvIGEgYXJyYXkgb24gdGhlIHN0YWNrLCBhbmQgZnJlZSBpdC4KKyAgICAgKiBUaGlzIGlzIGJlY2F1c2Ugd2UgbWF5IGV4aXQgZWFybHkgYmVmb3JlIHdlIGdldCBhIGNoYW5jZSB0byBmcmVlIHRoZQorICAgICAqIEdMaXN0LgorICAgICAqLworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiR0xpc3QgKmtleV9saXN0ID0gTlVMTCwgKml0ZXIgPSBOVUxMOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCB0a2V5X25hbWUgPDwgdGtleV9wdHIgPDwgIioga2V5czsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImludCBpID0gMCwga2V5X2NvdW50OyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9tYXBfYmVnaW4gKHByb3RvY29sLCAiCisgICAgICAgIDw8IHR5cGVfdG9fZW51bSh0a2V5KSA8PCAiLCAiIDw8IHR5cGVfdG9fZW51bSh0dmFsKSA8PCAiLCAiIDw8IHByZWZpeCA8PCAiID8gIgorICAgICAgICA8PCAiKGdpbnQzMikgZ19oYXNoX3RhYmxlX3NpemUgKChHSGFzaFRhYmxlICopICIgPDwgcHJlZml4IDw8ICIpIDogMCIKKyAgICAgICAgPDwgIiwgZXJyb3IpKSA8IDApIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmICgiIDw8IHByZWZpeCA8PCAiKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICBnX2hhc2hfdGFibGVfZm9yZWFjaCAoKEdIYXNoVGFibGUgKikgIiA8PCBwcmVmaXgKKyAgICAgICAgPDwgIiwgdGhyaWZ0X2hhc2hfdGFibGVfZ2V0X2tleXMsICZrZXlfbGlzdCk7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJrZXlfY291bnQgPSBnX2xpc3RfbGVuZ3RoIChrZXlfbGlzdCk7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJrZXlzID0gZ19uZXdhICgiIDw8IHRrZXlfbmFtZSA8PCB0a2V5X3B0cgorICAgICAgICA8PCAiLCBrZXlfY291bnQpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZm9yIChpdGVyID0gZ19saXN0X2ZpcnN0IChrZXlfbGlzdCk7IGl0ZXI7ICIKKyAgICAgICAgICAgIml0ZXIgPSBpdGVyLT5uZXh0KSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImtleXNbaSsrXSA9ICgiIDw8IHRrZXlfbmFtZSA8PCB0a2V5X3B0cgorICAgICAgICA8PCAiKSBpdGVyLT5kYXRhOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZ19saXN0X2ZyZWUgKGtleV9saXN0KTsiIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZm9yIChpID0gMDsgaSA8IGtleV9jb3VudDsgKytpKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBrZXluYW1lIDw8ICIgPSBrZXlzW2ldOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCB2YWxuYW1lIDw8ICIgPSAoIiA8PCB0dmFsX25hbWUgPDwgdHZhbF9wdHIKKyAgICAgICAgPDwgIikgZ19oYXNoX3RhYmxlX2xvb2t1cCAoKChHSGFzaFRhYmxlICopICIgPDwgcHJlZml4CisgICAgICAgIDw8ICIpLCAoZ3BvaW50ZXIpICIgPDwga2V5bmFtZSA8PCAiKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbDsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodF9tYXAqKXR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0a2V5X3B0ciArICIgIiArIGtleW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR2YWxfcHRyICsgIiAiICsgdmFsbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfcmV0KTsKKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9tYXBfZW5kIChwcm90b2NvbCwgIgorICAgICAgICAgICAiZXJyb3IpKSA8IDApIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF90eXBlKiB0ZWxlbSA9ICgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIHN0cmluZyB0ZWxlbV9uYW1lID0gdHlwZV9uYW1lKHRlbGVtKTsKKyAgICBzdHJpbmcgdGVsZW1fcHRyID0gdGVsZW0tPmlzX3N0cmluZygpIHx8ICF0ZWxlbS0+aXNfYmFzZV90eXBlKCkgPyAiIiA6ICIqIjsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIkdMaXN0ICprZXlfbGlzdCA9IE5VTEwsICppdGVyID0gTlVMTDsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgdGVsZW1fbmFtZSA8PCB0ZWxlbV9wdHIgPDwgIioga2V5czsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImludCBpID0gMCwga2V5X2NvdW50OyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCB0ZWxlbV9uYW1lIDw8IHRlbGVtX3B0ciA8PCAiIGVsZW07IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJncG9pbnRlciB2YWx1ZTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIlRIUklGVF9VTlVTRURfVkFSICh2YWx1ZSk7IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3NldF9iZWdpbiAocHJvdG9jb2wsICIKKyAgICAgICAgPDwgdHlwZV90b19lbnVtKHRlbGVtKSA8PCAiLCAiIDw8IHByZWZpeCA8PCAiID8gIgorICAgICAgICA8PCAiKGdpbnQzMikgZ19oYXNoX3RhYmxlX3NpemUgKChHSGFzaFRhYmxlICopICIgPDwgcHJlZml4IDw8ICIpIDogMCIKKyAgICAgICAgPDwgIiwgZXJyb3IpKSA8IDApIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmICgiIDw8IHByZWZpeCA8PCAiKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICBnX2hhc2hfdGFibGVfZm9yZWFjaCAoKEdIYXNoVGFibGUgKikgIiA8PCBwcmVmaXgKKyAgICAgICAgPDwgIiwgdGhyaWZ0X2hhc2hfdGFibGVfZ2V0X2tleXMsICZrZXlfbGlzdCk7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJrZXlfY291bnQgPSBnX2xpc3RfbGVuZ3RoIChrZXlfbGlzdCk7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJrZXlzID0gZ19uZXdhICgiIDw8IHRlbGVtX25hbWUgPDwgdGVsZW1fcHRyCisgICAgICAgIDw8ICIsIGtleV9jb3VudCk7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJmb3IgKGl0ZXIgPSBnX2xpc3RfZmlyc3QgKGtleV9saXN0KTsgaXRlcjsgIgorICAgICAgICAgICAiaXRlciA9IGl0ZXItPm5leHQpIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAia2V5c1tpKytdID0gKCIgPDwgdGVsZW1fbmFtZSA8PCB0ZWxlbV9wdHIKKyAgICAgICAgPDwgIikgaXRlci0+ZGF0YTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImdfbGlzdF9mcmVlIChrZXlfbGlzdCk7IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImZvciAoaSA9IDA7IGkgPCBrZXlfY291bnQ7ICsraSkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImVsZW0gPSBrZXlzW2ldOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAidmFsdWUgPSAoZ3BvaW50ZXIpIGdfaGFzaF90YWJsZV9sb29rdXAgIgorICAgICAgICAgICAiKCgoR0hhc2hUYWJsZSAqKSAiIDw8IHByZWZpeCA8PCAiKSwgKGdwb2ludGVyKSBlbGVtKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbDsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodF9zZXQqKXR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWxlbV9wdHIgKyAiZWxlbSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX3JldCk7CisgICAgc2NvcGVfZG93bihvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc2V0X2VuZCAocHJvdG9jb2wsICIKKyAgICAgICAgICAgImVycm9yKSkgPCAwKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBzdHJpbmcgbGVuZ3RoID0gIigiICsgcHJlZml4ICsgIiA/ICIgKyBwcmVmaXggKyAiLT5sZW4gOiAwKSI7CisgICAgc3RyaW5nIGkgPSB0bXAoImkiKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImd1aW50ICIgPDwgaSA8PCAiOyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9saXN0X2JlZ2luIChwcm90b2NvbCwgIgorICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAoZ2ludDMyKSAiCisgICAgICAgIDw8IGxlbmd0aCA8PCAiLCBlcnJvcikpIDwgMCkiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZm9yICgiIDw8IGkgPDwgIiA9IDA7ICIgPDwgaSA8PCAiIDwgIiA8PCBsZW5ndGggPDwgIjsgIgorICAgICAgICA8PCBpIDw8ICIrKykiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIHByZWZpeCwgaSwgZXJyb3JfcmV0KTsKKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9saXN0X2VuZCAocHJvdG9jb2wsICIKKyAgICAgICAgICAgImVycm9yKSkgPCAwKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworfQorCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCkgeworICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCwgIiIsICIiLCBlcnJvcl9yZXQpOworCisgIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWx1ZSk7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQsICIiLCAiIiwgZXJyb3JfcmV0KTsKK30KKwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCkgeworICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW1lbnQpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIiwgIiIsIGVycm9yX3JldCk7Cit9CisKK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQpIHsKKyAgdF90eXBlKiB0dHlwZSA9IGdldF90cnVlX3R5cGUodGxpc3QtPmdldF9lbGVtX3R5cGUoKSk7CisKKyAgLy8gY2FzdCB0byBub24tY29uc3QKKyAgc3RyaW5nIGNhc3QgPSAiIjsKKyAgc3RyaW5nIG5hbWUgPSAiZ19wdHJfYXJyYXlfaW5kZXggKChHUHRyQXJyYXkgKikgIiArIGxpc3QgKyAiLCAiICsgaW5kZXggKyAiKSI7CisKKyAgaWYgKHR0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoImNvbXBpbGVyIGVycm9yOiBsaXN0IGVsZW1lbnQgdHlwZSBjYW5ub3QgYmUgdm9pZCIpOworICB9IGVsc2UgaWYgKGlzX251bWVyaWModHR5cGUpKSB7CisgICAgbmFtZSA9ICJnX2FycmF5X2luZGV4ICgiICsgbGlzdCArICIsICIgKyBiYXNlX3R5cGVfbmFtZSh0dHlwZSkgKyAiLCAiICsgaW5kZXggKyAiKSI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3N0cmluZygpKSB7CisgICAgY2FzdCA9ICIoZ2NoYXIqKSI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpIHx8IHR0eXBlLT5pc19zZXQoKSkgeworICAgIGNhc3QgPSAiKEdIYXNoVGFibGUqKSI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgaWYgKGV0eXBlLT5pc192b2lkKCkpIHsKKyAgICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiY29tcGlsZXIgZXJyb3I6IGxpc3QgZWxlbWVudCB0eXBlIGNhbm5vdCBiZSB2b2lkIik7CisgICAgfQorICAgIGNhc3QgPSBpc19udW1lcmljKGV0eXBlKSA/ICIoR0FycmF5KikiIDogIihHUHRyQXJyYXkqKSI7CisgIH0KKworICB0X2ZpZWxkIGVmaWVsZCh0dHlwZSwgIigiICsgY2FzdCArIG5hbWUgKyAiKSIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIiwgIiIsIGVycm9yX3JldCk7Cit9CisKKy8qIGRlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLiAqLwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhbGxvY2F0ZSkgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHRmaWVsZC0+Z2V0X25hbWUoKSk7CisgIH0KKworICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSArIHN1ZmZpeDsKKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSwgZXJyb3JfcmV0LCBhbGxvY2F0ZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lLCBlcnJvcl9yZXQpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIGlmICh0YmFzZSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBuYW1lIDw8ICIgIT0gTlVMTCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJnX2ZyZWUoIiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBuYW1lIDw8ICIgPSBOVUxMOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF8iOworCisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgIG91dCA8PCAiYmluYXJ5IChwcm90b2NvbCwgJmRhdGEsICZsZW4iOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8ICJzdHJpbmcgKHByb3RvY29sLCAmIiA8PCBuYW1lOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgb3V0IDw8ICJib29sIChwcm90b2NvbCwgJiIgPDwgbmFtZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBvdXQgPDwgImJ5dGUgKHByb3RvY29sLCAmIiA8PCBuYW1lOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICBvdXQgPDwgImkxNiAocHJvdG9jb2wsICYiIDw8IG5hbWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIG91dCA8PCAiaTMyIChwcm90b2NvbCwgJiIgPDwgbmFtZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgb3V0IDw8ICJpNjQgKHByb3RvY29sLCAmIiA8PCBuYW1lOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBvdXQgPDwgImRvdWJsZSAocHJvdG9jb2wsICYiIDw8IG5hbWU7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDIHJlYWRlciBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpICsgbmFtZTsKKyAgICB9CisgICAgb3V0IDw8ICIsIGVycm9yKSkgPCAwKSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiCisgICAgICAgIDw8IGVuZGw7CisKKyAgICAvLyBsb2FkIHRoZSBieXRlIGFycmF5IHdpdGggdGhlIGRhdGEKKyAgICBpZiAodGJhc2UgPT0gdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HICYmIHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIgPSBnX2J5dGVfYXJyYXlfbmV3KCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgImdfYnl0ZV9hcnJheV9hcHBlbmQgKCIgPDwgbmFtZSA8PCAiLCAoZ3VpbnQ4ICopIGRhdGEsIChndWludCkgbGVuKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiZ19mcmVlIChkYXRhKTsiIDw8IGVuZGw7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHN0cmluZyB0ID0gdG1wKCJlY2FzdCIpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZ2ludDMyICIgPDwgdCA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmIiA8PCB0IDw8ICIsIGVycm9yKSkgPCAwKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCBuYW1lIDw8ICIgPSAoIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIikiIDw8IHQgPDwgIjsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgc3RkOjpsb2dpY19lcnJvcigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSBGSUVMRCAnIiArIHRmaWVsZC0+Z2V0X25hbWUoKSArICInIFRZUEUgJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdHlwZV9uYW1lKHR5cGUpKTsKKyAgfQorCisgIC8vIGlmIHRoZSB0eXBlIGlzIG5vdCByZXF1aXJlZCBhbmQgdGhpcyBpcyBhIHRocmlmdCBzdHJ1Y3QgKG5vIHByZWZpeCksCisgIC8vIHNldCB0aGUgaXNzZXQgdmFyaWFibGUuICBpZiB0aGUgdHlwZSBpcyByZXF1aXJlZCwgdGhlbiBzZXQgdGhlCisgIC8vIGxvY2FsIHZhcmlhYmxlIGluZGljYXRpbmcgdGhlIHZhbHVlIHdhcyBzZXQsIHNvIHRoYXQgd2UgY2FuIGRvICAgIC8vIHZhbGlkYXRpb24gbGF0ZXIuCisgIGlmIChwcmVmaXggIT0gIiIgJiYgdGZpZWxkLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiX19pc3NldF8iIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCBzdWZmaXggPDwgIiA9IFRSVUU7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHByZWZpeCAhPSAiIiAmJiB0ZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlzc2V0XyIgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPSBUUlVFOyIgPDwgZW5kbDsKKyAgfQorfQorCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWxsb2NhdGUpIHsKKyAgc3RyaW5nIG5hbWVfdWMgPSB0b191cHBlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3Jlcyh0c3RydWN0LT5nZXRfbmFtZSgpKSk7CisgIGlmICh0c3RydWN0LT5pc194Y2VwdGlvbigpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIvKiBUaGlzIHN0cnVjdCBpcyBhbiBleGNlcHRpb24gKi8iIDw8IGVuZGw7CisgICAgYWxsb2NhdGUgPSB0cnVlOworICB9CisKKyAgaWYgKGFsbG9jYXRlKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoICIgPDwgcHJlZml4IDw8ICIgIT0gTlVMTCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJnX29iamVjdF91bnJlZiAoIiA8PCBwcmVmaXggPDwgIik7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gZ19vYmplY3RfbmV3ICgiIDw8IHRoaXMtPm5zcGFjZV91YworICAgICAgICA8PCAiVFlQRV8iIDw8IG5hbWVfdWMgPDwgIiwgTlVMTCk7IiA8PCBlbmRsOworICB9CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfc3RydWN0X3JlYWQgKFRIUklGVF9TVFJVQ1QgKCIgPDwgcHJlZml4CisgICAgICA8PCAiKSwgcHJvdG9jb2wsIGVycm9yKSkgPCAwKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGlmIChhbGxvY2F0ZSkgeworICAgIGluZGVudChvdXQpIDw8ICJnX29iamVjdF91bnJlZiAoIiA8PCBwcmVmaXggPDwgIik7IiA8PCBlbmRsOworICAgIGlmICh0c3RydWN0LT5pc194Y2VwdGlvbigpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IE5VTEw7IiA8PCBlbmRsOworICAgIH0KKyAgfQorICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0KSB7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZ3VpbnQzMiBzaXplOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZ3VpbnQzMiBpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiVGhyaWZ0VHlwZSBrZXlfdHlwZTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIlRocmlmdFR5cGUgdmFsdWVfdHlwZTsiIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiLyogcmVhZCB0aGUgbWFwIGJlZ2luIG1hcmtlciAqLyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9tYXBfYmVnaW4gKHByb3RvY29sLCAiCisgICAgICAgICAgICIma2V5X3R5cGUsICZ2YWx1ZV90eXBlLCAmc2l6ZSwgZXJyb3IpKSA8IDApIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbDsKKworICAgIC8vIGl0ZXJhdGUgb3ZlciBtYXAgZWxlbWVudHMKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIi8qIGl0ZXJhdGUgdGhyb3VnaCBlYWNoIG9mIHRoZSBtYXAncyBmaWVsZHMgKi8iIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBwcmVmaXgsIGVycm9yX3JldCk7CisgICAgc2NvcGVfZG93bihvdXQpOworICAgIG91dCA8PCBlbmRsOworCisgICAgLy8gcmVhZCBtYXAgZW5kCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIvKiByZWFkIHRoZSBtYXAgZW5kIG1hcmtlciAqLyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9tYXBfZW5kIChwcm90b2NvbCwgIgorICAgICAgICAgICAiZXJyb3IpKSA8IDApIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJndWludDMyIHNpemU7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJndWludDMyIGk7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJUaHJpZnRUeXBlIGVsZW1lbnRfdHlwZTsiIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zZXRfYmVnaW4gKHByb3RvY29sLCAiCisgICAgICAgICAgICImZWxlbWVudF90eXBlLCAmc2l6ZSwgZXJyb3IpKSA8IDApIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbDsKKworICAgIC8vIGl0ZXJhdGUgb3ZlciB0aGUgZWxlbWVudHMKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIi8qIGl0ZXJhdGUgdGhyb3VnaCB0aGUgc2V0IGVsZW1lbnRzICovIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgKytpKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgcHJlZml4LCBlcnJvcl9yZXQpOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKworICAgIC8vIHJlYWQgc2V0IGVuZAorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zZXRfZW5kIChwcm90b2NvbCwgIgorICAgICAgICAgICAiZXJyb3IpKSA8IDApIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJndWludDMyIHNpemU7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJndWludDMyIGk7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJUaHJpZnRUeXBlIGVsZW1lbnRfdHlwZTsiIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9saXN0X2JlZ2luIChwcm90b2NvbCwgIgorICAgICAgICAgICAiJmVsZW1lbnRfdHlwZSwmc2l6ZSwgZXJyb3IpKSA8IDApIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbDsKKworICAgIC8vIGl0ZXJhdGUgb3ZlciB0aGUgZWxlbWVudHMKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIi8qIGl0ZXJhdGUgdGhyb3VnaCBsaXN0IGVsZW1lbnRzICovIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0X2xpc3QqKXR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfcmV0KTsKKyAgICBzY29wZV9kb3duKG91dCk7CisKKyAgICAvLyByZWFkIGxpc3QgZW5kCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2xpc3RfZW5kIChwcm90b2NvbCwgIgorICAgICAgICAgICAiZXJyb3IpKSA8IDApIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7Cit9CisKK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpkZWNsYXJlX2xvY2FsX3ZhcmlhYmxlKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nJiBuYW1lLCBib29sIGZvcl9oYXNoX3RhYmxlKSB7CisgIHN0cmluZyB0bmFtZSA9IHR5cGVfbmFtZSh0dHlwZSk7CisKKyAgLyogSWYgdGhlIGdpdmVuIHR5cGUgaXMgYSB0eXBlZGVmLCBmaW5kIGl0cyB1bmRlcmx5aW5nIHR5cGUgc28gd2UKKyAgICAgY2FuIGNvcnJlY3RseSBkZXRlcm1pbmUgaG93IHRvIGdlbmVyYXRlIGEgcG9pbnRlciB0byBpdCAqLworICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworICBzdHJpbmcgcHRyID0gIWlzX251bWVyaWModHR5cGUpID8gIiIgOiAiKiI7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHRfbWFwKiB0bWFwID0gKHRfbWFwKil0dHlwZTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgdG5hbWUgPDwgcHRyIDw8ICIgIiA8PCBuYW1lIDw8ICIgPSAiCisgICAgICAgIDw8IGdlbmVyYXRlX25ld19oYXNoX2Zyb21fdHlwZSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwgdG1hcC0+Z2V0X3ZhbF90eXBlKCkpIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHRfbGlzdCogdGxpc3QgPSAodF9saXN0Kil0dHlwZTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgdG5hbWUgPDwgcHRyIDw8ICIgIiA8PCBuYW1lIDw8ICIgPSAiCisgICAgICAgIDw8IGdlbmVyYXRlX25ld19hcnJheV9mcm9tX3R5cGUodGxpc3QtPmdldF9lbGVtX3R5cGUoKSkgPDwgZW5kbDsKKyAgfSBlbHNlIGlmIChmb3JfaGFzaF90YWJsZSAmJiB0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IHRuYW1lIDw8ICIgIiA8PCBuYW1lIDw8ICI7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCB0bmFtZSA8PCBwdHIgPDwgIiAiIDw8IG5hbWUKKyAgICAgICAgPDwgKHB0ciAhPSAiIiA/ICIgPSBnX25ldyAoIiArIHRuYW1lICsgIiwgMSkiIDogIiA9IE5VTEwiKSA8PCAiOyIgPDwgZW5kbDsKKyAgfQorfQorCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6ZGVjbG9yZV9sb2NhbF92YXJpYWJsZV9mb3Jfd3JpdGUob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nJiBuYW1lKSB7CisgIHN0cmluZyB0bmFtZSA9IHR5cGVfbmFtZSh0dHlwZSk7CisgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisgIHN0cmluZyBwdHIgPSB0dHlwZS0+aXNfc3RyaW5nKCkgfHwgIXR0eXBlLT5pc19iYXNlX3R5cGUoKSA/ICIgIiA6ICIqICI7CisgIHN0cmluZyBpbml0X3ZhbCA9IHR0eXBlLT5pc19lbnVtKCkgPyAiIiA6ICIgPSBOVUxMIjsKKyAgb3V0IDw8IGluZGVudCgpIDw8IHRuYW1lIDw8IHB0ciA8PCBuYW1lIDw8IGluaXRfdmFsIDw8ICI7IiA8PCBlbmRsOworfQorCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCkgeworICB0X3R5cGUqIHRrZXkgPSB0bWFwLT5nZXRfa2V5X3R5cGUoKTsKKyAgdF90eXBlKiB0dmFsID0gdG1hcC0+Z2V0X3ZhbF90eXBlKCk7CisgIHN0cmluZyBrZXluYW1lID0gdG1wKCJrZXkiKTsKKyAgc3RyaW5nIHZhbG5hbWUgPSB0bXAoInZhbCIpOworCisgIGRlY2xhcmVfbG9jYWxfdmFyaWFibGUob3V0LCB0a2V5LCBrZXluYW1lLCB0cnVlKTsKKyAgZGVjbGFyZV9sb2NhbF92YXJpYWJsZShvdXQsIHR2YWwsIHZhbG5hbWUsIHRydWUpOworCisgIC8qIElmIGVpdGhlciB0aGUga2V5IG9yIHZhbHVlIHR5cGUgaXMgYSB0eXBlZGVmLCBmaW5kIGl0cyB1bmRlcmx5aW5nCisgICAgIHR5cGUgc28gd2UgY2FuIGNvcnJlY3RseSBkZXRlcm1pbmUgaG93IHRvIGdlbmVyYXRlIGEgcG9pbnRlciB0bworICAgICBpdCAqLworICB0a2V5ID0gZ2V0X3RydWVfdHlwZSh0a2V5KTsKKyAgdHZhbCA9IGdldF90cnVlX3R5cGUodHZhbCk7CisKKyAgc3RyaW5nIHRrZXlfcHRyID0gdGtleS0+aXNfc3RyaW5nKCkgfHwgIXRrZXktPmlzX2Jhc2VfdHlwZSgpID8gIiIgOiAiKiI7CisgIHN0cmluZyB0dmFsX3B0ciA9IHR2YWwtPmlzX3N0cmluZygpIHx8ICF0dmFsLT5pc19iYXNlX3R5cGUoKSA/ICIiIDogIioiOworCisgIC8vIGRlc2VyaWFsaXplIHRoZSBmaWVsZHMgb2YgdGhlIG1hcCBlbGVtZW50CisgIHRfZmllbGQgZmtleSh0a2V5LCB0a2V5X3B0ciArIGtleW5hbWUpOworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5LCAiIiwgIiIsIGVycm9yX3JldCk7CisgIHRfZmllbGQgZnZhbCh0dmFsLCB0dmFsX3B0ciArIHZhbG5hbWUpOworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsLCAiIiwgIiIsIGVycm9yX3JldCk7CisKKyAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IHByZWZpeCA8PCAiICYmICIgPDwga2V5bmFtZSA8PCAiKSIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJnX2hhc2hfdGFibGVfaW5zZXJ0ICgoR0hhc2hUYWJsZSAqKSIgPDwgcHJlZml4IDw8ICIsIChncG9pbnRlcikgIiA8PCBrZXluYW1lCisgICAgICAgICAgICAgIDw8ICIsIChncG9pbnRlcikgIiA8PCB2YWxuYW1lIDw8ICIpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKK30KKwordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQpIHsKKyAgdF90eXBlKiB0ZWxlbSA9IHRzZXQtPmdldF9lbGVtX3R5cGUoKTsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgIHN0cmluZyB0ZWxlbV9wdHIgPSB0ZWxlbS0+aXNfc3RyaW5nKCkgfHwgIXRlbGVtLT5pc19iYXNlX3R5cGUoKSA/ICIiIDogIioiOworCisgIGRlY2xhcmVfbG9jYWxfdmFyaWFibGUob3V0LCB0ZWxlbSwgZWxlbSwgdHJ1ZSk7CisKKyAgdF9maWVsZCBmZWxlbSh0ZWxlbSwgdGVsZW1fcHRyICsgZWxlbSk7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtLCAiIiwgIiIsIGVycm9yX3JldCk7CisKKyAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IHByZWZpeCA8PCAiICYmICIgPDwgZWxlbSA8PCAiKSIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJnX2hhc2hfdGFibGVfaW5zZXJ0ICgoR0hhc2hUYWJsZSAqKSAiIDw8IHByZWZpeCA8PCAiLCAoZ3BvaW50ZXIpICIgPDwgZWxlbQorICAgICAgICAgICAgICA8PCAiLCAoZ3BvaW50ZXIpICIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7Cit9CisKK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQpIHsKKyAgKHZvaWQpaW5kZXg7CisgIHRfdHlwZSogdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRsaXN0LT5nZXRfZWxlbV90eXBlKCkpOworICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgc3RyaW5nIHRlbGVtX3B0ciA9ICFpc19udW1lcmljKHR0eXBlKSA/ICIiIDogIioiOworCisgIGRlY2xhcmVfbG9jYWxfdmFyaWFibGUob3V0LCB0dHlwZSwgZWxlbSwgZmFsc2UpOworCisgIHRfZmllbGQgZmVsZW0odHR5cGUsIHRlbGVtX3B0ciArIGVsZW0pOworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSwgIiIsICIiLCBlcnJvcl9yZXQpOworCisgIGlmICh0dHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJjb21waWxlciBlcnJvcjogbGlzdCBlbGVtZW50IHR5cGUgY2Fubm90IGJlIHZvaWQiKTsKKyAgfSBlbHNlIGlmIChpc19udW1lcmljKHR0eXBlKSkgeworICAgIGluZGVudChvdXQpIDw8ICJnX2FycmF5X2FwcGVuZF92YWxzICgiIDw8IHByZWZpeCA8PCAiLCAiIDw8IGVsZW0gPDwgIiwgMSk7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJnX3B0cl9hcnJheV9hZGQgKCIgPDwgcHJlZml4IDw8ICIsICIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7CisgIH0KK30KKworc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnJlZV9mdW5jX2Zyb21fdHlwZSh0X3R5cGUqIHR0eXBlKSB7CisgIGlmICh0dHlwZSA9PSBOVUxMKQorICAgIHJldHVybiAiTlVMTCI7CisKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IGRldGVybWluZSBoYXNoIHR5cGUiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gImdfZnJlZSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5pc19iaW5hcnkoKSkgeworICAgICAgICByZXR1cm4gInRocmlmdF9zdHJpbmdfZnJlZSI7CisgICAgICB9CisgICAgICByZXR1cm4gImdfZnJlZSI7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gaGFzaCB0YWJsZSBpbmZvIGZvciB0eXBlIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiTlVMTCI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpIHx8IHR0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiKEdEZXN0cm95Tm90aWZ5KSB0aHJpZnRfc2FmZV9oYXNoX3RhYmxlX2Rlc3Ryb3kiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSkgeworICAgIHJldHVybiAiZ19vYmplY3RfdW5yZWYiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlID0gKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIGlmIChldHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKilldHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IGRldGVybWluZSBhcnJheSB0eXBlIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIHJldHVybiAiKEdEZXN0cm95Tm90aWZ5KSBnX2FycmF5X3VucmVmIjsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICByZXR1cm4gIihHRGVzdHJveU5vdGlmeSkgZ19wdHJfYXJyYXlfdW5yZWYiOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBhcnJheSBpbmZvIGZvciB0eXBlIjsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGV0eXBlLT5pc19jb250YWluZXIoKSB8fCBldHlwZS0+aXNfc3RydWN0KCkpIHsKKyAgICAgIHJldHVybiAiKEdEZXN0cm95Tm90aWZ5KSBnX3B0cl9hcnJheV91bnJlZiI7CisgICAgICA7CisgICAgfSBlbHNlIGlmIChldHlwZS0+aXNfZW51bSgpKSB7CisgICAgICByZXR1cm4gIihHRGVzdHJveU5vdGlmeSkgZ19hcnJheV91bnJlZiI7CisgICAgfQorICAgIHByaW50ZigiVHlwZSBub3QgZXhwZWN0ZWQgaW5zaWRlIHRoZSBhcnJheTogJXNcbiIsIGV0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICAgIHRocm93ICJUeXBlIG5vdCBleHBlY3RlZCBpbnNpZGUgYXJyYXkiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICByZXR1cm4gZ2VuZXJhdGVfZnJlZV9mdW5jX2Zyb21fdHlwZSgoKHRfdHlwZWRlZiopdHR5cGUpLT5nZXRfdHlwZSgpKTsKKyAgfQorICBwcmludGYoIlR5cGUgbm90IGV4cGVjdGVkOiAlc1xuIiwgdHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7CisgIHRocm93ICJUeXBlIG5vdCBleHBlY3RlZCI7Cit9CisKK3N0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2hhc2hfZnVuY19mcm9tX3R5cGUodF90eXBlKiB0dHlwZSkgeworICBpZiAodHR5cGUgPT0gTlVMTCkKKyAgICByZXR1cm4gIk5VTEwiOworCisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBkZXRlcm1pbmUgaGFzaCB0eXBlIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAidGhyaWZ0X2Jvb2xlYW5faGFzaCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAidGhyaWZ0X2ludDhfaGFzaCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gInRocmlmdF9pbnQxNl9oYXNoIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiZ19pbnRfaGFzaCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gImdfaW50NjRfaGFzaCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gImdfZG91YmxlX2hhc2giOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJnX3N0cl9oYXNoIjsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBoYXNoIHRhYmxlIGluZm8gZm9yIHR5cGUiOworICAgIH0KKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJnX2RpcmVjdF9oYXNoIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpKSB7CisgICAgcmV0dXJuICJnX2RpcmVjdF9oYXNoIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgcmV0dXJuIGdlbmVyYXRlX2hhc2hfZnVuY19mcm9tX3R5cGUoKCh0X3R5cGVkZWYqKXR0eXBlKS0+Z2V0X3R5cGUoKSk7CisgIH0KKyAgcHJpbnRmKCJUeXBlIG5vdCBleHBlY3RlZDogJXNcbiIsIHR0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICB0aHJvdyAiVHlwZSBub3QgZXhwZWN0ZWQiOworfQorCitzdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jbXBfZnVuY19mcm9tX3R5cGUodF90eXBlKiB0dHlwZSkgeworICBpZiAodHR5cGUgPT0gTlVMTCkKKyAgICByZXR1cm4gIk5VTEwiOworCisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBkZXRlcm1pbmUgaGFzaCB0eXBlIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAidGhyaWZ0X2Jvb2xlYW5fZXF1YWwiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gInRocmlmdF9pbnQ4X2VxdWFsIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAidGhyaWZ0X2ludDE2X2VxdWFsIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiZ19pbnRfZXF1YWwiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJnX2ludDY0X2VxdWFsIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiZ19kb3VibGVfZXF1YWwiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJnX3N0cl9lcXVhbCI7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gaGFzaCB0YWJsZSBpbmZvIGZvciB0eXBlIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiZ19kaXJlY3RfZXF1YWwiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSB8fCB0dHlwZS0+aXNfc3RydWN0KCkpIHsKKyAgICByZXR1cm4gImdfZGlyZWN0X2VxdWFsIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgcmV0dXJuIGdlbmVyYXRlX2NtcF9mdW5jX2Zyb21fdHlwZSgoKHRfdHlwZWRlZiopdHR5cGUpLT5nZXRfdHlwZSgpKTsKKyAgfQorICBwcmludGYoIlR5cGUgbm90IGV4cGVjdGVkOiAlc1xuIiwgdHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7CisgIHRocm93ICJUeXBlIG5vdCBleHBlY3RlZCI7Cit9CisKK3N0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX25ld19oYXNoX2Zyb21fdHlwZSh0X3R5cGUqIGtleSwgdF90eXBlKiB2YWx1ZSkgeworICBzdHJpbmcgaGFzaF9mdW5jID0gZ2VuZXJhdGVfaGFzaF9mdW5jX2Zyb21fdHlwZShrZXkpOworICBzdHJpbmcgY21wX2Z1bmMgPSBnZW5lcmF0ZV9jbXBfZnVuY19mcm9tX3R5cGUoa2V5KTsKKyAgc3RyaW5nIGtleV9mcmVlX2Z1bmMgPSBnZW5lcmF0ZV9mcmVlX2Z1bmNfZnJvbV90eXBlKGtleSk7CisgIHN0cmluZyB2YWx1ZV9mcmVlX2Z1bmMgPSBnZW5lcmF0ZV9mcmVlX2Z1bmNfZnJvbV90eXBlKHZhbHVlKTsKKworICByZXR1cm4gImdfaGFzaF90YWJsZV9uZXdfZnVsbCAoIiArIGhhc2hfZnVuYyArICIsICIgKyBjbXBfZnVuYyArICIsICIgKyBrZXlfZnJlZV9mdW5jICsgIiwgIgorICAgICAgICAgKyB2YWx1ZV9mcmVlX2Z1bmMgKyAiKTsiOworfQorCitzdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXdfYXJyYXlfZnJvbV90eXBlKHRfdHlwZSogdHR5cGUpIHsKKyAgaWYgKHR0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoImNvbXBpbGVyIGVycm9yOiBjYW5ub3QgZGV0ZXJtaW5lIGFycmF5IHR5cGUiKTsKKyAgfSBlbHNlIGlmIChpc19udW1lcmljKHR0eXBlKSkgeworICAgIHJldHVybiAiZ19hcnJheV9uZXcgKDAsIDEsIHNpemVvZiAoIiArIGJhc2VfdHlwZV9uYW1lKHR0eXBlKSArICIpKTsiOworICB9IGVsc2UgeworICAgIHN0cmluZyBmcmVlX2Z1bmMgPSBnZW5lcmF0ZV9mcmVlX2Z1bmNfZnJvbV90eXBlKHR0eXBlKTsKKyAgICByZXR1cm4gImdfcHRyX2FycmF5X25ld193aXRoX2ZyZWVfZnVuYyAoIiArIGZyZWVfZnVuYyArICIpOyI7CisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVVRJTElUWSBGVU5DVElPTlMgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBVcHBlciBjYXNlIGEgc3RyaW5nLiAgV3JhcHMgYm9vc3QncyBzdHJpbmcgdXRpbGl0eS4KKyAqLworc3RyaW5nIHRvX3VwcGVyX2Nhc2Uoc3RyaW5nIG5hbWUpIHsKKyAgc3RyaW5nIHMobmFtZSk7CisgIHN0ZDo6dHJhbnNmb3JtKHMuYmVnaW4oKSwgcy5lbmQoKSwgcy5iZWdpbigpLCA6OnRvdXBwZXIpOworICByZXR1cm4gczsKKyAgLy8gIHJldHVybiBib29zdDo6dG9fdXBwZXJfY29weSAobmFtZSk7Cit9CisKKy8qKgorICogTG93ZXIgY2FzZSBhIHN0cmluZy4gIFdyYXBzIGJvb3N0J3Mgc3RyaW5nIHV0aWxpdHkuCisgKi8KK3N0cmluZyB0b19sb3dlcl9jYXNlKHN0cmluZyBuYW1lKSB7CisgIHN0cmluZyBzKG5hbWUpOworICBzdGQ6OnRyYW5zZm9ybShzLmJlZ2luKCksIHMuZW5kKCksIHMuYmVnaW4oKSwgOjp0b2xvd2VyKTsKKyAgcmV0dXJuIHM7CisgIC8vICByZXR1cm4gYm9vc3Q6OnRvX2xvd2VyX2NvcHkgKG5hbWUpOworfQorCisvKioKKyAqIE1ha2VzIGEgc3RyaW5nIGZyaWVuZGx5IHRvIEMgY29kZSBzdGFuZGFyZHMgYnkgbG93ZXJjYXNpbmcgYW5kIGFkZGluZworICogdW5kZXJzY29yZXMsIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyLiAgRm9yIGV4YW1wbGU6CisgKgorICogSW5wdXQ6ICJab21nQ2FtZWxDYXNlIgorICogT3V0cHV0OiAiem9tZ19jYW1lbF9jYXNlIgorICovCitzdHJpbmcgaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHN0cmluZyBuYW1lKSB7CisgIHN0cmluZyByZXQ7CisgIGNvbnN0IGNoYXIqIHRtcCA9IG5hbWUuY19zdHIoKTsKKyAgaW50IHBvcyA9IDA7CisKKyAgLyogdGhlIGZpcnN0IGNoYXJhY3RlciBpc24ndCB1bmRlcnNjb3JlZCBpZiB1cHBlcmNhc2UsIGp1c3QgbG93ZXJjYXNlZCAqLworICByZXQgKz0gdG9sb3dlcih0bXBbcG9zXSk7CisgIHBvcysrOworICBmb3IgKHVuc2lnbmVkIGludCBpID0gcG9zOyBpIDwgbmFtZS5sZW5ndGgoKTsgaSsrKSB7CisgICAgY2hhciBsYyA9IHRvbG93ZXIodG1wW2ldKTsKKyAgICBpZiAobGMgIT0gdG1wW2ldKSB7CisgICAgICByZXQgKz0gJ18nOworICAgIH0KKyAgICByZXQgKz0gbGM7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCisvKioKKyAqIFBlcmZvcm1zIHRoZSByZXZlcnNlIG9wZXJhdGlvbiBvZiBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXM6IFRoZSBmaXJzdAorICogY2hhcmFjdGVyIG9mIHRoZSBzdHJpbmcgaXMgbWFkZSB1cHBlcmNhc2UsIGFsb25nIHdpdGggZWFjaCBjaGFyYWN0ZXIgdGhhdAorICogZm9sbG93cyBhbiB1bmRlcnNjb3JlICh3aGljaCBpcyByZW1vdmVkKS4gVXNlZnVsIGZvciBjb252ZXJ0aW5nIFRocmlmdAorICogc2VydmljZS1tZXRob2QgbmFtZXMgaW50byBHT2JqZWN0LXN0eWxlIGNsYXNzIG5hbWVzLgorICoKKyAqIElucHV0OiAiem9tZ19jYW1lbF9jYXNlIgorICogT3V0cHV0OiAiWm9tZ0NhbWVsQ2FzZSIKKyAqLworc3RyaW5nIHVuZGVyc2NvcmVzX3RvX2luaXRpYWxfY2FwcyhzdHJpbmcgbmFtZSkgeworICBzdHJpbmcgcmV0OworICBjb25zdCBjaGFyKiB0bXAgPSBuYW1lLmNfc3RyKCk7CisgIGJvb2wgdXBwZXJjYXNlX25leHQgPSB0cnVlOworCisgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgbmFtZS5sZW5ndGgoKTsgaSsrKSB7CisgICAgY2hhciBjID0gdG1wW2ldOworICAgIGlmIChjID09ICdfJykgeworICAgICAgdXBwZXJjYXNlX25leHQgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICBpZiAodXBwZXJjYXNlX25leHQpIHsKKyAgICAgICAgcmV0ICs9IHRvdXBwZXIoYyk7CisgICAgICAgIHVwcGVyY2FzZV9uZXh0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXQgKz0gYzsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gcmV0OworfQorCisvKiByZWdpc3RlciB0aGlzIGdlbmVyYXRvciB3aXRoIHRoZSBtYWluIHByb2dyYW0gKi8KK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoY19nbGliLCAiQywgdXNpbmcgR0xpYiIsICIiKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9jbF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NsX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjhkMGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9jbF9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSw1NTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtIFBhdHJpY2sgQ29sbGlzb24gPHBhdHJpY2tAY29sbGlzb24uaWU+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtIEZhY2Vib29rCisgKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxib29zdC90b2tlbml6ZXIuaHBwPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidF9vb3BfZ2VuZXJhdG9yLmgiCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCisKKy8qKgorICogQ29tbW9uIExpc3AgY29kZSBnZW5lcmF0b3IuCisgKgorICogQGF1dGhvciBQYXRyaWNrIENvbGxpc29uIDxwYXRyaWNrQGNvbGxpc29uLmllPgorICovCitjbGFzcyB0X2NsX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgdF9jbF9nZW5lcmF0b3IoCisgICAgICB0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pCisgIHsKKyAgICBub19hc2QgPSBmYWxzZTsKKyAgICBzeXN0ZW1fcHJlZml4ID0gInRocmlmdC1nZW4tIjsKKworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICBmb3IoaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgeworICAgICAgaWYoaXRlci0+Zmlyc3QuY29tcGFyZSgibm9fYXNkIikgPT0gMCkgeworICAgICAgICBub19hc2QgPSB0cnVlOworICAgICAgfSBlbHNlIGlmIChpdGVyLT5maXJzdC5jb21wYXJlKCJzeXNfcHJlZiIpID09IDApIHsKKwlzeXN0ZW1fcHJlZml4ID0gaXRlci0+c2Vjb25kOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIGNsOiIgKyBpdGVyLT5maXJzdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1jbCI7CisgICAgY29weV9vcHRpb25zXyA9IG9wdGlvbl9zdHJpbmc7CisgIH0KKworICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7CisgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7CisKKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmICAgICAodF90eXBlZGVmKiAgdHR5cGVkZWYpOworICB2b2lkIGdlbmVyYXRlX2VudW0gICAgICAgICh0X2VudW0qICAgICB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfY29uc3QgICAgICAgKHRfY29uc3QqICAgIHRjb25zdCk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0ICAgICAgKHRfc3RydWN0KiAgIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uICAgICh0X3N0cnVjdCogICB0eGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UgICAgICh0X3NlcnZpY2UqICB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfY2xfc3RydWN0IChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9jbF9zdHJ1Y3RfaW50ZXJuYWwgKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX2V4Y2VwdGlvbl9zaWcoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIGYpOworICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisKKyAgc3RkOjpzdHJpbmcgY2xfYXV0b2dlbl9jb21tZW50KCk7CisgIHZvaWQgYXNkZl9kZWYoc3RkOjpvc3RyZWFtICZvdXQpOworICB2b2lkIHBhY2thZ2VfZGVmKHN0ZDo6b3N0cmVhbSAmb3V0KTsKKyAgdm9pZCBwYWNrYWdlX2luKHN0ZDo6b3N0cmVhbSAmb3V0KTsKKyAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVkX3BhY2thZ2UoKTsKKyAgc3RkOjpzdHJpbmcgcHJlZml4KHN0ZDo6c3RyaW5nIG5hbWUpOworICBzdGQ6OnN0cmluZyBwYWNrYWdlX29mKHRfcHJvZ3JhbSogcHJvZ3JhbSk7CisgIHN0ZDo6c3RyaW5nIHBhY2thZ2UoKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2luY2x1ZGVzKCk7CisKKyAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyB0eXBlc3BlYyAodF90eXBlICp0KTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIHN0ZDo6c3RyaW5nIGNsX2RvY3N0cmluZyhzdGQ6OnN0cmluZyByYXcpOworCisgcHJpdmF0ZToKKworICBpbnQgdGVtcG9yYXJ5X3ZhcjsKKyAgLyoqCisgICAqIElzb2xhdGUgdGhlIHZhcmlhYmxlIGRlZmluaXRpb25zLCBhcyB0aGV5IGNhbiByZXF1aXJlIHN0cnVjdHVyZSBkZWZpbml0aW9ucworICAgKi8KKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2FzZF87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl90eXBlc187CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl92YXJzXzsKKworICBzdGQ6OnN0cmluZyBjb3B5X29wdGlvbnNfOworCisgIGJvb2wgbm9fYXNkOworICBzdGQ6OnN0cmluZyBzeXN0ZW1fcHJlZml4OworfTsKKworCit2b2lkIHRfY2xfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKKyAgc3RyaW5nIHByb2dyYW1fZGlyID0gZ2V0X291dF9kaXIoKSArICIvIiArIHByb2dyYW1fbmFtZV87CisgIE1LRElSKHByb2dyYW1fZGlyLmNfc3RyKCkpOworCisgIHRlbXBvcmFyeV92YXIgPSAwOworCisgIHN0cmluZyBmX3R5cGVzX25hbWUgPSBwcm9ncmFtX2RpciArICIvIiArIHByb2dyYW1fbmFtZV8gKyAiLXR5cGVzLmxpc3AiOworICBzdHJpbmcgZl92YXJzX25hbWUgPSBwcm9ncmFtX2RpciArICIvIiArIHByb2dyYW1fbmFtZV8gKyAiLXZhcnMubGlzcCI7CisKKyAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7CisgIGZfdHlwZXNfIDw8IGNsX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7CisgIGZfdmFyc18ub3BlbihmX3ZhcnNfbmFtZS5jX3N0cigpKTsKKyAgZl92YXJzXyA8PCBjbF9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOworCisgIHBhY2thZ2VfZGVmKGZfdHlwZXNfKTsKKyAgcGFja2FnZV9pbihmX3R5cGVzXyk7CisgIHBhY2thZ2VfaW4oZl92YXJzXyk7CisKKyAgaWYgKCFub19hc2QpIHsKKyAgICBzdHJpbmcgZl9hc2RfbmFtZSA9IHByb2dyYW1fZGlyICsgIi8iICsgc3lzdGVtX3ByZWZpeCArIHByb2dyYW1fbmFtZV8gKyAiLmFzZCI7CisgICAgZl9hc2RfLm9wZW4oZl9hc2RfbmFtZS5jX3N0cigpKTsKKyAgICBmX2FzZF8gPDwgY2xfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKKyAgICBhc2RmX2RlZihmX2FzZF8pOworICB9Cit9CisKKy8qKgorICogUmVuZGVycyBhbGwgdGhlIGltcG9ydHMgbmVjZXNzYXJ5IGZvciBpbmNsdWRpbmcgYW5vdGhlciBUaHJpZnQgcHJvZ3JhbQorICovCitzdHJpbmcgdF9jbF9nZW5lcmF0b3I6OnJlbmRlcl9pbmNsdWRlcygpIHsKKyAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworICByZXN1bHQgKz0gIjpkZXBlbmRzLW9uICg6dGhyaWZ0IjsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgeworICAgIHJlc3VsdCArPSAiIDoiICsgc3lzdGVtX3ByZWZpeCArIHVuZGVyc2NvcmUoaW5jbHVkZXNbaV0tPmdldF9uYW1lKCkpOworICB9CisgIHJlc3VsdCArPSAiKVxuIjsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RyaW5nIHRfY2xfZ2VuZXJhdG9yOjpwYWNrYWdlX29mKHRfcHJvZ3JhbSogcHJvZ3JhbSkgeworICBzdHJpbmcgcHJlZml4ID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiY2wiKTsKKyAgcmV0dXJuIHByZWZpeC5lbXB0eSgpID8gInRocmlmdC1nZW5lcmF0ZWQiIDogcHJlZml4OworfQorCitzdHJpbmcgdF9jbF9nZW5lcmF0b3I6OnBhY2thZ2UoKSB7CisgIHJldHVybiBwYWNrYWdlX29mKHByb2dyYW1fKTsKK30KKworc3RyaW5nIHRfY2xfZ2VuZXJhdG9yOjpwcmVmaXgoc3RyaW5nIHN5bWJvbCkgeworICByZXR1cm4gIlwiIiArIHN5bWJvbCArICJcIiI7Cit9CisKK3N0cmluZyB0X2NsX2dlbmVyYXRvcjo6Y2xfYXV0b2dlbl9jb21tZW50KCkgeworICByZXR1cm4KKyAgICBzdGQ6OnN0cmluZygiOzs7ICIpICsgIkF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0XG4iICsKKyAgICAiOzs7IERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkdcbiIgKworICAgICI7Ozsgb3B0aW9ucyBzdHJpbmc6ICIgKyBjb3B5X29wdGlvbnNfICsgIlxuIjsKK30KKworc3RyaW5nIHRfY2xfZ2VuZXJhdG9yOjpjbF9kb2NzdHJpbmcoc3RyaW5nIHJhdykgeworICByZXBsYWNlKHJhdy5iZWdpbigpLCByYXcuZW5kKCksICciJywgJ1wnJyk7CisgIHJldHVybiByYXc7Cit9CisKKwordm9pZCB0X2NsX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworICBmX2FzZF8uY2xvc2UoKTsKKyAgZl90eXBlc18uY2xvc2UoKTsKKyAgZl92YXJzXy5jbG9zZSgpOworfQorCitzdHJpbmcgdF9jbF9nZW5lcmF0b3I6OmdlbmVyYXRlZF9wYWNrYWdlKCkgeworICByZXR1cm4gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoImNwcCIpOworfQorCit2b2lkIHRfY2xfZ2VuZXJhdG9yOjphc2RmX2RlZihzdGQ6Om9zdHJlYW0gJm91dCkgeworICBvdXQgPDwgIihhc2RmOmRlZnN5c3RlbSAjOiIgPDwgc3lzdGVtX3ByZWZpeCA8PCBwcm9ncmFtX25hbWVfIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgcmVuZGVyX2luY2x1ZGVzKCkKKyAgICAgIDw8IGluZGVudCgpIDw8ICI6c2VyaWFsIHQiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICI6Y29tcG9uZW50cyAoIgorICAgICAgPDwgIig6ZmlsZSBcIiIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiLXR5cGVzXCIpICIKKyAgICAgIDw8ICIoOmZpbGUgXCIiIDw8IHByb2dyYW1fbmFtZV8gPDwgIi12YXJzXCIpKSkiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7Cit9CisKKy8qKioKKyAqIEdlbmVyYXRlIGEgcGFja2FnZSBkZWZpbml0aW9uLiBBZGQgdXNlIHJlZmVyZW5jZXMgZXF1aXZhbGVudCB0byB0aGUgaWRsIGZpbGUncyBpbmNsdWRlIHN0YXRlbWVudHMuCisgKi8KK3ZvaWQgdF9jbF9nZW5lcmF0b3I6OnBhY2thZ2VfZGVmKHN0ZDo6b3N0cmVhbSAmb3V0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7CisKKyAgb3V0IDw8ICIodGhyaWZ0OmRlZi1wYWNrYWdlIDoiIDw8IHBhY2thZ2UoKTsKKyAgaWYgKCBpbmNsdWRlcy5zaXplKCkgPiAwICkgeworICAgIG91dCA8PCAiIDp1c2UgKCI7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgeworICAgICAgb3V0IDw8ICIgOiIgPDwgaW5jbHVkZXNbaV0tPmdldF9uYW1lKCk7CisgICAgfQorICAgIG91dCA8PCAiKSI7CisgIH0KKyAgb3V0IDw8ICIpIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jbF9nZW5lcmF0b3I6OnBhY2thZ2VfaW4oc3RkOjpvc3RyZWFtICZvdXQpIHsKKyAgb3V0IDw8ICIoY2w6aW4tcGFja2FnZSA6IiA8PCBwYWNrYWdlKCkgPDwgIikiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBUaGlzIGlzIG5vdCBkb25lIGluIENvbW1vbiBMaXNwLCB0eXBlcyBhcmUgYWxsIGltcGxpY2l0LgorICoKKyAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9jbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICAodm9pZCl0dHlwZWRlZjsKK30KKwordm9pZCB0X2NsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIGZfdHlwZXNfIDw8ICIodGhyaWZ0OmRlZi1lbnVtICIgPDwgcHJlZml4KHRlbnVtLT5nZXRfbmFtZSgpKSA8PCBlbmRsOworCisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgaW50IHZhbHVlID0gLTE7CisKKyAgaW5kZW50X3VwKCk7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIoIjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisKKyAgICBpZihjX2l0ZXIgIT0gY29uc3RhbnRzLmJlZ2luKCkpIGZfdHlwZXNfIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAiOworCisgICAgZl90eXBlc18gPDwgIihcIiIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiAuICIgPDwgdmFsdWUgPDwgIikiOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGZfdHlwZXNfIDw8ICIpKSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlIGEgY29uc3RhbnQgdmFsdWUKKyAqLwordm9pZCB0X2NsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7CisgIHRfdHlwZSogdHlwZSA9IHRjb25zdC0+Z2V0X3R5cGUoKTsKKyAgc3RyaW5nIG5hbWUgPSB0Y29uc3QtPmdldF9uYW1lKCk7CisgIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gdGNvbnN0LT5nZXRfdmFsdWUoKTsKKworICBmX3ZhcnNfIDw8ICIodGhyaWZ0OmRlZi1jb25zdGFudCAiIDw8IHByZWZpeChuYW1lKSA8PCAiICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlKSA8PCAiKSIKKyAgICAgICAgICA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCisgKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQorICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKKyAqLworc3RyaW5nIHRfY2xfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIG91dCA8PCAiXCIiIDw8IHZhbHVlLT5nZXRfc3RyaW5nKCkgPDwgIlwiIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIG91dCA8PCAodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwID8gInQiIDogIm5pbCIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIGluZGVudChvdXQpIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBvdXQgPDwgKHR5cGUtPmlzX3N0cnVjdCgpID8gIihtYWtlLWluc3RhbmNlICciIDogIihtYWtlLWV4Y2VwdGlvbiAnIikgPDwKKyAgICAgICAgICAgbG93ZXJjYXNlKHR5cGUtPmdldF9uYW1lKCkpIDw8ICIgIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7CisgICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOworICAgICAgfQorCisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIjoiIDw8IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSA8PCAiICIgPDwKKyAgICAgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKSA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIikiOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIC8vIGVtaXQgYW4gaGFzaCBmb3JtIHdpdGggYm90aCBrZXlzIGFuZCB2YWx1ZXMgdG8gYmUgZXZhbHVhdGVkCisgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworICAgIG91dCA8PCAiKHRocmlmdDptYXAgIjsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICIoY2w6Y29ucyAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgdl9pdGVyLT5maXJzdCkgPDwgIiAiCisgICAgICAgICAgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHZ0eXBlLCB2X2l0ZXItPnNlY29uZCkgPDwgIikiOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiKSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF90eXBlKiBldHlwZTsKKyAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0gZWxzZSB7CisgICAgICBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfQorICAgIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgICAgb3V0IDw8ICIodGhyaWZ0OnNldCIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICIodGhyaWZ0Omxpc3QiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF91cCgpOworICAgIGluZGVudF91cCgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlcikgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIpIjsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudF9kb3duKCk7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBDT05TVEFOVCBGT1IgVFlQRTogIiArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKyAgcmV0dXJuIG91dC5zdHIoKTsKK30KKwordm9pZCB0X2NsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGdlbmVyYXRlX2NsX3N0cnVjdChmX3R5cGVzXywgdHN0cnVjdCwgZmFsc2UpOworfQorCit2b2lkIHRfY2xfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX2NsX3N0cnVjdChmX3R5cGVzXywgdHhjZXB0aW9uLCB0cnVlKTsKK30KKwordm9pZCB0X2NsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY2xfc3RydWN0X2ludGVybmFsKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKKyAgKHZvaWQpaXNfZXhjZXB0aW9uOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIG91dCA8PCAiKCI7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gKCptX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICB0X3R5cGUqIHR5cGUgPSAoKm1faXRlciktPmdldF90eXBlKCk7CisKKyAgICBpZiAobV9pdGVyICE9IG1lbWJlcnMuYmVnaW4oKSkgeworICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAiOworICAgIH0KKyAgICBvdXQgPDwgIigiIDw8IHByZWZpeCgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8ICIgIiA8PAorICAgICAgICAoIChOVUxMICE9IHZhbHVlKSA/IHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB2YWx1ZSkgOiAibmlsIiApIDw8CisgICAgICAgICIgOmlkICIgPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCk7CisgICAgaWYgKCB0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAic3RyaW5nIiA9PSB0eXBlc3BlYyh0eXBlKSApCisgICAgICBpZiAoICgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSApCisgICAgICAgIG91dCA8PCAiIDp0eXBlIGJpbmFyeSI7CisgICAgICBlbHNlCisgICAgICAgIG91dCA8PCAiIDp0eXBlIHN0cmluZyI7CisgICAgZWxzZQorICAgICAgb3V0IDw8ICIgOnR5cGUgIiA8PCB0eXBlc3BlYyh0eXBlKTsKKyAgICBpZiAoICgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwgKSB7CisgICAgICBvdXQgPDwgIiA6b3B0aW9uYWwgdCI7CisgICAgfQorICAgIGlmICggKCptX2l0ZXIpLT5oYXNfZG9jKCkpIHsKKyAgICAgIG91dCA8PCAiIDpkb2N1bWVudGF0aW9uIFwiIiA8PCBjbF9kb2NzdHJpbmcoKCptX2l0ZXIpLT5nZXRfZG9jKCkpIDw8ICJcIiI7CisgICAgfQorICAgIG91dCA8PCIpIjsKKyAgfQorCisgIG91dCA8PCAiKSI7Cit9CisKK3ZvaWQgdF9jbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NsX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uID0gZmFsc2UpIHsKKyAgc3RkOjpzdHJpbmcgbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKKyAgb3V0IDw8IChpc19leGNlcHRpb24gPyAiKHRocmlmdDpkZWYtZXhjZXB0aW9uICIgOiAiKHRocmlmdDpkZWYtc3RydWN0ICIpIDw8CisgICAgICBwcmVmaXgobmFtZSkgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGlmICggdHN0cnVjdC0+aGFzX2RvYygpICkgeworICAgIG91dCA8PCBpbmRlbnQoKSA7CisgICAgb3V0IDw8ICJcIiIgPDwgY2xfZG9jc3RyaW5nKHRzdHJ1Y3QtPmdldF9kb2MoKSkgPDwgIlwiIiA8PCBlbmRsOworICB9CisgIG91dCA8PCBpbmRlbnQoKSA7CisgIGdlbmVyYXRlX2NsX3N0cnVjdF9pbnRlcm5hbChvdXQsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7CisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCAiKSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfY2xfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9leGNlcHRpb25fc2lnKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiBmKSB7CisgIGdlbmVyYXRlX2NsX3N0cnVjdF9pbnRlcm5hbChvdXQsIGYtPmdldF94Y2VwdGlvbnMoKSwgdHJ1ZSk7Cit9CisKK3ZvaWQgdF9jbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kc19jbGllbnQ7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kc19jbGllbnQgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICB9CisKKyAgZXh0ZW5kc19jbGllbnQgPSBleHRlbmRzX2NsaWVudC5lbXB0eSgpID8gIm5pbCIgOiBwcmVmaXgoZXh0ZW5kc19jbGllbnQpOworCisgIGZfdHlwZXNfIDw8ICIodGhyaWZ0OmRlZi1zZXJ2aWNlICIgPDwgcHJlZml4KHNlcnZpY2VfbmFtZV8pIDw8ICIgIgorICAgICAgICAgICA8PCBleHRlbmRzX2NsaWVudDsKKworICBpbmRlbnRfdXAoKTsKKworICBpZiAoIHRzZXJ2aWNlLT5oYXNfZG9jKCkpIHsKKyAgICAgIGZfdHlwZXNfIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICIoOmRvY3VtZW50YXRpb24gXCIiIDw8IGNsX2RvY3N0cmluZyh0c2VydmljZS0+Z2V0X2RvYygpKSA8PCAiXCIpIjsKKyAgICB9CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2Z1bmN0aW9uKiBmdW5jdGlvbiA9ICpmX2l0ZXI7CisgICAgc3RyaW5nIGZuYW1lID0gZnVuY3Rpb24tPmdldF9uYW1lKCk7CisgICAgc3RyaW5nIHNpZ25hdHVyZSA9IGZ1bmN0aW9uX3NpZ25hdHVyZShmdW5jdGlvbik7CisgICAgdF9zdHJ1Y3QqIGV4Y2VwdGlvbnMgPSBmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHhtZW1iZXJzID0gZXhjZXB0aW9ucy0+Z2V0X21lbWJlcnMoKTsKKworICAgIGZfdHlwZXNfIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIig6bWV0aG9kICIgPDwgcHJlZml4KGZuYW1lKTsKKyAgICBmX3R5cGVzXyA8PCAiICgiIDw8IHNpZ25hdHVyZSA8PCAiICIgIDw8IHR5cGVzcGVjKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSkgPDwgIikiOworICAgIGlmICh4bWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgICBmX3R5cGVzXyA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgOmV4Y2VwdGlvbnMgIiA7CisgICAgICBnZW5lcmF0ZV9leGNlcHRpb25fc2lnKGZfdHlwZXNfLCBmdW5jdGlvbik7CisgICAgfQorICAgIGlmICggKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSApIHsKKyAgICAgIGZfdHlwZXNfIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiA6b25ld2F5IHQiOworICAgIH0KKyAgICBpZiAoICgqZl9pdGVyKS0+aGFzX2RvYygpICkgeworICAgICAgZl90eXBlc18gPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiIDpkb2N1bWVudGF0aW9uIFwiIgorICAgICAgICAgICAgICAgPDwgY2xfZG9jc3RyaW5nKCgqZl9pdGVyKS0+Z2V0X2RvYygpKSA8PCAiXCIiOworICB9CisgICAgZl90eXBlc18gPDwgIikiOworICB9CisKKyAgZl90eXBlc18gPDwgIikiIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworfQorCitzdHJpbmcgdF9jbF9nZW5lcmF0b3I6OnR5cGVzcGVjKHRfdHlwZSAqdCkgeworICB0ID0gZ2V0X3RydWVfdHlwZSh0KTsKKworICBpZiAodCAtPiBpc19iaW5hcnkoKSl7CisgICAgcmV0dXJuICJiaW5hcnkiOworICB9IGVsc2UgaWYgKHQtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgcmV0dXJuIHR5cGVfbmFtZSh0KTsKKyAgfSBlbHNlIGlmICh0LT5pc19tYXAoKSkgeworICAgIHRfbWFwICptID0gKHRfbWFwKikgdDsKKyAgICByZXR1cm4gIih0aHJpZnQ6bWFwICIgKyB0eXBlc3BlYyhtLT5nZXRfa2V5X3R5cGUoKSkgKyAiICIgKworICAgICAgdHlwZXNwZWMobS0+Z2V0X3ZhbF90eXBlKCkpICsgIikiOworICB9IGVsc2UgaWYgKHQtPmlzX3N0cnVjdCgpIHx8IHQtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIihzdHJ1Y3QgIiArIHByZWZpeCh0eXBlX25hbWUodCkpICsgIikiOworICB9IGVsc2UgaWYgKHQtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiKHRocmlmdDpsaXN0ICIgKyB0eXBlc3BlYygoKHRfbGlzdCopIHQpLT5nZXRfZWxlbV90eXBlKCkpICsgIikiOworICB9IGVsc2UgaWYgKHQtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICIodGhyaWZ0OnNldCAiICsgdHlwZXNwZWMoKCh0X3NldCopIHQpLT5nZXRfZWxlbV90eXBlKCkpICsgIikiOworICB9IGVsc2UgaWYgKHQtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiKGVudW0gXCIiICsgKCh0X2VudW0qKSB0KS0+Z2V0X25hbWUoKSArICJcIikiOworICB9IGVsc2UgeworICAgIHRocm93ICJTb3JyeSwgSSBkb24ndCBrbm93IGhvdyB0byBnZW5lcmF0ZSB0aGlzOiAiICsgdHlwZV9uYW1lKHQpOworICB9Cit9CisKK3N0cmluZyB0X2NsX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICByZXR1cm4gYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpOworfQorCitzdHJpbmcgdF9jbF9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nc3RyZWFtIHJlczsKKyAgcmVzIDw8ICIoIjsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzIDw8ICIgIjsKKyAgICB9CisgICAgcmVzIDw8ICIoIiArIHByZWZpeCgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgIiA8PAorICAgICAgdHlwZXNwZWMoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiICIgPDwKKyAgICAgICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICAiKSI7CisKKworICB9CisgIHJlcyA8PCAiKSI7CisgIHJldHVybiByZXMuc3RyKCk7Cit9CisKK3N0cmluZyB0X2NsX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpIHsKKyAgc3RyaW5nIHByZWZpeCA9ICIiOworICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKKworICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pCisgICAgcHJlZml4ID0gcGFja2FnZV9vZihwcm9ncmFtKSA9PSBwYWNrYWdlKCkgPyAiIiA6IHBhY2thZ2Vfb2YocHJvZ3JhbSkgKyAiOiI7CisKKyAgc3RyaW5nIG5hbWUgPSB0dHlwZS0+Z2V0X25hbWUoKTsKKworICBpZiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKQorICAgIG5hbWUgPSBsb3dlcmNhc2UodHR5cGUtPmdldF9uYW1lKCkpOworCisgIHJldHVybiBwcmVmaXggKyBuYW1lOworfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAorICAgIGNsLAorICAgICJDb21tb24gTGlzcCIsCisgICAgIiAgICBub19hc2Q6ICAgICAgICAgIERvIG5vdCBkZWZpbmUgQVNERiBzeXN0ZW1zIGZvciBlYWNoIGdlbmVyYXRlZCBUaHJpZnQgcHJvZ3JhbS5cbiIKKyAgICAiICAgIHN5c19wcmVmPSAgICAgICAgVGhlIHByZWZpeCB0byBnaXZlIEFTREYgc3lzdGVtIG5hbWVzLiBEZWZhdWx0OiB0aHJpZnQtZ2VuLVxuIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY29jb2FfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9jb2NvYV9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM2NDRmNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY29jb2FfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsMzMwOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6Om9mc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKKy8qKgorICogT2JqZWN0aXZlLUMgY29kZSBnZW5lcmF0b3IuCisgKgorICogbW9zdGx5IGNvcHkvcGFzdGluZy90d2Vha2luZyBmcm9tIG1jc2xlZSdzIHdvcmsuCisgKi8KK2NsYXNzIHRfY29jb2FfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfY29jb2FfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICBsb2dfdW5leHBlY3RlZF8gPSBmYWxzZTsKKyAgICB2YWxpZGF0ZV9yZXF1aXJlZF8gPSBmYWxzZTsKKyAgICBhc3luY19jbGllbnRzXyA9IGZhbHNlOworICAgIHByb21pc2Vfa2l0XyA9IGZhbHNlOworICAgIGRlYnVnX2Rlc2NyaXB0aW9uc18gPSBmYWxzZTsKKyAgICBwb2RzXyA9IGZhbHNlOworICAgIGZvciggaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgeworICAgICAgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImxvZ191bmV4cGVjdGVkIikgPT0gMCkgeworICAgICAgICBsb2dfdW5leHBlY3RlZF8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJ2YWxpZGF0ZV9yZXF1aXJlZCIpID09IDApIHsKKyAgICAgICAgdmFsaWRhdGVfcmVxdWlyZWRfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiYXN5bmNfY2xpZW50cyIpID09IDApIHsKKyAgICAgICAgYXN5bmNfY2xpZW50c18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJwcm9taXNlX2tpdCIpID09IDApIHsKKyAgICAgICAgcHJvbWlzZV9raXRfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiZGVidWdfZGVzY3JpcHRpb25zIikgPT0gMCkgeworICAgICAgICBkZWJ1Z19kZXNjcmlwdGlvbnNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgicG9kcyIpID09IDApIHsKKyAgICAgICAgcG9kc18gPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIGNvY29hOiIgKyBpdGVyLT5maXJzdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1jb2NvYSI7CisgIH0KKworICAvKioKKyAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcworICAgKi8KKworICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7CisgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7CisKKyAgLyoqCisgICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIHZvaWQgcHJpbnRfY29uc3RfdmFsdWUob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlZnZhbCA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBib3hfaXQgPSBmYWxzZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW50ZXJmYWNlKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbXBsZW1lbnRhdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQgPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2luaXRpYWxpemVyX3NpZ25hdHVyZShzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbml0X3dpdGhfY29kZXJfbWV0aG9kKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2VuY29kZV93aXRoX2NvZGVyX21ldGhvZChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfY29weV9tZXRob2Qob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9oYXNoX21ldGhvZChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaXNfZXF1YWxfbWV0aG9kKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9maWVsZF9hY2Nlc3Nvcl9pbXBsZW1lbnRhdGlvbnMoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfcmVhZGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X3Jlc3VsdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X3ZhbGlkYXRvcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9kZXNjcmlwdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3Jlc3VsdF9oZWxwZXJfc3RydWN0X3R5cGUodF9zZXJ2aWNlICp0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fYXJnc19oZWxwZXJfc3RydWN0X3R5cGUodF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfc2VydmljZSAqdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgLyoqCisgICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX3Byb3RvY29sKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2FzeW5jX3Byb3RvY29sKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICB2b2lkIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X2ludGVyZmFjZShzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfYXN5bmNfaW50ZXJmYWNlKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICB2b2lkIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X3NlbmRfZnVuY3Rpb25faW1wbGVtZW50YXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXJ2aWNlKiB0c2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbmVlZHNfcHJvdG9jb2wpOworICB2b2lkIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X3NlbmRfZnVuY3Rpb25faW52b2NhdGlvbihvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfc2VuZF9hc3luY19mdW5jdGlvbl9pbnZvY2F0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmFpbHVyZUJsb2NrTmFtZSk7CisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfcmVjdl9mdW5jdGlvbl9pbXBsZW1lbnRhdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UqIHRzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBuZWVkc19wcm90b2NvbCk7CisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfaW1wbGVtZW50YXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X2FzeW5jX2ltcGxlbWVudGF0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICB2b2lkIGdlbmVyYXRlX2NvY29hX3NlcnZpY2Vfc2VydmVyX2ludGVyZmFjZShzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9zZXJ2ZXJfaW1wbGVtZW50YXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgLyoqCisgICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIGZpZWxkTmFtZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgZmllbGROYW1lID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWFwKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGxpc3ROYW1lKTsKKworICAvKioKKyAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKKyAgICovCisKKyAgc3RkOjpzdHJpbmcgY29jb2FfcHJlZml4KCk7CisgIHN0ZDo6c3RyaW5nIGNvY29hX2ltcG9ydHMoKTsKKyAgc3RkOjpzdHJpbmcgY29jb2FfdGhyaWZ0X2ltcG9ydHMoKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgY2xhc3NfcmVmID0gZmFsc2UsIGJvb2wgbmVlZHNfbXV0YWJsZSA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgZWxlbWVudF90eXBlX25hbWUodF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIGJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0YmFzZSk7CisgIHN0ZDo6c3RyaW5nIGRlY2xhcmVfcHJvcGVydHkodF9maWVsZCogdGZpZWxkKTsKKyAgc3RkOjpzdHJpbmcgZGVjbGFyZV9wcm9wZXJ0eV9pc3NldCh0X2ZpZWxkKiB0ZmllbGQpOworICBzdGQ6OnN0cmluZyBkZWNsYXJlX3Byb3BlcnR5X3Vuc2V0KHRfZmllbGQqIHRmaWVsZCk7CisgIHN0ZDo6c3RyaW5nIGludmFsaWRfcmV0dXJuX3N0YXRlbWVudCh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBib29sIGluY2x1ZGVfZXJyb3IpOworICBzdGQ6OnN0cmluZyBhc3luY19mdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBib29sIGluY2x1ZGVfZXJyb3IpOworICBzdGQ6OnN0cmluZyBwcm9taXNlX2Z1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJvdG9jb2xfbmFtZSwgYm9vbCBpbmNsdWRlX2Vycm9yKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyBmb3JtYXRfc3RyaW5nX2Zvcl90eXBlKHRfdHlwZSogdHlwZSk7CisgIHN0ZDo6c3RyaW5nIGZvcm1hdF9jYXN0X2Zvcl90eXBlKHRfdHlwZSogdHlwZSk7CisgIHN0ZDo6c3RyaW5nIGNhbGxfZmllbGRfc2V0dGVyKHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgZmllbGROYW1lKTsKKyAgc3RkOjpzdHJpbmcgYm94KHRfdHlwZSAqdHR5cGUsIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUpOworICBzdGQ6OnN0cmluZyB1bmJveCh0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lKTsKKyAgc3RkOjpzdHJpbmcgZ2V0dGVyX25hbWUoc3RyaW5nIGZpZWxkX25hbWUpOworICBzdGQ6OnN0cmluZyBzZXR0ZXJfbmFtZShzdHJpbmcgZmllbGRfbmFtZSk7CisKKyAgYm9vbCB0eXBlX2Nhbl9iZV9jb3B5KHRfdHlwZSogdHR5cGUpIHsKKyAgICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworICAgIAorICAgIHJldHVybiB0dHlwZS0+aXNfc3RyaW5nKCk7CisgIH0KKyAgCisgIGJvb2wgdHlwZV9jYW5fYmVfbnVsbCh0X3R5cGUqIHR0eXBlKSB7CisgICAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKworICAgIHJldHVybiB0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpCisgICAgICAgICAgIHx8IHR0eXBlLT5pc19zdHJpbmcoKTsKKyAgfQorCitwcml2YXRlOgorICBzdGQ6OnN0cmluZyBjb2NvYV9wcmVmaXhfOworICBzdGQ6OnN0cmluZyBjb25zdGFudHNfZGVjbGFyYXRpb25zXzsKKyAgaW50IGVycm9yX2NvbnN0YW50XzsKKworICAvKioKKyAgICogRmlsZSBzdHJlYW1zCisgICAqLworCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9oZWFkZXJfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfaW1wbF87CisKKyAgYm9vbCBsb2dfdW5leHBlY3RlZF87CisgIGJvb2wgdmFsaWRhdGVfcmVxdWlyZWRfOworICBib29sIGFzeW5jX2NsaWVudHNfOworICBib29sIHByb21pc2Vfa2l0XzsKKyAgYm9vbCBkZWJ1Z19kZXNjcmlwdGlvbnNfOworICBib29sIHBvZHNfOworfTsKKworLyoqCisgKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAorICogc3RyZWFtcy4KKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQorICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworICBjb2NvYV9wcmVmaXhfID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoImNvY29hIik7CisKKyAgLy8gd2UgaGF2ZSBhIC5oIGhlYWRlciBmaWxlLi4uCisgIHN0cmluZyBmX2hlYWRlcl9uYW1lID0gY29jb2FfcHJlZml4XyArIGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXykgKyAiLmgiOworICBzdHJpbmcgZl9oZWFkZXJfZnVsbG5hbWUgPSBnZXRfb3V0X2RpcigpICsgZl9oZWFkZXJfbmFtZTsKKyAgZl9oZWFkZXJfLm9wZW4oZl9oZWFkZXJfZnVsbG5hbWUuY19zdHIoKSk7CisKKyAgZl9oZWFkZXJfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7CisKKyAgZl9oZWFkZXJfIDw8IGNvY29hX2ltcG9ydHMoKSA8PCBjb2NvYV90aHJpZnRfaW1wb3J0cygpOworCisgIC8vIC4uLmFuZCBhIC5tIGltcGxlbWVudGF0aW9uIGZpbGUKKyAgc3RyaW5nIGZfaW1wbF9uYW1lID0gY29jb2FfcHJlZml4XyArIGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXykgKyAiLm0iOworICBzdHJpbmcgZl9pbXBsX2Z1bGxuYW1lID0gZ2V0X291dF9kaXIoKSArIGZfaW1wbF9uYW1lOworICBmX2ltcGxfLm9wZW4oZl9pbXBsX2Z1bGxuYW1lLmNfc3RyKCkpOworCisgIGZfaW1wbF8gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKKworICBmX2ltcGxfIDw8IGNvY29hX2ltcG9ydHMoKSA8PCBjb2NvYV90aHJpZnRfaW1wb3J0cygpIDw8ICIjaW1wb3J0IFwiIiA8PCBmX2hlYWRlcl9uYW1lIDw8ICJcIiIKKyAgICAgICAgICA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZXJyb3JfY29uc3RhbnRfID0gNjAwMDA7Cit9CisKKy8qKgorICogUHJpbnRzIHN0YW5kYXJkIENvY29hIGltcG9ydHMKKyAqCisgKiBAcmV0dXJuIExpc3Qgb2YgaW1wb3J0cyBmb3IgQ29jb2EgbGlicmFyaWVzCisgKi8KK3N0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6Y29jb2FfaW1wb3J0cygpIHsKKyAgcmV0dXJuIHN0cmluZygpICsgIiNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPlxuIiArICJcbiI7Cit9CisKKy8qKgorICogUHJpbnRzIHRocmlmdCBydW50aW1lIGltcG9ydHMKKyAqCisgKiBAcmV0dXJuIExpc3Qgb2YgaW1wb3J0cyBuZWNlc3NhcnkgZm9yIHRocmlmdCBydW50aW1lCisgKi8KK3N0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6Y29jb2FfdGhyaWZ0X2ltcG9ydHMoKSB7CisKKyAgdmVjdG9yPHN0cmluZz4gaW5jbHVkZXNfbGlzdDsKKyAgaW5jbHVkZXNfbGlzdC5wdXNoX2JhY2soIlRQcm90b2NvbC5oIik7CisgIGluY2x1ZGVzX2xpc3QucHVzaF9iYWNrKCJUUHJvdG9jb2xGYWN0b3J5LmgiKTsKKyAgaW5jbHVkZXNfbGlzdC5wdXNoX2JhY2soIlRBcHBsaWNhdGlvbkVycm9yLmgiKTsKKyAgaW5jbHVkZXNfbGlzdC5wdXNoX2JhY2soIlRQcm90b2NvbEVycm9yLmgiKTsKKyAgaW5jbHVkZXNfbGlzdC5wdXNoX2JhY2soIlRQcm90b2NvbFV0aWwuaCIpOworICBpbmNsdWRlc19saXN0LnB1c2hfYmFjaygiVFByb2Nlc3Nvci5oIik7CisgIGluY2x1ZGVzX2xpc3QucHVzaF9iYWNrKCJUQmFzZS5oIik7CisgIGluY2x1ZGVzX2xpc3QucHVzaF9iYWNrKCJUQXN5bmNUcmFuc3BvcnQuaCIpOworICBpbmNsdWRlc19saXN0LnB1c2hfYmFjaygiVEJhc2VDbGllbnQuaCIpOworCisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBpbmNsdWRlczsKKworICB2ZWN0b3I8c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaV9pdGVyOworICBmb3IgKGlfaXRlcj1pbmNsdWRlc19saXN0LmJlZ2luKCk7IGlfaXRlciE9aW5jbHVkZXNfbGlzdC5lbmQoKTsgKytpX2l0ZXIpIHsKKyAgICBpbmNsdWRlcyA8PCAiI2ltcG9ydCAiOworICAgIGlmIChwb2RzXykgeworICAgICAgaW5jbHVkZXMgPDwgIjxUaHJpZnQvIiA8PCAqaV9pdGVyIDw8ICI+IjsKKyAgICB9IGVsc2UgeworICAgICAgaW5jbHVkZXMgPDwgIlwiIiA8PCAqaV9pdGVyIDw8ICJcIiI7CisgICAgfQorICAgIGluY2x1ZGVzIDw8IGVuZGw7CisgIH0KKworICBpbmNsdWRlcyA8PCBlbmRsOworCisgIGlmIChwcm9taXNlX2tpdF8pIHsKKyAgICBpbmNsdWRlcyA8PCAiI2ltcG9ydCAiOworICAgIGlmIChwb2RzXykgeworICAgICAgaW5jbHVkZXMgPDwgIjxQcm9taXNlS2l0L1Byb21pc2VLaXQuaD4iOworICAgIH0gZWxzZSB7CisgICAgICBpbmNsdWRlcyA8PCAiXCJQcm9taXNlS2l0LmhcIiI7CisgICAgfQorICAgIGluY2x1ZGVzIDw8IGVuZGw7CisgIH0KKworICAvLyBJbmNsdWRlIG90aGVyIFRocmlmdCBpbmNsdWRlcworICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIG90aGVyX2luY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG90aGVyX2luY2x1ZGVzLnNpemUoKTsgKytpKSB7CisgICAgaW5jbHVkZXMgPDwgIiNpbXBvcnQgXCIiCisgICAgICAgICAgICAgPDwgb3RoZXJfaW5jbHVkZXNbaV0tPmdldF9uYW1lc3BhY2UoImNvY29hIikKKyAgICAgICAgICAgICA8PCBjYXBpdGFsaXplKG90aGVyX2luY2x1ZGVzW2ldLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgIDw8ICIuaFwiIiA8PCBlbmRsOworICB9CisKKyAgaW5jbHVkZXMgPDwgZW5kbDsKKworICByZXR1cm4gaW5jbHVkZXMuc3RyKCk7Cit9CisKKy8qKgorICogRmluaXNoIHVwIGdlbmVyYXRpb24uCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKKyAgLy8gc3RpY2sgb3VyIGNvbnN0YW50cyBkZWNsYXJhdGlvbnMgYXQgdGhlIGVuZCBvZiB0aGUgaGVhZGVyIGZpbGUKKyAgLy8gc2luY2UgdGhleSByZWZlciB0byB0aGluZ3Mgd2UgYXJlIGRlZmluaW5nLgorICBmX2hlYWRlcl8gPDwgY29uc3RhbnRzX2RlY2xhcmF0aW9uc18gPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBUaGlzIGlzIGp1c3QgYSBzaW1wbGUgMS1saW5lciBpbiBvYmplY3RpdmUtYworICoKKyAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICBpZiAodHR5cGVkZWYtPmdldF90eXBlKCktPmlzX21hcCgpKSB7CisgICAgdF9tYXAgKm1hcCA9ICh0X21hcCAqKXR0eXBlZGVmLT5nZXRfdHlwZSgpOworICAgIGlmIChtYXAtPmdldF9rZXlfdHlwZSgpLT5pc19zdHJ1Y3QoKSkgeworICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJAY2xhc3MgIiA8PCB0eXBlX25hbWUobWFwLT5nZXRfa2V5X3R5cGUoKSwgdHJ1ZSkgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICAgIGlmIChtYXAtPmdldF92YWxfdHlwZSgpLT5pc19zdHJ1Y3QoKSkgeworICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJAY2xhc3MgIiA8PCB0eXBlX25hbWUobWFwLT5nZXRfdmFsX3R5cGUoKSwgdHJ1ZSkgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICB9CisgIGVsc2UgaWYgKHR0eXBlZGVmLT5nZXRfdHlwZSgpLT5pc19zZXQoKSkgeworICAgIHRfc2V0ICpzZXQgPSAodF9zZXQgKil0dHlwZWRlZi0+Z2V0X3R5cGUoKTsKKyAgICBpZiAoc2V0LT5nZXRfZWxlbV90eXBlKCktPmlzX3N0cnVjdCgpKSB7CisgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIkBjbGFzcyAiIDw8IHR5cGVfbmFtZShzZXQtPmdldF9lbGVtX3R5cGUoKSwgdHJ1ZSkgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICB9CisgIGVsc2UgaWYgKHR0eXBlZGVmLT5nZXRfdHlwZSgpLT5pc19saXN0KCkpIHsKKyAgICB0X2xpc3QgKmxpc3QgPSAodF9saXN0ICopdHR5cGVkZWYtPmdldF90eXBlKCk7CisgICAgaWYgKGxpc3QtPmdldF9lbGVtX3R5cGUoKS0+aXNfc3RydWN0KCkpIHsKKyAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiQGNsYXNzICIgPDwgdHlwZV9uYW1lKGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgdHJ1ZSkgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICB9CisgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAidHlwZWRlZiAiIDw8IHR5cGVfbmFtZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSkgPDwgIiAiIDw8IGNvY29hX3ByZWZpeF8KKyAgICAgICAgICAgIDw8IHR0eXBlZGVmLT5nZXRfc3ltYm9saWMoKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICBpZiAodHR5cGVkZWYtPmdldF90eXBlKCktPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ0eXBlZGVmICIgPDwgdHlwZV9uYW1lKHR0eXBlZGVmLT5nZXRfdHlwZSgpLCBmYWxzZSwgdHJ1ZSkgPDwgIiAiIDw8IGNvY29hX3ByZWZpeF8KKyAgICAgICAgICAgICAgPDwgIk11dGFibGUiIDw8IHR0eXBlZGVmLT5nZXRfc3ltYm9saWMoKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4gSW4gT2JqZWN0aXZlLUMsIHRoaXMgaXMKKyAqIGVzc2VudGlhbGx5IHRoZSBzYW1lIGFzIHRoZSB0aHJpZnQgZGVmaW5pdGlvbiBpdHNlbGYsIGluc3RlYWQgdXNpbmcKKyAqIE5TX0VOVU0ga2V5d29yZCBpbiBPYmplY3RpdmUtQy4gIEZvciBuYW1lc3BhY2UgcHVycG9zZXMsIHRoZSBuYW1lIG9mCisgKiB0aGUgZW51bSBpcyBwcmVmaXhlZCB0byBlYWNoIGVsZW1lbnQgaW4ga2VlcGluZyB3aXRoIENvY29hICYgU3dpZnQKKyAqIHN0YW5kYXJkcy4KKyAqCisgKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInR5cGVkZWYgTlNfRU5VTShTSW50MzIsICIgPDwgY29jb2FfcHJlZml4XyA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgZl9oZWFkZXJfIDw8ICIsIiA8PCBlbmRsOworICAgIH0KKyAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgY29jb2FfcHJlZml4XyA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAoKmNfaXRlciktPmdldF9uYW1lKCk7CisgICAgZl9oZWFkZXJfIDw8ICIgPSAiIDw8ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX2hlYWRlcl8gPDwgZW5kbCA8PCAifTsiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBjbGFzcyB0aGF0IGhvbGRzIGFsbCB0aGUgY29uc3RhbnRzLgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gY29uc3RfaW50ZXJmYWNlOworCisgIGNvbnN0X2ludGVyZmFjZSA8PCAiRk9VTkRBVElPTl9FWFBPUlQgTlNTdHJpbmcgKiIgPDwgY29jb2FfcHJlZml4XyA8PCBjYXBpdGFsaXplKHByb2dyYW1fbmFtZV8pIDw8ICJFcnJvckRvbWFpbjsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisKKworICBib29sIG5lZWRzX2NsYXNzID0gZmFsc2U7CisKKyAgLy8gUHVibGljIGNvbnN0YW50cyBmb3IgYmFzZSB0eXBlcyAmIHN0cmluZ3MKKyAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY19pdGVyOworICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgIHRfdHlwZSogdHlwZSA9ICgqY19pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X3RydWVfdHlwZSgpOworICAgIGlmICghdHlwZS0+aXNfY29udGFpbmVyKCkgJiYgIXR5cGUtPmlzX3N0cnVjdCgpKSB7CisgICAgICBjb25zdF9pbnRlcmZhY2UgPDwgIkZPVU5EQVRJT05fRVhQT1JUICIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIgorICAgICAgICAgICAgICAgICAgICAgIDw8IGNvY29hX3ByZWZpeF8gPDwgY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIG5lZWRzX2NsYXNzID0gdHJ1ZTsKKyAgICB9CisgIH0KKworCisgIHN0cmluZyBjb25zdGFudHNfY2xhc3NfbmFtZSA9IGNvY29hX3ByZWZpeF8gKyBjYXBpdGFsaXplKHByb2dyYW1fbmFtZV8pICsgIkNvbnN0YW50cyI7CisKKyAgaWYgKG5lZWRzX2NsYXNzKSB7CisKKyAgICBjb25zdF9pbnRlcmZhY2UgPDwgZW5kbDsKKworICAgIGNvbnN0X2ludGVyZmFjZSA8PCAiQGludGVyZmFjZSAiIDw8IGNvbnN0YW50c19jbGFzc19uYW1lIDw8ICIgOiBOU09iamVjdCAiOworICAgIHNjb3BlX3VwKGNvbnN0X2ludGVyZmFjZSk7CisgICAgc2NvcGVfZG93bihjb25zdF9pbnRlcmZhY2UpOworCisgICAgLy8gZ2V0dGVyIG1ldGhvZCBmb3IgZWFjaCBjb25zdGFudCBkZWZpbmVkLgorICAgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgICBzdHJpbmcgbmFtZSA9ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIHRfdHlwZSogdHlwZSA9ICgqY19pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X3RydWVfdHlwZSgpOworICAgICAgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8IHR5cGUtPmlzX3N0cnVjdCgpKSB7CisgICAgICAgIHRfdHlwZSogdHlwZSA9ICgqY19pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgY29uc3RfaW50ZXJmYWNlIDw8IGVuZGwgPDwgIisgKCIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIpICIgPDwgbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBjb25zdF9pbnRlcmZhY2UgPDwgZW5kbCA8PCAiQGVuZCI7CisgIH0KKworICAvLyB0aGlzIGdldHMgc3BpdCBpbnRvIHRoZSBoZWFkZXIgZmlsZSBpbiA6OmNsb3NlX2dlbmVyYXRvcgorICBjb25zdGFudHNfZGVjbGFyYXRpb25zXyA9IGNvbnN0X2ludGVyZmFjZS5zdHIoKTsKKworICBmX2ltcGxfIDw8ICJOU1N0cmluZyAqIiA8PCBjb2NvYV9wcmVmaXhfIDw8IGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXykgPDwgIkVycm9yRG9tYWluID0gIgorICAgICAgICAgIDw8ICJAXCIiIDw8IGNvY29hX3ByZWZpeF8gPDwgY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKSA8PCAiRXJyb3JEb21haW5cIjsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyB2YXJpYWJsZXMgaW4gdGhlIC5tIGhvbGQgYWxsIHNpbXBsZSBjb25zdGFudCB2YWx1ZXMKKyAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBzdHJpbmcgbmFtZSA9ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB0X3R5cGUqIHR5cGUgPSAoKmNfaXRlciktPmdldF90eXBlKCk7CisgICAgZl9pbXBsXyA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiIDw8IGNvY29hX3ByZWZpeF8gPDwgbmFtZTsKKyAgICB0X3R5cGUqIHR0eXBlID0gdHlwZS0+Z2V0X3RydWVfdHlwZSgpOworICAgIGlmICghdHR5cGUtPmlzX2NvbnRhaW5lcigpICYmICF0dHlwZS0+aXNfc3RydWN0KCkpIHsKKyAgICAgIGZfaW1wbF8gPDwgIiA9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGZfaW1wbF8sIHR5cGUsICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkpOworICAgIH0KKyAgICBmX2ltcGxfIDw8ICI7IiA8PCBlbmRsOworICB9CisgIGZfaW1wbF8gPDwgZW5kbDsKKworICBpZiAobmVlZHNfY2xhc3MpIHsKKworICAgIGZfaW1wbF8gPDwgIkBpbXBsZW1lbnRhdGlvbiAiIDw8IGNvbnN0YW50c19jbGFzc19uYW1lIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIC8vIGluaXRpYWxpemUgY29tcGxleCBjb25zdGFudHMgd2hlbiB0aGUgY2xhc3MgaXMgbG9hZGVkCisgICAgZl9pbXBsXyA8PCAiKyAodm9pZCkgaW5pdGlhbGl6ZSAiOworICAgIHNjb3BlX3VwKGZfaW1wbF8pOworCisgICAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogdHR5cGUgPSAoKmNfaXRlciktPmdldF90eXBlKCktPmdldF90cnVlX3R5cGUoKTsKKyAgICAgIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpKSB7CisgICAgICAgIGZfaW1wbF8gPDwgZW5kbDsKKyAgICAgICAgcHJpbnRfY29uc3RfdmFsdWUoZl9pbXBsXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29jb2FfcHJlZml4XyArICgqY19pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF92YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgICAgIGZfaW1wbF8gPDwgIjsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICAgIHNjb3BlX2Rvd24oZl9pbXBsXyk7CisKKyAgICAvLyBnZXR0ZXIgbWV0aG9kIGZvciBlYWNoIGNvbnN0YW50CisgICAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICAgIHN0cmluZyBuYW1lID0gKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgdF90eXBlKiB0eXBlID0gKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfdHJ1ZV90eXBlKCk7CisgICAgICBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkgfHwgdHlwZS0+aXNfc3RydWN0KCkpIHsKKyAgICAgICAgZl9pbXBsXyA8PCBlbmRsIDw8ICIrICgiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKSAiIDw8IG5hbWUgPDwgIiAiOworICAgICAgICBzY29wZV91cChmX2ltcGxfKTsKKyAgICAgICAgaW5kZW50KGZfaW1wbF8pIDw8ICJyZXR1cm4gIiA8PCBjb2NvYV9wcmVmaXhfIDw8IG5hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIHNjb3BlX2Rvd24oZl9pbXBsXyk7CisgICAgICB9CisgICAgfQorCisgICAgZl9pbXBsXyA8PCAiQGVuZCIgPDwgZW5kbCA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4gVGhpcyBpcyBhIGNsYXNzCisgKiB3aXRoIHByb3RlY3RlZCBkYXRhIG1lbWJlcnMsIHJlYWQoKSwgd3JpdGUoKSwgYW5kIGdldHRlcnMgYW5kIHNldHRlcnMuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW50ZXJmYWNlKGZfaGVhZGVyXywgdHN0cnVjdCwgZmFsc2UpOworICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW1wbGVtZW50YXRpb24oZl9pbXBsXywgdHN0cnVjdCwgZmFsc2UpOworfQorCisvKioKKyAqIEV4Y2VwdGlvbnMgYXJlIHN0cnVjdHMsIGJ1dCB0aGV5IGluaGVyaXQgZnJvbSBOU0V4Y2VwdGlvbgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbnRlcmZhY2UoZl9oZWFkZXJfLCB0eGNlcHRpb24sIHRydWUpOworICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW1wbGVtZW50YXRpb24oZl9pbXBsXywgdHhjZXB0aW9uLCB0cnVlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZSB0aGUgaW50ZXJmYWNlIGZvciBhIHN0cnVjdAorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW50ZXJmYWNlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIG91dCA8PCAiZW51bSB7IiA8PCBlbmRsCisgICAgICAgIDw8ICIgICIgPDwgY29jb2FfcHJlZml4XyA8PCBjYXBpdGFsaXplKHByb2dyYW1fbmFtZV8pIDw8ICJFcnJvciIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAgIiA9IC0iIDw8IGVycm9yX2NvbnN0YW50XysrIDw8IGVuZGwKKyAgICAgICAgPDwgIn07IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGw7CisgIH0KKworICBvdXQgPDwgIkBpbnRlcmZhY2UgIiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiA6ICI7CisKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIG91dCA8PCAiTlNFcnJvciAiOworICB9IGVsc2UgeworICAgIG91dCA8PCAiTlNPYmplY3QgIjsKKyAgfQorICBvdXQgPDwgIjxUQmFzZSwgTlNDb2RpbmcsIE5TQ29weWluZz4gIiA8PCBlbmRsOworCisgIG91dCA8PCBlbmRsOworCisgIC8vIHByb3BlcnRpZXMKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGRlY2xhcmVfcHJvcGVydHkoKm1faXRlcikgPDwgZW5kbDsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBkZWNsYXJlX3Byb3BlcnR5X2lzc2V0KCptX2l0ZXIpIDw8IGVuZGw7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgZGVjbGFyZV9wcm9wZXJ0eV91bnNldCgqbV9pdGVyKSA8PCBlbmRsOworICAgICAgb3V0IDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gaW5pdGlhbGl6ZXIgZm9yIGFsbCBmaWVsZHMKKyAgaWYgKCFtZW1iZXJzLmVtcHR5KCkpIHsKKyAgICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW5pdGlhbGl6ZXJfc2lnbmF0dXJlKG91dCwgdHN0cnVjdCk7CisgICAgb3V0IDw8ICI7IiA8PCBlbmRsOworICB9CisgIG91dCA8PCBlbmRsOworCisgIG91dCA8PCAiQGVuZCIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlIHNpZ25hdHVyZSBmb3IgaW5pdGlhbGl6ZXIgb2Ygc3RydWN0IHdpdGggYSBwYXJhbWV0ZXIgZm9yCisgKiBlYWNoIGZpZWxkLgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW5pdGlhbGl6ZXJfc2lnbmF0dXJlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgaW5kZW50KG91dCkgPDwgIi0gKGluc3RhbmNldHlwZSkgaW5pdFdpdGgiOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7KSB7CisgICAgaWYgKG1faXRlciA9PSBtZW1iZXJzLmJlZ2luKCkpIHsKKyAgICAgIG91dCA8PCBjYXBpdGFsaXplKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAoKm1faXRlciktPmdldF9uYW1lKCk7CisgICAgfQorICAgIG91dCA8PCAiOiAoIiA8PCB0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICArK21faXRlcjsKKyAgICBpZiAobV9pdGVyICE9IG1lbWJlcnMuZW5kKCkpIHsKKyAgICAgIG91dCA8PCAiICI7CisgICAgfQorICB9Cit9CisKKy8qKgorICogR2VuZXJhdGUgdGhlIGluaXRXaXRoQ29kZXIgbWV0aG9kIGZvciB0aGlzIHN0cnVjdCBzbyBpdCdzIGNvbXBhdGlibGUgd2l0aAorICogdGhlIE5TQ29kaW5nIHByb3RvY29sCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbml0X3dpdGhfY29kZXJfbWV0aG9kKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKKworICBpbmRlbnQob3V0KSA8PCAiLSAoaW5zdGFuY2V0eXBlKSBpbml0V2l0aENvZGVyOiAoTlNDb2RlciAqKSBkZWNvZGVyIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICAvLyBOU0V4Y2VwdGlvbnMgY29uZm9ybSB0byBOU0NvZGluZywgc28gd2UgY2FuIGNhbGwgc3VwZXIKKyAgICBpbmRlbnQob3V0KSA8PCAic2VsZiA9IFtzdXBlciBpbml0V2l0aENvZGVyOiBkZWNvZGVyXTsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgInNlbGYgPSBbc3VwZXIgaW5pdF07IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgImlmIChzZWxmKSAiOworICBzY29wZV91cChvdXQpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChbZGVjb2RlciBjb250YWluc1ZhbHVlRm9yS2V5OiBAXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdKSIKKyAgICAgICAgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiOworICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHQpKSB7CisgICAgICBvdXQgPDwgIltkZWNvZGVyIGRlY29kZU9iamVjdEZvcktleTogQFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiCisgICAgICAgICAgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHQtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJbZGVjb2RlciBkZWNvZGVJbnRGb3JLZXk6IEBcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdCktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAiW2RlY29kZXIgZGVjb2RlQm9vbEZvcktleTogQFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8ICJbZGVjb2RlciBkZWNvZGVJbnRGb3JLZXk6IEBcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgIltkZWNvZGVyIGRlY29kZUludEZvcktleTogQFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIG91dCA8PCAiW2RlY29kZXIgZGVjb2RlSW50MzJGb3JLZXk6IEBcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgIltkZWNvZGVyIGRlY29kZUludDY0Rm9yS2V5OiBAXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJbZGVjb2RlciBkZWNvZGVEb3VibGVGb3JLZXk6IEBcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogZG9uJ3Qga25vdyBob3cgdG8gZGVjb2RlIHRocmlmdCB0eXBlOiAiCisgICAgICAgICAgICArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfQorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJJc1NldCA9IFlFUzsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihvdXQpOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHNlbGY7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlIHRoZSBlbmNvZGVXaXRoQ29kZXIgbWV0aG9kIGZvciB0aGlzIHN0cnVjdCBzbyBpdCdzIGNvbXBhdGlibGUgd2l0aAorICogdGhlIE5TQ29kaW5nIHByb3RvY29sCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF9lbmNvZGVfd2l0aF9jb2Rlcl9tZXRob2Qob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKKworICBpbmRlbnQob3V0KSA8PCAiLSAodm9pZCkgZW5jb2RlV2l0aENvZGVyOiAoTlNDb2RlciAqKSBlbmNvZGVyIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICAvLyBOU0V4Y2VwdGlvbnMgY29uZm9ybSB0byBOU0NvZGluZywgc28gd2UgY2FuIGNhbGwgc3VwZXIKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltzdXBlciBlbmNvZGVXaXRoQ29kZXI6IGVuY29kZXJdOyIgPDwgZW5kbDsKKyAgfQorCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIklzU2V0KSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHQpKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltlbmNvZGVyIGVuY29kZU9iamVjdDogXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZm9yS2V5OiBAXCIiCisgICAgICAgICAgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodC0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltlbmNvZGVyIGVuY29kZUludDogXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZm9yS2V5OiBAXCIiCisgICAgICAgICAgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdCktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW2VuY29kZXIgZW5jb2RlQm9vbDogXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZm9yS2V5OiBAXCIiCisgICAgICAgICAgICA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbZW5jb2RlciBlbmNvZGVJbnQ6IF8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZvcktleTogQFwiIgorICAgICAgICAgICAgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltlbmNvZGVyIGVuY29kZUludDogXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZm9yS2V5OiBAXCIiCisgICAgICAgICAgICA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW2VuY29kZXIgZW5jb2RlSW50MzI6IF8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZvcktleTogQFwiIgorICAgICAgICAgICAgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltlbmNvZGVyIGVuY29kZUludDY0OiBfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiBmb3JLZXk6IEBcIiIKKyAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbZW5jb2RlciBlbmNvZGVEb3VibGU6IF8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZvcktleTogQFwiIgorICAgICAgICAgICAgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogZG9uJ3Qga25vdyBob3cgdG8gZW5jb2RlIHRocmlmdCB0eXBlOiAiCisgICAgICAgICAgICArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfQorICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGUgdGhlIGNvcHkgbWV0aG9kIGZvciB0aGlzIHN0cnVjdAorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfY29weV9tZXRob2Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICItIChpbnN0YW5jZXR5cGUpIGNvcHlXaXRoWm9uZTooTlNab25lICopem9uZSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiIHZhbCA9IFsiIDw8IGNvY29hX3ByZWZpeF8gPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIGVycm9yV2l0aERvbWFpbjogc2VsZi5kb21haW4gY29kZTogc2VsZi5jb2RlIHVzZXJJbmZvOiBzZWxmLnVzZXJJbmZvXTsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiIHZhbCA9IFsiIDw8IGNvY29hX3ByZWZpeF8gPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIG5ld107IiA8PCBlbmRsOworICB9CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKF8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiSXNTZXQpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodCkpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidmFsLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBbc2VsZi4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGNvcHldOyI7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidmFsLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBzZWxmLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IjsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihvdXQpOworICB9CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdmFsOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlIHRoZSBoYXNoIG1ldGhvZCBmb3IgdGhpcyBzdHJ1Y3QKKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X2hhc2hfbWV0aG9kKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgIi0gKE5TVUludGVnZXIpIGhhc2giIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiTlNVSW50ZWdlciBoYXNoID0gMTc7IiA8PCBlbmRsOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImhhc2ggPSAoaGFzaCAqIDMxKSBeIF8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICA8PCAiSXNTZXQgPyAyNjU0NDM1NzYxIDogMDsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJJc1NldCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0KSkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJoYXNoID0gKGhhc2ggKiAzMSkgXiBbXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgaGFzaF07IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImhhc2ggPSAoaGFzaCAqIDMxKSBeIFtAKF8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSBoYXNoXTsiCisgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisgICAgc2NvcGVfZG93bihvdXQpOworICB9CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gaGFzaDsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGUgdGhlIGlzRXF1YWwgbWV0aG9kIGZvciB0aGlzIHN0cnVjdAorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaXNfZXF1YWxfbWV0aG9kKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIGluZGVudChvdXQpIDw8ICItIChCT09MKSBpc0VxdWFsOiAoaWQpIGFuT2JqZWN0IiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIGluZGVudChvdXQpIDw8ICJpZiAoc2VsZiA9PSBhbk9iamVjdCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gWUVTOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgc3RyaW5nIGNsYXNzX25hbWUgPSBjb2NvYV9wcmVmaXhfICsgdHN0cnVjdC0+Z2V0X25hbWUoKTsKKworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlmICghW3N1cGVyIGlzRXF1YWw6YW5PYmplY3RdKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gTk87IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorICBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFbYW5PYmplY3QgaXNLaW5kT2ZDbGFzczpbIiA8PCBjbGFzc19uYW1lIDw8ICIgY2xhc3NdXSkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBpZiAoIW1lbWJlcnMuZW1wdHkoKSkgeworICAgIGluZGVudChvdXQpIDw8IGNsYXNzX25hbWUgPDwgIiAqb3RoZXIgPSAoIiA8PCBjbGFzc19uYW1lIDw8ICIgKilhbk9iamVjdDsiIDw8IGVuZGw7CisKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICBzdHJpbmcgbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHQpKSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKChfIiA8PCBuYW1lIDw8ICJJc1NldCAhPSBvdGhlci0+XyIgPDwgbmFtZSA8PCAiSXNTZXQpIHx8IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAgICIKKyAgICAgICAgICAgIDw8ICIoXyIgPDwgbmFtZSA8PCAiSXNTZXQgJiYgIgorICAgICAgICAgICAgPDwgIigoXyIgPDwgbmFtZSA8PCAiIHx8IG90aGVyLT5fIiA8PCBuYW1lIDw8ICIpICYmICIKKyAgICAgICAgICAgIDw8ICIhW18iIDw8IG5hbWUgPDwgIiBpc0VxdWFsOm90aGVyLT5fIiA8PCBuYW1lIDw8ICJdKSkpIHsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgoXyIgPDwgbmFtZSA8PCAiSXNTZXQgIT0gb3RoZXItPl8iIDw8IG5hbWUgPDwgIklzU2V0KSB8fCIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgICAiCisgICAgICAgICAgICA8PCAiKF8iIDw8IG5hbWUgPDwgIklzU2V0ICYmICIKKyAgICAgICAgICAgIDw8ICIoXyIgPDwgbmFtZSA8PCAiICE9IG90aGVyLT5fIiA8PCBuYW1lIDw8ICIpKSkgeyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiBOTzsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gWUVTOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZSBzdHJ1Y3QgaW1wbGVtZW50YXRpb24uCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgICAgICBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqIEBwYXJhbSBpc19leGNlcHRpb24gSXMgdGhpcyBhbiBleGNlcHRpb24/CisgKiBAcGFyYW0gaXNfcmVzdWx0ICAgIElmIHRoaXMgaXMgYSByZXN1bHQgaXQgbmVlZHMgYSBkaWZmZXJlbnQgd3JpdGVyCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbXBsZW1lbnRhdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQpIHsKKyAgaW5kZW50KG91dCkgPDwgIkBpbXBsZW1lbnRhdGlvbiAiIDw8IGNvY29hX3ByZWZpeF8gPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCBlbmRsIDw8IGVuZGw7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICAvLyBleGNlcHRpb25zIG5lZWQgdG8gY2FsbCB0aGUgZGVzaWduYXRlZCBpbml0aWFsaXplciBvbiBOU0V4Y2VwdGlvbgorICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICItIChpbnN0YW5jZXR5cGUpIGluaXQiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBbc3VwZXIgaW5pdFdpdGhEb21haW46ICIgPDwgY29jb2FfcHJlZml4XyA8PCBjYXBpdGFsaXplKHByb2dyYW1fbmFtZV8pIDw8ICJFcnJvckRvbWFpbiIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogIiA8PCBjb2NvYV9wcmVmaXhfIDw8IGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXykgPDwgIkVycm9yIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgdXNlckluZm86IG5pbF07IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICAvLyBzdHJ1Y3QKKworICAgIC8vIGRlZmF1bHQgaW5pdGlhbGl6ZXIKKyAgICAvLyBzZXR1cCBpbnN0YW5jZSB2YXJpYWJsZXMgd2l0aCBkZWZhdWx0IHZhbHVlcworICAgIGluZGVudChvdXQpIDw8ICItIChpbnN0YW5jZXR5cGUpIGluaXQiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBpbmRlbnQob3V0KSA8PCAic2VsZiA9IFtzdXBlciBpbml0XTsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgImlmIChzZWxmKSI7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgICAgICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VsZi4iICsgKCptX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgc2NvcGVfZG93bihvdXQpOworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gc2VsZjsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihvdXQpOworICAgIG91dCA8PCBlbmRsOworICB9CisKKyAgLy8gaW5pdGlhbGl6ZXIgd2l0aCBhbGwgZmllbGRzIGFzIHBhcmFtcworICBpZiAoIW1lbWJlcnMuZW1wdHkoKSkgeworICAgIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbml0aWFsaXplcl9zaWduYXR1cmUob3V0LCB0c3RydWN0KTsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICAgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAic2VsZiA9IFtzZWxmIGluaXRdOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJzZWxmID0gW3N1cGVyIGluaXRdOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHNlbGYpIjsKKyAgICBzY29wZV91cChvdXQpOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiOworICAgICAgaWYgKGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgICAgb3V0IDw8ICJbIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiBtdXRhYmxlQ29weV07IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJJc1NldCA9IFlFUzsiIDw8IGVuZGw7CisgICAgfQorICAgIHNjb3BlX2Rvd24ob3V0KTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHNlbGY7IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKyAgfQorCisgIC8vIGluaXRXaXRoQ29kZXIgZm9yIE5TQ29kaW5nCisgIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbml0X3dpdGhfY29kZXJfbWV0aG9kKG91dCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKKyAgLy8gZW5jb2RlV2l0aENvZGVyIGZvciBOU0NvZGluZworICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfZW5jb2RlX3dpdGhfY29kZXJfbWV0aG9kKG91dCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKKyAgLy8gaGFzaCBhbmQgaXNFcXVhbCBmb3IgTlNPYmplY3QKKyAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2hhc2hfbWV0aG9kKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pc19lcXVhbF9tZXRob2Qob3V0LCB0c3RydWN0LCBpc19leGNlcHRpb24pOworICAvLyBjb3B5IGZvciBOU09iamVjdAorICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfY29weV9tZXRob2Qob3V0LCB0c3RydWN0LCBpc19leGNlcHRpb24pOworCisgIC8vIHRoZSByZXN0IG9mIHRoZSBtZXRob2RzCisgIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9maWVsZF9hY2Nlc3Nvcl9pbXBsZW1lbnRhdGlvbnMob3V0LCB0c3RydWN0LCBpc19leGNlcHRpb24pOworICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7CisgIGlmIChpc19yZXN1bHQpIHsKKyAgICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOworICB9IGVsc2UgeworICAgIGdlbmVyYXRlX2NvY29hX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKKyAgfQorICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfdmFsaWRhdG9yKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9kZXNjcmlwdGlvbihvdXQsIHRzdHJ1Y3QpOworCisgIG91dCA8PCAiQGVuZCIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHJlYWQgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdC4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIG91dCA8PCAiLSAoQk9PTCkgcmVhZDogKGlkIDxUUHJvdG9jb2w+KSBpblByb3RvY29sIGVycm9yOiAoTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopX190aHJpZnRFcnJvciIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gRGVjbGFyZSBzdGFjayB0bXAgdmFyaWFibGVzCisgIGluZGVudChvdXQpIDw8ICJOU1N0cmluZyAqIGZpZWxkTmFtZTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJTSW50MzIgZmllbGRUeXBlOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIlNJbnQzMiBmaWVsZElEOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgImlmICghW2luUHJvdG9jb2wgcmVhZFN0cnVjdEJlZ2luUmV0dXJuaW5nTmFtZTogTlVMTCBlcnJvcjogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisKKyAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCisgIGluZGVudChvdXQpIDw8ICJ3aGlsZSAodHJ1ZSkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgLy8gUmVhZCBiZWdpbm5pbmcgZmllbGQgbWFya2VyCisgIGluZGVudChvdXQpCisgICAgICA8PCAiaWYgKCFbaW5Qcm90b2NvbCByZWFkRmllbGRCZWdpblJldHVybmluZ05hbWU6ICZmaWVsZE5hbWUgdHlwZTogJmZpZWxkVHlwZSBmaWVsZElEOiAmZmllbGRJRCBlcnJvcjogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiCisgICAgICA8PCBlbmRsOworCisgIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKKyAgaW5kZW50KG91dCkgPDwgImlmIChmaWVsZFR5cGUgPT0gVFR5cGVTVE9QKSB7ICIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIC8vIFN3aXRjaCBzdGF0ZW1lbnQgb24gdGhlIGZpZWxkIHdlIGFyZSByZWFkaW5nCisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkSUQpIiA8PCBlbmRsOworCisgIHNjb3BlX3VwKG91dCk7CisKKyAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGZpZWxkVHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJmaWVsZFZhbHVlIik7CisgICAgaW5kZW50KG91dCkgPDwgY2FsbF9maWVsZF9zZXR0ZXIoKmZfaXRlciwgImZpZWxkVmFsdWUiKSA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7ICIgPDwgZW5kbDsKKyAgICBpZiAobG9nX3VuZXhwZWN0ZWRfKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgTlNMb2coQFwiJXM6IGZpZWxkIElEICVpIGhhcyB1bmV4cGVjdGVkIHR5cGUgJWkuICBTa2lwcGluZy5cIiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJfX1BSRVRUWV9GVU5DVElPTl9fLCAoaW50KWZpZWxkSUQsIChpbnQpZmllbGRUeXBlKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIGlmICghW1RQcm90b2NvbFV0aWwgc2tpcFR5cGU6IGZpZWxkVHlwZSBvblByb3RvY29sOiBpblByb3RvY29sIGVycm9yOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgLy8gSW4gdGhlIGRlZmF1bHQgY2FzZSB3ZSBza2lwIHRoZSBmaWVsZAorICBvdXQgPDwgaW5kZW50KCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICBpZiAobG9nX3VuZXhwZWN0ZWRfKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIE5TTG9nKEBcIiVzOiB1bmV4cGVjdGVkIGZpZWxkIElEICVpIHdpdGggdHlwZSAlaS4gIFNraXBwaW5nLlwiLCAiCisgICAgICAgICAgICAgICAgICAgICAgICJfX1BSRVRUWV9GVU5DVElPTl9fLCAoaW50KWZpZWxkSUQsIChpbnQpZmllbGRUeXBlKTsiIDw8IGVuZGw7CisgIH0KKworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgaWYgKCFbVFByb3RvY29sVXRpbCBza2lwVHlwZTogZmllbGRUeXBlIG9uUHJvdG9jb2w6IGluUHJvdG9jb2wgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBicmVhazsiIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIC8vIFJlYWQgZmllbGQgZW5kIG1hcmtlcgorICBpbmRlbnQob3V0KSA8PCAiaWYgKCFbaW5Qcm90b2NvbCByZWFkRmllbGRFbmQ6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghW2luUHJvdG9jb2wgcmVhZFN0cnVjdEVuZDogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisKKyAgLy8gcGVyZm9ybXMgdmFyaW91cyBjaGVja3MgKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCisgIGlmICh2YWxpZGF0ZV9yZXF1aXJlZF8pIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghW3NlbGYgdmFsaWRhdGU6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiBZRVM7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHdyaXRlIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiLSAoQk9PTCkgd3JpdGU6IChpZCA8VFByb3RvY29sPikgb3V0UHJvdG9jb2wgZXJyb3I6IChOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKilfX3RocmlmdEVycm9yIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFbb3V0UHJvdG9jb2wgd3JpdGVTdHJ1Y3RCZWdpbldpdGhOYW1lOiBAXCIiIDw8IG5hbWUgPDwgIlwiIGVycm9yOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKF8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiSXNTZXQpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgYm9vbCBudWxsX2FsbG93ZWQgPSB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKG51bGxfYWxsb3dlZCkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoXyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT0gbmlsKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorCisgICAgaW5kZW50KG91dCkgPDwgImlmICghW291dFByb3RvY29sIHdyaXRlRmllbGRCZWdpbldpdGhOYW1lOiBAXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgIDw8ICJcIiB0eXBlOiAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpCisgICAgICAgICAgICAgICAgPDwgIiBmaWVsZElEOiAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworCisgICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAiXyIgKyAoKmZfaXRlciktPmdldF9uYW1lKCkpOworCisgICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCisgICAgaW5kZW50KG91dCkgPDwgImlmICghW291dFByb3RvY29sIHdyaXRlRmllbGRFbmQ6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworCisgICAgaWYgKG51bGxfYWxsb3dlZCkgeworICAgICAgc2NvcGVfZG93bihvdXQpOworICAgIH0KKyAgICBzY29wZV9kb3duKG91dCk7CisgIH0KKyAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIVtvdXRQcm90b2NvbCB3cml0ZUZpZWxkU3RvcDogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoIVtvdXRQcm90b2NvbCB3cml0ZVN0cnVjdEVuZDogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiBZRVM7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHdyaXRlIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QsIHdoaWNoCisgKiBpcyBhIGZ1bmN0aW9uIHJlc3VsdC4gVGhlc2UgZmllbGRzIGFyZSBvbmx5IHdyaXR0ZW4gaWYgdGhleSBhcmUKKyAqIHNldCwgYW5kIG9ubHkgb25lIG9mIHRoZW0gY2FuIGJlIHNldCBhdCBhIHRpbWUuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICItIChCT09MKSB3cml0ZTogKGlkIDxUUHJvdG9jb2w+KSBvdXRQcm90b2NvbCBlcnJvcjogKE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKV9fdGhyaWZ0RXJyb3IgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIVtvdXRQcm90b2NvbCB3cml0ZVN0cnVjdEJlZ2luV2l0aE5hbWU6IEBcIiIgPDwgbmFtZSA8PCAiXCIgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworCisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiAiOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgIiBlbHNlIGlmICI7CisgICAgfQorCisgICAgb3V0IDw8ICIoXyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJJc1NldCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGJvb2wgbnVsbF9hbGxvd2VkID0gdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpOworICAgIGlmIChudWxsX2FsbG93ZWQpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKF8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9IG5pbCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKworICAgIGluZGVudChvdXQpIDw8ICJpZiAoIVtvdXRQcm90b2NvbCB3cml0ZUZpZWxkQmVnaW5XaXRoTmFtZTogQFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICA8PCAiXCIgdHlwZTogIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKQorICAgICAgICAgICAgICAgIDw8ICIgZmllbGRJRDogIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiIGVycm9yOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgIl8iICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgorICAgIGluZGVudChvdXQpIDw8ICJpZiAoIVtvdXRQcm90b2NvbCB3cml0ZUZpZWxkRW5kOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKworICAgIGlmIChudWxsX2FsbG93ZWQpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IjsKKyAgfQorICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAorICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFbb3V0UHJvdG9jb2wgd3JpdGVGaWVsZFN0b3A6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IgorICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFbb3V0UHJvdG9jb2wgd3JpdGVTdHJ1Y3RFbmQ6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IgorICAgICAgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIFlFUzsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gcGVyZm9ybSB2YXJpb3VzIGNoZWNrcworICogKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF92YWxpZGF0b3Iob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgIi0gKEJPT0wpIHZhbGlkYXRlOiAoTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopX190aHJpZnRFcnJvciB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIvLyBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIiA8PCBlbmRsOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfZmllbGQqIGZpZWxkID0gKCpmX2l0ZXIpOworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghXyIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIklzU2V0KSAiOworICAgICAgc2NvcGVfdXAob3V0KTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoX190aHJpZnRFcnJvcikgIjsKKyAgICAgIHNjb3BlX3VwKG91dCk7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIipfX3RocmlmdEVycm9yID0gW05TRXJyb3IgZXJyb3JXaXRoRG9tYWluOiBUUHJvdG9jb2xFcnJvckRvbWFpbiIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogVFByb3RvY29sRXJyb3JVbmtub3duIiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOiBAe1RQcm90b2NvbEVycm9yRXh0ZW5kZWRFcnJvcktleTogQChUUHJvdG9jb2xFeHRlbmRlZEVycm9yTWlzc2luZ1JlcXVpcmVkRmllbGQpLCIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xFcnJvckZpZWxkTmFtZUtleTogQFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwifV07IiA8PCBlbmRsOworICAgICAgc2NvcGVfZG93bihvdXQpOworICAgICAgc2NvcGVfZG93bihvdXQpOworICAgIH0KKyAgfQorICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIFlFUzsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlIHByb3BlcnR5IGFjY2Vzc29yIG1ldGhvZHMgZm9yIGFsbCBmaWVsZHMgaW4gdGhlIHN0cnVjdC4KKyAqIGdldHRlciwgc2V0dGVyLCBpc3NldCBnZXR0ZXIuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF9maWVsZF9hY2Nlc3Nvcl9pbXBsZW1lbnRhdGlvbnMob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKKyAgKHZvaWQpaXNfZXhjZXB0aW9uOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOworICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoZmllbGQtPmdldF90eXBlKCkpOworICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKKyAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGZpZWxkX25hbWU7CisgICAgY2FwX25hbWVbMF0gPSB0b3VwcGVyKGNhcF9uYW1lWzBdKTsKKworICAgIC8vIFNpbXBsZSBzZXR0ZXIKKyAgICBpbmRlbnQob3V0KSA8PCAiLSAodm9pZCkgc2V0IiA8PCBjYXBfbmFtZSA8PCAiOiAoIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIpICIgPDwgZmllbGRfbmFtZQorICAgICAgICAgICAgICAgIDw8ICIgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiXyIgPDwgZmllbGRfbmFtZSA8PCAiID0gIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJfIiA8PCBmaWVsZF9uYW1lIDw8ICJJc1NldCA9IFlFUzsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gVW5zZXR0ZXIgLSBkbyB3ZSBuZWVkIHRoaXM/CisgICAgaW5kZW50KG91dCkgPDwgIi0gKHZvaWQpIHVuc2V0IiA8PCBjYXBfbmFtZSA8PCAiIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJfIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBuaWw7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAiXyIgPDwgZmllbGRfbmFtZSA8PCAiSXNTZXQgPSBOTzsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZGVzY3JpcHRpb24gbWV0aG9kIGZvciB0aGUgZ2l2ZW4gc3RydWN0CisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF9kZXNjcmlwdGlvbihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisKKyAgLy8gQWxsb3cgdXNlIG9mIGRlYnVnRGVzY3JpcHRpb24gc28gdGhlIGFwcCBjYW4gYWRkIGRlc2NyaXB0aW9uIHZpYSBhIGNhdGVvZ29yeS9leHRlbnNpb24KKyAgaWYgKGRlYnVnX2Rlc2NyaXB0aW9uc18pIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIi0gKE5TU3RyaW5nICopIGRlYnVnRGVzY3JpcHRpb24geyIgPDwgZW5kbDsKKyAgfQorICBlbHNlIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIi0gKE5TU3RyaW5nICopIGRlc2NyaXB0aW9uIHsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJOU011dGFibGVTdHJpbmcgKiBtcyA9IFtOU011dGFibGVTdHJpbmcgc3RyaW5nV2l0aFN0cmluZzogQFwiIgorICAgICAgPDwgY29jb2FfcHJlZml4XyA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoXCJdOyIgPDwgZW5kbDsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJbbXMgYXBwZW5kU3RyaW5nOiBAXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOlwiXTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJbbXMgYXBwZW5kU3RyaW5nOiBAXCIsIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjpcIl07IiA8PCBlbmRsOworICAgIH0KKyAgICB0X3R5cGUqIHR0eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgIGluZGVudChvdXQpIDw8ICJbbXMgYXBwZW5kRm9ybWF0OiBAXCIiIDw8IGZvcm1hdF9zdHJpbmdfZm9yX3R5cGUodHR5cGUpIDw8ICJcIiwgIgorICAgICAgICAgICAgICAgIDw8IGZvcm1hdF9jYXN0X2Zvcl90eXBlKHR0eXBlKSA8PCAiXyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJdOyIgPDwgZW5kbDsKKyAgfQorICBvdXQgPDwgaW5kZW50KCkgPDwgIlttcyBhcHBlbmRTdHJpbmc6IEBcIilcIl07IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAicmV0dXJuIFtOU1N0cmluZyBzdHJpbmdXaXRoU3RyaW5nOiBtc107IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuICBJbiBPYmplY3RpdmUtQyB0aGlzIGNvbnNpc3RzIG9mIGEKKyAqIHByb3RvY29sIGRlZmluaXRpb24sIGEgY2xpZW50IGludGVyZmFjZSBhbmQgYSBjbGllbnQgaW1wbGVtZW50YXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfcHJvdG9jb2woZl9oZWFkZXJfLCB0c2VydmljZSk7CisgIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X2ludGVyZmFjZShmX2hlYWRlcl8sIHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9zZXJ2ZXJfaW50ZXJmYWNlKGZfaGVhZGVyXywgdHNlcnZpY2UpOworICBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOworICBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9pbXBsZW1lbnRhdGlvbihmX2ltcGxfLCB0c2VydmljZSk7CisgIGdlbmVyYXRlX2NvY29hX3NlcnZpY2Vfc2VydmVyX2ltcGxlbWVudGF0aW9uKGZfaW1wbF8sIHRzZXJ2aWNlKTsKKyAgaWYgKGFzeW5jX2NsaWVudHNfKSB7CisgICAgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9hc3luY19wcm90b2NvbChmX2hlYWRlcl8sIHRzZXJ2aWNlKTsKKyAgICBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9hc3luY19pbnRlcmZhY2UoZl9oZWFkZXJfLCB0c2VydmljZSk7CisgICAgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfYXN5bmNfaW1wbGVtZW50YXRpb24oZl9pbXBsXywgdHNlcnZpY2UpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHN0cnVjdHMgZm9yIGFsbCB0aGUgc2VydmljZSByZXR1cm4gdHlwZXMKKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UKKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisKKyAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisKKyAgICBzdHJpbmcgcW5hbWUgPSBmdW5jdGlvbl9hcmdzX2hlbHBlcl9zdHJ1Y3RfdHlwZSh0c2VydmljZSwgKmZfaXRlcik7CisKKyAgICB0X3N0cnVjdCBxbmFtZV90cyA9IHRfc3RydWN0KHRzLT5nZXRfcHJvZ3JhbSgpLCBxbmFtZSk7CisKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHMtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIHFuYW1lX3RzLmFwcGVuZCgqbV9pdGVyKTsKKyAgICB9CisKKyAgICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW50ZXJmYWNlKGZfaW1wbF8sICZxbmFtZV90cywgZmFsc2UpOworICAgIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbXBsZW1lbnRhdGlvbihmX2ltcGxfLCAmcW5hbWVfdHMsIGZhbHNlLCBmYWxzZSk7CisgICAgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0c2VydmljZSwgKmZfaXRlcik7CisgIH0KK30KKworc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpmdW5jdGlvbl9yZXN1bHRfaGVscGVyX3N0cnVjdF90eXBlKHRfc2VydmljZSAqdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIHJldHVybiB0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7CisgIH0KK30KKworc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpmdW5jdGlvbl9hcmdzX2hlbHBlcl9zdHJ1Y3RfdHlwZSh0X3NlcnZpY2UgKnRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgcmV0dXJuIHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X3NlcnZpY2UgKnRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBjcmVhdGUgYSByZXN1bHQgc3RydWN0IHdpdGggYSBzdWNjZXNzIGZpZWxkIG9mIHRoZSByZXR1cm4gdHlwZSwKKyAgLy8gYW5kIGEgZmllbGQgZm9yIGVhY2ggdHlwZSBvZiBleGNlcHRpb24gdGhyb3duCisgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgZnVuY3Rpb25fcmVzdWx0X2hlbHBlcl9zdHJ1Y3RfdHlwZSh0c2VydmljZSwgdGZ1bmN0aW9uKSk7CisgIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7CisgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKKyAgfQorCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7CisgIH0KKworICAvLyBnZW5lcmF0ZSB0aGUgcmVzdWx0IHN0cnVjdAorICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW50ZXJmYWNlKGZfaW1wbF8sICZyZXN1bHQsIGZhbHNlKTsKKyAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ltcGxlbWVudGF0aW9uKGZfaW1wbF8sICZyZXN1bHQsIGZhbHNlLCB0cnVlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHByb3RvY29sIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgcHJvdG9jb2wgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc2VydmljZV9wcm90b2NvbChvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgb3V0IDw8ICJAcHJvdG9jb2wgIiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICIgPE5TT2JqZWN0PiIgPDwgZW5kbDsKKworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBvdXQgPDwgIi0gIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgdHJ1ZSkgPDwgIjsiCisgICAgICAgIDw8ICIgIC8vIHRocm93cyAiOworICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICBvdXQgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSkgKyAiLCAiOworICAgIH0KKyAgICBvdXQgPDwgIlRFeGNlcHRpb24iIDw8IGVuZGw7CisgIH0KKyAgb3V0IDw8ICJAZW5kIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGFuIGFzeW5jaHJvbm91cyBzZXJ2aWNlIHByb3RvY29sIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgcHJvdG9jb2wgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc2VydmljZV9hc3luY19wcm90b2NvbChvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgb3V0IDw8ICJAcHJvdG9jb2wgIiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJBc3luYyIKKyAgICAgIDw8ICIgPE5TT2JqZWN0PiIgPDwgZW5kbDsKKworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBvdXQgPDwgIi0gIiA8PCBhc3luY19mdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgZmFsc2UpIDw8ICI7IiA8PCBlbmRsOworICAgIGlmIChwcm9taXNlX2tpdF8pIHsKKyAgICAgIG91dCA8PCAiLSAiIDw8IHByb21pc2VfZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgfQorICBvdXQgPDwgIkBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBjbGllbnQgaW50ZXJmYWNlIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X2ludGVyZmFjZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBvdXQgPDwgIkBpbnRlcmZhY2UgIiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJDbGllbnQgOiBUQmFzZUNsaWVudCA8IgorICAgICAgPDwgY29jb2FfcHJlZml4XyA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiPiAiIDw8IGVuZGw7CisKKyAgb3V0IDw8ICItIChpZCkgaW5pdFdpdGhQcm90b2NvbDogKGlkIDxUUHJvdG9jb2w+KSBwcm90b2NvbDsiIDw8IGVuZGw7CisgIG91dCA8PCAiLSAoaWQpIGluaXRXaXRoSW5Qcm90b2NvbDogKGlkIDxUUHJvdG9jb2w+KSBpblByb3RvY29sIG91dFByb3RvY29sOiAoaWQgPFRQcm90b2NvbD4pICIKKyAgICAgICAgICJvdXRQcm90b2NvbDsiIDw8IGVuZGw7CisgIG91dCA8PCAiQGVuZCIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGludGVyZmFjZSBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGNsaWVudCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfYXN5bmNfaW50ZXJmYWNlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIG91dCA8PCAiQGludGVyZmFjZSAiIDw8IGNvY29hX3ByZWZpeF8gPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkNsaWVudEFzeW5jIDogVEJhc2VDbGllbnQgPCIKKyAgICAgIDw8IGNvY29hX3ByZWZpeF8gPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkFzeW5jPiAiIDw8IGVuZGwKKyAgICAgIDw8IGVuZGw7CisKKyAgb3V0IDw8ICItIChpZCkgaW5pdFdpdGhQcm90b2NvbEZhY3Rvcnk6IChpZCA8VFByb3RvY29sRmFjdG9yeT4pIHByb3RvY29sRmFjdG9yeSAiCisgICAgICA8PCAidHJhbnNwb3J0RmFjdG9yeTogKGlkIDxUQXN5bmNUcmFuc3BvcnRGYWN0b3J5PikgdHJhbnNwb3J0RmFjdG9yeTsiIDw8IGVuZGw7CisgIG91dCA8PCAiQGVuZCIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGludGVyZmFjZSBkZWZpbml0aW9uLiBJbiBvdGhlciB3b3JkcywgdGhlIFRQcm9jZXNzIGltcGxlbWVudGF0aW9uIGZvcgorICp0aGUKKyAqIHNlcnZpY2UgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBjbGllbnQgaW50ZXJmYWNlIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3NlcnZpY2Vfc2VydmVyX2ludGVyZmFjZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBvdXQgPDwgIkBpbnRlcmZhY2UgIiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpCisgICAgICA8PCAiUHJvY2Vzc29yIDogTlNPYmplY3QgPFRQcm9jZXNzb3I+ICIgPDwgZW5kbDsKKworICBvdXQgPDwgIi0gKGlkKSBpbml0V2l0aCIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIjogKGlkIDwiIDw8IGNvY29hX3ByZWZpeF8KKyAgICAgIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICI+KSBzZXJ2aWNlOyIgPDwgZW5kbDsKKyAgb3V0IDw8ICItIChpZDwiIDw8IGNvY29hX3ByZWZpeF8gPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIj4pIHNlcnZpY2U7IiA8PCBlbmRsOworCisgIG91dCA8PCAiQGVuZCIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9zZW5kX2Z1bmN0aW9uX2ltcGxlbWVudGF0aW9uKAorICAgIG9zdHJlYW0mIG91dCwKKyAgICB0X3NlcnZpY2UgKnRzZXJ2aWNlLAorICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICBib29sIG5lZWRzX3Byb3RvY29sKSB7CisgIHN0cmluZyBmdW5uYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpOworCisgIHRfZnVuY3Rpb24gc2VuZF9mdW5jdGlvbihnX3R5cGVfYm9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygic2VuZF8iKSArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSk7CisKKyAgc3RyaW5nIGFyZ3NuYW1lID0gZnVuY3Rpb25fYXJnc19oZWxwZXJfc3RydWN0X3R5cGUodHNlcnZpY2UsIHRmdW5jdGlvbik7CisKKyAgLy8gT3BlbiBmdW5jdGlvbgorICBpbmRlbnQob3V0KSA8PCAiLSAoQk9PTCkgc2VuZF8iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSwgbmVlZHNfcHJvdG9jb2wgPyAib3V0UHJvdG9jb2wiIDogIiIsIHRydWUpIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFbb3V0UHJvdG9jb2wgd3JpdGVNZXNzYWdlQmVnaW5XaXRoTmFtZTogQFwiIiA8PCBmdW5uYW1lIDw8ICJcIiIKKyAgICAgIDw8ICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpID8gIiB0eXBlOiBUTWVzc2FnZVR5cGVPTkVXQVkiIDogIiB0eXBlOiBUTWVzc2FnZVR5cGVDQUxMIikKKyAgICAgIDw8ICIgc2VxdWVuY2VJRDogMCBlcnJvcjogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIVtvdXRQcm90b2NvbCB3cml0ZVN0cnVjdEJlZ2luV2l0aE5hbWU6IEBcIiIgPDwgYXJnc25hbWUKKyAgICAgICAgICAgICAgICAgIDw8ICJcIiBlcnJvcjogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisKKyAgLy8gd3JpdGUgb3V0IGZ1bmN0aW9uIHBhcmFtZXRlcnMKKyAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgIHN0cmluZyBmaWVsZE5hbWUgPSAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCgoKmZsZF9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgZmllbGROYW1lIDw8ICIgIT0gbmlsKSI7CisgICAgICBzY29wZV91cChvdXQpOworICAgIH0KKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghW291dFByb3RvY29sIHdyaXRlRmllbGRCZWdpbldpdGhOYW1lOiBAXCIiIDw8IGZpZWxkTmFtZQorICAgICAgICA8PCAiXCIiCisgICAgICAgICAgICIgdHlwZTogIiA8PCB0eXBlX3RvX2VudW0oKCpmbGRfaXRlciktPmdldF90eXBlKCkpCisgICAgICAgIDw8ICIgZmllbGRJRDogIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X2tleSgpIDw8ICIgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworCisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZsZF9pdGVyLCBmaWVsZE5hbWUpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIVtvdXRQcm90b2NvbCB3cml0ZUZpZWxkRW5kOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKworICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKCgqZmxkX2l0ZXIpLT5nZXRfdHlwZSgpKSkgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghW291dFByb3RvY29sIHdyaXRlRmllbGRTdG9wOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIVtvdXRQcm90b2NvbCB3cml0ZVN0cnVjdEVuZDogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFbb3V0UHJvdG9jb2wgd3JpdGVNZXNzYWdlRW5kOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gWUVTOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgZW5kbDsKK30KKwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfcmVjdl9mdW5jdGlvbl9pbXBsZW1lbnRhdGlvbigKKyAgICBvc3RyZWFtJiBvdXQsCisgICAgdF9zZXJ2aWNlKiB0c2VydmljZSwKKyAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCisgICAgYm9vbCBuZWVkc19wcm90b2NvbCkgeworCisKKyAgLy8gT3BlbiBmdW5jdGlvbgorICBpbmRlbnQob3V0KSA8PCAiLSAoQk9PTCkgcmVjdl8iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIG91dCA8PCAiOiAoIiA8PCB0eXBlX25hbWUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCBmYWxzZSwgdHJ1ZSkgPDwgIiAqKSByZXN1bHQgIjsKKyAgICBpZiAobmVlZHNfcHJvdG9jb2wpIHsKKyAgICAgIG91dCA8PCAicHJvdG9jb2wiOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgImVycm9yIjsKKyAgICB9CisgIH0KKyAgaWYgKG5lZWRzX3Byb3RvY29sKSB7CisgICAgb3V0IDw8ICI6IChpZDxUUHJvdG9jb2w+KSBpblByb3RvY29sIGVycm9yIjsKKyAgfQorICBvdXQgPDwgIjogKE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKV9fdGhyaWZ0RXJyb3IiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgLy8gVE9ETyhtY3NsZWUpOiBNZXNzYWdlIHZhbGlkYXRpb24gaGVyZSwgd2FzIHRoZSBzZXFpZCBldGMgb2s/CisKKyAgLy8gY2hlY2sgZm9yIGFuIGV4Y2VwdGlvbgorICBvdXQgPDwgaW5kZW50KCkgPDwgIk5TRXJyb3IgKmluY29taW5nRXhjZXB0aW9uID0gW3NlbGYgY2hlY2tJbmNvbWluZ01lc3NhZ2VFeGNlcHRpb246IGluUHJvdG9jb2xdOyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgImlmIChpbmNvbWluZ0V4Y2VwdGlvbikiOworICBzY29wZV91cChvdXQpOworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChfX3RocmlmdEVycm9yKSI7CisgIHNjb3BlX3VwKG91dCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiKl9fdGhyaWZ0RXJyb3IgPSBpbmNvbWluZ0V4Y2VwdGlvbjsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gTk87IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisKKyAgLy8gRklYTUUgLSBjb3VsZCBvcHRpbWl6ZSBoZXJlIHRvIHJlZHVjZSBjcmVhdGlvbiBvZiB0ZW1wb3Jhcnkgb2JqZWN0cy4KKyAgc3RyaW5nIHJlc3VsdG5hbWUgPSBmdW5jdGlvbl9yZXN1bHRfaGVscGVyX3N0cnVjdF90eXBlKHRzZXJ2aWNlLCB0ZnVuY3Rpb24pOworICBvdXQgPDwgaW5kZW50KCkgPDwgY29jb2FfcHJlZml4XyA8PCByZXN1bHRuYW1lIDw8ICIgKiByZXN1bHRlciA9IFsiIDw8IGNvY29hX3ByZWZpeF8gPDwgcmVzdWx0bmFtZSA8PCAiIG5ld107IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiaWYgKCFbcmVzdWx0ZXIgcmVhZDogaW5Qcm90b2NvbCBlcnJvcjogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJpZiAoIVtpblByb3RvY29sIHJlYWRNZXNzYWdlRW5kOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKworICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KKyAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdGVyLnN1Y2Nlc3NJc1NldCkiOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIqcmVzdWx0ID0gcmVzdWx0ZXIuc3VjY2VzczsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gWUVTOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKG91dCk7CisgIH0KKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdGVyLiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJJc1NldCkiOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoX190aHJpZnRFcnJvcikiOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIqX190aHJpZnRFcnJvciA9IFtyZXN1bHRlciAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXTsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKG91dCk7CisgIH0KKworICAvLyBJZiB5b3UgZ2V0IGhlcmUgaXQncyBhbiBleGNlcHRpb24sIHVubGVzcyBhIHZvaWQgZnVuY3Rpb24KKyAgaWYgKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiBZRVM7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKF9fdGhyaWZ0RXJyb3IpIjsKKyAgICBzY29wZV91cChvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiKl9fdGhyaWZ0RXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46IFRBcHBsaWNhdGlvbkVycm9yRG9tYWluIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogVEFwcGxpY2F0aW9uRXJyb3JNaXNzaW5nUmVzdWx0IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzogQHtUQXBwbGljYXRpb25FcnJvck1ldGhvZEtleTogQFwiIgorICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwifV07IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBOTzsiIDw8IGVuZGw7CisgIH0KKworICAvLyBDbG9zZSBmdW5jdGlvbgorICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhbiBpbnZvY2F0aW9uIG9mIGEgZ2l2ZW4gJ3NlbmRfJyBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGFuIGltcGxlbWVudGF0aW9uIGZvcgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9zZW5kX2Z1bmN0aW9uX2ludm9jYXRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworCisgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIVtzZWxmIHNlbmRfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCk7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgIHN0cmluZyBmaWVsZE5hbWUgPSAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBvdXQgPDwgIiAiOworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIG91dCA8PCAiOiAiIDw8IGZpZWxkTmFtZTsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IGZpZWxkTmFtZSA8PCAiOiAiIDw8IGZpZWxkTmFtZTsKKyAgICB9CisgIH0KKyAgaWYgKCFmaWVsZHMuZW1wdHkoKSkgeworICAgIG91dCA8PCAiIGVycm9yIjsKKyAgfQorICBvdXQgPDwgIjogX190aHJpZnRFcnJvcl0pICIgPDwgaW52YWxpZF9yZXR1cm5fc3RhdGVtZW50KHRmdW5jdGlvbikgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYW4gaW52b2NhdGlvbiBvZiBhIGdpdmVuICdzZW5kXycgZnVuY3Rpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhbiBpbXBsZW1lbnRhdGlvbiBmb3IKKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfc2VuZF9hc3luY19mdW5jdGlvbl9pbnZvY2F0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZhaWx1cmVCbG9ja05hbWUpIHsKKworICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFbc2VsZiBzZW5kXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICBzdHJpbmcgZmllbGROYW1lID0gKCpmbGRfaXRlciktPmdldF9uYW1lKCk7CisgICAgb3V0IDw8ICIgIjsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICBvdXQgPDwgIjogIiA8PCBmaWVsZE5hbWU7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCBmaWVsZE5hbWUgPDwgIjogIiA8PCBmaWVsZE5hbWU7CisgICAgfQorICB9CisgIGlmICghZmllbGRzLmVtcHR5KCkpIHsKKyAgICBvdXQgPDwgIiBwcm90b2NvbCI7CisgIH0KKyAgb3V0IDw8ICI6IHByb3RvY29sIGVycm9yOiAmdGhyaWZ0RXJyb3JdKSAiOworICBzY29wZV91cChvdXQpOworICBvdXQgPDwgaW5kZW50KCkgPDwgZmFpbHVyZUJsb2NrTmFtZSA8PCAiKHRocmlmdEVycm9yKTsiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgaW1wbGVtZW50YXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGFuIGltcGxlbWVudGF0aW9uIGZvcgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9pbXBsZW1lbnRhdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisKKyAgc3RyaW5nIG5hbWUgPSBjb2NvYV9wcmVmaXhfICsgdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiQ2xpZW50IjsKKworICBvdXQgPDwgIkBpbnRlcmZhY2UgIiA8PCBuYW1lIDw8ICIgKCkgIjsKKyAgc2NvcGVfdXAob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWQ8VFByb3RvY29sPiBpblByb3RvY29sOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZDxUUHJvdG9jb2w+IG91dFByb3RvY29sOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisgIG91dCA8PCAiQGVuZCIgPDwgZW5kbCA8PCBlbmRsOworCisgIG91dCA8PCAiQGltcGxlbWVudGF0aW9uICIgPDwgbmFtZSA8PCBlbmRsOworCisgIC8vIGluaXRpYWxpemVycworICBvdXQgPDwgIi0gKGlkKSBpbml0V2l0aFByb3RvY29sOiAoaWQgPFRQcm90b2NvbD4pIHByb3RvY29sIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBbc2VsZiBpbml0V2l0aEluUHJvdG9jb2w6IHByb3RvY29sIG91dFByb3RvY29sOiBwcm90b2NvbF07IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworCisgIG91dCA8PCAiLSAoaWQpIGluaXRXaXRoSW5Qcm90b2NvbDogKGlkIDxUUHJvdG9jb2w+KSBhbkluUHJvdG9jb2wgb3V0UHJvdG9jb2w6IChpZCA8VFByb3RvY29sPikgIgorICAgICAgICAgImFuT3V0UHJvdG9jb2wiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAic2VsZiA9IFtzdXBlciBpbml0XTsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHNlbGYpICI7CisgIHNjb3BlX3VwKG91dCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaW5Qcm90b2NvbCA9IGFuSW5Qcm90b2NvbDsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAib3V0UHJvdG9jb2wgPSBhbk91dFByb3RvY29sOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBzZWxmOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgZW5kbDsKKworICAvLyBnZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKworICAgIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X3NlbmRfZnVuY3Rpb25faW1wbGVtZW50YXRpb24ob3V0LCB0c2VydmljZSwgKmZfaXRlciwgZmFsc2UpOworCisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9yZWN2X2Z1bmN0aW9uX2ltcGxlbWVudGF0aW9uKG91dCwgdHNlcnZpY2UsICpmX2l0ZXIsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvLyBPcGVuIGZ1bmN0aW9uCisgICAgaW5kZW50KG91dCkgPDwgIi0gIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgdHJ1ZSkgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICAgIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X3NlbmRfZnVuY3Rpb25faW52b2NhdGlvbihvdXQsICpmX2l0ZXIpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIVtbb3V0UHJvdG9jb2wgdHJhbnNwb3J0XSBmbHVzaDogX190aHJpZnRFcnJvcl0pICIgPDwgaW52YWxpZF9yZXR1cm5fc3RhdGVtZW50KCpmX2l0ZXIpIDw8IGVuZGw7CisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIVtzZWxmIHJlY3ZfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIFlFUzsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwgZmFsc2UsIHRydWUpIDw8ICIgX19yZXN1bHQ7IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKCFbc2VsZiByZWN2XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6ICZfX3Jlc3VsdCBlcnJvcjogX190aHJpZnRFcnJvcl0pICIKKyAgICAgICAgICAgIDw8IGludmFsaWRfcmV0dXJuX3N0YXRlbWVudCgqZl9pdGVyKSA8PCBlbmRsOworICAgICAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpKSB7CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gX19yZXN1bHQ7IiA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIEAoX19yZXN1bHQpOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIFlFUzsiIDw8IGVuZGw7CisgICAgfQorICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKyAgfQorCisgIG91dCA8PCAiQGVuZCIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGltcGxlbWVudGF0aW9uIGZvciBpdHMgYXN5bmNocm9ub3VzIGludGVyZmFjZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYW4gaW1wbGVtZW50YXRpb24gZm9yCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X2FzeW5jX2ltcGxlbWVudGF0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UpIHsKKworICBzdHJpbmcgbmFtZSA9IGNvY29hX3ByZWZpeF8gKyB0c2VydmljZS0+Z2V0X25hbWUoKSArICJDbGllbnRBc3luYyI7CisKKyAgb3V0IDw8ICJAaW50ZXJmYWNlICIgPDwgbmFtZSA8PCAiICgpICI7CisgIHNjb3BlX3VwKG91dCk7CisgIG91dCA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgImlkPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeTsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWQ8VEFzeW5jVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeTsiIDw8IGVuZGw7CisgIG91dCA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworICBvdXQgPDwgIkBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKKworCisgIG91dCA8PCAiQGltcGxlbWVudGF0aW9uICIgPDwgbmFtZSA8PCBlbmRsCisgICAgICA8PCBlbmRsIDw8ICItIChpZCkgaW5pdFdpdGhQcm90b2NvbEZhY3Rvcnk6IChpZCA8VFByb3RvY29sRmFjdG9yeT4pIGFQcm90b2NvbEZhY3RvcnkgIgorICAgICAgICAgICAgICAgICAidHJhbnNwb3J0RmFjdG9yeTogKGlkIDxUQXN5bmNUcmFuc3BvcnRGYWN0b3J5PikgYVRyYW5zcG9ydEZhY3Rvcnk7IiA8PCBlbmRsOworCisgIHNjb3BlX3VwKG91dCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAic2VsZiA9IFtzdXBlciBpbml0XTsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHNlbGYpIHsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBwcm90b2NvbEZhY3RvcnkgPSBhUHJvdG9jb2xGYWN0b3J5OyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHRyYW5zcG9ydEZhY3RvcnkgPSBhVHJhbnNwb3J0RmFjdG9yeTsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gc2VsZjsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gZ2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisKKyAgICBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9zZW5kX2Z1bmN0aW9uX2ltcGxlbWVudGF0aW9uKG91dCwgdHNlcnZpY2UsICpmX2l0ZXIsIHRydWUpOworCisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9yZWN2X2Z1bmN0aW9uX2ltcGxlbWVudGF0aW9uKG91dCwgdHNlcnZpY2UsICpmX2l0ZXIsIHRydWUpOworICAgIH0KKworICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICBpbmRlbnQob3V0KSA8PCAiLSAiIDw8IGFzeW5jX2Z1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCBmYWxzZSkgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJOU0Vycm9yICp0aHJpZnRFcnJvcjsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImlkPFRBc3luY1RyYW5zcG9ydD4gdHJhbnNwb3J0ID0gW3RyYW5zcG9ydEZhY3RvcnkgbmV3VHJhbnNwb3J0XTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImlkPFRQcm90b2NvbD4gcHJvdG9jb2wgPSBbcHJvdG9jb2xGYWN0b3J5IG5ld1Byb3RvY29sT25UcmFuc3BvcnQ6dHJhbnNwb3J0XTsiIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbDsKKworICAgIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X3NlbmRfYXN5bmNfZnVuY3Rpb25faW52b2NhdGlvbihvdXQsICpmX2l0ZXIsICJmYWlsdXJlQmxvY2siKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW3RyYW5zcG9ydCBmbHVzaFdpdGhDb21wbGV0aW9uOl57IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIk5TRXJyb3IgKnRocmlmdEVycm9yOyIgPDwgZW5kbDsKKworICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSkgPDwgIiByZXN1bHQ7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIVtzZWxmIHJlY3ZfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIG91dCA8PCAiOiAmcmVzdWx0IHByb3RvY29sIjsKKyAgICAgIH0KKyAgICAgIG91dCA8PCAiOiBwcm90b2NvbCBlcnJvcjogJnRocmlmdEVycm9yXSkgIjsKKyAgICAgIHNjb3BlX3VwKG91dCk7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImZhaWx1cmVCbG9jayh0aHJpZnRFcnJvcik7IiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgICBzY29wZV9kb3duKG91dCk7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXNwb25zZUJsb2NrKCI7CisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpICYmICEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgb3V0IDw8ICJyZXN1bHQiOworICAgIH0KKyAgICBvdXQgPDwgIik7IiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBmYWlsdXJlOmZhaWx1cmVCbG9ja107IiA8PCBlbmRsOworCisgICAgc2NvcGVfZG93bihvdXQpOworCisgICAgb3V0IDw8IGVuZGw7CisKKyAgICAvLyBQcm9taXNlIGZ1bmN0aW9uCisgICAgaWYgKHByb21pc2Vfa2l0XykgeworCisgICAgICBpbmRlbnQob3V0KSA8PCAiLSAiIDw8IHByb21pc2VfZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7CisgICAgICBzY29wZV91cChvdXQpOworCisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBbQW55UHJvbWlzZSBwcm9taXNlV2l0aFJlc29sdmVyQmxvY2s6XihQTUtSZXNvbHZlciByZXNvbHZlcikgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworCisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIk5TRXJyb3IgKnRocmlmdEVycm9yOyIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZDxUQXN5bmNUcmFuc3BvcnQ+IHRyYW5zcG9ydCA9IFt0cmFuc3BvcnRGYWN0b3J5IG5ld1RyYW5zcG9ydF07IiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImlkPFRQcm90b2NvbD4gcHJvdG9jb2wgPSBbcHJvdG9jb2xGYWN0b3J5IG5ld1Byb3RvY29sT25UcmFuc3BvcnQ6dHJhbnNwb3J0XTsiIDw8IGVuZGwKKyAgICAgICAgICA8PCBlbmRsOworCisgICAgICBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9zZW5kX2FzeW5jX2Z1bmN0aW9uX2ludm9jYXRpb24ob3V0LCAqZl9pdGVyLCAicmVzb2x2ZXIiKTsKKworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbdHJhbnNwb3J0IGZsdXNoV2l0aENvbXBsZXRpb246XnsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiTlNFcnJvciAqdGhyaWZ0RXJyb3I7IiA8PCBlbmRsOworCisgICAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSkgPDwgIiByZXN1bHQ7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFbc2VsZiByZWN2XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgICAgb3V0IDw8ICI6ICZyZXN1bHQgcHJvdG9jb2wiOworICAgICAgICB9CisgICAgICAgIG91dCA8PCAiOiBwcm90b2NvbCBlcnJvcjogJnRocmlmdEVycm9yXSkgIjsKKyAgICAgICAgc2NvcGVfdXAob3V0KTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXNvbHZlcih0aHJpZnRFcnJvcik7IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICAgICAgc2NvcGVfZG93bihvdXQpOworICAgICAgfQorCisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJlc29sdmVyKCI7CisgICAgICBpZiAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSB8fCAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBvdXQgPDwgIkBZRVMiOworICAgICAgfSBlbHNlIGlmICh0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSkpIHsKKyAgICAgICAgb3V0IDw8ICJyZXN1bHQiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8ICJAKHJlc3VsdCkiOworICAgICAgfQorICAgICAgb3V0IDw8ICIpOyIgPDwgZW5kbDsKKworICAgICAgaW5kZW50X2Rvd24oKTsKKworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IGZhaWx1cmU6XihOU0Vycm9yICplcnJvcikgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXNvbHZlcihlcnJvcik7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifV07IiA8PCBlbmRsOworCisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9XTsiIDw8IGVuZGw7CisKKyAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKworICAgICAgb3V0IDw8IGVuZGw7CisKKyAgICB9CisKKyAgfQorCisgIG91dCA8PCAiQGVuZCIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGltcGxlbWVudGF0aW9uLiAgSW4gb3RoZXIgd29yZHMgdGhlIGFjdHVhbCBUUHJvY2Vzc29yIGltcGxlbWVudGF0aW9uCisgKiBmb3IgdGhlIHNlcnZpY2UuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGFuIGltcGxlbWVudGF0aW9uIGZvcgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX3NlcnZlcl9pbXBsZW1lbnRhdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisKKyAgc3RyaW5nIG5hbWUgPSBjb2NvYV9wcmVmaXhfICsgdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiUHJvY2Vzc29yIjsKKworICBvdXQgPDwgIkBpbnRlcmZhY2UgIiA8PCBuYW1lIDw8ICIgKCkgIjsKKworICBzY29wZV91cChvdXQpOworICBvdXQgPDwgaW5kZW50KCkgPDwgImlkIDwiIDw8IGNvY29hX3ByZWZpeF8gPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIj4gc2VydmljZTsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiTlNEaWN0aW9uYXJ5ICogbWV0aG9kTWFwOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworCisgIG91dCA8PCAiQGVuZCIgPDwgZW5kbCA8PCBlbmRsOworCisgIG91dCA8PCAiQGltcGxlbWVudGF0aW9uICIgPDwgbmFtZSA8PCBlbmRsOworCisgIC8vIGluaXRpYWxpemVyCisgIG91dCA8PCBlbmRsOworICBvdXQgPDwgIi0gKGlkKSBpbml0V2l0aCIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIjogKGlkIDwiIDw8IGNvY29hX3ByZWZpeF8gPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIj4pIGFTZXJ2aWNlIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworICBvdXQgPDwgaW5kZW50KCkgPDwgInNlbGYgPSBbc3VwZXIgaW5pdF07IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChzZWxmKSAiOworICBzY29wZV91cChvdXQpOworICBvdXQgPDwgaW5kZW50KCkgPDwgInNlcnZpY2UgPSBhU2VydmljZTsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAibWV0aG9kTWFwID0gW05TTXV0YWJsZURpY3Rpb25hcnkgZGljdGlvbmFyeV07IiA8PCBlbmRsOworCisgIC8vIGdlbmVyYXRlIG1ldGhvZCBtYXAgZm9yIHJvdXRpbmcgaW5jb21pbmcgY2FsbHMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlNFTCBzID0gQHNlbGVjdG9yKHByb2Nlc3NfIiA8PCBmdW5uYW1lIDw8ICJfd2l0aFNlcXVlbmNlSUQ6aW5Qcm90b2NvbDpvdXRQcm90b2NvbDplcnJvcjopOyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIk5TTWV0aG9kU2lnbmF0dXJlICogc2lnID0gW3NlbGYgbWV0aG9kU2lnbmF0dXJlRm9yU2VsZWN0b3I6IHNdOyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIk5TSW52b2NhdGlvbiAqIGludm9jYXRpb24gPSBbTlNJbnZvY2F0aW9uIGludm9jYXRpb25XaXRoTWV0aG9kU2lnbmF0dXJlOiBzaWddOyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltpbnZvY2F0aW9uIHNldFNlbGVjdG9yOiBzXTsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbaW52b2NhdGlvbiByZXRhaW5Bcmd1bWVudHNdOyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlttZXRob2RNYXAgc2V0VmFsdWU6IGludm9jYXRpb24gZm9yS2V5OiBAXCIiIDw8IGZ1bm5hbWUgPDwgIlwiXTsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihvdXQpOworICB9CisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gc2VsZjsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKworICAvLyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgJ3NlcnZpY2UnIG1ldGhvZCB3aGljaCByZXR1cm5zIHRoZSBzZXJ2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzCisgIC8vIHByb2Nlc3NvcgorICBvdXQgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICItIChpZDwiIDw8IGNvY29hX3ByZWZpeF8gPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIj4pIHNlcnZpY2UiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBzZXJ2aWNlOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIC8vIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUUHJvY2VzcyBtZXRob2QsIHdoaWNoIGRpc3BhdGNoZXMgdGhlIGluY29taW5nIGNhbGwgdXNpbmcgdGhlIG1ldGhvZCBtYXAKKyAgb3V0IDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiLSAoQk9PTCkgcHJvY2Vzc09uSW5wdXRQcm90b2NvbDogKGlkIDxUUHJvdG9jb2w+KSBpblByb3RvY29sIiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2w6IChpZCA8VFByb3RvY29sPikgb3V0UHJvdG9jb2wiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogKE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKV9fdGhyaWZ0RXJyb3IiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIE5TU3RyaW5nICogbWVzc2FnZU5hbWU7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgU0ludDMyIG1lc3NhZ2VUeXBlOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIFNJbnQzMiBzZXFJRDsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBpZiAoIVtpblByb3RvY29sIHJlYWRNZXNzYWdlQmVnaW5SZXR1cm5pbmdOYW1lOiAmbWVzc2FnZU5hbWUiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJm1lc3NhZ2VUeXBlIiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6ICZzZXFJRCIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIE5TSW52b2NhdGlvbiAqIGludm9jYXRpb24gPSBbbWV0aG9kTWFwIHZhbHVlRm9yS2V5OiBtZXNzYWdlTmFtZV07IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgaWYgKGludm9jYXRpb24gPT0gbmlsKSB7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICBpZiAoIVtUUHJvdG9jb2xVdGlsIHNraXBUeXBlOiBUVHlwZVNUUlVDVCBvblByb3RvY29sOiBpblByb3RvY29sIGVycm9yOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgaWYgKCFbaW5Qcm90b2NvbCByZWFkTWVzc2FnZUVuZDogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgIE5TRXJyb3IgKiB4ID0gW05TRXJyb3IgZXJyb3JXaXRoRG9tYWluOiBUQXBwbGljYXRpb25FcnJvckRvbWFpbiIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFRBcHBsaWNhdGlvbkVycm9yVW5rbm93bk1ldGhvZCIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86IEB7VEFwcGxpY2F0aW9uRXJyb3JNZXRob2RLZXk6IG1lc3NhZ2VOYW1lfV07IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICBpZiAoIVtvdXRQcm90b2NvbCB3cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lOiBtZXNzYWdlTmFtZSIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogVE1lc3NhZ2VUeXBlRVhDRVBUSU9OIiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOiBzZXFJRCIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgIGlmICghW3ggd3JpdGU6IG91dFByb3RvY29sIGVycm9yOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgaWYgKCFbb3V0UHJvdG9jb2wgd3JpdGVNZXNzYWdlRW5kOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgaWYgKCFbW291dFByb3RvY29sIHRyYW5zcG9ydF0gZmx1c2g6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICByZXR1cm4gWUVTOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAvLyBOU0ludm9jYXRpb24gZG9lcyBub3QgY29uZm9ybSB0byBOU0NvcHlpbmcgcHJvdG9jb2wiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBOU0ludm9jYXRpb24gKiBpID0gW05TSW52b2NhdGlvbiBpbnZvY2F0aW9uV2l0aE1ldGhvZFNpZ25hdHVyZTogIgorICAgICAgICAgICAgICAgICAgICAgIltpbnZvY2F0aW9uIG1ldGhvZFNpZ25hdHVyZV1dOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIFtpIHNldFNlbGVjdG9yOiBbaW52b2NhdGlvbiBzZWxlY3Rvcl1dOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIFtpIHNldEFyZ3VtZW50OiAmc2VxSUQgYXRJbmRleDogMl07IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgW2kgc2V0QXJndW1lbnQ6ICZpblByb3RvY29sIGF0SW5kZXg6IDNdOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIFtpIHNldEFyZ3VtZW50OiAmb3V0UHJvdG9jb2wgYXRJbmRleDogNF07IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgW2kgc2V0QXJndW1lbnQ6ICZfX3RocmlmdEVycm9yIGF0SW5kZXg6IDVdOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIFtpIHNldFRhcmdldDogc2VsZl07IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgW2kgaW52b2tlXTsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gWUVTOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIC8vIGdlbmVyYXRlIGEgcHJvY2Vzc19YWFhYIG1ldGhvZCBmb3IgZWFjaCBzZXJ2aWNlIGZ1bmN0aW9uLCB3aGljaCByZWFkcyBhcmdzLCBjYWxscyB0aGUgc2VydmljZSwKKyAgLy8gYW5kIHdyaXRlcyByZXN1bHRzCisgIGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgb3V0IDw8IGVuZGw7CisgICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICItIChCT09MKSBwcm9jZXNzXyIgPDwgZnVubmFtZQorICAgICAgICA8PCAiX3dpdGhTZXF1ZW5jZUlEOiAoU0ludDMyKSBzZXFJRCBpblByb3RvY29sOiAoaWQ8VFByb3RvY29sPikgaW5Qcm90b2NvbCBvdXRQcm90b2NvbDogIgorICAgICAgICAgICAiKGlkPFRQcm90b2NvbD4pIG91dFByb3RvY29sIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKilfX3RocmlmdEVycm9yIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgc3RyaW5nIGFyZ3N0eXBlID0gY29jb2FfcHJlZml4XyArIGZ1bmN0aW9uX2FyZ3NfaGVscGVyX3N0cnVjdF90eXBlKHRzZXJ2aWNlLCAqZl9pdGVyKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgYXJnc3R5cGUgPDwgIiAqIGFyZ3MgPSBbIiA8PCBhcmdzdHlwZSA8PCAiIG5ld107IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFbYXJncyByZWFkOiBpblByb3RvY29sIGVycm9yOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghW2luUHJvdG9jb2wgcmVhZE1lc3NhZ2VFbmQ6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworCisgICAgLy8gcHJlcGFyZSB0aGUgcmVzdWx0IGlmIG5vdCBvbmV3YXkKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIHN0cmluZyByZXN1bHR0eXBlID0gY29jb2FfcHJlZml4XyArIGZ1bmN0aW9uX3Jlc3VsdF9oZWxwZXJfc3RydWN0X3R5cGUodHNlcnZpY2UsICpmX2l0ZXIpOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHJlc3VsdHR5cGUgPDwgIiAqIHJlc3VsdCA9IFsiIDw8IHJlc3VsdHR5cGUgPDwgIiBuZXddOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBtYWtlIHRoZSBjYWxsIHRvIHRoZSBhY3R1YWwgc2VydmljZSBvYmplY3QKKyAgICBvdXQgPDwgaW5kZW50KCk7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICBvdXQgPDwgIkJPT0wiOworICAgIH0gZWxzZSBpZiAodHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpKSB7CisgICAgICBvdXQgPDwgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwgZmFsc2UsIHRydWUpOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgIk5TTnVtYmVyICoiOworICAgIH0KKyAgICBvdXQgPDwgIiBzZXJ2aWNlUmVzdWx0ID0gIjsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5nZXRfdHJ1ZV90eXBlKCktPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICBvdXQgPDwgIigiIDw8IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksIGZhbHNlLCB0cnVlKSA8PCAiKSI7CisgICAgfQorICAgIG91dCA8PCAiW3NlcnZpY2UgIiA8PCBmdW5uYW1lOworICAgIC8vIHN1cHBseWluZyBhcmd1bWVudHMKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBzdHJpbmcgZmllbGROYW1lID0gKCpmbGRfaXRlciktPmdldF9uYW1lKCk7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgb3V0IDw8ICI6IFthcmdzICIgPDwgZmllbGROYW1lIDw8ICJdIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCAiICIgPDwgZmllbGROYW1lIDw8ICI6IFthcmdzICIgPDwgZmllbGROYW1lIDw8ICJdIjsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFmaWVsZHMuZW1wdHkoKSkgeworICAgICAgb3V0IDw8ICIgZXJyb3IiOworICAgIH0KKyAgICBvdXQgPDwgIjogX190aHJpZnRFcnJvcl07IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFzZXJ2aWNlUmVzdWx0KSByZXR1cm4gTk87IiA8PCBlbmRsOworICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW3Jlc3VsdCBzZXRTdWNjZXNzOiAiIDw8IHVuYm94KCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwgInNlcnZpY2VSZXN1bHQiKSA8PCAiXTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gd3JpdGUgb3V0IHRoZSByZXN1bHQgaWYgbm90IG9uZXdheQorICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIVtvdXRQcm90b2NvbCB3cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lOiBAXCIiIDw8IGZ1bm5hbWUgPDwgIlwiIiA8PCBlbmRsOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBUTWVzc2FnZVR5cGVSRVBMWSIgPDwgZW5kbDsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDogc2VxSUQiIDw8IGVuZGw7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIVtyZXN1bHQgd3JpdGU6IG91dFByb3RvY29sIGVycm9yOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFbb3V0UHJvdG9jb2wgd3JpdGVNZXNzYWdlRW5kOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFbW291dFByb3RvY29sIHRyYW5zcG9ydF0gZmx1c2g6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBZRVM7IiA8PCBlbmRsOworCisgICAgc2NvcGVfZG93bihvdXQpOworICB9CisKKyAgb3V0IDw8ICJAZW5kIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCisgKgorICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQKKyAqIEBwYXJhbSBmaWVsZE5hbWUgVGhlIHZhcmlhYmxlIG5hbWUgZm9yIHRoaXMgZmllbGQKKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkTmFtZSkgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICB9CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIGZpZWxkTmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBmaWVsZE5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICIgPDwgZmllbGROYW1lIDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJpZiAoIVtpblByb3RvY29sICI7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICAgIG91dCA8PCAicmVhZEJpbmFyeTomIiA8PCBmaWVsZE5hbWUgPDwgIiBlcnJvcjogX190aHJpZnRFcnJvcl0iOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAicmVhZFN0cmluZzomIiA8PCBmaWVsZE5hbWUgPDwgIiBlcnJvcjogX190aHJpZnRFcnJvcl0iOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgInJlYWRCb29sOiYiIDw8IGZpZWxkTmFtZSA8PCAiIGVycm9yOiBfX3RocmlmdEVycm9yXSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8ICJyZWFkQnl0ZTooVUludDggKikmIiA8PCBmaWVsZE5hbWUgPDwgIiBlcnJvcjogX190aHJpZnRFcnJvcl0iOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgInJlYWRJMTY6JiIgPDwgZmllbGROYW1lIDw8ICIgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJyZWFkSTMyOiYiIDw8IGZpZWxkTmFtZSA8PCAiIGVycm9yOiBfX3RocmlmdEVycm9yXSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAicmVhZEk2NDomIiA8PCBmaWVsZE5hbWUgPDwgIiBlcnJvcjogX190aHJpZnRFcnJvcl0iOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgInJlYWREb3VibGU6JiIgPDwgZmllbGROYW1lIDw8ICIgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIE9iamVjdGl2ZS1DIG5hbWUgZm9yIGJhc2UgdHlwZSAiCisgICAgICAgICAgICArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCAicmVhZEkzMjomIiA8PCBmaWVsZE5hbWUgPDwgIiBlcnJvcjogX190aHJpZnRFcnJvcl0iOworICAgIH0KKyAgICBvdXQgPDwgIikgcmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhbiB1bnNlcmlhbGl6ZXIgZm9yIGEgc3RydWN0LCBhbGxvY2F0ZXMgdGhlIHN0cnVjdCBhbmQgaW52b2tlcyByZWFkOgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZE5hbWUpIHsKKyAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8IGZpZWxkTmFtZSA8PCAiID0gW1siIDw8IHR5cGVfbmFtZSh0c3RydWN0LCB0cnVlKQorICAgICAgICAgICAgICA8PCAiIGFsbG9jXSBpbml0XTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJpZiAoIVsiIDw8IGZpZWxkTmFtZSA8PCAiIHJlYWQ6IGluUHJvdG9jb2wgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGNvbnRhaW5lciBieSByZWFkaW5nIGl0cyBzaXplIGFuZCB0aGVuIGl0ZXJhdGluZworICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkTmFtZSkgeworICBzdHJpbmcgc2l6ZSA9IHRtcCgiX3NpemUiKTsKKyAgaW5kZW50KG91dCkgPDwgIlNJbnQzMiAiIDw8IHNpemUgPDwgIjsiIDw8IGVuZGw7CisKKyAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFbaW5Qcm90b2NvbCByZWFkTWFwQmVnaW5SZXR1cm5pbmdLZXlUeXBlOiBOVUxMIHZhbHVlVHlwZTogTlVMTCBzaXplOiAmIiA8PCBzaXplIDw8ICIgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJOU011dGFibGVEaWN0aW9uYXJ5ICogIiA8PCBmaWVsZE5hbWUKKyAgICAgICAgICAgICAgICA8PCAiID0gW1tOU011dGFibGVEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aENhcGFjaXR5OiAiIDw8IHNpemUgPDwgIl07IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpZiAoIVtpblByb3RvY29sIHJlYWRTZXRCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOiBOVUxMIHNpemU6ICYiIDw8IHNpemUgPDwgIiBlcnJvcjogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiTlNNdXRhYmxlU2V0ICogIiA8PCBmaWVsZE5hbWUKKyAgICAgICAgICAgICAgICA8PCAiID0gW1tOU011dGFibGVTZXQgYWxsb2NdIGluaXRXaXRoQ2FwYWNpdHk6ICIgPDwgc2l6ZSA8PCAiXTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpZiAoIVtpblByb3RvY29sIHJlYWRMaXN0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZTogTlVMTCBzaXplOiAmIiA8PCBzaXplIDw8ICIgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIk5TTXV0YWJsZUFycmF5ICogIiA8PCBmaWVsZE5hbWUKKyAgICAgICAgICAgICAgICA8PCAiID0gW1tOU011dGFibGVBcnJheSBhbGxvY10gaW5pdFdpdGhDYXBhY2l0eTogIiA8PCBzaXplIDw8ICJdOyIgPDwgZW5kbDsKKyAgfQorICAvLyBGSVhNRSAtIHRoZSBjb2RlIGFib3ZlIGRvZXMgbm90IHZlcmlmeSB0aGF0IHRoZSBlbGVtZW50IHR5cGVzIG9mCisgIC8vIHRoZSBjb250YWluZXJzIGJlaW5nIHJlYWQgbWF0Y2ggdGhlIGVsZW1lbnQgdHlwZXMgb2YgdGhlCisgIC8vIGNvbnRhaW5lcnMgd2UgYXJlIHJlYWRpbmcgaW50by4gIERvZXMgdGhhdCBtYXR0ZXI/CisKKyAgLy8gRm9yIGxvb3AgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cworICBzdHJpbmcgaSA9IHRtcCgiX2kiKTsKKyAgaW5kZW50KG91dCkgPDwgImludCAiIDw8IGkgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImZvciAoIiA8PCBpIDw8ICIgPSAwOyAiIDw8IGkgPDwgIiA8ICIKKyAgICAgICAgICAgICAgPDwgc2l6ZSA8PCAiOyAiCisgICAgICAgICAgICAgIDw8ICIrKyIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKKworICBzY29wZV91cChvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGZpZWxkTmFtZSk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBmaWVsZE5hbWUpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgZmllbGROYW1lKTsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICAvLyBSZWFkIGNvbnRhaW5lciBlbmQKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpZiAoIVtpblByb3RvY29sIHJlYWRNYXBFbmQ6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpZiAoIVtpblByb3RvY29sIHJlYWRTZXRFbmQ6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFbaW5Qcm90b2NvbCByZWFkTGlzdEVuZDogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBUYWtlIGEgdmFyaWFibGUgb2YgYSBnaXZlbiB0eXBlIGFuZCB3cmFwIGl0IGluIGNvZGUgdG8gbWFrZSBpdAorICogc3VpdGFibGUgZm9yIHB1dHRpbmcgaW50byBhIGNvbnRhaW5lciwgaWYgbmVjZXNzYXJ5LiAgQmFzaWNhbGx5LAorICogd3JhcCBzY2FsZXIgcHJpbWl0aXZlcyBpbiBOU051bWJlciBvYmplY3RzLgorICovCitzdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmJveCh0X3R5cGUqIHR0eXBlLCBzdHJpbmcgZmllbGRfbmFtZSkgeworCisgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisgIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJAKCIgKyBmaWVsZF9uYW1lICsgIikiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY2FuJ3QgYm94IHZvaWQiOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICByZXR1cm4gIkAoIiArIGZpZWxkX25hbWUgKyAiKSI7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICAvLyBkbyBub3RoaW5nCisgIHJldHVybiBmaWVsZF9uYW1lOworfQorCisvKioKKyAqIEV4dHJhY3RzIHRoZSBhY3R1YWwgdmFsdWUgZnJvbSBhIGJveGVkIHZhbHVlCisgKi8KK3N0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6dW5ib3godF90eXBlKiB0dHlwZSwgc3RyaW5nIGZpZWxkX25hbWUpIHsKKyAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKyAgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIlsiICsgZmllbGRfbmFtZSArICIgaW50VmFsdWVdIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNhbid0IHVuYm94IHZvaWQiOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICByZXR1cm4gIlsiICsgZmllbGRfbmFtZSArICIgYm9vbFZhbHVlXSI7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICByZXR1cm4gIigoU0ludDgpWyIgKyBmaWVsZF9uYW1lICsgIiBjaGFyVmFsdWVdKSI7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgcmV0dXJuICIoKFNJbnQxNilbIiArIGZpZWxkX25hbWUgKyAiIHNob3J0VmFsdWVdKSI7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgcmV0dXJuICIoKFNJbnQzMilbIiArIGZpZWxkX25hbWUgKyAiIGxvbmdWYWx1ZV0pIjsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICByZXR1cm4gIigoU0ludDY0KVsiICsgZmllbGRfbmFtZSArICIgbG9uZ0xvbmdWYWx1ZV0pIjsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICByZXR1cm4gIlsiICsgZmllbGRfbmFtZSArICIgZG91YmxlVmFsdWVdIjsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIC8vIGRvIG5vdGhpbmcKKyAgcmV0dXJuIGZpZWxkX25hbWU7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAgZWxlbWVudAorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZE5hbWUpIHsKKyAgc3RyaW5nIGtleSA9IHRtcCgiX2tleSIpOworICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7CisgIHRfdHlwZSoga2V5VHlwZSA9IHRtYXAtPmdldF9rZXlfdHlwZSgpOworICB0X3R5cGUqIHZhbFR5cGUgPSB0bWFwLT5nZXRfdmFsX3R5cGUoKTsKKyAgdF9maWVsZCBma2V5KGtleVR5cGUsIGtleSk7CisgIHRfZmllbGQgZnZhbCh2YWxUeXBlLCB2YWwpOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXksIGtleSk7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwsIHZhbCk7CisKKyAgaW5kZW50KG91dCkgPDwgIlsiIDw8IGZpZWxkTmFtZSA8PCAiIHNldE9iamVjdDogIiA8PCBib3godmFsVHlwZSwgdmFsKQorICAgICAgICAgICAgICA8PCAiIGZvcktleTogIiA8PCBib3goa2V5VHlwZSwga2V5KSA8PCAiXTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgc2V0IGVsZW1lbnQKKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGROYW1lKSB7CisgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICB0X3R5cGUqIHR5cGUgPSB0c2V0LT5nZXRfZWxlbV90eXBlKCk7CisgIHRfZmllbGQgZmVsZW0odHlwZSwgZWxlbSk7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0sIGVsZW0pOworCisgIGluZGVudChvdXQpIDw8ICJbIiA8PCBmaWVsZE5hbWUgPDwgIiBhZGRPYmplY3Q6ICIgPDwgYm94KHR5cGUsIGVsZW0pIDw8ICJdOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBsaXN0IGVsZW1lbnQKKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZE5hbWUpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgIHRfdHlwZSogdHlwZSA9IHRsaXN0LT5nZXRfZWxlbV90eXBlKCk7CisgIHRfZmllbGQgZmVsZW0odHlwZSwgZWxlbSk7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0sIGVsZW0pOworCisgIGluZGVudChvdXQpIDw8ICJbIiA8PCBmaWVsZE5hbWUgPDwgIiBhZGRPYmplY3Q6ICIgPDwgYm94KHR5cGUsIGVsZW0pIDw8ICJdOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCisgKgorICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCisgKiBAcGFyYW0gZmllbGROYW1lIE5hbWUgdG8gb2YgdGhlIHZhcmlhYmxlIGhvbGRpbmcgdGhlIGZpZWxkCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIGZpZWxkTmFtZSkgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisKKyAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICB9CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBmaWVsZE5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIGZpZWxkTmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlmICghW291dFByb3RvY29sICI7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBmaWVsZE5hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICAgIG91dCA8PCAid3JpdGVCaW5hcnk6ICIgPDwgZmllbGROYW1lIDw8ICIgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgIndyaXRlU3RyaW5nOiAiIDw8IGZpZWxkTmFtZSA8PCAiIGVycm9yOiBfX3RocmlmdEVycm9yXSI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAid3JpdGVCb29sOiAiIDw8IGZpZWxkTmFtZSA8PCAiIGVycm9yOiBfX3RocmlmdEVycm9yXSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUJ5dGU6IChVSW50OCkiIDw8IGZpZWxkTmFtZSA8PCAiIGVycm9yOiBfX3RocmlmdEVycm9yXSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCAid3JpdGVJMTY6ICIgPDwgZmllbGROYW1lIDw8ICIgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMjogIiA8PCBmaWVsZE5hbWUgPDwgIiBlcnJvcjogX190aHJpZnRFcnJvcl0iOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgIndyaXRlSTY0OiAiIDw8IGZpZWxkTmFtZSA8PCAiIGVycm9yOiBfX3RocmlmdEVycm9yXSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIG91dCA8PCAid3JpdGVEb3VibGU6ICIgPDwgZmllbGROYW1lIDw8ICIgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIE9iamVjdGl2ZS1DIG5hbWUgZm9yIGJhc2UgdHlwZSAiCisgICAgICAgICAgICArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCAid3JpdGVJMzI6ICIgPDwgZmllbGROYW1lIDw8ICIgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdIjsKKyAgICB9CisgICAgb3V0IDw8ICIpIHJldHVybiBOTzsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOworICB9Cit9CisKKy8qKgorICogU2VyaWFsaXplIGEgc3RydWN0LgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCisgKiBAcGFyYW0gZmllbGROYW1lIE5hbWUgb2YgdmFyaWFibGUgaG9sZGluZyBzdHJ1Y3QKKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGROYW1lKSB7CisgICh2b2lkKXRzdHJ1Y3Q7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFbIiA8PCBmaWVsZE5hbWUgPDwgIiB3cml0ZTogb3V0UHJvdG9jb2wgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYSBjb250YWluZXIgYnkgd3JpdGluZyBpdHMgc2l6ZSB0aGVuIHRoZSBlbGVtZW50cy4KKyAqCisgKiBAcGFyYW0gdHR5cGUgIFRoZSB0eXBlIG9mIGNvbnRhaW5lcgorICogQHBhcmFtIGZpZWxkTmFtZSBOYW1lIG9mIHZhcmlhYmxlIGhvbGRpbmcgY29udGFpbmVyCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGROYW1lKSB7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpZiAoIVtvdXRQcm90b2NvbCB3cml0ZU1hcEJlZ2luV2l0aEtleVR5cGU6ICIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkKKyAgICAgICAgICAgICAgICA8PCAiIHZhbHVlVHlwZTogIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiBzaXplOiAoU0ludDMyKVsiCisgICAgICAgICAgICAgICAgPDwgZmllbGROYW1lIDw8ICIgY291bnRdIGVycm9yOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFbb3V0UHJvdG9jb2wgd3JpdGVTZXRCZWdpbldpdGhFbGVtZW50VHlwZTogIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiBzaXplOiAoU0ludDMyKVsiIDw8IGZpZWxkTmFtZQorICAgICAgICAgICAgICAgIDw8ICIgY291bnRdIGVycm9yOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlmICghW291dFByb3RvY29sIHdyaXRlTGlzdEJlZ2luV2l0aEVsZW1lbnRUeXBlOiAiCisgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiBzaXplOiAoU0ludDMyKVsiIDw8IGZpZWxkTmFtZQorICAgICAgICAgICAgICAgIDw8ICIgY291bnRdIGVycm9yOiBfX3RocmlmdEVycm9yXSkgcmV0dXJuIE5POyIgPDwgZW5kbDsKKyAgfQorCisgIHN0cmluZyBpdGVyID0gdG1wKCJfaXRlciIpOworICBzdHJpbmcga2V5OworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAga2V5ID0gdG1wKCJrZXkiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiTlNFbnVtZXJhdG9yICogIiA8PCBpdGVyIDw8ICIgPSBbIiA8PCBmaWVsZE5hbWUgPDwgIiBrZXlFbnVtZXJhdG9yXTsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgImlkICIgPDwga2V5IDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ3aGlsZSAoKCIgPDwga2V5IDw8ICIgPSBbIiA8PCBpdGVyIDw8ICIgbmV4dE9iamVjdF0pKSIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBrZXkgPSB0bXAoIm9iaiIpOworICAgIGluZGVudChvdXQpIDw8ICJOU0VudW1lcmF0b3IgKiAiIDw8IGl0ZXIgPDwgIiA9IFsiIDw8IGZpZWxkTmFtZSA8PCAiIG9iamVjdEVudW1lcmF0b3JdOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJpZCAiIDw8IGtleSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAid2hpbGUgKCgiIDw8IGtleSA8PCAiID0gWyIgPDwgaXRlciA8PCAiIG5leHRPYmplY3RdKSkiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGtleSA9IHRtcCgiaWR4Iik7CisgICAgaW5kZW50KG91dCkgPDwgImludCAiIDw8IGtleSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yICgiIDw8IGtleSA8PCAiID0gMDsgIiA8PCBrZXkgPDwgIiA8IFsiIDw8IGZpZWxkTmFtZSA8PCAiIGNvdW50XTsgIiA8PCBrZXkKKyAgICAgICAgICAgICAgICA8PCAiKyspIiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfdXAob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwga2V5LCBmaWVsZE5hbWUpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGtleSk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwga2V5LCBmaWVsZE5hbWUpOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFbb3V0UHJvdG9jb2wgd3JpdGVNYXBFbmQ6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpZiAoIVtvdXRQcm90b2NvbCB3cml0ZVNldEVuZDogX190aHJpZnRFcnJvcl0pIHJldHVybiBOTzsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpZiAoIVtvdXRQcm90b2NvbCB3cml0ZUxpc3RFbmQ6IF9fdGhyaWZ0RXJyb3JdKSByZXR1cm4gTk87IiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBtYXAuCisgKi8KK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbWFwTmFtZSkgeworICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCwgdW5ib3goa2ZpZWxkLmdldF90eXBlKCksIGtleSkpOworICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgIlsiICsgbWFwTmFtZSArICIgb2JqZWN0Rm9yS2V5OiAiICsga2V5ICsgIl0iKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCwgdW5ib3godmZpZWxkLmdldF90eXBlKCksIHZmaWVsZC5nZXRfbmFtZSgpKSk7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KKyAqLwordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZWxlbWVudE5hbWUpIHsKKyAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtZW50TmFtZSk7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsIHVuYm94KGVmaWVsZC5nZXRfdHlwZSgpLCBlbGVtZW50TmFtZSkpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgorICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbGlzdE5hbWUpIHsKKyAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgIlsiICsgbGlzdE5hbWUgKyAiIG9iamVjdEF0SW5kZXg6ICIgKyBpbmRleCArICJdIik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsIHVuYm94KGVmaWVsZC5nZXRfdHlwZSgpLCBlZmllbGQuZ2V0X25hbWUoKSkpOworfQorCisvKioKKyAqIFJldHVybnMgYW4gT2JqZWN0aXZlLUMgbmFtZQorICoKKyAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQorICogQHBhcmFtIGNsYXNzX3JlZiBEbyB3ZSB3YW50IGEgQ2xhc3MgcmVmZXJlbmNlIGlzdGVhZCBvZiBhIHR5cGUgcmVmZXJlbmNlPworICogQHJldHVybiBPYmplY3RpdmUtQyB0eXBlIG5hbWUsIGkuZS4gTlNEaWN0aW9uYXJ5PEtleSxWYWx1ZT4gKgorICovCitzdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGNsYXNzX3JlZiwgYm9vbCBuZWVkc19tdXRhYmxlKSB7CisgIGlmICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgc3RyaW5nIG5hbWUgPSAobmVlZHNfbXV0YWJsZSAmJiB0dHlwZS0+Z2V0X3RydWVfdHlwZSgpLT5pc19jb250YWluZXIoKSkgPyAiTXV0YWJsZSIgKyB0dHlwZS0+Z2V0X25hbWUoKSA6IHR0eXBlLT5nZXRfbmFtZSgpOworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOworICAgIHJldHVybiBwcm9ncmFtID8gKHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImNvY29hIikgKyBuYW1lKSA6IG5hbWU7CisgIH0KKworICBzdHJpbmcgcmVzdWx0OworICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgcmV0dXJuIGJhc2VfdHlwZV9uYW1lKCh0X2Jhc2VfdHlwZSopdHR5cGUpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gY29jb2FfcHJlZml4XyArIHR0eXBlLT5nZXRfbmFtZSgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHRfbWFwICptYXAgPSAodF9tYXAgKil0dHlwZTsKKyAgICByZXN1bHQgPSBuZWVkc19tdXRhYmxlID8gIk5TTXV0YWJsZURpY3Rpb25hcnkiIDogIk5TRGljdGlvbmFyeSI7CisgICAgcmVzdWx0ICs9ICI8IiArIGVsZW1lbnRfdHlwZV9uYW1lKG1hcC0+Z2V0X2tleV90eXBlKCkpICsgIiwgIiArIGVsZW1lbnRfdHlwZV9uYW1lKG1hcC0+Z2V0X3ZhbF90eXBlKCkpICsgIj4iOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHRfc2V0ICpzZXQgPSAodF9zZXQgKil0dHlwZTsKKyAgICByZXN1bHQgPSBuZWVkc19tdXRhYmxlID8gIk5TTXV0YWJsZVNldCIgOiAiTlNTZXQiOworICAgIHJlc3VsdCArPSAiPCIgKyBlbGVtZW50X3R5cGVfbmFtZShzZXQtPmdldF9lbGVtX3R5cGUoKSkgKyAiPiI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHRfbGlzdCAqbGlzdCA9ICh0X2xpc3QgKil0dHlwZTsKKyAgICByZXN1bHQgPSBuZWVkc19tdXRhYmxlID8gIk5TTXV0YWJsZUFycmF5IiA6ICJOU0FycmF5IjsKKyAgICByZXN1bHQgKz0gIjwiICsgZWxlbWVudF90eXBlX25hbWUobGlzdC0+Z2V0X2VsZW1fdHlwZSgpKSArICI+IjsKKyAgfSBlbHNlIHsKKyAgICAvLyBDaGVjayBmb3IgcHJlZml4CisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7CisgICAgaWYgKHByb2dyYW0gIT0gTlVMTCkgeworICAgICAgcmVzdWx0ID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiY29jb2EiKSArIHR0eXBlLT5nZXRfbmFtZSgpOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgPSB0dHlwZS0+Z2V0X25hbWUoKTsKKyAgICB9CisgIH0KKworICBpZiAoIWNsYXNzX3JlZikgeworICAgIHJlc3VsdCArPSAiICoiOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogUmV0dXJucyBhbiBPYmplY3RpdmUtQyB0eXBlIG5hbWUgZm9yIGNvbnRhaW5lciB0eXBlcworICoKKyAqIEBwYXJhbSB0dHlwZSB0aGUgdHlwZQorICovCitzdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmVsZW1lbnRfdHlwZV9uYW1lKHRfdHlwZSogZXR5cGUpIHsKKworICB0X3R5cGUqIHR0eXBlID0gZXR5cGUtPmdldF90cnVlX3R5cGUoKTsKKworICBpZiAoZXR5cGUtPmlzX3R5cGVkZWYoKSAmJiB0eXBlX2Nhbl9iZV9udWxsKHR0eXBlKSkgeworICAgIHJldHVybiB0eXBlX25hbWUoZXR5cGUpOworICB9CisKKyAgc3RyaW5nIHJlc3VsdDsKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlKiB0YmFzZSA9ICh0X2Jhc2VfdHlwZSopdHR5cGU7CisgICAgc3dpdGNoICh0YmFzZS0+Z2V0X2Jhc2UoKSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgaWYgKHRiYXNlLT5pc19iaW5hcnkoKSkgeworICAgICAgICByZXN1bHQgPSAiTlNEYXRhICoiOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHJlc3VsdCA9ICJOU1N0cmluZyAqIjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXN1bHQgPSAiTlNOdW1iZXIgKiI7CisgICAgICBicmVhazsKKyAgICB9CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgcmVzdWx0ID0gIk5TTnVtYmVyICoiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHRfbWFwICptYXAgPSAodF9tYXAgKil0dHlwZTsKKyAgICByZXN1bHQgPSAiTlNEaWN0aW9uYXJ5PCIgKyBlbGVtZW50X3R5cGVfbmFtZShtYXAtPmdldF9rZXlfdHlwZSgpKSArICIsICIgKyBlbGVtZW50X3R5cGVfbmFtZShtYXAtPmdldF92YWxfdHlwZSgpKSArICI+ICoiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHRfc2V0ICpzZXQgPSAodF9zZXQgKil0dHlwZTsKKyAgICByZXN1bHQgPSAiTlNTZXQ8IiArIGVsZW1lbnRfdHlwZV9uYW1lKHNldC0+Z2V0X2VsZW1fdHlwZSgpKSArICI+ICoiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICB0X2xpc3QgKmxpc3QgPSAodF9saXN0ICopdHR5cGU7CisgICAgcmVzdWx0ID0gIk5TQXJyYXk8IiArIGVsZW1lbnRfdHlwZV9uYW1lKGxpc3QtPmdldF9lbGVtX3R5cGUoKSkgKyAiPiAqIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXN1bHQgPSBjb2NvYV9wcmVmaXhfICsgdHR5cGUtPmdldF9uYW1lKCkgKyAiICoiOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBPYmplY3RpdmUtQyB0eXBlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHRocmlmdCB0eXBlLgorICoKKyAqIEBwYXJhbSB0YmFzZSBUaGUgYmFzZSB0eXBlCisgKi8KK3N0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6YmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHR5cGUpIHsKKyAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9IHR5cGUtPmdldF9iYXNlKCk7CisKKyAgc3dpdGNoICh0YmFzZSkgeworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgcmV0dXJuICJ2b2lkIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICByZXR1cm4gIk5TRGF0YSAqIjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuICJOU1N0cmluZyAqIjsKKyAgICB9CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICByZXR1cm4gIkJPT0wiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIHJldHVybiAiU0ludDgiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICByZXR1cm4gIlNJbnQxNiI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIHJldHVybiAiU0ludDMyIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgcmV0dXJuICJTSW50NjQiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICByZXR1cm4gImRvdWJsZSI7CisgIGRlZmF1bHQ6CisgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBPYmplY3RpdmUtQyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgIH0KK30KKworLyoqCisgKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKKyAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCisgKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYworICovCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpwcmludF9jb25zdF92YWx1ZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWZ2YWwpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgc3RyaW5nIHYyID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgdHlwZSwgdmFsdWUpOworICAgIGluZGVudChvdXQpOworICAgIGlmIChkZWZ2YWwpCisgICAgICBvdXQgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIjsKKyAgICBvdXQgPDwgbmFtZSA8PCAiID0gIiA8PCB2MiA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIGluZGVudChvdXQpOworICAgIGlmIChkZWZ2YWwpCisgICAgICBvdXQgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIjsKKyAgICBvdXQgPDwgbmFtZSA8PCAiID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUob3V0LCB0eXBlLCB2YWx1ZSkgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgaW5kZW50KG91dCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgaWYgKGRlZnZhbCkKKyAgICAgIG91dCA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiOworICAgIG91dCA8PCBuYW1lIDw8ICIgPSBbIiA8PCB0eXBlX25hbWUodHlwZSwgdHJ1ZSkgPDwgIiBuZXddOyIKKyAgICAgICAgPDwgZW5kbDsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7CisgICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOworICAgICAgfQorICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lID0gY2FwaXRhbGl6ZSh2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpOworICAgICAgaW5kZW50KG91dCkgPDwgIlsiIDw8IG5hbWUgPDwgIiBzZXQiIDw8IGNhcF9uYW1lIDw8ICI6IiA8PCB2YWwgPDwgIl07IiA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIG9zdHJpbmdzdHJlYW0gbWFwb3V0OworICAgIGluZGVudChtYXBvdXQpOworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGlmIChkZWZ2YWwpCisgICAgICBtYXBvdXQgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIjsKKyAgICBtYXBvdXQgPDwgbmFtZSA8PCAiID0gQHsiOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7KSB7CisgICAgICBtYXBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwga3R5cGUsIHZfaXRlci0+Zmlyc3QsIHRydWUpIDw8ICI6ICIKKyAgICAgICAgICA8PCByZW5kZXJfY29uc3RfdmFsdWUob3V0LCB2dHlwZSwgdl9pdGVyLT5zZWNvbmQsIHRydWUpOworICAgICAgaWYgKCsrdl9pdGVyICE9IHZhbC5lbmQoKSkgeworICAgICAgICBtYXBvdXQgPDwgIiwgIjsKKyAgICAgIH0KKyAgICB9CisgICAgbWFwb3V0IDw8ICJ9IjsKKyAgICBvdXQgPDwgbWFwb3V0LnN0cigpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIG9zdHJpbmdzdHJlYW0gbGlzdG91dDsKKyAgICBpbmRlbnQobGlzdG91dCk7CisgICAgdF90eXBlKiBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBpZiAoZGVmdmFsKQorICAgICAgbGlzdG91dCA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiOworICAgIGxpc3RvdXQgPDwgbmFtZSA8PCAiID0gQFsiOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7KSB7CisgICAgICBsaXN0b3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIGV0eXBlLCAqdl9pdGVyLCB0cnVlKTsKKyAgICAgIGlmICgrK3ZfaXRlciAhPSB2YWwuZW5kKCkpIHsKKyAgICAgICAgbGlzdG91dCA8PCAiLCAiOworICAgICAgfQorICAgIH0KKyAgICBsaXN0b3V0IDw8ICJdIjsKKyAgICBvdXQgPDwgbGlzdG91dC5zdHIoKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIG9zdHJpbmdzdHJlYW0gc2V0b3V0OworICAgIGluZGVudChzZXRvdXQpOworICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBpZiAoZGVmdmFsKQorICAgICAgc2V0b3V0IDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICI7CisgICAgc2V0b3V0IDw8IG5hbWUgPDwgIiA9IFtOU1NldCBzZXRXaXRoQXJyYXk6QFsiOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7KSB7CisgICAgICBzZXRvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgZXR5cGUsICp2X2l0ZXIsIHRydWUpOworICAgICAgaWYgKCsrdl9pdGVyICE9IHZhbC5lbmQoKSkgeworICAgICAgICBzZXRvdXQgPDwgIiwgIjsKKyAgICAgIH0KKyAgICB9CisgICAgc2V0b3V0IDw8ICJdXSI7CisgICAgb3V0IDw8IHNldG91dC5zdHIoKTsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIHR5cGUgIiArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0KK30KKworc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJveF9pdCkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlbmRlcjsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgLy8gV2UgbXVzdCBoYW5kbGUgYmluYXJ5IGNvbnN0YW50IGJ1dCB0aGUgc3ludGF4IG9mIElETCBkZWZpbmVzCisgICAgICAvLyBub3RoaW5nIGFib3V0IGJpbmFyeSBjb25zdGFudC4KKyAgICAgIC8vICAgaWYgdHlwZS0+aXNfYmluYXJ5KCkpCisgICAgICAvLyAgICAgIC8vIGJpbmFyeSBjb2RlCisgICAgICByZW5kZXIgPDwgIkBcIiIgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZW5kZXIgPDwgKCh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDApID8gIllFUyIgOiAiTk8iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgIH0gZWxzZSB7CisgICAgc3RyaW5nIHQgPSB0bXAoInRtcCIpOworICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwgdCwgdHlwZSwgdmFsdWUsIHRydWUpOworICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKKyAgICByZW5kZXIgPDwgdDsKKyAgfQorCisgIGlmIChib3hfaXQpIHsKKyAgICByZXR1cm4gYm94KHR5cGUsIHJlbmRlci5zdHIoKSk7CisgIH0KKyAgcmV0dXJuIHJlbmRlci5zdHIoKTsKK30KKworI2lmIDAKKy8qKgorT1JJR0lOQUwKKyAqIFNwaXQgb3V0IGNvZGUgdGhhdCBldmFsdWF0ZXMgdG8gdGhlIHNwZWNpZmllZCBjb25zdGFudCB2YWx1ZS4KKyAqLworc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUoc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYm94X2l0KSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVuZGVyOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZW5kZXIgPDwgIkBcIiIgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZW5kZXIgPDwgKCh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDApID8gIllFUyIgOiAiTk8iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGlmICh2YWwuc2l6ZSgpID4gMCkKKyAgICAgIHJlbmRlciA8PCAiW1siIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlKSA8PCAiIGFsbG9jXSBpbml0V2l0aCI7CisgICAgZWxzZQorICAgICAgcmVuZGVyIDw8ICJbWyIgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUpIDw8ICIgYWxsb2NdIGluaXQiOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICAvLyBGSVhNRSBUaGUgZ2VuZXJhdGVkIGNvZGUgZG9lcyBub3QgbWF0Y2ggd2l0aCBpbml0V2l0aFhYWAorICAgICAgLy8gICAgICAgaW5pdGlhbGl6ZXIgYW5kIGNhdXNlcyBjb21waWxlIGVycm9yLgorICAgICAgLy8gICAgICAgVHJ5OiB0ZXN0L0RlYnVnUHJvdG9UZXN0LnRocmlmdCBhbmQgdGVzdC9TbWFsbFRlc3QudGhyaWZ0CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgcmVuZGVyIDw8IGNhcGl0YWxpemUodl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKTsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlbmRlciA8PCAiICIgPDwgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOworICAgICAgfQorICAgICAgcmVuZGVyIDw8ICI6ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKG5hbWUsIGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICB9CisgICAgcmVuZGVyIDw8ICJdIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJlbmRlciA8PCAiW1tOU0RpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoT2JqZWN0c0FuZEtleXM6ICI7CisgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyBrZXkgPSByZW5kZXJfY29uc3RfdmFsdWUobmFtZSwga3R5cGUsIHZfaXRlci0+Zmlyc3QsIHRydWUpOworICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShuYW1lLCB2dHlwZSwgdl9pdGVyLT5zZWNvbmQsIHRydWUpOworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICByZW5kZXIgPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIHJlbmRlciA8PCB2YWwgPDwgIiwgIiA8PCBrZXk7CisgICAgfQorICAgIGlmIChmaXJzdCkKKyAgICAgIHJlbmRlciA8PCAiIG5pbF0iOworICAgIGVsc2UKKyAgICAgIHJlbmRlciA8PCAiLCBuaWxdIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZW5kZXIgPDwgIltbTlNBcnJheSBhbGxvY10gaW5pdFdpdGhPYmplY3RzOiAiOworICAgIHRfdHlwZSAqIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlbmRlciA8PCAiLCAiOworICAgICAgfQorICAgICAgcmVuZGVyIDw8IHJlbmRlcl9jb25zdF92YWx1ZShuYW1lLCBldHlwZSwgKnZfaXRlciwgdHJ1ZSk7CisgICAgfQorICAgIGlmIChmaXJzdCkKKyAgICAgIHJlbmRlciA8PCAiIG5pbF0iOworICAgIGVsc2UKKyAgICAgIHJlbmRlciA8PCAiLCBuaWxdIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJlbmRlciA8PCAiW1tOU1NldCBhbGxvY10gaW5pdFdpdGhPYmplY3RzOiAiOworICAgIHRfdHlwZSAqIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVuZGVyIDw8ICIsICI7CisgICAgICB9CisgICAgICByZW5kZXIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKG5hbWUsIGV0eXBlLCAqdl9pdGVyLCB0cnVlKTsKKyAgICB9CisgICAgaWYgKGZpcnN0KQorICAgICAgcmVuZGVyIDw8ICIgbmlsXSI7CisgICAgZWxzZQorICAgICAgcmVuZGVyIDw8ICIsIG5pbF0iOworICB9IGVsc2UgeworICAgIHRocm93ICJkb24ndCBrbm93IGhvdyB0byByZW5kZXIgY29uc3RhbnQgZm9yIHR5cGU6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworICB9CisKKyAgaWYgKGJveF9pdCkgeworICAgIHJldHVybiBib3godHlwZSwgcmVuZGVyLnN0cigpKTsKKyAgfQorCisgIHJldHVybiByZW5kZXIuc3RyKCk7Cit9CisjZW5kaWYKKworLyoqCisgKiBEZWNsYXJlcyBhbiBPYmplY3RpdmUtQyAyLjAgcHJvcGVydHkuCisgKgorICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gZGVjbGFyZSBhIHByb3BlcnR5IGZvcgorICovCitzdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmRlY2xhcmVfcHJvcGVydHkodF9maWVsZCogdGZpZWxkKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSByZW5kZXI7CisgIHJlbmRlciA8PCAiQHByb3BlcnR5ICgiOworCisgIGlmICh0eXBlX2Nhbl9iZV9jb3B5KHRmaWVsZC0+Z2V0X3R5cGUoKSkpIHsKKyAgICByZW5kZXIgPDwgImNvcHksICI7CisgIH0gZWxzZSBpZiAodHlwZV9jYW5fYmVfbnVsbCh0ZmllbGQtPmdldF90eXBlKCkpKSB7CisgICAgcmVuZGVyIDw8ICJzdHJvbmcsICI7CisgIH0gZWxzZSB7CisgICAgcmVuZGVyIDw8ICJhc3NpZ24sICI7CisgIH0KKworICByZW5kZXIgPDwgIm5vbmF0b21pYykgIiA8PCB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpLCBmYWxzZSwgdHJ1ZSkgPDwgIiAiCisgIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiOyI7CisKKyAgLy8gQ2hlY2sgaWYgdGhlIHByb3BlcnR5IG5hbWUgaXMgYW4gT2JqZWN0aXZlLUMgcmV0dXJuICsxIGNvdW50IHNpZ25hbAorICBpZiAoKHRmaWVsZC0+Z2V0X25hbWUoKS5sZW5ndGgoKSA+PSAzICYmIHRmaWVsZC0+Z2V0X25hbWUoKS5zdWJzdHIoMCwzKSA9PSAibmV3IikgfHwKKyAgICAgICh0ZmllbGQtPmdldF9uYW1lKCkubGVuZ3RoKCkgPj0gNiAmJiB0ZmllbGQtPmdldF9uYW1lKCkuc3Vic3RyKDAsNikgPT0gImNyZWF0ZSIpIHx8CisgICAgICAodGZpZWxkLT5nZXRfbmFtZSgpLmxlbmd0aCgpID49IDUgJiYgdGZpZWxkLT5nZXRfbmFtZSgpLnN1YnN0cigwLDUpID09ICJhbGxvYyIpKSB7CisgICAgLy8gTGV0IE9iamVjdGl2ZS1DIGtub3cgbm90IHRvIHJldHVybiArMSBmb3Igb2JqZWN0IHBvaW50ZXJzCisgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodGZpZWxkLT5nZXRfdHlwZSgpKSkgeworICAgICAgcmVuZGVyIDw8IGVuZGw7CisgICAgICByZW5kZXIgPDwgIi0gKCIgKyB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpKSArICIpICIgKyBkZWNhcGl0YWxpemUodGZpZWxkLT5nZXRfbmFtZSgpKSArICIgX19hdHRyaWJ1dGVfXygob2JqY19tZXRob2RfZmFtaWx5KG5vbmUpKSk7IjsKKyAgICB9CisgIH0KKworICByZXR1cm4gcmVuZGVyLnN0cigpOworfQorCisvKioKKyAqIERlY2xhcmVzIGFuIE9iamVjdGl2ZS1DIDIuMCBwcm9wZXJ0eS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBkZWNsYXJlIGEgcHJvcGVydHkgZm9yCisgKi8KK3N0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6ZGVjbGFyZV9wcm9wZXJ0eV9pc3NldCh0X2ZpZWxkKiB0ZmllbGQpIHsKKyAgcmV0dXJuICJAcHJvcGVydHkgKGFzc2lnbiwgbm9uYXRvbWljKSBCT09MICIgKyBkZWNhcGl0YWxpemUodGZpZWxkLT5nZXRfbmFtZSgpKSArICJJc1NldDsiOworfQorCisvKioKKyAqIERlY2xhcmVzIHByb3BlcnR5IHVuc2V0IG1ldGhvZC4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBkZWNsYXJlIGEgcHJvcGVydHkgZm9yCisgKi8KK3N0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6ZGVjbGFyZV9wcm9wZXJ0eV91bnNldCh0X2ZpZWxkKiB0ZmllbGQpIHsKKyAgcmV0dXJuICItICh2b2lkKSB1bnNldCIgKyBjYXBpdGFsaXplKHRmaWVsZC0+Z2V0X25hbWUoKSkgKyAiOyI7Cit9CisKKy8qKgorICogUmVuZGVycyB0aGUgZWFybHkgb3V0IHJldHVybiBzdGF0ZW1lbnQKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGludmFsaWQgcmV0dXJuIHN0YXRtZW50CisgKi8KK3N0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6aW52YWxpZF9yZXR1cm5fc3RhdGVtZW50KHRfZnVuY3Rpb24gKnRmdW5jdGlvbikgeworICBpZiAoKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSkgeworICAgIHJldHVybiAicmV0dXJuIE5POyI7CisgIH0KKyAgcmV0dXJuICJyZXR1cm4gbmlsOyI7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZQorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCitzdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIGJvb2wgaW5jbHVkZV9lcnJvcikgeworICB0X3R5cGUqIHR0eXBlID0gdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOworICBzdHJpbmcgcmVzdWx0OworICBpZiAodHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHJlc3VsdCA9ICIoQk9PTCkiOworICB9CisgIGVsc2UgaWYgKHR5cGVfY2FuX2JlX251bGwodHR5cGUpKSB7CisgICAgcmVzdWx0ID0gIigiICsgdHlwZV9uYW1lKHR0eXBlKSArICIpIjsKKyAgfQorICBlbHNlIHsKKyAgICByZXN1bHQgPSAiKE5TTnVtYmVyICopIjsKKyAgfQorICByZXN1bHQgKz0gIiAiICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCksICIiLCBpbmNsdWRlX2Vycm9yKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIHRoYXQgcmV0dXJucyBhc3luY2hyb25vdXNseSBpbnN0ZWFkIG9mCisgKiBsaXRlcmFsbHkgcmV0dXJuaW5nLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCitzdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmFzeW5jX2Z1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIGJvb2wgaW5jbHVkZV9lcnJvcikgeworICB0X3R5cGUqIHR0eXBlID0gdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOworICB0X3N0cnVjdCogdGFyZ2xpc3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgIHN0cmluZyByZXNwb25zZV9wYXJhbSA9ICJ2b2lkICheKSgiICsgKCh0dHlwZS0+aXNfdm9pZCgpKSA/ICIiIDogdHlwZV9uYW1lKHR0eXBlKSkgKyAiKSI7CisgIHN0ZDo6c3RyaW5nIHJlc3VsdCA9ICIodm9pZCkgIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLCAiIiwgaW5jbHVkZV9lcnJvcikKKyAgKyAodGFyZ2xpc3QtPmdldF9tZW1iZXJzKCkuc2l6ZSgpID8gIiByZXNwb25zZSIgOiAiIikgKyAiOiAoIgorICArIHJlc3BvbnNlX3BhcmFtICsgIikgcmVzcG9uc2VCbG9jayAiCisgICsgImZhaWx1cmUgOiAoVEFzeW5jRmFpbHVyZUJsb2NrKSBmYWlsdXJlQmxvY2siOworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgdGhhdCByZXR1cm5zIGEgcHJvbWlzZSBpbnN0ZWFkIG9mCisgKiBsaXRlcmFsbHkgcmV0dXJuaW5nLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCitzdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OnByb21pc2VfZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICByZXR1cm4gIihBbnlQcm9taXNlICopICIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSwgIiIsIGZhbHNlKTsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgY29sb24gc2VwYXJhdGVkIGxpc3Qgb2YgdHlwZXMgYW5kIG5hbWVzLCBzdWl0YWJsZSBmb3IgYW4KKyAqIG9iamVjdGl2ZS1jIHBhcmFtZXRlciBsaXN0CisgKi8KK3N0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByb3RvY29sX25hbWUsIGJvb2wgaW5jbHVkZV9lcnJvcikgeworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisgIGJvb2wgaW5jbHVkZV9wcm90b2NvbCA9ICFwcm90b2NvbF9uYW1lLmVtcHR5KCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHJpbmcgYXJnUHJlZml4ID0gIiI7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBhcmdQcmVmaXggPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgICByZXN1bHQgKz0gIiAiOworICAgIH0KKyAgICByZXN1bHQgKz0gYXJnUHJlZml4ICsgIjogKCIgKyB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSArICIpICIgKyAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgIH0KKyAgaWYgKGluY2x1ZGVfcHJvdG9jb2wpIHsKKyAgICBpZiAoIWZpcnN0KSB7CisgICAgICByZXN1bHQgKz0gIiBwcm90b2NvbCI7CisgICAgfQorICAgIHJlc3VsdCArPSAiOiAoaWQ8VFByb3RvY29sPikgIiArIHByb3RvY29sX25hbWU7CisgICAgZmlyc3QgPSBmYWxzZTsKKyAgfQorICBpZiAoaW5jbHVkZV9lcnJvcikgeworICAgIGlmICghZmlyc3QpIHsKKyAgICAgIHJlc3VsdCArPSAiIGVycm9yIjsKKyAgICB9CisgICAgcmVzdWx0ICs9ICI6IChOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKilfX3RocmlmdEVycm9yIjsKKyAgICBmaXJzdCA9IGZhbHNlOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYW4gT2JqZWN0aXZlLUMgZW51bSBzdHJpbmcgZm9yIHRoZSBnaXZlbiB0eXBlLgorICovCitzdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIlRUeXBlU1RSSU5HIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIlRUeXBlQk9PTCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiVFR5cGVCWVRFIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiVFR5cGVJMTYiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJUVHlwZUkzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlRUeXBlSTY0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiVFR5cGVET1VCTEUiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlSTMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJUVHlwZVNUUlVDVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlTUFQIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiVFR5cGVTRVQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiVFR5cGVMSVNUIjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworLyoqCisgKiBSZXR1cm5zIGEgZm9ybWF0IHN0cmluZyBzcGVjaWZpZXIgZm9yIHRoZSBzdXBwbGllZCBwYXJzZSB0eXBlLgorICovCitzdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmZvcm1hdF9zdHJpbmdfZm9yX3R5cGUodF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJcXFwiJUBcXFwiIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIiVpIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICIlaSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIiVoaSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIiVpIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiJXFpIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiJWYiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIiVpIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICIlQCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIiVAIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiJUAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiJUAiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiBmb3JtYXRfc3RyaW5nX2Zvcl90eXBlOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworLyoqCisgKiBSZXR1cm5zIGEgZm9ybWF0IGNhc3QgZm9yIHRoZSBzdXBwbGllZCBwYXJzZSB0eXBlLgorICovCitzdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmZvcm1hdF9jYXN0X2Zvcl90eXBlKHRfdHlwZSogdHlwZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiIjsgLy8gIlxcXCIlQFxcXCIiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiIjsgLy8gIiVpIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICIiOyAvLyAiJWkiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICIiOyAvLyAiJWhpIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiKGludCkiOyAvLyAiJWkiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICIiOyAvLyAiJXFpIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiIjsgLy8gIiVmIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICIoaW50KSI7IC8vICIlaSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiIjsgLy8gIiVAIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiIjsgLy8gIiVAIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiIjsgLy8gIiVAIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIiI7IC8vICIlQCI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIGZvcm1hdF9jYXN0X2Zvcl90eXBlOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZSBhIGNhbGwgdG8gYSBmaWVsZCdzIHNldHRlci4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIEZpZWxkIHRoZSBzZXR0ZXIgaXMgYmVpbmcgY2FsbGVkIG9uCisgKiBAcGFyYW0gZmllbGROYW1lIE5hbWUgb2YgdmFyaWFibGUgdG8gcGFzcyB0byBzZXR0ZXIKKyAqLworCitzdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmNhbGxfZmllbGRfc2V0dGVyKHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIGZpZWxkTmFtZSkgeworICByZXR1cm4gInNlbGYuIiArIHRmaWVsZC0+Z2V0X25hbWUoKSArICIgPSAiICsgZmllbGROYW1lICsgIjsiOworfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAorICAgIGNvY29hLAorICAgICJDb2NvYSIsCisgICAgIiAgICBsb2dfdW5leHBlY3RlZDogIExvZyBldmVyeSB0aW1lIGFuIHVuZXhwZWN0ZWQgZmllbGQgSUQgb3IgdHlwZSBpcyBlbmNvdW50ZXJlZC5cbiIKKyAgICAiICAgIGRlYnVnX2Rlc2NyaXB0aW9uczpcbiIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgQWxsb3cgdXNlIG9mIGRlYnVnRGVzY3JpcHRpb24gc28gdGhlIGFwcCBjYW4gYWRkIGRlc2NyaXB0aW9uIHZpYSBhIGNhdGVvZ29yeS9leHRlbnNpb25cbiIKKyAgICAiICAgIHZhbGlkYXRlX3JlcXVpcmVkOlxuIgorICAgICIgICAgICAgICAgICAgICAgICAgICBUaHJvd3MgZXhjZXB0aW9uIGlmIGFueSByZXF1aXJlZCBmaWVsZCBpcyBub3Qgc2V0LlxuIgorICAgICIgICAgYXN5bmNfY2xpZW50czogICBHZW5lcmF0ZSBjbGllbnRzIHdoaWNoIGludm9rZSBhc3luY2hyb25vdXNseSB2aWEgYmxvY2sgc3ludGF4LlxuIgorICAgICIgICAgcG9kczogICAgICAgICAgICBHZW5lcmF0ZSBpbXBvcnRzIGluIENvY29wb2RzIGZyYW1ld29yayBmb3JtYXQuXG4iCisgICAgIiAgICBwcm9taXNlX2tpdDogICAgIEdlbmVyYXRlIGNsaWVudHMgd2hpY2ggaW52b2tlIGFzeW5jaHJvbm91c2x5IHZpYSBwcm9taXNlcy5cbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NwcF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NwcF9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YzMDM2MwotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY3BwX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDQ0OTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorCisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb21hbmlwPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b2ZzdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKKy8qKgorICogQysrIGNvZGUgZ2VuZXJhdG9yLiBUaGlzIGlzIGxlZ2l0aW1hY3kgaW5jYXJuYXRlLgorICoKKyAqLworY2xhc3MgdF9jcHBfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfY3BwX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKworICAgIGdlbl9wdXJlX2VudW1zXyA9IGZhbHNlOworICAgIHVzZV9pbmNsdWRlX3ByZWZpeF8gPSBmYWxzZTsKKyAgICBnZW5fY29iX3N0eWxlXyA9IGZhbHNlOworICAgIGdlbl9ub19jbGllbnRfY29tcGxldGlvbl8gPSBmYWxzZTsKKyAgICBnZW5fbm9fZGVmYXVsdF9vcGVyYXRvcnNfID0gZmFsc2U7CisgICAgZ2VuX3RlbXBsYXRlc18gPSBmYWxzZTsKKyAgICBnZW5fdGVtcGxhdGVzX29ubHlfID0gZmFsc2U7CisgICAgZ2VuX21vdmVhYmxlXyA9IGZhbHNlOworICAgIGdlbl9ub19vc3RyZWFtX29wZXJhdG9yc18gPSBmYWxzZTsKKyAgICBnZW5fbm9fc2tlbGV0b25fID0gZmFsc2U7CisKKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJwdXJlX2VudW1zIikgPT0gMCkgeworICAgICAgICBnZW5fcHVyZV9lbnVtc18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJpbmNsdWRlX3ByZWZpeCIpID09IDApIHsKKyAgICAgICAgdXNlX2luY2x1ZGVfcHJlZml4XyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImNvYl9zdHlsZSIpID09IDApIHsKKyAgICAgICAgZ2VuX2NvYl9zdHlsZV8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJub19jbGllbnRfY29tcGxldGlvbiIpID09IDApIHsKKyAgICAgICAgZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoIm5vX2RlZmF1bHRfb3BlcmF0b3JzIikgPT0gMCkgeworICAgICAgICBnZW5fbm9fZGVmYXVsdF9vcGVyYXRvcnNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgidGVtcGxhdGVzIikgPT0gMCkgeworICAgICAgICBnZW5fdGVtcGxhdGVzXyA9IHRydWU7CisgICAgICAgIGdlbl90ZW1wbGF0ZXNfb25seV8gPSAoaXRlci0+c2Vjb25kID09ICJvbmx5Iik7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoIm1vdmVhYmxlX3R5cGVzIikgPT0gMCkgeworICAgICAgICBnZW5fbW92ZWFibGVfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiAoIGl0ZXItPmZpcnN0LmNvbXBhcmUoIm5vX29zdHJlYW1fb3BlcmF0b3JzIikgPT0gMCkgeworICAgICAgICBnZW5fbm9fb3N0cmVhbV9vcGVyYXRvcnNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiAoIGl0ZXItPmZpcnN0LmNvbXBhcmUoIm5vX3NrZWxldG9uIikgPT0gMCkgeworICAgICAgICBnZW5fbm9fc2tlbGV0b25fID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBjcHA6IiArIGl0ZXItPmZpcnN0OworICAgICAgfQorICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWNwcCI7CisgIH0KKworICAvKioKKyAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcworICAgKi8KKworICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7CisgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7CisKKyAgLyoqCisgICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfZW51bV9vc3RyZWFtX29wZXJhdG9yX2RlY2woc3RkOjpvc3RyZWFtJiBvdXQsIHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX2VudW1fb3N0cmVhbV9vcGVyYXRvcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfZm9yd2FyZF9kZWNsYXJhdGlvbih0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7IGdlbmVyYXRlX2NwcF9zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOyB9CisgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeyBnZW5lcmF0ZV9jcHBfc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7IH0KKyAgdm9pZCBnZW5lcmF0ZV9jcHBfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIHZvaWQgcHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpOworCisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0X2RlY2xhcmF0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24gPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVycyA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlYWQgPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHdyaXRlID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzd2FwID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfdXNlcl9zdHJ1Y3QgPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBmb3JjZV9jcHBfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2V0dGVycyA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc191c2VyX3N0cnVjdCA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb3B5X2NvbnN0cnVjdG9yKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX21vdmVfY29uc3RydWN0b3Ioc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfY29uc3RydWN0b3JfaGVscGVyKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNwZXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfbW92ZSk7CisgIHZvaWQgZ2VuZXJhdGVfYXNzaWdubWVudF9vcGVyYXRvcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX21vdmVfYXNzaWdubWVudF9vcGVyYXRvcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2Fzc2lnbm1lbnRfaGVscGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19tb3ZlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3RfcmVhZGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBwb2ludGVycyA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBwb2ludGVycyA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgcG9pbnRlcnMgPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0X3N3YXAoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3RfcHJpbnRfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZXhjZXB0aW9uX3doYXRfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgLyoqCisgICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlLCBzdHJpbmcgc3R5bGUpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlX2ZhY3RvcnkodF9zZXJ2aWNlKiB0c2VydmljZSwgc3RyaW5nIHN0eWxlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX251bGwodF9zZXJ2aWNlKiB0c2VydmljZSwgc3RyaW5nIHN0eWxlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX211bHRpZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSwgc3RyaW5nIHN0eWxlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0X3NlcnZpY2UqIHRzZXJ2aWNlLCBzdHJpbmcgc3R5bGUpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2tlbGV0b24odF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzcGVjaWFsaXplZCA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9hc3luY19za2VsZXRvbih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICAvKioKKyAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHN1ZmZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXIgPSBmYWxzZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwdXNoX2JhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGluZGV4KTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc3VmZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXIgPSBmYWxzZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdGQ6OnN0cmluZyBpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbl9jYWxsKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgYXJnX3ByZWZpeCk7CisgIC8qCisgICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCisgICAqLworCisgIHN0ZDo6c3RyaW5nIG5hbWVzcGFjZV9wcmVmaXgoc3RkOjpzdHJpbmcgbnMpOworICBzdGQ6OnN0cmluZyBuYW1lc3BhY2Vfb3BlbihzdGQ6OnN0cmluZyBucyk7CisgIHN0ZDo6c3RyaW5nIG5hbWVzcGFjZV9jbG9zZShzdGQ6OnN0cmluZyBucyk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGluX3R5cGVkZWYgPSBmYWxzZSwgYm9vbCBhcmcgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UpOworICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluaXQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXIgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNvbnN0YW50ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZWZlcmVuY2UgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBuYW1lX3BhcmFtcyA9IHRydWUpOworICBzdGQ6OnN0cmluZyBjb2JfZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5hbWVfcGFyYW1zID0gdHJ1ZSk7CisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgbmFtZV9wYXJhbXMgPSB0cnVlLCBib29sIHN0YXJ0X2NvbW1hID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtX2NvbnN0YW50X2xpc3Qoc3RkOjpvc3RyZWFtJiBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4mIGNvbnN0YW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbHVkZV92YWx1ZXMpOworCisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0X29zdHJlYW1fb3BlcmF0b3JfZGVjbChzdGQ6Om9zdHJlYW0mIGYsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3Rfb3N0cmVhbV9vcGVyYXRvcihzdGQ6Om9zdHJlYW0mIGYsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3RfcHJpbnRfbWV0aG9kX2RlY2woc3RkOjpvc3RyZWFtJiBmLCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZXhjZXB0aW9uX3doYXRfbWV0aG9kX2RlY2woc3RkOjpvc3RyZWFtJiBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZXh0ZXJuYWwgPSBmYWxzZSk7CisKKyAgYm9vbCBpc19yZWZlcmVuY2UodF9maWVsZCogdGZpZWxkKSB7IHJldHVybiB0ZmllbGQtPmdldF9yZWZlcmVuY2UoKTsgfQorCisgIGJvb2wgaXNfY29tcGxleF90eXBlKHRfdHlwZSogdHR5cGUpIHsKKyAgICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworCisgICAgcmV0dXJuIHR0eXBlLT5pc19jb250YWluZXIoKSB8fCB0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkKKyAgICAgICAgICAgfHwgKHR0eXBlLT5pc19iYXNlX3R5cGUoKQorICAgICAgICAgICAgICAgJiYgKCgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcpKTsKKyAgfQorCisgIHZvaWQgc2V0X3VzZV9pbmNsdWRlX3ByZWZpeChib29sIHVzZV9pbmNsdWRlX3ByZWZpeCkgeyB1c2VfaW5jbHVkZV9wcmVmaXhfID0gdXNlX2luY2x1ZGVfcHJlZml4OyB9CisKKyAgLyoqCisgICAqIFRoZSBjb21waWxlciBvcHRpb24gIm5vX3RocmlmdF9vc3RyZWFtX2ltcGwiIGNhbiBiZSB1c2VkIHRvIHByZXZlbnQKKyAgICogdGhlIGNvbXBpbGVyIGZyb20gZW1pdHRpbmcgaW1wbGVtZW50YXRpb25zIGZvciBvcGVyYXRvciA8PC4gIEluIHRoaXMKKyAgICogY2FzZSB0aGUgY29uc3VtaW5nIGFwcGxpY2F0aW9uIG11c3QgcHJvdmlkZSBhbnkgbmVlZGVkIHRvIGJ1aWxkLgorICAgKgorICAgKiBUbyBkaXNhYmxlIHRoaXMgb24gYSBwZXIgc3RydWN0dXJlIGJhc2VzLCBvbmUgY2FuIGFsdGVybmF0aXZlbHkgc2V0CisgICAqIHRoZSBhbm5vdGF0aW9uICJjcHAuY3VzdG9tb3N0cmVhbSIgdG8gcHJldmVudCB0aHJpZnQgZnJvbSBlbWl0dGluZyBhbgorICAgKiBvcGVyYXRvciA8PCAoc3RkOjpvc3RyZWFtJikuCisgICAqCisgICAqIFNlZSBBbm5vdGF0aW9uVGVzdCBmb3IgdmFsaWRhdGlvbiBvZiB0aGlzIGFubm90YXRpb24gZmVhdHVyZS4KKyAgICovCisgIGJvb2wgaGFzX2N1c3RvbV9vc3RyZWFtKHRfdHlwZSogdHR5cGUpIGNvbnN0IHsKKyAgICByZXR1cm4gKGdlbl9ub19vc3RyZWFtX29wZXJhdG9yc18pIHx8CisgICAgICAgICAgICh0dHlwZS0+YW5ub3RhdGlvbnNfLmZpbmQoImNwcC5jdXN0b21vc3RyZWFtIikgIT0gdHR5cGUtPmFubm90YXRpb25zXy5lbmQoKSk7CisgIH0KKworcHJpdmF0ZToKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIGluY2x1ZGUgcHJlZml4IHRvIHVzZSBmb3IgYSBmaWxlIGdlbmVyYXRlZCBieSBwcm9ncmFtLCBvciB0aGUKKyAgICogZW1wdHkgc3RyaW5nIGlmIG5vIGluY2x1ZGUgcHJlZml4IHNob3VsZCBiZSB1c2VkLgorICAgKi8KKyAgc3RkOjpzdHJpbmcgZ2V0X2luY2x1ZGVfcHJlZml4KGNvbnN0IHRfcHJvZ3JhbSYgcHJvZ3JhbSkgY29uc3Q7CisKKyAgLyoqCisgICAqIFRydWUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIHB1cmUgZW51bXMgZm9yIFRocmlmdCBlbnVtcywgaW5zdGVhZCBvZiB3cmFwcGVyIGNsYXNzZXMuCisgICAqLworICBib29sIGdlbl9wdXJlX2VudW1zXzsKKworICAvKioKKyAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgdGVtcGxhdGl6ZWQgcmVhZGVyL3dyaXRlciBtZXRob2RzLgorICAgKi8KKyAgYm9vbCBnZW5fdGVtcGxhdGVzXzsKKworICAvKioKKyAgICogVHJ1ZSBpZmYgd2Ugc2hvdWxkIGdlbmVyYXRlIHByb2Nlc3MgZnVuY3Rpb24gcG9pbnRlcnMgZm9yIG9ubHkgdGVtcGxhdGl6ZWQKKyAgICogcmVhZGVyL3dyaXRlciBtZXRob2RzLgorICAgKi8KKyAgYm9vbCBnZW5fdGVtcGxhdGVzX29ubHlfOworCisgIC8qKgorICAgKiBUcnVlIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSBtb3ZlIGNvbnN0cnVjdG9ycyAmIGFzc2lnbm1lbnQgb3BlcmF0b3JzLgorICAgKi8KKyAgYm9vbCBnZW5fbW92ZWFibGVfOworCisgIC8qKgorICAgKiBUcnVlIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSBvc3RyZWFtIGRlZmluaXRpb25zCisgICAqLworICBib29sIGdlbl9ub19vc3RyZWFtX29wZXJhdG9yc187CisKKyAgLyoqCisgICAqIFRydWUgaWZmIHdlIHNob3VsZCB1c2UgYSBwYXRoIHByZWZpeCBpbiBvdXIgI2luY2x1ZGUgc3RhdGVtZW50cyBmb3Igb3RoZXIKKyAgICogdGhyaWZ0LWdlbmVyYXRlZCBoZWFkZXIgZmlsZXMuCisgICAqLworICBib29sIHVzZV9pbmNsdWRlX3ByZWZpeF87CisKKyAgLyoqCisgICAqIFRydWUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlICJDb250aW51YXRpb24gT0JqZWN0Ii1zdHlsZSBjbGFzc2VzIGFzIHdlbGwuCisgICAqLworICBib29sIGdlbl9jb2Jfc3R5bGVfOworCisgIC8qKgorICAgKiBUcnVlIGlmIHdlIHNob3VsZCBvbWl0IGNhbGxzIHRvIGNvbXBsZXRpb25fXygpIGluIENvYkNsaWVudCBjbGFzcy4KKyAgICovCisgIGJvb2wgZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXzsKKworICAvKioKKyAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgb21pdCBnZW5lcmF0aW5nIHRoZSBkZWZhdWx0IG9wZWFydG9ycyA9PSwgIT0gYW5kIDwuCisgICAqLworICBib29sIGdlbl9ub19kZWZhdWx0X29wZXJhdG9yc187CisKKyAgIC8qKgorICAgKiBUcnVlIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSBza2VsZXRvbi4KKyAgICovCisgIGJvb2wgZ2VuX25vX3NrZWxldG9uXzsKKworICAvKioKKyAgICogU3RyaW5ncyBmb3IgbmFtZXNwYWNlLCBjb21wdXRlZCBvbmNlIHVwIGZyb250IHRoZW4gdXNlZCBkaXJlY3RseQorICAgKi8KKworICBzdGQ6OnN0cmluZyBuc19vcGVuXzsKKyAgc3RkOjpzdHJpbmcgbnNfY2xvc2VfOworCisgIC8qKgorICAgKiBGaWxlIHN0cmVhbXMsIHN0b3JlZCBoZXJlIHRvIGF2b2lkIHBhc3NpbmcgdGhlbSBhcyBwYXJhbWV0ZXJzIHRvIGV2ZXJ5CisgICAqIGZ1bmN0aW9uLgorICAgKi8KKworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfdHlwZXNfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfdHlwZXNfaW1wbF87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl90eXBlc190Y2NfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfaGVhZGVyXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2VfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZV90Y2NfOworCisgIC8vIFRoZSBQcm9jZXNzb3JHZW5lcmF0b3IgaXMgdXNlZCB0byBnZW5lcmF0ZSBwYXJ0cyBvZiB0aGUgY29kZSwKKyAgLy8gc28gaXQgbmVlZHMgYWNjZXNzIHRvIG1hbnkgb2Ygb3VyIHByb3RlY3RlZCBtZW1iZXJzIGFuZCBtZXRob2RzLgorICAvLworICAvLyBUT0RPOiBUaGUgY29kZSByZWFsbHkgc2hvdWxkIGJlIGNsZWFuZWQgdXAgc28gdGhhdCBoZWxwZXIgbWV0aG9kcyBmb3IKKyAgLy8gd3JpdGluZyB0byB0aGUgb3V0cHV0IGZpbGVzIGFyZSBzZXBhcmF0ZSBmcm9tIHRoZSBnZW5lcmF0b3IgY2xhc3NlcworICAvLyB0aGVtc2VsdmVzLgorICBmcmllbmQgY2xhc3MgUHJvY2Vzc29yR2VuZXJhdG9yOworfTsKKworLyoqCisgKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAorICogc3RyZWFtcy4KKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKKyAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKKworICAvLyBNYWtlIG91dHB1dCBmaWxlCisgIHN0cmluZyBmX3R5cGVzX25hbWUgPSBnZXRfb3V0X2RpcigpICsgcHJvZ3JhbV9uYW1lXyArICJfdHlwZXMuaCI7CisgIGZfdHlwZXNfLm9wZW4oZl90eXBlc19uYW1lKTsKKworICBzdHJpbmcgZl90eXBlc19pbXBsX25hbWUgPSBnZXRfb3V0X2RpcigpICsgcHJvZ3JhbV9uYW1lXyArICJfdHlwZXMuY3BwIjsKKyAgZl90eXBlc19pbXBsXy5vcGVuKGZfdHlwZXNfaW1wbF9uYW1lLmNfc3RyKCkpOworCisgIGlmIChnZW5fdGVtcGxhdGVzXykgeworICAgIC8vIElmIHdlIGRvbid0IG9wZW4gdGhlIHN0cmVhbSwgaXQgYXBwZWFycyB0byBqdXN0IGRpc2NhcmQgZGF0YSwKKyAgICAvLyB3aGljaCBpcyBmaW5lLgorICAgIHN0cmluZyBmX3R5cGVzX3RjY19uYW1lID0gZ2V0X291dF9kaXIoKSArIHByb2dyYW1fbmFtZV8gKyAiX3R5cGVzLnRjYyI7CisgICAgZl90eXBlc190Y2NfLm9wZW4oZl90eXBlc190Y2NfbmFtZS5jX3N0cigpKTsKKyAgfQorCisgIC8vIFByaW50IGhlYWRlcgorICBmX3R5cGVzXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKTsKKyAgZl90eXBlc19pbXBsXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKTsKKyAgZl90eXBlc190Y2NfIDw8IGF1dG9nZW5fY29tbWVudCgpOworCisgIC8vIFN0YXJ0IGlmbmRlZgorICBmX3R5cGVzXyA8PCAiI2lmbmRlZiAiIDw8IHByb2dyYW1fbmFtZV8gPDwgIl9UWVBFU19IIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIgPDwgcHJvZ3JhbV9uYW1lXworICAgICAgICAgICA8PCAiX1RZUEVTX0giIDw8IGVuZGwgPDwgZW5kbDsKKyAgZl90eXBlc190Y2NfIDw8ICIjaWZuZGVmICIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX1RZUEVTX1RDQyIgPDwgZW5kbCA8PCAiI2RlZmluZSAiIDw8IHByb2dyYW1fbmFtZV8KKyAgICAgICAgICAgICAgIDw8ICJfVFlQRVNfVENDIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gSW5jbHVkZSBiYXNlIHR5cGVzCisgIGZfdHlwZXNfIDw8ICIjaW5jbHVkZSA8aW9zZndkPiIgPDwgZW5kbAorICAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L1RocmlmdC5oPiIgPDwgZW5kbAorICAgICAgICAgICA8PCAiI2luY2x1ZGUgPHRocmlmdC9UQXBwbGljYXRpb25FeGNlcHRpb24uaD4iIDw8IGVuZGwKKyAgICAgICAgICAgPDwgIiNpbmNsdWRlIDx0aHJpZnQvVEJhc2UuaD4iIDw8IGVuZGwKKyAgICAgICAgICAgPDwgIiNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmg+IiA8PCBlbmRsCisgICAgICAgICAgIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+IiA8PCBlbmRsCisgICAgICAgICAgIDw8IGVuZGw7CisgIC8vIEluY2x1ZGUgQysreHggY29tcGF0aWJpbGl0eSBoZWFkZXIKKyAgZl90eXBlc18gPDwgIiNpbmNsdWRlIDxmdW5jdGlvbmFsPiIgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgIiNpbmNsdWRlIDxtZW1vcnk+IiA8PCBlbmRsOworCisgIC8vIEluY2x1ZGUgb3RoZXIgVGhyaWZ0IGluY2x1ZGVzCisgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKKyAgICBmX3R5cGVzXyA8PCAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqKGluY2x1ZGVzW2ldKSkgPDwgaW5jbHVkZXNbaV0tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICA8PCAiX3R5cGVzLmhcIiIgPDwgZW5kbDsKKworICAgIC8vIFhYWChzaW1wa2lucyk6IElmIGdlbl90ZW1wbGF0ZXNfIGlzIGVuYWJsZWQsIHdlIGN1cnJlbnRseSBhc3N1bWUgYWxsCisgICAgLy8gaW5jbHVkZWQgZmlsZXMgd2VyZSBhbHNvIGdlbmVyYXRlZCB3aXRoIHRlbXBsYXRlcyBlbmFibGVkLgorICAgIGZfdHlwZXNfdGNjXyA8PCAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqKGluY2x1ZGVzW2ldKSkgPDwgaW5jbHVkZXNbaV0tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgPDwgIl90eXBlcy50Y2NcIiIgPDwgZW5kbDsKKyAgfQorICBmX3R5cGVzXyA8PCBlbmRsOworCisgIC8vIEluY2x1ZGUgY3VzdG9tIGhlYWRlcnMKKyAgY29uc3QgdmVjdG9yPHN0cmluZz4mIGNwcF9pbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfY3BwX2luY2x1ZGVzKCk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY3BwX2luY2x1ZGVzLnNpemUoKTsgKytpKSB7CisgICAgaWYgKGNwcF9pbmNsdWRlc1tpXVswXSA9PSAnPCcpIHsKKyAgICAgIGZfdHlwZXNfIDw8ICIjaW5jbHVkZSAiIDw8IGNwcF9pbmNsdWRlc1tpXSA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX3R5cGVzXyA8PCAiI2luY2x1ZGUgXCIiIDw8IGNwcF9pbmNsdWRlc1tpXSA8PCAiXCIiIDw8IGVuZGw7CisgICAgfQorICB9CisgIGZfdHlwZXNfIDw8IGVuZGw7CisKKyAgLy8gSW5jbHVkZSB0aGUgdHlwZXMgZmlsZQorICBmX3R5cGVzX2ltcGxfIDw8ICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCpnZXRfcHJvZ3JhbSgpKSA8PCBwcm9ncmFtX25hbWVfCisgICAgICAgICAgICAgICAgPDwgIl90eXBlcy5oXCIiIDw8IGVuZGwgPDwgZW5kbDsKKyAgZl90eXBlc190Y2NfIDw8ICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCpnZXRfcHJvZ3JhbSgpKSA8PCBwcm9ncmFtX25hbWVfCisgICAgICAgICAgICAgICA8PCAiX3R5cGVzLmhcIiIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIFRoZSBzd2FwKCkgY29kZSBuZWVkcyA8YWxnb3JpdGhtPiBmb3Igc3RkOjpzd2FwKCkKKyAgZl90eXBlc19pbXBsXyA8PCAiI2luY2x1ZGUgPGFsZ29yaXRobT4iIDw8IGVuZGw7CisgIC8vIGZvciBvcGVyYXRvcjw8CisgIGZfdHlwZXNfaW1wbF8gPDwgIiNpbmNsdWRlIDxvc3RyZWFtPiIgPDwgZW5kbCA8PCBlbmRsOworICBmX3R5cGVzX2ltcGxfIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L1RUb1N0cmluZy5oPiIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIE9wZW4gbmFtZXNwYWNlCisgIG5zX29wZW5fID0gbmFtZXNwYWNlX29wZW4ocHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoImNwcCIpKTsKKyAgbnNfY2xvc2VfID0gbmFtZXNwYWNlX2Nsb3NlKHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJjcHAiKSk7CisKKyAgZl90eXBlc18gPDwgbnNfb3Blbl8gPDwgZW5kbCA8PCBlbmRsOworCisgIGZfdHlwZXNfaW1wbF8gPDwgbnNfb3Blbl8gPDwgZW5kbCA8PCBlbmRsOworCisgIGZfdHlwZXNfdGNjXyA8PCBuc19vcGVuXyA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogQ2xvc2VzIHRoZSBvdXRwdXQgZmlsZXMuCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7CisgIC8vIENsb3NlIG5hbWVzcGFjZQorICBmX3R5cGVzXyA8PCBuc19jbG9zZV8gPDwgZW5kbCA8PCBlbmRsOworICBmX3R5cGVzX2ltcGxfIDw8IG5zX2Nsb3NlXyA8PCBlbmRsOworICBmX3R5cGVzX3RjY18gPDwgbnNfY2xvc2VfIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBJbmNsdWRlIHRoZSB0eXBlcy50Y2MgZmlsZSBmcm9tIHRoZSB0eXBlcyBoZWFkZXIgZmlsZSwKKyAgLy8gc28gY2xpZW50cyBkb24ndCBoYXZlIHRvIGV4cGxpY2l0bHkgaW5jbHVkZSB0aGUgdGNjIGZpbGUuCisgIC8vIFRPRE8oc2ltcGtpbnMpOiBNYWtlIHRoaXMgYSBzZXBhcmF0ZSBvcHRpb24uCisgIGlmIChnZW5fdGVtcGxhdGVzXykgeworICAgIGZfdHlwZXNfIDw8ICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCpnZXRfcHJvZ3JhbSgpKSA8PCBwcm9ncmFtX25hbWVfCisgICAgICAgICAgICAgPDwgIl90eXBlcy50Y2NcIiIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgLy8gQ2xvc2UgaWZuZGVmCisgIGZfdHlwZXNfIDw8ICIjZW5kaWYiIDw8IGVuZGw7CisgIGZfdHlwZXNfdGNjXyA8PCAiI2VuZGlmIiA8PCBlbmRsOworCisgIC8vIENsb3NlIG91dHB1dCBmaWxlCisgIGZfdHlwZXNfLmNsb3NlKCk7CisgIGZfdHlwZXNfaW1wbF8uY2xvc2UoKTsKKyAgZl90eXBlc190Y2NfLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBqdXN0IGEgc2ltcGxlIDEtbGluZXIgaW4gQysrCisgKgorICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAidHlwZWRlZiAiIDw8IHR5cGVfbmFtZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSwgdHJ1ZSkgPDwgIiAiCisgICAgICAgICAgIDw8IHR0eXBlZGVmLT5nZXRfc3ltYm9saWMoKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bV9jb25zdGFudF9saXN0KHN0ZDo6b3N0cmVhbSYgZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjdG9yPHRfZW51bV92YWx1ZSo+JiBjb25zdGFudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2x1ZGVfdmFsdWVzKSB7CisgIGYgPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGNfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBmIDw8ICIsIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQoZikgPDwgcHJlZml4IDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCBzdWZmaXg7CisgICAgaWYgKGluY2x1ZGVfdmFsdWVzKSB7CisgICAgICBmIDw8ICIgPSAiIDw8ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgfQorICB9CisKKyAgZiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZikgPDwgIn07IiA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuIEluIEMrKywgdGhpcyBpcyBlc3NlbnRpYWxseSB0aGUgc2FtZQorICogYXMgdGhlIHRocmlmdCBkZWZpbml0aW9uIGl0c2VsZiwgdXNpbmcgdGhlIGVudW0ga2V5d29yZCBpbiBDKysuCisgKgorICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworCisgIHN0ZDo6c3RyaW5nIGVudW1fbmFtZSA9IHRlbnVtLT5nZXRfbmFtZSgpOworICBpZiAoIWdlbl9wdXJlX2VudW1zXykgeworICAgIGVudW1fbmFtZSA9ICJ0eXBlIjsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAic3RydWN0ICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIiB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICB9CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJlbnVtICIgPDwgZW51bV9uYW1lOworCisgIGdlbmVyYXRlX2VudW1fY29uc3RhbnRfbGlzdChmX3R5cGVzXywgY29uc3RhbnRzLCAiIiwgIiIsIHRydWUpOworCisgIGlmICghZ2VuX3B1cmVfZW51bXNfKSB7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3R5cGVzXyA8PCAifTsiIDw8IGVuZGw7CisgIH0KKworICBmX3R5cGVzXyA8PCBlbmRsOworCisgIC8qKgorICAgICBHZW5lcmF0ZSBhIGNoYXJhY3RlciBhcnJheSBvZiBlbnVtIG5hbWVzIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuCisgICovCisgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiOworICBpZiAoIWdlbl9wdXJlX2VudW1zXykgeworICAgIHByZWZpeCA9IHRlbnVtLT5nZXRfbmFtZSgpICsgIjo6IjsKKyAgfQorCisgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImludCBfayIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIlZhbHVlc1tdID0iOworICBnZW5lcmF0ZV9lbnVtX2NvbnN0YW50X2xpc3QoZl90eXBlc19pbXBsXywgY29uc3RhbnRzLCBwcmVmaXguY19zdHIoKSwgIiIsIGZhbHNlKTsKKworICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJjb25zdCBjaGFyKiBfayIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIk5hbWVzW10gPSI7CisgIGdlbmVyYXRlX2VudW1fY29uc3RhbnRfbGlzdChmX3R5cGVzX2ltcGxfLCBjb25zdGFudHMsICJcIiIsICJcIiIsIGZhbHNlKTsKKworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiZXh0ZXJuIGNvbnN0IHN0ZDo6bWFwPGludCwgY29uc3QgY2hhcio+IF8iIDw8IHRlbnVtLT5nZXRfbmFtZSgpCisgICAgICAgICAgIDw8ICJfVkFMVUVTX1RPX05BTUVTOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgImNvbnN0IHN0ZDo6bWFwPGludCwgY29uc3QgY2hhcio+IF8iIDw8IHRlbnVtLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgPDwgIl9WQUxVRVNfVE9fTkFNRVMoOjphcGFjaGU6OnRocmlmdDo6VEVudW1JdGVyYXRvcigiIDw8IGNvbnN0YW50cy5zaXplKCkgPDwgIiwgX2siCisgICAgICAgICAgICAgICAgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIlZhbHVlcyIKKyAgICAgICAgICAgICAgICA8PCAiLCBfayIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIk5hbWVzKSwgIgorICAgICAgICAgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0OjpURW51bUl0ZXJhdG9yKC0xLCBOVUxMLCBOVUxMKSk7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZW51bV9vc3RyZWFtX29wZXJhdG9yX2RlY2woZl90eXBlc18sIHRlbnVtKTsKKyAgZ2VuZXJhdGVfZW51bV9vc3RyZWFtX29wZXJhdG9yKGZfdHlwZXNfaW1wbF8sIHRlbnVtKTsKK30KKwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW1fb3N0cmVhbV9vcGVyYXRvcl9kZWNsKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2VudW0qIHRlbnVtKSB7CisKKyAgb3V0IDw8ICJzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvdXQsIGNvbnN0ICI7CisgIGlmIChnZW5fcHVyZV9lbnVtc18pIHsKKyAgICBvdXQgPDwgdGVudW0tPmdldF9uYW1lKCk7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICI6OnR5cGUmIjsKKyAgfQorICBvdXQgPDwgIiB2YWwpOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtX29zdHJlYW1fb3BlcmF0b3Ioc3RkOjpvc3RyZWFtJiBvdXQsIHRfZW51bSogdGVudW0pIHsKKworICAvLyBJZiB3ZSd2ZSBiZWVuIHRvbGQgdGhlIGNvbnN1bWluZyBhcHBsaWNhdGlvbiB3aWxsIHByb3ZpZGUgYW4gb3N0cmVhbQorICAvLyBvcGVyYXRvciBkZWZpbml0aW9uIHRoZW4gd2Ugb25seSBtYWtlIGEgZGVjbGFyYXRpb246CisKKyAgaWYgKCFoYXNfY3VzdG9tX29zdHJlYW0odGVudW0pKSB7CisgICAgb3V0IDw8ICJzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvdXQsIGNvbnN0ICI7CisgICAgaWYgKGdlbl9wdXJlX2VudW1zXykgeworICAgICAgb3V0IDw8IHRlbnVtLT5nZXRfbmFtZSgpOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIjo6dHlwZSYiOworICAgIH0KKyAgICBvdXQgPDwgIiB2YWwpICI7CisgICAgc2NvcGVfdXAob3V0KTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAic3RkOjptYXA8aW50LCBjb25zdCBjaGFyKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gXyIKKyAgICAgICAgICAgICA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiX1ZBTFVFU19UT19OQU1FUy5maW5kKHZhbCk7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKGl0ICE9IF8iIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICJfVkFMVUVTX1RPX05BTUVTLmVuZCgpKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAib3V0IDw8IGl0LT5zZWNvbmQ7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIm91dCA8PCBzdGF0aWNfY2FzdDxpbnQ+KHZhbCk7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gb3V0OyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBjbGFzcyB0aGF0IGhvbGRzIGFsbCB0aGUgY29uc3RhbnRzLgorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpIHsKKyAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBnZXRfb3V0X2RpcigpICsgcHJvZ3JhbV9uYW1lXyArICJfY29uc3RhbnRzLmgiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfY29uc3RzOworICBmX2NvbnN0cy5vcGVuKGZfY29uc3RzX25hbWUpOworCisgIHN0cmluZyBmX2NvbnN0c19pbXBsX25hbWUgPSBnZXRfb3V0X2RpcigpICsgcHJvZ3JhbV9uYW1lXyArICJfY29uc3RhbnRzLmNwcCI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9jb25zdHNfaW1wbDsKKyAgZl9jb25zdHNfaW1wbC5vcGVuKGZfY29uc3RzX2ltcGxfbmFtZSk7CisKKyAgLy8gUHJpbnQgaGVhZGVyCisgIGZfY29uc3RzIDw8IGF1dG9nZW5fY29tbWVudCgpOworICBmX2NvbnN0c19pbXBsIDw8IGF1dG9nZW5fY29tbWVudCgpOworCisgIC8vIFN0YXJ0IGlmbmRlZgorICBmX2NvbnN0cyA8PCAiI2lmbmRlZiAiIDw8IHByb2dyYW1fbmFtZV8gPDwgIl9DT05TVEFOVFNfSCIgPDwgZW5kbCA8PCAiI2RlZmluZSAiIDw8IHByb2dyYW1fbmFtZV8KKyAgICAgICAgICAgPDwgIl9DT05TVEFOVFNfSCIgPDwgZW5kbCA8PCBlbmRsIDw8ICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCpnZXRfcHJvZ3JhbSgpKQorICAgICAgICAgICA8PCBwcm9ncmFtX25hbWVfIDw8ICJfdHlwZXMuaFwiIiA8PCBlbmRsIDw8IGVuZGwgPDwgbnNfb3Blbl8gPDwgZW5kbCA8PCBlbmRsOworCisgIGZfY29uc3RzX2ltcGwgPDwgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpIDw8IHByb2dyYW1fbmFtZV8KKyAgICAgICAgICAgICAgICA8PCAiX2NvbnN0YW50cy5oXCIiIDw8IGVuZGwgPDwgZW5kbCA8PCBuc19vcGVuXyA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZl9jb25zdHMgPDwgImNsYXNzICIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiQ29uc3RhbnRzIHsiIDw8IGVuZGwgPDwgIiBwdWJsaWM6IiA8PCBlbmRsIDw8ICIgICIKKyAgICAgICAgICAgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiQ29uc3RhbnRzKCk7IiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgc3RyaW5nIG5hbWUgPSAoKmNfaXRlciktPmdldF9uYW1lKCk7CisgICAgdF90eXBlKiB0eXBlID0gKCpjX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgIGZfY29uc3RzIDw8IGluZGVudCgpIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICIgPDwgbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBmX2NvbnN0cyA8PCAifTsiIDw8IGVuZGw7CisKKyAgZl9jb25zdHNfaW1wbCA8PCAiY29uc3QgIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJDb25zdGFudHMgZ18iIDw8IHByb2dyYW1fbmFtZV8gPDwgIl9jb25zdGFudHM7IgorICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbCA8PCBwcm9ncmFtX25hbWVfIDw8ICJDb25zdGFudHM6OiIgPDwgcHJvZ3JhbV9uYW1lXworICAgICAgICAgICAgICAgIDw8ICJDb25zdGFudHMoKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBwcmludF9jb25zdF92YWx1ZShmX2NvbnN0c19pbXBsLAorICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF90eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSk7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfY29uc3RzX2ltcGwpIDw8ICJ9IiA8PCBlbmRsOworCisgIGZfY29uc3RzIDw8IGVuZGwgPDwgImV4dGVybiBjb25zdCAiIDw8IHByb2dyYW1fbmFtZV8gPDwgIkNvbnN0YW50cyBnXyIgPDwgcHJvZ3JhbV9uYW1lXworICAgICAgICAgICA8PCAiX2NvbnN0YW50czsiIDw8IGVuZGwgPDwgZW5kbCA8PCBuc19jbG9zZV8gPDwgZW5kbCA8PCBlbmRsIDw8ICIjZW5kaWYiIDw8IGVuZGw7CisgIGZfY29uc3RzLmNsb3NlKCk7CisKKyAgZl9jb25zdHNfaW1wbCA8PCBlbmRsIDw8IG5zX2Nsb3NlXyA8PCBlbmRsIDw8IGVuZGw7CisgIGZfY29uc3RzX2ltcGwuY2xvc2UoKTsKK30KKworLyoqCisgKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKKyAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCisgKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYworICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfdmFsdWUob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgc3RyaW5nIHYyID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOworICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIiA9ICIgPDwgdjIgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIgPSAoIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIikiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICI7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgYm9vbCBpc19ub25yZXF1aXJlZF9maWVsZCA9IGZhbHNlOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgaXNfbm9ucmVxdWlyZWRfZmllbGQgPSBmYWxzZTsKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7CisgICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgICBpc19ub25yZXF1aXJlZF9maWVsZCA9ICgqZl9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIH0KKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuIiA8PCB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkgPDwgIiA9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOworICAgICAgaWYgKGlzX25vbnJlcXVpcmVkX2ZpZWxkKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi5fX2lzc2V0LiIgPDwgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpIDw8ICIgPSB0cnVlOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgc3RyaW5nIGtleSA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLmluc2VydChzdGQ6Om1ha2VfcGFpcigiIDw8IGtleSA8PCAiLCAiIDw8IHZhbCA8PCAiKSk7IiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgZXR5cGUsICp2X2l0ZXIpOworICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLnB1c2hfYmFjaygiIDw8IHZhbCA8PCAiKTsiIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF90eXBlKiBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgZXR5cGUsICp2X2l0ZXIpOworICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLmluc2VydCgiIDw8IHZhbCA8PCAiKTsiIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gcHJpbnRfY29uc3RfdmFsdWU6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworICB9Cit9CisKKy8qKgorICoKKyAqLworc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgKHZvaWQpbmFtZTsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlbmRlcjsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmVuZGVyIDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJlbmRlciA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiTEwiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICByZW5kZXIgPDwgInN0YXRpY19jYXN0PGRvdWJsZT4oIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiKSI7CisgICAgICB9IGVsc2UgeworICAgICAgICByZW5kZXIgPDwgZW1pdF9kb3VibGVfYXNfc3RyaW5nKHZhbHVlLT5nZXRfZG91YmxlKCkpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZW5kZXIgPDwgIigiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgIH0gZWxzZSB7CisgICAgc3RyaW5nIHQgPSB0bXAoInRtcCIpOworICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICIgPDwgdCA8PCAiOyIgPDwgZW5kbDsKKyAgICBwcmludF9jb25zdF92YWx1ZShvdXQsIHQsIHR5cGUsIHZhbHVlKTsKKyAgICByZW5kZXIgPDwgdDsKKyAgfQorCisgIHJldHVybiByZW5kZXIuc3RyKCk7Cit9CisKK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mb3J3YXJkX2RlY2xhcmF0aW9uKHRfc3RydWN0KiB0c3RydWN0KSB7CisgIC8vIEZvcndhcmQgZGVjbGFyZSBzdHJ1Y3QgZGVmCisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLiBUaGlzIGlzIGEgY2xhc3MKKyAqIHdpdGggZGF0YSBtZW1iZXJzIGFuZCBhIHJlYWQvd3JpdGUoKSBmdW5jdGlvbiwgcGx1cyBhIG1pcnJvcmluZyBpc3NldAorICogaW5uZXIgY2xhc3MuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jcHBfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9zdHJ1Y3RfZGVjbGFyYXRpb24oZl90eXBlc18sIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbiwgZmFsc2UsIHRydWUsIHRydWUsIHRydWUsIHRydWUpOworICBnZW5lcmF0ZV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3R5cGVzX2ltcGxfLCBmX3R5cGVzX2ltcGxfLCB0c3RydWN0LCB0cnVlLCB0cnVlKTsKKworICBzdGQ6Om9zdHJlYW0mIG91dCA9IChnZW5fdGVtcGxhdGVzXyA/IGZfdHlwZXNfdGNjXyA6IGZfdHlwZXNfaW1wbF8pOworICBnZW5lcmF0ZV9zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfc3RydWN0X3N3YXAoZl90eXBlc19pbXBsXywgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2NvcHlfY29uc3RydWN0b3IoZl90eXBlc19pbXBsXywgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKKyAgaWYgKGdlbl9tb3ZlYWJsZV8pIHsKKyAgICBnZW5lcmF0ZV9tb3ZlX2NvbnN0cnVjdG9yKGZfdHlwZXNfaW1wbF8sIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7CisgIH0KKyAgZ2VuZXJhdGVfYXNzaWdubWVudF9vcGVyYXRvcihmX3R5cGVzX2ltcGxfLCB0c3RydWN0KTsKKyAgaWYgKGdlbl9tb3ZlYWJsZV8pIHsKKyAgICBnZW5lcmF0ZV9tb3ZlX2Fzc2lnbm1lbnRfb3BlcmF0b3IoZl90eXBlc19pbXBsXywgdHN0cnVjdCk7CisgIH0KKworICBpZiAoIWhhc19jdXN0b21fb3N0cmVhbSh0c3RydWN0KSkgeworICAgIGdlbmVyYXRlX3N0cnVjdF9wcmludF9tZXRob2QoZl90eXBlc19pbXBsXywgdHN0cnVjdCk7CisgIH0KKworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgZ2VuZXJhdGVfZXhjZXB0aW9uX3doYXRfbWV0aG9kKGZfdHlwZXNfaW1wbF8sIHRzdHJ1Y3QpOworICB9Cit9CisKK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb3B5X2NvbnN0cnVjdG9yKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfY29uc3RydWN0b3JfaGVscGVyKG91dCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uLCAvKmlzX21vdmU9Ki9mYWxzZSk7Cit9CisKK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9tb3ZlX2NvbnN0cnVjdG9yKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfY29uc3RydWN0b3JfaGVscGVyKG91dCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uLCAvKmlzX21vdmU9Ki90cnVlKTsKK30KKworbmFtZXNwYWNlIHsKKy8vIEhlbHBlciB0byBjb252ZXJ0IGEgdmFyaWFibGUgdG8gcnZhbHVlLCBpZiBtb3ZlIGlzIGVuYWJsZWQKK3N0ZDo6c3RyaW5nIG1heWJlTW92ZShzdGQ6OnN0cmluZyBjb25zdCYgb3RoZXIsIGJvb2wgbW92ZSkgeworICBpZiAobW92ZSkgeworICAgIHJldHVybiAic3RkOjptb3ZlKCIgKyBvdGhlciArICIpIjsKKyAgfQorICByZXR1cm4gb3RoZXI7Cit9Cit9CisKK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHJ1Y3Rvcl9oZWxwZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfbW92ZSkgeworCisgIHN0ZDo6c3RyaW5nIHRtcF9uYW1lID0gdG1wKCJvdGhlciIpOworCisgIGluZGVudChvdXQpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIjo6IiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpOworCisgIGlmIChpc19tb3ZlKSB7CisgICAgb3V0IDw8ICIoICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJiYgIjsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgIihjb25zdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiYgIjsKKyAgfQorICBvdXQgPDwgdG1wX25hbWUgPDwgIikgIjsKKyAgaWYgKGlzX2V4Y2VwdGlvbikKKyAgICBvdXQgPDwgIjogVEV4Y2VwdGlvbigpICI7CisgIG91dCA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisKKyAgLy8gZWxpbWluYXRlIGNvbXBpbGVyIHVudXNlZCB3YXJuaW5nCisgIGlmIChtZW1iZXJzLmVtcHR5KCkpCisgICAgaW5kZW50KG91dCkgPDwgIih2b2lkKSAiIDw8IHRtcF9uYW1lIDw8ICI7IiA8PCBlbmRsOworCisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBoYXNfbm9ucmVxdWlyZWRfZmllbGRzID0gZmFsc2U7CisgIGZvciAoZl9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBmX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkKKyAgICAgIGhhc19ub25yZXF1aXJlZF9maWVsZHMgPSB0cnVlOworICAgIGluZGVudChvdXQpIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIgorICAgICAgICAgICAgICAgIDw8IG1heWJlTW92ZSh0bXBfbmFtZSArICIuIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwgaXNfbW92ZSkgPDwgIjsiIDw8IGVuZGw7CisgIH0KKworICBpZiAoaGFzX25vbnJlcXVpcmVkX2ZpZWxkcykgeworICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0ID0gIiA8PCBtYXliZU1vdmUodG1wX25hbWUgKyAiLl9faXNzZXQiLCBpc19tb3ZlKSA8PCAiOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXNzaWdubWVudF9vcGVyYXRvcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGdlbmVyYXRlX2Fzc2lnbm1lbnRfaGVscGVyKG91dCwgdHN0cnVjdCwgLyppc19tb3ZlPSovZmFsc2UpOworfQorCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbW92ZV9hc3NpZ25tZW50X29wZXJhdG9yKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgZ2VuZXJhdGVfYXNzaWdubWVudF9oZWxwZXIob3V0LCB0c3RydWN0LCAvKmlzX21vdmU9Ki90cnVlKTsKK30KKwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Fzc2lnbm1lbnRfaGVscGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfbW92ZSkgeworICBzdGQ6OnN0cmluZyB0bXBfbmFtZSA9IHRtcCgib3RoZXIiKTsKKworICBpbmRlbnQob3V0KSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICImICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiOjpvcGVyYXRvcj0oIjsKKworICBpZiAoaXNfbW92ZSkgeworICAgIG91dCA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICImJiAiOworICB9IGVsc2UgeworICAgIG91dCA8PCAiY29uc3QgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICImICI7CisgIH0KKyAgb3V0IDw8IHRtcF9uYW1lIDw8ICIpIHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisKKyAgLy8gZWxpbWluYXRlIGNvbXBpbGVyIHVudXNlZCB3YXJuaW5nCisgIGlmIChtZW1iZXJzLmVtcHR5KCkpCisgICAgaW5kZW50KG91dCkgPDwgIih2b2lkKSAiIDw8IHRtcF9uYW1lIDw8ICI7IiA8PCBlbmRsOworCisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBoYXNfbm9ucmVxdWlyZWRfZmllbGRzID0gZmFsc2U7CisgIGZvciAoZl9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBmX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkKKyAgICAgIGhhc19ub25yZXF1aXJlZF9maWVsZHMgPSB0cnVlOworICAgIGluZGVudChvdXQpIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIgorICAgICAgICAgICAgICAgIDw8IG1heWJlTW92ZSh0bXBfbmFtZSArICIuIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwgaXNfbW92ZSkgPDwgIjsiIDw8IGVuZGw7CisgIH0KKyAgaWYgKGhhc19ub25yZXF1aXJlZF9maWVsZHMpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldCA9ICIgPDwgbWF5YmVNb3ZlKHRtcF9uYW1lICsgIi5fX2lzc2V0IiwgaXNfbW92ZSkgPDwgIjsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICp0aGlzOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKKy8qKgorICogV3JpdGVzIHRoZSBzdHJ1Y3QgZGVjbGFyYXRpb24gaW50byB0aGUgaGVhZGVyIGZpbGUKKyAqCisgKiBAcGFyYW0gb3V0IE91dHB1dCBzdHJlYW0KKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QKKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF9kZWNsYXJhdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHdyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN3YXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfdXNlcl9zdHJ1Y3QpIHsKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIGV4dGVuZHMgPSAiIDogcHVibGljIDo6YXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24iOworICB9IGVsc2UgeworICAgIGlmIChpc191c2VyX3N0cnVjdCAmJiAhZ2VuX3RlbXBsYXRlc18pIHsKKyAgICAgIGV4dGVuZHMgPSAiIDogcHVibGljIHZpcnR1YWwgOjphcGFjaGU6OnRocmlmdDo6VEJhc2UiOworICAgIH0KKyAgfQorCisgIC8vIEdldCBtZW1iZXJzCisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisKKyAgLy8gV3JpdGUgdGhlIGlzc2V0IHN0cnVjdHVyZSBkZWNsYXJhdGlvbiBvdXRzaWRlIHRoZSBjbGFzcy4gVGhpcyBtYWtlcworICAvLyB0aGUgZ2VuZXJhdGVkIGNvZGUgYW1lbmFibGUgdG8gcHJvY2Vzc2luZyBieSBTV0lHLgorICAvLyBXZSBvbmx5IGRlY2xhcmUgdGhlIHN0cnVjdCBpZiBpdCBnZXRzIHVzZWQgaW4gdGhlIGNsYXNzLgorCisgIC8vIElzc2V0IHN0cnVjdCBoYXMgYm9vbGVhbiBmaWVsZHMsIGJ1dCBvbmx5IGZvciBub24tcmVxdWlyZWQgZmllbGRzLgorICBib29sIGhhc19ub25yZXF1aXJlZF9maWVsZHMgPSBmYWxzZTsKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKQorICAgICAgaGFzX25vbnJlcXVpcmVkX2ZpZWxkcyA9IHRydWU7CisgIH0KKworICBpZiAoaGFzX25vbnJlcXVpcmVkX2ZpZWxkcyAmJiAoIXBvaW50ZXJzIHx8IHJlYWQpKSB7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInR5cGVkZWYgc3RydWN0IF8iIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIl9faXNzZXQgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGluZGVudChvdXQpIDw8ICJfIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJfX2lzc2V0KCkgIjsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIHN0cmluZyBpc1NldCA9ICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwpID8gInRydWUiIDogImZhbHNlIjsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICBvdXQgPDwgIjogIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIigiIDw8IGlzU2V0IDw8ICIpIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCAiLCAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgaXNTZXQgPDwgIikiOworICAgICAgfQorICAgIH0KKyAgICBvdXQgPDwgIiB7fSIgPDwgZW5kbDsKKworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJib29sICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgOjE7IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0gXyIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiX19pc3NldDsiIDw8IGVuZGw7CisgIH0KKworICBvdXQgPDwgZW5kbDsKKworICAvLyBPcGVuIHN0cnVjdCBkZWYKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgZXh0ZW5kcyA8PCAiIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICIgcHVibGljOiIgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAoIXBvaW50ZXJzKSB7CisgICAgLy8gQ29weSBjb25zdHJ1Y3RvcgorICAgIGluZGVudChvdXQpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIihjb25zdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiYpOyIgPDwgZW5kbDsKKworICAgIC8vIE1vdmUgY29uc3RydWN0b3IKKyAgICBpZiAoZ2VuX21vdmVhYmxlXykgeworICAgICAgaW5kZW50KG91dCkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJiYpOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBBc3NpZ25tZW50IE9wZXJhdG9yCisgICAgaW5kZW50KG91dCkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJiBvcGVyYXRvcj0oY29uc3QgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICImKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKworICAgIC8vIE1vdmUgYXNzaWdubWVudCBvcGVyYXRvcgorICAgIGlmIChnZW5fbW92ZWFibGVfKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICImIG9wZXJhdG9yPSgiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiYmKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gRGVmYXVsdCBjb25zdHJ1Y3RvcgorICAgIGluZGVudChvdXQpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigpIjsKKworICAgIGJvb2wgaW5pdF9jdG9yID0gZmFsc2U7CisKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICBpZiAodC0+aXNfYmFzZV90eXBlKCkgfHwgdC0+aXNfZW51bSgpIHx8IGlzX3JlZmVyZW5jZSgqbV9pdGVyKSkgeworICAgICAgICBzdHJpbmcgZHZhbDsKKyAgICAgICAgaWYgKHQtPmlzX2VudW0oKSkgeworICAgICAgICAgIGR2YWwgKz0gIigiICsgdHlwZV9uYW1lKHQpICsgIikiOworICAgICAgICB9CisgICAgICAgIGR2YWwgKz0gKHQtPmlzX3N0cmluZygpIHx8IGlzX3JlZmVyZW5jZSgqbV9pdGVyKSkgPyAiIiA6ICIwIjsKKyAgICAgICAgdF9jb25zdF92YWx1ZSogY3YgPSAoKm1faXRlciktPmdldF92YWx1ZSgpOworICAgICAgICBpZiAoY3YgIT0gTlVMTCkgeworICAgICAgICAgIGR2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCAoKm1faXRlciktPmdldF9uYW1lKCksIHQsIGN2KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWluaXRfY3RvcikgeworICAgICAgICAgIGluaXRfY3RvciA9IHRydWU7CisgICAgICAgICAgb3V0IDw8ICIgOiAiOworICAgICAgICAgIG91dCA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIigiIDw8IGR2YWwgPDwgIikiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAiLCAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgZHZhbCA8PCAiKSI7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgb3V0IDw8ICIgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICAvLyBUT0RPKGRyZWlzcyk6IFdoZW4gZXZlcnl0aGluZyBlbHNlIGluIFRocmlmdCBpcyBwZXJmZWN0LAorICAgIC8vIGRvIG1vcmUgb2YgdGhlc2UgaW4gdGhlIGluaXRpYWxpemVyIGxpc3QuCisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworCisgICAgICBpZiAoIXQtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICAgIHRfY29uc3RfdmFsdWUqIGN2ID0gKCptX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICAgICAgaWYgKGN2ICE9IE5VTEwpIHsKKyAgICAgICAgICBwcmludF9jb25zdF92YWx1ZShvdXQsICgqbV9pdGVyKS0+Z2V0X25hbWUoKSwgdCwgY3YpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgfQorCisgIGlmICh0c3RydWN0LT5hbm5vdGF0aW9uc18uZmluZCgiZmluYWwiKSA9PSB0c3RydWN0LT5hbm5vdGF0aW9uc18uZW5kKCkpIHsKKyAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidmlydHVhbCB+IiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoKSBub2V4Y2VwdDsiIDw8IGVuZGw7CisgIH0KKworICAvLyBEZWNsYXJlIGFsbCBmaWVsZHMKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoKm1faXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBvaW50ZXJzICYmICEoKm1faXRlciktPmdldF90eXBlKCktPmlzX3hjZXB0aW9uKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXJlYWQpIDw8IGVuZGw7CisgIH0KKworICAvLyBBZGQgdGhlIF9faXNzZXQgZGF0YSBtZW1iZXIgaWYgd2UgbmVlZCBpdCwgdXNpbmcgdGhlIGRlZmluaXRpb24gZnJvbSBhYm92ZQorICBpZiAoaGFzX25vbnJlcXVpcmVkX2ZpZWxkcyAmJiAoIXBvaW50ZXJzIHx8IHJlYWQpKSB7CisgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIl8iIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIl9faXNzZXQgX19pc3NldDsiIDw8IGVuZGw7CisgIH0KKworICAvLyBDcmVhdGUgYSBzZXR0ZXIgZnVuY3Rpb24gZm9yIGVhY2ggZmllbGQKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGlmIChwb2ludGVycykgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmIChpc19yZWZlcmVuY2UoKCptX2l0ZXIpKSkgeworICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInZvaWQgX19zZXRfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIig6OnN0ZDo6c2hhcmVkX3B0cjwiCisgICAgICAgICAgPDwgdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSA8PCAiPiI7CisgICAgICBvdXQgPDwgIiB2YWwpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInZvaWQgX19zZXRfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIigiCisgICAgICAgICAgPDwgdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIHRydWUpOworICAgICAgb3V0IDw8ICIgdmFsKTsiIDw8IGVuZGw7CisgICAgfQorICB9CisgIG91dCA8PCBlbmRsOworCisgIGlmICghcG9pbnRlcnMpIHsKKyAgICAvLyBTaG91bGQgd2UgZ2VuZXJhdGUgZGVmYXVsdCBvcGVyYXRvcnM/CisgICAgaWYgKCFnZW5fbm9fZGVmYXVsdF9vcGVyYXRvcnNfKSB7CisgICAgICAvLyBHZW5lcmF0ZSBhbiBlcXVhbGl0eSB0ZXN0aW5nIG9wZXJhdG9yLiAgTWFrZSBpdCBpbmxpbmUgc2luY2UgdGhlIGNvbXBpbGVyCisgICAgICAvLyB3aWxsIGRvIGEgYmV0dGVyIGpvYiB0aGFuIHdlIHdvdWxkIHdoZW4gZGVjaWRpbmcgd2hldGhlciB0byBpbmxpbmUgaXQuCisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiICYgIgorICAgICAgICAgIDw8IChtZW1iZXJzLnNpemUoKSA+IDAgPyAicmhzIiA6ICIvKiByaHMgKi8iKSA8PCAiKSBjb25zdCIgPDwgZW5kbDsKKyAgICAgIHNjb3BlX3VwKG91dCk7CisgICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICAgIC8vIE1vc3QgZXhpc3RpbmcgVGhyaWZ0IGNvZGUgZG9lcyBub3QgdXNlIGlzc2V0IG9yIG9wdGlvbmFsL3JlcXVpcmVkLAorICAgICAgICAvLyBzbyB3ZSB0cmVhdCAiZGVmYXVsdCIgZmllbGRzIGFzIHJlcXVpcmVkLgorICAgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9PUFRJT05BTCkgeworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCEoIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9PSByaHMuIgorICAgICAgICAgICAgICA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIikpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBmYWxzZTsiIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoX19pc3NldC4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9IHJocy5fX2lzc2V0LiIKKyAgICAgICAgICAgICAgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBmYWxzZTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImVsc2UgaWYgKF9faXNzZXQuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiAmJiAhKCIKKyAgICAgICAgICAgICAgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPT0gcmhzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpKSIgPDwgZW5kbAorICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gZmFsc2U7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOworICAgICAgc2NvcGVfZG93bihvdXQpOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJib29sIG9wZXJhdG9yICE9IChjb25zdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiAmcmhzKSBjb25zdCB7IgorICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICEoKnRoaXMgPT0gcmhzKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgICA8PCBlbmRsOworCisgICAgICAvLyBHZW5lcmF0ZSB0aGUgZGVjbGFyYXRpb24gb2YgYSBsZXNzLXRoYW4gb3BlcmF0b3IuICBUaGlzIG11c3QgYmUKKyAgICAgIC8vIGltcGxlbWVudGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiBkZXZlbG9wZXIgaWYgdGhleSB3aXNoIHRvIHVzZSBpdC4gIChUaGV5CisgICAgICAvLyB3aWxsIGdldCBhIGxpbmsgZXJyb3IgaWYgdGhleSB0cnkgdG8gdXNlIGl0IHdpdGhvdXQgYW4gaW1wbGVtZW50YXRpb24uKQorICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJib29sIG9wZXJhdG9yIDwgKGNvbnN0ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiICYgKSBjb25zdDsiIDw8IGVuZGwKKyAgICAgICAgICA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGlmIChyZWFkKSB7CisgICAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgInVpbnQzMl90IHJlYWQoUHJvdG9jb2xfKiBpcHJvdCk7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInVpbnQzMl90IHJlYWQoIgorICAgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBpcHJvdCk7IiA8PCBlbmRsOworICAgIH0KKyAgfQorICBpZiAod3JpdGUpIHsKKyAgICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAidWludDMyX3Qgd3JpdGUoUHJvdG9jb2xfKiBvcHJvdCkgY29uc3Q7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInVpbnQzMl90IHdyaXRlKCIKKyAgICAgICAgICA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogb3Byb3QpIGNvbnN0OyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgb3V0IDw8IGVuZGw7CisKKyAgaWYgKGlzX3VzZXJfc3RydWN0ICYmICFoYXNfY3VzdG9tX29zdHJlYW0odHN0cnVjdCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInZpcnR1YWwgIjsKKyAgICBnZW5lcmF0ZV9zdHJ1Y3RfcHJpbnRfbWV0aG9kX2RlY2wob3V0LCBOVUxMKTsKKyAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgIH0KKworICAvLyBzdGQ6OmV4Y2VwdGlvbjo6d2hhdCgpCisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIm11dGFibGUgc3RkOjpzdHJpbmcgdGhyaWZ0VEV4Y2VwdGlvbk1lc3NhZ2VIb2xkZXJfOyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCk7CisgICAgZ2VuZXJhdGVfZXhjZXB0aW9uX3doYXRfbWV0aG9kX2RlY2wob3V0LCB0c3RydWN0LCBmYWxzZSk7CisgICAgb3V0IDw8ICI7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn07IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaWYgKHN3YXApIHsKKyAgICAvLyBHZW5lcmF0ZSBhIG5hbWVzcGFjZS1zY29wZSBzd2FwKCkgZnVuY3Rpb24KKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInZvaWQgc3dhcCgiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiAmYSwgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCisgICAgICAgIDw8ICIgJmIpOyIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgaWYgKGlzX3VzZXJfc3RydWN0KSB7CisgICAgZ2VuZXJhdGVfc3RydWN0X29zdHJlYW1fb3BlcmF0b3JfZGVjbChvdXQsIHRzdHJ1Y3QpOworICB9Cit9CisKK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3RfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3N0cmVhbSYgZm9yY2VfY3BwX291dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNldHRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc191c2VyX3N0cnVjdCkgeworICAvLyBHZXQgbWVtYmVycworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworCisgIC8vIERlc3RydWN0b3IKKyAgaWYgKHRzdHJ1Y3QtPmFubm90YXRpb25zXy5maW5kKCJmaW5hbCIpID09IHRzdHJ1Y3QtPmFubm90YXRpb25zXy5lbmQoKSkgeworICAgIGZvcmNlX2NwcF9vdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI6On4iIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgIDw8ICIoKSBub2V4Y2VwdCB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmb3JjZV9jcHBfb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICAvLyBDcmVhdGUgYSBzZXR0ZXIgZnVuY3Rpb24gZm9yIGVhY2ggZmllbGQKKyAgaWYgKHNldHRlcnMpIHsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBpZiAoaXNfcmVmZXJlbmNlKCgqbV9pdGVyKSkpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgdHlwZSA9IHR5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidm9pZCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIjo6X19zZXRfIgorICAgICAgICAgICAgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoOjpzdGQ6OnNoYXJlZF9wdHI8IgorICAgICAgICAgICAgPDwgdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSA8PCAiPiI7CisgICAgICAgIG91dCA8PCAiIHZhbCkgeyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ2b2lkICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiOjpfX3NldF8iCisgICAgICAgICAgICA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIigiIDw8IHR5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCksIGZhbHNlLCB0cnVlKTsKKyAgICAgICAgb3V0IDw8ICIgdmFsKSB7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50X3VwKCk7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRoaXMtPiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSB2YWw7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKworICAgICAgLy8gYXNzdW1lIGFsbCBmaWVsZHMgYXJlIHJlcXVpcmVkIGV4Y2VwdCBvcHRpb25hbCBmaWVsZHMuCisgICAgICAvLyBmb3Igb3B0aW9uYWwgZmllbGRzIGNoYW5nZSBfX2lzc2V0Lm5hbWUgdG8gdHJ1ZQorICAgICAgYm9vbCBpc19vcHRpb25hbCA9ICgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7CisgICAgICBpZiAoaXNfb3B0aW9uYWwpIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGluZGVudCgpIDw8ICJfX2lzc2V0LiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSB0cnVlOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgaWYgKGlzX3VzZXJfc3RydWN0KSB7CisgICAgZ2VuZXJhdGVfc3RydWN0X29zdHJlYW1fb3BlcmF0b3Iob3V0LCB0c3RydWN0KTsKKyAgfQorICBvdXQgPDwgZW5kbDsKK30KKworLyoqCisgKiBNYWtlcyBhIGhlbHBlciBmdW5jdGlvbiB0byBnZW4gYSBzdHJ1Y3QgcmVhZGVyLgorICoKKyAqIEBwYXJhbSBvdXQgU3RyZWFtIHRvIHdyaXRlIHRvCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0CisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3RfcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgcG9pbnRlcnMpIHsKKyAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidWludDMyX3QgIgorICAgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI6OnJlYWQoUHJvdG9jb2xfKiBpcHJvdCkgeyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAidWludDMyX3QgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgPDwgIjo6cmVhZCg6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBpcHJvdCkgeyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gRGVjbGFyZSBzdGFjayB0bXAgdmFyaWFibGVzCisgIG91dCA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRJbnB1dFJlY3Vyc2lvblRyYWNrZXIgdHJhY2tlcigqaXByb3QpOyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgInVpbnQzMl90IHhmZXIgPSAwOyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgInN0ZDo6c3RyaW5nIGZuYW1lOyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUVHlwZSBmdHlwZTsiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJpbnQxNl90IGZpZDsiIDw8IGVuZGwKKyAgICAgIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IGlwcm90LT5yZWFkU3RydWN0QmVnaW4oZm5hbWUpOyIgPDwgZW5kbAorICAgICAgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgInVzaW5nIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xFeGNlcHRpb247IiA8PCBlbmRsCisgICAgICA8PCBlbmRsOworCisgIC8vIFJlcXVpcmVkIHZhcmlhYmxlcyBhcmVuJ3QgaW4gX19pc3NldCwgc28gd2UgbmVlZCB0bXAgdmFycyB0byBjaGVjayB0aGVtLgorICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKQorICAgICAgaW5kZW50KG91dCkgPDwgImJvb2wgaXNzZXRfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IGZhbHNlOyIgPDwgZW5kbDsKKyAgfQorICBvdXQgPDwgZW5kbDsKKworICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKKyAgaW5kZW50KG91dCkgPDwgIndoaWxlICh0cnVlKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICAvLyBSZWFkIGJlZ2lubmluZyBmaWVsZCBtYXJrZXIKKyAgaW5kZW50KG91dCkgPDwgInhmZXIgKz0gaXByb3QtPnJlYWRGaWVsZEJlZ2luKGZuYW1lLCBmdHlwZSwgZmlkKTsiIDw8IGVuZGw7CisKKyAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKGZ0eXBlID09IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUT1ApIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICIgIGJyZWFrOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICBpZiAoZmllbGRzLmVtcHR5KCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gaXByb3QtPnNraXAoZnR5cGUpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICAvLyBTd2l0Y2ggc3RhdGVtZW50IG9uIHRoZSBmaWVsZCB3ZSBhcmUgcmVhZGluZworICAgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZCkiIDw8IGVuZGw7CisKKyAgICBzY29wZV91cChvdXQpOworCisgICAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjoiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoZnR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgIGNvbnN0IGNoYXIqIGlzc2V0X3ByZWZpeCA9ICgoKmZfaXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSA/ICJ0aGlzLT5fX2lzc2V0LiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJpc3NldF8iOworCisjaWYgMAorICAgICAgICAgIC8vIFRoaXMgY29kZSB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZSBzYW1lIGZpZWxkIGlzIGVuY291bnRlcmVkIHR3aWNlLgorICAgICAgICAgIC8vIFdlJ3ZlIGRlY2lkZWQgdG8gbGVhdmUgaXQgb3V0IGZvciBwZXJmb3JtYW5jZSByZWFzb25zLgorICAgICAgICAgIC8vIFRPRE8oZHJlaXNzKTogR2VuZXJhdGUgdGhpcyBjb2RlIGFuZCAiaWYiIGl0IG91dCB0byBtYWtlIGl0IGVhc2llcgorICAgICAgICAgIC8vIGZvciBwZW9wbGUgcmVjb21waWxpbmcgdGhyaWZ0IHRvIGluY2x1ZGUgaXQuCisgICAgICAgICAgb3V0IDw8CisgICAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgaXNzZXRfcHJlZml4IDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSIgPDwgZW5kbCA8PAorICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsiIDw8IGVuZGw7CisjZW5kaWYKKworICAgICAgaWYgKHBvaW50ZXJzICYmICEoKmZfaXRlciktPmdldF90eXBlKCktPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAiKCoodGhpcy0+IiwgIikpIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLT4iKTsKKyAgICAgIH0KKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBpc3NldF9wcmVmaXggPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSB0cnVlOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHhmZXIgKz0gaXByb3QtPnNraXAoZnR5cGUpOyIgPDwgZW5kbAorICAgICAgICAgIDw8CisgICAgICAgICAgLy8gVE9ETyhkcmVpc3MpOiBNYWtlIHRoaXMgYW4gb3B0aW9uIHdoZW4gdGhyaWZ0IHN0cnVjdHMKKyAgICAgICAgICAvLyBoYXZlIGEgY29tbW9uIGJhc2UgY2xhc3MuCisgICAgICAgICAgLy8gaW5kZW50KCkgPDwgIiAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsiIDw8IGVuZGwgPDwKKyAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisKKyAgICAvLyBJbiB0aGUgZGVmYXVsdCBjYXNlIHdlIHNraXAgdGhlIGZpZWxkCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICB4ZmVyICs9IGlwcm90LT5za2lwKGZ0eXBlKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgYnJlYWs7IiA8PCBlbmRsOworCisgICAgc2NvcGVfZG93bihvdXQpOworICB9IC8vIWZpZWxkcy5lbXB0eSgpCisgIC8vIFJlYWQgZmllbGQgZW5kIG1hcmtlcgorICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBpcHJvdC0+cmVhZEZpZWxkRW5kKCk7IiA8PCBlbmRsOworCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSBpcHJvdC0+cmVhZFN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKKworICAvLyBUaHJvdyBpZiBhbnkgcmVxdWlyZWQgZmllbGRzIGFyZSBtaXNzaW5nLgorICAvLyBXZSBkbyB0aGlzIGFmdGVyIHJlYWRpbmcgdGhlIHN0cnVjdCBlbmQgc28gdGhhdAorICAvLyB0aGVyZSBtaWdodCBwb3NzaWJseSBiZSBhIGNoYW5jZSBvZiBjb250aW51aW5nLgorICBvdXQgPDwgZW5kbDsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCFpc3NldF8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAnKScgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICIgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiB4ZmVyOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgd3JpdGUgZnVuY3Rpb24uCisgKgorICogQHBhcmFtIG91dCBTdHJlYW0gdG8gd3JpdGUgdG8KKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QKKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBwb2ludGVycykgeworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidWludDMyX3QgIgorICAgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI6OndyaXRlKFByb3RvY29sXyogb3Byb3QpIGNvbnN0IHsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgInVpbnQzMl90ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgIDw8ICI6OndyaXRlKDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIG9wcm90KSBjb25zdCB7IiA8PCBlbmRsOworICB9CisgIGluZGVudF91cCgpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAidWludDMyX3QgeGZlciA9IDA7IiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VE91dHB1dFJlY3Vyc2lvblRyYWNrZXIgdHJhY2tlcigqb3Byb3QpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInhmZXIgKz0gb3Byb3QtPndyaXRlU3RydWN0QmVnaW4oXCIiIDw8IG5hbWUgPDwgIlwiKTsiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBib29sIGNoZWNrX2lmX3NldCA9ICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKS0+aXNfeGNlcHRpb24oKTsKKyAgICBpZiAoY2hlY2tfaWZfc2V0KSB7CisgICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoaXMtPl9faXNzZXQuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBXcml0ZSBmaWVsZCBoZWFkZXIKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gb3Byb3QtPndyaXRlRmllbGRCZWdpbigiCisgICAgICAgIDw8ICJcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiwgIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiCisgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cworICAgIGlmIChwb2ludGVycyAmJiAhKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLT5pc194Y2VwdGlvbigpKSB7CisgICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAiKCoodGhpcy0+IiwgIikpIik7CisgICAgfSBlbHNlIHsKKyAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLT4iKTsKKyAgICB9CisgICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCisgICAgaW5kZW50KG91dCkgPDwgInhmZXIgKz0gb3Byb3QtPndyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7CisgICAgaWYgKGNoZWNrX2lmX3NldCkgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICd9JzsKKyAgICB9CisgIH0KKworICBvdXQgPDwgZW5kbDsKKworICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAorICBvdXQgPDwgaW5kZW50KCkgPDwgInhmZXIgKz0gb3Byb3QtPndyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAieGZlciArPSBvcHJvdC0+d3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJyZXR1cm4geGZlcjsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBTdHJ1Y3Qgd3JpdGVyIGZvciByZXN1bHQgb2YgYSBmdW5jdGlvbiwgd2hpY2ggY2FuIGhhdmUgb25seSBvbmUgb2YgaXRzCisgKiBmaWVsZHMgc2V0IGFuZCBkb2VzIGEgY29uZGl0aW9uYWwgaWYgZWxzZSBsb29rIHVwIGludG8gdGhlIF9faXNzZXQgZmllbGQKKyAqIG9mIHRoZSBzdHJ1Y3QuCisgKgorICogQHBhcmFtIG91dCBPdXRwdXQgc3RyZWFtCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgcmVzdWx0IHN0cnVjdAorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X3Jlc3VsdF93cml0ZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlcnMpIHsKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGlmIChnZW5fdGVtcGxhdGVzXykgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInVpbnQzMl90ICIKKyAgICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiOjp3cml0ZShQcm90b2NvbF8qIG9wcm90KSBjb25zdCB7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJ1aW50MzJfdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICA8PCAiOjp3cml0ZSg6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBvcHJvdCkgY29uc3QgeyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfdXAoKTsKKworICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidWludDMyX3QgeGZlciA9IDA7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgInhmZXIgKz0gb3Byb3QtPndyaXRlU3RydWN0QmVnaW4oXCIiIDw8IG5hbWUgPDwgIlwiKTsiIDw8IGVuZGw7CisKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmICI7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiIGVsc2UgaWYgIjsKKyAgICB9CisKKyAgICBvdXQgPDwgIih0aGlzLT5fX2lzc2V0LiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIC8vIFdyaXRlIGZpZWxkIGhlYWRlcgorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSBvcHJvdC0+d3JpdGVGaWVsZEJlZ2luKCIKKyAgICAgICAgPDwgIlwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiLCAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIik7IiA8PCBlbmRsOworICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCisgICAgaWYgKHBvaW50ZXJzKSB7CisgICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAiKCoodGhpcy0+IiwgIikpIik7CisgICAgfSBlbHNlIHsKKyAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLT4iKTsKKyAgICB9CisgICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCisgICAgaW5kZW50KG91dCkgPDwgInhmZXIgKz0gb3Byb3QtPndyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IjsKKyAgfQorCisgIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCisgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgInhmZXIgKz0gb3Byb3QtPndyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXR1cm4geGZlcjsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIHN3YXAgZnVuY3Rpb24uCisgKgorICogQHBhcmFtIG91dCBTdHJlYW0gdG8gd3JpdGUgdG8KKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QKKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF9zd2FwKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ2b2lkIHN3YXAoIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgJmEsICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQorICAgICAgPDwgIiAmYikgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gTGV0IGFyZ3VtZW50LWRlcGVuZGVudCBuYW1lIGxvb2t1cCBmaW5kIHRoZSBjb3JyZWN0IHN3YXAoKSBmdW5jdGlvbiB0bworICAvLyB1c2UgYmFzZWQgb24gdGhlIGFyZ3VtZW50IHR5cGVzLiAgSWYgbm9uZSBpcyBmb3VuZCBpbiB0aGUgYXJndW1lbnRzJworICAvLyBuYW1lc3BhY2VzLCBmYWxsIGJhY2sgdG8gOjpzdGQ6OnN3YXAoKS4KKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ1c2luZyA6OnN0ZDo6c3dhcDsiIDw8IGVuZGw7CisKKyAgYm9vbCBoYXNfbm9ucmVxdWlyZWRfZmllbGRzID0gZmFsc2U7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIGZvciAodmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9maWVsZCogdGZpZWxkID0gKmZfaXRlcjsKKworICAgIGlmICh0ZmllbGQtPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBoYXNfbm9ucmVxdWlyZWRfZmllbGRzID0gdHJ1ZTsKKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInN3YXAoYS4iIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiLCBiLiIgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIpOyIKKyAgICAgICAgPDwgZW5kbDsKKyAgfQorCisgIGlmIChoYXNfbm9ucmVxdWlyZWRfZmllbGRzKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJzd2FwKGEuX19pc3NldCwgYi5fX2lzc2V0KTsiIDw8IGVuZGw7CisgIH0KKworICAvLyBoYW5kbGUgZW1wdHkgc3RydWN0cworICBpZiAoZmllbGRzLnNpemUoKSA9PSAwKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIodm9pZCkgYTsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIodm9pZCkgYjsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X29zdHJlYW1fb3BlcmF0b3JfZGVjbChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8ICJzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvdXQsIGNvbnN0ICIKKyAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKKyAgICAgIDw8ICImIG9iaik7IiA8PCBlbmRsOworICBvdXQgPDwgZW5kbDsKK30KKwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF9vc3RyZWFtX29wZXJhdG9yKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpZiAoIWhhc19jdXN0b21fb3N0cmVhbSh0c3RydWN0KSkgeworICAgIC8vIHRocmlmdCBkZWZpbmVzIHRoaXMgYmVoYXZpb3IKKyAgICBvdXQgPDwgInN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG91dCwgY29uc3QgIgorICAgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCisgICAgICAgIDw8ICImIG9iaikiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIm9iai5wcmludFRvKG91dCk7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gb3V0OyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF9wcmludF9tZXRob2RfZGVjbChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8ICJ2b2lkICI7CisgIGlmICh0c3RydWN0KSB7CisgICAgb3V0IDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIjo6IjsKKyAgfQorICBvdXQgPDwgInByaW50VG8oc3RkOjpvc3RyZWFtJiBvdXQpIGNvbnN0IjsKK30KKwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2V4Y2VwdGlvbl93aGF0X21ldGhvZF9kZWNsKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZXh0ZXJuYWwpIHsKKyAgb3V0IDw8ICJjb25zdCBjaGFyKiAiOworICBpZiAoZXh0ZXJuYWwpIHsKKyAgICBvdXQgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiOjoiOworICB9CisgIG91dCA8PCAid2hhdCgpIGNvbnN0IG5vZXhjZXB0IjsKK30KKworbmFtZXNwYWNlIHN0cnVjdF9vc3RyZWFtX29wZXJhdG9yX2dlbmVyYXRvciB7Cit2b2lkIGdlbmVyYXRlX3JlcXVpcmVkX2ZpZWxkX3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LCBjb25zdCB0X2ZpZWxkKiBmaWVsZCkgeworICBvdXQgPDwgIiA8PCB0b19zdHJpbmcoIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKSI7Cit9CisKK3ZvaWQgZ2VuZXJhdGVfb3B0aW9uYWxfZmllbGRfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsIGNvbnN0IHRfZmllbGQqIGZpZWxkKSB7CisgIG91dCA8PCAiOyAoX19pc3NldC4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPyAob3V0IjsKKyAgZ2VuZXJhdGVfcmVxdWlyZWRfZmllbGRfdmFsdWUob3V0LCBmaWVsZCk7CisgIG91dCA8PCAiKSA6IChvdXQgPDwgXCI8bnVsbD5cIikpIjsKK30KKwordm9pZCBnZW5lcmF0ZV9maWVsZF92YWx1ZShzdGQ6Om9zdHJlYW0mIG91dCwgY29uc3QgdF9maWVsZCogZmllbGQpIHsKKyAgaWYgKGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCkKKyAgICBnZW5lcmF0ZV9vcHRpb25hbF9maWVsZF92YWx1ZShvdXQsIGZpZWxkKTsKKyAgZWxzZQorICAgIGdlbmVyYXRlX3JlcXVpcmVkX2ZpZWxkX3ZhbHVlKG91dCwgZmllbGQpOworfQorCit2b2lkIGdlbmVyYXRlX2ZpZWxkX25hbWUoc3RkOjpvc3RyZWFtJiBvdXQsIGNvbnN0IHRfZmllbGQqIGZpZWxkKSB7CisgIG91dCA8PCAiXCIiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICI9XCIiOworfQorCit2b2lkIGdlbmVyYXRlX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LCBjb25zdCB0X2ZpZWxkKiBmaWVsZCkgeworICBnZW5lcmF0ZV9maWVsZF9uYW1lKG91dCwgZmllbGQpOworICBnZW5lcmF0ZV9maWVsZF92YWx1ZShvdXQsIGZpZWxkKTsKK30KKwordm9pZCBnZW5lcmF0ZV9maWVsZHMoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaW5kZW50KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGJlZyA9IGZpZWxkcy5iZWdpbigpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBlbmQgPSBmaWVsZHMuZW5kKCk7CisKKyAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGJlZzsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgb3V0IDw8IGluZGVudCA8PCAib3V0IDw8ICI7CisKKyAgICBpZiAoaXQgIT0gYmVnKSB7CisgICAgICBvdXQgPDwgIlwiLCBcIiA8PCAiOworICAgIH0KKworICAgIGdlbmVyYXRlX2ZpZWxkKG91dCwgKml0KTsKKyAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgIH0KK30KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgb3BlcmF0b3I8PAorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X3ByaW50X21ldGhvZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8IGluZGVudCgpOworICBnZW5lcmF0ZV9zdHJ1Y3RfcHJpbnRfbWV0aG9kX2RlY2wob3V0LCB0c3RydWN0KTsKKyAgb3V0IDw8ICIgeyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgInVzaW5nIDo6YXBhY2hlOjp0aHJpZnQ6OnRvX3N0cmluZzsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAib3V0IDw8IFwiIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoXCI7IiA8PCBlbmRsOworICBzdHJ1Y3Rfb3N0cmVhbV9vcGVyYXRvcl9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkcyhvdXQsIHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCksIGluZGVudCgpKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJvdXQgPDwgXCIpXCI7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyB3aGF0KCkgbWV0aG9kIGZvciBleGNlcHRpb25zCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9leGNlcHRpb25fd2hhdF9tZXRob2Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIG91dCA8PCBpbmRlbnQoKTsKKyAgZ2VuZXJhdGVfZXhjZXB0aW9uX3doYXRfbWV0aG9kX2RlY2wob3V0LCB0c3RydWN0LCB0cnVlKTsKKyAgb3V0IDw8ICIgeyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ0cnkgeyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJzdGQ6OnN0cmluZ3N0cmVhbSBzczsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAic3MgPDwgXCJURXhjZXB0aW9uIC0gc2VydmljZSBoYXMgdGhyb3duOiBcIiA8PCAqdGhpczsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAidGhpcy0+dGhyaWZ0VEV4Y2VwdGlvbk1lc3NhZ2VIb2xkZXJfID0gc3Muc3RyKCk7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiB0aGlzLT50aHJpZnRURXhjZXB0aW9uTWVzc2FnZUhvbGRlcl8uY19zdHIoKTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IGNhdGNoIChjb25zdCBzdGQ6OmV4Y2VwdGlvbiYpIHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIFwiVEV4Y2VwdGlvbiAtIHNlcnZpY2UgaGFzIHRocm93bjogIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJcIjsiCisgICAgICA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4gSW4gQysrLCB0aGlzIGNvbXByaXNlcyBhbiBlbnRpcmVseSBzZXBhcmF0ZQorICogaGVhZGVyIGFuZCBzb3VyY2UgZmlsZS4gVGhlIGhlYWRlciBmaWxlIGRlZmluZXMgdGhlIG1ldGhvZHMgYW5kIGluY2x1ZGVzCisgKiB0aGUgZGF0YSB0eXBlcyBkZWZpbmVkIGluIHRoZSBtYWluIGhlYWRlciBmaWxlLCBhbmQgdGhlIGltcGxlbWVudGF0aW9uCisgKiBmaWxlIGNvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgYmFzaWMgcHJpbnRlciBhbmQgZGVmYXVsdCBpbnRlcmZhY2VzLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIHN2Y25hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKTsKKworICAvLyBNYWtlIG91dHB1dCBmaWxlcworICBzdHJpbmcgZl9oZWFkZXJfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBzdmNuYW1lICsgIi5oIjsKKyAgZl9oZWFkZXJfLm9wZW4oZl9oZWFkZXJfbmFtZS5jX3N0cigpKTsKKworICAvLyBQcmludCBoZWFkZXIgZmlsZSBpbmNsdWRlcworICBmX2hlYWRlcl8gPDwgYXV0b2dlbl9jb21tZW50KCk7CisgIGZfaGVhZGVyXyA8PCAiI2lmbmRlZiAiIDw8IHN2Y25hbWUgPDwgIl9IIiA8PCBlbmRsIDw8ICIjZGVmaW5lICIgPDwgc3ZjbmFtZSA8PCAiX0giIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGVuZGw7CisgIGlmIChnZW5fY29iX3N0eWxlXykgeworICAgIGZfaGVhZGVyXyA8PCAiI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4iIDw8IGVuZGwgLy8gVE1lbW9yeUJ1ZmZlcgorICAgICAgICAgICAgICA8PCAiI2luY2x1ZGUgPGZ1bmN0aW9uYWw+IiA8PCBlbmRsIAorICAgICAgICAgICAgICA8PCAiI2luY2x1ZGUgPG1lbW9yeT4iIDw8IGVuZGwKKyAgICAgICAgICAgICAgPDwgIm5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGFzeW5jIHsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgPDwgImNsYXNzIFRBc3luY0NoYW5uZWw7IiA8PCBlbmRsIDw8ICJ9fX0iIDw8IGVuZGw7CisgIH0KKyAgZl9oZWFkZXJfIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L1REaXNwYXRjaFByb2Nlc3Nvci5oPiIgPDwgZW5kbDsKKyAgaWYgKGdlbl9jb2Jfc3R5bGVfKSB7CisgICAgZl9oZWFkZXJfIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RBc3luY0Rpc3BhdGNoUHJvY2Vzc29yLmg+IiA8PCBlbmRsOworICB9CisgIGZfaGVhZGVyXyA8PCAiI2luY2x1ZGUgPHRocmlmdC9hc3luYy9UQ29uY3VycmVudENsaWVudFN5bmNJbmZvLmg+IiA8PCBlbmRsOworICBmX2hlYWRlcl8gPDwgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpIDw8IHByb2dyYW1fbmFtZV8gPDwgIl90eXBlcy5oXCIiCisgICAgICAgICAgICA8PCBlbmRsOworCisgIHRfc2VydmljZSogZXh0ZW5kc19zZXJ2aWNlID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgIGlmIChleHRlbmRzX3NlcnZpY2UgIT0gTlVMTCkgeworICAgIGZfaGVhZGVyXyA8PCAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqKGV4dGVuZHNfc2VydmljZS0+Z2V0X3Byb2dyYW0oKSkpCisgICAgICAgICAgICAgIDw8IGV4dGVuZHNfc2VydmljZS0+Z2V0X25hbWUoKSA8PCAiLmhcIiIgPDwgZW5kbDsKKyAgfQorCisgIGZfaGVhZGVyXyA8PCBlbmRsIDw8IG5zX29wZW5fIDw8IGVuZGwgPDwgZW5kbDsKKworICBmX2hlYWRlcl8gPDwgIiNpZmRlZiBfTVNDX1ZFUlxuIgorICAgICAgICAgICAgICAgIiAgI3ByYWdtYSB3YXJuaW5nKCBwdXNoIClcbiIKKyAgICAgICAgICAgICAgICIgICNwcmFnbWEgd2FybmluZyAoZGlzYWJsZSA6IDQyNTAgKSAvL2luaGVyaXRpbmcgbWV0aG9kcyB2aWEgZG9taW5hbmNlIFxuIgorICAgICAgICAgICAgICAgIiNlbmRpZlxuXG4iOworCisgIC8vIFNlcnZpY2UgaW1wbGVtZW50YXRpb24gZmlsZSBpbmNsdWRlcworICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBnZXRfb3V0X2RpcigpICsgc3ZjbmFtZSArICIuY3BwIjsKKyAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOworICBmX3NlcnZpY2VfIDw8IGF1dG9nZW5fY29tbWVudCgpOworICBmX3NlcnZpY2VfIDw8ICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCpnZXRfcHJvZ3JhbSgpKSA8PCBzdmNuYW1lIDw8ICIuaFwiIiA8PCBlbmRsOworICBpZiAoZ2VuX2NvYl9zdHlsZV8pIHsKKyAgICBmX3NlcnZpY2VfIDw8ICIjaW5jbHVkZSBcInRocmlmdC9hc3luYy9UQXN5bmNDaGFubmVsLmhcIiIgPDwgZW5kbDsKKyAgfQorICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKKyAgICBmX3NlcnZpY2VfIDw8ICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCpnZXRfcHJvZ3JhbSgpKSA8PCBzdmNuYW1lIDw8ICIudGNjXCIiCisgICAgICAgICAgICAgICA8PCBlbmRsOworCisgICAgc3RyaW5nIGZfc2VydmljZV90Y2NfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBzdmNuYW1lICsgIi50Y2MiOworICAgIGZfc2VydmljZV90Y2NfLm9wZW4oZl9zZXJ2aWNlX3RjY19uYW1lLmNfc3RyKCkpOworICAgIGZfc2VydmljZV90Y2NfIDw8IGF1dG9nZW5fY29tbWVudCgpOworICAgIGZfc2VydmljZV90Y2NfIDw8ICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCpnZXRfcHJvZ3JhbSgpKSA8PCBzdmNuYW1lIDw8ICIuaFwiIgorICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgICBmX3NlcnZpY2VfdGNjXyA8PCAiI2lmbmRlZiAiIDw8IHN2Y25hbWUgPDwgIl9UQ0MiIDw8IGVuZGwgPDwgIiNkZWZpbmUgIiA8PCBzdmNuYW1lIDw8ICJfVENDIgorICAgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGlmIChnZW5fY29iX3N0eWxlXykgeworICAgICAgZl9zZXJ2aWNlX3RjY18gPDwgIiNpbmNsdWRlIFwidGhyaWZ0L2FzeW5jL1RBc3luY0NoYW5uZWwuaFwiIiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGZfc2VydmljZV8gPDwgZW5kbCA8PCBuc19vcGVuXyA8PCBlbmRsIDw8IGVuZGw7CisgIGZfc2VydmljZV90Y2NfIDw8IGVuZGwgPDwgbnNfb3Blbl8gPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIGFsbCB0aGUgY29tcG9uZW50cworICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSwgIiIpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZV9mYWN0b3J5KHRzZXJ2aWNlLCAiIik7CisgIGdlbmVyYXRlX3NlcnZpY2VfbnVsbCh0c2VydmljZSwgIiIpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSwgIiIpOworICBnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0c2VydmljZSwgIiIpOworICBnZW5lcmF0ZV9zZXJ2aWNlX211bHRpZmFjZSh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlLCAiQ29uY3VycmVudCIpOworCisgIC8vIEdlbmVyYXRlIHNrZWxldG9uCisgIGlmICghZ2VuX25vX3NrZWxldG9uXykgeworICAgICAgZ2VuZXJhdGVfc2VydmljZV9za2VsZXRvbih0c2VydmljZSk7CisgIH0KKworICAvLyBHZW5lcmF0ZSBhbGwgdGhlIGNvYiBjb21wb25lbnRzCisgIGlmIChnZW5fY29iX3N0eWxlXykgeworICAgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlLCAiQ29iQ2wiKTsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSwgIkNvYlN2Iik7CisgICAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2VfZmFjdG9yeSh0c2VydmljZSwgIkNvYlN2Iik7CisgICAgZ2VuZXJhdGVfc2VydmljZV9udWxsKHRzZXJ2aWNlLCAiQ29iU3YiKTsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSwgIkNvYiIpOworICAgIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRzZXJ2aWNlLCAiQ29iIik7CisKKyAgICBpZiAoIWdlbl9ub19za2VsZXRvbl8pIHsKKyAgICAgIGdlbmVyYXRlX3NlcnZpY2VfYXN5bmNfc2tlbGV0b24odHNlcnZpY2UpOworICAgIH0KKworICB9CisKKyAgZl9oZWFkZXJfIDw8ICIjaWZkZWYgX01TQ19WRVJcbiIKKyAgICAgICAgICAgICAgICIgICNwcmFnbWEgd2FybmluZyggcG9wIClcbiIKKyAgICAgICAgICAgICAgICIjZW5kaWZcblxuIjsKKworICAvLyBDbG9zZSB0aGUgbmFtZXNwYWNlCisgIGZfc2VydmljZV8gPDwgbnNfY2xvc2VfIDw8IGVuZGwgPDwgZW5kbDsKKyAgZl9zZXJ2aWNlX3RjY18gPDwgbnNfY2xvc2VfIDw8IGVuZGwgPDwgZW5kbDsKKyAgZl9oZWFkZXJfIDw8IG5zX2Nsb3NlXyA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gVE9ETyhzaW1wa2lucyk6IE1ha2UgdGhpcyBhIHNlcGFyYXRlIG9wdGlvbgorICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKKyAgICBmX2hlYWRlcl8gPDwgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpIDw8IHN2Y25hbWUgPDwgIi50Y2NcIiIgPDwgZW5kbAorICAgICAgICAgICAgICA8PCAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkgPDwgcHJvZ3JhbV9uYW1lXworICAgICAgICAgICAgICA8PCAiX3R5cGVzLnRjY1wiIiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICBmX2hlYWRlcl8gPDwgIiNlbmRpZiIgPDwgZW5kbDsKKyAgZl9zZXJ2aWNlX3RjY18gPDwgIiNlbmRpZiIgPDwgZW5kbDsKKworICAvLyBDbG9zZSB0aGUgZmlsZXMKKyAgZl9zZXJ2aWNlX3RjY18uY2xvc2UoKTsKKyAgZl9zZXJ2aWNlXy5jbG9zZSgpOworICBmX2hlYWRlcl8uY2xvc2UoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgYSBzZXJ2aWNlLiBCYXNpY2FsbHksIHRoaXMgZ2VuZXJhdGVzIHR5cGVzCisgKiBmb3IgYWxsIHRoZSBhcmd1bWVudHMgYW5kIHJlc3VsdHMgdG8gZnVuY3Rpb25zLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIHN0ZDo6b3N0cmVhbSYgb3V0ID0gKGdlbl90ZW1wbGF0ZXNfID8gZl9zZXJ2aWNlX3RjY18gOiBmX3NlcnZpY2VfKTsKKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBzdHJpbmcgbmFtZV9vcmlnID0gdHMtPmdldF9uYW1lKCk7CisKKyAgICAvLyBUT0RPKGRyZWlzcyk6IFdoeSBpcyB0aGlzIHN0dWZmIG5vdCBpbiBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzPworICAgIHRzLT5zZXRfbmFtZSh0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfYXJncyIpOworICAgIGdlbmVyYXRlX3N0cnVjdF9kZWNsYXJhdGlvbihmX2hlYWRlcl8sIHRzLCBmYWxzZSk7CisgICAgZ2VuZXJhdGVfc3RydWN0X2RlZmluaXRpb24ob3V0LCBmX3NlcnZpY2VfLCB0cywgZmFsc2UpOworICAgIGdlbmVyYXRlX3N0cnVjdF9yZWFkZXIob3V0LCB0cyk7CisgICAgZ2VuZXJhdGVfc3RydWN0X3dyaXRlcihvdXQsIHRzKTsKKyAgICB0cy0+c2V0X25hbWUodHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3BhcmdzIik7CisgICAgZ2VuZXJhdGVfc3RydWN0X2RlY2xhcmF0aW9uKGZfaGVhZGVyXywgdHMsIGZhbHNlLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7CisgICAgZ2VuZXJhdGVfc3RydWN0X2RlZmluaXRpb24ob3V0LCBmX3NlcnZpY2VfLCB0cywgZmFsc2UpOworICAgIGdlbmVyYXRlX3N0cnVjdF93cml0ZXIob3V0LCB0cywgdHJ1ZSk7CisgICAgdHMtPnNldF9uYW1lKG5hbWVfb3JpZyk7CisKKyAgICBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRzZXJ2aWNlLCAqZl9pdGVyKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlLCBzdHJpbmcgc3R5bGUpIHsKKworICBzdHJpbmcgc2VydmljZV9pZl9uYW1lID0gc2VydmljZV9uYW1lXyArIHN0eWxlICsgIklmIjsKKyAgaWYgKHN0eWxlID09ICJDb2JDbCIpIHsKKyAgICAvLyBGb3J3YXJkIGRlY2xhcmUgdGhlIGNsaWVudC4KKyAgICBzdHJpbmcgY2xpZW50X25hbWUgPSBzZXJ2aWNlX25hbWVfICsgIkNvYkNsaWVudCI7CisgICAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7CisgICAgICBjbGllbnRfbmFtZSArPSAiVCI7CisgICAgICBzZXJ2aWNlX2lmX25hbWUgKz0gIlQiOworICAgICAgaW5kZW50KGZfaGVhZGVyXykgPDwgInRlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCAiY2xhc3MgIiA8PCBjbGllbnRfbmFtZSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gIiA6IHZpcnR1YWwgcHVibGljICIgKyB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpICsgc3R5bGUgKyAiSWYiOworICAgIGlmIChzdHlsZSA9PSAiQ29iQ2wiICYmIGdlbl90ZW1wbGF0ZXNfKSB7CisgICAgICAvLyBUT0RPKHNpbXBraW5zKTogSWYgZ2VuX3RlbXBsYXRlc18gaXMgZW5hYmxlZCwgd2UgY3VycmVudGx5IGFzc3VtZSBhbGwKKyAgICAgIC8vIHBhcmVudCBzZXJ2aWNlcyB3ZXJlIGFsc28gZ2VuZXJhdGVkIHdpdGggdGVtcGxhdGVzIGVuYWJsZWQuCisgICAgICBleHRlbmRzICs9ICJUPFByb3RvY29sXz4iOworICAgIH0KKyAgfQorCisgIGlmIChzdHlsZSA9PSAiQ29iQ2wiICYmIGdlbl90ZW1wbGF0ZXNfKSB7CisgICAgZl9oZWFkZXJfIDw8ICJ0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPiIgPDwgZW5kbDsKKyAgfQorICBmX2hlYWRlcl8gPDwgImNsYXNzICIgPDwgc2VydmljZV9pZl9uYW1lIDw8IGV4dGVuZHMgPDwgIiB7IiA8PCBlbmRsIDw8ICIgcHVibGljOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAidmlydHVhbCB+IiA8PCBzZXJ2aWNlX2lmX25hbWUgPDwgIigpIHt9IiA8PCBlbmRsOworCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmhhc19kb2MoKSkKKyAgICAgIGZfaGVhZGVyXyA8PCBlbmRsOworICAgIGdlbmVyYXRlX2phdmFfZG9jKGZfaGVhZGVyXywgKmZfaXRlcik7CisgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ2aXJ0dWFsICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsIHN0eWxlKSA8PCAiID0gMDsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9oZWFkZXJfIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGlmIChzdHlsZSA9PSAiQ29iQ2wiICYmIGdlbl90ZW1wbGF0ZXNfKSB7CisgICAgLy8gZ2VuZXJhdGUgYSBiYWNrd2FyZHMtY29tcGF0aWJsZSB0eXBlZGVmIGZvciBjbGllbnRzIHRoYXQgZG8gbm90CisgICAgLy8ga25vdyBhYm91dCB0aGUgbmV3IHRlbXBsYXRlLXN0eWxlIGNvZGUKKyAgICBmX2hlYWRlcl8gPDwgInR5cGVkZWYgIiA8PCBzZXJ2aWNlX2lmX25hbWUgPDwgIjwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gIgorICAgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfIDw8IHN0eWxlIDw8ICJJZjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGZhY3RvcnkuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGFuIGludGVyZmFjZSBmYWN0b3J5IGZvci4KKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlX2ZhY3RvcnkodF9zZXJ2aWNlKiB0c2VydmljZSwgc3RyaW5nIHN0eWxlKSB7CisgIHN0cmluZyBzZXJ2aWNlX2lmX25hbWUgPSBzZXJ2aWNlX25hbWVfICsgc3R5bGUgKyAiSWYiOworCisgIC8vIEZpZ3VyZSBvdXQgdGhlIG5hbWUgb2YgdGhlIHVwcGVyLW1vc3QgcGFyZW50IGNsYXNzLgorICAvLyBHZXR0aW5nIGV2ZXJ5dGhpbmcgdG8gd29yayBvdXQgcHJvcGVybHkgd2l0aCBpbmhlcml0YW5jZSBpcyBhbm5veWluZy4KKyAgLy8gSGVyZSdzIHdoYXQgd2UncmUgZG9pbmcgZm9yIG5vdzoKKyAgLy8KKyAgLy8gLSBBbGwgaGFuZGxlcnMgaW1wbGVtZW50IGdldEhhbmRsZXIoKSwgYnV0IHN1YmNsYXNzZXMgdXNlIGNvdmFyaWFudCByZXR1cm4KKyAgLy8gICB0eXBlcyB0byByZXR1cm4gdGhlaXIgc3BlY2lmaWMgc2VydmljZSBpbnRlcmZhY2UgY2xhc3MgdHlwZS4gIFdlIGhhdmUgdG8KKyAgLy8gICB1c2UgcmF3IHBvaW50ZXJzIGJlY2F1c2Ugb2YgdGhpczsgc2hhcmVkX3B0cjw+IGNhbid0IGJlIHVzZWQgZm9yCisgIC8vICAgY292YXJpYW50IHJldHVybiB0eXBlcy4KKyAgLy8KKyAgLy8gLSBTaW5jZSB3ZSdyZSBub3QgdXNpbmcgc2hhcmVkX3B0cjw+LCB3ZSBhbHNvIHByb3ZpZGUgYSByZWxlYXNlSGFuZGxlcigpCisgIC8vICAgZnVuY3Rpb24gdGhhdCBtdXN0IGJlIGNhbGxlZCB0byByZWxlYXNlIGEgcG9pbnRlciB0byBhIGhhbmRsZXIgb2J0YWluZWQKKyAgLy8gICB2aWEgZ2V0SGFuZGxlcigpLgorICAvLworICAvLyAgIHJlbGVhc2VIYW5kbGVyKCkgYWx3YXlzIGFjY2VwdHMgYSBwb2ludGVyIHRvIHRoZSB1cHBlci1tb3N0IHBhcmVudCBjbGFzcworICAvLyAgIHR5cGUuICBUaGlzIGlzIG5lY2Vzc2FyeSBzaW5jZSB0aGUgcGFyZW50IHZlcnNpb25zIG9mIHJlbGVhc2VIYW5kbGVyKCkKKyAgLy8gICBtYXkgYWNjZXB0IGFueSBvZiB0aGUgcGFyZW50IHR5cGVzLCBub3QganVzdCB0aGUgbW9zdCBzcGVjaWZpYyBzdWJjbGFzcworICAvLyAgIHR5cGUuICBJbXBsZW1lbnRhdGlvbnMgY2FuIHVzZSBkeW5hbWljX2Nhc3QgdG8gY2FzdCB0aGUgcG9pbnRlciB0byB0aGUKKyAgLy8gICBzdWJjbGFzcyB0eXBlIGlmIGRlc2lyZWQuCisgIHRfc2VydmljZSogYmFzZV9zZXJ2aWNlID0gdHNlcnZpY2U7CisgIHdoaWxlIChiYXNlX3NlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGJhc2Vfc2VydmljZSA9IGJhc2Vfc2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKyAgfQorICBzdHJpbmcgYmFzZV9pZl9uYW1lID0gdHlwZV9uYW1lKGJhc2Vfc2VydmljZSkgKyBzdHlsZSArICJJZiI7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGFic3RyYWN0IGZhY3RvcnkgY2xhc3MKKyAgc3RyaW5nIGZhY3RvcnlfbmFtZSA9IHNlcnZpY2VfaWZfbmFtZSArICJGYWN0b3J5IjsKKyAgc3RyaW5nIGV4dGVuZHM7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9ICIgOiB2aXJ0dWFsIHB1YmxpYyAiICsgdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKSArIHN0eWxlICsgIklmRmFjdG9yeSI7CisgIH0KKworICBmX2hlYWRlcl8gPDwgImNsYXNzICIgPDwgZmFjdG9yeV9uYW1lIDw8IGV4dGVuZHMgPDwgIiB7IiA8PCBlbmRsIDw8ICIgcHVibGljOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAidHlwZWRlZiAiIDw8IHNlcnZpY2VfaWZfbmFtZSA8PCAiIEhhbmRsZXI7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgIDw8ICJ2aXJ0dWFsIH4iIDw8IGZhY3RvcnlfbmFtZSA8PCAiKCkge30iIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidmlydHVhbCAiCisgICAgICAgICAgICA8PCBzZXJ2aWNlX2lmX25hbWUgPDwgIiogZ2V0SGFuZGxlcigiCisgICAgICAgICAgICA8PCAiY29uc3QgOjphcGFjaGU6OnRocmlmdDo6VENvbm5lY3Rpb25JbmZvJiBjb25uSW5mbykgPSAwOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgPDwgInZpcnR1YWwgdm9pZCByZWxlYXNlSGFuZGxlcigiIDw8IGJhc2VfaWZfbmFtZSA8PCAiKiAvKiBoYW5kbGVyICovKSA9IDA7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfaGVhZGVyXyA8PCAifTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgc2luZ2xldG9uIGZhY3RvcnkgY2xhc3MKKyAgc3RyaW5nIHNpbmdsZXRvbl9mYWN0b3J5X25hbWUgPSBzZXJ2aWNlX2lmX25hbWUgKyAiU2luZ2xldG9uRmFjdG9yeSI7CisgIGZfaGVhZGVyXyA8PCAiY2xhc3MgIiA8PCBzaW5nbGV0b25fZmFjdG9yeV9uYW1lIDw8ICIgOiB2aXJ0dWFsIHB1YmxpYyAiIDw8IGZhY3RvcnlfbmFtZSA8PCAiIHsiCisgICAgICAgICAgICA8PCBlbmRsIDw8ICIgcHVibGljOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCBzaW5nbGV0b25fZmFjdG9yeV9uYW1lIDw8ICIoY29uc3QgOjpzdGQ6OnNoYXJlZF9wdHI8IiA8PCBzZXJ2aWNlX2lmX25hbWUKKyAgICAgICAgICAgIDw8ICI+JiBpZmFjZSkgOiBpZmFjZV8oaWZhY2UpIHt9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ2aXJ0dWFsIH4iCisgICAgICAgICAgICA8PCBzaW5nbGV0b25fZmFjdG9yeV9uYW1lIDw8ICIoKSB7fSIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ2aXJ0dWFsICIKKyAgICAgICAgICAgIDw8IHNlcnZpY2VfaWZfbmFtZSA8PCAiKiBnZXRIYW5kbGVyKCIKKyAgICAgICAgICAgIDw8ICJjb25zdCA6OmFwYWNoZTo6dGhyaWZ0OjpUQ29ubmVjdGlvbkluZm8mKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICA8PCAiICByZXR1cm4gaWZhY2VfLmdldCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgPDwgInZpcnR1YWwgdm9pZCByZWxlYXNlSGFuZGxlcigiIDw8IGJhc2VfaWZfbmFtZSA8PCAiKiAvKiBoYW5kbGVyICovKSB7fSIgPDwgZW5kbDsKKworICBmX2hlYWRlcl8gPDwgZW5kbCA8PCAiIHByb3RlY3RlZDoiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIjo6c3RkOjpzaGFyZWRfcHRyPCIgPDwgc2VydmljZV9pZl9uYW1lCisgICAgICAgICAgICA8PCAiPiBpZmFjZV87IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfaGVhZGVyXyA8PCAifTsiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBudWxsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzZXJ2aWNlLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9udWxsKHRfc2VydmljZSogdHNlcnZpY2UsIHN0cmluZyBzdHlsZSkgeworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSAiICwgdmlydHVhbCBwdWJsaWMgIiArIHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSkgKyBzdHlsZSArICJOdWxsIjsKKyAgfQorICBmX2hlYWRlcl8gPDwgImNsYXNzICIgPDwgc2VydmljZV9uYW1lXyA8PCBzdHlsZSA8PCAiTnVsbCA6IHZpcnR1YWwgcHVibGljICIgPDwgc2VydmljZV9uYW1lXworICAgICAgICAgICAgPDwgc3R5bGUgPDwgIklmIiA8PCBleHRlbmRzIDw8ICIgeyIgPDwgZW5kbCA8PCAiIHB1YmxpYzoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInZpcnR1YWwgfiIgPDwgc2VydmljZV9uYW1lXyA8PCBzdHlsZSA8PCAiTnVsbCgpIHt9IiA8PCBlbmRsOworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsIHN0eWxlLCAiIiwgZmFsc2UpIDw8ICIgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIHRfdHlwZSogcmV0dXJudHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKTsKKyAgICB0X2ZpZWxkIHJldHVybmZpZWxkKHJldHVybnR5cGUsICJfcmV0dXJuIik7CisKKyAgICBpZiAoc3R5bGUgPT0gIiIpIHsKKyAgICAgIGlmIChyZXR1cm50eXBlLT5pc192b2lkKCkgfHwgaXNfY29tcGxleF90eXBlKHJldHVybnR5cGUpKSB7CisgICAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCBkZWNsYXJlX2ZpZWxkKCZyZXR1cm5maWVsZCwgdHJ1ZSkgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgPDwgInJldHVybiBfcmV0dXJuOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHN0eWxlID09ICJDb2JTdiIpIHsKKyAgICAgIGlmIChyZXR1cm50eXBlLT5pc192b2lkKCkpIHsKKyAgICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gY29iKCk7IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdF9maWVsZCByZXR1cm5maWVsZChyZXR1cm50eXBlLCAiX3JldHVybiIpOworICAgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgZGVjbGFyZV9maWVsZCgmcmV0dXJuZmllbGQsIHRydWUpIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgIDw8ICJyZXR1cm4gY29iKF9yZXR1cm4pOyIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyAiVU5LTk9XTiBTVFlMRSI7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9oZWFkZXJfIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnVuY3Rpb25fY2FsbChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGFyZ19wcmVmaXgpIHsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIHRfdHlwZSogcmV0X3R5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSk7CisgIG91dCA8PCBpbmRlbnQoKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICFyZXRfdHlwZS0+aXNfdm9pZCgpKSB7CisgICAgaWYgKGlzX2NvbXBsZXhfdHlwZShyZXRfdHlwZSkpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICBvdXQgPDwgaWZhY2UgPDwgIi0+IiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiIDw8IHRhcmdldDsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IHRhcmdldCA8PCAiID0gIiA8PCBpZmFjZSA8PCAiLT4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7CisgICAgfQorICB9IGVsc2UgeworICAgIG91dCA8PCBpZmFjZSA8PCAiLT4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7CisgIH0KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiLCAiOworICAgIH0KKyAgICBvdXQgPDwgYXJnX3ByZWZpeCA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgIH0KKyAgb3V0IDw8ICIpOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfYXN5bmNfc2tlbGV0b24odF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgc3ZjbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpOworCisgIC8vIFNlcnZpY2UgaW1wbGVtZW50YXRpb24gZmlsZSBpbmNsdWRlcworICBzdHJpbmcgZl9za2VsZXRvbl9uYW1lID0gZ2V0X291dF9kaXIoKSArIHN2Y25hbWUgKyAiX2FzeW5jX3NlcnZlci5za2VsZXRvbi5jcHAiOworCisgIHN0cmluZyBucyA9IG5hbWVzcGFjZV9wcmVmaXgodHNlcnZpY2UtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lc3BhY2UoImNwcCIpKTsKKworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2tlbGV0b247CisgIGZfc2tlbGV0b24ub3BlbihmX3NrZWxldG9uX25hbWUuY19zdHIoKSk7CisgIGZfc2tlbGV0b24gPDwgIi8vIFRoaXMgYXV0b2dlbmVyYXRlZCBza2VsZXRvbiBmaWxlIGlsbHVzdHJhdGVzIG9uZSB3YXkgdG8gYWRhcHQgYSBzeW5jaHJvbm91cyIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8ICIvLyBpbnRlcmZhY2UgaW50byBhbiBhc3luY2hyb25vdXMgaW50ZXJmYWNlLiBZb3Ugc2hvdWxkIGNvcHkgaXQgdG8gYW5vdGhlciIKKyAgICAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgICAgPDwgIi8vIGZpbGVuYW1lIHRvIGF2b2lkIG92ZXJ3cml0aW5nIGl0IGFuZCByZXdyaXRlIGFzIGFzeW5jaHJvbm91cyBhbnkgZnVuY3Rpb25zIgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgIi8vIHRoYXQgd291bGQgb3RoZXJ3aXNlIGludHJvZHVjZSB1bndhbnRlZCBsYXRlbmN5LiIgPDwgZW5kbCA8PCBlbmRsCisgICAgICAgICAgICAgPDwgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpIDw8IHN2Y25hbWUgPDwgIi5oXCIiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4iIDw8IGVuZGwgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICJ1c2luZyBuYW1lc3BhY2UgOjphcGFjaGU6OnRocmlmdDsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAidXNpbmcgbmFtZXNwYWNlIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICJ1c2luZyBuYW1lc3BhY2UgOjphcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICJ1c2luZyBuYW1lc3BhY2UgOjphcGFjaGU6OnRocmlmdDo6YXN5bmM7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gdGhlIGZvbGxvd2luZyBjb2RlIHdvdWxkIG5vdCBjb21waWxlOgorICAvLyB1c2luZyBuYW1lc3BhY2UgOworICAvLyB1c2luZyBuYW1lc3BhY2UgOjo7CisgIGlmICgoIW5zLmVtcHR5KCkpICYmIChucy5jb21wYXJlKCIgOjoiKSAhPSAwKSkgeworICAgIGZfc2tlbGV0b24gPDwgInVzaW5nIG5hbWVzcGFjZSAiIDw8IHN0cmluZyhucywgMCwgbnMuc2l6ZSgpIC0gMikgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIGZfc2tlbGV0b24gPDwgImNsYXNzICIgPDwgc3ZjbmFtZSA8PCAiQXN5bmNIYW5kbGVyIDogIgorICAgICAgICAgICAgIDw8ICJwdWJsaWMgIiA8PCBzdmNuYW1lIDw8ICJDb2JTdklmIHsiIDw8IGVuZGwgPDwgIiBwdWJsaWM6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9za2VsZXRvbiA8PCBpbmRlbnQoKSA8PCBzdmNuYW1lIDw8ICJBc3luY0hhbmRsZXIoKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIiAgc3luY0hhbmRsZXJfID0gc3RkOjphdXRvX3B0cjwiIDw8IHN2Y25hbWUgPDwgIkhhbmRsZXI+KG5ldyAiIDw8IHN2Y25hbWUKKyAgICAgICAgICAgICA8PCAiSGFuZGxlcik7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIC8vIFlvdXIgaW5pdGlhbGl6YXRpb24gZ29lcyBoZXJlIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGZfc2tlbGV0b24gPDwgaW5kZW50KCkgPDwgInZpcnR1YWwgfiIgPDwgc2VydmljZV9uYW1lXyA8PCAiQXN5bmNIYW5kbGVyKCk7IiA8PCBlbmRsOworCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGZfc2tlbGV0b24gPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgIkNvYlN2IiwgIiIsIHRydWUpIDw8ICIgeyIKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICB0X3R5cGUqIHJldHVybnR5cGUgPSAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCk7CisgICAgdF9maWVsZCByZXR1cm5maWVsZChyZXR1cm50eXBlLCAiX3JldHVybiIpOworCisgICAgc3RyaW5nIHRhcmdldCA9IHJldHVybnR5cGUtPmlzX3ZvaWQoKSA/ICIiIDogIl9yZXR1cm4iOworICAgIGlmICghcmV0dXJudHlwZS0+aXNfdm9pZCgpKSB7CisgICAgICBmX3NrZWxldG9uIDw8IGluZGVudCgpIDw8IGRlY2xhcmVfZmllbGQoJnJldHVybmZpZWxkLCB0cnVlKSA8PCBlbmRsOworICAgIH0KKyAgICBnZW5lcmF0ZV9mdW5jdGlvbl9jYWxsKGZfc2tlbGV0b24sICpmX2l0ZXIsIHRhcmdldCwgInN5bmNIYW5kbGVyXyIsICIiKTsKKyAgICBmX3NrZWxldG9uIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gY29iKCIgPDwgdGFyZ2V0IDw8ICIpOyIgPDwgZW5kbDsKKworICAgIHNjb3BlX2Rvd24oZl9za2VsZXRvbik7CisgIH0KKyAgZl9za2VsZXRvbiA8PCBlbmRsIDw8ICIgcHJvdGVjdGVkOiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAic3RkOjphdXRvX3B0cjwiIDw8IHN2Y25hbWUKKyAgICAgICAgICAgICA8PCAiSGFuZGxlcj4gc3luY0hhbmRsZXJfOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9za2VsZXRvbiA8PCAifTsiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBtdWx0aWZhY2UsIHdoaWNoIGlzIGEgc2luZ2xlIHNlcnZlciB0aGF0IGp1c3QgdGFrZXMgYSBzZXQKKyAqIG9mIG9iamVjdHMgaW1wbGVtZW50aW5nIHRoZSBpbnRlcmZhY2UgYW5kIGNhbGxzIHRoZW0gYWxsLCByZXR1cm5pbmcgdGhlCisgKiB2YWx1ZSBvZiB0aGUgbGFzdCBvbmUgdG8gYmUgY2FsbGVkLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIG11bHRpc2VydmVyIGZvci4KKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfbXVsdGlmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfbXVsdGlmYWNlID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgZXh0ZW5kc19tdWx0aWZhY2UgPSAiLCBwdWJsaWMgIiArIGV4dGVuZHMgKyAiTXVsdGlmYWNlIjsKKyAgfQorCisgIHN0cmluZyBsaXN0X3R5cGUgPSBzdHJpbmcoInN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjwiKSArIHNlcnZpY2VfbmFtZV8gKyAiSWY+ID4iOworCisgIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgorICBmX2hlYWRlcl8gPDwgImNsYXNzICIgPDwgc2VydmljZV9uYW1lXyA8PCAiTXVsdGlmYWNlIDogIgorICAgICAgICAgICAgPDwgInZpcnR1YWwgcHVibGljICIgPDwgc2VydmljZV9uYW1lXyA8PCAiSWYiIDw8IGV4dGVuZHNfbXVsdGlmYWNlIDw8ICIgeyIgPDwgZW5kbAorICAgICAgICAgICAgPDwgIiBwdWJsaWM6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8IHNlcnZpY2VfbmFtZV8gPDwgIk11bHRpZmFjZSgiIDw8IGxpc3RfdHlwZQorICAgICAgICAgICAgPDwgIiYgaWZhY2VzKSA6IGlmYWNlc18oaWZhY2VzKSB7IiA8PCBlbmRsOworICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICA8PCAiICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8IiArIHNlcnZpY2VfbmFtZV8gKyAiSWY+ID46Oml0ZXJhdG9yIGl0ZXI7IgorICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIGZvciAoaXRlciA9IGlmYWNlcy5iZWdpbigpOyBpdGVyICE9IGlmYWNlcy5lbmQoKTsgKytpdGVyKSB7IgorICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgICAgIiA8PCBleHRlbmRzIDw8ICJNdWx0aWZhY2U6OmFkZCgqaXRlcik7IiA8PCBlbmRsCisgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7CisgIH0KKyAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ2aXJ0dWFsIH4iIDw8IHNlcnZpY2VfbmFtZV8KKyAgICAgICAgICAgIDw8ICJNdWx0aWZhY2UoKSB7fSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICAvLyBQcm90ZWN0ZWQgZGF0YSBtZW1iZXJzCisgIGZfaGVhZGVyXyA8PCAiIHByb3RlY3RlZDoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgbGlzdF90eXBlIDw8ICIgaWZhY2VzXzsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgc2VydmljZV9uYW1lXworICAgICAgICAgICAgPDwgIk11bHRpZmFjZSgpIHt9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ2b2lkIGFkZCg6OnN0ZDo6c2hhcmVkX3B0cjwiCisgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZj4gaWZhY2UpIHsiIDw8IGVuZGw7CisgIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICIgICIgPDwgZXh0ZW5kcyA8PCAiTXVsdGlmYWNlOjphZGQoaWZhY2UpOyIgPDwgZW5kbDsKKyAgfQorICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIiAgaWZhY2VzXy5wdXNoX2JhY2soaWZhY2UpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIiBwdWJsaWM6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfc3RydWN0KiBhcmdsaXN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGFyZ3MgPSBhcmdsaXN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGFfaXRlcjsKKworICAgIHN0cmluZyBjYWxsID0gc3RyaW5nKCJpZmFjZXNfW2ldLT4iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICIoIjsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBpZiAoaXNfY29tcGxleF90eXBlKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSkpIHsKKyAgICAgIGNhbGwgKz0gIl9yZXR1cm4iOworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9CisgICAgZm9yIChhX2l0ZXIgPSBhcmdzLmJlZ2luKCk7IGFfaXRlciAhPSBhcmdzLmVuZCgpOyArK2FfaXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBjYWxsICs9ICIsICI7CisgICAgICB9CisgICAgICBjYWxsICs9ICgqYV9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB9CisgICAgY2FsbCArPSAiKSI7CisKKyAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsICIiKSA8PCAiIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJzaXplX3Qgc3ogPSBpZmFjZXNfLnNpemUoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInNpemVfdCBpID0gMDsiCisgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImZvciAoOyBpIDwgKHN6IC0gMSk7ICsraSkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgY2FsbCA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgIGlmIChpc19jb21wbGV4X3R5cGUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSkgeworICAgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgY2FsbCA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICIgPDwgY2FsbCA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8IGNhbGwgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAifTsiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlLCBzdHJpbmcgc3R5bGUpIHsKKyAgc3RyaW5nIGlmc3R5bGU7CisgIGlmIChzdHlsZSA9PSAiQ29iIikgeworICAgIGlmc3R5bGUgPSAiQ29iQ2wiOworICB9CisKKyAgc3RkOjpvc3RyZWFtJiBvdXQgPSAoZ2VuX3RlbXBsYXRlc18gPyBmX3NlcnZpY2VfdGNjXyA6IGZfc2VydmljZV8pOworICBzdHJpbmcgdGVtcGxhdGVfaGVhZGVyLCB0ZW1wbGF0ZV9zdWZmaXgsIHNob3J0X3N1ZmZpeCwgcHJvdG9jb2xfdHlwZSwgX3RoaXM7CisgIHN0cmluZyBjb25zdCBwcm90X2ZhY3RvcnlfdHlwZSA9ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeSI7CisgIGlmIChnZW5fdGVtcGxhdGVzXykgeworICAgIHRlbXBsYXRlX2hlYWRlciA9ICJ0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPlxuIjsKKyAgICBzaG9ydF9zdWZmaXggPSAiVCI7CisgICAgdGVtcGxhdGVfc3VmZml4ID0gIlQ8UHJvdG9jb2xfPiI7CisgICAgcHJvdG9jb2xfdHlwZSA9ICJQcm90b2NvbF8iOworICAgIF90aGlzID0gInRoaXMtPiI7CisgIH0gZWxzZSB7CisgICAgcHJvdG9jb2xfdHlwZSA9ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sIjsKKyAgfQorICBzdHJpbmcgcHJvdF9wdHIgPSAic3RkOjpzaGFyZWRfcHRyPCAiICsgcHJvdG9jb2xfdHlwZSArICI+IjsKKyAgc3RyaW5nIGNsaWVudF9zdWZmaXggPSAiQ2xpZW50IiArIHRlbXBsYXRlX3N1ZmZpeDsKKyAgc3RyaW5nIGlmX3N1ZmZpeCA9ICJJZiI7CisgIGlmIChzdHlsZSA9PSAiQ29iIikgeworICAgIGlmX3N1ZmZpeCArPSB0ZW1wbGF0ZV9zdWZmaXg7CisgIH0KKworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICAvLyBUT0RPKHNpbXBraW5zKTogSWYgZ2VuX3RlbXBsYXRlc18gaXMgZW5hYmxlZCwgd2UgY3VycmVudGx5IGFzc3VtZSBhbGwKKyAgICAvLyBwYXJlbnQgc2VydmljZXMgd2VyZSBhbHNvIGdlbmVyYXRlZCB3aXRoIHRlbXBsYXRlcyBlbmFibGVkLgorICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGV4dGVuZHNfY2xpZW50ID0gIiwgcHVibGljICIgKyBleHRlbmRzICsgc3R5bGUgKyBjbGllbnRfc3VmZml4OworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCisgIGlmIChzdHlsZSA9PSAiQ29uY3VycmVudCIpIHsKKyAgICBmX2hlYWRlcl8gPDwgIi8vIFRoZSBcJ2NvbmN1cnJlbnRcJyBjbGllbnQgaXMgYSB0aHJlYWQgc2FmZSBjbGllbnQgdGhhdCBjb3JyZWN0bHkgaGFuZGxlc1xuIgorICAgICAgICAgICAgICAgICAiLy8gb3V0IG9mIG9yZGVyIHJlc3BvbnNlcy4gIEl0IGlzIHNsb3dlciB0aGFuIHRoZSByZWd1bGFyIGNsaWVudCwgc28gc2hvdWxkXG4iCisgICAgICAgICAgICAgICAgICIvLyBvbmx5IGJlIHVzZWQgd2hlbiB5b3UgbmVlZCB0byBzaGFyZSBhIGNvbm5lY3Rpb24gYW1vbmcgbXVsdGlwbGUgdGhyZWFkc1xuIjsKKyAgfQorICBmX2hlYWRlcl8gPDwgdGVtcGxhdGVfaGVhZGVyIDw8ICJjbGFzcyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgc3R5bGUgPDwgIkNsaWVudCIgPDwgc2hvcnRfc3VmZml4CisgICAgICAgICAgICA8PCAiIDogIgorICAgICAgICAgICAgPDwgInZpcnR1YWwgcHVibGljICIgPDwgc2VydmljZV9uYW1lXyA8PCBpZnN0eWxlIDw8IGlmX3N1ZmZpeCA8PCBleHRlbmRzX2NsaWVudCA8PCAiIHsiCisgICAgICAgICAgICA8PCBlbmRsIDw8ICIgcHVibGljOiIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKyAgaWYgKHN0eWxlICE9ICJDb2IiKSB7CisgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8IHNlcnZpY2VfbmFtZV8gPDwgc3R5bGUgPDwgIkNsaWVudCIgPDwgc2hvcnRfc3VmZml4IDw8ICIoIiA8PCBwcm90X3B0cgorICAgICAgICAgICAgICA8PCAiIHByb3QpICI7CisKKyAgICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgICBmX2hlYWRlcl8gPDwgInsiIDw8IGVuZGw7CisgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIiAgc2V0UHJvdG9jb2wiIDw8IHNob3J0X3N1ZmZpeCA8PCAiKHByb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgIDw8ICJ9IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX2hlYWRlcl8gPDwgIjoiIDw8IGVuZGw7CisgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIiAgIiA8PCBleHRlbmRzIDw8IHN0eWxlIDw8IGNsaWVudF9zdWZmaXggPDwgIihwcm90LCBwcm90KSB7fSIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0KKworICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCBzZXJ2aWNlX25hbWVfIDw8IHN0eWxlIDw8ICJDbGllbnQiIDw8IHNob3J0X3N1ZmZpeCA8PCAiKCIgPDwgcHJvdF9wdHIKKyAgICAgICAgICAgICAgPDwgIiBpcHJvdCwgIiA8PCBwcm90X3B0ciA8PCAiIG9wcm90KSAiOworICAgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICAgIGZfaGVhZGVyXyA8PCAieyIgPDwgZW5kbDsKKyAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiICBzZXRQcm90b2NvbCIgPDwgc2hvcnRfc3VmZml4IDw8ICIoaXByb3Qsb3Byb3QpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX2hlYWRlcl8gPDwgIjoiIDw8IGluZGVudCgpIDw8ICIgICIgPDwgZXh0ZW5kcyA8PCBzdHlsZSA8PCBjbGllbnRfc3VmZml4CisgICAgICAgICAgICAgICAgPDwgIihpcHJvdCwgb3Byb3QpIHt9IiA8PCBlbmRsOworICAgIH0KKworICAgIC8vIGNyZWF0ZSB0aGUgc2V0UHJvdG9jb2wgbWV0aG9kcworICAgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICAgIGZfaGVhZGVyXyA8PCAiIHByaXZhdGU6IiA8PCBlbmRsOworICAgICAgLy8gMTogb25lIHBhcmFtZXRlcgorICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ2b2lkIHNldFByb3RvY29sIiA8PCBzaG9ydF9zdWZmaXggPDwgIigiIDw8IHByb3RfcHRyIDw8ICIgcHJvdCkgeyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJzZXRQcm90b2NvbCIgPDwgc2hvcnRfc3VmZml4IDw8ICIocHJvdCxwcm90KTsiIDw8IGVuZGw7CisgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAvLyAyOiB0d28gcGFyYW1ldGVyCisgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInZvaWQgc2V0UHJvdG9jb2wiIDw8IHNob3J0X3N1ZmZpeCA8PCAiKCIgPDwgcHJvdF9wdHIgPDwgIiBpcHJvdCwgIgorICAgICAgICAgICAgICAgIDw8IHByb3RfcHRyIDw8ICIgb3Byb3QpIHsiIDw8IGVuZGw7CisKKyAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiICBwaXByb3RfPWlwcm90OyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBwb3Byb3RfPW9wcm90OyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIGlwcm90XyA9IGlwcm90LmdldCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgIDw8ICIgIG9wcm90XyA9IG9wcm90LmdldCgpOyIgPDwgZW5kbDsKKworICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgZl9oZWFkZXJfIDw8ICIgcHVibGljOiIgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBHZW5lcmF0ZSBnZXR0ZXJzIGZvciB0aGUgcHJvdG9jb2xzLgorICAgIC8vIE5vdGUgdGhhdCB0aGVzZSBhcmUgbm90IGN1cnJlbnRseSB0ZW1wbGF0ZWQgZm9yIHNpbXBsaWNpdHkuCisgICAgLy8gVE9ETyhzaW1wa2lucyk6IHNob3VsZCB0aGV5IGJlIHRlbXBsYXRlZD8KKyAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgPDwgInN0ZDo6c2hhcmVkX3B0cjwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gZ2V0SW5wdXRQcm90b2NvbCgpIHsiCisgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgX3RoaXMgPDwgInBpcHJvdF87IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IgorICAgICAgICAgICAgICA8PCBlbmRsOworCisgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpCisgICAgICAgICAgICAgIDw8ICJzdGQ6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IGdldE91dHB1dFByb3RvY29sKCkgeyIKKyAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBfdGhpcyA8PCAicG9wcm90XzsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iCisgICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgfSBlbHNlIC8qIGlmIChzdHlsZSA9PSAiQ29iIikgKi8geworICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCBzZXJ2aWNlX25hbWVfIDw8IHN0eWxlIDw8ICJDbGllbnQiIDw8IHNob3J0X3N1ZmZpeCA8PCAiKCIKKyAgICAgICAgICAgICAgPDwgInN0ZDo6c2hhcmVkX3B0cjwgOjphcGFjaGU6OnRocmlmdDo6YXN5bmM6OlRBc3luY0NoYW5uZWw+IGNoYW5uZWwsICIKKyAgICAgICAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5KiBwcm90b2NvbEZhY3RvcnkpIDoiIDw8IGVuZGw7CisgICAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICIgIGNoYW5uZWxfKGNoYW5uZWwpLCIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgIDw8ICIgIGl0cmFuc18obmV3IDo6YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcigpKSwiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICBvdHJhbnNfKG5ldyA6OmFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIoKSksIgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKKyAgICAgICAgLy8gVFByb3RvY29sRmFjdG9yeSBjbGFzc2VzIHJldHVybiBnZW5lcmljIFRQcm90b2NvbCBwb2ludGVycy4KKyAgICAgICAgLy8gV2UgaGF2ZSB0byBkeW5hbWljIGNhc3QgdG8gdGhlIFByb3RvY29sXyB0eXBlIHdlIGFyZSBleHBlY3RpbmcuCisgICAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiICBwaXByb3RfKDo6c3RkOjpkeW5hbWljX3BvaW50ZXJfY2FzdDxQcm90b2NvbF8+KCIKKyAgICAgICAgICAgICAgICAgIDw8ICJwcm90b2NvbEZhY3RvcnktPmdldFByb3RvY29sKGl0cmFuc18pKSksIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICA8PCAiICBwb3Byb3RfKDo6c3RkOjpkeW5hbWljX3BvaW50ZXJfY2FzdDxQcm90b2NvbF8+KCIKKyAgICAgICAgICAgICAgICAgIDw8ICJwcm90b2NvbEZhY3RvcnktPmdldFByb3RvY29sKG90cmFuc18pKSkgeyIgPDwgZW5kbDsKKyAgICAgICAgLy8gVGhyb3cgYSBURXhjZXB0aW9uIGlmIGVpdGhlciBkeW5hbWljIGNhc3QgZmFpbGVkLgorICAgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIiAgaWYgKCFwaXByb3RfIHx8ICFwb3Byb3RfKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICA8PCAiICAgIHRocm93IDo6YXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24oXCIiCisgICAgICAgICAgICAgICAgICA8PCAiVFByb3RvY29sRmFjdG9yeSByZXR1cm5lZCB1bmV4cGVjdGVkIHByb3RvY29sIHR5cGUgaW4gIiA8PCBzZXJ2aWNlX25hbWVfCisgICAgICAgICAgICAgICAgICA8PCBzdHlsZSA8PCAiQ2xpZW50IiA8PCBzaG9ydF9zdWZmaXggPDwgIiBjb25zdHJ1Y3RvclwiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgIDw8ICIgIH0iIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIiAgcGlwcm90Xyhwcm90b2NvbEZhY3RvcnktPmdldFByb3RvY29sKGl0cmFuc18pKSwiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHBvcHJvdF8ocHJvdG9jb2xGYWN0b3J5LT5nZXRQcm90b2NvbChvdHJhbnNfKSkgeyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiICBpcHJvdF8gPSBwaXByb3RfLmdldCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgIDw8ICIgIG9wcm90XyA9IHBvcHJvdF8uZ2V0KCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIiAgIiA8PCBleHRlbmRzIDw8IHN0eWxlIDw8IGNsaWVudF9zdWZmaXgKKyAgICAgICAgICAgICAgICA8PCAiKGNoYW5uZWwsIHByb3RvY29sRmFjdG9yeSkge30iIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaWYgKHN0eWxlID09ICJDb2IiKSB7CisgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpCisgICAgICAgICAgICAgIDw8ICI6OnN0ZDo6c2hhcmVkX3B0cjwgOjphcGFjaGU6OnRocmlmdDo6YXN5bmM6OlRBc3luY0NoYW5uZWw+IGdldENoYW5uZWwoKSB7IiA8PCBlbmRsCisgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IF90aGlzIDw8ICJjaGFubmVsXzsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgaWYgKCFnZW5fbm9fY2xpZW50X2NvbXBsZXRpb25fKSB7CisgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInZpcnR1YWwgdm9pZCBjb21wbGV0ZWRfXyhib29sIC8qIHN1Y2Nlc3MgKi8pIHt9IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGluZGVudChmX2hlYWRlcl8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCBpZnN0eWxlKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAvLyBUT0RPKGRyZWlzcyk6IFVzZSBwcml2YXRlIGluaGVyaXRhbmNlIHRvIGF2b2lkIGdlbmVyYXRpbmcgdGhpc2UgaW4gY29iLXN0eWxlLgorICAgIGlmIChzdHlsZSA9PSAiQ29uY3VycmVudCIgJiYgISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIC8vIGNvbmN1cnJlbnQgY2xpZW50cyBuZWVkIHRvIG1vdmUgdGhlIHNlcWlkIGZyb20gdGhlIHNlbmQgZnVuY3Rpb24gdG8gdGhlCisgICAgICAvLyByZWN2IGZ1bmN0aW9uLiAgT25ld2F5IG1ldGhvZHMgZG9uJ3QgaGF2ZSBhIHJlY3YgZnVuY3Rpb24sIHNvIHdlIGRvbid0IG5lZWQgdG8KKyAgICAgIC8vIG1vdmUgdGhlIHNlcWlkIGZvciB0aGVtLiAgQXR0ZW1wdGluZyB0byBkbyBzbyB3b3VsZCByZXN1bHQgaW4gYSBzZXFpZCBsZWFrLgorICAgICAgdF9mdW5jdGlvbiBzZW5kX2Z1bmN0aW9uKGdfdHlwZV9pMzIsIC8qcmV0dXJuaW5nIHNlcWlkKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInNlbmRfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpKTsKKyAgICAgIGluZGVudChmX2hlYWRlcl8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VuZF9mdW5jdGlvbiwgIiIpIDw8ICI7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICB0X2Z1bmN0aW9uIHNlbmRfZnVuY3Rpb24oZ190eXBlX3ZvaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJzZW5kXyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSk7CisgICAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnNlbmRfZnVuY3Rpb24sICIiKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBpZiAoc3R5bGUgPT0gIkNvbmN1cnJlbnQiKSB7CisgICAgICAgIHRfZmllbGQgc2VxSWRBcmcoZ190eXBlX2kzMiwgInNlcWlkIik7CisgICAgICAgIHRfc3RydWN0IHNlcUlkQXJnU3RydWN0KHByb2dyYW1fKTsKKyAgICAgICAgc2VxSWRBcmdTdHJ1Y3QuYXBwZW5kKCZzZXFJZEFyZyk7CisgICAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VxSWRBcmdTdHJ1Y3QpOworICAgICAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24sICIiKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7CisgICAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9hcmdzKTsKKyAgICAgICAgaW5kZW50KGZfaGVhZGVyXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uLCAiIikgPDwgIjsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICB9CisgIGluZGVudF9kb3duKCk7CisKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfaGVhZGVyXyA8PCAiIHByb3RlY3RlZDoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBpZiAoc3R5bGUgPT0gIkNvYiIpIHsKKyAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgIDw8ICI6OnN0ZDo6c2hhcmVkX3B0cjwgOjphcGFjaGU6OnRocmlmdDo6YXN5bmM6OlRBc3luY0NoYW5uZWw+IGNoYW5uZWxfOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgPDwgIjo6c3RkOjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI+IGl0cmFuc187IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICA8PCAiOjpzdGQ6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcj4gb3RyYW5zXzsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisgICAgZl9oZWFkZXJfIDw8CisgICAgICBpbmRlbnQoKSA8PCBwcm90X3B0ciA8PCAiIHBpcHJvdF87IiA8PCBlbmRsIDw8CisgICAgICBpbmRlbnQoKSA8PCBwcm90X3B0ciA8PCAiIHBvcHJvdF87IiA8PCBlbmRsIDw8CisgICAgICBpbmRlbnQoKSA8PCBwcm90b2NvbF90eXBlIDw8ICIqIGlwcm90XzsiIDw8IGVuZGwgPDwKKyAgICAgIGluZGVudCgpIDw8IHByb3RvY29sX3R5cGUgPDwgIiogb3Byb3RfOyIgPDwgZW5kbDsKKworICAgIGlmIChzdHlsZSA9PSAiQ29uY3VycmVudCIpIHsKKyAgICAgIGZfaGVhZGVyXyA8PAorICAgICAgICBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6YXN5bmM6OlRDb25jdXJyZW50Q2xpZW50U3luY0luZm8gc3luY187Ijw8ZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIGZfaGVhZGVyXyA8PCAifTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKKyAgICAvLyBPdXRwdXQgYSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB0eXBlZGVmIHVzaW5nCisgICAgLy8gVFByb3RvY29sIGFzIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIuCisgICAgZl9oZWFkZXJfIDw8ICJ0eXBlZGVmICIgPDwgc2VydmljZV9uYW1lXyA8PCBzdHlsZQorICAgICAgICAgICAgICA8PCAiQ2xpZW50VDwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gIiA8PCBzZXJ2aWNlX25hbWVfIDw8IHN0eWxlCisgICAgICAgICAgICAgIDw8ICJDbGllbnQ7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICBzdHJpbmcgc2NvcGUgPSBzZXJ2aWNlX25hbWVfICsgc3R5bGUgKyBjbGllbnRfc3VmZml4ICsgIjo6IjsKKworICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBzZXFJZENhcHR1cmU7CisgICAgc3RyaW5nIHNlcUlkVXNlOworICAgIHN0cmluZyBzZXFJZENvbW1hVXNlOworICAgIGlmIChzdHlsZSA9PSAiQ29uY3VycmVudCIgJiYgISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIHNlcUlkQ2FwdHVyZSA9ICJpbnQzMl90IHNlcWlkID0gIjsKKyAgICAgIHNlcUlkVXNlID0gInNlcWlkIjsKKyAgICAgIHNlcUlkQ29tbWFVc2UgPSAiLCBzZXFpZCI7CisgICAgfQorCisgICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisKKyAgICAvLyBPcGVuIGZ1bmN0aW9uCisgICAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCB0ZW1wbGF0ZV9oZWFkZXI7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCBpZnN0eWxlLCBzY29wZSkgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICAgIGluZGVudChvdXQpIDw8IHNlcUlkQ2FwdHVyZSA8PCAic2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiOworCisgICAgLy8gR2V0IHRoZSBzdHJ1Y3Qgb2YgZnVuY3Rpb24gY2FsbCBwYXJhbXMKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKworICAgIC8vIERlY2xhcmUgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50cworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8ICIsICI7CisgICAgICB9CisgICAgICBvdXQgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCk7CisgICAgfQorICAgIG91dCA8PCAiKTsiIDw8IGVuZGw7CisKKyAgICBpZiAoc3R5bGUgIT0gIkNvYiIpIHsKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgICBvdXQgPDwgaW5kZW50KCk7CisgICAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgICBpZiAoaXNfY29tcGxleF90eXBlKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSkpIHsKKyAgICAgICAgICAgIG91dCA8PCAicmVjdl8iIDw8IGZ1bm5hbWUgPDwgIihfcmV0dXJuIiA8PCBzZXFJZENvbW1hVXNlIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3V0IDw8ICJyZXR1cm4gcmVjdl8iIDw8IGZ1bm5hbWUgPDwgIigiIDw8IHNlcUlkVXNlIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8ICJyZWN2XyIgPDwgZnVubmFtZSA8PCAiKCIgPDwgc2VxSWRVc2UgPDwgIik7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgX3RoaXMgPDwgImNoYW5uZWxfLT5zZW5kQW5kUmVjdk1lc3NhZ2UoIgorICAgICAgICAgICAgPDwgIjo6c3RkOjpiaW5kKGNvYiwgdGhpcyksICIgPDwgX3RoaXMgPDwgIm90cmFuc18uZ2V0KCksICIgPDwgX3RoaXMgPDwgIml0cmFuc18uZ2V0KCkpOyIKKyAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgX3RoaXMgPDwgImNoYW5uZWxfLT5zZW5kTWVzc2FnZSgiCisgICAgICAgICAgICA8PCAiOjpzdGQ6OmJpbmQoY29iLCB0aGlzKSwgIiA8PCBfdGhpcyA8PCAib3RyYW5zXy5nZXQoKSk7IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisKKyAgICAvLyBpZiAoc3R5bGUgIT0gIkNvYiIpIC8vIFRPRE8oZHJlaXNzKTogTGliaWZ5IHRoZSBjbGllbnQgYW5kIGRvbid0IGdlbmVyYXRlIHRoaXMgZm9yIGNvYi1zdHlsZQorICAgIGlmICh0cnVlKSB7CisgICAgICB0X3R5cGUqIHNlbmRfZnVuY19yZXR1cm5fdHlwZSA9IGdfdHlwZV92b2lkOworICAgICAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IiAmJiAhKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgICBzZW5kX2Z1bmNfcmV0dXJuX3R5cGUgPSBnX3R5cGVfaTMyOworICAgICAgfQorICAgICAgLy8gRnVuY3Rpb24gZm9yIHNlbmRpbmcKKyAgICAgIHRfZnVuY3Rpb24gc2VuZF9mdW5jdGlvbihzZW5kX2Z1bmNfcmV0dXJuX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJzZW5kXyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSk7CisKKyAgICAgIC8vIE9wZW4gdGhlIHNlbmQgZnVuY3Rpb24KKyAgICAgIGlmIChnZW5fdGVtcGxhdGVzXykgeworICAgICAgICBpbmRlbnQob3V0KSA8PCB0ZW1wbGF0ZV9oZWFkZXI7CisgICAgICB9CisgICAgICBpbmRlbnQob3V0KSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnNlbmRfZnVuY3Rpb24sICIiLCBzY29wZSkgPDwgZW5kbDsKKyAgICAgIHNjb3BlX3VwKG91dCk7CisKKyAgICAgIC8vIEZ1bmN0aW9uIGFyZ3VtZW50cyBhbmQgcmVzdWx0cworICAgICAgc3RyaW5nIGFyZ3NuYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3BhcmdzIjsKKyAgICAgIHN0cmluZyByZXN1bHRuYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3ByZXN1bHQiOworCisgICAgICBzdHJpbmcgY3NlcWlkVmFsID0gIjAiOworICAgICAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IikgeworICAgICAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgICBjc2VxaWRWYWwgPSAidGhpcy0+c3luY18uZ2VuZXJhdGVTZXFJZCgpIjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0CisgICAgICBvdXQgPDwKKyAgICAgICAgaW5kZW50KCkgPDwgImludDMyX3QgY3NlcWlkID0gIiA8PCBjc2VxaWRWYWwgPDwgIjsiIDw8IGVuZGw7CisgICAgICBpZihzdHlsZSA9PSAiQ29uY3VycmVudCIpIHsKKyAgICAgICAgb3V0IDw8CisgICAgICAgICAgaW5kZW50KCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OmFzeW5jOjpUQ29uY3VycmVudFNlbmRTZW50cnkgc2VudHJ5KCZ0aGlzLT5zeW5jXyk7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgaWYgKHN0eWxlID09ICJDb2IiKSB7CisgICAgICAgIG91dCA8PAorICAgICAgICAgIGluZGVudCgpIDw8IF90aGlzIDw8ICJvdHJhbnNfLT5yZXNldEJ1ZmZlcigpOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIG91dCA8PAorICAgICAgICBpbmRlbnQoKSA8PCBfdGhpcyA8PCAib3Byb3RfLT53cml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwKKyAgICAgICAgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8CisgICAgICAgICJcIiwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OiIgPDwgKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkgPyAiVF9PTkVXQVkiIDogIlRfQ0FMTCIpIDw8CisgICAgICAgICIsIGNzZXFpZCk7IiA8PCBlbmRsIDw8IGVuZGwgPDwKKyAgICAgICAgaW5kZW50KCkgPDwgYXJnc25hbWUgPDwgIiBhcmdzOyIgPDwgZW5kbDsKKworICAgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhcmdzLiIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICYiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhcmdzLndyaXRlKCIgPDwgX3RoaXMgPDwgIm9wcm90Xyk7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgX3RoaXMKKyAgICAgICAgICA8PCAib3Byb3RfLT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgX3RoaXMKKyAgICAgICAgICA8PCAib3Byb3RfLT5nZXRUcmFuc3BvcnQoKS0+d3JpdGVFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgX3RoaXMKKyAgICAgICAgICA8PCAib3Byb3RfLT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGw7CisKKyAgICAgIGlmIChzdHlsZSA9PSAiQ29uY3VycmVudCIpIHsKKyAgICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInNlbnRyeS5jb21taXQoKTsiIDw8IGVuZGw7CisKKyAgICAgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gY3NlcWlkOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgc2NvcGVfZG93bihvdXQpOworICAgICAgb3V0IDw8IGVuZGw7CisKKyAgICAgIC8vIEdlbmVyYXRlIHJlY3YgZnVuY3Rpb24gb25seSBpZiBub3QgYW4gb25ld2F5IGZ1bmN0aW9uCisgICAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKKworICAgICAgICB0X2ZpZWxkIHNlcUlkQXJnKGdfdHlwZV9pMzIsICJzZXFpZCIpOworICAgICAgICB0X3N0cnVjdCBzZXFJZEFyZ1N0cnVjdChwcm9ncmFtXyk7CisgICAgICAgIHNlcUlkQXJnU3RydWN0LmFwcGVuZCgmc2VxSWRBcmcpOworCisgICAgICAgIHRfc3RydWN0KiByZWN2X2Z1bmN0aW9uX2FyZ3MgPSAmbm9hcmdzOworICAgICAgICBpZiAoc3R5bGUgPT0gIkNvbmN1cnJlbnQiKSB7CisgICAgICAgICAgcmVjdl9mdW5jdGlvbl9hcmdzID0gJnNlcUlkQXJnU3RydWN0OworICAgICAgICB9CisKKyAgICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3ZfZnVuY3Rpb25fYXJncyk7CisgICAgICAgIC8vIE9wZW4gdGhlIHJlY3YgZnVuY3Rpb24KKyAgICAgICAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgdGVtcGxhdGVfaGVhZGVyOworICAgICAgICB9CisgICAgICAgIGluZGVudChvdXQpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbiwgIiIsIHNjb3BlKSA8PCBlbmRsOworICAgICAgICBzY29wZV91cChvdXQpOworCisgICAgICAgIG91dCA8PCBlbmRsIDw8CisgICAgICAgICAgaW5kZW50KCkgPDwgImludDMyX3QgcnNlcWlkID0gMDsiIDw8IGVuZGwgPDwKKyAgICAgICAgICBpbmRlbnQoKSA8PCAic3RkOjpzdHJpbmcgZm5hbWU7IiA8PCBlbmRsIDw8CisgICAgICAgICAgaW5kZW50KCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUTWVzc2FnZVR5cGUgbXR5cGU7IiA8PCBlbmRsOworICAgICAgICBpZihzdHlsZSA9PSAiQ29uY3VycmVudCIpIHsKKyAgICAgICAgICBvdXQgPDwKKyAgICAgICAgICAgIGVuZGwgPDwKKyAgICAgICAgICAgIGluZGVudCgpIDw8ICIvLyB0aGUgcmVhZCBtdXRleCBnZXRzIGRyb3BwZWQgYW5kIHJlYWNxdWlyZWQgYXMgcGFydCBvZiB3YWl0Rm9yV29yaygpIiA8PCBlbmRsIDw8CisgICAgICAgICAgICBpbmRlbnQoKSA8PCAiLy8gVGhlIGRlc3RydWN0b3Igb2YgdGhpcyBzZW50cnkgd2FrZXMgdXAgb3RoZXIgY2xpZW50cyIgPDwgZW5kbCA8PAorICAgICAgICAgICAgaW5kZW50KCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OmFzeW5jOjpUQ29uY3VycmVudFJlY3ZTZW50cnkgc2VudHJ5KCZ0aGlzLT5zeW5jXywgc2VxaWQpOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3R5bGUgPT0gIkNvYiIgJiYgIWdlbl9ub19jbGllbnRfY29tcGxldGlvbl8pIHsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImJvb2wgY29tcGxldGVkID0gZmFsc2U7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInRyeSB7IjsKKyAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwgZW5kbDsKKyAgICAgICAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IikgeworICAgICAgICAgIG91dCA8PAorICAgICAgICAgICAgaW5kZW50KCkgPDwgIndoaWxlKHRydWUpIHsiIDw8IGVuZGwgPDwKKyAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIGlmKCF0aGlzLT5zeW5jXy5nZXRQZW5kaW5nKGZuYW1lLCBtdHlwZSwgcnNlcWlkKSkgeyIgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwKKyAgICAgICAgICBpbmRlbnQoKSA8PCBfdGhpcyA8PCAiaXByb3RfLT5yZWFkTWVzc2FnZUJlZ2luKGZuYW1lLCBtdHlwZSwgcnNlcWlkKTsiIDw8IGVuZGw7CisgICAgICAgIGlmIChzdHlsZSA9PSAiQ29uY3VycmVudCIpIHsKKyAgICAgICAgICBzY29wZV9kb3duKG91dCk7CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZihzZXFpZCA9PSByc2VxaWQpIHsiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8CisgICAgICAgICAgaW5kZW50KCkgPDwgImlmIChtdHlwZSA9PSA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9FWENFUFRJT04pIHsiIDw8IGVuZGwgPDwKKyAgICAgICAgICBpbmRlbnQoKSA8PCAiICA6OmFwYWNoZTo6dGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb24geDsiIDw8IGVuZGwgPDwKKyAgICAgICAgICBpbmRlbnQoKSA8PCAiICB4LnJlYWQoIiA8PCBfdGhpcyA8PCAiaXByb3RfKTsiIDw8IGVuZGwgPDwKKyAgICAgICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IF90aGlzIDw8ICJpcHJvdF8tPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8CisgICAgICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCBfdGhpcyA8PCAiaXByb3RfLT5nZXRUcmFuc3BvcnQoKS0+cmVhZEVuZCgpOyIgPDwgZW5kbDsKKyAgICAgICAgaWYgKHN0eWxlID09ICJDb2IiICYmICFnZW5fbm9fY2xpZW50X2NvbXBsZXRpb25fKSB7CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIGNvbXBsZXRlZCA9IHRydWU7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIGNvbXBsZXRlZF9fKHRydWUpOyIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3R5bGUgPT0gIkNvbmN1cnJlbnQiKSB7CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHNlbnRyeS5jb21taXQoKTsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8CisgICAgICAgICAgaW5kZW50KCkgPDwgIiAgdGhyb3cgeDsiIDw8IGVuZGwgPDwKKyAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAorICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAobXR5cGUgIT0gOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfUkVQTFkpIHsiIDw8IGVuZGwgPDwKKyAgICAgICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IF90aGlzIDw8ICJpcHJvdF8tPnNraXAoIiA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RSVUNUKTsiIDw8IGVuZGwgPDwKKyAgICAgICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IF90aGlzIDw8ICJpcHJvdF8tPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8CisgICAgICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCBfdGhpcyA8PCAiaXByb3RfLT5nZXRUcmFuc3BvcnQoKS0+cmVhZEVuZCgpOyIgPDwgZW5kbDsKKyAgICAgICAgaWYgKHN0eWxlID09ICJDb2IiICYmICFnZW5fbm9fY2xpZW50X2NvbXBsZXRpb25fKSB7CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIGNvbXBsZXRlZCA9IHRydWU7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIGNvbXBsZXRlZF9fKGZhbHNlKTsiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8CisgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKKyAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKGZuYW1lLmNvbXBhcmUoXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIpICE9IDApIHsiIDw8IGVuZGwgPDwKKyAgICAgICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IF90aGlzIDw8ICJpcHJvdF8tPnNraXAoIiA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RSVUNUKTsiIDw8IGVuZGwgPDwKKyAgICAgICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IF90aGlzIDw8ICJpcHJvdF8tPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8CisgICAgICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCBfdGhpcyA8PCAiaXByb3RfLT5nZXRUcmFuc3BvcnQoKS0+cmVhZEVuZCgpOyIgPDwgZW5kbDsKKyAgICAgICAgaWYgKHN0eWxlID09ICJDb2IiICYmICFnZW5fbm9fY2xpZW50X2NvbXBsZXRpb25fKSB7CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIGNvbXBsZXRlZCA9IHRydWU7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIGNvbXBsZXRlZF9fKGZhbHNlKTsiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IikgeworICAgICAgICAgIG91dCA8PCBlbmRsIDw8CisgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICAvLyBpbiBhIGJhZCBzdGF0ZSwgZG9uJ3QgY29tbWl0IiA8PCBlbmRsIDw8CisgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICB1c2luZyA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRXhjZXB0aW9uOyIgPDwgZW5kbCA8PAorICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkKKyAgICAgICAgICAgICYmICFpc19jb21wbGV4X3R5cGUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSkgeworICAgICAgICAgIHRfZmllbGQgcmV0dXJuZmllbGQoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLCAiX3JldHVybiIpOworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBkZWNsYXJlX2ZpZWxkKCZyZXR1cm5maWVsZCkgPDwgZW5kbDsKKyAgICAgICAgfQorCisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCByZXN1bHRuYW1lIDw8ICIgcmVzdWx0OyIgPDwgZW5kbDsKKworICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXN1bHQuc3VjY2VzcyA9ICZfcmV0dXJuOyIgPDwgZW5kbDsKKyAgICAgICAgfQorCisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LnJlYWQoIiA8PCBfdGhpcyA8PCAiaXByb3RfKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgX3RoaXMKKyAgICAgICAgICAgIDw8ICJpcHJvdF8tPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IF90aGlzCisgICAgICAgICAgICA8PCAiaXByb3RfLT5nZXRUcmFuc3BvcnQoKS0+cmVhZEVuZCgpOyIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgICAgIC8vIENhcmVmdWwsIG9ubHkgbG9vayBmb3IgX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCisgICAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgICBpZiAoaXNfY29tcGxleF90eXBlKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSkpIHsKKyAgICAgICAgICAgIG91dCA8PAorICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC5fX2lzc2V0LnN1Y2Nlc3MpIHsiIDw8IGVuZGw7CisgICAgICAgICAgICBvdXQgPDwKKyAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgLy8gX3JldHVybiBwb2ludGVyIGhhcyBub3cgYmVlbiBmaWxsZWQiIDw8IGVuZGw7CisgICAgICAgICAgICBpZiAoc3R5bGUgPT0gIkNvYiIgJiYgIWdlbl9ub19jbGllbnRfY29tcGxldGlvbl8pIHsKKyAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIGNvbXBsZXRlZCA9IHRydWU7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIGNvbXBsZXRlZF9fKHRydWUpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3R5bGUgPT0gIkNvbmN1cnJlbnQiKSB7CisgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBzZW50cnkuY29tbWl0KCk7IiA8PCBlbmRsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0IDw8CisgICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybjsiIDw8IGVuZGwgPDwKKyAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC5fX2lzc2V0LnN1Y2Nlc3MpIHsiIDw8IGVuZGw7CisgICAgICAgICAgICBpZiAoc3R5bGUgPT0gIkNvYiIgJiYgIWdlbl9ub19jbGllbnRfY29tcGxldGlvbl8pIHsKKyAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIGNvbXBsZXRlZCA9IHRydWU7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIGNvbXBsZXRlZF9fKHRydWUpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3R5bGUgPT0gIkNvbmN1cnJlbnQiKSB7CisgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBzZW50cnkuY29tbWl0KCk7IiA8PCBlbmRsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBfcmV0dXJuOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC5fX2lzc2V0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICAgICAgaWYgKHN0eWxlID09ICJDb2IiICYmICFnZW5fbm9fY2xpZW50X2NvbXBsZXRpb25fKSB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgY29tcGxldGVkID0gdHJ1ZTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgY29tcGxldGVkX18odHJ1ZSk7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChzdHlsZSA9PSAiQ29uY3VycmVudCIpIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBzZW50cnkuY29tbWl0KCk7IiA8PCBlbmRsOworICAgICAgICAgIH0KKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgdGhyb3cgcmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICB9CisKKyAgICAgICAgLy8gV2Ugb25seSBnZXQgaGVyZSBpZiB3ZSBhcmUgYSB2b2lkIGZ1bmN0aW9uCisgICAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICAgIGlmIChzdHlsZSA9PSAiQ29iIiAmJiAhZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXykgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJjb21wbGV0ZWQgPSB0cnVlOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiY29tcGxldGVkX18odHJ1ZSk7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChzdHlsZSA9PSAiQ29uY3VycmVudCIpIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAic2VudHJ5LmNvbW1pdCgpOyIgPDwgZW5kbDsKKyAgICAgICAgICB9CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKHN0eWxlID09ICJDb2IiICYmICFnZW5fbm9fY2xpZW50X2NvbXBsZXRpb25fKSB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImNvbXBsZXRlZCA9IHRydWU7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJjb21wbGV0ZWRfXyh0cnVlKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IikgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIvLyBpbiBhIGJhZCBzdGF0ZSwgZG9uJ3QgY29tbWl0IiA8PCBlbmRsOworICAgICAgICAgIH0KKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRocm93ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjo6YXBhY2hlOjp0aHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbig6OmFwYWNoZTo6dGhyaWZ0OjoiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUQXBwbGljYXRpb25FeGNlcHRpb246Ok1JU1NJTkdfUkVTVUxULCBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKTsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0eWxlID09ICJDb25jdXJyZW50IikgeworICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICBvdXQgPDwKKyAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGwgPDwKKyAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIC8vIHNlcWlkICE9IHJzZXFpZCIgPDwgZW5kbCA8PAorICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgdGhpcy0+c3luY18udXBkYXRlUGVuZGluZyhmbmFtZSwgbXR5cGUsIHJzZXFpZCk7IiA8PCBlbmRsIDw8CisgICAgICAgICAgICBlbmRsIDw8CisgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICAvLyB0aGlzIHdpbGwgdGVtcG9yYXJpbHkgdW5sb2NrIHRoZSByZWFkTXV0ZXgsIGFuZCBsZXQgb3RoZXIgY2xpZW50cyBnZXQgd29yayBkb25lIiA8PCBlbmRsIDw8CisgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICB0aGlzLT5zeW5jXy53YWl0Rm9yV29yayhzZXFpZCk7IiA8PCBlbmRsIDw8CisgICAgICAgICAgICBpbmRlbnQoKSA8PCAifSAvLyBlbmQgd2hpbGUodHJ1ZSkiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0eWxlID09ICJDb2IiICYmICFnZW5fbm9fY2xpZW50X2NvbXBsZXRpb25fKSB7CisgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gY2F0Y2ggKC4uLikgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBpZiAoIWNvbXBsZXRlZCkgeyIgPDwgZW5kbAorICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAgIGNvbXBsZXRlZF9fKGZhbHNlKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbAorICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICB0aHJvdzsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgICAgICAgc2NvcGVfZG93bihvdXQpOworICAgICAgICBvdXQgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworY2xhc3MgUHJvY2Vzc29yR2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgUHJvY2Vzc29yR2VuZXJhdG9yKHRfY3BwX2dlbmVyYXRvciogZ2VuZXJhdG9yLCB0X3NlcnZpY2UqIHNlcnZpY2UsIGNvbnN0IHN0cmluZyYgc3R5bGUpOworCisgIHZvaWQgcnVuKCkgeworICAgIGdlbmVyYXRlX2NsYXNzX2RlZmluaXRpb24oKTsKKworICAgIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaENhbGwoKSBmdW5jdGlvbgorICAgIGdlbmVyYXRlX2Rpc3BhdGNoX2NhbGwoZmFsc2UpOworICAgIGlmIChnZW5lcmF0b3JfLT5nZW5fdGVtcGxhdGVzXykgeworICAgICAgZ2VuZXJhdGVfZGlzcGF0Y2hfY2FsbCh0cnVlKTsKKyAgICB9CisKKyAgICAvLyBHZW5lcmF0ZSBhbGwgb2YgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCisgICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbnMoKTsKKworICAgIGdlbmVyYXRlX2ZhY3RvcnkoKTsKKyAgfQorCisgIHZvaWQgZ2VuZXJhdGVfY2xhc3NfZGVmaW5pdGlvbigpOworICB2b2lkIGdlbmVyYXRlX2Rpc3BhdGNoX2NhbGwoYm9vbCB0ZW1wbGF0ZV9wcm90b2NvbCk7CisgIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbnMoKTsKKyAgdm9pZCBnZW5lcmF0ZV9mYWN0b3J5KCk7CisKK3Byb3RlY3RlZDoKKyAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgaW5fdHlwZWRlZiA9IGZhbHNlLCBib29sIGFyZyA9IGZhbHNlKSB7CisgICAgcmV0dXJuIGdlbmVyYXRvcl8tPnR5cGVfbmFtZSh0dHlwZSwgaW5fdHlwZWRlZiwgYXJnKTsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIGluZGVudCgpIHsgcmV0dXJuIGdlbmVyYXRvcl8tPmluZGVudCgpOyB9CisgIHN0ZDo6b3N0cmVhbSYgaW5kZW50KHN0ZDo6b3N0cmVhbSYgb3MpIHsgcmV0dXJuIGdlbmVyYXRvcl8tPmluZGVudChvcyk7IH0KKworICB2b2lkIGluZGVudF91cCgpIHsgZ2VuZXJhdG9yXy0+aW5kZW50X3VwKCk7IH0KKyAgdm9pZCBpbmRlbnRfZG93bigpIHsgZ2VuZXJhdG9yXy0+aW5kZW50X2Rvd24oKTsgfQorCisgIHRfY3BwX2dlbmVyYXRvciogZ2VuZXJhdG9yXzsKKyAgdF9zZXJ2aWNlKiBzZXJ2aWNlXzsKKyAgc3RkOjpvc3RyZWFtJiBmX2hlYWRlcl87CisgIHN0ZDo6b3N0cmVhbSYgZl9vdXRfOworICBzdHJpbmcgc2VydmljZV9uYW1lXzsKKyAgc3RyaW5nIHN0eWxlXzsKKyAgc3RyaW5nIHBzdHlsZV87CisgIHN0cmluZyBjbGFzc19uYW1lXzsKKyAgc3RyaW5nIGlmX25hbWVfOworICBzdHJpbmcgZmFjdG9yeV9jbGFzc19uYW1lXzsKKyAgc3RyaW5nIGZpbmlzaF9jb2JfOworICBzdHJpbmcgZmluaXNoX2NvYl9kZWNsXzsKKyAgc3RyaW5nIHJldF90eXBlXzsKKyAgc3RyaW5nIGNhbGxfY29udGV4dF87CisgIHN0cmluZyBjb2JfYXJnXzsKKyAgc3RyaW5nIGNhbGxfY29udGV4dF9hcmdfOworICBzdHJpbmcgY2FsbF9jb250ZXh0X2RlY2xfOworICBzdHJpbmcgdGVtcGxhdGVfaGVhZGVyXzsKKyAgc3RyaW5nIHRlbXBsYXRlX3N1ZmZpeF87CisgIHN0cmluZyB0eXBlbmFtZV9zdHJfOworICBzdHJpbmcgY2xhc3Nfc3VmZml4XzsKKyAgc3RyaW5nIGV4dGVuZHNfOworfTsKKworUHJvY2Vzc29yR2VuZXJhdG9yOjpQcm9jZXNzb3JHZW5lcmF0b3IodF9jcHBfZ2VuZXJhdG9yKiBnZW5lcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UqIHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHN0eWxlKQorICA6IGdlbmVyYXRvcl8oZ2VuZXJhdG9yKSwKKyAgICBzZXJ2aWNlXyhzZXJ2aWNlKSwKKyAgICBmX2hlYWRlcl8oZ2VuZXJhdG9yLT5mX2hlYWRlcl8pLAorICAgIGZfb3V0XyhnZW5lcmF0b3ItPmdlbl90ZW1wbGF0ZXNfID8gZ2VuZXJhdG9yLT5mX3NlcnZpY2VfdGNjXyA6IGdlbmVyYXRvci0+Zl9zZXJ2aWNlXyksCisgICAgc2VydmljZV9uYW1lXyhnZW5lcmF0b3ItPnNlcnZpY2VfbmFtZV8pLAorICAgIHN0eWxlXyhzdHlsZSkgeworICBpZiAoc3R5bGVfID09ICJDb2IiKSB7CisgICAgcHN0eWxlXyA9ICJBc3luYyI7CisgICAgY2xhc3NfbmFtZV8gPSBzZXJ2aWNlX25hbWVfICsgcHN0eWxlXyArICJQcm9jZXNzb3IiOworICAgIGlmX25hbWVfID0gc2VydmljZV9uYW1lXyArICJDb2JTdklmIjsKKworICAgIGZpbmlzaF9jb2JfID0gIjo6c3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiBjb2IsICI7CisgICAgZmluaXNoX2NvYl9kZWNsXyA9ICI6OnN0ZDo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4sICI7CisgICAgY29iX2FyZ18gPSAiY29iLCAiOworICAgIHJldF90eXBlXyA9ICJ2b2lkICI7CisgIH0gZWxzZSB7CisgICAgY2xhc3NfbmFtZV8gPSBzZXJ2aWNlX25hbWVfICsgIlByb2Nlc3NvciI7CisgICAgaWZfbmFtZV8gPSBzZXJ2aWNlX25hbWVfICsgIklmIjsKKworICAgIHJldF90eXBlXyA9ICJib29sICI7CisgICAgLy8gVE9ETyhlZGhhbGwpIGNhbGxDb250ZXh0IHNob3VsZCBldmVudHVhbGx5IGJlIGFkZGVkIHRvIFRBc3luY1Byb2Nlc3NvcgorICAgIGNhbGxfY29udGV4dF8gPSAiLCB2b2lkKiBjYWxsQ29udGV4dCI7CisgICAgY2FsbF9jb250ZXh0X2FyZ18gPSAiLCBjYWxsQ29udGV4dCI7CisgICAgY2FsbF9jb250ZXh0X2RlY2xfID0gIiwgdm9pZCoiOworICB9CisKKyAgZmFjdG9yeV9jbGFzc19uYW1lXyA9IGNsYXNzX25hbWVfICsgIkZhY3RvcnkiOworCisgIGlmIChnZW5lcmF0b3ItPmdlbl90ZW1wbGF0ZXNfKSB7CisgICAgdGVtcGxhdGVfaGVhZGVyXyA9ICJ0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPlxuIjsKKyAgICB0ZW1wbGF0ZV9zdWZmaXhfID0gIjxQcm90b2NvbF8+IjsKKyAgICB0eXBlbmFtZV9zdHJfID0gInR5cGVuYW1lICI7CisgICAgY2xhc3NfbmFtZV8gKz0gIlQiOworICAgIGZhY3RvcnlfY2xhc3NfbmFtZV8gKz0gIlQiOworICB9CisKKyAgaWYgKHNlcnZpY2VfLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzXyA9IHR5cGVfbmFtZShzZXJ2aWNlXy0+Z2V0X2V4dGVuZHMoKSkgKyBwc3R5bGVfICsgIlByb2Nlc3NvciI7CisgICAgaWYgKGdlbmVyYXRvcl8tPmdlbl90ZW1wbGF0ZXNfKSB7CisgICAgICAvLyBUT0RPKHNpbXBraW5zKTogSWYgZ2VuX3RlbXBsYXRlc18gaXMgZW5hYmxlZCwgd2UgY3VycmVudGx5IGFzc3VtZSBhbGwKKyAgICAgIC8vIHBhcmVudCBzZXJ2aWNlcyB3ZXJlIGFsc28gZ2VuZXJhdGVkIHdpdGggdGVtcGxhdGVzIGVuYWJsZWQuCisgICAgICBleHRlbmRzXyArPSAiVDxQcm90b2NvbF8+IjsKKyAgICB9CisgIH0KK30KKwordm9pZCBQcm9jZXNzb3JHZW5lcmF0b3I6OmdlbmVyYXRlX2NsYXNzX2RlZmluaXRpb24oKSB7CisgIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gc2VydmljZV8tPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIHN0cmluZyBwYXJlbnRfY2xhc3M7CisgIGlmIChzZXJ2aWNlXy0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgcGFyZW50X2NsYXNzID0gZXh0ZW5kc187CisgIH0gZWxzZSB7CisgICAgaWYgKHN0eWxlXyA9PSAiQ29iIikgeworICAgICAgcGFyZW50X2NsYXNzID0gIjo6YXBhY2hlOjp0aHJpZnQ6OmFzeW5jOjpUQXN5bmNEaXNwYXRjaFByb2Nlc3NvciI7CisgICAgfSBlbHNlIHsKKyAgICAgIHBhcmVudF9jbGFzcyA9ICI6OmFwYWNoZTo6dGhyaWZ0OjpURGlzcGF0Y2hQcm9jZXNzb3IiOworICAgIH0KKworICAgIGlmIChnZW5lcmF0b3JfLT5nZW5fdGVtcGxhdGVzXykgeworICAgICAgcGFyZW50X2NsYXNzICs9ICJUPFByb3RvY29sXz4iOworICAgIH0KKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgorICBmX2hlYWRlcl8gPDwgdGVtcGxhdGVfaGVhZGVyXyA8PCAiY2xhc3MgIiA8PCBjbGFzc19uYW1lXyA8PCAiIDogcHVibGljICIgPDwgcGFyZW50X2NsYXNzIDw8ICIgeyIKKyAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgLy8gUHJvdGVjdGVkIGRhdGEgbWVtYmVycworICBmX2hlYWRlcl8gPDwgIiBwcm90ZWN0ZWQ6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICI6OnN0ZDo6c2hhcmVkX3B0cjwiIDw8IGlmX25hbWVfIDw8ICI+IGlmYWNlXzsiIDw8IGVuZGw7CisgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAidmlydHVhbCAiIDw8IHJldF90eXBlXyA8PCAiZGlzcGF0Y2hDYWxsKCIgPDwgZmluaXNoX2NvYl8KKyAgICAgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBpcHJvdCwgIgorICAgICAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIG9wcm90LCAiCisgICAgICAgICAgICA8PCAiY29uc3Qgc3RkOjpzdHJpbmcmIGZuYW1lLCBpbnQzMl90IHNlcWlkIiA8PCBjYWxsX2NvbnRleHRfIDw8ICIpOyIgPDwgZW5kbDsKKyAgaWYgKGdlbmVyYXRvcl8tPmdlbl90ZW1wbGF0ZXNfKSB7CisgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ2aXJ0dWFsICIgPDwgcmV0X3R5cGVfIDw8ICJkaXNwYXRjaENhbGxUZW1wbGF0ZWQoIiA8PCBmaW5pc2hfY29iXworICAgICAgICAgICAgICA8PCAiUHJvdG9jb2xfKiBpcHJvdCwgUHJvdG9jb2xfKiBvcHJvdCwgIgorICAgICAgICAgICAgICA8PCAiY29uc3Qgc3RkOjpzdHJpbmcmIGZuYW1lLCBpbnQzMl90IHNlcWlkIiA8PCBjYWxsX2NvbnRleHRfIDw8ICIpOyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworCisgIC8vIFByb2Nlc3MgZnVuY3Rpb24gZGVjbGFyYXRpb25zCisgIGZfaGVhZGVyXyA8PCAiIHByaXZhdGU6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICAvLyBEZWNsYXJlIHByb2Nlc3NNYXBfCisgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAidHlwZWRlZiAgdm9pZCAoIiA8PCBjbGFzc19uYW1lXyA8PCAiOjoqIgorICAgICAgICAgICAgPDwgIlByb2Nlc3NGdW5jdGlvbikoIiA8PCBmaW5pc2hfY29iX2RlY2xfIDw8ICJpbnQzMl90LCAiCisgICAgICAgICAgICA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCosICIKKyAgICAgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiIgPDwgY2FsbF9jb250ZXh0X2RlY2xfIDw8ICIpOyIgPDwgZW5kbDsKKyAgaWYgKGdlbmVyYXRvcl8tPmdlbl90ZW1wbGF0ZXNfKSB7CisgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ0eXBlZGVmIHZvaWQgKCIgPDwgY2xhc3NfbmFtZV8gPDwgIjo6KiIKKyAgICAgICAgICAgICAgPDwgIlNwZWNpYWxpemVkUHJvY2Vzc0Z1bmN0aW9uKSgiIDw8IGZpbmlzaF9jb2JfZGVjbF8gPDwgImludDMyX3QsICIKKyAgICAgICAgICAgICAgPDwgIlByb3RvY29sXyosIFByb3RvY29sXyoiIDw8IGNhbGxfY29udGV4dF9kZWNsXyA8PCAiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgPDwgInN0cnVjdCBQcm9jZXNzRnVuY3Rpb25zIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgUHJvY2Vzc0Z1bmN0aW9uIGdlbmVyaWM7IgorICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIFNwZWNpYWxpemVkUHJvY2Vzc0Z1bmN0aW9uIHNwZWNpYWxpemVkOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICA8PCAiICBQcm9jZXNzRnVuY3Rpb25zKFByb2Nlc3NGdW5jdGlvbiBnLCAiCisgICAgICAgICAgICAgIDw8ICJTcGVjaWFsaXplZFByb2Nlc3NGdW5jdGlvbiBzKSA6IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgICAgZ2VuZXJpYyhnKSwiIDw8IGVuZGwKKyAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgICBzcGVjaWFsaXplZChzKSB7fSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICA8PCAiICBQcm9jZXNzRnVuY3Rpb25zKCkgOiBnZW5lcmljKE5VTEwpLCBzcGVjaWFsaXplZChOVUxMKSAiCisgICAgICAgICAgICAgIDw8ICJ7fSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgPDwgInR5cGVkZWYgc3RkOjptYXA8c3RkOjpzdHJpbmcsIFByb2Nlc3NGdW5jdGlvbnM+ICIKKyAgICAgICAgICAgICAgPDwgIlByb2Nlc3NNYXA7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAidHlwZWRlZiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgUHJvY2Vzc0Z1bmN0aW9uPiAiCisgICAgICAgICAgICAgIDw8ICJQcm9jZXNzTWFwOyIgPDwgZW5kbDsKKyAgfQorICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIlByb2Nlc3NNYXAgcHJvY2Vzc01hcF87IiA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaW5kZW50KGZfaGVhZGVyXykgPDwgInZvaWQgcHJvY2Vzc18iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgZmluaXNoX2NvYl8KKyAgICAgICAgICAgICAgICAgICAgICA8PCAiaW50MzJfdCBzZXFpZCwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogaXByb3QsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogb3Byb3QiIDw8IGNhbGxfY29udGV4dF8gPDwgIik7IgorICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaWYgKGdlbmVyYXRvcl8tPmdlbl90ZW1wbGF0ZXNfKSB7CisgICAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCAidm9pZCBwcm9jZXNzXyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCBmaW5pc2hfY29iXworICAgICAgICAgICAgICAgICAgICAgICAgPDwgImludDMyX3Qgc2VxaWQsIFByb3RvY29sXyogaXByb3QsIFByb3RvY29sXyogb3Byb3QiIDw8IGNhbGxfY29udGV4dF8KKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKHN0eWxlXyA9PSAiQ29iIikgeworICAgICAgLy8gWFhYIEZhY3RvciB0aGlzIG91dCwgZXZlbiBpZiBpdCBpcyBhIHBhaW4uCisgICAgICBzdHJpbmcgcmV0X2FyZyA9ICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICIsIGNvbnN0ICIgKyB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSArICImIF9yZXR1cm4iKTsKKyAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAidm9pZCByZXR1cm5fIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICA8PCAiKDo6c3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiBjb2IsIGludDMyX3Qgc2VxaWQsICIKKyAgICAgICAgICAgICAgICA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogb3Byb3QsICIKKyAgICAgICAgICAgICAgICA8PCAidm9pZCogY3R4IiA8PCByZXRfYXJnIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIGlmIChnZW5lcmF0b3JfLT5nZW5fdGVtcGxhdGVzXykgeworICAgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInZvaWQgcmV0dXJuXyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICA8PCAiKDo6c3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiBjb2IsIGludDMyX3Qgc2VxaWQsICIKKyAgICAgICAgICAgICAgICAgIDw8ICJQcm90b2NvbF8qIG9wcm90LCB2b2lkKiBjdHgiIDw8IHJldF9hcmcgPDwgIik7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgLy8gWFhYIERvbid0IGRlY2xhcmUgdGhyb3cgaWYgaXQgZG9lc24ndCBleGlzdAorICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ2b2lkIHRocm93XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgPDwgIig6OnN0ZDo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gY29iLCBpbnQzMl90IHNlcWlkLCAiCisgICAgICAgICAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIG9wcm90LCB2b2lkKiBjdHgsICIKKyAgICAgICAgICAgICAgICA8PCAiOjphcGFjaGU6OnRocmlmdDo6VERlbGF5ZWRFeGNlcHRpb24qIF90aHJvdyk7IiA8PCBlbmRsOworICAgICAgaWYgKGdlbmVyYXRvcl8tPmdlbl90ZW1wbGF0ZXNfKSB7CisgICAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAidm9pZCB0aHJvd18iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgPDwgIig6OnN0ZDo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gY29iLCBpbnQzMl90IHNlcWlkLCAiCisgICAgICAgICAgICAgICAgICA8PCAiUHJvdG9jb2xfKiBvcHJvdCwgdm9pZCogY3R4LCAiCisgICAgICAgICAgICAgICAgICA8PCAiOjphcGFjaGU6OnRocmlmdDo6VERlbGF5ZWRFeGNlcHRpb24qIF90aHJvdyk7IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGZfaGVhZGVyXyA8PCAiIHB1YmxpYzoiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgY2xhc3NfbmFtZV8gPDwgIig6OnN0ZDo6c2hhcmVkX3B0cjwiIDw8IGlmX25hbWVfCisgICAgICAgICAgICA8PCAiPiBpZmFjZSkgOiIgPDwgZW5kbDsKKyAgaWYgKCFleHRlbmRzXy5lbXB0eSgpKSB7CisgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICIgICIgPDwgZXh0ZW5kc18gPDwgIihpZmFjZSksIiA8PCBlbmRsOworICB9CisgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiICBpZmFjZV8oaWZhY2UpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJwcm9jZXNzTWFwX1tcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl0gPSAiOworICAgIGlmIChnZW5lcmF0b3JfLT5nZW5fdGVtcGxhdGVzXykgeworICAgICAgZl9oZWFkZXJfIDw8ICJQcm9jZXNzRnVuY3Rpb25zKCIgPDwgZW5kbDsKKyAgICAgIGlmIChnZW5lcmF0b3JfLT5nZW5fdGVtcGxhdGVzX29ubHlfKSB7CisgICAgICAgIGluZGVudChmX2hlYWRlcl8pIDw8ICIgIE5VTEwsIiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50KGZfaGVhZGVyXykgPDwgIiAgJiIgPDwgY2xhc3NfbmFtZV8gPDwgIjo6cHJvY2Vzc18iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiLCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudChmX2hlYWRlcl8pIDw8ICIgICYiIDw8IGNsYXNzX25hbWVfIDw8ICI6OnByb2Nlc3NfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIikiOworICAgIH0gZWxzZSB7CisgICAgICBmX2hlYWRlcl8gPDwgIiYiIDw8IGNsYXNzX25hbWVfIDw8ICI6OnByb2Nlc3NfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgfQorICAgIGZfaGVhZGVyXyA8PCAiOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ2aXJ0dWFsIH4iIDw8IGNsYXNzX25hbWVfIDw8ICIoKSB7fSIKKyAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfaGVhZGVyXyA8PCAifTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc18pIHsKKyAgICAvLyBHZW5lcmF0ZSBhIGJhY2t3YXJkcyBjb21wYXRpYmxlIHR5cGVkZWYsIGZvciBjYWxsZXJzIHdobyBkb24ndCBrbm93CisgICAgLy8gYWJvdXQgdGhlIG5ldyB0ZW1wbGF0ZS1zdHlsZSBjb2RlLgorICAgIC8vCisgICAgLy8gV2UgY2FuJ3QgdXNlIFRQcm90b2NvbCBhcyB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyLCBzaW5jZSBQcm9jZXNzb3JUCisgICAgLy8gcHJvdmlkZXMgb3ZlcmxvYWRlZCB2ZXJzaW9ucyBvZiBtb3N0IG1ldGhvZHMsIG9uZSBvZiB3aGljaCBhY2NlcHRzCisgICAgLy8gVFByb3RvY29sIHBvaW50ZXJzLCBhbmQgb25lIHdoaWNoIGFjY2VwdHMgUHJvdG9jb2xfIHBvaW50ZXJzLiAgVGhpcworICAgIC8vIHJlc3VsdHMgaW4gYSBjb21waWxlIGVycm9yIGlmIGluc3RhbnRpYXRlZCB3aXRoIFByb3RvY29sXyA9PSBUUHJvdG9jb2wuCisgICAgLy8gVGhlcmVmb3JlLCB3ZSBkZWZpbmUgVER1bW15UHJvdG9jb2wgc29sZWx5IHNvIHdlIGNhbiB1c2UgaXQgYXMgdGhlCisgICAgLy8gdGVtcGxhdGUgcGFyYW1ldGVyIGhlcmUuCisgICAgZl9oZWFkZXJfIDw8ICJ0eXBlZGVmICIgPDwgY2xhc3NfbmFtZV8gPDwgIjwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlREdW1teVByb3RvY29sID4gIgorICAgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfIDw8IHBzdHlsZV8gPDwgIlByb2Nlc3NvcjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorfQorCit2b2lkIFByb2Nlc3NvckdlbmVyYXRvcjo6Z2VuZXJhdGVfZGlzcGF0Y2hfY2FsbChib29sIHRlbXBsYXRlX3Byb3RvY29sKSB7CisgIHN0cmluZyBwcm90b2NvbCA9ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sIjsKKyAgc3RyaW5nIGZ1bmN0aW9uX3N1ZmZpeDsKKyAgaWYgKHRlbXBsYXRlX3Byb3RvY29sKSB7CisgICAgcHJvdG9jb2wgPSAiUHJvdG9jb2xfIjsKKyAgICAvLyBXZSBjYWxsIHRoZSBnZW5lcmljIHZlcnNpb24gZGlzcGF0Y2hDYWxsKCksIGFuZCB0aGUgc3BlY2lhbGl6ZWQKKyAgICAvLyB2ZXJzaW9uIGRpc3BhdGNoQ2FsbFRlbXBsYXRlZCgpLiAgV2UgY2FuJ3QgY2FsbCB0aGVtIGJvdGgKKyAgICAvLyBkaXNwYXRjaENhbGwoKSwgc2luY2UgdGhpcyB3aWxsIGNhdXNlIHRoZSBjb21waWxlciB0byBpc3N1ZSBhIHdhcm5pbmcgaWYKKyAgICAvLyBhIHNlcnZpY2UgdGhhdCBkb2Vzbid0IHVzZSB0ZW1wbGF0ZXMgaW5oZXJpdHMgZnJvbSBhIHNlcnZpY2UgdGhhdCBkb2VzCisgICAgLy8gdXNlIHRlbXBsYXRlczogdGhlIGNvbXBpbGVyIGNvbXBsYWlucyB0aGF0IHRoZSBzdWJjbGFzcyBvbmx5IGltcGxlbWVudHMKKyAgICAvLyB0aGUgZ2VuZXJpYyB2ZXJzaW9uIG9mIGRpc3BhdGNoQ2FsbCgpLCBhbmQgaGlkZXMgdGhlIHRlbXBsYXRlZCB2ZXJzaW9uLgorICAgIC8vIFVzaW5nIGRpZmZlcmVudCBuYW1lcyBmb3IgdGhlIHR3byBmdW5jdGlvbnMgcHJldmVudHMgdGhpcy4KKyAgICBmdW5jdGlvbl9zdWZmaXggPSAiVGVtcGxhdGVkIjsKKyAgfQorCisgIGZfb3V0XyA8PCB0ZW1wbGF0ZV9oZWFkZXJfIDw8IHJldF90eXBlXyA8PCBjbGFzc19uYW1lXyA8PCB0ZW1wbGF0ZV9zdWZmaXhfIDw8ICI6OmRpc3BhdGNoQ2FsbCIKKyAgICAgICAgIDw8IGZ1bmN0aW9uX3N1ZmZpeCA8PCAiKCIgPDwgZmluaXNoX2NvYl8gPDwgcHJvdG9jb2wgPDwgIiogaXByb3QsICIgPDwgcHJvdG9jb2wKKyAgICAgICAgIDw8ICIqIG9wcm90LCAiCisgICAgICAgICA8PCAiY29uc3Qgc3RkOjpzdHJpbmcmIGZuYW1lLCBpbnQzMl90IHNlcWlkIiA8PCBjYWxsX2NvbnRleHRfIDw8ICIpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIC8vIEhPVDogbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXIgbWFwCisgIGZfb3V0XyA8PCBpbmRlbnQoKSA8PCB0eXBlbmFtZV9zdHJfIDw8ICJQcm9jZXNzTWFwOjppdGVyYXRvciBwZm47IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICA8PCAicGZuID0gcHJvY2Vzc01hcF8uZmluZChmbmFtZSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICA8PCAiaWYgKHBmbiA9PSBwcm9jZXNzTWFwXy5lbmQoKSkgeyIgPDwgZW5kbDsKKyAgaWYgKGV4dGVuZHNfLmVtcHR5KCkpIHsKKyAgICBmX291dF8gPDwgaW5kZW50KCkgPDwgIiAgaXByb3QtPnNraXAoOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RSVUNUKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgPDwgIiAgaXByb3QtPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgIDw8ICIgIGlwcm90LT5nZXRUcmFuc3BvcnQoKS0+cmVhZEVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICA8PCAiICA6OmFwYWNoZTo6dGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb24gIgorICAgICAgICAgICAgICAieCg6OmFwYWNoZTo6dGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb246OlVOS05PV05fTUVUSE9ELCBcIkludmFsaWQgbWV0aG9kIG5hbWU6ICIKKyAgICAgICAgICAgICAgIidcIitmbmFtZStcIidcIik7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgIDw8ICIgIG9wcm90LT53cml0ZU1lc3NhZ2VCZWdpbihmbmFtZSwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfRVhDRVBUSU9OLCBzZXFpZCk7IgorICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHgud3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICA8PCAiICBvcHJvdC0+d3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgIDw8ICIgIG9wcm90LT5nZXRUcmFuc3BvcnQoKS0+d3JpdGVFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgPDwgIiAgb3Byb3QtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICA8PCAoc3R5bGVfID09ICJDb2IiID8gIiAgcmV0dXJuIGNvYih0cnVlKTsiIDogIiAgcmV0dXJuIHRydWU7IikgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX291dF8gPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXh0ZW5kc18gPDwgIjo6ZGlzcGF0Y2hDYWxsKCIKKyAgICAgICAgICAgPDwgKHN0eWxlXyA9PSAiQ29iIiA/ICJjb2IsICIgOiAiIikgPDwgImlwcm90LCBvcHJvdCwgZm5hbWUsIHNlcWlkIiA8PCBjYWxsX2NvbnRleHRfYXJnXworICAgICAgICAgICA8PCAiKTsiIDw8IGVuZGw7CisgIH0KKyAgZl9vdXRfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBpZiAodGVtcGxhdGVfcHJvdG9jb2wpIHsKKyAgICBmX291dF8gPDwgaW5kZW50KCkgPDwgIih0aGlzLT4qKHBmbi0+c2Vjb25kLnNwZWNpYWxpemVkKSkiOworICB9IGVsc2UgeworICAgIGlmIChnZW5lcmF0b3JfLT5nZW5fdGVtcGxhdGVzX29ubHlfKSB7CisgICAgICAvLyBUT0RPOiBUaGlzIGlzIGEgbnVsbCBwb2ludGVyLCBzbyBub3RoaW5nIGdvb2Qgd2lsbCBjb21lIGZyb20gY2FsbGluZworICAgICAgLy8gaXQuICBUaHJvdyBhbiBleGNlcHRpb24gaW5zdGVhZC4KKyAgICAgIGZfb3V0XyA8PCBpbmRlbnQoKSA8PCAiKHRoaXMtPioocGZuLT5zZWNvbmQuZ2VuZXJpYykpIjsKKyAgICB9IGVsc2UgaWYgKGdlbmVyYXRvcl8tPmdlbl90ZW1wbGF0ZXNfKSB7CisgICAgICBmX291dF8gPDwgaW5kZW50KCkgPDwgIih0aGlzLT4qKHBmbi0+c2Vjb25kLmdlbmVyaWMpKSI7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfb3V0XyA8PCBpbmRlbnQoKSA8PCAiKHRoaXMtPioocGZuLT5zZWNvbmQpKSI7CisgICAgfQorICB9CisgIGZfb3V0XyA8PCAiKCIgPDwgY29iX2FyZ18gPDwgInNlcWlkLCBpcHJvdCwgb3Byb3QiIDw8IGNhbGxfY29udGV4dF9hcmdfIDw8ICIpOyIgPDwgZW5kbDsKKworICAvLyBUT0RPKGRyZWlzcyk6IHJldHVybiBwZm4gcmV0PworICBpZiAoc3R5bGVfID09ICJDb2IiKSB7CisgICAgZl9vdXRfIDw8IGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfb3V0XyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9vdXRfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgUHJvY2Vzc29yR2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9ucygpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSBzZXJ2aWNlXy0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGdlbmVyYXRvcl8tPmdlbl90ZW1wbGF0ZXNfKSB7CisgICAgICBnZW5lcmF0b3JfLT5nZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHNlcnZpY2VfLCAqZl9pdGVyLCBzdHlsZV8sIGZhbHNlKTsKKyAgICAgIGdlbmVyYXRvcl8tPmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24oc2VydmljZV8sICpmX2l0ZXIsIHN0eWxlXywgdHJ1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGdlbmVyYXRvcl8tPmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24oc2VydmljZV8sICpmX2l0ZXIsIHN0eWxlXywgZmFsc2UpOworICAgIH0KKyAgfQorfQorCit2b2lkIFByb2Nlc3NvckdlbmVyYXRvcjo6Z2VuZXJhdGVfZmFjdG9yeSgpIHsKKyAgc3RyaW5nIGlmX2ZhY3RvcnlfbmFtZSA9IGlmX25hbWVfICsgIkZhY3RvcnkiOworCisgIC8vIEdlbmVyYXRlIHRoZSBmYWN0b3J5IGNsYXNzIGRlZmluaXRpb24KKyAgZl9oZWFkZXJfIDw8IHRlbXBsYXRlX2hlYWRlcl8gPDwgImNsYXNzICIgPDwgZmFjdG9yeV9jbGFzc19uYW1lXyA8PCAiIDogcHVibGljIDo6YXBhY2hlOjp0aHJpZnQ6OiIKKyAgICAgICAgICAgIDw8IChzdHlsZV8gPT0gIkNvYiIgPyAiYXN5bmM6OlRBc3luY1Byb2Nlc3NvckZhY3RvcnkiIDogIlRQcm9jZXNzb3JGYWN0b3J5IikgPDwgIiB7IgorICAgICAgICAgICAgPDwgZW5kbCA8PCAiIHB1YmxpYzoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCBmYWN0b3J5X2NsYXNzX25hbWVfIDw8ICIoY29uc3QgOjpzdGQ6OnNoYXJlZF9wdHI8ICIgPDwgaWZfZmFjdG9yeV9uYW1lCisgICAgICAgICAgICA8PCAiID4mIGhhbmRsZXJGYWN0b3J5KSA6IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICA8PCAiICAgIGhhbmRsZXJGYWN0b3J5XyhoYW5kbGVyRmFjdG9yeSkge30iIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgPDwgIjo6c3RkOjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0OjoiCisgICAgICAgICAgICA8PCAoc3R5bGVfID09ICJDb2IiID8gImFzeW5jOjpUQXN5bmNQcm9jZXNzb3IiIDogIlRQcm9jZXNzb3IiKSA8PCAiID4gIgorICAgICAgICAgICAgPDwgImdldFByb2Nlc3Nvcihjb25zdCA6OmFwYWNoZTo6dGhyaWZ0OjpUQ29ubmVjdGlvbkluZm8mIGNvbm5JbmZvKTsiIDw8IGVuZGw7CisKKyAgZl9oZWFkZXJfIDw8IGVuZGwgPDwgIiBwcm90ZWN0ZWQ6IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICI6OnN0ZDo6c2hhcmVkX3B0cjwgIgorICAgICAgICAgICAgPDwgaWZfZmFjdG9yeV9uYW1lIDw8ICIgPiBoYW5kbGVyRmFjdG9yeV87IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfaGVhZGVyXyA8PCAifTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBJZiB3ZSBhcmUgZ2VuZXJhdGluZyB0ZW1wbGF0ZXMsIG91dHB1dCBhIHR5cGVkZWYgZm9yIHRoZSBwbGFpbgorICAvLyBmYWN0b3J5IG5hbWUuCisgIGlmIChnZW5lcmF0b3JfLT5nZW5fdGVtcGxhdGVzXykgeworICAgIGZfaGVhZGVyXyA8PCAidHlwZWRlZiAiIDw8IGZhY3RvcnlfY2xhc3NfbmFtZV8KKyAgICAgICAgICAgICAgPDwgIjwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlREdW1teVByb3RvY29sID4gIiA8PCBzZXJ2aWNlX25hbWVfIDw8IHBzdHlsZV8KKyAgICAgICAgICAgICAgPDwgIlByb2Nlc3NvckZhY3Rvcnk7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgZ2V0UHJvY2Vzc29yKCkgbWV0aG9kCisgIGZfb3V0XyA8PCB0ZW1wbGF0ZV9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICI6OnN0ZDo6c2hhcmVkX3B0cjwgOjphcGFjaGU6OnRocmlmdDo6IgorICAgICAgICAgPDwgKHN0eWxlXyA9PSAiQ29iIiA/ICJhc3luYzo6VEFzeW5jUHJvY2Vzc29yIiA6ICJUUHJvY2Vzc29yIikgPDwgIiA+ICIKKyAgICAgICAgIDw8IGZhY3RvcnlfY2xhc3NfbmFtZV8gPDwgdGVtcGxhdGVfc3VmZml4XyA8PCAiOjpnZXRQcm9jZXNzb3IoIgorICAgICAgICAgPDwgImNvbnN0IDo6YXBhY2hlOjp0aHJpZnQ6OlRDb25uZWN0aW9uSW5mbyYgY29ubkluZm8pIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfb3V0XyA8PCBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6UmVsZWFzZUhhbmRsZXI8ICIgPDwgaWZfZmFjdG9yeV9uYW1lCisgICAgICAgICA8PCAiID4gY2xlYW51cChoYW5kbGVyRmFjdG9yeV8pOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiOjpzdGQ6OnNoYXJlZF9wdHI8ICIKKyAgICAgICAgIDw8IGlmX25hbWVfIDw8ICIgPiBoYW5kbGVyKCIKKyAgICAgICAgIDw8ICJoYW5kbGVyRmFjdG9yeV8tPmdldEhhbmRsZXIoY29ubkluZm8pLCBjbGVhbnVwKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgIDw8ICI6OnN0ZDo6c2hhcmVkX3B0cjwgOjphcGFjaGU6OnRocmlmdDo6IgorICAgICAgICAgPDwgKHN0eWxlXyA9PSAiQ29iIiA/ICJhc3luYzo6VEFzeW5jUHJvY2Vzc29yIiA6ICJUUHJvY2Vzc29yIikgPDwgIiA+ICIKKyAgICAgICAgIDw8ICJwcm9jZXNzb3IobmV3ICIgPDwgY2xhc3NfbmFtZV8gPDwgdGVtcGxhdGVfc3VmZml4XyA8PCAiKGhhbmRsZXIpKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgIDw8ICJyZXR1cm4gcHJvY2Vzc29yOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX291dF8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHByb2Nlc3NvciBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHByb2Nlc3NvciBmb3IuCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0X3NlcnZpY2UqIHRzZXJ2aWNlLCBzdHJpbmcgc3R5bGUpIHsKKyAgUHJvY2Vzc29yR2VuZXJhdG9yIGdlbmVyYXRvcih0aGlzLCB0c2VydmljZSwgc3R5bGUpOworICBnZW5lcmF0b3IucnVuKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIHN0ZDo6b3N0cmVhbSYgb3V0ID0gKGdlbl90ZW1wbGF0ZXNfID8gZl9zZXJ2aWNlX3RjY18gOiBmX3NlcnZpY2VfKTsKKworICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKKyAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOworICB9CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKKyAgfQorCisgIGdlbmVyYXRlX3N0cnVjdF9kZWNsYXJhdGlvbihmX2hlYWRlcl8sICZyZXN1bHQsIGZhbHNlKTsKKyAgZ2VuZXJhdGVfc3RydWN0X2RlZmluaXRpb24ob3V0LCBmX3NlcnZpY2VfLCAmcmVzdWx0LCBmYWxzZSk7CisgIGdlbmVyYXRlX3N0cnVjdF9yZWFkZXIob3V0LCAmcmVzdWx0KTsKKyAgZ2VuZXJhdGVfc3RydWN0X3Jlc3VsdF93cml0ZXIob3V0LCAmcmVzdWx0KTsKKworICByZXN1bHQuc2V0X25hbWUodHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3ByZXN1bHQiKTsKKyAgZ2VuZXJhdGVfc3RydWN0X2RlY2xhcmF0aW9uKGZfaGVhZGVyXywgJnJlc3VsdCwgZmFsc2UsIHRydWUsIHRydWUsIGdlbl9jb2Jfc3R5bGVfKTsKKyAgZ2VuZXJhdGVfc3RydWN0X2RlZmluaXRpb24ob3V0LCBmX3NlcnZpY2VfLCAmcmVzdWx0LCBmYWxzZSk7CisgIGdlbmVyYXRlX3N0cnVjdF9yZWFkZXIob3V0LCAmcmVzdWx0LCB0cnVlKTsKKyAgaWYgKGdlbl9jb2Jfc3R5bGVfKSB7CisgICAgZ2VuZXJhdGVfc3RydWN0X3dyaXRlcihvdXQsICZyZXN1bHQsIHRydWUpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3BlY2lhbGl6ZWQpIHsKKyAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgIHN0cmluZyBzZXJ2aWNlX2Z1bmNfbmFtZSA9ICJcIiIgKyB0c2VydmljZS0+Z2V0X25hbWUoKSArICIuIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJcIiI7CisKKyAgc3RkOjpvc3RyZWFtJiBvdXQgPSAoZ2VuX3RlbXBsYXRlc18gPyBmX3NlcnZpY2VfdGNjXyA6IGZfc2VydmljZV8pOworCisgIHN0cmluZyBwcm90X3R5cGUgPSAoc3BlY2lhbGl6ZWQgPyAiUHJvdG9jb2xfIiA6ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sIik7CisgIHN0cmluZyBjbGFzc19zdWZmaXg7CisgIGlmIChnZW5fdGVtcGxhdGVzXykgeworICAgIGNsYXNzX3N1ZmZpeCA9ICJUPFByb3RvY29sXz4iOworICB9CisKKyAgLy8gSSB0cmllZCB0byBkbyB0aGlzIGFzIG9uZSBmdW5jdGlvbi4gIEkgcmVhbGx5IGRpZC4gIEJ1dCBpdCB3YXMgdG9vIGhhcmQuCisgIGlmIChzdHlsZSAhPSAiQ29iIikgeworICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4iIDw8IGVuZGw7CisgICAgfQorICAgIGNvbnN0IGJvb2wgdW5uYW1lZF9vcHJvdF9zZXFpZCA9IHRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIShnZW5fdGVtcGxhdGVzXyAmJiAhc3BlY2lhbGl6ZWQpOworICAgIG91dCA8PCAidm9pZCAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJQcm9jZXNzb3IiIDw8IGNsYXNzX3N1ZmZpeCA8PCAiOjoiCisgICAgICAgIDw8ICJwcm9jZXNzXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIgorICAgICAgICA8PCAiaW50MzJfdCIgPDwgKHVubmFtZWRfb3Byb3Rfc2VxaWQgPyAiLCAiIDogIiBzZXFpZCwgIikgPDwgcHJvdF90eXBlIDw8ICIqIGlwcm90LCAiCisgICAgICAgIDw8IHByb3RfdHlwZSA8PCAiKiIgPDwgKHVubmFtZWRfb3Byb3Rfc2VxaWQgPyAiLCAiIDogIiBvcHJvdCwgIikgPDwgInZvaWQqIGNhbGxDb250ZXh0KSIKKyAgICAgICAgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworCisgICAgc3RyaW5nIGFyZ3NuYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiOworICAgIHN0cmluZyByZXN1bHRuYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7CisKKyAgICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdW5uYW1lZF9vcHJvdF9zZXFpZCkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIodm9pZCkgc2VxaWQ7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIodm9pZCkgb3Byb3Q7IiA8PCBlbmRsOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidm9pZCogY3R4ID0gTlVMTDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIiAgY3R4ID0gdGhpcy0+ZXZlbnRIYW5kbGVyXy0+Z2V0Q29udGV4dCgiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIsIGNhbGxDb250ZXh0KTsiCisgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3JDb250ZXh0RnJlZXIgZnJlZXIoIgorICAgICAgICA8PCAidGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSwgY3R4LCAiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIpOyIgPDwgZW5kbCA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICIgIHRoaXMtPmV2ZW50SGFuZGxlcl8tPnByZVJlYWQoY3R4LCAiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAifSIgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpIDw8IGFyZ3NuYW1lIDw8ICIgYXJnczsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgImFyZ3MucmVhZChpcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpcHJvdC0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgInVpbnQzMl90IGJ5dGVzID0gaXByb3QtPmdldFRyYW5zcG9ydCgpLT5yZWFkRW5kKCk7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIiAgdGhpcy0+ZXZlbnRIYW5kbGVyXy0+cG9zdFJlYWQoY3R4LCAiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIsIGJ5dGVzKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIC8vIERlY2xhcmUgcmVzdWx0CisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgcmVzdWx0bmFtZSA8PCAiIHJlc3VsdDsiIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gVHJ5IGJsb2NrIGZvciBmdW5jdGlvbnMgd2l0aCBleGNlcHRpb25zCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0cnkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgb3V0IDw8IGluZGVudCgpOworICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgIGlmIChpc19jb21wbGV4X3R5cGUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICBvdXQgPDwgImlmYWNlXy0+IiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIihyZXN1bHQuc3VjY2VzcyI7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgInJlc3VsdC5zdWNjZXNzID0gaWZhY2VfLT4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiaWZhY2VfLT4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7CisgICAgfQorICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgfQorICAgICAgb3V0IDw8ICJhcmdzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIH0KKyAgICBvdXQgPDwgIik7IiA8PCBlbmRsOworCisgICAgLy8gU2V0IGlzc2V0IG9uIHN1Y2Nlc3MgZmllbGQKKyAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJlc3VsdC5fX2lzc2V0LnN1Y2Nlc3MgPSB0cnVlOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSI7CisKKyAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgIG91dCA8PCAiIGNhdGNoICgiIDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCkpIDw8ICIgJiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJlc3VsdC5fX2lzc2V0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSB0cnVlOyIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8ICJ9IjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgb3V0IDw8ICIgY2F0Y2ggKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uJiBlKSB7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgIiBjYXRjaCAoY29uc3Qgc3RkOjpleGNlcHRpb24mKSB7IiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiICB0aGlzLT5ldmVudEhhbmRsZXJfLT5oYW5kbGVyRXJyb3IoY3R4LCAiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4KGUud2hhdCgpKTsiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3QtPndyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICA8PCAiXCIsIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0VYQ0VQVElPTiwgc2VxaWQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICJ4LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3QtPmdldFRyYW5zcG9ydCgpLT53cml0ZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICJvcHJvdC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIC8vIFNob3J0Y3V0IG91dCBoZXJlIGZvciBvbmV3YXkgZnVuY3Rpb25zCisgICAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICIgIHRoaXMtPmV2ZW50SGFuZGxlcl8tPmFzeW5jQ29tcGxldGUoY3R4LCAiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIpOyIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgb3V0IDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gU2VyaWFsaXplIHRoZSByZXN1bHQgaW50byBhIHN0cnVjdAorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiICB0aGlzLT5ldmVudEhhbmRsZXJfLT5wcmVXcml0ZShjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIik7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LT53cml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgIDw8ICJcIiwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfUkVQTFksIHNlcWlkKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgInJlc3VsdC53cml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC0+d3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJieXRlcyA9IG9wcm90LT5nZXRUcmFuc3BvcnQoKS0+d3JpdGVFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIm9wcm90LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiICB0aGlzLT5ldmVudEhhbmRsZXJfLT5wb3N0V3JpdGUoY3R4LCAiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIsIGJ5dGVzKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgICAvLyBDbG9zZSBmdW5jdGlvbgorICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKyAgfQorCisgIC8vIENvYiBzdHlsZS4KKyAgZWxzZSB7CisgICAgLy8gUHJvY2Vzc29yIGVudHJ5IHBvaW50LgorICAgIC8vIFRPRE8oZWRoYWxsKSB1cGRhdGUgZm9yIGNhbGxDb250ZXh0IHdoZW4gVEV2ZW50U2VydmVyIGlzIHJlYWR5CisgICAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+IiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgInZvaWQgIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiQXN5bmNQcm9jZXNzb3IiIDw8IGNsYXNzX3N1ZmZpeCA8PCAiOjpwcm9jZXNzXyIKKyAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoOjpzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+IGNvYiwgaW50MzJfdCBzZXFpZCwgIgorICAgICAgICA8PCBwcm90X3R5cGUgPDwgIiogaXByb3QsICIgPDwgcHJvdF90eXBlIDw8ICIqIG9wcm90KSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworCisgICAgLy8gVE9ETyhzaW1wa2lucyk6IHdlIGNvdWxkIHRyeSB0byBjb25zb2xkYXRlIHRoaXMKKyAgICAvLyB3aXRoIHRoZSBub24tY29iIGNvZGUgYWJvdmUKKyAgICBpZiAoZ2VuX3RlbXBsYXRlc18gJiYgIXNwZWNpYWxpemVkKSB7CisgICAgICAvLyBJZiB0aGVzZSBhcmUgaW5zdGFuY2VzIG9mIFByb3RvY29sXywgaW5zdGVhZCBvZiBhbnkgb2xkIFRQcm90b2NvbCwKKyAgICAgIC8vIHVzZSB0aGUgc3BlY2lhbGl6ZWQgcHJvY2VzcyBmdW5jdGlvbiBpbnN0ZWFkLgorICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJQcm90b2NvbF8qIF9pcHJvdCA9IGR5bmFtaWNfY2FzdDxQcm90b2NvbF8qPihpcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIlByb3RvY29sXyogX29wcm90ID0gZHluYW1pY19jYXN0PFByb3RvY29sXyo+KG9wcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiaWYgKF9pcHJvdCAmJiBfb3Byb3QpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHByb2Nlc3NfIgorICAgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKGNvYiwgc2VxaWQsIF9pcHJvdCwgX29wcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iCisgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiVF9HRU5FUklDX1BST1RPQ09MKHRoaXMsIGlwcm90LCBfaXByb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICJUX0dFTkVSSUNfUFJPVE9DT0wodGhpcywgb3Byb3QsIF9vcHJvdCk7IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfQorCisgICAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiKHZvaWQpIHNlcWlkOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiKHZvaWQpIG9wcm90OyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIl9hcmdzIGFyZ3M7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ2b2lkKiBjdHggPSBOVUxMOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiICBjdHggPSB0aGlzLT5ldmVudEhhbmRsZXJfLT5nZXRDb250ZXh0KCIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIiwgTlVMTCk7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yQ29udGV4dEZyZWVyIGZyZWVyKCIKKyAgICAgICAgPDwgInRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCksIGN0eCwgIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiKTsiIDw8IGVuZGwgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAidHJ5IHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICIgIHRoaXMtPmV2ZW50SGFuZGxlcl8tPnByZVJlYWQoY3R4LCAiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYXJncy5yZWFkKGlwcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgImlwcm90LT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAidWludDMyX3QgYnl0ZXMgPSBpcHJvdC0+Z2V0VHJhbnNwb3J0KCktPnJlYWRFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIiAgdGhpcy0+ZXZlbnRIYW5kbGVyXy0+cG9zdFJlYWQoY3R4LCAiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIsIGJ5dGVzKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihvdXQpOworCisgICAgLy8gVE9ETyhkcmVpc3MpOiBIYW5kbGUgVEV4Y2VwdGlvbnM/ICBFeHBvc2UgdG8gc2VydmVyPworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiY2F0Y2ggKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uJikgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiICBpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICIgICAgdGhpcy0+ZXZlbnRIYW5kbGVyXy0+aGFuZGxlckVycm9yKGN0eCwgIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gY29iKGZhbHNlKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIn0iIDw8IGVuZGw7CisKKyAgICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIiAgdGhpcy0+ZXZlbnRIYW5kbGVyXy0+YXN5bmNDb21wbGV0ZShjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIik7IiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIC8vIFRPRE8oZHJlaXNzKTogRmlndXJlIG91dCBhIHN0cmF0ZWd5IGZvciBleGNlcHRpb25zIGluIGFzeW5jIGhhbmRsZXJzLgorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZnJlZXIudW5yZWdpc3RlcigpOyIgPDwgZW5kbDsKKyAgICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgLy8gTm8gcmV0dXJuLiAgSnVzdCBoYW5kIG9mZiBvdXIgY29iLgorICAgICAgLy8gVE9ETyhkcmVpc3MpOiBDYWxsIHRoZSBjb2IgaW1tZWRpYXRlbHk/CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmYWNlXy0+IiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiCisgICAgICAgICAgPDwgIjo6c3RkOjpiaW5kKGNvYiwgdHJ1ZSkiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0gZWxzZSB7CisgICAgICBzdHJpbmcgcmV0X2FyZywgcmV0X3BsYWNlaG9sZGVyOworICAgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICByZXRfYXJnID0gIiwgY29uc3QgIiArIHR5cGVfbmFtZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpICsgIiYgX3JldHVybiI7CisgICAgICAgIHJldF9wbGFjZWhvbGRlciA9ICIsIDo6c3RkOjpwbGFjZWhvbGRlcnM6Ol8xIjsKKyAgICAgIH0KKworICAgICAgLy8gV2hlbiBnZW5fdGVtcGxhdGVzXyBpcyB0cnVlLCB0aGUgcmV0dXJuXyBhbmQgdGhyb3dfIGZ1bmN0aW9ucyBhcmUKKyAgICAgIC8vIG92ZXJsb2FkZWQuICBXZSBoYXZlIHRvIGRlY2xhcmUgcG9pbnRlcnMgdG8gdGhlbSBzbyB0aGF0IHRoZSBjb21waWxlcgorICAgICAgLy8gY2FuIHJlc29sdmUgdGhlIGNvcnJlY3Qgb3ZlcmxvYWRlZCB2ZXJzaW9uLgorICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2b2lkICgiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJBc3luY1Byb2Nlc3NvciIgPDwgY2xhc3Nfc3VmZml4CisgICAgICAgICAgPDwgIjo6KnJldHVybl9mbikoOjpzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+ICIKKyAgICAgICAgICA8PCAiY29iLCBpbnQzMl90IHNlcWlkLCAiIDw8IHByb3RfdHlwZSA8PCAiKiBvcHJvdCwgdm9pZCogY3R4IiA8PCByZXRfYXJnCisgICAgICAgICAgPDwgIikgPSIgPDwgZW5kbDsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAmIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiQXN5bmNQcm9jZXNzb3IiIDw8IGNsYXNzX3N1ZmZpeAorICAgICAgICAgIDw8ICI6OnJldHVybl8iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIGlmICgheGNlcHRpb25zLmVtcHR5KCkpIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2b2lkICgiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJBc3luY1Byb2Nlc3NvciIgPDwgY2xhc3Nfc3VmZml4CisgICAgICAgICAgICA8PCAiOjoqdGhyb3dfZm4pKDo6c3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiAiCisgICAgICAgICAgICA8PCAiY29iLCBpbnQzMl90IHNlcWlkLCAiIDw8IHByb3RfdHlwZSA8PCAiKiBvcHJvdCwgdm9pZCogY3R4LCAiCisgICAgICAgICAgICA8PCAiOjphcGFjaGU6OnRocmlmdDo6VERlbGF5ZWRFeGNlcHRpb24qIF90aHJvdykgPSIgPDwgZW5kbDsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgICYiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJBc3luY1Byb2Nlc3NvciIgPDwgY2xhc3Nfc3VmZml4CisgICAgICAgICAgICA8PCAiOjp0aHJvd18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZmFjZV8tPiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiOjpzdGQ6OmJpbmQocmV0dXJuX2ZuLCB0aGlzLCBjb2IsIHNlcWlkLCBvcHJvdCwgY3R4IiA8PCByZXRfcGxhY2Vob2xkZXIKKyAgICAgICAgICA8PCAiKSI7CisgICAgICBpZiAoIXhjZXB0aW9ucy5lbXB0eSgpKSB7CisgICAgICAgIG91dCA8PCAnLCcgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiOjpzdGQ6OmJpbmQodGhyb3dfZm4sIHRoaXMsIGNvYiwgc2VxaWQsIG9wcm90LCAiCisgICAgICAgICAgICA8PCAiY3R4LCA6OnN0ZDo6cGxhY2Vob2xkZXJzOjpfMSkiOworICAgICAgfQorICAgIH0KKworICAgIC8vIFhYWCBXaGl0ZXNwYWNlIGNsZWFudXAuCisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIG91dCA8PCAnLCcgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB9CisgICAgb3V0IDw8ICIpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudF9kb3duKCk7CisgICAgc2NvcGVfZG93bihvdXQpOworICAgIG91dCA8PCBlbmRsOworCisgICAgLy8gTm9ybWFsIHJldHVybi4KKyAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgIHN0cmluZyByZXRfYXJnX2RlY2wsIHJldF9hcmdfbmFtZTsKKyAgICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgcmV0X2FyZ19kZWNsID0gIiwgY29uc3QgIiArIHR5cGVfbmFtZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpICsgIiYgX3JldHVybiI7CisgICAgICAgIHJldF9hcmdfbmFtZSA9ICIsIF9yZXR1cm4iOworICAgICAgfQorICAgICAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4iIDw8IGVuZGw7CisgICAgICB9CisgICAgICBvdXQgPDwgInZvaWQgIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiQXN5bmNQcm9jZXNzb3IiIDw8IGNsYXNzX3N1ZmZpeCA8PCAiOjpyZXR1cm5fIgorICAgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKDo6c3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiBjb2IsIGludDMyX3Qgc2VxaWQsICIKKyAgICAgICAgICA8PCBwcm90X3R5cGUgPDwgIiogb3Byb3QsIHZvaWQqIGN0eCIgPDwgcmV0X2FyZ19kZWNsIDw8ICcpJyA8PCBlbmRsOworICAgICAgc2NvcGVfdXAob3V0KTsKKworICAgICAgaWYgKGdlbl90ZW1wbGF0ZXNfICYmICFzcGVjaWFsaXplZCkgeworICAgICAgICAvLyBJZiBvcHJvdCBpcyBhIFByb3RvY29sXyBpbnN0YW5jZSwKKyAgICAgICAgLy8gdXNlIHRoZSBzcGVjaWFsaXplZCByZXR1cm4gZnVuY3Rpb24gaW5zdGVhZC4KKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJQcm90b2NvbF8qIF9vcHJvdCA9IGR5bmFtaWNfY2FzdDxQcm90b2NvbF8qPihvcHJvdCk7IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKF9vcHJvdCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gcmV0dXJuXyIKKyAgICAgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKGNvYiwgc2VxaWQsIF9vcHJvdCwgY3R4IiA8PCByZXRfYXJnX25hbWUgPDwgIik7IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiVF9HRU5FUklDX1BST1RPQ09MKHRoaXMsIG9wcm90LCBfb3Byb3QpOyIKKyAgICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIl9wcmVzdWx0IHJlc3VsdDsiCisgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgLy8gVGhlIGNvbnN0X2Nhc3QgaGVyZSBpcyB1bmZvcnR1bmF0ZSwgYnV0IGl0IHdvdWxkIGJlIGEgcGFpbiB0byBhdm9pZCwKKyAgICAgICAgLy8gYW5kIHdlIG9ubHkgZG8gYSB3cml0ZSB3aXRoIHRoaXMgc3RydWN0LCB3aGljaCBpcyBjb25zdC1zYWZlLgorICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJlc3VsdC5zdWNjZXNzID0gY29uc3RfY2FzdDwiIDw8IHR5cGVfbmFtZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpCisgICAgICAgICAgICA8PCAiKj4oJl9yZXR1cm4pOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0Ll9faXNzZXQuc3VjY2VzcyA9IHRydWU7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgLy8gU2VyaWFsaXplIHRoZSByZXN1bHQgaW50byBhIHN0cnVjdAorICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiICBjdHggPSB0aGlzLT5ldmVudEhhbmRsZXJfLT5nZXRDb250ZXh0KCIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIiwgTlVMTCk7IiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiOjphcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvckNvbnRleHRGcmVlciBmcmVlcigiCisgICAgICAgICAgPDwgInRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCksIGN0eCwgIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiKTsiIDw8IGVuZGwgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIiAgdGhpcy0+ZXZlbnRIYW5kbGVyXy0+cHJlV3JpdGUoY3R4LCAiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIpOyIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LT53cml0ZU1lc3NhZ2VCZWdpbihcIiIKKyAgICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiLCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9SRVBMWSwgc2VxaWQpOyIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXN1bHQud3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3QtPndyaXRlTWVzc2FnZUVuZCgpOyIKKyAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ1aW50MzJfdCBieXRlcyA9IG9wcm90LT5nZXRUcmFuc3BvcnQoKS0+d3JpdGVFbmQoKTsiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3QtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIiAgdGhpcy0+ZXZlbnRIYW5kbGVyXy0+cG9zdFdyaXRlKGN0eCwgIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiLCBieXRlcyk7IiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJldHVybiBjb2IodHJ1ZSk7IiA8PCBlbmRsOworICAgICAgc2NvcGVfZG93bihvdXQpOworICAgICAgb3V0IDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gRXhjZXB0aW9uIHJldHVybi4KKyAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXhjZXB0aW9ucy5lbXB0eSgpKSB7CisgICAgICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPiIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIG91dCA8PCAidm9pZCAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJBc3luY1Byb2Nlc3NvciIgPDwgY2xhc3Nfc3VmZml4IDw8ICI6OnRocm93XyIKKyAgICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIig6OnN0ZDo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gY29iLCBpbnQzMl90IHNlcWlkLCAiCisgICAgICAgICAgPDwgcHJvdF90eXBlIDw8ICIqIG9wcm90LCB2b2lkKiBjdHgsICIKKyAgICAgICAgICA8PCAiOjphcGFjaGU6OnRocmlmdDo6VERlbGF5ZWRFeGNlcHRpb24qIF90aHJvdykiIDw8IGVuZGw7CisgICAgICBzY29wZV91cChvdXQpOworCisgICAgICBpZiAoZ2VuX3RlbXBsYXRlc18gJiYgIXNwZWNpYWxpemVkKSB7CisgICAgICAgIC8vIElmIG9wcm90IGlzIGEgUHJvdG9jb2xfIGluc3RhbmNlLAorICAgICAgICAvLyB1c2UgdGhlIHNwZWNpYWxpemVkIHRocm93IGZ1bmN0aW9uIGluc3RlYWQuCisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiUHJvdG9jb2xfKiBfb3Byb3QgPSBkeW5hbWljX2Nhc3Q8UHJvdG9jb2xfKj4ob3Byb3QpOyIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmIChfb3Byb3QpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocm93XyIKKyAgICAgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKGNvYiwgc2VxaWQsIF9vcHJvdCwgY3R4LCBfdGhyb3cpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIlRfR0VORVJJQ19QUk9UT0NPTCh0aGlzLCBvcHJvdCwgX29wcm90KTsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIC8vIEdldCB0aGUgZXZlbnQgaGFuZGxlciBjb250ZXh0CisgICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICIgIGN0eCA9IHRoaXMtPmV2ZW50SGFuZGxlcl8tPmdldENvbnRleHQoIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiLCBOVUxMKTsiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yQ29udGV4dEZyZWVyIGZyZWVyKCIKKyAgICAgICAgICA8PCAidGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSwgY3R4LCAiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIpOyIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgICAvLyBUaHJvdyB0aGUgVERlbGF5ZWRFeGNlcHRpb24sIGFuZCBjYXRjaCB0aGUgcmVzdWx0CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIl8iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiX3Jlc3VsdCByZXN1bHQ7IgorICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidHJ5IHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiX3Rocm93LT50aHJvd19pdCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGNvYihmYWxzZSk7IgorICAgICAgICAgIDw8IGVuZGw7IC8vIElzIHRoaXMgcG9zc2libGU/ICBUQkQuCisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICd9JzsKKyAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgIG91dCA8PCAiICBjYXRjaCAoIiA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiICYiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJlc3VsdC5fX2lzc2V0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSB0cnVlOyIKKyAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICAgIH0KKworICAgICAgLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIGFuIHVuZGVjbGFyZWQgZXhjZXB0aW9uIGlzIHRocm93bgorICAgICAgb3V0IDw8ICIgY2F0Y2ggKHN0ZDo6ZXhjZXB0aW9uJiBlKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiICB0aGlzLT5ldmVudEhhbmRsZXJfLT5oYW5kbGVyRXJyb3IoY3R4LCAiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIpOyIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiOjphcGFjaGU6OnRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uIHgoZS53aGF0KCkpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICJvcHJvdC0+d3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgIDw8ICJcIiwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfRVhDRVBUSU9OLCBzZXFpZCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIngud3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3QtPndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdC0+Z2V0VHJhbnNwb3J0KCktPndyaXRlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIm9wcm90LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGwgPDwKKyAgICAgICAgICAvLyBXZSBwYXNzIHRydWUgdG8gdGhlIGNvYiBoZXJlLCBzaW5jZSB3ZSBkaWQgc3VjY2Vzc2Z1bGx5IHdyaXRlIGEKKyAgICAgICAgICAvLyByZXNwb25zZSwgZXZlbiB0aG91Z2ggaXQgaXMgYW4gZXhjZXB0aW9uIHJlc3BvbnNlLgorICAgICAgICAgIC8vIEl0IGxvb2tzIGxpa2UgdGhlIGFyZ3VtZW50IGlzIGN1cnJlbnRseSBpZ25vcmVkLCBhbnl3YXkuCisgICAgICAgICAgaW5kZW50KCkgPDwgInJldHVybiBjb2IodHJ1ZSk7IiA8PCBlbmRsOworICAgICAgc2NvcGVfZG93bihvdXQpOworCisgICAgICAvLyBTZXJpYWxpemUgdGhlIHJlc3VsdCBpbnRvIGEgc3RydWN0CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiICB0aGlzLT5ldmVudEhhbmRsZXJfLT5wcmVXcml0ZShjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIik7IiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3QtPndyaXRlTWVzc2FnZUJlZ2luKFwiIgorICAgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIsIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1JFUExZLCBzZXFpZCk7IiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC0+d3JpdGVNZXNzYWdlRW5kKCk7IgorICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInVpbnQzMl90IGJ5dGVzID0gb3Byb3QtPmdldFRyYW5zcG9ydCgpLT53cml0ZUVuZCgpOyIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiICB0aGlzLT5ldmVudEhhbmRsZXJfLT5wb3N0V3JpdGUoY3R4LCAiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIsIGJ5dGVzKTsiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGNvYih0cnVlKTsiIDw8IGVuZGw7CisgICAgICBzY29wZV9kb3duKG91dCk7CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICB9IC8vIGZvciBlYWNoIGZ1bmN0aW9uCisgIH0gICAvLyBjb2Igc3R5bGUKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBza2VsZXRvbiBmaWxlIG9mIGEgc2VydmVyCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2tlbGV0b24odF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgc3ZjbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpOworCisgIC8vIFNlcnZpY2UgaW1wbGVtZW50YXRpb24gZmlsZSBpbmNsdWRlcworICBzdHJpbmcgZl9za2VsZXRvbl9uYW1lID0gZ2V0X291dF9kaXIoKSArIHN2Y25hbWUgKyAiX3NlcnZlci5za2VsZXRvbi5jcHAiOworCisgIHN0cmluZyBucyA9IG5hbWVzcGFjZV9wcmVmaXgodHNlcnZpY2UtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lc3BhY2UoImNwcCIpKTsKKworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2tlbGV0b247CisgIGZfc2tlbGV0b24ub3BlbihmX3NrZWxldG9uX25hbWUuY19zdHIoKSk7CisgIGZfc2tlbGV0b24gPDwgIi8vIFRoaXMgYXV0b2dlbmVyYXRlZCBza2VsZXRvbiBmaWxlIGlsbHVzdHJhdGVzIGhvdyB0byBidWlsZCBhIHNlcnZlci4iIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiLy8gWW91IHNob3VsZCBjb3B5IGl0IHRvIGFub3RoZXIgZmlsZW5hbWUgdG8gYXZvaWQgb3ZlcndyaXRpbmcgaXQuIiA8PCBlbmRsIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkgPDwgc3ZjbmFtZSA8PCAiLmhcIiIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPiIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmg+IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgIiNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaD4iIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4iIDw8IGVuZGwgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICJ1c2luZyBuYW1lc3BhY2UgOjphcGFjaGU6OnRocmlmdDsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAidXNpbmcgbmFtZXNwYWNlIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICJ1c2luZyBuYW1lc3BhY2UgOjphcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICJ1c2luZyBuYW1lc3BhY2UgOjphcGFjaGU6OnRocmlmdDo6c2VydmVyOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIHRoZSBmb2xsb3dpbmcgY29kZSB3b3VsZCBub3QgY29tcGlsZToKKyAgLy8gdXNpbmcgbmFtZXNwYWNlIDsKKyAgLy8gdXNpbmcgbmFtZXNwYWNlIDo6OworICBpZiAoKCFucy5lbXB0eSgpKSAmJiAobnMuY29tcGFyZSgiIDo6IikgIT0gMCkpIHsKKyAgICBmX3NrZWxldG9uIDw8ICJ1c2luZyBuYW1lc3BhY2UgIiA8PCBzdHJpbmcobnMsIDAsIG5zLnNpemUoKSAtIDIpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICBmX3NrZWxldG9uIDw8ICJjbGFzcyAiIDw8IHN2Y25hbWUgPDwgIkhhbmRsZXIgOiB2aXJ0dWFsIHB1YmxpYyAiIDw8IHN2Y25hbWUgPDwgIklmIHsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiIHB1YmxpYzoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX3NrZWxldG9uIDw8IGluZGVudCgpIDw8IHN2Y25hbWUgPDwgIkhhbmRsZXIoKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIiAgLy8gWW91ciBpbml0aWFsaXphdGlvbiBnb2VzIGhlcmUiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9qYXZhX2RvYyhmX3NrZWxldG9uLCAqZl9pdGVyKTsKKyAgICBmX3NrZWxldG9uIDw8IGluZGVudCgpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCAiIikgPDwgIiB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAiICAvLyBZb3VyIGltcGxlbWVudGF0aW9uIGdvZXMgaGVyZSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBwcmludGYoXCIiCisgICAgICAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlxcblwiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfc2tlbGV0b24gPDwgIn07IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZl9za2VsZXRvbiA8PCBpbmRlbnQoKSA8PCAiaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9za2VsZXRvbgorICAgICAgPDwgaW5kZW50KCkgPDwgImludCBwb3J0ID0gOTA5MDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIjo6c3RkOjpzaGFyZWRfcHRyPCIgPDwgc3ZjbmFtZQorICAgICAgPDwgIkhhbmRsZXI+IGhhbmRsZXIobmV3ICIgPDwgc3ZjbmFtZSA8PCAiSGFuZGxlcigpKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICI6OnN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IobmV3ICIgPDwgc3ZjbmFtZSA8PCAiUHJvY2Vzc29yKGhhbmRsZXIpKTsiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICI6OnN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiBzZXJ2ZXJUcmFuc3BvcnQobmV3IFRTZXJ2ZXJTb2NrZXQocG9ydCkpOyIKKyAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICI6OnN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeShuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSgpKTsiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICI6OnN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnkobmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSk7IgorICAgICAgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiVFNpbXBsZVNlcnZlciBzZXJ2ZXIocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSk7IgorICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAic2VydmVyLnNlcnZlKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gMDsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfc2tlbGV0b24gPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBDbG9zZSB0aGUgZmlsZXMKKyAgZl9za2VsZXRvbi5jbG9zZSgpOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzdWZmaXgpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgfQorCisgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpICsgc3VmZml4OworCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lLCBpc19yZWZlcmVuY2UodGZpZWxkKSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9IGlwcm90LT4iOworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgb3V0IDw8ICJyZWFkQmluYXJ5KCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgb3V0IDw8ICJyZWFkQm9vbCgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBvdXQgPDwgInJlYWRCeXRlKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICBvdXQgPDwgInJlYWRJMTYoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIG91dCA8PCAicmVhZEkzMigiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgb3V0IDw8ICJyZWFkSTY0KCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBvdXQgPDwgInJlYWREb3VibGUoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDKysgcmVhZGVyIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSkgKyBuYW1lOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBzdHJpbmcgdCA9IHRtcCgiZWNhc3QiKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImludDMyX3QgIiA8PCB0IDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IGlwcm90LT5yZWFkSTMyKCIgPDwgdAorICAgICAgICA8PCAiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgbmFtZSA8PCAiID0gKCIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIpIiA8PCB0IDw8ICI7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGFuIHVuc2VyaWFsaXplciBmb3IgYSB2YXJpYWJsZS4gVGhpcyBtYWtlcyB0d28ga2V5IGFzc3VtcHRpb25zLAorICogZmlyc3QgdGhhdCB0aGVyZSBpcyBhIGNvbnN0IGNoYXIqIHZhcmlhYmxlIG5hbWVkIGRhdGEgdGhhdCBwb2ludHMgdG8gdGhlCisgKiBidWZmZXIgZm9yIGRlc2VyaWFsaXphdGlvbiwgYW5kIHRoYXQgdGhlcmUgaXMgYSB2YXJpYWJsZSBwcm90b2NvbCB3aGljaAorICogaXMgYSByZWZlcmVuY2UgdG8gYSBUUHJvdG9jb2wgc2VyaWFsaXphdGlvbiBvYmplY3QuCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVyKSB7CisgIGlmIChwb2ludGVyKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlmICghIiA8PCBwcmVmaXggPDwgIikgeyAiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgIiA8PCBwcmVmaXggPDwgIiA9IDo6c3RkOjpzaGFyZWRfcHRyPCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICI+KG5ldyAiCisgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAieGZlciArPSAiIDw8IHByZWZpeCA8PCAiLT5yZWFkKGlwcm90KTsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgImJvb2wgd2FzU2V0ID0gZmFsc2U7IiA8PCBlbmRsOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBmb3IgKGZfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgZl9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrZl9pdGVyKSB7CisKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBwcmVmaXggPDwgIi0+X19pc3NldC4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgPDwgIikgeyB3YXNTZXQgPSB0cnVlOyB9IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCF3YXNTZXQpIHsgIiA8PCBwcmVmaXggPDwgIi5yZXNldCgpOyB9IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9ICIgPDwgcHJlZml4IDw8ICIucmVhZChpcHJvdCk7IiA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgc3RyaW5nIHNpemUgPSB0bXAoIl9zaXplIik7CisgIHN0cmluZyBrdHlwZSA9IHRtcCgiX2t0eXBlIik7CisgIHN0cmluZyB2dHlwZSA9IHRtcCgiX3Z0eXBlIik7CisgIHN0cmluZyBldHlwZSA9IHRtcCgiX2V0eXBlIik7CisKKyAgdF9jb250YWluZXIqIHRjb250YWluZXIgPSAodF9jb250YWluZXIqKXR0eXBlOworICBib29sIHVzZV9wdXNoID0gdGNvbnRhaW5lci0+aGFzX2NwcF9uYW1lKCk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIuY2xlYXIoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInVpbnQzMl90ICIgPDwgc2l6ZSA8PCAiOyIgPDwgZW5kbDsKKworICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlICIgPDwga3R5cGUgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUVHlwZSAiIDw8IHZ0eXBlIDw8ICI7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJ4ZmVyICs9IGlwcm90LT5yZWFkTWFwQmVnaW4oIiA8PCBrdHlwZSA8PCAiLCAiIDw8IHZ0eXBlIDw8ICIsICIgPDwgc2l6ZSA8PCAiKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFR5cGUgIiA8PCBldHlwZSA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAieGZlciArPSBpcHJvdC0+cmVhZFNldEJlZ2luKCIgPDwgZXR5cGUgPDwgIiwgIiA8PCBzaXplIDw8ICIpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFR5cGUgIiA8PCBldHlwZSA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAieGZlciArPSBpcHJvdC0+cmVhZExpc3RCZWdpbigiIDw8IGV0eXBlIDw8ICIsICIgPDwgc2l6ZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgaWYgKCF1c2VfcHVzaCkgeworICAgICAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIucmVzaXplKCIgPDwgc2l6ZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgLy8gRm9yIGxvb3AgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cworICBzdHJpbmcgaSA9IHRtcCgiX2kiKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ1aW50MzJfdCAiIDw8IGkgPDwgIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImZvciAoIiA8PCBpIDw8ICIgPSAwOyAiIDw8IGkKKyAgICAgIDw8ICIgPCAiIDw8IHNpemUgPDwgIjsgKysiIDw8IGkgPDwgIikiIDw8IGVuZGw7CisKKyAgc2NvcGVfdXAob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgcHJlZml4KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIHByZWZpeCwgdXNlX3B1c2gsIGkpOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIC8vIFJlYWQgY29udGFpbmVyIGVuZAorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgInhmZXIgKz0gaXByb3QtPnJlYWRNYXBFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgInhmZXIgKz0gaXByb3QtPnJlYWRTZXRFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9IGlwcm90LT5yZWFkTGlzdEVuZCgpOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgY29kZSB0byBkZXNlcmlhbGl6ZSBhIG1hcAorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcga2V5ID0gdG1wKCJfa2V5Iik7CisgIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKKyAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOworICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8IGRlY2xhcmVfZmllbGQoJmZrZXkpIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSk7CisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZ2YWwsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUpIDw8ICIgPSAiIDw8IHByZWZpeCA8PCAiWyIgPDwga2V5CisgICAgICAgICAgICAgIDw8ICJdOyIgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsKTsKK30KKwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgIHRfZmllbGQgZmVsZW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIuaW5zZXJ0KCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHVzZV9wdXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaW5kZXgpIHsKKyAgaWYgKHVzZV9wdXNoKSB7CisgICAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgICAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKyAgICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CisgICAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIucHVzaF9iYWNrKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBwcmVmaXggKyAiWyIgKyBpbmRleCArICJdIik7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOworICB9Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQorICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3VmZml4KSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSArIHN1ZmZpeDsKKworICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBuYW1lOworICB9CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lLCBpc19yZWZlcmVuY2UodGZpZWxkKSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisKKyAgICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBvcHJvdC0+IjsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICAgIG91dCA8PCAid3JpdGVCaW5hcnkoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZygiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUJvb2woIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUJ5dGUoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCAid3JpdGVJMTYoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAid3JpdGVJNjQoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIG91dCA8PCAid3JpdGVEb3VibGUoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDKysgd3JpdGVyIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSkKKyAgICAgICAgICAgICsgbmFtZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJ3cml0ZUkzMigoaW50MzJfdCkiIDw8IG5hbWUgPDwgIik7IjsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICBuYW1lLmNfc3RyKCksCisgICAgICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKKyAgfQorfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCisgKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCisgKi8KK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlcikgeworICBpZiAocG9pbnRlcikgeworICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBwcmVmaXggPDwgIikgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICB4ZmVyICs9ICIgPDwgcHJlZml4IDw8ICItPndyaXRlKG9wcm90KTsgIiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIKKyAgICAgICAgICAgICAgICA8PCAib3Byb3QtPndyaXRlU3RydWN0QmVnaW4oXCIiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlwiKTsgIiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIG9wcm90LT53cml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICBvcHJvdC0+d3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgInhmZXIgKz0gIiA8PCBwcmVmaXggPDwgIi53cml0ZShvcHJvdCk7IiA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgeworICBzY29wZV91cChvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBvcHJvdC0+d3JpdGVNYXBCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKQorICAgICAgICAgICAgICAgIDw8ICIsICIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCAic3RhdGljX2Nhc3Q8dWludDMyX3Q+KCIgPDwgcHJlZml4IDw8ICIuc2l6ZSgpKSk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZVNldEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKQorICAgICAgICAgICAgICAgIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCAic3RhdGljX2Nhc3Q8dWludDMyX3Q+KCIgPDwgcHJlZml4IDw8ICIuc2l6ZSgpKSk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBvcHJvdC0+d3JpdGVMaXN0QmVnaW4oIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCAic3RhdGljX2Nhc3Q8dWludDMyX3Q+KCIgPDwgcHJlZml4IDw8ICIuc2l6ZSgpKSk7IiA8PCBlbmRsOworICB9CisKKyAgc3RyaW5nIGl0ZXIgPSB0bXAoIl9pdGVyIik7CisgIG91dCA8PCBpbmRlbnQoKSA8PCB0eXBlX25hbWUodHR5cGUpIDw8ICI6OmNvbnN0X2l0ZXJhdG9yICIgPDwgaXRlciA8PCAiOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgImZvciAoIiA8PCBpdGVyIDw8ICIgPSAiIDw8IHByZWZpeCA8PCAiLmJlZ2luKCk7ICIgPDwgaXRlciA8PCAiICE9ICIgPDwgcHJlZml4CisgICAgICA8PCAiLmVuZCgpOyArKyIgPDwgaXRlciA8PCAiKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGl0ZXIpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOworICB9CisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgInhmZXIgKz0gb3Byb3QtPndyaXRlTWFwRW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZVNldEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgInhmZXIgKz0gb3Byb3QtPndyaXRlTGlzdEVuZCgpOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgorICoKKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdHJpbmcgaXRlcikgeworICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwgaXRlciArICItPmZpcnN0Iik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsICIiKTsKKworICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgaXRlciArICItPnNlY29uZCIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCAiIik7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KKyAqLwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgaXRlcikgeworICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksICIoKiIgKyBpdGVyICsgIikiKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgorICovCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBpdGVyKSB7CisgIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksICIoKiIgKyBpdGVyICsgIikiKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOworfQorCisvKioKKyAqIE1ha2VzIGEgOjogcHJlZml4IGZvciBhIG5hbWVzcGFjZQorICoKKyAqIEBwYXJhbSBucyBUaGUgbmFtZXNwYWNlLCB3LyBwZXJpb2RzIGluIGl0CisgKiBAcmV0dXJuIE5hbWVzcGFjZXMKKyAqLworc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6bmFtZXNwYWNlX3ByZWZpeChzdHJpbmcgbnMpIHsKKyAgLy8gQWx3YXlzIHN0YXJ0IHdpdGggIjo6IiwgdG8gYXZvaWQgcG9zc2libGUgbmFtZSBjb2xsaXNpb25zIHdpdGgKKyAgLy8gb3RoZXIgbmFtZXMgaW4gb25lIG9mIHRoZSBjdXJyZW50IG5hbWVzcGFjZXMuCisgIC8vCisgIC8vIFdlIGFsc28gbmVlZCBhIGxlYWRpbmcgc3BhY2UsIGluIGNhc2UgdGhlIG5hbWUgaXMgdXNlZCBpbnNpZGUgb2YgYQorICAvLyB0ZW1wbGF0ZSBwYXJhbWV0ZXIuICAiTXlUZW1wbGF0ZTw6OmZvbzo6QmFyPiIgaXMgbm90IHZhbGlkIEMrKywKKyAgLy8gc2luY2UgIjw6IiBpcyBhbiBhbHRlcm5hdGl2ZSB0b2tlbiBmb3IgIlsiLgorICBzdHJpbmcgcmVzdWx0ID0gIiA6OiI7CisKKyAgaWYgKG5zLnNpemUoKSA9PSAwKSB7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorICBzdHJpbmc6OnNpemVfdHlwZSBsb2M7CisgIHdoaWxlICgobG9jID0gbnMuZmluZCgiLiIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICByZXN1bHQgKz0gbnMuc3Vic3RyKDAsIGxvYyk7CisgICAgcmVzdWx0ICs9ICI6OiI7CisgICAgbnMgPSBucy5zdWJzdHIobG9jICsgMSk7CisgIH0KKyAgaWYgKG5zLnNpemUoKSA+IDApIHsKKyAgICByZXN1bHQgKz0gbnMgKyAiOjoiOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogT3BlbnMgbmFtZXNwYWNlLgorICoKKyAqIEBwYXJhbSBucyBUaGUgbmFtZXNwYWNlLCB3LyBwZXJpb2RzIGluIGl0CisgKiBAcmV0dXJuIE5hbWVzcGFjZXMKKyAqLworc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6bmFtZXNwYWNlX29wZW4oc3RyaW5nIG5zKSB7CisgIGlmIChucy5zaXplKCkgPT0gMCkgeworICAgIHJldHVybiAiIjsKKyAgfQorICBzdHJpbmcgcmVzdWx0ID0gIiI7CisgIHN0cmluZyBzZXBhcmF0b3IgPSAiIjsKKyAgc3RyaW5nOjpzaXplX3R5cGUgbG9jOworICB3aGlsZSAoKGxvYyA9IG5zLmZpbmQoIi4iKSkgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgcmVzdWx0ICs9IHNlcGFyYXRvcjsKKyAgICByZXN1bHQgKz0gIm5hbWVzcGFjZSAiOworICAgIHJlc3VsdCArPSBucy5zdWJzdHIoMCwgbG9jKTsKKyAgICByZXN1bHQgKz0gIiB7IjsKKyAgICBzZXBhcmF0b3IgPSAiICI7CisgICAgbnMgPSBucy5zdWJzdHIobG9jICsgMSk7CisgIH0KKyAgaWYgKG5zLnNpemUoKSA+IDApIHsKKyAgICByZXN1bHQgKz0gc2VwYXJhdG9yICsgIm5hbWVzcGFjZSAiICsgbnMgKyAiIHsiOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogQ2xvc2VzIG5hbWVzcGFjZS4KKyAqCisgKiBAcGFyYW0gbnMgVGhlIG5hbWVzcGFjZSwgdy8gcGVyaW9kcyBpbiBpdAorICogQHJldHVybiBOYW1lc3BhY2VzCisgKi8KK3N0cmluZyB0X2NwcF9nZW5lcmF0b3I6Om5hbWVzcGFjZV9jbG9zZShzdHJpbmcgbnMpIHsKKyAgaWYgKG5zLnNpemUoKSA9PSAwKSB7CisgICAgcmV0dXJuICIiOworICB9CisgIHN0cmluZyByZXN1bHQgPSAifSI7CisgIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKKyAgd2hpbGUgKChsb2MgPSBucy5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykgeworICAgIHJlc3VsdCArPSAifSI7CisgICAgbnMgPSBucy5zdWJzdHIobG9jICsgMSk7CisgIH0KKyAgcmVzdWx0ICs9ICIgLy8gbmFtZXNwYWNlIjsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBSZXR1cm5zIGEgQysrIHR5cGUgbmFtZQorICoKKyAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQorICogQHJldHVybiBTdHJpbmcgb2YgdGhlIHR5cGUgbmFtZSwgaS5lLiBzdGQ6OnNldDx0eXBlPgorICovCitzdHJpbmcgdF9jcHBfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl90eXBlZGVmLCBib29sIGFyZykgeworICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgc3RyaW5nIGJuYW1lID0gYmFzZV90eXBlX25hbWUoKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpKTsKKyAgICBzdGQ6Om1hcDxzdHJpbmcsIHN0cmluZz46Oml0ZXJhdG9yIGl0ID0gdHR5cGUtPmFubm90YXRpb25zXy5maW5kKCJjcHAudHlwZSIpOworICAgIGlmIChpdCAhPSB0dHlwZS0+YW5ub3RhdGlvbnNfLmVuZCgpKSB7CisgICAgICBibmFtZSA9IGl0LT5zZWNvbmQ7CisgICAgfQorCisgICAgaWYgKCFhcmcpIHsKKyAgICAgIHJldHVybiBibmFtZTsKKyAgICB9CisKKyAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpID09IHRfYmFzZV90eXBlOjpUWVBFX1NUUklORykgeworICAgICAgcmV0dXJuICJjb25zdCAiICsgYm5hbWUgKyAiJiI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAiY29uc3QgIiArIGJuYW1lOworICAgIH0KKyAgfQorCisgIC8vIENoZWNrIGZvciBhIGN1c3RvbSBvdmVybG9hZGVkIEMrKyBuYW1lCisgIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBzdHJpbmcgY25hbWU7CisKKyAgICB0X2NvbnRhaW5lciogdGNvbnRhaW5lciA9ICh0X2NvbnRhaW5lciopdHR5cGU7CisgICAgaWYgKHRjb250YWluZXItPmhhc19jcHBfbmFtZSgpKSB7CisgICAgICBjbmFtZSA9IHRjb250YWluZXItPmdldF9jcHBfbmFtZSgpOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgICB0X21hcCogdG1hcCA9ICh0X21hcCopdHR5cGU7CisgICAgICBjbmFtZSA9ICJzdGQ6Om1hcDwiICsgdHlwZV9uYW1lKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBpbl90eXBlZGVmKSArICIsICIKKyAgICAgICAgICAgICAgKyB0eXBlX25hbWUodG1hcC0+Z2V0X3ZhbF90eXBlKCksIGluX3R5cGVkZWYpICsgIj4gIjsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgICAgdF9zZXQqIHRzZXQgPSAodF9zZXQqKXR0eXBlOworICAgICAgY25hbWUgPSAic3RkOjpzZXQ8IiArIHR5cGVfbmFtZSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGluX3R5cGVkZWYpICsgIj4gIjsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIHRfbGlzdCogdGxpc3QgPSAodF9saXN0Kil0dHlwZTsKKyAgICAgIGNuYW1lID0gInN0ZDo6dmVjdG9yPCIgKyB0eXBlX25hbWUodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaW5fdHlwZWRlZikgKyAiPiAiOworICAgIH0KKworICAgIGlmIChhcmcpIHsKKyAgICAgIHJldHVybiAiY29uc3QgIiArIGNuYW1lICsgIiYiOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gY25hbWU7CisgICAgfQorICB9CisKKyAgc3RyaW5nIGNsYXNzX3ByZWZpeDsKKyAgaWYgKGluX3R5cGVkZWYgJiYgKHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSkpIHsKKyAgICBjbGFzc19wcmVmaXggPSAiY2xhc3MgIjsKKyAgfQorCisgIC8vIENoZWNrIGlmIGl0IG5lZWRzIHRvIGJlIG5hbWVzcGFjZWQKKyAgc3RyaW5nIHBuYW1lOworICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKKyAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7CisgICAgcG5hbWUgPSBjbGFzc19wcmVmaXggKyBuYW1lc3BhY2VfcHJlZml4KHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImNwcCIpKSArIHR0eXBlLT5nZXRfbmFtZSgpOworICB9IGVsc2UgeworICAgIHBuYW1lID0gY2xhc3NfcHJlZml4ICsgdHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKworICBpZiAodHR5cGUtPmlzX2VudW0oKSAmJiAhZ2VuX3B1cmVfZW51bXNfKSB7CisgICAgcG5hbWUgKz0gIjo6dHlwZSI7CisgIH0KKworICBpZiAoYXJnKSB7CisgICAgaWYgKGlzX2NvbXBsZXhfdHlwZSh0dHlwZSkpIHsKKyAgICAgIHJldHVybiAiY29uc3QgIiArIHBuYW1lICsgIiYiOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gImNvbnN0ICIgKyBwbmFtZTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHBuYW1lOworICB9Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgQysrIHR5cGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgdGhyaWZ0IHR5cGUuCisgKgorICogQHBhcmFtIHRiYXNlIFRoZSBiYXNlIHR5cGUKKyAqIEByZXR1cm4gRXhwbGljaXQgQysrIHR5cGUsIGkuZS4gImludDMyX3QiCisgKi8KK3N0cmluZyB0X2NwcF9nZW5lcmF0b3I6OmJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UpIHsKKyAgc3dpdGNoICh0YmFzZSkgeworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgcmV0dXJuICJ2b2lkIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgcmV0dXJuICJzdGQ6OnN0cmluZyI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICByZXR1cm4gImJvb2wiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIHJldHVybiAiaW50OF90IjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgcmV0dXJuICJpbnQxNl90IjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgcmV0dXJuICJpbnQzMl90IjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgcmV0dXJuICJpbnQ2NF90IjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgcmV0dXJuICJkb3VibGUiOworICBkZWZhdWx0OgorICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQysrIGJhc2UgdHlwZSBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgIH0KK30KKworLyoqCisgKiBEZWNsYXJlcyBhIGZpZWxkLCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCisgKgorICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCisgKiBAcmV0dXJuIEZpZWxkIGRlY2xhcmF0aW9uLCBpLmUuIGludCB4ID0gMDsKKyAqLworc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNvbnN0YW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlZmVyZW5jZSkgeworICAvLyBUT0RPKG1jc2xlZSk6IGRvIHdlIGV2ZXIgbmVlZCB0byBpbml0aWFsaXplIHRoZSBmaWVsZD8KKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworICBpZiAoY29uc3RhbnQpIHsKKyAgICByZXN1bHQgKz0gImNvbnN0ICI7CisgIH0KKyAgcmVzdWx0ICs9IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpOworICBpZiAoaXNfcmVmZXJlbmNlKHRmaWVsZCkpIHsKKyAgICByZXN1bHQgPSAiOjpzdGQ6OnNoYXJlZF9wdHI8IiArIHJlc3VsdCArICI+IjsKKyAgfQorICBpZiAocG9pbnRlcikgeworICAgIHJlc3VsdCArPSAiKiI7CisgIH0KKyAgaWYgKHJlZmVyZW5jZSkgeworICAgIHJlc3VsdCArPSAiJiI7CisgIH0KKyAgcmVzdWx0ICs9ICIgIiArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgaWYgKGluaXQpIHsKKyAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSBmYWxzZSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgcmVzdWx0ICs9ICIgPSAoZG91YmxlKTAiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQysrIGluaXRpYWxpemVyIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIHJlc3VsdCArPSAiID0gKCIgKyB0eXBlX25hbWUodHlwZSkgKyAiKTAiOworICAgIH0KKyAgfQorICBpZiAoIXJlZmVyZW5jZSkgeworICAgIHJlc3VsdCArPSAiOyI7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3N0cmluZyB0X2NwcF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBuYW1lX3BhcmFtcykgeworICB0X3R5cGUqIHR0eXBlID0gdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOworICB0X3N0cnVjdCogYXJnbGlzdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgYm9vbCBoYXNfeGNlcHRpb25zID0gIXRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpLmVtcHR5KCk7CisKKyAgaWYgKHN0eWxlID09ICIiKSB7CisgICAgaWYgKGlzX2NvbXBsZXhfdHlwZSh0dHlwZSkpIHsKKyAgICAgIHJldHVybiAidm9pZCAiICsgcHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIigiICsgdHlwZV9uYW1lKHR0eXBlKQorICAgICAgICAgICAgICsgKG5hbWVfcGFyYW1zID8gIiYgX3JldHVybiIgOiAiJiAvKiBfcmV0dXJuICovIikKKyAgICAgICAgICAgICArIGFyZ3VtZW50X2xpc3QoYXJnbGlzdCwgbmFtZV9wYXJhbXMsIHRydWUpICsgIikiOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gdHlwZV9uYW1lKHR0eXBlKSArICIgIiArIHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIoIgorICAgICAgICAgICAgICsgYXJndW1lbnRfbGlzdChhcmdsaXN0LCBuYW1lX3BhcmFtcykgKyAiKSI7CisgICAgfQorICB9IGVsc2UgaWYgKHN0eWxlLnN1YnN0cigwLCAzKSA9PSAiQ29iIikgeworICAgIHN0cmluZyBjb2JfdHlwZTsKKyAgICBzdHJpbmcgZXhuX2NvYjsKKyAgICBpZiAoc3R5bGUgPT0gIkNvYkNsIikgeworICAgICAgY29iX3R5cGUgPSAiKCIgKyBzZXJ2aWNlX25hbWVfICsgIkNvYkNsaWVudCI7CisgICAgICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKKyAgICAgICAgY29iX3R5cGUgKz0gIlQ8UHJvdG9jb2xfPiI7CisgICAgICB9CisgICAgICBjb2JfdHlwZSArPSAiKiBjbGllbnQpIjsKKyAgICB9IGVsc2UgaWYgKHN0eWxlID09ICJDb2JTdiIpIHsKKyAgICAgIGNvYl90eXBlID0gKHR0eXBlLT5pc192b2lkKCkgPyAiKCkiIDogKCIoIiArIHR5cGVfbmFtZSh0dHlwZSkgKyAiIGNvbnN0JiBfcmV0dXJuKSIpKTsKKyAgICAgIGlmIChoYXNfeGNlcHRpb25zKSB7CisgICAgICAgIGV4bl9jb2IKKyAgICAgICAgICAgID0gIiwgOjpzdGQ6OmZ1bmN0aW9uPHZvaWQoOjphcGFjaGU6OnRocmlmdDo6VERlbGF5ZWRFeGNlcHRpb24qIF90aHJvdyk+IC8qIGV4bl9jb2IgKi8iOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyAiVU5LTk9XTiBTVFlMRSI7CisgICAgfQorCisgICAgcmV0dXJuICJ2b2lkICIgKyBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiKDo6c3RkOjpmdW5jdGlvbjx2b2lkIiArIGNvYl90eXBlICsgIj4gY29iIgorICAgICAgICAgICArIGV4bl9jb2IgKyBhcmd1bWVudF9saXN0KGFyZ2xpc3QsIG5hbWVfcGFyYW1zLCB0cnVlKSArICIpIjsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiVU5LTk9XTiBTVFlMRSI7CisgIH0KK30KKworLyoqCisgKiBSZW5kZXJzIGEgZmllbGQgbGlzdAorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICogQHJldHVybiBDb21tYSBzZXBlYXJhdGVkIGxpc3Qgb2YgYWxsIGZpZWxkIG5hbWVzIGluIHRoYXQgc3RydWN0CisgKi8KK3N0cmluZyB0X2NwcF9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgbmFtZV9wYXJhbXMsIGJvb2wgc3RhcnRfY29tbWEpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9ICFzdGFydF9jb21tYTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSAiLCAiOworICAgIH0KKyAgICByZXN1bHQgKz0gdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIHRydWUpICsgIiAiCisgICAgICAgICAgICAgICsgKG5hbWVfcGFyYW1zID8gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDogIi8qICIgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiICovIik7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIEMrKyBlbnVtIHN0cmluZyBmb3IgdGhlIGdpdmVuIHR5cGUuCisgKgorICogQHBhcmFtIHR5cGUgVGhyaWZ0IFR5cGUKKyAqIEByZXR1cm4gU3RyaW5nIG9mIEMrKyBjb2RlIHRvIGRlZmluaXRpb24gb2YgdGhhdCB0eXBlIGNvbnN0YW50CisgKi8KK3N0cmluZyB0X2NwcF9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUUklORyI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9CT09MIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9CWVRFIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfSTE2IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfSTMyIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfSTY0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfRE9VQkxFIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9JMzIiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpKSB7CisgICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVFJVQ1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUUlVDVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX01BUCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NFVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9MSVNUIjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6Z2V0X2luY2x1ZGVfcHJlZml4KGNvbnN0IHRfcHJvZ3JhbSYgcHJvZ3JhbSkgY29uc3QgeworICBzdHJpbmcgaW5jbHVkZV9wcmVmaXggPSBwcm9ncmFtLmdldF9pbmNsdWRlX3ByZWZpeCgpOworICBpZiAoIXVzZV9pbmNsdWRlX3ByZWZpeF8gfHwgKGluY2x1ZGVfcHJlZml4LnNpemUoKSA+IDAgJiYgaW5jbHVkZV9wcmVmaXhbMF0gPT0gJy8nKSkgeworICAgIC8vIGlmIGZsYWcgaXMgdHVybmVkIG9mZiBvciB0aGlzIGlzIGFic29sdXRlIHBhdGgsIHJldHVybiBlbXB0eSBwcmVmaXgKKyAgICByZXR1cm4gIiI7CisgIH0KKworICBzdHJpbmc6OnNpemVfdHlwZSBsYXN0X3NsYXNoID0gc3RyaW5nOjpucG9zOworICBpZiAoKGxhc3Rfc2xhc2ggPSBpbmNsdWRlX3ByZWZpeC5yZmluZCgiLyIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICByZXR1cm4gaW5jbHVkZV9wcmVmaXguc3Vic3RyKDAsIGxhc3Rfc2xhc2gpCisgICAgICAgICAgICsgKGdldF9wcm9ncmFtKCktPmlzX291dF9wYXRoX2Fic29sdXRlKCkgPyAiLyIgOiAiLyIgKyBvdXRfZGlyX2Jhc2VfICsgIi8iKTsKKyAgfQorCisgIHJldHVybiAiIjsKK30KKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUigKKyAgICBjcHAsCisgICAgIkMrKyIsCisgICAgIiAgICBjb2Jfc3R5bGU6ICAgICAgIEdlbmVyYXRlIFwiQ29udGludWF0aW9uIE9CamVjdFwiLXN0eWxlIGNsYXNzZXMuXG4iCisgICAgIiAgICBub19jbGllbnRfY29tcGxldGlvbjpcbiIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgT21pdCBjYWxscyB0byBjb21wbGV0aW9uX18oKSBpbiBDb2JDbGllbnQgY2xhc3MuXG4iCisgICAgIiAgICBub19kZWZhdWx0X29wZXJhdG9yczpcbiIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgT21pdHMgZ2VuZXJhdGlvbiBvZiBkZWZhdWx0IG9wZXJhdG9ycyA9PSwgIT0gYW5kIDxcbiIKKyAgICAiICAgIHRlbXBsYXRlczogICAgICAgR2VuZXJhdGUgdGVtcGxhdGl6ZWQgcmVhZGVyL3dyaXRlciBtZXRob2RzLlxuIgorICAgICIgICAgcHVyZV9lbnVtczogICAgICBHZW5lcmF0ZSBwdXJlIGVudW1zIGluc3RlYWQgb2Ygd3JhcHBlciBjbGFzc2VzLlxuIgorICAgICIgICAgaW5jbHVkZV9wcmVmaXg6ICBVc2UgZnVsbCBpbmNsdWRlIHBhdGhzIGluIGdlbmVyYXRlZCBmaWxlcy5cbiIKKyAgICAiICAgIG1vdmVhYmxlX3R5cGVzOiAgR2VuZXJhdGUgbW92ZSBjb25zdHJ1Y3RvcnMgYW5kIGFzc2lnbm1lbnQgb3BlcmF0b3JzLlxuIgorICAgICIgICAgbm9fb3N0cmVhbV9vcGVyYXRvcnM6XG4iCisgICAgIiAgICAgICAgICAgICAgICAgICAgIE9taXQgZ2VuZXJhdGlvbiBvZiBvc3RyZWFtIGRlZmluaXRpb25zLlxuIgorICAgICIgICAgbm9fc2tlbGV0b246ICAgICBPbWl0cyBnZW5lcmF0aW9uIG9mIHNrZWxldG9uLlxuIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY3NoYXJwX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY3NoYXJwX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDFlMjllCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9jc2hhcnBfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsMzI0NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGNhc3NlcnQ+CisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8Y2N0eXBlPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworCitzdHJ1Y3QgbWVtYmVyX21hcHBpbmdfc2NvcGUgeworICB2b2lkKiBzY29wZV9tZW1iZXI7CisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gbWFwcGluZ190YWJsZTsKK307CisKK2NsYXNzIHRfY3NoYXJwX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X2NzaGFycF9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICBhc3luY18gPSBmYWxzZTsKKyAgICBudWxsYWJsZV8gPSBmYWxzZTsKKyAgICBoYXNoY29kZV8gPSBmYWxzZTsKKyAgICB1bmlvbl8gPSBmYWxzZTsKKyAgICBzZXJpYWxpemVfID0gZmFsc2U7CisgICAgd2NmXyA9IGZhbHNlOworICAgIHdjZl9uYW1lc3BhY2VfLmNsZWFyKCk7CisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiYXN5bmMiKSA9PSAwKSB7CisgICAgICAgIGFzeW5jXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoIm51bGxhYmxlIikgPT0gMCkgeworICAgICAgICBudWxsYWJsZV8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJoYXNoY29kZSIpID09IDApIHsKKyAgICAgICAgaGFzaGNvZGVfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgidW5pb24iKSA9PSAwKSB7CisgICAgICAgIHVuaW9uXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInNlcmlhbCIpID09IDApIHsKKyAgICAgICAgc2VyaWFsaXplXyA9IHRydWU7CisgICAgICAgIHdjZl9uYW1lc3BhY2VfID0gaXRlci0+c2Vjb25kOyAvLyBzaW5jZSB0aGVyZSBjYW4gYmUgb25seSBvbmUgbmFtZXNwYWNlCisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoIndjZiIpID09IDApIHsKKyAgICAgICAgd2NmXyA9IHRydWU7CisgICAgICAgIHdjZl9uYW1lc3BhY2VfID0gaXRlci0+c2Vjb25kOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIGNzaGFycDoiICsgaXRlci0+Zmlyc3Q7CisgICAgICB9CisgICAgfQorCisgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tY3NoYXJwIjsKKyAgfQorICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7CisgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7CisKKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV91bmlvbih0X3N0cnVjdCogdHVuaW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3Byb3BlcnR5KG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBib29sIGlzUHVibGljLCBib29sIGdlbmVyYXRlSXNzZXQpOworICB2b2lkIGdlbmVyYXRlX2NzaGFycF9wcm9wZXJ0eShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1B1YmxpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsdWRlSXNzZXQgPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWVsZFByZWZpeCA9ICIiKTsKKyAgYm9vbCBwcmludF9jb25zdF92YWx1ZShzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX3N0YXRpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlZnZhbCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbmVlZHR5cGUgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZShzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisgIHZvaWQgcHJpbnRfY29uc3RfY29uc3RydWN0b3Ioc3RkOjpvc3RyZWFtJiBvdXQsIHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpOworICB2b2lkIHByaW50X2NvbnN0X2RlZl92YWx1ZShzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3VuaW9uKHRfc3RydWN0KiB0dW5pb24pOworICB2b2lkIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jbGFzcyA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfdW5pb25fZGVmaW5pdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHR1bmlvbik7CisgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3VuaW9uX2NsYXNzKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHVuaW9uLCB0X2ZpZWxkKiB0ZmllbGQpOworICB2b2lkIGdlbmVyYXRlX2NzaGFycF93Y2ZmYXVsdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfcmVhZGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9yZXN1bHRfd3JpdGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3Rvc3RyaW5nKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9lcXVhbHMoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X2hhc2hjb2RlKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3VuaW9uX3JlYWRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHR1bmlvbik7CisKKyAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VwYXJhdGVfc2VydmljZV9pbnRlcmZhY2VzKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3N5bmNfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfYXN5bmNfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfY29tYmluZWRfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2lsdmVybGlnaHRfYXN5bmNfbWV0aG9kcyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXJfc3luYyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcl9hc3luYyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIGZ1bmN0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uX2FzeW5jKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIGZ1bmN0aW9uKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Byb3BlcnR5bGVzcyA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2xpc3QqIGxpc3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZWxlbWVudCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Byb3BlcnR5bGVzcyA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBtYXApOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpOworICB2b2lkIGdlbmVyYXRlX2NzaGFycF9kb2Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKTsKKyAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfZG9jKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZG9jKTsKKyAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfZG9jc3RyaW5nX2NvbW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHN0cmluZyBjb250ZW50cyk7CisKKyAgdm9pZCBzdGFydF9jc2hhcnBfbmFtZXNwYWNlKHN0ZDo6b3N0cmVhbSYgb3V0KTsKKyAgdm9pZCBlbmRfY3NoYXJwX25hbWVzcGFjZShzdGQ6Om9zdHJlYW0mIG91dCk7CisKKyAgc3RkOjpzdHJpbmcgY3NoYXJwX3R5cGVfdXNpbmdzKCk7CisgIHN0ZDo6c3RyaW5nIGNzaGFycF90aHJpZnRfdXNpbmdzKCk7CisKKyAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NvdW50YWluZXIgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5faW5pdCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9wYXJhbSA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXF1aXJlZCA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgYmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHRiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NvbnRhaW5lciA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX3BhcmFtID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVxdWlyZWQgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQgPSBmYWxzZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmNfYmVnaW4odF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luY19lbmQodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luYyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyBwcm9wX25hbWUodF9maWVsZCogdGZpZWxkLCBib29sIHN1cHByZXNzX21hcHBpbmcgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGdldF9lbnVtX2NsYXNzX25hbWUodF90eXBlKiB0eXBlKTsKKworICBib29sIGZpZWxkX2hhc19kZWZhdWx0KHRfZmllbGQqIHRmaWVsZCkgeyByZXR1cm4gdGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMOyB9CisKKyAgYm9vbCBmaWVsZF9pc19yZXF1aXJlZCh0X2ZpZWxkKiB0ZmllbGQpIHsgcmV0dXJuIHRmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQ7IH0KKworICBib29sIHR5cGVfY2FuX2JlX251bGwodF90eXBlKiB0dHlwZSkgeworICAgIHdoaWxlICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgICB0dHlwZSA9ICgodF90eXBlZGVmKil0dHlwZSktPmdldF90eXBlKCk7CisgICAgfQorCisgICAgcmV0dXJuIHR0eXBlLT5pc19jb250YWluZXIoKSB8fCB0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkKKyAgICAgICAgICAgfHwgdHR5cGUtPmlzX3N0cmluZygpOworICB9CisKK3ByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIG5hbWVzcGFjZV9uYW1lXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2VfOworICBzdGQ6OnN0cmluZyBuYW1lc3BhY2VfZGlyXzsKKyAgYm9vbCBhc3luY187CisgIGJvb2wgbnVsbGFibGVfOworICBib29sIHVuaW9uXzsKKyAgYm9vbCBoYXNoY29kZV87CisgIGJvb2wgc2VyaWFsaXplXzsKKyAgYm9vbCB3Y2ZfOworICBzdGQ6OnN0cmluZyB3Y2ZfbmFtZXNwYWNlXzsKKworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBjc2hhcnBfa2V5d29yZHM7CisgIHN0ZDo6dmVjdG9yPG1lbWJlcl9tYXBwaW5nX3Njb3BlPiAgbWVtYmVyX21hcHBpbmdfc2NvcGVzOworCisgIHZvaWQgaW5pdF9rZXl3b3JkcygpOworICBzdGQ6OnN0cmluZyBub3JtYWxpemVfbmFtZShzdGQ6OnN0cmluZyBuYW1lKTsKKyAgc3RkOjpzdHJpbmcgbWFrZV92YWxpZF9jc2hhcnBfaWRlbnRpZmllcihzdGQ6OnN0cmluZyBjb25zdCYgZnJvbU5hbWUpOworICB2b2lkIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKHZvaWQqIHNjb3BlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHN0cnVjdG5hbWUpOworICB2b2lkIGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZyh2b2lkKiBzY29wZSk7CisgIHN0cmluZyBnZXRfbWFwcGVkX21lbWJlcl9uYW1lKHN0cmluZyBvbGRuYW1lKTsKK307CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKKyAgbmFtZXNwYWNlX25hbWVfID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoImNzaGFycCIpOworCisgIHN0cmluZyBkaXIgPSBuYW1lc3BhY2VfbmFtZV87CisgIHN0cmluZyBzdWJkaXIgPSBnZXRfb3V0X2RpcigpLmNfc3RyKCk7CisgIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKKworICB3aGlsZSAoKGxvYyA9IGRpci5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykgeworICAgIHN1YmRpciA9IHN1YmRpciArICIvIiArIGRpci5zdWJzdHIoMCwgbG9jKTsKKyAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7CisgICAgZGlyID0gZGlyLnN1YnN0cihsb2MgKyAxKTsKKyAgfQorICBpZiAoZGlyLnNpemUoKSA+IDApIHsKKyAgICBzdWJkaXIgPSBzdWJkaXIgKyAiLyIgKyBkaXI7CisgICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOworICB9CisKKyAgbmFtZXNwYWNlX2Rpcl8gPSBzdWJkaXI7CisgIGluaXRfa2V5d29yZHMoKTsKKworICB3aGlsZSggISBtZW1iZXJfbWFwcGluZ19zY29wZXMuZW1wdHkoKSkgeworICAgIGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZyggbWVtYmVyX21hcHBpbmdfc2NvcGVzLmJhY2soKS5zY29wZV9tZW1iZXIpOworICB9CisKKyAgcHZlcmJvc2UoIkMjIG9wdGlvbnM6XG4iKTsKKyAgcHZlcmJvc2UoIi0gYXN5bmMgLi4uLi4uICVzXG4iLCAoYXN5bmNfID8gIk9OIiA6ICJvZmYiKSk7CisgIHB2ZXJib3NlKCItIG51bGxhYmxlIC4uLiAlc1xuIiwgKG51bGxhYmxlXyA/ICJPTiIgOiAib2ZmIikpOworICBwdmVyYm9zZSgiLSB1bmlvbiAuLi4uLi4gJXNcbiIsICh1bmlvbl8gPyAiT04iIDogIm9mZiIpKTsKKyAgcHZlcmJvc2UoIi0gaGFzaGNvZGUgLi4uICVzXG4iLCAoaGFzaGNvZGVfID8gIk9OIiA6ICJvZmYiKSk7CisgIHB2ZXJib3NlKCItIHNlcmlhbGl6ZSAuLiAlc1xuIiwgKHNlcmlhbGl6ZV8gPyAiT04iIDogIm9mZiIpKTsKKyAgcHZlcmJvc2UoIi0gd2NmIC4uLi4uLi4uICVzXG4iLCAod2NmXyA/ICJPTiIgOiAib2ZmIikpOworfQorCitzdGQ6OnN0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6Om5vcm1hbGl6ZV9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpIHsKKyAgc3RyaW5nIHRtcChuYW1lKTsKKyAgc3RkOjp0cmFuc2Zvcm0odG1wLmJlZ2luKCksIHRtcC5lbmQoKSwgdG1wLmJlZ2luKCksIHN0YXRpY19jYXN0PGludCAoKikoaW50KT4oc3RkOjp0b2xvd2VyKSk7CisKKyAgLy8gdW4tY29uZmxpY3Qga2V5d29yZHMgYnkgcHJlZml4aW5nIHdpdGggIkAiCisgIGlmIChjc2hhcnBfa2V5d29yZHMuZmluZCh0bXApICE9IGNzaGFycF9rZXl3b3Jkcy5lbmQoKSkgeworICAgIHJldHVybiAiQCIgKyBuYW1lOworICB9CisKKyAgLy8gbm8gY2hhbmdlcyBuZWNlc3NhcnkKKyAgcmV0dXJuIG5hbWU7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjppbml0X2tleXdvcmRzKCkgeworICBjc2hhcnBfa2V5d29yZHMuY2xlYXIoKTsKKworICAvLyBDIyBrZXl3b3JkcworICBjc2hhcnBfa2V5d29yZHNbImFic3RyYWN0Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImFzIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImJhc2UiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siYm9vbCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJicmVhayJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJieXRlIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImNhc2UiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siY2F0Y2giXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siY2hhciJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJjaGVja2VkIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImNsYXNzIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImNvbnN0Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImNvbnRpbnVlIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImRlY2ltYWwiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siZGVmYXVsdCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJkZWxlZ2F0ZSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJkbyJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJkb3VibGUiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siZWxzZSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJlbnVtIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImV2ZW50Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImV4cGxpY2l0Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImV4dGVybiJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJmYWxzZSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJmaW5hbGx5Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImZpeGVkIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImZsb2F0Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImZvciJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJmb3JlYWNoIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImdvdG8iXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siaWYiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siaW1wbGljaXQiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siaW4iXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siaW50Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImludGVyZmFjZSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJpbnRlcm5hbCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJpcyJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJsb2NrIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImxvbmciXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sibmFtZXNwYWNlIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbIm5ldyJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJudWxsIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbIm9iamVjdCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJvcGVyYXRvciJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJvdXQiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sib3ZlcnJpZGUiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sicGFyYW1zIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInByaXZhdGUiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sicHJvdGVjdGVkIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInB1YmxpYyJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJyZWFkb25seSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJyZWYiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sicmV0dXJuIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInNieXRlIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInNlYWxlZCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJzaG9ydCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJzaXplb2YiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sic3RhY2thbGxvYyJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJzdGF0aWMiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sic3RyaW5nIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInN0cnVjdCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJzd2l0Y2giXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sidGhpcyJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJ0aHJvdyJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJ0cnVlIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInRyeSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJ0eXBlb2YiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sidWludCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJ1bG9uZyJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJ1bmNoZWNrZWQiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sidW5zYWZlIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInVzaG9ydCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJ1c2luZyJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJ2aXJ0dWFsIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInZvaWQiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sidm9sYXRpbGUiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sid2hpbGUiXSA9IDE7CisKKyAgLy8gQyMgY29udGV4dHVhbCBrZXl3b3JkcworICBjc2hhcnBfa2V5d29yZHNbImFkZCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJhbGlhcyJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJhc2NlbmRpbmciXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siYXN5bmMiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siYXdhaXQiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siZGVzY2VuZGluZyJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJkeW5hbWljIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImZyb20iXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1siZ2V0Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImdsb2JhbCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJncm91cCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJpbnRvIl0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbImpvaW4iXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sibGV0Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbIm9yZGVyYnkiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sicGFydGlhbCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJyZW1vdmUiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sic2VsZWN0Il0gPSAxOworICBjc2hhcnBfa2V5d29yZHNbInNldCJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJ2YWx1ZSJdID0gMTsKKyAgY3NoYXJwX2tleXdvcmRzWyJ2YXIiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sid2hlcmUiXSA9IDE7CisgIGNzaGFycF9rZXl3b3Jkc1sieWllbGQiXSA9IDE7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpzdGFydF9jc2hhcnBfbmFtZXNwYWNlKG9zdHJlYW0mIG91dCkgeworICBpZiAoIW5hbWVzcGFjZV9uYW1lXy5lbXB0eSgpKSB7CisgICAgb3V0IDw8ICJuYW1lc3BhY2UgIiA8PCBuYW1lc3BhY2VfbmFtZV8gPDwgIlxuIjsKKyAgICBzY29wZV91cChvdXQpOworICB9Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjplbmRfY3NoYXJwX25hbWVzcGFjZShvc3RyZWFtJiBvdXQpIHsKKyAgaWYgKCFuYW1lc3BhY2VfbmFtZV8uZW1wdHkoKSkgeworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgfQorfQorCitzdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjpjc2hhcnBfdHlwZV91c2luZ3MoKSB7CisgIHJldHVybiBzdHJpbmcoKSArICJ1c2luZyBTeXN0ZW07XG4iICsgInVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucztcbiIKKyAgICAgICAgICsgInVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljO1xuIiArICJ1c2luZyBTeXN0ZW0uVGV4dDtcbiIgKyAidXNpbmcgU3lzdGVtLklPO1xuIgorICAgICAgICAgKyAoKGFzeW5jXykgPyAidXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrcztcbiIgOiAiIikgKyAidXNpbmcgVGhyaWZ0O1xuIgorICAgICAgICAgKyAidXNpbmcgVGhyaWZ0LkNvbGxlY3Rpb25zO1xuIiArICgoc2VyaWFsaXplXyB8fCB3Y2ZfKSA/ICIjaWYgIVNJTFZFUkxJR0hUXG4iIDogIiIpCisgICAgICAgICArICgoc2VyaWFsaXplXyB8fCB3Y2ZfKSA/ICJ1c2luZyBTeXN0ZW0uWG1sLlNlcmlhbGl6YXRpb247XG4iIDogIiIpCisgICAgICAgICArICgoc2VyaWFsaXplXyB8fCB3Y2ZfKSA/ICIjZW5kaWZcbiIgOiAiIikKKyAgICAgICAgICsgInVzaW5nIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb247XG4iOworfQorCitzdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjpjc2hhcnBfdGhyaWZ0X3VzaW5ncygpIHsKKyAgcmV0dXJuIHN0cmluZygpICsgInVzaW5nIFRocmlmdC5Qcm90b2NvbDtcbiIgKyAidXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDtcbiI7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7Cit9Cit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgICh2b2lkKXR0eXBlZGVmOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIHN0cmluZyBmX2VudW1fbmFtZSA9IG5hbWVzcGFjZV9kaXJfICsgIi8iICsgKHRlbnVtLT5nZXRfbmFtZSgpKSArICIuY3MiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfZW51bTsKKyAgZl9lbnVtLm9wZW4oZl9lbnVtX25hbWUuY19zdHIoKSk7CisKKyAgZl9lbnVtIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7CisKKyAgc3RhcnRfY3NoYXJwX25hbWVzcGFjZShmX2VudW0pOworCisgIGdlbmVyYXRlX2NzaGFycF9kb2MoZl9lbnVtLCB0ZW51bSk7CisKKyAgaW5kZW50KGZfZW51bSkgPDwgInB1YmxpYyBlbnVtICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIlxuIjsKKyAgc2NvcGVfdXAoZl9lbnVtKTsKKworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgZ2VuZXJhdGVfY3NoYXJwX2RvYyhmX2VudW0sICpjX2l0ZXIpOworCisgICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICBpbmRlbnQoZl9lbnVtKSA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgdmFsdWUgPDwgIiwiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKGZfZW51bSk7CisKKyAgZW5kX2NzaGFycF9uYW1lc3BhY2UoZl9lbnVtKTsKKworICBmX2VudW0uY2xvc2UoKTsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKSB7CisgIGlmIChjb25zdHMuZW1wdHkoKSkgeworICAgIHJldHVybjsKKyAgfQorICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IG5hbWVzcGFjZV9kaXJfICsgJy8nICsgcHJvZ3JhbV9uYW1lXyArICIuQ29uc3RhbnRzLmNzIjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2NvbnN0czsKKyAgZl9jb25zdHMub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOworCisgIGZfY29uc3RzIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGNzaGFycF90eXBlX3VzaW5ncygpIDw8IGVuZGw7CisKKyAgc3RhcnRfY3NoYXJwX25hbWVzcGFjZShmX2NvbnN0cyk7CisKKyAgaW5kZW50KGZfY29uc3RzKSA8PCAicHVibGljIHN0YXRpYyBjbGFzcyAiIDw8IG1ha2VfdmFsaWRfY3NoYXJwX2lkZW50aWZpZXIocHJvZ3JhbV9uYW1lXykKKyAgICAgICAgICAgICAgICAgICA8PCAiQ29uc3RhbnRzIiA8PCBlbmRsOworICBzY29wZV91cChmX2NvbnN0cyk7CisKKyAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY19pdGVyOworICBib29sIG5lZWRfc3RhdGljX2NvbnN0cnVjdG9yID0gZmFsc2U7CisgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgZ2VuZXJhdGVfY3NoYXJwX2RvYyhmX2NvbnN0cywgKCpjX2l0ZXIpKTsKKyAgICBpZiAocHJpbnRfY29uc3RfdmFsdWUoZl9jb25zdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF92YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSkpIHsKKyAgICAgIG5lZWRfc3RhdGljX2NvbnN0cnVjdG9yID0gdHJ1ZTsKKyAgICB9CisgIH0KKworICBpZiAobmVlZF9zdGF0aWNfY29uc3RydWN0b3IpIHsKKyAgICBwcmludF9jb25zdF9jb25zdHJ1Y3RvcihmX2NvbnN0cywgY29uc3RzKTsKKyAgfQorCisgIHNjb3BlX2Rvd24oZl9jb25zdHMpOworICBlbmRfY3NoYXJwX25hbWVzcGFjZShmX2NvbnN0cyk7CisgIGZfY29uc3RzLmNsb3NlKCk7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpwcmludF9jb25zdF9kZWZfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKCh0X3N0cnVjdCopdHlwZSk7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIGZpZWxkID0gTlVMTDsKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7CisgICAgICAgICAgZmllbGQgPSAoKmZfaXRlcik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZCA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuIiA8PCBwcm9wX25hbWUoZmllbGQpIDw8ICIgPSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgICAgY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKCh0X3N0cnVjdCopdHlwZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgc3RyaW5nIGtleSA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiWyIgPDwga2V5IDw8ICJdIgorICAgICAgICAgICAgICAgICAgPDwgIiA9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlOworICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9CisKKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBldHlwZSwgKnZfaXRlcik7CisgICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuQWRkKCIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OnByaW50X2NvbnN0X2NvbnN0cnVjdG9yKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKSB7CisgIGluZGVudChvdXQpIDw8ICJzdGF0aWMgIiA8PCBtYWtlX3ZhbGlkX2NzaGFycF9pZGVudGlmaWVyKHByb2dyYW1fbmFtZV8pLmNfc3RyKCkgPDwgIkNvbnN0YW50cygpIgorICAgICAgICAgICAgICA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgc3RyaW5nIG5hbWUgPSAoKmNfaXRlciktPmdldF9uYW1lKCk7CisgICAgdF90eXBlKiB0eXBlID0gKCpjX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKworICAgIHByaW50X2NvbnN0X2RlZl92YWx1ZShvdXQsIG5hbWUsIHR5cGUsIHZhbHVlKTsKKyAgfQorICBzY29wZV9kb3duKG91dCk7Cit9CisKKy8vIGl0IHNlZW1zIGxpa2UgYWxsIHRoYXQgbWV0aG9kcyB0aGF0IGNhbGwgdGhpcyBhcmUgdXNpbmcgaW5fc3RhdGljIHRvIGJlIHRoZSBvcHBvc2l0ZSBvZiB3aGF0IGl0CisvLyB3b3VsZCBpbXBseQorYm9vbCB0X2NzaGFycF9nZW5lcmF0b3I6OnByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX3N0YXRpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlZnZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5lZWR0eXBlKSB7CisgIGluZGVudChvdXQpOworICBib29sIG5lZWRfc3RhdGljX2NvbnN0cnVjdGlvbiA9ICFpbl9zdGF0aWM7CisgIHdoaWxlICh0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICB0eXBlID0gKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpOworICB9CisKKyAgaWYgKCFkZWZ2YWwgfHwgbmVlZHR5cGUpIHsKKyAgICBvdXQgPDwgKGluX3N0YXRpYyA/ICIiIDogdHlwZS0+aXNfYmFzZV90eXBlKCkgPyAicHVibGljIGNvbnN0ICIgOiAicHVibGljIHN0YXRpYyAiKQorICAgICAgICA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiOworICB9CisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHN0cmluZyB2MiA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIHR5cGUsIHZhbHVlKTsKKyAgICBvdXQgPDwgbmFtZSA8PCAiID0gIiA8PCB2MiA8PCAiOyIgPDwgZW5kbDsKKyAgICBuZWVkX3N0YXRpY19jb25zdHJ1Y3Rpb24gPSBmYWxzZTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBvdXQgPDwgbmFtZSA8PCAiID0gIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIuIiA8PCB2YWx1ZS0+Z2V0X2lkZW50aWZpZXJfbmFtZSgpCisgICAgICAgIDw8ICI7IiA8PCBlbmRsOworICAgIG5lZWRfc3RhdGljX2NvbnN0cnVjdGlvbiA9IGZhbHNlOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBvdXQgPDwgbmFtZSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICBvdXQgPDwgbmFtZSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7CisgICAgb3V0IDw8IG5hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKCk7IiA8PCBlbmRsOworICB9CisKKyAgaWYgKGRlZnZhbCAmJiAhdHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgIXR5cGUtPmlzX2VudW0oKSkgeworICAgIHByaW50X2NvbnN0X2RlZl92YWx1ZShvdXQsIG5hbWUsIHR5cGUsIHZhbHVlKTsKKyAgfQorCisgIHJldHVybiBuZWVkX3N0YXRpY19jb25zdHJ1Y3Rpb247Cit9CisKK3N0ZDo6c3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgKHZvaWQpbmFtZTsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlbmRlcjsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmVuZGVyIDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJlbmRlciA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZW5kZXIgPDwgdHlwZS0+Z2V0X25hbWUoKSA8PCAiLiIgPDwgdmFsdWUtPmdldF9pZGVudGlmaWVyX25hbWUoKTsKKyAgfSBlbHNlIHsKKyAgICBzdHJpbmcgdCA9IHRtcCgidG1wIik7CisgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCB0LCB0eXBlLCB2YWx1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7CisgICAgcmVuZGVyIDw8IHQ7CisgIH0KKworICByZXR1cm4gcmVuZGVyLnN0cigpOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGlmICh1bmlvbl8gJiYgdHN0cnVjdC0+aXNfdW5pb24oKSkgeworICAgIGdlbmVyYXRlX2NzaGFycF91bmlvbih0c3RydWN0KTsKKyAgfSBlbHNlIHsKKyAgICBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKKyAgfQorfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgeworICBzdHJpbmcgZl9zdHJ1Y3RfbmFtZSA9IG5hbWVzcGFjZV9kaXJfICsgIi8iICsgKHRzdHJ1Y3QtPmdldF9uYW1lKCkpICsgIi5jcyI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zdHJ1Y3Q7CisKKyAgZl9zdHJ1Y3Qub3BlbihmX3N0cnVjdF9uYW1lLmNfc3RyKCkpOworCisgIGZfc3RydWN0IDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGNzaGFycF90eXBlX3VzaW5ncygpIDw8IGNzaGFycF90aHJpZnRfdXNpbmdzKCkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X2RlZmluaXRpb24oZl9zdHJ1Y3QsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7CisKKyAgZl9zdHJ1Y3QuY2xvc2UoKTsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQpIHsKKworICBpZiAoIWluX2NsYXNzKSB7CisgICAgc3RhcnRfY3NoYXJwX25hbWVzcGFjZShvdXQpOworICB9CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfY3NoYXJwX2RvYyhvdXQsIHRzdHJ1Y3QpOworICBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcodHN0cnVjdCk7CisKKyAgaW5kZW50KG91dCkgPDwgIiNpZiAhU0lMVkVSTElHSFQiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJbU2VyaWFsaXphYmxlXSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiNlbmRpZiIgPDwgZW5kbDsKKyAgaWYgKChzZXJpYWxpemVfIHx8IHdjZl8pICYmICFpc19leGNlcHRpb24pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiW0RhdGFDb250cmFjdChOYW1lc3BhY2U9XCIiIDw8IHdjZl9uYW1lc3BhY2VfIDw8ICJcIildIgorICAgICAgICAgICAgICAgIDw8IGVuZGw7IC8vIGRvIG5vdCBtYWtlIGV4Y2VwdGlvbiBjbGFzc2VzIGRpcmVjdGx5IFdDRiBzZXJpYWxpemFibGUsIHdlIHByb3ZpZGUgYQorICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlcGFyYXRlICJmYXVsdCIgZm9yIHRoYXQKKyAgfQorICBib29sIGlzX2ZpbmFsID0gKHRzdHJ1Y3QtPmFubm90YXRpb25zXy5maW5kKCJmaW5hbCIpICE9IHRzdHJ1Y3QtPmFubm90YXRpb25zXy5lbmQoKSk7CisKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IChpc19maW5hbCA/ICJzZWFsZWQgIiA6ICIiKSA8PCAicGFydGlhbCBjbGFzcyAiCisgICAgICAgICAgICAgIDw8IG5vcm1hbGl6ZV9uYW1lKHRzdHJ1Y3QtPmdldF9uYW1lKCkpIDw8ICIgOiAiOworCisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBvdXQgPDwgIlRFeGNlcHRpb24sICI7CisgIH0KKyAgb3V0IDw8ICJUQmFzZSI7CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgc2NvcGVfdXAob3V0KTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIC8vIG1ha2UgcHJpdmF0ZSBtZW1iZXJzIHdpdGggcHVibGljIFByb3BlcnRpZXMKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIC8vIGlmIHRoZSBmaWVsZCBpcyByZXF1aWVkLCB0aGVuIHdlIHVzZSBhdXRvLXByb3BlcnRpZXMKKyAgICBpZiAoIWZpZWxkX2lzX3JlcXVpcmVkKCgqbV9pdGVyKSkgJiYgKCFudWxsYWJsZV8gfHwgZmllbGRfaGFzX2RlZmF1bHQoKCptX2l0ZXIpKSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJwcml2YXRlICIgPDwgZGVjbGFyZV9maWVsZCgqbV9pdGVyLCBmYWxzZSwgIl8iKSA8PCBlbmRsOworICAgIH0KKyAgfQorICBvdXQgPDwgZW5kbDsKKworICBib29sIGhhc19ub25fcmVxdWlyZWRfZmllbGRzID0gZmFsc2U7CisgIGJvb2wgaGFzX25vbl9yZXF1aXJlZF9kZWZhdWx0X3ZhbHVlX2ZpZWxkcyA9IGZhbHNlOworICBib29sIGhhc19yZXF1aXJlZF9maWVsZHMgPSBmYWxzZTsKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGdlbmVyYXRlX2NzaGFycF9kb2Mob3V0LCAqbV9pdGVyKTsKKyAgICBnZW5lcmF0ZV9wcm9wZXJ0eShvdXQsICptX2l0ZXIsIHRydWUsIHRydWUpOworICAgIGJvb2wgaXNfcmVxdWlyZWQgPSBmaWVsZF9pc19yZXF1aXJlZCgoKm1faXRlcikpOworICAgIGJvb2wgaGFzX2RlZmF1bHQgPSBmaWVsZF9oYXNfZGVmYXVsdCgoKm1faXRlcikpOworICAgIGlmIChpc19yZXF1aXJlZCkgeworICAgICAgaGFzX3JlcXVpcmVkX2ZpZWxkcyA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChoYXNfZGVmYXVsdCkgeworICAgICAgICBoYXNfbm9uX3JlcXVpcmVkX2RlZmF1bHRfdmFsdWVfZmllbGRzID0gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIGhhc19ub25fcmVxdWlyZWRfZmllbGRzID0gdHJ1ZTsKKyAgICB9CisgIH0KKworICBib29sIGdlbmVyYXRlX2lzc2V0ID0gKG51bGxhYmxlXyAmJiBoYXNfbm9uX3JlcXVpcmVkX2RlZmF1bHRfdmFsdWVfZmllbGRzKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgKCFudWxsYWJsZV8gJiYgaGFzX25vbl9yZXF1aXJlZF9maWVsZHMpOworICBpZiAoZ2VuZXJhdGVfaXNzZXQpIHsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBpZiAoc2VyaWFsaXplXyB8fCB3Y2ZfKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltYbWxJZ25vcmVdIC8vIFhtbFNlcmlhbGl6ZXIiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiW0RhdGFNZW1iZXIoT3JkZXIgPSAxKV0gIC8vIFhtbE9iamVjdFNlcmlhbGl6ZXIsIERhdGFDb250cmFjdEpzb25TZXJpYWxpemVyLCBldGMuIgorICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIElzc2V0IF9faXNzZXQ7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIjaWYgIVNJTFZFUkxJR0hUIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJbU2VyaWFsaXphYmxlXSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiI2VuZGlmIiA8PCBlbmRsOworICAgIGlmIChzZXJpYWxpemVfIHx8IHdjZl8pIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJbRGF0YUNvbnRyYWN0XSIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBzdHJ1Y3QgSXNzZXQgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBib29sIGlzX3JlcXVpcmVkID0gZmllbGRfaXNfcmVxdWlyZWQoKCptX2l0ZXIpKTsKKyAgICAgIGJvb2wgaGFzX2RlZmF1bHQgPSBmaWVsZF9oYXNfZGVmYXVsdCgoKm1faXRlcikpOworICAgICAgLy8gaWYgaXQgaXMgcmVxdWlyZWQsIGRvbid0IG5lZWQgSXNzZXQgZm9yIHRoYXQgdmFyaWFibGUKKyAgICAgIC8vIGlmIGl0IGlzIG5vdCByZXF1aXJlZCwgaWYgaXQgaGFzIGEgZGVmYXVsdCB2YWx1ZSwgd2UgbmVlZCB0byBnZW5lcmF0ZSBJc3NldAorICAgICAgLy8gaWYgd2UgYXJlIG5vdCBudWxsYWJsZSwgdGhlbiB3ZSBnZW5lcmF0ZSBJc3NldAorICAgICAgaWYgKCFpc19yZXF1aXJlZCAmJiAoIW51bGxhYmxlXyB8fCBoYXNfZGVmYXVsdCkpIHsKKyAgICAgICAgaWYgKHNlcmlhbGl6ZV8gfHwgd2NmXykgeworICAgICAgICAgIGluZGVudChvdXQpIDw8ICJbRGF0YU1lbWJlcl0iIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBib29sICIgPDwgbm9ybWFsaXplX25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBpZiAoZ2VuZXJhdGVfaXNzZXQgJiYgKHNlcmlhbGl6ZV8gfHwgd2NmXykpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICIjcmVnaW9uIFhtbFNlcmlhbGl6ZXIgc3VwcG9ydCIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICAgIGJvb2wgaXNfcmVxdWlyZWQgPSBmaWVsZF9pc19yZXF1aXJlZCgoKm1faXRlcikpOworICAgICAgICBib29sIGhhc19kZWZhdWx0ID0gZmllbGRfaGFzX2RlZmF1bHQoKCptX2l0ZXIpKTsKKyAgICAgICAgLy8gaWYgaXQgaXMgcmVxdWlyZWQsIGRvbid0IG5lZWQgSXNzZXQgZm9yIHRoYXQgdmFyaWFibGUKKyAgICAgICAgLy8gaWYgaXQgaXMgbm90IHJlcXVpcmVkLCBpZiBpdCBoYXMgYSBkZWZhdWx0IHZhbHVlLCB3ZSBuZWVkIHRvIGdlbmVyYXRlIElzc2V0CisgICAgICAgIC8vIGlmIHdlIGFyZSBub3QgbnVsbGFibGUsIHRoZW4gd2UgZ2VuZXJhdGUgSXNzZXQKKyAgICAgICAgaWYgKCFpc19yZXF1aXJlZCAmJiAoIW51bGxhYmxlXyB8fCBoYXNfZGVmYXVsdCkpIHsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGJvb2wgU2hvdWxkU2VyaWFsaXplIiA8PCBwcm9wX25hbWUoKCptX2l0ZXIpKSA8PCAiKCkiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiBfX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaW5kZW50KG91dCkgPDwgIiNlbmRyZWdpb24gWG1sU2VyaWFsaXplciBzdXBwb3J0IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgLy8gV2UgYWx3YXlzIHdhbnQgYSBkZWZhdWx0LCBubyBhcmd1bWVudCBjb25zdHJ1Y3RvciBmb3IgUmVhZGluZworICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgbm9ybWFsaXplX25hbWUodHN0cnVjdC0+Z2V0X25hbWUoKSkgPDwgIigpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X3R5cGUqIHQgPSAoKm1faXRlciktPmdldF90eXBlKCk7CisgICAgd2hpbGUgKHQtPmlzX3R5cGVkZWYoKSkgeworICAgICAgdCA9ICgodF90eXBlZGVmKil0KS0+Z2V0X3R5cGUoKTsKKyAgICB9CisgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgICAgaWYgKGZpZWxkX2lzX3JlcXVpcmVkKCgqbV9pdGVyKSkpIHsKKyAgICAgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCAidGhpcy4iICsgcHJvcF9uYW1lKCptX2l0ZXIpLCB0LCAoKm1faXRlciktPmdldF92YWx1ZSgpLCB0cnVlLCB0cnVlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMuXyIgKyAoKm1faXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOworICAgICAgICAvLyBPcHRpb25hbHMgd2l0aCBkZWZhdWx0cyBhcmUgbWFya2VkIHNldAorICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy5fX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiID0gdHJ1ZTsiCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaWYgKGhhc19yZXF1aXJlZF9maWVsZHMpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCI7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgaWYgKGZpZWxkX2lzX3JlcXVpcmVkKCgqbV9pdGVyKSkpIHsKKyAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgIiwgIjsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwgdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiAiIDw8IG5vcm1hbGl6ZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgICB9CisgICAgfQorICAgIG91dCA8PCAiKSA6IHRoaXMoKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgaWYgKGZpZWxkX2lzX3JlcXVpcmVkKCgqbV9pdGVyKSkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBwcm9wX25hbWUoKCptX2l0ZXIpKSA8PCAiID0gIiA8PCBub3JtYWxpemVfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8ICI7IgorICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgfQorICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7CisgIGlmIChpc19yZXN1bHQpIHsKKyAgICBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3Jlc3VsdF93cml0ZXIob3V0LCB0c3RydWN0KTsKKyAgfSBlbHNlIHsKKyAgICBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOworICB9CisgIGlmIChoYXNoY29kZV8pIHsKKyAgICBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X2VxdWFscyhvdXQsIHRzdHJ1Y3QpOworICAgIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfaGFzaGNvZGUob3V0LCB0c3RydWN0KTsKKyAgfQorICBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3Rvc3RyaW5nKG91dCwgdHN0cnVjdCk7CisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gZ2VuZXJhdGUgYSBjb3JyZXNwb25kaW5nIFdDRiBmYXVsdCB0byB3cmFwIHRoZSBleGNlcHRpb24KKyAgaWYgKChzZXJpYWxpemVfIHx8IHdjZl8pICYmIGlzX2V4Y2VwdGlvbikgeworICAgIGdlbmVyYXRlX2NzaGFycF93Y2ZmYXVsdChvdXQsIHRzdHJ1Y3QpOworICB9CisKKyAgY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKHRzdHJ1Y3QpOworICBpZiAoIWluX2NsYXNzKSB7CisgICAgZW5kX2NzaGFycF9uYW1lc3BhY2Uob3V0KTsKKyAgfQorfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3djZmZhdWx0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIjaWYgIVNJTFZFUkxJR0hUIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiW1NlcmlhbGl6YWJsZV0iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIjZW5kaWYiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJbRGF0YUNvbnRyYWN0XSIgPDwgZW5kbDsKKyAgYm9vbCBpc19maW5hbCA9ICh0c3RydWN0LT5hbm5vdGF0aW9uc18uZmluZCgiZmluYWwiKSAhPSB0c3RydWN0LT5hbm5vdGF0aW9uc18uZW5kKCkpOworCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCAoaXNfZmluYWwgPyAic2VhbGVkICIgOiAiIikgPDwgInBhcnRpYWwgY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgIDw8ICJGYXVsdCIgPDwgZW5kbDsKKworICBzY29wZV91cChvdXQpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgLy8gbWFrZSBwcml2YXRlIG1lbWJlcnMgd2l0aCBwdWJsaWMgUHJvcGVydGllcworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgLy8gaWYgdGhlIGZpZWxkIGlzIHJlcXVpZWQsIHRoZW4gd2UgdXNlIGF1dG8tcHJvcGVydGllcworICAgIGlmICghZmllbGRfaXNfcmVxdWlyZWQoKCptX2l0ZXIpKSAmJiAoIW51bGxhYmxlXyB8fCBmaWVsZF9oYXNfZGVmYXVsdCgoKm1faXRlcikpKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgIiA8PCBkZWNsYXJlX2ZpZWxkKCptX2l0ZXIsIGZhbHNlLCAiXyIpIDw8IGVuZGw7CisgICAgfQorICB9CisgIG91dCA8PCBlbmRsOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9wcm9wZXJ0eShvdXQsICptX2l0ZXIsIHRydWUsIGZhbHNlKTsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCBSZWFkIChUUHJvdG9jb2wgaXByb3QpIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaXByb3QuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAidHJ5IiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBSZXF1aXJlZCB2YXJpYWJsZXMgYXJlbid0IGluIF9faXNzZXQsIHNvIHdlIG5lZWQgdG1wIHZhcnMgdG8gY2hlY2sgdGhlbQorICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaWVsZF9pc19yZXF1aXJlZCgoKmZfaXRlcikpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiYm9vbCBpc3NldF8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gZmFsc2U7IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJURmllbGQgZmllbGQ7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpcHJvdC5SZWFkU3RydWN0QmVnaW4oKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgIndoaWxlICh0cnVlKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICBpbmRlbnQob3V0KSA8PCAiZmllbGQgPSBpcHJvdC5SZWFkRmllbGRCZWdpbigpOyIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAiaWYgKGZpZWxkLlR5cGUgPT0gVFR5cGUuU3RvcCkgeyAiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZC5JRCkiIDw8IGVuZGw7CisKKyAgc2NvcGVfdXAob3V0KTsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGJvb2wgaXNfcmVxdWlyZWQgPSBmaWVsZF9pc19yZXF1aXJlZCgoKmZfaXRlcikpOworICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgImlmIChmaWVsZC5UeXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlcik7CisgICAgaWYgKGlzX3JlcXVpcmVkKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaXNzZXRfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHRydWU7IiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyAiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgVFByb3RvY29sVXRpbC5Ta2lwKGlwcm90LCBmaWVsZC5UeXBlKTsiCisgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6ICIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJUUHJvdG9jb2xVdGlsLlNraXAoaXByb3QsIGZpZWxkLlR5cGUpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICBzY29wZV9kb3duKG91dCk7CisKKyAgaW5kZW50KG91dCkgPDwgImlwcm90LlJlYWRGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKG91dCk7CisKKyAgaW5kZW50KG91dCkgPDwgImlwcm90LlJlYWRTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmllbGRfaXNfcmVxdWlyZWQoKCpmX2l0ZXIpKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmICghaXNzZXRfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIikiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIG91dCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICJ0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsICIKKyAgICAgICAgICA8PCAiXCJyZXF1aXJlZCBmaWVsZCAiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIgbm90IHNldFwiKTsiCisgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgfQorICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgaW5kZW50KCkgPDwgImZpbmFsbHkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaXByb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpbmRlbnRfZG93bigpOworCisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIHZvaWQgV3JpdGUoVFByb3RvY29sIG9wcm90KSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgInRyeSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgaW5kZW50KG91dCkgPDwgIlRTdHJ1Y3Qgc3RydWMgPSBuZXcgVFN0cnVjdChcIiIgPDwgbmFtZSA8PCAiXCIpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LldyaXRlU3RydWN0QmVnaW4oc3RydWMpOyIgPDwgZW5kbDsKKworICBpZiAoZmllbGRzLnNpemUoKSA+IDApIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiVEZpZWxkIGZpZWxkID0gbmV3IFRGaWVsZCgpOyIgPDwgZW5kbDsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgYm9vbCBpc19yZXF1aXJlZCA9IGZpZWxkX2lzX3JlcXVpcmVkKCgqZl9pdGVyKSk7CisgICAgICBib29sIGhhc19kZWZhdWx0ID0gZmllbGRfaGFzX2RlZmF1bHQoKCpmX2l0ZXIpKTsKKyAgICAgIGJvb2wgbnVsbF9hbGxvd2VkID0gdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpOworCisgICAgICBpZiAoaXNfcmVxdWlyZWQpCisgICAgICB7CisgICAgICAgIGlmIChudWxsX2FsbG93ZWQpIHsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIiA9PSBudWxsKSIgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgPDwgInRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgIgorICAgICAgICAgICAgICA8PCAiXCJyZXF1aXJlZCBmaWVsZCAiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIgbm90IHNldFwiKTsiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBpZiAobnVsbGFibGVfICYmICFoYXNfZGVmYXVsdCkgeworICAgICAgICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIgIT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChudWxsX2FsbG93ZWQpIHsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgPDwgImlmICgiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIgIT0gbnVsbCAmJiBfX2lzc2V0LiIKKyAgICAgICAgICAgICAgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKSB7IgorICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKF9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICB9CisgICAgICBpbmRlbnQob3V0KSA8PCAiZmllbGQuTmFtZSA9IFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJmaWVsZC5UeXBlID0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJmaWVsZC5JRCA9ICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAib3Byb3QuV3JpdGVGaWVsZEJlZ2luKGZpZWxkKTsiIDw8IGVuZGw7CisKKyAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIpOworCisgICAgICBpbmRlbnQob3V0KSA8PCAib3Byb3QuV3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKyAgICAgIGlmICghaXNfcmVxdWlyZWQpIHsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LldyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAib3Byb3QuV3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgaW5kZW50KCkgPDwgImZpbmFsbHkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpbmRlbnRfZG93bigpOworCisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3Jlc3VsdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgV3JpdGUoVFByb3RvY29sIG9wcm90KSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgInRyeSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgaW5kZW50KG91dCkgPDwgIlRTdHJ1Y3Qgc3RydWMgPSBuZXcgVFN0cnVjdChcIiIgPDwgbmFtZSA8PCAiXCIpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LldyaXRlU3RydWN0QmVnaW4oc3RydWMpOyIgPDwgZW5kbDsKKworICBpZiAoZmllbGRzLnNpemUoKSA+IDApIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiVEZpZWxkIGZpZWxkID0gbmV3IFRGaWVsZCgpOyIgPDwgZW5kbDsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiAiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8ICIgZWxzZSBpZiAiOworICAgICAgfQorCisgICAgICBpZiAobnVsbGFibGVfKSB7CisgICAgICAgIG91dCA8PCAiKHRoaXMuIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiICE9IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgIih0aGlzLl9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgYm9vbCBudWxsX2FsbG93ZWQgPSAhbnVsbGFibGVfICYmIHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgIGlmIChudWxsX2FsbG93ZWQpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IHByb3BfbmFtZSgqZl9pdGVyKSA8PCAiICE9IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgfQorCisgICAgICBpbmRlbnQob3V0KSA8PCAiZmllbGQuTmFtZSA9IFwiIiA8PCBwcm9wX25hbWUoKmZfaXRlcikgPDwgIlwiOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJmaWVsZC5UeXBlID0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJmaWVsZC5JRCA9ICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAib3Byb3QuV3JpdGVGaWVsZEJlZ2luKGZpZWxkKTsiIDw8IGVuZGw7CisKKyAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIpOworCisgICAgICBpbmRlbnQob3V0KSA8PCAib3Byb3QuV3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKworICAgICAgaWYgKG51bGxfYWxsb3dlZCkgeworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IjsKKyAgICB9CisgIH0KKworICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3QuV3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJvcHJvdC5Xcml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiZmluYWxseSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworCisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfdG9zdHJpbmcob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAicHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8ICJTdHJpbmdCdWlsZGVyIF9fc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihcIiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKFwiKTsiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGJvb2wgdXNlRmlyc3RGbGFnID0gZmFsc2U7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKCFmaWVsZF9pc19yZXF1aXJlZCgoKmZfaXRlcikpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiYm9vbCBfX2ZpcnN0ID0gdHJ1ZTsiIDw8IGVuZGw7CisgICAgICB1c2VGaXJzdEZsYWcgPSB0cnVlOworICAgIH0KKyAgICBicmVhazsKKyAgfQorCisgIGJvb2wgaGFkX3JlcXVpcmVkID0gZmFsc2U7IC8vIHNldCB0byB0cnVlIGFmdGVyIGZpcnN0IHJlcXVpcmVkIGZpZWxkIGhhcyBiZWVuIHByb2Nlc3NlZAorCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgYm9vbCBpc19yZXF1aXJlZCA9IGZpZWxkX2lzX3JlcXVpcmVkKCgqZl9pdGVyKSk7CisgICAgYm9vbCBoYXNfZGVmYXVsdCA9IGZpZWxkX2hhc19kZWZhdWx0KCgqZl9pdGVyKSk7CisgICAgaWYgKG51bGxhYmxlXyAmJiAhaGFzX2RlZmF1bHQgJiYgIWlzX3JlcXVpcmVkKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfSBlbHNlIGlmICghaXNfcmVxdWlyZWQpIHsKKyAgICAgIGJvb2wgbnVsbF9hbGxvd2VkID0gdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpOworICAgICAgaWYgKG51bGxfYWxsb3dlZCkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIiAhPSBudWxsICYmIF9faXNzZXQuIgorICAgICAgICAgICAgICAgICAgICA8PCBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImlmIChfX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodXNlRmlyc3RGbGFnICYmICghaGFkX3JlcXVpcmVkKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmKCFfX2ZpcnN0KSB7IF9fc2IuQXBwZW5kKFwiLCBcIik7IH0iIDw8IGVuZGw7CisgICAgICBpZiAoIWlzX3JlcXVpcmVkKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJfX2ZpcnN0ID0gZmFsc2U7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50KG91dCkgPDwgIl9fc2IuQXBwZW5kKFwiIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiOiBcIik7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiX19zYi5BcHBlbmQoXCIsICIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIjogXCIpOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICB0X3R5cGUqIHR0eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgIGlmICh0dHlwZS0+aXNfeGNlcHRpb24oKSB8fCB0dHlwZS0+aXNfc3RydWN0KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJfX3NiLkFwcGVuZCgiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpCisgICAgICAgICAgICAgICAgICA8PCAiPT0gbnVsbCA/IFwiPG51bGw+XCIgOiAiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIuVG9TdHJpbmcoKSk7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiX19zYi5BcHBlbmQoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaWYgKCFpc19yZXF1aXJlZCkgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBoYWRfcmVxdWlyZWQgPSB0cnVlOyAvLyBub3cgX19maXJzdCBtdXN0IGJlIGZhbHNlLCBzbyB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIGl0IGFueW1vcmUKKyAgICB9CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiX19zYi5BcHBlbmQoXCIpXCIpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiBfX3NiLlRvU3RyaW5nKCk7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfdW5pb24odF9zdHJ1Y3QqIHR1bmlvbikgeworICBzdHJpbmcgZl91bmlvbl9uYW1lID0gbmFtZXNwYWNlX2Rpcl8gKyAiLyIgKyAodHVuaW9uLT5nZXRfbmFtZSgpKSArICIuY3MiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfdW5pb247CisKKyAgZl91bmlvbi5vcGVuKGZfdW5pb25fbmFtZS5jX3N0cigpKTsKKworICBmX3VuaW9uIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGNzaGFycF90eXBlX3VzaW5ncygpIDw8IGNzaGFycF90aHJpZnRfdXNpbmdzKCkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9jc2hhcnBfdW5pb25fZGVmaW5pdGlvbihmX3VuaW9uLCB0dW5pb24pOworCisgIGZfdW5pb24uY2xvc2UoKTsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF91bmlvbl9kZWZpbml0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHVuaW9uKSB7CisgIC8vIExldCdzIGRlZmluZSB0aGUgY2xhc3MgZmlyc3QKKyAgc3RhcnRfY3NoYXJwX25hbWVzcGFjZShvdXQpOworCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgYWJzdHJhY3QgcGFydGlhbCBjbGFzcyAiIDw8IHR1bmlvbi0+Z2V0X25hbWUoKSA8PCAiIDogVEFic3RyYWN0QmFzZSB7IgorICAgICAgICAgICAgICA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZShUUHJvdG9jb2wgcHJvdG9jb2wpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyByZWFkb25seSBib29sIElzc2V0OyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBhYnN0cmFjdCBvYmplY3QgRGF0YSB7IGdldDsgfSIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAicHJvdGVjdGVkICIgPDwgdHVuaW9uLT5nZXRfbmFtZSgpIDw8ICIoYm9vbCBpc3NldCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJJc3NldCA9IGlzc2V0OyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljIGNsYXNzIF9fX3VuZGVmaW5lZCA6ICIgPDwgdHVuaW9uLT5nZXRfbmFtZSgpIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBvdmVycmlkZSBvYmplY3QgRGF0YSB7IGdldCB7IHJldHVybiBudWxsOyB9IH0iIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBfX191bmRlZmluZWQoKSA6IGJhc2UoZmFsc2UpIHt9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlKFRQcm90b2NvbCBwcm90b2NvbCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCBUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCBcIkNhbm5vdCBwZXJzaXN0ICIKKyAgICAgICAgICAgICAgICAgImFuIHVuaW9uIHR5cGUgd2hpY2ggaXMgbm90IHNldC5cIik7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHVuaW9uLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9jc2hhcnBfdW5pb25fY2xhc3Mob3V0LCB0dW5pb24sICgqZl9pdGVyKSk7CisgIH0KKworICBnZW5lcmF0ZV9jc2hhcnBfdW5pb25fcmVhZGVyKG91dCwgdHVuaW9uKTsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGVuZF9jc2hhcnBfbmFtZXNwYWNlKG91dCk7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfdW5pb25fY2xhc3Moc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0dW5pb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCkgeworICBpbmRlbnQob3V0KSA8PCAicHVibGljIGNsYXNzICIgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgOiAiIDw8IHR1bmlvbi0+Z2V0X25hbWUoKSA8PCAiIHsiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSAiIDw8IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpIDw8ICIgX2RhdGE7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHVibGljIG92ZXJyaWRlIG9iamVjdCBEYXRhIHsgZ2V0IHsgcmV0dXJuIF9kYXRhOyB9IH0iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIigiIDw8IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpCisgICAgICAgICAgICAgIDw8ICIgZGF0YSkgOiBiYXNlKHRydWUpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAidGhpcy5fZGF0YSA9IGRhdGE7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlKFRQcm90b2NvbCBvcHJvdCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ0cnkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaW5kZW50KG91dCkgPDwgIlRTdHJ1Y3Qgc3RydWMgPSBuZXcgVFN0cnVjdChcIiIgPDwgdHVuaW9uLT5nZXRfbmFtZSgpIDw8ICJcIik7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAib3Byb3QuV3JpdGVTdHJ1Y3RCZWdpbihzdHJ1Yyk7IiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJURmllbGQgZmllbGQgPSBuZXcgVEZpZWxkKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiZmllbGQuTmFtZSA9IFwiIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIlwiOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImZpZWxkLlR5cGUgPSAiIDw8IHR5cGVfdG9fZW51bSh0ZmllbGQtPmdldF90eXBlKCkpIDw8ICI7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiZmllbGQuSUQgPSAiIDw8IHRmaWVsZC0+Z2V0X2tleSgpIDw8ICI7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAib3Byb3QuV3JpdGVGaWVsZEJlZ2luKGZpZWxkKTsiIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgdGZpZWxkLCAiX2RhdGEiLCB0cnVlLCB0cnVlKTsKKworICBpbmRlbnQob3V0KSA8PCAib3Byb3QuV3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LldyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAib3Byb3QuV3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgaW5kZW50KCkgPDwgImZpbmFsbHkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9lcXVhbHMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAicHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCB0aGF0KSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCAidmFyIG90aGVyID0gdGhhdCBhcyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImlmIChvdGhlciA9PSBudWxsKSByZXR1cm4gZmFsc2U7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiaWYgKFJlZmVyZW5jZUVxdWFscyh0aGlzLCBvdGhlcikpIHJldHVybiB0cnVlOyIgPDwgZW5kbDsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICI7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiJiYgIjsKKyAgICB9CisgICAgaWYgKCFmaWVsZF9pc19yZXF1aXJlZCgoKmZfaXRlcikpICYmICEobnVsbGFibGVfICYmICFmaWVsZF9oYXNfZGVmYXVsdCgoKmZfaXRlcikpKSkgeworICAgICAgb3V0IDw8ICIoKF9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgPT0gb3RoZXIuX19pc3NldC4iCisgICAgICAgICAgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKSAmJiAoKCFfX2lzc2V0LiIKKyAgICAgICAgICA8PCBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIpIHx8ICgiOworICAgIH0KKyAgICB0X3R5cGUqIHR0eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwgdHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICBvdXQgPDwgIlRDb2xsZWN0aW9ucy5FcXVhbHMoIjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICJTeXN0ZW0uT2JqZWN0LkVxdWFscygiOworICAgIH0KKyAgICBvdXQgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIiwgb3RoZXIuIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiKSI7CisgICAgaWYgKCFmaWVsZF9pc19yZXF1aXJlZCgoKmZfaXRlcikpICYmICEobnVsbGFibGVfICYmICFmaWVsZF9oYXNfZGVmYXVsdCgoKmZfaXRlcikpKSkgeworICAgICAgb3V0IDw8ICIpKSkiOworICAgIH0KKyAgfQorICBpZiAoZmlyc3QpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfaGFzaGNvZGUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAicHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8ICJpbnQgaGFzaGNvZGUgPSAwOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInVuY2hlY2tlZCB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3R5cGUqIHR0eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgIGluZGVudChvdXQpIDw8ICJoYXNoY29kZSA9IChoYXNoY29kZSAqIDM5NykgXiAiOworICAgIGlmIChmaWVsZF9pc19yZXF1aXJlZCgoKmZfaXRlcikpKSB7CisgICAgICBvdXQgPDwgIigiOworICAgIH0gZWxzZSBpZiAobnVsbGFibGVfKSB7CisgICAgICBvdXQgPDwgIigiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIgPT0gbnVsbCA/IDAgOiAiOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgIighX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA/IDAgOiAiOworICAgIH0KKyAgICBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICBvdXQgPDwgIihUQ29sbGVjdGlvbnMuR2V0SGFzaENvZGUoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiKSkiOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgIigiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIuR2V0SGFzaENvZGUoKSkiOworICAgIH0KKyAgICBvdXQgPDwgIik7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gaGFzaGNvZGU7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gbmFtZXNwYWNlX2Rpcl8gKyAiLyIgKyBzZXJ2aWNlX25hbWVfICsgIi5jcyI7CisgIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKKworICBmX3NlcnZpY2VfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGNzaGFycF90eXBlX3VzaW5ncygpIDw8IGNzaGFycF90aHJpZnRfdXNpbmdzKCkgPDwgZW5kbDsKKworICBzdGFydF9jc2hhcnBfbmFtZXNwYWNlKGZfc2VydmljZV8pOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIHBhcnRpYWwgY2xhc3MgIiA8PCBub3JtYWxpemVfbmFtZShzZXJ2aWNlX25hbWVfKSA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgIGVuZF9jc2hhcnBfbmFtZXNwYWNlKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfLmNsb3NlKCk7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIGdlbmVyYXRlX3NlcGFyYXRlX3NlcnZpY2VfaW50ZXJmYWNlcyh0c2VydmljZSk7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXBhcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZXModF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBnZW5lcmF0ZV9zeW5jX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKKworICBpZiAoYXN5bmNfKSB7CisgICAgZ2VuZXJhdGVfYXN5bmNfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOworICB9CisKKyAgZ2VuZXJhdGVfY29tYmluZWRfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3luY19zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX2lmYWNlID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgZXh0ZW5kc19pZmFjZSA9ICIgOiAiICsgZXh0ZW5kcyArICIuSVN5bmMiOworICB9CisKKyAgZ2VuZXJhdGVfY3NoYXJwX2RvYyhmX3NlcnZpY2VfLCB0c2VydmljZSk7CisKKyAgaWYgKHdjZl8pIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIltTeXN0ZW0uU2VydmljZU1vZGVsLlNlcnZpY2VDb250cmFjdChOYW1lc3BhY2U9XCIiIDw8IHdjZl9uYW1lc3BhY2VfIDw8ICJcIildIiA8PCBlbmRsOworICB9CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGludGVyZmFjZSBJU3luYyIgPDwgZXh0ZW5kc19pZmFjZSA8PCAiIHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX2NzaGFycF9kb2MoZl9zZXJ2aWNlXywgKmZfaXRlcik7CisKKyAgICAvLyBpZiB3ZSdyZSB1c2luZyBXQ0YsIGFkZCB0aGUgY29ycmVzcG9uZGluZyBhdHRyaWJ1dGVzCisgICAgaWYgKHdjZl8pIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiW1N5c3RlbS5TZXJ2aWNlTW9kZWwuT3BlcmF0aW9uQ29udHJhY3RdIiA8PCBlbmRsOworCisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpOworICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJbU3lzdGVtLlNlcnZpY2VNb2RlbC5GYXVsdENvbnRyYWN0KHR5cGVvZigiCisgICAgICAgICAgKyB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpICsgIkZhdWx0KSldIiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgIjsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXN5bmNfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19pZmFjZSA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGV4dGVuZHNfaWZhY2UgPSAiIDogIiArIGV4dGVuZHMgKyAiLklBc3luYyI7CisgIH0KKworICBnZW5lcmF0ZV9jc2hhcnBfZG9jKGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKKworICBpZiAod2NmXykgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiW1N5c3RlbS5TZXJ2aWNlTW9kZWwuU2VydmljZUNvbnRyYWN0KE5hbWVzcGFjZT1cIiIgPDwgd2NmX25hbWVzcGFjZV8gPDwgIlwiKV0iIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgaW50ZXJmYWNlIElBc3luYyIgPDwgZXh0ZW5kc19pZmFjZSA8PCAiIHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX2NzaGFycF9kb2MoZl9zZXJ2aWNlXywgKmZfaXRlcik7CisKKyAgICAvLyBpZiB3ZSdyZSB1c2luZyBXQ0YsIGFkZCB0aGUgY29ycmVzcG9uZGluZyBhdHRyaWJ1dGVzCisgICAgaWYgKHdjZl8pIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiW1N5c3RlbS5TZXJ2aWNlTW9kZWwuT3BlcmF0aW9uQ29udHJhY3RdIiA8PCBlbmRsOworCisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpOworICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJbU3lzdGVtLlNlcnZpY2VNb2RlbC5GYXVsdENvbnRyYWN0KHR5cGVvZigiCisgICAgICAgICAgKyB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpICsgIkZhdWx0KSldIiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmMoKmZfaXRlcikgPDwgIjsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29tYmluZWRfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kc19pZmFjZSA9ICIgOiBJU3luYyI7CisKKyAgaWYgKGFzeW5jXykgeworICAgIGV4dGVuZHNfaWZhY2UgKz0gIiwgSUFzeW5jIjsKKyAgfQorCisgIGdlbmVyYXRlX2NzaGFycF9kb2MoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOworCisgIGlmICh3Y2ZfKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJbU3lzdGVtLlNlcnZpY2VNb2RlbC5TZXJ2aWNlQ29udHJhY3QoTmFtZXNwYWNlPVwiIiA8PCB3Y2ZfbmFtZXNwYWNlXyA8PCAiXCIpXSIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGludGVyZmFjZSBJZmFjZSIgPDwgZXh0ZW5kc19pZmFjZSA8PCAiIHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gV2UgbmVlZCB0byBnZW5lcmF0ZSBleHRyYSBvbGQgc3R5bGUgYXN5bmMgbWV0aG9kcyBmb3Igc2lsdmVybGlnaHQuIFNpbmNlCisgIC8vIHRoaXMgaXNuJ3Qgc29tZXRoaW5nIHlvdSdkIHdhbnQgdG8gaW1wbGVtZW50IHNlcnZlci1zaWRlLCBqdXN0IHB1dCB0aGVtIGludG8KKyAgLy8gdGhlIG1haW4gSWZhY2UgaW50ZXJmYWNlLgorICBnZW5lcmF0ZV9zaWx2ZXJsaWdodF9hc3luY19tZXRob2RzKHRzZXJ2aWNlKTsKKworICBpbmRlbnRfZG93bigpOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NpbHZlcmxpZ2h0X2FzeW5jX21ldGhvZHModF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9jc2hhcnBfZG9jKGZfc2VydmljZV8sICpmX2l0ZXIpOworCisgICAgLy8gRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBpbmNsdWRlIHRoZSBCZWdpbl8sIEVuZF8gbWV0aG9kcyBpZiB3ZSdyZSBnZW5lcmF0aW5nCisgICAgLy8gd2l0aCB0aGUgYXN5bmMgZmxhZy4gSSdtIG5vdCBzdXJlIHRoaXMgaXMgbmVjZXNzYXJ5LCBzbyBzb21lb25lIHdpdGggbW9yZSBrbm93bGVkZ2UKKyAgICAvLyBjYW4gbWF5YmUgcmVtb3ZlIHRoZXNlIGNoZWNrcyBpZiB0aGV5IGtub3cgaXQncyBzYWZlLgorICAgIGlmICghYXN5bmNfKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiNpZiBTSUxWRVJMSUdIVCIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jX2JlZ2luKCpmX2l0ZXIsICJCZWdpbl8iKSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jX2VuZCgqZl9pdGVyLCAiRW5kXyIpIDw8ICI7IiA8PCBlbmRsOworCisgICAgaWYgKCFhc3luY18pIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiI2VuZGlmIiA8PCBlbmRsOworICAgIH0KKyAgfQorfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sIHRzLCBmYWxzZSwgdHJ1ZSk7CisgICAgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKKyAgfQorfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBleHRlbmRzX2NsaWVudCA9IGV4dGVuZHMgKyAiLkNsaWVudCwgIjsKKyAgfSBlbHNlIHsKKyAgICBleHRlbmRzX2NsaWVudCA9ICJJRGlzcG9zYWJsZSwgIjsKKyAgfQorCisgIGdlbmVyYXRlX2NzaGFycF9kb2MoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGNsYXNzIENsaWVudCA6ICIgPDwgZXh0ZW5kc19jbGllbnQgPDwgIklmYWNlIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBDbGllbnQoVFByb3RvY29sIHByb3QpIDogdGhpcyhwcm90LCBwcm90KSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBDbGllbnQoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpIjsKKyAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8ICIgOiBiYXNlKGlwcm90LCBvcHJvdCkiOworICB9CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlwcm90XyA9IGlwcm90OyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3RfID0gb3Byb3Q7IiA8PCBlbmRsOworICB9CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgVFByb3RvY29sIGlwcm90XzsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJwcm90ZWN0ZWQgVFByb3RvY29sIG9wcm90XzsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInByb3RlY3RlZCBpbnQgc2VxaWRfOyIKKyAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInB1YmxpYyBUUHJvdG9jb2wgSW5wdXRQcm90b2NvbCIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImdldCB7IHJldHVybiBpcHJvdF87IH0iIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInB1YmxpYyBUUHJvdG9jb2wgT3V0cHV0UHJvdG9jb2wiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJnZXQgeyByZXR1cm4gb3Byb3RfOyB9IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiNyZWdpb24gXCIgSURpc3Bvc2FibGUgU3VwcG9ydCBcIiIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByaXZhdGUgYm9vbCBfSXNEaXNwb3NlZDsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIi8vIElEaXNwb3NhYmxlIiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIHZvaWQgRGlzcG9zZSgpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiRGlzcG9zZSh0cnVlKTsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZW5kbCA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJvdGVjdGVkIHZpcnR1YWwgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmICghX0lzRGlzcG9zZWQpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKGRpc3Bvc2luZykiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAoaXByb3RfICE9IG51bGwpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiKChJRGlzcG9zYWJsZSlpcHJvdF8pLkRpc3Bvc2UoKTsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmIChvcHJvdF8gIT0gbnVsbCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIoKElEaXNwb3NhYmxlKW9wcm90XykuRGlzcG9zZSgpOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIl9Jc0Rpc3Bvc2VkID0gdHJ1ZTsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiNlbmRyZWdpb24iIDw8IGVuZGw7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBlbmRsOworCisgICAgaWYgKCFhc3luY18pIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiI2lmIFNJTFZFUkxJR0hUIiA8PCBlbmRsOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGVuZGw7CisgICAgfQorICAgIC8vIEJlZ2luXworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jX2JlZ2luKCpmX2l0ZXIsICJCZWdpbl8iKSA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgInNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoY2FsbGJhY2ssIHN0YXRlIjsKKworICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyhhcmdfc3RydWN0KTsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKKyAgICAgIGZfc2VydmljZV8gPDwgbm9ybWFsaXplX25hbWUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAgIC8vIEVuZAorICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jX2VuZCgqZl9pdGVyLCAiRW5kXyIpIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJvcHJvdF8uVHJhbnNwb3J0LkVuZEZsdXNoKGFzeW5jUmVzdWx0KTsiIDw8IGVuZGw7CisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8ICJyZXR1cm4gIjsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgInJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgfQorICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgICAgLy8gYXN5bmMKKyAgICBib29sIGZpcnN0OworICAgIGlmIChhc3luY18pIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGFzeW5jICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jKCpmX2l0ZXIsICIiKSA8PCBlbmRsOworICAgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpIDw8ICIgcmV0dmFsOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR2YWwgPSAiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCAiYXdhaXQgVGFzay5SdW4oKCkgPT4iIDw8IGVuZGw7CisgICAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKTsKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAicmV0dXJuICI7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8IGZ1bm5hbWUgPDwgIigiOworICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7CisgICAgICAgIH0KKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSk7IiA8PCBlbmRsOworICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiByZXR2YWw7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgICB9CisKKyAgICBpZiAoIWFzeW5jXykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIjZW5kaWYiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisKKyAgICBnZW5lcmF0ZV9jc2hhcnBfZG9jKGZfc2VydmljZV8sICpmX2l0ZXIpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgICAvLyBzaWx2ZXJsaWdodCBpbnZva2UKKyAgICBpZiAoIWFzeW5jXykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIjaWYgU0lMVkVSTElHSFQiIDw8IGVuZGw7CisKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidmFyIGFzeW5jUmVzdWx0ID0gQmVnaW5fIiA8PCBmdW5uYW1lIDw8ICIobnVsbCwgbnVsbCI7CisgICAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICIgPDwgbm9ybWFsaXplX25hbWUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCAicmV0dXJuICI7CisgICAgICAgIH0KKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAiRW5kXyIgPDwgZnVubmFtZSA8PCAiKGFzeW5jUmVzdWx0KTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiI2Vsc2UiIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gc3luY2hyb25vdXMgaW52b2tlCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJzZW5kXyIgPDwgZnVubmFtZSA8PCAiKCI7CisgIAorICAgIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7CisgIAorICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAicmV0dXJuICI7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8ICJyZWN2XyIgPDwgZnVubmFtZSA8PCAiKCk7IiA8PCBlbmRsOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgICBpZiAoIWFzeW5jXykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIjZW5kaWYiIDw8IGVuZGw7CisgICAgfQorICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisKKyAgICAvLyBTZW5kCisgICAgdF9mdW5jdGlvbiBzZW5kX2Z1bmN0aW9uKGdfdHlwZV92b2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInNlbmRfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSk7CisKKyAgICBzdHJpbmcgYXJnc25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiOworCisgICAgaWYgKCFhc3luY18pIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiI2lmIFNJTFZFUkxJR0hUIiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jX2JlZ2luKCZzZW5kX2Z1bmN0aW9uKSA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3RfLldyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgZnVubmFtZSA8PCAiXCIsICIKKyAgICAgICAgICAgICAgIDw8ICgoKmZfaXRlciktPmlzX29uZXdheSgpID8gIlRNZXNzYWdlVHlwZS5PbmV3YXkiIDogIlRNZXNzYWdlVHlwZS5DYWxsIikKKyAgICAgICAgICAgICAgIDw8ICIsIHNlcWlkXykpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBhcmdzbmFtZSA8PCAiIGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZQorICAgICAgICAgICAgICAgPDwgIigpOyIgPDwgZW5kbDsKKworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzLiIgPDwgcHJvcF9uYW1lKCpmbGRfaXRlcikgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICAgPDwgbm9ybWFsaXplX25hbWUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3MuV3JpdGUob3Byb3RfKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJvcHJvdF8uV3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIG9wcm90Xy5UcmFuc3BvcnQuQmVnaW5GbHVzaChjYWxsYmFjaywgc3RhdGUpOyIgPDwgZW5kbDsKKyAgICAgIAorICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgICAgaWYgKCFhc3luY18pIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiI2Vsc2UiIDw8IGVuZGw7CisgICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnNlbmRfZnVuY3Rpb24pIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdF8uV3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCBmdW5uYW1lIDw8ICJcIiwgIgorICAgICAgICAgICAgICAgPDwgKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkgPyAiVE1lc3NhZ2VUeXBlLk9uZXdheSIgOiAiVE1lc3NhZ2VUeXBlLkNhbGwiKQorICAgICAgICAgICAgICAgPDwgIiwgc2VxaWRfKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IGFyZ3NuYW1lIDw8ICIgYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lCisgICAgICAgICAgICAgICA8PCAiKCk7IiA8PCBlbmRsOworCisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3MuIiA8PCBwcm9wX25hbWUoKmZsZF9pdGVyKSA8PCAiID0gIgorICAgICAgICAgICAgICAgICA8PCBub3JtYWxpemVfbmFtZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncy5Xcml0ZShvcHJvdF8pOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIm9wcm90Xy5Xcml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm9wcm90Xy5UcmFuc3BvcnQuRmx1c2goKTsiIDw8IGVuZGw7CisgICAgY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKGFyZ19zdHJ1Y3QpOworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisKKyAgICBpZiAoIWFzeW5jXykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIjZW5kaWYiIDw8IGVuZGw7CisgICAgfQorCisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBzdHJpbmcgcmVzdWx0bmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKKworICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKKyAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCkpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24pIDw8IGVuZGw7CisgICAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgICBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcoeHMsIHhzLT5nZXRfbWVtYmVycygpLCByZXN1bHRuYW1lKTsKKworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiVE1lc3NhZ2UgbXNnID0gaXByb3RfLlJlYWRNZXNzYWdlQmVnaW4oKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgImlmIChtc2cuVHlwZSA9PSBUTWVzc2FnZVR5cGUuRXhjZXB0aW9uKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5SZWFkKGlwcm90Xyk7IgorICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpcHJvdF8uUmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInRocm93IHg7IgorICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgcmVzdWx0bmFtZSA8PCAiIHJlc3VsdCA9IG5ldyAiCisgICAgICAgICAgICAgICAgIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LlJlYWQoaXByb3RfKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImlwcm90Xy5SZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKworICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBpZiAobnVsbGFibGVfKSB7CisgICAgICAgICAgaWYgKHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSkgeworICAgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC5TdWNjZXNzICE9IG51bGwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIiAgcmV0dXJuIHJlc3VsdC5TdWNjZXNzOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC5TdWNjZXNzLkhhc1ZhbHVlKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgIHJldHVybiByZXN1bHQuU3VjY2Vzcy5WYWx1ZTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuX19pc3NldC5zdWNjZXNzKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICAgICA8PCAiICByZXR1cm4gcmVzdWx0LlN1Y2Nlc3M7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICBpZiAobnVsbGFibGVfKSB7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC4iIDw8IHByb3BfbmFtZSgqeF9pdGVyKSA8PCAiICE9IG51bGwpIHsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHRocm93IHJlc3VsdC4iIDw8IHByb3BfbmFtZSgqeF9pdGVyKSA8PCAiOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC5fX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCp4X2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgICAgICAgPDwgIikgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICB0aHJvdyByZXN1bHQuIiA8PCBwcm9wX25hbWUoKnhfaXRlcikgPDwgIjsiCisgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICAgPDwgInRocm93IG5ldyAiCisgICAgICAgICAgICAgICAgICAgICAgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5NaXNzaW5nUmVzdWx0LCBcIiIKKyAgICAgICAgICAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0XCIpOyIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKCgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpKTsKKyAgICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBpZiAoYXN5bmNfKSB7CisgICAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXJfYXN5bmModHNlcnZpY2UpOworICAgIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyX3N5bmModHNlcnZpY2UpOworICB9CisgIGVsc2UgeworICAgIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyX3N5bmModHNlcnZpY2UpOworICB9Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcl9zeW5jKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfcHJvY2Vzc29yID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgZXh0ZW5kc19wcm9jZXNzb3IgPSBleHRlbmRzICsgIi5Qcm9jZXNzb3IsICI7CisgIH0KKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBjbGFzcyBQcm9jZXNzb3IgOiAiIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8ICJUUHJvY2Vzc29yIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIFByb2Nlc3NvcihJU3luYyBpZmFjZSkiOworCisgIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiIDogYmFzZShpZmFjZSkiOworICB9CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmYWNlXyA9IGlmYWNlOyIgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInByb2Nlc3NNYXBfW1wiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgIDw8ICJcIl0gPSAiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiX1Byb2Nlc3M7IiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfCisgICAgICA8PCBpbmRlbnQoKQorICAgICAgPDwgInByb3RlY3RlZCBkZWxlZ2F0ZSB2b2lkIFByb2Nlc3NGdW5jdGlvbihpbnQgc2VxaWQsIFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KTsiCisgICAgICA8PCBlbmRsOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHJpdmF0ZSBJU3luYyBpZmFjZV87IiA8PCBlbmRsOworCisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgRGljdGlvbmFyeTxzdHJpbmcsIFByb2Nlc3NGdW5jdGlvbj4gcHJvY2Vzc01hcF8gPSBuZXcgIgorICAgICAgIkRpY3Rpb25hcnk8c3RyaW5nLCBQcm9jZXNzRnVuY3Rpb24+KCk7IiA8PCBlbmRsOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBib29sIFByb2Nlc3MoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpIiA8PCBlbmRsOworICB9CisgIGVsc2UgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIG5ldyBib29sIFByb2Nlc3MoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpIiA8PCBlbmRsOworICB9CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRyeSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiVE1lc3NhZ2UgbXNnID0gaXByb3QuUmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbDsKKworICBmX3NlcnZpY2VfCisgICAgPDwgaW5kZW50KCkgPDwgIlByb2Nlc3NGdW5jdGlvbiBmbjsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICA8PCAicHJvY2Vzc01hcF8uVHJ5R2V0VmFsdWUobXNnLk5hbWUsIG91dCBmbik7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiAoZm4gPT0gbnVsbCkgeyIKKyAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIFRQcm90b2NvbFV0aWwuU2tpcChpcHJvdCwgVFR5cGUuU3RydWN0KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICA8PCAiICBpcHJvdC5SZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgIDw8ICIgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiAiCisgICAgIihUQXBwbGljYXRpb25FeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Vbmtub3duTWV0aG9kLCBcIkludmFsaWQgbWV0aG9kIG5hbWU6ICdcIiArICIKKyAgICAibXNnLk5hbWUgKyBcIidcIik7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgPDwgIiAgb3Byb3QuV3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKG1zZy5OYW1lLCBUTWVzc2FnZVR5cGUuRXhjZXB0aW9uLCBtc2cuU2VxSUQpKTsiCisgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICB4LldyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgb3Byb3QuV3JpdGVNZXNzYWdlRW5kKCk7IgorICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgb3Byb3QuVHJhbnNwb3J0LkZsdXNoKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0cnVlOyIKKyAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJmbihtc2cuU2VxSUQsIGlwcm90LCBvcHJvdCk7IiA8PCBlbmRsOworCisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiY2F0Y2ggKElPRXhjZXB0aW9uKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiBmYWxzZTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOworCisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcl9hc3luYyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gZXh0ZW5kcyArICIuQXN5bmNQcm9jZXNzb3IsICI7CisgIH0KKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBjbGFzcyBBc3luY1Byb2Nlc3NvciA6ICIgPDwgZXh0ZW5kc19wcm9jZXNzb3IgPDwgIlRBc3luY1Byb2Nlc3NvciB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBBc3luY1Byb2Nlc3NvcihJQXN5bmMgaWZhY2UpIjsKKyAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8ICIgOiBiYXNlKGlmYWNlKSI7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWZhY2VfID0gaWZhY2U7IiA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHJvY2Vzc01hcF9bXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgPDwgIlwiXSA9ICIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJfUHJvY2Vzc0FzeW5jOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXworICAgICAgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJwcm90ZWN0ZWQgZGVsZWdhdGUgVGFzayBQcm9jZXNzRnVuY3Rpb24oaW50IHNlcWlkLCBUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCk7IgorICAgICAgPDwgZW5kbDsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInByaXZhdGUgSUFzeW5jIGlmYWNlXzsiIDw8IGVuZGw7CisKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInByb3RlY3RlZCBEaWN0aW9uYXJ5PHN0cmluZywgUHJvY2Vzc0Z1bmN0aW9uPiBwcm9jZXNzTWFwXyA9IG5ldyAiCisgICAgICAiRGljdGlvbmFyeTxzdHJpbmcsIFByb2Nlc3NGdW5jdGlvbj4oKTsiIDw8IGVuZGw7CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGFzeW5jIFRhc2s8Ym9vbD4gUHJvY2Vzc0FzeW5jKFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSIgPDwgZW5kbDsKKyAgfQorICBlbHNlIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBuZXcgYXN5bmMgVGFzazxib29sPiBQcm9jZXNzQXN5bmMoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpIiA8PCBlbmRsOworICB9CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRyeSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiVE1lc3NhZ2UgbXNnID0gaXByb3QuUmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbDsKKworICBmX3NlcnZpY2VfCisgICAgPDwgaW5kZW50KCkgPDwgIlByb2Nlc3NGdW5jdGlvbiBmbjsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICA8PCAicHJvY2Vzc01hcF8uVHJ5R2V0VmFsdWUobXNnLk5hbWUsIG91dCBmbik7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiAoZm4gPT0gbnVsbCkgeyIKKyAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIFRQcm90b2NvbFV0aWwuU2tpcChpcHJvdCwgVFR5cGUuU3RydWN0KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICA8PCAiICBpcHJvdC5SZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgIDw8ICIgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiAiCisgICAgIihUQXBwbGljYXRpb25FeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Vbmtub3duTWV0aG9kLCBcIkludmFsaWQgbWV0aG9kIG5hbWU6ICdcIiArICIKKyAgICAibXNnLk5hbWUgKyBcIidcIik7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgPDwgIiAgb3Byb3QuV3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKG1zZy5OYW1lLCBUTWVzc2FnZVR5cGUuRXhjZXB0aW9uLCBtc2cuU2VxSUQpKTsiCisgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICB4LldyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgb3Byb3QuV3JpdGVNZXNzYWdlRW5kKCk7IgorICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgb3Byb3QuVHJhbnNwb3J0LkZsdXNoKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0cnVlOyIKKyAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJhd2FpdCBmbihtc2cuU2VxSUQsIGlwcm90LCBvcHJvdCk7IiA8PCBlbmRsOworCisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiY2F0Y2ggKElPRXhjZXB0aW9uKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiBmYWxzZTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOworCisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb25fYXN5bmModHNlcnZpY2UsICpmX2l0ZXIpOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKKyAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOworICB9CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKKyAgfQorCisgIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCAmcmVzdWx0LCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICAodm9pZCl0c2VydmljZTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgdm9pZCAiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgPDwgIl9Qcm9jZXNzKGludCBzZXFpZCwgVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICBzdHJpbmcgYXJnc25hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiOworICBzdHJpbmcgcmVzdWx0bmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGFyZ3NuYW1lIDw8ICIgYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXJncy5SZWFkKGlwcm90KTsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaXByb3QuUmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IHJlc3VsdG5hbWUgPDwgIiByZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0cnkiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJ5IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgfQorCisgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAicmVzdWx0LlN1Y2Nlc3MgPSAiOworICB9CisgIGZfc2VydmljZV8gPDwgImlmYWNlXy4iIDw8IG5vcm1hbGl6ZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgPDwgIigiOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKGFyZ19zdHJ1Y3QpOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8ICJhcmdzLiIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIpOworICAgIGlmIChudWxsYWJsZV8gJiYgIXR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiLlZhbHVlIjsKKyAgICB9CisgIH0KKyAgY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKGFyZ19zdHJ1Y3QpOworICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKKworICBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcoeHMsIHhzLT5nZXRfbWVtYmVycygpLCByZXN1bHRuYW1lKTsKKyAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJjYXRjaCAoIiA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpIDw8ICIgIgorICAgICAgICAgICAgICAgICA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIikiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJlc3VsdC4iIDw8IHByb3BfbmFtZSgqeF9pdGVyKSA8PCAiID0gIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICB9CisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90LldyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICA8PCAiXCIsIFRNZXNzYWdlVHlwZS5SZXBseSwgc2VxaWQpKTsgIiA8PCBlbmRsOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJlc3VsdC5Xcml0ZShvcHJvdCk7IiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisKKyAgY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKHhzKTsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uKSIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgdGhyb3c7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiY2F0Y2ggKEV4Y2VwdGlvbiBleCkiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIENvbnNvbGUuRXJyb3IuV3JpdGVMaW5lKFwiRXJyb3Igb2NjdXJyZWQgaW4gcHJvY2Vzc29yOlwiKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICBDb25zb2xlLkVycm9yLldyaXRlTGluZShleC5Ub1N0cmluZygpKTsiIDw8IGVuZGw7CisKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIiA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIihUQXBwbGljYXRpb25FeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5JbnRlcm5hbEVycm9yLFwiIEludGVybmFsIGVycm9yLlwiKTsiCisgICAgICAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICBvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgPDwgIlwiLCBUTWVzc2FnZVR5cGUuRXhjZXB0aW9uLCBzZXFpZCkpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgeC5Xcml0ZShvcHJvdCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdC5Xcml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdC5UcmFuc3BvcnQuRmx1c2goKTsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworCisgIGZfc2VydmljZV8gPDwgZW5kbDsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb25fYXN5bmModF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgICh2b2lkKXRzZXJ2aWNlOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBhc3luYyBUYXNrICIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgPDwgIl9Qcm9jZXNzQXN5bmMoaW50IHNlcWlkLCBUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgIHN0cmluZyBhcmdzbmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyI7CisgIHN0cmluZyByZXN1bHRuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgYXJnc25hbWUgPDwgIiBhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbAorICAgIDw8IGluZGVudCgpIDw8ICJhcmdzLlJlYWQoaXByb3QpOyIgPDwgZW5kbAorICAgIDw8IGluZGVudCgpIDw8ICJpcHJvdC5SZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgcmVzdWx0bmFtZSA8PCAiIHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbDsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRyeSIgPDwgZW5kbAorICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0cnkiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICB9CisKKyAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJyZXN1bHQuU3VjY2VzcyA9ICI7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCAiYXdhaXQgaWZhY2VfLiIgPDwgbm9ybWFsaXplX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSA8PCAiQXN5bmMoIjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyhhcmdfc3RydWN0KTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQorICAgIGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8ICJhcmdzLiIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIpOworICAgIGlmIChudWxsYWJsZV8gJiYgIXR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiLlZhbHVlIjsKKyAgICB9CisgIH0KKyAgY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKGFyZ19zdHJ1Y3QpOworICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKKworICBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcoeHMsIHhzLT5nZXRfbWVtYmVycygpLCByZXN1bHRuYW1lKTsKKyAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJjYXRjaCAoIiA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpIDw8ICIgIgorICAgICAgICA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIikiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJlc3VsdC4iIDw8IHByb3BfbmFtZSgqeF9pdGVyKSA8PCAiID0gIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICB9CisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90LldyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICA8PCAiXCIsIFRNZXNzYWdlVHlwZS5SZXBseSwgc2VxaWQpKTsgIiA8PCBlbmRsOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJlc3VsdC5Xcml0ZShvcHJvdCk7IiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisKKyAgY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKHhzKTsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgPDwgaW5kZW50KCkgPDwgImNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uKSIgPDwgZW5kbAorICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsCisgICAgPDwgaW5kZW50KCkgPDwgIiAgdGhyb3c7IiA8PCBlbmRsCisgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICA8PCBpbmRlbnQoKSA8PCAiY2F0Y2ggKEV4Y2VwdGlvbiBleCkiIDw8IGVuZGwKKyAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbAorICAgIDw8IGluZGVudCgpIDw8ICIgIENvbnNvbGUuRXJyb3IuV3JpdGVMaW5lKFwiRXJyb3Igb2NjdXJyZWQgaW4gcHJvY2Vzc29yOlwiKTsiIDw8IGVuZGwKKyAgICA8PCBpbmRlbnQoKSA8PCAiICBDb25zb2xlLkVycm9yLldyaXRlTGluZShleC5Ub1N0cmluZygpKTsiIDw8IGVuZGw7CisKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9CisgIGVsc2UgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIiA8PCBpbmRlbnQoKQorICAgICAgPDwgIihUQXBwbGljYXRpb25FeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5JbnRlcm5hbEVycm9yLFwiIEludGVybmFsIGVycm9yLlwiKTsiCisgICAgICA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiICBvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgPDwgIlwiLCBUTWVzc2FnZVR5cGUuRXhjZXB0aW9uLCBzZXFpZCkpOyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIiAgeC5Xcml0ZShvcHJvdCk7IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdC5Xcml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdC5UcmFuc3BvcnQuRmx1c2goKTsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworCisgIGZfc2VydmljZV8gPDwgZW5kbDsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF91bmlvbl9yZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0dW5pb24pIHsKKyAgLy8gVGhhbmtzIHRvIFRIUklGVC0xNzY4LCB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMgaW4gdGhlIHVuaW9uCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHR1bmlvbi0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RhdGljICIgPDwgdHVuaW9uLT5nZXRfbmFtZSgpIDw8ICIgUmVhZChUUHJvdG9jb2wgaXByb3QpIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaXByb3QuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAidHJ5IiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIGluZGVudChvdXQpIDw8IHR1bmlvbi0+Z2V0X25hbWUoKSA8PCAiIHJldHZhbDsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJpcHJvdC5SZWFkU3RydWN0QmVnaW4oKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJURmllbGQgZmllbGQgPSBpcHJvdC5SZWFkRmllbGRCZWdpbigpOyIgPDwgZW5kbDsKKyAgLy8gd2UgY2Fubm90IGhhdmUgdGhlIGZpcnN0IGZpZWxkIGJlIGEgc3RvcCAtLSB3ZSBtdXN0IGhhdmUgYSBzaW5nbGUgZmllbGQgZGVmaW5lZAorICBpbmRlbnQob3V0KSA8PCAiaWYgKGZpZWxkLlR5cGUgPT0gVFR5cGUuU3RvcCkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisgIGluZGVudChvdXQpIDw8ICJpcHJvdC5SZWFkRmllbGRFbmQoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJyZXR2YWwgPSBuZXcgX19fdW5kZWZpbmVkKCk7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisgIGluZGVudChvdXQpIDw8ICJlbHNlIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZC5JRCkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGQuVHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiIHRlbXA7IiA8PCBlbmRsOworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKCpmX2l0ZXIpLCAidGVtcCIsIHRydWUpOworICAgIGluZGVudChvdXQpIDw8ICJyZXR2YWwgPSBuZXcgIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIih0ZW1wKTsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsgIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIFRQcm90b2NvbFV0aWwuU2tpcChpcHJvdCwgZmllbGQuVHlwZSk7IgorICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHZhbCA9IG5ldyBfX191bmRlZmluZWQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6ICIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJUUHJvdG9jb2xVdGlsLlNraXAoaXByb3QsIGZpZWxkLlR5cGUpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICA8PCAicmV0dmFsID0gbmV3IF9fX3VuZGVmaW5lZCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICBzY29wZV9kb3duKG91dCk7CisKKyAgaW5kZW50KG91dCkgPDwgImlwcm90LlJlYWRGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAiaWYgKGlwcm90LlJlYWRGaWVsZEJlZ2luKCkuVHlwZSAhPSBUVHlwZS5TdG9wKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKyAgaW5kZW50KG91dCkgPDwgInRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSk7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisKKyAgLy8gZW5kIG9mIGVsc2UgZm9yIFRTdG9wCisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgaW5kZW50KG91dCkgPDwgImlwcm90LlJlYWRTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gcmV0dmFsOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiZmluYWxseSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpcHJvdC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworCisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19wcm9wZXJ0eWxlc3MpIHsKKyAgdF90eXBlKiB0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOworICB3aGlsZSAodHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgdHlwZSA9ICgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgfQorCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgfQorCisgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgKGlzX3Byb3BlcnR5bGVzcyA/ICIiIDogcHJvcF9uYW1lKHRmaWVsZCkpOworCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIiA9ICI7CisKKyAgICBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgIigiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIikiOworICAgIH0KKworICAgIG91dCA8PCAiaXByb3QuIjsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICAgIG91dCA8PCAiUmVhZEJpbmFyeSgpOyI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8ICJSZWFkU3RyaW5nKCk7IjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgb3V0IDw8ICJSZWFkQm9vbCgpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8ICJSZWFkQnl0ZSgpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCAiUmVhZEkxNigpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIG91dCA8PCAiUmVhZEkzMigpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAiUmVhZEk2NCgpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIG91dCA8PCAiUmVhZERvdWJsZSgpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDIyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCAiUmVhZEkzMigpOyI7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOworICB9Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICBpZiAodW5pb25fICYmIHRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiLlJlYWQoaXByb3QpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCBwcmVmaXggPDwgIi5SZWFkKGlwcm90KTsiIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgc2NvcGVfdXAob3V0KTsKKworICBzdHJpbmcgb2JqOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBvYmogPSB0bXAoIl9tYXAiKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBvYmogPSB0bXAoIl9zZXQiKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgb2JqID0gdG1wKCJfbGlzdCIpOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJUTWFwICIgPDwgb2JqIDw8ICIgPSBpcHJvdC5SZWFkTWFwQmVnaW4oKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJUU2V0ICIgPDwgb2JqIDw8ICIgPSBpcHJvdC5SZWFkU2V0QmVnaW4oKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiVExpc3QgIiA8PCBvYmogPDwgIiA9IGlwcm90LlJlYWRMaXN0QmVnaW4oKTsiIDw8IGVuZGw7CisgIH0KKworICBzdHJpbmcgaSA9IHRtcCgiX2kiKTsKKyAgaW5kZW50KG91dCkgPDwgImZvciggaW50ICIgPDwgaSA8PCAiID0gMDsgIiA8PCBpIDw8ICIgPCAiIDw8IG9iaiA8PCAiLkNvdW50IgorICAgICAgICAgICAgICA8PCAiOyAiCisgICAgICAgICAgICAgIDw8ICIrKyIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgcHJlZml4KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIHByZWZpeCk7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5SZWFkTWFwRW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5SZWFkU2V0RW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QuUmVhZExpc3RFbmQoKTsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcga2V5ID0gdG1wKCJfa2V5Iik7CisgIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKKworICB0X2ZpZWxkIGZrZXkodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7CisgIHRfZmllbGQgZnZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKKworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZma2V5KSA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmdmFsKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXkpOworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsKTsKKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIlsiIDw8IGtleSA8PCAiXSA9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgIHRfZmllbGQgZmVsZW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIuQWRkKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworCisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5BZGQoIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19lbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Byb3BlcnR5bGVzcykgeworICB0X3R5cGUqIHR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7CisgIHdoaWxlICh0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICB0eXBlID0gKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpOworICB9CisKKyAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyAoaXNfcHJvcGVydHlsZXNzID8gIiIgOiBwcm9wX25hbWUodGZpZWxkKSk7CisKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIG5hbWU7CisgIH0KKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC4iOworCisgICAgc3RyaW5nIG51bGxhYmxlX25hbWUgPSBudWxsYWJsZV8gJiYgIWlzX2VsZW1lbnQgJiYgIWZpZWxkX2lzX3JlcXVpcmVkKHRmaWVsZCkgPyBuYW1lICsgIi5WYWx1ZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG5hbWU7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgICBvdXQgPDwgIldyaXRlQmluYXJ5KCI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8ICJXcml0ZVN0cmluZygiOworICAgICAgICB9CisgICAgICAgIG91dCA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgIldyaXRlQm9vbCgiIDw8IG51bGxhYmxlX25hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgIldyaXRlQnl0ZSgiIDw8IG51bGxhYmxlX25hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJXcml0ZUkxNigiIDw8IG51bGxhYmxlX25hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJXcml0ZUkzMigiIDw8IG51bGxhYmxlX25hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJXcml0ZUk2NCgiIDw8IG51bGxhYmxlX25hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJXcml0ZURvdWJsZSgiIDw8IG51bGxhYmxlX25hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMjIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJXcml0ZUkzMigoaW50KSIgPDwgbnVsbGFibGVfbmFtZSA8PCAiKTsiOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgJyVzJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgcHJlZml4LmNfc3RyKCksCisgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7CisgIH0KK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgICh2b2lkKXRzdHJ1Y3Q7CisgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIi5Xcml0ZShvcHJvdCk7IiA8PCBlbmRsOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKKyAgc2NvcGVfdXAob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LldyaXRlTWFwQmVnaW4obmV3IFRNYXAoIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkKKyAgICAgICAgICAgICAgICA8PCAiLCAiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCAiIDw8IHByZWZpeAorICAgICAgICAgICAgICAgIDw8ICIuQ291bnQpKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LldyaXRlU2V0QmVnaW4obmV3IFRTZXQoIiA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpCisgICAgICAgICAgICAgICAgPDwgIiwgIiA8PCBwcmVmaXggPDwgIi5Db3VudCkpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LldyaXRlTGlzdEJlZ2luKG5ldyBUTGlzdCgiCisgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PCBwcmVmaXggPDwgIi5Db3VudCkpOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICB9CisKKyAgc3RyaW5nIGl0ZXIgPSB0bXAoIl9pdGVyIik7CisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yZWFjaCAoIiA8PCB0eXBlX25hbWUoKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiAiIDw8IGl0ZXIKKyAgICAgICAgICAgICAgICA8PCAiIGluICIgPDwgcHJlZml4IDw8ICIuS2V5cykiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJmb3JlYWNoICgiIDw8IHR5cGVfbmFtZSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiAiIDw8IGl0ZXIKKyAgICAgICAgICAgICAgICA8PCAiIGluICIgPDwgcHJlZml4IDw8ICIpIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImZvcmVhY2ggKCIgPDwgdHlwZV9uYW1lKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiAiIDw8IGl0ZXIKKyAgICAgICAgICAgICAgICA8PCAiIGluICIgPDwgcHJlZml4IDw8ICIpIjsKKyAgfQorCisgIG91dCA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBpdGVyLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3QuV3JpdGVNYXBFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LldyaXRlU2V0RW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3QuV3JpdGVMaXN0RW5kKCk7IiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbWFwKSB7CisgIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCwgIiIsIHRydWUpOworICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgbWFwICsgIlsiICsgaXRlciArICJdIik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQsICIiLCB0cnVlKTsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgaXRlcikgeworICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIiwgdHJ1ZSk7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlcikgeworICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIsIHRydWUpOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvcGVydHkob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzUHVibGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZ2VuZXJhdGVJc3NldCkgeworICBnZW5lcmF0ZV9jc2hhcnBfcHJvcGVydHkob3V0LCB0ZmllbGQsIGlzUHVibGljLCBnZW5lcmF0ZUlzc2V0LCAiXyIpOworfQordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9wcm9wZXJ0eShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1B1YmxpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBnZW5lcmF0ZUlzc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWVsZFByZWZpeCkgeworICBpZiAoKHNlcmlhbGl6ZV8gfHwgd2NmXykgJiYgaXNQdWJsaWMpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiW0RhdGFNZW1iZXIoT3JkZXIgPSAwKV0iIDw8IGVuZGw7CisgIH0KKyAgYm9vbCBoYXNfZGVmYXVsdCA9IGZpZWxkX2hhc19kZWZhdWx0KHRmaWVsZCk7CisgIGJvb2wgaXNfcmVxdWlyZWQgPSBmaWVsZF9pc19yZXF1aXJlZCh0ZmllbGQpOworICBpZiAoKG51bGxhYmxlXyAmJiAhaGFzX2RlZmF1bHQpIHx8IChpc19yZXF1aXJlZCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAoaXNQdWJsaWMgPyAicHVibGljICIgOiAicHJpdmF0ZSAiKQorICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgaXNfcmVxdWlyZWQpIDw8ICIgIgorICAgICAgICAgICAgICAgIDw8IHByb3BfbmFtZSh0ZmllbGQpIDw8ICIgeyBnZXQ7IHNldDsgfSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAoaXNQdWJsaWMgPyAicHVibGljICIgOiAicHJpdmF0ZSAiKQorICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSwgdHJ1ZSkgPDwgIiAiIDw8IHByb3BfbmFtZSh0ZmllbGQpCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICAgIGluZGVudChvdXQpIDw8ICJnZXQiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBib29sIHVzZV9udWxsYWJsZSA9IGZhbHNlOworICAgIGlmIChudWxsYWJsZV8pIHsKKyAgICAgIHRfdHlwZSogdHR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7CisgICAgICB3aGlsZSAodHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgICAgICB0dHlwZSA9ICgodF90eXBlZGVmKil0dHlwZSktPmdldF90eXBlKCk7CisgICAgICB9CisgICAgICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICAgIHVzZV9udWxsYWJsZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKSAhPSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc7CisgICAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgICAgdXNlX251bGxhYmxlID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiAiIDw8IGZpZWxkUHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBpbmRlbnQob3V0KSA8PCAic2V0IiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgaWYgKHVzZV9udWxsYWJsZSkgeworICAgICAgaWYgKGdlbmVyYXRlSXNzZXQpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIl9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSh0ZmllbGQtPmdldF9uYW1lKCkpIDw8ICIgPSB2YWx1ZS5IYXNWYWx1ZTsiCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHZhbHVlLkhhc1ZhbHVlKSB0aGlzLiIgPDwgZmllbGRQcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgIDw8ICIgPSB2YWx1ZS5WYWx1ZTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChnZW5lcmF0ZUlzc2V0KSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUodGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiID0gdHJ1ZTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkUHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPSB2YWx1ZTsiIDw8IGVuZGw7CisgICAgfQorICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBzY29wZV9kb3duKG91dCk7CisgIH0KKyAgb3V0IDw8IGVuZGw7Cit9CisKK3N0ZDo6c3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6bWFrZV92YWxpZF9jc2hhcnBfaWRlbnRpZmllcihzdGQ6OnN0cmluZyBjb25zdCYgZnJvbU5hbWUpIHsKKyAgc3RkOjpzdHJpbmcgc3RyID0gZnJvbU5hbWU7CisgIGlmIChzdHIuZW1wdHkoKSkgeworICAgIHJldHVybiBzdHI7CisgIH0KKworICAvLyB0ZXN0cyByZWx5IG9uIHRoaXMKKyAgYXNzZXJ0KCgnQScgPCAnWicpICYmICgnYScgPCAneicpICYmICgnMCcgPCAnOScpKTsKKworICAvLyBpZiB0aGUgZmlyc3QgbGV0dGVyIGlzIGEgbnVtYmVyLCB3ZSBhZGQgYW4gYWRkaXRpb25hbCB1bmRlcnNjb3JlIGluIGZyb250IG9mIGl0CisgIGNoYXIgYyA9IHN0ci5hdCgwKTsKKyAgaWYgKCgnMCcgPD0gYykgJiYgKGMgPD0gJzknKSkgeworICAgIHN0ciA9ICJfIiArIHN0cjsKKyAgfQorCisgIC8vIGZvbGxvd2luZyBjaGFyczogbGV0dGVyLCBudW1iZXIgb3IgdW5kZXJzY29yZQorICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0ci5zaXplKCk7ICsraSkgeworICAgIGMgPSBzdHIuYXQoaSk7CisgICAgaWYgKCgoJ0EnID4gYykgfHwgKGMgPiAnWicpKSAmJiAoKCdhJyA+IGMpIHx8IChjID4gJ3onKSkgJiYgKCgnMCcgPiBjKSB8fCAoYyA+ICc5JykpCisgICAgICAgICYmICgnXycgIT0gYykpIHsKKyAgICAgIHN0ci5yZXBsYWNlKGksIDEsICJfIik7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHN0cjsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZyh2b2lkKiBzY29wZSkgeworICBpZiggbWVtYmVyX21hcHBpbmdfc2NvcGVzLmVtcHR5KCkpIHsKKyAgICB0aHJvdyAiaW50ZXJuYWwgZXJyb3I6IGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZygpIG5vIHNjb3BlIGFjdGl2ZSI7CisgIH0KKworICBtZW1iZXJfbWFwcGluZ19zY29wZSYgYWN0aXZlID0gbWVtYmVyX21hcHBpbmdfc2NvcGVzLmJhY2soKTsKKyAgaWYgKGFjdGl2ZS5zY29wZV9tZW1iZXIgIT0gc2NvcGUpIHsKKyAgICB0aHJvdyAiaW50ZXJuYWwgZXJyb3I6IGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZygpIGNhbGxlZCBmb3Igd3Jvbmcgc3RydWN0IjsKKyAgfQorCisgIG1lbWJlcl9tYXBwaW5nX3Njb3Blcy5wb3BfYmFjaygpOworfQorCitzdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZXRfbWFwcGVkX21lbWJlcl9uYW1lKHN0cmluZyBuYW1lKSB7CisgIGlmKCAhIG1lbWJlcl9tYXBwaW5nX3Njb3Blcy5lbXB0eSgpKSB7CisgICAgbWVtYmVyX21hcHBpbmdfc2NvcGUmIGFjdGl2ZSA9IG1lbWJlcl9tYXBwaW5nX3Njb3Blcy5iYWNrKCk7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPjo6aXRlcmF0b3IgaXRlciA9IGFjdGl2ZS5tYXBwaW5nX3RhYmxlLmZpbmQobmFtZSk7CisgICAgaWYgKGFjdGl2ZS5tYXBwaW5nX3RhYmxlLmVuZCgpICE9IGl0ZXIpIHsKKyAgICAgIHJldHVybiBpdGVyLT5zZWNvbmQ7CisgICAgfQorICB9CisKKyAgcHZlcmJvc2UoIm5vIG1hcHBpbmcgZm9yIG1lbWJlciAlc1xuIiwgbmFtZS5jX3N0cigpKTsKKyAgcmV0dXJuIG5hbWU7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKHRzdHJ1Y3QsIHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCksIHRzdHJ1Y3QtPmdldF9uYW1lKCkpOworfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6cHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKHZvaWQqIHNjb3BlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHN0cnVjdG5hbWUpIHsKKyAgLy8gYmVnaW4gbmV3IHNjb3BlCisgIG1lbWJlcl9tYXBwaW5nX3Njb3BlIGR1bW15OworICBkdW1teS5zY29wZV9tZW1iZXIgPSAwOworICBtZW1iZXJfbWFwcGluZ19zY29wZXMucHVzaF9iYWNrKGR1bW15KTsKKyAgbWVtYmVyX21hcHBpbmdfc2NvcGUmIGFjdGl2ZSA9IG1lbWJlcl9tYXBwaW5nX3Njb3Blcy5iYWNrKCk7CisgIGFjdGl2ZS5zY29wZV9tZW1iZXIgPSBzY29wZTsKKworICAvLyBjdXJyZW50IEMjIGdlbmVyYXRvciBwb2xpY3k6CisgIC8vIC0gcHJvcCBuYW1lcyBhcmUgYWx3YXlzIHJlbmRlcmVkIHdpdGggYW4gVXBwZXJjYXNlIGZpcnN0IGxldHRlcgorICAvLyAtIHN0cnVjdCBuYW1lcyBhcmUgdXNlZCBhcyBnaXZlbgorICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gdXNlZF9tZW1iZXJfbmFtZXM7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgLy8gcHJldmVudCBuYW1lIGNvbmZsaWN0cyB3aXRoIHN0cnVjdCAoQ1MwNTQyIGVycm9yKQorICB1c2VkX21lbWJlcl9uYW1lcy5pbnNlcnQoc3RydWN0bmFtZSk7CisKKyAgLy8gcHJldmVudCBuYW1lIGNvbmZsaWN0cyB3aXRoIGtub3duIG1ldGhvZHMgKFRIUklGVC0yOTQyKQorICB1c2VkX21lbWJlcl9uYW1lcy5pbnNlcnQoIlJlYWQiKTsKKyAgdXNlZF9tZW1iZXJfbmFtZXMuaW5zZXJ0KCJXcml0ZSIpOworCisgIGZvciAoaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK2l0ZXIpIHsKKyAgICBzdHJpbmcgb2xkbmFtZSA9ICgqaXRlciktPmdldF9uYW1lKCk7CisgICAgc3RyaW5nIG5ld25hbWUgPSBwcm9wX25hbWUoKml0ZXIsIHRydWUpOworICAgIHdoaWxlICh0cnVlKSB7CisKKyAgICAgIC8vIG5ldyBuYW1lIGNvbmZsaWN0cyB3aXRoIGFub3RoZXIgbWVtYmVyCisgICAgICBpZiAodXNlZF9tZW1iZXJfbmFtZXMuZmluZChuZXduYW1lKSAhPSB1c2VkX21lbWJlcl9uYW1lcy5lbmQoKSkgeworICAgICAgICBwdmVyYm9zZSgic3RydWN0ICVzOiBtZW1iZXIgJXMgY29uZmxpY3RzIHdpdGggYW5vdGhlciBtZW1iZXJcbiIsCisgICAgICAgICAgICAgICAgIHN0cnVjdG5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgbmV3bmFtZS5jX3N0cigpKTsKKyAgICAgICAgbmV3bmFtZSArPSAnXyc7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICAvLyBhZGQgYWx3YXlzLCB0aGlzIGhlbHBzIHVzIHRvIGRldGVjdCBlZGdlIGNhc2VzIGxpa2UKKyAgICAgIC8vIGRpZmZlcmVudCBzcGVsbGluZ3MgKCJmb28iIGFuZCAiRm9vIikgd2l0aGluIHRoZSBzYW1lIHN0cnVjdAorICAgICAgcHZlcmJvc2UoInN0cnVjdCAlczogbWVtYmVyIG1hcHBpbmcgJXMgPT4gJXNcbiIsCisgICAgICAgICAgICAgICBzdHJ1Y3RuYW1lLmNfc3RyKCksCisgICAgICAgICAgICAgICBvbGRuYW1lLmNfc3RyKCksCisgICAgICAgICAgICAgICBuZXduYW1lLmNfc3RyKCkpOworICAgICAgYWN0aXZlLm1hcHBpbmdfdGFibGVbb2xkbmFtZV0gPSBuZXduYW1lOworICAgICAgdXNlZF9tZW1iZXJfbmFtZXMuaW5zZXJ0KG5ld25hbWUpOworICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CisKK3N0ZDo6c3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6cHJvcF9uYW1lKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBzdXBwcmVzc19tYXBwaW5nKSB7CisgIHN0cmluZyBuYW1lKHRmaWVsZC0+Z2V0X25hbWUoKSk7CisgIGlmIChzdXBwcmVzc19tYXBwaW5nKSB7CisgICAgbmFtZVswXSA9IHRvdXBwZXIobmFtZVswXSk7CisgIH0gZWxzZSB7CisgICAgbmFtZSA9IGdldF9tYXBwZWRfbWVtYmVyX25hbWUobmFtZSk7CisgIH0KKyAgcmV0dXJuIG5hbWU7Cit9CisKK3N0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY29udGFpbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5faW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX3BhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVxdWlyZWQpIHsKKyAgKHZvaWQpaW5faW5pdDsKKyAgd2hpbGUgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICB0dHlwZSA9ICgodF90eXBlZGVmKil0dHlwZSktPmdldF90eXBlKCk7CisgIH0KKworICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgcmV0dXJuIGJhc2VfdHlwZV9uYW1lKCh0X2Jhc2VfdHlwZSopdHR5cGUsIGluX2NvbnRhaW5lciwgaW5fcGFyYW0sIGlzX3JlcXVpcmVkKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X21hcCogdG1hcCA9ICh0X21hcCopdHR5cGU7CisgICAgcmV0dXJuICJEaWN0aW9uYXJ5PCIgKyB0eXBlX25hbWUodG1hcC0+Z2V0X2tleV90eXBlKCksIHRydWUpICsgIiwgIgorICAgICAgICAgICArIHR5cGVfbmFtZSh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdHJ1ZSkgKyAiPiI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF9zZXQqIHRzZXQgPSAodF9zZXQqKXR0eXBlOworICAgIHJldHVybiAiVEhhc2hTZXQ8IiArIHR5cGVfbmFtZSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIHRydWUpICsgIj4iOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICB0X2xpc3QqIHRsaXN0ID0gKHRfbGlzdCopdHR5cGU7CisgICAgcmV0dXJuICJMaXN0PCIgKyB0eXBlX25hbWUodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgdHJ1ZSkgKyAiPiI7CisgIH0KKworICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKKyAgc3RyaW5nIHBvc3RmaXggPSAoIWlzX3JlcXVpcmVkICYmIG51bGxhYmxlXyAmJiBpbl9wYXJhbSAmJiB0dHlwZS0+aXNfZW51bSgpKSA/ICI/IiA6ICIiOworICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKKyAgICBzdHJpbmcgbnMgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJjc2hhcnAiKTsKKyAgICBpZiAoIW5zLmVtcHR5KCkpIHsKKyAgICAgIHJldHVybiBucyArICIuIiArIG5vcm1hbGl6ZV9uYW1lKHR0eXBlLT5nZXRfbmFtZSgpKSArIHBvc3RmaXg7CisgICAgfQorICB9CisKKyAgcmV0dXJuIG5vcm1hbGl6ZV9uYW1lKHR0eXBlLT5nZXRfbmFtZSgpKSArIHBvc3RmaXg7Cit9CisKK3N0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OmJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0YmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY29udGFpbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9wYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVxdWlyZWQpIHsKKyAgKHZvaWQpaW5fY29udGFpbmVyOworICBzdHJpbmcgcG9zdGZpeCA9ICghaXNfcmVxdWlyZWQgJiYgbnVsbGFibGVfICYmIGluX3BhcmFtKSA/ICI/IiA6ICIiOworICBzd2l0Y2ggKHRiYXNlLT5nZXRfYmFzZSgpKSB7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICByZXR1cm4gInZvaWQiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICBpZiAodGJhc2UtPmlzX2JpbmFyeSgpKSB7CisgICAgICByZXR1cm4gImJ5dGVbXSI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAic3RyaW5nIjsKKyAgICB9CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICByZXR1cm4gImJvb2wiICsgcG9zdGZpeDsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICByZXR1cm4gInNieXRlIiArIHBvc3RmaXg7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIHJldHVybiAic2hvcnQiICsgcG9zdGZpeDsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgcmV0dXJuICJpbnQiICsgcG9zdGZpeDsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgcmV0dXJuICJsb25nIiArIHBvc3RmaXg7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgIHJldHVybiAiZG91YmxlIiArIHBvc3RmaXg7CisgIGRlZmF1bHQ6CisgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDIyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZS0+Z2V0X2Jhc2UoKSk7CisgIH0KK30KKworc3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCwgc3RkOjpzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyByZXN1bHQgPSB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpKSArICIgIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgaWYgKGluaXQpIHsKKyAgICB0X3R5cGUqIHR0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOworICAgIHdoaWxlICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgICB0dHlwZSA9ICgodF90eXBlZGVmKil0dHlwZSktPmdldF90eXBlKCk7CisgICAgfQorICAgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgZmllbGRfaGFzX2RlZmF1bHQodGZpZWxkKSkgeworICAgICAgc3RkOjpvZnN0cmVhbSBkdW1teTsKKyAgICAgIHJlc3VsdCArPSAiID0gIiArIHJlbmRlcl9jb25zdF92YWx1ZShkdW1teSwgdGZpZWxkLT5nZXRfbmFtZSgpLCB0dHlwZSwgdGZpZWxkLT5nZXRfdmFsdWUoKSk7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICByZXN1bHQgKz0gIiA9IG51bGwiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSBmYWxzZSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgcmVzdWx0ICs9ICIgPSAoZG91YmxlKTAiOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIHJlc3VsdCArPSAiID0gKCIgKyB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKSArICIpMCI7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKSArICIoKSI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKSArICIoKSI7CisgICAgfQorICB9CisgIHJldHVybiByZXN1bHQgKyAiOyI7Cit9CisKK3N0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0dHlwZSA9IHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKKyAgcmV0dXJuIHR5cGVfbmFtZSh0dHlwZSkgKyAiICIgKyBub3JtYWxpemVfbmFtZShwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgIigiCisgICAgICAgICArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSArICIpIjsKK30KKworc3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jX2JlZ2luKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgY29tbWEgPSAodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpLnNpemUoKSA+IDAgPyAiLCAiIDogIiIpOworICByZXR1cm4gIklBc3luY1Jlc3VsdCAiICsgbm9ybWFsaXplX25hbWUocHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpKQorICAgICAgICAgKyAiKEFzeW5jQ2FsbGJhY2sgY2FsbGJhY2ssIG9iamVjdCBzdGF0ZSIgKyBjb21tYSArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKQorICAgICAgICAgKyAiKSI7Cit9CisKK3N0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luY19lbmQodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4KSB7CisgIHRfdHlwZSogdHR5cGUgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7CisgIHJldHVybiB0eXBlX25hbWUodHR5cGUpICsgIiAiICsgbm9ybWFsaXplX25hbWUocHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpKQorICAgICAgICAgKyAiKElBc3luY1Jlc3VsdCBhc3luY1Jlc3VsdCkiOworfQorCitzdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmModF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4KSB7CisgIHRfdHlwZSogdHR5cGUgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7CisgIHN0cmluZyB0YXNrID0gIlRhc2siOworICBpZiAoIXR0eXBlLT5pc192b2lkKCkpCisgICAgdGFzayArPSAiPCIgKyB0eXBlX25hbWUodHR5cGUpICsgIj4iOworICByZXR1cm4gdGFzayArICIgIiArIG5vcm1hbGl6ZV9uYW1lKHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiQXN5bmMoIgorICAgICAgICAgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkgKyAiKSI7Cit9CisKK3N0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICIsICI7CisgICAgfQorICAgIHJlc3VsdCArPSB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSArICIgIiArIG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgeworICB3aGlsZSAodHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgdHlwZSA9ICgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJUVHlwZS5TdHJpbmciOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiVFR5cGUuQm9vbCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiVFR5cGUuQnl0ZSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIlRUeXBlLkkxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlRUeXBlLkk2NCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIlRUeXBlLkRvdWJsZSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiVFR5cGUuSTMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJUVHlwZS5TdHJ1Y3QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5NYXAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5TZXQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiVFR5cGUuTGlzdCI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfZG9jc3RyaW5nX2NvbW1lbnQob3N0cmVhbSYgb3V0LCBzdHJpbmcgY29udGVudHMpIHsKKyAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiLy8vIDxzdW1tYXJ5PlxuIiwgIi8vLyAiLCBjb250ZW50cywgIi8vLyA8L3N1bW1hcnk+XG4iKTsKK30KKwordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9kb2Mob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCkgeworICBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX2VudW0oKSkgeworICAgIHN0cmluZyBjb21iaW5lZF9tZXNzYWdlID0gZmllbGQtPmdldF9kb2MoKSArICJcbjxzZWVhbHNvIGNyZWY9XCIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGdldF9lbnVtX2NsYXNzX25hbWUoZmllbGQtPmdldF90eXBlKCkpICsgIlwiLz4iOworICAgIGdlbmVyYXRlX2NzaGFycF9kb2NzdHJpbmdfY29tbWVudChvdXQsIGNvbWJpbmVkX21lc3NhZ2UpOworICB9IGVsc2UgeworICAgIGdlbmVyYXRlX2NzaGFycF9kb2Mob3V0LCAodF9kb2MqKWZpZWxkKTsKKyAgfQorfQorCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX2RvYyhvc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKSB7CisgIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKKyAgICBnZW5lcmF0ZV9jc2hhcnBfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCB0ZG9jLT5nZXRfZG9jKCkpOworICB9Cit9CisKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfZG9jKG9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIGlmICh0ZnVuY3Rpb24tPmhhc19kb2MoKSkgeworICAgIHN0cmluZ3N0cmVhbSBwczsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgcF9pdGVyOworICAgIGZvciAocF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IHBfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrcF9pdGVyKSB7CisgICAgICB0X2ZpZWxkKiBwID0gKnBfaXRlcjsKKyAgICAgIHBzIDw8ICJcbjxwYXJhbSBuYW1lPVwiIiA8PCBwLT5nZXRfbmFtZSgpIDw8ICJcIj4iOworICAgICAgaWYgKHAtPmhhc19kb2MoKSkgeworICAgICAgICBzdGQ6OnN0cmluZyBzdHIgPSBwLT5nZXRfZG9jKCk7CisgICAgICAgIHN0ci5lcmFzZShzdGQ6OnJlbW92ZShzdHIuYmVnaW4oKSwgc3RyLmVuZCgpLCAnXG4nKSwKKyAgICAgICAgICAgICAgICAgIHN0ci5lbmQoKSk7IC8vIHJlbW92ZSB0aGUgbmV3bGluZXMgdGhhdCBhcHBlYXIgZnJvbSB0aGUgcGFyc2VyCisgICAgICAgIHBzIDw8IHN0cjsKKyAgICAgIH0KKyAgICAgIHBzIDw8ICI8L3BhcmFtPiI7CisgICAgfQorICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLy8vICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxzdW1tYXJ5PlxuIiArIHRmdW5jdGlvbi0+Z2V0X2RvYygpICsgIjwvc3VtbWFyeT4iICsgcHMuc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIpOworICB9Cit9CisKK3N0ZDo6c3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2V0X2VudW1fY2xhc3NfbmFtZSh0X3R5cGUqIHR5cGUpIHsKKyAgc3RyaW5nIHBhY2thZ2UgPSAiIjsKKyAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHlwZS0+Z2V0X3Byb2dyYW0oKTsKKyAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7CisgICAgcGFja2FnZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImNzaGFycCIpICsgIi4iOworICB9CisgIHJldHVybiBwYWNrYWdlICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAorICAgIGNzaGFycCwKKyAgICAiQyMiLAorICAgICIgICAgYXN5bmM6ICAgICAgICAgICBBZGRzIEFzeW5jIHN1cHBvcnQgdXNpbmcgVGFzay5SdW4uXG4iCisgICAgIiAgICB3Y2Y6ICAgICAgICAgICAgIEFkZHMgYmluZGluZ3MgZm9yIFdDRiB0byBnZW5lcmF0ZWQgY2xhc3Nlcy5cbiIKKyAgICAiICAgIHNlcmlhbDogICAgICAgICAgQWRkIHNlcmlhbGl6YXRpb24gc3VwcG9ydCB0byBnZW5lcmF0ZWQgY2xhc3Nlcy5cbiIKKyAgICAiICAgIG51bGxhYmxlOiAgICAgICAgVXNlIG51bGxhYmxlIHR5cGVzIGZvciBwcm9wZXJ0aWVzLlxuIgorICAgICIgICAgaGFzaGNvZGU6ICAgICAgICBHZW5lcmF0ZSBhIGhhc2hjb2RlIGFuZCBlcXVhbHMgaW1wbGVtZW50YXRpb24gZm9yIGNsYXNzZXMuXG4iCisgICAgIiAgICB1bmlvbjogICAgICAgICAgIFVzZSBuZXcgdW5pb24gdHlwaW5nLCB3aGljaCBpbmNsdWRlcyBhIHN0YXRpYyByZWFkIGZ1bmN0aW9uIGZvciB1bmlvbiAiCisgICAgInR5cGVzLlxuIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2RfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNTZjZmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2RfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsNzQyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8Y2Fzc2VydD4KKworI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvZnN0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c2V0OwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworCisvKioKKyAqIEQgY29kZSBnZW5lcmF0b3IuCisgKgorICogZ2VuZXJhdGVfKigpIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIGJ5IHRoZSBiYXNlIGNsYXNzIHRvIGVtaXQgY29kZSBmb3IgdGhlCisgKiBnaXZlbiBlbnRpdHksIHByaW50XyooKSBmdW5jdGlvbnMgd3JpdGUgYSBwaWVjZSBvZiBjb2RlIHRvIHRoZSBwYXNzZWQKKyAqIHN0cmVhbSwgYW5kIHJlbmRlcl8qKCkgcmV0dXJuIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIEQgcmVwcmVzZW50YXRpb24gb2YKKyAqIHRoZSBwYXNzZWQgZW50aXR5LgorICovCitjbGFzcyB0X2RfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfZF9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0cmluZywgc3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICAvKiBubyBvcHRpb25zIHlldCAqLworICAgIGZvciggaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgeworICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIGQ6IiArIGl0ZXItPmZpcnN0OworICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWQiOworICB9CisKK3Byb3RlY3RlZDoKKyAgdmlydHVhbCB2b2lkIGluaXRfZ2VuZXJhdG9yKCkgeworICAgIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQorICAgIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7CisKKyAgICBzdHJpbmcgZGlyID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoImQiKTsKKyAgICBzdHJpbmcgc3ViZGlyID0gZ2V0X291dF9kaXIoKTsKKyAgICBzdHJpbmc6OnNpemVfdHlwZSBsb2M7CisgICAgd2hpbGUgKChsb2MgPSBkaXIuZmluZCgiLiIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgIHN1YmRpciA9IHN1YmRpciArICIvIiArIGRpci5zdWJzdHIoMCwgbG9jKTsKKyAgICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKKyAgICAgIGRpciA9IGRpci5zdWJzdHIobG9jICsgMSk7CisgICAgfQorICAgIGlmICghZGlyLmVtcHR5KCkpIHsKKyAgICAgIHN1YmRpciA9IHN1YmRpciArICIvIiArIGRpcjsKKyAgICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKKyAgICB9CisKKyAgICBwYWNrYWdlX2Rpcl8gPSBzdWJkaXIgKyAiLyI7CisKKyAgICAvLyBNYWtlIG91dHB1dCBmaWxlCisgICAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IHBhY2thZ2VfZGlyXyArIHByb2dyYW1fbmFtZV8gKyAiX3R5cGVzLmQiOworICAgIGZfdHlwZXNfLm9wZW4oZl90eXBlc19uYW1lLmNfc3RyKCkpOworCisgICAgLy8gUHJpbnQgaGVhZGVyCisgICAgZl90eXBlc18gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgIm1vZHVsZSAiIDw8IHJlbmRlcl9wYWNrYWdlKCpwcm9ncmFtXykgPDwgcHJvZ3JhbV9uYW1lXworICAgICAgICAgICAgIDw8ICJfdHlwZXM7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBwcmludF9kZWZhdWx0X2ltcG9ydHMoZl90eXBlc18pOworCisgICAgLy8gSW5jbHVkZSB0eXBlIG1vZHVsZXMgZnJvbSBvdGhlciBpbXBvcnRlZCBwcm9ncmFtcy4KKyAgICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgIGZfdHlwZXNfIDw8ICJwdWJsaWMgaW1wb3J0ICIgPDwgcmVuZGVyX3BhY2thZ2UoKihpbmNsdWRlc1tpXSkpIDw8IGluY2x1ZGVzW2ldLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICA8PCAiX3R5cGVzOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKCFpbmNsdWRlcy5lbXB0eSgpKQorICAgICAgZl90eXBlc18gPDwgZW5kbDsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKSB7CisgICAgLy8gQ2xvc2Ugb3V0cHV0IGZpbGUKKyAgICBmX3R5cGVzXy5jbG9zZSgpOworICB9CisKKyAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKSB7CisgICAgaWYgKCFjb25zdHMuZW1wdHkoKSkgeworICAgICAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyBwcm9ncmFtX25hbWVfICsgIl9jb25zdGFudHMuZCI7CisgICAgICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfY29uc3RzOworICAgICAgZl9jb25zdHMub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOworCisgICAgICBmX2NvbnN0cyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCAibW9kdWxlICIgPDwgcmVuZGVyX3BhY2thZ2UoKnByb2dyYW1fKSA8PCBwcm9ncmFtX25hbWVfCisgICAgICAgICAgICAgICA8PCAiX2NvbnN0YW50czsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgICAgcHJpbnRfZGVmYXVsdF9pbXBvcnRzKGZfY29uc3RzKTsKKworICAgICAgZl9jb25zdHMgPDwgImltcG9ydCAiIDw8IHJlbmRlcl9wYWNrYWdlKCpnZXRfcHJvZ3JhbSgpKSA8PCBwcm9ncmFtX25hbWVfIDw8ICJfdHlwZXM7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBlbmRsOworCisgICAgICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7CisgICAgICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgICAgICB0aGlzLT5lbWl0X2RvYygqY19pdGVyLCBmX2NvbnN0cyk7CisgICAgICAgIHN0cmluZyBuYW1lID0gKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICB0X3R5cGUqIHR5cGUgPSAoKmNfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIGluZGVudChmX2NvbnN0cykgPDwgImltbXV0YWJsZSgiIDw8IHJlbmRlcl90eXBlX25hbWUodHlwZSkgPDwgIikgIiA8PCBuYW1lIDw8ICI7IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICBmX2NvbnN0cyA8PCBlbmRsIDw8ICJzdGF0aWMgdGhpcygpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZfY29uc3RzIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgdF90eXBlKiB0eXBlID0gKCpjX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICBpbmRlbnQoZl9jb25zdHMpIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIjsKKyAgICAgICAgaWYgKCFpc19pbW11dGFibGVfdHlwZSh0eXBlKSkgeworICAgICAgICAgIGZfY29uc3RzIDw8ICJjYXN0KGltbXV0YWJsZSgiIDw8IHJlbmRlcl90eXBlX25hbWUodHlwZSkgPDwgIikpICI7CisgICAgICAgIH0KKyAgICAgICAgZl9jb25zdHMgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkpIDw8ICI7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChmX2NvbnN0cykgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICAgIHRoaXMtPmVtaXRfZG9jKHR0eXBlZGVmLCBmX3R5cGVzXyk7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImFsaWFzICIgPDwgcmVuZGVyX3R5cGVfbmFtZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSkgPDwgIiAiCisgICAgICAgICAgICAgPDwgdHR5cGVkZWYtPmdldF9zeW1ib2xpYygpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgICAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisKKyAgICB0aGlzLT5lbWl0X2RvYyh0ZW51bSwgZl90eXBlc18pOworICAgIHN0cmluZyBlbnVtX25hbWUgPSB0ZW51bS0+Z2V0X25hbWUoKTsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiZW51bSAiIDw8IGVudW1fbmFtZSA8PCAiIHsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IgY19pdGVyOworICAgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgICB0aGlzLT5lbWl0X2RvYygqY19pdGVyLCBmX3R5cGVzXyk7CisgICAgICBpbmRlbnQoZl90eXBlc18pIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIGZfdHlwZXNfIDw8ICIgPSAiIDw8ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkgPDwgIiwiOworICAgIH0KKworICAgIGZfdHlwZXNfIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQoZl90eXBlc18pIDw8ICJ9IiA8PCBlbmRsOworCisgICAgZl90eXBlc18gPDwgZW5kbDsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgICBwcmludF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3R5cGVzXywgdHN0cnVjdCwgZmFsc2UpOworICB9CisKKyAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKKyAgICBwcmludF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3R5cGVzXywgdHhjZXB0aW9uLCB0cnVlKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgICBzdHJpbmcgc3ZjX25hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKTsKKworICAgIC8vIFNlcnZpY2UgaW1wbGVtZW50YXRpb24gZmlsZSBpbmNsdWRlcworICAgIHN0cmluZyBmX3NlcnZpY2VuYW1lID0gcGFja2FnZV9kaXJfICsgc3ZjX25hbWUgKyAiLmQiOworICAgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zZXJ2aWNlOworICAgIGZfc2VydmljZS5vcGVuKGZfc2VydmljZW5hbWUuY19zdHIoKSk7CisgICAgZl9zZXJ2aWNlIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8ICJtb2R1bGUgIiA8PCByZW5kZXJfcGFja2FnZSgqcHJvZ3JhbV8pIDw8IHN2Y19uYW1lIDw8ICI7IgorICAgICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBwcmludF9kZWZhdWx0X2ltcG9ydHMoZl9zZXJ2aWNlKTsKKworICAgIGZfc2VydmljZSA8PCAiaW1wb3J0ICIgPDwgcmVuZGVyX3BhY2thZ2UoKmdldF9wcm9ncmFtKCkpIDw8IHByb2dyYW1fbmFtZV8gPDwgIl90eXBlczsiIDw8IGVuZGw7CisKKyAgICB0X3NlcnZpY2UqIGV4dGVuZHNfc2VydmljZSA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICAgIGlmIChleHRlbmRzX3NlcnZpY2UgIT0gTlVMTCkgeworICAgICAgZl9zZXJ2aWNlIDw8ICJpbXBvcnQgIiA8PCByZW5kZXJfcGFja2FnZSgqKGV4dGVuZHNfc2VydmljZS0+Z2V0X3Byb2dyYW0oKSkpCisgICAgICAgICAgICAgICAgPDwgZXh0ZW5kc19zZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKworICAgIGZfc2VydmljZSA8PCBlbmRsOworCisgICAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgICAgZXh0ZW5kcyA9ICIgOiAiICsgcmVuZGVyX3R5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgfQorCisgICAgdGhpcy0+ZW1pdF9kb2ModHNlcnZpY2UsIGZfc2VydmljZSk7CisgICAgZl9zZXJ2aWNlIDw8IGluZGVudCgpIDw8ICJpbnRlcmZhY2UgIiA8PCBzdmNfbmFtZSA8PCBleHRlbmRzIDw8ICIgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIC8vIENvbGxlY3QgYWxsIHRoZSBleGNlcHRpb24gdHlwZXMgc2VydmljZSBtZXRob2RzIGNhbiB0aHJvdyBzbyB3ZSBjYW4KKyAgICAvLyBlbWl0IHRoZSBuZWNlc3NhcnkgYWxpYXNlcyBsYXRlci4KKyAgICBzZXQ8dF90eXBlKj4gZXhjZXB0aW9uX3R5cGVzOworCisgICAgLy8gUHJpbnQgdGhlIG1ldGhvZCBzaWduYXR1cmVzLgorICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmbl9pdGVyOworICAgIGZvciAoZm5faXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmbl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmbl9pdGVyKSB7CisgICAgICB0aGlzLT5lbWl0X2RvYygqZm5faXRlciwgZl9zZXJ2aWNlKTsKKyAgICAgIGZfc2VydmljZSA8PCBpbmRlbnQoKTsKKyAgICAgIHByaW50X2Z1bmN0aW9uX3NpZ25hdHVyZShmX3NlcnZpY2UsICpmbl9pdGVyKTsKKyAgICAgIGZfc2VydmljZSA8PCAiOyIgPDwgZW5kbDsKKworICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZXhjZXB0aW9ucyA9ICgqZm5faXRlciktPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGV4X2l0ZXI7CisgICAgICBmb3IgKGV4X2l0ZXIgPSBleGNlcHRpb25zLmJlZ2luKCk7IGV4X2l0ZXIgIT0gZXhjZXB0aW9ucy5lbmQoKTsgKytleF9pdGVyKSB7CisgICAgICAgIGV4Y2VwdGlvbl90eXBlcy5pbnNlcnQoKCpleF9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICB9CisgICAgfQorCisgICAgLy8gQWxpYXMgdGhlIGV4Y2VwdGlvbiB0eXBlcyBpbnRvIHRoZSBjdXJyZW50IHNjb3BlLgorICAgIGlmICghZXhjZXB0aW9uX3R5cGVzLmVtcHR5KCkpCisgICAgICBmX3NlcnZpY2UgPDwgZW5kbDsKKyAgICBzZXQ8dF90eXBlKj46OmNvbnN0X2l0ZXJhdG9yIGV0X2l0ZXI7CisgICAgZm9yIChldF9pdGVyID0gZXhjZXB0aW9uX3R5cGVzLmJlZ2luKCk7IGV0X2l0ZXIgIT0gZXhjZXB0aW9uX3R5cGVzLmVuZCgpOyArK2V0X2l0ZXIpIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2UpIDw8ICJhbGlhcyAiIDw8IHJlbmRlcl9wYWNrYWdlKCooKmV0X2l0ZXIpLT5nZXRfcHJvZ3JhbSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgPDwgKCpldF9pdGVyKS0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKSA8PCAiX3R5cGVzIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgIi4iIDw8ICgqZXRfaXRlciktPmdldF9uYW1lKCkgPDwgIiAiIDw8ICgqZXRfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0KKworICAgIC8vIFdyaXRlIHRoZSBtZXRob2QgbWV0YWRhdGEuCisgICAgb3N0cmluZ3N0cmVhbSBtZXRhOworICAgIGluZGVudF91cCgpOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAoZm5faXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmbl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmbl9pdGVyKSB7CisgICAgICBpZiAoKCpmbl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKS5lbXB0eSgpCisgICAgICAgICAgJiYgKCpmbl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpLmVtcHR5KCkgJiYgISgqZm5faXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1ldGEgPDwgIiwiOworICAgICAgfQorCisgICAgICBtZXRhIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIlRNZXRob2RNZXRhKGAiIDw8ICgqZm5faXRlciktPmdldF9uYW1lKCkgPDwgImAsICIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KG1ldGEpIDw8ICJbIjsKKworICAgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBwYXJhbXMgPSAoKmZuX2l0ZXIpLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOworICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgcF9pdGVyOworICAgICAgZm9yIChwX2l0ZXIgPSBwYXJhbXMuYmVnaW4oKTsgcF9pdGVyICE9IHBhcmFtcy5lbmQoKTsgKytwX2l0ZXIpIHsKKyAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBtZXRhIDw8ICIsICI7CisgICAgICAgIH0KKworICAgICAgICBtZXRhIDw8ICJUUGFyYW1NZXRhKGAiIDw8ICgqcF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiYCwgIiA8PCAoKnBfaXRlciktPmdldF9rZXkoKTsKKworICAgICAgICB0X2NvbnN0X3ZhbHVlKiBjdiA9ICgqcF9pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgICAgIGlmIChjdiAhPSBOVUxMKSB7CisgICAgICAgICAgbWV0YSA8PCAiLCBxeyIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKCgqcF9pdGVyKS0+Z2V0X3R5cGUoKSwgY3YpIDw8ICJ9IjsKKyAgICAgICAgfQorICAgICAgICBtZXRhIDw8ICIpIjsKKyAgICAgIH0KKworICAgICAgbWV0YSA8PCAiXSI7CisKKyAgICAgIGlmICghKCpmbl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpLmVtcHR5KCkgfHwgKCpmbl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgbWV0YSA8PCAiLCIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiWyI7CisKKyAgICAgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGV4Y2VwdGlvbnMgPSAoKmZuX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCk7CisgICAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGV4X2l0ZXI7CisgICAgICAgIGZvciAoZXhfaXRlciA9IGV4Y2VwdGlvbnMuYmVnaW4oKTsgZXhfaXRlciAhPSBleGNlcHRpb25zLmVuZCgpOyArK2V4X2l0ZXIpIHsKKyAgICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1ldGEgPDwgIiwgIjsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBtZXRhIDw8ICJURXhjZXB0aW9uTWV0YShgIiA8PCAoKmV4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJgLCAiIDw8ICgqZXhfaXRlciktPmdldF9rZXkoKQorICAgICAgICAgICAgICAgPDwgIiwgYCIgPDwgKCpleF9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSA8PCAiYCkiOworICAgICAgICB9CisKKyAgICAgICAgbWV0YSA8PCAiXSI7CisgICAgICB9CisKKyAgICAgIGlmICgoKmZuX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgICBtZXRhIDw8ICIsIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJUTWV0aG9kVHlwZS5PTkVXQVkiOworICAgICAgfQorCisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgbWV0YSA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIpIjsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIHN0cmluZyBtZXRhX3N0cihtZXRhLnN0cigpKTsKKyAgICBpZiAoIW1ldGFfc3RyLmVtcHR5KCkpIHsKKyAgICAgIGZfc2VydmljZSA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJlbnVtIG1ldGhvZE1ldGEgPSBbIiA8PCBtZXRhX3N0ciA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJdOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KGZfc2VydmljZSkgPDwgIn0iIDw8IGVuZGw7CisKKyAgICAvLyBTZXJ2ZXIgc2tlbGV0b24gZ2VuZXJhdGlvbi4KKyAgICBzdHJpbmcgZl9za2VsZXRvbm5hbWUgPSBwYWNrYWdlX2Rpcl8gKyBzdmNfbmFtZSArICJfc2VydmVyLnNrZWxldG9uLmQiOworICAgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9za2VsZXRvbjsKKyAgICBmX3NrZWxldG9uLm9wZW4oZl9za2VsZXRvbm5hbWUuY19zdHIoKSk7CisgICAgcHJpbnRfc2VydmVyX3NrZWxldG9uKGZfc2tlbGV0b24sIHRzZXJ2aWNlKTsKKyAgICBmX3NrZWxldG9uLmNsb3NlKCk7CisgIH0KKworICB2b2lkIGVtaXRfZG9jKHRfZG9jICpkb2MsIHN0ZDo6b3N0cmVhbSYgb3V0KSB7CisgICAgaWYgKCFkb2MtPmhhc19kb2MoKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAiLyoqIiA8PCBzdGQ6OmVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgLy8gTm8gZW5kbCAtLSBjb21tZW50cyByZWxpYWJseSBoYXZlIGEgbmV3bGluZSBhdCB0aGUgZW5kLgorICAgIC8vIFRoaXMgaXMgdHJ1ZSBldmVuIGZvciBzdHVmZiBsaWtlOgorICAgIC8vICAgICAvKiogbWV0aG9kIGluZm9zICovIHZvaWQgZm9vKC8qKiBodWg/Ki8gMTogaTY0IHN0dWZmKQorICAgIGluZGVudChvdXQpIDw8IGRvYy0+Z2V0X2RvYygpOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIiovIiA8PCBzdGQ6OmVuZGw7CisgIH0KKworcHJpdmF0ZToKKyAgLyoqCisgICAqIFdyaXRlcyBhIHNlcnZlciBza2VsZXRvbiBmb3IgdGhlIHBhc3NlZCBzZXJ2aWNlIHRvIG91dC4KKyAgICovCisgIHZvaWQgcHJpbnRfc2VydmVyX3NrZWxldG9uKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSkgeworICAgIHN0cmluZyBzdmNfbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpOworCisgICAgb3V0IDw8ICIvKiIgPDwgZW5kbAorICAgICAgICA8PCAiICogVGhpcyBhdXRvLWdlbmVyYXRlZCBza2VsZXRvbiBmaWxlIGlsbHVzdHJhdGVzIGhvdyB0byBidWlsZCBhIHNlcnZlci4gSWYgeW91IiA8PCBlbmRsCisgICAgICAgIDw8ICIgKiBpbnRlbmQgdG8gY3VzdG9taXplIGl0LCB5b3Ugc2hvdWxkIGVkaXQgYSBjb3B5IHdpdGggYW5vdGhlciBmaWxlIG5hbWUgdG8gIiA8PCBlbmRsCisgICAgICAgIDw8ICIgKiBhdm9pZCBvdmVyd3JpdGluZyBpdCB3aGVuIHJ1bm5pbmcgdGhlIGdlbmVyYXRvciBhZ2Fpbi4iIDw8IGVuZGwgPDwgIiAqLyIgPDwgZW5kbAorICAgICAgICA8PCAibW9kdWxlICIgPDwgcmVuZGVyX3BhY2thZ2UoKnRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCBzdmNfbmFtZSA8PCAiX3NlcnZlcjsiIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbCA8PCAiaW1wb3J0IHN0ZC5zdGRpbzsiIDw8IGVuZGwgPDwgImltcG9ydCB0aHJpZnQuY29kZWdlbi5wcm9jZXNzb3I7IiA8PCBlbmRsCisgICAgICAgIDw8ICJpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmJpbmFyeTsiIDw8IGVuZGwgPDwgImltcG9ydCB0aHJpZnQuc2VydmVyLnNpbXBsZTsiIDw8IGVuZGwKKyAgICAgICAgPDwgImltcG9ydCB0aHJpZnQuc2VydmVyLnRyYW5zcG9ydC5zb2NrZXQ7IiA8PCBlbmRsIDw8ICJpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5idWZmZXJlZDsiCisgICAgICAgIDw8IGVuZGwgPDwgImltcG9ydCB0aHJpZnQudXRpbC5oYXNoc2V0OyIgPDwgZW5kbCA8PCBlbmRsIDw8ICJpbXBvcnQgIgorICAgICAgICA8PCByZW5kZXJfcGFja2FnZSgqdHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8IHN2Y19uYW1lIDw8ICI7IiA8PCBlbmRsIDw8ICJpbXBvcnQgIgorICAgICAgICA8PCByZW5kZXJfcGFja2FnZSgqZ2V0X3Byb2dyYW0oKSkgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX3R5cGVzOyIgPDwgZW5kbCA8PCBlbmRsIDw8IGVuZGwKKyAgICAgICAgPDwgImNsYXNzICIgPDwgc3ZjX25hbWUgPDwgIkhhbmRsZXIgOiAiIDw8IHN2Y19uYW1lIDw8ICIgeyIgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGhpcygpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgLy8gWW91ciBpbml0aWFsaXphdGlvbiBnb2VzIGhlcmUuIgorICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgICAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICAgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCk7CisgICAgICBwcmludF9mdW5jdGlvbl9zaWduYXR1cmUob3V0LCAqZl9pdGVyKTsKKyAgICAgIG91dCA8PCAiIHsiIDw8IGVuZGw7CisKKyAgICAgIGluZGVudF91cCgpOworCisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIi8vIFlvdXIgaW1wbGVtZW50YXRpb24gZ29lcyBoZXJlLiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAid3JpdGVsbihcIiIKKyAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiBjYWxsZWRcIik7IiA8PCBlbmRsOworCisJICB0X3R5cGUqIHJ0ID0gKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpOworCSAgaWYgKCFydC0+aXNfdm9pZCgpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdHlwZW9mKHJldHVybikuaW5pdDsiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIGluZGVudF9kb3duKCk7CisKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInZvaWQgbWFpbigpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhdXRvIHByb3RvY29sRmFjdG9yeSA9IG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5ISgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiYXV0byBwcm9jZXNzb3IgPSBuZXcgVFNlcnZpY2VQcm9jZXNzb3IhIiA8PCBzdmNfbmFtZSA8PCAiKG5ldyAiIDw8IHN2Y19uYW1lCisgICAgICAgIDw8ICJIYW5kbGVyKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImF1dG8gc2VydmVyVHJhbnNwb3J0ID0gbmV3IFRTZXJ2ZXJTb2NrZXQoOTA5MCk7IgorICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJhdXRvIHRyYW5zcG9ydEZhY3RvcnkgPSBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImF1dG8gc2VydmVyID0gbmV3IFRTaW1wbGVTZXJ2ZXIoIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICIgIHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAic2VydmVyLnNlcnZlKCk7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgLyoqCisgICAqIFdyaXRlcyB0aGUgZGVmaW5pdGlvbiBvZiBhIHN0cnVjdCBvciBhbiBleGNlcHRpb24gdHlwZSB0byBvdXQuCisgICAqLworICB2b2lkIHByaW50X3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisKKyAgICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgOiBURXhjZXB0aW9uIHsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJzdHJ1Y3QgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgeyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X3VwKCk7CisKKyAgICAvLyBEZWNsYXJlIGFsbCBmaWVsZHMuCisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHJlbmRlcl90eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpZiAoIW1lbWJlcnMuZW1wdHkoKSkKKyAgICAgIGluZGVudChvdXQpIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIm1peGluIFRTdHJ1Y3RIZWxwZXJzISgiOworCisgICAgaWYgKCFtZW1iZXJzLmVtcHR5KCkpIHsKKyAgICAgIC8vIElmIHRoZXJlIGFyZSBhbnkgZmllbGRzLCBjb25zdHJ1Y3QgdGhlIFRGaWVsZE1ldGEgYXJyYXkgdG8gcGFzcyB0bworICAgICAgLy8gVFN0cnVjdEhlbHBlcnMuIFdlIGNhbid0IGp1c3QgcGFzcyBhbiBlbXB0eSBhcnJheSBpZiBub3QgYmVjYXVzZSBbXQorICAgICAgLy8gZG9lc24ndCBwYXNzIHRoZSBURmllbGRNZXRhW10gY29uc3RyYWludC4KKyAgICAgIG91dCA8PCAiWyI7CisgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8ICIsIjsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwgZW5kbDsKKworICAgICAgICBpbmRlbnQob3V0KSA8PCAiVEZpZWxkTWV0YShgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgImAsICIgPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCk7CisKKyAgICAgICAgdF9jb25zdF92YWx1ZSogY3YgPSAoKm1faXRlciktPmdldF92YWx1ZSgpOworICAgICAgICB0X2ZpZWxkOjplX3JlcSByZXEgPSAoKm1faXRlciktPmdldF9yZXEoKTsKKyAgICAgICAgb3V0IDw8ICIsICIgPDwgcmVuZGVyX3JlcShyZXEpOworICAgICAgICBpZiAoY3YgIT0gTlVMTCkgeworICAgICAgICAgIG91dCA8PCAiLCBxeyIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSwgY3YpIDw8ICJ9IjsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwgIikiOworICAgICAgfQorCisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIl0iOworICAgIH0KKworICAgIG91dCA8PCAiKTsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICAvKioKKyAgICogUHJpbnRzIHRoZSBEIGZ1bmN0aW9uIHNpZ25hdHVyZSAoaW5jbHVkaW5nIHJldHVybiB0eXBlKSBmb3IgdGhlIGdpdmVuCisgICAqIG1ldGhvZC4KKyAgICovCisgIHZvaWQgcHJpbnRfZnVuY3Rpb25fc2lnbmF0dXJlKG9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogZm4pIHsKKyAgICBvdXQgPDwgcmVuZGVyX3R5cGVfbmFtZShmbi0+Z2V0X3JldHVybnR5cGUoKSkgPDwgIiAiIDw8IGZuLT5nZXRfbmFtZSgpIDw8ICIoIjsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGZuLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIG91dCA8PCByZW5kZXJfdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSwgdHJ1ZSkgPDwgIiAiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB9CisKKyAgICBvdXQgPDwgIikiOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIEQgcmVwcmVzZW50YXRpb24gb2YgdmFsdWUuIFRoZSByZXN1bHQgaXMgZ3VhcmFudGVlZCB0byBiZSBhCisgICAqIHNpbmdsZSBleHByZXNzaW9uOyBmb3IgY29tcGxleCB0eXBlcywgaW1tZWRpYXRlbHkgY2FsbGVkIGRlbGVnYXRlCisgICAqIGxpdGVyYWxzIGFyZSB1c2VkIHRvIGFjaGlldmUgdGhpcy4KKyAgICovCisgIHN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICAgIC8vIFJlc29sdmUgYW55IHR5cGVkZWZzLgorICAgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgICAgb3N0cmluZ3N0cmVhbSBvdXQ7CisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgb3V0IDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCAiY2FzdCgiIDw8IHJlbmRlcl90eXBlX25hbWUodHlwZSkgPDwgIikiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiTCI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgIkNvbXBpbGVyIGVycm9yOiBObyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCAiY2FzdCgiIDw8IHJlbmRlcl90eXBlX25hbWUodHlwZSkgPDwgIikiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgInsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgaW5kZW50KG91dCkgPDwgcmVuZGVyX3R5cGVfbmFtZSh0eXBlKSA8PCAiIHY7IiA8PCBlbmRsOworICAgICAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInYgPSAiIDw8ICh0eXBlLT5pc194Y2VwdGlvbigpID8gIm5ldyAiIDogIiIpIDw8IHJlbmRlcl90eXBlX25hbWUodHlwZSkKKyAgICAgICAgICAgICAgICAgICAgPDwgIigpOyIgPDwgZW5kbDsKKworICAgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgICAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICAgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICAgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgICAgICB0aHJvdyAiVHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiCisgICAgICAgICAgICAgICAgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICAgICAgfQorICAgICAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUoZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgICAgIGluZGVudChvdXQpIDw8ICJ2LnNldCFgIiA8PCB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkgPDwgImAoIiA8PCB2YWwgPDwgIik7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgICAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgICAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgICAgIHN0cmluZyBrZXkgPSByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIHZfaXRlci0+Zmlyc3QpOworICAgICAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUodnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAidlsiOworICAgICAgICAgIGlmICghaXNfaW1tdXRhYmxlX3R5cGUoa3R5cGUpKSB7CisgICAgICAgICAgICBvdXQgPDwgImNhc3QoaW1tdXRhYmxlKCIgPDwgcmVuZGVyX3R5cGVfbmFtZShrdHlwZSkgPDwgIikpIjsKKyAgICAgICAgICB9CisgICAgICAgICAgb3V0IDw8IGtleSA8PCAiXSA9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgICB0X3R5cGUqIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgICAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlcik7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgInYgfj0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgICAgdF90eXBlKiBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgICAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlcik7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgInYgfj0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93ICJDb21waWxlciBlcnJvcjogSW52YWxpZCB0eXBlIGluIHJlbmRlcl9jb25zdF92YWx1ZTogIiArIHR5cGUtPmdldF9uYW1lKCk7CisgICAgICB9CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHY7IiA8PCBlbmRsOworCisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0oKSI7CisgICAgfQorCisgICAgcmV0dXJuIG91dC5zdHIoKTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBEIHBhY2thZ2UgdG8gd2hpY2ggbW9kdWxlcyBmb3IgcHJvZ3JhbSBhcmUgd3JpdHRlbiAod2l0aCBhCisgICAqIHRyYWlsaW5nIGRvdCwgaWYgbm90IGVtcHR5KS4KKyAgICovCisgIHN0cmluZyByZW5kZXJfcGFja2FnZShjb25zdCB0X3Byb2dyYW0mIHByb2dyYW0pIGNvbnN0IHsKKyAgICBzdHJpbmcgcGFja2FnZSA9IHByb2dyYW0uZ2V0X25hbWVzcGFjZSgiZCIpOworICAgIGlmIChwYWNrYWdlLnNpemUoKSA9PSAwKQorICAgICAgcmV0dXJuICIiOworICAgIHJldHVybiBwYWNrYWdlICsgIi4iOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIEQgcmVwZXNlbnRhdGlvbiBvZiB0dHlwZS4KKyAgICoKKyAgICogSWYgaXNBcmcgaXMgdHJ1ZSwgYSBjb25zdCByZWZlcmVuY2UgdG8gdGhlIHR5cGUgd2lsbCBiZSByZXR1cm5lZCBmb3IKKyAgICogc3RydWN0cy4KKyAgICovCisgIHN0cmluZyByZW5kZXJfdHlwZV9uYW1lKGNvbnN0IHRfdHlwZSogdHR5cGUsIGJvb2wgaXNBcmcgPSBmYWxzZSkgY29uc3QgeworICAgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHJldHVybiAidm9pZCI7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgcmV0dXJuICJzdHJpbmciOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICByZXR1cm4gImJvb2wiOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgcmV0dXJuICJieXRlIjsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICByZXR1cm4gInNob3J0IjsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICByZXR1cm4gImludCI7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgcmV0dXJuICJsb25nIjsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICByZXR1cm4gImRvdWJsZSI7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiQ29tcGlsZXIgZXJyb3I6IE5vIEQgdHlwZSBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgdF9jb250YWluZXIqIHRjb250YWluZXIgPSAodF9jb250YWluZXIqKXR0eXBlOworICAgICAgaWYgKHRjb250YWluZXItPmhhc19jcHBfbmFtZSgpKSB7CisgICAgICAgIHJldHVybiB0Y29udGFpbmVyLT5nZXRfY3BwX25hbWUoKTsKKyAgICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgICAgIHRfbWFwKiB0bWFwID0gKHRfbWFwKil0dHlwZTsKKyAgICAgICAgdF90eXBlKiBrdHlwZSA9IHRtYXAtPmdldF9rZXlfdHlwZSgpOworCisgICAgICAgIHN0cmluZyBuYW1lID0gcmVuZGVyX3R5cGVfbmFtZSh0bWFwLT5nZXRfdmFsX3R5cGUoKSkgKyAiWyI7CisgICAgICAgIGlmICghaXNfaW1tdXRhYmxlX3R5cGUoa3R5cGUpKSB7CisgICAgICAgICAgbmFtZSArPSAiaW1tdXRhYmxlKCI7CisgICAgICAgIH0KKyAgICAgICAgbmFtZSArPSByZW5kZXJfdHlwZV9uYW1lKGt0eXBlKTsKKyAgICAgICAgaWYgKCFpc19pbW11dGFibGVfdHlwZShrdHlwZSkpIHsKKyAgICAgICAgICBuYW1lICs9ICIpIjsKKyAgICAgICAgfQorICAgICAgICBuYW1lICs9ICJdIjsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgICAgICB0X3NldCogdHNldCA9ICh0X3NldCopdHR5cGU7CisgICAgICAgIHJldHVybiAiSGFzaFNldCEoIiArIHJlbmRlcl90eXBlX25hbWUodHNldC0+Z2V0X2VsZW1fdHlwZSgpKSArICIpIjsKKyAgICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgICB0X2xpc3QqIHRsaXN0ID0gKHRfbGlzdCopdHR5cGU7CisgICAgICAgIHJldHVybiByZW5kZXJfdHlwZV9uYW1lKHRsaXN0LT5nZXRfZWxlbV90eXBlKCkpICsgIltdIjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodHR5cGUtPmlzX3N0cnVjdCgpICYmIGlzQXJnKSB7CisgICAgICByZXR1cm4gInJlZiBjb25zdCgiICsgdHR5cGUtPmdldF9uYW1lKCkgKyAiKSI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiB0dHlwZS0+Z2V0X25hbWUoKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgRCBUUmVxIGVudW0gbWVtYmVyIGNvcnJlc3BvbmRpbmcgdG8gcmVxLgorICAgKi8KKyAgc3RyaW5nIHJlbmRlcl9yZXEodF9maWVsZDo6ZV9yZXEgcmVxKSBjb25zdCB7CisgICAgc3dpdGNoIChyZXEpIHsKKyAgICBjYXNlIHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQ6CisgICAgICByZXR1cm4gIlRSZXEuT1BUX0lOX1JFUV9PVVQiOworICAgIGNhc2UgdF9maWVsZDo6VF9PUFRJT05BTDoKKyAgICAgIHJldHVybiAiVFJlcS5PUFRJT05BTCI7CisgICAgY2FzZSB0X2ZpZWxkOjpUX1JFUVVJUkVEOgorICAgICAgcmV0dXJuICJUUmVxLlJFUVVJUkVEIjsKKyAgICBkZWZhdWx0OiB7CisgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICAgIHNzIDw8ICJDb21waWxlciBlcnJvcjogSW52YWxpZCByZXF1aXJlbWVudCBsZXZlbCAiIDw8IHJlcTsKKyAgICAgIHRocm93IHNzLnN0cigpOworICAgIH0KKyAgICB9CisgIH0KKworICAvKioKKyAgICogV3JpdGVzIHRoZSBkZWZhdWx0IGxpc3Qgb2YgaW1wb3J0cyAod2hpY2ggYXJlIHdyaXR0ZW4gdG8gZXZlcnkgZ2VuZXJhdGVkCisgICAqIG1vZHVsZSkgdG8gZi4KKyAgICovCisgIHZvaWQgcHJpbnRfZGVmYXVsdF9pbXBvcnRzKG9zdHJlYW0mIG91dCkgeworICAgIGluZGVudChvdXQpIDw8ICJpbXBvcnQgdGhyaWZ0LmJhc2U7IiA8PCBlbmRsIDw8ICJpbXBvcnQgdGhyaWZ0LmNvZGVnZW4uYmFzZTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCAiaW1wb3J0IHRocmlmdC51dGlsLmhhc2hzZXQ7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB3aGV0aGVyIHR5cGUgaXMgwrtpbnRyaW5zaWNhbGx5IGltbXV0YWJsZcKrLCBpbiB0aGUgc2Vuc2UgdGhhdAorICAgKiBhIHZhbHVlIG9mIHRoYXQgdHlwZSBpcyBpbXBsaWNpdGx5IGNhc3RhYmxlIHRvIGltbXV0YWJsZSh0eXBlKSwgYW5kIGl0IGlzCisgICAqIGFsbG93ZWQgZm9yIEFBIGtleXMgd2l0aG91dCBhbiBpbW11dGFibGUoKSBxdWFsaWZpZXIuCisgICAqLworICBib29sIGlzX2ltbXV0YWJsZV90eXBlKHRfdHlwZSogdHlwZSkgY29uc3QgeworICAgIHRfdHlwZSogdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworICAgIHJldHVybiB0dHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHR5cGUtPmlzX2VudW0oKTsKKyAgfQorCisgIC8qCisgICAqIEZpbGUgc3RyZWFtcywgc3RvcmVkIGhlcmUgdG8gYXZvaWQgcGFzc2luZyB0aGVtIGFzIHBhcmFtZXRlcnMgdG8gZXZlcnkKKyAgICogZnVuY3Rpb24uCisgICAqLworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfdHlwZXNfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfaGVhZGVyXzsKKworICBzdHJpbmcgcGFja2FnZV9kaXJfOworfTsKKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihkLCAiRCIsICIiKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9kYXJ0X2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZGFydF9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE0YzMzMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZGFydF9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSwyNTE2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxjY3R5cGU+CisKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKworI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbDIgPSAiXG5cbiI7CisKKy8qKgorICogVXNlIHRoZSBjdXJyZW50IFRocmlmdCB2ZXJzaW9uIGZvciBzdGF0aWMgbGlicmFyaWVzLiAgV2hlbiByZWxlYXNpbmcsIHVwZGF0ZQorICogdGhlIHZlcnNpb24gaW4gdGhlc2UgZmlsZXMuCisgKiAtIGxpYi9kYXJ0L3B1YnNwZWMueWFtbAorICogLSB0ZXN0L2RhcnQvdGVzdF9jbGllbnQvcHVic3BlYy55YW1sCisgKiAtIHR1dG9yaWFsL2RhcnQvY2xpZW50L3B1YnNwZWMueWFtbAorICogLSB0dXRvcmlhbC9kYXJ0L2NvbnNvbGVfY2xpZW50L3B1YnNwZWMueWFtbAorICogLSB0dXRvcmlhbC9kYXJ0L3NlcnZlci9wdWJzcGVjLnlhbWwKKyAqIFNlZSBodHRwczovL3RocmlmdC5hcGFjaGUub3JnL2RvY3MvY29tbWl0dGVycy9Ib3dUb1ZlcnNpb24KKyAqLworc3RhdGljIGNvbnN0IHN0cmluZyBkYXJ0X3RocmlmdF92ZXJzaW9uID0gVEhSSUZUX1ZFUlNJT047CisKKy8qIGZvcndhcmQgZGVjbGFyYXRpb25zICovCitzdHJpbmcgaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHN0cmluZyBuYW1lKTsKKworLyoqCisgKiBEYXJ0IGNvZGUgZ2VuZXJhdG9yCisgKgorICovCitjbGFzcyB0X2RhcnRfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfZGFydF9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgbGlicmFyeV9uYW1lXyA9ICIiOworICAgIGxpYnJhcnlfcHJlZml4XyA9ICIiOworICAgIHBhY2thZ2VfcHJlZml4XyA9ICIiOworICAgIHB1YnNwZWNfbGliXyA9ICIiOworICAgIGZvciggaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgeworICAgICAgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImxpYnJhcnlfbmFtZSIpID09IDApIHsKKyAgICAgICAgbGlicmFyeV9uYW1lXyA9IChpdGVyLT5zZWNvbmQpOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJsaWJyYXJ5X3ByZWZpeCIpID09IDApIHsKKyAgICAgICAgbGlicmFyeV9wcmVmaXhfID0gKGl0ZXItPnNlY29uZCkgKyAiLiI7CisgICAgICAgIHBhY2thZ2VfcHJlZml4XyA9IHJlcGxhY2VfYWxsKGxpYnJhcnlfcHJlZml4XywgIi4iLCAiLyIpOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJwdWJzcGVjX2xpYiIpID09IDApIHsKKyAgICAgICAgcHVic3BlY19saWJfID0gKGl0ZXItPnNlY29uZCk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gZGFydDoiICsgaXRlci0+Zmlyc3Q7CisgICAgICB9CisgICAgfQorCisgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tZGFydCI7CisgIH0KKworICB2b2lkIHNjb3BlX3VwKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBwcmVmaXg9IiAiKSB7CisgICAgb3V0IDw8IHByZWZpeCA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgfQorCisgIHZvaWQgc2NvcGVfZG93bihzdGQ6Om9zdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgcG9zdGZpeD1lbmRsKSB7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgcG9zdGZpeDsKKyAgfQorCisgIHN0cmluZyByZXBsYWNlX2FsbChzdHJpbmcgY29udGVudHMsIHN0cmluZyBzZWFyY2gsIHN0cmluZyByZXBsKSB7CisgICAgc3RyaW5nIHN0cihjb250ZW50cyk7CisKKyAgICBzaXplX3Qgc2xlbiA9IHNlYXJjaC5sZW5ndGgoKTsKKyAgICBzaXplX3QgcmxlbiA9IHJlcGwubGVuZ3RoKCk7CisgICAgc2l6ZV90IGluY3IgPSAocmxlbiA+IDApID8gcmxlbiA6IDE7CisKKyAgICBpZiAoc2xlbiA+IDApIHsKKyAgICAgIHNpemVfdCBmb3VuZCA9IHN0ci5maW5kKHNlYXJjaCk7CisgICAgICB3aGlsZSAoKGZvdW5kICE9IHN0cmluZzo6bnBvcykgJiYgKGZvdW5kIDwgc3RyLmxlbmd0aCgpKSkgeworICAgICAgICBzdHIucmVwbGFjZShmb3VuZCwgc2xlbiwgcmVwbCk7CisgICAgICAgIGZvdW5kID0gc3RyLmZpbmQoc2VhcmNoLCBmb3VuZCArIGluY3IpOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBzdHI7CisgIH0KKworCisgIC8qKgorICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCisgICAqLworCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICB2b2lkIGV4cG9ydF9jbGFzc190b19saWJyYXJ5KHN0cmluZyBmaWxlX25hbWUsIHN0cmluZyBjbGFzc19uYW1lKTsKKworICB2b2lkIGdlbmVyYXRlX2RhcnRfbGlicmFyeSgpOworICB2b2lkIGdlbmVyYXRlX2RhcnRfcHVic3BlYygpOworCisgIHZvaWQgZ2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICB2b2lkIHByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fc3RhdGljLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVmdmFsID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKworICAvKioKKyAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX2RhcnRfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kYXJ0X3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGV4cG9ydF9maWxlX25hbWUgPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfZGFydF9zdHJ1Y3RfcmVhZGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZGFydF92YWxpZGF0b3Ioc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9kYXJ0X3N0cnVjdF9yZXN1bHRfd3JpdGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZGFydF9zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZGFydF9zdHJ1Y3RfdG9zdHJpbmcoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgc3RkOjpzdHJpbmcgZ2V0X2RhcnRfdHlwZV9zdHJpbmcodF90eXBlKiB0eXBlKTsKKyAgdm9pZCBnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnMoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX3NldHRlcnMoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9nZW5lcmljX2lzc2V0X21ldGhvZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2RhcnRfYmVhbl9ib2lsZXJwbGF0ZShzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICBzdGQ6OnN0cmluZyBpbml0X3ZhbHVlKHRfZmllbGQqIHRmaWVsZCk7CisgIHN0ZDo6c3RyaW5nIGdldF9jYXBfbmFtZShzdGQ6OnN0cmluZyBuYW1lKTsKKyAgc3RkOjpzdHJpbmcgZ2V0X21lbWJlcl9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpOworICBzdGQ6OnN0cmluZyBnZXRfYXJnc19jbGFzc19uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpOworICBzdGQ6OnN0cmluZyBnZXRfcmVzdWx0X2NsYXNzX25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7CisgIHN0ZDo6c3RyaW5nIGdldF9maWxlX25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7CisgIHN0ZDo6c3RyaW5nIGdldF9jb25zdGFudHNfY2xhc3NfbmFtZShzdGQ6OnN0cmluZyBuYW1lKTsKKyAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVfaXNzZXRfY2hlY2sodF9maWVsZCogZmllbGQpOworICBzdGQ6OnN0cmluZyBnZW5lcmF0ZV9pc3NldF9jaGVjayhzdGQ6OnN0cmluZyBmaWVsZCk7CisgIHZvaWQgZ2VuZXJhdGVfaXNzZXRfc2V0KG9zdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKworICAvKioKKyAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1hcCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0bWFwLCBzdGQ6OnN0cmluZyBpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGFydF9kb2Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKTsKKworICB2b2lkIGdlbmVyYXRlX2RhcnRfZG9jKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZG9jKTsKKworICAvKioKKyAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKKyAgICovCisKKyAgc3RkOjpzdHJpbmcgZmluZF9saWJyYXJ5X25hbWUodF9wcm9ncmFtKiBwcm9ncmFtKTsKKyAgc3RkOjpzdHJpbmcgZGFydF9saWJyYXJ5KHN0cmluZyBmaWxlX25hbWUpOworICBzdGQ6OnN0cmluZyBzZXJ2aWNlX2ltcG9ydHMoKTsKKyAgc3RkOjpzdHJpbmcgZGFydF90aHJpZnRfaW1wb3J0cygpOworICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIGJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0YmFzZSk7CisgIHN0ZDo6c3RyaW5nIGRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyBnZXRfdHR5cGVfY2xhc3NfbmFtZSh0X3R5cGUqIHR0eXBlKTsKKworICBib29sIHR5cGVfY2FuX2JlX251bGwodF90eXBlKiB0dHlwZSkgeworICAgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisKKyAgICByZXR1cm4gdHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKQorICAgICAgICAgICB8fCB0dHlwZS0+aXNfc3RyaW5nKCk7CisgIH0KKworICB2ZWN0b3I8c3RkOjpzdHJpbmc+IHNwbGl0KGNvbnN0IHN0cmluZyYgcywgY2hhciBkZWxpbSkgeworICAgIHZlY3RvcjxzdGQ6OnN0cmluZz4gZWxlbXM7CisgICAgc3RyaW5nc3RyZWFtIHNzKHMpOworICAgIHN0cmluZyBpdGVtOworICAgIHdoaWxlIChnZXRsaW5lKHNzLCBpdGVtLCBkZWxpbSkpIHsKKyAgICAgIGVsZW1zLnB1c2hfYmFjayhpdGVtKTsKKyAgICB9CisgICAgcmV0dXJuIGVsZW1zOworICB9CisKKyAgc3RkOjpzdHJpbmcgY29uc3RhbnRfbmFtZShzdGQ6OnN0cmluZyBuYW1lKTsKKworcHJpdmF0ZToKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2VfOworCisgIHN0ZDo6c3RyaW5nIGxpYnJhcnlfbmFtZV87CisgIHN0ZDo6c3RyaW5nIGxpYnJhcnlfcHJlZml4XzsKKyAgc3RkOjpzdHJpbmcgcGFja2FnZV9wcmVmaXhfOworICBzdGQ6OnN0cmluZyBwdWJzcGVjX2xpYl87CisKKyAgc3RkOjpzdHJpbmcgYmFzZV9kaXJfOworICBzdGQ6OnN0cmluZyBzcmNfZGlyXzsKKyAgc3RkOjpzdHJpbmcgbGlicmFyeV9leHBvcnRzXzsKK307CisKKy8qKgorICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKKyAqIHN0cmVhbXMuCisgKgorICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7CisgIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7CisKKyAgaWYgKGxpYnJhcnlfbmFtZV8uZW1wdHkoKSkgeworICAgIGxpYnJhcnlfbmFtZV8gPSBmaW5kX2xpYnJhcnlfbmFtZShwcm9ncmFtXyk7CisgIH0KKworICBzdHJpbmcgc3ViZGlyID0gZ2V0X291dF9kaXIoKSArICIvIiArIGxpYnJhcnlfbmFtZV87CisgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKKyAgYmFzZV9kaXJfID0gc3ViZGlyOworCisgIGlmIChsaWJyYXJ5X3ByZWZpeF8uZW1wdHkoKSkgeworICAgIHN1YmRpciArPSAiL2xpYiI7CisgICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOworICAgIHN1YmRpciArPSAiL3NyYyI7CisgICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOworICAgIHNyY19kaXJfID0gc3ViZGlyOworICB9IGVsc2UgeworICAgIHNyY19kaXJfID0gYmFzZV9kaXJfOworICB9Cit9CisKK3N0cmluZyB0X2RhcnRfZ2VuZXJhdG9yOjpmaW5kX2xpYnJhcnlfbmFtZSh0X3Byb2dyYW0qIHByb2dyYW0pIHsKKyAgc3RyaW5nIG5hbWUgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJkYXJ0Iik7CisgIGlmIChuYW1lLmVtcHR5KCkpIHsKKyAgICBuYW1lID0gcHJvZ3JhbS0+Z2V0X25hbWUoKTsKKyAgfQorICBuYW1lID0gcmVwbGFjZV9hbGwobmFtZSwgIi4iLCAiXyIpOworICBuYW1lID0gcmVwbGFjZV9hbGwobmFtZSwgIi0iLCAiXyIpOworICByZXR1cm4gbmFtZTsKK30KKworLyoqCisgKiBUaGUgRGFydCBsaWJyYXJ5CisgKgorICogQHJldHVybiBTdHJpbmcgb2YgdGhlIGxpYnJhcnksIGUuZy4gImxpYnJhcnkgbXlzZXJ2aWNlOyIKKyAqLworc3RyaW5nIHRfZGFydF9nZW5lcmF0b3I6OmRhcnRfbGlicmFyeShzdHJpbmcgZmlsZV9uYW1lKSB7CisgIHN0cmluZyBvdXQgPSAibGlicmFyeSAiICsgbGlicmFyeV9wcmVmaXhfICsgbGlicmFyeV9uYW1lXzsKKyAgaWYgKCFmaWxlX25hbWUuZW1wdHkoKSkgeworICAgIGlmIChsaWJyYXJ5X3ByZWZpeF8uZW1wdHkoKSkgeworICAgICAgb3V0ICs9ICIuc3JjLiIgKyBmaWxlX25hbWU7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCArPSAiLiIgKyBmaWxlX25hbWU7CisgICAgfQorICB9CisgIHJldHVybiBvdXQgKyAiO1xuIjsKK30KKworLyoqCisgKiBQcmludHMgaW1wb3J0cyBmb3Igc2VydmljZXMKKyAqCisgKiBAcmV0dXJuIExpc3Qgb2YgaW1wb3J0cyBmb3Igc2VydmljZXMKKyAqLworc3RyaW5nIHRfZGFydF9nZW5lcmF0b3I6OnNlcnZpY2VfaW1wb3J0cygpIHsKKyAgcmV0dXJuICJpbXBvcnQgJ2RhcnQ6YXN5bmMnOyIgKyBlbmRsOworfQorCisvKioKKyAqIFByaW50cyBzdGFuZGFyZCBkYXJ0IGltcG9ydHMKKyAqCisgKiBAcmV0dXJuIExpc3Qgb2YgaW1wb3J0cyBuZWNlc3NhcnkgZm9yIHRocmlmdAorICovCitzdHJpbmcgdF9kYXJ0X2dlbmVyYXRvcjo6ZGFydF90aHJpZnRfaW1wb3J0cygpIHsKKyAgc3RyaW5nIGltcG9ydHMgPSAiaW1wb3J0ICdkYXJ0OnR5cGVkX2RhdGEnIHNob3cgVWludDhMaXN0OyIgKyBlbmRsICsKKyAgICAgICAgICAgICAgICAgICAiaW1wb3J0ICdwYWNrYWdlOnRocmlmdC90aHJpZnQuZGFydCc7IiArIGVuZGw7CisKKyAgLy8gYWRkIGltcG9ydCBmb3IgdGhpcyBsaWJyYXJ5CisgIGlmIChwYWNrYWdlX3ByZWZpeF8uZW1wdHkoKSkgeworICAgIGltcG9ydHMgKz0gImltcG9ydCAncGFja2FnZToiICsgbGlicmFyeV9uYW1lXyArICIvIiArIGxpYnJhcnlfbmFtZV8gKyAiLmRhcnQnOyIgKyBlbmRsOworICB9IGVsc2UgeworICAgIGltcG9ydHMgKz0gImltcG9ydCAncGFja2FnZToiICsgcGFja2FnZV9wcmVmaXhfICsgbGlicmFyeV9uYW1lXyArICIuZGFydCc7IiArIGVuZGw7CisgIH0KKworICAvLyBhZGQgaW1wb3J0cyBmb3IgaW5jbHVkZWQgdGhyaWZ0IGZpbGVzCisgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKKyAgICBzdHJpbmcgaW5jbHVkZV9uYW1lID0gZmluZF9saWJyYXJ5X25hbWUoaW5jbHVkZXNbaV0pOworICAgIHN0cmluZyBuYW1lZF9pbXBvcnQgPSAidF8iICsgaW5jbHVkZV9uYW1lOworICAgIGlmIChwYWNrYWdlX3ByZWZpeF8uZW1wdHkoKSkgeworICAgICAgaW1wb3J0cyArPSAiaW1wb3J0ICdwYWNrYWdlOiIgKyBpbmNsdWRlX25hbWUgKyAiLyIgKyBpbmNsdWRlX25hbWUgKyAiLmRhcnQnIGFzICIgKyBuYW1lZF9pbXBvcnQgKyAiOyIgKyBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbXBvcnRzICs9ICJpbXBvcnQgJ3BhY2thZ2U6IiArIHBhY2thZ2VfcHJlZml4XyArIGluY2x1ZGVfbmFtZSArICIuZGFydCcgYXMgIiArIG5hbWVkX2ltcG9ydCArICI7IiArIGVuZGw7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGltcG9ydHM7Cit9CisKKy8qKgorICogTm90IHVzZWQKKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7CisgIGdlbmVyYXRlX2RhcnRfbGlicmFyeSgpOworCisgIGlmIChsaWJyYXJ5X3ByZWZpeF8uZW1wdHkoKSkgeworICAgIGdlbmVyYXRlX2RhcnRfcHVic3BlYygpOworICB9Cit9CisKK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGFydF9saWJyYXJ5KCkgeworICBzdHJpbmcgZl9saWJyYXJ5X25hbWU7CisgIGlmIChsaWJyYXJ5X3ByZWZpeF8uZW1wdHkoKSkgeworICAgIGZfbGlicmFyeV9uYW1lID0gYmFzZV9kaXJfICsgIi9saWIvIiArIGxpYnJhcnlfbmFtZV8gKyAiLmRhcnQiOworICB9IGVsc2UgeworICAgIGZfbGlicmFyeV9uYW1lID0gZ2V0X291dF9kaXIoKSArICIvIiArIGxpYnJhcnlfbmFtZV8gKyAiLmRhcnQiOworICB9CisKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2xpYnJhcnk7CisgIGZfbGlicmFyeS5vcGVuKGZfbGlicmFyeV9uYW1lLmNfc3RyKCkpOworCisgIGZfbGlicmFyeSA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOworICBmX2xpYnJhcnkgPDwgImxpYnJhcnkgIiA8PCBsaWJyYXJ5X3ByZWZpeF8gPDwgbGlicmFyeV9uYW1lXyA8PCAiOyIgPDwgZW5kbDI7CisgIGZfbGlicmFyeSA8PCBsaWJyYXJ5X2V4cG9ydHNfOworCisgIGZfbGlicmFyeS5jbG9zZSgpOworfQorCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmV4cG9ydF9jbGFzc190b19saWJyYXJ5KHN0cmluZyBmaWxlX25hbWUsIHN0cmluZyBjbGFzc19uYW1lKSB7CisgIHN0cmluZyBzdWJkaXI7CisgIGlmIChsaWJyYXJ5X3ByZWZpeF8uZW1wdHkoKSkgeworICAgIHN1YmRpciA9ICJzcmMiOworICB9IGVsc2UgeworICAgIHN1YmRpciA9IGxpYnJhcnlfbmFtZV87CisgIH0KKyAgbGlicmFyeV9leHBvcnRzXyArPSAiZXhwb3J0ICciICsgc3ViZGlyICsgIi8iICsgZmlsZV9uYW1lICsgIi5kYXJ0JyBzaG93ICIgKyBjbGFzc19uYW1lICsgIjsiICsgZW5kbDsKK30KKwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kYXJ0X3B1YnNwZWMoKSB7CisgIHN0cmluZyBmX3B1YnNwZWNfbmFtZSA9IGJhc2VfZGlyXyArICIvcHVic3BlYy55YW1sIjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3B1YnNwZWM7CisgIGZfcHVic3BlYy5vcGVuKGZfcHVic3BlY19uYW1lLmNfc3RyKCkpOworCisgIGluZGVudChmX3B1YnNwZWMpIDw8ICJuYW1lOiAiIDw8IGxpYnJhcnlfbmFtZV8gPDwgZW5kbDsKKyAgaW5kZW50KGZfcHVic3BlYykgPDwgInZlcnNpb246IDAuMC4xIiA8PCBlbmRsOworICBpbmRlbnQoZl9wdWJzcGVjKSA8PCAiZGVzY3JpcHRpb246IEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyIiA8PCBlbmRsOworICBmX3B1YnNwZWMgPDwgZW5kbDsKKworICBpbmRlbnQoZl9wdWJzcGVjKSA8PCAiZW52aXJvbm1lbnQ6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KGZfcHVic3BlYykgPDwgInNkazogXjEuMTIuMCIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9wdWJzcGVjIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfcHVic3BlYykgPDwgImRlcGVuZGVuY2llczoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGlmIChwdWJzcGVjX2xpYl8uZW1wdHkoKSkgeworICAgIC8vIGRlZmF1bHQgdG8gcmVsYXRpdmUgcGF0aCB3aXRoaW4gd29ya2luZyBkaXJlY3RvcnksIHdoaWNoIHdvcmtzIGZvciB0ZXN0cworICAgIGluZGVudChmX3B1YnNwZWMpIDw8ICJ0aHJpZnQ6ICAjIF4iIDw8IGRhcnRfdGhyaWZ0X3ZlcnNpb24gPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQoZl9wdWJzcGVjKSA8PCAicGF0aDogLi4vLi4vLi4vLi4vbGliL2RhcnQiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfSBlbHNlIHsKKyAgICBjb25zdCB2ZWN0b3I8c3RkOjpzdHJpbmc+IGxpbmVzID0gc3BsaXQocHVic3BlY19saWJfLCAnfCcpOworICAgIGZvciAoc2l6ZV90IGxpbmVfaW5kZXggPSAwOyBsaW5lX2luZGV4IDwgbGluZXMuc2l6ZSgpOyBsaW5lX2luZGV4KyspIHsKKyAgICAgIGluZGVudChmX3B1YnNwZWMpIDw8IGxpbmVzW2xpbmVfaW5kZXhdIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgLy8gYWRkIGluY2x1ZGVkIHRocmlmdCBmaWxlcyBhcyBkZXBlbmRlbmNpZXMKKyAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgeworICAgIHN0cmluZyBpbmNsdWRlX25hbWUgPSBmaW5kX2xpYnJhcnlfbmFtZShpbmNsdWRlc1tpXSk7CisgICAgaW5kZW50KGZfcHVic3BlYykgPDwgaW5jbHVkZV9uYW1lIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChmX3B1YnNwZWMpIDw8ICJwYXRoOiAuLi8iIDw8IGluY2x1ZGVfbmFtZSA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX3B1YnNwZWMgPDwgZW5kbDsKKworICBmX3B1YnNwZWMuY2xvc2UoKTsKK30KKworLyoqCisgKiBOb3QgdXNlZAorICoKKyAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgICh2b2lkKXR0eXBlZGVmOworfQorCisvKioKKyAqIEVudW1zIGFyZSBhIGNsYXNzIHdpdGggYSBzZXQgb2Ygc3RhdGljIGNvbnN0YW50cy4KKyAqCisgKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgc3RyaW5nIGZpbGVfbmFtZSA9IGdldF9maWxlX25hbWUodGVudW0tPmdldF9uYW1lKCkpOworCisgIHN0cmluZyBmX2VudW1fbmFtZSA9IHNyY19kaXJfICsgIi8iICsgZmlsZV9uYW1lICsgIi5kYXJ0IjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2VudW07CisgIGZfZW51bS5vcGVuKGZfZW51bV9uYW1lLmNfc3RyKCkpOworCisgIC8vIENvbW1lbnQgYW5kIGFkZCBsaWJyYXJ5CisgIGZfZW51bSA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBkYXJ0X2xpYnJhcnkoZmlsZV9uYW1lKSA8PCBlbmRsOworCisgIHN0cmluZyBjbGFzc19uYW1lID0gdGVudW0tPmdldF9uYW1lKCk7CisgIGV4cG9ydF9jbGFzc190b19saWJyYXJ5KGZpbGVfbmFtZSwgY2xhc3NfbmFtZSk7CisgIGZfZW51bSA8PCAiY2xhc3MgIiA8PCBjbGFzc19uYW1lOworICBzY29wZV91cChmX2VudW0pOworCisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworICAgIGluZGVudChmX2VudW0pIDw8ICJzdGF0aWMgY29uc3QgaW50ICIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8IHZhbHVlIDw8ICI7IgorICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0KKworICAvLyBDcmVhdGUgYSBzdGF0aWMgU2V0IHdpdGggYWxsIHZhbGlkIHZhbHVlcyBmb3IgdGhpcyBlbnVtCisgIGZfZW51bSA8PCBlbmRsOworCisgIGluZGVudChmX2VudW0pIDw8ICJzdGF0aWMgZmluYWwgU2V0PGludD4gVkFMSURfVkFMVUVTID0gbmV3IFNldC5mcm9tKFsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBib29sIGZpcnN0VmFsdWUgPSB0cnVlOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIC8vIHBvcHVsYXRlIHNldAorICAgIGluZGVudChmX2VudW0pIDw8IChmaXJzdFZhbHVlID8gIiIgOiAiLCAiKTsKKyAgICBmX2VudW0gPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGVuZGw7CisgICAgZmlyc3RWYWx1ZSA9IGZhbHNlOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX2VudW0pIDw8ICJdKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfZW51bSkgPDwgInN0YXRpYyBmaW5hbCBNYXA8aW50LCBTdHJpbmc+IFZBTFVFU19UT19OQU1FUyA9IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmaXJzdFZhbHVlID0gdHJ1ZTsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBpbmRlbnQoZl9lbnVtKSA8PCAoZmlyc3RWYWx1ZSA/ICIiIDogIiwgIik7CisgICAgZl9lbnVtICA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIjogJyIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInIiA8PCBlbmRsOworICAgIGZpcnN0VmFsdWUgPSBmYWxzZTsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9lbnVtKSA8PCAifTsiIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihmX2VudW0pOyAvLyBlbmQgY2xhc3MKKworICBmX2VudW0uY2xvc2UoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBjbGFzcyB0aGF0IGhvbGRzIGFsbCB0aGUgY29uc3RhbnRzLgorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKSB7CisgIGlmIChjb25zdHMuZW1wdHkoKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIHN0cmluZyBjbGFzc19uYW1lID0gZ2V0X2NvbnN0YW50c19jbGFzc19uYW1lKHByb2dyYW1fbmFtZV8pOworICBzdHJpbmcgZmlsZV9uYW1lID0gZ2V0X2ZpbGVfbmFtZShjbGFzc19uYW1lKTsKKworICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IHNyY19kaXJfICsgIi8iICsgZmlsZV9uYW1lICsgIi5kYXJ0IjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2NvbnN0czsKKyAgZl9jb25zdHMub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOworCisgIC8vIFByaW50IGhlYWRlcgorICBmX2NvbnN0cyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBkYXJ0X2xpYnJhcnkoZmlsZV9uYW1lKSA8PCBlbmRsOworICBmX2NvbnN0cyA8PCBkYXJ0X3RocmlmdF9pbXBvcnRzKCkgPDwgZW5kbDsKKworICBleHBvcnRfY2xhc3NfdG9fbGlicmFyeShmaWxlX25hbWUsIGNsYXNzX25hbWUpOworICBpbmRlbnQoZl9jb25zdHMpIDw8ICJjbGFzcyAiIDw8IGNsYXNzX25hbWU7CisgIHNjb3BlX3VwKGZfY29uc3RzKTsKKworICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgcHJpbnRfY29uc3RfdmFsdWUoZl9jb25zdHMsCisgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF92YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICBmX2NvbnN0cyA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihmX2NvbnN0cyk7CisKKyAgZl9jb25zdHMuY2xvc2UoKTsKK30KKwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpwcmludF9jb25zdF92YWx1ZShzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9zdGF0aWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWZ2YWwpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaW5kZW50KG91dCk7CisgIGlmICghZGVmdmFsKSB7CisgICAgb3V0IDw8IChpbl9zdGF0aWMgPyAidmFyICIgOiAic3RhdGljIGZpbmFsICIpOworICB9CisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIGlmICghZGVmdmFsKSB7CisgICAgICBvdXQgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIjsKKyAgICB9CisgICAgc3RyaW5nIHYyID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOworICAgIG91dCA8PCBuYW1lOworICAgIG91dCA8PCAiID0gIiA8PCB2MiA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIGlmICghZGVmdmFsKSB7CisgICAgICBvdXQgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIjsKKyAgICB9CisgICAgb3V0IDw8IG5hbWU7CisgICAgb3V0IDw8ICIgPSAiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIG91dCA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiIDw8IG5hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKCkiOworICAgIGluZGVudF91cCgpOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgb3V0IDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiLi4iIDw8IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSA8PCAiID0gIiA8PCB2YWw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8ICI7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgaWYgKCFkZWZ2YWwpIHsKKyAgICAgIG91dCA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiOworICAgIH0KKyAgICBvdXQgPDwgbmFtZSA8PCAiID0iOworICAgIHNjb3BlX3VwKG91dCk7CisKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwga3R5cGUsIHZfaXRlci0+Zmlyc3QpOworICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICBpbmRlbnQob3V0KSA8PCBrZXkgPDwgIjogIiA8PCB2YWwgPDwgIiwiIDw8IGVuZGw7CisgICAgfQorICAgIHNjb3BlX2Rvd24ob3V0LCAiOyIgKyBlbmRsKTsKKworICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgeworICAgIGlmICghZGVmdmFsKSB7CisgICAgICBvdXQgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIjsKKyAgICB9CisgICAgb3V0IDw8IG5hbWUgPDwgIiA9ICI7CisgICAgdF90eXBlKiBldHlwZTsKKyAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBvdXQgPDwgIlsiIDw8IGVuZGw7CisgICAgICBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgIm5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiLmZyb20oWyIgPDwgZW5kbDsKKyAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9CisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworCisgICAgaW5kZW50X3VwKCk7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBldHlwZSwgKnZfaXRlcik7CisgICAgICBpbmRlbnQob3V0KSA8PCB2YWwgPDwgIiwiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisKKyAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiXTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJdKTsiIDw8IGVuZGw7CisgICAgfQorCisgIH0gZWxzZSB7CisgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiB0eXBlICIgKyB0eXBlLT5nZXRfbmFtZSgpOworICB9Cit9CisKK3N0cmluZyB0X2RhcnRfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICAodm9pZCluYW1lOworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlbmRlcjsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmVuZGVyIDw8ICInIiA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICInIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJlbmRlciA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgIH0gZWxzZSB7CisgICAgc3RyaW5nIHQgPSB0bXAoInRtcCIpOworICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwgdCwgdHlwZSwgdmFsdWUsIHRydWUpOworICAgIG91dCA8PCBlbmRsOworICAgIHJlbmRlciA8PCB0OworICB9CisKKyAgcmV0dXJuIHJlbmRlci5zdHIoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLiBUaGlzIGlzIGEgY2xhc3MKKyAqIHdpdGggZGF0YSBtZW1iZXJzLCByZWFkKCksIHdyaXRlKCksIGFuZCBhbiBpbm5lciBJc3NldCBjbGFzcy4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgZ2VuZXJhdGVfZGFydF9zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOworfQorCisvKioKKyAqIEV4Y2VwdGlvbnMgYXJlIHN0cnVjdHMsIGJ1dCB0aGV5IGluaGVyaXQgZnJvbSBFeGNlcHRpb24KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX2RhcnRfc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7Cit9CisKKy8qKgorICogRGFydCBzdHJ1Y3QgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kYXJ0X3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKKyAgc3RyaW5nIGZpbGVfbmFtZSA9IGdldF9maWxlX25hbWUodHN0cnVjdC0+Z2V0X25hbWUoKSk7CisgIHN0cmluZyBmX3N0cnVjdF9uYW1lID0gc3JjX2Rpcl8gKyAiLyIgKyBmaWxlX25hbWUgKyAiLmRhcnQiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc3RydWN0OworICBmX3N0cnVjdC5vcGVuKGZfc3RydWN0X25hbWUuY19zdHIoKSk7CisKKyAgZl9zdHJ1Y3QgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgZGFydF9saWJyYXJ5KGZpbGVfbmFtZSkgPDwgZW5kbDsKKworICBzdHJpbmcgaW1wb3J0czsKKworICBmX3N0cnVjdCA8PCBkYXJ0X3RocmlmdF9pbXBvcnRzKCkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kYXJ0X3N0cnVjdF9kZWZpbml0aW9uKGZfc3RydWN0LCB0c3RydWN0LCBpc19leGNlcHRpb24sIGZhbHNlLCBmaWxlX25hbWUpOworCisgIGZfc3RydWN0LmNsb3NlKCk7Cit9CisKKy8qKgorICogRGFydCBzdHJ1Y3QgZGVmaW5pdGlvbi4gVGhpcyBoYXMgdmFyaW91cyBwYXJhbWV0ZXJzLCBhcyBpdCBjb3VsZCBiZQorICogZ2VuZXJhdGVkIHN0YW5kYWxvbmUgb3IgaW5zaWRlIGFub3RoZXIgY2xhc3MgYXMgYSBoZWxwZXIuIElmIGl0CisgKiBpcyBhIGhlbHBlciB0aGFuIGl0IGlzIGEgc3RhdGljIGNsYXNzLgorICoKKyAqIEBwYXJhbSB0c3RydWN0ICAgICAgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKiBAcGFyYW0gaXNfZXhjZXB0aW9uIElzIHRoaXMgYW4gZXhjZXB0aW9uPworICogQHBhcmFtIGluX2NsYXNzICAgICBJZiBpbnNpZGUgYSBjbGFzcywgbmVlZHMgdG8gYmUgc3RhdGljIGNsYXNzCisgKiBAcGFyYW0gaXNfcmVzdWx0ICAgIElmIHRoaXMgaXMgYSByZXN1bHQgaXQgbmVlZHMgYSBkaWZmZXJlbnQgd3JpdGVyCisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGFydF9zdHJ1Y3RfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGV4cG9ydF9maWxlX25hbWUpIHsKKyAgZ2VuZXJhdGVfZGFydF9kb2Mob3V0LCB0c3RydWN0KTsKKworICBzdHJpbmcgY2xhc3NfbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGlmICghZXhwb3J0X2ZpbGVfbmFtZS5lbXB0eSgpKSB7CisgICAgZXhwb3J0X2NsYXNzX3RvX2xpYnJhcnkoZXhwb3J0X2ZpbGVfbmFtZSwgY2xhc3NfbmFtZSk7CisgIH0KKyAgaW5kZW50KG91dCkgPDwgImNsYXNzICIgPDwgY2xhc3NfbmFtZSA8PCAiICI7CisKKyAgb3V0IDw8ICJpbXBsZW1lbnRzIFRCYXNlIjsKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIG91dCA8PCAiLCBFeGNlcHRpb24gIjsKKyAgfQorICBzY29wZV91cChvdXQpOworCisgIGluZGVudChvdXQpIDw8ICJzdGF0aWMgZmluYWwgVFN0cnVjdCBfU1RSVUNUX0RFU0MgPSBuZXcgVFN0cnVjdChcIiIgPDwgY2xhc3NfbmFtZQorICAgICAgICAgICAgICA8PCAiXCIpOyIgPDwgZW5kbDsKKworICAvLyBNZW1iZXJzIGFyZSBwdWJsaWMgZm9yIC1kYXJ0LCBwcml2YXRlIGZvciAtZGFydGJlYW4KKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgaW5kZW50KG91dCkgPDwgInN0YXRpYyBmaW5hbCBURmllbGQgXyIgPDwgY29uc3RhbnRfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgPDwgIl9GSUVMRF9ERVNDID0gbmV3IFRGaWVsZChcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiwgIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICIsICIgPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIik7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0KKworICBvdXQgPDwgZW5kbDsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgZ2VuZXJhdGVfZGFydF9kb2Mob3V0LCAqbV9pdGVyKTsKKyAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSArICIgXyIKKyAgICAgICAgICAgICAgICA8PCBnZXRfbWVtYmVyX25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCBpbml0X3ZhbHVlKCptX2l0ZXIpIDw8ICI7IiA8PCBlbmRsOworCisgICAgaW5kZW50KG91dCkgPDwgInN0YXRpYyBjb25zdCBpbnQgIiA8PCB1cGNhc2Vfc3RyaW5nKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICA8PCAiID0gIiA8PCAoKm1faXRlciktPmdldF9rZXkoKSA8PCAiOyIgPDwgZW5kbDsKKyAgfQorCisgIG91dCA8PCBlbmRsOworCisgIC8vIElubmVyIElzc2V0IGNsYXNzCisgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBpZiAoIXR5cGVfY2FuX2JlX251bGwoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSkgeworICAgICAgICBzdHJpbmcgZmllbGRfbmFtZSA9IGdldF9tZW1iZXJfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAiYm9vbCBfX2lzc2V0XyIgPDwgZmllbGRfbmFtZSA8PCAiID0gZmFsc2U7IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgfQorCisgIG91dCA8PCBlbmRsOworCisgIC8vIERlZmF1bHQgY29uc3RydWN0b3IKKyAgaW5kZW50KG91dCkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCkiOworICBzY29wZV91cChvdXQpOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKKyAgICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzLiIgKyBnZXRfbWVtYmVyX25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHQsCisgICAgICAgICAgICAgICAgICAgICAgICAoKm1faXRlciktPmdldF92YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOworICAgIH0KKyAgfQorICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworCisgIGdlbmVyYXRlX2RhcnRfYmVhbl9ib2lsZXJwbGF0ZShvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnMob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfZ2VuZXJpY19maWVsZF9zZXR0ZXJzKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2dlbmVyaWNfaXNzZXRfbWV0aG9kKG91dCwgdHN0cnVjdCk7CisKKyAgZ2VuZXJhdGVfZGFydF9zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7CisgIGlmIChpc19yZXN1bHQpIHsKKyAgICBnZW5lcmF0ZV9kYXJ0X3N0cnVjdF9yZXN1bHRfd3JpdGVyKG91dCwgdHN0cnVjdCk7CisgIH0gZWxzZSB7CisgICAgZ2VuZXJhdGVfZGFydF9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7CisgIH0KKyAgZ2VuZXJhdGVfZGFydF9zdHJ1Y3RfdG9zdHJpbmcob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfZGFydF92YWxpZGF0b3Iob3V0LCB0c3RydWN0KTsKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byByZWFkIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGFydF9zdHJ1Y3RfcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInJlYWQoVFByb3RvY29sIGlwcm90KSI7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIC8vIERlY2xhcmUgc3RhY2sgdG1wIHZhcmlhYmxlcyBhbmQgcmVhZCBzdHJ1Y3QgaGVhZGVyCisgIGluZGVudChvdXQpIDw8ICJURmllbGQgZmllbGQ7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZFN0cnVjdEJlZ2luKCk7IiA8PCBlbmRsOworCisgIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcworICBpbmRlbnQob3V0KSA8PCAid2hpbGUgKHRydWUpIjsKKyAgc2NvcGVfdXAob3V0KTsKKworICAvLyBSZWFkIGJlZ2lubmluZyBmaWVsZCBtYXJrZXIKKyAgaW5kZW50KG91dCkgPDwgImZpZWxkID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKTsiIDw8IGVuZGw7CisKKyAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyIGFuZCBicmVhaworICBpbmRlbnQob3V0KSA8PCAiaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuU1RPUCkiOworICBzY29wZV91cChvdXQpOworICBpbmRlbnQob3V0KSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisKKyAgLy8gU3dpdGNoIHN0YXRlbWVudCBvbiB0aGUgZmllbGQgd2UgYXJlIHJlYWRpbmcKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGQuaWQpIjsKKyAgc2NvcGVfdXAob3V0KTsKKworICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IHVwY2FzZV9zdHJpbmcoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGQudHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpIjsKKyAgICBzY29wZV91cChvdXQpOworCisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy4iKTsKKyAgICBnZW5lcmF0ZV9pc3NldF9zZXQob3V0LCAqZl9pdGVyKTsKKworICAgIHNjb3BlX2Rvd24ob3V0LCAiIGVsc2UiKTsKKyAgICBzY29wZV91cChvdXQpOworICAgIGluZGVudChvdXQpIDw8ICJUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKG91dCk7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICAvLyBJbiB0aGUgZGVmYXVsdCBjYXNlIHdlIHNraXAgdGhlIGZpZWxkCisgIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICBzY29wZV9kb3duKG91dCk7CisKKyAgLy8gUmVhZCBmaWVsZCBlbmQgbWFya2VyCisgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkRmllbGRFbmQoKTsiIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkU3RydWN0RW5kKCk7IiA8PCBlbmRsMjsKKworICAvLyBpbiBub24tYmVhbnMgc3R5bGUsIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMgb2YgcHJpbWl0aXZlIHR5cGUKKyAgLy8gKHdoaWNoIGNhbiBiZSBjaGVja2VkIGhlcmUgYnV0IG5vdCBpbiB0aGUgZ2VuZXJhbCB2YWxpZGF0ZSBtZXRob2QpCisgIGluZGVudChvdXQpIDw8ICIvLyBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIG9mIHByaW1pdGl2ZSB0eXBlLCB3aGljaCBjYW4ndCBiZSAiCisgICAgICAgICAgICAgICAgICJjaGVja2VkIGluIHRoZSB2YWxpZGF0ZSBtZXRob2QiIDw8IGVuZGw7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQgJiYgIXR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSkgeworICAgICAgc3RyaW5nIGZpZWxkX25hbWUgPSBnZXRfbWVtYmVyX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIV9faXNzZXRfIiA8PCBmaWVsZF9uYW1lIDw8ICIpIjsKKyAgICAgIHNjb3BlX3VwKG91dCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoVFByb3RvY29sRXJyb3JUeXBlLlVOS05PV04sIFwiUmVxdWlyZWQgZmllbGQgJyIKKyAgICAgICAgICA8PCBmaWVsZF9uYW1lCisgICAgICAgICAgPDwgIicgd2FzIG5vdCBmb3VuZCBpbiBzZXJpYWxpemVkIGRhdGEhIFN0cnVjdDogXCIgKyB0b1N0cmluZygpKTsiIDw8IGVuZGw7CisgICAgICBzY29wZV9kb3duKG91dCwgZW5kbDIpOworICAgIH0KKyAgfQorCisgIC8vIHBlcmZvcm1zIHZhcmlvdXMgY2hlY2tzIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQorICBpbmRlbnQob3V0KSA8PCAidmFsaWRhdGUoKTsiIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihvdXQsIGVuZGwyKTsKK30KKworLy8gZ2VuZXJhdGVzIGRhcnQgbWV0aG9kIHRvIHBlcmZvcm0gdmFyaW91cyBjaGVja3MKKy8vIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kYXJ0X3ZhbGlkYXRvcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJ2YWxpZGF0ZSgpIjsKKyAgc2NvcGVfdXAob3V0KTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgaW5kZW50KG91dCkgPDwgIi8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMiIDw8IGVuZGw7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgIHN0cmluZyBmaWVsZF9uYW1lID0gZ2V0X21lbWJlcl9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT0gbnVsbCkiOworICAgICAgICBzY29wZV91cChvdXQpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKFRQcm90b2NvbEVycm9yVHlwZS5VTktOT1dOLCBcIlJlcXVpcmVkIGZpZWxkICciCisgICAgICAgICAgICAgICAgICAgIDw8IGZpZWxkX25hbWUgPDwgIicgd2FzIG5vdCBwcmVzZW50ISBTdHJ1Y3Q6IFwiICsgdG9TdHJpbmcoKSk7IgorICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICBzY29wZV9kb3duKG91dCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiLy8gYWxhcywgd2UgY2Fubm90IGNoZWNrICciIDw8IGZpZWxkX25hbWUKKyAgICAgICAgICAgICAgICAgICAgPDwgIicgYmVjYXVzZSBpdCdzIGEgcHJpbWl0aXZlIGFuZCB5b3UgY2hvc2UgdGhlIG5vbi1iZWFucyBnZW5lcmF0b3IuIiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIGNoZWNrIHRoYXQgZmllbGRzIG9mIHR5cGUgZW51bSBoYXZlIHZhbGlkIHZhbHVlcworICBpbmRlbnQob3V0KSA8PCAiLy8gY2hlY2sgdGhhdCBmaWVsZHMgb2YgdHlwZSBlbnVtIGhhdmUgdmFsaWQgdmFsdWVzIiA8PCBlbmRsOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfZmllbGQqIGZpZWxkID0gKCpmX2l0ZXIpOworICAgIHRfdHlwZSogdHlwZSA9IGZpZWxkLT5nZXRfdHlwZSgpOworICAgIC8vIGlmIGZpZWxkIGlzIGFuIGVudW0sIGNoZWNrIHRoYXQgaXRzIHZhbHVlIGlzIHZhbGlkCisgICAgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgc3RyaW5nIGZpZWxkX25hbWUgPSBnZXRfbWVtYmVyX25hbWUoZmllbGQtPmdldF9uYW1lKCkpOworICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkKSA8PCAiICYmICEiIDw8IGdldF90dHlwZV9jbGFzc19uYW1lKHR5cGUpCisgICAgICAgICAgICAgICAgICA8PCAiLlZBTElEX1ZBTFVFUy5jb250YWlucygiIDw8IGZpZWxkX25hbWUgPDwgIikpIjsKKyAgICAgIHNjb3BlX3VwKG91dCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKFRQcm90b2NvbEVycm9yVHlwZS5VTktOT1dOLCBcIlRoZSBmaWVsZCAnIgorICAgICAgICAgICAgICAgICAgPDwgZmllbGRfbmFtZSA8PCAiJyBoYXMgYmVlbiBhc3NpZ25lZCB0aGUgaW52YWxpZCB2YWx1ZSAiCisgICAgICAgICAgICAgICAgICA8PCAiJCIgPDwgZmllbGRfbmFtZSA8PCAiXCIpOyIgPDwgZW5kbDsKKyAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICB9CisgIH0KKworICBzY29wZV9kb3duKG91dCwgZW5kbDIpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHdyaXRlIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kYXJ0X3N0cnVjdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgIndyaXRlKFRQcm90b2NvbCBvcHJvdCkiOworICBzY29wZV91cChvdXQpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gcGVyZm9ybXMgdmFyaW91cyBjaGVja3MgKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCisgIGluZGVudChvdXQpIDw8ICJ2YWxpZGF0ZSgpOyIgPDwgZW5kbDI7CisKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlU3RydWN0QmVnaW4oX1NUUlVDVF9ERVNDKTsiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHJpbmcgZmllbGRfbmFtZSA9IGdldF9tZW1iZXJfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpOworICAgIGJvb2wgY291bGRfYmVfdW5zZXQgPSAoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMOworICAgIGlmIChjb3VsZF9iZV91bnNldCkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCpmX2l0ZXIpIDw8ICIpIjsKKyAgICAgIHNjb3BlX3VwKG91dCk7CisgICAgfQorICAgIGJvb2wgbnVsbF9hbGxvd2VkID0gdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpOworICAgIGlmIChudWxsX2FsbG93ZWQpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiAhPSBudWxsKSI7CisgICAgICBzY29wZV91cChvdXQpOworICAgIH0KKworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkQmVnaW4oXyIgPDwgY29uc3RhbnRfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgPDwgIl9GSUVMRF9ERVNDKTsiIDw8IGVuZGw7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLiIpOworCisgICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7CisKKyAgICBpZiAobnVsbF9hbGxvd2VkKSB7CisgICAgICBzY29wZV9kb3duKG91dCk7CisgICAgfQorICAgIGlmIChjb3VsZF9iZV91bnNldCkgeworICAgICAgc2NvcGVfZG93bihvdXQpOworICAgIH0KKyAgfQorICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAorICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlU3RydWN0RW5kKCk7IgorICAgICAgPDwgZW5kbDsKKworICBzY29wZV9kb3duKG91dCwgZW5kbDIpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHdyaXRlIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QsCisgKiB3aGljaCBpcyBhIGZ1bmN0aW9uIHJlc3VsdC4gVGhlc2UgZmllbGRzIGFyZSBvbmx5IHdyaXR0ZW4KKyAqIGlmIHRoZXkgYXJlIHNldCBpbiB0aGUgSXNzZXQgYXJyYXksIGFuZCBvbmx5IG9uZSBvZiB0aGVtCisgKiBjYW4gYmUgc2V0IGF0IGEgdGltZS4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kYXJ0X3N0cnVjdF9yZXN1bHRfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgIndyaXRlKFRQcm90b2NvbCBvcHJvdCkiOworICBzY29wZV91cChvdXQpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlU3RydWN0QmVnaW4oX1NUUlVDVF9ERVNDKTsiIDw8IGVuZGwyOworCisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAiOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgIiBlbHNlIGlmICI7CisgICAgfQorCisgICAgb3V0IDw8ICIodGhpcy4iIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCpmX2l0ZXIpIDw8ICIpIjsKKyAgICBzY29wZV91cChvdXQpOworCisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRCZWdpbihfIiA8PCBjb25zdGFudF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICA8PCAiX0ZJRUxEX0RFU0MpOyIgPDwgZW5kbDsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMuIik7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKworICAgIHNjb3BlX2Rvd24ob3V0LCAiIik7CisgIH0KKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihvdXQsIGVuZGwyKTsKK30KKwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnMoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgeworICAvLyBjcmVhdGUgdGhlIGdldHRlcgorICBpbmRlbnQob3V0KSA8PCAiZ2V0RmllbGRWYWx1ZShpbnQgZmllbGRJRCkiOworICBzY29wZV91cChvdXQpOworCisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkSUQpIjsKKyAgc2NvcGVfdXAob3V0KTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOworICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBnZXRfbWVtYmVyX25hbWUoZmllbGQtPmdldF9uYW1lKCkpOworCisgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCB1cGNhc2Vfc3RyaW5nKGZpZWxkX25hbWUpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihcIkZpZWxkICRmaWVsZElEIGRvZXNuJ3QgZXhpc3QhXCIpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICBzY29wZV9kb3duKG91dCk7ICAvLyBzd2l0Y2gKKyAgc2NvcGVfZG93bihvdXQsIGVuZGwyKTsgIC8vIG1ldGhvZAorfQorCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2dlbmVyaWNfZmllbGRfc2V0dGVycyhzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7CisKKyAgLy8gY3JlYXRlIHRoZSBzZXR0ZXIKKyAgaW5kZW50KG91dCkgPDwgInNldEZpZWxkVmFsdWUoaW50IGZpZWxkSUQsIE9iamVjdCB2YWx1ZSkiOworICBzY29wZV91cChvdXQpOworCisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkSUQpIjsKKyAgc2NvcGVfdXAob3V0KTsKKworICAvLyBidWlsZCB1cCB0aGUgYm9kaWVzIG9mIGJvdGggdGhlIGdldHRlciBhbmQgc2V0dGVyIGF0IG9uY2UKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKKyAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZ2V0X21lbWJlcl9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKTsKKworICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgdXBjYXNlX3N0cmluZyhmaWVsZF9uYW1lKSA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGluZGVudChvdXQpIDw8ICJpZiAodmFsdWUgPT0gbnVsbCkiOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgaW5kZW50KG91dCkgPDwgInVuc2V0IiA8PCBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSkgPDwgIigpOyIgPDwgZW5kbDsKKworICAgIHNjb3BlX2Rvd24ob3V0LCAiIGVsc2UiKTsKKyAgICBzY29wZV91cChvdXQpOworICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gdmFsdWU7IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKworICAgIGluZGVudChvdXQpIDw8ICJicmVhazsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgInRocm93IG5ldyBBcmd1bWVudEVycm9yKFwiRmllbGQgJGZpZWxkSUQgZG9lc24ndCBleGlzdCFcIik7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIHNjb3BlX2Rvd24ob3V0KTsgIC8vIHN3aXRjaAorICBzY29wZV9kb3duKG91dCwgZW5kbDIpOyAgLy8gbWV0aG9kCit9CisKKy8vIENyZWF0ZXMgYSBnZW5lcmljIGlzU2V0IG1ldGhvZCB0aGF0IHRha2VzIHRoZSBmaWVsZCBudW1iZXIgYXMgYXJndW1lbnQKK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ2VuZXJpY19pc3NldF9tZXRob2Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBjcmVhdGUgdGhlIGlzU2V0IG1ldGhvZAorICBpbmRlbnQob3V0KSA8PCAiLy8gUmV0dXJucyB0cnVlIGlmIGZpZWxkIGNvcnJlc3BvbmRpbmcgdG8gZmllbGRJRCBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgIgorICAgICAgICAgICAgICAgICAidmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJib29sIGlzU2V0KGludCBmaWVsZElEKSI7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGRJRCkiOworICBzY29wZV91cChvdXQpOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOworICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgdXBjYXNlX3N0cmluZyhmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiAiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkKSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgInRocm93IG5ldyBBcmd1bWVudEVycm9yKFwiRmllbGQgJGZpZWxkSUQgZG9lc24ndCBleGlzdCFcIik7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIHNjb3BlX2Rvd24ob3V0KTsgIC8vIHN3aXRjaAorICBzY29wZV9kb3duKG91dCwgZW5kbDIpOyAgLy8gbWV0aG9kCit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2V0IG9mIERhcnQgQmVhbiBib2lsZXJwbGF0ZSBmdW5jdGlvbnMgKHNldHRlcnMsIGdldHRlcnMsIGV0Yy4pCisgKiBmb3IgdGhlIGdpdmVuIHN0cnVjdC4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kYXJ0X2JlYW5fYm9pbGVycGxhdGUob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7CisgICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGdldF9tZW1iZXJfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSk7CisgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUgPSBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSk7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiLy8gIiA8PCBmaWVsZF9uYW1lIDw8IGVuZGw7CisKKyAgICAvLyBTaW1wbGUgZ2V0dGVyCisgICAgZ2VuZXJhdGVfZGFydF9kb2Mob3V0LCBmaWVsZCk7CisgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgZ2V0ICIgPDwgZmllbGRfbmFtZSA8PCAiID0+IHRoaXMuXyIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDI7CisKKyAgICAvLyBTaW1wbGUgc2V0dGVyCisgICAgZ2VuZXJhdGVfZGFydF9kb2Mob3V0LCBmaWVsZCk7CisgICAgaW5kZW50KG91dCkgPDwgInNldCAiIDw8IGZpZWxkX25hbWUgPDwgIigiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICIgPDwgZmllbGRfbmFtZSA8PCAiKSI7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBpbmRlbnQob3V0KSA8PCAidGhpcy5fIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSAiIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfaXNzZXRfc2V0KG91dCwgZmllbGQpOworICAgIHNjb3BlX2Rvd24ob3V0LCBlbmRsMik7CisKKyAgICAvLyBpc1NldCBtZXRob2QKKyAgICBpbmRlbnQob3V0KSA8PCAiYm9vbCBpcyIgPDwgZ2V0X2NhcF9uYW1lKCJzZXQiKSA8PCBjYXBfbmFtZSA8PCAiKCkiOworICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7CisgICAgICBvdXQgPDwgIiA9PiB0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiICE9IG51bGw7IiA8PCBlbmRsMjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICIgPT4gdGhpcy5fX2lzc2V0XyIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDI7CisgICAgfQorCisgICAgLy8gVW5zZXR0ZXIKKyAgICBpbmRlbnQob3V0KSA8PCAidW5zZXQiIDw8IGNhcF9uYW1lIDw8ICIoKSI7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBudWxsOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuX19pc3NldF8iIDw8IGZpZWxkX25hbWUgPDwgIiA9IGZhbHNlOyIgPDwgZW5kbDsKKyAgICB9CisgICAgc2NvcGVfZG93bihvdXQsIGVuZGwyKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHRvU3RyaW5nKCkgbWV0aG9kIGZvciB0aGUgZ2l2ZW4gc3RydWN0CisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGFydF9zdHJ1Y3RfdG9zdHJpbmcob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgIlN0cmluZyB0b1N0cmluZygpIjsKKyAgc2NvcGVfdXAob3V0KTsKKworICBpbmRlbnQob3V0KSA8PCAiU3RyaW5nQnVmZmVyIHJldCA9IG5ldyBTdHJpbmdCdWZmZXIoXCIiCisgICAgICAgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIihcIik7IiA8PCBlbmRsMjsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgYm9vbCBjb3VsZF9iZV91bnNldCA9ICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7CisgICAgaWYgKGNvdWxkX2JlX3Vuc2V0KSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikiOworICAgICAgc2NvcGVfdXAob3V0KTsKKyAgICB9CisKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqZl9pdGVyKTsKKyAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZ2V0X21lbWJlcl9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKTsKKworICAgIGlmICghZmlyc3QpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXQud3JpdGUoXCIsIFwiKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICJyZXQud3JpdGUoXCIiIDw8IGZpZWxkX25hbWUgPDwgIjpcIik7IiA8PCBlbmRsOworICAgIGJvb2wgY2FuX2JlX251bGwgPSB0eXBlX2Nhbl9iZV9udWxsKGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAoY2FuX2JlX251bGwpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9PSBudWxsKSI7CisgICAgICBzY29wZV91cChvdXQpOworICAgICAgaW5kZW50KG91dCkgPDwgInJldC53cml0ZShcIm51bGxcIik7IiA8PCBlbmRsOworICAgICAgc2NvcGVfZG93bihvdXQsICIgZWxzZSIpOworICAgICAgc2NvcGVfdXAob3V0KTsKKyAgICB9CisKKyAgICBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX2JpbmFyeSgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0LndyaXRlKFwiQklOQVJZXCIpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19lbnVtKCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJTdHJpbmcgIiA8PCBmaWVsZF9uYW1lIDw8ICJfbmFtZSA9ICIKKyAgICAgICAgICAgICAgICAgIDw8IGdldF90dHlwZV9jbGFzc19uYW1lKGZpZWxkLT5nZXRfdHlwZSgpKQorICAgICAgICAgICAgICAgICAgPDwgIi5WQUxVRVNfVE9fTkFNRVNbdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIl07IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGZpZWxkX25hbWUgPDwgIl9uYW1lICE9IG51bGwpIjsKKyAgICAgIHNjb3BlX3VwKG91dCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0LndyaXRlKCIgPDwgZmllbGRfbmFtZSA8PCAiX25hbWUpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXQud3JpdGUoXCIgKFwiKTsiIDw8IGVuZGw7CisgICAgICBzY29wZV9kb3duKG91dCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0LndyaXRlKHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBmaWVsZF9uYW1lIDw8ICJfbmFtZSAhPSBudWxsKSI7CisgICAgICBzY29wZV91cChvdXQpOworICAgICAgaW5kZW50KG91dCkgPDwgInJldC53cml0ZShcIilcIik7IiA8PCBlbmRsOworICAgICAgc2NvcGVfZG93bihvdXQpOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0LndyaXRlKHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpZiAoY2FuX2JlX251bGwpIHsKKyAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICB9CisgICAgaWYgKGNvdWxkX2JlX3Vuc2V0KSB7CisgICAgICBzY29wZV9kb3duKG91dCk7CisgICAgfQorCisgICAgb3V0IDw8IGVuZGw7CisgICAgZmlyc3QgPSBmYWxzZTsKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJyZXQud3JpdGUoXCIpXCIpOyIgPDwgZW5kbDI7CisKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiByZXQudG9TdHJpbmcoKTsiIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihvdXQsIGVuZGwyKTsKK30KKworLyoqCisgKiBSZXR1cm5zIGEgc3RyaW5nIHdpdGggdGhlIGRhcnQgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIHRocmlmdCB0eXBlCisgKiAoZS5nLiBmb3IgdGhlIHR5cGUgc3RydWN0IGl0IHJldHVybnMgIlRUeXBlLlNUUlVDVCIpCisgKi8KK3N0ZDo6c3RyaW5nIHRfZGFydF9nZW5lcmF0b3I6OmdldF9kYXJ0X3R5cGVfc3RyaW5nKHRfdHlwZSogdHlwZSkgeworICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5MSVNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiVFR5cGUuTUFQIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiVFR5cGUuU0VUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJUVHlwZS5TVFJVQ1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiVFR5cGUuSTMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICByZXR1cm4gZ2V0X2RhcnRfdHlwZV9zdHJpbmcoKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHN3aXRjaCAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCkpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICByZXR1cm4gIlRUeXBlLlZPSUQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIlRUeXBlLlNUUklORyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIlRUeXBlLkJPT0wiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiVFR5cGUuQllURSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiVFR5cGUuSTE2IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJUVHlwZS5JMzIiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlRUeXBlLkk2NCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiVFR5cGUuRE9VQkxFIjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIlVua25vd24gdGhyaWZ0IHR5cGUgXCIiICsgdHlwZS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiIHBhc3NlZCB0byB0X2RhcnRfZ2VuZXJhdG9yOjpnZXRfZGFydF90eXBlX3N0cmluZyEiKTsKKyAgICAgIGJyZWFrOyAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4hCisgICAgfQorICB9IGVsc2UgeworICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigKKyAgICAgICAgIlVua25vd24gdGhyaWZ0IHR5cGUgXCIiICsgdHlwZS0+Z2V0X25hbWUoKQorICAgICAgICArICJcIiBwYXNzZWQgdG8gdF9kYXJ0X2dlbmVyYXRvcjo6Z2V0X2RhcnRfdHlwZV9zdHJpbmchIik7IC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiEKKyAgfQorfQorCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZmlsZV9uYW1lID0gZ2V0X2ZpbGVfbmFtZShzZXJ2aWNlX25hbWVfKTsKKyAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gc3JjX2Rpcl8gKyAiLyIgKyBmaWxlX25hbWUgKyAiLmRhcnQiOworICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7CisKKyAgZl9zZXJ2aWNlXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBkYXJ0X2xpYnJhcnkoZmlsZV9uYW1lKSA8PCBlbmRsOworICBmX3NlcnZpY2VfIDw8IHNlcnZpY2VfaW1wb3J0cygpIDw8IGRhcnRfdGhyaWZ0X2ltcG9ydHMoKSA8PCBlbmRsOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKKworICBmX3NlcnZpY2VfLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzX2lmYWNlID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kc19pZmFjZSA9ICIgZXh0ZW5kcyAiICsgZ2V0X3R0eXBlX2NsYXNzX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICB9CisKKyAgZ2VuZXJhdGVfZGFydF9kb2MoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOworCisgIHN0cmluZyBjbGFzc19uYW1lID0gc2VydmljZV9uYW1lXzsKKyAgZXhwb3J0X2NsYXNzX3RvX2xpYnJhcnkoZ2V0X2ZpbGVfbmFtZShzZXJ2aWNlX25hbWVfKSwgY2xhc3NfbmFtZSk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiYWJzdHJhY3QgY2xhc3MgIiA8PCBjbGFzc19uYW1lIDw8IGV4dGVuZHNfaWZhY2U7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgICBnZW5lcmF0ZV9kYXJ0X2RvYyhmX3NlcnZpY2VfLCAqZl9pdGVyKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8ICI7IiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfLCBlbmRsMik7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHN0cnVjdHMgZm9yIGFsbCB0aGUgc2VydmljZSBhcmdzIGFuZCByZXR1cm4gdHlwZXMKKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UKKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgZ2VuZXJhdGVfZGFydF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCB0cywgZmFsc2UsIGZhbHNlKTsKKyAgICBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IGdldF90dHlwZV9jbGFzc19uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBleHRlbmRzX2NsaWVudCA9ICIgZXh0ZW5kcyAiICsgZXh0ZW5kcyArICJDbGllbnQiOworICB9CisKKyAgc3RyaW5nIGNsYXNzX25hbWUgPSBzZXJ2aWNlX25hbWVfICsgIkNsaWVudCI7CisgIGV4cG9ydF9jbGFzc190b19saWJyYXJ5KGdldF9maWxlX25hbWUoc2VydmljZV9uYW1lXyksIGNsYXNzX25hbWUpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImNsYXNzICIgPDwgY2xhc3NfbmFtZSA8PCBleHRlbmRzX2NsaWVudAorICAgICAgICAgICAgICAgICAgICAgPDwgIiBpbXBsZW1lbnRzICIgPDwgc2VydmljZV9uYW1lXzsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgY2xhc3NfbmFtZSA8PCAiKFRQcm90b2NvbCBpcHJvdCwgW1RQcm90b2NvbCBvcHJvdCA9IG51bGxdKSI7CisKKyAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICI6IHN1cGVyKGlwcm90LCBvcHJvdCk7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0gZWxzZSB7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJfaXByb3QgPSBpcHJvdDsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJfb3Byb3QgPSAob3Byb3QgPT0gbnVsbCkgPyBpcHJvdCA6IG9wcm90OyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICB9CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJUUHJvdG9jb2wgX2lwcm90OyIgPDwgZW5kbDI7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJUUHJvdG9jb2wgZ2V0IGlwcm90ID0+IF9pcHJvdDsiIDw8IGVuZGwyOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVFByb3RvY29sIF9vcHJvdDsiIDw8IGVuZGwyOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVFByb3RvY29sIGdldCBvcHJvdCA9PiBfb3Byb3Q7IiA8PCBlbmRsMjsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImludCBfc2VxaWQgPSAwOyIgPDwgZW5kbDI7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpbnQgZ2V0IHNlcWlkID0+IF9zZXFpZDsiIDw8IGVuZGwyOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaW50IG5leHRTZXFpZCgpID0+ICsrX3NlcWlkOyIgPDwgZW5kbDI7CisgIH0KKworICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAvLyBPcGVuIGZ1bmN0aW9uCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiIGFzeW5jIjsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICAgIC8vIEdldCB0aGUgc3RydWN0IG9mIGZ1bmN0aW9uIGNhbGwgcGFyYW1zCisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisKKyAgICBzdHJpbmcgYXJnc25hbWUgPSBnZXRfYXJnc19jbGFzc19uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKworICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdAorICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiLCAiCisgICAgICAgICAgICAgICA8PCAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJUTWVzc2FnZVR5cGUuT05FV0FZIiA6ICJUTWVzc2FnZVR5cGUuQ0FMTCIpCisgICAgICAgICAgICAgICA8PCAiLCBuZXh0U2VxaWQoKSkpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgYXJnc25hbWUgPDwgIiBhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbDsKKworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBzdHJpbmcgYXJnX2ZpZWxkX25hbWUgPSBnZXRfbWVtYmVyX25hbWUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJhcmdzLiIgPDwgYXJnX2ZpZWxkX25hbWUgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICAgPDwgYXJnX2ZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJhcmdzLndyaXRlKG9wcm90KTsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwyOworCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJhd2FpdCBvcHJvdC50cmFuc3BvcnQuZmx1c2goKTsiIDw8IGVuZGwyOworCisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlRNZXNzYWdlIG1zZyA9IGlwcm90LnJlYWRNZXNzYWdlQmVnaW4oKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmIChtc2cudHlwZSA9PSBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OKSI7CisgICAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVEFwcGxpY2F0aW9uRXJyb3IgZXJyb3IgPSBUQXBwbGljYXRpb25FcnJvci5yZWFkKGlwcm90KTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlwcm90LnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ0aHJvdyBlcnJvcjsiIDw8IGVuZGw7CisgICAgICBzY29wZV9kb3duKGZfc2VydmljZV8sIGVuZGwyKTsKKworICAgICAgc3RyaW5nIHJlc3VsdF9jbGFzcyA9IGdldF9yZXN1bHRfY2xhc3NfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IHJlc3VsdF9jbGFzcyA8PCAiIHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdF9jbGFzcyA8PCAiKCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXN1bHQucmVhZChpcHJvdCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpcHJvdC5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKworICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKHJlc3VsdC4iIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCJzdWNjZXNzIikgPDwgIikiOworICAgICAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gcmVzdWx0LnN1Y2Nlc3M7IiA8PCBlbmRsOworICAgICAgICBzY29wZV9kb3duKGZfc2VydmljZV8sIGVuZGwyKTsKKyAgICAgIH0KKworICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgc3RyaW5nIHJlc3VsdF9maWVsZF9uYW1lID0gZ2V0X21lbWJlcl9uYW1lKCgqeF9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKHJlc3VsdC4iIDw8IHJlc3VsdF9maWVsZF9uYW1lIDw8ICIgIT0gbnVsbCkiOworICAgICAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ0aHJvdyByZXN1bHQuIiA8PCByZXN1bHRfZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICAgIH0KKworICAgICAgLy8gSWYgeW91IGdldCBoZXJlIGl0J3MgYW4gZXhjZXB0aW9uLCB1bmxlc3MgYSB2b2lkIGZ1bmN0aW9uCisgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ0aHJvdyBuZXcgVEFwcGxpY2F0aW9uRXJyb3IoVEFwcGxpY2F0aW9uRXJyb3JUeXBlLk1JU1NJTkdfUkVTVUxULCBcIiIKKyAgICAgICAgICAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0XCIpOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8sIGVuZGwyKTsKKyAgfQorCisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXywgZW5kbDIpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIC8vIHR5cGVkZWYKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ0eXBlZGVmIHZvaWQgUHJvY2Vzc0Z1bmN0aW9uKGludCBzZXFpZCwgVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpOyIgPDwgZW5kbDI7CisKKyAgLy8gRXh0ZW5kcyBzdHVmZgorICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gZ2V0X3R0eXBlX2NsYXNzX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gIiBleHRlbmRzICIgKyBleHRlbmRzICsgIlByb2Nlc3NvciI7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KKyAgc3RyaW5nIGNsYXNzX25hbWUgPSAgc2VydmljZV9uYW1lXyArICJQcm9jZXNzb3IiOworICBleHBvcnRfY2xhc3NfdG9fbGlicmFyeShnZXRfZmlsZV9uYW1lKHNlcnZpY2VfbmFtZV8pLCBjbGFzc19uYW1lKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJjbGFzcyAiIDw8IGNsYXNzX25hbWUgPDwgZXh0ZW5kc19wcm9jZXNzb3IgPDwgIiBpbXBsZW1lbnRzIFRQcm9jZXNzb3IiOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgY2xhc3NfbmFtZSA8PCAiKCIgPDwgc2VydmljZV9uYW1lXyA8PCAiIGlmYWNlKSI7CisgIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiOiBzdXBlcihpZmFjZSkiOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWZhY2VfID0gaWZhY2U7IiA8PCBlbmRsOworICB9CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlBST0NFU1NfTUFQW1wiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgIDw8ICJcIl0gPSAiIDw8IGdldF9tZW1iZXJfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICI7IiA8PCBlbmRsOworICB9CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXywgZW5kbDIpOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCBzZXJ2aWNlX25hbWVfIDw8ICIgaWZhY2VfOyIgPDwgZW5kbDsKKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJmaW5hbCBNYXA8U3RyaW5nLCBQcm9jZXNzRnVuY3Rpb24+IFBST0NFU1NfTUFQID0ge307IiA8PCBlbmRsOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBzZXJ2ZXIgaW1wbGVtZW50YXRpb24KKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJib29sIHByb2Nlc3MoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpIjsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVE1lc3NhZ2UgbXNnID0gaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJQcm9jZXNzRnVuY3Rpb24gZm4gPSBQUk9DRVNTX01BUFttc2cubmFtZV07IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmIChmbiA9PSBudWxsKSI7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgVFR5cGUuU1RSVUNUKTsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaXByb3QucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVEFwcGxpY2F0aW9uRXJyb3IgeCA9IG5ldyBUQXBwbGljYXRpb25FcnJvcihUQXBwbGljYXRpb25FcnJvclR5cGUuVU5LTk9XTl9NRVRIT0QsICIKKyAgICAgICAgICJcIkludmFsaWQgbWV0aG9kIG5hbWU6ICdcIittc2cubmFtZStcIidcIik7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShtc2cubmFtZSwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgbXNnLnNlcWlkKSk7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIngud3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAib3Byb3QudHJhbnNwb3J0LmZsdXNoKCk7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiB0cnVlOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJmbihtc2cuc2VxaWQsIGlwcm90LCBvcHJvdCk7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiB0cnVlOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfLCBlbmRsMik7IC8vIHByb2Nlc3MgZnVuY3Rpb24KKworICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKKyAgfQorCisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXywgZW5kbDIpOyAvLyBjbGFzcworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCBnZXRfcmVzdWx0X2NsYXNzX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSk7CisgIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7CisgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKKyAgfQorCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7CisgIH0KKworICBnZW5lcmF0ZV9kYXJ0X3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sICZyZXN1bHQsIGZhbHNlLCB0cnVlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBwcm9jZXNzIGZ1bmN0aW9uIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgYSBkaXNwYXRjaGVyIGZvcgorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgICh2b2lkKXRzZXJ2aWNlOworCisgIGJvb2wgYXdhaXRfcmVzdWx0ID0gKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSk7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8IGdldF9tZW1iZXJfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpIDw8ICIoaW50IHNlcWlkLCBUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkiOworICBpZiAoYXdhaXRfcmVzdWx0KSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiIGFzeW5jIjsKKyAgfQorICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICBzdHJpbmcgYXJnc25hbWUgPSBnZXRfYXJnc19jbGFzc19uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSk7CisgIHN0cmluZyByZXN1bHRuYW1lID0gZ2V0X3Jlc3VsdF9jbGFzc19uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSk7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8IGFyZ3NuYW1lIDw8ICIgYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiYXJncy5yZWFkKGlwcm90KTsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaXByb3QucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgcmVzdWx0bmFtZSA8PCAiIHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbDsKKyAgfQorCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiB4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidHJ5IjsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCisgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICBpZiAoYXdhaXRfcmVzdWx0KSB7CisgICAgZl9zZXJ2aWNlXyA8PCAicmVzdWx0LnN1Y2Nlc3MgPSBhd2FpdCAiOworICB9CisgIGZfc2VydmljZV8gPDwgImlmYWNlXy4iIDw8IGdldF9tZW1iZXJfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpIDw8ICIoIjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCBnZXRfbWVtYmVyX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgfQorICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKKworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgeGNlcHRpb25zLnNpemUoKSA+IDApIHsKKyAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgc3RyaW5nIHJlc3VsdF9maWVsZF9uYW1lID0gZ2V0X21lbWJlcl9uYW1lKCgqeF9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgICBzY29wZV9kb3duKGZfc2VydmljZV8sICIiKTsKKyAgICAgIGZfc2VydmljZV8gPDwgIiBvbiAiIDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCkpCisgICAgICAgICAgICAgIDw8ICIgY2F0Y2goIiA8PCByZXN1bHRfZmllbGRfbmFtZSA8PCAiKSI7CisgICAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJlc3VsdC4iIDw8IHJlc3VsdF9maWVsZF9uYW1lIDw8ICIgPSAiCisgICAgICAgICAgICAgICAgICAgPDwgcmVzdWx0X2ZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXywgIiAiKTsKKyAgICBmX3NlcnZpY2VfIDw8ICJjYXRjaCAodGgpIjsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIi8vIEludGVybmFsIGVycm9yIiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVEFwcGxpY2F0aW9uRXJyb3IgeCA9IG5ldyAiCisgICAgICAgICAgICAgICAiVEFwcGxpY2F0aW9uRXJyb3IoVEFwcGxpY2F0aW9uRXJyb3JUeXBlLklOVEVSTkFMX0VSUk9SLCBcIkludGVybmFsIGVycm9yIHByb2Nlc3NpbmcgIgorICAgICAgICAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIik7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgIDw8ICJcIiwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgc2VxaWQpKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ4LndyaXRlKG9wcm90KTsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJvcHJvdC50cmFuc3BvcnQuZmx1c2goKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIH0KKworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICA8PCAiXCIsIFRNZXNzYWdlVHlwZS5SRVBMWSwgc2VxaWQpKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXN1bHQud3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm9wcm90LnRyYW5zcG9ydC5mbHVzaCgpOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXywgZW5kbDIpOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkCisgKiBAcGFyYW0gcHJlZml4IFRoZSB2YXJpYWJsZSBuYW1lIG9yIGNvbnRhaW5lciBmb3IgdGhpcyBmaWVsZAorICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4KSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgc3RyaW5nIGZpZWxkX25hbWUgPSBnZXRfbWVtYmVyX25hbWUodGZpZWxkLT5nZXRfbmFtZSgpKTsKKworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyBmaWVsZF9uYW1lOworICB9CisKKyAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyBmaWVsZF9uYW1lOworCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworCisgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gaXByb3QuIjsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICAgIG91dCA8PCAicmVhZEJpbmFyeSgpOyI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nKCk7IjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgb3V0IDw8ICJyZWFkQm9vbCgpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8ICJyZWFkQnl0ZSgpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCAicmVhZEkxNigpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIG91dCA8PCAicmVhZEkzMigpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAicmVhZEk2NCgpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIG91dCA8PCAicmVhZERvdWJsZSgpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBEYXJ0IG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJyZWFkSTMyKCk7IjsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgIGZpZWxkX25hbWUuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGFuIHVuc2VyaWFsaXplciBmb3IgYSBzdHJ1Y3QsIGludm9rZXMgcmVhZCgpCisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIucmVhZChpcHJvdCk7IiA8PCBlbmRsOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGNvbnRhaW5lciBieSByZWFkaW5nIGl0cyBzaXplIGFuZCB0aGVuIGl0ZXJhdGluZworICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKKyAgaW5kZW50KG91dCk7CisgIHNjb3BlX3VwKG91dCwgIiIpOworCisgIHN0cmluZyBvYmo7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIG9iaiA9IHRtcCgiX21hcCIpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIG9iaiA9IHRtcCgiX3NldCIpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBvYmogPSB0bXAoIl9saXN0Iik7CisgIH0KKworICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJUTWFwICIgPDwgb2JqIDw8ICIgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIlRTZXQgIiA8PCBvYmogPDwgIiA9IGlwcm90LnJlYWRTZXRCZWdpbigpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIlRMaXN0ICIgPDwgb2JqIDw8ICIgPSBpcHJvdC5yZWFkTGlzdEJlZ2luKCk7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHR5cGUpIDw8ICIoKTsiIDw8IGVuZGw7CisKKyAgLy8gRm9yIGxvb3AgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cworICBzdHJpbmcgaSA9IHRtcCgiX2kiKTsKKyAgaW5kZW50KG91dCkgPDwgImZvciAoaW50ICIgPDwgaSA8PCAiID0gMDsgIiA8PCBpIDw8ICIgPCAiIDw8IG9iaiA8PCAiLmxlbmd0aCIKKyAgICAgICAgICAgICAgPDwgIjsgIgorICAgICAgICAgICAgICA8PCAiKysiIDw8IGkgPDwgIikiOworICBzY29wZV91cChvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4KTsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICAvLyBSZWFkIGNvbnRhaW5lciBlbmQKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTWFwRW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkU2V0RW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZExpc3RFbmQoKTsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBrZXkgPSB0bXAoIl9rZXkiKTsKKyAgc3RyaW5nIHZhbCA9IHRtcCgiX3ZhbCIpOworICB0X2ZpZWxkIGZrZXkodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7CisgIHRfZmllbGQgZnZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKKworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZma2V5KSA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmdmFsKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXkpOworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsKTsKKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIlsiIDw8IGtleSA8PCAiXSA9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIHNldCBlbGVtZW50CisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworCisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5hZGQoIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBsaXN0IGVsZW1lbnQKKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworCisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5hZGQoIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCisgKgorICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCisgKiBAcGFyYW0gcHJlZml4IE5hbWUgdG8gcHJlcGVuZCB0byBmaWVsZCBuYW1lCisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4KSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgc3RyaW5nIGZpZWxkX25hbWUgPSBnZXRfbWVtYmVyX25hbWUodGZpZWxkLT5nZXRfbmFtZSgpKTsKKworICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyBmaWVsZF9uYW1lOworICB9CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBwcmVmaXggKyBmaWVsZF9uYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBwcmVmaXggKyBmaWVsZF9uYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKworICAgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgZmllbGRfbmFtZTsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3QuIjsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICAgIG91dCA8PCAid3JpdGVCaW5hcnkoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZygiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUJvb2woIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUJ5dGUoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCAid3JpdGVJMTYoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAid3JpdGVJNjQoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIG91dCA8PCAid3JpdGVEb3VibGUoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBEYXJ0IG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIik7IjsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgIHByZWZpeC5jX3N0cigpLAorICAgICAgICAgICBmaWVsZF9uYW1lLmNfc3RyKCksCisgICAgICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKKyAgfQorfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCisgKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7CisgICh2b2lkKXRzdHJ1Y3Q7CisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLndyaXRlKG9wcm90KTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhIGNvbnRhaW5lciBieSB3cml0aW5nIGl0cyBzaXplIHRoZW4gdGhlIGVsZW1lbnRzLgorICoKKyAqIEBwYXJhbSB0dHlwZSAgVGhlIHR5cGUgb2YgY29udGFpbmVyCisgKiBAcGFyYW0gcHJlZml4IFN0cmluZyBwcmVmaXggZm9yIGZpZWxkcworICovCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7CisgIGluZGVudChvdXQpOworICBzY29wZV91cChvdXQsICIiKTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgc3RyaW5nIGl0ZXIgPSB0bXAoIl9rZXkiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVNYXBCZWdpbihuZXcgVE1hcCgiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKQorICAgICAgICAgICAgICAgIDw8ICIsICIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIgPDwgcHJlZml4IDw8ICIubGVuZ3RoKSk7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlU2V0QmVnaW4obmV3IFRTZXQoIiA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpCisgICAgICAgICAgICAgICAgPDwgIiwgIiA8PCBwcmVmaXggPDwgIi5sZW5ndGgpKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUxpc3RCZWdpbihuZXcgVExpc3QoIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwgcHJlZml4IDw8ICIubGVuZ3RoKSk7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0KKworICBzdHJpbmcgaXRlciA9IHRtcCgiZWxlbSIpOworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImZvciAodmFyICIgPDwgaXRlciA8PCAiIGluICIgPDwgcHJlZml4IDw8ICIua2V5cykiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSB8fCB0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImZvciAodmFyICIgPDwgaXRlciA8PCAiIGluICIgPDwgcHJlZml4IDw8ICIpIjsKKyAgfQorCisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGl0ZXIsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgaXRlcik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgaXRlcik7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZU1hcEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTZXRFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUxpc3RFbmQoKTsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBtYXApIHsKKyAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCAiIik7CisgIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCBtYXAgKyAiWyIgKyBpdGVyICsgIl0iKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCwgIiIpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBzZXQuCisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBpdGVyKSB7CisgIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbGlzdC4KKyAqLwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKK30KKworLyoqCisgKiBSZXR1cm5zIGEgRGFydCB0eXBlIG5hbWUKKyAqCisgKiBAcGFyYW0gdHR5cGUgVGhlIHR5cGUKKyAqIEByZXR1cm4gRGFydCB0eXBlIG5hbWUsIGkuZS4gTWFwPEtleSwgVmFsdWU+CisgKi8KK3N0cmluZyB0X2RhcnRfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSkgeworICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworCisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICByZXR1cm4gYmFzZV90eXBlX25hbWUoKHRfYmFzZV90eXBlKil0dHlwZSk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiaW50IjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X21hcCogdG1hcCA9ICh0X21hcCopdHR5cGU7CisgICAgcmV0dXJuICJNYXA8IiArIHR5cGVfbmFtZSh0bWFwLT5nZXRfa2V5X3R5cGUoKSkgKyAiLCAiCisgICAgICAgICAgICAgICAgICArIHR5cGVfbmFtZSh0bWFwLT5nZXRfdmFsX3R5cGUoKSkgKyAiPiI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF9zZXQqIHRzZXQgPSAodF9zZXQqKXR0eXBlOworICAgIHJldHVybiAiU2V0PCIgKyB0eXBlX25hbWUodHNldC0+Z2V0X2VsZW1fdHlwZSgpKSArICI+IjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgdF9saXN0KiB0bGlzdCA9ICh0X2xpc3QqKXR0eXBlOworICAgIHJldHVybiAiTGlzdDwiICsgdHlwZV9uYW1lKHRsaXN0LT5nZXRfZWxlbV90eXBlKCkpICsgIj4iOworICB9CisKKyAgcmV0dXJuIGdldF90dHlwZV9jbGFzc19uYW1lKHR0eXBlKTsKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBEYXJ0IHR5cGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgdGhyaWZ0IHR5cGUuCisgKgorICogQHBhcmFtIHRiYXNlIFRoZSBiYXNlIHR5cGUKKyAqLworc3RyaW5nIHRfZGFydF9nZW5lcmF0b3I6OmJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0eXBlKSB7CisgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSB0eXBlLT5nZXRfYmFzZSgpOworCisgIHN3aXRjaCAodGJhc2UpIHsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgIHJldHVybiAidm9pZCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgcmV0dXJuICJVaW50OExpc3QiOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gIlN0cmluZyI7CisgICAgfQorICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgcmV0dXJuICJib29sIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICByZXR1cm4gImludCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgIHJldHVybiAiZG91YmxlIjsKKyAgZGVmYXVsdDoKKyAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIERhcnQgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICB9Cit9CisKKy8qKgorICogRGVjbGFyZXMgYSBmaWVsZCwgd2hpY2ggbWF5IGluY2x1ZGUgaW5pdGlhbGl6YXRpb24gYXMgbmVjZXNzYXJ5LgorICoKKyAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQorICovCitzdHJpbmcgdF9kYXJ0X2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCkgeworICBzdHJpbmcgZmllbGRfbmFtZSA9IGdldF9tZW1iZXJfbmFtZSh0ZmllbGQtPmdldF9uYW1lKCkpOworICBzdHJpbmcgcmVzdWx0ID0gdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSkgKyAiICIgKyBmaWVsZF9uYW1lOworICBpZiAoaW5pdCkgeworICAgIHRfdHlwZSogdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiB0ZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKKyAgICAgIHN0ZDo6IG9mc3RyZWFtIGR1bW15OworICAgICAgcmVzdWx0ICs9ICIgPSAiICsgcmVuZGVyX2NvbnN0X3ZhbHVlKGR1bW15LCBmaWVsZF9uYW1lLCB0dHlwZSwgdGZpZWxkLT5nZXRfdmFsdWUoKSk7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICByZXN1bHQgKz0gIiA9IG51bGwiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSBmYWxzZSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgcmVzdWx0ICs9ICIgPSAwLjAiOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHR5cGVfbmFtZSh0dHlwZSkgKyAiKCkiOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgdHlwZV9uYW1lKHR0eXBlKSArICIoKSI7CisgICAgICA7CisgICAgfQorICB9CisgIHJldHVybiByZXN1bHQgKyAiOyI7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJworICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCitzdHJpbmcgdF9kYXJ0X2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBzdGQ6OnN0cmluZyBhcmd1bWVudHMgPSBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSk7CisKKyAgc3RkOjpzdHJpbmcgcmV0dXJudHlwZTsKKyAgaWYgKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgcmV0dXJudHlwZSA9ICJGdXR1cmUiOworICB9IGVsc2UgeworICAgIHJldHVybnR5cGUgPSAiRnV0dXJlPCIgKyB0eXBlX25hbWUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSArICI+IjsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIHJlc3VsdCA9IHJldHVybnR5cGUgKyAiICIgKyBnZXRfbWVtYmVyX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArCisgICAgICAgICAgICAgICAgICAgICAgICIoIiArIGFyZ3VtZW50cyArICIpIjsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgY29tbWEgc2VwYXJhdGVkIGZpZWxkIGxpc3QsIHdpdGggdHlwZSBuYW1lcworICovCitzdHJpbmcgdF9kYXJ0X2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSAiLCAiOworICAgIH0KKyAgICBzdHJpbmcgZmllbGRfbmFtZSA9IGdldF9tZW1iZXJfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpOworICAgIHJlc3VsdCArPSB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSArICIgIiArIGZpZWxkX25hbWU7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIEMrKyBlbnVtIHN0cmluZyBmb3IgdGhlIGdpdmVuIHR5cGUuCisgKi8KK3N0cmluZyB0X2RhcnRfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJUVHlwZS5TVFJJTkciOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiVFR5cGUuQk9PTCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiVFR5cGUuQllURSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIlRUeXBlLkkxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlRUeXBlLkk2NCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIlRUeXBlLkRPVUJMRSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiVFR5cGUuSTMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJUVHlwZS5TVFJVQ1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5NQVAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5TRVQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiVFR5cGUuTElTVCI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK3N0ZDo6c3RyaW5nIHRfZGFydF9nZW5lcmF0b3I6OmluaXRfdmFsdWUodF9maWVsZCogZmllbGQpIHsKKyAgLy8gRG8gbm90IGluaXRpYWxpemUgb3B0aW9uYWwgZmllbGRzCisgIGlmIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKKyAgICByZXR1cm4gIiI7CisgIH0KKworICB0X3R5cGUqIHR0eXBlID0gZmllbGQtPmdldF90eXBlKCk7CisKKyAgLy8gR2V0IHRoZSBhY3R1YWwgdHlwZSBmb3IgYSB0eXBlZGVmCisgIGlmICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgdHR5cGUgPSAoKHRfdHlwZWRlZiopdHR5cGUpLT5nZXRfdHlwZSgpOworICB9CisKKyAgLy8gT25seSBjb25zaWRlciBiYXNlIHR5cGVzIGZvciBkZWZhdWx0IGluaXRpYWxpemF0aW9uCisgIGlmICghdHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgcmV0dXJuICIiOworICB9CisgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7CisKKyAgLy8gSW5pdGlhbGl6ZSBib29scywgaW50cywgYW5kIGRvdWJsZXMgd2l0aCBzYW5lIGRlZmF1bHRzCisgIHN0cmluZyByZXN1bHQ7CisgIHN3aXRjaCAodGJhc2UpIHsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgIHJlc3VsdCA9ICIgPSBmYWxzZSI7CisgICAgYnJlYWs7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgcmVzdWx0ID0gIiA9IDAiOworICAgIGJyZWFrOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICByZXN1bHQgPSAiID0gMC4wIjsKKyAgICBicmVhazsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICByZXN1bHQgPSAiIjsKKyAgICBicmVhazsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0ZDo6c3RyaW5nIHRfZGFydF9nZW5lcmF0b3I6OmdldF9jYXBfbmFtZShzdGQ6OnN0cmluZyBuYW1lKSB7CisgIG5hbWVbMF0gPSB0b3VwcGVyKG5hbWVbMF0pOworICByZXR1cm4gbmFtZTsKK30KKworc3RkOjpzdHJpbmcgdF9kYXJ0X2dlbmVyYXRvcjo6Z2V0X21lbWJlcl9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpIHsKKyAgbmFtZVswXSA9IHRvbG93ZXIobmFtZVswXSk7CisgIHJldHVybiBuYW1lOworfQorCitzdGQ6OnN0cmluZyB0X2RhcnRfZ2VuZXJhdG9yOjpnZXRfYXJnc19jbGFzc19uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpIHsKKyAgcmV0dXJuIG5hbWUgKyAiX2FyZ3MiOworfQorCitzdGQ6OnN0cmluZyB0X2RhcnRfZ2VuZXJhdG9yOjpnZXRfcmVzdWx0X2NsYXNzX25hbWUoc3RkOjpzdHJpbmcgbmFtZSkgeworICByZXR1cm4gbmFtZSArICJfcmVzdWx0IjsKK30KKworc3RkOjpzdHJpbmcgdF9kYXJ0X2dlbmVyYXRvcjo6Z2V0X2ZpbGVfbmFtZShzdGQ6OnN0cmluZyBuYW1lKSB7CisgIC8vIGUuZy4gY2hhbmdlIEFQSUZvckZpbGVJTyB0byBhcGlfZm9yX2ZpbGVfaW8KKworICBzdHJpbmcgcmV0OworICBjb25zdCBjaGFyKiB0bXAgPSBuYW1lLmNfc3RyKCk7CisgIGJvb2wgaXNfcHJldl9sYyA9IHRydWU7CisgIGJvb2wgaXNfY3VycmVudF9sYyA9IHRtcFswXSA9PSB0b2xvd2VyKHRtcFswXSk7CisgIGJvb2wgaXNfbmV4dF9sYyA9IGZhbHNlOworCisgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgbmFtZS5sZW5ndGgoKTsgaSsrKSB7CisgICAgY2hhciBsYyA9IHRvbG93ZXIodG1wW2ldKTsKKworICAgIGlmIChpID09IG5hbWUubGVuZ3RoKCkgLSAxKSB7CisgICAgICBpc19uZXh0X2xjID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIGlzX25leHRfbGMgPSAodG1wW2krMV0gPT0gdG9sb3dlcih0bXBbaSsxXSkpOworICAgIH0KKworICAgIGlmIChpICE9IDAgJiYgIWlzX2N1cnJlbnRfbGMgJiYgKGlzX3ByZXZfbGMgfHwgaXNfbmV4dF9sYykpIHsKKyAgICAgIHJldCArPSAiXyI7CisgICAgfQorICAgIHJldCArPSBsYzsKKworICAgIGlzX3ByZXZfbGMgPSBpc19jdXJyZW50X2xjOworICAgIGlzX2N1cnJlbnRfbGMgPSBpc19uZXh0X2xjOworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworc3RkOjpzdHJpbmcgdF9kYXJ0X2dlbmVyYXRvcjo6Z2V0X2NvbnN0YW50c19jbGFzc19uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpIHsKKyAgLy8gZS5nLiBjaGFuZ2UgbXlfZ3JlYXRfbW9kZWwgdG8gTXlHcmVhdE1vZGVsQ29uc3RhbnRzCisgIHN0cmluZyByZXQ7CisgIGNvbnN0IGNoYXIqIHRtcCA9IG5hbWUuY19zdHIoKTsKKyAgYm9vbCBpc19wcmV2X3VuZGVyc2NvcmUgPSB0cnVlOworCisgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgbmFtZS5sZW5ndGgoKTsgaSsrKSB7CisgICAgaWYgKHRtcFtpXSA9PSAnXycpIHsKKyAgICAgIGlzX3ByZXZfdW5kZXJzY29yZSA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChpc19wcmV2X3VuZGVyc2NvcmUpIHsKKyAgICAgICAgcmV0ICs9IHRvdXBwZXIodG1wW2ldKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldCArPSB0bXBbaV07CisgICAgICB9CisKKyAgICAgIGlzX3ByZXZfdW5kZXJzY29yZSA9IGZhbHNlOworICAgIH0KKyAgfQorCisgIHJldHVybiByZXQgKyAiQ29uc3RhbnRzIjsKK30KKworc3RyaW5nIHRfZGFydF9nZW5lcmF0b3I6OmNvbnN0YW50X25hbWUoc3RyaW5nIG5hbWUpIHsKKyAgc3RyaW5nIGNvbnN0YW50X25hbWU7CisKKyAgYm9vbCBpc19maXJzdCA9IHRydWU7CisgIGJvb2wgd2FzX3ByZXZpb3VzX2NoYXJfdXBwZXIgPSBmYWxzZTsKKyAgZm9yIChzdHJpbmc6Oml0ZXJhdG9yIGl0ZXIgPSBuYW1lLmJlZ2luKCk7IGl0ZXIgIT0gbmFtZS5lbmQoKTsgKytpdGVyKSB7CisgICAgc3RyaW5nOjp2YWx1ZV90eXBlIGNoYXJhY3RlciA9ICgqaXRlcik7CisKKyAgICBib29sIGlzX3VwcGVyID0gaXN1cHBlcihjaGFyYWN0ZXIpOworCisgICAgaWYgKGlzX3VwcGVyICYmICFpc19maXJzdCAmJiAhd2FzX3ByZXZpb3VzX2NoYXJfdXBwZXIpIHsKKyAgICAgIGNvbnN0YW50X25hbWUgKz0gJ18nOworICAgIH0KKyAgICBjb25zdGFudF9uYW1lICs9IHRvdXBwZXIoY2hhcmFjdGVyKTsKKworICAgIGlzX2ZpcnN0ID0gZmFsc2U7CisgICAgd2FzX3ByZXZpb3VzX2NoYXJfdXBwZXIgPSBpc191cHBlcjsKKyAgfQorCisgIHJldHVybiBjb25zdGFudF9uYW1lOworfQorCisvKioKKyAqIEVtaXRzIGEgZG9jIGNvbW1lbnQgaWYgdGhlIHByb3ZpZGVkIG9iamVjdCBoYXMgYSBkb2MgaW4gVGhyaWZ0CisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGFydF9kb2Mob3N0cmVhbSYgb3V0LCB0X2RvYyogdGRvYykgeworICBpZiAodGRvYy0+aGFzX2RvYygpKSB7CisgICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiIiwgIi8vLyAiLCB0ZG9jLT5nZXRfZG9jKCksICIiKTsKKyAgfQorfQorCisvKioKKyAqIEVtaXRzIGEgZG9jIGNvbW1lbnQgaWYgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIG9iamVjdCBoYXMgYSBkb2MgaW4gVGhyaWZ0CisgKi8KK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGFydF9kb2Mob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgaWYgKHRmdW5jdGlvbi0+aGFzX2RvYygpKSB7CisgICAgc3RyaW5nc3RyZWFtIHNzOworICAgIHNzIDw8IHRmdW5jdGlvbi0+Z2V0X2RvYygpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBwX2l0ZXI7CisgICAgZm9yIChwX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgcF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytwX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIHAgPSAqcF9pdGVyOworICAgICAgc3RyaW5nIGZpZWxkX25hbWUgPSBnZXRfbWVtYmVyX25hbWUocC0+Z2V0X25hbWUoKSk7CisgICAgICBzcyA8PCAiXG5AcGFyYW0gIiA8PCBmaWVsZF9uYW1lOworICAgICAgaWYgKHAtPmhhc19kb2MoKSkgeworICAgICAgICBzcyA8PCAiICIgPDwgcC0+Z2V0X2RvYygpOworICAgICAgfQorICAgIH0KKyAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsICIiLCAiLy8vICIsIHNzLnN0cigpLCAiIik7CisgIH0KK30KKworc3RkOjpzdHJpbmcgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfY2hlY2sodF9maWVsZCogZmllbGQpIHsKKyAgc3RyaW5nIGZpZWxkX25hbWUgPSBnZXRfbWVtYmVyX25hbWUoZmllbGQtPmdldF9uYW1lKCkpOworICByZXR1cm4gZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGRfbmFtZSk7Cit9CisKK3N0ZDo6c3RyaW5nIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2lzc2V0X2NoZWNrKHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUpIHsKKyAgcmV0dXJuICJpcyIgKyBnZXRfY2FwX25hbWUoInNldCIpICsgZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpICsgIigpIjsKK30KKwordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9zZXQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCkgeworICBpZiAoIXR5cGVfY2FuX2JlX251bGwoZmllbGQtPmdldF90eXBlKCkpKSB7CisgICAgc3RyaW5nIGZpZWxkX25hbWUgPSBnZXRfbWVtYmVyX25hbWUoZmllbGQtPmdldF9uYW1lKCkpOworICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLl9faXNzZXRfIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSB0cnVlOyIgPDwgZW5kbDsKKyAgfQorfQorCitzdGQ6OnN0cmluZyB0X2RhcnRfZ2VuZXJhdG9yOjpnZXRfdHR5cGVfY2xhc3NfbmFtZSh0X3R5cGUqIHR0eXBlKSB7CisgIGlmIChwcm9ncmFtXyA9PSB0dHlwZS0+Z2V0X3Byb2dyYW0oKSkgeworICAgIHJldHVybiB0dHlwZS0+Z2V0X25hbWUoKTsKKyAgfSBlbHNlIHsKKyAgICBzdHJpbmcgbmFtZWRfaW1wb3J0ID0gInRfIiArIGZpbmRfbGlicmFyeV9uYW1lKHR0eXBlLT5nZXRfcHJvZ3JhbSgpKTsKKyAgICByZXR1cm4gbmFtZWRfaW1wb3J0ICsgIi4iICsgdHR5cGUtPmdldF9uYW1lKCk7CisgIH0KK30KKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUigKKyAgICBkYXJ0LAorICAgICJEYXJ0IiwKKyAgICAiICAgIGxpYnJhcnlfbmFtZTogICAgT3B0aW9uYWwgb3ZlcnJpZGUgZm9yIGxpYnJhcnkgbmFtZS5cbiIKKyAgICAiICAgIGxpYnJhcnlfcHJlZml4OiAgR2VuZXJhdGUgY29kZSB0aGF0IGNhbiBiZSB1c2VkIHdpdGhpbiBhbiBleGlzdGluZyBsaWJyYXJ5LlxuIgorICAgICIgICAgICAgICAgICAgICAgICAgICBVc2UgYSBkb3Qtc2VwYXJhdGVkIHN0cmluZywgZS5nLiBcIm15X3BhcmVudF9saWIuc3JjLmdlblwiXG4iCisgICAgIiAgICBwdWJzcGVjX2xpYjogICAgIE9wdGlvbmFsIG92ZXJyaWRlIGZvciB0aHJpZnQgbGliIGRlcGVuZGVuY3kgaW4gcHVic3BlYy55YW1sLFxuIgorICAgICIgICAgICAgICAgICAgICAgICAgICBlLmcuIFwidGhyaWZ0OiAwLngueFwiLiAgVXNlIGEgcGlwZSBkZWxpbWl0ZXIgdG8gc2VwYXJhdGUgbGluZXMsXG4iCisgICAgIiAgICAgICAgICAgICAgICAgICAgIGUuZy4gXCJ0aHJpZnQ6fCAgZ2l0OnwgICAgdXJsOiBnaXRAZm9vLmNvbVwiXG4iCispCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2RlbHBoaV9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2RlbHBoaV9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJkNzdlOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZGVscGhpX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDQwMTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGxpc3Q+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8Y2N0eXBlPgorCisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b2ZzdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworY2xhc3MgdF9kZWxwaGlfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfZGVscGhpX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIGluZGVudF9pbXBsXyA9IDA7CisgICAgaGFzX2ZvcndhcmQgPSBmYWxzZTsKKyAgICBoYXNfZW51bSA9IGZhbHNlOworICAgIGhhc19jb25zdCA9IGZhbHNlOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICBhbnNpc3RyX2JpbmFyeV8gPSBmYWxzZTsKKyAgICByZWdpc3Rlcl90eXBlc18gPSBmYWxzZTsKKyAgICBjb25zdHByZWZpeF8gPSBmYWxzZTsKKyAgICBldmVudHNfID0gZmFsc2U7CisgICAgeG1sZG9jXyA9IGZhbHNlOworICAgIGFzeW5jXyA9IGZhbHNlOworICAgIGZvciggaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgeworICAgICAgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImFuc2lzdHJfYmluYXJ5IikgPT0gMCkgeworICAgICAgICBhbnNpc3RyX2JpbmFyeV8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJyZWdpc3Rlcl90eXBlcyIpID09IDApIHsKKyAgICAgICAgcmVnaXN0ZXJfdHlwZXNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiY29uc3RwcmVmaXgiKSA9PSAwKSB7CisgICAgICAgIGNvbnN0cHJlZml4XyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImV2ZW50cyIpID09IDApIHsKKyAgICAgICAgZXZlbnRzXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInhtbGRvYyIpID09IDApIHsKKyAgICAgICAgeG1sZG9jXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImFzeW5jIikgPT0gMCkgeworICAgICAgICBhc3luY18gPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIGRlbHBoaToiICsgaXRlci0+Zmlyc3Q7CisgICAgICB9CisgICAgfQorCisgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tZGVscGhpIjsKKyAgICBlc2NhcGVfLmNsZWFyKCk7CisgICAgZXNjYXBlX1snXCcnXSA9ICInJyI7CisgIH0KKworICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7CisgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7CisKKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfZm9yd2FyZF9kZWNsYXJhdGlvbih0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3Byb3BlcnR5KG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBib29sIGlzUHVibGljLCBib29sIGlzX3hjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9wZXJ0eV93cml0ZXJfKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBib29sIGlzUHVibGljKTsKKworICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9wcm9wZXJ0eShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RydWN0X2lzX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzUHVibGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWVsZFByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfaXNzZXRfcmVhZGVyX2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaXNfeGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9wcm9wZXJ0eV9yZWFkZXJfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbl9jbGFzcyk7CisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5X3dyaXRlcl9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uX2NsYXNzKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHlfcmVhZGVyX2ltcGwob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjbHNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRQcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb25fY2xhc3MpOworICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9wcm9wZXJ0eV93cml0ZXJfaW1wbChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWVsZFByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbl9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc191bmlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbl9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB4Y2VwdGlvbl9mYWN0b3J5X25hbWUpOworICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9jbGVhcl91bmlvbl92YWx1ZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWVsZFByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbl9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc191bmlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbl9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB4Y2VwdGlvbl9mYWN0b3J5X25hbWUpOworICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9pc3NldF9yZWFkZXJfaW1wbChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWVsZFByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF93cml0ZXJfaW1wbChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjbHNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9yZXN1bHRfd3JpdGVyX2ltcGwob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pOworCisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF90b3N0cmluZ19pbXBsKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hfZmFjdG9yeSk7CisKKyAgdm9pZCBhZGRfZGVscGhpX3VzZXNfbGlzdChzdHJpbmcgdW5pdG5hbWUpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9yZWFkZXJfaW1wbChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjbHNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX2NyZWF0ZV9leGNlcHRpb25faW1wbChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pOworCisgIGJvb2wgY29uc3RfbmVlZHNfdmFyKHRfdHlwZSogdHlwZSk7CisgIHZvaWQgcHJpbnRfY29uc3RfcHJvcChzdGQ6Om9zdHJlYW0mIG91dCwgc3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworICB2b2lkIHByaW50X3ByaXZhdGVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKyAgdm9pZCBwcmludF9jb25zdF92YWx1ZShzdGQ6Om9zdHJlYW0mIHZhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpOworICB2b2lkIGluaXRpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiB2YXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpOworICB2b2lkIGZpbmFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNsc19ubSA9ICIiKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgbG9jYWxfdmFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKyAgdm9pZCBwcmludF9jb25zdF9kZWZfdmFsdWUoc3RkOjpvc3RyZWFtJiB2YXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xzX25tID0gIiIpOworICBzdGQ6OnN0cmluZyBtYWtlX2NvbnN0YW50c19jbGFzc25hbWUoKTsKKworICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X2ltcGwob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjbHNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeF9mYWN0b3J5ID0gZmFsc2UpOworICB2b2lkIHByaW50X2RlbHBoaV9zdHJ1Y3RfdHlwZV9mYWN0b3J5X2Z1bmMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF90eXBlX2ZhY3Rvcnkob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hfZmFjdG9yeSA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3R5cGVfZmFjdG9yeV9yZWdpc3RyYXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjbHNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeF9mYWN0b3J5ID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jbGFzcyA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hfZmFjdG9yeSA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3JlYWRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF90b3N0cmluZyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UsIGJvb2wgZm9yX2FzeW5jKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiBmdW5jdGlvbik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBsb2NhbF92YXJzKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXgpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIGxvY2FsX3ZhcnMpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBsb2NhbF92YXJzKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIGxvY2FsX3ZhcnMpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiBsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgbG9jYWxfdmFycyk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIGxvY2FsX3ZhcnMpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgbG9jYWxfdmFycyk7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBsb2NhbF92YXJzKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgbG9jYWxfdmFycyk7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBsb2NhbF92YXJzKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBsb2NhbF92YXJzKTsKKworICB2b2lkIGRlbHBoaV90eXBlX3VzaW5ncyhzdGQ6Om9zdHJlYW0mIG91dCk7CisgIHN0ZDo6c3RyaW5nIGRlbHBoaV90aHJpZnRfdXNpbmdzKCk7CisKKyAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJfY2xzID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJfbm9fcG9zdGZpeCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiX2V4Y2VwdGlvbl9mYWN0b3J5ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJfZnVsbF9leGNlcHRpb25fZmFjdG9yeSA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgbm9ybWFsaXplX2Nsc25tKHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJfbm9fY2hlY2tfa2V5d29yZCA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgbWFrZV92YWxpZF9kZWxwaGlfaWRlbnRpZmllcihzdGQ6OnN0cmluZyBjb25zdCYgZnJvbU5hbWUpOworICBzdGQ6OnN0cmluZyBpbnB1dF9hcmdfcHJlZml4KHRfdHlwZSogdHR5cGUpOworCisgIHN0ZDo6c3RyaW5nIGJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0YmFzZSk7CisgIHN0ZDo6c3RyaW5nIGRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5pdCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb25fY2xhc3MgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcl9hc3luYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZ1bGxfY2xzID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgc3RkOjpzdHJpbmcgY29uc3RydWN0b3JfYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgY3VycmVudF9pbmRlbnQpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIHByb3BfbmFtZSh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIHByb3BfbmFtZShzdGQ6OnN0cmluZyBuYW1lLCBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBjb25zdHJ1Y3Rvcl9wYXJhbV9uYW1lKHN0cmluZyBuYW1lKTsKKworICB2b2lkIHdyaXRlX2VudW0oc3RkOjpzdHJpbmcgbGluZSk7CisgIHZvaWQgd3JpdGVfZm9yd2FyZF9kZWNyKHN0ZDo6c3RyaW5nIGxpbmUpOworICB2b2lkIHdyaXRlX2NvbnN0KHN0ZDo6c3RyaW5nIGxpbmUpOworICB2b2lkIHdyaXRlX3N0cnVjdChzdGQ6OnN0cmluZyBsaW5lKTsKKyAgdm9pZCB3cml0ZV9zZXJ2aWNlKHN0ZDo6c3RyaW5nIGxpbmUpOworCisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgYXV0b2dlbl9jb21tZW50KCkgeworICAgIHJldHVybiBzdGQ6OnN0cmluZygiKCoqXG4iKSArICIgKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoIiArIFRIUklGVF9WRVJTSU9OICsgIilcbiIKKyAgICAgICAgICAgKyAiICpcbiIgKyAiICogRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lOR1xuIgorICAgICAgICAgICArICIgKilcbiI7CisgIH0KKworICBzdHJpbmcgcmVwbGFjZV9hbGwoc3RyaW5nIGNvbnRlbnRzLCBzdHJpbmcgc2VhcmNoLCBzdHJpbmcgcmVwbGFjZSk7CisgIHN0cmluZyB4bWxfZW5jb2RlKHN0cmluZyBjb250ZW50cyk7CisgIHN0cmluZyB4bWxkb2NfZW5jb2RlKHN0cmluZyBjb250ZW50cyk7CisgIHN0cmluZyB4bWxhdHRyaWJfZW5jb2RlKHN0cmluZyBjb250ZW50cyk7CisgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpOworICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9kb2Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfZG9jKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZG9jKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfZG9jc3RyaW5nX2NvbW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHN0cmluZyBjb250ZW50cyk7CisKKyAgYm9vbCB0eXBlX2Nhbl9iZV9udWxsKHRfdHlwZSogdHR5cGUpIHsKKyAgICB3aGlsZSAodHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgICAgdHR5cGUgPSAoKHRfdHlwZWRlZiopdHR5cGUpLT5nZXRfdHlwZSgpOworICAgIH0KKworICAgIHJldHVybiB0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpOworICB9CisKK3ByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIG5hbWVzcGFjZV9uYW1lXzsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHNfZm9yd2FyZF9kZWNyOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc19lbnVtOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc19jb25zdDsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHNfc3RydWN0OworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc19zZXJ2aWNlOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc19jb25zdF9pbXBsOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc19zdHJ1Y3RfaW1wbDsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHNfc2VydmljZV9pbXBsOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc190eXBlX2ZhY3RvcnlfcmVnaXN0cmF0aW9uOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc190eXBlX2ZhY3RvcnlfZnVuY3M7CisgIGJvb2wgaGFzX2ZvcndhcmQ7CisgIGJvb2wgaGFzX2VudW07CisgIGJvb2wgaGFzX2NvbnN0OworICBzdGQ6OnN0cmluZyBuYW1lc3BhY2VfZGlyXzsKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gZGVscGhpX2tleXdvcmRzOworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kOworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvbjsKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gdHlwZXNfa25vd247CisgIHN0ZDo6bGlzdDx0X3R5cGVkZWYqPiB0eXBlZGVmc19wZW5kaW5nOworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdXNlc19saXN0OworICB2b2lkIGNyZWF0ZV9rZXl3b3JkcygpOworICBib29sIGZpbmRfa2V5d29yZChzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiYga2V5d29yZF9tYXAsIHN0ZDo6c3RyaW5nIG5hbWUpOworICBzdGQ6OnN0cmluZyBub3JtYWxpemVfbmFtZShzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJfbWV0aG9kID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9leGNlcHRpb25fbWV0aG9kID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBlbXB0eV92YWx1ZSh0X3R5cGUqIHR5cGUpOworICBib29sIGlzX2Z1bGx5X2RlZmluZWRfdHlwZSh0X3R5cGUqIHR0eXBlKTsKKyAgdm9pZCBhZGRfZGVmaW5lZF90eXBlKHRfdHlwZSogdHR5cGUpOworICB2b2lkIGluaXRfa25vd25fdHlwZXNfbGlzdCgpOworICBib29sIGlzX3ZvaWQodF90eXBlKiB0eXBlKTsKKyAgaW50IGluZGVudF9pbXBsXzsKKyAgYm9vbCBhbnNpc3RyX2JpbmFyeV87CisgIGJvb2wgcmVnaXN0ZXJfdHlwZXNfOworICBib29sIGNvbnN0cHJlZml4XzsKKyAgYm9vbCBldmVudHNfOworICBib29sIHhtbGRvY187CisgIGJvb2wgYXN5bmNfOworICB2b2lkIGluZGVudF91cF9pbXBsKCkgeyArK2luZGVudF9pbXBsXzsgfTsKKyAgdm9pZCBpbmRlbnRfZG93bl9pbXBsKCkgeyAtLWluZGVudF9pbXBsXzsgfTsKKyAgc3RkOjpzdHJpbmcgaW5kZW50X2ltcGwoKSB7CisgICAgc3RkOjpzdHJpbmcgaW5kID0gIiI7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IGluZGVudF9pbXBsXzsgKytpKSB7CisgICAgICBpbmQgKz0gIiAgIjsKKyAgICB9CisgICAgcmV0dXJuIGluZDsKKyAgfTsKKyAgc3RkOjpvc3RyZWFtJiBpbmRlbnRfaW1wbChzdGQ6Om9zdHJlYW0mIG9zKSB7IHJldHVybiBvcyA8PCBpbmRlbnRfaW1wbCgpOyB9OworfTsKKworc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6cmVwbGFjZV9hbGwoc3RyaW5nIGNvbnRlbnRzLCBzdHJpbmcgc2VhcmNoLCBzdHJpbmcgcmVwbCkgeworICBzdHJpbmcgc3RyKGNvbnRlbnRzKTsKKworICBzaXplX3Qgc2xlbiA9IHNlYXJjaC5sZW5ndGgoKTsKKyAgc2l6ZV90IHJsZW4gPSByZXBsLmxlbmd0aCgpOworICBzaXplX3QgaW5jciA9IChybGVuID4gMCkgPyBybGVuIDogMTsKKworICBpZiAoc2xlbiA+IDApIHsKKyAgICBzaXplX3QgZm91bmQgPSBzdHIuZmluZChzZWFyY2gpOworICAgIHdoaWxlICgoZm91bmQgIT0gc3RyaW5nOjpucG9zKSAmJiAoZm91bmQgPCBzdHIubGVuZ3RoKCkpKSB7CisgICAgICBzdHIucmVwbGFjZShmb3VuZCwgc2xlbiwgcmVwbCk7CisgICAgICBmb3VuZCA9IHN0ci5maW5kKHNlYXJjaCwgZm91bmQgKyBpbmNyKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gc3RyOworfQorCisvLyBYTUwgZW5jb2RpbmcKK3N0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6OnhtbF9lbmNvZGUoc3RyaW5nIGNvbnRlbnRzKSB7CisgIHN0cmluZyBzdHIoY29udGVudHMpOworCisgIC8vIGVzY2FwZSB0aGUgZXNjYXBlCisgIHN0ciA9IHJlcGxhY2VfYWxsKHN0ciwgIiYiLCAiJmFtcDsiKTsKKworICAvLyBvdGhlciBzdGFuZGFyZCBYTUwgZW50aXRpZXMKKyAgc3RyID0gcmVwbGFjZV9hbGwoc3RyLCAiPCIsICImbHQ7Iik7CisgIHN0ciA9IHJlcGxhY2VfYWxsKHN0ciwgIj4iLCAiJmd0OyIpOworCisgIHJldHVybiBzdHI7Cit9CisKKy8vIFhNTCBhdHRyaWJ1dGUgZW5jb2RpbmcKK3N0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6OnhtbGF0dHJpYl9lbmNvZGUoc3RyaW5nIGNvbnRlbnRzKSB7CisgIHN0cmluZyBzdHIoeG1sX2VuY29kZShjb250ZW50cykpOworCisgIC8vIG91ciBhdHRyaWJzIGFyZSBlbmNsb3NlZCBpbiAiCisgIHN0ciA9IHJlcGxhY2VfYWxsKHN0ciwgIlwiIiwgIlxcXCIiKTsKKworICByZXR1cm4gc3RyOworfQorCisvLyBYTUwgZW5jb2RpbmcgZm9yIGRvYyBjb21tZW50cworc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6eG1sZG9jX2VuY29kZShzdHJpbmcgY29udGVudHMpIHsKKyAgc3RyaW5nIHN0cih4bWxfZW5jb2RlKGNvbnRlbnRzKSk7CisKKyAgLy8gWE1MRG9jIHNwZWNpZmljOiBjb252ZXJ0IGxpbmVicmVha3MgaW50byA8cGFyYT5ncmFwaHM8L3BhcmE+CisgIHN0ciA9IHJlcGxhY2VfYWxsKHN0ciwgIlxyXG4iLCAiXHIiKTsKKyAgc3RyID0gcmVwbGFjZV9hbGwoc3RyLCAiXG4iLCAiXHIiKTsKKyAgc3RyID0gcmVwbGFjZV9hbGwoc3RyLCAiXHIiLCAiPC9wYXJhPlxuPHBhcmE+Iik7CisKKyAgcmV0dXJuIHN0cjsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9kb2NzdHJpbmdfY29tbWVudChvc3RyZWFtJiBvdXQsIHN0cmluZyBjb250ZW50cykgeworICBpZiAoeG1sZG9jXykgeworICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieyRSRUdJT04gJ1hNTERvYyd9Ly8vIDxzdW1tYXJ5PlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLy8vICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxwYXJhPiIgKyBjb250ZW50cyArICI8L3BhcmE+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLy8vIDwvc3VtbWFyeT5cbnskRU5EUkVHSU9OfVxuIik7CisgIH0KK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9kb2Mob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCkgeworICBpZiAoeG1sZG9jXykgeworICAgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfZW51bSgpKSB7CisgICAgICBzdHJpbmcgY29tYmluZWRfbWVzc2FnZSA9IHhtbGRvY19lbmNvZGUoZmllbGQtPmdldF9kb2MoKSkgKyAiXG48c2VlYWxzbyBjcmVmPVwiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHhtbGRvY19lbmNvZGUodHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpKSkgKyAiXCIvPiI7CisgICAgICBnZW5lcmF0ZV9kZWxwaGlfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCBjb21iaW5lZF9tZXNzYWdlKTsKKyAgICB9IGVsc2UgeworICAgICAgZ2VuZXJhdGVfZGVscGhpX2RvYyhvdXQsICh0X2RvYyopZmllbGQpOworICAgIH0KKyAgfQorfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX2RvYyhvc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKSB7CisgIGlmICh0ZG9jLT5oYXNfZG9jKCkgJiYgeG1sZG9jXykgeworICAgIGdlbmVyYXRlX2RlbHBoaV9kb2NzdHJpbmdfY29tbWVudChvdXQsIHhtbGRvY19lbmNvZGUodGRvYy0+Z2V0X2RvYygpKSk7CisgIH0KK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9kb2Mob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgaWYgKHRmdW5jdGlvbi0+aGFzX2RvYygpICYmIHhtbGRvY18pIHsKKyAgICBzdHJpbmdzdHJlYW0gcHM7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHBfaXRlcjsKKyAgICBmb3IgKHBfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBwX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK3BfaXRlcikgeworICAgICAgdF9maWVsZCogcCA9ICpwX2l0ZXI7CisgICAgICBwcyA8PCAiXG48cGFyYW0gbmFtZT1cIiIgPDwgeG1sYXR0cmliX2VuY29kZShwLT5nZXRfbmFtZSgpKSA8PCAiXCI+IjsKKyAgICAgIGlmIChwLT5oYXNfZG9jKCkpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgc3RyID0gcC0+Z2V0X2RvYygpOworICAgICAgICBzdHIuZXJhc2Uoc3RkOjpyZW1vdmUoc3RyLmJlZ2luKCksIHN0ci5lbmQoKSwgJ1xuJyksCisgICAgICAgICAgICAgICAgICBzdHIuZW5kKCkpOyAvLyByZW1vdmUgdGhlIG5ld2xpbmVzIHRoYXQgYXBwZWFyIGZyb20gdGhlIHBhcnNlcgorICAgICAgICBwcyA8PCB4bWxkb2NfZW5jb2RlKHN0cik7CisgICAgICB9CisgICAgICBwcyA8PCAiPC9wYXJhbT4iOworICAgIH0KKyAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInskUkVHSU9OICdYTUxEb2MnfSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8vLyAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8c3VtbWFyeT48cGFyYT4iICsgeG1sZG9jX2VuY29kZSh0ZnVuY3Rpb24tPmdldF9kb2MoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI8L3BhcmE+PC9zdW1tYXJ5PiIgKyBwcy5zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieyRFTkRSRUdJT059XG4iKTsKKyAgfQorfQorCitib29sIHRfZGVscGhpX2dlbmVyYXRvcjo6ZmluZF9rZXl3b3JkKHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+JiBrZXl3b3JkX21hcCwgc3RkOjpzdHJpbmcgbmFtZSkgeworICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGxlbiA9IG5hbWUubGVuZ3RoKCk7CisKKyAgaWYgKGxlbiA8PSAwKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBubGFzdCA9IG5hbWUuZmluZF9sYXN0X29mKCdfJyk7CisKKyAgaWYgKG5sYXN0ID49IDEpIHsKKyAgICBpZiAobmxhc3QgPT0gKGxlbiAtIDEpKSB7CisgICAgICBzdHJpbmcgbmV3X25hbWUobmFtZSwgMCwgbmxhc3QpOworICAgICAgcmV0dXJuIGZpbmRfa2V5d29yZChrZXl3b3JkX21hcCwgbmV3X25hbWUpOworICAgIH0KKyAgfQorICByZXR1cm4gKGtleXdvcmRfbWFwW25hbWVdID09IDEpOworfQorCitzdGQ6OnN0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6Om5vcm1hbGl6ZV9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9tZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9leGNlcHRpb25fbWV0aG9kKSB7CisgIHN0cmluZyB0bXAobmFtZSk7CisgIHN0ZDo6dHJhbnNmb3JtKHRtcC5iZWdpbigpLCB0bXAuZW5kKCksIHRtcC5iZWdpbigpLCBzdGF0aWNfY2FzdDxpbnQgKCopKGludCk+KHN0ZDo6dG9sb3dlcikpOworCisgIGJvb2wgYl9mb3VuZCA9IGZhbHNlOworCisgIGlmIChmaW5kX2tleXdvcmQoZGVscGhpX2tleXdvcmRzLCB0bXApKSB7CisgICAgYl9mb3VuZCA9IHRydWU7CisgIH0gZWxzZSBpZiAoYl9tZXRob2QgJiYgZmluZF9rZXl3b3JkKGRlbHBoaV9yZXNlcnZlZF9tZXRob2QsIHRtcCkpIHsKKyAgICBiX2ZvdW5kID0gdHJ1ZTsKKyAgfSBlbHNlIGlmIChiX2V4Y2VwdGlvbl9tZXRob2QgJiYgZmluZF9rZXl3b3JkKGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uLCB0bXApKSB7CisgICAgYl9mb3VuZCA9IHRydWU7CisgIH0KKworICBpZiAoYl9mb3VuZCkgeworICAgIHJldHVybiBuYW1lICsgIl8iOworICB9IGVsc2UgeworICAgIHJldHVybiBuYW1lOworICB9Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpjcmVhdGVfa2V5d29yZHMoKSB7CisgIGRlbHBoaV9rZXl3b3Jkc1siYW5kIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImVuZCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJpbnRlcmZhY2UiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sicmFpc2UiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sidXNlcyJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJhcnJheSJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJleGNlcHQiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siaXMiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sicmVjb3JkIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInZhciJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJhcyJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJleHBvcnRzIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImxhYmVsIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInJlcGVhdCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJ3aGlsZSJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJhc20iXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siZmlsZSJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJsaWJyYXJ5Il0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInJlc291cmNlc3RyaW5nIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbIndpdGgiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siYmVnaW4iXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siZmluYWxpemF0aW9uIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbIm1vZCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJzZXQiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sieG9yIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImNhc2UiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siZmluYWxseSJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJuaWwiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sic2hsIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImNsYXNzIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImZvciJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJub3QiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sic2hyIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImNvbnN0Il0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImZ1bmN0aW9uIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbIm9iamVjdCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJzdHJpbmciXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siY29uc3RydWN0b3IiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siZ290byJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJvZiJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJ0aGVuIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImRlc3RydWN0b3IiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siaWYiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sib3IiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sidGhyZWFkdmFyIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImRpc3BpbnRlcmZhY2UiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siaW1wbGVtZW50YXRpb24iXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sib3V0Il0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInRvIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImRpdiJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJpbiJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJwYWNrZWQiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sidHJ5Il0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImRvIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImluaGVyaXRlZCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJwcm9jZWR1cmUiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sidHlwZSJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJkb3dudG8iXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siaW5pdGlhbGl6YXRpb24iXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sicHJvZ3JhbSJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJ1bml0Il0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImVsc2UiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siaW5saW5lIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInByb3BlcnR5Il0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInVudGlsIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInByaXZhdGUiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sicHJvdGVjdGVkIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInB1YmxpYyJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJwdWJsaXNoZWQiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siYXV0b21hdGVkIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImF0Il0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbIm9uIl0gPSAxOworCisgIC8vIHJlc2VydmVkL3ByZWRlZmluZWQgdmFyaWFibGVzIGFuZCB0eXBlcyAobG93ZXJjYXNlISkKKyAgZGVscGhpX2tleXdvcmRzWyJyZXN1bHQiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sic3lzdGVtIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInN5c3V0aWxzIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInRocmlmdCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJ0Ynl0ZXMiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sidG9iamVjdCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJ0Y2xhc3MiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sidGludGVyZmFjZWRvYmplY3QiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siYW5zaXN0cmluZyJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJzdHJpbmciXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siYm9vbGVhbiJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJzaG9ydGludCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJzbWFsbGludCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJpbnRlZ2VyIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImludDY0Il0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImRvdWJsZSJdID0gMTsKKworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJjcmVhdGUiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImZyZWUiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImluaXRpbnN0YW5jZSJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiY2xlYW51cGluc3RhbmNlIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJjbGFzc3R5cGUiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImNsYXNzbmFtZSJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiY2xhc3NuYW1laXMiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImNsYXNzcGFyZW50Il0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJjbGFzc2luZm8iXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImluc3RhbmNlc2l6ZSJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiaW5oZXJpdHNmcm9tIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJtZXRob2RhZGRyZXNzIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJtZXRob2RhZGRyZXNzIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJtZXRob2RuYW1lIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJmaWVsZGFkZHJlc3MiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImZpZWxkYWRkcmVzcyJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiZ2V0aW50ZXJmYWNlIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJnZXRpbnRlcmZhY2VlbnRyeSJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiZ2V0aW50ZXJmYWNldGFibGUiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbInVuaXRuYW1lIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJlcXVhbHMiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImdldGhhc2hjb2RlIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJ0b3N0cmluZyJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsic2FmZWNhbGxleGNlcHRpb24iXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImFmdGVyY29uc3RydWN0aW9uIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJiZWZvcmVkZXN0cnVjdGlvbiJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiZGlzcGF0Y2giXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImRlZmF1bHRoYW5kbGVyIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJuZXdpbnN0YW5jZSJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiZnJlZWluc3RhbmNlIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJkZXN0cm95Il0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJyZWFkIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJ3cml0ZSJdID0gMTsKKworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsic2V0aW5uZXJleGNlcHRpb24iXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJzZXRzdGFja2luZm8iXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJnZXRzdGFja3RyYWNlIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsicmFpc2luZ2V4Y2VwdGlvbiJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bImNyZWF0ZWZtdCJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bImNyZWF0ZXJlcyJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bImNyZWF0ZXJlc2ZtdCJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bImNyZWF0ZWhlbHAiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJjcmVhdGVmbXRoZWxwIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsiY3JlYXRlcmVzaGVscCJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bImNyZWF0ZXJlc2ZtdGhlbHAiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJnZXRiYXNlZXhjZXB0aW9uIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsiYmFzZWV4Y2VwdGlvbiJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bImhlbHBjb250ZXh0Il0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsiaW5uZXJleGNlcHRpb24iXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJtZXNzYWdlIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsic3RhY2t0cmFjZSJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bInN0YWNraW5mbyJdID0gMTsKKyAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bImdldGV4Y2VwdGlvbnN0YWNraW5mb3Byb2MiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJnZXRzdGFja2luZm9zdHJpbmdwcm9jIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsiY2xlYW51cHN0YWNraW5mb3Byb2MiXSA9IDE7CisgIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJyYWlzZW91dGVyZXhjZXB0aW9uIl0gPSAxOworICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsidGhyb3dvdXRlcmV4Y2VwdGlvbiJdID0gMTsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmFkZF9kZWxwaGlfdXNlc19saXN0KHN0cmluZyB1bml0bmFtZSkgeworICB2ZWN0b3I8c3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBzX2l0ZXI7CisgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgZm9yIChzX2l0ZXIgPSB1c2VzX2xpc3QuYmVnaW4oKTsgc19pdGVyICE9IHVzZXNfbGlzdC5lbmQoKTsgKytzX2l0ZXIpIHsKKyAgICBpZiAoKCpzX2l0ZXIpID09IHVuaXRuYW1lKSB7CisgICAgICBmb3VuZCA9IHRydWU7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgaWYgKCFmb3VuZCkgeworICAgIHVzZXNfbGlzdC5wdXNoX2JhY2sodW5pdG5hbWUpOworICB9Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgaW5kZW50X2ltcGxfID0gMDsKKyAgbmFtZXNwYWNlX25hbWVfID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoImRlbHBoaSIpOworICBoYXNfZm9yd2FyZCA9IGZhbHNlOworICBoYXNfZW51bSA9IGZhbHNlOworICBoYXNfY29uc3QgPSBmYWxzZTsKKyAgY3JlYXRlX2tleXdvcmRzKCk7CisKKyAgYWRkX2RlbHBoaV91c2VzX2xpc3QoIkNsYXNzZXMiKTsKKyAgYWRkX2RlbHBoaV91c2VzX2xpc3QoIlN5c1V0aWxzIik7CisgIGFkZF9kZWxwaGlfdXNlc19saXN0KCJHZW5lcmljcy5Db2xsZWN0aW9ucyIpOworICBpZihhc3luY18pIHsKKyAgICBhZGRfZGVscGhpX3VzZXNfbGlzdCgiU3lzdGVtLlRocmVhZGluZyIpOworICB9CisKKyAgYWRkX2RlbHBoaV91c2VzX2xpc3QoIlRocmlmdCIpOworICBhZGRfZGVscGhpX3VzZXNfbGlzdCgiVGhyaWZ0LlV0aWxzIik7CisgIGFkZF9kZWxwaGlfdXNlc19saXN0KCJUaHJpZnQuQ29sbGVjdGlvbnMiKTsKKyAgYWRkX2RlbHBoaV91c2VzX2xpc3QoIlRocmlmdC5Qcm90b2NvbCIpOworICBhZGRfZGVscGhpX3VzZXNfbGlzdCgiVGhyaWZ0LlRyYW5zcG9ydCIpOworICBpZiAocmVnaXN0ZXJfdHlwZXNfKSB7CisgICAgYWRkX2RlbHBoaV91c2VzX2xpc3QoIlRocmlmdC5UeXBlUmVnaXN0cnkiKTsKKyAgfQorCisgIGluaXRfa25vd25fdHlwZXNfbGlzdCgpOworCisgIHN0cmluZyB1bml0bmFtZSwgbnNuYW1lOworICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluY2x1ZGVzLnNpemUoKTsgKytpKSB7CisgICAgdW5pdG5hbWUgPSBpbmNsdWRlc1tpXS0+Z2V0X25hbWUoKTsKKyAgICBuc25hbWUgPSBpbmNsdWRlc1tpXS0+Z2V0X25hbWVzcGFjZSgiZGVscGhpIik7CisgICAgaWYgKCIiICE9IG5zbmFtZSkgeworICAgICAgdW5pdG5hbWUgPSBub3JtYWxpemVfbmFtZShuc25hbWUpOworICAgIH0KKyAgICBhZGRfZGVscGhpX3VzZXNfbGlzdCh1bml0bmFtZSk7CisgIH0KKworICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworICBzdGQ6OnN0cmluZyB1bml0bmFtZSA9IHByb2dyYW1fbmFtZV87CisgIGlmICgiIiAhPSBuYW1lc3BhY2VfbmFtZV8pIHsKKyAgICB1bml0bmFtZSA9IG5hbWVzcGFjZV9uYW1lXzsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgKGludCl1bml0bmFtZS5zaXplKCk7IGkrKykgeworICAgIGlmICh1bml0bmFtZVtpXSA9PSAnICcpIHsKKyAgICAgIHVuaXRuYW1lLnJlcGxhY2UoaSwgMSwgIl8iKTsKKyAgICB9CisgIH0KKworICB1bml0bmFtZSA9IG5vcm1hbGl6ZV9uYW1lKHVuaXRuYW1lKTsKKyAgCisgIHN0ZDo6c3RyaW5nIGZfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyAiLyIgKyB1bml0bmFtZSArICIucGFzIjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2FsbDsKKworICBmX2FsbC5vcGVuKGZfbmFtZS5jX3N0cigpKTsKKworICBmX2FsbCA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOworICBnZW5lcmF0ZV9kZWxwaGlfZG9jKGZfYWxsLCBwcm9ncmFtXyk7CisgIGZfYWxsIDw8ICJ1bml0ICIgPDwgdW5pdG5hbWUgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgZl9hbGwgPDwgImludGVyZmFjZSIgPDwgZW5kbCA8PCBlbmRsOworICBmX2FsbCA8PCAidXNlcyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICB2ZWN0b3I8c3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBzX2l0ZXI7CisgIGZvciAoc19pdGVyID0gdXNlc19saXN0LmJlZ2luKCk7IHNfaXRlciAhPSB1c2VzX2xpc3QuZW5kKCk7ICsrc19pdGVyKSB7CisgICAgaWYgKHNfaXRlciAhPSB1c2VzX2xpc3QuYmVnaW4oKSkgeworICAgICAgZl9hbGwgPDwgIiwiOworICAgICAgZl9hbGwgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KGZfYWxsKSA8PCAqc19pdGVyOworICB9CisKKyAgZl9hbGwgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworCisgIHN0cmluZyB0bXBfdW5pdCh1bml0bmFtZSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgKGludCl0bXBfdW5pdC5zaXplKCk7IGkrKykgeworICAgIGlmICh0bXBfdW5pdFtpXSA9PSAnLicpIHsKKyAgICAgIHRtcF91bml0LnJlcGxhY2UoaSwgMSwgIl8iKTsKKyAgICB9CisgIH0KKworICBmX2FsbCA8PCAiY29uc3QiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQoZl9hbGwpIDw8ICJjIiA8PCB0bXBfdW5pdAorICAgICAgICAgICAgICAgIDw8ICJfT3B0aW9uX0Fuc2lTdHJfQmluYXJ5ID0gIiA8PCAoYW5zaXN0cl9iaW5hcnlfID8gIlRydWUiIDogIkZhbHNlIikgPDwgIjsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50KGZfYWxsKSA8PCAiYyIgPDwgdG1wX3VuaXQKKyAgICAgICAgICAgICAgICA8PCAiX09wdGlvbl9SZWdpc3Rlcl9UeXBlcyA9ICIgPDwgKHJlZ2lzdGVyX3R5cGVzXyA/ICJUcnVlIiA6ICJGYWxzZSIpIDw8ICI7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudChmX2FsbCkgPDwgImMiIDw8IHRtcF91bml0CisgICAgICAgICAgICAgICAgPDwgIl9PcHRpb25fQ29uc3RQcmVmaXggICAgPSAiIDw8IChjb25zdHByZWZpeF8gPyAiVHJ1ZSIgOiAiRmFsc2UiKSA8PCAiOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfYWxsKSA8PCAiYyIgPDwgdG1wX3VuaXQgPDwgIl9PcHRpb25fRXZlbnRzICAgICAgICAgPSAiIDw8IChldmVudHNfID8gIlRydWUiIDogIkZhbHNlIikKKyAgICAgICAgICAgICAgICA8PCAiOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfYWxsKSA8PCAiYyIgPDwgdG1wX3VuaXQgPDwgIl9PcHRpb25fWG1sRG9jICAgICAgICAgPSAiIDw8ICh4bWxkb2NfID8gIlRydWUiIDogIkZhbHNlIikKKyAgICAgICAgICAgICAgICA8PCAiOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICBmX2FsbCA8PCBlbmRsOworICBmX2FsbCA8PCAidHlwZSIgPDwgZW5kbDsKKyAgaWYgKGhhc19mb3J3YXJkKSB7CisgICAgZl9hbGwgPDwgc19mb3J3YXJkX2RlY3Iuc3RyKCkgPDwgZW5kbDsKKyAgfQorICBpZiAoaGFzX2VudW0pIHsKKyAgICBpbmRlbnQoZl9hbGwpIDw8IGVuZGw7CisgICAgaW5kZW50KGZfYWxsKSA8PCAieyRTQ09QRURFTlVNUyBPTn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBmX2FsbCA8PCBzX2VudW0uc3RyKCk7CisgICAgaW5kZW50KGZfYWxsKSA8PCAieyRTQ09QRURFTlVNUyBPRkZ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKyAgZl9hbGwgPDwgc19zdHJ1Y3Quc3RyKCk7CisgIGZfYWxsIDw8IHNfc2VydmljZS5zdHIoKTsKKyAgZl9hbGwgPDwgc19jb25zdC5zdHIoKTsKKyAgZl9hbGwgPDwgImltcGxlbWVudGF0aW9uIiA8PCBlbmRsIDw8IGVuZGw7CisgIGZfYWxsIDw8IHNfc3RydWN0X2ltcGwuc3RyKCk7CisgIGZfYWxsIDw8IHNfc2VydmljZV9pbXBsLnN0cigpOworICBmX2FsbCA8PCBzX2NvbnN0X2ltcGwuc3RyKCk7CisKKyAgaWYgKHJlZ2lzdGVyX3R5cGVzXykgeworICAgIGZfYWxsIDw8IGVuZGw7CisgICAgZl9hbGwgPDwgIi8vIFR5cGUgZmFjdG9yeSBtZXRob2RzIGFuZCByZWdpc3RyYXRpb24iIDw8IGVuZGw7CisgICAgZl9hbGwgPDwgc190eXBlX2ZhY3RvcnlfZnVuY3Muc3RyKCk7CisgICAgZl9hbGwgPDwgInByb2NlZHVyZSBSZWdpc3RlclR5cGVGYWN0b3JpZXM7IiA8PCBlbmRsOworICAgIGZfYWxsIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgICBmX2FsbCA8PCBzX3R5cGVfZmFjdG9yeV9yZWdpc3RyYXRpb24uc3RyKCk7CisgICAgZl9hbGwgPDwgImVuZDsiIDw8IGVuZGw7CisgIH0KKyAgZl9hbGwgPDwgZW5kbDsKKworICBzdHJpbmcgY29uc3RhbnRzX2NsYXNzID0gbWFrZV9jb25zdGFudHNfY2xhc3NuYW1lKCk7CisKKyAgZl9hbGwgPDwgImluaXRpYWxpemF0aW9uIiA8PCBlbmRsOworICBpZiAoaGFzX2NvbnN0KSB7CisgICAgZl9hbGwgPDwgInskSUYgQ29tcGlsZXJWZXJzaW9uIDwgMjEuMH0gIC8vIEQyMDEwIiA8PCBlbmRsOworICAgIGZfYWxsIDw8ICIgICIgPDwgY29uc3RhbnRzX2NsYXNzLmNfc3RyKCkgPDwgIl9Jbml0aWFsaXplOyIgPDwgZW5kbDsKKyAgICBmX2FsbCA8PCAieyRJRkVORH0iIDw8IGVuZGw7CisgIH0KKyAgaWYgKHJlZ2lzdGVyX3R5cGVzXykgeworICAgIGZfYWxsIDw8ICIgIFJlZ2lzdGVyVHlwZUZhY3RvcmllczsiIDw8IGVuZGw7CisgIH0KKyAgZl9hbGwgPDwgZW5kbDsKKworICBmX2FsbCA8PCAiZmluYWxpemF0aW9uIiA8PCBlbmRsOworICBpZiAoaGFzX2NvbnN0KSB7CisgICAgZl9hbGwgPDwgInskSUYgQ29tcGlsZXJWZXJzaW9uIDwgMjEuMH0gIC8vIEQyMDEwIiA8PCBlbmRsOworICAgIGZfYWxsIDw8ICIgICIgPDwgY29uc3RhbnRzX2NsYXNzLmNfc3RyKCkgPDwgIl9GaW5hbGl6ZTsiIDw8IGVuZGw7CisgICAgZl9hbGwgPDwgInskSUZFTkR9IiA8PCBlbmRsOworICB9CisgIGZfYWxsIDw8IGVuZGwgPDwgZW5kbDsKKworICBmX2FsbCA8PCAiZW5kLiIgPDwgZW5kbDsKKyAgZl9hbGwuY2xvc2UoKTsKKworICBpZiAoIXR5cGVkZWZzX3BlbmRpbmcuZW1wdHkoKSkgeworICAgIHB3YXJuaW5nKDAsICIlZCB0eXBlZGVmcyB3aXRoIHVucmVzb2x2ZWQgdHlwZSByZWZlcmVuY2VzIGxlZnQ6XG4iLCB0eXBlZGVmc19wZW5kaW5nLnNpemUoKSk7CisgICAgZm9yIChzdGQ6Omxpc3Q8dF90eXBlZGVmKj46Oml0ZXJhdG9yIGl0ZXIgPSB0eXBlZGVmc19wZW5kaW5nLmJlZ2luKCk7CisgICAgICAgICB0eXBlZGVmc19wZW5kaW5nLmVuZCgpICE9IGl0ZXI7CisgICAgICAgICArK2l0ZXIpIHsKKyAgICAgIHB3YXJuaW5nKDAsICItICVzXG4iLCAoKml0ZXIpLT5nZXRfc3ltYm9saWMoKS5jX3N0cigpKTsKKyAgICB9CisgIH0KK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmRlbHBoaV90eXBlX3VzaW5ncyhvc3RyZWFtJiBvdXQpIHsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJDbGFzc2VzLCBTeXNVdGlscywgR2VuZXJpY3MuQ29sbGVjdGlvbnMsIFRocmlmdC5Db2xsZWN0aW9ucywgVGhyaWZ0LlByb3RvY29sLCIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIlRocmlmdC5UcmFuc3BvcnQ7IiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mb3J3YXJkX2RlY2xhcmF0aW9uKHRfc3RydWN0KiB0c3RydWN0KSB7CisgIC8vIEZvcndhcmQgZGVjbGFyZSBzdHJ1Y3QgZGVmCisgIGhhc19mb3J3YXJkID0gdHJ1ZTsKKyAgcHZlcmJvc2UoImZvcndhcmQgZGVjbGFyYXRpb24gb2YgJXNcbiIsIHR5cGVfbmFtZSh0c3RydWN0KS5jX3N0cigpKTsKKworICBzdHJpbmcgd2hhdCA9IHRzdHJ1Y3QtPmlzX3hjZXB0aW9uKCkgPyAiY2xhc3MiIDogImludGVyZmFjZSI7CisKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChzX2ZvcndhcmRfZGVjcikgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QsIHRzdHJ1Y3QtPmlzX3hjZXB0aW9uKCksIHRydWUpIDw8ICIgPSAiIDw8IHdoYXQgPDwgIjsiCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICBhZGRfZGVmaW5lZF90eXBlKHRzdHJ1Y3QpOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgIHRfdHlwZSogdHlwZSA9IHR0eXBlZGVmLT5nZXRfdHlwZSgpOworCisgIC8vIHdyaXRlIG5vdyBvciBzYXZlIGZvciBsYXRlcj8KKyAgaWYgKCFpc19mdWxseV9kZWZpbmVkX3R5cGUodHlwZSkpIHsKKyAgICBwdmVyYm9zZSgidHlwZWRlZiAlczogdW5yZXNvbHZlZCBkZXBlbmRlbmNpZXMgZm91bmRcbiIsIHR5cGVfbmFtZSh0dHlwZWRlZikuY19zdHIoKSk7CisgICAgdHlwZWRlZnNfcGVuZGluZy5wdXNoX2JhY2sodHR5cGVkZWYpOworICAgIHJldHVybjsKKyAgfQorCisgIGluZGVudF91cCgpOworICBnZW5lcmF0ZV9kZWxwaGlfZG9jKHNfc3RydWN0LCB0dHlwZWRlZik7CisgIGluZGVudChzX3N0cnVjdCkgPDwgdHlwZV9uYW1lKHR0eXBlZGVmKSA8PCAiID0gIjsKKworICAvLyBjb21tZW50ZWQgb3V0OiB0aGUgYmVuZWZpdCBpcyBub3QgYmlnIGVub3VnaCB0byByaXNrIGJyZWFraW5nIGV4aXN0aW5nIGNvZGUKKyAgLy8gYm9vbCBjb250YWluZXIgPSB0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfbWFwKCkgfHwgdHlwZS0+aXNfc2V0KCk7CisgIC8vIGlmKCAhIGNvbnRhaW5lcikKKyAgLy8gIHNfc3RydWN0IDw8ICJ0eXBlICI7ICAvL3RoZSAidHlwZSBBID0gdHlwZSBCIiBzeW50YXggbGVhZHMgdG8gRTI1NzQgd2l0aCBnZW5lcmljcworCisgIHNfc3RydWN0IDw8IHR5cGVfbmFtZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSkgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICBhZGRfZGVmaW5lZF90eXBlKHR0eXBlZGVmKTsKK30KKworYm9vbCB0X2RlbHBoaV9nZW5lcmF0b3I6OmlzX2Z1bGx5X2RlZmluZWRfdHlwZSh0X3R5cGUqIHR0eXBlKSB7CisgIGlmICgoTlVMTCAhPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKSkgJiYgKHR0eXBlLT5nZXRfcHJvZ3JhbSgpICE9IHByb2dyYW1fKSkgeworICAgIHRfc2NvcGUqIHNjb3BlID0gdHR5cGUtPmdldF9wcm9ncmFtKCktPnNjb3BlKCk7CisgICAgaWYgKE5VTEwgIT0gc2NvcGUtPmdldF90eXBlKHR0eXBlLT5nZXRfbmFtZSgpKSkgeworICAgICAgLy8gcHJpbnRmKCJ0eXBlICVzIGZvdW5kIGluIGluY2x1ZGVkIHNjb3BlICVzXG4iLCB0dHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgLy8gdHR5cGUtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lKCkuY19zdHIoKSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKworICBpZiAodHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHJldHVybiAoMSA9PSB0eXBlc19rbm93blt0eXBlX25hbWUodHR5cGUpXSk7CisgIH0KKworICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgcmV0dXJuICgxID09IHR5cGVzX2tub3duW2Jhc2VfdHlwZV9uYW1lKCh0X2Jhc2VfdHlwZSopdHR5cGUpXSk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiB0cnVlOyAvLyBlbnVtcyBhcmUgd3JpdHRlbiBmaXJzdCwgYmVmb3JlIGFsbCBvdGhlciB0eXBlcworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHRfbWFwKiB0bWFwID0gKHRfbWFwKil0dHlwZTsKKyAgICByZXR1cm4gaXNfZnVsbHlfZGVmaW5lZF90eXBlKHRtYXAtPmdldF9rZXlfdHlwZSgpKQorICAgICAgICAgICAmJiBpc19mdWxseV9kZWZpbmVkX3R5cGUodG1hcC0+Z2V0X3ZhbF90eXBlKCkpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHRfc2V0KiB0c2V0ID0gKHRfc2V0Kil0dHlwZTsKKyAgICByZXR1cm4gaXNfZnVsbHlfZGVmaW5lZF90eXBlKHRzZXQtPmdldF9lbGVtX3R5cGUoKSk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHRfbGlzdCogdGxpc3QgPSAodF9saXN0Kil0dHlwZTsKKyAgICByZXR1cm4gaXNfZnVsbHlfZGVmaW5lZF90eXBlKHRsaXN0LT5nZXRfZWxlbV90eXBlKCkpOworICB9CisKKyAgcmV0dXJuICgxID09IHR5cGVzX2tub3duW3R5cGVfbmFtZSh0dHlwZSldKTsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmFkZF9kZWZpbmVkX3R5cGUodF90eXBlKiB0dHlwZSkgeworICAvLyBtYXJrIGFzIGtub3duIHR5cGUKKyAgdHlwZXNfa25vd25bdHlwZV9uYW1lKHR0eXBlKV0gPSAxOworCisgIC8vIGNoZWNrIGFsbCBwZW5kaW5nIHR5cGVkZWZzCisgIHN0ZDo6bGlzdDx0X3R5cGVkZWYqPjo6aXRlcmF0b3IgaXRlcjsKKyAgYm9vbCBtb3JlID0gdHJ1ZTsKKyAgd2hpbGUgKG1vcmUgJiYgKCF0eXBlZGVmc19wZW5kaW5nLmVtcHR5KCkpKSB7CisgICAgbW9yZSA9IGZhbHNlOworCisgICAgZm9yIChpdGVyID0gdHlwZWRlZnNfcGVuZGluZy5iZWdpbigpOyB0eXBlZGVmc19wZW5kaW5nLmVuZCgpICE9IGl0ZXI7ICsraXRlcikgeworICAgICAgdF90eXBlZGVmKiB0dHlwZWRlZiA9ICgqaXRlcik7CisgICAgICBpZiAoaXNfZnVsbHlfZGVmaW5lZF90eXBlKHR0eXBlZGVmLT5nZXRfdHlwZSgpKSkgeworICAgICAgICBwdmVyYm9zZSgidHlwZWRlZiAlczogYWxsIHBlbmRpbmcgcmVmZXJlbmNlcyBhcmUgbm93IHJlc29sdmVkXG4iLAorICAgICAgICAgICAgICAgICB0eXBlX25hbWUodHR5cGVkZWYpLmNfc3RyKCkpOworICAgICAgICB0eXBlZGVmc19wZW5kaW5nLmVyYXNlKGl0ZXIpOworICAgICAgICBnZW5lcmF0ZV90eXBlZGVmKHR0eXBlZGVmKTsKKyAgICAgICAgbW9yZSA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6aW5pdF9rbm93bl90eXBlc19saXN0KCkgeworICAvLyBrbm93biBiYXNlIHR5cGVzCisgIHR5cGVzX2tub3duW3R5cGVfbmFtZShnX3R5cGVfc3RyaW5nKV0gPSAxOworICB0eXBlc19rbm93blt0eXBlX25hbWUoZ190eXBlX2JpbmFyeSldID0gMTsKKyAgdHlwZXNfa25vd25bdHlwZV9uYW1lKGdfdHlwZV9ib29sKV0gPSAxOworICB0eXBlc19rbm93blt0eXBlX25hbWUoZ190eXBlX2k4KV0gPSAxOworICB0eXBlc19rbm93blt0eXBlX25hbWUoZ190eXBlX2kxNildID0gMTsKKyAgdHlwZXNfa25vd25bdHlwZV9uYW1lKGdfdHlwZV9pMzIpXSA9IDE7CisgIHR5cGVzX2tub3duW3R5cGVfbmFtZShnX3R5cGVfaTY0KV0gPSAxOworICB0eXBlc19rbm93blt0eXBlX25hbWUoZ190eXBlX2RvdWJsZSldID0gMTsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICBoYXNfZW51bSA9IHRydWU7CisgIGluZGVudF91cCgpOworICBnZW5lcmF0ZV9kZWxwaGlfZG9jKHNfZW51bSwgdGVudW0pOworICBpbmRlbnQoc19lbnVtKSA8PCB0eXBlX25hbWUodGVudW0sIHRydWUsIHRydWUpIDw8ICIgPSAiCisgICAgICAgICAgICAgICAgIDw8ICIoIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIGlmIChjb25zdGFudHMuZW1wdHkoKSkgeworICAgIGluZGVudChzX2VudW0pIDw8ICJkdW1teSA9IDAgIC8vIGVtcHR5IGVudW1zIGFyZSBub3QgYWxsb3dlZCI7CisgIH0gZWxzZSB7CisgICAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7CisgICAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgICBpZiAoY19pdGVyICE9IGNvbnN0YW50cy5iZWdpbigpKSB7CisgICAgICAgIHNfZW51bSA8PCAiLCI7CisgICAgICAgIHNfZW51bSA8PCBlbmRsOworICAgICAgfQorICAgICAgZ2VuZXJhdGVfZGVscGhpX2RvYyhzX2VudW0sICpjX2l0ZXIpOworICAgICAgaW5kZW50KHNfZW51bSkgPDwgbm9ybWFsaXplX25hbWUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiID0gIiA8PCB2YWx1ZTsKKyAgICB9CisgIH0KKyAgc19lbnVtIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChzX2VudW0pIDw8ICIpOyIgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworfQorCitzdGQ6OnN0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6Om1ha2VfdmFsaWRfZGVscGhpX2lkZW50aWZpZXIoc3RkOjpzdHJpbmcgY29uc3QmIGZyb21OYW1lKSB7CisgIHN0ZDo6c3RyaW5nIHN0ciA9IGZyb21OYW1lOworICBpZiAoc3RyLmVtcHR5KCkpIHsKKyAgICByZXR1cm4gc3RyOworICB9CisKKyAgLy8gdGVzdHMgcmVseSBvbiB0aGlzCisgIGFzc2VydCgoJ0EnIDwgJ1onKSAmJiAoJ2EnIDwgJ3onKSAmJiAoJzAnIDwgJzknKSk7CisKKyAgLy8gaWYgdGhlIGZpcnN0IGxldHRlciBpcyBhIG51bWJlciwgd2UgYWRkIGFuIGFkZGl0aW9uYWwgdW5kZXJzY29yZSBpbiBmcm9udCBvZiBpdAorICBjaGFyIGMgPSBzdHIuYXQoMCk7CisgIGlmICgoJzAnIDw9IGMpICYmIChjIDw9ICc5JykpIHsKKyAgICBzdHIgPSAiXyIgKyBzdHI7CisgIH0KKworICAvLyBmb2xsb3dpbmcgY2hhcnM6IGxldHRlciwgbnVtYmVyIG9yIHVuZGVyc2NvcmUKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdHIuc2l6ZSgpOyArK2kpIHsKKyAgICBjID0gc3RyLmF0KGkpOworICAgIGlmICgoKCdBJyA+IGMpIHx8IChjID4gJ1onKSkgJiYgKCgnYScgPiBjKSB8fCAoYyA+ICd6JykpICYmICgoJzAnID4gYykgfHwgKGMgPiAnOScpKQorICAgICAgICAmJiAoJ18nICE9IGMpKSB7CisgICAgICBzdHIucmVwbGFjZShpLCAxLCAiXyIpOworICAgIH0KKyAgfQorCisgIHJldHVybiBzdHI7Cit9CisKK3N0ZDo6c3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6bWFrZV9jb25zdGFudHNfY2xhc3NuYW1lKCkgeworICBpZiAoY29uc3RwcmVmaXhfKSB7CisgICAgcmV0dXJuIG1ha2VfdmFsaWRfZGVscGhpX2lkZW50aWZpZXIoIlQiICsgcHJvZ3JhbV9uYW1lXyArICJDb25zdGFudHMiKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gIlRDb25zdGFudHMiOyAvLyBjb21wYXRpYmlsaXR5CisgIH0KK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKSB7CisgIGlmIChjb25zdHMuZW1wdHkoKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIGhhc19jb25zdCA9IHRydWU7CisgIHN0cmluZyBjb25zdGFudHNfY2xhc3MgPSBtYWtlX2NvbnN0YW50c19jbGFzc25hbWUoKTsKKworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KHNfY29uc3QpIDw8IGNvbnN0YW50c19jbGFzcy5jX3N0cigpIDw8ICIgPSBjbGFzcyIgPDwgZW5kbDsKKyAgaW5kZW50KHNfY29uc3QpIDw8ICJwcml2YXRlIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY19pdGVyOworICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGlmIChjb25zdF9uZWVkc192YXIoKCpjX2l0ZXIpLT5nZXRfdHlwZSgpKSkgeworICAgICAgcHJpbnRfcHJpdmF0ZV9maWVsZChzX2NvbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVfbmFtZSgoKmNfaXRlciktPmdldF9uYW1lKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF90eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkpOworICAgIH0KKyAgfQorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoc19jb25zdCkgPDwgInB1YmxpYyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgZ2VuZXJhdGVfZGVscGhpX2RvYyhzX2NvbnN0LCAqY19pdGVyKTsKKyAgICBwcmludF9jb25zdF9wcm9wKHNfY29uc3QsCisgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVfbmFtZSgoKmNfaXRlciktPmdldF9uYW1lKCkpLAorICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSk7CisgIH0KKyAgaW5kZW50KHNfY29uc3QpIDw8ICJ7JElGIENvbXBpbGVyVmVyc2lvbiA+PSAyMS4wfSIgPDwgZW5kbDsKKyAgaW5kZW50KHNfY29uc3QpIDw8ICJjbGFzcyBjb25zdHJ1Y3RvciBDcmVhdGU7IiA8PCBlbmRsOworICBpbmRlbnQoc19jb25zdCkgPDwgImNsYXNzIGRlc3RydWN0b3IgRGVzdHJveTsiIDw8IGVuZGw7CisgIGluZGVudChzX2NvbnN0KSA8PCAieyRJRkVORH0iIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChzX2NvbnN0KSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIHN0ZDo6b3N0cmluZ3N0cmVhbSB2YXJzLCBjb2RlOworCisgIGluZGVudF91cF9pbXBsKCk7CisgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaW5pdGlhbGl6ZV9maWVsZCh2YXJzLAorICAgICAgICAgICAgICAgICAgICAgY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICJGIiArIHByb3BfbmFtZSgoKmNfaXRlciktPmdldF9uYW1lKCkpLAorICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSk7CisgIH0KKyAgaW5kZW50X2Rvd25faW1wbCgpOworCisgIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgInskSUYgQ29tcGlsZXJWZXJzaW9uID49IDIxLjB9IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJjbGFzcyBjb25zdHJ1Y3RvciAiIDw8IGNvbnN0YW50c19jbGFzcy5jX3N0cigpIDw8ICIuQ3JlYXRlOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworCisgIGlmICghdmFycy5zdHIoKS5lbXB0eSgpKSB7CisgICAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAidmFyIiA8PCBlbmRsOworICAgIHNfY29uc3RfaW1wbCA8PCB2YXJzLnN0cigpOworICB9CisgIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOworICBpZiAoIWNvZGUuc3RyKCkuZW1wdHkoKSkgeworICAgIHNfY29uc3RfaW1wbCA8PCBjb2RlLnN0cigpOworICB9CisgIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAiY2xhc3MgZGVzdHJ1Y3RvciAiIDw8IGNvbnN0YW50c19jbGFzcy5jX3N0cigpIDw8ICIuRGVzdHJveTsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaWYgKGNvbnN0X25lZWRzX3ZhcigoKmNfaXRlciktPmdldF90eXBlKCkpKSB7CisgICAgICBmaW5hbGl6ZV9maWVsZChzX2NvbnN0X2ltcGwsCisgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVfbmFtZSgoKmNfaXRlciktPmdldF9uYW1lKCkpLAorICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSk7CisgICAgfQorICB9CisgIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgImluaGVyaXRlZDsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAieyRFTFNFfSIgPDwgZW5kbDsKKworICB2YXJzLnN0cigiIik7CisgIGNvZGUuc3RyKCIiKTsKKworICBpbmRlbnRfdXBfaW1wbCgpOworICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGlmIChjb25zdF9uZWVkc192YXIoKCpjX2l0ZXIpLT5nZXRfdHlwZSgpKSkgeworICAgICAgaW5pdGlhbGl6ZV9maWVsZCh2YXJzLAorICAgICAgICAgICAgICAgICAgICAgICBjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdGFudHNfY2xhc3MgKyAiLkYiICsgcHJvcF9uYW1lKCgqY19pdGVyKS0+Z2V0X25hbWUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSk7CisgICAgfQorICB9CisgIGluZGVudF9kb3duX2ltcGwoKTsKKworICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJwcm9jZWR1cmUgIiA8PCBjb25zdGFudHNfY2xhc3MuY19zdHIoKSA8PCAiX0luaXRpYWxpemU7IiA8PCBlbmRsOworICBpZiAoIXZhcnMuc3RyKCkuZW1wdHkoKSkgeworICAgIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgInZhciIgPDwgZW5kbDsKKyAgICBzX2NvbnN0X2ltcGwgPDwgdmFycy5zdHIoKTsKKyAgfQorICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgaWYgKCFjb2RlLnN0cigpLmVtcHR5KCkpIHsKKyAgICBzX2NvbnN0X2ltcGwgPDwgY29kZS5zdHIoKTsKKyAgfQorICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAicHJvY2VkdXJlICIgPDwgY29uc3RhbnRzX2NsYXNzLmNfc3RyKCkgPDwgIl9GaW5hbGl6ZTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGZpbmFsaXplX2ZpZWxkKHNfY29uc3RfaW1wbCwKKyAgICAgICAgICAgICAgICAgICBub3JtYWxpemVfbmFtZSgoKmNfaXRlciktPmdldF9uYW1lKCkpLAorICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF92YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgIGNvbnN0YW50c19jbGFzcyk7CisgIH0KKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJ7JElGRU5EfSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfZGVmX3ZhbHVlKHN0ZDo6b3N0cmVhbSYgdmFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2xzX25tKSB7CisKKyAgc3RyaW5nIGNsc19wcmVmaXg7CisKKyAgaWYgKGNsc19ubSA9PSAiIikgeworICAgIGNsc19wcmVmaXggPSAiIjsKKyAgfSBlbHNlIHsKKyAgICBjbHNfcHJlZml4ID0gY2xzX25tICsgIi4iOworICB9CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7CisgICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOworICAgICAgfQorICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZSh2YXJzLCBvdXQsIG5hbWUsIGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgIGluZGVudF9pbXBsKG91dCkgPDwgY2xzX3ByZWZpeCA8PCBub3JtYWxpemVfbmFtZShuYW1lKSA8PCAiLiIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgcHJvcF9uYW1lKHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSwgdHlwZS0+aXNfeGNlcHRpb24oKSkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIiA6PSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgc3RyaW5nIGtleSA9IHJlbmRlcl9jb25zdF92YWx1ZSh2YXJzLCBvdXQsIG5hbWUsIGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUodmFycywgb3V0LCBuYW1lLCB2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCBjbHNfcHJlZml4IDw8IG5vcm1hbGl6ZV9uYW1lKG5hbWUpIDw8ICJbIiA8PCBrZXkgPDwgIl0iCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgOj0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogZXR5cGU7CisgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0KKworICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZSh2YXJzLCBvdXQsIG5hbWUsIGV0eXBlLCAqdl9pdGVyKTsKKyAgICAgIGluZGVudF9pbXBsKG91dCkgPDwgY2xzX3ByZWZpeCA8PCBub3JtYWxpemVfbmFtZShuYW1lKSA8PCAiLkFkZCgiIDw8IHZhbCA8PCAiKTsiIDw8IGVuZGw7CisgICAgfQorICB9Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpwcmludF9wcml2YXRlX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICAodm9pZCl2YWx1ZTsKKyAgaW5kZW50KG91dCkgPDwgImNsYXNzIHZhciBGIiA8PCBuYW1lIDw8ICI6ICIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICI7IiA8PCBlbmRsOworfQorCitib29sIHRfZGVscGhpX2dlbmVyYXRvcjo6Y29uc3RfbmVlZHNfdmFyKHRfdHlwZSogdHlwZSkgeworICB0X3R5cGUqIHRydWV0eXBlID0gdHlwZTsKKyAgd2hpbGUgKHRydWV0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICB0cnVldHlwZSA9ICgodF90eXBlZGVmKil0cnVldHlwZSktPmdldF90eXBlKCk7CisgIH0KKyAgcmV0dXJuICghdHJ1ZXR5cGUtPmlzX2Jhc2VfdHlwZSgpKTsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OnByaW50X2NvbnN0X3Byb3Aoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgICh2b2lkKXZhbHVlOworICBpZiAoY29uc3RfbmVlZHNfdmFyKHR5cGUpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImNsYXNzIHByb3BlcnR5ICIgPDwgbmFtZSA8PCAiOiAiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiIHJlYWQgRiIgPDwgbmFtZSA8PCAiOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSB2YXJzOyAvLyBkdW1teQorICAgIHN0cmluZyB2MiA9IHJlbmRlcl9jb25zdF92YWx1ZSh2YXJzLCBvdXQsIG5hbWUsIHR5cGUsIHZhbHVlKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiY29uc3QgIiA8PCBuYW1lIDw8ICIgPSAiIDw8IHYyIDw8ICI7IiA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpwcmludF9jb25zdF92YWx1ZShzdGQ6Om9zdHJlYW0mIHZhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgIHRfdHlwZSogdHJ1ZXR5cGUgPSB0eXBlOworICB3aGlsZSAodHJ1ZXR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHRydWV0eXBlID0gKCh0X3R5cGVkZWYqKXRydWV0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgfQorCisgIGlmICh0cnVldHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAvLyBhbHJlYWR5IGRvbmUKKyAgICAvLyBzdHJpbmcgdjIgPSByZW5kZXJfY29uc3RfdmFsdWUoIHZhcnMsIG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOworICAgIC8vIGluZGVudF9pbXBsKG91dCkgPDwgbmFtZSA8PCAiIDo9ICIgPDwgdjIgPDwgIjsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHJ1ZXR5cGUtPmlzX2VudW0oKSkgeworICAgIGluZGVudF9pbXBsKG91dCkgPDwgbmFtZSA8PCAiIDo9ICIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIuIiA8PCB2YWx1ZS0+Z2V0X2lkZW50aWZpZXJfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICA8PCAiOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBzdHJpbmcgdHlwbmFtZTsKKyAgICB0eXBuYW1lID0gdHlwZV9uYW1lKHRydWV0eXBlLCB0cnVlLCBmYWxzZSwgdHlwZS0+aXNfeGNlcHRpb24oKSwgdHlwZS0+aXNfeGNlcHRpb24oKSk7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCBuYW1lIDw8ICIgOj0gIiA8PCB0eXBuYW1lIDw8ICIuQ3JlYXRlOyIgPDwgZW5kbDsKKyAgICBwcmludF9jb25zdF9kZWZfdmFsdWUodmFycywgb3V0LCBuYW1lLCB0cnVldHlwZSwgdmFsdWUpOworICB9Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjppbml0aWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgdmFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICBwcmludF9jb25zdF92YWx1ZSh2YXJzLCBvdXQsIG5hbWUsIHR5cGUsIHZhbHVlKTsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmZpbmFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2xzX25tKSB7CisgICh2b2lkKW91dDsKKyAgKHZvaWQpbmFtZTsKKyAgKHZvaWQpdHlwZTsKKyAgKHZvaWQpdmFsdWU7CisgICh2b2lkKWNsc19ubTsKK30KKworc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKG9zdHJlYW0mIHZhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICAodm9pZCluYW1lOworCisgIHRfdHlwZSogdHJ1ZXR5cGUgPSB0eXBlOworICB3aGlsZSAodHJ1ZXR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHRydWV0eXBlID0gKCh0X3R5cGVkZWYqKXRydWV0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgfQorCisgIHN0ZDo6b3N0cmluZ3N0cmVhbSByZW5kZXI7CisKKyAgaWYgKHRydWV0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0cnVldHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmVuZGVyIDw8ICInIiA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICInIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJlbmRlciA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCkgPyAiVHJ1ZSIgOiAiRmFsc2UiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZW5kZXIgPDwgIlNob3J0SW50KCAiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICIpIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmVuZGVyIDw8ICJTbWFsbEludCggIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiKSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJlbmRlciA8PCAiTG9uZ0ludCggIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiKSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJlbmRlciA8PCAiSW50NjQoICIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIikiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIi4wIjsgLy8gbWFrZSBpdCBhIGRvdWJsZSBjb25zdGFudCBieSBhZGRpbmcgIi4wIgorICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHRydWV0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZW5kZXIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlKSA8PCAiLiIgPDwgdmFsdWUtPmdldF9pZGVudGlmaWVyX25hbWUoKTsKKyAgfSBlbHNlIHsKKyAgICBzdHJpbmcgdCA9IHRtcCgidG1wIik7CisgICAgdmFycyA8PCAiICAiIDw8IHQgPDwgIiA6ICIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICI7IiA8PCBlbmRsOworICAgIHByaW50X2NvbnN0X3ZhbHVlKHZhcnMsIG91dCwgdCwgdHlwZSwgdmFsdWUpOworICAgIHJlbmRlciA8PCB0OworICB9CisKKyAgcmV0dXJuIHJlbmRlci5zdHIoKTsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKKyAgaW5kZW50X3VwKCk7CisgIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfZGVmaW5pdGlvbihzX3N0cnVjdCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKKyAgaW5kZW50X2Rvd24oKTsKKworICBhZGRfZGVmaW5lZF90eXBlKHRzdHJ1Y3QpOworCisgIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfaW1wbChzX3N0cnVjdF9pbXBsLCAiIiwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKKyAgaWYgKHJlZ2lzdGVyX3R5cGVzXykgeworICAgIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfdHlwZV9mYWN0b3J5KHNfdHlwZV9mYWN0b3J5X2Z1bmNzLCAiIiwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKKyAgICBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3R5cGVfZmFjdG9yeV9yZWdpc3RyYXRpb24oc190eXBlX2ZhY3RvcnlfcmVnaXN0cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXhjZXB0aW9uKTsKKyAgfQorfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX3N0cnVjdF9pbXBsKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeF9mYWN0b3J5KSB7CisKKyAgaWYgKGlzX2V4Y2VwdGlvbiAmJiAoIWlzX3hfZmFjdG9yeSkpIHsKKyAgICBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X2ltcGwob3V0LCBjbHNfcHJlZml4LCB0c3RydWN0LCBpc19leGNlcHRpb24sIGlzX3Jlc3VsdCwgdHJ1ZSk7CisgIH0KKworICBzdHJpbmcgY2xzX25tOworCisgIHN0cmluZyBleGNlcHRpb25fZmFjdG9yeV9uYW1lOworCisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBleGNlcHRpb25fZmFjdG9yeV9uYW1lID0gbm9ybWFsaXplX2Nsc25tKHRzdHJ1Y3QtPmdldF9uYW1lKCksICIiLCB0cnVlKSArICJGYWN0b3J5IjsKKyAgfQorCisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBjbHNfbm0gPSB0eXBlX25hbWUodHN0cnVjdCwgdHJ1ZSwgKCFpc194X2ZhY3RvcnkpLCBpc194X2ZhY3RvcnksIHRydWUpOworICB9IGVsc2UgeworICAgIGNsc19ubSA9IHR5cGVfbmFtZSh0c3RydWN0LCB0cnVlLCBmYWxzZSk7CisgIH0KKworICBzdGQ6Om9zdHJpbmdzdHJlYW0gdmFycywgY29kZTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGluZGVudF91cF9pbXBsKCk7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X3R5cGUqIHQgPSAoKm1faXRlciktPmdldF90eXBlKCk7CisgICAgd2hpbGUgKHQtPmlzX3R5cGVkZWYoKSkgeworICAgICAgdCA9ICgodF90eXBlZGVmKil0KS0+Z2V0X3R5cGUoKTsKKyAgICB9CisgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgICAgaW5pdGlhbGl6ZV9maWVsZCh2YXJzLAorICAgICAgICAgICAgICAgICAgICAgICBjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAiRiIgKyBwcm9wX25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpLCBpc19leGNlcHRpb24pLAorICAgICAgICAgICAgICAgICAgICAgICB0LAorICAgICAgICAgICAgICAgICAgICAgICAoKm1faXRlciktPmdldF92YWx1ZSgpKTsKKyAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICAgIGluZGVudF9pbXBsKGNvZGUpIDw8ICJGX19pc3NldF8iIDw8IHByb3BfbmFtZSgoKm1faXRlciksIGlzX2V4Y2VwdGlvbikgPDwgIiA6PSBUcnVlOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaW5kZW50X2Rvd25faW1wbCgpOworCisgIGluZGVudF9pbXBsKG91dCkgPDwgImNvbnN0cnVjdG9yICIgPDwgY2xzX3ByZWZpeCA8PCBjbHNfbm0gPDwgIi4iCisgICAgICAgICAgICAgICAgICAgPDwgIkNyZWF0ZTsiIDw8IGVuZGw7CisKKyAgaWYgKCF2YXJzLnN0cigpLmVtcHR5KCkpIHsKKyAgICBvdXQgPDwgInZhciIgPDwgZW5kbDsKKyAgICBvdXQgPDwgdmFycy5zdHIoKTsKKyAgfQorCisgIGluZGVudF9pbXBsKG91dCkgPDwgImJlZ2luIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpZiAoaXNfZXhjZXB0aW9uICYmICghaXNfeF9mYWN0b3J5KSkgeworICAgIGluZGVudF9pbXBsKG91dCkgPDwgImluaGVyaXRlZCBDcmVhdGUoJycpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJpbmhlcml0ZWQ7IiA8PCBlbmRsOworICB9CisKKyAgaWYgKCFjb2RlLnN0cigpLmVtcHR5KCkpIHsKKyAgICBvdXQgPDwgY29kZS5zdHIoKTsKKyAgfQorCisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGlmICgobWVtYmVycy5zaXplKCkgPiAwKSAmJiBpc19leGNlcHRpb24gJiYgKCFpc194X2ZhY3RvcnkpKSB7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiY29uc3RydWN0b3IgIiA8PCBjbHNfcHJlZml4IDw8IGNsc19ubSA8PCAiLiIKKyAgICAgICAgICAgICAgICAgICAgIDw8ICJDcmVhdGUoIiA8PCBjb25zdHJ1Y3Rvcl9hcmd1bWVudF9saXN0KHRzdHJ1Y3QsIGluZGVudF9pbXBsKCkpIDw8ICIpOyIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJDcmVhdGU7IiA8PCBlbmRsOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIHN0cmluZyBwcm9wbmFtZSA9IHByb3BfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCksIGlzX2V4Y2VwdGlvbik7CisgICAgICBzdHJpbmcgcGFyYW1fbmFtZSA9IGNvbnN0cnVjdG9yX3BhcmFtX25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICAgIGluZGVudF9pbXBsKG91dCkgPDwgcHJvcG5hbWUgPDwgIiA6PSAiIDw8IHBhcmFtX25hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9pbXBsKG91dCkgPDwgIlVwZGF0ZU1lc3NhZ2VQcm9wZXJ0eTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd25faW1wbCgpOworICAgIGluZGVudF9pbXBsKG91dCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9pbXBsKG91dCkgPDwgImRlc3RydWN0b3IgIiA8PCBjbHNfcHJlZml4IDw8IGNsc19ubSA8PCAiLiIKKyAgICAgICAgICAgICAgICAgICA8PCAiRGVzdHJveTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKG91dCkgPDwgImJlZ2luIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X3R5cGUqIHQgPSAoKm1faXRlciktPmdldF90eXBlKCk7CisgICAgd2hpbGUgKHQtPmlzX3R5cGVkZWYoKSkgeworICAgICAgdCA9ICgodF90eXBlZGVmKil0KS0+Z2V0X3R5cGUoKTsKKyAgICB9CisgICAgZmluYWxpemVfZmllbGQob3V0LCBwcm9wX25hbWUoKm1faXRlciwgaXNfZXhjZXB0aW9uKSwgdCwgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSk7CisgIH0KKworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJpbmhlcml0ZWQ7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKG91dCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBpZiAoaXNfZXhjZXB0aW9uICYmICghaXNfeF9mYWN0b3J5KSkgeworICAgIGluZGVudF9pbXBsKG91dCkgPDwgImZ1bmN0aW9uICIgPDwgY2xzX3ByZWZpeCA8PCBjbHNfbm0gPDwgIi4iIDw8IGV4Y2VwdGlvbl9mYWN0b3J5X25hbWUKKyAgICAgICAgICAgICAgICAgICAgIDw8ICI6IEkiIDw8IGV4Y2VwdGlvbl9mYWN0b3J5X25hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJpZiBGIiA8PCBleGNlcHRpb25fZmFjdG9yeV9uYW1lIDw8ICIgPSBuaWwiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAidGhlbiBGIiA8PCBleGNlcHRpb25fZmFjdG9yeV9uYW1lIDw8ICIgOj0gVCIgPDwgZXhjZXB0aW9uX2ZhY3RvcnlfbmFtZSA8PCAiSW1wbC5DcmVhdGU7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKG91dCkgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJyZXN1bHQgOj0gRiIgPDwgZXhjZXB0aW9uX2ZhY3RvcnlfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgaWYgKHRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJwcm9jZWR1cmUgIiA8PCBjbHNfcHJlZml4IDw8IGNsc19ubSA8PCAiLiIKKyAgICAgICAgICAgICAgICAgICAgIDw8ICJDbGVhclVuaW9uVmFsdWVzOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXBfaW1wbCgpOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogdCA9ICgqbV9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgIHdoaWxlICh0LT5pc190eXBlZGVmKCkpIHsKKyAgICAgICAgdCA9ICgodF90eXBlZGVmKil0KS0+Z2V0X3R5cGUoKTsKKyAgICAgIH0KKworICAgICAgZ2VuZXJhdGVfZGVscGhpX2NsZWFyX3VuaW9uX3ZhbHVlKG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsc19ubSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICptX2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0c3RydWN0LT5pc191bmlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3hfZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb25fZmFjdG9yeV9uYW1lKTsKKyAgICB9CisgICAgaW5kZW50X2Rvd25faW1wbCgpOworICAgIGluZGVudF9pbXBsKG91dCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X3R5cGUqIHQgPSAoKm1faXRlciktPmdldF90eXBlKCk7CisgICAgd2hpbGUgKHQtPmlzX3R5cGVkZWYoKSkgeworICAgICAgdCA9ICgodF90eXBlZGVmKil0KS0+Z2V0X3R5cGUoKTsKKyAgICB9CisgICAgZ2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5X3JlYWRlcl9pbXBsKG91dCwgY2xzX3ByZWZpeCwgY2xzX25tLCB0LCAqbV9pdGVyLCAiRiIsIGlzX2V4Y2VwdGlvbik7CisgICAgZ2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5X3dyaXRlcl9pbXBsKG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xzX25tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbV9pdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHN0cnVjdC0+aXNfdW5pb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfeF9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb25fZmFjdG9yeV9uYW1lKTsKKyAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgZ2VuZXJhdGVfZGVscGhpX2lzc2V0X3JlYWRlcl9pbXBsKG91dCwgY2xzX3ByZWZpeCwgY2xzX25tLCB0LCAqbV9pdGVyLCAiRiIsIGlzX2V4Y2VwdGlvbik7CisgICAgfQorICB9CisKKyAgaWYgKCghaXNfZXhjZXB0aW9uKSB8fCBpc194X2ZhY3RvcnkpIHsKKyAgICBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3JlYWRlcl9pbXBsKG91dCwgY2xzX3ByZWZpeCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKKyAgICBpZiAoaXNfcmVzdWx0KSB7CisgICAgICBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3Jlc3VsdF93cml0ZXJfaW1wbChvdXQsIGNsc19wcmVmaXgsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7CisgICAgfSBlbHNlIHsKKyAgICAgIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3Rfd3JpdGVyX2ltcGwob3V0LCBjbHNfcHJlZml4LCB0c3RydWN0LCBpc19leGNlcHRpb24pOworICAgIH0KKyAgfQorICBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3Rvc3RyaW5nX2ltcGwob3V0LCBjbHNfcHJlZml4LCB0c3RydWN0LCBpc19leGNlcHRpb24sIGlzX3hfZmFjdG9yeSk7CisKKyAgaWYgKGlzX2V4Y2VwdGlvbiAmJiBpc194X2ZhY3RvcnkpIHsKKyAgICBnZW5lcmF0ZV9kZWxwaGlfY3JlYXRlX2V4Y2VwdGlvbl9pbXBsKG91dCwgY2xzX3ByZWZpeCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKKyAgfQorfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6cHJpbnRfZGVscGhpX3N0cnVjdF90eXBlX2ZhY3RvcnlfZnVuYyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyBzdHJ1Y3RfaW50Zl9uYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOworICBvdXQgPDwgIkNyZWF0ZV8iOworICBvdXQgPDwgc3RydWN0X2ludGZfbmFtZTsKKyAgb3V0IDw8ICJfSW1wbCI7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3R5cGVfZmFjdG9yeShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194X2ZhY3RvcnkpIHsKKyAgKHZvaWQpY2xzX3ByZWZpeDsKKyAgaWYgKGlzX2V4Y2VwdGlvbikKKyAgICByZXR1cm47CisgIGlmIChpc19yZXN1bHQpCisgICAgcmV0dXJuOworICBpZiAoaXNfeF9mYWN0b3J5KQorICAgIHJldHVybjsKKworICBzdHJpbmcgc3RydWN0X2ludGZfbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKKyAgc3RyaW5nIGNsc19ubSA9IHR5cGVfbmFtZSh0c3RydWN0LCB0cnVlLCBmYWxzZSk7CisKKyAgb3V0IDw8ICJmdW5jdGlvbiAiOworICBwcmludF9kZWxwaGlfc3RydWN0X3R5cGVfZmFjdG9yeV9mdW5jKG91dCwgdHN0cnVjdCk7CisgIG91dCA8PCAiOiAiOworICBvdXQgPDwgc3RydWN0X2ludGZfbmFtZTsKKyAgb3V0IDw8ICI7IiA8PCBlbmRsOworICBvdXQgPDwgImJlZ2luIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgIlJlc3VsdCA6PSAiIDw8IGNsc19ubSA8PCAiLkNyZWF0ZTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX3N0cnVjdF90eXBlX2ZhY3RvcnlfcmVnaXN0cmF0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeF9mYWN0b3J5KSB7CisgICh2b2lkKWNsc19wcmVmaXg7CisgIGlmIChpc19leGNlcHRpb24pCisgICAgcmV0dXJuOworICBpZiAoaXNfcmVzdWx0KQorICAgIHJldHVybjsKKyAgaWYgKGlzX3hfZmFjdG9yeSkKKyAgICByZXR1cm47CisKKyAgc3RyaW5nIHN0cnVjdF9pbnRmX25hbWUgPSB0eXBlX25hbWUodHN0cnVjdCk7CisKKyAgaW5kZW50KG91dCkgPDwgIiAgVHlwZVJlZ2lzdHJ5LlJlZ2lzdGVyVHlwZUZhY3Rvcnk8IiA8PCBzdHJ1Y3RfaW50Zl9uYW1lIDw8ICI+KCI7CisgIHByaW50X2RlbHBoaV9zdHJ1Y3RfdHlwZV9mYWN0b3J5X2Z1bmMob3V0LCB0c3RydWN0KTsKKyAgb3V0IDw8ICIpOyI7CisgIG91dCA8PCBlbmRsOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194X2ZhY3RvcnkpIHsKKyAgYm9vbCBpc19maW5hbCA9ICh0c3RydWN0LT5hbm5vdGF0aW9uc18uZmluZCgiZmluYWwiKSAhPSB0c3RydWN0LT5hbm5vdGF0aW9uc18uZW5kKCkpOworICBzdHJpbmcgc3RydWN0X2ludGZfbmFtZTsKKyAgc3RyaW5nIHN0cnVjdF9uYW1lOworICBzdHJpbmcgaXNzZXRfbmFtZTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBzdHJpbmcgZXhjZXB0aW9uX2ZhY3RvcnlfbmFtZSA9IG5vcm1hbGl6ZV9jbHNubSh0c3RydWN0LT5nZXRfbmFtZSgpLCAiIiwgdHJ1ZSkgKyAiRmFjdG9yeSI7CisKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIHN0cnVjdF9pbnRmX25hbWUgPSB0eXBlX25hbWUodHN0cnVjdCwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKKyAgfSBlbHNlIHsKKyAgICBzdHJ1Y3RfaW50Zl9uYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOworICB9CisKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIHN0cnVjdF9uYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QsIHRydWUsICghaXNfeF9mYWN0b3J5KSwgaXNfeF9mYWN0b3J5KTsKKyAgfSBlbHNlIHsKKyAgICBzdHJ1Y3RfbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0LCB0cnVlKTsKKyAgfQorCisgIGlmICgoIWlzX2V4Y2VwdGlvbikgfHwgaXNfeF9mYWN0b3J5KSB7CisKKyAgICBnZW5lcmF0ZV9kZWxwaGlfZG9jKG91dCwgdHN0cnVjdCk7CisgICAgaW5kZW50KG91dCkgPDwgc3RydWN0X2ludGZfbmFtZSA8PCAiID0gaW50ZXJmYWNlKElCYXNlKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGdlbmVyYXRlX2RlbHBoaV9wcm9wZXJ0eV9yZWFkZXJfZGVmaW5pdGlvbihvdXQsICptX2l0ZXIsIGlzX2V4Y2VwdGlvbik7CisgICAgICBnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHlfd3JpdGVyX2RlZmluaXRpb24ob3V0LCAqbV9pdGVyLCBpc19leGNlcHRpb24pOworICAgIH0KKworICAgIGlmIChpc194X2ZhY3RvcnkpIHsKKyAgICAgIG91dCA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIi8vIENyZWF0ZSBFeGNlcHRpb24gT2JqZWN0IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgImZ1bmN0aW9uIENyZWF0ZUV4Y2VwdGlvbjogIiA8PCB0eXBlX25hbWUodHN0cnVjdCwgdHJ1ZSwgdHJ1ZSkgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgICAgb3V0IDw8IGVuZGw7CisgICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICAgIGdlbmVyYXRlX3Byb3BlcnR5KG91dCwgKm1faXRlciwgdHJ1ZSwgaXNfZXhjZXB0aW9uKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgICAgICBnZW5lcmF0ZV9kZWxwaGlfaXNzZXRfcmVhZGVyX2RlZmluaXRpb24ob3V0LCAqbV9pdGVyLCBpc19leGNlcHRpb24pOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgICAgb3V0IDw8IGVuZGw7CisgICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICAgICAgaXNzZXRfbmFtZSA9ICJfX2lzc2V0XyIgKyBwcm9wX25hbWUoKm1faXRlciwgaXNfZXhjZXB0aW9uKTsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAicHJvcGVydHkgIiA8PCBpc3NldF9uYW1lIDw8ICI6IFN5c3RlbS5Cb29sZWFuIHJlYWQgR2V0IiA8PCBpc3NldF9uYW1lIDw8ICI7IgorICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICBnZW5lcmF0ZV9kZWxwaGlfZG9jKG91dCwgdHN0cnVjdCk7CisgIGluZGVudChvdXQpIDw8IHN0cnVjdF9uYW1lIDw8ICIgPSAiOworICBpZiAoaXNfZmluYWwpIHsKKyAgICBvdXQgPDwgInNlYWxlZCAiOworICB9CisgIG91dCA8PCAiY2xhc3MoIjsKKyAgaWYgKGlzX2V4Y2VwdGlvbiAmJiAoIWlzX3hfZmFjdG9yeSkpIHsKKyAgICBvdXQgPDwgIlRFeGNlcHRpb24iOworICB9IGVsc2UgeworICAgIG91dCA8PCAiVEludGVyZmFjZWRPYmplY3QsIElCYXNlLCAiIDw8IHN0cnVjdF9pbnRmX25hbWU7CisgIH0KKyAgb3V0IDw8ICIpIiA8PCBlbmRsOworCisgIGlmIChpc19leGNlcHRpb24gJiYgKCFpc194X2ZhY3RvcnkpKSB7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAidHlwZSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X2RlZmluaXRpb24ob3V0LCB0c3RydWN0LCBpc19leGNlcHRpb24sIGluX2NsYXNzLCBpc19yZXN1bHQsIHRydWUpOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJwcml2YXRlIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAoaXNfZXhjZXB0aW9uICYmICghaXNfeF9mYWN0b3J5KSkgeworICAgIGluZGVudChvdXQpIDw8ICJGIiA8PCBleGNlcHRpb25fZmFjdG9yeV9uYW1lIDw8ICIgOiIgPDwgc3RydWN0X2ludGZfbmFtZSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoKm1faXRlciwgZmFsc2UsICJGIiwgaXNfZXhjZXB0aW9uKSA8PCBlbmRsOworICB9CisKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgIGluZGVudChvdXQpIDw8IGVuZGw7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgICAgaXNzZXRfbmFtZSA9ICJGX19pc3NldF8iICsgcHJvcF9uYW1lKCptX2l0ZXIsIGlzX2V4Y2VwdGlvbik7CisgICAgICAgIGluZGVudChvdXQpIDw8IGlzc2V0X25hbWUgPDwgIjogU3lzdGVtLkJvb2xlYW47IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGluZGVudChvdXQpIDw8IGVuZGw7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGdlbmVyYXRlX2RlbHBoaV9wcm9wZXJ0eV9yZWFkZXJfZGVmaW5pdGlvbihvdXQsICptX2l0ZXIsIGlzX2V4Y2VwdGlvbik7CisgICAgZ2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5X3dyaXRlcl9kZWZpbml0aW9uKG91dCwgKm1faXRlciwgaXNfZXhjZXB0aW9uKTsKKyAgfQorCisgIGlmICh0c3RydWN0LT5pc191bmlvbigpKSB7CisgICAgb3V0IDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIi8vIENsZWFyIHZhbHVlcyhmb3IgdW5pb24ncyBwcm9wZXJ0eSBzZXR0ZXIpIiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJwcm9jZWR1cmUgQ2xlYXJVbmlvblZhbHVlczsiIDw8IGVuZGw7CisgIH0KKworICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgb3V0IDw8IGVuZGw7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgICAgaXNzZXRfbmFtZSA9ICJfX2lzc2V0XyIgKyBwcm9wX25hbWUoKm1faXRlciwgaXNfZXhjZXB0aW9uKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImZ1bmN0aW9uIEdldCIgPDwgaXNzZXRfbmFtZSA8PCAiOiBTeXN0ZW0uQm9vbGVhbjsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAoKG1lbWJlcnMuc2l6ZSgpID4gMCkgJiYgaXNfZXhjZXB0aW9uICYmICghaXNfeF9mYWN0b3J5KSkgeworICAgIGluZGVudChvdXQpIDw8ICJjb25zdHJ1Y3RvciBDcmVhdGU7IG92ZXJsb2FkOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiY29uc3RydWN0b3IgQ3JlYXRlKCIgPDwgY29uc3RydWN0b3JfYXJndW1lbnRfbGlzdCh0c3RydWN0LCBpbmRlbnQoKSkKKyAgICAgICAgICAgICAgICA8PCAiKTsgb3ZlcmxvYWQ7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJjb25zdHJ1Y3RvciBDcmVhdGU7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgImRlc3RydWN0b3IgRGVzdHJveTsgb3ZlcnJpZGU7IiA8PCBlbmRsOworCisgIG91dCA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiZnVuY3Rpb24gVG9TdHJpbmc6IHN0cmluZzsgb3ZlcnJpZGU7IiA8PCBlbmRsOworCisgIGlmIChpc19leGNlcHRpb24gJiYgKCFpc194X2ZhY3RvcnkpKSB7CisgICAgb3V0IDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIi8vIEV4Y2VwdGlvbiBGYWN0b3J5IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJmdW5jdGlvbiAiIDw8IGV4Y2VwdGlvbl9mYWN0b3J5X25hbWUgPDwgIjogIiA8PCBzdHJ1Y3RfaW50Zl9uYW1lIDw8ICI7IiA8PCBlbmRsOworICB9CisKKyAgaWYgKCghaXNfZXhjZXB0aW9uKSB8fCBpc194X2ZhY3RvcnkpIHsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiLy8gSUJhc2UiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInByb2NlZHVyZSBSZWFkKCBjb25zdCBpcHJvdDogSVByb3RvY29sKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInByb2NlZHVyZSBXcml0ZSggY29uc3Qgb3Byb3Q6IElQcm90b2NvbCk7IiA8PCBlbmRsOworICB9CisKKyAgaWYgKGlzX2V4Y2VwdGlvbiAmJiBpc194X2ZhY3RvcnkpIHsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiLy8gQ3JlYXRlIEV4Y2VwdGlvbiBPYmplY3QiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgImZ1bmN0aW9uIENyZWF0ZUV4Y2VwdGlvbjogIiA8PCB0eXBlX25hbWUodHN0cnVjdCwgdHJ1ZSwgdHJ1ZSkgPDwgIjsiIDw8IGVuZGw7CisgIH0KKworICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgb3V0IDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIi8vIFByb3BlcnRpZXMiIDw8IGVuZGw7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgZ2VuZXJhdGVfcHJvcGVydHkob3V0LCAqbV9pdGVyLCB0cnVlLCBpc19leGNlcHRpb24pOworICAgIH0KKyAgfQorCisgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiLy8gaXNzZXQiIDw8IGVuZGw7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgICAgaXNzZXRfbmFtZSA9ICJfX2lzc2V0XyIgKyBwcm9wX25hbWUoKm1faXRlciwgaXNfZXhjZXB0aW9uKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInByb3BlcnR5ICIgPDwgaXNzZXRfbmFtZSA8PCAiOiBTeXN0ZW0uQm9vbGVhbiByZWFkIEdldCIgPDwgaXNzZXRfbmFtZSA8PCAiOyIKKyAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIGluZGVudF91cCgpOworICBnZW5lcmF0ZV9kZWxwaGlfZG9jKHNfc2VydmljZSwgdHNlcnZpY2UpOworICBpbmRlbnQoc19zZXJ2aWNlKSA8PCBub3JtYWxpemVfY2xzbm0oc2VydmljZV9uYW1lXywgIlQiKSA8PCAiID0gY2xhc3MiIDw8IGVuZGw7CisgIGluZGVudChzX3NlcnZpY2UpIDw8ICJwdWJsaWMiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAidHlwZSIgPDwgZW5kbDsKKyAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KHNfc2VydmljZSkgPDwgImVuZDsiIDw8IGVuZGw7CisgIGluZGVudChzX3NlcnZpY2UpIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlLGZhbHNlKTsKKyAgaWYoYXN5bmNfKSB7CisgICAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UsdHJ1ZSk7CisgIH0KK30KKworCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSwgYm9vbCBmb3JfYXN5bmMpIHsKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfaWZhY2UgPSAiIjsKKyAgc3RyaW5nIGlmYWNlX25hbWUgPSBmb3JfYXN5bmMgPyAiSUFzeW5jIiA6ICJJZmFjZSI7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgZ2VuZXJhdGVfZGVscGhpX2RvYyhzX3NlcnZpY2UsIHRzZXJ2aWNlKTsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLCB0cnVlLCB0cnVlKTsKKyAgICBleHRlbmRzX2lmYWNlID0gZXh0ZW5kcyArICIuIiArIGlmYWNlX25hbWU7CisgICAgZ2VuZXJhdGVfZGVscGhpX2RvYyhzX3NlcnZpY2UsIHRzZXJ2aWNlKTsKKyAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCBpZmFjZV9uYW1lIDw8ICIgPSBpbnRlcmZhY2UoIiA8PCBleHRlbmRzX2lmYWNlIDw8ICIpIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChzX3NlcnZpY2UpIDw8IGlmYWNlX25hbWUgPDwgIiA9IGludGVyZmFjZSIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF91cCgpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9kZWxwaGlfZG9jKHNfc2VydmljZSwgKmZfaXRlcik7CisgICAgaW5kZW50KHNfc2VydmljZSkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsIGZvcl9hc3luYykgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X2RlZmluaXRpb24oc19zZXJ2aWNlLCB0cywgZmFsc2UsIHRydWUpOworICAgIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfaW1wbChzX3NlcnZpY2VfaW1wbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplX2Nsc25tKHNlcnZpY2VfbmFtZV8sICJUIikgKyAiLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKKyAgfQorfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBpbmRlbnRfdXAoKTsKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIlRJbnRlcmZhY2VkT2JqZWN0IjsKKyAgc3RyaW5nIGltcGxlbWVudHMgPSBhc3luY18gPyAiSWZhY2UsIElBc3luYyIgOiAiSWZhY2UiOworCisgIGdlbmVyYXRlX2RlbHBoaV9kb2Moc19zZXJ2aWNlLCB0c2VydmljZSk7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSwgdHJ1ZSwgdHJ1ZSk7CisgICAgZXh0ZW5kc19jbGllbnQgPSBleHRlbmRzICsgIi5UQ2xpZW50IjsKKyAgfQorICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiVENsaWVudCA9IGNsYXNzKCAiIDw8IGV4dGVuZHNfY2xpZW50IDw8ICIsICIgPDwgaW1wbGVtZW50cyA8PCAiKSIgPDwgZW5kbDsKKworICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAicHVibGljIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiY29uc3RydWN0b3IgQ3JlYXRlKCBwcm90OiBJUHJvdG9jb2wpOyBvdmVybG9hZDsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJjb25zdHJ1Y3RvciAiIDw8IG5vcm1hbGl6ZV9jbHNubShzZXJ2aWNlX25hbWVfLCAiVCIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLlRDbGllbnQuQ3JlYXRlKCBwcm90OiBJUHJvdG9jb2wpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJDcmVhdGUoIHByb3QsIHByb3QgKTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KHNfc2VydmljZSkKKyAgICAgIDw8ICJjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IGlwcm90OiBJUHJvdG9jb2w7IGNvbnN0IG9wcm90OiBJUHJvdG9jb2wpOyBvdmVybG9hZDsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJjb25zdHJ1Y3RvciAiIDw8IG5vcm1hbGl6ZV9jbHNubShzZXJ2aWNlX25hbWVfLCAiVCIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLlRDbGllbnQuQ3JlYXRlKCBjb25zdCBpcHJvdDogSVByb3RvY29sOyBjb25zdCBvcHJvdDogSVByb3RvY29sKTsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImluaGVyaXRlZCBDcmVhdGU7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlwcm90XyA6PSBpcHJvdDsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAib3Byb3RfIDo9IG9wcm90OyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworCisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAicHJvdGVjdGVkIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJpcHJvdF86IElQcm90b2NvbDsiIDw8IGVuZGw7CisgICAgaW5kZW50KHNfc2VydmljZSkgPDwgIm9wcm90XzogSVByb3RvY29sOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAic2VxaWRfOiBTeXN0ZW0uSW50ZWdlcjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJwdWJsaWMiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KHNfc2VydmljZSkgPDwgInByb3BlcnR5IElucHV0UHJvdG9jb2w6IElQcm90b2NvbCByZWFkIGlwcm90XzsiIDw8IGVuZGw7CisgICAgaW5kZW50KHNfc2VydmljZSkgPDwgInByb3BlcnR5IE91dHB1dFByb3RvY29sOiBJUHJvdG9jb2wgcmVhZCBvcHJvdF87IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAicHJvdGVjdGVkIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiLy8gSWZhY2UiIDw8IGVuZGw7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgZ2VuZXJhdGVfZGVscGhpX2RvYyhzX3NlcnZpY2UsICpmX2l0ZXIpOworICAgIGluZGVudChzX3NlcnZpY2UpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCBmYWxzZSkgPDwgZW5kbDsKKyAgfQorCisgIGlmKCBhc3luY18pIHsKKyAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCBlbmRsOworICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICIvLyBJQXN5bmMiIDw8IGVuZGw7CisgICAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgZ2VuZXJhdGVfZGVscGhpX2RvYyhzX3NlcnZpY2UsICpmX2l0ZXIpOworICAgICAgaW5kZW50KHNfc2VydmljZSkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsIHRydWUpIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAicHVibGljIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBzdHJpbmcgZnVsbF9jbHMgPSBub3JtYWxpemVfY2xzbm0oc2VydmljZV9uYW1lXywgIlQiKSArICIuVENsaWVudCI7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisKKyAgICAvLyBvbmUgZm9yIHN5bmMgb25seSwgdHdvIGZvciBhc3luYytzeW5jCisgICAgaW50IG1vZGUgPSBhc3luY18gPyAxIDogMDsKKyAgICB3aGlsZSggbW9kZSA+PSAwKSB7CisgICAgICBib29sIGZvcl9hc3luYyA9IChtb2RlICE9IDApOworICAgICAgbW9kZS0tOworCisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsIGZvcl9hc3luYywgZnVsbF9jbHMpIDw8IGVuZGw7CisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwX2ltcGwoKTsKKworICAgICAgdF90eXBlKiB0dHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKTsKKyAgICAgIGlmKCBmb3JfYXN5bmMpIHsKKyAgICAgICAgaWYgKGlzX3ZvaWQodHR5cGUpKSB7CisgICAgICAgICAgIC8vIERlbHBoaSBmb3JjZXMgdXMgdG8gc3BlY2lmeSBhIHR5cGUgd2l0aCBJRnV0dXJlPFQ+LCBzbyB3ZSB1c2UgSW50ZWdlcj0wIGZvciB2b2lkIG1ldGhvZHMKKyAgICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInJlc3VsdCA6PSBUVGFzay5GdXR1cmU8U3lzdGVtLkludGVnZXI+KGZ1bmN0aW9uOiBTeXN0ZW0uSW50ZWdlciIgPDwgZW5kbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzdHJpbmcgcmV0dHlwZSA9IHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUsIGZhbHNlLCB0cnVlKTsKKyAgICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInJlc3VsdCA6PSBUVGFzay5GdXR1cmU8IiA8PCByZXR0eXBlIDw8ICI+KGZ1bmN0aW9uOiAiIDw8IHJldHR5cGUgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXBfaW1wbCgpOworICAgICAgfQorCisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIjsKKworICAgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHNfc2VydmljZV9pbXBsIDw8ICIsICI7CisgICAgICAgIH0KKyAgICAgICAgc19zZXJ2aWNlX2ltcGwgPDwgbm9ybWFsaXplX25hbWUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpOworICAgICAgfQorICAgICAgc19zZXJ2aWNlX2ltcGwgPDwgIik7IiA8PCBlbmRsOworCisgICAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgc19zZXJ2aWNlX2ltcGwgPDwgaW5kZW50X2ltcGwoKTsKKyAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICAgIHNfc2VydmljZV9pbXBsIDw8ICJSZXN1bHQgOj0gIjsKKyAgICAgICAgfQorICAgICAgICBzX3NlcnZpY2VfaW1wbCA8PCAicmVjdl8iIDw8IGZ1bm5hbWUgPDwgIigpOyIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgaWYoIGZvcl9hc3luYykgeworICAgICAgICBpZiAoaXNfdm9pZCh0dHlwZSkpIHsKKyAgICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIlJlc3VsdCA6PSAwOyIgPDwgZW5kbDsgIC8vIG5vIElGdXR1cmU8dm9pZD4gaW4gRGVscGhpCisgICAgICAgIH0KKyAgICAgICAgaW5kZW50X2Rvd25faW1wbCgpOworICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZCk7IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisKKyAgICB0X2Z1bmN0aW9uIHNlbmRfZnVuY3Rpb24oZ190eXBlX3ZvaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygic2VuZF8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpKTsKKworICAgIHN0cmluZyBhcmdzbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfYXJncyI7CisgICAgc3RyaW5nIGFyZ3NfY2xzbm0gPSBub3JtYWxpemVfY2xzbm0oYXJnc25hbWUsICJUIik7CisgICAgc3RyaW5nIGFyZ3NfaW50Zm5tID0gbm9ybWFsaXplX2Nsc25tKGFyZ3NuYW1lLCAiSSIpOworCisgICAgc3RyaW5nIGFyZ3N2YXIgPSB0bXAoIl9hcmdzIik7CisgICAgc3RyaW5nIG1zZ3ZhciA9IHRtcCgiX21zZyIpOworCisgICAgaW5kZW50KHNfc2VydmljZSkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZzZW5kX2Z1bmN0aW9uLCBmYWxzZSkgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZzZW5kX2Z1bmN0aW9uLCBmYWxzZSwgZnVsbF9jbHMpIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJ2YXIiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgYXJnc3ZhciA8PCAiIDogIiA8PCBhcmdzX2ludGZubSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgbXNndmFyIDw8ICIgOiBUaHJpZnQuUHJvdG9jb2wuVFRocmlmdE1lc3NhZ2U7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOworICAgIGluZGVudF91cF9pbXBsKCk7CisKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInNlcWlkXyA6PSBzZXFpZF8gKyAxOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIlRocmlmdC5Qcm90b2NvbC5Jbml0KCAiIDw8IG1zZ3ZhciA8PCAiLCAnIiA8PCBmdW5uYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICInLCAiIDw8ICgoKmZfaXRlciktPmlzX29uZXdheSgpID8gIlRNZXNzYWdlVHlwZS5PbmV3YXkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIlRNZXNzYWdlVHlwZS5DYWxsIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgc2VxaWRfKTsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9wcm90Xy5Xcml0ZU1lc3NhZ2VCZWdpbiggIiA8PCBtc2d2YXIgPDwgIiApOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgYXJnc3ZhciA8PCAiIDo9ICIgPDwgYXJnc19jbHNubSA8PCAiSW1wbC5DcmVhdGUoKTsiIDw8IGVuZGw7CisKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IGFyZ3N2YXIgPDwgIi4iIDw8IHByb3BfbmFtZSgqZmxkX2l0ZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiA6PSAiIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgYXJnc3ZhciA8PCAiLldyaXRlKG9wcm90Xyk7IiA8PCBlbmRsOworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgYXJnc3ZhciA8PCAiLiIgPDwgcHJvcF9uYW1lKCpmbGRfaXRlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIDo9ICIgPDwgZW1wdHlfdmFsdWUoKCpmbGRfaXRlciktPmdldF90eXBlKCkpIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAib3Byb3RfLldyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9wcm90Xy5UcmFuc3BvcnQuRmx1c2goKTsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIHN0cmluZyBvcmdfcmVzdWx0bmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKKyAgICAgIHN0cmluZyByZXN1bHRfY2xzbm0gPSBub3JtYWxpemVfY2xzbm0ob3JnX3Jlc3VsdG5hbWUsICJUIik7CisgICAgICBzdHJpbmcgcmVzdWx0X2ludGZubSA9IG5vcm1hbGl6ZV9jbHNubShvcmdfcmVzdWx0bmFtZSwgIkkiKTsKKworICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKKyAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCkpOworCisgICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisKKyAgICAgIHN0cmluZyBleGNlcHR2YXIgPSB0bXAoIl9leCIpOworICAgICAgc3RyaW5nIGFwcGV4dmFyID0gdG1wKCJfYXgiKTsKKyAgICAgIHN0cmluZyByZXR2YXIgPSB0bXAoIl9yZXQiKTsKKworICAgICAgaW5kZW50KHNfc2VydmljZSkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uLCBmYWxzZSkgPDwgZW5kbDsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24sIGZhbHNlLCBmdWxsX2NscykgPDwgZW5kbDsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAidmFyIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCBtc2d2YXIgPDwgIiA6IFRocmlmdC5Qcm90b2NvbC5UVGhyaWZ0TWVzc2FnZTsiIDw8IGVuZGw7CisgICAgICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKKyAgICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IGV4Y2VwdHZhciA8PCAiIDogRXhjZXB0aW9uOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCBhcHBleHZhciA8PCAiIDogVEFwcGxpY2F0aW9uRXhjZXB0aW9uOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCByZXR2YXIgPDwgIiA6ICIgPDwgcmVzdWx0X2ludGZubSA8PCAiOyIgPDwgZW5kbDsKKworICAgICAgaW5kZW50X2Rvd25faW1wbCgpOworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cF9pbXBsKCk7CisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgbXNndmFyIDw8ICIgOj0gaXByb3RfLlJlYWRNZXNzYWdlQmVnaW4oKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlmICgiIDw8IG1zZ3ZhciA8PCAiLlR5cGVfID0gVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbikgdGhlbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cF9pbXBsKCk7CisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgYXBwZXh2YXIgPDwgIiA6PSBUQXBwbGljYXRpb25FeGNlcHRpb24uUmVhZChpcHJvdF8pOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaXByb3RfLlJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJyYWlzZSAiIDw8IGFwcGV4dmFyIDw8ICI7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd25faW1wbCgpOworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsOworCisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgcmV0dmFyIDw8ICIgOj0gIiA8PCByZXN1bHRfY2xzbm0gPDwgIkltcGwuQ3JlYXRlKCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IHJldHZhciA8PCAiLlJlYWQoaXByb3RfKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlwcm90Xy5SZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKworICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlmICgiIDw8IHJldHZhciA8PCAiLl9faXNzZXRfc3VjY2VzcykgdGhlbiIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJSZXN1bHQgOj0gIiA8PCByZXR2YXIgPDwgIi5TdWNjZXNzOyIgPDwgZW5kbDsKKyAgICAgICAgdF90eXBlKiB0eXBlID0gKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpOworICAgICAgICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSB8fCB0eXBlLT5pc19tYXAoKSB8fCB0eXBlLT5pc19saXN0KCkKKyAgICAgICAgICAgIHx8IHR5cGUtPmlzX3NldCgpKSB7CisgICAgICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IHJldHZhciA8PCAiLlN1Y2Nlc3MgOj0gbmlsOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIkV4aXQ7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpZiAoIiA8PCByZXR2YXIgPDwgIi5fX2lzc2V0XyIgPDwgcHJvcF9uYW1lKCp4X2l0ZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKSB0aGVuIiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXBfaW1wbCgpOworICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgZXhjZXB0dmFyIDw8ICIgOj0gIiA8PCByZXR2YXIgPDwgIi4iIDw8IHByb3BfbmFtZSgqeF9pdGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIi5DcmVhdGVFeGNlcHRpb247IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInJhaXNlICIgPDwgZXhjZXB0dmFyIDw8ICI7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkKKyAgICAgICAgICAgIDw8ICJyYWlzZSBUQXBwbGljYXRpb25FeGNlcHRpb25NaXNzaW5nUmVzdWx0LkNyZWF0ZSgnIgorICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdCcpOyIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgaW5kZW50X2Rvd25faW1wbCgpOworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KHNfc2VydmljZSkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfcHJvY2Vzc29yID0gIiI7CisKKyAgc3RyaW5nIGZ1bGxfY2xzID0gbm9ybWFsaXplX2Nsc25tKHNlcnZpY2VfbmFtZV8sICJUIikgKyAiLlRQcm9jZXNzb3JJbXBsIjsKKworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCksIHRydWUsIHRydWUpOworICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gZXh0ZW5kcyArICIuVFByb2Nlc3NvckltcGwiOworICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJUUHJvY2Vzc29ySW1wbCA9IGNsYXNzKCIgPDwgZXh0ZW5kc19wcm9jZXNzb3IgPDwgIiwgSVByb2Nlc3NvcikiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KHNfc2VydmljZSkgPDwgIlRQcm9jZXNzb3JJbXBsID0gY2xhc3MoIFRJbnRlcmZhY2VkT2JqZWN0LCBJUHJvY2Vzc29yKSIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChzX3NlcnZpY2UpIDw8ICJwdWJsaWMiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiY29uc3RydWN0b3IgQ3JlYXRlKCBpZmFjZV86IElmYWNlICk7IiA8PCBlbmRsOworICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiZGVzdHJ1Y3RvciBEZXN0cm95OyBvdmVycmlkZTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJjb25zdHJ1Y3RvciAiIDw8IGZ1bGxfY2xzIDw8ICIuQ3JlYXRlKCBpZmFjZV86IElmYWNlICk7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaW5oZXJpdGVkIENyZWF0ZSggaWZhY2VfKTsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpbmhlcml0ZWQgQ3JlYXRlOyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIlNlbGYuaWZhY2VfIDo9IGlmYWNlXzsiIDw8IGVuZGw7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJBU1NFUlQoIHByb2Nlc3NNYXBfIDw+IG5pbCk7ICAvLyBpbmhlcml0ZWQiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpCisgICAgICAgIDw8ICJwcm9jZXNzTWFwXyA6PSBUVGhyaWZ0RGljdGlvbmFyeUltcGw8c3RyaW5nLCBUUHJvY2Vzc0Z1bmN0aW9uPi5DcmVhdGU7IiA8PCBlbmRsOworICB9CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInByb2Nlc3NNYXBfLkFkZE9yU2V0VmFsdWUoICciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJywgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIl9Qcm9jZXNzKTsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImRlc3RydWN0b3IgIiA8PCBmdWxsX2NscyA8PCAiLkRlc3Ryb3k7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImluaGVyaXRlZDsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KHNfc2VydmljZSkgPDwgInByaXZhdGUiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiaWZhY2VfOiBJZmFjZTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpID09IE5VTEwpIHsKKyAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAicHJvdGVjdGVkIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJ0eXBlIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJUUHJvY2Vzc0Z1bmN0aW9uID0gcmVmZXJlbmNlIHRvIHByb2NlZHVyZSggc2VxaWQ6IFN5c3RlbS5JbnRlZ2VyOyBjb25zdCBpcHJvdDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICJJUHJvdG9jb2w7IGNvbnN0IG9wcm90OiBJUHJvdG9jb2wiCisgICAgICAgICAgICAgICAgICAgICAgPDwgKGV2ZW50c18gPyAiOyBjb25zdCBldmVudHMgOiBJUmVxdWVzdEV2ZW50cyIgOiAiIikgPDwgIik7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAicHJvdGVjdGVkIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJwcm9jZXNzTWFwXzogSVRocmlmdERpY3Rpb25hcnk8c3RyaW5nLCBUUHJvY2Vzc0Z1bmN0aW9uPjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIGluZGVudChzX3NlcnZpY2UpIDw8ICJwdWJsaWMiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgaW5kZW50KHNfc2VydmljZSkgPDwgImZ1bmN0aW9uIFByb2Nlc3MoIGNvbnN0IGlwcm90OiBJUHJvdG9jb2w7IGNvbnN0IG9wcm90OiBJUHJvdG9jb2w7IGNvbnN0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZXZlbnRzIDogSVByb2Nlc3NvckV2ZW50cyk6IFN5c3RlbS5Cb29sZWFuOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiZnVuY3Rpb24gUHJvY2VzcyggY29uc3QgaXByb3Q6IElQcm90b2NvbDsgY29uc3Qgb3Byb3Q6IElQcm90b2NvbDsgY29uc3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJldmVudHMgOiBJUHJvY2Vzc29yRXZlbnRzKTogU3lzdGVtLkJvb2xlYW47IHJlaW50cm9kdWNlOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZnVuY3Rpb24gIiA8PCBmdWxsX2NscyA8PCAiLlByb2Nlc3MoIGNvbnN0IGlwcm90OiBJUHJvdG9jb2w7ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb25zdCBvcHJvdDogSVByb3RvY29sOyBjb25zdCBldmVudHMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjogSVByb2Nlc3NvckV2ZW50cyk6IFN5c3RlbS5Cb29sZWFuOyIgPDwgZW5kbDsKKyAgOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInZhciIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJtc2cgOiBUaHJpZnQuUHJvdG9jb2wuVFRocmlmdE1lc3NhZ2U7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImZuIDogVFByb2Nlc3NGdW5jdGlvbjsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAieCA6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjsiIDw8IGVuZGw7CisgIGlmIChldmVudHNfKSB7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJjb250ZXh0IDogSVJlcXVlc3RFdmVudHM7IiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJ0cnkiIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAibXNnIDo9IGlwcm90LlJlYWRNZXNzYWdlQmVnaW4oKTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZm4gOj0gbmlsOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpZiBub3QgcHJvY2Vzc01hcF8uVHJ5R2V0VmFsdWUobXNnLk5hbWUsIGZuKSIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvciBub3QgQXNzaWduZWQoZm4pIHRoZW4iIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiVFByb3RvY29sVXRpbC5Ta2lwKGlwcm90LCBUVHlwZS5TdHJ1Y3QpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpcHJvdC5SZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJ4IDo9ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUQXBwbGljYXRpb25FeGNlcHRpb25Vbmtub3duTWV0aG9kLkNyZWF0ZSgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJ0ludmFsaWQgbWV0aG9kIG5hbWU6ICcnJyArIG1zZy5OYW1lICsgJycnJyk7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkKKyAgICAgIDw8ICJUaHJpZnQuUHJvdG9jb2wuSW5pdCggbXNnLCBtc2cuTmFtZSwgVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbiwgbXNnLlNlcUlEKTsiCisgICAgICA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9wcm90LldyaXRlTWVzc2FnZUJlZ2luKCBtc2cpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJ4LldyaXRlKG9wcm90KTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAib3Byb3QuV3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9wcm90LlRyYW5zcG9ydC5GbHVzaCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJSZXN1bHQgOj0gVHJ1ZTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiRXhpdDsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsOworICBpZiAoZXZlbnRzXykgeworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaWYgZXZlbnRzIDw+IG5pbCIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInRoZW4gY29udGV4dCA6PSBldmVudHMuQ3JlYXRlUmVxdWVzdENvbnRleHQobXNnLk5hbWUpIiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZWxzZSBjb250ZXh0IDo9IG5pbDsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJ0cnkiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImZuKG1zZy5TZXFJRCwgaXByb3QsIG9wcm90LCBjb250ZXh0KTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd25faW1wbCgpOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZmluYWxseSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXBfaW1wbCgpOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaWYgY29udGV4dCA8PiBuaWwgdGhlbiBiZWdpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXBfaW1wbCgpOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiY29udGV4dC5DbGVhbnVwQ29udGV4dDsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJjb250ZXh0IDo9IG5pbDsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd25faW1wbCgpOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZm4obXNnLlNlcUlELCBpcHJvdCwgb3Byb3QpOyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZXhjZXB0IiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9uIFRUcmFuc3BvcnRFeGNlcHRpb25UaW1lZE91dCBkbyBiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJSZXN1bHQgOj0gVHJ1ZTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiRXhpdDsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVsc2UgYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiUmVzdWx0IDo9IEZhbHNlOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJFeGl0OyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIlJlc3VsdCA6PSBUcnVlOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KHNfc2VydmljZSkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOworICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAiU3VjY2VzcyIsIDApOworICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7CisgIH0KKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOworICB9CisKKyAgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9kZWZpbml0aW9uKHNfc2VydmljZSwgJnJlc3VsdCwgZmFsc2UsIHRydWUsIHRydWUpOworICBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X2ltcGwoc19zZXJ2aWNlX2ltcGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVfY2xzbm0oc2VydmljZV9uYW1lXywgIlQiKSArICIuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICAodm9pZCl0c2VydmljZTsKKyAgc3RyaW5nIGZ1bmNuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpOworICBzdHJpbmcgZnVsbF9jbHMgPSBub3JtYWxpemVfY2xzbm0oc2VydmljZV9uYW1lXywgIlQiKSArICIuVFByb2Nlc3NvckltcGwiOworCisgIHN0cmluZyBvcmdfYXJnc25hbWUgPSBmdW5jbmFtZSArICJfYXJncyI7CisgIHN0cmluZyBhcmdzX2Nsc25tID0gbm9ybWFsaXplX2Nsc25tKG9yZ19hcmdzbmFtZSwgIlQiKTsKKyAgc3RyaW5nIGFyZ3NfaW50Zm5tID0gbm9ybWFsaXplX2Nsc25tKG9yZ19hcmdzbmFtZSwgIkkiKTsKKworICBzdHJpbmcgb3JnX3Jlc3VsdG5hbWUgPSBmdW5jbmFtZSArICJfcmVzdWx0IjsKKyAgc3RyaW5nIHJlc3VsdF9jbHNubSA9IG5vcm1hbGl6ZV9jbHNubShvcmdfcmVzdWx0bmFtZSwgIlQiKTsKKyAgc3RyaW5nIHJlc3VsdF9pbnRmbm0gPSBub3JtYWxpemVfY2xzbm0ob3JnX3Jlc3VsdG5hbWUsICJJIik7CisKKyAgaW5kZW50KHNfc2VydmljZSkgPDwgInByb2NlZHVyZSAiIDw8IGZ1bmNuYW1lCisgICAgICAgICAgICAgICAgICAgIDw8ICJfUHJvY2Vzcyggc2VxaWQ6IFN5c3RlbS5JbnRlZ2VyOyBjb25zdCBpcHJvdDogSVByb3RvY29sOyBjb25zdCBvcHJvdDogSVByb3RvY29sIgorICAgICAgICAgICAgICAgICAgICA8PCAoZXZlbnRzXyA/ICI7IGNvbnN0IGV2ZW50cyA6IElSZXF1ZXN0RXZlbnRzIiA6ICIiKSA8PCAiKTsiIDw8IGVuZGw7CisKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIi8vIG9uZSB3YXkgcHJvY2Vzc29yIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiLy8gYm90aCB3YXkgcHJvY2Vzc29yIiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpCisgICAgICA8PCAicHJvY2VkdXJlICIgPDwgZnVsbF9jbHMgPDwgIi4iIDw8IGZ1bmNuYW1lCisgICAgICA8PCAiX1Byb2Nlc3MoIHNlcWlkOiBTeXN0ZW0uSW50ZWdlcjsgY29uc3QgaXByb3Q6IElQcm90b2NvbDsgY29uc3Qgb3Byb3Q6IElQcm90b2NvbCIKKyAgICAgIDw8IChldmVudHNfID8gIjsgY29uc3QgZXZlbnRzIDogSVJlcXVlc3RFdmVudHMiIDogIiIpIDw8ICIpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJ2YXIiIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYXJnczogIiA8PCBhcmdzX2ludGZubSA8PCAiOyIgPDwgZW5kbDsKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJtc2c6IFRocmlmdC5Qcm90b2NvbC5UVGhyaWZ0TWVzc2FnZTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJyZXQ6ICIgPDwgcmVzdWx0X2ludGZubSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImFwcHggOiBUQXBwbGljYXRpb25FeGNlcHRpb247IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworCisgIGlmIChldmVudHNfKSB7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpZiBldmVudHMgPD4gbmlsIHRoZW4gZXZlbnRzLlByZVJlYWQ7IiA8PCBlbmRsOworICB9CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYXJncyA6PSAiIDw8IGFyZ3NfY2xzbm0gPDwgIkltcGwuQ3JlYXRlOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJhcmdzLlJlYWQoaXByb3QpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpcHJvdC5SZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKyAgaWYgKGV2ZW50c18pIHsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlmIGV2ZW50cyA8PiBuaWwgdGhlbiBldmVudHMuUG9zdFJlYWQ7IiA8PCBlbmRsOworICB9CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInJldCA6PSAiIDw8IHJlc3VsdF9jbHNubSA8PCAiSW1wbC5DcmVhdGU7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJ0cnkiIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisKKyAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIHNfc2VydmljZV9pbXBsIDw8IGluZGVudF9pbXBsKCk7CisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICBzX3NlcnZpY2VfaW1wbCA8PCAicmV0LlN1Y2Nlc3MgOj0gIjsKKyAgfQorICBzX3NlcnZpY2VfaW1wbCA8PCAiaWZhY2VfLiIgPDwgbm9ybWFsaXplX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpLCB0cnVlKSA8PCAiKCI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgc19zZXJ2aWNlX2ltcGwgPDwgIiwgIjsKKyAgICB9CisgICAgc19zZXJ2aWNlX2ltcGwgPDwgImFyZ3MuIiA8PCBwcm9wX25hbWUoKmZfaXRlcik7CisgIH0KKyAgc19zZXJ2aWNlX2ltcGwgPDwgIik7IiA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJhcmdzLiIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgOj0gIiA8PCBlbXB0eV92YWx1ZSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICI7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImV4Y2VwdCIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKworICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAib24gRTogIiA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLCB0cnVlLCB0cnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGRvIGJlZ2luIiA8PCBlbmRsOworICAgIGluZGVudF91cF9pbXBsKCk7CisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICBzdHJpbmcgZmFjdG9yeV9uYW1lID0gbm9ybWFsaXplX2Nsc25tKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSwgIiIsIHRydWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiRmFjdG9yeSI7CisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInJldC4iIDw8IHByb3BfbmFtZSgqeF9pdGVyKSA8PCAiIDo9IEUuIiA8PCBmYWN0b3J5X25hbWUgPDwgIjsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd25faW1wbCgpOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAib24gRTogRXhjZXB0aW9uIGRvIGJlZ2luIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpZihldmVudHNfKSB7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpZiBldmVudHMgPD4gbmlsIHRoZW4gZXZlbnRzLlVuaGFuZGxlZEVycm9yKEUpOyIgPDwgZW5kbDsKKyAgfQorICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImFwcHggOj0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uSW50ZXJuYWxFcnJvci5DcmVhdGUoRS5NZXNzYWdlKTsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJ0cnkiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICBpZihldmVudHNfKSB7CisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlmIGV2ZW50cyA8PiBuaWwgdGhlbiBldmVudHMuUHJlV3JpdGU7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIlRocmlmdC5Qcm90b2NvbC5Jbml0KCBtc2csICciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiJywgVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbiwgc2VxaWQpOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9wcm90LldyaXRlTWVzc2FnZUJlZ2luKCBtc2cpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImFwcHguV3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9wcm90LldyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9wcm90LlRyYW5zcG9ydC5GbHVzaCgpOyIgPDwgZW5kbDsKKyAgICBpZihldmVudHNfKSB7CisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlmIGV2ZW50cyA8PiBuaWwgdGhlbiBldmVudHMuUG9zdFdyaXRlOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJFeGl0OyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJmaW5hbGx5IiA8PCBlbmRsOworICAgIGluZGVudF91cF9pbXBsKCk7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJhcHB4LkZyZWU7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGw7CisKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgaWYgKGV2ZW50c18pIHsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaWYgZXZlbnRzIDw+IG5pbCB0aGVuIGV2ZW50cy5QcmVXcml0ZTsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiVGhyaWZ0LlByb3RvY29sLkluaXQoIG1zZywgJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICInLCBUTWVzc2FnZVR5cGUuUmVwbHksIHNlcWlkKTsgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAib3Byb3QuV3JpdGVNZXNzYWdlQmVnaW4oIG1zZyk7ICIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInJldC5Xcml0ZShvcHJvdCk7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAib3Byb3QuV3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAib3Byb3QuVHJhbnNwb3J0LkZsdXNoKCk7IiA8PCBlbmRsOworICAgIGlmIChldmVudHNfKSB7CisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlmIGV2ZW50cyA8PiBuaWwgdGhlbiBldmVudHMuUG9zdFdyaXRlOyIgPDwgZW5kbDsKKyAgICB9CisgIH0gZWxzZSBpZiAoZXZlbnRzXykgeworICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaWYgZXZlbnRzIDw+IG5pbCB0aGVuIGV2ZW50cy5PbmV3YXlDb21wbGV0ZTsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3N0cmVhbSYgbG9jYWxfdmFycykgeworICB0X3R5cGUqIHR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7CisgIHdoaWxlICh0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICB0eXBlID0gKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpOworICB9CisKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICB9CisKKyAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyBwcm9wX25hbWUodGZpZWxkLCBpc194Y2VwdGlvbik7CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUsICIiKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIGlzX3hjZXB0aW9uLCB0eXBlLCBuYW1lLCBsb2NhbF92YXJzKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8IG5hbWUgPDwgIiA6PSAiOworCisgICAgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSkgPDwgIigiOworICAgIH0KKworICAgIG91dCA8PCAiaXByb3QuIjsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICAgIGlmIChhbnNpc3RyX2JpbmFyeV8pIHsKKyAgICAgICAgICAgIG91dCA8PCAiUmVhZEFuc2lTdHJpbmcoKTsiOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvdXQgPDwgIlJlYWRCaW5hcnkoKTsiOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgIlJlYWRTdHJpbmcoKTsiOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgIlJlYWRCb29sKCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgIlJlYWRCeXRlKCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJSZWFkSTE2KCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJSZWFkSTMyKCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJSZWFkSTY0KCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJSZWFkRG91YmxlKCk7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIERlbHBoaSBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCAiUmVhZEkzMigpIjsKKyAgICAgIG91dCA8PCAiKTsiOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKKyAgfQorfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyB0eXBfbmFtZTsKKworICBpZiAodHN0cnVjdC0+aXNfeGNlcHRpb24oKSkgeworICAgIHR5cF9uYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QsIHRydWUsIGZhbHNlLCB0cnVlLCB0cnVlKTsKKyAgfSBlbHNlIHsKKyAgICB0eXBfbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0LCB0cnVlLCBmYWxzZSk7CisgIH0KKworICBpbmRlbnRfaW1wbChvdXQpIDw8IHByZWZpeCA8PCBuYW1lIDw8ICIgOj0gIiA8PCB0eXBfbmFtZSA8PCAiLkNyZWF0ZTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKG91dCkgPDwgcHJlZml4IDw8IG5hbWUgPDwgIi5SZWFkKGlwcm90KTsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBsb2NhbF92YXJzKSB7CisKKyAgc3RyaW5nIG9iajsKKyAgc3RyaW5nIGNvdW50ZXI7CisgIHN0cmluZyBsb2NhbF92YXI7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIG9iaiA9IHRtcCgiX21hcCIpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIG9iaiA9IHRtcCgiX3NldCIpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBvYmogPSB0bXAoIl9saXN0Iik7CisgIH0KKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgbG9jYWxfdmFyID0gb2JqICsgIjogVFRocmlmdE1hcDsiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGxvY2FsX3ZhciA9IG9iaiArICI6IFRUaHJpZnRTZXQ7IjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgbG9jYWxfdmFyID0gb2JqICsgIjogVFRocmlmdExpc3Q7IjsKKyAgfQorICBsb2NhbF92YXJzIDw8ICIgICIgPDwgbG9jYWxfdmFyIDw8IGVuZGw7CisgIGNvdW50ZXIgPSB0bXAoIl9pIik7CisgIGxvY2FsX3ZhciA9IGNvdW50ZXIgKyAiOiBTeXN0ZW0uSW50ZWdlcjsiOworICBsb2NhbF92YXJzIDw8ICIgICIgPDwgbG9jYWxfdmFyIDw8IGVuZGw7CisKKyAgaW5kZW50X2ltcGwob3V0KSA8PCBuYW1lIDw8ICIgOj0gIiA8PCB0eXBlX25hbWUodHR5cGUsIHRydWUpIDw8ICIuQ3JlYXRlOyIgPDwgZW5kbDsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCBvYmogPDwgIiA6PSBpcHJvdC5SZWFkTWFwQmVnaW4oKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCBvYmogPDwgIiA6PSBpcHJvdC5SZWFkU2V0QmVnaW4oKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudF9pbXBsKG91dCkgPDwgb2JqIDw8ICIgOj0gaXByb3QuUmVhZExpc3RCZWdpbigpOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9pbXBsKG91dCkgPDwgImZvciAiIDw8IGNvdW50ZXIgPDwgIiA6PSAwIHRvICIgPDwgb2JqIDw8ICIuQ291bnQgLSAxIGRvIiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgaXNfeGNlcHRpb24sICh0X21hcCopdHR5cGUsIG5hbWUsIGxvY2FsX3ZhcnMpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgaXNfeGNlcHRpb24sICh0X3NldCopdHR5cGUsIG5hbWUsIGxvY2FsX3ZhcnMpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCBpc194Y2VwdGlvbiwgKHRfbGlzdCopdHR5cGUsIG5hbWUsIGxvY2FsX3ZhcnMpOworICB9CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbDsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiaXByb3QuUmVhZE1hcEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJpcHJvdC5SZWFkU2V0RW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJpcHJvdC5SZWFkTGlzdEVuZCgpOyIgPDwgZW5kbDsKKyAgfQorfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3RyZWFtJiBsb2NhbF92YXJzKSB7CisKKyAgc3RyaW5nIGtleSA9IHRtcCgiX2tleSIpOworICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7CisgIHN0cmluZyBsb2NhbF92YXI7CisKKyAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOworICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7CisKKyAgbG9jYWxfdmFycyA8PCAiICAiIDw8IGRlY2xhcmVfZmllbGQoJmZrZXkpIDw8IGVuZGw7CisgIGxvY2FsX3ZhcnMgPDwgIiAgIiA8PCBkZWNsYXJlX2ZpZWxkKCZmdmFsKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgaXNfeGNlcHRpb24sICZma2V5LCAiIiwgbG9jYWxfdmFycyk7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgaXNfeGNlcHRpb24sICZmdmFsLCAiIiwgbG9jYWxfdmFycyk7CisKKyAgaW5kZW50X2ltcGwob3V0KSA8PCBwcmVmaXggPDwgIi5BZGRPclNldFZhbHVlKCAiIDw8IGtleSA8PCAiLCAiIDw8IHZhbCA8PCAiKTsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0mIGxvY2FsX3ZhcnMpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgIHRfZmllbGQgZmVsZW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKyAgbG9jYWxfdmFycyA8PCAiICAiIDw8IGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsIGlzX3hjZXB0aW9uLCAmZmVsZW0sICIiLCBsb2NhbF92YXJzKTsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCBwcmVmaXggPDwgIi5BZGQoIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0mIGxvY2FsX3ZhcnMpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisgIGxvY2FsX3ZhcnMgPDwgIiAgIiA8PCBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCBpc194Y2VwdGlvbiwgJmZlbGVtLCAiIiwgbG9jYWxfdmFycyk7CisgIGluZGVudF9pbXBsKG91dCkgPDwgcHJlZml4IDw8ICIuQWRkKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0mIGxvY2FsX3ZhcnMpIHsKKyAgKHZvaWQpbG9jYWxfdmFyczsKKworICB0X3R5cGUqIHR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7CisgIHdoaWxlICh0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICB0eXBlID0gKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpOworICB9CisKKyAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyBwcm9wX25hbWUodGZpZWxkLCBpc194Y2VwdGlvbik7CisKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIG5hbWU7CisgIH0KKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUsIGxvY2FsX3ZhcnMpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIGlzX3hjZXB0aW9uLCB0eXBlLCBuYW1lLCBsb2NhbF92YXJzKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKworICAgIGluZGVudF9pbXBsKG91dCkgPDwgIm9wcm90LiI7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICAgIGlmIChhbnNpc3RyX2JpbmFyeV8pIHsKKyAgICAgICAgICAgIG91dCA8PCAiV3JpdGVBbnNpU3RyaW5nKCI7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG91dCA8PCAiV3JpdGVCaW5hcnkoIjsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8ICJXcml0ZVN0cmluZygiOworICAgICAgICB9CisgICAgICAgIG91dCA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgIldyaXRlQm9vbCgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgIldyaXRlQnl0ZSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJXcml0ZUkxNigiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJXcml0ZUkzMigiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJXcml0ZUk2NCgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJXcml0ZURvdWJsZSgiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIERlbHBoaSBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCAiV3JpdGVJMzIoU3lzdGVtLkludGVnZXIoIiA8PCBuYW1lIDw8ICIpKTsiOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgJyVzJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgcHJlZml4LmNfc3RyKCksCisgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7CisgIH0KK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3N0cmVhbSYgbG9jYWxfdmFycykgeworICAodm9pZClsb2NhbF92YXJzOworICAodm9pZCl0c3RydWN0OworICBvdXQgPDwgaW5kZW50X2ltcGwoKSA8PCBwcmVmaXggPDwgIi5Xcml0ZShvcHJvdCk7IiA8PCBlbmRsOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3RyZWFtJiBsb2NhbF92YXJzKSB7CisgIHN0cmluZyBvYmo7CisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBvYmogPSB0bXAoIm1hcCIpOworICAgIGxvY2FsX3ZhcnMgPDwgIiAgIiA8PCBvYmogPDwgIiA6IFRUaHJpZnRNYXA7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKG91dCkgPDwgIlRocmlmdC5Qcm90b2NvbC5Jbml0KCAiIDw8IG9iaiA8PCAiLCAiCisgICAgICAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIgPDwgcHJlZml4CisgICAgICAgICAgICAgICAgICAgICA8PCAiLkNvdW50KTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAib3Byb3QuV3JpdGVNYXBCZWdpbiggIiA8PCBvYmogPDwgIik7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIG9iaiA9IHRtcCgic2V0XyIpOworICAgIGxvY2FsX3ZhcnMgPDwgIiAgIiA8PCBvYmogPDwgIiA6IFRUaHJpZnRTZXQ7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKG91dCkgPDwgIlRocmlmdC5Qcm90b2NvbC5Jbml0KCAiIDw8IG9iaiA8PCAiLCAiCisgICAgICAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwgcHJlZml4CisgICAgICAgICAgICAgICAgICAgICA8PCAiLkNvdW50KTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAib3Byb3QuV3JpdGVTZXRCZWdpbiggIiA8PCBvYmogPDwgIik7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBvYmogPSB0bXAoImxpc3RfIik7CisgICAgbG9jYWxfdmFycyA8PCAiICAiIDw8IG9iaiA8PCAiIDogVFRocmlmdExpc3Q7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKG91dCkgPDwgIlRocmlmdC5Qcm90b2NvbC5Jbml0KCAiIDw8IG9iaiA8PCAiLCAiCisgICAgICAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8IHByZWZpeAorICAgICAgICAgICAgICAgICAgICAgPDwgIi5Db3VudCk7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKG91dCkgPDwgIm9wcm90LldyaXRlTGlzdEJlZ2luKCAiIDw8IG9iaiA8PCAiKTsiIDw8IGVuZGw7CisgIH0KKworICBzdHJpbmcgaXRlciA9IHRtcCgiX2l0ZXIiKTsKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGxvY2FsX3ZhcnMgPDwgIiAgIiA8PCBpdGVyIDw8ICI6ICIgPDwgdHlwZV9uYW1lKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKG91dCkgPDwgImZvciAiIDw8IGl0ZXIgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiLktleXMgZG8iIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBsb2NhbF92YXJzIDw8ICIgICIgPDwgaXRlciA8PCAiOiAiIDw8IHR5cGVfbmFtZSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIjsiCisgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKG91dCkgPDwgImZvciAiIDw8IGl0ZXIgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiIGRvIiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKG91dCkgPDwgImJlZ2luIiA8PCBlbmRsOworICAgIGluZGVudF91cF9pbXBsKCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGxvY2FsX3ZhcnMgPDwgIiAgIiA8PCBpdGVyIDw8ICI6ICIgPDwgdHlwZV9uYW1lKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIjsiCisgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKG91dCkgPDwgImZvciAiIDw8IGl0ZXIgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiIGRvIiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKG91dCkgPDwgImJlZ2luIiA8PCBlbmRsOworICAgIGluZGVudF91cF9pbXBsKCk7CisgIH0KKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgaXNfeGNlcHRpb24sICh0X21hcCopdHR5cGUsIGl0ZXIsIHByZWZpeCwgbG9jYWxfdmFycyk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgaXNfeGNlcHRpb24sICh0X3NldCopdHR5cGUsIGl0ZXIsIGxvY2FsX3ZhcnMpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgaXNfeGNlcHRpb24sICh0X2xpc3QqKXR0eXBlLCBpdGVyLCBsb2NhbF92YXJzKTsKKyAgfQorCisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbDsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAib3Byb3QuV3JpdGVNYXBFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAib3Byb3QuV3JpdGVTZXRFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudF9pbXBsKG91dCkgPDwgIm9wcm90LldyaXRlTGlzdEVuZCgpOyIgPDwgZW5kbDsKKyAgfQorfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3RyZWFtJiBsb2NhbF92YXJzKSB7CisgIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgaXNfeGNlcHRpb24sICZrZmllbGQsICIiLCBsb2NhbF92YXJzKTsKKyAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIG1hcCArICJbIiArIGl0ZXIgKyAiXSIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCBpc194Y2VwdGlvbiwgJnZmaWVsZCwgIiIsIGxvY2FsX3ZhcnMpOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3RyZWFtJiBsb2NhbF92YXJzKSB7CisgIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsIGlzX3hjZXB0aW9uLCAmZWZpZWxkLCAiIiwgbG9jYWxfdmFycyk7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3RyZWFtJiBsb2NhbF92YXJzKSB7CisgIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCBpc194Y2VwdGlvbiwgJmVmaWVsZCwgIiIsIGxvY2FsX3ZhcnMpOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvcGVydHkob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzUHVibGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5KG91dCwgaXNfeGNlcHRpb24sIHRmaWVsZCwgaXNQdWJsaWMsICJHZXQiKTsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9wcm9wZXJ0eShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RydWN0X2lzX3hjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNQdWJsaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkUHJlZml4KSB7CisgICh2b2lkKWlzUHVibGljOworCisgIHRfdHlwZSogZnR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7CisgIGJvb2wgaXNfeGNlcHRpb24gPSBmdHlwZS0+aXNfeGNlcHRpb24oKTsKKyAgZ2VuZXJhdGVfZGVscGhpX2RvYyhvdXQsIHRmaWVsZCk7CisgIGluZGVudChvdXQpIDw8ICJwcm9wZXJ0eSAiIDw8IHByb3BfbmFtZSh0ZmllbGQsIHN0cnVjdF9pc194Y2VwdGlvbikgPDwgIjogIgorICAgICAgICAgICAgICA8PCB0eXBlX25hbWUoZnR5cGUsIGZhbHNlLCB0cnVlLCBpc194Y2VwdGlvbiwgdHJ1ZSkgPDwgIiByZWFkICIKKyAgICAgICAgICAgICAgPDwgZmllbGRQcmVmaXggKyBwcm9wX25hbWUodGZpZWxkLCBzdHJ1Y3RfaXNfeGNlcHRpb24pIDw8ICIgd3JpdGUgU2V0IgorICAgICAgICAgICAgICA8PCBwcm9wX25hbWUodGZpZWxkLCBzdHJ1Y3RfaXNfeGNlcHRpb24pIDw8ICI7IiA8PCBlbmRsOworfQorCitzdGQ6OnN0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6OnByb3BfbmFtZSh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaXNfeGNlcHRpb24pIHsKKyAgcmV0dXJuIHByb3BfbmFtZSh0ZmllbGQtPmdldF9uYW1lKCksIGlzX3hjZXB0aW9uKTsKK30KKworc3RkOjpzdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjpwcm9wX25hbWUoc3RyaW5nIG5hbWUsIGJvb2wgaXNfeGNlcHRpb24pIHsKKyAgc3RyaW5nIHJldCA9IG5hbWU7CisgIHJldFswXSA9IHRvdXBwZXIocmV0WzBdKTsKKyAgcmV0dXJuIG5vcm1hbGl6ZV9uYW1lKHJldCwgdHJ1ZSwgaXNfeGNlcHRpb24pOworfQorCitzdGQ6OnN0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6OmNvbnN0cnVjdG9yX3BhcmFtX25hbWUoc3RyaW5nIG5hbWUpIHsKKyAgc3RyaW5nIHJldCA9IG5hbWU7CisgIHJldFswXSA9IHRvdXBwZXIocmV0WzBdKTsKKyAgcmV0ID0gIkEiICsgcmV0OworICByZXR1cm4gbm9ybWFsaXplX25hbWUocmV0LCBmYWxzZSwgZmFsc2UpOworfQorCitzdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjpub3JtYWxpemVfY2xzbm0oc3RyaW5nIGNsc25tLCBzdHJpbmcgcHJlZml4LCBib29sIGJfbm9fY2hlY2tfa2V5d29yZCkgeworICBpZiAoY2xzbm0uc2l6ZSgpID4gMCkgeworICAgIGNsc25tWzBdID0gdG91cHBlcihjbHNubVswXSk7CisgIH0KKyAgaWYgKGJfbm9fY2hlY2tfa2V5d29yZCkgeworICAgIHJldHVybiBwcmVmaXggKyBjbHNubTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gbm9ybWFsaXplX25hbWUocHJlZml4ICsgY2xzbm0pOworICB9Cit9CisKK3N0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9jbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiX25vX3Bvc3RmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiX2V4Y2VwdGlvbl9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9mdWxsX2V4Y2VwdGlvbl9mYWN0b3J5KSB7CisKKyAgaWYgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICB0X3R5cGVkZWYqIHRkZWYgPSAodF90eXBlZGVmKil0dHlwZTsKKyAgICBpZiAodGRlZi0+aXNfZm9yd2FyZF90eXBlZGVmKCkpIHsgLy8gZm9yd2FyZCB0eXBlcyBhY2NvcmRpbmcgdG8gVEhSSUZULTI0MjEKKyAgICAgIGlmICh0ZGVmLT5nZXRfdHlwZSgpICE9IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIHR5cGVfbmFtZSh0ZGVmLT5nZXRfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJfY2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJfbm9fcG9zdGZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiX2V4Y2VwdGlvbl9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGJfZnVsbF9leGNlcHRpb25fZmFjdG9yeSk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAidW5yZXNvbHZlZCBmb3J3YXJkIGRlY2xhcmF0aW9uOiAiICsgdGRlZi0+Z2V0X3N5bWJvbGljKCk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBub3JtYWxpemVfbmFtZSgiVCIgKyB0ZGVmLT5nZXRfc3ltYm9saWMoKSk7CisgICAgfQorICB9CisKKyAgc3RyaW5nIHR5cF9ubTsKKworICBzdHJpbmcgc19mYWN0b3J5OworCisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICByZXR1cm4gYmFzZV90eXBlX25hbWUoKHRfYmFzZV90eXBlKil0dHlwZSk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgIGJfY2xzID0gdHJ1ZTsKKyAgICBiX25vX3Bvc3RmaXggPSB0cnVlOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHRfbWFwKiB0bWFwID0gKHRfbWFwKil0dHlwZTsKKyAgICBpZiAoYl9jbHMpIHsKKyAgICAgIHR5cF9ubSA9ICJUVGhyaWZ0RGljdGlvbmFyeUltcGwiOworICAgIH0gZWxzZSB7CisgICAgICB0eXBfbm0gPSAiSVRocmlmdERpY3Rpb25hcnkiOworICAgIH0KKyAgICByZXR1cm4gdHlwX25tICsgIjwiICsgdHlwZV9uYW1lKHRtYXAtPmdldF9rZXlfdHlwZSgpKSArICIsICIgKyB0eXBlX25hbWUodG1hcC0+Z2V0X3ZhbF90eXBlKCkpCisgICAgICAgICAgICsgIj4iOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHRfc2V0KiB0c2V0ID0gKHRfc2V0Kil0dHlwZTsKKyAgICBpZiAoYl9jbHMpIHsKKyAgICAgIHR5cF9ubSA9ICJUSGFzaFNldEltcGwiOworICAgIH0gZWxzZSB7CisgICAgICB0eXBfbm0gPSAiSUhhc2hTZXQiOworICAgIH0KKyAgICByZXR1cm4gdHlwX25tICsgIjwiICsgdHlwZV9uYW1lKHRzZXQtPmdldF9lbGVtX3R5cGUoKSkgKyAiPiI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHRfbGlzdCogdGxpc3QgPSAodF9saXN0Kil0dHlwZTsKKyAgICBpZiAoYl9jbHMpIHsKKyAgICAgIHR5cF9ubSA9ICJUVGhyaWZ0TGlzdEltcGwiOworICAgIH0gZWxzZSB7CisgICAgICB0eXBfbm0gPSAiSVRocmlmdExpc3QiOworICAgIH0KKyAgICByZXR1cm4gdHlwX25tICsgIjwiICsgdHlwZV9uYW1lKHRsaXN0LT5nZXRfZWxlbV90eXBlKCkpICsgIj4iOworICB9CisKKyAgc3RyaW5nIHR5cGVfcHJlZml4OworCisgIGlmIChiX2NscykgeworICAgIHR5cGVfcHJlZml4ID0gIlQiOworICB9IGVsc2UgeworICAgIHR5cGVfcHJlZml4ID0gIkkiOworICB9CisKKyAgc3RyaW5nIG5tID0gbm9ybWFsaXplX2Nsc25tKHR0eXBlLT5nZXRfbmFtZSgpLCB0eXBlX3ByZWZpeCk7CisKKyAgaWYgKGJfZXhjZXB0aW9uX2ZhY3RvcnkpIHsKKyAgICBubSA9IG5tICsgIkZhY3RvcnkiOworICB9CisKKyAgaWYgKGJfY2xzKSB7CisgICAgaWYgKCFiX25vX3Bvc3RmaXgpIHsKKyAgICAgIG5tID0gbm0gKyAiSW1wbCI7CisgICAgfQorICB9CisKKyAgaWYgKGJfZXhjZXB0aW9uX2ZhY3RvcnkgJiYgYl9mdWxsX2V4Y2VwdGlvbl9mYWN0b3J5KSB7CisgICAgcmV0dXJuIHR5cGVfbmFtZSh0dHlwZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlKSArICIuIiArIG5tOworICB9CisKKyAgcmV0dXJuIG5tOworfQorCisvLyByZXR1cm5zICJjb25zdCAiIGZvciBzb21lIGFyZ3VtZW50IHR5cGVzCitzdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjppbnB1dF9hcmdfcHJlZml4KHRfdHlwZSogdHR5cGUpIHsKKworICAvLyBiYXNlIHR5cGVzCisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBzd2l0Y2ggKCgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKSkgeworCisgICAgLy8gdGhlc2Ugc2hvdWxkIGJlIGNvbnN0J2VkIGZvciBvcHRpbWFsIHBlcmZvcm1hbWNlCisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6IC8vIHJlZmNvdW50ZWQgcG9pbnRlcgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OiAgICAvLyBsYXJnZXIgdGhhbiAzMiBiaXQKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRTogLy8gbGFyZ2VyIHRoYW4gMzIgYml0CisgICAgICByZXR1cm4gImNvbnN0ICI7CisKKyAgICAvLyBhbGwgb3RoZXJzIGRvbid0IG5lZWQgdG8gYmUKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICByZXR1cm4gIiI7CisKKyAgICAvLyB3ZSBiZXR0ZXIgYWx3YXlzIHJlcG9ydCBhbnkgdW5rbm93biB0eXBlcworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGlucHV0X2FyZ19wcmVmaXgoKSBmb3IgYmFzZSB0eXBlICIKKyAgICAgICAgICArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSgoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCkpOworICAgIH0KKworICAgIC8vIGVudW1zCisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiIjsgLy8gdXN1YWxseSA8PSAzMiBiaXQKKworICAgIC8vIGNvbnRhaW5lcnMKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gImNvbnN0ICI7IC8vIHJlZmNvdW50ZWQgcG9pbnRlcgorCisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJjb25zdCAiOyAvLyByZWZjb3VudGVkIHBvaW50ZXIKKworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gImNvbnN0ICI7IC8vIHJlZmNvdW50ZWQgcG9pbnRlcgorICB9CisKKyAgLy8gYW55IG90aGVyIHR5cGUsIGVpdGhlciBUU29tZXRoaW5nIG9yIElTb21ldGhpbmcKKyAgcmV0dXJuICJjb25zdCAiOyAvLyBwb3NzaWJseSByZWZjb3VudGVkIHBvaW50ZXIKK30KKworc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6YmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHRiYXNlKSB7CisgIHN3aXRjaCAodGJhc2UtPmdldF9iYXNlKCkpIHsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgIC8vIG5vICJ2b2lkIiBpbiBEZWxwaGkgbGFuZ3VhZ2UKKyAgICByZXR1cm4gIiI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgIGlmICh0YmFzZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIGlmIChhbnNpc3RyX2JpbmFyeV8pIHsKKyAgICAgICAgcmV0dXJuICJTeXN0ZW0uQW5zaVN0cmluZyI7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gIlN5c1V0aWxzLlRCeXRlcyI7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAiU3lzdGVtLnN0cmluZyI7CisgICAgfQorICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgcmV0dXJuICJTeXN0ZW0uQm9vbGVhbiI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgcmV0dXJuICJTeXN0ZW0uU2hvcnRJbnQiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICByZXR1cm4gIlN5c3RlbS5TbWFsbEludCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIHJldHVybiAiU3lzdGVtLkludGVnZXIiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICByZXR1cm4gIlN5c3RlbS5JbnQ2NCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgIHJldHVybiAiU3lzdGVtLkRvdWJsZSI7CisgIGRlZmF1bHQ6CisgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBEZWxwaGkgbmFtZSBmb3IgYmFzZSB0eXBlICIKKyAgICAgICAgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UtPmdldF9iYXNlKCkpOworICB9Cit9CisKK3N0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6OmRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbl9jbGFzcykgeworICAodm9pZClpbml0OworCisgIHRfdHlwZSogZnR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7CisgIGJvb2wgaXNfeGNlcHRpb24gPSBmdHlwZS0+aXNfeGNlcHRpb24oKTsKKworICBzdHJpbmcgcmVzdWx0ID0gcHJlZml4ICsgcHJvcF9uYW1lKHRmaWVsZCwgaXNfeGNlcHRpb25fY2xhc3MpICsgIjogIgorICAgICAgICAgICAgICAgICAgKyB0eXBlX25hbWUoZnR5cGUsIGZhbHNlLCB0cnVlLCBpc194Y2VwdGlvbiwgdHJ1ZSkgKyAiOyI7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JfYXN5bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZnVsbF9jbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbikgeworICB0X3R5cGUqIHR0eXBlID0gdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOworICBzdHJpbmcgcHJlZml4OworICBpZiAoZnVsbF9jbHMgPT0gIiIpIHsKKyAgICBwcmVmaXggPSAiIjsKKyAgfSBlbHNlIHsKKyAgICBwcmVmaXggPSBmdWxsX2NscyArICIuIjsKKyAgfQorCisgIGlmKCBmb3JfYXN5bmMpIHsKKyAgICBpZiAoaXNfdm9pZCh0dHlwZSkpIHsKKyAgICAgIHJldHVybiAiZnVuY3Rpb24gIiArIHByZWZpeCArIG5vcm1hbGl6ZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSwgdHJ1ZSwgaXNfeGNlcHRpb24pICsgIkFzeW5jKCIKKyAgICAgICAgICAgICArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSArICIpOiBJRnV0dXJlPEludGVnZXI+OyI7ICAvLyBubyBJRnV0dXJlPHZvaWQ+IGluIERlbHBoaQorICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gImZ1bmN0aW9uICIgKyBwcmVmaXggKyBub3JtYWxpemVfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCksIHRydWUsIGlzX3hjZXB0aW9uKSArICJBc3luYygiCisgICAgICAgICAgICAgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkgKyAiKTogSUZ1dHVyZTwiCisgICAgICAgICAgICAgKyB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlLCBpc194Y2VwdGlvbiwgdHJ1ZSkgKyAiPjsiOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoaXNfdm9pZCh0dHlwZSkpIHsKKyAgICAgIHJldHVybiAicHJvY2VkdXJlICIgKyBwcmVmaXggKyBub3JtYWxpemVfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCksIHRydWUsIGlzX3hjZXB0aW9uKSArICIoIgorICAgICAgICAgICAgICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpICsgIik7IjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuICJmdW5jdGlvbiAiICsgcHJlZml4ICsgbm9ybWFsaXplX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpLCB0cnVlLCBpc194Y2VwdGlvbikgKyAiKCIKKyAgICAgICAgICAgICArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSArICIpOiAiCisgICAgICAgICAgICAgKyB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlLCBpc194Y2VwdGlvbiwgdHJ1ZSkgKyAiOyI7CisgICAgfQorICB9Cit9CisKK3N0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICB0X3R5cGUqIHR0OworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIjsgIjsKKyAgICB9CisKKyAgICB0dCA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICByZXN1bHQgKz0gaW5wdXRfYXJnX3ByZWZpeCh0dCk7IC8vIGNvbnN0PworICAgIHJlc3VsdCArPSBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpICsgIjogIgorICAgICAgICAgICAgICArIHR5cGVfbmFtZSh0dCwgZmFsc2UsIHRydWUsIHR0LT5pc194Y2VwdGlvbigpLCB0cnVlKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjpjb25zdHJ1Y3Rvcl9hcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgY3VycmVudF9pbmRlbnQpIHsKKyAgb3N0cmluZ3N0cmVhbSByZXN1bHQ7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIHRfdHlwZSogdHQ7CisgIHN0cmluZyBsaW5lID0gIiI7CisgIHN0cmluZyBuZXdsaW5lX2luZGVudCA9IGN1cnJlbnRfaW5kZW50ICsgIiAgIjsKKworICBib29sIGZpcnN0bGluZSA9IHRydWU7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIGxpbmUgKz0gIjsiOworICAgIH0KKworICAgIGlmIChsaW5lLnNpemUoKSA+IDgwKSB7CisgICAgICBpZiAoZmlyc3RsaW5lKSB7CisgICAgICAgIHJlc3VsdCA8PCBlbmRsIDw8IG5ld2xpbmVfaW5kZW50OworICAgICAgICBmaXJzdGxpbmUgPSBmYWxzZTsKKyAgICAgIH0KKyAgICAgIHJlc3VsdCA8PCBsaW5lIDw8IGVuZGw7CisgICAgICBsaW5lID0gbmV3bGluZV9pbmRlbnQ7CisgICAgfSBlbHNlIGlmIChsaW5lLnNpemUoKSA+IDApIHsKKyAgICAgIGxpbmUgKz0gIiAiOworICAgIH0KKworICAgIHR0ID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgIGxpbmUgKz0gaW5wdXRfYXJnX3ByZWZpeCh0dCk7IC8vIGNvbnN0PworICAgIGxpbmUgKz0gY29uc3RydWN0b3JfcGFyYW1fbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpICsgIjogIgorICAgICAgICAgICAgKyB0eXBlX25hbWUodHQsIGZhbHNlLCB0cnVlLCB0dC0+aXNfeGNlcHRpb24oKSwgdHJ1ZSk7CisgIH0KKworICBpZiAobGluZS5zaXplKCkgPiAwKSB7CisgICAgcmVzdWx0IDw8IGxpbmU7CisgIH0KKworICBzdHJpbmcgcmVzdWx0X3N0cjsKKworICBpZiAoZmlyc3RsaW5lKSB7CisgICAgcmVzdWx0X3N0ciA9ICIgIiArIHJlc3VsdC5zdHIoKTsKKyAgfSBlbHNlIHsKKyAgICByZXN1bHRfc3RyID0gcmVzdWx0LnN0cigpOworICB9CisKKyAgcmV0dXJuIHJlc3VsdF9zdHI7Cit9CisKK3N0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKKyAgd2hpbGUgKHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHR5cGUgPSAoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCk7CisgIH0KKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiVFR5cGUuU3RyaW5nXyI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJUVHlwZS5Cb29sXyI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiVFR5cGUuQnl0ZV8iOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJUVHlwZS5JMTYiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJUVHlwZS5JMzIiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJUVHlwZS5JNjQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJUVHlwZS5Eb3VibGVfIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5JMzIiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLlN0cnVjdCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLk1hcCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLlNldF8iOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiVFR5cGUuTGlzdCI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK3N0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6OmVtcHR5X3ZhbHVlKHRfdHlwZSogdHlwZSkgeworICB3aGlsZSAodHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgdHlwZSA9ICgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgcmV0dXJuICIwIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICBpZiAoYW5zaXN0cl9iaW5hcnlfKSB7CisgICAgICAgICAgcmV0dXJuICInJyI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmV0dXJuICJuaWwiOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gIicnIjsKKyAgICAgIH0KKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIkZhbHNlIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICIwIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiMC4wIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJUIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiKDApIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJuaWwiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJuaWwiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJuaWwiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAibmlsIjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9wcm9wZXJ0eV93cml0ZXJfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbl9jbGFzcykgeworICB0X3R5cGUqIGZ0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOworICBib29sIGlzX3hjZXB0aW9uID0gZnR5cGUtPmlzX3hjZXB0aW9uKCk7CisKKyAgaW5kZW50KG91dCkgPDwgInByb2NlZHVyZSBTZXQiIDw8IHByb3BfbmFtZSh0ZmllbGQsIGlzX3hjZXB0aW9uX2NsYXNzKQorICAgICAgICAgICAgICA8PCAiKCBjb25zdCBWYWx1ZTogIiA8PCB0eXBlX25hbWUoZnR5cGUsIGZhbHNlLCB0cnVlLCBpc194Y2VwdGlvbiwgdHJ1ZSkgPDwgIik7IgorICAgICAgICAgICAgICA8PCBlbmRsOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5X3JlYWRlcl9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uX2NsYXNzKSB7CisgIHRfdHlwZSogZnR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7CisgIGJvb2wgaXNfeGNlcHRpb24gPSBmdHlwZS0+aXNfeGNlcHRpb24oKTsKKworICBpbmRlbnQob3V0KSA8PCAiZnVuY3Rpb24gR2V0IiA8PCBwcm9wX25hbWUodGZpZWxkLCBpc194Y2VwdGlvbl9jbGFzcykgPDwgIjogIgorICAgICAgICAgICAgICA8PCB0eXBlX25hbWUoZnR5cGUsIGZhbHNlLCB0cnVlLCBpc194Y2VwdGlvbiwgdHJ1ZSkgPDwgIjsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfaXNzZXRfcmVhZGVyX2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24pIHsKKyAgaW5kZW50KG91dCkgPDwgImZ1bmN0aW9uIEdldF9faXNzZXRfIiA8PCBwcm9wX25hbWUodGZpZWxkLCBpc194Y2VwdGlvbikgPDwgIjogU3lzdGVtLkJvb2xlYW47IiA8PCBlbmRsOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX2NsZWFyX3VuaW9uX3ZhbHVlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkUHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uX2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3VuaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uX2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHhjZXB0aW9uX2ZhY3RvcnlfbmFtZSkgeworICAodm9pZCljbHNfcHJlZml4OworICAodm9pZCluYW1lOworICAodm9pZCl0eXBlOworICAodm9pZClpc191bmlvbjsKKyAgKHZvaWQpaXNfeGNlcHRpb25fZmFjdG9yeTsKKyAgKHZvaWQpeGNlcHRpb25fZmFjdG9yeV9uYW1lOworCisgIHRfdHlwZSogZnR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7CisgIGJvb2wgaXNfeGNlcHRpb24gPSBmdHlwZS0+aXNfeGNlcHRpb24oKTsKKworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJpZiBGX19pc3NldF8iIDw8IHByb3BfbmFtZSh0ZmllbGQsIGlzX3hjZXB0aW9uX2NsYXNzKSA8PCAiIHRoZW4gYmVnaW4iCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiRl9faXNzZXRfIiA8PCBwcm9wX25hbWUodGZpZWxkLCBpc194Y2VwdGlvbl9jbGFzcykgPDwgIiA6PSBGYWxzZTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKG91dCkgPDwgZmllbGRQcmVmaXggPDwgcHJvcF9uYW1lKHRmaWVsZCwgaXNfeGNlcHRpb25fY2xhc3MpIDw8ICIgOj0gIgorICAgICAgICAgICAgICAgICAgIDw8ICJEZWZhdWx0KCAiIDw8IHR5cGVfbmFtZShmdHlwZSwgZmFsc2UsIHRydWUsIGlzX3hjZXB0aW9uLCB0cnVlKSA8PCAiKTsiCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5X3dyaXRlcl9pbXBsKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkUHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uX2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3VuaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uX2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHhjZXB0aW9uX2ZhY3RvcnlfbmFtZSkgeworICAodm9pZCl0eXBlOworCisgIHRfdHlwZSogZnR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7CisgIGJvb2wgaXNfeGNlcHRpb24gPSBmdHlwZS0+aXNfeGNlcHRpb24oKTsKKworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJwcm9jZWR1cmUgIiA8PCBjbHNfcHJlZml4IDw8IG5hbWUgPDwgIi4iCisgICAgICAgICAgICAgICAgICAgPDwgIlNldCIgPDwgcHJvcF9uYW1lKHRmaWVsZCwgaXNfeGNlcHRpb25fY2xhc3MpCisgICAgICAgICAgICAgICAgICAgPDwgIiggY29uc3QgVmFsdWU6ICIgPDwgdHlwZV9uYW1lKGZ0eXBlLCBmYWxzZSwgdHJ1ZSwgaXNfeGNlcHRpb24sIHRydWUpIDw8ICIpOyIKKyAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgaWYgKGlzX3VuaW9uKSB7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiQ2xlYXJVbmlvblZhbHVlczsiIDw8IGVuZGw7CisgIH0KKyAgaWYgKHRmaWVsZC0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJGX19pc3NldF8iIDw8IHByb3BfbmFtZSh0ZmllbGQsIGlzX3hjZXB0aW9uX2NsYXNzKSA8PCAiIDo9IFRydWU7IiA8PCBlbmRsOworICB9CisgIGluZGVudF9pbXBsKG91dCkgPDwgZmllbGRQcmVmaXggPDwgcHJvcF9uYW1lKHRmaWVsZCwgaXNfeGNlcHRpb25fY2xhc3MpIDw8ICIgOj0gVmFsdWU7IiA8PCBlbmRsOworCisgIGlmIChpc194Y2VwdGlvbl9jbGFzcyAmJiAoIWlzX3hjZXB0aW9uX2ZhY3RvcnkpKSB7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCB4Y2VwdGlvbl9mYWN0b3J5X25hbWUgPDwgIi4iIDw8IHByb3BfbmFtZSh0ZmllbGQsIGlzX3hjZXB0aW9uX2NsYXNzKQorICAgICAgICAgICAgICAgICAgICAgPDwgIiA6PSBWYWx1ZTsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKG91dCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9wcm9wZXJ0eV9yZWFkZXJfaW1wbChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWVsZFByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbl9jbGFzcykgeworICAodm9pZCl0eXBlOworCisgIHRfdHlwZSogZnR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7CisgIGJvb2wgaXNfeGNlcHRpb24gPSBmdHlwZS0+aXNfeGNlcHRpb24oKTsKKworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJmdW5jdGlvbiAiIDw8IGNsc19wcmVmaXggPDwgbmFtZSA8PCAiLiIKKyAgICAgICAgICAgICAgICAgICA8PCAiR2V0IiA8PCBwcm9wX25hbWUodGZpZWxkLCBpc194Y2VwdGlvbl9jbGFzcykgPDwgIjogIgorICAgICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZShmdHlwZSwgZmFsc2UsIHRydWUsIGlzX3hjZXB0aW9uLCB0cnVlKSA8PCAiOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGluZGVudF9pbXBsKG91dCkgPDwgIlJlc3VsdCA6PSAiIDw8IGZpZWxkUHJlZml4IDw8IHByb3BfbmFtZSh0ZmllbGQsIGlzX3hjZXB0aW9uX2NsYXNzKSA8PCAiOyIKKyAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKG91dCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9pc3NldF9yZWFkZXJfaW1wbChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWVsZFByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbikgeworICAodm9pZCl0eXBlOworCisgIHN0cmluZyBpc3NldF9uYW1lID0gIl9faXNzZXRfIiArIHByb3BfbmFtZSh0ZmllbGQsIGlzX3hjZXB0aW9uKTsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiZnVuY3Rpb24gIiA8PCBjbHNfcHJlZml4IDw8IG5hbWUgPDwgIi4iCisgICAgICAgICAgICAgICAgICAgPDwgIkdldCIgPDwgaXNzZXRfbmFtZSA8PCAiOiBTeXN0ZW0uQm9vbGVhbjsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKG91dCkgPDwgImJlZ2luIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJSZXN1bHQgOj0gIiA8PCBmaWVsZFByZWZpeCA8PCBpc3NldF9uYW1lIDw8ICI7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKG91dCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9jcmVhdGVfZXhjZXB0aW9uX2ltcGwob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNsc19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgICh2b2lkKWNsc19wcmVmaXg7CisKKyAgc3RyaW5nIGV4Y2VwdGlvbl9jbHNfbm0gPSB0eXBlX25hbWUodHN0cnVjdCwgdHJ1ZSwgdHJ1ZSk7CisgIHN0cmluZyBjbHNfbm0gPSB0eXBlX25hbWUodHN0cnVjdCwgdHJ1ZSwgZmFsc2UsIGlzX2V4Y2VwdGlvbiwgaXNfZXhjZXB0aW9uKTsKKworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJmdW5jdGlvbiAiIDw8IGNsc19ubSA8PCAiLkNyZWF0ZUV4Y2VwdGlvbjogIiA8PCBleGNlcHRpb25fY2xzX25tIDw8ICI7IgorICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiUmVzdWx0IDo9ICIgPDwgZXhjZXB0aW9uX2Nsc19ubSA8PCAiLkNyZWF0ZTsiIDw8IGVuZGw7CisgIHN0cmluZyBmYWN0b3J5X25hbWUgPSBub3JtYWxpemVfY2xzbm0odHN0cnVjdC0+Z2V0X25hbWUoKSwgIiIsIHRydWUpICsgIkZhY3RvcnkiOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJSZXN1bHQuRiIgPDwgZmFjdG9yeV9uYW1lIDw8ICIgOj0gU2VsZjsiIDw8IGVuZGw7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIHN0cmluZyBwcm9wbmFtZTsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHByb3BuYW1lID0gcHJvcF9uYW1lKCpmX2l0ZXIsIGlzX2V4Y2VwdGlvbik7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgIGluZGVudF9pbXBsKG91dCkgPDwgImlmIF9faXNzZXRfIiA8PCBwcm9wbmFtZSA8PCAiIHRoZW4gYmVnaW4iIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXBfaW1wbCgpOworICAgIH0KKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJSZXN1bHQuIiA8PCBwcm9wbmFtZSA8PCAiIDo9ICIgPDwgcHJvcG5hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICAgIGluZGVudF9pbXBsKG91dCkgPDwgImVuZDsiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiUmVzdWx0LlVwZGF0ZU1lc3NhZ2VQcm9wZXJ0eTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3JlYWRlcl9pbXBsKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjbHNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgeworCisgIG9zdHJpbmdzdHJlYW0gbG9jYWxfdmFyczsKKyAgb3N0cmluZ3N0cmVhbSBjb2RlX2Jsb2NrOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisKKyAgaW5kZW50X2ltcGwobG9jYWxfdmFycykgPDwgInRyYWNrZXIgOiBJUHJvdG9jb2xSZWN1cnNpb25UcmFja2VyOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgInRyYWNrZXIgOj0gaXByb3QuTmV4dFJlY3Vyc2lvbkxldmVsOyIgPDwgZW5kbDsKKworICAvLyBsb2NhbCBib29scyBmb3IgcmVxdWlyZWQgZmllbGRzCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgIGluZGVudF9pbXBsKGxvY2FsX3ZhcnMpIDw8ICJfcmVxX2lzc2V0XyIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIsIGlzX2V4Y2VwdGlvbikgPDwgIiA6IFN5c3RlbS5Cb29sZWFuOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiX3JlcV9pc3NldF8iIDw8IHByb3BfbmFtZSgqZl9pdGVyLCBpc19leGNlcHRpb24pIDw8ICIgOj0gRkFMU0U7IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAic3RydWMgOj0gaXByb3QuUmVhZFN0cnVjdEJlZ2luOyIgPDwgZW5kbDsKKworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAidHJ5IiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworCisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJ3aGlsZSAodHJ1ZSkgZG8iIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZmllbGRfIDo9IGlwcm90LlJlYWRGaWVsZEJlZ2luKCk7IiA8PCBlbmRsOworCisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJpZiAoZmllbGRfLlR5cGVfID0gVFR5cGUuU3RvcCkgdGhlbiIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImJlZ2luIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiQnJlYWs7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJlbmQ7IiA8PCBlbmRsOworCisgIGJvb2wgZmlyc3QgPSB0cnVlOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJjYXNlIGZpZWxkXy5JRCBvZiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cF9pbXBsKCk7CisgICAgfQorCisgICAgZmlyc3QgPSBmYWxzZTsKKyAgICBpZiAoZl9pdGVyICE9IGZpZWxkcy5iZWdpbigpKSB7CisgICAgICBjb2RlX2Jsb2NrIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiBiZWdpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXBfaW1wbCgpOworICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJpZiAoZmllbGRfLlR5cGVfID0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIpIHRoZW4gYmVnaW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwX2ltcGwoKTsKKworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKGNvZGVfYmxvY2ssIGlzX2V4Y2VwdGlvbiwgKmZfaXRlciwgIlNlbGYuIiwgbG9jYWxfdmFycyk7CisKKyAgICAvLyByZXF1aXJlZCBmaWVsZD8KKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIl9yZXFfaXNzZXRfIiA8PCBwcm9wX25hbWUoKmZfaXRlciwgaXNfZXhjZXB0aW9uKSA8PCAiIDo9IFRSVUU7IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisKKyAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZW5kIGVsc2UgYmVnaW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiVFByb3RvY29sVXRpbC5Ta2lwKGlwcm90LCBmaWVsZF8uVHlwZV8pOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImVuZDsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd25faW1wbCgpOworICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJlbmQiOworICB9CisKKyAgaWYgKCFmaXJzdCkgeworICAgIGNvZGVfYmxvY2sgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZWxzZSBiZWdpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXBfaW1wbCgpOworICB9CisKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIlRQcm90b2NvbFV0aWwuU2tpcChpcHJvdCwgZmllbGRfLlR5cGVfKTsiIDw8IGVuZGw7CisKKyAgaWYgKCFmaXJzdCkgeworICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZW5kOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImVuZDsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiaXByb3QuUmVhZEZpZWxkRW5kOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bl9pbXBsKCk7CisKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImVuZDsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duX2ltcGwoKTsKKworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZmluYWxseSIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImlwcm90LlJlYWRTdHJ1Y3RFbmQ7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJlbmQ7IiA8PCBlbmRsOworCisgIC8vIGFsbCByZXF1aXJlZCBmaWVsZHMgaGF2ZSBiZWVuIHJlYWQ/CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJpZiBub3QgX3JlcV9pc3NldF8iIDw8IHByb3BfbmFtZSgqZl9pdGVyLCBpc19leGNlcHRpb24pIDw8IGVuZGw7CisgICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKQorICAgICAgICAgIDw8ICJ0aGVuIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbkludmFsaWREYXRhLkNyZWF0ZSgiCisgICAgICAgICAgPDwgIidyZXF1aXJlZCBmaWVsZCAiIDw8IHByb3BfbmFtZSgqZl9pdGVyLCBpc19leGNlcHRpb24pIDw8ICIgbm90IHNldCcpOyIKKyAgICAgICAgICA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBzdHJpbmcgY2xzX25tOworCisgIGNsc19ubSA9IHR5cGVfbmFtZSh0c3RydWN0LCB0cnVlLCBmYWxzZSwgaXNfZXhjZXB0aW9uLCBpc19leGNlcHRpb24pOworCisgIGluZGVudF9pbXBsKG91dCkgPDwgInByb2NlZHVyZSAiIDw8IGNsc19wcmVmaXggPDwgY2xzX25tIDw8ICIuUmVhZCggY29uc3QgaXByb3Q6IElQcm90b2NvbCk7IgorICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKG91dCkgPDwgInZhciIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiZmllbGRfIDogVFRocmlmdEZpZWxkOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAic3RydWMgOiBUVGhyaWZ0U3RydWN0OyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBvdXQgPDwgbG9jYWxfdmFycy5zdHIoKSA8PCBlbmRsOworICBvdXQgPDwgY29kZV9ibG9jay5zdHIoKTsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcl9pbXBsKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgeworCisgIG9zdHJpbmdzdHJlYW0gbG9jYWxfdmFyczsKKyAgb3N0cmluZ3N0cmVhbSBjb2RlX2Jsb2NrOworCisgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisKKyAgaW5kZW50X2ltcGwobG9jYWxfdmFycykgPDwgInRyYWNrZXIgOiBJUHJvdG9jb2xSZWN1cnNpb25UcmFja2VyOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgInRyYWNrZXIgOj0gb3Byb3QuTmV4dFJlY3Vyc2lvbkxldmVsOyIgPDwgZW5kbDsKKworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiVGhyaWZ0LlByb3RvY29sLkluaXQoIHN0cnVjLCAnIiA8PCBuYW1lIDw8ICInKTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJvcHJvdC5Xcml0ZVN0cnVjdEJlZ2luKHN0cnVjKTsiIDw8IGVuZGw7CisKKyAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7CisgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIlRocmlmdC5Qcm90b2NvbC5Jbml0KCBmaWVsZF8pOyIgPDwgZW5kbDsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImlmIChfX2lzc2V0XyIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIsIGlzX2V4Y2VwdGlvbikgPDwgIikgdGhlbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXBfaW1wbCgpOworICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImZpZWxkXy5OYW1lIDo9ICciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJzsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZmllbGRfLlR5cGVfICA6PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICI7IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJmaWVsZF8uSUQgOj0gIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oZmllbGRfKTsiIDw8IGVuZGw7CisgICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQoY29kZV9ibG9jaywgaXNfZXhjZXB0aW9uLCAqZl9pdGVyLCAiU2VsZi4iLCBsb2NhbF92YXJzKTsKKyAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd25faW1wbCgpOworICAgIH0KKyAgfQorCisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJvcHJvdC5Xcml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIm9wcm90LldyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBzdHJpbmcgY2xzX25tOworCisgIGNsc19ubSA9IHR5cGVfbmFtZSh0c3RydWN0LCB0cnVlLCBmYWxzZSwgaXNfZXhjZXB0aW9uLCBpc19leGNlcHRpb24pOworCisgIGluZGVudF9pbXBsKG91dCkgPDwgInByb2NlZHVyZSAiIDw8IGNsc19wcmVmaXggPDwgY2xzX25tIDw8ICIuV3JpdGUoIGNvbnN0IG9wcm90OiBJUHJvdG9jb2wpOyIKKyAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJ2YXIiIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisgIGluZGVudF9pbXBsKG91dCkgPDwgInN0cnVjIDogVFRocmlmdFN0cnVjdDsiIDw8IGVuZGw7CisKKyAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiZmllbGRfIDogVFRocmlmdEZpZWxkOyIgPDwgZW5kbDsKKyAgfQorCisgIG91dCA8PCBsb2NhbF92YXJzLnN0cigpOworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIG91dCA8PCBjb2RlX2Jsb2NrLnN0cigpOworfQorCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX3N0cnVjdF93cml0ZXJfaW1wbChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2xzX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKKworICBvc3RyaW5nc3RyZWFtIGxvY2FsX3ZhcnM7CisgIG9zdHJpbmdzdHJlYW0gY29kZV9ibG9jazsKKworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImJlZ2luIiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworCisgIGluZGVudF9pbXBsKGxvY2FsX3ZhcnMpIDw8ICJ0cmFja2VyIDogSVByb3RvY29sUmVjdXJzaW9uVHJhY2tlcjsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJ0cmFja2VyIDo9IG9wcm90Lk5leHRSZWN1cnNpb25MZXZlbDsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIlRocmlmdC5Qcm90b2NvbC5Jbml0KCBzdHJ1YywgJyIgPDwgbmFtZSA8PCAiJyk7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAib3Byb3QuV3JpdGVTdHJ1Y3RCZWdpbihzdHJ1Yyk7IiA8PCBlbmRsOworCisgIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgeworICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJUaHJpZnQuUHJvdG9jb2wuSW5pdCggZmllbGRfKTsiIDw8IGVuZGw7CisgIH0KKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBmaWVsZG5hbWUgPSBwcm9wX25hbWUoKCpmX2l0ZXIpLCBpc19leGNlcHRpb24pOworICAgIGJvb2wgbnVsbF9hbGxvd2VkID0gdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpOworICAgIGJvb2wgaXNfcmVxdWlyZWQgPSAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCk7CisgICAgYm9vbCBoYXNfaXNzZXQgPSAoIWlzX3JlcXVpcmVkKTsKKyAgICBpZiAoaXNfcmVxdWlyZWQgJiYgbnVsbF9hbGxvd2VkKSB7CisgICAgICBudWxsX2FsbG93ZWQgPSBmYWxzZTsKKyAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJpZiAoU2VsZi4iIDw8IGZpZWxkbmFtZSA8PCAiID0gbmlsKSIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJ0aGVuIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbkludmFsaWREYXRhLkNyZWF0ZSgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiJ3JlcXVpcmVkIGZpZWxkICIgPDwgZmllbGRuYW1lIDw8ICIgbm90IHNldCcpOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorICAgIGlmIChudWxsX2FsbG93ZWQpIHsKKyAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJpZiAoU2VsZi4iIDw8IGZpZWxkbmFtZSA8PCAiIDw+IG5pbCkiOworICAgICAgaWYgKGhhc19pc3NldCkgeworICAgICAgICBjb2RlX2Jsb2NrIDw8ICIgYW5kIF9faXNzZXRfIiA8PCBmaWVsZG5hbWU7CisgICAgICB9CisgICAgICBjb2RlX2Jsb2NrIDw8ICIgdGhlbiBiZWdpbiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cF9pbXBsKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChoYXNfaXNzZXQpIHsKKyAgICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImlmIChfX2lzc2V0XyIgPDwgZmllbGRuYW1lIDw8ICIpIHRoZW4gYmVnaW4iIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cF9pbXBsKCk7CisgICAgICB9CisgICAgfQorICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJmaWVsZF8uTmFtZSA6PSAnIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIic7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJmaWVsZF8uVHlwZV8gIDo9ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZmllbGRfLklEIDo9ICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIm9wcm90LldyaXRlRmllbGRCZWdpbihmaWVsZF8pOyIgPDwgZW5kbDsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQoY29kZV9ibG9jaywgaXNfZXhjZXB0aW9uLCAqZl9pdGVyLCAiU2VsZi4iLCBsb2NhbF92YXJzKTsKKyAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAib3Byb3QuV3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKyAgICBpZiAobnVsbF9hbGxvd2VkIHx8IGhhc19pc3NldCkgeworICAgICAgaW5kZW50X2Rvd25faW1wbCgpOworICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImVuZDsiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIm9wcm90LldyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAib3Byb3QuV3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIHN0cmluZyBjbHNfbm07CisKKyAgY2xzX25tID0gdHlwZV9uYW1lKHRzdHJ1Y3QsIHRydWUsIGZhbHNlLCBpc19leGNlcHRpb24sIGlzX2V4Y2VwdGlvbik7CisKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAicHJvY2VkdXJlICIgPDwgY2xzX3ByZWZpeCA8PCBjbHNfbm0gPDwgIi5Xcml0ZSggY29uc3Qgb3Byb3Q6IElQcm90b2NvbCk7IgorICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKG91dCkgPDwgInZhciIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAic3RydWMgOiBUVGhyaWZ0U3RydWN0OyIgPDwgZW5kbDsKKyAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiZmllbGRfIDogVFRocmlmdEZpZWxkOyIgPDwgZW5kbDsKKyAgfQorICBvdXQgPDwgbG9jYWxfdmFycy5zdHIoKTsKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBvdXQgPDwgY29kZV9ibG9jay5zdHIoKTsKK30KKwordm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfdG9zdHJpbmdfaW1wbChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjbHNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeF9mYWN0b3J5KSB7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIHN0cmluZyBjbHNfbm07CisKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIGNsc19ubSA9IHR5cGVfbmFtZSh0c3RydWN0LCB0cnVlLCAoIWlzX3hfZmFjdG9yeSksIGlzX3hfZmFjdG9yeSwgdHJ1ZSk7CisgIH0gZWxzZSB7CisgICAgY2xzX25tID0gdHlwZV9uYW1lKHRzdHJ1Y3QsIHRydWUsIGZhbHNlKTsKKyAgfQorCisgIHN0cmluZyB0bXBfc2IgPSB0bXAoIl9zYiIpOworICBzdHJpbmcgdG1wX2ZpcnN0ID0gdG1wKCJfZmlyc3QiKTsKKyAgYm9vbCB1c2VGaXJzdEZsYWcgPSBmYWxzZTsKKworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJmdW5jdGlvbiAiIDw8IGNsc19wcmVmaXggPDwgY2xzX25tIDw8ICIuVG9TdHJpbmc6IHN0cmluZzsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKG91dCkgPDwgInZhciIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCB0bXBfc2IgPDwgIiA6IFRUaHJpZnRTdHJpbmdCdWlsZGVyOyIgPDwgZW5kbDsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBib29sIGlzX29wdGlvbmFsID0gKCgqZl9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpOworICAgIGlmIChpc19vcHRpb25hbCkgeworICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCB0bXBfZmlyc3QgPDwgIiA6IFN5c3RlbS5Cb29sZWFuOyIgPDwgZW5kbDsKKyAgICAgIHVzZUZpcnN0RmxhZyA9IHRydWU7CisgICAgfQorICAgIGJyZWFrOworICB9CisgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgIGluZGVudF91cF9pbXBsKCk7CisKKyAgaW5kZW50X2ltcGwob3V0KSA8PCB0bXBfc2IgPDwgIiA6PSBUVGhyaWZ0U3RyaW5nQnVpbGRlci5DcmVhdGUoJygnKTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKG91dCkgPDwgInRyeSIgPDwgZW5kbDsKKyAgaW5kZW50X3VwX2ltcGwoKTsKKworICBpZiAodXNlRmlyc3RGbGFnKSB7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCB0bXBfZmlyc3QgPDwgIiA6PSBUUlVFOyIgPDwgZW5kbDsKKyAgfQorCisgIGJvb2wgaGFkX3JlcXVpcmVkID0gZmFsc2U7IC8vIHNldCB0byB0cnVlIGFmdGVyIGZpcnN0IHJlcXVpcmVkIGZpZWxkIGhhcyBiZWVuIHByb2Nlc3NlZAorCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgYm9vbCBudWxsX2FsbG93ZWQgPSB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgYm9vbCBpc19vcHRpb25hbCA9ICgoKmZfaXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKTsKKyAgICBpZiAobnVsbF9hbGxvd2VkKSB7CisgICAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJpZiAoU2VsZi4iIDw8IHByb3BfbmFtZSgoKmZfaXRlciksIGlzX2V4Y2VwdGlvbikgPDwgIiA8PiBuaWwpIjsKKyAgICAgIGlmIChpc19vcHRpb25hbCkgeworICAgICAgICBvdXQgPDwgIiBhbmQgX19pc3NldF8iIDw8IHByb3BfbmFtZSgqZl9pdGVyLCBpc19leGNlcHRpb24pOworICAgICAgfQorICAgICAgb3V0IDw8ICIgdGhlbiBiZWdpbiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cF9pbXBsKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChpc19vcHRpb25hbCkgeworICAgICAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJpZiAoX19pc3NldF8iIDw8IHByb3BfbmFtZSgqZl9pdGVyLCBpc19leGNlcHRpb24pIDw8ICIpIHRoZW4gYmVnaW4iCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodXNlRmlyc3RGbGFnICYmICghaGFkX3JlcXVpcmVkKSkgeworICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiaWYgbm90ICIgPDwgdG1wX2ZpcnN0IDw8ICIgdGhlbiAiIDw8IHRtcF9zYiA8PCAiLkFwcGVuZCgnLCcpOyIgPDwgZW5kbDsKKyAgICAgIGlmIChpc19vcHRpb25hbCkgeworICAgICAgICBpbmRlbnRfaW1wbChvdXQpIDw8IHRtcF9maXJzdCA8PCAiIDo9IEZBTFNFOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudF9pbXBsKG91dCkgPDwgdG1wX3NiIDw8ICIuQXBwZW5kKCciIDw8IHByb3BfbmFtZSgoKmZfaXRlciksIGlzX2V4Y2VwdGlvbikgPDwgIjogJyk7IgorICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnRfaW1wbChvdXQpIDw8IHRtcF9zYiA8PCAiLkFwcGVuZCgnLCAiIDw8IHByb3BfbmFtZSgoKmZfaXRlciksIGlzX2V4Y2VwdGlvbikgPDwgIjogJyk7IgorICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0KKworICAgIHRfdHlwZSogdHR5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgd2hpbGUgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICAgIHR0eXBlID0gKCh0X3R5cGVkZWYqKXR0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgICB9CisKKyAgICBpZiAodHR5cGUtPmlzX3hjZXB0aW9uKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpKSB7CisgICAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJpZiAoU2VsZi4iIDw8IHByb3BfbmFtZSgoKmZfaXRlciksIGlzX2V4Y2VwdGlvbikgPDwgIiA9IG5pbCkgdGhlbiAiIDw8IHRtcF9zYgorICAgICAgICAgICAgICAgICAgICAgICA8PCAiLkFwcGVuZCgnPG51bGw+JykgZWxzZSAiIDw8IHRtcF9zYiA8PCAiLkFwcGVuZCggU2VsZi4iCisgICAgICAgICAgICAgICAgICAgICAgIDw8IHByb3BfbmFtZSgoKmZfaXRlciksIGlzX2V4Y2VwdGlvbikgPDwgIi5Ub1N0cmluZygpKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBpbmRlbnRfaW1wbChvdXQpIDw8IHRtcF9zYiA8PCAiLkFwcGVuZChTeXN0ZW0uSW50ZWdlciggU2VsZi4iIDw8IHByb3BfbmFtZSgoKmZfaXRlciksIGlzX2V4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIikpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCB0bXBfc2IgPDwgIi5BcHBlbmQoIFNlbGYuIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpLCBpc19leGNlcHRpb24pIDw8ICIpOyIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpZiAobnVsbF9hbGxvd2VkIHx8IGlzX29wdGlvbmFsKSB7CisgICAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsOworICAgIH0KKworICAgIGlmICghaXNfb3B0aW9uYWwpIHsKKyAgICAgIGhhZF9yZXF1aXJlZCA9IHRydWU7IC8vIG5vdyBfX2ZpcnN0IG11c3QgYmUgZmFsc2UsIHNvIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgaXQgYW55bW9yZQorICAgIH0KKyAgfQorCisgIGluZGVudF9pbXBsKG91dCkgPDwgdG1wX3NiIDw8ICIuQXBwZW5kKCcpJyk7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJSZXN1bHQgOj0gIiA8PCB0bXBfc2IgPDwgIi5Ub1N0cmluZzsiIDw8IGVuZGw7CisgIGlmICh1c2VGaXJzdEZsYWcpIHsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJpZiAiIDw8IHRtcF9maXJzdCA8PCAiIHRoZW4ge3ByZXZlbnQgd2FybmluZ307IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJmaW5hbGx5IiA8PCBlbmRsOworICBpbmRlbnRfdXBfaW1wbCgpOworICBpbmRlbnRfaW1wbChvdXQpIDw8IHRtcF9zYiA8PCAiLkZyZWU7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bl9pbXBsKCk7CisgIGluZGVudF9pbXBsKG91dCkgPDwgImVuZDsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd25faW1wbCgpOworICBpbmRlbnRfaW1wbChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK2Jvb2wgdF9kZWxwaGlfZ2VuZXJhdG9yOjppc192b2lkKHRfdHlwZSogdHlwZSkgeworICB3aGlsZSAodHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgdHlwZSA9ICgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBpZiAodGJhc2UgPT0gdF9iYXNlX3R5cGU6OlRZUEVfVk9JRCkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisgIHJldHVybiBmYWxzZTsKK30KKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUigKKyAgICBkZWxwaGksCisgICAgImRlbHBoaSIsCisgICAgIiAgICBhbnNpc3RyX2JpbmFyeTogIFVzZSBBbnNpU3RyaW5nIGZvciBiaW5hcnkgZGF0YXR5cGUgKGRlZmF1bHQgaXMgVEJ5dGVzKS5cbiIKKyAgICAiICAgIHJlZ2lzdGVyX3R5cGVzOiAgRW5hYmxlIFR5cGVSZWdpc3RyeSwgYWxsb3dzIGZvciBjcmVhdGlvbiBvZiBzdHJ1Y3QsIHVuaW9uXG4iCisgICAgIiAgICAgICAgICAgICAgICAgICAgIGFuZCBjb250YWluZXIgaW5zdGFuY2VzIGJ5IGludGVyZmFjZSBvciBUeXBlSW5mbygpXG4iCisgICAgIiAgICBjb25zdHByZWZpeDogICAgIE5hbWUgVENvbnN0YW50cyBjbGFzc2VzIGFmdGVyIElETCB0byByZWR1Y2UgYW1iaWd1aXRpZXNcbiIKKyAgICAiICAgIGV2ZW50czogICAgICAgICAgRW5hYmxlIGFuZCB1c2UgcHJvY2Vzc2luZyBldmVudHMgaW4gdGhlIGdlbmVyYXRlZCBjb2RlLlxuIgorICAgICIgICAgeG1sZG9jOiAgICAgICAgICBFbmFibGUgWE1MRG9jIGNvbW1lbnRzIGZvciBIZWxwIEluc2lnaHQgZXRjLlxuIgorICAgICIgICAgYXN5bmM6ICAgICAgICAgICBHZW5lcmF0ZSBJQXN5bmMgaW50ZXJmYWNlIHRvIHVzZSBQYXJhbGxlbCBQcm9ncmFtbWluZyBMaWJyYXJ5IChYRTcrIG9ubHkpLlxuIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZXJsX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZXJsX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmQ5MWE3Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9lcmxfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsMTI4MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvdmVyc2lvbi5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b2ZzdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworCisvKioKKyAqIEVybGFuZyBjb2RlIGdlbmVyYXRvci4KKyAqCisgKi8KK2NsYXNzIHRfZXJsX2dlbmVyYXRvciA6IHB1YmxpYyB0X2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfZXJsX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIGxlZ2FjeV9uYW1lc18gPSBmYWxzZTsKKyAgICBtYXBzXyA9IGZhbHNlOworICAgIG90cDE2XyA9IGZhbHNlOworICAgIGV4cG9ydF9saW5lc19maXJzdF8gPSB0cnVlOworICAgIGV4cG9ydF90eXBlc19saW5lc19maXJzdF8gPSB0cnVlOworCisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibGVnYWN5bmFtZXMiKSA9PSAwKSB7CisgICAgICAgIGxlZ2FjeV9uYW1lc18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJtYXBzIikgPT0gMCkgeworICAgICAgICBtYXBzXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoIm90cDE2IikgPT0gMCkgeworICAgICAgICBvdHAxNl8gPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIGVybDoiICsgaXRlci0+Zmlyc3Q7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKG1hcHNfICYmIG90cDE2XykgeworICAgICAgdGhyb3cgImFyZ3VtZW50IGVycm9yOiBDYW5ub3Qgc3BlY2lmeSBib3RoIG1hcHMgYW5kIG90cDE2OyBtYXBzIGFyZSBub3QgYXZhaWxhYmxlIGZvciBFcmxhbmcvT1RQIFIxNiBvciBvbGRlciI7CisgICAgfQorCisgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tZXJsIjsKKyAgfQorCisgIC8qKgorICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCisgICAqLworCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICAvKioKKyAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9tZW1iZXJfdHlwZShzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlKTsKKyAgdm9pZCBnZW5lcmF0ZV9tZW1iZXJfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworCisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9tZW1iZXJfdHlwZSh0X2ZpZWxkKiBmaWVsZCk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9tZW1iZXJfdmFsdWUodF9maWVsZCogZmllbGQpOworICBzdGQ6OnN0cmluZyByZW5kZXJfbWVtYmVyX3JlcXVpcmVkbmVzcyh0X2ZpZWxkKiBmaWVsZCk7CisKKyAgLy8gIHN0ZDo6c3RyaW5nIHJlbmRlcl9kZWZhdWx0X3ZhbHVlKHRfdHlwZSogdHlwZSk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9kZWZhdWx0X3ZhbHVlKHRfZmllbGQqIGZpZWxkKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworICBzdGQ6OnN0cmluZyByZW5kZXJfdHlwZV90ZXJtKHRfdHlwZSogdHR5cGUsIGJvb2wgZXhwYW5kX3N0cnVjdHMsIGJvb2wgZXh0ZW5kZWRfaW5mbyA9IGZhbHNlKTsKKworICAvKioKKyAgICogU3RydWN0IGdlbmVyYXRpb24gY29kZQorICAgKi8KKworICB2b2lkIGdlbmVyYXRlX2VybF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9lcmxfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9lcmxfc3RydWN0X21lbWJlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdG1lbWJlcik7CisgIHZvaWQgZ2VuZXJhdGVfZXJsX3N0cnVjdF9pbmZvKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZXJsX2V4dGVuZGVkX3N0cnVjdF9pbmZvKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZXJsX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV90eXBlX21ldGFkYXRhKHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX25hbWUsIHZlY3RvcjxzdHJpbmc+IG5hbWVzKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtX2luZm8odF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfZW51bV9tZXRhZGF0YSgpOworICB2b2lkIGdlbmVyYXRlX2NvbnN0X2Z1bmN0aW9uKHRfY29uc3QqIHRjb25zdCwgb3N0cmluZ3N0cmVhbSYgZXhwb3J0cywgb3N0cmluZ3N0cmVhbSYgZnVuY3Rpb25zKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdF9mdW5jdGlvbnMoKTsKKworICAvKioKKyAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX21ldGFkYXRhKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2luZm8odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKworICAvKioKKyAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKKyAgICovCisKKyAgc3RkOjpzdHJpbmcgZXJsX2F1dG9nZW5fY29tbWVudCgpOworICBzdGQ6OnN0cmluZyBlcmxfaW1wb3J0cygpOworICBzdGQ6OnN0cmluZyByZW5kZXJfaW5jbHVkZXMoKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfbGlzdF92YWx1ZXModF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfbW9kdWxlKHRfdHlwZSogdHR5cGUpOworCisgIHN0ZDo6c3RyaW5nIG1ha2Vfc2FmZV9mb3JfbW9kdWxlX25hbWUoc3RkOjpzdHJpbmcgaW4pIHsKKyAgICBpZiAobGVnYWN5X25hbWVzXykgeworICAgICAgcmV0dXJuIGRlY2FwaXRhbGl6ZShpbik7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiB1bmRlcnNjb3JlKGluKTsKKyAgICB9CisgIH0KKworICBzdGQ6OnN0cmluZyBhdG9taWZ5KHN0ZDo6c3RyaW5nIGluKSB7CisgICAgaWYgKGxlZ2FjeV9uYW1lc18pIHsKKyAgICAgIHJldHVybiAiJyIgKyBkZWNhcGl0YWxpemUoaW4pICsgIiciOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gIiciICsgaW4gKyAiJyI7CisgICAgfQorICB9CisKKyAgc3RkOjpzdHJpbmcgY29uc3RpZnkoc3RkOjpzdHJpbmcgaW4pIHsKKyAgICBpZiAobGVnYWN5X25hbWVzXykgeworICAgICAgcmV0dXJuIGNhcGl0YWxpemUoaW4pOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gdXBwZXJjYXNlKGluKTsKKyAgICB9CisgIH0KKworICBzdGF0aWMgc3RkOjpzdHJpbmcgY29tbWVudChzdHJpbmcgaW4pOworCitwcml2YXRlOgorICBib29sIGhhc19kZWZhdWx0X3ZhbHVlKHRfZmllbGQqKTsKKworICAvKiBpZiB0cnVlIHJldGFpbiBwcmUgMC45LjIgbmFtaW5nIHNjaGVtZSBmb3IgZnVuY3Rpb25zLCBhdG9tcyBhbmQgY29uc3RzICovCisgIGJvb2wgbGVnYWN5X25hbWVzXzsKKworICAvKiBpZiB0cnVlIHVzZSBtYXBzIGluc3RlYWQgb2YgZGljdHMgaW4gZ2VuZXJhdGVkIGNvZGUgKi8KKyAgYm9vbCBtYXBzXzsKKworICAvKiBpZiB0cnVlIHVzZSBub24tbmFtZXNwYWNlZCBkaWN0IGFuZCBzZXQgaW5zdGVhZCBvZiBkaWN0OmRpY3QgYW5kIHNldHM6c2V0ICovCisgIGJvb2wgb3RwMTZfOworCisgIC8qKgorICAgKiBhZGQgZnVuY3Rpb24gdG8gZXhwb3J0IGxpc3QKKyAgICovCisKKyAgdm9pZCBleHBvcnRfZnVuY3Rpb24odF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZXhwb3J0X3N0cmluZyhzdGQ6OnN0cmluZyBuYW1lLCBpbnQgbnVtKTsKKworICB2b2lkIGV4cG9ydF90eXBlc19zdHJpbmcoc3RkOjpzdHJpbmcgbmFtZSwgaW50IG51bSk7CisKKyAgLyoqCisgICAqIHdyaXRlIG91dCBoZWFkZXJzIGFuZCBmb290ZXJzIGZvciBocmwgZmlsZXMKKyAgICovCisKKyAgdm9pZCBocmxfaGVhZGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBuYW1lKTsKKyAgdm9pZCBocmxfZm9vdGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBuYW1lKTsKKworICAvKioKKyAgICogc3R1ZmYgdG8gc3BpdCBvdXQgYXQgdGhlIHRvcCBvZiBnZW5lcmF0ZWQgZmlsZXMKKyAgICovCisKKyAgYm9vbCBleHBvcnRfbGluZXNfZmlyc3RfOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gZXhwb3J0X2xpbmVzXzsKKworICBib29sIGV4cG9ydF90eXBlc19saW5lc19maXJzdF87CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBleHBvcnRfdHlwZXNfbGluZXNfOworCisgIC8qKgorICAgKiBGaWxlIHN0cmVhbXMKKyAgICovCisKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIGZfaW5mb187CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBmX2luZm9fZXh0XzsKKworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfdHlwZXNfZmlsZV87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl90eXBlc19ocmxfZmlsZV87CisKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2NvbnN0c19maWxlXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2NvbnN0c19ocmxfZmlsZV87CisKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIGZfc2VydmljZV87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zZXJ2aWNlX2ZpbGVfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZV9ocmxfOworCisgIC8qKgorICAgKiBNZXRhZGF0YSBjb250YWluZXJzCisgICAqLworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdl9zdHJ1Y3RfbmFtZXNfOworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdl9lbnVtX25hbWVzXzsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHZfZXhjZXB0aW9uX25hbWVzXzsKKyAgc3RkOjp2ZWN0b3I8dF9lbnVtKj4gdl9lbnVtc187CisgIHN0ZDo6dmVjdG9yPHRfY29uc3QqPiB2X2NvbnN0c187Cit9OworCisvKioKKyAqIFVJIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0CisgKiBzdHJlYW1zLgorICoKKyAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQorICovCit2b2lkIHRfZXJsX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQorICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworCisgIC8vIHNldHVwIGV4cG9ydCBsaW5lcworICBleHBvcnRfbGluZXNfZmlyc3RfID0gdHJ1ZTsKKyAgZXhwb3J0X3R5cGVzX2xpbmVzX2ZpcnN0XyA9IHRydWU7CisKKyAgc3RyaW5nIHByb2dyYW1fbW9kdWxlX25hbWUgPSBtYWtlX3NhZmVfZm9yX21vZHVsZV9uYW1lKHByb2dyYW1fbmFtZV8pOworCisgIC8vIHR5cGVzIGZpbGVzCisgIHN0cmluZyBmX3R5cGVzX25hbWUgPSBnZXRfb3V0X2RpcigpICsgcHJvZ3JhbV9tb2R1bGVfbmFtZSArICJfdHlwZXMuZXJsIjsKKyAgc3RyaW5nIGZfdHlwZXNfaHJsX25hbWUgPSBnZXRfb3V0X2RpcigpICsgcHJvZ3JhbV9tb2R1bGVfbmFtZSArICJfdHlwZXMuaHJsIjsKKworICBmX3R5cGVzX2ZpbGVfLm9wZW4oZl90eXBlc19uYW1lLmNfc3RyKCkpOworICBmX3R5cGVzX2hybF9maWxlXy5vcGVuKGZfdHlwZXNfaHJsX25hbWUuY19zdHIoKSk7CisKKyAgaHJsX2hlYWRlcihmX3R5cGVzX2hybF9maWxlXywgcHJvZ3JhbV9tb2R1bGVfbmFtZSArICJfdHlwZXMiKTsKKworICBmX3R5cGVzX2ZpbGVfIDw8IGVybF9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgIi1tb2R1bGUoIiA8PCBwcm9ncmFtX21vZHVsZV9uYW1lIDw8ICJfdHlwZXMpLiIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGVybF9pbXBvcnRzKCkgPDwgZW5kbDsKKworICBmX3R5cGVzX2ZpbGVfIDw8ICItaW5jbHVkZShcIiIgPDwgcHJvZ3JhbV9tb2R1bGVfbmFtZSA8PCAiX3R5cGVzLmhybFwiKS4iIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgZl90eXBlc19ocmxfZmlsZV8gPDwgcmVuZGVyX2luY2x1ZGVzKCkgPDwgZW5kbDsKKworICAvLyBjb25zdHMgZmlsZXMKKyAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBnZXRfb3V0X2RpcigpICsgcHJvZ3JhbV9tb2R1bGVfbmFtZSArICJfY29uc3RhbnRzLmVybCI7CisgIHN0cmluZyBmX2NvbnN0c19ocmxfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwcm9ncmFtX21vZHVsZV9uYW1lICsgIl9jb25zdGFudHMuaHJsIjsKKworICBmX2NvbnN0c19maWxlXy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7CisgIGZfY29uc3RzX2hybF9maWxlXy5vcGVuKGZfY29uc3RzX2hybF9uYW1lLmNfc3RyKCkpOworCisgIGZfY29uc3RzX2ZpbGVfIDw8IGVybF9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8ICItbW9kdWxlKCIgPDwgcHJvZ3JhbV9tb2R1bGVfbmFtZSA8PCAiX2NvbnN0YW50cykuIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGVybF9pbXBvcnRzKCkgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCAiLWluY2x1ZGUoXCIiIDw8IHByb2dyYW1fbW9kdWxlX25hbWUgPDwgIl90eXBlcy5ocmxcIikuIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgZl9jb25zdHNfaHJsX2ZpbGVfIDw8IGVybF9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8IGVybF9pbXBvcnRzKCkgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgPDwgIi1pbmNsdWRlKFwiIiA8PCBwcm9ncmFtX21vZHVsZV9uYW1lIDw8ICJfdHlwZXMuaHJsXCIpLiIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEJvaWxlcnBsYXRlIGF0IGJlZ2lubmluZyBhbmQgZW5kIG9mIGhlYWRlciBmaWxlcworICovCit2b2lkIHRfZXJsX2dlbmVyYXRvcjo6aHJsX2hlYWRlcihvc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lKSB7CisgIG91dCA8PCAiLWlmbmRlZihfIiA8PCBuYW1lIDw8ICJfaW5jbHVkZWQpLiIgPDwgZW5kbCA8PCAiLWRlZmluZShfIiA8PCBuYW1lIDw8ICJfaW5jbHVkZWQsIHllYWgpLiIKKyAgICAgIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpocmxfZm9vdGVyKG9zdHJlYW0mIG91dCwgc3RyaW5nIG5hbWUpIHsKKyAgKHZvaWQpbmFtZTsKKyAgb3V0IDw8ICItZW5kaWYuIiA8PCBlbmRsOworfQorCisvKioKKyAqIFJlbmRlcnMgYWxsIHRoZSBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgaW5jbHVkaW5nIGFub3RoZXIgVGhyaWZ0IHByb2dyYW0KKyAqLworc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6cmVuZGVyX2luY2x1ZGVzKCkgeworICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKKyAgICByZXN1bHQgKz0gIi1pbmNsdWRlKFwiIiArIG1ha2Vfc2FmZV9mb3JfbW9kdWxlX25hbWUoaW5jbHVkZXNbaV0tPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICsgIl90eXBlcy5ocmxcIikuXG4iOworICB9CisgIGlmIChpbmNsdWRlcy5zaXplKCkgPiAwKSB7CisgICAgcmVzdWx0ICs9ICJcbiI7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBBdXRvZ2VuJ2QgY29tbWVudAorICovCitzdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjplcmxfYXV0b2dlbl9jb21tZW50KCkgeworICByZXR1cm4gc3RkOjpzdHJpbmcoIiUlXG4iKSArICIlJSBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoIiArIFRIUklGVF9WRVJTSU9OICsgIilcbiIKKyAgICAgICAgICsgIiUlXG4iICsgIiUlIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkdcbiIKKyAgICAgICAgICsgIiUlXG4iOworfQorCisvKioKKyAqIENvbW1lbnQgb3V0IHRleHQKKyAqLworCitzdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjpjb21tZW50KHN0cmluZyBpbikgeworICBzaXplX3QgcG9zID0gMDsKKyAgaW4uaW5zZXJ0KHBvcywgIiUlICIpOworICB3aGlsZSAoKHBvcyA9IGluLmZpbmRfZmlyc3Rfb2YoJ1xuJywgcG9zKSkgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgaW4uaW5zZXJ0KCsrcG9zLCAiJSUgIik7CisgIH0KKyAgcmV0dXJuIGluOworfQorCisvKioKKyAqIFByaW50cyBzdGFuZGFyZCB0aHJpZnQgaW1wb3J0cworICovCitzdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjplcmxfaW1wb3J0cygpIHsKKyAgcmV0dXJuICIiOworfQorCisvKioKKyAqIENsb3NlcyB0aGUgdHlwZSBmaWxlcworICovCit2b2lkIHRfZXJsX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworCisgIGV4cG9ydF90eXBlc19zdHJpbmcoInN0cnVjdF9pbmZvIiwgMSk7CisgIGV4cG9ydF90eXBlc19zdHJpbmcoInN0cnVjdF9pbmZvX2V4dCIsIDEpOworICBleHBvcnRfdHlwZXNfc3RyaW5nKCJlbnVtX2luZm8iLCAxKTsKKyAgZXhwb3J0X3R5cGVzX3N0cmluZygiZW51bV9uYW1lcyIsIDApOworICBleHBvcnRfdHlwZXNfc3RyaW5nKCJzdHJ1Y3RfbmFtZXMiLCAwKTsKKyAgZXhwb3J0X3R5cGVzX3N0cmluZygiZXhjZXB0aW9uX25hbWVzIiwgMCk7CisKKyAgZl90eXBlc19maWxlXyA8PCAiLWV4cG9ydChbIiA8PCBleHBvcnRfdHlwZXNfbGluZXNfLnN0cigpIDw8ICJdKS4iIDw8IGVuZGwgPDwgZW5kbDsKKworICBmX3R5cGVzX2ZpbGVfIDw8IGZfaW5mb18uc3RyKCk7CisgIGZfdHlwZXNfZmlsZV8gPDwgInN0cnVjdF9pbmZvKF8pIC0+IGVybGFuZzplcnJvcihmdW5jdGlvbl9jbGF1c2UpLiIgPDwgZW5kbCA8PCBlbmRsOworCisgIGZfdHlwZXNfZmlsZV8gPDwgZl9pbmZvX2V4dF8uc3RyKCk7CisgIGZfdHlwZXNfZmlsZV8gPDwgInN0cnVjdF9pbmZvX2V4dChfKSAtPiBlcmxhbmc6ZXJyb3IoZnVuY3Rpb25fY2xhdXNlKS4iIDw8IGVuZGwgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9jb25zdF9mdW5jdGlvbnMoKTsKKworICBnZW5lcmF0ZV90eXBlX21ldGFkYXRhKCJzdHJ1Y3RfbmFtZXMiLCB2X3N0cnVjdF9uYW1lc18pOworICBnZW5lcmF0ZV9lbnVtX21ldGFkYXRhKCk7CisgIGdlbmVyYXRlX3R5cGVfbWV0YWRhdGEoImVudW1fbmFtZXMiLCB2X2VudW1fbmFtZXNfKTsKKyAgZ2VuZXJhdGVfdHlwZV9tZXRhZGF0YSgiZXhjZXB0aW9uX25hbWVzIiwgdl9leGNlcHRpb25fbmFtZXNfKTsKKworICBocmxfZm9vdGVyKGZfdHlwZXNfaHJsX2ZpbGVfLCBzdHJpbmcoIkJPR1VTIikpOworCisgIGZfdHlwZXNfZmlsZV8uY2xvc2UoKTsKKyAgZl90eXBlc19ocmxfZmlsZV8uY2xvc2UoKTsKKyAgZl9jb25zdHNfZmlsZV8uY2xvc2UoKTsKKyAgZl9jb25zdHNfaHJsX2ZpbGVfLmNsb3NlKCk7Cit9CisKK2NvbnN0IHN0ZDo6c3RyaW5nIGVtaXRfZG91YmxlX2FzX3N0cmluZyhjb25zdCBkb3VibGUgdmFsdWUpIHsKKyAgc3RkOjpzdHJpbmdzdHJlYW0gZG91YmxlX291dHB1dF9zdHJlYW07CisgIC8vIHNldHMgdGhlIG1heGltdW0gcHJlY2lzaW9uOiBodHRwOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9pby9tYW5pcC9zZXRwcmVjaXNpb24KKyAgLy8gc2V0cyB0aGUgb3V0cHV0IGZvcm1hdCB0byBmaXhlZDogaHR0cDovL2VuLmNwcHJlZmVyZW5jZS5jb20vdy9jcHAvaW8vbWFuaXAvZml4ZWQgKG5vdCBpbiBzY2llbnRpZmljIG5vdGF0aW9uKQorICBkb3VibGVfb3V0cHV0X3N0cmVhbSA8PCBzdGQ6OnNldHByZWNpc2lvbihzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmRpZ2l0czEwICsgMSk7CisKKyAgI2lmZGVmIF9NU0NfVkVSCisgICAgICAvLyBzdHJ0b2QgaXMgYnJva2VuIGluIE1TVkMgY29tcGlsZXJzIG9sZGVyIHRoYW4gMjAxNSwgc28gc3RkOjpmaXhlZCBmYWlscyB0byBmb3JtYXQgYSBkb3VibGUgbGl0ZXJhbC4KKyAgICAgIC8vIG1vcmUgZGV0YWlsczogaHR0cHM6Ly9ibG9ncy5tc2RuLm1pY3Jvc29mdC5jb20vdmNibG9nLzIwMTQvMDYvMTgvCisgICAgICAvLyAgICAgICAgICAgICAgIGMtcnVudGltZS1jcnQtZmVhdHVyZXMtZml4ZXMtYW5kLWJyZWFraW5nLWNoYW5nZXMtaW4tdmlzdWFsLXN0dWRpby0xNC1jdHAxLworICAgICAgLy8gICAgICAgICAgICAgICBhbmQKKyAgICAgIC8vICAgICAgICAgICAgICAgaHR0cDovL3d3dy5leHBsb3JpbmdiaW5hcnkuY29tL3Zpc3VhbC1jLXBsdXMtcGx1cy1zdHJ0b2Qtc3RpbGwtYnJva2VuLworICAgICAgI2lmIF9NU0NfVkVSID49IE1TQ18yMDE1X1ZFUgorICAgICAgICAgIGRvdWJsZV9vdXRwdXRfc3RyZWFtIDw8IHN0ZDo6Zml4ZWQ7CisgICAgICAjZWxzZQorICAgICAgICAgIC8vIG5vdGUgdGhhdCBpZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHRoZSBlcmxhbmcgZ2VuZXJhdG9yIGFuZCB0aGUgTVNWQyBjb21waWxlciBpcyBvbGRlciB0aGFuIDIwMTUsCisgICAgICAgICAgLy8gdGhlIGRvdWJsZSBsaXRlcmFsIG11c3QgYmUgb3V0cHV0IGluIHRoZSBzY2llbnRpZmljIGZvcm1hdC4gVGhlcmUgY2FuIGJlIHNvbWUgY2FzZXMgd2hlcmUgdGhlCisgICAgICAgICAgLy8gbWFudGlzc2Egb2YgdGhlIG91dHB1dCBkb2VzIG5vdCBoYXZlIGZyYWN0aW9uYWxzLCB3aGljaCBpcyBpbGxlZ2FsIGluIEVybGFuZy4KKyAgICAgICAgICAvLyBleGFtcGxlID0+IDEwMDAwMDAwMDAwMDAwMDAwLjAgYmVpbmcgb3V0cHV0IGFzIDFlKzE2CisgICAgICAgICAgZG91YmxlX291dHB1dF9zdHJlYW0gPDwgc3RkOjpzY2llbnRpZmljOworICAgICAgI2VuZGlmCisgICNlbHNlCisgICAgICBkb3VibGVfb3V0cHV0X3N0cmVhbSA8PCBzdGQ6OmZpeGVkOworICAjZW5kaWYKKworICBkb3VibGVfb3V0cHV0X3N0cmVhbSA8PCB2YWx1ZTsKKworICByZXR1cm4gZG91YmxlX291dHB1dF9zdHJlYW0uc3RyKCk7Cit9CisKK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlX21ldGFkYXRhKHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX25hbWUsIHZlY3RvcjxzdHJpbmc+IG5hbWVzKSB7CisgIHNpemVfdCBudW1fc3RydWN0cyA9IG5hbWVzLnNpemUoKTsKKworICBpbmRlbnQoZl90eXBlc19maWxlXykgPDwgZnVuY3Rpb25fbmFtZSA8PCAiKCkgLT5cbiI7CisgIGluZGVudF91cCgpOworICBpbmRlbnQoZl90eXBlc19maWxlXykgPDwgIlsiOworCisKKyAgZm9yKHNpemVfdCBpPTA7IGkgPCBudW1fc3RydWN0czsgaSsrKSB7CisgICAgZl90eXBlc19maWxlXyA8PCBuYW1lcy5hdChpKTsKKworICAgIGlmIChpIDwgbnVtX3N0cnVjdHMgLSAxKSB7CisgICAgICBmX3R5cGVzX2ZpbGVfIDw8ICIsICI7CisgICAgfQorICB9CisKKyAgZl90eXBlc19maWxlXyA8PCAiXS5cblxuIjsKKyAgaW5kZW50X2Rvd24oKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBubyBvcAorICoKKyAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgKHZvaWQpdHR5cGVkZWY7Cit9CisKKwordm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0X2Z1bmN0aW9uKHRfY29uc3QqIHRjb25zdCwgb3N0cmluZ3N0cmVhbSYgZXhwb3J0cywgb3N0cmluZ3N0cmVhbSYgZnVuY3Rpb25zKSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGNvbnN0LT5nZXRfdHlwZSgpKTsKKyAgc3RyaW5nIG5hbWUgPSB0Y29uc3QtPmdldF9uYW1lKCk7CisgIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gdGNvbnN0LT5nZXRfdmFsdWUoKTsKKworICBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgc3RyaW5nIGNvbnN0X2Z1bl9uYW1lID0gbG93ZXJjYXNlKG5hbWUpOworCisgICAgLy8gRW1pdCBjb25zdCBmdW5jdGlvbiBleHBvcnQuCisgICAgaWYgKGV4cG9ydHMudGVsbHAoKSA+IDApIHsgZXhwb3J0cyA8PCAiLCAiOyB9CisgICAgZXhwb3J0cyA8PCBjb25zdF9mdW5fbmFtZSA8PCAiLzEsICIgPDwgY29uc3RfZnVuX25hbWUgPDwgIi8yIjsKKworICAgIC8vIEVtaXQgY29uc3QgZnVuY3Rpb24gZGVmaW5pdGlvbi4KKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3IgaSwgZW5kID0gdmFsdWUtPmdldF9tYXAoKS5lbmQoKTsKKyAgICAvLyBUaGUgb25lLWFyZ3VtZW50IGZvcm0gdGhyb3dzIGFuIGVycm9yIGlmIHRoZSBrZXkgZG9lcyBub3QgZXhpc3QgaW4gdGhlIG1hcC4KKyAgICBmb3IgKGkgPSB2YWx1ZS0+Z2V0X21hcCgpLmJlZ2luKCk7IGkgIT0gZW5kOykgeworICAgICAgZnVuY3Rpb25zIDw8IGNvbnN0X2Z1bl9uYW1lIDw8ICIoIiA8PCByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIGktPmZpcnN0KSA8PCAiKSAtPiAiCisgICAgICAgICAgICAgICAgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHZ0eXBlLCBpLT5zZWNvbmQpOworICAgICAgKytpOworICAgICAgZnVuY3Rpb25zIDw8IChpICE9IGVuZCA/ICI7XG4iIDogIi5cblxuIik7CisgICAgfQorCisgICAgLy8gVGhlIHR3by1hcmd1bWVudCBmb3JtIHJldHVybnMgYSBkZWZhdWx0IHZhbHVlIGlmIHRoZSBrZXkgZG9lcyBub3QgZXhpc3QgaW4gdGhlIG1hcC4KKyAgICBmb3IgKGkgPSB2YWx1ZS0+Z2V0X21hcCgpLmJlZ2luKCk7IGkgIT0gZW5kOyArK2kpIHsKKyAgICAgIGZ1bmN0aW9ucyA8PCBjb25zdF9mdW5fbmFtZSA8PCAiKCIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGt0eXBlLCBpLT5maXJzdCkgPDwgIiwgXykgLT4gIgorICAgICAgICAgICAgICAgIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgaS0+c2Vjb25kKSA8PCAiO1xuIjsKKyAgICB9CisgICAgZnVuY3Rpb25zIDw8IGNvbnN0X2Z1bl9uYW1lIDw8ICIoXywgRGVmYXVsdCkgLT4gRGVmYXVsdC5cblxuIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICBzdHJpbmcgY29uc3RfZnVuX25hbWUgPSBsb3dlcmNhc2UobmFtZSk7CisKKyAgICBpZiAoZXhwb3J0cy50ZWxscCgpID4gMCkgeyBleHBvcnRzIDw8ICIsICI7IH0KKyAgICBleHBvcnRzIDw8IGNvbnN0X2Z1bl9uYW1lIDw8ICIvMSwgIiA8PCBjb25zdF9mdW5fbmFtZSA8PCAiLzIiOworCisgICAgc2l6ZV90IGxpc3Rfc2l6ZSA9IHZhbHVlLT5nZXRfbGlzdCgpLnNpemUoKTsKKyAgICBzdHJpbmcgcmVuZGVyZWRfbGlzdCA9IHJlbmRlcl9jb25zdF9saXN0X3ZhbHVlcyh0eXBlLCB2YWx1ZSk7CisgICAgZnVuY3Rpb25zIDw8IGNvbnN0X2Z1bl9uYW1lIDw8ICIoTikgd2hlbiBOID49IDEsIE4gPTwgIiA8PCBsaXN0X3NpemUgPDwgIiAtPlxuIgorICAgICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImVsZW1lbnQoTiwgeyIgPDwgcmVuZGVyZWRfbGlzdCA8PCAifSkuXG4iOworICAgIGZ1bmN0aW9ucyA8PCBjb25zdF9mdW5fbmFtZSA8PCAiKE4sIF8pIHdoZW4gTiA+PSAxLCBOID08ICIgPDwgbGlzdF9zaXplIDw8ICIgLT5cbiIKKyAgICAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJlbGVtZW50KE4sIHsiIDw8IHJlbmRlcmVkX2xpc3QgPDwgIn0pO1xuIgorICAgICAgICAgICAgICA8PCBjb25zdF9mdW5fbmFtZSA8PCAiKF8sIERlZmF1bHQpIC0+IERlZmF1bHQuXG5cbiI7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorfQorCit2b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RfZnVuY3Rpb25zKCkgeworICBvc3RyaW5nc3RyZWFtIGV4cG9ydHM7CisgIG9zdHJpbmdzdHJlYW0gZnVuY3Rpb25zOworICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gdl9jb25zdHNfLmJlZ2luKCk7IGNfaXRlciAhPSB2X2NvbnN0c18uZW5kKCk7ICsrY19pdGVyKSB7CisgICAgZ2VuZXJhdGVfY29uc3RfZnVuY3Rpb24oKmNfaXRlciwgZXhwb3J0cywgZnVuY3Rpb25zKTsKKyAgfQorICBpZiAoZXhwb3J0cy50ZWxscCgpID4gMCkgeworICAgIGZfY29uc3RzX2ZpbGVfIDw8ICItZXhwb3J0KFsiIDw8IGV4cG9ydHMuc3RyKCkgPDwgIl0pLlxuXG4iCisgICAgICAgICAgICAgICAgICAgPDwgZnVuY3Rpb25zLnN0cigpOworICB9Cit9CisKKworLyoqCisgKiBHZW5lcmF0ZXMgY29kZSBmb3IgYW4gZW51bWVyYXRlZCB0eXBlLiBEb25lIHVzaW5nIGEgY2xhc3MgdG8gc2NvcGUKKyAqIHRoZSB2YWx1ZXMuCisgKgorICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgorICovCit2b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKKworICB2X2VudW1zXy5wdXNoX2JhY2sodGVudW0pOworICB2X2VudW1fbmFtZXNfLnB1c2hfYmFjayhhdG9taWZ5KHRlbnVtLT5nZXRfbmFtZSgpKSk7CisKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworICAgIHN0cmluZyBuYW1lID0gKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIGluZGVudChmX3R5cGVzX2hybF9maWxlXykgPDwgIi1kZWZpbmUoIiA8PCBjb25zdGlmeShtYWtlX3NhZmVfZm9yX21vZHVsZV9uYW1lKHByb2dyYW1fbmFtZV8pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIl8iIDw8IGNvbnN0aWZ5KHRlbnVtLT5nZXRfbmFtZSgpKSA8PCAiXyIgPDwgY29uc3RpZnkobmFtZSkgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgdmFsdWUgPDwgIikuIiA8PCBlbmRsOworICB9CisKKyAgZl90eXBlc19ocmxfZmlsZV8gPDwgZW5kbDsKK30KKwordm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW1faW5mbyh0X2VudW0qIHRlbnVtKXsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHNpemVfdCBudW1fY29uc3RhbnRzID0gY29uc3RhbnRzLnNpemUoKTsKKworICBpbmRlbnQoZl90eXBlc19maWxlXykgPDwgImVudW1faW5mbygiIDw8IGF0b21pZnkodGVudW0tPmdldF9uYW1lKCkpIDw8ICIpIC0+XG4iOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KGZfdHlwZXNfZmlsZV8pIDw8ICJbXG4iOworCisgIGZvcihzaXplX3QgaT0wOyBpIDwgbnVtX2NvbnN0YW50czsgaSsrKSB7CisgICAgaW5kZW50X3VwKCk7CisgICAgdF9lbnVtX3ZhbHVlKiB2YWx1ZSA9IGNvbnN0YW50cy5hdChpKTsKKyAgICBpbmRlbnQoZl90eXBlc19maWxlXykgPDwgInsiIDw8IGF0b21pZnkodmFsdWUtPmdldF9uYW1lKCkpIDw8ICIsICIgPDwgdmFsdWUtPmdldF92YWx1ZSgpIDw8ICJ9IjsKKworICAgIGlmIChpIDwgbnVtX2NvbnN0YW50cyAtIDEpIHsKKyAgICAgIGZfdHlwZXNfZmlsZV8gPDwgIixcbiI7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgIH0KKyAgZl90eXBlc19maWxlXyA8PCAiXG4iOworICBpbmRlbnQoZl90eXBlc19maWxlXykgPDwgIl07XG5cbiI7CisgIGluZGVudF9kb3duKCk7Cit9CisKK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtX21ldGFkYXRhKCkgeworICBzaXplX3QgZW51bV9jb3VudCA9IHZfZW51bXNfLnNpemUoKTsKKworICBmb3Ioc2l6ZV90IGk9MDsgaSA8IGVudW1fY291bnQ7IGkrKykgeworICAgIHRfZW51bSogdGVudW0gPSB2X2VudW1zXy5hdChpKTsKKyAgICBnZW5lcmF0ZV9lbnVtX2luZm8odGVudW0pOworICB9CisKKyAgaW5kZW50KGZfdHlwZXNfZmlsZV8pIDw8ICJlbnVtX2luZm8oXykgLT4gZXJsYW5nOmVycm9yKGZ1bmN0aW9uX2NsYXVzZSkuXG5cbiI7Cit9CisKKy8qKgorICogR2VuZXJhdGUgYSBjb25zdGFudCB2YWx1ZQorICovCit2b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7CisgIHRfdHlwZSogdHlwZSA9IHRjb25zdC0+Z2V0X3R5cGUoKTsKKyAgc3RyaW5nIG5hbWUgPSB0Y29uc3QtPmdldF9uYW1lKCk7CisgIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gdGNvbnN0LT5nZXRfdmFsdWUoKTsKKworICAvLyBTYXZlIHRoZSB0Y29uc3Qgc28gdGhhdCBmdW5jdGlvbiBjYW4gYmUgZW1pdHRlZCBpbiBnZW5lcmF0ZV9jb25zdF9mdW5jdGlvbnMoKS4KKyAgdl9jb25zdHNfLnB1c2hfYmFjayh0Y29uc3QpOworCisgIGZfY29uc3RzX2hybF9maWxlXyA8PCAiLWRlZmluZSgiIDw8IGNvbnN0aWZ5KG1ha2Vfc2FmZV9mb3JfbW9kdWxlX25hbWUocHJvZ3JhbV9uYW1lXykpIDw8ICJfIgorICAgICAgICAgICAgICAgICAgICAgPDwgY29uc3RpZnkobmFtZSkgPDwgIiwgIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpIDw8ICIpLiIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZworICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKKyAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCisgKi8KK3N0cmluZyB0X2VybF9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBvdXQgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgb3V0IDw8ICh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDAgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIG91dCA8PCAiZmxvYXQoIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiKSI7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgZW1pdF9kb3VibGVfYXNfc3RyaW5nKHZhbHVlLT5nZXRfZG91YmxlKCkpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBvdXQgPDwgIiMiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAieyI7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7CisgICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOworICAgICAgfQorCisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCAiLCI7CisgICAgICB9CisgICAgICBvdXQgPDwgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOworICAgICAgb3V0IDw8ICIgPSAiOworICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisKKyAgICBpZiAobWFwc18pIHsKKyAgICAgIG91dCA8PCAibWFwczpmcm9tX2xpc3QoWyI7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiZGljdDpmcm9tX2xpc3QoWyI7CisgICAgfQorICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciBpLCBlbmQgPSB2YWx1ZS0+Z2V0X21hcCgpLmVuZCgpOworICAgIGZvciAoaSA9IHZhbHVlLT5nZXRfbWFwKCkuYmVnaW4oKTsgaSAhPSBlbmQ7KSB7CisgICAgICBvdXQgPDwgInsiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgaS0+Zmlyc3QpIDw8ICIsIgorICAgICAgICAgIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgaS0+c2Vjb25kKSA8PCAifSI7CisgICAgICBpZiAoKytpICE9IGVuZCkgeworICAgICAgICBvdXQgPDwgIiwiOworICAgICAgfQorICAgIH0KKyAgICBvdXQgPDwgIl0pIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIG91dCA8PCAic2V0czpmcm9tX2xpc3QoWyI7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IgaSwgZW5kID0gdmFsdWUtPmdldF9saXN0KCkuZW5kKCk7CisgICAgZm9yIChpID0gdmFsdWUtPmdldF9saXN0KCkuYmVnaW4oKTsgaSAhPSBlbmQ7KSB7CisgICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqaSk7CisgICAgICBpZiAoKytpICE9IGVuZCkgeworICAgICAgICBvdXQgPDwgIiwiOworICAgICAgfQorICAgIH0KKyAgICBvdXQgPDwgIl0pIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICBvdXQgPDwgIlsiIDw8IHJlbmRlcl9jb25zdF9saXN0X3ZhbHVlcyh0eXBlLCB2YWx1ZSkgPDwgIl0iOworICB9IGVsc2UgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgQ09OU1RBTlQgRk9SIFRZUEU6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworICB9CisgIHJldHVybiBvdXQuc3RyKCk7Cit9CisKK3N0cmluZyB0X2VybF9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF9saXN0X3ZhbHVlcyh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisgIHRfdHlwZSogZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiLCI7CisgICAgfQorICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpOworICB9CisgIHJldHVybiBvdXQuc3RyKCk7Cit9CisKKworc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6cmVuZGVyX2RlZmF1bHRfdmFsdWUodF9maWVsZCogZmllbGQpIHsKKyAgdF90eXBlKiB0eXBlID0gZmllbGQtPmdldF90eXBlKCk7CisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICIjIiArIHR5cGVfbmFtZSh0eXBlKSArICJ7fSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpZiAobWFwc18pIHsKKyAgICAgIHJldHVybiAiI3t9IjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuICJkaWN0Om5ldygpIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gInNldHM6bmV3KCkiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiW10iOworICB9IGVsc2UgeworICAgIHJldHVybiAidW5kZWZpbmVkIjsKKyAgfQorfQorCitzdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjpyZW5kZXJfbWVtYmVyX3R5cGUodF9maWVsZCogZmllbGQpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSk7CisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gInN0cmluZygpIHwgYmluYXJ5KCkiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiYm9vbGVhbigpIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJpbnRlZ2VyKCkiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJmbG9hdCgpIjsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiB1bnN1cHBvcnRlZCBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiaW50ZWdlcigpIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuIHR5cGVfbmFtZSh0eXBlKSArICIoKSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpZiAobWFwc18pIHsKKyAgICAgIHJldHVybiAibWFwKCkiOworICAgIH0gZWxzZSBpZiAob3RwMTZfKSB7CisgICAgICByZXR1cm4gImRpY3QoKSI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAiZGljdDpkaWN0KCkiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIGlmIChvdHAxNl8pIHsKKyAgICAgIHJldHVybiAic2V0KCkiOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gInNldHM6c2V0KCkiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gImxpc3QoKSI7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiB1bnN1cHBvcnRlZCB0eXBlICIgKyB0eXBlLT5nZXRfbmFtZSgpOworICB9Cit9CisKK3N0cmluZyB0X2VybF9nZW5lcmF0b3I6OnJlbmRlcl9tZW1iZXJfcmVxdWlyZWRuZXNzKHRfZmllbGQqIGZpZWxkKSB7CisgIHN3aXRjaCAoZmllbGQtPmdldF9yZXEoKSkgeworICBjYXNlIHRfZmllbGQ6OlRfUkVRVUlSRUQ6CisgICAgcmV0dXJuICJyZXF1aXJlZCI7CisgIGNhc2UgdF9maWVsZDo6VF9PUFRJT05BTDoKKyAgICByZXR1cm4gIm9wdGlvbmFsIjsKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gInVuZGVmaW5lZCI7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QKKyAqLwordm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICB2X3N0cnVjdF9uYW1lc18ucHVzaF9iYWNrKHR5cGVfbmFtZSh0c3RydWN0KSk7CisgIGdlbmVyYXRlX2VybF9zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBleGNlcHRpb24uIEJhc2ljYWxseSB0aGUgc2FtZQorICogYXMgYSBzdHJ1Y3QgYnV0IGV4dGVuZHMgdGhlIEV4Y2VwdGlvbiBjbGFzcy4KKyAqCisgKiBAcGFyYW0gdHhjZXB0aW9uIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICB2X2V4Y2VwdGlvbl9uYW1lc18ucHVzaF9iYWNrKHR5cGVfbmFtZSh0eGNlcHRpb24pKTsKKyAgZ2VuZXJhdGVfZXJsX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdAorICovCit2b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZXJsX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKKyAgKHZvaWQpaXNfZXhjZXB0aW9uOworICBnZW5lcmF0ZV9lcmxfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc19ocmxfZmlsZV8sIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9lcmxfc3RydWN0X2luZm8oZl9pbmZvXywgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2VybF9leHRlbmRlZF9zdHJ1Y3RfaW5mbyhmX2luZm9fZXh0XywgdHN0cnVjdCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VybF9zdHJ1Y3RfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICIlJSBzdHJ1Y3QgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgZW5kbCA8PCBlbmRsOworCisgIHN0ZDo6c3RyaW5nc3RyZWFtIGJ1ZjsKKyAgYnVmIDw8IGluZGVudCgpIDw8ICItcmVjb3JkKCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIsIHsiOworICBzdHJpbmcgZmllbGRfaW5kZW50KGJ1Zi5zdHIoKS5zaXplKCksICcgJyk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIGZvciAodmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTspIHsKKyAgICBnZW5lcmF0ZV9lcmxfc3RydWN0X21lbWJlcihidWYsICptX2l0ZXIpOworICAgIGlmICgrK21faXRlciAhPSBtZW1iZXJzLmVuZCgpKSB7CisgICAgICBidWYgPDwgIiwiIDw8IGVuZGwgPDwgZmllbGRfaW5kZW50OworICAgIH0KKyAgfQorICBidWYgPDwgIn0pLiI7CisKKyAgb3V0IDw8IGJ1Zi5zdHIoKSA8PCBlbmRsOworICBvdXQgPDwgIi10eXBlICIgKyB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigpIDo6ICMiICsgdHlwZV9uYW1lKHRzdHJ1Y3QpICsgInt9LiIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgcmVjb3JkIGZpZWxkIGRlZmluaXRpb24KKyAqLworCit2b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZXJsX3N0cnVjdF9tZW1iZXIob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0bWVtYmVyKSB7CisgIG91dCA8PCBhdG9taWZ5KHRtZW1iZXItPmdldF9uYW1lKCkpOworICBpZiAoaGFzX2RlZmF1bHRfdmFsdWUodG1lbWJlcikpCisgICAgb3V0IDw8ICIgPSAiIDw8IHJlbmRlcl9tZW1iZXJfdmFsdWUodG1lbWJlcik7CisgIG91dCA8PCAiIDo6ICIgPDwgcmVuZGVyX21lbWJlcl90eXBlKHRtZW1iZXIpOworICBpZiAodG1lbWJlci0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpCisgICAgb3V0IDw8ICIgfCAndW5kZWZpbmVkJyI7Cit9CisKK2Jvb2wgdF9lcmxfZ2VuZXJhdG9yOjpoYXNfZGVmYXVsdF92YWx1ZSh0X2ZpZWxkKiBmaWVsZCkgeworICB0X3R5cGUqIHR5cGUgPSBmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgaWYgKCFmaWVsZC0+Z2V0X3ZhbHVlKCkpIHsKKyAgICBpZiAoZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSB8fCB0eXBlLT5pc19tYXAoKSB8fCB0eXBlLT5pc19zZXQoKQorICAgICAgICAgIHx8IHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorfQorCitzdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjpyZW5kZXJfbWVtYmVyX3ZhbHVlKHRfZmllbGQqIGZpZWxkKSB7CisgIGlmICghZmllbGQtPmdldF92YWx1ZSgpKSB7CisgICAgcmV0dXJuIHJlbmRlcl9kZWZhdWx0X3ZhbHVlKGZpZWxkKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkLT5nZXRfdHlwZSgpLCBmaWVsZC0+Z2V0X3ZhbHVlKCkpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSByZWFkIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKKyAqLwordm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VybF9zdHJ1Y3RfaW5mbyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJzdHJ1Y3RfaW5mbygiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKSAtPiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCByZW5kZXJfdHlwZV90ZXJtKHRzdHJ1Y3QsIHRydWUpIDw8ICI7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgZW5kbDsKK30KKwordm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VybF9leHRlbmRlZF9zdHJ1Y3RfaW5mbyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJzdHJ1Y3RfaW5mb19leHQoIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIikgLT4iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgcmVuZGVyX3R5cGVfdGVybSh0c3RydWN0LCB0cnVlLCB0cnVlKSA8PCAiOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzZXJ2aWNlX25hbWVfID0gbWFrZV9zYWZlX2Zvcl9tb2R1bGVfbmFtZShzZXJ2aWNlX25hbWVfKTsKKworICBzdHJpbmcgZl9zZXJ2aWNlX2hybF9uYW1lID0gZ2V0X291dF9kaXIoKSArIHNlcnZpY2VfbmFtZV8gKyAiX3RocmlmdC5ocmwiOworICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBnZXRfb3V0X2RpcigpICsgc2VydmljZV9uYW1lXyArICJfdGhyaWZ0LmVybCI7CisgIGZfc2VydmljZV9maWxlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOworICBmX3NlcnZpY2VfaHJsXy5vcGVuKGZfc2VydmljZV9ocmxfbmFtZS5jX3N0cigpKTsKKworICAvLyBSZXNldCBzZXJ2aWNlIHRleHQgYWdncmVnYXRpbmcgc3RyZWFtIHN0cmVhbXMKKyAgZl9zZXJ2aWNlXy5zdHIoIiIpOworICBleHBvcnRfbGluZXNfLnN0cigiIik7CisgIGV4cG9ydF9saW5lc19maXJzdF8gPSB0cnVlOworCisgIGhybF9oZWFkZXIoZl9zZXJ2aWNlX2hybF8sIHNlcnZpY2VfbmFtZV8pOworCisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZl9zZXJ2aWNlX2hybF8gPDwgIi1pbmNsdWRlKFwiIgorICAgICAgICAgICAgICAgICAgIDw8IG1ha2Vfc2FmZV9mb3JfbW9kdWxlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgICAgPDwgIl90aHJpZnQuaHJsXCIpLiAlIGluaGVyaXQgIiA8PCBlbmRsOworICB9CisKKyAgZl9zZXJ2aWNlX2hybF8gPDwgIi1pbmNsdWRlKFwiIiA8PCBtYWtlX3NhZmVfZm9yX21vZHVsZV9uYW1lKHByb2dyYW1fbmFtZV8pIDw8ICJfdHlwZXMuaHJsXCIpLiIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSB0aHJlZSBtYWluIHBhcnRzIG9mIHRoZSBzZXJ2aWNlICh3ZWxsLCB0d28gZm9yIG5vdyBpbiBQSFApCisgIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7IC8vIGNwaXJvOiBOZXcgRXJsYW5nIE9yZGVyCisKKyAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOworCisgIGdlbmVyYXRlX3NlcnZpY2VfbWV0YWRhdGEodHNlcnZpY2UpOworCisgIC8vIGluZGVudF9kb3duKCk7CisKKyAgZl9zZXJ2aWNlX2ZpbGVfIDw8IGVybF9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8ICItbW9kdWxlKCIgPDwgc2VydmljZV9uYW1lXyA8PCAiX3RocmlmdCkuIgorICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCAiLWJlaGF2aW91cih0aHJpZnRfc2VydmljZSkuIiA8PCBlbmRsIDw8IGVuZGwgPDwgZXJsX2ltcG9ydHMoKSA8PCBlbmRsOworCisgIGZfc2VydmljZV9maWxlXyA8PCAiLWluY2x1ZGUoXCIiIDw8IG1ha2Vfc2FmZV9mb3JfbW9kdWxlX25hbWUodHNlcnZpY2UtPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgICA8PCAiX3RocmlmdC5ocmxcIikuIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZl9zZXJ2aWNlX2ZpbGVfIDw8ICItZXhwb3J0KFsiIDw8IGV4cG9ydF9saW5lc18uc3RyKCkgPDwgIl0pLiIgPDwgZW5kbCA8PCBlbmRsOworCisgIGZfc2VydmljZV9maWxlXyA8PCBmX3NlcnZpY2VfLnN0cigpOworCisgIGhybF9mb290ZXIoZl9zZXJ2aWNlX2hybF8sIGZfc2VydmljZV9uYW1lKTsKKworICAvLyBDbG9zZSBzZXJ2aWNlIGZpbGUKKyAgZl9zZXJ2aWNlX2ZpbGVfLmNsb3NlKCk7CisgIGZfc2VydmljZV9ocmxfLmNsb3NlKCk7Cit9CisKK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX21ldGFkYXRhKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgZXhwb3J0X3N0cmluZygiZnVuY3Rpb25fbmFtZXMiLCAwKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICBzaXplX3QgbnVtX2Z1bmN0aW9ucyA9IGZ1bmN0aW9ucy5zaXplKCk7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJmdW5jdGlvbl9uYW1lcygpIC0+ICIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiWyI7CisKKyAgZm9yIChzaXplX3QgaT0wOyBpIDwgbnVtX2Z1bmN0aW9uczsgaSsrKSB7CisgICAgdF9mdW5jdGlvbiogY3VycmVudCA9IGZ1bmN0aW9ucy5hdChpKTsKKyAgICBmX3NlcnZpY2VfIDw8IGF0b21pZnkoY3VycmVudC0+Z2V0X25hbWUoKSk7CisgICAgaWYgKGkgPCBudW1fZnVuY3Rpb25zIC0gMSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOworICAgIH0KKyAgfQorCisgIGZfc2VydmljZV8gPDwgIl0uXG5cbiI7CisgIGluZGVudF9kb3duKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGhlbHBlciBmdW5jdGlvbnMgZm9yIGEgc2VydmljZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIC8vICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKKyAgLy8gICIlIEhFTFBFUiBGVU5DVElPTlMgQU5EIFNUUlVDVFVSRVMiIDw8IGVuZGwgPDwgZW5kbDsKKworICBleHBvcnRfc3RyaW5nKCJzdHJ1Y3RfaW5mbyIsIDEpOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfZXJsX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCAic3RydWN0X2luZm8oXykgLT4gZXJsYW5nOmVycm9yKGZ1bmN0aW9uX2NsYXVzZSkuIiA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgorICovCit2b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZXJsX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgICh2b2lkKXRmdW5jdGlvbjsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGludGVyZmFjZSBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworCisgIGV4cG9ydF9zdHJpbmcoImZ1bmN0aW9uX2luZm8iLCAyKTsKKworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZl9zZXJ2aWNlXyA8PCAiJSUlIGludGVyZmFjZSIgPDwgZW5kbDsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIlICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7CisKKyAgICBnZW5lcmF0ZV9mdW5jdGlvbl9pbmZvKHRzZXJ2aWNlLCAqZl9pdGVyKTsKKyAgfQorCisgIC8vIEluaGVyaXRhbmNlIC0gcGFzcyB1bmtub3duIGZ1bmN0aW9ucyB0byBiYXNlIGNsYXNzCisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJmdW5jdGlvbl9pbmZvKEZ1bmN0aW9uLCBJbmZvVHlwZSkgLT4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IG1ha2Vfc2FmZV9mb3JfbW9kdWxlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICJfdGhyaWZ0OmZ1bmN0aW9uX2luZm8oRnVuY3Rpb24sIEluZm9UeXBlKS4iIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfSBlbHNlIHsKKyAgICAvLyByZXR1cm4gZnVuY3Rpb25fY2xhdXNlIGVycm9yIGZvciBub24tZXhpc3RlbnQgZnVuY3Rpb25zCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJmdW5jdGlvbl9pbmZvKF9GdW5jLCBfSW5mbykgLT4gZXJsYW5nOmVycm9yKGZ1bmN0aW9uX2NsYXVzZSkuIiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZnVuY3Rpb25faW5mbyhGdW5jdGlvbk5hbWUsIHBhcmFtc190eXBlKSBhbmQKKyAqIGZ1bmN0aW9uX2luZm8oRnVuY3Rpb25OYW1lLCByZXBseV90eXBlKQorICovCit2b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnVuY3Rpb25faW5mbyh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgKHZvaWQpdHNlcnZpY2U7CisgIHN0cmluZyBuYW1lX2F0b20gPSBhdG9taWZ5KHRmdW5jdGlvbi0+Z2V0X25hbWUoKSk7CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworCisgIC8vIGZ1bmN0aW9uX2luZm8oRnVuY3Rpb24sIHBhcmFtc190eXBlKToKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJmdW5jdGlvbl9pbmZvKCIgPDwgbmFtZV9hdG9tIDw8ICIsIHBhcmFtc190eXBlKSAtPiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8IHJlbmRlcl90eXBlX3Rlcm0oYXJnX3N0cnVjdCwgdHJ1ZSkgPDwgIjsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKworICAvLyBmdW5jdGlvbl9pbmZvKEZ1bmN0aW9uLCByZXBseV90eXBlKToKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJmdW5jdGlvbl9pbmZvKCIgPDwgbmFtZV9hdG9tIDw8ICIsIHJlcGx5X3R5cGUpIC0+IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKQorICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCByZW5kZXJfdHlwZV90ZXJtKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgZmFsc2UpIDw8ICI7IiA8PCBlbmRsOworICBlbHNlIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKQorICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAib25ld2F5X3ZvaWQ7IiA8PCBlbmRsOworICBlbHNlCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ7c3RydWN0LCBbXX0iCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICI7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIC8vIGZ1bmN0aW9uX2luZm8oRnVuY3Rpb24sIGV4Y2VwdGlvbnMpOgorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImZ1bmN0aW9uX2luZm8oIiA8PCBuYW1lX2F0b20gPDwgIiwgZXhjZXB0aW9ucykgLT4iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgcmVuZGVyX3R5cGVfdGVybSh4cywgdHJ1ZSkgPDwgIjsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJworICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCitzdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4KSB7CisgIHJldHVybiBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiKFRoaXMiCisgICAgICAgICArIGNhcGl0YWxpemUoYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpKSArICIpIjsKK30KKworLyoqCisgKiBBZGQgYSBmdW5jdGlvbiB0byB0aGUgZXhwb3J0cyBsaXN0CisgKi8KK3ZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpleHBvcnRfc3RyaW5nKHN0cmluZyBuYW1lLCBpbnQgbnVtKSB7CisgIGlmIChleHBvcnRfbGluZXNfZmlyc3RfKSB7CisgICAgZXhwb3J0X2xpbmVzX2ZpcnN0XyA9IGZhbHNlOworICB9IGVsc2UgeworICAgIGV4cG9ydF9saW5lc18gPDwgIiwgIjsKKyAgfQorICBleHBvcnRfbGluZXNfIDw8IG5hbWUgPDwgIi8iIDw8IG51bTsKK30KKwordm9pZCB0X2VybF9nZW5lcmF0b3I6OmV4cG9ydF90eXBlc19zdHJpbmcoc3RyaW5nIG5hbWUsIGludCBudW0pIHsKKyAgaWYgKGV4cG9ydF90eXBlc19saW5lc19maXJzdF8pIHsKKyAgICBleHBvcnRfdHlwZXNfbGluZXNfZmlyc3RfID0gZmFsc2U7CisgIH0gZWxzZSB7CisgICAgZXhwb3J0X3R5cGVzX2xpbmVzXyA8PCAiLCAiOworICB9CisgIGV4cG9ydF90eXBlc19saW5lc18gPDwgbmFtZSA8PCAiLyIgPDwgbnVtOworfQorCit2b2lkIHRfZXJsX2dlbmVyYXRvcjo6ZXhwb3J0X2Z1bmN0aW9uKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RyaW5nIHByZWZpeCkgeworICB0X3N0cnVjdDo6bWVtYmVyc190eXBlOjpzaXplX3R5cGUgbnVtID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpLnNpemUoKTsKKyAgaWYgKG51bSA+IHN0YXRpY19jYXN0PHRfc3RydWN0OjptZW1iZXJzX3R5cGU6OnNpemVfdHlwZT4oc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+KCkubWF4KCkpKSB7CisgICAgdGhyb3cgImludGVnZXIgb3ZlcmZsb3cgaW4gdF9lcmxfZ2VuZXJhdG9yOjpleHBvcnRfZnVuY3Rpb24sIG5hbWUgIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKTsKKyAgfQorICBleHBvcnRfc3RyaW5nKHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAxIC8vIFRoaXMKKyAgICAgICAgICAgICAgICArIHN0YXRpY19jYXN0PGludD4obnVtKSk7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZpZWxkIGxpc3QKKyAqLworc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICByZXN1bHQgKz0gIiwgIjsgLy8gaW5pdGlhbCBjb21tYSB0byBjb21wZW5zYXRlIGZvciBpbml0aWFsIFRoaXMKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICIsICI7CisgICAgfQorICAgIHJlc3VsdCArPSBjYXBpdGFsaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpIHsKKyAgc3RyaW5nIHByZWZpeCA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZXNwYWNlKCJlcmwiKTsKKyAgc2l6ZV90IHByZWZpeF9sZW5ndGggPSBwcmVmaXgubGVuZ3RoKCk7CisgIGlmIChwcmVmaXhfbGVuZ3RoID4gMCAmJiBwcmVmaXhbcHJlZml4X2xlbmd0aCAtIDFdICE9ICdfJykgeworICAgIHByZWZpeCArPSAnLic7CisgIH0KKworICBzdHJpbmcgbmFtZSA9IHR0eXBlLT5nZXRfbmFtZSgpOworCisgIHJldHVybiBhdG9taWZ5KHByZWZpeCArIG5hbWUpOworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgRXJsYW5nICJ0eXBlIiAobWFjcm8gZm9yIGludCBjb25zdGFudHMpCisgKi8KK3N0cmluZyB0X2VybF9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIj90VHlwZV9TVFJJTkciOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiP3RUeXBlX0JPT0wiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIj90VHlwZV9JOCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIj90VHlwZV9JMTYiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICI/dFR5cGVfSTMyIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiP3RUeXBlX0k2NCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIj90VHlwZV9ET1VCTEUiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIj90VHlwZV9JMzIiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIj90VHlwZV9TVFJVQ1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICI/dFR5cGVfTUFQIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiP3RUeXBlX1NFVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICI/dFR5cGVfTElTVCI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGUgYW4gRXJsYW5nIHRlcm0gd2hpY2ggcmVwcmVzZW50cyBhIHRocmlmdCB0eXBlCisgKi8KK3N0ZDo6c3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6cmVuZGVyX3R5cGVfdGVybSh0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBleHBhbmRfc3RydWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGV4dGVuZGVkX2luZm8pIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gInN0cmluZyI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJib29sIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJieXRlIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiaTE2IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiaTMyIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiaTY0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiZG91YmxlIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJpMzIiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBpZiAoZXhwYW5kX3N0cnVjdHMpIHsKKworICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gYnVmOworICAgICAgYnVmIDw8ICJ7c3RydWN0LCBbIjsKKyAgICAgIHN0cmluZyBmaWVsZF9pbmRlbnQoYnVmLnN0cigpLnNpemUoKSwgJyAnKTsKKworICAgICAgdF9zdHJ1Y3Q6Om1lbWJlcnNfdHlwZSBjb25zdCYgZmllbGRzID0gc3RhdGljX2Nhc3Q8dF9zdHJ1Y3QqPih0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICAgIHRfc3RydWN0OjptZW1iZXJzX3R5cGU6OmNvbnN0X2l0ZXJhdG9yIGksIGVuZCA9IGZpZWxkcy5lbmQoKTsKKyAgICAgIGZvciAoaSA9IGZpZWxkcy5iZWdpbigpOyBpICE9IGVuZDspIHsKKyAgICAgICAgdF9zdHJ1Y3Q6Om1lbWJlcnNfdHlwZTo6dmFsdWVfdHlwZSBtZW1iZXIgPSAqaTsKKyAgICAgICAgaW50MzJfdCBrZXkgPSBtZW1iZXItPmdldF9rZXkoKTsKKyAgICAgICAgc3RyaW5nIHR5cGUgPSByZW5kZXJfdHlwZV90ZXJtKG1lbWJlci0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKTsgLy8gcmVjdXJzaXZlIGNhbGwKKworICAgICAgICBpZiAoIWV4dGVuZGVkX2luZm8pIHsKKyAgICAgICAgICAvLyBDb252ZXJ0IHRvIGZvcm1hdDoge3N0cnVjdCwgW3tGaWQsIFR5cGV9fC4uLl19CisgICAgICAgICAgYnVmIDw8ICJ7IiA8PCBrZXkgPDwgIiwgIiA8PCB0eXBlIDw8ICJ9IjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBDb252ZXJ0IHRvIGZvcm1hdDoge3N0cnVjdCwgW3tGaWQsIFJlcSwgVHlwZSwgTmFtZSwgRGVmfXwuLi5dfQorICAgICAgICAgIHN0cmluZyBuYW1lID0gbWVtYmVyLT5nZXRfbmFtZSgpOworICAgICAgICAgIHN0cmluZyB2YWx1ZSA9IHJlbmRlcl9tZW1iZXJfdmFsdWUobWVtYmVyKTsKKyAgICAgICAgICBzdHJpbmcgcmVxdWlyZWRuZXNzID0gcmVuZGVyX21lbWJlcl9yZXF1aXJlZG5lc3MobWVtYmVyKTsKKyAgICAgICAgICBidWYgPDwgInsiIDw8IGtleSA8PCAiLCAiIDw8IHJlcXVpcmVkbmVzcyA8PCAiLCAiIDw8IHR5cGUgPDwgIiwgIiA8PCBhdG9taWZ5KG5hbWUpIDw8ICIsICIKKyAgICAgICAgICAgICAgPDwgdmFsdWUgPDwgIn0iOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCsraSAhPSBlbmQpIHsKKyAgICAgICAgICBidWYgPDwgIiwiIDw8IGVuZGwgPDwgZmllbGRfaW5kZW50OworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGJ1ZiA8PCAiXX0iIDw8IGVuZGw7CisgICAgICByZXR1cm4gYnVmLnN0cigpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gIntzdHJ1Y3QsIHsiICsgYXRvbWlmeSh0eXBlX21vZHVsZSh0eXBlKSkgKyAiLCAiICsgdHlwZV9uYW1lKHR5cGUpICsgIn19IjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICAvLyB7bWFwLCBLZXlUeXBlLCBWYWxUeXBlfQorICAgIHRfdHlwZSoga2V5X3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2YWxfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKworICAgIHJldHVybiAie21hcCwgIiArIHJlbmRlcl90eXBlX3Rlcm0oa2V5X3R5cGUsIGZhbHNlKSArICIsICIgKyByZW5kZXJfdHlwZV90ZXJtKHZhbF90eXBlLCBmYWxzZSkKKyAgICAgICAgICAgKyAifSI7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKworICAgIHJldHVybiAie3NldCwgIiArIHJlbmRlcl90eXBlX3Rlcm0oZWxlbV90eXBlLCBmYWxzZSkgKyAifSI7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworCisgICAgcmV0dXJuICJ7bGlzdCwgIiArIHJlbmRlcl90eXBlX3Rlcm0oZWxlbV90eXBlLCBmYWxzZSkgKyAifSI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK3N0ZDo6c3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6dHlwZV9tb2R1bGUodF90eXBlKiB0dHlwZSkgeworICByZXR1cm4gbWFrZV9zYWZlX2Zvcl9tb2R1bGVfbmFtZSh0dHlwZS0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKSkgKyAiX3R5cGVzIjsKK30KKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUigKKyAgICBlcmwsCisgICAgIkVybGFuZyIsCisgICAgIiAgICBsZWdhY3luYW1lczogT3V0cHV0IGZpbGVzIHJldGFpbiBuYW1pbmcgY29udmVudGlvbnMgb2YgVGhyaWZ0IDAuOS4xIGFuZCBlYXJsaWVyLlxuIgorICAgICIgICAgbWFwczogICAgICAgIEdlbmVyYXRlIG1hcHMgaW5zdGVhZCBvZiBkaWN0cy5cbiIKKyAgICAiICAgIG90cDE2OiAgICAgICBHZW5lcmF0ZSBub24tbmFtZXNwYWNlZCBkaWN0IGFuZCBzZXQgaW5zdGVhZCBvZiBkaWN0OmRpY3QgYW5kIHNldHM6c2V0LlxuIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EzZjVkZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsMjYyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaCIKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKKy8qKgorICogVG9wIGxldmVsIHByb2dyYW0gZ2VuZXJhdGlvbiBmdW5jdGlvbi4gQ2FsbHMgdGhlIGdlbmVyYXRvciBzdWJjbGFzcyBtZXRob2RzCisgKiBmb3IgcHJlcGFyaW5nIGZpbGUgc3RyZWFtcyBldGMuIHRoZW4gaXRlcmF0ZXMgb3ZlciBhbGwgdGhlIHBhcnRzIG9mIHRoZQorICogcHJvZ3JhbSB0byBwZXJmb3JtIHRoZSBjb3JyZWN0IGFjdGlvbnMuCisgKgorICogQHBhcmFtIHByb2dyYW0gVGhlIHRocmlmdCBwcm9ncmFtIHRvIGNvbXBpbGUgaW50byBDKysgc291cmNlCisgKi8KK3ZvaWQgdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2dyYW0oKSB7CisgIC8vIEluaXRpYWxpemUgdGhlIGdlbmVyYXRvcgorICBpbml0X2dlbmVyYXRvcigpOworCisgIC8vIEdlbmVyYXRlIGVudW1zCisgIHZlY3Rvcjx0X2VudW0qPiBlbnVtcyA9IHByb2dyYW1fLT5nZXRfZW51bXMoKTsKKyAgdmVjdG9yPHRfZW51bSo+OjppdGVyYXRvciBlbl9pdGVyOworICBmb3IgKGVuX2l0ZXIgPSBlbnVtcy5iZWdpbigpOyBlbl9pdGVyICE9IGVudW1zLmVuZCgpOyArK2VuX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9lbnVtKCplbl9pdGVyKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHR5cGVkZWZzCisgIHZlY3Rvcjx0X3R5cGVkZWYqPiB0eXBlZGVmcyA9IHByb2dyYW1fLT5nZXRfdHlwZWRlZnMoKTsKKyAgdmVjdG9yPHRfdHlwZWRlZio+OjppdGVyYXRvciB0ZF9pdGVyOworICBmb3IgKHRkX2l0ZXIgPSB0eXBlZGVmcy5iZWdpbigpOyB0ZF9pdGVyICE9IHR5cGVkZWZzLmVuZCgpOyArK3RkX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV90eXBlZGVmKCp0ZF9pdGVyKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHN0cnVjdHMsIGV4Y2VwdGlvbnMsIGFuZCB1bmlvbnMgaW4gZGVjbGFyZWQgb3JkZXIKKyAgdmVjdG9yPHRfc3RydWN0Kj4gb2JqZWN0cyA9IHByb2dyYW1fLT5nZXRfb2JqZWN0cygpOworCisgIHZlY3Rvcjx0X3N0cnVjdCo+OjppdGVyYXRvciBvX2l0ZXI7CisgIGZvciAob19pdGVyID0gb2JqZWN0cy5iZWdpbigpOyBvX2l0ZXIgIT0gb2JqZWN0cy5lbmQoKTsgKytvX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9mb3J3YXJkX2RlY2xhcmF0aW9uKCpvX2l0ZXIpOworICB9CisgIGZvciAob19pdGVyID0gb2JqZWN0cy5iZWdpbigpOyBvX2l0ZXIgIT0gb2JqZWN0cy5lbmQoKTsgKytvX2l0ZXIpIHsKKyAgICBpZiAoKCpvX2l0ZXIpLT5pc194Y2VwdGlvbigpKSB7CisgICAgICBnZW5lcmF0ZV94Y2VwdGlvbigqb19pdGVyKTsKKyAgICB9IGVsc2UgeworICAgICAgZ2VuZXJhdGVfc3RydWN0KCpvX2l0ZXIpOworICAgIH0KKyAgfQorCisgIC8vIEdlbmVyYXRlIGNvbnN0YW50cworICB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyA9IHByb2dyYW1fLT5nZXRfY29uc3RzKCk7CisgIGdlbmVyYXRlX2NvbnN0cyhjb25zdHMpOworCisgIC8vIEdlbmVyYXRlIHNlcnZpY2VzCisgIHZlY3Rvcjx0X3NlcnZpY2UqPiBzZXJ2aWNlcyA9IHByb2dyYW1fLT5nZXRfc2VydmljZXMoKTsKKyAgdmVjdG9yPHRfc2VydmljZSo+OjppdGVyYXRvciBzdl9pdGVyOworICBmb3IgKHN2X2l0ZXIgPSBzZXJ2aWNlcy5iZWdpbigpOyBzdl9pdGVyICE9IHNlcnZpY2VzLmVuZCgpOyArK3N2X2l0ZXIpIHsKKyAgICBzZXJ2aWNlX25hbWVfID0gZ2V0X3NlcnZpY2VfbmFtZSgqc3ZfaXRlcik7CisgICAgZ2VuZXJhdGVfc2VydmljZSgqc3ZfaXRlcik7CisgIH0KKworICAvLyBDbG9zZSB0aGUgZ2VuZXJhdG9yCisgIGNsb3NlX2dlbmVyYXRvcigpOworfQorCitzdGQ6OnNldDxzdGQ6OnN0cmluZz4gdF9nZW5lcmF0b3I6Omxhbmdfa2V5d29yZHMoKSBjb25zdCB7CisgIHN0ZDo6c3RyaW5nIGtleXdvcmRzW10gPSB7ICJCRUdJTiIsICJFTkQiLCAiX19DTEFTU19fIiwgIl9fRElSX18iLCAiX19GSUxFX18iLCAiX19GVU5DVElPTl9fIiwKKyAgICAgICJfX0xJTkVfXyIsICJfX01FVEhPRF9fIiwgIl9fTkFNRVNQQUNFX18iLCAiYWJzdHJhY3QiLCAiYWxpYXMiLCAiYW5kIiwgImFyZ3MiLCAiYXMiLAorICAgICAgImFzc2VydCIsICJiZWdpbiIsICJicmVhayIsICJjYXNlIiwgImNhdGNoIiwgImNsYXNzIiwgImNsb25lIiwgImNvbnRpbnVlIiwgImRlY2xhcmUiLAorICAgICAgImRlZiIsICJkZWZhdWx0IiwgImRlbCIsICJkZWxldGUiLCAiZG8iLCAiZHluYW1pYyIsICJlbGlmIiwgImVsc2UiLCAiZWxzZWlmIiwgImVsc2lmIiwKKyAgICAgICJlbmQiLCAiZW5kZGVjbGFyZSIsICJlbmRmb3IiLCAiZW5kZm9yZWFjaCIsICJlbmRpZiIsICJlbmRzd2l0Y2giLCAiZW5kd2hpbGUiLCAiZW5zdXJlIiwKKyAgICAgICJleGNlcHQiLCAiZXhlYyIsICJmaW5hbGx5IiwgImZsb2F0IiwgImZvciIsICJmb3JlYWNoIiwgImZyb20iLCAiZnVuY3Rpb24iLCAiZ2xvYmFsIiwKKyAgICAgICJnb3RvIiwgImlmIiwgImltcGxlbWVudHMiLCAiaW1wb3J0IiwgImluIiwgImlubGluZSIsICJpbnN0YW5jZW9mIiwgImludGVyZmFjZSIsICJpcyIsCisgICAgICAibGFtYmRhIiwgIm1vZHVsZSIsICJuYXRpdmUiLCAibmV3IiwgIm5leHQiLCAibmlsIiwgIm5vdCIsICJvciIsICJwYWNrYWdlIiwgInBhc3MiLAorICAgICAgInB1YmxpYyIsICJwcmludCIsICJwcml2YXRlIiwgInByb3RlY3RlZCIsICJyYWlzZSIsICJyZWRvIiwgInJlc2N1ZSIsICJyZXRyeSIsICJyZWdpc3RlciIsCisgICAgICAicmV0dXJuIiwgInNlbGYiLCAic2l6ZW9mIiwgInN0YXRpYyIsICJzdXBlciIsICJzd2l0Y2giLCAic3luY2hyb25pemVkIiwgInRoZW4iLCAidGhpcyIsCisgICAgICAidGhyb3ciLCAidHJhbnNpZW50IiwgInRyeSIsICJ1bmRlZiIsICJ1bmxlc3MiLCAidW5zaWduZWQiLCAidW50aWwiLCAidXNlIiwgInZhciIsCisgICAgICAidmlydHVhbCIsICJ2b2xhdGlsZSIsICJ3aGVuIiwgIndoaWxlIiwgIndpdGgiLCAieG9yIiwgInlpZWxkIiB9OworICByZXR1cm4gc3RkOjpzZXQ8c3RkOjpzdHJpbmc+KGtleXdvcmRzLCBrZXl3b3JkcyArIHNpemVvZihrZXl3b3Jkcykvc2l6ZW9mKGtleXdvcmRzWzBdKSApOworfQorCit2b2lkIHRfZ2VuZXJhdG9yOjp2YWxpZGF0ZV9pbnB1dCgpIGNvbnN0IHsKKyAgdmFsaWRhdGUocHJvZ3JhbV8tPmdldF9lbnVtcygpKTsKKyAgdmFsaWRhdGUocHJvZ3JhbV8tPmdldF90eXBlZGVmcygpKTsKKyAgdmFsaWRhdGUocHJvZ3JhbV8tPmdldF9vYmplY3RzKCkpOworICB2YWxpZGF0ZShwcm9ncmFtXy0+Z2V0X2NvbnN0cygpKTsKKyAgdmFsaWRhdGUocHJvZ3JhbV8tPmdldF9zZXJ2aWNlcygpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIHRfZ2VuZXJhdG9yOjp2YWxpZGF0ZShjb25zdCB2ZWN0b3I8VD4mIGxpc3QpIGNvbnN0eworICB0eXBlbmFtZSB2ZWN0b3I8VD46OmNvbnN0X2l0ZXJhdG9yIGl0OworICBmb3IoaXQ9bGlzdC5iZWdpbigpOyBpdCAhPSBsaXN0LmVuZCgpOyArK2l0KSB7CisgICAgICB2YWxpZGF0ZSgqaXQpOworICB9Cit9CisKK3ZvaWQgdF9nZW5lcmF0b3I6OnZhbGlkYXRlKHRfZnVuY3Rpb24gY29uc3QqIGYpIGNvbnN0IHsKKyAgdmFsaWRhdGVfaWQoZi0+Z2V0X25hbWUoKSk7CisgIHZhbGlkYXRlKGYtPmdldF9hcmdsaXN0KCkpOworICB2YWxpZGF0ZShmLT5nZXRfeGNlcHRpb25zKCkpOworfQorCit2b2lkIHRfZ2VuZXJhdG9yOjp2YWxpZGF0ZSh0X3NlcnZpY2UgY29uc3QqIHMpIGNvbnN0IHsKKyAgdmFsaWRhdGVfaWQocy0+Z2V0X25hbWUoKSk7CisgIHZhbGlkYXRlKHMtPmdldF9mdW5jdGlvbnMoKSk7Cit9CisKK3ZvaWQgdF9nZW5lcmF0b3I6OnZhbGlkYXRlKHRfZW51bSBjb25zdCogZW4pIGNvbnN0IHsKKyAgdmFsaWRhdGVfaWQoZW4tPmdldF9uYW1lKCkpOworICB2YWxpZGF0ZShlbi0+Z2V0X2NvbnN0YW50cygpKTsKK30KK3ZvaWQgdF9nZW5lcmF0b3I6OnZhbGlkYXRlKHRfc3RydWN0IGNvbnN0KiBzKSBjb25zdCB7CisgIHZhbGlkYXRlX2lkKHMtPmdldF9uYW1lKCkpOworICB2YWxpZGF0ZShzLT5nZXRfbWVtYmVycygpKTsKK30KKwordm9pZCB0X2dlbmVyYXRvcjo6dmFsaWRhdGUodF9lbnVtX3ZhbHVlIGNvbnN0KiBlbl92YWwpIGNvbnN0IHsKKyAgdmFsaWRhdGVfaWQoZW5fdmFsLT5nZXRfbmFtZSgpKTsKK30KK3ZvaWQgdF9nZW5lcmF0b3I6OnZhbGlkYXRlKHRfdHlwZWRlZiBjb25zdCogdGQpIGNvbnN0IHsKKyAgdmFsaWRhdGVfaWQodGQtPmdldF9uYW1lKCkpOworfQordm9pZCB0X2dlbmVyYXRvcjo6dmFsaWRhdGUodF9jb25zdCBjb25zdCogYykgY29uc3QgeworICB2YWxpZGF0ZV9pZChjLT5nZXRfbmFtZSgpKTsKK30KK3ZvaWQgdF9nZW5lcmF0b3I6OnZhbGlkYXRlKHRfZmllbGQgY29uc3QqIGYpIGNvbnN0IHsKKyAgdmFsaWRhdGVfaWQoZi0+Z2V0X25hbWUoKSk7Cit9CisKK3ZvaWQgdF9nZW5lcmF0b3I6OnZhbGlkYXRlX2lkKGNvbnN0IHN0cmluZyYgaWQpIGNvbnN0IHsKKyAgaWYgKGtleXdvcmRzXy5maW5kKGlkKSAhPSBrZXl3b3Jkc18uZW5kKCkpIHsKKyAgICBmYWlsdXJlKCJDYW5ub3QgdXNlIHJlc2VydmVkIGxhbmd1YWdlIGtleXdvcmQ6IFwiJXNcIiIsIGlkLmNfc3RyKCkpOworICB9Cit9CisKK3N0cmluZyB0X2dlbmVyYXRvcjo6ZXNjYXBlX3N0cmluZyhjb25zdCBzdHJpbmcmIGluKSBjb25zdCB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKyAgZm9yIChzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gaW4uYmVnaW4oKTsgaXQgPCBpbi5lbmQoKTsgaXQrKykgeworICAgIHN0ZDo6bWFwPGNoYXIsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgcmVzID0gZXNjYXBlXy5maW5kKCppdCk7CisgICAgaWYgKHJlcyAhPSBlc2NhcGVfLmVuZCgpKSB7CisgICAgICByZXN1bHQuYXBwZW5kKHJlcy0+c2Vjb25kKTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0LnB1c2hfYmFjaygqaXQpOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIHRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHModmVjdG9yPHRfY29uc3QqPiBjb25zdHMpIHsKKyAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY19pdGVyOworICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGdlbmVyYXRlX2NvbnN0KCpjX2l0ZXIpOworICB9Cit9CisKK3ZvaWQgdF9nZW5lcmF0b3I6OmdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgY29tbWVudF9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgbGluZV9wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGNvbnRlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBjb21tZW50X2VuZCkgeworICBpZiAoIWNvbW1lbnRfc3RhcnQuZW1wdHkoKSkKKyAgICBpbmRlbnQob3V0KSA8PCBjb21tZW50X3N0YXJ0OworICBzdHJpbmdzdHJlYW0gZG9jcyhjb250ZW50cywgaW9zX2Jhc2U6OmluKTsKKyAgd2hpbGUgKCEoZG9jcy5lb2YoKSB8fCBkb2NzLmZhaWwoKSkpIHsKKyAgICBjaGFyIGxpbmVbMTAyNF07CisgICAgZG9jcy5nZXRsaW5lKGxpbmUsIDEwMjQpOworCisgICAgaWYgKHN0cmxlbihsaW5lKSA+IDApIHsKKyAgICAgIGluZGVudChvdXQpIDw8IGxpbmVfcHJlZml4IDw8IGxpbmUgPDwgc3RkOjplbmRsOworICAgIH0gZWxzZSBpZiAobGluZV9wcmVmaXguZW1wdHkoKSl7CisgICAgICBvdXQgPDwgc3RkOjplbmRsOworICAgIH0gZWxzZSBpZighZG9jcy5lb2YoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgbGluZV9wcmVmaXggPDwgc3RkOjplbmRsOworICAgIH0KKyAgfQorICBpZiAoIWNvbW1lbnRfZW5kLmVtcHR5KCkpCisgICAgaW5kZW50KG91dCkgPDwgY29tbWVudF9lbmQ7Cit9CisKK3ZvaWQgdF9nZW5lcmF0b3JfcmVnaXN0cnk6OnJlZ2lzdGVyX2dlbmVyYXRvcih0X2dlbmVyYXRvcl9mYWN0b3J5KiBmYWN0b3J5KSB7CisgIGdlbl9tYXBfdCYgdGhlX21hcCA9IGdldF9nZW5lcmF0b3JfbWFwKCk7CisgIGlmICh0aGVfbWFwLmZpbmQoZmFjdG9yeS0+Z2V0X3Nob3J0X25hbWUoKSkgIT0gdGhlX21hcC5lbmQoKSkgeworICAgIGZhaWx1cmUoIkR1cGxpY2F0ZSBnZW5lcmF0b3JzIGZvciBsYW5ndWFnZSBcIiVzXCIhXG4iLCBmYWN0b3J5LT5nZXRfc2hvcnRfbmFtZSgpLmNfc3RyKCkpOworICB9CisgIHRoZV9tYXBbZmFjdG9yeS0+Z2V0X3Nob3J0X25hbWUoKV0gPSBmYWN0b3J5OworfQorCit2b2lkIHRfZ2VuZXJhdG9yOjpwYXJzZV9vcHRpb25zKGNvbnN0IHN0cmluZyYgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nJiBsYW5ndWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwPHN0cmluZywgc3RyaW5nPiYgcGFyc2VkX29wdGlvbnMpIHsKKyAgc3RyaW5nOjpzaXplX3R5cGUgY29sb24gPSBvcHRpb25zLmZpbmQoJzonKTsKKyAgbGFuZ3VhZ2UgPSBvcHRpb25zLnN1YnN0cigwLCBjb2xvbik7CisKKyAgaWYgKGNvbG9uICE9IHN0cmluZzo6bnBvcykgeworICAgIHN0cmluZzo6c2l6ZV90eXBlIHBvcyA9IGNvbG9uICsgMTsKKyAgICB3aGlsZSAocG9zICE9IHN0cmluZzo6bnBvcyAmJiBwb3MgPCBvcHRpb25zLnNpemUoKSkgeworICAgICAgc3RyaW5nOjpzaXplX3R5cGUgbmV4dF9wb3MgPSBvcHRpb25zLmZpbmQoJywnLCBwb3MpOworICAgICAgc3RyaW5nIG9wdGlvbiA9IG9wdGlvbnMuc3Vic3RyKHBvcywgbmV4dF9wb3MgLSBwb3MpOworICAgICAgcG9zID0gKChuZXh0X3BvcyA9PSBzdHJpbmc6Om5wb3MpID8gbmV4dF9wb3MgOiBuZXh0X3BvcyArIDEpOworCisgICAgICBzdHJpbmc6OnNpemVfdHlwZSBzZXBhcmF0b3IgPSBvcHRpb24uZmluZCgnPScpOworICAgICAgc3RyaW5nIGtleSwgdmFsdWU7CisgICAgICBpZiAoc2VwYXJhdG9yID09IHN0cmluZzo6bnBvcykgeworICAgICAgICBrZXkgPSBvcHRpb247CisgICAgICAgIHZhbHVlID0gIiI7CisgICAgICB9IGVsc2UgeworICAgICAgICBrZXkgPSBvcHRpb24uc3Vic3RyKDAsIHNlcGFyYXRvcik7CisgICAgICAgIHZhbHVlID0gb3B0aW9uLnN1YnN0cihzZXBhcmF0b3IgKyAxKTsKKyAgICAgIH0KKworICAgICAgcGFyc2VkX29wdGlvbnNba2V5XSA9IHZhbHVlOworICAgIH0KKyAgfQorfQorCit0X2dlbmVyYXRvciogdF9nZW5lcmF0b3JfcmVnaXN0cnk6OmdldF9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgbGFuZ3VhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWFwPHN0cmluZywgc3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbnMpIHsKKyAgZ2VuX21hcF90JiB0aGVfbWFwID0gZ2V0X2dlbmVyYXRvcl9tYXAoKTsKKyAgZ2VuX21hcF90OjppdGVyYXRvciBpdGVyID0gdGhlX21hcC5maW5kKGxhbmd1YWdlKTsKKworICBpZiAoaXRlciA9PSB0aGVfbWFwLmVuZCgpKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICByZXR1cm4gaXRlci0+c2Vjb25kLT5nZXRfZ2VuZXJhdG9yKHByb2dyYW0sIHBhcnNlZF9vcHRpb25zLCBvcHRpb25zKTsKK30KKwordF9nZW5lcmF0b3IqIHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpnZXRfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwgY29uc3Qgc3RyaW5nJiBvcHRpb25zKSB7CisgIHN0cmluZyBsYW5ndWFnZTsKKyAgbWFwPHN0cmluZywgc3RyaW5nPiBwYXJzZWRfb3B0aW9uczsKKyAgdF9nZW5lcmF0b3I6OnBhcnNlX29wdGlvbnMob3B0aW9ucywgbGFuZ3VhZ2UsIHBhcnNlZF9vcHRpb25zKTsKKyAgcmV0dXJuIGdldF9nZW5lcmF0b3IocHJvZ3JhbSwgbGFuZ3VhZ2UsIHBhcnNlZF9vcHRpb25zLCBvcHRpb25zKTsKK30KKwordF9nZW5lcmF0b3JfcmVnaXN0cnk6Omdlbl9tYXBfdCYgdF9nZW5lcmF0b3JfcmVnaXN0cnk6OmdldF9nZW5lcmF0b3JfbWFwKCkgeworICAvLyBodHRwOi8vd3d3LnBhcmFzaGlmdC5jb20vYysrLWZhcS1saXRlL2N0b3JzLmh0bWwjZmFxLTEwLjEyCisgIHN0YXRpYyBnZW5fbWFwX3QqIHRoZV9tYXAgPSBuZXcgZ2VuX21hcF90KCk7CisgIHJldHVybiAqdGhlX21hcDsKK30KKwordF9nZW5lcmF0b3JfZmFjdG9yeTo6dF9nZW5lcmF0b3JfZmFjdG9yeShjb25zdCBzdGQ6OnN0cmluZyYgc2hvcnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGxvbmdfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRvY3VtZW50YXRpb24pCisgIDogc2hvcnRfbmFtZV8oc2hvcnRfbmFtZSksIGxvbmdfbmFtZV8obG9uZ19uYW1lKSwgZG9jdW1lbnRhdGlvbl8oZG9jdW1lbnRhdGlvbikgeworICB0X2dlbmVyYXRvcl9yZWdpc3RyeTo6cmVnaXN0ZXJfZ2VuZXJhdG9yKHRoaXMpOworfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I5ZDA3NgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmgKQEAgLTAsMCArMSw0NTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX0dFTkVSQVRPUl9ICisjZGVmaW5lIFRfR0VORVJBVE9SX0gKKyNkZWZpbmUgTVNDXzIwMTVfVkVSIDE5MDAKKworI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlICJ0aHJpZnQvY29tbW9uLmgiCisjaW5jbHVkZSAidGhyaWZ0L2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJ0aHJpZnQvdmVyc2lvbi5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvcl9yZWdpc3RyeS5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3Byb2dyYW0uaCIKKworLyoqCisgKiBCYXNlIGNsYXNzIGZvciBhIHRocmlmdCBjb2RlIGdlbmVyYXRvci4gVGhpcyBjbGFzcyBkZWZpbmVzIHRoZSBiYXNpYworICogcm91dGluZXMgZm9yIGNvZGUgZ2VuZXJhdGlvbiBhbmQgY29udGFpbnMgdGhlIHRvcCBsZXZlbCBtZXRob2QgdGhhdAorICogZGlzcGF0Y2hlcyBjb2RlIGdlbmVyYXRpb24gYWNyb3NzIHZhcmlvdXMgY29tcG9uZW50cy4KKyAqCisgKi8KK2NsYXNzIHRfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtKQorICAgIDoga2V5d29yZHNfKGxhbmdfa2V5d29yZHMoKSl7CisgICAgdG1wXyA9IDA7CisgICAgaW5kZW50XyA9IDA7CisgICAgcHJvZ3JhbV8gPSBwcm9ncmFtOworICAgIHByb2dyYW1fbmFtZV8gPSBnZXRfcHJvZ3JhbV9uYW1lKHByb2dyYW0pOworICAgIGVzY2FwZV9bJ1xuJ10gPSAiXFxuIjsKKyAgICBlc2NhcGVfWydcciddID0gIlxcciI7CisgICAgZXNjYXBlX1snXHQnXSA9ICJcXHQiOworICAgIGVzY2FwZV9bJyInXSA9ICJcXFwiIjsKKyAgICBlc2NhcGVfWydcXCddID0gIlxcXFwiOworICB9CisKKyAgdmlydHVhbCB+dF9nZW5lcmF0b3IoKSB7fQorCisgIC8qKgorICAgKiBGcmFtZXdvcmsgZ2VuZXJhdG9yIG1ldGhvZCB0aGF0IGl0ZXJhdGVzIG92ZXIgYWxsIHRoZSBwYXJ0cyBvZiBhIHByb2dyYW0KKyAgICogYW5kIHBlcmZvcm1zIGdlbmVyYWwgYWN0aW9ucy4gVGhpcyBpcyBpbXBsZW1lbnRlZCBieSB0aGUgYmFzZSBjbGFzcyBhbmQKKyAgICogc2hvdWxkIG5vdCBub3JtYWxseSBiZSBvdmVyd3JpdHRlbiBpbiB0aGUgc3ViY2xhc3Nlcy4KKyAgICovCisgIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9wcm9ncmFtKCk7CisKKyAgY29uc3QgdF9wcm9ncmFtKiBnZXRfcHJvZ3JhbSgpIGNvbnN0IHsgcmV0dXJuIHByb2dyYW1fOyB9CisKKyAgdm9pZCBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY29tbWVudF9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbGluZV9wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNvbnRlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjb21tZW50X2VuZCk7CisKKyAgc3RhdGljIHZvaWQgcGFyc2Vfb3B0aW9ucyhjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9ucywgc3RkOjpzdHJpbmcmIGxhbmd1YWdlLAorICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMpOworCisgIC8qKgorICAgKiBjaGVjayB3aGV0aGVyIHN1Yi1uYW1lc3BhY2UgZGVjbGFyYWN0aW9uIGlzIHVzZWQgYnkgZ2VuZXJhdG9yLgorICAgKiBlLmcuIGFsbG93CisgICAqIG5hbWVzcGFjZSBweS50d2lzdGVkIGJhcgorICAgKiB0byBzcGVjaWZ5IG5hbWVzcGFjZSB0byB1c2Ugd2hlbiAtZ2VuIHB5OnR3aXN0ZWQgaXMgc3BlY2lmaWVkLgorICAgKiBXaWxsIGJlIGNhbGxlZCB3aXRoIHN1Ym5hbWVzcGFjZSwgaS5lLiBpc192YWxpZF9uYW1lc3BhY2UoInR3aXN0ZWQiKQorICAgKiB3aWxsIGJlIGNhbGxlZCBmb3IgdGhlIGFib3ZlIGV4YW1wbGUuCisgICAqLworICBzdGF0aWMgYm9vbCBpc192YWxpZF9uYW1lc3BhY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHN1Yl9uYW1lc3BhY2UpIHsKKyAgICAodm9pZClzdWJfbmFtZXNwYWNlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8qKgorICAgKiBFc2NhcGUgc3RyaW5nIHRvIHVzZSBvbmUgaW4gZ2VuZXJhdGVkIHNvdXJjZXMuCisgICAqLworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGVzY2FwZV9zdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGluKSBjb25zdDsKKworICBzdGQ6OnN0cmluZyBnZXRfZXNjYXBlZF9zdHJpbmcodF9jb25zdF92YWx1ZSogY29uc3R2YWwpIHsKKyAgICByZXR1cm4gZXNjYXBlX3N0cmluZyhjb25zdHZhbC0+Z2V0X3N0cmluZygpKTsKKyAgfQorCisgIC8qKgorICAgKiBDaGVjayBpZiBhbGwgaWRlbnRpZmllcnMgYXJlIHZhbGlkIGZvciB0aGUgdGFyZ2V0IGxhbmd1YWdlCisgICAqLworICB2aXJ0dWFsIHZvaWQgdmFsaWRhdGVfaW5wdXQoKSBjb25zdDsKKworcHJvdGVjdGVkOgorICB2aXJ0dWFsIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBsYW5nX2tleXdvcmRzKCkgY29uc3Q7CisKKyAgLyoqCisgICAqIEEgbGlzdCBvZiByZXNlcnZlZCB3b3JkcyB0aGF0IGNhbm5vdCBiZSB1c2VkIGFzIGlkZW50aWZpZXJzLgorICAgKi8KKyAgY29uc3Qgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IGtleXdvcmRzXzsKKworICB2aXJ0dWFsIHZvaWQgdmFsaWRhdGVfaWQoY29uc3Qgc3RkOjpzdHJpbmcmIGlkKSBjb25zdDsKKworICB2aXJ0dWFsIHZvaWQgdmFsaWRhdGUodF9lbnVtIGNvbnN0KiBlbikgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCB2YWxpZGF0ZSh0X2VudW1fdmFsdWUgY29uc3QqIGVuX3ZhbCkgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCB2YWxpZGF0ZSh0X3R5cGVkZWYgY29uc3QqIHRkKSBjb25zdDsKKyAgdmlydHVhbCB2b2lkIHZhbGlkYXRlKHRfY29uc3QgY29uc3QqIGMpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgdmFsaWRhdGUodF9zZXJ2aWNlIGNvbnN0KiBzKSBjb25zdDsKKyAgdmlydHVhbCB2b2lkIHZhbGlkYXRlKHRfc3RydWN0IGNvbnN0KiBjKSBjb25zdDsKKyAgdmlydHVhbCB2b2lkIHZhbGlkYXRlKHRfZmllbGQgY29uc3QqIGYpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgdmFsaWRhdGUodF9mdW5jdGlvbiBjb25zdCogZikgY29uc3Q7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHZvaWQgdmFsaWRhdGUoY29uc3Qgc3RkOjp2ZWN0b3I8VD4mIGxpc3QpIGNvbnN0OworCisgIC8qKgorICAgKiBPcHRpb25hbCBtZXRob2RzIHRoYXQgbWF5IGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXMgdG8gdGFrZSBuZWNlc3NhcnkKKyAgICogc3RlcHMgYXQgdGhlIGJlZ2lubmluZyBvciBlbmQgb2YgY29kZSBnZW5lcmF0aW9uLgorICAgKi8KKworICB2aXJ0dWFsIHZvaWQgaW5pdF9nZW5lcmF0b3IoKSB7fQorICB2aXJ0dWFsIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCkge30KKworICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpOworCisgIC8qKgorICAgKiBQdXJlIHZpcnR1YWwgbWV0aG9kcyBpbXBsZW1lbnRlZCBieSB0aGUgZ2VuZXJhdG9yIHN1YmNsYXNzZXMuCisgICAqLworCisgIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpID0gMDsKKyAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgPSAwOworICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7ICh2b2lkKXRjb25zdDsgfQorICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSA9IDA7CisgIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpID0gMDsKKyAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX2ZvcndhcmRfZGVjbGFyYXRpb24odF9zdHJ1Y3QqKSB7fQorICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICAgIC8vIEJ5IGRlZmF1bHQgZXhjZXB0aW9ucyBhcmUgdGhlIHNhbWUgYXMgc3RydWN0cworICAgIGdlbmVyYXRlX3N0cnVjdCh0eGNlcHRpb24pOworICB9CisKKyAgLyoqCisgICAqIE1ldGhvZCB0byBnZXQgdGhlIHByb2dyYW0gbmFtZSwgbWF5IGJlIG92ZXJyaWRkZW4KKyAgICovCisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0X3Byb2dyYW1fbmFtZSh0X3Byb2dyYW0qIHRwcm9ncmFtKSB7IHJldHVybiB0cHJvZ3JhbS0+Z2V0X25hbWUoKTsgfQorCisgIC8qKgorICAgKiBNZXRob2QgdG8gZ2V0IHRoZSBzZXJ2aWNlIG5hbWUsIG1heSBiZSBvdmVycmlkZGVuCisgICAqLworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldF9zZXJ2aWNlX25hbWUodF9zZXJ2aWNlKiB0c2VydmljZSkgeyByZXR1cm4gdHNlcnZpY2UtPmdldF9uYW1lKCk7IH0KKworICAvKioKKyAgICogR2V0IHRoZSBjdXJyZW50IG91dHB1dCBkaXJlY3RvcnkKKyAgICovCisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0X291dF9kaXIoKSBjb25zdCB7CisgICAgaWYgKHByb2dyYW1fLT5pc19vdXRfcGF0aF9hYnNvbHV0ZSgpKSB7CisgICAgICByZXR1cm4gcHJvZ3JhbV8tPmdldF9vdXRfcGF0aCgpICsgIi8iOworICAgIH0KKworICAgIHJldHVybiBwcm9ncmFtXy0+Z2V0X291dF9wYXRoKCkgKyBvdXRfZGlyX2Jhc2VfICsgIi8iOworICB9CisKKyAgLyoqCisgICAqIENyZWF0ZXMgYSB1bmlxdWUgdGVtcG9yYXJ5IHZhcmlhYmxlIG5hbWUsIHdoaWNoIGlzIGp1c3QgIm5hbWUiIHdpdGggYQorICAgKiBudW1iZXIgYXBwZW5kZWQgdG8gaXQgKGkuZS4gbmFtZTM1KQorICAgKi8KKyAgc3RkOjpzdHJpbmcgdG1wKHN0ZDo6c3RyaW5nIG5hbWUpIHsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OworICAgIG91dCA8PCBuYW1lIDw8IHRtcF8rKzsKKyAgICByZXR1cm4gb3V0LnN0cigpOworICB9CisKKyAgLyoqCisgICAqIEdlbmVyYXRlcyBhIGNvbW1lbnQgYWJvdXQgdGhpcyBjb2RlIGJlaW5nIGF1dG9nZW5lcmF0ZWQsIHVzaW5nIEMrKyBzdHlsZQorICAgKiBjb21tZW50cywgd2hpY2ggYXJlIGFsc28gZmFpciBnYW1lIGluIEphdmEgLyBQSFAsIHlheSEKKyAgICoKKyAgICogQHJldHVybiBDLXN0eWxlIGNvbW1lbnQgbWVudGlvbmluZyB0aGF0IHRoaXMgZmlsZSBpcyBhdXRvZ2VuZXJhdGVkLgorICAgKi8KKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBhdXRvZ2VuX2NvbW1lbnQoKSB7CisgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCIvKipcbiIpICsgIiAqICIgKyBhdXRvZ2VuX3N1bW1hcnkoKSArICJcbiIgKyAiICpcbiIKKyAgICAgICAgICAgKyAiICogRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lOR1xuIgorICAgICAgICAgICArICIgKiAgQGdlbmVyYXRlZFxuIiArICIgKi9cbiI7CisgIH0KKworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGF1dG9nZW5fc3VtbWFyeSgpIHsKKyAgICByZXR1cm4gc3RkOjpzdHJpbmcoIkF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgiKSArIFRIUklGVF9WRVJTSU9OICsgIikiOworICB9CisKKyAgLyoqCisgICAqIEluZGVudGF0aW9uIGxldmVsIG1vZGlmaWVycworICAgKi8KKworICB2b2lkIGluZGVudF91cCgpIHsgKytpbmRlbnRfOyB9CisKKyAgdm9pZCBpbmRlbnRfZG93bigpIHsgLS1pbmRlbnRfOyB9CisKKyAgLyoqCisgICogSW5kZW50YXRpb24gdmFsaWRhdGlvbiBoZWxwZXIKKyAgKi8KKyAgaW50IGluZGVudF9jb3VudCgpIHsgcmV0dXJuIGluZGVudF87IH0KKworICB2b2lkIGluZGVudF92YWxpZGF0ZSggaW50IGV4cGVjdGVkLCBjb25zdCBjaGFyICogZnVuY19uYW1lKSB7CisgICAgaWYgKGluZGVudF8gIT0gZXhwZWN0ZWQpIHsgCisgICAgICBwdmVyYm9zZSgiV3JvbmcgaW5kZW50IGNvdW50IGluICVzOiBkaWZmZXJlbmNlID0gJWkgXG4iLCBmdW5jX25hbWUsIChleHBlY3RlZCAtIGluZGVudF8pKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogSW5kZW50YXRpb24gcHJpbnQgZnVuY3Rpb24KKyAgICovCisgIHN0ZDo6c3RyaW5nIGluZGVudCgpIHsKKyAgICBzdGQ6OnN0cmluZyBpbmQgPSAiIjsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaW5kZW50XzsgKytpKSB7CisgICAgICBpbmQgKz0gaW5kZW50X3N0cigpOworICAgIH0KKyAgICByZXR1cm4gaW5kOworICB9CisKKyAgLyoqCisgICAqIEluZGVudGF0aW9uIHV0aWxpdHkgd3JhcHBlcgorICAgKi8KKyAgc3RkOjpvc3RyZWFtJiBpbmRlbnQoc3RkOjpvc3RyZWFtJiBvcykgeyByZXR1cm4gb3MgPDwgaW5kZW50KCk7IH0KKworICAvKioKKyAgICogQ2FwaXRhbGl6YXRpb24gaGVscGVycworICAgKi8KKyAgc3RkOjpzdHJpbmcgY2FwaXRhbGl6ZShzdGQ6OnN0cmluZyBpbikgeworICAgIGluWzBdID0gdG91cHBlcihpblswXSk7CisgICAgcmV0dXJuIGluOworICB9CisgIHN0ZDo6c3RyaW5nIGRlY2FwaXRhbGl6ZShzdGQ6OnN0cmluZyBpbikgeworICAgIGluWzBdID0gdG9sb3dlcihpblswXSk7CisgICAgcmV0dXJuIGluOworICB9CisgIHN0YXRpYyBzdGQ6OnN0cmluZyBsb3dlcmNhc2Uoc3RkOjpzdHJpbmcgaW4pIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluLnNpemUoKTsgKytpKSB7CisgICAgICBpbltpXSA9IHRvbG93ZXIoaW5baV0pOworICAgIH0KKyAgICByZXR1cm4gaW47CisgIH0KKyAgc3RhdGljIHN0ZDo6c3RyaW5nIHVwcGVyY2FzZShzdGQ6OnN0cmluZyBpbikgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW4uc2l6ZSgpOyArK2kpIHsKKyAgICAgIGluW2ldID0gdG91cHBlcihpbltpXSk7CisgICAgfQorICAgIHJldHVybiBpbjsKKyAgfQorCisgIC8qKgorICAgKiBUcmFuc2Zvcm1zIGEgY2FtZWwgY2FzZSBzdHJpbmcgdG8gYW4gZXF1aXZhbGVudCBvbmUgc2VwYXJhdGVkIGJ5IHVuZGVyc2NvcmVzCisgICAqIGUuZy4gYU11bHRpV29yZCAtPiBhX211bHRpX3dvcmQKKyAgICogICAgICBzb21lTmFtZSAgIC0+IHNvbWVfbmFtZQorICAgKiAgICAgIENhbWVsQ2FzZSAgLT4gY2FtZWxfY2FzZQorICAgKiAgICAgIG5hbWUgICAgICAgLT4gbmFtZQorICAgKiAgICAgIE5hbWUgICAgICAgLT4gbmFtZQorICAgKi8KKyAgc3RkOjpzdHJpbmcgdW5kZXJzY29yZShzdGQ6OnN0cmluZyBpbikgeworICAgIGluWzBdID0gdG9sb3dlcihpblswXSk7CisgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBpbi5zaXplKCk7ICsraSkgeworICAgICAgaWYgKGlzdXBwZXIoaW5baV0pKSB7CisgICAgICAgIGluW2ldID0gdG9sb3dlcihpbltpXSk7CisgICAgICAgIGluLmluc2VydChpLCAiXyIpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaW47CisgIH0KKworICAvKioKKyAgICAqIFRyYW5zZm9ybXMgYSBzdHJpbmcgd2l0aCB3b3JkcyBzZXBhcmF0ZWQgYnkgdW5kZXJzY29yZXMgdG8gYSBjYW1lbCBjYXNlIGVxdWl2YWxlbnQKKyAgICAqIGUuZy4gYV9tdWx0aV93b3JkIC0+IGFNdWx0aVdvcmQKKyAgICAqICAgICAgc29tZV9uYW1lICAgIC0+ICBzb21lTmFtZQorICAgICogICAgICBuYW1lICAgICAgICAgLT4gIG5hbWUKKyAgICAqLworICBzdGQ6OnN0cmluZyBjYW1lbGNhc2Uoc3RkOjpzdHJpbmcgaW4pIHsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OworICAgIGJvb2wgdW5kZXJzY29yZSA9IGZhbHNlOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbi5zaXplKCk7IGkrKykgeworICAgICAgaWYgKGluW2ldID09ICdfJykgeworICAgICAgICB1bmRlcnNjb3JlID0gdHJ1ZTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAodW5kZXJzY29yZSkgeworICAgICAgICBvdXQgPDwgKGNoYXIpdG91cHBlcihpbltpXSk7CisgICAgICAgIHVuZGVyc2NvcmUgPSBmYWxzZTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBvdXQgPDwgaW5baV07CisgICAgfQorCisgICAgcmV0dXJuIG91dC5zdHIoKTsKKyAgfQorCisgIGNvbnN0IHN0ZDo6c3RyaW5nIGVtaXRfZG91YmxlX2FzX3N0cmluZyhjb25zdCBkb3VibGUgdmFsdWUpIHsKKyAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGRvdWJsZV9vdXRwdXRfc3RyZWFtOworICAgICAgLy8gc2V0cyB0aGUgbWF4aW11bSBwcmVjaXNpb246IGh0dHA6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL2lvL21hbmlwL3NldHByZWNpc2lvbgorICAgICAgLy8gc2V0cyB0aGUgb3V0cHV0IGZvcm1hdCB0byBmaXhlZDogaHR0cDovL2VuLmNwcHJlZmVyZW5jZS5jb20vdy9jcHAvaW8vbWFuaXAvZml4ZWQgKG5vdCBpbiBzY2llbnRpZmljIG5vdGF0aW9uKQorICAgICAgZG91YmxlX291dHB1dF9zdHJlYW0gPDwgc3RkOjpzZXRwcmVjaXNpb24oc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjpkaWdpdHMxMCArIDEpOworCisgICAgICAjaWZkZWYgX01TQ19WRVIKKyAgICAgICAgICAvLyBzdHJ0b2QgaXMgYnJva2VuIGluIE1TVkMgY29tcGlsZXJzIG9sZGVyIHRoYW4gMjAxNSwgc28gc3RkOjpmaXhlZCBmYWlscyB0byBmb3JtYXQgYSBkb3VibGUgbGl0ZXJhbC4KKyAgICAgICAgICAvLyBtb3JlIGRldGFpbHM6IGh0dHBzOi8vYmxvZ3MubXNkbi5taWNyb3NvZnQuY29tL3ZjYmxvZy8yMDE0LzA2LzE4LworICAgICAgICAgIC8vICAgICAgICAgICAgICAgYy1ydW50aW1lLWNydC1mZWF0dXJlcy1maXhlcy1hbmQtYnJlYWtpbmctY2hhbmdlcy1pbi12aXN1YWwtc3R1ZGlvLTE0LWN0cDEvCisgICAgICAgICAgLy8gICAgICAgICAgICAgICBhbmQKKyAgICAgICAgICAvLyAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuZXhwbG9yaW5nYmluYXJ5LmNvbS92aXN1YWwtYy1wbHVzLXBsdXMtc3RydG9kLXN0aWxsLWJyb2tlbi8KKyAgICAgICAgICAjaWYgX01TQ19WRVIgPj0gTVNDXzIwMTVfVkVSCisgICAgICAgICAgICAgIGRvdWJsZV9vdXRwdXRfc3RyZWFtIDw8IHN0ZDo6Zml4ZWQ7CisgICAgICAgICAgI2VuZGlmCisgICAgICAjZWxzZQorICAgICAgICAgIGRvdWJsZV9vdXRwdXRfc3RyZWFtIDw8IHN0ZDo6Zml4ZWQ7CisgICAgICAjZW5kaWYKKworICAgICAgZG91YmxlX291dHB1dF9zdHJlYW0gPDwgdmFsdWU7CisKKyAgICAgIHJldHVybiBkb3VibGVfb3V0cHV0X3N0cmVhbS5zdHIoKTsKKyAgfQorCitwdWJsaWM6CisgIC8qKgorICAgKiBHZXQgdGhlIHRydWUgdHlwZSBiZWhpbmQgYSBzZXJpZXMgb2YgdHlwZWRlZnMuCisgICAqLworICBzdGF0aWMgY29uc3QgdF90eXBlKiBnZXRfdHJ1ZV90eXBlKGNvbnN0IHRfdHlwZSogdHlwZSkgeyByZXR1cm4gdHlwZS0+Z2V0X3RydWVfdHlwZSgpOyB9CisgIHN0YXRpYyB0X3R5cGUqIGdldF90cnVlX3R5cGUodF90eXBlKiB0eXBlKSB7IHJldHVybiB0eXBlLT5nZXRfdHJ1ZV90eXBlKCk7IH0KKworcHJvdGVjdGVkOgorICAvKioKKyAgICogVGhlIHByb2dyYW0gYmVpbmcgZ2VuZXJhdGVkCisgICAqLworICB0X3Byb2dyYW0qIHByb2dyYW1fOworCisgIC8qKgorICAgKiBRdWljayBhY2Nlc3NvciBmb3IgZm9ybWF0dGVkIHByb2dyYW0gbmFtZSB0aGF0IGlzIGN1cnJlbnRseSBiZWluZworICAgKiBnZW5lcmF0ZWQuCisgICAqLworICBzdGQ6OnN0cmluZyBwcm9ncmFtX25hbWVfOworCisgIC8qKgorICAgKiBRdWljayBhY2Nlc3NvciBmb3IgZm9ybWF0dGVkIHNlcnZpY2UgbmFtZSB0aGF0IGlzIGN1cnJlbnRseSBiZWluZworICAgKiBnZW5lcmF0ZWQuCisgICAqLworICBzdGQ6OnN0cmluZyBzZXJ2aWNlX25hbWVfOworCisgIC8qKgorICAgKiBPdXRwdXQgdHlwZS1zcGVjaWZjIGRpcmVjdG9yeSBuYW1lICgiZ2VuLSoiKQorICAgKi8KKyAgc3RkOjpzdHJpbmcgb3V0X2Rpcl9iYXNlXzsKKworICAvKioKKyAgICogTWFwIG9mIGNoYXJhY3RlcnMgdG8gZXNjYXBlIGluIHN0cmluZyBsaXRlcmFscy4KKyAgICovCisgIHN0ZDo6bWFwPGNoYXIsIHN0ZDo6c3RyaW5nPiBlc2NhcGVfOworCisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgaW5kZW50X3N0cigpIGNvbnN0IHsKKyAgICByZXR1cm4gIiAgIjsKKyAgfQorCitwcml2YXRlOgorICAvKioKKyAgICogQ3VycmVudCBjb2RlIGluZGVudGF0aW9uIGxldmVsCisgICAqLworICBpbnQgaW5kZW50XzsKKworICAvKioKKyAgICogVGVtcG9yYXJ5IHZhcmlhYmxlIGNvdW50ZXIsIGZvciBtYWtpbmcgdW5pcXVlIHZhcmlhYmxlIG5hbWVzCisgICAqLworICBpbnQgdG1wXzsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIF9DaGFyVCwgdHlwZW5hbWUgX1RyYWl0cyA9IHN0ZDo6Y2hhcl90cmFpdHM8X0NoYXJUPiA+CitjbGFzcyB0ZW1wbGF0ZV9vZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIDogcHVibGljIHN0ZDo6b3N0cmluZ3N0cmVhbSB7CitwdWJsaWM6CisgIHRlbXBsYXRlX29mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUoKTogY29udGVudHNfd3JpdHRlbihmYWxzZSkge30KKworICB0ZW1wbGF0ZV9vZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlKHN0ZDo6c3RyaW5nIGNvbnN0JiBvdXRwdXRfZmlsZV9wYXRoXykKKyAgOiBvdXRwdXRfZmlsZV9wYXRoKG91dHB1dF9maWxlX3BhdGhfKSwgY29udGVudHNfd3JpdHRlbihmYWxzZSkge30KKworICB+dGVtcGxhdGVfb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSgpIHsKKyAgICBpZiAoIWNvbnRlbnRzX3dyaXR0ZW4pIHsKKyAgICAgIGNsb3NlKCk7CisgICAgfQorICB9CisKKyAgdm9pZCBvcGVuKHN0ZDo6c3RyaW5nIGNvbnN0JiBvdXRwdXRfZmlsZV9wYXRoXykgeworICAgIG91dHB1dF9maWxlX3BhdGggPSBvdXRwdXRfZmlsZV9wYXRoXzsKKyAgICBjbGVhcl9idWYoKTsKKyAgICBjb250ZW50c193cml0dGVuID0gZmFsc2U7CisgIH0KKworICB2b2lkIGNsb3NlKCkgeworICAgIGlmIChjb250ZW50c193cml0dGVuIHx8IG91dHB1dF9maWxlX3BhdGggPT0gIiIpCisgICAgICByZXR1cm47CisKKyAgICBpZiAoIWlzX3JlYWRhYmxlKG91dHB1dF9maWxlX3BhdGgpKSB7CisgICAgICBkdW1wKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RkOjppZnN0cmVhbSBvbGRfZmlsZTsKKyAgICBvbGRfZmlsZS5leGNlcHRpb25zKG9sZF9maWxlLmV4Y2VwdGlvbnMoKSB8IHN0ZDo6aWZzdHJlYW06OmJhZGJpdCB8IHN0ZDo6aWZzdHJlYW06OmZhaWxiaXQpOworICAgIG9sZF9maWxlLm9wZW4ob3V0cHV0X2ZpbGVfcGF0aC5jX3N0cigpLCBzdGQ6Omlvczo6aW4pOworCisgICAgaWYgKG9sZF9maWxlKSB7CisgICAgICBzdGQ6OnN0cmluZyBjb25zdCBvbGRfZmlsZV9jb250ZW50cyhzdGF0aWNfY2FzdDxzdGQ6Om9zdHJpbmdzdHJlYW0gY29uc3QmPihzdGQ6Om9zdHJpbmdzdHJlYW0oKSA8PCBvbGRfZmlsZS5yZGJ1ZigpKS5zdHIoKSk7CisgICAgICBvbGRfZmlsZS5jbG9zZSgpOworCisgICAgICBpZiAob2xkX2ZpbGVfY29udGVudHMgIT0gc3RyKCkpIHsKKyAgICAgICAgZHVtcCgpOworICAgICAgfQorICAgIH0KKyAgfQorCitwcm90ZWN0ZWQ6CisgIHZvaWQgZHVtcCgpIHsKKyAgICBzdGQ6Om9mc3RyZWFtIG91dF9maWxlOworICAgIG91dF9maWxlLmV4Y2VwdGlvbnMob3V0X2ZpbGUuZXhjZXB0aW9ucygpIHwgc3RkOjpvZnN0cmVhbTo6YmFkYml0IHwgc3RkOjpvZnN0cmVhbTo6ZmFpbGJpdCk7CisgICAgdHJ5IHsKKyAgICAgIG91dF9maWxlLm9wZW4ob3V0cHV0X2ZpbGVfcGF0aC5jX3N0cigpLCBzdGQ6Omlvczo6b3V0KTsKKyAgICB9CisgICAgY2F0Y2ggKGNvbnN0IHN0ZDo6aW9zX2Jhc2U6OmZhaWx1cmUmIGUpIHsKKyAgICAgIDo6ZmFpbHVyZSgiZmFpbGVkIHRvIHdyaXRlIHRoZSBvdXRwdXQgdG8gdGhlIGZpbGUgJyVzJywgZGV0YWlsczogJyVzJyIsIG91dHB1dF9maWxlX3BhdGguY19zdHIoKSwgZS53aGF0KCkpOworICAgIH0KKyAgICBvdXRfZmlsZSA8PCBzdHIoKTsKKyAgICBvdXRfZmlsZS5jbG9zZSgpOworICAgIGNsZWFyX2J1ZigpOworICAgIGNvbnRlbnRzX3dyaXR0ZW4gPSB0cnVlOworICB9CisKKyAgdm9pZCBjbGVhcl9idWYoKSB7CisgICAgc3RyKHN0ZDo6c3RyaW5nKCkpOworICB9CisKKyAgc3RhdGljIGJvb2wgaXNfcmVhZGFibGUoc3RkOjpzdHJpbmcgY29uc3QmIGZpbGVfbmFtZSkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxib29sPihzdGQ6Omlmc3RyZWFtKGZpbGVfbmFtZS5jX3N0cigpKSk7CisgIH0KKworcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgb3V0cHV0X2ZpbGVfcGF0aDsKKyAgYm9vbCBjb250ZW50c193cml0dGVuOworfTsKK3R5cGVkZWYgdGVtcGxhdGVfb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZTxjaGFyPiBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yX3JlZ2lzdHJ5LmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvcl9yZWdpc3RyeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMDIxNjcKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvcl9yZWdpc3RyeS5oCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9HRU5FUkFUT1JfUkVHSVNUUllfSAorI2RlZmluZSBUX0dFTkVSQVRPUl9SRUdJU1RSWV9ICisKK2NsYXNzIHRfZ2VuZXJhdG9yOworCisvKioKKyAqIEEgZmFjdG9yeSBmb3IgcHJvZHVjaW5nIGdlbmVyYXRvciBjbGFzc2VzIG9mIGEgcGFydGljdWxhciBsYW5ndWFnZS4KKyAqCisgKiBUaGlzIGNsYXNzIGlzIGFsc28gcmVzcG9uc2libGUgZm9yOgorICogIC0gUmVnaXN0ZXJpbmcgaXRzZWxmIHdpdGggdGhlIGdlbmVyYXRvciByZWdpc3RyeS4KKyAqICAtIFByb3ZpZGluZyBkb2N1bWVudGF0aW9uIGZvciB0aGUgZ2VuZXJhdG9ycyBpdCBwcm9kdWNlcy4KKyAqLworY2xhc3MgdF9nZW5lcmF0b3JfZmFjdG9yeSB7CitwdWJsaWM6CisgIHRfZ2VuZXJhdG9yX2ZhY3RvcnkoY29uc3Qgc3RkOjpzdHJpbmcmIHNob3J0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGxvbmdfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZG9jdW1lbnRhdGlvbik7CisKKyAgdmlydHVhbCB+dF9nZW5lcmF0b3JfZmFjdG9yeSgpIHt9CisKKyAgdmlydHVhbCB0X2dlbmVyYXRvciogZ2V0X2dlbmVyYXRvcigKKyAgICAgIC8vIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlLgorICAgICAgdF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgLy8gTm90ZTogcGFyc2VkX29wdGlvbnMgd2lsbCBub3QgZXhpc3QgYmV5b25kIHRoZSBjYWxsIHRvIGdldF9nZW5lcmF0b3IuCisgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgIC8vIE5vdGU6IG9wdGlvbl9zdHJpbmcgbWlnaHQgbm90IGV4aXN0IGJleW9uZCB0aGUgY2FsbCB0byBnZXRfZ2VuZXJhdG9yLgorICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpID0gMDsKKworICB2aXJ0dWFsIGJvb2wgaXNfdmFsaWRfbmFtZXNwYWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWJfbmFtZXNwYWNlKSA9IDA7CisKKyAgc3RkOjpzdHJpbmcgZ2V0X3Nob3J0X25hbWUoKSB7IHJldHVybiBzaG9ydF9uYW1lXzsgfQorICBzdGQ6OnN0cmluZyBnZXRfbG9uZ19uYW1lKCkgeyByZXR1cm4gbG9uZ19uYW1lXzsgfQorICBzdGQ6OnN0cmluZyBnZXRfZG9jdW1lbnRhdGlvbigpIHsgcmV0dXJuIGRvY3VtZW50YXRpb25fOyB9CisKK3ByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIHNob3J0X25hbWVfOworICBzdGQ6OnN0cmluZyBsb25nX25hbWVfOworICBzdGQ6OnN0cmluZyBkb2N1bWVudGF0aW9uXzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBnZW5lcmF0b3I+CitjbGFzcyB0X2dlbmVyYXRvcl9mYWN0b3J5X2ltcGwgOiBwdWJsaWMgdF9nZW5lcmF0b3JfZmFjdG9yeSB7CitwdWJsaWM6CisgIHRfZ2VuZXJhdG9yX2ZhY3RvcnlfaW1wbChjb25zdCBzdGQ6OnN0cmluZyYgc2hvcnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBsb25nX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZG9jdW1lbnRhdGlvbikKKyAgICA6IHRfZ2VuZXJhdG9yX2ZhY3Rvcnkoc2hvcnRfbmFtZSwgbG9uZ19uYW1lLCBkb2N1bWVudGF0aW9uKSB7fQorCisgIHZpcnR1YWwgdF9nZW5lcmF0b3IqIGdldF9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKSB7CisgICAgcmV0dXJuIG5ldyBnZW5lcmF0b3IocHJvZ3JhbSwgcGFyc2VkX29wdGlvbnMsIG9wdGlvbl9zdHJpbmcpOworICB9CisKKyAgdmlydHVhbCBib29sIGlzX3ZhbGlkX25hbWVzcGFjZShjb25zdCBzdGQ6OnN0cmluZyYgc3ViX25hbWVzcGFjZSkgeworICAgIHJldHVybiBnZW5lcmF0b3I6OmlzX3ZhbGlkX25hbWVzcGFjZShzdWJfbmFtZXNwYWNlKTsKKyAgfQorfTsKKworY2xhc3MgdF9nZW5lcmF0b3JfcmVnaXN0cnkgeworcHVibGljOgorICBzdGF0aWMgdm9pZCByZWdpc3Rlcl9nZW5lcmF0b3IodF9nZW5lcmF0b3JfZmFjdG9yeSogZmFjdG9yeSk7CisKKyAgc3RhdGljIHRfZ2VuZXJhdG9yKiBnZXRfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbnMpOworICBzdGF0aWMgdF9nZW5lcmF0b3IqIGdldF9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGxhdWduYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9ucyk7CisKKyAgdHlwZWRlZiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgdF9nZW5lcmF0b3JfZmFjdG9yeSo+IGdlbl9tYXBfdDsKKyAgc3RhdGljIGdlbl9tYXBfdCYgZ2V0X2dlbmVyYXRvcl9tYXAoKTsKKworcHJpdmF0ZToKKyAgdF9nZW5lcmF0b3JfcmVnaXN0cnkoKTsKKyAgdF9nZW5lcmF0b3JfcmVnaXN0cnkoY29uc3QgdF9nZW5lcmF0b3JfcmVnaXN0cnkmKTsKK307CisKKyNkZWZpbmUgVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihsYW5ndWFnZSwgbG9uZ19uYW1lLCBkb2MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY2xhc3MgdF8jI2xhbmd1YWdlIyNfZ2VuZXJhdG9yX2ZhY3RvcnlfaW1wbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDogcHVibGljIHRfZ2VuZXJhdG9yX2ZhY3RvcnlfaW1wbDx0XyMjbGFuZ3VhZ2UjI19nZW5lcmF0b3I+IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0XyMjbGFuZ3VhZ2UjI19nZW5lcmF0b3JfZmFjdG9yeV9pbXBsKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDogdF9nZW5lcmF0b3JfZmFjdG9yeV9pbXBsPHRfIyNsYW5ndWFnZSMjX2dlbmVyYXRvcj4oI2xhbmd1YWdlLCBsb25nX25hbWUsIGRvYykge30gICAgICAgICAgIFwKKyAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIHRfIyNsYW5ndWFnZSMjX2dlbmVyYXRvcl9mYWN0b3J5X2ltcGwgX3JlZ2lzdGVyZXI7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9nb19nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2dvX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzE2Yjg3Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9nb19nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSwzNzEzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgcHJvZ3JhbW1hdGljYWxseSBzYW5pdGl6ZWQgZm9yIHN0eWxlOgorICogYXN0eWxlIC0tc3R5bGU9MXRicyAtZiAtcCAtSCAtaiAtVSB0X2dvX2dlbmVyYXRvci5jYworICoKKyAqIFRoZSBvdXRwdXQgb2YgYXN0eWxlIHNob3VsZCBub3QgYmUgdGFrZW4gdW5xdWVzdGlvbmluZ2x5LCBidXQgaXQgaXMgYSBnb29kCisgKiBndWlkZSBmb3IgZW5zdXJpbmcgdW5pZm9ybWl0eSBhbmQgcmVhZGFiaWxpdHkuCisgKi8KKworI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNsb2NhbGU+CisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L3ZlcnNpb24uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworLyoqCisgKiBBIGhlbHBlciBmb3IgYXV0b21hdGljYWxseSBmb3JtYXR0aW5nIHRoZSBlbWl0dGVkIEdvIGNvZGUgZnJvbSB0aGUgVGhyaWZ0CisgKiBJREwgcGVyIHRoZSBHbyBzdHlsZSBndWlkZS4KKyAqCisgKiBSZXR1cm5zOgorICogIC0gdHJ1ZSwgaWYgdGhlIGZvcm1hdHRpbmcgcHJvY2VzcyBzdWNjZWVkZWQuCisgKiAgLSBmYWxzZSwgaWYgdGhlIGZvcm1hdHRpbmcgcHJvY2VzcyBmYWlsZWQsIHdoaWNoIG1lYW5zIHRoZSBiYXNpYyBvdXRwdXQgd2FzCisgKiAgICAgICAgICAgc3RpbGwgZ2VuZXJhdGVkLgorICovCitib29sIGZvcm1hdF9nb19vdXRwdXQoY29uc3Qgc3RyaW5nJiBmaWxlX3BhdGgpOworCitjb25zdCBzdHJpbmcgREVGQVVMVF9USFJJRlRfSU1QT1JUID0gImdpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC9saWIvZ28vdGhyaWZ0IjsKK3N0YXRpYyBzdGQ6OnN0cmluZyBwYWNrYWdlX2ZsYWc7CisKKy8qKgorICogR28gY29kZSBnZW5lcmF0b3IuCisgKi8KK2NsYXNzIHRfZ29fZ2VuZXJhdG9yIDogcHVibGljIHRfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9nb19nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisKKyAgICBnZW5fdGhyaWZ0X2ltcG9ydF8gPSBERUZBVUxUX1RIUklGVF9JTVBPUlQ7CisgICAgZ2VuX3BhY2thZ2VfcHJlZml4XyA9ICIiOworICAgIHBhY2thZ2VfZmxhZyA9ICIiOworICAgIHJlYWRfd3JpdGVfcHJpdmF0ZV8gPSBmYWxzZTsKKyAgICBpZ25vcmVfaW5pdGlhbGlzbXNfID0gZmFsc2U7CisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgicGFja2FnZV9wcmVmaXgiKSA9PSAwKSB7CisgICAgICAgIGdlbl9wYWNrYWdlX3ByZWZpeF8gPSAoaXRlci0+c2Vjb25kKTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgidGhyaWZ0X2ltcG9ydCIpID09IDApIHsKKyAgICAgICAgZ2VuX3RocmlmdF9pbXBvcnRfID0gKGl0ZXItPnNlY29uZCk7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInBhY2thZ2UiKSA9PSAwKSB7CisgICAgICAgIHBhY2thZ2VfZmxhZyA9IChpdGVyLT5zZWNvbmQpOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJyZWFkX3dyaXRlX3ByaXZhdGUiKSA9PSAwKSB7CisgICAgICAgIHJlYWRfd3JpdGVfcHJpdmF0ZV8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJpZ25vcmVfaW5pdGlhbGlzbXMiKSA9PSAwKSB7CisgICAgICAgIGlnbm9yZV9pbml0aWFsaXNtc18gPSAgdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBnbzoiICsgaXRlci0+Zmlyc3Q7CisgICAgICB9CisgICAgfQorCisgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tZ28iOworICB9CisKKyAgLyoqCisgICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKKyAgICovCisKKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlLCBjb25zdCBzdHJpbmcmIG5hbWUsIGJvb2wgb3B0ID0gZmFsc2UpOworCisgIC8qKgorICAgKiBTdHJ1Y3QgZ2VuZXJhdGlvbiBjb2RlCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfZ29fc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfZ29fc3RydWN0X2RlZmluaXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19hcmdzID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX2dvX3N0cnVjdF9pbml0aWFsaXplcihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfYXJnc19vcl9yZXN1bHQgPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfaXNzZXRfaGVscGVycyhzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiB0c3RydWN0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb3VudHNldGZpZWxkc19oZWxwZXIoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHRzdHJ1Y3RfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQgPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfZ29fc3RydWN0X3JlYWRlcihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiB0c3RydWN0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9nb19zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHRzdHJ1Y3RfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHVzZXNfY291bnRzZXRmaWVsZHMgPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfZ29fZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICB2b2lkIGdldF9wdWJsaWNpemVkX25hbWVfYW5kX2RlZl92YWx1ZSh0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogT1VUX3B1Yl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiogT1VUX2RlZl92YWx1ZSkgY29uc3Q7CisKKyAgLyoqCisgICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9yZW1vdGUodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCisgIC8qKgorICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWNsYXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbGFzcyA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY29lcmNlRGF0YSA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5rZXkgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NvbnRhaW5lciA9IGZhbHNlKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcG9pbnRlcl9maWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWNsYXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlcl9maWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWNsYXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlY2xhcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWNsYXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWNsYXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5rZXkgPSBmYWxzZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXJfZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBraXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdml0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdGQ6OnN0cmluZyBpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX2dvX2RvY3N0cmluZyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIHZvaWQgZ2VuZXJhdGVfZ29fZG9jc3RyaW5nKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCisgIHZvaWQgZ2VuZXJhdGVfZ29fZG9jc3RyaW5nKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2RvYyogdGRvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHN1YmhlYWRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9nb19kb2NzdHJpbmcoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKTsKKworICAvKioKKyAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKKyAgICovCisKKyAgc3RkOjpzdHJpbmcgZ29fYXV0b2dlbl9jb21tZW50KCk7CisgIHN0ZDo6c3RyaW5nIGdvX3BhY2thZ2UoKTsKKyAgc3RkOjpzdHJpbmcgZ29faW1wb3J0c19iZWdpbihib29sIGNvbnN0cyk7CisgIHN0ZDo6c3RyaW5nIGdvX2ltcG9ydHNfZW5kKCk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9pbmNsdWRlcyhib29sIGNvbnN0cyk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9pbmNsdWRlZF9wcm9ncmFtcyhzdHJpbmcmIHVudXNlZF9wcm90ZWN0aW9uKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2ltcG9ydF9wcm90ZWN0aW9uKCk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9mYXN0YmluYXJ5X2luY2x1ZGVzKCk7CisgIHN0ZDo6c3RyaW5nIGRlY2xhcmVfYXJndW1lbnQodF9maWVsZCogdGZpZWxkKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2ZpZWxkX2luaXRpYWxfdmFsdWUodF9maWVsZCogdGZpZWxkLCBjb25zdCBzdHJpbmcmIG5hbWUsIGJvb2wgb3B0aW9uYWxfZmllbGQpOworICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIG1vZHVsZV9uYW1lKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZV9pZih0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWRkRXJyb3IgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZ29fdHlwZSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19nb190eXBlX3dpdGhfb3B0KHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9wdGlvbmFsX2ZpZWxkKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19nb19rZXlfdHlwZSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19zcGVjX2FyZ3ModF90eXBlKiB0dHlwZSk7CisKKyAgc3RhdGljIHN0ZDo6c3RyaW5nIGdldF9yZWFsX2dvX21vZHVsZShjb25zdCB0X3Byb2dyYW0qIHByb2dyYW0pIHsKKworICAgIGlmICghcGFja2FnZV9mbGFnLmVtcHR5KCkpIHsKKyAgICAgIHJldHVybiBwYWNrYWdlX2ZsYWc7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIHJlYWxfbW9kdWxlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiZ28iKTsKKyAgICBpZiAoIXJlYWxfbW9kdWxlLmVtcHR5KCkpIHsKKyAgICAgIHJldHVybiByZWFsX21vZHVsZTsKKyAgICB9CisKKyAgICByZXR1cm4gbG93ZXJjYXNlKHByb2dyYW0tPmdldF9uYW1lKCkpOworICB9CisKK3ByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIGdlbl9wYWNrYWdlX3ByZWZpeF87CisgIHN0ZDo6c3RyaW5nIGdlbl90aHJpZnRfaW1wb3J0XzsKKyAgYm9vbCByZWFkX3dyaXRlX3ByaXZhdGVfOworICBib29sIGlnbm9yZV9pbml0aWFsaXNtc187CisKKyAgLyoqCisgICAqIEZpbGUgc3RyZWFtcworICAgKi8KKworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfdHlwZXNfOworICBzdGQ6OnN0cmluZyBmX3R5cGVzX25hbWVfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfY29uc3RzXzsKKyAgc3RkOjpzdHJpbmcgZl9jb25zdHNfbmFtZV87CisgIHN0ZDo6c3RyaW5nc3RyZWFtIGZfY29uc3RfdmFsdWVzXzsKKworICBzdGQ6OnN0cmluZyBwYWNrYWdlX25hbWVfOworICBzdGQ6OnN0cmluZyBwYWNrYWdlX2Rpcl87CisgIHN0ZDo6c3RyaW5nIHJlYWRfbWV0aG9kX25hbWVfOworICBzdGQ6OnN0cmluZyB3cml0ZV9tZXRob2RfbmFtZV87CisKKyAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IGNvbW1vbkluaXRpYWxpc21zOworCisgIHN0ZDo6c3RyaW5nIGNhbWVsY2FzZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIGNvbnN0OworICB2b2lkIGZpeF9jb21tb25faW5pdGlhbGlzbShzdGQ6OnN0cmluZyYgdmFsdWUsIGludCBpKSBjb25zdDsKKyAgc3RkOjpzdHJpbmcgcHVibGljaXplKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSwgYm9vbCBpc19hcmdzX29yX3Jlc3VsdCA9IGZhbHNlKSBjb25zdDsKKyAgc3RkOjpzdHJpbmcgcHJpdmF0aXplKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgY29uc3Q7CisgIHN0ZDo6c3RyaW5nIG5ld19wcmVmaXgoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSBjb25zdDsKKyAgc3RhdGljIHN0ZDo6c3RyaW5nIHZhcmlhYmxlX25hbWVfdG9fZ29fbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpOworICBzdGF0aWMgYm9vbCBpc19wb2ludGVyX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbl9jb250YWluZXIgPSBmYWxzZSk7CisgIHN0YXRpYyBib29sIG9taXRfaW5pdGlhbGl6YXRpb24odF9maWVsZCogdGZpZWxkKTsKK307CisKKy8vIHJldHVybnMgdHJ1ZSBpZiBmaWVsZCBpbml0aWFsaXphdGlvbiBjYW4gYmUgb21pdHRlZCBzaW5jZSBpdCBoYXMgY29ycmVzcG9uZGluZyBnbyB0eXBlIHplcm8gdmFsdWUKKy8vIG9yIGRlZmF1bHQgdmFsdWUgaXMgbm90IHNldAorYm9vbCB0X2dvX2dlbmVyYXRvcjo6b21pdF9pbml0aWFsaXphdGlvbih0X2ZpZWxkKiB0ZmllbGQpIHsKKyAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSB0ZmllbGQtPmdldF92YWx1ZSgpOworICBpZiAoIXZhbHVlKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgdF90eXBlKiB0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpLT5nZXRfdHJ1ZV90eXBlKCk7CisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiIjsKKworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgIC8vW11ieXRlIGFyZSBhbHdheXMgaW5saW5lCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIC8vIHN0cmluZ3MgYXJlIHBvaW50ZXJzIGlmIGhhcyBubyBkZWZhdWx0CisgICAgICByZXR1cm4gdmFsdWUtPmdldF9zdHJpbmcoKS5lbXB0eSgpOworCisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gdmFsdWUtPmdldF9pbnRlZ2VyKCkgPT0gMDsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIHJldHVybiB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA9PSAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlLT5nZXRfZG91YmxlKCkgPT0gMC47CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmIHRoZSB0eXBlIG5lZWQgYSByZWZlcmVuY2UgaWYgdXNlZCBhcyBvcHRpb25hbCB3aXRob3V0IGRlZmF1bHQKK3N0YXRpYyBib29sIHR5cGVfbmVlZF9yZWZlcmVuY2UodF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSB0eXBlLT5nZXRfdHJ1ZV90eXBlKCk7CisgIGlmICh0eXBlLT5pc19tYXAoKSB8fCB0eXBlLT5pc19zZXQoKSB8fCB0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc3RydWN0KCkKKyAgICAgIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkgfHwgdHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIHJldHVybnMgZmFsc2UgaWYgZmllbGQgY291bGQgbm90IHVzZSBjb21wYXJpc29uIHRvIGRlZmF1bHQgdmFsdWUgYXMgIUlzU2V0KgorYm9vbCB0X2dvX2dlbmVyYXRvcjo6aXNfcG9pbnRlcl9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5fY29udGFpbmVyX3ZhbHVlKSB7CisgICh2b2lkKWluX2NvbnRhaW5lcl92YWx1ZTsKKyAgaWYgKHRmaWVsZC0+YW5ub3RhdGlvbnNfLmNvdW50KCJjcHAucmVmIikgIT0gMCkgeworICAgIHJldHVybiB0cnVlOworICB9CisgIHRfdHlwZSogdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKS0+Z2V0X3RydWVfdHlwZSgpOworICAvLyBTdHJ1Y3RzIGluIGNvbnRhaW5lcnMgYXJlIHBvaW50ZXJzCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgaWYgKCEodGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgYm9vbCBoYXNfZGVmYXVsdCA9IHRmaWVsZC0+Z2V0X3ZhbHVlKCk7CisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiIjsKKworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgIC8vW11ieXRlIGFyZSBhbHdheXMgaW5saW5lCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIC8vIHN0cmluZ3MgYXJlIHBvaW50ZXJzIGlmIGhhcyBubyBkZWZhdWx0CisgICAgICByZXR1cm4gIWhhc19kZWZhdWx0OworCisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIWhhc19kZWZhdWx0OworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIWhhc19kZWZhdWx0OworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiBoYXNfZGVmYXVsdDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiBoYXNfZGVmYXVsdDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gaGFzX2RlZmF1bHQ7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgcmV0dXJuIGhhc19kZWZhdWx0OworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2dvX3R5cGU6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCitzdGQ6OnN0cmluZyB0X2dvX2dlbmVyYXRvcjo6Y2FtZWxjYXNlKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgY29uc3QgeworICBzdGQ6OnN0cmluZyB2YWx1ZTIodmFsdWUpOworICBzdGQ6OnNldGxvY2FsZShMQ19BTEwsICJDIik7IC8vIHNldCBsb2NhbGUgdG8gY2xhc3NpYworCisgIC8vIEZpeCBjb21tb24gaW5pdGlhbGlzbSBpbiBmaXJzdCB3b3JkCisgIGZpeF9jb21tb25faW5pdGlhbGlzbSh2YWx1ZTIsIDApOworCisgIC8vIGFzIGxvbmcgYXMgd2UgYXJlIGNoYW5naW5nIHRoaW5ncywgbGV0J3MgY2hhbmdlIF8gZm9sbG93ZWQgYnkgbG93ZXJjYXNlIHRvCisgIC8vIGNhcGl0YWwgYW5kIGZpeCBjb21tb24gaW5pdGlhbGlzbXMKKyAgZm9yIChzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGkgPSAxOyBpIDwgdmFsdWUyLnNpemUoKSAtIDE7ICsraSkgeworICAgIGlmICh2YWx1ZTJbaV0gPT0gJ18nKSB7CisgICAgICBpZiAoaXNsb3dlcih2YWx1ZTJbaSArIDFdKSkgeworICAgICAgICB2YWx1ZTIucmVwbGFjZShpLCAyLCAxLCB0b3VwcGVyKHZhbHVlMltpICsgMV0pKTsKKyAgICAgIH0KKworICAgICAgaWYgKGkgPiBzdGF0aWNfY2FzdDxzdGQ6OnN0cmluZzo6c2l6ZV90eXBlPihzdGQ6Om51bWVyaWNfbGltaXRzPGludD4oKS5tYXgoKSkpIHsKKyAgICAgICAgdGhyb3cgImludGVnZXIgb3ZlcmZsb3cgaW4gdF9nb19nZW5lcmF0b3I6OmNhbWVsY2FzZSwgdmFsdWUgPSAiICsgdmFsdWU7CisgICAgICB9CisgICAgICBmaXhfY29tbW9uX2luaXRpYWxpc20odmFsdWUyLCBzdGF0aWNfY2FzdDxpbnQ+KGkpKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gdmFsdWUyOworfQorCisvLyBDaGVja3MgdG8gc2VlIGlmIHRoZSB3b3JkIHN0YXJ0aW5nIGF0IGkgaW4gdmFsdWUgY29udGFpbnMgYSBjb21tb24gaW5pdGlhbGlzbQorLy8gYW5kIGlmIHNvIHJlcGxhY2VzIGl0IHdpdGggdGhlIHVwcGVyIGNhc2UgdmVyc2lvbiBvZiB0aGUgd29yZC4KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmZpeF9jb21tb25faW5pdGlhbGlzbShzdGQ6OnN0cmluZyYgdmFsdWUsIGludCBpKSBjb25zdCB7CisgIGlmICghaWdub3JlX2luaXRpYWxpc21zXykgeworICAgIHNpemVfdCB3b3JkTGVuID0gdmFsdWUuZmluZCgnXycsIGkpOworICAgIGlmICh3b3JkTGVuICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICB3b3JkTGVuIC09IGk7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIHdvcmQgPSB2YWx1ZS5zdWJzdHIoaSwgd29yZExlbik7CisgICAgc3RkOjp0cmFuc2Zvcm0od29yZC5iZWdpbigpLCB3b3JkLmVuZCgpLCB3b3JkLmJlZ2luKCksIDo6dG91cHBlcik7CisgICAgaWYgKGNvbW1vbkluaXRpYWxpc21zLmZpbmQod29yZCkgIT0gY29tbW9uSW5pdGlhbGlzbXMuZW5kKCkpIHsKKyAgICAgIHZhbHVlLnJlcGxhY2UoaSwgd29yZC5sZW5ndGgoKSwgd29yZCk7CisgICAgfQorICB9Cit9CisKK3N0ZDo6c3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpwdWJsaWNpemUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlLCBib29sIGlzX2FyZ3Nfb3JfcmVzdWx0KSBjb25zdCB7CisgIGlmICh2YWx1ZS5zaXplKCkgPD0gMCkgeworICAgIHJldHVybiB2YWx1ZTsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIHZhbHVlMih2YWx1ZSksIHByZWZpeDsKKworICBzdHJpbmc6OnNpemVfdHlwZSBkb3RfcG9zID0gdmFsdWUucmZpbmQoJy4nKTsKKyAgaWYgKGRvdF9wb3MgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgcHJlZml4ID0gdmFsdWUuc3Vic3RyKDAsIGRvdF9wb3MgKyAxKSArIHByZWZpeDsKKyAgICB2YWx1ZTIgPSB2YWx1ZS5zdWJzdHIoZG90X3BvcyArIDEpOworICB9CisKKyAgaWYgKCFpc3VwcGVyKHZhbHVlMlswXSkpIHsKKyAgICB2YWx1ZTJbMF0gPSB0b3VwcGVyKHZhbHVlMlswXSk7CisgIH0KKworICB2YWx1ZTIgPSBjYW1lbGNhc2UodmFsdWUyKTsKKworICAvLyBmaW5hbCBsZW5ndGggYmVmb3JlIGZ1cnRoZXIgY2hlY2tzLCB0aGUgc3RyaW5nIG1heSBiZWNvbWUgbG9uZ2VyCisgIHNpemVfdCBsZW5fYmVmb3JlID0gdmFsdWUyLmxlbmd0aCgpOworCisgIC8vIElETCBpZGVudGlmaWVycyBtYXkgc3RhcnQgd2l0aCAiTmV3IiB3aGljaCBpbnRlcmZlcmVzIHdpdGggdGhlIENUT1IgcGF0dGVybgorICAvLyBBZGRpbmcgYW4gZXh0cmEgdW5kZXJzY29yZSB0byBhbGwgdGhvc2UgaWRlbnRpZmllcnMgc29sdmVzIHRoaXMKKyAgaWYgKChsZW5fYmVmb3JlID49IDMpICYmICh2YWx1ZTIuc3Vic3RyKDAsIDMpID09ICJOZXciKSkgeworICAgIHZhbHVlMiArPSAnXyc7CisgIH0KKworICAvLyBJREwgaWRlbnRpZmllcnMgbWF5IGVuZCB3aXRoICJBcmdzIi8iUmVzdWx0IiB3aGljaCBpbnRlcmZlcmVzIHdpdGggdGhlIGltcGxpY2l0IHNlcnZpY2UKKyAgLy8gZnVuY3Rpb24gc3RydWN0cworICAvLyBBZGRpbmcgYW5vdGhlciBleHRyYSB1bmRlcnNjb3JlIHRvIGFsbCB0aG9zZSBpZGVudGlmaWVycyBzb2x2ZXMgdGhpcworICAvLyBTdXBwcmVzcyB0aGlzIGNoZWNrIGZvciB0aGUgYWN0dWFsIGhlbHBlciBzdHJ1Y3QgbmFtZXMKKyAgaWYgKCFpc19hcmdzX29yX3Jlc3VsdCkgeworICAgIGJvb2wgZW5kc193aXRoX2FyZ3MgPSAobGVuX2JlZm9yZSA+PSA0KSAmJiAodmFsdWUyLnN1YnN0cihsZW5fYmVmb3JlIC0gNCwgNCkgPT0gIkFyZ3MiKTsKKyAgICBib29sIGVuZHNfd2l0aF9yc2x0ID0gKGxlbl9iZWZvcmUgPj0gNikgJiYgKHZhbHVlMi5zdWJzdHIobGVuX2JlZm9yZSAtIDYsIDYpID09ICJSZXN1bHQiKTsKKyAgICBpZiAoZW5kc193aXRoX2FyZ3MgfHwgZW5kc193aXRoX3JzbHQpIHsKKyAgICAgIHZhbHVlMiArPSAnXyc7CisgICAgfQorICB9CisKKyAgLy8gQXZvaWQgbmFtaW5nIGNvbGxpc2lvbnMgd2l0aCBvdGhlciBzZXJ2aWNlcworICBpZiAoaXNfYXJnc19vcl9yZXN1bHQpIHsKKyAgICBwcmVmaXggKz0gcHVibGljaXplKHNlcnZpY2VfbmFtZV8pOworICB9CisKKyAgcmV0dXJuIHByZWZpeCArIHZhbHVlMjsKK30KKworc3RkOjpzdHJpbmcgdF9nb19nZW5lcmF0b3I6Om5ld19wcmVmaXgoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSBjb25zdCB7CisgIGlmICh2YWx1ZS5zaXplKCkgPD0gMCkgeworICAgIHJldHVybiB2YWx1ZTsKKyAgfQorCisgIHN0cmluZzo6c2l6ZV90eXBlIGRvdF9wb3MgPSB2YWx1ZS5yZmluZCgnLicpOworICBpZiAoZG90X3BvcyAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICByZXR1cm4gdmFsdWUuc3Vic3RyKDAsIGRvdF9wb3MgKyAxKSArICJOZXciICsgcHVibGljaXplKHZhbHVlLnN1YnN0cihkb3RfcG9zICsgMSkpOworICB9CisgIHJldHVybiAiTmV3IiArIHB1YmxpY2l6ZSh2YWx1ZSk7Cit9CisKK3N0ZDo6c3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpwcml2YXRpemUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSBjb25zdCB7CisgIGlmICh2YWx1ZS5zaXplKCkgPD0gMCkgeworICAgIHJldHVybiB2YWx1ZTsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIHZhbHVlMih2YWx1ZSk7CisKKyAgaWYgKCFpc2xvd2VyKHZhbHVlMlswXSkpIHsKKyAgICB2YWx1ZTJbMF0gPSB0b2xvd2VyKHZhbHVlMlswXSk7CisgIH0KKworICB2YWx1ZTIgPSBjYW1lbGNhc2UodmFsdWUyKTsKKworICByZXR1cm4gdmFsdWUyOworfQorCitzdGQ6OnN0cmluZyB0X2dvX2dlbmVyYXRvcjo6dmFyaWFibGVfbmFtZV90b19nb19uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBpZiAodmFsdWUuc2l6ZSgpIDw9IDApIHsKKyAgICByZXR1cm4gdmFsdWU7CisgIH0KKworICBzdGQ6OnN0cmluZyB2YWx1ZTIodmFsdWUpOworICBzdGQ6OnRyYW5zZm9ybSh2YWx1ZTIuYmVnaW4oKSwgdmFsdWUyLmVuZCgpLCB2YWx1ZTIuYmVnaW4oKSwgOjp0b2xvd2VyKTsKKworICBzd2l0Y2ggKHZhbHVlWzBdKSB7CisgIGNhc2UgJ2InOgorICBjYXNlICdCJzoKKyAgICBpZiAodmFsdWUyICE9ICJicmVhayIpIHsKKyAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICBicmVhazsKKworICBjYXNlICdjJzoKKyAgY2FzZSAnQyc6CisgICAgaWYgKHZhbHVlMiAhPSAiY2FzZSIgJiYgdmFsdWUyICE9ICJjaGFuIiAmJiB2YWx1ZTIgIT0gImNvbnN0IiAmJiB2YWx1ZTIgIT0gImNvbnRpbnVlIikgeworICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIGJyZWFrOworCisgIGNhc2UgJ2QnOgorICBjYXNlICdEJzoKKyAgICBpZiAodmFsdWUyICE9ICJkZWZhdWx0IiAmJiB2YWx1ZTIgIT0gImRlZmVyIikgeworICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIGJyZWFrOworCisgIGNhc2UgJ2UnOgorICBjYXNlICdFJzoKKyAgICBpZiAodmFsdWUyICE9ICJlbHNlIiAmJiB2YWx1ZTIgIT0gImVycm9yIikgeworICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIGJyZWFrOworCisgIGNhc2UgJ2YnOgorICBjYXNlICdGJzoKKyAgICBpZiAodmFsdWUyICE9ICJmYWxsdGhyb3VnaCIgJiYgdmFsdWUyICE9ICJmb3IiICYmIHZhbHVlMiAhPSAiZnVuYyIpIHsKKyAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICBicmVhazsKKworICBjYXNlICdnJzoKKyAgY2FzZSAnRyc6CisgICAgaWYgKHZhbHVlMiAhPSAiZ28iICYmIHZhbHVlMiAhPSAiZ290byIpIHsKKyAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICBicmVhazsKKworICBjYXNlICdpJzoKKyAgY2FzZSAnSSc6CisgICAgaWYgKHZhbHVlMiAhPSAiaWYiICYmIHZhbHVlMiAhPSAiaW1wb3J0IiAmJiB2YWx1ZTIgIT0gImludGVyZmFjZSIpIHsKKyAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICBicmVhazsKKworICBjYXNlICdtJzoKKyAgY2FzZSAnTSc6CisgICAgaWYgKHZhbHVlMiAhPSAibWFwIikgeworICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIGJyZWFrOworCisgIGNhc2UgJ3AnOgorICBjYXNlICdQJzoKKyAgICBpZiAodmFsdWUyICE9ICJwYWNrYWdlIikgeworICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIGJyZWFrOworCisgIGNhc2UgJ3InOgorICBjYXNlICdSJzoKKyAgICBpZiAodmFsdWUyICE9ICJyYW5nZSIgJiYgdmFsdWUyICE9ICJyZXR1cm4iKSB7CisgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgYnJlYWs7CisKKyAgY2FzZSAncyc6CisgIGNhc2UgJ1MnOgorICAgIGlmICh2YWx1ZTIgIT0gInNlbGVjdCIgJiYgdmFsdWUyICE9ICJzdHJ1Y3QiICYmIHZhbHVlMiAhPSAic3dpdGNoIikgeworICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIGJyZWFrOworCisgIGNhc2UgJ3QnOgorICBjYXNlICdUJzoKKyAgICBpZiAodmFsdWUyICE9ICJ0eXBlIikgeworICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIGJyZWFrOworCisgIGNhc2UgJ3YnOgorICBjYXNlICdWJzoKKyAgICBpZiAodmFsdWUyICE9ICJ2YXIiKSB7CisgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgYnJlYWs7CisKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gdmFsdWU7CisgIH0KKworICByZXR1cm4gdmFsdWUyICsgIl9hMSI7Cit9CisKKy8qKgorICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKKyAqIHN0cmVhbXMuCisgKgorICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKKyAgc3RyaW5nIG1vZHVsZSA9IGdldF9yZWFsX2dvX21vZHVsZShwcm9ncmFtXyk7CisgIHN0cmluZyB0YXJnZXQgPSBtb2R1bGU7CisgIHBhY2thZ2VfZGlyXyA9IGdldF9vdXRfZGlyKCk7CisKKyAgLy8gVGhpcyBzZXQgaXMgdGFrZW4gZnJvbSBodHRwczovL2dpdGh1Yi5jb20vZ29sYW5nL2xpbnQvYmxvYi9tYXN0ZXIvbGludC5nbyNMNjkyCisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiQVBJIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiQVNDSUkiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJDUFUiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJDU1MiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJETlMiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJFT0YiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJHVUlEIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiSFRNTCIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIkhUVFAiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJIVFRQUyIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIklEIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiSVAiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJKU09OIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiTEhTIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiUVBTIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiUkFNIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiUkhTIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiUlBDIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiU0xBIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiU01UUCIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIlNTSCIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIlRDUCIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIlRMUyIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIlRUTCIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIlVEUCIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIlVJIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiVUlEIik7CisgIGNvbW1vbkluaXRpYWxpc21zLmluc2VydCgiVVVJRCIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIlVSSSIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIlVSTCIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIlVURjgiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJWTSIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIlhNTCIpOworICBjb21tb25Jbml0aWFsaXNtcy5pbnNlcnQoIlhTUkYiKTsKKyAgY29tbW9uSW5pdGlhbGlzbXMuaW5zZXJ0KCJYU1MiKTsKKworICAvLyBuYW1lcyBvZiByZWFkIGFuZCB3cml0ZSBtZXRob2RzCisgIGlmIChyZWFkX3dyaXRlX3ByaXZhdGVfKSB7CisgICAgcmVhZF9tZXRob2RfbmFtZV8gPSAicmVhZCI7CisgICAgd3JpdGVfbWV0aG9kX25hbWVfID0gIndyaXRlIjsKKyAgfSBlbHNlIHsKKyAgICByZWFkX21ldGhvZF9uYW1lXyA9ICJSZWFkIjsKKyAgICB3cml0ZV9tZXRob2RfbmFtZV8gPSAiV3JpdGUiOworICB9CisKKyAgd2hpbGUgKHRydWUpIHsKKyAgICAvLyBUT0RPOiBEbyBiZXR0ZXIgZXJyb3IgY2hlY2tpbmcgaGVyZS4KKyAgICBNS0RJUihwYWNrYWdlX2Rpcl8uY19zdHIoKSk7CisKKyAgICBpZiAobW9kdWxlLmVtcHR5KCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIHN0cmluZzo6c2l6ZV90eXBlIHBvcyA9IG1vZHVsZS5maW5kKCcuJyk7CisKKyAgICBpZiAocG9zID09IHN0cmluZzo6bnBvcykgeworICAgICAgcGFja2FnZV9kaXJfICs9ICIvIjsKKyAgICAgIHBhY2thZ2VfZGlyXyArPSBtb2R1bGU7CisgICAgICBwYWNrYWdlX25hbWVfID0gbW9kdWxlOworICAgICAgbW9kdWxlLmNsZWFyKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHBhY2thZ2VfZGlyXyArPSAiLyI7CisgICAgICBwYWNrYWdlX2Rpcl8gKz0gbW9kdWxlLnN1YnN0cigwLCBwb3MpOworICAgICAgbW9kdWxlLmVyYXNlKDAsIHBvcyArIDEpOworICAgIH0KKyAgfQorCisgIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKKworICB3aGlsZSAoKGxvYyA9IHRhcmdldC5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykgeworICAgIHRhcmdldC5yZXBsYWNlKGxvYywgMSwgMSwgJy8nKTsKKyAgfQorCisgIC8vIE1ha2Ugb3V0cHV0IGZpbGVzCisgIGZfdHlwZXNfbmFtZV8gPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBwcm9ncmFtX25hbWVfICsgIi5nbyI7CisgIGZfdHlwZXNfLm9wZW4oZl90eXBlc19uYW1lXy5jX3N0cigpKTsKKworICBmX2NvbnN0c19uYW1lXyA9IHBhY2thZ2VfZGlyXyArICIvIiArIHByb2dyYW1fbmFtZV8gKyAiLWNvbnN0cy5nbyI7CisgIGZfY29uc3RzXy5vcGVuKGZfY29uc3RzX25hbWVfLmNfc3RyKCkpOworCisgIC8vIFByaW50IGhlYWRlcgorICBmX3R5cGVzXyA8PCBnb19hdXRvZ2VuX2NvbW1lbnQoKSA8PCBnb19wYWNrYWdlKCkgPDwgcmVuZGVyX2luY2x1ZGVzKGZhbHNlKTsKKworICBmX2NvbnN0c18gPDwgZ29fYXV0b2dlbl9jb21tZW50KCkgPDwgZ29fcGFja2FnZSgpIDw8IHJlbmRlcl9pbmNsdWRlcyh0cnVlKTsKKworICBmX2NvbnN0X3ZhbHVlc18gPDwgZW5kbCA8PCAiZnVuYyBpbml0KCkgeyIgPDwgZW5kbDsKKworICAvLyBDcmVhdGUgZmlsZSBmb3IgdGhlIEdvVW51c2VkUHJvdGVjdGlvbl9fIHZhcmlhYmxlCisgIHN0cmluZyBmX3VudXNlZF9wcm90X25hbWVfID0gcGFja2FnZV9kaXJfICsgIi8iICsgIkdvVW51c2VkUHJvdGVjdGlvbl9fLmdvIjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3VudXNlZF9wcm90XzsKKyAgZl91bnVzZWRfcHJvdF8ub3BlbihmX3VudXNlZF9wcm90X25hbWVfLmNfc3RyKCkpOworICBmX3VudXNlZF9wcm90XyA8PCBnb19hdXRvZ2VuX2NvbW1lbnQoKSA8PCBnb19wYWNrYWdlKCkgPDwgcmVuZGVyX2ltcG9ydF9wcm90ZWN0aW9uKCk7CisgIGZfdW51c2VkX3Byb3RfLmNsb3NlKCk7Cit9CisKKworc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpyZW5kZXJfaW5jbHVkZWRfcHJvZ3JhbXMoc3RyaW5nJiB1bnVzZWRfcHJvdGVjdGlvbikgeworICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisKKyAgdW51c2VkX3Byb3RlY3Rpb24gPSAiIjsKKworICBzdHJpbmcgbG9jYWxfbmFtZXNwYWNlID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoImdvIik7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKKyAgICBpZiAoIWxvY2FsX25hbWVzcGFjZS5lbXB0eSgpICYmIGxvY2FsX25hbWVzcGFjZSA9PSBpbmNsdWRlc1tpXS0+Z2V0X25hbWVzcGFjZSgiZ28iKSkgeworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgc3RyaW5nIGdvX21vZHVsZSA9IGdldF9yZWFsX2dvX21vZHVsZShpbmNsdWRlc1tpXSk7CisgICAgc2l6ZV90IGZvdW5kID0gMDsKKyAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGdvX21vZHVsZS5zaXplKCk7IGorKykgeworICAgICAgLy8gSW1wb3J0IHN0YXRlbWVudCB1c2VzIHNsYXNoZXMgKCcvJykgaW4gbmFtZXNwYWNlCisgICAgICBpZiAoZ29fbW9kdWxlW2pdID09ICcuJykgeworICAgICAgICBnb19tb2R1bGVbal0gPSAnLyc7CisgICAgICAgIGZvdW5kID0gaiArIDE7CisgICAgICB9CisgICAgfQorCisgICAgcmVzdWx0ICs9ICJcdFwiIiArIGdlbl9wYWNrYWdlX3ByZWZpeF8gKyBnb19tb2R1bGUgKyAiXCJcbiI7CisgICAgdW51c2VkX3Byb3RlY3Rpb24gKz0gInZhciBfID0gIiArIGdvX21vZHVsZS5zdWJzdHIoZm91bmQpICsgIi5Hb1VudXNlZFByb3RlY3Rpb25fX1xuIjsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogUmVuZGVycyBhbGwgdGhlIGltcG9ydHMgbmVjZXNzYXJ5IGZvciBpbmNsdWRpbmcgYW5vdGhlciBUaHJpZnQgcHJvZ3JhbS4KKyAqIElmIGNvbnN0cyBpbmNsdWRlIHRoZSBhZGRpdGlvbmFsIGltcG9ydHMuCisgKi8KK3N0cmluZyB0X2dvX2dlbmVyYXRvcjo6cmVuZGVyX2luY2x1ZGVzKGJvb2wgY29uc3RzKSB7CisgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKyAgc3RyaW5nIHVudXNlZF9wcm90ID0gIiI7CisKKyAgc3RyaW5nIGxvY2FsX25hbWVzcGFjZSA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJnbyIpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluY2x1ZGVzLnNpemUoKTsgKytpKSB7CisgICAgaWYgKCFsb2NhbF9uYW1lc3BhY2UuZW1wdHkoKSAmJiBsb2NhbF9uYW1lc3BhY2UgPT0gaW5jbHVkZXNbaV0tPmdldF9uYW1lc3BhY2UoImdvIikpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIHN0cmluZyBnb19tb2R1bGUgPSBnZXRfcmVhbF9nb19tb2R1bGUoaW5jbHVkZXNbaV0pOworICAgIHNpemVfdCBmb3VuZCA9IDA7CisgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBnb19tb2R1bGUuc2l6ZSgpOyBqKyspIHsKKyAgICAgIC8vIEltcG9ydCBzdGF0ZW1lbnQgdXNlcyBzbGFzaGVzICgnLycpIGluIG5hbWVzcGFjZQorICAgICAgaWYgKGdvX21vZHVsZVtqXSA9PSAnLicpIHsKKyAgICAgICAgZ29fbW9kdWxlW2pdID0gJy8nOworICAgICAgICBmb3VuZCA9IGogKyAxOworICAgICAgfQorICAgIH0KKworICAgIHJlc3VsdCArPSAiXHRcIiIgKyBnZW5fcGFja2FnZV9wcmVmaXhfICsgZ29fbW9kdWxlICsgIlwiXG4iOworICAgIHVudXNlZF9wcm90ICs9ICJ2YXIgXyA9ICIgKyBnb19tb2R1bGUuc3Vic3RyKGZvdW5kKSArICIuR29VbnVzZWRQcm90ZWN0aW9uX19cbiI7CisgIH0KKworICBpZiAoaW5jbHVkZXMuc2l6ZSgpID4gMCkgeworICAgIHJlc3VsdCArPSAiXG4iOworICB9CisKKyAgcmV0dXJuIGdvX2ltcG9ydHNfYmVnaW4oY29uc3RzKSArIHJlc3VsdCArIGdvX2ltcG9ydHNfZW5kKCkgKyB1bnVzZWRfcHJvdDsKK30KKworc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpyZW5kZXJfaW1wb3J0X3Byb3RlY3Rpb24oKSB7CisgIHJldHVybiBzdHJpbmcoInZhciBHb1VudXNlZFByb3RlY3Rpb25fXyBpbnQ7XG5cbiIpOworfQorCisvKioKKyAqIFJlbmRlcnMgYWxsIHRoZSBpbXBvcnRzIG5lY2Vzc2FyeSB0byB1c2UgdGhlIGFjY2VsZXJhdGVkIFRCaW5hcnlQcm90b2NvbAorICovCitzdHJpbmcgdF9nb19nZW5lcmF0b3I6OnJlbmRlcl9mYXN0YmluYXJ5X2luY2x1ZGVzKCkgeworICByZXR1cm4gIiI7Cit9CisKKy8qKgorICogQXV0b2dlbidkIGNvbW1lbnQKKyAqLworc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpnb19hdXRvZ2VuX2NvbW1lbnQoKSB7CisgIHJldHVybgorICAgICAgICBzdGQ6OnN0cmluZygpICsKKyAgICAgICAgIi8vIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgiICsgVEhSSUZUX1ZFUlNJT04gKyAiKVxuIgorICAgICAgICAiLy8gRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lOR1xuXG4iOworfQorCisvKioKKyAqIFByaW50cyBzdGFuZGFyZCB0aHJpZnQgcGFja2FnZQorICovCitzdHJpbmcgdF9nb19nZW5lcmF0b3I6OmdvX3BhY2thZ2UoKSB7CisgIHJldHVybiBzdHJpbmcoInBhY2thZ2UgIikgKyBwYWNrYWdlX25hbWVfICsgIlxuXG4iOworfQorCisvKioKKyAqIFJlbmRlciB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbXBvcnQgc3RhdGVtZW50LgorICogSWYgY29uc3RzIGluY2x1ZGUgdGhlIGFkZGl0aW9uYWwgaW1wb3J0cy4KKyAqLworc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpnb19pbXBvcnRzX2JlZ2luKGJvb2wgY29uc3RzKSB7CisgIHN0cmluZyBleHRyYTsKKworICAvLyBJZiBub3Qgd3JpdGluZyBjb25zdGFudHMsIGFuZCB0aGVyZSBhcmUgZW51bXMsIG5lZWQgZXh0cmEgaW1wb3J0cy4KKyAgaWYgKCFjb25zdHMgJiYgZ2V0X3Byb2dyYW0oKS0+Z2V0X2VudW1zKCkuc2l6ZSgpID4gMCkgeworICAgIGV4dHJhICs9CisgICAgICAiXHRcImRhdGFiYXNlL3NxbC9kcml2ZXJcIlxuIgorICAgICAgIlx0XCJlcnJvcnNcIlxuIjsKKyAgfQorICByZXR1cm4gc3RyaW5nKAorICAgICAgImltcG9ydCAoXG4iCisgICAgICAiXHRcImJ5dGVzXCJcbiIKKyAgICAgICJcdFwiY29udGV4dFwiXG4iCisgICAgICAiXHRcInJlZmxlY3RcIlxuIgorICAgICAgKyBleHRyYSArCisgICAgICAiXHRcImZtdFwiXG4iCisgICAgICAiXHRcIiIgKyBnZW5fdGhyaWZ0X2ltcG9ydF8gKyAiXCJcbiIpOworfQorCisvKioKKyAqIEVuZCB0aGUgaW1wb3J0IHN0YXRlbWVudCwgaW5jbHVkZSB1bmRzY29yZS1hc3NpZ25tZW50cworICoKKyAqIFRoZXNlICJfID0iIHByZXZlbnQgdGhlIGdvIGNvbXBpbGVyIGNvbXBsYWluaW5nIGFib3V0IHVudXNlZCBpbXBvcnRzLgorICogVGhpcyB3aWxsIGhhdmUgdG8gZG8gaW4gbGlldSBvZiBtb3JlIGludGVsbGlnZW50IGltcG9ydCBzdGF0ZW1lbnQgY29uc3RydWN0aW9uCisgKi8KK3N0cmluZyB0X2dvX2dlbmVyYXRvcjo6Z29faW1wb3J0c19lbmQoKSB7CisgIHJldHVybiBzdHJpbmcoCisgICAgICAiKVxuXG4iCisgICAgICAiLy8gKG5lZWRlZCB0byBlbnN1cmUgc2FmZXR5IGJlY2F1c2Ugb2YgbmFpdmUgaW1wb3J0IGxpc3QgY29uc3RydWN0aW9uLilcbiIKKyAgICAgICJ2YXIgXyA9IHRocmlmdC5aRVJPXG4iCisgICAgICAidmFyIF8gPSBmbXQuUHJpbnRmXG4iCisgICAgICAidmFyIF8gPSBjb250ZXh0LkJhY2tncm91bmRcbiIKKyAgICAgICJ2YXIgXyA9IHJlZmxlY3QuRGVlcEVxdWFsXG4iCisgICAgICAidmFyIF8gPSBieXRlcy5FcXVhbFxuXG4iKTsKK30KKworLyoqCisgKiBDbG9zZXMgdGhlIHR5cGUgZmlsZXMKKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworICBmX2NvbnN0X3ZhbHVlc18gPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgZl9jb25zdHNfIDw8IGZfY29uc3RfdmFsdWVzXy5zdHIoKTsKKworICAvLyBDbG9zZSB0eXBlcyBhbmQgY29uc3RhbnRzIGZpbGVzCisgIGZfY29uc3RzXy5jbG9zZSgpOworICBmX3R5cGVzXy5jbG9zZSgpOworICBmb3JtYXRfZ29fb3V0cHV0KGZfdHlwZXNfbmFtZV8pOworICBmb3JtYXRfZ29fb3V0cHV0KGZfY29uc3RzX25hbWVfKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLgorICoKKyAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICBnZW5lcmF0ZV9nb19kb2NzdHJpbmcoZl90eXBlc18sIHR0eXBlZGVmKTsKKyAgc3RyaW5nIG5ld190eXBlX25hbWUocHVibGljaXplKHR0eXBlZGVmLT5nZXRfc3ltYm9saWMoKSkpOworICBzdHJpbmcgYmFzZV90eXBlKHR5cGVfdG9fZ29fdHlwZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSkpOworCisgIGlmIChiYXNlX3R5cGUgPT0gbmV3X3R5cGVfbmFtZSkgeworICAgIHJldHVybjsKKyAgfQorCisgIGZfdHlwZXNfIDw8ICJ0eXBlICIgPDwgbmV3X3R5cGVfbmFtZSA8PCAiICIgPDwgYmFzZV90eXBlIDw8IGVuZGwgPDwgZW5kbDsKKyAgLy8gR2VuZXJhdGUgYSBjb252ZW5pZW5jZSBmdW5jdGlvbiB0aGF0IGNvbnZlcnRzIGFuIGluc3RhbmNlIG9mIGEgdHlwZQorICAvLyAod2hpY2ggbWF5IGJlIGEgY29uc3RhbnQpIGludG8gYSBwb2ludGVyIHRvIGFuIGluc3RhbmNlIG9mIGEgdHlwZS4KKyAgZl90eXBlc18gPDwgImZ1bmMgIiA8PCBuZXdfdHlwZV9uYW1lIDw8ICJQdHIodiAiIDw8IG5ld190eXBlX25hbWUgPDwgIikgKiIgPDwgbmV3X3R5cGVfbmFtZQorICAgICAgICAgICA8PCAiIHsgcmV0dXJuICZ2IH0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgY29kZSBmb3IgYW4gZW51bWVyYXRlZCB0eXBlLiBEb25lIHVzaW5nIGEgY2xhc3MgdG8gc2NvcGUKKyAqIHRoZSB2YWx1ZXMuCisgKgorICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHRvX3N0cmluZ19tYXBwaW5nLCBmcm9tX3N0cmluZ19tYXBwaW5nOworICBzdGQ6OnN0cmluZyB0ZW51bV9uYW1lKHB1YmxpY2l6ZSh0ZW51bS0+Z2V0X25hbWUoKSkpOworICBnZW5lcmF0ZV9nb19kb2NzdHJpbmcoZl90eXBlc18sIHRlbnVtKTsKKyAgZl90eXBlc18gPDwgInR5cGUgIiA8PCB0ZW51bV9uYW1lIDw8ICIgaW50NjQiIDw8IGVuZGwgPDwgImNvbnN0ICgiIDw8IGVuZGw7CisKKyAgdG9fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgImZ1bmMgKHAgIiA8PCB0ZW51bV9uYW1lIDw8ICIpIFN0cmluZygpIHN0cmluZyB7IiA8PCBlbmRsOworICB0b19zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAiICBzd2l0Y2ggcCB7IiA8PCBlbmRsOworCisgIGZyb21fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgImZ1bmMgIiA8PCB0ZW51bV9uYW1lIDw8ICJGcm9tU3RyaW5nKHMgc3RyaW5nKSAoIiA8PCB0ZW51bV9uYW1lCisgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgZXJyb3IpIHsiIDw8IGVuZGw7CisgIGZyb21fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgIiAgc3dpdGNoIHMgeyIgPDwgZW5kbDsKKworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGludCB2YWx1ZSA9IC0xOworCisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworCisgICAgc3RyaW5nIGl0ZXJfc3RkX25hbWUoZXNjYXBlX3N0cmluZygoKmNfaXRlciktPmdldF9uYW1lKCkpKTsKKyAgICBzdHJpbmcgaXRlcl9uYW1lKCgqY19pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgIiA8PCB0ZW51bV9uYW1lIDw8ICJfIiA8PCBpdGVyX25hbWUgPDwgJyAnIDw8IHRlbnVtX25hbWUgPDwgIiA9ICIKKyAgICAgICAgICAgICA8PCB2YWx1ZSA8PCBlbmRsOworICAgIC8vIERpY3Rpb25hcmllcyB0by9mcm9tIHN0cmluZyBuYW1lcyBvZiBlbnVtcworICAgIHRvX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICIgIGNhc2UgIiA8PCB0ZW51bV9uYW1lIDw8ICJfIiA8PCBpdGVyX25hbWUgPDwgIjogcmV0dXJuIFwiIgorICAgICAgICAgICAgICAgICAgICAgIDw8IGl0ZXJfc3RkX25hbWUgPDwgIlwiIiA8PCBlbmRsOworCisgICAgaWYgKGl0ZXJfc3RkX25hbWUgIT0gZXNjYXBlX3N0cmluZyhpdGVyX25hbWUpKSB7CisgICAgICBmcm9tX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICIgIGNhc2UgXCIiIDw8IGl0ZXJfc3RkX25hbWUgPDwgIlwiLCBcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZXNjYXBlX3N0cmluZyhpdGVyX25hbWUpIDw8ICJcIjogcmV0dXJuICIgPDwgdGVudW1fbmFtZSA8PCAiXyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgaXRlcl9uYW1lIDw8ICIsIG5pbCAiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZyb21fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgIiAgY2FzZSBcIiIgPDwgaXRlcl9zdGRfbmFtZSA8PCAiXCI6IHJldHVybiAiIDw8IHRlbnVtX25hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIl8iIDw8IGl0ZXJfbmFtZSA8PCAiLCBuaWwgIiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIHRvX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7CisgIHRvX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBcIjxVTlNFVD5cIiIgPDwgZW5kbDsKKyAgdG9fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGZyb21fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgZnJvbV9zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCB0ZW51bV9uYW1lIDw8ICIoMCksIgorICAgICAgICAgICAgICAgICAgICAgIDw8ICIgZm10LkVycm9yZihcIm5vdCBhIHZhbGlkICIgPDwgdGVudW1fbmFtZSA8PCAiIHN0cmluZ1wiKSIgPDwgZW5kbDsKKyAgZnJvbV9zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICBmX3R5cGVzXyA8PCAiKSIgPDwgZW5kbCA8PCBlbmRsIDw8IHRvX3N0cmluZ19tYXBwaW5nLnN0cigpIDw8IGVuZGwgPDwgZnJvbV9zdHJpbmdfbWFwcGluZy5zdHIoKQorICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgYSBjb252ZW5pZW5jZSBmdW5jdGlvbiB0aGF0IGNvbnZlcnRzIGFuIGluc3RhbmNlIG9mIGFuIGVudW0KKyAgLy8gKHdoaWNoIG1heSBiZSBhIGNvbnN0YW50KSBpbnRvIGEgcG9pbnRlciB0byBhbiBpbnN0YW5jZSBvZiB0aGF0IGVudW0KKyAgLy8gdHlwZS4KKyAgZl90eXBlc18gPDwgImZ1bmMgIiA8PCB0ZW51bV9uYW1lIDw8ICJQdHIodiAiIDw8IHRlbnVtX25hbWUgPDwgIikgKiIgPDwgdGVudW1fbmFtZQorICAgICAgICAgICA8PCAiIHsgcmV0dXJuICZ2IH0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSBNYXJzaGFsVGV4dAorICBmX3R5cGVzXyA8PCAiZnVuYyAocCAiIDw8IHRlbnVtX25hbWUgPDwgIikgTWFyc2hhbFRleHQoKSAoW11ieXRlLCBlcnJvcikgeyIgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgInJldHVybiBbXWJ5dGUocC5TdHJpbmcoKSksIG5pbCIgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSBVbm1hcnNoYWxUZXh0CisgIGZfdHlwZXNfIDw8ICJmdW5jIChwICoiIDw8IHRlbnVtX25hbWUgPDwgIikgVW5tYXJzaGFsVGV4dCh0ZXh0IFtdYnl0ZSkgZXJyb3IgeyIgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgInEsIGVyciA6PSAiIDw8IHRlbnVtX25hbWUgPDwgIkZyb21TdHJpbmcoc3RyaW5nKHRleHQpKSIgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgImlmIChlcnIgIT0gbmlsKSB7IiA8PCBlbmRsIDw8ICJyZXR1cm4gZXJyIiA8PCBlbmRsIDw8ICJ9IiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCAiKnAgPSBxIiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCAicmV0dXJuIG5pbCIgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSBTY2FuIGZvciBzcWwuU2Nhbm5lciBpbnRlcmZhY2UKKyAgZl90eXBlc18gPDwgImZ1bmMgKHAgKiIgPDwgdGVudW1fbmFtZSA8PCAiKSBTY2FuKHZhbHVlIGludGVyZmFjZXt9KSBlcnJvciB7IiA8PGVuZGw7CisgIGZfdHlwZXNfIDw8ICJ2LCBvayA6PSB2YWx1ZS4oaW50NjQpIiA8PGVuZGw7CisgIGZfdHlwZXNfIDw8ICJpZiAhb2sgeyIgPDxlbmRsOworICBmX3R5cGVzXyA8PCAicmV0dXJuIGVycm9ycy5OZXcoXCJTY2FuIHZhbHVlIGlzIG5vdCBpbnQ2NFwiKSIgPDxlbmRsOworICBmX3R5cGVzXyA8PCAifSIgPDxlbmRsOworICBmX3R5cGVzXyA8PCAiKnAgPSAiIDw8IHRlbnVtX25hbWUgPDwgIih2KSIgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgInJldHVybiBuaWwiIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgVmFsdWUgZm9yIGRyaXZlci5WYWx1ZXIgaW50ZXJmYWNlCisgIGZfdHlwZXNfIDw8ICJmdW5jIChwICogIiA8PCB0ZW51bV9uYW1lIDw8ICIpIFZhbHVlKCkgKGRyaXZlci5WYWx1ZSwgZXJyb3IpIHsiIDw8ZW5kbDsKKyAgZl90eXBlc18gPDwgIiAgaWYgcCA9PSBuaWwgeyIgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgIiAgICByZXR1cm4gbmlsLCBuaWwiIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8ICIgIH0iIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8ICJyZXR1cm4gaW50NjQoKnApLCBuaWwiIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8ICJ9IiA8PCBlbmRsOworCit9CisKKy8qKgorICogR2VuZXJhdGUgYSBjb25zdGFudCB2YWx1ZQorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKKyAgdF90eXBlKiB0eXBlID0gdGNvbnN0LT5nZXRfdHlwZSgpOworICBzdHJpbmcgbmFtZSA9IHB1YmxpY2l6ZSh0Y29uc3QtPmdldF9uYW1lKCkpOworICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IHRjb25zdC0+Z2V0X3ZhbHVlKCk7CisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQoZl9jb25zdHNfKSA8PCAiY29uc3QgIiA8PCBuYW1lIDw8ICIgPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB2YWx1ZSwgbmFtZSkgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX2NvbnN0X3ZhbHVlc18gPDwgaW5kZW50KCkgPDwgbmFtZSA8PCAiID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUsIG5hbWUpIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKworICAgIGZfY29uc3RzXyA8PCBpbmRlbnQoKSA8PCAidmFyICIgPDwgbmFtZSA8PCAiICIgPDwgdHlwZV90b19nb190eXBlKHR5cGUpIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKKyAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCisgKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYworICovCitzdHJpbmcgdF9nb19nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlLCBjb25zdCBzdHJpbmcmIG5hbWUsIGJvb2wgb3B0KSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKworICAgIGlmIChvcHQpIHsKKyAgICAgIG91dCA8PCAiJigmc3RydWN0e3ggIjsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICAgIG91dCA8PCAiYm9vbH17IjsKKyAgICAgICAgICBvdXQgPDwgKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgICAgb3V0IDw8ICJpbnQ4fXsiOworICAgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgICAgb3V0IDw8ICJpbnQxNn17IjsKKyAgICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICAgIG91dCA8PCAiaW50MzJ9eyI7CisgICAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgICBvdXQgPDwgImludDY0fXsiOworICAgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICBvdXQgPDwgImZsb2F0NjR9eyI7CisgICAgICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICAgIG91dCA8PCAic3RyaW5nfXsiOworICAgICAgICAgIG91dCA8PCAnIicgKyBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpICsgJyInOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgICBvdXQgPDwgIn0pLngiOworICAgIH0gZWxzZSB7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICAgICAgb3V0IDw8ICJbXWJ5dGUoXCIiIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgIlwiKSI7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG91dCA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7CisgICAgICAgICAgfQorCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICAgIG91dCA8PCAodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwID8gInRydWUiIDogImZhbHNlIik7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgICBpZiAob3B0KSB7CisgICAgICAgICAgICBvdXQgPDwgIiYoJnN0cnVjdHt4IGludH17IjsKKyAgICAgICAgICB9CisgICAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgICAgIGlmIChvcHQpIHsKKyAgICAgICAgICAgIG91dCA8PCAifSkueCI7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgICAgICAgIH0KKworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIGluZGVudChvdXQpIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBvdXQgPDwgIiYiIDw8IHB1YmxpY2l6ZSh0eXBlX25hbWUodHlwZSkpIDw8ICJ7IjsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgYm9vbCBpc19vcHRpb25hbCA9IGZhbHNlOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICAgIGlzX29wdGlvbmFsID0gaXNfcG9pbnRlcl9maWVsZCgqZl9pdGVyKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisgICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBwdWJsaWNpemUodl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSA8PCAiOiAiCisgICAgICAgICAgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kLCBuYW1lLCBpc19vcHRpb25hbCkgPDwgIiwiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgIn0iOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgb3V0IDw8ICJtYXBbIiA8PCB0eXBlX3RvX2dvX3R5cGUoa3R5cGUpIDw8ICJdIiA8PCB0eXBlX3RvX2dvX3R5cGUodnR5cGUpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgdl9pdGVyLT5maXJzdCwgbmFtZSkgPDwgIjogIgorICAgICAgICAgIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQsIG5hbWUpIDw8ICIsIiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgb3V0IDw8ICJbXSIgPDwgdHlwZV90b19nb190eXBlKGV0eXBlKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlciwgbmFtZSkgPDwgIiwgIjsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICBvdXQgPDwgIltdIiA8PCB0eXBlX3RvX2dvX2tleV90eXBlKGV0eXBlKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlciwgbmFtZSkgPDwgIiwgIjsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSI7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBDT05TVEFOVCBGT1IgVFlQRTogIiArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKworICByZXR1cm4gb3V0LnN0cigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGdvIHN0cnVjdAorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgZ2VuZXJhdGVfZ29fc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZXhjZXB0aW9uLiBCYXNpY2FsbHkgdGhlIHNhbWUKKyAqIGFzIGEgc3RydWN0IGJ1dCBleHRlbmRzIHRoZSBFeGNlcHRpb24gY2xhc3MuCisgKgorICogQHBhcmFtIHR4Y2VwdGlvbiBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9nb19zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBnbyBzdHJ1Y3QKKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ29fc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9nb19zdHJ1Y3RfZGVmaW5pdGlvbihmX3R5cGVzXywgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKK30KKwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2V0X3B1YmxpY2l6ZWRfbmFtZV9hbmRfZGVmX3ZhbHVlKHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcqIE9VVF9wdWJfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiogT1VUX2RlZl92YWx1ZSkgY29uc3QgeworICBjb25zdCBzdHJpbmcgYmFzZV9maWVsZF9uYW1lID0gdGZpZWxkLT5nZXRfbmFtZSgpOworICBjb25zdCBzdHJpbmcgZXNjYXBlZF9maWVsZF9uYW1lID0gZXNjYXBlX3N0cmluZyhiYXNlX2ZpZWxkX25hbWUpOworICAqT1VUX3B1Yl9uYW1lID0gcHVibGljaXplKGVzY2FwZWRfZmllbGRfbmFtZSk7CisgICpPVVRfZGVmX3ZhbHVlID0gdGZpZWxkLT5nZXRfdmFsdWUoKTsKK30KKwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ29fc3RydWN0X2luaXRpYWxpemVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2FyZ3Nfb3JfcmVzdWx0KSB7CisgIG91dCA8PCBwdWJsaWNpemUodHlwZV9uYW1lKHRzdHJ1Y3QpLCBpc19hcmdzX29yX3Jlc3VsdCkgPDwgInsiOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOworICAgICAgICsrbV9pdGVyKSB7CisgICAgYm9vbCBwb2ludGVyX2ZpZWxkID0gaXNfcG9pbnRlcl9maWVsZCgqbV9pdGVyKTsKKyAgICBzdHJpbmcgcHVibGljaXplZF9uYW1lOworICAgIHRfY29uc3RfdmFsdWUqIGRlZl92YWx1ZTsKKyAgICBnZXRfcHVibGljaXplZF9uYW1lX2FuZF9kZWZfdmFsdWUoKm1faXRlciwgJnB1YmxpY2l6ZWRfbmFtZSwgJmRlZl92YWx1ZSk7CisgICAgaWYgKCFwb2ludGVyX2ZpZWxkICYmIGRlZl92YWx1ZSAhPSBOVUxMICYmICFvbWl0X2luaXRpYWxpemF0aW9uKCptX2l0ZXIpKSB7CisgICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBwdWJsaWNpemVkX25hbWUgPDwgIjogIgorICAgICAgICAgIDw8IHJlbmRlcl9maWVsZF9pbml0aWFsX3ZhbHVlKCptX2l0ZXIsICgqbV9pdGVyKS0+Z2V0X25hbWUoKSwgcG9pbnRlcl9maWVsZCkgPDwgIiwiCisgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBvdXQgPDwgIn0iIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ29fc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19hcmdzKSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBzb3J0ZWRfbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgc3RkOjpzdHJpbmcgdHN0cnVjdF9uYW1lKHB1YmxpY2l6ZSh0c3RydWN0LT5nZXRfbmFtZSgpLCBpc19hcmdzIHx8IGlzX3Jlc3VsdCkpOworICBnZW5lcmF0ZV9nb19kb2NzdHJpbmcob3V0LCB0c3RydWN0KTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ0eXBlICIgPDwgdHN0cnVjdF9uYW1lIDw8ICIgc3RydWN0IHsiIDw8IGVuZGw7CisgIC8qCisgICAgIEhlcmUgd2UgZ2VuZXJhdGUgdGhlIHN0cnVjdHVyZSBzcGVjaWZpY2F0aW9uIGZvciB0aGUgZmFzdGJpbmFyeSBjb2RlYy4KKyAgICAgVGhlc2Ugc3BlY2lmaWNhdGlvbnMgaGF2ZSB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZToKKyAgICAgdGhyaWZ0X3NwZWMgLT4gdHVwbGUgb2YgaXRlbV9zcGVjCisgICAgIGl0ZW1fc3BlYyAtPiBuaWwgfCAodGFnLCB0eXBlX2VudW0sIG5hbWUsIHNwZWNfYXJncywgZGVmYXVsdCkKKyAgICAgdGFnIC0+IGludGVnZXIKKyAgICAgdHlwZV9lbnVtIC0+IFRUeXBlLkkzMiB8IFRUeXBlLlNUUklORyB8IFRUeXBlLlNUUlVDVCB8IC4uLgorICAgICBuYW1lIC0+IHN0cmluZ19saXRlcmFsCisgICAgIGRlZmF1bHQgLT4gbmlsICAjIEhhbmRsZWQgYnkgX19pbml0X18KKyAgICAgc3BlY19hcmdzIC0+IG5pbCAgIyBGb3Igc2ltcGxlIHR5cGVzCisgICAgICAgICAgICAgICAgfCAodHlwZV9lbnVtLCBzcGVjX2FyZ3MpICAjIFZhbHVlIHR5cGUgZm9yIGxpc3Qvc2V0CisgICAgICAgICAgICAgICAgfCAodHlwZV9lbnVtLCBzcGVjX2FyZ3MsIHR5cGVfZW51bSwgc3BlY19hcmdzKQorICAgICAgICAgICAgICAgICAgIyBLZXkgYW5kIHZhbHVlIGZvciBtYXAKKyAgICAgICAgICAgICAgICB8IChjbGFzc19uYW1lLCBzcGVjX2FyZ3NfcHRyKSAjIEZvciBzdHJ1Y3QvZXhjZXB0aW9uCisgICAgIGNsYXNzX25hbWUgLT4gaWRlbnRpZmllciAgIyBCYXNpY2FsbHkgYSBwb2ludGVyIHRvIHRoZSBjbGFzcworICAgICBzcGVjX2FyZ3NfcHRyIC0+IGV4cHJlc3Npb24gICMganVzdCBjbGFzc19uYW1lLnNwZWNfYXJncworCisgICAgIFRPRE8oZHJlaXNzKTogQ29uc2lkZXIgbWFraW5nIHRoaXMgd29yayBmb3Igc3RydWN0cyB3aXRoIG5lZ2F0aXZlIHRhZ3MuCisgICovCisgIC8vIFRPRE8oZHJlaXNzKTogTG9vayBpbnRvIGdlbmVyYXRpbmcgYW4gZW1wdHkgdHVwbGUgaW5zdGVhZCBvZiBuaWwKKyAgLy8gZm9yIHN0cnVjdHVyZXMgd2l0aCBubyBtZW1iZXJzLgorICAvLyBUT0RPKGRyZWlzcyk6IFRlc3QgZW5jb2Rpbmcgb2Ygc3RydWN0cyB3aGVyZSBzb21lIGlubmVyIHN0cnVjdHMKKyAgLy8gZG9uJ3QgaGF2ZSB0aHJpZnRfc3BlYy4KKyAgaW5kZW50X3VwKCk7CisKKyAgaW50IG51bV9zZXRhYmxlID0gMDsKKyAgaWYgKHNvcnRlZF9tZW1iZXJzLmVtcHR5KCkgfHwgKHNvcnRlZF9tZW1iZXJzWzBdLT5nZXRfa2V5KCkgPj0gMCkpIHsKKyAgICBpbnQgc29ydGVkX2tleXNfcG9zID0gMDsKKworICAgIGZvciAobV9pdGVyID0gc29ydGVkX21lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IHNvcnRlZF9tZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgLy8gU2V0IGZpZWxkIHRvIG9wdGlvbmFsIGlmIGZpZWxkIGlzIHVuaW9uLCB0aGlzIGlzIHNvIHdlIGNhbiBnZXQgYQorICAgICAgLy8gcG9pbnRlciB0byB0aGUgZmllbGQuCisgICAgICBpZiAodHN0cnVjdC0+aXNfdW5pb24oKSkKKyAgICAgICAgKCptX2l0ZXIpLT5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUSU9OQUwpOworICAgICAgaWYgKHNvcnRlZF9rZXlzX3BvcyAhPSAoKm1faXRlciktPmdldF9rZXkoKSkgeworICAgICAgICBpbnQgZmlyc3RfdW51c2VkID0gKHN0ZDo6bWF4KSgxLCBzb3J0ZWRfa2V5c19wb3MrKyk7CisgICAgICAgIHdoaWxlIChzb3J0ZWRfa2V5c19wb3MgIT0gKCptX2l0ZXIpLT5nZXRfa2V5KCkpIHsKKyAgICAgICAgICArK3NvcnRlZF9rZXlzX3BvczsKKyAgICAgICAgfQorICAgICAgICBpbnQgbGFzdF91bnVzZWQgPSBzb3J0ZWRfa2V5c19wb3MgLSAxOworICAgICAgICBpZiAoZmlyc3RfdW51c2VkIDwgbGFzdF91bnVzZWQpIHsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAiLy8gdW51c2VkIGZpZWxkcyAjICIgPDwgZmlyc3RfdW51c2VkIDw8ICIgdG8gIiA8PCBsYXN0X3VudXNlZCA8PCBlbmRsOworICAgICAgICB9IGVsc2UgaWYgKGZpcnN0X3VudXNlZCA9PSBsYXN0X3VudXNlZCkgeworICAgICAgICAgIGluZGVudChvdXQpIDw8ICIvLyB1bnVzZWQgZmllbGQgIyAiIDw8IGZpcnN0X3VudXNlZCA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHRfdHlwZSogZmllbGRUeXBlID0gKCptX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgc3RyaW5nIGdvVHlwZSA9IHR5cGVfdG9fZ29fdHlwZV93aXRoX29wdChmaWVsZFR5cGUsIGlzX3BvaW50ZXJfZmllbGQoKm1faXRlcikpOworICAgICAgc3RyaW5nIGdvdGFnID0gImRiOlwiIiArIGVzY2FwZV9zdHJpbmcoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSAgKyAiXCIgIjsKKyAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7CisgICAgICAgIGdvdGFnICs9ICJqc29uOlwiIiArIGVzY2FwZV9zdHJpbmcoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSArICIsb21pdGVtcHR5XCIiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ290YWcgKz0gImpzb246XCIiICsgZXNjYXBlX3N0cmluZygoKm1faXRlciktPmdldF9uYW1lKCkpICsgIlwiIjsKKyAgICAgIH0KKworICAgICAgLy8gQ2hlY2sgZm9yIHVzZXIgb3ZlcnJpZGUgb2YgZGIgYW5kIGpzb24gdGFncyB1c2luZyAiZ28udGFnIgorICAgICAgc3RkOjptYXA8c3RyaW5nLCBzdHJpbmc+OjppdGVyYXRvciBpdCA9ICgqbV9pdGVyKS0+YW5ub3RhdGlvbnNfLmZpbmQoImdvLnRhZyIpOworICAgICAgaWYgKGl0ICE9ICgqbV9pdGVyKS0+YW5ub3RhdGlvbnNfLmVuZCgpKSB7CisgICAgICAgIGdvdGFnID0gaXQtPnNlY29uZDsKKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8IHB1YmxpY2l6ZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8ICIgIiA8PCBnb1R5cGUgPDwgIiBgdGhyaWZ0OlwiIgorICAgICAgICAgICAgICAgICAgPDwgZXNjYXBlX3N0cmluZygoKm1faXRlciktPmdldF9uYW1lKCkpIDw8ICIsIiA8PCBzb3J0ZWRfa2V5c19wb3M7CisgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgICBvdXQgPDwgIixyZXF1aXJlZCI7CisgICAgICB9CisKKyAgICAgIG91dCA8PCAiXCIgIiA8PCBnb3RhZyA8PCAiYCIgPDwgZW5kbDsKKyAgICAgIHNvcnRlZF9rZXlzX3BvcysrOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICAvLyBUaGlzIGZpbGxzIGluIGRlZmF1bHQgdmFsdWVzLCBhcyBvcHBvc2VkIHRvIG51bGxzCisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHVibGljaXplKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiAiCisgICAgICAgICAgPDwgdHlwZV90b19nb190eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJmdW5jIE5ldyIgPDwgdHN0cnVjdF9uYW1lIDw8ICIoKSAqIiA8PCB0c3RydWN0X25hbWUgPDwgIiB7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICYiOworICBnZW5lcmF0ZV9nb19zdHJ1Y3RfaW5pdGlhbGl6ZXIob3V0LCB0c3RydWN0LCBpc19yZXN1bHQgfHwgaXNfYXJncyk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAvLyBEZWZhdWx0IHZhbHVlcyBmb3Igb3B0aW9uYWwgZmllbGRzCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBzdHJpbmcgcHVibGljaXplZF9uYW1lOworICAgIHRfY29uc3RfdmFsdWUqIGRlZl92YWx1ZTsKKyAgICBnZXRfcHVibGljaXplZF9uYW1lX2FuZF9kZWZfdmFsdWUoKm1faXRlciwgJnB1YmxpY2l6ZWRfbmFtZSwgJmRlZl92YWx1ZSk7CisgICAgdF90eXBlKiBmaWVsZFR5cGUgPSAoKm1faXRlciktPmdldF90eXBlKCk7CisgICAgc3RyaW5nIGdvVHlwZSA9IHR5cGVfdG9fZ29fdHlwZV93aXRoX29wdChmaWVsZFR5cGUsIGZhbHNlKTsKKyAgICBzdHJpbmcgZGVmX3Zhcl9uYW1lID0gdHN0cnVjdF9uYW1lICsgIl8iICsgcHVibGljaXplZF9uYW1lICsgIl9ERUZBVUxUIjsKKyAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCB8fCBpc19wb2ludGVyX2ZpZWxkKCptX2l0ZXIpKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciAiIDw8IGRlZl92YXJfbmFtZSA8PCAiICIgPDwgZ29UeXBlOworICAgICAgaWYgKGRlZl92YWx1ZSAhPSBOVUxMKSB7CisgICAgICAgIG91dCA8PCAiID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUoZmllbGRUeXBlLCBkZWZfdmFsdWUsICgqbV9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgICB9CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBudW1fc2V0YWJsZSBpcyB1c2VkIGZvciBkZWNpZGluZyBpZiBDb3VudCogbWV0aG9kcyB3aWxsIGJlIGdlbmVyYXRlZCBmb3IgdW5pb24gZmllbGRzLgorICAgIC8vIFRoaXMgYXBwbGllcyB0byBhbGwgbnVsbGFibGUgZmllbGRzIGluY2x1ZGluZyBzbGljZXMgKHVzZWQgZm9yIHNldCwgbGlzdCBhbmQgYmluYXJ5KSBhbmQgbWFwcywgbm90IGp1c3QgcG9pbnRlcnMuCisgICAgdF90eXBlKiB0eXBlID0gZmllbGRUeXBlLT5nZXRfdHJ1ZV90eXBlKCk7CisgICAgaWYgKGlzX3BvaW50ZXJfZmllbGQoKm1faXRlcil8fCB0eXBlLT5pc19tYXAoKSB8fCB0eXBlLT5pc19zZXQoKSB8fCB0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIG51bV9zZXRhYmxlICs9IDE7CisgICAgfQorCisgICAgaWYgKGlzX3BvaW50ZXJfZmllbGQoKm1faXRlcikpIHsKKyAgICAgIHN0cmluZyBnb09wdFR5cGUgPSB0eXBlX3RvX2dvX3R5cGVfd2l0aF9vcHQoZmllbGRUeXBlLCB0cnVlKTsKKyAgICAgIHN0cmluZyBtYXliZXBvaW50ZXIgPSBnb09wdFR5cGUgIT0gZ29UeXBlID8gIioiIDogIiI7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgdHN0cnVjdF9uYW1lIDw8ICIpIEdldCIgPDwgcHVibGljaXplZF9uYW1lIDw8ICIoKSAiCisgICAgICAgICAgPDwgZ29UeXBlIDw8ICIgeyIgPDwgZW5kbDsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBpZiAhcC5Jc1NldCIgPDwgcHVibGljaXplZF9uYW1lIDw8ICIoKSB7IiA8PCBlbmRsOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgcmV0dXJuICIgPDwgZGVmX3Zhcl9uYW1lIDw8IGVuZGw7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICIgPDwgbWF5YmVwb2ludGVyIDw8ICJwLiIgPDwgcHVibGljaXplZF9uYW1lIDw8IGVuZGw7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCBlbmRsOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiKSBHZXQiIDw8IHB1YmxpY2l6ZWRfbmFtZSA8PCAiKCkgIgorICAgICAgICAgIDw8IGdvVHlwZSA8PCAiIHsiIDw8IGVuZGw7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHAuIiA8PCBwdWJsaWNpemVkX25hbWUgPDwgZW5kbDsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpZiAodHN0cnVjdC0+aXNfdW5pb24oKSAmJiBudW1fc2V0YWJsZSA+IDApIHsKKyAgICBnZW5lcmF0ZV9jb3VudHNldGZpZWxkc19oZWxwZXIob3V0LCB0c3RydWN0LCB0c3RydWN0X25hbWUsIGlzX3Jlc3VsdCk7CisgIH0KKworICBnZW5lcmF0ZV9pc3NldF9oZWxwZXJzKG91dCwgdHN0cnVjdCwgdHN0cnVjdF9uYW1lLCBpc19yZXN1bHQpOworICBnZW5lcmF0ZV9nb19zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCwgdHN0cnVjdF9uYW1lLCBpc19yZXN1bHQpOworICBnZW5lcmF0ZV9nb19zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCwgdHN0cnVjdF9uYW1lLCBpc19yZXN1bHQsIG51bV9zZXRhYmxlID4gMCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiKSBTdHJpbmcoKSBzdHJpbmcgeyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIGlmIHAgPT0gbmlsIHsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgIHJldHVybiBcIjxuaWw+XCIiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZtdC5TcHJpbnRmKFwiIiA8PCBlc2NhcGVfc3RyaW5nKHRzdHJ1Y3RfbmFtZSkgPDwgIiglK3YpXCIsICpwKSIKKyAgICAgIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgdHN0cnVjdF9uYW1lIDw8ICIpIEVycm9yKCkgc3RyaW5nIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBwLlN0cmluZygpIiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSBJc1NldCBoZWxwZXIgbWV0aG9kcyBmb3IgYSBzdHJ1Y3QKKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfaGVscGVycyhvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHRzdHJ1Y3RfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQpIHsKKyAgKHZvaWQpaXNfcmVzdWx0OworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGNvbnN0IHN0cmluZyBlc2NhcGVkX3RzdHJ1Y3RfbmFtZShlc2NhcGVfc3RyaW5nKHRzdHJ1Y3QtPmdldF9uYW1lKCkpKTsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGNvbnN0IHN0cmluZyBmaWVsZF9uYW1lKHB1YmxpY2l6ZShlc2NhcGVfc3RyaW5nKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkpKTsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCB8fCBpc19wb2ludGVyX2ZpZWxkKCpmX2l0ZXIpKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgdHN0cnVjdF9uYW1lIDw8ICIpIElzU2V0IiA8PCBmaWVsZF9uYW1lIDw8ICIoKSBib29sIHsiCisgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgdF90eXBlKiB0dHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X3RydWVfdHlwZSgpOworICAgICAgYm9vbCBpc19ieXRlc2xpY2UgPSB0dHlwZS0+aXNfYmluYXJ5KCk7CisgICAgICBib29sIGNvbXBhcmVfdG9fbmlsX29ubHkgPSB0dHlwZS0+aXNfc2V0KCkgfHwgdHR5cGUtPmlzX2xpc3QoKSB8fCB0dHlwZS0+aXNfbWFwKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChpc19ieXRlc2xpY2UgJiYgISgqZl9pdGVyKS0+Z2V0X3ZhbHVlKCkpOworICAgICAgaWYgKGlzX3BvaW50ZXJfZmllbGQoKmZfaXRlcikgfHwgY29tcGFyZV90b19uaWxfb25seSkgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBwLiIgPDwgZmllbGRfbmFtZSA8PCAiICE9IG5pbCIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN0cmluZyBkZWZfdmFyX25hbWUgPSB0c3RydWN0X25hbWUgKyAiXyIgKyBmaWVsZF9uYW1lICsgIl9ERUZBVUxUIjsKKyAgICAgICAgaWYgKGlzX2J5dGVzbGljZSkgeworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICFieXRlcy5FcXVhbChwLiIgPDwgZmllbGRfbmFtZSA8PCAiLCAiIDw8IGRlZl92YXJfbmFtZSA8PCAiKSIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBwLiIgPDwgZmllbGRfbmFtZSA8PCAiICE9ICIgPDwgZGVmX3Zhcl9uYW1lIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIENvdW50U2V0RmllbGRzIGhlbHBlciBtZXRob2QgZm9yIGEgc3RydWN0CisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2NvdW50c2V0ZmllbGRzX2hlbHBlcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiB0c3RydWN0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQpIHsKKyAgKHZvaWQpaXNfcmVzdWx0OworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGNvbnN0IHN0cmluZyBlc2NhcGVkX3RzdHJ1Y3RfbmFtZShlc2NhcGVfc3RyaW5nKHRzdHJ1Y3QtPmdldF9uYW1lKCkpKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgdHN0cnVjdF9uYW1lIDw8ICIpIENvdW50U2V0RmllbGRzIiA8PCB0c3RydWN0X25hbWUgPDwgIigpIGludCB7IgorICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiY291bnQgOj0gMCIgPDwgZW5kbDsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkKKyAgICAgIGNvbnRpbnVlOworCisgICAgdF90eXBlKiB0eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfdHJ1ZV90eXBlKCk7CisKKyAgICBpZiAoIShpc19wb2ludGVyX2ZpZWxkKCpmX2l0ZXIpIHx8IHR5cGUtPmlzX21hcCgpIHx8IHR5cGUtPmlzX3NldCgpIHx8IHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19iaW5hcnkoKSkpCisgICAgICBjb250aW51ZTsKKworICAgIGNvbnN0IHN0cmluZyBmaWVsZF9uYW1lKHB1YmxpY2l6ZShlc2NhcGVfc3RyaW5nKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkpKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHAuSXNTZXQiIDw8IGZpZWxkX25hbWUgPDwgIigpKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiY291bnQrKyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfQorCisgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGNvdW50IiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgcmVhZCBtZXRob2QgZm9yIGEgc3RydWN0CisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2dvX3N0cnVjdF9yZWFkZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiB0c3RydWN0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0KSB7CisgICh2b2lkKWlzX3Jlc3VsdDsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBzdHJpbmcgZXNjYXBlZF90c3RydWN0X25hbWUoZXNjYXBlX3N0cmluZyh0c3RydWN0LT5nZXRfbmFtZSgpKSk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCB0c3RydWN0X25hbWUgPDwgIikgIiA8PCByZWFkX21ldGhvZF9uYW1lXyA8PCAiKGlwcm90IHRocmlmdC5UUHJvdG9jb2wpIGVycm9yIHsiCisgICAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBfLCBlcnIgOj0gaXByb3QuUmVhZFN0cnVjdEJlZ2luKCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKFwiJVQgcmVhZCBlcnJvcjogXCIsIHApLCBlcnIpIgorICAgICAgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gUmVxdWlyZWQgdmFyaWFibGVzIGRvZXMgbm90IGhhdmUgSXNTZXQgZnVuY3Rpb25zLCBzbyB3ZSBuZWVkIHRtcCB2YXJzIHRvIGNoZWNrIHRoZW0uCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgIGNvbnN0IHN0cmluZyBmaWVsZF9uYW1lKHB1YmxpY2l6ZShlc2NhcGVfc3RyaW5nKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkpKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ2YXIgaXNzZXQiIDw8IGZpZWxkX25hbWUgPDwgIiBib29sID0gZmFsc2U7IiA8PCBlbmRsOworICAgIH0KKyAgfQorICBvdXQgPDwgZW5kbDsKKworICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKKyAgaW5kZW50KG91dCkgPDwgImZvciB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgLy8gUmVhZCBiZWdpbm5pbmcgZmllbGQgbWFya2VyCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiXywgZmllbGRUeXBlSWQsIGZpZWxkSWQsIGVyciA6PSBpcHJvdC5SZWFkRmllbGRCZWdpbigpIiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIKKyAgICAgICAgICAgICAgICAgICAgICJcIiVUIGZpZWxkICVkIHJlYWQgZXJyb3I6IFwiLCBwLCBmaWVsZElkKSwgZXJyKSIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAvLyBDaGVjayBmb3IgZmllbGQgU1RPUCBtYXJrZXIgYW5kIGJyZWFrCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZmllbGRUeXBlSWQgPT0gdGhyaWZ0LlNUT1AgeyBicmVhazsgfSIgPDwgZW5kbDsKKworICBzdHJpbmcgdGhyaWZ0RmllbGRUeXBlSWQ7CisgIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcworICBpbnQzMl90IGZpZWxkX2lkID0gLTE7CisKKyAgLy8gU3dpdGNoIHN0YXRlbWVudCBvbiB0aGUgZmllbGQgd2UgYXJlIHJlYWRpbmcsIGZhbHNlIGlmIG5vIGZpZWxkcyBwcmVzZW50CisgIGJvb2wgaGF2ZV9zd2l0Y2ggPSAhZmllbGRzLmVtcHR5KCk7CisgIGlmIChoYXZlX3N3aXRjaCkgeworICAgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggZmllbGRJZCB7IiA8PCBlbmRsOworICB9CisKKyAgLy8gQWxsIHRoZSBmaWVsZHMgd2Uga25vdworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGZpZWxkX2lkID0gKCpmX2l0ZXIpLT5nZXRfa2V5KCk7CisKKyAgICAvLyBpZiBuZWdhdGl2ZSBpZCwgZW5zdXJlIHdlIGdlbmVyYXRlIGEgdmFsaWQgbWV0aG9kIG5hbWUKKyAgICBzdHJpbmcgZmllbGRfbWV0aG9kX3ByZWZpeCgiUmVhZEZpZWxkIik7CisgICAgaW50MzJfdCBmaWVsZF9tZXRob2Rfc3VmZml4ID0gZmllbGRfaWQ7CisKKyAgICBpZiAoZmllbGRfbWV0aG9kX3N1ZmZpeCA8IDApIHsKKyAgICAgIGZpZWxkX21ldGhvZF9wcmVmaXggKz0gIl8iOworICAgICAgZmllbGRfbWV0aG9kX3N1ZmZpeCAqPSAtMTsKKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImNhc2UgIiA8PCBmaWVsZF9pZCA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICB0aHJpZnRGaWVsZFR5cGVJZCA9IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpOworCisgICAgaWYgKHRocmlmdEZpZWxkVHlwZUlkID09ICJ0aHJpZnQuQklOQVJZIikgeworICAgICAgdGhyaWZ0RmllbGRUeXBlSWQgPSAidGhyaWZ0LlNUUklORyI7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBmaWVsZFR5cGVJZCA9PSAiIDw8IHRocmlmdEZpZWxkVHlwZUlkIDw8ICIgeyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgaWYgZXJyIDo9IHAuIiA8PCBmaWVsZF9tZXRob2RfcHJlZml4IDw8IGZpZWxkX21ldGhvZF9zdWZmaXggPDwgIihpcHJvdCk7IGVyciAhPSBuaWwgeyIKKyAgICAgICAgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICByZXR1cm4gZXJyIiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsOworCisgICAgLy8gTWFyayByZXF1aXJlZCBmaWVsZCBhcyByZWFkCisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgIGNvbnN0IHN0cmluZyBmaWVsZF9uYW1lKHB1YmxpY2l6ZShlc2NhcGVfc3RyaW5nKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkpKTsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBpc3NldCIgPDwgZmllbGRfbmFtZSA8PCAiID0gdHJ1ZSIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBpZiBlcnIgOj0gaXByb3QuU2tpcChmaWVsZFR5cGVJZCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICByZXR1cm4gZXJyIiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIC8vIEJlZ2luIHN3aXRjaCBkZWZhdWx0IGNhc2UKKyAgaWYgKGhhdmVfc3dpdGNoKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgfQorCisgIC8vIFNraXAgdW5rbm93biBmaWVsZHMgaW4gZWl0aGVyIGNhc2UKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gaXByb3QuU2tpcChmaWVsZFR5cGVJZCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBlcnIiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAvLyBFbmQgc3dpdGNoIGRlZmF1bHQgY2FzZQorICBpZiAoaGF2ZV9zd2l0Y2gpIHsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfQorCisgIC8vIFJlYWQgZmllbGQgZW5kIG1hcmtlcgorICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSBpcHJvdC5SZWFkRmllbGRFbmQoKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGVyciIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IGlwcm90LlJlYWRTdHJ1Y3RFbmQoKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIgorICAgICAgICAgICAgICAgICAgICAgIlwiJVQgcmVhZCBzdHJ1Y3QgZW5kIGVycm9yOiBcIiwgcCksIGVycikiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAvLyBSZXR1cm4gZXJyb3IgaWYgYW55IHJlcXVpcmVkIGZpZWxkcyBhcmUgbWlzc2luZy4KKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgY29uc3Qgc3RyaW5nIGZpZWxkX25hbWUocHVibGljaXplKGVzY2FwZV9zdHJpbmcoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSkpOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAhaXNzZXQiIDw8IGZpZWxkX25hbWUgPDwgInsiIDw8IGVuZGw7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5OZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZSh0aHJpZnQuSU5WQUxJRF9EQVRBLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImZtdC5FcnJvcmYoXCJSZXF1aXJlZCBmaWVsZCAiIDw8IGZpZWxkX25hbWUgPDwgIiBpcyBub3Qgc2V0XCIpKTsiIDw8IGVuZGw7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gbmlsIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBmaWVsZF90eXBlX25hbWUocHVibGljaXplKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSkpOworICAgIHN0cmluZyBmaWVsZF9uYW1lKHB1YmxpY2l6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkpKTsKKyAgICBzdHJpbmcgZmllbGRfbWV0aG9kX3ByZWZpeCgiUmVhZEZpZWxkIik7CisgICAgaW50MzJfdCBmaWVsZF9pZCA9ICgqZl9pdGVyKS0+Z2V0X2tleSgpOworICAgIGludDMyX3QgZmllbGRfbWV0aG9kX3N1ZmZpeCA9IGZpZWxkX2lkOworCisgICAgaWYgKGZpZWxkX21ldGhvZF9zdWZmaXggPCAwKSB7CisgICAgICBmaWVsZF9tZXRob2RfcHJlZml4ICs9ICJfIjsKKyAgICAgIGZpZWxkX21ldGhvZF9zdWZmaXggKj0gLTE7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiKSAgIiA8PCBmaWVsZF9tZXRob2RfcHJlZml4IDw8IGZpZWxkX21ldGhvZF9zdWZmaXgKKyAgICAgICAgPDwgIihpcHJvdCB0aHJpZnQuVFByb3RvY29sKSBlcnJvciB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgZmFsc2UsICJwLiIpOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBuaWwiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ29fc3RydWN0X3dyaXRlcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHRzdHJ1Y3RfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlc19jb3VudHNldGZpZWxkcykgeworICAodm9pZClpc19yZXN1bHQ7CisgIHN0cmluZyBuYW1lKHRzdHJ1Y3QtPmdldF9uYW1lKCkpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBpbmRlbnQob3V0KSA8PCAiZnVuYyAocCAqIiA8PCB0c3RydWN0X25hbWUgPDwgIikgIiA8PCB3cml0ZV9tZXRob2RfbmFtZV8gPDwgIihvcHJvdCB0aHJpZnQuVFByb3RvY29sKSBlcnJvciB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaWYgKHRzdHJ1Y3QtPmlzX3VuaW9uKCkgJiYgdXNlc19jb3VudHNldGZpZWxkcykgeworICAgIHN0ZDo6c3RyaW5nIHRzdHJ1Y3RfbmFtZShwdWJsaWNpemUodHN0cnVjdC0+Z2V0X25hbWUoKSkpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgYyA6PSBwLkNvdW50U2V0RmllbGRzIiA8PCB0c3RydWN0X25hbWUgPDwgIigpOyBjICE9IDEgeyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiICByZXR1cm4gZm10LkVycm9yZihcIiVUIHdyaXRlIHVuaW9uOiBleGFjdGx5IG9uZSBmaWVsZCBtdXN0IGJlIHNldCAoJWQgc2V0KS5cIiwgcCwgYykiCisgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gb3Byb3QuV3JpdGVTdHJ1Y3RCZWdpbihcIiIgPDwgbmFtZSA8PCAiXCIpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiCisgICAgICAgICAgICAgICAgICAgICAiXCIlVCB3cml0ZSBzdHJ1Y3QgYmVnaW4gZXJyb3I6IFwiLCBwKSwgZXJyKSB9IiA8PCBlbmRsOworCisgIHN0cmluZyBmaWVsZF9uYW1lOworICBzdHJpbmcgZXNjYXBlX2ZpZWxkX25hbWU7CisgIC8vIHRfY29uc3RfdmFsdWUqIGZpZWxkX2RlZmF1bHRfdmFsdWU7CisgIHRfZmllbGQ6OmVfcmVxIGZpZWxkX3JlcXVpcmVkOworICBpbnQzMl90IGZpZWxkX2lkID0gLTE7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBwICE9IG5pbCB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBmaWVsZF9tZXRob2RfcHJlZml4KCJ3cml0ZUZpZWxkIik7CisgICAgZmllbGRfbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBlc2NhcGVfZmllbGRfbmFtZSA9IGVzY2FwZV9zdHJpbmcoZmllbGRfbmFtZSk7CisgICAgZmllbGRfaWQgPSAoKmZfaXRlciktPmdldF9rZXkoKTsKKyAgICBpbnQzMl90IGZpZWxkX21ldGhvZF9zdWZmaXggPSBmaWVsZF9pZDsKKworICAgIGlmIChmaWVsZF9tZXRob2Rfc3VmZml4IDwgMCkgeworICAgICAgZmllbGRfbWV0aG9kX3ByZWZpeCArPSAiXyI7CisgICAgICBmaWVsZF9tZXRob2Rfc3VmZml4ICo9IC0xOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IHAuIiA8PCBmaWVsZF9tZXRob2RfcHJlZml4IDw8IGZpZWxkX21ldGhvZF9zdWZmaXgKKyAgICAgICAgPDwgIihvcHJvdCk7IGVyciAhPSBuaWwgeyByZXR1cm4gZXJyIH0iIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZFN0b3AoKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoXCJ3cml0ZSBmaWVsZCBzdG9wIGVycm9yOiBcIiwgZXJyKSB9IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSBvcHJvdC5Xcml0ZVN0cnVjdEVuZCgpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihcIndyaXRlIHN0cnVjdCBzdG9wIGVycm9yOiBcIiwgZXJyKSB9IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBuaWwiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyaW5nIGZpZWxkX21ldGhvZF9wcmVmaXgoIndyaXRlRmllbGQiKTsKKyAgICBmaWVsZF9pZCA9ICgqZl9pdGVyKS0+Z2V0X2tleSgpOworICAgIGZpZWxkX25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgZXNjYXBlX2ZpZWxkX25hbWUgPSBlc2NhcGVfc3RyaW5nKGZpZWxkX25hbWUpOworICAgIC8vIGZpZWxkX2RlZmF1bHRfdmFsdWUgPSAoKmZfaXRlciktPmdldF92YWx1ZSgpOworICAgIGZpZWxkX3JlcXVpcmVkID0gKCpmX2l0ZXIpLT5nZXRfcmVxKCk7CisgICAgaW50MzJfdCBmaWVsZF9tZXRob2Rfc3VmZml4ID0gZmllbGRfaWQ7CisKKyAgICBpZiAoZmllbGRfbWV0aG9kX3N1ZmZpeCA8IDApIHsKKyAgICAgIGZpZWxkX21ldGhvZF9wcmVmaXggKz0gIl8iOworICAgICAgZmllbGRfbWV0aG9kX3N1ZmZpeCAqPSAtMTsKKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgdHN0cnVjdF9uYW1lIDw8ICIpICIgPDwgZmllbGRfbWV0aG9kX3ByZWZpeCA8PCBmaWVsZF9tZXRob2Rfc3VmZml4CisgICAgICAgIDw8ICIob3Byb3QgdGhyaWZ0LlRQcm90b2NvbCkgKGVyciBlcnJvcikgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGlmIChmaWVsZF9yZXF1aXJlZCA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIHAuSXNTZXQiIDw8IHB1YmxpY2l6ZShmaWVsZF9uYW1lKSA8PCAiKCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IG9wcm90LldyaXRlRmllbGRCZWdpbihcIiIgPDwgZXNjYXBlX2ZpZWxkX25hbWUgPDwgIlwiLCAiCisgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIsICIgPDwgZmllbGRfaWQgPDwgIik7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoZm10LlNwcmludGYoXCIlVCB3cml0ZSBmaWVsZCBiZWdpbiBlcnJvciAiCisgICAgICAgIDw8IGZpZWxkX2lkIDw8ICI6IiA8PCBlc2NhcGVfZmllbGRfbmFtZSA8PCAiOiBcIiwgcCksIGVycikgfSIgPDwgZW5kbDsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInAuIik7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoZm10LlNwcmludGYoXCIlVCB3cml0ZSBmaWVsZCBlbmQgZXJyb3IgIgorICAgICAgICA8PCBmaWVsZF9pZCA8PCAiOiIgPDwgZXNjYXBlX2ZpZWxkX25hbWUgPDwgIjogXCIsIHApLCBlcnIpIH0iIDw8IGVuZGw7CisKKyAgICBpZiAoZmllbGRfcmVxdWlyZWQgPT0gdF9maWVsZDo6VF9PUFRJT05BTCkgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gZXJyIiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyB0ZXN0X3N1ZmZpeCgiX3Rlc3QiKTsKKyAgc3RyaW5nIGZpbGVuYW1lID0gbG93ZXJjYXNlKHNlcnZpY2VfbmFtZV8pOworICBzdHJpbmcgZl9zZXJ2aWNlX25hbWU7CisKKyAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9yZW1vdGUodHNlcnZpY2UpOworICBmX3R5cGVzXyA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBoZWxwZXIgZnVuY3Rpb25zIGZvciBhIHNlcnZpY2UuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmX3R5cGVzXyA8PCAiLy8gSEVMUEVSIEZVTkNUSU9OUyBBTkQgU1RSVUNUVVJFUyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIGdlbmVyYXRlX2dvX3N0cnVjdF9kZWZpbml0aW9uKGZfdHlwZXNfLCB0cywgZmFsc2UsIGZhbHNlLCB0cnVlKTsKKyAgICBnZW5lcmF0ZV9nb19mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2dvX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKKyAgICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOworICAgIHN1Y2Nlc3Muc2V0X3JlcSh0X2ZpZWxkOjpUX09QVElPTkFMKTsKKworICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOworICAgIH0KKworICAgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICB0X2ZpZWxkKiBmID0gKmZfaXRlcjsKKyAgICAgIGYtPnNldF9yZXEodF9maWVsZDo6VF9PUFRJT05BTCk7CisgICAgICByZXN1bHQuYXBwZW5kKGYpOworICAgIH0KKworICAgIGdlbmVyYXRlX2dvX3N0cnVjdF9kZWZpbml0aW9uKGZfdHlwZXNfLCAmcmVzdWx0LCBmYWxzZSwgdHJ1ZSk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGludGVyZmFjZSBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX2lmID0gIiI7CisgIHN0cmluZyBzZXJ2aWNlTmFtZShwdWJsaWNpemUodHNlcnZpY2UtPmdldF9uYW1lKCkpKTsKKyAgc3RyaW5nIGludGVyZmFjZU5hbWUgPSBzZXJ2aWNlTmFtZTsKKworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIHNpemVfdCBpbmRleCA9IGV4dGVuZHMucmZpbmQoIi4iKTsKKworICAgIGlmIChpbmRleCAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgIGV4dGVuZHNfaWYgPSAiXG4iICsgaW5kZW50KCkgKyAiICAiICsgZXh0ZW5kcy5zdWJzdHIoMCwgaW5kZXggKyAxKQorICAgICAgICAgICAgICAgICAgICsgcHVibGljaXplKGV4dGVuZHMuc3Vic3RyKGluZGV4ICsgMSkpICsgIlxuIjsKKyAgICB9IGVsc2UgeworICAgICAgZXh0ZW5kc19pZiA9ICJcbiIgKyBpbmRlbnQoKSArIHB1YmxpY2l6ZShleHRlbmRzKSArICJcbiI7CisgICAgfQorICB9CisKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInR5cGUgIiA8PCBpbnRlcmZhY2VOYW1lIDw8ICIgaW50ZXJmYWNlIHsiIDw8IGV4dGVuZHNfaWY7CisgIGluZGVudF91cCgpOworICBnZW5lcmF0ZV9nb19kb2NzdHJpbmcoZl90eXBlc18sIHRzZXJ2aWNlKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworCisgIGlmICghZnVuY3Rpb25zLmVtcHR5KCkpIHsKKyAgICBmX3R5cGVzXyA8PCBlbmRsOworICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICAgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBnZW5lcmF0ZV9nb19kb2NzdHJpbmcoZl90eXBlc18sICgqZl9pdGVyKSk7CisgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCBmdW5jdGlvbl9zaWduYXR1cmVfaWYoKmZfaXRlciwgIiIsIHRydWUpIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfZmllbGQgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7CisgIHN0cmluZyBleHRlbmRzX2NsaWVudF9uZXcgPSAiIjsKKyAgc3RyaW5nIHNlcnZpY2VOYW1lKHB1YmxpY2l6ZSh0c2VydmljZS0+Z2V0X25hbWUoKSkpOworCisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgc2l6ZV90IGluZGV4ID0gZXh0ZW5kcy5yZmluZCgiLiIpOworCisgICAgaWYgKGluZGV4ICE9IHN0cmluZzo6bnBvcykgeworICAgICAgZXh0ZW5kc19jbGllbnQgPSBleHRlbmRzLnN1YnN0cigwLCBpbmRleCArIDEpICsgcHVibGljaXplKGV4dGVuZHMuc3Vic3RyKGluZGV4ICsgMSkpCisgICAgICAgICAgICAgICAgICAgICAgICsgIkNsaWVudCI7CisgICAgICBleHRlbmRzX2NsaWVudF9uZXcgPSBleHRlbmRzLnN1YnN0cigwLCBpbmRleCArIDEpICsgIk5ldyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcHVibGljaXplKGV4dGVuZHMuc3Vic3RyKGluZGV4ICsgMSkpICsgIkNsaWVudCI7CisgICAgfSBlbHNlIHsKKyAgICAgIGV4dGVuZHNfY2xpZW50ID0gcHVibGljaXplKGV4dGVuZHMpICsgIkNsaWVudCI7CisgICAgICBleHRlbmRzX2NsaWVudF9uZXcgPSAiTmV3IiArIGV4dGVuZHNfY2xpZW50OworICAgIH0KKyAgfQorCisgIGV4dGVuZHNfZmllbGQgPSBleHRlbmRzX2NsaWVudC5zdWJzdHIoZXh0ZW5kc19jbGllbnQuZmluZCgiLiIpICsgMSk7CisKKyAgZ2VuZXJhdGVfZ29fZG9jc3RyaW5nKGZfdHlwZXNfLCB0c2VydmljZSk7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ0eXBlICIgPDwgc2VydmljZU5hbWUgPDwgIkNsaWVudCBzdHJ1Y3QgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKCFleHRlbmRzX2NsaWVudC5lbXB0eSgpKSB7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIioiIDw8IGV4dGVuZHNfY2xpZW50IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImMgdGhyaWZ0LlRDbGllbnQiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIExlZ2FjeSBjb25zdHJ1Y3RvciBmdW5jdGlvbgorICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiZnVuYyBOZXciIDw8IHNlcnZpY2VOYW1lCisgICAgICAgICAgICAgPDwgIkNsaWVudEZhY3RvcnkodCB0aHJpZnQuVFRyYW5zcG9ydCwgZiB0aHJpZnQuVFByb3RvY29sRmFjdG9yeSkgKiIgPDwgc2VydmljZU5hbWUKKyAgICAgICAgICAgICA8PCAiQ2xpZW50IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICYiIDw8IHNlcnZpY2VOYW1lIDw8ICJDbGllbnQiOworCisgIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl90eXBlc18gPDwgInsiIDw8IGV4dGVuZHNfZmllbGQgPDwgIjogIiA8PCBleHRlbmRzX2NsaWVudF9uZXcgPDwgIkZhY3RvcnkodCwgZil9IjsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3R5cGVzXyA8PCAieyIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiYzogdGhyaWZ0Lk5ld1RTdGFuZGFyZENsaWVudChmLkdldFByb3RvY29sKHQpLCBmLkdldFByb3RvY29sKHQpKSwiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIC8vIExlZ2FjeSBjb25zdHJ1Y3RvciBmdW5jdGlvbiB3aXRoIGN1c3RvbSBpbnB1dCAmIG91dHB1dCBwcm90b2NvbHMKKyAgZl90eXBlc18KKyAgICAgIDw8IGluZGVudCgpIDw8ICJmdW5jIE5ldyIgPDwgc2VydmljZU5hbWUKKyAgICAgIDw8ICJDbGllbnRQcm90b2NvbCh0IHRocmlmdC5UVHJhbnNwb3J0LCBpcHJvdCB0aHJpZnQuVFByb3RvY29sLCBvcHJvdCB0aHJpZnQuVFByb3RvY29sKSAqIgorICAgICAgPDwgc2VydmljZU5hbWUgPDwgIkNsaWVudCB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInJldHVybiAmIiA8PCBzZXJ2aWNlTmFtZSA8PCAiQ2xpZW50IjsKKworICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfdHlwZXNfIDw8ICJ7IiA8PCBleHRlbmRzX2ZpZWxkIDw8ICI6ICIgPDwgZXh0ZW5kc19jbGllbnRfbmV3IDw8ICJQcm90b2NvbCh0LCBpcHJvdCwgb3Byb3QpfSIKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl90eXBlc18gPDwgInsiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImM6IHRocmlmdC5OZXdUU3RhbmRhcmRDbGllbnQoaXByb3QsIG9wcm90KSwiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gQ29uc3RydWN0b3IgZnVuY3Rpb24KKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImZ1bmMgTmV3IiA8PCBzZXJ2aWNlTmFtZQorICAgIDw8ICJDbGllbnQoYyB0aHJpZnQuVENsaWVudCkgKiIgPDwgc2VydmljZU5hbWUgPDwgIkNsaWVudCB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInJldHVybiAmIiA8PCBzZXJ2aWNlTmFtZSA8PCAiQ2xpZW50eyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKyAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCBleHRlbmRzX2ZpZWxkIDw8ICI6ICIgPDwgZXh0ZW5kc19jbGllbnRfbmV3IDw8ICIoYyksIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJjOiBjLCIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCBzZXJ2aWNlTmFtZSA8PCAiQ2xpZW50KSBDbGllbnRfKCkgdGhyaWZ0LlRDbGllbnQgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHAuYyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworICAgIHN0cmluZyBmdW5uYW1lID0gcHVibGljaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgIGdlbmVyYXRlX2dvX2RvY3N0cmluZyhmX3R5cGVzXywgKCpmX2l0ZXIpKTsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCBzZXJ2aWNlTmFtZSA8PCAiQ2xpZW50KSAiCisgICAgICAgICAgICAgICA8PCBmdW5jdGlvbl9zaWduYXR1cmVfaWYoKmZfaXRlciwgIiIsIHRydWUpIDw8ICIgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIHN0ZDo6c3RyaW5nIG1ldGhvZCA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBzdGQ6OnN0cmluZyBhcmdzVHlwZSA9IHB1YmxpY2l6ZShtZXRob2QgKyAiX2FyZ3MiLCB0cnVlKTsKKyAgICBzdGQ6OnN0cmluZyBhcmdzTmFtZSA9IHRtcCgiX2FyZ3MiKTsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAidmFyICIgPDwgYXJnc05hbWUgPDwgIiAiIDw8IGFyZ3NUeXBlIDw8IGVuZGw7CisKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgYXJnc05hbWUgPDwgIi4iIDw8IHB1YmxpY2l6ZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgIDw8ICIgPSAiIDw8IHZhcmlhYmxlX25hbWVfdG9fZ29fbmFtZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdE5hbWUgPSB0bXAoIl9yZXN1bHQiKTsKKyAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdFR5cGUgPSBwdWJsaWNpemUobWV0aG9kICsgIl9yZXN1bHQiLCB0cnVlKTsKKyAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ2YXIgIiA8PCByZXN1bHROYW1lIDw8ICIgIiA8PCByZXN1bHRUeXBlIDw8IGVuZGw7CisgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyID0gcC5DbGllbnRfKCkuQ2FsbChjdHgsIFwiIgorICAgICAgICA8PCBtZXRob2QgPDwgIlwiLCAmIiA8PCBhcmdzTmFtZSA8PCAiLCAmIiA8PCByZXN1bHROYW1lIDw8ICIpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInJldHVybiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworCisgICAgICBpZiAoIXhjZXB0aW9ucy5lbXB0eSgpKSB7CisgICAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJzd2l0Y2ggeyIgPDwgZW5kbDsKKworICAgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHB1Ym5hbWUgPSBwdWJsaWNpemUoKCp4X2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBmaWVsZCA9IHJlc3VsdE5hbWUgKyAiLiIgKyBwdWJuYW1lOworCisgICAgICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImNhc2UgIiA8PCBmaWVsZCA8PCAiIT0gbmlsOiIgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gciwgIiA8PCBmaWVsZCA8PCBlbmRsOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICI8PCBmaWVsZCA8PCBlbmRsOworICAgICAgICAgIH0KKworICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIH0KKworICAgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgICAgfQorCisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCByZXN1bHROYW1lIDw8ICIuR2V0U3VjY2VzcygpLCBuaWwiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIG5pbCIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLy8gVE9ETzogd291bGQgYmUgbmljZSB0byBub3QgdG8gZHVwbGljYXRlIHRoZSBjYWxsIGdlbmVyYXRpb24KKyAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gcC5DbGllbnRfKCkuQ2FsbChjdHgsIFwiIgorICAgICAgPDwgbWV0aG9kIDw8ICJcIiwgJiI8PCBhcmdzTmFtZSA8PCAiLCBuaWwpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInJldHVybiBlcnIiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIG5pbCIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfdHlwZXNfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBjb21tYW5kIGxpbmUgdG9vbCBmb3IgbWFraW5nIHJlbW90ZSByZXF1ZXN0cworICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHJlbW90ZSBmb3IuCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfcmVtb3RlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB0X3NlcnZpY2UqIHBhcmVudCA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworCisgIC8vIGNvbGxlY3QgaW5oZXJpdGVkIGZ1bmN0aW9ucworICB3aGlsZSAocGFyZW50ICE9IE5VTEwpIHsKKyAgICB2ZWN0b3I8dF9mdW5jdGlvbio+IHBfZnVuY3Rpb25zID0gcGFyZW50LT5nZXRfZnVuY3Rpb25zKCk7CisgICAgZnVuY3Rpb25zLmluc2VydChmdW5jdGlvbnMuZW5kKCksIHBfZnVuY3Rpb25zLmJlZ2luKCksIHBfZnVuY3Rpb25zLmVuZCgpKTsKKyAgICBwYXJlbnQgPSBwYXJlbnQtPmdldF9leHRlbmRzKCk7CisgIH0KKworICAvLyBUaGlzIGZpbGUgaXMgbm90IHVzZWZ1bCBpZiB0aGVyZSBhcmUgbm8gZnVuY3Rpb25zOyBkb24ndCBnZW5lcmF0ZSBpdAorICBpZiAoZnVuY3Rpb25zLnNpemUoKSA9PSAwKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgc3RyaW5nIGZfcmVtb3RlX2RpciA9IHBhY2thZ2VfZGlyXyArICIvIiArIHVuZGVyc2NvcmUoc2VydmljZV9uYW1lXykgKyAiLXJlbW90ZSI7CisgIE1LRElSKGZfcmVtb3RlX2Rpci5jX3N0cigpKTsKKworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIHN0cmluZyBmX3JlbW90ZV9uYW1lID0gZl9yZW1vdGVfZGlyICsgIi8iCisgICAgICAgICAgICAgICAgICAgICAgICAgKyB1bmRlcnNjb3JlKHNlcnZpY2VfbmFtZV8pICsgIi1yZW1vdGUuZ28iOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfcmVtb3RlOworICBmX3JlbW90ZS5vcGVuKGZfcmVtb3RlX25hbWUuY19zdHIoKSk7CisgIHN0cmluZyBzZXJ2aWNlX21vZHVsZSA9IGdldF9yZWFsX2dvX21vZHVsZShwcm9ncmFtXyk7CisgIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKKworICB3aGlsZSAoKGxvYyA9IHNlcnZpY2VfbW9kdWxlLmZpbmQoIi4iKSkgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgc2VydmljZV9tb2R1bGUucmVwbGFjZShsb2MsIDEsIDEsICcvJyk7CisgIH0KKyAgaWYgKCFnZW5fcGFja2FnZV9wcmVmaXhfLmVtcHR5KCkpIHsKKyAgICBzZXJ2aWNlX21vZHVsZSA9IGdlbl9wYWNrYWdlX3ByZWZpeF8gKyBzZXJ2aWNlX21vZHVsZTsKKyAgfQorCisgIHN0cmluZyB1bnVzZWRfcHJvdGVjdGlvbjsKKworICBzdHJpbmcgY3R4UGFja2FnZSA9ICJjb250ZXh0IjsKKworICBmX3JlbW90ZSA8PCBnb19hdXRvZ2VuX2NvbW1lbnQoKTsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInBhY2thZ2UgbWFpbiIgPDwgZW5kbCA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiaW1wb3J0ICgiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgICAgIFwiIiA8PCBjdHhQYWNrYWdlIDw8ICJcIiIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgXCJmbGFnXCIiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgICAgIFwiZm10XCIiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgICAgIFwibWF0aFwiIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgICAgICBcIm5ldFwiIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgICAgICBcIm5ldC91cmxcIiIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgXCJvc1wiIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgICAgICBcInN0cmNvbnZcIiIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgXCJzdHJpbmdzXCIiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgICAgIFwiIiArIGdlbl90aHJpZnRfaW1wb3J0XyArICJcIiIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgcmVuZGVyX2luY2x1ZGVkX3Byb2dyYW1zKHVudXNlZF9wcm90ZWN0aW9uKTsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgXCIiIDw8IHNlcnZpY2VfbW9kdWxlIDw8ICJcIiIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIikiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8IHVudXNlZF9wcm90ZWN0aW9uOyAvLyBmaWxsZWQgaW4gcmVuZGVyX2luY2x1ZGVkX3Byb2dyYW1zKCkKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImZ1bmMgVXNhZ2UoKSB7IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBmbXQuRnByaW50bG4ob3MuU3RkZXJyLCBcIlVzYWdlIG9mIFwiLCBvcy5BcmdzWzBdLCBcIiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJbLWggaG9zdDpwb3J0XSBbLXUgdXJsXSBbLWZbcmFtZWRdXSBmdW5jdGlvbiBbYXJnMSBbYXJnMi4uLl1dOlwiKSIKKyAgICAgICAgICAgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgZmxhZy5QcmludERlZmF1bHRzKCkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGZtdC5GcHJpbnRsbihvcy5TdGRlcnIsIFwiXFxuRnVuY3Rpb25zOlwiKSIgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGZfcmVtb3RlIDw8ICIgIGZtdC5GcHJpbnRsbihvcy5TdGRlcnIsIFwiICAiIDw8ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+Z2V0X25hbWUoKSA8PCAiICIKKyAgICAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIigiOworICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgYXJncyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgc3RkOjp2ZWN0b3I8dF9maWVsZCo+OjpzaXplX3R5cGUgbnVtX2FyZ3MgPSBhcmdzLnNpemUoKTsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKworICAgIGZvciAoc3RkOjp2ZWN0b3I8dF9maWVsZCo+OjpzaXplX3R5cGUgaSA9IDA7IGkgPCBudW1fYXJnczsgKytpKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfcmVtb3RlIDw8ICIsICI7CisgICAgICB9CisKKyAgICAgIGZfcmVtb3RlIDw8IGFyZ3NbaV0tPmdldF90eXBlKCktPmdldF9uYW1lKCkgPDwgIiAiIDw8IGFyZ3NbaV0tPmdldF9uYW1lKCk7CisgICAgfQorCisgICAgZl9yZW1vdGUgPDwgIilcIikiIDw8IGVuZGw7CisgIH0KKworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBmbXQuRnByaW50bG4ob3MuU3RkZXJyKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgb3MuRXhpdCgwKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8IGVuZGw7CisKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInR5cGUgaHR0cEhlYWRlcnMgbWFwW3N0cmluZ11zdHJpbmciIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJmdW5jIChoIGh0dHBIZWFkZXJzKSBTdHJpbmcoKSBzdHJpbmcgeyIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgdmFyIG0gbWFwW3N0cmluZ11zdHJpbmcgPSBoIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gZm10LlNwcmludGYoXCIlc1wiLCBtKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJmdW5jIChoIGh0dHBIZWFkZXJzKSBTZXQodmFsdWUgc3RyaW5nKSBlcnJvciB7IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBwYXJ0cyA6PSBzdHJpbmdzLlNwbGl0KHZhbHVlLCBcIjogXCIpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBpZiBsZW4ocGFydHMpICE9IDIgeyIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICByZXR1cm4gZm10LkVycm9yZihcImhlYWRlciBzaG91bGQgYmUgb2YgZm9ybWF0ICdLZXk6IFZhbHVlJ1wiKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgaFtwYXJ0c1swXV0gPSBwYXJ0c1sxXSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIG5pbCIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8IGVuZGw7CisKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImZ1bmMgbWFpbigpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZmxhZy5Vc2FnZSA9IFVzYWdlIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAidmFyIGhvc3Qgc3RyaW5nIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAidmFyIHBvcnQgaW50IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAidmFyIHByb3RvY29sIHN0cmluZyIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInZhciB1cmxTdHJpbmcgc3RyaW5nIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAidmFyIGZyYW1lZCBib29sIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAidmFyIHVzZUh0dHAgYm9vbCIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImhlYWRlcnMgOj0gbWFrZShodHRwSGVhZGVycykiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ2YXIgcGFyc2VkVXJsICp1cmwuVVJMIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAidmFyIHRyYW5zIHRocmlmdC5UVHJhbnNwb3J0IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiXyA9IHN0cmNvbnYuQXRvaSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIl8gPSBtYXRoLkFicyIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImZsYWcuVXNhZ2UgPSBVc2FnZSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImZsYWcuU3RyaW5nVmFyKCZob3N0LCBcImhcIiwgXCJsb2NhbGhvc3RcIiwgXCJTcGVjaWZ5IGhvc3QgYW5kIHBvcnRcIikiCisgICAgICAgICAgIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJmbGFnLkludFZhcigmcG9ydCwgXCJwXCIsIDkwOTAsIFwiU3BlY2lmeSBwb3J0XCIpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZmxhZy5TdHJpbmdWYXIoJnByb3RvY29sLCBcIlBcIiwgXCJiaW5hcnlcIiwgXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJTcGVjaWZ5IHRoZSBwcm90b2NvbCAoYmluYXJ5LCBjb21wYWN0LCBzaW1wbGVqc29uLCBqc29uKVwiKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImZsYWcuU3RyaW5nVmFyKCZ1cmxTdHJpbmcsIFwidVwiLCBcIlwiLCBcIlNwZWNpZnkgdGhlIHVybFwiKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImZsYWcuQm9vbFZhcigmZnJhbWVkLCBcImZyYW1lZFwiLCBmYWxzZSwgXCJVc2UgZnJhbWVkIHRyYW5zcG9ydFwiKSIKKyAgICAgICAgICAgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImZsYWcuQm9vbFZhcigmdXNlSHR0cCwgXCJodHRwXCIsIGZhbHNlLCBcIlVzZSBodHRwXCIpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZmxhZy5WYXIoaGVhZGVycywgXCJIXCIsIFwiSGVhZGVycyB0byBzZXQgb24gdGhlIGh0dHAocykgcmVxdWVzdCAoZS5nLiAtSCBcXFwiS2V5OiBWYWx1ZVxcXCIpXCIpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZmxhZy5QYXJzZSgpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiaWYgbGVuKHVybFN0cmluZykgPiAwIHsiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHZhciBlcnIgZXJyb3IiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHBhcnNlZFVybCwgZXJyID0gdXJsLlBhcnNlKHVybFN0cmluZykiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGlmIGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICBmbXQuRnByaW50bG4ob3MuU3RkZXJyLCBcIkVycm9yIHBhcnNpbmcgVVJMOiBcIiwgZXJyKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICBmbGFnLlVzYWdlKCkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGhvc3QgPSBwYXJzZWRVcmwuSG9zdCIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgdXNlSHR0cCA9IGxlbihwYXJzZWRVcmwuU2NoZW1lKSA8PSAwIHx8IHBhcnNlZFVybC5TY2hlbWUgPT0gXCJodHRwXCIgfHwgcGFyc2VkVXJsLlNjaGVtZSA9PSBcImh0dHBzXCIiCisgICAgICAgICAgIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgaWYgdXNlSHR0cCB7IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBfLCBlcnIgOj0gdXJsLlBhcnNlKGZtdC5TcHJpbnQoXCJodHRwOi8vXCIsIGhvc3QsIFwiOlwiLCBwb3J0KSkiCisgICAgICAgICAgIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGlmIGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICBmbXQuRnByaW50bG4ob3MuU3RkZXJyLCBcIkVycm9yIHBhcnNpbmcgVVJMOiBcIiwgZXJyKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICBmbGFnLlVzYWdlKCkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiY21kIDo9IGZsYWcuQXJnKDApIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAidmFyIGVyciBlcnJvciIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImlmIHVzZUh0dHAgeyIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgdHJhbnMsIGVyciA9IHRocmlmdC5OZXdUSHR0cENsaWVudChwYXJzZWRVcmwuU3RyaW5nKCkpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBpZiBsZW4oaGVhZGVycykgPiAwIHsiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgaHR0cHRyYW5zIDo9IHRyYW5zLigqdGhyaWZ0LlRIdHRwQ2xpZW50KSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICBmb3Iga2V5LCB2YWx1ZSA6PSByYW5nZSBoZWFkZXJzIHsiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgICBodHRwdHJhbnMuU2V0SGVhZGVyKGtleSwgdmFsdWUpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgIH0iIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgcG9ydFN0ciA6PSBmbXQuU3ByaW50KHBvcnQpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBpZiBzdHJpbmdzLkNvbnRhaW5zKGhvc3QsIFwiOlwiKSB7IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgaG9zdCwgcG9ydFN0ciwgZXJyID0gbmV0LlNwbGl0SG9zdFBvcnQoaG9zdCkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgICAgICBpZiBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgIGZtdC5GcHJpbnRsbihvcy5TdGRlcnIsIFwiZXJyb3Igd2l0aCBob3N0OlwiLCBlcnIpIgorICAgICAgICAgICA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICBvcy5FeGl0KDEpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgfSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgdHJhbnMsIGVyciA9IHRocmlmdC5OZXdUU29ja2V0KG5ldC5Kb2luSG9zdFBvcnQoaG9zdCwgcG9ydFN0cikpIgorICAgICAgICAgICA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBpZiBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgZm10LkZwcmludGxuKG9zLlN0ZGVyciwgXCJlcnJvciByZXNvbHZpbmcgYWRkcmVzczpcIiwgZXJyKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICBvcy5FeGl0KDEpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBpZiBmcmFtZWQgeyIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICB0cmFucyA9IHRocmlmdC5OZXdURnJhbWVkVHJhbnNwb3J0KHRyYW5zKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJpZiBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGZtdC5GcHJpbnRsbihvcy5TdGRlcnIsIFwiRXJyb3IgY3JlYXRpbmcgdHJhbnNwb3J0XCIsIGVycikiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIG9zLkV4aXQoMSkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZGVmZXIgdHJhbnMuQ2xvc2UoKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInZhciBwcm90b2NvbEZhY3RvcnkgdGhyaWZ0LlRQcm90b2NvbEZhY3RvcnkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJzd2l0Y2ggcHJvdG9jb2wgeyIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImNhc2UgXCJjb21wYWN0XCI6IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBwcm90b2NvbEZhY3RvcnkgPSB0aHJpZnQuTmV3VENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgYnJlYWsiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJjYXNlIFwic2ltcGxlanNvblwiOiIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgcHJvdG9jb2xGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RTaW1wbGVKU09OUHJvdG9jb2xGYWN0b3J5KCkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGJyZWFrIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiY2FzZSBcImpzb25cIjoiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHByb3RvY29sRmFjdG9yeSA9IHRocmlmdC5OZXdUSlNPTlByb3RvY29sRmFjdG9yeSgpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBicmVhayIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImNhc2UgXCJiaW5hcnlcIiwgXCJcIjoiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHByb3RvY29sRmFjdG9yeSA9IHRocmlmdC5OZXdUQmluYXJ5UHJvdG9jb2xGYWN0b3J5RGVmYXVsdCgpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBicmVhayIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBmbXQuRnByaW50bG4ob3MuU3RkZXJyLCBcIkludmFsaWQgcHJvdG9jb2wgc3BlY2lmaWVkOiBcIiwgcHJvdG9jb2wpIgorICAgICAgICAgICA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBVc2FnZSgpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBvcy5FeGl0KDEpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImlwcm90IDo9IHByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbCh0cmFucykiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJvcHJvdCA6PSBwcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnMpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiY2xpZW50IDo9ICIgPDwgcGFja2FnZV9uYW1lXyA8PCAiLk5ldyIgPDwgcHVibGljaXplKHNlcnZpY2VfbmFtZV8pCisgICAgICAgICAgIDw8ICJDbGllbnQodGhyaWZ0Lk5ld1RTdGFuZGFyZENsaWVudChpcHJvdCwgb3Byb3QpKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSB0cmFucy5PcGVuKCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgZm10LkZwcmludGxuKG9zLlN0ZGVyciwgXCJFcnJvciBvcGVuaW5nIHNvY2tldCB0byBcIiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiaG9zdCwgXCI6XCIsIHBvcnQsIFwiIFwiLCBlcnIpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBvcy5FeGl0KDEpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInN3aXRjaCBjbWQgeyIgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgYXJncyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgc3RkOjp2ZWN0b3I8dF9maWVsZCo+OjpzaXplX3R5cGUgbnVtX2FyZ3MgPSBhcmdzLnNpemUoKTsKKyAgICBzdHJpbmcgZnVuY05hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICBzdHJpbmcgcHViTmFtZShwdWJsaWNpemUoZnVuY05hbWUpKTsKKyAgICBzdHJpbmcgYXJndW1lbnRzTmFtZShwdWJsaWNpemUoZnVuY05hbWUgKyAiX2FyZ3MiLCB0cnVlKSk7CisgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImNhc2UgXCIiIDw8IGVzY2FwZV9zdHJpbmcoZnVuY05hbWUpIDw8ICJcIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImlmIGZsYWcuTkFyZygpIC0gMSAhPSAiIDw8IG51bV9hcmdzIDw8ICIgeyIgPDwgZW5kbDsKKyAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBmbXQuRnByaW50bG4ob3MuU3RkZXJyLCBcIiIgPDwgZXNjYXBlX3N0cmluZyhwdWJOYW1lKSA8PCAiIHJlcXVpcmVzICIKKyAgICAgICAgICAgICA8PCBudW1fYXJncyA8PCAiIGFyZ3NcIikiIDw8IGVuZGw7CisgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgZmxhZy5Vc2FnZSgpIiA8PCBlbmRsOworICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgZm9yIChzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj46OnNpemVfdHlwZSBpID0gMDsgaSA8IG51bV9hcmdzOyArK2kpIHsKKyAgICAgIHN0ZDo6dmVjdG9yPHRfZmllbGQqPjo6c2l6ZV90eXBlIGZsYWdBcmcgPSBpICsgMTsKKyAgICAgIHRfdHlwZSogdGhlX3R5cGUoYXJnc1tpXS0+Z2V0X3R5cGUoKSk7CisgICAgICB0X3R5cGUqIHRoZV90eXBlMihnZXRfdHJ1ZV90eXBlKHRoZV90eXBlKSk7CisKKyAgICAgIGlmICh0aGVfdHlwZTItPmlzX2VudW0oKSkgeworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAidG1wIiA8PCBpIDw8ICIsIGVyciA6PSAoc3RyY29udi5BdG9pKGZsYWcuQXJnKCIgPDwgZmxhZ0FyZyA8PCAiKSkpIgorICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBVc2FnZSgpIiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiIHJldHVybiIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJhcmd2YWx1ZSIgPDwgaSA8PCAiIDo9ICIgPDwgcGFja2FnZV9uYW1lXyA8PCAiLiIKKyAgICAgICAgICAgICAgICAgPDwgcHVibGljaXplKHRoZV90eXBlLT5nZXRfbmFtZSgpKSA8PCAiKHRtcCIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSBpZiAodGhlX3R5cGUyLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIGUgPSAoKHRfYmFzZV90eXBlKil0aGVfdHlwZTIpLT5nZXRfYmFzZSgpOworICAgICAgICBzdHJpbmcgZXJyKHRtcCgiZXJyIikpOworCisgICAgICAgIHN3aXRjaCAoZSkgeworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgICAgaWYgKHRoZV90eXBlMi0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJhcmd2YWx1ZSIgPDwgaSA8PCAiIDo9IFtdYnl0ZShmbGFnLkFyZygiIDw8IGZsYWdBcmcgPDwgIikpIgorICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImFyZ3ZhbHVlIiA8PCBpIDw8ICIgOj0gZmxhZy5BcmcoIiA8PCBmbGFnQXJnIDw8ICIpIiA8PCBlbmRsOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImFyZ3ZhbHVlIiA8PCBpIDw8ICIgOj0gZmxhZy5BcmcoIiA8PCBmbGFnQXJnIDw8ICIpID09IFwidHJ1ZVwiIgorICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAidG1wIiA8PCBpIDw8ICIsICIgPDwgZXJyIDw8ICIgOj0gKHN0cmNvbnYuQXRvaShmbGFnLkFyZygiCisgICAgICAgICAgICAgICAgICAgPDwgZmxhZ0FyZyA8PCAiKSkpIiA8PCBlbmRsOworICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJpZiAiIDw8IGVyciA8PCAiICE9IG5pbCB7IiA8PCBlbmRsOworICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIFVzYWdlKCkiIDw8IGVuZGw7CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIiA8PCBlbmRsOworICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJhcmd2YWx1ZSIgPDwgaSA8PCAiIDo9IGludDgodG1wIiA8PCBpIDw8ICIpIiA8PCBlbmRsOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ0bXAiIDw8IGkgPDwgIiwgIiA8PCBlcnIgPDwgIiA6PSAoc3RyY29udi5BdG9pKGZsYWcuQXJnKCIKKyAgICAgICAgICAgICAgICAgICA8PCBmbGFnQXJnIDw8ICIpKSkiIDw8IGVuZGw7CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImlmICIgPDwgZXJyIDw8ICIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgVXNhZ2UoKSIgPDwgZW5kbDsKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGw7CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImFyZ3ZhbHVlIiA8PCBpIDw8ICIgOj0gaW50MTYodG1wIiA8PCBpIDw8ICIpIiA8PCBlbmRsOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ0bXAiIDw8IGkgPDwgIiwgIiA8PCBlcnIgPDwgIiA6PSAoc3RyY29udi5BdG9pKGZsYWcuQXJnKCIKKyAgICAgICAgICAgICAgICAgICA8PCBmbGFnQXJnIDw8ICIpKSkiIDw8IGVuZGw7CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImlmICIgPDwgZXJyIDw8ICIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgVXNhZ2UoKSIgPDwgZW5kbDsKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGw7CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImFyZ3ZhbHVlIiA8PCBpIDw8ICIgOj0gaW50MzIodG1wIiA8PCBpIDw8ICIpIiA8PCBlbmRsOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJhcmd2YWx1ZSIgPDwgaSA8PCAiLCAiIDw8IGVycgorICAgICAgICAgICAgICAgICAgIDw8ICIgOj0gKHN0cmNvbnYuUGFyc2VJbnQoZmxhZy5BcmcoIiA8PCBmbGFnQXJnIDw8ICIpLCAxMCwgNjQpKSIgPDwgZW5kbDsKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiaWYgIiA8PCBlcnIgPDwgIiAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBVc2FnZSgpIiA8PCBlbmRsOworICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiIgPDwgZW5kbDsKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiYXJndmFsdWUiIDw8IGkgPDwgIiwgIiA8PCBlcnIKKyAgICAgICAgICAgICAgICAgICA8PCAiIDo9IChzdHJjb252LlBhcnNlRmxvYXQoZmxhZy5BcmcoIiA8PCBmbGFnQXJnIDw8ICIpLCA2NCkpIiA8PCBlbmRsOworICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJpZiAiIDw8IGVyciA8PCAiICE9IG5pbCB7IiA8PCBlbmRsOworICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIFVzYWdlKCkiIDw8IGVuZGw7CisgICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIiA8PCBlbmRsOworICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgdGhyb3coIkludmFsaWQgYmFzZSB0eXBlIGluIGdlbmVyYXRlX3NlcnZpY2VfcmVtb3RlIik7CisgICAgICAgIH0KKworICAgICAgICAvLyBmX3JlbW90ZSA8PCBwdWJsaWNpemUoYXJnc1tpXS0+Z2V0X25hbWUoKSkgPDwgIihzdHJjb252LkF0b2koZmxhZy5BcmcoIiA8PCBmbGFnQXJnIDw8CisgICAgICAgIC8vICIpKSkiOworICAgICAgfSBlbHNlIGlmICh0aGVfdHlwZTItPmlzX3N0cnVjdCgpKSB7CisgICAgICAgIHN0cmluZyBhcmcodG1wKCJhcmciKSk7CisgICAgICAgIHN0cmluZyBtYlRyYW5zKHRtcCgibWJUcmFucyIpKTsKKyAgICAgICAgc3RyaW5nIGVycjEodG1wKCJlcnIiKSk7CisgICAgICAgIHN0cmluZyBmYWN0b3J5KHRtcCgiZmFjdG9yeSIpKTsKKyAgICAgICAgc3RyaW5nIGpzUHJvdCh0bXAoImpzUHJvdCIpKTsKKyAgICAgICAgc3RyaW5nIGVycjIodG1wKCJlcnIiKSk7CisgICAgICAgIHN0ZDo6c3RyaW5nIHRzdHJ1Y3RfbmFtZShwdWJsaWNpemUodGhlX3R5cGUtPmdldF9uYW1lKCkpKTsKKyAgICAgICAgc3RkOjpzdHJpbmcgdHN0cnVjdF9tb2R1bGUoIG1vZHVsZV9uYW1lKHRoZV90eXBlKSk7CisgICAgICAgIGlmKHRzdHJ1Y3RfbW9kdWxlLmVtcHR5KCkpIHsKKyAgICAgICAgICB0c3RydWN0X21vZHVsZSA9IHBhY2thZ2VfbmFtZV87CisgICAgICAgIH0KKworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBhcmcgPDwgIiA6PSBmbGFnLkFyZygiIDw8IGZsYWdBcmcgPDwgIikiIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8IG1iVHJhbnMgPDwgIiA6PSB0aHJpZnQuTmV3VE1lbW9yeUJ1ZmZlckxlbihsZW4oIiA8PCBhcmcgPDwgIikpIgorICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZGVmZXIgIiA8PCBtYlRyYW5zIDw8ICIuQ2xvc2UoKSIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIl8sICIgPDwgZXJyMSA8PCAiIDo9ICIgPDwgbWJUcmFucyA8PCAiLldyaXRlU3RyaW5nKCIgPDwgYXJnIDw8ICIpIgorICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiaWYgIiA8PCBlcnIxIDw8ICIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIFVzYWdlKCkiIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8IGZhY3RvcnkgPDwgIiA6PSB0aHJpZnQuTmV3VEpTT05Qcm90b2NvbEZhY3RvcnkoKSIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwganNQcm90IDw8ICIgOj0gIiA8PCBmYWN0b3J5IDw8ICIuR2V0UHJvdG9jb2woIiA8PCBtYlRyYW5zIDw8ICIpIgorICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiYXJndmFsdWUiIDw8IGkgPDwgIiA6PSAiIDw8IHRzdHJ1Y3RfbW9kdWxlIDw8ICIuTmV3IiA8PCB0c3RydWN0X25hbWUKKyAgICAgICAgICAgICAgICAgPDwgIigpIiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBlcnIyIDw8ICIgOj0gYXJndmFsdWUiIDw8IGkgPDwgIi4iIDw8IHJlYWRfbWV0aG9kX25hbWVfIDw8ICAiKCIgPDwganNQcm90IDw8ICIpIiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiaWYgIiA8PCBlcnIyIDw8ICIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIFVzYWdlKCkiIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9IGVsc2UgaWYgKHRoZV90eXBlMi0+aXNfY29udGFpbmVyKCkgfHwgdGhlX3R5cGUyLT5pc194Y2VwdGlvbigpKSB7CisgICAgICAgIHN0cmluZyBhcmcodG1wKCJhcmciKSk7CisgICAgICAgIHN0cmluZyBtYlRyYW5zKHRtcCgibWJUcmFucyIpKTsKKyAgICAgICAgc3RyaW5nIGVycjEodG1wKCJlcnIiKSk7CisgICAgICAgIHN0cmluZyBmYWN0b3J5KHRtcCgiZmFjdG9yeSIpKTsKKyAgICAgICAgc3RyaW5nIGpzUHJvdCh0bXAoImpzUHJvdCIpKTsKKyAgICAgICAgc3RyaW5nIGVycjIodG1wKCJlcnIiKSk7CisgICAgICAgIHN0ZDo6c3RyaW5nIGFyZ05hbWUocHVibGljaXplKGFyZ3NbaV0tPmdldF9uYW1lKCkpKTsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgYXJnIDw8ICIgOj0gZmxhZy5BcmcoIiA8PCBmbGFnQXJnIDw8ICIpIiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBtYlRyYW5zIDw8ICIgOj0gdGhyaWZ0Lk5ld1RNZW1vcnlCdWZmZXJMZW4obGVuKCIgPDwgYXJnIDw8ICIpKSIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImRlZmVyICIgPDwgbWJUcmFucyA8PCAiLkNsb3NlKCkiIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJfLCAiIDw8IGVycjEgPDwgIiA6PSAiIDw8IG1iVHJhbnMgPDwgIi5Xcml0ZVN0cmluZygiIDw8IGFyZyA8PCAiKSIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImlmICIgPDwgZXJyMSA8PCAiICE9IG5pbCB7ICIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgVXNhZ2UoKSIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgZmFjdG9yeSA8PCAiIDo9IHRocmlmdC5OZXdUSlNPTlByb3RvY29sRmFjdG9yeSgpIiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBqc1Byb3QgPDwgIiA6PSAiIDw8IGZhY3RvcnkgPDwgIi5HZXRQcm90b2NvbCgiIDw8IG1iVHJhbnMgPDwgIikiCisgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJjb250YWluZXJTdHJ1Y3QiIDw8IGkgPDwgIiA6PSAiIDw8IHBhY2thZ2VfbmFtZV8gPDwgIi5OZXciCisgICAgICAgICAgICAgICAgIDw8IGFyZ3VtZW50c05hbWUgPDwgIigpIiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBlcnIyIDw8ICIgOj0gY29udGFpbmVyU3RydWN0IiA8PCBpIDw8ICIuUmVhZEZpZWxkIiA8PCAoaSArIDEpIDw8ICIoIgorICAgICAgICAgICAgICAgICA8PCBqc1Byb3QgPDwgIikiIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJpZiAiIDw8IGVycjIgPDwgIiAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgVXNhZ2UoKSIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImFyZ3ZhbHVlIiA8PCBpIDw8ICIgOj0gY29udGFpbmVyU3RydWN0IiA8PCBpIDw8ICIuIiA8PCBhcmdOYW1lCisgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdygiSW52YWxpZCBhcmd1bWVudCB0eXBlIGluIGdlbmVyYXRlX3NlcnZpY2VfcmVtb3RlIik7CisgICAgICB9CisKKyAgICAgIGlmICh0aGVfdHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIHR5cGVkZWZfbW9kdWxlKCBtb2R1bGVfbmFtZSh0aGVfdHlwZSkpOworICAgICAgICBpZih0eXBlZGVmX21vZHVsZS5lbXB0eSgpKSB7CisgICAgICAgICAgdHlwZWRlZl9tb2R1bGUgPSBwYWNrYWdlX25hbWVfOworICAgICAgICB9CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ2YWx1ZSIgPDwgaSA8PCAiIDo9ICIgPDwgdHlwZWRlZl9tb2R1bGUgPDwgIi4iCisgICAgICAgICAgICAgICAgIDw8IHB1YmxpY2l6ZSh0aGVfdHlwZS0+Z2V0X25hbWUoKSkgPDwgIihhcmd2YWx1ZSIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ2YWx1ZSIgPDwgaSA8PCAiIDo9IGFyZ3ZhbHVlIiA8PCBpIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImZtdC5QcmludChjbGllbnQuIiA8PCBwdWJOYW1lIDw8ICIoIjsKKyAgICBib29sIGFyZ0ZpcnN0ID0gdHJ1ZTsKKworICAgIGZfcmVtb3RlIDw8ICJjb250ZXh0LkJhY2tncm91bmQoKSI7CisgICAgZm9yIChzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj46OnNpemVfdHlwZSBpID0gMDsgaSA8IG51bV9hcmdzOyArK2kpIHsKKyAgICAgIGlmIChhcmdGaXJzdCkgeworICAgICAgICBhcmdGaXJzdCA9IGZhbHNlOworICAgICAgICBmX3JlbW90ZSA8PCAiLCAiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9yZW1vdGUgPDwgIiwgIjsKKyAgICAgIH0KKworICAgICAgaWYgKGFyZ3NbaV0tPmdldF90eXBlKCktPmlzX2VudW0oKSkgeworICAgICAgICBmX3JlbW90ZSA8PCAidmFsdWUiIDw8IGk7CisgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0tPmdldF90eXBlKCktPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgZSA9ICgodF9iYXNlX3R5cGUqKShhcmdzW2ldLT5nZXRfdHlwZSgpKSktPmdldF9iYXNlKCk7CisKKyAgICAgICAgc3dpdGNoIChlKSB7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICBmX3JlbW90ZSA8PCAidmFsdWUiIDw8IGk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICB0aHJvdygiSW52YWxpZCBiYXNlIHR5cGUgaW4gZ2VuZXJhdGVfc2VydmljZV9yZW1vdGUiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGZfcmVtb3RlIDw8IHB1YmxpY2l6ZShhcmdzW2ldLT5nZXRfbmFtZSgpKSA8PCAiKHN0cmNvbnYuQXRvaShmbGFnLkFyZygiIDw8IGZsYWdBcmcgPDwKKyAgICAgICAgLy8gIikpKSI7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3JlbW90ZSA8PCAidmFsdWUiIDw8IGk7CisgICAgICB9CisgICAgfQorCisgICAgZl9yZW1vdGUgPDwgIikpIiA8PCBlbmRsOworICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJmbXQuUHJpbnQoXCJcXG5cIikiIDw8IGVuZGw7CisgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImJyZWFrIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiY2FzZSBcIlwiOiIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgVXNhZ2UoKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgYnJlYWsiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgZm10LkZwcmludGxuKG9zLlN0ZGVyciwgXCJJbnZhbGlkIGZ1bmN0aW9uIFwiLCBjbWQpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIC8vIENsb3NlIHNlcnZpY2UgZmlsZQorICBmX3JlbW90ZS5jbG9zZSgpOworICBmb3JtYXRfZ29fb3V0cHV0KGZfcmVtb3RlX25hbWUpOworI2lmbmRlZiBfTVNDX1ZFUgorICAvLyBNYWtlIGZpbGUgZXhlY3V0YWJsZSwgbG92ZSB0aGF0IGJpdHdpc2UgT1IgYWN0aW9uCisgIGNobW9kKGZfcmVtb3RlX25hbWUuY19zdHIoKSwKKyAgICAgICAgU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lYVVNSCisjaWZuZGVmIF9XSU4zMgorICAgICAgICB8IFNfSVJHUlAgfCBTX0lYR1JQIHwgU19JUk9USCB8IFNfSVhPVEgKKyNlbmRpZgorICAgICAgICApOworI2VuZGlmCit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfcHJvY2Vzc29yX25ldyA9ICIiOworICBzdHJpbmcgc2VydmljZU5hbWUocHVibGljaXplKHRzZXJ2aWNlLT5nZXRfbmFtZSgpKSk7CisKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBzaXplX3QgaW5kZXggPSBleHRlbmRzLnJmaW5kKCIuIik7CisKKyAgICBpZiAoaW5kZXggIT0gc3RyaW5nOjpucG9zKSB7CisgICAgICBleHRlbmRzX3Byb2Nlc3NvciA9IGV4dGVuZHMuc3Vic3RyKDAsIGluZGV4ICsgMSkgKyBwdWJsaWNpemUoZXh0ZW5kcy5zdWJzdHIoaW5kZXggKyAxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiUHJvY2Vzc29yIjsKKyAgICAgIGV4dGVuZHNfcHJvY2Vzc29yX25ldyA9IGV4dGVuZHMuc3Vic3RyKDAsIGluZGV4ICsgMSkgKyAiTmV3IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwdWJsaWNpemUoZXh0ZW5kcy5zdWJzdHIoaW5kZXggKyAxKSkgKyAiUHJvY2Vzc29yIjsKKyAgICB9IGVsc2UgeworICAgICAgZXh0ZW5kc19wcm9jZXNzb3IgPSBwdWJsaWNpemUoZXh0ZW5kcykgKyAiUHJvY2Vzc29yIjsKKyAgICAgIGV4dGVuZHNfcHJvY2Vzc29yX25ldyA9ICJOZXciICsgZXh0ZW5kc19wcm9jZXNzb3I7CisgICAgfQorICB9CisKKyAgc3RyaW5nIHBTZXJ2aWNlTmFtZShwcml2YXRpemUodHNlcnZpY2UtPmdldF9uYW1lKCkpKTsKKyAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCisgIHN0cmluZyBzZWxmKHRtcCgic2VsZiIpKTsKKworICBpZiAoZXh0ZW5kc19wcm9jZXNzb3IuZW1wdHkoKSkgeworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ0eXBlICIgPDwgc2VydmljZU5hbWUgPDwgIlByb2Nlc3NvciBzdHJ1Y3QgeyIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBwcm9jZXNzb3JNYXAgbWFwW3N0cmluZ110aHJpZnQuVFByb2Nlc3NvckZ1bmN0aW9uIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIGhhbmRsZXIgIiA8PCBzZXJ2aWNlTmFtZSA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgc2VydmljZU5hbWUKKyAgICAgICAgICAgICAgIDw8ICJQcm9jZXNzb3IpIEFkZFRvUHJvY2Vzc29yTWFwKGtleSBzdHJpbmcsIHByb2Nlc3NvciB0aHJpZnQuVFByb2Nlc3NvckZ1bmN0aW9uKSB7IgorICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBwLnByb2Nlc3Nvck1hcFtrZXldID0gcHJvY2Vzc29yIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgc2VydmljZU5hbWUKKyAgICAgICAgICAgICAgIDw8ICJQcm9jZXNzb3IpIEdldFByb2Nlc3NvckZ1bmN0aW9uKGtleSBzdHJpbmcpICIKKyAgICAgICAgICAgICAgICAgICIocHJvY2Vzc29yIHRocmlmdC5UUHJvY2Vzc29yRnVuY3Rpb24sIG9rIGJvb2wpIHsiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgcHJvY2Vzc29yLCBvayA9IHAucHJvY2Vzc29yTWFwW2tleV0iIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHByb2Nlc3Nvciwgb2siIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCBzZXJ2aWNlTmFtZQorICAgICAgICAgICAgICAgPDwgIlByb2Nlc3NvcikgUHJvY2Vzc29yTWFwKCkgbWFwW3N0cmluZ110aHJpZnQuVFByb2Nlc3NvckZ1bmN0aW9uIHsiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHAucHJvY2Vzc29yTWFwIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImZ1bmMgTmV3IiA8PCBzZXJ2aWNlTmFtZSA8PCAiUHJvY2Vzc29yKGhhbmRsZXIgIiA8PCBzZXJ2aWNlTmFtZQorICAgICAgICAgICAgICAgPDwgIikgKiIgPDwgc2VydmljZU5hbWUgPDwgIlByb2Nlc3NvciB7IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgZl90eXBlc18KKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgIiA8PCBzZWxmIDw8ICIgOj0gJiIgPDwgc2VydmljZU5hbWUKKyAgICAgICAgPDwgIlByb2Nlc3NvcntoYW5kbGVyOmhhbmRsZXIsIHByb2Nlc3Nvck1hcDptYWtlKG1hcFtzdHJpbmdddGhyaWZ0LlRQcm9jZXNzb3JGdW5jdGlvbil9IgorICAgICAgICA8PCBlbmRsOworCisgICAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIHN0cmluZyBlc2NhcGVkRnVuY05hbWUoZXNjYXBlX3N0cmluZygoKmZfaXRlciktPmdldF9uYW1lKCkpKTsKKyAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgICIgPDwgc2VsZiA8PCAiLnByb2Nlc3Nvck1hcFtcIiIgPDwgZXNjYXBlZEZ1bmNOYW1lIDw8ICJcIl0gPSAmIgorICAgICAgICAgICAgICAgICA8PCBwU2VydmljZU5hbWUgPDwgIlByb2Nlc3NvciIgPDwgcHVibGljaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICAgPDwgIntoYW5kbGVyOmhhbmRsZXJ9IiA8PCBlbmRsOworICAgIH0KKworICAgIHN0cmluZyB4KHRtcCgieCIpKTsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICIgPDwgc2VsZiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgc2VydmljZU5hbWUKKyAgICAgICAgICAgICAgIDw8ICJQcm9jZXNzb3IpIFByb2Nlc3MoY3R4IGNvbnRleHQuQ29udGV4dCwgaXByb3QsIG9wcm90IHRocmlmdC5UUHJvdG9jb2wpIChzdWNjZXNzIGJvb2wsIGVyciAiCisgICAgICAgICAgICAgICAgICAidGhyaWZ0LlRFeGNlcHRpb24pIHsiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgbmFtZSwgXywgc2VxSWQsIGVyciA6PSBpcHJvdC5SZWFkTWVzc2FnZUJlZ2luKCkiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgaWYgZXJyICE9IG5pbCB7IHJldHVybiBmYWxzZSwgZXJyIH0iIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgaWYgcHJvY2Vzc29yLCBvayA6PSBwLkdldFByb2Nlc3NvckZ1bmN0aW9uKG5hbWUpOyBvayB7IiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgICAgcmV0dXJuIHByb2Nlc3Nvci5Qcm9jZXNzKGN0eCwgc2VxSWQsIGlwcm90LCBvcHJvdCkiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBpcHJvdC5Ta2lwKHRocmlmdC5TVFJVQ1QpIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIGlwcm90LlJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgIiA8PCB4CisgICAgICAgICAgICAgICA8PCAiIDo9IHRocmlmdC5OZXdUQXBwbGljYXRpb25FeGNlcHRpb24odGhyaWZ0LlVOS05PV05fTUVUSE9ELCBcIlVua25vd24gZnVuY3Rpb24gIgorICAgICAgICAgICAgICAgICAgIlwiICsgbmFtZSkiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgb3Byb3QuV3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgdGhyaWZ0LkVYQ0VQVElPTiwgc2VxSWQpIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgICIgPDwgeCA8PCAiLldyaXRlKG9wcm90KSIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBvcHJvdC5Xcml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBvcHJvdC5GbHVzaChjdHgpIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBmYWxzZSwgIiA8PCB4IDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ0eXBlICIgPDwgc2VydmljZU5hbWUgPDwgIlByb2Nlc3NvciBzdHJ1Y3QgeyIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICAqIiA8PCBleHRlbmRzX3Byb2Nlc3NvciA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImZ1bmMgTmV3IiA8PCBzZXJ2aWNlTmFtZSA8PCAiUHJvY2Vzc29yKGhhbmRsZXIgIiA8PCBzZXJ2aWNlTmFtZQorICAgICAgICAgICAgICAgPDwgIikgKiIgPDwgc2VydmljZU5hbWUgPDwgIlByb2Nlc3NvciB7IiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgICIgPDwgc2VsZiA8PCAiIDo9ICYiIDw8IHNlcnZpY2VOYW1lIDw8ICJQcm9jZXNzb3J7IgorICAgICAgICAgICAgICAgPDwgZXh0ZW5kc19wcm9jZXNzb3JfbmV3IDw8ICIoaGFuZGxlcil9IiA8PCBlbmRsOworCisgICAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIHN0cmluZyBlc2NhcGVkRnVuY05hbWUoZXNjYXBlX3N0cmluZygoKmZfaXRlciktPmdldF9uYW1lKCkpKTsKKyAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgICIgPDwgc2VsZiA8PCAiLkFkZFRvUHJvY2Vzc29yTWFwKFwiIiA8PCBlc2NhcGVkRnVuY05hbWUKKyAgICAgICAgICAgICAgICAgPDwgIlwiLCAmIiA8PCBwU2VydmljZU5hbWUgPDwgIlByb2Nlc3NvciIgPDwgcHVibGljaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICAgPDwgIntoYW5kbGVyOmhhbmRsZXJ9KSIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBzZWxmIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOworICB9CisKKyAgZl90eXBlc18gPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBwcm9jZXNzIGZ1bmN0aW9uIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgYSBkaXNwYXRjaGVyIGZvcgorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICAvLyBPcGVuIGZ1bmN0aW9uCisgIHN0cmluZyBwcm9jZXNzb3JOYW1lID0gcHJpdmF0aXplKHRzZXJ2aWNlLT5nZXRfbmFtZSgpKSArICJQcm9jZXNzb3IiCisgICAgICAgICAgICAgICAgICAgICAgICAgKyBwdWJsaWNpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKTsKKyAgc3RyaW5nIGFyZ3NuYW1lID0gcHVibGljaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyIsIHRydWUpOworICBzdHJpbmcgcmVzdWx0bmFtZSA9IHB1YmxpY2l6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIsIHRydWUpOworCisgIC8vIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICAvLyBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAidHlwZSAiIDw8IHByb2Nlc3Nvck5hbWUgPDwgIiBzdHJ1Y3QgeyIgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgaGFuZGxlciAiIDw8IHB1YmxpY2l6ZSh0c2VydmljZS0+Z2V0X25hbWUoKSkgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgcHJvY2Vzc29yTmFtZQorICAgICAgICAgICAgIDw8ICIpIFByb2Nlc3MoY3R4IGNvbnRleHQuQ29udGV4dCwgc2VxSWQgaW50MzIsIGlwcm90LCBvcHJvdCB0aHJpZnQuVFByb3RvY29sKSAoc3VjY2VzcyBib29sLCBlcnIgIgorICAgICAgICAgICAgICAgICJ0aHJpZnQuVEV4Y2VwdGlvbikgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJhcmdzIDo9ICIgPDwgYXJnc25hbWUgPDwgInt9IiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyID0gYXJncy4iIDw8IHJlYWRfbWV0aG9kX25hbWVfIDw8ICAiKGlwcm90KTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBpcHJvdC5SZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsOworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIiAgeCA6PSB0aHJpZnQuTmV3VEFwcGxpY2F0aW9uRXhjZXB0aW9uKHRocmlmdC5QUk9UT0NPTF9FUlJPUiwgZXJyLkVycm9yKCkpIgorICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwgZXNjYXBlX3N0cmluZyh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICA8PCAiXCIsIHRocmlmdC5FWENFUFRJT04sIHNlcUlkKSIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICB4LldyaXRlKG9wcm90KSIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBvcHJvdC5Xcml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBvcHJvdC5GbHVzaChjdHgpIiA8PCBlbmRsOworICB9CisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBmYWxzZSwgZXJyIiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiaXByb3QuUmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbDsKKworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0IDo9ICIgPDwgcmVzdWx0bmFtZSA8PCAie30iIDw8IGVuZGw7CisgIH0KKyAgYm9vbCBuZWVkX3JlZmVyZW5jZSA9IHR5cGVfbmVlZF9yZWZlcmVuY2UodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIGZfdHlwZXNfIDw8ICJ2YXIgcmV0dmFsICIgPDwgdHlwZV90b19nb190eXBlKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkgPDwgZW5kbDsKKyAgfQorCisgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ2YXIgZXJyMiBlcnJvciIgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImlmICI7CisKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgZl90eXBlc18gPDwgInJldHZhbCwgIjsKKyAgICB9CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAorICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZfdHlwZXNfIDw8ICJlcnIyID0gcC5oYW5kbGVyLiIgPDwgcHVibGljaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgPDwgIigiOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKworICBmX3R5cGVzXyA8PCAiY3R4IjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICBmX3R5cGVzXyA8PCAiLCAiOworICAgIH0gZWxzZSB7CisgICAgICBmX3R5cGVzXyA8PCAiLCAiOworICAgIH0KKworICAgIGZfdHlwZXNfIDw8ICJhcmdzLiIgPDwgcHVibGljaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7CisgIH0KKworICBmX3R5cGVzXyA8PCAiKTsgZXJyMiAhPSBuaWwgeyIgPDwgZW5kbDsKKworICB0X3N0cnVjdCogZXhjZXB0aW9ucyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB4X2ZpZWxkcyA9IGV4Y2VwdGlvbnMtPmdldF9tZW1iZXJzKCk7CisgIGlmICgheF9maWVsZHMuZW1wdHkoKSkgeworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJzd2l0Y2ggdiA6PSBlcnIyLih0eXBlKSB7IiA8PCBlbmRsOworCisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeGZfaXRlcjsKKworICAgIGZvciAoeGZfaXRlciA9IHhfZmllbGRzLmJlZ2luKCk7IHhmX2l0ZXIgIT0geF9maWVsZHMuZW5kKCk7ICsreGZfaXRlcikgeworICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgY2FzZSAiIDw8IHR5cGVfdG9fZ29fdHlwZSgoKCp4Zl9pdGVyKS0+Z2V0X3R5cGUoKSkpIDw8ICI6IgorICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInJlc3VsdC4iIDw8IHB1YmxpY2l6ZSgoKnhmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiID0gdiIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBkZWZhdWx0OiIgPDwgZW5kbDsKKyAgfQorCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIHggOj0gdGhyaWZ0Lk5ld1RBcHBsaWNhdGlvbkV4Y2VwdGlvbih0aHJpZnQuSU5URVJOQUxfRVJST1IsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIkludGVybmFsIGVycm9yIHByb2Nlc3NpbmcgIiA8PCBlc2NhcGVfc3RyaW5nKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgIDw8ICI6IFwiICsgZXJyMi5FcnJvcigpKSIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwgZXNjYXBlX3N0cmluZyh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICA8PCAiXCIsIHRocmlmdC5FWENFUFRJT04sIHNlcUlkKSIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICB4LldyaXRlKG9wcm90KSIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBvcHJvdC5Xcml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBvcHJvdC5GbHVzaChjdHgpIiA8PCBlbmRsOworICB9CisKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRydWUsIGVycjIiIDw8IGVuZGw7CisKKyAgaWYgKCF4X2ZpZWxkcy5lbXB0eSgpKSB7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSI7IC8vIGNsb3NlcyBlcnIyICE9IG5pbAorCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgIGZfdHlwZXNfIDw8ICIgZWxzZSB7IiA8PCBlbmRsOyAvLyBtYWtlIHN1cmUgd2Ugc2V0IFN1Y2Nlc3MgcmV0dmFsIG9ubHkgb24gc3VjY2VzcworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LlN1Y2Nlc3MgPSAiOworICAgICAgaWYgKG5lZWRfcmVmZXJlbmNlKSB7CisgICAgICAgIGZfdHlwZXNfIDw8ICImIjsKKyAgICAgIH0KKyAgICAgIGZfdHlwZXNfIDw8ICJyZXR2YWwiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl90eXBlc18gPDwgIn0iIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfdHlwZXNfIDw8IGVuZGw7CisgICAgfQorICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJpZiBlcnIyID0gb3Byb3QuV3JpdGVNZXNzYWdlQmVnaW4oXCIiCisgICAgICAgICAgICAgICA8PCBlc2NhcGVfc3RyaW5nKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgPDwgIlwiLCB0aHJpZnQuUkVQTFksIHNlcUlkKTsgZXJyMiAhPSBuaWwgeyIKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgZXJyID0gZXJyMiIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyMiA9IHJlc3VsdC4iIDw8IHdyaXRlX21ldGhvZF9uYW1lXyA8PCAiKG9wcm90KTsgZXJyID09IG5pbCAmJiBlcnIyICE9IG5pbCB7IiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIGVyciA9IGVycjIiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImlmIGVycjIgPSBvcHJvdC5Xcml0ZU1lc3NhZ2VFbmQoKTsgZXJyID09IG5pbCAmJiBlcnIyICE9IG5pbCB7IgorICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBlcnIgPSBlcnIyIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJpZiBlcnIyID0gb3Byb3QuRmx1c2goY3R4KTsgZXJyID09IG5pbCAmJiBlcnIyICE9IG5pbCB7IiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIGVyciA9IGVycjIiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImlmIGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInJldHVybiB0cnVlLCBlcnIiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl90eXBlc18gPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHRydWUsIG5pbCIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlY2xhcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjb2VyY2VEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY29udGFpbmVyX3ZhbHVlKSB7CisgICh2b2lkKWluY2xhc3M7CisgICh2b2lkKWNvZXJjZURhdGE7CisgIHRfdHlwZSogb3JpZ190eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKG9yaWdfdHlwZSk7CisgIHN0cmluZyBuYW1lKHByZWZpeCArIHB1YmxpY2l6ZSh0ZmllbGQtPmdldF9uYW1lKCkpKTsKKworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBuYW1lOworICB9CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodF9zdHJ1Y3QqKXR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3BvaW50ZXJfZmllbGQodGZpZWxkLCBpbl9jb250YWluZXJfdmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsYXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIG9yaWdfdHlwZSwgaXNfcG9pbnRlcl9maWVsZCh0ZmllbGQpLCBkZWNsYXJlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKworICAgIGlmIChkZWNsYXJlKSB7CisgICAgICBzdHJpbmcgdHlwZV9uYW1lID0gaW5rZXkgPyB0eXBlX3RvX2dvX2tleV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHR5cGVfdG9fZ29fdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworCisgICAgICBvdXQgPDwgInZhciAiIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiICIgPDwgdHlwZV9uYW1lIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50KG91dCkgPDwgImlmIHYsIGVyciA6PSBpcHJvdC4iOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSAmJiAhaW5rZXkpIHsKKyAgICAgICAgICBvdXQgPDwgIlJlYWRCaW5hcnkoKSI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8ICJSZWFkU3RyaW5nKCkiOworICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgb3V0IDw8ICJSZWFkQm9vbCgpIjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAiUmVhZEJ5dGUoKSI7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJSZWFkSTE2KCkiOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIG91dCA8PCAiUmVhZEkzMigpIjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgIlJlYWRJNjQoKSI7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJSZWFkRG91YmxlKCkiOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBHbyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCAiUmVhZEkzMigpIjsKKyAgICB9CisKKyAgICBvdXQgPDwgIjsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoXCJlcnJvciByZWFkaW5nIGZpZWxkICIgPDwgdGZpZWxkLT5nZXRfa2V5KCkKKyAgICAgICAgPDwgIjogXCIsIGVycikiIDw8IGVuZGw7CisKKyAgICBvdXQgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICAgIHN0cmluZyB3cmFwOworCisgICAgaWYgKHR5cGUtPmlzX2VudW0oKSB8fCBvcmlnX3R5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgICAgd3JhcCA9IHB1YmxpY2l6ZSh0eXBlX25hbWUob3JpZ190eXBlKSk7CisgICAgfSBlbHNlIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9JOCkgeworICAgICAgd3JhcCA9ICJpbnQ4IjsKKyAgICB9CisKKyAgICBzdHJpbmcgbWF5YmVfYWRkcmVzcyA9IChpc19wb2ludGVyX2ZpZWxkKHRmaWVsZCkgPyAiJiIgOiAiIik7CisgICAgaWYgKHdyYXAgPT0gIiIpIHsKKyAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIiA9ICIgPDwgbWF5YmVfYWRkcmVzcyA8PCAidiIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgInRlbXAgOj0gIiA8PCB3cmFwIDw8ICIodikiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIgPSAiIDw8IG1heWJlX2FkZHJlc3MgPDwgInRlbXAiIDw8IGVuZGw7CisgICAgfQorCisgICAgb3V0IDw8ICJ9IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQgJyIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIicgZm9yIGZpZWxkICciCisgICAgICAgICsgdGZpZWxkLT5nZXRfbmFtZSgpICsgIiciOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGFuIHVuc2VyaWFsaXplciBmb3IgYSBzdHJ1Y3QsIGNhbGxpbmcgcmVhZCgpCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVyX2ZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVjbGFyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBlcShkZWNsYXJlID8gIiA6PSAiIDogIiA9ICIpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgZXEgPDwgKHBvaW50ZXJfZmllbGQgPyAiJiIgOiAiIik7CisgIGdlbmVyYXRlX2dvX3N0cnVjdF9pbml0aWFsaXplcihvdXQsIHRzdHJ1Y3QpOworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSAiIDw8IHByZWZpeCA8PCAiLiIgPDwgcmVhZF9tZXRob2RfbmFtZV8gPDwgICIoaXByb3QpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihmbXQuU3ByaW50ZihcIiVUIGVycm9yIHJlYWRpbmcgc3RydWN0OiBcIiwgIgorICAgICAgPDwgcHJlZml4IDw8ICIpLCBlcnIpIiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKKy8qKgorICogU2VyaWFsaXplIGEgY29udGFpbmVyIGJ5IHdyaXRpbmcgb3V0IHRoZSBoZWFkZXIgZm9sbG93ZWQgYnkKKyAqIGRhdGEgYW5kIHRoZW4gYSBmb290ZXIuCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiBvcmlnX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVyX2ZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVjbGFyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgIHRfdHlwZSogdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKG9yaWdfdHlwZSk7CisgIHN0cmluZyBlcSgiID0gIik7CisKKyAgaWYgKGRlY2xhcmUpIHsKKyAgICBlcSA9ICIgOj0gIjsKKyAgfQorCisgIC8vIERlY2xhcmUgdmFyaWFibGVzLCByZWFkIGhlYWRlcgorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJfLCBfLCBzaXplLCBlcnIgOj0gaXByb3QuUmVhZE1hcEJlZ2luKCkiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKFwiZXJyb3IgcmVhZGluZyBtYXAgYmVnaW46IFwiLCBlcnIpIiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRNYXAgOj0gbWFrZSgiIDw8IHR5cGVfdG9fZ29fdHlwZShvcmlnX3R5cGUpIDw8ICIsIHNpemUpIiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgZXEgPDwgIiAiIDw8IChwb2ludGVyX2ZpZWxkID8gIiYiIDogIiIpIDw8ICJ0TWFwIiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiXywgc2l6ZSwgZXJyIDo9IGlwcm90LlJlYWRTZXRCZWdpbigpIiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihcImVycm9yIHJlYWRpbmcgc2V0IGJlZ2luOiBcIiwgZXJyKSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0U2V0IDo9IG1ha2UoIiA8PCB0eXBlX3RvX2dvX3R5cGUob3JpZ190eXBlKSA8PCAiLCAwLCBzaXplKSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8IGVxIDw8ICIgIiA8PCAocG9pbnRlcl9maWVsZCA/ICImIiA6ICIiKSA8PCAidFNldCIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJfLCBzaXplLCBlcnIgOj0gaXByb3QuUmVhZExpc3RCZWdpbigpIiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihcImVycm9yIHJlYWRpbmcgbGlzdCBiZWdpbjogXCIsIGVycikiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidFNsaWNlIDo9IG1ha2UoIiA8PCB0eXBlX3RvX2dvX3R5cGUob3JpZ190eXBlKSA8PCAiLCAwLCBzaXplKSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8IGVxIDw8ICIgIiA8PCAocG9pbnRlcl9maWVsZCA/ICImIiA6ICIiKSA8PCAidFNsaWNlIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyICciICsgdHR5cGUtPmdldF9uYW1lKCkgKyAiJyBmb3IgcHJlZml4ICciCisgICAgICAgICsgcHJlZml4ICsgIiciOworICB9CisKKyAgLy8gRm9yIGxvb3AgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cworICBvdXQgPDwgaW5kZW50KCkgPDwgImZvciBpIDo9IDA7IGkgPCBzaXplOyBpICsrIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGlmIChwb2ludGVyX2ZpZWxkKSB7CisgICAgcHJlZml4ID0gIigqIiArIHByZWZpeCArICIpIjsKKyAgfQorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBkZWNsYXJlLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgZGVjbGFyZSwgcHJlZml4KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGRlY2xhcmUsIHByZWZpeCk7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgLy8gUmVhZCBjb250YWluZXIgZW5kCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSBpcHJvdC5SZWFkTWFwRW5kKCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoXCJlcnJvciByZWFkaW5nIG1hcCBlbmQ6IFwiLCBlcnIpIiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSBpcHJvdC5SZWFkU2V0RW5kKCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoXCJlcnJvciByZWFkaW5nIHNldCBlbmQ6IFwiLCBlcnIpIiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gaXByb3QuUmVhZExpc3RFbmQoKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihcImVycm9yIHJlYWRpbmcgbGlzdCBlbmQ6IFwiLCBlcnIpIiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIHRvIGRlc2VyaWFsaXplIGEgbWFwCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWNsYXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICAodm9pZClkZWNsYXJlOworICBzdHJpbmcga2V5ID0gdG1wKCJfa2V5Iik7CisgIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKKyAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOworICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7CisgIGZrZXkuc2V0X3JlcSh0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUKTsKKyAgZnZhbC5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQpOworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5LCB0cnVlLCAiIiwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCwgdHJ1ZSwgIiIsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUpOworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIlsiIDw8IGtleSA8PCAiXSA9ICIgPDwgdmFsIDw8IGVuZGw7Cit9CisKKy8qKgorICogV3JpdGUgYSBzZXQgZWxlbWVudAorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVjbGFyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgKHZvaWQpZGVjbGFyZTsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgIHRfZmllbGQgZmVsZW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKyAgZmVsZW0uc2V0X3JlcSh0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUKTsKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0sIHRydWUsICIiLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIgPSBhcHBlbmQoIiA8PCBwcmVmaXggPDwgIiwgIiA8PCBlbGVtIDw8ICIpIiA8PCBlbmRsOworfQorCisvKioKKyAqIFdyaXRlIGEgbGlzdCBlbGVtZW50CisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlY2xhcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICAodm9pZClkZWNsYXJlOworICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgdF9maWVsZCBmZWxlbSgoKHRfbGlzdCopdGxpc3QpLT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworICBmZWxlbS5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQpOworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSwgdHJ1ZSwgIiIsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUpOworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IGFwcGVuZCgiIDw8IHByZWZpeCA8PCAiLCAiIDw8IGVsZW0gPDwgIikiIDw8IGVuZGw7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQorICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5rZXkpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworICBzdHJpbmcgbmFtZShwcmVmaXggKyBwdWJsaWNpemUodGZpZWxkLT5nZXRfbmFtZSgpKSk7CisKKyAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3QgZ2VuZXJhdGUgc2VyaWFsaXplIGZvciB2b2lkIHR5cGU6ICIgKyBuYW1lOworICB9CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBpc19wb2ludGVyX2ZpZWxkKHRmaWVsZCksIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpZiBlcnIgOj0gb3Byb3QuIjsKKworICAgIGlmIChpc19wb2ludGVyX2ZpZWxkKHRmaWVsZCkpIHsKKyAgICAgIG5hbWUgPSAiKiIgKyBuYW1lOworICAgIH0KKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworCisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkgJiYgIWlua2V5KSB7CisgICAgICAgICAgb3V0IDw8ICJXcml0ZUJpbmFyeSgiIDw8IG5hbWUgPDwgIikiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAiV3JpdGVTdHJpbmcoc3RyaW5nKCIgPDwgbmFtZSA8PCAiKSkiOworICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgb3V0IDw8ICJXcml0ZUJvb2woYm9vbCgiIDw8IG5hbWUgPDwgIikpIjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAiV3JpdGVCeXRlKGludDgoIiA8PCBuYW1lIDw8ICIpKSI7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJXcml0ZUkxNihpbnQxNigiIDw8IG5hbWUgPDwgIikpIjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgIldyaXRlSTMyKGludDMyKCIgPDwgbmFtZSA8PCAiKSkiOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAiV3JpdGVJNjQoaW50NjQoIiA8PCBuYW1lIDw8ICIpKSI7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJXcml0ZURvdWJsZShmbG9hdDY0KCIgPDwgbmFtZSA8PCAiKSkiOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBHbyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCAiV3JpdGVJMzIoaW50MzIoIiA8PCBuYW1lIDw8ICIpKSI7CisgICAgfQorCisgICAgb3V0IDw8ICI7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiB0aHJpZnQuUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKFwiJVQuIgorICAgICAgICA8PCBlc2NhcGVfc3RyaW5nKHRmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIiAoIiA8PCB0ZmllbGQtPmdldF9rZXkoKQorICAgICAgICA8PCAiKSBmaWVsZCB3cml0ZSBlcnJvcjogXCIsIHApLCBlcnIpIH0iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBJbnZhbGlkIHR5cGUgaW4gZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkICciICsgdHlwZS0+Z2V0X25hbWUoKQorICAgICAgICArICInIGZvciBmaWVsZCAnIiArIG5hbWUgKyAiJyI7CisgIH0KK30KKworLyoqCisgKiBTZXJpYWxpemVzIGFsbCB0aGUgbWVtYmVycyBvZiBhIHN0cnVjdC4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IHRvIHNlcmlhbGl6ZQorICogQHBhcmFtIHByZWZpeCAgU3RyaW5nIHByZWZpeCB0byBhdHRhY2ggdG8gYWxsIGZpZWxkcworICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKKyAgKHZvaWQpdHN0cnVjdDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gIiA8PCBwcmVmaXggPDwgIi4iIDw8IHdyaXRlX21ldGhvZF9uYW1lXyA8PCAiKG9wcm90KTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoZm10LlNwcmludGYoXCIlVCBlcnJvciB3cml0aW5nIHN0cnVjdDogXCIsICIKKyAgICAgIDw8IHByZWZpeCA8PCAiKSwgZXJyKSIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVyX2ZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgIGlmIChwb2ludGVyX2ZpZWxkKSB7CisgICAgcHJlZml4ID0gIioiICsgcHJlZml4OworICB9CisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSBvcHJvdC5Xcml0ZU1hcEJlZ2luKCIKKyAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgPDwgImxlbigiIDw8IHByZWZpeCA8PCAiKSk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoXCJlcnJvciB3cml0aW5nIG1hcCBiZWdpbjogXCIsIGVycikiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IG9wcm90LldyaXRlU2V0QmVnaW4oIgorICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgPDwgImxlbigiIDw8IHByZWZpeCA8PCAiKSk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoXCJlcnJvciB3cml0aW5nIHNldCBiZWdpbjogXCIsIGVycikiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSBvcHJvdC5Xcml0ZUxpc3RCZWdpbigiCisgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgPDwgImxlbigiIDw8IHByZWZpeCA8PCAiKSk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoXCJlcnJvciB3cml0aW5nIGxpc3QgYmVnaW46IFwiLCBlcnIpIiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IEludmFsaWQgdHlwZSBpbiBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyICciICsgdHR5cGUtPmdldF9uYW1lKCkKKyAgICAgICAgKyAiJyBmb3IgcHJlZml4ICciICsgcHJlZml4ICsgIiciOworICB9CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHRfbWFwKiB0bWFwID0gKHRfbWFwKil0dHlwZTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImZvciBrLCB2IDo9IHJhbmdlICIgPDwgcHJlZml4IDw8ICIgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCB0bWFwLCAiayIsICJ2Iik7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3NldCogdHNldCA9ICh0X3NldCopdHR5cGU7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJmb3IgaSA6PSAwOyBpPGxlbigiIDw8IHByZWZpeCA8PCAiKTsgaSsrIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIGZvciBqIDo9IGkrMTsgajxsZW4oIiA8PCBwcmVmaXggPDwgIik7IGorKyB7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgIGlmIHJlZmxlY3QuRGVlcEVxdWFsKCIgPDwgcHJlZml4IDw8ICJbaV0sIiA8PCBwcmVmaXggPDwgIltqXSkgeyAiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihcIlwiLCBmbXQuRXJyb3JmKFwiJVQgZXJyb3Igd3JpdGluZyBzZXQgZmllbGQ6IHNsaWNlIGlzIG5vdCB1bmlxdWVcIiwgIiA8PCBwcmVmaXggPDwgIltpXSkpIiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgIH0iIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZm9yIF8sIHYgOj0gcmFuZ2UgIiA8PCBwcmVmaXggPDwgIiB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsIHRzZXQsICJ2Iik7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgdF9saXN0KiB0bGlzdCA9ICh0X2xpc3QqKXR0eXBlOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZm9yIF8sIHYgOj0gcmFuZ2UgIiA8PCBwcmVmaXggPDwgIiB7IiA8PCBlbmRsOworCisgICAgaW5kZW50X3VwKCk7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsIHRsaXN0LCAidiIpOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gb3Byb3QuV3JpdGVNYXBFbmQoKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihcImVycm9yIHdyaXRpbmcgbWFwIGVuZDogXCIsIGVycikiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IG9wcm90LldyaXRlU2V0RW5kKCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoXCJlcnJvciB3cml0aW5nIHNldCBlbmQ6IFwiLCBlcnIpIiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gb3Byb3QuV3JpdGVMaXN0RW5kKCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoXCJlcnJvciB3cml0aW5nIGxpc3QgZW5kOiBcIiwgZXJyKSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgorICoKKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcga2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHZpdGVyKSB7CisgIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCAiIik7CisgIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCAiIik7CisgIGtmaWVsZC5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQpOworICB2ZmllbGQuc2V0X3JlcSh0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCwga2l0ZXIsIHRydWUpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCB2aXRlcik7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBwcmVmaXgpIHsKKyAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCAiIik7CisgIGVmaWVsZC5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCBwcmVmaXgpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgorICovCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIHByZWZpeCkgeworICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCAiIik7CisgIGVmaWVsZC5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCBwcmVmaXgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgZG9jc3RyaW5nIGZvciBhIGdpdmVuIHN0cnVjdC4KKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ29fZG9jc3RyaW5nKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgZ2VuZXJhdGVfZ29fZG9jc3RyaW5nKG91dCwgdHN0cnVjdCwgdHN0cnVjdCwgIkF0dHJpYnV0ZXMiKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIGRvY3N0cmluZyBmb3IgYSBnaXZlbiBmdW5jdGlvbi4KKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ29fZG9jc3RyaW5nKG9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIGdlbmVyYXRlX2dvX2RvY3N0cmluZyhvdXQsIHRmdW5jdGlvbiwgdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLCAiUGFyYW1ldGVycyIpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgZG9jc3RyaW5nIGZvciBhIHN0cnVjdCBvciBmdW5jdGlvbi4KKyAqLwordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ29fZG9jc3RyaW5nKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2RvYyogdGRvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzdWJoZWFkZXIpIHsKKyAgYm9vbCBoYXNfZG9jID0gZmFsc2U7CisgIHN0cmluZ3N0cmVhbSBzczsKKworICBpZiAodGRvYy0+aGFzX2RvYygpKSB7CisgICAgaGFzX2RvYyA9IHRydWU7CisgICAgc3MgPDwgdGRvYy0+Z2V0X2RvYygpOworICB9CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKworICBpZiAoZmllbGRzLnNpemUoKSA+IDApIHsKKyAgICBpZiAoaGFzX2RvYykgeworICAgICAgc3MgPDwgZW5kbDsKKyAgICB9CisKKyAgICBoYXNfZG9jID0gdHJ1ZTsKKyAgICBzcyA8PCBzdWJoZWFkZXIgPDwgIjpcbiI7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgcF9pdGVyOworCisgICAgZm9yIChwX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgcF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytwX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIHAgPSAqcF9pdGVyOworICAgICAgc3MgPDwgIiAtICIgPDwgcHVibGljaXplKHAtPmdldF9uYW1lKCkpOworCisgICAgICBpZiAocC0+aGFzX2RvYygpKSB7CisgICAgICAgIHNzIDw8ICI6ICIgPDwgcC0+Z2V0X2RvYygpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3MgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoaGFzX2RvYykgeworICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwgIiIsICIvLyAiLCBzcy5zdHIoKSwgIiIpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSBkb2NzdHJpbmcgZm9yIGEgZ2VuZXJpYyBvYmplY3QuCisgKi8KK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2dvX2RvY3N0cmluZyhvc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKSB7CisgIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKKyAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsICIiLCAiLy8iLCB0ZG9jLT5nZXRfZG9jKCksICIiKTsKKyAgfQorfQorCisvKioKKyAqIERlY2xhcmVzIGFuIGFyZ3VtZW50LCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCisgKgorICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQKKyAqLworc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpkZWNsYXJlX2FyZ3VtZW50KHRfZmllbGQqIHRmaWVsZCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVzdWx0OworICByZXN1bHQgPDwgcHVibGljaXplKHRmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIj0iOworCisgIGlmICh0ZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKKyAgICByZXN1bHQgPDwgInRocmlmdF9zcGVjWyIgPDwgdGZpZWxkLT5nZXRfa2V5KCkgPDwgIl1bNF0iOworICB9IGVsc2UgeworICAgIHJlc3VsdCA8PCAibmlsIjsKKyAgfQorCisgIHJldHVybiByZXN1bHQuc3RyKCk7Cit9CisKKy8qKgorICogUmVuZGVycyBhIHN0cnVjdCBmaWVsZCBpbml0aWFsIHZhbHVlLgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkLCB3aGljaCBtdXN0IGhhdmUgYHRmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTGAKKyAqLworc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpyZW5kZXJfZmllbGRfaW5pdGlhbF92YWx1ZSh0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvcHRpb25hbF9maWVsZCkgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisKKyAgaWYgKG9wdGlvbmFsX2ZpZWxkKSB7CisgICAgLy8gVGhlIGNhbGxlciB3aWxsIG1ha2UgYSBzZWNvbmQgcGFzcyBmb3Igb3B0aW9uYWwgZmllbGRzLAorICAgIC8vIGFzc2lnbmluZyB0aGUgcmVzdWx0IG9mIHJlbmRlcl9jb25zdF92YWx1ZSB0byAiKmZpZWxkX25hbWUiLiBJdAorICAgIC8vIGlzIG1hZGRlbmluZyB0aGF0IEdvIHN5bnRheCBkb2VzIG5vdCBhbGxvdyBmb3IgYSB0eXBlLWFnbm9zdGljCisgICAgLy8gd2F5IHRvIGluaXRpYWxpemUgYSBwb2ludGVyIHRvIGEgY29uc3QgdmFsdWUsIGJ1dCBzbyBpdCBnb2VzLgorICAgIC8vIFRoZSBhbHRlcm5hdGl2ZSB3b3VsZCBiZSB0byB3cml0ZSB0eXBlIHNwZWNpZmljIGZ1bmN0aW9ucyB0aGF0CisgICAgLy8gY29udmVydCBmcm9tIGNvbnN0IHZhbHVlcyB0byBwb2ludGVyIHR5cGVzLCBidXQgZ2l2ZW4gdGhlIGxhY2sKKyAgICAvLyBvZiBvdmVybG9hZGluZyBpdCB3b3VsZCBiZSBtZXNzeS4KKyAgICByZXR1cm4gIm5ldygiICsgdHlwZV90b19nb190eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSkgKyAiKSI7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB0ZmllbGQtPmdldF92YWx1ZSgpLCBuYW1lKTsKKyAgfQorfQorCisvKioKKyAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4KSB7CisgIC8vIFRPRE8obWNzbGVlKTogTml0cGlja3ksIG5vICcsJyBpZiBhcmd1bWVudF9saXN0IGlzIGVtcHR5CisgIHJldHVybiBwdWJsaWNpemUocHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICIoIiArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKQorICAgICAgICAgKyAiKSI7Cit9CisKKy8qKgorICogUmVuZGVycyBhbiBpbnRlcmZhY2UgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3N0cmluZyB0X2dvX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlX2lmKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RyaW5nIHByZWZpeCwgYm9vbCBhZGRFcnJvcikgeworICBzdHJpbmcgc2lnbmF0dXJlID0gcHVibGljaXplKHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiKCI7CisgIHNpZ25hdHVyZSArPSAiY3R4IGNvbnRleHQuQ29udGV4dCI7CisgIGlmICghdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpLmVtcHR5KCkpIHsKKyAgICBzaWduYXR1cmUgKz0gIiwgIiArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKTsKKyAgfQorICBzaWduYXR1cmUgKz0gIikgKCI7CisKKyAgdF90eXBlKiByZXQgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7CisgIHRfc3RydWN0KiBleGNlcHRpb25zID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIHN0cmluZyBlcnJzID0gYXJndW1lbnRfbGlzdChleGNlcHRpb25zKTsKKworICBpZiAoIXJldC0+aXNfdm9pZCgpKSB7CisgICAgc2lnbmF0dXJlICs9ICJyICIgKyB0eXBlX3RvX2dvX3R5cGUocmV0KTsKKworICAgIGlmIChhZGRFcnJvciB8fCBlcnJzLnNpemUoKSA9PSAwKSB7CisgICAgICBzaWduYXR1cmUgKz0gIiwgIjsKKyAgICB9CisgIH0KKworICBpZiAoYWRkRXJyb3IpIHsKKyAgICBzaWduYXR1cmUgKz0gImVyciBlcnJvciI7CisgIH0KKworICBzaWduYXR1cmUgKz0gIikiOworICByZXR1cm4gc2lnbmF0dXJlOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmaWVsZCBsaXN0CisgKi8KK3N0cmluZyB0X2dvX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSAiLCAiOworICAgIH0KKworICAgIHJlc3VsdCArPSB2YXJpYWJsZV9uYW1lX3RvX2dvX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSArICIgIgorICAgICAgICAgICAgICArIHR5cGVfdG9fZ29fdHlwZSgoKmZfaXRlciktPmdldF90eXBlKCkpOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSkgeworICBzdHJpbmcgbW9kdWxlKCBtb2R1bGVfbmFtZSh0dHlwZSkpOworICBpZiggISBtb2R1bGUuZW1wdHkoKSkgeworICAgIHJldHVybiBtb2R1bGUgKyAiLiIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorCisgIHJldHVybiB0dHlwZS0+Z2V0X25hbWUoKTsKK30KKworc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjptb2R1bGVfbmFtZSh0X3R5cGUqIHR0eXBlKSB7CisgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOworCisgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgeworICAgIGlmIChwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJnbyIpLmVtcHR5KCkgfHwKKyAgICAgICAgcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoImdvIikuZW1wdHkoKSB8fAorICAgICAgICBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJnbyIpICE9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJnbyIpKSB7CisgICAgICBzdHJpbmcgbW9kdWxlKGdldF9yZWFsX2dvX21vZHVsZShwcm9ncmFtKSk7CisgICAgICAvLyBmb3IgbmFtZXNwYWNlZCBpbmNsdWRlcywgb25seSBrZWVwIHBhcnQgYWZ0ZXIgZG90LgorICAgICAgc2l6ZV90IGRvdCA9IG1vZHVsZS5yZmluZCgnLicpOworICAgICAgaWYgKGRvdCAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgbW9kdWxlID0gbW9kdWxlLnN1YnN0cihkb3QgKyAxKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBtb2R1bGU7CisgICAgfQorICB9CisKKyAgcmV0dXJuICIiOworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgZ28gdHlvZQorICovCitzdHJpbmcgdF9nb19nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworCisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgLyogdGhpcyBpcyB3cm9uZywgYmluYXJ5IGlzIHN0aWxsIGEgc3RyaW5nIHR5cGUgaW50ZXJuYWxseQorICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgcmV0dXJuICJ0aHJpZnQuQklOQVJZIjsKKyAgICAgIH0KKyAgICAgICovCisgICAgICByZXR1cm4gInRocmlmdC5TVFJJTkciOworCisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJ0aHJpZnQuQk9PTCI7CisKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJ0aHJpZnQuQllURSI7CisKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAidGhyaWZ0LkkxNiI7CisKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAidGhyaWZ0LkkzMiI7CisKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAidGhyaWZ0Lkk2NCI7CisKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAidGhyaWZ0LkRPVUJMRSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAidGhyaWZ0LkkzMiI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAidGhyaWZ0LlNUUlVDVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gInRocmlmdC5NQVAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJ0aHJpZnQuU0VUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gInRocmlmdC5MSVNUIjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworLyoqCisgKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIGdvIG1hcCB0eXBlLCB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiBpZiBpdCB3aWxsCisgKiBub3QgcHJvZHVjZSBhIHZhbGlkIGdvIG1hcCB0eXBlLgorICovCitzdHJpbmcgdF9nb19nZW5lcmF0b3I6OnR5cGVfdG9fZ29fa2V5X3R5cGUodF90eXBlKiB0eXBlKSB7CisgIHRfdHlwZSogcmVzb2x2ZWRfdHlwZSA9IHR5cGU7CisKKyAgd2hpbGUgKHJlc29sdmVkX3R5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHJlc29sdmVkX3R5cGUgPSAoKHRfdHlwZWRlZiopcmVzb2x2ZWRfdHlwZSktPmdldF90eXBlKCktPmdldF90cnVlX3R5cGUoKTsKKyAgfQorCisgIGlmIChyZXNvbHZlZF90eXBlLT5pc19tYXAoKSB8fCByZXNvbHZlZF90eXBlLT5pc19saXN0KCkgfHwgcmVzb2x2ZWRfdHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0aHJvdyAiQ2Fubm90IHByb2R1Y2UgYSB2YWxpZCB0eXBlIGZvciBhIEdvIG1hcCBrZXk6ICIgKyB0eXBlX3RvX2dvX3R5cGUodHlwZSkgKyAiIC0gYWJvcnRpbmcuIjsKKyAgfQorCisgIGlmIChyZXNvbHZlZF90eXBlLT5pc19iaW5hcnkoKSkKKyAgICByZXR1cm4gInN0cmluZyI7CisKKyAgcmV0dXJuIHR5cGVfdG9fZ29fdHlwZSh0eXBlKTsKK30KKworLyoqCisgKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIGdvIHR5cGUKKyAqLworc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjp0eXBlX3RvX2dvX3R5cGUodF90eXBlKiB0eXBlKSB7CisgIHJldHVybiB0eXBlX3RvX2dvX3R5cGVfd2l0aF9vcHQodHlwZSwgZmFsc2UpOworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgZ28gdHlwZSwgdGFraW5nIGludG8gYWNjb3VudCB3aGV0aGVyIHRoZSBmaWVsZAorICogYXNzb2NpYXRlZCB3aXRoIHRoZSB0eXBlIGlzIFRfT1BUSU9OQUwuCisgKi8KK3N0cmluZyB0X2dvX2dlbmVyYXRvcjo6dHlwZV90b19nb190eXBlX3dpdGhfb3B0KHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb3B0aW9uYWxfZmllbGQpIHsKKyAgc3RyaW5nIG1heWJlX3BvaW50ZXIob3B0aW9uYWxfZmllbGQgPyAiKiIgOiAiIik7CisKKyAgaWYgKHR5cGUtPmlzX3R5cGVkZWYoKSAmJiAoKHRfdHlwZWRlZiopdHlwZSktPmlzX2ZvcndhcmRfdHlwZWRlZigpKSB7CisgICAgdHlwZSA9ICgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3RydWVfdHlwZSgpOworICB9CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworCisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICIiOworCisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgcmV0dXJuIG1heWJlX3BvaW50ZXIgKyAiW11ieXRlIjsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIG1heWJlX3BvaW50ZXIgKyAic3RyaW5nIjsKKworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiBtYXliZV9wb2ludGVyICsgImJvb2wiOworCisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiBtYXliZV9wb2ludGVyICsgImludDgiOworCisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gbWF5YmVfcG9pbnRlciArICJpbnQxNiI7CisKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiBtYXliZV9wb2ludGVyICsgImludDMyIjsKKworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuIG1heWJlX3BvaW50ZXIgKyAiaW50NjQiOworCisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gbWF5YmVfcG9pbnRlciArICJmbG9hdDY0IjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuIG1heWJlX3BvaW50ZXIgKyBwdWJsaWNpemUodHlwZV9uYW1lKHR5cGUpKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICIqIiArIHB1YmxpY2l6ZSh0eXBlX25hbWUodHlwZSkpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF9tYXAqIHQgPSAodF9tYXAqKXR5cGU7CisgICAgc3RyaW5nIGtleVR5cGUgPSB0eXBlX3RvX2dvX2tleV90eXBlKHQtPmdldF9rZXlfdHlwZSgpKTsKKyAgICBzdHJpbmcgdmFsdWVUeXBlID0gdHlwZV90b19nb190eXBlKHQtPmdldF92YWxfdHlwZSgpKTsKKyAgICByZXR1cm4gbWF5YmVfcG9pbnRlciArIHN0cmluZygibWFwWyIpICsga2V5VHlwZSArICJdIiArIHZhbHVlVHlwZTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHRfc2V0KiB0ID0gKHRfc2V0Kil0eXBlOworICAgIHN0cmluZyBlbGVtVHlwZSA9IHR5cGVfdG9fZ29fdHlwZSh0LT5nZXRfZWxlbV90eXBlKCkpOworICAgIHJldHVybiBtYXliZV9wb2ludGVyICsgc3RyaW5nKCJbXSIpICsgZWxlbVR5cGU7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgdF9saXN0KiB0ID0gKHRfbGlzdCopdHlwZTsKKyAgICBzdHJpbmcgZWxlbVR5cGUgPSB0eXBlX3RvX2dvX3R5cGUodC0+Z2V0X2VsZW1fdHlwZSgpKTsKKyAgICByZXR1cm4gbWF5YmVfcG9pbnRlciArIHN0cmluZygiW10iKSArIGVsZW1UeXBlOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHJldHVybiBtYXliZV9wb2ludGVyICsgcHVibGljaXplKHR5cGVfbmFtZSh0eXBlKSk7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZ29fdHlwZTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKKy8qKiBTZWUgdGhlIGNvbW1lbnQgaW5zaWRlIGdlbmVyYXRlX2dvX3N0cnVjdF9kZWZpbml0aW9uIGZvciB3aGF0IHRoaXMgaXMuICovCitzdHJpbmcgdF9nb19nZW5lcmF0b3I6OnR5cGVfdG9fc3BlY19hcmdzKHRfdHlwZSogdHR5cGUpIHsKKyAgd2hpbGUgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICB0dHlwZSA9ICgodF90eXBlZGVmKil0dHlwZSktPmdldF90eXBlKCk7CisgIH0KKworICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIm5pbCI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICIoIiArIHR5cGVfbmFtZSh0dHlwZSkgKyAiLCAiICsgdHlwZV9uYW1lKHR0eXBlKSArICIudGhyaWZ0X3NwZWMpIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIigiICsgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpICsgIiwiCisgICAgICAgICAgICsgdHlwZV90b19zcGVjX2FyZ3MoKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgKyAiLCIKKyAgICAgICAgICAgKyB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgKyAiLCIKKyAgICAgICAgICAgKyB0eXBlX3RvX3NwZWNfYXJncygoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSArICIpIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIigiICsgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSArICIsIgorICAgICAgICAgICArIHR5cGVfdG9fc3BlY19hcmdzKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSArICIpIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICIoIiArIHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpICsgIiwiCisgICAgICAgICAgICsgdHlwZV90b19zcGVjX2FyZ3MoKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSArICIpIjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19zcGVjX2FyZ3M6ICIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKK30KKworYm9vbCBmb3JtYXRfZ29fb3V0cHV0KGNvbnN0IHN0cmluZyYgZmlsZV9wYXRoKSB7CisKKyAgLy8gZm9ybWF0dGluZyB2aWEgZ29mbXQgZGVhY3RpdmF0ZWQgZHVlIHRvIFRIUklGVC0zODkzCisgIC8vIFBsZWFzZSBsb29rIGF0IHRoZSB0aWNrZXQgYW5kIG1ha2Ugc3VyZSB5b3UgZnVsbHkgdW5kZXJzdGFuZCBhbGwgdGhlIGltcGxpY2F0aW9ucworICAvLyBiZWZvcmUgc3VibWl0dGluZyBhIHBhdGNoIHRoYXQgZW5hYmxlcyB0aGlzIGZlYXR1cmUgYWdhaW4uIFRoYW5rIHlvdS4KKyAgKHZvaWQpIGZpbGVfcGF0aDsKKyAgcmV0dXJuIGZhbHNlOworCisgIC8qCisgIGNvbnN0IHN0cmluZyBjb21tYW5kID0gImdvZm10IC13ICIgKyBmaWxlX3BhdGg7CisKKyAgaWYgKHN5c3RlbShjb21tYW5kLmNfc3RyKCkpID09IDApIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGZwcmludGYoc3RkZXJyLCAiV0FSTklORyAtIFJ1bm5pbmcgJyVzJyBmYWlsZWQuXG4iLCBjb21tYW5kLmNfc3RyKCkpOworICByZXR1cm4gZmFsc2U7CisgICovCisgfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKGdvLCAiR28iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIHBhY2thZ2VfcHJlZml4PSAgUGFja2FnZSBwcmVmaXggZm9yIGdlbmVyYXRlZCBmaWxlcy5cbiIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIHRocmlmdF9pbXBvcnQ9ICAgT3ZlcnJpZGUgdGhyaWZ0IHBhY2thZ2UgaW1wb3J0IHBhdGggKGRlZmF1bHQ6IiArIERFRkFVTFRfVEhSSUZUX0lNUE9SVCArICIpXG4iIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBwYWNrYWdlPSAgICAgICAgIFBhY2thZ2UgbmFtZSAoZGVmYXVsdDogaW5mZXJyZWQgZnJvbSB0aHJpZnQgZmlsZSBuYW1lKVxuIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgaWdub3JlX2luaXRpYWxpc21zXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICBEaXNhYmxlIGF1dG9tYXRpYyBzcGVsbGluZyBjb3JyZWN0aW9uIG9mIGluaXRpYWxpc21zIChlLmcuIFwiVVJMXCIpXG4iIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICByZWFkX3dyaXRlX3ByaXZhdGVcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgIE1ha2UgcmVhZC93cml0ZSBtZXRob2RzIHByaXZhdGUsIGRlZmF1bHQgaXMgcHVibGljIFJlYWQvV3JpdGVcbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2d2X2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ3ZfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmODMwMWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2d2X2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDM0NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxsaXN0PgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b2ZzdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnBhaXI7Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworLyoqCisgKiBHcmFwaHZpeiBjb2RlIGdlbmVyYXRvcgorICovCitjbGFzcyB0X2d2X2dlbmVyYXRvciA6IHB1YmxpYyB0X2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfZ3ZfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIGV4Y2VwdGlvbl9hcnJvd3MgPSBmYWxzZTsKKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJleGNlcHRpb25zIikgPT0gMCkgeworICAgICAgICBleGNlcHRpb25fYXJyb3dzID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBndjoiICsgaXRlci0+Zmlyc3Q7CisgICAgICB9CisgICAgfQorCisgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tZ3YiOworICB9CisKKyAgLyoqCisgICAqIEluaXQgYW5kIGVuZCBvZiBnZW5lcmF0b3IKKyAgICovCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICAvKioKKyAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKK3Byb3RlY3RlZDoKKyAgLyoqCisgICAqIEhlbHBlcnMKKyAgICovCisgIHZvaWQgcHJpbnRfdHlwZSh0X3R5cGUqIHR0eXBlLCBzdHJpbmcgc3RydWN0X2ZpZWxkX3JlZik7CisgIHZvaWQgcHJpbnRfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB0dmFsdWUpOworCitwcml2YXRlOgorICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfb3V0XzsKKyAgc3RkOjpsaXN0PHN0cmluZz4gZWRnZXM7CisgIGJvb2wgZXhjZXB0aW9uX2Fycm93czsKK307CisKKy8qKgorICogSW5pdCBnZW5lcmF0b3I6CisgKiAtIEFkZHMgc29tZSBlc2NhcGluZyBmb3IgdGhlIEdyYXBodml6IGRvbWFpbi4KKyAqIC0gQ3JlYXRlIG91dHB1dCBkaXJlY3RvcnkgYW5kIG9wZW4gZmlsZSBmb3Igd3JpdHRpbmcuCisgKiAtIFdyaXRlIHRoZSBmaWxlIGhlYWRlci4KKyAqLwordm9pZCB0X2d2X2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7CisgIGVzY2FwZV9bJ3snXSA9ICJcXHsiOworICBlc2NhcGVfWyd9J10gPSAiXFx9IjsKKworICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKKyAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKKyAgc3RyaW5nIGZuYW1lID0gZ2V0X291dF9kaXIoKSArIHByb2dyYW1fLT5nZXRfbmFtZSgpICsgIi5ndiI7CisgIGZfb3V0Xy5vcGVuKGZuYW1lLmNfc3RyKCkpOworICBmX291dF8gPDwgImRpZ3JhcGggXCIiIDw8IGVzY2FwZV9zdHJpbmcocHJvZ3JhbV9uYW1lXykgPDwgIlwiIHsiIDw8IGVuZGw7CisgIGZfb3V0XyA8PCAibm9kZSBbc3R5bGU9ZmlsbGVkLCBzaGFwZT1yZWNvcmRdOyIgPDwgZW5kbDsKKyAgZl9vdXRfIDw8ICJlZGdlIFthcnJvd3NpemU9MC41XTsiIDw8IGVuZGw7CisgIGZfb3V0XyA8PCAicmFua2Rpcj1MUiIgPDwgZW5kbDsKK30KKworLyoqCisgKiBDbG9zZXMgZ2VuZXJhdG9yOgorICogLSBQcmludCBhY2N1bXVsYXRlZCBub2RlcyBjb25uZWN0aW9ucy4KKyAqIC0gUHJpbnQgZm9vdG5vdGUuCisgKiAtIENsb3NlcyBmaWxlLgorICovCit2b2lkIHRfZ3ZfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7CisgIC8vIFByaW50IGVkZ2VzCisgIHN0ZDo6bGlzdDxzdHJpbmc+OjppdGVyYXRvciBpdGVyID0gZWRnZXMuYmVnaW4oKTsKKyAgZm9yICg7IGl0ZXIgIT0gZWRnZXMuZW5kKCk7IGl0ZXIrKykgeworICAgIGZfb3V0XyA8PCAoKml0ZXIpIDw8IGVuZGw7CisgIH0KKworICAvLyBQcmludCBncmFwaCBlbmQgfSBhbmQgY2xvc2UgZmlsZQorICBmX291dF8gPDwgIn0iIDw8IGVuZGw7CisgIGZfb3V0Xy5jbG9zZSgpOworfQorCit2b2lkIHRfZ3ZfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgc3RyaW5nIG5hbWUgPSB0dHlwZWRlZi0+Z2V0X25hbWUoKTsKKyAgZl9vdXRfIDw8ICJub2RlIFtmaWxsY29sb3I9YXp1cmVdOyIgPDwgZW5kbDsKKyAgZl9vdXRfIDw8IG5hbWUgPDwgIiBbbGFiZWw9XCIiOworCisgIGZfb3V0XyA8PCBlc2NhcGVfc3RyaW5nKG5hbWUpOworICBmX291dF8gPDwgIiA6OiAiOworICBwcmludF90eXBlKHR0eXBlZGVmLT5nZXRfdHlwZSgpLCBuYW1lKTsKKworICBmX291dF8gPDwgIlwiXTsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9ndl9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICBzdHJpbmcgbmFtZSA9IHRlbnVtLT5nZXRfbmFtZSgpOworICBmX291dF8gPDwgIm5vZGUgW2ZpbGxjb2xvcj13aGl0ZV07IiA8PCBlbmRsOworICBmX291dF8gPDwgbmFtZSA8PCAiIFtsYWJlbD1cImVudW0gIiA8PCBlc2NhcGVfc3RyaW5nKG5hbWUpOworCisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiB2YWx1ZXMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIHZhbF9pdGVyOworICBmb3IgKHZhbF9pdGVyID0gdmFsdWVzLmJlZ2luKCk7IHZhbF9pdGVyICE9IHZhbHVlcy5lbmQoKTsgKyt2YWxfaXRlcikgeworICAgIGZfb3V0XyA8PCAnfCcgPDwgKCp2YWxfaXRlciktPmdldF9uYW1lKCk7CisgICAgZl9vdXRfIDw8ICIgPSAiOworICAgIGZfb3V0XyA8PCAoKnZhbF9pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgIH0KKworICBmX291dF8gPDwgIlwiXTsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9ndl9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgeworICBzdHJpbmcgbmFtZSA9IHRjb25zdC0+Z2V0X25hbWUoKTsKKworICBmX291dF8gPDwgIm5vZGUgW2ZpbGxjb2xvcj1hbGljZWJsdWVdOyIgPDwgZW5kbDsKKyAgZl9vdXRfIDw8ICJjb25zdF8iIDw8IG5hbWUgPDwgIiBbbGFiZWw9XCIiOworCisgIGZfb3V0XyA8PCBlc2NhcGVfc3RyaW5nKG5hbWUpOworICBmX291dF8gPDwgIiA9ICI7CisgIHByaW50X2NvbnN0X3ZhbHVlKHRjb25zdC0+Z2V0X3R5cGUoKSwgdGNvbnN0LT5nZXRfdmFsdWUoKSk7CisgIGZfb3V0XyA8PCAiIDo6ICI7CisgIHByaW50X3R5cGUodGNvbnN0LT5nZXRfdHlwZSgpLCAiY29uc3RfIiArIG5hbWUpOworCisgIGZfb3V0XyA8PCAiXCJdOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2d2X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKworICBpZiAodHN0cnVjdC0+aXNfeGNlcHRpb24oKSkgeworICAgIGZfb3V0XyA8PCAibm9kZSBbZmlsbGNvbG9yPWxpZ2h0cGlua107IiA8PCBlbmRsOworICAgIGZfb3V0XyA8PCBuYW1lIDw8ICIgW2xhYmVsPVwiIjsKKyAgICBmX291dF8gPDwgImV4Y2VwdGlvbiAiIDw8IGVzY2FwZV9zdHJpbmcobmFtZSk7CisgIH0gZWxzZSBpZiAodHN0cnVjdC0+aXNfdW5pb24oKSkgeworICAgIGZfb3V0XyA8PCAibm9kZSBbZmlsbGNvbG9yPWxpZ2h0Y3lhbl07IiA8PCBlbmRsOworICAgIGZfb3V0XyA8PCBuYW1lIDw8ICIgW2xhYmVsPVwiIjsKKyAgICBmX291dF8gPDwgInVuaW9uICIgPDwgZXNjYXBlX3N0cmluZyhuYW1lKTsKKyAgfSBlbHNlIHsKKyAgICBmX291dF8gPDwgIm5vZGUgW2ZpbGxjb2xvcj1iZWlnZV07IiA8PCBlbmRsOworICAgIGZfb3V0XyA8PCBuYW1lIDw8ICIgW2xhYmVsPVwiIjsKKyAgICBmX291dF8gPDwgInN0cnVjdCAiIDw8IGVzY2FwZV9zdHJpbmcobmFtZSk7CisgIH0KKworICB2ZWN0b3I8dF9maWVsZCo+IG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+OjppdGVyYXRvciBtZW1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsKKyAgZm9yICg7IG1lbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7IG1lbV9pdGVyKyspIHsKKyAgICBzdHJpbmcgZmllbGRfbmFtZSA9ICgqbWVtX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgLy8gcHJpbnQgcG9ydCAoYW5jaG9yIHJlZmVyZW5jZSkKKyAgICBmX291dF8gPDwgInw8ZmllbGRfIiA8PCBmaWVsZF9uYW1lIDw8ICc+JzsKKworICAgIC8vIGZpZWxkIG5hbWUgOjogZmllbGQgdHlwZQorICAgIGZfb3V0XyA8PCAoKm1lbV9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBmX291dF8gPDwgIiA6OiAiOworICAgIHByaW50X3R5cGUoKCptZW1faXRlciktPmdldF90eXBlKCksIG5hbWUgKyAiOmZpZWxkXyIgKyBmaWVsZF9uYW1lKTsKKyAgfQorCisgIGZfb3V0XyA8PCAiXCJdOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2d2X2dlbmVyYXRvcjo6cHJpbnRfdHlwZSh0X3R5cGUqIHR0eXBlLCBzdHJpbmcgc3RydWN0X2ZpZWxkX3JlZikgeworICBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGZfb3V0XyA8PCAibGlzdFxcPCI7CisgICAgICBwcmludF90eXBlKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSwgc3RydWN0X2ZpZWxkX3JlZik7CisgICAgICBmX291dF8gPDwgIlxcPiI7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIGZfb3V0XyA8PCAic2V0XFw8IjsKKyAgICAgIHByaW50X3R5cGUoKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCksIHN0cnVjdF9maWVsZF9yZWYpOworICAgICAgZl9vdXRfIDw8ICJcXD4iOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgICBmX291dF8gPDwgIm1hcFxcPCI7CisgICAgICBwcmludF90eXBlKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCksIHN0cnVjdF9maWVsZF9yZWYpOworICAgICAgZl9vdXRfIDw8ICIsICI7CisgICAgICBwcmludF90eXBlKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCksIHN0cnVjdF9maWVsZF9yZWYpOworICAgICAgZl9vdXRfIDw8ICJcXD4iOworICAgIH0KKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBmX291dF8gPDwgKHR0eXBlLT5pc19iaW5hcnkoKSA/ICJiaW5hcnkiIDogdHR5cGUtPmdldF9uYW1lKCkpOworICB9IGVsc2UgeworICAgIGZfb3V0XyA8PCB0dHlwZS0+Z2V0X25hbWUoKTsKKyAgICBlZGdlcy5wdXNoX2JhY2soc3RydWN0X2ZpZWxkX3JlZiArICIgLT4gIiArIHR0eXBlLT5nZXRfbmFtZSgpKTsKKyAgfQorfQorCisvKioKKyAqIFByaW50cyBvdXQgYW4gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwcm92aWRlZCBjb25zdGFudCB2YWx1ZQorICovCit2b2lkIHRfZ3ZfZ2VuZXJhdG9yOjpwcmludF9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHR2YWx1ZSkgeworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgc3dpdGNoICh0dmFsdWUtPmdldF90eXBlKCkpIHsKKyAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSOgorICAgIGZfb3V0XyA8PCB0dmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgYnJlYWs7CisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfRE9VQkxFOgorICAgIGZfb3V0XyA8PCB0dmFsdWUtPmdldF9kb3VibGUoKTsKKyAgICBicmVhazsKKyAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9TVFJJTkc6CisgICAgZl9vdXRfIDw8ICJcXFwiIiA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodHZhbHVlKSA8PCAiXFxcIiI7CisgICAgYnJlYWs7CisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfTUFQOiB7CisgICAgZl9vdXRfIDw8ICJcXHsgIjsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiBtYXBfZWxlbXMgPSB0dmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6aXRlcmF0b3IgbWFwX2l0ZXI7CisgICAgZm9yIChtYXBfaXRlciA9IG1hcF9lbGVtcy5iZWdpbigpOyBtYXBfaXRlciAhPSBtYXBfZWxlbXMuZW5kKCk7IG1hcF9pdGVyKyspIHsKKyAgICAgIGlmICghZmlyc3QpIHsKKyAgICAgICAgZl9vdXRfIDw8ICIsICI7CisgICAgICB9CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgcHJpbnRfY29uc3RfdmFsdWUoKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpLCBtYXBfaXRlci0+Zmlyc3QpOworICAgICAgZl9vdXRfIDw8ICIgPSAiOworICAgICAgcHJpbnRfY29uc3RfdmFsdWUoKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpLCBtYXBfaXRlci0+c2Vjb25kKTsKKyAgICB9CisgICAgZl9vdXRfIDw8ICIgXFx9IjsKKyAgfSBicmVhazsKKyAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9MSVNUOiB7CisgICAgZl9vdXRfIDw8ICJcXHsgIjsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+IGxpc3RfZWxlbXMgPSB0dmFsdWUtPmdldF9saXN0KCk7CisgICAgOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46Oml0ZXJhdG9yIGxpc3RfaXRlcjsKKyAgICBmb3IgKGxpc3RfaXRlciA9IGxpc3RfZWxlbXMuYmVnaW4oKTsgbGlzdF9pdGVyICE9IGxpc3RfZWxlbXMuZW5kKCk7IGxpc3RfaXRlcisrKSB7CisgICAgICBpZiAoIWZpcnN0KSB7CisgICAgICAgIGZfb3V0XyA8PCAiLCAiOworICAgICAgfQorICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgICAgcHJpbnRfY29uc3RfdmFsdWUoKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCksICpsaXN0X2l0ZXIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRfY29uc3RfdmFsdWUoKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKSwgKmxpc3RfaXRlcik7CisgICAgICB9CisgICAgfQorICAgIGZfb3V0XyA8PCAiIFxcfSI7CisgIH0gYnJlYWs7CisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfSURFTlRJRklFUjoKKyAgICBmX291dF8gPDwgZXNjYXBlX3N0cmluZyh0eXBlLT5nZXRfbmFtZSgpKSA8PCAiLiIKKyAgICAgICAgICAgPDwgZXNjYXBlX3N0cmluZyh0dmFsdWUtPmdldF9pZGVudGlmaWVyX25hbWUoKSk7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgZl9vdXRfIDw8ICJVTktOT1dOIjsKKyAgICBicmVhazsKKyAgfQorfQorCit2b2lkIHRfZ3ZfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIHNlcnZpY2VfbmFtZSA9IGdldF9zZXJ2aWNlX25hbWUodHNlcnZpY2UpOworICBmX291dF8gPDwgInN1YmdyYXBoIGNsdXN0ZXJfIiA8PCBzZXJ2aWNlX25hbWUgPDwgIiB7IiA8PCBlbmRsOworICBmX291dF8gPDwgIm5vZGUgW2ZpbGxjb2xvcj1iaXNxdWVdOyIgPDwgZW5kbDsKKyAgZl9vdXRfIDw8ICJzdHlsZT1kYXNoZWQ7IiA8PCBlbmRsOworICBmX291dF8gPDwgImxhYmVsID0gXCIiIDw8IGVzY2FwZV9zdHJpbmcoc2VydmljZV9uYW1lKSA8PCAiIHNlcnZpY2VcIjsiIDw8IGVuZGw7CisKKyAgLy8gVE9ETzogc2VydmljZSBleHRlbmRzCisKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmbl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7CisgIGZvciAoOyBmbl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgZm5faXRlcisrKSB7CisgICAgc3RyaW5nIGZuX25hbWUgPSAoKmZuX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgZl9vdXRfIDw8ICJmdW5jdGlvbl8iIDw8IHNlcnZpY2VfbmFtZSA8PCBmbl9uYW1lOworICAgIGZfb3V0XyA8PCAiW2xhYmVsPVwiPHJldHVybl90eXBlPmZ1bmN0aW9uICIgPDwgZXNjYXBlX3N0cmluZyhmbl9uYW1lKTsKKyAgICBmX291dF8gPDwgIiA6OiAiOworICAgIHByaW50X3R5cGUoKCpmbl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwgImZ1bmN0aW9uXyIgKyBzZXJ2aWNlX25hbWUgKyBmbl9uYW1lICsgIjpyZXR1cm5fdHlwZSIpOworCisgICAgdmVjdG9yPHRfZmllbGQqPiBhcmdzID0gKCpmbl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+OjppdGVyYXRvciBhcmdfaXRlciA9IGFyZ3MuYmVnaW4oKTsKKyAgICBmb3IgKDsgYXJnX2l0ZXIgIT0gYXJncy5lbmQoKTsgYXJnX2l0ZXIrKykgeworICAgICAgZl9vdXRfIDw8ICJ8PHBhcmFtXyIgPDwgKCphcmdfaXRlciktPmdldF9uYW1lKCkgPDwgIj4iOworICAgICAgZl9vdXRfIDw8ICgqYXJnX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgaWYgKCgqYXJnX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7CisgICAgICAgIGZfb3V0XyA8PCAiID0gIjsKKyAgICAgICAgcHJpbnRfY29uc3RfdmFsdWUoKCphcmdfaXRlciktPmdldF90eXBlKCksICgqYXJnX2l0ZXIpLT5nZXRfdmFsdWUoKSk7CisgICAgICB9CisgICAgICBmX291dF8gPDwgIiA6OiAiOworICAgICAgcHJpbnRfdHlwZSgoKmFyZ19pdGVyKS0+Z2V0X3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgImZ1bmN0aW9uXyIgKyBzZXJ2aWNlX25hbWUgKyBmbl9uYW1lICsgIjpwYXJhbV8iICsgKCphcmdfaXRlciktPmdldF9uYW1lKCkpOworICAgIH0KKyAgICAvLyBlbmQgb2Ygbm9kZQorICAgIGZfb3V0XyA8PCAiXCJdOyIgPDwgZW5kbDsKKworICAgIC8vIEV4Y2VwdGlvbiBlZGdlcworICAgIGlmIChleGNlcHRpb25fYXJyb3dzKSB7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+IGV4Y2VwdHMgPSAoKmZuX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCk7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+OjppdGVyYXRvciBleF9pdGVyID0gZXhjZXB0cy5iZWdpbigpOworICAgICAgZm9yICg7IGV4X2l0ZXIgIT0gZXhjZXB0cy5lbmQoKTsgZXhfaXRlcisrKSB7CisgICAgICAgIGVkZ2VzLnB1c2hfYmFjaygiZnVuY3Rpb25fIiArIHNlcnZpY2VfbmFtZSArIGZuX25hbWUgKyAiIC0+ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgKCpleF9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSArICIgW2NvbG9yPXJlZF0iKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBmX291dF8gPDwgIiB9IiA8PCBlbmRsOworfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAorICAgIGd2LAorICAgICJHcmFwaHZpeiIsCisgICAgIiAgICBleGNlcHRpb25zOiAgICAgIFdoZXRoZXIgdG8gZHJhdyBhcnJvd3MgZnJvbSBmdW5jdGlvbnMgdG8gZXhjZXB0aW9uLlxuIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfaGF4ZV9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2hheGVfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiODhjNGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2hheGVfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsMjk4MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8Y2N0eXBlPgorCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzdGRleGNlcHQ+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKKy8qKgorICogSGF4ZSBjb2RlIGdlbmVyYXRvci4KKyAqCisgKi8KK2NsYXNzIHRfaGF4ZV9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9oYXhlX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIGNhbGxiYWNrc18gPSBmYWxzZTsKKyAgICBydHRpXyA9IGZhbHNlOworICAgIGJ1aWxkbWFjcm9fID0gIiI7CisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiY2FsbGJhY2tzIikgPT0gMCkgeworICAgICAgICBjYWxsYmFja3NfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgicnR0aSIpID09IDApIHsKKyAgICAgICAgcnR0aV8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJidWlsZG1hY3JvIikgPT0gMCkgeworICAgICAgICBidWlsZG1hY3JvXyA9IChpdGVyLT5zZWNvbmQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIGhheGU6IiArIGl0ZXItPmZpcnN0OworICAgICAgfQorICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWhheGUiOworICB9CisKKyAgLyoqCisgICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKKyAgICovCisKKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworCisgIHZvaWQgZ2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICB2b2lkIHByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fc3RhdGljLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVmdmFsID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKworICAvKioKKyAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX2hheGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbiwgYm9vbCBpc19yZXN1bHQgPSBmYWxzZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9oYXhlX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCA9IGZhbHNlKTsKKyAgLy8gcmVtb3ZlZCAtLSBlcXVhbGl0eSxjb21wYXJlX3RvCisgIHZvaWQgZ2VuZXJhdGVfaGF4ZV9zdHJ1Y3RfcmVhZGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfaGF4ZV92YWxpZGF0b3Ioc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9oYXhlX3N0cnVjdF9yZXN1bHRfd3JpdGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfaGF4ZV9zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfaGF4ZV9zdHJ1Y3RfdG9zdHJpbmcoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9oYXhlX21ldGFfZGF0YV9tYXAoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSk7CisgIHN0ZDo6c3RyaW5nIGdldF9oYXhlX3R5cGVfc3RyaW5nKHRfdHlwZSogdHlwZSk7CisgIHZvaWQgZ2VuZXJhdGVfcmVmbGVjdGlvbl9zZXR0ZXJzKHN0ZDo6b3N0cmluZ3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lKTsKKyAgdm9pZCBnZW5lcmF0ZV9yZWZsZWN0aW9uX2dldHRlcnMoc3RkOjpvc3RyaW5nc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUpOworICB2b2lkIGdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZ2VuZXJpY19pc3NldF9tZXRob2Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9wZXJ0eV9nZXR0ZXJzX3NldHRlcnMoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgc3RkOjpzdHJpbmcgZ2V0X2NhcF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpOworICBzdGQ6OnN0cmluZyBnZW5lcmF0ZV9pc3NldF9jaGVjayh0X2ZpZWxkKiBmaWVsZCk7CisgIHN0ZDo6c3RyaW5nIGdlbmVyYXRlX2lzc2V0X2NoZWNrKHN0ZDo6c3RyaW5nIGZpZWxkKTsKKyAgdm9pZCBnZW5lcmF0ZV9pc3NldF9zZXQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCk7CisgIC8vIHJlbW92ZWQgc3RkOjpzdHJpbmcgaXNzZXRfZmllbGRfaWQodF9maWVsZCogZmllbGQpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX21ldGhvZF9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBib29sIGlzX2ludGVyZmFjZSk7CisKKyAgLyoqCisgICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0ZDo6c3RyaW5nIGl0ZXIpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1hcCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9oYXhlX2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpOworICB2b2lkIGdlbmVyYXRlX2hheGVfZG9jKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZG9jKTsKKworICB2b2lkIGdlbmVyYXRlX3J0dGlfZGVjb3JhdGlvbihzdGQ6Om9zdHJlYW0mIG91dCk7CisgIHZvaWQgZ2VuZXJhdGVfbWFjcm9fZGVjb3JhdGlvbihzdGQ6Om9zdHJlYW0mIG91dCk7CisKKyAgLyoqCisgICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCisgICAqLworCisgIHN0ZDo6c3RyaW5nIGhheGVfcGFja2FnZSgpOworICBzdGQ6OnN0cmluZyBoYXhlX3R5cGVfaW1wb3J0cygpOworICBzdGQ6OnN0cmluZyBoYXhlX3RocmlmdF9pbXBvcnRzKCk7CisgIHN0ZDo6c3RyaW5nIGhheGVfdGhyaWZ0X2dlbl9pbXBvcnRzKHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcmIGltcG9ydHMpOworICBzdGQ6OnN0cmluZyBoYXhlX3RocmlmdF9nZW5faW1wb3J0cyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgaW5fY29udGFpbmVyID0gZmFsc2UsIGJvb2wgaW5faW5pdCA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgYmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHRiYXNlLCBib29sIGluX2NvbnRhaW5lciA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlX2NhbGxiYWNrKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZV9ub3JtYWwodF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgZ2V0X2VudW1fY2xhc3NfbmFtZSh0X3R5cGUqIHR5cGUpOworICBzdHJpbmcgZ2VuZXJhdGVfc2VydmljZV9tZXRob2Rfb25zdWNjZXNzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgYm9vbCBhc190eXBlLCBib29sIG9taXRfbmFtZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9tZXRob2Rfc2lnbmF0dXJlX2NhbGxiYWNrKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgYm9vbCBpc19pbnRlcmZhY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfbWV0aG9kX3NpZ25hdHVyZV9ub3JtYWwodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBib29sIGlzX2ludGVyZmFjZSk7CisKKyAgYm9vbCB0eXBlX2Nhbl9iZV9udWxsKHRfdHlwZSogdHR5cGUpIHsKKyAgICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworCisgICAgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSB8fCB0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkgfHwgdHR5cGUtPmlzX3N0cmluZygpKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIC8vIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OiAgLSBJbnQ2NCBpcyBub3QgcmVhbGx5IG51bGxhYmxlLCBldmVuIHRob3VnaCBpdCBiZWhhdmVkIHRoYXQKKyAgICAgICAgLy8gd2F5IGJlZm9yZSBIYXhlIDMuMi4wCisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIGNvbnN0YW50X25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7CisKK3ByaXZhdGU6CisgIGJvb2wgY2FsbGJhY2tzXzsKKyAgYm9vbCBydHRpXzsKKyAgc3RyaW5nIGJ1aWxkbWFjcm9fOworCisgIC8qKgorICAgKiBGaWxlIHN0cmVhbXMKKyAgICovCisKKyAgc3RkOjpzdHJpbmcgcGFja2FnZV9uYW1lXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2VfOworICBzdGQ6OnN0cmluZyBwYWNrYWdlX2Rpcl87Cit9OworCisvKioKKyAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0CisgKiBzdHJlYW1zLgorICoKKyAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKKyAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKKyAgcGFja2FnZV9uYW1lXyA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJoYXhlIik7CisKKyAgLy8gSGF4ZSBwYWNrYWdlIG5hbWVzIGFyZSBsb3dlcmNhc2UKKyAgaWYgKHBhY2thZ2VfbmFtZV8ubGVuZ3RoKCkgPiAwKSB7CisgICAgcGFja2FnZV9uYW1lX1swXSA9IHRvbG93ZXIocGFja2FnZV9uYW1lX1swXSk7CisgICAgc2l6ZV90IGluZGV4ID0gcGFja2FnZV9uYW1lXy5maW5kKCcuJyk7CisgICAgd2hpbGUgKGluZGV4ICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICBpZiAoKytpbmRleCA8IHBhY2thZ2VfbmFtZV8ubGVuZ3RoKCkpIHsKKyAgICAgICAgcGFja2FnZV9uYW1lX1tpbmRleF0gPSB0b2xvd2VyKHBhY2thZ2VfbmFtZV9baW5kZXhdKTsKKyAgICAgIH0KKyAgICAgIGluZGV4ID0gcGFja2FnZV9uYW1lXy5maW5kKCcuJywgaW5kZXgpOworICAgIH0KKyAgfQorCisgIHN0cmluZyBkaXIgPSBwYWNrYWdlX25hbWVfOworICBzdHJpbmcgc3ViZGlyID0gZ2V0X291dF9kaXIoKTsKKyAgc3RyaW5nOjpzaXplX3R5cGUgbG9jOworICB3aGlsZSAoKGxvYyA9IGRpci5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykgeworICAgIHN1YmRpciA9IHN1YmRpciArICIvIiArIGRpci5zdWJzdHIoMCwgbG9jKTsKKyAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7CisgICAgZGlyID0gZGlyLnN1YnN0cihsb2MgKyAxKTsKKyAgfQorICBpZiAoZGlyLnNpemUoKSA+IDApIHsKKyAgICBzdWJkaXIgPSBzdWJkaXIgKyAiLyIgKyBkaXI7CisgICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOworICB9CisKKyAgcGFja2FnZV9kaXJfID0gc3ViZGlyOworfQorCisvKioKKyAqIFBhY2thZ2VzIHRoZSBnZW5lcmF0ZWQgZmlsZQorICoKKyAqIEByZXR1cm4gU3RyaW5nIG9mIHRoZSBwYWNrYWdlLCBpLmUuICJwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0ZGVtbzsiCisgKi8KK3N0cmluZyB0X2hheGVfZ2VuZXJhdG9yOjpoYXhlX3BhY2thZ2UoKSB7CisgIGlmICghcGFja2FnZV9uYW1lXy5lbXB0eSgpKSB7CisgICAgcmV0dXJuIHN0cmluZygicGFja2FnZSAiKSArIHBhY2thZ2VfbmFtZV87CisgIH0KKyAgcmV0dXJuICJwYWNrYWdlIjsKK30KKworLyoqCisgKiBQcmludHMgc3RhbmRhcmQgaGF4ZSBpbXBvcnRzCisgKgorICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgZm9yIGhheGUgdHlwZXMgdGhhdCBhcmUgdXNlZCBpbiBoZXJlCisgKi8KK3N0cmluZyB0X2hheGVfZ2VuZXJhdG9yOjpoYXhlX3R5cGVfaW1wb3J0cygpIHsKKyAgcmV0dXJuIHN0cmluZygpICsgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5oZWxwZXIuKjtcbiIgKyAiaW1wb3J0IGhheGUuaW8uQnl0ZXM7XG4iCisgICAgICAgICArICJpbXBvcnQgaGF4ZS5kcy5JbnRNYXA7XG4iICsgImltcG9ydCBoYXhlLmRzLlN0cmluZ01hcDtcbiIKKyAgICAgICAgICsgImltcG9ydCBoYXhlLmRzLk9iamVjdE1hcDtcbiIgKyAiXG4iICsgIiNpZiBmbGFzaFxuIgorICAgICAgICAgKyAiaW1wb3J0IGZsYXNoLmVycm9ycy5Bcmd1bWVudEVycm9yO1xuIiArICIjZW5kXG4iICsgIlxuIjsKK30KKworLyoqCisgKiBQcmludHMgc3RhbmRhcmQgaGF4ZSBpbXBvcnRzCisgKgorICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgbmVjZXNzYXJ5IGZvciB0aHJpZnQKKyAqLworc3RyaW5nIHRfaGF4ZV9nZW5lcmF0b3I6OmhheGVfdGhyaWZ0X2ltcG9ydHMoKSB7CisgIHJldHVybiBzdHJpbmcoKSArICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuKjtcbiIgKyAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS4qO1xuIgorICAgICAgICAgKyAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLio7XG4iICsgIlxuIjsKK30KKworLyoqCisgKiBQcmludHMgaW1wb3J0cyBuZWVkZWQgZm9yIGEgZ2l2ZW4gdHlwZQorICoKKyAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgYSBnaXZlbiB0X3N0cnVjdAorICovCitzdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6aGF4ZV90aHJpZnRfZ2VuX2ltcG9ydHModF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyYgaW1wb3J0cykgeworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgLy8gRm9yIGVhY2ggdHlwZSBjaGVjayBpZiBpdCBpcyBmcm9tIGEgZGlmZmVyZW50IG5hbWVzcGFjZQorICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gKCptX2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfcHJvZ3JhbSgpOworICAgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgeworICAgICAgc3RyaW5nIHBhY2thZ2UgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJoYXhlIik7CisgICAgICBpZiAoIXBhY2thZ2UuZW1wdHkoKSkgeworICAgICAgICBpZiAoaW1wb3J0cy5maW5kKHBhY2thZ2UgKyAiLiIgKyAoKm1faXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCkpID09IHN0cmluZzo6bnBvcykgeworICAgICAgICAgIGltcG9ydHMuYXBwZW5kKCJpbXBvcnQgIiArIHBhY2thZ2UgKyAiLiIgKyAoKm1faXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCkgKyAiO1xuIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIGltcG9ydHM7Cit9CisKKy8qKgorICogUHJpbnRzIGltcG9ydHMgbmVlZGVkIGZvciBhIGdpdmVuIHR5cGUKKyAqCisgKiBAcmV0dXJuIExpc3Qgb2YgaW1wb3J0cyBuZWNlc3NhcnkgZm9yIGEgZ2l2ZW4gdF9zZXJ2aWNlCisgKi8KK3N0cmluZyB0X2hheGVfZ2VuZXJhdG9yOjpoYXhlX3RocmlmdF9nZW5faW1wb3J0cyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBpbXBvcnRzOworICBjb25zdCB2ZWN0b3I8dF9mdW5jdGlvbio+JiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gRm9yIGVhY2ggdHlwZSBjaGVjayBpZiBpdCBpcyBmcm9tIGEgZGlmZmVyZW50IG5hbWVzcGFjZQorICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+Z2V0X3Byb2dyYW0oKTsKKyAgICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKKyAgICAgIHN0cmluZyBwYWNrYWdlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiaGF4ZSIpOworICAgICAgaWYgKCFwYWNrYWdlLmVtcHR5KCkpIHsKKyAgICAgICAgaWYgKGltcG9ydHMuZmluZChwYWNrYWdlICsgIi4iICsgKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5nZXRfbmFtZSgpKSA9PSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICBpbXBvcnRzLmFwcGVuZCgiaW1wb3J0ICIgKyBwYWNrYWdlICsgIi4iICsgKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgKyAiO1xuIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBoYXhlX3RocmlmdF9nZW5faW1wb3J0cygoKmZfaXRlciktPmdldF9hcmdsaXN0KCksIGltcG9ydHMpOworICAgIGhheGVfdGhyaWZ0X2dlbl9pbXBvcnRzKCgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpLCBpbXBvcnRzKTsKKyAgfQorCisgIHJldHVybiBpbXBvcnRzOworfQorCisvKioKKyAqIE5vdGhpbmcgaW4gaGF4ZQorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBUaGlzIGlzIG5vdCBkb25lIGluIGhheGUsIHNpbmNlIGl0IGRvZXMKKyAqIG5vdCBzdXBwb3J0IGFyYml0cmFyeSBuYW1lIHJlcGxhY2VtZW50cywgYW5kIGl0J2QgYmUgYSB3YWNreSB3YXN0ZQorICogb2Ygb3ZlcmhlYWQgdG8gbWFrZSB3cmFwcGVyIGNsYXNzZXMuCisgKgorICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgKHZvaWQpdHR5cGVkZWY7Cit9CisKKy8qKgorICogRW51bXMgYXJlIGEgY2xhc3Mgd2l0aCBhIHNldCBvZiBzdGF0aWMgY29uc3RhbnRzLgorICoKKyAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgLy8gTWFrZSBvdXRwdXQgZmlsZQorICBzdHJpbmcgZl9lbnVtX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBnZXRfY2FwX25hbWUodGVudW0tPmdldF9uYW1lKCkpICsgIi5oeCI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9lbnVtOworICBmX2VudW0ub3BlbihmX2VudW1fbmFtZS5jX3N0cigpKTsKKworICAvLyBDb21tZW50IGFuZCBwYWNrYWdlIGl0CisgIGZfZW51bSA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBoYXhlX3BhY2thZ2UoKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEFkZCBoYXhlIGltcG9ydHMKKyAgZl9lbnVtIDw8IHN0cmluZygpICsgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5oZWxwZXIuKjsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9ydHRpX2RlY29yYXRpb24oZl9lbnVtKTsKKyAgZ2VuZXJhdGVfbWFjcm9fZGVjb3JhdGlvbihmX2VudW0pOworICBpbmRlbnQoZl9lbnVtKSA8PCAiY2xhc3MgIiA8PCBnZXRfY2FwX25hbWUodGVudW0tPmdldF9uYW1lKCkpIDw8ICIgIjsKKyAgc2NvcGVfdXAoZl9lbnVtKTsKKworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIHN0YXRpYyBpbmxpbmUgdmFyICIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgOiBJbnQgPSAiIDw8IHZhbHVlCisgICAgICAgICAgICAgICAgICAgPDwgIjsiIDw8IGVuZGw7CisgIH0KKworICAvLyBDcmVhdGUgYSBzdGF0aWMgU2V0IHdpdGggYWxsIHZhbGlkIHZhbHVlcyBmb3IgdGhpcyBlbnVtCisgIGZfZW51bSA8PCBlbmRsOworCisgIGluZGVudChmX2VudW0pIDw8ICJwdWJsaWMgc3RhdGljIHZhciBWQUxJRF9WQUxVRVMgPSB7IG5ldyBJbnRTZXQoIFsiOworICBpbmRlbnRfdXAoKTsKKyAgYm9vbCBmaXJzdFZhbHVlID0gdHJ1ZTsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICAvLyBwb3B1bGF0ZSBzZXQKKyAgICBmX2VudW0gPDwgKGZpcnN0VmFsdWUgPyAiIiA6ICIsICIpIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBmaXJzdFZhbHVlID0gZmFsc2U7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9lbnVtIDw8ICJdKTsgfTsiIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfZW51bSkgPDwgInB1YmxpYyBzdGF0aWMgdmFyIFZBTFVFU19UT19OQU1FUyA9IHsgWyI7CisgIGluZGVudF91cCgpOworICBmaXJzdFZhbHVlID0gdHJ1ZTsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBmX2VudW0gPDwgKGZpcnN0VmFsdWUgPyAiIiA6ICIsIikgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9lbnVtKSA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9PiBcIiIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiI7CisgICAgZmlyc3RWYWx1ZSA9IGZhbHNlOworICB9CisgIGZfZW51bSA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9lbnVtKSA8PCAiXTsgfTsiIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihmX2VudW0pOyAvLyBlbmQgY2xhc3MKKworICBmX2VudW0uY2xvc2UoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBjbGFzcyB0aGF0IGhvbGRzIGFsbCB0aGUgY29uc3RhbnRzLgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKSB7CisgIGlmIChjb25zdHMuZW1wdHkoKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIHN0cmluZyBmX2NvbnN0c19uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgZ2V0X2NhcF9uYW1lKHByb2dyYW1fbmFtZV8pICsgIkNvbnN0YW50cy5oeCI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9jb25zdHM7CisgIGZfY29uc3RzLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKKworICAvLyBQcmludCBoZWFkZXIKKyAgZl9jb25zdHMgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgaGF4ZV9wYWNrYWdlKCkgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBmX2NvbnN0cyA8PCBlbmRsOworCisgIGZfY29uc3RzIDw8IGhheGVfdHlwZV9pbXBvcnRzKCk7CisKKyAgZ2VuZXJhdGVfcnR0aV9kZWNvcmF0aW9uKGZfY29uc3RzKTsKKyAgZ2VuZXJhdGVfbWFjcm9fZGVjb3JhdGlvbihmX2NvbnN0cyk7CisgIGluZGVudChmX2NvbnN0cykgPDwgImNsYXNzICIgPDwgZ2V0X2NhcF9uYW1lKHByb2dyYW1fbmFtZV8pIDw8ICJDb25zdGFudHMgeyIgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY19pdGVyOworICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgeworICAgIHByaW50X2NvbnN0X3ZhbHVlKGZfY29uc3RzLAorICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF90eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfY29uc3RzKSA8PCAifSIgPDwgZW5kbDsKKyAgZl9jb25zdHMuY2xvc2UoKTsKK30KKwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpwcmludF9jb25zdF92YWx1ZShzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fc3RhdGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlZnZhbCkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpbmRlbnQob3V0KTsKKyAgaWYgKCFkZWZ2YWwpIHsKKyAgICBvdXQgPDwgKGluX3N0YXRpYyA/ICJ2YXIgIiA6ICJwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgICIpOworICB9CisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHN0cmluZyB2MiA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIHR5cGUsIHZhbHVlKTsKKyAgICBvdXQgPDwgbmFtZTsKKyAgICBpZiAoIWRlZnZhbCkgeworICAgICAgb3V0IDw8ICI6IiA8PCB0eXBlX25hbWUodHlwZSk7CisgICAgfQorICAgIG91dCA8PCAiID0gIiA8PCB2MiA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIG91dCA8PCBuYW1lOworICAgIGlmICghZGVmdmFsKSB7CisgICAgICBvdXQgPDwgIjoiIDw8IHR5cGVfbmFtZSh0eXBlKTsKKyAgICB9CisgICAgb3V0IDw8ICIgPSAiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIG91dCA8PCBuYW1lIDw8ICI6IiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIKKyAgICAgICAgPDwgZW5kbDsKKyAgICBpZiAoIWluX3N0YXRpYykgeworICAgICAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgZnVuY3Rpb24oKSA6IFZvaWQgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7CisgICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOworICAgICAgfQorICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi4iOworICAgICAgb3V0IDw8IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSA8PCAiID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICAgIGlmICghaW5fc3RhdGljKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0oKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgb3V0IDw8IG5hbWU7CisgICAgaWYgKCFkZWZ2YWwpIHsKKyAgICAgIG91dCA8PCAiOiIgPDwgdHlwZV9uYW1lKHR5cGUpOworICAgIH0KKyAgICBvdXQgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgICBpZiAoIWluX3N0YXRpYykgeworICAgICAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgZnVuY3Rpb24oKSA6IFZvaWQgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgc3RyaW5nIGtleSA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiWyIgPDwga2V5IDw8ICJdID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICAgIGlmICghaW5fc3RhdGljKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0oKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgeworICAgIG91dCA8PCBuYW1lOworICAgIGlmICghZGVmdmFsKSB7CisgICAgICBvdXQgPDwgIjoiIDw8IHR5cGVfbmFtZSh0eXBlKTsKKyAgICB9CisgICAgb3V0IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAibmV3IGZ1bmN0aW9uKCkgOiBWb2lkIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisgICAgdF90eXBlKiBldHlwZTsKKyAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0gZWxzZSB7CisgICAgICBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfQorICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGV0eXBlLCAqdl9pdGVyKTsKKyAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi4iIDw8ICh0eXBlLT5pc19saXN0KCkgPyAicHVzaCIgOiAiYWRkIikgPDwgIigiIDw8IHZhbCA8PCAiKTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0KKyAgICBpZiAoIWluX3N0YXRpYykgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9KCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIHR5cGUgIiArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0KK30KKworc3RyaW5nIHRfaGF4ZV9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgICh2b2lkKW5hbWU7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVuZGVyOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZW5kZXIgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmVuZGVyIDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJlbmRlciA8PCAiKGJ5dGUpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmVuZGVyIDw8ICIoc2hvcnQpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIkwiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICByZW5kZXIgPDwgIihkb3VibGUpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgIH0gZWxzZSB7CisgICAgc3RyaW5nIHQgPSB0bXAoInRtcCIpOworICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwgdCwgdHlwZSwgdmFsdWUsIHRydWUpOworICAgIHJlbmRlciA8PCB0OworICB9CisKKyAgcmV0dXJuIHJlbmRlci5zdHIoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLiBUaGlzIGlzIGEgY2xhc3MKKyAqIHdpdGggZGF0YSBtZW1iZXJzLCByZWFkKCksIHdyaXRlKCksIGFuZCBhbiBpbm5lciBJc3NldCBjbGFzcy4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgZ2VuZXJhdGVfaGF4ZV9zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOworfQorCisvKioKKyAqIEV4Y2VwdGlvbnMgYXJlIHN0cnVjdHMsIGJ1dCB0aGV5IGluaGVyaXQgZnJvbSBFeGNlcHRpb24KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX2hheGVfc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7Cit9CisKKy8qKgorICogSGF4ZSBzdHJ1Y3QgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oYXhlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24sIGJvb2wgaXNfcmVzdWx0KSB7CisgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgc3RyaW5nIGZfc3RydWN0X25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBnZXRfY2FwX25hbWUodHN0cnVjdC0+Z2V0X25hbWUoKSkgKyAiLmh4IjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3N0cnVjdDsKKyAgZl9zdHJ1Y3Qub3BlbihmX3N0cnVjdF9uYW1lLmNfc3RyKCkpOworCisgIGZfc3RydWN0IDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGhheGVfcGFja2FnZSgpIDw8ICI7IiA8PCBlbmRsOworCisgIGZfc3RydWN0IDw8IGVuZGw7CisKKyAgc3RyaW5nIGltcG9ydHM7CisKKyAgZl9zdHJ1Y3QgPDwgaGF4ZV90eXBlX2ltcG9ydHMoKSA8PCBoYXhlX3RocmlmdF9pbXBvcnRzKCkKKyAgICAgICAgICAgPDwgaGF4ZV90aHJpZnRfZ2VuX2ltcG9ydHModHN0cnVjdCwgaW1wb3J0cykgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9oYXhlX3N0cnVjdF9kZWZpbml0aW9uKGZfc3RydWN0LCB0c3RydWN0LCBpc19leGNlcHRpb24sIGlzX3Jlc3VsdCk7CisKKyAgZl9zdHJ1Y3QuY2xvc2UoKTsKK30KKworLyoqCisgKiBoYXhlIHN0cnVjdCBkZWZpbml0aW9uLiBUaGlzIGhhcyB2YXJpb3VzIHBhcmFtZXRlcnMsIGFzIGl0IGNvdWxkIGJlCisgKiBnZW5lcmF0ZWQgc3RhbmRhbG9uZSBvciBpbnNpZGUgYW5vdGhlciBjbGFzcyBhcyBhIGhlbHBlci4gSWYgaXQKKyAqIGlzIGEgaGVscGVyIHRoYW4gaXQgaXMgYSBzdGF0aWMgY2xhc3MuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgICAgICBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqIEBwYXJhbSBpc19leGNlcHRpb24gSXMgdGhpcyBhbiBleGNlcHRpb24/CisgKiBAcGFyYW0gaW5fY2xhc3MgICAgIElmIGluc2lkZSBhIGNsYXNzLCBuZWVkcyB0byBiZSBzdGF0aWMgY2xhc3MKKyAqIEBwYXJhbSBpc19yZXN1bHQgICAgSWYgdGhpcyBpcyBhIHJlc3VsdCBpdCBuZWVkcyBhIGRpZmZlcmVudCB3cml0ZXIKKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oYXhlX3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCkgeworICBnZW5lcmF0ZV9oYXhlX2RvYyhvdXQsIHRzdHJ1Y3QpOworCisgIHN0cmluZyBjbHNuYW1lID0gZ2V0X2NhcF9uYW1lKHRzdHJ1Y3QtPmdldF9uYW1lKCkpOworCisgIGdlbmVyYXRlX3J0dGlfZGVjb3JhdGlvbihvdXQpOworICBnZW5lcmF0ZV9tYWNyb19kZWNvcmF0aW9uKG91dCk7CisgIGluZGVudChvdXQpIDw8ICJjbGFzcyAiIDw8IGNsc25hbWUgPDwgIiAiOworCisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBvdXQgPDwgImV4dGVuZHMgVEV4Y2VwdGlvbiAiOworICB9CisgIG91dCA8PCAiaW1wbGVtZW50cyBUQmFzZSAiOworCisgIHNjb3BlX3VwKG91dCk7CisgIGluZGVudChvdXQpIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgInN0YXRpYyB2YXIgU1RSVUNUX0RFU0MgPSB7IG5ldyBUU3RydWN0KFwiIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJcIik7IH07IgorICAgICAgICAgICAgICA8PCBlbmRsOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGluZGVudChvdXQpIDw8ICJzdGF0aWMgdmFyICIgPDwgY29uc3RhbnRfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgPDwgIl9GSUVMRF9ERVNDID0geyBuZXcgVEZpZWxkKFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiLCAiCisgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIiA8PCAoKm1faXRlciktPmdldF9rZXkoKSA8PCAiKTsgfTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfQorICBvdXQgPDwgZW5kbDsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgZ2VuZXJhdGVfaGF4ZV9kb2Mob3V0LCAqbV9pdGVyKTsKKyAgICAvLyBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSB2YXIgXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpICsgIiA6ICIgKworICAgIC8vIHR5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJAOmlzVmFyIiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdmFyICIKKyAgICAgICAgICAgICAgICA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgKyAiKGdldCxzZXQpIDogIgorICAgICAgICAgICAgICAgICAgICsgZ2V0X2NhcF9uYW1lKHR5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCkpKSA8PCAiOyIgPDwgZW5kbDsKKyAgfQorCisgIG91dCA8PCBlbmRsOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaW5saW5lIHN0YXRpYyB2YXIgIiA8PCB1cGNhc2Vfc3RyaW5nKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICA8PCAiX0ZJRUxEX0lEIDogSW50ID0gIiA8PCAoKm1faXRlciktPmdldF9rZXkoKSA8PCAiOyIgPDwgZW5kbDsKKyAgfQorCisgIG91dCA8PCBlbmRsOworCisgIC8vIElubmVyIElzc2V0IGNsYXNzCisgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBpZiAoIXR5cGVfY2FuX2JlX251bGwoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSB2YXIgX19pc3NldF8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIDogQm9vbCA9IGZhbHNlOyIKKyAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBvdXQgPDwgZW5kbDsKKworICAvLyBTdGF0aWMgaW5pdGlhbGl6ZXIgdG8gcG9wdWxhdGUgZ2xvYmFsIGNsYXNzIHRvIHN0cnVjdCBtZXRhZGF0YSBtYXAKKyAgaWYgKGZhbHNlKSB7CisgICAgLy8gVE9ETzogcmVhY3RpdmF0ZSB3aGVuIG5lZWRlZAorICAgIGdlbmVyYXRlX2hheGVfbWV0YV9kYXRhX21hcChvdXQsIHRzdHJ1Y3QpOworICAgIGluZGVudChvdXQpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJGaWVsZE1ldGFEYXRhLmFkZFN0cnVjdE1ldGFEYXRhTWFwKCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIsIG1ldGFEYXRhTWFwKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgLy8gRGVmYXVsdCBjb25zdHJ1Y3RvcgorICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIG5ldygpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgaW5kZW50KG91dCkgPDwgInN1cGVyKCk7IiA8PCBlbmRsOworICB9CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIgorICAgICAgICAgICAgICAgICAgPDwgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKS0+Z2V0X2ludGVnZXIoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9wcm9wZXJ0eV9nZXR0ZXJzX3NldHRlcnMob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfZ2VuZXJpY19maWVsZF9nZXR0ZXJzX3NldHRlcnMob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfZ2VuZXJpY19pc3NldF9tZXRob2Qob3V0LCB0c3RydWN0KTsKKworICBnZW5lcmF0ZV9oYXhlX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKKyAgaWYgKGlzX3Jlc3VsdCkgeworICAgIGdlbmVyYXRlX2hheGVfc3RydWN0X3Jlc3VsdF93cml0ZXIob3V0LCB0c3RydWN0KTsKKyAgfSBlbHNlIHsKKyAgICBnZW5lcmF0ZV9oYXhlX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKKyAgfQorICBnZW5lcmF0ZV9oYXhlX3N0cnVjdF90b3N0cmluZyhvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9oYXhlX3ZhbGlkYXRvcihvdXQsIHRzdHJ1Y3QpOworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHJlYWQgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdC4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oYXhlX3N0cnVjdF9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiByZWFkKCBpcHJvdCA6IFRQcm90b2NvbCkgOiBWb2lkIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpbmRlbnQob3V0KSA8PCAiaXByb3QuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ0cnkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgLy8gRGVjbGFyZSBzdGFjayB0bXAgdmFyaWFibGVzIGFuZCByZWFkIHN0cnVjdCBoZWFkZXIKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgZmllbGQgOiBURmllbGQ7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpcHJvdC5yZWFkU3RydWN0QmVnaW4oKTsiCisgICAgICA8PCBlbmRsOworCisgIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcworICBpbmRlbnQob3V0KSA8PCAid2hpbGUgKHRydWUpIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIC8vIFJlYWQgYmVnaW5uaW5nIGZpZWxkIG1hcmtlcgorICBpbmRlbnQob3V0KSA8PCAiZmllbGQgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpOyIgPDwgZW5kbDsKKworICAvLyBDaGVjayBmb3IgZmllbGQgU1RPUCBtYXJrZXIgYW5kIGJyZWFrCisgIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5TVE9QKSB7ICIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIC8vIFN3aXRjaCBzdGF0ZW1lbnQgb24gdGhlIGZpZWxkIHdlIGFyZSByZWFkaW5nCisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkLmlkKSIgPDwgZW5kbDsKKworICBzY29wZV91cChvdXQpOworCisgIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgdXBjYXNlX3N0cmluZygoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICJfRklFTERfSUQ6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGQudHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLiIpOworICAgIGdlbmVyYXRlX2lzc2V0X3NldChvdXQsICpmX2l0ZXIpOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyAiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsiCisgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIC8vIEluIHRoZSBkZWZhdWx0IGNhc2Ugd2Ugc2tpcCB0aGUgZmllbGQKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOyIKKyAgICAgIDw8IGVuZGw7CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIC8vIFJlYWQgZmllbGQgZW5kIG1hcmtlcgorICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZEZpZWxkRW5kKCk7IiA8PCBlbmRsOworCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgImlwcm90LnJlYWRTdHJ1Y3RFbmQoKTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAiaXByb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgaW5kZW50KG91dCkgPDwgImNhdGNoKGU6RHluYW1pYykiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisgIGluZGVudChvdXQpIDw8ICJpcHJvdC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInRocm93IGU7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisKKyAgLy8gY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcyBvZiBwcmltaXRpdmUgdHlwZQorICAvLyAod2hpY2ggY2FuIGJlIGNoZWNrZWQgaGVyZSBidXQgbm90IGluIHRoZSBnZW5lcmFsIHZhbGlkYXRlIG1ldGhvZCkKKyAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIi8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMgb2YgcHJpbWl0aXZlIHR5cGUsIHdoaWNoIGNhbid0IGJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoZWNrZWQgaW4gdGhlIHZhbGlkYXRlIG1ldGhvZCIgPDwgZW5kbDsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCAmJiAhdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghX19pc3NldF8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIiAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uVU5LTk9XTiwgXCJSZXF1aXJlZCBmaWVsZCAnIgorICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgIDw8ICInIHdhcyBub3QgZm91bmQgaW4gc2VyaWFsaXplZCBkYXRhISBTdHJ1Y3Q6IFwiICsgdG9TdHJpbmcoKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgLy8gcGVyZm9ybXMgdmFyaW91cyBjaGVja3MgKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCisgIGluZGVudChvdXQpIDw8ICJ2YWxpZGF0ZSgpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLy8gZ2VuZXJhdGVzIGhheGUgbWV0aG9kIHRvIHBlcmZvcm0gdmFyaW91cyBjaGVja3MKKy8vIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oYXhlX3ZhbGlkYXRvcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gdmFsaWRhdGUoKSA6IFZvaWQgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiLy8gY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcyIgPDwgZW5kbDsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgaWYgKHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50KG91dCkKKyAgICAgICAgICAgIDw8ICIgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLlVOS05PV04sIFwiUmVxdWlyZWQgZmllbGQgJyIKKyAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJyB3YXMgbm90IHByZXNlbnQhIFN0cnVjdDogXCIgKyB0b1N0cmluZygpKTsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIi8vIGFsYXMsIHdlIGNhbm5vdCBjaGVjayAnIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgPDwgIicgYmVjYXVzZSBpdCdzIGEgcHJpbWl0aXZlLiIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBjaGVjayB0aGF0IGZpZWxkcyBvZiB0eXBlIGVudW0gaGF2ZSB2YWxpZCB2YWx1ZXMKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIvLyBjaGVjayB0aGF0IGZpZWxkcyBvZiB0eXBlIGVudW0gaGF2ZSB2YWxpZCB2YWx1ZXMiIDw8IGVuZGw7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAoKmZfaXRlcik7CisgICAgdF90eXBlKiB0eXBlID0gZmllbGQtPmdldF90eXBlKCk7CisgICAgLy8gaWYgZmllbGQgaXMgYW4gZW51bSwgY2hlY2sgdGhhdCBpdHMgdmFsdWUgaXMgdmFsaWQKKyAgICBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpIDw8ICIgJiYgISIKKyAgICAgICAgICAgICAgICAgIDw8IGdldF9jYXBfbmFtZShnZXRfZW51bV9jbGFzc19uYW1lKHR5cGUpKSA8PCAiLlZBTElEX1ZBTFVFUy5jb250YWlucygiCisgICAgICAgICAgICAgICAgICA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKSl7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uVU5LTk9XTiwgXCJUaGUgZmllbGQgJyIKKyAgICAgICAgICAgICAgICAgIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICInIGhhcyBiZWVuIGFzc2lnbmVkIHRoZSBpbnZhbGlkIHZhbHVlIFwiICsgIgorICAgICAgICAgICAgICAgICAgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIik7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gd3JpdGUgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdAorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2hheGVfc3RydWN0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGZ1bmN0aW9uIHdyaXRlKG9wcm90OlRQcm90b2NvbCkgOiBWb2lkIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBwZXJmb3JtcyB2YXJpb3VzIGNoZWNrcyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKKyAgaW5kZW50KG91dCkgPDwgInZhbGlkYXRlKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAib3Byb3QuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ0cnkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlU3RydWN0QmVnaW4oU1RSVUNUX0RFU0MpOyIgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGJvb2wgY291bGRfYmVfdW5zZXQgPSAoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMOworICAgIGlmIChjb3VsZF9iZV91bnNldCkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCpmX2l0ZXIpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisgICAgYm9vbCBudWxsX2FsbG93ZWQgPSB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKG51bGxfYWxsb3dlZCkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAodGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEJlZ2luKCIgPDwgY29uc3RhbnRfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgPDwgIl9GSUVMRF9ERVNDKTsiIDw8IGVuZGw7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLiIpOworCisgICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7CisKKyAgICBpZiAobnVsbF9hbGxvd2VkKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIGlmIChjb3VsZF9iZV91bnNldCkgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJvcHJvdC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworICBpbmRlbnQob3V0KSA8PCAiY2F0Y2goZTpEeW5hbWljKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAidGhyb3cgZTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byB3cml0ZSBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0LAorICogd2hpY2ggaXMgYSBmdW5jdGlvbiByZXN1bHQuIFRoZXNlIGZpZWxkcyBhcmUgb25seSB3cml0dGVuCisgKiBpZiB0aGV5IGFyZSBzZXQgaW4gdGhlIElzc2V0IGFycmF5LCBhbmQgb25seSBvbmUgb2YgdGhlbQorICogY2FuIGJlIHNldCBhdCBhIHRpbWUuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaGF4ZV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGZ1bmN0aW9uIHdyaXRlKG9wcm90OlRQcm90b2NvbCkgOiBWb2lkIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpbmRlbnQob3V0KSA8PCAib3Byb3QuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ0cnkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlU3RydWN0QmVnaW4oU1RSVUNUX0RFU0MpOyIgPDwgZW5kbDsKKworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgIjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICIgZWxzZSBpZiAiOworICAgIH0KKworICAgIG91dCA8PCAiKHRoaXMuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSB7IiA8PCBlbmRsOworCisgICAgaW5kZW50X3VwKCk7CisKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEJlZ2luKCIgPDwgY29uc3RhbnRfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgPDwgIl9GSUVMRF9ERVNDKTsiIDw8IGVuZGw7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLiIpOworCisgICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IjsKKyAgfQorCisgIGluZGVudChvdXQpIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJvcHJvdC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworICBpbmRlbnQob3V0KSA8PCAiY2F0Y2goZTpEeW5hbWljKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAidGhyb3cgZTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yZWZsZWN0aW9uX2dldHRlcnMob3N0cmluZ3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2FwX25hbWUpIHsKKyAgKHZvaWQpdHlwZTsKKyAgKHZvaWQpY2FwX25hbWU7CisgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgdXBjYXNlX3N0cmluZyhmaWVsZF9uYW1lKSA8PCAiX0ZJRUxEX0lEOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7Cit9CisKK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmVmbGVjdGlvbl9zZXR0ZXJzKG9zdHJpbmdzdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNhcF9uYW1lKSB7CisgICh2b2lkKXR5cGU7CisgICh2b2lkKWNhcF9uYW1lOworICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IHVwY2FzZV9zdHJpbmcoZmllbGRfbmFtZSkgPDwgIl9GSUVMRF9JRDoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiaWYgKHZhbHVlID09IG51bGwpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHVuc2V0IiA8PCBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gdmFsdWU7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7Cit9CisKK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ2VuZXJpY19maWVsZF9nZXR0ZXJzX3NldHRlcnMoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7CisKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIGdldHRlcl9zdHJlYW07CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzZXR0ZXJfc3RyZWFtOworCisgIC8vIGJ1aWxkIHVwIHRoZSBib2RpZXMgb2YgYm90aCB0aGUgZ2V0dGVyIGFuZCBzZXR0ZXIgYXQgb25jZQorICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOworICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoZmllbGQtPmdldF90eXBlKCkpOworICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKKyAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKTsKKworICAgIGluZGVudF91cCgpOworICAgIGdlbmVyYXRlX3JlZmxlY3Rpb25fc2V0dGVycyhzZXR0ZXJfc3RyZWFtLCB0eXBlLCBmaWVsZF9uYW1lLCBjYXBfbmFtZSk7CisgICAgZ2VuZXJhdGVfcmVmbGVjdGlvbl9nZXR0ZXJzKGdldHRlcl9zdHJlYW0sIHR5cGUsIGZpZWxkX25hbWUsIGNhcF9uYW1lKTsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgLy8gY3JlYXRlIHRoZSBzZXR0ZXIKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiBzZXRGaWVsZFZhbHVlKGZpZWxkSUQgOiBJbnQsIHZhbHVlIDogRHluYW1pYykgOiBWb2lkIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgeworICAgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkSUQpIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IHNldHRlcl9zdHJlYW0uc3RyKCk7CisgICAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKFwiRmllbGQgXCIgKyBmaWVsZElEICsgXCIgZG9lc24ndCBleGlzdCFcIik7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihcIkZpZWxkIFwiICsgZmllbGRJRCArIFwiIGRvZXNuJ3QgZXhpc3QhXCIpOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gY3JlYXRlIHRoZSBnZXR0ZXIKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiBnZXRGaWVsZFZhbHVlKGZpZWxkSUQgOiBJbnQpIDogRHluYW1pYyB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAoZmllbGRzLnNpemUoKSA+IDApIHsKKyAgICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZElEKSB7IiA8PCBlbmRsOworICAgIG91dCA8PCBnZXR0ZXJfc3RyZWFtLnN0cigpOworICAgIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihcIkZpZWxkIFwiICsgZmllbGRJRCArIFwiIGRvZXNuJ3QgZXhpc3QhXCIpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAidGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoXCJGaWVsZCBcIiArIGZpZWxkSUQgKyBcIiBkb2Vzbid0IGV4aXN0IVwiKTsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworCisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8vIENyZWF0ZXMgYSBnZW5lcmljIGlzU2V0IG1ldGhvZCB0aGF0IHRha2VzIHRoZSBmaWVsZCBudW1iZXIgYXMgYXJndW1lbnQKK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ2VuZXJpY19pc3NldF9tZXRob2Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBjcmVhdGUgdGhlIGlzU2V0IG1ldGhvZAorICBpbmRlbnQob3V0KSA8PCAiLy8gUmV0dXJucyB0cnVlIGlmIGZpZWxkIGNvcnJlc3BvbmRpbmcgdG8gZmllbGRJRCBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgIgorICAgICAgICAgICAgICAgICAidmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gaXNTZXQoZmllbGRJRCA6IEludCkgOiBCb29sIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpZiAoZmllbGRzLnNpemUoKSA+IDApIHsKKyAgICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZElEKSB7IiA8PCBlbmRsOworCisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKKyAgICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgdXBjYXNlX3N0cmluZyhmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIl9GSUVMRF9JRDoiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZCkgPDwgIjsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgIH0KKworICAgIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihcIkZpZWxkIFwiICsgZmllbGRJRCArIFwiIGRvZXNuJ3QgZXhpc3QhXCIpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAidGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoXCJGaWVsZCBcIiArIGZpZWxkSUQgKyBcIiBkb2Vzbid0IGV4aXN0IVwiKTsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNldCBvZiBwcm9wZXJ0eSBzZXR0ZXJzL2dldHRlcnMgZm9yIHRoZSBnaXZlbiBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvcGVydHlfZ2V0dGVyc19zZXR0ZXJzKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKKyAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZmllbGQtPmdldF9uYW1lKCk7CisgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUgPSBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSk7CisKKyAgICAvLyBTaW1wbGUgZ2V0dGVyCisgICAgZ2VuZXJhdGVfaGF4ZV9kb2Mob3V0LCBmaWVsZCk7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiBnZXRfIiA8PCBmaWVsZF9uYW1lIDw8ICIoKSA6ICIgPDwgZ2V0X2NhcF9uYW1lKHR5cGVfbmFtZSh0eXBlKSkKKyAgICAgICAgICAgICAgICA8PCAiIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiB0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAvLyBTaW1wbGUgc2V0dGVyCisgICAgZ2VuZXJhdGVfaGF4ZV9kb2Mob3V0LCBmaWVsZCk7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiBzZXRfIiA8PCBmaWVsZF9uYW1lIDw8ICIoIiA8PCBmaWVsZF9uYW1lIDw8ICI6IgorICAgICAgICAgICAgICAgIDw8IGdldF9jYXBfbmFtZSh0eXBlX25hbWUodHlwZSkpIDw8ICIpIDogIiA8PCBnZXRfY2FwX25hbWUodHlwZV9uYW1lKHR5cGUpKSA8PCAiIHsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9ICIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICBnZW5lcmF0ZV9pc3NldF9zZXQob3V0LCBmaWVsZCk7CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiB0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIC8vIFVuc2V0dGVyCisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiB1bnNldCIgPDwgY2FwX25hbWUgPDwgIigpIDogVm9pZCB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG51bGw7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy5fX2lzc2V0XyIgPDwgZmllbGRfbmFtZSA8PCAiID0gZmFsc2U7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAvLyBpc1NldCBtZXRob2QKKyAgICBpbmRlbnQob3V0KSA8PCAiLy8gUmV0dXJucyB0cnVlIGlmIGZpZWxkICIgPDwgZmllbGRfbmFtZQorICAgICAgICAgICAgICAgIDw8ICIgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlIiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gaXMiIDw8IGdldF9jYXBfbmFtZSgic2V0IikgPDwgY2FwX25hbWUgPDwgIigpIDogQm9vbCB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgIT0gbnVsbDsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpcy5fX2lzc2V0XyIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdG9TdHJpbmcoKSBtZXRob2QgZm9yIHRoZSBnaXZlbiBzdHJ1Y3QKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oYXhlX3N0cnVjdF90b3N0cmluZyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljICIKKyAgICAgIDw8ICJmdW5jdGlvbiB0b1N0cmluZygpIDogU3RyaW5nIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyIHJldCA6IFN0cmluZyA9IFwiIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoXCI7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciBmaXJzdCA6IEJvb2wgPSB0cnVlOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgYm9vbCBjb3VsZF9iZV91bnNldCA9ICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7CisgICAgaWYgKGNvdWxkX2JlX3Vuc2V0KSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKworICAgIHRfZmllbGQqIGZpZWxkID0gKCpmX2l0ZXIpOworCisgICAgaWYgKCFmaXJzdCkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmICghZmlyc3QpIHJldCArPSAgXCIsIFwiOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgInJldCArPSBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6XCI7IiA8PCBlbmRsOworICAgIGJvb2wgY2FuX2JlX251bGwgPSB0eXBlX2Nhbl9iZV9udWxsKGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAoY2FuX2JlX251bGwpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID09IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICByZXQgKz0gXCJudWxsXCI7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorCisgICAgaWYgKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19iaW5hcnkoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0ICs9IFwiQklOQVJZXCI7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX2VudW0oKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgInZhciAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICA8PCAiX25hbWUgOiBTdHJpbmcgPSAiIDw8IGdldF9jYXBfbmFtZShnZXRfZW51bV9jbGFzc19uYW1lKGZpZWxkLT5nZXRfdHlwZSgpKSkKKyAgICAgICAgICAgICAgICAgIDw8ICIuVkFMVUVTX1RPX05BTUVTW3RoaXMuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIl07IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICJfbmFtZSAhPSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0ICs9ICIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIl9uYW1lOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIHJldCArPSBcIiAoXCI7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0ICs9IHRoaXMuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiX25hbWUgIT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIHJldCArPSBcIilcIjsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgInJldCArPSB0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKworICAgIGlmIChjYW5fYmVfbnVsbCkgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAiZmlyc3QgPSBmYWxzZTsiIDw8IGVuZGw7CisKKyAgICBpZiAoY291bGRfYmVfdW5zZXQpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgZmlyc3QgPSBmYWxzZTsKKyAgfQorICBvdXQgPDwgaW5kZW50KCkgPDwgInJldCArPSBcIilcIjsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJldHVybiByZXQ7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RhdGljIG1hcCB3aXRoIG1ldGEgZGF0YSB0byBzdG9yZSBpbmZvcm1hdGlvbiBzdWNoIGFzIGZpZWxkSUQgdG8KKyAqIGZpZWxkTmFtZSBtYXBwaW5nCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaGF4ZV9tZXRhX2RhdGFfbWFwKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIC8vIFN0YXRpYyBNYXAgd2l0aCBmaWVsZElEIC0+IEZpZWxkTWV0YURhdGEgbWFwcGluZ3MKKyAgaW5kZW50KG91dCkgPDwgImlubGluZSBzdGF0aWMgdmFyIG1ldGFEYXRhTWFwIDogSW50TWFwID0gbmV3IEludE1hcCgpOyIgPDwgZW5kbDsKKworICBpZiAoZmllbGRzLnNpemUoKSA+IDApIHsKKyAgICAvLyBQb3B1bGF0ZSBtYXAKKyAgICBzY29wZV91cChvdXQpOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7CisgICAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZmllbGQtPmdldF9uYW1lKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAibWV0YURhdGFNYXBbIiA8PCB1cGNhc2Vfc3RyaW5nKGZpZWxkX25hbWUpCisgICAgICAgICAgICAgICAgICA8PCAiX0ZJRUxEX0lEXSA9IG5ldyBGaWVsZE1ldGFEYXRhKFwiIiA8PCBmaWVsZF9uYW1lIDw8ICJcIiwgIjsKKworICAgICAgLy8gU2V0IGZpZWxkIHJlcXVpcmVtZW50IHR5cGUgKHJlcXVpcmVkLCBvcHRpb25hbCwgZXRjLikKKyAgICAgIGlmIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgICAgb3V0IDw8ICJURmllbGRSZXF1aXJlbWVudFR5cGUuUkVRVUlSRUQsICI7CisgICAgICB9IGVsc2UgaWYgKGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCkgeworICAgICAgICBvdXQgPDwgIlRGaWVsZFJlcXVpcmVtZW50VHlwZS5PUFRJT05BTCwgIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCAiVEZpZWxkUmVxdWlyZW1lbnRUeXBlLkRFRkFVTFQsICI7CisgICAgICB9CisKKyAgICAgIC8vIENyZWF0ZSB2YWx1ZSBtZXRhIGRhdGEKKyAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICAgIG91dCA8PCAiKTsiIDw8IGVuZGw7CisgICAgfQorICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgfQorfQorCisvKioKKyAqIFJldHVybnMgYSBzdHJpbmcgd2l0aCB0aGUgaGF4ZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gdGhyaWZ0IHR5cGUKKyAqIChlLmcuIGZvciB0aGUgdHlwZSBzdHJ1Y3QgaXQgcmV0dXJucyAiVFR5cGUuU1RSVUNUIikKKyAqLworc3RkOjpzdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6Z2V0X2hheGVfdHlwZV9zdHJpbmcodF90eXBlKiB0eXBlKSB7CisgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLkxJU1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5NQVAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5TRVQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLlNUUlVDVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5JMzIiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHJldHVybiBnZXRfaGF4ZV90eXBlX3N0cmluZygoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCkpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgc3dpdGNoICgoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHJldHVybiAiVFR5cGUuVk9JRCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiVFR5cGUuU1RSSU5HIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiVFR5cGUuQk9PTCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJUVHlwZS5CWVRFIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJUVHlwZS5JMTYiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiVFR5cGUuSTY0IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJUVHlwZS5ET1VCTEUiOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiVW5rbm93biB0aHJpZnQgdHlwZSBcIiIgKyB0eXBlLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIgcGFzc2VkIHRvIHRfaGF4ZV9nZW5lcmF0b3I6OmdldF9oYXhlX3R5cGVfc3RyaW5nISIpOworICAgICAgYnJlYWs7IC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiEKKyAgICB9CisgIH0gZWxzZSB7CisgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKAorICAgICAgICAiVW5rbm93biB0aHJpZnQgdHlwZSBcIiIgKyB0eXBlLT5nZXRfbmFtZSgpCisgICAgICAgICsgIlwiIHBhc3NlZCB0byB0X2hheGVfZ2VuZXJhdG9yOjpnZXRfaGF4ZV90eXBlX3N0cmluZyEiKTsgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIQorICB9Cit9CisKK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUpIHsKKyAgb3V0IDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnRfdXAoKTsKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm5ldyBTdHJ1Y3RNZXRhRGF0YShUVHlwZS5TVFJVQ1QsICIgPDwgdHlwZV9uYW1lKHR5cGUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBMaXN0TWV0YURhdGEoVFR5cGUuTElTVCwgIjsKKyAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCBlbGVtX3R5cGUpOworICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgU2V0TWV0YURhdGEoVFR5cGUuU0VULCAiOworICAgICAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGVsZW1fdHlwZSk7CisgICAgfSBlbHNlIHsgLy8gbWFwCisgICAgICBpbmRlbnQob3V0KSA8PCAibmV3IE1hcE1ldGFEYXRhKFRUeXBlLk1BUCwgIjsKKyAgICAgIHRfdHlwZSoga2V5X3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgICB0X3R5cGUqIHZhbF90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwga2V5X3R5cGUpOworICAgICAgb3V0IDw8ICIsICI7CisgICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCB2YWxfdHlwZSk7CisgICAgfQorICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJuZXcgRmllbGRWYWx1ZU1ldGFEYXRhKCIgPDwgZ2V0X2hheGVfdHlwZV9zdHJpbmcodHlwZSk7CisgIH0KKyAgb3V0IDw8ICIpIjsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50X2Rvd24oKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4gSW4gQysrLCB0aGlzIGNvbXByaXNlcyBhbiBlbnRpcmVseSBzZXBhcmF0ZQorICogaGVhZGVyIGFuZCBzb3VyY2UgZmlsZS4gVGhlIGhlYWRlciBmaWxlIGRlZmluZXMgdGhlIG1ldGhvZHMgYW5kIGluY2x1ZGVzCisgKiB0aGUgZGF0YSB0eXBlcyBkZWZpbmVkIGluIHRoZSBtYWluIGhlYWRlciBmaWxlLCBhbmQgdGhlIGltcGxlbWVudGF0aW9uCisgKiBmaWxlIGNvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgYmFzaWMgcHJpbnRlciBhbmQgZGVmYXVsdCBpbnRlcmZhY2VzLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIC8vIE1ha2UgaW50ZXJmYWNlIGZpbGUKKyAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgZ2V0X2NhcF9uYW1lKHNlcnZpY2VfbmFtZV8pICsgIi5oeCI7CisgIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKKworICBmX3NlcnZpY2VfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGhheGVfcGFja2FnZSgpIDw8ICI7IiA8PCBlbmRsOworCisgIGZfc2VydmljZV8gPDwgZW5kbCA8PCBoYXhlX3R5cGVfaW1wb3J0cygpIDw8IGhheGVfdGhyaWZ0X2ltcG9ydHMoKQorICAgICAgICAgICAgIDw8IGhheGVfdGhyaWZ0X2dlbl9pbXBvcnRzKHRzZXJ2aWNlKTsKKworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIHRfdHlwZSogcGFyZW50ID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgICAgc3RyaW5nIHBhcmVudF9uYW1lc3BhY2UgPSBwYXJlbnQtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lc3BhY2UoImhheGUiKTsKKyAgICBpZiAoIXBhcmVudF9uYW1lc3BhY2UuZW1wdHkoKSAmJiBwYXJlbnRfbmFtZXNwYWNlICE9IHBhY2thZ2VfbmFtZV8pIHsKKyAgICAgIGZfc2VydmljZV8gPDwgImltcG9ydCAiIDw8IHR5cGVfbmFtZShwYXJlbnQpIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7CisKKyAgZl9zZXJ2aWNlXy5jbG9zZSgpOworCisgIC8vIE5vdyBtYWtlIHRoZSBpbXBsZW1lbnRhdGlvbi9jbGllbnQgZmlsZQorICBmX3NlcnZpY2VfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIGdldF9jYXBfbmFtZShzZXJ2aWNlX25hbWVfKSArICJJbXBsLmh4IjsKKyAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOworCisgIGZfc2VydmljZV8gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgaGF4ZV9wYWNrYWdlKCkgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbCA8PCBoYXhlX3R5cGVfaW1wb3J0cygpCisgICAgICAgICAgICAgPDwgaGF4ZV90aHJpZnRfaW1wb3J0cygpIDw8IGhheGVfdGhyaWZ0X2dlbl9pbXBvcnRzKHRzZXJ2aWNlKSA8PCBlbmRsOworCisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgdF90eXBlKiBwYXJlbnQgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKyAgICBzdHJpbmcgcGFyZW50X25hbWVzcGFjZSA9IHBhcmVudC0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWVzcGFjZSgiaGF4ZSIpOworICAgIGlmICghcGFyZW50X25hbWVzcGFjZS5lbXB0eSgpICYmIHBhcmVudF9uYW1lc3BhY2UgIT0gcGFja2FnZV9uYW1lXykgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiaW1wb3J0ICIgPDwgdHlwZV9uYW1lKHBhcmVudCkgPDwgIkltcGw7IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7CisKKyAgZl9zZXJ2aWNlXy5jbG9zZSgpOworCisgIC8vIE5vdyBtYWtlIHRoZSBoZWxwZXIgY2xhc3MgZmlsZXMKKyAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKKworICAvLyBOb3cgbWFrZSB0aGUgcHJvY2Vzc29yL3NlcnZlciBmaWxlCisgIGZfc2VydmljZV9uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgZ2V0X2NhcF9uYW1lKHNlcnZpY2VfbmFtZV8pICsgIlByb2Nlc3Nvci5oeCI7CisgIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKKworICBmX3NlcnZpY2VfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGhheGVfcGFja2FnZSgpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGwgPDwgaGF4ZV90eXBlX2ltcG9ydHMoKQorICAgICAgICAgICAgIDw8IGhheGVfdGhyaWZ0X2ltcG9ydHMoKSA8PCBoYXhlX3RocmlmdF9nZW5faW1wb3J0cyh0c2VydmljZSkgPDwgZW5kbDsKKworICBpZiAoIXBhY2thZ2VfbmFtZV8uZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgImltcG9ydCAiIDw8IHBhY2thZ2VfbmFtZV8gPDwgIi4qOyIgPDwgZW5kbDsKKyAgICBmX3NlcnZpY2VfIDw8ICJpbXBvcnQgIiA8PCBwYWNrYWdlX25hbWVfIDw8ICIuIiA8PCBnZXRfY2FwX25hbWUoc2VydmljZV9uYW1lXykuY19zdHIoKQorICAgICAgICAgICAgICAgPDwgIkltcGw7IiA8PCBlbmRsOworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgfQorCisgIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRzZXJ2aWNlKTsKKworICBmX3NlcnZpY2VfLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSBjb2RlIHNuaXBwZXQgZm9yIHRoZSBvblN1Y2Nlc3MgY2FsbGJhY2tzCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgc2VydmljZSBmdW5jdGlvbiB0byBnZW5lcmF0ZSBjb2RlIGZvci4KKyAqLworc3RyaW5nIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfbWV0aG9kX29uc3VjY2Vzcyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYXNfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvbWl0X25hbWUpIHsKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICByZXR1cm4gIiI7CisgIH0KKworICBzdHJpbmcgbmFtZSA9ICIiOworICBpZiAoIW9taXRfbmFtZSkgeworICAgIG5hbWUgPSAib25TdWNjZXNzIjsKKyAgICBpZiAoYXNfdHlwZSkgeworICAgICAgbmFtZSArPSAiIDogIjsKKyAgICB9CisgIH0KKworICBpZiAodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICBpZiAoYXNfdHlwZSkgeworICAgICAgcmV0dXJuIG5hbWUgKyAiVm9pZC0+Vm9pZCA9IG51bGwiOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gbmFtZSArICIoKSA6IFZvaWQiOworICAgIH0KKyAgfQorCisgIGlmIChhc190eXBlKSB7CisgICAgcmV0dXJuIG5hbWUgKyB0eXBlX25hbWUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSArICItPlZvaWQgPSBudWxsIjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gbmFtZSArICIoIHJldHZhbCA6ICIgKyB0eXBlX25hbWUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSArICIpIjsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgbWV0aG9kIGhlYWRlcgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIHNlcnZpY2UgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgY29kZSBmb3IuCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9tZXRob2Rfc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgYm9vbCBpc19pbnRlcmZhY2UpIHsKKyAgaWYgKGNhbGxiYWNrc18pIHsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX21ldGhvZF9zaWduYXR1cmVfY2FsbGJhY2sodGZ1bmN0aW9uLCBpc19pbnRlcmZhY2UpOworICB9IGVsc2UgeworICAgIGdlbmVyYXRlX3NlcnZpY2VfbWV0aG9kX3NpZ25hdHVyZV9ub3JtYWwodGZ1bmN0aW9uLCBpc19pbnRlcmZhY2UpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBtZXRob2QgaGVhZGVyIGluICJub3JtYWwiIHN0eWxlCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgc2VydmljZSBmdW5jdGlvbiB0byBnZW5lcmF0ZSBjb2RlIGZvci4KKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX21ldGhvZF9zaWduYXR1cmVfbm9ybWFsKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2ludGVyZmFjZSkgeworICBpZiAoaXNfaW50ZXJmYWNlKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9ub3JtYWwodGZ1bmN0aW9uKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlX25vcm1hbCh0ZnVuY3Rpb24pIDw8ICIgeyIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgbWV0aG9kIGhlYWRlciBpbiAiY2FsbGJhY2siIHN0eWxlCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgc2VydmljZSBmdW5jdGlvbiB0byBnZW5lcmF0ZSBjb2RlIGZvci4KKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX21ldGhvZF9zaWduYXR1cmVfY2FsbGJhY2sodF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19pbnRlcmZhY2UpIHsKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgc3RkOjpzdHJpbmcgb25fc3VjY2Vzc19pbXBsID0gZ2VuZXJhdGVfc2VydmljZV9tZXRob2Rfb25zdWNjZXNzKHRmdW5jdGlvbiwgZmFsc2UsIGZhbHNlKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIi8vIGZ1bmN0aW9uIG9uRXJyb3IoRHluYW1pYykgOiBWb2lkOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIi8vIGZ1bmN0aW9uICIgPDwgb25fc3VjY2Vzc19pbXBsLmNfc3RyKCkgPDwgIjsiIDw8IGVuZGw7CisgIH0KKworICBpZiAoaXNfaW50ZXJmYWNlKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9jYWxsYmFjayh0ZnVuY3Rpb24pIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmVfY2FsbGJhY2sodGZ1bmN0aW9uKSA8PCAiIHsiIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGludGVyZmFjZSBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuZHNfaWZhY2UgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzX2lmYWNlID0gIiBleHRlbmRzICIgKyB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKTsKKyAgfQorCisgIGdlbmVyYXRlX2hheGVfZG9jKGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKKyAgLy8gZ2VuZXJhdGVfcnR0aV9kZWNvcmF0aW9uKGZfc2VydmljZV8pOyAtIG5vdCB5ZXQsIGJlY2F1c2Ugb2YKKyAgLy8gaHR0cHM6Ly9naXRodWIuY29tL0hheGVGb3VuZGF0aW9uL2hheGUvaXNzdWVzLzM2MjYKKyAgZ2VuZXJhdGVfbWFjcm9fZGVjb3JhdGlvbihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaW50ZXJmYWNlICIgPDwgZ2V0X2NhcF9uYW1lKHNlcnZpY2VfbmFtZV8pIDw8IGV4dGVuZHNfaWZhY2UgPDwgIiB7IgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX2hheGVfZG9jKGZfc2VydmljZV8sICpmX2l0ZXIpOworICAgIGdlbmVyYXRlX3NlcnZpY2VfbWV0aG9kX3NpZ25hdHVyZSgqZl9pdGVyLCB0cnVlKTsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHN0cnVjdHMgZm9yIGFsbCB0aGUgc2VydmljZSBhcmdzIGFuZCByZXR1cm4gdHlwZXMKKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UKKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwgZW5kbDsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIGdlbmVyYXRlX2hheGVfc3RydWN0KHRzLCBmYWxzZSk7CisgICAgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSBnZXRfY2FwX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkpOworICAgIGV4dGVuZHNfY2xpZW50ID0gIiBleHRlbmRzICIgKyBleHRlbmRzICsgIkltcGwiOworICB9CisKKyAgZ2VuZXJhdGVfcnR0aV9kZWNvcmF0aW9uKGZfc2VydmljZV8pOworICAvLyBidWlsZCBtYWNybyBpcyBpbmhlcml0ZWQgZnJvbSBpbnRlcmZhY2UKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJjbGFzcyAiIDw8IGdldF9jYXBfbmFtZShzZXJ2aWNlX25hbWVfKSA8PCAiSW1wbCIgPDwgZXh0ZW5kc19jbGllbnQKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgaW1wbGVtZW50cyAiIDw8IGdldF9jYXBfbmFtZShzZXJ2aWNlX25hbWVfKSA8PCAiIHsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgZnVuY3Rpb24gbmV3KCBpcHJvdCA6IFRQcm90b2NvbCwgb3Byb3QgOiBUUHJvdG9jb2wgPSBudWxsKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpcHJvdF8gPSBpcHJvdDsiIDw8IGVuZGw7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKG9wcm90ID09IG51bGwpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3RfID0gaXByb3Q7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3RfID0gb3Byb3Q7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzdXBlcihpcHJvdCwgb3Byb3QpOyIgPDwgZW5kbDsKKyAgfQorICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInByaXZhdGUgdmFyIGlwcm90XyA6IFRQcm90b2NvbDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJwcml2YXRlIHZhciBvcHJvdF8gOiBUUHJvdG9jb2w7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAicHJpdmF0ZSB2YXIgc2VxaWRfIDogSW50OyIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgZnVuY3Rpb24gZ2V0SW5wdXRQcm90b2NvbCgpIDogVFByb3RvY29sIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIHRoaXMuaXByb3RfOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGZ1bmN0aW9uIGdldE91dHB1dFByb3RvY29sKCkgOiBUUHJvdG9jb2wiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gdGhpcy5vcHJvdF87IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICB9CisKKyAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisKKyAgICAvLyBPcGVuIGZ1bmN0aW9uCisgICAgZ2VuZXJhdGVfc2VydmljZV9tZXRob2Rfc2lnbmF0dXJlKCpmX2l0ZXIsIGZhbHNlKTsKKworICAgIGluZGVudF91cCgpOworCisgICAgLy8gR2V0IHRoZSBzdHJ1Y3Qgb2YgZnVuY3Rpb24gY2FsbCBwYXJhbXMKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKworICAgIHN0cmluZyBhcmdzbmFtZSA9IGdldF9jYXBfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworCisgICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0CisgICAgc3RyaW5nIGNhbGx0eXBlID0gKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJPTkVXQVkiIDogIkNBTEwiOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90Xy53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoXCIiIDw8IGZ1bm5hbWUKKyAgICAgICAgICAgICAgIDw8ICJcIiwgVE1lc3NhZ2VUeXBlLiIgPDwgY2FsbHR5cGUgPDwgIiwgc2VxaWRfKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAidmFyIGFyZ3MgOiAiIDw8IGFyZ3NuYW1lIDw8ICIgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsOworCisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3MuIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIgorICAgICAgICAgICAgICAgICA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzLndyaXRlKG9wcm90Xyk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAib3Byb3RfLndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKworICAgIGlmICghKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkgfHwgKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ2YXIgcmV0dmFsIDogIiA8PCB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSA8PCAiOyIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpZiAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3RfLmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm9wcm90Xy5nZXRUcmFuc3BvcnQoKS5mbHVzaChmdW5jdGlvbihlcnJvcjpEeW5hbWljKSA6IFZvaWQgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaWYgKGNhbGxiYWNrc18pIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ0cnkgeyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICB9CisgICAgICBzdHJpbmcgcmVzdWx0bmFtZSA9IGdldF9jYXBfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAoZXJyb3IgIT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaWYgKGNhbGxiYWNrc18pIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAob25FcnJvciAhPSBudWxsKSBvbkVycm9yKGVycm9yKTsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidGhyb3cgZXJyb3I7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidmFyIG1zZyA6IFRNZXNzYWdlID0gaXByb3RfLnJlYWRNZXNzYWdlQmVnaW4oKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmIChtc2cudHlwZSA9PSBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInZhciB4ID0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uLnJlYWQoaXByb3RfKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlwcm90Xy5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKyAgICAgIGlmIChjYWxsYmFja3NfKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKG9uRXJyb3IgIT0gbnVsbCkgb25FcnJvcih4KTsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidGhyb3cgeDsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ2YXIgcmVzdWx0IDogIiA8PCByZXN1bHRuYW1lIDw8ICIgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmVzdWx0LnJlYWQoaXByb3RfKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlwcm90Xy5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKworICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKHJlc3VsdC4iIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCJzdWNjZXNzIikgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGlmIChjYWxsYmFja3NfKSB7CisgICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAob25TdWNjZXNzICE9IG51bGwpIG9uU3VjY2VzcyhyZXN1bHQuc3VjY2Vzcyk7IiA8PCBlbmRsOworICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHZhbCA9IHJlc3VsdC5zdWNjZXNzOyIgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmIChyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgaWYgKGNhbGxiYWNrc18pIHsKKyAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmIChvbkVycm9yICE9IG51bGwpIG9uRXJyb3IocmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ0aHJvdyByZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICAvLyBJZiB5b3UgZ2V0IGhlcmUgaXQncyBhbiBleGNlcHRpb24sIHVubGVzcyBhIHZvaWQgZnVuY3Rpb24KKyAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBpZiAoY2FsbGJhY2tzXykgeworICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKG9uU3VjY2VzcyAhPSBudWxsKSBvblN1Y2Nlc3MoKTsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGNhbGxiYWNrc18pIHsKKyAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmIChvbkVycm9yICE9IG51bGwpIiA8PCBlbmRsOworICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKQorICAgICAgICAgICAgICA8PCAib25FcnJvciggbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uTUlTU0lOR19SRVNVTFQsIiA8PCBlbmRsOworICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0XCIpKTsiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykKKyAgICAgICAgICAgICAgPDwgInRocm93IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLk1JU1NJTkdfUkVTVUxULCIgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKTsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGNhbGxiYWNrc18pIHsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IGNhdGNoKCBlIDogVEV4Y2VwdGlvbikgeyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKG9uRXJyb3IgIT0gbnVsbCkgb25FcnJvcihlKTsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSk7IiA8PCBlbmRsOworICAgIH0KKworICAgIGlmICghKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkgfHwgKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gcmV0dmFsOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBDbG9zZSBmdW5jdGlvbgorICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIC8vIEV4dGVuZHMgc3R1ZmYKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfcHJvY2Vzc29yID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IGdldF9jYXBfbmFtZSh0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpKTsKKyAgICBleHRlbmRzX3Byb2Nlc3NvciA9ICIgZXh0ZW5kcyAiICsgZXh0ZW5kcyArICJQcm9jZXNzb3IiOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCisgIGdlbmVyYXRlX3J0dGlfZGVjb3JhdGlvbihmX3NlcnZpY2VfKTsKKyAgZ2VuZXJhdGVfbWFjcm9fZGVjb3JhdGlvbihmX3NlcnZpY2VfKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJjbGFzcyAiIDw8IGdldF9jYXBfbmFtZShzZXJ2aWNlX25hbWVfKSA8PCAiUHJvY2Vzc29yIiA8PCBleHRlbmRzX3Byb2Nlc3NvcgorICAgICAgICAgICAgICAgICAgICAgPDwgIiBpbXBsZW1lbnRzIFRQcm9jZXNzb3IgeyIgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwcml2YXRlIHZhciAiIDw8IGdldF9jYXBfbmFtZShzZXJ2aWNlX25hbWVfKQorICAgICAgICAgICAgIDw8ICJfaWZhY2VfIDogIiA8PCBnZXRfY2FwX25hbWUoc2VydmljZV9uYW1lXykgPDwgIjsiIDw8IGVuZGw7CisKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJwcml2YXRlIHZhciBQUk9DRVNTX01BUCA9IG5ldyBTdHJpbmdNYXA8IEludC0+VFByb3RvY29sLT5UUHJvdG9jb2wtPlZvaWQgPigpOyIKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgZnVuY3Rpb24gbmV3KCBpZmFjZSA6ICIgPDwgZ2V0X2NhcF9uYW1lKHNlcnZpY2VfbmFtZV8pIDw8ICIpIgorICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAic3VwZXIoaWZhY2UpOyIgPDwgZW5kbDsKKyAgfQorICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGdldF9jYXBfbmFtZShzZXJ2aWNlX25hbWVfKSA8PCAiX2lmYWNlXyA9IGlmYWNlOyIgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIlBST0NFU1NfTUFQLnNldChcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiwgIgorICAgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoKSk7IiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBzZXJ2ZXIgaW1wbGVtZW50YXRpb24KKyAgc3RyaW5nIG92ZXJyaWRlID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgb3ZlcnJpZGUgPSAib3ZlcnJpZGUgIjsKKyAgfQorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgb3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgIDw8ICJwdWJsaWMgZnVuY3Rpb24gcHJvY2VzcyggaXByb3QgOiBUUHJvdG9jb2wsIG9wcm90IDogVFByb3RvY29sKSA6IEJvb2wiCisgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ2YXIgbXNnIDogVE1lc3NhZ2UgPSBpcHJvdC5yZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsOworCisgIC8vIFRPRE8obWNzbGVlKTogdmFsaWRhdGUgbWVzc2FnZSwgd2FzIHRoZSBzZXFpZCBldGMuIGxlZ2l0PworICAvLyBBUy0gSWYgYWxsIG1ldGhvZCBpcyBvbmV3YXk6CisgIC8vIGRvIHlvdSBoYXZlIGFuIG9wcm90PworICAvLyBkbyB5b3UgeW91IG5lZWQgbnVsbGNoZWNrPworICBmX3NlcnZpY2VfCisgICAgICA8PCBpbmRlbnQoKSA8PCAidmFyIGZuICA9IFBST0NFU1NfTUFQLmdldChtc2cubmFtZSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiaWYgKGZuID09IG51bGwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBUVHlwZS5TVFJVQ1QpOyIKKyAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgaXByb3QucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICIgIHZhciB4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uVU5LTk9XTl9NRVRIT0QsIFwiSW52YWxpZCAiCisgICAgICAgICAibWV0aG9kIG5hbWU6ICdcIittc2cubmFtZStcIidcIik7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiICBvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UobXNnLm5hbWUsIFRNZXNzYWdlVHlwZS5FWENFUFRJT04sIG1zZy5zZXFpZCkpOyIKKyAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgeC53cml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIKKyAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgb3Byb3QuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICIgIHJldHVybiB0cnVlOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgImZuKCBtc2cuc2VxaWQsIGlwcm90LCBvcHJvdCk7IiA8PCBlbmRsOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiB0cnVlOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIHN0cmluZyByZXN1bHRuYW1lID0gZ2V0X2NhcF9uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7CisgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgcmVzdWx0bmFtZSk7CisgIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7CisgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKKyAgfQorCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7CisgIH0KKworICBnZW5lcmF0ZV9oYXhlX3N0cnVjdCgmcmVzdWx0LCBmYWxzZSwgdHJ1ZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICAodm9pZCl0c2VydmljZTsKKyAgLy8gT3BlbiBjbGFzcworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByaXZhdGUgZnVuY3Rpb24gIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIoKSA6IEludC0+VFByb3RvY29sLT5UUHJvdG9jb2wtPlZvaWQgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gT3BlbiBmdW5jdGlvbgorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiBmdW5jdGlvbiggc2VxaWQgOiBJbnQsIGlwcm90IDogVFByb3RvY29sLCBvcHJvdCA6IFRQcm90b2NvbCkgOiBWb2lkIgorICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgc3RyaW5nIGFyZ3NuYW1lID0gZ2V0X2NhcF9uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyIpOworICBzdHJpbmcgcmVzdWx0bmFtZSA9IGdldF9jYXBfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInZhciBhcmdzIDogIiA8PCBhcmdzbmFtZSA8PCAiID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJhcmdzLnJlYWQoaXByb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaXByb3QucmVhZE1lc3NhZ2VFbmQoKTsiCisgICAgICAgICAgICAgPDwgZW5kbDsKKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworCisgIC8vIERlY2xhcmUgcmVzdWx0IGZvciBub24gb25ld2F5IGZ1bmN0aW9uCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInZhciByZXN1bHQgOiAiIDw8IHJlc3VsdG5hbWUgPDwgIiA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0KKworICAvLyBUcnkgYmxvY2sgZm9yIGFueSAgZnVuY3Rpb24gdG8gY2F0Y2ggKGRlZmluZWQgb3IgdW5kZWZpbmVkKSBleGNlcHRpb25zCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRyeSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAoY2FsbGJhY2tzXykgeworICAgIC8vIGNhbGxiYWNrIGZ1bmN0aW9uIHN0eWxlIG9uRXJyb3Ivb25TdWNjZXNzCisKKyAgICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAorICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICAgIGZfc2VydmljZV8gPDwgZ2V0X2NhcF9uYW1lKHNlcnZpY2VfbmFtZV8pIDw8ICJfaWZhY2VfLiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8ICJhcmdzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIH0KKworICAgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7CisgICAgICB9CisgICAgICBzdHJpbmcgb25fc3VjY2VzcyA9IGdlbmVyYXRlX3NlcnZpY2VfbWV0aG9kX29uc3VjY2Vzcyh0ZnVuY3Rpb24sIGZhbHNlLCB0cnVlKTsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJudWxsLCAgLy8gZXJyb3JzIGFyZSB0aHJvd24gYnkgdGhlIGhhbmRsZXIiIDw8IGVuZGw7CisgICAgICBpZiAodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJudWxsKTsgLy8gbm8gcmV0dmFsIiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJmdW5jdGlvbiIgPDwgb25fc3VjY2Vzcy5jX3N0cigpIDw8ICIgeyIgPDwgZW5kbDsKKyAgICAgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmVzdWx0LnN1Y2Nlc3MgPSByZXR2YWw7IiA8PCBlbmRsOworICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIH0KKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9KTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnRfZG93bigpOworICAgIH0KKworICB9IGVsc2UgeworICAgIC8vIG5vcm1hbCBmdW5jdGlvbigpOnJlc3VsdCBzdHlsZQorCisgICAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgICBpZiAoISh0ZnVuY3Rpb24tPmlzX29uZXdheSgpIHx8IHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCAicmVzdWx0LnN1Y2Nlc3MgPSAiOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8IGdldF9jYXBfbmFtZShzZXJ2aWNlX25hbWVfKSA8PCAiX2lmYWNlXy4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IjsKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgLy8gY2F0Y2ggZXhjZXB0aW9ucyBkZWZpbmVkIGluIHRoZSBJREwKKyAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiIGNhdGNoICgiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOiIKKyAgICAgICAgICAgICAgICAgPDwgZ2V0X2NhcF9uYW1lKHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSkpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIgorICAgICAgICAgICAgICAgICAgIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSI7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfIDw8ICJ9IjsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBhbHdheXMgY2F0Y2ggYWxsIGV4Y2VwdGlvbnMgdG8gcHJldmVudCBmcm9tIHNlcnZpY2UgZGVuaWFsCisgIGZfc2VydmljZV8gPDwgIiBjYXRjaCAodGggOiBEeW5hbWljKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ0cmFjZShcIkludGVybmFsIGVycm9yIHByb2Nlc3NpbmcgIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiLCB0aCk7IgorICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ2YXIgeCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLklOVEVSTkFMX0VSUk9SLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJcIkludGVybmFsIGVycm9yIHByb2Nlc3NpbmcgIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiXCIsIFRNZXNzYWdlVHlwZS5FWENFUFRJT04sIHNlcWlkKSk7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAieC53cml0ZShvcHJvdCk7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAib3Byb3QuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIC8vIFNob3J0Y3V0IG91dCBoZXJlIGZvciBvbmV3YXkgZnVuY3Rpb25zCisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworCisgICAgLy8gQ2xvc2UgY2xhc3MKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICByZXR1cm47CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgIDw8ICJcIiwgVE1lc3NhZ2VUeXBlLlJFUExZLCBzZXFpZCkpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LndyaXRlKG9wcm90KTsiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIm9wcm90LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7IiA8PCBlbmRsOworCisgIC8vIENsb3NlIGZ1bmN0aW9uCisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAvLyBDbG9zZSBjbGFzcworICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCisgKgorICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQKKyAqIEBwYXJhbSBwcmVmaXggVGhlIHZhcmlhYmxlIG5hbWUgb3IgY29udGFpbmVyIGZvciB0aGlzIGZpZWxkCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgfQorCisgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworCisgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gaXByb3QuIjsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICAgIG91dCA8PCAicmVhZEJpbmFyeSgpOyI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nKCk7IjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgb3V0IDw8ICJyZWFkQm9vbCgpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8ICJyZWFkQnl0ZSgpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCAicmVhZEkxNigpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIG91dCA8PCAicmVhZEkzMigpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAicmVhZEk2NCgpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIG91dCA8PCAicmVhZERvdWJsZSgpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBIYXhlIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJyZWFkSTMyKCk7IjsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHN0cnVjdCwgaW52b2tlcyByZWFkKCkKKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IGdldF9jYXBfbmFtZSh0eXBlX25hbWUodHN0cnVjdCkpIDw8ICIoKTsiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiLnJlYWQoaXByb3QpOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBjb250YWluZXIgYnkgcmVhZGluZyBpdHMgc2l6ZSBhbmQgdGhlbiBpdGVyYXRpbmcKKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgc3RyaW5nIG9iajsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgb2JqID0gdG1wKCJfbWFwIik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgb2JqID0gdG1wKCJfc2V0Iik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIG9iaiA9IHRtcCgiX2xpc3QiKTsKKyAgfQorCisgIC8vIERlY2xhcmUgdmFyaWFibGVzLCByZWFkIGhlYWRlcgorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgInZhciAiIDw8IG9iaiA8PCAiID0gaXByb3QucmVhZE1hcEJlZ2luKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJ2YXIgIiA8PCBvYmogPDwgIiA9IGlwcm90LnJlYWRTZXRCZWdpbigpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgInZhciAiIDw8IG9iaiA8PCAiID0gaXByb3QucmVhZExpc3RCZWdpbigpOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkKKyAgICAgICAgICAgICAgLy8gc2l6ZSB0aGUgY29sbGVjdGlvbiBjb3JyZWN0bHkKKyAgICAgICAgICAgICAgPDwgIigiCisgICAgICAgICAgICAgIDw8ICIpOyIgPDwgZW5kbDsKKworICAvLyBGb3IgbG9vcCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCisgIHN0cmluZyBpID0gdG1wKCJfaSIpOworICBpbmRlbnQob3V0KSA8PCAiZm9yKCAiIDw8IGkgPDwgIiBpbiAwIC4uLiAiIDw8IG9iaiA8PCAiLnNpemUpIiA8PCBlbmRsOworCisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgcHJlZml4KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgpOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIC8vIFJlYWQgY29udGFpbmVyIGVuZAorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRNYXBFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRTZXRFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTGlzdEVuZCgpOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgY29kZSB0byBkZXNlcmlhbGl6ZSBhIG1hcAorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGtleSA9IHRtcCgiX2tleSIpOworICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7CisgIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKKyAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOworCisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZrZXkpIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZ2YWwpIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSk7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwpOworCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLnNldCggIiA8PCBrZXkgPDwgIiwgIiA8PCB2YWwgPDwgIik7IiA8PCBlbmRsOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIHNldCBlbGVtZW50CisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworCisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5hZGQoIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBsaXN0IGVsZW1lbnQKKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmVsZW0pIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOworCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLmFkZCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworCisgIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworCisgICAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LiI7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgICBvdXQgPDwgIndyaXRlQmluYXJ5KCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAid3JpdGVCb29sKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAid3JpdGVCeXRlKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgIndyaXRlSTE2KCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgIndyaXRlSTY0KCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgIndyaXRlRG91YmxlKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gSGF4ZSBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSBGSUVMRCAnJXMlcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICBwcmVmaXguY19zdHIoKSwKKyAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKKyAgfQorfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCisgKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7CisgICh2b2lkKXRzdHJ1Y3Q7CisgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIi53cml0ZShvcHJvdCk7IiA8PCBlbmRsOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYSBjb250YWluZXIgYnkgd3JpdGluZyBpdHMgc2l6ZSB0aGVuIHRoZSBlbGVtZW50cy4KKyAqCisgKiBAcGFyYW0gdHR5cGUgIFRoZSB0eXBlIG9mIGNvbnRhaW5lcgorICogQHBhcmFtIHByZWZpeCBTdHJpbmcgcHJlZml4IGZvciBmaWVsZHMKKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgeworICBzY29wZV91cChvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBzdHJpbmcgaXRlciA9IHRtcCgiX2tleSIpOworICAgIHN0cmluZyBjb3VudGVyID0gdG1wKCJfc2l6ZUNvdW50ZXIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAidmFyICIgPDwgY291bnRlciA8PCAiIDogSW50ID0gMDsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgImZvciggIiA8PCBpdGVyIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIikgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICAiIDw8IGNvdW50ZXIgPDwgKyIrKzsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVNYXBCZWdpbihuZXcgVE1hcCgiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKQorICAgICAgICAgICAgICAgIDw8ICIsICIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIgPDwgY291bnRlciA8PCAiKSk7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlU2V0QmVnaW4obmV3IFRTZXQoIiA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpCisgICAgICAgICAgICAgICAgPDwgIiwgIiA8PCBwcmVmaXggPDwgIi5zaXplKSk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVMaXN0QmVnaW4obmV3IFRMaXN0KCIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8IHByZWZpeCA8PCAiLmxlbmd0aCkpOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICB9CisKKyAgc3RyaW5nIGl0ZXIgPSB0bXAoImVsZW0iKTsKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJmb3IoICIgPDwgaXRlciA8PCAiIGluICIgPDwgcHJlZml4IDw8ICIua2V5cygpKSIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yKCAiIDw8IGl0ZXIgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiLnRvQXJyYXkoKSkiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJmb3IoICIgPDwgaXRlciA8PCAiIGluICIgPDwgcHJlZml4IDw8ICIpIiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfdXAob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgaXRlciwgcHJlZml4KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyKTsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlTWFwRW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVNldEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlTGlzdEVuZCgpOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgorICovCit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG1hcCkgeworICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsICIiKTsKKyAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIG1hcCArICIuZ2V0KCIgKyBpdGVyICsgIikiKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCwgIiIpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBzZXQuCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBpdGVyKSB7CisgIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbGlzdC4KKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKK30KKworLyoqCisgKiBSZXR1cm5zIGEgaGF4ZSB0eXBlIG5hbWUKKyAqCisgKiBAcGFyYW0gdHR5cGUgVGhlIHR5cGUKKyAqIEBwYXJhbSBjb250YWluZXIgSXMgdGhlIHR5cGUgZ29pbmcgaW5zaWRlIGEgY29udGFpbmVyPworICogQHJldHVybiBoYXhlIHR5cGUgbmFtZSwgaS5lLiBIYXNoTWFwPEtleSxWYWx1ZT4KKyAqLworc3RyaW5nIHRfaGF4ZV9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGluX2NvbnRhaW5lciwgYm9vbCBpbl9pbml0KSB7CisgICh2b2lkKWluX2luaXQ7CisKKyAgLy8gdHlwZWRlZnMgYXJlIGp1c3QgcmVzb2x2ZWQgdG8gdGhlaXIgcmVhbCB0eXBlCisgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisgIHN0cmluZyBwcmVmaXg7CisKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHJldHVybiBiYXNlX3R5cGVfbmFtZSgodF9iYXNlX3R5cGUqKXR0eXBlLCBpbl9jb250YWluZXIpOworICB9CisKKyAgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIkludCI7CisgIH0KKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF90eXBlKiB0a2V5ID0gZ2V0X3RydWVfdHlwZSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKTsKKyAgICB0X3R5cGUqIHR2YWwgPSBnZXRfdHJ1ZV90eXBlKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpOworICAgIGlmICh0a2V5LT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXRrZXkpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIGlmICghKHRrZXktPmlzX2JpbmFyeSgpKSkgeworICAgICAgICAgIHJldHVybiAiU3RyaW5nTWFwPCAiICsgdHlwZV9uYW1lKHR2YWwpICsgIj4iOworICAgICAgICB9CisgICAgICAgIGJyZWFrOyAvLyBkZWZhdWx0IHRvIE9iamVjdE1hcDw+CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgcmV0dXJuICJJbnRNYXA8ICIgKyB0eXBlX25hbWUodHZhbCkgKyAiPiI7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgcmV0dXJuICJJbnQ2NE1hcDwgIiArIHR5cGVfbmFtZSh0dmFsKSArICI+IjsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOyAvLyBkZWZhdWx0IHRvIE9iamVjdE1hcDw+CisgICAgICB9CisgICAgfQorICAgIGlmICh0a2V5LT5pc19lbnVtKCkpIHsKKyAgICAgIHJldHVybiAiSW50TWFwPCAiICsgdHlwZV9uYW1lKHR2YWwpICsgIj4iOworICAgIH0KKyAgICByZXR1cm4gIk9iamVjdE1hcDwgIiArIHR5cGVfbmFtZSh0a2V5KSArICIsICIgKyB0eXBlX25hbWUodHZhbCkgKyAiPiI7CisgIH0KKworICBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF90eXBlKiB0a2V5ID0gZ2V0X3RydWVfdHlwZSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSk7CisgICAgaWYgKHRrZXktPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdGtleSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKCEodGtleS0+aXNfYmluYXJ5KCkpKSB7CisgICAgICAgICAgcmV0dXJuICJTdHJpbmdTZXQiOworICAgICAgICB9CisgICAgICAgIGJyZWFrOyAvLyBkZWZhdWx0IHRvIE9iamVjdFNldAorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIHJldHVybiAiSW50U2V0IjsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICByZXR1cm4gIkludDY0U2V0IjsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOyAvLyBkZWZhdWx0IHRvIE9iamVjdFNldAorICAgICAgfQorICAgIH0KKyAgICBpZiAodGtleS0+aXNfZW51bSgpKSB7CisgICAgICByZXR1cm4gIkludFNldCI7CisgICAgfQorICAgIHJldHVybiAiT2JqZWN0U2V0PCAiICsgdHlwZV9uYW1lKHRrZXkpICsgIj4iOworICB9CisKKyAgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICB0X3R5cGUqIHRlbG0gPSAoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgcmV0dXJuICJMaXN0PCAiICsgdHlwZV9uYW1lKHRlbG0pICsgIj4iOworICB9CisKKyAgLy8gQ2hlY2sgZm9yIG5hbWVzcGFjaW5nCisgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOworICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKKyAgICBzdHJpbmcgcGFja2FnZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImhheGUiKTsKKyAgICBpZiAoIXBhY2thZ2UuZW1wdHkoKSkgeworICAgICAgcmV0dXJuIHBhY2thZ2UgKyAiLiIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gdHR5cGUtPmdldF9uYW1lKCk7Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgaGF4ZSB0eXBlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHRocmlmdCB0eXBlLgorICoKKyAqIEBwYXJhbSB0YmFzZSBUaGUgYmFzZSB0eXBlCisgKiBAcGFyYW0gY29udGFpbmVyIElzIGl0IGdvaW5nIGluIGEgaGF4ZSBjb250YWluZXI/CisgKi8KK3N0cmluZyB0X2hheGVfZ2VuZXJhdG9yOjpiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdHlwZSwgYm9vbCBpbl9jb250YWluZXIpIHsKKyAgKHZvaWQpaW5fY29udGFpbmVyOworICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gdHlwZS0+Z2V0X2Jhc2UoKTsKKworICBzd2l0Y2ggKHRiYXNlKSB7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICByZXR1cm4gIlZvaWQiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIHJldHVybiAiaGF4ZS5pby5CeXRlcyI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAiU3RyaW5nIjsKKyAgICB9CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICByZXR1cm4gIkJvb2wiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgcmV0dXJuICJoYXhlLkludDMyIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgcmV0dXJuICJoYXhlLkludDY0IjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgcmV0dXJuICJGbG9hdCI7CisgIGRlZmF1bHQ6CisgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBIYXhlIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgfQorfQorCisvKioKKyAqIERlY2xhcmVzIGEgZmllbGQsIHdoaWNoIG1heSBpbmNsdWRlIGluaXRpYWxpemF0aW9uIGFzIG5lY2Vzc2FyeS4KKyAqCisgKiBAcGFyYW0gdHR5cGUgVGhlIHR5cGUKKyAqLworc3RyaW5nIHRfaGF4ZV9nZW5lcmF0b3I6OmRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQpIHsKKyAgLy8gVE9ETyhtY3NsZWUpOiBkbyB3ZSBldmVyIG5lZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGQ/CisgIHN0cmluZyByZXN1bHQgPSAidmFyICIgKyB0ZmllbGQtPmdldF9uYW1lKCkgKyAiIDogIiArIHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpOworICBpZiAoaW5pdCkgeworICAgIHRfdHlwZSogdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiB0ZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKKyAgICAgIHN0ZDo6b2ZzdHJlYW0gZHVtbXk7CisgICAgICByZXN1bHQgKz0gIiA9ICIgKyByZW5kZXJfY29uc3RfdmFsdWUoZHVtbXksIHRmaWVsZC0+Z2V0X25hbWUoKSwgdHR5cGUsIHRmaWVsZC0+Z2V0X3ZhbHVlKCkpOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIHJlc3VsdCArPSAiID0gZmFsc2UiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIHJlc3VsdCArPSAiID0gMCI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIHJlc3VsdCArPSAiID0gKGRvdWJsZSkwIjsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIHJlc3VsdCArPSAiID0gMCI7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKSArICIoKSI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKSArICIoKSI7CisgICAgfQorICB9CisgIHJldHVybiByZXN1bHQgKyAiOyI7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJworICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCitzdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlX2NhbGxiYWNrKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBzdGQ6OnN0cmluZyBvbl9lcnJvcl9zdWNjZXNzID0gIm9uRXJyb3IgOiBEeW5hbWljLT5Wb2lkID0gbnVsbCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBnZW5lcmF0ZV9zZXJ2aWNlX21ldGhvZF9vbnN1Y2Nlc3ModGZ1bmN0aW9uLCB0cnVlLCBmYWxzZSk7CisKKyAgc3RkOjpzdHJpbmcgYXJndW1lbnRzID0gYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpOworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBpZiAoYXJndW1lbnRzICE9ICIiKSB7CisgICAgICBhcmd1bWVudHMgKz0gIiwgIjsKKyAgICB9CisgICAgYXJndW1lbnRzICs9IG9uX2Vycm9yX3N1Y2Nlc3M7IC8vIm9uRXJyb3IgOiBGdW5jdGlvbiwgb25TdWNjZXNzIDogRnVuY3Rpb24iOworICB9CisKKyAgc3RkOjpzdHJpbmcgcmVzdWx0ID0gImZ1bmN0aW9uICIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiKCIgKyBhcmd1bWVudHMgKyAiKSA6IFZvaWQiOworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RyaW5nIHRfaGF4ZV9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZV9ub3JtYWwodF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50cyA9IGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKTsKKworICBzdGQ6OnN0cmluZyByZXN1bHR0eXBlOworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSB8fCB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIHJlc3VsdHR5cGUgPSAiVm9pZCI7CisgIH0gZWxzZSB7CisgICAgcmVzdWx0dHlwZSA9IHR5cGVfbmFtZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpOworICB9CisKKyAgc3RkOjpzdHJpbmcgcmVzdWx0ID0gImZ1bmN0aW9uICIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiKCIgKyBhcmd1bWVudHMgKyAiKSA6ICIgKyByZXN1bHR0eXBlOworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIFJlbmRlcnMgYSBjb21tYSBzZXBhcmF0ZWQgZmllbGQgbGlzdCwgd2l0aCB0eXBlIG5hbWVzCisgKi8KK3N0cmluZyB0X2hheGVfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICIsICI7CisgICAgfQorICAgIHJlc3VsdCArPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiIDogIiArIHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCkpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBDKysgZW51bSBzdHJpbmcgZm9yIHRoZSBnaXZlbiB0eXBlLgorICovCitzdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiVFR5cGUuU1RSSU5HIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIlRUeXBlLkJPT0wiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIlRUeXBlLkJZVEUiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJUVHlwZS5JMTYiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJUVHlwZS5JMzIiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJUVHlwZS5JNjQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJUVHlwZS5ET1VCTEUiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiVFR5cGUuU1RSVUNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiVFR5cGUuTUFQIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiVFR5cGUuU0VUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLkxJU1QiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCisvKioKKyAqIEhheGUgY2xhc3MgbmFtZXMgbXVzdCBzdGFydCB3aXRoIHVwcGVyY2FzZSBsZXR0ZXIsIGJ1dCBIYXhlIG5hbWVzcGFjZXMgbXVzdCBub3QuCisgKi8KK3N0ZDo6c3RyaW5nIHRfaGF4ZV9nZW5lcmF0b3I6OmdldF9jYXBfbmFtZShzdGQ6OnN0cmluZyBuYW1lKSB7CisgIGlmIChuYW1lLmxlbmd0aCgpID09IDApIHsKKyAgICByZXR1cm4gbmFtZTsKKyAgfQorCisgIC8vIHRlc3QuZm9yLkdlbmVyaWM8IGRhdGEuVHlwZSwgb3IudGhlLkxpa2U+IGFuZCBoYW5kbGUgaXQgcmVjdXJzaXZlbHkKKyAgc2l6ZV90IGdlbmVyaWNfZmlyc3QgPSBuYW1lLmZpbmQoJzwnKTsKKyAgc2l6ZV90IGdlbmVyaWNfbGFzdCA9IG5hbWUucmZpbmQoJz4nKTsKKyAgaWYgKChnZW5lcmljX2ZpcnN0ICE9IHN0ZDo6c3RyaW5nOjpucG9zKSAmJiAoZ2VuZXJpY19sYXN0ICE9IHN0ZDo6c3RyaW5nOjpucG9zKSkgeworICAgIHN0cmluZyBvdXRlcl90eXBlID0gbmFtZS5zdWJzdHIoMCwgZ2VuZXJpY19maXJzdCk7CisgICAgc3RyaW5nIGlubmVyX3R5cGVzID0gbmFtZS5zdWJzdHIoZ2VuZXJpY19maXJzdCArIDEsIGdlbmVyaWNfbGFzdCAtIGdlbmVyaWNfZmlyc3QgLSAxKTsKKworICAgIHN0cmluZyBuZXdfaW5uZXIgPSAiIjsKKyAgICBzaXplX3QgY29tbWFfc3RhcnQgPSAwOworICAgIHdoaWxlIChjb21tYV9zdGFydCA8IGlubmVyX3R5cGVzLmxlbmd0aCgpKSB7CisgICAgICBzaXplX3QgY29tbWFfcG9zID0gY29tbWFfc3RhcnQ7CisgICAgICBpbnQgbmVzdGVkID0gMDsKKworICAgICAgd2hpbGUgKGNvbW1hX3BvcyA8IGlubmVyX3R5cGVzLmxlbmd0aCgpKSB7CisgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICAgICAgc3dpdGNoIChpbm5lcl90eXBlc1tjb21tYV9wb3NdKSB7CisgICAgICAgIGNhc2UgJzwnOgorICAgICAgICAgICsrbmVzdGVkOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICc+JzoKKyAgICAgICAgICAtLW5lc3RlZDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnLCc6CisgICAgICAgICAgZm91bmQgPSAobmVzdGVkID09IDApOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChmb3VuZCkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgICsrY29tbWFfcG9zOworICAgICAgfQorCisgICAgICBpZiAobmV3X2lubmVyLmxlbmd0aCgpID4gMCkgeworICAgICAgICBuZXdfaW5uZXIgKz0gIiwiOworICAgICAgfQorCisgICAgICBzdHJpbmcgaW5uZXIgPSBpbm5lcl90eXBlcy5zdWJzdHIoY29tbWFfc3RhcnQsIGNvbW1hX3BvcyAtIGNvbW1hX3N0YXJ0KTsKKyAgICAgIG5ld19pbm5lciArPSBnZXRfY2FwX25hbWUoaW5uZXIpOworICAgICAgY29tbWFfc3RhcnQgPSArK2NvbW1hX3BvczsKKyAgICB9CisKKyAgICByZXR1cm4gZ2V0X2NhcF9uYW1lKG91dGVyX3R5cGUpICsgIjwiICsgbmV3X2lubmVyICsgIj4iOworICB9CisKKyAgLy8gcGFja2FnZSBuYW1lCisgIHNpemVfdCBpbmRleCA9IG5hbWUuZmluZF9maXJzdF9ub3Rfb2YoIiBcblxyXHQiKTsKKyAgaWYgKGluZGV4IDwgbmFtZS5sZW5ndGgoKSkgeworICAgIG5hbWVbaW5kZXhdID0gdG9sb3dlcihuYW1lW2luZGV4XSk7CisgICAgaW5kZXggPSBuYW1lLmZpbmQoJy4nKTsKKyAgICB3aGlsZSAoaW5kZXggIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgIGlmICgrK2luZGV4IDwgbmFtZS5sZW5ndGgoKSkgeworICAgICAgICBuYW1lW2luZGV4XSA9IHRvbG93ZXIobmFtZVtpbmRleF0pOworICAgICAgfQorICAgICAgaW5kZXggPSBuYW1lLmZpbmQoJy4nLCBpbmRleCk7CisgICAgfQorICB9CisKKyAgLy8gY2xhc3MgbmFtZQorICBpbmRleCA9IG5hbWUucmZpbmQoJy4nKTsKKyAgaWYgKGluZGV4ICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgKytpbmRleDsKKyAgfSBlbHNlIHsKKyAgICBpbmRleCA9IG5hbWUuZmluZF9maXJzdF9ub3Rfb2YoIiBcblxyXHQiKTsKKyAgfQorCisgIGlmIChpbmRleCA8IG5hbWUubGVuZ3RoKCkpIHsKKyAgICBuYW1lW2luZGV4XSA9IHRvdXBwZXIobmFtZVtpbmRleF0pOworICB9CisKKyAgcmV0dXJuIG5hbWU7Cit9CisKK3N0cmluZyB0X2hheGVfZ2VuZXJhdG9yOjpjb25zdGFudF9uYW1lKHN0cmluZyBuYW1lKSB7CisgIHN0cmluZyBjb25zdGFudF9uYW1lOworCisgIGJvb2wgaXNfZmlyc3QgPSB0cnVlOworICBib29sIHdhc19wcmV2aW91c19jaGFyX3VwcGVyID0gZmFsc2U7CisgIGZvciAoc3RyaW5nOjppdGVyYXRvciBpdGVyID0gbmFtZS5iZWdpbigpOyBpdGVyICE9IG5hbWUuZW5kKCk7ICsraXRlcikgeworICAgIHN0cmluZzo6dmFsdWVfdHlwZSBjaGFyYWN0ZXIgPSAoKml0ZXIpOworCisgICAgYm9vbCBpc191cHBlciA9IGlzdXBwZXIoY2hhcmFjdGVyKTsKKworICAgIGlmIChpc191cHBlciAmJiAhaXNfZmlyc3QgJiYgIXdhc19wcmV2aW91c19jaGFyX3VwcGVyKSB7CisgICAgICBjb25zdGFudF9uYW1lICs9ICdfJzsKKyAgICB9CisgICAgY29uc3RhbnRfbmFtZSArPSB0b3VwcGVyKGNoYXJhY3Rlcik7CisKKyAgICBpc19maXJzdCA9IGZhbHNlOworICAgIHdhc19wcmV2aW91c19jaGFyX3VwcGVyID0gaXNfdXBwZXI7CisgIH0KKworICByZXR1cm4gY29uc3RhbnRfbmFtZTsKK30KKworLyoqCisgKiBFbmFibGVzIFJUVEkgZm9yIGEgY2xhc3Mgb3IgaW50ZXJmYWNlCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcnR0aV9kZWNvcmF0aW9uKG9zdHJlYW0mIG91dCkgeworICBpZiAocnR0aV8pIHsKKyAgICBvdXQgPDwgIkA6cnR0aSIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEFkZHMgYnVpbGQgbWFjcm9zIHRvIGEgY2xhc3Mgb3IgaW50ZXJmYWNlCisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbWFjcm9fZGVjb3JhdGlvbihvc3RyZWFtJiBvdXQpIHsKKyAgaWYgKCFidWlsZG1hY3JvXy5lbXB0eSgpKSB7CisgICAgb3V0IDw8ICIjaWYgISBtYWNybyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgIkA6YnVpbGQoICIgPDwgYnVpbGRtYWNyb18gPDwgIikiIDw8IGVuZGw7ICAgICAvLyBjdXJyZW50IGNsYXNzL2ludGVyZmFjZQorICAgIG91dCA8PCAiQDphdXRvQnVpbGQoICIgPDwgYnVpbGRtYWNyb18gPDwgIikiIDw8IGVuZGw7IC8vIGluaGVyaXRlZCBjbGFzc2VzL2ludGVyZmFjZXMKKyAgICBvdXQgPDwgIiNlbmQiIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBFbWl0cyBhIGhheGVEb2MgY29tbWVudCBpZiB0aGUgcHJvdmlkZWQgb2JqZWN0IGhhcyBhIGRvYyBpbiBUaHJpZnQKKyAqLwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oYXhlX2RvYyhvc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKSB7CisgIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKKyAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsICIvKipcbiIsICIgKiAiLCB0ZG9jLT5nZXRfZG9jKCksICIgKi9cbiIpOworICB9Cit9CisKKy8qKgorICogRW1pdHMgYSBoYXhlRG9jIGNvbW1lbnQgaWYgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIG9iamVjdCBoYXMgYSBkb2MgaW4gVGhyaWZ0CisgKi8KK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaGF4ZV9kb2Mob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgaWYgKHRmdW5jdGlvbi0+aGFzX2RvYygpKSB7CisgICAgc3RyaW5nc3RyZWFtIHNzOworICAgIHNzIDw8IHRmdW5jdGlvbi0+Z2V0X2RvYygpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBwX2l0ZXI7CisgICAgZm9yIChwX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgcF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytwX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIHAgPSAqcF9pdGVyOworICAgICAgc3MgPDwgIlxuQHBhcmFtICIgPDwgcC0+Z2V0X25hbWUoKTsKKyAgICAgIGlmIChwLT5oYXNfZG9jKCkpIHsKKyAgICAgICAgc3MgPDwgIiAiIDw8IHAtPmdldF9kb2MoKTsKKyAgICAgIH0KKyAgICB9CisgICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiLyoqXG4iLCAiICogIiwgc3Muc3RyKCksICIgKi9cbiIpOworICB9Cit9CisKK3N0ZDo6c3RyaW5nIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2lzc2V0X2NoZWNrKHRfZmllbGQqIGZpZWxkKSB7CisgIHJldHVybiBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZC0+Z2V0X25hbWUoKSk7Cit9CisKK3N0ZDo6c3RyaW5nIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2lzc2V0X2NoZWNrKHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUpIHsKKyAgcmV0dXJuICJpcyIgKyBnZXRfY2FwX25hbWUoInNldCIpICsgZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpICsgIigpIjsKK30KKwordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9zZXQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCkgeworICBpZiAoIXR5cGVfY2FuX2JlX251bGwoZmllbGQtPmdldF90eXBlKCkpKSB7CisgICAgaW5kZW50KG91dCkgPDwgInRoaXMuX19pc3NldF8iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPSB0cnVlOyIgPDwgZW5kbDsKKyAgfQorfQorCitzdGQ6OnN0cmluZyB0X2hheGVfZ2VuZXJhdG9yOjpnZXRfZW51bV9jbGFzc19uYW1lKHRfdHlwZSogdHlwZSkgeworICBzdHJpbmcgcGFja2FnZSA9ICIiOworICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0eXBlLT5nZXRfcHJvZ3JhbSgpOworICBpZiAocHJvZ3JhbSAhPSBOVUxMIC8qJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXyovKSB7CisgICAgcGFja2FnZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImhheGUiKSArICIuIjsKKyAgfQorICByZXR1cm4gcGFja2FnZSArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoCisgICAgaGF4ZSwKKyAgICAiSGF4ZSIsCisgICAgIiAgICBjYWxsYmFja3MgICAgICAgIFVzZSBvbkVycm9yKCkvb25TdWNjZXNzKCkgY2FsbGJhY2tzIGZvciBzZXJ2aWNlIG1ldGhvZHMgKGxpa2UgQVMzKVxuIgorICAgICIgICAgcnR0aSAgICAgICAgICAgICBFbmFibGUgQDpydHRpIGZvciBnZW5lcmF0ZWQgY2xhc3NlcyBhbmQgaW50ZXJmYWNlc1xuIgorICAgICIgICAgYnVpbGRtYWNybz1teS5tYWNyb3MuQ2xhc3MubWV0aG9kKGFyZ3MpXG4iCisgICAgIiAgICAgICAgICAgICAgICAgICAgIEFkZCBAOmJ1aWxkIG1hY3JvIGNhbGxzIHRvIGdlbmVyYXRlZCBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9oc19nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2hzX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjZkNGIwCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9oc19nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSwxNzI4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvdmVyc2lvbi5oIgorCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworCisvKioKKyAqIEhhc2tlbGwgY29kZSBnZW5lcmF0b3IuCisgKgorICovCitjbGFzcyB0X2hzX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X2hzX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgIGNvbnN0IG1hcDxzdHJpbmcsIHN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIC8qIG5vIG9wdGlvbnMgeWV0ICovCisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gaHM6IiArIGl0ZXItPmZpcnN0OworICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWhzIjsKKyAgfQorCisgIC8qKgorICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCisgICAqLworCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICAvKioKKyAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgc3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKworICAvKioKKyAgICogU3RydWN0IGdlbmVyYXRpb24gY29kZQorICAgKi8KKworICB2b2lkIGdlbmVyYXRlX2hzX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworCisgIHZvaWQgZ2VuZXJhdGVfaHNfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhlbHBlciA9IGZhbHNlKTsKKworICB2b2lkIGdlbmVyYXRlX2hzX3N0cnVjdF9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9oc19zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIHZvaWQgZ2VuZXJhdGVfaHNfc3RydWN0X2FyYml0cmFyeShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICB2b2lkIGdlbmVyYXRlX2hzX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKworICB2b2lkIGdlbmVyYXRlX2hzX3R5cGVtYXAob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9oc19kZWZhdWx0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIC8qKgorICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKworICAvKioKKyAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBuYW1lID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIGFyZyA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUsIHN0cmluZyBhcmcgPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfdHlwZShvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSwgc3RyaW5nIG5hbWUgPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdHJpbmcga2l0ZXIsIHN0cmluZyB2aXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RyaW5nIGl0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBpdGVyKTsKKworICAvKioKKyAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKKyAgICovCisKKyAgc3RyaW5nIGhzX2F1dG9nZW5fY29tbWVudCgpOworICBzdHJpbmcgaHNfbGFuZ3VhZ2VfcHJhZ21hKCk7CisgIHN0cmluZyBoc19pbXBvcnRzKCk7CisKKyAgc3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBzdHJpbmcgZnVuY3Rpb25fcHJlZml4ID0gIiIpOworCisgIHN0cmluZyBmaWVsZF9uYW1lKHN0cmluZyB0bmFtZSwgc3RyaW5nIGZuYW1lKTsKKworICBzdHJpbmcgZnVuY3Rpb25fdHlwZSh0X2Z1bmN0aW9uKiB0ZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvcHRpb25zID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW8gPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBtZXRob2QgPSBmYWxzZSk7CisKKyAgc3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKKworICBzdHJpbmcgdHlwZV90b19kZWZhdWx0KHRfdHlwZSogdHR5cGUpOworCisgIHN0cmluZyByZW5kZXJfaHNfdHlwZSh0X3R5cGUqIHR5cGUsIGJvb2wgbmVlZHNfcGFyZW5zKTsKKworICBzdHJpbmcgdHlwZV90b19jb25zdHJ1Y3Rvcih0X3R5cGUqIHR0eXBlKTsKKworICBzdHJpbmcgcmVuZGVyX2hzX3R5cGVfZm9yX2Z1bmN0aW9uX25hbWUodF90eXBlKiB0eXBlKTsKKworcHJpdmF0ZToKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3R5cGVzXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2NvbnN0c187CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zZXJ2aWNlXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2lmYWNlXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2NsaWVudF87Cit9OworCisvKioKKyAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0CisgKiBzdHJlYW1zLgorICoKKyAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQorICovCit2b2lkIHRfaHNfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5CisgIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7CisKKyAgLy8gTWFrZSBvdXRwdXQgZmlsZQorICBzdHJpbmcgcG5hbWUgPSBjYXBpdGFsaXplKHByb2dyYW1fbmFtZV8pOworICBzdHJpbmcgZl90eXBlc19uYW1lID0gZ2V0X291dF9kaXIoKSArIHBuYW1lICsgIl9UeXBlcy5ocyI7CisgIGZfdHlwZXNfLm9wZW4oZl90eXBlc19uYW1lLmNfc3RyKCkpOworCisgIHN0cmluZyBmX2NvbnN0c19uYW1lID0gZ2V0X291dF9kaXIoKSArIHBuYW1lICsgIl9Db25zdHMuaHMiOworICBmX2NvbnN0c18ub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOworCisgIC8vIFByaW50IGhlYWRlcgorICBmX3R5cGVzXyA8PCBoc19sYW5ndWFnZV9wcmFnbWEoKSA8PCBlbmRsOworICBmX3R5cGVzXyA8PCBoc19hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOworICBmX3R5cGVzXyA8PCAibW9kdWxlICIgPDwgcG5hbWUgPDwgIl9UeXBlcyB3aGVyZSIgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgaHNfaW1wb3J0cygpIDw8IGVuZGw7CisKKyAgZl9jb25zdHNfIDw8IGhzX2xhbmd1YWdlX3ByYWdtYSgpIDw8IGVuZGw7CisgIGZfY29uc3RzXyA8PCBoc19hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOworICBmX2NvbnN0c18gPDwgIm1vZHVsZSAiIDw8IHBuYW1lIDw8ICJfQ29uc3RzIHdoZXJlIiA8PCBlbmRsOworICBmX2NvbnN0c18gPDwgaHNfaW1wb3J0cygpIDw8IGVuZGw7CisgIGZfY29uc3RzXyA8PCAiaW1wb3J0ICIgPDwgcG5hbWUgPDwgIl9UeXBlcyIgPDwgZW5kbDsKK30KKworc3RyaW5nIHRfaHNfZ2VuZXJhdG9yOjpoc19sYW5ndWFnZV9wcmFnbWEoKSB7CisgIHJldHVybiBzdHJpbmcoCisgICAgICAiey0jIExBTkdVQUdFIERlcml2ZURhdGFUeXBlYWJsZSAjLX1cbiIKKyAgICAgICJ7LSMgTEFOR1VBR0UgRGVyaXZlR2VuZXJpYyAjLX1cbiIKKyAgICAgICJ7LSMgTEFOR1VBR0UgT3ZlcmxvYWRlZFN0cmluZ3MgIy19XG4iCisgICAgICAiey0jIE9QVElPTlNfR0hDIC1mbm8td2Fybi1taXNzaW5nLWZpZWxkcyAjLX1cbiIKKyAgICAgICJ7LSMgT1BUSU9OU19HSEMgLWZuby13YXJuLW1pc3Npbmctc2lnbmF0dXJlcyAjLX1cbiIKKyAgICAgICJ7LSMgT1BUSU9OU19HSEMgLWZuby13YXJuLW5hbWUtc2hhZG93aW5nICMtfVxuIgorICAgICAgInstIyBPUFRJT05TX0dIQyAtZm5vLXdhcm4tdW51c2VkLWltcG9ydHMgIy19XG4iCisgICAgICAiey0jIE9QVElPTlNfR0hDIC1mbm8td2Fybi11bnVzZWQtbWF0Y2hlcyAjLX1cbiIpOworfQorCisvKioKKyAqIEF1dG9nZW4nZCBjb21tZW50CisgKi8KK3N0cmluZyB0X2hzX2dlbmVyYXRvcjo6aHNfYXV0b2dlbl9jb21tZW50KCkgeworICByZXR1cm4gc3RyaW5nKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIikKKyAgICAgICAgICsgIi0tIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgiICsgVEhSSUZUX1ZFUlNJT04gKyAiKSAgICAgICAgICAgICAgICAgICAgICAtLVxuIgorICAgICAgICAgKyAiLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1cbiIKKyAgICAgICAgICsgIi0tIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HIC0tXG4iCisgICAgICAgICArICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIjsKK30KKworLyoqCisgKiBQcmludHMgc3RhbmRhcmQgdGhyaWZ0IGltcG9ydHMKKyAqLworc3RyaW5nIHRfaHNfZ2VuZXJhdG9yOjpoc19pbXBvcnRzKCkgeworICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOworICBzdHJpbmcgcmVzdWx0ID0gc3RyaW5nKAorICAgICAgImltcG9ydCBQcmVsdWRlICgoJCksICguKSwgKD4+PSksICg9PSksICgrKykpXG4iCisgICAgICAiaW1wb3J0IHF1YWxpZmllZCBQcmVsdWRlIGFzIFBcbiIKKyAgICAgICJpbXBvcnQgcXVhbGlmaWVkIENvbnRyb2wuRXhjZXB0aW9uIGFzIFhcbiIKKyAgICAgICJpbXBvcnQgcXVhbGlmaWVkIENvbnRyb2wuTW9uYWQgYXMgTSAoIGxpZnRNLCBhcCwgd2hlbiApXG4iCisgICAgICAiaW1wb3J0IERhdGEuRnVuY3RvciAoICg8JD4pIClcbiIKKyAgICAgICJpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5MYXp5IGFzIExCU1xuIgorICAgICAgImltcG9ydCBxdWFsaWZpZWQgRGF0YS5IYXNoYWJsZSBhcyBIXG4iCisgICAgICAiaW1wb3J0IHF1YWxpZmllZCBEYXRhLkludCBhcyBJXG4iCisgICAgICAiaW1wb3J0IHF1YWxpZmllZCBEYXRhLk1heWJlIGFzIE0gKGNhdE1heWJlcylcbiIKKyAgICAgICJpbXBvcnQgcXVhbGlmaWVkIERhdGEuVGV4dC5MYXp5LkVuY29kaW5nIGFzIEUgKCBkZWNvZGVVdGY4LCBlbmNvZGVVdGY4IClcbiIKKyAgICAgICJpbXBvcnQgcXVhbGlmaWVkIERhdGEuVGV4dC5MYXp5IGFzIExUXG4iCisgICAgICAiaW1wb3J0IHF1YWxpZmllZCBHSEMuR2VuZXJpY3MgYXMgRyAoR2VuZXJpYylcbiIKKyAgICAgICJpbXBvcnQgcXVhbGlmaWVkIERhdGEuVHlwZWFibGUgYXMgVFkgKCBUeXBlYWJsZSApXG4iCisgICAgICAiaW1wb3J0IHF1YWxpZmllZCBEYXRhLkhhc2hNYXAuU3RyaWN0IGFzIE1hcFxuIgorICAgICAgImltcG9ydCBxdWFsaWZpZWQgRGF0YS5IYXNoU2V0IGFzIFNldFxuIgorICAgICAgImltcG9ydCBxdWFsaWZpZWQgRGF0YS5WZWN0b3IgYXMgVmVjdG9yXG4iCisgICAgICAiaW1wb3J0IHF1YWxpZmllZCBUZXN0LlF1aWNrQ2hlY2suQXJiaXRyYXJ5IGFzIFFDICggQXJiaXRyYXJ5KC4uKSApXG4iCisgICAgICAiaW1wb3J0IHF1YWxpZmllZCBUZXN0LlF1aWNrQ2hlY2sgYXMgUUMgKCBlbGVtZW50cyApXG4iCisgICAgICAiXG4iCisgICAgICAiaW1wb3J0IHF1YWxpZmllZCBUaHJpZnQgYXMgVFxuIgorICAgICAgImltcG9ydCBxdWFsaWZpZWQgVGhyaWZ0LlR5cGVzIGFzIFRcbiIKKyAgICAgICJpbXBvcnQgcXVhbGlmaWVkIFRocmlmdC5BcmJpdHJhcmllcyBhcyBUXG4iCisgICAgICAiXG4iKTsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluY2x1ZGVzLnNpemUoKTsgKytpKQorICAgIHJlc3VsdCArPSAiaW1wb3J0IHF1YWxpZmllZCAiICsgY2FwaXRhbGl6ZShpbmNsdWRlc1tpXS0+Z2V0X25hbWUoKSkgKyAiX1R5cGVzXG4iOworCisgIGlmIChpbmNsdWRlcy5zaXplKCkgPiAwKQorICAgIHJlc3VsdCArPSAiXG4iOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogQ2xvc2VzIHRoZSB0eXBlIGZpbGVzCisgKi8KK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKKyAgLy8gQ2xvc2UgdHlwZXMgZmlsZQorICBmX3R5cGVzXy5jbG9zZSgpOworICBmX2NvbnN0c18uY2xvc2UoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBFei4KKyAqCisgKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgorICovCit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgc3RyaW5nIHRuYW1lID0gY2FwaXRhbGl6ZSh0dHlwZWRlZi0+Z2V0X3N5bWJvbGljKCkpOworICBzdHJpbmcgdGRlZiA9IHJlbmRlcl9oc190eXBlKHR0eXBlZGVmLT5nZXRfdHlwZSgpLCBmYWxzZSk7CisgIGluZGVudChmX3R5cGVzXykgPDwgInR5cGUgIiA8PCB0bmFtZSA8PCAiID0gIiA8PCB0ZGVmIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4KKyAqIHRoZSB2YWx1ZXMuCisgKgorICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgorICovCit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgaW5kZW50KGZfdHlwZXNfKSA8PCAiZGF0YSAiIDw8IGNhcGl0YWxpemUodGVudW0tPmdldF9uYW1lKCkpIDw8ICIgPSAiOworICBpbmRlbnRfdXAoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOworCisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIHN0cmluZyBuYW1lID0gY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOworICAgIGZfdHlwZXNfIDw8IChmaXJzdCA/ICIiIDogInwiKTsKKyAgICBmX3R5cGVzXyA8PCBuYW1lOworICAgIGZpcnN0ID0gZmFsc2U7CisgIH0KKyAgaW5kZW50KGZfdHlwZXNfKSA8PCAiZGVyaXZpbmcgKFAuU2hvdywgUC5FcSwgRy5HZW5lcmljLCBUWS5UeXBlYWJsZSwgUC5PcmQsIFAuQm91bmRlZCkiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgc3RyaW5nIGVuYW1lID0gY2FwaXRhbGl6ZSh0ZW51bS0+Z2V0X25hbWUoKSk7CisKKyAgaW5kZW50KGZfdHlwZXNfKSA8PCAiaW5zdGFuY2UgUC5FbnVtICIgPDwgZW5hbWUgPDwgIiB3aGVyZSIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChmX3R5cGVzXykgPDwgImZyb21FbnVtIHQgPSBjYXNlIHQgb2YiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgc3RyaW5nIG5hbWUgPSBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgaW5kZW50KGZfdHlwZXNfKSA8PCBuYW1lIDw8ICIgLT4gIiA8PCB2YWx1ZSA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3R5cGVzXykgPDwgInRvRW51bSB0ID0gY2FzZSB0IG9mIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworICAgIHN0cmluZyBuYW1lID0gY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOworICAgIGluZGVudChmX3R5cGVzXykgPDwgdmFsdWUgPDwgIiAtPiAiIDw8IG5hbWUgPDwgZW5kbDsKKyAgfQorICBpbmRlbnQoZl90eXBlc18pIDw8ICJfIC0+IFgudGhyb3cgVC5UaHJpZnRFeGNlcHRpb24iIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KGZfdHlwZXNfKSA8PCAiaW5zdGFuY2UgSC5IYXNoYWJsZSAiIDw8IGVuYW1lIDw8ICIgd2hlcmUiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQoZl90eXBlc18pIDw8ICJoYXNoV2l0aFNhbHQgc2FsdCA9IEguaGFzaFdpdGhTYWx0IHNhbHQgUC4uIFAuZnJvbUVudW0iIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KGZfdHlwZXNfKSA8PCAiaW5zdGFuY2UgUUMuQXJiaXRyYXJ5ICIgPDwgZW5hbWUgPDwgIiB3aGVyZSIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChmX3R5cGVzXykgPDwgImFyYml0cmFyeSA9IFFDLmVsZW1lbnRzIChQLmVudW1Gcm9tVG8gUC5taW5Cb3VuZCBQLm1heEJvdW5kKSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZSBhIGNvbnN0YW50IHZhbHVlCisgKi8KK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgeworICB0X3R5cGUqIHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7CisgIHN0cmluZyBuYW1lID0gZGVjYXBpdGFsaXplKHRjb25zdC0+Z2V0X25hbWUoKSk7CisKKyAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSB0Y29uc3QtPmdldF92YWx1ZSgpOworCisgIGluZGVudChmX2NvbnN0c18pIDw8IG5hbWUgPDwgIiA6OiAiIDw8IHJlbmRlcl9oc190eXBlKHR5cGUsIGZhbHNlKSA8PCBlbmRsOworICBpbmRlbnQoZl9jb25zdHNfKSA8PCBuYW1lIDw8ICIgPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB2YWx1ZSkgPDwgZW5kbDsKKyAgZl9jb25zdHNfIDw8IGVuZGw7Cit9CisKKy8qKgorICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCisgKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQorICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKKyAqLworc3RyaW5nIHRfaHNfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICBpZiAodmFsdWUgPT0gTlVMTCkKKyAgICByZXR1cm4gdHlwZV90b19kZWZhdWx0KHR5cGUpOworCisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworICBvc3RyaW5nc3RyZWFtIG91dDsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworCisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBvdXQgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBvdXQgPDwgKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCA/ICJQLlRydWUiIDogIlAuRmFsc2UiKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIG91dCA8PCAiKCIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIikiOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIG91dCA8PCAiKCIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIikiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8ICIoIiA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpIDw8ICIpIjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHRfZW51bSogdGVudW0gPSAodF9lbnVtKil0eXBlOworICAgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICAgIGZvciAodmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsKKyAgICAgICAgICsrY19pdGVyKSB7CisgICAgICBpbnQgdmFsID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICAgIGlmICh2YWwgPT0gdmFsdWUtPmdldF9pbnRlZ2VyKCkpIHsKKyAgICAgICAgdF9wcm9ncmFtKiBwcm9nID0gdHlwZS0+Z2V0X3Byb2dyYW0oKTsKKyAgICAgICAgaWYgKHByb2cgIT0gTlVMTCAmJiBwcm9nICE9IHByb2dyYW1fKQorICAgICAgICAgIG91dCA8PCBjYXBpdGFsaXplKHByb2ctPmdldF9uYW1lKCkpIDw8ICJfVHlwZXMuIjsKKyAgICAgICAgb3V0IDw8IGNhcGl0YWxpemUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHN0cmluZyBjbmFtZSA9IHR5cGVfbmFtZSh0eXBlKTsKKyAgICBvdXQgPDwgImRlZmF1bHRfIiA8PCBjbmFtZSA8PCAieyI7CisKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAobWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlciA9IHZhbC5iZWdpbigpOworICAgICAgICAgdl9pdGVyICE9IHZhbC5lbmQoKTsKKyAgICAgICAgICsrdl9pdGVyKSB7CisgICAgICB0X2ZpZWxkKiBmaWVsZCA9IE5VTEw7CisKKyAgICAgIGZvciAodmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7CisgICAgICAgICAgICsrZl9pdGVyKQorICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkKKyAgICAgICAgICBmaWVsZCA9ICgqZl9pdGVyKTsKKworICAgICAgaWYgKGZpZWxkID09IE5VTEwpCisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgY25hbWUgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOworCisgICAgICBzdHJpbmcgZm5hbWUgPSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICBzdHJpbmcgY29uc3RfdmFsdWUgPSByZW5kZXJfY29uc3RfdmFsdWUoZmllbGQtPmdldF90eXBlKCksIHZfaXRlci0+c2Vjb25kKTsKKworICAgICAgb3V0IDw8IChmaXJzdCA/ICIiIDogIiwgIik7CisgICAgICBvdXQgPDwgZmllbGRfbmFtZShjbmFtZSwgZm5hbWUpIDw8ICIgPSAiOworICAgICAgaWYgKGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCB8fCAoKHRfdHlwZSopZmllbGQtPmdldF90eXBlKCkpLT5pc194Y2VwdGlvbigpKSB7CisgICAgICAgIG91dCA8PCAiUC5KdXN0ICI7CisgICAgICB9CisgICAgICBvdXQgPDwgY29uc3RfdmFsdWU7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0KKworICAgIG91dCA8PCAifSI7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisKKyAgICBvdXQgPDwgIihNYXAuZnJvbUxpc3QgWyI7CisKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgc3RyaW5nIGtleSA9IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgdl9pdGVyLT5maXJzdCk7CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICBvdXQgPDwgKGZpcnN0ID8gIiIgOiAiLCIpOworICAgICAgb3V0IDw8ICIoIiA8PCBrZXkgPDwgIiwiIDw8IHZhbCA8PCAiKSI7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0KKyAgICBvdXQgPDwgIl0pIjsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogZXR5cGUgPSB0eXBlLT5pc19saXN0KCkgPyAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworCisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworCisgICAgaWYgKHR5cGUtPmlzX3NldCgpKQorICAgICAgb3V0IDw8ICIoU2V0LmZyb21MaXN0IFsiOworICAgIGVsc2UKKyAgICAgIG91dCA8PCAiKFZlY3Rvci5mcm9tTGlzdCBbIjsKKworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBvdXQgPDwgKGZpcnN0ID8gIiIgOiAiLCIpOworICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlcik7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0KKworICAgIG91dCA8PCAiXSkiOworCisgIH0gZWxzZSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBDT05TVEFOVCBGT1IgVFlQRTogIiArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKworICByZXR1cm4gb3V0LnN0cigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhICJzdHJ1Y3QiCisgKi8KK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9oc19zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBleGNlcHRpb24uIEJhc2ljYWxseSB0aGUgc2FtZQorICogYXMgYSBzdHJ1Y3QsIGJ1dCBhbHNvIGhhcyBhbiBleGNlcHRpb24gZGVjbGFyYXRpb24uCisgKgorICogQHBhcmFtIHR4Y2VwdGlvbiBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9oc19zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBIYXNrZWxsIHN0cnVjdAorICovCit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oc19zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX2hzX3N0cnVjdF9kZWZpbml0aW9uKGZfdHlwZXNfLCB0c3RydWN0LCBpc19leGNlcHRpb24sIGZhbHNlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oc19zdHJ1Y3RfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoZWxwZXIpIHsKKyAgKHZvaWQpaGVscGVyOworICBzdHJpbmcgdG5hbWUgPSB0eXBlX25hbWUodHN0cnVjdCk7CisgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisKKyAgaW5kZW50KG91dCkgPDwgImRhdGEgIiA8PCB0bmFtZSA8PCAiID0gIiA8PCB0bmFtZTsKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgIGluZGVudF91cCgpOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAodmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsKKyAgICAgICAgICsrbV9pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInsgIjsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICIsICI7CisgICAgICB9CisgICAgICBzdHJpbmcgbW5hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7CisgICAgICBvdXQgPDwgZmllbGRfbmFtZSh0bmFtZSwgbW5hbWUpIDw8ICIgOjogIjsKKyAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMCisgICAgICAgICAgfHwgKCh0X3R5cGUqKSgqbV9pdGVyKS0+Z2V0X3R5cGUoKSktPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgICAgb3V0IDw8ICJQLk1heWJlICI7CisgICAgICB9CisgICAgICBvdXQgPDwgcmVuZGVyX2hzX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpLCB0cnVlKSA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAifSI7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIG91dCA8PCAiIGRlcml2aW5nIChQLlNob3csUC5FcSxHLkdlbmVyaWMsVFkuVHlwZWFibGUpIiA8PCBlbmRsOworCisgIGlmIChpc19leGNlcHRpb24pCisgICAgb3V0IDw8ICJpbnN0YW5jZSBYLkV4Y2VwdGlvbiAiIDw8IHRuYW1lIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgImluc3RhbmNlIEguSGFzaGFibGUgIiA8PCB0bmFtZSA8PCAiIHdoZXJlIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgImhhc2hXaXRoU2FsdCBzYWx0IHJlY29yZCA9IHNhbHQiOworICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7CisgICAgICAgKyttX2l0ZXIpIHsKKyAgICBzdHJpbmcgbW5hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7CisgICAgaW5kZW50KG91dCkgPDwgIiBgSC5oYXNoV2l0aFNhbHRgICIgPDwgZmllbGRfbmFtZSh0bmFtZSwgbW5hbWUpIDw8ICIgcmVjb3JkIjsKKyAgfQorICBpbmRlbnQob3V0KSA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIGdlbmVyYXRlX2hzX3N0cnVjdF9hcmJpdHJhcnkob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfaHNfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9oc19zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2hzX3R5cGVtYXAob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfaHNfZGVmYXVsdChvdXQsIHRzdHJ1Y3QpOworfQorCit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oc19zdHJ1Y3RfYXJiaXRyYXJ5KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIHRuYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworCisgIGluZGVudChvdXQpIDw8ICJpbnN0YW5jZSBRQy5BcmJpdHJhcnkgIiA8PCB0bmFtZSA8PCAiIHdoZXJlICIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiYXJiaXRyYXJ5ID0gTS5saWZ0TSAiIDw8IHRuYW1lOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudF91cCgpOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAodmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsKKyAgICAgICAgICsrbV9pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgb3V0IDw8ICIgIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJgTS5hcGAiOworICAgICAgfQorICAgICAgb3V0IDw8ICIoIjsKKyAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMCisgICAgICAgICAgfHwgKCh0X3R5cGUqKSgqbV9pdGVyKS0+Z2V0X3R5cGUoKSktPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgICAgb3V0IDw8ICJNLmxpZnRNIFAuSnVzdCAiOworICAgICAgfQorICAgICAgb3V0IDw8ICJRQy5hcmJpdHJhcnkpIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgLy8gU2hyaW5rCisgICAgaW5kZW50KG91dCkgPDwgInNocmluayBvYmogfCBvYmogPT0gZGVmYXVsdF8iIDw8IHRuYW1lIDw8ICIgPSBbXSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICAgICAgICAgICB8IFAub3RoZXJ3aXNlID0gTS5jYXRNYXliZXMiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZmlyc3QgPSB0cnVlOworICAgIGZvciAodmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsKKyAgICAgICAgICsrbV9pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIlsgIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICIsICI7CisgICAgICB9CisgICAgICBzdHJpbmcgZm5hbWUgPSBmaWVsZF9uYW1lKHRuYW1lLCAoKm1faXRlciktPmdldF9uYW1lKCkpOworICAgICAgb3V0IDw8ICJpZiBvYmogPT0gZGVmYXVsdF8iIDw8IHRuYW1lOworICAgICAgb3V0IDw8ICJ7IiA8PCBmbmFtZSA8PCAiID0gIiA8PCBmbmFtZSA8PCAiIG9ian0gIjsKKyAgICAgIG91dCA8PCAidGhlbiBQLk5vdGhpbmcgIjsKKyAgICAgIG91dCA8PCAiZWxzZSBQLkp1c3QgJCBkZWZhdWx0XyIgPDwgdG5hbWU7CisgICAgICBvdXQgPDwgInsiIDw8IGZuYW1lIDw8ICIgPSAiIDw8IGZuYW1lIDw8ICIgb2JqfSIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgIl0iIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfSBlbHNlIHsgLyogMCA9PSBtZW1iZXJzLnNpemUoKSAqLworICAgIGluZGVudChvdXQpIDw8ICJhcmJpdHJhcnkgPSBRQy5lbGVtZW50cyBbIiA8PCB0bmFtZSA8PCAiXSIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgcmVhZCBtZXRob2QgZm9yIGEgc3RydWN0CisgKi8KK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2hzX3N0cnVjdF9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworCisgIHN0cmluZyBzbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKKyAgc3RyaW5nIGlkID0gdG1wKCJfaWQiKTsKKyAgc3RyaW5nIHZhbCA9IHRtcCgiX3ZhbCIpOworCisgIGluZGVudChvdXQpIDw8ICJ0b18iIDw8IHNuYW1lIDw8ICIgOjogVC5UaHJpZnRWYWwgLT4gIiA8PCBzbmFtZSA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAidG9fIiA8PCBzbmFtZSA8PCAiIChULlRTdHJ1Y3QgZmllbGRzKSA9ICIgPDwgc25hbWUgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGJvb2wgZmlyc3QgPSB0cnVlOworCisgIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcworICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGludDMyX3Qga2V5ID0gKCpmX2l0ZXIpLT5nZXRfa2V5KCk7CisgICAgc3RyaW5nIGV0eXBlID0gdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgc3RyaW5nIGZuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gRmlsbCBpbiBGaWVsZAorICAgIGluZGVudChvdXQpIDw8IGZpZWxkX25hbWUoc25hbWUsIGZuYW1lKSA8PCAiID0gIjsKKworICAgIG91dCA8PCAiUC5tYXliZSAoIjsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgb3V0IDw8ICJQLmVycm9yIFwiTWlzc2luZyByZXF1aXJlZCBmaWVsZDogIiA8PCBmbmFtZSA8PCAiXCIiOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwKKyAgICAgICAgICAgfHwgKCh0X3R5cGUqKSgqZl9pdGVyKS0+Z2V0X3R5cGUoKSktPmlzX3hjZXB0aW9uKCkpICYmICgqZl9pdGVyKS0+Z2V0X3ZhbHVlKCkgPT0gTlVMTCkgeworICAgICAgICBvdXQgPDwgIlAuTm90aGluZyI7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgZmllbGRfbmFtZShzbmFtZSwgZm5hbWUpIDw8ICIgZGVmYXVsdF8iIDw8IHNuYW1lOworICAgICAgfQorICAgIH0KKyAgICBvdXQgPDwgIikgIjsKKworICAgIG91dCA8PCAiKFxcKF8sIiA8PCB2YWwgPDwgIikgLT4gIjsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTAorICAgICAgICB8fCAoKHRfdHlwZSopKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKS0+aXNfeGNlcHRpb24oKSkKKyAgICAgIG91dCA8PCAiUC5KdXN0ICI7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCB2YWwpOworICAgIG91dCA8PCAiKSI7CisgICAgb3V0IDw8ICIgKE1hcC5sb29rdXAgKCIgPDwga2V5IDw8ICIpIGZpZWxkcykiOworICB9CisKKyAgb3V0IDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIC8vIHJlYWQKKyAgc3RyaW5nIHRtYXAgPSB0eXBlX25hbWUodHN0cnVjdCwgInR5cGVtYXBfIik7CisgIGluZGVudChvdXQpIDw8ICJ0b18iIDw8IHNuYW1lIDw8ICIgXyA9IFAuZXJyb3IgXCJub3QgYSBzdHJ1Y3RcIiIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAicmVhZF8iIDw8IHNuYW1lIDw8ICIgOjogVC5Qcm90b2NvbCBwID0+IHAgLT4gUC5JTyAiIDw8IHNuYW1lCisgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJyZWFkXyIgPDwgc25hbWUgPDwgIiBpcHJvdCA9IHRvXyIgPDwgc25hbWU7CisgIG91dCA8PCAiIDwkPiBULnJlYWRWYWwgaXByb3QgKFQuVF9TVFJVQ1QgIiA8PCB0bWFwIDw8ICIpIiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJkZWNvZGVfIiA8PCBzbmFtZQorICAgICAgICAgICAgICA8PCAiIDo6IFQuU3RhdGVsZXNzUHJvdG9jb2wgcCA9PiBwIC0+IExCUy5CeXRlU3RyaW5nIC0+ICIgPDwgc25hbWUgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImRlY29kZV8iIDw8IHNuYW1lIDw8ICIgaXByb3QgYnMgPSB0b18iIDw8IHNuYW1lIDw8ICIgJCAiOworICBvdXQgPDwgIlQuZGVzZXJpYWxpemVWYWwgaXByb3QgKFQuVF9TVFJVQ1QgIiA8PCB0bWFwIDw8ICIpIGJzIiA8PCBlbmRsOworfQorCit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oc19zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIG5hbWUgPSB0eXBlX25hbWUodHN0cnVjdCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICBzdHJpbmcgc3RyID0gdG1wKCJfc3RyIik7CisgIHN0cmluZyBmID0gdG1wKCJfZiIpOworICBzdHJpbmcgdiA9IHRtcCgiX3YiKTsKKworICBpbmRlbnQob3V0KSA8PCAiZnJvbV8iIDw8IG5hbWUgPDwgIiA6OiAiIDw8IG5hbWUgPDwgIiAtPiBULlRocmlmdFZhbCIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImZyb21fIiA8PCBuYW1lIDw8ICIgcmVjb3JkID0gVC5UU3RydWN0ICQgTWFwLmZyb21MaXN0ICI7CisgIGluZGVudF91cCgpOworCisgIC8vIEdldCBFeGNlcHRpb25zCisgIGJvb2wgaGFzRXhuID0gZmFsc2U7CisgIGZvciAodmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKCgodF90eXBlKikoKmZfaXRlciktPmdldF90eXBlKCkpLT5pc194Y2VwdGlvbigpKSB7CisgICAgICBoYXNFeG4gPSB0cnVlOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgYm9vbCBpc2ZpcnN0ID0gdHJ1ZTsKKyAgaWYgKGhhc0V4bikgeworICAgIG91dCA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIobGV0IGV4bnMgPSBNLmNhdE1heWJlcyAiOworICAgIGluZGVudF91cCgpOworICAgIGZvciAodmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7CisgICAgICAgICArK2ZfaXRlcikgeworICAgICAgaWYgKCgodF90eXBlKikoKmZfaXRlciktPmdldF90eXBlKCkpLT5pc194Y2VwdGlvbigpKSB7CisgICAgICAgIGlmIChpc2ZpcnN0KSB7CisgICAgICAgICAgb3V0IDw8ICJbICI7CisgICAgICAgICAgaXNmaXJzdCA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgICB9CisgICAgICAgIHN0cmluZyBtbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgICAgaW50MzJfdCBrZXkgPSAoKmZfaXRlciktPmdldF9rZXkoKTsKKyAgICAgICAgb3V0IDw8ICIoXFwiIDw8IHYgPDwgIiAtPiAoIiA8PCBrZXkgPDwgIiwgKFwiIiA8PCBtbmFtZSA8PCAiXCIsIjsKKyAgICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3R5cGUob3V0LCAoKmZfaXRlciktPmdldF90eXBlKCksIHYpOworICAgICAgICBvdXQgPDwgIikpKSA8JD4gIiA8PCBmaWVsZF9uYW1lKG5hbWUsIG1uYW1lKSA8PCAiIHJlY29yZCI7CisgICAgICB9CisgICAgfQorICAgIGlmICghaXNmaXJzdCkgeworICAgICAgb3V0IDw8ICJdIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJpbiBpZiBQLm5vdCAoUC5udWxsIGV4bnMpIHRoZW4gZXhucyBlbHNlICI7CisgICAgaW5kZW50X3VwKCk7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8ICIkICI7CisgIH0KKworICBvdXQgPDwgIk0uY2F0TWF5YmVzIiA8PCBlbmRsOworICAvLyBHZXQgdGhlIFJlc3QKKyAgaXNmaXJzdCA9IHRydWU7CisgIGZvciAodmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgLy8gV3JpdGUgZmllbGQgaGVhZGVyCisgICAgaWYgKGlzZmlyc3QpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJbICI7CisgICAgICBpc2ZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICIsICI7CisgICAgfQorICAgIHN0cmluZyBtbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBpbnQzMl90IGtleSA9ICgqZl9pdGVyKS0+Z2V0X2tleSgpOworICAgIG91dCA8PCAiKFxcIjsKKyAgICBvdXQgPDwgdiA8PCAiIC0+ICI7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfT1BUSU9OQUwKKyAgICAgICAgJiYgISgodF90eXBlKikoKmZfaXRlciktPmdldF90eXBlKCkpLT5pc194Y2VwdGlvbigpKSB7CisgICAgICBvdXQgPDwgIlAuSnVzdCAiOworICAgIH0KKyAgICBvdXQgPDwgIigiIDw8IGtleSA8PCAiLCAoXCIiIDw8IG1uYW1lIDw8ICJcIiwiOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV90eXBlKG91dCwgKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLCB2KTsKKyAgICBvdXQgPDwgIikpKSAiOworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX09QVElPTkFMCisgICAgICAgICYmICEoKHRfdHlwZSopKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgb3V0IDw8ICIkIjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICI8JD4iOworICAgIH0KKyAgICBvdXQgPDwgIiAiIDw8IGZpZWxkX25hbWUobmFtZSwgbW5hbWUpIDw8ICIgcmVjb3JkIiA8PCBlbmRsOworICB9CisKKyAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKKyAgaWYgKGlzZmlyc3QpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiW10iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgIl0iIDw8IGVuZGw7CisgIH0KKyAgaWYgKGhhc0V4bikgeworICAgIGluZGVudChvdXQpIDw8ICIpIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKworICAvLyB3cml0ZQorICBpbmRlbnQob3V0KSA8PCAid3JpdGVfIiA8PCBuYW1lIDw8ICIgOjogVC5Qcm90b2NvbCBwID0+IHAgLT4gIiA8PCBuYW1lCisgICAgICAgICAgICAgIDw8ICIgLT4gUC5JTyAoKSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIndyaXRlXyIgPDwgbmFtZSA8PCAiIG9wcm90IHJlY29yZCA9IFQud3JpdGVWYWwgb3Byb3QgJCBmcm9tXyI7CisgIG91dCA8PCBuYW1lIDw8ICIgcmVjb3JkIiA8PCBlbmRsOworCisgIC8vIGVuY29kZQorICBpbmRlbnQob3V0KSA8PCAiZW5jb2RlXyIgPDwgbmFtZSA8PCAiIDo6IFQuU3RhdGVsZXNzUHJvdG9jb2wgcCA9PiBwIC0+ICIgPDwgbmFtZQorICAgICAgICAgICAgICA8PCAiIC0+IExCUy5CeXRlU3RyaW5nIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiZW5jb2RlXyIgPDwgbmFtZSA8PCAiIG9wcm90IHJlY29yZCA9IFQuc2VyaWFsaXplVmFsIG9wcm90ICQgIjsKKyAgb3V0IDw8ICJmcm9tXyIgPDwgbmFtZSA8PCAiIHJlY29yZCIgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgorICovCit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gZ2V0X291dF9kaXIoKSArIGNhcGl0YWxpemUoc2VydmljZV9uYW1lXykgKyAiLmhzIjsKKyAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOworCisgIGZfc2VydmljZV8gPDwgaHNfbGFuZ3VhZ2VfcHJhZ21hKCkgPDwgZW5kbDsKKyAgZl9zZXJ2aWNlXyA8PCBoc19hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOworICBmX3NlcnZpY2VfIDw8ICJtb2R1bGUgIiA8PCBjYXBpdGFsaXplKHNlcnZpY2VfbmFtZV8pIDw8ICIgd2hlcmUiIDw8IGVuZGw7CisgIGZfc2VydmljZV8gPDwgaHNfaW1wb3J0cygpIDw8IGVuZGw7CisKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiaW1wb3J0IHF1YWxpZmllZCAiIDw8IGNhcGl0YWxpemUodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkpIDw8IGVuZGw7CisgIH0KKworICBmX3NlcnZpY2VfIDw8ICJpbXBvcnQgIiA8PCBjYXBpdGFsaXplKHByb2dyYW1fbmFtZV8pIDw8ICJfVHlwZXMiIDw8IGVuZGw7CisgIGZfc2VydmljZV8gPDwgImltcG9ydCBxdWFsaWZpZWQgIiA8PCBjYXBpdGFsaXplKHNlcnZpY2VfbmFtZV8pIDw8ICJfSWZhY2UgYXMgSWZhY2UiIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHRocmVlIG1haW4gcGFydHMgb2YgdGhlIHNlcnZpY2UKKyAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRzZXJ2aWNlKTsKKworICAvLyBDbG9zZSBzZXJ2aWNlIGZpbGUKKyAgZl9zZXJ2aWNlXy5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBoZWxwZXIgZnVuY3Rpb25zIGZvciBhIHNlcnZpY2UuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLS0gSEVMUEVSIEZVTkNUSU9OUyBBTkQgU1RSVUNUVVJFUyAtLSIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgZ2VuZXJhdGVfaHNfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgdHMsIGZhbHNlKTsKKyAgICBnZW5lcmF0ZV9oc19mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCisgKi8KK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2hzX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgZmllbGRfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCksICJyZXN1bHQiKSk7CisgIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7CisKKyAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkKKyAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7CisKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikKKyAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOworCisgIGdlbmVyYXRlX2hzX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sICZyZXN1bHQsIGZhbHNlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZSB0aGUgbWFwIGZyb20gZmllbGQgbmFtZXMgdG8gKHR5cGUsIGlkKQorICogQHBhcmFtIHRzdHJ1Y3QgdGhlIFN0cnVjdAorICovCit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oc190eXBlbWFwKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIG5hbWUgPSB0eXBlX25hbWUodHN0cnVjdCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworCisgIGluZGVudChvdXQpIDw8ICJ0eXBlbWFwXyIgPDwgbmFtZSA8PCAiIDo6IFQuVHlwZU1hcCIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInR5cGVtYXBfIiA8PCBuYW1lIDw8ICIgPSBNYXAuZnJvbUxpc3QgWyI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBtbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBpZiAoIWZpcnN0KSB7CisgICAgICBvdXQgPDwgIiwiOworICAgIH0KKworICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBpbnQzMl90IGtleSA9ICgqZl9pdGVyKS0+Z2V0X2tleSgpOworICAgIG91dCA8PCAiKCIgPDwga2V5IDw8ICIsKFwiIiA8PCBtbmFtZSA8PCAiXCIsIiA8PCB0eXBlX3RvX2VudW0odHlwZSkgPDwgIikpIjsKKyAgICBmaXJzdCA9IGZhbHNlOworICB9CisgIG91dCA8PCAiXSIgPDwgZW5kbDsKK30KKworLyoqCisgKiBnZW5lcmF0ZSB0aGUgc3RydWN0IHdpdGggZGVmYXVsdCB2YWx1ZXMgZmlsbGVkIGluCisgKiBAcGFyYW0gdHN0cnVjdCB0aGUgU3RydWN0CisgKi8KK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2hzX2RlZmF1bHQob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKKyAgc3RyaW5nIGZuYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QsICJkZWZhdWx0XyIpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKworICBpbmRlbnQob3V0KSA8PCBmbmFtZSA8PCAiIDo6ICIgPDwgbmFtZSA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCBmbmFtZSA8PCAiID0gIiA8PCBuYW1lIDw8ICJ7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAodmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyaW5nIG1uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOworICAgIH0KKworICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9ICgqZl9pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgaW5kZW50KG91dCkgPDwgZmllbGRfbmFtZShuYW1lLCBtbmFtZSkgPDwgIiA9ICI7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwKKyAgICAgICAgfHwgKCh0X3R5cGUqKSgqZl9pdGVyKS0+Z2V0X3R5cGUoKSktPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgIGlmICh2YWx1ZSA9PSBOVUxMKSB7CisgICAgICAgIG91dCA8PCAiUC5Ob3RoaW5nIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCAiUC5KdXN0ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB2YWx1ZSk7CisgICAgfQorICB9CisgIG91dCA8PCAifSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGludGVyZmFjZSBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBmX2lmYWNlX25hbWUgPSBnZXRfb3V0X2RpcigpICsgY2FwaXRhbGl6ZShzZXJ2aWNlX25hbWVfKSArICJfSWZhY2UuaHMiOworICBmX2lmYWNlXy5vcGVuKGZfaWZhY2VfbmFtZS5jX3N0cigpKTsKKworICBmX2lmYWNlXyA8PCBoc19sYW5ndWFnZV9wcmFnbWEoKSA8PCBlbmRsOworICBmX2lmYWNlXyA8PCBoc19hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOworCisgIGZfaWZhY2VfIDw8ICJtb2R1bGUgIiA8PCBjYXBpdGFsaXplKHNlcnZpY2VfbmFtZV8pIDw8ICJfSWZhY2Ugd2hlcmUiIDw8IGVuZGw7CisKKyAgZl9pZmFjZV8gPDwgaHNfaW1wb3J0cygpIDw8IGVuZGw7CisgIGZfaWZhY2VfIDw8ICJpbXBvcnQgIiA8PCBjYXBpdGFsaXplKHByb2dyYW1fbmFtZV8pIDw8ICJfVHlwZXMiIDw8IGVuZGw7CisgIGZfaWZhY2VfIDw8IGVuZGw7CisKKyAgc3RyaW5nIHNuYW1lID0gY2FwaXRhbGl6ZShzZXJ2aWNlX25hbWVfKTsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBzdHJpbmcgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisKKyAgICBpbmRlbnQoZl9pZmFjZV8pIDw8ICJpbXBvcnQgIiA8PCBleHRlbmRzIDw8ICJfSWZhY2UiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfaWZhY2VfKSA8PCAiY2xhc3MgIiA8PCBleHRlbmRzIDw8ICJfSWZhY2UgYSA9PiAiIDw8IHNuYW1lIDw8ICJfSWZhY2UgYSB3aGVyZSIgPDwgZW5kbDsKKworICB9IGVsc2UgeworICAgIGluZGVudChmX2lmYWNlXykgPDwgImNsYXNzICIgPDwgc25hbWUgPDwgIl9JZmFjZSBhIHdoZXJlIiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X3VwKCk7CisKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyaW5nIGZ0ID0gZnVuY3Rpb25fdHlwZSgqZl9pdGVyLCB0cnVlLCB0cnVlLCB0cnVlKTsKKyAgICBpbmRlbnQoZl9pZmFjZV8pIDw8IGRlY2FwaXRhbGl6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgOjogYSAtPiAiIDw8IGZ0IDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX2lmYWNlXy5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uIE5vdGUgdGhhdCBpbiBIYXNrZWxsLCB0aGUgY2xpZW50IGRvZXNuJ3QgaW1wbGVtZW50IGlmYWNlLgorICpUaGlzIGlzIGJlY2F1c2UKKyAqIFRoZSBjbGllbnQgZG9lcyBub3QgKGFuZCBzaG91bGQgbm90IGhhdmUgdG8pIGRlYWwgd2l0aCBhcmd1bWVudHMgYmVpbmcgTm90aGluZy4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBmX2NsaWVudF9uYW1lID0gZ2V0X291dF9kaXIoKSArIGNhcGl0YWxpemUoc2VydmljZV9uYW1lXykgKyAiX0NsaWVudC5ocyI7CisgIGZfY2xpZW50Xy5vcGVuKGZfY2xpZW50X25hbWUuY19zdHIoKSk7CisgIGZfY2xpZW50XyA8PCBoc19sYW5ndWFnZV9wcmFnbWEoKSA8PCBlbmRsOworICBmX2NsaWVudF8gPDwgaHNfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKKworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXhwb3J0cyA9ICIiOworCisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGV4cG9ydHMgKz0gKGZpcnN0ID8gIiIgOiAiLCIpOworICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIGV4cG9ydHMgKz0gZGVjYXBpdGFsaXplKGZ1bm5hbWUpOworICAgIGZpcnN0ID0gZmFsc2U7CisgIH0KKworICBzdHJpbmcgc25hbWUgPSBjYXBpdGFsaXplKHNlcnZpY2VfbmFtZV8pOworICBpbmRlbnQoZl9jbGllbnRfKSA8PCAibW9kdWxlICIgPDwgc25hbWUgPDwgIl9DbGllbnQoIiA8PCBleHBvcnRzIDw8ICIpIHdoZXJlIiA8PCBlbmRsOworCisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgaW5kZW50KGZfY2xpZW50XykgPDwgImltcG9ydCAiIDw8IGV4dGVuZHMgPDwgIl9DbGllbnQiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiaW1wb3J0IHF1YWxpZmllZCBEYXRhLklPUmVmIGFzIFIiIDw8IGVuZGw7CisgIGluZGVudChmX2NsaWVudF8pIDw8IGhzX2ltcG9ydHMoKSA8PCBlbmRsOworICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiaW1wb3J0ICIgPDwgY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKSA8PCAiX1R5cGVzIiA8PCBlbmRsOworICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiaW1wb3J0ICIgPDwgY2FwaXRhbGl6ZShzZXJ2aWNlX25hbWVfKSA8PCBlbmRsOworCisgIC8vIERBVFMgUklURSBBIEdMT0JBTCBWQVIKKyAgaW5kZW50KGZfY2xpZW50XykgPDwgInNlcWlkID0gUi5uZXdJT1JlZiAwIiA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKyAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKworICAgIHN0cmluZyBmYXJncyA9ICIiOworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKQorICAgICAgZmFyZ3MgKz0gIiBhcmdfIiArICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgIGluZGVudChmX2NsaWVudF8pIDw8IGRlY2FwaXRhbGl6ZShmdW5uYW1lKSA8PCAiIChpcCxvcCkiIDw8IGZhcmdzIDw8ICIgPSBkbyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAic2VuZF8iIDw8IGZ1bm5hbWUgPDwgIiBvcCIgPDwgZmFyZ3M7CisKKyAgICBmX2NsaWVudF8gPDwgZW5kbDsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkKKyAgICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJyZWN2XyIgPDwgZnVubmFtZSA8PCAiIGlwIiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJzZW5kXyIgPDwgZnVubmFtZSA8PCAiIG9wIiA8PCBmYXJncyA8PCAiID0gZG8iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAic2VxIDwtIHNlcWlkIiA8PCBlbmRsOworICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJzZXFuIDwtIFIucmVhZElPUmVmIHNlcSIgPDwgZW5kbDsKKyAgICBzdHJpbmcgYXJnc25hbWUgPSBjYXBpdGFsaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfYXJncyIpOworCisgICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0IGhlYWRlcgorICAgIHN0cmluZyBmbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBzdHJpbmcgbXNnVHlwZSA9ICgqZl9pdGVyKS0+aXNfb25ld2F5KCkgPyAiVC5NX09ORVdBWSIgOiAiVC5NX0NBTEwiOworICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJULndyaXRlTWVzc2FnZSBvcCAoXCIiIDw8IGZuYW1lIDw8ICJcIiwgIiA8PCBtc2dUeXBlIDw8ICIsIHNlcW4pICQiCisgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAid3JpdGVfIiA8PCBhcmdzbmFtZSA8PCAiIG9wICgiIDw8IGFyZ3NuYW1lIDw8ICJ7IjsKKworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAodmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOworICAgICAgICAgKytmbGRfaXRlcikgeworICAgICAgc3RyaW5nIGZpZWxkbmFtZSA9ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgZl9jbGllbnRfIDw8IChmaXJzdCA/ICIiIDogIiwiKTsKKyAgICAgIGZfY2xpZW50XyA8PCBmaWVsZF9uYW1lKGFyZ3NuYW1lLCBmaWVsZG5hbWUpIDw8ICI9IjsKKyAgICAgIGlmICgoKmZsZF9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwKKyAgICAgICAgICB8fCAoKHRfdHlwZSopKCpmbGRfaXRlciktPmdldF90eXBlKCkpLT5pc194Y2VwdGlvbigpKQorICAgICAgICBmX2NsaWVudF8gPDwgIlAuSnVzdCAiOworICAgICAgZl9jbGllbnRfIDw8ICJhcmdfIiA8PCBmaWVsZG5hbWU7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0KKyAgICBmX2NsaWVudF8gPDwgIn0pIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgc3RyaW5nIHJlc3VsdG5hbWUgPSBjYXBpdGFsaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7CisgICAgICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOworCisgICAgICBzdHJpbmcgZnVubmFtZSA9IHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksIGZ1bm5hbWUsICZub2FyZ3MpOworCisgICAgICAvLyBPcGVuIGZ1bmN0aW9uCisgICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCBmdW5uYW1lIDw8ICIgaXAgPSBkbyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworCisgICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiVC5yZWFkTWVzc2FnZSBpcCAkIFxcKGZuYW1lLCBtdHlwZSwgcnNlcWlkKSAtPiBkbyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KGZfY2xpZW50XykgPDwgIk0ud2hlbiAobXR5cGUgPT0gVC5NX0VYQ0VQVElPTikgJCBkbyB7IGV4biA8LSBULnJlYWRBcHBFeG4gaXAgOyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiWC50aHJvdyBleG4gfSIgPDwgZW5kbDsKKworICAgICAgaW5kZW50KGZfY2xpZW50XykgPDwgInJlcyA8LSByZWFkXyIgPDwgcmVzdWx0bmFtZSA8PCAiIGlwIiA8PCBlbmRsOworCisgICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKKyAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworCisgICAgICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOworICAgICAgICAgICArK3hfaXRlcikgeworICAgICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiUC5tYXliZSAoUC5yZXR1cm4gKCkpIFgudGhyb3cgKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZmllbGRfbmFtZShyZXN1bHRuYW1lLCAoKnhfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgcmVzKSIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkKKyAgICAgICAgaW5kZW50KGZfY2xpZW50XykgPDwgIlAucmV0dXJuICQgIiA8PCBmaWVsZF9uYW1lKHJlc3VsdG5hbWUsICJzdWNjZXNzIikgPDwgIiByZXMiIDw8IGVuZGw7CisgICAgICBlbHNlCisgICAgICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJQLnJldHVybiAoKSIgPDwgZW5kbDsKKworICAgICAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnRfZG93bigpOworICAgIH0KKyAgfQorCisgIGZfY2xpZW50Xy5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpCisgICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm9jXyBoYW5kbGVyIChpcHJvdCxvcHJvdCkgKG5hbWUsdHlwLHNlcWlkKSA9IGNhc2UgbmFtZSBvZiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHJpbmcgZm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJcIiIgPDwgZm5hbWUgPDwgIlwiIC0+IHByb2Nlc3NfIiA8PCBkZWNhcGl0YWxpemUoZm5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgKHNlcWlkLGlwcm90LG9wcm90LGhhbmRsZXIpIiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJfIC0+ICI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZl9zZXJ2aWNlXyA8PCB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpCisgICAgICAgICAgICAgICA8PCAiLnByb2NfIGhhbmRsZXIgKGlwcm90LG9wcm90KSAobmFtZSx0eXAsc2VxaWQpIiA8PCBlbmRsOworCisgIH0gZWxzZSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiZG8iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJfIDwtIFQucmVhZFZhbCBpcHJvdCAoVC5UX1NUUlVDVCBNYXAuZW1wdHkpIiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVC53cml0ZU1lc3NhZ2Ugb3Byb3QgKG5hbWUsVC5NX0VYQ0VQVElPTixzZXFpZCkgJCIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlQud3JpdGVBcHBFeG4gb3Byb3QgKFQuQXBwRXhuIFQuQUVfVU5LTk9XTl9NRVRIT0QgKFwiVW5rbm93biBmdW5jdGlvbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiArKyBMVC51bnBhY2sgbmFtZSkpIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHNlcnZlciBpbXBsZW1lbnRhdGlvbgorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByb2Nlc3MgaGFuZGxlciAoaXByb3QsIG9wcm90KSA9IGRvIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlQucmVhZE1lc3NhZ2UgaXByb3QgKCIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHByb2NfIGhhbmRsZXIgKGlwcm90LG9wcm90KSkiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiUC5yZXR1cm4gUC5UcnVlIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworfQorCitib29sIGhhc05vQXJndW1lbnRzKHRfZnVuY3Rpb24qIGZ1bmMpIHsKKyAgcmV0dXJuIChmdW5jLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpLmVtcHR5KCkpOworfQorCitzdHJpbmcgdF9oc19nZW5lcmF0b3I6OnJlbmRlcl9oc190eXBlX2Zvcl9mdW5jdGlvbl9uYW1lKHRfdHlwZSogdHlwZSkgeworICBzdHJpbmcgdHlwZV9zdHIgPSByZW5kZXJfaHNfdHlwZSh0eXBlLCBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgZm91bmQgPSAtMTsKKworICB3aGlsZSAodHJ1ZSkgeworICAgIGZvdW5kID0gdHlwZV9zdHIuZmluZF9maXJzdF9vZigiW10uICIsIGZvdW5kICsgMSk7CisgICAgaWYgKHN0cmluZzo6bnBvcyA9PSBzaXplX3QoZm91bmQpKSB7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAodHlwZV9zdHJbZm91bmRdID09ICcuJykKKyAgICAgIHR5cGVfc3RyW2ZvdW5kXSA9ICdfJzsKKyAgICBlbHNlCisgICAgICB0eXBlX3N0cltmb3VuZF0gPSAnWic7CisgIH0KKyAgcmV0dXJuIHR5cGVfc3RyOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCisgKi8KK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgICh2b2lkKXRzZXJ2aWNlOworICAvLyBPcGVuIGZ1bmN0aW9uCisgIHN0cmluZyBmdW5uYW1lID0gZGVjYXBpdGFsaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJvY2Vzc18iIDw8IGZ1bm5hbWUgPDwgIiAoc2VxaWQsIGlwcm90LCBvcHJvdCwgaGFuZGxlcikgPSBkbyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgc3RyaW5nIGFyZ3NuYW1lID0gY2FwaXRhbGl6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgIl9hcmdzIjsKKyAgc3RyaW5nIHJlc3VsdG5hbWUgPSBjYXBpdGFsaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiX3Jlc3VsdCI7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKKyAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImFyZ3MgPC0gcmVhZF8iIDw8IGFyZ3NuYW1lIDw8ICIgaXByb3QiIDw8IGVuZGw7CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisKKyAgc2l6ZV90IG4gPSB4Y2VwdGlvbnMuc2l6ZSgpICsgMTsKKyAgLy8gVHJ5IGJsb2NrIGZvciBhIGZ1bmN0aW9uIHdpdGggZXhjZXB0aW9ucworICBpZiAobiA+IDApIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIoWC5jYXRjaCIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKyAgfQorCisgIGlmIChuID4gMCkgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiKGRvIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICB9CisgIGluZGVudChmX3NlcnZpY2VfKTsKKworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKQorICAgIGZfc2VydmljZV8gPDwgInZhbCA8LSAiOworCisgIGZfc2VydmljZV8gPDwgIklmYWNlLiIgPDwgZGVjYXBpdGFsaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgPDwgIiBoYW5kbGVyIjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpCisgICAgZl9zZXJ2aWNlXyA8PCAiICgiIDw8IGZpZWxkX25hbWUoYXJnc25hbWUsICgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiBhcmdzKSI7CisKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImxldCByZXMgPSBkZWZhdWx0XyIgPDwgcmVzdWx0bmFtZSA8PCAieyIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgZmllbGRfbmFtZShyZXN1bHRuYW1lLCAic3VjY2VzcyIpIDw8ICIgPSB2YWx9IjsKKworICB9IGVsc2UgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAibGV0IHJlcyA9IGRlZmF1bHRfIiA8PCByZXN1bHRuYW1lOworICB9CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAvLyBTaG9ydGN1dCBvdXQgaGVyZSBmb3Igb25ld2F5IGZ1bmN0aW9ucworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiUC5yZXR1cm4gKCkiOworICB9IGVsc2UgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVC53cml0ZU1lc3NhZ2Ugb3Byb3QgKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIlwiLCBULk1fUkVQTFksIHNlcWlkKSAkIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAid3JpdGVfIiA8PCByZXN1bHRuYW1lIDw8ICIgb3Byb3QgcmVzIjsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisgIGlmIChuID4gMCkgeworICAgIGZfc2VydmljZV8gPDwgIikiOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIGlmIChuID4gMCkgeworICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIihcXGUgIC0+IGRvIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImxldCByZXMgPSBkZWZhdWx0XyIgPDwgcmVzdWx0bmFtZSA8PCAieyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGZpZWxkX25hbWUocmVzdWx0bmFtZSwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiID0gUC5KdXN0IGV9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJULndyaXRlTWVzc2FnZSBvcHJvdCAoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlwiLCBULk1fUkVQTFksIHNlcWlkKSAkIiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ3cml0ZV8iIDw8IHJlc3VsdG5hbWUgPDwgIiBvcHJvdCByZXMiOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJQLnJldHVybiAoKSI7CisgICAgICB9CisKKyAgICAgIGZfc2VydmljZV8gPDwgIikpIiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgfQorICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiKChcXF8gLT4gZG8iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVC53cml0ZU1lc3NhZ2Ugb3Byb3QgKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXCIsIFQuTV9FWENFUFRJT04sIHNlcWlkKSAkIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlQud3JpdGVBcHBFeG4gb3Byb3QgKFQuQXBwRXhuIFQuQUVfVU5LTk9XTiBcIlwiKSI7CisgICAgICBpbmRlbnRfZG93bigpOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlAucmV0dXJuICgpIjsKKyAgICB9CisKKyAgICBmX3NlcnZpY2VfIDw8ICIpIDo6IFguU29tZUV4Y2VwdGlvbiAtPiBQLklPICgpKSkiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisgIC8vIENsb3NlIGZ1bmN0aW9uCisgIGluZGVudF9kb3duKCk7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCisgKi8KK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4KSB7CisgICh2b2lkKXByZWZpeDsKKyAgdF90eXBlKiB0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG91dCwgdHlwZSwgcHJlZml4KTsKK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqLwordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSwgc3RyaW5nIGFyZykgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKyAgc3RyaW5nIHZhbCA9IHRtcCgiX3ZhbCIpOworICBvdXQgPDwgIihjYXNlICIgPDwgYXJnIDw8ICIgb2YgeyIgPDwgdHlwZV90b19jb25zdHJ1Y3Rvcih0eXBlKSA8PCAiICIgPDwgdmFsIDw8ICIgLT4gIjsKKworICBpZiAodHlwZS0+aXNfdm9pZCgpKQorICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFIjsKKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgdmFsKTsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgdmFsKTsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIGlmICh0YmFzZSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcgJiYgIXR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICBvdXQgPDwgIkUuZGVjb2RlVXRmOCAiOworICAgIH0KKyAgICBvdXQgPDwgdmFsOworICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgLy8gU2luY2Ugd2lyZSB0eXBlIG9mIGJpbmFyeSBpcyB0aGUgc2FtZSBhcyBzdHJpbmcsIHdlIGFjdHVhbGx5IHJlY2VpdmUgVC5UU3RyaW5nIG5vdAorICAgICAgLy8gVC5UQmluYXJ5CisgICAgICBvdXQgPDwgIjsgVC5UU3RyaW5nICIgPDwgdmFsIDw8ICIgLT4gIiA8PCB2YWw7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIG91dCA8PCAiUC50b0VudW0gJCBQLmZyb21JbnRlZ3JhbCAiIDw8IHZhbDsKKworICB9IGVsc2UgeworICAgIHRocm93ICJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgVFlQRSAiICsgdHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorICBvdXQgPDwgIjsgXyAtPiBQLmVycm9yIFwid3JvbmcgdHlwZVwifSkiOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhbiB1bnNlcmlhbGl6ZXIgZm9yIGEgc3RydWN0LCBjYWxsaW5nIHJlYWQoKQorICovCit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIG5hbWUpIHsKKworICBvdXQgPDwgIigiIDw8IHR5cGVfbmFtZSh0c3RydWN0LCAidG9fIikgPDwgIiAoVC5UU3RydWN0ICIgPDwgbmFtZSA8PCAiKSkiOworfQorCisvKioKKyAqIFNlcmlhbGl6ZSBhIGNvbnRhaW5lciBieSB3cml0aW5nIG91dCB0aGUgaGVhZGVyIGZvbGxvd2VkIGJ5CisgKiBkYXRhIGFuZCB0aGVuIGEgZm9vdGVyLgorICovCit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgYXJnKSB7CisKKyAgc3RyaW5nIHZhbCA9IHRtcCgiX3YiKTsKKyAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBzdHJpbmcga2V5ID0gdG1wKCJfayIpOworICAgIG91dCA8PCAiKE1hcC5mcm9tTGlzdCAkIFAubWFwIChcXCgiIDw8IGtleSA8PCAiLCIgPDwgdmFsIDw8ICIpIC0+ICgiOworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3V0LCAoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpLCBrZXkpOworCisgICAgb3V0IDw8ICIsIjsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG91dCwgKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKKworICAgIG91dCA8PCAiKSkgIiA8PCBhcmcgPDwgIikiOworCisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgb3V0IDw8ICIoU2V0LmZyb21MaXN0ICQgUC5tYXAgKFxcIiA8PCB2YWwgPDwgIiAtPiAiOworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3V0LCAoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSwgdmFsKTsKKyAgICBvdXQgPDwgIikgIiA8PCBhcmcgPDwgIikiOworCisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIG91dCA8PCAiKFZlY3Rvci5mcm9tTGlzdCAkIFAubWFwIChcXCIgPDwgdmFsIDw8ICIgLT4gIjsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG91dCwgKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCB2YWwpOworICAgIG91dCA8PCAiKSAiIDw8IGFyZyA8PCAiKSI7CisgIH0KK30KKworLyoqCisgKiBTZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCisgKgorICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCisgKiBAcGFyYW0gcHJlZml4IE5hbWUgdG8gcHJlcGVuZCB0byBmaWVsZCBuYW1lCisgKi8KK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV90eXBlKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlLCBzdHJpbmcgbmFtZSkgeworCisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCisgIGlmICh0eXBlLT5pc192b2lkKCkpCisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFIjsKKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUpOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIG91dCA8PCB0eXBlX3RvX2NvbnN0cnVjdG9yKHR5cGUpIDw8ICIgIjsKKyAgICAgIGlmICh0YmFzZSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcgJiYgIXR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgIG91dCA8PCAiJCBFLmVuY29kZVV0ZjggIjsKKyAgICAgIH0KKyAgICAgIG91dCA8PCBuYW1lOworCisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIHN0cmluZyBlbmFtZSA9IGNhcGl0YWxpemUodHlwZS0+Z2V0X25hbWUoKSk7CisgICAgICBvdXQgPDwgIlQuVEkzMiAkIFAuZnJvbUludGVncmFsICQgUC5mcm9tRW51bSAiIDw8IG5hbWU7CisgICAgfQorCisgIH0gZWxzZSB7CisgICAgdGhyb3cgIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgT0YgVFlQRSAiICsgdHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCisgKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCisgKi8KK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgeworICBvdXQgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QsICJmcm9tXyIpIDw8ICIgIiA8PCBwcmVmaXg7Cit9CisKK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBrID0gdG1wKCJfayIpOworICBzdHJpbmcgdiA9IHRtcCgiX3YiKTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgb3V0IDw8ICJULlRNYXAgIiA8PCB0eXBlX3RvX2VudW0oa3R5cGUpIDw8ICIgIiA8PCB0eXBlX3RvX2VudW0odnR5cGUpOworICAgIG91dCA8PCAiICQgUC5tYXAgKFxcKCIgPDwgayA8PCAiLCIgPDwgdiA8PCAiKSAtPiAoIjsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfdHlwZShvdXQsIGt0eXBlLCBrKTsKKyAgICBvdXQgPDwgIiwgIjsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfdHlwZShvdXQsIHZ0eXBlLCB2KTsKKyAgICBvdXQgPDwgIikpICQgTWFwLnRvTGlzdCAiIDw8IHByZWZpeDsKKworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIG91dCA8PCAiVC5UU2V0ICIgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKTsKKyAgICBvdXQgPDwgIiAkIFAubWFwIChcXCIgPDwgdiA8PCAiIC0+ICI7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3R5cGUob3V0LCAoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSwgdik7CisgICAgb3V0IDw8ICIpICQgU2V0LnRvTGlzdCAiIDw8IHByZWZpeDsKKworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBvdXQgPDwgIlQuVExpc3QgIiA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKTsKKyAgICBvdXQgPDwgIiAkIFAubWFwIChcXCIgPDwgdiA8PCAiIC0+ICI7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3R5cGUob3V0LCAoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCksIHYpOworICAgIG91dCA8PCAiKSAkIFZlY3Rvci50b0xpc3QgIiA8PCBwcmVmaXg7CisgIH0KK30KKworc3RyaW5nIHRfaHNfZ2VuZXJhdG9yOjpmdW5jdGlvbl90eXBlKHRfZnVuY3Rpb24qIHRmdW5jLCBib29sIG9wdGlvbnMsIGJvb2wgaW8sIGJvb2wgbWV0aG9kKSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0ZnVuYy0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgZm9yICh2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTAorICAgICAgICB8fCAoKHRfdHlwZSopKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKS0+aXNfeGNlcHRpb24oKSkKKyAgICAgIHJlc3VsdCArPSAiUC5NYXliZSAiOworICAgIHJlc3VsdCArPSByZW5kZXJfaHNfdHlwZSgoKmZfaXRlciktPmdldF90eXBlKCksIG9wdGlvbnMpOworICAgIHJlc3VsdCArPSAiIC0+ICI7CisgIH0KKworICBpZiAoZmllbGRzLmVtcHR5KCkgJiYgIW1ldGhvZCkKKyAgICByZXN1bHQgKz0gIigpIC0+ICI7CisKKyAgaWYgKGlvKQorICAgIHJlc3VsdCArPSAiUC5JTyAiOworCisgIHJlc3VsdCArPSByZW5kZXJfaHNfdHlwZSh0ZnVuYy0+Z2V0X3JldHVybnR5cGUoKSwgaW8pOworICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgdF9oc19nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBzdHJpbmcgZnVuY3Rpb25fcHJlZml4KSB7CisgIHN0cmluZyBwcmVmaXggPSAiIjsKKyAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7CisKKyAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKQorICAgIGlmICghdHR5cGUtPmlzX3NlcnZpY2UoKSkKKyAgICAgIHByZWZpeCA9IGNhcGl0YWxpemUocHJvZ3JhbS0+Z2V0X25hbWUoKSkgKyAiX1R5cGVzLiI7CisKKyAgcmV0dXJuIHByZWZpeCArIGZ1bmN0aW9uX3ByZWZpeCArIGNhcGl0YWxpemUodHR5cGUtPmdldF9uYW1lKCkpOworfQorCitzdHJpbmcgdF9oc19nZW5lcmF0b3I6OmZpZWxkX25hbWUoc3RyaW5nIHRuYW1lLCBzdHJpbmcgZm5hbWUpIHsKKyAgcmV0dXJuIGRlY2FwaXRhbGl6ZSh0bmFtZSkgKyAiXyIgKyBmbmFtZTsKK30KKworLyoqCisgKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIFByb3RvY29sLnRfdHlwZSBlbnVtCisgKi8KK3N0cmluZyB0X2hzX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHJldHVybiAiVC5UX1ZPSUQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuIHR5cGUtPmlzX2JpbmFyeSgpID8gIlQuVF9CSU5BUlkiIDogIlQuVF9TVFJJTkciOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiVC5UX0JPT0wiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIlQuVF9CWVRFIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiVC5UX0kxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIlQuVF9JMzIiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJULlRfSTY0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiVC5UX0RPVUJMRSI7CisgICAgfQorCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJULlRfSTMyIjsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIihULlRfU1RSVUNUICIgKyB0eXBlX25hbWUoKHRfc3RydWN0Kil0eXBlLCAidHlwZW1hcF8iKSArICIpIjsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgc3RyaW5nIGt0eXBlID0gdHlwZV90b19lbnVtKCgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKSk7CisgICAgc3RyaW5nIHZ0eXBlID0gdHlwZV90b19lbnVtKCgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKSk7CisgICAgcmV0dXJuICIoVC5UX01BUCAiICsga3R5cGUgKyAiICIgKyB2dHlwZSArICIpIjsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICIoVC5UX1NFVCAiICsgdHlwZV90b19lbnVtKCgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCkpICsgIikiOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICIoVC5UX0xJU1QgIiArIHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKSkgKyAiKSI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBkZWZhdWx0IHZhbHVlCisgKi8KK3N0cmluZyB0X2hzX2dlbmVyYXRvcjo6dHlwZV90b19kZWZhdWx0KHRfdHlwZSogdHlwZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHJldHVybiAiUC5lcnJvciBcIk5vIGRlZmF1bHQgdmFsdWUgZm9yIHR5cGUgVF9WT0lEXCIiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJcIlwiIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIlAuRmFsc2UiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIjAiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICIwIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiMCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIjAiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICIwIjsKKyAgICB9CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIihQLnRvRW51bSAwKSI7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuIHR5cGVfbmFtZSgodF9zdHJ1Y3QqKXR5cGUsICJkZWZhdWx0XyIpOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIk1hcC5lbXB0eSI7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiU2V0LmVtcHR5IjsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiVmVjdG9yLmVtcHR5IjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19kZWZhdWx0OiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworLyoqCisgKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhbiBoYXNrZWxsIHR5cGUKKyAqLworc3RyaW5nIHRfaHNfZ2VuZXJhdG9yOjpyZW5kZXJfaHNfdHlwZSh0X3R5cGUqIHR5cGUsIGJvb2wgbmVlZHNfcGFyZW5zKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworICBzdHJpbmcgdHlwZV9yZXByOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgcmV0dXJuICIoKSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gKHR5cGUtPmlzX2JpbmFyeSgpID8gIkxCUy5CeXRlU3RyaW5nIiA6ICJMVC5UZXh0Iik7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJQLkJvb2wiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIkkuSW50OCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIkkuSW50MTYiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJJLkludDMyIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiSS5JbnQ2NCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIlAuRG91YmxlIjsKKyAgICB9CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gdHlwZV9uYW1lKCh0X2VudW0qKXR5cGUpOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiB0eXBlX25hbWUoKHRfc3RydWN0Kil0eXBlKTsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworICAgIHR5cGVfcmVwciA9ICJNYXAuSGFzaE1hcCAiICsgcmVuZGVyX2hzX3R5cGUoa3R5cGUsIHRydWUpICsgIiAiICsgcmVuZGVyX2hzX3R5cGUodnR5cGUsIHRydWUpOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB0eXBlX3JlcHIgPSAiU2V0Lkhhc2hTZXQgIiArIHJlbmRlcl9oc190eXBlKGV0eXBlLCB0cnVlKTsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB0eXBlX3JlcHIgPSAiVmVjdG9yLlZlY3RvciAiICsgcmVuZGVyX2hzX3R5cGUoZXR5cGUsIHRydWUpOworCisgIH0gZWxzZSB7CisgICAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworICB9CisKKyAgcmV0dXJuIG5lZWRzX3BhcmVucyA/ICIoIiArIHR5cGVfcmVwciArICIpIiA6IHR5cGVfcmVwcjsKK30KKworLyoqCisgKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIGhhc2tlbGwgY29uc3RydWN0b3IKKyAqLworc3RyaW5nIHRfaHNfZ2VuZXJhdG9yOjp0eXBlX3RvX2NvbnN0cnVjdG9yKHRfdHlwZSogdHlwZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJpbnZhbGlkIHR5cGU6IFRfVk9JRCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gdHlwZS0+aXNfYmluYXJ5KCkgPyAiVC5UQmluYXJ5IiA6ICJULlRTdHJpbmciOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiVC5UQm9vbCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiVC5UQnl0ZSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIlQuVEkxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIlQuVEkzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlQuVEk2NCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIlQuVERvdWJsZSI7CisgICAgfQorCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJULlRJMzIiOworCisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiVC5UU3RydWN0IjsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJULlRNYXAgXyBfIjsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJULlRTZXQgXyI7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIlQuVExpc3QgXyI7CisgIH0KKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKGhzLCAiSGFza2VsbCIsICIiKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9odG1sX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfaHRtbF9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRmYTM4OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfaHRtbF9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSwxMDg4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8bWFwPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X2h0bWxfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvZnN0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6cGFpcjsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworCitlbnVtIGlucHV0X3R5cGUgeyBJTlBVVF9VTktOT1dOLCBJTlBVVF9VVEY4LCBJTlBVVF9QTEFJTiB9OworCisvKioKKyAqIEhUTUwgY29kZSBnZW5lcmF0b3IKKyAqCisgKiBtb3N0bHkgY29weS9wYXN0aW5nL3R3ZWFraW5nIGZyb20gbWNzbGVlJ3Mgd29yay4KKyAqLworY2xhc3MgdF9odG1sX2dlbmVyYXRvciA6IHB1YmxpYyB0X2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfaHRtbF9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIHN0YW5kYWxvbmVfID0gZmFsc2U7CisgICAgdW5zYWZlXyA9IGZhbHNlOworICAgIGZvciggaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgeworICAgICAgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInN0YW5kYWxvbmUiKSA9PSAwKSB7CisgICAgICAgIHN0YW5kYWxvbmVfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibm9lc2NhcGUiKSA9PSAwKSB7CisgICAgICAgIHVuc2FmZV8gPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIGh0bWw6IiArIGl0ZXItPmZpcnN0OworICAgICAgfQorICAgIH0KKworCisgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4taHRtbCI7CisgICAgaW5wdXRfdHlwZV8gPSBJTlBVVF9VTktOT1dOOworCisgICAgZXNjYXBlXy5jbGVhcigpOworICAgIGVzY2FwZV9bJyYnXSA9ICImYW1wOyI7CisgICAgZXNjYXBlX1snPCddID0gIiZsdDsiOworICAgIGVzY2FwZV9bJz4nXSA9ICImZ3Q7IjsKKyAgICBlc2NhcGVfWyciJ10gPSAiJnF1b3Q7IjsKKyAgICBlc2NhcGVfWydcJyddID0gIiZhcG9zOyI7CisKKyAgICBpbml0X2FsbG93ZWRfX21hcmt1cCgpOworICB9CisKKyAgdm9pZCBnZW5lcmF0ZV9wcm9ncmFtKCk7CisgIHZvaWQgZ2VuZXJhdGVfcHJvZ3JhbV90b2MoKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9ncmFtX3RvY19yb3codF9wcm9ncmFtKiB0cHJvZyk7CisgIHZvaWQgZ2VuZXJhdGVfcHJvZ3JhbV90b2Nfcm93cyh0X3Byb2dyYW0qIHRwcm9nLCBzdGQ6OnZlY3Rvcjx0X3Byb2dyYW0qPiYgZmluaXNoZWQpOworICB2b2lkIGdlbmVyYXRlX2luZGV4KCk7CisgIHN0ZDo6c3RyaW5nIGVzY2FwZV9odG1sKHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIpOworICBzdGQ6OnN0cmluZyBlc2NhcGVfaHRtbF90YWdzKHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIpOworICB2b2lkIGdlbmVyYXRlX2NzcygpOworICB2b2lkIGdlbmVyYXRlX2Nzc19jb250ZW50KHN0ZDo6b3N0cmVhbSYgZl90YXJnZXQpOworICB2b2lkIGdlbmVyYXRlX3N0eWxlX3RhZygpOworICBzdGQ6OnN0cmluZyBtYWtlX2ZpbGVfbGluayhzdGQ6OnN0cmluZyBuYW1lKTsKKyAgYm9vbCBpc191dGY4X3NlcXVlbmNlKHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIsIHNpemVfdCBmaXJzdHBvcyk7CisgIHZvaWQgZGV0ZWN0X2lucHV0X2VuY29kaW5nKHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIsIHNpemVfdCBmaXJzdHBvcyk7CisgIHZvaWQgaW5pdF9hbGxvd2VkX19tYXJrdXAoKTsKKworICAvKioKKyAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKKworICB2b2lkIHByaW50X2RvYyh0X2RvYyogdGRvYyk7CisgIGludCBwcmludF90eXBlKHRfdHlwZSogdHR5cGUpOworICB2b2lkIHByaW50X2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdHZhbHVlKTsKKyAgdm9pZCBwcmludF9mbl9hcmdzX2RvYyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCitwcml2YXRlOgorICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfb3V0XzsKKyAgc3RkOjpzdHJpbmcgY3VycmVudF9maWxlXzsKKyAgaW5wdXRfdHlwZSBpbnB1dF90eXBlXzsKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gYWxsb3dlZF9tYXJrdXA7CisgIGJvb2wgc3RhbmRhbG9uZV87CisgIGJvb2wgdW5zYWZlXzsKK307CisKKy8qKgorICogRW1pdHMgdGhlIFRhYmxlIG9mIENvbnRlbnRzIGxpbmtzIGF0IHRoZSB0b3Agb2YgdGhlIG1vZHVsZSdzIHBhZ2UKKyAqLwordm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9ncmFtX3RvYygpIHsKKyAgZl9vdXRfIDw8ICI8dGFibGUgY2xhc3M9XCJ0YWJsZS1ib3JkZXJlZCB0YWJsZS1zdHJpcGVkICIKKyAgICAgICAgICAgICJ0YWJsZS1jb25kZW5zZWRcIj48dGhlYWQ+PHRoPk1vZHVsZTwvdGg+PHRoPlNlcnZpY2VzPC90aD4iCisgICAgICAgICA8PCAiPHRoPkRhdGEgdHlwZXM8L3RoPjx0aD5Db25zdGFudHM8L3RoPjwvdGhlYWQ+IiA8PCBlbmRsOworICBnZW5lcmF0ZV9wcm9ncmFtX3RvY19yb3cocHJvZ3JhbV8pOworICBmX291dF8gPDwgIjwvdGFibGU+IiA8PCBlbmRsOworfQorCisvKioKKyAqIFJlY3Vyc2VzIHRocm91Z2ggZnJvbSB0aGUgcHJvdmlkZWQgcHJvZ3JhbSBhbmQgZ2VuZXJhdGVzIGEgVG9DIHJvdworICogZm9yIGVhY2ggZGlzY292ZXJlZCBwcm9ncmFtIGV4YWN0bHkgb25jZSBieSBtYWludGFpbmluZyB0aGUgbGlzdCBvZgorICogY29tcGxldGVkIHJvd3MgaW4gJ2ZpbmlzaGVkJworICovCit2b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2dyYW1fdG9jX3Jvd3ModF9wcm9ncmFtKiB0cHJvZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx0X3Byb2dyYW0qPiYgZmluaXNoZWQpIHsKKyAgZm9yICh2ZWN0b3I8dF9wcm9ncmFtKj46Oml0ZXJhdG9yIGl0ZXIgPSBmaW5pc2hlZC5iZWdpbigpOyBpdGVyICE9IGZpbmlzaGVkLmVuZCgpOyBpdGVyKyspIHsKKyAgICBpZiAodHByb2ctPmdldF9wYXRoKCkgPT0gKCppdGVyKS0+Z2V0X3BhdGgoKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorICBmaW5pc2hlZC5wdXNoX2JhY2sodHByb2cpOworICBnZW5lcmF0ZV9wcm9ncmFtX3RvY19yb3codHByb2cpOworICB2ZWN0b3I8dF9wcm9ncmFtKj4gaW5jbHVkZXMgPSB0cHJvZy0+Z2V0X2luY2x1ZGVzKCk7CisgIGZvciAodmVjdG9yPHRfcHJvZ3JhbSo+OjppdGVyYXRvciBpdGVyID0gaW5jbHVkZXMuYmVnaW4oKTsgaXRlciAhPSBpbmNsdWRlcy5lbmQoKTsgaXRlcisrKSB7CisgICAgZ2VuZXJhdGVfcHJvZ3JhbV90b2Nfcm93cygqaXRlciwgZmluaXNoZWQpOworICB9Cit9CisKKy8qKgorICogRW1pdHMgdGhlIFRhYmxlIG9mIENvbnRlbnRzIGxpbmtzIGF0IHRoZSB0b3Agb2YgdGhlIG1vZHVsZSdzIHBhZ2UKKyAqLwordm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9ncmFtX3RvY19yb3codF9wcm9ncmFtKiB0cHJvZykgeworICBzdHJpbmcgZm5hbWUgPSB0cHJvZy0+Z2V0X25hbWUoKSArICIuaHRtbCI7CisgIGZfb3V0XyA8PCAiPHRyPiIgPDwgZW5kbCA8PCAiPHRkPiIgPDwgdHByb2ctPmdldF9uYW1lKCkgPDwgIjwvdGQ+PHRkPiI7CisgIGlmICghdHByb2ctPmdldF9zZXJ2aWNlcygpLmVtcHR5KCkpIHsKKyAgICB2ZWN0b3I8dF9zZXJ2aWNlKj4gc2VydmljZXMgPSB0cHJvZy0+Z2V0X3NlcnZpY2VzKCk7CisgICAgdmVjdG9yPHRfc2VydmljZSo+OjppdGVyYXRvciBzdl9pdGVyOworICAgIGZvciAoc3ZfaXRlciA9IHNlcnZpY2VzLmJlZ2luKCk7IHN2X2l0ZXIgIT0gc2VydmljZXMuZW5kKCk7ICsrc3ZfaXRlcikgeworICAgICAgc3RyaW5nIG5hbWUgPSBnZXRfc2VydmljZV9uYW1lKCpzdl9pdGVyKTsKKyAgICAgIGZfb3V0XyA8PCAiPGEgaHJlZj1cIiIgPDwgbWFrZV9maWxlX2xpbmsoZm5hbWUpIDw8ICIjU3ZjXyIgPDwgbmFtZSA8PCAiXCI+IiA8PCBuYW1lCisgICAgICAgICAgICAgPDwgIjwvYT48YnIvPiIgPDwgZW5kbDsKKyAgICAgIGZfb3V0XyA8PCAiPHVsPiIgPDwgZW5kbDsKKyAgICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gZm5faHRtbDsKKyAgICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gKCpzdl9pdGVyKS0+Z2V0X2Z1bmN0aW9ucygpOworICAgICAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZm5faXRlcjsKKyAgICAgIGZvciAoZm5faXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmbl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmbl9pdGVyKSB7CisgICAgICAgIHN0cmluZyBmbl9uYW1lID0gKCpmbl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgICAgc3RyaW5nIGh0bWwgPSAiPGxpPjxhIGhyZWY9XCIiICsgbWFrZV9maWxlX2xpbmsoZm5hbWUpICsgIiNGbl8iICsgbmFtZSArICJfIiArIGZuX25hbWUKKyAgICAgICAgICAgICAgICAgICAgICArICJcIj4iICsgZm5fbmFtZSArICI8L2E+PC9saT4iOworICAgICAgICBmbl9odG1sLmluc2VydChwYWlyPHN0cmluZywgc3RyaW5nPihmbl9uYW1lLCBodG1sKSk7CisgICAgICB9CisgICAgICBmb3IgKG1hcDxzdHJpbmcsIHN0cmluZz46Oml0ZXJhdG9yIGh0bWxfaXRlciA9IGZuX2h0bWwuYmVnaW4oKTsgaHRtbF9pdGVyICE9IGZuX2h0bWwuZW5kKCk7CisgICAgICAgICAgIGh0bWxfaXRlcisrKSB7CisgICAgICAgIGZfb3V0XyA8PCBodG1sX2l0ZXItPnNlY29uZCA8PCBlbmRsOworICAgICAgfQorICAgICAgZl9vdXRfIDw8ICI8L3VsPiIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgZl9vdXRfIDw8ICI8L3RkPiIgPDwgZW5kbCA8PCAiPHRkPiI7CisgIG1hcDxzdHJpbmcsIHN0cmluZz4gZGF0YV90eXBlczsKKyAgaWYgKCF0cHJvZy0+Z2V0X2VudW1zKCkuZW1wdHkoKSkgeworICAgIHZlY3Rvcjx0X2VudW0qPiBlbnVtcyA9IHRwcm9nLT5nZXRfZW51bXMoKTsKKyAgICB2ZWN0b3I8dF9lbnVtKj46Oml0ZXJhdG9yIGVuX2l0ZXI7CisgICAgZm9yIChlbl9pdGVyID0gZW51bXMuYmVnaW4oKTsgZW5faXRlciAhPSBlbnVtcy5lbmQoKTsgKytlbl9pdGVyKSB7CisgICAgICBzdHJpbmcgbmFtZSA9ICgqZW5faXRlciktPmdldF9uYW1lKCk7CisgICAgICAvLyBmX291dF8gPDwgIjxhIGhyZWY9XCIiIDw8IG1ha2VfZmlsZV9saW5rKGZuYW1lKSA8PCAiI0VudW1fIiA8PCBuYW1lIDw8ICJcIj4iIDw8IG5hbWUKKyAgICAgIC8vIDw8ICAiPC9hPjxici8+IiA8PCBlbmRsOworICAgICAgc3RyaW5nIGh0bWwgPSAiPGEgaHJlZj1cIiIgKyBtYWtlX2ZpbGVfbGluayhmbmFtZSkgKyAiI0VudW1fIiArIG5hbWUgKyAiXCI+IiArIG5hbWUgKyAiPC9hPiI7CisgICAgICBkYXRhX3R5cGVzLmluc2VydChwYWlyPHN0cmluZywgc3RyaW5nPihuYW1lLCBodG1sKSk7CisgICAgfQorICB9CisgIGlmICghdHByb2ctPmdldF90eXBlZGVmcygpLmVtcHR5KCkpIHsKKyAgICB2ZWN0b3I8dF90eXBlZGVmKj4gdHlwZWRlZnMgPSB0cHJvZy0+Z2V0X3R5cGVkZWZzKCk7CisgICAgdmVjdG9yPHRfdHlwZWRlZio+OjppdGVyYXRvciB0ZF9pdGVyOworICAgIGZvciAodGRfaXRlciA9IHR5cGVkZWZzLmJlZ2luKCk7IHRkX2l0ZXIgIT0gdHlwZWRlZnMuZW5kKCk7ICsrdGRfaXRlcikgeworICAgICAgc3RyaW5nIG5hbWUgPSAoKnRkX2l0ZXIpLT5nZXRfc3ltYm9saWMoKTsKKyAgICAgIC8vIGZfb3V0XyA8PCAiPGEgaHJlZj1cIiIgPDwgbWFrZV9maWxlX2xpbmsoZm5hbWUpIDw8ICIjVHlwZWRlZl8iIDw8IG5hbWUgPDwgIlwiPiIgPDwgbmFtZQorICAgICAgLy8gPDwgIjwvYT48YnIvPiIgPDwgZW5kbDsKKyAgICAgIHN0cmluZyBodG1sID0gIjxhIGhyZWY9XCIiICsgbWFrZV9maWxlX2xpbmsoZm5hbWUpICsgIiNUeXBlZGVmXyIgKyBuYW1lICsgIlwiPiIgKyBuYW1lCisgICAgICAgICAgICAgICAgICAgICsgIjwvYT4iOworICAgICAgZGF0YV90eXBlcy5pbnNlcnQocGFpcjxzdHJpbmcsIHN0cmluZz4obmFtZSwgaHRtbCkpOworICAgIH0KKyAgfQorICBpZiAoIXRwcm9nLT5nZXRfb2JqZWN0cygpLmVtcHR5KCkpIHsKKyAgICB2ZWN0b3I8dF9zdHJ1Y3QqPiBvYmplY3RzID0gdHByb2ctPmdldF9vYmplY3RzKCk7CisgICAgdmVjdG9yPHRfc3RydWN0Kj46Oml0ZXJhdG9yIG9faXRlcjsKKyAgICBmb3IgKG9faXRlciA9IG9iamVjdHMuYmVnaW4oKTsgb19pdGVyICE9IG9iamVjdHMuZW5kKCk7ICsrb19pdGVyKSB7CisgICAgICBzdHJpbmcgbmFtZSA9ICgqb19pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgIC8vIGZfb3V0XyA8PCAiPGEgaHJlZj1cIiIgPDwgbWFrZV9maWxlX2xpbmsoZm5hbWUpIDw8ICIjU3RydWN0XyIgPDwgbmFtZSA8PCAiXCI+IiA8PCBuYW1lCisgICAgICAvLzw8ICI8L2E+PGJyLz4iIDw8IGVuZGw7CisgICAgICBzdHJpbmcgaHRtbCA9ICI8YSBocmVmPVwiIiArIG1ha2VfZmlsZV9saW5rKGZuYW1lKSArICIjU3RydWN0XyIgKyBuYW1lICsgIlwiPiIgKyBuYW1lCisgICAgICAgICAgICAgICAgICAgICsgIjwvYT4iOworICAgICAgZGF0YV90eXBlcy5pbnNlcnQocGFpcjxzdHJpbmcsIHN0cmluZz4obmFtZSwgaHRtbCkpOworICAgIH0KKyAgfQorICBmb3IgKG1hcDxzdHJpbmcsIHN0cmluZz46Oml0ZXJhdG9yIGR0X2l0ZXIgPSBkYXRhX3R5cGVzLmJlZ2luKCk7IGR0X2l0ZXIgIT0gZGF0YV90eXBlcy5lbmQoKTsKKyAgICAgICBkdF9pdGVyKyspIHsKKyAgICBmX291dF8gPDwgZHRfaXRlci0+c2Vjb25kIDw8ICI8YnIvPiIgPDwgZW5kbDsKKyAgfQorICBmX291dF8gPDwgIjwvdGQ+IiA8PCBlbmRsIDw8ICI8dGQ+IjsKKyAgaWYgKCF0cHJvZy0+Z2V0X2NvbnN0cygpLmVtcHR5KCkpIHsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IGNvbnN0X2h0bWw7CisgICAgdmVjdG9yPHRfY29uc3QqPiBjb25zdHMgPSB0cHJvZy0+Z2V0X2NvbnN0cygpOworICAgIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNvbl9pdGVyOworICAgIGZvciAoY29uX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY29uX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2Nvbl9pdGVyKSB7CisgICAgICBzdHJpbmcgbmFtZSA9ICgqY29uX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgc3RyaW5nIGh0bWwgPSAiPGNvZGU+PGEgaHJlZj1cIiIgKyBtYWtlX2ZpbGVfbGluayhmbmFtZSkgKyAiI0NvbnN0XyIgKyBuYW1lICsgIlwiPiIgKyBuYW1lCisgICAgICAgICAgICAgICAgICAgICsgIjwvYT48L2NvZGU+IjsKKyAgICAgIGNvbnN0X2h0bWwuaW5zZXJ0KHBhaXI8c3RyaW5nLCBzdHJpbmc+KG5hbWUsIGh0bWwpKTsKKyAgICB9CisgICAgZm9yIChtYXA8c3RyaW5nLCBzdHJpbmc+OjppdGVyYXRvciBjb25faXRlciA9IGNvbnN0X2h0bWwuYmVnaW4oKTsgY29uX2l0ZXIgIT0gY29uc3RfaHRtbC5lbmQoKTsKKyAgICAgICAgIGNvbl9pdGVyKyspIHsKKyAgICAgIGZfb3V0XyA8PCBjb25faXRlci0+c2Vjb25kIDw8ICI8YnIvPiIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgZl9vdXRfIDw8ICI8L2NvZGU+PC90ZD4iIDw8IGVuZGwgPDwgIjwvdHI+IjsKK30KKworLyoqCisgKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAorICogc3RyZWFtLgorICovCit2b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2dyYW0oKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQorICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworICBjdXJyZW50X2ZpbGVfID0gcHJvZ3JhbV8tPmdldF9uYW1lKCkgKyAiLmh0bWwiOworICBzdHJpbmcgZm5hbWUgPSBnZXRfb3V0X2RpcigpICsgY3VycmVudF9maWxlXzsKKyAgZl9vdXRfLm9wZW4oZm5hbWUuY19zdHIoKSk7CisgIGZfb3V0XyA8PCAiPCFET0NUWVBFIGh0bWwgUFVCTElDIFwiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU5cIiIgPDwgZW5kbDsKKyAgZl9vdXRfIDw8ICIgICAgXCJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkXCI+IiA8PCBlbmRsOworICBmX291dF8gPDwgIjxodG1sIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbFwiPiIgPDwgZW5kbDsKKyAgZl9vdXRfIDw8ICI8aGVhZD4iIDw8IGVuZGw7CisgIGZfb3V0XyA8PCAiPG1ldGEgaHR0cC1lcXVpdj1cIkNvbnRlbnQtVHlwZVwiIGNvbnRlbnQ9XCJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOFwiIC8+IiA8PCBlbmRsOworICBnZW5lcmF0ZV9zdHlsZV90YWcoKTsKKyAgZl9vdXRfIDw8ICI8dGl0bGU+VGhyaWZ0IG1vZHVsZTogIiA8PCBwcm9ncmFtXy0+Z2V0X25hbWUoKSA8PCAiPC90aXRsZT48L2hlYWQ+PGJvZHk+IiA8PCBlbmRsCisgICAgICAgICA8PCAiPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPiIgPDwgZW5kbAorICAgICAgICAgPDwgIjxoMT5UaHJpZnQgbW9kdWxlOiAiIDw8IHByb2dyYW1fLT5nZXRfbmFtZSgpIDw8ICI8L2gxPiIgPDwgZW5kbDsKKworICBwcmludF9kb2MocHJvZ3JhbV8pOworCisgIGdlbmVyYXRlX3Byb2dyYW1fdG9jKCk7CisKKyAgaWYgKCFwcm9ncmFtXy0+Z2V0X2NvbnN0cygpLmVtcHR5KCkpIHsKKyAgICBmX291dF8gPDwgIjxoci8+PGgyIGlkPVwiQ29uc3RhbnRzXCI+Q29uc3RhbnRzPC9oMj4iIDw8IGVuZGw7CisgICAgdmVjdG9yPHRfY29uc3QqPiBjb25zdHMgPSBwcm9ncmFtXy0+Z2V0X2NvbnN0cygpOworICAgIGZfb3V0XyA8PCAiPHRhYmxlIGNsYXNzPVwidGFibGUtYm9yZGVyZWQgdGFibGUtc3RyaXBlZCB0YWJsZS1jb25kZW5zZWRcIj4iOworICAgIGZfb3V0XyA8PCAiPHRoZWFkPjx0aD5Db25zdGFudDwvdGg+PHRoPlR5cGU8L3RoPjx0aD5WYWx1ZTwvdGg+PC90aGVhZD4iIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfY29uc3RzKGNvbnN0cyk7CisgICAgZl9vdXRfIDw8ICI8L3RhYmxlPiI7CisgIH0KKworICBpZiAoIXByb2dyYW1fLT5nZXRfZW51bXMoKS5lbXB0eSgpKSB7CisgICAgZl9vdXRfIDw8ICI8aHIvPjxoMiBpZD1cIkVudW1lcmF0aW9uc1wiPkVudW1lcmF0aW9uczwvaDI+IiA8PCBlbmRsOworICAgIC8vIEdlbmVyYXRlIGVudW1zCisgICAgdmVjdG9yPHRfZW51bSo+IGVudW1zID0gcHJvZ3JhbV8tPmdldF9lbnVtcygpOworICAgIHZlY3Rvcjx0X2VudW0qPjo6aXRlcmF0b3IgZW5faXRlcjsKKyAgICBmb3IgKGVuX2l0ZXIgPSBlbnVtcy5iZWdpbigpOyBlbl9pdGVyICE9IGVudW1zLmVuZCgpOyArK2VuX2l0ZXIpIHsKKyAgICAgIGdlbmVyYXRlX2VudW0oKmVuX2l0ZXIpOworICAgIH0KKyAgfQorCisgIGlmICghcHJvZ3JhbV8tPmdldF90eXBlZGVmcygpLmVtcHR5KCkpIHsKKyAgICBmX291dF8gPDwgIjxoci8+PGgyIGlkPVwiVHlwZWRlZnNcIj5UeXBlIGRlY2xhcmF0aW9uczwvaDI+IiA8PCBlbmRsOworICAgIC8vIEdlbmVyYXRlIHR5cGVkZWZzCisgICAgdmVjdG9yPHRfdHlwZWRlZio+IHR5cGVkZWZzID0gcHJvZ3JhbV8tPmdldF90eXBlZGVmcygpOworICAgIHZlY3Rvcjx0X3R5cGVkZWYqPjo6aXRlcmF0b3IgdGRfaXRlcjsKKyAgICBmb3IgKHRkX2l0ZXIgPSB0eXBlZGVmcy5iZWdpbigpOyB0ZF9pdGVyICE9IHR5cGVkZWZzLmVuZCgpOyArK3RkX2l0ZXIpIHsKKyAgICAgIGdlbmVyYXRlX3R5cGVkZWYoKnRkX2l0ZXIpOworICAgIH0KKyAgfQorCisgIGlmICghcHJvZ3JhbV8tPmdldF9vYmplY3RzKCkuZW1wdHkoKSkgeworICAgIGZfb3V0XyA8PCAiPGhyLz48aDIgaWQ9XCJTdHJ1Y3RzXCI+RGF0YSBzdHJ1Y3R1cmVzPC9oMj4iIDw8IGVuZGw7CisgICAgLy8gR2VuZXJhdGUgc3RydWN0cyBhbmQgZXhjZXB0aW9ucyBpbiBkZWNsYXJlZCBvcmRlcgorICAgIHZlY3Rvcjx0X3N0cnVjdCo+IG9iamVjdHMgPSBwcm9ncmFtXy0+Z2V0X29iamVjdHMoKTsKKyAgICB2ZWN0b3I8dF9zdHJ1Y3QqPjo6aXRlcmF0b3Igb19pdGVyOworICAgIGZvciAob19pdGVyID0gb2JqZWN0cy5iZWdpbigpOyBvX2l0ZXIgIT0gb2JqZWN0cy5lbmQoKTsgKytvX2l0ZXIpIHsKKyAgICAgIGlmICgoKm9faXRlciktPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgICAgZ2VuZXJhdGVfeGNlcHRpb24oKm9faXRlcik7CisgICAgICB9IGVsc2UgeworICAgICAgICBnZW5lcmF0ZV9zdHJ1Y3QoKm9faXRlcik7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKCFwcm9ncmFtXy0+Z2V0X3NlcnZpY2VzKCkuZW1wdHkoKSkgeworICAgIGZfb3V0XyA8PCAiPGhyLz48aDIgaWQ9XCJTZXJ2aWNlc1wiPlNlcnZpY2VzPC9oMj4iIDw8IGVuZGw7CisgICAgLy8gR2VuZXJhdGUgc2VydmljZXMKKyAgICB2ZWN0b3I8dF9zZXJ2aWNlKj4gc2VydmljZXMgPSBwcm9ncmFtXy0+Z2V0X3NlcnZpY2VzKCk7CisgICAgdmVjdG9yPHRfc2VydmljZSo+OjppdGVyYXRvciBzdl9pdGVyOworICAgIGZvciAoc3ZfaXRlciA9IHNlcnZpY2VzLmJlZ2luKCk7IHN2X2l0ZXIgIT0gc2VydmljZXMuZW5kKCk7ICsrc3ZfaXRlcikgeworICAgICAgc2VydmljZV9uYW1lXyA9IGdldF9zZXJ2aWNlX25hbWUoKnN2X2l0ZXIpOworICAgICAgZ2VuZXJhdGVfc2VydmljZSgqc3ZfaXRlcik7CisgICAgfQorICB9CisKKyAgZl9vdXRfIDw8ICI8L2Rpdj48L2JvZHk+PC9odG1sPiIgPDwgZW5kbDsKKyAgZl9vdXRfLmNsb3NlKCk7CisKKyAgZ2VuZXJhdGVfaW5kZXgoKTsKKyAgZ2VuZXJhdGVfY3NzKCk7Cit9CisKKy8qKgorICogRW1pdHMgdGhlIGluZGV4Lmh0bWwgZmlsZSBmb3IgdGhlIHJlY3Vyc2l2ZSBzZXQgb2YgVGhyaWZ0IHByb2dyYW1zCisgKi8KK3ZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaW5kZXgoKSB7CisgIGN1cnJlbnRfZmlsZV8gPSAiaW5kZXguaHRtbCI7CisgIHN0cmluZyBpbmRleF9mbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBjdXJyZW50X2ZpbGVfOworICBmX291dF8ub3BlbihpbmRleF9mbmFtZS5jX3N0cigpKTsKKyAgZl9vdXRfIDw8ICI8aHRtbD48aGVhZD4iIDw8IGVuZGw7CisgIGdlbmVyYXRlX3N0eWxlX3RhZygpOworICBmX291dF8gPDwgIjx0aXRsZT5BbGwgVGhyaWZ0IGRlY2xhcmF0aW9uczwvdGl0bGU+PC9oZWFkPjxib2R5PiIgPDwgZW5kbAorICAgICAgICAgPDwgIjxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj4iIDw8IGVuZGwgPDwgIjxoMT5BbGwgVGhyaWZ0IGRlY2xhcmF0aW9uczwvaDE+IiA8PCBlbmRsOworICBmX291dF8gPDwgIjx0YWJsZSBjbGFzcz1cInRhYmxlLWJvcmRlcmVkIHRhYmxlLXN0cmlwZWQgIgorICAgICAgICAgICAgInRhYmxlLWNvbmRlbnNlZFwiPjx0aGVhZD48dGg+TW9kdWxlPC90aD48dGg+U2VydmljZXM8L3RoPjx0aD5EYXRhIHR5cGVzPC90aD4iCisgICAgICAgICA8PCAiPHRoPkNvbnN0YW50czwvdGg+PC90aGVhZD4iIDw8IGVuZGw7CisgIHZlY3Rvcjx0X3Byb2dyYW0qPiBwcm9ncmFtczsKKyAgZ2VuZXJhdGVfcHJvZ3JhbV90b2Nfcm93cyhwcm9ncmFtXywgcHJvZ3JhbXMpOworICBmX291dF8gPDwgIjwvdGFibGU+IiA8PCBlbmRsOworICBmX291dF8gPDwgIjwvZGl2PjwvYm9keT48L2h0bWw+IiA8PCBlbmRsOworICBmX291dF8uY2xvc2UoKTsKK30KKwordm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc3MoKSB7CisgIGlmICghc3RhbmRhbG9uZV8pIHsKKyAgICBjdXJyZW50X2ZpbGVfID0gInN0eWxlLmNzcyI7CisgICAgc3RyaW5nIGNzc19mbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBjdXJyZW50X2ZpbGVfOworICAgIGZfb3V0Xy5vcGVuKGNzc19mbmFtZS5jX3N0cigpKTsKKyAgICBnZW5lcmF0ZV9jc3NfY29udGVudChmX291dF8pOworICAgIGZfb3V0Xy5jbG9zZSgpOworICB9Cit9CisKK3ZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NzX2NvbnRlbnQoc3RkOjpvc3RyZWFtJiBmX3RhcmdldCkgeworICBmX3RhcmdldCA8PCBCT09UU1RSQVBfQ1NTKCkgPDwgZW5kbDsKKyAgZl90YXJnZXQgPDwgIi8qIEF1dG8tZ2VuZXJhdGVkIENTUyBmb3IgZ2VuZXJhdGVkIFRocmlmdCBkb2NzICovIiA8PCBlbmRsOworICBmX3RhcmdldCA8PCAiaDMsIGg0IHsgbWFyZ2luLWJvdHRvbTogNnB4OyB9IiA8PCBlbmRsOworICBmX3RhcmdldCA8PCAiZGl2LmRlZmluaXRpb24geyBib3JkZXI6IDFweCBzb2xpZCAjQ0NDOyBtYXJnaW4tYm90dG9tOiAxMHB4OyBwYWRkaW5nOiAxMHB4OyB9IgorICAgICAgICAgICA8PCBlbmRsOworICBmX3RhcmdldCA8PCAiZGl2LmV4dGVuZHMgeyBtYXJnaW46IC0wLjVlbSAwIDFlbSA1ZW0gfSIgPDwgZW5kbDsKKyAgZl90YXJnZXQgPDwgInRkIHsgdmVydGljYWwtYWxpZ246IHRvcDsgfSIgPDwgZW5kbDsKKyAgZl90YXJnZXQgPDwgInRhYmxlIHsgZW1wdHktY2VsbHM6IHNob3c7IH0iIDw8IGVuZGw7CisgIGZfdGFyZ2V0IDw8ICJjb2RlIHsgbGluZS1oZWlnaHQ6IDIwcHg7IH0iIDw8IGVuZGw7CisgIGZfdGFyZ2V0IDw8ICIudGFibGUtYm9yZGVyZWQgdGgsIC50YWJsZS1ib3JkZXJlZCB0ZCB7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjREREREREOyB9IgorICAgICAgICAgICA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgQ1NTIHRhZy4KKyAqIERlcGVuZGluZyBvbiAic3RhbmRhbG9uZSIsIGVpdGhlciBhIENTUyBmaWxlIGxpbmsgKGRlZmF1bHQpLCBvciB0aGUgZW50aXJlIENTUyBpcyBlbWJlZGRlZAorICogaW5saW5lLgorICovCit2b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0eWxlX3RhZygpIHsKKyAgaWYgKCFzdGFuZGFsb25lXykgeworICAgIGZfb3V0XyA8PCAiPGxpbmsgaHJlZj1cInN0eWxlLmNzc1wiIHJlbD1cInN0eWxlc2hlZXRcIiB0eXBlPVwidGV4dC9jc3NcIi8+IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfb3V0XyA8PCAiPHN0eWxlIHR5cGU9XCJ0ZXh0L2Nzc1wiLz48IS0tIiA8PCBlbmRsOworICAgIGdlbmVyYXRlX2Nzc19jb250ZW50KGZfb3V0Xyk7CisgICAgZl9vdXRfIDw8ICItLT48L3N0eWxlPiIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIFJldHVybnMgdGhlIHRhcmdldCBmaWxlIGZvciBhIDxhIGhyZWY+IGxpbmsKKyAqIFRoZSByZXR1cm5lZCBzdHJpbmcgaXMgZW1wdHksIHdoZW5ldmVyIGZpbGVuYW1lIHJlZmVycyB0byB0aGUgY3VycmVudCBmaWxlLgorICovCitzdGQ6OnN0cmluZyB0X2h0bWxfZ2VuZXJhdG9yOjptYWtlX2ZpbGVfbGluayhzdGQ6OnN0cmluZyBmaWxlbmFtZSkgeworICByZXR1cm4gKGN1cnJlbnRfZmlsZV8uY29tcGFyZShmaWxlbmFtZSkgIT0gMCkgPyBmaWxlbmFtZSA6ICIiOworfQorCisvKioKKyAqIElmIHRoZSBwcm92aWRlZCBkb2N1bWVudGFibGUgb2JqZWN0IGhhcyBkb2N1bWVudGF0aW9uIGF0dGFjaGVkLCB0aGlzCisgKiB3aWxsIGVtaXQgaXQgdG8gdGhlIG91dHB1dCBzdHJlYW0gaW4gSFRNTCBmb3JtYXQuCisgKi8KK3ZvaWQgdF9odG1sX2dlbmVyYXRvcjo6cHJpbnRfZG9jKHRfZG9jKiB0ZG9jKSB7CisgIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKKyAgICBpZiAodW5zYWZlXykgeworICAgICAgZl9vdXRfIDw8IHRkb2MtPmdldF9kb2MoKSA8PCAiPGJyLz4iOworICAgIH0gZWxzZSB7CisgICAgICBmX291dF8gPDwgIjxwcmU+IiA8PCBlc2NhcGVfaHRtbCh0ZG9jLT5nZXRfZG9jKCkpIDw8ICI8L3ByZT48YnIvPiI7CisgICAgfQorICB9Cit9CisKK2Jvb2wgdF9odG1sX2dlbmVyYXRvcjo6aXNfdXRmOF9zZXF1ZW5jZShzdGQ6OnN0cmluZyBjb25zdCYgc3RyLCBzaXplX3QgZmlyc3Rwb3MpIHsKKyAgLy8gbGVhZGluZyBjaGFyIGRldGVybWluZXMgdGhlIGxlbmd0aCBvZiB0aGUgc2VxdWVuY2UKKyAgdW5zaWduZWQgY2hhciBjID0gc3RyLmF0KGZpcnN0cG9zKTsKKyAgaW50IGNvdW50ID0gMDsKKyAgaWYgKChjICYgMHhFMCkgPT0gMHhDMCkgeworICAgIGNvdW50ID0gMTsKKyAgfSBlbHNlIGlmICgoYyAmIDB4RjApID09IDB4RTApIHsKKyAgICBjb3VudCA9IDI7CisgIH0gZWxzZSBpZiAoKGMgJiAweEY4KSA9PSAweEYwKSB7CisgICAgY291bnQgPSAzOworICB9IGVsc2UgaWYgKChjICYgMHhGQykgPT0gMHhGOCkgeworICAgIGNvdW50ID0gNDsKKyAgfSBlbHNlIGlmICgoYyAmIDB4RkUpID09IDB4RkMpIHsKKyAgICBjb3VudCA9IDU7CisgIH0gZWxzZSB7CisgICAgLy8gcGRlYnVnKCJVVEYtOCB0ZXN0OiBjaGFyICclYycgKCVkKSBpcyBub3QgYSB2YWxpZCBVVEYtOCBsZWFkaW5nIGJ5dGUiLCBjLCBpbnQoYykpOworICAgIHJldHVybiBmYWxzZTsgLy8gbm8gVVRGLTgKKyAgfQorCisgIC8vIGZvbGxvd2luZyBjaGFycworICBzaXplX3QgcG9zID0gZmlyc3Rwb3MgKyAxOworICB3aGlsZSAoKHBvcyA8IHN0ci5sZW5ndGgoKSkgJiYgKDAgPCBjb3VudCkpIHsKKyAgICBjID0gc3RyLmF0KHBvcyk7CisgICAgaWYgKChjICYgMHhDMCkgIT0gMHg4MCkgeworICAgICAgLy8gcGRlYnVnKCJVVEYtOCB0ZXN0OiBjaGFyICclYycgKCVkKSBpcyBub3QgYSB2YWxpZCBVVEYtOCBmb2xsb3dpbmcgYnl0ZSIsIGMsIGludChjKSk7CisgICAgICByZXR1cm4gZmFsc2U7IC8vIG5vIFVURi04CisgICAgfQorICAgIC0tY291bnQ7CisgICAgKytwb3M7CisgIH0KKworICAvLyB0cnVlIGlmIHRoZSBzZXF1ZW5jZSBpcyBjb21wbGV0ZQorICByZXR1cm4gKDAgPT0gY291bnQpOworfQorCit2b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmRldGVjdF9pbnB1dF9lbmNvZGluZyhzdGQ6OnN0cmluZyBjb25zdCYgc3RyLCBzaXplX3QgZmlyc3Rwb3MpIHsKKyAgaWYgKGlzX3V0Zjhfc2VxdWVuY2Uoc3RyLCBmaXJzdHBvcykpIHsKKyAgICBwZGVidWcoIklucHV0IHNlZW1zIHRvIGJlIGFscmVhZHkgVVRGLTggZW5jb2RlZCIpOworICAgIGlucHV0X3R5cGVfID0gSU5QVVRfVVRGODsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBmYWxsYmFjaworICBwd2FybmluZygxLCAiSW5wdXQgaXMgbm90IFVURi04LCB0cmVhdGluZyBhcyBwbGFpbiBBTlNJIik7CisgIGlucHV0X3R5cGVfID0gSU5QVVRfUExBSU47Cit9CisKK3ZvaWQgdF9odG1sX2dlbmVyYXRvcjo6aW5pdF9hbGxvd2VkX19tYXJrdXAoKSB7CisgIGFsbG93ZWRfbWFya3VwLmNsZWFyKCk7CisgIC8vIHN0YW5kYWxvbmUgdGFncworICBhbGxvd2VkX21hcmt1cFsiYnIiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyJici8iXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyJpbWciXSA9IDE7CisgIC8vIHBhaXJlZCB0YWdzCisgIGFsbG93ZWRfbWFya3VwWyJiIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiL2IiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyJ1Il0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiL3UiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyJpIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiL2kiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyJzIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiL3MiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyJiaWciXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyIvYmlnIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsic21hbGwiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyIvc21hbGwiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyJzdXAiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyIvc3VwIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsic3ViIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiL3N1YiJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbInByZSJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi9wcmUiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyJ0dCJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi90dCJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbInVsIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiL3VsIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsib2wiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyIvb2wiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyJsaSJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi9saSJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbImEiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyIvYSJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbInAiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyIvcCJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbImNvZGUiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyIvY29kZSJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbImRsIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiL2RsIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiZHQiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyIvZHQiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyJkZCJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi9kZCJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbImgxIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiL2gxIl0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiaDIiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyIvaDIiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyJoMyJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi9oMyJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbImg0Il0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiL2g0Il0gPSAxOworICBhbGxvd2VkX21hcmt1cFsiaDUiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyIvaDUiXSA9IDE7CisgIGFsbG93ZWRfbWFya3VwWyJoNiJdID0gMTsKKyAgYWxsb3dlZF9tYXJrdXBbIi9oNiJdID0gMTsKK30KKworc3RkOjpzdHJpbmcgdF9odG1sX2dlbmVyYXRvcjo6ZXNjYXBlX2h0bWxfdGFncyhzdGQ6OnN0cmluZyBjb25zdCYgc3RyKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSByZXN1bHQ7CisKKyAgdW5zaWduZWQgY2hhciBjID0gJz8nOworICBzaXplX3QgbGFzdHBvczsKKyAgc2l6ZV90IGZpcnN0cG9zID0gMDsKKyAgd2hpbGUgKGZpcnN0cG9zIDwgc3RyLmxlbmd0aCgpKSB7CisKKyAgICAvLyBsb29rIGZvciBub24tQVNDSUkgY2hhcgorICAgIGxhc3Rwb3MgPSBmaXJzdHBvczsKKyAgICB3aGlsZSAobGFzdHBvcyA8IHN0ci5sZW5ndGgoKSkgeworICAgICAgYyA9IHN0ci5hdChsYXN0cG9zKTsKKyAgICAgIGlmICgoJzwnID09IGMpIHx8ICgnPicgPT0gYykpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICArK2xhc3Rwb3M7CisgICAgfQorCisgICAgLy8gY29weSB3aGF0IHdlIGdvdCBzbyBmYXIKKyAgICBpZiAobGFzdHBvcyA+IGZpcnN0cG9zKSB7CisgICAgICByZXN1bHQgPDwgc3RyLnN1YnN0cihmaXJzdHBvcywgbGFzdHBvcyAtIGZpcnN0cG9zKTsKKyAgICAgIGZpcnN0cG9zID0gbGFzdHBvczsKKyAgICB9CisKKyAgICAvLyByZWFjaGVkIHRoZSBlbmQ/CisgICAgaWYgKGZpcnN0cG9zID49IHN0ci5sZW5ndGgoKSkgeworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy8gdGFnIGVuZCB3aXRob3V0IGNvcnJlc3BvbmRpbmcgYmVnaW4KKyAgICArK2ZpcnN0cG9zOworICAgIGlmICgnPicgPT0gYykgeworICAgICAgcmVzdWx0IDw8ICImZ3Q7IjsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8vIGV4dHJhY3QgdGhlIHRhZworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSB0YWdzdHJlYW07CisgICAgd2hpbGUgKGZpcnN0cG9zIDwgc3RyLmxlbmd0aCgpKSB7CisgICAgICBjID0gc3RyLmF0KGZpcnN0cG9zKTsKKyAgICAgICsrZmlyc3Rwb3M7CisgICAgICBpZiAoJzwnID09IGMpIHsKKyAgICAgICAgdGFnc3RyZWFtIDw8ICImbHQ7IjsgLy8gbmVzdGVkIGJlZ2luPworICAgICAgfSBlbHNlIGlmICgnPicgPT0gYykgeworICAgICAgICBicmVhazsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRhZ3N0cmVhbSA8PCBjOyAvLyBub3QgdmVyeSBlZmZpY2llbnQsIGJ1dCB0YWdzIHNob3VsZCBiZSBxdWl0ZSBzaG9ydAorICAgICAgfQorICAgIH0KKworICAgIC8vIHdlIGFsbG93IGZvciBzZXZlcmFsIG1hcmt1cCBpbiBkb2NzdHJpbmdzLCBhbGwgZWxzZSB3aWxsIGJlY29tZSBlc2NhcGVkCisgICAgc3RyaW5nIHRhZ19jb250ZW50ID0gdGFnc3RyZWFtLnN0cigpOworICAgIHN0cmluZyB0YWdfa2V5ID0gdGFnX2NvbnRlbnQ7CisgICAgc2l6ZV90IGZpcnN0X3doaXRlID0gdGFnX2tleS5maW5kX2ZpcnN0X29mKCIgXHRcZlx2XG5cciIpOworICAgIGlmIChmaXJzdF93aGl0ZSAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgIHRhZ19rZXkuZXJhc2UoZmlyc3Rfd2hpdGUpOworICAgIH0KKyAgICBmb3IgKHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgaSA9IDA7IGkgPCB0YWdfa2V5Lmxlbmd0aCgpOyArK2kpIHsKKyAgICAgIHRhZ19rZXlbaV0gPSB0b2xvd2VyKHRhZ19rZXlbaV0pOworICAgIH0KKyAgICBpZiAoYWxsb3dlZF9tYXJrdXAuZmluZCh0YWdfa2V5KSAhPSBhbGxvd2VkX21hcmt1cC5lbmQoKSkgeworICAgICAgcmVzdWx0IDw8ICI8IiA8PCB0YWdfY29udGVudCA8PCAiPiI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCA8PCAiJmx0OyIgPDwgdGFnc3RyZWFtLnN0cigpIDw8ICImZ3Q7IjsKKyAgICAgIHB2ZXJib3NlKCJpbGxlZ2FsIG1hcmt1cCA8JXM+IGluIGRvYy1jb21tZW50XG4iLCB0YWdfa2V5LmNfc3RyKCkpOworICAgIH0KKyAgfQorCisgIHJldHVybiByZXN1bHQuc3RyKCk7Cit9CisKK3N0ZDo6c3RyaW5nIHRfaHRtbF9nZW5lcmF0b3I6OmVzY2FwZV9odG1sKHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIpIHsKKyAgLy8gdGhlIGdlbmVyYXRlZCBIVE1MIGhlYWRlciBzYXlzIGl0IGlzIFVURi04IGVuY29kZWQKKyAgLy8gaWYgVVRGLTggaW5wdXQgaGFzIGJlZW4gZGV0ZWN0ZWQgYmVmb3JlLCB3ZSBkb24ndCBuZWVkIHRvIGNoYW5nZSBhbnl0aGluZworICBpZiAoaW5wdXRfdHlwZV8gPT0gSU5QVVRfVVRGOCkgeworICAgIHJldHVybiBlc2NhcGVfaHRtbF90YWdzKHN0cik7CisgIH0KKworICAvLyBjb252ZXJ0IHVuc2FmZSBjaGFycyB0byB0aGVpciAmIzxudW0+OyBlcXVpdmFsZW50CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSByZXN1bHQ7CisgIHVuc2lnbmVkIGNoYXIgYyA9ICc/JzsKKyAgdW5zaWduZWQgaW50IGljID0gMDsKKyAgc2l6ZV90IGxhc3Rwb3M7CisgIHNpemVfdCBmaXJzdHBvcyA9IDA7CisgIHdoaWxlIChmaXJzdHBvcyA8IHN0ci5sZW5ndGgoKSkgeworCisgICAgLy8gbG9vayBmb3Igbm9uLUFTQ0lJIGNoYXIKKyAgICBsYXN0cG9zID0gZmlyc3Rwb3M7CisgICAgd2hpbGUgKGxhc3Rwb3MgPCBzdHIubGVuZ3RoKCkpIHsKKyAgICAgIGMgPSBzdHIuYXQobGFzdHBvcyk7CisgICAgICBpYyA9IGM7CisgICAgICBpZiAoKDMyID4gaWMpIHx8ICgxMjcgPCBpYykpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICArK2xhc3Rwb3M7CisgICAgfQorCisgICAgLy8gY29weSB3aGF0IHdlIGdvdCBzbyBmYXIKKyAgICBpZiAobGFzdHBvcyA+IGZpcnN0cG9zKSB7CisgICAgICByZXN1bHQgPDwgc3RyLnN1YnN0cihmaXJzdHBvcywgbGFzdHBvcyAtIGZpcnN0cG9zKTsKKyAgICAgIGZpcnN0cG9zID0gbGFzdHBvczsKKyAgICB9CisKKyAgICAvLyByZWFjaGVkIHRoZSBlbmQ/CisgICAgaWYgKGZpcnN0cG9zID49IHN0ci5sZW5ndGgoKSkgeworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy8gc29tZSBjb250cm9sIGNvZGU/CisgICAgaWYgKGljIDw9IDMxKSB7CisgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgIGNhc2UgJ1xyJzoKKyAgICAgIGNhc2UgJ1xuJzoKKyAgICAgIGNhc2UgJ1x0JzoKKyAgICAgICAgcmVzdWx0IDw8IGM7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDogLy8gc2lsZW50bHkgY29uc3VtZSBhbGwgb3RoZXIgY3RybCBjaGFycworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgICsrZmlyc3Rwb3M7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyByZWFjaGVkIHRoZSBlbmQ/CisgICAgaWYgKGZpcnN0cG9zID49IHN0ci5sZW5ndGgoKSkgeworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy8gdHJ5IHRvIGRldGVjdCBpbnB1dCBlbmNvZGluZworICAgIGlmIChpbnB1dF90eXBlXyA9PSBJTlBVVF9VTktOT1dOKSB7CisgICAgICBkZXRlY3RfaW5wdXRfZW5jb2Rpbmcoc3RyLCBmaXJzdHBvcyk7CisgICAgICBpZiAoaW5wdXRfdHlwZV8gPT0gSU5QVVRfVVRGOCkgeworICAgICAgICBsYXN0cG9zID0gc3RyLmxlbmd0aCgpOworICAgICAgICByZXN1bHQgPDwgc3RyLnN1YnN0cihmaXJzdHBvcywgbGFzdHBvcyAtIGZpcnN0cG9zKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgLy8gY29udmVydCB0aGUgY2hhcmFjdGVyIHRvIHNvbWV0aGluZyB1c2VmdWwgYmFzZWQgb24gdGhlIGRldGVjdGVkIGVuY29kaW5nCisgICAgc3dpdGNoIChpbnB1dF90eXBlXykgeworICAgIGNhc2UgSU5QVVRfUExBSU46CisgICAgICByZXN1bHQgPDwgIiYjIiA8PCBpYyA8PCAiOyI7CisgICAgICArK2ZpcnN0cG9zOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJVbmV4cGVjdGVkIG9yIHVucmVjb2duaXplZCBpbnB1dCBlbmNvZGluZyI7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGVzY2FwZV9odG1sX3RhZ3MocmVzdWx0LnN0cigpKTsKK30KKworLyoqCisgKiBQcmludHMgb3V0IHRoZSBwcm92aWRlZCB0eXBlIGluIEhUTUwKKyAqLworaW50IHRfaHRtbF9nZW5lcmF0b3I6OnByaW50X3R5cGUodF90eXBlKiB0dHlwZSkgeworICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGxlbiA9IDA7CisgIGZfb3V0XyA8PCAiPGNvZGU+IjsKKyAgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBmX291dF8gPDwgImxpc3QmbHQ7IjsKKyAgICAgIGxlbiA9IDYgKyBwcmludF90eXBlKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSk7CisgICAgICBmX291dF8gPDwgIiZndDsiOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgICBmX291dF8gPDwgInNldCZsdDsiOworICAgICAgbGVuID0gNSArIHByaW50X3R5cGUoKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpOworICAgICAgZl9vdXRfIDw8ICImZ3Q7IjsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgICAgZl9vdXRfIDw8ICJtYXAmbHQ7IjsKKyAgICAgIGxlbiA9IDUgKyBwcmludF90eXBlKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpOworICAgICAgZl9vdXRfIDw8ICIsICI7CisgICAgICBsZW4gKz0gcHJpbnRfdHlwZSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKTsKKyAgICAgIGZfb3V0XyA8PCAiJmd0OyI7CisgICAgfQorICB9IGVsc2UgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIGZfb3V0XyA8PCAodHR5cGUtPmlzX2JpbmFyeSgpID8gImJpbmFyeSIgOiB0dHlwZS0+Z2V0X25hbWUoKSk7CisgICAgbGVuID0gdHR5cGUtPmdldF9uYW1lKCkuc2l6ZSgpOworICB9IGVsc2UgeworICAgIHN0cmluZyBwcm9nX25hbWUgPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKTsKKyAgICBzdHJpbmcgdHlwZV9uYW1lID0gdHR5cGUtPmdldF9uYW1lKCk7CisgICAgZl9vdXRfIDw8ICI8YSBocmVmPVwiIiA8PCBtYWtlX2ZpbGVfbGluayhwcm9nX25hbWUgKyAiLmh0bWwiKSA8PCAiIyI7CisgICAgaWYgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICAgIGZfb3V0XyA8PCAiU3RydWN0XyI7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgIGZfb3V0XyA8PCAiU3RydWN0XyI7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBmX291dF8gPDwgIkVudW1fIjsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXJ2aWNlKCkpIHsKKyAgICAgIGZfb3V0XyA8PCAiU3ZjXyI7CisgICAgfQorICAgIGZfb3V0XyA8PCB0eXBlX25hbWUgPDwgIlwiPiI7CisgICAgbGVuID0gdHlwZV9uYW1lLnNpemUoKTsKKyAgICBpZiAodHR5cGUtPmdldF9wcm9ncmFtKCkgIT0gcHJvZ3JhbV8pIHsKKyAgICAgIGZfb3V0XyA8PCBwcm9nX25hbWUgPDwgIi4iOworICAgICAgbGVuICs9IHByb2dfbmFtZS5zaXplKCkgKyAxOworICAgIH0KKyAgICBmX291dF8gPDwgdHlwZV9uYW1lIDw8ICI8L2E+IjsKKyAgfQorICBmX291dF8gPDwgIjwvY29kZT4iOworICByZXR1cm4gKGludClsZW47Cit9CisKKy8qKgorICogUHJpbnRzIG91dCBhbiBIVE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwcm92aWRlZCBjb25zdGFudCB2YWx1ZQorICovCit2b2lkIHRfaHRtbF9nZW5lcmF0b3I6OnByaW50X2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdHZhbHVlKSB7CisKKyAgLy8gaWYgdHZhbHVlIGlzIGFuIGlkZW50aWZpZXIsIHRoZSBjb25zdGFudCBjb250ZW50IGlzIGFscmVhZHkgc2hvd24gZWxzZXdoZXJlCisgIGlmICh0dmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSURFTlRJRklFUikgeworICAgIHN0cmluZyBmbmFtZSA9IHByb2dyYW1fLT5nZXRfbmFtZSgpICsgIi5odG1sIjsKKyAgICBzdHJpbmcgbmFtZSA9IGVzY2FwZV9odG1sKHR2YWx1ZS0+Z2V0X2lkZW50aWZpZXIoKSk7CisgICAgZl9vdXRfIDw8ICI8Y29kZT48YSBocmVmPVwiIiArIG1ha2VfZmlsZV9saW5rKGZuYW1lKSArICIjQ29uc3RfIiArIG5hbWUgKyAiXCI+IiArIG5hbWUKKyAgICAgICAgICAgICAgKyAiPC9hPjwvY29kZT4iOworICAgIHJldHVybjsKKyAgfQorCisgIHRfdHlwZSogdHJ1ZXR5cGUgPSB0eXBlOworICB3aGlsZSAodHJ1ZXR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHRydWV0eXBlID0gKCh0X3R5cGVkZWYqKXRydWV0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgfQorCisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBpZiAodHJ1ZXR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXRydWV0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBmX291dF8gPDwgJyInIDw8IGVzY2FwZV9odG1sKGdldF9lc2NhcGVkX3N0cmluZyh0dmFsdWUpKSA8PCAnIic7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBmX291dF8gPDwgKCh0dmFsdWUtPmdldF9pbnRlZ2VyKCkgIT0gMCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBmX291dF8gPDwgdHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICBmX291dF8gPDwgdHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBmX291dF8gPDwgdHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBmX291dF8gPDwgdHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAodHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgZl9vdXRfIDw8IHR2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfb3V0XyA8PCB0dmFsdWUtPmdldF9kb3VibGUoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBmX291dF8gPDwgIlVOS05PV04gQkFTRSBUWVBFIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfSBlbHNlIGlmICh0cnVldHlwZS0+aXNfZW51bSgpKSB7CisgICAgZl9vdXRfIDw8IGVzY2FwZV9odG1sKHRydWV0eXBlLT5nZXRfbmFtZSgpKSA8PCAiLiIKKyAgICAgICAgICAgPDwgZXNjYXBlX2h0bWwodHZhbHVlLT5nZXRfaWRlbnRpZmllcl9uYW1lKCkpOworICB9IGVsc2UgaWYgKHRydWV0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0cnVldHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGZfb3V0XyA8PCAieyAiOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXRydWV0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHR2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0cnVldHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIKKyAgICAgICAgICAgICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOworICAgICAgfQorICAgICAgaWYgKCFmaXJzdCkgeworICAgICAgICBmX291dF8gPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICBmX291dF8gPDwgZXNjYXBlX2h0bWwodl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSA8PCAiID0gIjsKKyAgICAgIHByaW50X2NvbnN0X3ZhbHVlKGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICB9CisgICAgZl9vdXRfIDw8ICIgfSI7CisgIH0gZWxzZSBpZiAodHJ1ZXR5cGUtPmlzX21hcCgpKSB7CisgICAgZl9vdXRfIDw8ICJ7ICI7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4gbWFwX2VsZW1zID0gdHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46Oml0ZXJhdG9yIG1hcF9pdGVyOworICAgIGZvciAobWFwX2l0ZXIgPSBtYXBfZWxlbXMuYmVnaW4oKTsgbWFwX2l0ZXIgIT0gbWFwX2VsZW1zLmVuZCgpOyBtYXBfaXRlcisrKSB7CisgICAgICBpZiAoIWZpcnN0KSB7CisgICAgICAgIGZfb3V0XyA8PCAiLCAiOworICAgICAgfQorICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIHByaW50X2NvbnN0X3ZhbHVlKCgodF9tYXAqKXRydWV0eXBlKS0+Z2V0X2tleV90eXBlKCksIG1hcF9pdGVyLT5maXJzdCk7CisgICAgICBmX291dF8gPDwgIiA9ICI7CisgICAgICBwcmludF9jb25zdF92YWx1ZSgoKHRfbWFwKil0cnVldHlwZSktPmdldF92YWxfdHlwZSgpLCBtYXBfaXRlci0+c2Vjb25kKTsKKyAgICB9CisgICAgZl9vdXRfIDw8ICIgfSI7CisgIH0gZWxzZSBpZiAodHJ1ZXR5cGUtPmlzX2xpc3QoKSkgeworICAgIGZfb3V0XyA8PCAieyAiOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4gbGlzdF9lbGVtcyA9IHR2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICA7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6aXRlcmF0b3IgbGlzdF9pdGVyOworICAgIGZvciAobGlzdF9pdGVyID0gbGlzdF9lbGVtcy5iZWdpbigpOyBsaXN0X2l0ZXIgIT0gbGlzdF9lbGVtcy5lbmQoKTsgbGlzdF9pdGVyKyspIHsKKyAgICAgIGlmICghZmlyc3QpIHsKKyAgICAgICAgZl9vdXRfIDw8ICIsICI7CisgICAgICB9CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgcHJpbnRfY29uc3RfdmFsdWUoKCh0X2xpc3QqKXRydWV0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCAqbGlzdF9pdGVyKTsKKyAgICB9CisgICAgZl9vdXRfIDw8ICIgfSI7CisgIH0gZWxzZSBpZiAodHJ1ZXR5cGUtPmlzX3NldCgpKSB7CisgICAgZl9vdXRfIDw8ICJ7ICI7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiBsaXN0X2VsZW1zID0gdHZhbHVlLT5nZXRfbGlzdCgpOworICAgIDsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+OjppdGVyYXRvciBsaXN0X2l0ZXI7CisgICAgZm9yIChsaXN0X2l0ZXIgPSBsaXN0X2VsZW1zLmJlZ2luKCk7IGxpc3RfaXRlciAhPSBsaXN0X2VsZW1zLmVuZCgpOyBsaXN0X2l0ZXIrKykgeworICAgICAgaWYgKCFmaXJzdCkgeworICAgICAgICBmX291dF8gPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICBwcmludF9jb25zdF92YWx1ZSgoKHRfc2V0Kil0cnVldHlwZSktPmdldF9lbGVtX3R5cGUoKSwgKmxpc3RfaXRlcik7CisgICAgfQorICAgIGZfb3V0XyA8PCAiIH0iOworICB9IGVsc2UgeworICAgIGZfb3V0XyA8PCAiVU5LTk9XTiBUWVBFIjsKKyAgfQorfQorCisvKioKKyAqIFByaW50cyBvdXQgZG9jdW1lbnRhdGlvbiBmb3IgYXJndW1lbnRzL2V4Y2VwdGlvbnMgb2YgYSBmdW5jdGlvbiwgaWYgYW55IGRvY3VtZW50YXRpb24gaGFzIGJlZW4KKyAqIHN1cHBsaWVkLgorICovCit2b2lkIHRfaHRtbF9nZW5lcmF0b3I6OnByaW50X2ZuX2FyZ3NfZG9jKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBib29sIGhhc19kb2NzID0gZmFsc2U7CisgIHZlY3Rvcjx0X2ZpZWxkKj4gYXJncyA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgYXJnX2l0ZXIgPSBhcmdzLmJlZ2luKCk7CisgIGlmIChhcmdfaXRlciAhPSBhcmdzLmVuZCgpKSB7CisgICAgZm9yICg7IGFyZ19pdGVyICE9IGFyZ3MuZW5kKCk7IGFyZ19pdGVyKyspIHsKKyAgICAgIGlmICgoKmFyZ19pdGVyKS0+aGFzX2RvYygpICYmICEoKmFyZ19pdGVyKS0+Z2V0X2RvYygpLmVtcHR5KCkpCisgICAgICAgIGhhc19kb2NzID0gdHJ1ZTsKKyAgICB9CisgICAgaWYgKGhhc19kb2NzKSB7CisgICAgICBhcmdfaXRlciA9IGFyZ3MuYmVnaW4oKTsKKyAgICAgIGZfb3V0XyA8PCAiPGJyLz48aDQgaWQ9XCJQYXJhbWV0ZXJzXyIgPDwgc2VydmljZV9uYW1lXyA8PCAiXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgPDwgIlwiPlBhcmFtZXRlcnM8L2g0PiIgPDwgZW5kbDsKKyAgICAgIGZfb3V0XyA8PCAiPHRhYmxlIGNsYXNzPVwidGFibGUtYm9yZGVyZWQgdGFibGUtc3RyaXBlZCB0YWJsZS1jb25kZW5zZWRcIj4iOworICAgICAgZl9vdXRfIDw8ICI8dGhlYWQ+PHRoPk5hbWU8L3RoPjx0aD5EZXNjcmlwdGlvbjwvdGg+PC90aGVhZD4iOworICAgICAgZm9yICg7IGFyZ19pdGVyICE9IGFyZ3MuZW5kKCk7IGFyZ19pdGVyKyspIHsKKyAgICAgICAgZl9vdXRfIDw8ICI8dHI+PHRkPiIgPDwgKCphcmdfaXRlciktPmdldF9uYW1lKCk7CisgICAgICAgIGZfb3V0XyA8PCAiPC90ZD48dGQ+IjsKKyAgICAgICAgZl9vdXRfIDw8IGVzY2FwZV9odG1sKCgqYXJnX2l0ZXIpLT5nZXRfZG9jKCkpOworICAgICAgICBmX291dF8gPDwgIjwvdGQ+PC90cj4iIDw8IGVuZGw7CisgICAgICB9CisgICAgICBmX291dF8gPDwgIjwvdGFibGU+IjsKKyAgICB9CisgIH0KKworICBoYXNfZG9jcyA9IGZhbHNlOworICB2ZWN0b3I8dF9maWVsZCo+IGV4Y2VwdHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgZXhfaXRlciA9IGV4Y2VwdHMuYmVnaW4oKTsKKyAgaWYgKGV4X2l0ZXIgIT0gZXhjZXB0cy5lbmQoKSkgeworICAgIGZvciAoOyBleF9pdGVyICE9IGV4Y2VwdHMuZW5kKCk7IGV4X2l0ZXIrKykgeworICAgICAgaWYgKCgqZXhfaXRlciktPmhhc19kb2MoKSAmJiAhKCpleF9pdGVyKS0+Z2V0X2RvYygpLmVtcHR5KCkpCisgICAgICAgIGhhc19kb2NzID0gdHJ1ZTsKKyAgICB9CisgICAgaWYgKGhhc19kb2NzKSB7CisgICAgICBleF9pdGVyID0gZXhjZXB0cy5iZWdpbigpOworICAgICAgZl9vdXRfIDw8ICI8YnIvPjxoNCBpZD1cIkV4Y2VwdGlvbnNfIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICA8PCAiXCI+RXhjZXB0aW9uczwvaDQ+IiA8PCBlbmRsOworICAgICAgZl9vdXRfIDw8ICI8dGFibGUgY2xhc3M9XCJ0YWJsZS1ib3JkZXJlZCB0YWJsZS1zdHJpcGVkIHRhYmxlLWNvbmRlbnNlZFwiPiI7CisgICAgICBmX291dF8gPDwgIjx0aGVhZD48dGg+VHlwZTwvdGg+PHRoPkRlc2NyaXB0aW9uPC90aD48L3RoZWFkPiI7CisgICAgICBmb3IgKDsgZXhfaXRlciAhPSBleGNlcHRzLmVuZCgpOyBleF9pdGVyKyspIHsKKyAgICAgICAgZl9vdXRfIDw8ICI8dHI+PHRkPiIgPDwgKCpleF9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKTsKKyAgICAgICAgZl9vdXRfIDw8ICI8L3RkPjx0ZD4iOworICAgICAgICBmX291dF8gPDwgZXNjYXBlX2h0bWwoKCpleF9pdGVyKS0+Z2V0X2RvYygpKTsKKyAgICAgICAgZl9vdXRfIDw8ICI8L3RkPjwvdHI+IiA8PCBlbmRsOworICAgICAgfQorICAgICAgZl9vdXRfIDw8ICI8L3RhYmxlPiI7CisgICAgfQorICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdHlwZWRlZi4KKyAqCisgKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgorICovCit2b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICBzdHJpbmcgbmFtZSA9IHR0eXBlZGVmLT5nZXRfbmFtZSgpOworICBmX291dF8gPDwgIjxkaXYgY2xhc3M9XCJkZWZpbml0aW9uXCI+IjsKKyAgZl9vdXRfIDw8ICI8aDMgaWQ9XCJUeXBlZGVmXyIgPDwgbmFtZSA8PCAiXCI+VHlwZWRlZjogIiA8PCBuYW1lIDw8ICI8L2gzPiIgPDwgZW5kbDsKKyAgZl9vdXRfIDw8ICI8cD48c3Ryb25nPkJhc2UgdHlwZTo8L3N0cm9uZz4mbmJzcDsiOworICBwcmludF90eXBlKHR0eXBlZGVmLT5nZXRfdHlwZSgpKTsKKyAgZl9vdXRfIDw8ICI8L3A+IiA8PCBlbmRsOworICBwcmludF9kb2ModHR5cGVkZWYpOworICBmX291dF8gPDwgIjwvZGl2PiIgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgY29kZSBmb3IgYW4gZW51bWVyYXRlZCB0eXBlLgorICoKKyAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KKyAqLwordm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgc3RyaW5nIG5hbWUgPSB0ZW51bS0+Z2V0X25hbWUoKTsKKyAgZl9vdXRfIDw8ICI8ZGl2IGNsYXNzPVwiZGVmaW5pdGlvblwiPiI7CisgIGZfb3V0XyA8PCAiPGgzIGlkPVwiRW51bV8iIDw8IG5hbWUgPDwgIlwiPkVudW1lcmF0aW9uOiAiIDw8IG5hbWUgPDwgIjwvaDM+IiA8PCBlbmRsOworICBwcmludF9kb2ModGVudW0pOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gdmFsdWVzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciB2YWxfaXRlcjsKKyAgZl9vdXRfIDw8ICI8YnIvPjx0YWJsZSBjbGFzcz1cInRhYmxlLWJvcmRlcmVkIHRhYmxlLXN0cmlwZWQgdGFibGUtY29uZGVuc2VkXCI+IiA8PCBlbmRsOworICBmb3IgKHZhbF9pdGVyID0gdmFsdWVzLmJlZ2luKCk7IHZhbF9pdGVyICE9IHZhbHVlcy5lbmQoKTsgKyt2YWxfaXRlcikgeworICAgIGZfb3V0XyA8PCAiPHRyPjx0ZD48Y29kZT4iOworICAgIGZfb3V0XyA8PCAoKnZhbF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBmX291dF8gPDwgIjwvY29kZT48L3RkPjx0ZD48Y29kZT4iOworICAgIGZfb3V0XyA8PCAoKnZhbF9pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgZl9vdXRfIDw8ICI8L2NvZGU+PC90ZD48dGQ+IiA8PCBlbmRsOworICAgIHByaW50X2RvYygoKnZhbF9pdGVyKSk7CisgICAgZl9vdXRfIDw8ICI8L3RkPjwvdHI+IiA8PCBlbmRsOworICB9CisgIGZfb3V0XyA8PCAiPC90YWJsZT48L2Rpdj4iIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgY29uc3RhbnQgdmFsdWUKKyAqLwordm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKKyAgc3RyaW5nIG5hbWUgPSB0Y29uc3QtPmdldF9uYW1lKCk7CisgIGZfb3V0XyA8PCAiPHRyIGlkPVwiQ29uc3RfIiA8PCBuYW1lIDw8ICJcIj48dGQ+PGNvZGU+IiA8PCBuYW1lIDw8ICI8L2NvZGU+PC90ZD48dGQ+IjsKKyAgcHJpbnRfdHlwZSh0Y29uc3QtPmdldF90eXBlKCkpOworICBmX291dF8gPDwgIjwvdGQ+PHRkPjxjb2RlPiI7CisgIHByaW50X2NvbnN0X3ZhbHVlKHRjb25zdC0+Z2V0X3R5cGUoKSwgdGNvbnN0LT5nZXRfdmFsdWUoKSk7CisgIGZfb3V0XyA8PCAiPC9jb2RlPjwvdGQ+PC90cj4iOworICBpZiAodGNvbnN0LT5oYXNfZG9jKCkpIHsKKyAgICBmX291dF8gPDwgIjx0cj48dGQgY29sc3Bhbj1cIjNcIj48YmxvY2txdW90ZT4iOworICAgIHByaW50X2RvYyh0Y29uc3QpOworICAgIGZfb3V0XyA8PCAiPC9ibG9ja3F1b3RlPjwvdGQ+PC90cj4iOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBmX291dF8gPDwgIjxkaXYgY2xhc3M9XCJkZWZpbml0aW9uXCI+IjsKKyAgZl9vdXRfIDw8ICI8aDMgaWQ9XCJTdHJ1Y3RfIiA8PCBuYW1lIDw8ICJcIj4iOworICBpZiAodHN0cnVjdC0+aXNfeGNlcHRpb24oKSkgeworICAgIGZfb3V0XyA8PCAiRXhjZXB0aW9uOiAiOworICB9IGVsc2UgaWYgKHRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKKyAgICBmX291dF8gPDwgIlVuaW9uOiAiOworICB9IGVsc2UgeworICAgIGZfb3V0XyA8PCAiU3RydWN0OiAiOworICB9CisgIGZfb3V0XyA8PCBuYW1lIDw8ICI8L2gzPiIgPDwgZW5kbDsKKyAgdmVjdG9yPHRfZmllbGQqPiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgbWVtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7CisgIGZfb3V0XyA8PCAiPHRhYmxlIGNsYXNzPVwidGFibGUtYm9yZGVyZWQgdGFibGUtc3RyaXBlZCB0YWJsZS1jb25kZW5zZWRcIj4iOworICBmX291dF8gPDwgIjx0aGVhZD48dGg+S2V5PC90aD48dGg+RmllbGQ8L3RoPjx0aD5UeXBlPC90aD48dGg+RGVzY3JpcHRpb248L3RoPjx0aD5SZXF1aXJlZG5lc3M8LyIKKyAgICAgICAgICAgICJ0aD48dGg+RGVmYXVsdCB2YWx1ZTwvdGg+PC90aGVhZD4iIDw8IGVuZGw7CisgIGZvciAoOyBtZW1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyBtZW1faXRlcisrKSB7CisgICAgZl9vdXRfIDw8ICI8dHI+PHRkPiIgPDwgKCptZW1faXRlciktPmdldF9rZXkoKSA8PCAiPC90ZD48dGQ+IjsKKyAgICBmX291dF8gPDwgKCptZW1faXRlciktPmdldF9uYW1lKCk7CisgICAgZl9vdXRfIDw8ICI8L3RkPjx0ZD4iOworICAgIHByaW50X3R5cGUoKCptZW1faXRlciktPmdldF90eXBlKCkpOworICAgIGZfb3V0XyA8PCAiPC90ZD48dGQ+IjsKKyAgICBmX291dF8gPDwgZXNjYXBlX2h0bWwoKCptZW1faXRlciktPmdldF9kb2MoKSk7CisgICAgZl9vdXRfIDw8ICI8L3RkPjx0ZD4iOworICAgIGlmICgoKm1lbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKKyAgICAgIGZfb3V0XyA8PCAib3B0aW9uYWwiOworICAgIH0gZWxzZSBpZiAoKCptZW1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBmX291dF8gPDwgInJlcXVpcmVkIjsKKyAgICB9IGVsc2UgeworICAgICAgZl9vdXRfIDw8ICJkZWZhdWx0IjsKKyAgICB9CisgICAgZl9vdXRfIDw8ICI8L3RkPjx0ZD4iOworICAgIHRfY29uc3RfdmFsdWUqIGRlZmF1bHRfdmFsID0gKCptZW1faXRlciktPmdldF92YWx1ZSgpOworICAgIGlmIChkZWZhdWx0X3ZhbCAhPSBOVUxMKSB7CisgICAgICBmX291dF8gPDwgIjxjb2RlPiI7CisgICAgICBwcmludF9jb25zdF92YWx1ZSgoKm1lbV9pdGVyKS0+Z2V0X3R5cGUoKSwgZGVmYXVsdF92YWwpOworICAgICAgZl9vdXRfIDw8ICI8L2NvZGU+IjsKKyAgICB9CisgICAgZl9vdXRfIDw8ICI8L3RkPjwvdHI+IiA8PCBlbmRsOworICB9CisgIGZfb3V0XyA8PCAiPC90YWJsZT48YnIvPiI7CisgIHByaW50X2RvYyh0c3RydWN0KTsKKyAgZl9vdXRfIDw8ICI8L2Rpdj4iOworfQorCisvKioKKyAqIEV4Y2VwdGlvbnMgYXJlIHNwZWNpYWwgc3RydWN0cworICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfc3RydWN0KHR4Y2VwdGlvbik7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSBIVE1MIGJsb2NrIGZvciBhIFRocmlmdCBzZXJ2aWNlLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIGZfb3V0XyA8PCAiPGgzIGlkPVwiU3ZjXyIgPDwgc2VydmljZV9uYW1lXyA8PCAiXCI+U2VydmljZTogIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICI8L2gzPiIgPDwgZW5kbDsKKworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpIHsKKyAgICBmX291dF8gPDwgIjxkaXYgY2xhc3M9XCJleHRlbmRzXCI+PGVtPmV4dGVuZHM8L2VtPiAiOworICAgIHByaW50X3R5cGUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGZfb3V0XyA8PCAiPC9kaXY+XG4iOworICB9CisgIHByaW50X2RvYyh0c2VydmljZSk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZm5faXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOworICBmb3IgKDsgZm5faXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7IGZuX2l0ZXIrKykgeworICAgIHN0cmluZyBmbl9uYW1lID0gKCpmbl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBmX291dF8gPDwgIjxkaXYgY2xhc3M9XCJkZWZpbml0aW9uXCI+IjsKKyAgICBmX291dF8gPDwgIjxoNCBpZD1cIkZuXyIgPDwgc2VydmljZV9uYW1lXyA8PCAiXyIgPDwgZm5fbmFtZSA8PCAiXCI+RnVuY3Rpb246ICIgPDwgc2VydmljZV9uYW1lXworICAgICAgICAgICA8PCAiLiIgPDwgZm5fbmFtZSA8PCAiPC9oND4iIDw8IGVuZGw7CisgICAgZl9vdXRfIDw8ICI8cHJlPiI7CisgICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBvZmZzZXQgPSBwcmludF90eXBlKCgqZm5faXRlciktPmdldF9yZXR1cm50eXBlKCkpOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZfb3V0XyA8PCAiICIgPDwgZm5fbmFtZSA8PCAiKCI7CisgICAgb2Zmc2V0ICs9IGZuX25hbWUuc2l6ZSgpICsgMjsKKyAgICB2ZWN0b3I8dF9maWVsZCo+IGFyZ3MgPSAoKmZuX2l0ZXIpLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIGFyZ19pdGVyID0gYXJncy5iZWdpbigpOworICAgIGZvciAoOyBhcmdfaXRlciAhPSBhcmdzLmVuZCgpOyBhcmdfaXRlcisrKSB7CisgICAgICBpZiAoIWZpcnN0KSB7CisgICAgICAgIGZfb3V0XyA8PCAiLCIgPDwgZW5kbDsKKyAgICAgICAgZm9yIChzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGkgPSAwOyBpIDwgb2Zmc2V0OyArK2kpIHsKKyAgICAgICAgICBmX291dF8gPDwgIiAiOworICAgICAgICB9CisgICAgICB9CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgcHJpbnRfdHlwZSgoKmFyZ19pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICBmX291dF8gPDwgIiAiIDw8ICgqYXJnX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgaWYgKCgqYXJnX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7CisgICAgICAgIGZfb3V0XyA8PCAiID0gIjsKKyAgICAgICAgcHJpbnRfY29uc3RfdmFsdWUoKCphcmdfaXRlciktPmdldF90eXBlKCksICgqYXJnX2l0ZXIpLT5nZXRfdmFsdWUoKSk7CisgICAgICB9CisgICAgfQorICAgIGZfb3V0XyA8PCAiKSIgPDwgZW5kbDsKKyAgICBmaXJzdCA9IHRydWU7CisgICAgdmVjdG9yPHRfZmllbGQqPiBleGNlcHRzID0gKCpmbl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIGV4X2l0ZXIgPSBleGNlcHRzLmJlZ2luKCk7CisgICAgaWYgKGV4X2l0ZXIgIT0gZXhjZXB0cy5lbmQoKSkgeworICAgICAgZl9vdXRfIDw8ICIgICAgdGhyb3dzICI7CisgICAgICBmb3IgKDsgZXhfaXRlciAhPSBleGNlcHRzLmVuZCgpOyBleF9pdGVyKyspIHsKKyAgICAgICAgaWYgKCFmaXJzdCkgeworICAgICAgICAgIGZfb3V0XyA8PCAiLCAiOworICAgICAgICB9CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIHByaW50X3R5cGUoKCpleF9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICB9CisgICAgICBmX291dF8gPDwgZW5kbDsKKyAgICB9CisgICAgZl9vdXRfIDw8ICI8L3ByZT4iOworICAgIHByaW50X2RvYygqZm5faXRlcik7CisgICAgcHJpbnRfZm5fYXJnc19kb2MoKmZuX2l0ZXIpOworICAgIGZfb3V0XyA8PCAiPC9kaXY+IjsKKyAgfQorfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAorICAgIGh0bWwsCisgICAgIkhUTUwiLAorICAgICIgICAgc3RhbmRhbG9uZTogICAgICBTZWxmLWNvbnRhaW5lZCBtb2RlLCBpbmNsdWRlcyBhbGwgQ1NTIGluIHRoZSBIVE1MIGZpbGVzLlxuIgorICAgICIgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZXMgbm8gc3R5bGUuY3NzIGZpbGUsIGJ1dCBIVE1MIGZpbGVzIHdpbGwgYmUgbGFyZ2VyLlxuIgorICAgICIgICAgbm9lc2NhcGU6ICAgICAgICBEbyBub3QgZXNjYXBlIGh0bWwgaW4gZG9jIHRleHQuXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2h0bWxfZ2VuZXJhdG9yLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2h0bWxfZ2VuZXJhdG9yLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9odG1sX2dlbmVyYXRvci5oCnJlbmFtZSB0byBjb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2h0bWxfZ2VuZXJhdG9yLmgKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfamF2YV9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2phdmFfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjODQ1NTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2phdmFfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsNTQ1NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjdGltZT4KKworI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9tYW5pcD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGNjdHlwZT4KKworI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorCisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c2V0ZmlsbDsKK3VzaW5nIHN0ZDo6c2V0dzsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworCisvKioKKyAqIEphdmEgY29kZSBnZW5lcmF0b3IuCisgKgorICovCitjbGFzcyB0X2phdmFfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfamF2YV9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICBiZWFuX3N0eWxlXyA9IGZhbHNlOworICAgIGFuZHJvaWRfc3R5bGVfID0gZmFsc2U7CisgICAgcHJpdmF0ZV9tZW1iZXJzXyA9IGZhbHNlOworICAgIG5vY2FtZWxfc3R5bGVfID0gZmFsc2U7CisgICAgZnVsbGNhbWVsX3N0eWxlXyA9IGZhbHNlOworICAgIGFuZHJvaWRfbGVnYWN5XyA9IGZhbHNlOworICAgIHNvcnRlZF9jb250YWluZXJzXyA9IGZhbHNlOworICAgIGphdmE1XyA9IGZhbHNlOworICAgIHJldXNlX29iamVjdHNfID0gZmFsc2U7CisgICAgdXNlX29wdGlvbl90eXBlXyA9IGZhbHNlOworICAgIHVuZGF0ZWRfZ2VuZXJhdGVkX2Fubm90YXRpb25zXyAgPSBmYWxzZTsKKyAgICBzdXBwcmVzc19nZW5lcmF0ZWRfYW5ub3RhdGlvbnNfID0gZmFsc2U7CisgICAgcmV0aHJvd191bmhhbmRsZWRfZXhjZXB0aW9uc18gPSBmYWxzZTsKKyAgICB1bnNhZmVfYmluYXJpZXNfID0gZmFsc2U7CisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiYmVhbnMiKSA9PSAwKSB7CisgICAgICAgIGJlYW5fc3R5bGVfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiYW5kcm9pZCIpID09IDApIHsKKyAgICAgICAgYW5kcm9pZF9zdHlsZV8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJwcml2YXRlLW1lbWJlcnMiKSA9PSAwKSB7CisgICAgICAgIHByaXZhdGVfbWVtYmVyc18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJub2NhbWVsIikgPT0gMCkgeworICAgICAgICBub2NhbWVsX3N0eWxlXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImZ1bGxjYW1lbCIpID09IDApIHsKKyAgICAgICAgZnVsbGNhbWVsX3N0eWxlXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImFuZHJvaWRfbGVnYWN5IikgPT0gMCkgeworICAgICAgICBhbmRyb2lkX2xlZ2FjeV8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJzb3J0ZWRfY29udGFpbmVycyIpID09IDApIHsKKyAgICAgICAgc29ydGVkX2NvbnRhaW5lcnNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiamF2YTUiKSA9PSAwKSB7CisgICAgICAgIGphdmE1XyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInJldXNlLW9iamVjdHMiKSA9PSAwKSB7CisgICAgICAgIHJldXNlX29iamVjdHNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgib3B0aW9uX3R5cGUiKSA9PSAwKSB7CisgICAgICAgIHVzZV9vcHRpb25fdHlwZV8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJyZXRocm93X3VuaGFuZGxlZF9leGNlcHRpb25zIikgPT0gMCkgeworICAgICAgICByZXRocm93X3VuaGFuZGxlZF9leGNlcHRpb25zXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImdlbmVyYXRlZF9hbm5vdGF0aW9ucyIpID09IDApIHsKKyAgICAgICAgaWYoIGl0ZXItPnNlY29uZC5jb21wYXJlKCJ1bmRhdGVkIikgPT0gMCkgeworICAgICAgICAgIHVuZGF0ZWRfZ2VuZXJhdGVkX2Fubm90YXRpb25zXyAgPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYoaXRlci0+c2Vjb25kLmNvbXBhcmUoInN1cHByZXNzIikgPT0gMCkgeworICAgICAgICAgIHN1cHByZXNzX2dlbmVyYXRlZF9hbm5vdGF0aW9uc18gPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBqYXZhOiIgKyBpdGVyLT5maXJzdCArICI9IiArIGl0ZXItPnNlY29uZDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJ1bnNhZmVfYmluYXJpZXMiKSA9PSAwKSB7CisgICAgICAgIHVuc2FmZV9iaW5hcmllc18gPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIGphdmE6IiArIGl0ZXItPmZpcnN0OworICAgICAgfQorICAgIH0KKworICAgIGlmIChqYXZhNV8pIHsKKyAgICAgIGFuZHJvaWRfbGVnYWN5XyA9IHRydWU7CisgICAgfQorCisgICAgb3V0X2Rpcl9iYXNlXyA9IChiZWFuX3N0eWxlXyA/ICJnZW4tamF2YWJlYW4iIDogImdlbi1qYXZhIik7CisgIH0KKworICAvKioKKyAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcworICAgKi8KKworICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7CisgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7CisKKyAgLyoqCisgICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV91bmlvbih0X3N0cnVjdCogdHVuaW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIHZvaWQgcHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9zdGF0aWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWZ2YWwgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZShzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisKKyAgLyoqCisgICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworCisgIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jbGFzcyA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQgPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfcGFyY2VsYWJsZShzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2VxdWFsaXR5KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfY29tcGFyZV90byhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3JlYWRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfdmFsaWRhdG9yKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3Rvc3RyaW5nKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfY2xlYXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF93cml0ZV9vYmplY3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZWFkX29iamVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfbWV0YV9kYXRhX21hcChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlKTsKKyAgc3RkOjpzdHJpbmcgZ2V0X2phdmFfdHlwZV9zdHJpbmcodF90eXBlKiB0eXBlKTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9maWVsZF9ieV9pZChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9yZWZsZWN0aW9uX3NldHRlcnMoc3RkOjpvc3RyaW5nc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUpOworICB2b2lkIGdlbmVyYXRlX3JlZmxlY3Rpb25fZ2V0dGVycyhzdGQ6Om9zdHJpbmdzdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSk7CisgIHZvaWQgZ2VuZXJhdGVfZ2VuZXJpY19maWVsZF9nZXR0ZXJzX3NldHRlcnMoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9nZW5lcmljX2lzc2V0X21ldGhvZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfYmVhbl9ib2lsZXJwbGF0ZShzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICBzdGQ6OnN0cmluZyBhc19jYW1lbF9jYXNlKHN0ZDo6c3RyaW5nIG5hbWUsIGJvb2wgdWNmaXJzdCA9IHRydWUpOworICBzdGQ6OnN0cmluZyBnZXRfcnBjX21ldGhvZF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpOworICBzdGQ6OnN0cmluZyBnZXRfY2FwX25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7CisgIHN0ZDo6c3RyaW5nIGdlbmVyYXRlX2lzc2V0X2NoZWNrKHRfZmllbGQqIGZpZWxkKTsKKyAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVfaXNzZXRfY2hlY2soc3RkOjpzdHJpbmcgZmllbGQpOworICB2b2lkIGdlbmVyYXRlX2lzc2V0X3NldChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXgpOworICBzdGQ6OnN0cmluZyBpc3NldF9maWVsZF9pZCh0X2ZpZWxkKiBmaWVsZCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2FzeW5jX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9hc3luY19jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9hc3luY19zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfYXN5bmNfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKworICB2b2lkIGdlbmVyYXRlX2phdmFfdW5pb24odF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3VuaW9uX2NvbnN0cnVjdG9yKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3VuaW9uX2dldHRlcnNfYW5kX3NldHRlcnMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfdW5pb25faXNfc2V0X21ldGhvZHMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfdW5pb25fYWJzdHJhY3RfbWV0aG9kcyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9jaGVja190eXBlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3N0YW5kYXJkX3NjaGVtZV9yZWFkX3ZhbHVlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3N0YW5kYXJkX3NjaGVtZV93cml0ZV92YWx1ZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV90dXBsZV9zY2hlbWVfcmVhZF92YWx1ZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV90dXBsZV9zY2hlbWVfd3JpdGVfdmFsdWUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZ2V0X2ZpZWxkX2Rlc2Mob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZ2V0X3N0cnVjdF9kZXNjKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2dldF9maWVsZF9uYW1lKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIHZvaWQgZ2VuZXJhdGVfdW5pb25fY29tcGFyaXNvbnMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfdW5pb25faGFzaGNvZGUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zY2hlbWVfbWFwKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3N0YW5kYXJkX3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3Jlc3VsdCk7CisgIHZvaWQgZ2VuZXJhdGVfc3RhbmRhcmRfcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3N0YW5kYXJkX3NjaGVtZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3Jlc3VsdCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF90dXBsZV9zY2hlbWUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfdHVwbGVfcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3R1cGxlX3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICB2b2lkIGdlbmVyYXRlX2phdmFfc2NoZW1lX2xvb2t1cChvc3RyZWFtJiBvdXQpOworCisgIHZvaWQgZ2VuZXJhdGVfamF2YXhfZ2VuZXJhdGVkX2Fubm90YXRpb24ob3N0cmVhbSYgb3V0KTsKKyAgLyoqCisgICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSA9IHRydWUpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEgPSB0cnVlKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG9iaiA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhID0gdHJ1ZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBvYmogPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSA9IHRydWUpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgb2JqID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhID0gdHJ1ZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhID0gdHJ1ZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhID0gdHJ1ZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhID0gdHJ1ZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSA9IHRydWUpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEgPSB0cnVlKTsKKworICB2b2lkIGdlbmVyYXRlX2RlZXBfY29weV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZV9wMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lX3AyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUpOworICB2b2lkIGdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRlc3RfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUpOworCisgIGVudW0gaXNzZXRfdHlwZSB7IElTU0VUX05PTkUsIElTU0VUX1BSSU1JVElWRSwgSVNTRVRfQklUU0VUIH07CisgIGlzc2V0X3R5cGUgbmVlZHNfaXNzZXQodF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nKiBvdXRQcmltaXRpdmVUeXBlID0gTlVMTCk7CisKKyAgLyoqCisgICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCisgICAqLworCisgIHN0ZDo6c3RyaW5nIGphdmFfcGFja2FnZSgpOworICBzdGQ6OnN0cmluZyBqYXZhX3N1cHByZXNzaW9ucygpOworICBzdGQ6OnN0cmluZyBqYXZhX251bGxhYmxlX2Fubm90YXRpb24oKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NvbnRhaW5lciA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9pbml0ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNraXBfZ2VuZXJpYyA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZV9uYW1lc3BhY2UgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0YmFzZSwgYm9vbCBpbl9jb250YWluZXIgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQgPSBmYWxzZSwgYm9vbCBjb21tZW50ID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luYyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHVzZV9iYXNlX21ldGhvZCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGluY2x1ZGVfdHlwZXMgPSB0cnVlKTsKKyAgc3RkOjpzdHJpbmcgYXN5bmNfZnVuY3Rpb25fY2FsbF9hcmdsaXN0KHRfZnVuY3Rpb24qIHRmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VfYmFzZV9tZXRob2QgPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsdWRlX3R5cGVzID0gdHJ1ZSk7CisgIHN0ZDo6c3RyaW5nIGFzeW5jX2FyZ3VtZW50X2xpc3QodF9mdW5jdGlvbiogdGZ1bmN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsdWRlX3R5cGVzID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0X2Rlc2Mob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZmllbGRfZGVzY3Mob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZmllbGRfbmFtZV9jb25zdGFudHMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgc3RkOjpzdHJpbmcgbWFrZV92YWxpZF9qYXZhX2ZpbGVuYW1lKHN0ZDo6c3RyaW5nIGNvbnN0JiBmcm9tTmFtZSk7CisgIHN0ZDo6c3RyaW5nIG1ha2VfdmFsaWRfamF2YV9pZGVudGlmaWVyKHN0ZDo6c3RyaW5nIGNvbnN0JiBmcm9tTmFtZSk7CisKKyAgYm9vbCB0eXBlX2Nhbl9iZV9udWxsKHRfdHlwZSogdHR5cGUpIHsKKyAgICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworCisgICAgcmV0dXJuIHR0eXBlLT5pc19jb250YWluZXIoKSB8fCB0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkgfHwgdHR5cGUtPmlzX3N0cmluZygpCisgICAgICAgICAgIHx8IHR0eXBlLT5pc19lbnVtKCk7CisgIH0KKworICBib29sIGlzX2RlcHJlY2F0ZWQoY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgYW5ub3RhdGlvbnMpIHsKKyAgICByZXR1cm4gYW5ub3RhdGlvbnMuZmluZCgiZGVwcmVjYXRlZCIpICE9IGFubm90YXRpb25zLmVuZCgpOworICB9CisKKyAgYm9vbCBpc19lbnVtX3NldCh0X3R5cGUqIHR0eXBlKSB7CisgICAgaWYgKCFzb3J0ZWRfY29udGFpbmVyc18pIHsKKyAgICAgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisgICAgICBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgICAgIHRfc2V0KiB0c2V0ID0gKHRfc2V0Kil0dHlwZTsKKyAgICAgICAgdF90eXBlKiBlbGVtX3R5cGUgPSBnZXRfdHJ1ZV90eXBlKHRzZXQtPmdldF9lbGVtX3R5cGUoKSk7CisgICAgICAgIHJldHVybiBlbGVtX3R5cGUtPmlzX2VudW0oKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgYm9vbCBpc19lbnVtX21hcCh0X3R5cGUqIHR0eXBlKSB7CisgICAgaWYgKCFzb3J0ZWRfY29udGFpbmVyc18pIHsKKyAgICAgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisgICAgICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgICAgIHRfbWFwKiB0bWFwID0gKHRfbWFwKil0dHlwZTsKKyAgICAgICAgdF90eXBlKiBrZXlfdHlwZSA9IGdldF90cnVlX3R5cGUodG1hcC0+Z2V0X2tleV90eXBlKCkpOworICAgICAgICByZXR1cm4ga2V5X3R5cGUtPmlzX2VudW0oKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgc3RkOjpzdHJpbmcgaW5uZXJfZW51bV90eXBlX25hbWUodF90eXBlKiB0dHlwZSkgeworICAgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisgICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgICAgdF9tYXAqIHRtYXAgPSAodF9tYXAqKXR0eXBlOworICAgICAgdF90eXBlKiBrZXlfdHlwZSA9IGdldF90cnVlX3R5cGUodG1hcC0+Z2V0X2tleV90eXBlKCkpOworICAgICAgcmV0dXJuIHR5cGVfbmFtZShrZXlfdHlwZSwgdHJ1ZSkgKyAiLmNsYXNzIjsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgICAgdF9zZXQqIHRzZXQgPSAodF9zZXQqKXR0eXBlOworICAgICAgdF90eXBlKiBlbGVtX3R5cGUgPSBnZXRfdHJ1ZV90eXBlKHRzZXQtPmdldF9lbGVtX3R5cGUoKSk7CisgICAgICByZXR1cm4gdHlwZV9uYW1lKGVsZW1fdHlwZSwgdHJ1ZSkgKyAiLmNsYXNzIjsKKyAgICB9CisgICAgcmV0dXJuICIiOworICB9CisKKyAgc3RkOjpzdHJpbmcgY29uc3RhbnRfbmFtZShzdGQ6OnN0cmluZyBuYW1lKTsKKworcHJpdmF0ZToKKyAgLyoqCisgICAqIEZpbGUgc3RyZWFtcworICAgKi8KKworICBzdGQ6OnN0cmluZyBwYWNrYWdlX25hbWVfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZV87CisgIHN0ZDo6c3RyaW5nIHBhY2thZ2VfZGlyXzsKKworICBib29sIGJlYW5fc3R5bGVfOworICBib29sIGFuZHJvaWRfc3R5bGVfOworICBib29sIHByaXZhdGVfbWVtYmVyc187CisgIGJvb2wgbm9jYW1lbF9zdHlsZV87CisgIGJvb2wgZnVsbGNhbWVsX3N0eWxlXzsKKyAgYm9vbCBhbmRyb2lkX2xlZ2FjeV87CisgIGJvb2wgamF2YTVfOworICBib29sIHNvcnRlZF9jb250YWluZXJzXzsKKyAgYm9vbCByZXVzZV9vYmplY3RzXzsKKyAgYm9vbCB1c2Vfb3B0aW9uX3R5cGVfOworICBib29sIHVuZGF0ZWRfZ2VuZXJhdGVkX2Fubm90YXRpb25zXzsKKyAgYm9vbCBzdXBwcmVzc19nZW5lcmF0ZWRfYW5ub3RhdGlvbnNfOworICBib29sIHJldGhyb3dfdW5oYW5kbGVkX2V4Y2VwdGlvbnNfOworICBib29sIHVuc2FmZV9iaW5hcmllc187CisKK307CisKKy8qKgorICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKKyAqIHN0cmVhbXMuCisgKgorICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQorICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworICBwYWNrYWdlX25hbWVfID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoImphdmEiKTsKKworICBzdHJpbmcgZGlyID0gcGFja2FnZV9uYW1lXzsKKyAgc3RyaW5nIHN1YmRpciA9IGdldF9vdXRfZGlyKCk7CisgIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKKyAgd2hpbGUgKChsb2MgPSBkaXIuZmluZCgiLiIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICBzdWJkaXIgPSBzdWJkaXIgKyAiLyIgKyBkaXIuc3Vic3RyKDAsIGxvYyk7CisgICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOworICAgIGRpciA9IGRpci5zdWJzdHIobG9jICsgMSk7CisgIH0KKyAgaWYgKGRpci5zaXplKCkgPiAwKSB7CisgICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyOworICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKKyAgfQorCisgIHBhY2thZ2VfZGlyXyA9IHN1YmRpcjsKK30KKworLyoqCisgKiBQYWNrYWdlcyB0aGUgZ2VuZXJhdGVkIGZpbGUKKyAqCisgKiBAcmV0dXJuIFN0cmluZyBvZiB0aGUgcGFja2FnZSwgaS5lLiAicGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdGRlbW87IgorICovCitzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6amF2YV9wYWNrYWdlKCkgeworICBpZiAoIXBhY2thZ2VfbmFtZV8uZW1wdHkoKSkgeworICAgIHJldHVybiBzdHJpbmcoInBhY2thZ2UgIikgKyBwYWNrYWdlX25hbWVfICsgIjtcblxuIjsKKyAgfQorICByZXR1cm4gIiI7Cit9CisKK3N0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjpqYXZhX3N1cHByZXNzaW9ucygpIHsKKyAgcmV0dXJuICJAU3VwcHJlc3NXYXJuaW5ncyh7XCJjYXN0XCIsIFwicmF3dHlwZXNcIiwgXCJzZXJpYWxcIiwgXCJ1bmNoZWNrZWRcIiwgXCJ1bnVzZWRcIn0pXG4iOworfQorCitzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6amF2YV9udWxsYWJsZV9hbm5vdGF0aW9uKCkgeworICByZXR1cm4gIkBvcmcuYXBhY2hlLnRocmlmdC5hbm5vdGF0aW9uLk51bGxhYmxlIjsKK30KKworLyoqCisgKiBOb3RoaW5nIGluIEphdmEKKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBub3QgZG9uZSBpbiBKYXZhLCBzaW5jZSBpdCBkb2VzCisgKiBub3Qgc3VwcG9ydCBhcmJpdHJhcnkgbmFtZSByZXBsYWNlbWVudHMsIGFuZCBpdCdkIGJlIGEgd2Fja3kgd2FzdGUKKyAqIG9mIG92ZXJoZWFkIHRvIG1ha2Ugd3JhcHBlciBjbGFzc2VzLgorICoKKyAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgICh2b2lkKXR0eXBlZGVmOworfQorCisvKioKKyAqIEVudW1zIGFyZSBhIGNsYXNzIHdpdGggYSBzZXQgb2Ygc3RhdGljIGNvbnN0YW50cy4KKyAqCisgKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIGJvb2wgaXNfZGVwcmVjYXRlZCA9IHRoaXMtPmlzX2RlcHJlY2F0ZWQodGVudW0tPmFubm90YXRpb25zXyk7CisgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgc3RyaW5nIGZfZW51bV9uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgbWFrZV92YWxpZF9qYXZhX2ZpbGVuYW1lKHRlbnVtLT5nZXRfbmFtZSgpKSArICIuamF2YSI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9lbnVtOworICBmX2VudW0ub3BlbihmX2VudW1fbmFtZS5jX3N0cigpKTsKKworICAvLyBDb21tZW50IGFuZCBwYWNrYWdlIGl0CisgIGZfZW51bSA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBqYXZhX3BhY2thZ2UoKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2phdmFfZG9jKGZfZW51bSwgdGVudW0pOworCisgIGlmICghc3VwcHJlc3NfZ2VuZXJhdGVkX2Fubm90YXRpb25zXykgeworICAgIGdlbmVyYXRlX2phdmF4X2dlbmVyYXRlZF9hbm5vdGF0aW9uKGZfZW51bSk7CisgIH0KKworICBpZiAoaXNfZGVwcmVjYXRlZCkgeworICAgIGluZGVudChmX2VudW0pIDw8ICJARGVwcmVjYXRlZCIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIGVudW0gIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiIGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEVudW0gIjsKKyAgc2NvcGVfdXAoZl9lbnVtKTsKKworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfZW51bSA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBnZW5lcmF0ZV9qYXZhX2RvYyhmX2VudW0sICpjX2l0ZXIpOworICAgIGlmICh0aGlzLT5pc19kZXByZWNhdGVkKCgqY19pdGVyKS0+YW5ub3RhdGlvbnNfKSkgeworICAgICAgaW5kZW50KGZfZW51bSkgPDwgIkBEZXByZWNhdGVkIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQoZl9lbnVtKSA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIigiIDw8IHZhbHVlIDw8ICIpIjsKKyAgfQorICBmX2VudW0gPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBGaWVsZCBmb3IgdGhyaWZ0Q29kZQorICBpbmRlbnQoZl9lbnVtKSA8PCAicHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfZW51bSkgPDwgInByaXZhdGUgIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiKGludCB2YWx1ZSkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgIiAgdGhpcy52YWx1ZSA9IHZhbHVlOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQoZl9lbnVtKSA8PCAiLyoqIiA8PCBlbmRsOworICBpbmRlbnQoZl9lbnVtKSA8PCAiICogR2V0IHRoZSBpbnRlZ2VyIHZhbHVlIG9mIHRoaXMgZW51bSB2YWx1ZSwgYXMgZGVmaW5lZCBpbiB0aGUgVGhyaWZ0IElETC4iCisgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudChmX2VudW0pIDw8ICIgKi8iIDw8IGVuZGw7CisgIGluZGVudChmX2VudW0pIDw8ICJwdWJsaWMgaW50IGdldFZhbHVlKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgIiAgcmV0dXJuIHZhbHVlOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQoZl9lbnVtKSA8PCAiLyoqIiA8PCBlbmRsOworICBpbmRlbnQoZl9lbnVtKSA8PCAiICogRmluZCBhIHRoZSBlbnVtIHR5cGUgYnkgaXRzIGludGVnZXIgdmFsdWUsIGFzIGRlZmluZWQgaW4gdGhlIFRocmlmdCBJREwuIgorICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnQoZl9lbnVtKSA8PCAiICogQHJldHVybiBudWxsIGlmIHRoZSB2YWx1ZSBpcyBub3QgZm91bmQuIiA8PCBlbmRsOworICBpbmRlbnQoZl9lbnVtKSA8PCAiICovIiA8PCBlbmRsOworICBpbmRlbnQoZl9lbnVtKSA8PCBqYXZhX251bGxhYmxlX2Fubm90YXRpb24oKSA8PCBlbmRsOworICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIHN0YXRpYyAiICsgdGVudW0tPmdldF9uYW1lKCkgKyAiIGZpbmRCeVZhbHVlKGludCB2YWx1ZSkgeyAiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KGZfZW51bSkgPDwgInN3aXRjaCAodmFsdWUpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICBpbmRlbnQoZl9lbnVtKSA8PCAiY2FzZSAiIDw8IHZhbHVlIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudChmX2VudW0pIDw8ICIgIHJldHVybiAiIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChmX2VudW0pIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgIiAgcmV0dXJuIG51bGw7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KGZfZW51bSkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnQoZl9lbnVtKSA8PCAifSIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKGZfZW51bSk7CisKKyAgZl9lbnVtLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgY2xhc3MgdGhhdCBob2xkcyBhbGwgdGhlIGNvbnN0YW50cy4KKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgeworICBpZiAoY29uc3RzLmVtcHR5KCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IHBhY2thZ2VfZGlyXyArICcvJyArIG1ha2VfdmFsaWRfamF2YV9maWxlbmFtZShwcm9ncmFtX25hbWVfKQorICAgICAgICAgICAgICAgICAgICAgICAgICsgIkNvbnN0YW50cy5qYXZhIjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2NvbnN0czsKKyAgZl9jb25zdHMub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOworCisgIC8vIFByaW50IGhlYWRlcgorICBmX2NvbnN0cyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBqYXZhX3BhY2thZ2UoKSA8PCBqYXZhX3N1cHByZXNzaW9ucygpOworCisgIGZfY29uc3RzIDw8ICJwdWJsaWMgY2xhc3MgIiA8PCBtYWtlX3ZhbGlkX2phdmFfaWRlbnRpZmllcihwcm9ncmFtX25hbWVfKSA8PCAiQ29uc3RhbnRzIHsiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9qYXZhX2RvYyhmX2NvbnN0cywgKCpjX2l0ZXIpKTsKKyAgICBwcmludF9jb25zdF92YWx1ZShmX2NvbnN0cywKKyAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX2NvbnN0cykgPDwgIn0iIDw8IGVuZGw7CisgIGZfY29uc3RzLmNsb3NlKCk7Cit9CisKKworLyoqCisgKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKKyAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCisgKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYworICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OnByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9zdGF0aWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVmdmFsKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGluZGVudChvdXQpOworICBpZiAoIWRlZnZhbCkgeworICAgIG91dCA8PCAoaW5fc3RhdGljID8gIiIgOiAicHVibGljIHN0YXRpYyBmaW5hbCAiKSA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiOworICB9CisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHN0cmluZyB2MiA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIHR5cGUsIHZhbHVlKTsKKyAgICBvdXQgPDwgbmFtZSA8PCAiID0gIiA8PCB2MiA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIG91dCA8PCBuYW1lIDw8ICIgPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIHR5cGUsIHZhbHVlKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB1bnNvcnRlZF9maWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+IGZpZWxkcyA9IHVuc29ydGVkX2ZpZWxkczsKKyAgICBzdGQ6OnNvcnQoZmllbGRzLmJlZ2luKCksIGZpZWxkcy5lbmQoKSwgdF9maWVsZDo6a2V5X2NvbXBhcmUoKSk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgb3V0IDw8IG5hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgICBpZiAoIWluX3N0YXRpYykgeworICAgICAgaW5kZW50KG91dCkgPDwgInN0YXRpYyB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLiI7CisgICAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGdldF9jYXBfbmFtZSh2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpOworICAgICAgb3V0IDw8ICJzZXQiIDw8IGNhcF9uYW1lIDw8ICIoIiA8PCB2YWwgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKyAgICBpZiAoIWluX3N0YXRpYykgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHN0ZDo6c3RyaW5nIGNvbnN0cnVjdG9yX2FyZ3M7CisgICAgaWYgKGlzX2VudW1fbWFwKHR5cGUpKSB7CisgICAgICBjb25zdHJ1Y3Rvcl9hcmdzID0gaW5uZXJfZW51bV90eXBlX25hbWUodHlwZSk7CisgICAgfQorICAgIG91dCA8PCBuYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoIiA8PCBjb25zdHJ1Y3Rvcl9hcmdzIDw8ICIpOyIgPDwgZW5kbDsKKyAgICBpZiAoIWluX3N0YXRpYykgeworICAgICAgaW5kZW50KG91dCkgPDwgInN0YXRpYyB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwga3R5cGUsIHZfaXRlci0+Zmlyc3QpOworICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIucHV0KCIgPDwga2V5IDw8ICIsICIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7CisgICAgaWYgKGlzX2VudW1fc2V0KHR5cGUpKSB7CisgICAgICBvdXQgPDwgbmFtZSA8PCAiID0gIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUsIHRydWUpIDw8ICIubm9uZU9mKCIgPDwgaW5uZXJfZW51bV90eXBlX25hbWUodHlwZSkgPDwgIik7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgbmFtZSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOworICAgIH0KKyAgICBpZiAoIWluX3N0YXRpYykgeworICAgICAgaW5kZW50KG91dCkgPDwgInN0YXRpYyB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorICAgIHRfdHlwZSogZXR5cGU7CisgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0KKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBldHlwZSwgKnZfaXRlcik7CisgICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuYWRkKCIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiB0eXBlICIgKyB0eXBlLT5nZXRfbmFtZSgpOworICB9Cit9CisKK3N0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVuZGVyOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZW5kZXIgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmVuZGVyIDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJlbmRlciA8PCAiKGJ5dGUpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmVuZGVyIDw8ICIoc2hvcnQpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIkwiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgImQiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVuZGVyIDw8IGVtaXRfZG91YmxlX2FzX3N0cmluZyh2YWx1ZS0+Z2V0X2RvdWJsZSgpKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgc3RkOjpzdHJpbmcgbmFtZXNwYWNlX3ByZWZpeCA9IHR5cGUtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lc3BhY2UoImphdmEiKTsKKyAgICBpZiAobmFtZXNwYWNlX3ByZWZpeC5sZW5ndGgoKSA+IDApIHsKKyAgICAgIG5hbWVzcGFjZV9wcmVmaXggKz0gIi4iOworICAgIH0KKyAgICByZW5kZXIgPDwgbmFtZXNwYWNlX3ByZWZpeCA8PCB2YWx1ZS0+Z2V0X2lkZW50aWZpZXJfd2l0aF9wYXJlbnQoKTsKKyAgfSBlbHNlIHsKKyAgICBzdHJpbmcgdCA9IHRtcCgidG1wIik7CisgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCB0LCB0eXBlLCB2YWx1ZSwgdHJ1ZSk7CisgICAgcmVuZGVyIDw8IHQ7CisgIH0KKworICByZXR1cm4gcmVuZGVyLnN0cigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuIFRoaXMgd2lsbCBiZSBhIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlCisgKiBpbXBsZW1lbnRvci4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaWYgKHRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9qYXZhX3VuaW9uKHRzdHJ1Y3QpOworICB9IGVsc2UgeworICAgIGdlbmVyYXRlX2phdmFfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKKyAgfQorfQorCisvKioKKyAqIEV4Y2VwdGlvbnMgYXJlIHN0cnVjdHMsIGJ1dCB0aGV5IGluaGVyaXQgZnJvbSBFeGNlcHRpb24KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX2phdmFfc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7Cit9CisKKy8qKgorICogSmF2YSBzdHJ1Y3QgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKKyAgLy8gTWFrZSBvdXRwdXQgZmlsZQorICBzdHJpbmcgZl9zdHJ1Y3RfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIG1ha2VfdmFsaWRfamF2YV9maWxlbmFtZSh0c3RydWN0LT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICsgIi5qYXZhIjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3N0cnVjdDsKKyAgZl9zdHJ1Y3Qub3BlbihmX3N0cnVjdF9uYW1lLmNfc3RyKCkpOworCisgIGZfc3RydWN0IDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGphdmFfcGFja2FnZSgpIDw8IGphdmFfc3VwcHJlc3Npb25zKCk7CisKKyAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3N0cnVjdCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKKyAgZl9zdHJ1Y3QuY2xvc2UoKTsKK30KKworLyoqCisgKiBKYXZhIHVuaW9uIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV91bmlvbih0X3N0cnVjdCogdHN0cnVjdCkgeworICAvLyBNYWtlIG91dHB1dCBmaWxlCisgIHN0cmluZyBmX3N0cnVjdF9uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgbWFrZV92YWxpZF9qYXZhX2ZpbGVuYW1lKHRzdHJ1Y3QtPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLmphdmEiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc3RydWN0OworICBmX3N0cnVjdC5vcGVuKGZfc3RydWN0X25hbWUuY19zdHIoKSk7CisKKyAgZl9zdHJ1Y3QgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgamF2YV9wYWNrYWdlKCkgPDwgamF2YV9zdXBwcmVzc2lvbnMoKTsKKworICBnZW5lcmF0ZV9qYXZhX2RvYyhmX3N0cnVjdCwgdHN0cnVjdCk7CisKKyAgYm9vbCBpc19maW5hbCA9ICh0c3RydWN0LT5hbm5vdGF0aW9uc18uZmluZCgiZmluYWwiKSAhPSB0c3RydWN0LT5hbm5vdGF0aW9uc18uZW5kKCkpOworICBib29sIGlzX2RlcHJlY2F0ZWQgPSB0aGlzLT5pc19kZXByZWNhdGVkKHRzdHJ1Y3QtPmFubm90YXRpb25zXyk7CisKKyAgaWYgKCFzdXBwcmVzc19nZW5lcmF0ZWRfYW5ub3RhdGlvbnNfKSB7CisgICAgZ2VuZXJhdGVfamF2YXhfZ2VuZXJhdGVkX2Fubm90YXRpb24oZl9zdHJ1Y3QpOworICB9CisKKyAgaWYgKGlzX2RlcHJlY2F0ZWQpIHsKKyAgICBpbmRlbnQoZl9zdHJ1Y3QpIDw8ICJARGVwcmVjYXRlZCIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnQoZl9zdHJ1Y3QpIDw8ICJwdWJsaWMgIiA8PCAoaXNfZmluYWwgPyAiZmluYWwgIiA6ICIiKSA8PCAiY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgPDwgIiBleHRlbmRzIG9yZy5hcGFjaGUudGhyaWZ0LlRVbmlvbjwiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIi5fRmllbGRzPiAiOworCisgIHNjb3BlX3VwKGZfc3RydWN0KTsKKworICBnZW5lcmF0ZV9zdHJ1Y3RfZGVzYyhmX3N0cnVjdCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2ZpZWxkX2Rlc2NzKGZfc3RydWN0LCB0c3RydWN0KTsKKworICBmX3N0cnVjdCA8PCBlbmRsOworCisgIGdlbmVyYXRlX2ZpZWxkX25hbWVfY29uc3RhbnRzKGZfc3RydWN0LCB0c3RydWN0KTsKKworICBmX3N0cnVjdCA8PCBlbmRsOworCisgIGdlbmVyYXRlX2phdmFfbWV0YV9kYXRhX21hcChmX3N0cnVjdCwgdHN0cnVjdCk7CisKKyAgZ2VuZXJhdGVfdW5pb25fY29uc3RydWN0b3IoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOworCisgIGZfc3RydWN0IDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfdW5pb25fYWJzdHJhY3RfbWV0aG9kcyhmX3N0cnVjdCwgdHN0cnVjdCk7CisKKyAgZl9zdHJ1Y3QgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9maWVsZF9ieV9pZChmX3N0cnVjdCwgdHN0cnVjdCk7CisKKyAgZl9zdHJ1Y3QgPDwgZW5kbDsKKworICBnZW5lcmF0ZV91bmlvbl9nZXR0ZXJzX2FuZF9zZXR0ZXJzKGZfc3RydWN0LCB0c3RydWN0KTsKKworICBmX3N0cnVjdCA8PCBlbmRsOworCisgIGdlbmVyYXRlX3VuaW9uX2lzX3NldF9tZXRob2RzKGZfc3RydWN0LCB0c3RydWN0KTsKKworICBmX3N0cnVjdCA8PCBlbmRsOworCisgIGdlbmVyYXRlX3VuaW9uX2NvbXBhcmlzb25zKGZfc3RydWN0LCB0c3RydWN0KTsKKworICBmX3N0cnVjdCA8PCBlbmRsOworCisgIGdlbmVyYXRlX3VuaW9uX2hhc2hjb2RlKGZfc3RydWN0LCB0c3RydWN0KTsKKworICBmX3N0cnVjdCA8PCBlbmRsOworCisgIGdlbmVyYXRlX2phdmFfc3RydWN0X3dyaXRlX29iamVjdChmX3N0cnVjdCwgdHN0cnVjdCk7CisKKyAgZl9zdHJ1Y3QgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZWFkX29iamVjdChmX3N0cnVjdCwgdHN0cnVjdCk7CisKKyAgZl9zdHJ1Y3QgPDwgZW5kbDsKKworICBzY29wZV9kb3duKGZfc3RydWN0KTsKKworICBmX3N0cnVjdC5jbG9zZSgpOworfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3VuaW9uX2NvbnN0cnVjdG9yKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgYm9vbCBkZWZhdWx0X3ZhbHVlID0gZmFsc2U7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgICAgaW5kZW50KG91dCkgPDwgInN1cGVyKF9GaWVsZHMuIiA8PCBjb25zdGFudF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgdHlwZSwgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSkgPDwgIik7IiA8PCBlbmRsOworICAgICAgZGVmYXVsdF92YWx1ZSA9IHRydWU7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgaWYgKGRlZmF1bHRfdmFsdWUgPT0gZmFsc2UpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAic3VwZXIoKTsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoX0ZpZWxkcyBzZXRGaWVsZCwgamF2YS5sYW5nLk9iamVjdCB2YWx1ZSkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgc3VwZXIoc2V0RmllbGQsIHZhbHVlKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgb3RoZXIpIHsiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHN1cGVyKG90aGVyKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgZGVlcENvcHkoKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gbmV3ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKHRoaXMpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBnZW5lcmF0ZSAiY29uc3RydWN0b3JzIiBmb3IgZWFjaCBmaWVsZAorICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF90eXBlKiB0eXBlID0gKCptX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RhdGljICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIigiCisgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgdmFsdWUpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiB4ID0gbmV3ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgeC5zZXQiIDw8IGdldF9jYXBfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8ICIodmFsdWUpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4geDsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBzdGF0aWMgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgPDwgIihieXRlW10gdmFsdWUpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiIHggPSBuZXcgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICB4LnNldCIgPDwgZ2V0X2NhcF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgICBpZih1bnNhZmVfYmluYXJpZXNfKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICIoamF2YS5uaW8uQnl0ZUJ1ZmZlci53cmFwKHZhbHVlKSk7IiA8PCBlbmRsOworICAgICAgfWVsc2V7CisgICAgICAgIGluZGVudChvdXQpIDw8ICIoamF2YS5uaW8uQnl0ZUJ1ZmZlci53cmFwKHZhbHVlLmNsb25lKCkpKTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4geDsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgIH0KKyAgfQorfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3VuaW9uX2dldHRlcnNfYW5kX3NldHRlcnMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICB9CisKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKKyAgICB0X3R5cGUqIHR5cGUgPSBmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSk7CisgICAgYm9vbCBpc19kZXByZWNhdGVkID0gdGhpcy0+aXNfZGVwcmVjYXRlZChmaWVsZC0+YW5ub3RhdGlvbnNfKTsKKworICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgZmllbGQpOworICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgaWYgKGlzX2RlcHJlY2F0ZWQpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIkBEZXByZWNhdGVkIiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBieXRlW10gZ2V0IiA8PCBjYXBfbmFtZSA8PCAiKCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIHNldCIgPDwgY2FwX25hbWUgPDwgIihvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5yaWdodFNpemUoYnVmZmVyIgorICAgICAgICAgICAgICAgICAgPDwgZ2V0X2NhcF9uYW1lKCJmb3IiKSA8PCBjYXBfbmFtZSA8PCAiKCkpKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICBqYXZhLm5pby5CeXRlQnVmZmVyIGIgPSBidWZmZXIiIDw8IGdldF9jYXBfbmFtZSgiZm9yIikgPDwgY2FwX25hbWUgPDwgIigpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBiID09IG51bGwgPyBudWxsIDogYi5hcnJheSgpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgICBvdXQgPDwgZW5kbDsKKworICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBqYXZhLm5pby5CeXRlQnVmZmVyIGJ1ZmZlciIgPDwgZ2V0X2NhcF9uYW1lKCJmb3IiKQorICAgICAgICAgICAgICAgICAgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiKCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIGlmIChnZXRTZXRGaWVsZCgpID09IF9GaWVsZHMuIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiKSB7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKworICAgICAgaWYodW5zYWZlX2JpbmFyaWVzXyl7CisgICAgICAgIGluZGVudChvdXQpCisgICAgICAgICAgPDwgIiAgICByZXR1cm4gKGphdmEubmlvLkJ5dGVCdWZmZXIpZ2V0RmllbGRWYWx1ZSgpOyIKKyAgICAgICAgICA8PCBlbmRsOworICAgICAgfWVsc2V7CisgICAgICAgIGluZGVudChvdXQpCisgICAgICAgICAgPDwgIiAgICByZXR1cm4gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29weUJpbmFyeSgoamF2YS5uaW8uQnl0ZUJ1ZmZlcilnZXRGaWVsZFZhbHVlKCkpOyIKKyAgICAgICAgICA8PCBlbmRsOworICAgICAgfQorCisgICAgICBpbmRlbnQob3V0KSA8PCAiICB9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgICAgdGhyb3cgbmV3IGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uKFwiQ2Fubm90IGdldCBmaWVsZCAnIiA8PCBmaWVsZC0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgPDwgIicgYmVjYXVzZSB1bmlvbiBpcyBjdXJyZW50bHkgc2V0IHRvIFwiICsgZ2V0RmllbGREZXNjKGdldFNldEZpZWxkKCkpLm5hbWUpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChpc19kZXByZWNhdGVkKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJARGVwcmVjYXRlZCIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCkpIDw8ICIgZ2V0IgorICAgICAgICAgICAgICAgICAgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiKCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIGlmIChnZXRTZXRGaWVsZCgpID09IF9GaWVsZHMuIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiKSB7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgICAgcmV0dXJuICgiIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSkgPDwgIilnZXRGaWVsZFZhbHVlKCk7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIH0gZWxzZSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgICB0aHJvdyBuZXcgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24oXCJDYW5ub3QgZ2V0IGZpZWxkICciIDw8IGZpZWxkLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICA8PCAiJyBiZWNhdXNlIHVuaW9uIGlzIGN1cnJlbnRseSBzZXQgdG8gXCIgKyBnZXRGaWVsZERlc2MoZ2V0U2V0RmllbGQoKSkubmFtZSk7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgZmllbGQpOworICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgaWYgKGlzX2RlcHJlY2F0ZWQpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIkBEZXByZWNhdGVkIiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIHNldCIgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiKGJ5dGVbXSB2YWx1ZSkgeyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICBzZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSk7CisKKyAgICAgIGlmKHVuc2FmZV9iaW5hcmllc18peworICAgICAgICBpbmRlbnQob3V0KSA8PCAiKGphdmEubmlvLkJ5dGVCdWZmZXIud3JhcCh2YWx1ZSkpOyIgPDwgZW5kbDsKKyAgICAgIH1lbHNleworICAgICAgICBpbmRlbnQob3V0KSA8PCAiKGphdmEubmlvLkJ5dGVCdWZmZXIud3JhcCh2YWx1ZS5jbG9uZSgpKSk7IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICAgICAgb3V0IDw8IGVuZGw7CisgICAgfQorICAgIGlmIChpc19kZXByZWNhdGVkKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiQERlcHJlY2F0ZWQiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCBzZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIigiCisgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiIHZhbHVlKSB7IiA8PCBlbmRsOworICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKGZpZWxkLT5nZXRfdHlwZSgpKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIiAgaWYgKHZhbHVlID09IG51bGwpIHRocm93IG5ldyBqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICIgIHNldEZpZWxkXyA9IF9GaWVsZHMuIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICB2YWx1ZV8gPSB2YWx1ZTsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9pc19zZXRfbWV0aG9kcyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCBlbmRsOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7CisKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGJvb2xlYW4gaXMiIDw8IGdldF9jYXBfbmFtZSgic2V0IikgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpIDw8ICIoKSB7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiBzZXRGaWVsZF8gPT0gX0ZpZWxkcy4iIDw8IGNvbnN0YW50X25hbWUoZmllbGRfbmFtZSkgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdW5pb25fYWJzdHJhY3RfbWV0aG9kcyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGdlbmVyYXRlX2NoZWNrX3R5cGUob3V0LCB0c3RydWN0KTsKKyAgb3V0IDw8IGVuZGw7CisgIGdlbmVyYXRlX3N0YW5kYXJkX3NjaGVtZV9yZWFkX3ZhbHVlKG91dCwgdHN0cnVjdCk7CisgIG91dCA8PCBlbmRsOworICBnZW5lcmF0ZV9zdGFuZGFyZF9zY2hlbWVfd3JpdGVfdmFsdWUob3V0LCB0c3RydWN0KTsKKyAgb3V0IDw8IGVuZGw7CisgIGdlbmVyYXRlX3R1cGxlX3NjaGVtZV9yZWFkX3ZhbHVlKG91dCwgdHN0cnVjdCk7CisgIG91dCA8PCBlbmRsOworICBnZW5lcmF0ZV90dXBsZV9zY2hlbWVfd3JpdGVfdmFsdWUob3V0LCB0c3RydWN0KTsKKyAgb3V0IDw8IGVuZGw7CisgIGdlbmVyYXRlX2dldF9maWVsZF9kZXNjKG91dCwgdHN0cnVjdCk7CisgIG91dCA8PCBlbmRsOworICBnZW5lcmF0ZV9nZXRfc3RydWN0X2Rlc2Mob3V0LCB0c3RydWN0KTsKKyAgb3V0IDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwcm90ZWN0ZWQgX0ZpZWxkcyBlbnVtRm9ySWQoc2hvcnQgaWQpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBfRmllbGRzLmZpbmRCeVRocmlmdElkT3JUaHJvdyhpZCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jaGVja190eXBlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkKKyAgICAgIDw8ICJwcm90ZWN0ZWQgdm9pZCBjaGVja1R5cGUoX0ZpZWxkcyBzZXRGaWVsZCwgamF2YS5sYW5nLk9iamVjdCB2YWx1ZSkgdGhyb3dzIGphdmEubGFuZy5DbGFzc0Nhc3RFeGNlcHRpb24geyIKKyAgICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKHNldEZpZWxkKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKKworICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgIiA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlLCB0cnVlKQorICAgICAgICAgICAgICAgIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgICBicmVhazsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgamF2YS5sYW5nLkNsYXNzQ2FzdEV4Y2VwdGlvbihcIldhcyBleHBlY3RpbmcgdmFsdWUgb2YgdHlwZSAiCisgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSkgPDwgIiBmb3IgZmllbGQgJyIgPDwgZmllbGQtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICA8PCAiJywgYnV0IGdvdCBcIiArIHZhbHVlLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsiIDw8IGVuZGw7CisgICAgLy8gZG8gdGhlIHJlYWwgY2hlY2sgaGVyZQorICB9CisKKyAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihcIlVua25vd24gZmllbGQgaWQgXCIgKyBzZXRGaWVsZCk7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0YW5kYXJkX3NjaGVtZV9yZWFkX3ZhbHVlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCBqYXZhLmxhbmcuT2JqZWN0IHN0YW5kYXJkU2NoZW1lUmVhZFZhbHVlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCAiCisgICAgICAgICAgICAgICAgICJpcHJvdCwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIGZpZWxkKSB0aHJvd3MgIgorICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8ICJfRmllbGRzIHNldEZpZWxkID0gX0ZpZWxkcy5maW5kQnlUaHJpZnRJZChmaWVsZC5pZCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiaWYgKHNldEZpZWxkICE9IG51bGwpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChzZXRGaWVsZCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGQudHlwZSA9PSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICJfRklFTERfREVTQy50eXBlKSB7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICI7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCBmaWVsZCwgIiIpOworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gbnVsbDsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IGphdmEubGFuZy5JbGxlZ2FsU3RhdGVFeGNlcHRpb24oXCJzZXRGaWVsZCB3YXNuJ3QgbnVsbCwgYnV0IGRpZG4ndCBtYXRjaCBhbnkgIgorICAgICAgICAgICAgICAgICAib2YgdGhlIGNhc2Ugc3RhdGVtZW50cyFcIik7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiBudWxsOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RhbmRhcmRfc2NoZW1lX3dyaXRlX3ZhbHVlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCB2b2lkIHN0YW5kYXJkU2NoZW1lV3JpdGVWYWx1ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgIgorICAgICAgICAgICAgICAgICAib3Byb3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoc2V0RmllbGRfKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKKworICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPSAoIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSwgZmFsc2UpIDw8ICIpdmFsdWVfOyIgPDwgZW5kbDsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCBmaWVsZCwgIiIpOworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBqYXZhLmxhbmcuSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFwiQ2Fubm90IHdyaXRlIHVuaW9uIHdpdGggdW5rbm93biBmaWVsZCBcIiArICIKKyAgICAgICAgICAgICAgICAgInNldEZpZWxkXyk7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHVwbGVfc2NoZW1lX3JlYWRfdmFsdWUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHJvdGVjdGVkIGphdmEubGFuZy5PYmplY3QgdHVwbGVTY2hlbWVSZWFkVmFsdWUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sICIKKyAgICAgICAgICAgICAgICAgImlwcm90LCBzaG9ydCBmaWVsZElEKSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8ICJfRmllbGRzIHNldEZpZWxkID0gX0ZpZWxkcy5maW5kQnlUaHJpZnRJZChmaWVsZElEKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJpZiAoc2V0RmllbGQgIT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKHNldEZpZWxkKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKKworICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICI7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCBmaWVsZCwgIiIpOworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgamF2YS5sYW5nLklsbGVnYWxTdGF0ZUV4Y2VwdGlvbihcInNldEZpZWxkIHdhc24ndCBudWxsLCBidXQgZGlkbid0IG1hdGNoIGFueSAiCisgICAgICAgICAgICAgICAgICJvZiB0aGUgY2FzZSBzdGF0ZW1lbnRzIVwiKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgInRocm93IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xFeGNlcHRpb24oXCJDb3VsZG4ndCBmaW5kIGEgZmllbGQgd2l0aCBmaWVsZCBpZCBcIiArIGZpZWxkSUQpOyIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3R1cGxlX3NjaGVtZV93cml0ZV92YWx1ZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwcm90ZWN0ZWQgdm9pZCB0dXBsZVNjaGVtZVdyaXRlVmFsdWUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIG9wcm90KSAiCisgICAgICAgICAgICAgICAgICJ0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKHNldEZpZWxkXykgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiID0gKCIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlKSA8PCAiKXZhbHVlXzsiIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgZmllbGQsICIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgamF2YS5sYW5nLklsbGVnYWxTdGF0ZUV4Y2VwdGlvbihcIkNhbm5vdCB3cml0ZSB1bmlvbiB3aXRoIHVua25vd24gZmllbGQgXCIgKyAiCisgICAgICAgICAgICAgICAgICJzZXRGaWVsZF8pOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworCisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2dldF9maWVsZF9kZXNjKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgZ2V0RmllbGREZXNjKF9GaWVsZHMgc2V0RmllbGQpIHsiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoc2V0RmllbGQpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICJfRklFTERfREVTQzsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFwiVW5rbm93biBmaWVsZCBpZCBcIiArIHNldEZpZWxkKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ2V0X3N0cnVjdF9kZXNjKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgKHZvaWQpdHN0cnVjdDsKKyAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0IGdldFN0cnVjdERlc2MoKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gU1RSVUNUX0RFU0M7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9jb21wYXJpc29ucyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIC8vIGVxdWFsaXR5CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgYm9vbGVhbiBlcXVhbHMoamF2YS5sYW5nLk9iamVjdCBvdGhlcikgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgaWYgKG90aGVyIGluc3RhbmNlb2YgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgICAgcmV0dXJuIGVxdWFscygoIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIpb3RoZXIpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgfSBlbHNlIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgICAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBib29sZWFuIGVxdWFscygiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiBvdGhlcikgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIG90aGVyICE9IG51bGwgJiYgZ2V0U2V0RmllbGQoKSA9PSBvdGhlci5nZXRTZXRGaWVsZCgpICYmICIKKyAgICAgICAgICAgICAgICAgImdldEZpZWxkVmFsdWUoKS5lcXVhbHMob3RoZXIuZ2V0RmllbGRWYWx1ZSgpKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICBvdXQgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHVibGljIGludCBjb21wYXJlVG8oIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiBvdGhlcikgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgaW50IGxhc3RDb21wYXJpc29uID0gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29tcGFyZVRvKGdldFNldEZpZWxkKCksICIKKyAgICAgICAgICAgICAgICAgIm90aGVyLmdldFNldEZpZWxkKCkpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgaWYgKGxhc3RDb21wYXJpc29uID09IDApIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgICAgcmV0dXJuIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvbXBhcmVUbyhnZXRGaWVsZFZhbHVlKCksICIKKyAgICAgICAgICAgICAgICAgIm90aGVyLmdldEZpZWxkVmFsdWUoKSk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gbGFzdENvbXBhcmlzb247IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgb3V0IDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdW5pb25faGFzaGNvZGUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICAodm9pZCl0c3RydWN0OworICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHVibGljIGludCBoYXNoQ29kZSgpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIGphdmEudXRpbC5MaXN0PGphdmEubGFuZy5PYmplY3Q+IGxpc3QgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdDxqYXZhLmxhbmcuT2JqZWN0PigpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgbGlzdC5hZGQodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRJZEVudW0gc2V0RmllbGQgPSBnZXRTZXRGaWVsZCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgaWYgKHNldEZpZWxkICE9IG51bGwpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgICAgbGlzdC5hZGQoc2V0RmllbGQuZ2V0VGhyaWZ0RmllbGRJZCgpKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgICAgamF2YS5sYW5nLk9iamVjdCB2YWx1ZSA9IGdldEZpZWxkVmFsdWUoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgICAgaWYgKHZhbHVlIGluc3RhbmNlb2Ygb3JnLmFwYWNoZS50aHJpZnQuVEVudW0pIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgICAgICBsaXN0LmFkZCgoKG9yZy5hcGFjaGUudGhyaWZ0LlRFbnVtKWdldEZpZWxkVmFsdWUoKSkuZ2V0VmFsdWUoKSk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICAgIH0gZWxzZSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICAgICAgbGlzdC5hZGQodmFsdWUpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgICB9IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gbGlzdC5oYXNoQ29kZSgpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iOworfQorCisvKioKKyAqIEphdmEgc3RydWN0IGRlZmluaXRpb24uIFRoaXMgaGFzIHZhcmlvdXMgcGFyYW1ldGVycywgYXMgaXQgY291bGQgYmUKKyAqIGdlbmVyYXRlZCBzdGFuZGFsb25lIG9yIGluc2lkZSBhbm90aGVyIGNsYXNzIGFzIGEgaGVscGVyLiBJZiBpdAorICogaXMgYSBoZWxwZXIgdGhhbiBpdCBpcyBhIHN0YXRpYyBjbGFzcy4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCAgICAgIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICogQHBhcmFtIGlzX2V4Y2VwdGlvbiBJcyB0aGlzIGFuIGV4Y2VwdGlvbj8KKyAqIEBwYXJhbSBpbl9jbGFzcyAgICAgSWYgaW5zaWRlIGEgY2xhc3MsIG5lZWRzIHRvIGJlIHN0YXRpYyBjbGFzcworICogQHBhcmFtIGlzX3Jlc3VsdCAgICBJZiB0aGlzIGlzIGEgcmVzdWx0IGl0IG5lZWRzIGEgZGlmZmVyZW50IHdyaXRlcgorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQpIHsKKyAgZ2VuZXJhdGVfamF2YV9kb2Mob3V0LCB0c3RydWN0KTsKKworICBib29sIGlzX2ZpbmFsID0gKHRzdHJ1Y3QtPmFubm90YXRpb25zXy5maW5kKCJmaW5hbCIpICE9IHRzdHJ1Y3QtPmFubm90YXRpb25zXy5lbmQoKSk7CisgIGJvb2wgaXNfZGVwcmVjYXRlZCA9IHRoaXMtPmlzX2RlcHJlY2F0ZWQodHN0cnVjdC0+YW5ub3RhdGlvbnNfKTsKKworICBpZiAoIWluX2NsYXNzICYmICFzdXBwcmVzc19nZW5lcmF0ZWRfYW5ub3RhdGlvbnNfKSB7CisgICAgZ2VuZXJhdGVfamF2YXhfZ2VuZXJhdGVkX2Fubm90YXRpb24ob3V0KTsKKyAgfQorCisgIGlmIChpc19kZXByZWNhdGVkKSB7CisgICAgaW5kZW50KG91dCkgPDwgIkBEZXByZWNhdGVkIiA8PCBlbmRsOworICB9CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCAoaXNfZmluYWwgPyAiZmluYWwgIiA6ICIiKSA8PCAoaW5fY2xhc3MgPyAic3RhdGljICIgOiAiIikgPDwgImNsYXNzICIKKyAgICAgICAgICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiICI7CisKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIG91dCA8PCAiZXh0ZW5kcyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uICI7CisgIH0KKyAgb3V0IDw8ICJpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlPCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiLCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKKyAgICAgIDw8ICIuX0ZpZWxkcz4sIGphdmEuaW8uU2VyaWFsaXphYmxlLCBDbG9uZWFibGUsIENvbXBhcmFibGU8IiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI+IjsKKworICBpZiAoYW5kcm9pZF9zdHlsZV8pIHsKKyAgICBvdXQgPDwgIiwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlIjsKKyAgfQorCisgIG91dCA8PCAiICI7CisKKyAgc2NvcGVfdXAob3V0KTsKKworICBnZW5lcmF0ZV9zdHJ1Y3RfZGVzYyhvdXQsIHRzdHJ1Y3QpOworCisgIC8vIE1lbWJlcnMgYXJlIHB1YmxpYyBmb3IgLWphdmEsIHByaXZhdGUgZm9yIC1qYXZhYmVhbgorICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIG91dCA8PCBlbmRsOworCisgIGdlbmVyYXRlX2ZpZWxkX2Rlc2NzKG91dCwgdHN0cnVjdCk7CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfc2NoZW1lX21hcChvdXQsIHRzdHJ1Y3QpOworCisgIG91dCA8PCBlbmRsOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBpZiAoYmVhbl9zdHlsZV8gfHwgcHJpdmF0ZV9tZW1iZXJzXykgeworICAgICAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgIjsKKyAgICB9IGVsc2UgeworICAgICAgZ2VuZXJhdGVfamF2YV9kb2Mob3V0LCAqbV9pdGVyKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIjsKKyAgICB9CisgICAgb3V0IDw8IGRlY2xhcmVfZmllbGQoKm1faXRlciwgZmFsc2UsIHRydWUpIDw8IGVuZGw7CisgIH0KKworICBvdXQgPDwgZW5kbDsKKworICBpZiAoYW5kcm9pZF9zdHlsZV8pIHsKKyAgICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9wYXJjZWxhYmxlKG91dCwgdHN0cnVjdCk7CisgIH0KKworICBnZW5lcmF0ZV9maWVsZF9uYW1lX2NvbnN0YW50cyhvdXQsIHRzdHJ1Y3QpOworCisgIC8vIGlzc2V0IGRhdGEKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgIG91dCA8PCBlbmRsOworCisgICAgaW5kZW50KG91dCkgPDwgIi8vIGlzc2V0IGlkIGFzc2lnbm1lbnRzIiA8PCBlbmRsOworCisgICAgaW50IGkgPSAwOworICAgIGludCBvcHRpb25hbHMgPSAwOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7CisgICAgICAgIG9wdGlvbmFscysrOworICAgICAgfQorICAgICAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgc3RhdGljIGZpbmFsIGludCAiIDw8IGlzc2V0X2ZpZWxkX2lkKCptX2l0ZXIpIDw8ICIgPSAiIDw8IGkgPDwgIjsiCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIGkrKzsKKyAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBwcmltaXRpdmVUeXBlOworICAgIHN3aXRjaCAobmVlZHNfaXNzZXQodHN0cnVjdCwgJnByaW1pdGl2ZVR5cGUpKSB7CisgICAgY2FzZSBJU1NFVF9OT05FOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBJU1NFVF9QUklNSVRJVkU6CisgICAgICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSAiIDw8IHByaW1pdGl2ZVR5cGUgPDwgIiBfX2lzc2V0X2JpdGZpZWxkID0gMDsiIDw8IGVuZGw7CisgICAgICBicmVhazsKKyAgICBjYXNlIElTU0VUX0JJVFNFVDoKKyAgICAgIGluZGVudChvdXQpIDw8ICJwcml2YXRlIGphdmEudXRpbC5CaXRTZXQgX19pc3NldF9iaXRfdmVjdG9yID0gbmV3IGphdmEudXRpbC5CaXRTZXQoIiA8PCBpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChvcHRpb25hbHMgPiAwKSB7CisgICAgICBzdGQ6OnN0cmluZyBvdXRwdXRfc3RyaW5nID0gInByaXZhdGUgc3RhdGljIGZpbmFsIF9GaWVsZHMgb3B0aW9uYWxzW10gPSB7IjsKKyAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKKyAgICAgICAgICBvdXRwdXRfc3RyaW5nID0gb3V0cHV0X3N0cmluZyArICJfRmllbGRzLiIgKyBjb25zdGFudF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgKyAiLCI7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8IG91dHB1dF9zdHJpbmcuc3Vic3RyKDAsIG91dHB1dF9zdHJpbmcubGVuZ3RoKCkgLSAxKSA8PCAifTsiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgZ2VuZXJhdGVfamF2YV9tZXRhX2RhdGFfbWFwKG91dCwgdHN0cnVjdCk7CisKKyAgYm9vbCBhbGxfb3B0aW9uYWxfbWVtYmVycyA9IHRydWU7CisKKyAgLy8gRGVmYXVsdCBjb25zdHJ1Y3RvcgorICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMuIiArICgqbV9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHQsCisgICAgICAgICAgICAgICAgICAgICAgICAoKm1faXRlciktPmdldF92YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOworICAgIH0KKyAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9PUFRJT05BTCkgeworICAgICAgYWxsX29wdGlvbmFsX21lbWJlcnMgPSBmYWxzZTsKKyAgICB9CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpZiAoIW1lbWJlcnMuZW1wdHkoKSAmJiAhYWxsX29wdGlvbmFsX21lbWJlcnMpIHsKKyAgICAvLyBGdWxsIGNvbnN0cnVjdG9yIGZvciBhbGwgZmllbGRzCisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKKyAgICAgICAgaWYgKCFmaXJzdCkgeworICAgICAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgfQorICAgIH0KKyAgICBvdXQgPDwgIikiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAidGhpcygpOyIgPDwgZW5kbDsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9PUFRJT05BTCkgeworICAgICAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICAgIGlmKHVuc2FmZV9iaW5hcmllc18peworICAgICAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgPSAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiA9IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvcHlCaW5hcnkoIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IgorICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgZ2VuZXJhdGVfaXNzZXRfc2V0KG91dCwgKCptX2l0ZXIpLCAiIik7CisgICAgICB9CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgLy8gY29weSBjb25zdHJ1Y3RvcgorICBpbmRlbnQob3V0KSA8PCAiLyoqIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICogUGVyZm9ybXMgYSBkZWVwIGNvcHkgb24gPGk+b3RoZXI8L2k+LiIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAqLyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiBvdGhlcikgeyIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgc3dpdGNoIChuZWVkc19pc3NldCh0c3RydWN0KSkgeworICBjYXNlIElTU0VUX05PTkU6CisgICAgYnJlYWs7CisgIGNhc2UgSVNTRVRfUFJJTUlUSVZFOgorICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X2JpdGZpZWxkID0gb3RoZXIuX19pc3NldF9iaXRmaWVsZDsiIDw8IGVuZGw7CisgICAgYnJlYWs7CisgIGNhc2UgSVNTRVRfQklUU0VUOgorICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X2JpdF92ZWN0b3IuY2xlYXIoKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIl9faXNzZXRfYml0X3ZlY3Rvci5vcihvdGhlci5fX2lzc2V0X2JpdF92ZWN0b3IpOyIgPDwgZW5kbDsKKyAgICBicmVhazsKKyAgfQorCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKKyAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZmllbGQtPmdldF9uYW1lKCk7CisgICAgdF90eXBlKiB0eXBlID0gZmllbGQtPmdldF90eXBlKCktPmdldF90cnVlX3R5cGUoKTsKKyAgICBib29sIGNhbl9iZV9udWxsID0gdHlwZV9jYW5fYmVfbnVsbCh0eXBlKTsKKworICAgIGlmIChjYW5fYmVfbnVsbCkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmIChvdGhlci4iIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorCisgICAgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKG91dCwgIm90aGVyIiwgZmllbGRfbmFtZSwgIl9fdGhpc19fIiArIGZpZWxkX25hbWUsIHR5cGUpOworICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBfX3RoaXNfXyIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSAiOworICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIob3V0LCAib3RoZXIuIiArIGZpZWxkX25hbWUsIGZpZWxkX25hbWUsIHR5cGUpOworICAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOworICAgIH0KKworICAgIGlmIChjYW5fYmVfbnVsbCkgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gY2xvbmUgbWV0aG9kLCBzbyB0aGF0IHlvdSBjYW4gZGVlcCBjb3B5IGFuIG9iamVjdCB3aGVuIHlvdSBkb24ndCBrbm93IGl0cyBjbGFzcy4KKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiBkZWVwQ29weSgpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBuZXcgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIodGhpcyk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGdlbmVyYXRlX2phdmFfc3RydWN0X2NsZWFyKG91dCwgdHN0cnVjdCk7CisKKyAgZ2VuZXJhdGVfamF2YV9iZWFuX2JvaWxlcnBsYXRlKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2dlbmVyaWNfaXNzZXRfbWV0aG9kKG91dCwgdHN0cnVjdCk7CisKKyAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZXF1YWxpdHkob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfY29tcGFyZV90byhvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9maWVsZF9ieV9pZChvdXQsIHRzdHJ1Y3QpOworCisgIGdlbmVyYXRlX2phdmFfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOworICBpZiAoaXNfcmVzdWx0KSB7CisgICAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOworICB9IGVsc2UgeworICAgIGdlbmVyYXRlX2phdmFfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOworICB9CisgIGdlbmVyYXRlX2phdmFfc3RydWN0X3Rvc3RyaW5nKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2phdmFfdmFsaWRhdG9yKG91dCwgdHN0cnVjdCk7CisKKyAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3Rfd3JpdGVfb2JqZWN0KG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2phdmFfc3RydWN0X3JlYWRfb2JqZWN0KG91dCwgdHN0cnVjdCk7CisKKyAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3Rfc3RhbmRhcmRfc2NoZW1lKG91dCwgdHN0cnVjdCwgaXNfcmVzdWx0KTsKKyAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfdHVwbGVfc2NoZW1lKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2phdmFfc2NoZW1lX2xvb2t1cChvdXQpOworCisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogZ2VuZXJhdGVzIHBhcmNlbGFibGUgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfcGFyY2VsYWJsZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyB0bmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgInB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoYW5kcm9pZC5vcy5QYXJjZWwgb3V0LCBpbnQgZmxhZ3MpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBzdHJpbmcgYml0c2V0UHJpbWl0aXZlVHlwZSA9ICIiOworICBzd2l0Y2ggKG5lZWRzX2lzc2V0KHRzdHJ1Y3QsICZiaXRzZXRQcmltaXRpdmVUeXBlKSkgeworICBjYXNlIElTU0VUX05PTkU6CisgICAgYnJlYWs7CisgIGNhc2UgSVNTRVRfUFJJTUlUSVZFOgorICAgIGluZGVudChvdXQpIDw8ICIvL3ByaW1pdGl2ZSBiaXRmaWVsZCBvZiB0eXBlOiAiIDw8IGJpdHNldFByaW1pdGl2ZVR5cGUgPDwgZW5kbDsKKyAgICBpZiAoYml0c2V0UHJpbWl0aXZlVHlwZSA9PSAiYnl0ZSIpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJvdXQud3JpdGVCeXRlKF9faXNzZXRfYml0ZmllbGQpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKGJpdHNldFByaW1pdGl2ZVR5cGUgPT0gInNob3J0IikgeworICAgICAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZUludChuZXcgU2hvcnQoX19pc3NldF9iaXRmaWVsZCkuaW50VmFsdWUoKSk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAoYml0c2V0UHJpbWl0aXZlVHlwZSA9PSAiaW50IikgeworICAgICAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZUludChfX2lzc2V0X2JpdGZpZWxkKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmIChiaXRzZXRQcmltaXRpdmVUeXBlID09ICJsb25nIikgeworICAgICAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZUxvbmcoX19pc3NldF9iaXRmaWVsZCk7IiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgICBicmVhazsKKyAgY2FzZSBJU1NFVF9CSVRTRVQ6CisgICAgaW5kZW50KG91dCkgPDwgIi8vQml0U2V0IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJvdXQud3JpdGVTZXJpYWxpemFibGUoX19pc3NldF9iaXRfdmVjdG9yKTsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGVuZGw7CisgICAgYnJlYWs7CisgIH0KKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBzdHJpbmcgbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKKworICAgIGlmICh0LT5pc19zdHJ1Y3QoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZVBhcmNlbGFibGUoIiA8PCBuYW1lIDw8ICIsIGZsYWdzKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmICh0eXBlX25hbWUodCkgPT0gImZsb2F0IikgeworICAgICAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZUZsb2F0KCIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmICh0LT5pc19lbnVtKCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJvdXQud3JpdGVJbnQoIiA8PCBuYW1lIDw8ICIgIT0gbnVsbCA/ICIgPDwgbmFtZSA8PCAiLmdldFZhbHVlKCkgOiAtMSk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodC0+aXNfbGlzdCgpKSB7CisgICAgICBpZiAoKCh0X2xpc3QqKXQpLT5nZXRfZWxlbV90eXBlKCktPmdldF90cnVlX3R5cGUoKS0+aXNfc3RydWN0KCkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZVR5cGVkTGlzdCgiIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZUxpc3QoIiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHQtPmlzX21hcCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAib3V0LndyaXRlTWFwKCIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmICh0LT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgaWYgKHQtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJvdXQud3JpdGVJbnQoIiA8PCBuYW1lIDw8ICIhPW51bGwgPyAxIDogMCk7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYoIiA8PCBuYW1lIDw8ICIgIT0gbnVsbCkgeyAiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAib3V0LndyaXRlQnl0ZUFycmF5KCIgPDwgbmFtZSA8PCAiLmFycmF5KCksICIgPDwgbmFtZSA8PCAiLnBvc2l0aW9uKCkgKyAiCisgICAgICAgICAgICAgICAgICAgIDw8IG5hbWUgPDwgIi5hcnJheU9mZnNldCgpLCAiIDw8IG5hbWUgPDwgIi5saW1pdCgpIC0gIiA8PCBuYW1lCisgICAgICAgICAgICAgICAgICAgIDw8ICIucG9zaXRpb24oKSApOyIgPDwgZW5kbDsKKyAgICAgICAgc2NvcGVfZG93bihvdXQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3dpdGNoICgoKHRfYmFzZV90eXBlKil0KS0+Z2V0X2Jhc2UoKSkgeworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAib3V0LndyaXRlSW50KG5ldyBTaG9ydCgiIDw8IG5hbWUgPDwgIikuaW50VmFsdWUoKSk7IiA8PCBlbmRsOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAib3V0LndyaXRlSW50KCIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgIGluZGVudChvdXQpIDw8ICJvdXQud3JpdGVMb25nKCIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAib3V0LndyaXRlSW50KCIgPDwgbmFtZSA8PCAiID8gMSA6IDApOyIgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAib3V0LndyaXRlQnl0ZSgiIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAib3V0LndyaXRlRG91YmxlKCIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICAgIGluZGVudChvdXQpIDw8ICJvdXQud3JpdGVTdHJpbmcoIiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBpbnQgZGVzY3JpYmVDb250ZW50cygpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAwOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihvdXQpOworICBvdXQgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdG5hbWUgPDwgIihhbmRyb2lkLm9zLlBhcmNlbCBpbikgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIC8vIHJlYWQgaW4gdGhlIHJlcXVpcmVkIGJpdGZpZWxkCisgIHN3aXRjaCAobmVlZHNfaXNzZXQodHN0cnVjdCwgJmJpdHNldFByaW1pdGl2ZVR5cGUpKSB7CisgIGNhc2UgSVNTRVRfTk9ORToKKyAgICBicmVhazsKKyAgY2FzZSBJU1NFVF9QUklNSVRJVkU6CisgICAgaW5kZW50KG91dCkgPDwgIi8vcHJpbWl0aXZlIGJpdGZpZWxkIG9mIHR5cGU6ICIgPDwgYml0c2V0UHJpbWl0aXZlVHlwZSA8PCBlbmRsOworICAgIGlmIChiaXRzZXRQcmltaXRpdmVUeXBlID09ICJieXRlIikgeworICAgICAgaW5kZW50KG91dCkgPDwgIl9faXNzZXRfYml0ZmllbGQgPSBpbi5yZWFkQnl0ZSgpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKGJpdHNldFByaW1pdGl2ZVR5cGUgPT0gInNob3J0IikgeworICAgICAgaW5kZW50KG91dCkgPDwgIl9faXNzZXRfYml0ZmllbGQgPSAoc2hvcnQpIGluLnJlYWRJbnQoKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmIChiaXRzZXRQcmltaXRpdmVUeXBlID09ICJpbnQiKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldF9iaXRmaWVsZCA9IGluLnJlYWRJbnQoKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmIChiaXRzZXRQcmltaXRpdmVUeXBlID09ICJsb25nIikgeworICAgICAgaW5kZW50KG91dCkgPDwgIl9faXNzZXRfYml0ZmllbGQgPSBpbi5yZWFkTG9uZygpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgICAgYnJlYWs7CisgIGNhc2UgSVNTRVRfQklUU0VUOgorICAgIGluZGVudChvdXQpIDw8ICIvL0JpdFNldCIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldF9iaXRfdmVjdG9yID0gKGphdmEudXRpbC5CaXRTZXQpIGluLnJlYWRTZXJpYWxpemFibGUoKTsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGVuZGw7CisgICAgYnJlYWs7CisgIH0KKyAgLy8gcmVhZCBhbGwgdGhlIGZpZWxkcworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgIHN0cmluZyBuYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIHN0cmluZyBwcmVmaXggPSAidGhpcy4iICsgbmFtZTsKKworICAgIGlmICh0LT5pc19zdHJ1Y3QoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICI9IGluLnJlYWRQYXJjZWxhYmxlKCIgPDwgdG5hbWUgPDwgIi5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodC0+aXNfZW51bSgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9ICIgPDwgdHlwZV9uYW1lKHQpIDw8ICIuZmluZEJ5VmFsdWUoaW4ucmVhZEludCgpKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmICh0LT5pc19saXN0KCkpIHsKKyAgICAgIHRfbGlzdCogbGlzdCA9ICh0X2xpc3QqKXQ7CisgICAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0LCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgICAgIGlmIChsaXN0LT5nZXRfZWxlbV90eXBlKCktPmdldF90cnVlX3R5cGUoKS0+aXNfc3RydWN0KCkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImluLnJlYWRUeXBlZExpc3QoIiA8PCBwcmVmaXggPDwgIiwgIiA8PCB0eXBlX25hbWUobGlzdC0+Z2V0X2VsZW1fdHlwZSgpKQorICAgICAgICAgICAgICAgICAgICA8PCAiLkNSRUFUT1IpOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJpbi5yZWFkTGlzdCgiIDw8IHByZWZpeCA8PCAiLCAiIDw8IHRuYW1lIDw8ICIuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7IgorICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodC0+aXNfbWFwKCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHQsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiBpbi5yZWFkTWFwKCIgPDwgcHJlZml4IDw8ICIsICIgPDwgdG5hbWUgPDwgIi5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodHlwZV9uYW1lKHQpID09ICJmbG9hdCIpIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gaW4ucmVhZEZsb2F0KCk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodC0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlKiBidCA9ICh0X2Jhc2VfdHlwZSopdDsKKyAgICAgIGlmIChidC0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImlmKGluLnJlYWRJbnQoKT09MSkgeyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gamF2YS5uaW8uQnl0ZUJ1ZmZlci53cmFwKGluLmNyZWF0ZUJ5dGVBcnJheSgpKTsiIDw8IGVuZGw7CisgICAgICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN3aXRjaCAoYnQtPmdldF9iYXNlKCkpIHsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIgPSAoc2hvcnQpIGluLnJlYWRJbnQoKTsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gaW4ucmVhZEludCgpOyIgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIgPSBpbi5yZWFkTG9uZygpOyIgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gKGluLnJlYWRJbnQoKT09MSk7IiA8PCBlbmRsOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gaW4ucmVhZEJ5dGUoKTsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gaW4ucmVhZERvdWJsZSgpOyIgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICI9IGluLnJlYWRTdHJpbmcoKTsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC5vcy5QYXJjZWxhYmxlLkNyZWF0b3I8IiA8PCB0bmFtZQorICAgICAgICAgICAgICA8PCAiPiBDUkVBVE9SID0gbmV3IGFuZHJvaWQub3MuUGFyY2VsYWJsZS5DcmVhdG9yPCIgPDwgdG5hbWUgPDwgIj4oKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgIiA8PCB0bmFtZSA8PCAiW10gbmV3QXJyYXkoaW50IHNpemUpIHsiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIG5ldyAiIDw8IHRuYW1lIDw8ICJbc2l6ZV07IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInB1YmxpYyAiIDw8IHRuYW1lCisgICAgICAgICAgICAgIDw8ICIgY3JlYXRlRnJvbVBhcmNlbChhbmRyb2lkLm9zLlBhcmNlbCBpbikgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gbmV3ICIgPDwgdG5hbWUgPDwgIihpbik7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn07IiA8PCBlbmRsOworICBvdXQgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgZXF1YWxzIG1ldGhvZHMgYW5kIGEgaGFzaENvZGUgbWV0aG9kIGZvciBhIHN0cnVjdHVyZS4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9lcXVhbGl0eShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgYm9vbGVhbiBlcXVhbHMoamF2YS5sYW5nLk9iamVjdCB0aGF0KSB7IgorICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoYXQgPT0gbnVsbCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgImlmICh0aGF0IGluc3RhbmNlb2YgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiICByZXR1cm4gdGhpcy5lcXVhbHMoKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKXRoYXQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgInJldHVybiBmYWxzZTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgYm9vbGVhbiBlcXVhbHMoIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgdGhhdCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoYXQgPT0gbnVsbCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzID09IHRoYXQpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0cnVlOyIgIDw8IGVuZGw7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIG91dCA8PCBlbmRsOworCisgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgIC8vIE1vc3QgZXhpc3RpbmcgVGhyaWZ0IGNvZGUgZG9lcyBub3QgdXNlIGlzc2V0IG9yIG9wdGlvbmFsL3JlcXVpcmVkLAorICAgIC8vIHNvIHdlIHRyZWF0ICJkZWZhdWx0IiBmaWVsZHMgYXMgcmVxdWlyZWQuCisgICAgYm9vbCBpc19vcHRpb25hbCA9ICgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7CisgICAgYm9vbCBjYW5fYmVfbnVsbCA9IHR5cGVfY2FuX2JlX251bGwodCk7CisgICAgc3RyaW5nIG5hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7CisKKyAgICBzdHJpbmcgdGhpc19wcmVzZW50ID0gInRydWUiOworICAgIHN0cmluZyB0aGF0X3ByZXNlbnQgPSAidHJ1ZSI7CisgICAgc3RyaW5nIHVuZXF1YWw7CisKKyAgICBpZiAoaXNfb3B0aW9uYWwgfHwgY2FuX2JlX251bGwpIHsKKyAgICAgIHRoaXNfcHJlc2VudCArPSAiICYmIHRoaXMuIiArIGdlbmVyYXRlX2lzc2V0X2NoZWNrKCptX2l0ZXIpOworICAgICAgdGhhdF9wcmVzZW50ICs9ICIgJiYgdGhhdC4iICsgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKm1faXRlcik7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJib29sZWFuIHRoaXNfcHJlc2VudF8iIDw8IG5hbWUgPDwgIiA9ICIgPDwgdGhpc19wcmVzZW50IDw8ICI7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJib29sZWFuIHRoYXRfcHJlc2VudF8iIDw8IG5hbWUgPDwgIiA9ICIgPDwgdGhhdF9wcmVzZW50IDw8ICI7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoIgorICAgICAgICA8PCAidGhpc19wcmVzZW50XyIgPDwgbmFtZSA8PCAiIHx8IHRoYXRfcHJlc2VudF8iIDw8IG5hbWUgPDwgIikgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghKCIKKyAgICAgICAgPDwgInRoaXNfcHJlc2VudF8iIDw8IG5hbWUgPDwgIiAmJiB0aGF0X3ByZXNlbnRfIiA8PCBuYW1lIDw8ICIpKSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiICByZXR1cm4gZmFsc2U7IiA8PCBlbmRsOworCisgICAgaWYgKHQtPmlzX2JpbmFyeSgpKSB7CisgICAgICB1bmVxdWFsID0gIiF0aGlzLiIgKyBuYW1lICsgIi5lcXVhbHModGhhdC4iICsgbmFtZSArICIpIjsKKyAgICB9IGVsc2UgaWYgKGNhbl9iZV9udWxsKSB7CisgICAgICB1bmVxdWFsID0gIiF0aGlzLiIgKyBuYW1lICsgIi5lcXVhbHModGhhdC4iICsgbmFtZSArICIpIjsKKyAgICB9IGVsc2UgeworICAgICAgdW5lcXVhbCA9ICJ0aGlzLiIgKyBuYW1lICsgIiAhPSB0aGF0LiIgKyBuYW1lOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgdW5lcXVhbCA8PCAiKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gZmFsc2U7IiA8PCBlbmRsOworCisgICAgc2NvcGVfZG93bihvdXQpOworICB9CisgIG91dCA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworCisgIGNvbnN0IGludCBNVUwgPSA4MTkxOyAvLyBIYXNoQ29kZSBtdWx0aXBsaWVyCisgIGNvbnN0IGludCBCX1lFUyA9IDEzMTA3MTsKKyAgY29uc3QgaW50IEJfTk8gPSA1MjQyODc7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgaW50IGhhc2hDb2RlKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJpbnQgaGFzaENvZGUgPSAxOyIgPDwgZW5kbDsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgb3V0IDw8IGVuZGw7CisKKyAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgYm9vbCBpc19vcHRpb25hbCA9ICgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7CisgICAgYm9vbCBjYW5fYmVfbnVsbCA9IHR5cGVfY2FuX2JlX251bGwodCk7CisgICAgc3RyaW5nIG5hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7CisKKyAgICBpZiAoaXNfb3B0aW9uYWwgfHwgY2FuX2JlX251bGwpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJoYXNoQ29kZSA9IGhhc2hDb2RlICogIiA8PCBNVUwgPDwgIiArICgoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqbV9pdGVyKQorICAgICAgICAgICAgICAgICAgPDwgIikgPyAiIDw8IEJfWUVTIDw8ICIgOiAiIDw8IEJfTk8gPDwgIik7IiA8PCBlbmRsOworICAgIH0KKworICAgIGlmIChpc19vcHRpb25hbCB8fCBjYW5fYmVfbnVsbCkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiICsgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKm1faXRlcikgKyAiKSIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKworICAgIGlmICh0LT5pc19lbnVtKCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJoYXNoQ29kZSA9IGhhc2hDb2RlICogIiA8PCBNVUwgPDwgIiArICIgPDwgbmFtZSA8PCAiLmdldFZhbHVlKCk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodC0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHN3aXRjaCgoKHRfYmFzZV90eXBlKil0KS0+Z2V0X2Jhc2UoKSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIGluZGVudChvdXQpIDw8ICJoYXNoQ29kZSA9IGhhc2hDb2RlICogIiA8PCBNVUwgPDwgIiArICIgPDwgbmFtZSA8PCAiLmhhc2hDb2RlKCk7IiA8PCBlbmRsOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImhhc2hDb2RlID0gaGFzaENvZGUgKiAiIDw8IE1VTCA8PCAiICsgKCgiIDw8IG5hbWUgPDwgIikgPyAiCisgICAgICAgICAgICAgICAgICAgIDw8IEJfWUVTIDw8ICIgOiAiIDw8IEJfTk8gPDwgIik7IiA8PCBlbmRsOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIGluZGVudChvdXQpIDw8ICJoYXNoQ29kZSA9IGhhc2hDb2RlICogIiA8PCBNVUwgPDwgIiArIChpbnQpICgiIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIGluZGVudChvdXQpIDw8ICJoYXNoQ29kZSA9IGhhc2hDb2RlICogIiA8PCBNVUwgPDwgIiArICIgPDwgbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBpbmRlbnQob3V0KSA8PCAiaGFzaENvZGUgPSBoYXNoQ29kZSAqICIgPDwgTVVMIDw8ICIgKyBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5oYXNoQ29kZSgiIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgc3RkOjpsb2dpY19lcnJvcigiY29tcGlsZXIgZXJyb3I6IGEgc3RydWN0IGZpZWxkIGNhbm5vdCBiZSB2b2lkIik7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCJjb21waWxlciBlcnJvcjogdGhlIGZvbGxvd2luZyBiYXNlIHR5cGUgaGFzIG5vIGhhc2hjb2RlIGdlbmVyYXRvcjogIiArCisgICAgICAgICAgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUoKCh0X2Jhc2VfdHlwZSopdCktPmdldF9iYXNlKCkpKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgImhhc2hDb2RlID0gaGFzaENvZGUgKiAiIDw8IE1VTCA8PCAiICsgIiA8PCBuYW1lIDw8ICIuaGFzaENvZGUoKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaWYgKGlzX29wdGlvbmFsIHx8IGNhbl9iZV9udWxsKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgIH0KKyAgfQorCisgIG91dCA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIGhhc2hDb2RlOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9jb21wYXJlX3RvKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBpbnQgY29tcGFyZVRvKCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgb3RoZXIpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8ICJpZiAoIWdldENsYXNzKCkuZXF1YWxzKG90aGVyLmdldENsYXNzKCkpKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCkuY29tcGFyZVRvKG90aGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICBvdXQgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAiaW50IGxhc3RDb21wYXJpc29uID0gMDsiIDw8IGVuZGw7CisgIG91dCA8PCBlbmRsOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICptX2l0ZXI7CisgICAgaW5kZW50KG91dCkgPDwgImxhc3RDb21wYXJpc29uID0gamF2YS5sYW5nLkJvb2xlYW4udmFsdWVPZigiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkKQorICAgICAgICAgICAgICAgIDw8ICIpLmNvbXBhcmVUbyhvdGhlci4iIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgImlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgbGFzdENvbXBhcmlzb24gPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy4iCisgICAgICAgICAgICAgICAgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiwgb3RoZXIuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgICByZXR1cm4gbGFzdENvbXBhcmlzb247IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIDA7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gcmVhZCBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0LgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgICh2b2lkKXRzdHJ1Y3Q7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCByZWFkKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBpcHJvdCkgdGhyb3dzICIKKyAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJzY2hlbWUoaXByb3QpLnJlYWQoaXByb3QsIHRoaXMpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLy8gZ2VuZXJhdGVzIGphdmEgbWV0aG9kIHRvIHBlcmZvcm0gdmFyaW91cyBjaGVja3MKKy8vIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3ZhbGlkYXRvcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgIi8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMiIDw8IGVuZGw7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKKyAgICAgIGlmIChiZWFuX3N0eWxlXykgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICA8PCAiICB0aHJvdyBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRXhjZXB0aW9uKFwiUmVxdWlyZWQgZmllbGQgJyIKKyAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJyBpcyB1bnNldCEgU3RydWN0OlwiICsgdG9TdHJpbmcoKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSkgeworICAgICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgICAgIGluZGVudChvdXQpCisgICAgICAgICAgICAgIDw8ICIgIHRocm93IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xFeGNlcHRpb24oXCJSZXF1aXJlZCBmaWVsZCAnIgorICAgICAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicgd2FzIG5vdCBwcmVzZW50ISBTdHJ1Y3Q6IFwiICsgdG9TdHJpbmcoKSk7IiA8PCBlbmRsOworICAgICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGluZGVudChvdXQpIDw8ICIvLyBhbGFzLCB3ZSBjYW5ub3QgY2hlY2sgJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgPDwgIicgYmVjYXVzZSBpdCdzIGEgcHJpbWl0aXZlIGFuZCB5b3UgY2hvc2UgdGhlIG5vbi1iZWFucyBnZW5lcmF0b3IuIgorICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBvdXQgPDwgaW5kZW50KCkgPDwgIi8vIGNoZWNrIGZvciBzdWItc3RydWN0IHZhbGlkaXR5IiA8PCBlbmRsOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfdHlwZSogdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICBpZiAodHlwZS0+aXNfc3RydWN0KCkgJiYgISgodF9zdHJ1Y3QqKXR5cGUpLT5pc191bmlvbigpKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIi52YWxpZGF0ZSgpOyIgPDwgZW5kbDsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHdyaXRlIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICAodm9pZCl0c3RydWN0OworICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgd3JpdGUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIG9wcm90KSB0aHJvd3MgIgorICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgInNjaGVtZShvcHJvdCkud3JpdGUob3Byb3QsIHRoaXMpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHdyaXRlIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QsCisgKiB3aGljaCBpcyBhIGZ1bmN0aW9uIHJlc3VsdC4gVGhlc2UgZmllbGRzIGFyZSBvbmx5IHdyaXR0ZW4KKyAqIGlmIHRoZXkgYXJlIHNldCBpbiB0aGUgSXNzZXQgYXJyYXksIGFuZCBvbmx5IG9uZSBvZiB0aGVtCisgKiBjYW4gYmUgc2V0IGF0IGEgdGltZS4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgKHZvaWQpdHN0cnVjdDsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIHdyaXRlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBvcHJvdCkgdGhyb3dzICIKKyAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJzY2hlbWUob3Byb3QpLndyaXRlKG9wcm90LCB0aGlzKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X2ZpZWxkX2J5X2lkKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgKHZvaWQpdHN0cnVjdDsKKyAgaW5kZW50KG91dCkgPDwgamF2YV9udWxsYWJsZV9hbm5vdGF0aW9uKCkgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBfRmllbGRzIGZpZWxkRm9ySWQoaW50IGZpZWxkSWQpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBfRmllbGRzLmZpbmRCeVRocmlmdElkKGZpZWxkSWQpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yZWZsZWN0aW9uX2dldHRlcnMob3N0cmluZ3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2FwX25hbWUpIHsKKyAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkX25hbWUpIDw8ICI6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiAiIDw8ICh0eXBlLT5pc19ib29sKCkgPyAiaXMiIDogImdldCIpIDw8IGNhcF9uYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yZWZsZWN0aW9uX3NldHRlcnMob3N0cmluZ3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2FwX25hbWUpIHsKKyAgY29uc3QgYm9vbCBpc19iaW5hcnkgPSB0eXBlLT5pc19iaW5hcnkoKTsKKyAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkX25hbWUpIDw8ICI6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgImlmICh2YWx1ZSA9PSBudWxsKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB1bnNldCIgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpIDw8ICIoKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgaWYgKGlzX2JpbmFyeSkgeworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJpZiAodmFsdWUgaW5zdGFuY2VvZiBieXRlW10pIHsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgc2V0IiA8PCBjYXBfbmFtZSA8PCAiKChieXRlW10pdmFsdWUpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50KG91dCkgPDwgIiAgc2V0IiA8PCBjYXBfbmFtZSA8PCAiKCgiIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlLCBmYWxzZSkgPDwgIil2YWx1ZSk7IiA8PCBlbmRsOworICBpZiAoaXNfYmluYXJ5KSB7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ2VuZXJpY19maWVsZF9nZXR0ZXJzX3NldHRlcnMoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBnZXR0ZXJfc3RyZWFtOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc2V0dGVyX3N0cmVhbTsKKworICAvLyBidWlsZCB1cCB0aGUgYm9kaWVzIG9mIGJvdGggdGhlIGdldHRlciBhbmQgc2V0dGVyIGF0IG9uY2UKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKKyAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZmllbGQtPmdldF9uYW1lKCk7CisgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUgPSBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSk7CisKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9yZWZsZWN0aW9uX3NldHRlcnMoc2V0dGVyX3N0cmVhbSwgdHlwZSwgZmllbGRfbmFtZSwgY2FwX25hbWUpOworICAgIGdlbmVyYXRlX3JlZmxlY3Rpb25fZ2V0dGVycyhnZXR0ZXJfc3RyZWFtLCB0eXBlLCBmaWVsZF9uYW1lLCBjYXBfbmFtZSk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIC8vIGNyZWF0ZSB0aGUgc2V0dGVyCisKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIHNldEZpZWxkVmFsdWUoX0ZpZWxkcyBmaWVsZCwgIiA8PCBqYXZhX251bGxhYmxlX2Fubm90YXRpb24oKQorICAgICAgICAgICAgICA8PCAiIGphdmEubGFuZy5PYmplY3QgdmFsdWUpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHN3aXRjaCAoZmllbGQpIHsiIDw8IGVuZGw7CisgIG91dCA8PCBzZXR0ZXJfc3RyZWFtLnN0cigpOworICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIGNyZWF0ZSB0aGUgZ2V0dGVyCisgIGluZGVudChvdXQpIDw8IGphdmFfbnVsbGFibGVfYW5ub3RhdGlvbigpIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgamF2YS5sYW5nLk9iamVjdCBnZXRGaWVsZFZhbHVlKF9GaWVsZHMgZmllbGQpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZCkgeyIgPDwgZW5kbDsKKyAgb3V0IDw8IGdldHRlcl9zdHJlYW0uc3RyKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAidGhyb3cgbmV3IGphdmEubGFuZy5JbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8vIENyZWF0ZXMgYSBnZW5lcmljIGlzU2V0IG1ldGhvZCB0aGF0IHRha2VzIHRoZSBmaWVsZCBudW1iZXIgYXMgYXJndW1lbnQKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ2VuZXJpY19pc3NldF9tZXRob2Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBjcmVhdGUgdGhlIGlzU2V0IG1ldGhvZAorICBpbmRlbnQob3V0KSA8PCAiLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBjb3JyZXNwb25kaW5nIHRvIGZpZWxkSUQgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhICIKKyAgICAgICAgICAgICAgICAgInZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHVibGljIGJvb2xlYW4gaXNTZXQoX0ZpZWxkcyBmaWVsZCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGQgPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGQpIHsiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7CisgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpIDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInRocm93IG5ldyBqYXZhLmxhbmcuSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNldCBvZiBKYXZhIEJlYW4gYm9pbGVycGxhdGUgZnVuY3Rpb25zIChzZXR0ZXJzLCBnZXR0ZXJzLCBldGMuKQorICogZm9yIHRoZSBnaXZlbiBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9iZWFuX2JvaWxlcnBsYXRlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaXNzZXRfdHlwZSBpc3NldFR5cGUgPSBuZWVkc19pc3NldCh0c3RydWN0KTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKKyAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZmllbGQtPmdldF9uYW1lKCk7CisgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUgPSBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSk7CisgICAgYm9vbCBvcHRpb25hbCA9IHVzZV9vcHRpb25fdHlwZV8gJiYgZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMOworICAgIGJvb2wgaXNfZGVwcmVjYXRlZCA9IHRoaXMtPmlzX2RlcHJlY2F0ZWQoZmllbGQtPmFubm90YXRpb25zXyk7CisKKyAgICBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIC8vIE1ldGhvZCB0byByZXR1cm4gdGhlIHNpemUgb2YgdGhlIGNvbGxlY3Rpb24KKyAgICAgIGlmIChvcHRpb25hbCkgeworICAgICAgICBpZiAoaXNfZGVwcmVjYXRlZCkgeworICAgICAgICAgIGluZGVudChvdXQpIDw8ICJARGVwcmVjYXRlZCIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIG9yZy5hcGFjaGUudGhyaWZ0Lk9wdGlvbjxJbnRlZ2VyPiBnZXQiIDw8IGNhcF9uYW1lOworICAgICAgICBvdXQgPDwgZ2V0X2NhcF9uYW1lKCJzaXplKCkgeyIpIDw8IGVuZGw7CisKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiBvcmcuYXBhY2hlLnRocmlmdC5PcHRpb24ubm9uZSgpOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiBvcmcuYXBhY2hlLnRocmlmdC5PcHRpb24uc29tZSh0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiLnNpemUoKSk7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChpc19kZXByZWNhdGVkKSB7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgIkBEZXByZWNhdGVkIiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgaW50IGdldCIgPDwgY2FwX25hbWU7CisgICAgICAgIG91dCA8PCBnZXRfY2FwX25hbWUoInNpemUoKSB7IikgPDwgZW5kbDsKKworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiAodGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9PSBudWxsKSA/IDAgOiAiCisgICAgICAgICAgICAgICAgICAgIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiLnNpemUoKTsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHR5cGUtPmlzX3NldCgpIHx8IHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgdF90eXBlKiBlbGVtZW50X3R5cGU7CisgICAgICBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgICAgZWxlbWVudF90eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGVsZW1lbnRfdHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgICAgfQorCisgICAgICAvLyBJdGVyYXRvciBnZXR0ZXIgZm9yIHNldHMgYW5kIGxpc3RzCisgICAgICBpZiAob3B0aW9uYWwpIHsKKyAgICAgICAgaWYgKGlzX2RlcHJlY2F0ZWQpIHsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAiQERlcHJlY2F0ZWQiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBvcmcuYXBhY2hlLnRocmlmdC5PcHRpb248amF2YS51dGlsLkl0ZXJhdG9yPCIgPDwgdHlwZV9uYW1lKGVsZW1lbnRfdHlwZSwgdHJ1ZSwgZmFsc2UpCisgICAgICAgICAgICAgICAgICAgIDw8ICI+PiBnZXQiIDw8IGNhcF9uYW1lOworICAgICAgICBvdXQgPDwgZ2V0X2NhcF9uYW1lKCJpdGVyYXRvcigpIHsiKSA8PCBlbmRsOworCisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gb3JnLmFwYWNoZS50aHJpZnQuT3B0aW9uLm5vbmUoKTsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gb3JnLmFwYWNoZS50aHJpZnQuT3B0aW9uLnNvbWUodGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIi5pdGVyYXRvcigpKTsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGlzX2RlcHJlY2F0ZWQpIHsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAiQERlcHJlY2F0ZWQiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgaW5kZW50KG91dCkgPDwgamF2YV9udWxsYWJsZV9hbm5vdGF0aW9uKCkgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBqYXZhLnV0aWwuSXRlcmF0b3I8IiA8PCB0eXBlX25hbWUoZWxlbWVudF90eXBlLCB0cnVlLCBmYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgPDwgIj4gZ2V0IiA8PCBjYXBfbmFtZTsKKyAgICAgICAgb3V0IDw8IGdldF9jYXBfbmFtZSgiaXRlcmF0b3IoKSB7IikgPDwgZW5kbDsKKworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiAodGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9PSBudWxsKSA/IG51bGwgOiAiCisgICAgICAgICAgICAgICAgICAgIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiLml0ZXJhdG9yKCk7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgICAgfQorCisgICAgICAvLyBBZGQgdG8gc2V0IG9yIGxpc3QsIGNyZWF0ZSBpZiB0aGUgc2V0L2xpc3QgaXMgbnVsbAorICAgICAgaWYgKGlzX2RlcHJlY2F0ZWQpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIkBEZXByZWNhdGVkIiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIGFkZCIgPDwgZ2V0X2NhcF9uYW1lKCJ0byIpOworICAgICAgb3V0IDw8IGNhcF9uYW1lIDw8ICIoIiA8PCB0eXBlX25hbWUoZWxlbWVudF90eXBlKSA8PCAiIGVsZW0pIHsiIDw8IGVuZGw7CisKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KG91dCkgPDwgImlmICh0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID09IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZTsKKyAgICAgIGlmIChpc19lbnVtX3NldCh0eXBlKSkgeworICAgICAgICBvdXQgPDwgIiA9ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlLCB0cnVlKSA8PCAiLm5vbmVPZigiIDw8IGlubmVyX2VudW1fdHlwZV9uYW1lKHR5cGUpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIuYWRkKGVsZW0pOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgIC8vIFB1dCB0byBtYXAKKyAgICAgIHRfdHlwZSoga2V5X3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgICB0X3R5cGUqIHZhbF90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworCisgICAgICBpZiAoaXNfZGVwcmVjYXRlZCkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiQERlcHJlY2F0ZWQiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgcHV0IiA8PCBnZXRfY2FwX25hbWUoInRvIik7CisgICAgICBvdXQgPDwgY2FwX25hbWUgPDwgIigiIDw8IHR5cGVfbmFtZShrZXlfdHlwZSkgPDwgIiBrZXksICIgPDwgdHlwZV9uYW1lKHZhbF90eXBlKSA8PCAiIHZhbCkgeyIKKyAgICAgICAgICA8PCBlbmRsOworCisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBzdGQ6OnN0cmluZyBjb25zdHJ1Y3Rvcl9hcmdzOworICAgICAgaWYgKGlzX2VudW1fbWFwKHR5cGUpKSB7CisgICAgICAgIGNvbnN0cnVjdG9yX2FyZ3MgPSBpbm5lcl9lbnVtX3R5cGVfbmFtZSh0eXBlKTsKKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCIgPDwgY29uc3RydWN0b3JfYXJncyA8PCAiKTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIucHV0KGtleSwgdmFsKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBTaW1wbGUgZ2V0dGVyCisgICAgZ2VuZXJhdGVfamF2YV9kb2Mob3V0LCBmaWVsZCk7CisgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICBpZiAoaXNfZGVwcmVjYXRlZCkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiQERlcHJlY2F0ZWQiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGJ5dGVbXSBnZXQiIDw8IGNhcF9uYW1lIDw8ICIoKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgc2V0IiA8PCBjYXBfbmFtZSA8PCAiKG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLnJpZ2h0U2l6ZSgiCisgICAgICAgICAgICAgICAgICA8PCBmaWVsZF9uYW1lIDw8ICIpKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT0gbnVsbCA/IG51bGwgOiAiIDw8IGZpZWxkX25hbWUgPDwgIi5hcnJheSgpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGphdmEubmlvLkJ5dGVCdWZmZXIgYnVmZmVyIiA8PCBnZXRfY2FwX25hbWUoImZvciIpIDw8IGNhcF9uYW1lIDw8ICIoKSB7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGlmKHVuc2FmZV9iaW5hcmllc18peworICAgICAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gIiA8PCBmaWVsZF9uYW1lIDw8ICI7IgorICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgfWVsc2UgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29weUJpbmFyeSgiIDw8IGZpZWxkX25hbWUgPDwgIik7IgorICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKG9wdGlvbmFsKSB7CisgICAgICAgIGlmIChpc19kZXByZWNhdGVkKSB7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgIkBEZXByZWNhdGVkIiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgb3JnLmFwYWNoZS50aHJpZnQuT3B0aW9uPCIgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUpIDw8ICI+IjsKKyAgICAgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpID09IHRfYmFzZV90eXBlOjpUWVBFX0JPT0wpIHsKKyAgICAgICAgICBvdXQgPDwgIiBpcyI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8ICIgZ2V0IjsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwgY2FwX25hbWUgPDwgIigpIHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworCisgICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodGhpcy5pc1NldCIgPDwgY2FwX25hbWUgPDwgIigpKSB7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiBvcmcuYXBhY2hlLnRocmlmdC5PcHRpb24uc29tZSh0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gb3JnLmFwYWNoZS50aHJpZnQuT3B0aW9uLm5vbmUoKTsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGlzX2RlcHJlY2F0ZWQpIHsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAiQERlcHJlY2F0ZWQiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCBqYXZhX251bGxhYmxlX2Fubm90YXRpb24oKSA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0eXBlX25hbWUodHlwZSk7CisgICAgICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MKSB7CisgICAgICAgICAgb3V0IDw8ICIgaXMiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAiIGdldCI7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8IGNhcF9uYW1lIDw8ICIoKSB7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiB0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBTaW1wbGUgc2V0dGVyCisgICAgZ2VuZXJhdGVfamF2YV9kb2Mob3V0LCBmaWVsZCk7CisgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICBpZiAoaXNfZGVwcmVjYXRlZCkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiQERlcHJlY2F0ZWQiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICI7CisgICAgICBpZiAoYmVhbl9zdHlsZV8pIHsKKyAgICAgICAgb3V0IDw8ICJ2b2lkIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCB0eXBlX25hbWUodHN0cnVjdCk7CisgICAgICB9CisgICAgICBvdXQgPDwgIiBzZXQiIDw8IGNhcF9uYW1lIDw8ICIoYnl0ZVtdICIgPDwgZmllbGRfbmFtZSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9ICIgPDwgZmllbGRfbmFtZSA8PCAiID09IG51bGwgPyAoamF2YS5uaW8uQnl0ZUJ1ZmZlciludWxsIjsKKworICAgICAgaWYodW5zYWZlX2JpbmFyaWVzXyl7CisgICAgICAgIGluZGVudChvdXQpIDw8ICIgOiBqYXZhLm5pby5CeXRlQnVmZmVyLndyYXAoIiA8PCBmaWVsZF9uYW1lIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIH1lbHNleworICAgICAgICBpbmRlbnQob3V0KSA8PCAiIDogamF2YS5uaW8uQnl0ZUJ1ZmZlci53cmFwKCIgPDwgZmllbGRfbmFtZSA8PCAiLmNsb25lKCkpOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgICAgICAgICAgICAgCisgICAgICBpZiAoIWJlYW5fc3R5bGVfKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiB0aGlzOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfQorICAgIGlmIChpc19kZXByZWNhdGVkKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiQERlcHJlY2F0ZWQiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIjsKKyAgICBpZiAoYmVhbl9zdHlsZV8pIHsKKyAgICAgIG91dCA8PCAidm9pZCI7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCB0eXBlX25hbWUodHN0cnVjdCk7CisgICAgfQorICAgIG91dCA8PCAiIHNldCIgPDwgY2FwX25hbWUgPDwgIigiIDw8ICh0eXBlX2Nhbl9iZV9udWxsKHR5cGUpID8gKGphdmFfbnVsbGFibGVfYW5ub3RhdGlvbigpICsgIiAiKSA6ICIiKQorICAgICAgICA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiIDw8IGZpZWxkX25hbWUgPDwgIikgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9ICI7CisgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpICYmICF1bnNhZmVfYmluYXJpZXNfKSB7CisgICAgICBvdXQgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvcHlCaW5hcnkoIiA8PCBmaWVsZF9uYW1lIDw8ICIpIjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IGZpZWxkX25hbWU7CisgICAgfQorICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKKyAgICBnZW5lcmF0ZV9pc3NldF9zZXQob3V0LCBmaWVsZCwgIiIpOworICAgIGlmICghYmVhbl9zdHlsZV8pIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpczsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gVW5zZXR0ZXIKKyAgICBpZiAoaXNfZGVwcmVjYXRlZCkgeworICAgICAgaW5kZW50KG91dCkgPDwgIkBEZXByZWNhdGVkIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgdW5zZXQiIDw8IGNhcF9uYW1lIDw8ICIoKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG51bGw7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAoaXNzZXRUeXBlID09IElTU0VUX1BSSU1JVElWRSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIl9faXNzZXRfYml0ZmllbGQgPSBvcmcuYXBhY2hlLnRocmlmdC5FbmNvZGluZ1V0aWxzLmNsZWFyQml0KF9faXNzZXRfYml0ZmllbGQsICIKKyAgICAgICAgICAgICAgICAgIDw8IGlzc2V0X2ZpZWxkX2lkKGZpZWxkKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X2JpdF92ZWN0b3IuY2xlYXIoIiA8PCBpc3NldF9maWVsZF9pZChmaWVsZCkgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAvLyBpc1NldCBtZXRob2QKKyAgICBpbmRlbnQob3V0KSA8PCAiLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCAiIDw8IGZpZWxkX25hbWUKKyAgICAgICAgICAgICAgICA8PCAiIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLyIgPDwgZW5kbDsKKyAgICBpZiAoaXNfZGVwcmVjYXRlZCkgeworICAgICAgaW5kZW50KG91dCkgPDwgIkBEZXByZWNhdGVkIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGJvb2xlYW4gaXMiIDw8IGdldF9jYXBfbmFtZSgic2V0IikgPDwgY2FwX25hbWUgPDwgIigpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiAhPSBudWxsOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKGlzc2V0VHlwZSA9PSBJU1NFVF9QUklNSVRJVkUpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gb3JnLmFwYWNoZS50aHJpZnQuRW5jb2RpbmdVdGlscy50ZXN0Qml0KF9faXNzZXRfYml0ZmllbGQsICIgPDwgaXNzZXRfZmllbGRfaWQoZmllbGQpCisgICAgICAgICAgICAgICAgICA8PCAiKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gX19pc3NldF9iaXRfdmVjdG9yLmdldCgiIDw8IGlzc2V0X2ZpZWxkX2lkKGZpZWxkKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGlmIChpc19kZXByZWNhdGVkKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiQERlcHJlY2F0ZWQiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCBzZXQiIDw8IGNhcF9uYW1lIDw8IGdldF9jYXBfbmFtZSgiaXNTZXQiKSA8PCAiKGJvb2xlYW4gdmFsdWUpIHsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmICghdmFsdWUpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICB0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gbnVsbDsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKGlzc2V0VHlwZSA9PSBJU1NFVF9QUklNSVRJVkUpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X2JpdGZpZWxkID0gb3JnLmFwYWNoZS50aHJpZnQuRW5jb2RpbmdVdGlscy5zZXRCaXQoX19pc3NldF9iaXRmaWVsZCwgIgorICAgICAgICAgICAgICAgICAgPDwgaXNzZXRfZmllbGRfaWQoZmllbGQpIDw8ICIsIHZhbHVlKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X2JpdF92ZWN0b3Iuc2V0KCIgPDwgaXNzZXRfZmllbGRfaWQoZmllbGQpIDw8ICIsIHZhbHVlKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHRvU3RyaW5nKCkgbWV0aG9kIGZvciB0aGUgZ2l2ZW4gc3RydWN0CisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfdG9zdHJpbmcob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgImphdmEubGFuZy5TdHJpbmdCdWlsZGVyIHNiID0gbmV3IGphdmEubGFuZy5TdHJpbmdCdWlsZGVyKFwiIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoXCIpOyIKKyAgICAgIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiYm9vbGVhbiBmaXJzdCA9IHRydWU7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBib29sIGNvdWxkX2JlX3Vuc2V0ID0gKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKKyAgICBpZiAoY291bGRfYmVfdW5zZXQpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorCisgICAgdF9maWVsZCogZmllbGQgPSAoKmZfaXRlcik7CisKKyAgICBpZiAoIWZpcnN0KSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFmaXJzdCkgc2IuYXBwZW5kKFwiLCBcIik7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAic2IuYXBwZW5kKFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjpcIik7IiA8PCBlbmRsOworICAgIGJvb2wgY2FuX2JlX251bGwgPSB0eXBlX2Nhbl9iZV9udWxsKGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAoY2FuX2JlX251bGwpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID09IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICBzYi5hcHBlbmQoXCJudWxsXCIpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKworICAgIGlmIChnZXRfdHJ1ZV90eXBlKGZpZWxkLT5nZXRfdHlwZSgpKS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci50b1N0cmluZyh0aGlzLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiwgc2IpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmICgoZmllbGQtPmdldF90eXBlKCktPmlzX3NldCgpKQorICAgICAgICAgICAgICAgJiYgKGdldF90cnVlX3R5cGUoKCh0X3NldCopZmllbGQtPmdldF90eXBlKCkpLT5nZXRfZWxlbV90eXBlKCkpLT5pc19iaW5hcnkoKSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci50b1N0cmluZyh0aGlzLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiwgc2IpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmICgoZmllbGQtPmdldF90eXBlKCktPmlzX2xpc3QoKSkKKyAgICAgICAgICAgICAgICYmIChnZXRfdHJ1ZV90eXBlKCgodF9saXN0KilmaWVsZC0+Z2V0X3R5cGUoKSktPmdldF9lbGVtX3R5cGUoKSktPmlzX2JpbmFyeSgpKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLnRvU3RyaW5nKHRoaXMuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiLCBzYik7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgInNiLmFwcGVuZCh0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpZiAoY2FuX2JlX251bGwpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgImZpcnN0ID0gZmFsc2U7IiA8PCBlbmRsOworCisgICAgaWYgKGNvdWxkX2JlX3Vuc2V0KSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIGZpcnN0ID0gZmFsc2U7CisgIH0KKyAgb3V0IDw8IGluZGVudCgpIDw8ICJzYi5hcHBlbmQoXCIpXCIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHNiLnRvU3RyaW5nKCk7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RhdGljIG1hcCB3aXRoIG1ldGEgZGF0YSB0byBzdG9yZSBpbmZvcm1hdGlvbiBzdWNoIGFzIGZpZWxkSUQgdG8KKyAqIGZpZWxkTmFtZSBtYXBwaW5nCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9tZXRhX2RhdGFfbWFwKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIC8vIFN0YXRpYyBNYXAgd2l0aCBmaWVsZElEIC0+IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhIG1hcHBpbmdzCisgIGluZGVudChvdXQpCisgICAgICA8PCAicHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPiBtZXRhRGF0YU1hcDsiCisgICAgICA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAic3RhdGljIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8ICJqYXZhLnV0aWwuTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPiB0bXBNYXAgPSBuZXcgIgorICAgICAgICAgICAgICAgICAiamF2YS51dGlsLkVudW1NYXA8X0ZpZWxkcywgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGE+KF9GaWVsZHMuY2xhc3MpOyIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKworICAvLyBQb3B1bGF0ZSBtYXAKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7CisgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOworICAgIGluZGVudChvdXQpIDw8ICJ0bXBNYXAucHV0KF9GaWVsZHMuIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkX25hbWUpCisgICAgICAgICAgICAgICAgPDwgIiwgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhKFwiIiA8PCBmaWVsZF9uYW1lIDw8ICJcIiwgIjsKKworICAgIC8vIFNldCBmaWVsZCByZXF1aXJlbWVudCB0eXBlIChyZXF1aXJlZCwgb3B0aW9uYWwsIGV0Yy4pCisgICAgaWYgKGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgb3V0IDw8ICJvcmcuYXBhY2hlLnRocmlmdC5URmllbGRSZXF1aXJlbWVudFR5cGUuUkVRVUlSRUQsICI7CisgICAgfSBlbHNlIGlmIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKKyAgICAgIG91dCA8PCAib3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLk9QVElPTkFMLCAiOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZFJlcXVpcmVtZW50VHlwZS5ERUZBVUxULCAiOworICAgIH0KKworICAgIC8vIENyZWF0ZSB2YWx1ZSBtZXRhIGRhdGEKKyAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCBmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgb3V0IDw8ICIpKTsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAibWV0YURhdGFNYXAgPSBqYXZhLnV0aWwuQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKHRtcE1hcCk7IiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YS5hZGRTdHJ1Y3RNZXRhRGF0YU1hcCgiCisgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiLmNsYXNzLCBtZXRhRGF0YU1hcCk7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIFJldHVybnMgYSBzdHJpbmcgd2l0aCB0aGUgamF2YSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gdGhyaWZ0IHR5cGUKKyAqIChlLmcuIGZvciB0aGUgdHlwZSBzdHJ1Y3QgaXQgcmV0dXJucyAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNUIikKKyAqLworc3RkOjpzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6Z2V0X2phdmFfdHlwZV9zdHJpbmcodF90eXBlKiB0eXBlKSB7CisgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkxJU1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5NQVAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TRVQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5FTlVNIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICByZXR1cm4gZ2V0X2phdmFfdHlwZV9zdHJpbmcoKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHN3aXRjaCAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCkpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlZPSUQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkJPT0wiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuQllURSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTE2IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JMzIiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkk2NCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuRE9VQkxFIjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIlVua25vd24gdGhyaWZ0IHR5cGUgXCIiICsgdHlwZS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiIHBhc3NlZCB0byB0X2phdmFfZ2VuZXJhdG9yOjpnZXRfamF2YV90eXBlX3N0cmluZyEiKTsKKyAgICAgIHJldHVybiAiVW5rbm93biB0aHJpZnQgdHlwZSBcIiIgKyB0eXBlLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgKyAiXCIgcGFzc2VkIHRvIHRfamF2YV9nZW5lcmF0b3I6OmdldF9qYXZhX3R5cGVfc3RyaW5nISI7CisgICAgICBicmVhazsgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIlVua25vd24gdGhyaWZ0IHR5cGUgXCIiICsgdHlwZS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJcIiBwYXNzZWQgdG8gdF9qYXZhX2dlbmVyYXRvcjo6Z2V0X2phdmFfdHlwZV9zdHJpbmchIik7CisgICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIQorICB9Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUpIHsKKyAgb3V0IDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnRfdXAoKTsKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAibmV3ICIKKyAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLlN0cnVjdE1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLiIKKyAgICAgICAgICAgICAgICAgICAiU1RSVUNULCAiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiLmNsYXNzIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGluZGVudChvdXQpCisgICAgICAgICAgPDwgIm5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuTGlzdE1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkxJU1QsICI7CisgICAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgZWxlbV90eXBlKTsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgICBpbmRlbnQob3V0KQorICAgICAgICAgIDw8ICJuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLlNldE1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNFVCwgIjsKKyAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGVsZW1fdHlwZSk7CisgICAgfSBlbHNlIHsgLy8gbWFwCisgICAgICBpbmRlbnQob3V0KQorICAgICAgICAgIDw8ICJuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLk1hcE1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLk1BUCwgIjsKKyAgICAgIHRfdHlwZSoga2V5X3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgICB0X3R5cGUqIHZhbF90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwga2V5X3R5cGUpOworICAgICAgb3V0IDw8ICIsICI7CisgICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCB2YWxfdHlwZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIGluZGVudChvdXQpCisgICAgICAgIDw8ICJuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkVudW1NZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5FTlVNLCAiCisgICAgICAgIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiLmNsYXNzIjsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAibmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZFZhbHVlTWV0YURhdGEoIgorICAgICAgICAgICAgICAgIDw8IGdldF9qYXZhX3R5cGVfc3RyaW5nKHR5cGUpOworICAgIGlmICh0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICIsIFwiIiA8PCAoKHRfdHlwZWRlZiopdHlwZSktPmdldF9zeW1ib2xpYygpIDw8ICJcIiI7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIiwgdHJ1ZSI7CisgICAgfQorICB9CisgIG91dCA8PCAiKSI7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudF9kb3duKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuIEluIEMrKywgdGhpcyBjb21wcmlzZXMgYW4gZW50aXJlbHkgc2VwYXJhdGUKKyAqIGhlYWRlciBhbmQgc291cmNlIGZpbGUuIFRoZSBoZWFkZXIgZmlsZSBkZWZpbmVzIHRoZSBtZXRob2RzIGFuZCBpbmNsdWRlcworICogdGhlIGRhdGEgdHlwZXMgZGVmaW5lZCBpbiB0aGUgbWFpbiBoZWFkZXIgZmlsZSwgYW5kIHRoZSBpbXBsZW1lbnRhdGlvbgorICogZmlsZSBjb250YWlucyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGJhc2ljIHByaW50ZXIgYW5kIGRlZmF1bHQgaW50ZXJmYWNlcy4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICAvLyBNYWtlIG91dHB1dCBmaWxlCisgIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIG1ha2VfdmFsaWRfamF2YV9maWxlbmFtZShzZXJ2aWNlX25hbWVfKSArICIuamF2YSI7CisgIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKKworICBmX3NlcnZpY2VfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGphdmFfcGFja2FnZSgpIDw8IGphdmFfc3VwcHJlc3Npb25zKCk7CisKKyAgaWYgKCFzdXBwcmVzc19nZW5lcmF0ZWRfYW5ub3RhdGlvbnNfKSB7CisgICAgZ2VuZXJhdGVfamF2YXhfZ2VuZXJhdGVkX2Fubm90YXRpb24oZl9zZXJ2aWNlXyk7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCAicHVibGljIGNsYXNzICIgPDwgc2VydmljZV9uYW1lXyA8PCAiIHsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHRocmVlIG1haW4gcGFydHMgb2YgdGhlIHNlcnZpY2UKKyAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2FzeW5jX2ludGVyZmFjZSh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9hc3luY19jbGllbnQodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfYXN5bmNfc2VydmVyKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKKworICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsOworICBmX3NlcnZpY2VfLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX2lmYWNlID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgZXh0ZW5kc19pZmFjZSA9ICIgZXh0ZW5kcyAiICsgZXh0ZW5kcyArICIuSWZhY2UiOworICB9CisKKyAgZ2VuZXJhdGVfamF2YV9kb2MoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgaW50ZXJmYWNlIElmYWNlIiA8PCBleHRlbmRzX2lmYWNlIDw8ICIgeyIgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfamF2YV9kb2MoZl9zZXJ2aWNlXywgKmZfaXRlcik7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9hc3luY19pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19pZmFjZSA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGV4dGVuZHNfaWZhY2UgPSAiIGV4dGVuZHMgIiArIGV4dGVuZHMgKyAiIC5Bc3luY0lmYWNlIjsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInB1YmxpYyBpbnRlcmZhY2UgQXN5bmNJZmFjZSIgPDwgZXh0ZW5kc19pZmFjZSA8PCAiIHsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jKCpmX2l0ZXIsIHRydWUpCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBzdHJ1Y3RzIGZvciBhbGwgdGhlIHNlcnZpY2UgYXJncyBhbmQgcmV0dXJuIHR5cGVzCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIGdlbmVyYXRlX2phdmFfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgdHMsIGZhbHNlLCB0cnVlKTsKKyAgICBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSA9PSBOVUxMKSB7CisgICAgZXh0ZW5kc19jbGllbnQgPSAib3JnLmFwYWNoZS50aHJpZnQuVFNlcnZpY2VDbGllbnQiOworICB9IGVsc2UgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGV4dGVuZHNfY2xpZW50ID0gZXh0ZW5kcyArICIuQ2xpZW50IjsKKyAgfQorCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIHN0YXRpYyBjbGFzcyBDbGllbnQgZXh0ZW5kcyAiIDw8IGV4dGVuZHNfY2xpZW50CisgICAgICAgICAgICAgICAgICAgICA8PCAiIGltcGxlbWVudHMgSWZhY2UgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KGZfc2VydmljZV8pCisgICAgICA8PCAicHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5IGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVFNlcnZpY2VDbGllbnRGYWN0b3J5PENsaWVudD4geyIKKyAgICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBGYWN0b3J5KCkge30iIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIENsaWVudCBnZXRDbGllbnQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3QpIHsiCisgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gbmV3IENsaWVudChwcm90KTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgQ2xpZW50IGdldENsaWVudChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaXByb3QsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgb3Byb3QpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiBuZXcgQ2xpZW50KGlwcm90LCBvcHJvdCk7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIENsaWVudChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgcHJvdCkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInN1cGVyKHByb3QsIHByb3QpOyIgPDwgZW5kbDsKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIENsaWVudChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaXByb3QsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgb3Byb3QpIHsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBzdXBlcihpcHJvdCwgb3Byb3QpOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgc3RyaW5nIHNlcCA9ICJfIjsKKyAgICBzdHJpbmcgamF2YW5hbWUgPSBmdW5uYW1lOworICAgIGlmIChmdWxsY2FtZWxfc3R5bGVfKSB7CisgICAgICBzZXAgPSAiIjsKKyAgICAgIGphdmFuYW1lID0gYXNfY2FtZWxfY2FzZShmdW5uYW1lKTsKKyAgICB9CisKKyAgICAvLyBPcGVuIGZ1bmN0aW9uCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInNlbmQiIDw8IHNlcCA8PCBqYXZhbmFtZSA8PCAiKCI7CisKKyAgICAvLyBHZXQgdGhlIHN0cnVjdCBvZiBmdW5jdGlvbiBjYWxsIHBhcmFtcworICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworCisgICAgLy8gRGVjbGFyZSB0aGUgZnVuY3Rpb24gYXJndW1lbnRzCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAicmV0dXJuICI7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8ICJyZWN2IiA8PCBzZXAgPDwgamF2YW5hbWUgPDwgIigpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgICB0X2Z1bmN0aW9uIHNlbmRfZnVuY3Rpb24oZ190eXBlX3ZvaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygic2VuZCIpICsgc2VwICsgamF2YW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSk7CisKKyAgICBzdHJpbmcgYXJnc25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiOworCisgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZzZW5kX2Z1bmN0aW9uKSA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGFyZ3NuYW1lIDw8ICIgYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJhcmdzLnNldCIgPDwgZ2V0X2NhcF9uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgY29uc3Qgc3RyaW5nIHNlbmRCYXNlTmFtZSA9ICgqZl9pdGVyKS0+aXNfb25ld2F5KCkgPyAic2VuZEJhc2VPbmV3YXkiIDogInNlbmRCYXNlIjsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgc2VuZEJhc2VOYW1lIDw8ICIoXCIiIDw8IGZ1bm5hbWUgPDwgIlwiLCBhcmdzKTsiIDw8IGVuZGw7CisKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgc3RyaW5nIHJlc3VsdG5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7CisKKyAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7CisgICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygicmVjdiIpICsgc2VwICsgamF2YW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKSk7CisgICAgICAvLyBPcGVuIGZ1bmN0aW9uCisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbikgPDwgZW5kbDsKKyAgICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IHJlc3VsdG5hbWUgPDwgIiByZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInJlY2VpdmVCYXNlKHJlc3VsdCwgXCIiIDw8IGZ1bm5hbWUgPDwgIlwiKTsiIDw8IGVuZGw7CisKKyAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgorICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0LiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soInN1Y2Nlc3MiKSA8PCAiKSB7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHJlc3VsdC5zdWNjZXNzOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9IG51bGwpIHsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICB0aHJvdyByZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgLy8gSWYgeW91IGdldCBoZXJlIGl0J3MgYW4gZXhjZXB0aW9uLCB1bmxlc3MgYSB2b2lkIGZ1bmN0aW9uCisgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidGhyb3cgbmV3ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKG9yZy5hcGFjaGUudGhyaWZ0LiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uLk1JU1NJTkdfUkVTVUxULCBcIiIKKyAgICAgICAgICAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0XCIpOyIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfYXN5bmNfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuZHMgPSAib3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuVEFzeW5jQ2xpZW50IjsKKyAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSkgKyAiLkFzeW5jQ2xpZW50IjsKKyAgfQorCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIHN0YXRpYyBjbGFzcyBBc3luY0NsaWVudCBleHRlbmRzICIgPDwgZXh0ZW5kcworICAgICAgICAgICAgICAgICAgICAgPDwgIiBpbXBsZW1lbnRzIEFzeW5jSWZhY2UgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gRmFjdG9yeSBtZXRob2QKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3RvcnkgaW1wbGVtZW50cyAiCisgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuVEFzeW5jQ2xpZW50RmFjdG9yeTxBc3luY0NsaWVudD4geyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHByaXZhdGUgb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuVEFzeW5jQ2xpZW50TWFuYWdlciBjbGllbnRNYW5hZ2VyOyIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBwcml2YXRlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5OyIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBwdWJsaWMgRmFjdG9yeShvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5UQXN5bmNDbGllbnRNYW5hZ2VyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJjbGllbnRNYW5hZ2VyLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xGYWN0b3J5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJwcm90b2NvbEZhY3RvcnkpIHsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICAgIHRoaXMuY2xpZW50TWFuYWdlciA9IGNsaWVudE1hbmFnZXI7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgICB0aGlzLnByb3RvY29sRmFjdG9yeSA9IHByb3RvY29sRmFjdG9yeTsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICB9IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgcHVibGljIEFzeW5jQ2xpZW50ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJnZXRBc3luY0NsaWVudChvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE5vbmJsb2NraW5nVHJhbnNwb3J0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc3BvcnQpIHsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICAgIHJldHVybiBuZXcgQXN5bmNDbGllbnQocHJvdG9jb2xGYWN0b3J5LCBjbGllbnRNYW5hZ2VyLCB0cmFuc3BvcnQpOyIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICB9IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBBc3luY0NsaWVudChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xGYWN0b3J5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJwcm90b2NvbEZhY3RvcnksIG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLlRBc3luY0NsaWVudE1hbmFnZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgImNsaWVudE1hbmFnZXIsIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTm9uYmxvY2tpbmdUcmFuc3BvcnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgInRyYW5zcG9ydCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHN1cGVyKHByb3RvY29sRmFjdG9yeSwgY2xpZW50TWFuYWdlciwgdHJhbnNwb3J0KTsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIHN0cmluZyBzZXAgPSAiXyI7CisgICAgc3RyaW5nIGphdmFuYW1lID0gZnVubmFtZTsKKyAgICBpZiAoZnVsbGNhbWVsX3N0eWxlXykgeworICAgICAgc2VwID0gIiI7CisgICAgICBqYXZhbmFtZSA9IGFzX2NhbWVsX2Nhc2UoamF2YW5hbWUpOworICAgIH0KKyAgICB0X3R5cGUqIHJldF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpOworICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIHN0cmluZyBmdW5jbGFzc25hbWUgPSBmdW5uYW1lICsgIl9jYWxsIjsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisgICAgc3RyaW5nIGFyZ3NfbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfYXJncyI7CisgICAgc3RyaW5nIHJlc3VsdF9uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOworCisgICAgLy8gTWFpbiBtZXRob2QgYm9keQorICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jKCpmX2l0ZXIsIGZhbHNlKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIGNoZWNrUmVhZHkoKTsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgICIgPDwgZnVuY2xhc3NuYW1lIDw8ICIgbWV0aG9kX2NhbGwgPSBuZXcgIiArIGZ1bmNsYXNzbmFtZSArICIoIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBhc3luY19hcmd1bWVudF9saXN0KCpmX2l0ZXIsIGFyZ19zdHJ1Y3QsIHJldF90eXBlKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCB0aGlzLCBfX19wcm90b2NvbEZhY3RvcnksIF9fX3RyYW5zcG9ydCk7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICB0aGlzLl9fX2N1cnJlbnRNZXRob2QgPSBtZXRob2RfY2FsbDsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIF9fX21hbmFnZXIuY2FsbChtZXRob2RfY2FsbCk7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKKworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAgIC8vIFRBc3luY01ldGhvZCBvYmplY3QgZm9yIHRoaXMgZnVuY3Rpb24gY2FsbAorICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIHN0YXRpYyBjbGFzcyAiICsgZnVuY2xhc3NuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBleHRlbmRzIG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLlRBc3luY01ldGhvZENhbGw8IgorICAgICAgICAgICAgICAgICAgICAgICAgICArIHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksIHRydWUpICsgIj4geyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIC8vIE1lbWJlciB2YXJpYWJsZXMKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcml2YXRlICIgKyB0eXBlX25hbWUoKCpmbGRfaXRlciktPmdldF90eXBlKCkpICsgIiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSArICI7IiA8PCBlbmRsOworICAgIH0KKworICAgIC8vIE5PVEUgc2luY2Ugd2UgdXNlIGEgbmV3IENsaWVudCBpbnN0YW5jZSB0byBkZXNlcmlhbGl6ZSwgbGV0J3Mga2VlcCBzZXFpZCB0byAwIGZvciBub3cKKyAgICAvLyBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByaXZhdGUgaW50IHNlcWlkOyIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gQ29uc3RydWN0b3IKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiICsgZnVuY2xhc3NuYW1lICsgIigiCisgICAgICAgICAgICAgICAgICAgICAgICAgICsgYXN5bmNfYXJndW1lbnRfbGlzdCgqZl9pdGVyLCBhcmdfc3RydWN0LCByZXRfdHlwZSwgdHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuVEFzeW5jQ2xpZW50IGNsaWVudCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnksICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTm9uYmxvY2tpbmdUcmFuc3BvcnQgdHJhbnNwb3J0KSB0aHJvd3MgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBzdXBlcihjbGllbnQsIHByb3RvY29sRmFjdG9yeSwgdHJhbnNwb3J0LCByZXN1bHRIYW5kbGVyLCAiCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICgoKmZfaXRlciktPmlzX29uZXdheSgpID8gInRydWUiIDogImZhbHNlIikgPDwgIik7IiA8PCBlbmRsOworCisgICAgLy8gQXNzaWduIG1lbWJlciB2YXJpYWJsZXMKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHRoaXMuIiArICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpICsgIiA9ICIgKyAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyB2b2lkIHdyaXRlX2FyZ3Mob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3QpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICAvLyBTZXJpYWxpemUgcmVxdWVzdAorICAgIC8vIE5PVEUgd2UgYXJlIGxlYXZpbmcgc2VxaWQgYXMgMCwgZm9yIG5vdyAoc2VlIGFib3ZlKQorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInByb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlKFwiIgorICAgICAgICAgICAgICAgPDwgZnVubmFtZSA8PCAiXCIsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLiIKKyAgICAgICAgICAgICAgIDw8ICgoKmZfaXRlciktPmlzX29uZXdheSgpID8gIlRNZXNzYWdlVHlwZS5PTkVXQVkiIDogIlRNZXNzYWdlVHlwZS5DQUxMIikgPDwgIiwgMCkpOyIKKyAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgYXJnc19uYW1lIDw8ICIgYXJncyA9IG5ldyAiIDw8IGFyZ3NfbmFtZSA8PCAiKCk7IiA8PCBlbmRsOworCisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3Muc2V0IiA8PCBnZXRfY2FwX25hbWUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpIDw8ICIoIgorICAgICAgICAgICAgICAgICA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncy53cml0ZShwcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInByb3Qud3JpdGVNZXNzYWdlRW5kKCk7IgorICAgICAgICAgICAgICAgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAvLyBSZXR1cm4gbWV0aG9kCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiArIHR5cGVfbmFtZShyZXRfdHlwZSwgdHJ1ZSkgKyAiIGdldFJlc3VsdCgpIHRocm93cyAiOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpICsgIiwgIjsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAib3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworCisgICAgaW5kZW50X3VwKCk7CisgICAgZl9zZXJ2aWNlXworICAgICAgICA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiaWYgKGdldFN0YXRlKCkgIT0gb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuVEFzeW5jTWV0aG9kQ2FsbC5TdGF0ZS5SRVNQT05TRV9SRUFEKSB7IgorICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHRocm93IG5ldyBqYXZhLmxhbmcuSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFwiTWV0aG9kIGNhbGwgbm90IGZpbmlzaGVkIVwiKTsiCisgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTWVtb3J5SW5wdXRUcmFuc3BvcnQgbWVtb3J5VHJhbnNwb3J0ID0gbmV3ICIKKyAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTWVtb3J5SW5wdXRUcmFuc3BvcnQoZ2V0RnJhbWVCdWZmZXIoKS5hcnJheSgpKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBwcm90ID0gIgorICAgICAgICAgICAgICAgICAgICAgICAiY2xpZW50LmdldFByb3RvY29sRmFjdG9yeSgpLmdldFByb3RvY29sKG1lbW9yeVRyYW5zcG9ydCk7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKTsKKyAgICBpZiAocmV0X3R5cGUtPmlzX3ZvaWQoKSkgeyAvLyBOQjogSW5jbHVkZXMgb25ld2F5cyB3aGljaCBhbHdheXMgcmV0dXJuIHZvaWQuCisgICAgICBmX3NlcnZpY2VfIDw8ICJyZXR1cm4gbnVsbDsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgInJldHVybiAobmV3IENsaWVudChwcm90KSkucmVjdiIgKyBzZXAgKyBqYXZhbmFtZSArICIoKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKKworICAgIC8vIENsb3NlIGNsYXNzCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIC8vIENsb3NlIEFzeW5jQ2xpZW50CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBFeHRlbmRzIHN0dWZmCisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgPT0gTlVMTCkgeworICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gIm9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlUHJvY2Vzc29yPEk+IjsKKyAgfSBlbHNlIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBleHRlbmRzX3Byb2Nlc3NvciA9IGV4dGVuZHMgKyAiLlByb2Nlc3NvcjxJPiI7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgc3RhdGljIGNsYXNzIFByb2Nlc3NvcjxJIGV4dGVuZHMgSWZhY2U+IGV4dGVuZHMgIgorICAgICAgICAgICAgICAgICAgICAgPDwgZXh0ZW5kc19wcm9jZXNzb3IgPDwgIiBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRQcm9jZXNzb3IgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KGZfc2VydmljZV8pCisgICAgICA8PCAicHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLnNsZjRqLkxvZ2dlciBfTE9HR0VSID0gb3JnLnNsZjRqLkxvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFByb2Nlc3Nvci5jbGFzcy5nZXROYW1lKCkpOyIKKyAgICAgIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgUHJvY2Vzc29yKEkgaWZhY2UpIHsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBzdXBlcihpZmFjZSwgZ2V0UHJvY2Vzc01hcChuZXcgamF2YS51dGlsLkhhc2hNYXA8amF2YS5sYW5nLlN0cmluZywgIgorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LlByb2Nlc3NGdW5jdGlvbjxJLCA/IGV4dGVuZHMgIgorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlPj4oKSkpOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm90ZWN0ZWQgUHJvY2Vzc29yKEkgaWZhY2UsIGphdmEudXRpbC5NYXA8amF2YS5sYW5nLlN0cmluZywgIgorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LlByb2Nlc3NGdW5jdGlvbjxJLCA/IGV4dGVuZHMgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2U+PiAiCisgICAgICAgICAgICAgICAgICAgICAgICAicHJvY2Vzc01hcCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHN1cGVyKGlmYWNlLCBnZXRQcm9jZXNzTWFwKHByb2Nlc3NNYXApKTsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJpdmF0ZSBzdGF0aWMgPEkgZXh0ZW5kcyBJZmFjZT4gamF2YS51dGlsLk1hcDxqYXZhLmxhbmcuU3RyaW5nLCAgIgorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LlByb2Nlc3NGdW5jdGlvbjxJLCA/IGV4dGVuZHMgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2U+PiAiCisgICAgICAgICAgICAgICAgICAgICAgICAiZ2V0UHJvY2Vzc01hcChqYXZhLnV0aWwuTWFwPGphdmEubGFuZy5TdHJpbmcsIG9yZy5hcGFjaGUudGhyaWZ0LlByb2Nlc3NGdW5jdGlvbjxJLCA/IGV4dGVuZHMgIgorICAgICAgICAgICAgICAgICAgICAgICAgIiBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZT4+IHByb2Nlc3NNYXApIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJvY2Vzc01hcC5wdXQoXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsIG5ldyAiCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCkpOyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiBwcm9jZXNzTWFwOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9hc3luY19zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBFeHRlbmRzIHN0dWZmCisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgPT0gTlVMTCkgeworICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gIm9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlQXN5bmNQcm9jZXNzb3I8ST4iOworICB9IGVsc2UgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gZXh0ZW5kcyArICIuQXN5bmNQcm9jZXNzb3I8ST4iOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIHN0YXRpYyBjbGFzcyBBc3luY1Byb2Nlc3NvcjxJIGV4dGVuZHMgQXN5bmNJZmFjZT4gZXh0ZW5kcyAiCisgICAgICAgICAgICAgICAgICAgICA8PCBleHRlbmRzX3Byb2Nlc3NvciA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLnNsZjRqLkxvZ2dlciBfTE9HR0VSID0gIgorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5LmdldExvZ2dlcihBc3luY1Byb2Nlc3Nvci5jbGFzcy5nZXROYW1lKCkpOyIgPDwgZW5kbDsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBBc3luY1Byb2Nlc3NvcihJIGlmYWNlKSB7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgc3VwZXIoaWZhY2UsIGdldFByb2Nlc3NNYXAobmV3IGphdmEudXRpbC5IYXNoTWFwPGphdmEubGFuZy5TdHJpbmcsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5Bc3luY1Byb2Nlc3NGdW5jdGlvbjxJLCA/IGV4dGVuZHMgIgorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlLCA/Pj4oKSkpOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm90ZWN0ZWQgQXN5bmNQcm9jZXNzb3IoSSBpZmFjZSwgamF2YS51dGlsLk1hcDxqYXZhLmxhbmcuU3RyaW5nLCAgIgorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LkFzeW5jUHJvY2Vzc0Z1bmN0aW9uPEksID8gZXh0ZW5kcyAgIgorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlLCA/Pj4gcHJvY2Vzc01hcCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHN1cGVyKGlmYWNlLCBnZXRQcm9jZXNzTWFwKHByb2Nlc3NNYXApKTsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJpdmF0ZSBzdGF0aWMgPEkgZXh0ZW5kcyBBc3luY0lmYWNlPiBqYXZhLnV0aWwuTWFwPGphdmEubGFuZy5TdHJpbmcsICAiCisgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQuQXN5bmNQcm9jZXNzRnVuY3Rpb248SSwgPyBleHRlbmRzICAiCisgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQuVEJhc2UsPz4+IGdldFByb2Nlc3NNYXAoamF2YS51dGlsLk1hcDxqYXZhLmxhbmcuU3RyaW5nLCAgIgorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LkFzeW5jUHJvY2Vzc0Z1bmN0aW9uPEksID8gZXh0ZW5kcyAgIgorICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlLCA/Pj4gcHJvY2Vzc01hcCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm9jZXNzTWFwLnB1dChcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiwgbmV3ICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoKSk7IiA8PCBlbmRsOworICB9CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIHByb2Nlc3NNYXA7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9wcm9jZXNzX2FzeW5jX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOworICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOworICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7CisgIH0KKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOworICB9CisKKyAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCAmcmVzdWx0LCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2FzeW5jX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBzdHJpbmcgYXJnc25hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiOworCisgIHN0cmluZyByZXN1bHRuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIHJlc3VsdG5hbWUgPSAib3JnLmFwYWNoZS50aHJpZnQuVEJhc2UiOworICB9CisKKyAgc3RyaW5nIHJlc3VsdHR5cGUgPSB0eXBlX25hbWUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCB0cnVlKTsKKworICAodm9pZCl0c2VydmljZTsKKyAgLy8gT3BlbiBjbGFzcworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBzdGF0aWMgY2xhc3MgIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgIDw8ICI8SSBleHRlbmRzIEFzeW5jSWZhY2U+IGV4dGVuZHMgb3JnLmFwYWNoZS50aHJpZnQuQXN5bmNQcm9jZXNzRnVuY3Rpb248SSwgIgorICAgICAgICAgICAgICAgICAgICAgPDwgYXJnc25hbWUgPDwgIiwgIiA8PCByZXN1bHR0eXBlIDw8ICI+IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoKSB7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgc3VwZXIoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIpOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCBhcmdzbmFtZSA8PCAiIGdldEVtcHR5QXJnc0luc3RhbmNlKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHJldHVybiBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5Bc3luY01ldGhvZENhbGxiYWNrPCIgPDwgcmVzdWx0dHlwZQorICAgICAgICAgICAgICAgICAgICAgPDwgIj4gZ2V0UmVzdWx0SGFuZGxlcihmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlci5Bc3luY0ZyYW1lQnVmZmVyIGZiLCBmaW5hbCBpbnQgc2VxaWQpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LkFzeW5jUHJvY2Vzc0Z1bmN0aW9uIGZjYWxsID0gdGhpczsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5Bc3luY01ldGhvZENhbGxiYWNrPCIgPDwgcmVzdWx0dHlwZQorICAgICAgICAgICAgICAgICAgICAgPDwgIj4oKSB7ICIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIHZvaWQgb25Db21wbGV0ZSgiIDw8IHJlc3VsdHR5cGUgPDwgIiBvKSB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgcmVzdWx0bmFtZSA8PCAiIHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbDsKKworICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmVzdWx0LnN1Y2Nlc3MgPSBvOyIgPDwgZW5kbDsKKyAgICAgIC8vIFNldCBpc3NldCBvbiBzdWNjZXNzIGZpZWxkCisgICAgICBpZiAoIXR5cGVfY2FuX2JlX251bGwodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSkgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJlc3VsdC5zZXQiIDw8IGdldF9jYXBfbmFtZSgic3VjY2VzcyIpIDw8IGdldF9jYXBfbmFtZSgiaXNTZXQiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIih0cnVlKTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ0cnkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykKKyAgICAgICAgPDwgIiAgZmNhbGwuc2VuZFJlc3BvbnNlKGZiLCByZXN1bHQsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlVHlwZS5SRVBMWSxzZXFpZCk7IgorICAgICAgICA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSBjYXRjaCAob3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb24gZSkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAiX0xPR0dFUi5lcnJvcihcIlRUcmFuc3BvcnRFeGNlcHRpb24gd3JpdGluZyB0byBpbnRlcm5hbCBmcmFtZSBidWZmZXJcIiwgZSk7IgorICAgICAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImZiLmNsb3NlKCk7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IGNhdGNoIChqYXZhLmxhbmcuRXhjZXB0aW9uIGUpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiX0xPR0dFUi5lcnJvcihcIkV4Y2VwdGlvbiB3cml0aW5nIHRvIGludGVybmFsIGZyYW1lIGJ1ZmZlclwiLCBlKTsiCisgICAgICAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib25FcnJvcihlKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIHZvaWQgb25FcnJvcihqYXZhLmxhbmcuRXhjZXB0aW9uIGUpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAoZSBpbnN0YW5jZW9mIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uKSB7IgorICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiX0xPR0dFUi5lcnJvcihcIlRUcmFuc3BvcnRFeGNlcHRpb24gaW5zaWRlIGhhbmRsZXJcIiwgZSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZmIuY2xvc2UoKTsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJfTE9HR0VSLmVycm9yKFwiRXhjZXB0aW9uIGluc2lkZSBvbmV3YXkgaGFuZGxlclwiLCBlKTsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImJ5dGUgbXNnVHlwZSA9IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlVHlwZS5SRVBMWTsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJvcmcuYXBhY2hlLnRocmlmdC5UU2VyaWFsaXphYmxlIG1zZzsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IHJlc3VsdG5hbWUgPDwgIiByZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisKKyAgICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworCisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgaWYgKHhfaXRlciA9PSB4Y2VwdGlvbnMuYmVnaW4oKSkKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICAgICAgICBzdHJpbmcgdHlwZSA9IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIHN0cmluZyBuYW1lID0gKCp4X2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICBmX3NlcnZpY2VfIDw8ICJpZiAoZSBpbnN0YW5jZW9mICIgPDwgdHlwZSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgbmFtZSA8PCAiID0gKCIgPDwgdHlwZSA8PCAiKSBlOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuc2V0IiA8PCBnZXRfY2FwX25hbWUobmFtZSkgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpCisgICAgICAgICAgICAgICAgICAgPDwgIih0cnVlKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAibXNnID0gcmVzdWx0OyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IGVsc2UgIjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8ICJpZiAoZSBpbnN0YW5jZW9mIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIl9MT0dHRVIuZXJyb3IoXCJUVHJhbnNwb3J0RXhjZXB0aW9uIGluc2lkZSBoYW5kbGVyXCIsIGUpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImZiLmNsb3NlKCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSBlbHNlIGlmIChlIGluc3RhbmNlb2Ygb3JnLmFwYWNoZS50aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKSB7IgorICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIl9MT0dHRVIuZXJyb3IoXCJUQXBwbGljYXRpb25FeGNlcHRpb24gaW5zaWRlIGhhbmRsZXJcIiwgZSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAibXNnVHlwZSA9IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlVHlwZS5FWENFUFRJT047IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAibXNnID0gKG9yZy5hcGFjaGUudGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbillOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiX0xPR0dFUi5lcnJvcihcIkV4Y2VwdGlvbiBpbnNpZGUgaGFuZGxlclwiLCBlKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJtc2dUeXBlID0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTjsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJtc2cgPSBuZXcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbihvcmcuYXBhY2hlLnRocmlmdC4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uLklOVEVSTkFMX0VSUk9SLCBlLmdldE1lc3NhZ2UoKSk7IgorICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0cnkgeyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgZmNhbGwuc2VuZFJlc3BvbnNlKGZiLG1zZyxtc2dUeXBlLHNlcWlkKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IGNhdGNoIChqYXZhLmxhbmcuRXhjZXB0aW9uIGV4KSB7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICBfTE9HR0VSLmVycm9yKFwiRXhjZXB0aW9uIHdyaXRpbmcgdG8gaW50ZXJuYWwgZnJhbWUgYnVmZmVyXCIsIGV4KTsiCisgICAgICAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICBmYi5jbG9zZSgpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn07IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByb3RlY3RlZCBib29sZWFuIGlzT25ld2F5KCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHJldHVybiAiIDw8ICgodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgPyAidHJ1ZSIgOiAiZmFsc2UiKSA8PCAiOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgdm9pZCBzdGFydChJIGlmYWNlLCAiIDw8IGFyZ3NuYW1lCisgICAgICAgICAgICAgICAgICAgICA8PCAiIGFyZ3MsIG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLkFzeW5jTWV0aG9kQ2FsbGJhY2s8IiA8PCByZXN1bHR0eXBlCisgICAgICAgICAgICAgICAgICAgICA8PCAiPiByZXN1bHRIYW5kbGVyKSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAorICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CisKKyAgZl9zZXJ2aWNlXyA8PCAiaWZhY2UuIiA8PCBnZXRfcnBjX21ldGhvZF9uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgPDwgIigiOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgfQorICBpZiAoIWZpcnN0KQorICAgIGZfc2VydmljZV8gPDwgIiwiOworICBmX3NlcnZpY2VfIDw8ICJyZXN1bHRIYW5kbGVyIjsKKyAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IjsKKworICAvLyBDbG9zZSBmdW5jdGlvbgorICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gQ2xvc2UgY2xhc3MKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgc3RyaW5nIGFyZ3NuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKKyAgc3RyaW5nIHJlc3VsdG5hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7CisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgcmVzdWx0bmFtZSA9ICJvcmcuYXBhY2hlLnRocmlmdC5UQmFzZSI7CisgIH0KKworICAodm9pZCl0c2VydmljZTsKKyAgLy8gT3BlbiBjbGFzcworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBzdGF0aWMgY2xhc3MgIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgIDw8ICI8SSBleHRlbmRzIElmYWNlPiBleHRlbmRzIG9yZy5hcGFjaGUudGhyaWZ0LlByb2Nlc3NGdW5jdGlvbjxJLCAiCisgICAgICAgICAgICAgICAgICAgICA8PCBhcmdzbmFtZSA8PCAiPiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHN1cGVyKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiKTsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgYXJnc25hbWUgPDwgIiBnZXRFbXB0eUFyZ3NJbnN0YW5jZSgpIHsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICByZXR1cm4gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm90ZWN0ZWQgYm9vbGVhbiBpc09uZXdheSgpIHsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICByZXR1cm4gIiA8PCAoKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpID8gInRydWUiIDogImZhbHNlIikgPDwgIjsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByb3RlY3RlZCBib29sZWFuIHJldGhyb3dVbmhhbmRsZWRFeGNlcHRpb25zKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHJldHVybiAiIDw8ICgocmV0aHJvd191bmhhbmRsZWRfZXhjZXB0aW9uc18pID8gInRydWUiIDogImZhbHNlIikgPDwgIjsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgcmVzdWx0bmFtZSA8PCAiIGdldFJlc3VsdChJIGlmYWNlLCAiIDw8IGFyZ3NuYW1lCisgICAgICAgICAgICAgICAgICAgICA8PCAiIGFyZ3MpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgcmVzdWx0bmFtZSA8PCAiIHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbDsKKyAgfQorCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisKKyAgLy8gVHJ5IGJsb2NrIGZvciBhIGZ1bmN0aW9uIHdpdGggZXhjZXB0aW9ucworICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0cnkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCisgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAicmVzdWx0LnN1Y2Nlc3MgPSAiOworICB9CisgIGZfc2VydmljZV8gPDwgImlmYWNlLiIgPDwgZ2V0X3JwY19tZXRob2RfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpIDw8ICIoIjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7CisKKyAgLy8gU2V0IGlzc2V0IG9uIHN1Y2Nlc3MgZmllbGQKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKQorICAgICAgJiYgIXR5cGVfY2FuX2JlX251bGwodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSkgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmVzdWx0LnNldCIgPDwgZ2V0X2NhcF9uYW1lKCJzdWNjZXNzIikgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIodHJ1ZSk7IiA8PCBlbmRsOworICB9CisKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmIHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IjsKKyAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiIGNhdGNoICgiIDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSkgPDwgIiAiCisgICAgICAgICAgICAgICAgIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICAgICA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAifSI7CisgICAgICB9CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgfQorCisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gbnVsbDsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gcmVzdWx0OyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iOworCisgIC8vIENsb3NlIGZ1bmN0aW9uCisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAvLyBDbG9zZSBjbGFzcworICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCisgKgorICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQKKyAqIEBwYXJhbSBwcmVmaXggVGhlIHZhcmlhYmxlIG5hbWUgb3IgY29udGFpbmVyIGZvciB0aGlzIGZpZWxkCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhKSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lLCBoYXNfbWV0YWRhdGEpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gaXByb3QuIjsKKworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgb3V0IDw8ICJyZWFkQmluYXJ5KCk7IjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCAicmVhZFN0cmluZygpOyI7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBvdXQgPDwgInJlYWRCb29sKCk7IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBvdXQgPDwgInJlYWRCeXRlKCk7IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgb3V0IDw8ICJyZWFkSTE2KCk7IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgb3V0IDw8ICJyZWFkSTMyKCk7IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgb3V0IDw8ICJyZWFkSTY0KCk7IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgb3V0IDw8ICJyZWFkRG91YmxlKCk7IjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEphdmEgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIgPSAiCisgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCB0cnVlKQorICAgICAgICAgICAgICAgICAgICsgIi5maW5kQnlWYWx1ZShpcHJvdC5yZWFkSTMyKCkpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhbiB1bnNlcmlhbGl6ZXIgZm9yIGEgc3RydWN0LCBpbnZva2VzIHJlYWQoKQorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKworICBpZiAocmV1c2Vfb2JqZWN0c18pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgcHJlZml4IDw8ICIgPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgfQorICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKCk7IiA8PCBlbmRsOworICBpZiAocmV1c2Vfb2JqZWN0c18pIHsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICB9CisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLnJlYWQoaXByb3QpOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBjb250YWluZXIgYnkgcmVhZGluZyBpdHMgc2l6ZSBhbmQgdGhlbiBpdGVyYXRpbmcKKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSkgeworCisgIHNjb3BlX3VwKG91dCk7CisKKyAgc3RyaW5nIG9iajsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgb2JqID0gdG1wKCJfbWFwIik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgb2JqID0gdG1wKCJfc2V0Iik7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIG9iaiA9IHRtcCgiX2xpc3QiKTsKKyAgfQorCisgIGlmIChoYXNfbWV0YWRhdGEpIHsKKyAgICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKKyAgICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCAiIDw8IG9iaiA8PCAiID0gaXByb3QucmVhZE1hcEJlZ2luKCk7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTZXQgIiA8PCBvYmogPDwgIiA9IGlwcm90LnJlYWRTZXRCZWdpbigpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVExpc3QgIiA8PCBvYmogPDwgIiA9IGlwcm90LnJlYWRMaXN0QmVnaW4oKTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKKyAgICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCAiIDw8IG9iagorICAgICAgICAgICAgICAgICAgPDwgIiA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKCIKKyAgICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgPDwgImlwcm90LnJlYWRJMzIoKSk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFNldCAiIDw8IG9iagorICAgICAgICAgICAgICAgICAgPDwgIiA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU2V0KCIKKyAgICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgaXByb3QucmVhZEkzMigpKTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRMaXN0ICIgPDwgb2JqCisgICAgICAgICAgICAgICAgICA8PCAiID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRMaXN0KCIKKyAgICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsIGlwcm90LnJlYWRJMzIoKSk7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpZiAocmV1c2Vfb2JqZWN0c18pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgcHJlZml4IDw8ICIgPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgfQorCisgIGlmIChpc19lbnVtX3NldCh0dHlwZSkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSAiIDw8IHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUsIHRydWUpIDw8ICIubm9uZU9mIjsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKTsKKyAgfQorCisgIC8vIGNvbnN0cnVjdCB0aGUgY29sbGVjdGlvbiBjb3JyZWN0bHkgaS5lLiB3aXRoIGFwcHJvcHJpYXRlIHNpemUvdHlwZQorICBpZiAoaXNfZW51bV9zZXQodHR5cGUpIHx8IGlzX2VudW1fbWFwKHR0eXBlKSkgeworICAgIG91dCA8PCAiKCIgPDwgaW5uZXJfZW51bV90eXBlX25hbWUodHR5cGUpIDw8ICIpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmIChzb3J0ZWRfY29udGFpbmVyc18gJiYgKHR0eXBlLT5pc19tYXAoKSB8fCB0dHlwZS0+aXNfc2V0KCkpKSB7CisgICAgLy8gVHJlZVNldCBhbmQgVHJlZU1hcCBkb24ndCBoYXZlIGFueSBjb25zdHJ1Y3RvciB3aGljaCB0YWtlcyBhIGNhcGFjaXR5IGFzIGFuIGFyZ3VtZW50CisgICAgb3V0IDw8ICIoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8ICIoIiA8PCAodHR5cGUtPmlzX2xpc3QoKSA/ICIiIDogIjIqIikgPDwgb2JqIDw8ICIuc2l6ZSIKKyAgICAgICAgPDwgIik7IiA8PCBlbmRsOworICB9CisKKyAgaWYgKHJldXNlX29iamVjdHNfKSB7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCwgb2JqLCBoYXNfbWV0YWRhdGEpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgcHJlZml4LCBvYmosIGhhc19tZXRhZGF0YSk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgsIG9iaiwgaGFzX21ldGFkYXRhKTsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpZiAoaGFzX21ldGFkYXRhKSB7CisgICAgLy8gUmVhZCBjb250YWluZXIgZW5kCisgICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRNYXBFbmQoKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkU2V0RW5kKCk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRMaXN0RW5kKCk7IiA8PCBlbmRsOworICAgIH0KKyAgfQorICBzY29wZV9kb3duKG91dCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSkgeworICBzdHJpbmcga2V5ID0gdG1wKCJfa2V5Iik7CisgIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKKyAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOworICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7CisKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmtleSwgcmV1c2Vfb2JqZWN0c18sIGZhbHNlKSA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmdmFsLCByZXVzZV9vYmplY3RzXywgZmFsc2UpIDw8IGVuZGw7CisKKyAgLy8gRm9yIGxvb3AgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cworICBzdHJpbmcgaSA9IHRtcCgiX2kiKTsKKyAgaW5kZW50KG91dCkgPDwgImZvciAoaW50ICIgPDwgaSA8PCAiID0gMDsgIiA8PCBpIDw8ICIgPCAiIDw8IG9iaiA8PCAiLnNpemUiCisgICAgICAgICAgICAgIDw8ICI7ICIKKyAgICAgICAgICAgICAgPDwgIisrIiA8PCBpIDw8ICIpIiA8PCBlbmRsOworCisgIHNjb3BlX3VwKG91dCk7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSwgIiIsIGhhc19tZXRhZGF0YSk7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwsICIiLCBoYXNfbWV0YWRhdGEpOworCisgIGlmIChnZXRfdHJ1ZV90eXBlKGZrZXkuZ2V0X3R5cGUoKSktPmlzX2VudW0oKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBrZXkgPDwgIiAhPSBudWxsKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIucHV0KCIgPDwga2V5IDw8ICIsICIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKKworICBpZiAoZ2V0X3RydWVfdHlwZShma2V5LmdldF90eXBlKCkpLT5pc19lbnVtKCkpIHsKKyAgICBzY29wZV9kb3duKG91dCk7CisgIH0KKworICBpZiAocmV1c2Vfb2JqZWN0c18gJiYgIWdldF90cnVlX3R5cGUoZmtleS5nZXRfdHlwZSgpKS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCBrZXkgPDwgIiA9IG51bGw7IiA8PCBlbmRsOworICB9CisKKyAgaWYgKHJldXNlX29iamVjdHNfICYmICFnZXRfdHJ1ZV90eXBlKGZ2YWwuZ2V0X3R5cGUoKSktPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgdmFsIDw8ICIgPSBudWxsOyIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIHNldCBlbGVtZW50CisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgIHRfZmllbGQgZmVsZW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmZWxlbSwgcmV1c2Vfb2JqZWN0c18sIGZhbHNlKSA8PCBlbmRsOworCisgIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKKyAgc3RyaW5nIGkgPSB0bXAoIl9pIik7CisgIGluZGVudChvdXQpIDw8ICJmb3IgKGludCAiIDw8IGkgPDwgIiA9IDA7ICIgPDwgaSA8PCAiIDwgIiA8PCBvYmogPDwgIi5zaXplIgorICAgICAgICAgICAgICA8PCAiOyAiCisgICAgICAgICAgICAgIDw8ICIrKyIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSwgIiIsIGhhc19tZXRhZGF0YSk7CisKKyAgaWYgKGdldF90cnVlX3R5cGUoZmVsZW0uZ2V0X3R5cGUoKSktPmlzX2VudW0oKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBlbGVtIDw8ICIgIT0gbnVsbCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgfQorCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLmFkZCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOworCisgIGlmIChnZXRfdHJ1ZV90eXBlKGZlbGVtLmdldF90eXBlKCkpLT5pc19lbnVtKCkpIHsKKyAgICBzY29wZV9kb3duKG91dCk7CisgIH0KKworICBpZiAocmV1c2Vfb2JqZWN0c18gJiYgIWdldF90cnVlX3R5cGUoZmVsZW0uZ2V0X3R5cGUoKSktPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgZWxlbSA8PCAiID0gbnVsbDsiIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBsaXN0IGVsZW1lbnQKKyAqLwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmVsZW0sIHJldXNlX29iamVjdHNfLCBmYWxzZSkgPDwgZW5kbDsKKworICAvLyBGb3IgbG9vcCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCisgIHN0cmluZyBpID0gdG1wKCJfaSIpOworICBpbmRlbnQob3V0KSA8PCAiZm9yIChpbnQgIiA8PCBpIDw8ICIgPSAwOyAiIDw8IGkgPDwgIiA8ICIgPDwgb2JqIDw8ICIuc2l6ZSIKKyAgICAgICAgICAgICAgPDwgIjsgIgorICAgICAgICAgICAgICA8PCAiKysiIDw8IGkgPDwgIikiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0sICIiLCBoYXNfbWV0YWRhdGEpOworCisgIGlmIChnZXRfdHJ1ZV90eXBlKGZlbGVtLmdldF90eXBlKCkpLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZWxlbSA8PCAiICE9IG51bGwpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5hZGQoIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKKworICBpZiAoZ2V0X3RydWVfdHlwZShmZWxlbS5nZXRfdHlwZSgpKS0+aXNfZW51bSgpKSB7CisgICAgc2NvcGVfZG93bihvdXQpOworICB9CisKKyAgaWYgKHJldXNlX29iamVjdHNfICYmICFnZXRfdHJ1ZV90eXBlKGZlbGVtLmdldF90eXBlKCkpLT5pc19iYXNlX3R5cGUoKSkgeworICAgIGluZGVudChvdXQpIDw8IGVsZW0gPDwgIiA9IG51bGw7IiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQorICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworCisgIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCksIGhhc19tZXRhZGF0YSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlSTMyKCIgPDwgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIuZ2V0VmFsdWUoKSk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LiI7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgICBvdXQgPDwgIndyaXRlQmluYXJ5KCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAid3JpdGVCb29sKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAid3JpdGVCeXRlKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgIndyaXRlSTE2KCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgIndyaXRlSTY0KCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgIndyaXRlRG91YmxlKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gSmF2YSBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCAid3JpdGVJMzIoc3RydWN0LiIgPDwgbmFtZSA8PCAiKTsiOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgcHJlZml4LmNfc3RyKCksCisgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7CisgIH0KK30KKworLyoqCisgKiBTZXJpYWxpemVzIGFsbCB0aGUgbWVtYmVycyBvZiBhIHN0cnVjdC4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IHRvIHNlcmlhbGl6ZQorICogQHBhcmFtIHByZWZpeCAgU3RyaW5nIHByZWZpeCB0byBhdHRhY2ggdG8gYWxsIGZpZWxkcworICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgeworICAodm9pZCl0c3RydWN0OworICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIud3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHdyaXRpbmcgaXRzIHNpemUgdGhlbiB0aGUgZWxlbWVudHMuCisgKgorICogQHBhcmFtIHR0eXBlICBUaGUgdHlwZSBvZiBjb250YWluZXIKKyAqIEBwYXJhbSBwcmVmaXggU3RyaW5nIHByZWZpeCBmb3IgZmllbGRzCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhKSB7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKGhhc19tZXRhZGF0YSkgeworICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZU1hcEJlZ2luKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKCIKKyAgICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIiA8PCBwcmVmaXggPDwgIi5zaXplKCkpKTsiCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTZXRCZWdpbihuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFNldCgiCisgICAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwgcHJlZml4CisgICAgICAgICAgICAgICAgICA8PCAiLnNpemUoKSkpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUxpc3RCZWdpbihuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVExpc3QoIgorICAgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PCBwcmVmaXgKKyAgICAgICAgICAgICAgICAgIDw8ICIuc2l6ZSgpKSk7IiA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVJMzIoIiA8PCBwcmVmaXggPDwgIi5zaXplKCkpOyIgPDwgZW5kbDsKKyAgfQorCisgIHN0cmluZyBpdGVyID0gdG1wKCJfaXRlciIpOworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImZvciAoamF2YS51dGlsLk1hcC5FbnRyeTwiIDw8IHR5cGVfbmFtZSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpLCB0cnVlLCBmYWxzZSkKKyAgICAgICAgICAgICAgICA8PCAiLCAiIDw8IHR5cGVfbmFtZSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpLCB0cnVlLCBmYWxzZSkgPDwgIj4gIiA8PCBpdGVyCisgICAgICAgICAgICAgICAgPDwgIiA6ICIgPDwgcHJlZml4IDw8ICIuZW50cnlTZXQoKSkiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJmb3IgKCIgPDwgdHlwZV9uYW1lKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiICIgPDwgaXRlciA8PCAiIDogIgorICAgICAgICAgICAgICAgIDw8IHByZWZpeCA8PCAiKSI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJmb3IgKCIgPDwgdHlwZV9uYW1lKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiAiIDw8IGl0ZXIgPDwgIiA6ICIKKyAgICAgICAgICAgICAgICA8PCBwcmVmaXggPDwgIikiOworICB9CisKKyAgb3V0IDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBpdGVyLCBwcmVmaXgsIGhhc19tZXRhZGF0YSk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgaXRlciwgaGFzX21ldGFkYXRhKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyLCBoYXNfbWV0YWRhdGEpOworICB9CisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpZiAoaGFzX21ldGFkYXRhKSB7CisgICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlTWFwRW5kKCk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTZXRFbmQoKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVMaXN0RW5kKCk7IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhKSB7CisgICh2b2lkKW1hcDsKKyAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGl0ZXIgKyAiLmdldEtleSgpIik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsICIiLCBoYXNfbWV0YWRhdGEpOworICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgaXRlciArICIuZ2V0VmFsdWUoKSIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCAiIiwgaGFzX21ldGFkYXRhKTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgorICovCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEpIHsKKyAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIsIGhhc19tZXRhZGF0YSk7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCisgKi8KK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSkgeworICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIsIGhhc19tZXRhZGF0YSk7Cit9CisKKy8qKgorICogUmV0dXJucyBhIEphdmEgdHlwZSBuYW1lCisgKgorICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCisgKiBAcGFyYW0gY29udGFpbmVyIElzIHRoZSB0eXBlIGdvaW5nIGluc2lkZSBhIGNvbnRhaW5lcj8KKyAqIEByZXR1cm4gSmF2YSB0eXBlIG5hbWUsIGkuZS4gamF2YS51dGlsLkhhc2hNYXA8S2V5LFZhbHVlPgorICovCitzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY29udGFpbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2luaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2tpcF9nZW5lcmljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlX25hbWVzcGFjZSkgeworICAvLyBJbiBKYXZhIHR5cGVkZWZzIGFyZSBqdXN0IHJlc29sdmVkIHRvIHRoZWlyIHJlYWwgdHlwZQorICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworICBzdHJpbmcgcHJlZml4OworCisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICByZXR1cm4gYmFzZV90eXBlX25hbWUoKHRfYmFzZV90eXBlKil0dHlwZSwgaW5fY29udGFpbmVyKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X21hcCogdG1hcCA9ICh0X21hcCopdHR5cGU7CisgICAgaWYgKGluX2luaXQpIHsKKyAgICAgIGlmIChpc19lbnVtX21hcCh0bWFwKSkgeworICAgICAgICBwcmVmaXggPSAiamF2YS51dGlsLkVudW1NYXAiOworICAgICAgfSBlbHNlIGlmIChzb3J0ZWRfY29udGFpbmVyc18pIHsKKyAgICAgICAgcHJlZml4ID0gImphdmEudXRpbC5UcmVlTWFwIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHByZWZpeCA9ICJqYXZhLnV0aWwuSGFzaE1hcCI7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHByZWZpeCA9ICJqYXZhLnV0aWwuTWFwIjsKKyAgICB9CisgICAgcmV0dXJuIHByZWZpeCArIChza2lwX2dlbmVyaWMgPyAiIiA6ICI8IiArIHR5cGVfbmFtZSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwgdHJ1ZSkgKyAiLCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0eXBlX25hbWUodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHRydWUpICsgIj4iKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3NldCogdHNldCA9ICh0X3NldCopdHR5cGU7CisgICAgaWYgKGluX2luaXQpIHsKKyAgICAgIGlmIChpc19lbnVtX3NldCh0c2V0KSkgeworICAgICAgICBwcmVmaXggPSAiamF2YS51dGlsLkVudW1TZXQiOworICAgICAgfSBlbHNlIGlmIChzb3J0ZWRfY29udGFpbmVyc18pIHsKKyAgICAgICAgcHJlZml4ID0gImphdmEudXRpbC5UcmVlU2V0IjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHByZWZpeCA9ICJqYXZhLnV0aWwuSGFzaFNldCI7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHByZWZpeCA9ICJqYXZhLnV0aWwuU2V0IjsKKyAgICB9CisgICAgcmV0dXJuIHByZWZpeCArIChza2lwX2dlbmVyaWMgPyAiIiA6ICI8IiArIHR5cGVfbmFtZSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIHRydWUpICsgIj4iKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgdF9saXN0KiB0bGlzdCA9ICh0X2xpc3QqKXR0eXBlOworICAgIGlmIChpbl9pbml0KSB7CisgICAgICBwcmVmaXggPSAiamF2YS51dGlsLkFycmF5TGlzdCI7CisgICAgfSBlbHNlIHsKKyAgICAgIHByZWZpeCA9ICJqYXZhLnV0aWwuTGlzdCI7CisgICAgfQorICAgIHJldHVybiBwcmVmaXggKyAoc2tpcF9nZW5lcmljID8gIiIgOiAiPCIgKyB0eXBlX25hbWUodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgdHJ1ZSkgKyAiPiIpOworICB9CisKKyAgLy8gQ2hlY2sgZm9yIG5hbWVzcGFjaW5nCisgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOworICBpZiAoKHByb2dyYW0gIT0gTlVMTCkgJiYgKChwcm9ncmFtICE9IHByb2dyYW1fKSB8fCBmb3JjZV9uYW1lc3BhY2UpKSB7CisgICAgc3RyaW5nIHBhY2thZ2UgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJqYXZhIik7CisgICAgaWYgKCFwYWNrYWdlLmVtcHR5KCkpIHsKKyAgICAgIHJldHVybiBwYWNrYWdlICsgIi4iICsgdHR5cGUtPmdldF9uYW1lKCk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHR0eXBlLT5nZXRfbmFtZSgpOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIEphdmEgdHlwZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSB0aHJpZnQgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGJhc2UgVGhlIGJhc2UgdHlwZQorICogQHBhcmFtIGNvbnRhaW5lciBJcyBpdCBnb2luZyBpbiBhIEphdmEgY29udGFpbmVyPworICovCitzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6YmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHR5cGUsIGJvb2wgaW5fY29udGFpbmVyKSB7CisgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSB0eXBlLT5nZXRfYmFzZSgpOworCisgIHN3aXRjaCAodGJhc2UpIHsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgIHJldHVybiAoaW5fY29udGFpbmVyID8gIlZvaWQiIDogInZvaWQiKTsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICByZXR1cm4gImphdmEubmlvLkJ5dGVCdWZmZXIiOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gImphdmEubGFuZy5TdHJpbmciOworICAgIH0KKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgIHJldHVybiAoaW5fY29udGFpbmVyID8gImphdmEubGFuZy5Cb29sZWFuIiA6ICJib29sZWFuIik7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiamF2YS5sYW5nLkJ5dGUiIDogImJ5dGUiKTsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiamF2YS5sYW5nLlNob3J0IiA6ICJzaG9ydCIpOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICByZXR1cm4gKGluX2NvbnRhaW5lciA/ICJqYXZhLmxhbmcuSW50ZWdlciIgOiAiaW50Iik7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgIHJldHVybiAoaW5fY29udGFpbmVyID8gImphdmEubGFuZy5Mb25nIiA6ICJsb25nIik7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgIHJldHVybiAoaW5fY29udGFpbmVyID8gImphdmEubGFuZy5Eb3VibGUiIDogImRvdWJsZSIpOworICBkZWZhdWx0OgorICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gSmF2YSBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgIH0KK30KKworLyoqCisgKiBEZWNsYXJlcyBhIGZpZWxkLCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCisgKgorICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQKKyAqIEBwYXJhbSBpbml0IFdoZXRoZXIgdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGQKKyAqLworc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQsIGJvb2wgY29tbWVudCkgeworICAvLyBUT0RPKG1jc2xlZSk6IGRvIHdlIGV2ZXIgbmVlZCB0byBpbml0aWFsaXplIHRoZSBmaWVsZD8KKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworICB0X3R5cGUqIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0dHlwZSkpIHsKKyAgICByZXN1bHQgKz0gamF2YV9udWxsYWJsZV9hbm5vdGF0aW9uKCkgKyAiICI7CisgIH0KKyAgcmVzdWx0ICs9IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpICsgIiAiICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICBpZiAoaW5pdCkgeworICAgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgdGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7CisgICAgICBzdGQ6Om9mc3RyZWFtIGR1bW15OworICAgICAgcmVzdWx0ICs9ICIgPSAiICsgcmVuZGVyX2NvbnN0X3ZhbHVlKGR1bW15LCB0dHlwZSwgdGZpZWxkLT5nZXRfdmFsdWUoKSk7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICByZXN1bHQgKz0gIiA9IG51bGwiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSBmYWxzZSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgcmVzdWx0ICs9ICIgPSAoZG91YmxlKTAiOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIHJlc3VsdCArPSAiID0gbnVsbCI7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKSArICIoKSI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKSArICIoKSI7CisgICAgICA7CisgICAgfQorICB9CisgIHJlc3VsdCArPSAiOyI7CisgIGlmIChjb21tZW50KSB7CisgICAgcmVzdWx0ICs9ICIgLy8gIjsKKyAgICBpZiAodGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCkgeworICAgICAgcmVzdWx0ICs9ICJvcHRpb25hbCI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSAicmVxdWlyZWQiOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0dHlwZSA9IHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKKyAgc3RkOjpzdHJpbmcgZm5fbmFtZSA9IGdldF9ycGNfbWV0aG9kX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKTsKKyAgc3RkOjpzdHJpbmcgcmVzdWx0ID0gdHlwZV9uYW1lKHR0eXBlKSArICIgIiArIHByZWZpeCArIGZuX25hbWUgKyAiKCIKKyAgICAgICAgICAgICAgICAgICAgICAgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkgKyAiKSB0aHJvd3MgIjsKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICByZXN1bHQgKz0gdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSArICIsICI7CisgIH0KKyAgcmVzdWx0ICs9ICJvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIjsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd2b2lkIG5hbWUoYXJncywgcmVzdWx0SGFuZGxlciknCisgKgorICogQHBhcmFtcyB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCitzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VfYmFzZV9tZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RkOjpzdHJpbmcgYXJnbGlzdCA9IGFzeW5jX2Z1bmN0aW9uX2NhbGxfYXJnbGlzdCh0ZnVuY3Rpb24sIHVzZV9iYXNlX21ldGhvZCwgdHJ1ZSk7CisKKyAgc3RkOjpzdHJpbmcgcmV0X3R5cGUgPSAiIjsKKyAgaWYgKHVzZV9iYXNlX21ldGhvZCkgeworICAgIHJldF90eXBlICs9ICJBc3luY0NsaWVudC4iOworICB9CisgIHJldF90eXBlICs9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfY2FsbCI7CisKKyAgc3RkOjpzdHJpbmcgZm5fbmFtZSA9IGdldF9ycGNfbWV0aG9kX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKTsKKworICBzdGQ6OnN0cmluZyByZXN1bHQgPSBwcmVmaXggKyAidm9pZCAiICsgZm5fbmFtZSArICIoIiArIGFyZ2xpc3QgKyAiKSI7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjphc3luY19mdW5jdGlvbl9jYWxsX2FyZ2xpc3QodF9mdW5jdGlvbiogdGZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlX2Jhc2VfbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2x1ZGVfdHlwZXMpIHsKKyAgKHZvaWQpdXNlX2Jhc2VfbWV0aG9kOworICBzdGQ6OnN0cmluZyBhcmdsaXN0ID0gIiI7CisgIGlmICh0ZnVuYy0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPiAwKSB7CisgICAgYXJnbGlzdCA9IGFyZ3VtZW50X2xpc3QodGZ1bmMtPmdldF9hcmdsaXN0KCksIGluY2x1ZGVfdHlwZXMpICsgIiwgIjsKKyAgfQorCisgIGlmIChpbmNsdWRlX3R5cGVzKSB7CisgICAgYXJnbGlzdCArPSAib3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuQXN5bmNNZXRob2RDYWxsYmFjazwiOworICAgIGFyZ2xpc3QgKz0gdHlwZV9uYW1lKHRmdW5jLT5nZXRfcmV0dXJudHlwZSgpLCB0cnVlKSArICI+ICI7CisgIH0KKyAgYXJnbGlzdCArPSAicmVzdWx0SGFuZGxlciI7CisKKyAgcmV0dXJuIGFyZ2xpc3Q7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGNvbW1hIHNlcGFyYXRlZCBmaWVsZCBsaXN0LCB3aXRoIHR5cGUgbmFtZXMKKyAqLworc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaW5jbHVkZV90eXBlcykgeworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSAiLCAiOworICAgIH0KKyAgICBpZiAoaW5jbHVkZV90eXBlcykgeworICAgICAgcmVzdWx0ICs9IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCkpICsgIiAiOworICAgIH0KKyAgICByZXN1bHQgKz0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjphc3luY19hcmd1bWVudF9saXN0KHRfZnVuY3Rpb24qIHRmdW5jdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbHVkZV90eXBlcykgeworICAodm9pZCl0ZnVuY3Q7CisgICh2b2lkKXR0eXBlOworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICB9CisgICAgaWYgKGluY2x1ZGVfdHlwZXMpIHsKKyAgICAgIHJlc3VsdCArPSB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSArICIgIjsKKyAgICB9CisgICAgcmVzdWx0ICs9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgfQorICBpZiAoIWZpcnN0KSB7CisgICAgcmVzdWx0ICs9ICIsICI7CisgIH0KKyAgaWYgKGluY2x1ZGVfdHlwZXMpIHsKKyAgICByZXN1bHQgKz0gIm9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLkFzeW5jTWV0aG9kQ2FsbGJhY2s8IjsKKyAgICByZXN1bHQgKz0gdHlwZV9uYW1lKHRmdW5jdC0+Z2V0X3JldHVybnR5cGUoKSwgdHJ1ZSkgKyAiPiAiOworICB9CisgIHJlc3VsdCArPSAicmVzdWx0SGFuZGxlciI7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBKYXZhIGVudW0gc3RyaW5nIGZvciB0aGUgZ2l2ZW4gdHlwZS4KKyAqLworc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORyI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5CT09MIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5CWVRFIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTE2IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTMyIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTY0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuRE9VQkxFIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JMzIiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLk1BUCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNFVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5MSVNUIjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworLyoqCisgKiBUYWtlcyBhIG5hbWUgYW5kIHByb2R1ZXMgYSB2YWxpZCBKYXZhIHNvdXJjZSBmaWxlIG5hbWUgZnJvbSBpdAorICoKKyAqIEBwYXJhbSBmcm9tTmFtZSBUaGUgbmFtZSB3aGljaCBzaGFsbCBiZWNvbWUgYSB2YWxpZCBKYXZhIHNvdXJjZSBmaWxlIG5hbWUKKyAqIEByZXR1cm4gVGhlIHByb2R1Y2VkIGlkZW50aWZpZXIKKyAqLworc3RkOjpzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6bWFrZV92YWxpZF9qYXZhX2ZpbGVuYW1lKHN0ZDo6c3RyaW5nIGNvbnN0JiBmcm9tTmFtZSkgeworICAvLyBpZiBhbnkgZnVydGhlciBydWxlcyBhcHBseSB0byBzb3VyY2UgZmlsZSBuYW1lcyBpbiBKYXZhLCBtb2RpZnkgYXMgbmVjZXNzYXJ5CisgIHJldHVybiBtYWtlX3ZhbGlkX2phdmFfaWRlbnRpZmllcihmcm9tTmFtZSk7Cit9CisKKy8qKgorICogVGFrZXMgYSBuYW1lIGFuZCBwcm9kdWVzIGEgdmFsaWQgSmF2YSBpZGVudGlmaWVyIGZyb20gaXQKKyAqCisgKiBAcGFyYW0gZnJvbU5hbWUgVGhlIG5hbWUgd2hpY2ggc2hhbGwgYmVjb21lIGEgdmFsaWQgSmF2YSBpZGVudGlmaWVyCisgKiBAcmV0dXJuIFRoZSBwcm9kdWNlZCBpZGVudGlmaWVyCisgKi8KK3N0ZDo6c3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6Om1ha2VfdmFsaWRfamF2YV9pZGVudGlmaWVyKHN0ZDo6c3RyaW5nIGNvbnN0JiBmcm9tTmFtZSkgeworICBzdGQ6OnN0cmluZyBzdHIgPSBmcm9tTmFtZTsKKyAgaWYgKHN0ci5lbXB0eSgpKSB7CisgICAgcmV0dXJuIHN0cjsKKyAgfQorCisgIC8vIHRlc3RzIHJlbHkgb24gdGhpcworICBhc3NlcnQoKCdBJyA8ICdaJykgJiYgKCdhJyA8ICd6JykgJiYgKCcwJyA8ICc5JykpOworCisgIC8vIGlmIHRoZSBmaXJzdCBsZXR0ZXIgaXMgYSBudW1iZXIsIHdlIGFkZCBhbiBhZGRpdGlvbmFsIHVuZGVyc2NvcmUgaW4gZnJvbnQgb2YgaXQKKyAgY2hhciBjID0gc3RyLmF0KDApOworICBpZiAoKCcwJyA8PSBjKSAmJiAoYyA8PSAnOScpKSB7CisgICAgc3RyID0gIl8iICsgc3RyOworICB9CisKKyAgLy8gZm9sbG93aW5nIGNoYXJzOiBsZXR0ZXIsIG51bWJlciBvciB1bmRlcnNjb3JlCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RyLnNpemUoKTsgKytpKSB7CisgICAgYyA9IHN0ci5hdChpKTsKKyAgICBpZiAoKCgnQScgPiBjKSB8fCAoYyA+ICdaJykpICYmICgoJ2EnID4gYykgfHwgKGMgPiAneicpKSAmJiAoKCcwJyA+IGMpIHx8IChjID4gJzknKSkKKyAgICAgICAgJiYgKCdfJyAhPSBjKSkgeworICAgICAgc3RyLnJlcGxhY2UoaSwgMSwgIl8iKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gc3RyOworfQorCitzdGQ6OnN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjphc19jYW1lbF9jYXNlKHN0ZDo6c3RyaW5nIG5hbWUsIGJvb2wgdWNmaXJzdCkgeworICBzdGQ6OnN0cmluZyBuZXdfbmFtZTsKKyAgc2l6ZV90IGkgPSAwOworICBmb3IgKGkgPSAwOyBpIDwgbmFtZS5zaXplKCk7IGkrKykgeworICAgIGlmIChuYW1lW2ldICE9ICdfJykKKyAgICAgIGJyZWFrOworICB9CisgIGlmICh1Y2ZpcnN0KSB7CisgICAgbmV3X25hbWUgKz0gdG91cHBlcihuYW1lW2krK10pOworICB9IGVsc2UgeworICAgIG5ld19uYW1lICs9IHRvbG93ZXIobmFtZVtpKytdKTsKKyAgfQorICBmb3IgKDsgaSA8IG5hbWUuc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAobmFtZVtpXSA9PSAnXycpIHsKKyAgICAgIGlmIChpIDwgbmFtZS5zaXplKCkgLSAxKSB7CisgICAgICAgIGkrKzsKKyAgICAgICAgbmV3X25hbWUgKz0gdG91cHBlcihuYW1lW2ldKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgbmV3X25hbWUgKz0gbmFtZVtpXTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG5ld19uYW1lOworfQorCitzdGQ6OnN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjpnZXRfcnBjX21ldGhvZF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpIHsKKyAgaWYgKGZ1bGxjYW1lbF9zdHlsZV8pIHsKKyAgICByZXR1cm4gYXNfY2FtZWxfY2FzZShuYW1lLCBmYWxzZSk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIG5hbWU7CisgIH0KK30KKworLyoqCisgKiBBcHBsaWVzIHRoZSBjb3JyZWN0IHN0eWxlIHRvIGEgc3RyaW5nIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiBub2NhbWVsX3N0eWxlXworICogYW5kL29yIGZ1bGxjYW1lbF9zdHlsZV8KKyAqLworc3RkOjpzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6Z2V0X2NhcF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpIHsKKyAgaWYgKG5vY2FtZWxfc3R5bGVfKSB7CisgICAgcmV0dXJuICJfIiArIG5hbWU7CisgIH0gZWxzZSBpZiAoZnVsbGNhbWVsX3N0eWxlXykgeworICAgIHJldHVybiBhc19jYW1lbF9jYXNlKG5hbWUpOworICB9IGVsc2UgeworICAgIG5hbWVbMF0gPSB0b3VwcGVyKG5hbWVbMF0pOworICAgIHJldHVybiBuYW1lOworICB9Cit9CisKK3N0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjpjb25zdGFudF9uYW1lKHN0cmluZyBuYW1lKSB7CisgIHN0cmluZyBjb25zdGFudF9uYW1lOworCisgIGJvb2wgaXNfZmlyc3QgPSB0cnVlOworICBib29sIHdhc19wcmV2aW91c19jaGFyX3VwcGVyID0gZmFsc2U7CisgIGZvciAoc3RyaW5nOjppdGVyYXRvciBpdGVyID0gbmFtZS5iZWdpbigpOyBpdGVyICE9IG5hbWUuZW5kKCk7ICsraXRlcikgeworICAgIHN0cmluZzo6dmFsdWVfdHlwZSBjaGFyYWN0ZXIgPSAoKml0ZXIpOworCisgICAgYm9vbCBpc191cHBlciA9IGlzdXBwZXIoY2hhcmFjdGVyKTsKKworICAgIGlmIChpc191cHBlciAmJiAhaXNfZmlyc3QgJiYgIXdhc19wcmV2aW91c19jaGFyX3VwcGVyKSB7CisgICAgICBjb25zdGFudF9uYW1lICs9ICdfJzsKKyAgICB9CisgICAgY29uc3RhbnRfbmFtZSArPSB0b3VwcGVyKGNoYXJhY3Rlcik7CisKKyAgICBpc19maXJzdCA9IGZhbHNlOworICAgIHdhc19wcmV2aW91c19jaGFyX3VwcGVyID0gaXNfdXBwZXI7CisgIH0KKworICByZXR1cm4gY29uc3RhbnRfbmFtZTsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZV9wMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZV9wMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyByZXN1bHRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUpIHsKKworICB0X2NvbnRhaW5lciogY29udGFpbmVyID0gKHRfY29udGFpbmVyKil0eXBlOworICBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZTsKKyAgaWYgKHNvdXJjZV9uYW1lX3AyID09ICIiKQorICAgIHNvdXJjZV9uYW1lID0gc291cmNlX25hbWVfcDE7CisgIGVsc2UKKyAgICBzb3VyY2VfbmFtZSA9IHNvdXJjZV9uYW1lX3AxICsgIi4iICsgc291cmNlX25hbWVfcDI7CisKKyAgYm9vbCBjb3B5X2NvbnN0cnVjdF9jb250YWluZXI7CisgIGlmIChjb250YWluZXItPmlzX21hcCgpKSB7CisgICAgdF9tYXAqIHRtYXAgPSAodF9tYXAqKWNvbnRhaW5lcjsKKyAgICBjb3B5X2NvbnN0cnVjdF9jb250YWluZXIgPSB0bWFwLT5nZXRfa2V5X3R5cGUoKS0+aXNfYmFzZV90eXBlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB0bWFwLT5nZXRfdmFsX3R5cGUoKS0+aXNfYmFzZV90eXBlKCk7CisgIH0gZWxzZSB7CisgICAgdF90eXBlKiBlbGVtX3R5cGUgPSBjb250YWluZXItPmlzX2xpc3QoKSA/ICgodF9saXN0Kiljb250YWluZXIpLT5nZXRfZWxlbV90eXBlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKCh0X3NldCopY29udGFpbmVyKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIGNvcHlfY29uc3RydWN0X2NvbnRhaW5lciA9IGVsZW1fdHlwZS0+aXNfYmFzZV90eXBlKCk7CisgIH0KKworICBpZiAoY29weV9jb25zdHJ1Y3RfY29udGFpbmVyKSB7CisgICAgLy8gZGVlcCBjb3B5IG9mIGJhc2UgdHlwZXMgY2FuIGJlIGRvbmUgbXVjaCBtb3JlIGVmZmljaWVudGx5IHRoYW4gaXRlcmF0aW5nIG92ZXIgYWxsIHRoZQorICAgIC8vIGVsZW1lbnRzIG1hbnVhbGx5CisgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgcmVzdWx0X25hbWUgPDwgIiA9IG5ldyAiCisgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKGNvbnRhaW5lciwgZmFsc2UsIHRydWUpIDw8ICIoIiA8PCBzb3VyY2VfbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgcmV0dXJuOworICB9CisKKyAgc3RkOjpzdHJpbmcgY29uc3RydWN0b3JfYXJnczsKKyAgaWYgKGlzX2VudW1fc2V0KGNvbnRhaW5lcikgfHwgaXNfZW51bV9tYXAoY29udGFpbmVyKSkgeworICAgIGNvbnN0cnVjdG9yX2FyZ3MgPSBpbm5lcl9lbnVtX3R5cGVfbmFtZShjb250YWluZXIpOworICB9IGVsc2UgaWYgKCEoc29ydGVkX2NvbnRhaW5lcnNfICYmIChjb250YWluZXItPmlzX21hcCgpIHx8IGNvbnRhaW5lci0+aXNfc2V0KCkpKSkgeworICAgIC8vIHVuc29ydGVkIGNvbnRhaW5lcnMgYWNjZXB0IGEgY2FwYWNpdHkgdmFsdWUKKyAgICBjb25zdHJ1Y3Rvcl9hcmdzID0gc291cmNlX25hbWUgKyAiLnNpemUoKSI7CisgIH0KKworICBpZiAoaXNfZW51bV9zZXQoY29udGFpbmVyKSkgeworICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IHJlc3VsdF9uYW1lIDw8ICIgPSAiCisgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKGNvbnRhaW5lciwgZmFsc2UsIHRydWUsIHRydWUpIDw8ICIubm9uZU9mKCIgPDwgY29uc3RydWN0b3JfYXJncyA8PCAiKTsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgcmVzdWx0X25hbWUgPDwgIiA9IG5ldyAiCisgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKGNvbnRhaW5lciwgZmFsc2UsIHRydWUpIDw8ICIoIiA8PCBjb25zdHJ1Y3Rvcl9hcmdzIDw8ICIpOyIgPDwgZW5kbDsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSA9IHNvdXJjZV9uYW1lX3AxICsgIl9lbGVtZW50IjsKKyAgc3RkOjpzdHJpbmcgcmVzdWx0X2VsZW1lbnRfbmFtZSA9IHJlc3VsdF9uYW1lICsgIl9jb3B5IjsKKworICBpZiAoY29udGFpbmVyLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSoga2V5X3R5cGUgPSAoKHRfbWFwKiljb250YWluZXIpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZhbF90eXBlID0gKCh0X21hcCopY29udGFpbmVyKS0+Z2V0X3ZhbF90eXBlKCk7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yIChqYXZhLnV0aWwuTWFwLkVudHJ5PCIgPDwgdHlwZV9uYW1lKGtleV90eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSh2YWxfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICI+ICIgPDwgaXRlcmF0b3JfZWxlbWVudF9uYW1lIDw8ICIgOiAiCisgICAgICAgICAgICAgICAgPDwgc291cmNlX25hbWUgPDwgIi5lbnRyeVNldCgpKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoa2V5X3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgaXRlcmF0b3JfZWxlbWVudF9uYW1lCisgICAgICAgICAgICAgICAgPDwgIl9rZXkgPSAiIDw8IGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSA8PCAiLmdldEtleSgpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUodmFsX3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgaXRlcmF0b3JfZWxlbWVudF9uYW1lCisgICAgICAgICAgICAgICAgPDwgIl92YWx1ZSA9ICIgPDwgaXRlcmF0b3JfZWxlbWVudF9uYW1lIDw8ICIuZ2V0VmFsdWUoKTsiIDw8IGVuZGw7CisKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGlmIChrZXlfdHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9jb250YWluZXIob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcl9lbGVtZW50X25hbWUgKyAiX2tleSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfZWxlbWVudF9uYW1lICsgIl9rZXkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfdHlwZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZShrZXlfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCByZXN1bHRfZWxlbWVudF9uYW1lIDw8ICJfa2V5ID0gIjsKKyAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSArICJfa2V5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdF9lbGVtZW50X25hbWUgKyAiX2tleSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfdHlwZSk7CisgICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorCisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBpZiAodmFsX3R5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3JfZWxlbWVudF9uYW1lICsgIl92YWx1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfZWxlbWVudF9uYW1lICsgIl92YWx1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbF90eXBlKTsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKHZhbF90eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IHJlc3VsdF9lbGVtZW50X25hbWUgPDwgIl92YWx1ZSA9ICI7CisgICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcl9lbGVtZW50X25hbWUgKyAiX3ZhbHVlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdF9lbGVtZW50X25hbWUgKyAiX3ZhbHVlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbF90eXBlKTsKKyAgICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8IHJlc3VsdF9uYW1lIDw8ICIucHV0KCIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZSA8PCAiX2tleSwgIiA8PCByZXN1bHRfZWxlbWVudF9uYW1lCisgICAgICAgICAgICAgICAgPDwgIl92YWx1ZSk7IiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICB9IGVsc2UgeworICAgIHRfdHlwZSogZWxlbV90eXBlOworCisgICAgaWYgKGNvbnRhaW5lci0+aXNfc2V0KCkpIHsKKyAgICAgIGVsZW1fdHlwZSA9ICgodF9zZXQqKWNvbnRhaW5lciktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgZWxlbV90eXBlID0gKCh0X2xpc3QqKWNvbnRhaW5lciktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9CisKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yICgiIDw8IHR5cGVfbmFtZShlbGVtX3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgaXRlcmF0b3JfZWxlbWVudF9uYW1lCisgICAgICAgICAgICAgICAgPDwgIiA6ICIgPDwgc291cmNlX25hbWUgPDwgIikgeyIgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworCisgICAgaWYgKGVsZW1fdHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIC8vIHJlY3Vyc2l2ZSBkZWVwIGNvcHkKKyAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9jb250YWluZXIob3V0LCBpdGVyYXRvcl9lbGVtZW50X25hbWUsICIiLCByZXN1bHRfZWxlbWVudF9uYW1lLCBlbGVtX3R5cGUpOworICAgICAgaW5kZW50KG91dCkgPDwgcmVzdWx0X25hbWUgPDwgIi5hZGQoIiA8PCByZXN1bHRfZWxlbWVudF9uYW1lIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgLy8gaXRlcmF0aXZlIGNvcHkKKyAgICAgIGlmIChlbGVtX3R5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJqYXZhLm5pby5CeXRlQnVmZmVyIHRlbXBfYmluYXJ5X2VsZW1lbnQgPSAiOworICAgICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlbXBfYmluYXJ5X2VsZW1lbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtX3R5cGUpOworICAgICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudChvdXQpIDw8IHJlc3VsdF9uYW1lIDw8ICIuYWRkKHRlbXBfYmluYXJ5X2VsZW1lbnQpOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGVudChvdXQpIDw8IHJlc3VsdF9uYW1lIDw8ICIuYWRkKCI7CisgICAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKG91dCwgaXRlcmF0b3JfZWxlbWVudF9uYW1lLCByZXN1bHRfbmFtZSwgZWxlbV90eXBlKTsKKyAgICAgICAgb3V0IDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBkZXN0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSkgeworICAodm9pZClkZXN0X25hbWU7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpIHx8IHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgb3V0IDw8ICJvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb3B5QmluYXJ5KCIgPDwgc291cmNlX25hbWUgPDwgIikiOworICAgIH0gZWxzZSB7CisgICAgICAvLyBldmVyeXRoaW5nIGVsc2UgY2FuIGJlIGNvcGllZCBkaXJlY3RseQorICAgICAgb3V0IDw8IHNvdXJjZV9uYW1lOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgIm5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlLCB0cnVlKSA8PCAiKCIgPDwgc291cmNlX25hbWUgPDwgIikiOworICB9Cit9CisKK3N0ZDo6c3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2lzc2V0X2NoZWNrKHRfZmllbGQqIGZpZWxkKSB7CisgIHJldHVybiBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZC0+Z2V0X25hbWUoKSk7Cit9CisKK3N0ZDo6c3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6Omlzc2V0X2ZpZWxkX2lkKHRfZmllbGQqIGZpZWxkKSB7CisgIHJldHVybiAiX18iICsgdXBjYXNlX3N0cmluZyhmaWVsZC0+Z2V0X25hbWUoKSArICJfaXNzZXRfaWQiKTsKK30KKworc3RkOjpzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfY2hlY2soc3RkOjpzdHJpbmcgZmllbGRfbmFtZSkgeworICByZXR1cm4gImlzIiArIGdldF9jYXBfbmFtZSgic2V0IikgKyBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSkgKyAiKCkiOworfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2lzc2V0X3NldChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkLCBzdHJpbmcgcHJlZml4KSB7CisgIGlmICghdHlwZV9jYW5fYmVfbnVsbChmaWVsZC0+Z2V0X3R5cGUoKSkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgInNldCIgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCBnZXRfY2FwX25hbWUoImlzU2V0IikKKyAgICAgICAgICAgICAgICA8PCAiKHRydWUpOyIgPDwgZW5kbDsKKyAgfQorfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF9kZXNjKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QgU1RSVUNUX0RFU0MgPSBuZXcgIgorICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdChcIiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiXCIpOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9maWVsZF9kZXNjcyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGluZGVudChvdXQpIDw8ICJwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgIgorICAgICAgICAgICAgICAgIDw8IGNvbnN0YW50X25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgIDw8ICJfRklFTERfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQoXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgIDw8ICJcIiwgIiA8PCB0eXBlX3RvX2VudW0oKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgIihzaG9ydCkiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpOyIgPDwgZW5kbDsKKyAgfQorfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NjaGVtZV9tYXAob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLlNjaGVtZUZhY3RvcnkgU1RBTkRBUkRfU0NIRU1FX0ZBQ1RPUlkgPSBuZXcgIgorICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiU3RhbmRhcmRTY2hlbWVGYWN0b3J5KCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLlNjaGVtZUZhY3RvcnkgVFVQTEVfU0NIRU1FX0ZBQ1RPUlkgPSBuZXcgIgorICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiVHVwbGVTY2hlbWVGYWN0b3J5KCk7IiA8PCBlbmRsOworfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkX25hbWVfY29uc3RhbnRzKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgIi8qKiBUaGUgc2V0IG9mIGZpZWxkcyB0aGlzIHN0cnVjdCBjb250YWlucywgYWxvbmcgd2l0aCBjb252ZW5pZW5jZSBtZXRob2RzIGZvciAiCisgICAgICAgICAgICAgICAgICJmaW5kaW5nIGFuZCBtYW5pcHVsYXRpbmcgdGhlbS4gKi8iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZW51bSBfRmllbGRzIGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkSWRFbnVtIHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgaWYgKCFmaXJzdCkgeworICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOworICAgIH0KKyAgICBmaXJzdCA9IGZhbHNlOworICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgKm1faXRlcik7CisgICAgaW5kZW50KG91dCkgPDwgY29uc3RhbnRfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8ICIoKHNob3J0KSIgPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkKKyAgICAgICAgICAgICAgICA8PCAiLCBcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIikiOworICB9CisKKyAgb3V0IDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkKKyAgICAgIDw8ICJwcml2YXRlIHN0YXRpYyBmaW5hbCBqYXZhLnV0aWwuTWFwPGphdmEubGFuZy5TdHJpbmcsIF9GaWVsZHM+IGJ5TmFtZSA9IG5ldyBqYXZhLnV0aWwuSGFzaE1hcDxqYXZhLmxhbmcuU3RyaW5nLCBfRmllbGRzPigpOyIKKyAgICAgIDw8IGVuZGw7CisgIG91dCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJzdGF0aWMgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgZm9yIChfRmllbGRzIGZpZWxkIDogamF2YS51dGlsLkVudW1TZXQuYWxsT2YoX0ZpZWxkcy5jbGFzcykpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgICAgYnlOYW1lLnB1dChmaWVsZC5nZXRGaWVsZE5hbWUoKSwgZmllbGQpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAiLyoqIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICogRmluZCB0aGUgX0ZpZWxkcyBjb25zdGFudCB0aGF0IG1hdGNoZXMgZmllbGRJZCwgb3IgbnVsbCBpZiBpdHMgbm90IGZvdW5kLiIKKyAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAqLyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgamF2YV9udWxsYWJsZV9hbm5vdGF0aW9uKCkgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBzdGF0aWMgX0ZpZWxkcyBmaW5kQnlUaHJpZnRJZChpbnQgZmllbGRJZCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2goZmllbGRJZCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjogLy8gIgorICAgICAgICAgICAgICAgIDw8IGNvbnN0YW50X25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiAiIDw8IGNvbnN0YW50X25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIG51bGw7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgIi8qKiIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAqIEZpbmQgdGhlIF9GaWVsZHMgY29uc3RhbnQgdGhhdCBtYXRjaGVzIGZpZWxkSWQsIHRocm93aW5nIGFuIGV4Y2VwdGlvbiIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAqIGlmIGl0IGlzIG5vdCBmb3VuZC4iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgKi8iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RhdGljIF9GaWVsZHMgZmluZEJ5VGhyaWZ0SWRPclRocm93KGludCBmaWVsZElkKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICBfRmllbGRzIGZpZWxkcyA9IGZpbmRCeVRocmlmdElkKGZpZWxkSWQpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgaWYgKGZpZWxkcyA9PSBudWxsKSB0aHJvdyBuZXcgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihcIkZpZWxkIFwiICsgZmllbGRJZCArICIKKyAgICAgICAgICAgICAgICAgIlwiIGRvZXNuJ3QgZXhpc3QhXCIpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIGZpZWxkczsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgIi8qKiIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAqIEZpbmQgdGhlIF9GaWVsZHMgY29uc3RhbnQgdGhhdCBtYXRjaGVzIG5hbWUsIG9yIG51bGwgaWYgaXRzIG5vdCBmb3VuZC4iCisgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgKi8iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8IGphdmFfbnVsbGFibGVfYW5ub3RhdGlvbigpIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RhdGljIF9GaWVsZHMgZmluZEJ5TmFtZShqYXZhLmxhbmcuU3RyaW5nIG5hbWUpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBieU5hbWUuZ2V0KG5hbWUpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBmaW5hbCBzaG9ydCBfdGhyaWZ0SWQ7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIF9maWVsZE5hbWU7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgIl9GaWVsZHMoc2hvcnQgdGhyaWZ0SWQsIGphdmEubGFuZy5TdHJpbmcgZmllbGROYW1lKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICBfdGhyaWZ0SWQgPSB0aHJpZnRJZDsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIF9maWVsZE5hbWUgPSBmaWVsZE5hbWU7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc2hvcnQgZ2V0VGhyaWZ0RmllbGRJZCgpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBfdGhyaWZ0SWQ7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRGaWVsZE5hbWUoKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gX2ZpZWxkTmFtZTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3RfamF2YV9nZW5lcmF0b3I6Omlzc2V0X3R5cGUgdF9qYXZhX2dlbmVyYXRvcjo6bmVlZHNfaXNzZXQodF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBvdXRQcmltaXRpdmVUeXBlKSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgaW50IGNvdW50ID0gMDsKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGlmICghdHlwZV9jYW5fYmVfbnVsbChnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkpKSB7CisgICAgICBjb3VudCsrOworICAgIH0KKyAgfQorICBpZiAoY291bnQgPT0gMCkgeworICAgIHJldHVybiBJU1NFVF9OT05FOworICB9IGVsc2UgaWYgKGNvdW50IDw9IDY0KSB7CisgICAgaWYgKG91dFByaW1pdGl2ZVR5cGUgIT0gTlVMTCkgeworICAgICAgaWYgKGNvdW50IDw9IDgpCisgICAgICAgICpvdXRQcmltaXRpdmVUeXBlID0gImJ5dGUiOworICAgICAgZWxzZSBpZiAoY291bnQgPD0gMTYpCisgICAgICAgICpvdXRQcmltaXRpdmVUeXBlID0gInNob3J0IjsKKyAgICAgIGVsc2UgaWYgKGNvdW50IDw9IDMyKQorICAgICAgICAqb3V0UHJpbWl0aXZlVHlwZSA9ICJpbnQiOworICAgICAgZWxzZSBpZiAoY291bnQgPD0gNjQpCisgICAgICAgICpvdXRQcmltaXRpdmVUeXBlID0gImxvbmciOworICAgIH0KKyAgICByZXR1cm4gSVNTRVRfUFJJTUlUSVZFOworICB9IGVsc2UgeworICAgIHJldHVybiBJU1NFVF9CSVRTRVQ7CisgIH0KK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9jbGVhcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaWYgKCFqYXZhNV8pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOworICB9CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCBjbGVhcigpIHsiIDw8IGVuZGw7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBpbmRlbnRfdXAoKTsKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIHRfZmllbGQqIGZpZWxkID0gKm1faXRlcjsKKyAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICAgIGlmIChmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCAidGhpcy4iICsgZmllbGQtPmdldF9uYW1lKCksIHQsIGZpZWxkLT5nZXRfdmFsdWUoKSwgdHJ1ZSwgdHJ1ZSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0KSkgeworCisgICAgICBpZiAocmV1c2Vfb2JqZWN0c18gJiYgKHQtPmlzX2NvbnRhaW5lcigpIHx8IHQtPmlzX3N0cnVjdCgpKSkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHRoaXMuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiICE9IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIuY2xlYXIoKTsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgICB9IGVsc2UgeworCisgICAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiA9IG51bGw7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gbXVzdCBiZSBhIGJhc2UgdHlwZQorICAgIC8vIG1lYW5zIGl0IGFsc28gbmVlZHMgdG8gYmUgZXhwbGljaXRseSB1bnNldAorICAgIGluZGVudChvdXQpIDw8ICJzZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpIDw8ICIoZmFsc2UpOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIHRfYmFzZV90eXBlKiBiYXNlX3R5cGUgPSAodF9iYXNlX3R5cGUqKXQ7CisKKyAgICBzd2l0Y2ggKGJhc2VfdHlwZS0+Z2V0X2Jhc2UoKSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPSAwOyIgPDwgZW5kbDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiID0gMC4wOyIgPDwgZW5kbDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiA9IGZhbHNlOyIgPDwgZW5kbDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAidW5zdXBwb3J0ZWQgdHlwZTogIiArIGJhc2VfdHlwZS0+Z2V0X25hbWUoKSArICIgZm9yIGZpZWxkICIgKyBmaWVsZC0+Z2V0X25hbWUoKTsKKyAgICB9CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvLyBnZW5lcmF0ZXMgamF2YSBtZXRob2QgdG8gc2VyaWFsaXplIChpbiB0aGUgSmF2YSBzZW5zZSkgdGhlIG9iamVjdAordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF93cml0ZV9vYmplY3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICAodm9pZCl0c3RydWN0OworICBpbmRlbnQob3V0KQorICAgICAgPDwgInByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsiCisgICAgICA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB0cnkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgICB3cml0ZShuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbChuZXcgIgorICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRJT1N0cmVhbVRyYW5zcG9ydChvdXQpKSk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB9IGNhdGNoIChvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHRlKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICAgIHRocm93IG5ldyBqYXZhLmlvLklPRXhjZXB0aW9uKHRlIiA8PCAoYW5kcm9pZF9sZWdhY3lfID8gIi5nZXRNZXNzYWdlKCkiIDogIiIpCisgICAgICAgICAgICAgIDw8ICIpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLy8gZ2VuZXJhdGVzIGphdmEgbWV0aG9kIHRvIHNlcmlhbGl6ZSAoaW4gdGhlIEphdmEgc2Vuc2UpIHRoZSBvYmplY3QKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVhZF9vYmplY3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBpbikgdGhyb3dzICIKKyAgICAgICAgICAgICAgICAgImphdmEuaW8uSU9FeGNlcHRpb24sIGphdmEubGFuZy5DbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHRyeSB7IiA8PCBlbmRsOworICBpZiAoIXRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKKyAgICBzd2l0Y2ggKG5lZWRzX2lzc2V0KHRzdHJ1Y3QpKSB7CisgICAgY2FzZSBJU1NFVF9OT05FOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBJU1NFVF9QUklNSVRJVkU6CisgICAgICBpbmRlbnQob3V0KSA8PCAiICAgIC8vIGl0IGRvZXNuJ3Qgc2VlbSBsaWtlIHlvdSBzaG91bGQgaGF2ZSB0byBkbyB0aGlzLCBidXQgamF2YSAiCisgICAgICAgICAgICAgICAgICAgICAic2VyaWFsaXphdGlvbiBpcyB3YWNreSwgYW5kIGRvZXNuJ3QgY2FsbCB0aGUgZGVmYXVsdCBjb25zdHJ1Y3Rvci4iIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICAgIF9faXNzZXRfYml0ZmllbGQgPSAwOyIgPDwgZW5kbDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSVNTRVRfQklUU0VUOgorICAgICAgaW5kZW50KG91dCkgPDwgIiAgICAvLyBpdCBkb2Vzbid0IHNlZW0gbGlrZSB5b3Ugc2hvdWxkIGhhdmUgdG8gZG8gdGhpcywgYnV0IGphdmEgIgorICAgICAgICAgICAgICAgICAgICAgInNlcmlhbGl6YXRpb24gaXMgd2Fja3ksIGFuZCBkb2Vzbid0IGNhbGwgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IuIiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgICBfX2lzc2V0X2JpdF92ZWN0b3IgPSBuZXcgamF2YS51dGlsLkJpdFNldCgxKTsiIDw8IGVuZGw7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgaW5kZW50KG91dCkgPDwgIiAgICByZWFkKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQ29tcGFjdFByb3RvY29sKG5ldyAiCisgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVElPU3RyZWFtVHJhbnNwb3J0KGluKSkpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgfSBjYXRjaCAob3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB0ZSkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgICB0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbih0ZSIgPDwgKGFuZHJvaWRfbGVnYWN5XyA/ICIuZ2V0TWVzc2FnZSgpIiA6ICIiKQorICAgICAgICAgICAgICA8PCAiKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RhbmRhcmRfcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgdm9pZCByZWFkKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBpcHJvdCwgIgorICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIC8vIERlY2xhcmUgc3RhY2sgdG1wIHZhcmlhYmxlcyBhbmQgcmVhZCBzdHJ1Y3QgaGVhZGVyCisgIG91dCA8PCBpbmRlbnQoKSA8PCAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIHNjaGVtZUZpZWxkOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgImlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpOyIgPDwgZW5kbDsKKworICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKKyAgaW5kZW50KG91dCkgPDwgIndoaWxlICh0cnVlKSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAob3V0KTsKKworICAvLyBSZWFkIGJlZ2lubmluZyBmaWVsZCBtYXJrZXIKKyAgaW5kZW50KG91dCkgPDwgInNjaGVtZUZpZWxkID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKTsiIDw8IGVuZGw7CisKKyAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyIGFuZCBicmVhaworICBpbmRlbnQob3V0KSA8PCAiaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RPUCkgeyAiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICAvLyBTd2l0Y2ggc3RhdGVtZW50IG9uIHRoZSBmaWVsZCB3ZSBhcmUgcmVhZGluZworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChzY2hlbWVGaWVsZC5pZCkgeyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI6IC8vICIKKyAgICAgICAgICAgICAgICA8PCBjb25zdGFudF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSB7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJzdHJ1Y3QuIiwgdHJ1ZSk7CisgICAgaW5kZW50KG91dCkgPDwgInN0cnVjdC4iCisgICAgICAgICAgICAgICAgPDwgInNldCIgPDwgZ2V0X2NhcF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpCisgICAgICAgICAgICAgICAgPDwgIih0cnVlKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7ICIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgc2NoZW1lRmllbGQudHlwZSk7IgorICAgICAgICAgICAgICA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIC8vIFJlYWQgZmllbGQgZW5kIG1hcmtlcgorICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZEZpZWxkRW5kKCk7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaXByb3QucmVhZFN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKKworICAvLyBpbiBub24tYmVhbnMgc3R5bGUsIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMgb2YgcHJpbWl0aXZlIHR5cGUKKyAgLy8gKHdoaWNoIGNhbiBiZSBjaGVja2VkIGhlcmUgYnV0IG5vdCBpbiB0aGUgZ2VuZXJhbCB2YWxpZGF0ZSBtZXRob2QpCisgIGlmICghYmVhbl9zdHlsZV8pIHsKKyAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiLy8gY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcyBvZiBwcmltaXRpdmUgdHlwZSwgd2hpY2ggY2FuJ3QgYmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaGVja2VkIGluIHRoZSB2YWxpZGF0ZSBtZXRob2QiIDw8IGVuZGw7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEICYmICF0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIXN0cnVjdC4iIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCpmX2l0ZXIpIDw8ICIpIHsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpCisgICAgICAgICAgICA8PCAiICB0aHJvdyBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRXhjZXB0aW9uKFwiUmVxdWlyZWQgZmllbGQgJyIKKyAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgPDwgIicgd2FzIG5vdCBmb3VuZCBpbiBzZXJpYWxpemVkIGRhdGEhIFN0cnVjdDogXCIgKyB0b1N0cmluZygpKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIHBlcmZvcm1zIHZhcmlvdXMgY2hlY2tzIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQorICBpbmRlbnQob3V0KSA8PCAic3RydWN0LnZhbGlkYXRlKCk7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdGFuZGFyZF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19yZXN1bHQpIHsKKyAgaW5kZW50X3VwKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIHZvaWQgd3JpdGUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIG9wcm90LCAiCisgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAvLyBwZXJmb3JtcyB2YXJpb3VzIGNoZWNrcyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKKyAgaW5kZW50KG91dCkgPDwgInN0cnVjdC52YWxpZGF0ZSgpOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEJlZ2luKFNUUlVDVF9ERVNDKTsiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBib29sIG51bGxfYWxsb3dlZCA9IHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAobnVsbF9hbGxvd2VkKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChzdHJ1Y3QuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorICAgIGJvb2wgb3B0aW9uYWwgPSAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCkgfHwgKGlzX3Jlc3VsdCAmJiAhbnVsbF9hbGxvd2VkKTsKKyAgICBpZiAob3B0aW9uYWwpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIgorICAgICAgICAgICAgICAgICAgPDwgInN0cnVjdC4iIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCgqZl9pdGVyKSkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkQmVnaW4oIiA8PCBjb25zdGFudF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICA8PCAiX0ZJRUxEX0RFU0MpOyIgPDwgZW5kbDsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInN0cnVjdC4iLCB0cnVlKTsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgorICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOworCisgICAgaWYgKG9wdGlvbmFsKSB7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIGlmIChudWxsX2FsbG93ZWQpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsiCisgICAgICA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3N0YW5kYXJkX3NjaGVtZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0KSB7CisgIGluZGVudChvdXQpIDw8ICJwcml2YXRlIHN0YXRpYyBjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgPDwgIlN0YW5kYXJkU2NoZW1lRmFjdG9yeSBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5TY2hlbWVGYWN0b3J5IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiU3RhbmRhcmRTY2hlbWUgZ2V0U2NoZW1lKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gbmV3ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiU3RhbmRhcmRTY2hlbWUoKTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAicHJpdmF0ZSBzdGF0aWMgY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCisgICAgICA8PCAiU3RhbmRhcmRTY2hlbWUgZXh0ZW5kcyBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuU3RhbmRhcmRTY2hlbWU8IiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI+IHsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGdlbmVyYXRlX3N0YW5kYXJkX3JlYWRlcihvdXQsIHRzdHJ1Y3QpOworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgZW5kbDsKKyAgZ2VuZXJhdGVfc3RhbmRhcmRfd3JpdGVyKG91dCwgdHN0cnVjdCwgaXNfcmVzdWx0KTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF90dXBsZV9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgcHJvdCwgIgorICAgICAgICAgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUdXBsZVByb3RvY29sIGlwcm90ID0gKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUdXBsZVByb3RvY29sKSBwcm90OyIgPDwgZW5kbDsKKyAgaW50IG9wdGlvbmFsX2NvdW50ID0gMDsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMCisgICAgICAgIHx8ICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQpIHsKKyAgICAgIG9wdGlvbmFsX2NvdW50Kys7CisgICAgfQorICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICgqZl9pdGVyKSwgInN0cnVjdC4iLCBmYWxzZSk7CisgICAgICBpbmRlbnQob3V0KSA8PCAic3RydWN0LnNldCIgPDwgZ2V0X2NhcF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpCisgICAgICAgICAgICAgICAgICA8PCAiKHRydWUpOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgaWYgKG9wdGlvbmFsX2NvdW50ID4gMCkgeworICAgIGluZGVudChvdXQpIDw8ICJqYXZhLnV0aWwuQml0U2V0IGluY29taW5nID0gaXByb3QucmVhZEJpdFNldCgiIDw8IG9wdGlvbmFsX2NvdW50IDw8ICIpOyIgPDwgZW5kbDsKKyAgICBpbnQgaSA9IDA7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMCisgICAgICAgICAgfHwgKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGluY29taW5nLmdldCgiIDw8IGkgPDwgIikpIHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICgqZl9pdGVyKSwgInN0cnVjdC4iLCBmYWxzZSk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJzdHJ1Y3Quc2V0IiA8PCBnZXRfY2FwX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCBnZXRfY2FwX25hbWUoImlzU2V0IikKKyAgICAgICAgICAgICAgICAgICAgPDwgIih0cnVlKTsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICBpKys7CisgICAgICB9CisgICAgfQorICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3R1cGxlX3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgcHJvdCwgIgorICAgICAgICAgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUdXBsZVByb3RvY29sIG9wcm90ID0gKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUdXBsZVByb3RvY29sKSBwcm90OyIgPDwgZW5kbDsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgaGFzX29wdGlvbmFsID0gZmFsc2U7CisgIGludCBvcHRpb25hbF9jb3VudCA9IDA7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwKKyAgICAgICAgfHwgKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCkgeworICAgICAgb3B0aW9uYWxfY291bnQrKzsKKyAgICAgIGhhc19vcHRpb25hbCA9IHRydWU7CisgICAgfQorICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAoKmZfaXRlciksICJzdHJ1Y3QuIiwgZmFsc2UpOworICAgIH0KKyAgfQorICBpZiAoaGFzX29wdGlvbmFsKSB7CisgICAgaW5kZW50KG91dCkgPDwgImphdmEudXRpbC5CaXRTZXQgb3B0aW9uYWxzID0gbmV3IGphdmEudXRpbC5CaXRTZXQoKTsiIDw8IGVuZGw7CisgICAgaW50IGkgPSAwOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTAorICAgICAgICAgIHx8ICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImlmIChzdHJ1Y3QuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygoKmZfaXRlcikpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAib3B0aW9uYWxzLnNldCgiIDw8IGkgPDwgIik7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgaSsrOworICAgICAgfQorICAgIH0KKworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUJpdFNldChvcHRpb25hbHMsICIgPDwgb3B0aW9uYWxfY291bnQgPDwgIik7IiA8PCBlbmRsOworICAgIGludCBqID0gMDsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwKKyAgICAgICAgICB8fCAoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoc3RydWN0LiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKmZfaXRlcikgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICgqZl9pdGVyKSwgInN0cnVjdC4iLCBmYWxzZSk7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICBqKys7CisgICAgICB9CisgICAgfQorICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3R1cGxlX3NjaGVtZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJwcml2YXRlIHN0YXRpYyBjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgPDwgIlR1cGxlU2NoZW1lRmFjdG9yeSBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5TY2hlbWVGYWN0b3J5IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiVHVwbGVTY2hlbWUgZ2V0U2NoZW1lKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gbmV3ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiVHVwbGVTY2hlbWUoKTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgInByaXZhdGUgc3RhdGljIGNsYXNzICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQorICAgICAgPDwgIlR1cGxlU2NoZW1lIGV4dGVuZHMgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLlR1cGxlU2NoZW1lPCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiPiB7IiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF90dXBsZV93cml0ZXIob3V0LCB0c3RydWN0KTsKKyAgb3V0IDw8IGVuZGw7CisgIGdlbmVyYXRlX2phdmFfc3RydWN0X3R1cGxlX3JlYWRlcihvdXQsIHRzdHJ1Y3QpOworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3NjaGVtZV9sb29rdXAob3N0cmVhbSYgb3V0KSB7CisgIGluZGVudChvdXQpIDw8ICJwcml2YXRlIHN0YXRpYyA8UyBleHRlbmRzIG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5JU2NoZW1lPiBTIHNjaGVtZSgiCisgICAgICA8PCAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3RvKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiAob3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLlN0YW5kYXJkU2NoZW1lLmNsYXNzLmVxdWFscyhwcm90by5nZXRTY2hlbWUoKSkgIgorICAgICAgPDwgIj8gU1RBTkRBUkRfU0NIRU1FX0ZBQ1RPUlkgIgorICAgICAgPDwgIjogVFVQTEVfU0NIRU1FX0ZBQ1RPUlkiCisgICAgICA8PCAiKS5nZXRTY2hlbWUoKTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmF4X2dlbmVyYXRlZF9hbm5vdGF0aW9uKG9zdHJlYW0mIG91dCkgeworICB0aW1lX3Qgc2Vjb25kcyA9IHRpbWUoTlVMTCk7CisgIHN0cnVjdCB0bSogbm93ID0gbG9jYWx0aW1lKCZzZWNvbmRzKTsKKyAgaW5kZW50KG91dCkgPDwgIkBqYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZCh2YWx1ZSA9IFwiIiA8PCBhdXRvZ2VuX3N1bW1hcnkoKSA8PCAiXCIiOworICBpZiAodW5kYXRlZF9nZW5lcmF0ZWRfYW5ub3RhdGlvbnNfKSB7CisgICAgb3V0IDw8ICIpIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICIsIGRhdGUgPSBcIiIgPDwgKG5vdy0+dG1feWVhciArIDE5MDApIDw8ICItIiA8PCBzZXRmaWxsKCcwJykgPDwgc2V0dygyKQorICAgICAgICAgICAgICAgIDw8IChub3ctPnRtX21vbiArIDEpIDw8ICItIiA8PCBzZXRmaWxsKCcwJykgPDwgc2V0dygyKSA8PCBub3ctPnRtX21kYXkKKyAgICAgICAgICAgICAgICA8PCAiXCIpIiA8PCBlbmRsOworICB9Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoCisgICAgamF2YSwKKyAgICAiSmF2YSIsCisgICAgIiAgICBiZWFuczogICAgICAgICAgIE1lbWJlcnMgd2lsbCBiZSBwcml2YXRlLCBhbmQgc2V0dGVyIG1ldGhvZHMgd2lsbCByZXR1cm4gdm9pZC5cbiIKKyAgICAiICAgIHByaXZhdGUtbWVtYmVyczogTWVtYmVycyB3aWxsIGJlIHByaXZhdGUsIGJ1dCBzZXR0ZXIgbWV0aG9kcyB3aWxsIHJldHVybiAndGhpcycgbGlrZSAiCisgICAgInVzdWFsLlxuIgorICAgICIgICAgbm9jYW1lbDogICAgICAgICBEbyBub3QgdXNlIENhbWVsQ2FzZSBmaWVsZCBhY2Nlc3NvcnMgd2l0aCBiZWFucy5cbiIKKyAgICAiICAgIGZ1bGxjYW1lbDogICAgICAgQ29udmVydCB1bmRlcnNjb3JlZF9hY2Nlc3Nvcl9vcl9zZXJ2aWNlX25hbWVzIHRvIGNhbWVsQ2FzZS5cbiIKKyAgICAiICAgIGFuZHJvaWQ6ICAgICAgICAgR2VuZXJhdGVkIHN0cnVjdHVyZXMgYXJlIFBhcmNlbGFibGUuXG4iCisgICAgIiAgICBhbmRyb2lkX2xlZ2FjeTogIERvIG5vdCB1c2UgamF2YS5pby5JT0V4Y2VwdGlvbih0aHJvd2FibGUpIChhdmFpbGFibGUgZm9yIEFuZHJvaWQgMi4zIGFuZCAiCisgICAgImFib3ZlKS5cbiIKKyAgICAiICAgIG9wdGlvbl90eXBlOiAgICAgV3JhcCBvcHRpb25hbCBmaWVsZHMgaW4gYW4gT3B0aW9uIHR5cGUuXG4iCisgICAgIiAgICByZXRocm93X3VuaGFuZGxlZF9leGNlcHRpb25zOlxuIgorICAgICIgICAgICAgICAgICAgICAgICAgICBFbmFibGUgcmV0aHJvdyBvZiB1bmhhbmRsZWQgZXhjZXB0aW9ucyBhbmQgbGV0IHRoZW0gcHJvcGFnYXRlIGZ1dGhlci4iCisgICAgIiAoRGVmYXVsdCBiZWhhdmlvciBpcyB0byBjYXRjaCBhbmQgbG9nIGl0LilcbiIKKyAgICAiICAgIGphdmE1OiAgICAgICAgICAgR2VuZXJhdGUgSmF2YSAxLjUgY29tcGxpYW50IGNvZGUgKGluY2x1ZGVzIGFuZHJvaWRfbGVnYWN5IGZsYWcpLlxuIgorICAgICIgICAgcmV1c2Utb2JqZWN0czogICBEYXRhIG9iamVjdHMgd2lsbCBub3QgYmUgYWxsb2NhdGVkLCBidXQgZXhpc3RpbmcgaW5zdGFuY2VzIHdpbGwgYmUgdXNlZCAiCisgICAgIihyZWFkIGFuZCB3cml0ZSkuXG4iCisgICAgIiAgICBzb3J0ZWRfY29udGFpbmVyczpcbiIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgVXNlIFRyZWVTZXQvVHJlZU1hcCBpbnN0ZWFkIG9mIEhhc2hTZXQvSGFzaE1hcCBhcyBhIGltcGxlbWVudGF0aW9uIG9mICIKKyAgICAic2V0L21hcC5cbiIKKyAgICAiICAgIGdlbmVyYXRlZF9hbm5vdGF0aW9ucz1bdW5kYXRlZHxzdXBwcmVzc106XG4iCisgICAgIiAgICAgICAgICAgICAgICAgICAgIHVuZGF0ZWQ6IHN1cHByZXNzIHRoZSBkYXRlIGF0IEBHZW5lcmF0ZWQgYW5ub3RhdGlvbnNcbiIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgc3VwcHJlc3M6IHN1cHByZXNzIEBHZW5lcmF0ZWQgYW5ub3RhdGlvbnMgZW50aXJlbHlcbiIKKyAgICAiICAgIHVuc2FmZV9iaW5hcmllczogRG8gbm90IGNvcHkgQnl0ZUJ1ZmZlcnMgaW4gY29uc3RydWN0b3JzLCBnZXR0ZXJzLCBhbmQgc2V0dGVycy5cbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2phdmFtZV9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2phdmFtZV9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE3NDNjYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfamF2YW1lX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDMyOTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGNjdHlwZT4KKworI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorCisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworCisvKioKKyAqIEphdmEgY29kZSBnZW5lcmF0b3IuCisgKgorICovCitjbGFzcyB0X2phdmFtZV9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9qYXZhbWVfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgICh2b2lkKXBhcnNlZF9vcHRpb25zOworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIC8qIG5vIG9wdGlvbnMgeWV0ICovCisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gamF2YW1lOiIgKyBpdGVyLT5maXJzdDsKKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1qYXZhbWUiOworICB9CisKKyAgLyoqCisgICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKKyAgICovCisKKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworCisgIHZvaWQgZ2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfdW5pb24odF9zdHJ1Y3QqIHR1bmlvbik7CisgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICB2b2lkIHByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fc3RhdGljLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVmdmFsID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpOworCisgIC8qKgorICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY2xhc3MgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2VxdWFsaXR5KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfY29tcGFyZV90byhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3JlYWRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfdmFsaWRhdG9yKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3Rvc3RyaW5nKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfY2xlYXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSk7CisgIHN0ZDo6c3RyaW5nIGdldF9qYXZhX3R5cGVfc3RyaW5nKHRfdHlwZSogdHlwZSk7CisgIHZvaWQgZ2VuZXJhdGVfcmVmbGVjdGlvbl9zZXR0ZXJzKHN0ZDo6b3N0cmluZ3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lKTsKKyAgdm9pZCBnZW5lcmF0ZV9yZWZsZWN0aW9uX2dldHRlcnMoc3RkOjpvc3RyaW5nc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUpOworICB2b2lkIGdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfamF2YV9iZWFuX2JvaWxlcnBsYXRlKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHN0ZDo6c3RyaW5nIGdldF9jYXBfbmFtZShzdGQ6OnN0cmluZyBuYW1lKTsKKyAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVfaXNzZXRfY2hlY2sodF9maWVsZCogZmllbGQpOworICBzdGQ6OnN0cmluZyBnZW5lcmF0ZV9pc3NldF9jaGVjayhzdGQ6OnN0cmluZyBmaWVsZCk7CisgIHZvaWQgZ2VuZXJhdGVfaXNzZXRfc2V0KG9zdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpOworICBzdGQ6OnN0cmluZyBpc3NldF9maWVsZF9pZCh0X2ZpZWxkKiBmaWVsZCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9wcmltaXRpdmVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKworICB2b2lkIGdlbmVyYXRlX2phdmFfdW5pb24odF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3VuaW9uX2NvbnN0cnVjdG9yKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3VuaW9uX2dldHRlcnNfYW5kX3NldHRlcnMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfdW5pb25fYWJzdHJhY3RfbWV0aG9kcyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9jaGVja190eXBlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3JlYWRfdmFsdWUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfd3JpdGVfdmFsdWUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZ2V0X2ZpZWxkX2Rlc2Mob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZ2V0X3N0cnVjdF9kZXNjKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2dldF9maWVsZF9uYW1lKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIHZvaWQgZ2VuZXJhdGVfdW5pb25fY29tcGFyaXNvbnMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfdW5pb25faGFzaGNvZGUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgLyoqCisgICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBtYXApOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdGQ6OnN0cmluZyBpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX2phdmFfZG9jKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpOworCisgIHZvaWQgZ2VuZXJhdGVfamF2YV9kb2Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRkb2MpOworCisgIHZvaWQgZ2VuZXJhdGVfamF2YV9kb2NzdHJpbmdfY29tbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgc3RyaW5nIGNvbnRlbnRzKTsKKworICB2b2lkIGdlbmVyYXRlX2RlZXBfY29weV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZV9wMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lX3AyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUpOworICB2b2lkIGdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRlc3RfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUpOworCisgIGJvb2wgaGFzX2JpdF92ZWN0b3IodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIC8qKgorICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucworICAgKi8KKworICBzdGQ6OnN0cmluZyBqYXZhX3BhY2thZ2UoKTsKKyAgc3RkOjpzdHJpbmcgamF2YV90eXBlX2ltcG9ydHMoKTsKKyAgc3RkOjpzdHJpbmcgamF2YV90aHJpZnRfaW1wb3J0cygpOworICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY29udGFpbmVyID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2luaXQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2tpcF9nZW5lcmljID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdGJhc2UsIGJvb2wgaW5fY29udGFpbmVyID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0ID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaW5jbHVkZV90eXBlcyA9IHRydWUpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIGdldF9lbnVtX2NsYXNzX25hbWUodF90eXBlKiB0eXBlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3RfZGVzYyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9maWVsZF9kZXNjcyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgc3RkOjpzdHJpbmcgYm94X3R5cGUodF90eXBlKiB0eXBlLCBzdHJpbmcgdmFsdWUpOworCisgIGJvb2wgdHlwZV9jYW5fYmVfbnVsbCh0X3R5cGUqIHR0eXBlKSB7CisgICAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKworICAgIHJldHVybiB0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpIHx8IHR0eXBlLT5pc19zdHJpbmcoKQorICAgICAgICAgICB8fCB0dHlwZS0+aXNfZW51bSgpOworICB9CisKKyAgc3RkOjpzdHJpbmcgY29uc3RhbnRfbmFtZShzdGQ6OnN0cmluZyBuYW1lKTsKKworcHJpdmF0ZToKKyAgLyoqCisgICAqIEZpbGUgc3RyZWFtcworICAgKi8KKworICBzdGQ6OnN0cmluZyBwYWNrYWdlX25hbWVfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZV87CisgIHN0ZDo6c3RyaW5nIHBhY2thZ2VfZGlyXzsKK307CisKKy8qKgorICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKKyAqIHN0cmVhbXMuCisgKgorICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5CisgIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7CisgIHBhY2thZ2VfbmFtZV8gPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiamF2YSIpOworCisgIHN0cmluZyBkaXIgPSBwYWNrYWdlX25hbWVfOworICBzdHJpbmcgc3ViZGlyID0gZ2V0X291dF9kaXIoKTsKKyAgc3RyaW5nOjpzaXplX3R5cGUgbG9jOworICB3aGlsZSAoKGxvYyA9IGRpci5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykgeworICAgIHN1YmRpciA9IHN1YmRpciArICIvIiArIGRpci5zdWJzdHIoMCwgbG9jKTsKKyAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7CisgICAgZGlyID0gZGlyLnN1YnN0cihsb2MgKyAxKTsKKyAgfQorICBpZiAoZGlyLnNpemUoKSA+IDApIHsKKyAgICBzdWJkaXIgPSBzdWJkaXIgKyAiLyIgKyBkaXI7CisgICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOworICB9CisKKyAgcGFja2FnZV9kaXJfID0gc3ViZGlyOworfQorCisvKioKKyAqIFBhY2thZ2VzIHRoZSBnZW5lcmF0ZWQgZmlsZQorICoKKyAqIEByZXR1cm4gU3RyaW5nIG9mIHRoZSBwYWNrYWdlLCBpLmUuICJwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0ZGVtbzsiCisgKi8KK3N0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OmphdmFfcGFja2FnZSgpIHsKKyAgaWYgKCFwYWNrYWdlX25hbWVfLmVtcHR5KCkpIHsKKyAgICByZXR1cm4gc3RyaW5nKCJwYWNrYWdlICIpICsgcGFja2FnZV9uYW1lXyArICI7XG5cbiI7CisgIH0KKyAgcmV0dXJuICIiOworfQorCisvKioKKyAqIFByaW50cyBzdGFuZGFyZCBqYXZhIGltcG9ydHMKKyAqCisgKiBAcmV0dXJuIExpc3Qgb2YgaW1wb3J0cyBmb3IgSmF2YSB0eXBlcyB0aGF0IGFyZSB1c2VkIGluIGhlcmUKKyAqLworc3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6amF2YV90eXBlX2ltcG9ydHMoKSB7CisgIHJldHVybiBzdHJpbmcoKSArICJpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTtcbiIgKyAiaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7XG4iCisgICAgICAgICArICJpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uO1xuXG4iOworfQorCisvKioKKyAqIFByaW50cyBzdGFuZGFyZCBqYXZhIGltcG9ydHMKKyAqCisgKiBAcmV0dXJuIExpc3Qgb2YgaW1wb3J0cyBuZWNlc3NhcnkgZm9yIHRocmlmdAorICovCitzdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpqYXZhX3RocmlmdF9pbXBvcnRzKCkgeworICByZXR1cm4gc3RyaW5nKCkgKyAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lio7XG4iICsgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuKjtcbiIKKyAgICAgICAgICsgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuKjtcbiIgKyAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLio7XG5cbiI7Cit9CisKKy8qKgorICogTm90aGluZyBpbiBKYXZhCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBub3QgZG9uZSBpbiBKYXZhLCBzaW5jZSBpdCBkb2VzCisgKiBub3Qgc3VwcG9ydCBhcmJpdHJhcnkgbmFtZSByZXBsYWNlbWVudHMsIGFuZCBpdCdkIGJlIGEgd2Fja3kgd2FzdGUKKyAqIG9mIG92ZXJoZWFkIHRvIG1ha2Ugd3JhcHBlciBjbGFzc2VzLgorICoKKyAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgKHZvaWQpdHR5cGVkZWY7Cit9CisKKy8qKgorICogRW51bXMgYXJlIGEgY2xhc3Mgd2l0aCBhIHNldCBvZiBzdGF0aWMgY29uc3RhbnRzLgorICoKKyAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICAvLyBNYWtlIG91dHB1dCBmaWxlCisgIHN0cmluZyBmX2VudW1fbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArICh0ZW51bS0+Z2V0X25hbWUoKSkgKyAiLmphdmEiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfZW51bTsKKyAgZl9lbnVtLm9wZW4oZl9lbnVtX25hbWUuY19zdHIoKSk7CisKKyAgLy8gQ29tbWVudCBhbmQgcGFja2FnZSBpdAorICBmX2VudW0gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgamF2YV9wYWNrYWdlKCk7CisKKyAgZ2VuZXJhdGVfamF2YV9kb2MoZl9lbnVtLCB0ZW51bSk7CisgIGluZGVudChmX2VudW0pIDw8ICJwdWJsaWMgY2xhc3MgIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiIGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEVudW0gIjsKKyAgc2NvcGVfdXAoZl9lbnVtKTsKKyAgZl9lbnVtIDw8IGVuZGw7CisKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgZ2VuZXJhdGVfamF2YV9kb2MoZl9lbnVtLCAqY19pdGVyKTsKKyAgICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIHN0YXRpYyBmaW5hbCAiIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICIgIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICA8PCAiID0gbmV3ICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIigiIDw8IHZhbHVlIDw8ICIpOyIgPDwgZW5kbDsKKyAgfQorICBmX2VudW0gPDwgZW5kbDsKKworICAvLyBGaWVsZCBmb3IgdGhyaWZ0Q29kZQorICBpbmRlbnQoZl9lbnVtKSA8PCAicHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfZW51bSkgPDwgInByaXZhdGUgIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiKGludCB2YWx1ZSkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgIiAgdGhpcy52YWx1ZSA9IHZhbHVlOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQoZl9lbnVtKSA8PCAiLyoqIiA8PCBlbmRsOworICBpbmRlbnQoZl9lbnVtKSA8PCAiICogR2V0IHRoZSBpbnRlZ2VyIHZhbHVlIG9mIHRoaXMgZW51bSB2YWx1ZSwgYXMgZGVmaW5lZCBpbiB0aGUgVGhyaWZ0IElETC4iCisgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudChmX2VudW0pIDw8ICIgKi8iIDw8IGVuZGw7CisgIGluZGVudChmX2VudW0pIDw8ICJwdWJsaWMgaW50IGdldFZhbHVlKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgIiAgcmV0dXJuIHZhbHVlOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnQoZl9lbnVtKSA8PCAiLyoqIiA8PCBlbmRsOworICBpbmRlbnQoZl9lbnVtKSA8PCAiICogRmluZCBhIHRoZSBlbnVtIHR5cGUgYnkgaXRzIGludGVnZXIgdmFsdWUsIGFzIGRlZmluZWQgaW4gdGhlIFRocmlmdCBJREwuIgorICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnQoZl9lbnVtKSA8PCAiICogQHJldHVybiBudWxsIGlmIHRoZSB2YWx1ZSBpcyBub3QgZm91bmQuIiA8PCBlbmRsOworICBpbmRlbnQoZl9lbnVtKSA8PCAiICovIiA8PCBlbmRsOworICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIHN0YXRpYyAiICsgdGVudW0tPmdldF9uYW1lKCkgKyAiIGZpbmRCeVZhbHVlKGludCB2YWx1ZSkgeyAiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KGZfZW51bSkgPDwgInN3aXRjaCAodmFsdWUpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICBpbmRlbnQoZl9lbnVtKSA8PCAiY2FzZSAiIDw8IHZhbHVlIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudChmX2VudW0pIDw8ICIgIHJldHVybiAiIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChmX2VudW0pIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgIiAgcmV0dXJuIG51bGw7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KGZfZW51bSkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnQoZl9lbnVtKSA8PCAifSIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKGZfZW51bSk7CisKKyAgZl9lbnVtLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgY2xhc3MgdGhhdCBob2xkcyBhbGwgdGhlIGNvbnN0YW50cy4KKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKSB7CisgIGlmIChjb25zdHMuZW1wdHkoKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIHN0cmluZyBmX2NvbnN0c19uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgcHJvZ3JhbV9uYW1lXyArICJDb25zdGFudHMuamF2YSI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9jb25zdHM7CisgIGZfY29uc3RzLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKKworICAvLyBQcmludCBoZWFkZXIKKyAgZl9jb25zdHMgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgamF2YV9wYWNrYWdlKCkgPDwgamF2YV90eXBlX2ltcG9ydHMoKTsKKworICBmX2NvbnN0cyA8PCAicHVibGljIGNsYXNzICIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiQ29uc3RhbnRzIHsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBwcmludF9jb25zdF92YWx1ZShmX2NvbnN0cywKKyAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX2NvbnN0cykgPDwgIn0iIDw8IGVuZGw7CisgIGZfY29uc3RzLmNsb3NlKCk7Cit9CisKKy8qKgorICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCisgKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQorICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OnByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX3N0YXRpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlZnZhbCkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpbmRlbnQob3V0KTsKKyAgaWYgKCFkZWZ2YWwpIHsKKyAgICBvdXQgPDwgKGluX3N0YXRpYyA/ICIiIDogInB1YmxpYyBzdGF0aWMgZmluYWwgIikgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIjsKKyAgfQorICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBzdHJpbmcgdjIgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSk7CisgICAgb3V0IDw8IG5hbWUgPDwgIiA9ICIgPDwgdjIgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBvdXQgPDwgbmFtZSA8PCAiID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSkgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgb3V0IDw8IG5hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgICBpZiAoIWluX3N0YXRpYykgeworICAgICAgaW5kZW50KG91dCkgPDwgInN0YXRpYyB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLiI7CisgICAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGdldF9jYXBfbmFtZSh2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpOworICAgICAgb3V0IDw8ICJzZXQiIDw8IGNhcF9uYW1lIDw8ICIoIiA8PCB2YWwgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKyAgICBpZiAoIWluX3N0YXRpYykgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIG91dCA8PCBuYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJzdGF0aWMgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgc3RyaW5nIGtleSA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLnB1dCgiIDw8IGJveF90eXBlKGt0eXBlLCBrZXkpIDw8ICIsICIgPDwgYm94X3R5cGUodnR5cGUsIHZhbCkgPDwgIik7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKCFpbl9zdGF0aWMpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7CisgICAgb3V0IDw8IG5hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgICBpZiAoIWluX3N0YXRpYykgeworICAgICAgaW5kZW50KG91dCkgPDwgInN0YXRpYyB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorICAgIHRfdHlwZSogZXR5cGU7CisgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0KKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBldHlwZSwgKnZfaXRlcik7CisgICAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi5hZGRFbGVtZW50KCIgPDwgYm94X3R5cGUoZXR5cGUsIHZhbCkgPDwgIik7IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLnB1dCgiIDw8IGJveF90eXBlKGV0eXBlLCB2YWwpIDw8ICIsICIgPDwgYm94X3R5cGUoZXR5cGUsIHZhbCkKKyAgICAgICAgICAgICAgICAgICAgPDwgIik7IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIWluX3N0YXRpYykgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIHR5cGUgIiArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0KK30KKworc3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgKHZvaWQpbmFtZTsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSByZW5kZXI7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJlbmRlciA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZW5kZXIgPDwgKCh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDApID8gInRydWUiIDogImZhbHNlIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmVuZGVyIDw8ICIoYnl0ZSkiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZW5kZXIgPDwgIihzaG9ydCkiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiTCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIHJlbmRlciA8PCAiKGRvdWJsZSkiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJlbmRlciA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIGZhbHNlKSA8PCAiLiIgPDwgdmFsdWUtPmdldF9pZGVudGlmaWVyKCk7CisgIH0gZWxzZSB7CisgICAgc3RyaW5nIHQgPSB0bXAoInRtcCIpOworICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwgdCwgdHlwZSwgdmFsdWUsIHRydWUpOworICAgIHJlbmRlciA8PCB0OworICB9CisKKyAgcmV0dXJuIHJlbmRlci5zdHIoKTsKK30KKworc3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6Ym94X3R5cGUodF90eXBlKiB0eXBlLCBzdHJpbmcgdmFsdWUpIHsKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgc3dpdGNoICgoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAibmV3IEJvb2xlYW4oIiArIHZhbHVlICsgIikiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gIm5ldyBCeXRlKCIgKyB2YWx1ZSArICIpIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAibmV3IFNob3J0KCIgKyB2YWx1ZSArICIpIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAibmV3IEludGVnZXIoIiArIHZhbHVlICsgIikiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJuZXcgTG9uZygiICsgdmFsdWUgKyAiKSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIm5ldyBEb3VibGUoIiArIHZhbHVlICsgIikiOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHZhbHVlOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuIFRoaXMgd2lsbCBiZSBhIFRCYXNlCisgKiBpbXBsZW1lbnRvci4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBpZiAodHN0cnVjdC0+aXNfdW5pb24oKSkgeworICAgIGdlbmVyYXRlX2phdmFfdW5pb24odHN0cnVjdCk7CisgIH0gZWxzZSB7CisgICAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOworICB9Cit9CisKKy8qKgorICogRXhjZXB0aW9ucyBhcmUgc3RydWN0cywgYnV0IHRoZXkgaW5oZXJpdCBmcm9tIEV4Y2VwdGlvbgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9qYXZhX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOworfQorCisvKioKKyAqIEphdmEgc3RydWN0IGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKKyAgLy8gTWFrZSBvdXRwdXQgZmlsZQorICBzdHJpbmcgZl9zdHJ1Y3RfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArICh0c3RydWN0LT5nZXRfbmFtZSgpKSArICIuamF2YSI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zdHJ1Y3Q7CisgIGZfc3RydWN0Lm9wZW4oZl9zdHJ1Y3RfbmFtZS5jX3N0cigpKTsKKworICBmX3N0cnVjdCA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBqYXZhX3BhY2thZ2UoKSA8PCBqYXZhX3R5cGVfaW1wb3J0cygpIDw8IGphdmFfdGhyaWZ0X2ltcG9ydHMoKTsKKworICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9kZWZpbml0aW9uKGZfc3RydWN0LCB0c3RydWN0LCBpc19leGNlcHRpb24pOworICBmX3N0cnVjdC5jbG9zZSgpOworfQorCisvKioKKyAqIEphdmEgdW5pb24gZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfdW5pb24odF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZmlsZQorICBzdHJpbmcgZl9zdHJ1Y3RfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArICh0c3RydWN0LT5nZXRfbmFtZSgpKSArICIuamF2YSI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zdHJ1Y3Q7CisgIGZfc3RydWN0Lm9wZW4oZl9zdHJ1Y3RfbmFtZS5jX3N0cigpKTsKKworICBmX3N0cnVjdCA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBqYXZhX3BhY2thZ2UoKSA8PCBqYXZhX3R5cGVfaW1wb3J0cygpIDw8IGphdmFfdGhyaWZ0X2ltcG9ydHMoKTsKKworICBnZW5lcmF0ZV9qYXZhX2RvYyhmX3N0cnVjdCwgdHN0cnVjdCk7CisKKyAgYm9vbCBpc19maW5hbCA9ICh0c3RydWN0LT5hbm5vdGF0aW9uc18uZmluZCgiZmluYWwiKSAhPSB0c3RydWN0LT5hbm5vdGF0aW9uc18uZW5kKCkpOworCisgIGluZGVudChmX3N0cnVjdCkgPDwgInB1YmxpYyAiIDw8IChpc19maW5hbCA/ICJmaW5hbCAiIDogIiIpIDw8ICJjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICA8PCAiIGV4dGVuZHMgVFVuaW9uICI7CisKKyAgc2NvcGVfdXAoZl9zdHJ1Y3QpOworCisgIGdlbmVyYXRlX3N0cnVjdF9kZXNjKGZfc3RydWN0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfZmllbGRfZGVzY3MoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOworCisgIGZfc3RydWN0IDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfdW5pb25fY29uc3RydWN0b3IoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOworCisgIGZfc3RydWN0IDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfdW5pb25fYWJzdHJhY3RfbWV0aG9kcyhmX3N0cnVjdCwgdHN0cnVjdCk7CisKKyAgZl9zdHJ1Y3QgPDwgZW5kbDsKKworICBnZW5lcmF0ZV91bmlvbl9nZXR0ZXJzX2FuZF9zZXR0ZXJzKGZfc3RydWN0LCB0c3RydWN0KTsKKworICBmX3N0cnVjdCA8PCBlbmRsOworCisgIGdlbmVyYXRlX3VuaW9uX2NvbXBhcmlzb25zKGZfc3RydWN0LCB0c3RydWN0KTsKKworICBmX3N0cnVjdCA8PCBlbmRsOworCisgIGdlbmVyYXRlX3VuaW9uX2hhc2hjb2RlKGZfc3RydWN0LCB0c3RydWN0KTsKKworICBmX3N0cnVjdCA8PCBlbmRsOworCisgIHNjb3BlX2Rvd24oZl9zdHJ1Y3QpOworCisgIGZfc3RydWN0LmNsb3NlKCk7Cit9CisKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9jb25zdHJ1Y3Rvcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHN1cGVyKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIihfRmllbGRzIHNldEZpZWxkLCBPYmplY3QgdmFsdWUpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHN1cGVyKHNldEZpZWxkLCB2YWx1ZSk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiIG90aGVyKSB7IgorICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICBzdXBlcihvdGhlcik7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIGRlZXBDb3B5KCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIG5ldyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIih0aGlzKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gZ2VuZXJhdGUgImNvbnN0cnVjdG9ycyIgZm9yIGVhY2ggZmllbGQKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RhdGljICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIigiCisgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiB2YWx1ZSkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiIHggPSBuZXcgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICB4LnNldCIgPDwgZ2V0X2NhcF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIih2YWx1ZSk7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiB4OyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9nZXR0ZXJzX2FuZF9zZXR0ZXJzKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IGVuZGw7CisgICAgfQorCisgICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7CisKKyAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsIGZpZWxkKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiIGdldCIKKyAgICAgICAgICAgICAgICA8PCBnZXRfY2FwX25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICIoKSB7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIGlmIChnZXRTZXRGaWVsZCgpID09IF9GaWVsZHMuIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiKSB7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgICByZXR1cm4gKCIgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlKSA8PCAiKWdldEZpZWxkVmFsdWUoKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICB9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKFwiQ2Fubm90IGdldCBmaWVsZCAnIiA8PCBmaWVsZC0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgIDw8ICInIGJlY2F1c2UgdW5pb24gaXMgY3VycmVudGx5IHNldCB0byBcIiArIGdldEZpZWxkRGVzYyhnZXRTZXRGaWVsZCgpKS5uYW1lKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsIGZpZWxkKTsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgc2V0IiA8PCBnZXRfY2FwX25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICIoIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSkgPDwgIiB2YWx1ZSkgeyIgPDwgZW5kbDsKKyAgICBpZiAodHlwZV9jYW5fYmVfbnVsbChmaWVsZC0+Z2V0X3R5cGUoKSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIGlmICh2YWx1ZSA9PSBudWxsKSB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICIgIHNldEZpZWxkXyA9IF9GaWVsZHMuIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICB2YWx1ZV8gPSB2YWx1ZTsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3VuaW9uX2Fic3RyYWN0X21ldGhvZHMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9jaGVja190eXBlKG91dCwgdHN0cnVjdCk7CisgIG91dCA8PCBlbmRsOworICBnZW5lcmF0ZV9yZWFkX3ZhbHVlKG91dCwgdHN0cnVjdCk7CisgIG91dCA8PCBlbmRsOworICBnZW5lcmF0ZV93cml0ZV92YWx1ZShvdXQsIHRzdHJ1Y3QpOworICBvdXQgPDwgZW5kbDsKKyAgZ2VuZXJhdGVfZ2V0X2ZpZWxkX2Rlc2Mob3V0LCB0c3RydWN0KTsKKyAgb3V0IDw8IGVuZGw7CisgIGdlbmVyYXRlX2dldF9zdHJ1Y3RfZGVzYyhvdXQsIHRzdHJ1Y3QpOworICBvdXQgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NoZWNrX3R5cGUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KQorICAgICAgPDwgInByb3RlY3RlZCB2b2lkIGNoZWNrVHlwZShfRmllbGRzIHNldEZpZWxkLCBPYmplY3QgdmFsdWUpIHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24geyIKKyAgICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKHNldEZpZWxkKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKKworICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgIiA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlLCB0cnVlKQorICAgICAgICAgICAgICAgIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgICBicmVhazsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgQ2xhc3NDYXN0RXhjZXB0aW9uKFwiV2FzIGV4cGVjdGluZyB2YWx1ZSBvZiB0eXBlICIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlKSA8PCAiIGZvciBmaWVsZCAnIiA8PCBmaWVsZC0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgIDw8ICInLCBidXQgZ290IFwiICsgdmFsdWUuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOyIgPDwgZW5kbDsKKyAgICAvLyBkbyB0aGUgcmVhbCBjaGVjayBoZXJlCisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oXCJVbmtub3duIGZpZWxkIGlkIFwiICsgc2V0RmllbGQpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3JlYWRfdmFsdWUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAicHJvdGVjdGVkIE9iamVjdCByZWFkVmFsdWUoVFByb3RvY29sIGlwcm90LCBURmllbGQgZmllbGQpIHRocm93cyBURXhjZXB0aW9uIHsiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KG91dCkgPDwgIl9GaWVsZHMgc2V0RmllbGQgPSBfRmllbGRzLmZpbmRCeVRocmlmdElkKGZpZWxkLmlkKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJpZiAoc2V0RmllbGQgIT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKHNldEZpZWxkKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKKworICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgImlmIChmaWVsZC50eXBlID09ICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIl9GSUVMRF9ERVNDLnR5cGUpIHsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIjsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsIGZpZWxkLCAiIik7CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBudWxsOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFwic2V0RmllbGQgd2Fzbid0IG51bGwsIGJ1dCBkaWRuJ3QgbWF0Y2ggYW55ICIKKyAgICAgICAgICAgICAgICAgIm9mIHRoZSBjYXNlIHN0YXRlbWVudHMhXCIpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gbnVsbDsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfd3JpdGVfdmFsdWUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAicHJvdGVjdGVkIHZvaWQgd3JpdGVWYWx1ZShUUHJvdG9jb2wgb3Byb3QpIHRocm93cyBURXhjZXB0aW9uIHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoc2V0RmllbGRfKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKKworICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPSAoIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSwgZmFsc2UpIDw8ICIpdmFsdWVfOyIgPDwgZW5kbDsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCBmaWVsZCwgIiIpOworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oXCJDYW5ub3Qgd3JpdGUgdW5pb24gd2l0aCB1bmtub3duIGZpZWxkIFwiICsgIgorICAgICAgICAgICAgICAgICAic2V0RmllbGRfKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2dldF9maWVsZF9kZXNjKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCBURmllbGQgZ2V0RmllbGREZXNjKF9GaWVsZHMgc2V0RmllbGQpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoc2V0RmllbGQpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICJfRklFTERfREVTQzsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oXCJVbmtub3duIGZpZWxkIGlkIFwiICsgc2V0RmllbGQpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2dldF9zdHJ1Y3RfZGVzYyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgICh2b2lkKXRzdHJ1Y3Q7CisgIGluZGVudChvdXQpIDw8ICJwcm90ZWN0ZWQgVFN0cnVjdCBnZXRTdHJ1Y3REZXNjKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIFNUUlVDVF9ERVNDOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9jb21wYXJpc29ucyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIC8vIGVxdWFsaXR5CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICBpZiAob3RoZXIgaW5zdGFuY2VvZiAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgICByZXR1cm4gZXF1YWxzKCgiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIilvdGhlcik7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB9IGVsc2UgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgICByZXR1cm4gZmFsc2U7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICBvdXQgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAicHVibGljIGJvb2xlYW4gZXF1YWxzKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIG90aGVyKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gb3RoZXIgIT0gbnVsbCAmJiBnZXRTZXRGaWVsZCgpID09IG90aGVyLmdldFNldEZpZWxkKCkgJiYgIgorICAgICAgICAgICAgICAgICAiZ2V0RmllbGRWYWx1ZSgpLmVxdWFscyhvdGhlci5nZXRGaWVsZFZhbHVlKCkpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIG91dCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgaW50IGNvbXBhcmVUbygiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiIG90aGVyKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICBpbnQgbGFzdENvbXBhcmlzb24gPSBUQmFzZUhlbHBlci5jb21wYXJlVG8oZ2V0U2V0RmllbGQoKSwgb3RoZXIuZ2V0U2V0RmllbGQoKSk7IgorICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICBpZiAobGFzdENvbXBhcmlzb24gPT0gMCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgICByZXR1cm4gVEJhc2VIZWxwZXIuY29tcGFyZVRvKGdldEZpZWxkVmFsdWUoKSwgb3RoZXIuZ2V0RmllbGRWYWx1ZSgpKTsiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICBvdXQgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3VuaW9uX2hhc2hjb2RlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgKHZvaWQpdHN0cnVjdDsKKyAgaW5kZW50KG91dCkgPDwgIi8qKiIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkKKyAgICAgIDw8ICIgKiBJZiB5b3UnZCBsaWtlIHRoaXMgdG8gcGVyZm9ybSBtb3JlIHJlc3BlY3RhYmx5LCB1c2UgdGhlIGhhc2hjb2RlIGdlbmVyYXRvciBvcHRpb24uIgorICAgICAgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAqLyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBpbnQgaGFzaENvZGUoKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gMDsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworfQorCisvKioKKyAqIEphdmEgc3RydWN0IGRlZmluaXRpb24uIFRoaXMgaGFzIHZhcmlvdXMgcGFyYW1ldGVycywgYXMgaXQgY291bGQgYmUKKyAqIGdlbmVyYXRlZCBzdGFuZGFsb25lIG9yIGluc2lkZSBhbm90aGVyIGNsYXNzIGFzIGEgaGVscGVyLiBJZiBpdAorICogaXMgYSBoZWxwZXIgdGhhbiBpdCBpcyBhIHN0YXRpYyBjbGFzcy4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCAgICAgIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICogQHBhcmFtIGlzX2V4Y2VwdGlvbiBJcyB0aGlzIGFuIGV4Y2VwdGlvbj8KKyAqIEBwYXJhbSBpbl9jbGFzcyAgICAgSWYgaW5zaWRlIGEgY2xhc3MsIG5lZWRzIHRvIGJlIHN0YXRpYyBjbGFzcworICogQHBhcmFtIGlzX3Jlc3VsdCAgICBJZiB0aGlzIGlzIGEgcmVzdWx0IGl0IG5lZWRzIGEgZGlmZmVyZW50IHdyaXRlcgorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0KSB7CisgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgdHN0cnVjdCk7CisKKyAgYm9vbCBpc19maW5hbCA9ICh0c3RydWN0LT5hbm5vdGF0aW9uc18uZmluZCgiZmluYWwiKSAhPSB0c3RydWN0LT5hbm5vdGF0aW9uc18uZW5kKCkpOworCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCAoaXNfZmluYWwgPyAiZmluYWwgIiA6ICIiKSA8PCAoaW5fY2xhc3MgPyAic3RhdGljICIgOiAiIikgPDwgImNsYXNzICIKKyAgICAgICAgICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiICI7CisKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIG91dCA8PCAiZXh0ZW5kcyBFeGNlcHRpb24gIjsKKyAgfQorICBvdXQgPDwgImltcGxlbWVudHMgVEJhc2UgIjsKKworICBzY29wZV91cChvdXQpOworCisgIGdlbmVyYXRlX3N0cnVjdF9kZXNjKG91dCwgdHN0cnVjdCk7CisKKyAgLy8gTWVtYmVycyBhcmUgcHVibGljIGZvciAtamF2YSwgcHJpdmF0ZSBmb3IgLWphdmFiZWFuCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZmllbGRfZGVzY3Mob3V0LCB0c3RydWN0KTsKKworICBvdXQgPDwgZW5kbDsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgIjsKKyAgICBvdXQgPDwgZGVjbGFyZV9maWVsZCgqbV9pdGVyLCBmYWxzZSkgPDwgZW5kbDsKKyAgfQorCisgIC8vIGlzc2V0IGRhdGEKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgIG91dCA8PCBlbmRsOworCisgICAgaW5kZW50KG91dCkgPDwgIi8vIGlzc2V0IGlkIGFzc2lnbm1lbnRzIiA8PCBlbmRsOworCisgICAgaW50IGkgPSAwOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGlmICghdHlwZV9jYW5fYmVfbnVsbCgoKm1faXRlciktPmdldF90eXBlKCkpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgIiA8PCBpc3NldF9maWVsZF9pZCgqbV9pdGVyKSA8PCAiID0gIiA8PCBpIDw8ICI7IgorICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICBpKys7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGkgPiAwKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBib29sZWFuW10gX19pc3NldF92ZWN0b3IgPSBuZXcgYm9vbGVhblsiIDw8IGkgPDwgIl07IiA8PCBlbmRsOworICAgIH0KKworICAgIG91dCA8PCBlbmRsOworICB9CisKKyAgYm9vbCBhbGxfb3B0aW9uYWxfbWVtYmVycyA9IHRydWU7CisKKyAgLy8gRGVmYXVsdCBjb25zdHJ1Y3RvcgorICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMuIiArICgqbV9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHQsCisgICAgICAgICAgICAgICAgICAgICAgICAoKm1faXRlciktPmdldF92YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOworICAgIH0KKyAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9PUFRJT05BTCkgeworICAgICAgYWxsX29wdGlvbmFsX21lbWJlcnMgPSBmYWxzZTsKKyAgICB9CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBpZiAoIW1lbWJlcnMuZW1wdHkoKSAmJiAhYWxsX29wdGlvbmFsX21lbWJlcnMpIHsKKyAgICAvLyBGdWxsIGNvbnN0cnVjdG9yIGZvciBhbGwgZmllbGRzCisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKKyAgICAgICAgaWYgKCFmaXJzdCkgeworICAgICAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgfQorICAgIH0KKyAgICBvdXQgPDwgIikiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAidGhpcygpOyIgPDwgZW5kbDsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9PUFRJT05BTCkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjsiCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIGdlbmVyYXRlX2lzc2V0X3NldChvdXQsICgqbV9pdGVyKSk7CisgICAgICB9CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIC8vIGNvcHkgY29uc3RydWN0b3IKKyAgaW5kZW50KG91dCkgPDwgIi8qKiIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAqIFBlcmZvcm1zIGEgZGVlcCBjb3B5IG9uIDxpPm90aGVyPC9pPi4iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgKi8iIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgb3RoZXIpIHsiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGlmIChoYXNfYml0X3ZlY3Rvcih0c3RydWN0KSkgeworICAgIGluZGVudChvdXQpIDw8ICJTeXN0ZW0uYXJyYXljb3B5KG90aGVyLl9faXNzZXRfdmVjdG9yLCAwLCBfX2lzc2V0X3ZlY3RvciwgMCwgIgorICAgICAgICAgICAgICAgICAgICJvdGhlci5fX2lzc2V0X3ZlY3Rvci5sZW5ndGgpOyIgPDwgZW5kbDsKKyAgfQorCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKKyAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZmllbGQtPmdldF9uYW1lKCk7CisgICAgdF90eXBlKiB0eXBlID0gZmllbGQtPmdldF90eXBlKCk7CisgICAgYm9vbCBjYW5fYmVfbnVsbCA9IHR5cGVfY2FuX2JlX251bGwodHlwZSk7CisKKyAgICBpZiAoY2FuX2JlX251bGwpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAob3RoZXIuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZCkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKworICAgIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X2NvbnRhaW5lcihvdXQsICJvdGhlciIsIGZpZWxkX25hbWUsICJfX3RoaXNfXyIgKyBmaWVsZF9uYW1lLCB0eXBlKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gX190aGlzX18iIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gIjsKKyAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKG91dCwgIm90aGVyLiIgKyBmaWVsZF9uYW1lLCBmaWVsZF9uYW1lLCB0eXBlKTsKKyAgICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpZiAoY2FuX2JlX251bGwpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIGNsb25lIG1ldGhvZCwgc28gdGhhdCB5b3UgY2FuIGRlZXAgY29weSBhbiBvYmplY3Qgd2hlbiB5b3UgZG9uJ3Qga25vdyBpdHMgY2xhc3MuCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgZGVlcENvcHkoKSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gbmV3ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKHRoaXMpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9jbGVhcihvdXQsIHRzdHJ1Y3QpOworCisgIGdlbmVyYXRlX2phdmFfYmVhbl9ib2lsZXJwbGF0ZShvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnNfc2V0dGVycyhvdXQsIHRzdHJ1Y3QpOworCisgIGdlbmVyYXRlX2phdmFfc3RydWN0X2VxdWFsaXR5KG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2phdmFfc3RydWN0X2NvbXBhcmVfdG8ob3V0LCB0c3RydWN0KTsKKworICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKKyAgaWYgKGlzX3Jlc3VsdCkgeworICAgIGdlbmVyYXRlX2phdmFfc3RydWN0X3Jlc3VsdF93cml0ZXIob3V0LCB0c3RydWN0KTsKKyAgfSBlbHNlIHsKKyAgICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKKyAgfQorICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF90b3N0cmluZyhvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9qYXZhX3ZhbGlkYXRvcihvdXQsIHRzdHJ1Y3QpOworICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBlcXVhbHMgbWV0aG9kcyBhbmQgYSBoYXNoQ29kZSBtZXRob2QgZm9yIGEgc3RydWN0dXJlLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfZXF1YWxpdHkob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgdGhhdCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoYXQgPT0gbnVsbCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgImlmICh0aGF0IGluc3RhbmNlb2YgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiICByZXR1cm4gdGhpcy5lcXVhbHMoKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKXRoYXQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgInJldHVybiBmYWxzZTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgYm9vbGVhbiBlcXVhbHMoIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgdGhhdCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoYXQgPT0gbnVsbCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzID09IHRoYXQpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0cnVlOyIgIDw8IGVuZGw7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIG91dCA8PCBlbmRsOworCisgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgIC8vIE1vc3QgZXhpc3RpbmcgVGhyaWZ0IGNvZGUgZG9lcyBub3QgdXNlIGlzc2V0IG9yIG9wdGlvbmFsL3JlcXVpcmVkLAorICAgIC8vIHNvIHdlIHRyZWF0ICJkZWZhdWx0IiBmaWVsZHMgYXMgcmVxdWlyZWQuCisgICAgYm9vbCBpc19vcHRpb25hbCA9ICgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7CisgICAgYm9vbCBjYW5fYmVfbnVsbCA9IHR5cGVfY2FuX2JlX251bGwodCk7CisgICAgc3RyaW5nIG5hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7CisKKyAgICBzdHJpbmcgdGhpc19wcmVzZW50ID0gInRydWUiOworICAgIHN0cmluZyB0aGF0X3ByZXNlbnQgPSAidHJ1ZSI7CisgICAgc3RyaW5nIHVuZXF1YWw7CisKKyAgICBpZiAoaXNfb3B0aW9uYWwgfHwgY2FuX2JlX251bGwpIHsKKyAgICAgIHRoaXNfcHJlc2VudCArPSAiICYmIHRoaXMuIiArIGdlbmVyYXRlX2lzc2V0X2NoZWNrKCptX2l0ZXIpOworICAgICAgdGhhdF9wcmVzZW50ICs9ICIgJiYgdGhhdC4iICsgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKm1faXRlcik7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJib29sZWFuIHRoaXNfcHJlc2VudF8iIDw8IG5hbWUgPDwgIiA9ICIgPDwgdGhpc19wcmVzZW50IDw8ICI7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJib29sZWFuIHRoYXRfcHJlc2VudF8iIDw8IG5hbWUgPDwgIiA9ICIgPDwgdGhhdF9wcmVzZW50IDw8ICI7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoIgorICAgICAgICA8PCAidGhpc19wcmVzZW50XyIgPDwgbmFtZSA8PCAiIHx8IHRoYXRfcHJlc2VudF8iIDw8IG5hbWUgPDwgIikgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghKCIKKyAgICAgICAgPDwgInRoaXNfcHJlc2VudF8iIDw8IG5hbWUgPDwgIiAmJiB0aGF0X3ByZXNlbnRfIiA8PCBuYW1lIDw8ICIpKSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiICByZXR1cm4gZmFsc2U7IiA8PCBlbmRsOworCisgICAgaWYgKHQtPmlzX2JpbmFyeSgpKSB7CisgICAgICB1bmVxdWFsID0gIlRCYXNlSGVscGVyLmNvbXBhcmVUbyh0aGlzLiIgKyBuYW1lICsgIiwgdGhhdC4iICsgbmFtZSArICIpICE9IDAiOworICAgIH0gZWxzZSBpZiAoY2FuX2JlX251bGwpIHsKKyAgICAgIHVuZXF1YWwgPSAiIXRoaXMuIiArIG5hbWUgKyAiLmVxdWFscyh0aGF0LiIgKyBuYW1lICsgIikiOworICAgIH0gZWxzZSB7CisgICAgICB1bmVxdWFsID0gInRoaXMuIiArIG5hbWUgKyAiICE9IHRoYXQuIiArIG5hbWU7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIiA8PCB1bmVxdWFsIDw8ICIpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBmYWxzZTsiIDw8IGVuZGw7CisKKyAgICBzY29wZV9kb3duKG91dCk7CisgIH0KKyAgb3V0IDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24ob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgaW50IGhhc2hDb2RlKCkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gMDsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9jb21wYXJlX3RvKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCBvdGhlck9iamVjdCkgeyIgPDwgZW5kbDsKKyAgLy8gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgaW50IGNvbXBhcmVUbygiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiIG90aGVyKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCAiaWYgKCFnZXRDbGFzcygpLmVxdWFscyhvdGhlck9iamVjdC5nZXRDbGFzcygpKSkgeyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpLmNvbXBhcmVUbyhvdGhlck9iamVjdC5nZXRDbGFzcygpLmdldE5hbWUoKSk7IgorICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgb3V0IDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiIG90aGVyID0gKCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIpb3RoZXJPYmplY3Q7IjsKKworICBpbmRlbnQob3V0KSA8PCAiaW50IGxhc3RDb21wYXJpc29uID0gMDsiIDw8IGVuZGw7CisgIG91dCA8PCBlbmRsOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICptX2l0ZXI7CisgICAgaW5kZW50KG91dCkgPDwgImxhc3RDb21wYXJpc29uID0gVEJhc2VIZWxwZXIuY29tcGFyZVRvKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpCisgICAgICAgICAgICAgICAgPDwgIiwgb3RoZXIuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZCkgPDwgIik7IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gbGFzdENvbXBhcmlzb247IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkKSA8PCAiKSB7IiA8PCBlbmRsOworICAgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfc3RydWN0KCkgfHwgZmllbGQtPmdldF90eXBlKCktPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIGxhc3RDb21wYXJpc29uID0gdGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIuY29tcGFyZVRvKG90aGVyLiIKKyAgICAgICAgICAgICAgICAgIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgIiAgbGFzdENvbXBhcmlzb24gPSBUQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICA8PCAiLCBvdGhlci4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnQob3V0KSA8PCAiICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gMDsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byByZWFkIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyB2b2lkIHJlYWQoVFByb3RvY29sIGlwcm90KSB0aHJvd3MgVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gRGVjbGFyZSBzdGFjayB0bXAgdmFyaWFibGVzIGFuZCByZWFkIHN0cnVjdCBoZWFkZXIKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJURmllbGQgZmllbGQ7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpcHJvdC5yZWFkU3RydWN0QmVnaW4oKTsiIDw8IGVuZGw7CisKKyAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCisgIGluZGVudChvdXQpIDw8ICJ3aGlsZSAodHJ1ZSkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgLy8gUmVhZCBiZWdpbm5pbmcgZmllbGQgbWFya2VyCisgIGluZGVudChvdXQpIDw8ICJmaWVsZCA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCk7IiA8PCBlbmRsOworCisgIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKKyAgaW5kZW50KG91dCkgPDwgImlmIChmaWVsZC50eXBlID09IFRUeXBlLlNUT1ApIHsgIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgLy8gU3dpdGNoIHN0YXRlbWVudCBvbiB0aGUgZmllbGQgd2UgYXJlIHJlYWRpbmcKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGQuaWQpIHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiAvLyAiCisgICAgICAgICAgICAgICAgPDwgY29uc3RhbnRfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgImlmIChmaWVsZC50eXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMuIik7CisgICAgZ2VuZXJhdGVfaXNzZXRfc2V0KG91dCwgKmZfaXRlcik7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7ICIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOyIKKyAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIC8vIFJlYWQgZmllbGQgZW5kIG1hcmtlcgorICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZEZpZWxkRW5kKCk7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiaXByb3QucmVhZFN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKKworICAvLyBwZXJmb3JtcyB2YXJpb3VzIGNoZWNrcyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKKyAgaW5kZW50KG91dCkgPDwgInZhbGlkYXRlKCk7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvLyBnZW5lcmF0ZXMgamF2YSBtZXRob2QgdG8gcGVyZm9ybSB2YXJpb3VzIGNoZWNrcworLy8gKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV92YWxpZGF0b3Iob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgdmFsaWRhdGUoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIvLyBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIiA8PCBlbmRsOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIiAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihcIlJlcXVpcmVkIGZpZWxkICciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgIDw8ICInIGlzIHVuc2V0ISBTdHJ1Y3Q6XCIgKyB0b1N0cmluZygpKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHdyaXRlIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIHZvaWQgd3JpdGUoVFByb3RvY29sIG9wcm90KSB0aHJvd3MgVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gcGVyZm9ybXMgdmFyaW91cyBjaGVja3MgKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCisgIGluZGVudChvdXQpIDw8ICJ2YWxpZGF0ZSgpOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEJlZ2luKFNUUlVDVF9ERVNDKTsiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBib29sIG51bGxfYWxsb3dlZCA9IHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAobnVsbF9hbGxvd2VkKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgIH0KKyAgICBib29sIG9wdGlvbmFsID0gKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKKyAgICBpZiAob3B0aW9uYWwpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygoKmZfaXRlcikpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEJlZ2luKCIgPDwgY29uc3RhbnRfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgPDwgIl9GSUVMRF9ERVNDKTsiIDw8IGVuZGw7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLiIpOworCisgICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7CisKKyAgICBpZiAob3B0aW9uYWwpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKG51bGxfYWxsb3dlZCkgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgfQorICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAorICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEVuZCgpOyIKKyAgICAgIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gd3JpdGUgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdCwKKyAqIHdoaWNoIGlzIGEgZnVuY3Rpb24gcmVzdWx0LiBUaGVzZSBmaWVsZHMgYXJlIG9ubHkgd3JpdHRlbgorICogaWYgdGhleSBhcmUgc2V0IGluIHRoZSBJc3NldCBhcnJheSwgYW5kIG9ubHkgb25lIG9mIHRoZW0KKyAqIGNhbiBiZSBzZXQgYXQgYSB0aW1lLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIHZvaWQgd3JpdGUoVFByb3RvY29sIG9wcm90KSB0aHJvd3MgVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlU3RydWN0QmVnaW4oU1RSVUNUX0RFU0MpOyIgPDwgZW5kbDsKKworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgIjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICIgZWxzZSBpZiAiOworICAgIH0KKworICAgIG91dCA8PCAiKHRoaXMuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSB7IiA8PCBlbmRsOworCisgICAgaW5kZW50X3VwKCk7CisKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEJlZ2luKCIgPDwgY29uc3RhbnRfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgPDwgIl9GSUVMRF9ERVNDKTsiIDw8IGVuZGw7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLiIpOworCisgICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IjsKKyAgfQorICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAorICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJvcHJvdC53cml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3JlZmxlY3Rpb25fZ2V0dGVycyhvc3RyaW5nc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjYXBfbmFtZSkgeworICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGRfbmFtZSkgPDwgIjoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAhdHlwZS0+aXNfc3RyaW5nKCkpIHsKKyAgICB0X2Jhc2VfdHlwZSogYmFzZV90eXBlID0gKHRfYmFzZV90eXBlKil0eXBlOworCisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIoIgorICAgICAgICAgICAgICAgIDw8IChiYXNlX3R5cGUtPmlzX2Jvb2woKSA/ICJpcyIgOiAiZ2V0IikgPDwgY2FwX25hbWUgPDwgIigpKTsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIGdldCIgPDwgY2FwX25hbWUgPDwgIigpOyIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKK30KKwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3JlZmxlY3Rpb25fc2V0dGVycyhvc3RyaW5nc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjYXBfbmFtZSkgeworICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGRfbmFtZSkgPDwgIjoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiaWYgKHZhbHVlID09IG51bGwpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICIgIHVuc2V0IiA8PCBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICBzZXQiIDw8IGNhcF9uYW1lIDw8ICIoKCIgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUsIGZhbHNlKSA8PCAiKXZhbHVlKTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiYnJlYWs7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKK30KKwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7CisgICh2b2lkKW91dDsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIGdldHRlcl9zdHJlYW07CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzZXR0ZXJfc3RyZWFtOworCisgIC8vIGJ1aWxkIHVwIHRoZSBib2RpZXMgb2YgYm90aCB0aGUgZ2V0dGVyIGFuZCBzZXR0ZXIgYXQgb25jZQorICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOworICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoZmllbGQtPmdldF90eXBlKCkpOworICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKKyAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKTsKKworICAgIGluZGVudF91cCgpOworICAgIGdlbmVyYXRlX3JlZmxlY3Rpb25fc2V0dGVycyhzZXR0ZXJfc3RyZWFtLCB0eXBlLCBmaWVsZF9uYW1lLCBjYXBfbmFtZSk7CisgICAgZ2VuZXJhdGVfcmVmbGVjdGlvbl9nZXR0ZXJzKGdldHRlcl9zdHJlYW0sIHR5cGUsIGZpZWxkX25hbWUsIGNhcF9uYW1lKTsKKyAgICBpbmRlbnRfZG93bigpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2V0IG9mIEphdmEgQmVhbiBib2lsZXJwbGF0ZSBmdW5jdGlvbnMgKHNldHRlcnMsIGdldHRlcnMsIGV0Yy4pCisgKiBmb3IgdGhlIGdpdmVuIHN0cnVjdC4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfYmVhbl9ib2lsZXJwbGF0ZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7CisgICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOworICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lID0gZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpOworCisgICAgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICAvLyBNZXRob2QgdG8gcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBjb2xsZWN0aW9uCisgICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGludCBnZXQiIDw8IGNhcF9uYW1lOworICAgICAgb3V0IDw8IGdldF9jYXBfbmFtZSgic2l6ZSgpIHsiKSA8PCBlbmRsOworCisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gKHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT0gbnVsbCkgPyAwIDogIgorICAgICAgICAgICAgICAgICAgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIuc2l6ZSgpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgIH0KKworICAgIGlmICh0eXBlLT5pc19zZXQoKSB8fCB0eXBlLT5pc19saXN0KCkpIHsKKworICAgICAgdF90eXBlKiBlbGVtZW50X3R5cGU7CisgICAgICBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgICAgZWxlbWVudF90eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGVsZW1lbnRfdHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgICAgfQorCisgICAgICAvLyBJdGVyYXRvciBnZXR0ZXIgZm9yIHNldHMgYW5kIGxpc3RzCisgICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIEVudW1lcmF0aW9uIGdldCIgPDwgY2FwX25hbWU7CisgICAgICBvdXQgPDwgZ2V0X2NhcF9uYW1lKCJFbnVtZXJhdGlvbigpIHsiKSA8PCBlbmRsOworCisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gKHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT0gbnVsbCkgPyBudWxsIDogIgorICAgICAgICAgICAgICAgICAgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIuZWxlbWVudHMoKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgICAgLy8gQWRkIHRvIHNldCBvciBsaXN0LCBjcmVhdGUgaWYgdGhlIHNldC9saXN0IGlzIG51bGwKKyAgICAgIGluZGVudChvdXQpOworICAgICAgb3V0IDw8ICJwdWJsaWMgdm9pZCBhZGQiIDw8IGdldF9jYXBfbmFtZSgidG8iKTsKKyAgICAgIG91dCA8PCBjYXBfbmFtZSA8PCAiKCIgPDwgdHlwZV9uYW1lKGVsZW1lbnRfdHlwZSkgPDwgIiBlbGVtKSB7IiA8PCBlbmRsOworCisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIucHV0KCIgPDwgYm94X3R5cGUoZWxlbWVudF90eXBlLCAiZWxlbSIpIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgICAgPDwgYm94X3R5cGUoZWxlbWVudF90eXBlLCAiZWxlbSIpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiLmFkZEVsZW1lbnQoIiA8PCBib3hfdHlwZShlbGVtZW50X3R5cGUsICJlbGVtIikKKyAgICAgICAgICAgICAgICAgICAgPDwgIik7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgICAvLyBQdXQgdG8gbWFwCisgICAgICB0X3R5cGUqIGtleV90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgICAgdF90eXBlKiB2YWxfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKworICAgICAgaW5kZW50KG91dCk7CisgICAgICBvdXQgPDwgInB1YmxpYyB2b2lkIHB1dFRvIiA8PCBjYXBfbmFtZSA8PCAiKCIgPDwgdHlwZV9uYW1lKGtleV90eXBlLCB0cnVlKSA8PCAiIGtleSwgIgorICAgICAgICAgIDw8IHR5cGVfbmFtZSh2YWxfdHlwZSwgdHJ1ZSkgPDwgIiB2YWwpIHsiIDw8IGVuZGw7CisKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KG91dCkgPDwgImlmICh0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID09IG51bGwpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiLnB1dChrZXksIHZhbCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gU2ltcGxlIGdldHRlcgorICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgZmllbGQpOworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0eXBlX25hbWUodHlwZSk7CisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpID09IHRfYmFzZV90eXBlOjpUWVBFX0JPT0wpIHsKKyAgICAgIG91dCA8PCAiIGlzIjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICIgZ2V0IjsKKyAgICB9CisgICAgb3V0IDw8IGNhcF9uYW1lIDw8ICIoKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gU2ltcGxlIHNldHRlcgorICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgZmllbGQpOworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIjsKKyAgICBvdXQgPDwgInZvaWQiOworICAgIG91dCA8PCAiIHNldCIgPDwgY2FwX25hbWUgPDwgIigiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICIgPDwgZmllbGRfbmFtZSA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOworICAgIGdlbmVyYXRlX2lzc2V0X3NldChvdXQsIGZpZWxkKTsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIC8vIFVuc2V0dGVyCisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIHVuc2V0IiA8PCBjYXBfbmFtZSA8PCAiKCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBudWxsOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgIl9faXNzZXRfdmVjdG9yWyIgPDwgaXNzZXRfZmllbGRfaWQoZmllbGQpIDw8ICJdID0gZmFsc2U7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAvLyBpc1NldCBtZXRob2QKKyAgICBpbmRlbnQob3V0KSA8PCAiLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCAiIDw8IGZpZWxkX25hbWUKKyAgICAgICAgICAgICAgICA8PCAiIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGJvb2xlYW4gaXMiIDw8IGdldF9jYXBfbmFtZSgic2V0IikgPDwgY2FwX25hbWUgPDwgIigpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiAhPSBudWxsOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiBfX2lzc2V0X3ZlY3RvclsiIDw8IGlzc2V0X2ZpZWxkX2lkKGZpZWxkKSA8PCAiXTsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCBzZXQiIDw8IGNhcF9uYW1lIDw8IGdldF9jYXBfbmFtZSgiaXNTZXQiKSA8PCAiKGJvb2xlYW4gdmFsdWUpIHsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmICghdmFsdWUpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICB0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gbnVsbDsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgIl9faXNzZXRfdmVjdG9yWyIgPDwgaXNzZXRfZmllbGRfaWQoZmllbGQpIDw8ICJdID0gdmFsdWU7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0b1N0cmluZygpIG1ldGhvZCBmb3IgdGhlIGdpdmVuIHN0cnVjdAorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfdG9zdHJpbmcob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgIlN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoXCIiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIihcIik7IgorICAgICAgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJib29sZWFuIGZpcnN0ID0gdHJ1ZTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGJvb2wgY291bGRfYmVfdW5zZXQgPSAoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMOworICAgIGlmIChjb3VsZF9iZV91bnNldCkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCpmX2l0ZXIpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICB9CisKKyAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqZl9pdGVyKTsKKworICAgIGlmICghZmlyc3QpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIWZpcnN0KSBzYi5hcHBlbmQoXCIsIFwiKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICJzYi5hcHBlbmQoXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOlwiKTsiIDw8IGVuZGw7CisgICAgYm9vbCBjYW5fYmVfbnVsbCA9IHR5cGVfY2FuX2JlX251bGwoZmllbGQtPmdldF90eXBlKCkpOworICAgIGlmIChjYW5fYmVfbnVsbCkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmICh0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIgIHNiLmFwcGVuZChcIm51bGxcIik7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorCisgICAgaWYgKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19iaW5hcnkoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIlRCYXNlSGVscGVyLnRvU3RyaW5nKHRoaXMuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiLCBzYik7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAic2IuYXBwZW5kKHRoaXMuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKworICAgIGlmIChjYW5fYmVfbnVsbCkgeworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAiZmlyc3QgPSBmYWxzZTsiIDw8IGVuZGw7CisKKyAgICBpZiAoY291bGRfYmVfdW5zZXQpIHsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgZmlyc3QgPSBmYWxzZTsKKyAgfQorICBvdXQgPDwgaW5kZW50KCkgPDwgInNiLmFwcGVuZChcIilcIik7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gc2IudG9TdHJpbmcoKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBSZXR1cm5zIGEgc3RyaW5nIHdpdGggdGhlIGphdmEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIHRocmlmdCB0eXBlCisgKiAoZS5nLiBmb3IgdGhlIHR5cGUgc3RydWN0IGl0IHJldHVybnMgIlRUeXBlLlNUUlVDVCIpCisgKi8KK3N0ZDo6c3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2V0X2phdmFfdHlwZV9zdHJpbmcodF90eXBlKiB0eXBlKSB7CisgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLkxJU1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5NQVAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5TRVQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLlNUUlVDVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5FTlVNIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICByZXR1cm4gZ2V0X2phdmFfdHlwZV9zdHJpbmcoKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHN3aXRjaCAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCkpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICByZXR1cm4gIlRUeXBlLlZPSUQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIlRUeXBlLlNUUklORyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIlRUeXBlLkJPT0wiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiVFR5cGUuQllURSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiVFR5cGUuSTE2IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJUVHlwZS5JMzIiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlRUeXBlLkk2NCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiVFR5cGUuRE9VQkxFIjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIlVua25vd24gdGhyaWZ0IHR5cGUgXCIiICsgdHlwZS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiIHBhc3NlZCB0byB0X2phdmFtZV9nZW5lcmF0b3I6OmdldF9qYXZhX3R5cGVfc3RyaW5nISIpOworICAgICAgYnJlYWs7IC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiEKKyAgICB9CisgIH0gZWxzZSB7CisgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKAorICAgICAgICAiVW5rbm93biB0aHJpZnQgdHlwZSBcIiIgKyB0eXBlLT5nZXRfbmFtZSgpCisgICAgICAgICsgIlwiIHBhc3NlZCB0byB0X2phdmFtZV9nZW5lcmF0b3I6OmdldF9qYXZhX3R5cGVfc3RyaW5nISIpOyAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4hCisgIH0KK30KKwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlKSB7CisgIG91dCA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50X3VwKCk7CisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm5ldyBTdHJ1Y3RNZXRhRGF0YShUVHlwZS5TVFJVQ1QsICIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIuY2xhc3MiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBMaXN0TWV0YURhdGEoVFR5cGUuTElTVCwgIjsKKyAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCBlbGVtX3R5cGUpOworICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgU2V0TWV0YURhdGEoVFR5cGUuU0VULCAiOworICAgICAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGVsZW1fdHlwZSk7CisgICAgfSBlbHNlIHsgLy8gbWFwCisgICAgICBpbmRlbnQob3V0KSA8PCAibmV3IE1hcE1ldGFEYXRhKFRUeXBlLk1BUCwgIjsKKyAgICAgIHRfdHlwZSoga2V5X3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgICB0X3R5cGUqIHZhbF90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwga2V5X3R5cGUpOworICAgICAgb3V0IDw8ICIsICI7CisgICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCB2YWxfdHlwZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIGluZGVudChvdXQpIDw8ICJuZXcgRW51bU1ldGFEYXRhKFRUeXBlLkVOVU0sICIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIuY2xhc3MiOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJuZXcgRmllbGRWYWx1ZU1ldGFEYXRhKCIgPDwgZ2V0X2phdmFfdHlwZV9zdHJpbmcodHlwZSk7CisgICAgaWYgKHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIiwgXCIiIDw8ICgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3N5bWJvbGljKCkgPDwgIlwiIjsKKyAgICB9CisgIH0KKyAgb3V0IDw8ICIpIjsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50X2Rvd24oKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4gSW4gQysrLCB0aGlzIGNvbXByaXNlcyBhbiBlbnRpcmVseSBzZXBhcmF0ZQorICogaGVhZGVyIGFuZCBzb3VyY2UgZmlsZS4gVGhlIGhlYWRlciBmaWxlIGRlZmluZXMgdGhlIG1ldGhvZHMgYW5kIGluY2x1ZGVzCisgKiB0aGUgZGF0YSB0eXBlcyBkZWZpbmVkIGluIHRoZSBtYWluIGhlYWRlciBmaWxlLCBhbmQgdGhlIGltcGxlbWVudGF0aW9uCisgKiBmaWxlIGNvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgYmFzaWMgcHJpbnRlciBhbmQgZGVmYXVsdCBpbnRlcmZhY2VzLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZmlsZQorICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBzZXJ2aWNlX25hbWVfICsgIi5qYXZhIjsKKyAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOworCisgIGZfc2VydmljZV8gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgamF2YV9wYWNrYWdlKCkgPDwgamF2YV90eXBlX2ltcG9ydHMoKSA8PCBqYXZhX3RocmlmdF9pbXBvcnRzKCk7CisKKyAgZl9zZXJ2aWNlXyA8PCAicHVibGljIGNsYXNzICIgPDwgc2VydmljZV9uYW1lXyA8PCAiIHsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHRocmVlIG1haW4gcGFydHMgb2YgdGhlIHNlcnZpY2UKKyAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKKworICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsOworICBmX3NlcnZpY2VfLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3ByaW1pdGl2ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInB1YmxpYyBpbnRlcmZhY2UgSWZhY2UgZXh0ZW5kcyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmYWNlIHsgfSIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGw7CisKKyAgc3RyaW5nIGZfaW50ZXJmYWNlX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBzZXJ2aWNlX25hbWVfICsgIklmYWNlLmphdmEiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfaWZhY2U7CisgIGZfaWZhY2Uub3BlbihmX2ludGVyZmFjZV9uYW1lLmNfc3RyKCkpOworCisgIHN0cmluZyBleHRlbmRzX2lmYWNlID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kc19pZmFjZSA9ICIgZXh0ZW5kcyAiICsgdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKSArICJJZmFjZSI7CisgIH0KKworICBmX2lmYWNlIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGphdmFfcGFja2FnZSgpIDw8IGphdmFfdHlwZV9pbXBvcnRzKCkgPDwgamF2YV90aHJpZnRfaW1wb3J0cygpOworICBnZW5lcmF0ZV9qYXZhX2RvYyhmX2lmYWNlLCB0c2VydmljZSk7CisgIGZfaWZhY2UgPDwgInB1YmxpYyBpbnRlcmZhY2UgIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZmFjZSIgPDwgZXh0ZW5kc19pZmFjZSA8PCAiIHsiIDw8IGVuZGwKKyAgICAgICAgICA8PCBlbmRsOworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9qYXZhX2RvYyhmX2lmYWNlLCAqZl9pdGVyKTsKKyAgICBmX2lmYWNlIDw8ICIgIHB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICB9CisgIGZfaWZhY2UgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGludGVyZmFjZSBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19pZmFjZSA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGV4dGVuZHNfaWZhY2UgPSAiIGV4dGVuZHMgIiArIGV4dGVuZHMgKyAiLklmYWNlIjsKKyAgfQorCisgIGdlbmVyYXRlX2phdmFfZG9jKGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHVibGljIGludGVyZmFjZSBJZmFjZSIgPDwgZXh0ZW5kc19pZmFjZSA8PCAiIHsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX2phdmFfZG9jKGZfc2VydmljZV8sICpmX2l0ZXIpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBzdHJ1Y3RzIGZvciBhbGwgdGhlIHNlcnZpY2UgYXJncyBhbmQgcmV0dXJuIHR5cGVzCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCB0cywgZmFsc2UsIHRydWUpOworICAgIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGV4dGVuZHNfY2xpZW50ID0gIiBleHRlbmRzICIgKyBleHRlbmRzICsgIi5DbGllbnQiOworICB9CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgc3RhdGljIGNsYXNzIENsaWVudCIgPDwgZXh0ZW5kc19jbGllbnQKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgaW1wbGVtZW50cyBUU2VydmljZUNsaWVudCwgSWZhY2UgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgQ2xpZW50KFRQcm90b2NvbCBwcm90KSIgPDwgZW5kbDsKKyAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidGhpcyhwcm90LCBwcm90KTsiIDw8IGVuZGw7CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBDbGllbnQoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpIiA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlwcm90XyA9IGlwcm90OyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3RfID0gb3Byb3Q7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInN1cGVyKGlwcm90LCBvcHJvdCk7IiA8PCBlbmRsOworICB9CisgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIFRQcm90b2NvbCBpcHJvdF87IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAicHJvdGVjdGVkIFRQcm90b2NvbCBvcHJvdF87IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJwcm90ZWN0ZWQgaW50IHNlcWlkXzsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIFRQcm90b2NvbCBnZXRJbnB1dFByb3RvY29sKCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gdGhpcy5pcHJvdF87IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgVFByb3RvY29sIGdldE91dHB1dFByb3RvY29sKCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gdGhpcy5vcHJvdF87IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICB9CisKKyAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisKKyAgICAvLyBPcGVuIGZ1bmN0aW9uCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIjsKKworICAgIC8vIEdldCB0aGUgc3RydWN0IG9mIGZ1bmN0aW9uIGNhbGwgcGFyYW1zCisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisKKyAgICAvLyBEZWNsYXJlIHRoZSBmdW5jdGlvbiBhcmd1bWVudHMKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCk7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOworCisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8ICJyZXR1cm4gIjsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgInJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgfQorICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgICAgdF9mdW5jdGlvbiBzZW5kX2Z1bmN0aW9uKGdfdHlwZV92b2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInNlbmRfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSk7CisKKyAgICBzdHJpbmcgYXJnc25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiOworCisgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZzZW5kX2Z1bmN0aW9uKSA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOworCisgICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3RfLndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgZnVubmFtZSA8PCAiXCIsICIKKyAgICAgICAgICAgICAgIDw8ICgoKmZfaXRlciktPmlzX29uZXdheSgpID8gIlRNZXNzYWdlVHlwZS5PTkVXQVkiIDogIlRNZXNzYWdlVHlwZS5DQUxMIikKKyAgICAgICAgICAgICAgIDw8ICIsICsrc2VxaWRfKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IGFyZ3NuYW1lIDw8ICIgYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lCisgICAgICAgICAgICAgICA8PCAiKCk7IiA8PCBlbmRsOworCisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3Muc2V0IiA8PCBnZXRfY2FwX25hbWUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpIDw8ICIoIgorICAgICAgICAgICAgICAgICA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncy53cml0ZShvcHJvdF8pOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIm9wcm90Xy53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJvcHJvdF8uZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsiIDw8IGVuZGw7CisKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgc3RyaW5nIHJlc3VsdG5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7CisKKyAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7CisgICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpKTsKKyAgICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uKSA8PCBlbmRsOworICAgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7CisKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIlRNZXNzYWdlIG1zZyA9IGlwcm90Xy5yZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICJpZiAobXNnLnR5cGUgPT0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTikgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiICBUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5yZWFkKGlwcm90Xyk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIGlwcm90Xy5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICB0aHJvdyB4OyIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgKG1zZy5zZXFpZCAhPSBzZXFpZF8pIHsiCisgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgIiAgdGhyb3cgbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uQkFEX1NFUVVFTkNFX0lELCBcIiIKKyAgICAgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiBvdXQgb2Ygc2VxdWVuY2UgcmVzcG9uc2VcIik7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHJlc3VsdG5hbWUgPDwgIiByZXN1bHQgPSBuZXcgIgorICAgICAgICAgICAgICAgICA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJlc3VsdC5yZWFkKGlwcm90Xyk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpcHJvdF8ucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisKKyAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgorICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0LiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soInN1Y2Nlc3MiKSA8PCAiKSB7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHJlc3VsdC5zdWNjZXNzOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9IG51bGwpIHsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICB0aHJvdyByZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgLy8gSWYgeW91IGdldCBoZXJlIGl0J3MgYW4gZXhjZXB0aW9uLCB1bmxlc3MgYSB2b2lkIGZ1bmN0aW9uCisgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgIDw8ICJ0aHJvdyBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5NSVNTSU5HX1JFU1VMVCwgXCIiCisgICAgICAgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKTsiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIC8vIENsb3NlIGZ1bmN0aW9uCisgICAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIC8vIEV4dGVuZHMgc3R1ZmYKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfcHJvY2Vzc29yID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIGV4dGVuZHMgIiArIGV4dGVuZHMgKyAiLlByb2Nlc3NvciI7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgc3RhdGljIGNsYXNzIFByb2Nlc3NvciIgPDwgZXh0ZW5kc19wcm9jZXNzb3IKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgaW1wbGVtZW50cyBUUHJvY2Vzc29yIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIFByb2Nlc3NvcihJZmFjZSBpZmFjZSkiIDw8IGVuZGw7CisgIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInN1cGVyKGlmYWNlKTsiIDw8IGVuZGw7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWZhY2VfID0gaWZhY2U7IiA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHJvY2Vzc01hcF8ucHV0KFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiLCBuZXcgIgorICAgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoKSk7IiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgc3RhdGljIGludGVyZmFjZSBQcm9jZXNzRnVuY3Rpb24geyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiICBwdWJsaWMgdm9pZCBwcm9jZXNzKGludCBzZXFpZCwgVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpIHRocm93cyBURXhjZXB0aW9uOyIKKyAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHJpdmF0ZSBJZmFjZSBpZmFjZV87IiA8PCBlbmRsOworCisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgZmluYWwgSGFzaHRhYmxlIHByb2Nlc3NNYXBfID0gbmV3IEhhc2h0YWJsZSgpOyIgPDwgZW5kbDsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGJvb2xlYW4gcHJvY2VzcyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24iCisgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJUTWVzc2FnZSBtc2cgPSBpcHJvdC5yZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsOworCisgIC8vIFRPRE8obWNzbGVlKTogdmFsaWRhdGUgbWVzc2FnZSwgd2FzIHRoZSBzZXFpZCBldGMuIGxlZ2l0PworCisgIGZfc2VydmljZV8KKyAgICAgIDw8IGluZGVudCgpIDw8ICJQcm9jZXNzRnVuY3Rpb24gZm4gPSAoUHJvY2Vzc0Z1bmN0aW9uKXByb2Nlc3NNYXBfLmdldChtc2cubmFtZSk7IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKGZuID09IG51bGwpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICIgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgVFR5cGUuU1RSVUNUKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICIgIGlwcm90LnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiICBUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IG5ldyAiCisgICAgICAgICAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5VTktOT1dOX01FVEhPRCwgXCJJbnZhbGlkIG1ldGhvZCBuYW1lOiAiCisgICAgICAgICAiJ1wiK21zZy5uYW1lK1wiJ1wiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICIgIG9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShtc2cubmFtZSwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgbXNnLnNlcWlkKSk7IgorICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICB4LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgb3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7IgorICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIiAgcmV0dXJuIHRydWU7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiZm4ucHJvY2Vzcyhtc2cuc2VxaWQsIGlwcm90LCBvcHJvdCk7IiA8PCBlbmRsOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiB0cnVlOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOworICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOworICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7CisgIH0KKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOworICB9CisKKyAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCAmcmVzdWx0LCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgICh2b2lkKXRzZXJ2aWNlOworICAvLyBPcGVuIGNsYXNzCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJpdmF0ZSBjbGFzcyAiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiIGltcGxlbWVudHMgUHJvY2Vzc0Z1bmN0aW9uIHsiCisgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICAvLyBPcGVuIGZ1bmN0aW9uCisgIGluZGVudChmX3NlcnZpY2VfKQorICAgICAgPDwgInB1YmxpYyB2b2lkIHByb2Nlc3MoaW50IHNlcWlkLCBUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24iCisgICAgICA8PCBlbmRsOworICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICBzdHJpbmcgYXJnc25hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiOworICBzdHJpbmcgcmVzdWx0bmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGFyZ3NuYW1lIDw8ICIgYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAidHJ5IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzLnJlYWQoaXByb3QpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSBjYXRjaCAoVFByb3RvY29sRXhjZXB0aW9uIGUpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpcHJvdC5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IG5ldyAiCisgICAgICAgICAgICAgICAgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uUFJPVE9DT0xfRVJST1IsIGUuZ2V0TWVzc2FnZSgpKTsiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIgorICAgICAgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIsIFRNZXNzYWdlVHlwZS5FWENFUFRJT04sIHNlcWlkKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIngud3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXR1cm47IgorICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlwcm90LnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisKKyAgLy8gRGVjbGFyZSByZXN1bHQgZm9yIG5vbiBvbmV3YXkgZnVuY3Rpb24KKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCByZXN1bHRuYW1lIDw8ICIgcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsOworICB9CisKKyAgLy8gVHJ5IGJsb2NrIGZvciBhIGZ1bmN0aW9uIHdpdGggZXhjZXB0aW9ucworICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0cnkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCisgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAicmVzdWx0LnN1Y2Nlc3MgPSAiOworICB9CisgIGZfc2VydmljZV8gPDwgImlmYWNlXy4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8ICJhcmdzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICB9CisgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOworCisgIC8vIFNldCBpc3NldCBvbiBzdWNjZXNzIGZpZWxkCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkKKyAgICAgICYmICF0eXBlX2Nhbl9iZV9udWxsKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuc2V0IiA8PCBnZXRfY2FwX25hbWUoInN1Y2Nlc3MiKSA8PCBnZXRfY2FwX25hbWUoImlzU2V0IikKKyAgICAgICAgICAgICAgIDw8ICIodHJ1ZSk7IiA8PCBlbmRsOworICB9CisKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmIHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IjsKKyAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiIGNhdGNoICgiIDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSkgPDwgIiAiCisgICAgICAgICAgICAgICAgIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICAgICA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAifSI7CisgICAgICB9CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgIiBjYXRjaCAoVGhyb3dhYmxlIHRoKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4ID0gbmV3ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLklOVEVSTkFMX0VSUk9SLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJJbnRlcm5hbCBlcnJvciBwcm9jZXNzaW5nICIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIik7IgorICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIgorICAgICAgICAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIiwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgc2VxaWQpKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ4LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIKKyAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICAvLyBTaG9ydGN1dCBvdXQgaGVyZSBmb3Igb25ld2F5IGZ1bmN0aW9ucworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKworICAgIC8vIENsb3NlIGNsYXNzCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgcmV0dXJuOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICA8PCAiXCIsIFRNZXNzYWdlVHlwZS5SRVBMWSwgc2VxaWQpKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvcHJvdCk7IgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbDsKKworICAvLyBDbG9zZSBmdW5jdGlvbgorICBzY29wZV9kb3duKGZfc2VydmljZV8pOworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gQ2xvc2UgY2xhc3MKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkCisgKiBAcGFyYW0gcHJlZml4IFRoZSB2YXJpYWJsZSBuYW1lIG9yIGNvbnRhaW5lciBmb3IgdGhpcyBmaWVsZAorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgfQorCisgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gaXByb3QuIjsKKworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBpZiAoIXR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgIG91dCA8PCAicmVhZFN0cmluZygpOyI7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgInJlYWRCaW5hcnkoKTsiOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgb3V0IDw8ICJyZWFkQm9vbCgpOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgb3V0IDw8ICJyZWFkQnl0ZSgpOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIG91dCA8PCAicmVhZEkxNigpOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIG91dCA8PCAicmVhZEkzMigpOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIG91dCA8PCAicmVhZEk2NCgpOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIG91dCA8PCAicmVhZERvdWJsZSgpOyI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBKYXZhIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlKSArICIuZmluZEJ5VmFsdWUoaXByb3QucmVhZEkzMigpKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhbiB1bnNlcmlhbGl6ZXIgZm9yIGEgc3RydWN0LCBpbnZva2VzIHJlYWQoKQorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8IHByZWZpeCA8PCAiLnJlYWQoaXByb3QpOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBjb250YWluZXIgYnkgcmVhZGluZyBpdHMgc2l6ZSBhbmQgdGhlbiBpdGVyYXRpbmcKKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgc2NvcGVfdXAob3V0KTsKKworICBzdHJpbmcgb2JqOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBvYmogPSB0bXAoIl9tYXAiKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBvYmogPSB0bXAoIl9zZXQiKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgb2JqID0gdG1wKCJfbGlzdCIpOworICB9CisKKyAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiVE1hcCAiIDw8IG9iaiA8PCAiID0gaXByb3QucmVhZE1hcEJlZ2luKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJUU2V0ICIgPDwgb2JqIDw8ICIgPSBpcHJvdC5yZWFkU2V0QmVnaW4oKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJUTGlzdCAiIDw8IG9iaiA8PCAiID0gaXByb3QucmVhZExpc3RCZWdpbigpOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkKKyAgICAgICAgICAgICAgLy8gc2l6ZSB0aGUgY29sbGVjdGlvbiBjb3JyZWN0bHkKKyAgICAgICAgICAgICAgPDwgIigiIDw8ICh0dHlwZS0+aXNfbGlzdCgpID8gIiIgOiAiMioiKSA8PCBvYmogPDwgIi5zaXplIgorICAgICAgICAgICAgICA8PCAiKTsiIDw8IGVuZGw7CisKKyAgLy8gRm9yIGxvb3AgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cworICBzdHJpbmcgaSA9IHRtcCgiX2kiKTsKKyAgaW5kZW50KG91dCkgPDwgImZvciAoaW50ICIgPDwgaSA8PCAiID0gMDsgIiA8PCBpIDw8ICIgPCAiIDw8IG9iaiA8PCAiLnNpemUiCisgICAgICAgICAgICAgIDw8ICI7ICIKKyAgICAgICAgICAgICAgPDwgIisrIiA8PCBpIDw8ICIpIiA8PCBlbmRsOworCisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgcHJlZml4KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgpOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIC8vIFJlYWQgY29udGFpbmVyIGVuZAorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRNYXBFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRTZXRFbmQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTGlzdEVuZCgpOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgY29kZSB0byBkZXNlcmlhbGl6ZSBhIG1hcAorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGtleSA9IHRtcCgiX2tleSIpOworICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7CisgIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKKyAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOworCisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZrZXkpIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZ2YWwpIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSk7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwpOworCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLnB1dCgiIDw8IGJveF90eXBlKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpIDw8ICIsICIKKyAgICAgICAgICAgICAgPDwgYm94X3R5cGUodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCkgPDwgIik7IiA8PCBlbmRsOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIHNldCBlbGVtZW50CisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworCisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5wdXQoIiA8PCBib3hfdHlwZSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pIDw8ICIsICIKKyAgICAgICAgICAgICAgPDwgYm94X3R5cGUodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKSA8PCAiKTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgbGlzdCBlbGVtZW50CisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworCisgIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5hZGRFbGVtZW50KCIgPDwgYm94X3R5cGUodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSkgPDwgIik7IiA8PCBlbmRsOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCkgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisKKyAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICB9CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlSTMyKCIgPDwgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIuZ2V0VmFsdWUoKSk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LiI7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgICBvdXQgPDwgIndyaXRlQmluYXJ5KCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAid3JpdGVCb29sKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAid3JpdGVCeXRlKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgIndyaXRlSTE2KCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgIndyaXRlSTY0KCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgIndyaXRlRG91YmxlKCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gSmF2YSBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSBGSUVMRCAnJXMlcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICBwcmVmaXguY19zdHIoKSwKKyAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKKyAgfQorfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCisgKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICAodm9pZCl0c3RydWN0OworICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIud3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHdyaXRpbmcgaXRzIHNpemUgdGhlbiB0aGUgZWxlbWVudHMuCisgKgorICogQHBhcmFtIHR0eXBlICBUaGUgdHlwZSBvZiBjb250YWluZXIKKyAqIEBwYXJhbSBwcmVmaXggU3RyaW5nIHByZWZpeCBmb3IgZmllbGRzCisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgeworICBzY29wZV91cChvdXQpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVNYXBCZWdpbihuZXcgVE1hcCgiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKQorICAgICAgICAgICAgICAgIDw8ICIsICIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIgPDwgcHJlZml4CisgICAgICAgICAgICAgICAgPDwgIi5zaXplKCkpKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlU2V0QmVnaW4obmV3IFRTZXQoIiA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpCisgICAgICAgICAgICAgICAgPDwgIiwgIiA8PCBwcmVmaXggPDwgIi5zaXplKCkpKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUxpc3RCZWdpbihuZXcgVExpc3QoIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwgcHJlZml4IDw8ICIuc2l6ZSgpKSk7IgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0KKworICBzdHJpbmcgaXRlciA9IHRtcCgiX2l0ZXIiKTsKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHN0cmluZyBlbnVtZXIgPSBpdGVyICsgIl9lbnVtIjsKKyAgICBzdHJpbmcga2V5X3R5cGUgPSB0eXBlX25hbWUoKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSwgdHJ1ZSwgZmFsc2UpOworICAgIGluZGVudChvdXQpIDw8ICJmb3IgKEVudW1lcmF0aW9uICIgPDwgZW51bWVyIDw8ICIgPSAiIDw8IHByZWZpeCA8PCAiLmtleXMoKTsgIiA8PCBlbnVtZXIKKyAgICAgICAgICAgICAgICA8PCAiLmhhc01vcmVFbGVtZW50cygpOyApICI7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBpbmRlbnQob3V0KSA8PCBrZXlfdHlwZSA8PCAiICIgPDwgaXRlciA8PCAiID0gKCIgPDwga2V5X3R5cGUgPDwgIikiIDw8IGVudW1lcgorICAgICAgICAgICAgICAgIDw8ICIubmV4dEVsZW1lbnQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgc3RyaW5nIGVudW1lciA9IGl0ZXIgKyAiX2VudW0iOworICAgIHN0cmluZyBlbGVfdHlwZSA9IHR5cGVfbmFtZSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCksIHRydWUpOworICAgIGluZGVudChvdXQpIDw8ICJmb3IgKEVudW1lcmF0aW9uICIgPDwgZW51bWVyIDw8ICIgPSAiIDw8IHByZWZpeCA8PCAiLmtleXMoKTsgIiA8PCBlbnVtZXIKKyAgICAgICAgICAgICAgICA8PCAiLmhhc01vcmVFbGVtZW50cygpOyApICI7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBpbmRlbnQob3V0KSA8PCBlbGVfdHlwZSA8PCAiICIgPDwgaXRlciA8PCAiID0gKCIgPDwgZWxlX3R5cGUgPDwgIikiIDw8IGVudW1lcgorICAgICAgICAgICAgICAgIDw8ICIubmV4dEVsZW1lbnQoKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHN0cmluZyBlbnVtZXIgPSBpdGVyICsgIl9lbnVtIjsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yIChFbnVtZXJhdGlvbiAiIDw8IGVudW1lciA8PCAiID0gIiA8PCBwcmVmaXggPDwgIi5lbGVtZW50cygpOyAiIDw8IGVudW1lcgorICAgICAgICAgICAgICAgIDw8ICIuaGFzTW9yZUVsZW1lbnRzKCk7ICkgIjsKKyAgICBzY29wZV91cChvdXQpOworICAgIHN0cmluZyBlbGVfdHlwZSA9IHR5cGVfbmFtZSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCksIHRydWUpOworICAgIGluZGVudChvdXQpIDw8IGVsZV90eXBlIDw8ICIgIiA8PCBpdGVyIDw8ICIgPSAoIiA8PCBlbGVfdHlwZSA8PCAiKSIgPDwgZW51bWVyCisgICAgICAgICAgICAgICAgPDwgIi5uZXh0RWxlbWVudCgpOyIgPDwgZW5kbDsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBpdGVyLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOworICB9CisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlTWFwRW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVNldEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlTGlzdEVuZCgpOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbWFwKSB7CisgIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCwgIiIpOworICBzdHJpbmcgdmFsX3R5cGUgPSB0eXBlX25hbWUodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHRydWUsIGZhbHNlKTsKKyAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksICIoKCIgKyB2YWxfdHlwZSArICIpIiArIG1hcCArICIuZ2V0KCIgKyBpdGVyICsgIikpIik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQsICIiKTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgorICovCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBpdGVyKSB7CisgIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbGlzdC4KKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyKSB7CisgIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Cit9CisKKy8qKgorICogUmV0dXJucyBhIEphdmEgdHlwZSBuYW1lCisgKgorICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCisgKiBAcGFyYW0gY29udGFpbmVyIElzIHRoZSB0eXBlIGdvaW5nIGluc2lkZSBhIGNvbnRhaW5lcj8KKyAqIEByZXR1cm4gSmF2YSB0eXBlIG5hbWUsIGkuZS4gVmVjdG9yCisgKi8KK3N0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY29udGFpbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5faW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNraXBfZ2VuZXJpYykgeworICAodm9pZClpbl9pbml0OworICAodm9pZClza2lwX2dlbmVyaWM7CisgIC8vIEluIEphdmEgdHlwZWRlZnMgYXJlIGp1c3QgcmVzb2x2ZWQgdG8gdGhlaXIgcmVhbCB0eXBlCisgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisgIHN0cmluZyBwcmVmaXg7CisKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHJldHVybiBiYXNlX3R5cGVfbmFtZSgodF9iYXNlX3R5cGUqKXR0eXBlLCBpbl9jb250YWluZXIpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiSGFzaHRhYmxlIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIkhhc2h0YWJsZSI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiVmVjdG9yIjsKKyAgfQorCisgIC8vIENoZWNrIGZvciBuYW1lc3BhY2luZworICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKKyAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7CisgICAgc3RyaW5nIHBhY2thZ2UgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJqYXZhIik7CisgICAgaWYgKCFwYWNrYWdlLmVtcHR5KCkpIHsKKyAgICAgIHJldHVybiBwYWNrYWdlICsgIi4iICsgdHR5cGUtPmdldF9uYW1lKCk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHR0eXBlLT5nZXRfbmFtZSgpOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIEMrKyB0eXBlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHRocmlmdCB0eXBlLgorICoKKyAqIEBwYXJhbSB0YmFzZSBUaGUgYmFzZSB0eXBlCisgKiBAcGFyYW0gY29udGFpbmVyIElzIGl0IGdvaW5nIGluIGEgSmF2YSBjb250YWluZXI/CisgKi8KK3N0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OmJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0eXBlLCBib29sIGluX2NvbnRhaW5lcikgeworICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gdHlwZS0+Z2V0X2Jhc2UoKTsKKworICBzd2l0Y2ggKHRiYXNlKSB7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICByZXR1cm4gInZvaWQiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICBpZiAoIXR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICByZXR1cm4gIlN0cmluZyI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAiYnl0ZVtdIjsKKyAgICB9CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICByZXR1cm4gKGluX2NvbnRhaW5lciA/ICJCb29sZWFuIiA6ICJib29sZWFuIik7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiQnl0ZSIgOiAiYnl0ZSIpOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICByZXR1cm4gKGluX2NvbnRhaW5lciA/ICJTaG9ydCIgOiAic2hvcnQiKTsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiSW50ZWdlciIgOiAiaW50Iik7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgIHJldHVybiAoaW5fY29udGFpbmVyID8gIkxvbmciIDogImxvbmciKTsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiRG91YmxlIiA6ICJkb3VibGUiKTsKKyAgZGVmYXVsdDoKKyAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEphdmEgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICB9Cit9CisKKy8qKgorICogRGVjbGFyZXMgYSBmaWVsZCwgd2hpY2ggbWF5IGluY2x1ZGUgaW5pdGlhbGl6YXRpb24gYXMgbmVjZXNzYXJ5LgorICoKKyAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQorICovCitzdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0KSB7CisgIC8vIFRPRE8obWNzbGVlKTogZG8gd2UgZXZlciBuZWVkIHRvIGluaXRpYWxpemUgdGhlIGZpZWxkPworICBzdHJpbmcgcmVzdWx0ID0gdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSkgKyAiICIgKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIGlmIChpbml0KSB7CisgICAgdF90eXBlKiB0dHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmIHRmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgICAgc3RkOjpvZnN0cmVhbSBkdW1teTsKKyAgICAgIHJlc3VsdCArPSAiID0gIiArIHJlbmRlcl9jb25zdF92YWx1ZShkdW1teSwgdGZpZWxkLT5nZXRfbmFtZSgpLCB0dHlwZSwgdGZpZWxkLT5nZXRfdmFsdWUoKSk7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICByZXN1bHQgKz0gIiA9IG51bGwiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSBmYWxzZSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgcmVzdWx0ICs9ICIgPSAoZG91YmxlKTAiOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIigpIjsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIigpIjsKKyAgICAgIDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdCArICI7IjsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3N0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0dHlwZSA9IHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKKyAgc3RkOjpzdHJpbmcgcmVzdWx0ID0gdHlwZV9uYW1lKHR0eXBlKSArICIgIiArIHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIoIgorICAgICAgICAgICAgICAgICAgICAgICArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSArICIpIHRocm93cyAiOworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgIHJlc3VsdCArPSB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpICsgIiwgIjsKKyAgfQorICByZXN1bHQgKz0gIlRFeGNlcHRpb24iOworICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIFJlbmRlcnMgYSBjb21tYSBzZXBhcmF0ZWQgZmllbGQgbGlzdCwgd2l0aCB0eXBlIG5hbWVzCisgKi8KK3N0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaW5jbHVkZV90eXBlcykgeworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCArPSAiLCAiOworICAgIH0KKyAgICBpZiAoaW5jbHVkZV90eXBlcykgeworICAgICAgcmVzdWx0ICs9IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCkpICsgIiAiOworICAgIH0KKyAgICByZXN1bHQgKz0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBDKysgZW51bSBzdHJpbmcgZm9yIHRoZSBnaXZlbiB0eXBlLgorICovCitzdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJUVHlwZS5TVFJJTkciOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiVFR5cGUuQk9PTCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiVFR5cGUuQllURSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIlRUeXBlLkkxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlRUeXBlLkk2NCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIlRUeXBlLkRPVUJMRSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiVFR5cGUuSTMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJUVHlwZS5TVFJVQ1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5NQVAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5TRVQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiVFR5cGUuTElTVCI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKKy8qKgorICogQXBwbGllcyB0aGUgY29ycmVjdCBzdHlsZSB0byBhIHN0cmluZyBiYXNlZCBvbiB0aGUgdmFsdWUgb2Ygbm9jYW1lbF9zdHlsZV8KKyAqLworc3RkOjpzdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZXRfY2FwX25hbWUoc3RkOjpzdHJpbmcgbmFtZSkgeworICBuYW1lWzBdID0gdG91cHBlcihuYW1lWzBdKTsKKyAgcmV0dXJuIG5hbWU7Cit9CisKK3N0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OmNvbnN0YW50X25hbWUoc3RyaW5nIG5hbWUpIHsKKyAgc3RyaW5nIGNvbnN0YW50X25hbWU7CisKKyAgYm9vbCBpc19maXJzdCA9IHRydWU7CisgIGJvb2wgd2FzX3ByZXZpb3VzX2NoYXJfdXBwZXIgPSBmYWxzZTsKKyAgZm9yIChzdHJpbmc6Oml0ZXJhdG9yIGl0ZXIgPSBuYW1lLmJlZ2luKCk7IGl0ZXIgIT0gbmFtZS5lbmQoKTsgKytpdGVyKSB7CisgICAgc3RyaW5nOjp2YWx1ZV90eXBlIGNoYXJhY3RlciA9ICgqaXRlcik7CisKKyAgICBib29sIGlzX3VwcGVyID0gaXN1cHBlcihjaGFyYWN0ZXIpOworCisgICAgaWYgKGlzX3VwcGVyICYmICFpc19maXJzdCAmJiAhd2FzX3ByZXZpb3VzX2NoYXJfdXBwZXIpIHsKKyAgICAgIGNvbnN0YW50X25hbWUgKz0gJ18nOworICAgIH0KKyAgICBjb25zdGFudF9uYW1lICs9IHRvdXBwZXIoY2hhcmFjdGVyKTsKKworICAgIGlzX2ZpcnN0ID0gZmFsc2U7CisgICAgd2FzX3ByZXZpb3VzX2NoYXJfdXBwZXIgPSBpc191cHBlcjsKKyAgfQorCisgIHJldHVybiBjb25zdGFudF9uYW1lOworfQorCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9kb2NzdHJpbmdfY29tbWVudChvc3RyZWFtJiBvdXQsIHN0cmluZyBjb250ZW50cykgeworICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsICIvKipcbiIsICIgKiAiLCBjb250ZW50cywgIiAqL1xuIik7Cit9CisKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX2RvYyhvc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKSB7CisgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfZW51bSgpKSB7CisgICAgc3RyaW5nIGNvbWJpbmVkX21lc3NhZ2UgPSBmaWVsZC0+Z2V0X2RvYygpICsgIlxuQHNlZSAiICsgZ2V0X2VudW1fY2xhc3NfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgZ2VuZXJhdGVfamF2YV9kb2NzdHJpbmdfY29tbWVudChvdXQsIGNvbWJpbmVkX21lc3NhZ2UpOworICB9IGVsc2UgeworICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgKHRfZG9jKilmaWVsZCk7CisgIH0KK30KKworLyoqCisgKiBFbWl0cyBhIEphdmFEb2MgY29tbWVudCBpZiB0aGUgcHJvdmlkZWQgb2JqZWN0IGhhcyBhIGRvYyBpbiBUaHJpZnQKKyAqLwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfZG9jKG9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpIHsKKyAgaWYgKHRkb2MtPmhhc19kb2MoKSkgeworICAgIGdlbmVyYXRlX2phdmFfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCB0ZG9jLT5nZXRfZG9jKCkpOworICB9Cit9CisKKy8qKgorICogRW1pdHMgYSBKYXZhRG9jIGNvbW1lbnQgaWYgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIG9iamVjdCBoYXMgYSBkb2MgaW4gVGhyaWZ0CisgKi8KK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX2RvYyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBpZiAodGZ1bmN0aW9uLT5oYXNfZG9jKCkpIHsKKyAgICBzdHJpbmdzdHJlYW0gc3M7CisgICAgc3MgPDwgdGZ1bmN0aW9uLT5nZXRfZG9jKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHBfaXRlcjsKKyAgICBmb3IgKHBfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBwX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK3BfaXRlcikgeworICAgICAgdF9maWVsZCogcCA9ICpwX2l0ZXI7CisgICAgICBzcyA8PCAiXG5AcGFyYW0gIiA8PCBwLT5nZXRfbmFtZSgpOworICAgICAgaWYgKHAtPmhhc19kb2MoKSkgeworICAgICAgICBzcyA8PCAiICIgPDwgcC0+Z2V0X2RvYygpOworICAgICAgfQorICAgIH0KKyAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsICIvKipcbiIsICIgKiAiLCBzcy5zdHIoKSwgIiAqL1xuIik7CisgIH0KK30KKwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlZXBfY29weV9jb250YWluZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc291cmNlX25hbWVfcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZV9wMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlKSB7CisKKyAgdF9jb250YWluZXIqIGNvbnRhaW5lciA9ICh0X2NvbnRhaW5lciopdHlwZTsKKyAgc3RkOjpzdHJpbmcgc291cmNlX25hbWU7CisgIGlmIChzb3VyY2VfbmFtZV9wMiA9PSAiIikKKyAgICBzb3VyY2VfbmFtZSA9IHNvdXJjZV9uYW1lX3AxOworICBlbHNlCisgICAgc291cmNlX25hbWUgPSBzb3VyY2VfbmFtZV9wMSArICIuIiArIHNvdXJjZV9uYW1lX3AyOworCisgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IHJlc3VsdF9uYW1lIDw8ICIgPSBuZXcgIgorICAgICAgICAgICAgICA8PCB0eXBlX25hbWUoY29udGFpbmVyLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKKworICBzdGQ6OnN0cmluZyBpdGVyYXRvcl9lbGVtZW50X25hbWUgPSBzb3VyY2VfbmFtZV9wMSArICJfZWxlbWVudCI7CisgIHN0ZDo6c3RyaW5nIGVudW1lcmF0aW9uX25hbWUgPSBzb3VyY2VfbmFtZV9wMSArICJfZW51bSI7CisgIHN0ZDo6c3RyaW5nIHJlc3VsdF9lbGVtZW50X25hbWUgPSByZXN1bHRfbmFtZSArICJfY29weSI7CisKKyAgaWYgKGNvbnRhaW5lci0+aXNfbWFwKCkpIHsKKyAgICB0X3R5cGUqIGtleV90eXBlID0gKCh0X21hcCopY29udGFpbmVyKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2YWxfdHlwZSA9ICgodF9tYXAqKWNvbnRhaW5lciktPmdldF92YWxfdHlwZSgpOworCisgICAgaW5kZW50KG91dCkgPDwgImZvciAoRW51bWVyYXRpb24gIiA8PCBlbnVtZXJhdGlvbl9uYW1lIDw8ICIgPSAiIDw8IHNvdXJjZV9uYW1lIDw8ICIua2V5cygpOyAiCisgICAgICAgICAgICAgICAgPDwgZW51bWVyYXRpb25fbmFtZSA8PCAiLmhhc01vcmVFbGVtZW50cygpOyApIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZShrZXlfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCBpdGVyYXRvcl9lbGVtZW50X25hbWUgPDwgIl9rZXkgPSAoIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZShrZXlfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIpIiA8PCBlbnVtZXJhdGlvbl9uYW1lIDw8ICIubmV4dEVsZW1lbnQoKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUodmFsX3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgaXRlcmF0b3JfZWxlbWVudF9uYW1lIDw8ICJfdmFsdWUgPSAoIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSh2YWxfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIpIiA8PCBzb3VyY2VfbmFtZSA8PCAiLmdldCgiCisgICAgICAgICAgICAgICAgPDwgaXRlcmF0b3JfZWxlbWVudF9uYW1lIDw8ICJfa2V5KTsiIDw8IGVuZGw7CisKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGlmIChrZXlfdHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9jb250YWluZXIob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcl9lbGVtZW50X25hbWUgKyAiX2tleSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfZWxlbWVudF9uYW1lICsgIl9rZXkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfdHlwZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZShrZXlfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCByZXN1bHRfZWxlbWVudF9uYW1lIDw8ICJfa2V5ID0gIjsKKyAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSArICJfa2V5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdF9lbGVtZW50X25hbWUgKyAiX2tleSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfdHlwZSk7CisgICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorCisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBpZiAodmFsX3R5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3JfZWxlbWVudF9uYW1lICsgIl92YWx1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfZWxlbWVudF9uYW1lICsgIl92YWx1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbF90eXBlKTsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKHZhbF90eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IHJlc3VsdF9lbGVtZW50X25hbWUgPDwgIl92YWx1ZSA9ICI7CisgICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvcl9lbGVtZW50X25hbWUgKyAiX3ZhbHVlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdF9lbGVtZW50X25hbWUgKyAiX3ZhbHVlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbF90eXBlKTsKKyAgICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8IHJlc3VsdF9uYW1lIDw8ICIucHV0KCIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZSA8PCAiX2tleSwgIiA8PCByZXN1bHRfZWxlbWVudF9uYW1lCisgICAgICAgICAgICAgICAgPDwgIl92YWx1ZSk7IiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICB9IGVsc2UgeworICAgIHRfdHlwZSogZWxlbV90eXBlOworCisgICAgaWYgKGNvbnRhaW5lci0+aXNfc2V0KCkpIHsKKyAgICAgIGVsZW1fdHlwZSA9ICgodF9zZXQqKWNvbnRhaW5lciktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgZWxlbV90eXBlID0gKCh0X2xpc3QqKWNvbnRhaW5lciktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9CisKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yIChFbnVtZXJhdGlvbiAiIDw8IGVudW1lcmF0aW9uX25hbWUgPDwgIiA9ICIgPDwgc291cmNlX25hbWUKKyAgICAgICAgICAgICAgICA8PCAiLmVsZW1lbnRzKCk7ICIgPDwgZW51bWVyYXRpb25fbmFtZSA8PCAiLmhhc01vcmVFbGVtZW50cygpOyApIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKGVsZW1fdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCBpdGVyYXRvcl9lbGVtZW50X25hbWUgPDwgIiA9ICgiCisgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKGVsZW1fdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIpIiA8PCBlbnVtZXJhdGlvbl9uYW1lIDw8ICIubmV4dEVsZW1lbnQoKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpZiAoZWxlbV90eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgLy8gcmVjdXJzaXZlIGRlZXAgY29weQorICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X2NvbnRhaW5lcihvdXQsIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSwgIiIsIHJlc3VsdF9lbGVtZW50X25hbWUsIGVsZW1fdHlwZSk7CisgICAgICBpZiAoZWxlbV90eXBlLT5pc19saXN0KCkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgcmVzdWx0X25hbWUgPDwgIi5hZGRFbGVtZW50KCIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQob3V0KSA8PCByZXN1bHRfbmFtZSA8PCAiLnB1dCgiIDw8IHJlc3VsdF9lbGVtZW50X25hbWUgPDwgIiwgIiA8PCByZXN1bHRfZWxlbWVudF9uYW1lCisgICAgICAgICAgICAgICAgICAgIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLy8gaXRlcmF0aXZlIGNvcHkKKyAgICAgIGlmIChlbGVtX3R5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZShlbGVtX3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiIHRlbXBfYmluYXJ5X2VsZW1lbnQgPSAiOworICAgICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlbXBfYmluYXJ5X2VsZW1lbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtX3R5cGUpOworICAgICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIGlmIChlbGVtX3R5cGUtPmlzX2xpc3QoKSkgeworICAgICAgICAgIGluZGVudChvdXQpIDw8IHJlc3VsdF9uYW1lIDw8ICIuYWRkRWxlbWVudCh0ZW1wX2JpbmFyeV9lbGVtZW50KTsiIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgcmVzdWx0X25hbWUgPDwgIi5wdXQodGVtcF9iaW5hcnlfZWxlbWVudCwgdGVtcF9iaW5hcnlfZWxlbWVudCk7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQob3V0KSA8PCByZXN1bHRfbmFtZSA8PCAiLmFkZEVsZW1lbnQoIjsKKyAgICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIob3V0LCBpdGVyYXRvcl9lbGVtZW50X25hbWUsIHJlc3VsdF9uYW1lLCBlbGVtX3R5cGUpOworICAgICAgICBvdXQgPDwgIik7IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgfQorfQorCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRlc3RfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUpIHsKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSB8fCB0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICAvLyBiaW5hcnkgZmllbGRzIG5lZWQgdG8gYmUgY29waWVkIHdpdGggU3lzdGVtLmFycmF5Y29weQorICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgb3V0IDw8ICJuZXcgYnl0ZVsiIDw8IHNvdXJjZV9uYW1lIDw8ICIubGVuZ3RoXTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiU3lzdGVtLmFycmF5Y29weSgiIDw8IHNvdXJjZV9uYW1lIDw8ICIsIDAsICIgPDwgZGVzdF9uYW1lIDw8ICIsIDAsICIKKyAgICAgICAgICAgICAgICAgIDw8IHNvdXJjZV9uYW1lIDw8ICIubGVuZ3RoKSI7CisgICAgfQorICAgIC8vIGV2ZXJ5dGhpbmcgZWxzZSBjYW4gYmUgY29waWVkIGRpcmVjdGx5CisgICAgZWxzZQorICAgICAgb3V0IDw8IHNvdXJjZV9uYW1lOworICB9IGVsc2UgeworICAgIG91dCA8PCAibmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUsIHRydWUpIDw8ICIoIiA8PCBzb3VyY2VfbmFtZSA8PCAiKSI7CisgIH0KK30KKworc3RkOjpzdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9jaGVjayh0X2ZpZWxkKiBmaWVsZCkgeworICByZXR1cm4gZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQtPmdldF9uYW1lKCkpOworfQorCitzdGQ6OnN0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6Omlzc2V0X2ZpZWxkX2lkKHRfZmllbGQqIGZpZWxkKSB7CisgIHJldHVybiAiX18iICsgdXBjYXNlX3N0cmluZyhmaWVsZC0+Z2V0X25hbWUoKSArICJfaXNzZXRfaWQiKTsKK30KKworc3RkOjpzdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9jaGVjayhzdGQ6OnN0cmluZyBmaWVsZF9uYW1lKSB7CisgIHJldHVybiAiaXMiICsgZ2V0X2NhcF9uYW1lKCJzZXQiKSArIGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKSArICIoKSI7Cit9CisKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9zZXQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCkgeworICBpZiAoIXR5cGVfY2FuX2JlX251bGwoZmllbGQtPmdldF90eXBlKCkpKSB7CisgICAgaW5kZW50KG91dCkgPDwgInNldCIgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCBnZXRfY2FwX25hbWUoImlzU2V0IikgPDwgIih0cnVlKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfQorfQorCitzdGQ6OnN0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OmdldF9lbnVtX2NsYXNzX25hbWUodF90eXBlKiB0eXBlKSB7CisgIHN0cmluZyBwYWNrYWdlID0gIiI7CisgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR5cGUtPmdldF9wcm9ncmFtKCk7CisgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgeworICAgIHBhY2thZ2UgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJqYXZhIikgKyAiLiI7CisgIH0KKyAgcmV0dXJuIHBhY2thZ2UgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X2Rlc2Mob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBzdGF0aWMgZmluYWwgVFN0cnVjdCBTVFJVQ1RfREVTQyA9IG5ldyBUU3RydWN0KFwiIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgIDw8ICJcIik7IiA8PCBlbmRsOworfQorCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRfZGVzY3Mob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBzdGF0aWMgZmluYWwgVEZpZWxkICIgPDwgY29uc3RhbnRfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgPDwgIl9GSUVMRF9ERVNDID0gbmV3IFRGaWVsZChcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiwgIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCAiKHNob3J0KSIgPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIik7IiA8PCBlbmRsOworICB9Cit9CisKK2Jvb2wgdF9qYXZhbWVfZ2VuZXJhdG9yOjpoYXNfYml0X3ZlY3Rvcih0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBpZiAoIXR5cGVfY2FuX2JlX251bGwoZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpKSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X2NsZWFyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgY2xlYXIoKSB7IiA8PCBlbmRsOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgaW5kZW50X3VwKCk7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMuIiArICgqbV9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHQsCisgICAgICAgICAgICAgICAgICAgICAgICAoKm1faXRlciktPmdldF92YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0KSkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gbnVsbDsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBtdXN0IGJlIGEgYmFzZSB0eXBlCisgICAgICAgIC8vIG1lYW5zIGl0IGFsc28gbmVlZHMgdG8gYmUgZXhwbGljaXRseSB1bnNldAorICAgICAgICBpbmRlbnQob3V0KSA8PCAic2V0IiA8PCBnZXRfY2FwX25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCBnZXRfY2FwX25hbWUoImlzU2V0IikKKyAgICAgICAgICAgICAgICAgICAgPDwgIihmYWxzZSk7IiA8PCBlbmRsOworICAgICAgICBzd2l0Y2ggKCgodF9iYXNlX3R5cGUqKXQpLT5nZXRfYmFzZSgpKSB7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9IDA7IiA8PCBlbmRsOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gMC4wOyIgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBmYWxzZTsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IC8vIHByZXZlbnQgZ2NjIGNvbXBpbGVyIHdhcm5pbmcKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBpbmRlbnRfZG93bigpOworCisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoamF2YW1lLCAiSmF2YSBNRSIsICIiKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9qc19nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2pzX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTc4MmI5Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9qc19nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSwyNzIxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9tYW5pcD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvdmVyc2lvbi5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgorCisKKy8qKgorICogSlMgY29kZSBnZW5lcmF0b3IuCisgKi8KK2NsYXNzIHRfanNfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfanNfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICBnZW5fbm9kZV8gPSBmYWxzZTsKKyAgICBnZW5fanF1ZXJ5XyA9IGZhbHNlOworICAgIGdlbl90c18gPSBmYWxzZTsKKyAgICBnZW5fZXM2XyA9IGZhbHNlOworCisgICAgYm9vbCB3aXRoX25zXyA9IGZhbHNlOworCisgICAgZm9yIChpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibm9kZSIpID09IDApIHsKKyAgICAgICAgZ2VuX25vZGVfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgianF1ZXJ5IikgPT0gMCkgeworICAgICAgICBnZW5fanF1ZXJ5XyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInRzIikgPT0gMCkgeworICAgICAgICBnZW5fdHNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgid2l0aF9ucyIpID09IDApIHsKKyAgICAgICAgd2l0aF9uc18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJlczYiKSA9PSAwKSB7CisgICAgICAgIGdlbl9lczZfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBqczoiICsgaXRlci0+Zmlyc3Q7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGdlbl9lczZfICYmIGdlbl9qcXVlcnlfKSB7CisgICAgICB0aHJvdyAiSW52YWxpZCBzd2l0Y2g6IFstZ2VuIGpzOmVzNixqcXVlcnldIG9wdGlvbnMgbm90IGNvbXBhdGlibGUiOworICAgIH0KKworICAgIGlmIChnZW5fbm9kZV8gJiYgZ2VuX2pxdWVyeV8pIHsKKyAgICAgIHRocm93ICJJbnZhbGlkIHN3aXRjaDogWy1nZW4ganM6bm9kZSxqcXVlcnldIG9wdGlvbnMgbm90IGNvbXBhdGlibGUsIHRyeTogWy1nZW4ganM6bm9kZSAtZ2VuICIKKyAgICAgICAgICAgICJqczpqcXVlcnldIjsKKyAgICB9CisKKyAgICBpZiAoIWdlbl9ub2RlXyAmJiB3aXRoX25zXykgeworICAgICAgdGhyb3cgIkludmFsaWQgc3dpdGNoOiBbLWdlbiBqczp3aXRoX25zXSBpcyBvbmx5IHZhbGlkIHdoZW4gdXNpbmcgbm9kZS5qcyI7CisgICAgfQorCisgICAgLy8gRGVwZW5kaW5nIG9uIHRoZSBwcm9jZXNzaW5nIGZsYWdzLCB3ZSB3aWxsIHVwZGF0ZSB0aGVzZSB0byBiZSBFUzYgY29tcGF0aWJsZQorICAgIGpzX2NvbnN0X3R5cGVfID0gInZhciAiOworICAgIGpzX2xldF90eXBlXyA9ICJ2YXIgIjsKKyAgICBqc192YXJfdHlwZV8gPSAidmFyICI7CisgICAgaWYgKGdlbl9lczZfKSB7CisgICAgICBqc19jb25zdF90eXBlXyA9ICJjb25zdCAiOworICAgICAganNfbGV0X3R5cGVfID0gImxldCAiOworICAgIH0KKworICAgIGlmIChnZW5fbm9kZV8pIHsKKyAgICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLW5vZGVqcyI7CisgICAgICBub19uc18gPSAhd2l0aF9uc187CisgICAgfSBlbHNlIHsKKyAgICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWpzIjsKKyAgICAgIG5vX25zXyA9IGZhbHNlOworICAgIH0KKworICAgIGVzY2FwZV9bJ1wnJ10gPSAiXFwnIjsKKyAgfQorCisgIC8qKgorICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCisgICAqLworCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICAvKioKKyAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICBzdGQ6OnN0cmluZyByZW5kZXJfcmVjdl90aHJvdyhzdGQ6OnN0cmluZyB2YXIpOworICBzdGQ6OnN0cmluZyByZW5kZXJfcmVjdl9yZXR1cm4oc3RkOjpzdHJpbmcgdmFyKTsKKworICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisKKyAgLyoqCisgICAqIFN0cnVjdHMhCisgICAqLworICB2b2lkIGdlbmVyYXRlX2pzX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX2pzX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4cG9ydGVkID0gdHJ1ZSk7CisgIHZvaWQgZ2VuZXJhdGVfanNfc3RydWN0X3JlYWRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2pzX3N0cnVjdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qc19mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgLyoqCisgICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfcmVzdCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgLyoqCisgICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2xhc3MgPSBmYWxzZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcga2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHZpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgLyoqCisgICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCisgICAqLworCisgIHN0ZDo6c3RyaW5nIGpzX2luY2x1ZGVzKCk7CisgIHN0ZDo6c3RyaW5nIHRzX2luY2x1ZGVzKCk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9pbmNsdWRlcygpOworICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0ID0gZmFsc2UsIGJvb2wgb2JqID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2x1ZGVfY2FsbGJhY2sgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaW5jbHVkZV9jYWxsYmFjayA9IGZhbHNlKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyBtYWtlX3ZhbGlkX25vZGVKc19pZGVudGlmaWVyKHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lKTsKKworICBzdGQ6OnN0cmluZyBhdXRvZ2VuX2NvbW1lbnQoKSB7CisgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCIvL1xuIikgKyAiLy8gQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKCIgKyBUSFJJRlRfVkVSU0lPTiArICIpXG4iCisgICAgICAgICAgICsgIi8vXG4iICsgIi8vIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkdcbiIKKyAgICAgICAgICAgKyAiLy9cbiI7CisgIH0KKworICB0X3R5cGUqIGdldF9jb250YWluZWRfdHlwZSh0X3R5cGUqIHQpOworCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBqc19uYW1lc3BhY2VfcGllY2VzKHRfcHJvZ3JhbSogcCkgeworICAgIHN0ZDo6c3RyaW5nIG5zID0gcC0+Z2V0X25hbWVzcGFjZSgianMiKTsKKworICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgbG9jOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwaWVjZXM7CisKKyAgICBpZiAobm9fbnNfKSB7CisgICAgICByZXR1cm4gcGllY2VzOworICAgIH0KKworICAgIGlmIChucy5zaXplKCkgPiAwKSB7CisgICAgICB3aGlsZSAoKGxvYyA9IG5zLmZpbmQoIi4iKSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgcGllY2VzLnB1c2hfYmFjayhucy5zdWJzdHIoMCwgbG9jKSk7CisgICAgICAgIG5zID0gbnMuc3Vic3RyKGxvYyArIDEpOworICAgICAgfQorICAgIH0KKworICAgIGlmIChucy5zaXplKCkgPiAwKSB7CisgICAgICBwaWVjZXMucHVzaF9iYWNrKG5zKTsKKyAgICB9CisKKyAgICByZXR1cm4gcGllY2VzOworICB9CisKKyAgc3RkOjpzdHJpbmcganNfdHlwZV9uYW1lc3BhY2UodF9wcm9ncmFtKiBwKSB7CisgICAgaWYgKGdlbl9ub2RlXykgeworICAgICAgaWYgKHAgIT0gTlVMTCAmJiBwICE9IHByb2dyYW1fKSB7CisgICAgICAgIHJldHVybiBtYWtlX3ZhbGlkX25vZGVKc19pZGVudGlmaWVyKHAtPmdldF9uYW1lKCkpICsgIl90dHlwZXMuIjsKKyAgICAgIH0KKyAgICAgIHJldHVybiAidHR5cGVzLiI7CisgICAgfQorICAgIHJldHVybiBqc19uYW1lc3BhY2UocCk7CisgIH0KKworICBzdGQ6OnN0cmluZyBqc19leHBvcnRfbmFtZXNwYWNlKHRfcHJvZ3JhbSogcCkgeworICAgIGlmIChnZW5fbm9kZV8pIHsKKyAgICAgIHJldHVybiAiZXhwb3J0cy4iOworICAgIH0KKyAgICByZXR1cm4ganNfbmFtZXNwYWNlKHApOworICB9CisKKyAgYm9vbCBoYXNfanNfbmFtZXNwYWNlKHRfcHJvZ3JhbSogcCkgeworICAgIGlmIChub19uc18pIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgbnMgPSBwLT5nZXRfbmFtZXNwYWNlKCJqcyIpOworICAgIHJldHVybiAobnMuc2l6ZSgpID4gMCk7CisgIH0KKworICBzdGQ6OnN0cmluZyBqc19uYW1lc3BhY2UodF9wcm9ncmFtKiBwKSB7CisgICAgaWYgKG5vX25zXykgeworICAgICAgcmV0dXJuICIiOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyBucyA9IHAtPmdldF9uYW1lc3BhY2UoImpzIik7CisgICAgaWYgKG5zLnNpemUoKSA+IDApIHsKKyAgICAgIG5zICs9ICIuIjsKKyAgICB9CisKKyAgICByZXR1cm4gbnM7CisgIH0KKworICAvKioKKyAgICogVHlwZVNjcmlwdCBEZWZpbml0aW9uIEZpbGUgaGVscGVyIGZ1bmN0aW9ucworICAgKi8KKworICBzdHJpbmcgdHNfZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgYm9vbCBpbmNsdWRlX2NhbGxiYWNrLCBib29sIG9wdGlvbmFsX2NhbGxiYWNrKTsKKyAgc3RyaW5nIHRzX2dldF90eXBlKHRfdHlwZSogdHlwZSk7CisKKyAgLyoqCisgICAqIFNwZWNpYWwgaW5kZW50YXRpb24gZm9yIFR5cGVTY3JpcHQgRGVmaW5pdGlvbnMgYmVjYXVzZSBvZiB0aGUgbW9kdWxlLgorICAgKiBSZXR1cm5zIHRoZSBub3JtYWwgaW5kZW50YXRpb24gKyAiICAiIGlmIGEgbW9kdWxlIHdhcyBkZWZpbmVkLgorICAgKiBAcmV0dXJuIHN0cmluZworICAgKi8KKyAgc3RyaW5nIHRzX2luZGVudCgpIHsgcmV0dXJuIGluZGVudCgpICsgKCF0c19tb2R1bGVfLmVtcHR5KCkgPyAiICAiIDogIiIpOyB9CisKKyAgLyoqCisgICAqIFJldHVybnMgImRlY2xhcmUgIiBpZiBubyBtb2R1bGUgd2FzIGRlZmluZWQuCisgICAqIEByZXR1cm4gc3RyaW5nCisgICAqLworICBzdHJpbmcgdHNfZGVjbGFyZSgpIHsgcmV0dXJuICh0c19tb2R1bGVfLmVtcHR5KCkgPyAiZGVjbGFyZSAiIDogIiIpOyB9CisKKyAgLyoqCisgICAqIFJldHVybnMgIj8iIGlmIHRoZSBnaXZlbiBmaWVsZCBpcyBvcHRpb25hbCBvciBoYXMgYSBkZWZhdWx0IHZhbHVlLgorICAgKiBAcGFyYW0gdF9maWVsZCBUaGUgZmllbGQgdG8gY2hlY2sKKyAgICogQHJldHVybiBzdHJpbmcKKyAgICovCisgIHN0cmluZyB0c19nZXRfcmVxKHRfZmllbGQqIGZpZWxkKSB7cmV0dXJuIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwgfHwgZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTEwgPyAiPyIgOiAiIik7IH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgZG9jdW1lbnRhdGlvbiwgaWYgdGhlIHByb3ZpZGVkIGRvY3VtZW50YWJsZSBvYmplY3QgaGFzIG9uZS4KKyAgICogQHBhcmFtIHRfZG9jIFRoZSBvYmplY3QgdG8gZ2V0IHRoZSBkb2N1bWVudGF0aW9uIGZyb20KKyAgICogQHJldHVybiBzdHJpbmcgVGhlIGRvY3VtZW50YXRpb24KKyAgICovCisgIHN0cmluZyB0c19wcmludF9kb2ModF9kb2MqIHRkb2MpIHsKKyAgICBzdHJpbmcgcmVzdWx0ID0gZW5kbDsKKworICAgIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKKyAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGRvYyh0ZG9jLT5nZXRfZG9jKCkpOworICAgICAgc3RyaW5nIGl0ZW07CisKKyAgICAgIHJlc3VsdCArPSB0c19pbmRlbnQoKSArICIvKioiICsgZW5kbDsKKyAgICAgIHdoaWxlIChzdGQ6OmdldGxpbmUoZG9jLCBpdGVtKSkgeworICAgICAgICByZXN1bHQgKz0gdHNfaW5kZW50KCkgKyAiICogIiArIGl0ZW0gKyBlbmRsOworICAgICAgfQorICAgICAgcmVzdWx0ICs9IHRzX2luZGVudCgpICsgIiAqLyIgKyBlbmRsOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKK3ByaXZhdGU6CisgIC8qKgorICAgKiBUcnVlIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSBOb2RlSlMtZnJpZW5kbHkgUlBDIHNlcnZpY2VzLgorICAgKi8KKyAgYm9vbCBnZW5fbm9kZV87CisKKyAgLyoqCisgICAqIFRydWUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIHNlcnZpY2VzIHRoYXQgdXNlIGpRdWVyeSBhamF4IChhc3luYy9zeW5jKS4KKyAgICovCisgIGJvb2wgZ2VuX2pxdWVyeV87CisKKyAgLyoqCisgICAqIFRydWUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIGEgVHlwZVNjcmlwdCBEZWZpbml0aW9uIEZpbGUgZm9yIGVhY2ggc2VydmljZS4KKyAgICovCisgIGJvb2wgZ2VuX3RzXzsKKworICAvKioKKyAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgRVM2IGNvZGUsIGkuZS4gd2l0aCBQcm9taXNlcworICAgKi8KKyAgYm9vbCBnZW5fZXM2XzsKKworICAvKioKKyAgICogVGhlIG5hbWUgb2YgdGhlIGRlZmluZWQgbW9kdWxlKHMpLCBmb3IgVHlwZVNjcmlwdCBEZWZpbml0aW9uIEZpbGVzLgorICAgKi8KKyAgc3RyaW5nIHRzX21vZHVsZV87CisKKyAgLyoqCisgICAqIFRydWUgaWYgd2Ugc2hvdWxkIG5vdCBnZW5lcmF0ZSBuYW1lc3BhY2Ugb2JqZWN0cyBmb3Igbm9kZS4KKyAgICovCisgIGJvb2wgbm9fbnNfOworCisgIC8qKgorICAgKiBUaGUgdmFyaWFibGUgZGVjb3JhdG9yIGZvciAiY29uc3QiIHZhcmlhYmxlcy4gV2lsbCBkZWZhdWx0IHRvICJ2YXIiIGlmIGluIGFuIGluY29tcGF0aWJsZSBsYW5ndWFnZS4KKyAgICovCisgIHN0cmluZyBqc19jb25zdF90eXBlXzsKKworICAgLyoqCisgICAqIFRoZSB2YXJpYWJsZSBkZWNvcmF0b3IgZm9yICJsZXQiIHZhcmlhYmxlcy4gV2lsbCBkZWZhdWx0IHRvICJ2YXIiIGlmIGluIGFuIGluY29tcGF0aWJsZSBsYW5ndWFnZS4KKyAgICovCisgIHN0cmluZyBqc19sZXRfdHlwZV87CisKKyAgIC8qKgorICAgKiBUaGUgZGVmYXVsdCB2YXJpYWJsZSBkZWNvcmF0b3IuIFN1cHBvcnRzIGFsbCBqYXZhc2NyaXB0IGxhbmd1YWdlcywgYnV0IGlzIG5vdCBzY29wZWQgdG8gZnVuY3Rpb25zIG9yIGNsb3N1cmVzLgorICAgKi8KKyAgc3RyaW5nIGpzX3Zhcl90eXBlXzsKKworICAvKioKKyAgICogRmlsZSBzdHJlYW1zCisgICAqLworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfdHlwZXNfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZV87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl90eXBlc190c187CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zZXJ2aWNlX3RzXzsKK307CisKKy8qKgorICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKKyAqIHN0cmVhbXMuCisgKgorICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCisgKi8KK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKKyAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKKworICBzdHJpbmcgb3V0ZGlyID0gZ2V0X291dF9kaXIoKTsKKworICAvLyBNYWtlIG91dHB1dCBmaWxlKHMpCisgIHN0cmluZyBmX3R5cGVzX25hbWUgPSBvdXRkaXIgKyBwcm9ncmFtXy0+Z2V0X25hbWUoKSArICJfdHlwZXMuanMiOworICBmX3R5cGVzXy5vcGVuKGZfdHlwZXNfbmFtZS5jX3N0cigpKTsKKworICBpZiAoZ2VuX3RzXykgeworICAgIHN0cmluZyBmX3R5cGVzX3RzX25hbWUgPSBvdXRkaXIgKyBwcm9ncmFtXy0+Z2V0X25hbWUoKSArICJfdHlwZXMuZC50cyI7CisgICAgZl90eXBlc190c18ub3BlbihmX3R5cGVzX3RzX25hbWUuY19zdHIoKSk7CisgIH0KKworICAvLyBQcmludCBoZWFkZXIKKyAgZl90eXBlc18gPDwgYXV0b2dlbl9jb21tZW50KCk7CisKKyAgaWYgKChnZW5fbm9kZV8gfHwgZ2VuX2VzNl8pICYmIG5vX25zXykgeworICAgIGZfdHlwZXNfIDw8ICJcInVzZSBzdHJpY3RcIjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIGZfdHlwZXNfIDw8IGpzX2luY2x1ZGVzKCkgPDwgZW5kbCA8PCByZW5kZXJfaW5jbHVkZXMoKSA8PCBlbmRsOworCisgIGlmIChnZW5fdHNfKSB7CisgICAgZl90eXBlc190c18gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgdHNfaW5jbHVkZXMoKSA8PCBlbmRsOworICB9CisKKyAgaWYgKGdlbl9ub2RlXykgeworICAgIGZfdHlwZXNfIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJ0dHlwZXMgPSBtb2R1bGUuZXhwb3J0cyA9IHt9OyIgPDwgZW5kbDsKKyAgfQorCisgIHN0cmluZyBwbnM7CisKKyAgLy8gc2V0dXAgdGhlIG5hbWVzcGFjZQorICAvLyBUT0RPIHNob3VsZCB0aGUgbmFtZXNwYWNlIGp1c3QgYmUgaW4gdGhlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgZm9yIG5vZGU/CisgIHZlY3RvcjxzdHJpbmc+IG5zX3BpZWNlcyA9IGpzX25hbWVzcGFjZV9waWVjZXMocHJvZ3JhbV8pOworICBpZiAobnNfcGllY2VzLnNpemUoKSA+IDApIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5zX3BpZWNlcy5zaXplKCk7ICsraSkgeworICAgICAgcG5zICs9ICgoaSA9PSAwKSA/ICIiIDogIi4iKSArIG5zX3BpZWNlc1tpXTsKKyAgICAgIGZfdHlwZXNfIDw8ICJpZiAodHlwZW9mICIgPDwgcG5zIDw8ICIgPT09ICd1bmRlZmluZWQnKSB7IiA8PCBlbmRsOworICAgICAgZl90eXBlc18gPDwgIiAgIiA8PCBwbnMgPDwgIiA9IHt9OyIgPDwgZW5kbDsKKyAgICAgIGZfdHlwZXNfIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgICBpZiAoZ2VuX3RzXykgeworICAgICAgdHNfbW9kdWxlXyA9IHBuczsKKyAgICAgIGZfdHlwZXNfdHNfIDw8ICJkZWNsYXJlIG1vZHVsZSAiIDw8IHRzX21vZHVsZV8gPDwgIiB7IjsKKyAgICB9CisgIH0KK30KKworLyoqCisgKiBQcmludHMgc3RhbmRhcmQganMgaW1wb3J0cworICovCitzdHJpbmcgdF9qc19nZW5lcmF0b3I6OmpzX2luY2x1ZGVzKCkgeworICBpZiAoZ2VuX25vZGVfKSB7CisgICAgc3RyaW5nIHJlc3VsdCA9IGpzX2NvbnN0X3R5cGVfICsgInRocmlmdCA9IHJlcXVpcmUoJ3RocmlmdCcpO1xuIgorICAgICAgICArIGpzX2NvbnN0X3R5cGVfICsgIlRocmlmdCA9IHRocmlmdC5UaHJpZnQ7XG4iOworICAgIGlmICghZ2VuX2VzNl8pIHsKKyAgICAgIHJlc3VsdCArPSBqc19jb25zdF90eXBlXyArICJRID0gdGhyaWZ0LlE7XG4iOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcmV0dXJuICIiOworfQorCisvKioKKyAqIFByaW50cyBzdGFuZGFyZCB0cyBpbXBvcnRzCisgKi8KK3N0cmluZyB0X2pzX2dlbmVyYXRvcjo6dHNfaW5jbHVkZXMoKSB7CisgIGlmIChnZW5fbm9kZV8pIHsKKyAgICByZXR1cm4gc3RyaW5nKAorICAgICAgICAiaW1wb3J0IHRocmlmdCA9IHJlcXVpcmUoJ3RocmlmdCcpO1xuIgorICAgICAgICAiaW1wb3J0IFRocmlmdCA9IHRocmlmdC5UaHJpZnQ7XG4iCisgICAgICAgICJpbXBvcnQgUSA9IHRocmlmdC5RO1xuIik7CisgIH0KKworICByZXR1cm4gIiI7Cit9CisKKy8qKgorICogUmVuZGVycyBhbGwgdGhlIGltcG9ydHMgbmVjZXNzYXJ5IGZvciBpbmNsdWRpbmcgYW5vdGhlciBUaHJpZnQgcHJvZ3JhbQorICovCitzdHJpbmcgdF9qc19nZW5lcmF0b3I6OnJlbmRlcl9pbmNsdWRlcygpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworCisgIGlmIChnZW5fbm9kZV8pIHsKKyAgICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgIHJlc3VsdCArPSBqc19jb25zdF90eXBlXyArIG1ha2VfdmFsaWRfbm9kZUpzX2lkZW50aWZpZXIoaW5jbHVkZXNbaV0tPmdldF9uYW1lKCkpICsgIl90dHlwZXMgPSByZXF1aXJlKCcuLyIgKyBpbmNsdWRlc1tpXS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICsgIl90eXBlcycpO1xuIjsKKyAgICB9CisgICAgaWYgKGluY2x1ZGVzLnNpemUoKSA+IDApIHsKKyAgICAgIHJlc3VsdCArPSAiXG4iOworICAgIH0KKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogQ2xvc2UgdXAgKG9yIGRvd24pIHNvbWUgZmlsZXouCisgKi8KK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKKyAgLy8gQ2xvc2UgdHlwZXMgZmlsZShzKQorCisgIGZfdHlwZXNfLmNsb3NlKCk7CisKKyAgaWYgKGdlbl90c18pIHsKKyAgICBpZiAoIXRzX21vZHVsZV8uZW1wdHkoKSkgeworICAgICAgZl90eXBlc190c18gPDwgIn0iOworICAgIH0KKyAgICBmX3R5cGVzX3RzXy5jbG9zZSgpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBub3QgZG9uZSBpbiBKUywgdHlwZXMgYXJlIGFsbCBpbXBsaWNpdC4KKyAqCisgKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgKHZvaWQpdHR5cGVkZWY7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4gU2luY2UgZGVmaW5lIGlzIGV4cGVuc2l2ZSB0byBsb29rdXAKKyAqIGluIEpTLCB3ZSB1c2UgYSBnbG9iYWwgYXJyYXkgZm9yIHRoaXMuCisgKgorICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgZl90eXBlc18gPDwganNfdHlwZV9uYW1lc3BhY2UodGVudW0tPmdldF9wcm9ncmFtKCkpIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICIgPSB7IiA8PCBlbmRsOworCisgIGlmIChnZW5fdHNfKSB7CisgICAgZl90eXBlc190c18gPDwgdHNfcHJpbnRfZG9jKHRlbnVtKSA8PCB0c19pbmRlbnQoKSA8PCB0c19kZWNsYXJlKCkgPDwgImVudW0gIgorICAgICAgICAgICAgICAgIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICIgeyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF91cCgpOworCisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdCYgY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICBpZiAoZ2VuX3RzXykgeworICAgICAgZl90eXBlc190c18gPDwgdHNfaW5kZW50KCkgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8IHZhbHVlIDw8ICIsIiA8PCBlbmRsOworICAgICAgLy8gYWRkICd2YWx1ZToga2V5JyBpbiBhZGRpdGlvbiB0byAna2V5OiB2YWx1ZScgZm9yIFR5cGVTY3JpcHQgZW51bXMKKyAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICInIiA8PCB2YWx1ZSA8PCAiJyA6ICciIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJywiIDw8IGVuZGw7CisgICAgfQorICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICInIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIicgOiAiIDw8IHZhbHVlOworICAgIGlmIChjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpIC0gMSkgeworICAgICAgZl90eXBlc18gPDwgIiwiOworICAgIH0KKyAgICBmX3R5cGVzXyA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBmX3R5cGVzXyA8PCAifTsiIDw8IGVuZGw7CisKKyAgaWYgKGdlbl90c18pIHsKKyAgICBmX3R5cGVzX3RzXyA8PCB0c19pbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlIGEgY29uc3RhbnQgdmFsdWUKKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7CisgIHRfdHlwZSogdHlwZSA9IHRjb25zdC0+Z2V0X3R5cGUoKTsKKyAgc3RyaW5nIG5hbWUgPSB0Y29uc3QtPmdldF9uYW1lKCk7CisgIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gdGNvbnN0LT5nZXRfdmFsdWUoKTsKKworICBmX3R5cGVzXyA8PCBqc190eXBlX25hbWVzcGFjZShwcm9ncmFtXykgPDwgbmFtZSA8PCAiID0gIjsKKyAgZl90eXBlc18gPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlKSA8PCAiOyIgPDwgZW5kbDsKKworICBpZiAoZ2VuX3RzXykgeworICAgIGZfdHlwZXNfdHNfIDw8IHRzX3ByaW50X2RvYyh0Y29uc3QpIDw8IHRzX2luZGVudCgpIDw8IHRzX2RlY2xhcmUoKSA8PCBqc19jb25zdF90eXBlXyA8PCBuYW1lIDw8ICI6ICIKKyAgICAgICAgICAgICAgICA8PCB0c19nZXRfdHlwZSh0eXBlKSA8PCAiOyIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZworICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKKyAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCisgKi8KK3N0cmluZyB0X2pzX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgb3V0IDw8ICInIiA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICInIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIG91dCA8PCAodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwID8gInRydWUiIDogImZhbHNlIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgZW1pdF9kb3VibGVfYXNfc3RyaW5nKHZhbHVlLT5nZXRfZG91YmxlKCkpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIG91dCA8PCAibmV3ICIgPDwganNfdHlwZV9uYW1lc3BhY2UodHlwZS0+Z2V0X3Byb2dyYW0oKSkgPDwgdHlwZS0+Z2V0X25hbWUoKSA8PCAiKHsiOworICAgIGluZGVudF91cCgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisgICAgICBpZiAodl9pdGVyICE9IHZhbC5iZWdpbigpKQorICAgICAgICBvdXQgPDwgIiwiOworICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGdfdHlwZV9zdHJpbmcsIHZfaXRlci0+Zmlyc3QpOworICAgICAgb3V0IDw8ICIgOiAiOworICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0pIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisKKyAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworICAgIG91dCA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIGlmICh2X2l0ZXIgIT0gdmFsLmJlZ2luKCkpCisgICAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKKworICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgdl9pdGVyLT5maXJzdCk7CisKKyAgICAgIG91dCA8PCAiIDogIjsKKyAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUodnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF90eXBlKiBldHlwZTsKKyAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0gZWxzZSB7CisgICAgICBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfQorICAgIG91dCA8PCAiWyI7CisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBpZiAodl9pdGVyICE9IHZhbC5iZWdpbigpKQorICAgICAgICBvdXQgPDwgIiwiOworICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlcik7CisgICAgfQorICAgIG91dCA8PCAiXSI7CisgIH0KKyAgcmV0dXJuIG91dC5zdHIoKTsKK30KKworLyoqCisgKiBNYWtlIGEgc3RydWN0CisgKi8KK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9qc19zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBleGNlcHRpb24uIEJhc2ljYWxseSB0aGUgc2FtZQorICogYXMgYSBzdHJ1Y3QgYnV0IGV4dGVuZHMgdGhlIEV4Y2VwdGlvbiBjbGFzcy4KKyAqCisgKiBAcGFyYW0gdHhjZXB0aW9uIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX2pzX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOworfQorCisvKioKKyAqIFN0cnVjdHMgY2FuIGJlIG5vcm1hbCBvciBleGNlcHRpb25zLgorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qc19zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX2pzX3N0cnVjdF9kZWZpbml0aW9uKGZfdHlwZXNfLCB0c3RydWN0LCBpc19leGNlcHRpb24pOworfQorCisvKioKKyAqIFJldHVybiB0eXBlIG9mIGNvbnRhaW5lZCBlbGVtZW50cyBmb3IgYSBjb250YWluZXIgdHlwZS4gRm9yIG1hcHMKKyAqIHRoaXMgaXMgdHlwZSBvZiB2YWx1ZSAoa2V5cyBhcmUgYWx3YXlzIHN0cmluZ3MgaW4ganMpCisgKi8KK3RfdHlwZSogdF9qc19nZW5lcmF0b3I6OmdldF9jb250YWluZWRfdHlwZSh0X3R5cGUqIHQpIHsKKyAgdF90eXBlKiBldHlwZTsKKyAgaWYgKHQtPmlzX2xpc3QoKSkgeworICAgIGV0eXBlID0gKCh0X2xpc3QqKXQpLT5nZXRfZWxlbV90eXBlKCk7CisgIH0gZWxzZSBpZiAodC0+aXNfc2V0KCkpIHsKKyAgICBldHlwZSA9ICgodF9zZXQqKXQpLT5nZXRfZWxlbV90eXBlKCk7CisgIH0gZWxzZSB7CisgICAgZXR5cGUgPSAoKHRfbWFwKil0KS0+Z2V0X3ZhbF90eXBlKCk7CisgIH0KKyAgcmV0dXJuIGV0eXBlOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuIFRoaXMgaXMgbm90aGluZyBpbiBKUworICogd2hlcmUgdGhlIG9iamVjdHMgYXJlIGFsbCBqdXN0IGFzc29jaWF0aXZlIGFycmF5cyAodW5sZXNzIG9mIGNvdXJzZSB3ZQorICogZGVjaWRlIHRvIHN0YXJ0IHVzaW5nIG9iamVjdHMgZm9yIHRoZW0uLi4pCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2pzX3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4cG9ydGVkKSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgaWYgKGdlbl9ub2RlXykgeworICAgIHN0cmluZyBwcmVmaXggPSBoYXNfanNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpID8ganNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpIDoganNfY29uc3RfdHlwZV87CisgICAgb3V0IDw8IHByZWZpeCA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8CisgICAgICAoaXNfZXhwb3J0ZWQgPyAiID0gbW9kdWxlLmV4cG9ydHMuIiArIHRzdHJ1Y3QtPmdldF9uYW1lKCkgOiAiIik7CisgICAgaWYgKGdlbl90c18pIHsKKyAgICAgIGZfdHlwZXNfdHNfIDw8IHRzX3ByaW50X2RvYyh0c3RydWN0KSA8PCB0c19pbmRlbnQoKSA8PCB0c19kZWNsYXJlKCkgPDwgImNsYXNzICIKKyAgICAgICAgICAgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgKGlzX2V4Y2VwdGlvbiA/ICIgZXh0ZW5kcyBUaHJpZnQuVEV4Y2VwdGlvbiIgOiAiIikKKyAgICAgICAgICAgICAgICAgIDw8ICIgeyIgPDwgZW5kbDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgb3V0IDw8IGpzX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpOworICAgIGlmIChnZW5fdHNfKSB7CisgICAgICBmX3R5cGVzX3RzXyA8PCB0c19wcmludF9kb2ModHN0cnVjdCkgPDwgdHNfaW5kZW50KCkgPDwgdHNfZGVjbGFyZSgpIDw8ICJjbGFzcyAiCisgICAgICAgICAgICAgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8IChpc19leGNlcHRpb24gPyAiIGV4dGVuZHMgVGhyaWZ0LlRFeGNlcHRpb24iIDogIiIpCisgICAgICAgICAgICAgICAgICA8PCAiIHsiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaWYgKGdlbl9lczZfKSB7CisgICAgaWYgKGdlbl9ub2RlXyAmJiBpc19leGNlcHRpb24pIHsKKyAgICAgIG91dCA8PCAiID0gY2xhc3MgZXh0ZW5kcyBUaHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgIiA9IGNsYXNzIHsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJjb25zdHJ1Y3RvcihhcmdzKSB7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIG91dCA8PCAiID0gZnVuY3Rpb24oYXJncykgeyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF91cCgpOworCisgIC8vIENhbGwgc3VwZXIoKSBtZXRob2Qgb24gaW5oZXJpdGVkIEVycm9yIGNsYXNzCisgIGlmIChnZW5fbm9kZV8gJiYgaXNfZXhjZXB0aW9uKSB7CisgICAgaWYgKGdlbl9lczZfKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAic3VwZXIoYXJncyk7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiVGhyaWZ0LlRFeGNlcHRpb24uY2FsbCh0aGlzLCBcIiIgPDwganNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpCisgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlwiKTsiIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGhpcy5uYW1lID0gXCIiIDw8IGpzX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKQorICAgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJcIjsiIDw8IGVuZGw7CisgIH0KKworICAvLyBtZW1iZXJzIHdpdGggYXJndW1lbnRzCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBzdHJpbmcgZHZhbCA9IGRlY2xhcmVfZmllbGQoKm1faXRlciwgZmFsc2UsIHRydWUpOworICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMICYmICEodC0+aXNfc3RydWN0KCkgfHwgdC0+aXNfeGNlcHRpb24oKSkpIHsKKyAgICAgIGR2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpLCAoKm1faXRlciktPmdldF92YWx1ZSgpKTsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGhpcy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCBkdmFsIDw8ICI7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgZHZhbCA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKGdlbl90c18pIHsKKyAgICAgIGlmIChnZW5fbm9kZV8pIHsKKyAgICAgICAgZl90eXBlc190c18gPDwgdHNfaW5kZW50KCkgPDwgInB1YmxpYyAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOiAiCisgICAgICAgICAgICAgICAgICAgIDw8IHRzX2dldF90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3R5cGVzX3RzXyA8PCB0c19pbmRlbnQoKSA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjogIgorICAgICAgICAgICAgICAgICAgICA8PCB0c19nZXRfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICI7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgCisgICAgfQorICB9CisKKyAgLy8gR2VuZXJhdGUgY29uc3RydWN0b3IgZnJvbSBhcnJheQorICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMICYmICh0LT5pc19zdHJ1Y3QoKSB8fCB0LT5pc194Y2VwdGlvbigpKSkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIgorICAgICAgICAgICAgICAgICAgICA8PCByZW5kZXJfY29uc3RfdmFsdWUodCwgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgLy8gRWFybHkgcmV0dXJucyBmb3IgZXhjZXB0aW9ucworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgIGlmICh0LT5pc194Y2VwdGlvbigpKSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKGFyZ3MgaW5zdGFuY2VvZiAiIDw8IGpzX3R5cGVfbmFtZXNwYWNlKHQtPmdldF9wcm9ncmFtKCkpCisgICAgICAgICAgICA8PCB0LT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgaW5kZW50KCkgPDwgInRoaXMuIgorICAgICAgICAgICAgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBhcmdzOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBpbmRlbnQoKSA8PCAicmV0dXJuOyIKKyAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgaW5kZW50KG91dCkgPDwgImlmIChhcmdzKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGlmIChnZW5fdHNfKSB7CisgICAgICBmX3R5cGVzX3RzXyA8PCBlbmRsIDw8IHRzX2luZGVudCgpIDw8ICJjb25zdHJ1Y3RvcihhcmdzPzogeyAiOworICAgIH0KKworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoYXJncy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9PSB1bmRlZmluZWQgJiYgYXJncy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9PSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKKworICAgICAgaWYgKHQtPmlzX3N0cnVjdCgpKSB7CisgICAgICAgIG91dCA8PCAoIiA9IG5ldyAiICsganNfdHlwZV9uYW1lc3BhY2UodC0+Z2V0X3Byb2dyYW0oKSkgKyB0LT5nZXRfbmFtZSgpICsKKyAgICAgICAgICAgICAgICAiKGFyZ3MuIisoKm1faXRlciktPmdldF9uYW1lKCkgKyIpOyIpOworICAgICAgICBvdXQgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSBpZiAodC0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgICAgdF90eXBlKiBldHlwZSA9IGdldF9jb250YWluZWRfdHlwZSh0KTsKKyAgICAgICAgc3RyaW5nIGNvcHlGdW5jID0gdC0+aXNfbWFwKCkgPyAiVGhyaWZ0LmNvcHlNYXAiIDogIlRocmlmdC5jb3B5TGlzdCI7CisgICAgICAgIHN0cmluZyB0eXBlX2xpc3QgPSAiIjsKKworICAgICAgICB3aGlsZSAoZXR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICAgICAgaWYgKHR5cGVfbGlzdC5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgIHR5cGVfbGlzdCArPSAiLCAiOworICAgICAgICAgIH0KKyAgICAgICAgICB0eXBlX2xpc3QgKz0gZXR5cGUtPmlzX21hcCgpID8gIlRocmlmdC5jb3B5TWFwIiA6ICJUaHJpZnQuY29weUxpc3QiOworICAgICAgICAgIGV0eXBlID0gZ2V0X2NvbnRhaW5lZF90eXBlKGV0eXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChldHlwZS0+aXNfc3RydWN0KCkpIHsKKyAgICAgICAgICBpZiAodHlwZV9saXN0Lmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgdHlwZV9saXN0ICs9ICIsICI7CisgICAgICAgICAgfQorICAgICAgICAgIHR5cGVfbGlzdCArPSBqc190eXBlX25hbWVzcGFjZShldHlwZS0+Z2V0X3Byb2dyYW0oKSkgKyBldHlwZS0+Z2V0X25hbWUoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICBpZiAodHlwZV9saXN0Lmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgdHlwZV9saXN0ICs9ICIsICI7CisgICAgICAgICAgfQorICAgICAgICAgIHR5cGVfbGlzdCArPSAibnVsbCI7CisgICAgICAgIH0KKworICAgICAgICBvdXQgPDwgKCIgPSAiICsgY29weUZ1bmMgKyAiKGFyZ3MuIiArICgqbV9pdGVyKS0+Z2V0X25hbWUoKSArCisgICAgICAgICAgICAgICAgIiwgWyIgKyB0eXBlX2xpc3QgKyAiXSk7Iik7CisgICAgICAgIG91dCA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8ICIgPSBhcmdzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaWYgKCEoKm1faXRlciktPmdldF9yZXEoKSkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgICAgICAgICBpbmRlbnQob3V0KQorICAgICAgICAgICAgPDwgIiAgdGhyb3cgbmV3IFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24oVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvblR5cGUuVU5LTk9XTiwgIgorICAgICAgICAgICAgICAgIidSZXF1aXJlZCBmaWVsZCAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGlzIHVuc2V0IScpOyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgaWYgKGdlbl90c18pIHsKKyAgICAgICAgZl90eXBlc190c18gPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8IHRzX2dldF9yZXEoKm1faXRlcikgPDwgIjogIgorICAgICAgICAgICAgICAgICAgICA8PCB0c19nZXRfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICI7ICI7CisgICAgICB9CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIGlmIChnZW5fdHNfKSB7CisgICAgICBmX3R5cGVzX3RzXyA8PCAifSk7IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIC8vIERvbmUgd2l0aCBjb25zdHJ1Y3RvcgorICBpbmRlbnRfZG93bigpOworICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJ9OyIgPDwgZW5kbDsKKyAgfQorCisgIGlmIChnZW5fdHNfKSB7CisgICAgZl90eXBlc190c18gPDwgdHNfaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICBpZiAoIWdlbl9lczZfKSB7CisgICAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgICAgb3V0IDw8ICJUaHJpZnQuaW5oZXJpdHMoIiA8PCBqc19uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQorICAgICAgICAgIDw8ICIsIFRocmlmdC5URXhjZXB0aW9uKTsiIDw8IGVuZGw7CisgICAgICBvdXQgPDwganNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIi5wcm90b3R5cGUubmFtZSA9ICciCisgICAgICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJzsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIGluaXQgcHJvdG90eXBlIG1hbnVhbGx5IGlmIHdlIGFyZW4ndCB1c2luZyBlczYKKyAgICAgIG91dCA8PCBqc19uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiLnByb3RvdHlwZSA9IHt9OyIKKyAgICAgICAgICA8PCBlbmRsOworICAgIH0KKworICB9CisKKyAgZ2VuZXJhdGVfanNfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9qc19zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7CisKKyAgLy8gQ2xvc2Ugb3V0IHRoZSBjbGFzcyBkZWZpbml0aW9uCisgIGlmIChnZW5fZXM2XykgeworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn07IiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSByZWFkKCkgbWV0aG9kIGZvciBhIHN0cnVjdAorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qc19zdHJ1Y3RfcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGlmIChnZW5fZXM2XykgeworICAgIGluZGVudChvdXQpIDw8ICJyZWFkIChpbnB1dCkgeyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCBqc19uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQorICAgICAgICA8PCAiLnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24oaW5wdXQpIHsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCAiaW5wdXQucmVhZFN0cnVjdEJlZ2luKCk7IiA8PCBlbmRsOworCisgIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcworICBpbmRlbnQob3V0KSA8PCAid2hpbGUgKHRydWUpIHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KG91dCkgPDwganNfY29uc3RfdHlwZV8gPDwgInJldCA9IGlucHV0LnJlYWRGaWVsZEJlZ2luKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCBqc19jb25zdF90eXBlXyA8PCAiZnR5cGUgPSByZXQuZnR5cGU7IiA8PCBlbmRsOworICBpZiAoIWZpZWxkcy5lbXB0eSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwganNfY29uc3RfdHlwZV8gPDwgImZpZCA9IHJldC5maWQ7IiA8PCBlbmRsOworICB9CisKKyAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyIGFuZCBicmVhaworICBpbmRlbnQob3V0KSA8PCAiaWYgKGZ0eXBlID09IFRocmlmdC5UeXBlLlNUT1ApIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQob3V0KSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgaWYgKCFmaWVsZHMuZW1wdHkoKSkgeworICAgIC8vIFN3aXRjaCBzdGF0ZW1lbnQgb24gdGhlIGZpZWxkIHdlIGFyZSByZWFkaW5nCisgICAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmlkKSB7IiA8PCBlbmRsOworCisgICAgaW5kZW50X3VwKCk7CisKKyAgICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworCisgICAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI6IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgImlmIChmdHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpIHsiIDw8IGVuZGw7CisKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy4iKTsKKyAgICAgIGluZGVudF9kb3duKCk7CisKKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKworICAgICAgaW5kZW50KG91dCkgPDwgIiAgaW5wdXQuc2tpcChmdHlwZSk7IiA8PCBlbmRsOworCisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKGZpZWxkcy5zaXplKCkgPT0gMSkgeworICAgICAgLy8gcHNldWRvIGNhc2UgdG8gbWFrZSBqc2xpbnQgaGFwcHkKKyAgICAgIGluZGVudChvdXQpIDw8ICJjYXNlIDA6IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgaW5wdXQuc2tpcChmdHlwZSk7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiAgYnJlYWs7IiA8PCBlbmRsOworICAgIH0KKyAgICAvLyBJbiB0aGUgZGVmYXVsdCBjYXNlIHdlIHNraXAgdGhlIGZpZWxkCisgICAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIgIGlucHV0LnNraXAoZnR5cGUpOyIgPDwgZW5kbDsKKworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaW5wdXQuc2tpcChmdHlwZSk7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgImlucHV0LnJlYWRGaWVsZEVuZCgpOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKG91dCk7CisKKyAgaW5kZW50KG91dCkgPDwgImlucHV0LnJlYWRTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgInJldHVybjsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSB3cml0ZSgpIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfanNfc3RydWN0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGlmIChnZW5fZXM2XykgeworICAgIGluZGVudChvdXQpIDw8ICJ3cml0ZSAob3V0cHV0KSB7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8IGpzX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCisgICAgICAgIDw8ICIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24ob3V0cHV0KSB7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KG91dCkgPDwgIm91dHB1dC53cml0ZVN0cnVjdEJlZ2luKCciIDw8IG5hbWUgPDwgIicpOyIgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoaXMuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPT0gbnVsbCAmJiB0aGlzLiIKKyAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT09IHVuZGVmaW5lZCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGluZGVudChvdXQpIDw8ICJvdXRwdXQud3JpdGVGaWVsZEJlZ2luKCIKKyAgICAgICAgICAgICAgICA8PCAiJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpCisgICAgICAgICAgICAgICAgPDwgIiwgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiKTsiIDw8IGVuZGw7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLiIpOworCisgICAgaW5kZW50KG91dCkgPDwgIm91dHB1dC53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgfQorCisgIG91dCA8PCBpbmRlbnQoKSA8PCAib3V0cHV0LndyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvdXRwdXQud3JpdGVTdHJ1Y3RFbmQoKTsiCisgICAgICA8PCBlbmRsOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn07IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gZ2V0X291dF9kaXIoKSArIHNlcnZpY2VfbmFtZV8gKyAiLmpzIjsKKyAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOworCisgIGlmIChnZW5fdHNfKSB7CisgICAgc3RyaW5nIGZfc2VydmljZV90c19uYW1lID0gZ2V0X291dF9kaXIoKSArIHNlcnZpY2VfbmFtZV8gKyAiLmQudHMiOworICAgIGZfc2VydmljZV90c18ub3BlbihmX3NlcnZpY2VfdHNfbmFtZS5jX3N0cigpKTsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgYXV0b2dlbl9jb21tZW50KCk7CisKKyAgaWYgKChnZW5fbm9kZV8gfHwgZ2VuX2VzNl8pICYmIG5vX25zXykgeworICAgIGZfc2VydmljZV8gPDwgIlwidXNlIHN0cmljdFwiOyIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBqc19pbmNsdWRlcygpIDw8IGVuZGwgPDwgcmVuZGVyX2luY2x1ZGVzKCkgPDwgZW5kbDsKKworICBpZiAoZ2VuX3RzXykgeworICAgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgICBmX3NlcnZpY2VfdHNfIDw8ICIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiIiA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICA8PCAiLmQudHNcIiAvPiIgPDwgZW5kbDsKKyAgICB9CisgICAgZl9zZXJ2aWNlX3RzXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOworICAgIGlmIChnZW5fbm9kZV8pIHsKKyAgICAgIGZfc2VydmljZV90c18gPDwgdHNfaW5jbHVkZXMoKSA8PCBlbmRsOworICAgICAgZl9zZXJ2aWNlX3RzXyA8PCAiaW1wb3J0IHR0eXBlcyA9IHJlcXVpcmUoJy4vIiArIHByb2dyYW1fLT5nZXRfbmFtZSgpICsgIl90eXBlcycpOyIgPDwgZW5kbDsKKyAgICAgIC8vIEdlbmVyYXRlIHR5cGUgYWxpYXNlcworICAgICAgLy8gZW51bQorICAgICAgdmVjdG9yPHRfZW51bSo+IGNvbnN0JiBlbnVtcyA9IHByb2dyYW1fLT5nZXRfZW51bXMoKTsKKyAgICAgIHZlY3Rvcjx0X2VudW0qPjo6Y29uc3RfaXRlcmF0b3IgZV9pdGVyOworICAgICAgZm9yIChlX2l0ZXIgPSBlbnVtcy5iZWdpbigpOyBlX2l0ZXIgIT0gZW51bXMuZW5kKCk7ICsrZV9pdGVyKSB7CisgICAgICAgIGZfc2VydmljZV90c18gPDwgImltcG9ydCAiIDw8ICgqZV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gdHR5cGVzLiIKKyAgICAgICAgICAgICAgICAgIDw8IGpzX25hbWVzcGFjZShwcm9ncmFtXykgPDwgKCplX2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGVuZGw7CisgICAgICB9CisgICAgICAvLyBjb25zdAorICAgICAgdmVjdG9yPHRfY29uc3QqPiBjb25zdCYgY29uc3RzID0gcHJvZ3JhbV8tPmdldF9jb25zdHMoKTsKKyAgICAgIHZlY3Rvcjx0X2NvbnN0Kj46OmNvbnN0X2l0ZXJhdG9yIGNfaXRlcjsKKyAgICAgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgICAgIGZfc2VydmljZV90c18gPDwgImltcG9ydCAiIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gdHR5cGVzLiIKKyAgICAgICAgICAgICAgICAgIDw8IGpzX25hbWVzcGFjZShwcm9ncmFtXykgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGVuZGw7CisgICAgICB9CisgICAgICAvLyBleGNlcHRpb24KKyAgICAgIHZlY3Rvcjx0X3N0cnVjdCo+IGNvbnN0JiBleGNlcHRpb25zID0gcHJvZ3JhbV8tPmdldF94Y2VwdGlvbnMoKTsKKyAgICAgIHZlY3Rvcjx0X3N0cnVjdCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgICBmb3IgKHhfaXRlciA9IGV4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IGV4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgIGZfc2VydmljZV90c18gPDwgImltcG9ydCAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gdHR5cGVzLiIKKyAgICAgICAgICAgICAgICAgIDw8IGpzX25hbWVzcGFjZShwcm9ncmFtXykgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGVuZGw7CisgICAgICB9CisgICAgICAvLyBzdHJ1Y3RzCisgICAgICB2ZWN0b3I8dF9zdHJ1Y3QqPiBjb25zdCYgc3RydWN0cyA9IHByb2dyYW1fLT5nZXRfc3RydWN0cygpOworICAgICAgdmVjdG9yPHRfc3RydWN0Kj46OmNvbnN0X2l0ZXJhdG9yIHNfaXRlcjsKKyAgICAgIGZvciAoc19pdGVyID0gc3RydWN0cy5iZWdpbigpOyBzX2l0ZXIgIT0gc3RydWN0cy5lbmQoKTsgKytzX2l0ZXIpIHsKKyAgICAgICAgZl9zZXJ2aWNlX3RzXyA8PCAiaW1wb3J0ICIgPDwgKCpzX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSB0dHlwZXMuIgorICAgICAgICAgICAgICAgICAgPDwganNfbmFtZXNwYWNlKHByb2dyYW1fKSA8PCAoKnNfaXRlciktPmdldF9uYW1lKCkgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCF0c19tb2R1bGVfLmVtcHR5KCkpIHsKKyAgICAgIGZfc2VydmljZV90c18gPDwgImRlY2xhcmUgbW9kdWxlICIgPDwgdHNfbW9kdWxlXyA8PCAiIHsiOworICAgIH0KKyAgfQorCisgIGlmIChnZW5fbm9kZV8pIHsKKyAgICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgICAgZl9zZXJ2aWNlXyA8PCBqc19jb25zdF90eXBlXyA8PCAgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgPDwgIiA9IHJlcXVpcmUoJy4vIgorICAgICAgICAgICAgICAgICA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSA8PCAiJyk7IiA8PCBlbmRsIDw8IGpzX2NvbnN0X3R5cGVfCisgICAgICAgICAgICAgICAgIDw8IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgIDw8ICJDbGllbnQgPSAiIDw8IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpIDw8ICIuQ2xpZW50OyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBqc19jb25zdF90eXBlXyA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICA8PCAiUHJvY2Vzc29yID0gIiA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSA8PCAiLlByb2Nlc3NvcjsiIDw8IGVuZGw7CisgICAgfQorCisgICAgZl9zZXJ2aWNlXyA8PCBqc19jb25zdF90eXBlXyA8PCAidHR5cGVzID0gcmVxdWlyZSgnLi8iICsgcHJvZ3JhbV8tPmdldF9uYW1lKCkgKyAiX3R5cGVzJyk7IiA8PCBlbmRsOworICB9CisKKyAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7CisKKyAgaWYgKGdlbl9ub2RlXykgeworICAgIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRzZXJ2aWNlKTsKKyAgfQorCisgIGZfc2VydmljZV8uY2xvc2UoKTsKKyAgaWYgKGdlbl90c18pIHsKKyAgICBpZiAoIXRzX21vZHVsZV8uZW1wdHkoKSkgeworICAgICAgZl9zZXJ2aWNlX3RzXyA8PCAifSI7CisgICAgfQorICAgIGZfc2VydmljZV90c18uY2xvc2UoKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICBpZiAoZ2VuX25vZGVfKSB7CisgICAgc3RyaW5nIHByZWZpeCA9IGhhc19qc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpID8ganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA6IGpzX2NvbnN0X3R5cGVfOworICAgIGZfc2VydmljZV8gPDwgcHJlZml4IDw8IHNlcnZpY2VfbmFtZV8gPDwgIlByb2Nlc3NvciA9ICIgPDwgImV4cG9ydHMuUHJvY2Vzc29yIjsKKyAgICBpZiAoZ2VuX3RzXykgeworICAgICAgZl9zZXJ2aWNlX3RzXyA8PCBlbmRsIDw8ICJkZWNsYXJlIGNsYXNzIFByb2Nlc3NvciAiOworICAgICAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICAgICAgZl9zZXJ2aWNlX3RzXyA8PCAiZXh0ZW5kcyAiIDw8IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpIDw8ICJQcm9jZXNzb3IgIjsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV90c18gPDwgInsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV90c18gPDwgdHNfaW5kZW50KCkgPDwgInByaXZhdGUgX2hhbmRsZXI6IE9iamVjdDsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICAgIGZfc2VydmljZV90c18gPDwgdHNfaW5kZW50KCkgPDwgImNvbnN0cnVjdG9yKGhhbmRsZXI6IE9iamVjdCk7IiA8PCBlbmRsOworICAgICAgZl9zZXJ2aWNlX3RzXyA8PCB0c19pbmRlbnQoKSA8PCAicHJvY2VzcyhpbnB1dDogVGhyaWZ0LlRKU09OUHJvdG9jb2wsIG91dHB1dDogVGhyaWZ0LlRKU09OUHJvdG9jb2wpOiB2b2lkOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgfQorICB9IGVsc2UgeworICAgIGZfc2VydmljZV8gPDwganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJQcm9jZXNzb3IgPSAiCisgICAgICAgICAgICAgPDwgImV4cG9ydHMuUHJvY2Vzc29yIjsKKyAgfQorCisgIGJvb2wgaXNfc3ViY2xhc3Nfc2VydmljZSA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEw7CisKKyAgLy8gRVM2IENvbnN0cnVjdG9yCisgIGlmIChnZW5fZXM2XykgeworICAgIGlmIChpc19zdWJjbGFzc19zZXJ2aWNlKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIgPSBjbGFzcyBleHRlbmRzICIgPDwgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgPDwgIlByb2Nlc3NvciB7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIgPSBjbGFzcyB7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImNvbnN0cnVjdG9yKGhhbmRsZXIpIHsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiID0gZnVuY3Rpb24oaGFuZGxlcikgeyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF91cCgpOworICBpZiAoZ2VuX2VzNl8gJiYgaXNfc3ViY2xhc3Nfc2VydmljZSkgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAic3VwZXIoaGFuZGxlcik7IiA8PCBlbmRsOworICB9CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidGhpcy5faGFuZGxlciA9IGhhbmRsZXI7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIC8vIERvbmUgd2l0aCBjb25zdHJ1Y3RvcgorICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9OyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIEVTNSBzZXJ2aWNlIGluaGVyaXRhbmNlCisgIGlmICghZ2VuX2VzNl8gJiYgaXNfc3ViY2xhc3Nfc2VydmljZSkgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVGhyaWZ0LmluaGVyaXRzKCIgPDwganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKQorICAgICAgICAgICAgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfIDw8ICJQcm9jZXNzb3IsICIgPDwgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIlByb2Nlc3Nvcik7IiA8PCBlbmRsOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIHNlcnZlciBpbXBsZW1lbnRhdGlvbgorICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByb2Nlc3MgKGlucHV0LCBvdXRwdXQpIHsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc2VydmljZV9uYW1lXworICAgICAgICAgICAgICAgICAgICAgIDw8ICJQcm9jZXNzb3IucHJvdG90eXBlLnByb2Nlc3MgPSBmdW5jdGlvbihpbnB1dCwgb3V0cHV0KSB7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJyID0gaW5wdXQucmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJpZiAodGhpc1sncHJvY2Vzc18nICsgci5mbmFtZV0pIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiICByZXR1cm4gdGhpc1sncHJvY2Vzc18nICsgci5mbmFtZV0uY2FsbCh0aGlzLCByLnJzZXFpZCwgaW5wdXQsIG91dHB1dCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIGlucHV0LnNraXAoVGhyaWZ0LlR5cGUuU1RSVUNUKTsiCisgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBpbnB1dC5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICIgICIgPDwganNfY29uc3RfdHlwZV8gPDwgInggPSBuZXcgIgorICAgICAgICAgICAgICAgICJUaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb25UeXBlLlVOS05PV05fTUVUSE9ELCAiCisgICAgICAgICAgICAgICAgIidVbmtub3duIGZ1bmN0aW9uICcgKyByLmZuYW1lKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiICBvdXRwdXQud3JpdGVNZXNzYWdlQmVnaW4oci5mbmFtZSwgVGhyaWZ0Lk1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgci5yc2VxaWQpOyIKKyAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHgud3JpdGUob3V0cHV0KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiICBvdXRwdXQud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIG91dHB1dC5mbHVzaCgpOyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGlmIChnZW5fZXM2XykgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn07IiA8PCBlbmRsOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7CisgIH0KKworICAvLyBDbG9zZSBvZmYgdGhlIHByb2Nlc3NvciBjbGFzcyBkZWZpbml0aW9uCisgIGlmIChnZW5fZXM2XykgeworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9OyIgPDwgZW5kbDsKKyAgfQorICBpZiAoZ2VuX25vZGVfICYmIGdlbl90c18pIHsKKyAgICBmX3NlcnZpY2VfdHNfIDw8ICJ9IiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgaWYgKGdlbl9lczZfKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm9jZXNzXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiIChzZXFpZCwgaW5wdXQsIG91dHB1dCkgeyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCBzZXJ2aWNlX25hbWVfCisgICAgICAgICAgICAgICAgICAgICAgPDwgIlByb2Nlc3Nvci5wcm90b3R5cGUucHJvY2Vzc18iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiA9IGZ1bmN0aW9uKHNlcWlkLCBpbnB1dCwgb3V0cHV0KSB7IiA8PCBlbmRsOworICB9CisgIGlmIChnZW5fdHNfKSB7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9zZXJ2aWNlX3RzXyA8PCB0c19pbmRlbnQoKSA8PCAicHJvY2Vzc18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKHNlcWlkOiBudW1iZXIsIGlucHV0OiBUaHJpZnQuVEpTT05Qcm90b2NvbCwgb3V0cHV0OiBUaHJpZnQuVEpTT05Qcm90b2NvbCk6IHZvaWQ7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBpbmRlbnRfdXAoKTsKKworICBzdHJpbmcgYXJnc25hbWUgPSBqc19uYW1lc3BhY2UocHJvZ3JhbV8pICsgc2VydmljZV9uYW1lXyArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyI7CisgIHN0cmluZyByZXN1bHRuYW1lID0ganNfbmFtZXNwYWNlKHByb2dyYW1fKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICArICJfcmVzdWx0IjsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwganNfY29uc3RfdHlwZV8gPDwgImFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgImFyZ3MucmVhZChpbnB1dCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpbnB1dC5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAorICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gU2hvcnRjdXQgb3V0IGhlcmUgZm9yIG9uZXdheSBmdW5jdGlvbnMKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRoaXMuX2hhbmRsZXIuIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOworCisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB9CisKKyAgICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgaWYgKGdlbl9lczZfKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifTsiIDw8IGVuZGw7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorCisgIC8vIFByb21pc2Ugc3R5bGUgaW52b2NhdGlvbgorICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmICh0aGlzLl9oYW5kbGVyLiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgPDwgIi5sZW5ndGggPT09ICIgPDwgZmllbGRzLnNpemUoKSA8PCAiKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlByb21pc2UucmVzb2x2ZSh0aGlzLl9oYW5kbGVyLiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIuYmluZCh0aGlzLl9oYW5kbGVyKSgiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgc3RyaW5nIG1heWJlQ29tbWEgPSAoZmllbGRzLnNpemUoKSA+IDAgPyAiLCIgOiAiIik7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJRLmZjYWxsKHRoaXMuX2hhbmRsZXIuIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIi5iaW5kKHRoaXMuX2hhbmRsZXIpIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBtYXliZUNvbW1hIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfdXAoKTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHJpbmcgbWF5YmVDb21tYSA9IChmX2l0ZXIgIT0gZmllbGRzLmVuZCgpIC0gMSA/ICIsIiA6ICIiKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgbWF5YmVDb21tYSA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisKKyAgaWYgKGdlbl9lczZfKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIpKS50aGVuKHJlc3VsdCA9PiB7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF91cCgpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJyZXN1bHRfb2JqID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKHtzdWNjZXNzOiByZXN1bHR9KTsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3V0cHV0LndyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICA8PCAiXCIsIFRocmlmdC5NZXNzYWdlVHlwZS5SRVBMWSwgc2VxaWQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJyZXN1bHRfb2JqLndyaXRlKG91dHB1dCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvdXRwdXQud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm91dHB1dC5mbHVzaCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0pLmNhdGNoKGVyciA9PiB7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSkuY2F0Y2goZnVuY3Rpb24gKGVycikgeyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8IGpzX2xldF90eXBlXyA8PCAicmVzdWx0OyIgPDwgZW5kbDsKKworICBib29sIGhhc19leGNlcHRpb24gPSBmYWxzZTsKKyAgdF9zdHJ1Y3QqIGV4Y2VwdGlvbnMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgaWYgKGV4Y2VwdGlvbnMpIHsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gZXhjZXB0aW9ucy0+Z2V0X21lbWJlcnMoKTsKKyAgICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbWVtYmVycy5iZWdpbigpOyBpdCAhPSBtZW1iZXJzLmVuZCgpOyArK2l0KSB7CisgICAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqaXQpLT5nZXRfdHlwZSgpKTsKKyAgICAgIGlmICh0LT5pc194Y2VwdGlvbigpKSB7CisgICAgICAgIGlmICghaGFzX2V4Y2VwdGlvbikgeworICAgICAgICAgIGhhc19leGNlcHRpb24gPSB0cnVlOworICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKGVyciBpbnN0YW5jZW9mICIgPDwganNfdHlwZV9uYW1lc3BhY2UodC0+Z2V0X3Byb2dyYW0oKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgdC0+Z2V0X25hbWUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8ICIgfHwgZXJyIGluc3RhbmNlb2YgIiA8PCBqc190eXBlX25hbWVzcGFjZSh0LT5nZXRfcHJvZ3JhbSgpKQorICAgICAgICAgICAgICAgICAgICAgPDwgdC0+Z2V0X25hbWUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChoYXNfZXhjZXB0aW9uKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIihlcnIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIm91dHB1dC53cml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICA8PCAiXCIsIFRocmlmdC5NZXNzYWdlVHlwZS5SRVBMWSwgc2VxaWQpOyIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJlc3VsdCA9IG5ldyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24oVGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUuVU5LTk9XTiwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBlcnIubWVzc2FnZSk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvdXRwdXQud3JpdGVNZXNzYWdlQmVnaW4oXCIiCisgICAgICAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIiwgVGhyaWZ0Lk1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgc2VxaWQpOyIgPDwgZW5kbDsKKworICBpZiAoaGFzX2V4Y2VwdGlvbikgeworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LndyaXRlKG91dHB1dCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIm91dHB1dC53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm91dHB1dC5mbHVzaCgpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9KTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIC8vIEVuZCBwcm9taXNlIHN0eWxlIGludm9jYXRpb24KKworICAvLyBDYWxsYmFjayBzdHlsZSBpbnZvY2F0aW9uCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRoaXMuX2hhbmRsZXIuIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiLCAiOworICB9CisKKyAgaWYgKGdlbl9lczZfKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiKGVyciwgcmVzdWx0KSA9PiB7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfc2VydmljZV8gPDwgImZ1bmN0aW9uIChlcnIsIHJlc3VsdCkgeyIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8IGpzX2xldF90eXBlXyA8PCAicmVzdWx0X29iajsiIDw8IGVuZGw7CisKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJpZiAoKGVyciA9PT0gbnVsbCB8fCB0eXBlb2YgZXJyID09PSAndW5kZWZpbmVkJykiOworICBpZiAoaGFzX2V4Y2VwdGlvbikgeworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSBleGNlcHRpb25zLT5nZXRfbWVtYmVycygpOworICAgIGZvciAodmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtZW1iZXJzLmJlZ2luKCk7IGl0ICE9IG1lbWJlcnMuZW5kKCk7ICsraXQpIHsKKyAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCppdCktPmdldF90eXBlKCkpOworICAgICAgaWYgKHQtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAiIHx8IGVyciBpbnN0YW5jZW9mICIgPDwganNfdHlwZV9uYW1lc3BhY2UodC0+Z2V0X3Byb2dyYW0oKSkgPDwgdC0+Z2V0X25hbWUoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCAiKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0X29iaiA9IG5ldyAiIDw8IHJlc3VsdG5hbWUKKyAgICAgICAgICAgICA8PCAiKChlcnIgIT09IG51bGwgfHwgdHlwZW9mIGVyciA9PT0gJ3VuZGVmaW5lZCcpID8gZXJyIDoge3N1Y2Nlc3M6IHJlc3VsdH0pOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJvdXRwdXQud3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgIDw8ICJcIiwgVGhyaWZ0Lk1lc3NhZ2VUeXBlLlJFUExZLCBzZXFpZCk7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0X29iaiA9IG5ldyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24oVGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUuVU5LTk9XTiwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBlcnIubWVzc2FnZSk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvdXRwdXQud3JpdGVNZXNzYWdlQmVnaW4oXCIiCisgICAgICAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIiwgVGhyaWZ0Lk1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgc2VxaWQpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0X29iai53cml0ZShvdXRwdXQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJvdXRwdXQud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvdXRwdXQuZmx1c2goKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9KTsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKKyAgLy8gRW5kIGNhbGxiYWNrIHN0eWxlIGludm9jYXRpb24KKworICBpbmRlbnRfZG93bigpOworCisgIGlmIChnZW5fZXM2XykgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn07IiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGhlbHBlciBmdW5jdGlvbnMgZm9yIGEgc2VydmljZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgLy8gRG8gbm90IGdlbmVyYXRlIFRTIGRlZmluaXRpb25zIGZvciBoZWxwZXIgZnVuY3Rpb25zCisgIGJvb2wgZ2VuX3RzX3RtcCA9IGdlbl90c187CisgIGdlbl90c18gPSBmYWxzZTsKKworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICBmX3NlcnZpY2VfIDw8ICIvL0hFTFBFUiBGVU5DVElPTlMgQU5EIFNUUlVDVFVSRVMiIDw8IGVuZGwgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBzdHJpbmcgbmFtZSA9IHRzLT5nZXRfbmFtZSgpOworICAgIHRzLT5zZXRfbmFtZShzZXJ2aWNlX25hbWVfICsgIl8iICsgbmFtZSk7CisgICAgZ2VuZXJhdGVfanNfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgdHMsIGZhbHNlLCBmYWxzZSk7CisgICAgZ2VuZXJhdGVfanNfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKKyAgICB0cy0+c2V0X25hbWUobmFtZSk7CisgIH0KKworICBnZW5fdHNfID0gZ2VuX3RzX3RtcDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfanNfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCBzZXJ2aWNlX25hbWVfICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKKyAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOworICB9CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKKyAgfQorCisgIGdlbmVyYXRlX2pzX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sICZyZXN1bHQsIGZhbHNlLCBmYWxzZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICAodm9pZCl0c2VydmljZTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBSRVNUIGludGVyZmFjZQorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3Jlc3QodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICAodm9pZCl0c2VydmljZTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKKworICBib29sIGlzX3N1YmNsYXNzX3NlcnZpY2UgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMOworCisgIGlmIChnZW5fbm9kZV8pIHsKKyAgICBzdHJpbmcgcHJlZml4ID0gaGFzX2pzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPyBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDoganNfY29uc3RfdHlwZV87CisgICAgZl9zZXJ2aWNlXyA8PCBwcmVmaXggPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50ID0gIiA8PCAiZXhwb3J0cy5DbGllbnQiOworICAgIGlmIChnZW5fdHNfKSB7CisgICAgICBmX3NlcnZpY2VfdHNfIDw8IHRzX3ByaW50X2RvYyh0c2VydmljZSkgPDwgdHNfaW5kZW50KCkgPDwgdHNfZGVjbGFyZSgpIDw8ICJjbGFzcyAiCisgICAgICAgICAgICAgICAgICAgIDw8ICJDbGllbnQgIjsKKyAgICAgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgICAgIGZfc2VydmljZV90c18gPDwgImV4dGVuZHMgIiA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSA8PCAiQ2xpZW50ICI7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfdHNfIDw8ICJ7IiA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmX3NlcnZpY2VfIDw8IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc2VydmljZV9uYW1lXworICAgICAgICAgICAgICAgPDwgIkNsaWVudCI7CisgICAgaWYgKGdlbl90c18pIHsKKyAgICAgIGZfc2VydmljZV90c18gPDwgdHNfcHJpbnRfZG9jKHRzZXJ2aWNlKSA8PCB0c19pbmRlbnQoKSA8PCB0c19kZWNsYXJlKCkgPDwgImNsYXNzICIKKyAgICAgICAgICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50ICI7CisgICAgICBpZiAoaXNfc3ViY2xhc3Nfc2VydmljZSkgeworICAgICAgICBmX3NlcnZpY2VfdHNfIDw8ICJleHRlbmRzICIgPDwgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgPDwgIkNsaWVudCAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlX3RzXyA8PCAieyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICAvLyBFUzYgQ29uc3RydWN0b3IKKyAgaWYgKGdlbl9lczZfKSB7CisgICAgaWYgKGlzX3N1YmNsYXNzX3NlcnZpY2UpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgIiA9IGNsYXNzIGV4dGVuZHMgIiA8PCBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9wcm9ncmFtKCkpCisgICAgICAgICAgICAgICAgICAgICAgIDw8IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpIDw8ICJDbGllbnQgeyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiID0gY2xhc3MgeyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X3VwKCk7CisgICAgaWYgKGdlbl9ub2RlXykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJjb25zdHJ1Y3RvcihvdXRwdXQsIHBDbGFzcykgeyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJjb25zdHJ1Y3RvcihpbnB1dCwgb3V0cHV0KSB7IiA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoZ2VuX25vZGVfKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIgPSBmdW5jdGlvbihvdXRwdXQsIHBDbGFzcykgeyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiID0gZnVuY3Rpb24oaW5wdXQsIG91dHB1dCkgeyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpbmRlbnRfdXAoKTsKKworICBpZiAoZ2VuX25vZGVfKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ0aGlzLm91dHB1dCA9IG91dHB1dDsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ0aGlzLnBDbGFzcyA9IHBDbGFzczsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ0aGlzLl9zZXFpZCA9IDA7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidGhpcy5fcmVxcyA9IHt9OyIgPDwgZW5kbDsKKyAgICBpZiAoZ2VuX3RzXykgeworICAgICAgZl9zZXJ2aWNlX3RzXyA8PCB0c19pbmRlbnQoKSA8PCAicHJpdmF0ZSBpbnB1dDogVGhyaWZ0LlRKU09OUHJvdG9jb2w7IiA8PCBlbmRsIDw8IHRzX2luZGVudCgpCisgICAgICAgICAgICAgICAgICAgIDw8ICJwcml2YXRlIG91dHB1dDogVGhyaWZ0LlRKU09OUHJvdG9jb2w7IiA8PCBlbmRsIDw8IHRzX2luZGVudCgpIDw8ICJwcml2YXRlIHNlcWlkOiBudW1iZXI7IgorICAgICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGwgPDwgdHNfaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICAgPDwgImNvbnN0cnVjdG9yKGlucHV0OiBUaHJpZnQuVEpTT05Qcm90b2NvbCwgb3V0cHV0PzogVGhyaWZ0LlRKU09OUHJvdG9jb2wpOyIKKyAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ0aGlzLmlucHV0ID0gaW5wdXQ7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidGhpcy5vdXRwdXQgPSAoIW91dHB1dCkgPyBpbnB1dCA6IG91dHB1dDsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ0aGlzLnNlcWlkID0gMDsiIDw8IGVuZGw7CisgICAgaWYgKGdlbl90c18pIHsKKyAgICAgIGZfc2VydmljZV90c18gPDwgdHNfaW5kZW50KCkgPDwgImlucHV0OiBUaHJpZnQuVEpTT05Qcm90b2NvbDsiIDw8IGVuZGwgPDwgdHNfaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICAgPDwgIm91dHB1dDogVGhyaWZ0LlRKU09OUHJvdG9jb2w7IiA8PCBlbmRsIDw8IHRzX2luZGVudCgpIDw8ICJzZXFpZDogbnVtYmVyOyIKKyAgICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsIDw8IHRzX2luZGVudCgpCisgICAgICAgICAgICAgICAgICAgIDw8ICJjb25zdHJ1Y3RvcihpbnB1dDogVGhyaWZ0LlRKU09OUHJvdG9jb2wsIG91dHB1dD86IFRocmlmdC5USlNPTlByb3RvY29sKTsiCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9OyIgPDwgZW5kbDsKKyAgICBpZiAoaXNfc3ViY2xhc3Nfc2VydmljZSkgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJUaHJpZnQuaW5oZXJpdHMoIiA8PCBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnQsICIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X3Byb2dyYW0oKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpIDw8ICJDbGllbnQpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgLy8gaW5pdCBwcm90b3R5cGUKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8IHNlcnZpY2VfbmFtZV8KKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJDbGllbnQucHJvdG90eXBlID0ge307IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIC8vIHV0aWxzIGZvciBtdWx0aXBsZXhlZCBzZXJ2aWNlcworICBpZiAoZ2VuX25vZGVfKSB7CisgICAgaWYgKGdlbl9lczZfKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInNlcWlkICgpIHsgcmV0dXJuIHRoaXMuX3NlcWlkOyB9IiA8PCBlbmRsOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJuZXdfc2VxaWQgKCkgeyByZXR1cm4gdGhpcy5fc2VxaWQgKz0gMTsgfSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc2VydmljZV9uYW1lXworICAgICAgICAgICAgICAgICAgICAgICAgPDwgIkNsaWVudC5wcm90b3R5cGUuc2VxaWQgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuX3NlcWlkOyB9OyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICAgPDwganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCBzZXJ2aWNlX25hbWVfCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiQ2xpZW50LnByb3RvdHlwZS5uZXdfc2VxaWQgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuX3NlcWlkICs9IDE7IH07IgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIHN0cmluZyBhcmdsaXN0ID0gYXJndW1lbnRfbGlzdChhcmdfc3RydWN0KTsKKworICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgICAgaWYgKGdlbl9lczZfKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZnVubmFtZSA8PCAiICgiIDw8IGFyZ2xpc3QgPDwgIikgeyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50LnByb3RvdHlwZS4iCisgICAgICAgICAgICAgICAgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsICIiLCAhZ2VuX2VzNl8pIDw8ICIgeyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGlmIChnZW5fdHNfKSB7CisgICAgICAvLyBmdW5jdGlvbiBkZWZpbml0aW9uIHdpdGhvdXQgY2FsbGJhY2sKKyAgICAgIGZfc2VydmljZV90c18gPDwgdHNfcHJpbnRfZG9jKCpmX2l0ZXIpIDw8IHRzX2luZGVudCgpIDw8IHRzX2Z1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCBmYWxzZSwgZmFsc2UpIDw8IGVuZGw7CisgICAgICBpZiAoIWdlbl9lczZfKSB7CisgICAgICAgIC8vIG92ZXJsb2FkIHdpdGggY2FsbGJhY2sKKyAgICAgICAgZl9zZXJ2aWNlX3RzXyA8PCB0c19wcmludF9kb2MoKmZfaXRlcikgPDwgdHNfaW5kZW50KCkgPDwgdHNfZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsIHRydWUsIGZhbHNlKSA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gb3ZlcmxvYWQgd2l0aCBjYWxsYmFjaworICAgICAgICBmX3NlcnZpY2VfdHNfIDw8IHRzX3ByaW50X2RvYygqZl9pdGVyKSA8PCB0c19pbmRlbnQoKSA8PCB0c19mdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgdHJ1ZSwgdHJ1ZSkgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZ2VuX2VzNl8gJiYgZ2VuX25vZGVfKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRoaXMuX3NlcWlkID0gdGhpcy5uZXdfc2VxaWQoKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwganNfY29uc3RfdHlwZV8gPDwgInNlbGYgPSB0aGlzOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAicmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAic2VsZi5fcmVxc1tzZWxmLnNlcWlkKCldID0gKGVycm9yLCByZXN1bHQpID0+IHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIGVycm9yID8gcmVqZWN0KGVycm9yKSA6IHJlc29sdmUocmVzdWx0KTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9OyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAic2VsZi5zZW5kXyIgPDwgZnVubmFtZSA8PCAiKCIgPDwgYXJnbGlzdCA8PCAiKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9KTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmIChnZW5fbm9kZV8pIHsgLy8gTm9kZS5qcyBvdXRwdXQgICAgICAuL2dlbi1ub2RlanMKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRoaXMuX3NlcWlkID0gdGhpcy5uZXdfc2VxaWQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgImlmIChjYWxsYmFjayA9PT0gdW5kZWZpbmVkKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJfZGVmZXIgPSBRLmRlZmVyKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICJ0aGlzLl9yZXFzW3RoaXMuc2VxaWQoKV0gPSBmdW5jdGlvbihlcnJvciwgcmVzdWx0KSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImlmIChlcnJvcikgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJfZGVmZXIucmVqZWN0KGVycm9yKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJfZGVmZXIucmVzb2x2ZShyZXN1bHQpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9OyIgPDwgZW5kbDsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRoaXMuc2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiIDw8IGFyZ2xpc3QgPDwgIik7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gX2RlZmVyLnByb21pc2U7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRoaXMuX3JlcXNbdGhpcy5zZXFpZCgpXSA9IGNhbGxiYWNrOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAidGhpcy5zZW5kXyIgPDwgZnVubmFtZSA8PCAiKCIgPDwgYXJnbGlzdCA8PCAiKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAoZ2VuX2VzNl8pIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwganNfY29uc3RfdHlwZV8gPDwgInNlbGYgPSB0aGlzOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAicmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInNlbGYuc2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiIDw8IGFyZ2xpc3QKKyAgICAgICAgICAgICAgICAgPDwgKGFyZ2xpc3QuZW1wdHkoKSA/ICIiIDogIiwgIikgPDwgIihlcnJvciwgcmVzdWx0KSA9PiB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiBlcnJvciA/IHJlamVjdChlcnJvcikgOiByZXNvbHZlKHJlc3VsdCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0pOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9KTsiIDw8IGVuZGw7CisKKyAgICB9IGVsc2UgaWYgKGdlbl9qcXVlcnlfKSB7IC8vIGpRdWVyeSBvdXRwdXQgICAgICAgLi9nZW4tanMKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChjYWxsYmFjayA9PT0gdW5kZWZpbmVkKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0aGlzLnNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIiA8PCBhcmdsaXN0IDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCAicmV0dXJuICI7CisgICAgICAgIH0KKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAidGhpcy5yZWN2XyIgPDwgZnVubmFtZSA8PCAiKCk7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJwb3N0RGF0YSA9IHRoaXMuc2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiIDw8IGFyZ2xpc3QKKyAgICAgICAgICAgICAgICAgPDwgKGFyZ2xpc3QuZW1wdHkoKSA/ICIiIDogIiwgIikgPDwgInRydWUpOyIgPDwgZW5kbDsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiB0aGlzLm91dHB1dC5nZXRUcmFuc3BvcnQoKSIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiLmpxUmVxdWVzdCh0aGlzLCBwb3N0RGF0YSwgYXJndW1lbnRzLCB0aGlzLnJlY3ZfIiA8PCBmdW5uYW1lCisgICAgICAgICAgICAgICAgIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeyAvLyBTdGFuZGFyZCBKYXZhU2NyaXB0IC4vZ2VuLWpzCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0aGlzLnNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIiA8PCBhcmdsaXN0CisgICAgICAgICAgICAgICAgIDw8IChhcmdsaXN0LmVtcHR5KCkgPyAiIiA6ICIsICIpIDw8ICJjYWxsYmFjayk7ICIgPDwgZW5kbDsKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAoIWNhbGxiYWNrKSB7IiA8PCBlbmRsOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCAiICByZXR1cm4gIjsKKyAgICAgICAgfQorICAgICAgICBmX3NlcnZpY2VfIDw8ICJ0aGlzLnJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIGlmIChnZW5fZXM2XykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifTsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBTZW5kIGZ1bmN0aW9uCisgICAgaWYgKGdlbl9lczZfKSB7CisgICAgICBpZiAoZ2VuX25vZGVfKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAic2VuZF8iIDw8IGZ1bm5hbWUgPDwgIiAoIiA8PCBhcmdsaXN0IDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBFUzYganMgc3RpbGwgdXNlcyBjYWxsYmFja3MgaGVyZS4gU2hvdWxkIHJlZmFjdG9yIHRoaXMgdG8gcHJvbWlzZSBzdHlsZSBsYXRlci4uCisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAic2VuZF8iIDw8IGZ1bm5hbWUgPDwgIiAoIiA8PCBhcmd1bWVudF9saXN0KGFyZ19zdHJ1Y3QsIHRydWUpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudC5wcm90b3R5cGUuc2VuZF8iCisgICAgICAgICAgICAgICAgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsICIiLCAhZ2VuX25vZGVfKSA8PCAiIHsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X3VwKCk7CisKKyAgICBzdGQ6OnN0cmluZyBvdXRwdXRWYXI7CisgICAgaWYgKGdlbl9ub2RlXykgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBqc19jb25zdF90eXBlXyA8PCAib3V0cHV0ID0gbmV3IHRoaXMucENsYXNzKHRoaXMub3V0cHV0KTsiIDw8IGVuZGw7CisgICAgICBvdXRwdXRWYXIgPSAib3V0cHV0IjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0cHV0VmFyID0gInRoaXMub3V0cHV0IjsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBhcmdzbmFtZSA9IGpzX25hbWVzcGFjZShwcm9ncmFtXykgKyBzZXJ2aWNlX25hbWVfICsgIl8iICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICArICJfYXJncyI7CisKKyAgICBzdGQ6OnN0cmluZyBtZXNzYWdlVHlwZSA9ICgqZl9pdGVyKS0+aXNfb25ld2F5KCkgPyAiVGhyaWZ0Lk1lc3NhZ2VUeXBlLk9ORVdBWSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiVGhyaWZ0Lk1lc3NhZ2VUeXBlLkNBTEwiOworICAgIC8vIEJ1aWxkIGFyZ3MKKyAgICBpZiAoZmllbGRzLnNpemUoKSA+IDApeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBqc19jb25zdF90eXBlXyA8PCAicGFyYW1zID0geyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6ICIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCk7CisgICAgICAgIGlmIChmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCktMSkgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgIiwiIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9OyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBqc19jb25zdF90eXBlXyA8PCAiYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIocGFyYW1zKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBqc19jb25zdF90eXBlXyA8PCAiYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgfQorCisKKyAgICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QgaGVhZGVyIHdpdGhpbiB0cnkvY2F0Y2gKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRyeSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgaWYgKGdlbl9ub2RlXykgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBvdXRwdXRWYXIgPDwgIi53cml0ZU1lc3NhZ2VCZWdpbignIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgPDwgIicsICIgPDwgbWVzc2FnZVR5cGUgPDwgIiwgdGhpcy5zZXFpZCgpKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgb3V0cHV0VmFyIDw8ICIud3JpdGVNZXNzYWdlQmVnaW4oJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgIDw8ICInLCAiIDw8IG1lc3NhZ2VUeXBlIDw8ICIsIHRoaXMuc2VxaWQpOyIgPDwgZW5kbDsKKyAgICB9CisKKworICAgIC8vIFdyaXRlIHRvIHRoZSBzdHJlYW0KKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzLndyaXRlKCIgPDwgb3V0cHV0VmFyIDw8ICIpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBvdXRwdXRWYXIKKyAgICAgICAgICAgICAgIDw8ICIud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOworCisgICAgaWYgKGdlbl9ub2RlXykgeworICAgICAgaWYoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0aGlzLm91dHB1dC5mbHVzaCgpOyIgPDwgZW5kbDsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBqc19jb25zdF90eXBlXyA8PCAiY2FsbGJhY2sgPSB0aGlzLl9yZXFzW3RoaXMuc2VxaWQoKV0gfHwgZnVuY3Rpb24oKSB7fTsiIDw8IGVuZGw7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImRlbGV0ZSB0aGlzLl9yZXFzW3RoaXMuc2VxaWQoKV07IiA8PCBlbmRsOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJjYWxsYmFjayhudWxsKTsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdGhpcy5vdXRwdXQuZmx1c2goKTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChnZW5fanF1ZXJ5XykgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdGhpcy5vdXRwdXQuZ2V0VHJhbnNwb3J0KCkuZmx1c2goY2FsbGJhY2spOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSBpZiAoZ2VuX2VzNl8pIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBqc19jb25zdF90eXBlXyA8PCAic2VsZiA9IHRoaXM7IiA8PCBlbmRsOworICAgICAgICBpZigoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidGhpcy5vdXRwdXQuZ2V0VHJhbnNwb3J0KCkuZmx1c2godHJ1ZSwgbnVsbCk7IiA8PCBlbmRsOworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImNhbGxiYWNrKCk7IiA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRoaXMub3V0cHV0LmdldFRyYW5zcG9ydCgpLmZsdXNoKHRydWUsICgpID0+IHsiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBqc19sZXRfdHlwZV8gPDwgImVycm9yID0gbnVsbCwgcmVzdWx0ID0gbnVsbDsiIDw8IGVuZGw7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJ5IHsiIDw8IGVuZGw7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICByZXN1bHQgPSBzZWxmLnJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSBjYXRjaCAoZSkgeyIgPDwgZW5kbDsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIGVycm9yID0gZTsiIDw8IGVuZGw7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJjYWxsYmFjayhlcnJvciwgcmVzdWx0KTsiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9KTsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChjYWxsYmFjaykgeyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGlmKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0aGlzLm91dHB1dC5nZXRUcmFuc3BvcnQoKS5mbHVzaCh0cnVlLCBudWxsKTsiIDw8IGVuZGw7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiY2FsbGJhY2soKTsiIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBqc19jb25zdF90eXBlXyA8PCAic2VsZiA9IHRoaXM7IiA8PCBlbmRsOworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRoaXMub3V0cHV0LmdldFRyYW5zcG9ydCgpLmZsdXNoKHRydWUsIGZ1bmN0aW9uKCkgeyIgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGpzX2xldF90eXBlXyA8PCAicmVzdWx0ID0gbnVsbDsiIDw8IGVuZGw7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJ5IHsiIDw8IGVuZGw7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICByZXN1bHQgPSBzZWxmLnJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSBjYXRjaCAoZSkgeyIgPDwgZW5kbDsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIHJlc3VsdCA9IGU7IiA8PCBlbmRsOworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiY2FsbGJhY2socmVzdWx0KTsiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9KTsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRoaXMub3V0cHV0LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7IiA8PCBlbmRsOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAgIC8vIFJlc2V0IHRoZSB0cmFuc3BvcnQgYW5kIGRlbGV0ZSByZWdpc3RlcmVkIGNhbGxiYWNrIGlmIHRoZXJlIHdhcyBhIHNlcmlhbGl6YXRpb24gZXJyb3IKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJjYXRjaCAoZSkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpZiAoZ2VuX25vZGVfKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkZWxldGUgdGhpcy5fcmVxc1t0aGlzLnNlcWlkKCldOyIgPDwgZW5kbDsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmICh0eXBlb2YgIiA8PCBvdXRwdXRWYXIgPDwgIi5yZXNldCA9PT0gJ2Z1bmN0aW9uJykgeyIgPDwgZW5kbDsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgIiA8PCBvdXRwdXRWYXIgPDwgIi5yZXNldCgpOyIgPDwgZW5kbDsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmICh0eXBlb2YgIiA8PCBvdXRwdXRWYXIgPDwgIi5nZXRUcmFuc3BvcnQoKS5yZXNldCA9PT0gJ2Z1bmN0aW9uJykgeyIgPDwgZW5kbDsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgIiA8PCBvdXRwdXRWYXIgPDwgIi5nZXRUcmFuc3BvcnQoKS5yZXNldCgpOyIgPDwgZW5kbDsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRocm93IGU7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisKKyAgICAvLyBDbG9zZSBzZW5kIGZ1bmN0aW9uCisgICAgaWYgKGdlbl9lczZfKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gUmVjZWl2ZSBmdW5jdGlvbgorICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0bmFtZSA9IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgKyBzZXJ2aWNlX25hbWVfICsgIl8iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7CisKKyAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgICAgIC8vIE9wZW4gcmVjZWl2ZSBmdW5jdGlvbgorICAgICAgaWYgKGdlbl9ub2RlXykgeworICAgICAgICBpZiAoZ2VuX2VzNl8pIHsKKyAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJlY3ZfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiAoaW5wdXQsIG10eXBlLCByc2VxaWQpIHsiIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc2VydmljZV9uYW1lXworICAgICAgICAgICAgICAgICAgICAgIDw8ICJDbGllbnQucHJvdG90eXBlLnJlY3ZfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiID0gZnVuY3Rpb24oaW5wdXQsbXR5cGUscnNlcWlkKSB7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoZ2VuX2VzNl8pIHsKKyAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJlY3ZfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiAoKSB7IiA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7CisKKyAgICAgICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9hcmdzKTsKKyAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCBzZXJ2aWNlX25hbWVfCisgICAgICAgICAgICAgICAgICAgIDw8ICJDbGllbnQucHJvdG90eXBlLiIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uKSA8PCAiIHsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgIHN0ZDo6c3RyaW5nIGlucHV0VmFyOworICAgICAgaWYgKGdlbl9ub2RlXykgeworICAgICAgICBpbnB1dFZhciA9ICJpbnB1dCI7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbnB1dFZhciA9ICJ0aGlzLmlucHV0IjsKKyAgICAgIH0KKworICAgICAgaWYgKGdlbl9ub2RlXykgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJjYWxsYmFjayA9IHRoaXMuX3JlcXNbcnNlcWlkXSB8fCBmdW5jdGlvbigpIHt9OyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJkZWxldGUgdGhpcy5fcmVxc1tyc2VxaWRdOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwganNfY29uc3RfdHlwZV8gPDwgInJldCA9IHRoaXMuaW5wdXQucmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJtdHlwZSA9IHJldC5tdHlwZTsiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChtdHlwZSA9PSBUaHJpZnQuTWVzc2FnZVR5cGUuRVhDRVBUSU9OKSB7IiA8PCBlbmRsOworCisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwganNfY29uc3RfdHlwZV8gPDwgInggPSBuZXcgVGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbigpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieC5yZWFkKCIgPDwgaW5wdXRWYXIgPDwgIik7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGlucHV0VmFyIDw8ICIucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgcmVuZGVyX3JlY3ZfdGhyb3coIngiKSA8PCBlbmRsOworICAgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBqc19jb25zdF90eXBlXyA8PCAicmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICJyZXN1bHQucmVhZCgiIDw8IGlucHV0VmFyIDw8ICIpOyIgPDwgZW5kbDsKKworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBpbnB1dFZhciA8PCAiLnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChudWxsICE9PSByZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgICIgPDwgcmVuZGVyX3JlY3ZfdGhyb3coInJlc3VsdC4iICsgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIHJlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChudWxsICE9PSByZXN1bHQuc3VjY2VzcykgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICAiCisgICAgICAgICAgICAgICAgICAgPDwgcmVuZGVyX3JlY3ZfcmV0dXJuKCJyZXN1bHQuc3VjY2VzcyIpIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICA8PCByZW5kZXJfcmVjdl90aHJvdygiJyIgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiIGZhaWxlZDogdW5rbm93biByZXN1bHQnIikKKyAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGdlbl9ub2RlXykgeworICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiY2FsbGJhY2sobnVsbCk7IiA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBDbG9zZSByZWNlaXZlIGZ1bmN0aW9uCisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaWYgKGdlbl9lczZfKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gRmluaXNoIGNsYXNzIGRlZmluaXRpb25zCisgIGlmIChnZW5fdHNfKSB7CisgICAgZl9zZXJ2aWNlX3RzXyA8PCB0c19pbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfQorICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8gPDwgIn07IiA8PCBlbmRsOworICB9Cit9CisKK3N0ZDo6c3RyaW5nIHRfanNfZ2VuZXJhdG9yOjpyZW5kZXJfcmVjdl90aHJvdyhzdGQ6OnN0cmluZyB2YXIpIHsKKyAgaWYgKGdlbl9ub2RlXykgeworICAgIHJldHVybiAicmV0dXJuIGNhbGxiYWNrKCIgKyB2YXIgKyAiKTsiOworICB9IGVsc2UgeworICAgIHJldHVybiAidGhyb3cgIiArIHZhciArICI7IjsKKyAgfQorfQorCitzdGQ6OnN0cmluZyB0X2pzX2dlbmVyYXRvcjo6cmVuZGVyX3JlY3ZfcmV0dXJuKHN0ZDo6c3RyaW5nIHZhcikgeworICBpZiAoZ2VuX25vZGVfKSB7CisgICAgcmV0dXJuICJyZXR1cm4gY2FsbGJhY2sobnVsbCwgIiArIHZhciArICIpOyI7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuICJyZXR1cm4gIiArIHZhciArICI7IjsKKyAgfQorfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsYXNzKSB7CisgICh2b2lkKWluY2xhc3M7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIgPSBpbnB1dC4iOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgb3V0IDw8ICh0eXBlLT5pc19iaW5hcnkoKSA/ICJyZWFkQmluYXJ5KCkiIDogInJlYWRTdHJpbmcoKSIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgb3V0IDw8ICJyZWFkQm9vbCgpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgInJlYWRCeXRlKCkiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgInJlYWRJMTYoKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIG91dCA8PCAicmVhZEkzMigpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJyZWFkSTY0KCkiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgInJlYWREb3VibGUoKSI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBKUyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIG91dCA8PCAicmVhZEkzMigpIjsKKyAgICB9CisKKyAgICBpZiAoIWdlbl9ub2RlXykgeworICAgICAgb3V0IDw8ICIudmFsdWUiOworICAgIH0KKworICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgIHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHZhcmlhYmxlLiBUaGlzIG1ha2VzIHR3byBrZXkgYXNzdW1wdGlvbnMsCisgKiBmaXJzdCB0aGF0IHRoZXJlIGlzIGEgY29uc3QgY2hhciogdmFyaWFibGUgbmFtZWQgZGF0YSB0aGF0IHBvaW50cyB0byB0aGUKKyAqIGJ1ZmZlciBmb3IgZGVzZXJpYWxpemF0aW9uLCBhbmQgdGhhdCB0aGVyZSBpcyBhIHZhcmlhYmxlIHByb3RvY29sIHdoaWNoCisgKiBpcyBhIHJlZmVyZW5jZSB0byBhIFRQcm90b2NvbCBzZXJpYWxpemF0aW9uIG9iamVjdC4KKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKKyAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwganNfdHlwZV9uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkKKyAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIi5yZWFkKGlucHV0KTsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIHNpemUgPSB0bXAoIl9zaXplIik7CisgIHN0cmluZyBydG1wMyA9IHRtcCgiX3J0bXAzIik7CisKKyAgdF9maWVsZCBmc2l6ZShnX3R5cGVfaTMyLCBzaXplKTsKKworICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IHt9OyIgPDwgZW5kbDsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBqc19jb25zdF90eXBlXyA8PCBydG1wMyA8PCAiID0gaW5wdXQucmVhZE1hcEJlZ2luKCk7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBqc19jb25zdF90eXBlXyA8PCBzaXplIDw8ICIgPSAiIDw8IHJ0bXAzIDw8ICIuc2l6ZSB8fCAwOyIgPDwgZW5kbDsKKworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworCisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gW107IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8IGpzX2NvbnN0X3R5cGVfIDw8IHJ0bXAzIDw8ICIgPSBpbnB1dC5yZWFkU2V0QmVnaW4oKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwganNfY29uc3RfdHlwZV8gPDwgc2l6ZSA8PCAiID0gIiA8PCBydG1wMyA8PCAiLnNpemUgfHwgMDsiIDw8IGVuZGw7CisKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBbXTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwganNfY29uc3RfdHlwZV8gPDwgcnRtcDMgPDwgIiA9IGlucHV0LnJlYWRMaXN0QmVnaW4oKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwganNfY29uc3RfdHlwZV8gPDwgc2l6ZSA8PCAiID0gIiA8PCBydG1wMyA8PCAiLnNpemUgfHwgMDsiIDw8IGVuZGw7CisgIH0KKworICAvLyBGb3IgbG9vcCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCisgIHN0cmluZyBpID0gdG1wKCJfaSIpOworICBpbmRlbnQob3V0KSA8PCAiZm9yICgiIDw8IGpzX2xldF90eXBlXyA8PCBpIDw8ICIgPSAwOyAiIDw8IGkgPDwgIiA8ICIgPDwgc2l6ZSA8PCAiOyArKyIgPDwgaSA8PCAiKSB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpZiAoIWdlbl9ub2RlXykgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIiA8PCBpIDw8ICIgPiAwICkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICIgIGlmIChpbnB1dC5yc3RhY2subGVuZ3RoID4gaW5wdXQucnBvc1tpbnB1dC5ycG9zLmxlbmd0aCAtMV0gKyAxKSB7IiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgICBpbnB1dC5yc3RhY2sucG9wKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBwcmVmaXgpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4KTsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICAvLyBSZWFkIGNvbnRhaW5lciBlbmQKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpbnB1dC5yZWFkTWFwRW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpbnB1dC5yZWFkU2V0RW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaW5wdXQucmVhZExpc3RFbmQoKTsiIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgY29kZSB0byBkZXNlcmlhbGl6ZSBhIG1hcAorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBrZXkgPSB0bXAoImtleSIpOworICBzdHJpbmcgdmFsID0gdG1wKCJ2YWwiKTsKKyAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOworICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7CisKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmtleSwgZmFsc2UsIGZhbHNlKSA8PCAiOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZnZhbCwgZmFsc2UsIGZhbHNlKSA8PCAiOyIgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5KTsKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICJbIiA8PCBrZXkgPDwgIl0gPSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgZWxlbSA9IHRtcCgiZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwganNfbGV0X3R5cGVfIDw8IGVsZW0gPDwgIiA9IG51bGw7IiA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5wdXNoKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CisgIHN0cmluZyBlbGVtID0gdG1wKCJlbGVtIik7CisgIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwganNfbGV0X3R5cGVfIDw8IGVsZW0gPDwgIiA9IG51bGw7IiA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5wdXNoKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQorICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworCisgIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworCisgICAgc3RyaW5nIG5hbWUgPSB0ZmllbGQtPmdldF9uYW1lKCk7CisKKyAgICAvLyBIYWNrIGZvciB3aGVuIHByZWZpeCBpcyBkZWZpbmVkIChhbHdheXMgYSBoYXNoIHJlZikKKyAgICBpZiAoIXByZWZpeC5lbXB0eSgpKQorICAgICAgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKworICAgIGluZGVudChvdXQpIDw8ICJvdXRwdXQuIjsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIG91dCA8PCAodHlwZS0+aXNfYmluYXJ5KCkgPyAid3JpdGVCaW5hcnkoIiA6ICJ3cml0ZVN0cmluZygiKSA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAid3JpdGVCb29sKCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUJ5dGUoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNigiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAid3JpdGVJNjQoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSgiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gSlMgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKSI7CisgICAgfQorICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKKworICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSBGSUVMRCAnJXMlcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICBwcmVmaXguY19zdHIoKSwKKyAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgIHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7CisgIH0KK30KKworLyoqCisgKiBTZXJpYWxpemVzIGFsbCB0aGUgbWVtYmVycyBvZiBhIHN0cnVjdC4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IHRvIHNlcmlhbGl6ZQorICogQHBhcmFtIHByZWZpeCAgU3RyaW5nIHByZWZpeCB0byBhdHRhY2ggdG8gYWxsIGZpZWxkcworICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKKyAgKHZvaWQpdHN0cnVjdDsKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIud3JpdGUob3V0cHV0KTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogV3JpdGVzIG91dCBhIGNvbnRhaW5lcgorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgeworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm91dHB1dC53cml0ZU1hcEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8ICJUaHJpZnQub2JqZWN0TGVuZ3RoKCIgPDwgcHJlZml4IDw8ICIpKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm91dHB1dC53cml0ZVNldEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgcHJlZml4IDw8ICIubGVuZ3RoKTsiIDw8IGVuZGw7CisKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisKKyAgICBpbmRlbnQob3V0KSA8PCAib3V0cHV0LndyaXRlTGlzdEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkKKyAgICAgICAgICAgICAgICA8PCAiLCAiIDw8IHByZWZpeCA8PCAiLmxlbmd0aCk7IiA8PCBlbmRsOworICB9CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHN0cmluZyBraXRlciA9IHRtcCgia2l0ZXIiKTsKKyAgICBzdHJpbmcgdml0ZXIgPSB0bXAoInZpdGVyIik7CisgICAgaW5kZW50KG91dCkgPDwgImZvciAoIiA8PCBqc19sZXRfdHlwZV8gPDwga2l0ZXIgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBwcmVmaXggPDwgIi5oYXNPd25Qcm9wZXJ0eSgiIDw8IGtpdGVyIDw8ICIpKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8IGpzX2xldF90eXBlXyA8PCB2aXRlciA8PCAiID0gIiA8PCBwcmVmaXggPDwgIlsiIDw8IGtpdGVyIDw8ICJdOyIgPDwgZW5kbDsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBraXRlciwgdml0ZXIpOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBzY29wZV9kb3duKG91dCk7CisKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBzdHJpbmcgaXRlciA9IHRtcCgiaXRlciIpOworICAgIGluZGVudChvdXQpIDw8ICJmb3IgKCIgPDwganNfbGV0X3R5cGVfIDw8IGl0ZXIgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBwcmVmaXggPDwgIi5oYXNPd25Qcm9wZXJ0eSgiIDw8IGl0ZXIgPDwgIikpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgaXRlciA8PCAiID0gIiA8PCBwcmVmaXggPDwgIlsiIDw8IGl0ZXIgPDwgIl07IiA8PCBlbmRsOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIpOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBzY29wZV9kb3duKG91dCk7CisKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgc3RyaW5nIGl0ZXIgPSB0bXAoIml0ZXIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yICgiIDw8IGpzX2xldF90eXBlXyA8PCBpdGVyIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIikgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgcHJlZml4IDw8ICIuaGFzT3duUHJvcGVydHkoIiA8PCBpdGVyIDw8ICIpKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8IGl0ZXIgPDwgIiA9ICIgPDwgcHJlZml4IDw8ICJbIiA8PCBpdGVyIDw8ICJdOyIgPDwgZW5kbDsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBzY29wZV9kb3duKG91dCk7CisgIH0KKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm91dHB1dC53cml0ZU1hcEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3V0cHV0LndyaXRlU2V0RW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3V0cHV0LndyaXRlTGlzdEVuZCgpOyIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBtYXAuCisgKgorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBraXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdml0ZXIpIHsKKyAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGtpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCk7CisKKyAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCk7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KKyAqLwordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBpdGVyKSB7CisgIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgorICovCit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQpOworfQorCisvKioKKyAqIERlY2xhcmVzIGEgZmllbGQsIHdoaWNoIG1heSBpbmNsdWRlIGluaXRpYWxpemF0aW9uIGFzIG5lY2Vzc2FyeS4KKyAqCisgKiBAcGFyYW0gdHR5cGUgVGhlIHR5cGUKKyAqLworc3RyaW5nIHRfanNfZ2VuZXJhdG9yOjpkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0LCBib29sIG9iaikgeworICBzdHJpbmcgcmVzdWx0ID0gInRoaXMuIiArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKworICBpZiAoIW9iaikgeworICAgIHJlc3VsdCA9IGpzX2xldF90eXBlXyArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgfQorCisgIGlmIChpbml0KSB7CisgICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICByZXN1bHQgKz0gIiA9IG51bGwiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gSlMgaW5pdGlhbGl6ZXIgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgICByZXN1bHQgKz0gIiA9IG51bGwiOworICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIHJlc3VsdCArPSAiID0gbnVsbCI7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgICBpZiAob2JqKSB7CisgICAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyBqc190eXBlX25hbWVzcGFjZSh0eXBlLT5nZXRfcHJvZ3JhbSgpKSArIHR5cGUtPmdldF9uYW1lKCkgKyAiKCkiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RyaW5nIHRfanNfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbHVkZV9jYWxsYmFjaykgeworCisgIHN0cmluZyBzdHI7CisKKyAgc3RyID0gcHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIiA9IGZ1bmN0aW9uKCI7CisKKyAgc3RyICs9IGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLCBpbmNsdWRlX2NhbGxiYWNrKTsKKworICBzdHIgKz0gIikiOworICByZXR1cm4gc3RyOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmaWVsZCBsaXN0CisgKi8KK3N0cmluZyB0X2pzX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpbmNsdWRlX2NhbGxiYWNrKSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICIsICI7CisgICAgfQorICAgIHJlc3VsdCArPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgIH0KKworICBpZiAoaW5jbHVkZV9jYWxsYmFjaykgeworICAgIGlmICghZmllbGRzLmVtcHR5KCkpIHsKKyAgICAgIHJlc3VsdCArPSAiLCAiOworICAgIH0KKyAgICByZXN1bHQgKz0gImNhbGxiYWNrIjsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBDKysgZW51bSBzdHJpbmcgZm9yIHRoZSBnaXZlbiB0eXBlLgorICovCitzdHJpbmcgdF9qc19nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIlRocmlmdC5UeXBlLlNUUklORyI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJUaHJpZnQuVHlwZS5CT09MIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJUaHJpZnQuVHlwZS5CWVRFIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuSTE2IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuSTMyIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuSTY0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuRE9VQkxFIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJUaHJpZnQuVHlwZS5JMzIiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIlRocmlmdC5UeXBlLlNUUlVDVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIlRocmlmdC5UeXBlLk1BUCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIlRocmlmdC5UeXBlLlNFVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJUaHJpZnQuVHlwZS5MSVNUIjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworLyoqCisgKiBDb252ZXJ0cyBhIHRfdHlwZSB0byBhIFR5cGVTY3JpcHQgdHlwZSAoc3RyaW5nKS4KKyAqIEBwYXJhbSB0X3R5cGUgVHlwZSB0byBjb252ZXJ0IHRvIFR5cGVTY3JpcHQKKyAqIEByZXR1cm4gU3RyaW5nIFR5cGVTY3JpcHQgdHlwZQorICovCitzdHJpbmcgdF9qc19nZW5lcmF0b3I6OnRzX2dldF90eXBlKHRfdHlwZSogdHlwZSkgeworICBzdGQ6OnN0cmluZyB0c190eXBlOworCisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICB0c190eXBlID0gInN0cmluZyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICB0c190eXBlID0gImJvb2xlYW4iOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHRzX3R5cGUgPSAiYW55IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgdHNfdHlwZSA9ICJudW1iZXIiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdHNfdHlwZSA9ICJ2b2lkIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpIHx8IHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBzdGQ6OnN0cmluZyB0eXBlX25hbWU7CisgICAgaWYgKHR5cGUtPmdldF9wcm9ncmFtKCkpIHsKKyAgICAgIHR5cGVfbmFtZSA9IGpzX25hbWVzcGFjZSh0eXBlLT5nZXRfcHJvZ3JhbSgpKTsKKyAgICB9CisgICAgdHlwZV9uYW1lLmFwcGVuZCh0eXBlLT5nZXRfbmFtZSgpKTsKKyAgICB0c190eXBlID0gdHlwZV9uYW1lOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogZXR5cGU7CisKKyAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0gZWxzZSB7CisgICAgICBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfQorCisgICAgdHNfdHlwZSA9IHRzX2dldF90eXBlKGV0eXBlKSArICJbXSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICBzdHJpbmcga3R5cGUgPSB0c19nZXRfdHlwZSgoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCkpOworICAgIHN0cmluZyB2dHlwZSA9IHRzX2dldF90eXBlKCgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKSk7CisKKworICAgIGlmIChrdHlwZSA9PSAibnVtYmVyIiB8fCBrdHlwZSA9PSAic3RyaW5nIiApIHsKKyAgICAgIHRzX3R5cGUgPSAieyBbazogIiArIGt0eXBlICsgIl06ICIgKyB2dHlwZSArICI7IH0iOworICAgIH0gZWxzZSBpZiAoKCgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKSktPmlzX2VudW0oKSkgeworICAgICAgLy8gTm90IHlldCBzdXBwb3J0ZWQgKGVudW0gbWFwKTogaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9UeXBlU2NyaXB0L3B1bGwvMjY1MgorICAgICAgLy90c190eXBlID0gInsgW2s6ICIgKyBrdHlwZSArICJdOiAiICsgdnR5cGUgKyAiOyB9IjsKKyAgICAgIHRzX3R5cGUgPSAieyBbazogbnVtYmVyIC8qIiArIGt0eXBlICsgIiovXTogIiArIHZ0eXBlICsgIjsgfSI7CisgICAgfSBlbHNlIHsKKyAgICAgIHRzX3R5cGUgPSAiYW55IjsKKyAgICB9CisgIH0KKworICByZXR1cm4gdHNfdHlwZTsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgVHlwZVNjcmlwdCBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ25hbWUoYXJnczogdHlwZXMpOiB0eXBlOycKKyAqCisgKiBAcGFyYW0gdF9mdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcGFyYW0gYm9vbCBpbi0vZXhjbHVkZSB0aGUgY2FsbGJhY2sgYXJndW1lbnQKKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RkOjpzdHJpbmcgdF9qc19nZW5lcmF0b3I6OnRzX2Z1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIGJvb2wgaW5jbHVkZV9jYWxsYmFjaywgYm9vbCBvcHRpb25hbF9jYWxsYmFjaykgeworICBzdHJpbmcgc3RyOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBzdHIgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiKCI7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHIgKz0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgdHNfZ2V0X3JlcSgqZl9pdGVyKSArICI6ICIgKyB0c19nZXRfdHlwZSgoKmZfaXRlciktPmdldF90eXBlKCkpOworCisgICAgaWYgKGZfaXRlciArIDEgIT0gZmllbGRzLmVuZCgpIHx8IChpbmNsdWRlX2NhbGxiYWNrICYmIGZpZWxkcy5zaXplKCkgPiAwKSkgeworICAgICAgc3RyICs9ICIsICI7CisgICAgfQorICB9CisKKyAgaWYgKGluY2x1ZGVfY2FsbGJhY2spIHsKKyAgICBzdHJpbmcgY2FsbGJhY2tfb3B0aW9uYWxfc3RyaW5nID0gb3B0aW9uYWxfY2FsbGJhY2sgPyAiPyIgOiAiIjsKKyAgICBpZiAoZ2VuX25vZGVfKSB7CisgICAgICB0X3N0cnVjdCogZXhjZXB0aW9ucyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICAgICAgc3RyaW5nIGV4Y2VwdGlvbl90eXBlczsKKyAgICAgIGlmIChleGNlcHRpb25zKSB7CisgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSBleGNlcHRpb25zLT5nZXRfbWVtYmVycygpOworICAgICAgICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbWVtYmVycy5iZWdpbigpOyBpdCAhPSBtZW1iZXJzLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKml0KS0+Z2V0X3R5cGUoKSk7CisgICAgICAgICAgaWYgKGl0ID09IG1lbWJlcnMuYmVnaW4oKSkgeworICAgICAgICAgICAgZXhjZXB0aW9uX3R5cGVzID0gdC0+Z2V0X25hbWUoKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZXhjZXB0aW9uX3R5cGVzICs9ICIgfCAiICsgdC0+Z2V0X25hbWUoKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChleGNlcHRpb25fdHlwZXMgPT0gIiIpIHsKKyAgICAgICAgc3RyICs9ICJjYWxsYmFjayIgKyBjYWxsYmFja19vcHRpb25hbF9zdHJpbmcgKyAiOiAoZXJyb3I6IHZvaWQsIHJlc3BvbnNlOiAiICsgdHNfZ2V0X3R5cGUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSArICIpPT52b2lkKTogIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN0ciArPSAiY2FsbGJhY2siICsgY2FsbGJhY2tfb3B0aW9uYWxfc3RyaW5nICsgIjogKGVycm9yOiAiICsgZXhjZXB0aW9uX3R5cGVzICsgIiwgcmVzcG9uc2U6ICIgKyB0c19nZXRfdHlwZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpICsgIik9PnZvaWQpOiAiOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBzdHIgKz0gImNhbGxiYWNrIiArIGNhbGxiYWNrX29wdGlvbmFsX3N0cmluZyArICI6IChkYXRhOiAiICsgdHNfZ2V0X3R5cGUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSArICIpPT52b2lkKTogIjsKKyAgICB9CisKKyAgICBpZiAoZ2VuX2pxdWVyeV8pIHsKKyAgICAgIHN0ciArPSAiSlF1ZXJ5UHJvbWlzZTwiICsgdHNfZ2V0X3R5cGUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSArIj47IjsKKyAgICB9IGVsc2UgeworICAgICAgc3RyICs9ICJ2b2lkOyI7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChnZW5fZXM2XykgeworICAgICAgc3RyICs9ICIpOiBQcm9taXNlPCIgKyB0c19nZXRfdHlwZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpICsgIj47IjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBzdHIgKz0gIik6ICIgKyB0c19nZXRfdHlwZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpICsgIjsiOworICAgIH0KKyAgfQorCisgIHJldHVybiBzdHI7Cit9CisKKy8qKgorICogVGFrZXMgYSBuYW1lIGFuZCBwcm9kdWNlcyBhIHZhbGlkIE5vZGVKUyBpZGVudGlmaWVyIGZyb20gaXQKKyAqCisgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSB3aGljaCBzaGFsbCBiZWNvbWUgYSB2YWxpZCBOb2RlSlMgaWRlbnRpZmllcgorICogQHJldHVybiBUaGUgbW9kaWZpZWQgbmFtZSB3aXRoIHRoZSB1cGRhdGVkIGlkZW50aWZpZXIKKyAqLworc3RkOjpzdHJpbmcgdF9qc19nZW5lcmF0b3I6Om1ha2VfdmFsaWRfbm9kZUpzX2lkZW50aWZpZXIoc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUpIHsKKyAgc3RkOjpzdHJpbmcgc3RyID0gbmFtZTsKKyAgaWYgKHN0ci5lbXB0eSgpKSB7CisgICAgcmV0dXJuIHN0cjsKKyAgfQorCisgIC8vIHRlc3RzIHJlbHkgb24gdGhpcworICBhc3NlcnQoKCdBJyA8ICdaJykgJiYgKCdhJyA8ICd6JykgJiYgKCcwJyA8ICc5JykpOworCisgIC8vIGlmIHRoZSBmaXJzdCBsZXR0ZXIgaXMgYSBudW1iZXIsIHdlIGFkZCBhbiBhZGRpdGlvbmFsIHVuZGVyc2NvcmUgaW4gZnJvbnQgb2YgaXQKKyAgY2hhciBjID0gc3RyLmF0KDApOworICBpZiAoKCcwJyA8PSBjKSAmJiAoYyA8PSAnOScpKSB7CisgICAgc3RyID0gIl8iICsgc3RyOworICB9CisKKyAgLy8gZm9sbG93aW5nIGNoYXJzOiBsZXR0ZXIsIG51bWJlciBvciB1bmRlcnNjb3JlCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RyLnNpemUoKTsgKytpKSB7CisgICAgYyA9IHN0ci5hdChpKTsKKyAgICBpZiAoKCgnQScgPiBjKSB8fCAoYyA+ICdaJykpICYmICgoJ2EnID4gYykgfHwgKGMgPiAneicpKSAmJiAoKCcwJyA+IGMpIHx8IChjID4gJzknKSkKKyAgICAgICAgJiYgKCdfJyAhPSBjKSAmJiAoJyQnICE9IGMpKSB7CisgICAgICBzdHIucmVwbGFjZShpLCAxLCAiXyIpOworICAgIH0KKyAgfQorCisgIHJldHVybiBzdHI7Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoanMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJKYXZhc2NyaXB0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBqcXVlcnk6ICAgICAgICAgIEdlbmVyYXRlIGpRdWVyeSBjb21wYXRpYmxlIGNvZGUuXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgbm9kZTogICAgICAgICAgICBHZW5lcmF0ZSBub2RlLmpzIGNvbXBhdGlibGUgY29kZS5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICB0czogICAgICAgICAgICAgIEdlbmVyYXRlIFR5cGVTY3JpcHQgZGVmaW5pdGlvbiBmaWxlcy5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICB3aXRoX25zOiAgICAgICAgIENyZWF0ZSBnbG9iYWwgbmFtZXNwYWNlIG9iamVjdHMgd2hlbiB1c2luZyBub2RlLmpzXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgZXM2OiAgICAgICAgICAgICBDcmVhdGUgRVM2IGNvZGUgd2l0aCBQcm9taXNlc1xuIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfanNvbl9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2pzb25fZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNTM2MTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2pzb25fZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsNzkzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPGxpbWl0cz4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b2ZzdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7Cit1c2luZyBzdGQ6OnN0YWNrOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOworc3RhdGljIGNvbnN0IHN0cmluZyBxdW90ID0gIlwiIjsKK3N0YXRpYyBjb25zdCBib29sIE5PX0lOREVOVCA9IGZhbHNlOworc3RhdGljIGNvbnN0IGJvb2wgRk9SQ0VfU1RSSU5HID0gdHJ1ZTsKKworY2xhc3MgdF9qc29uX2dlbmVyYXRvciA6IHB1YmxpYyB0X2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfanNvbl9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIHNob3VsZF9tZXJnZV9pbmNsdWRlc18gPSBmYWxzZTsKKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJtZXJnZSIpID09IDApIHsKKyAgICAgICAgc2hvdWxkX21lcmdlX2luY2x1ZGVzXyA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24ganNvbjoiICsgaXRlci0+Zmlyc3Q7CisgICAgICB9CisgICAgfQorCisgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tanNvbiI7CisgIH0KKworICB2aXJ0dWFsIH50X2pzb25fZ2VuZXJhdG9yKCkge30KKworICAvKioKKyAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCisgICovCisKKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX3Byb2dyYW0oKTsKKyAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbih0X2Z1bmN0aW9uKiB0ZnVuYyk7CisgIHZvaWQgZ2VuZXJhdGVfZmllbGQodF9maWVsZCogZmllbGQpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCitwcml2YXRlOgorICBib29sIHNob3VsZF9tZXJnZV9pbmNsdWRlc187CisKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2pzb25fOworICBzdGQ6OnN0YWNrPGJvb2w+IGNvbW1hX25lZWRlZF87CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHN0cmluZyBudW1iZXJfdG9fc3RyaW5nKFQgdCkgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisgICAgb3V0LmltYnVlKHN0ZDo6bG9jYWxlOjpjbGFzc2ljKCkpOworICAgIG91dC5wcmVjaXNpb24oc3RkOjpudW1lcmljX2xpbWl0czxUPjo6ZGlnaXRzMTApOworICAgIG91dCA8PCB0OworICAgIHJldHVybiBvdXQuc3RyKCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgdm9pZCB3cml0ZV9udW1iZXIoVCBuKSB7CisgICAgZl9qc29uXyA8PCBudW1iZXJfdG9fc3RyaW5nKG4pOworICB9CisKKyAgc3RyaW5nIGdldF90eXBlX25hbWUodF90eXBlKiB0dHlwZSk7CisgIHN0cmluZyBnZXRfcXVhbGlmaWVkX25hbWUodF90eXBlKiB0dHlwZSk7CisKKyAgdm9pZCBzdGFydF9vYmplY3QoYm9vbCBzaG91bGRfaW5kZW50ID0gdHJ1ZSk7CisgIHZvaWQgc3RhcnRfYXJyYXkoKTsKKyAgdm9pZCBlbmRfb2JqZWN0KCk7CisgIHZvaWQgZW5kX2FycmF5KCk7CisgIHZvaWQgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7CisgIHZvaWQgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7CisgIHN0cmluZyBlc2NhcGVfanNvbl9zdHJpbmcoY29uc3Qgc3RyaW5nJiBpbnB1dCk7CisgIHN0cmluZyBqc29uX3N0cihjb25zdCBzdHJpbmcmIHN0cik7CisgIHZvaWQgbWVyZ2VfaW5jbHVkZXModF9wcm9ncmFtKik7CisKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdGFudCh0X2NvbnN0KiBjb24pOworCisgIHZvaWQgd3JpdGVfdHlwZV9zcGVjX2VudHJ5KGNvbnN0IGNoYXIqIG5hbWUsIHRfdHlwZSogdHR5cGUpOworICB2b2lkIHdyaXRlX3R5cGVfc3BlY19vYmplY3QoY29uc3QgY2hhciogbmFtZSwgdF90eXBlKiB0dHlwZSk7CisgIHZvaWQgd3JpdGVfdHlwZV9zcGVjKHRfdHlwZSogdHR5cGUpOworICB2b2lkIHdyaXRlX3N0cmluZyhjb25zdCBzdHJpbmcmIHZhbHVlKTsKKyAgdm9pZCB3cml0ZV92YWx1ZSh0X3R5cGUqIHR2YWx1ZSk7CisgIHZvaWQgd3JpdGVfY29uc3RfdmFsdWUodF9jb25zdF92YWx1ZSogdmFsdWUsIGJvb2wgZm9yY2Vfc3RyaW5nID0gZmFsc2UpOworICB2b2lkIHdyaXRlX2tleV9hbmQoc3RyaW5nIGtleSk7CisgIHZvaWQgd3JpdGVfa2V5X2FuZF9zdHJpbmcoc3RyaW5nIGtleSwgc3RyaW5nIHZhbCk7CisgIHZvaWQgd3JpdGVfa2V5X2FuZF9pbnRlZ2VyKHN0cmluZyBrZXksIGludCB2YWwpOworICB2b2lkIHdyaXRlX2tleV9hbmRfYm9vbChzdHJpbmcga2V5LCBib29sIHZhbCk7Cit9OworCit2b2lkIHRfanNvbl9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworCisgIHN0cmluZyBmX2pzb25fbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwcm9ncmFtXy0+Z2V0X25hbWUoKSArICIuanNvbiI7CisgIGZfanNvbl8ub3BlbihmX2pzb25fbmFtZS5jX3N0cigpKTsKKworICAvLyBNZXJnZSBhbGwgaW5jbHVkZWQgcHJvZ3JhbXMgaW50byB0aGlzIG9uZSBzbyB3ZSBjYW4gb3V0cHV0IG9uZSBiaWcgZmlsZS4KKyAgaWYgKHNob3VsZF9tZXJnZV9pbmNsdWRlc18pIHsKKyAgICBtZXJnZV9pbmNsdWRlcyhwcm9ncmFtXyk7CisgIH0KK30KKworc3RyaW5nIHRfanNvbl9nZW5lcmF0b3I6OmVzY2FwZV9qc29uX3N0cmluZyhjb25zdCBzdHJpbmcmIGlucHV0KSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzczsKKyAgZm9yIChzdGQ6OnN0cmluZzo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IGlucHV0LmJlZ2luKCk7IGl0ZXIgIT0gaW5wdXQuZW5kKCk7IGl0ZXIrKykgeworICAgIHN3aXRjaCAoKml0ZXIpIHsKKyAgICBjYXNlICdcXCc6CisgICAgICBzcyA8PCAiXFxcXCI7CisgICAgICBicmVhazsKKyAgICBjYXNlICciJzoKKyAgICAgIHNzIDw8ICJcXFwiIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJy8nOgorICAgICAgc3MgPDwgIlxcLyI7CisgICAgICBicmVhazsKKyAgICBjYXNlICdcYic6CisgICAgICBzcyA8PCAiXFxiIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ1xmJzoKKyAgICAgIHNzIDw8ICJcXGYiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnXG4nOgorICAgICAgc3MgPDwgIlxcbiI7CisgICAgICBicmVhazsKKyAgICBjYXNlICdccic6CisgICAgICBzcyA8PCAiXFxyIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ1x0JzoKKyAgICAgIHNzIDw8ICJcXHQiOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHNzIDw8ICppdGVyOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiBzcy5zdHIoKTsKK30KKwordm9pZCB0X2pzb25fZ2VuZXJhdG9yOjpzdGFydF9vYmplY3QoYm9vbCBzaG91bGRfaW5kZW50KSB7CisgIGZfanNvbl8gPDwgKHNob3VsZF9pbmRlbnQgPyBpbmRlbnQoKSA6ICIiKSA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGNvbW1hX25lZWRlZF8ucHVzaChmYWxzZSk7Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6c3RhcnRfYXJyYXkoKSB7CisgIGZfanNvbl8gPDwgIlsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBjb21tYV9uZWVkZWRfLnB1c2goZmFsc2UpOworfQorCit2b2lkIHRfanNvbl9nZW5lcmF0b3I6OndyaXRlX2NvbW1hX2lmX25lZWRlZCgpIHsKKyAgaWYgKGNvbW1hX25lZWRlZF8udG9wKCkpIHsKKyAgICBmX2pzb25fIDw8ICIsIiA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6aW5kaWNhdGVfY29tbWFfbmVlZGVkKCkgeworICBjb21tYV9uZWVkZWRfLnBvcCgpOworICBjb21tYV9uZWVkZWRfLnB1c2godHJ1ZSk7Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6d3JpdGVfa2V5X2FuZChzdHJpbmcga2V5KSB7CisgIHdyaXRlX2NvbW1hX2lmX25lZWRlZCgpOworICBpbmRlbnQoZl9qc29uXykgPDwganNvbl9zdHIoa2V5KSA8PCAiOiAiOworICBpbmRpY2F0ZV9jb21tYV9uZWVkZWQoKTsKK30KKwordm9pZCB0X2pzb25fZ2VuZXJhdG9yOjp3cml0ZV9rZXlfYW5kX2ludGVnZXIoc3RyaW5nIGtleSwgaW50IHZhbCkgeworICB3cml0ZV9jb21tYV9pZl9uZWVkZWQoKTsKKyAgaW5kZW50KGZfanNvbl8pIDw8IGpzb25fc3RyKGtleSkgPDwgIjogIiA8PCBudW1iZXJfdG9fc3RyaW5nKHZhbCk7CisgIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOworfQorCit2b2lkIHRfanNvbl9nZW5lcmF0b3I6OndyaXRlX2tleV9hbmRfc3RyaW5nKHN0cmluZyBrZXksIHN0cmluZyB2YWwpIHsKKyAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7CisgIGluZGVudChmX2pzb25fKSA8PCBqc29uX3N0cihrZXkpIDw8ICI6ICIgPDwganNvbl9zdHIodmFsKTsKKyAgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6d3JpdGVfa2V5X2FuZF9ib29sKHN0cmluZyBrZXksIGJvb2wgdmFsKSB7CisgIHdyaXRlX2NvbW1hX2lmX25lZWRlZCgpOworICBpbmRlbnQoZl9qc29uXykgPDwganNvbl9zdHIoa2V5KSA8PCAiOiAiIDw8ICh2YWwgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6ZW5kX29iamVjdCgpIHsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9qc29uXyA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IjsKKyAgY29tbWFfbmVlZGVkXy5wb3AoKTsKK30KKwordm9pZCB0X2pzb25fZ2VuZXJhdG9yOjplbmRfYXJyYXkoKSB7CisgIGluZGVudF9kb3duKCk7CisgIGlmIChjb21tYV9uZWVkZWRfLnRvcCgpKSB7CisgICAgZl9qc29uXyA8PCBlbmRsOworICB9CisgIGluZGVudChmX2pzb25fKSA8PCAiXSI7CisgIGNvbW1hX25lZWRlZF8ucG9wKCk7Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6d3JpdGVfdHlwZV9zcGVjX29iamVjdChjb25zdCBjaGFyKiBuYW1lLCB0X3R5cGUqIHR0eXBlKSB7CisgIHR0eXBlID0gdHR5cGUtPmdldF90cnVlX3R5cGUoKTsKKyAgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSB8fCB0dHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICB3cml0ZV9rZXlfYW5kKG5hbWUpOworICAgIHN0YXJ0X29iamVjdChOT19JTkRFTlQpOworICAgIHdyaXRlX2tleV9hbmQoInR5cGVJZCIpOworICAgIHdyaXRlX3R5cGVfc3BlYyh0dHlwZSk7CisgICAgZW5kX29iamVjdCgpOworICB9Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6d3JpdGVfdHlwZV9zcGVjX2VudHJ5KGNvbnN0IGNoYXIqIG5hbWUsIHRfdHlwZSogdHR5cGUpIHsKKyAgd3JpdGVfa2V5X2FuZChuYW1lKTsKKyAgd3JpdGVfdHlwZV9zcGVjKHR0eXBlKTsKK30KKwordm9pZCB0X2pzb25fZ2VuZXJhdG9yOjp3cml0ZV90eXBlX3NwZWModF90eXBlKiB0dHlwZSkgeworICB0dHlwZSA9IHR0eXBlLT5nZXRfdHJ1ZV90eXBlKCk7CisKKyAgd3JpdGVfc3RyaW5nKGdldF90eXBlX25hbWUodHR5cGUpKTsKKworICBpZiAodHR5cGUtPmFubm90YXRpb25zXy5zaXplKCkgPiAwKSB7CisgICAgd3JpdGVfa2V5X2FuZCgiYW5ub3RhdGlvbnMiKTsKKyAgICBzdGFydF9vYmplY3QoKTsKKyAgICBmb3IgKG1hcDxzdHJpbmcsIHN0cmluZz46Oml0ZXJhdG9yIGl0ID0gdHR5cGUtPmFubm90YXRpb25zXy5iZWdpbigpOyBpdCAhPSB0dHlwZS0+YW5ub3RhdGlvbnNfLmVuZCgpOyArK2l0KSB7CisgICAgICB3cml0ZV9rZXlfYW5kX3N0cmluZyhpdC0+Zmlyc3QsIGl0LT5zZWNvbmQpOworICAgIH0KKyAgICBlbmRfb2JqZWN0KCk7CisgIH0KKworICBpZiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoImNsYXNzIiwgZ2V0X3F1YWxpZmllZF9uYW1lKHR0eXBlKSk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoImtleVR5cGVJZCIsIGdldF90eXBlX25hbWUoa3R5cGUpKTsKKyAgICB3cml0ZV9rZXlfYW5kX3N0cmluZygidmFsdWVUeXBlSWQiLCBnZXRfdHlwZV9uYW1lKHZ0eXBlKSk7CisgICAgd3JpdGVfdHlwZV9zcGVjX29iamVjdCgia2V5VHlwZSIsIGt0eXBlKTsKKyAgICB3cml0ZV90eXBlX3NwZWNfb2JqZWN0KCJ2YWx1ZVR5cGUiLCB2dHlwZSk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoImVsZW1UeXBlSWQiLCBnZXRfdHlwZV9uYW1lKGV0eXBlKSk7CisgICAgd3JpdGVfdHlwZV9zcGVjX29iamVjdCgiZWxlbVR5cGUiLCBldHlwZSk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF90eXBlKiBldHlwZSA9ICgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJlbGVtVHlwZUlkIiwgZ2V0X3R5cGVfbmFtZShldHlwZSkpOworICAgIHdyaXRlX3R5cGVfc3BlY19vYmplY3QoImVsZW1UeXBlIiwgZXR5cGUpOworICB9Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworICBmX2pzb25fIDw8IGVuZGw7CisgIGZfanNvbl8uY2xvc2UoKTsKK30KKwordm9pZCB0X2pzb25fZ2VuZXJhdG9yOjptZXJnZV9pbmNsdWRlcyh0X3Byb2dyYW0qIHByb2dyYW0pIHsKKyAgdmVjdG9yPHRfcHJvZ3JhbSo+IGluY2x1ZGVzID0gcHJvZ3JhbS0+Z2V0X2luY2x1ZGVzKCk7CisgIHZlY3Rvcjx0X3Byb2dyYW0qPjo6aXRlcmF0b3IgaW5jX2l0ZXI7CisgIGZvciAoaW5jX2l0ZXIgPSBpbmNsdWRlcy5iZWdpbigpOyBpbmNfaXRlciAhPSBpbmNsdWRlcy5lbmQoKTsgKytpbmNfaXRlcikgeworICAgIHRfcHJvZ3JhbSogaW5jbHVkZSA9ICppbmNfaXRlcjsKKyAgICAvLyByZWN1cnNlIGluIGNhc2Ugd2UgZ2V0IGNyYXp5CisgICAgbWVyZ2VfaW5jbHVkZXMoaW5jbHVkZSk7CisgICAgLy8gbWVyZ2UgZW51bXMKKyAgICB2ZWN0b3I8dF9lbnVtKj4gZW51bXMgPSBpbmNsdWRlLT5nZXRfZW51bXMoKTsKKyAgICB2ZWN0b3I8dF9lbnVtKj46Oml0ZXJhdG9yIGVuX2l0ZXI7CisgICAgZm9yIChlbl9pdGVyID0gZW51bXMuYmVnaW4oKTsgZW5faXRlciAhPSBlbnVtcy5lbmQoKTsgKytlbl9pdGVyKSB7CisgICAgICBwcm9ncmFtLT5hZGRfZW51bSgqZW5faXRlcik7CisgICAgfQorICAgIC8vIG1lcmdlIHR5cGVkZWZzCisgICAgdmVjdG9yPHRfdHlwZWRlZio+IHR5cGVkZWZzID0gaW5jbHVkZS0+Z2V0X3R5cGVkZWZzKCk7CisgICAgdmVjdG9yPHRfdHlwZWRlZio+OjppdGVyYXRvciB0ZF9pdGVyOworICAgIGZvciAodGRfaXRlciA9IHR5cGVkZWZzLmJlZ2luKCk7IHRkX2l0ZXIgIT0gdHlwZWRlZnMuZW5kKCk7ICsrdGRfaXRlcikgeworICAgICAgcHJvZ3JhbS0+YWRkX3R5cGVkZWYoKnRkX2l0ZXIpOworICAgIH0KKyAgICAvLyBtZXJnZSBzdHJ1Y3RzCisgICAgdmVjdG9yPHRfc3RydWN0Kj4gb2JqZWN0cyA9IGluY2x1ZGUtPmdldF9vYmplY3RzKCk7CisgICAgdmVjdG9yPHRfc3RydWN0Kj46Oml0ZXJhdG9yIG9faXRlcjsKKyAgICBmb3IgKG9faXRlciA9IG9iamVjdHMuYmVnaW4oKTsgb19pdGVyICE9IG9iamVjdHMuZW5kKCk7ICsrb19pdGVyKSB7CisgICAgICBwcm9ncmFtLT5hZGRfc3RydWN0KCpvX2l0ZXIpOworICAgIH0KKyAgICAvLyBtZXJnZSBjb25zdGFudHMKKyAgICB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyA9IGluY2x1ZGUtPmdldF9jb25zdHMoKTsKKyAgICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7CisgICAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICAgIHByb2dyYW0tPmFkZF9jb25zdCgqY19pdGVyKTsKKyAgICB9CisKKyAgICAvLyBtZXJnZSBzZXJ2aWNlcworICAgIHZlY3Rvcjx0X3NlcnZpY2UqPiBzZXJ2aWNlcyA9IGluY2x1ZGUtPmdldF9zZXJ2aWNlcygpOworICAgIHZlY3Rvcjx0X3NlcnZpY2UqPjo6aXRlcmF0b3Igc3ZfaXRlcjsKKyAgICBmb3IgKHN2X2l0ZXIgPSBzZXJ2aWNlcy5iZWdpbigpOyBzdl9pdGVyICE9IHNlcnZpY2VzLmVuZCgpOyArK3N2X2l0ZXIpIHsKKyAgICAgIHByb2dyYW0tPmFkZF9zZXJ2aWNlKCpzdl9pdGVyKTsKKyAgICB9CisgIH0KK30KKwordm9pZCB0X2pzb25fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9ncmFtKCkgeworCisgIGluaXRfZ2VuZXJhdG9yKCk7CisKKyAgc3RhcnRfb2JqZWN0KCk7CisgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJuYW1lIiwgcHJvZ3JhbV8tPmdldF9uYW1lKCkpOworICBpZiAocHJvZ3JhbV8tPmhhc19kb2MoKSkgeworICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJkb2MiLCBwcm9ncmFtXy0+Z2V0X2RvYygpKTsKKyAgfQorCisgIC8vIFdoZW4gbWVyZ2luZyBpbmNsdWRlcywgdGhlICJuYW1lc3BhY2VzIiBhbmQgImluY2x1ZGVzIiBzZWN0aW9ucworICAvLyBiZWNvbWUgYW1iaWd1b3VzLCBzbyBqdXN0IHNraXAgdGhlbS4KKyAgaWYgKCFzaG91bGRfbWVyZ2VfaW5jbHVkZXNfKSB7CisgICAgLy8gR2VuZXJhdGUgbmFtZXNwYWNlcworICAgIHdyaXRlX2tleV9hbmQoIm5hbWVzcGFjZXMiKTsKKyAgICBzdGFydF9vYmplY3QoTk9fSU5ERU5UKTsKKyAgICBjb25zdCBtYXA8c3RyaW5nLCBzdHJpbmc+JiBuYW1lc3BhY2VzID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2VzKCk7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgbnNfaXQ7CisgICAgZm9yIChuc19pdCA9IG5hbWVzcGFjZXMuYmVnaW4oKTsgbnNfaXQgIT0gbmFtZXNwYWNlcy5lbmQoKTsgKytuc19pdCkgeworICAgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcobnNfaXQtPmZpcnN0LCBuc19pdC0+c2Vjb25kKTsKKyAgICAgIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOworICAgIH0KKyAgICBlbmRfb2JqZWN0KCk7CisKKyAgICAvLyBHZW5lcmF0ZSBpbmNsdWRlcworICAgIHdyaXRlX2tleV9hbmQoImluY2x1ZGVzIik7CisgICAgc3RhcnRfYXJyYXkoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4gaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7CisgICAgdmVjdG9yPHRfcHJvZ3JhbSo+Ojpjb25zdF9pdGVyYXRvciBpbmNfaXQ7CisgICAgZm9yIChpbmNfaXQgPSBpbmNsdWRlcy5iZWdpbigpOyBpbmNfaXQgIT0gaW5jbHVkZXMuZW5kKCk7ICsraW5jX2l0KSB7CisgICAgICB3cml0ZV9jb21tYV9pZl9uZWVkZWQoKTsKKyAgICAgIHdyaXRlX3N0cmluZygoKmluY19pdCktPmdldF9uYW1lKCkpOworICAgICAgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7CisgICAgfQorICAgIGVuZF9hcnJheSgpOworICB9CisKKyAgLy8gR2VuZXJhdGUgZW51bXMKKyAgd3JpdGVfa2V5X2FuZCgiZW51bXMiKTsKKyAgc3RhcnRfYXJyYXkoKTsKKyAgdmVjdG9yPHRfZW51bSo+IGVudW1zID0gcHJvZ3JhbV8tPmdldF9lbnVtcygpOworICB2ZWN0b3I8dF9lbnVtKj46Oml0ZXJhdG9yIGVuX2l0ZXI7CisgIGZvciAoZW5faXRlciA9IGVudW1zLmJlZ2luKCk7IGVuX2l0ZXIgIT0gZW51bXMuZW5kKCk7ICsrZW5faXRlcikgeworICAgIHdyaXRlX2NvbW1hX2lmX25lZWRlZCgpOworICAgIGdlbmVyYXRlX2VudW0oKmVuX2l0ZXIpOworICAgIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOworICB9CisgIGVuZF9hcnJheSgpOworCisgIC8vIEdlbmVyYXRlIHR5cGVkZWZzCisgIHdyaXRlX2tleV9hbmQoInR5cGVkZWZzIik7CisgIHN0YXJ0X2FycmF5KCk7CisgIHZlY3Rvcjx0X3R5cGVkZWYqPiB0eXBlZGVmcyA9IHByb2dyYW1fLT5nZXRfdHlwZWRlZnMoKTsKKyAgdmVjdG9yPHRfdHlwZWRlZio+OjppdGVyYXRvciB0ZF9pdGVyOworICBmb3IgKHRkX2l0ZXIgPSB0eXBlZGVmcy5iZWdpbigpOyB0ZF9pdGVyICE9IHR5cGVkZWZzLmVuZCgpOyArK3RkX2l0ZXIpIHsKKyAgICB3cml0ZV9jb21tYV9pZl9uZWVkZWQoKTsKKyAgICBnZW5lcmF0ZV90eXBlZGVmKCp0ZF9pdGVyKTsKKyAgICBpbmRpY2F0ZV9jb21tYV9uZWVkZWQoKTsKKyAgfQorICBlbmRfYXJyYXkoKTsKKworICAvLyBHZW5lcmF0ZSBzdHJ1Y3RzLCBleGNlcHRpb25zLCBhbmQgdW5pb25zIGluIGRlY2xhcmVkIG9yZGVyCisgIHdyaXRlX2tleV9hbmQoInN0cnVjdHMiKTsKKyAgc3RhcnRfYXJyYXkoKTsKKyAgdmVjdG9yPHRfc3RydWN0Kj4gb2JqZWN0cyA9IHByb2dyYW1fLT5nZXRfb2JqZWN0cygpOworICB2ZWN0b3I8dF9zdHJ1Y3QqPjo6aXRlcmF0b3Igb19pdGVyOworICBmb3IgKG9faXRlciA9IG9iamVjdHMuYmVnaW4oKTsgb19pdGVyICE9IG9iamVjdHMuZW5kKCk7ICsrb19pdGVyKSB7CisgICAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7CisgICAgaWYgKCgqb19pdGVyKS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgZ2VuZXJhdGVfeGNlcHRpb24oKm9faXRlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIGdlbmVyYXRlX3N0cnVjdCgqb19pdGVyKTsKKyAgICB9CisgICAgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7CisgIH0KKyAgZW5kX2FycmF5KCk7CisKKyAgLy8gR2VuZXJhdGUgY29uc3RhbnRzCisgIHdyaXRlX2tleV9hbmQoImNvbnN0YW50cyIpOworICBzdGFydF9hcnJheSgpOworICB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyA9IHByb2dyYW1fLT5nZXRfY29uc3RzKCk7CisgIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICB3cml0ZV9jb21tYV9pZl9uZWVkZWQoKTsKKyAgICBnZW5lcmF0ZV9jb25zdGFudCgqY19pdGVyKTsKKyAgICBpbmRpY2F0ZV9jb21tYV9uZWVkZWQoKTsKKyAgfQorICBlbmRfYXJyYXkoKTsKKworICAvLyBHZW5lcmF0ZSBzZXJ2aWNlcworICB3cml0ZV9rZXlfYW5kKCJzZXJ2aWNlcyIpOworICBzdGFydF9hcnJheSgpOworICB2ZWN0b3I8dF9zZXJ2aWNlKj4gc2VydmljZXMgPSBwcm9ncmFtXy0+Z2V0X3NlcnZpY2VzKCk7CisgIHZlY3Rvcjx0X3NlcnZpY2UqPjo6aXRlcmF0b3Igc3ZfaXRlcjsKKyAgZm9yIChzdl9pdGVyID0gc2VydmljZXMuYmVnaW4oKTsgc3ZfaXRlciAhPSBzZXJ2aWNlcy5lbmQoKTsgKytzdl9pdGVyKSB7CisgICAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7CisgICAgZ2VuZXJhdGVfc2VydmljZSgqc3ZfaXRlcik7CisgICAgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7CisgIH0KKyAgZW5kX2FycmF5KCk7CisKKyAgZW5kX29iamVjdCgpOworCisgIC8vIENsb3NlIHRoZSBnZW5lcmF0b3IKKyAgY2xvc2VfZ2VuZXJhdG9yKCk7Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgIHN0YXJ0X29iamVjdCgpOworICB3cml0ZV9rZXlfYW5kX3N0cmluZygibmFtZSIsIGdldF9xdWFsaWZpZWRfbmFtZSh0dHlwZWRlZikpOworICB3cml0ZV9rZXlfYW5kX3N0cmluZygidHlwZUlkIiwgZ2V0X3R5cGVfbmFtZSh0dHlwZWRlZi0+Z2V0X3RydWVfdHlwZSgpKSk7CisgIHdyaXRlX3R5cGVfc3BlY19vYmplY3QoInR5cGUiLCB0dHlwZWRlZi0+Z2V0X3RydWVfdHlwZSgpKTsKKyAgaWYgKHR0eXBlZGVmLT5oYXNfZG9jKCkpIHsKKyAgICB3cml0ZV9rZXlfYW5kX3N0cmluZygiZG9jIiwgdHR5cGVkZWYtPmdldF9kb2MoKSk7CisgIH0KKyAgaWYgKHR0eXBlZGVmLT5hbm5vdGF0aW9uc18uc2l6ZSgpID4gMCkgeworICAgIHdyaXRlX2tleV9hbmQoImFubm90YXRpb25zIik7CisgICAgc3RhcnRfb2JqZWN0KCk7CisgICAgZm9yIChtYXA8c3RyaW5nLCBzdHJpbmc+OjppdGVyYXRvciBpdCA9IHR0eXBlZGVmLT5hbm5vdGF0aW9uc18uYmVnaW4oKTsgaXQgIT0gdHR5cGVkZWYtPmFubm90YXRpb25zXy5lbmQoKTsgKytpdCkgeworICAgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoaXQtPmZpcnN0LCBpdC0+c2Vjb25kKTsKKyAgICB9CisgICAgZW5kX29iamVjdCgpOworICB9CisgIGVuZF9vYmplY3QoKTsKK30KKwordm9pZCB0X2pzb25fZ2VuZXJhdG9yOjp3cml0ZV9zdHJpbmcoY29uc3Qgc3RyaW5nJiB2YWx1ZSkgeworICBmX2pzb25fIDw8IHF1b3QgPDwgZXNjYXBlX2pzb25fc3RyaW5nKHZhbHVlKSA8PCBxdW90OworfQorCit2b2lkIHRfanNvbl9nZW5lcmF0b3I6OndyaXRlX2NvbnN0X3ZhbHVlKHRfY29uc3RfdmFsdWUqIHZhbHVlLCBib29sIHNob3VsZF9mb3JjZV9zdHJpbmcpIHsKKworICBzd2l0Y2ggKHZhbHVlLT5nZXRfdHlwZSgpKSB7CisKKyAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9JREVOVElGSUVSOgorICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVI6CisgICAgaWYgKHNob3VsZF9mb3JjZV9zdHJpbmcpIHsKKyAgICAgIHdyaXRlX3N0cmluZyhudW1iZXJfdG9fc3RyaW5nKHZhbHVlLT5nZXRfaW50ZWdlcigpKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHdyaXRlX251bWJlcih2YWx1ZS0+Z2V0X2ludGVnZXIoKSk7CisgICAgfQorICAgIGJyZWFrOworCisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfRE9VQkxFOgorICAgIGlmIChzaG91bGRfZm9yY2Vfc3RyaW5nKSB7CisgICAgICB3cml0ZV9zdHJpbmcobnVtYmVyX3RvX3N0cmluZyh2YWx1ZS0+Z2V0X2RvdWJsZSgpKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHdyaXRlX251bWJlcih2YWx1ZS0+Z2V0X2RvdWJsZSgpKTsKKyAgICB9CisgICAgYnJlYWs7CisKKyAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9TVFJJTkc6CisgICAgd3JpdGVfc3RyaW5nKHZhbHVlLT5nZXRfc3RyaW5nKCkpOworICAgIGJyZWFrOworCisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfTElTVDogeworICAgIHN0YXJ0X2FycmF5KCk7CisgICAgc3RkOjp2ZWN0b3I8dF9jb25zdF92YWx1ZSo+IGxpc3QgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46Oml0ZXJhdG9yIGxpdDsKKyAgICBmb3IgKGxpdCA9IGxpc3QuYmVnaW4oKTsgbGl0ICE9IGxpc3QuZW5kKCk7ICsrbGl0KSB7CisgICAgICB3cml0ZV9jb21tYV9pZl9uZWVkZWQoKTsKKyAgICAgIGZfanNvbl8gPDwgaW5kZW50KCk7CisgICAgICB3cml0ZV9jb25zdF92YWx1ZSgqbGl0KTsKKyAgICAgIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOworICAgIH0KKyAgICBlbmRfYXJyYXkoKTsKKyAgICBicmVhazsKKyAgfQorCisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfTUFQOiB7CisgICAgc3RhcnRfb2JqZWN0KE5PX0lOREVOVCk7CisgICAgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiBtYXAgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46Oml0ZXJhdG9yIG1pdDsKKyAgICBmb3IgKG1pdCA9IG1hcC5iZWdpbigpOyBtaXQgIT0gbWFwLmVuZCgpOyArK21pdCkgeworICAgICAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7CisgICAgICBmX2pzb25fIDw8IGluZGVudCgpOworICAgICAgLy8gSlNPTiBvYmplY3RzIG9ubHkgYWxsb3cgc3RyaW5nIGtleXMKKyAgICAgIHdyaXRlX2NvbnN0X3ZhbHVlKG1pdC0+Zmlyc3QsIEZPUkNFX1NUUklORyk7CisgICAgICBmX2pzb25fIDw8ICI6ICI7CisgICAgICB3cml0ZV9jb25zdF92YWx1ZShtaXQtPnNlY29uZCk7CisgICAgICBpbmRpY2F0ZV9jb21tYV9uZWVkZWQoKTsKKyAgICB9CisgICAgZW5kX29iamVjdCgpOworICAgIGJyZWFrOworICB9CisKKyAgZGVmYXVsdDoKKyAgICBmX2pzb25fIDw8ICJudWxsIjsKKyAgICBicmVhazsKKyAgfQorfQorCitzdHJpbmcgdF9qc29uX2dlbmVyYXRvcjo6anNvbl9zdHIoY29uc3Qgc3RyaW5nJiBzdHIpIHsKKyAgcmV0dXJuIHF1b3QgKyBlc2NhcGVfanNvbl9zdHJpbmcoc3RyKSArIHF1b3Q7Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RhbnQodF9jb25zdCogY29uKSB7CisgIHN0YXJ0X29iamVjdCgpOworCisgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJuYW1lIiwgY29uLT5nZXRfbmFtZSgpKTsKKyAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoInR5cGVJZCIsIGdldF90eXBlX25hbWUoY29uLT5nZXRfdHlwZSgpKSk7CisgIHdyaXRlX3R5cGVfc3BlY19vYmplY3QoInR5cGUiLCBjb24tPmdldF90eXBlKCkpOworCisgIGlmIChjb24tPmhhc19kb2MoKSkgeworICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJkb2MiLCBjb24tPmdldF9kb2MoKSk7CisgIH0KKworICB3cml0ZV9rZXlfYW5kKCJ2YWx1ZSIpOworICB3cml0ZV9jb25zdF92YWx1ZShjb24tPmdldF92YWx1ZSgpKTsKKworICBlbmRfb2JqZWN0KCk7Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIHN0YXJ0X29iamVjdCgpOworCisgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJuYW1lIiwgdGVudW0tPmdldF9uYW1lKCkpOworCisgIGlmICh0ZW51bS0+aGFzX2RvYygpKSB7CisgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoImRvYyIsIHRlbnVtLT5nZXRfZG9jKCkpOworICB9CisKKyAgaWYgKHRlbnVtLT5hbm5vdGF0aW9uc18uc2l6ZSgpID4gMCkgeworICAgICAgd3JpdGVfa2V5X2FuZCgiYW5ub3RhdGlvbnMiKTsKKyAgICAgIHN0YXJ0X29iamVjdCgpOworICAgICAgZm9yIChtYXA8c3RyaW5nLCBzdHJpbmc+OjppdGVyYXRvciBpdCA9IHRlbnVtLT5hbm5vdGF0aW9uc18uYmVnaW4oKTsgaXQgIT0gdGVudW0tPmFubm90YXRpb25zXy5lbmQoKTsgKytpdCkgeworICAgICAgICB3cml0ZV9rZXlfYW5kX3N0cmluZyhpdC0+Zmlyc3QsIGl0LT5zZWNvbmQpOworICAgICAgfQorICAgICAgZW5kX29iamVjdCgpOworICB9CisKKyAgd3JpdGVfa2V5X2FuZCgibWVtYmVycyIpOworICBzdGFydF9hcnJheSgpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gdmFsdWVzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciB2YWxfaXRlcjsKKyAgZm9yICh2YWxfaXRlciA9IHZhbHVlcy5iZWdpbigpOyB2YWxfaXRlciAhPSB2YWx1ZXMuZW5kKCk7ICsrdmFsX2l0ZXIpIHsKKyAgICB3cml0ZV9jb21tYV9pZl9uZWVkZWQoKTsKKyAgICB0X2VudW1fdmFsdWUqIHZhbCA9ICgqdmFsX2l0ZXIpOworICAgIHN0YXJ0X29iamVjdCgpOworICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJuYW1lIiwgdmFsLT5nZXRfbmFtZSgpKTsKKyAgICB3cml0ZV9rZXlfYW5kX2ludGVnZXIoInZhbHVlIiwgdmFsLT5nZXRfdmFsdWUoKSk7CisgICAgaWYgKHZhbC0+aGFzX2RvYygpKSB7CisgICAgICB3cml0ZV9rZXlfYW5kX3N0cmluZygiZG9jIiwgdmFsLT5nZXRfZG9jKCkpOworICAgIH0KKyAgICBlbmRfb2JqZWN0KCk7CisgICAgaW5kaWNhdGVfY29tbWFfbmVlZGVkKCk7CisgIH0KKyAgZW5kX2FycmF5KCk7CisKKyAgZW5kX29iamVjdCgpOworfQorCit2b2lkIHRfanNvbl9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdGFydF9vYmplY3QoKTsKKworICB3cml0ZV9rZXlfYW5kX3N0cmluZygibmFtZSIsIHRzdHJ1Y3QtPmdldF9uYW1lKCkpOworCisgIGlmICh0c3RydWN0LT5oYXNfZG9jKCkpIHsKKyAgICB3cml0ZV9rZXlfYW5kX3N0cmluZygiZG9jIiwgdHN0cnVjdC0+Z2V0X2RvYygpKTsKKyAgfQorCisgIGlmICh0c3RydWN0LT5hbm5vdGF0aW9uc18uc2l6ZSgpID4gMCkgeworICAgIHdyaXRlX2tleV9hbmQoImFubm90YXRpb25zIik7CisgICAgc3RhcnRfb2JqZWN0KCk7CisgICAgZm9yIChtYXA8c3RyaW5nLCBzdHJpbmc+OjppdGVyYXRvciBpdCA9IHRzdHJ1Y3QtPmFubm90YXRpb25zXy5iZWdpbigpOyBpdCAhPSB0c3RydWN0LT5hbm5vdGF0aW9uc18uZW5kKCk7ICsraXQpIHsKKyAgICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKGl0LT5maXJzdCwgaXQtPnNlY29uZCk7CisgICAgfQorICAgIGVuZF9vYmplY3QoKTsKKyAgfQorCisgIHdyaXRlX2tleV9hbmRfYm9vbCgiaXNFeGNlcHRpb24iLCB0c3RydWN0LT5pc194Y2VwdGlvbigpKTsKKworICB3cml0ZV9rZXlfYW5kX2Jvb2woImlzVW5pb24iLCB0c3RydWN0LT5pc191bmlvbigpKTsKKworICB3cml0ZV9rZXlfYW5kKCJmaWVsZHMiKTsKKyAgc3RhcnRfYXJyYXkoKTsKKyAgdmVjdG9yPHRfZmllbGQqPiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgbWVtX2l0ZXI7CisgIGZvciAobWVtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1lbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7IG1lbV9pdGVyKyspIHsKKyAgICB3cml0ZV9jb21tYV9pZl9uZWVkZWQoKTsKKyAgICBnZW5lcmF0ZV9maWVsZCgqbWVtX2l0ZXIpOworICAgIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOworICB9CisgIGVuZF9hcnJheSgpOworCisgIGVuZF9vYmplY3QoKTsKK30KKwordm9pZCB0X2pzb25fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RhcnRfb2JqZWN0KCk7CisKKyAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoIm5hbWUiLCBnZXRfcXVhbGlmaWVkX25hbWUodHNlcnZpY2UpKTsKKworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpIHsKKyAgICB3cml0ZV9rZXlfYW5kX3N0cmluZygiZXh0ZW5kcyIsIGdldF9xdWFsaWZpZWRfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSkpOworICB9CisKKyAgaWYgKHRzZXJ2aWNlLT5oYXNfZG9jKCkpIHsKKyAgICB3cml0ZV9rZXlfYW5kX3N0cmluZygiZG9jIiwgdHNlcnZpY2UtPmdldF9kb2MoKSk7CisgIH0KKworICBpZiAodHNlcnZpY2UtPmFubm90YXRpb25zXy5zaXplKCkgPiAwKSB7CisgICAgd3JpdGVfa2V5X2FuZCgiYW5ub3RhdGlvbnMiKTsKKyAgICBzdGFydF9vYmplY3QoKTsKKyAgICBmb3IgKG1hcDxzdHJpbmcsIHN0cmluZz46Oml0ZXJhdG9yIGl0ID0gdHNlcnZpY2UtPmFubm90YXRpb25zXy5iZWdpbigpOyBpdCAhPSB0c2VydmljZS0+YW5ub3RhdGlvbnNfLmVuZCgpOyArK2l0KSB7CisgICAgICB3cml0ZV9rZXlfYW5kX3N0cmluZyhpdC0+Zmlyc3QsIGl0LT5zZWNvbmQpOworICAgIH0KKyAgICBlbmRfb2JqZWN0KCk7CisgIH0KKworICB3cml0ZV9rZXlfYW5kKCJmdW5jdGlvbnMiKTsKKyAgc3RhcnRfYXJyYXkoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmbl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7CisgIGZvciAoOyBmbl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgZm5faXRlcisrKSB7CisgICAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7CisgICAgZ2VuZXJhdGVfZnVuY3Rpb24oKmZuX2l0ZXIpOworICAgIGluZGljYXRlX2NvbW1hX25lZWRlZCgpOworICB9CisgIGVuZF9hcnJheSgpOworCisgIGVuZF9vYmplY3QoKTsKK30KKwordm9pZCB0X2pzb25fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mdW5jdGlvbih0X2Z1bmN0aW9uKiB0ZnVuYykgeworICBzdGFydF9vYmplY3QoKTsKKworICB3cml0ZV9rZXlfYW5kX3N0cmluZygibmFtZSIsIHRmdW5jLT5nZXRfbmFtZSgpKTsKKworICB3cml0ZV9rZXlfYW5kX3N0cmluZygicmV0dXJuVHlwZUlkIiwgZ2V0X3R5cGVfbmFtZSh0ZnVuYy0+Z2V0X3JldHVybnR5cGUoKSkpOworICB3cml0ZV90eXBlX3NwZWNfb2JqZWN0KCJyZXR1cm5UeXBlIiwgdGZ1bmMtPmdldF9yZXR1cm50eXBlKCkpOworCisgIHdyaXRlX2tleV9hbmRfYm9vbCgib25ld2F5IiwgdGZ1bmMtPmlzX29uZXdheSgpKTsKKworICBpZiAodGZ1bmMtPmhhc19kb2MoKSkgeworICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJkb2MiLCB0ZnVuYy0+Z2V0X2RvYygpKTsKKyAgfQorCisgIGlmICh0ZnVuYy0+YW5ub3RhdGlvbnNfLnNpemUoKSA+IDApIHsKKyAgICB3cml0ZV9rZXlfYW5kKCJhbm5vdGF0aW9ucyIpOworICAgIHN0YXJ0X29iamVjdCgpOworICAgIGZvciAobWFwPHN0cmluZywgc3RyaW5nPjo6aXRlcmF0b3IgaXQgPSB0ZnVuYy0+YW5ub3RhdGlvbnNfLmJlZ2luKCk7IGl0ICE9IHRmdW5jLT5hbm5vdGF0aW9uc18uZW5kKCk7ICsraXQpIHsKKyAgICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKGl0LT5maXJzdCwgaXQtPnNlY29uZCk7CisgICAgfQorICAgIGVuZF9vYmplY3QoKTsKKyAgfQorCisgIHdyaXRlX2tleV9hbmQoImFyZ3VtZW50cyIpOworICBzdGFydF9hcnJheSgpOworICB2ZWN0b3I8dF9maWVsZCo+IG1lbWJlcnMgPSB0ZnVuYy0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgbWVtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7CisgIGZvciAoOyBtZW1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyBtZW1faXRlcisrKSB7CisgICAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7CisgICAgZ2VuZXJhdGVfZmllbGQoKm1lbV9pdGVyKTsKKyAgICBpbmRpY2F0ZV9jb21tYV9uZWVkZWQoKTsKKyAgfQorICBlbmRfYXJyYXkoKTsKKworICB3cml0ZV9rZXlfYW5kKCJleGNlcHRpb25zIik7CisgIHN0YXJ0X2FycmF5KCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj4gZXhjZXB0cyA9IHRmdW5jLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIGV4X2l0ZXIgPSBleGNlcHRzLmJlZ2luKCk7CisgIGZvciAoOyBleF9pdGVyICE9IGV4Y2VwdHMuZW5kKCk7IGV4X2l0ZXIrKykgeworICAgIHdyaXRlX2NvbW1hX2lmX25lZWRlZCgpOworICAgIGdlbmVyYXRlX2ZpZWxkKCpleF9pdGVyKTsKKyAgICBpbmRpY2F0ZV9jb21tYV9uZWVkZWQoKTsKKyAgfQorICBlbmRfYXJyYXkoKTsKKworICBlbmRfb2JqZWN0KCk7Cit9CisKK3ZvaWQgdF9qc29uX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGQodF9maWVsZCogZmllbGQpIHsKKyAgc3RhcnRfb2JqZWN0KCk7CisKKyAgd3JpdGVfa2V5X2FuZF9pbnRlZ2VyKCJrZXkiLCBmaWVsZC0+Z2V0X2tleSgpKTsKKyAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoIm5hbWUiLCBmaWVsZC0+Z2V0X25hbWUoKSk7CisgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJ0eXBlSWQiLCBnZXRfdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpKSk7CisgIHdyaXRlX3R5cGVfc3BlY19vYmplY3QoInR5cGUiLCBmaWVsZC0+Z2V0X3R5cGUoKSk7CisKKyAgaWYgKGZpZWxkLT5oYXNfZG9jKCkpIHsKKyAgICB3cml0ZV9rZXlfYW5kX3N0cmluZygiZG9jIiwgZmllbGQtPmdldF9kb2MoKSk7CisgIH0KKworICBpZiAoZmllbGQtPmFubm90YXRpb25zXy5zaXplKCkgPiAwKSB7CisgICAgd3JpdGVfa2V5X2FuZCgiYW5ub3RhdGlvbnMiKTsKKyAgICBzdGFydF9vYmplY3QoKTsKKyAgICBmb3IgKG1hcDxzdHJpbmcsIHN0cmluZz46Oml0ZXJhdG9yIGl0ID0gZmllbGQtPmFubm90YXRpb25zXy5iZWdpbigpOyBpdCAhPSBmaWVsZC0+YW5ub3RhdGlvbnNfLmVuZCgpOyArK2l0KSB7CisgICAgICB3cml0ZV9rZXlfYW5kX3N0cmluZyhpdC0+Zmlyc3QsIGl0LT5zZWNvbmQpOworICAgIH0KKyAgICBlbmRfb2JqZWN0KCk7CisgIH0KKworICB3cml0ZV9rZXlfYW5kKCJyZXF1aXJlZCIpOworICBzd2l0Y2ggKGZpZWxkLT5nZXRfcmVxKCkpIHsKKyAgY2FzZSB0X2ZpZWxkOjpUX1JFUVVJUkVEOgorICAgIHdyaXRlX3N0cmluZygicmVxdWlyZWQiKTsKKyAgICBicmVhazsKKyAgY2FzZSB0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUOgorICAgIHdyaXRlX3N0cmluZygicmVxX291dCIpOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIHdyaXRlX3N0cmluZygib3B0aW9uYWwiKTsKKyAgICBicmVhazsKKyAgfQorCisgIGlmIChmaWVsZC0+Z2V0X3ZhbHVlKCkpIHsKKyAgICB3cml0ZV9rZXlfYW5kKCJkZWZhdWx0Iik7CisgICAgd3JpdGVfY29uc3RfdmFsdWUoZmllbGQtPmdldF92YWx1ZSgpKTsKKyAgfQorCisgIGVuZF9vYmplY3QoKTsKK30KKworc3RyaW5nIHRfanNvbl9nZW5lcmF0b3I6OmdldF90eXBlX25hbWUodF90eXBlKiB0dHlwZSkgeworICB0dHlwZSA9IHR0eXBlLT5nZXRfdHJ1ZV90eXBlKCk7CisgIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJsaXN0IjsKKyAgfQorICBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJzZXQiOworICB9CisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIm1hcCI7CisgIH0KKyAgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gImkzMiI7CisgIH0KKyAgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSkgeworICAgIHJldHVybiAoKHRfc3RydWN0Kil0dHlwZSktPmlzX3VuaW9uKCkgPyAidW5pb24iIDogInN0cnVjdCI7CisgIH0KKyAgaWYgKHR0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJleGNlcHRpb24iOworICB9CisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZSogdGJhc2V0eXBlID0gKHRfYmFzZV90eXBlKil0dHlwZTsKKyAgICByZXR1cm4gdGJhc2V0eXBlLT5pc19iaW5hcnkoKSA/ICJiaW5hcnkiIDogdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNldHlwZS0+Z2V0X2Jhc2UoKSk7CisgIH0KKworICByZXR1cm4gIih1bmtub3duKSI7Cit9CisKK3N0cmluZyB0X2pzb25fZ2VuZXJhdG9yOjpnZXRfcXVhbGlmaWVkX25hbWUodF90eXBlKiB0dHlwZSkgeworICBpZiAoc2hvdWxkX21lcmdlX2luY2x1ZGVzXyB8fCB0dHlwZS0+Z2V0X3Byb2dyYW0oKSA9PSBwcm9ncmFtXykgeworICAgIHJldHVybiB0dHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorICByZXR1cm4gdHR5cGUtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lKCkgKyAiLiIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKK30KKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihqc29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiSlNPTiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgbWVyZ2U6ICAgICAgICAgICBHZW5lcmF0ZSBvdXRwdXQgd2l0aCBpbmNsdWRlZCBmaWxlcyBtZXJnZWRcbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2x1YV9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2x1YV9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRlZTg5NgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfbHVhX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDExMzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6dmVjdG9yOwordXNpbmcgc3RkOjptYXA7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworLyoqCisgKiBMVUEgY29kZSBnZW5lcmF0b3IuCisgKgorICovCitjbGFzcyB0X2x1YV9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9sdWFfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIGdlbl9yZXF1aXJlc18gPSB0cnVlOworICAgIGZvciggaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgeworICAgICAgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoIm9taXRfcmVxdWlyZXMiKSA9PSAwKSB7CisgICAgICAgIGdlbl9yZXF1aXJlc18gPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBsdWE6IiArIGl0ZXItPmZpcnN0OworICAgICAgfQorICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWx1YSI7CisgIH0KKworICAvKioKKyAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcworICAgKi8KKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisKK3ByaXZhdGU6CisgIC8qKgorICAgKiBUcnVlIGlmZiB3ZSBzaG91bGQgZ2VuZXJhdGUgbHVhIHJlcXVpcmUgc3RhdGVtZW50cy4KKyAgICovCisgIGJvb2wgZ2VuX3JlcXVpcmVzXzsKKworICAvKioKKyAgICogU3RydWN0LWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworICB2b2lkIGdlbmVyYXRlX2x1YV9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfbHVhX3N0cnVjdF9yZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9sdWFfc3RydWN0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIC8qKgorICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZShzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3Ioc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24oc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgLyoqCisgICAqIERlc2VyaWFsaXphdGlvbiAoUmVhZCkKKyAgICovCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbG9jYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsb2NhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGxvY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgLyoqCisgICAqIFNlcmlhbGl6YXRpb24gKFdyaXRlKQorICAgKi8KKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGtpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2aXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0bWFwLCBzdGQ6OnN0cmluZyBpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIC8qKgorICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucworICAgKi8KKyAgc3RkOjpzdHJpbmcgbHVhX2luY2x1ZGVzKCk7CisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7CisgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXRfbmFtZXNwYWNlKGNvbnN0IHRfcHJvZ3JhbSogcHJvZ3JhbSk7CisKKyAgc3RkOjpzdHJpbmcgYXV0b2dlbl9jb21tZW50KCkgeworICAgIHJldHVybiBzdGQ6OnN0cmluZygiLS1cbiIpICsgIi0tIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0XG4iICsgIi0tXG4iCisgICAgICAgICAgICsgIi0tIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkdcbiIgKyAiLS0gQCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnZW5lcmF0ZWRcbiIKKyAgICAgICAgICAgKyAiLS1cbiI7CisgIH0KKworICAvKioKKyAgICogRmlsZSBzdHJlYW1zCisgICAqLworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfdHlwZXNfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfY29uc3RzXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2VfOworfTsKKworLyoqCisgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCisgKi8KK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5CisgIHN0cmluZyBvdXRkaXIgPSBnZXRfb3V0X2RpcigpOworICBNS0RJUihvdXRkaXIuY19zdHIoKSk7CisKKyAgLy8gTWFrZSBvdXRwdXQgZmlsZXMKKyAgc3RyaW5nIGN1cl9uYW1lc3BhY2UgPSBnZXRfbmFtZXNwYWNlKHByb2dyYW1fKTsKKyAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBvdXRkaXIgKyBjdXJfbmFtZXNwYWNlICsgImNvbnN0YW50cy5sdWEiOworICBmX2NvbnN0c18ub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOworICBzdHJpbmcgZl90eXBlc19uYW1lID0gb3V0ZGlyICsgY3VyX25hbWVzcGFjZSArICJ0dHlwZXMubHVhIjsKKyAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7CisKKyAgLy8gQWRkIGhlYWRlcnMKKyAgZl9jb25zdHNfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGx1YV9pbmNsdWRlcygpOworICBmX3R5cGVzXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBsdWFfaW5jbHVkZXMoKTsKKyAgaWYgKGdlbl9yZXF1aXJlc18pIHsKKyAgICBmX3R5cGVzXyA8PCBlbmRsIDw8ICJyZXF1aXJlICciIDw8IGN1cl9uYW1lc3BhY2UgPDwgImNvbnN0YW50cyciOworICB9Cit9CisKK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7CisgIC8vIENsb3NlIHR5cGVzIGZpbGUKKyAgZl90eXBlc18uY2xvc2UoKTsKKyAgZl9jb25zdHNfLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGUgYSB0eXBlZGVmIChlc3NlbnRpYWxseSBhIGNvbnN0YW50KQorICovCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgIGZfdHlwZXNfIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCB0dHlwZWRlZi0+Z2V0X3N5bWJvbGljKCkgPDwgIiA9ICIKKyAgICAgICAgICAgPDwgdHR5cGVkZWYtPmdldF90eXBlKCktPmdldF9uYW1lKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZSAodGFibGUpCisgKi8KK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgZl90eXBlc18gPDwgZW5kbCA8PCBlbmRsIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICIgPSB7IiA8PCBlbmRsOworCisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTspIHsKKyAgICBpbnQzMl90IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKworICAgIGZfdHlwZXNfIDw8ICIgICIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8IHZhbHVlOworICAgICsrY19pdGVyOworICAgIGlmIChjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpKSB7CisgICAgICBmX3R5cGVzXyA8PCAiLCI7CisgICAgfQorICAgIGZfdHlwZXNfIDw8IGVuZGw7CisgIH0KKyAgZl90eXBlc18gPDwgIn0iOworfQorCisvKioKKyAqIEdlbmVyYXRlIGEgY29uc3RhbnQgKG5vbi1sb2NhbCkgdmFsdWUKKyAqLwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgeworICB0X3R5cGUqIHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7CisgIHN0cmluZyBuYW1lID0gdGNvbnN0LT5nZXRfbmFtZSgpOworICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IHRjb25zdC0+Z2V0X3ZhbHVlKCk7CisKKyAgZl9jb25zdHNfIDw8IGVuZGwgPDwgZW5kbCA8PCBuYW1lIDw8ICIgPSAiOworICBmX2NvbnN0c18gPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlKTsKK30KKworLyoqCisgKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4KKyAqLworc3RyaW5nIHRfbHVhX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIG91dCA8PCAiJyIgPDwgdmFsdWUtPmdldF9zdHJpbmcoKSA8PCAiJyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBvdXQgPDwgKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgb3V0IDw8ICJsdWFsb25nbnVtYmVyLm5ldygnIiA8PCB2YWx1ZS0+Z2V0X3N0cmluZygpIDw8ICInKSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIG91dCA8PCB0eXBlLT5nZXRfbmFtZSgpIDw8ICIgPSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTspIHsKKyAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIH0KKworICAgICAgaW5kZW50KG91dCk7CisgICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGdfdHlwZV9zdHJpbmcsIHZfaXRlci0+Zmlyc3QpOworICAgICAgb3V0IDw8ICIgPSAiOworICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICArK3ZfaXRlcjsKKyAgICAgIGlmICh2X2l0ZXIgIT0gdmFsLmVuZCgpKSB7CisgICAgICAgIG91dCA8PCAiLCI7CisgICAgICB9CisgICAgfQorCisgICAgb3V0IDw8ICJ9IjsKKyAgICBpbmRlbnRfZG93bigpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgb3V0IDw8IHR5cGUtPmdldF9uYW1lKCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7KSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiWyIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGt0eXBlLCB2X2l0ZXItPmZpcnN0KQorICAgICAgICAgICAgICAgICAgPDwgIl0gPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgKyt2X2l0ZXI7CisgICAgICBpZiAodl9pdGVyICE9IHZhbC5lbmQoKSkgeworICAgICAgICBvdXQgPDwgIiwiOworICAgICAgfQorICAgICAgb3V0IDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogZXR5cGU7CisgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0KKyAgICBvdXQgPDwgdHlwZS0+Z2V0X25hbWUoKSA8PCAiID0geyIgPDwgZW5kbDsKKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTspIHsKKyAgICAgIGluZGVudChvdXQpOworICAgICAgb3V0IDw8ICJbIiA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpIDw8ICJdIjsKKyAgICAgIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgICAgICBvdXQgPDwgIiA9IHRydWUiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8ICIgPSBmYWxzZSI7CisgICAgICB9CisgICAgICArK3ZfaXRlcjsKKyAgICAgIGlmICh2X2l0ZXIgIT0gdmFsLmVuZCgpKSB7CisgICAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgICAgb3V0IDw8ICJ9IjsKKyAgfQorICByZXR1cm4gb3V0LnN0cigpOworfQorCisvKioKKyAqIEdlbmVyYXRlIGEgdGhyaWZ0IHN0cnVjdAorICovCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGdlbmVyYXRlX2x1YV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3R5cGVzXywgdHN0cnVjdCwgZmFsc2UpOworfQorCisvKioKKyAqIEdlbmVyYXRlIGEgdGhyaWZ0IGV4Y2VwdGlvbgorICovCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9sdWFfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHR4Y2VwdGlvbiwgdHJ1ZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGUgYSB0aHJpZnQgc3RydWN0IG9yIGV4Y2VwdGlvbiAobHVhIHRhYmxlKQorICovCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbHVhX3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisKKyAgaW5kZW50KG91dCkgPDwgZW5kbCA8PCBlbmRsIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBvdXQgPDwgIiA9IFRFeGNlcHRpb246bmV3eyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBfX3R5cGUgPSAnIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICInIjsKKyAgICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgICBvdXQgPDwgIiwiOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgIiA9IF9fVE9iamVjdDpuZXd7IiA8PCBlbmRsOworICB9CisgIGluZGVudF91cCgpOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7KSB7CisgICAgaW5kZW50KG91dCk7CisgICAgb3V0IDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICArK21faXRlcjsKKyAgICBpZiAobV9pdGVyICE9IG1lbWJlcnMuZW5kKCkpIHsKKyAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCk7CisgIG91dCA8PCBlbmRsIDw8ICJ9IjsKKworICBnZW5lcmF0ZV9sdWFfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9sdWFfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOworfQorCisvKioKKyAqIEdlbmVyYXRlIGEgc3RydWN0L2V4Y2VwdGlvbiByZWFkZXIKKyAqLwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2x1YV9zdHJ1Y3RfcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIC8vIGZ1bmN0aW9uCisgIGluZGVudChvdXQpIDw8IGVuZGwgPDwgZW5kbCA8PCAiZnVuY3Rpb24gIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI6cmVhZChpcHJvdCkiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpIDw8ICJpcHJvdDpyZWFkU3RydWN0QmVnaW4oKSIgPDwgZW5kbDsKKworICAvLyB3aGlsZTogUmVhZCBpbiBmaWVsZHMKKyAgaW5kZW50KG91dCkgPDwgIndoaWxlIHRydWUgZG8iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIC8vIGlmOiBDaGVjayB3aGF0IHRvIHJlYWQKKyAgaW5kZW50KG91dCkgPDwgImxvY2FsIGZuYW1lLCBmdHlwZSwgZmlkID0gaXByb3Q6cmVhZEZpZWxkQmVnaW4oKSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImlmIGZ0eXBlID09IFRUeXBlLlNUT1AgdGhlbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJicmVhayIgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgImVsc2VpZiBmaWQgPT0gIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiIHRoZW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgImlmIGZ0eXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiB0aGVuIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgLy8gUmVhZCBmaWVsZCBjb250ZW50cworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgZmFsc2UsICJzZWxmLiIpOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZWxzZSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiICBpcHJvdDpza2lwKGZ0eXBlKSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOworICB9CisKKyAgLy8gZW5kIGlmCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJlbHNlIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiICBpcHJvdDpza2lwKGZ0eXBlKSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImlwcm90OnJlYWRGaWVsZEVuZCgpIiA8PCBlbmRsOworCisgIC8vIGVuZCB3aGlsZQorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiaXByb3Q6cmVhZFN0cnVjdEVuZCgpIiA8PCBlbmRsOworCisgIC8vIGVuZCBmdW5jdGlvbgorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KTsKKyAgb3V0IDw8ICJlbmQiOworfQorCisvKioKKyAqIEdlbmVyYXRlIGEgc3RydWN0L2V4Y2VwdGlvbiB3cml0ZXIKKyAqLwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2x1YV9zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIC8vIGZ1bmN0aW9uCisgIGluZGVudChvdXQpIDw8IGVuZGwgPDwgZW5kbCA8PCAiZnVuY3Rpb24gIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI6d3JpdGUob3Byb3QpIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCAib3Byb3Q6d3JpdGVTdHJ1Y3RCZWdpbignIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICInKSIgPDwgZW5kbDsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAvLyBUbyBjaGVjayBlbGVtZW50IG9mIHNlbGYgd2hldGhlciBuaWwgb3Igbm90LgorICAgIC8vIGF2b2lkIHRoZSB2YWx1ZShmYWxzZSkgb2YgQk9PTCBpcyBsb3N0LgorICAgIGluZGVudChvdXQpIDw8ICJpZiBzZWxmLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgfj0gbmlsIHRoZW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90OndyaXRlRmllbGRCZWdpbignIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicsICIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpIgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJzZWxmLiIpOworCisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90OndyaXRlRmllbGRFbmQoKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50KG91dCkgPDwgIm9wcm90OndyaXRlRmllbGRTdG9wKCkiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJvcHJvdDp3cml0ZVN0cnVjdEVuZCgpIiA8PCBlbmRsOworCisgIC8vIGVuZCBmdW5jdGlvbgorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KTsKKyAgb3V0IDw8ICJlbmQiOworfQorCisvKioKKyAqIEdlbmVyYXRlIGEgdGhyaWZ0IHNlcnZpY2UKKyAqLwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICAvLyBHZXQgb3V0cHV0IGRpcmVjdG9yeQorICBzdHJpbmcgb3V0ZGlyID0gZ2V0X291dF9kaXIoKTsKKworICAvLyBPcGVuIHRoZSBmaWxlIGZvciB3cml0aW5nCisgIHN0cmluZyBjdXJfbnMgPSBnZXRfbmFtZXNwYWNlKHByb2dyYW1fKTsKKyAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gb3V0ZGlyICsgY3VyX25zICsgdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiLmx1YSI7CisgIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKKworICAvLyBIZWFkZXJzCisgIGZfc2VydmljZV8gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgbHVhX2luY2x1ZGVzKCk7CisgIGlmIChnZW5fcmVxdWlyZXNfKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8ICJyZXF1aXJlICciIDw8IGN1cl9ucyA8PCAidHR5cGVzJyIgPDwgZW5kbDsKKworICAgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICJyZXF1aXJlICciIDw8IGdldF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9wcm9ncmFtKCkpCisgICAgICAgICAgICAgICAgIDw8IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpIDw8ICInIiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudChmX3NlcnZpY2VfLCB0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnMoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOworCisgIC8vIENsb3NlIHRoZSBmaWxlCisgIGZfc2VydmljZV8uY2xvc2UoKTsKK30KKwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgY2xhc3NuYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiSWZhY2UiOworICB0X3NlcnZpY2UqIGV4dGVuZHNfcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworCisgIC8vIEludGVyZmFjZSBvYmplY3QgZGVmaW5pdGlvbgorICBvdXQgPDwgY2xhc3NuYW1lIDw8ICIgPSAiOworICBpZiAoZXh0ZW5kc19zKSB7CisgICAgb3V0IDw8IGV4dGVuZHNfcy0+Z2V0X25hbWUoKSA8PCAiSWZhY2U6bmV3eyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgIl9fVE9iamVjdDpuZXd7IiA8PCBlbmRsOworICB9CisgIG91dCA8PCAiICBfX3R5cGUgPSAnIiA8PCBjbGFzc25hbWUgPDwgIiciIDw8IGVuZGwgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgY2xhc3NuYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiQ2xpZW50IjsKKyAgdF9zZXJ2aWNlKiBleHRlbmRzX3MgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKworICAvLyBDbGllbnQgb2JqZWN0IGRlZmluaXRpb24KKyAgb3V0IDw8IGNsYXNzbmFtZSA8PCAiID0gX19UT2JqZWN0Lm5ldygiOworICBpZiAoZXh0ZW5kc19zICE9IE5VTEwpIHsKKyAgICBvdXQgPDwgZXh0ZW5kc19zLT5nZXRfbmFtZSgpIDw8ICJDbGllbnQiOworICB9IGVsc2UgeworICAgIG91dCA8PCAiX19UQ2xpZW50IjsKKyAgfQorICBvdXQgPDwgIiwgeyIgPDwgZW5kbCA8PCAiICBfX3R5cGUgPSAnIiA8PCBjbGFzc25hbWUgPDwgIiciIDw8IGVuZGwgPDwgIn0pIiA8PCBlbmRsOworCisgIC8vIFNlbmQvUmVjdiBmdW5jdGlvbnMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyaW5nIHNpZyA9IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKTsKKyAgICBzdHJpbmcgZnVuY25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisKKyAgICAvLyBXcmFwcGVyIGZ1bmN0aW9uCisgICAgaW5kZW50KG91dCkgPDwgZW5kbCA8PCAiZnVuY3Rpb24gIiA8PCBjbGFzc25hbWUgPDwgIjoiIDw8IHNpZyA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgaW5kZW50KG91dCkgPDwgInNlbGY6c2VuZF8iIDw8IHNpZyA8PCBlbmRsIDw8IGluZGVudCgpOworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBvdXQgPDwgInJldHVybiAiOworICAgICAgfQorICAgICAgb3V0IDw8ICJzZWxmOnJlY3ZfIiA8PCBzaWcgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGw7CisKKyAgICAvLyBTZW5kIGZ1bmN0aW9uCisgICAgaW5kZW50KG91dCkgPDwgZW5kbCA8PCAiZnVuY3Rpb24gIiA8PCBjbGFzc25hbWUgPDwgIjpzZW5kXyIgPDwgc2lnIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBpbmRlbnQob3V0KSA8PCAic2VsZi5vcHJvdDp3cml0ZU1lc3NhZ2VCZWdpbignIiA8PCBmdW5jbmFtZSA8PCAiJywgIgorICAgICAgICAgICAgICAgIDw8ICgoKmZfaXRlciktPmlzX29uZXdheSgpID8gIlRNZXNzYWdlVHlwZS5PTkVXQVkiIDogIlRNZXNzYWdlVHlwZS5DQUxMIikKKyAgICAgICAgICAgICAgICA8PCAiLCBzZWxmLl9zZXFpZCkiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgImxvY2FsIGFyZ3MgPSAiIDw8IGZ1bmNuYW1lIDw8ICJfYXJnczpuZXd7fSIgPDwgZW5kbDsKKworICAgIC8vIFNldCB0aGUgYXJncworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGFyZ3MgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisgICAgZm9yIChmbGRfaXRlciA9IGFyZ3MuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gYXJncy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgc3RkOjpzdHJpbmcgYXJnbmFtZSA9ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgaW5kZW50KG91dCkgPDwgImFyZ3MuIiA8PCBhcmduYW1lIDw8ICIgPSAiIDw8IGFyZ25hbWUgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnQob3V0KSA8PCAiYXJnczp3cml0ZShzZWxmLm9wcm90KSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAic2VsZi5vcHJvdDp3cml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAic2VsZi5vcHJvdC50cmFuczpmbHVzaCgpIiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOworCisgICAgLy8gUmVjdiBmdW5jdGlvbgorICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgZW5kbCA8PCAiZnVuY3Rpb24gIiA8PCBjbGFzc25hbWUgPDwgIjpyZWN2XyIgPDwgc2lnIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJsb2NhbCBmbmFtZSwgbXR5cGUsIHJzZXFpZCA9IHNlbGYuaXByb3Q6IgorICAgICAgICAgIDw8ICJyZWFkTWVzc2FnZUJlZ2luKCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmIG10eXBlID09IFRNZXNzYWdlVHlwZS5FWENFUFRJT04gdGhlbiIKKyAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIGxvY2FsIHggPSBUQXBwbGljYXRpb25FeGNlcHRpb246bmV3e30iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAiICB4OnJlYWQoc2VsZi5pcHJvdCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgc2VsZi5pcHJvdDpyZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgZXJyb3IoeCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgIDw8ICJsb2NhbCByZXN1bHQgPSAiIDw8IGZ1bmNuYW1lIDw8ICJfcmVzdWx0Om5ld3t9IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgInJlc3VsdDpyZWFkKHNlbGYuaXByb3QpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJzZWxmLmlwcm90OnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGw7CisKKyAgICAgIC8vIFJldHVybiB0aGUgcmVzdWx0IGlmIGl0J3Mgbm90IGEgdm9pZCBmdW5jdGlvbgorICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIHJlc3VsdC5zdWNjZXNzIH49IG5pbCB0aGVuIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiByZXN1bHQuc3VjY2VzcyIKKyAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgICAgICAgLy8gVGhyb3cgY3VzdG9tIGV4Y2VwdGlvbnMKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4ZiA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpOworICAgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgICAgIGZvciAoeF9pdGVyID0geGYuYmVnaW4oKTsgeF9pdGVyICE9IHhmLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZWxzZWlmIHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIHRoZW4iIDw8IGVuZGwKKyAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgZXJyb3IocmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsOworICAgICAgICB9CisKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgIDw8ICJlcnJvcihUQXBwbGljYXRpb25FeGNlcHRpb246bmV3e2Vycm9yQ29kZSA9ICIKKyAgICAgICAgICAgIDw8ICJUQXBwbGljYXRpb25FeGNlcHRpb24uTUlTU0lOR19SRVNVTFR9KSIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGw7CisgICAgfQorICB9Cit9CisKK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcihvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGNsYXNzbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIlByb2Nlc3NvciI7CisgIHRfc2VydmljZSogZXh0ZW5kc19zID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisKKyAgLy8gRGVmaW5lIHByb2Nlc3NvciB0YWJsZQorICBvdXQgPDwgZW5kbCA8PCBjbGFzc25hbWUgPDwgIiA9IF9fVE9iamVjdC5uZXcoIjsKKyAgaWYgKGV4dGVuZHNfcyAhPSBOVUxMKSB7CisgICAgb3V0IDw8IGV4dGVuZHNfcy0+Z2V0X25hbWUoKSA8PCAiUHJvY2Vzc29yIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIG91dCA8PCAiX19UUHJvY2Vzc29yIiA8PCBlbmRsOworICB9CisgIG91dCA8PCAiLCB7IiA8PCBlbmRsIDw8ICIgX190eXBlID0gJyIgPDwgY2xhc3NuYW1lIDw8ICInIiA8PCBlbmRsIDw8ICJ9KSIgPDwgZW5kbDsKKworICAvLyBQcm9jZXNzIGZ1bmN0aW9uCisgIGluZGVudChvdXQpIDw8IGVuZGwgPDwgImZ1bmN0aW9uICIgPDwgY2xhc3NuYW1lIDw8ICI6cHJvY2VzcyhpcHJvdCwgb3Byb3QsIHNlcnZlcl9jdHgpIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbmRlbnQob3V0KSA8PCAibG9jYWwgbmFtZSwgbXR5cGUsIHNlcWlkID0gaXByb3Q6cmVhZE1lc3NhZ2VCZWdpbigpIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAibG9jYWwgZnVuY19uYW1lID0gJ3Byb2Nlc3NfJyAuLiBuYW1lIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiaWYgbm90IHNlbGZbZnVuY19uYW1lXSBvciB0dHlwZShzZWxmW2Z1bmNfbmFtZV0pIH49ICdmdW5jdGlvbicgdGhlbiI7CisgIGluZGVudF91cCgpOworICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaXByb3Q6c2tpcChUVHlwZS5TVFJVQ1QpIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiaXByb3Q6cmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieCA9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjpuZXd7IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiICBlcnJvckNvZGUgPSBUQXBwbGljYXRpb25FeGNlcHRpb24uVU5LTk9XTl9NRVRIT0QiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iCisgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdDp3cml0ZU1lc3NhZ2VCZWdpbihuYW1lLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCAiCisgICAgICA8PCAic2VxaWQpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ4OndyaXRlKG9wcm90KSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIm9wcm90OndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC50cmFuczpmbHVzaCgpIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAiZWxzZSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICA8PCAiICBzZWxmW2Z1bmNfbmFtZV0oc2VsZiwgc2VxaWQsIGlwcm90LCBvcHJvdCwgc2VydmVyX2N0eCkiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgPDwgImVuZCIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKG91dCwgdHNlcnZpY2UsICpmX2l0ZXIpOworICB9Cit9CisKK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgc3RyaW5nIGNsYXNzbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIlByb2Nlc3NvciI7CisgIHN0cmluZyBhcmdzbmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyI7CisgIHN0cmluZyByZXN1bHRuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOworICBzdHJpbmcgZm5fbmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKTsKKworICBpbmRlbnQob3V0KSA8PCBlbmRsIDw8ICJmdW5jdGlvbiAiIDw8IGNsYXNzbmFtZSA8PCAiOnByb2Nlc3NfIiA8PCBmbl9uYW1lCisgICAgICAgICAgICAgIDw8ICIoc2VxaWQsIGlwcm90LCBvcHJvdCwgc2VydmVyX2N0eCkiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIC8vIFJlYWQgdGhlIHJlcXVlc3QKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJsb2NhbCBhcmdzID0gIiA8PCBhcmdzbmFtZSA8PCAiOm5ld3t9IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAibG9jYWwgcmVwbHlfdHlwZSA9IFRNZXNzYWdlVHlwZS5SRVBMWSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYXJnczpyZWFkKGlwcm90KSIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgImlwcm90OnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImxvY2FsIHJlc3VsdCA9ICIgPDwgcmVzdWx0bmFtZQorICAgICAgPDwgIjpuZXd7fSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAibG9jYWwgc3RhdHVzLCByZXMgPSBwY2FsbChzZWxmLmhhbmRsZXIuIiA8PCBmbl9uYW1lCisgICAgICA8PCAiLCBzZWxmLmhhbmRsZXIiOworCisgIC8vIFByaW50IGFyZ3VtZW50cworICB0X3N0cnVjdCogYXJncyA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgaWYgKGFyZ3MtPmdldF9tZW1iZXJzKCkuc2l6ZSgpID4gMCkgeworICAgIG91dCA8PCAiLCAiIDw8IGFyZ3VtZW50X2xpc3QoYXJncywgImFyZ3MuIik7CisgIH0KKworICAvLyBDaGVjayBmb3IgZXJyb3JzCisgIG91dCA8PCAiKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgbm90IHN0YXR1cyB0aGVuIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiICByZXBseV90eXBlID0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIiAgcmVzdWx0ID0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uOm5ld3ttZXNzYWdlID0gcmVzfSIgPDwgZW5kbDsKKworICAvLyBIYW5kbGUgY3VzdG9tIGV4Y2VwdGlvbnMKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4ZiA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpOworICBpZiAoeGYuc2l6ZSgpID4gMCkgeworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICBmb3IgKHhfaXRlciA9IHhmLmJlZ2luKCk7IHhfaXRlciAhPSB4Zi5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZWxzZWlmIHR0eXBlKHJlcykgPT0gJyIgPDwgKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpIDw8ICInIHRoZW4iCisgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHJlcyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICAvLyBTZXQgdGhlIHJlc3VsdCBhbmQgd3JpdGUgdGhlIHJlcGx5CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiZWxzZSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICByZXN1bHQuc3VjY2VzcyA9IHJlcyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgImVuZCIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Q6d3JpdGVNZXNzYWdlQmVnaW4oJyIgPDwgZm5fbmFtZSA8PCAiJywgcmVwbHlfdHlwZSwgIgorICAgICAgPDwgInNlcWlkKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0OndyaXRlKG9wcm90KSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIm9wcm90OndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC50cmFuczpmbHVzaCgpIiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGw7Cit9CisKKy8vIFNlcnZpY2UgaGVscGVycwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyhvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgb3V0IDw8IGVuZGwgPDwgIi0tIEhFTFBFUiBGVU5DVElPTlMgQU5EIFNUUlVDVFVSRVMiOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBnZW5lcmF0ZV9sdWFfc3RydWN0X2RlZmluaXRpb24ob3V0LCB0cywgZmFsc2UpOworICAgIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnMob3V0LCAqZl9pdGVyKTsKKyAgfQorfQorCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7CisgICAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKKyAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKKyAgICB9CisKKyAgICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7CisgICAgfQorICAgIGdlbmVyYXRlX2x1YV9zdHJ1Y3RfZGVmaW5pdGlvbihvdXQsICZyZXN1bHQsIGZhbHNlKTsKKyAgfQorfQorCisvKioKKyAqIERlc2VyaWFsaXplIChSZWFkKQorICovCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGxvY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgfQorCisgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBsb2NhbCwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBsb2NhbCwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgKGxvY2FsID8gImxvY2FsICIgOiAiIikgPDwgbmFtZSA8PCAiID0gaXByb3Q6IjsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIG91dCA8PCAicmVhZFN0cmluZygpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAicmVhZEJvb2woKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8ICJyZWFkQnl0ZSgpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJyZWFkSTE2KCkiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgInJlYWRJMzIoKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAicmVhZEk2NCgpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJyZWFkRG91YmxlKCkiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gUEhQIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJyZWFkSTMyKCkiOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKworICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgfQorfQorCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbG9jYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgaW5kZW50KG91dCkgPDwgKGxvY2FsID8gImxvY2FsICIgOiAiIikgPDwgcHJlZml4IDw8ICIgPSAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIjpuZXd7fSIKKyAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIjpyZWFkKGlwcm90KSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbG9jYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIHNpemUgPSB0bXAoIl9zaXplIik7CisgIHN0cmluZyBrdHlwZSA9IHRtcCgiX2t0eXBlIik7CisgIHN0cmluZyB2dHlwZSA9IHRtcCgiX3Z0eXBlIik7CisgIHN0cmluZyBldHlwZSA9IHRtcCgiX2V0eXBlIik7CisKKyAgdF9maWVsZCBmc2l6ZShnX3R5cGVfaTMyLCBzaXplKTsKKyAgdF9maWVsZCBma3R5cGUoZ190eXBlX2k4LCBrdHlwZSk7CisgIHRfZmllbGQgZnZ0eXBlKGdfdHlwZV9pOCwgdnR5cGUpOworICB0X2ZpZWxkIGZldHlwZShnX3R5cGVfaTgsIGV0eXBlKTsKKworICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKKyAgaW5kZW50KG91dCkgPDwgKGxvY2FsID8gImxvY2FsICIgOiAiIikgPDwgcHJlZml4IDw8ICIgPSB7fSIgPDwgZW5kbDsKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJsb2NhbCAiIDw8IGt0eXBlIDw8ICIsICIgPDwgdnR5cGUgPDwgIiwgIiA8PCBzaXplIDw8ICIgPSBpcHJvdDpyZWFkTWFwQmVnaW4oKSAiCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAibG9jYWwgIiA8PCBldHlwZSA8PCAiLCAiIDw8IHNpemUgPDwgIiA9IGlwcm90OnJlYWRTZXRCZWdpbigpIiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAibG9jYWwgIiA8PCBldHlwZSA8PCAiLCAiIDw8IHNpemUgPDwgIiA9IGlwcm90OnJlYWRMaXN0QmVnaW4oKSIgPDwgZW5kbDsKKyAgfQorCisgIC8vIERlc2VyaWFsaXplCisgIGluZGVudChvdXQpIDw8ICJmb3IgX2k9MSwiIDw8IHNpemUgPDwgIiBkbyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgcHJlZml4KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgpOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbDsKKworICAvLyBSZWFkIGNvbnRhaW5lciBlbmQKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpcHJvdDpyZWFkTWFwRW5kKCkiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlwcm90OnJlYWRTZXRFbmQoKSIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlwcm90OnJlYWRMaXN0RW5kKCkiIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBwcmVmaXgpIHsKKyAgLy8gQSBtYXAgaXMgcmVwcmVzZW50ZWQgYnkgYSB0YWJsZSBpbmRleGFibGUgYnkgYW55IGx1YSB0eXBlCisgIHN0cmluZyBrZXkgPSB0bXAoIl9rZXkiKTsKKyAgc3RyaW5nIHZhbCA9IHRtcCgiX3ZhbCIpOworICB0X2ZpZWxkIGZrZXkodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7CisgIHRfZmllbGQgZnZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5LCB0cnVlKTsKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCwgdHJ1ZSk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICJbIiA8PCBrZXkgPDwgIl0gPSAiIDw8IHZhbCA8PCBlbmRsOworfQorCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIHByZWZpeCkgeworICAvLyBBIHNldCBpcyByZXByZXNlbnRlZCBieSBhIHRhYmxlIGluZGV4ZWQgYnkgdGhlIHZhbHVlCisgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0sIHRydWUpOworCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiWyIgPDwgZWxlbSA8PCAiXSA9ICIgPDwgZWxlbSA8PCBlbmRsOworfQorCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICAvLyBBIGxpc3QgaXMgcmVwcmVzZW50ZWQgYnkgYSB0YWJsZSBpbmRleGVkIGJ5IGludGVnZXIgdmFsdWVzCisgIC8vIExVQSBuYXRpdmVseSBwcm92aWRlcyBhbGwgb2YgdGhlIGZ1bmN0aW9ucyByZXF1aXJlZCB0byBtYWludGFpbiBhIGxpc3QKKyAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0sIHRydWUpOworCisgIGluZGVudChvdXQpIDw8ICJ0YWJsZS5pbnNlcnQoIiA8PCBwcmVmaXggPDwgIiwgIiA8PCBlbGVtIDw8ICIpIiA8PCBlbmRsOworfQorCisvKioKKyAqIFNlcmlhbGl6ZSAoV3JpdGUpCisgKi8KK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKworICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBuYW1lOworICB9CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Q6IjsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAid3JpdGVCb29sKCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUJ5dGUoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNigiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAid3JpdGVJNjQoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSgiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gUEhQIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIikiOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgIG5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgfQorfQorCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7CisgICh2b2lkKXRzdHJ1Y3Q7CisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiOndyaXRlKG9wcm90KSIgPDwgZW5kbDsKK30KKwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7CisgIC8vIEJlZ2luIHdyaXRpbmcKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdDp3cml0ZU1hcEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8ICJ0dGFibGVfc2l6ZSgiIDw8IHByZWZpeCA8PCAiKSkiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90OndyaXRlU2V0QmVnaW4oIiA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCAidHRhYmxlX3NpemUoIiA8PCBwcmVmaXggPDwgIikpIiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Q6d3JpdGVMaXN0QmVnaW4oIiA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKQorICAgICAgICAgICAgICAgIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCAiIyIgPDwgcHJlZml4IDw8ICIpIiA8PCBlbmRsOworICB9CisKKyAgLy8gU2VyaWFsaXplCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBzdHJpbmcga2l0ZXIgPSB0bXAoImtpdGVyIik7CisgICAgc3RyaW5nIHZpdGVyID0gdG1wKCJ2aXRlciIpOworICAgIGluZGVudChvdXQpIDw8ICJmb3IgIiA8PCBraXRlciA8PCAiLCIgPDwgdml0ZXIgPDwgIiBpbiBwYWlycygiIDw8IHByZWZpeCA8PCAiKSBkbyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBraXRlciwgdml0ZXIpOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBzdHJpbmcgaXRlciA9IHRtcCgiaXRlciIpOworICAgIGluZGVudChvdXQpIDw8ICJmb3IgIiA8PCBpdGVyIDw8ICIsXyBpbiBwYWlycygiIDw8IHByZWZpeCA8PCAiKSBkbyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHN0cmluZyBpdGVyID0gdG1wKCJpdGVyIik7CisgICAgaW5kZW50KG91dCkgPDwgImZvciBfLCIgPDwgaXRlciA8PCAiIGluIGlwYWlycygiIDw8IHByZWZpeCA8PCAiKSBkbyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbDsKKyAgfQorCisgIC8vIEZpbmlzaCB3cml0aW5nCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Q6d3JpdGVNYXBFbmQoKSIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Q6d3JpdGVTZXRFbmQoKSIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90OndyaXRlTGlzdEVuZCgpIiA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGtpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdml0ZXIpIHsKKyAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGtpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCwgIiIpOworCisgIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2aXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQsICIiKTsKK30KKwordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgaXRlcikgeworICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Cit9CisKK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKK30KKworLyoqCisgKiAgSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKKyAqLworc3RyaW5nIHRfbHVhX2dlbmVyYXRvcjo6bHVhX2luY2x1ZGVzKCkgeworICBpZiAoZ2VuX3JlcXVpcmVzXykgeworICAgIHJldHVybiAiXG5cbnJlcXVpcmUgJ1RocmlmdCciOworICB9IGVsc2UgeworICAgIHJldHVybiAiIjsKKyAgfQorfQorCitzdHJpbmcgdF9sdWFfZ2VuZXJhdG9yOjpnZXRfbmFtZXNwYWNlKGNvbnN0IHRfcHJvZ3JhbSogcHJvZ3JhbSkgeworICBzdGQ6OnN0cmluZyByZWFsX21vZHVsZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImx1YSIpOworICBpZiAocmVhbF9tb2R1bGUuZW1wdHkoKSkgeworICAgIHJldHVybiBwcm9ncmFtLT5nZXRfbmFtZSgpICsgIl8iOworICB9CisgIHJldHVybiByZWFsX21vZHVsZSArICJfIjsKK30KKworc3RyaW5nIHRfbHVhX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RyaW5nIHByZWZpeCkgeworICAodm9pZClwcmVmaXg7CisgIHN0ZDo6c3RyaW5nIHJldCA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIoIiArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSArICIpIjsKKyAgcmV0dXJuIHJldDsKK30KKworc3RyaW5nIHRfbHVhX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKyAgc3RkOjpzdHJpbmcgcmV0ID0gIiI7CisgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOykgeworICAgIHJldCArPSBwcmVmaXggKyAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICArK2ZsZF9pdGVyOworICAgIGlmIChmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCkpIHsKKyAgICAgIHJldCArPSAiLCAiOworICAgIH0KKyAgfQorICByZXR1cm4gcmV0OworfQorCitzdHJpbmcgdF9sdWFfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJUVHlwZS5TVFJJTkciOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiVFR5cGUuQk9PTCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiVFR5cGUuQllURSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIlRUeXBlLkkxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIlRUeXBlLkkzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlRUeXBlLkk2NCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIlRUeXBlLkRPVUJMRSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiVFR5cGUuSTMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJUVHlwZS5TVFJVQ1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5NQVAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5TRVQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiVFR5cGUuTElTVCI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoCisgICAgbHVhLAorICAgICJMdWEiLAorICAgICIgICAgb21pdF9yZXF1aXJlczogICBTdXBwcmVzcyBnZW5lcmF0aW9uIG9mIHJlcXVpcmUgJ3NvbWVmaWxlJy5cbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X25ldGNvcmVfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9uZXRjb3JlX2dlbmVyYXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmU3ZGEwCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9uZXRjb3JlX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDMxMTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGNjdHlwZT4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9uZXRjb3JlX2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworLy9UT0RPOiBjaGVjayBmb3IgaW5kZW50YXRpb24KKy8vVE9ETzogRG8gd2UgbmVlZCBzZXFJZF8gaW4gZ2VuZXJhdGlvbj8KKwordF9uZXRjb3JlX2dlbmVyYXRvcjo6dF9uZXRjb3JlX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sIGNvbnN0IG1hcDxzdHJpbmcsIHN0cmluZz4mIHBhcnNlZF9vcHRpb25zLCBjb25zdCBzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkKK3sKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworCisgICAgbnVsbGFibGVfID0gZmFsc2U7CisgICAgaGFzaGNvZGVfID0gZmFsc2U7CisgICAgdW5pb25fID0gZmFsc2U7CisgICAgc2VyaWFsaXplXyA9IGZhbHNlOworICAgIHdjZl8gPSBmYWxzZTsKKyAgICB3Y2ZfbmFtZXNwYWNlXy5jbGVhcigpOworCisgICAgbWFwPHN0cmluZywgc3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIGZvciAoaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikKKyAgICB7CisgICAgICAgIGlmIChpdGVyLT5maXJzdC5jb21wYXJlKCJudWxsYWJsZSIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIG51bGxhYmxlXyA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoaXRlci0+Zmlyc3QuY29tcGFyZSgiaGFzaGNvZGUiKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBoYXNoY29kZV8gPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGl0ZXItPmZpcnN0LmNvbXBhcmUoInVuaW9uIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgdW5pb25fID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChpdGVyLT5maXJzdC5jb21wYXJlKCJzZXJpYWwiKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBzZXJpYWxpemVfID0gdHJ1ZTsKKyAgICAgICAgICAgIHdjZl9uYW1lc3BhY2VfID0gaXRlci0+c2Vjb25kOyAvLyBzaW5jZSB0aGVyZSBjYW4gYmUgb25seSBvbmUgbmFtZXNwYWNlCisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoaXRlci0+Zmlyc3QuY29tcGFyZSgid2NmIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgd2NmXyA9IHRydWU7CisgICAgICAgICAgICB3Y2ZfbmFtZXNwYWNlXyA9IGl0ZXItPnNlY29uZDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBuZXRjb3JlOiIgKyBpdGVyLT5maXJzdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLW5ldGNvcmUiOworfQorCitzdGF0aWMgc3RyaW5nIGNvcnJlY3RfZnVuY3Rpb25fbmFtZV9mb3JfYXN5bmMoc3RyaW5nIGNvbnN0JiBmdW5jdGlvbl9uYW1lKQoreworICAgIHN0cmluZyBjb25zdCBhc3luY19lbmQgPSAiQXN5bmMiOworICAgIHNpemVfdCBpID0gZnVuY3Rpb25fbmFtZS5maW5kKGFzeW5jX2VuZCk7CisgICAgaWYgKGkgIT0gc3RyaW5nOjpucG9zKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZ1bmN0aW9uX25hbWUgKyBhc3luY19lbmQ7CisgICAgfQorCisgICAgcmV0dXJuIGZ1bmN0aW9uX25hbWU7Cit9CisKKy8qKgorKiBcYnJpZWYgU2VhcmNoIGFuZCByZXBsYWNlICJfYXJncyIgc3Vic3RyaW5nIGluIHN0cnVjdCBuYW1lIGlmIGV4aXN0IChmb3IgQyMgY2xhc3MgbmFtaW5nKQorKiBccGFyYW0gc3RydWN0X25hbWUKKyogXHJldHVybiBNb2RpZmllZCBzdHJ1Y3QgbmFtZSAoIlN0cnVjdF9hcmdzIiAtPiAiU3RydWN0QXJncyIpIG9yIG9yaWdpbmFsIG5hbWUKKyovCitzdGF0aWMgc3RyaW5nIGNoZWNrX2FuZF9jb3JyZWN0X3N0cnVjdF9uYW1lKGNvbnN0IHN0cmluZyYgc3RydWN0X25hbWUpCit7CisgICAgc3RyaW5nIGFyZ3NfZW5kID0gIl9hcmdzIjsKKyAgICBzaXplX3QgaSA9IHN0cnVjdF9uYW1lLmZpbmQoYXJnc19lbmQpOworICAgIGlmIChpICE9IHN0cmluZzo6bnBvcykKKyAgICB7CisgICAgICAgIHN0cmluZyBuZXdfc3RydWN0X25hbWUgPSBzdHJ1Y3RfbmFtZTsKKyAgICAgICAgbmV3X3N0cnVjdF9uYW1lLnJlcGxhY2UoaSwgYXJnc19lbmQubGVuZ3RoKCksICJBcmdzIik7CisgICAgICAgIHJldHVybiBuZXdfc3RydWN0X25hbWU7CisgICAgfQorCisgICAgc3RyaW5nIHJlc3VsdF9lbmQgPSAiX3Jlc3VsdCI7CisgICAgc2l6ZV90IGogPSBzdHJ1Y3RfbmFtZS5maW5kKHJlc3VsdF9lbmQpOworICAgIGlmIChqICE9IHN0cmluZzo6bnBvcykKKyAgICB7CisgICAgICAgIHN0cmluZyBuZXdfc3RydWN0X25hbWUgPSBzdHJ1Y3RfbmFtZTsKKyAgICAgICAgbmV3X3N0cnVjdF9uYW1lLnJlcGxhY2UoaiwgcmVzdWx0X2VuZC5sZW5ndGgoKSwgIlJlc3VsdCIpOworICAgICAgICByZXR1cm4gbmV3X3N0cnVjdF9uYW1lOworICAgIH0KKworICAgIHJldHVybiBzdHJ1Y3RfbmFtZTsKK30KKworc3RhdGljIGJvb2wgZmllbGRfaGFzX2RlZmF1bHQodF9maWVsZCogdGZpZWxkKSB7IHJldHVybiB0ZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTEw7IH0KKworc3RhdGljIGJvb2wgZmllbGRfaXNfcmVxdWlyZWQodF9maWVsZCogdGZpZWxkKSB7IHJldHVybiB0ZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEOyB9CisKK3N0YXRpYyBib29sIHR5cGVfY2FuX2JlX251bGwodF90eXBlKiB0dHlwZSkKK3sKKyAgICB3aGlsZSAodHR5cGUtPmlzX3R5cGVkZWYoKSkKKyAgICB7CisgICAgICAgIHR0eXBlID0gc3RhdGljX2Nhc3Q8dF90eXBlZGVmKj4odHR5cGUpLT5nZXRfdHlwZSgpOworICAgIH0KKworICAgIHJldHVybiB0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpIHx8IHR0eXBlLT5pc19zdHJpbmcoKTsKK30KKworYm9vbCB0X25ldGNvcmVfZ2VuZXJhdG9yOjppc193Y2ZfZW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuIHdjZl87IH0KKworYm9vbCB0X25ldGNvcmVfZ2VuZXJhdG9yOjppc19udWxsYWJsZV9lbmFibGVkKCkgY29uc3QgeyByZXR1cm4gbnVsbGFibGVfOyB9CisKK2Jvb2wgdF9uZXRjb3JlX2dlbmVyYXRvcjo6aXNfaGFzaGNvZGVfZW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuIGhhc2hjb2RlXzsgfQorCitib29sIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmlzX3NlcmlhbGl6ZV9lbmFibGVkKCkgY29uc3QgeyByZXR1cm4gc2VyaWFsaXplXzsgfQorCitib29sIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmlzX3VuaW9uX2VuYWJsZWQoKSBjb25zdCB7IHJldHVybiB1bmlvbl87IH0KKworbWFwPHN0cmluZywgaW50PiB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZXRfa2V5d29yZHNfbGlzdCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG5ldGNvcmVfa2V5d29yZHM7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKQoreworICAgIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7CisKKyAgICAvLyBmb3IgdXNhZ2Ugb2YgY3NoYXJwIG5hbWVzcGFjZXMgaW4gdGhyaWZ0IGZpbGVzIChmcm9tIGZpbGVzIGZvciBjc2hhcnApCisgICAgbmFtZXNwYWNlX25hbWVfID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoIm5ldGNvcmUiKTsKKyAgICBpZiAobmFtZXNwYWNlX25hbWVfLmVtcHR5KCkpCisgICAgeworICAgICAgICBuYW1lc3BhY2VfbmFtZV8gPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgibmV0Y29yZSIpOworICAgIH0KKworICAgIHN0cmluZyBkaXIgPSBuYW1lc3BhY2VfbmFtZV87CisgICAgc3RyaW5nIHN1YmRpciA9IGdldF9vdXRfZGlyKCkuY19zdHIoKTsKKyAgICBzdHJpbmc6OnNpemVfdHlwZSBsb2M7CisKKyAgICB3aGlsZSAoKGxvYyA9IGRpci5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykKKyAgICB7CisgICAgICAgIHN1YmRpciA9IHN1YmRpciArICIvIiArIGRpci5zdWJzdHIoMCwgbG9jKTsKKyAgICAgICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOworICAgICAgICBkaXIgPSBkaXIuc3Vic3RyKGxvYyArIDEpOworICAgIH0KKyAgICBpZiAoZGlyLnNpemUoKSA+IDApCisgICAgeworICAgICAgICBzdWJkaXIgPSBzdWJkaXIgKyAiLyIgKyBkaXI7CisgICAgICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKKyAgICB9CisKKyAgICBuYW1lc3BhY2VfZGlyXyA9IHN1YmRpcjsKKyAgICBpbml0X2tleXdvcmRzKCk7CisKKyAgICB3aGlsZSAoIW1lbWJlcl9tYXBwaW5nX3Njb3Blcy5lbXB0eSgpKQorICAgIHsKKyAgICAgICAgY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKG1lbWJlcl9tYXBwaW5nX3Njb3Blcy5iYWNrKCkuc2NvcGVfbWVtYmVyKTsKKyAgICB9CisKKyAgICBwdmVyYm9zZSgiLk5FVCBDb3JlIG9wdGlvbnM6XG4iKTsKKyAgICBwdmVyYm9zZSgiLSBudWxsYWJsZSAuLi4gJXNcbiIsIChudWxsYWJsZV8gPyAiT04iIDogIm9mZiIpKTsKKyAgICBwdmVyYm9zZSgiLSB1bmlvbiAuLi4uLi4gJXNcbiIsICh1bmlvbl8gPyAiT04iIDogIm9mZiIpKTsKKyAgICBwdmVyYm9zZSgiLSBoYXNoY29kZSAuLi4gJXNcbiIsIChoYXNoY29kZV8gPyAiT04iIDogIm9mZiIpKTsKKyAgICBwdmVyYm9zZSgiLSBzZXJpYWxpemUgLi4gJXNcbiIsIChzZXJpYWxpemVfID8gIk9OIiA6ICJvZmYiKSk7CisgICAgcHZlcmJvc2UoIi0gd2NmIC4uLi4uLi4uICVzXG4iLCAod2NmXyA/ICJPTiIgOiAib2ZmIikpOworfQorCitzdHJpbmcgdF9uZXRjb3JlX2dlbmVyYXRvcjo6bm9ybWFsaXplX25hbWUoc3RyaW5nIG5hbWUpCit7CisgICAgc3RyaW5nIHRtcChuYW1lKTsKKyAgICB0cmFuc2Zvcm0odG1wLmJlZ2luKCksIHRtcC5lbmQoKSwgdG1wLmJlZ2luKCksIHN0YXRpY19jYXN0PGludCgqKShpbnQpPih0b2xvd2VyKSk7CisKKyAgICAvLyB1bi1jb25mbGljdCBrZXl3b3JkcyBieSBwcmVmaXhpbmcgd2l0aCAiQCIKKyAgICBpZiAobmV0Y29yZV9rZXl3b3Jkcy5maW5kKHRtcCkgIT0gbmV0Y29yZV9rZXl3b3Jkcy5lbmQoKSkKKyAgICB7CisgICAgICAgIHJldHVybiAiQCIgKyBuYW1lOworICAgIH0KKworICAgIC8vIG5vIGNoYW5nZXMgbmVjZXNzYXJ5CisgICAgcmV0dXJuIG5hbWU7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6aW5pdF9rZXl3b3JkcygpCit7CisgICAgbmV0Y29yZV9rZXl3b3Jkcy5jbGVhcigpOworCisgICAgLy8gQyMga2V5d29yZHMKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJhYnN0cmFjdCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJhcyJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJiYXNlIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImJvb2wiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siYnJlYWsiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siYnl0ZSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJjYXNlIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImNhdGNoIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImNoYXIiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siY2hlY2tlZCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJjbGFzcyJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJjb25zdCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJjb250aW51ZSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJkZWNpbWFsIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImRlZmF1bHQiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZGVsZWdhdGUiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZG8iXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZG91YmxlIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImVsc2UiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZW51bSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJldmVudCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJleHBsaWNpdCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJleHRlcm4iXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZmFsc2UiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZmluYWxseSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJmaXhlZCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJmbG9hdCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJmb3IiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZm9yZWFjaCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJnb3RvIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImlmIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImltcGxpY2l0Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImluIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImludCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJpbnRlcmZhY2UiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siaW50ZXJuYWwiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siaXMiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sibG9jayJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJsb25nIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbIm5hbWVzcGFjZSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJuZXciXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sibnVsbCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJvYmplY3QiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sib3BlcmF0b3IiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sib3V0Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbIm92ZXJyaWRlIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInBhcmFtcyJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJwcml2YXRlIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInByb3RlY3RlZCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJwdWJsaWMiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sicmVhZG9ubHkiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sicmVmIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInJldHVybiJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJzYnl0ZSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJzZWFsZWQiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sic2hvcnQiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sic2l6ZW9mIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInN0YWNrYWxsb2MiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sic3RhdGljIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInN0cmluZyJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJzdHJ1Y3QiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sic3dpdGNoIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInRoaXMiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sidGhyb3ciXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sidHJ1ZSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJ0cnkiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sidHlwZW9mIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInVpbnQiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sidWxvbmciXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sidW5jaGVja2VkIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInVuc2FmZSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJ1c2hvcnQiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sidXNpbmciXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sidmlydHVhbCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJ2b2lkIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInZvbGF0aWxlIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbIndoaWxlIl0gPSAxOworCisgICAgLy8gQyMgY29udGV4dHVhbCBrZXl3b3JkcworICAgIG5ldGNvcmVfa2V5d29yZHNbImFkZCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJhbGlhcyJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJhc2NlbmRpbmciXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siYXN5bmMiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siYXdhaXQiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZGVzY2VuZGluZyJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJkeW5hbWljIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImZyb20iXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZ2V0Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImdsb2JhbCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJncm91cCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJpbnRvIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImpvaW4iXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sibGV0Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbIm9yZGVyYnkiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sicGFydGlhbCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJyZW1vdmUiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sic2VsZWN0Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInNldCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJ2YWx1ZSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJ2YXIiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sid2hlcmUiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sieWllbGQiXSA9IDE7CisKKwluZXRjb3JlX2tleXdvcmRzWyJ3aGVuIl0gPSAxOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OnN0YXJ0X25ldGNvcmVfbmFtZXNwYWNlKG9zdHJlYW0mIG91dCkKK3sKKyAgICBpZiAoIW5hbWVzcGFjZV9uYW1lXy5lbXB0eSgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8ICJuYW1lc3BhY2UgIiA8PCBuYW1lc3BhY2VfbmFtZV8gPDwgZW5kbDsKKyAgICAgICAgc2NvcGVfdXAob3V0KTsKKyAgICB9Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6ZW5kX25ldGNvcmVfbmFtZXNwYWNlKG9zdHJlYW0mIG91dCkKK3sKKyAgICBpZiAoIW5hbWVzcGFjZV9uYW1lXy5lbXB0eSgpKQorICAgIHsKKyAgICAgICAgc2NvcGVfZG93bihvdXQpOworICAgIH0KK30KKworc3RyaW5nIHRfbmV0Y29yZV9nZW5lcmF0b3I6Om5ldGNvcmVfdHlwZV91c2luZ3MoKSBjb25zdAoreworICAgIHN0cmluZyBuYW1lc3BhY2VzID0KKyAgICAgICAgInVzaW5nIFN5c3RlbTtcbiIKKyAgICAgICAgInVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucztcbiIKKyAgICAgICAgInVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljO1xuIgorICAgICAgICAidXNpbmcgU3lzdGVtLlRleHQ7XG4iCisgICAgICAgICJ1c2luZyBTeXN0ZW0uSU87XG4iCisgICAgICAgICJ1c2luZyBTeXN0ZW0uVGhyZWFkaW5nO1xuIgorICAgICAgICAidXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrcztcbiIKKyAgICAgICAgInVzaW5nIFRocmlmdDtcbiIKKyAgICAgICAgInVzaW5nIFRocmlmdC5Db2xsZWN0aW9ucztcbiI7CisKKyAgICBpZiAod2NmXykKKyAgICB7CisgICAgICAgIG5hbWVzcGFjZXMgKz0gInVzaW5nIFN5c3RlbS5TZXJ2aWNlTW9kZWw7XG4iOworICAgICAgICBuYW1lc3BhY2VzICs9ICJ1c2luZyBTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uO1xuIjsKKyAgICB9CisKKyAgICByZXR1cm4gbmFtZXNwYWNlcyArIGVuZGw7Cit9CisKK3N0cmluZyB0X25ldGNvcmVfZ2VuZXJhdG9yOjpuZXRjb3JlX3RocmlmdF91c2luZ3MoKSBjb25zdAoreworICAgIHN0cmluZyBuYW1lc3BhY2VzID0KKyAgICAgICAgInVzaW5nIFRocmlmdC5Qcm90b2NvbHM7XG4iCisgICAgICAgICJ1c2luZyBUaHJpZnQuUHJvdG9jb2xzLkVudGl0aWVzO1xuIgorICAgICAgICAidXNpbmcgVGhyaWZ0LlByb3RvY29scy5VdGlsaXRpZXM7XG4iCisgICAgICAgICJ1c2luZyBUaHJpZnQuVHJhbnNwb3J0cztcbiIKKyAgICAgICAgInVzaW5nIFRocmlmdC5UcmFuc3BvcnRzLkNsaWVudDtcbiIKKyAgICAgICAgInVzaW5nIFRocmlmdC5UcmFuc3BvcnRzLlNlcnZlcjtcbiI7CisKKyAgICByZXR1cm4gbmFtZXNwYWNlcyArIGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkKK3sKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpCit7CisgICAgKHZvaWQpdHR5cGVkZWY7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKQoreworCWludCBpYyA9IGluZGVudF9jb3VudCgpOworICAgIHN0cmluZyBmX2VudW1fbmFtZSA9IG5hbWVzcGFjZV9kaXJfICsgIi8iICsgdGVudW0tPmdldF9uYW1lKCkgKyAiLmNzIjsKKworICAgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9lbnVtOworICAgIGZfZW51bS5vcGVuKGZfZW51bV9uYW1lLmNfc3RyKCkpOworCisJZ2VuZXJhdGVfZW51bShmX2VudW0sIHRlbnVtKTsKKworICAgIGZfZW51bS5jbG9zZSgpOworCWluZGVudF92YWxpZGF0ZShpYywgImdlbmVyYXRlX2VudW0iKTsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKG9zdHJlYW0mIG91dCwgdF9lbnVtKiB0ZW51bSkKK3sKKwlvdXQgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKKworCXN0YXJ0X25ldGNvcmVfbmFtZXNwYWNlKG91dCk7CisJZ2VuZXJhdGVfbmV0Y29yZV9kb2Mob3V0LCB0ZW51bSk7CisKKwlvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBlbnVtICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgZW5kbDsKKwlzY29wZV91cChvdXQpOworCisJdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisJdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7CisKKwlmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikKKwl7CisJCWdlbmVyYXRlX25ldGNvcmVfZG9jKG91dCwgKmNfaXRlcik7CisJCWludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisJCW91dCA8PCBpbmRlbnQoKSA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgdmFsdWUgPDwgIiwiIDw8IGVuZGw7CisJfQorCisJc2NvcGVfZG93bihvdXQpOworCWVuZF9uZXRjb3JlX25hbWVzcGFjZShvdXQpOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cyh2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykKK3sKKyAgICBpZiAoY29uc3RzLmVtcHR5KCkpCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBuYW1lc3BhY2VfZGlyXyArICcvJyArIHByb2dyYW1fbmFtZV8gKyAiLkNvbnN0YW50cy5jcyI7CisgICAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2NvbnN0czsKKyAgICBmX2NvbnN0cy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7CisKKyAgICBnZW5lcmF0ZV9jb25zdHMoZl9jb25zdHMsIGNvbnN0cyk7CisKKyAgICBmX2NvbnN0cy5jbG9zZSgpOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0cyhvc3RyZWFtJiBvdXQsIHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKQoreworICAgIGlmIChjb25zdHMuZW1wdHkoKSkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBvdXQgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgbmV0Y29yZV90eXBlX3VzaW5ncygpIDw8IGVuZGw7CisKKyAgICBzdGFydF9uZXRjb3JlX25hbWVzcGFjZShvdXQpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgc3RhdGljIGNsYXNzICIgPDwgbWFrZV92YWxpZF9jc2hhcnBfaWRlbnRpZmllcihwcm9ncmFtX25hbWVfKSA8PCAiQ29uc3RhbnRzIiA8PCBlbmRsOworCisgICAgc2NvcGVfdXAob3V0KTsKKworICAgIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgICBib29sIG5lZWRfc3RhdGljX2NvbnN0cnVjdG9yID0gZmFsc2U7CisgICAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9uZXRjb3JlX2RvYyhvdXQsICpjX2l0ZXIpOworICAgICAgICBpZiAocHJpbnRfY29uc3RfdmFsdWUob3V0LCAoKmNfaXRlciktPmdldF9uYW1lKCksICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSwgZmFsc2UpKQorICAgICAgICB7CisgICAgICAgICAgICBuZWVkX3N0YXRpY19jb25zdHJ1Y3RvciA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobmVlZF9zdGF0aWNfY29uc3RydWN0b3IpCisgICAgeworICAgICAgICBwcmludF9jb25zdF9jb25zdHJ1Y3RvcihvdXQsIGNvbnN0cyk7CisgICAgfQorCisgICAgc2NvcGVfZG93bihvdXQpOworICAgIGVuZF9uZXRjb3JlX25hbWVzcGFjZShvdXQpOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OnByaW50X2NvbnN0X2RlZl92YWx1ZShvc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKQoreworICAgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKQorICAgIHsKKyAgICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gc3RhdGljX2Nhc3Q8dF9zdHJ1Y3QqPih0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICAgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICAgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICAgICAgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKHN0YXRpY19jYXN0PHRfc3RydWN0Kj4odHlwZSkpOworCisgICAgICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKQorICAgICAgICB7CisgICAgICAgICAgICB0X2ZpZWxkKiBmaWVsZCA9IE5VTEw7CisKKyAgICAgICAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmllbGQgPSAqZl9pdGVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZpZWxkID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gZmllbGQtPmdldF90eXBlKCk7CisKKyAgICAgICAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgbmFtZSA8PCAiLiIgPDwgcHJvcF9uYW1lKGZpZWxkKSA8PCAiID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIH0KKworICAgICAgICBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcoc3RhdGljX2Nhc3Q8dF9zdHJ1Y3QqPih0eXBlKSk7CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKQorICAgIHsKKyAgICAgICAgdF90eXBlKiBrdHlwZSA9IHN0YXRpY19jYXN0PHRfbWFwKj4odHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgICAgICB0X3R5cGUqIHZ0eXBlID0gc3RhdGljX2Nhc3Q8dF9tYXAqPih0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgICAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgICAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIGtleSA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKKyAgICAgICAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IG5hbWUgPDwgIlsiIDw8IGtleSA8PCAiXSIgPDwgIiA9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkKKyAgICB7CisgICAgICAgIHRfdHlwZSogZXR5cGU7CisgICAgICAgIGlmICh0eXBlLT5pc19saXN0KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGV0eXBlID0gc3RhdGljX2Nhc3Q8dF9saXN0Kj4odHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGV0eXBlID0gc3RhdGljX2Nhc3Q8dF9zZXQqPih0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICAgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBldHlwZSwgKnZfaXRlcik7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgbmFtZSA8PCAiLkFkZCgiIDw8IHZhbCA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfY29uc3RydWN0b3Iob3N0cmVhbSYgb3V0LCB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykKK3sKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInN0YXRpYyAiIDw8IG1ha2VfdmFsaWRfY3NoYXJwX2lkZW50aWZpZXIocHJvZ3JhbV9uYW1lXykuY19zdHIoKSA8PCAiQ29uc3RhbnRzKCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKworICAgIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikKKyAgICB7CisgICAgICAgIHN0cmluZyBuYW1lID0gKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICB0X3R5cGUqIHR5cGUgPSAoKmNfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKworICAgICAgICBwcmludF9jb25zdF9kZWZfdmFsdWUob3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSk7CisgICAgfQorICAgIHNjb3BlX2Rvd24ob3V0KTsKK30KKworYm9vbCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpwcmludF9jb25zdF92YWx1ZShvc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlLCBib29sIGluX3N0YXRpYywgYm9vbCBkZWZ2YWwsIGJvb2wgbmVlZHR5cGUpCit7CisgICAgb3V0IDw8IGluZGVudCgpOworICAgIGJvb2wgbmVlZF9zdGF0aWNfY29uc3RydWN0aW9uID0gIWluX3N0YXRpYzsKKyAgICB3aGlsZSAodHlwZS0+aXNfdHlwZWRlZigpKQorICAgIHsKKyAgICAgICAgdHlwZSA9IHN0YXRpY19jYXN0PHRfdHlwZWRlZio+KHR5cGUpLT5nZXRfdHlwZSgpOworICAgIH0KKworICAgIGlmICghZGVmdmFsIHx8IG5lZWR0eXBlKQorICAgIHsKKyAgICAgICAgb3V0IDw8IChpbl9zdGF0aWMgPyAiIiA6IHR5cGUtPmlzX2Jhc2VfdHlwZSgpID8gInB1YmxpYyBjb25zdCAiIDogInB1YmxpYyBzdGF0aWMgIikgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIjsKKyAgICB9CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpCisgICAgeworICAgICAgICBzdHJpbmcgdjIgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSk7CisgICAgICAgIG91dCA8PCBub3JtYWxpemVfbmFtZShuYW1lKSA8PCAiID0gIiA8PCB2MiA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgbmVlZF9zdGF0aWNfY29uc3RydWN0aW9uID0gZmFsc2U7CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBuYW1lIDw8ICIgPSAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIi4iIDw8IHZhbHVlLT5nZXRfaWRlbnRpZmllcl9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIG5lZWRfc3RhdGljX2NvbnN0cnVjdGlvbiA9IGZhbHNlOworICAgIH0KKyAgICBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IG5hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKCk7IiA8PCBlbmRsOworICAgIH0KKyAgICBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBuYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgdHJ1ZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IG5hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKCk7IiA8PCBlbmRsOworICAgIH0KKworICAgIGlmIChkZWZ2YWwgJiYgIXR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICF0eXBlLT5pc19lbnVtKCkpCisgICAgeworICAgICAgICBwcmludF9jb25zdF9kZWZfdmFsdWUob3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSk7CisgICAgfQorCisgICAgcmV0dXJuIG5lZWRfc3RhdGljX2NvbnN0cnVjdGlvbjsKK30KKworc3RyaW5nIHRfbmV0Y29yZV9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZShvc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKQoreworICAgICh2b2lkKW5hbWU7CisgICAgb3N0cmluZ3N0cmVhbSByZW5kZXI7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpCisgICAgeworICAgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gc3RhdGljX2Nhc3Q8dF9iYXNlX3R5cGUqPih0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgICAgc3dpdGNoICh0YmFzZSkKKyAgICAgICAgeworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgICAgIHJlbmRlciA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICAgICAgcmVuZGVyIDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkKKyAgICB7CisgICAgICAgIHJlbmRlciA8PCB0eXBlLT5nZXRfbmFtZSgpIDw8ICIuIiA8PCB2YWx1ZS0+Z2V0X2lkZW50aWZpZXJfbmFtZSgpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzdHJpbmcgdCA9IHRtcCgidG1wIik7CisgICAgICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwgdCwgdHlwZSwgdmFsdWUsIHRydWUsIHRydWUsIHRydWUpOworICAgICAgICByZW5kZXIgPDwgdDsKKyAgICB9CisKKyAgICByZXR1cm4gcmVuZGVyLnN0cigpOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkKK3sKKyAgICBpZiAodW5pb25fICYmIHRzdHJ1Y3QtPmlzX3VuaW9uKCkpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9uZXRjb3JlX3VuaW9uKHRzdHJ1Y3QpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7CisgICAgfQorfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pCit7CisgICAgZ2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pCit7CisgICAgaW50IGljID0gaW5kZW50X2NvdW50KCk7CisKKyAgICBzdHJpbmcgZl9zdHJ1Y3RfbmFtZSA9IG5hbWVzcGFjZV9kaXJfICsgIi8iICsgKHRzdHJ1Y3QtPmdldF9uYW1lKCkpICsgIi5jcyI7CisgICAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3N0cnVjdDsKKworICAgIGZfc3RydWN0Lm9wZW4oZl9zdHJ1Y3RfbmFtZS5jX3N0cigpKTsKKworICAgIGZfc3RydWN0IDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IG5ldGNvcmVfdHlwZV91c2luZ3MoKSA8PCBuZXRjb3JlX3RocmlmdF91c2luZ3MoKSA8PCBlbmRsOworCisgICAgZ2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3N0cnVjdCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKKworICAgIGZfc3RydWN0LmNsb3NlKCk7CisKKyAgICBpbmRlbnRfdmFsaWRhdGUoaWMsICJnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdCIpOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX25ldGNvcmVfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24sIGJvb2wgaW5fY2xhc3MsIGJvb2wgaXNfcmVzdWx0KQoreworICAgIGlmICghaW5fY2xhc3MpCisgICAgeworICAgICAgICBzdGFydF9uZXRjb3JlX25hbWVzcGFjZShvdXQpOworICAgIH0KKworICAgIG91dCA8PCBlbmRsOworCisgICAgZ2VuZXJhdGVfbmV0Y29yZV9kb2Mob3V0LCB0c3RydWN0KTsKKyAgICBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcodHN0cnVjdCk7CisKKyAgICBpZiAoKHNlcmlhbGl6ZV8gfHwgd2NmXykgJiYgIWlzX2V4Y2VwdGlvbikKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW0RhdGFDb250cmFjdChOYW1lc3BhY2U9XCIiIDw8IHdjZl9uYW1lc3BhY2VfIDw8ICJcIildIiA8PCBlbmRsOworICAgIH0KKworICAgIGJvb2wgaXNfZmluYWwgPSB0c3RydWN0LT5hbm5vdGF0aW9uc18uZmluZCgiZmluYWwiKSAhPSB0c3RydWN0LT5hbm5vdGF0aW9uc18uZW5kKCk7CisKKyAgICBzdHJpbmcgc2hhcnBfc3RydWN0X25hbWUgPSBjaGVja19hbmRfY29ycmVjdF9zdHJ1Y3RfbmFtZShub3JtYWxpemVfbmFtZSh0c3RydWN0LT5nZXRfbmFtZSgpKSk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyAiIDw8IChpc19maW5hbCA/ICJzZWFsZWQgIiA6ICIiKSA8PCAicGFydGlhbCBjbGFzcyAiIDw8IHNoYXJwX3N0cnVjdF9uYW1lIDw8ICIgOiAiOworCisgICAgaWYgKGlzX2V4Y2VwdGlvbikKKyAgICB7CisgICAgICAgIG91dCA8PCAiVEV4Y2VwdGlvbiwgIjsKKyAgICB9CisKKyAgICBvdXQgPDwgIlRCYXNlIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgICAgLy8gbWFrZSBwcml2YXRlIG1lbWJlcnMgd2l0aCBwdWJsaWMgUHJvcGVydGllcworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpCisgICAgeworICAgICAgICAvLyBpZiB0aGUgZmllbGQgaXMgcmVxdWllZCwgdGhlbiB3ZSB1c2UgYXV0by1wcm9wZXJ0aWVzCisgICAgICAgIGlmICghZmllbGRfaXNfcmVxdWlyZWQoKCptX2l0ZXIpKSAmJiAoIW51bGxhYmxlXyB8fCBmaWVsZF9oYXNfZGVmYXVsdCgoKm1faXRlcikpKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwcml2YXRlICIgPDwgZGVjbGFyZV9maWVsZCgqbV9pdGVyLCBmYWxzZSwgIl8iKSA8PCBlbmRsOworICAgICAgICB9CisgICAgfQorICAgIG91dCA8PCBlbmRsOworCisgICAgYm9vbCBoYXNfbm9uX3JlcXVpcmVkX2ZpZWxkcyA9IGZhbHNlOworICAgIGJvb2wgaGFzX25vbl9yZXF1aXJlZF9kZWZhdWx0X3ZhbHVlX2ZpZWxkcyA9IGZhbHNlOworICAgIGJvb2wgaGFzX3JlcXVpcmVkX2ZpZWxkcyA9IGZhbHNlOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9uZXRjb3JlX2RvYyhvdXQsICptX2l0ZXIpOworICAgICAgICBnZW5lcmF0ZV9wcm9wZXJ0eShvdXQsICptX2l0ZXIsIHRydWUsIHRydWUpOworICAgICAgICBib29sIGlzX3JlcXVpcmVkID0gZmllbGRfaXNfcmVxdWlyZWQoKCptX2l0ZXIpKTsKKyAgICAgICAgYm9vbCBoYXNfZGVmYXVsdCA9IGZpZWxkX2hhc19kZWZhdWx0KCgqbV9pdGVyKSk7CisgICAgICAgIGlmIChpc19yZXF1aXJlZCkKKyAgICAgICAgeworICAgICAgICAgICAgaGFzX3JlcXVpcmVkX2ZpZWxkcyA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaGFzX2RlZmF1bHQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGFzX25vbl9yZXF1aXJlZF9kZWZhdWx0X3ZhbHVlX2ZpZWxkcyA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBoYXNfbm9uX3JlcXVpcmVkX2ZpZWxkcyA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sIGdlbmVyYXRlX2lzc2V0ID0gKG51bGxhYmxlXyAmJiBoYXNfbm9uX3JlcXVpcmVkX2RlZmF1bHRfdmFsdWVfZmllbGRzKSB8fCAoIW51bGxhYmxlXyAmJiBoYXNfbm9uX3JlcXVpcmVkX2ZpZWxkcyk7CisgICAgaWYgKGdlbmVyYXRlX2lzc2V0KQorICAgIHsKKyAgICAgICAgb3V0IDw8IGVuZGw7CisgICAgICAgIGlmIChzZXJpYWxpemVfIHx8IHdjZl8pCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW0RhdGFNZW1iZXIoT3JkZXIgPSAxKV0iIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgSXNzZXQgX19pc3NldDsiIDw8IGVuZGw7CisgICAgICAgIGlmIChzZXJpYWxpemVfIHx8IHdjZl8pCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW0RhdGFDb250cmFjdF0iIDw8IGVuZGw7CisgICAgICAgIH0KKworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBzdHJ1Y3QgSXNzZXQiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKQorICAgICAgICB7CisgICAgICAgICAgICBib29sIGlzX3JlcXVpcmVkID0gZmllbGRfaXNfcmVxdWlyZWQoKCptX2l0ZXIpKTsKKyAgICAgICAgICAgIGJvb2wgaGFzX2RlZmF1bHQgPSBmaWVsZF9oYXNfZGVmYXVsdCgoKm1faXRlcikpOworICAgICAgICAgICAgLy8gaWYgaXQgaXMgcmVxdWlyZWQsIGRvbid0IG5lZWQgSXNzZXQgZm9yIHRoYXQgdmFyaWFibGUKKyAgICAgICAgICAgIC8vIGlmIGl0IGlzIG5vdCByZXF1aXJlZCwgaWYgaXQgaGFzIGEgZGVmYXVsdCB2YWx1ZSwgd2UgbmVlZCB0byBnZW5lcmF0ZSBJc3NldAorICAgICAgICAgICAgLy8gaWYgd2UgYXJlIG5vdCBudWxsYWJsZSwgdGhlbiB3ZSBnZW5lcmF0ZSBJc3NldAorICAgICAgICAgICAgaWYgKCFpc19yZXF1aXJlZCAmJiAoIW51bGxhYmxlXyB8fCBoYXNfZGVmYXVsdCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZV8gfHwgd2NmXykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW0RhdGFNZW1iZXJdIiA8PCBlbmRsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBib29sICIgPDwgbm9ybWFsaXplX25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgICAgIGlmIChnZW5lcmF0ZV9pc3NldCAmJiAoc2VyaWFsaXplXyB8fCB3Y2ZfKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIjcmVnaW9uIFhtbFNlcmlhbGl6ZXIgc3VwcG9ydCIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgICAgICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVxdWlyZWQgPSBmaWVsZF9pc19yZXF1aXJlZCgqbV9pdGVyKTsKKyAgICAgICAgICAgICAgICBib29sIGhhc19kZWZhdWx0ID0gZmllbGRfaGFzX2RlZmF1bHQoKm1faXRlcik7CisgICAgICAgICAgICAgICAgLy8gaWYgaXQgaXMgcmVxdWlyZWQsIGRvbid0IG5lZWQgSXNzZXQgZm9yIHRoYXQgdmFyaWFibGUKKyAgICAgICAgICAgICAgICAvLyBpZiBpdCBpcyBub3QgcmVxdWlyZWQsIGlmIGl0IGhhcyBhIGRlZmF1bHQgdmFsdWUsIHdlIG5lZWQgdG8gZ2VuZXJhdGUgSXNzZXQKKyAgICAgICAgICAgICAgICAvLyBpZiB3ZSBhcmUgbm90IG51bGxhYmxlLCB0aGVuIHdlIGdlbmVyYXRlIElzc2V0CisgICAgICAgICAgICAgICAgaWYgKCFpc19yZXF1aXJlZCAmJiAoIW51bGxhYmxlXyB8fCBoYXNfZGVmYXVsdCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBib29sIFNob3VsZFNlcmlhbGl6ZSIgPDwgcHJvcF9uYW1lKCptX2l0ZXIpIDw8ICIoKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBfX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiNlbmRyZWdpb24gWG1sU2VyaWFsaXplciBzdXBwb3J0IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBXZSBhbHdheXMgd2FudCBhIGRlZmF1bHQsIG5vIGFyZ3VtZW50IGNvbnN0cnVjdG9yIGZvciBSZWFkaW5nCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgIiA8PCBzaGFycF9zdHJ1Y3RfbmFtZSA8PCAiKCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKQorICAgIHsKKyAgICAgICAgdF90eXBlKiB0ID0gKCptX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB3aGlsZSAodC0+aXNfdHlwZWRlZigpKQorICAgICAgICB7CisgICAgICAgICAgICB0ID0gc3RhdGljX2Nhc3Q8dF90eXBlZGVmKj4odCktPmdldF90eXBlKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGZpZWxkX2lzX3JlcXVpcmVkKCgqbV9pdGVyKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCAidGhpcy4iICsgcHJvcF9uYW1lKCptX2l0ZXIpLCB0LCAoKm1faXRlciktPmdldF92YWx1ZSgpLCB0cnVlLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludF9jb25zdF92YWx1ZShvdXQsICJ0aGlzLl8iICsgKCptX2l0ZXIpLT5nZXRfbmFtZSgpLCB0LCAoKm1faXRlciktPmdldF92YWx1ZSgpLCB0cnVlLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAvLyBPcHRpb25hbHMgd2l0aCBkZWZhdWx0cyBhcmUgbWFya2VkIHNldAorICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGhpcy5fX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiID0gdHJ1ZTsiIDw8IGVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGlmIChoYXNfcmVxdWlyZWRfZmllbGRzKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgIiA8PCBzaGFycF9zdHJ1Y3RfbmFtZSA8PCAiKCI7CisgICAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZmllbGRfaXNfcmVxdWlyZWQoKm1faXRlcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8ICIsICI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG91dCA8PCB0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG91dCA8PCAiKSA6IHRoaXMoKSIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworCisgICAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChmaWVsZF9pc19yZXF1aXJlZCgqbV9pdGVyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRoaXMuIiA8PCBwcm9wX25hbWUoKm1faXRlcikgPDwgIiA9ICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfQorCisgICAgZ2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7CisgICAgaWYgKGlzX3Jlc3VsdCkKKyAgICB7CisgICAgICAgIGdlbmVyYXRlX25ldGNvcmVfc3RydWN0X3Jlc3VsdF93cml0ZXIob3V0LCB0c3RydWN0KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7CisgICAgfQorICAgIGlmIChoYXNoY29kZV8pCisgICAgeworICAgICAgICBnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF9lcXVhbHMob3V0LCB0c3RydWN0KTsKKyAgICAgICAgZ2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3RfaGFzaGNvZGUob3V0LCB0c3RydWN0KTsKKyAgICB9CisgICAgZ2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3RfdG9zdHJpbmcob3V0LCB0c3RydWN0KTsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAvLyBnZW5lcmF0ZSBhIGNvcnJlc3BvbmRpbmcgV0NGIGZhdWx0IHRvIHdyYXAgdGhlIGV4Y2VwdGlvbgorICAgIGlmICgoc2VyaWFsaXplXyB8fCB3Y2ZfKSAmJiBpc19leGNlcHRpb24pCisgICAgeworICAgICAgICBnZW5lcmF0ZV9uZXRjb3JlX3djZmZhdWx0KG91dCwgdHN0cnVjdCk7CisgICAgfQorCisgICAgY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKHRzdHJ1Y3QpOworICAgIGlmICghaW5fY2xhc3MpCisgICAgeworICAgICAgICBlbmRfbmV0Y29yZV9uYW1lc3BhY2Uob3V0KTsKKyAgICB9Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV0Y29yZV93Y2ZmYXVsdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KQoreworICAgIG91dCA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW0RhdGFDb250cmFjdF0iIDw8IGVuZGw7CisKKyAgICBib29sIGlzX2ZpbmFsID0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmZpbmQoImZpbmFsIikgIT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgIiA8PCAoaXNfZmluYWwgPyAic2VhbGVkICIgOiAiIikgPDwgInBhcnRpYWwgY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJGYXVsdCIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICAgIC8vIG1ha2UgcHJpdmF0ZSBtZW1iZXJzIHdpdGggcHVibGljIFByb3BlcnRpZXMKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwcml2YXRlICIgPDwgZGVjbGFyZV9maWVsZCgqbV9pdGVyLCBmYWxzZSwgIl8iKSA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9wcm9wZXJ0eShvdXQsICptX2l0ZXIsIHRydWUsIGZhbHNlKTsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX25ldGNvcmVfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KQoreworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGFzeW5jIFRhc2sgUmVhZEFzeW5jKFRQcm90b2NvbCBpcHJvdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaXByb3QuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInRyeSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgLy8gUmVxdWlyZWQgdmFyaWFibGVzIGFyZW4ndCBpbiBfX2lzc2V0LCBzbyB3ZSBuZWVkIHRtcCB2YXJzIHRvIGNoZWNrIHRoZW0KKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikKKyAgICB7CisgICAgICAgIGlmIChmaWVsZF9pc19yZXF1aXJlZCgqZl9pdGVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJib29sIGlzc2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBmYWxzZTsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlRGaWVsZCBmaWVsZDsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IGlwcm90LlJlYWRTdHJ1Y3RCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIndoaWxlICh0cnVlKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImZpZWxkID0gYXdhaXQgaXByb3QuUmVhZEZpZWxkQmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoZmllbGQuVHlwZSA9PSBUVHlwZS5TdG9wKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJzd2l0Y2ggKGZpZWxkLklEKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQorICAgIHsKKyAgICAgICAgYm9vbCBpc19yZXF1aXJlZCA9IGZpZWxkX2lzX3JlcXVpcmVkKCpmX2l0ZXIpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImNhc2UgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKGZpZWxkLlR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworCisgICAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlcik7CisgICAgICAgIGlmIChpc19yZXF1aXJlZCkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpc3NldF8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gdHJ1ZTsiIDw8IGVuZGw7CisgICAgICAgIH0KKworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJlbHNlIiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgVFByb3RvY29sVXRpbC5Ta2lwQXN5bmMoaXByb3QsIGZpZWxkLlR5cGUsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImRlZmF1bHQ6ICIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IFRQcm90b2NvbFV0aWwuU2tpcEFzeW5jKGlwcm90LCBmaWVsZC5UeXBlLCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBpcHJvdC5SZWFkRmllbGRFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IGlwcm90LlJlYWRTdHJ1Y3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworCisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpCisgICAgeworICAgICAgICBpZiAoZmllbGRfaXNfcmVxdWlyZWQoKCpmX2l0ZXIpKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIWlzc2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBKTsiIDw8IGVuZGw7CisgICAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICB9CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJmaW5hbGx5IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaXByb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkKK3sKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBhc3luYyBUYXNrIFdyaXRlQXN5bmMoVFByb3RvY29sIG9wcm90LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0cnkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgc3RydWMgPSBuZXcgVFN0cnVjdChcIiIgPDwgbmFtZSA8PCAiXCIpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVTdHJ1Y3RCZWdpbkFzeW5jKHN0cnVjLCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworCisgICAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgZmllbGQgPSBuZXcgVEZpZWxkKCk7IiA8PCBlbmRsOworICAgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikKKyAgICAgICAgeworICAgICAgICAgICAgYm9vbCBpc19yZXF1aXJlZCA9IGZpZWxkX2lzX3JlcXVpcmVkKCpmX2l0ZXIpOworICAgICAgICAgICAgYm9vbCBoYXNfZGVmYXVsdCA9IGZpZWxkX2hhc19kZWZhdWx0KCpmX2l0ZXIpOworICAgICAgICAgICAgaWYgKG51bGxhYmxlXyAmJiAhaGFzX2RlZmF1bHQgJiYgIWlzX3JlcXVpcmVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIpIDw8ICIgIT0gbnVsbCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICghaXNfcmVxdWlyZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYm9vbCBudWxsX2FsbG93ZWQgPSB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICAgICAgICAgICAgaWYgKG51bGxfYWxsb3dlZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIpIDw8ICIgIT0gbnVsbCAmJiBfX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChfX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZmllbGQuTmFtZSA9IFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJmaWVsZC5UeXBlID0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJmaWVsZC5JRCA9ICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVGaWVsZEJlZ2luQXN5bmMoZmllbGQsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisKKyAgICAgICAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIpOworCisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlRmllbGRFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgICAgICAgICAgaWYgKCFpc19yZXF1aXJlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVGaWVsZFN0b3BBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZVN0cnVjdEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImZpbmFsbHkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX25ldGNvcmVfc3RydWN0X3Jlc3VsdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkKK3sKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBhc3luYyBUYXNrIFdyaXRlQXN5bmMoVFByb3RvY29sIG9wcm90LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0cnkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgc3RydWMgPSBuZXcgVFN0cnVjdChcIiIgPDwgbmFtZSA8PCAiXCIpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVTdHJ1Y3RCZWdpbkFzeW5jKHN0cnVjLCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworCisgICAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgZmllbGQgPSBuZXcgVEZpZWxkKCk7IiA8PCBlbmRsOworICAgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJlbHNlIGlmIjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG51bGxhYmxlXykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXQgPDwgIih0aGlzLiIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIiAhPSBudWxsKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXQgPDwgIih0aGlzLl9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgICAgICAgIGJvb2wgbnVsbF9hbGxvd2VkID0gIW51bGxhYmxlXyAmJiB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICAgICAgICBpZiAobnVsbF9hbGxvd2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIpIDw8ICIgIT0gbnVsbCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZmllbGQuTmFtZSA9IFwiIiA8PCBwcm9wX25hbWUoKmZfaXRlcikgPDwgIlwiOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJmaWVsZC5UeXBlID0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJmaWVsZC5JRCA9ICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVGaWVsZEJlZ2luQXN5bmMoZmllbGQsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisKKyAgICAgICAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIpOworCisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlRmllbGRFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworCisgICAgICAgICAgICBpZiAobnVsbF9hbGxvd2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICB9CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZUZpZWxkU3RvcEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlU3RydWN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZmluYWxseSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3RfdG9zdHJpbmcob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkKK3sKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKFwiIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoXCIpOyIgPDwgZW5kbDsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgYm9vbCB1c2VGaXJzdEZsYWcgPSBmYWxzZTsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikKKyAgICB7CisgICAgICAgIGlmICghZmllbGRfaXNfcmVxdWlyZWQoKCpmX2l0ZXIpKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJib29sIF9fZmlyc3QgPSB0cnVlOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIHVzZUZpcnN0RmxhZyA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgYm9vbCBoYWRfcmVxdWlyZWQgPSBmYWxzZTsgLy8gc2V0IHRvIHRydWUgYWZ0ZXIgZmlyc3QgcmVxdWlyZWQgZmllbGQgaGFzIGJlZW4gcHJvY2Vzc2VkCisKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikKKyAgICB7CisgICAgICAgIGJvb2wgaXNfcmVxdWlyZWQgPSBmaWVsZF9pc19yZXF1aXJlZCgoKmZfaXRlcikpOworICAgICAgICBib29sIGhhc19kZWZhdWx0ID0gZmllbGRfaGFzX2RlZmF1bHQoKCpmX2l0ZXIpKTsKKyAgICAgICAgaWYgKG51bGxhYmxlXyAmJiAhaGFzX2RlZmF1bHQgJiYgIWlzX3JlcXVpcmVkKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIgIT0gbnVsbCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCFpc19yZXF1aXJlZCkKKyAgICAgICAgeworICAgICAgICAgICAgYm9vbCBudWxsX2FsbG93ZWQgPSB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICAgICAgICBpZiAobnVsbF9hbGxvd2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIiAhPSBudWxsICYmIF9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKF9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHVzZUZpcnN0RmxhZyAmJiAoIWhhZF9yZXF1aXJlZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYoIV9fZmlyc3QpIHsgc2IuQXBwZW5kKFwiLCBcIik7IH0iIDw8IGVuZGw7CisgICAgICAgICAgICBpZiAoIWlzX3JlcXVpcmVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiX19maXJzdCA9IGZhbHNlOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAic2IuQXBwZW5kKFwiIiA8PCBwcm9wX25hbWUoKmZfaXRlcikgPDwgIjogXCIpOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAic2IuQXBwZW5kKFwiLCAiIDw8IHByb3BfbmFtZSgqZl9pdGVyKSA8PCAiOiBcIik7IiA8PCBlbmRsOworICAgICAgICB9CisKKyAgICAgICAgdF90eXBlKiB0dHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgaWYgKHR0eXBlLT5pc194Y2VwdGlvbigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJzYi5BcHBlbmQoIiA8PCBwcm9wX25hbWUoKmZfaXRlcikgPDwgIj09IG51bGwgPyBcIjxudWxsPlwiIDogIiA8PCBwcm9wX25hbWUoKmZfaXRlcikgPDwgIi5Ub1N0cmluZygpKTsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInNiLkFwcGVuZCgiIDw8IHByb3BfbmFtZSgqZl9pdGVyKSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWlzX3JlcXVpcmVkKQorICAgICAgICB7CisgICAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaGFkX3JlcXVpcmVkID0gdHJ1ZTsgLy8gbm93IF9fZmlyc3QgbXVzdCBiZSBmYWxzZSwgc28gd2UgZG9uJ3QgbmVlZCB0byBjaGVjayBpdCBhbnltb3JlCisgICAgICAgIH0KKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInNiLkFwcGVuZChcIilcIik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gc2IuVG9TdHJpbmcoKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV0Y29yZV91bmlvbih0X3N0cnVjdCogdHVuaW9uKQoreworICAgIGludCBpYyA9IGluZGVudF9jb3VudCgpOworCisgICAgc3RyaW5nIGZfdW5pb25fbmFtZSA9IG5hbWVzcGFjZV9kaXJfICsgIi8iICsgKHR1bmlvbi0+Z2V0X25hbWUoKSkgKyAiLmNzIjsKKyAgICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfdW5pb247CisKKyAgICBmX3VuaW9uLm9wZW4oZl91bmlvbl9uYW1lLmNfc3RyKCkpOworCisgICAgZl91bmlvbiA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBuZXRjb3JlX3R5cGVfdXNpbmdzKCkgPDwgbmV0Y29yZV90aHJpZnRfdXNpbmdzKCkgPDwgZW5kbDsKKworICAgIGdlbmVyYXRlX25ldGNvcmVfdW5pb25fZGVmaW5pdGlvbihmX3VuaW9uLCB0dW5pb24pOworCisgICAgZl91bmlvbi5jbG9zZSgpOworCisgICAgaW5kZW50X3ZhbGlkYXRlKGljLCAiZ2VuZXJhdGVfbmV0Y29yZV91bmlvbi4iKTsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXRjb3JlX3VuaW9uX2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHVuaW9uKQoreworICAgIC8vIExldCdzIGRlZmluZSB0aGUgY2xhc3MgZmlyc3QKKyAgICBzdGFydF9uZXRjb3JlX25hbWVzcGFjZShvdXQpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgYWJzdHJhY3QgcGFydGlhbCBjbGFzcyAiIDw8IHR1bmlvbi0+Z2V0X25hbWUoKSA8PCAiIDogVEFic3RyYWN0QmFzZSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGFic3RyYWN0IFRhc2sgV3JpdGVBc3luYyhUUHJvdG9jb2wgdFByb3RvY29sLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgcmVhZG9ubHkgYm9vbCBJc3NldDsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBhYnN0cmFjdCBvYmplY3QgRGF0YSB7IGdldDsgfSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicHJvdGVjdGVkICIgPDwgdHVuaW9uLT5nZXRfbmFtZSgpIDw8ICIoYm9vbCBpc3NldCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJJc3NldCA9IGlzc2V0OyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgY2xhc3MgX19fdW5kZWZpbmVkIDogIiA8PCB0dW5pb24tPmdldF9uYW1lKCkgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIG92ZXJyaWRlIG9iamVjdCBEYXRhIHsgZ2V0IHsgcmV0dXJuIG51bGw7IH0gfSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicHVibGljIF9fX3VuZGVmaW5lZCgpIDogYmFzZShmYWxzZSkge30iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIG92ZXJyaWRlIFRhc2sgV3JpdGVBc3luYyhUUHJvdG9jb2wgb3Byb3QsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsIFwiQ2Fubm90IHBlcnNpc3QgYW4gdW5pb24gdHlwZSB3aGljaCBpcyBub3Qgc2V0LlwiKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHVuaW9uLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfbmV0Y29yZV91bmlvbl9jbGFzcyhvdXQsIHR1bmlvbiwgKCpmX2l0ZXIpKTsKKyAgICB9CisKKyAgICBnZW5lcmF0ZV9uZXRjb3JlX3VuaW9uX3JlYWRlcihvdXQsIHR1bmlvbik7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgZW5kX25ldGNvcmVfbmFtZXNwYWNlKG91dCk7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV0Y29yZV91bmlvbl9jbGFzcyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0dW5pb24sIHRfZmllbGQqIHRmaWVsZCkKK3sKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBjbGFzcyAiIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiIDogIiA8PCB0dW5pb24tPmdldF9uYW1lKCkgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHJpdmF0ZSAiIDw8IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpIDw8ICIgX2RhdGE7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgb3ZlcnJpZGUgb2JqZWN0IERhdGEgeyBnZXQgeyByZXR1cm4gX2RhdGE7IH0gfSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicHVibGljICIgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiIGRhdGEpIDogYmFzZSh0cnVlKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRoaXMuX2RhdGEgPSBkYXRhOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVBc3luYyhUUHJvdG9jb2wgb3Byb3QsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAidHJ5IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgc3RydWMgPSBuZXcgVFN0cnVjdChcIiIgPDwgdHVuaW9uLT5nZXRfbmFtZSgpIDw8ICJcIik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZVN0cnVjdEJlZ2luQXN5bmMoc3RydWMsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciBmaWVsZCA9IG5ldyBURmllbGQoKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImZpZWxkLk5hbWUgPSBcIiIgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICJcIjsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImZpZWxkLlR5cGUgPSAiIDw8IHR5cGVfdG9fZW51bSh0ZmllbGQtPmdldF90eXBlKCkpIDw8ICI7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJmaWVsZC5JRCA9ICIgPDwgdGZpZWxkLT5nZXRfa2V5KCkgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlRmllbGRCZWdpbkFzeW5jKGZpZWxkLCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworCisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgdGZpZWxkLCAiX2RhdGEiLCB0cnVlLCB0cnVlKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVGaWVsZEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlRmllbGRTdG9wQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVTdHJ1Y3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJmaW5hbGx5IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3RfZXF1YWxzKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpCit7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IHRoYXQpIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyIG90aGVyID0gdGhhdCBhcyAiIDw8IGNoZWNrX2FuZF9jb3JyZWN0X3N0cnVjdF9uYW1lKG5vcm1hbGl6ZV9uYW1lKHRzdHJ1Y3QtPmdldF9uYW1lKCkpKSA8PCAiOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKG90aGVyID09IG51bGwpIHJldHVybiBmYWxzZTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmIChSZWZlcmVuY2VFcXVhbHModGhpcywgb3RoZXIpKSByZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7CisKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworCisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpCisgICAgeworICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAiOworICAgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgZW5kbDsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJiYgIjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWZpZWxkX2lzX3JlcXVpcmVkKCgqZl9pdGVyKSkgJiYgIShudWxsYWJsZV8gJiYgIWZpZWxkX2hhc19kZWZhdWx0KCgqZl9pdGVyKSkpKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgIigoX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA9PSBvdGhlci5fX2lzc2V0LiIKKyAgICAgICAgICAgICAgICA8PCBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIpICYmICgoIV9faXNzZXQuIgorICAgICAgICAgICAgICAgIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIikgfHwgKCI7CisgICAgICAgIH0KKyAgICAgICAgdF90eXBlKiB0dHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSB8fCB0dHlwZS0+aXNfYmluYXJ5KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCAiVENvbGxlY3Rpb25zLkVxdWFscygiOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8ICJTeXN0ZW0uT2JqZWN0LkVxdWFscygiOworICAgICAgICB9CisgICAgICAgIG91dCA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiLCBvdGhlci4iIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIpIjsKKyAgICAgICAgaWYgKCFmaWVsZF9pc19yZXF1aXJlZCgoKmZfaXRlcikpICYmICEobnVsbGFibGVfICYmICFmaWVsZF9oYXNfZGVmYXVsdCgoKmZfaXRlcikpKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8ICIpKSkiOworICAgICAgICB9CisgICAgfQorICAgIGlmIChmaXJzdCkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF9oYXNoY29kZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KQoreworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImludCBoYXNoY29kZSA9IDA7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidW5jaGVja2VkIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQorICAgIHsKKyAgICAgICAgdF90eXBlKiB0dHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJoYXNoY29kZSA9IChoYXNoY29kZSAqIDM5NykgXiAiOworICAgICAgICBpZiAoZmllbGRfaXNfcmVxdWlyZWQoKCpmX2l0ZXIpKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8ICIoIjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChudWxsYWJsZV8pCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCAiKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIiA9PSBudWxsID8gMCA6ICI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgIighX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA/IDAgOiAiOworICAgICAgICB9CisgICAgICAgIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCAiKFRDb2xsZWN0aW9ucy5HZXRIYXNoQ29kZSgiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIpKSI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgIigiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIuR2V0SGFzaENvZGUoKSkiOworICAgICAgICB9CisgICAgICAgIG91dCA8PCAiKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gaGFzaGNvZGU7IiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpCit7CisgICAgaW50IGljID0gaW5kZW50X2NvdW50KCk7CisKKyAgICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBuYW1lc3BhY2VfZGlyXyArICIvIiArIHNlcnZpY2VfbmFtZV8gKyAiLmNzIjsKKyAgICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZTsKKyAgICBmX3NlcnZpY2Uub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKKworICAgIGZfc2VydmljZSA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBuZXRjb3JlX3R5cGVfdXNpbmdzKCkgPDwgbmV0Y29yZV90aHJpZnRfdXNpbmdzKCkgPDwgZW5kbDsKKworICAgIHN0YXJ0X25ldGNvcmVfbmFtZXNwYWNlKGZfc2VydmljZSk7CisKKyAgICBmX3NlcnZpY2UgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBwYXJ0aWFsIGNsYXNzICIgPDwgbm9ybWFsaXplX25hbWUoc2VydmljZV9uYW1lXykgPDwgZW5kbAorICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKGZfc2VydmljZSwgdHNlcnZpY2UpOworICAgIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KGZfc2VydmljZSwgdHNlcnZpY2UpOworICAgIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKGZfc2VydmljZSwgdHNlcnZpY2UpOworICAgIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyhmX3NlcnZpY2UsIHRzZXJ2aWNlKTsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgZW5kX25ldGNvcmVfbmFtZXNwYWNlKGZfc2VydmljZSk7CisgICAgZl9zZXJ2aWNlLmNsb3NlKCk7CisKKyAgICBpbmRlbnRfdmFsaWRhdGUoaWMsICJnZW5lcmF0ZV9zZXJ2aWNlLiIpOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSkKK3sKKyAgICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICAgIHN0cmluZyBleHRlbmRzX2lmYWNlID0gIiI7CisgICAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpCisgICAgeworICAgICAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICAgICAgZXh0ZW5kc19pZmFjZSA9ICIgOiAiICsgZXh0ZW5kcyArICIuSUFzeW5jIjsKKyAgICB9CisKKyAgICAvL291dCA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBnZW5lcmF0ZV9uZXRjb3JlX2RvYyhvdXQsIHRzZXJ2aWNlKTsKKworICAgIGlmICh3Y2ZfKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbU2VydmljZUNvbnRyYWN0KE5hbWVzcGFjZT1cIiIgPDwgd2NmX25hbWVzcGFjZV8gPDwgIlwiKV0iIDw8IGVuZGw7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgaW50ZXJmYWNlIElBc3luYyIgPDwgZXh0ZW5kc19pZmFjZSA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworCisgICAgaW5kZW50X3VwKCk7CisgICAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKyAgICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikKKyAgICB7CisgICAgICAgIGdlbmVyYXRlX25ldGNvcmVfZG9jKG91dCwgKmZfaXRlcik7CisKKyAgICAgICAgLy8gaWYgd2UncmUgdXNpbmcgV0NGLCBhZGQgdGhlIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlcworICAgICAgICBpZiAod2NmXykKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbT3BlcmF0aW9uQ29udHJhY3RdIiA8PCBlbmRsOworCisgICAgICAgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICAgICAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICAgICAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW0ZhdWx0Q29udHJhY3QodHlwZW9mKCIgKyB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpICsgIkZhdWx0KSldIiA8PCBlbmRsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luYygqZl9pdGVyKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyhvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpCit7CisgICAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICAgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKQorICAgIHsKKyAgICAgICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgICAgICBnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF9kZWZpbml0aW9uKG91dCwgdHMsIGZhbHNlLCB0cnVlKTsKKyAgICAgICAgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyhvdXQsICpmX2l0ZXIpOworICAgIH0KK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudChvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpCit7CisgICAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiIjsKKyAgICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgICAgICBleHRlbmRzX2NsaWVudCA9IGV4dGVuZHMgKyAiLkNsaWVudCwgIjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZXh0ZW5kc19jbGllbnQgPSAiVEJhc2VDbGllbnQsIElEaXNwb3NhYmxlLCAiOworICAgIH0KKworICAgIG91dCA8PCBlbmRsOworCisgICAgZ2VuZXJhdGVfbmV0Y29yZV9kb2Mob3V0LCB0c2VydmljZSk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBjbGFzcyBDbGllbnQgOiAiIDw8IGV4dGVuZHNfY2xpZW50IDw8ICJJQXN5bmMiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBDbGllbnQoVFByb3RvY29sIHByb3RvY29sKSA6IHRoaXMocHJvdG9jb2wsIHByb3RvY29sKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgQ2xpZW50KFRQcm90b2NvbCBpbnB1dFByb3RvY29sLCBUUHJvdG9jb2wgb3V0cHV0UHJvdG9jb2wpIDogYmFzZShpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCkiCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZ1bmN0aW9uc19pdGVyYXRvcjsKKworICAgIGZvciAoZnVuY3Rpb25zX2l0ZXJhdG9yID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZ1bmN0aW9uc19pdGVyYXRvciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZnVuY3Rpb25zX2l0ZXJhdG9yKQorICAgIHsKKyAgICAgICAgc3RyaW5nIGZ1bmN0aW9uX25hbWUgPSBjb3JyZWN0X2Z1bmN0aW9uX25hbWVfZm9yX2FzeW5jKCgqZnVuY3Rpb25zX2l0ZXJhdG9yKS0+Z2V0X25hbWUoKSk7CisKKyAgICAgICAgLy8gYXN5bmMKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgYXN5bmMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmMoKmZ1bmN0aW9uc19pdGVyYXRvciwgIiIpIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgICBzdHJpbmcgYXJnc25hbWUgPSAoKmZ1bmN0aW9uc19pdGVyYXRvciktPmdldF9uYW1lKCkgKyAiQXJncyI7CisKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBPdXRwdXRQcm90b2NvbC5Xcml0ZU1lc3NhZ2VCZWdpbkFzeW5jKG5ldyBUTWVzc2FnZShcIiIgPDwgZnVuY3Rpb25fbmFtZQorICAgICAgICAgICAgPDwgIlwiLCAiIDw8ICgoKmZ1bmN0aW9uc19pdGVyYXRvciktPmlzX29uZXdheSgpID8gIlRNZXNzYWdlVHlwZS5PbmV3YXkiIDogIlRNZXNzYWdlVHlwZS5DYWxsIikgPDwgIiwgU2VxSWQpLCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidmFyIGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsOworCisgICAgICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmdW5jdGlvbnNfaXRlcmF0b3IpLT5nZXRfYXJnbGlzdCgpOworICAgICAgICBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcoYXJnX3N0cnVjdCk7CisgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworCisgICAgICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImFyZ3MuIiA8PCBwcm9wX25hbWUoKmZsZF9pdGVyKSA8PCAiID0gIiA8PCBub3JtYWxpemVfbmFtZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIH0KKworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IGFyZ3MuV3JpdGVBc3luYyhPdXRwdXRQcm90b2NvbCwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IE91dHB1dFByb3RvY29sLldyaXRlTWVzc2FnZUVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBPdXRwdXRQcm90b2NvbC5UcmFuc3BvcnQuRmx1c2hBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworCisgICAgICAgIGlmICghKCpmdW5jdGlvbnNfaXRlcmF0b3IpLT5pc19vbmV3YXkoKSkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIHJlc3VsdG5hbWUgPSAoKmZ1bmN0aW9uc19pdGVyYXRvciktPmdldF9uYW1lKCkgKyAiUmVzdWx0IjsKKyAgICAgICAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7CisgICAgICAgICAgICB0X3N0cnVjdCogeHMgPSAoKmZ1bmN0aW9uc19pdGVyYXRvciktPmdldF94Y2VwdGlvbnMoKTsKKyAgICAgICAgICAgIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyh4cywgeHMtPmdldF9tZW1iZXJzKCksIHJlc3VsdG5hbWUpOworCisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ2YXIgbXNnID0gYXdhaXQgSW5wdXRQcm90b2NvbC5SZWFkTWVzc2FnZUJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAobXNnLlR5cGUgPT0gVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbikiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgICAgIGluZGVudF91cCgpOworCisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciB4ID0gYXdhaXQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlJlYWRBc3luYyhJbnB1dFByb3RvY29sLCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IElucHV0UHJvdG9jb2wuUmVhZE1lc3NhZ2VFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInRocm93IHg7IiA8PCBlbmRsOworICAgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ2YXIgcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IHJlc3VsdC5SZWFkQXN5bmMoSW5wdXRQcm90b2NvbCwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBJbnB1dFByb3RvY29sLlJlYWRNZXNzYWdlRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKworICAgICAgICAgICAgaWYgKCEoKmZ1bmN0aW9uc19pdGVyYXRvciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobnVsbGFibGVfKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVfY2FuX2JlX251bGwoKCpmdW5jdGlvbnNfaXRlcmF0b3IpLT5nZXRfcmV0dXJudHlwZSgpKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0LlN1Y2Nlc3MgIT0gbnVsbCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gcmVzdWx0LlN1Y2Nlc3M7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC5TdWNjZXNzLkhhc1ZhbHVlKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiByZXN1bHQuU3VjY2Vzcy5WYWx1ZTsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC5fX2lzc2V0LnN1Y2Nlc3MpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHJlc3VsdC5TdWNjZXNzOyIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgICAgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgICAgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobnVsbGFibGVfKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0LiIgPDwgcHJvcF9uYW1lKCp4X2l0ZXIpIDw8ICIgIT0gbnVsbCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0aHJvdyByZXN1bHQuIiA8PCBwcm9wX25hbWUoKnhfaXRlcikgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0Ll9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSgoKnhfaXRlciktPmdldF9uYW1lKCkpIDw8ICIpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGhyb3cgcmVzdWx0LiIgPDwgcHJvcF9uYW1lKCp4X2l0ZXIpIDw8ICI7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKCpmdW5jdGlvbnNfaXRlcmF0b3IpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGhyb3cgbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5NaXNzaW5nUmVzdWx0LCBcIiIKKyAgICAgICAgICAgICAgICAgICAgPDwgZnVuY3Rpb25fbmFtZSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIik7IiA8PCBlbmRsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcoKCpmdW5jdGlvbnNfaXRlcmF0b3IpLT5nZXRfeGNlcHRpb25zKCkpOworICAgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKQoreworICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICAgIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOworICAgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gZXh0ZW5kcyArICIuQXN5bmNQcm9jZXNzb3IsICI7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgY2xhc3MgQXN5bmNQcm9jZXNzb3IgOiAiIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8ICJJVEFzeW5jUHJvY2Vzc29yIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworCisgICAgaW5kZW50X3VwKCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInByaXZhdGUgSUFzeW5jIF9pQXN5bmM7IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBBc3luY1Byb2Nlc3NvcihJQXN5bmMgaUFzeW5jKSI7CisKKyAgICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCAiIDogYmFzZShpQXN5bmMpIjsKKyAgICB9CisKKyAgICBvdXQgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKGlBc3luYyA9PSBudWxsKSB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKG5hbWVvZihpQXN5bmMpKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiX2lBc3luYyA9IGlBc3luYzsiIDw8IGVuZGw7CisKKyAgICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikKKyAgICB7CisgICAgICAgIHN0cmluZyBmdW5jdGlvbl9uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInByb2Nlc3NNYXBfW1wiIiA8PCBjb3JyZWN0X2Z1bmN0aW9uX25hbWVfZm9yX2FzeW5jKGZ1bmN0aW9uX25hbWUpIDw8ICJcIl0gPSAiIDw8IGZ1bmN0aW9uX25hbWUgPDwgIl9Qcm9jZXNzQXN5bmM7IiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGw7CisKKyAgICBpZiAoZXh0ZW5kcy5lbXB0eSgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgZGVsZWdhdGUgVGFzayBQcm9jZXNzRnVuY3Rpb24oaW50IHNlcWlkLCBUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpZiAoZXh0ZW5kcy5lbXB0eSgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgRGljdGlvbmFyeTxzdHJpbmcsIFByb2Nlc3NGdW5jdGlvbj4gcHJvY2Vzc01hcF8gPSBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIFByb2Nlc3NGdW5jdGlvbj4oKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBpZiAoZXh0ZW5kcy5lbXB0eSgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgYXN5bmMgVGFzazxib29sPiBQcm9jZXNzQXN5bmMoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpIiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGF3YWl0IFByb2Nlc3NBc3luYyhpcHJvdCwgb3Byb3QsIENhbmNlbGxhdGlvblRva2VuLk5vbmUpOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgYXN5bmMgVGFzazxib29sPiBQcm9jZXNzQXN5bmMoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKSIgPDwgZW5kbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgbmV3IGFzeW5jIFRhc2s8Ym9vbD4gUHJvY2Vzc0FzeW5jKFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBhd2FpdCBQcm9jZXNzQXN5bmMoaXByb3QsIG9wcm90LCBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIG5ldyBhc3luYyBUYXNrPGJvb2w+IFByb2Nlc3NBc3luYyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pIiA8PCBlbmRsOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRyeSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciBtc2cgPSBhd2FpdCBpcHJvdC5SZWFkTWVzc2FnZUJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJQcm9jZXNzRnVuY3Rpb24gZm47IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJwcm9jZXNzTWFwXy5UcnlHZXRWYWx1ZShtc2cuTmFtZSwgb3V0IGZuKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKGZuID09IG51bGwpIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgVFByb3RvY29sVXRpbC5Ta2lwQXN5bmMoaXByb3QsIFRUeXBlLlN0cnVjdCwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgaXByb3QuUmVhZE1lc3NhZ2VFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ2YXIgeCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24gKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLlVua25vd25NZXRob2QsIFwiSW52YWxpZCBtZXRob2QgbmFtZTogJ1wiICsgbXNnLk5hbWUgKyBcIidcIik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbkFzeW5jKG5ldyBUTWVzc2FnZShtc2cuTmFtZSwgVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbiwgbXNnLlNlcUlEKSwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgeC5Xcml0ZUFzeW5jKG9wcm90LCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZU1lc3NhZ2VFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5UcmFuc3BvcnQuRmx1c2hBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgZm4obXNnLlNlcUlELCBpcHJvdCwgb3Byb3QsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImNhdGNoIChJT0V4Y2VwdGlvbikiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gZmFsc2U7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInJldHVybiB0cnVlOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uX2FzeW5jKG91dCwgdHNlcnZpY2UsICpmX2l0ZXIpOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikKK3sKKyAgICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7CisgICAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKKyAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKQorICAgIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7CisgICAgfQorCisgICAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQorICAgIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKKyAgICB9CisKKyAgICBnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF9kZWZpbml0aW9uKG91dCwgJnJlc3VsdCwgZmFsc2UsIHRydWUsIHRydWUpOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb25fYXN5bmMob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pCit7CisgICAgKHZvaWQpdHNlcnZpY2U7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgYXN5bmMgVGFzayAiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICA8PCAiX1Byb2Nlc3NBc3luYyhpbnQgc2VxaWQsIFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBzdHJpbmcgYXJnc25hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiQXJncyI7CisgICAgc3RyaW5nIHJlc3VsdG5hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiUmVzdWx0IjsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyIGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBhcmdzLlJlYWRBc3luYyhpcHJvdCwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgaXByb3QuUmVhZE1lc3NhZ2VFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworCisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidHJ5IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisKKyAgICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRyeSIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgIH0KKworICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgb3V0IDw8IGluZGVudCgpOworICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpCisgICAgeworICAgICAgICBvdXQgPDwgInJlc3VsdC5TdWNjZXNzID0gIjsKKyAgICB9CisKKyAgICBvdXQgPDwgImF3YWl0IF9pQXN5bmMuIiA8PCBub3JtYWxpemVfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpIDw8ICJBc3luYygiOworCisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKGFyZ19zdHJ1Y3QpOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQorICAgIHsKKyAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICB7CisgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8ICIsICI7CisgICAgICAgIH0KKworICAgICAgICBvdXQgPDwgImFyZ3MuIiA8PCBwcm9wX25hbWUoKmZfaXRlcik7CisgICAgICAgIGlmIChudWxsYWJsZV8gJiYgIXR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8ICIuVmFsdWUiOworICAgICAgICB9CisgICAgfQorCisgICAgY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKGFyZ19zdHJ1Y3QpOworCisgICAgaWYgKCFmaXJzdCkKKyAgICB7CisgICAgICAgIG91dCA8PCAiLCAiOworICAgIH0KKworICAgIG91dCA8PCAiY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKworICAgIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyh4cywgeHMtPmdldF9tZW1iZXJzKCksIHJlc3VsdG5hbWUpOworICAgIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkKKyAgICB7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJjYXRjaCAoIiA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpIDw8ICIgIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIikiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKworICAgICAgICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgcHJvcF9uYW1lKCp4X2l0ZXIpIDw8ICIgPSAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbkFzeW5jKG5ldyBUTWVzc2FnZShcIiIKKyAgICAgICAgICAgICAgICA8PCBjb3JyZWN0X2Z1bmN0aW9uX25hbWVfZm9yX2FzeW5jKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgPDwgIlwiLCBUTWVzc2FnZVR5cGUuUmVwbHksIHNlcWlkKSwgY2FuY2VsbGF0aW9uVG9rZW4pOyAiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCByZXN1bHQuV3JpdGVBc3luYyhvcHJvdCwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZyh4cyk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICB0aHJvdzsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImNhdGNoIChFeGNlcHRpb24gZXgpIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJDb25zb2xlLkVycm9yLldyaXRlTGluZShcIkVycm9yIG9jY3VycmVkIGluIHByb2Nlc3NvcjpcIik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJDb25zb2xlLkVycm9yLldyaXRlTGluZShleC5Ub1N0cmluZygpKTsiIDw8IGVuZGw7CisKKyAgICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkKKyAgICB7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgeCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW50ZXJuYWxFcnJvcixcIiBJbnRlcm5hbCBlcnJvci5cIik7IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVNZXNzYWdlQmVnaW5Bc3luYyhuZXcgVE1lc3NhZ2UoXCIiIDw8IGNvcnJlY3RfZnVuY3Rpb25fbmFtZV9mb3JfYXN5bmModGZ1bmN0aW9uLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgPDwgIlwiLCBUTWVzc2FnZVR5cGUuRXhjZXB0aW9uLCBzZXFpZCksIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCB4LldyaXRlQXN5bmMob3Byb3QsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVNZXNzYWdlRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LlRyYW5zcG9ydC5GbHVzaEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXRjb3JlX3VuaW9uX3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0dW5pb24pCit7CisgICAgLy8gVGhhbmtzIHRvIFRIUklGVC0xNzY4LCB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMgaW4gdGhlIHVuaW9uCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHVuaW9uLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIHN0YXRpYyBhc3luYyBUYXNrPCIgPDwgdHVuaW9uLT5nZXRfbmFtZSgpIDw8ICI+IFJlYWRBc3luYyhUUHJvdG9jb2wgaXByb3QsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpcHJvdC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRyeSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8IHR1bmlvbi0+Z2V0X25hbWUoKSA8PCAiIHJldHZhbDsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBpcHJvdC5SZWFkU3RydWN0QmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiVEZpZWxkIGZpZWxkID0gYXdhaXQgaXByb3QuUmVhZEZpZWxkQmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIC8vIHdlIGNhbm5vdCBoYXZlIHRoZSBmaXJzdCBmaWVsZCBiZSBhIHN0b3AgLS0gd2UgbXVzdCBoYXZlIGEgc2luZ2xlIGZpZWxkIGRlZmluZWQKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChmaWVsZC5UeXBlID09IFRUeXBlLlN0b3ApIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBpcHJvdC5SZWFkRmllbGRFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dmFsID0gbmV3IF9fX3VuZGVmaW5lZCgpOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJlbHNlIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJzd2l0Y2ggKGZpZWxkLklEKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworCisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImNhc2UgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKGZpZWxkLlR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiB0ZW1wOyIgPDwgZW5kbDsKKyAgICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAoKmZfaXRlciksICJ0ZW1wIiwgdHJ1ZSk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dmFsID0gbmV3ICIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIodGVtcCk7IiA8PCBlbmRsOworCisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsgIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgYXdhaXQgVFByb3RvY29sVXRpbC5Ta2lwQXN5bmMoaXByb3QsIGZpZWxkLlR5cGUsIGNhbmNlbGxhdGlvblRva2VuKTsiCisgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHZhbCA9IG5ldyBfX191bmRlZmluZWQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJkZWZhdWx0OiAiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBUUHJvdG9jb2xVdGlsLlNraXBBc3luYyhpcHJvdCwgZmllbGQuVHlwZSwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAicmV0dmFsID0gbmV3IF9fX3VuZGVmaW5lZCgpOyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgc2NvcGVfZG93bihvdXQpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBpcHJvdC5SZWFkRmllbGRFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoKGF3YWl0IGlwcm90LlJlYWRGaWVsZEJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pKS5UeXBlICE9IFRUeXBlLlN0b3ApIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEpOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKG91dCk7CisKKyAgICAvLyBlbmQgb2YgZWxzZSBmb3IgVFN0b3AKKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBpcHJvdC5SZWFkU3RydWN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiByZXR2YWw7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisKKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJmaW5hbGx5IiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpcHJvdC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKG91dCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCwgYm9vbCBpc19wcm9wZXJ0eWxlc3MpCit7CisgICAgdF90eXBlKiB0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOworICAgIHdoaWxlICh0eXBlLT5pc190eXBlZGVmKCkpCisgICAgeworICAgICAgICB0eXBlID0gc3RhdGljX2Nhc3Q8dF90eXBlZGVmKj4odHlwZSktPmdldF90eXBlKCk7CisgICAgfQorCisgICAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkKKyAgICB7CisgICAgICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICAgIH0KKworICAgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgKGlzX3Byb3BlcnR5bGVzcyA/ICIiIDogcHJvcF9uYW1lKHRmaWVsZCkpOworCisgICAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCBzdGF0aWNfY2FzdDx0X3N0cnVjdCo+KHR5cGUpLCBuYW1lKTsKKyAgICB9CisgICAgZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKKyAgICB9CisgICAgZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IG5hbWUgPDwgIiA9ICI7CisKKyAgICAgICAgaWYgKHR5cGUtPmlzX2VudW0oKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8ICIoIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIpIjsKKyAgICAgICAgfQorCisgICAgICAgIG91dCA8PCAiYXdhaXQgaXByb3QuIjsKKworICAgICAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSBzdGF0aWNfY2FzdDx0X2Jhc2VfdHlwZSo+KHR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgICAgICAgc3dpdGNoICh0YmFzZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgICAgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgIlJlYWRCaW5hcnlBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8ICJSZWFkU3RyaW5nQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICAgICAgICAgIG91dCA8PCAiUmVhZEJvb2xBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgICAgICAgICAgb3V0IDw8ICJSZWFkQnl0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgICAgICAgICAgb3V0IDw8ICJSZWFkSTE2QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgICAgICAgICBvdXQgPDwgIlJlYWRJMzJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgICAgICAgIG91dCA8PCAiUmVhZEk2NEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgICAgICAgICAgb3V0IDw8ICJSZWFkRG91YmxlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQyMgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8ICJSZWFkSTMyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyI7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLCB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOworICAgIH0KK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkKK3sKKyAgICBpZiAodW5pb25fICYmIHRzdHJ1Y3QtPmlzX3VuaW9uKCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBhd2FpdCAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiLlJlYWRBc3luYyhpcHJvdCwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoKTsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCAiIDw8IHByZWZpeCA8PCAiLlJlYWRBc3luYyhpcHJvdCwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICB9Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkKK3sKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBzdHJpbmcgb2JqOworCisgICAgaWYgKHR0eXBlLT5pc19tYXAoKSkKKyAgICB7CisgICAgICAgIG9iaiA9IHRtcCgiX21hcCIpOworICAgIH0KKyAgICBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpCisgICAgeworICAgICAgICBvYmogPSB0bXAoIl9zZXQiKTsKKyAgICB9CisgICAgZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkKKyAgICB7CisgICAgICAgIG9iaiA9IHRtcCgiX2xpc3QiKTsKKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOworICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlRNYXAgIiA8PCBvYmogPDwgIiA9IGF3YWl0IGlwcm90LlJlYWRNYXBCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiVFNldCAiIDw8IG9iaiA8PCAiID0gYXdhaXQgaXByb3QuUmVhZFNldEJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICB9CisgICAgZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiVExpc3QgIiA8PCBvYmogPDwgIiA9IGF3YWl0IGlwcm90LlJlYWRMaXN0QmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIH0KKworICAgIHN0cmluZyBpID0gdG1wKCJfaSIpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZm9yKGludCAiIDw8IGkgPDwgIiA9IDA7ICIgPDwgaSA8PCAiIDwgIiA8PCBvYmogPDwgIi5Db3VudDsgKysiIDw8IGkgPDwgIikiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBpZiAodHR5cGUtPmlzX21hcCgpKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCBzdGF0aWNfY2FzdDx0X21hcCo+KHR0eXBlKSwgcHJlZml4KTsKKyAgICB9CisgICAgZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCBzdGF0aWNfY2FzdDx0X3NldCo+KHR0eXBlKSwgcHJlZml4KTsKKyAgICB9CisgICAgZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkKKyAgICB7CisgICAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsIHN0YXRpY19jYXN0PHRfbGlzdCo+KHR0eXBlKSwgcHJlZml4KTsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IGlwcm90LlJlYWRNYXBFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIH0KKyAgICBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IGlwcm90LlJlYWRTZXRFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIH0KKyAgICBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBpcHJvdC5SZWFkTGlzdEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RyaW5nIHByZWZpeCkKK3sKKyAgICBzdHJpbmcga2V5ID0gdG1wKCJfa2V5Iik7CisgICAgc3RyaW5nIHZhbCA9IHRtcCgiX3ZhbCIpOworCisgICAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOworICAgIHRfZmllbGQgZnZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBkZWNsYXJlX2ZpZWxkKCZma2V5KSA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBkZWNsYXJlX2ZpZWxkKCZmdmFsKSA8PCBlbmRsOworCisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSk7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICJbIiA8PCBrZXkgPDwgIl0gPSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgcHJlZml4KQoreworICAgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICAgIHRfZmllbGQgZmVsZW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKKworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIi5BZGQoIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgcHJlZml4KQoreworICAgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOworICAgIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgZGVjbGFyZV9maWVsZCgmZmVsZW0pIDw8IGVuZGw7CisKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIuQWRkKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4LCBib29sIGlzX2VsZW1lbnQsIGJvb2wgaXNfcHJvcGVydHlsZXNzKQoreworICAgIHRfdHlwZSogdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgICB3aGlsZSAodHlwZS0+aXNfdHlwZWRlZigpKQorICAgIHsKKyAgICAgICAgdHlwZSA9IHN0YXRpY19jYXN0PHRfdHlwZWRlZio+KHR5cGUpLT5nZXRfdHlwZSgpOworICAgIH0KKworICAgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgKGlzX3Byb3BlcnR5bGVzcyA/ICIiIDogcHJvcF9uYW1lKHRmaWVsZCkpOworCisgICAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkKKyAgICB7CisgICAgICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIG5hbWU7CisgICAgfQorCisgICAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwgc3RhdGljX2Nhc3Q8dF9zdHJ1Y3QqPih0eXBlKSwgbmFtZSk7CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOworICAgIH0KKyAgICBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LiI7CisKKyAgICAgICAgc3RyaW5nIG51bGxhYmxlX25hbWUgPSBudWxsYWJsZV8gJiYgIWlzX2VsZW1lbnQgJiYgIWZpZWxkX2lzX3JlcXVpcmVkKHRmaWVsZCkgPyBuYW1lICsgIi5WYWx1ZSIgOiBuYW1lOworCisgICAgICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkKKyAgICAgICAgeworICAgICAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9IHN0YXRpY19jYXN0PHRfYmFzZV90eXBlKj4odHlwZSktPmdldF9iYXNlKCk7CisgICAgICAgICAgICBzd2l0Y2ggKHRiYXNlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICAgICAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCAiV3JpdGVCaW5hcnlBc3luYygiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgIldyaXRlU3RyaW5nQXN5bmMoIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3V0IDw8IG5hbWUgPDwgIiwgY2FuY2VsbGF0aW9uVG9rZW4pOyI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgICAgICAgICAgb3V0IDw8ICJXcml0ZUJvb2xBc3luYygiIDw8IG51bGxhYmxlX25hbWUgPDwgIiwgY2FuY2VsbGF0aW9uVG9rZW4pOyI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICAgICAgICAgIG91dCA8PCAiV3JpdGVCeXRlQXN5bmMoIiA8PCBudWxsYWJsZV9uYW1lIDw8ICIsIGNhbmNlbGxhdGlvblRva2VuKTsiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgICAgICAgICAgb3V0IDw8ICJXcml0ZUkxNkFzeW5jKCIgPDwgbnVsbGFibGVfbmFtZSA8PCAiLCBjYW5jZWxsYXRpb25Ub2tlbik7IjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICAgICAgICAgIG91dCA8PCAiV3JpdGVJMzJBc3luYygiIDw8IG51bGxhYmxlX25hbWUgPDwgIiwgY2FuY2VsbGF0aW9uVG9rZW4pOyI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgICAgICAgICBvdXQgPDwgIldyaXRlSTY0QXN5bmMoIiA8PCBudWxsYWJsZV9uYW1lIDw8ICIsIGNhbmNlbGxhdGlvblRva2VuKTsiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgICAgICAgICAgb3V0IDw8ICJXcml0ZURvdWJsZUFzeW5jKCIgPDwgbnVsbGFibGVfbmFtZSA8PCAiLCBjYW5jZWxsYXRpb25Ub2tlbik7IjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDIyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgIldyaXRlSTMyQXN5bmMoKGludCkiIDw8IG51bGxhYmxlX25hbWUgPDwgIiwgY2FuY2VsbGF0aW9uVG9rZW4pOyI7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSAnJXMlcycgVFlQRSAnJXMnXG4iLCBwcmVmaXguY19zdHIoKSwgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKKyAgICB9Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KQoreworICAgICh2b2lkKXRzdHJ1Y3Q7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCAiIDw8IHByZWZpeCA8PCAiLldyaXRlQXN5bmMob3Byb3QsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpCit7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgaWYgKHR0eXBlLT5pc19tYXAoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVNYXBCZWdpbkFzeW5jKG5ldyBUTWFwKCIgPDwgdHlwZV90b19lbnVtKHN0YXRpY19jYXN0PHRfbWFwKj4odHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkKKyAgICAgICAgICAgIDw8ICIsICIgPDwgdHlwZV90b19lbnVtKHN0YXRpY19jYXN0PHRfbWFwKj4odHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIiA8PCBwcmVmaXgKKyAgICAgICAgICAgIDw8ICIuQ291bnQpLCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIH0KKyAgICBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlU2V0QmVnaW5Bc3luYyhuZXcgVFNldCgiIDw8IHR5cGVfdG9fZW51bShzdGF0aWNfY2FzdDx0X3NldCo+KHR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKQorICAgICAgICAgICAgPDwgIiwgIiA8PCBwcmVmaXggPDwgIi5Db3VudCksIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlTGlzdEJlZ2luQXN5bmMobmV3IFRMaXN0KCIKKyAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bShzdGF0aWNfY2FzdDx0X2xpc3QqPih0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PCBwcmVmaXggPDwgIi5Db3VudCksIGNhbmNlbGxhdGlvblRva2VuKTsiCisgICAgICAgICAgICA8PCBlbmRsOworICAgIH0KKworICAgIHN0cmluZyBpdGVyID0gdG1wKCJfaXRlciIpOworICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImZvcmVhY2ggKCIgPDwgdHlwZV9uYW1lKHN0YXRpY19jYXN0PHRfbWFwKj4odHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiAiIDw8IGl0ZXIKKyAgICAgICAgICAgIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIi5LZXlzKSI7CisgICAgfQorICAgIGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZm9yZWFjaCAoIiA8PCB0eXBlX25hbWUoc3RhdGljX2Nhc3Q8dF9zZXQqPih0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiAiIDw8IGl0ZXIKKyAgICAgICAgICAgIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIikiOworICAgIH0KKyAgICBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJmb3JlYWNoICgiIDw8IHR5cGVfbmFtZShzdGF0aWNfY2FzdDx0X2xpc3QqPih0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiAiIDw8IGl0ZXIKKyAgICAgICAgICAgIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIikiOworICAgIH0KKworICAgIG91dCA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCBzdGF0aWNfY2FzdDx0X21hcCo+KHR0eXBlKSwgaXRlciwgcHJlZml4KTsKKyAgICB9CisgICAgZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgc3RhdGljX2Nhc3Q8dF9zZXQqPih0dHlwZSksIGl0ZXIpOworICAgIH0KKyAgICBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsIHN0YXRpY19jYXN0PHRfbGlzdCo+KHR0eXBlKSwgaXRlcik7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgICBpZiAodHR5cGUtPmlzX21hcCgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZU1hcEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVTZXRFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIH0KKyAgICBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZUxpc3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdHJpbmcgaXRlciwgc3RyaW5nIG1hcCkKK3sKKyAgICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwgaXRlcik7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCwgIiIsIHRydWUpOworICAgIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCBtYXAgKyAiWyIgKyBpdGVyICsgIl0iKTsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCAiIiwgdHJ1ZSk7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBpdGVyKQoreworICAgIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIsIHRydWUpOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgaXRlcikKK3sKKyAgICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIiwgdHJ1ZSk7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvcGVydHkob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaXNQdWJsaWMsIGJvb2wgZ2VuZXJhdGVJc3NldCkKK3sKKyAgICBnZW5lcmF0ZV9uZXRjb3JlX3Byb3BlcnR5KG91dCwgdGZpZWxkLCBpc1B1YmxpYywgZ2VuZXJhdGVJc3NldCwgIl8iKTsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXRjb3JlX3Byb3BlcnR5KG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBib29sIGlzUHVibGljLCBib29sIGdlbmVyYXRlSXNzZXQsIHN0cmluZyBmaWVsZFByZWZpeCkKK3sKKyAgICBpZiAoKHNlcmlhbGl6ZV8gfHwgd2NmXykgJiYgaXNQdWJsaWMpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltEYXRhTWVtYmVyKE9yZGVyID0gMCldIiA8PCBlbmRsOworICAgIH0KKyAgICBib29sIGhhc19kZWZhdWx0ID0gZmllbGRfaGFzX2RlZmF1bHQodGZpZWxkKTsKKyAgICBib29sIGlzX3JlcXVpcmVkID0gZmllbGRfaXNfcmVxdWlyZWQodGZpZWxkKTsKKyAgICBpZiAoKG51bGxhYmxlXyAmJiAhaGFzX2RlZmF1bHQpIHx8IGlzX3JlcXVpcmVkKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IChpc1B1YmxpYyA/ICJwdWJsaWMgIiA6ICJwcml2YXRlICIpIDw8IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgaXNfcmVxdWlyZWQpIDw8ICIgIiA8PCBwcm9wX25hbWUodGZpZWxkKSA8PCAiIHsgZ2V0OyBzZXQ7IH0iIDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAoaXNQdWJsaWMgPyAicHVibGljICIgOiAicHJpdmF0ZSAiKSAgPDwgdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlLCB0cnVlKSA8PCAiICIgPDwgcHJvcF9uYW1lKHRmaWVsZCkgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworCisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZ2V0IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgICAgYm9vbCB1c2VfbnVsbGFibGUgPSBmYWxzZTsKKyAgICAgICAgaWYgKG51bGxhYmxlXykKKyAgICAgICAgeworICAgICAgICAgICAgdF90eXBlKiB0dHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgICAgICAgICAgIHdoaWxlICh0dHlwZS0+aXNfdHlwZWRlZigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHR0eXBlID0gc3RhdGljX2Nhc3Q8dF90eXBlZGVmKj4odHR5cGUpLT5nZXRfdHlwZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1c2VfbnVsbGFibGUgPSBzdGF0aWNfY2FzdDx0X2Jhc2VfdHlwZSo+KHR0eXBlKS0+Z2V0X2Jhc2UoKSAhPSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IGZpZWxkUHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJzZXQiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgICBpZiAodXNlX251bGxhYmxlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZ2VuZXJhdGVJc3NldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIl9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSh0ZmllbGQtPmdldF9uYW1lKCkpIDw8ICIgPSB2YWx1ZS5IYXNWYWx1ZTsiIDw8IGVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICh2YWx1ZS5IYXNWYWx1ZSkgdGhpcy4iIDw8IGZpZWxkUHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPSB2YWx1ZS5WYWx1ZTsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZ2VuZXJhdGVJc3NldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIl9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSh0ZmllbGQtPmdldF9uYW1lKCkpIDw8ICIgPSB0cnVlOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGhpcy4iIDw8IGZpZWxkUHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPSB2YWx1ZTsiIDw8IGVuZGw7CisgICAgICAgIH0KKworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7Cit9CisKK3N0cmluZyB0X25ldGNvcmVfZ2VuZXJhdG9yOjptYWtlX3ZhbGlkX2NzaGFycF9pZGVudGlmaWVyKHN0cmluZyBjb25zdCYgZnJvbU5hbWUpCit7CisgICAgc3RyaW5nIHN0ciA9IGZyb21OYW1lOworICAgIGlmIChzdHIuZW1wdHkoKSkKKyAgICB7CisgICAgICAgIHJldHVybiBzdHI7CisgICAgfQorCisgICAgLy8gdGVzdHMgcmVseSBvbiB0aGlzCisgICAgYXNzZXJ0KCgnQScgPCAnWicpICYmICgnYScgPCAneicpICYmICgnMCcgPCAnOScpKTsKKworICAgIC8vIGlmIHRoZSBmaXJzdCBsZXR0ZXIgaXMgYSBudW1iZXIsIHdlIGFkZCBhbiBhZGRpdGlvbmFsIHVuZGVyc2NvcmUgaW4gZnJvbnQgb2YgaXQKKyAgICBjaGFyIGMgPSBzdHIuYXQoMCk7CisgICAgaWYgKCgnMCcgPD0gYykgJiYgKGMgPD0gJzknKSkKKyAgICB7CisgICAgICAgIHN0ciA9ICJfIiArIHN0cjsKKyAgICB9CisKKyAgICAvLyBmb2xsb3dpbmcgY2hhcnM6IGxldHRlciwgbnVtYmVyIG9yIHVuZGVyc2NvcmUKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0ci5zaXplKCk7ICsraSkKKyAgICB7CisgICAgICAgIGMgPSBzdHIuYXQoaSk7CisgICAgICAgIGlmICgoJ0EnID4gYyB8fCBjID4gJ1onKSAmJiAoJ2EnID4gYyB8fCBjID4gJ3onKSAmJiAoJzAnID4gYyB8fCBjID4gJzknKSAmJiAnXycgIT0gYykKKyAgICAgICAgeworICAgICAgICAgICAgc3RyLnJlcGxhY2UoaSwgMSwgIl8iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBzdHI7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Y2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKHZvaWQqIHNjb3BlKQoreworICAgIGlmIChtZW1iZXJfbWFwcGluZ19zY29wZXMuZW1wdHkoKSkKKyAgICB7CisgICAgICAgIHRocm93ICJpbnRlcm5hbCBlcnJvcjogY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKCkgbm8gc2NvcGUgYWN0aXZlIjsKKyAgICB9CisKKyAgICBtZW1iZXJfbWFwcGluZ19zY29wZSYgYWN0aXZlID0gbWVtYmVyX21hcHBpbmdfc2NvcGVzLmJhY2soKTsKKyAgICBpZiAoYWN0aXZlLnNjb3BlX21lbWJlciAhPSBzY29wZSkKKyAgICB7CisgICAgICAgIHRocm93ICJpbnRlcm5hbCBlcnJvcjogY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKCkgY2FsbGVkIGZvciB3cm9uZyBzdHJ1Y3QiOworICAgIH0KKworICAgIG1lbWJlcl9tYXBwaW5nX3Njb3Blcy5wb3BfYmFjaygpOworfQorCitzdHJpbmcgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2V0X21hcHBlZF9tZW1iZXJfbmFtZShzdHJpbmcgbmFtZSkKK3sKKyAgICBpZiAoIW1lbWJlcl9tYXBwaW5nX3Njb3Blcy5lbXB0eSgpKQorICAgIHsKKyAgICAgICAgbWVtYmVyX21hcHBpbmdfc2NvcGUmIGFjdGl2ZSA9IG1lbWJlcl9tYXBwaW5nX3Njb3Blcy5iYWNrKCk7CisgICAgICAgIG1hcDxzdHJpbmcsIHN0cmluZz46Oml0ZXJhdG9yIGl0ZXIgPSBhY3RpdmUubWFwcGluZ190YWJsZS5maW5kKG5hbWUpOworICAgICAgICBpZiAoYWN0aXZlLm1hcHBpbmdfdGFibGUuZW5kKCkgIT0gaXRlcikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGl0ZXItPnNlY29uZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB2ZXJib3NlKCJubyBtYXBwaW5nIGZvciBtZW1iZXIgJXNcbiIsIG5hbWUuY19zdHIoKSk7CisgICAgcmV0dXJuIG5hbWU7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6cHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKHRfc3RydWN0KiB0c3RydWN0KQoreworICAgIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyh0c3RydWN0LCB0c3RydWN0LT5nZXRfbWVtYmVycygpLCB0c3RydWN0LT5nZXRfbmFtZSgpKTsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcodm9pZCogc2NvcGUsIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMsIGNvbnN0IHN0cmluZyYgc3RydWN0bmFtZSkKK3sKKyAgICAvLyBiZWdpbiBuZXcgc2NvcGUKKyAgICBtZW1iZXJfbWFwcGluZ19zY29wZXMucHVzaF9iYWNrKG1lbWJlcl9tYXBwaW5nX3Njb3BlKCkpOworICAgIG1lbWJlcl9tYXBwaW5nX3Njb3BlJiBhY3RpdmUgPSBtZW1iZXJfbWFwcGluZ19zY29wZXMuYmFjaygpOworICAgIGFjdGl2ZS5zY29wZV9tZW1iZXIgPSBzY29wZTsKKworICAgIC8vIGN1cnJlbnQgQyMgZ2VuZXJhdG9yIHBvbGljeToKKyAgICAvLyAtIHByb3AgbmFtZXMgYXJlIGFsd2F5cyByZW5kZXJlZCB3aXRoIGFuIFVwcGVyY2FzZSBmaXJzdCBsZXR0ZXIKKyAgICAvLyAtIHN0cnVjdCBuYW1lcyBhcmUgdXNlZCBhcyBnaXZlbgorICAgIHN0ZDo6c2V0PHN0cmluZz4gdXNlZF9tZW1iZXJfbmFtZXM7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIC8vIHByZXZlbnQgbmFtZSBjb25mbGljdHMgd2l0aCBzdHJ1Y3QgKENTMDU0MiBlcnJvcikKKyAgICB1c2VkX21lbWJlcl9uYW1lcy5pbnNlcnQoc3RydWN0bmFtZSk7CisKKyAgICAvLyBwcmV2ZW50IG5hbWUgY29uZmxpY3RzIHdpdGgga25vd24gbWV0aG9kcyAoVEhSSUZULTI5NDIpCisgICAgdXNlZF9tZW1iZXJfbmFtZXMuaW5zZXJ0KCJSZWFkIik7CisgICAgdXNlZF9tZW1iZXJfbmFtZXMuaW5zZXJ0KCJXcml0ZSIpOworCisgICAgZm9yIChpdGVyID0gbWVtYmVycy5iZWdpbigpOyBpdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsraXRlcikKKyAgICB7CisgICAgICAgIHN0cmluZyBvbGRuYW1lID0gKCppdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgICAgc3RyaW5nIG5ld25hbWUgPSBwcm9wX25hbWUoKml0ZXIsIHRydWUpOworICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gbmV3IG5hbWUgY29uZmxpY3RzIHdpdGggYW5vdGhlciBtZW1iZXIKKyAgICAgICAgICAgIGlmICh1c2VkX21lbWJlcl9uYW1lcy5maW5kKG5ld25hbWUpICE9IHVzZWRfbWVtYmVyX25hbWVzLmVuZCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHB2ZXJib3NlKCJzdHJ1Y3QgJXM6IG1lbWJlciAlcyBjb25mbGljdHMgd2l0aCBhbm90aGVyIG1lbWJlclxuIiwgc3RydWN0bmFtZS5jX3N0cigpLCBuZXduYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIG5ld25hbWUgKz0gJ18nOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBhZGQgYWx3YXlzLCB0aGlzIGhlbHBzIHVzIHRvIGRldGVjdCBlZGdlIGNhc2VzIGxpa2UKKyAgICAgICAgICAgIC8vIGRpZmZlcmVudCBzcGVsbGluZ3MgKCJmb28iIGFuZCAiRm9vIikgd2l0aGluIHRoZSBzYW1lIHN0cnVjdAorICAgICAgICAgICAgcHZlcmJvc2UoInN0cnVjdCAlczogbWVtYmVyIG1hcHBpbmcgJXMgPT4gJXNcbiIsIHN0cnVjdG5hbWUuY19zdHIoKSwgb2xkbmFtZS5jX3N0cigpLCBuZXduYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgYWN0aXZlLm1hcHBpbmdfdGFibGVbb2xkbmFtZV0gPSBuZXduYW1lOworICAgICAgICAgICAgdXNlZF9tZW1iZXJfbmFtZXMuaW5zZXJ0KG5ld25hbWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0cmluZyB0X25ldGNvcmVfZ2VuZXJhdG9yOjpwcm9wX25hbWUodF9maWVsZCogdGZpZWxkLCBib29sIHN1cHByZXNzX21hcHBpbmcpCit7CisgICAgc3RyaW5nIG5hbWUodGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgICBpZiAoc3VwcHJlc3NfbWFwcGluZykKKyAgICB7CisgICAgICAgIG5hbWVbMF0gPSB0b3VwcGVyKG5hbWVbMF0pOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBuYW1lID0gZ2V0X21hcHBlZF9tZW1iZXJfbmFtZShuYW1lKTsKKyAgICB9CisgICAgcmV0dXJuIG5hbWU7Cit9CisKK3N0cmluZyB0X25ldGNvcmVfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl9jb250YWluZXIsIGJvb2wgaW5faW5pdCwgYm9vbCBpbl9wYXJhbSwgYm9vbCBpc19yZXF1aXJlZCkKK3sKKyAgICAodm9pZClpbl9pbml0OworCisgICAgd2hpbGUgKHR0eXBlLT5pc190eXBlZGVmKCkpCisgICAgeworICAgICAgICB0dHlwZSA9IHN0YXRpY19jYXN0PHRfdHlwZWRlZio+KHR0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgICB9CisKKyAgICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGJhc2VfdHlwZV9uYW1lKHN0YXRpY19jYXN0PHRfYmFzZV90eXBlKj4odHR5cGUpLCBpbl9jb250YWluZXIsIGluX3BhcmFtLCBpc19yZXF1aXJlZCk7CisgICAgfQorCisgICAgaWYgKHR0eXBlLT5pc19tYXAoKSkKKyAgICB7CisgICAgICAgIHRfbWFwKiB0bWFwID0gc3RhdGljX2Nhc3Q8dF9tYXAqPih0dHlwZSk7CisgICAgICAgIHJldHVybiAiRGljdGlvbmFyeTwiICsgdHlwZV9uYW1lKHRtYXAtPmdldF9rZXlfdHlwZSgpLCB0cnVlKSArICIsICIgKyB0eXBlX25hbWUodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHRydWUpICsgIj4iOworICAgIH0KKworICAgIGlmICh0dHlwZS0+aXNfc2V0KCkpCisgICAgeworICAgICAgICB0X3NldCogdHNldCA9IHN0YXRpY19jYXN0PHRfc2V0Kj4odHR5cGUpOworICAgICAgICByZXR1cm4gIlRIYXNoU2V0PCIgKyB0eXBlX25hbWUodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCB0cnVlKSArICI+IjsKKyAgICB9CisKKyAgICBpZiAodHR5cGUtPmlzX2xpc3QoKSkKKyAgICB7CisgICAgICAgIHRfbGlzdCogdGxpc3QgPSBzdGF0aWNfY2FzdDx0X2xpc3QqPih0dHlwZSk7CisgICAgICAgIHJldHVybiAiTGlzdDwiICsgdHlwZV9uYW1lKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIHRydWUpICsgIj4iOworICAgIH0KKworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOworICAgIHN0cmluZyBwb3N0Zml4ID0gKCFpc19yZXF1aXJlZCAmJiBudWxsYWJsZV8gJiYgaW5fcGFyYW0gJiYgdHR5cGUtPmlzX2VudW0oKSkgPyAiPyIgOiAiIjsKKyAgICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pCisgICAgeworICAgICAgICBzdHJpbmcgbnMgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJuZXRjb3JlIik7CisgICAgICAgIGlmICghbnMuZW1wdHkoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5zICsgIi4iICsgbm9ybWFsaXplX25hbWUodHR5cGUtPmdldF9uYW1lKCkpICsgcG9zdGZpeDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBub3JtYWxpemVfbmFtZSh0dHlwZS0+Z2V0X25hbWUoKSkgKyBwb3N0Zml4OworfQorCitzdHJpbmcgdF9uZXRjb3JlX2dlbmVyYXRvcjo6YmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHRiYXNlLCBib29sIGluX2NvbnRhaW5lciwgYm9vbCBpbl9wYXJhbSwgYm9vbCBpc19yZXF1aXJlZCkKK3sKKyAgICAodm9pZClpbl9jb250YWluZXI7CisgICAgc3RyaW5nIHBvc3RmaXggPSAoIWlzX3JlcXVpcmVkICYmIG51bGxhYmxlXyAmJiBpbl9wYXJhbSkgPyAiPyIgOiAiIjsKKyAgICBzd2l0Y2ggKHRiYXNlLT5nZXRfYmFzZSgpKQorICAgIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHJldHVybiAidm9pZCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh0YmFzZS0+aXNfYmluYXJ5KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJieXRlW10iOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuICJzdHJpbmciOworICAgICAgICB9CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICByZXR1cm4gImJvb2wiICsgcG9zdGZpeDsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICByZXR1cm4gInNieXRlIiArIHBvc3RmaXg7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIHJldHVybiAic2hvcnQiICsgcG9zdGZpeDsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgcmV0dXJuICJpbnQiICsgcG9zdGZpeDsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgcmV0dXJuICJsb25nIiArIHBvc3RmaXg7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIHJldHVybiAiZG91YmxlIiArIHBvc3RmaXg7CisgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDIyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZS0+Z2V0X2Jhc2UoKSk7CisgICAgfQorfQorCitzdHJpbmcgdF9uZXRjb3JlX2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCwgc3RyaW5nIHByZWZpeCkKK3sKKyAgICBzdHJpbmcgcmVzdWx0ID0gdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSkgKyAiICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgICAgaWYgKGluaXQpCisgICAgeworICAgICAgICB0X3R5cGUqIHR0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOworICAgICAgICB3aGlsZSAodHR5cGUtPmlzX3R5cGVkZWYoKSkKKyAgICAgICAgeworICAgICAgICAgICAgdHR5cGUgPSBzdGF0aWNfY2FzdDx0X3R5cGVkZWYqPih0dHlwZSktPmdldF90eXBlKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiBmaWVsZF9oYXNfZGVmYXVsdCh0ZmllbGQpKQorICAgICAgICB7CisgICAgICAgICAgICBzdGQ6Om9mc3RyZWFtIGR1bW15OworICAgICAgICAgICAgcmVzdWx0ICs9ICIgPSAiICsgcmVuZGVyX2NvbnN0X3ZhbHVlKGR1bW15LCB0ZmllbGQtPmdldF9uYW1lKCksIHR0eXBlLCB0ZmllbGQtPmdldF92YWx1ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSBzdGF0aWNfY2FzdDx0X2Jhc2VfdHlwZSo+KHR0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgICAgICAgIHN3aXRjaCAodGJhc2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgICAgICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gIiA9IGZhbHNlIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICAgICAgICAgIHJlc3VsdCArPSAiID0gKGRvdWJsZSkwIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgKz0gIiA9ICgiICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgKyAiKTAiOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIigpIjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKSArICIoKSI7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdCArICI7IjsKK30KKworc3RyaW5nIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpCit7CisgICAgdF90eXBlKiB0dHlwZSA9IHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKKyAgICByZXR1cm4gdHlwZV9uYW1lKHR0eXBlKSArICIgIiArIG5vcm1hbGl6ZV9uYW1lKHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiKCIgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkgKyAiKSI7Cit9CisKK3N0cmluZyB0X25ldGNvcmVfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmModF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4KQoreworICAgIHRfdHlwZSogdHR5cGUgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7CisgICAgc3RyaW5nIHRhc2sgPSAiVGFzayI7CisgICAgaWYgKCF0dHlwZS0+aXNfdm9pZCgpKQorICAgIHsKKyAgICAgICAgdGFzayArPSAiPCIgKyB0eXBlX25hbWUodHR5cGUpICsgIj4iOworICAgIH0KKworICAgIHN0cmluZyByZXN1bHQgPSB0YXNrICsgIiAiICsgbm9ybWFsaXplX25hbWUocHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICJBc3luYygiOworICAgIHN0cmluZyBhcmdzID0gYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpOworICAgIHJlc3VsdCArPSBhcmdzOworICAgIGlmICghYXJncy5lbXB0eSgpKQorICAgIHsKKyAgICAgICAgcmVzdWx0ICs9ICIsICI7CisgICAgfQorICAgIHJlc3VsdCArPSAiQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pIjsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0cmluZyB0X25ldGNvcmVfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KQoreworICAgIHN0cmluZyByZXN1bHQgPSAiIjsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikKKyAgICB7CisgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgeworICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCArPSAiLCAiOworICAgICAgICB9CisgICAgICAgIHJlc3VsdCArPSB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSArICIgIiArIG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0cmluZyB0X25ldGNvcmVfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKQoreworICAgIHdoaWxlICh0eXBlLT5pc190eXBlZGVmKCkpCisgICAgeworICAgICAgICB0eXBlID0gc3RhdGljX2Nhc3Q8dF90eXBlZGVmKj4odHlwZSktPmdldF90eXBlKCk7CisgICAgfQorCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKQorICAgIHsKKyAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9IHN0YXRpY19jYXN0PHRfYmFzZV90eXBlKj4odHlwZSktPmdldF9iYXNlKCk7CisgICAgICAgIHN3aXRjaCAodGJhc2UpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgICAgIHJldHVybiAiVFR5cGUuU3RyaW5nIjsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICAgICAgcmV0dXJuICJUVHlwZS5Cb29sIjsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgICAgIHJldHVybiAiVFR5cGUuQnl0ZSI7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICAgICAgcmV0dXJuICJUVHlwZS5JMTYiOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgICAgIHJldHVybiAiVFR5cGUuSTMyIjsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgICByZXR1cm4gIlRUeXBlLkk2NCI7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICAgICAgcmV0dXJuICJUVHlwZS5Eb3VibGUiOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkKKyAgICB7CisgICAgICAgIHJldHVybiAiVFR5cGUuSTMyIjsKKyAgICB9CisgICAgZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkKKyAgICB7CisgICAgICAgIHJldHVybiAiVFR5cGUuU3RydWN0IjsKKyAgICB9CisgICAgZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpCisgICAgeworICAgICAgICByZXR1cm4gIlRUeXBlLk1hcCI7CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuICJUVHlwZS5TZXQiOworICAgIH0KKyAgICBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpCisgICAgeworICAgICAgICByZXR1cm4gIlRUeXBlLkxpc3QiOworICAgIH0KKworICAgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXRjb3JlX2RvY3N0cmluZ19jb21tZW50KG9zdHJlYW0mIG91dCwgc3RyaW5nIGNvbnRlbnRzKQoreworICAgIGRvY3N0cmluZ19jb21tZW50KG91dCwgIi8vLyA8c3VtbWFyeT4iICsgZW5kbCwgIi8vLyAiLCBjb250ZW50cywgIi8vLyA8L3N1bW1hcnk+IiArIGVuZGwpOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX25ldGNvcmVfZG9jKG9zdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpCit7CisgICAgaWYgKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19lbnVtKCkpCisgICAgeworICAgICAgICBzdHJpbmcgY29tYmluZWRfbWVzc2FnZSA9IGZpZWxkLT5nZXRfZG9jKCkgKyBlbmRsICsgIjxzZWVhbHNvIGNyZWY9XCIiICsgZ2V0X2VudW1fY2xhc3NfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSkgKyAiXCIvPiI7CisgICAgICAgIGdlbmVyYXRlX25ldGNvcmVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCBjb21iaW5lZF9tZXNzYWdlKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfbmV0Y29yZV9kb2Mob3V0LCBzdGF0aWNfY2FzdDx0X2RvYyo+KGZpZWxkKSk7CisgICAgfQorfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX25ldGNvcmVfZG9jKG9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpCit7CisgICAgaWYgKHRkb2MtPmhhc19kb2MoKSkKKyAgICB7CisgICAgICAgIGdlbmVyYXRlX25ldGNvcmVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCB0ZG9jLT5nZXRfZG9jKCkpOworICAgIH0KK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXRjb3JlX2RvYyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikKK3sKKyAgICBpZiAodGZ1bmN0aW9uLT5oYXNfZG9jKCkpCisgICAgeworICAgICAgICBzdHJpbmdzdHJlYW0gcHM7CisgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgcF9pdGVyOworICAgICAgICBmb3IgKHBfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBwX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK3BfaXRlcikKKyAgICAgICAgeworICAgICAgICAgICAgdF9maWVsZCogcCA9ICpwX2l0ZXI7CisgICAgICAgICAgICBwcyA8PCBlbmRsIDw8ICI8cGFyYW0gbmFtZT1cIiIgPDwgcC0+Z2V0X25hbWUoKSA8PCAiXCI+IjsKKyAgICAgICAgICAgIGlmIChwLT5oYXNfZG9jKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaW5nIHN0ciA9IHAtPmdldF9kb2MoKTsKKyAgICAgICAgICAgICAgICBzdHIuZXJhc2UocmVtb3ZlKHN0ci5iZWdpbigpLCBzdHIuZW5kKCksICdcbicpLCBzdHIuZW5kKCkpOworICAgICAgICAgICAgICAgIHBzIDw8IHN0cjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBzIDw8ICI8L3BhcmFtPiI7CisgICAgICAgIH0KKworICAgICAgICBkb2NzdHJpbmdfY29tbWVudChvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLy8vICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8c3VtbWFyeT4iICsgZW5kbCArIHRmdW5jdGlvbi0+Z2V0X2RvYygpICsgIjwvc3VtbWFyeT4iICsgcHMuc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiKTsKKyAgICB9Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6ZG9jc3RyaW5nX2NvbW1lbnQob3N0cmVhbSYgb3V0LCBjb25zdCBzdHJpbmcmIGNvbW1lbnRfc3RhcnQsIGNvbnN0IHN0cmluZyYgbGluZV9wcmVmaXgsIGNvbnN0IHN0cmluZyYgY29udGVudHMsIGNvbnN0IHN0cmluZyYgY29tbWVudF9lbmQpCit7CisgICAgaWYgKGNvbW1lbnRfc3RhcnQgIT0gIiIpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgY29tbWVudF9zdGFydDsKKyAgICB9CisKKyAgICBzdHJpbmdzdHJlYW0gZG9jcyhjb250ZW50cywgc3RkOjppb3NfYmFzZTo6aW4pOworCisgICAgd2hpbGUgKCEoZG9jcy5lb2YoKSB8fCBkb2NzLmZhaWwoKSkpCisgICAgeworICAgICAgICBjaGFyIGxpbmVbMTAyNF07CisgICAgICAgIGRvY3MuZ2V0bGluZShsaW5lLCAxMDI0KTsKKworICAgICAgICAvLyBKdXN0IHBybnQgYSBuZXdsaW5lIHdoZW4gdGhlIGxpbmUgJiBwcmVmaXggYXJlIGVtcHR5LgorICAgICAgICBpZiAoc3RybGVuKGxpbmUpID09IDAgJiYgbGluZV9wcmVmaXggPT0gIiIgJiYgIWRvY3MuZW9mKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHN0cmxlbihsaW5lKSA+IDAgfHwgIWRvY3MuZW9mKCkpCisgICAgICAgIHsgLy8gc2tpcCB0aGUgZW1wdHkgbGFzdCBsaW5lCisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgbGluZV9wcmVmaXggPDwgbGluZSA8PCBlbmRsOworICAgICAgICB9CisgICAgfQorICAgIGlmIChjb21tZW50X2VuZCAhPSAiIikKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBjb21tZW50X2VuZDsKKyAgICB9Cit9CisKK3N0cmluZyB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZXRfZW51bV9jbGFzc19uYW1lKHRfdHlwZSogdHlwZSkKK3sKKyAgICBzdHJpbmcgcGFja2FnZSA9ICIiOworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR5cGUtPmdldF9wcm9ncmFtKCk7CisgICAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKQorICAgIHsKKyAgICAgICAgcGFja2FnZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoIm5ldGNvcmUiKSArICIuIjsKKyAgICB9CisgICAgcmV0dXJuIHBhY2thZ2UgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAorICAgIG5ldGNvcmUsCisgICAgIkMjIiwKKyAgICAiICAgIHdjZjogICAgICAgICAgICAgQWRkcyBiaW5kaW5ncyBmb3IgV0NGIHRvIGdlbmVyYXRlZCBjbGFzc2VzLlxuIgorICAgICIgICAgc2VyaWFsOiAgICAgICAgICBBZGQgc2VyaWFsaXphdGlvbiBzdXBwb3J0IHRvIGdlbmVyYXRlZCBjbGFzc2VzLlxuIgorICAgICIgICAgbnVsbGFibGU6ICAgICAgICBVc2UgbnVsbGFibGUgdHlwZXMgZm9yIHByb3BlcnRpZXMuXG4iCisgICAgIiAgICBoYXNoY29kZTogICAgICAgIEdlbmVyYXRlIGEgaGFzaGNvZGUgYW5kIGVxdWFscyBpbXBsZW1lbnRhdGlvbiBmb3IgY2xhc3Nlcy5cbiIKKyAgICAiICAgIHVuaW9uOiAgICAgICAgICAgVXNlIG5ldyB1bmlvbiB0eXBpbmcsIHdoaWNoIGluY2x1ZGVzIGEgc3RhdGljIHJlYWQgZnVuY3Rpb24gZm9yIHVuaW9uIHR5cGVzLlxuIgorKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9uZXRjb3JlX2dlbmVyYXRvci5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9uZXRjb3JlX2dlbmVyYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZmM5MjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X25ldGNvcmVfZ2VuZXJhdG9yLmgKQEAgLTAsMCArMSwxMzcgQEAKKyNpbmNsdWRlIDxjYXNzZXJ0PgorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGNjdHlwZT4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworY2xhc3MgdF9uZXRjb3JlX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IKK3sKKworICAgIHN0cnVjdCBtZW1iZXJfbWFwcGluZ19zY29wZQorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAgIG1lbWJlcl9tYXBwaW5nX3Njb3BlKCkgOiBzY29wZV9tZW1iZXIoMCkgeyB9CisgICAgICAgIHZvaWQqIHNjb3BlX21lbWJlcjsKKyAgICAgICAgbWFwPHN0cmluZywgc3RyaW5nPiBtYXBwaW5nX3RhYmxlOworICAgIH07CisKK3B1YmxpYzoKKyAgICB0X25ldGNvcmVfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwgY29uc3QgbWFwPHN0cmluZywgc3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsIGNvbnN0IHN0cmluZyYgb3B0aW9uX3N0cmluZyk7CisKKyAgICBib29sIGlzX3djZl9lbmFibGVkKCkgY29uc3Q7CisgICAgYm9vbCBpc19udWxsYWJsZV9lbmFibGVkKCkgY29uc3Q7CisgICAgYm9vbCBpc19oYXNoY29kZV9lbmFibGVkKCkgY29uc3Q7CisgICAgYm9vbCBpc19zZXJpYWxpemVfZW5hYmxlZCgpIGNvbnN0OworICAgIGJvb2wgaXNfdW5pb25fZW5hYmxlZCgpIGNvbnN0OworICAgIG1hcDxzdHJpbmcsIGludD4gZ2V0X2tleXdvcmRzX2xpc3QoKSBjb25zdDsKKworICAgIC8vIG92ZXJyaWRlcworICAgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworICAgIHZvaWQgZ2VuZXJhdGVfY29uc3RzKHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKTsKKyAgICB2b2lkIGdlbmVyYXRlX2NvbnN0cyhvc3RyZWFtJiBvdXQsIHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKTsKKyAgICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgICAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICAgIHZvaWQgZ2VuZXJhdGVfZW51bShvc3RyZWFtJiBvdXQsIHRfZW51bSogdGVudW0pOworICAgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOworICAgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICAgIHZvaWQgZ2VuZXJhdGVfcHJvcGVydHkob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaXNQdWJsaWMsIGJvb2wgZ2VuZXJhdGVJc3NldCk7CisgICAgdm9pZCBnZW5lcmF0ZV9uZXRjb3JlX3Byb3BlcnR5KG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBib29sIGlzUHVibGljLCBib29sIGluY2x1ZGVJc3NldCA9IHRydWUsIHN0cmluZyBmaWVsZFByZWZpeCA9ICIiKTsKKyAgICBib29sIHByaW50X2NvbnN0X3ZhbHVlKG9zdHJlYW0mIG91dCwgc3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUsIGJvb2wgaW5fc3RhdGljLCBib29sIGRlZnZhbCA9IGZhbHNlLCBib29sIG5lZWR0eXBlID0gZmFsc2UpOworICAgIHN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUob3N0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisgICAgdm9pZCBwcmludF9jb25zdF9jb25zdHJ1Y3Rvcihvc3RyZWFtJiBvdXQsIHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKTsKKyAgICB2b2lkIHByaW50X2NvbnN0X2RlZl92YWx1ZShvc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKyAgICB2b2lkIGdlbmVyYXRlX25ldGNvcmVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7CisgICAgdm9pZCBnZW5lcmF0ZV9uZXRjb3JlX3VuaW9uKHRfc3RydWN0KiB0dW5pb24pOworICAgIHZvaWQgZ2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3RfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UsIGJvb2wgaW5fY2xhc3MgPSBmYWxzZSwgYm9vbCBpc19yZXN1bHQgPSBmYWxzZSk7CisgICAgdm9pZCBnZW5lcmF0ZV9uZXRjb3JlX3VuaW9uX2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHVuaW9uKTsKKyAgICB2b2lkIGdlbmVyYXRlX25ldGNvcmVfdW5pb25fY2xhc3Mob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHVuaW9uLCB0X2ZpZWxkKiB0ZmllbGQpOworICAgIHZvaWQgZ2VuZXJhdGVfbmV0Y29yZV93Y2ZmYXVsdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgICB2b2lkIGdlbmVyYXRlX25ldGNvcmVfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgICB2b2lkIGdlbmVyYXRlX25ldGNvcmVfc3RydWN0X3Jlc3VsdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgICAgdm9pZCBnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgICAgdm9pZCBnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF90b3N0cmluZyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgICB2b2lkIGdlbmVyYXRlX25ldGNvcmVfc3RydWN0X2VxdWFscyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgICB2b2lkIGdlbmVyYXRlX25ldGNvcmVfc3RydWN0X2hhc2hjb2RlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICAgIHZvaWQgZ2VuZXJhdGVfbmV0Y29yZV91bmlvbl9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHVuaW9uKTsKKyAgICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnMob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICAgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2Uob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyhvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworICAgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisgICAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uX2FzeW5jKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogZnVuY3Rpb24pOworICAgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXggPSAiIiwgYm9vbCBpc19wcm9wZXJ0eWxlc3MgPSBmYWxzZSk7CisgICAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXggPSAiIik7CisgICAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgcHJlZml4ID0gIiIpOworICAgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbGlzdCogbGlzdCwgc3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCA9ICIiLCBib29sIGlzX2VsZW1lbnQgPSBmYWxzZSwgYm9vbCBpc19wcm9wZXJ0eWxlc3MgPSBmYWxzZSk7CisgICAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXggPSAiIik7CisgICAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdHJpbmcgaXRlciwgc3RyaW5nIG1hcCk7CisgICAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RyaW5nIGl0ZXIpOworICAgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBpdGVyKTsKKyAgICB2b2lkIGdlbmVyYXRlX25ldGNvcmVfZG9jKG9zdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpOworICAgIHZvaWQgZ2VuZXJhdGVfbmV0Y29yZV9kb2Mob3N0cmVhbSYgb3V0LCB0X2RvYyogdGRvYyk7CisgICAgdm9pZCBnZW5lcmF0ZV9uZXRjb3JlX2RvYyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRkb2MpOworICAgIHZvaWQgZ2VuZXJhdGVfbmV0Y29yZV9kb2NzdHJpbmdfY29tbWVudChvc3RyZWFtJiBvdXQsIHN0cmluZyBjb250ZW50cyk7CisgICAgdm9pZCBkb2NzdHJpbmdfY29tbWVudChvc3RyZWFtJiBvdXQsIGNvbnN0IHN0cmluZyYgY29tbWVudF9zdGFydCwgY29uc3Qgc3RyaW5nJiBsaW5lX3ByZWZpeCwgY29uc3Qgc3RyaW5nJiBjb250ZW50cywgY29uc3Qgc3RyaW5nJiBjb21tZW50X2VuZCk7CisgICAgdm9pZCBzdGFydF9uZXRjb3JlX25hbWVzcGFjZShvc3RyZWFtJiBvdXQpOworICAgIHZvaWQgZW5kX25ldGNvcmVfbmFtZXNwYWNlKG9zdHJlYW0mIG91dCk7CisKKyAgICBzdHJpbmcgbmV0Y29yZV90eXBlX3VzaW5ncygpIGNvbnN0OworICAgIHN0cmluZyBuZXRjb3JlX3RocmlmdF91c2luZ3MoKSBjb25zdDsKKworICAgIHN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl9jb3VudGFpbmVyID0gZmFsc2UsIGJvb2wgaW5faW5pdCA9IGZhbHNlLCBib29sIGluX3BhcmFtID0gZmFsc2UsIGJvb2wgaXNfcmVxdWlyZWQgPSBmYWxzZSk7CisgICAgc3RyaW5nIGJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0YmFzZSwgYm9vbCBpbl9jb250YWluZXIgPSBmYWxzZSwgYm9vbCBpbl9wYXJhbSA9IGZhbHNlLCBib29sIGlzX3JlcXVpcmVkID0gZmFsc2UpOworICAgIHN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0ID0gZmFsc2UsIHN0cmluZyBwcmVmaXggPSAiIik7CisgICAgc3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luYyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXggPSAiIik7CisgICAgc3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXggPSAiIik7CisgICAgc3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICAgIHN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7CisgICAgc3RyaW5nIHByb3BfbmFtZSh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgc3VwcHJlc3NfbWFwcGluZyA9IGZhbHNlKTsKKyAgICBzdHJpbmcgZ2V0X2VudW1fY2xhc3NfbmFtZSh0X3R5cGUqIHR5cGUpOworCitwcml2YXRlOgorICAgIHN0cmluZyBuYW1lc3BhY2VfbmFtZV87CisgICAgc3RyaW5nIG5hbWVzcGFjZV9kaXJfOworCisgICAgYm9vbCBudWxsYWJsZV87CisgICAgYm9vbCB1bmlvbl87CisgICAgYm9vbCBoYXNoY29kZV87CisgICAgYm9vbCBzZXJpYWxpemVfOworICAgIGJvb2wgd2NmXzsKKworICAgIHN0cmluZyB3Y2ZfbmFtZXNwYWNlXzsKKyAgICBtYXA8c3RyaW5nLCBpbnQ+IG5ldGNvcmVfa2V5d29yZHM7CisgICAgdmVjdG9yPG1lbWJlcl9tYXBwaW5nX3Njb3BlPiBtZW1iZXJfbWFwcGluZ19zY29wZXM7CisKKyAgICB2b2lkIGluaXRfa2V5d29yZHMoKTsKKyAgICBzdHJpbmcgbm9ybWFsaXplX25hbWUoc3RyaW5nIG5hbWUpOworICAgIHN0cmluZyBtYWtlX3ZhbGlkX2NzaGFycF9pZGVudGlmaWVyKHN0cmluZyBjb25zdCYgZnJvbU5hbWUpOworICAgIHZvaWQgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKHRfc3RydWN0KiB0c3RydWN0KTsKKyAgICB2b2lkIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyh2b2lkKiBzY29wZSwgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycywgY29uc3Qgc3RyaW5nJiBzdHJ1Y3RuYW1lKTsKKyAgICB2b2lkIGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZyh2b2lkKiBzY29wZSk7CisgICAgc3RyaW5nIGdldF9tYXBwZWRfbWVtYmVyX25hbWUoc3RyaW5nIG9sZG5hbWUpOworfTsKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3Rfb2NhbWxfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9vY2FtbF9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVjODFiYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3Rfb2NhbWxfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsMTc2MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC92ZXJzaW9uLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6OmlvczsKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKKy8qKgorICogT0NhbWwgY29kZSBnZW5lcmF0b3IuCisgKgorICovCitjbGFzcyB0X29jYW1sX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X29jYW1sX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgLyogbm8gb3B0aW9ucyB5ZXQgKi8KKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBvY2FtbDoiICsgaXRlci0+Zmlyc3Q7CisgICAgfQorCisgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tb2NhbWwiOworICB9CisKKyAgLyoqCisgICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKKyAgICovCisKKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworICB2b2lkIGdlbmVyYXRlX3Byb2dyYW0oKTsKKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworICBib29sIHN0cnVjdF9tZW1iZXJfcGVyc2lzdGVudCh0X2ZpZWxkKiB0bWVtYmVyKTsKKyAgYm9vbCBzdHJ1Y3RfbWVtYmVyX29taXRhYmxlKHRfZmllbGQqIHRtZW1iZXIpOworICBib29sIHN0cnVjdF9tZW1iZXJfZGVmYXVsdF9jaGVhcGx5X2NvbXBhcmFibGUodF9maWVsZCogdG1lbWJlcik7CisgIHN0ZDo6c3RyaW5nIHN0cnVjdF9tZW1iZXJfY29weV9vZih0X3R5cGUqIHR5cGUsIHN0cmluZyB3aGF0KTsKKworICAvKioKKyAgICogU3RydWN0IGdlbmVyYXRpb24gY29kZQorICAgKi8KKworICB2b2lkIGdlbmVyYXRlX29jYW1sX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX29jYW1sX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X21lbWJlcihzdGQ6Om9zdHJlYW0mIG91dCwgc3RyaW5nIHRuYW1lLCB0X2ZpZWxkKiB0bWVtYmVyKTsKKyAgdm9pZCBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3Rfc2lnKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX29jYW1sX3N0cnVjdF9yZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfb2NhbWxfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICB2b2lkIGdlbmVyYXRlX29jYW1sX21ldGhvZF9jb3B5KHN0ZDo6b3N0cmVhbSYgb3V0LCBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzKTsKKyAgdm9pZCBnZW5lcmF0ZV9vY2FtbF9tZW1iZXJfY29weShzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogbWVtYmVyKTsKKworICAvKioKKyAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgLyoqCisgICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBuYW1lID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGtpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2aXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0bWFwLCBzdGQ6OnN0cmluZyBpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIC8qKgorICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucworICAgKi8KKworICBzdGQ6OnN0cmluZyBvY2FtbF9hdXRvZ2VuX2NvbW1lbnQoKTsKKyAgc3RkOjpzdHJpbmcgb2NhbWxfaW1wb3J0cygpOworICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fdHlwZSh0X2Z1bmN0aW9uKiB0ZnVuYywgYm9vbCBtZXRob2QgPSBmYWxzZSwgYm9vbCBvcHRpb25zID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyByZW5kZXJfb2NhbWxfdHlwZSh0X3R5cGUqIHR5cGUpOworCitwcml2YXRlOgorICAvKioKKyAgICogRmlsZSBzdHJlYW1zCisgICAqLworCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl90eXBlc187CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9jb25zdHNfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZV87CisKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3R5cGVzX2lfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZV9pXzsKK307CisKKy8qCisgKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHdlIHdhbnQgdHlwZWRlZnMgdG8gYXBwZWFyIGxhdGVyLAorICogYWZ0ZXIgYWxsIHRoZSB0eXBlcyBoYXZlIGJlZW4gZGVjbGFyZWQuCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2dyYW0oKSB7CisgIC8vIEluaXRpYWxpemUgdGhlIGdlbmVyYXRvcgorICBpbml0X2dlbmVyYXRvcigpOworCisgIC8vIEdlbmVyYXRlIGVudW1zCisgIHZlY3Rvcjx0X2VudW0qPiBlbnVtcyA9IHByb2dyYW1fLT5nZXRfZW51bXMoKTsKKyAgdmVjdG9yPHRfZW51bSo+OjppdGVyYXRvciBlbl9pdGVyOworICBmb3IgKGVuX2l0ZXIgPSBlbnVtcy5iZWdpbigpOyBlbl9pdGVyICE9IGVudW1zLmVuZCgpOyArK2VuX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9lbnVtKCplbl9pdGVyKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHN0cnVjdHMKKyAgdmVjdG9yPHRfc3RydWN0Kj4gc3RydWN0cyA9IHByb2dyYW1fLT5nZXRfc3RydWN0cygpOworICB2ZWN0b3I8dF9zdHJ1Y3QqPjo6aXRlcmF0b3Igc3RfaXRlcjsKKyAgZm9yIChzdF9pdGVyID0gc3RydWN0cy5iZWdpbigpOyBzdF9pdGVyICE9IHN0cnVjdHMuZW5kKCk7ICsrc3RfaXRlcikgeworICAgIGdlbmVyYXRlX3N0cnVjdCgqc3RfaXRlcik7CisgIH0KKworICAvLyBHZW5lcmF0ZSB4Y2VwdGlvbnMKKyAgdmVjdG9yPHRfc3RydWN0Kj4geGNlcHRpb25zID0gcHJvZ3JhbV8tPmdldF94Y2VwdGlvbnMoKTsKKyAgdmVjdG9yPHRfc3RydWN0Kj46Oml0ZXJhdG9yIHhfaXRlcjsKKyAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV94Y2VwdGlvbigqeF9pdGVyKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHR5cGVkZWZzCisgIHZlY3Rvcjx0X3R5cGVkZWYqPiB0eXBlZGVmcyA9IHByb2dyYW1fLT5nZXRfdHlwZWRlZnMoKTsKKyAgdmVjdG9yPHRfdHlwZWRlZio+OjppdGVyYXRvciB0ZF9pdGVyOworICBmb3IgKHRkX2l0ZXIgPSB0eXBlZGVmcy5iZWdpbigpOyB0ZF9pdGVyICE9IHR5cGVkZWZzLmVuZCgpOyArK3RkX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV90eXBlZGVmKCp0ZF9pdGVyKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHNlcnZpY2VzCisgIHZlY3Rvcjx0X3NlcnZpY2UqPiBzZXJ2aWNlcyA9IHByb2dyYW1fLT5nZXRfc2VydmljZXMoKTsKKyAgdmVjdG9yPHRfc2VydmljZSo+OjppdGVyYXRvciBzdl9pdGVyOworICBmb3IgKHN2X2l0ZXIgPSBzZXJ2aWNlcy5iZWdpbigpOyBzdl9pdGVyICE9IHNlcnZpY2VzLmVuZCgpOyArK3N2X2l0ZXIpIHsKKyAgICBzZXJ2aWNlX25hbWVfID0gZ2V0X3NlcnZpY2VfbmFtZSgqc3ZfaXRlcik7CisgICAgZ2VuZXJhdGVfc2VydmljZSgqc3ZfaXRlcik7CisgIH0KKworICAvLyBHZW5lcmF0ZSBjb25zdGFudHMKKyAgdmVjdG9yPHRfY29uc3QqPiBjb25zdHMgPSBwcm9ncmFtXy0+Z2V0X2NvbnN0cygpOworICBnZW5lcmF0ZV9jb25zdHMoY29uc3RzKTsKKworICAvLyBDbG9zZSB0aGUgZ2VuZXJhdG9yCisgIGNsb3NlX2dlbmVyYXRvcigpOworfQorCisvKioKKyAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0CisgKiBzdHJlYW1zLgorICoKKyAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5CisgIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7CisKKyAgLy8gTWFrZSBvdXRwdXQgZmlsZQorICBzdHJpbmcgZl90eXBlc19uYW1lID0gZ2V0X291dF9kaXIoKSArIHByb2dyYW1fbmFtZV8gKyAiX3R5cGVzLm1sIjsKKyAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7CisgIHN0cmluZyBmX3R5cGVzX2lfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwcm9ncmFtX25hbWVfICsgIl90eXBlcy5tbGkiOworICBmX3R5cGVzX2lfLm9wZW4oZl90eXBlc19pX25hbWUuY19zdHIoKSk7CisKKyAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBnZXRfb3V0X2RpcigpICsgcHJvZ3JhbV9uYW1lXyArICJfY29uc3RzLm1sIjsKKyAgZl9jb25zdHNfLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKKworICAvLyBQcmludCBoZWFkZXIKKyAgZl90eXBlc18gPDwgb2NhbWxfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PCBvY2FtbF9pbXBvcnRzKCkgPDwgZW5kbDsKKyAgZl90eXBlc19pXyA8PCBvY2FtbF9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8IG9jYW1sX2ltcG9ydHMoKSA8PCBlbmRsOworICBmX2NvbnN0c18gPDwgb2NhbWxfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PCBvY2FtbF9pbXBvcnRzKCkgPDwgZW5kbCA8PCAib3BlbiAiCisgICAgICAgICAgICA8PCBjYXBpdGFsaXplKHByb2dyYW1fbmFtZV8pIDw8ICJfdHlwZXMiIDw8IGVuZGw7Cit9CisKKy8qKgorICogQXV0b2dlbidkIGNvbW1lbnQKKyAqLworc3RyaW5nIHRfb2NhbWxfZ2VuZXJhdG9yOjpvY2FtbF9hdXRvZ2VuX2NvbW1lbnQoKSB7CisgIHJldHVybiBzdGQ6OnN0cmluZygiKCpcbiIpICsgIiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoIiArIFRIUklGVF9WRVJTSU9OICsgIilcbiIgKyAiXG4iCisgICAgICAgICArICIgRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkdcbiIgKyAiKilcbiI7Cit9CisKKy8qKgorICogUHJpbnRzIHN0YW5kYXJkIHRocmlmdCBpbXBvcnRzCisgKi8KK3N0cmluZyB0X29jYW1sX2dlbmVyYXRvcjo6b2NhbWxfaW1wb3J0cygpIHsKKyAgcmV0dXJuICJvcGVuIFRocmlmdCI7Cit9CisKKy8qKgorICogQ2xvc2VzIHRoZSB0eXBlIGZpbGVzCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKKyAgLy8gQ2xvc2UgdHlwZXMgZmlsZQorICBmX3R5cGVzXy5jbG9zZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIEV6LgorICoKKyAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAidHlwZSAiIDw8IGRlY2FwaXRhbGl6ZSh0dHlwZWRlZi0+Z2V0X3N5bWJvbGljKCkpIDw8ICIgPSAiCisgICAgICAgICAgIDw8IHJlbmRlcl9vY2FtbF90eXBlKHR0eXBlZGVmLT5nZXRfdHlwZSgpKSA8PCBlbmRsIDw8IGVuZGw7CisgIGZfdHlwZXNfaV8gPDwgaW5kZW50KCkgPDwgInR5cGUgIiA8PCBkZWNhcGl0YWxpemUodHR5cGVkZWYtPmdldF9zeW1ib2xpYygpKSA8PCAiID0gIgorICAgICAgICAgICAgIDw8IHJlbmRlcl9vY2FtbF90eXBlKHR0eXBlZGVmLT5nZXRfdHlwZSgpKSA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4KKyAqIHRoZSB2YWx1ZXMuCisgKgorICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgaW5kZW50KGZfdHlwZXNfKSA8PCAibW9kdWxlICIgPDwgY2FwaXRhbGl6ZSh0ZW51bS0+Z2V0X25hbWUoKSkgPDwgIiA9ICIgPDwgZW5kbCA8PCAic3RydWN0IgorICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGluZGVudChmX3R5cGVzX2lfKSA8PCAibW9kdWxlICIgPDwgY2FwaXRhbGl6ZSh0ZW51bS0+Z2V0X25hbWUoKSkgPDwgIiA6ICIgPDwgZW5kbCA8PCAic2lnIgorICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChmX3R5cGVzXykgPDwgInR5cGUgdCA9ICIgPDwgZW5kbDsKKyAgaW5kZW50KGZfdHlwZXNfaV8pIDw8ICJ0eXBlIHQgPSAiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgc3RyaW5nIG5hbWUgPSBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgaW5kZW50KGZfdHlwZXNfKSA8PCAifCAiIDw8IG5hbWUgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl90eXBlc19pXykgPDwgInwgIiA8PCBuYW1lIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnQoZl90eXBlc18pIDw8ICJsZXQgdG9faSA9IGZ1bmN0aW9uIiA8PCBlbmRsOworICBpbmRlbnQoZl90eXBlc19pXykgPDwgInZhbCB0b19pIDogdCAtPiBJbnQzMi50IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworICAgIHN0cmluZyBuYW1lID0gY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOworICAgIGluZGVudChmX3R5cGVzXykgPDwgInwgIiA8PCBuYW1lIDw8ICIgLT4gIiA8PCB2YWx1ZSA8PCAibCIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworCisgIGluZGVudChmX3R5cGVzXykgPDwgImxldCBvZl9pID0gZnVuY3Rpb24iIDw8IGVuZGw7CisgIGluZGVudChmX3R5cGVzX2lfKSA8PCAidmFsIG9mX2kgOiBJbnQzMi50IC0+IHQiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgc3RyaW5nIG5hbWUgPSBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgaW5kZW50KGZfdHlwZXNfKSA8PCAifCAiIDw8IHZhbHVlIDw8ICJsIC0+ICIgPDwgbmFtZSA8PCBlbmRsOworICB9CisgIGluZGVudChmX3R5cGVzXykgPDwgInwgXyAtPiByYWlzZSBUaHJpZnRfZXJyb3IiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3R5cGVzXykgPDwgImVuZCIgPDwgZW5kbDsKKyAgaW5kZW50KGZfdHlwZXNfaV8pIDw8ICJlbmQiIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGUgYSBjb25zdGFudCB2YWx1ZQorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKKyAgdF90eXBlKiB0eXBlID0gdGNvbnN0LT5nZXRfdHlwZSgpOworICBzdHJpbmcgbmFtZSA9IGRlY2FwaXRhbGl6ZSh0Y29uc3QtPmdldF9uYW1lKCkpOworICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IHRjb25zdC0+Z2V0X3ZhbHVlKCk7CisKKyAgaW5kZW50KGZfY29uc3RzXykgPDwgImxldCAiIDw8IG5hbWUgPDwgIiA9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlKSA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCisgKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQorICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKKyAqLworc3RyaW5nIHRfb2NhbWxfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKyAgLy8gT0NhbWwgcmVxdWlyZXMgYWxsIGZsb2F0aW5nIHBvaW50IG51bWJlcnMgY29udGFpbiBhIGRlY2ltYWwgcG9pbnQKKyAgb3V0LnNldGYoaW9zOjpzaG93cG9pbnQpOworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgb3V0IDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIG91dCA8PCAodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwID8gInRydWUiIDogImZhbHNlIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgImwiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIkwiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIi4wIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICB0X2VudW0qIHRlbnVtID0gKHRfZW51bSopdHlwZTsKKyAgICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgICAgaW50IHZhbCA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgICBpZiAodmFsID09IHZhbHVlLT5nZXRfaW50ZWdlcigpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8IGNhcGl0YWxpemUodGVudW0tPmdldF9uYW1lKCkpIDw8ICIuIiA8PCBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgc3RyaW5nIGNuYW1lID0gdHlwZV9uYW1lKHR5cGUpOworICAgIHN0cmluZyBjdCA9IHRtcCgiX2MiKTsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiKGxldCAiIDw8IGN0IDw8ICIgPSBuZXcgIiA8PCBjbmFtZSA8PCAiIGluIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisgICAgICBzdHJpbmcgZm5hbWUgPSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICBvdXQgPDwgaW5kZW50KCk7CisgICAgICBvdXQgPDwgY3QgPDwgIiNzZXRfIiA8PCBmbmFtZSA8PCAiICI7CisgICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgY3QgPDwgIikiOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIHN0cmluZyBobSA9IHRtcCgiX2htIik7CisgICAgb3V0IDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgIihsZXQgIiA8PCBobSA8PCAiID0gSGFzaHRibC5jcmVhdGUgIiA8PCB2YWwuc2l6ZSgpIDw8ICIgaW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHN0cmluZyBrZXkgPSByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIHZfaXRlci0+Zmlyc3QpOworICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgaW5kZW50KG91dCkgPDwgIkhhc2h0YmwuYWRkICIgPDwgaG0gPDwgIiAiIDw8IGtleSA8PCAiICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCBobSA8PCAiKSI7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnRfZG93bigpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHRfdHlwZSogZXR5cGU7CisgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICBvdXQgPDwgIlsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCk7CisgICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKTsKKyAgICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiXSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgc3RyaW5nIGhtID0gdG1wKCJfaG0iKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiKGxldCAiIDw8IGhtIDw8ICIgPSBIYXNodGJsLmNyZWF0ZSAiIDw8IHZhbC5zaXplKCkgPDwgIiBpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlcik7CisgICAgICBpbmRlbnQob3V0KSA8PCAiSGFzaHRibC5hZGQgIiA8PCBobSA8PCAiICIgPDwgdmFsIDw8ICIgdHJ1ZTsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8IGhtIDw8ICIpIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBDT05TVEFOVCBGT1IgVFlQRTogIiArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKyAgcmV0dXJuIG91dC5zdHIoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSAic3RydWN0IgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgZ2VuZXJhdGVfb2NhbWxfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZXhjZXB0aW9uLiBCYXNpY2FsbHkgdGhlIHNhbWUKKyAqIGFzIGEgc3RydWN0LCBidXQgYWxzbyBoYXMgYW4gZXhjZXB0aW9uIGRlY2xhcmF0aW9uLgorICoKKyAqIEBwYXJhbSB0eGNlcHRpb24gVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfb2NhbWxfc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGFuIE9DYW1sIHN0cnVjdAorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX29jYW1sX3N0cnVjdF9kZWZpbml0aW9uKGZfdHlwZXNfLCB0c3RydWN0LCBpc19leGNlcHRpb24pOworICBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3Rfc2lnKGZfdHlwZXNfaV8sIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Cit9CisKK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX29jYW1sX21ldGhvZF9jb3B5KG9zdHJlYW0mIG91dCwgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycykgeworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgLyogQ3JlYXRlIGEgY29weSBvZiB0aGUgY3VycmVudCBvYmplY3QgKi8KKyAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCBjb3B5ID0iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgImxldCBfbmV3ID0gT28uY29weSBzZWxmIGluIiA8PCBlbmRsOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKQorICAgIGdlbmVyYXRlX29jYW1sX21lbWJlcl9jb3B5KG91dCwgKm1faXRlcik7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIl9uZXciIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7Cit9CisKK3N0cmluZyB0X29jYW1sX2dlbmVyYXRvcjo6c3RydWN0X21lbWJlcl9jb3B5X29mKHRfdHlwZSogdHlwZSwgc3RyaW5nIHdoYXQpIHsKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gd2hhdCArIHN0cmluZygiI2NvcHkiKTsKKyAgfQorICBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICBzdHJpbmcgY29weV9vZl9rID0gc3RydWN0X21lbWJlcl9jb3B5X29mKCgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKSwgImsiKTsKKyAgICBzdHJpbmcgY29weV9vZl92ID0gc3RydWN0X21lbWJlcl9jb3B5X29mKCgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKSwgInYiKTsKKworICAgIGlmIChjb3B5X29mX2sgPT0gImsiICYmIGNvcHlfb2ZfdiA9PSAidiIpIHsKKyAgICAgIHJldHVybiBzdHJpbmcoIihIYXNodGJsLmNvcHkgIikgKyB3aGF0ICsgc3RyaW5nKCIpIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBzdHJpbmcoCisgICAgICAgICAgICAgICAgICIoKGZ1biBvaCAtPiBsZXQgbmggPSBIYXNodGJsLmNyZWF0ZSAoSGFzaHRibC5sZW5ndGggb2gpIGluIEhhc2h0YmwuaXRlciAoZnVuIGsgdiAiCisgICAgICAgICAgICAgICAgICItPiBIYXNodGJsLmFkZCBuaCAiKSArIGNvcHlfb2ZfayArIHN0cmluZygiICIpICsgY29weV9vZl92ICsgc3RyaW5nKCIpIG9oOyBuaCkgIikKKyAgICAgICAgICAgICArIHdoYXQgKyAiKSI7CisgICAgfQorICB9CisgIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHN0cmluZyBjb3B5X29mID0gc3RydWN0X21lbWJlcl9jb3B5X29mKCgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCksICJrIik7CisKKyAgICBpZiAoY29weV9vZiA9PSAiayIpIHsKKyAgICAgIHJldHVybiBzdHJpbmcoIihIYXNodGJsLmNvcHkgIikgKyB3aGF0ICsgc3RyaW5nKCIpIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBzdHJpbmcoCisgICAgICAgICAgICAgICAgICIoKGZ1biBvaCAtPiBsZXQgbmggPSBIYXNodGJsLmNyZWF0ZSAoSGFzaHRibC5sZW5ndGggb2gpIGluIEhhc2h0YmwuaXRlciAoZnVuIGsgdiAiCisgICAgICAgICAgICAgICAgICItPiBIYXNodGJsLmFkZCBuaCAiKSArIGNvcHlfb2YgKyBzdHJpbmcoIiB0cnVlIikgKyBzdHJpbmcoIikgb2g7IG5oKSAiKSArIHdoYXQKKyAgICAgICAgICAgICArICIpIjsKKyAgICB9CisgIH0KKyAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHN0cmluZyBjb3B5X29mID0gc3RydWN0X21lbWJlcl9jb3B5X29mKCgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCAieCIpOworICAgIGlmIChjb3B5X29mICE9ICJ4IikgeworICAgICAgcmV0dXJuIHN0cmluZygiKExpc3QubWFwIChmdW4geCAtPiAiKSArIGNvcHlfb2YgKyBzdHJpbmcoIikgIikgKyB3aGF0ICsgc3RyaW5nKCIpIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiB3aGF0OworICAgIH0KKyAgfQorICByZXR1cm4gd2hhdDsKK30KKwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2NhbWxfbWVtYmVyX2NvcHkob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0bWVtYmVyKSB7CisgIHN0cmluZyBtbmFtZSA9IGRlY2FwaXRhbGl6ZSh0bWVtYmVyLT5nZXRfbmFtZSgpKTsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0bWVtYmVyLT5nZXRfdHlwZSgpKTsKKworICBzdHJpbmcgZ3JhYl9maWVsZCA9IHN0cmluZygic2VsZiNncmFiXyIpICsgbW5hbWU7CisgIHN0cmluZyBjb3B5X29mID0gc3RydWN0X21lbWJlcl9jb3B5X29mKHR5cGUsIGdyYWJfZmllbGQpOworICBpZiAoY29weV9vZiAhPSBncmFiX2ZpZWxkKSB7CisgICAgaW5kZW50KG91dCk7CisgICAgaWYgKCFzdHJ1Y3RfbWVtYmVyX3BlcnNpc3RlbnQodG1lbWJlcikpIHsKKyAgICAgIG91dCA8PCAiaWYgXyIgPDwgbW5hbWUgPDwgIiA8PiBOb25lIHRoZW4iIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICAiOworICAgIH0KKyAgICBvdXQgPDwgIl9uZXcjc2V0XyIgPDwgbW5hbWUgPDwgIiAiIDw8IGNvcHlfb2YgPDwgIjsiIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3RfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgIHN0cmluZyB0bmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKKyAgaW5kZW50KG91dCkgPDwgImNsYXNzICIgPDwgdG5hbWUgPDwgIiA9IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAib2JqZWN0IChzZWxmKSIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X21lbWJlcihvdXQsIHRuYW1lLCAoKm1faXRlcikpOworICAgICAgb3V0IDw8IGVuZGw7CisgICAgfQorICB9CisgIGdlbmVyYXRlX29jYW1sX21ldGhvZF9jb3B5KG91dCwgbWVtYmVycyk7CisgIGdlbmVyYXRlX29jYW1sX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgImVuZCIgPDwgZW5kbDsKKworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgaW5kZW50KG91dCkgPDwgImV4Y2VwdGlvbiAiIDw8IGNhcGl0YWxpemUodG5hbWUpIDw8ICIgb2YgIiA8PCB0bmFtZSA8PCBlbmRsOworICB9CisKKyAgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdHVyZSBtZW1iZXIgZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4KKyAqCisgKiBAcGFyYW0gdG5hbWUgTmFtZSBvZiB0aGUgcGFyZW50IHN0cnVjdHVyZSBmb3IgdGhlIG1lbWJlcgorICogQHBhcmFtIHRtZW1iZXIgTWVtYmVyIGRlZmluaXRpb24KKyAqLwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2NhbWxfc3RydWN0X21lbWJlcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdG1lbWJlcikgeworICBzdHJpbmcgeCA9IHRtcCgiX3giKTsKKyAgc3RyaW5nIG1uYW1lID0gZGVjYXBpdGFsaXplKHRtZW1iZXItPmdldF9uYW1lKCkpOworCisgIGluZGVudChvdXQpIDw8ICJ2YWwgbXV0YWJsZSBfIiA8PCBtbmFtZSA8PCAiIDogIiA8PCByZW5kZXJfb2NhbWxfdHlwZSh0bWVtYmVyLT5nZXRfdHlwZSgpKTsKKyAgdF9jb25zdF92YWx1ZSogdmFsID0gdG1lbWJlci0+Z2V0X3ZhbHVlKCk7CisgIGlmICh2YWwpIHsKKyAgICBpZiAoc3RydWN0X21lbWJlcl9wZXJzaXN0ZW50KHRtZW1iZXIpKQorICAgICAgb3V0IDw8ICIgPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0bWVtYmVyLT5nZXRfdHlwZSgpLCB0bWVtYmVyLT5nZXRfdmFsdWUoKSkgPDwgZW5kbDsKKyAgICBlbHNlCisgICAgICBvdXQgPDwgIiBvcHRpb24gPSBTb21lICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHRtZW1iZXItPmdldF90eXBlKCksIHRtZW1iZXItPmdldF92YWx1ZSgpKQorICAgICAgICAgIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgLy8gYXNzZXJ0KCFzdHJ1Y3RfbWVtYmVyX3BlcnNpc3RlbnQodG1lbWJlcikpCisgICAgb3V0IDw8ICIgb3B0aW9uID0gTm9uZSIgPDwgZW5kbDsKKyAgfQorCisgIGlmIChzdHJ1Y3RfbWVtYmVyX3BlcnNpc3RlbnQodG1lbWJlcikpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIGdldF8iIDw8IG1uYW1lIDw8ICIgPSBTb21lIF8iIDw8IG1uYW1lIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCBncmFiXyIgPDwgbW5hbWUgPDwgIiA9IF8iIDw8IG1uYW1lIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCBzZXRfIiA8PCBtbmFtZSA8PCAiICIgPDwgeCA8PCAiID0gXyIgPDwgbW5hbWUgPDwgIiA8LSAiIDw8IHggPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIGdldF8iIDw8IG1uYW1lIDw8ICIgPSBfIiA8PCBtbmFtZSA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJtZXRob2QgZ3JhYl8iIDw8IG1uYW1lIDw8ICIgPSBtYXRjaCBfIiA8PCBtbmFtZQorICAgICAgICAgICAgICAgIDw8ICIgd2l0aCBOb25lLT5yYWlzZSAoRmllbGRfZW1wdHkgXCIiIDw8IHRuYW1lIDw8ICIuIiA8PCBtbmFtZSA8PCAiXCIpIHwgU29tZSAiCisgICAgICAgICAgICAgICAgPDwgeCA8PCAiIC0+ICIgPDwgeCA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJtZXRob2Qgc2V0XyIgPDwgbW5hbWUgPDwgIiAiIDw8IHggPDwgIiA9IF8iIDw8IG1uYW1lIDw8ICIgPC0gU29tZSAiIDw8IHgKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJtZXRob2QgdW5zZXRfIiA8PCBtbmFtZSA8PCAiID0gXyIgPDwgbW5hbWUgPDwgIiA8LSBOb25lIiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCByZXNldF8iIDw8IG1uYW1lIDw8ICIgPSBfIiA8PCBtbmFtZSA8PCAiIDwtICI7CisgIGlmICh2YWwpIHsKKyAgICBpZiAoc3RydWN0X21lbWJlcl9wZXJzaXN0ZW50KHRtZW1iZXIpKQorICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0bWVtYmVyLT5nZXRfdHlwZSgpLCB0bWVtYmVyLT5nZXRfdmFsdWUoKSkgPDwgZW5kbDsKKyAgICBlbHNlCisgICAgICBvdXQgPDwgIlNvbWUgIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodG1lbWJlci0+Z2V0X3R5cGUoKSwgdG1lbWJlci0+Z2V0X3ZhbHVlKCkpIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8ICJOb25lIiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogQ2hlY2sgd2hldGhlciBhIG1lbWJlciBvZiB0aGUgc3RydWN0dXJlIGNhbiBub3QgaGF2ZSB1bmRlZmluZWQgdmFsdWUKKyAqCisgKiBAcGFyYW0gdG1lbWJlciBNZW1iZXIgZGVmaW5pdGlvbgorICovCitib29sIHRfb2NhbWxfZ2VuZXJhdG9yOjpzdHJ1Y3RfbWVtYmVyX3BlcnNpc3RlbnQodF9maWVsZCogdG1lbWJlcikgeworICB0X2NvbnN0X3ZhbHVlKiB2YWwgPSB0bWVtYmVyLT5nZXRfdmFsdWUoKTsKKyAgcmV0dXJuICh2YWwgPyB0cnVlIDogZmFsc2UpOworfQorCisvKioKKyAqIENoZWNrIHdoZXRoZXIgYSBtZW1iZXIgb2YgdGhlIHN0cnVjdHVyZSBjYW4gYmUgc2tpcHBlZCBkdXJpbmcgZW5jb2RpbmcKKyAqCisgKiBAcGFyYW0gdG1lbWJlciBNZW1iZXIgZGVmaW5pdGlvbgorICovCitib29sIHRfb2NhbWxfZ2VuZXJhdG9yOjpzdHJ1Y3RfbWVtYmVyX29taXRhYmxlKHRfZmllbGQqIHRtZW1iZXIpIHsKKyAgcmV0dXJuICh0bWVtYmVyLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCk7Cit9CisKKy8qKgorICogRmlndXJlIG91dCB3aGV0aGVyIGEgbWVtYmVyIG9mIHRoZSBzdHJ1Y3R1cmUgaGFzCisgKiBhIGNoZWFwbHkgY29tcGFyYWJsZSBkZWZhdWx0IHZhbHVlLgorICoKKyAqIEBwYXJhbSB0bWVtYmVyIE1lbWJlciBkZWZpbml0aW9uCisgKi8KK2Jvb2wgdF9vY2FtbF9nZW5lcmF0b3I6OnN0cnVjdF9tZW1iZXJfZGVmYXVsdF9jaGVhcGx5X2NvbXBhcmFibGUodF9maWVsZCogdG1lbWJlcikgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRtZW1iZXItPmdldF90eXBlKCkpOworICB0X2NvbnN0X3ZhbHVlKiB2YWwgPSB0bWVtYmVyLT5nZXRfdmFsdWUoKTsKKyAgaWYgKCF2YWwpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAvLyBCYXNlIHR5cGVzIGFyZSBnZW5lcmFsbHkgY2hlYXBseSBjb21wYXJlZCBmb3Igc3RydWN0dXJhbCBlcXVpdmFsZW5jZS4KKyAgICBzd2l0Y2ggKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAodmFsLT5nZXRfZG91YmxlKCkgPT0gMC4wKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgLy8gRW1wdHkgbGlzdHMgYXJlIGNoZWFwbHkgY29tcGFyZWQgZm9yIHN0cnVjdHVyYWwgZXF1aXZhbGVuY2UuCisgICAgLy8gSXMgZW1wdHkgbGlzdD8KKyAgICBpZiAodmFsLT5nZXRfbGlzdCgpLnNpemUoKSA9PSAwKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgZWxzZQorICAgICAgcmV0dXJuIGZhbHNlOworICB9IGVsc2UgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX29jYW1sX3N0cnVjdF9zaWcob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgc3RyaW5nIHRuYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOworICBpbmRlbnQob3V0KSA8PCAiY2xhc3MgIiA8PCB0bmFtZSA8PCAiIDoiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJvYmplY3QgKCdhKSIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICBzdHJpbmcgeCA9IHRtcCgiX3giKTsKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIHN0cmluZyBtbmFtZSA9IGRlY2FwaXRhbGl6ZSgoKm1faXRlciktPmdldF9uYW1lKCkpOworICAgICAgc3RyaW5nIHR5cGUgPSByZW5kZXJfb2NhbWxfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgICAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCBnZXRfIiA8PCBtbmFtZSA8PCAiIDogIiA8PCB0eXBlIDw8ICIgb3B0aW9uIiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCBncmFiXyIgPDwgbW5hbWUgPDwgIiA6ICIgPDwgdHlwZSA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCBzZXRfIiA8PCBtbmFtZSA8PCAiIDogIiA8PCB0eXBlIDw8ICIgLT4gdW5pdCIgPDwgZW5kbDsKKyAgICAgIGlmICghc3RydWN0X21lbWJlcl9wZXJzaXN0ZW50KCptX2l0ZXIpKQorICAgICAgICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIHVuc2V0XyIgPDwgbW5hbWUgPDwgIiA6IHVuaXQiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIHJlc2V0XyIgPDwgbW5hbWUgPDwgIiA6IHVuaXQiIDw8IGVuZGw7CisgICAgfQorICB9CisgIGluZGVudChvdXQpIDw8ICJtZXRob2QgY29weSA6ICdhIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIHdyaXRlIDogUHJvdG9jb2wudCAtPiB1bml0IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOworCisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiZXhjZXB0aW9uICIgPDwgY2FwaXRhbGl6ZSh0bmFtZSkgPDwgIiBvZiAiIDw8IHRuYW1lIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAidmFsIHJlYWRfIiA8PCB0bmFtZSA8PCAiIDogUHJvdG9jb2wudCAtPiAiIDw8IHRuYW1lIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSByZWFkIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKKyAqLwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2NhbWxfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgc3RyaW5nIHNuYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOworICBzdHJpbmcgc3RyID0gdG1wKCJfc3RyIik7CisgIHN0cmluZyB0ID0gdG1wKCJfdCIpOworICBzdHJpbmcgaWQgPSB0bXAoIl9pZCIpOworICBpbmRlbnQob3V0KSA8PCAibGV0IHJlYyByZWFkXyIgPDwgc25hbWUgPDwgIiAoaXByb3QgOiBQcm90b2NvbC50KSA9IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgImxldCAiIDw8IHN0ciA8PCAiID0gbmV3ICIgPDwgc25hbWUgPDwgIiBpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJpZ25vcmUoaXByb3QjcmVhZFN0cnVjdEJlZ2luKTsiIDw8IGVuZGw7CisKKyAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCisgIGluZGVudChvdXQpIDw8ICIodHJ5IHdoaWxlIHRydWUgZG8iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpbmRlbnRfdXAoKTsKKworICAvLyBSZWFkIGJlZ2lubmluZyBmaWVsZCBtYXJrZXIKKyAgaW5kZW50KG91dCkgPDwgImxldCAoXywiIDw8IHQgPDwgIiwiIDw8IGlkIDw8ICIpID0gaXByb3QjcmVhZEZpZWxkQmVnaW4gaW4iIDw8IGVuZGw7CisKKyAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyIGFuZCBicmVhaworICBpbmRlbnQob3V0KSA8PCAiaWYgIiA8PCB0IDw8ICIgPSBQcm90b2NvbC5UX1NUT1AgdGhlbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJyYWlzZSBCcmVhayIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgImVsc2UgKCk7IiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICIobWF0Y2ggIiA8PCBpZCA8PCAiIHdpdGggIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaW5kZW50KG91dCkgPDwgInwgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiIC0+ICgiOworICAgIG91dCA8PCAiaWYgIiA8PCB0IDw8ICIgPSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIgdGhlbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsIHN0cik7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImVsc2UiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgaXByb3Qjc2tpcCAiIDw8IHQgPDwgIikiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIC8vIEluIHRoZSBkZWZhdWx0IGNhc2Ugd2Ugc2tpcCB0aGUgZmllbGQKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ8IF8gLT4gIgorICAgICAgPDwgImlwcm90I3NraXAgIiA8PCB0IDw8ICIpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgLy8gUmVhZCBmaWVsZCBlbmQgbWFya2VyCisgIGluZGVudChvdXQpIDw8ICJpcHJvdCNyZWFkRmllbGRFbmQ7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAiZG9uZTsgKCkiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ3aXRoIEJyZWFrIC0+ICgpKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgImlwcm90I3JlYWRTdHJ1Y3RFbmQ7IiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8IHN0ciA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudF9kb3duKCk7Cit9CisKK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX29jYW1sX3N0cnVjdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIHN0cmluZyBzdHIgPSB0bXAoIl9zdHIiKTsKKyAgc3RyaW5nIGYgPSB0bXAoIl9mIik7CisKKyAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCB3cml0ZSAob3Byb3QgOiBQcm90b2NvbC50KSA9IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90I3dyaXRlU3RydWN0QmVnaW4gXCIiIDw8IG5hbWUgPDwgIlwiOyIgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfZmllbGQqIHRtZW1iZXIgPSAoKmZfaXRlcik7CisgICAgc3RyaW5nIG1uYW1lID0gIl8iICsgZGVjYXBpdGFsaXplKHRtZW1iZXItPmdldF9uYW1lKCkpOworICAgIHN0cmluZyBfdjsKKworICAgIGlmIChzdHJ1Y3RfbWVtYmVyX3BlcnNpc3RlbnQodG1lbWJlcikpIHsKKworICAgICAgaWYgKHN0cnVjdF9tZW1iZXJfb21pdGFibGUodG1lbWJlcikgJiYgc3RydWN0X21lbWJlcl9kZWZhdWx0X2NoZWFwbHlfY29tcGFyYWJsZSh0bWVtYmVyKSkgeworICAgICAgICBfdiA9ICJfdiI7CisgICAgICAgIC8vIEF2b2lkIHJlZHVuZGFudCBlbmNvZGluZyBvZiBtZW1iZXJzIGhhdmluZyBkZWZhdWx0IHZhbHVlcy4KKyAgICAgICAgaW5kZW50KG91dCkgPDwgIihtYXRjaCAiIDw8IG1uYW1lIDw8ICIgd2l0aCAiCisgICAgICAgICAgICAgICAgICAgIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0bWVtYmVyLT5nZXRfdHlwZSgpLCB0bWVtYmVyLT5nZXRfdmFsdWUoKSkgPDwgIiAtPiAoKSB8ICIKKyAgICAgICAgICAgICAgICAgICAgPDwgX3YgPDwgIiAtPiAiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBfdiA9IG1uYW1lOworICAgICAgICBpbmRlbnQob3V0KSA8PCAiKCIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgIH0gZWxzZSB7CisKKyAgICAgIGluZGVudChvdXQpIDw8ICIobWF0Y2ggIiA8PCBtbmFtZSA8PCAiIHdpdGggIjsKKworICAgICAgaWYgKHN0cnVjdF9tZW1iZXJfb21pdGFibGUodG1lbWJlcikpIHsKKyAgICAgICAgb3V0IDw8ICJOb25lIC0+ICgpIjsKKworICAgICAgICBpZiAoc3RydWN0X21lbWJlcl9kZWZhdWx0X2NoZWFwbHlfY29tcGFyYWJsZSh0bWVtYmVyKSkgeworICAgICAgICAgIC8vIEF2b2lkIHJlZHVuZGFudCBlbmNvZGluZyBvZiBtZW1iZXJzIGhhdmluZyBkZWZhdWx0IHZhbHVlcy4KKyAgICAgICAgICBvdXQgPDwgIiB8IFNvbWUgIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodG1lbWJlci0+Z2V0X3R5cGUoKSwgdG1lbWJlci0+Z2V0X3ZhbHVlKCkpCisgICAgICAgICAgICAgIDw8ICIgLT4gKCkiOworICAgICAgICB9CisgICAgICAgIG91dCA8PCAiIHwgU29tZSBfdiAtPiAiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInwgTm9uZSAtPiByYWlzZSAoRmllbGRfZW1wdHkgXCIiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiLiIgPDwgbW5hbWUKKyAgICAgICAgICAgICAgICAgICAgPDwgIlwiKSIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInwgU29tZSBfdiAtPiAiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIF92ID0gIl92IjsKKyAgICB9CisgICAgaW5kZW50X3VwKCk7CisgICAgLy8gV3JpdGUgZmllbGQgaGVhZGVyCisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90I3dyaXRlRmllbGRCZWdpbihcIiIgPDwgdG1lbWJlci0+Z2V0X25hbWUoKSA8PCAiXCIsIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSh0bWVtYmVyLT5nZXRfdHlwZSgpKSA8PCAiLCIgPDwgdG1lbWJlci0+Z2V0X2tleSgpIDw8ICIpOyIgPDwgZW5kbDsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgdG1lbWJlciwgX3YpOworCisgICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90I3dyaXRlRmllbGRFbmQiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICIpOyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCisgIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qjd3JpdGVGaWVsZFN0b3A7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdCN3cml0ZVN0cnVjdEVuZCIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBnZXRfb3V0X2RpcigpICsgY2FwaXRhbGl6ZShzZXJ2aWNlX25hbWVfKSArICIubWwiOworICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7CisgIHN0cmluZyBmX3NlcnZpY2VfaV9uYW1lID0gZ2V0X291dF9kaXIoKSArIGNhcGl0YWxpemUoc2VydmljZV9uYW1lXykgKyAiLm1saSI7CisgIGZfc2VydmljZV9pXy5vcGVuKGZfc2VydmljZV9pX25hbWUuY19zdHIoKSk7CisKKyAgZl9zZXJ2aWNlXyA8PCBvY2FtbF9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8IG9jYW1sX2ltcG9ydHMoKSA8PCBlbmRsOworICBmX3NlcnZpY2VfaV8gPDwgb2NhbWxfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PCBvY2FtbF9pbXBvcnRzKCkgPDwgZW5kbDsKKworICAvKiBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGZfc2VydmljZV8gPDwKKyAgICAgICJvcGVuICIgPDwgY2FwaXRhbGl6ZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSkgPDwgZW5kbDsKKyAgICBmX3NlcnZpY2VfaV8gPDwKKyAgICAgICJvcGVuICIgPDwgY2FwaXRhbGl6ZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSkgPDwgZW5kbDsKKyAgfQorICAqLworICBmX3NlcnZpY2VfIDw8ICJvcGVuICIgPDwgY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKSA8PCAiX3R5cGVzIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZl9zZXJ2aWNlX2lfIDw8ICJvcGVuICIgPDwgY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKSA8PCAiX3R5cGVzIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHRocmVlIG1haW4gcGFydHMgb2YgdGhlIHNlcnZpY2UKKyAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRzZXJ2aWNlKTsKKworICAvLyBDbG9zZSBzZXJ2aWNlIGZpbGUKKyAgZl9zZXJ2aWNlXy5jbG9zZSgpOworICBmX3NlcnZpY2VfaV8uY2xvc2UoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgYSBzZXJ2aWNlLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIigqIEhFTFBFUiBGVU5DVElPTlMgQU5EIFNUUlVDVFVSRVMgKikiIDw8IGVuZGwgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCB0cywgZmFsc2UpOworICAgIGdlbmVyYXRlX29jYW1sX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KKyAqLwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2NhbWxfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCBkZWNhcGl0YWxpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICJfcmVzdWx0Iik7CisgIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7CisgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKKyAgfQorCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7CisgIH0KKyAgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiY2xhc3MgdmlydHVhbCBpZmFjZSA9IiA8PCBlbmRsIDw8ICJvYmplY3QgKHNlbGYpIiA8PCBlbmRsOworICBmX3NlcnZpY2VfaV8gPDwgaW5kZW50KCkgPDwgImNsYXNzIHZpcnR1YWwgaWZhY2UgOiIgPDwgZW5kbCA8PCAib2JqZWN0IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgc3RyaW5nIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaW5oZXJpdCAiIDw8IGV4dGVuZHMgPDwgIi5pZmFjZSIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlX2lfKSA8PCAiaW5oZXJpdCAiIDw8IGV4dGVuZHMgPDwgIi5pZmFjZSIgPDwgZW5kbDsKKyAgfQorCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBmdCA9IGZ1bmN0aW9uX3R5cGUoKmZfaXRlciwgdHJ1ZSwgdHJ1ZSk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibWV0aG9kIHZpcnR1YWwgIiA8PCBkZWNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiIDogIgorICAgICAgICAgICAgICAgPDwgZnQgPDwgZW5kbDsKKyAgICBmX3NlcnZpY2VfaV8gPDwgaW5kZW50KCkgPDwgIm1ldGhvZCB2aXJ0dWFsICIgPDwgZGVjYXBpdGFsaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA6ICIKKyAgICAgICAgICAgICAgICAgPDwgZnQgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlX2lfKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4gTm90ZSB0aGF0IGluIE9DYW1sLCB0aGUgY2xpZW50IGRvZXNuJ3QgaW1wbGVtZW50IGlmYWNlLgorICpUaGlzIGlzIGJlY2F1c2UKKyAqIFRoZSBjbGllbnQgZG9lcyBub3QgKGFuZCBzaG91bGQgbm90IGhhdmUgdG8pIGRlYWwgd2l0aCBhcmd1bWVudHMgYmVpbmcgTm9uZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiY2xhc3MgY2xpZW50IChpcHJvdCA6IFByb3RvY29sLnQpIChvcHJvdCA6IFByb3RvY29sLnQpID0iIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgIDw8ICJvYmplY3QgKHNlbGYpIiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlX2lfKSA8PCAiY2xhc3MgY2xpZW50IDogUHJvdG9jb2wudCAtPiBQcm90b2NvbC50IC0+ICIgPDwgZW5kbCA8PCAib2JqZWN0IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaW5oZXJpdCAiIDw8IGV4dGVuZHMgPDwgIi5jbGllbnQgaXByb3Qgb3Byb3QgYXMgc3VwZXIiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV9pXykgPDwgImluaGVyaXQgIiA8PCBleHRlbmRzIDw8ICIuY2xpZW50IiA8PCBlbmRsOworICB9CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidmFsIG11dGFibGUgc2VxaWQgPSAwIiA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisgICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisKKyAgICAvLyBPcGVuIGZ1bmN0aW9uCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJtZXRob2QgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgIiA9ICIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlX2lfKSA8PCAibWV0aG9kICIgPDwgZGVjYXBpdGFsaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCBmdW5jdGlvbl90eXBlKCpmX2l0ZXIsIHRydWUsIGZhbHNlKSA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAic2VsZiNzZW5kXyIgPDwgZnVubmFtZTsKKworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIgIiA8PCBkZWNhcGl0YWxpemUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8ICI7IiA8PCBlbmRsOworCisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCAic2VsZiNyZWN2XyIgPDwgZnVubmFtZSA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworCisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJtZXRob2QgcHJpdmF0ZSBzZW5kXyIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8ICIgPSAiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBzdGQ6OnN0cmluZyBhcmdzbmFtZSA9IGRlY2FwaXRhbGl6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiKTsKKworICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdCBoZWFkZXIKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdCN3cml0ZU1lc3NhZ2VCZWdpbiAoXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsICIKKyAgICAgICAgICAgICAgIDw8ICgoKmZfaXRlciktPmlzX29uZXdheSgpID8gIlByb3RvY29sLk9ORVdBWSIgOiAiUHJvdG9jb2wuQ0FMTCIpIDw8ICIsIHNlcWlkKTsiCisgICAgICAgICAgICAgICA8PCBlbmRsOworCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibGV0IGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiIGluIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3Mjc2V0XyIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIiAiCisgICAgICAgICAgICAgICAgIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKworICAgIC8vIFdyaXRlIHRvIHRoZSBzdHJlYW0KKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzI3dyaXRlIG9wcm90OyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qjd3JpdGVNZXNzYWdlRW5kOyIKKyAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90I2dldFRyYW5zcG9ydCNmbHVzaCIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0bmFtZSA9IGRlY2FwaXRhbGl6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOworICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKKworICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vYXJncyk7CisgICAgICAvLyBPcGVuIGZ1bmN0aW9uCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJtZXRob2QgcHJpdmF0ZSAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbikgPDwgIiA9IgorICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgIC8vIFRPRE8obWNzbGVlKTogVmFsaWRhdGUgbWVzc2FnZSByZXBseSBoZXJlLCBzZXEgaWRzIGV0Yy4KKworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibGV0IChmbmFtZSwgbXR5cGUsIHJzZXFpZCkgPSBpcHJvdCNyZWFkTWVzc2FnZUJlZ2luIGluIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIoaWYgbXR5cGUgPSBQcm90b2NvbC5FWENFUFRJT04gdGhlbiIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiICBsZXQgeCA9IEFwcGxpY2F0aW9uX0V4bi5yZWFkIGlwcm90IGluIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIChpcHJvdCNyZWFkTWVzc2FnZUVuZDsiIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICIgICByYWlzZSAoQXBwbGljYXRpb25fRXhuLkUgeCkpIiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImVsc2UgKCkpOyIgPDwgZW5kbDsKKyAgICAgIHN0cmluZyByZXMgPSAiXyI7CisKKyAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKworICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSB8fCB4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgICAgICByZXMgPSAicmVzdWx0IjsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImxldCAiIDw8IHJlcyA8PCAiID0gcmVhZF8iIDw8IHJlc3VsdG5hbWUgPDwgIiBpcHJvdCBpbiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaXByb3QjcmVhZE1lc3NhZ2VFbmQ7IiA8PCBlbmRsOworCisgICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibWF0Y2ggcmVzdWx0I2dldF9zdWNjZXNzIHdpdGggU29tZSB2IC0+IHYgfCBOb25lIC0+ICgiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgfQorCisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIobWF0Y2ggcmVzdWx0I2dldF8iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgIDw8ICIgd2l0aCBOb25lIC0+ICgpIHwgU29tZSBfdiAtPiIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHJhaXNlICgiIDw8IGNhcGl0YWxpemUodHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIF92KSk7IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KKyAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIigpIiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXworICAgICAgICAgICAgPDwgaW5kZW50KCkKKyAgICAgICAgICAgIDw8ICJyYWlzZSAoQXBwbGljYXRpb25fRXhuLkUgKEFwcGxpY2F0aW9uX0V4bi5jcmVhdGUgQXBwbGljYXRpb25fRXhuLk1JU1NJTkdfUkVTVUxUIFwiIgorICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKSkpIiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgfQorCisgICAgICAvLyBDbG9zZSBmdW5jdGlvbgorICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnRfZG93bigpOworICAgIH0KKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfaV8pIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiY2xhc3MgcHJvY2Vzc29yIChoYW5kbGVyIDogaWZhY2UpID0iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9iamVjdCAoc2VsZikiCisgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlX2lfKSA8PCAiY2xhc3MgcHJvY2Vzc29yIDogaWZhY2UgLT4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9iamVjdCIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaW5oZXJpdCBQcm9jZXNzb3IudCIgPDwgZW5kbCA8PCBlbmRsOworICBmX3NlcnZpY2VfaV8gPDwgaW5kZW50KCkgPDwgImluaGVyaXQgUHJvY2Vzc29yLnQiIDw8IGVuZGwgPDwgZW5kbDsKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaW5oZXJpdCAiICsgZXh0ZW5kcyArICIucHJvY2Vzc29yIChoYW5kbGVyIDo+ICIgKyBleHRlbmRzICsgIi5pZmFjZSkiCisgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV9pXykgPDwgImluaGVyaXQgIiArIGV4dGVuZHMgKyAiLnByb2Nlc3NvciIgPDwgZW5kbDsKKyAgfQorCisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInZhbCBwcm9jZXNzTWFwID0gSGFzaHRibC5jcmVhdGUgIiA8PCBmdW5jdGlvbnMuc2l6ZSgpIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50KGZfc2VydmljZV9pXykKKyAgICAgIDw8ICJ2YWwgcHJvY2Vzc01hcCA6IChzdHJpbmcsIGludCAqIFByb3RvY29sLnQgKiBQcm90b2NvbC50IC0+IHVuaXQpIEhhc2h0YmwudCIgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAibWV0aG9kIHByb2Nlc3MgaXByb3Qgb3Byb3QgPSIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV9pXykgPDwgIm1ldGhvZCBwcm9jZXNzIDogUHJvdG9jb2wudCAtPiBQcm90b2NvbC50IC0+IGJvb2wiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImxldCAobmFtZSwgdHlwLCBzZXFpZCkgID0gaXByb3QjcmVhZE1lc3NhZ2VCZWdpbiBpbiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIC8vIFRPRE8obWNzbGVlKTogdmFsaWRhdGUgbWVzc2FnZQorCisgIC8vIEhPVDogZGljdGlvbmFyeSBmdW5jdGlvbiBsb29rdXAKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgSGFzaHRibC5tZW0gcHJvY2Vzc01hcCBuYW1lIHRoZW4iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiICAoSGFzaHRibC5maW5kIHByb2Nlc3NNYXAgbmFtZSkgKHNlcWlkLCBpcHJvdCwgb3Byb3QpIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgImVsc2UgKCIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBpcHJvdCNza2lwKFByb3RvY29sLlRfU1RSVUNUKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICBpcHJvdCNyZWFkTWVzc2FnZUVuZDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiICBsZXQgeCA9IEFwcGxpY2F0aW9uX0V4bi5jcmVhdGUgQXBwbGljYXRpb25fRXhuLlVOS05PV05fTUVUSE9EIChcIlVua25vd24gIgorICAgICAgICAgICAgICAgICJmdW5jdGlvbiBcIl5uYW1lKSBpbiIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICIgICAgb3Byb3Qjd3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgUHJvdG9jb2wuRVhDRVBUSU9OLCBzZXFpZCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIiAgICB4I3dyaXRlIG9wcm90OyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICAgIG9wcm90I3dyaXRlTWVzc2FnZUVuZDsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAgIG9wcm90I2dldFRyYW5zcG9ydCNmbHVzaCIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiKTsiIDw8IGVuZGw7CisKKyAgLy8gUmVhZCBlbmQgb2YgYXJncyBmaWVsZCwgdGhlIFRfU1RPUCwgYW5kIHRoZSBzdHJ1Y3QgY2xvc2UKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJ1ZSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7CisgIH0KKworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImluaXRpYWxpemVyIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJIYXNodGJsLmFkZCBwcm9jZXNzTWFwIFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgIDw8ICJcIiBzZWxmI3Byb2Nlc3NfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlX2lfKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKKyAqLwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgKHZvaWQpdHNlcnZpY2U7CisgIC8vIE9wZW4gZnVuY3Rpb24KKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJtZXRob2QgcHJpdmF0ZSBwcm9jZXNzXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICA8PCAiIChzZXFpZCwgaXByb3QsIG9wcm90KSA9IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBzdHJpbmcgYXJnc25hbWUgPSBkZWNhcGl0YWxpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICJfYXJncyI7CisgIHN0cmluZyByZXN1bHRuYW1lID0gZGVjYXBpdGFsaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiX3Jlc3VsdCI7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKKyAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIHN0cmluZyBhcmdzID0gImFyZ3MiOworICBpZiAoZmllbGRzLnNpemUoKSA9PSAwKSB7CisgICAgYXJncyA9ICJfIjsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImxldCAiIDw8IGFyZ3MgPDwgIiA9IHJlYWRfIiA8PCBhcmdzbmFtZSA8PCAiIGlwcm90IGluIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaXByb3QjcmVhZE1lc3NhZ2VFbmQ7IiA8PCBlbmRsOworCisgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisKKyAgLy8gRGVjbGFyZSByZXN1bHQgZm9yIG5vbiBvbmV3YXkgZnVuY3Rpb24KKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibGV0IHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIiBpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgfQorCisgIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKKyAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiKHRyeSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJyZXN1bHQjc2V0X3N1Y2Nlc3MgIjsKKyAgfQorICBmX3NlcnZpY2VfIDw8ICIoaGFuZGxlciMiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBmX3NlcnZpY2VfIDw8ICIgYXJncyNnZXRfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7CisKKyAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIndpdGgiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInwgIiA8PCBjYXBpdGFsaXplKHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCkpKSA8PCAiICIKKyAgICAgICAgICAgICAgICAgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgLT4gIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQjc2V0XyIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIgorICAgICAgICAgICAgICAgICAgIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIoKSI7CisgICAgICB9CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIpOyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIFNob3J0Y3V0IG91dCBoZXJlIGZvciBvbmV3YXkgZnVuY3Rpb25zCisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiKCkiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIHJldHVybjsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90I3dyaXRlTWVzc2FnZUJlZ2luIChcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgPDwgIlwiLCBQcm90b2NvbC5SRVBMWSwgc2VxaWQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmVzdWx0I3dyaXRlIG9wcm90OyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdCN3cml0ZU1lc3NhZ2VFbmQ7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIm9wcm90I2dldFRyYW5zcG9ydCNmbHVzaCIgPDwgZW5kbDsKKworICAvLyBDbG9zZSBmdW5jdGlvbgorICBpbmRlbnRfZG93bigpOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnRfZG93bigpOworfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCkgeworICB0X3R5cGUqIHR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7CisKKyAgc3RyaW5nIG5hbWUgPSBkZWNhcGl0YWxpemUodGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIjc2V0XyIgPDwgbmFtZSA8PCAiICI7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3V0LCB0eXBlKTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFIjsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgb3V0IDw8ICJpcHJvdCMiOworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3QiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBvdXQgPDwgInJlYWRTdHJpbmciOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgb3V0IDw8ICJyZWFkQm9vbCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgb3V0IDw8ICJyZWFkQnl0ZSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIG91dCA8PCAicmVhZEkxNiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIG91dCA8PCAicmVhZEkzMiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIG91dCA8PCAicmVhZEk2NCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIG91dCA8PCAicmVhZERvdWJsZSI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBvY2FtbCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHN0cmluZyBlbmFtZSA9IGNhcGl0YWxpemUodHlwZS0+Z2V0X25hbWUoKSk7CisgICAgb3V0IDw8ICIoIiA8PCBlbmFtZSA8PCAiLm9mX2kgaXByb3QjcmVhZEkzMikiOworICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIFRZUEUgJyVzJ1xuIiwgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhbiB1bnNlcmlhbGl6ZXIgZm9yIGEgc3RydWN0LCBjYWxsaW5nIHJlYWQoKQorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgcHJlZml4ID0gIiI7CisgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCk7CisgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgeworICAgIHByZWZpeCA9IGNhcGl0YWxpemUocHJvZ3JhbS0+Z2V0X25hbWUoKSkgKyAiX3R5cGVzLiI7CisgIH0KKyAgc3RyaW5nIG5hbWUgPSBkZWNhcGl0YWxpemUodHN0cnVjdC0+Z2V0X25hbWUoKSk7CisgIG91dCA8PCAiKCIgPDwgcHJlZml4IDw8ICJyZWFkXyIgPDwgbmFtZSA8PCAiIGlwcm90KSI7Cit9CisKKy8qKgorICogU2VyaWFsaXplIGEgY29udGFpbmVyIGJ5IHdyaXRpbmcgb3V0IHRoZSBoZWFkZXIgZm9sbG93ZWQgYnkKKyAqIGRhdGEgYW5kIHRoZW4gYSBmb290ZXIuCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUpIHsKKyAgc3RyaW5nIHNpemUgPSB0bXAoIl9zaXplIik7CisgIHN0cmluZyBrdHlwZSA9IHRtcCgiX2t0eXBlIik7CisgIHN0cmluZyB2dHlwZSA9IHRtcCgiX3Z0eXBlIik7CisgIHN0cmluZyBldHlwZSA9IHRtcCgiX2V0eXBlIik7CisgIHN0cmluZyBjb24gPSB0bXAoIl9jb24iKTsKKworICB0X2ZpZWxkIGZzaXplKGdfdHlwZV9pMzIsIHNpemUpOworICB0X2ZpZWxkIGZrdHlwZShnX3R5cGVfaTgsIGt0eXBlKTsKKyAgdF9maWVsZCBmdnR5cGUoZ190eXBlX2k4LCB2dHlwZSk7CisgIHRfZmllbGQgZmV0eXBlKGdfdHlwZV9pOCwgZXR5cGUpOworCisgIG91dCA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiKGxldCAoIiA8PCBrdHlwZSA8PCAiLCIgPDwgdnR5cGUgPDwgIiwiIDw8IHNpemUgPDwgIikgPSBpcHJvdCNyZWFkTWFwQmVnaW4gaW4iCisgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAibGV0ICIgPDwgY29uIDw8ICIgPSBIYXNodGJsLmNyZWF0ZSAiIDw8IHNpemUgPDwgIiBpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yIGkgPSAxIHRvICIgPDwgc2l6ZSA8PCAiIGRvIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJsZXQgX2sgPSAiOworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3V0LCAoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKTsKKyAgICBvdXQgPDwgIiBpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAibGV0IF92ID0gIjsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG91dCwgKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSk7CisgICAgb3V0IDw8ICIgaW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgIkhhc2h0YmwuYWRkICIgPDwgY29uIDw8ICIgX2sgX3YiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJkb25lOyBpcHJvdCNyZWFkTWFwRW5kOyAiIDw8IGNvbiA8PCAiKSI7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiKGxldCAoIiA8PCBldHlwZSA8PCAiLCIgPDwgc2l6ZSA8PCAiKSA9IGlwcm90I3JlYWRTZXRCZWdpbiBpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAibGV0ICIgPDwgY29uIDw8ICIgPSBIYXNodGJsLmNyZWF0ZSAiIDw8IHNpemUgPDwgIiBpbiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yIGkgPSAxIHRvICIgPDwgc2l6ZSA8PCAiIGRvIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJIYXNodGJsLmFkZCAiIDw8IGNvbiA8PCAiICI7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvdXQsICgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKTsKKyAgICBvdXQgPDwgIiB0cnVlIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgImRvbmU7IGlwcm90I3JlYWRTZXRFbmQ7ICIgPDwgY29uIDw8ICIpIjsKKyAgICBpbmRlbnRfZG93bigpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiKGxldCAoIiA8PCBldHlwZSA8PCAiLCIgPDwgc2l6ZSA8PCAiKSA9IGlwcm90I3JlYWRMaXN0QmVnaW4gaW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgImxldCAiIDw8IGNvbiA8PCAiID0gKEFycmF5LnRvX2xpc3QgKEFycmF5LmluaXQgIiA8PCBzaXplIDw8ICIgKGZ1biBfIC0+ICI7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvdXQsICgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSk7CisgICAgb3V0IDw8ICIpKSkgaW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgImlwcm90I3JlYWRMaXN0RW5kOyAiIDw8IGNvbiA8PCAiKSI7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnRfZG93bigpOworICB9CisgIGluZGVudF9kb3duKCk7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQorICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBuYW1lKSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBpZiAobmFtZS5sZW5ndGgoKSA9PSAwKSB7CisgICAgbmFtZSA9IGRlY2FwaXRhbGl6ZSh0ZmllbGQtPmdldF9uYW1lKCkpOworICB9CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKKworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdCMiOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZygiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUJvb2woIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICBvdXQgPDwgIndyaXRlQnl0ZSgiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgIndyaXRlSTE2KCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUk2NCgiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgIndyaXRlRG91YmxlKCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBvY2FtbCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIHN0cmluZyBlbmFtZSA9IGNhcGl0YWxpemUodHlwZS0+Z2V0X25hbWUoKSk7CisgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgZW5hbWUgPDwgIi50b19pICIgPDwgbmFtZSA8PCAiKSI7CisgICAgfQorCisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgfQorICBvdXQgPDwgIjsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKKyAqLwordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7CisgICh2b2lkKXRzdHJ1Y3Q7CisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiI3dyaXRlKG9wcm90KSI7Cit9CisKK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7CisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qjd3JpdGVNYXBCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiLCI7CisgICAgb3V0IDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCI7CisgICAgb3V0IDw8ICJIYXNodGJsLmxlbmd0aCAiIDw8IHByZWZpeCA8PCAiKTsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90I3dyaXRlU2V0QmVnaW4oIiA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsIjsKKyAgICBvdXQgPDwgIkhhc2h0YmwubGVuZ3RoICIgPDwgcHJlZml4IDw8ICIpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90I3dyaXRlTGlzdEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkKKyAgICAgICAgICAgICAgICA8PCAiLCI7CisgICAgb3V0IDw8ICJMaXN0Lmxlbmd0aCAiIDw8IHByZWZpeCA8PCAiKTsiIDw8IGVuZGw7CisgIH0KKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgc3RyaW5nIGtpdGVyID0gdG1wKCJfa2l0ZXIiKTsKKyAgICBzdHJpbmcgdml0ZXIgPSB0bXAoIl92aXRlciIpOworICAgIGluZGVudChvdXQpIDw8ICJIYXNodGJsLml0ZXIgKGZ1biAiIDw8IGtpdGVyIDw8ICIgLT4gZnVuICIgPDwgdml0ZXIgPDwgIiAtPiAiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwga2l0ZXIsIHZpdGVyKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICIpICIgPDwgcHJlZml4IDw8ICI7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHN0cmluZyBpdGVyID0gdG1wKCJfaXRlciIpOworICAgIGluZGVudChvdXQpIDw8ICJIYXNodGJsLml0ZXIgKGZ1biAiIDw8IGl0ZXIgPDwgIiAtPiBmdW4gXyAtPiAiOworICAgIGluZGVudF91cCgpOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIpOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIikgIiA8PCBwcmVmaXggPDwgIjsiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHN0cmluZyBpdGVyID0gdG1wKCJfaXRlciIpOworICAgIGluZGVudChvdXQpIDw8ICJMaXN0Lml0ZXIgKGZ1biAiIDw8IGl0ZXIgPDwgIiAtPiAiOworICAgIGluZGVudF91cCgpOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgaXRlcik7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiKSAiIDw8IHByZWZpeCA8PCAiOyIgPDwgZW5kbDsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qjd3JpdGVNYXBFbmQiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdCN3cml0ZVNldEVuZCI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdCN3cml0ZUxpc3RFbmQiOworICB9Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KKyAqCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGtpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB2aXRlcikgeworICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2l0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkKTsKKworICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdml0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkKTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgorICovCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCk7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCisgKi8KK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgaXRlcikgeworICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCk7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAnbmFtZSBhcmdzJworICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCitzdHJpbmcgdF9vY2FtbF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpIHsKKyAgcmV0dXJuIHByZWZpeCArIGRlY2FwaXRhbGl6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgIiAiCisgICAgICAgICArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKTsKK30KKworc3RyaW5nIHRfb2NhbWxfZ2VuZXJhdG9yOjpmdW5jdGlvbl90eXBlKHRfZnVuY3Rpb24qIHRmdW5jLCBib29sIG1ldGhvZCwgYm9vbCBvcHRpb25zKSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0ZnVuYy0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHJlc3VsdCArPSByZW5kZXJfb2NhbWxfdHlwZSgoKmZfaXRlciktPmdldF90eXBlKCkpOworICAgIGlmIChvcHRpb25zKQorICAgICAgcmVzdWx0ICs9ICIgb3B0aW9uIjsKKyAgICByZXN1bHQgKz0gIiAtPiAiOworICB9CisgIGlmIChmaWVsZHMuZW1wdHkoKSAmJiAhbWV0aG9kKSB7CisgICAgcmVzdWx0ICs9ICJ1bml0IC0+ICI7CisgIH0KKyAgcmVzdWx0ICs9IHJlbmRlcl9vY2FtbF90eXBlKHRmdW5jLT5nZXRfcmV0dXJudHlwZSgpKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZmllbGQgbGlzdAorICovCitzdHJpbmcgdF9vY2FtbF9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiAiOworICAgIH0KKyAgICByZXN1bHQgKz0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0cmluZyB0X29jYW1sX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpIHsKKyAgc3RyaW5nIHByZWZpeCA9ICIiOworICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKKyAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7CisgICAgaWYgKCF0dHlwZS0+aXNfc2VydmljZSgpKSB7CisgICAgICBwcmVmaXggPSBjYXBpdGFsaXplKHByb2dyYW0tPmdldF9uYW1lKCkpICsgIl90eXBlcy4iOworICAgIH0KKyAgfQorCisgIHN0cmluZyBuYW1lID0gdHR5cGUtPmdldF9uYW1lKCk7CisgIGlmICh0dHlwZS0+aXNfc2VydmljZSgpKSB7CisgICAgbmFtZSA9IGNhcGl0YWxpemUobmFtZSk7CisgIH0gZWxzZSB7CisgICAgbmFtZSA9IGRlY2FwaXRhbGl6ZShuYW1lKTsKKyAgfQorICByZXR1cm4gcHJlZml4ICsgbmFtZTsKK30KKworLyoqCisgKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIFByb3RvY29sLnRfdHlwZSBlbnVtCisgKi8KK3N0cmluZyB0X29jYW1sX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHJldHVybiAiUHJvdG9jb2wuVF9WT0lEIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiUHJvdG9jb2wuVF9TVFJJTkciOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiUHJvdG9jb2wuVF9CT09MIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJQcm90b2NvbC5UX0JZVEUiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJQcm90b2NvbC5UX0kxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIlByb3RvY29sLlRfSTMyIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiUHJvdG9jb2wuVF9JNjQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJQcm90b2NvbC5UX0RPVUJMRSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiUHJvdG9jb2wuVF9JMzIiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIlByb3RvY29sLlRfU1RSVUNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiUHJvdG9jb2wuVF9NQVAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJQcm90b2NvbC5UX1NFVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJQcm90b2NvbC5UX0xJU1QiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGFuIG9jYW1sIHR5cGUKKyAqLworc3RyaW5nIHRfb2NhbWxfZ2VuZXJhdG9yOjpyZW5kZXJfb2NhbWxfdHlwZSh0X3R5cGUqIHR5cGUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICByZXR1cm4gInVuaXQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJzdHJpbmciOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiYm9vbCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiaW50IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiaW50IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiSW50MzIudCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIkludDY0LnQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJmbG9hdCI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiBjYXBpdGFsaXplKCgodF9lbnVtKil0eXBlKS0+Z2V0X25hbWUoKSkgKyAiLnQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gdHlwZV9uYW1lKCh0X3N0cnVjdCopdHlwZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgcmV0dXJuICIoIiArIHJlbmRlcl9vY2FtbF90eXBlKGt0eXBlKSArICIsIiArIHJlbmRlcl9vY2FtbF90eXBlKHZ0eXBlKSArICIpIEhhc2h0YmwudCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICByZXR1cm4gIigiICsgcmVuZGVyX29jYW1sX3R5cGUoZXR5cGUpICsgIixib29sKSBIYXNodGJsLnQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICByZXR1cm4gcmVuZGVyX29jYW1sX3R5cGUoZXR5cGUpICsgIiBsaXN0IjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihvY2FtbCwgIk9DYW1sIiwgIiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ZGE1NDcKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaApAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfT09QX0dFTkVSQVRPUl9ICisjZGVmaW5lIFRfT09QX0dFTkVSQVRPUl9ICisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKKyNpbmNsdWRlICJ0aHJpZnQvY29tbW9uLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKy8qKgorICogQ2xhc3Mgd2l0aCB1dGlsaXR5IG1ldGhvZHMgc2hhcmVkIGFjcm9zcyBjb21tb24gb2JqZWN0IG9yaWVudGVkIGxhbmd1YWdlcy4KKyAqIFNwZWNpZmljYWxseSwgbW9zdCBvZiB0aGlzIHN0dWZmIGlzIGZvciBDKysvSmF2YS4KKyAqCisgKi8KK2NsYXNzIHRfb29wX2dlbmVyYXRvciA6IHB1YmxpYyB0X2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfb29wX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0pIDogdF9nZW5lcmF0b3IocHJvZ3JhbSkge30KKworICAvKioKKyAgICogU2NvcGluZywgdXNpbmcgY3VybHkgYnJhY2VzIQorICAgKi8KKworICB2b2lkIHNjb3BlX3VwKHN0ZDo6b3N0cmVhbSYgb3V0KSB7CisgICAgaW5kZW50KG91dCkgPDwgInsiIDw8IHN0ZDo6ZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgfQorCisgIHZvaWQgc2NvcGVfZG93bihzdGQ6Om9zdHJlYW0mIG91dCkgeworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IHN0ZDo6ZW5kbDsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIHVwY2FzZV9zdHJpbmcoc3RkOjpzdHJpbmcgb3JpZ2luYWwpIHsKKyAgICBzdGQ6OnRyYW5zZm9ybShvcmlnaW5hbC5iZWdpbigpLCBvcmlnaW5hbC5lbmQoKSwgb3JpZ2luYWwuYmVnaW4oKSwgKGludCAoKikoaW50KSl0b3VwcGVyKTsKKyAgICByZXR1cm4gb3JpZ2luYWw7CisgIH0KKworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldF9lbnVtX2NsYXNzX25hbWUodF90eXBlKiB0eXBlKSB7CisgICAgc3RkOjpzdHJpbmcgcGFja2FnZSA9ICIiOworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR5cGUtPmdldF9wcm9ncmFtKCk7CisgICAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7CisgICAgICBwYWNrYWdlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiamF2YSIpICsgIi4iOworICAgIH0KKyAgICByZXR1cm4gcGFja2FnZSArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfamF2YV9kb2NzdHJpbmdfY29tbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgY29udGVudHMpIHsKKyAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsICIvKipcbiIsICIgKiAiLCBjb250ZW50cywgIiAqL1xuIik7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfamF2YV9kb2Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKSB7CisgICAgaWYgKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19lbnVtKCkpIHsKKyAgICAgIHN0ZDo6c3RyaW5nIGNvbWJpbmVkX21lc3NhZ2UgPSBmaWVsZC0+Z2V0X2RvYygpICsgIlxuQHNlZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBnZXRfZW51bV9jbGFzc19uYW1lKGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICAgIGdlbmVyYXRlX2phdmFfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCBjb21iaW5lZF9tZXNzYWdlKTsKKyAgICB9IGVsc2UgeworICAgICAgZ2VuZXJhdGVfamF2YV9kb2Mob3V0LCAodF9kb2MqKWZpZWxkKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogRW1pdHMgYSBKYXZhRG9jIGNvbW1lbnQgaWYgdGhlIHByb3ZpZGVkIG9iamVjdCBoYXMgYSBkb2MgaW4gVGhyaWZ0CisgICAqLworICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfamF2YV9kb2Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKSB7CisgICAgaWYgKHRkb2MtPmhhc19kb2MoKSkgeworICAgICAgZ2VuZXJhdGVfamF2YV9kb2NzdHJpbmdfY29tbWVudChvdXQsIHRkb2MtPmdldF9kb2MoKSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEVtaXRzIGEgSmF2YURvYyBjb21tZW50IGlmIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBvYmplY3QgaGFzIGEgZG9jIGluIFRocmlmdAorICAgKi8KKyAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX2phdmFfZG9jKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgICBpZiAodGZ1bmN0aW9uLT5oYXNfZG9jKCkpIHsKKyAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgICAgc3MgPDwgdGZ1bmN0aW9uLT5nZXRfZG9jKCk7CisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICAgIHN0ZDo6dmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgcF9pdGVyOworICAgICAgZm9yIChwX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgcF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytwX2l0ZXIpIHsKKyAgICAgICAgdF9maWVsZCogcCA9ICpwX2l0ZXI7CisgICAgICAgIHNzIDw8ICJcbkBwYXJhbSAiIDw8IHAtPmdldF9uYW1lKCk7CisgICAgICAgIGlmIChwLT5oYXNfZG9jKCkpIHsKKyAgICAgICAgICBzcyA8PCAiICIgPDwgcC0+Z2V0X2RvYygpOworICAgICAgICB9CisgICAgICB9CisgICAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsICIvKipcbiIsICIgKiAiLCBzcy5zdHIoKSwgIiAqL1xuIik7CisgICAgfQorICB9Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfcGVybF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3BlcmxfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MjRhNzYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3BlcmxfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsMTY4MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGxpc3Q+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L3ZlcnNpb24uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKKy8qKgorICogUEVSTCBjb2RlIGdlbmVyYXRvci4KKyAqCisgKi8KK2NsYXNzIHRfcGVybF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9wZXJsX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSksIGZfdHlwZXNfdXNlX2luY2x1ZGVzX2VtaXR0ZWRfKGZhbHNlKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgLyogbm8gb3B0aW9ucyB5ZXQgKi8KKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBwZXJsOiIgKyBpdGVyLT5maXJzdDsKKyAgICB9CisKKyAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1wZXJsIjsKKyAgICBlc2NhcGVfWyckJ10gPSAiXFwkIjsKKyAgICBlc2NhcGVfWydAJ10gPSAiXFxAIjsKKyAgfQorCisgIC8qKgorICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCisgICAqLworCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICAvKioKKyAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisKKyAgLyoqCisgICAqIFN0cnVjdHMhCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfcGVybF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9wZXJsX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX3Blcmxfc3RydWN0X3JlYWRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3Blcmxfc3RydWN0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3BlcmxfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCisgIC8qKgorICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfcmVzdCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfdXNlX2luY2x1ZGVzKHN0ZDo6b3N0cmVhbSYgb3MsIGJvb2wmIGRvbmUsIHRfdHlwZSAqdHlwZSwgYm9vbCBzZWxmaXNoKTsKKworICAvKioKKyAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbGFzcyA9IGZhbHNlKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBraXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdml0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdGQ6OnN0cmluZyBpdGVyKTsKKworICAvKioKKyAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKKyAgICovCisKKyAgc3RkOjpzdHJpbmcgcGVybF9pbmNsdWRlcygpOworICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0ID0gZmFsc2UsIGJvb2wgb2JqID0gZmFsc2UpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7CisKKyAgc3RkOjpzdHJpbmcgYXV0b2dlbl9jb21tZW50KCkgeworICAgIHJldHVybiBzdGQ6OnN0cmluZygiI1xuIikgKyAiIyBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoIiArIFRIUklGVF9WRVJTSU9OICsgIilcbiIKKyAgICAgICAgICAgKyAiI1xuIiArICIjIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkdcbiIgKyAiI1xuIjsKKyAgfQorCisgIHZvaWQgcGVybF9uYW1lc3BhY2VfZGlycyh0X3Byb2dyYW0qIHAsIHN0ZDo6bGlzdDxzdGQ6OnN0cmluZz4mIGRpcnMpIHsKKyAgICBzdGQ6OnN0cmluZyBucyA9IHAtPmdldF9uYW1lc3BhY2UoInBlcmwiKTsKKyAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGxvYzsKKworICAgIGlmIChucy5zaXplKCkgPiAwKSB7CisgICAgICB3aGlsZSAoKGxvYyA9IG5zLmZpbmQoIi4iKSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgZGlycy5wdXNoX2JhY2sobnMuc3Vic3RyKDAsIGxvYykpOworICAgICAgICBucyA9IG5zLnN1YnN0cihsb2MgKyAxKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobnMuc2l6ZSgpID4gMCkgeworICAgICAgZGlycy5wdXNoX2JhY2sobnMpOworICAgIH0KKyAgfQorCisgIHN0ZDo6c3RyaW5nIHBlcmxfbmFtZXNwYWNlKHRfcHJvZ3JhbSogcCkgeworICAgIHN0ZDo6c3RyaW5nIG5zID0gcC0+Z2V0X25hbWVzcGFjZSgicGVybCIpOworICAgIHN0ZDo6c3RyaW5nIHJlc3VsdCA9ICIiOworICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgbG9jOworCisgICAgaWYgKG5zLnNpemUoKSA+IDApIHsKKyAgICAgIHdoaWxlICgobG9jID0gbnMuZmluZCgiLiIpKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICByZXN1bHQgKz0gbnMuc3Vic3RyKDAsIGxvYyk7CisgICAgICAgIHJlc3VsdCArPSAiOjoiOworICAgICAgICBucyA9IG5zLnN1YnN0cihsb2MgKyAxKTsKKyAgICAgIH0KKworICAgICAgaWYgKG5zLnNpemUoKSA+IDApIHsKKyAgICAgICAgcmVzdWx0ICs9IG5zICsgIjo6IjsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgc3RkOjpzdHJpbmcgZ2V0X25hbWVzcGFjZV9vdXRfZGlyKCkgeworICAgIHN0ZDo6c3RyaW5nIG91dGRpciA9IGdldF9vdXRfZGlyKCk7CisgICAgc3RkOjpsaXN0PHN0ZDo6c3RyaW5nPiBkaXJzOworICAgIHBlcmxfbmFtZXNwYWNlX2RpcnMocHJvZ3JhbV8sIGRpcnMpOworICAgIHN0ZDo6bGlzdDxzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIGl0OworICAgIGZvciAoaXQgPSBkaXJzLmJlZ2luKCk7IGl0ICE9IGRpcnMuZW5kKCk7IGl0KyspIHsKKyAgICAgIG91dGRpciArPSAqaXQgKyAiLyI7CisgICAgfQorICAgIHJldHVybiBvdXRkaXI7CisgIH0KKworcHJpdmF0ZToKKyAgLyoqCisgICAqIEZpbGUgc3RyZWFtcworICAgKi8KKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3R5cGVzXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2NvbnN0c187CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9oZWxwZXJzXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2VfOworCisgIGJvb2wgZl90eXBlc191c2VfaW5jbHVkZXNfZW1pdHRlZF87Cit9OworCisvKioKKyAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0CisgKiBzdHJlYW1zLgorICoKKyAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKKyAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKKworICBzdHJpbmcgb3V0ZGlyID0gZ2V0X291dF9kaXIoKTsKKyAgc3RkOjpsaXN0PHN0ZDo6c3RyaW5nPiBkaXJzOworICBwZXJsX25hbWVzcGFjZV9kaXJzKHByb2dyYW1fLCBkaXJzKTsKKyAgc3RkOjpsaXN0PHN0ZDo6c3RyaW5nPjo6aXRlcmF0b3IgaXQ7CisgIGZvciAoaXQgPSBkaXJzLmJlZ2luKCk7IGl0ICE9IGRpcnMuZW5kKCk7IGl0KyspIHsKKyAgICBvdXRkaXIgKz0gKml0ICsgIi8iOworICAgIE1LRElSKG91dGRpci5jX3N0cigpKTsKKyAgfQorCisgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IG91dGRpciArICJUeXBlcy5wbSI7CisgIGZfdHlwZXNfLm9wZW4oZl90eXBlc19uYW1lLmNfc3RyKCkpOworICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IG91dGRpciArICJDb25zdGFudHMucG0iOworICBmX2NvbnN0c18ub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOworCisgIC8vIFByaW50IGhlYWRlcgorICBmX3R5cGVzXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBwZXJsX2luY2x1ZGVzKCk7CisKKyAgLy8gUHJpbnQgaGVhZGVyCisgIGZfY29uc3RzXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCAicGFja2FnZSAiIDw8IHBlcmxfbmFtZXNwYWNlKHByb2dyYW1fKSA8PCAiQ29uc3RhbnRzOyIgPDwgZW5kbAorICAgICAgICAgICAgPDwgcGVybF9pbmNsdWRlcygpIDw8IGVuZGw7Cit9CisKKy8qKgorICogUHJpbnRzIHN0YW5kYXJkIGphdmEgaW1wb3J0cworICovCitzdHJpbmcgdF9wZXJsX2dlbmVyYXRvcjo6cGVybF9pbmNsdWRlcygpIHsKKyAgc3RyaW5nIGluYzsKKworICBpbmMgID0gInVzZSA1LjEwLjA7XG4iOworICBpbmMgKz0gInVzZSBzdHJpY3Q7XG4iOworICBpbmMgKz0gInVzZSB3YXJuaW5ncztcbiI7CisgIGluYyArPSAidXNlIFRocmlmdDo6RXhjZXB0aW9uO1xuIjsKKyAgaW5jICs9ICJ1c2UgVGhyaWZ0OjpNZXNzYWdlVHlwZTtcbiI7CisgIGluYyArPSAidXNlIFRocmlmdDo6VHlwZTtcblxuIjsKKworICByZXR1cm4gaW5jOworfQorCisvKioKKyAqIENsb3NlIHVwIChvciBkb3duKSBzb21lIGZpbGV6LgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKKyAgLy8gQ2xvc2UgdHlwZXMgZmlsZQorICBmX3R5cGVzXyA8PCAiMTsiIDw8IGVuZGw7CisgIGZfdHlwZXNfLmNsb3NlKCk7CisKKyAgZl9jb25zdHNfIDw8ICIxOyIgPDwgZW5kbDsKKyAgZl9jb25zdHNfLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBub3QgZG9uZSBpbiBQRVJMLCB0eXBlcyBhcmUgYWxsIGltcGxpY2l0LgorICoKKyAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgICh2b2lkKXR0eXBlZGVmOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuIFNpbmNlIGRlZmluZSBpcyBleHBlbnNpdmUgdG8gbG9va3VwCisgKiBpbiBQRVJMLCB3ZSB1c2UgYSBnbG9iYWwgYXJyYXkgZm9yIHRoaXMuCisgKgorICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICBmX3R5cGVzXyA8PCAicGFja2FnZSAiIDw8IHBlcmxfbmFtZXNwYWNlKHByb2dyYW1fKSA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICBmX3R5cGVzXyA8PCAidXNlIGNvbnN0YW50ICIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPT4gIiA8PCB2YWx1ZSA8PCAiOyIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlIGEgY29uc3RhbnQgdmFsdWUKKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKKyAgdF90eXBlKiB0eXBlID0gdGNvbnN0LT5nZXRfdHlwZSgpOworICBzdHJpbmcgbmFtZSA9IHRjb25zdC0+Z2V0X25hbWUoKTsKKyAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSB0Y29uc3QtPmdldF92YWx1ZSgpOworCisgIGZfY29uc3RzXyA8PCAidXNlIGNvbnN0YW50ICIgPDwgbmFtZSA8PCAiID0+ICI7CisgIGZfY29uc3RzXyA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpOworICBmX2NvbnN0c18gPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKKyAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCisgKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYworICovCitzdHJpbmcgdF9wZXJsX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgb3V0IDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIG91dCA8PCAodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwID8gIjEiIDogIjAiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIG91dCA8PCBwZXJsX25hbWVzcGFjZSh0eXBlLT5nZXRfcHJvZ3JhbSgpKSA8PCB0eXBlLT5nZXRfbmFtZSgpIDw8ICItPm5ldyh7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8IHJlbmRlcl9jb25zdF92YWx1ZShnX3R5cGVfc3RyaW5nLCB2X2l0ZXItPmZpcnN0KTsKKyAgICAgIG91dCA8PCAiID0+ICI7CisgICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgIG91dCA8PCAiLCI7CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSkiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworICAgIG91dCA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgdl9pdGVyLT5maXJzdCk7CisgICAgICBvdXQgPDwgIiA9PiAiOworICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlOworICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9CisgICAgb3V0IDw8ICJbIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisKKyAgICAgIGluZGVudChvdXQpIDw8IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlcik7CisgICAgICBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgICAgb3V0IDw8ICIgPT4gMSI7CisgICAgICB9CisgICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIl0iOworICB9CisgIHJldHVybiBvdXQuc3RyKCk7Cit9CisKKy8qKgorICogTWFrZSBhIHN0cnVjdAorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9wZXJsX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGV4Y2VwdGlvbi4gQmFzaWNhbGx5IHRoZSBzYW1lCisgKiBhcyBhIHN0cnVjdCBidXQgZXh0ZW5kcyB0aGUgRXhjZXB0aW9uIGNsYXNzLgorICoKKyAqIEBwYXJhbSB0eGNlcHRpb24gVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9wZXJsX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOworfQorCisvKioKKyAqIFN0cnVjdHMgY2FuIGJlIG5vcm1hbCBvciBleGNlcHRpb25zLgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Blcmxfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgeworICBnZW5lcmF0ZV91c2VfaW5jbHVkZXMoZl90eXBlc18sIGZfdHlwZXNfdXNlX2luY2x1ZGVzX2VtaXR0ZWRfLCB0c3RydWN0LCBmYWxzZSk7CisgIGdlbmVyYXRlX3Blcmxfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4gVGhpcyBpcyBub3RoaW5nIGluIFBFUkwKKyAqIHdoZXJlIHRoZSBvYmplY3RzIGFyZSBhbGwganVzdCBhc3NvY2lhdGl2ZSBhcnJheXMgKHVubGVzcyBvZiBjb3Vyc2Ugd2UKKyAqIGRlY2lkZSB0byBzdGFydCB1c2luZyBvYmplY3RzIGZvciB0aGVtLi4uKQorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Blcmxfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgb3V0IDw8ICJwYWNrYWdlICIgPDwgcGVybF9uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiO1xuIjsKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIG91dCA8PCAidXNlIGJhc2UgcXcoVGhyaWZ0OjpURXhjZXB0aW9uKTtcbiI7CisgIH0KKworICAvLyBDcmVhdGUgc2ltcGxlIGFjZXNzb3IgbWV0aG9kcworICBvdXQgPDwgInVzZSBiYXNlIHF3KENsYXNzOjpBY2Nlc3Nvcik7XG4iOworCisgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKKyAgICBvdXQgPDwgcGVybF9uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiLT5ta19hY2Nlc3NvcnMoIHF3KCAiOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgIGlmICghdC0+aXNfeGNlcHRpb24oKSkgeworICAgICAgICBvdXQgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBvdXQgPDwgIikgKTtcbiI7CisgIH0KKworICBvdXQgPDwgZW5kbDsKKworICAvLyBuZXcoKQorICBpbmRlbnRfdXAoKTsKKyAgb3V0IDw8ICJzdWIgbmV3IHsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm15ICRjbGFzc25hbWUgPSBzaGlmdDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJteSAkc2VsZiAgICAgID0ge307IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJteSAkdmFscyAgICAgID0gc2hpZnQgfHwge307IiA8PCBlbmRsOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBzdHJpbmcgZHZhbCA9ICJ1bmRlZiI7CisgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwgJiYgISh0LT5pc19zdHJ1Y3QoKSB8fCB0LT5pc194Y2VwdGlvbigpKSkgeworICAgICAgZHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZSgoKm1faXRlciktPmdldF90eXBlKCksICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkpOworICAgIH0KKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiRzZWxmLT57IiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIn0gPSAiIDw8IGR2YWwgPDwgIjsiIDw8IGVuZGw7CisgIH0KKworICAvLyBHZW5lcmF0ZSBjb25zdHJ1Y3RvciBmcm9tIGFycmF5CisgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKKworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwgJiYgKHQtPmlzX3N0cnVjdCgpIHx8IHQtPmlzX3hjZXB0aW9uKCkpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICIkc2VsZi0+eyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgIDw8ICJ9ID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodCwgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoVU5JVkVSU0FMOjppc2EoJHZhbHMsJ0hBU0gnKSkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChkZWZpbmVkICR2YWxzLT57IiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIn0pIHsiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAkc2VsZi0+eyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJ9ID0gJHZhbHMtPnsiCisgICAgICAgICAgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJ9OyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBibGVzcyAoJHNlbGYsICRjbGFzc25hbWUpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8ICJ9XG5cbiI7CisKKyAgb3V0IDw8ICJzdWIgZ2V0TmFtZSB7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAnIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICInOyIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9wZXJsX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfcGVybF9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSByZWFkKCkgbWV0aG9kIGZvciBhIHN0cnVjdAorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Blcmxfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBvdXQgPDwgInN1YiByZWFkIHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJteSAoJHNlbGYsICRpbnB1dCkgPSBAXzsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm15ICR4ZmVyICA9IDA7IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAibXkgJGZuYW1lOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAibXkgJGZ0eXBlID0gMDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJteSAkZmlkICAgPSAwOyIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RydWN0QmVnaW4oXFwkZm5hbWUpOyIgPDwgZW5kbDsKKworICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKKyAgaW5kZW50KG91dCkgPDwgIndoaWxlICgxKSIgPDwgZW5kbDsKKworICBzY29wZV91cChvdXQpOworCisgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRGaWVsZEJlZ2luKFxcJGZuYW1lLCBcXCRmdHlwZSwgXFwkZmlkKTsiIDw8IGVuZGw7CisKKyAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyIGFuZCBicmVhaworICBpbmRlbnQob3V0KSA8PCAiaWYgKCRmdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpTVE9QKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaW5kZW50KG91dCkgPDwgImxhc3Q7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKworICAvLyBTd2l0Y2ggc3RhdGVtZW50IG9uIHRoZSBmaWVsZCB3ZSBhcmUgcmVhZGluZworICBpbmRlbnQob3V0KSA8PCAiU1dJVENIOiBmb3IoJGZpZCkiIDw8IGVuZGw7CisKKyAgc2NvcGVfdXAob3V0KTsKKworICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKworICAgIGluZGVudChvdXQpIDw8ICIvXiIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiQvICYmIGRveyI7CisgICAgaW5kZW50KG91dCkgPDwgImlmICgkZnR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSB7IiA8PCBlbmRsOworCisgICAgaW5kZW50X3VwKCk7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAic2VsZi0+Iik7CisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8ICIgICR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOyIgPDwgZW5kbDsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAibGFzdDsgfTsiIDw8IGVuZGw7CisgIH0KKyAgLy8gSW4gdGhlIGRlZmF1bHQgY2FzZSB3ZSBza2lwIHRoZSBmaWVsZAorCisgIGluZGVudChvdXQpIDw8ICIgICR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOyIgPDwgZW5kbDsKKworICBzY29wZV9kb3duKG91dCk7CisKKyAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZEZpZWxkRW5kKCk7IiA8PCBlbmRsOworCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RydWN0RW5kKCk7IiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gJHhmZXI7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgd3JpdGUoKSBtZXRob2QgZm9yIGEgc3RydWN0CisgKi8KK3ZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGVybF9zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIG91dCA8PCAic3ViIHdyaXRlIHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJteSAoJHNlbGYsICRvdXRwdXQpID0gQF87IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAibXkgJHhmZXIgICA9IDA7IiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEJlZ2luKCciIDw8IG5hbWUgPDwgIicpOyIgPDwgZW5kbDsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKGRlZmluZWQgJHNlbGYtPnsiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAifSkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkQmVnaW4oIgorICAgICAgICAgICAgICAgIDw8ICInIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicsICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkKKyAgICAgICAgICAgICAgICA8PCAiLCAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpOyIgPDwgZW5kbDsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInNlbGYtPiIpOworCisgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICR4ZmVyOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdXNlIGNsYXVzZXMgZm9yIGluY2x1ZGVkIGVudGl0aWVzCisgKgorICogQHBhcmFtICBvcyAgICAgICBUaGUgb3V0cHV0IHN0cmVhbQorICogQHBhcmFtICBkb25lICAgICBBIGZsYWcgcmVmZXJlbmNlIHRvIGRlYm91bmNlIHRoZSBhY3Rpb24KKyAqIEBwYXJhbSAgdHlwZSAgICAgVGhlIHR5cGUgYmVpbmcgcHJvY2Vzc2VkCisgKiBAcGFyYW0gIHNlbGZpc2ggIEZsYWcgdG8gaW5kaWNhdGUgaWYgdGhlIGN1cnJlbnQgbmFtZXNwYWNlIHR5cGVzIHNob3VsZCBiZSAidXNlImQgYXMgd2VsbC4KKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91c2VfaW5jbHVkZXMoc3RkOjpvc3RyZWFtJiBvcywgYm9vbCYgZG9uZSwgdF90eXBlICp0eXBlLCBib29sIHNlbGZpc2gpIHsKKyAgdF9wcm9ncmFtICpjdXJyZW50ID0gdHlwZS0+Z2V0X3Byb2dyYW0oKTsKKyAgaWYgKGN1cnJlbnQgJiYgIWRvbmUpIHsKKyAgICBzdGQ6OnZlY3Rvcjx0X3Byb2dyYW0qPiYgY3VyckluYyA9IGN1cnJlbnQtPmdldF9pbmNsdWRlcygpOworICAgIHN0ZDo6dmVjdG9yPHRfcHJvZ3JhbSo+OjpzaXplX3R5cGUgbnVtSW5jID0gY3VyckluYy5zaXplKCk7CisgICAgaWYgKHNlbGZpc2gpIHsKKyAgICAgIG9zIDw8ICJ1c2UgIiA8PCBwZXJsX25hbWVzcGFjZShjdXJyZW50KSA8PCAiVHlwZXM7IiA8PCBlbmRsOworICAgIH0KKyAgICBmb3IgKHN0ZDo6dmVjdG9yPHRfcHJvZ3JhbSo+OjpzaXplX3R5cGUgaSA9IDA7IGkgPCBudW1JbmM7ICsraSkgeworICAgICAgdF9wcm9ncmFtKiBpbmNQcm9ncmFtID0gY3VyckluYy5hdChpKTsKKyAgICAgIG9zIDw8ICJ1c2UgIiA8PCBwZXJsX25hbWVzcGFjZShpbmNQcm9ncmFtKSA8PCAiVHlwZXM7IiA8PCBlbmRsOworICAgIH0KKyAgICBvcyA8PCBlbmRsOworICAgIGRvbmUgPSB0cnVlOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gZ2V0X25hbWVzcGFjZV9vdXRfZGlyKCkgKyBzZXJ2aWNlX25hbWVfICsgIi5wbSI7CisgIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKKworICBmX3NlcnZpY2VfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IHBlcmxfaW5jbHVkZXMoKTsKKworICBib29sIGRvbmUgPSBmYWxzZTsKKyAgZ2VuZXJhdGVfdXNlX2luY2x1ZGVzKGZfc2VydmljZV8sIGRvbmUsIHRzZXJ2aWNlLCB0cnVlKTsKKworICB0X3NlcnZpY2UqIGV4dGVuZHNfcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICBpZiAoZXh0ZW5kc19zICE9IE5VTEwpIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJ1c2UgIiA8PCBwZXJsX25hbWVzcGFjZShleHRlbmRzX3MtPmdldF9wcm9ncmFtKCkpIDw8IGV4dGVuZHNfcy0+Z2V0X25hbWUoKSA8PCAiOyIKKyAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHRocmVlIG1haW4gcGFydHMgb2YgdGhlIHNlcnZpY2UgKHdlbGwsIHR3byBmb3Igbm93IGluIFBFUkwpCisgIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9yZXN0KHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0c2VydmljZSk7CisKKyAgLy8gQ2xvc2Ugc2VydmljZSBmaWxlCisgIGZfc2VydmljZV8gPDwgIjE7IiA8PCBlbmRsOworICBmX3NlcnZpY2VfLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfcHJvY2Vzc29yID0gIiI7CisgIHRfc2VydmljZSogZXh0ZW5kc19zID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgIGlmIChleHRlbmRzX3MgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSBwZXJsX25hbWVzcGFjZShleHRlbmRzX3MtPmdldF9wcm9ncmFtKCkpICsgZXh0ZW5kc19zLT5nZXRfbmFtZSgpOworICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gInVzZSBiYXNlIHF3KCIgKyBleHRlbmRzICsgIlByb2Nlc3Nvcik7IjsKKyAgfQorCisgIGluZGVudF91cCgpOworCisgIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgorICBmX3NlcnZpY2VfIDw8ICJwYWNrYWdlICIgPDwgcGVybF9uYW1lc3BhY2UocHJvZ3JhbV8pIDw8IHNlcnZpY2VfbmFtZV8gPDwgIlByb2Nlc3NvcjsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBlbmRsIDw8ICJ1c2Ugc3RyaWN0OyIgPDwgZW5kbCA8PCBleHRlbmRzX3Byb2Nlc3NvciA8PCBlbmRsIDw8IGVuZGw7CisKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV8gPDwgInN1YiBuZXcgeyIgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibXkgKCRjbGFzc25hbWUsICRoYW5kbGVyKSA9IEBfOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIm15ICRzZWxmICAgICAgPSB7fTsiIDw8IGVuZGw7CisKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkc2VsZi0+e2hhbmRsZXJ9ID0gJGhhbmRsZXI7IiA8PCBlbmRsOworCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGJsZXNzICgkc2VsZiwgJGNsYXNzbmFtZSk7IiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIGZfc2VydmljZV8gPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBzZXJ2ZXIgaW1wbGVtZW50YXRpb24KKyAgZl9zZXJ2aWNlXyA8PCAic3ViIHByb2Nlc3MgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibXkgKCRzZWxmLCAkaW5wdXQsICRvdXRwdXQpID0gQF87IiA8PCBlbmRsOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm15ICRyc2VxaWQgPSAwOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAibXkgJGZuYW1lICA9IHVuZGVmOyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJteSAkbXR5cGUgID0gMDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkaW5wdXQtPnJlYWRNZXNzYWdlQmVnaW4oXFwkZm5hbWUsIFxcJG10eXBlLCBcXCRyc2VxaWQpOyIgPDwgZW5kbDsKKworICAvLyBIT1Q6IGNoZWNrIGZvciBtZXRob2QgaW1wbGVtZW50YXRpb24KKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibXkgJG1ldGhvZG5hbWUgPSAncHJvY2Vzc18nLiRmbmFtZTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiaWYgKCEkc2VsZi0+Y2FuKCRtZXRob2RuYW1lKSkgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJGlucHV0LT5za2lwKFRocmlmdDo6VFR5cGU6OlNUUlVDVCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIiRpbnB1dC0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAibXkgJHggPSBUaHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbi0+bmV3KCdGdW5jdGlvbiAnLiRmbmFtZS4nIG5vdCBpbXBsZW1lbnRlZC4nLCAiCisgICAgICAgICAgICAgICAgIlRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpVTktOT1dOX01FVEhPRCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIiRvdXRwdXQtPndyaXRlTWVzc2FnZUJlZ2luKCRmbmFtZSwgVGhyaWZ0OjpUTWVzc2FnZVR5cGU6OkVYQ0VQVElPTiwgJHJzZXFpZCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiR4LT53cml0ZSgkb3V0cHV0KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICA8PCAiJG91dHB1dC0+d3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIiRvdXRwdXQtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIiRzZWxmLT4kbWV0aG9kbmFtZSgkcnNlcWlkLCAkaW5wdXQsICRvdXRwdXQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIDE7IgorICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBwcm9jZXNzIGZ1bmN0aW9uIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgYSBkaXNwYXRjaGVyIGZvcgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIC8vIE9wZW4gZnVuY3Rpb24KKyAgZl9zZXJ2aWNlXyA8PCAic3ViIHByb2Nlc3NfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIiB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm15ICgkc2VsZiwgJHNlcWlkLCAkaW5wdXQsICRvdXRwdXQpID0gQF87IiA8PCBlbmRsOworCisgIHN0cmluZyBhcmdzbmFtZSA9IHBlcmxfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIKKyAgICAgICAgICAgICAgICAgICAgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiOworICBzdHJpbmcgcmVzdWx0bmFtZSA9IHBlcmxfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIKKyAgICAgICAgICAgICAgICAgICAgICArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJteSAkYXJncyA9ICIgPDwgYXJnc25hbWUgPDwgIi0+bmV3KCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIiRhcmdzLT5yZWFkKCRpbnB1dCk7IiA8PCBlbmRsOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiRpbnB1dC0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKworICAvLyBEZWNsYXJlIHJlc3VsdCBmb3Igbm9uIG9uZXdheSBmdW5jdGlvbgorICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJteSAkcmVzdWx0ID0gIiA8PCByZXN1bHRuYW1lIDw8ICItPm5ldygpOyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKKyAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZXZhbCB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKKyAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8ICIkcmVzdWx0LT57c3VjY2Vzc30gPSAiOworICB9CisgIGZfc2VydmljZV8gPDwgIiRzZWxmLT57aGFuZGxlcn0tPiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgIiRhcmdzLT4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgfQorICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKKworICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgeGNlcHRpb25zLnNpemUoKSA+IDApIHsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9OyBpZiggVU5JVkVSU0FMOjppc2EoJEAsJyIKKyAgICAgICAgICAgICAgICAgPDwgcGVybF9uYW1lc3BhY2UoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfcHJvZ3JhbSgpKQorICAgICAgICAgICAgICAgICA8PCAoKnhfaXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCkgPDwgIicpICl7ICIgPDwgZW5kbDsKKworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkcmVzdWx0LT57IiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIn0gPSAkQDsiIDw8IGVuZGw7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkQCA9IHVuZGVmOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsOworCisgICAgLy8gY2F0Y2gtYWxsIGZvciB1bmV4cGVjdGVkIGV4Y2VwdGlvbnMgKFRIUklGVC0zMTkxKQorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmICgkQCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkQCA9fiBzL15cXHMrfFxccyskLy9nOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm15ICRlcnIgPSBUaHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbi0+bmV3KFwiVW5leHBlY3RlZCBFeGNlcHRpb246IFwiIC4gJEAsIFRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpJTlRFUk5BTF9FUlJPUik7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dC0+d3JpdGVNZXNzYWdlQmVnaW4oJyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICInLCBUaHJpZnQ6OlRNZXNzYWdlVHlwZTo6RVhDRVBUSU9OLCAkc2VxaWQpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRlcnItPndyaXRlKCRvdXRwdXQpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQtPndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRAID0gdW5kZWY7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICAvLyBTaG9ydGN1dCBvdXQgaGVyZSBmb3Igb25ld2F5IGZ1bmN0aW9ucworICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIFNlcmlhbGl6ZSB0aGUgcmVwbHkKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dC0+d3JpdGVNZXNzYWdlQmVnaW4oJyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICInLCBUaHJpZnQ6OlRNZXNzYWdlVHlwZTo6UkVQTFksICRzZXFpZCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRyZXN1bHQtPndyaXRlKCRvdXRwdXQpOyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkb3V0cHV0LT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsOworCisgIC8vIENsb3NlIGZ1bmN0aW9uCisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgYSBzZXJ2aWNlLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIGZfc2VydmljZV8gPDwgIiMgSEVMUEVSIEZVTkNUSU9OUyBBTkQgU1RSVUNUVVJFUyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIHN0cmluZyBuYW1lID0gdHMtPmdldF9uYW1lKCk7CisgICAgdHMtPnNldF9uYW1lKHNlcnZpY2VfbmFtZV8gKyAiXyIgKyBuYW1lKTsKKyAgICBnZW5lcmF0ZV9wZXJsX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sIHRzLCBmYWxzZSk7CisgICAgZ2VuZXJhdGVfcGVybF9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOworICAgIHRzLT5zZXRfbmFtZShuYW1lKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BlcmxfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCBzZXJ2aWNlX25hbWVfICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKKyAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOworICB9CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKKyAgfQorCisgIGdlbmVyYXRlX3Blcmxfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kc19pZiA9ICIiOworICB0X3NlcnZpY2UqIGV4dGVuZHNfcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICBpZiAoZXh0ZW5kc19zICE9IE5VTEwpIHsKKyAgICBleHRlbmRzX2lmID0gInVzZSBiYXNlIHF3KCIgKyBwZXJsX25hbWVzcGFjZShleHRlbmRzX3MtPmdldF9wcm9ncmFtKCkpICsgZXh0ZW5kc19zLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICsgIklmKTsiOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCAicGFja2FnZSAiIDw8IHBlcmxfbmFtZXNwYWNlKHByb2dyYW1fKSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZjsiIDw8IGVuZGwgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICJ1c2Ugc3RyaWN0OyIgPDwgZW5kbCA8PCBleHRlbmRzX2lmIDw8IGVuZGwgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAic3ViICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGwgPDwgIiAgZGllICdpbXBsZW1lbnQgaW50ZXJmYWNlJztcbn0iCisgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBSRVNUIGludGVyZmFjZQorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfcmVzdCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX2lmID0gIiI7CisgIHRfc2VydmljZSogZXh0ZW5kc19zID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgIGlmIChleHRlbmRzX3MgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSBleHRlbmRzX3MtPmdldF9uYW1lKCk7CisgICAgZXh0ZW5kc19pZiA9ICJ1c2UgYmFzZSBxdygiICsgcGVybF9uYW1lc3BhY2UoZXh0ZW5kc19zLT5nZXRfcHJvZ3JhbSgpKSArIGV4dGVuZHNfcy0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICArICJSZXN0KTsiOworICB9CisgIGZfc2VydmljZV8gPDwgInBhY2thZ2UgIiA8PCBwZXJsX25hbWVzcGFjZShwcm9ncmFtXykgPDwgc2VydmljZV9uYW1lXyA8PCAiUmVzdDsiIDw8IGVuZGwgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICJ1c2Ugc3RyaWN0OyIgPDwgZW5kbCA8PCBleHRlbmRzX2lmIDw8IGVuZGwgPDwgZW5kbDsKKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAic3ViIG5ldyB7IiA8PCBlbmRsOworCisgICAgaW5kZW50X3VwKCk7CisKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJteSAoJGNsYXNzbmFtZSwgJGltcGwpID0gQF87IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAibXkgJHNlbGYgICAgID17IGltcGwgPT4gJGltcGwgfTsiIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgInJldHVybiBibGVzcygkc2VsZiwkY2xhc3NuYW1lKTsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgZl9zZXJ2aWNlXyA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAic3ViICIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJ7IiA8PCBlbmRsOworCisgICAgaW5kZW50X3VwKCk7CisKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJteSAoJHNlbGYsICRyZXF1ZXN0KSA9IEBfOyIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgYXJncyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBhX2l0ZXI7CisgICAgZm9yIChhX2l0ZXIgPSBhcmdzLmJlZ2luKCk7IGFfaXRlciAhPSBhcmdzLmVuZCgpOyArK2FfaXRlcikgeworICAgICAgdF90eXBlKiBhdHlwZSA9IGdldF90cnVlX3R5cGUoKCphX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgIHN0cmluZyByZXEgPSAiJHJlcXVlc3QtPnsnIiArICgqYV9pdGVyKS0+Z2V0X25hbWUoKSArICInfSI7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJteSAkIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICgiIDw8IHJlcSA8PCAiKSA/ICIgPDwgcmVxCisgICAgICAgICAgICAgICAgIDw8ICIgOiB1bmRlZjsiIDw8IGVuZGw7CisgICAgICBpZiAoYXR5cGUtPmlzX3N0cmluZygpICYmICgodF9iYXNlX3R5cGUqKWF0eXBlKS0+aXNfc3RyaW5nX2xpc3QoKSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJteSBAIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHNwbGl0KC8sLywgJCIKKyAgICAgICAgICAgICAgICAgICA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIik7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkIgorICAgICAgICAgICAgICAgICAgIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gXFxAIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICRzZWxmLT57aW1wbH0tPiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIgorICAgICAgICAgICAgICAgPDwgYXJndW1lbnRfbGlzdCgoKmZfaXRlciktPmdldF9hcmdsaXN0KCkpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7CisgIHRfc2VydmljZSogZXh0ZW5kc19zID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgIGlmIChleHRlbmRzX3MgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSBwZXJsX25hbWVzcGFjZShleHRlbmRzX3MtPmdldF9wcm9ncmFtKCkpICsgZXh0ZW5kc19zLT5nZXRfbmFtZSgpOworICAgIGV4dGVuZHNfY2xpZW50ID0gInVzZSBiYXNlIHF3KCIgKyBleHRlbmRzICsgIkNsaWVudCk7IjsKKyAgfQorCisgIGZfc2VydmljZV8gPDwgInBhY2thZ2UgIiA8PCBwZXJsX25hbWVzcGFjZShwcm9ncmFtXykgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50OyIgPDwgZW5kbCA8PCBlbmRsCisgICAgICAgICAgICAgPDwgZXh0ZW5kc19jbGllbnQgPDwgZW5kbCA8PCAidXNlIGJhc2UgcXcoIiA8PCBwZXJsX25hbWVzcGFjZShwcm9ncmFtXykKKyAgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZik7IiA8PCBlbmRsOworCisgIC8vIENvbnN0cnVjdG9yIGZ1bmN0aW9uCisgIGZfc2VydmljZV8gPDwgInN1YiBuZXcgeyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJteSAoJGNsYXNzbmFtZSwgJGlucHV0LCAkb3V0cHV0KSA9IEBfOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICJteSAkc2VsZiAgICAgID0ge307IiA8PCBlbmRsOworCisgIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJHNlbGYgPSAkY2xhc3NuYW1lLT5TVVBFUjo6bmV3KCRpbnB1dCwgJG91dHB1dCk7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiRzZWxmLT57aW5wdXR9ICA9ICRpbnB1dDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICIkc2VsZi0+e291dHB1dH0gPSBkZWZpbmVkICRvdXRwdXQgPyAkb3V0cHV0IDogJGlucHV0OyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIiRzZWxmLT57c2VxaWR9ICA9IDA7IiA8PCBlbmRsOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGJsZXNzKCRzZWxmLCRjbGFzc25hbWUpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworCisgIGZfc2VydmljZV8gPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgIGZfc2VydmljZV8gPDwgInN1YiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOworCisgICAgaW5kZW50X3VwKCk7CisKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgaW5kZW50KCkgPDwgIiRzZWxmLT5zZW5kXyIgPDwgZnVubmFtZSA8PCAiKCI7CisKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8ICIkIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgInJldHVybiAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCAiJHNlbGYtPnJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIGZfc2VydmljZV8gPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGZfc2VydmljZV8gPDwgInN1YiBzZW5kXyIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIHN0ZDo6c3RyaW5nIGFyZ3NuYW1lID0gcGVybF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpICsgc2VydmljZV9uYW1lXyArICJfIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiOworCisgICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0IGhlYWRlcgorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiRzZWxmLT57b3V0cHV0fS0+d3JpdGVNZXNzYWdlQmVnaW4oJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICA8PCAiJywgIiA8PCAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJUaHJpZnQ6OlRNZXNzYWdlVHlwZTo6T05FV0FZIiA6ICJUaHJpZnQ6OlRNZXNzYWdlVHlwZTo6Q0FMTCIpCisgICAgICAgICAgICAgICA8PCAiLCAkc2VsZi0+e3NlcWlkfSk7IiA8PCBlbmRsOworCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibXkgJGFyZ3MgPSAiIDw8IGFyZ3NuYW1lIDw8ICItPm5ldygpOyIgPDwgZW5kbDsKKworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkYXJncy0+eyIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIn0gPSAkIgorICAgICAgICAgICAgICAgICA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBXcml0ZSB0byB0aGUgc3RyZWFtCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJGFyZ3MtPndyaXRlKCRzZWxmLT57b3V0cHV0fSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAiJHNlbGYtPntvdXRwdXR9LT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICIkc2VsZi0+e291dHB1dH0tPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisKKyAgICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsOworCisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBzdGQ6OnN0cmluZyByZXN1bHRuYW1lID0gcGVybF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpICsgc2VydmljZV9uYW1lXyArICJfIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOworICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKKworICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vYXJncyk7CisgICAgICAvLyBPcGVuIGZ1bmN0aW9uCisgICAgICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwgInN1YiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbikgPDwgZW5kbDsKKworICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm15ICRyc2VxaWQgPSAwOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAibXkgJGZuYW1lOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAibXkgJG10eXBlID0gMDsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJHNlbGYtPntpbnB1dH0tPnJlYWRNZXNzYWdlQmVnaW4oXFwkZm5hbWUsIFxcJG10eXBlLCBcXCRyc2VxaWQpOyIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgKCRtdHlwZSA9PSBUaHJpZnQ6OlRNZXNzYWdlVHlwZTo6RVhDRVBUSU9OKSB7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIG15ICR4ID0gVGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb24tPm5ldygpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiICAkeC0+cmVhZCgkc2VsZi0+e2lucHV0fSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICIgICRzZWxmLT57aW5wdXR9LT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBkaWUgJHg7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJteSAkcmVzdWx0ID0gIiA8PCByZXN1bHRuYW1lIDw8ICItPm5ldygpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiJHJlc3VsdC0+cmVhZCgkc2VsZi0+e2lucHV0fSk7IiA8PCBlbmRsOworCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkc2VsZi0+e2lucHV0fS0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKGRlZmluZWQgJHJlc3VsdC0+e3N1Y2Nlc3N9ICkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgIDw8ICIgIHJldHVybiAkcmVzdWx0LT57c3VjY2Vzc307IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAoZGVmaW5lZCAkcmVzdWx0LT57IiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIn0pIHsiCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBkaWUgJHJlc3VsdC0+eyIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJ9OyIKKyAgICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KKyAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkaWUgXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIjsiCisgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2xhc3MpIHsKKyAgKHZvaWQpaW5jbGFzczsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworCisgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgfQorCisgIHN0cmluZyBuYW1lID0gdGZpZWxkLT5nZXRfbmFtZSgpOworCisgIC8vIEhhY2sgZm9yIHdoZW4gcHJlZml4IGlzIGRlZmluZWQgKGFsd2F5cyBhIGhhc2ggcmVmKQorICBpZiAoIXByZWZpeC5lbXB0eSgpKSB7CisgICAgbmFtZSA9IHByZWZpeCArICJ7IiArIHRmaWVsZC0+Z2V0X25hbWUoKSArICJ9IjsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkaW5wdXQtPiI7CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBvdXQgPDwgInJlYWRTdHJpbmcoXFwkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgInJlYWRCb29sKFxcJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIG91dCA8PCAicmVhZEJ5dGUoXFwkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIG91dCA8PCAicmVhZEkxNihcXCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJyZWFkSTMyKFxcJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICBvdXQgPDwgInJlYWRJNjQoXFwkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIG91dCA8PCAicmVhZERvdWJsZShcXCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFBFUkwgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgInJlYWRJMzIoXFwkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworCisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICB0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGFuIHVuc2VyaWFsaXplciBmb3IgYSB2YXJpYWJsZS4gVGhpcyBtYWtlcyB0d28ga2V5IGFzc3VtcHRpb25zLAorICogZmlyc3QgdGhhdCB0aGVyZSBpcyBhIGNvbnN0IGNoYXIqIHZhcmlhYmxlIG5hbWVkIGRhdGEgdGhhdCBwb2ludHMgdG8gdGhlCisgKiBidWZmZXIgZm9yIGRlc2VyaWFsaXphdGlvbiwgYW5kIHRoYXQgdGhlcmUgaXMgYSB2YXJpYWJsZSBwcm90b2NvbCB3aGljaAorICogaXMgYSByZWZlcmVuY2UgdG8gYSBUUHJvdG9jb2wgc2VyaWFsaXphdGlvbiBvYmplY3QuCisgKi8KK3ZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICBvdXQgPDwgaW5kZW50KCkgPDwgIiQiIDw8IHByZWZpeCA8PCAiID0gIiA8PCBwZXJsX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKQorICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiLT5uZXcoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiR4ZmVyICs9ICQiIDw8IHByZWZpeAorICAgICAgPDwgIi0+cmVhZCgkaW5wdXQpOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgc3RyaW5nIHNpemUgPSB0bXAoIl9zaXplIik7CisgIHN0cmluZyBrdHlwZSA9IHRtcCgiX2t0eXBlIik7CisgIHN0cmluZyB2dHlwZSA9IHRtcCgiX3Z0eXBlIik7CisgIHN0cmluZyBldHlwZSA9IHRtcCgiX2V0eXBlIik7CisKKyAgdF9maWVsZCBmc2l6ZShnX3R5cGVfaTMyLCBzaXplKTsKKyAgdF9maWVsZCBma3R5cGUoZ190eXBlX2k4LCBrdHlwZSk7CisgIHRfZmllbGQgZnZ0eXBlKGdfdHlwZV9pOCwgdnR5cGUpOworICB0X2ZpZWxkIGZldHlwZShnX3R5cGVfaTgsIGV0eXBlKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgIm15ICQiIDw8IHNpemUgPDwgIiA9IDA7IiA8PCBlbmRsOworCisgIC8vIERlY2xhcmUgdmFyaWFibGVzLCByZWFkIGhlYWRlcgorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkIiA8PCBwcmVmaXggPDwgIiA9IHt9OyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAibXkgJCIgPDwga3R5cGUgPDwgIiA9IDA7IgorICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJteSAkIiA8PCB2dHlwZSA8PCAiID0gMDsiIDw8IGVuZGw7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZE1hcEJlZ2luKCIKKyAgICAgICAgPDwgIlxcJCIgPDwga3R5cGUgPDwgIiwgXFwkIiA8PCB2dHlwZSA8PCAiLCBcXCQiIDw8IHNpemUgPDwgIik7IiA8PCBlbmRsOworCisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiQiIDw8IHByZWZpeCA8PCAiID0ge307IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJteSAkIiA8PCBldHlwZSA8PCAiID0gMDsiCisgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZFNldEJlZ2luKCIKKyAgICAgICAgPDwgIlxcJCIgPDwgZXR5cGUgPDwgIiwgXFwkIiA8PCBzaXplIDw8ICIpOyIgPDwgZW5kbDsKKworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgcHJlZml4IDw8ICIgPSBbXTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm15ICQiIDw8IGV0eXBlIDw8ICIgPSAwOyIKKyAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkTGlzdEJlZ2luKCIKKyAgICAgICAgPDwgIlxcJCIgPDwgZXR5cGUgPDwgIiwgXFwkIiA8PCBzaXplIDw8ICIpOyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKKyAgc3RyaW5nIGkgPSB0bXAoIl9pIik7CisgIGluZGVudChvdXQpIDw8ICJmb3IgKG15ICQiIDw8IGkgPDwgIiA9IDA7ICQiIDw8IGkgPDwgIiA8ICQiIDw8IHNpemUgPDwgIjsgKyskIiA8PCBpIDw8ICIpIgorICAgICAgICAgICAgICA8PCBlbmRsOworCisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgcHJlZml4KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgpOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIC8vIFJlYWQgY29udGFpbmVyIGVuZAorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZE1hcEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkU2V0RW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkTGlzdEVuZCgpOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgY29kZSB0byBkZXNlcmlhbGl6ZSBhIG1hcAorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGtleSA9IHRtcCgia2V5Iik7CisgIHN0cmluZyB2YWwgPSB0bXAoInZhbCIpOworICB0X2ZpZWxkIGZrZXkodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7CisgIHRfZmllbGQgZnZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKKworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZma2V5LCB0cnVlLCB0cnVlKSA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmdmFsLCB0cnVlLCB0cnVlKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXkpOworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsKTsKKworICBpbmRlbnQob3V0KSA8PCAiJCIgPDwgcHJlZml4IDw8ICItPnskIiA8PCBrZXkgPDwgIn0gPSAkIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgZWxlbSA9IHRtcCgiZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgIm15ICQiIDw8IGVsZW0gPDwgIiA9IHVuZGVmOyIgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgIiQiIDw8IHByZWZpeCA8PCAiLT57JCIgPDwgZWxlbSA8PCAifSA9IDE7IiA8PCBlbmRsOworfQorCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgZWxlbSA9IHRtcCgiZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworCisgIGluZGVudChvdXQpIDw8ICJteSAkIiA8PCBlbGVtIDw8ICIgPSB1bmRlZjsiIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOworCisgIGluZGVudChvdXQpIDw8ICJwdXNoKEB7JCIgPDwgcHJlZml4IDw8ICJ9LCQiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworCisgIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgcHJlZml4ICsgInsiICsgdGZpZWxkLT5nZXRfbmFtZSgpICsgIn0iKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBwcmVmaXggKyAieyIgKyB0ZmllbGQtPmdldF9uYW1lKCkgKyAifSIpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworCisgICAgc3RyaW5nIG5hbWUgPSB0ZmllbGQtPmdldF9uYW1lKCk7CisKKyAgICAvLyBIYWNrIGZvciB3aGVuIHByZWZpeCBpcyBkZWZpbmVkIChhbHdheXMgYSBoYXNoIHJlZikKKyAgICBpZiAoIXByZWZpeC5lbXB0eSgpKQorICAgICAgbmFtZSA9IHByZWZpeCArICJ7IiArIHRmaWVsZC0+Z2V0X25hbWUoKSArICJ9IjsKKworICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT4iOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZygkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUJ5dGUoJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBvdXQgPDwgIndyaXRlSTE2KCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAid3JpdGVJNjQoJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICBvdXQgPDwgIndyaXRlRG91YmxlKCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFBFUkwgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQgPDwgIndyaXRlSTMyKCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgcHJlZml4LmNfc3RyKCksCisgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICB0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICB9Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKKyAgKHZvaWQpdHN0cnVjdDsKKyAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICQiIDw8IHByZWZpeCA8PCAiLT53cml0ZSgkb3V0cHV0KTsiIDw8IGVuZGw7Cit9CisKKy8qKgorICogV3JpdGVzIG91dCBhIGNvbnRhaW5lcgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7CisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZU1hcEJlZ2luKCIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgInNjYWxhcihrZXlzICV7JCIgPDwgcHJlZml4IDw8ICJ9KSk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZVNldEJlZ2luKCIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCAic2NhbGFyKEB7JCIgPDwgcHJlZml4IDw8ICJ9KSk7IiA8PCBlbmRsOworCisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworCisgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlTGlzdEJlZ2luKCIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgInNjYWxhcihAeyQiIDw8IHByZWZpeCA8PCAifSkpOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX3VwKG91dCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHN0cmluZyBraXRlciA9IHRtcCgia2l0ZXIiKTsKKyAgICBzdHJpbmcgdml0ZXIgPSB0bXAoInZpdGVyIik7CisgICAgaW5kZW50KG91dCkgPDwgIndoaWxlKCBteSAoJCIgPDwga2l0ZXIgPDwgIiwkIiA8PCB2aXRlciA8PCAiKSA9IGVhY2ggJXskIiA8PCBwcmVmaXggPDwgIn0pICIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworCisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBraXRlciwgdml0ZXIpOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHN0cmluZyBpdGVyID0gdG1wKCJpdGVyIik7CisgICAgaW5kZW50KG91dCkgPDwgImZvcmVhY2ggbXkgJCIgPDwgaXRlciA8PCAiIChAeyQiIDw8IHByZWZpeCA8PCAifSkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyKTsKKyAgICBzY29wZV9kb3duKG91dCk7CisKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgc3RyaW5nIGl0ZXIgPSB0bXAoIml0ZXIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yZWFjaCBteSAkIiA8PCBpdGVyIDw8ICIgKEB7JCIgPDwgcHJlZml4IDw8ICJ9KSAiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlTWFwRW5kKCk7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZVNldEVuZCgpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlTGlzdEVuZCgpOyIgPDwgZW5kbDsKKyAgfQorCisgIHNjb3BlX2Rvd24ob3V0KTsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgorICoKKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcga2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdml0ZXIpIHsKKyAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGtpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCk7CisKKyAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCk7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KKyAqLwordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCk7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCisgKi8KK3ZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBpdGVyKSB7CisgIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkKTsKK30KKworLyoqCisgKiBEZWNsYXJlcyBhIGZpZWxkLCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCisgKgorICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCisgKi8KK3N0cmluZyB0X3BlcmxfZ2VuZXJhdG9yOjpkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0LCBib29sIG9iaikgeworICBzdHJpbmcgcmVzdWx0ID0gIm15ICQiICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICBpZiAoaW5pdCkgeworICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSAnJyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICByZXN1bHQgKz0gIiA9IDAiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIHJlc3VsdCArPSAiID0gMCI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgIHJlc3VsdCArPSAiID0gMC4wIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFBFUkwgaW5pdGlhbGl6ZXIgZm9yIGJhc2UgdHlwZSAiCisgICAgICAgICAgICArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIHJlc3VsdCArPSAiID0gMCI7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgcmVzdWx0ICs9ICIgPSBbXSI7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgICBpZiAob2JqKSB7CisgICAgICAgIHJlc3VsdCArPSAiID0gIiArIHBlcmxfbmFtZXNwYWNlKHR5cGUtPmdldF9wcm9ncmFtKCkpICsgdHlwZS0+Z2V0X25hbWUoKSArICItPm5ldygpIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCArPSAiID0gdW5kZWYiOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0ICsgIjsiOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RyaW5nIHRfcGVybF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpIHsKKworICBzdHJpbmcgc3RyOworCisgIHN0ciA9IHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJ7XG4iOworICBzdHIgKz0gIiAgbXkgJHNlbGYgPSBzaGlmdDtcbiI7CisKKyAgLy8gTmVlZCB0byBjcmVhdGUgcGVybCBmdW5jdGlvbiBhcmcgaW5wdXRzCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RyICs9ICIgIG15ICQiICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIiA9IHNoaWZ0O1xuIjsKKyAgfQorCisgIHJldHVybiBzdHI7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZpZWxkIGxpc3QKKyAqLworc3RyaW5nIHRfcGVybF9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICB9CisgICAgcmVzdWx0ICs9ICIkIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgQysrIGVudW0gc3RyaW5nIGZvciB0aGUgZ2l2ZW4gdHlwZS4KKyAqLworc3RyaW5nIHRfcGVybF9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIlRocmlmdDo6VFR5cGU6OlNUUklORyI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJUaHJpZnQ6OlRUeXBlOjpCT09MIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJUaHJpZnQ6OlRUeXBlOjpCWVRFIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiVGhyaWZ0OjpUVHlwZTo6STE2IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiVGhyaWZ0OjpUVHlwZTo6STMyIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiVGhyaWZ0OjpUVHlwZTo6STY0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiVGhyaWZ0OjpUVHlwZTo6RE9VQkxFIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJUaHJpZnQ6OlRUeXBlOjpJMzIiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIlRocmlmdDo6VFR5cGU6OlNUUlVDVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIlRocmlmdDo6VFR5cGU6Ok1BUCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIlRocmlmdDo6VFR5cGU6OlNFVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJUaHJpZnQ6OlRUeXBlOjpMSVNUIjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihwZXJsLCAiUGVybCIsICIiKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9waHBfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9waHBfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwYTQ0MTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3BocF9nZW5lcmF0b3IuY2MKQEAgLTAsMCArMSwyNzg1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworCisjZGVmaW5lIE5TR0xPQkFMIChuc2dsb2JhbF8uc2l6ZSgpID8gbnNnbG9iYWxfIDogIiIpCisjZGVmaW5lIE5TR0xPQkFMX0EgKCJcXCIgKyBOU0dMT0JBTCkKKyNkZWZpbmUgTlNHTE9CQUxfQiAoTlNHTE9CQUwgKyAiXFwiKQorI2RlZmluZSBOU0dMT0JBTF9BQiAoIlxcIiArIE5TR0xPQkFMICsgIlxcIikKKworLyoqCisgKiBQSFAgY29kZSBnZW5lcmF0b3IuCisgKgorICovCitjbGFzcyB0X3BocF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9waHBfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIGJpbmFyeV9pbmxpbmVfID0gZmFsc2U7CisgICAgcmVzdF8gPSBmYWxzZTsKKyAgICBwaHBzXyA9IGZhbHNlOworICAgIG9vcF8gPSBmYWxzZTsKKyAgICB2YWxpZGF0ZV8gPSBmYWxzZTsKKyAgICBqc29uX3NlcmlhbGl6YWJsZV8gPSBmYWxzZTsKKyAgICBuc2dsb2JhbF8gPSAiIjsgLy8gYnkgZGVmYXVsdCBnbG9iYWwgbmFtZXNwYWNlIGlzIGVtcHR5CisgICAgY2xhc3NtYXBfID0gZmFsc2U7CisgICAgZm9yIChpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiAoaXRlci0+Zmlyc3QuY29tcGFyZSgiaW5saW5lZCIpID09IDApIHsKKyAgICAgICAgYmluYXJ5X2lubGluZV8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmIChpdGVyLT5maXJzdC5jb21wYXJlKCJyZXN0IikgPT0gMCkgeworICAgICAgICByZXN0XyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYgKGl0ZXItPmZpcnN0LmNvbXBhcmUoInNlcnZlciIpID09IDApIHsKKyAgICAgICAgcGhwc18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmIChpdGVyLT5maXJzdC5jb21wYXJlKCJvb3AiKSA9PSAwKSB7CisgICAgICAgIG9vcF8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmIChpdGVyLT5maXJzdC5jb21wYXJlKCJ2YWxpZGF0ZSIpID09IDApIHsKKyAgICAgICAgdmFsaWRhdGVfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiAoaXRlci0+Zmlyc3QuY29tcGFyZSgianNvbiIpID09IDApIHsKKyAgICAgICAganNvbl9zZXJpYWxpemFibGVfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiAoaXRlci0+Zmlyc3QuY29tcGFyZSgibnNnbG9iYWwiKSA9PSAwKSB7CisgICAgICAgIG5zZ2xvYmFsXyA9IGl0ZXItPnNlY29uZDsKKyAgICAgIH0gZWxzZSBpZiAoaXRlci0+Zmlyc3QuY29tcGFyZSgiY2xhc3NtYXAiKSA9PSAwKSB7CisgICAgICAgIGNsYXNzbWFwXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYgKGl0ZXItPmZpcnN0LmNvbXBhcmUoInBzcjQiKSA9PSAwKSB7CisgICAgICAgIGlmKGNsYXNzbWFwXyl7CisgICAgICAgICAgdGhyb3cgInBzcjQgYW5kIGNsYXNzbWFwIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwd2FybmluZygwLCAicHNyNCBpcyBkZWZhdWx0IG9wdGlvbiEgbmVlZG4ndCBhZGQgcHNyNCBvcHRpb24hXG4iKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIHBocDoiICsgaXRlci0+Zmlyc3Q7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKG9vcF8gJiYgYmluYXJ5X2lubGluZV8pIHsKKyAgICAgIHRocm93ICJvb3AgYW5kIGlubGluZWQgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4iOworICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAoYmluYXJ5X2lubGluZV8gPyAiZ2VuLXBocGkiIDogImdlbi1waHAiKTsKKyAgICBlc2NhcGVfWyckJ10gPSAiXFwkIjsKKyAgfQorCisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgaW5kZW50X3N0cigpIGNvbnN0IHsKKyAgICByZXR1cm4gIiAgICAiOworICB9CisKKyAgc3RhdGljIGJvb2wgaXNfdmFsaWRfbmFtZXNwYWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWJfbmFtZXNwYWNlKTsKKworICAvKioKKyAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcworICAgKi8KKworICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7CisgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7CisKKyAgLyoqCisgICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfY29uc3RzKHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworCisgIC8qKgorICAgKiBTdHJ1Y3RzIQorICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3BocF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9waHBfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX3BocF9zdHJ1Y3RfcmVhZGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19yZXN1bHQpOworICB2b2lkIGdlbmVyYXRlX3BocF9zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19yZXN1bHQpOworICB2b2lkIGdlbmVyYXRlX3BocF9mdW5jdGlvbl9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfcGhwX3N0cnVjdF9yZXF1aXJlZF92YWxpZGF0b3Iob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1ldGhvZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgd3JpdGVfbW9kZSk7CisgIHZvaWQgZ2VuZXJhdGVfcGhwX3N0cnVjdF9yZWFkX3ZhbGlkYXRvcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9waHBfc3RydWN0X3dyaXRlX3ZhbGlkYXRvcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9waHBfc3RydWN0X2pzb25fc2VyaWFsaXplKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfcmVzdWx0KTsKKyAgYm9vbCBuZWVkc19waHBfd3JpdGVfdmFsaWRhdG9yKHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3Jlc3VsdCk7CisgIGJvb2wgbmVlZHNfcGhwX3JlYWRfdmFsaWRhdG9yKHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3Jlc3VsdCk7CisgIGludCBnZXRfcGhwX251bV9yZXF1aXJlZF9maWVsZHMoY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzLCBib29sIHdyaXRlX21vZGUpOworCisgIHZvaWQgZ2VuZXJhdGVfcGhwX3R5cGVfc3BlYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0KTsKKyAgdm9pZCBnZW5lcmF0ZV9waHBfc3RydWN0X3NwZWMoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICAvKioKKyAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3Jlc3QodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlYWRlcih0X3NlcnZpY2UqIHRzZXJ2aWNlLCBzdGQ6Om9zdHJlYW0mIGZpbGUpOworICB2b2lkIGdlbmVyYXRlX3Byb2dyYW1faGVhZGVyKHN0ZDo6b3N0cmVhbSYgZmlsZSk7CisKKyAgLyoqCisgICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2xhc3MgPSBmYWxzZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcga2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHZpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9waHBfZG9jKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2RvYyogdGRvYyk7CisKKyAgdm9pZCBnZW5lcmF0ZV9waHBfZG9jKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQpOworCisgIHZvaWQgZ2VuZXJhdGVfcGhwX2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKworICB2b2lkIGdlbmVyYXRlX3BocF9kb2NzdHJpbmdfY29tbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgc3RyaW5nIGNvbnRlbnRzKTsKKworICAvKioKKyAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKKyAgICovCisKKyAgc3RkOjpzdHJpbmcgcGhwX2luY2x1ZGVzKCk7CisgIHN0ZDo6c3RyaW5nIGRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQgPSBmYWxzZSwgYm9vbCBvYmogPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBhZGRUeXBlSGludHMgPSB0cnVlKTsKKyAgc3RkOjpzdHJpbmcgdHlwZV90b19jYXN0KHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfdG9fcGhwZG9jKHRfdHlwZSogdHR5cGUpOworCisgIGJvb2wgcGhwX2lzX3NjYWxhcih0X3R5cGUgKnR0eXBlKSB7CisgICAgdHR5cGUgPSB0dHlwZS0+Z2V0X3RydWVfdHlwZSgpOworICAgIGlmKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgc3RkOjpzdHJpbmcgcGhwX25hbWVzcGFjZV9iYXNlKGNvbnN0IHRfcHJvZ3JhbSogcCkgeworICAgIHN0ZDo6c3RyaW5nIG5zID0gcC0+Z2V0X25hbWVzcGFjZSgicGhwIik7CisgICAgY29uc3QgY2hhciogZGVsaW1pdGVyID0gIlxcIjsKKyAgICBzaXplX3QgcG9zaXRpb24gPSBucy5maW5kKCcuJyk7CisgICAgd2hpbGUgKHBvc2l0aW9uICE9IHN0cmluZzo6bnBvcykgeworICAgICAgbnMucmVwbGFjZShwb3NpdGlvbiwgMSwgZGVsaW1pdGVyKTsKKyAgICAgIHBvc2l0aW9uID0gbnMuZmluZCgnLicsIHBvc2l0aW9uICsgMSk7CisgICAgfQorICAgIHJldHVybiBuczsKKyAgfQorCisgIC8vIGdlbmVyYWwgdXNlIG5hbWVzcGFjZSBwcmVmaXhpbmc6IFxteVxuYW1lc3BhY2VcIG9yIG15X25hbWVzcGFjZV8KKyAgc3RyaW5nIHBocF9uYW1lc3BhY2UoY29uc3QgdF9wcm9ncmFtKiBwKSB7CisgICAgc3RyaW5nIG5zID0gcGhwX25hbWVzcGFjZV9iYXNlKHApOworICAgIHJldHVybiAobnNnbG9iYWxfLnNpemUoKSA/IE5TR0xPQkFMX0FCIDogTlNHTE9CQUxfQikgKyAobnMuc2l6ZSgpID8gKG5zICsgIlxcIikgOiAiIik7CisgIH0KKworICAvLyByZXR1cm4gdGhlIG5hbWVzcGFjZSBvZiBhIGZpbGU6CisgIC8vIGdsb2JhbFxuc1xzdWJcbnMgb3IgZ2xvYmFsXG5zIG9yIHN1YlxucworICBzdHJpbmcgcGhwX25hbWVzcGFjZV9zdWZmaXgoY29uc3QgdF9wcm9ncmFtKiBwKSB7CisgICAgc3RyaW5nIG5zID0gcGhwX25hbWVzcGFjZV9iYXNlKHApOworCisgICAgcmV0dXJuIE5TR0xPQkFMCisgICAgICArIChucy5zaXplKCkgJiYgTlNHTE9CQUwuc2l6ZSgpID8gIlxcIiA6ICIiKQorICAgICAgKyBuczsKKyAgfQorCisgIC8vIGFkZCBhIGRpcmVjdG9yeSB0byBhbHJlYWR5IGV4aXN0aW5nIG5hbWVzcGFjZQorICBzdHJpbmcgcGhwX25hbWVzcGFjZV9kaXJlY3Rvcnkoc3RyaW5nIGRpcmVjdG9yeSwgYm9vbCBlbmQgPSB0cnVlKSB7CisgICAgKHZvaWQpZGlyZWN0b3J5OworICAgIGlmIChlbmQpIHsKKyAgICAgIHJldHVybiAiOyI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAiIjsKKyAgICB9CisgIH0KKworICAvLyB3cml0aW5nIGFuIGF1dGxvYWQgaWRlbnRpZmllciBpbnRvIGdsb2JhO2xzOiBteVxuYW1lc3BhY2VcIG9yIG15X25hbWVzcGFjZV8KKyAgc3RyaW5nIHBocF9uYW1lc3BhY2VfYXV0b2xvYWQoY29uc3QgdF9wcm9ncmFtKiBwKSB7CisgICAgc3RkOjpzdHJpbmcgbnMgPSBwaHBfbmFtZXNwYWNlX2Jhc2UocCk7CisgICAgcmV0dXJuIChuc2dsb2JhbF8uc2l6ZSgpID8gTlNHTE9CQUxfQiA6IE5TR0xPQkFMKSArIChucy5zaXplKCkgPyAobnMgKyAiXFwiKSA6ICIiKTsKKyAgfQorCisgIC8vIGRlY2xhcmluZyBhIHR5cGU6IHR5cGVuYW1lIG9yIG15X25hbWVzcGFjZV90eXBlbmFtZQorICBzdHJpbmcgcGhwX25hbWVzcGFjZV9kZWNsYXJhdGlvbih0X3R5cGUqIHQpIHsgcmV0dXJuIHQtPmdldF9uYW1lKCk7IH0KKworICBzdGQ6OnN0cmluZyBwaHBfcGF0aCh0X3Byb2dyYW0qIHApIHsKKyAgICBzdGQ6OnN0cmluZyBucyA9IHAtPmdldF9uYW1lc3BhY2UoInBocC5wYXRoIik7CisgICAgaWYgKG5zLmVtcHR5KCkpIHsKKyAgICAgIHJldHVybiBwLT5nZXRfbmFtZSgpOworICAgIH0KKworICAgIC8vIFRyYW5zZm9ybSB0aGUgamF2YS1zdHlsZSBuYW1lc3BhY2UgaW50byBhIHBhdGguCisgICAgZm9yIChzdGQ6OnN0cmluZzo6aXRlcmF0b3IgaXQgPSBucy5iZWdpbigpOyBpdCAhPSBucy5lbmQoKTsgKytpdCkgeworICAgICAgaWYgKCppdCA9PSAnLicpIHsKKyAgICAgICAgKml0ID0gJy8nOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBucyArICcvJzsKKyAgfQorCisgIC8qKgorICAgKiBUcmFuc2Zvcm0gY2xhc3NfbWV0aG9kIGludG8gQ2xhc3NNZXRob2QKKyAgICoKKyAgICogQHBhcmFtIHN0cgorICAgKiBAcmV0dXJuIHN0aXJuZworICAgKi8KKyAgc3RyaW5nIGNsYXNzaWZ5KHN0cmluZyBzdHIpIHsKKyAgICBzdHJpbmcgY2xhc3NlID0gIiI7CisKKyAgICB2ZWN0b3I8c3RyaW5nPiB4ID0gc3BsaXQoc3RyLCAnXycpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB4LnNpemUoKTsgKytpKSB7CisgICAgICBjbGFzc2UgPSBjbGFzc2UgKyBjYXBpdGFsaXplKHhbaV0pOworICAgIH0KKworICAgIHJldHVybiBjbGFzc2U7CisgIH0KKworICAvKioKKyAgICogU3BsaXQgbWV0aG9kCisgICAqIEBwYXJhbSBzCisgICAqIEBwYXJhbSBkZWxpbQorICAgKiBAcGFyYW0gZWxlbXMKKyAgICogQHJldHVybgorICAgKi8KKyAgdmVjdG9yPHN0cmluZz4mIHNwbGl0KGNvbnN0IHN0cmluZyYgcywgY2hhciBkZWxpbSwgdmVjdG9yPHN0cmluZz4mIGVsZW1zKSB7CisgICAgc3RyaW5nc3RyZWFtIHNzKHMpOworICAgIHN0cmluZyBpdGVtOworCisgICAgd2hpbGUgKGdldGxpbmUoc3MsIGl0ZW0sIGRlbGltKSkgeworICAgICAgZWxlbXMucHVzaF9iYWNrKGl0ZW0pOworICAgIH0KKworICAgIHJldHVybiBlbGVtczsKKyAgfQorCisgIHZlY3RvcjxzdHJpbmc+IHNwbGl0KGNvbnN0IHN0cmluZyYgcywgY2hhciBkZWxpbSkgeworICAgIHZlY3RvcjxzdHJpbmc+IGVsZW1zOworCisgICAgcmV0dXJuIHNwbGl0KHMsIGRlbGltLCBlbGVtcyk7CisgIH0KKworICAvKioKKyAgICogQ2FwaXRhbGl6ZSBtZXRob2QKKyAgICogQHBhcmFtIHN0cgorICAgKiBAcmV0dXJuCisgICAqLworICBzdHJpbmcgY2FwaXRhbGl6ZShzdHJpbmcgc3RyKSB7CisgICAgc3RyaW5nOjppdGVyYXRvciBpdChzdHIuYmVnaW4oKSk7CisKKyAgICBpZiAoaXQgIT0gc3RyLmVuZCgpKQorICAgICAgc3RyWzBdID0gdG91cHBlcigodW5zaWduZWQgY2hhcilzdHJbMF0pOworCisgICAgLy8gICAgd2hpbGUoKytpdCAhPSBzdHIuZW5kKCkpCisgICAgLy8gICAgeworICAgIC8vICAgICAgKml0ID0gdG9sb3dlcigodW5zaWduZWQgY2hhcikqaXQpOworICAgIC8vICAgIH0KKyAgICByZXR1cm4gc3RyOworICB9CisKK3ByaXZhdGU6CisgIC8qKgorICAgKiBGaWxlIHN0cmVhbXMKKyAgICovCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl90eXBlc187CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zZXJ2aWNlXzsKKworICBzdGQ6OnN0cmluZyBwYWNrYWdlX2Rpcl87CisgIC8qKgorICAgKiBHZW5lcmF0ZSBwcm90b2NvbC1pbmRlcGVuZGVudCB0ZW1wbGF0ZT8gT3IgQmluYXJ5IGlubGluZSBjb2RlPworICAgKi8KKyAgYm9vbCBiaW5hcnlfaW5saW5lXzsKKworICAvKioKKyAgICogR2VuZXJhdGUgYSBSRVNUIGhhbmRsZXIgY2xhc3MKKyAgICovCisgIGJvb2wgcmVzdF87CisKKyAgLyoqCisgICAqIEdlbmVyYXRlIHN0dWJzIGZvciBhIFBIUCBzZXJ2ZXIKKyAgICovCisgIGJvb2wgcGhwc187CisKKyAgLyoqCisgICAqIFdoZXRoZXIgdG8gdXNlIE9PUCBiYXNlIGNsYXNzIFRCYXNlCisgICAqLworICBib29sIG9vcF87CisKKyAgLyoqCisgICAqIFdoZXRoZXIgdG8gZ2VuZXJhdGUgb2xkLXN0eWxlIFBIUCBmaWxlIHRvIHVzZSBjbGFzc21hcCBhdXRvbG9hZGluZworICAgKi8KKyAgYm9vbCBjbGFzc21hcF87CisKKyAgLyoqCisgICAqIFdoZXRoZXIgdG8gZ2VuZXJhdGUgdmFsaWRhdG9yIGNvZGUKKyAgICovCisgIGJvb2wgdmFsaWRhdGVfOworCisgIC8qKgorICAgKiBXaGV0aGVyIHRvIGdlbmVyYXRlIEpzb25TZXJpYWxpemFibGUgY2xhc3NlcworICAgKi8KKyAgYm9vbCBqc29uX3NlcmlhbGl6YWJsZV87CisKKyAgLyoqCisgICAqIEdsb2JhbCBuYW1lc3BhY2UgZm9yIFBIUCA1LjMKKyAgICovCisgIHN0ZDo6c3RyaW5nIG5zZ2xvYmFsXzsKK307CisKK2Jvb2wgdF9waHBfZ2VuZXJhdG9yOjppc192YWxpZF9uYW1lc3BhY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHN1Yl9uYW1lc3BhY2UpIHsKKyAgcmV0dXJuIHN1Yl9uYW1lc3BhY2UgPT0gInBhdGgiOworfQorCisvKioKKyAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0CisgKiBzdHJlYW1zLgorICoKKyAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQorICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworCisgIC8vIENyZWF0ZSBSZWFsIGRpcmVjdG9yeSBOYW1lc3BhY2VzCisgIHZlY3RvcjxzdHJpbmc+IE5TeCA9IHNwbGl0KHBocF9uYW1lc3BhY2Vfc3VmZml4KGdldF9wcm9ncmFtKCkpLCAnXFwnKTsKKyAgcGFja2FnZV9kaXJfID0gZ2V0X291dF9kaXIoKTsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IE5TeC5zaXplKCk7ICsraSkgeworICAgIHBhY2thZ2VfZGlyXyA9IHBhY2thZ2VfZGlyXyArICIvIiArIE5TeFtpXSArICIvIjsKKyAgICBNS0RJUihwYWNrYWdlX2Rpcl8uY19zdHIoKSk7CisgIH0KKworICAvLyBQcmVwYXJlIG91dHB1dCBmaWxlIGZvciBhbGwgdGhlIHR5cGVzIGluIGNsYXNzbWFwIG1vZGUKKyAgaWYgKGNsYXNzbWFwXykgeworICAgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgICBzdHJpbmcgZl90eXBlc19uYW1lID0gcGFja2FnZV9kaXJfICsgIlR5cGVzLnBocCI7CisgICAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7CisgICAgZ2VuZXJhdGVfcHJvZ3JhbV9oZWFkZXIoZl90eXBlc18pOworICB9Cit9CisKKy8qKgorICogUHJpbnRzIHN0YW5kYXJkIHBocCBpbmNsdWRlcworICovCitzdHJpbmcgdF9waHBfZ2VuZXJhdG9yOjpwaHBfaW5jbHVkZXMoKSB7CisgIHN0cmluZyBpbmNsdWRlcyA9ICJ1c2UgVGhyaWZ0XFxCYXNlXFxUQmFzZTtcbiIKKyAgICAgICAgICAgICAgICAgICAgInVzZSBUaHJpZnRcXFR5cGVcXFRUeXBlO1xuIgorICAgICAgICAgICAgICAgICAgICAidXNlIFRocmlmdFxcVHlwZVxcVE1lc3NhZ2VUeXBlO1xuIgorICAgICAgICAgICAgICAgICAgICAidXNlIFRocmlmdFxcRXhjZXB0aW9uXFxURXhjZXB0aW9uO1xuIgorICAgICAgICAgICAgICAgICAgICAidXNlIFRocmlmdFxcRXhjZXB0aW9uXFxUUHJvdG9jb2xFeGNlcHRpb247XG4iCisgICAgICAgICAgICAgICAgICAgICJ1c2UgVGhyaWZ0XFxQcm90b2NvbFxcVFByb3RvY29sO1xuIgorICAgICAgICAgICAgICAgICAgICAidXNlIFRocmlmdFxcUHJvdG9jb2xcXFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkO1xuIgorICAgICAgICAgICAgICAgICAgICAidXNlIFRocmlmdFxcRXhjZXB0aW9uXFxUQXBwbGljYXRpb25FeGNlcHRpb247XG4iOworCisgIGlmIChqc29uX3NlcmlhbGl6YWJsZV8pIHsKKyAgICBpbmNsdWRlcyArPSAidXNlIEpzb25TZXJpYWxpemFibGU7XG4iCisgICAgICAgICAgICAgICAgInVzZSBzdGRDbGFzcztcbiI7CisgIH0KKworICByZXR1cm4gaW5jbHVkZXM7Cit9CisKKy8qKgorICogQ2xvc2UgdXAgKG9yIGRvd24pIHNvbWUgZmlsZXouCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7CisgIGlmIChjbGFzc21hcF8pIHsKKyAgICAvLyBDbG9zZSB0eXBlcyBmaWxlCisgICAgZl90eXBlc18uY2xvc2UoKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gUEhQLCB0eXBlcyBhcmUgYWxsIGltcGxpY2l0LgorICoKKyAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgKHZvaWQpdHR5cGVkZWY7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHNlcnZpY2UgaGVhZGVyIGNvbnRhaW5zIG5hbWVzcGFjZSBzdWZmaXggYW5kIGluY2x1ZGVzIGluc2lkZSBmaWxlIHNwZWNpZmllZAorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWFkZXIodF9zZXJ2aWNlKiB0c2VydmljZSwgc3RkOjpvc3RyZWFtJiBmaWxlKSB7CisgIGZpbGUgPDwgIjw/cGhwIiA8PCBlbmRsOworICBpZiAoIXBocF9uYW1lc3BhY2Vfc3VmZml4KHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKS5lbXB0eSgpKSB7CisgICAgZmlsZSA8PCAibmFtZXNwYWNlICIgPDwgcGhwX25hbWVzcGFjZV9zdWZmaXgodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8ICI7IiA8PCBlbmRsCisgICAgICAgICA8PCBlbmRsOworICB9CisgIGZpbGUgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgcGhwX2luY2x1ZGVzKCk7CisKKyAgZmlsZSA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBwcm9ncmFtIGhlYWRlciBjb250YWlucyBuYW1lc3BhY2Ugc3VmZml4IGFuZCBpbmNsdWRlcyBpbnNpZGUgZmlsZSBzcGVjaWZpZWQKKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2dyYW1faGVhZGVyKHN0ZDo6b3N0cmVhbSYgZmlsZSkgeworICBmaWxlIDw8ICI8P3BocCIgPDwgZW5kbDsKKyAgaWYgKCFwaHBfbmFtZXNwYWNlX3N1ZmZpeChnZXRfcHJvZ3JhbSgpKS5lbXB0eSgpKSB7CisgICAgZmlsZSA8PCAibmFtZXNwYWNlICIgPDwgcGhwX25hbWVzcGFjZV9zdWZmaXgoZ2V0X3Byb2dyYW0oKSkgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgIDw8IGVuZGw7CisgIH0KKyAgZmlsZSA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBwaHBfaW5jbHVkZXMoKTsKKworICBmaWxlIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4gU2luY2UgZGVmaW5lIGlzIGV4cGVuc2l2ZSB0byBsb29rdXAKKyAqIGluIFBIUCwgd2UgdXNlIGEgZ2xvYmFsIGFycmF5IGZvciB0aGlzLgorICoKKyAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlJiBmX2VudW0gPSBmX3R5cGVzXzsKKyAgaWYgKCFjbGFzc21hcF8pIHsKKyAgICBzdHJpbmcgZl9lbnVtX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyB0ZW51bS0+Z2V0X25hbWUoKSArICIucGhwIjsKKyAgICBmX2VudW0ub3BlbihmX2VudW1fbmFtZS5jX3N0cigpKTsKKyAgICBnZW5lcmF0ZV9wcm9ncmFtX2hlYWRlcihmX2VudW0pOworICB9CisKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOworCisgIC8vIFdlJ3JlIGFsc28gZG9pbmcgaXQgdGhpcyB3YXkgdG8gc2VlIGhvdyBpdCBwZXJmb3Jtcy4gSXQncyBtb3JlIGxlZ2libGUKKyAgLy8gY29kZSBidXQgeW91IGNhbid0IGRvIHRoaW5ncyBsaWtlIGFuICdleHRyYWN0JyBvbiBpdCwgd2hpY2ggaXMgYSBiaXQgb2YKKyAgLy8gYSBkb3duZXIuCisgIGdlbmVyYXRlX3BocF9kb2MoZl9lbnVtLCB0ZW51bSk7CisgIGZfZW51bSA8PCAiZmluYWwgY2xhc3MgIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCBlbmRsCisgICAgICAgICA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworICAgIGdlbmVyYXRlX3BocF9kb2MoZl9lbnVtLCAqY19pdGVyKTsKKyAgICBpbmRlbnQoZl9lbnVtKSA8PCAiY29uc3QgIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgdmFsdWUgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KGZfZW51bSkgPDwgInN0YXRpYyBwdWJsaWMgJF9fbmFtZXMgPSBhcnJheSgiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICBpbmRlbnQoZl9lbnVtKSA8PCB2YWx1ZSA8PCAiID0+ICciIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJywiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KGZfZW51bSkgPDwgIik7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisKKyAgZl9lbnVtIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIGlmICghY2xhc3NtYXBfKSB7CisgICAgZl9lbnVtLmNsb3NlKCk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZSBjb25zdGFudCBjbGFzcworICoKKyAqIE92ZXJyaWRlIHRoZSBvbmUgZnJvbSB0X2dlbmVyYXRvcgorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RzKHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKSB7CisgIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKKworICAvLyBDcmVhdGUgY2xhc3Mgb25seSBpZiBuZWVkZWQKKyAgaWYgKGNvbnN0cy5zaXplKCkgPiAwKSB7CisKKyAgICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlJiBmX2NvbnN0cyA9IGZfdHlwZXNfOworICAgIGlmICghY2xhc3NtYXBfKSB7CisgICAgICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IHBhY2thZ2VfZGlyXyArICJDb25zdGFudC5waHAiOworICAgICAgZl9jb25zdHMub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOworICAgICAgZ2VuZXJhdGVfcHJvZ3JhbV9oZWFkZXIoZl9jb25zdHMpOworICAgIH0KKyAgICBmX2NvbnN0cyA8PCAiZmluYWwgY2xhc3MgQ29uc3RhbnQgZXh0ZW5kcyBcXFRocmlmdFxcVHlwZVxcVENvbnN0YW50Ijw8IGVuZGwKKyAgICAgICAgICAgICA8PCAieyIgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworCisgICAgLy8gQ3JlYXRlIHN0YXRpYyBwcm9wZXJ0eQorICAgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgICBzdHJpbmcgbmFtZSA9ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKKworICAgICAgaW5kZW50KGZfY29uc3RzKSA8PCAic3RhdGljIHByb3RlY3RlZCAkIiA8PCBuYW1lIDw8ICI7IiA8PCBlbmRsOworICAgIH0KKworICAgIC8vIENyZWF0ZSBpbml0IGZ1bmN0aW9uCisgICAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICAgIHN0cmluZyBuYW1lID0gKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgICBmX2NvbnN0cyA8PCBlbmRsOworCisgICAgICBmX2NvbnN0cyA8PCBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIHN0YXRpYyBmdW5jdGlvbiBpbml0XyIgPDwgbmFtZSA8PCAiKCkiIDw8ZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgaW5kZW50KGZfY29uc3RzKSA8PCAicmV0dXJuICI7CisgICAgICBnZW5lcmF0ZV9waHBfZG9jKGZfY29uc3RzLCAqY19pdGVyKTsKKyAgICAgIGZfY29uc3RzIDw8IHJlbmRlcl9jb25zdF92YWx1ZSgoKmNfaXRlciktPmdldF90eXBlKCksICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkpOworICAgICAgZl9jb25zdHMgPDwgIjsiIDw8IGVuZGw7CisKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQoZl9jb25zdHMpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9jb25zdHMgPDwgIn0iIDw8IGVuZGw7CisgICAgaWYgKCFjbGFzc21hcF8pIHsKKyAgICAgIGZfY29uc3RzLmNsb3NlKCk7CisgICAgfQorICB9Cit9CisKKy8qKgorICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCisgKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQorICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKKyAqLworc3RyaW5nIHRfcGhwX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBvdXQgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgb3V0IDw8ICh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDAgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgb3V0IDw8ICJuZXcgIiA8PCBwaHBfbmFtZXNwYWNlKHR5cGUtPmdldF9wcm9ncmFtKCkpIDw8IHR5cGUtPmdldF9uYW1lKCkgPDwgIihhcnJheSgiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIH0KKyAgICAgIG91dCA8PCBpbmRlbnQoKTsKKyAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZ190eXBlX3N0cmluZywgdl9pdGVyLT5maXJzdCk7CisgICAgICBvdXQgPDwgIiA9PiAiOworICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIikpIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBvdXQgPDwgImFycmF5KCIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCk7CisgICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKKyAgICAgIG91dCA8PCAiID0+ICI7CisgICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIikiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogZXR5cGU7CisgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0KKyAgICBvdXQgPDwgImFycmF5KCIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKTsKKyAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpOworICAgICAgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgICAgIG91dCA8PCAiID0+IHRydWUiOworICAgICAgfQorICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICIpIjsKKyAgfQorICByZXR1cm4gb3V0LnN0cigpOworfQorCisvKioKKyAqIE1ha2UgYSBzdHJ1Y3QKKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9waHBfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZXhjZXB0aW9uLiBCYXNpY2FsbHkgdGhlIHNhbWUKKyAqIGFzIGEgc3RydWN0IGJ1dCBleHRlbmRzIHRoZSBFeGNlcHRpb24gY2xhc3MuCisgKgorICogQHBhcmFtIHR4Y2VwdGlvbiBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfcGhwX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOworfQorCisvKioKKyAqIFN0cnVjdHMgY2FuIGJlIG5vcm1hbCBvciBleGNlcHRpb25zLgorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSYgZl9zdHJ1Y3QgPSBmX3R5cGVzXzsKKyAgaWYgKCFjbGFzc21hcF8pIHsKKyAgICBzdHJpbmcgZl9zdHJ1Y3RfbmFtZSA9IHBhY2thZ2VfZGlyXyArIHRzdHJ1Y3QtPmdldF9uYW1lKCkgKyAiLnBocCI7CisgICAgZl9zdHJ1Y3Qub3BlbihmX3N0cnVjdF9uYW1lLmNfc3RyKCkpOworICAgIGdlbmVyYXRlX3Byb2dyYW1faGVhZGVyKGZfc3RydWN0KTsKKyAgfQorICBnZW5lcmF0ZV9waHBfc3RydWN0X2RlZmluaXRpb24oZl9zdHJ1Y3QsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7CisgIGlmICghY2xhc3NtYXBfKSB7CisgICAgZl9zdHJ1Y3QuY2xvc2UoKTsKKyAgfQorfQorCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX3R5cGVfc3BlYyhvc3RyZWFtJiBvdXQsIHRfdHlwZSogdCkgeworICB0ID0gZ2V0X3RydWVfdHlwZSh0KTsKKyAgaW5kZW50KG91dCkgPDwgIid0eXBlJyA9PiAiIDw8IHR5cGVfdG9fZW51bSh0KSA8PCAiLCIgPDwgZW5kbDsKKworICBpZiAodC0+aXNfYmFzZV90eXBlKCkgfHwgdC0+aXNfZW51bSgpKSB7CisgICAgLy8gTm9vcCwgdHlwZSBpcyBhbGwgd2UgbmVlZAorICB9IGVsc2UgaWYgKHQtPmlzX3N0cnVjdCgpIHx8IHQtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiJ2NsYXNzJyA9PiAnIiA8PCBwaHBfbmFtZXNwYWNlKHQtPmdldF9wcm9ncmFtKCkpIDw8IHQtPmdldF9uYW1lKCkgPDwgIicsIgorICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodC0+aXNfbWFwKCkpIHsKKyAgICB0X3R5cGUqIGt0eXBlID0gZ2V0X3RydWVfdHlwZSgoKHRfbWFwKil0KS0+Z2V0X2tleV90eXBlKCkpOworICAgIHRfdHlwZSogdnR5cGUgPSBnZXRfdHJ1ZV90eXBlKCgodF9tYXAqKXQpLT5nZXRfdmFsX3R5cGUoKSk7CisgICAgaW5kZW50KG91dCkgPDwgIidrdHlwZScgPT4gIiA8PCB0eXBlX3RvX2VudW0oa3R5cGUpIDw8ICIsIiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICIndnR5cGUnID0+ICIgPDwgdHlwZV90b19lbnVtKHZ0eXBlKSA8PCAiLCIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiJ2tleScgPT4gYXJyYXkoIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGdlbmVyYXRlX3BocF90eXBlX3NwZWMob3V0LCBrdHlwZSk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiKSwiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIid2YWwnID0+IGFycmF5KCIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9waHBfdHlwZV9zcGVjKG91dCwgdnR5cGUpOworICAgIGluZGVudChvdXQpIDw8ICIpLCIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9IGVsc2UgaWYgKHQtPmlzX2xpc3QoKSB8fCB0LT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogZXR5cGU7CisgICAgaWYgKHQtPmlzX2xpc3QoKSkgeworICAgICAgZXR5cGUgPSBnZXRfdHJ1ZV90eXBlKCgodF9saXN0Kil0KS0+Z2V0X2VsZW1fdHlwZSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgZXR5cGUgPSBnZXRfdHJ1ZV90eXBlKCgodF9zZXQqKXQpLT5nZXRfZWxlbV90eXBlKCkpOworICAgIH0KKyAgICBpbmRlbnQob3V0KSA8PCAiJ2V0eXBlJyA9PiAiIDw8IHR5cGVfdG9fZW51bShldHlwZSkgPDwgIiwiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIidlbGVtJyA9PiBhcnJheSgiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZ2VuZXJhdGVfcGhwX3R5cGVfc3BlYyhvdXQsIGV0eXBlKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiKSwiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIHR5cGUgZm9yIHBocCBzdHJ1Y3Qgc3BlYyBmaWVsZCI7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIHN0cnVjdCBzcGVjaWZpY2F0aW9uIHN0cnVjdHVyZSwgd2hpY2ggZnVsbHkgcXVhbGlmaWVzIGVub3VnaAorICogdHlwZSBpbmZvcm1hdGlvbiB0byBnZW5lcmFsaXplIHNlcmlhbGl6YXRpb24gcm91dGluZXMuCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfc3RydWN0X3NwZWMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAic3RhdGljIHB1YmxpYyAkX1RTUEVDID0gYXJyYXkoIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgIGluZGVudChvdXQpIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICIgPT4gYXJyYXkoIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJ3ZhcicgPT4gJyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIidpc1JlcXVpcmVkJyA9PiAiIDw8ICgoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEID8gInRydWUiIDogImZhbHNlIikgPDwgIiwiIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfcGhwX3R5cGVfc3BlYyhvdXQsIHQpOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIiksIiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KG91dCkgPDwgIik7IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4gVGhpcyBpcyBub3RoaW5nIGluIFBIUAorICogd2hlcmUgdGhlIG9iamVjdHMgYXJlIGFsbCBqdXN0IGFzc29jaWF0aXZlIGFycmF5cyAodW5sZXNzIG9mIGNvdXJzZSB3ZQorICogZGVjaWRlIHRvIHN0YXJ0IHVzaW5nIG9iamVjdHMgZm9yIHRoZW0uLi4pCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgZ2VuZXJhdGVfcGhwX2RvYyhvdXQsIHRzdHJ1Y3QpOworICBvdXQgPDwgImNsYXNzICIgPDwgcGhwX25hbWVzcGFjZV9kZWNsYXJhdGlvbih0c3RydWN0KTsKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIG91dCA8PCAiIGV4dGVuZHMgIgorICAgICAgICA8PCAiVEV4Y2VwdGlvbiI7CisgIH0gZWxzZSBpZiAob29wXykgeworICAgIG91dCA8PCAiIGV4dGVuZHMgIgorICAgICAgICA8PCAiVEJhc2UiOworICB9CisgIGlmIChqc29uX3NlcmlhbGl6YWJsZV8pIHsKKyAgICBvdXQgPDwgIiBpbXBsZW1lbnRzIEpzb25TZXJpYWxpemFibGUiOworICB9CisgIG91dCA8PCBlbmRsCisgICAgICA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJzdGF0aWMgcHVibGljICRpc1ZhbGlkYXRlID0gIiA8PCAodmFsaWRhdGVfID8gInRydWUiIDogImZhbHNlIikgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9waHBfc3RydWN0X3NwZWMob3V0LCB0c3RydWN0KTsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgc3RyaW5nIGR2YWwgPSAibnVsbCI7CisgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwgJiYgISh0LT5pc19zdHJ1Y3QoKSB8fCB0LT5pc194Y2VwdGlvbigpKSkgeworICAgICAgZHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZSgoKm1faXRlciktPmdldF90eXBlKCksICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkpOworICAgIH0KKyAgICBnZW5lcmF0ZV9waHBfZG9jKG91dCwgKm1faXRlcik7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAkIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgZHZhbCA8PCAiOyIgPDwgZW5kbDsKKyAgfQorCisgIG91dCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIGNvbnN0cnVjdG9yIGZyb20gYXJyYXkKKyAgc3RyaW5nIHBhcmFtID0gKG1lbWJlcnMuc2l6ZSgpID4gMCkgPyAiJHZhbHMgPSBudWxsIiA6ICIiOworICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgiIDw8IHBhcmFtIDw8ICIpIjw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOworICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCAmJiAodC0+aXNfc3RydWN0KCkgfHwgdC0+aXNfeGNlcHRpb24oKSkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIiR0aGlzLT4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIgorICAgICAgICAgICAgICAgICAgICA8PCByZW5kZXJfY29uc3RfdmFsdWUodCwgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKGlzX2FycmF5KCR2YWxzKSkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpZiAob29wXykgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwYXJlbnQ6Ol9fY29uc3RydWN0KHNlbGY6OiRfVFNQRUMsICR2YWxzKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoaXNzZXQoJHZhbHNbJyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInXSkpIHsiIDw8IGVuZGw7CisKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJHRoaXMtPiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAkdmFsc1snIgorICAgICAgICAgICAgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInXTsiIDw8IGVuZGw7CisKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfQorICBzY29wZV9kb3duKG91dCk7CisgIG91dCA8PCBlbmRsOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGZ1bmN0aW9uIGdldE5hbWUoKSIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICciIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIic7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIG91dCA8PCBlbmRsOworICBnZW5lcmF0ZV9waHBfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QsIGlzX3Jlc3VsdCk7CisgIG91dCA8PCBlbmRsOworICBnZW5lcmF0ZV9waHBfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QsIGlzX3Jlc3VsdCk7CisgIGlmIChuZWVkc19waHBfcmVhZF92YWxpZGF0b3IodHN0cnVjdCwgaXNfcmVzdWx0KSkgeworICAgIG91dCA8PCBlbmRsOworICAgIGdlbmVyYXRlX3BocF9zdHJ1Y3RfcmVhZF92YWxpZGF0b3Iob3V0LCB0c3RydWN0KTsKKyAgfQorICBpZiAobmVlZHNfcGhwX3dyaXRlX3ZhbGlkYXRvcih0c3RydWN0LCBpc19yZXN1bHQpKSB7CisgICAgb3V0IDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfcGhwX3N0cnVjdF93cml0ZV92YWxpZGF0b3Iob3V0LCB0c3RydWN0KTsKKyAgfQorICBpZiAoanNvbl9zZXJpYWxpemFibGVfKSB7CisgICAgb3V0IDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfcGhwX3N0cnVjdF9qc29uX3NlcmlhbGl6ZShvdXQsIHRzdHJ1Y3QsIGlzX3Jlc3VsdCk7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSByZWFkKCkgbWV0aG9kIGZvciBhIHN0cnVjdAorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX3N0cnVjdF9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19yZXN1bHQpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gcmVhZCgkaW5wdXQpIiA8PCBlbmRsOworICBzY29wZV91cChvdXQpOworCisgIGlmIChvb3BfKSB7CisgICAgaWYgKG5lZWRzX3BocF9yZWFkX3ZhbGlkYXRvcih0c3RydWN0LCBpc19yZXN1bHQpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiJHRtcCA9ICR0aGlzLT5fcmVhZCgnIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICInLCBzZWxmOjokX1RTUEVDLCAkaW5wdXQpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiJHRoaXMtPl92YWxpZGF0ZUZvclJlYWQoKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICR0bXA7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICR0aGlzLT5fcmVhZCgnIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICInLCBzZWxmOjokX1RTUEVDLCAkaW5wdXQpOyIKKyAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICByZXR1cm47CisgIH0KKworICBvdXQgPDwgaW5kZW50KCkgPDwgIiR4ZmVyID0gMDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiRmbmFtZSA9IG51bGw7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICA8PCAiJGZ0eXBlID0gMDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiRmaWQgPSAwOyIgPDwgZW5kbDsKKworICAvLyBEZWNsYXJlIHN0YWNrIHRtcCB2YXJpYWJsZXMKKyAgaWYgKCFiaW5hcnlfaW5saW5lXykgeworICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRTdHJ1Y3RCZWdpbigkZm5hbWUpOyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcworICBpbmRlbnQob3V0KSA8PCAid2hpbGUgKHRydWUpIHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gUmVhZCBiZWdpbm5pbmcgZmllbGQgbWFya2VyCisgIGlmIChiaW5hcnlfaW5saW5lXykgeworICAgIHRfZmllbGQgZmZ0eXBlKGdfdHlwZV9pOCwgImZ0eXBlIik7CisgICAgdF9maWVsZCBmZmlkKGdfdHlwZV9pMTYsICJmaWQiKTsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZnR5cGUpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCRmdHlwZSA9PSAiCisgICAgICAgIDw8ICJUVHlwZTo6U1RPUCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBicmVhazsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmZpZCk7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZEZpZWxkQmVnaW4oJGZuYW1lLCAkZnR5cGUsICRmaWQpOyIgPDwgZW5kbDsKKyAgICAvLyBDaGVjayBmb3IgZmllbGQgU1RPUCBtYXJrZXIgYW5kIGJyZWFrCisgICAgaW5kZW50KG91dCkgPDwgImlmICgkZnR5cGUgPT0gIgorICAgICAgICAgICAgICAgIDw8ICJUVHlwZTo6U1RPUCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICAvLyBTd2l0Y2ggc3RhdGVtZW50IG9uIHRoZSBmaWVsZCB3ZSBhcmUgcmVhZGluZworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoICgkZmlkKSB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgImlmICgkZnR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMtPiIpOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKworICAgIGluZGVudF91cCgpOworICAgIGlmIChiaW5hcnlfaW5saW5lXykgeworICAgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9IFRQcm90b2NvbDo6c2tpcEJpbmFyeSgkaW5wdXQsICRmdHlwZSk7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5za2lwKCRmdHlwZSk7IiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIC8vIEluIHRoZSBkZWZhdWx0IGNhc2Ugd2Ugc2tpcCB0aGUgZmllbGQKKyAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICBpZiAoYmluYXJ5X2lubGluZV8pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gIgorICAgICAgICAgICAgICAgIDw8ICJUUHJvdG9jb2w6OnNraXBCaW5hcnkoJGlucHV0LCAkZnR5cGUpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5za2lwKCRmdHlwZSk7IiA8PCBlbmRsOworICB9CisgIGluZGVudChvdXQpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIGlmICghYmluYXJ5X2lubGluZV8pIHsKKyAgICAvLyBSZWFkIGZpZWxkIGVuZCBtYXJrZXIKKyAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkRmllbGRFbmQoKTsiIDw8IGVuZGw7CisgIH0KKworICBzY29wZV9kb3duKG91dCk7CisKKyAgaWYgKCFiaW5hcnlfaW5saW5lXykgeworICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7CisgIH0KKworICBpZiAobmVlZHNfcGhwX3JlYWRfdmFsaWRhdG9yKHRzdHJ1Y3QsIGlzX3Jlc3VsdCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiJHRoaXMtPl92YWxpZGF0ZUZvclJlYWQoKTsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICR4ZmVyOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSB3cml0ZSgpIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfcmVzdWx0KSB7CisgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpZiAoYmluYXJ5X2lubGluZV8pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIHdyaXRlKCYkb3V0cHV0KSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIHdyaXRlKCRvdXRwdXQpIiA8PCBlbmRsOworICB9CisgIGluZGVudChvdXQpIDw8ICJ7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAobmVlZHNfcGhwX3dyaXRlX3ZhbGlkYXRvcih0c3RydWN0LCBpc19yZXN1bHQpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIiR0aGlzLT5fdmFsaWRhdGVGb3JXcml0ZSgpOyIgPDwgZW5kbDsKKyAgfQorCisgIGlmIChvb3BfKSB7CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiAkdGhpcy0+X3dyaXRlKCciIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIicsIHNlbGY6OiRfVFNQRUMsICRvdXRwdXQpOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICByZXR1cm47CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgPSAwOyIgPDwgZW5kbDsKKworICBpZiAoIWJpbmFyeV9pbmxpbmVfKSB7CisgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0QmVnaW4oJyIgPDwgbmFtZSA8PCAiJyk7IiA8PCBlbmRsOworICB9CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgkdGhpcy0+IiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBzdHJpbmcgZXhwZWN0OworICAgIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgZXhwZWN0ID0gImFycmF5IjsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpKSB7CisgICAgICBleHBlY3QgPSAib2JqZWN0IjsKKyAgICB9CisgICAgaWYgKCFleHBlY3QuZW1wdHkoKSkgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIWlzXyIgPDwgZXhwZWN0IDw8ICIoJHRoaXMtPiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpKSB7IgorICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGhyb3cgbmV3ICIKKyAgICAgICAgICA8PCAiVFByb3RvY29sRXhjZXB0aW9uKCdCYWQgdHlwZSBpbiBzdHJ1Y3R1cmUuJywgIgorICAgICAgICAgIDw8ICJUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7IiA8PCBlbmRsOworICAgICAgc2NvcGVfZG93bihvdXQpOworICAgIH0KKworICAgIC8vIFdyaXRlIGZpZWxkIGhlYWRlcgorICAgIGlmIChiaW5hcnlfaW5saW5lXykgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ2MnLCAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpOyIKKyAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ24nLCAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRCZWdpbigiCisgICAgICAgICAgICAgICAgICA8PCAiJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpCisgICAgICAgICAgICAgICAgICA8PCAiLCAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLT4iKTsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgorICAgIGlmICghYmluYXJ5X2lubGluZV8pIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICBpZiAoYmluYXJ5X2lubGluZV8pIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gcGFjaygnYycsICIKKyAgICAgICAgPDwgIlRUeXBlOjpTVE9QKTsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7CisgIH0KKworICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAkeGZlcjsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX3N0cnVjdF9yZWFkX3ZhbGlkYXRvcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGdlbmVyYXRlX3BocF9zdHJ1Y3RfcmVxdWlyZWRfdmFsaWRhdG9yKG91dCwgdHN0cnVjdCwgIl92YWxpZGF0ZUZvclJlYWQiLCBmYWxzZSk7Cit9CisKK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfc3RydWN0X3dyaXRlX3ZhbGlkYXRvcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGdlbmVyYXRlX3BocF9zdHJ1Y3RfcmVxdWlyZWRfdmFsaWRhdG9yKG91dCwgdHN0cnVjdCwgIl92YWxpZGF0ZUZvcldyaXRlIiwgdHJ1ZSk7Cit9CisKK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfc3RydWN0X3JlcXVpcmVkX3ZhbGlkYXRvcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWV0aG9kX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB3cml0ZV9tb2RlKSB7CisgIGluZGVudChvdXQpIDw8ICJwcml2YXRlIGZ1bmN0aW9uICIgPDwgbWV0aG9kX25hbWUgPDwgIigpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisKKyAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIGZpZWxkID0gKCpmX2l0ZXIpOworICAgICAgaWYgKGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRAorICAgICAgICAgIHx8IChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQgJiYgd3JpdGVfbW9kZSkpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImlmICgkdGhpcy0+IiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiID09PSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oJ1JlcXVpcmVkIGZpZWxkICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiLiIKKyAgICAgICAgICAgICAgICAgICAgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiBpcyB1bnNldCEnKTsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX3N0cnVjdF9qc29uX3NlcmlhbGl6ZShvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0KSB7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24ganNvblNlcmlhbGl6ZSgpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGlmIChuZWVkc19waHBfd3JpdGVfdmFsaWRhdG9yKHRzdHJ1Y3QsIGlzX3Jlc3VsdCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiJHRoaXMtPl92YWxpZGF0ZUZvcldyaXRlKCk7IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50KG91dCkgPDwgIiRqc29uID0gbmV3IHN0ZENsYXNzOyIgPDwgZW5kbDsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworCisgIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgeworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgdF9maWVsZCogZmllbGQgPSAoKmZfaXRlcik7CisgICAgICB0X3R5cGUqIHR5cGUgPSBmaWVsZC0+Z2V0X3R5cGUoKTsKKyAgICAgIGNvbnN0IHN0cmluZyYgbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOworICAgICAgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgICAgIHRfdHlwZSoga2V5X3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgICAgIGlmICghKGtleV90eXBlLT5pc19iYXNlX3R5cGUoKSB8fCBrZXlfdHlwZS0+aXNfZW51bSgpKSkgeworICAgICAgICAgIC8vIEpTT04gb2JqZWN0IGtleXMgbXVzdCBiZSBzdHJpbmdzLiBQSFAncyBqc29uX2VuY29kZSgpCisgICAgICAgICAgLy8gZnVuY3Rpb24gd2lsbCBjb252ZXJ0IGFueSBzY2FsYXIga2V5IHRvIHN0cmluZ3MsIGJ1dAorICAgICAgICAgIC8vIHdlIHNraXAgdGhyaWZ0IG1hcHMgd2l0aCBub24tc2NhbGFyIGtleXMuCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoJHRoaXMtPiIgPDwgbmFtZSA8PCAiICE9PSBudWxsKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiJGpzb24tPiIgPDwgbmFtZSA8PCAiID0gIjsKKyAgICAgIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgICAgICBvdXQgPDwgIihvYmplY3QpIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCB0eXBlX3RvX2Nhc3QodHlwZSk7CisgICAgICB9CisgICAgICBvdXQgPDwgIiR0aGlzLT4iIDw8IG5hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiAkanNvbjsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK2ludCB0X3BocF9nZW5lcmF0b3I6OmdldF9waHBfbnVtX3JlcXVpcmVkX2ZpZWxkcyhjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMsIGJvb2wgd3JpdGVfbW9kZSkgeworICBpbnQgbnVtX3JlcSA9IDA7CisKKyAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRAorICAgICAgICAgIHx8ICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUICYmIHdyaXRlX21vZGUpKSB7CisgICAgICAgICsrbnVtX3JlcTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9yZXE7Cit9CisKK2Jvb2wgdF9waHBfZ2VuZXJhdG9yOjpuZWVkc19waHBfd3JpdGVfdmFsaWRhdG9yKHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3Jlc3VsdCkgeworICByZXR1cm4gKHZhbGlkYXRlXyAmJiAhaXNfcmVzdWx0ICYmICF0c3RydWN0LT5pc191bmlvbigpCisgICAgICAgICAgJiYgZ2V0X3BocF9udW1fcmVxdWlyZWRfZmllbGRzKHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCksIHRydWUpID4gMCk7Cit9CisKK2Jvb2wgdF9waHBfZ2VuZXJhdG9yOjpuZWVkc19waHBfcmVhZF92YWxpZGF0b3IodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfcmVzdWx0KSB7CisgIHJldHVybiAodmFsaWRhdGVfICYmICFpc19yZXN1bHQKKyAgICAgICAgICAmJiAoZ2V0X3BocF9udW1fcmVxdWlyZWRfZmllbGRzKHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCksIGZhbHNlKSA+IDApKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIGlmKGNsYXNzbWFwXykgeworICAgIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IHBhY2thZ2VfZGlyXyArIHNlcnZpY2VfbmFtZV8gKyAiLnBocCI7CisgICAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOworICAgIGdlbmVyYXRlX3NlcnZpY2VfaGVhZGVyKHRzZXJ2aWNlLCBmX3NlcnZpY2VfKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSB0aHJlZSBtYWluIHBhcnRzIG9mIHRoZSBzZXJ2aWNlICh3ZWxsLCB0d28gZm9yIG5vdyBpbiBQSFApCisgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKKyAgaWYgKHJlc3RfKSB7CisgICAgZ2VuZXJhdGVfc2VydmljZV9yZXN0KHRzZXJ2aWNlKTsKKyAgfQorICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7CisgIGlmIChwaHBzXykgeworICAgIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRzZXJ2aWNlKTsKKyAgfQorCisgIGlmKGNsYXNzbWFwXykgeworICAgIC8vIENsb3NlIHNlcnZpY2UgZmlsZQorICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgICBmX3NlcnZpY2VfLmNsb3NlKCk7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUmIGZfc2VydmljZV9wcm9jZXNzb3IgPSBmX3NlcnZpY2VfOworICBpZiAoIWNsYXNzbWFwXykgeworICAgIHN0cmluZyBmX3NlcnZpY2VfcHJvY2Vzc29yX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyBzZXJ2aWNlX25hbWVfICsgIlByb2Nlc3Nvci5waHAiOworICAgIGZfc2VydmljZV9wcm9jZXNzb3Iub3BlbihmX3NlcnZpY2VfcHJvY2Vzc29yX25hbWUuY19zdHIoKSk7CisgICAgZ2VuZXJhdGVfc2VydmljZV9oZWFkZXIodHNlcnZpY2UsIGZfc2VydmljZV9wcm9jZXNzb3IpOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfcHJvY2Vzc29yID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpOworICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gIiBleHRlbmRzICIgKyBwaHBfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfcHJvZ3JhbSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgKyBleHRlbmRzICsgIlByb2Nlc3NvciI7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KKyAgZl9zZXJ2aWNlX3Byb2Nlc3NvciA8PCAiY2xhc3MgIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJQcm9jZXNzb3IiIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGZfc2VydmljZV9wcm9jZXNzb3IgPDwgaW5kZW50KCkgPDwgInByb3RlY3RlZCAkaGFuZGxlcl8gPSBudWxsOyIgPDwgZW5kbDsKKyAgfQorCisgIGZfc2VydmljZV9wcm9jZXNzb3IgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkaGFuZGxlcikiPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlX3Byb2Nlc3NvciA8PCBpbmRlbnQoKSA8PCAiJHRoaXMtPmhhbmRsZXJfID0gJGhhbmRsZXI7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfc2VydmljZV9wcm9jZXNzb3IgPDwgaW5kZW50KCkgPDwgInBhcmVudDo6X19jb25zdHJ1Y3QoJGhhbmRsZXIpOyIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV9wcm9jZXNzb3IgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCisgIGZfc2VydmljZV9wcm9jZXNzb3IgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiBwcm9jZXNzKCRpbnB1dCwgJG91dHB1dCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9zZXJ2aWNlX3Byb2Nlc3NvciA8PCBpbmRlbnQoKSA8PCAiJHJzZXFpZCA9IDA7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkZm5hbWUgPSBudWxsOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkbXR5cGUgPSAwOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGlmIChiaW5hcnlfaW5saW5lXykgeworICAgIHRfZmllbGQgZmZuYW1lKGdfdHlwZV9zdHJpbmcsICJmbmFtZSIpOworICAgIHRfZmllbGQgZm10eXBlKGdfdHlwZV9pOCwgIm10eXBlIik7CisgICAgdF9maWVsZCBmc2VxaWQoZ190eXBlX2kzMiwgInJzZXFpZCIpOworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKGZfc2VydmljZV9wcm9jZXNzb3IsICZmZm5hbWUsICIiLCB0cnVlKTsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChmX3NlcnZpY2VfcHJvY2Vzc29yLCAmZm10eXBlLCAiIiwgdHJ1ZSk7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoZl9zZXJ2aWNlX3Byb2Nlc3NvciwgJmZzZXFpZCwgIiIsIHRydWUpOworICB9IGVsc2UgeworICAgIGZfc2VydmljZV9wcm9jZXNzb3IgPDwgaW5kZW50KCkgPDwgIiRpbnB1dC0+cmVhZE1lc3NhZ2VCZWdpbigkZm5hbWUsICRtdHlwZSwgJHJzZXFpZCk7IiA8PCBlbmRsOworICB9CisKKyAgLy8gSE9UOiBjaGVjayBmb3IgbWV0aG9kIGltcGxlbWVudGF0aW9uCisgIGZfc2VydmljZV9wcm9jZXNzb3IgPDwgaW5kZW50KCkgPDwgIiRtZXRob2RuYW1lID0gJ3Byb2Nlc3NfJy4kZm5hbWU7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmICghbWV0aG9kX2V4aXN0cygkdGhpcywgJG1ldGhvZG5hbWUpKSB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICBpZiAoYmluYXJ5X2lubGluZV8pIHsKKyAgICBmX3NlcnZpY2VfcHJvY2Vzc29yIDw8IGluZGVudCgpIDw8ICJ0aHJvdyBuZXcgXFxFeGNlcHRpb24oJ0Z1bmN0aW9uICcuJGZuYW1lLicgbm90IGltcGxlbWVudGVkLicpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX3NlcnZpY2VfcHJvY2Vzc29yIDw8IGluZGVudCgpIDw8ICIgICRpbnB1dC0+c2tpcCgiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiVFR5cGU6OlNUUlVDVCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgICRpbnB1dC0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgICR4ID0gbmV3ICIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJUQXBwbGljYXRpb25FeGNlcHRpb24oJ0Z1bmN0aW9uICcuJGZuYW1lLicgbm90IGltcGxlbWVudGVkLicsICIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJUQXBwbGljYXRpb25FeGNlcHRpb246OlVOS05PV05fTUVUSE9EKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgICRvdXRwdXQtPndyaXRlTWVzc2FnZUJlZ2luKCRmbmFtZSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlRNZXNzYWdlVHlwZTo6RVhDRVBUSU9OLCAkcnNlcWlkKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgICR4LT53cml0ZSgkb3V0cHV0KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgJG91dHB1dC0+d3JpdGVNZXNzYWdlRW5kKCk7IgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICAkb3V0cHV0LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgIHJldHVybjsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfcHJvY2Vzc29yIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiR0aGlzLT4kbWV0aG9kbmFtZSgkcnNlcWlkLCAkaW5wdXQsICRvdXRwdXQpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlX3Byb2Nlc3NvciA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24oZl9zZXJ2aWNlX3Byb2Nlc3NvciwgdHNlcnZpY2UsICpmX2l0ZXIpOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlX3Byb2Nlc3NvciA8PCAifSIgPDwgZW5kbDsKKworICBpZiAoIWNsYXNzbWFwXykgeworICAgIGZfc2VydmljZV9wcm9jZXNzb3IuY2xvc2UoKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgLy8gT3BlbiBmdW5jdGlvbgorICBvdXQgPDwgaW5kZW50KCkgPDwgInByb3RlY3RlZCBmdW5jdGlvbiBwcm9jZXNzXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoJHNlcWlkLCAkaW5wdXQsICRvdXRwdXQpIiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgc3RyaW5nIGFyZ3NuYW1lID0gcGhwX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgKyBzZXJ2aWNlX25hbWVfICsgIl8iCisgICAgICAgICAgICAgICAgICAgICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKKyAgc3RyaW5nIHJlc3VsdG5hbWUgPSBwaHBfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIKKyAgICAgICAgICAgICAgICAgICAgICArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgIiRiaW5fYWNjZWwgPSAoJGlucHV0IGluc3RhbmNlb2YgIgorICAgICAgICAgICAgIDw8ICJUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCkgJiYgZnVuY3Rpb25fZXhpc3RzKCd0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnlfYWZ0ZXJfbWVzc2FnZV9iZWdpbicpOyIKKyAgICAgICAgICAgICA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgkYmluX2FjY2VsKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgIiRhcmdzID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5X2FmdGVyX21lc3NhZ2VfYmVnaW4oIiA8PGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiJGlucHV0LCI8PGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICInIiA8PCBhcmdzbmFtZSA8PCAiJywiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICIkaW5wdXQtPmlzU3RyaWN0UmVhZCgpIiA8PGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8Iik7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiJGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiJGFyZ3MtPnJlYWQoJGlucHV0KTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIGlmICghYmluYXJ5X2lubGluZV8pIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiRpbnB1dC0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisgIH0KKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworCisgIC8vIERlY2xhcmUgcmVzdWx0IGZvciBub24gb25ld2F5IGZ1bmN0aW9uCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKKyAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0cnkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCisgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBvdXQgPDwgaW5kZW50KCk7CisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICBvdXQgPDwgIiRyZXN1bHQtPnN1Y2Nlc3MgPSAiOworICB9CisgIG91dCA8PCAiJHRoaXMtPmhhbmRsZXJfLT4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICIsICI7CisgICAgfQorICAgIG91dCA8PCAiJGFyZ3MtPiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICB9CisgIG91dCA8PCAiKTsiIDw8IGVuZGw7CisKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmIHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IGNhdGNoICgiCisgICAgICAgICAgICAgICAgIDw8IHBocF9uYW1lc3BhY2UoZ2V0X3RydWVfdHlwZSgoKnhfaXRlciktPmdldF90eXBlKCkpLT5nZXRfcHJvZ3JhbSgpKQorICAgICAgICAgICAgICAgICA8PCAoKnhfaXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCkgPDwgIiAkIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIikgeyIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkcmVzdWx0LT4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gJCIKKyAgICAgICAgICAgICAgICAgICA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKTsKKyAgICAgIH0KKyAgICB9CisgICAgb3V0IDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgLy8gU2hvcnRjdXQgb3V0IGhlcmUgZm9yIG9uZXdheSBmdW5jdGlvbnMKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgcmV0dXJuOworICB9CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIkYmluX2FjY2VsID0gKCRvdXRwdXQgaW5zdGFuY2VvZiAiCisgICAgICAgICAgICAgPDwgIlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKSAmJiBmdW5jdGlvbl9leGlzdHMoJ3RocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnknKTsiCisgICAgICAgICAgICAgPDwgZW5kbDsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgkYmluX2FjY2VsKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgInRocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnkoIiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQsIjw8ZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIiciIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKTw8ICInLCIgPDxlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiVE1lc3NhZ2VUeXBlOjpSRVBMWSwiPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIiRyZXN1bHQsIiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiJHNlcWlkLCIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQtPmlzU3RyaWN0V3JpdGUoKSI8PGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICIpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QgaGVhZGVyCisgIGlmIChiaW5hcnlfaW5saW5lXykgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJGJ1ZmYgPSBwYWNrKCdOJywgKDB4ODAwMTAwMDAgfCAiCisgICAgICAgIDw8ICJUTWVzc2FnZVR5cGU6OlJFUExZKSk7ICIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJGJ1ZmYgLj0gcGFjaygnTicsIHN0cmxlbignIgorICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIicpKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiRidWZmIC49ICciCisgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiJzsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiRidWZmIC49IHBhY2soJ04nLCAkc2VxaWQpOyIKKyAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJHJlc3VsdC0+d3JpdGUoJGJ1ZmYpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiJG91dHB1dC0+d3JpdGUoJGJ1ZmYpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dC0+Zmx1c2goKTsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkb3V0cHV0LT53cml0ZU1lc3NhZ2VCZWdpbignIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIicsICIKKyAgICAgICAgPDwgIlRNZXNzYWdlVHlwZTo6UkVQTFksICRzZXFpZCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkcmVzdWx0LT53cml0ZSgkb3V0cHV0KTsiCisgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQtPndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICA8PCAiJG91dHB1dC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIC8vIENsb3NlIGZ1bmN0aW9uCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgYSBzZXJ2aWNlLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSYgZl9zdHJ1Y3RfZGVmaW5pdGlvbiA9IGZfc2VydmljZV87CisgIGlmIChjbGFzc21hcF8pIHsKKyAgICBmX3N0cnVjdF9kZWZpbml0aW9uIDw8ICIvLyBIRUxQRVIgRlVOQ1RJT05TIEFORCBTVFJVQ1RVUkVTIiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBzdHJpbmcgbmFtZSA9IHRzLT5nZXRfbmFtZSgpOworICAgIHRzLT5zZXRfbmFtZShzZXJ2aWNlX25hbWVfICsgIl8iICsgbmFtZSk7CisKKyAgICBpZiAoIWNsYXNzbWFwXykgeworICAgICAgc3RyaW5nIGZfc3RydWN0X2RlZmluaXRpb25fbmFtZSA9IHBhY2thZ2VfZGlyXyArIHNlcnZpY2VfbmFtZV8gKyAiXyIgKyBuYW1lICsgIi5waHAiOworICAgICAgZl9zdHJ1Y3RfZGVmaW5pdGlvbi5vcGVuKGZfc3RydWN0X2RlZmluaXRpb25fbmFtZS5jX3N0cigpKTsKKyAgICAgIGdlbmVyYXRlX3NlcnZpY2VfaGVhZGVyKHRzZXJ2aWNlLCBmX3N0cnVjdF9kZWZpbml0aW9uKTsKKyAgICB9CisKKyAgICBnZW5lcmF0ZV9waHBfc3RydWN0X2RlZmluaXRpb24oZl9zdHJ1Y3RfZGVmaW5pdGlvbiwgdHMpOworICAgIGlmICghY2xhc3NtYXBfKSB7CisgICAgICBmX3N0cnVjdF9kZWZpbml0aW9uLmNsb3NlKCk7CisgICAgfQorCisgICAgZ2VuZXJhdGVfcGhwX2Z1bmN0aW9uX2hlbHBlcnModHNlcnZpY2UsICpmX2l0ZXIpOworICAgIHRzLT5zZXRfbmFtZShuYW1lKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX2Z1bmN0aW9uX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgc2VydmljZV9uYW1lXyArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7CisgICAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKKyAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKKyAgICB9CisKKyAgICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7CisgICAgfQorCisgICAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSYgZl9zdHJ1Y3RfaGVscGVyID0gZl9zZXJ2aWNlXzsKKyAgICBpZiAoIWNsYXNzbWFwXykgeworICAgICAgc3RyaW5nIGZfc3RydWN0X2hlbHBlcl9uYW1lID0gcGFja2FnZV9kaXJfICsgcmVzdWx0LmdldF9uYW1lKCkgKyAiLnBocCI7CisgICAgICBmX3N0cnVjdF9oZWxwZXIub3BlbihmX3N0cnVjdF9oZWxwZXJfbmFtZS5jX3N0cigpKTsKKyAgICAgIGdlbmVyYXRlX3NlcnZpY2VfaGVhZGVyKHRzZXJ2aWNlLCBmX3N0cnVjdF9oZWxwZXIpOworICAgIH0KKyAgICBnZW5lcmF0ZV9waHBfc3RydWN0X2RlZmluaXRpb24oZl9zdHJ1Y3RfaGVscGVyLCAmcmVzdWx0LCBmYWxzZSwgdHJ1ZSk7CisgICAgaWYgKCFjbGFzc21hcF8pIHsKKyAgICAgIGZfc3RydWN0X2hlbHBlci5jbG9zZSgpOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUmIGZfc2VydmljZV9pbnRlcmZhY2UgPSBmX3NlcnZpY2VfOworICBpZiAoIWNsYXNzbWFwXykgeworICAgIHN0cmluZyBmX3NlcnZpY2VfaW50ZXJmYWNlX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyBzZXJ2aWNlX25hbWVfICsgIklmLnBocCI7CisgICAgZl9zZXJ2aWNlX2ludGVyZmFjZS5vcGVuKGZfc2VydmljZV9pbnRlcmZhY2VfbmFtZS5jX3N0cigpKTsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX2hlYWRlcih0c2VydmljZSwgZl9zZXJ2aWNlX2ludGVyZmFjZSk7CisgIH0KKworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19pZiA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSAiIGV4dGVuZHMgIiArIHBocF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9wcm9ncmFtKCkpCisgICAgICAgICAgICAgICsgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCk7CisgICAgZXh0ZW5kc19pZiA9ICIgZXh0ZW5kcyAiICsgcGhwX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X3Byb2dyYW0oKSkKKyAgICAgICAgICAgICAgICAgKyB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSArICJJZiI7CisgIH0KKyAgZ2VuZXJhdGVfcGhwX2RvYyhmX3NlcnZpY2VfaW50ZXJmYWNlLCB0c2VydmljZSk7CisgIGZfc2VydmljZV9pbnRlcmZhY2UgPDwgImludGVyZmFjZSAiIDw8IHBocF9uYW1lc3BhY2VfZGVjbGFyYXRpb24odHNlcnZpY2UpIDw8ICJJZiIgPDwgZXh0ZW5kc19pZiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgPDwgInsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGdlbmVyYXRlX3BocF9kb2MoZl9zZXJ2aWNlX2ludGVyZmFjZSwgKmZfaXRlcik7CisgICAgaW5kZW50KGZfc2VydmljZV9pbnRlcmZhY2UpIDw8ICJwdWJsaWMgZnVuY3Rpb24gIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgIjsiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlX2ludGVyZmFjZSA8PCAifSIgPDwgZW5kbDsKKworICAvLyBDbG9zZSBzZXJ2aWNlIGludGVyZmFjZSBmaWxlCisgIGlmICghY2xhc3NtYXBfKSB7CisgICAgZl9zZXJ2aWNlX2ludGVyZmFjZS5jbG9zZSgpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgUkVTVCBpbnRlcmZhY2UKKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfcmVzdCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUmIGZfc2VydmljZV9yZXN0ID0gZl9zZXJ2aWNlXzsKKyAgaWYgKCFjbGFzc21hcF8pIHsKKyAgICBzdHJpbmcgZl9zZXJ2aWNlX3Jlc3RfbmFtZSA9IHBhY2thZ2VfZGlyXyArIHNlcnZpY2VfbmFtZV8gKyAiUmVzdC5waHAiOworICAgIGZfc2VydmljZV9yZXN0Lm9wZW4oZl9zZXJ2aWNlX3Jlc3RfbmFtZS5jX3N0cigpKTsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX2hlYWRlcih0c2VydmljZSwgZl9zZXJ2aWNlX3Jlc3QpOworICB9CisKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfaWYgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gIiBleHRlbmRzICIgKyBwaHBfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfcHJvZ3JhbSgpKQorICAgICAgICAgICAgICArIHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpOworICAgIGV4dGVuZHNfaWYgPSAiIGV4dGVuZHMgIiArIHBocF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9wcm9ncmFtKCkpCisgICAgICAgICAgICAgICAgICsgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgKyAiUmVzdCI7CisgIH0KKyAgZl9zZXJ2aWNlX3Jlc3QgPDwgImNsYXNzICIgPDwgc2VydmljZV9uYW1lXyA8PCAiUmVzdCIgPDwgZXh0ZW5kc19pZiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8ICJ7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlX3Jlc3QgPDwgaW5kZW50KCkgPDwgInByb3RlY3RlZCAkaW1wbF87IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICBmX3NlcnZpY2VfcmVzdCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRpbXBsKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgIiAgJHRoaXMtPmltcGxfID0gJGltcGw7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaW5kZW50KGZfc2VydmljZV9yZXN0KSA8PCAicHVibGljIGZ1bmN0aW9uICIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoJHJlcXVlc3QpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgYXJncyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBhX2l0ZXI7CisgICAgZm9yIChhX2l0ZXIgPSBhcmdzLmJlZ2luKCk7IGFfaXRlciAhPSBhcmdzLmVuZCgpOyArK2FfaXRlcikgeworICAgICAgdF90eXBlKiBhdHlwZSA9IGdldF90cnVlX3R5cGUoKCphX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgIHN0cmluZyBjYXN0ID0gdHlwZV90b19jYXN0KGF0eXBlKTsKKyAgICAgIHN0cmluZyByZXEgPSAiJHJlcXVlc3RbJyIgKyAoKmFfaXRlciktPmdldF9uYW1lKCkgKyAiJ10iOworICAgICAgaWYgKGF0eXBlLT5pc19ib29sKCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlX3Jlc3QgPDwgaW5kZW50KCkgPDwgIiQiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCBjYXN0IDw8ICIoIWVtcHR5KCIgPDwgcmVxCisgICAgICAgICAgICAgICAgICAgPDwgIikgJiYgKCIgPDwgcmVxIDw8ICIgIT09ICdmYWxzZScpKTsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfcmVzdCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBpc3NldCgiIDw8IHJlcSA8PCAiKSA/ICIKKyAgICAgICAgICAgICAgICAgICA8PCBjYXN0IDw8IHJlcSA8PCAiIDogbnVsbDsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpZiAoYXR5cGUtPmlzX3N0cmluZygpICYmICgodF9iYXNlX3R5cGUqKWF0eXBlKS0+aXNfc3RyaW5nX2xpc3QoKSkgeworICAgICAgICBmX3NlcnZpY2VfcmVzdCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBleHBsb2RlKCcsJywgJCIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSBpZiAoYXR5cGUtPmlzX21hcCgpIHx8IGF0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlX3Jlc3QgPDwgaW5kZW50KCkgPDwgIiQiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0ganNvbl9kZWNvZGUoJCIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIsIHRydWUpOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSBpZiAoYXR5cGUtPmlzX3NldCgpKSB7CisgICAgICAgIGZfc2VydmljZV9yZXN0IDw8IGluZGVudCgpIDw8ICIkIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IGFycmF5X2ZpbGxfa2V5cyhqc29uX2RlY29kZSgkIgorICAgICAgICAgICAgICAgICAgICAgICA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIiwgdHJ1ZSksIDEpOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSBpZiAoYXR5cGUtPmlzX3N0cnVjdCgpIHx8IGF0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgICAgIGZfc2VydmljZV9yZXN0IDw8IGluZGVudCgpIDw8ICJpZiAoJCIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT09IG51bGwpIHsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgJCIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBuZXcgIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBwaHBfbmFtZXNwYWNlKGF0eXBlLT5nZXRfcHJvZ3JhbSgpKSA8PCBhdHlwZS0+Z2V0X25hbWUoKSA8PCAiKGpzb25fZGVjb2RlKCQiCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiLCB0cnVlKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgICBmX3NlcnZpY2VfcmVzdCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICR0aGlzLT5pbXBsXy0+IiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIigiCisgICAgICAgICAgICAgICA8PCBhcmd1bWVudF9saXN0KCgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSwgZmFsc2UpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChmX3NlcnZpY2VfcmVzdCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfcmVzdCA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIC8vIENsb3NlIHNlcnZpY2UgcmVzdCBmaWxlCisgIGZfc2VydmljZV9yZXN0IDw8IGVuZGw7CisgIGlmICghY2xhc3NtYXBfKSB7CisgICAgZl9zZXJ2aWNlX3Jlc3QuY2xvc2UoKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSYgZl9zZXJ2aWNlX2NsaWVudCA9IGZfc2VydmljZV87CisgIGlmICghY2xhc3NtYXBfKSB7CisgICAgc3RyaW5nIGZfc2VydmljZV9jbGllbnRfbmFtZSA9IHBhY2thZ2VfZGlyXyArIHNlcnZpY2VfbmFtZV8gKyAiQ2xpZW50LnBocCI7CisgICAgZl9zZXJ2aWNlX2NsaWVudC5vcGVuKGZfc2VydmljZV9jbGllbnRfbmFtZS5jX3N0cigpKTsKKyAgICBnZW5lcmF0ZV9zZXJ2aWNlX2hlYWRlcih0c2VydmljZSwgZl9zZXJ2aWNlX2NsaWVudCk7CisgIH0KKworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCk7CisgICAgZXh0ZW5kc19jbGllbnQgPSAiIGV4dGVuZHMgIiArIHBocF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9wcm9ncmFtKCkpICsgZXh0ZW5kcworICAgICAgICAgICAgICAgICAgICAgKyAiQ2xpZW50IjsKKyAgfQorCisgIGZfc2VydmljZV9jbGllbnQgPDwgImNsYXNzICIgPDwgcGhwX25hbWVzcGFjZV9kZWNsYXJhdGlvbih0c2VydmljZSkgPDwgIkNsaWVudCIgPDwgZXh0ZW5kc19jbGllbnQKKyAgICAgICAgICAgICA8PCAiIGltcGxlbWVudHMgIiA8PCBwaHBfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZiIgPDwgZW5kbAorICAgICAgICAgICAgIDw8InsiPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gUHJpdmF0ZSBtZW1iZXJzCisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgJGlucHV0XyA9IG51bGw7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAicHJvdGVjdGVkICRvdXRwdXRfID0gbnVsbDsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgJHNlcWlkXyA9IDA7IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KKworICAvLyBDb25zdHJ1Y3RvciBmdW5jdGlvbgorICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGlucHV0LCAkb3V0cHV0ID0gbnVsbCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKyAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICJwYXJlbnQ6Ol9fY29uc3RydWN0KCRpbnB1dCwgJG91dHB1dCk7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgIiR0aGlzLT5pbnB1dF8gPSAkaW5wdXQ7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJHRoaXMtPm91dHB1dF8gPSAkb3V0cHV0ID8gJG91dHB1dCA6ICRpbnB1dDsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKyAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKworICAgIGZfc2VydmljZV9jbGllbnQgPDwgZW5kbDsKKworICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICBpbmRlbnQoZl9zZXJ2aWNlX2NsaWVudCkgPDwgInB1YmxpYyBmdW5jdGlvbiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOworICAgIHNjb3BlX3VwKGZfc2VydmljZV9jbGllbnQpOworICAgIGluZGVudChmX3NlcnZpY2VfY2xpZW50KSA8PCAiJHRoaXMtPnNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIjsKKworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgIiQiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIH0KKyAgICBmX3NlcnZpY2VfY2xpZW50IDw8ICIpOyIgPDwgZW5kbDsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKTsKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCAicmV0dXJuICI7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8ICIkdGhpcy0+cmVjdl8iIDw8IGZ1bm5hbWUgPDwgIigpOyIgPDwgZW5kbDsKKyAgICB9CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfY2xpZW50KTsKKyAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGVuZGw7CisKKyAgICBpbmRlbnQoZl9zZXJ2aWNlX2NsaWVudCkgPDwgInB1YmxpYyBmdW5jdGlvbiBzZW5kXyIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7CisgICAgc2NvcGVfdXAoZl9zZXJ2aWNlX2NsaWVudCk7CisKKyAgICBzdGQ6OnN0cmluZyBhcmdzbmFtZSA9IHBocF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpICsgc2VydmljZV9uYW1lXyArICJfIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiOworCisgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAiJGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsOworCisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgIiRhcmdzLT4iIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAkIgorICAgICAgICAgICAgICAgICA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICIkYmluX2FjY2VsID0gKCR0aGlzLT5vdXRwdXRfIGluc3RhbmNlb2YgIgorICAgICAgICAgICAgICAgPDwgIlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKSAmJiBmdW5jdGlvbl9leGlzdHMoJ3RocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnknKTsiCisgICAgICAgICAgICAgICA8PCBlbmRsOworCisgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAiaWYgKCRiaW5fYWNjZWwpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBzdHJpbmcgbWVzc2FnZVR5cGUgPSAoKmZfaXRlciktPmlzX29uZXdheSgpID8gIlRNZXNzYWdlVHlwZTo6T05FV0FZIiA6ICJUTWVzc2FnZVR5cGU6OkNBTEwiOworCisgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAidGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSgiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICIkdGhpcy0+b3V0cHV0XywiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICInIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicsIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBtZXNzYWdlVHlwZSA8PCAiLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRhcmdzLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiR0aGlzLT5zZXFpZF8sIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJHRoaXMtPm91dHB1dF8tPmlzU3RyaWN0V3JpdGUoKSIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAiKTsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0IGhlYWRlcgorICAgIGlmIChiaW5hcnlfaW5saW5lXykgeworICAgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAiJGJ1ZmYgPSBwYWNrKCdOJywgKDB4ODAwMTAwMDAgfCAiIDw8IG1lc3NhZ2VUeXBlIDw8ICIpKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRidWZmIC49IHBhY2soJ04nLCBzdHJsZW4oJyIgPDwgZnVubmFtZSA8PCAiJykpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJGJ1ZmYgLj0gJyIgPDwgZnVubmFtZSA8PCAiJzsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIiRidWZmIC49IHBhY2soJ04nLCAkdGhpcy0+c2VxaWRfKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgIiR0aGlzLT5vdXRwdXRfLT53cml0ZU1lc3NhZ2VCZWdpbignIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIicsICIgPDwgbWVzc2FnZVR5cGUgPDwgIiwgJHRoaXMtPnNlcWlkXyk7IiA8PCBlbmRsOworICAgIH0KKworICAgIC8vIFdyaXRlIHRvIHRoZSBzdHJlYW0KKyAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKKyAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgIiRhcmdzLT53cml0ZSgkYnVmZik7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIkdGhpcy0+b3V0cHV0Xy0+d3JpdGUoJGJ1ZmYpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiJHRoaXMtPm91dHB1dF8tPmZsdXNoKCk7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICIkYXJncy0+d3JpdGUoJHRoaXMtPm91dHB1dF8pOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiJHRoaXMtPm91dHB1dF8tPndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiJHRoaXMtPm91dHB1dF8tPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBzY29wZV9kb3duKGZfc2VydmljZV9jbGllbnQpOworCisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfY2xpZW50KTsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0bmFtZSA9IHBocF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpICsgc2VydmljZV9uYW1lXyArICJfIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOworICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKKworICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vYXJncyk7CisgICAgICAvLyBPcGVuIGZ1bmN0aW9uCisgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIHNjb3BlX3VwKGZfc2VydmljZV9jbGllbnQpOworCisgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICIkYmluX2FjY2VsID0gKCR0aGlzLT5pbnB1dF8gaW5zdGFuY2VvZiAiCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICJUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCkiCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgJiYgZnVuY3Rpb25fZXhpc3RzKCd0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnknKTsiIDw8IGVuZGw7CisKKyAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgImlmICgkYmluX2FjY2VsKSB7IiA8PCBlbmRsOworCisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgIiRyZXN1bHQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnkoIiA8PCBlbmRsOworCisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgIiR0aGlzLT5pbnB1dF8sIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICInIiA8PCByZXN1bHRuYW1lIDw8ICInLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJHRoaXMtPmlucHV0Xy0+aXNTdHJpY3RSZWFkKCkiIDw8IGVuZGw7CisKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICIpOyIgPDwgZW5kbDsKKworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworCisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgIiRyc2VxaWQgPSAwOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJGZuYW1lID0gbnVsbDsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRtdHlwZSA9IDA7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAgIGlmIChiaW5hcnlfaW5saW5lXykgeworICAgICAgICB0X2ZpZWxkIGZmbmFtZShnX3R5cGVfc3RyaW5nLCAiZm5hbWUiKTsKKyAgICAgICAgdF9maWVsZCBmc2VxaWQoZ190eXBlX2kzMiwgInJzZXFpZCIpOworICAgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICIkdmVyID0gdW5wYWNrKCdOJywgJHRoaXMtPmlucHV0Xy0+cmVhZEFsbCg0KSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiR2ZXIgPSAkdmVyWzFdOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJG10eXBlID0gJHZlciAmIDB4ZmY7IgorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiR2ZXIgPSAkdmVyICYgMHhmZmZmMDAwMDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiaWYgKCR2ZXIgIT0gMHg4MDAxMDAwMCkgdGhyb3cgbmV3ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiVFByb3RvY29sRXhjZXB0aW9uKCdCYWQgdmVyc2lvbiBpZGVudGlmaWVyOiAnLiR2ZXIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiVFByb3RvY29sRXhjZXB0aW9uOjpCQURfVkVSU0lPTik7IiA8PCBlbmRsOworICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChmX3NlcnZpY2VfY2xpZW50LCAmZmZuYW1lLCAiIiwgdHJ1ZSk7CisgICAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKGZfc2VydmljZV9jbGllbnQsICZmc2VxaWQsICIiLCB0cnVlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgIiR0aGlzLT5pbnB1dF8tPnJlYWRNZXNzYWdlQmVnaW4oJGZuYW1lLCAkbXR5cGUsICRyc2VxaWQpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoJG10eXBlID09IFRNZXNzYWdlVHlwZTo6RVhDRVBUSU9OKSB7IiA8PCBlbmRsOworCisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICIkeCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJHgtPnJlYWQoJHRoaXMtPmlucHV0Xyk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiR0aGlzLT5pbnB1dF8tPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInRocm93ICR4OyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAiJHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJHJlc3VsdC0+cmVhZCgkdGhpcy0+aW5wdXRfKTsiIDw8IGVuZGw7CisKKyAgICAgIGlmICghYmluYXJ5X2lubGluZV8pIHsKKyAgICAgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAiJHRoaXMtPmlucHV0Xy0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlX2NsaWVudCk7CisKKyAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIHJlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgImlmICgkcmVzdWx0LT5zdWNjZXNzICE9PSBudWxsKSB7IiA8PCBlbmRsOworCisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gJHJlc3VsdC0+c3VjY2VzczsiIDw8IGVuZGw7CisKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAiaWYgKCRyZXN1bHQtPiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT09IG51bGwpIHsiIDw8IGVuZGw7CisKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgInRocm93ICRyZXN1bHQtPiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworCisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgorICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfY2xpZW50KSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgInRocm93IG5ldyBcXEV4Y2VwdGlvbihcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0XCIpOyIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlX2NsaWVudCk7CisgICAgfQorICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlX2NsaWVudCA8PCAifSIgPDwgZW5kbDsKKworICAvLyBDbG9zZSBzZXJ2aWNlIGNsaWVudCBmaWxlCisgIGlmICghY2xhc3NtYXBfKSB7CisgICAgZl9zZXJ2aWNlX2NsaWVudC5jbG9zZSgpOworICB9Cit9CisKKy8qKgorICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsYXNzKSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKKworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgIH0KKworICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKworICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7CisgIH0gZWxzZSB7CisKKyAgICBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOworICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisKKyAgICAgIGlmIChiaW5hcnlfaW5saW5lXykgeworICAgICAgICBzdGQ6OnN0cmluZyBpdHJhbnMgPSAoaW5jbGFzcyA/ICIkdGhpcy0+aW5wdXRfIiA6ICIkaW5wdXQiKTsKKworICAgICAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkbGVuID0gdW5wYWNrKCdOJywgIiA8PCBpdHJhbnMgPDwgIi0+cmVhZEFsbCg0KSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRsZW4gPSAkbGVuWzFdOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgKCRsZW4gPiAweDdmZmZmZmZmKSB7IgorICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgJGxlbiA9IDAgLSAoKCRsZW4gLSAxKSBeIDB4ZmZmZmZmZmYpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkIiA8PCBuYW1lIDw8ICIgPSAiIDw8IGl0cmFucyA8PCAiLT5yZWFkQWxsKCRsZW4pOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkIiA8PCBuYW1lIDw8ICIgPSB1bnBhY2soJ2MnLCAiIDw8IGl0cmFucyA8PCAiLT5yZWFkQWxsKDEpKTsiCisgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgbmFtZSA8PCAiID0gKGJvb2wpJCIgPDwgbmFtZSA8PCAiWzFdOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiQiIDw8IG5hbWUgPDwgIiA9IHVucGFjaygnYycsICIgPDwgaXRyYW5zIDw8ICItPnJlYWRBbGwoMSkpOyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkIiA8PCBuYW1lIDw8ICIgPSAkIiA8PCBuYW1lIDw8ICJbMV07IiA8PCBlbmRsOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiR2YWwgPSB1bnBhY2soJ24nLCAiIDw8IGl0cmFucyA8PCAiLT5yZWFkQWxsKDIpKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJHZhbCA9ICR2YWxbMV07IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiAoJHZhbCA+IDB4N2ZmZikgeyIKKyAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgICR2YWwgPSAwIC0gKCgkdmFsIC0gMSkgXiAweGZmZmYpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkIiA8PCBuYW1lIDw8ICIgPSAkdmFsOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkdmFsID0gdW5wYWNrKCdOJywgIiA8PCBpdHJhbnMgPDwgIi0+cmVhZEFsbCg0KSk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiR2YWwgPSAkdmFsWzFdOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgKCR2YWwgPiAweDdmZmZmZmZmKSB7IgorICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgJHZhbCA9IDAgLSAoKCR2YWwgLSAxKSBeIDB4ZmZmZmZmZmYpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgIDw8ICJ9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkIiA8PCBuYW1lIDw8ICIgPSAkdmFsOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkYXJyID0gdW5wYWNrKCdOMicsICIgPDwgaXRyYW5zIDw8ICItPnJlYWRBbGwoOCkpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoJGFyclsxXSAmIDB4ODAwMDAwMDApIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICA8PCAiICAkYXJyWzFdID0gJGFyclsxXSBeIDB4RkZGRkZGRkY7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgPDwgIiAgJGFyclsyXSA9ICRhcnJbMl0gXiAweEZGRkZGRkZGOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICAkIiA8PCBuYW1lCisgICAgICAgICAgICAgICAgPDwgIiA9IDAgLSAkYXJyWzFdKjQyOTQ5NjcyOTYgLSAkYXJyWzJdIC0gMTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IgorICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgJCIgPDwgbmFtZSA8PCAiID0gJGFyclsxXSo0Mjk0OTY3Mjk2ICsgJGFyclsyXTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkYXJyID0gdW5wYWNrKCdkJywgc3RycmV2KCIgPDwgaXRyYW5zIDw8ICItPnJlYWRBbGwoOCkpKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgbmFtZSA8PCAiID0gJGFyclsxXTsiIDw8IGVuZGw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBQSFAgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpCisgICAgICAgICAgICAgICAgKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJHZhbCA9IHVucGFjaygnTicsICIgPDwgaXRyYW5zIDw8ICItPnJlYWRBbGwoNCkpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICA8PCAiJHZhbCA9ICR2YWxbMV07IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiAoJHZhbCA+IDB4N2ZmZmZmZmYpIHsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgJHZhbCA9IDAgLSAoKCR2YWwgLSAxKSBeIDB4ZmZmZmZmZmYpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIKKyAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgbmFtZSA8PCAiID0gJHZhbDsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+IjsKKworICAgICAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nKCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICAgIG91dCA8PCAicmVhZEJvb2woJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgICAgIG91dCA8PCAicmVhZEJ5dGUoJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgICAgICBvdXQgPDwgInJlYWRJMTYoJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgICAgICBvdXQgPDwgInJlYWRJMzIoJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgICBvdXQgPDwgInJlYWRJNjQoJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgICAgICBvdXQgPDwgInJlYWREb3VibGUoJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gUEhQIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICAgICAgb3V0IDw8ICJyZWFkSTMyKCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCisgICAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgICAgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgICB9CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHZhcmlhYmxlLiBUaGlzIG1ha2VzIHR3byBrZXkgYXNzdW1wdGlvbnMsCisgKiBmaXJzdCB0aGF0IHRoZXJlIGlzIGEgY29uc3QgY2hhciogdmFyaWFibGUgbmFtZWQgZGF0YSB0aGF0IHBvaW50cyB0byB0aGUKKyAqIGJ1ZmZlciBmb3IgZGVzZXJpYWxpemF0aW9uLCBhbmQgdGhhdCB0aGVyZSBpcyBhIHZhcmlhYmxlIHByb3RvY29sIHdoaWNoCisgKiBpcyBhIHJlZmVyZW5jZSB0byBhIFRQcm90b2NvbCBzZXJpYWxpemF0aW9uIG9iamVjdC4KKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCBwaHBfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpCisgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiR4ZmVyICs9ICQiIDw8IHByZWZpeAorICAgICAgPDwgIi0+cmVhZCgkaW5wdXQpOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIHNpemUgPSB0bXAoIl9zaXplIik7CisgIHN0cmluZyBrdHlwZSA9IHRtcCgiX2t0eXBlIik7CisgIHN0cmluZyB2dHlwZSA9IHRtcCgiX3Z0eXBlIik7CisgIHN0cmluZyBldHlwZSA9IHRtcCgiX2V0eXBlIik7CisKKyAgdF9maWVsZCBmc2l6ZShnX3R5cGVfaTMyLCBzaXplKTsKKyAgdF9maWVsZCBma3R5cGUoZ190eXBlX2k4LCBrdHlwZSk7CisgIHRfZmllbGQgZnZ0eXBlKGdfdHlwZV9pOCwgdnR5cGUpOworICB0X2ZpZWxkIGZldHlwZShnX3R5cGVfaTgsIGV0eXBlKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgIiQiIDw8IHByZWZpeCA8PCAiID0gYXJyYXkoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiQiIDw8IHNpemUgPDwgIiA9IDA7IgorICAgICAgPDwgZW5kbDsKKworICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwga3R5cGUgPDwgIiA9IDA7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkIiA8PCB2dHlwZSA8PCAiID0gMDsiCisgICAgICAgIDw8IGVuZGw7CisgICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7CisgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma3R5cGUpOworICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZ0eXBlKTsKKyAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZzaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRNYXBCZWdpbigiCisgICAgICAgICAgPDwgIiQiIDw8IGt0eXBlIDw8ICIsICQiIDw8IHZ0eXBlIDw8ICIsICQiIDw8IHNpemUgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKKyAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZldHlwZSk7CisgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmc2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgZXR5cGUgPDwgIiA9IDA7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZFNldEJlZ2luKCIKKyAgICAgICAgICA8PCAiJCIgPDwgZXR5cGUgPDwgIiwgJCIgPDwgc2l6ZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgfQorICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKKyAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZldHlwZSk7CisgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmc2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgZXR5cGUgPDwgIiA9IDA7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZExpc3RCZWdpbigiCisgICAgICAgICAgPDwgIiQiIDw8IGV0eXBlIDw8ICIsICQiIDw8IHNpemUgPDwgIik7IiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKKyAgc3RyaW5nIGkgPSB0bXAoIl9pIik7CisgIGluZGVudChvdXQpIDw8ICJmb3IgKCQiIDw8IGkgPDwgIiA9IDA7ICQiIDw8IGkgPDwgIiA8ICQiIDw8IHNpemUgPDwgIjsgKyskIiA8PCBpIDw8ICIpIHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgcHJlZml4KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgpOworICB9CisKKyAgc2NvcGVfZG93bihvdXQpOworCisgIGlmICghYmluYXJ5X2lubGluZV8pIHsKKyAgICAvLyBSZWFkIGNvbnRhaW5lciBlbmQKKyAgICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkTWFwRW5kKCk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkU2V0RW5kKCk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZExpc3RFbmQoKTsiIDw8IGVuZGw7CisgICAgfQorICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGtleSA9IHRtcCgia2V5Iik7CisgIHN0cmluZyB2YWwgPSB0bXAoInZhbCIpOworICB0X2ZpZWxkIGZrZXkodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7CisgIHRfZmllbGQgZnZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKKworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZma2V5LCB0cnVlLCB0cnVlKSA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmdmFsLCB0cnVlLCB0cnVlKSA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXkpOworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsKTsKKworICBpbmRlbnQob3V0KSA8PCAiJCIgPDwgcHJlZml4IDw8ICJbJCIgPDwga2V5IDw8ICJdID0gJCIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOworfQorCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgZWxlbSA9IHRtcCgiZWxlbSIpOworICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgIiQiIDw8IGVsZW0gPDwgIiA9IG51bGw7IiA8PCBlbmRsOworCisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKKworICB0X3R5cGUqIGVsZW1fdHlwZSA9IHRzZXQtPmdldF9lbGVtX3R5cGUoKTsKKyAgaWYocGhwX2lzX3NjYWxhcihlbGVtX3R5cGUpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIiQiIDw8IHByZWZpeCA8PCAiWyQiIDw8IGVsZW0gPDwgIl0gPSB0cnVlOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiJCIgPDwgcHJlZml4IDw8ICJbXSA9ICQiIDw8IGVsZW0gPDwgIjsiIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoImVsZW0iKTsKKyAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKworICBpbmRlbnQob3V0KSA8PCAiJCIgPDwgZWxlbSA8PCAiID0gbnVsbDsiIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOworCisgIGluZGVudChvdXQpIDw8ICIkIiA8PCBwcmVmaXggPDwgIiBbXT0gJCIgPDwgZWxlbSA8PCAiOyIgPDwgZW5kbDsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCisgKgorICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCisgKiBAcGFyYW0gcHJlZml4IE5hbWUgdG8gcHJlcGVuZCB0byBmaWVsZCBuYW1lCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworCisgIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgfQorCisgIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgeworCisgICAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisKKyAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKKyAgICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ04nLCBzdHJsZW4oJCIgPDwgbmFtZSA8PCAiKSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgIDw8ICIkb3V0cHV0IC49ICQiIDw8IG5hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gcGFjaygnYycsICQiIDw8IG5hbWUgPDwgIiA/IDEgOiAwKTsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ2MnLCAkIiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ24nLCAkIiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ04nLCAkIiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ04yJywgJCIgPDwgbmFtZSA8PCAiID4+IDMyLCAkIiA8PCBuYW1lCisgICAgICAgICAgICAgIDw8ICIgJiAweEZGRkZGRkZGKTsiIDw8IGVuZGw7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBzdHJyZXYocGFjaygnZCcsICQiIDw8IG5hbWUgPDwgIikpOyIgPDwgZW5kbDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFBIUCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCdOJywgJCIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfSBlbHNlIHsKKworICAgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRvdXRwdXQtPiI7CisKKyAgICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZygkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgICAgb3V0IDw8ICJ3cml0ZUJ5dGUoJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgICBvdXQgPDwgIndyaXRlSTE2KCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigkIiA8PCBuYW1lIDw8ICIpOyI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgIG91dCA8PCAid3JpdGVJNjQoJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICBvdXQgPDwgIndyaXRlRG91YmxlKCQiIDw8IG5hbWUgPDwgIik7IjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFBIUCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgICAgIG91dCA8PCAid3JpdGVJMzIoJCIgPDwgbmFtZSA8PCAiKTsiOworICAgICAgfQorICAgICAgb3V0IDw8IGVuZGw7CisgICAgfQorICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSBGSUVMRCAnJXMlcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICBwcmVmaXguY19zdHIoKSwKKyAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgIHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7CisgIH0KK30KKworLyoqCisgKiBTZXJpYWxpemVzIGFsbCB0aGUgbWVtYmVycyBvZiBhIHN0cnVjdC4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IHRvIHNlcmlhbGl6ZQorICogQHBhcmFtIHByZWZpeCAgU3RyaW5nIHByZWZpeCB0byBhdHRhY2ggdG8gYWxsIGZpZWxkcworICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7CisgICh2b2lkKXRzdHJ1Y3Q7CisgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkIiA8PCBwcmVmaXggPDwgIi0+d3JpdGUoJG91dHB1dCk7IiA8PCBlbmRsOworfQorCisvKioKKyAqIFdyaXRlcyBvdXQgYSBjb250YWluZXIKKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7CisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCdjJywgIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkKKyAgICAgICAgICA8PCAiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gcGFjaygnYycsICIKKyAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIik7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIiRvdXRwdXQgLj0gc3RycmV2KHBhY2soJ2wnLCBjb3VudCgkIiA8PCBwcmVmaXggPDwgIikpKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICIkb3V0cHV0LT53cml0ZU1hcEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpCisgICAgICAgICAgICAgICAgICA8PCAiLCAiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgICA8PCAiY291bnQoJCIgPDwgcHJlZml4IDw8ICIpKTsiIDw8IGVuZGw7CisgICAgfQorICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGlmIChiaW5hcnlfaW5saW5lXykgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ2MnLCAiIDw8IHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkKKyAgICAgICAgICA8PCAiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gc3RycmV2KHBhY2soJ2wnLCBjb3VudCgkIiA8PCBwcmVmaXggPDwgIikpKTsiCisgICAgICAgICAgPDwgZW5kbDsKKworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiJG91dHB1dC0+d3JpdGVTZXRCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkKKyAgICAgICAgICAgICAgICAgIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgIDw8ICJjb3VudCgkIiA8PCBwcmVmaXggPDwgIikpOyIgPDwgZW5kbDsKKyAgICB9CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGlmIChiaW5hcnlfaW5saW5lXykgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ2MnLCAiIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpCisgICAgICAgICAgPDwgIik7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHN0cnJldihwYWNrKCdsJywgY291bnQoJCIgPDwgcHJlZml4IDw8ICIpKSk7IgorICAgICAgICAgIDw8IGVuZGw7CisKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgIiRvdXRwdXQtPndyaXRlTGlzdEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkKKyAgICAgICAgICAgICAgICAgIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgIDw8ICJjb3VudCgkIiA8PCBwcmVmaXggPDwgIikpOyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgc3RyaW5nIGtpdGVyID0gdG1wKCJraXRlciIpOworICAgIHN0cmluZyB2aXRlciA9IHRtcCgidml0ZXIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yZWFjaCAoJCIgPDwgcHJlZml4IDw8ICIgYXMgIgorICAgICAgICAgICAgICAgIDw8ICIkIiA8PCBraXRlciA8PCAiID0+ICQiIDw8IHZpdGVyIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwga2l0ZXIsIHZpdGVyKTsKKyAgICBzY29wZV9kb3duKG91dCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgc3RyaW5nIGl0ZXIgPSB0bXAoIml0ZXIiKTsKKyAgICBzdHJpbmcgaXRlcl92YWwgPSB0bXAoIml0ZXIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yZWFjaCAoJCIgPDwgcHJlZml4IDw8ICIgYXMgJCIgPDwgaXRlciA8PCAiID0+ICQiIDw8IGl0ZXJfdmFsIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIGlmKHBocF9pc19zY2FsYXIoZWxlbV90eXBlKSkgeworICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgaXRlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXJfdmFsKTsKKyAgICB9CisgICAgc2NvcGVfZG93bihvdXQpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBzdHJpbmcgaXRlciA9IHRtcCgiaXRlciIpOworICAgIGluZGVudChvdXQpIDw8ICJmb3JlYWNoICgkIiA8PCBwcmVmaXggPDwgIiBhcyAkIiA8PCBpdGVyIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyKTsKKyAgICBzY29wZV9kb3duKG91dCk7CisgIH0KKworICBpZiAoIWJpbmFyeV9pbmxpbmVfKSB7CisgICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIiRvdXRwdXQtPndyaXRlTWFwRW5kKCk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiJG91dHB1dC0+d3JpdGVTZXRFbmQoKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiJG91dHB1dC0+d3JpdGVMaXN0RW5kKCk7IiA8PCBlbmRsOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBtYXAuCisgKgorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBraXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHZpdGVyKSB7CisgIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBraXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsICIiKTsKKworICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdml0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCAiIik7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgaXRlcikgeworICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCisgKi8KK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIGl0ZXIpIHsKKyAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CisgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKK30KKworLyoqCisgKiBFbWl0cyBhIFBIUERvYyBjb21tZW50IGZvciB0aGUgZ2l2ZW4gY29udGVudHMKKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9kb2NzdHJpbmdfY29tbWVudChvc3RyZWFtJiBvdXQsIHN0cmluZyBjb250ZW50cykgeworICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsICIvKipcbiIsICIgKiAiLCBjb250ZW50cywgIiAqL1xuIik7Cit9CisKKy8qKgorICogRW1pdHMgYSBQSFBEb2MgY29tbWVudCBpZiB0aGUgcHJvdmlkZWQgb2JqZWN0IGhhcyBhIGRvYyBpbiBUaHJpZnQKKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9kb2Mob3N0cmVhbSYgb3V0LCB0X2RvYyogdGRvYykgeworICBpZiAodGRvYy0+aGFzX2RvYygpKSB7CisgICAgZ2VuZXJhdGVfcGhwX2RvY3N0cmluZ19jb21tZW50KG91dCwgdGRvYy0+Z2V0X2RvYygpKTsKKyAgfQorfQorCisvKioKKyAqIEVtaXRzIGEgUEhQRG9jIGNvbW1lbnQgZm9yIGEgZmllbGQKKyAqLwordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9kb2Mob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCkgeworICBzdHJpbmdzdHJlYW0gc3M7CisKKyAgLy8gcHJlcGVuZCBmcmVlLXN0eWxlIGRvYyBpZiBhdmFpbGFibGUKKyAgaWYgKGZpZWxkLT5oYXNfZG9jKCkpIHsKKyAgICBzcyA8PCBmaWVsZC0+Z2V0X2RvYygpIDw8IGVuZGw7CisgIH0KKworICAvLyBhcHBlbmQgQHZhciB0YWcKKyAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSk7CisgIHNzIDw8ICJAdmFyICIgPDwgdHlwZV90b19waHBkb2ModHlwZSkgPDwgZW5kbDsKKworICBnZW5lcmF0ZV9waHBfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCBzcy5zdHIoKSk7Cit9CisKKy8qKgorICogRW1pdHMgYSBQSFBEb2MgY29tbWVudCBmb3IgYSBmdW5jdGlvbgorICovCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX2RvYyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIGZ1bmN0aW9uKSB7CisgIHN0cmluZ3N0cmVhbSBzczsKKyAgaWYgKGZ1bmN0aW9uLT5oYXNfZG9jKCkpIHsKKyAgICBzcyA8PCBmdW5jdGlvbi0+Z2V0X2RvYygpIDw8IGVuZGw7CisgIH0KKworICAvLyBnZW5lcmF0ZSBwYXJhbWV0ZXIgdHlwZXMgZG9jCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGFyZ3MgPSBmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgYV9pdGVyOworICBmb3IgKGFfaXRlciA9IGFyZ3MuYmVnaW4oKTsgYV9pdGVyICE9IGFyZ3MuZW5kKCk7ICsrYV9pdGVyKSB7CisgICAgdF9maWVsZCogYXJnID0gKmFfaXRlcjsKKyAgICBzcyA8PCAiQHBhcmFtICIgPDwgdHlwZV90b19waHBkb2MoYXJnLT5nZXRfdHlwZSgpKSA8PCAiICQiIDw8IGFyZy0+Z2V0X25hbWUoKTsKKyAgICBpZiAoYXJnLT5oYXNfZG9jKCkpIHsKKyAgICAgIHNzIDw8ICIgIiA8PCBhcmctPmdldF9kb2MoKTsKKyAgICB9CisgICAgc3MgPDwgZW5kbDsKKyAgfQorCisgIC8vIGdlbmVyYXRlIHJldHVybiB0eXBlIGRvYworICB0X3R5cGUqIHJldF90eXBlID0gZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7CisgIGlmICghcmV0X3R5cGUtPmlzX3ZvaWQoKSB8fCByZXRfdHlwZS0+aGFzX2RvYygpKSB7CisgICAgc3MgPDwgIkByZXR1cm4gIiA8PCB0eXBlX3RvX3BocGRvYyhyZXRfdHlwZSk7CisgICAgaWYgKHJldF90eXBlLT5oYXNfZG9jKCkpIHsKKyAgICAgIHNzIDw8ICIgIiA8PCByZXRfdHlwZS0+Z2V0X2RvYygpOworICAgIH0KKyAgICBzcyA8PCBlbmRsOworICB9CisKKyAgLy8gZ2VuZXJhdGUgZXhjZXB0aW9ucyBkb2MKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZXhjcyA9IGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGVfaXRlcjsKKyAgZm9yIChlX2l0ZXIgPSBleGNzLmJlZ2luKCk7IGVfaXRlciAhPSBleGNzLmVuZCgpOyArK2VfaXRlcikgeworICAgIHRfZmllbGQqIGV4YyA9ICplX2l0ZXI7CisgICAgc3MgPDwgIkB0aHJvd3MgIiA8PCB0eXBlX3RvX3BocGRvYyhleGMtPmdldF90eXBlKCkpOworICAgIGlmIChleGMtPmhhc19kb2MoKSkgeworICAgICAgc3MgPDwgIiAiIDw8IGV4Yy0+Z2V0X2RvYygpOworICAgIH0KKyAgICBzcyA8PCBlbmRsOworICB9CisKKyAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiLyoqXG4iLCAiICogIiwgc3Muc3RyKCksICIgKi9cbiIpOworfQorCisvKioKKyAqIERlY2xhcmVzIGEgZmllbGQsIHdoaWNoIG1heSBpbmNsdWRlIGluaXRpYWxpemF0aW9uIGFzIG5lY2Vzc2FyeS4KKyAqCisgKiBAcGFyYW0gdHR5cGUgVGhlIHR5cGUKKyAqLworc3RyaW5nIHRfcGhwX2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCwgYm9vbCBvYmopIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIkIiArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgaWYgKGluaXQpIHsKKyAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgIHJlc3VsdCArPSAiID0gJyciOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSBmYWxzZSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgcmVzdWx0ICs9ICIgPSAwLjAiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gUEhQIGluaXRpYWxpemVyIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIHJlc3VsdCArPSAiID0gMCI7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgICAgcmVzdWx0ICs9ICIgPSBhcnJheSgpIjsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgIGlmIChvYmopIHsKKyAgICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHBocF9uYW1lc3BhY2UodHlwZS0+Z2V0X3Byb2dyYW0oKSkgKyB0eXBlLT5nZXRfbmFtZSgpICsgIigpIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCArPSAiID0gbnVsbCI7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiByZXN1bHQgKyAiOyI7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJworICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCitzdHJpbmcgdF9waHBfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4KSB7CisgIHJldHVybiBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiKCIgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkgKyAiKSI7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZpZWxkIGxpc3QKKyAqLworc3RyaW5nIHRfcGhwX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBhZGRUeXBlSGludHMpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICB9CisKKyAgICB0X3R5cGUqIHR5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisKKyAgICAvLyBTZXQgdHlwZSBuYW1lCisgICAgaWYgKGFkZFR5cGVIaW50cykgeworICAgICAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpKSB7CisgICAgICAgIHN0cmluZyBjbGFzc05hbWUgPSBwaHBfbmFtZXNwYWNlKHR5cGUtPmdldF9wcm9ncmFtKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICArIHBocF9uYW1lc3BhY2VfZGlyZWN0b3J5KCJEZWZpbml0aW9uIiwgZmFsc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNsYXNzaWZ5KHR5cGUtPmdldF9uYW1lKCkpOworCisgICAgICAgIHJlc3VsdCArPSBjbGFzc05hbWUgKyAiICI7CisgICAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICAgIHJlc3VsdCArPSAiYXJyYXkgIjsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXN1bHQgKz0gIiQiICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogR2V0cyBhIHR5cGVjYXN0IHN0cmluZyBmb3IgYSBwYXJ0aWN1bGFyIHR5cGUuCisgKi8KK3N0cmluZyB0X3BocF9nZW5lcmF0b3I6OnR5cGVfdG9fY2FzdCh0X3R5cGUqIHR5cGUpIHsKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGUqIGJ0eXBlID0gKHRfYmFzZV90eXBlKil0eXBlOworICAgIHN3aXRjaCAoYnR5cGUtPmdldF9iYXNlKCkpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIihib29sKSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiKGludCkiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICIoZG91YmxlKSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIihzdHJpbmcpIjsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuICIiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIihpbnQpIjsKKyAgfQorICByZXR1cm4gIiI7Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBDKysgZW51bSBzdHJpbmcgZm9yIHRoZSBnaXZlbiB0eXBlLgorICovCitzdHJpbmcgdF9waHBfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJUVHlwZTo6U1RSSU5HIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIlRUeXBlOjpCT09MIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJUVHlwZTo6QllURSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIlRUeXBlOjpJMTYiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJUVHlwZTo6STMyIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiVFR5cGU6Okk2NCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIlRUeXBlOjpET1VCTEUiOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlOjpJMzIiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlOjpTVFJVQ1QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJUVHlwZTo6TUFQIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiVFR5cGU6OlNFVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJUVHlwZTo6TFNUIjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworLyoqCisgKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIFBIUERvYyBzdHJpbmcgZm9yIHRoZSBnaXZlbiB0eXBlLgorICovCitzdHJpbmcgdF9waHBfZ2VuZXJhdG9yOjp0eXBlX3RvX3BocGRvYyh0X3R5cGUqIHR5cGUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICByZXR1cm4gInZvaWQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJzdHJpbmciOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiYm9vbCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiaW50IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiaW50IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiaW50IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiaW50IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiZG91YmxlIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJpbnQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gcGhwX25hbWVzcGFjZSh0eXBlLT5nZXRfcHJvZ3JhbSgpKSArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gImFycmF5IjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgIHRfc2V0KiB0c2V0ID0gc3RhdGljX2Nhc3Q8dF9zZXQqPih0eXBlKTsKKyAgICB0X3R5cGUqIHRfZWxlbSA9IHRzZXQtPmdldF9lbGVtX3R5cGUoKTsKKyAgICBpZiAodF9lbGVtLT5pc19jb250YWluZXIoKSkgeworICAgICAgcmV0dXJuICIoIiArIHR5cGVfdG9fcGhwZG9jKHRfZWxlbSkgKyAiKVtdIjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHR5cGVfdG9fcGhwZG9jKHRfZWxlbSkgKyAiW10iOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICB0X2xpc3QqIHRsaXN0ID0gc3RhdGljX2Nhc3Q8dF9saXN0Kj4odHlwZSk7CisgICAgdF90eXBlKiB0X2VsZW0gPSB0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpOworICAgIGlmICh0X2VsZW0tPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICByZXR1cm4gIigiICsgdHlwZV90b19waHBkb2ModF9lbGVtKSArICIpW10iOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gdHlwZV90b19waHBkb2ModF9lbGVtKSArICJbXSI7CisgICAgfQorICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAorICAgIHBocCwKKyAgICAiUEhQIiwKKyAgICAiICAgIGlubGluZWQ6ICAgICAgICAgR2VuZXJhdGUgUEhQIGlubGluZWQgZmlsZXNcbiIKKyAgICAiICAgIHNlcnZlcjogICAgICAgICAgR2VuZXJhdGUgUEhQIHNlcnZlciBzdHVic1xuIgorICAgICIgICAgb29wOiAgICAgICAgICAgICBHZW5lcmF0ZSBQSFAgd2l0aCBvYmplY3Qgb3JpZW50ZWQgc3ViY2xhc3Nlc1xuIgorICAgICIgICAgY2xhc3NtYXA6ICAgICAgICBHZW5lcmF0ZSBvbGQtc3R5bGUgUEhQIGZpbGVzICh1c2UgY2xhc3NtYXAgYXV0b2xvYWRpbmcpXG4iCisgICAgIiAgICByZXN0OiAgICAgICAgICAgIEdlbmVyYXRlIFBIUCBSRVNUIHByb2Nlc3NvcnNcbiIKKyAgICAiICAgIG5zZ2xvYmFsPU5BTUU6ICAgU2V0IGdsb2JhbCBuYW1lc3BhY2VcbiIKKyAgICAiICAgIHZhbGlkYXRlOiAgICAgICAgR2VuZXJhdGUgUEhQIHZhbGlkYXRvciBtZXRob2RzXG4iCisgICAgIiAgICBqc29uOiAgICAgICAgICAgIEdlbmVyYXRlIEpzb25TZXJpYWxpemFibGUgY2xhc3NlcyAocmVxdWlyZXMgUEhQID49IDUuNClcbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3B5X2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfcHlfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NjIwN2EKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3B5X2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDI3NjcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L3ZlcnNpb24uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworLyoqCisgKiBQeXRob24gY29kZSBnZW5lcmF0b3IuCisgKgorICovCitjbGFzcyB0X3B5X2dlbmVyYXRvciA6IHB1YmxpYyB0X2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfcHlfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQorICAgIDogdF9nZW5lcmF0b3IgKHByb2dyYW0pIHsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgZ2VuX25ld3N0eWxlXyA9IHRydWU7CisgICAgZ2VuX3V0ZjhzdHJpbmdzXyA9IHRydWU7CisgICAgZ2VuX2R5bmJhc2VfID0gZmFsc2U7CisgICAgZ2VuX3Nsb3RzXyA9IGZhbHNlOworICAgIGdlbl90b3JuYWRvXyA9IGZhbHNlOworICAgIGdlbl96b3BlX2ludGVyZmFjZV8gPSBmYWxzZTsKKyAgICBnZW5fdHdpc3RlZF8gPSBmYWxzZTsKKyAgICBnZW5fZHluYW1pY18gPSBmYWxzZTsKKyAgICBjb2RpbmdfID0gIiI7CisgICAgZ2VuX2R5bmJhc2VjbGFzc18gPSAiIjsKKyAgICBnZW5fZHluYmFzZWNsYXNzX2V4Y18gPSAiIjsKKyAgICBnZW5fZHluYmFzZWNsYXNzX2Zyb3plbl8gPSAiIjsKKyAgICBpbXBvcnRfZHluYmFzZV8gPSAiIjsKKyAgICBwYWNrYWdlX3ByZWZpeF8gPSAiIjsKKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJuZXdfc3R5bGUiKSA9PSAwKSB7CisgICAgICAgIHB3YXJuaW5nKDAsICJuZXdfc3R5bGUgaXMgZW5hYmxlZCBieSBkZWZhdWx0LCBzbyB0aGUgb3B0aW9uIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmVhciBmdXR1cmUuXG4iKTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgib2xkX3N0eWxlIikgPT0gMCkgeworICAgICAgICBnZW5fbmV3c3R5bGVfID0gZmFsc2U7CisgICAgICAgIHB3YXJuaW5nKDAsICJvbGRfc3R5bGUgaXMgZGVwcmVjYXRlZCBhbmQgbWF5IGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS5cbiIpOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJ1dGY4c3RyaW5ncyIpID09IDApIHsKKyAgICAgICAgcHdhcm5pbmcoMCwgInV0ZjhzdHJpbmdzIGlzIGVuYWJsZWQgYnkgZGVmYXVsdCwgc28gdGhlIG9wdGlvbiB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5lYXIgZnV0dXJlLlxuIik7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoIm5vX3V0ZjhzdHJpbmdzIikgPT0gMCkgeworICAgICAgICBnZW5fdXRmOHN0cmluZ3NfID0gZmFsc2U7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInNsb3RzIikgPT0gMCkgeworICAgICAgICBnZW5fc2xvdHNfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgicGFja2FnZV9wcmVmaXgiKSA9PSAwKSB7CisgICAgICAgIHBhY2thZ2VfcHJlZml4XyA9IGl0ZXItPnNlY29uZDsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiZHluYW1pYyIpID09IDApIHsKKyAgICAgICAgZ2VuX2R5bmFtaWNfID0gdHJ1ZTsKKyAgICAgICAgZ2VuX25ld3N0eWxlXyA9IGZhbHNlOyAvLyBkeW5hbWljIGlzIG5ld3N0eWxlCisgICAgICAgIGlmKCBnZW5fZHluYmFzZWNsYXNzXy5lbXB0eSgpKSB7CisgICAgICAgICAgZ2VuX2R5bmJhc2VjbGFzc18gPSAiVEJhc2UiOworICAgICAgICB9CisgICAgICAgIGlmKCBnZW5fZHluYmFzZWNsYXNzX2Zyb3plbl8uZW1wdHkoKSkgeworICAgICAgICAgIGdlbl9keW5iYXNlY2xhc3NfZnJvemVuXyA9ICJURnJvemVuQmFzZSI7CisgICAgICAgIH0KKyAgICAgICAgaWYoIGdlbl9keW5iYXNlY2xhc3NfZXhjXy5lbXB0eSgpKSB7CisgICAgICAgICAgZ2VuX2R5bmJhc2VjbGFzc19leGNfID0gIlRFeGNlcHRpb25CYXNlIjsKKyAgICAgICAgfQorICAgICAgICBpZiggaW1wb3J0X2R5bmJhc2VfLmVtcHR5KCkpIHsKKyAgICAgICAgICBpbXBvcnRfZHluYmFzZV8gPSAiZnJvbSB0aHJpZnQucHJvdG9jb2wuVEJhc2UgaW1wb3J0IFRCYXNlLCBURnJvemVuQmFzZSwgVEV4Y2VwdGlvbkJhc2UsIFRUcmFuc3BvcnRcbiI7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiZHluYmFzZSIpID09IDApIHsKKyAgICAgICAgZ2VuX2R5bmJhc2VfID0gdHJ1ZTsKKyAgICAgICAgZ2VuX2R5bmJhc2VjbGFzc18gPSAoaXRlci0+c2Vjb25kKTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiZHluZnJvemVuIikgPT0gMCkgeworICAgICAgICBnZW5fZHluYmFzZWNsYXNzX2Zyb3plbl8gPSAoaXRlci0+c2Vjb25kKTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiZHluZXhjIikgPT0gMCkgeworICAgICAgICBnZW5fZHluYmFzZWNsYXNzX2V4Y18gPSAoaXRlci0+c2Vjb25kKTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiZHluaW1wb3J0IikgPT0gMCkgeworICAgICAgICBnZW5fZHluYmFzZV8gPSB0cnVlOworICAgICAgICBpbXBvcnRfZHluYmFzZV8gPSAoaXRlci0+c2Vjb25kKTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiem9wZS5pbnRlcmZhY2UiKSA9PSAwKSB7CisgICAgICAgIGdlbl96b3BlX2ludGVyZmFjZV8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJ0d2lzdGVkIikgPT0gMCkgeworICAgICAgICBnZW5fdHdpc3RlZF8gPSB0cnVlOworICAgICAgICBnZW5fem9wZV9pbnRlcmZhY2VfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgidG9ybmFkbyIpID09IDApIHsKKyAgICAgICAgZ2VuX3Rvcm5hZG9fID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiY29kaW5nIikgPT0gMCkgeworICAgICAgICBjb2RpbmdfID0gaXRlci0+c2Vjb25kOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIHB5OiIgKyBpdGVyLT5maXJzdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZ2VuX3R3aXN0ZWRfICYmIGdlbl90b3JuYWRvXykgeworICAgICAgdGhyb3cgImF0IG1vc3Qgb25lIG9mICd0d2lzdGVkJyBhbmQgJ3Rvcm5hZG8nIGFyZSBhbGxvd2VkIjsKKyAgICB9CisKKyAgICBjb3B5X29wdGlvbnNfID0gb3B0aW9uX3N0cmluZzsKKworICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKKyAgICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLXB5LnR3aXN0ZWQiOworICAgIH0gZWxzZSBpZiAoZ2VuX3Rvcm5hZG9fKSB7CisgICAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1weS50b3JuYWRvIjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tcHkiOworICAgIH0KKyAgfQorCisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgaW5kZW50X3N0cigpIGNvbnN0IHsKKyAgICByZXR1cm4gIiAgICAiOworICB9CisKKyAgLyoqCisgICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKKyAgICovCisKKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9mb3J3YXJkX2RlY2xhcmF0aW9uKHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKworICAvKioKKyAgICogU3RydWN0IGdlbmVyYXRpb24gY29kZQorICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3B5X3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3B5X3RocmlmdF9zcGVjKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3B5X3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSk7CisgIHZvaWQgZ2VuZXJhdGVfcHlfc3RydWN0X3JlYWRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3B5X3N0cnVjdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9weV9zdHJ1Y3RfcmVxdWlyZWRfdmFsaWRhdG9yKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfcHlfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCisgIC8qKgorICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfcmVtb3RlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKworICAvKioKKyAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBraXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdml0ZXIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdGQ6OnN0cmluZyBpdGVyKTsKKworICB2b2lkIGdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICB2b2lkIGdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgdm9pZCBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9kb2MqIHRkb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHN1YmhlYWRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2RvYyogdGRvYyk7CisKKyAgLyoqCisgICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCisgICAqLworCisgIHN0ZDo6c3RyaW5nIHB5X2F1dG9nZW5fY29tbWVudCgpOworICBzdGQ6OnN0cmluZyBweV9pbXBvcnRzKCk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9pbmNsdWRlcygpOworICBzdGQ6OnN0cmluZyBkZWNsYXJlX2FyZ3VtZW50KHRfZmllbGQqIHRmaWVsZCk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9maWVsZF9kZWZhdWx0X3ZhbHVlKHRfZmllbGQqIHRmaWVsZCk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgYm9vbCBpbnRlcmZhY2UgPSBmYWxzZSk7CisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBwcmUgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogcG9zdCA9IE5VTEwpOworICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfdG9fc3BlY19hcmdzKHRfdHlwZSogdHR5cGUpOworCisgIHN0YXRpYyBib29sIGlzX3ZhbGlkX25hbWVzcGFjZShjb25zdCBzdGQ6OnN0cmluZyYgc3ViX25hbWVzcGFjZSkgeworICAgIHJldHVybiBzdWJfbmFtZXNwYWNlID09ICJ0d2lzdGVkIjsKKyAgfQorCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXRfcmVhbF9weV9tb2R1bGUoY29uc3QgdF9wcm9ncmFtKiBwcm9ncmFtLCBib29sIGdlbl90d2lzdGVkLCBzdGQ6OnN0cmluZyBwYWNrYWdlX2Rpcj0iIikgeworICAgIGlmIChnZW5fdHdpc3RlZCkgeworICAgICAgc3RkOjpzdHJpbmcgdHdpc3RlZF9tb2R1bGUgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJweS50d2lzdGVkIik7CisgICAgICBpZiAoIXR3aXN0ZWRfbW9kdWxlLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIHR3aXN0ZWRfbW9kdWxlOworICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIHJlYWxfbW9kdWxlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgicHkiKTsKKyAgICBpZiAocmVhbF9tb2R1bGUuZW1wdHkoKSkgeworICAgICAgcmV0dXJuIHByb2dyYW0tPmdldF9uYW1lKCk7CisgICAgfQorICAgIHJldHVybiBwYWNrYWdlX2RpciArIHJlYWxfbW9kdWxlOworICB9CisKKyAgc3RhdGljIGJvb2wgaXNfaW1tdXRhYmxlKHRfdHlwZSogdHR5cGUpIHsKKyAgICByZXR1cm4gdHR5cGUtPmFubm90YXRpb25zXy5maW5kKCJweXRob24uaW1tdXRhYmxlIikgIT0gdHR5cGUtPmFubm90YXRpb25zXy5lbmQoKTsKKyAgfQorCitwcml2YXRlOgorCisgIC8qKgorICAgKiBUcnVlIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSBuZXctc3R5bGUgY2xhc3Nlcy4KKyAgICovCisgIGJvb2wgZ2VuX25ld3N0eWxlXzsKKworICAvKioKKyAgKiBUcnVlIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSBkeW5hbWljIHN0eWxlIGNsYXNzZXMuCisgICovCisgIGJvb2wgZ2VuX2R5bmFtaWNfOworCisgIGJvb2wgZ2VuX2R5bmJhc2VfOworICBzdGQ6OnN0cmluZyBnZW5fZHluYmFzZWNsYXNzXzsKKyAgc3RkOjpzdHJpbmcgZ2VuX2R5bmJhc2VjbGFzc19mcm96ZW5fOworICBzdGQ6OnN0cmluZyBnZW5fZHluYmFzZWNsYXNzX2V4Y187CisKKyAgc3RkOjpzdHJpbmcgaW1wb3J0X2R5bmJhc2VfOworCisgIGJvb2wgZ2VuX3Nsb3RzXzsKKworICBzdGQ6OnN0cmluZyBjb3B5X29wdGlvbnNfOworCisgIC8qKgorICAgKiBUcnVlIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSBjb2RlIGZvciB1c2Ugd2l0aCB6b3BlLmludGVyZmFjZS4KKyAgICovCisgIGJvb2wgZ2VuX3pvcGVfaW50ZXJmYWNlXzsKKworICAvKioKKyAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgVHdpc3RlZC1mcmllbmRseSBSUEMgc2VydmljZXMuCisgICAqLworICBib29sIGdlbl90d2lzdGVkXzsKKworICAvKioKKyAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgY29kZSBmb3IgdXNlIHdpdGggVG9ybmFkbworICAgKi8KKyAgYm9vbCBnZW5fdG9ybmFkb187CisKKyAgLyoqCisgICAqIFRydWUgaWYgc3RyaW5ncyBzaG91bGQgYmUgZW5jb2RlZCB1c2luZyB1dGYtOC4KKyAgICovCisgIGJvb2wgZ2VuX3V0ZjhzdHJpbmdzXzsKKworICAvKioKKyAgICogc3BlY2lmeSBnZW5lcmF0ZWQgZmlsZSBlbmNvZGluZworICAgKiBlZy4gIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KKyAgICovCisgIHN0cmluZyBjb2RpbmdfOworCisgIHN0cmluZyBwYWNrYWdlX3ByZWZpeF87CisKKyAgLyoqCisgICAqIEZpbGUgc3RyZWFtcworICAgKi8KKworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfdHlwZXNfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfY29uc3RzXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2VfOworCisgIHN0ZDo6c3RyaW5nIHBhY2thZ2VfZGlyXzsKKyAgc3RkOjpzdHJpbmcgbW9kdWxlXzsKKworcHJvdGVjdGVkOgorICB2aXJ0dWFsIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBsYW5nX2tleXdvcmRzKCkgY29uc3QgeworICAgIHN0ZDo6c3RyaW5nIGtleXdvcmRzW10gPSB7ICJGYWxzZSIsICJOb25lIiwgIlRydWUiLCAiYW5kIiwgImFzIiwgImFzc2VydCIsICJicmVhayIsICJjbGFzcyIsCisgICAgICAgICAgImNvbnRpbnVlIiwgImRlZiIsICJkZWwiLCAiZWxpZiIsICJlbHNlIiwgImV4Y2VwdCIsICJleGVjIiwgImZpbmFsbHkiLCAiZm9yIiwgImZyb20iLAorICAgICAgICAgICJnbG9iYWwiLCAiaWYiLCAiaW1wb3J0IiwgImluIiwgImlzIiwgImxhbWJkYSIsICJub25sb2NhbCIsICJub3QiLCAib3IiLCAicGFzcyIsICJwcmludCIsCisgICAgICAgICAgInJhaXNlIiwgInJldHVybiIsICJ0cnkiLCAid2hpbGUiLCAid2l0aCIsICJ5aWVsZCIgfTsKKyAgICByZXR1cm4gc3RkOjpzZXQ8c3RkOjpzdHJpbmc+KGtleXdvcmRzLCBrZXl3b3JkcyArIHNpemVvZihrZXl3b3Jkcykvc2l6ZW9mKGtleXdvcmRzWzBdKSApOworICB9Cit9OworCisvKioKKyAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0CisgKiBzdHJlYW1zLgorICoKKyAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5CisgIHN0cmluZyBtb2R1bGUgPSBnZXRfcmVhbF9weV9tb2R1bGUocHJvZ3JhbV8sIGdlbl90d2lzdGVkXyk7CisgIHBhY2thZ2VfZGlyXyA9IGdldF9vdXRfZGlyKCk7CisgIG1vZHVsZV8gPSBtb2R1bGU7CisgIHdoaWxlICh0cnVlKSB7CisgICAgLy8gVE9ETzogRG8gYmV0dGVyIGVycm9yIGNoZWNraW5nIGhlcmUuCisgICAgTUtESVIocGFja2FnZV9kaXJfLmNfc3RyKCkpOworICAgIHN0ZDo6b2ZzdHJlYW0gaW5pdF9weSgocGFja2FnZV9kaXJfICsgIi9fX2luaXRfXy5weSIpLmNfc3RyKCksIHN0ZDo6aW9zX2Jhc2U6OmFwcCk7CisgICAgaW5pdF9weS5jbG9zZSgpOworICAgIGlmIChtb2R1bGUuZW1wdHkoKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIHN0cmluZzo6c2l6ZV90eXBlIHBvcyA9IG1vZHVsZS5maW5kKCcuJyk7CisgICAgaWYgKHBvcyA9PSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgIHBhY2thZ2VfZGlyXyArPSAiLyI7CisgICAgICBwYWNrYWdlX2Rpcl8gKz0gbW9kdWxlOworICAgICAgbW9kdWxlLmNsZWFyKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHBhY2thZ2VfZGlyXyArPSAiLyI7CisgICAgICBwYWNrYWdlX2Rpcl8gKz0gbW9kdWxlLnN1YnN0cigwLCBwb3MpOworICAgICAgbW9kdWxlLmVyYXNlKDAsIHBvcyArIDEpOworICAgIH0KKyAgfQorCisgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArICJ0dHlwZXMucHkiOworICBmX3R5cGVzXy5vcGVuKGZfdHlwZXNfbmFtZS5jX3N0cigpKTsKKworICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArICJjb25zdGFudHMucHkiOworICBmX2NvbnN0c18ub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOworCisgIHN0cmluZyBmX2luaXRfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvX19pbml0X18ucHkiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfaW5pdDsKKyAgZl9pbml0Lm9wZW4oZl9pbml0X25hbWUuY19zdHIoKSk7CisgIGZfaW5pdCA8PCAiX19hbGxfXyA9IFsndHR5cGVzJywgJ2NvbnN0YW50cyciOworICB2ZWN0b3I8dF9zZXJ2aWNlKj4gc2VydmljZXMgPSBwcm9ncmFtXy0+Z2V0X3NlcnZpY2VzKCk7CisgIHZlY3Rvcjx0X3NlcnZpY2UqPjo6aXRlcmF0b3Igc3ZfaXRlcjsKKyAgZm9yIChzdl9pdGVyID0gc2VydmljZXMuYmVnaW4oKTsgc3ZfaXRlciAhPSBzZXJ2aWNlcy5lbmQoKTsgKytzdl9pdGVyKSB7CisgICAgZl9pbml0IDw8ICIsICciIDw8ICgqc3ZfaXRlciktPmdldF9uYW1lKCkgPDwgIiciOworICB9CisgIGZfaW5pdCA8PCAiXSIgPDwgZW5kbDsKKyAgZl9pbml0LmNsb3NlKCk7CisKKyAgLy8gUHJpbnQgaGVhZGVyCisgIGZfdHlwZXNfIDw8IHB5X2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwKKyAgICAgICAgICAgPDwgcHlfaW1wb3J0cygpIDw8IGVuZGwKKyAgICAgICAgICAgPDwgcmVuZGVyX2luY2x1ZGVzKCkgPDwgZW5kbAorICAgICAgICAgICA8PCAiZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0IiA8PCBlbmRsCisgICAgICAgICAgIDw8IGltcG9ydF9keW5iYXNlXzsKKworICBmX3R5cGVzXyA8PCAiYWxsX3N0cnVjdHMgPSBbXSIgPDwgZW5kbDsKKworICBmX2NvbnN0c18gPDwKKyAgICBweV9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8CisgICAgcHlfaW1wb3J0cygpIDw8IGVuZGwgPDwKKyAgICAiZnJvbSAudHR5cGVzIGltcG9ydCAqIiA8PCBlbmRsOworfQorCisvKioKKyAqIFJlbmRlcnMgYWxsIHRoZSBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgaW5jbHVkaW5nIGFub3RoZXIgVGhyaWZ0IHByb2dyYW0KKyAqLworc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjpyZW5kZXJfaW5jbHVkZXMoKSB7CisgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgeworICAgIHJlc3VsdCArPSAiaW1wb3J0ICIgKyBnZXRfcmVhbF9weV9tb2R1bGUoaW5jbHVkZXNbaV0sIGdlbl90d2lzdGVkXywgcGFja2FnZV9wcmVmaXhfKSArICIudHR5cGVzXG4iOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogQXV0b2dlbidkIGNvbW1lbnQKKyAqLworc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjpweV9hdXRvZ2VuX2NvbW1lbnQoKSB7CisgIHN0cmluZyBjb2Rpbmc7CisgIGlmICghY29kaW5nXy5lbXB0eSgpKSB7CisgICAgICBjb2RpbmcgPSAiIyAtKi0gY29kaW5nOiAiICsgY29kaW5nXyArICIgLSotXG4iOworICB9CisgIHJldHVybiBjb2RpbmcgKyBzdGQ6OnN0cmluZygiI1xuIikgKyAiIyBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoIiArIFRIUklGVF9WRVJTSU9OICsgIilcbiIKKyAgICAgICAgICsgIiNcbiIgKyAiIyBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HXG4iICsgIiNcbiIKKyAgICAgICAgICsgIiMgIG9wdGlvbnMgc3RyaW5nOiAiICsgY29weV9vcHRpb25zXyArICJcbiIgKyAiI1xuIjsKK30KKworLyoqCisgKiBQcmludHMgc3RhbmRhcmQgdGhyaWZ0IGltcG9ydHMKKyAqLworc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjpweV9pbXBvcnRzKCkgeworICBvc3RyaW5nc3RyZWFtIHNzOworICBzcyA8PCAiZnJvbSB0aHJpZnQuVGhyaWZ0IGltcG9ydCBUVHlwZSwgVE1lc3NhZ2VUeXBlLCBURnJvemVuRGljdCwgVEV4Y2VwdGlvbiwgIgorICAgICAgICAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIgorICAgICA8PCBlbmRsCisgICAgIDw8ICJmcm9tIHRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaW1wb3J0IFRQcm90b2NvbEV4Y2VwdGlvbiIKKyAgICAgPDwgZW5kbAorICAgICA8PCAiZnJvbSB0aHJpZnQuVFJlY3Vyc2l2ZSBpbXBvcnQgZml4X3NwZWMiCisgICAgIDw8IGVuZGw7CisKKyAgaWYgKGdlbl91dGY4c3RyaW5nc18pIHsKKyAgICBzcyA8PCBlbmRsIDw8ICJpbXBvcnQgc3lzIjsKKyAgfQorICByZXR1cm4gc3Muc3RyKCk7Cit9CisKKy8qKgorICogQ2xvc2VzIHRoZSB0eXBlIGZpbGVzCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKKworICAvLyBGaXggdGhyaWZ0X3NwZWMgZGVmaW5pdGlvbnMgZm9yIHJlY3Vyc2l2ZSBzdHJ1Y3RzLgorICBmX3R5cGVzXyA8PCAiZml4X3NwZWMoYWxsX3N0cnVjdHMpIiA8PCBlbmRsOworICBmX3R5cGVzXyA8PCAiZGVsIGFsbF9zdHJ1Y3RzIiA8PCBlbmRsOworCisgIC8vIENsb3NlIHR5cGVzIGZpbGUKKyAgZl90eXBlc18uY2xvc2UoKTsKKyAgZl9jb25zdHNfLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBub3QgZG9uZSBpbiBQeXRob24sIHR5cGVzIGFyZSBhbGwgaW1wbGljaXQuCisgKgorICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgICh2b2lkKXR0eXBlZGVmOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuIERvbmUgdXNpbmcgYSBjbGFzcyB0byBzY29wZQorICogdGhlIHZhbHVlcy4KKyAqCisgKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gdG9fc3RyaW5nX21hcHBpbmcsIGZyb21fc3RyaW5nX21hcHBpbmc7CisKKyAgZl90eXBlc18gPDwgZW5kbCA8PCBlbmRsIDw8ICJjbGFzcyAiIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8IChnZW5fbmV3c3R5bGVfID8gIihvYmplY3QpIiA6ICIiKQorICAgICAgICAgICA8PCAoZ2VuX2R5bmFtaWNfID8gIigiICsgZ2VuX2R5bmJhc2VjbGFzc18gKyAiKSIgOiAiIikgPDwgIjoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKGZfdHlwZXNfLCB0ZW51bSk7CisKKyAgdG9fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgIl9WQUxVRVNfVE9fTkFNRVMgPSB7IiA8PCBlbmRsOworICBmcm9tX3N0cmluZ19tYXBwaW5nIDw8IGluZGVudCgpIDw8ICJfTkFNRVNfVE9fVkFMVUVTID0geyIgPDwgZW5kbDsKKworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICBpbmRlbnQoZl90eXBlc18pIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCB2YWx1ZSA8PCBlbmRsOworCisgICAgLy8gRGljdGlvbmFyaWVzIHRvL2Zyb20gc3RyaW5nIG5hbWVzIG9mIGVudW1zCisgICAgdG9fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgaW5kZW50KCkgPDwgdmFsdWUgPDwgIjogXCIiCisgICAgICAgICAgICAgICAgICAgICAgPDwgZXNjYXBlX3N0cmluZygoKmNfaXRlciktPmdldF9uYW1lKCkpIDw8ICJcIiwiIDw8IGVuZGw7CisgICAgZnJvbV9zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCBpbmRlbnQoKSA8PCAnIicgPDwgZXNjYXBlX3N0cmluZygoKmNfaXRlciktPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXCI6ICIgPDwgdmFsdWUgPDwgJywnIDw8IGVuZGw7CisgIH0KKyAgdG9fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGZyb21fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl90eXBlc18gPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgdG9fc3RyaW5nX21hcHBpbmcuc3RyKCkgPDwgZW5kbCA8PCBmcm9tX3N0cmluZ19tYXBwaW5nLnN0cigpOworfQorCisvKioKKyAqIEdlbmVyYXRlIGEgY29uc3RhbnQgdmFsdWUKKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7CisgIHRfdHlwZSogdHlwZSA9IHRjb25zdC0+Z2V0X3R5cGUoKTsKKyAgc3RyaW5nIG5hbWUgPSB0Y29uc3QtPmdldF9uYW1lKCk7CisgIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gdGNvbnN0LT5nZXRfdmFsdWUoKTsKKworICBpbmRlbnQoZl9jb25zdHNfKSA8PCBuYW1lIDw8ICIgPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB2YWx1ZSk7CisgIGZfY29uc3RzXyA8PCBlbmRsOworfQorCisvKioKKyAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZworICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKKyAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCisgKi8KK3N0cmluZyB0X3B5X2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIG91dCA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBvdXQgPDwgKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCA/ICJUcnVlIiA6ICJGYWxzZSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgb3V0IDw8ICJmbG9hdCgiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICIpIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCBlbWl0X2RvdWJsZV9hc19zdHJpbmcodmFsdWUtPmdldF9kb3VibGUoKSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgb3V0IDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKCoqeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7CisgICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOworICAgICAgfQorICAgICAgaW5kZW50KG91dCkgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGdfdHlwZV9zdHJpbmcsIHZfaXRlci0+Zmlyc3QpIDw8ICI6ICIKKyAgICAgICAgICA8PCByZW5kZXJfY29uc3RfdmFsdWUoZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpIDw8ICIsIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJ9KSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgaWYgKGlzX2ltbXV0YWJsZSh0eXBlKSkgeworICAgICAgb3V0IDw8ICJURnJvemVuRGljdCgiOworICAgIH0KKyAgICBvdXQgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgaW5kZW50KG91dCkgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGt0eXBlLCB2X2l0ZXItPmZpcnN0KSA8PCAiOiAiCisgICAgICAgICAgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHZ0eXBlLCB2X2l0ZXItPnNlY29uZCkgPDwgIiwiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iOworICAgIGlmIChpc19pbW11dGFibGUodHlwZSkpIHsKKyAgICAgIG91dCA8PCAiKSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogZXR5cGU7CisgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0KKyAgICBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIGlmIChpc19pbW11dGFibGUodHlwZSkpIHsKKyAgICAgICAgb3V0IDw8ICJmcm96ZW4iOworICAgICAgfQorICAgICAgb3V0IDw8ICJzZXQoIjsKKyAgICB9CisgICAgaWYgKGlzX2ltbXV0YWJsZSh0eXBlKSB8fCB0eXBlLT5pc19zZXQoKSkgeworICAgICAgb3V0IDw8ICIoIiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgIlsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF91cCgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgaW5kZW50KG91dCkgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKSA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpZiAoaXNfaW1tdXRhYmxlKHR5cGUpIHx8IHR5cGUtPmlzX3NldCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiKSI7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJdIjsKKyAgICB9CisgICAgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgICBvdXQgPDwgIikiOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIENPTlNUQU5UIEZPUiBUWVBFOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorCisgIHJldHVybiBvdXQuc3RyKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSAiZm9yd2FyZCBkZWNsYXJhdGlvbnMiIGZvciBweXRob24gc3RydWN0cy4KKyAqIFRoZXNlIGFyZSBhY3R1YWxseSBmdWxsIGNsYXNzIGRlZmluaXRpb25zIHNvIHRoYXQgY2FsbHMgdG8gZ2VuZXJhdGVfc3RydWN0CisgKiBjYW4gYWRkIHRoZSB0aHJpZnRfc3BlYyBmaWVsZC4gIFRoaXMgaXMgbmVlZGVkIHNvIHRoYXQgYWxsIHRocmlmdF9zcGVjCisgKiBkZWZpbml0aW9ucyBhcmUgZ3JvdXBlZCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIHRvIGVuYWJsZSBjby1yZWN1cnNpdmUgc3RydWN0cy4KKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZm9yd2FyZF9kZWNsYXJhdGlvbih0X3N0cnVjdCogdHN0cnVjdCkgeworICAgIGdlbmVyYXRlX3B5X3N0cnVjdCh0c3RydWN0LCB0c3RydWN0LT5pc194Y2VwdGlvbigpKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBweXRob24gc3RydWN0CisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9weV90aHJpZnRfc3BlYyhmX3R5cGVzXywgdHN0cnVjdCwgZmFsc2UpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBleGNlcHRpb24uIEJhc2ljYWxseSB0aGUgc2FtZQorICogYXMgYSBzdHJ1Y3QgYnV0IGV4dGVuZHMgdGhlIEV4Y2VwdGlvbiBjbGFzcy4KKyAqCisgKiBAcGFyYW0gdHhjZXB0aW9uIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX3B5X3RocmlmdF9zcGVjKGZfdHlwZXNfLCB0eGNlcHRpb24sIHRydWUpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHB5dGhvbiBzdHJ1Y3QKKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHlfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9weV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3R5cGVzXywgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKK30KKworCisvKioKKyAqIEdlbmVyYXRlIHRoZSB0aHJpZnRfc3BlYyBmb3IgYSBzdHJ1Y3QKKyAqIEZvciBleGFtcGxlLAorICogICBhbGxfc3RydWN0cy5hcHBlbmQoUmVjdXJzaXZlKQorICogICBSZWN1cnNpdmUudGhyaWZ0X3NwZWMgPSAoCisgKiAgICAgICBOb25lLCAgIyAwCisgKiAgICAgICAoMSwgVFR5cGUuTElTVCwgJ0NoaWxkcmVuJywgKFRUeXBlLlNUUlVDVCwgKFJlY3Vyc2l2ZSwgTm9uZSksIEZhbHNlKSwgTm9uZSwgKSwgICMgMQorICogICApCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3B5X3RocmlmdF9zcGVjKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAvKmlzX2V4Y2VwdGlvbiovKSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHNvcnRlZF9tZW1iZXJzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICAvLyBBZGQgc3RydWN0IGRlZmluaXRpb24gdG8gbGlzdCBzbyB0aHJpZnRfc3BlYyBjYW4gYmUgZml4ZWQgZm9yIHJlY3Vyc2l2ZSBzdHJ1Y3R1cmVzLgorICBpbmRlbnQob3V0KSA8PCAiYWxsX3N0cnVjdHMuYXBwZW5kKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKSIgPDwgZW5kbDsKKworICBpZiAoc29ydGVkX21lbWJlcnMuZW1wdHkoKSB8fCAoc29ydGVkX21lbWJlcnNbMF0tPmdldF9rZXkoKSA+PSAwKSkgeworICAgIGluZGVudChvdXQpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIi50aHJpZnRfc3BlYyA9ICgiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBpbnQgc29ydGVkX2tleXNfcG9zID0gMDsKKyAgICBmb3IgKG1faXRlciA9IHNvcnRlZF9tZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBzb3J0ZWRfbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKworICAgICAgZm9yICg7IHNvcnRlZF9rZXlzX3BvcyAhPSAoKm1faXRlciktPmdldF9rZXkoKTsgc29ydGVkX2tleXNfcG9zKyspIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIk5vbmUsICAjICIgPDwgc29ydGVkX2tleXNfcG9zIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIGluZGVudChvdXQpIDw8ICIoIiA8PCAoKm1faXRlciktPmdldF9rZXkoKSA8PCAiLCAiIDw8IHR5cGVfdG9fZW51bSgoKm1faXRlciktPmdldF90eXBlKCkpCisgICAgICAgICAgICAgICAgICA8PCAiLCAiCisgICAgICAgICAgICAgICAgICA8PCAiJyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInIgorICAgICAgICAgICAgICAgICAgPDwgIiwgIiA8PCB0eXBlX3RvX3NwZWNfYXJncygoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgIDw8IHJlbmRlcl9maWVsZF9kZWZhdWx0X3ZhbHVlKCptX2l0ZXIpIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgIDw8ICIpLCIKKyAgICAgICAgICAgICAgICAgIDw8ICIgICMgIiA8PCBzb3J0ZWRfa2V5c19wb3MgPDwgZW5kbDsKKworICAgICAgc29ydGVkX2tleXNfcG9zKys7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiKSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIudGhyaWZ0X3NwZWMgPSAoKSIgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3B5X3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHNvcnRlZF9tZW1iZXJzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBvdXQgPDwgZW5kbCA8PCBlbmRsIDw8ICJjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBpZiAoZ2VuX2R5bmFtaWNfKSB7CisgICAgICBvdXQgPDwgIigiIDw8IGdlbl9keW5iYXNlY2xhc3NfZXhjXyA8PCAiKSI7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiKFRFeGNlcHRpb24pIjsKKyAgICB9CisgIH0gZWxzZSBpZiAoZ2VuX2R5bmFtaWNfKSB7CisgICAgaWYgKGlzX2ltbXV0YWJsZSh0c3RydWN0KSkgeworICAgICAgb3V0IDw8ICIoIiA8PCBnZW5fZHluYmFzZWNsYXNzX2Zyb3plbl8gPDwgIikiOworICAgIH0gZWxzZSAgeworICAgICAgb3V0IDw8ICIoIiA8PCBnZW5fZHluYmFzZWNsYXNzXyA8PCAiKSI7CisgICAgfQorICB9IGVsc2UgaWYgKGdlbl9uZXdzdHlsZV8pIHsKKyAgICBvdXQgPDwgIihvYmplY3QpIjsKKyAgfQorICBvdXQgPDwgIjoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKG91dCwgdHN0cnVjdCk7CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgLyoKKyAgICAgSGVyZSB3ZSBnZW5lcmF0ZSB0aGUgc3RydWN0dXJlIHNwZWNpZmljYXRpb24gZm9yIHRoZSBmYXN0YmluYXJ5IGNvZGVjLgorICAgICBUaGVzZSBzcGVjaWZpY2F0aW9ucyBoYXZlIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOgorICAgICB0aHJpZnRfc3BlYyAtPiB0dXBsZSBvZiBpdGVtX3NwZWMKKyAgICAgaXRlbV9zcGVjIC0+IE5vbmUgfCAodGFnLCB0eXBlX2VudW0sIG5hbWUsIHNwZWNfYXJncywgZGVmYXVsdCkKKyAgICAgdGFnIC0+IGludGVnZXIKKyAgICAgdHlwZV9lbnVtIC0+IFRUeXBlLkkzMiB8IFRUeXBlLlNUUklORyB8IFRUeXBlLlNUUlVDVCB8IC4uLgorICAgICBuYW1lIC0+IHN0cmluZ19saXRlcmFsCisgICAgIGRlZmF1bHQgLT4gTm9uZSAgIyBIYW5kbGVkIGJ5IF9faW5pdF9fCisgICAgIHNwZWNfYXJncyAtPiBOb25lICAjIEZvciBzaW1wbGUgdHlwZXMKKyAgICAgICAgICAgICAgICB8ICh0eXBlX2VudW0sIHNwZWNfYXJncykgICMgVmFsdWUgdHlwZSBmb3IgbGlzdC9zZXQKKyAgICAgICAgICAgICAgICB8ICh0eXBlX2VudW0sIHNwZWNfYXJncywgdHlwZV9lbnVtLCBzcGVjX2FyZ3MpCisgICAgICAgICAgICAgICAgICAjIEtleSBhbmQgdmFsdWUgZm9yIG1hcAorICAgICAgICAgICAgICAgIHwgKGNsYXNzX25hbWUsIHNwZWNfYXJnc19wdHIpICMgRm9yIHN0cnVjdC9leGNlcHRpb24KKyAgICAgY2xhc3NfbmFtZSAtPiBpZGVudGlmaWVyICAjIEJhc2ljYWxseSBhIHBvaW50ZXIgdG8gdGhlIGNsYXNzCisgICAgIHNwZWNfYXJnc19wdHIgLT4gZXhwcmVzc2lvbiAgIyBqdXN0IGNsYXNzX25hbWUuc3BlY19hcmdzCisKKyAgICAgVE9ETyhkcmVpc3MpOiBDb25zaWRlciBtYWtpbmcgdGhpcyB3b3JrIGZvciBzdHJ1Y3RzIHdpdGggbmVnYXRpdmUgdGFncy4KKyAgKi8KKworICBpZiAoZ2VuX3Nsb3RzXykgeworICAgIGluZGVudChvdXQpIDw8ICJfX3Nsb3RzX18gPSAoIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZvciAobV9pdGVyID0gc29ydGVkX21lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IHNvcnRlZF9tZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgaW5kZW50KG91dCkgPDwgIiciIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJywiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIikiIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIC8vIFRPRE8oZHJlaXNzKTogTG9vayBpbnRvIGdlbmVyYXRpbmcgYW4gZW1wdHkgdHVwbGUgaW5zdGVhZCBvZiBOb25lCisgIC8vIGZvciBzdHJ1Y3R1cmVzIHdpdGggbm8gbWVtYmVycy4KKyAgLy8gVE9ETyhkcmVpc3MpOiBUZXN0IGVuY29kaW5nIG9mIHN0cnVjdHMgd2hlcmUgc29tZSBpbm5lciBzdHJ1Y3RzCisgIC8vIGRvbid0IGhhdmUgdGhyaWZ0X3NwZWMuCisKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgeworICAgIG91dCA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmIF9faW5pdF9fKHNlbGYsIjsKKworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIG91dCA8PCAiICIgPDwgZGVjbGFyZV9hcmd1bWVudCgqbV9pdGVyKSA8PCAiLCI7CisgICAgfQorICAgIG91dCA8PCAiKToiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIC8vIEluaXRpYWxpemUgZmllbGRzCisgICAgICB0X3R5cGUqIHR5cGUgPSAoKm1faXRlciktPmdldF90eXBlKCk7CisgICAgICBpZiAoIXR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICF0eXBlLT5pc19lbnVtKCkgJiYgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGlzICIKKyAgICAgICAgICAgICAgICAgICAgPDwgInNlbGYudGhyaWZ0X3NwZWNbIiA8PCAoKm1faXRlciktPmdldF9rZXkoKSA8PCAiXVs0XToiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgcmVuZGVyX2ZpZWxkX2RlZmF1bHRfdmFsdWUoKm1faXRlcikKKyAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIH0KKworICAgICAgaWYgKGlzX2ltbXV0YWJsZSh0c3RydWN0KSkgeworICAgICAgICBpZiAoZ2VuX25ld3N0eWxlXyB8fCBnZW5fZHluYW1pY18pIHsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAic3VwZXIoIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIsIHNlbGYpLl9fc2V0YXR0cl9fKCciCisgICAgICAgICAgICAgICAgICAgICAgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSIgPDwgZW5kbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAic2VsZi5fX2RpY3RfX1snIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICA8PCAiJ10gPSAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAic2VsZi4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgaWYgKGlzX2ltbXV0YWJsZSh0c3RydWN0KSkgeworICAgIG91dCA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmIF9fc2V0YXR0cl9fKHNlbGYsICphcmdzKToiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJyYWlzZSBUeXBlRXJyb3IoXCJjYW4ndCBtb2RpZnkgaW1tdXRhYmxlIGluc3RhbmNlXCIpIiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJkZWYgX19kZWxhdHRyX18oc2VsZiwgKmFyZ3MpOiIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJhaXNlIFR5cGVFcnJvcihcImNhbid0IG1vZGlmeSBpbW11dGFibGUgaW5zdGFuY2VcIikiIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbDsKKworICAgIC8vIEhhc2ggYWxsIG9mIHRoZSBtZW1iZXJzIGluIG9yZGVyLCBhbmQgYWxzbyBoYXNoIGluIHRoZSBjbGFzcworICAgIC8vIHRvIGF2b2lkIGNvbGxpc2lvbnMgZm9yIHN0dWZmIGxpa2Ugc2luZ2xlLWZpZWxkIHN0cnVjdHVyZXMuCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJkZWYgX19oYXNoX18oc2VsZik6IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAicmV0dXJuIGhhc2goc2VsZi5fX2NsYXNzX18pIF4gaGFzaCgoIjsKKworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIG91dCA8PCAic2VsZi4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiLCAiOworICAgIH0KKworICAgIG91dCA8PCAiKSkiIDw8IGVuZGw7CisgIH0KKworICBpZiAoIWdlbl9keW5hbWljXykgeworICAgIG91dCA8PCBlbmRsOworICAgIGdlbmVyYXRlX3B5X3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKKyAgICBnZW5lcmF0ZV9weV9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7CisgIH0KKworICAvLyBGb3IgZXhjZXB0aW9ucyBvbmx5LCBnZW5lcmF0ZSBhIF9fc3RyX18gbWV0aG9kLiBUaGlzIGlzCisgIC8vIGJlY2F1c2Ugd2hlbiByYWlzZWQgZXhjZXB0aW9ucyBhcmUgcHJpbnRlZCB0byB0aGUgY29uc29sZSwgX19yZXByX18KKyAgLy8gaXNuJ3QgdXNlZC4gU2VlIHB5dGhvbiBidWcgIzU4ODIKKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIG91dCA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmIF9fc3RyX18oc2VsZik6IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAicmV0dXJuIHJlcHIoc2VsZikiIDw8IGVuZGw7CisgIH0KKworICBpZiAoIWdlbl9zbG90c18pIHsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICAvLyBQcmludGluZyB1dGlsaXRpZXMgc28gdGhhdCBvbiB0aGUgY29tbWFuZCBsaW5lIHRocmlmdAorICAgIC8vIHN0cnVjdHMgbG9vayBwcmV0dHkgbGlrZSBkaWN0aW9uYXJpZXMKKyAgICBpbmRlbnQob3V0KSA8PCAiZGVmIF9fcmVwcl9fKHNlbGYpOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIkwgPSBbJyVzPSVyJyAlIChrZXksIHZhbHVlKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzZWxmLl9fZGljdF9fLml0ZW1zKCldIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gJyVzKCVzKScgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sICcsICcuam9pbihMKSkiIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgLy8gRXF1YWxpdHkgYW5kIGluZXF1YWxpdHkgbWV0aG9kcyB0aGF0IGNvbXBhcmUgYnkgdmFsdWUKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXykgYW5kICIKKyAgICAgICAgICAgICAgICAgICAgICAgInNlbGYuX19kaWN0X18gPT0gb3RoZXIuX19kaWN0X18iIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gbm90IChzZWxmID09IG90aGVyKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICB9IGVsc2UgaWYgKCFnZW5fZHluYW1pY18pIHsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICAvLyBubyBiYXNlIGNsYXNzIGF2YWlsYWJsZSB0byBpbXBsZW1lbnQgX19lcV9fIGFuZCBfX3JlcHJfXyBhbmQgX19uZV9fIGZvciB1cworICAgIC8vIHNvIHdlIG11c3QgcHJvdmlkZSBvbmUgdGhhdCB1c2VzIF9fc2xvdHNfXworICAgIGluZGVudChvdXQpIDw8ICJkZWYgX19yZXByX18oc2VsZik6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiTCA9IFsnJXM9JXInICUgKGtleSwgZ2V0YXR0cihzZWxmLCBrZXkpKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAgICBmb3Iga2V5IGluIHNlbGYuX19zbG90c19fXSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICclcyglcyknICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCAnLCAnLmpvaW4oTCkpIiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIC8vIEVxdWFsaXR5IG1ldGhvZCB0aGF0IGNvbXBhcmVzIGVhY2ggYXR0cmlidXRlIGJ5IHZhbHVlIGFuZCB0eXBlLCB3YWxraW5nIF9fc2xvdHNfXworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKToiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJyZXR1cm4gRmFsc2UiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImZvciBhdHRyIGluIHNlbGYuX19zbG90c19fOiIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgIm15X3ZhbCA9IGdldGF0dHIoc2VsZiwgYXR0cikiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJvdGhlcl92YWwgPSBnZXRhdHRyKG90aGVyLCBhdHRyKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgImlmIG15X3ZhbCAhPSBvdGhlcl92YWw6IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJldHVybiBGYWxzZSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIFRydWUiIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJkZWYgX19uZV9fKHNlbGYsIG90aGVyKToiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJyZXR1cm4gbm90IChzZWxmID09IG90aGVyKSIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgcmVhZCBtZXRob2QgZm9yIGEgc3RydWN0CisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3B5X3N0cnVjdF9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgaWYgKGlzX2ltbXV0YWJsZSh0c3RydWN0KSkgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiQGNsYXNzbWV0aG9kIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJkZWYgcmVhZChjbHMsIGlwcm90KToiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgImRlZiByZWFkKHNlbGYsIGlwcm90KToiIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgY2hhciogaWQgPSBpc19pbW11dGFibGUodHN0cnVjdCkgPyAiY2xzIiA6ICJzZWxmIjsKKworICBpbmRlbnQob3V0KSA8PCAiaWYgaXByb3QuX2Zhc3RfZGVjb2RlIGlzIG5vdCBOb25lICIKKyAgICAgICAgICAgICAgICAgImFuZCBpc2luc3RhbmNlKGlwcm90LnRyYW5zLCBUVHJhbnNwb3J0LkNSZWFkYWJsZVRyYW5zcG9ydCkgIgorICAgICAgICAgICAgICAgICAiYW5kICIKKyAgICAgICAgICAgICAgPDwgaWQgPDwgIi50aHJpZnRfc3BlYyBpcyBub3QgTm9uZToiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGlmIChpc19pbW11dGFibGUodHN0cnVjdCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIGlwcm90Ll9mYXN0X2RlY29kZShOb25lLCBpcHJvdCwgW2NscywgY2xzLnRocmlmdF9zcGVjXSkiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgImlwcm90Ll9mYXN0X2RlY29kZShzZWxmLCBpcHJvdCwgW3NlbGYuX19jbGFzc19fLCBzZWxmLnRocmlmdF9zcGVjXSkiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworCisgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkU3RydWN0QmVnaW4oKSIgPDwgZW5kbDsKKyAgCisgIGlmIChpc19pbW11dGFibGUodHN0cnVjdCkpIHsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgdF9maWVsZCogdGZpZWxkID0gKmZfaXRlcjsKKyAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSByZXN1bHQ7CisgICAgICByZXN1bHQgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPSAiOworICAgICAgaWYgKHRmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgICAgICByZXN1bHQgPDwgcmVuZGVyX2ZpZWxkX2RlZmF1bHRfdmFsdWUodGZpZWxkKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCA8PCAiTm9uZSI7CisgICAgICB9CisgICAgICBpbmRlbnQob3V0KSA8PCByZXN1bHQuc3RyKCkgPDwgZW5kbDsKKyAgICAgfQorICB9CisKKyAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCisgIGluZGVudChvdXQpIDw8ICJ3aGlsZSBUcnVlOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gUmVhZCBiZWdpbm5pbmcgZmllbGQgbWFya2VyCisgIGluZGVudChvdXQpIDw8ICIoZm5hbWUsIGZ0eXBlLCBmaWQpID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKSIgPDwgZW5kbDsKKworICAvLyBDaGVjayBmb3IgZmllbGQgU1RPUCBtYXJrZXIgYW5kIGJyZWFrCisgIGluZGVudChvdXQpIDw8ICJpZiBmdHlwZSA9PSBUVHlwZS5TVE9QOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGluZGVudChvdXQpIDw8ICJicmVhayIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICAvLyBTd2l0Y2ggc3RhdGVtZW50IG9uIHRoZSBmaWVsZCB3ZSBhcmUgcmVhZGluZworICBib29sIGZpcnN0ID0gdHJ1ZTsKKworICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICI7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZWxpZiAiOworICAgIH0KKyAgICBvdXQgPDwgImZpZCA9PSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJpZiBmdHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGlmIChpc19pbW11dGFibGUodHN0cnVjdCkpIHsKKyAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInNlbGYuIik7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJlbHNlOiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgImlwcm90LnNraXAoZnR5cGUpIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICAvLyBJbiB0aGUgZGVmYXVsdCBjYXNlIHdlIHNraXAgdGhlIGZpZWxkCisgIG91dCA8PCBpbmRlbnQoKSA8PCAiZWxzZToiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJpcHJvdC5za2lwKGZ0eXBlKSIgPDwgZW5kbDsKKworICAvLyBSZWFkIGZpZWxkIGVuZCBtYXJrZXIKKyAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRGaWVsZEVuZCgpIiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRTdHJ1Y3RFbmQoKSIgPDwgZW5kbDsKKworICBpZiAoaXNfaW1tdXRhYmxlKHRzdHJ1Y3QpKSB7CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiBjbHMoIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIj0iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiKSIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBlbmRsOworfQorCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9weV9zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGluZGVudChvdXQpIDw8ICJkZWYgd3JpdGUoc2VsZiwgb3Byb3QpOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaW5kZW50KG91dCkgPDwgImlmIG9wcm90Ll9mYXN0X2VuY29kZSBpcyBub3QgTm9uZSBhbmQgc2VsZi50aHJpZnRfc3BlYyBpcyBub3QgTm9uZToiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGluZGVudChvdXQpCisgICAgICA8PCAib3Byb3QudHJhbnMud3JpdGUob3Byb3QuX2Zhc3RfZW5jb2RlKHNlbGYsIFtzZWxmLl9fY2xhc3NfXywgc2VsZi50aHJpZnRfc3BlY10pKSIKKyAgICAgIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4iIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlU3RydWN0QmVnaW4oJyIgPDwgbmFtZSA8PCAiJykiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAvLyBXcml0ZSBmaWVsZCBoZWFkZXIKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgc2VsZi4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGlzIG5vdCBOb25lOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEJlZ2luKCIKKyAgICAgICAgICAgICAgICA8PCAiJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpCisgICAgICAgICAgICAgICAgPDwgIiwgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiKSIgPDwgZW5kbDsKKworICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInNlbGYuIik7CisKKyAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEVuZCgpIiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCisgIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVGaWVsZFN0b3AoKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKSIKKyAgICAgIDw8IGVuZGw7CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZ2VuZXJhdGVfcHlfc3RydWN0X3JlcXVpcmVkX3ZhbGlkYXRvcihvdXQsIHRzdHJ1Y3QpOworfQorCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9weV9zdHJ1Y3RfcmVxdWlyZWRfdmFsaWRhdG9yKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgImRlZiB2YWxpZGF0ZShzZWxmKToiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisKKyAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIGZpZWxkID0gKCpmX2l0ZXIpOworICAgICAgaWYgKGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgc2VsZi4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgaXMgTm9uZToiIDw8IGVuZGw7CisgICAgICAgIGluZGVudChvdXQpIDw8IGluZGVudF9zdHIoKSA8PCAicmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKG1lc3NhZ2U9J1JlcXVpcmVkIGZpZWxkICIKKyAgICAgICAgICAgICAgICAgICAgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiBpcyB1bnNldCEnKSIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBzZXJ2aWNlX25hbWVfICsgIi5weSI7CisgIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKKworICBmX3NlcnZpY2VfIDw8IHB5X2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwgcHlfaW1wb3J0cygpIDw8IGVuZGw7CisKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJpbXBvcnQgIgorICAgICAgICAgICAgICAgPDwgZ2V0X3JlYWxfcHlfbW9kdWxlKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfcHJvZ3JhbSgpLCBnZW5fdHdpc3RlZF8sIHBhY2thZ2VfcHJlZml4XykgPDwgIi4iCisgICAgICAgICAgICAgICA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSA8PCBlbmRsOworICB9CisKKyAgZl9zZXJ2aWNlXyA8PCAiaW1wb3J0IGxvZ2dpbmciIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiZnJvbSAudHR5cGVzIGltcG9ydCAqIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgImZyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgVFByb2Nlc3NvciIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICJmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbXBvcnRfZHluYmFzZV87CisgIGlmIChnZW5fem9wZV9pbnRlcmZhY2VfKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiZnJvbSB6b3BlLmludGVyZmFjZSBpbXBvcnQgSW50ZXJmYWNlLCBpbXBsZW1lbnRlciIgPDwgZW5kbDsKKyAgfQorCisgIGlmIChnZW5fdHdpc3RlZF8pIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJmcm9tIHR3aXN0ZWQuaW50ZXJuZXQgaW1wb3J0IGRlZmVyIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHdpc3RlZCIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmIChnZW5fdG9ybmFkb18pIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJmcm9tIHRvcm5hZG8gaW1wb3J0IGdlbiIgPDwgZW5kbDsKKyAgICBmX3NlcnZpY2VfIDw8ICJmcm9tIHRvcm5hZG8gaW1wb3J0IGNvbmN1cnJlbnQiIDw8IGVuZGw7CisgIH0KKworICBmX3NlcnZpY2VfIDw8ICJhbGxfc3RydWN0cyA9IFtdIiA8PCBlbmRsOworCisgIC8vIEdlbmVyYXRlIHRoZSB0aHJlZSBtYWluIHBhcnRzIG9mIHRoZSBzZXJ2aWNlCisgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfcmVtb3RlKHRzZXJ2aWNlKTsKKworICAvLyBDbG9zZSBzZXJ2aWNlIGZpbGUKKyAgZl9zZXJ2aWNlXyA8PCAiZml4X3NwZWMoYWxsX3N0cnVjdHMpIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgImRlbCBhbGxfc3RydWN0cyIgPDwgZW5kbCA8PCBlbmRsOworICBmX3NlcnZpY2VfLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGhlbHBlciBmdW5jdGlvbnMgZm9yIGEgc2VydmljZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8ICIjIEhFTFBFUiBGVU5DVElPTlMgQU5EIFNUUlVDVFVSRVMiIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgZ2VuZXJhdGVfcHlfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgdHMsIGZhbHNlKTsKKyAgICBnZW5lcmF0ZV9weV90aHJpZnRfc3BlYyhmX3NlcnZpY2VfLCB0cywgZmFsc2UpOworICAgIGdlbmVyYXRlX3B5X2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7CisgIH0KK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHlfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOworICAgIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7CisgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7CisgICAgfQorCisgICAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOworICAgIH0KKyAgICBnZW5lcmF0ZV9weV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCAmcmVzdWx0LCBmYWxzZSk7CisgICAgZ2VuZXJhdGVfcHlfdGhyaWZ0X3NwZWMoZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19pZiA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgIGV4dGVuZHNfaWYgPSAiKCIgKyBleHRlbmRzICsgIi5JZmFjZSkiOworICB9IGVsc2UgeworICAgIGlmIChnZW5fem9wZV9pbnRlcmZhY2VfKSB7CisgICAgICBleHRlbmRzX2lmID0gIihJbnRlcmZhY2UpIjsKKyAgICB9IGVsc2UgaWYgKGdlbl9uZXdzdHlsZV8gfHwgZ2VuX2R5bmFtaWNfIHx8IGdlbl90b3JuYWRvXykgeworICAgICAgZXh0ZW5kc19pZiA9ICIob2JqZWN0KSI7CisgICAgfQorICB9CisKKyAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8IGVuZGwgPDwgImNsYXNzIElmYWNlIiA8PCBleHRlbmRzX2lmIDw8ICI6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhmX3NlcnZpY2VfLCB0c2VydmljZSk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgaWYgKGZ1bmN0aW9ucy5lbXB0eSgpKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicGFzcyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZGVmICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsIHRydWUpIDw8ICI6IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKGZfc2VydmljZV8sICgqZl9pdGVyKSk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwYXNzIiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisgIH0KKworICBpbmRlbnRfZG93bigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBpZiAoZ2VuX3pvcGVfaW50ZXJmYWNlXykgeworICAgICAgZXh0ZW5kc19jbGllbnQgPSAiKCIgKyBleHRlbmRzICsgIi5DbGllbnQpIjsKKyAgICB9IGVsc2UgeworICAgICAgZXh0ZW5kc19jbGllbnQgPSBleHRlbmRzICsgIi5DbGllbnQsICI7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChnZW5fem9wZV9pbnRlcmZhY2VfICYmIChnZW5fbmV3c3R5bGVfIHx8IGdlbl9keW5hbWljXykpIHsKKyAgICAgIGV4dGVuZHNfY2xpZW50ID0gIihvYmplY3QpIjsKKyAgICB9CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwgZW5kbDsKKworICBpZiAoZ2VuX3pvcGVfaW50ZXJmYWNlXykgeworICAgIGZfc2VydmljZV8gPDwgIkBpbXBsZW1lbnRlcihJZmFjZSkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICJjbGFzcyBDbGllbnQiIDw8IGV4dGVuZHNfY2xpZW50IDw8ICI6IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfc2VydmljZV8gPDwgImNsYXNzIENsaWVudCgiIDw8IGV4dGVuZHNfY2xpZW50IDw8ICJJZmFjZSk6IiA8PCBlbmRsOworICB9CisgIGluZGVudF91cCgpOworICBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKKworICAvLyBDb25zdHJ1Y3RvciBmdW5jdGlvbgorICBpZiAoZ2VuX3R3aXN0ZWRfKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZGVmIF9faW5pdF9fKHNlbGYsIHRyYW5zcG9ydCwgb3Byb3RfZmFjdG9yeSk6IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKGdlbl90b3JuYWRvXykgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgIDw8ICJkZWYgX19pbml0X18oc2VsZiwgdHJhbnNwb3J0LCBpcHJvdF9mYWN0b3J5LCBvcHJvdF9mYWN0b3J5PU5vbmUpOiIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkZWYgX19pbml0X18oc2VsZiwgaXByb3QsIG9wcm90PU5vbmUpOiIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfdXAoKTsKKyAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgeworICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInNlbGYuX3RyYW5zcG9ydCA9IHRyYW5zcG9ydCIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAic2VsZi5fb3Byb3RfZmFjdG9yeSA9IG9wcm90X2ZhY3RvcnkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInNlbGYuX3NlcWlkID0gMCIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAic2VsZi5fcmVxcyA9IHt9IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAoZ2VuX3Rvcm5hZG9fKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzZWxmLl90cmFuc3BvcnQgPSB0cmFuc3BvcnQiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInNlbGYuX2lwcm90X2ZhY3RvcnkgPSBpcHJvdF9mYWN0b3J5IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJzZWxmLl9vcHJvdF9mYWN0b3J5ID0gKG9wcm90X2ZhY3RvcnkgaWYgb3Byb3RfZmFjdG9yeSBpcyBub3QgTm9uZSIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlwcm90X2ZhY3RvcnkpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJzZWxmLl9zZXFpZCA9IDAiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInNlbGYuX3JlcXMgPSB7fSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAic2VsZi5fdHJhbnNwb3J0LmlvX2xvb3Auc3Bhd25fY2FsbGJhY2soc2VsZi5fc3RhcnRfcmVjZWl2aW5nKSIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAic2VsZi5faXByb3QgPSBzZWxmLl9vcHJvdCA9IGlwcm90IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiBvcHJvdCBpcyBub3QgTm9uZToiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJzZWxmLl9vcHJvdCA9IG9wcm90IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJzZWxmLl9zZXFpZCA9IDAiIDw8IGVuZGw7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgZXh0ZW5kcworICAgICAgICAgICAgICAgICA8PCAiLkNsaWVudC5fX2luaXRfXyhzZWxmLCB0cmFuc3BvcnQsIG9wcm90X2ZhY3RvcnkpIiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAoZ2VuX3Rvcm5hZG9fKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGV4dGVuZHMKKyAgICAgICAgICAgICAgICAgPDwgIi5DbGllbnQuX19pbml0X18oc2VsZiwgdHJhbnNwb3J0LCBpcHJvdF9mYWN0b3J5LCBvcHJvdF9mYWN0b3J5KSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBleHRlbmRzIDw8ICIuQ2xpZW50Ll9faW5pdF9fKHNlbGYsIGlwcm90LCBvcHJvdCkiIDw8IGVuZGw7CisgICAgfQorICB9CisgIGluZGVudF9kb3duKCk7CisKKyAgaWYgKGdlbl90b3JuYWRvXyAmJiBleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwKKyAgICAgIGluZGVudCgpIDw8ICJAZ2VuLmVuZ2luZSIgPDwgZW5kbCA8PAorICAgICAgaW5kZW50KCkgPDwgImRlZiBfc3RhcnRfcmVjZWl2aW5nKHNlbGYpOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIndoaWxlIFRydWU6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRyeToiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAiZnJhbWUgPSB5aWVsZCBzZWxmLl90cmFuc3BvcnQucmVhZEZyYW1lKCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJleGNlcHQgVFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uIGFzIGU6IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgImZvciBmdXR1cmUgaW4gc2VsZi5fcmVxcy52YWx1ZXMoKToiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCBpbmRlbnRfc3RyKCkgPDwgImZ1dHVyZS5zZXRfZXhjZXB0aW9uKGUpIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInNlbGYuX3JlcXMgPSB7fSIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJyZXR1cm4iIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0ciA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihmcmFtZSkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpcHJvdCA9IHNlbGYuX2lwcm90X2ZhY3RvcnkuZ2V0UHJvdG9jb2wodHIpIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiKGZuYW1lLCBtdHlwZSwgcnNlcWlkKSA9IGlwcm90LnJlYWRNZXNzYWdlQmVnaW4oKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm1ldGhvZCA9IGdldGF0dHIoc2VsZiwgJ3JlY3ZfJyArIGZuYW1lKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImZ1dHVyZSA9IHNlbGYuX3JlcXMucG9wKHJzZXFpZCwgTm9uZSkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiBub3QgZnV0dXJlOiIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICIjIGZ1dHVyZSBoYXMgYWxyZWFkeSBiZWVuIGRpc2NhcmRlZCIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJjb250aW51ZSIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInRyeToiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAicmVzdWx0ID0gbWV0aG9kKGlwcm90LCBtdHlwZSwgcnNlcWlkKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImV4Y2VwdCBFeGNlcHRpb24gYXMgZToiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAiZnV0dXJlLnNldF9leGNlcHRpb24oZSkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJlbHNlOiIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJmdXR1cmUuc2V0X3Jlc3VsdChyZXN1bHQpIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisgICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZGVmICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsIGZhbHNlKSA8PCAiOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKGZfc2VydmljZV8sICgqZl9pdGVyKSk7CisgICAgaWYgKGdlbl90d2lzdGVkXykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJzZXFpZCA9IHNlbGYuX3NlcWlkID0gc2VsZi5fc2VxaWQgKyAxIiA8PCBlbmRsOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJzZWxmLl9yZXFzW3NlcWlkXSA9IGRlZmVyLkRlZmVycmVkKCkiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZCA9IGRlZmVyLm1heWJlRGVmZXJyZWQoc2VsZi5zZW5kXyIgPDwgZnVubmFtZTsKKworICAgIH0gZWxzZSBpZiAoZ2VuX3Rvcm5hZG9fKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInNlbGYuX3NlcWlkICs9IDEiIDw8IGVuZGw7CisgICAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJmdXR1cmUgPSBzZWxmLl9yZXFzW3NlbGYuX3NlcWlkXSA9IGNvbmN1cnJlbnQuRnV0dXJlKCkiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInNlbGYuc2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiOworCisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAic2VsZi5zZW5kXyIgPDwgZnVubmFtZSA8PCAiKCI7CisgICAgfQorCisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgaWYgKGdlbl90d2lzdGVkXykgeworICAgICAgLy8gd2UgbmVlZCBhIGxlYWRpbmcgY29tbWEgaWYgdGhlcmUgYXJlIGFyZ3MsIHNpbmNlIGl0J3MgY2FsbGVkIGFzIG1heWJlRGVmZXJyZWQoZnVuY25hbWUsCisgICAgICAvLyBhcmcpCisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0KKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIH0KKworICAgIGZfc2VydmljZV8gPDwgIikiIDw8IGVuZGw7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKKyAgICAgICAgLy8gbm90aGluZy4gU2VlIHRoZSBuZXh0IGJsb2NrLgorICAgICAgfSBlbHNlIGlmIChnZW5fdG9ybmFkb18pIHsKKyAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gZnV0dXJlIiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKKyAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgInJldHVybiAiOworICAgICAgICB9CisgICAgICAgIGZfc2VydmljZV8gPDwgInNlbGYucmVjdl8iIDw8IGZ1bm5hbWUgPDwgIigpIiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworCisgICAgaWYgKGdlbl90d2lzdGVkXykgeworICAgICAgLy8gVGhpcyBibG9jayBpbmplY3RzIHRoZSBib2R5IG9mIHRoZSBzZW5kXzw+IG1ldGhvZCBmb3IgdHdpc3RlZCAoYW5kIGEgY2IvZWIgcGFpcikKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJkLmFkZENhbGxiYWNrcygiIDw8IGVuZGw7CisKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiY2FsbGJhY2s9c2VsZi5jYl9zZW5kXyIgPDwgZnVubmFtZSA8PCAiLCIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAiY2FsbGJhY2tBcmdzPShzZXFpZCwpLCIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiZXJyYmFjaz1zZWxmLmViX3NlbmRfIgorICAgICAgICAgICAgICAgICA8PCBmdW5uYW1lIDw8ICIsIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJlcnJiYWNrQXJncz0oc2VxaWQsKSkiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworCisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiBkIiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJkZWYgY2Jfc2VuZF8iIDw8IGZ1bm5hbWUgPDwgIihzZWxmLCBfLCBzZXFpZCk6IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpZiAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgICAvLyBpZiBvbmUtd2F5LCBmaXJlIHRoZSBkZWZlcnJlZCAmIHJlbW92ZSBpdCBmcm9tIF9yZXFzCisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImQgPSBzZWxmLl9yZXFzLnBvcChzZXFpZCkiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgICA8PCAiZC5jYWxsYmFjayhOb25lKSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGQiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gc2VsZi5fcmVxc1tzZXFpZF0iIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgICAgICAvLyBhZGQgYW4gZXJyYmFjayB0byBmYWlsIHRoZSByZXF1ZXN0IGlmIHRoZSBjYWxsIHRvIHNlbmRfPD4gcmFpc2VkIGFuIGV4Y2VwdGlvbgorICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJkZWYgZWJfc2VuZF8iIDw8IGZ1bm5hbWUgPDwgIihzZWxmLCBmLCBzZXFpZCk6IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkID0gc2VsZi5fcmVxcy5wb3Aoc2VxaWQpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJkLmVycmJhY2soZikiCisgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJldHVybiBkIiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJkZWYgc2VuZF8iIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCBmYWxzZSkgPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBzdGQ6OnN0cmluZyBhcmdzbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfYXJncyI7CisgICAgc3RkOjpzdHJpbmcgbWVzc2FnZVR5cGUgPSAoKmZfaXRlciktPmlzX29uZXdheSgpID8gIlRNZXNzYWdlVHlwZS5PTkVXQVkiIDogIlRNZXNzYWdlVHlwZS5DQUxMIjsKKworICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdCBoZWFkZXIKKyAgICBpZiAoZ2VuX3R3aXN0ZWRfIHx8IGdlbl90b3JuYWRvXykgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3QgPSBzZWxmLl9vcHJvdF9mYWN0b3J5LmdldFByb3RvY29sKHNlbGYuX3RyYW5zcG9ydCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKCciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJywgIgorICAgICAgICAgICAgICAgICA8PCBtZXNzYWdlVHlwZSA8PCAiLCBzZWxmLl9zZXFpZCkiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInNlbGYuX29wcm90LndyaXRlTWVzc2FnZUJlZ2luKCciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJywgIgorICAgICAgICAgICAgICAgICA8PCBtZXNzYWdlVHlwZSA8PCAiLCBzZWxmLl9zZXFpZCkiIDw8IGVuZGw7CisgICAgfQorCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncyA9ICIgPDwgYXJnc25hbWUgPDwgIigpIiA8PCBlbmRsOworCisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3MuIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIgorICAgICAgICAgICAgICAgICA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOworICAgIH0KKworICAgIC8vIFdyaXRlIHRvIHRoZSBzdHJlYW0KKyAgICBpZiAoZ2VuX3R3aXN0ZWRfIHx8IGdlbl90b3JuYWRvXykgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncy53cml0ZShvcHJvdCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpIgorICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC50cmFucy5mbHVzaCgpIiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzLndyaXRlKHNlbGYuX29wcm90KSIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICA8PCAic2VsZi5fb3Byb3Qud3JpdGVNZXNzYWdlRW5kKCkiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgInNlbGYuX29wcm90LnRyYW5zLmZsdXNoKCkiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0bmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKKyAgICAgIC8vIE9wZW4gZnVuY3Rpb24KKyAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgICAgIGlmIChnZW5fdHdpc3RlZF8gfHwgZ2VuX3Rvcm5hZG9fKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImRlZiByZWN2XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgPDwgIihzZWxmLCBpcHJvdCwgbXR5cGUsIHJzZXFpZCk6IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKKyAgICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkZWYgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24pIDw8ICI6IiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgIC8vIFRPRE8obWNzbGVlKTogVmFsaWRhdGUgbWVzc2FnZSByZXBseSBoZXJlLCBzZXEgaWRzIGV0Yy4KKworICAgICAgaWYgKGdlbl90d2lzdGVkXykgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkID0gc2VsZi5fcmVxcy5wb3AocnNlcWlkKSIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSBpZiAoZ2VuX3Rvcm5hZG9fKSB7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpcHJvdCA9IHNlbGYuX2lwcm90IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICAgPDwgIihmbmFtZSwgbXR5cGUsIHJzZXFpZCkgPSBpcHJvdC5yZWFkTWVzc2FnZUJlZ2luKCkiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIG10eXBlID09IFRNZXNzYWdlVHlwZS5FWENFUFRJT046IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAieCA9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbigpIiA8PCBlbmRsOworCisgICAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJ4LnJlYWQoaXByb3QpIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJpcHJvdC5yZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAicmV0dXJuIGQuZXJyYmFjayh4KSIKKyAgICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXN1bHQgPSAiIDw8IHJlc3VsdG5hbWUgPDwgIigpIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICAgPDwgInJlc3VsdC5yZWFkKGlwcm90KSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaXByb3QucmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJ4LnJlYWQoaXByb3QpIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJpcHJvdC5yZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAicmFpc2UgeCIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXN1bHQgPSAiIDw8IHJlc3VsdG5hbWUgPDwgIigpIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgICAgPDwgInJlc3VsdC5yZWFkKGlwcm90KSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaXByb3QucmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIHJlc3VsdC5zdWNjZXNzIGlzIG5vdCBOb25lOiIgPDwgZW5kbDsKKyAgICAgICAgaWYgKGdlbl90d2lzdGVkXykgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJyZXR1cm4gZC5jYWxsYmFjayhyZXN1bHQuc3VjY2VzcykiIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJldHVybiByZXN1bHQuc3VjY2VzcyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICBjb25zdCBzdHJpbmcmIHhuYW1lID0gKCp4X2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiByZXN1bHQuIiA8PCB4bmFtZSA8PCAiIGlzIG5vdCBOb25lOiIgPDwgZW5kbDsKKyAgICAgICAgaWYgKGdlbl90d2lzdGVkXykgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJyZXR1cm4gZC5lcnJiYWNrKHJlc3VsdC4iIDw8IHhuYW1lIDw8ICIpIgorICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAicmFpc2UgcmVzdWx0LiIgPDwgeG5hbWUgPDwgIiIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KKyAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGQuY2FsbGJhY2soTm9uZSkiIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIiA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7CisgICAgICAgICAgZl9zZXJ2aWNlXworICAgICAgICAgICAgICA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICA8PCAicmV0dXJuIGQuZXJyYmFjayhUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLk1JU1NJTkdfUkVTVUxULCBcIiIKKyAgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKSkiIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgICAgICAgPDwgInJhaXNlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uTUlTU0lOR19SRVNVTFQsIFwiIgorICAgICAgICAgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKSIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBDbG9zZSBmdW5jdGlvbgorICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisgIH0KKworICBpbmRlbnRfZG93bigpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGNvbW1hbmQgbGluZSB0b29sIGZvciBtYWtpbmcgcmVtb3RlIHJlcXVlc3RzCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgcmVtb3RlIGZvci4KKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9yZW1vdGUodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIC8vIEdldCBhbGwgZnVuY3Rpb24gZnJvbSBwYXJlbnRzCisgIHRfc2VydmljZSogcGFyZW50ID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgIHdoaWxlIChwYXJlbnQgIT0gTlVMTCkgeworICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gcF9mdW5jdGlvbnMgPSBwYXJlbnQtPmdldF9mdW5jdGlvbnMoKTsKKyAgICBmdW5jdGlvbnMuaW5zZXJ0KGZ1bmN0aW9ucy5lbmQoKSwgcF9mdW5jdGlvbnMuYmVnaW4oKSwgcF9mdW5jdGlvbnMuZW5kKCkpOworICAgIHBhcmVudCA9IHBhcmVudC0+Z2V0X2V4dGVuZHMoKTsKKyAgfQorICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgc3RyaW5nIGZfcmVtb3RlX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBzZXJ2aWNlX25hbWVfICsgIi1yZW1vdGUiOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfcmVtb3RlOworICBmX3JlbW90ZS5vcGVuKGZfcmVtb3RlX25hbWUuY19zdHIoKSk7CisKKyAgZl9yZW1vdGUgPDwKKyAgICAiIyEvdXNyL2Jpbi9lbnYgcHl0aG9uIiA8PCBlbmRsIDw8CisgICAgcHlfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PAorICAgICJpbXBvcnQgc3lzIiA8PCBlbmRsIDw8CisgICAgImltcG9ydCBwcHJpbnQiIDw8IGVuZGwgPDwKKyAgICAiaWYgc3lzLnZlcnNpb25faW5mb1swXSA+IDI6IiA8PCBlbmRsIDw8CisgICAgaW5kZW50X3N0cigpIDw8ICJmcm9tIHVybGxpYi5wYXJzZSBpbXBvcnQgdXJscGFyc2UiIDw8IGVuZGwgPDwKKyAgICAiZWxzZToiIDw8IGVuZGwgPDwKKyAgICBpbmRlbnRfc3RyKCkgPDwgImZyb20gdXJscGFyc2UgaW1wb3J0IHVybHBhcnNlIiA8PCBlbmRsIDw8CisgICAgImZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydCwgVFNvY2tldCwgVFNTTFNvY2tldCwgVEh0dHBDbGllbnQiIDw8IGVuZGwgPDwKKyAgICAiZnJvbSB0aHJpZnQucHJvdG9jb2wuVEJpbmFyeVByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wiIDw8IGVuZGwgPDwKKyAgICBlbmRsOworCisgIGZfcmVtb3RlIDw8CisgICAgImZyb20gIiA8PCBtb2R1bGVfIDw8ICIgaW1wb3J0ICIgPDwgc2VydmljZV9uYW1lXyA8PCBlbmRsIDw8CisgICAgImZyb20gIiA8PCBtb2R1bGVfIDw8ICIudHR5cGVzIGltcG9ydCAqIiA8PCBlbmRsIDw8CisgICAgZW5kbDsKKworICBmX3JlbW90ZSA8PAorICAgICJpZiBsZW4oc3lzLmFyZ3YpIDw9IDEgb3Igc3lzLmFyZ3ZbMV0gPT0gJy0taGVscCc6IiA8PCBlbmRsIDw8CisgICAgaW5kZW50X3N0cigpIDw8ICJwcmludCgnJykiIDw8IGVuZGwgPDwKKyAgICBpbmRlbnRfc3RyKCkgPDwgInByaW50KCdVc2FnZTogJyArIHN5cy5hcmd2WzBdICsgJyBbLWggaG9zdFs6cG9ydF1dIFstdSB1cmxdIFstZltyYW1lZF1dIFstc1tzbF1dIFstbm92YWxpZGF0ZV0gWy1jYV9jZXJ0cyBjZXJ0c10gWy1rZXlmaWxlIGtleWZpbGVdIFstY2VydGZpbGUgY2VydGZpbGVdIGZ1bmN0aW9uIFthcmcxIFthcmcyLi4uXV0nKSIgPDwgZW5kbCA8PAorICAgIGluZGVudF9zdHIoKSA8PCAicHJpbnQoJycpIiA8PCBlbmRsIDw8CisgICAgaW5kZW50X3N0cigpIDw8ICJwcmludCgnRnVuY3Rpb25zOicpIiA8PCBlbmRsOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGZfcmVtb3RlIDw8IGluZGVudF9zdHIoKSA8PCAicHJpbnQoJyAgIiA8PCAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmdldF9uYW1lKCkgPDwgIiAiCisgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIjsKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGFyZ3MgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHN0ZDo6dmVjdG9yPHRfZmllbGQqPjo6c2l6ZV90eXBlIG51bV9hcmdzID0gYXJncy5zaXplKCk7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj46OnNpemVfdHlwZSBpID0gMDsgaSA8IG51bV9hcmdzOyArK2kpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9yZW1vdGUgPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIGZfcmVtb3RlIDw8IGFyZ3NbaV0tPmdldF90eXBlKCktPmdldF9uYW1lKCkgPDwgIiAiIDw8IGFyZ3NbaV0tPmdldF9uYW1lKCk7CisgICAgfQorICAgIGZfcmVtb3RlIDw8ICIpJykiIDw8IGVuZGw7CisgIH0KKyAgZl9yZW1vdGUgPDwgaW5kZW50X3N0cigpIDw8ICJwcmludCgnJykiIDw8IGVuZGwgPDwgaW5kZW50X3N0cigpIDw8ICJzeXMuZXhpdCgwKSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGZfcmVtb3RlIDw8ICJwcCA9IHBwcmludC5QcmV0dHlQcmludGVyKGluZGVudD0yKSIgPDwgZW5kbAorICAgICAgICAgICA8PCAiaG9zdCA9ICdsb2NhbGhvc3QnIiA8PCBlbmRsCisgICAgICAgICAgIDw8ICJwb3J0ID0gOTA5MCIgPDwgZW5kbAorICAgICAgICAgICA8PCAidXJpID0gJyciIDw8IGVuZGwKKyAgICAgICAgICAgPDwgImZyYW1lZCA9IEZhbHNlIiA8PCBlbmRsCisgICAgICAgICAgIDw8ICJzc2wgPSBGYWxzZSIgPDwgZW5kbAorICAgICAgICAgICA8PCAidmFsaWRhdGUgPSBUcnVlIiA8PCBlbmRsCisgICAgICAgICAgIDw8ICJjYV9jZXJ0cyA9IE5vbmUiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgImtleWZpbGUgPSBOb25lIiA8PCBlbmRsCisgICAgICAgICAgIDw8ICJjZXJ0ZmlsZSA9IE5vbmUiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgImh0dHAgPSBGYWxzZSIgPDwgZW5kbAorICAgICAgICAgICA8PCAiYXJnaSA9IDEiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICA8PCAiaWYgc3lzLmFyZ3ZbYXJnaV0gPT0gJy1oJzoiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJwYXJ0cyA9IHN5cy5hcmd2W2FyZ2kgKyAxXS5zcGxpdCgnOicpIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiaG9zdCA9IHBhcnRzWzBdIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiaWYgbGVuKHBhcnRzKSA+IDE6IiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInBvcnQgPSBpbnQocGFydHNbMV0pIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiYXJnaSArPSAyIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgPDwgImlmIHN5cy5hcmd2W2FyZ2ldID09ICctdSc6IiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAidXJsID0gdXJscGFyc2Uoc3lzLmFyZ3ZbYXJnaSArIDFdKSIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgInBhcnRzID0gdXJsWzFdLnNwbGl0KCc6JykiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJob3N0ID0gcGFydHNbMF0iIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJpZiBsZW4ocGFydHMpID4gMToiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8IGluZGVudF9zdHIoKSA8PCAicG9ydCA9IGludChwYXJ0c1sxXSkiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJlbHNlOiIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgaW5kZW50X3N0cigpIDw8ICJwb3J0ID0gODAiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJ1cmkgPSB1cmxbMl0iIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJpZiB1cmxbNF06IiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInVyaSArPSAnPyVzJyAlIHVybFs0XSIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImh0dHAgPSBUcnVlIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiYXJnaSArPSAyIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgPDwgImlmIHN5cy5hcmd2W2FyZ2ldID09ICctZicgb3Igc3lzLmFyZ3ZbYXJnaV0gPT0gJy1mcmFtZWQnOiIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImZyYW1lZCA9IFRydWUiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJhcmdpICs9IDEiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICA8PCAiaWYgc3lzLmFyZ3ZbYXJnaV0gPT0gJy1zJyBvciBzeXMuYXJndlthcmdpXSA9PSAnLXNzbCc6IiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAic3NsID0gVHJ1ZSIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImFyZ2kgKz0gMSIgPDwgZW5kbAorICAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgIDw8ICJpZiBzeXMuYXJndlthcmdpXSA9PSAnLW5vdmFsaWRhdGUnOiIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgInZhbGlkYXRlID0gRmFsc2UiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJhcmdpICs9IDEiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICA8PCAiaWYgc3lzLmFyZ3ZbYXJnaV0gPT0gJy1jYV9jZXJ0cyc6IiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiY2FfY2VydHMgPSBzeXMuYXJndlthcmdpKzFdIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiYXJnaSArPSAyIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgPDwgImlmIHN5cy5hcmd2W2FyZ2ldID09ICcta2V5ZmlsZSc6IiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAia2V5ZmlsZSA9IHN5cy5hcmd2W2FyZ2krMV0iIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJhcmdpICs9IDIiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICA8PCAiaWYgc3lzLmFyZ3ZbYXJnaV0gPT0gJy1jZXJ0ZmlsZSc6IiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiY2VydGZpbGUgPSBzeXMuYXJndlthcmdpKzFdIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiYXJnaSArPSAyIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICAgPDwgImNtZCA9IHN5cy5hcmd2W2FyZ2ldIiA8PCBlbmRsCisgICAgICAgICAgIDw8ICJhcmdzID0gc3lzLmFyZ3ZbYXJnaSArIDE6XSIgPDwgZW5kbAorICAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgIDw8ICJpZiBodHRwOiIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgInRyYW5zcG9ydCA9IFRIdHRwQ2xpZW50LlRIdHRwQ2xpZW50KGhvc3QsIHBvcnQsIHVyaSkiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgImVsc2U6IiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCAiaWYgc3NsOiIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgaW5kZW50X3N0cigpIDw8ICJzb2NrZXQgPSBUU1NMU29ja2V0LlRTU0xTb2NrZXQoaG9zdCwgcG9ydCwgIgorICAgICAgICAgICAgICAidmFsaWRhdGU9dmFsaWRhdGUsIGNhX2NlcnRzPWNhX2NlcnRzLCBrZXlmaWxlPWtleWZpbGUsIGNlcnRmaWxlPWNlcnRmaWxlKSIKKyAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImVsc2U6IiA8PCBlbmRsCisgICAgICAgICAgIDw8IGluZGVudF9zdHIoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInNvY2tldCA9IFRTb2NrZXQuVFNvY2tldChob3N0LCBwb3J0KSIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImlmIGZyYW1lZDoiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8IGluZGVudF9zdHIoKSA8PCAidHJhbnNwb3J0ID0gVFRyYW5zcG9ydC5URnJhbWVkVHJhbnNwb3J0KHNvY2tldCkiIDw8IGVuZGwKKyAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJlbHNlOiIgPDwgZW5kbAorICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgaW5kZW50X3N0cigpIDw8ICJ0cmFuc3BvcnQgPSBUVHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydChzb2NrZXQpIiA8PCBlbmRsCisgICAgICAgICAgIDw8ICJwcm90b2NvbCA9IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpIiA8PCBlbmRsCisgICAgICAgICAgIDw8ICJjbGllbnQgPSAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIi5DbGllbnQocHJvdG9jb2wpIiA8PCBlbmRsCisgICAgICAgICAgIDw8ICJ0cmFuc3BvcnQub3BlbigpIiA8PCBlbmRsCisgICAgICAgICAgIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfcmVtb3RlIDw8ICJlbCI7CisgICAgfQorCisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBhcmdzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj46OnNpemVfdHlwZSBudW1fYXJncyA9IGFyZ3Muc2l6ZSgpOworCisgICAgZl9yZW1vdGUgPDwgImlmIGNtZCA9PSAnIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIic6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJpZiBsZW4oYXJncykgIT0gIiA8PCBudW1fYXJncyA8PCAiOiIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAicHJpbnQoJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgcmVxdWlyZXMgIiA8PCBudW1fYXJncworICAgICAgICAgICAgIDw8ICIgYXJncycpIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJzeXMuZXhpdCgxKSIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJwcC5wcHJpbnQoY2xpZW50LiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIjsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGJvb2wgZmlyc3RfYXJnID0gdHJ1ZTsKKyAgICBmb3IgKHN0ZDo6dmVjdG9yPHRfZmllbGQqPjo6c2l6ZV90eXBlIGkgPSAwOyBpIDwgbnVtX2FyZ3M7ICsraSkgeworICAgICAgaWYgKGZpcnN0X2FyZykKKyAgICAgICAgZmlyc3RfYXJnID0gZmFsc2U7CisgICAgICBlbHNlCisgICAgICAgIGZfcmVtb3RlIDw8ICIgIjsKKyAgICAgIGlmIChhcmdzW2ldLT5nZXRfdHlwZSgpLT5pc19zdHJpbmcoKSkgeworICAgICAgICBmX3JlbW90ZSA8PCAiYXJnc1siIDw8IGkgPDwgIl0sIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfcmVtb3RlIDw8ICJldmFsKGFyZ3NbIiA8PCBpIDw8ICJdKSwiOworICAgICAgfQorICAgIH0KKyAgICBmX3JlbW90ZSA8PCAiKSkiIDw8IGVuZGw7CisKKyAgICBmX3JlbW90ZSA8PCBlbmRsOworICB9CisKKyAgaWYgKGZ1bmN0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgZl9yZW1vdGUgPDwgImVsc2U6IiA8PCBlbmRsOworICAgIGZfcmVtb3RlIDw8IGluZGVudF9zdHIoKSA8PCAicHJpbnQoJ1VucmVjb2duaXplZCBtZXRob2QgJXMnICUgY21kKSIgPDwgZW5kbDsKKyAgICBmX3JlbW90ZSA8PCBpbmRlbnRfc3RyKCkgPDwgInN5cy5leGl0KDEpIiA8PCBlbmRsOworICAgIGZfcmVtb3RlIDw8IGVuZGw7CisgIH0KKworICBmX3JlbW90ZSA8PCAidHJhbnNwb3J0LmNsb3NlKCkiIDw8IGVuZGw7CisKKyAgLy8gQ2xvc2Ugc2VydmljZSBmaWxlCisgIGZfcmVtb3RlLmNsb3NlKCk7CisKKyNpZm5kZWYgX01TQ19WRVIKKworICAvLyBNYWtlIGZpbGUgZXhlY3V0YWJsZSwgbG92ZSB0aGF0IGJpdHdpc2UgT1IgYWN0aW9uCisgIGNobW9kKGZfcmVtb3RlX25hbWUuY19zdHIoKSwKKyAgICAgICAgU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lYVVNSCisjaWZuZGVmIF9XSU4zMgorICAgICAgICB8IFNfSVJHUlAgfCBTX0lYR1JQIHwgU19JUk9USCB8IFNfSVhPVEgKKyNlbmRpZgorICAgICAgICApOworCisjZW5kaWYgLy8gX01TQ19WRVIKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKKyAgc3RyaW5nIGV4dGVuZHNfcHJvY2Vzc29yID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgZXh0ZW5kc19wcm9jZXNzb3IgPSBleHRlbmRzICsgIi5Qcm9jZXNzb3IsICI7CisgIH0KKworICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KKyAgaWYgKGdlbl96b3BlX2ludGVyZmFjZV8pIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJAaW1wbGVtZW50ZXIoSWZhY2UpIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCAiY2xhc3MgUHJvY2Vzc29yKCIgPDwgZXh0ZW5kc19wcm9jZXNzb3IgPDwgIlRQcm9jZXNzb3IpOiIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJjbGFzcyBQcm9jZXNzb3IoIiA8PCBleHRlbmRzX3Byb2Nlc3NvciA8PCAiSWZhY2UsIFRQcm9jZXNzb3IpOiIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF91cCgpOworCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZGVmIF9faW5pdF9fKHNlbGYsIGhhbmRsZXIpOiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBpZiAoZ2VuX3pvcGVfaW50ZXJmYWNlXykgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAic2VsZi5faGFuZGxlciA9IElmYWNlKGhhbmRsZXIpIiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzZWxmLl9oYW5kbGVyID0gaGFuZGxlciIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzZWxmLl9wcm9jZXNzTWFwID0ge30iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaWYgKGdlbl96b3BlX2ludGVyZmFjZV8pIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgZXh0ZW5kcyA8PCAiLlByb2Nlc3Nvci5fX2luaXRfXyhzZWxmLCBJZmFjZShoYW5kbGVyKSkiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgZXh0ZW5kcyA8PCAiLlByb2Nlc3Nvci5fX2luaXRfXyhzZWxmLCBoYW5kbGVyKSIgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzZWxmLl9wcm9jZXNzTWFwW1wiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgIDw8ICJcIl0gPSBQcm9jZXNzb3IucHJvY2Vzc18iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8gPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImRlZiBwcm9jZXNzKHNlbGYsIGlwcm90LCBvcHJvdCk6IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIobmFtZSwgdHlwZSwgc2VxaWQpID0gaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpIiA8PCBlbmRsOworCisgIC8vIFRPRE8obWNzbGVlKTogdmFsaWRhdGUgbWVzc2FnZQorCisgIC8vIEhPVDogZGljdGlvbmFyeSBmdW5jdGlvbiBsb29rdXAKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgbmFtZSBub3QgaW4gc2VsZi5fcHJvY2Vzc01hcDoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpcHJvdC5za2lwKFRUeXBlLlNUUlVDVCkiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaXByb3QucmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpCisgICAgICAgICAgICAgPDwgInggPSBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlVOS05PV05fTUVUSE9ELCAnVW5rbm93biAiCisgICAgICAgICAgICAgICAgImZ1bmN0aW9uICVzJyAlIChuYW1lKSkiCisgICAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuYW1lLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBzZXFpZCkiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieC53cml0ZShvcHJvdCkiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlRW5kKCkiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3QudHJhbnMuZmx1c2goKSIgPDwgZW5kbDsKKworICBpZiAoZ2VuX3R3aXN0ZWRfKSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGRlZmVyLnN1Y2NlZWQoTm9uZSkiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIiA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZWxzZToiIDw8IGVuZGw7CisKKyAgaWYgKGdlbl90d2lzdGVkXyB8fCBnZW5fdG9ybmFkb18pIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKQorICAgICAgICAgICAgICAgPDwgInJldHVybiBzZWxmLl9wcm9jZXNzTWFwW25hbWVdKHNlbGYsIHNlcWlkLCBpcHJvdCwgb3Byb3QpIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJzZWxmLl9wcm9jZXNzTWFwW25hbWVdKHNlbGYsIHNlcWlkLCBpcHJvdCwgb3Byb3QpIgorICAgICAgICAgICAgICAgPDwgZW5kbDsKKworICAgIC8vIFJlYWQgZW5kIG9mIGFyZ3MgZmllbGQsIHRoZSBUX1NUT1AsIGFuZCB0aGUgc3RydWN0IGNsb3NlCisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIFRydWUiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworCisgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKKyAgfQorCisgIGluZGVudF9kb3duKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgKHZvaWQpdHNlcnZpY2U7CisgIC8vIE9wZW4gZnVuY3Rpb24KKyAgaWYgKGdlbl90b3JuYWRvXykgeworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIkBnZW4uY29yb3V0aW5lIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJkZWYgcHJvY2Vzc18iCisgICAgICAgICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIihzZWxmLCBzZXFpZCwgaXByb3QsIG9wcm90KToiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZGVmIHByb2Nlc3NfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgIDw8ICIoc2VsZiwgc2VxaWQsIGlwcm90LCBvcHJvdCk6IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X3VwKCk7CisKKyAgc3RyaW5nIGFyZ3NuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKKyAgc3RyaW5nIHJlc3VsdG5hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7CisKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncyA9ICIgPDwgYXJnc25hbWUgPDwgIigpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJhcmdzLnJlYWQoaXByb3QpIgorICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlwcm90LnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGw7CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKworICAvLyBEZWNsYXJlIHJlc3VsdCBmb3Igbm9uIG9uZXdheSBmdW5jdGlvbgorICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQgPSAiIDw8IHJlc3VsdG5hbWUgPDwgIigpIiA8PCBlbmRsOworICB9CisKKyAgaWYgKGdlbl90d2lzdGVkXykgeworICAgIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImQgPSBkZWZlci5tYXliZURlZmVycmVkKHNlbGYuX2hhbmRsZXIuIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgIDw8ICIsICI7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiKSIgPDwgZW5kbDsKKworICAgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkLmFkZEVycmJhY2soc2VsZi5oYW5kbGVfZXhjZXB0aW9uXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgIDw8ICIsIHNlcWlkKSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZC5hZGRDYWxsYmFjayhzZWxmLndyaXRlX3Jlc3VsdHNfc3VjY2Vzc18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICA8PCAiLCByZXN1bHQsIHNlcWlkLCBvcHJvdCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImQuYWRkRXJyYmFjayhzZWxmLndyaXRlX3Jlc3VsdHNfZXhjZXB0aW9uXyIKKyAgICAgICAgICAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIsIHJlc3VsdCwgc2VxaWQsIG9wcm90KSIgPDwgZW5kbDsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGQiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisKKyAgICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJkZWYgaGFuZGxlX2V4Y2VwdGlvbl8iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIoc2VsZiwgZXJyb3IsIHNlcWlkKToiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZGVmIHdyaXRlX3Jlc3VsdHNfc3VjY2Vzc18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIoc2VsZiwgc3VjY2VzcywgcmVzdWx0LCBzZXFpZCwgb3Byb3QpOiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuc3VjY2VzcyA9IHN1Y2Nlc3MiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgIDw8ICJcIiwgVE1lc3NhZ2VUeXBlLlJFUExZLCBzZXFpZCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvcHJvdCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdC50cmFucy5mbHVzaCgpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworCisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImRlZiB3cml0ZV9yZXN1bHRzX2V4Y2VwdGlvbl8iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIoc2VsZiwgZXJyb3IsIHJlc3VsdCwgc2VxaWQsIG9wcm90KToiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF91cCgpOworICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibXNnX3R5cGUgPSBUTWVzc2FnZVR5cGUuUkVQTFkiIDw8IGVuZGw7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRyeToiIDw8IGVuZGw7CisKKyAgICAvLyBLaW5kYSBhYnN1cmQKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAiZXJyb3IucmFpc2VFeGNlcHRpb24oKSIgPDwgZW5kbDsKKyAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgIGNvbnN0IHN0cmluZyYgeG5hbWUgPSAoKnhfaXRlciktPmdldF9uYW1lKCk7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImV4Y2VwdCAiIDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCkpIDw8ICIgYXMgIiA8PCB4bmFtZQorICAgICAgICAgICAgICAgICAgIDw8ICI6IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgeG5hbWUgPDwgIiA9ICIgPDwgeG5hbWUgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIH0KKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZXhjZXB0IFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbjoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAicmFpc2UiIDw8IGVuZGw7CisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJleGNlcHQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGFzIGV4OiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkKKyAgICAgICAgICAgICAgICAgPDwgImxvZ2dpbmcuZXhjZXB0aW9uKCdUQXBwbGljYXRpb24gZXhjZXB0aW9uIGluIGhhbmRsZXInKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgIm1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJlc3VsdCA9IGV4IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJleGNlcHQgRXhjZXB0aW9uOiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkKKyAgICAgICAgICAgICAgICAgPDwgImxvZ2dpbmcuZXhjZXB0aW9uKCdVbmV4cGVjdGVkIGV4Y2VwdGlvbiBpbiBoYW5kbGVyJykiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5FWENFUFRJT04iIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpCisgICAgICAgICAgICAgICAgIDw8ICJyZXN1bHQgPSBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLklOVEVSTkFMX0VSUk9SLCAiCisgICAgICAgICAgICAgICAgICAgICInSW50ZXJuYWwgZXJyb3InKSIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICA8PCAiXCIsIG1zZ190eXBlLCBzZXFpZCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvcHJvdCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdC50cmFucy5mbHVzaCgpIiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJleGNlcHQgRXhjZXB0aW9uOiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkKKyAgICAgICAgICAgICAgICAgPDwgImxvZ2dpbmcuZXhjZXB0aW9uKCdFeGNlcHRpb24gaW4gb25ld2F5IGhhbmRsZXInKSIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKworICB9IGVsc2UgaWYgKGdlbl90b3JuYWRvXykgeworICAgIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5SRVBMWSIgPDwgZW5kbDsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJ5OiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgInJlc3VsdC5zdWNjZXNzID0gIjsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAieWllbGQgZ2VuLm1heWJlX2Z1dHVyZShzZWxmLl9oYW5kbGVyLiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8ICJhcmdzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8ICIpKSIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICBjb25zdCBzdHJpbmcmIHhuYW1lID0gKCp4X2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJleGNlcHQgIiA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiIGFzICIgPDwgeG5hbWUKKyAgICAgICAgICAgICAgICAgICA8PCAiOiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAicmVzdWx0LiIgPDwgeG5hbWUgPDwgIiA9ICIgPDwgeG5hbWUgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZXhjZXB0IFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbjoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAicmFpc2UiIDw8IGVuZGw7CisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJleGNlcHQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGFzIGV4OiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkKKyAgICAgICAgICAgICAgICAgPDwgImxvZ2dpbmcuZXhjZXB0aW9uKCdUQXBwbGljYXRpb24gZXhjZXB0aW9uIGluIGhhbmRsZXInKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgIm1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJlc3VsdCA9IGV4IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJleGNlcHQgRXhjZXB0aW9uOiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkKKyAgICAgICAgICAgICAgICAgPDwgImxvZ2dpbmcuZXhjZXB0aW9uKCdVbmV4cGVjdGVkIGV4Y2VwdGlvbiBpbiBoYW5kbGVyJykiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5FWENFUFRJT04iIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpCisgICAgICAgICAgICAgICAgIDw8ICJyZXN1bHQgPSBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLklOVEVSTkFMX0VSUk9SLCAiCisgICAgICAgICAgICAgICAgICAgICInSW50ZXJuYWwgZXJyb3InKSIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZXhjZXB0IEV4Y2VwdGlvbjoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpCisgICAgICAgICAgICAgICAgIDw8ICJsb2dnaW5nLmV4Y2VwdGlvbignRXhjZXB0aW9uIGluIG9uZXdheSBoYW5kbGVyJykiIDw8IGVuZGw7CisgICAgfQorCisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgIDw8ICJcIiwgbXNnX3R5cGUsIHNlcWlkKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LndyaXRlKG9wcm90KSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlRW5kKCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LnRyYW5zLmZsdXNoKCkiIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgICBpbmRlbnRfZG93bigpOworCisgIH0gZWxzZSB7IC8vIHB5CisgICAgLy8gVHJ5IGJsb2NrIGZvciBhIGZ1bmN0aW9uIHdpdGggZXhjZXB0aW9ucworICAgIC8vIEl0IGFsc28gY2F0Y2hlcyBhcmJpdHJhcnkgZXhjZXB0aW9ucyByYWlzZWQgYnkgaGFuZGxlciBtZXRob2QgdG8gcHJvcGFnYXRlIHRoZW0gdG8gdGhlIGNsaWVudAorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRyeToiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAorICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOworICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgInJlc3VsdC5zdWNjZXNzID0gIjsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAic2VsZi5faGFuZGxlci4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7CisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiKSIgPDwgZW5kbDsKKyAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLlJFUExZIiA8PCBlbmRsOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgImV4Y2VwdCBUVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb246IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJhaXNlIiA8PCBlbmRsOworCisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICBjb25zdCBzdHJpbmcmIHhuYW1lID0gKCp4X2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJleGNlcHQgIiA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiIGFzICIgPDwgeG5hbWUKKyAgICAgICAgICAgICAgICAgICA8PCAiOiIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLlJFUExZIiA8PCBlbmRsOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCB4bmFtZSA8PCAiID0gIiA8PCB4bmFtZSA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgfQorCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJleGNlcHQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGFzIGV4OiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkKKyAgICAgICAgICAgICAgICAgPDwgImxvZ2dpbmcuZXhjZXB0aW9uKCdUQXBwbGljYXRpb24gZXhjZXB0aW9uIGluIGhhbmRsZXInKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgIm1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJlc3VsdCA9IGV4IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJleGNlcHQgRXhjZXB0aW9uOiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkKKyAgICAgICAgICAgICAgICAgPDwgImxvZ2dpbmcuZXhjZXB0aW9uKCdVbmV4cGVjdGVkIGV4Y2VwdGlvbiBpbiBoYW5kbGVyJykiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5FWENFUFRJT04iIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpCisgICAgICAgICAgICAgICAgIDw8ICJyZXN1bHQgPSBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLklOVEVSTkFMX0VSUk9SLCAiCisgICAgICAgICAgICAgICAgICAgICInSW50ZXJuYWwgZXJyb3InKSIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICA8PCAiXCIsIG1zZ190eXBlLCBzZXFpZCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvcHJvdCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdC50cmFucy5mbHVzaCgpIiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJleGNlcHQgRXhjZXB0aW9uOiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgImxvZ2dpbmcuZXhjZXB0aW9uKCdFeGNlcHRpb24gaW4gb25ld2F5IGhhbmRsZXInKSIgPDwgZW5kbDsKKyAgICB9CisKKyAgICAvLyBDbG9zZSBmdW5jdGlvbgorICAgIGluZGVudF9kb3duKCk7CisgIH0KK30KKworLyoqCisgKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICB9CisKKyAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gaXByb3QuIjsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgb3V0IDw8ICJyZWFkQmluYXJ5KCkiOworICAgICAgICB9IGVsc2UgaWYoIWdlbl91dGY4c3RyaW5nc18pIHsKKyAgICAgICAgICBvdXQgPDwgInJlYWRTdHJpbmcoKSI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nKCkuZGVjb2RlKCd1dGYtOCcpIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMiBlbHNlIGlwcm90LnJlYWRTdHJpbmcoKSI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAicmVhZEJvb2woKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8ICJyZWFkQnl0ZSgpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJyZWFkSTE2KCkiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgInJlYWRJMzIoKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAicmVhZEk2NCgpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJyZWFkRG91YmxlKCkiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gUHl0aG9uIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJyZWFkSTMyKCkiOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKworICB9IGVsc2UgeworICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAorICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhbiB1bnNlcmlhbGl6ZXIgZm9yIGEgc3RydWN0LCBjYWxsaW5nIHJlYWQoKQorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgeworICBpZiAoaXNfaW1tdXRhYmxlKHRzdHJ1Y3QpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIi5yZWFkKGlwcm90KSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIucmVhZChpcHJvdCkiIDw8IGVuZGw7CisgIH0KK30KKworLyoqCisgKiBTZXJpYWxpemUgYSBjb250YWluZXIgYnkgd3JpdGluZyBvdXQgdGhlIGhlYWRlciBmb2xsb3dlZCBieQorICogZGF0YSBhbmQgdGhlbiBhIGZvb3Rlci4KKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgc2l6ZSA9IHRtcCgiX3NpemUiKTsKKyAgc3RyaW5nIGt0eXBlID0gdG1wKCJfa3R5cGUiKTsKKyAgc3RyaW5nIHZ0eXBlID0gdG1wKCJfdnR5cGUiKTsKKyAgc3RyaW5nIGV0eXBlID0gdG1wKCJfZXR5cGUiKTsKKworICB0X2ZpZWxkIGZzaXplKGdfdHlwZV9pMzIsIHNpemUpOworICB0X2ZpZWxkIGZrdHlwZShnX3R5cGVfaTgsIGt0eXBlKTsKKyAgdF9maWVsZCBmdnR5cGUoZ190eXBlX2k4LCB2dHlwZSk7CisgIHRfZmllbGQgZmV0eXBlKGdfdHlwZV9pOCwgZXR5cGUpOworCisgIC8vIERlY2xhcmUgdmFyaWFibGVzLCByZWFkIGhlYWRlcgorICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0ge30iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIigiIDw8IGt0eXBlIDw8ICIsICIgPDwgdnR5cGUKKyAgICAgICAgPDwgIiwgIiA8PCBzaXplIDw8ICIpID0gaXByb3QucmVhZE1hcEJlZ2luKCkiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gc2V0KCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIigiIDw8IGV0eXBlIDw8ICIsICIgPDwgc2l6ZQorICAgICAgICA8PCAiKSA9IGlwcm90LnJlYWRTZXRCZWdpbigpIiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBbXSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiKCIgPDwgZXR5cGUgPDwgIiwgIiA8PCBzaXplCisgICAgICAgIDw8ICIpID0gaXByb3QucmVhZExpc3RCZWdpbigpIiA8PCBlbmRsOworICB9CisKKyAgLy8gRm9yIGxvb3AgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cworICBzdHJpbmcgaSA9IHRtcCgiX2kiKTsKKyAgaW5kZW50KG91dCkgPDwKKyAgICAiZm9yICIgPDwgaSA8PCAiIGluIHJhbmdlKCIgPDwgc2l6ZSA8PCAiKToiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgcHJlZml4KTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgpOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKworICAvLyBSZWFkIGNvbnRhaW5lciBlbmQKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTWFwRW5kKCkiIDw8IGVuZGw7CisgICAgaWYgKGlzX2ltbXV0YWJsZSh0dHlwZSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gVEZyb3plbkRpY3QoIiA8PCBwcmVmaXggPDwgIikiIDw8IGVuZGw7CisgICAgfQorICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkU2V0RW5kKCkiIDw8IGVuZGw7CisgICAgaWYgKGlzX2ltbXV0YWJsZSh0dHlwZSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gZnJvemVuc2V0KCIgPDwgcHJlZml4IDw8ICIpIiA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaWYgKGlzX2ltbXV0YWJsZSh0dHlwZSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gdHVwbGUoIiA8PCBwcmVmaXggPDwgIikiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTGlzdEVuZCgpIiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcga2V5ID0gdG1wKCJfa2V5Iik7CisgIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKKyAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOworICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7CisKKyAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSk7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwpOworCisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiWyIgPDwga2V5IDw8ICJdID0gIiA8PCB2YWwgPDwgZW5kbDsKK30KKworLyoqCisgKiBXcml0ZSBhIHNldCBlbGVtZW50CisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBwcmVmaXgpIHsKKyAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgIHRfZmllbGQgZmVsZW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIuYWRkKCIgPDwgZWxlbSA8PCAiKSIgPDwgZW5kbDsKK30KKworLyoqCisgKiBXcml0ZSBhIGxpc3QgZWxlbWVudAorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgeworICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKKyAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CisKKyAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIuYXBwZW5kKCIgPDwgZWxlbSA8PCAiKSIgPDwgZW5kbDsKK30KKworLyoqCisgKiBTZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCisgKgorICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCisgKiBAcGFyYW0gcHJlZml4IE5hbWUgdG8gcHJlcGVuZCB0byBmaWVsZCBuYW1lCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCkgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisKKyAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICB9CisKKyAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CisKKyAgICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC4iOworCisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgb3V0IDw8ICJ3cml0ZUJpbmFyeSgiIDw8IG5hbWUgPDwgIikiOworICAgICAgICB9IGVsc2UgaWYgKCFnZW5fdXRmOHN0cmluZ3NfKSB7CisgICAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZygiIDw8IG5hbWUgPDwgIikiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoIiA8PCBuYW1lIDw8ICIuZW5jb2RlKCd1dGYtOCcpIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMiBlbHNlICIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIG91dCA8PCAid3JpdGVCb29sKCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUJ5dGUoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNigiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKSI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgIG91dCA8PCAid3JpdGVJNjQoIiA8PCBuYW1lIDw8ICIpIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSgiIDw8IG5hbWUgPDwgIikiOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gUHl0aG9uIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIikiOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJXMnIFRZUEUgJyVzJ1xuIiwKKyAgICAgICAgICAgcHJlZml4LmNfc3RyKCksCisgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICB0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICB9Cit9CisKKy8qKgorICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKKyAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7CisgICh2b2lkKXRzdHJ1Y3Q7CisgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLndyaXRlKG9wcm90KSIgPDwgZW5kbDsKK30KKwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZU1hcEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8ICJsZW4oIiA8PCBwcmVmaXggPDwgIikpIiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVNldEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgImxlbigiIDw8IHByZWZpeCA8PCAiKSkiIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUxpc3RCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpCisgICAgICAgICAgICAgICAgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8ICJsZW4oIiA8PCBwcmVmaXggPDwgIikpIiA8PCBlbmRsOworICB9CisKKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHN0cmluZyBraXRlciA9IHRtcCgia2l0ZXIiKTsKKyAgICBzdHJpbmcgdml0ZXIgPSB0bXAoInZpdGVyIik7CisgICAgaW5kZW50KG91dCkgPDwgImZvciAiIDw8IGtpdGVyIDw8ICIsICIgPDwgdml0ZXIgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiLml0ZW1zKCk6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGtpdGVyLCB2aXRlcik7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBzdHJpbmcgaXRlciA9IHRtcCgiaXRlciIpOworICAgIGluZGVudChvdXQpIDw8ICJmb3IgIiA8PCBpdGVyIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIjoiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgaXRlcik7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgc3RyaW5nIGl0ZXIgPSB0bXAoIml0ZXIiKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiZm9yICIgPDwgaXRlciA8PCAiIGluICIgPDwgcHJlZml4IDw8ICI6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgaXRlcik7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVNYXBFbmQoKSIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTZXRFbmQoKSIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlTGlzdEVuZCgpIiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KKyAqCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGtpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB2aXRlcikgeworICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2l0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCAiIik7CisKKyAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCwgIiIpOworfQorCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBzZXQuCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgaXRlcikgeworICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Cit9CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgaXRlcikgeworICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgZG9jc3RyaW5nIGZvciBhIGdpdmVuIHN0cnVjdC4KKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcob3V0LCB0c3RydWN0LCB0c3RydWN0LCAiQXR0cmlidXRlcyIpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgZG9jc3RyaW5nIGZvciBhIGdpdmVuIGZ1bmN0aW9uLgorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKG9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIGdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcob3V0LCB0ZnVuY3Rpb24sIHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSwgIlBhcmFtZXRlcnMiKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIGRvY3N0cmluZyBmb3IgYSBzdHJ1Y3Qgb3IgZnVuY3Rpb24uCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2RvYyogdGRvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHN1YmhlYWRlcikgeworICBib29sIGhhc19kb2MgPSBmYWxzZTsKKyAgc3RyaW5nc3RyZWFtIHNzOworICBpZiAodGRvYy0+aGFzX2RvYygpKSB7CisgICAgaGFzX2RvYyA9IHRydWU7CisgICAgc3MgPDwgdGRvYy0+Z2V0X2RvYygpOworICB9CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7CisgICAgaWYgKGhhc19kb2MpIHsKKyAgICAgIHNzIDw8IGVuZGw7CisgICAgfQorICAgIGhhc19kb2MgPSB0cnVlOworICAgIHNzIDw8IHN1YmhlYWRlciA8PCAiOlxuIjsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBwX2l0ZXI7CisgICAgZm9yIChwX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgcF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytwX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIHAgPSAqcF9pdGVyOworICAgICAgc3MgPDwgIiAtICIgPDwgcC0+Z2V0X25hbWUoKTsKKyAgICAgIGlmIChwLT5oYXNfZG9jKCkpIHsKKyAgICAgICAgc3MgPDwgIjogIiA8PCBwLT5nZXRfZG9jKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzcyA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChoYXNfZG9jKSB7CisgICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiXCJcIlwiXG4iLCAiIiwgc3Muc3RyKCksICJcIlwiXCJcbiIpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIHRoZSBkb2NzdHJpbmcgZm9yIGEgZ2VuZXJpYyBvYmplY3QuCisgKi8KK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcob3N0cmVhbSYgb3V0LCB0X2RvYyogdGRvYykgeworICBpZiAodGRvYy0+aGFzX2RvYygpKSB7CisgICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiXCJcIlwiXG4iLCAiIiwgdGRvYy0+Z2V0X2RvYygpLCAiXCJcIlwiXG4iKTsKKyAgfQorfQorCisvKioKKyAqIERlY2xhcmVzIGFuIGFyZ3VtZW50LCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCisgKgorICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQKKyAqLworc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjpkZWNsYXJlX2FyZ3VtZW50KHRfZmllbGQqIHRmaWVsZCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVzdWx0OworICByZXN1bHQgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICI9IjsKKyAgaWYgKHRmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgIHJlc3VsdCA8PCByZW5kZXJfZmllbGRfZGVmYXVsdF92YWx1ZSh0ZmllbGQpOworICB9IGVsc2UgeworICAgIHJlc3VsdCA8PCAiTm9uZSI7CisgIH0KKyAgcmV0dXJuIHJlc3VsdC5zdHIoKTsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZmllbGQgZGVmYXVsdCB2YWx1ZSwgcmV0dXJucyBOb25lIG90aGVyd2lzZS4KKyAqCisgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZAorICovCitzdHJpbmcgdF9weV9nZW5lcmF0b3I6OnJlbmRlcl9maWVsZF9kZWZhdWx0X3ZhbHVlKHRfZmllbGQqIHRmaWVsZCkgeworICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisgIGlmICh0ZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKKyAgICByZXR1cm4gcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHRmaWVsZC0+Z2V0X3ZhbHVlKCkpOworICB9IGVsc2UgeworICAgIHJldHVybiAiTm9uZSI7CisgIH0KK30KKworLyoqCisgKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3N0cmluZyB0X3B5X2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgYm9vbCBpbnRlcmZhY2UpIHsKKyAgdmVjdG9yPHN0cmluZz4gcHJlOworICB2ZWN0b3I8c3RyaW5nPiBwb3N0OworICBzdHJpbmcgc2lnbmF0dXJlID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIigiOworCisgIGlmICghKGdlbl96b3BlX2ludGVyZmFjZV8gJiYgaW50ZXJmYWNlKSkgeworICAgIHByZS5wdXNoX2JhY2soInNlbGYiKTsKKyAgfQorCisgIHNpZ25hdHVyZSArPSBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSwgJnByZSwgJnBvc3QpICsgIikiOworICByZXR1cm4gc2lnbmF0dXJlOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmaWVsZCBsaXN0CisgKi8KK3N0cmluZyB0X3B5X2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgdmVjdG9yPHN0cmluZz4qIHByZSwgdmVjdG9yPHN0cmluZz4qIHBvc3QpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgdmVjdG9yPHN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIHNfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGlmIChwcmUpIHsKKyAgICBmb3IgKHNfaXRlciA9IHByZS0+YmVnaW4oKTsgc19pdGVyICE9IHByZS0+ZW5kKCk7ICsrc19pdGVyKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCArPSAiLCAiOworICAgICAgfQorICAgICAgcmVzdWx0ICs9ICpzX2l0ZXI7CisgICAgfQorICB9CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICB9CisgICAgcmVzdWx0ICs9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgfQorICBpZiAocG9zdCkgeworICAgIGZvciAoc19pdGVyID0gcG9zdC0+YmVnaW4oKTsgc19pdGVyICE9IHBvc3QtPmVuZCgpOyArK3NfaXRlcikgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICAgIH0KKyAgICAgIHJlc3VsdCArPSAqc19pdGVyOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgdF9weV9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKSB7CisgIHdoaWxlICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgdHR5cGUgPSAoKHRfdHlwZWRlZiopdHR5cGUpLT5nZXRfdHlwZSgpOworICB9CisKKyAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7CisgIGlmICh0dHlwZS0+aXNfc2VydmljZSgpKSB7CisgICAgcmV0dXJuIGdldF9yZWFsX3B5X21vZHVsZShwcm9ncmFtLCBnZW5fdHdpc3RlZF8sIHBhY2thZ2VfcHJlZml4XykgKyAiLiIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKKyAgICByZXR1cm4gZ2V0X3JlYWxfcHlfbW9kdWxlKHByb2dyYW0sIGdlbl90d2lzdGVkXywgcGFja2FnZV9wcmVmaXhfKSArICIudHR5cGVzLiIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorICByZXR1cm4gdHR5cGUtPmdldF9uYW1lKCk7Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBQeXRob24gdHlvZQorICovCitzdHJpbmcgdF9weV9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICByZXR1cm4gIlRUeXBlLlNUUklORyI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJUVHlwZS5CT09MIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJUVHlwZS5CWVRFIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiVFR5cGUuSTE2IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiVFR5cGUuSTMyIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiVFR5cGUuSTY0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiVFR5cGUuRE9VQkxFIjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5JMzIiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLlNUUlVDVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLk1BUCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlLlNFVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJUVHlwZS5MSVNUIjsKKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworLyoqIFNlZSB0aGUgY29tbWVudCBpbnNpZGUgZ2VuZXJhdGVfcHlfc3RydWN0X2RlZmluaXRpb24gZm9yIHdoYXQgdGhpcyBpcy4gKi8KK3N0cmluZyB0X3B5X2dlbmVyYXRvcjo6dHlwZV90b19zcGVjX2FyZ3ModF90eXBlKiB0dHlwZSkgeworICB3aGlsZSAodHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHR0eXBlID0gKCh0X3R5cGVkZWYqKXR0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICByZXR1cm4gICInQklOQVJZJyI7CisgIH0gZWxzZSBpZiAoZ2VuX3V0ZjhzdHJpbmdzXyAmJiB0dHlwZS0+aXNfYmFzZV90eXBlKCkKKyAgICAgICAgICAgICAmJiByZWludGVycHJldF9jYXN0PHRfYmFzZV90eXBlKj4odHR5cGUpLT5pc19zdHJpbmcoKSkgeworICAgIHJldHVybiAiJ1VURjgnIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAgIk5vbmUiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiWyIgKyB0eXBlX25hbWUodHR5cGUpICsgIiwgTm9uZV0iOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiKCIgKyB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgKyAiLCAiCisgICAgICAgICAgICsgdHlwZV90b19zcGVjX2FyZ3MoKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgKyAiLCAiCisgICAgICAgICAgICsgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpICsgIiwgIgorICAgICAgICAgICArIHR5cGVfdG9fc3BlY19hcmdzKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpICsgIiwgIgorICAgICAgICAgICArIChpc19pbW11dGFibGUodHR5cGUpID8gIlRydWUiIDogIkZhbHNlIikgKyAiKSI7CisKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIigiICsgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSArICIsICIKKyAgICAgICAgICAgKyB0eXBlX3RvX3NwZWNfYXJncygoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgKyAiLCAiCisgICAgICAgICAgICsgKGlzX2ltbXV0YWJsZSh0dHlwZSkgPyAiVHJ1ZSIgOiAiRmFsc2UiKSArICIpIjsKKworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIigiICsgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgKyAiLCAiCisgICAgICAgICAgICsgdHlwZV90b19zcGVjX2FyZ3MoKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSArICIsICIKKyAgICAgICAgICAgKyAoaXNfaW1tdXRhYmxlKHR0eXBlKSA/ICJUcnVlIiA6ICJGYWxzZSIpICsgIikiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX3NwZWNfYXJnczogIiArIHR0eXBlLT5nZXRfbmFtZSgpOworfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAorICAgIHB5LAorICAgICJQeXRob24iLAorICAgICIgICAgem9wZS5pbnRlcmZhY2U6ICBHZW5lcmF0ZSBjb2RlIGZvciB1c2Ugd2l0aCB6b3BlLmludGVyZmFjZS5cbiIKKyAgICAiICAgIHR3aXN0ZWQ6ICAgICAgICAgR2VuZXJhdGUgVHdpc3RlZC1mcmllbmRseSBSUEMgc2VydmljZXMuXG4iCisgICAgIiAgICB0b3JuYWRvOiAgICAgICAgIEdlbmVyYXRlIGNvZGUgZm9yIHVzZSB3aXRoIFRvcm5hZG8uXG4iCisgICAgIiAgICBub191dGY4c3RyaW5nczogIERvIG5vdCBFbmNvZGUvZGVjb2RlIHN0cmluZ3MgdXNpbmcgdXRmOCBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUuIEJhc2ljYWxseSBubyBlZmZlY3QgZm9yIFB5dGhvbiAzLlxuIgorICAgICIgICAgY29kaW5nPUNPRElORzogICBBZGQgZmlsZSBlbmNvZGluZyBkZWNsYXJlIGluIGdlbmVyYXRlZCBmaWxlLlxuIgorICAgICIgICAgc2xvdHM6ICAgICAgICAgICBHZW5lcmF0ZSBjb2RlIHVzaW5nIHNsb3RzIGZvciBpbnN0YW5jZSBtZW1iZXJzLlxuIgorICAgICIgICAgZHluYW1pYzogICAgICAgICBHZW5lcmF0ZSBkeW5hbWljIGNvZGUsIGxlc3MgY29kZSBnZW5lcmF0ZWQgYnV0IHNsb3dlci5cbiIKKyAgICAiICAgIGR5bmJhc2U9Q0xTICAgICAgRGVyaXZlIGdlbmVyYXRlZCBjbGFzc2VzIGZyb20gY2xhc3MgQ0xTIGluc3RlYWQgb2YgVEJhc2UuXG4iCisgICAgIiAgICBkeW5mcm96ZW49Q0xTICAgIERlcml2ZSBnZW5lcmF0ZWQgaW1tdXRhYmxlIGNsYXNzZXMgZnJvbSBjbGFzcyBDTFMgaW5zdGVhZCBvZiBURnJvemVuQmFzZS5cbiIKKyAgICAiICAgIGR5bmV4Yz1DTFMgICAgICAgRGVyaXZlIGdlbmVyYXRlZCBleGNlcHRpb25zIGZyb20gQ0xTIGluc3RlYWQgb2YgVEV4Y2VwdGlvbkJhc2UuXG4iCisgICAgIiAgICBkeW5pbXBvcnQ9J2Zyb20gZm9vLmJhciBpbXBvcnQgQ0xTJ1xuIgorICAgICIgICAgICAgICAgICAgICAgICAgICBBZGQgYW4gaW1wb3J0IGxpbmUgdG8gZ2VuZXJhdGVkIGNvZGUgdG8gZmluZCB0aGUgZHluYmFzZSBjbGFzcy5cbiIKKyAgICAiICAgIHBhY2thZ2VfcHJlZml4PSd0b3AucGFja2FnZS4nXG4iCisgICAgIiAgICAgICAgICAgICAgICAgICAgIFBhY2thZ2UgcHJlZml4IGZvciBnZW5lcmF0ZWQgZmlsZXMuXG4iCisgICAgIiAgICBvbGRfc3R5bGU6ICAgICAgIERlcHJlY2F0ZWQuIEdlbmVyYXRlIG9sZC1zdHlsZSBjbGFzc2VzLlxuIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfcmJfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9yYl9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNlYTI0OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfcmJfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsMTI4OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvdmVyc2lvbi5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9mc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKKy8qKgorICogQSBzdWJjbGFzcyBvZiBzdGQ6Om9mc3RyZWFtIHRoYXQgaW5jbHVkZXMgaW5kZW50aW5nIGZ1bmN0aW9uYWxpdHkuCisgKi8KK2NsYXNzIHRfcmJfb2ZzdHJlYW0gOiBwdWJsaWMgc3RkOjpvZnN0cmVhbSB7Citwcml2YXRlOgorICBpbnQgaW5kZW50XzsKKworcHVibGljOgorICB0X3JiX29mc3RyZWFtKCkgOiBzdGQ6Om9mc3RyZWFtKCksIGluZGVudF8oMCkge30KKyAgZXhwbGljaXQgdF9yYl9vZnN0cmVhbShjb25zdCBjaGFyKiBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6b3Blbm1vZGUgbW9kZSA9IGlvc19iYXNlOjpvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGVudCA9IDApCisgICAgOiBzdGQ6Om9mc3RyZWFtKGZpbGVuYW1lLCBtb2RlKSwgaW5kZW50XyhpbmRlbnQpIHt9CisKKyAgdF9yYl9vZnN0cmVhbSYgaW5kZW50KCkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50XzsgKytpKSB7CisgICAgICAqdGhpcyA8PCAiICAiOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB2b2lkIGluZGVudF91cCgpIHsgaW5kZW50XysrOyB9CisgIHZvaWQgaW5kZW50X2Rvd24oKSB7IGluZGVudF8tLTsgfQorfTsKKworLyoqCisgKiBSdWJ5IGNvZGUgZ2VuZXJhdG9yLgorICoKKyAqLworY2xhc3MgdF9yYl9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9yYl9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIHJlcXVpcmVfcnVieWdlbXNfID0gZmFsc2U7CisgICAgbmFtZXNwYWNlZF8gPSBmYWxzZTsKKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJydWJ5Z2VtcyIpID09IDApIHsKKyAgICAgICAgcmVxdWlyZV9ydWJ5Z2Vtc18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJuYW1lc3BhY2VkIikgPT0gMCkgeworICAgICAgICBuYW1lc3BhY2VkXyA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gcnVieToiICsgaXRlci0+Zmlyc3Q7CisgICAgICB9CisgICAgfQorCisgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tcmIiOworICB9CisKKyAgLyoqCisgICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKKyAgICovCisKKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9mb3J3YXJkX2RlY2xhcmF0aW9uKHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV91bmlvbih0X3N0cnVjdCogdHVuaW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIHRfcmJfb2ZzdHJlYW0mIHJlbmRlcl9jb25zdF92YWx1ZSh0X3JiX29mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworCisgIC8qKgorICAgKiBTdHJ1Y3QgZ2VuZXJhdGlvbiBjb2RlCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfcmJfc3RydWN0X2RlY2xhcmF0aW9uKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9yYl9zdHJ1Y3QodF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3JiX3N0cnVjdF9yZXF1aXJlZF92YWxpZGF0b3IodF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfcmJfdW5pb24odF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3JiX3VuaW9uX3ZhbGlkYXRvcih0X3JiX29mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9yYl9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfcmJfc2ltcGxlX2NvbnN0cnVjdG9yKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3JiX3NpbXBsZV9leGNlcHRpb25fY29uc3RydWN0b3IodF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZmllbGRfY29uc3RhbnRzKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2ZpZWxkX2NvbnN0cnVjdG9ycyh0X3JiX29mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9maWVsZF9kZWZucyh0X3JiX29mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9maWVsZF9kYXRhKHRfcmJfb2ZzdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogZmllbGRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9wdGlvbmFsKTsKKworICAvKioKKyAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisKKyAgLyoqCisgICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHRfcmJfb2ZzdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsYXNzID0gZmFsc2UpOworCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcih0X3JiX29mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudCh0X3JiX29mc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZCh0X3JiX29mc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdCh0X3JiX29mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHRfcmJfb2ZzdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGtpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2aXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQodF9yYl9vZnN0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7CisKKyAgdm9pZCBnZW5lcmF0ZV9yZG9jKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpOworCisgIC8qKgorICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucworICAgKi8KKworICBzdGQ6OnN0cmluZyByYl9hdXRvZ2VuX2NvbW1lbnQoKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX3JlcXVpcmVfdGhyaWZ0KCk7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9pbmNsdWRlcygpOworICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZShjb25zdCB0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgZnVsbF90eXBlX25hbWUoY29uc3QgdF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgcmJfbmFtZXNwYWNlX3RvX3BhdGhfcHJlZml4KHN0ZDo6c3RyaW5nIHJiX25hbWVzcGFjZSk7CisKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHJ1YnlfbW9kdWxlcyhjb25zdCB0X3Byb2dyYW0qIHApIHsKKyAgICBzdGQ6OnN0cmluZyBucyA9IHAtPmdldF9uYW1lc3BhY2UoInJiIik7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG1vZHVsZXM7CisgICAgaWYgKG5zLmVtcHR5KCkpIHsKKyAgICAgIHJldHVybiBtb2R1bGVzOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nOjppdGVyYXRvciBwb3MgPSBucy5iZWdpbigpOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBzdGQ6OnN0cmluZzo6aXRlcmF0b3IgZGVsaW0gPSBzdGQ6OmZpbmQocG9zLCBucy5lbmQoKSwgJy4nKTsKKyAgICAgIG1vZHVsZXMucHVzaF9iYWNrKGNhcGl0YWxpemUoc3RkOjpzdHJpbmcocG9zLCBkZWxpbSkpKTsKKyAgICAgIHBvcyA9IGRlbGltOworICAgICAgaWYgKHBvcyA9PSBucy5lbmQoKSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgICsrcG9zOworICAgIH0KKworICAgIHJldHVybiBtb2R1bGVzOworICB9CisKKyAgdm9pZCBiZWdpbl9uYW1lc3BhY2UodF9yYl9vZnN0cmVhbSYsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPik7CisgIHZvaWQgZW5kX25hbWVzcGFjZSh0X3JiX29mc3RyZWFtJiwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KTsKKworcHJpdmF0ZToKKyAgLyoqCisgICAqIEZpbGUgc3RyZWFtcworICAgKi8KKworICB0X3JiX29mc3RyZWFtIGZfdHlwZXNfOworICB0X3JiX29mc3RyZWFtIGZfY29uc3RzXzsKKyAgdF9yYl9vZnN0cmVhbSBmX3NlcnZpY2VfOworCisgIHN0ZDo6c3RyaW5nIG5hbWVzcGFjZV9kaXJfOworICBzdGQ6OnN0cmluZyByZXF1aXJlX3ByZWZpeF87CisKKyAgLyoqIElmIHRydWUsIGFkZCBhICJyZXF1aXJlICdydWJ5Z2VtcyciIGxpbmUgdG8gdGhlIHRvcCBvZiBlYWNoIGdlbi1yYiBmaWxlLiAqLworICBib29sIHJlcXVpcmVfcnVieWdlbXNfOworCisgIC8qKiBJZiB0cnVlLCBnZW5lcmF0ZSBmaWxlcyBpbiBpZGlvbWF0aWMgbmFtZXNwYWNlZCBkaXJlY3Rvcmllcy4gKi8KKyAgYm9vbCBuYW1lc3BhY2VkXzsKK307CisKKy8qKgorICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKKyAqIHN0cmVhbXMuCisgKgorICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCisgKi8KK3ZvaWQgdF9yYl9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICBzdHJpbmcgc3ViZGlyID0gZ2V0X291dF9kaXIoKTsKKworICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKKyAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOworCisgIGlmIChuYW1lc3BhY2VkXykgeworICAgIHJlcXVpcmVfcHJlZml4XyA9IHJiX25hbWVzcGFjZV90b19wYXRoX3ByZWZpeChwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgicmIiKSk7CisKKyAgICBzdHJpbmcgZGlyID0gcmVxdWlyZV9wcmVmaXhfOworICAgIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKKworICAgIHdoaWxlICgobG9jID0gZGlyLmZpbmQoIi8iKSkgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgICBzdWJkaXIgPSBzdWJkaXIgKyBkaXIuc3Vic3RyKDAsIGxvYykgKyAiLyI7CisgICAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7CisgICAgICBkaXIgPSBkaXIuc3Vic3RyKGxvYyArIDEpOworICAgIH0KKyAgfQorCisgIG5hbWVzcGFjZV9kaXJfID0gc3ViZGlyOworCisgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IG5hbWVzcGFjZV9kaXJfICsgdW5kZXJzY29yZShwcm9ncmFtX25hbWVfKSArICJfdHlwZXMucmIiOworICBmX3R5cGVzXy5vcGVuKGZfdHlwZXNfbmFtZS5jX3N0cigpKTsKKworICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IG5hbWVzcGFjZV9kaXJfICsgdW5kZXJzY29yZShwcm9ncmFtX25hbWVfKSArICJfY29uc3RhbnRzLnJiIjsKKyAgZl9jb25zdHNfLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKKworICAvLyBQcmludCBoZWFkZXIKKyAgZl90eXBlc18gPDwgcmJfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PCByZW5kZXJfcmVxdWlyZV90aHJpZnQoKSA8PCByZW5kZXJfaW5jbHVkZXMoKSA8PCBlbmRsOworICBiZWdpbl9uYW1lc3BhY2UoZl90eXBlc18sIHJ1YnlfbW9kdWxlcyhwcm9ncmFtXykpOworCisgIGZfY29uc3RzXyA8PCByYl9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8IHJlbmRlcl9yZXF1aXJlX3RocmlmdCgpIDw8ICJyZXF1aXJlICciCisgICAgICAgICAgICA8PCByZXF1aXJlX3ByZWZpeF8gPDwgdW5kZXJzY29yZShwcm9ncmFtX25hbWVfKSA8PCAiX3R5cGVzJyIgPDwgZW5kbCA8PCBlbmRsOworICBiZWdpbl9uYW1lc3BhY2UoZl9jb25zdHNfLCBydWJ5X21vZHVsZXMocHJvZ3JhbV8pKTsKK30KKworLyoqCisgKiBSZW5kZXJzIHRoZSByZXF1aXJlIG9mIHRocmlmdCBpdHNlbGYsIGFuZCBwb3NzaWJseSBvZiB0aGUgcnVieWdlbXMgZGVwZW5kZW5jeS4KKyAqLworc3RyaW5nIHRfcmJfZ2VuZXJhdG9yOjpyZW5kZXJfcmVxdWlyZV90aHJpZnQoKSB7CisgIGlmIChyZXF1aXJlX3J1YnlnZW1zXykgeworICAgIHJldHVybiAicmVxdWlyZSAncnVieWdlbXMnXG5yZXF1aXJlICd0aHJpZnQnXG4iOworICB9IGVsc2UgeworICAgIHJldHVybiAicmVxdWlyZSAndGhyaWZ0J1xuIjsKKyAgfQorfQorCisvKioKKyAqIFJlbmRlcnMgYWxsIHRoZSBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgaW5jbHVkaW5nIGFub3RoZXIgVGhyaWZ0IHByb2dyYW0KKyAqLworc3RyaW5nIHRfcmJfZ2VuZXJhdG9yOjpyZW5kZXJfaW5jbHVkZXMoKSB7CisgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgeworICAgIGlmIChuYW1lc3BhY2VkXykgeworICAgICAgdF9wcm9ncmFtKiBpbmNsdWRlZCA9IGluY2x1ZGVzW2ldOworICAgICAgc3RkOjpzdHJpbmcgaW5jbHVkZWRfcmVxdWlyZV9wcmVmaXgKKyAgICAgICAgICA9IHJiX25hbWVzcGFjZV90b19wYXRoX3ByZWZpeChpbmNsdWRlZC0+Z2V0X25hbWVzcGFjZSgicmIiKSk7CisgICAgICBzdGQ6OnN0cmluZyBpbmNsdWRlZF9uYW1lID0gaW5jbHVkZWQtPmdldF9uYW1lKCk7CisgICAgICByZXN1bHQgKz0gInJlcXVpcmUgJyIgKyBpbmNsdWRlZF9yZXF1aXJlX3ByZWZpeCArIHVuZGVyc2NvcmUoaW5jbHVkZWRfbmFtZSkgKyAiX3R5cGVzJ1xuIjsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICJyZXF1aXJlICciICsgdW5kZXJzY29yZShpbmNsdWRlc1tpXS0+Z2V0X25hbWUoKSkgKyAiX3R5cGVzJ1xuIjsKKyAgICB9CisgIH0KKyAgaWYgKGluY2x1ZGVzLnNpemUoKSA+IDApIHsKKyAgICByZXN1bHQgKz0gIlxuIjsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIEF1dG9nZW4nZCBjb21tZW50CisgKi8KK3N0cmluZyB0X3JiX2dlbmVyYXRvcjo6cmJfYXV0b2dlbl9jb21tZW50KCkgeworICByZXR1cm4gc3RkOjpzdHJpbmcoIiNcbiIpICsgIiMgQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKCIgKyBUSFJJRlRfVkVSU0lPTiArICIpXG4iCisgICAgICAgICArICIjXG4iICsgIiMgRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lOR1xuIiArICIjXG4iOworfQorCisvKioKKyAqIENsb3NlcyB0aGUgdHlwZSBmaWxlcworICovCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7CisgIC8vIENsb3NlIHR5cGVzIGZpbGUKKyAgZW5kX25hbWVzcGFjZShmX3R5cGVzXywgcnVieV9tb2R1bGVzKHByb2dyYW1fKSk7CisgIGVuZF9uYW1lc3BhY2UoZl9jb25zdHNfLCBydWJ5X21vZHVsZXMocHJvZ3JhbV8pKTsKKyAgZl90eXBlc18uY2xvc2UoKTsKKyAgZl9jb25zdHNfLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBub3QgZG9uZSBpbiBSdWJ5LCB0eXBlcyBhcmUgYWxsIGltcGxpY2l0LgorICoKKyAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICAodm9pZCl0dHlwZWRlZjsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgY29kZSBmb3IgYW4gZW51bWVyYXRlZCB0eXBlLiBEb25lIHVzaW5nIGEgY2xhc3MgdG8gc2NvcGUKKyAqIHRoZSB2YWx1ZXMuCisgKgorICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgorICovCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgZl90eXBlc18uaW5kZW50KCkgPDwgIm1vZHVsZSAiIDw8IGNhcGl0YWxpemUodGVudW0tPmdldF9uYW1lKCkpIDw8IGVuZGw7CisgIGZfdHlwZXNfLmluZGVudF91cCgpOworCisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworCisgICAgLy8gUnVieSBjbGFzcyBjb25zdGFudHMgaGF2ZSB0byBiZSBjYXBpdGFsaXplZC4uLiBvbWcgaSBhbSBzbyBvbiB0aGUgZmVuY2UKKyAgICAvLyBhYm91dCBsYW5ndWFnZXMgc3RyaWN0bHkgZW5mb3JjaW5nIGNhcGl0YWxpemF0aW9uIHdoeSBjYW4ndCB3ZSBqdXN0IGFsbAorICAgIC8vIGFncmVlIGFuZCBwbGF5IG5pY2UuCisgICAgc3RyaW5nIG5hbWUgPSBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSk7CisKKyAgICBnZW5lcmF0ZV9yZG9jKGZfdHlwZXNfLCAqY19pdGVyKTsKKyAgICBmX3R5cGVzXy5pbmRlbnQoKSA8PCBuYW1lIDw8ICIgPSAiIDw8IHZhbHVlIDw8IGVuZGw7CisgIH0KKworICAvLyBDcmVhdGUgYSBoYXNoIG1hcHBpbmcgdmFsdWVzIGJhY2sgdG8gdGhlaXIgbmFtZXMgKGFzIHN0cmluZ3MpIHNpbmNlIHJ1YnkgaGFzIG5vIG5hdGl2ZSBlbnVtCisgIC8vIHR5cGUKKyAgZl90eXBlc18uaW5kZW50KCkgPDwgIlZBTFVFX01BUCA9IHsiOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIC8vIFBvcHVsYXRlIHRoZSBoYXNoCisgICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKyAgICBpZiAoY19pdGVyICE9IGNvbnN0YW50cy5iZWdpbigpKQorICAgICAgZl90eXBlc18gPDwgIiwgIjsKKyAgICBmX3R5cGVzXyA8PCB2YWx1ZSA8PCAiID0+IFwiIiA8PCBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIlwiIjsKKyAgfQorICBmX3R5cGVzXyA8PCAifSIgPDwgZW5kbDsKKworICAvLyBDcmVhdGUgYSBzZXQgd2l0aCB2YWxpZCB2YWx1ZXMgZm9yIHRoaXMgZW51bQorICBmX3R5cGVzXy5pbmRlbnQoKSA8PCAiVkFMSURfVkFMVUVTID0gU2V0Lm5ldyhbIjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICAvLyBQb3B1bGF0ZSB0aGUgc2V0CisgICAgaWYgKGNfaXRlciAhPSBjb25zdGFudHMuYmVnaW4oKSkKKyAgICAgIGZfdHlwZXNfIDw8ICIsICI7CisgICAgZl90eXBlc18gPDwgY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOworICB9CisgIGZfdHlwZXNfIDw8ICJdKS5mcmVlemUiIDw8IGVuZGw7CisKKyAgZl90eXBlc18uaW5kZW50X2Rvd24oKTsKKyAgZl90eXBlc18uaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlIGEgY29uc3RhbnQgdmFsdWUKKyAqLwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7CisgIHRfdHlwZSogdHlwZSA9IHRjb25zdC0+Z2V0X3R5cGUoKTsKKyAgc3RyaW5nIG5hbWUgPSB0Y29uc3QtPmdldF9uYW1lKCk7CisgIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gdGNvbnN0LT5nZXRfdmFsdWUoKTsKKworICBuYW1lWzBdID0gdG91cHBlcihuYW1lWzBdKTsKKworICBmX2NvbnN0c18uaW5kZW50KCkgPDwgbmFtZSA8PCAiID0gIjsKKyAgcmVuZGVyX2NvbnN0X3ZhbHVlKGZfY29uc3RzXywgdHlwZSwgdmFsdWUpIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKKyAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCisgKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYworICovCit0X3JiX29mc3RyZWFtJiB0X3JiX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfcmJfb2ZzdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIG91dCA8PCAiJXFcIiIgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBvdXQgPDwgKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIG91dC5pbmRlbnQoKSA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgb3V0IDw8IGZ1bGxfdHlwZV9uYW1lKHR5cGUpIDw8ICIubmV3KHsiIDw8IGVuZGw7CisgICAgb3V0LmluZGVudF91cCgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisgICAgICBvdXQuaW5kZW50KCk7CisgICAgICByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBnX3R5cGVfc3RyaW5nLCB2X2l0ZXItPmZpcnN0KSA8PCAiID0+ICI7CisgICAgICByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCkgPDwgIiwiIDw8IGVuZGw7CisgICAgfQorICAgIG91dC5pbmRlbnRfZG93bigpOworICAgIG91dC5pbmRlbnQoKSA8PCAifSkiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKKyAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworICAgIG91dCA8PCAieyIgPDwgZW5kbDsKKyAgICBvdXQuaW5kZW50X3VwKCk7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgb3V0LmluZGVudCgpOworICAgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwga3R5cGUsIHZfaXRlci0+Zmlyc3QpIDw8ICIgPT4gIjsKKyAgICAgIHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIHZ0eXBlLCB2X2l0ZXItPnNlY29uZCkgPDwgIiwiIDw8IGVuZGw7CisgICAgfQorICAgIG91dC5pbmRlbnRfZG93bigpOworICAgIG91dC5pbmRlbnQoKSA8PCAifSI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF90eXBlKiBldHlwZTsKKyAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0gZWxzZSB7CisgICAgICBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfQorICAgIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgICAgb3V0IDw8ICJTZXQubmV3KFsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiWyIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0LmluZGVudF91cCgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgb3V0LmluZGVudCgpOworICAgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgZXR5cGUsICp2X2l0ZXIpIDw8ICIsIiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQuaW5kZW50X2Rvd24oKTsKKyAgICBpZiAodHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIG91dC5pbmRlbnQoKSA8PCAiXSkiOworICAgIH0gZWxzZSB7CisgICAgICBvdXQuaW5kZW50KCkgPDwgIl0iOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIENPTlNUQU5UIEZPUiBUWVBFOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorICByZXR1cm4gb3V0OworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHJ1Ynkgc3RydWN0CisgKi8KK3ZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBpZiAodHN0cnVjdC0+aXNfdW5pb24oKSkgeworICAgIGdlbmVyYXRlX3JiX3VuaW9uKGZfdHlwZXNfLCB0c3RydWN0LCBmYWxzZSk7CisgIH0gZWxzZSB7CisgICAgZ2VuZXJhdGVfcmJfc3RydWN0KGZfdHlwZXNfLCB0c3RydWN0LCBmYWxzZSk7CisgIH0KK30KKworCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgImZvcndhcmQgZGVjbGFyYXRpb25zIiBmb3IgcnVieSBzdHJ1Y3RzLgorICogVGhlc2UgYXJlIHNpbXBseSBhIGRlY2xhcmF0aW9uIG9mIGVhY2ggY2xhc3Mgd2l0aCBwcm9wZXIgaW5oZXJpdGFuY2UuCisgKiBUaGUgcmVzdCBvZiB0aGUgc3RydWN0IGlzIHN0aWxsIGdlbmVyYXRlZCBpbiBnZW5lcmF0ZV9zdHJ1Y3QgYXMgaGFzCisgKiBhbHdheXMgYmVlbiB0aGUgY2FzZS4gVGhlc2UgZGVjbGFyYXRpb25zIGFsbG93IHRocmlmdCB0byBnZW5lcmF0ZSB2YWxpZAorICogcnVieSBpbiBjYXNlcyB3aGVyZSB0aHJpZnQgc3RydWN0cyByZWx5IG9uIHJlY3Vyc2l2ZSBkZWZpbml0aW9ucy4KKyAqLwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZm9yd2FyZF9kZWNsYXJhdGlvbih0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9yYl9zdHJ1Y3RfZGVjbGFyYXRpb24oZl90eXBlc18sIHRzdHJ1Y3QsIHRzdHJ1Y3QtPmlzX3hjZXB0aW9uKCkpOworfQorCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yYl9zdHJ1Y3RfZGVjbGFyYXRpb24odF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKKyAgb3V0LmluZGVudCgpIDw8ICJjbGFzcyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KTsKKyAgaWYgKHRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKKyAgICBvdXQgPDwgIiA8IDo6VGhyaWZ0OjpVbmlvbiI7CisgIH0KKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIG91dCA8PCAiIDwgOjpUaHJpZnQ6OkV4Y2VwdGlvbiI7CisgIH0KKyAgb3V0IDw8ICI7IGVuZCIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBleGNlcHRpb24uIEJhc2ljYWxseSB0aGUgc2FtZQorICogYXMgYSBzdHJ1Y3QgYnV0IGV4dGVuZHMgdGhlIEV4Y2VwdGlvbiBjbGFzcy4KKyAqCisgKiBAcGFyYW0gdHhjZXB0aW9uIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX3JiX3N0cnVjdChmX3R5cGVzXywgdHhjZXB0aW9uLCB0cnVlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBydWJ5IHN0cnVjdAorICovCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yYl9zdHJ1Y3QodF9yYl9vZnN0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uID0gZmFsc2UpIHsKKyAgZ2VuZXJhdGVfcmRvYyhvdXQsIHRzdHJ1Y3QpOworICBvdXQuaW5kZW50KCkgPDwgImNsYXNzICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpOworICBpZiAoaXNfZXhjZXB0aW9uKSB7CisgICAgb3V0IDw8ICIgPCA6OlRocmlmdDo6RXhjZXB0aW9uIjsKKyAgfQorICBvdXQgPDwgZW5kbDsKKworICBvdXQuaW5kZW50X3VwKCk7CisgIG91dC5pbmRlbnQoKSA8PCAiaW5jbHVkZSA6OlRocmlmdDo6U3RydWN0LCA6OlRocmlmdDo6U3RydWN0X1VuaW9uIiA8PCBlbmRsOworCisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBnZW5lcmF0ZV9yYl9zaW1wbGVfZXhjZXB0aW9uX2NvbnN0cnVjdG9yKG91dCwgdHN0cnVjdCk7CisgIH0KKworICBnZW5lcmF0ZV9maWVsZF9jb25zdGFudHMob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfZmllbGRfZGVmbnMob3V0LCB0c3RydWN0KTsKKyAgZ2VuZXJhdGVfcmJfc3RydWN0X3JlcXVpcmVkX3ZhbGlkYXRvcihvdXQsIHRzdHJ1Y3QpOworCisgIG91dC5pbmRlbnQoKSA8PCAiOjpUaHJpZnQ6OlN0cnVjdC5nZW5lcmF0ZV9hY2Nlc3NvcnMgc2VsZiIgPDwgZW5kbDsKKworICBvdXQuaW5kZW50X2Rvd24oKTsKKyAgb3V0LmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBydWJ5IHVuaW9uCisgKi8KK3ZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3JiX3VuaW9uKHRfcmJfb2ZzdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24gPSBmYWxzZSkgeworICAodm9pZClpc19leGNlcHRpb247CisgIGdlbmVyYXRlX3Jkb2Mob3V0LCB0c3RydWN0KTsKKyAgb3V0LmluZGVudCgpIDw8ICJjbGFzcyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiIDwgOjpUaHJpZnQ6OlVuaW9uIiA8PCBlbmRsOworCisgIG91dC5pbmRlbnRfdXAoKTsKKyAgb3V0LmluZGVudCgpIDw8ICJpbmNsdWRlIDo6VGhyaWZ0OjpTdHJ1Y3RfVW5pb24iIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZmllbGRfY29uc3RydWN0b3JzKG91dCwgdHN0cnVjdCk7CisKKyAgZ2VuZXJhdGVfZmllbGRfY29uc3RhbnRzKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX2ZpZWxkX2RlZm5zKG91dCwgdHN0cnVjdCk7CisgIGdlbmVyYXRlX3JiX3VuaW9uX3ZhbGlkYXRvcihvdXQsIHRzdHJ1Y3QpOworCisgIG91dC5pbmRlbnQoKSA8PCAiOjpUaHJpZnQ6OlVuaW9uLmdlbmVyYXRlX2FjY2Vzc29ycyBzZWxmIiA8PCBlbmRsOworCisgIG91dC5pbmRlbnRfZG93bigpOworICBvdXQuaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9maWVsZF9jb25zdHJ1Y3RvcnModF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworCisgIG91dC5pbmRlbnQoKSA8PCAiY2xhc3MgPDwgc2VsZiIgPDwgZW5kbDsKKyAgb3V0LmluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmX2l0ZXIgIT0gZmllbGRzLmJlZ2luKCkpIHsKKyAgICAgIG91dCA8PCBlbmRsOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgb3V0LmluZGVudCgpIDw8ICJkZWYgIiA8PCBmaWVsZF9uYW1lIDw8ICIodmFsKSIgPDwgZW5kbDsKKyAgICBvdXQuaW5kZW50KCkgPDwgIiAgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIubmV3KDoiIDw8IGZpZWxkX25hbWUgPDwgIiwgdmFsKSIgPDwgZW5kbDsKKyAgICBvdXQuaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbDsKKyAgfQorCisgIG91dC5pbmRlbnRfZG93bigpOworICBvdXQuaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbDsKKworICBvdXQgPDwgZW5kbDsKK30KKwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmJfc2ltcGxlX2V4Y2VwdGlvbl9jb25zdHJ1Y3Rvcih0X3JiX29mc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworCisgIGlmIChtZW1iZXJzLnNpemUoKSA9PSAxKSB7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyID0gbWVtYmVycy5iZWdpbigpOworCisgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKS0+aXNfc3RyaW5nKCkpIHsKKyAgICAgIHN0cmluZyBuYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgICBvdXQuaW5kZW50KCkgPDwgImRlZiBpbml0aWFsaXplKG1lc3NhZ2U9bmlsKSIgPDwgZW5kbDsKKyAgICAgIG91dC5pbmRlbnRfdXAoKTsKKyAgICAgIG91dC5pbmRlbnQoKSA8PCAic3VwZXIoKSIgPDwgZW5kbDsKKyAgICAgIG91dC5pbmRlbnQoKSA8PCAic2VsZi4iIDw8IG5hbWUgPDwgIiA9IG1lc3NhZ2UiIDw8IGVuZGw7CisgICAgICBvdXQuaW5kZW50X2Rvd24oKTsKKyAgICAgIG91dC5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAgIGlmIChuYW1lICE9ICJtZXNzYWdlIikgeworICAgICAgICBvdXQuaW5kZW50KCkgPDwgImRlZiBtZXNzYWdlOyAiIDw8IG5hbWUgPDwgIiBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRfY29uc3RhbnRzKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBzdGQ6OnN0cmluZyBjYXBfZmllbGRfbmFtZSA9IHVwY2FzZV9zdHJpbmcoZmllbGRfbmFtZSk7CisKKyAgICBvdXQuaW5kZW50KCkgPDwgY2FwX2ZpZWxkX25hbWUgPDwgIiA9ICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgZW5kbDsKKyAgfQorICBvdXQgPDwgZW5kbDsKK30KKwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRfZGVmbnModF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgb3V0LmluZGVudCgpIDw8ICJGSUVMRFMgPSB7IiA8PCBlbmRsOworICBvdXQuaW5kZW50X3VwKCk7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZfaXRlciAhPSBmaWVsZHMuYmVnaW4oKSkgeworICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOworICAgIH0KKworICAgIC8vIGdlbmVyYXRlIHRoZSBmaWVsZCBkb2NzdHJpbmdzIHdpdGhpbiB0aGUgRklFTERTIGNvbnN0YW50LiBubyByZWFsIGJldHRlciBwbGFjZS4uLgorICAgIGdlbmVyYXRlX3Jkb2Mob3V0LCAqZl9pdGVyKTsKKworICAgIG91dC5pbmRlbnQoKSA8PCB1cGNhc2Vfc3RyaW5nKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA9PiAiOworCisgICAgZ2VuZXJhdGVfZmllbGRfZGF0YShvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF90eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF92YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCk7CisgIH0KKyAgb3V0LmluZGVudF9kb3duKCk7CisgIG91dCA8PCBlbmRsOworICBvdXQuaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBvdXQuaW5kZW50KCkgPDwgImRlZiBzdHJ1Y3RfZmllbGRzOyBGSUVMRFM7IGVuZCIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9maWVsZF9kYXRhKHRfcmJfb2ZzdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiBmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmllbGRfbmFtZSA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiBmaWVsZF92YWx1ZSA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb3B0aW9uYWwgPSBmYWxzZSkgeworICBmaWVsZF90eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZF90eXBlKTsKKworICAvLyBCZWdpbiB0aGlzIGZpZWxkJ3MgZGVmbgorICBvdXQgPDwgIns6dHlwZSA9PiAiIDw8IHR5cGVfdG9fZW51bShmaWVsZF90eXBlKTsKKworICBpZiAoIWZpZWxkX25hbWUuZW1wdHkoKSkgeworICAgIG91dCA8PCAiLCA6bmFtZSA9PiAnIiA8PCBmaWVsZF9uYW1lIDw8ICInIjsKKyAgfQorCisgIGlmIChmaWVsZF92YWx1ZSAhPSBOVUxMKSB7CisgICAgb3V0IDw8ICIsIDpkZWZhdWx0ID0+ICI7CisgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgZmllbGRfdHlwZSwgZmllbGRfdmFsdWUpOworICB9CisKKyAgaWYgKCFmaWVsZF90eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIGlmIChmaWVsZF90eXBlLT5pc19zdHJ1Y3QoKSB8fCBmaWVsZF90eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgICBvdXQgPDwgIiwgOmNsYXNzID0+ICIgPDwgZnVsbF90eXBlX25hbWUoKHRfc3RydWN0KilmaWVsZF90eXBlKTsKKyAgICB9IGVsc2UgaWYgKGZpZWxkX3R5cGUtPmlzX2xpc3QoKSkgeworICAgICAgb3V0IDw8ICIsIDplbGVtZW50ID0+ICI7CisgICAgICBnZW5lcmF0ZV9maWVsZF9kYXRhKG91dCwgKCh0X2xpc3QqKWZpZWxkX3R5cGUpLT5nZXRfZWxlbV90eXBlKCkpOworICAgIH0gZWxzZSBpZiAoZmllbGRfdHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgIG91dCA8PCAiLCA6a2V5ID0+ICI7CisgICAgICBnZW5lcmF0ZV9maWVsZF9kYXRhKG91dCwgKCh0X21hcCopZmllbGRfdHlwZSktPmdldF9rZXlfdHlwZSgpKTsKKyAgICAgIG91dCA8PCAiLCA6dmFsdWUgPT4gIjsKKyAgICAgIGdlbmVyYXRlX2ZpZWxkX2RhdGEob3V0LCAoKHRfbWFwKilmaWVsZF90eXBlKS0+Z2V0X3ZhbF90eXBlKCkpOworICAgIH0gZWxzZSBpZiAoZmllbGRfdHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIG91dCA8PCAiLCA6ZWxlbWVudCA9PiAiOworICAgICAgZ2VuZXJhdGVfZmllbGRfZGF0YShvdXQsICgodF9zZXQqKWZpZWxkX3R5cGUpLT5nZXRfZWxlbV90eXBlKCkpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoKCh0X2Jhc2VfdHlwZSopZmllbGRfdHlwZSktPmlzX2JpbmFyeSgpKSB7CisgICAgICBvdXQgPDwgIiwgOmJpbmFyeSA9PiB0cnVlIjsKKyAgICB9CisgIH0KKworICBpZiAob3B0aW9uYWwpIHsKKyAgICBvdXQgPDwgIiwgOm9wdGlvbmFsID0+IHRydWUiOworICB9CisKKyAgaWYgKGZpZWxkX3R5cGUtPmlzX2VudW0oKSkgeworICAgIG91dCA8PCAiLCA6ZW51bV9jbGFzcyA9PiAiIDw8IGZ1bGxfdHlwZV9uYW1lKGZpZWxkX3R5cGUpOworICB9CisKKyAgLy8gRW5kIG9mIHRoaXMgZmllbGQncyBkZWZuCisgIG91dCA8PCAifSI7Cit9CisKK3ZvaWQgdF9yYl9nZW5lcmF0b3I6OmJlZ2luX25hbWVzcGFjZSh0X3JiX29mc3RyZWFtJiBvdXQsIHZlY3RvcjxzdGQ6OnN0cmluZz4gbW9kdWxlcykgeworICBmb3IgKHZlY3RvcjxzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIG1faXRlciA9IG1vZHVsZXMuYmVnaW4oKTsgbV9pdGVyICE9IG1vZHVsZXMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgb3V0LmluZGVudCgpIDw8ICJtb2R1bGUgIiA8PCAqbV9pdGVyIDw8IGVuZGw7CisgICAgb3V0LmluZGVudF91cCgpOworICB9Cit9CisKK3ZvaWQgdF9yYl9nZW5lcmF0b3I6OmVuZF9uYW1lc3BhY2UodF9yYl9vZnN0cmVhbSYgb3V0LCB2ZWN0b3I8c3RkOjpzdHJpbmc+IG1vZHVsZXMpIHsKKyAgZm9yICh2ZWN0b3I8c3RkOjpzdHJpbmc+OjpyZXZlcnNlX2l0ZXJhdG9yIG1faXRlciA9IG1vZHVsZXMucmJlZ2luKCk7IG1faXRlciAhPSBtb2R1bGVzLnJlbmQoKTsKKyAgICAgICArK21faXRlcikgeworICAgIG91dC5pbmRlbnRfZG93bigpOworICAgIG91dC5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IG5hbWVzcGFjZV9kaXJfICsgdW5kZXJzY29yZShzZXJ2aWNlX25hbWVfKSArICIucmIiOworICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7CisKKyAgZl9zZXJ2aWNlXyA8PCByYl9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8IHJlbmRlcl9yZXF1aXJlX3RocmlmdCgpOworCisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgaWYgKG5hbWVzcGFjZWRfKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICJyZXF1aXJlICciIDw8IHJiX25hbWVzcGFjZV90b19wYXRoX3ByZWZpeCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZXNwYWNlKCJyYiIpKQorICAgICAgICAgICAgICAgICA8PCB1bmRlcnNjb3JlKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpKSA8PCAiJyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCAicmVxdWlyZSAnIiA8PCByZXF1aXJlX3ByZWZpeF8KKyAgICAgICAgICAgICAgICAgPDwgdW5kZXJzY29yZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSkgPDwgIiciIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgZl9zZXJ2aWNlXyA8PCAicmVxdWlyZSAnIiA8PCByZXF1aXJlX3ByZWZpeF8gPDwgdW5kZXJzY29yZShwcm9ncmFtX25hbWVfKSA8PCAiX3R5cGVzJyIgPDwgZW5kbAorICAgICAgICAgICAgIDw8IGVuZGw7CisKKyAgYmVnaW5fbmFtZXNwYWNlKGZfc2VydmljZV8sIHJ1YnlfbW9kdWxlcyh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkpOworCisgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgIm1vZHVsZSAiIDw8IGNhcGl0YWxpemUodHNlcnZpY2UtPmdldF9uYW1lKCkpIDw8IGVuZGw7CisgIGZfc2VydmljZV8uaW5kZW50X3VwKCk7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHRocmVlIG1haW4gcGFydHMgb2YgdGhlIHNlcnZpY2UgKHdlbGwsIHR3byBmb3Igbm93IGluIFBIUCkKKyAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOworICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7CisgIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7CisKKyAgZl9zZXJ2aWNlXy5pbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKKworICBlbmRfbmFtZXNwYWNlKGZfc2VydmljZV8sIHJ1YnlfbW9kdWxlcyh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkpOworCisgIC8vIENsb3NlIHNlcnZpY2UgZmlsZQorICBmX3NlcnZpY2VfLmNsb3NlKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGhlbHBlciBmdW5jdGlvbnMgZm9yIGEgc2VydmljZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiIyBIRUxQRVIgRlVOQ1RJT05TIEFORCBTVFJVQ1RVUkVTIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgZ2VuZXJhdGVfcmJfc3RydWN0KGZfc2VydmljZV8sIHRzKTsKKyAgICBnZW5lcmF0ZV9yYl9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOworICB9Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCisgKi8KK3ZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3JiX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKKyAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKKyAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOworICB9CisKKyAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKKyAgfQorICBnZW5lcmF0ZV9yYl9zdHJ1Y3QoZl9zZXJ2aWNlXywgJnJlc3VsdCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSBmdWxsX3R5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgZXh0ZW5kc19jbGllbnQgPSAiIDwgIiArIGV4dGVuZHMgKyAiOjpDbGllbnQgIjsKKyAgfQorCisgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImNsYXNzIENsaWVudCIgPDwgZXh0ZW5kc19jbGllbnQgPDwgZW5kbDsKKyAgZl9zZXJ2aWNlXy5pbmRlbnRfdXAoKTsKKworICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJpbmNsdWRlIDo6VGhyaWZ0OjpDbGllbnQiIDw8IGVuZGwgPDwgZW5kbDsKKworICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOworICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImRlZiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOworICAgIGZfc2VydmljZV8uaW5kZW50X3VwKCk7CisgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAic2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiOworCisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOworICAgICAgfQorICAgICAgZl9zZXJ2aWNlXyA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiKSIgPDwgZW5kbDsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKTsKKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAicmV0dXJuICI7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8ICJyZWN2XyIgPDwgZnVubmFtZSA8PCAiKCkiIDw8IGVuZGw7CisgICAgfQorICAgIGZfc2VydmljZV8uaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGw7CisgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworCisgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiZGVmIHNlbmRfIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKKyAgICBmX3NlcnZpY2VfLmluZGVudF91cCgpOworCisgICAgc3RkOjpzdHJpbmcgYXJnc25hbWUgPSBjYXBpdGFsaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfYXJncyIpOworICAgIHN0ZDo6c3RyaW5nIG1lc3NhZ2VTZW5kUHJvYyA9ICgqZl9pdGVyKS0+aXNfb25ld2F5KCkgPyAic2VuZF9vbmV3YXlfbWVzc2FnZSIgOiAic2VuZF9tZXNzYWdlIjsKKworICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgbWVzc2FnZVNlbmRQcm9jIDw8ICIoJyIgPDwgZnVubmFtZSA8PCAiJywgIiA8PCBhcmdzbmFtZTsKKworICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIsIDoiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPT4gIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICB9CisKKyAgICBmX3NlcnZpY2VfIDw8ICIpIiA8PCBlbmRsOworCisgICAgZl9zZXJ2aWNlXy5pbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbDsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0bmFtZSA9IGNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKKyAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7CisKKyAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MpOworICAgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOworICAgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiZGVmICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uKSA8PCBlbmRsOworICAgICAgZl9zZXJ2aWNlXy5pbmRlbnRfdXAoKTsKKworICAgICAgLy8gVE9ETyhtY3NsZWUpOiBWYWxpZGF0ZSBtZXNzYWdlIHJlcGx5IGhlcmUsIHNlcSBpZHMgZXRjLgorCisgICAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJyZXN1bHQgPSByZWNlaXZlX21lc3NhZ2UoIiA8PCByZXN1bHRuYW1lIDw8ICIpIiA8PCBlbmRsOworCisgICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KKyAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAicmV0dXJuIHJlc3VsdC5zdWNjZXNzIHVubGVzcyByZXN1bHQuc3VjY2Vzcy5uaWw/IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJyYWlzZSByZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiB1bmxlc3MgcmVzdWx0LiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIi5uaWw/IiA8PCBlbmRsOworICAgICAgfQorCisgICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KKyAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJyZXR1cm4iIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJyYWlzZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjo6VGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbi5uZXcoOjpUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uOjoiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1JU1NJTkdfUkVTVUxULCAnIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHQnKSIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgICAgIGZfc2VydmljZV8uaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIGZfc2VydmljZV8uaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIGV4dGVuZHMgPSBmdWxsX3R5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIDwgIiArIGV4dGVuZHMgKyAiOjpQcm9jZXNzb3IgIjsKKyAgfQorCisgIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgorICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJjbGFzcyBQcm9jZXNzb3IiIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8IGVuZGw7CisgIGZfc2VydmljZV8uaW5kZW50X3VwKCk7CisKKyAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiaW5jbHVkZSA6OlRocmlmdDo6UHJvY2Vzc29yIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7CisgIH0KKworICBmX3NlcnZpY2VfLmluZGVudF9kb3duKCk7CisgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCisgKi8KK3ZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgICh2b2lkKXRzZXJ2aWNlOworICAvLyBPcGVuIGZ1bmN0aW9uCisgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImRlZiBwcm9jZXNzXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoc2VxaWQsIGlwcm90LCBvcHJvdCkiIDw8IGVuZGw7CisgIGZfc2VydmljZV8uaW5kZW50X3VwKCk7CisKKyAgc3RyaW5nIGFyZ3NuYW1lID0gY2FwaXRhbGl6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgIl9hcmdzIjsKKyAgc3RyaW5nIHJlc3VsdG5hbWUgPSBjYXBpdGFsaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiX3Jlc3VsdCI7CisKKyAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiYXJncyA9IHJlYWRfYXJncyhpcHJvdCwgIiA8PCBhcmdzbmFtZSA8PCAiKSIgPDwgZW5kbDsKKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworCisgIC8vIERlY2xhcmUgcmVzdWx0IGZvciBub24gb25ld2F5IGZ1bmN0aW9uCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgInJlc3VsdCA9ICIgPDwgcmVzdWx0bmFtZSA8PCAiLm5ldygpIiA8PCBlbmRsOworICB9CisKKyAgLy8gVHJ5IGJsb2NrIGZvciBhIGZ1bmN0aW9uIHdpdGggZXhjZXB0aW9ucworICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKKyAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgICBmX3NlcnZpY2VfLmluZGVudF91cCgpOworICB9CisKKyAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKKyAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGZfc2VydmljZV8uaW5kZW50KCk7CisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICBmX3NlcnZpY2VfIDw8ICJyZXN1bHQuc3VjY2VzcyA9ICI7CisgIH0KKyAgZl9zZXJ2aWNlXyA8PCAiQGhhbmRsZXIuIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgfQorICBmX3NlcnZpY2VfIDw8ICIpIiA8PCBlbmRsOworCisgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiB4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgeworICAgIGZfc2VydmljZV8uaW5kZW50X2Rvd24oKTsKKyAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAicmVzY3VlICIgPDwgZnVsbF90eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiID0+ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGVuZGw7CisgICAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXy5pbmRlbnRfdXAoKTsKKyAgICAgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgIGZfc2VydmljZV8uaW5kZW50X2Rvd24oKTsKKyAgICAgIH0KKyAgICB9CisgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsOworICB9CisKKyAgLy8gU2hvcnRjdXQgb3V0IGhlcmUgZm9yIG9uZXdheSBmdW5jdGlvbnMKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJyZXR1cm4iIDw8IGVuZGw7CisgICAgZl9zZXJ2aWNlXy5pbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOworICAgIHJldHVybjsKKyAgfQorCisgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgIndyaXRlX3Jlc3VsdChyZXN1bHQsIG9wcm90LCAnIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIicsIHNlcWlkKSIKKyAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworCisgIC8vIENsb3NlIGZ1bmN0aW9uCisgIGZfc2VydmljZV8uaW5kZW50X2Rvd24oKTsKKyAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJworICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCitzdHJpbmcgdF9yYl9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpIHsKKyAgLy8gVE9ETyhtY3NsZWUpOiBOaXRwaWNreSwgbm8gJywnIGlmIGFyZ3VtZW50X2xpc3QgaXMgZW1wdHkKKyAgcmV0dXJuIHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIoIiArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSArICIpIjsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZmllbGQgbGlzdAorICovCitzdHJpbmcgdF9yYl9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICB9CisgICAgcmVzdWx0ICs9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgdF9yYl9nZW5lcmF0b3I6OnR5cGVfbmFtZShjb25zdCB0X3R5cGUqIHR0eXBlKSB7CisgIHN0cmluZyBwcmVmaXggPSAiIjsKKworICBzdHJpbmcgbmFtZSA9IHR0eXBlLT5nZXRfbmFtZSgpOworICBpZiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpIHx8IHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBuYW1lID0gY2FwaXRhbGl6ZSh0dHlwZS0+Z2V0X25hbWUoKSk7CisgIH0KKworICByZXR1cm4gcHJlZml4ICsgbmFtZTsKK30KKworc3RyaW5nIHRfcmJfZ2VuZXJhdG9yOjpmdWxsX3R5cGVfbmFtZShjb25zdCB0X3R5cGUqIHR0eXBlKSB7CisgIHN0cmluZyBwcmVmaXggPSAiOjoiOworICB2ZWN0b3I8c3RkOjpzdHJpbmc+IG1vZHVsZXMgPSBydWJ5X21vZHVsZXModHR5cGUtPmdldF9wcm9ncmFtKCkpOworICBmb3IgKHZlY3RvcjxzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIG1faXRlciA9IG1vZHVsZXMuYmVnaW4oKTsgbV9pdGVyICE9IG1vZHVsZXMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgcHJlZml4ICs9ICptX2l0ZXIgKyAiOjoiOworICB9CisgIHJldHVybiBwcmVmaXggKyB0eXBlX25hbWUodHR5cGUpOworfQorCisvKioKKyAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgUnVieSB0eW9lCisgKi8KK3N0cmluZyB0X3JiX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpTVFJJTkciOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpCT09MIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICI6OlRocmlmdDo6VHlwZXM6OkJZVEUiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICI6OlRocmlmdDo6VHlwZXM6OkkxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIjo6VGhyaWZ0OjpUeXBlczo6STMyIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpJNjQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICI6OlRocmlmdDo6VHlwZXM6OkRPVUJMRSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpJMzIiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIjo6VGhyaWZ0OjpUeXBlczo6U1RSVUNUIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpNQVAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICI6OlRocmlmdDo6VHlwZXM6OlNFVCI7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICI6OlRocmlmdDo6VHlwZXM6OkxJU1QiOworICB9CisKKyAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCitzdHJpbmcgdF9yYl9nZW5lcmF0b3I6OnJiX25hbWVzcGFjZV90b19wYXRoX3ByZWZpeChzdHJpbmcgcmJfbmFtZXNwYWNlKSB7CisgIHN0cmluZyBuYW1lc3BhY2VzX2xlZnQgPSByYl9uYW1lc3BhY2U7CisgIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKKworICBzdHJpbmcgcGF0aF9wcmVmaXggPSAiIjsKKworICB3aGlsZSAoKGxvYyA9IG5hbWVzcGFjZXNfbGVmdC5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykgeworICAgIHBhdGhfcHJlZml4ID0gcGF0aF9wcmVmaXggKyB1bmRlcnNjb3JlKG5hbWVzcGFjZXNfbGVmdC5zdWJzdHIoMCwgbG9jKSkgKyAiLyI7CisgICAgbmFtZXNwYWNlc19sZWZ0ID0gbmFtZXNwYWNlc19sZWZ0LnN1YnN0cihsb2MgKyAxKTsKKyAgfQorICBpZiAobmFtZXNwYWNlc19sZWZ0LnNpemUoKSA+IDApIHsKKyAgICBwYXRoX3ByZWZpeCA9IHBhdGhfcHJlZml4ICsgdW5kZXJzY29yZShuYW1lc3BhY2VzX2xlZnQpICsgIi8iOworICB9CisgIHJldHVybiBwYXRoX3ByZWZpeDsKK30KKwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmRvYyh0X3JiX29mc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKSB7CisgIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKKyAgICBvdXQuaW5kZW50KCk7CisgICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiIiwgIiMgIiwgdGRvYy0+Z2V0X2RvYygpLCAiIik7CisgIH0KK30KKwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmJfc3RydWN0X3JlcXVpcmVkX3ZhbGlkYXRvcih0X3JiX29mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIG91dC5pbmRlbnQoKSA8PCAiZGVmIHZhbGlkYXRlIiA8PCBlbmRsOworICBvdXQuaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9maWVsZCogZmllbGQgPSAoKmZfaXRlcik7CisgICAgaWYgKGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgeworICAgICAgb3V0LmluZGVudCgpIDw8ICJyYWlzZSA6OlRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24ubmV3KDo6VGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbjo6VU5LTk9XTiwgIgorICAgICAgICAgICAgICAgICAgICAgICInUmVxdWlyZWQgZmllbGQgIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiIGlzIHVuc2V0IScpIjsKKyAgICAgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfYm9vbCgpKSB7CisgICAgICAgIG91dCA8PCAiIGlmIEAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIubmlsPyI7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgIiB1bmxlc3MgQCIgPDwgZmllbGQtPmdldF9uYW1lKCk7CisgICAgICB9CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICAvLyBpZiBmaWVsZCBpcyBhbiBlbnVtLCBjaGVjayB0aGF0IGl0cyB2YWx1ZSBpcyB2YWxpZAorICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfZmllbGQqIGZpZWxkID0gKCpmX2l0ZXIpOworCisgICAgaWYgKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19lbnVtKCkpIHsKKyAgICAgIG91dC5pbmRlbnQoKSA8PCAidW5sZXNzIEAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIubmlsPyB8fCAiCisgICAgICAgICAgICAgICAgICAgPDwgZnVsbF90eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCkpIDw8ICI6OlZBTElEX1ZBTFVFUy5pbmNsdWRlPyhAIgorICAgICAgICAgICAgICAgICAgIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsOworICAgICAgb3V0LmluZGVudF91cCgpOworICAgICAgb3V0LmluZGVudCgpIDw8ICJyYWlzZSA6OlRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24ubmV3KDo6VGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbjo6VU5LTk9XTiwgIgorICAgICAgICAgICAgICAgICAgICAgICInSW52YWxpZCB2YWx1ZSBvZiBmaWVsZCAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIhJykiIDw8IGVuZGw7CisgICAgICBvdXQuaW5kZW50X2Rvd24oKTsKKyAgICAgIG91dC5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsOworICAgIH0KKyAgfQorCisgIG91dC5pbmRlbnRfZG93bigpOworICBvdXQuaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yYl91bmlvbl92YWxpZGF0b3IodF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBvdXQuaW5kZW50KCkgPDwgImRlZiB2YWxpZGF0ZSIgPDwgZW5kbDsKKyAgb3V0LmluZGVudF91cCgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBvdXQuaW5kZW50KCkKKyAgICAgIDw8ICJyYWlzZShTdGFuZGFyZEVycm9yLCAnVW5pb24gZmllbGRzIGFyZSBub3Qgc2V0LicpIGlmIGdldF9zZXRfZmllbGQubmlsPyB8fCBnZXRfdmFsdWUubmlsPyIKKyAgICAgIDw8IGVuZGw7CisKKyAgLy8gaWYgZmllbGQgaXMgYW4gZW51bSwgY2hlY2sgdGhhdCBpdHMgdmFsdWUgaXMgdmFsaWQKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBjb25zdCB0X2ZpZWxkKiBmaWVsZCA9ICgqZl9pdGVyKTsKKworICAgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfZW51bSgpKSB7CisgICAgICBvdXQuaW5kZW50KCkgPDwgImlmIGdldF9zZXRfZmllbGQgPT0gOiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgZW5kbDsKKyAgICAgIG91dC5pbmRlbnQoKSA8PCAiICByYWlzZSAiCisgICAgICAgICAgICAgICAgICAgICAgIjo6VGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbi5uZXcoOjpUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uOjpVTktOT1dOLCAiCisgICAgICAgICAgICAgICAgICAgICAgIidJbnZhbGlkIHZhbHVlIG9mIGZpZWxkICIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiEnKSB1bmxlc3MgIgorICAgICAgICAgICAgICAgICAgIDw8IGZ1bGxfdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiOjpWQUxJRF9WQUxVRVMuaW5jbHVkZT8oZ2V0X3ZhbHVlKSIKKyAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgb3V0LmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgb3V0LmluZGVudF9kb3duKCk7CisgIG91dC5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoCisgICAgcmIsCisgICAgIlJ1YnkiLAorICAgICIgICAgcnVieWdlbXM6ICAgICAgICBBZGQgYSBcInJlcXVpcmUgJ3J1YnlnZW1zJ1wiIGxpbmUgdG8gdGhlIHRvcCBvZiBlYWNoIGdlbmVyYXRlZCBmaWxlLlxuIgorICAgICIgICAgbmFtZXNwYWNlZDogICAgICBHZW5lcmF0ZSBmaWxlcyBpbiBpZGlvbWF0aWMgbmFtZXNwYWNlZCBkaXJlY3Rvcmllcy5cbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3JzX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfcnNfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NDNkN2EKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3JzX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDMzMzkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvZnN0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjp2ZWN0b3I7Cit1c2luZyBzdGQ6OnNldDsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsKCJcbiIpOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCitzdGF0aWMgY29uc3Qgc3RyaW5nIFNFUlZJQ0VfUkVTVUxUX1ZBUklBQkxFKCJyZXN1bHRfdmFsdWUiKTsKK3N0YXRpYyBjb25zdCBzdHJpbmcgUkVTVUxUX1NUUlVDVF9TVUZGSVgoIlJlc3VsdCIpOworc3RhdGljIGNvbnN0IHN0cmluZyBSVVNUX1JFU0VSVkVEX1dPUkRTW10gPSB7CisgICJhYnN0cmFjdCIsICJhbGlnbm9mIiwgImFzIiwgImJlY29tZSIsCisgICJib3giLCAiYnJlYWsiLCAiY29uc3QiLCAiY29udGludWUiLAorICAiY3JhdGUiLCAiZG8iLCAiZWxzZSIsICJlbnVtIiwKKyAgImV4dGVybiIsICJmYWxzZSIsICJmaW5hbCIsICJmbiIsCisgICJmb3IiLCAiaWYiLCAiaW1wbCIsICJpbiIsCisgICJsZXQiLCAibG9vcCIsICJtYWNybyIsICJtYXRjaCIsCisgICJtb2QiLCAibW92ZSIsICJtdXQiLCAib2Zmc2V0b2YiLAorICAib3ZlcnJpZGUiLCAicHJpdiIsICJwcm9jIiwgInB1YiIsCisgICJwdXJlIiwgInJlZiIsICJyZXR1cm4iLCAiU2VsZiIsCisgICJzZWxmIiwgInNpemVvZiIsICJzdGF0aWMiLCAic3RydWN0IiwKKyAgInN1cGVyIiwgInRyYWl0IiwgInRydWUiLCAidHlwZSIsCisgICJ0eXBlb2YiLCAidW5zYWZlIiwgInVuc2l6ZWQiLCAidXNlIiwKKyAgInZpcnR1YWwiLCAid2hlcmUiLCAid2hpbGUiLCAieWllbGQiCit9OworY29uc3Qgc2V0PHN0cmluZz4gUlVTVF9SRVNFUlZFRF9XT1JEU19TRVQoCisgIFJVU1RfUkVTRVJWRURfV09SRFMsCisgIFJVU1RfUkVTRVJWRURfV09SRFMgKyBzaXplb2YoUlVTVF9SRVNFUlZFRF9XT1JEUykvc2l6ZW9mKFJVU1RfUkVTRVJWRURfV09SRFNbMF0pCispOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIFNZTkNfQ0xJRU5UX0dFTkVSSUNfQk9VTkRfVkFSUygiPElQLCBPUD4iKTsKK3N0YXRpYyBjb25zdCBzdHJpbmcgU1lOQ19DTElFTlRfR0VORVJJQ19CT1VORFMoIndoZXJlIElQOiBUSW5wdXRQcm90b2NvbCwgT1A6IFRPdXRwdXRQcm90b2NvbCIpOworCisvLyBGSVhNRTogZXh0cmFjdCBjb21tb24gVE1lc3NhZ2VJZGVudGlmaWVyIGZ1bmN0aW9uCisvLyBGSVhNRTogaGF2ZSB0b19ydXN0X3R5cGUgZGVhbCB3aXRoIE9wdGlvbgorCitjbGFzcyB0X3JzX2dlbmVyYXRvciA6IHB1YmxpYyB0X2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfcnNfZ2VuZXJhdG9yKAorICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiwKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYKKyAgKSA6IHRfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICBnZW5fZGlyXyA9IGdldF9vdXRfZGlyKCk7CisgIH0KKworICAvKioKKyAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcworICAgKi8KKworICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7CisgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7CisKKyAgLyoqCisgICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKK3ByaXZhdGU6CisgIC8vIHN0cnVjdCB0eXBlCisgIC8vIFRfUkVHVUxBUjogdXNlci1kZWZpbmVkIHN0cnVjdCBpbiB0aGUgSURMCisgIC8vIFRfQVJHUzogc3RydWN0IHVzZWQgdG8gaG9sZCBhbGwgc2VydmljZS1jYWxsIHBhcmFtZXRlcnMKKyAgLy8gVF9SRVNVTFQ6IHN0cnVjdCB1c2VkIHRvIGhvbGQgYWxsIHNlcnZpY2UtY2FsbCByZXR1cm5zIGFuZCBleGNlcHRpb25zCisgIC8vIFRfRVhDRVBUSU9OOiB1c2VyLWRlZmluZWQgZXhjZXB0aW9uIGluIHRoZSBJREwKKyAgZW51bSBlX3N0cnVjdF90eXBlIHsgVF9SRUdVTEFSLCBUX0FSR1MsIFRfUkVTVUxULCBUX0VYQ0VQVElPTiB9OworCisgIC8vIERpcmVjdG9yeSB0byB3aGljaCBnZW5lcmF0ZWQgY29kZSBpcyB3cml0dGVuLgorICBzdHJpbmcgZ2VuX2Rpcl87CisKKyAgLy8gRmlsZSB0byB3aGljaCBnZW5lcmF0ZWQgY29kZSBpcyB3cml0dGVuLgorICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfZ2VuXzsKKworICAvLyBXcml0ZSB0aGUgY29tbW9uIGNvbXBpbGVyIGF0dHJpYnV0ZXMgYW5kIG1vZHVsZSBpbmNsdWRlcyB0byB0aGUgdG9wIG9mIHRoZSBhdXRvLWdlbmVyYXRlZCBmaWxlLgorICB2b2lkIHJlbmRlcl9hdHRyaWJ1dGVzX2FuZF9pbmNsdWRlcygpOworCisgIC8vIENyZWF0ZSB0aGUgY2xvc3VyZSBvZiBSdXN0IG1vZHVsZXMgcmVmZXJlbmNlZCBieSB0aGlzIHNlcnZpY2UuCisgIHZvaWQgY29tcHV0ZV9zZXJ2aWNlX3JlZmVyZW5jZWRfbW9kdWxlcyh0X3NlcnZpY2UgKnRzZXJ2aWNlLCBzZXQ8c3RyaW5nPiAmcmVmZXJlbmNlZF9tb2R1bGVzKTsKKworICAvLyBXcml0ZSB0aGUgcnVzdCByZXByZXNlbnRhdGlvbiBvZiBhbiBlbnVtLgorICB2b2lkIHJlbmRlcl9lbnVtX2RlZmluaXRpb24odF9lbnVtKiB0ZW51bSwgY29uc3Qgc3RyaW5nJiBlbnVtX25hbWUpOworCisgIC8vIFdyaXRlIHRoZSBpbXBsIGJsb2NrcyBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYWl0cyBuZWNlc3NhcnkgdG8gY29udmVydCBhbiBlbnVtIHRvL2Zyb20gYW4gaTMyLgorICB2b2lkIHJlbmRlcl9lbnVtX2NvbnZlcnNpb24odF9lbnVtKiB0ZW51bSwgY29uc3Qgc3RyaW5nJiBlbnVtX25hbWUpOworCisgIC8vIFdyaXRlIHRoZSBpbXBsIGJsb2NrIGFzc29jaWF0ZWQgd2l0aCB0aGUgcnVzdCByZXByZXNlbnRhdGlvbiBvZiBhbiBlbnVtLiBUaGlzIGluY2x1ZGVzIG1ldGhvZHMKKyAgLy8gdG8gd3JpdGUgdGhlIGVudW0gdG8gYSBwcm90b2NvbCwgcmVhZCBpdCBmcm9tIGEgcHJvdG9jb2wsIGV0Yy4KKyAgdm9pZCByZW5kZXJfZW51bV9pbXBsKGNvbnN0IHN0cmluZyYgZW51bV9uYW1lKTsKKworICAvLyBXcml0ZSBhIHNpbXBsZSBydXN0IGNvbnN0IHZhbHVlIChpZS4gYHB1YiBjb25zdCBGT086IGZvby4uLmApLgorICB2b2lkIHJlbmRlcl9jb25zdF92YWx1ZShjb25zdCBzdHJpbmcmIG5hbWUsIHRfdHlwZSogdHR5cGUsIHRfY29uc3RfdmFsdWUqIHR2YWx1ZSk7CisKKyAgLy8gV3JpdGUgYSBjb25zdGFudCBsaXN0LCBzZXQsIG1hcCBvciBzdHJ1Y3QuIFRoZXNlIGNvbnN0YW50cyByZXF1aXJlIGFsbG9jYXRpb24gYW5kIGNhbm5vdCBiZSBkZWZpbmVkCisgIC8vIHVzaW5nIGEgJ3B1YiBjb25zdCcuIEFzIGEgcmVzdWx0LCBJIGNyZWF0ZSBhIGhvbGRlciBzdHJ1Y3Qgd2l0aCBhIHNpbmdsZSBgY29uc3RfdmFsdWVgIG1ldGhvZCB0aGF0CisgIC8vIHJldHVybnMgdGhlIGluaXRpYWxpemVkIGluc3RhbmNlLgorICB2b2lkIHJlbmRlcl9jb25zdF92YWx1ZV9ob2xkZXIoY29uc3Qgc3RyaW5nJiBuYW1lLCB0X3R5cGUqIHR0eXBlLCB0X2NvbnN0X3ZhbHVlKiB0dmFsdWUpOworCisgIC8vIFdyaXRlIHRoZSBhY3R1YWwgY29uc3QgdmFsdWUgLSB0aGUgcmlnaHQgc2lkZSBvZiBhIGNvbnN0IGRlZmluaXRpb24uCisgIHZvaWQgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHR5cGUsIHRfY29uc3RfdmFsdWUqIHR2YWx1ZSwgYm9vbCBpc19vd25lZCA9IHRydWUpOworCisgIC8vIFdyaXRlIGEgY29uc3Qgc3RydWN0IChyZXR1cm5lZCBmcm9tIGBjb25zdF92YWx1ZWAgbWV0aG9kKS4KKyAgdm9pZCByZW5kZXJfY29uc3Rfc3RydWN0KHRfdHlwZSogdHR5cGUsIHRfY29uc3RfdmFsdWUqIHR2YWx1ZSk7CisKKyAgLy8gV3JpdGUgYSBjb25zdCBsaXN0IChyZXR1cm5lZCBmcm9tIGBjb25zdF92YWx1ZWAgbWV0aG9kKS4KKyAgdm9pZCByZW5kZXJfY29uc3RfbGlzdCh0X3R5cGUqIHR0eXBlLCB0X2NvbnN0X3ZhbHVlKiB0dmFsdWUpOworCisgIC8vIFdyaXRlIGEgY29uc3Qgc2V0IChyZXR1cm5lZCBmcm9tIGBjb25zdF92YWx1ZWAgbWV0aG9kKS4KKyAgdm9pZCByZW5kZXJfY29uc3Rfc2V0KHRfdHlwZSogdHR5cGUsIHRfY29uc3RfdmFsdWUqIHR2YWx1ZSk7CisKKyAgLy8gV3JpdGUgYSBjb25zdCBtYXAgKHJldHVybmVkIGZyb20gYGNvbnN0X3ZhbHVlYCBtZXRob2QpLgorICB2b2lkIHJlbmRlcl9jb25zdF9tYXAodF90eXBlKiB0dHlwZSwgdF9jb25zdF92YWx1ZSogdHZhbHVlKTsKKworICAvLyBXcml0ZSB0aGUgY29kZSB0byBpbnNlcnQgY29uc3RhbnQgdmFsdWVzIGludG8gYSBydXN0IHZlYyBvciBzZXQuIFRoZQorICAvLyBgaW5zZXJ0X2Z1bmN0aW9uYCBpcyB0aGUgcnVzdCBmdW5jdGlvbiB0aGF0IHdlJ2xsIHVzZSB0byBpbnNlcnQgdGhlIGVsZW1lbnRzLgorICB2b2lkIHJlbmRlcl9jb250YWluZXJfY29uc3RfdmFsdWUoCisgICAgY29uc3Qgc3RyaW5nJiBpbnNlcnRfZnVuY3Rpb24sCisgICAgdF90eXBlKiB0dHlwZSwKKyAgICB0X2NvbnN0X3ZhbHVlKiB0dmFsdWUKKyAgKTsKKworICAvLyBXcml0ZSB0aGUgcnVzdCByZXByZXNlbnRhdGlvbiBvZiBhIHRocmlmdCBzdHJ1Y3QgdG8gdGhlIGdlbmVyYXRlZCBmaWxlLiBTZXQgYHN0cnVjdF90eXBlYCB0byBgVF9BUkdTYAorICAvLyBpZiByZW5kZXJpbmcgdGhlIHN0cnVjdCB1c2VkIHRvIHBhY2sgYXJndW1lbnRzIGZvciBhIHNlcnZpY2UgY2FsbC4gV2hlbiBgc3RydWN0X3R5cGVgIGlzIGBUX0FSR1NgIHRoZQorICAvLyBzdHJ1Y3QgYW5kIGl0cyBtZW1iZXJzIGhhdmUgbW9kdWxlIHZpc2liaWxpdHksIGFuZCBhbGwgZmllbGRzIGFyZSByZXF1aXJlZC4gV2hlbiBgc3RydWN0X3R5cGVgIGlzCisgIC8vIGFueXRoaW5nIGVsc2UgdGhlIHN0cnVjdCBhbmQgaXRzIG1lbWJlcnMgaGF2ZSBwdWJsaWMgdmlzaWJpbGl0eSBhbmQgZmllbGRzIGhhdmUgdGhlIHZpc2liaWxpdHkgc2V0CisgIC8vIGluIHRoZWlyIGRlZmluaXRpb24uCisgIHZvaWQgcmVuZGVyX3N0cnVjdChjb25zdCBzdHJpbmcmIHN0cnVjdF9uYW1lLCB0X3N0cnVjdCogdHN0cnVjdCwgdF9yc19nZW5lcmF0b3I6OmVfc3RydWN0X3R5cGUgc3RydWN0X3R5cGUpOworCisgIC8vIFdyaXRlIHRoZSBjb21tZW50IGJsb2NrIHByZWNlZGluZyBhIHR5cGUgZGVmaW5pdGlvbiAoYW5kIGltcGxlbWVudGF0aW9uKS4KKyAgdm9pZCByZW5kZXJfdHlwZV9jb21tZW50KGNvbnN0IHN0cmluZyYgc3RydWN0X25hbWUpOworCisgIC8vIFdyaXRlIHRoZSBydXN0IHJlcHJlc2VudGF0aW9uIG9mIGEgdGhyaWZ0IHN0cnVjdC4gU3VwcG9ydHMgYXJndW1lbnQgc3RydWN0cywgcmVzdWx0IHN0cnVjdHMsCisgIC8vIHVzZXItZGVmaW5lZCBzdHJ1Y3RzIGFuZCBleGNlcHRpb24gc3RydWN0cy4gVGhlIGV4YWN0IHN0cnVjdCB0eXBlIHRvIGJlIGdlbmVyYXRlZCBpcyBjb250cm9sbGVkCisgIC8vIGJ5IHRoZSBgc3RydWN0X3R5cGVgIHBhcmFtZXRlciwgd2hpY2ggKGFtb25nIG90aGVyIHRoaW5ncykgbW9kaWZpZXMgdGhlIHZpc2liaWxpdHkgb2YgdGhlCisgIC8vIHdyaXR0ZW4gc3RydWN0IGFuZCBtZW1iZXJzLCBjb250cm9scyB3aGljaCB0cmFpdCBpbXBsZW1lbnRhdGlvbnMgYXJlIGdlbmVyYXRlZC4KKyAgdm9pZCByZW5kZXJfc3RydWN0X2RlZmluaXRpb24oCisgICAgY29uc3Qgc3RyaW5nJiBzdHJ1Y3RfbmFtZSwKKyAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICB0X3JzX2dlbmVyYXRvcjo6ZV9zdHJ1Y3RfdHlwZSBzdHJ1Y3RfdHlwZQorICApOworCisgIC8vIFdyaXRlcyB0aGUgaW1wbCBibG9jayBhc3NvY2lhdGVkIHdpdGggdGhlIHJ1c3QgcmVwcmVzZW50YXRpb24gb2YgYSBzdHJ1Y3QuIEF0IG1pbmltdW0gdGhpcworICAvLyBjb250YWlucyB0aGUgbWV0aG9kcyB0byByZWFkIGZyb20gYSBwcm90b2NvbCBhbmQgd3JpdGUgdG8gYSBwcm90b2NvbC4gQWRkaXRpb25hbCBtZXRob2RzIG1heQorICAvLyBiZSBnZW5lcmF0ZWQgZGVwZW5kaW5nIG9uIGBzdHJ1Y3RfdHlwZWAuCisgIHZvaWQgcmVuZGVyX3N0cnVjdF9pbXBsKAorICAgIGNvbnN0IHN0cmluZyYgc3RydWN0X25hbWUsCisgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgdF9yc19nZW5lcmF0b3I6OmVfc3RydWN0X3R5cGUgc3RydWN0X3R5cGUKKyAgKTsKKworICAvLyBHZW5lcmF0ZSBhIGBmbiBuZXcoLi4uKWAgZm9yIGEgc3RydWN0IHdpdGggbmFtZSBgc3RydWN0X25hbWVgIGFuZCB0eXBlIGB0X3N0cnVjdGAuIFRoZSBhdXRvLWdlbmVyYXRlZAorICAvLyBjb2RlIG1heSBpbmNsdWRlIGdlbmVyaWMgdHlwZSBwYXJhbWV0ZXJzIHRvIG1ha2UgdGhlIGNvbnN0cnVjdG9yIG1vcmUgZXJnb25vbWljLiBgc3RydWN0X3R5cGVgIGNvbnRyb2xzCisgIC8vIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBnZW5lcmF0ZWQgY29uc3RydWN0b3IuCisgIHZvaWQgcmVuZGVyX3N0cnVjdF9jb25zdHJ1Y3RvcigKKyAgICBjb25zdCBzdHJpbmcmIHN0cnVjdF9uYW1lLAorICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgIHRfcnNfZ2VuZXJhdG9yOjplX3N0cnVjdF90eXBlIHN0cnVjdF90eXBlCisgICk7CisKKyAgLy8gV3JpdGUgdGhlIGBva19vcmAgbWV0aG9kIGFkZGVkIHRvIGFsbCBUaHJpZnQgc2VydmljZSBjYWxsIHJlc3VsdCBzdHJ1Y3RzLiBZb3UgY2FuIHVzZSB0aGlzIG1ldGhvZAorICAvLyB0byBjb252ZXJ0IGEgc3RydWN0IGludG8gYSBgUmVzdWx0YCBhbmQgdXNlIGl0IGluIGEgYHRyeSFgIG9yIGNvbWJpbmF0b3IgY2hhaW4uCisgIHZvaWQgcmVuZGVyX3Jlc3VsdF9zdHJ1Y3RfdG9fcmVzdWx0X21ldGhvZCh0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgLy8gV3JpdGUgdGhlIGltcGxlbWVudGF0aW9ucyBmb3IgdGhlIGBFcnJvcmAgYW5kIGBEZWJ1Z2AgdHJhaXRzLiBUaGVzZSB0cmFpdHMgYXJlIG5lY2Vzc2FyeSBmb3IgYQorICAvLyB1c2VyLWRlZmluZWQgZXhjZXB0aW9uIHRvIGJlIHByb3Blcmx5IGhhbmRsZWQgYXMgUnVzdCBlcnJvcnMuCisgIHZvaWQgcmVuZGVyX2V4Y2VwdGlvbl9zdHJ1Y3RfZXJyb3JfdHJhaXRfaW1wbHMoY29uc3Qgc3RyaW5nJiBzdHJ1Y3RfbmFtZSwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIC8vIFdyaXRlIHRoZSBpbXBsZW1lbnRhdGlvbnMgZm9yIHRoZSBgRGVmYXVsdGAuIFRoaXMgdHJhaXQgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IG9ubHkgdGhlIGZpZWxkcyB5b3Ugd2FudAorICAvLyBhbmQgdXNlIGAuLkRlZmF1bHQ6OmRlZmF1bHQoKWAgdG8gZmlsbCBpbiB0aGUgcmVzdC4KKyAgdm9pZCByZW5kZXJfc3RydWN0X2RlZmF1bHRfdHJhaXRfaW1wbChjb25zdCBzdHJpbmcmIHN0cnVjdF9uYW1lLCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgLy8gV3JpdGUgdGhlIGZ1bmN0aW9uIHRoYXQgc2VyaWFsaXplcyBhIHN0cnVjdCB0byBpdHMgd2lyZSByZXByZXNlbnRhdGlvbi4gSWYgYHN0cnVjdF90eXBlYCBpcyBgVF9BUkdTYAorICAvLyB0aGVuIGFsbCBmaWVsZHMgYXJlIGNvbnNpZGVyZWQgInJlcXVpcmVkIiwgaWYgbm90LCB0aGUgZGVmYXVsdCBvcHRpb25hbGl0eSBpcyB1c2VkLgorICB2b2lkIHJlbmRlcl9zdHJ1Y3Rfc3luY193cml0ZSh0X3N0cnVjdCAqdHN0cnVjdCwgdF9yc19nZW5lcmF0b3I6OmVfc3RydWN0X3R5cGUgc3RydWN0X3R5cGUpOworCisgIC8vIEhlbHBlciBmdW5jdGlvbiB0aGF0IHNlcmlhbGl6ZXMgYSBzaW5nbGUgc3RydWN0IGZpZWxkIHRvIGl0cyB3aXJlIHJlcHJlc2VudGF0aW9uLiBVbnBhY2tzIHRoZQorICAvLyB2YXJpYWJsZSAoc2luY2UgaXQgbWF5IGJlIG9wdGlvbmFsKSBhbmQgc2VyaWFsaXplcyBhY2NvcmRpbmcgdG8gdGhlIG9wdGlvbmFsaXR5IHJ1bGVzIHJlcXVpcmVkIGJ5IGByZXFgLgorICAvLyBWYXJpYWJsZXMgaW4gYXV0by1nZW5lcmF0ZWQgY29kZSBhcmUgcGFzc2VkIGJ5IHJlZmVyZW5jZS4gU2luY2UgdGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIGluCisgIC8vIGNvbnRleHRzIHdoZXJlIHRoZSB2YXJpYWJsZSBpcyAqYWxyZWFkeSogYSByZWZlcmVuY2UgeW91IGNhbiBzZXQgYGZpZWxkX3Zhcl9pc19yZWZgIHRvIGB0cnVlYCB0byBhdm9pZAorICAvLyBnZW5lcmF0aW5nIGFuIGV4dHJhLCB1bm5lY2Vzc2FyeSBgJmAgdGhhdCB0aGUgY29tcGlsZXIgd2lsbCBoYXZlIHRvIGF1dG9tYXRpY2FsbHkgZGVyZWZlcmVuY2UuCisgIHZvaWQgcmVuZGVyX3N0cnVjdF9maWVsZF9zeW5jX3dyaXRlKAorICAgIGNvbnN0IHN0cmluZyAmZmllbGRfdmFyLAorICAgIGJvb2wgZmllbGRfdmFyX2lzX3JlZiwKKyAgICB0X2ZpZWxkICp0ZmllbGQsCisgICAgdF9maWVsZDo6ZV9yZXEgcmVxKTsKKworICAvLyBXcml0ZSB0aGUgcnVzdCBmdW5jdGlvbiB0aGF0IHNlcmlhbGl6ZXMgYSBzaW5nbGUgdHlwZSAoaS5lLiBhIGkzMiBldGMuKSB0byBpdHMgd2lyZSByZXByZXNlbnRhdGlvbi4KKyAgLy8gVmFyaWFibGVzIGluIGF1dG8tZ2VuZXJhdGVkIGNvZGUgYXJlIHBhc3NlZCBieSByZWZlcmVuY2UuIFNpbmNlIHRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBpbgorICAvLyBjb250ZXh0cyB3aGVyZSB0aGUgdmFyaWFibGUgaXMgKmFscmVhZHkqIGEgcmVmZXJlbmNlIHlvdSBjYW4gc2V0IGB0eXBlX3Zhcl9pc19yZWZgIHRvIGB0cnVlYCB0byBhdm9pZAorICAvLyBnZW5lcmF0aW5nIGFuIGV4dHJhLCB1bm5lY2Vzc2FyeSBgJmAgdGhhdCB0aGUgY29tcGlsZXIgd2lsbCBoYXZlIHRvIGF1dG9tYXRpY2FsbHkgZGVyZWZlcmVuY2UuCisgIHZvaWQgcmVuZGVyX3R5cGVfc3luY193cml0ZShjb25zdCBzdHJpbmcgJnR5cGVfdmFyLCBib29sIHR5cGVfdmFyX2lzX3JlZiwgdF90eXBlICp0dHlwZSk7CisKKyAgLy8gV3JpdGUgYSBsaXN0IHRvIHRoZSBvdXRwdXQgcHJvdG9jb2wuIGBsaXN0X3ZhcmlhYmxlYCBpcyB0aGUgdmFyaWFibGUgY29udGFpbmluZyB0aGUgbGlzdAorICAvLyB0aGF0IHdpbGwgYmUgd3JpdHRlbiB0byB0aGUgb3V0cHV0IHByb3RvY29sLgorICAvLyBWYXJpYWJsZXMgaW4gYXV0by1nZW5lcmF0ZWQgY29kZSBhcmUgcGFzc2VkIGJ5IHJlZmVyZW5jZS4gU2luY2UgdGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIGluCisgIC8vIGNvbnRleHRzIHdoZXJlIHRoZSB2YXJpYWJsZSBpcyAqYWxyZWFkeSogYSByZWZlcmVuY2UgeW91IGNhbiBzZXQgYGxpc3RfdmFyX2lzX3JlZmAgdG8gYHRydWVgIHRvIGF2b2lkCisgIC8vIGdlbmVyYXRpbmcgYW4gZXh0cmEsIHVubmVjZXNzYXJ5IGAmYCB0aGF0IHRoZSBjb21waWxlciB3aWxsIGhhdmUgdG8gYXV0b21hdGljYWxseSBkZXJlZmVyZW5jZS4KKyAgdm9pZCByZW5kZXJfbGlzdF9zeW5jX3dyaXRlKGNvbnN0IHN0cmluZyAmbGlzdF92YXIsIGJvb2wgbGlzdF92YXJfaXNfcmVmLCB0X2xpc3QgKnRsaXN0KTsKKworICAvLyBXcml0ZSBhIHNldCB0byB0aGUgb3V0cHV0IHByb3RvY29sLiBgc2V0X3ZhcmlhYmxlYCBpcyB0aGUgdmFyaWFibGUgY29udGFpbmluZyB0aGUgc2V0IHRoYXQgd2lsbAorICAvLyBiZSB3cml0dGVuIHRvIHRoZSBvdXRwdXQgcHJvdG9jb2wuCisgIC8vIFZhcmlhYmxlcyBpbiBhdXRvLWdlbmVyYXRlZCBjb2RlIGFyZSBwYXNzZWQgYnkgcmVmZXJlbmNlLiBTaW5jZSB0aGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgaW4KKyAgLy8gY29udGV4dHMgd2hlcmUgdGhlIHZhcmlhYmxlIGlzICphbHJlYWR5KiBhIHJlZmVyZW5jZSB5b3UgY2FuIHNldCBgc2V0X3Zhcl9pc19yZWZgIHRvIGB0cnVlYCB0byBhdm9pZAorICAvLyBnZW5lcmF0aW5nIGFuIGV4dHJhLCB1bm5lY2Vzc2FyeSBgJmAgdGhhdCB0aGUgY29tcGlsZXIgd2lsbCBoYXZlIHRvIGF1dG9tYXRpY2FsbHkgZGVyZWZlcmVuY2UuCisgIHZvaWQgcmVuZGVyX3NldF9zeW5jX3dyaXRlKGNvbnN0IHN0cmluZyAmc2V0X3ZhciwgYm9vbCBzZXRfdmFyX2lzX3JlZiwgdF9zZXQgKnRzZXQpOworCisgIC8vIFdyaXRlIGEgbWFwIHRvIHRoZSBvdXRwdXQgcHJvdG9jb2wuIGBtYXBfdmFyaWFibGVgIGlzIHRoZSB2YXJpYWJsZSBjb250YWluaW5nIHRoZSBtYXAgdGhhdCB3aWxsCisgIC8vIGJlIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBwcm90b2NvbC4KKyAgLy8gVmFyaWFibGVzIGluIGF1dG8tZ2VuZXJhdGVkIGNvZGUgYXJlIHBhc3NlZCBieSByZWZlcmVuY2UuIFNpbmNlIHRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBpbgorICAvLyBjb250ZXh0cyB3aGVyZSB0aGUgdmFyaWFibGUgaXMgKmFscmVhZHkqIGEgcmVmZXJlbmNlIHlvdSBjYW4gc2V0IGBtYXBfdmFyX2lzX3JlZmAgdG8gYHRydWVgIHRvIGF2b2lkCisgIC8vIGdlbmVyYXRpbmcgYW4gZXh0cmEsIHVubmVjZXNzYXJ5IGAmYCB0aGF0IHRoZSBjb21waWxlciB3aWxsIGhhdmUgdG8gYXV0b21hdGljYWxseSBkZXJlZmVyZW5jZS4KKyAgdm9pZCByZW5kZXJfbWFwX3N5bmNfd3JpdGUoY29uc3Qgc3RyaW5nICZtYXBfdmFyLCBib29sIG1hcF92YXJfaXNfcmVmLCB0X21hcCAqdHNldCk7CisKKyAgLy8gUmV0dXJuIGB0cnVlYCBpZiB3ZSBuZWVkIHRvIGRlcmVmZXJlbmNlIHRocyB0eXBlIHdoZW4gd3JpdGluZyBhbiBlbGVtZW50IGZyb20gYSBjb250YWluZXIuCisgIC8vIEl0ZXJhdGlvbnMgb24gcnVzdCBjb250YWluZXJzIGFyZSBwZXJmb3JtZWQgYXMgZm9sbG93czogYGZvciB2IGluICZ2YWx1ZXMgeyAuLi4gfWAKKyAgLy8gd2hlcmUgYHZgIGhhcyB0eXBlIGAmUlVTVF9UWVBFYCBBbGwgZGVmaW5lZCBmdW5jdGlvbnMgdGFrZSBwcmltaXRpdmVzIGJ5IHZhbHVlLCBzbywgaWYgdGhlCisgIC8vIHJlbmRlcmVkIGNvZGUgaXMgY2FsbGluZyBzdWNoIGEgZnVuY3Rpb24gaXQgaGFzIHRvIGRlcmVmZXJlbmNlIGB2YC4KKyAgYm9vbCBuZWVkc19kZXJlZl9vbl9jb250YWluZXJfd3JpdGUodF90eXBlKiB0dHlwZSk7CisKKyAgLy8gUmV0dXJuIHRoZSB2YXJpYWJsZSAoaW5jbHVkaW5nIGFsbCBkZXJlZmVyZW5jZXMpIHJlcXVpcmVkIHRvIHdyaXRlIHZhbHVlcyBmcm9tIGEgcnVzdCBjb250YWluZXIKKyAgLy8gdG8gdGhlIG91dHB1dCBwcm90b2NvbC4gRm9yIGV4YW1wbGUsIGlmIHlvdSB3ZXJlIGl0ZXJhdGluZyB0aHJvdWdoIGEgY29udGFpbmVyIGFuZCB1c2luZyB0aGUgdGVtcAorICAvLyB2YXJpYWJsZSBgdmAgdG8gcmVwcmVzZW50IGVhY2ggZWxlbWVudCwgdGhlbiBgdHR5cGVgIGlzIHRoZSB0eXBlIHN0b3JlZCBpbiB0aGUgY29udGFpbmVyIGFuZAorICAvLyBgYmFzZV92YXJgIGlzICJ2Ii4gVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgYWN0dWFsIHN0cmluZyB5b3Ugd2lsbCBoYXZlIHRvIHVzZSB0byBwcm9wZXJseSByZWZlcmVuY2UKKyAgLy8gdGhlIHRlbXAgdmFyaWFibGUgZm9yIHdyaXRpbmcgdG8gdGhlIG91dHB1dCBwcm90b2NvbC4KKyAgc3RyaW5nIHN0cmluZ19jb250YWluZXJfd3JpdGVfdmFyaWFibGUodF90eXBlKiB0dHlwZSwgY29uc3Qgc3RyaW5nJiBiYXNlX3Zhcik7CisKKyAgLy8gV3JpdGUgdGhlIGNvZGUgdG8gcmVhZCBieXRlcyBmcm9tIHRoZSB3aXJlIGludG8gdGhlIGdpdmVuIGB0X3N0cnVjdGAuIGBzdHJ1Y3RfbmFtZWAgaXMgdGhlCisgIC8vIGFjdHVhbCBSdXN0IG5hbWUgb2YgdGhlIGB0X3N0cnVjdGAuIElmIGBzdHJ1Y3RfdHlwZWAgaXMgYFRfQVJHU2AgdGhlbiBhbGwgc3RydWN0IGZpZWxkcyBhcmUKKyAgLy8gbmVjZXNzYXJ5LiBPdGhlcndpc2UsIHRoZSBmaWVsZCdzIGRlZmF1bHQgb3B0aW9uYWxpdHkgaXMgdXNlZC4KKyAgdm9pZCByZW5kZXJfc3RydWN0X3N5bmNfcmVhZChjb25zdCBzdHJpbmcgJnN0cnVjdF9uYW1lLCB0X3N0cnVjdCAqdHN0cnVjdCwgdF9yc19nZW5lcmF0b3I6OmVfc3RydWN0X3R5cGUgc3RydWN0X3R5cGUpOworCisgIC8vIFdyaXRlIHRoZSBydXN0IGZ1bmN0aW9uIHRoYXQgZGVzZXJpYWxpemVzIGEgc2luZ2xlIHR5cGUgKGkuZS4gaTMyIGV0Yy4pIGZyb20gaXRzIHdpcmUgcmVwcmVzZW50YXRpb24uCisgIC8vIFNldCBgaXNfYm94ZWRgIHRvIGB0cnVlYCBpZiB0aGUgcmVzdWx0aW5nIHZhbHVlIHNob3VsZCBiZSB3cmFwcGVkIGluIGEgYEJveDo6bmV3KC4uLilgLgorICB2b2lkIHJlbmRlcl90eXBlX3N5bmNfcmVhZChjb25zdCBzdHJpbmcgJnR5cGVfdmFyLCB0X3R5cGUgKnR0eXBlLCBib29sIGlzX2JveGVkID0gZmFsc2UpOworCisgIC8vIFJlYWQgdGhlIHdpcmUgcmVwcmVzZW50YXRpb24gb2YgYSBsaXN0IGFuZCBjb252ZXJ0IGl0IHRvIGl0cyBjb3JyZXNwb25kaW5nIHJ1c3QgaW1wbGVtZW50YXRpb24uCisgIC8vIFRoZSBkZXNlcmlhbGl6ZWQgbGlzdCBpcyBzdG9yZWQgaW4gYGxpc3RfdmFyaWFibGVgLgorICB2b2lkIHJlbmRlcl9saXN0X3N5bmNfcmVhZCh0X2xpc3QgKnRsaXN0LCBjb25zdCBzdHJpbmcgJmxpc3RfdmFyaWFibGUpOworCisgIC8vIFJlYWQgdGhlIHdpcmUgcmVwcmVzZW50YXRpb24gb2YgYSBzZXQgYW5kIGNvbnZlcnQgaXQgdG8gaXRzIGNvcnJlc3BvbmRpbmcgcnVzdCBpbXBsZW1lbnRhdGlvbi4KKyAgLy8gVGhlIGRlc2VyaWFsaXplZCBzZXQgaXMgc3RvcmVkIGluIGBzZXRfdmFyaWFibGVgLgorICB2b2lkIHJlbmRlcl9zZXRfc3luY19yZWFkKHRfc2V0ICp0c2V0LCBjb25zdCBzdHJpbmcgJnNldF92YXJpYWJsZSk7CisKKyAgLy8gUmVhZCB0aGUgd2lyZSByZXByZXNlbnRhdGlvbiBvZiBhIG1hcCBhbmQgY29udmVydCBpdCB0byBpdHMgY29ycmVzcG9uZGluZyBydXN0IGltcGxlbWVudGF0aW9uLgorICAvLyBUaGUgZGVzZXJpYWxpemVkIG1hcCBpcyBzdG9yZWQgaW4gYG1hcF92YXJpYWJsZWAuCisgIHZvaWQgcmVuZGVyX21hcF9zeW5jX3JlYWQodF9tYXAgKnRtYXAsIGNvbnN0IHN0cmluZyAmbWFwX3ZhcmlhYmxlKTsKKworICAvLyBSZXR1cm4gYSB0ZW1wb3JhcnkgdmFyaWFibGUgdXNlZCB0byBzdG9yZSB2YWx1ZXMgd2hlbiBkZXNlcmlhbGl6aW5nIG5lc3RlZCBjb250YWluZXJzLgorICBzdHJpbmcgc3RydWN0X2ZpZWxkX3JlYWRfdGVtcF92YXJpYWJsZSh0X2ZpZWxkKiB0ZmllbGQpOworCisgIC8vIFRvcC1sZXZlbCBmdW5jdGlvbiB0aGF0IGNhbGxzIHRoZSB2YXJpb3VzIHJlbmRlciBmdW5jdGlvbnMgbmVjZXNzYXJ5IHRvIHdyaXRlIHRoZSBydXN0IHJlcHJlc2VudGF0aW9uCisgIC8vIG9mIGEgdGhyaWZ0IHVuaW9uIChpLmUuIGFuIGVudW0pLgorICB2b2lkIHJlbmRlcl91bmlvbih0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgLy8gV3JpdGUgdGhlIGVudW0gY29ycmVzcG9uZGluZyB0byB0aGUgVGhyaWZ0IHVuaW9uLgorICB2b2lkIHJlbmRlcl91bmlvbl9kZWZpbml0aW9uKGNvbnN0IHN0cmluZyYgdW5pb25fbmFtZSwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIC8vIFdyaXRlIHRoZSBlbnVtIGltcGwgKHdpdGggcmVhZC93cml0ZSBmdW5jdGlvbnMpIGZvciB0aGUgVGhyaWZ0IHVuaW9uLgorICB2b2lkIHJlbmRlcl91bmlvbl9pbXBsKGNvbnN0IHN0cmluZyYgdW5pb25fbmFtZSwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworCisgIC8vIFdyaXRlIHRoZSBgRU5VTTo6d3JpdGVfdG9fb3V0X3Byb3RvY29sYCBmdW5jdGlvbi4KKyAgdm9pZCByZW5kZXJfdW5pb25fc3luY193cml0ZShjb25zdCBzdHJpbmcgJnVuaW9uX25hbWUsIHRfc3RydWN0ICp0c3RydWN0KTsKKworICAvLyBXcml0ZSB0aGUgYEVOVU06OnJlYWRfZnJvbV9pbl9wcm90b2NvbGAgZnVuY3Rpb24uCisgIHZvaWQgcmVuZGVyX3VuaW9uX3N5bmNfcmVhZChjb25zdCBzdHJpbmcgJnVuaW9uX25hbWUsIHRfc3RydWN0ICp0c3RydWN0KTsKKworICAvLyBUb3AtbGV2ZWwgZnVuY3Rpb24gdGhhdCBjYWxscyB0aGUgdmFyaW91cyByZW5kZXIgZnVuY3Rpb25zIG5lY2Vzc2FyeSB0byB3cml0ZSB0aGUgcnVzdCByZXByZXNlbnRhdGlvbgorICAvLyBvZiBhIFRocmlmdCBjbGllbnQuCisgIHZvaWQgcmVuZGVyX3N5bmNfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIC8vIFdyaXRlIHRoZSB0cmFpdCB3aXRoIHRoZSBzZXJ2aWNlLWNhbGwgbWV0aG9kcyBmb3IgYHRzZXJ2aWNlYC4KKyAgdm9pZCByZW5kZXJfc3luY19jbGllbnRfdHJhaXQodF9zZXJ2aWNlICp0c2VydmljZSk7CisKKyAgLy8gV3JpdGUgdGhlIHRyYWl0IHRvIGJlIGltcGxlbWVudGVkIGJ5IHRoZSBjbGllbnQgaW1wbCBpZiBlbmQgdXNlcnMgY2FuIHVzZSBpdCB0byBtYWtlIHNlcnZpY2UgY2FsbHMuCisgIHZvaWQgcmVuZGVyX3N5bmNfY2xpZW50X21hcmtlcl90cmFpdCh0X3NlcnZpY2UgKnRzZXJ2aWNlKTsKKworICAvLyBXcml0ZSB0aGUgY29kZSB0byBjcmVhdGUgdGhlIFRocmlmdCBzZXJ2aWNlIHN5bmMgY2xpZW50IHN0cnVjdCBhbmQgaXRzIG1hdGNoaW5nICdpbXBsJyBibG9jay4KKyAgdm9pZCByZW5kZXJfc3luY19jbGllbnRfZGVmaW5pdGlvbl9hbmRfaW1wbChjb25zdCBzdHJpbmcmIGNsaWVudF9pbXBsX25hbWUpOworCisgIC8vIFdyaXRlIHRoZSBjb2RlIHRvIGNyZWF0ZSB0aGUgYFN5bmNDbGllbnQ6Om5ld2AgZnVuY3Rpb25zIGFzIHdlbGwgYXMgYW55IG90aGVyIGZ1bmN0aW9ucworICAvLyBjYWxsZXJzIHdvdWxkIGxpa2UgdG8gdXNlIG9uIHRoZSBUaHJpZnQgc2VydmljZSBzeW5jIGNsaWVudC4KKyAgdm9pZCByZW5kZXJfc3luY19jbGllbnRfbGlmZWN5Y2xlX2Z1bmN0aW9ucyhjb25zdCBzdHJpbmcmIGNsaWVudF9zdHJ1Y3QpOworCisgIC8vIFdyaXRlIHRoZSBjb2RlIHRvIGNyZWF0ZSB0aGUgaW1wbCBibG9jayBmb3IgdGhlIGBUVGhyaWZ0Q2xpZW50YCB0cmFpdC4gU2luY2UgZ2VuZXJhdGVkCisgIC8vIFJ1c3QgVGhyaWZ0IGNsaWVudHMgcGVyZm9ybSBhbGwgdGhlaXIgb3BlcmF0aW9ucyB1c2luZyBtZXRob2RzIGRlZmluZWQgaW4gdGhpcyB0cmFpdCwgd2UKKyAgLy8gaGF2ZSB0byBpbXBsZW1lbnQgaXQgZm9yIHRoZSBjbGllbnQgc3RydWN0cy4KKyAgdm9pZCByZW5kZXJfc3luY19jbGllbnRfdHRocmlmdGNsaWVudF9pbXBsKGNvbnN0IHN0cmluZyAmY2xpZW50X2ltcGxfbmFtZSk7CisKKyAgLy8gV3JpdGUgdGhlIG1hcmtlciB0cmFpdHMgZm9yIGFueSBzZXJ2aWNlKHMpIGJlaW5nIGV4dGVuZGVkLCBpbmNsdWRpbmcgdGhlIG9uZSBmb3IgdGhlIGN1cnJlbnQKKyAgLy8gc2VydmljZSBpdHNlbGYgKGkuZS4gYHRzZXJ2aWNlYCkKKyAgdm9pZCByZW5kZXJfc3luY19jbGllbnRfbWFya2VyX3RyYWl0X2ltcGxzKHRfc2VydmljZSAqdHNlcnZpY2UsIGNvbnN0IHN0cmluZyAmaW1wbF9zdHJ1Y3RfbmFtZSk7CisKKyAgLy8gR2VuZXJhdGUgYSBsaXN0IG9mIGFsbCB0aGUgdHJhaXRzIHRoaXMgVGhyaWZ0IGNsaWVudCBzdHJ1Y3QgZXh0ZW5kcy4KKyAgc3RyaW5nIHN5bmNfY2xpZW50X21hcmtlcl90cmFpdHNfZm9yX2V4dGVuc2lvbih0X3NlcnZpY2UgKnRzZXJ2aWNlKTsKKworICAvLyBUb3AtbGV2ZWwgZnVuY3Rpb24gdGhhdCB3cml0ZXMgdGhlIGNvZGUgdG8gbWFrZSB0aGUgVGhyaWZ0IHNlcnZpY2UgY2FsbHMuCisgIHZvaWQgcmVuZGVyX3N5bmNfY2xpZW50X3Byb2Nlc3NfaW1wbCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICAvLyBXcml0ZSB0aGUgYWN0dWFsIGZ1bmN0aW9uIHRoYXQgY2FsbHMgb3V0IHRvIHRoZSByZW1vdGUgc2VydmljZSBhbmQgcHJvY2Vzc2VzIGl0cyByZXNwb25zZS4KKyAgdm9pZCByZW5kZXJfc3luY19zZW5kX3JlY3Zfd3JhcHBlcih0X2Z1bmN0aW9uKiB0ZnVuYyk7CisKKyAgLy8gV3JpdGUgdGhlIGBzZW5kYCBmdW5jdGlvbmFsaXR5IGZvciBhIFRocmlmdCBzZXJ2aWNlIGNhbGwgcmVwcmVzZW50ZWQgYnkgYSBgdF9zZXJ2aWNlLT50X2Z1bmN0aW9uYC4KKyAgdm9pZCByZW5kZXJfc3luY19zZW5kKHRfZnVuY3Rpb24qIHRmdW5jKTsKKworICAvLyBXcml0ZSB0aGUgYHJlY3ZgIGZ1bmN0aW9uYWxpdHkgZm9yIGEgVGhyaWZ0IHNlcnZpY2UgY2FsbCByZXByZXNlbnRlZCBieSBhIGB0X3NlcnZpY2UtPnRfZnVuY3Rpb25gLgorICAvLyBUaGlzIG1ldGhvZCBpcyBvbmx5IHJlbmRlcmVkIGlmIHRoZSBmdW5jdGlvbiBpcyAqbm90KiBvbmV3YXkuCisgIHZvaWQgcmVuZGVyX3N5bmNfcmVjdih0X2Z1bmN0aW9uKiB0ZnVuYyk7CisKKyAgdm9pZCByZW5kZXJfc3luY19wcm9jZXNzb3IodF9zZXJ2aWNlICp0c2VydmljZSk7CisKKyAgdm9pZCByZW5kZXJfc3luY19oYW5kbGVyX3RyYWl0KHRfc2VydmljZSAqdHNlcnZpY2UpOworICB2b2lkIHJlbmRlcl9zeW5jX3Byb2Nlc3Nvcl9kZWZpbml0aW9uX2FuZF9pbXBsKHRfc2VydmljZSAqdHNlcnZpY2UpOworICB2b2lkIHJlbmRlcl9zeW5jX3Byb2Nlc3NfZGVsZWdhdGlvbl9mdW5jdGlvbnModF9zZXJ2aWNlICp0c2VydmljZSk7CisgIHZvaWQgcmVuZGVyX3N5bmNfcHJvY2Vzc19mdW5jdGlvbih0X2Z1bmN0aW9uICp0ZnVuYywgY29uc3Qgc3RyaW5nICZoYW5kbGVyX3R5cGUpOworICB2b2lkIHJlbmRlcl9wcm9jZXNzX21hdGNoX3N0YXRlbWVudHModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgcmVuZGVyX3N5bmNfaGFuZGxlcl9zdWNjZWVkZWQodF9mdW5jdGlvbiAqdGZ1bmMpOworICB2b2lkIHJlbmRlcl9zeW5jX2hhbmRsZXJfZmFpbGVkKHRfZnVuY3Rpb24gKnRmdW5jKTsKKyAgdm9pZCByZW5kZXJfc3luY19oYW5kbGVyX2ZhaWxlZF91c2VyX2V4Y2VwdGlvbl9icmFuY2godF9mdW5jdGlvbiAqdGZ1bmMpOworICB2b2lkIHJlbmRlcl9zeW5jX2hhbmRsZXJfZmFpbGVkX2FwcGxpY2F0aW9uX2V4Y2VwdGlvbl9icmFuY2godF9mdW5jdGlvbiAqdGZ1bmMsIGNvbnN0IHN0cmluZyAmYXBwX2Vycl92YXIpOworICB2b2lkIHJlbmRlcl9zeW5jX2hhbmRsZXJfZmFpbGVkX2RlZmF1bHRfZXhjZXB0aW9uX2JyYW5jaCh0X2Z1bmN0aW9uICp0ZnVuYyk7CisgIHZvaWQgcmVuZGVyX3N5bmNfaGFuZGxlcl9zZW5kX2V4Y2VwdGlvbl9yZXNwb25zZSh0X2Z1bmN0aW9uICp0ZnVuYywgY29uc3Qgc3RyaW5nICZlcnJfdmFyKTsKKyAgdm9pZCByZW5kZXJfc2VydmljZV9jYWxsX3N0cnVjdHModF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgcmVuZGVyX3NlcnZpY2VfY2FsbF9hcmdzX3N0cnVjdCh0X2Z1bmN0aW9uKiB0ZnVuYyk7CisgIHZvaWQgcmVuZGVyX3NlcnZpY2VfY2FsbF9yZXN1bHRfdmFsdWVfc3RydWN0KHRfZnVuY3Rpb24qIHRmdW5jKTsKKworICBzdHJpbmcgaGFuZGxlcl9zdWNjZXNzZnVsX3JldHVybl9zdHJ1Y3QodF9mdW5jdGlvbiogdGZ1bmMpOworCisgIC8vIFdyaXRlcyB0aGUgcmVzdWx0IG9mIGByZW5kZXJfdGhyaWZ0X2Vycm9yX3N0cnVjdGAgd3JhcHBlZCBpbiBhbiBgRXJyKHRocmlmdDo6RXJyb3IoLi4uKSlgLgorICB2b2lkIHJlbmRlcl90aHJpZnRfZXJyb3IoCisgICAgY29uc3Qgc3RyaW5nJiBlcnJvcl9raW5kLAorICAgIGNvbnN0IHN0cmluZyYgZXJyb3Jfc3RydWN0LAorICAgIGNvbnN0IHN0cmluZyYgc3ViX2Vycm9yX2tpbmQsCisgICAgY29uc3Qgc3RyaW5nJiBlcnJvcl9tZXNzYWdlCisgICk7CisKKyAgLy8gV3JpdGUgYSB0aHJpZnQ6OkVycm9yIHZhcmlhbnQgc3RydWN0LiBFcnJvciBzdHJ1Y3RzIHRha2UgdGhlIGZvcm06CisgIC8vIGBgYAorICAvLyBwdWIgc3RydWN0IGVycm9yX3N0cnVjdCB7CisgIC8vICAga2luZDogc3ViX2Vycm9yX2tpbmQsCisgIC8vICAgbWVzc2FnZTogZXJyb3JfbWVzc2FnZSwKKyAgLy8gfQorICAvLyBgYGAKKyAgLy8gQSBjb25jcmV0ZSBleGFtcGxlIGlzOgorICAvLyBgYGAKKyAgLy8gIHB1YiBzdHJ1Y3QgQXBwbGljYXRpb25FcnJvciB7CisgIC8vICAgIGtpbmQ6IEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpVbmtub3duLAorICAvLyAgICBtZXNzYWdlOiAiVGhpcyBpcyBzb21lIGVycm9yIG1lc3NhZ2UiLAorICAvLyAgfQorICAvLyBgYGAKKyAgdm9pZCByZW5kZXJfdGhyaWZ0X2Vycm9yX3N0cnVjdCgKKyAgICBjb25zdCBzdHJpbmcmIGVycm9yX3N0cnVjdCwKKyAgICBjb25zdCBzdHJpbmcmIHN1Yl9lcnJvcl9raW5kLAorICAgIGNvbnN0IHN0cmluZyYgZXJyb3JfbWVzc2FnZQorICApOworCisgIC8vIFJldHVybiBhIHN0cmluZyBjb250YWluaW5nIGFsbCB0aGUgdW5wYWNrZWQgc2VydmljZSBjYWxsIGFyZ3MgZ2l2ZW4gYSBzZXJ2aWNlIGNhbGwgZnVuY3Rpb24KKyAgLy8gYHRfZnVuY3Rpb25gLiBQcmVwZW5kcyB0aGUgYXJncyB3aXRoIGVpdGhlciBgJm11dCBzZWxmYCBvciBgJnNlbGZgIGFuZCBpbmNsdWRlcyB0aGUgYXJnIHR5cGVzCisgIC8vIGluIHRoZSByZXR1cm5lZCBzdHJpbmcsIGZvciBleGFtcGxlOgorICAvLyBgZm4gZm9vKCZtdXQgc2VsZiwgZmllbGRfMDogU3RyaW5nKWAuCisgIHN0cmluZyBydXN0X3N5bmNfc2VydmljZV9jYWxsX2RlY2xhcmF0aW9uKHRfZnVuY3Rpb24qIHRmdW5jLCBib29sIHNlbGZfaXNfbXV0YWJsZSk7CisKKyAgLy8gUmV0dXJuIGEgc3RyaW5nIGNvbnRhaW5pbmcgYWxsIHRoZSB1bnBhY2tlZCBzZXJ2aWNlIGNhbGwgYXJncyBnaXZlbiBhIHNlcnZpY2UgY2FsbCBmdW5jdGlvbgorICAvLyBgdF9mdW5jdGlvbmAuIE9ubHkgaW5jbHVkZXMgdGhlIGFyZyBuYW1lcywgZWFjaCBvZiB3aGljaCBpcyBwcmVmaXhlZCB3aXRoIHRoZSBvcHRpb25hbCBwcmVmaXgKKyAgLy8gYGZpZWxkX3ByZWZpeGAsIGZvciBleGFtcGxlOiBgc2VsZi5maWVsZF8wYC4KKyAgc3RyaW5nIHJ1c3Rfc3luY19zZXJ2aWNlX2NhbGxfaW52b2NhdGlvbih0X2Z1bmN0aW9uKiB0ZnVuYywgY29uc3Qgc3RyaW5nJiBmaWVsZF9wcmVmaXggPSAiIik7CisKKyAgLy8gUmV0dXJuIGEgc3RyaW5nIGNvbnRhaW5pbmcgYWxsIGZpZWxkcyBpbiB0aGUgc3RydWN0IGB0c3RydWN0YCBmb3IgdXNlIGluIGEgZnVuY3Rpb24gZGVjbGFyYXRpb24uCisgIC8vIEVhY2ggZmllbGQgaXMgZm9sbG93ZWQgYnkgaXRzIHR5cGUsIGZvciBleGFtcGxlOiBgZmllbGRfMDogU3RyaW5nYC4KKyAgc3RyaW5nIHN0cnVjdF90b19kZWNsYXJhdGlvbih0X3N0cnVjdCogdHN0cnVjdCwgdF9yc19nZW5lcmF0b3I6OmVfc3RydWN0X3R5cGUgc3RydWN0X3R5cGUpOworCisgIC8vIFJldHVybiBhIHN0cmluZyBjb250YWluaW5nIGFsbCBmaWVsZHMgaW4gdGhlIHN0cnVjdCBgdHN0cnVjdGAgZm9yIHVzZSBpbiBhIGZ1bmN0aW9uIGNhbGwsCisgIC8vIGZvciBleGFtcGxlOiBgZmllbGRfMDogU3RyaW5nYC4KKyAgc3RyaW5nIHN0cnVjdF90b19pbnZvY2F0aW9uKHRfc3RydWN0KiB0c3RydWN0LCBjb25zdCBzdHJpbmcmIGZpZWxkX3ByZWZpeCA9ICIiKTsKKworICAvLyBXcml0ZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgYSBzdHJ1Y3QsIHNlcnZpY2UtY2FsbCBvciBvdGhlciBkb2N1bWVudGF0aW9uLWFubm90YXRlZCBlbGVtZW50LgorICB2b2lkIHJlbmRlcl9ydXN0ZG9jKHRfZG9jKiB0ZG9jKTsKKworICAvLyBSZXR1cm4gYHRydWVgIGlmIHRoZSB0cnVlIHR5cGUgb2YgYHR0eXBlYCBpcyBhIHRocmlmdCBkb3VibGUsIGBmYWxzZWAgb3RoZXJ3aXNlLgorICBib29sIGlzX2RvdWJsZSh0X3R5cGUqIHR0eXBlKTsKKworICAvLyBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBydXN0IHR5cGUgZ2l2ZW4gYSBgdF90eXBlYC4KKyAgc3RyaW5nIHRvX3J1c3RfdHlwZSh0X3R5cGUqIHR0eXBlLCBib29sIG9yZGVyZWRfZmxvYXQgPSB0cnVlKTsKKworICAvLyBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBgY29uc3RgIHJ1c3QgdHlwZSBnaXZlbiBhIGB0X3R5cGVgCisgIHN0cmluZyB0b19ydXN0X2NvbnN0X3R5cGUodF90eXBlKiB0dHlwZSwgYm9vbCBvcmRlcmVkX2Zsb2F0ID0gdHJ1ZSk7CisKKyAgLy8gUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcmlmdCBgcHJvdG9jb2w6OlRUeXBlYCBnaXZlbiBhIGB0X3R5cGVgLgorICBzdHJpbmcgdG9fcnVzdF9maWVsZF90eXBlX2VudW0odF90eXBlKiB0dHlwZSk7CisKKyAgLy8gUmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlIHRvIGJlIHVzZWQgd2hlbiBpbml0aWFsaXppbmcgYSBzdHJ1Y3QgZmllbGQgd2hpY2ggaGFzIGBPUFRfSU5fUkVRX09VVGAKKyAgLy8gb3B0aW9uYWxpdHkuCisgIHN0cmluZyBvcHRfaW5fcmVxX291dF92YWx1ZSh0X3R5cGUqIHR0eXBlKTsKKworICAvLyBSZXR1cm4gYHRydWVgIGlmIHdlIGNhbiB3cml0ZSBhIGNvbnN0IG9mIHRoZSBmb3JtIGBwdWIgY29uc3QgRk9POiAuLi5gLgorICBib29sIGNhbl9nZW5lcmF0ZV9zaW1wbGVfY29uc3QodF90eXBlKiB0dHlwZSk7CisKKyAgLy8gUmV0dXJuIGB0cnVlYCBpZiB3ZSBjYW5ub3Qgd3JpdGUgYSBzdGFuZGFyZCBSdXN0IGNvbnN0YW50IChiZWNhdXNlIHRoZSB0eXBlIG5lZWRzIHNvbWUgYWxsb2NhdGlvbikuCisgIGJvb2wgY2FuX2dlbmVyYXRlX2NvbnN0X2hvbGRlcih0X3R5cGUqIHR0eXBlKTsKKworICAvLyBSZXR1cm4gYHRydWVgIGlmIHRoaXMgdHlwZSBpcyBhIHZvaWQsIGFuZCBzaG91bGQgYmUgcmVwcmVzZW50ZWQgYnkgdGhlIHJ1c3QgYCgpYCB0eXBlLgorICBib29sIGlzX3ZvaWQodF90eXBlKiB0dHlwZSk7CisKKyAgdF9maWVsZDo6ZV9yZXEgYWN0dWFsX2ZpZWxkX3JlcSh0X2ZpZWxkKiB0ZmllbGQsIHRfcnNfZ2VuZXJhdG9yOjplX3N0cnVjdF90eXBlIHN0cnVjdF90eXBlKTsKKworICAvLyBSZXR1cm4gYHRydWVgIGlmIHRoaXMgYHRfZmllbGQ6OmVfcmVxYCBpcyBlaXRoZXIgYHRfZmllbGQ6OlRfT1BUSU9OQUxgIG9yIGB0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUYAorICAvLyBhbmQgbmVlZHMgdG8gYmUgd3JhcHBlZCBieSBhbiBgT3B0aW9uPFRZUEVfTkFNRT5gLCBgZmFsc2VgIG90aGVyd2lzZS4KKyAgYm9vbCBpc19vcHRpb25hbCh0X2ZpZWxkOjplX3JlcSByZXEpOworCisgIC8vIFJldHVybiBgdHJ1ZWAgaWYgdGhlIHNlcnZpY2UgY2FsbCBoYXMgYXJndW1lbnRzLCBgZmFsc2VgIG90aGVyd2lzZS4KKyAgYm9vbCBoYXNfYXJncyh0X2Z1bmN0aW9uKiB0ZnVuYyk7CisKKyAgLy8gUmV0dXJuIGB0cnVlYCBpZiBhIHNlcnZpY2UgY2FsbCBoYXMgbm9uLWAoKWAgYXJndW1lbnRzLCBgZmFsc2VgIG90aGVyd2lzZS4KKyAgYm9vbCBoYXNfbm9uX3ZvaWRfYXJncyh0X2Z1bmN0aW9uKiB0ZnVuYyk7CisKKyAgLy8gUmV0dXJuIGBwdWIgYCAobm90aWNlIHRyYWlsaW5nIHdoaXRlc3BhY2UhKSBpZiB0aGUgc3RydWN0IHNob3VsZCBiZSBwdWJsaWMsIGBgIChlbXB0eSBzdHJpbmcpIG90aGVyd2lzZS4KKyAgc3RyaW5nIHZpc2liaWxpdHlfcXVhbGlmaWVyKHRfcnNfZ2VuZXJhdG9yOjplX3N0cnVjdF90eXBlIHN0cnVjdF90eXBlKTsKKworICAvLyBSZXR1cm5zIHRoZSBuYW1lc3BhY2UgcHJlZml4IGZvciBhIGdpdmVuIFRocmlmdCBzZXJ2aWNlLiBJZiB0aGUgdHlwZSBpcyBkZWZpbmVkIGluIHRoZSBwcmVzZW50bHktY29tcHV0ZWQKKyAgLy8gVGhyaWZ0IHByb2dyYW0sIHRoZW4gYW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkLgorICBzdHJpbmcgcnVzdF9uYW1lc3BhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgLy8gUmV0dXJucyB0aGUgbmFtZXNwYWNlIHByZWZpeCBmb3IgYSBnaXZlbiBUaHJpZnQgdHlwZS4gSWYgdGhlIHR5cGUgaXMgZGVmaW5lZCBpbiB0aGUgcHJlc2VudGx5LWNvbXB1dGVkCisgIC8vIFRocmlmdCBwcm9ncmFtLCB0aGVuIGFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZC4KKyAgc3RyaW5nIHJ1c3RfbmFtZXNwYWNlKHRfdHlwZSogdHR5cGUpOworCisgIC8vIFJldHVybnMgdGhlIGNhbWVsLWNhc2VkIG5hbWUgZm9yIGEgUnVzdCBzdHJ1Y3QgdHlwZS4gSGFuZGxlcyB0aGUgY2FzZSB3aGVyZSBgdHN0cnVjdC0+Z2V0X25hbWUoKWAgaXMKKyAgLy8gYSByZXNlcnZlZCB3b3JkLgorICBzdHJpbmcgcnVzdF9zdHJ1Y3RfbmFtZSh0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgLy8gUmV0dXJucyB0aGUgc25ha2UtY2FzZWQgbmFtZSBmb3IgYSBSdXN0IGZpZWxkIG9yIGxvY2FsIHZhcmlhYmxlLiBIYW5kbGVzIHRoZSBjYXNlIHdoZXJlCisgIC8vIGB0ZmllbGQtPmdldF9uYW1lKClgIGlzIGEgcmVzZXJ2ZWQgd29yZC4KKyAgc3RyaW5nIHJ1c3RfZmllbGRfbmFtZSh0X2ZpZWxkKiB0c3RydWN0KTsKKworICAvLyBSZXR1cm5zIHRoZSBjYW1lbC1jYXNlZCBuYW1lIGZvciBhIFJ1c3QgdW5pb24gdHlwZS4gSGFuZGxlcyB0aGUgY2FzZSB3aGVyZSBgdHN0cnVjdC0+Z2V0X25hbWUoKWAgaXMKKyAgLy8gYSByZXNlcnZlZCB3b3JkLgorICBzdHJpbmcgcnVzdF91bmlvbl9maWVsZF9uYW1lKHRfZmllbGQqIHRzdHJ1Y3QpOworCisgIC8vIENvbnZlcnRzIGFueSB2YXJpYWJsZSBuYW1lIGludG8gYSAnc2FmZScgdmFyaWFudCB0aGF0IGRvZXMgbm90IGNsYXNoIHdpdGggYW55IFJ1c3QgcmVzZXJ2ZWQga2V5d29yZHMuCisgIHN0cmluZyBydXN0X3NhZmVfbmFtZShjb25zdCBzdHJpbmcmIG5hbWUpOworCisgIC8vIFJldHVybiBgdHJ1ZWAgaWYgdGhlIG5hbWUgaXMgYSByZXNlcnZlZCBSdXN0IGtleXdvcmQsIGBmYWxzZWAgb3RoZXJ3aXNlLgorICBib29sIGlzX3Jlc2VydmVkKGNvbnN0IHN0cmluZyYgbmFtZSk7CisKKyAgLy8gUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiB0aGF0IHVzZXJzIHdpbGwgaW52b2tlIHRvIG1ha2Ugb3V0Z29pbmcgc2VydmljZSBjYWxscy4KKyAgc3RyaW5nIHNlcnZpY2VfY2FsbF9jbGllbnRfZnVuY3Rpb25fbmFtZSh0X2Z1bmN0aW9uKiB0ZnVuYyk7CisKKyAgLy8gUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiB0aGF0IHVzZXJzIHdpbGwgaGF2ZSB0byBpbXBsZW1lbnQgdG8gaGFuZGxlIGluY29taW5nIHNlcnZpY2UgY2FsbHMuCisgIHN0cmluZyBzZXJ2aWNlX2NhbGxfaGFuZGxlcl9mdW5jdGlvbl9uYW1lKHRfZnVuY3Rpb24qIHRmdW5jKTsKKworICAvLyBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHN0cnVjdCB1c2VkIHRvIHBhY2sgdGhlIGFyZ3VtZW50cyBmb3IgdGhlIHRocmlmdCBzZXJ2aWNlIGNhbGwuCisgIHN0cmluZyBzZXJ2aWNlX2NhbGxfYXJnc19zdHJ1Y3RfbmFtZSh0X2Z1bmN0aW9uKiB0ZnVuYyk7CisKKyAgLy8gUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBzdHJ1Y3QgdXNlZCB0byBwYWNrIHRoZSByZXR1cm4gdmFsdWUKKyAgLy8gYW5kIHVzZXItZGVmaW5lZCBleGNlcHRpb25zIGZvciB0aGUgdGhyaWZ0IHNlcnZpY2UgY2FsbC4KKyAgc3RyaW5nIHNlcnZpY2VfY2FsbF9yZXN1bHRfc3RydWN0X25hbWUodF9mdW5jdGlvbiogdGZ1bmMpOworCisgIHN0cmluZyBydXN0X3N5bmNfY2xpZW50X21hcmtlcl90cmFpdF9uYW1lKHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIC8vIFJldHVybiB0aGUgdHJhaXQgbmFtZSBmb3IgdGhlIHN5bmMgc2VydmljZSBjbGllbnQgZ2l2ZW4gYSBgdF9zZXJ2aWNlYC4KKyAgc3RyaW5nIHJ1c3Rfc3luY19jbGllbnRfdHJhaXRfbmFtZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICAvLyBSZXR1cm4gdGhlIG5hbWUgZm9yIHRoZSBzeW5jIHNlcnZpY2UgY2xpZW50IHN0cnVjdCBnaXZlbiBhIGB0X3NlcnZpY2VgLgorICBzdHJpbmcgcnVzdF9zeW5jX2NsaWVudF9pbXBsX25hbWUodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgLy8gUmV0dXJuIHRoZSB0cmFpdCBuYW1lIHRoYXQgdXNlcnMgd2lsbCBoYXZlIHRvIGltcGxlbWVudCBmb3IgdGhlIHNlcnZlciBoYWxmIG9mIGEgVGhyaWZ0IHNlcnZpY2UuCisgIHN0cmluZyBydXN0X3N5bmNfaGFuZGxlcl90cmFpdF9uYW1lKHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIC8vIFJldHVybiB0aGUgc3RydWN0IG5hbWUgZm9yIHRoZSAgc2VydmVyIGhhbGYgb2YgYSBUaHJpZnQgc2VydmljZS4KKyAgc3RyaW5nIHJ1c3Rfc3luY19wcm9jZXNzb3JfbmFtZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICAvLyBSZXR1cm4gdGhlIHN0cnVjdCBuYW1lIGZvciB0aGUgc3RydWN0IHRoYXQgY29udGFpbnMgYWxsIHRoZSBzZXJ2aWNlLWNhbGwgaW1wbGVtZW50YXRpb25zIGZvcgorICAvLyB0aGUgc2VydmVyIGhhbGYgb2YgYSBUaHJpZnQgc2VydmljZS4KKyAgc3RyaW5nIHJ1c3Rfc3luY19wcm9jZXNzb3JfaW1wbF9uYW1lKHRfc2VydmljZSAqdHNlcnZpY2UpOworCisgIC8vIFJldHVybiB0aGUgdmFyaWFudCBuYW1lIGZvciBhbiBlbnVtIHZhcmlhbnQKKyAgc3RyaW5nIHJ1c3RfZW51bV92YXJpYW50X25hbWUoY29uc3Qgc3RyaW5nJiBuYW1lKTsKKworICAvLyBQcm9wZXJseSB1cHBlcmNhc2UgbmFtZXMgZm9yIHVzZSBpbiBSdXN0LgorICBzdHJpbmcgcnVzdF91cHBlcl9jYXNlKGNvbnN0IHN0cmluZyYgbmFtZSk7CisKKyAgLy8gU25ha2UtY2FzZSBmaWVsZCwgcGFyYW1ldGVyIGFuZCBmdW5jdGlvbiBuYW1lcyBhbmQgbWFrZSB0aGVtIFJ1c3QgZnJpZW5kbHkuCisgIHN0cmluZyBydXN0X3NuYWtlX2Nhc2UoY29uc3Qgc3RyaW5nJiBuYW1lKTsKKworICAvLyBDYW1lbC1jYXNlIHR5cGUvdmFyaWFudCBuYW1lcyBhbmQgbWFrZSB0aGVtIFJ1c3QgZnJpZW5kbHkuCisgIHN0cmluZyBydXN0X2NhbWVsX2Nhc2UoY29uc3Qgc3RyaW5nJiBuYW1lKTsKKworICAvLyBSZXBsYWNlIGFsbCBpbnN0YW5jZXMgb2YgYHNlYXJjaF9zdHJpbmdgIHdpdGggYHJlcGxhY2Vfc3RyaW5nYCBpbiBgdGFyZ2V0YC4KKyAgdm9pZCBzdHJpbmdfcmVwbGFjZShzdHJpbmcmIHRhcmdldCwgY29uc3Qgc3RyaW5nJiBzZWFyY2hfc3RyaW5nLCBjb25zdCBzdHJpbmcmIHJlcGxhY2Vfc3RyaW5nKTsKK307CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICAvLyBtYWtlIG91dHB1dCBkaXJlY3RvcnkgZm9yIHRoaXMgdGhyaWZ0IHByb2dyYW0KKyAgTUtESVIoZ2VuX2Rpcl8uY19zdHIoKSk7CisKKyAgLy8gY3JlYXRlIHRoZSBmaWxlIGludG8gd2hpY2ggd2UncmUgZ29pbmcgdG8gd3JpdGUgdGhlIGdlbmVyYXRlZCBjb2RlCisgIHN0cmluZyBmX2dlbl9uYW1lID0gZ2VuX2Rpcl8gKyAiLyIgKyBydXN0X3NuYWtlX2Nhc2UoZ2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKSkgKyAiLnJzIjsKKyAgZl9nZW5fLm9wZW4oZl9nZW5fbmFtZS5jX3N0cigpKTsKKworICAvLyBoZWFkZXIgY29tbWVudAorICBmX2dlbl8gPDwgIi8vICIgPDwgYXV0b2dlbl9zdW1tYXJ5KCkgPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICIvLyBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HIiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKKworICByZW5kZXJfYXR0cmlidXRlc19hbmRfaW5jbHVkZXMoKTsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX2F0dHJpYnV0ZXNfYW5kX2luY2x1ZGVzKCkgeworICAvLyB0dXJuIG9mZiBzb21lIGNvbXBpbGVyL2NsaXBweSB3YXJuaW5ncworCisgIC8vIGNvZGUgYWx3YXlzIGluY2x1ZGVzIEJUcmVlTWFwL0JUcmVlU2V0L09yZGVyZWRGbG9hdAorICBmX2dlbl8gPDwgIiMhW2FsbG93KHVudXNlZF9pbXBvcnRzKV0iIDw8IGVuZGw7CisgIC8vIGNvZGUgbWlnaHQgbm90IGluY2x1ZGUgaW1wb3J0cyBmcm9tIGNyYXRlcworICBmX2dlbl8gPDwgIiMhW2FsbG93KHVudXNlZF9leHRlcm5fY3JhdGVzKV0iIDw8IGVuZGw7CisgIC8vIGNvbnN0cnVjdG9ycyB0YWtlICphbGwqIHN0cnVjdCBwYXJhbWV0ZXJzLCB3aGljaCBjYW4gdHJpZ2dlciB0aGUgInRvbyBtYW55IGFyZ3VtZW50cyIgd2FybmluZworICAvLyBzb21lIGF1dG8tZ2VuJ2QgdHlwZXMgY2FuIGJlIGRlZXBseSBuZXN0ZWQuIGNsaXBweSByZWNvbW1lbmRzIGZhY3RvcmluZyB0aGVtIG91dCB3aGljaCBpcyBoYXJkIHRvIGF1dG9nZW4KKyAgZl9nZW5fIDw8ICIjIVtjZmdfYXR0cihmZWF0dXJlID0gXCJjYXJnby1jbGlwcHlcIiwgYWxsb3codG9vX21hbnlfYXJndW1lbnRzLCB0eXBlX2NvbXBsZXhpdHkpKV0iIDw8IGVuZGw7CisgIC8vIHByZXZlbnQgcnVzdGZtdCBmcm9tIHJ1bm5pbmcgYWdhaW5zdCB0aGlzIGZpbGUKKyAgLy8gbGluZXMgYXJlIHRvbyBsb25nLCBjb2RlIGlzICh0aGFua2Z1bGx5ISkgbm90IHZpc3VhbC1pbmRlbnRlZCwgZXRjLgorICBmX2dlbl8gPDwgIiMhW2NmZ19hdHRyKHJ1c3RmbXQsIHJ1c3RmbXRfc2tpcCldIiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKKworICAvLyBhZGQgc3RhbmRhcmQgaW5jbHVkZXMKKyAgZl9nZW5fIDw8ICJleHRlcm4gY3JhdGUgb3JkZXJlZF9mbG9hdDsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAiZXh0ZXJuIGNyYXRlIHRocmlmdDsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAiZXh0ZXJuIGNyYXRlIHRyeV9mcm9tOyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAidXNlIG9yZGVyZWRfZmxvYXQ6Ok9yZGVyZWRGbG9hdDsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAidXNlIHN0ZDo6Y2VsbDo6UmVmQ2VsbDsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAidXNlIHN0ZDo6Y29sbGVjdGlvbnM6OntCVHJlZU1hcCwgQlRyZWVTZXR9OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICJ1c2Ugc3RkOjpjb252ZXJ0OjpGcm9tOyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICJ1c2Ugc3RkOjpkZWZhdWx0OjpEZWZhdWx0OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICJ1c2Ugc3RkOjplcnJvcjo6RXJyb3I7IiA8PCBlbmRsOworICBmX2dlbl8gPDwgInVzZSBzdGQ6OmZtdDsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAidXNlIHN0ZDo6Zm10Ojp7RGlzcGxheSwgRm9ybWF0dGVyfTsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAidXNlIHN0ZDo6cmM6OlJjOyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICJ1c2UgdHJ5X2Zyb206OlRyeUZyb207IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICJ1c2UgdGhyaWZ0Ojp7QXBwbGljYXRpb25FcnJvciwgQXBwbGljYXRpb25FcnJvcktpbmQsIFByb3RvY29sRXJyb3IsIFByb3RvY29sRXJyb3JLaW5kLCBUVGhyaWZ0Q2xpZW50fTsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAidXNlIHRocmlmdDo6cHJvdG9jb2w6OntURmllbGRJZGVudGlmaWVyLCBUTGlzdElkZW50aWZpZXIsIFRNYXBJZGVudGlmaWVyLCBUTWVzc2FnZUlkZW50aWZpZXIsIFRNZXNzYWdlVHlwZSwgVElucHV0UHJvdG9jb2wsIFRPdXRwdXRQcm90b2NvbCwgVFNldElkZW50aWZpZXIsIFRTdHJ1Y3RJZGVudGlmaWVyLCBUVHlwZX07IiA8PCBlbmRsOworICBmX2dlbl8gPDwgInVzZSB0aHJpZnQ6OnByb3RvY29sOjpmaWVsZF9pZDsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAidXNlIHRocmlmdDo6cHJvdG9jb2w6OnZlcmlmeV9leHBlY3RlZF9tZXNzYWdlX3R5cGU7IiA8PCBlbmRsOworICBmX2dlbl8gPDwgInVzZSB0aHJpZnQ6OnByb3RvY29sOjp2ZXJpZnlfZXhwZWN0ZWRfc2VxdWVuY2VfbnVtYmVyOyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICJ1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6dmVyaWZ5X2V4cGVjdGVkX3NlcnZpY2VfY2FsbDsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAidXNlIHRocmlmdDo6cHJvdG9jb2w6OnZlcmlmeV9yZXF1aXJlZF9maWVsZF9leGlzdHM7IiA8PCBlbmRsOworICBmX2dlbl8gPDwgInVzZSB0aHJpZnQ6OnNlcnZlcjo6VFByb2Nlc3NvcjsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworCisgIC8vIGFkZCBhbGwgdGhlIHByb2dyYW0gaW5jbHVkZXMKKyAgLy8gTk9URTogdGhpcyBpcyBtb3JlIGludm9sdmVkIHRoYW4geW91IHdvdWxkIGV4cGVjdCBiZWNhdXNlIG9mIHNlcnZpY2UgZXh0ZW5zaW9uCisgIC8vIEJhc2ljYWxseSwgSSBoYXZlIHRvIGZpbmQgdGhlIGNsb3N1cmUgb2YgYWxsIHRoZSBzZXJ2aWNlcyBhbmQgaW5jbHVkZSB0aGVpciBtb2R1bGVzIGF0IHRoZSB0b3AtbGV2ZWwKKworICBzZXQ8c3RyaW5nPiByZWZlcmVuY2VkX21vZHVsZXM7CisKKyAgLy8gZmlyc3QsIHN0YXJ0IGJ5IGFkZGluZyBleHBsaWNpdCB0aHJpZnQgaW5jbHVkZXMKKyAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+IGluY2x1ZGVzID0gZ2V0X3Byb2dyYW0oKS0+Z2V0X2luY2x1ZGVzKCk7CisgIHZlY3Rvcjx0X3Byb2dyYW0qPjo6Y29uc3RfaXRlcmF0b3IgaW5jbHVkZXNfaXRlcjsKKyAgZm9yKGluY2x1ZGVzX2l0ZXIgPSBpbmNsdWRlcy5iZWdpbigpOyBpbmNsdWRlc19pdGVyICE9IGluY2x1ZGVzLmVuZCgpOyArK2luY2x1ZGVzX2l0ZXIpIHsKKyAgICByZWZlcmVuY2VkX21vZHVsZXMuaW5zZXJ0KCgqaW5jbHVkZXNfaXRlciktPmdldF9uYW1lKCkpOworICB9CisKKyAgLy8gbmV4dCwgcmVjdXJzaXZlbHkgaXRlcmF0ZSB0aHJvdWdoIGFsbCB0aGUgc2VydmljZXMgYW5kIGFkZCB0aGUgbmFtZXMgb2YgYW55IHByb2dyYW1zIHRoZXkgcmVmZXJlbmNlCisgIGNvbnN0IHZlY3Rvcjx0X3NlcnZpY2UqPiBzZXJ2aWNlcyA9IGdldF9wcm9ncmFtKCktPmdldF9zZXJ2aWNlcygpOworICB2ZWN0b3I8dF9zZXJ2aWNlKj46OmNvbnN0X2l0ZXJhdG9yIHNlcnZpY2VfaXRlcjsKKyAgZm9yIChzZXJ2aWNlX2l0ZXIgPSBzZXJ2aWNlcy5iZWdpbigpOyBzZXJ2aWNlX2l0ZXIgIT0gc2VydmljZXMuZW5kKCk7ICsrc2VydmljZV9pdGVyKSB7CisgICAgY29tcHV0ZV9zZXJ2aWNlX3JlZmVyZW5jZWRfbW9kdWxlcygqc2VydmljZV9pdGVyLCByZWZlcmVuY2VkX21vZHVsZXMpOworICB9CisKKyAgLy8gZmluYWxseSwgd3JpdGUgYWxsIHRoZSAicHViIHVzZS4uLiIgZGVjbGFyYXRpb25zCisgIGlmICghcmVmZXJlbmNlZF9tb2R1bGVzLmVtcHR5KCkpIHsKKyAgICBzZXQ8c3RyaW5nPjo6aXRlcmF0b3IgbW9kdWxlX2l0ZXI7CisgICAgZm9yIChtb2R1bGVfaXRlciA9IHJlZmVyZW5jZWRfbW9kdWxlcy5iZWdpbigpOyBtb2R1bGVfaXRlciAhPSByZWZlcmVuY2VkX21vZHVsZXMuZW5kKCk7ICsrbW9kdWxlX2l0ZXIpIHsKKyAgICAgIGZfZ2VuXyA8PCAidXNlICIgPDwgcnVzdF9zbmFrZV9jYXNlKCptb2R1bGVfaXRlcikgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICAgIGZfZ2VuXyA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OmNvbXB1dGVfc2VydmljZV9yZWZlcmVuY2VkX21vZHVsZXMoCisgIHRfc2VydmljZSAqdHNlcnZpY2UsCisgIHNldDxzdHJpbmc+ICZyZWZlcmVuY2VkX21vZHVsZXMKKykgeworICB0X3NlcnZpY2UqIGV4dGVuZHMgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKyAgaWYgKGV4dGVuZHMpIHsKKyAgICBpZiAoZXh0ZW5kcy0+Z2V0X3Byb2dyYW0oKSAhPSBnZXRfcHJvZ3JhbSgpKSB7CisgICAgICByZWZlcmVuY2VkX21vZHVsZXMuaW5zZXJ0KGV4dGVuZHMtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lKCkpOworICAgIH0KKyAgICBjb21wdXRlX3NlcnZpY2VfcmVmZXJlbmNlZF9tb2R1bGVzKGV4dGVuZHMsIHJlZmVyZW5jZWRfbW9kdWxlcyk7CisgIH0KK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworICBmX2dlbl8uY2xvc2UoKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIENvbnN0cworLy8KKy8vIE5PVEU6IGNvbnNpZGVyIHVzaW5nIG1hY3JvcyB0byBnZW5lcmF0ZSBjb25zdGFudHMKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFRoaXMgaXMgd29yc2UgdGhhbiBpdCBzaG91bGQgYmUgYmVjYXVzZSBjb25zdGFudHMKKy8vIGFyZW4ndCAoc2Vuc2libHkpIGxpbWl0ZWQgdG8gc2NhbGFyIHR5cGVzCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKKyAgc3RyaW5nIG5hbWUgPSB0Y29uc3QtPmdldF9uYW1lKCk7CisgIHRfdHlwZSogdHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7CisgIHRfY29uc3RfdmFsdWUqIHR2YWx1ZSA9IHRjb25zdC0+Z2V0X3ZhbHVlKCk7CisKKyAgaWYgKGNhbl9nZW5lcmF0ZV9zaW1wbGVfY29uc3QodHR5cGUpKSB7CisgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKG5hbWUsIHR0eXBlLCB0dmFsdWUpOworICB9IGVsc2UgaWYgKGNhbl9nZW5lcmF0ZV9jb25zdF9ob2xkZXIodHR5cGUpKSB7CisgICAgcmVuZGVyX2NvbnN0X3ZhbHVlX2hvbGRlcihuYW1lLCB0dHlwZSwgdHZhbHVlKTsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiY2Fubm90IGdlbmVyYXRlIGNvbnN0IGZvciAiICsgbmFtZTsKKyAgfQorfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUoY29uc3Qgc3RyaW5nJiBuYW1lLCB0X3R5cGUqIHR0eXBlLCB0X2NvbnN0X3ZhbHVlKiB0dmFsdWUpIHsKKyAgaWYgKCFjYW5fZ2VuZXJhdGVfc2ltcGxlX2NvbnN0KHR0eXBlKSkgeworICAgIHRocm93ICJjYW5ub3QgZ2VuZXJhdGUgc2ltcGxlIHJ1c3QgY29uc3RhbnQgZm9yICIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorCisgIGZfZ2VuXyA8PCAicHViIGNvbnN0ICIgPDwgcnVzdF91cHBlcl9jYXNlKG5hbWUpIDw8ICI6ICIgPDwgdG9fcnVzdF9jb25zdF90eXBlKHR0eXBlKSA8PCAiID0gIjsKKyAgcmVuZGVyX2NvbnN0X3ZhbHVlKHR0eXBlLCB0dmFsdWUsIGZhbHNlKTsKKyAgZl9nZW5fIDw8ICI7IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlX2hvbGRlcihjb25zdCBzdHJpbmcmIG5hbWUsIHRfdHlwZSogdHR5cGUsIHRfY29uc3RfdmFsdWUqIHR2YWx1ZSkgeworICBpZiAoIWNhbl9nZW5lcmF0ZV9jb25zdF9ob2xkZXIodHR5cGUpKSB7CisgICAgdGhyb3cgImNhbm5vdCBnZW5lcmF0ZSBjb25zdGFudCBob2xkZXIgZm9yICIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorCisgIHN0cmluZyBob2xkZXJfbmFtZSgiQ29uc3QiICsgcnVzdF9jYW1lbF9jYXNlKG5hbWUpKTsKKworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInB1YiBzdHJ1Y3QgIiA8PCBob2xkZXJfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJpbXBsICIgPDwgaG9sZGVyX25hbWUgPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInB1YiBmbiBjb25zdF92YWx1ZSgpIC0+ICIgPDwgdG9fcnVzdF90eXBlKHR0eXBlKSA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICByZW5kZXJfY29uc3RfdmFsdWUodHR5cGUsIHR2YWx1ZSk7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0dHlwZSwgdF9jb25zdF92YWx1ZSogdHZhbHVlLCBib29sIGlzX293bmVkKSB7CisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZSogdGJhc2VfdHlwZSA9ICh0X2Jhc2VfdHlwZSopdHR5cGU7CisgICAgc3dpdGNoICh0YmFzZV90eXBlLT5nZXRfYmFzZSgpKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBpZiAodGJhc2VfdHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgaWYgKGlzX293bmVkKSB7CisgICAgICAgICAgZl9nZW5fIDw8ICJcIiIgPDwgdHZhbHVlLT5nZXRfc3RyaW5nKCkgPDwgIlwiIjw8ICAiLnRvX293bmVkKCkuaW50b19ieXRlcygpIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmX2dlbl8gPDwgImJcIiIgPDwgdHZhbHVlLT5nZXRfc3RyaW5nKCkgPDwgIlwiIjsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9nZW5fIDw8ICJcIiIgPDwgdHZhbHVlLT5nZXRfc3RyaW5nKCkgPDwgIlwiIjsKKyAgICAgICAgaWYgKGlzX293bmVkKSB7CisgICAgICAgICAgZl9nZW5fIDw8ICIudG9fb3duZWQoKSI7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIGZfZ2VuXyA8PCAodHZhbHVlLT5nZXRfaW50ZWdlcigpID8gInRydWUiIDogImZhbHNlIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgZl9nZW5fIDw8IHR2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgZl9nZW5fIDw8ICJPcmRlcmVkRmxvYXQ6OmZyb20oIiA8PCB0dmFsdWUtPmdldF9kb3VibGUoKSA8PCAiIGFzIGY2NCkiOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjYW5ub3QgZ2VuZXJhdGUgY29uc3QgdmFsdWUgZm9yICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2VfdHlwZS0+Z2V0X2Jhc2UoKSk7CisgICAgfQorICB9IGVsc2UgaWYgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICByZW5kZXJfY29uc3RfdmFsdWUoZ2V0X3RydWVfdHlwZSh0dHlwZSksIHR2YWx1ZSk7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX2dlbl8KKyAgICAgIDw8IGluZGVudCgpCisgICAgICA8PCB0b19ydXN0X3R5cGUodHR5cGUpCisgICAgICA8PCAiOjp0cnlfZnJvbSgiCisgICAgICA8PCB0dmFsdWUtPmdldF9pbnRlZ2VyKCkKKyAgICAgIDw8ICIpLmV4cGVjdChcImV4cGVjdGluZyB2YWxpZCBjb25zdCB2YWx1ZVwiKSIKKyAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmVuZGVyX2NvbnN0X3N0cnVjdCh0dHlwZSwgdHZhbHVlKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkpIHsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgcmVuZGVyX2NvbnN0X2xpc3QodHR5cGUsIHR2YWx1ZSk7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIHJlbmRlcl9jb25zdF9zZXQodHR5cGUsIHR2YWx1ZSk7CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgIHJlbmRlcl9jb25zdF9tYXAodHR5cGUsIHR2YWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93ICJjYW5ub3QgZ2VuZXJhdGUgY29uc3QgY29udGFpbmVyIHZhbHVlIGZvciAiICsgdHR5cGUtPmdldF9uYW1lKCk7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgImNhbm5vdCBnZW5lcmF0ZSBjb25zdCB2YWx1ZSBmb3IgIiArIHR0eXBlLT5nZXRfbmFtZSgpOworICB9Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF9zdHJ1Y3QodF90eXBlKiB0dHlwZSwgdF9jb25zdF92YWx1ZSopIHsKKyAgaWYgKCgodF9zdHJ1Y3QqKXR0eXBlKS0+aXNfdW5pb24oKSkgeworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInVuaW1wbGVtZW50ZWQhKCkiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAidW5pbXBsZW1lbnRlZCEoKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfQorfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfbGlzdCh0X3R5cGUqIHR0eXBlLCB0X2NvbnN0X3ZhbHVlKiB0dmFsdWUpIHsKKyAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IG11dCBsOiBWZWM8IiA8PCB0b19ydXN0X3R5cGUoZWxlbV90eXBlKSA8PCAiPiA9IFZlYzo6bmV3KCk7IiA8PCBlbmRsOworICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiBlbGVtcyA9IHR2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IgZWxlbV9pdGVyOworICBmb3IoZWxlbV9pdGVyID0gZWxlbXMuYmVnaW4oKTsgZWxlbV9pdGVyICE9IGVsZW1zLmVuZCgpOyArK2VsZW1faXRlcikgeworICAgIHRfY29uc3RfdmFsdWUqIGVsZW1fdmFsdWUgPSAoKmVsZW1faXRlcik7CisgICAgcmVuZGVyX2NvbnRhaW5lcl9jb25zdF92YWx1ZSgibC5wdXNoIiwgZWxlbV90eXBlLCBlbGVtX3ZhbHVlKTsKKyAgfQorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImwiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF9zZXQodF90eXBlKiB0dHlwZSwgdF9jb25zdF92YWx1ZSogdHZhbHVlKSB7CisgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IG11dCBzOiBCVHJlZVNldDwiIDw8IHRvX3J1c3RfdHlwZShlbGVtX3R5cGUpIDw8ICI+ID0gQlRyZWVTZXQ6Om5ldygpOyIgPDwgZW5kbDsKKyAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgZWxlbXMgPSB0dmFsdWUtPmdldF9saXN0KCk7CisgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGVsZW1faXRlcjsKKyAgZm9yKGVsZW1faXRlciA9IGVsZW1zLmJlZ2luKCk7IGVsZW1faXRlciAhPSBlbGVtcy5lbmQoKTsgKytlbGVtX2l0ZXIpIHsKKyAgICB0X2NvbnN0X3ZhbHVlKiBlbGVtX3ZhbHVlID0gKCplbGVtX2l0ZXIpOworICAgIHJlbmRlcl9jb250YWluZXJfY29uc3RfdmFsdWUoInMuaW5zZXJ0IiwgZWxlbV90eXBlLCBlbGVtX3ZhbHVlKTsKKyAgfQorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInMiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF9tYXAodF90eXBlKiB0dHlwZSwgdF9jb25zdF92YWx1ZSogdHZhbHVlKSB7CisgIHRfdHlwZSoga2V5X3R5cGUgPSAoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpOworICB0X3R5cGUqIHZhbF90eXBlID0gKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAibGV0IG11dCBtOiBCVHJlZU1hcDwiCisgICAgPDwgdG9fcnVzdF90eXBlKGtleV90eXBlKSA8PCAiLCAiIDw8IHRvX3J1c3RfdHlwZSh2YWxfdHlwZSkKKyAgICA8PCAiPiA9IEJUcmVlTWFwOjpuZXcoKTsiCisgICAgPDwgZW5kbDsKKyAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIGVsZW1zID0gdHZhbHVlLT5nZXRfbWFwKCk7CisgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciBlbGVtX2l0ZXI7CisgIGZvciAoZWxlbV9pdGVyID0gZWxlbXMuYmVnaW4oKTsgZWxlbV9pdGVyICE9IGVsZW1zLmVuZCgpOyArK2VsZW1faXRlcikgeworICAgIHRfY29uc3RfdmFsdWUqIGtleV92YWx1ZSA9IGVsZW1faXRlci0+Zmlyc3Q7CisgICAgdF9jb25zdF92YWx1ZSogdmFsX3ZhbHVlID0gZWxlbV9pdGVyLT5zZWNvbmQ7CisgICAgaWYgKGdldF90cnVlX3R5cGUoa2V5X3R5cGUpLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgayA9ICI7CisgICAgICByZW5kZXJfY29uc3RfdmFsdWUoa2V5X3R5cGUsIGtleV92YWx1ZSk7CisgICAgICBmX2dlbl8gPDwgIjsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IGsgPSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICByZW5kZXJfY29uc3RfdmFsdWUoa2V5X3R5cGUsIGtleV92YWx1ZSk7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9OyIgPDwgZW5kbDsKKyAgICB9CisgICAgaWYgKGdldF90cnVlX3R5cGUodmFsX3R5cGUpLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgdiA9ICI7CisgICAgICByZW5kZXJfY29uc3RfdmFsdWUodmFsX3R5cGUsIHZhbF92YWx1ZSk7CisgICAgICBmX2dlbl8gPDwgIjsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IHYgPSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICByZW5kZXJfY29uc3RfdmFsdWUodmFsX3R5cGUsIHZhbF92YWx1ZSk7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9OyIgPDwgZW5kbDsKKyAgICB9CisgICAgZl9nZW5fIDw8ICBpbmRlbnQoKSA8PCAibS5pbnNlcnQoaywgdik7IiA8PCBlbmRsOworICB9CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibSIgPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnRhaW5lcl9jb25zdF92YWx1ZSgKKyAgY29uc3Qgc3RyaW5nJiBpbnNlcnRfZnVuY3Rpb24sCisgIHRfdHlwZSogdHR5cGUsCisgIHRfY29uc3RfdmFsdWUqIHR2YWx1ZQorKSB7CisgIGlmIChnZXRfdHJ1ZV90eXBlKHR0eXBlKS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgaW5zZXJ0X2Z1bmN0aW9uIDw8ICIoIjsKKyAgICByZW5kZXJfY29uc3RfdmFsdWUodHR5cGUsIHR2YWx1ZSk7CisgICAgZl9nZW5fIDw8ICIpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgaW5zZXJ0X2Z1bmN0aW9uIDw8ICIoIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIHJlbmRlcl9jb25zdF92YWx1ZSh0dHlwZSwgdHZhbHVlKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiKTsiIDw8IGVuZGw7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFR5cGVkZWZzCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKKyAgc3RkOjpzdHJpbmcgYWN0dWFsX3R5cGUgPSB0b19ydXN0X3R5cGUodHR5cGVkZWYtPmdldF90eXBlKCkpOworICBmX2dlbl8gPDwgInB1YiB0eXBlICIgPDwgcnVzdF9zYWZlX25hbWUodHR5cGVkZWYtPmdldF9zeW1ib2xpYygpKSA8PCAiID0gIiA8PCBhY3R1YWxfdHlwZSA8PCAiOyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBFbnVtcworLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIHN0cmluZyBlbnVtX25hbWUocnVzdF9jYW1lbF9jYXNlKHRlbnVtLT5nZXRfbmFtZSgpKSk7CisgIHJlbmRlcl9lbnVtX2RlZmluaXRpb24odGVudW0sIGVudW1fbmFtZSk7CisgIHJlbmRlcl9lbnVtX2ltcGwoZW51bV9uYW1lKTsKKyAgcmVuZGVyX2VudW1fY29udmVyc2lvbih0ZW51bSwgZW51bV9uYW1lKTsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX2VudW1fZGVmaW5pdGlvbih0X2VudW0qIHRlbnVtLCBjb25zdCBzdHJpbmcmIGVudW1fbmFtZSkgeworICByZW5kZXJfcnVzdGRvYygodF9kb2MqKSB0ZW51bSk7CisgIGZfZ2VuXyA8PCAiI1tkZXJpdmUoQ29weSwgQ2xvbmUsIERlYnVnLCBFcSwgSGFzaCwgT3JkLCBQYXJ0aWFsRXEsIFBhcnRpYWxPcmQpXSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICJwdWIgZW51bSAiIDw8IGVudW1fbmFtZSA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNvbnN0YW50c19pdGVyOworICBmb3IgKGNvbnN0YW50c19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNvbnN0YW50c19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjb25zdGFudHNfaXRlcikgeworICAgIHRfZW51bV92YWx1ZSogdmFsID0gKCpjb25zdGFudHNfaXRlcik7CisgICAgcmVuZGVyX3J1c3Rkb2MoKHRfZG9jKikgdmFsKTsKKyAgICBmX2dlbl8KKyAgICAgIDw8IGluZGVudCgpCisgICAgICA8PCBydXN0X2VudW1fdmFyaWFudF9uYW1lKHZhbC0+Z2V0X25hbWUoKSkKKyAgICAgIDw8ICIgPSAiCisgICAgICA8PCB2YWwtPmdldF92YWx1ZSgpCisgICAgICA8PCAiLCIKKyAgICAgIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfZW51bV9pbXBsKGNvbnN0IHN0cmluZyYgZW51bV9uYW1lKSB7CisgIGZfZ2VuXyA8PCAiaW1wbCAiIDw8IGVudW1fbmFtZSA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgInB1YiBmbiB3cml0ZV90b19vdXRfcHJvdG9jb2woJnNlbGYsIG9fcHJvdDogJm11dCBUT3V0cHV0UHJvdG9jb2wpIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7IgorICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9pMzIoKnNlbGYgYXMgaTMyKSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgInB1YiBmbiByZWFkX2Zyb21faW5fcHJvdG9jb2woaV9wcm90OiAmbXV0IFRJbnB1dFByb3RvY29sKSAtPiB0aHJpZnQ6OlJlc3VsdDwiIDw8IGVudW1fbmFtZSA8PCAiPiB7IgorICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IGVudW1fdmFsdWUgPSBpX3Byb3QucmVhZF9pMzIoKT87IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgZW51bV9uYW1lIDw8ICI6OnRyeV9mcm9tKGVudW1fdmFsdWUpIjsKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX2VudW1fY29udmVyc2lvbih0X2VudW0qIHRlbnVtLCBjb25zdCBzdHJpbmcmIGVudW1fbmFtZSkgeworICBmX2dlbl8gPDwgImltcGwgVHJ5RnJvbTxpMzI+IGZvciAiIDw8IGVudW1fbmFtZSA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAidHlwZSBFcnIgPSB0aHJpZnQ6OkVycm9yOyI7CisKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJmbiB0cnlfZnJvbShpOiBpMzIpIC0+IFJlc3VsdDxTZWxmLCBTZWxmOjpFcnI+IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibWF0Y2ggaSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjb25zdGFudHNfaXRlcjsKKyAgZm9yIChjb25zdGFudHNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjb25zdGFudHNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY29uc3RhbnRzX2l0ZXIpIHsKKyAgICB0X2VudW1fdmFsdWUqIHZhbCA9ICgqY29uc3RhbnRzX2l0ZXIpOworICAgIGZfZ2VuXworICAgICAgPDwgaW5kZW50KCkKKyAgICAgIDw8IHZhbC0+Z2V0X3ZhbHVlKCkKKyAgICAgIDw8ICIgPT4gT2soIiA8PCBlbnVtX25hbWUgPDwgIjo6IiA8PCBydXN0X2VudW1fdmFyaWFudF9uYW1lKHZhbC0+Z2V0X25hbWUoKSkgPDwgIiksIgorICAgICAgPDwgZW5kbDsKKyAgfQorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIl8gPT4geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHJlbmRlcl90aHJpZnRfZXJyb3IoCisgICAgIlByb3RvY29sIiwKKyAgICAiUHJvdG9jb2xFcnJvciIsCisgICAgIlByb3RvY29sRXJyb3JLaW5kOjpJbnZhbGlkRGF0YSIsCisgICAgImZvcm1hdCEoXCJjYW5ub3QgY29udmVydCBlbnVtIGNvbnN0YW50IHt9IHRvICIgKyBlbnVtX25hbWUgKyAiXCIsIGkpIgorICApOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0sIiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFN0cnVjdHMsIFVuaW9ucyBhbmQgRXhjZXB0aW9ucworLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICByZW5kZXJfc3RydWN0KHJ1c3Rfc3RydWN0X25hbWUodHhjZXB0aW9uKSwgdHhjZXB0aW9uLCB0X3JzX2dlbmVyYXRvcjo6VF9FWENFUFRJT04pOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaWYgKHRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKKyAgICByZW5kZXJfdW5pb24odHN0cnVjdCk7CisgIH0gZWxzZSBpZiAodHN0cnVjdC0+aXNfc3RydWN0KCkpIHsKKyAgICByZW5kZXJfc3RydWN0KHJ1c3Rfc3RydWN0X25hbWUodHN0cnVjdCksIHRzdHJ1Y3QsIHRfcnNfZ2VuZXJhdG9yOjpUX1JFR1VMQVIpOworICB9IGVsc2UgeworICAgIHRocm93ICJjYW5ub3QgZ2VuZXJhdGUgc3RydWN0IGZvciBleGNlcHRpb24iOworICB9Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zdHJ1Y3QoCisgIGNvbnN0IHN0cmluZyYgc3RydWN0X25hbWUsCisgIHRfc3RydWN0KiB0c3RydWN0LAorICB0X3JzX2dlbmVyYXRvcjo6ZV9zdHJ1Y3RfdHlwZSBzdHJ1Y3RfdHlwZQorKSB7CisgIHJlbmRlcl90eXBlX2NvbW1lbnQoc3RydWN0X25hbWUpOworICByZW5kZXJfc3RydWN0X2RlZmluaXRpb24oc3RydWN0X25hbWUsIHRzdHJ1Y3QsIHN0cnVjdF90eXBlKTsKKyAgcmVuZGVyX3N0cnVjdF9pbXBsKHN0cnVjdF9uYW1lLCB0c3RydWN0LCBzdHJ1Y3RfdHlwZSk7CisgIGlmIChzdHJ1Y3RfdHlwZSA9PSB0X3JzX2dlbmVyYXRvcjo6VF9SRUdVTEFSIHx8IHN0cnVjdF90eXBlID09IHRfcnNfZ2VuZXJhdG9yOjpUX0VYQ0VQVElPTikgeworICAgIHJlbmRlcl9zdHJ1Y3RfZGVmYXVsdF90cmFpdF9pbXBsKHN0cnVjdF9uYW1lLCB0c3RydWN0KTsKKyAgfQorICBpZiAoc3RydWN0X3R5cGUgPT0gdF9yc19nZW5lcmF0b3I6OlRfRVhDRVBUSU9OKSB7CisgICAgcmVuZGVyX2V4Y2VwdGlvbl9zdHJ1Y3RfZXJyb3JfdHJhaXRfaW1wbHMoc3RydWN0X25hbWUsIHRzdHJ1Y3QpOworICB9Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zdHJ1Y3RfZGVmaW5pdGlvbigKKyAgY29uc3Qgc3RyaW5nJiBzdHJ1Y3RfbmFtZSwKKyAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgIHRfcnNfZ2VuZXJhdG9yOjplX3N0cnVjdF90eXBlIHN0cnVjdF90eXBlCispIHsKKyAgcmVuZGVyX3J1c3Rkb2MoKHRfZG9jKikgdHN0cnVjdCk7CisgIGZfZ2VuXyA8PCAiI1tkZXJpdmUoQ2xvbmUsIERlYnVnLCBFcSwgSGFzaCwgT3JkLCBQYXJ0aWFsRXEsIFBhcnRpYWxPcmQpXSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IHZpc2liaWxpdHlfcXVhbGlmaWVyKHN0cnVjdF90eXBlKSA8PCAic3RydWN0ICIgPDwgc3RydWN0X25hbWUgPDwgIiB7IiA8PCBlbmRsOworCisgIC8vIHJlbmRlciB0aGUgbWVtYmVycworICB2ZWN0b3I8dF9maWVsZCo+IG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgaWYgKCFtZW1iZXJzLmVtcHR5KCkpIHsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIG1lbWJlcnNfaXRlcjsKKyAgICBmb3IobWVtYmVyc19pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtZW1iZXJzX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttZW1iZXJzX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIG1lbWJlciA9ICgqbWVtYmVyc19pdGVyKTsKKyAgICAgIHRfZmllbGQ6OmVfcmVxIG1lbWJlcl9yZXEgPSBhY3R1YWxfZmllbGRfcmVxKG1lbWJlciwgc3RydWN0X3R5cGUpOworCisgICAgICBzdHJpbmcgcnVzdF90eXBlID0gdG9fcnVzdF90eXBlKG1lbWJlci0+Z2V0X3R5cGUoKSk7CisgICAgICBydXN0X3R5cGUgPSBpc19vcHRpb25hbChtZW1iZXJfcmVxKSA/ICJPcHRpb248IiArIHJ1c3RfdHlwZSArICI+IiA6IHJ1c3RfdHlwZTsKKworICAgICAgcmVuZGVyX3J1c3Rkb2MoKHRfZG9jKikgbWVtYmVyKTsKKyAgICAgIGZfZ2VuXworICAgICAgICA8PCBpbmRlbnQoKQorICAgICAgICA8PCB2aXNpYmlsaXR5X3F1YWxpZmllcihzdHJ1Y3RfdHlwZSkKKyAgICAgICAgPDwgcnVzdF9maWVsZF9uYW1lKG1lbWJlcikgPDwgIjogIiA8PCBydXN0X3R5cGUgPDwgIiwiCisgICAgICAgIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorCisgIGZfZ2VuXyA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9leGNlcHRpb25fc3RydWN0X2Vycm9yX3RyYWl0X2ltcGxzKGNvbnN0IHN0cmluZyYgc3RydWN0X25hbWUsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIC8vIGVycm9yOjpFcnJvciB0cmFpdAorICBmX2dlbl8gPDwgImltcGwgRXJyb3IgZm9yICIgPDwgc3RydWN0X25hbWUgPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJmbiBkZXNjcmlwdGlvbigmc2VsZikgLT4gJnN0ciB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJcIiIgPDwgInJlbW90ZSBzZXJ2aWNlIHRocmV3ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiXCIiIDw8IGVuZGw7IC8vIHVzZSAqb3JpZ2luYWwqIG5hbWUKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworCisgIC8vIGNvbnZlcnQ6OkZyb20gdHJhaXQKKyAgZl9nZW5fIDw8ICJpbXBsIEZyb208IiA8PCBzdHJ1Y3RfbmFtZSA8PCAiPiBmb3IgdGhyaWZ0OjpFcnJvciB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJmbiBmcm9tKGU6ICIgPDwgc3RydWN0X25hbWUgPDwgIikgLT4gU2VsZiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ0aHJpZnQ6OkVycm9yOjpVc2VyKEJveDo6bmV3KGUpKSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworCisgIC8vIGZtdDo6RGlzcGxheSB0cmFpdAorICBmX2dlbl8gPDwgImltcGwgRGlzcGxheSBmb3IgIiA8PCBzdHJ1Y3RfbmFtZSA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImZuIGZtdCgmc2VsZiwgZjogJm11dCBGb3JtYXR0ZXIpIC0+IGZtdDo6UmVzdWx0IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInNlbGYuZGVzY3JpcHRpb24oKS5mbXQoZikiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N0cnVjdF9kZWZhdWx0X3RyYWl0X2ltcGwoY29uc3Qgc3RyaW5nJiBzdHJ1Y3RfbmFtZSwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgYm9vbCBoYXNfcmVxdWlyZWRfZmllbGQgPSBmYWxzZTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1lbWJlcnNfaXRlcjsKKyAgZm9yIChtZW1iZXJzX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1lbWJlcnNfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21lbWJlcnNfaXRlcikgeworICAgIHRfZmllbGQqIG1lbWJlciA9ICptZW1iZXJzX2l0ZXI7CisgICAgaWYgKCFpc19vcHRpb25hbChtZW1iZXItPmdldF9yZXEoKSkpIHsKKyAgICAgIGhhc19yZXF1aXJlZF9maWVsZCA9IHRydWU7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBpZiAoaGFzX3JlcXVpcmVkX2ZpZWxkKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgZl9nZW5fIDw8ICJpbXBsIERlZmF1bHQgZm9yICIgPDwgc3RydWN0X25hbWUgPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJmbiBkZWZhdWx0KCkgLT4gU2VsZiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAobWVtYmVycy5lbXB0eSgpKSB7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8IHN0cnVjdF9uYW1lIDw8ICJ7fSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgc3RydWN0X25hbWUgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZm9yIChtZW1iZXJzX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1lbWJlcnNfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21lbWJlcnNfaXRlcikgeworICAgICAgdF9maWVsZCAqbWVtYmVyID0gKCptZW1iZXJzX2l0ZXIpOworICAgICAgc3RyaW5nIG1lbWJlcl9uYW1lKHJ1c3RfZmllbGRfbmFtZShtZW1iZXIpKTsKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCBtZW1iZXJfbmFtZSA8PCAiOiAiIDw8IG9wdF9pbl9yZXFfb3V0X3ZhbHVlKG1lbWJlci0+Z2V0X3R5cGUoKSkgPDwgIiwiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3RydWN0X2ltcGwoCisgIGNvbnN0IHN0cmluZyYgc3RydWN0X25hbWUsCisgIHRfc3RydWN0KiB0c3RydWN0LAorICB0X3JzX2dlbmVyYXRvcjo6ZV9zdHJ1Y3RfdHlwZSBzdHJ1Y3RfdHlwZQorKSB7CisgIGZfZ2VuXyA8PCAiaW1wbCAiIDw8IHN0cnVjdF9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKHN0cnVjdF90eXBlID09IHRfcnNfZ2VuZXJhdG9yOjpUX1JFR1VMQVIgfHwgc3RydWN0X3R5cGUgPT0gdF9yc19nZW5lcmF0b3I6OlRfRVhDRVBUSU9OKSB7CisgICAgcmVuZGVyX3N0cnVjdF9jb25zdHJ1Y3RvcihzdHJ1Y3RfbmFtZSwgdHN0cnVjdCwgc3RydWN0X3R5cGUpOworICB9CisKKyAgcmVuZGVyX3N0cnVjdF9zeW5jX3JlYWQoc3RydWN0X25hbWUsIHRzdHJ1Y3QsIHN0cnVjdF90eXBlKTsKKyAgcmVuZGVyX3N0cnVjdF9zeW5jX3dyaXRlKHRzdHJ1Y3QsIHN0cnVjdF90eXBlKTsKKworICBpZiAoc3RydWN0X3R5cGUgPT0gdF9yc19nZW5lcmF0b3I6OlRfUkVTVUxUKSB7CisgICAgcmVuZGVyX3Jlc3VsdF9zdHJ1Y3RfdG9fcmVzdWx0X21ldGhvZCh0c3RydWN0KTsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zdHJ1Y3RfY29uc3RydWN0b3IoCisgIGNvbnN0IHN0cmluZyYgc3RydWN0X25hbWUsCisgIHRfc3RydWN0KiB0c3RydWN0LAorICB0X3JzX2dlbmVyYXRvcjo6ZV9zdHJ1Y3RfdHlwZSBzdHJ1Y3RfdHlwZQorKSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbWVtYmVyc19pdGVyOworCisgIC8vIGJ1aWxkIHRoZSBjb252ZW5pZW5jZSB0eXBlIHBhcmFtZXRlcnMgdGhhdCBhbGxvd3MgdXMgdG8gcGFzcyB1bndyYXBwZWQgdmFsdWVzIHRvIGEgY29uc3RydWN0b3IgYW5kCisgIC8vIGhhdmUgdGhlbSBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCBpbnRvIE9wdGlvbjx2YWx1ZT4KKyAgYm9vbCBmaXJzdF9hcmcgPSB0cnVlOworCisgIG9zdHJpbmdzdHJlYW0gZ2VuZXJpY190eXBlX3BhcmFtZXRlcnM7CisgIG9zdHJpbmdzdHJlYW0gZ2VuZXJpY190eXBlX3F1YWxpZmllcnM7CisgIGZvcihtZW1iZXJzX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1lbWJlcnNfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21lbWJlcnNfaXRlcikgeworICAgIHRfZmllbGQqIG1lbWJlciA9ICgqbWVtYmVyc19pdGVyKTsKKyAgICB0X2ZpZWxkOjplX3JlcSBtZW1iZXJfcmVxID0gYWN0dWFsX2ZpZWxkX3JlcShtZW1iZXIsIHN0cnVjdF90eXBlKTsKKworICAgIGlmIChpc19vcHRpb25hbChtZW1iZXJfcmVxKSkgeworICAgICAgaWYgKGZpcnN0X2FyZykgeworICAgICAgICBmaXJzdF9hcmcgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdlbmVyaWNfdHlwZV9wYXJhbWV0ZXJzIDw8ICIsICI7CisgICAgICAgIGdlbmVyaWNfdHlwZV9xdWFsaWZpZXJzIDw8ICIsICI7CisgICAgICB9CisgICAgICBnZW5lcmljX3R5cGVfcGFyYW1ldGVycyA8PCAiRiIgPDwgbWVtYmVyLT5nZXRfa2V5KCk7CisgICAgICBnZW5lcmljX3R5cGVfcXVhbGlmaWVycyA8PCAiRiIgPDwgbWVtYmVyLT5nZXRfa2V5KCkgPDwgIjogSW50bzxPcHRpb248IiA8PCB0b19ydXN0X3R5cGUobWVtYmVyLT5nZXRfdHlwZSgpKSA8PCAiPj4iOworICAgIH0KKyAgfQorCisgIHN0cmluZyB0eXBlX3BhcmFtZXRlcl9zdHJpbmcgPSBnZW5lcmljX3R5cGVfcGFyYW1ldGVycy5zdHIoKTsKKyAgaWYgKHR5cGVfcGFyYW1ldGVyX3N0cmluZy5sZW5ndGgoKSAhPSAwKSB7CisgICAgdHlwZV9wYXJhbWV0ZXJfc3RyaW5nID0gIjwiICsgdHlwZV9wYXJhbWV0ZXJfc3RyaW5nICsgIj4iOworICB9CisKKyAgc3RyaW5nIHR5cGVfcXVhbGlmaWVyX3N0cmluZyA9IGdlbmVyaWNfdHlwZV9xdWFsaWZpZXJzLnN0cigpOworICBpZiAodHlwZV9xdWFsaWZpZXJfc3RyaW5nLmxlbmd0aCgpICE9IDApIHsKKyAgICB0eXBlX3F1YWxpZmllcl9zdHJpbmcgPSAid2hlcmUgIiArIHR5cGVfcXVhbGlmaWVyX3N0cmluZyArICIgIjsKKyAgfQorCisgIC8vIG5vdyBidWlsZCB0aGUgYWN0dWFsIGNvbnN0cnVjdG9yIGFyZyBsaXN0CisgIC8vIHdoZW4gd2UncmUgYnVpbGRpbmcgdGhpcyBsaXN0IHdlIGhhdmUgdG8gdXNlIHRoZSB0eXBlIHBhcmFtZXRlcnMgaW4gcGxhY2Ugb2YgdGhlIGFjdHVhbCB0eXBlIG5hbWVzCisgIC8vIGlmIG5lY2Vzc2FyeQorICBvc3RyaW5nc3RyZWFtIGFyZ3M7CisgIGZpcnN0X2FyZyA9IHRydWU7CisgIGZvcihtZW1iZXJzX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1lbWJlcnNfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21lbWJlcnNfaXRlcikgeworICAgIHRfZmllbGQqIG1lbWJlciA9ICgqbWVtYmVyc19pdGVyKTsKKyAgICB0X2ZpZWxkOjplX3JlcSBtZW1iZXJfcmVxID0gYWN0dWFsX2ZpZWxkX3JlcShtZW1iZXIsIHN0cnVjdF90eXBlKTsKKyAgICBzdHJpbmcgbWVtYmVyX25hbWUocnVzdF9maWVsZF9uYW1lKG1lbWJlcikpOworCisgICAgaWYgKGZpcnN0X2FyZykgeworICAgICAgZmlyc3RfYXJnID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIGFyZ3MgPDwgIiwgIjsKKyAgICB9CisKKyAgICBpZiAoaXNfb3B0aW9uYWwobWVtYmVyX3JlcSkpIHsKKyAgICAgIGFyZ3MgPDwgbWVtYmVyX25hbWUgPDwgIjogIiA8PCAiRiIgPDwgbWVtYmVyLT5nZXRfa2V5KCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGFyZ3MgPDwgbWVtYmVyX25hbWUgPDwgIjogIiA8PCB0b19ydXN0X3R5cGUobWVtYmVyLT5nZXRfdHlwZSgpKTsKKyAgICB9CisgIH0KKworICBzdHJpbmcgYXJnX3N0cmluZyA9IGFyZ3Muc3RyKCk7CisKKyAgc3RyaW5nIHZpc2liaWxpdHkodmlzaWJpbGl0eV9xdWFsaWZpZXIoc3RydWN0X3R5cGUpKTsKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCB2aXNpYmlsaXR5CisgICAgPDwgImZuIG5ldyIKKyAgICA8PCB0eXBlX3BhcmFtZXRlcl9zdHJpbmcKKyAgICA8PCAiKCIKKyAgICA8PCBhcmdfc3RyaW5nCisgICAgPDwgIikgLT4gIgorICAgIDw8IHN0cnVjdF9uYW1lCisgICAgPDwgIiAiCisgICAgPDwgdHlwZV9xdWFsaWZpZXJfc3RyaW5nCisgICAgPDwgInsiCisgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID09IDApIHsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgc3RydWN0X25hbWUgPDwgIiB7fSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgc3RydWN0X25hbWUgPDwgIiB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgZm9yKG1lbWJlcnNfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbWVtYmVyc19pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbWVtYmVyc19pdGVyKSB7CisgICAgICB0X2ZpZWxkKiBtZW1iZXIgPSAoKm1lbWJlcnNfaXRlcik7CisgICAgICB0X2ZpZWxkOjplX3JlcSBtZW1iZXJfcmVxID0gYWN0dWFsX2ZpZWxkX3JlcShtZW1iZXIsIHN0cnVjdF90eXBlKTsKKyAgICAgIHN0cmluZyBtZW1iZXJfbmFtZShydXN0X2ZpZWxkX25hbWUobWVtYmVyKSk7CisKKyAgICAgIGlmIChpc19vcHRpb25hbChtZW1iZXJfcmVxKSkgeworICAgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgbWVtYmVyX25hbWUgPDwgIjogIiA8PCBtZW1iZXJfbmFtZSA8PCAiLmludG8oKSwiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgbWVtYmVyX25hbWUgPDwgIjogIiA8PCBtZW1iZXJfbmFtZSA8PCAiLCIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3Jlc3VsdF9zdHJ1Y3RfdG9fcmVzdWx0X21ldGhvZCh0X3N0cnVjdCogdHN0cnVjdCkgeworICAvLyB3ZSBkb24ndCB1c2UgdGhlIHJ1c3Qgc3RydWN0IG5hbWUgaW4gdGhpcyBtZXRob2QsIGp1c3QgdGhlIHNlcnZpY2UgY2FsbCBuYW1lCisgIHN0cmluZyBzZXJ2aWNlX2NhbGxfbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisKKyAgLy8gY2hlY2sgdGhhdCB3ZSBhY3R1YWxseSBoYXZlIGEgcmVzdWx0CisgIHNpemVfdCBpbmRleCA9IHNlcnZpY2VfY2FsbF9uYW1lLmZpbmQoUkVTVUxUX1NUUlVDVF9TVUZGSVgsIDApOworICBpZiAoaW5kZXggPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICB0aHJvdyAicmVzdWx0IHN0cnVjdCAiICsgc2VydmljZV9jYWxsX25hbWUgKyAiIG1pc3NpbmcgcmVzdWx0IHN1ZmZpeCI7CisgIH0gZWxzZSB7CisgICAgIHNlcnZpY2VfY2FsbF9uYW1lLnJlcGxhY2UoaW5kZXgsIDYsICIiKTsKKyAgfQorCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbWVtYmVyc19pdGVyOworCisgIC8vIGZpbmQgb3V0IHdoYXQgdGhlIGNhbGwncyBleHBlY3RlZCByZXR1cm4gdHlwZSB3YXMKKyAgc3RyaW5nIHJ1c3RfcmV0dXJuX3R5cGUgPSAiKCkiOworICBmb3IobWVtYmVyc19pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtZW1iZXJzX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttZW1iZXJzX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBtZW1iZXIgPSAoKm1lbWJlcnNfaXRlcik7CisgICAgaWYgKG1lbWJlci0+Z2V0X25hbWUoKSA9PSBTRVJWSUNFX1JFU1VMVF9WQVJJQUJMRSkgeyAvLyBkb24ndCBoYXZlIHRvIGNoZWNrIHNhZmUgbmFtZSBoZXJlCisgICAgICBydXN0X3JldHVybl90eXBlID0gdG9fcnVzdF90eXBlKG1lbWJlci0+Z2V0X3R5cGUoKSk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICAvLyBOT1RFOiBpZGVhbGx5IEkgd291bGQgZ2VuZXJhdGUgdGhlIGJyYW5jaGVzIGFuZCByZW5kZXIgdGhlbSBzZXBhcmF0ZWx5CisgIC8vIEkgdHJpZWQgdGhpcyBob3dldmVyLCBhbmQgdGhlIHJlc3VsdGluZyBjb2RlIHdhcyBoYXJkZXIgdG8gdW5kZXJzdGFuZAorICAvLyBtYWludGFpbmluZyBhIHJlbmRlcmVkIGJyYW5jaCBjb3VudCAod2hpbGUgYSBsaXR0bGUgdWdseSkgZ290IG1lIHRoZQorICAvLyByZW5kZXJpbmcgSSB3YW50ZWQgd2l0aCBjb2RlIHRoYXQgd2FzIHJlYXNvbmFibHkgdW5kZXJzdGFuZGFibGUKKworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImZuIG9rX29yKHNlbGYpIC0+IHRocmlmdDo6UmVzdWx0PCIgPDwgcnVzdF9yZXR1cm5fdHlwZSA8PCAiPiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpbnQgcmVuZGVyZWRfYnJhbmNoX2NvdW50ID0gMDsKKworICAvLyByZW5kZXIgdGhlIGV4Y2VwdGlvbiBicmFuY2hlcworICBmb3IobWVtYmVyc19pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtZW1iZXJzX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttZW1iZXJzX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiB0ZmllbGQgPSAoKm1lbWJlcnNfaXRlcik7CisgICAgaWYgKHRmaWVsZC0+Z2V0X25hbWUoKSAhPSBTRVJWSUNFX1JFU1VMVF9WQVJJQUJMRSkgeyAvLyBkb24ndCBoYXZlIHRvIGNoZWNrIHNhZmUgbmFtZSBoZXJlCisgICAgICBzdHJpbmcgZmllbGRfbmFtZSgic2VsZi4iICsgcnVzdF9maWVsZF9uYW1lKHRmaWVsZCkpOworICAgICAgc3RyaW5nIGJyYW5jaF9zdGF0ZW1lbnQgPSByZW5kZXJlZF9icmFuY2hfY291bnQgPT0gMCA/ICJpZiIgOiAifSBlbHNlIGlmIjsKKworICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8IGJyYW5jaF9zdGF0ZW1lbnQgPDwgIiAiIDw8IGZpZWxkX25hbWUgPDwgIi5pc19zb21lKCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJFcnIodGhyaWZ0OjpFcnJvcjo6VXNlcihCb3g6Om5ldygiIDw8IGZpZWxkX25hbWUgPDwgIi51bndyYXAoKSkpKSIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisKKyAgICAgIHJlbmRlcmVkX2JyYW5jaF9jb3VudCsrOworICAgIH0KKyAgfQorCisgIC8vIHJlbmRlciB0aGUgcmV0dXJuIHZhbHVlIGJyYW5jaGVzCisgIGlmIChydXN0X3JldHVybl90eXBlID09ICIoKSIpIHsKKyAgICBpZiAocmVuZGVyZWRfYnJhbmNoX2NvdW50ID09IDApIHsKKyAgICAgIC8vIHdlIGhhdmUgdGhlIHVuaXQgcmV0dXJuIGFuZCB0aGlzIHNlcnZpY2UgY2FsbCBoYXMgbm8gdXNlci1kZWZpbmVkCisgICAgICAvLyBleGNlcHRpb25zLiB0aGlzIG1lYW5zIHRoYXQgd2UndmUgYSB0cml2aWFsIHJldHVybiAoaGFwcGVucyB3aXRoIG9uZXdheXMpCisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIk9rKCgpKSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgLy8gd2UgaGF2ZSB0aGUgdW5pdCByZXR1cm4sIGJ1dCB0aGVyZSBhcmUgdXNlci1kZWZpbmVkIGV4Y2VwdGlvbnMKKyAgICAgIC8vIGlmIHdlJ3ZlIGdvdHRlbiB0aGlzIGZhciB0aGVuIHdlIGhhdmUgdGhlIGRlZmF1bHQgcmV0dXJuIChpLmUuIGNhbGwgc3VjY2Vzc2Z1bCkKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiT2soKCkpIiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgc3RyaW5nIGJyYW5jaF9zdGF0ZW1lbnQgPSByZW5kZXJlZF9icmFuY2hfY291bnQgPT0gMCA/ICJpZiIgOiAifSBlbHNlIGlmIjsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgYnJhbmNoX3N0YXRlbWVudCA8PCAiIHNlbGYuIiA8PCBTRVJWSUNFX1JFU1VMVF9WQVJJQUJMRSA8PCAiLmlzX3NvbWUoKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiT2soc2VsZi4iIDw8IFNFUlZJQ0VfUkVTVUxUX1ZBUklBQkxFIDw8ICIudW53cmFwKCkpIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICAvLyBpZiB3ZSBoYXZlbid0IGZvdW5kIGEgdmFsaWQgcmV0dXJuIHZhbHVlICpvciogYSB1c2VyIGV4Y2VwdGlvbgorICAgIC8vIHRoZW4gd2UncmUgaW4gdHJvdWJsZTsgcmV0dXJuIGEgZGVmYXVsdCBlcnJvcgorICAgIHJlbmRlcl90aHJpZnRfZXJyb3IoCisgICAgICAiQXBwbGljYXRpb24iLAorICAgICAgIkFwcGxpY2F0aW9uRXJyb3IiLAorICAgICAgIkFwcGxpY2F0aW9uRXJyb3JLaW5kOjpNaXNzaW5nUmVzdWx0IiwKKyAgICAgICJcIm5vIHJlc3VsdCByZWNlaXZlZCBmb3IgIiArIHNlcnZpY2VfY2FsbF9uYW1lICsgIlwiIgorICAgICk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl91bmlvbih0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmcgdW5pb25fbmFtZShydXN0X3N0cnVjdF9uYW1lKHRzdHJ1Y3QpKTsKKyAgcmVuZGVyX3R5cGVfY29tbWVudCh1bmlvbl9uYW1lKTsKKyAgcmVuZGVyX3VuaW9uX2RlZmluaXRpb24odW5pb25fbmFtZSwgdHN0cnVjdCk7CisgIHJlbmRlcl91bmlvbl9pbXBsKHVuaW9uX25hbWUsIHRzdHJ1Y3QpOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfdW5pb25fZGVmaW5pdGlvbihjb25zdCBzdHJpbmcmIHVuaW9uX25hbWUsIHRfc3RydWN0KiB0c3RydWN0KSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgaWYgKG1lbWJlcnMuZW1wdHkoKSkgeworICAgIHRocm93ICJjYW5ub3QgZ2VuZXJhdGUgcnVzdCBlbnVtIHdpdGggMCBtZW1iZXJzIjsgLy8gbWF5IGJlIHZhbGlkIHRocmlmdCwgYnV0IGl0J3MgaW52YWxpZCBydXN0CisgIH0KKworICBmX2dlbl8gPDwgIiNbZGVyaXZlKENsb25lLCBEZWJ1ZywgRXEsIEhhc2gsIE9yZCwgUGFydGlhbEVxLCBQYXJ0aWFsT3JkKV0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAicHViIGVudW0gIiA8PCB1bmlvbl9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbWVtYmVyX2l0ZXI7CisgIGZvcihtZW1iZXJfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbWVtYmVyX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttZW1iZXJfaXRlcikgeworICAgIHRfZmllbGQqIHRmaWVsZCA9ICgqbWVtYmVyX2l0ZXIpOworICAgIGZfZ2VuXworICAgICAgPDwgaW5kZW50KCkKKyAgICAgIDw8IHJ1c3RfdW5pb25fZmllbGRfbmFtZSh0ZmllbGQpCisgICAgICA8PCAiKCIgPDwgdG9fcnVzdF90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSkgPDwgIiksIgorICAgICAgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl91bmlvbl9pbXBsKGNvbnN0IHN0cmluZyYgdW5pb25fbmFtZSwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgZl9nZW5fIDw8ICJpbXBsICIgPDwgdW5pb25fbmFtZSA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIHJlbmRlcl91bmlvbl9zeW5jX3JlYWQodW5pb25fbmFtZSwgdHN0cnVjdCk7CisgIHJlbmRlcl91bmlvbl9zeW5jX3dyaXRlKHVuaW9uX25hbWUsIHRzdHJ1Y3QpOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBTeW5jIFN0cnVjdCBXcml0ZQorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N0cnVjdF9zeW5jX3dyaXRlKAorICAgIHRfc3RydWN0ICp0c3RydWN0LAorICAgIHRfcnNfZ2VuZXJhdG9yOjplX3N0cnVjdF90eXBlIHN0cnVjdF90eXBlCispIHsKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCB2aXNpYmlsaXR5X3F1YWxpZmllcihzdHJ1Y3RfdHlwZSkKKyAgICA8PCAiZm4gd3JpdGVfdG9fb3V0X3Byb3RvY29sKCZzZWxmLCBvX3Byb3Q6ICZtdXQgVE91dHB1dFByb3RvY29sKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geyIKKyAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICAvLyB3cml0ZSBzdHJ1Y3QgaGVhZGVyIHRvIG91dHB1dCBwcm90b2NvbAorICAvLyBub3RlOiB1c2UgdGhlICpvcmlnaW5hbCogc3RydWN0IG5hbWUgaGVyZQorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCBzdHJ1Y3RfaWRlbnQgPSBUU3RydWN0SWRlbnRpZmllcjo6bmV3KFwiIiArIHRzdHJ1Y3QtPmdldF9uYW1lKCkgKyAiXCIpOyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZzdHJ1Y3RfaWRlbnQpPzsiIDw8IGVuZGw7CisKKyAgLy8gd3JpdGUgc3RydWN0IG1lbWJlcnMgdG8gb3V0cHV0IHByb3RvY29sCisgIHZlY3Rvcjx0X2ZpZWxkKj4gbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICBpZiAoIW1lbWJlcnMuZW1wdHkoKSkgeworICAgIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIG1lbWJlcnNfaXRlcjsKKyAgICBmb3IobWVtYmVyc19pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtZW1iZXJzX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttZW1iZXJzX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIG1lbWJlciA9ICgqbWVtYmVyc19pdGVyKTsKKyAgICAgIHRfZmllbGQ6OmVfcmVxIG1lbWJlcl9yZXEgPSBhY3R1YWxfZmllbGRfcmVxKG1lbWJlciwgc3RydWN0X3R5cGUpOworICAgICAgc3RyaW5nIG1lbWJlcl92YXIoInNlbGYuIiArIHJ1c3RfZmllbGRfbmFtZShtZW1iZXIpKTsKKyAgICAgIHJlbmRlcl9zdHJ1Y3RfZmllbGRfc3luY193cml0ZShtZW1iZXJfdmFyLCBmYWxzZSwgbWVtYmVyLCBtZW1iZXJfcmVxKTsKKyAgICB9CisgIH0KKworICAvLyB3cml0ZSBzdHJ1Y3QgZm9vdGVyIHRvIG91dHB1dCBwcm90b2NvbAorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpIiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3VuaW9uX3N5bmNfd3JpdGUoY29uc3Qgc3RyaW5nICZ1bmlvbl9uYW1lLCB0X3N0cnVjdCAqdHN0cnVjdCkgeworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJwdWIgZm4gd3JpdGVfdG9fb3V0X3Byb3RvY29sKCZzZWxmLCBvX3Byb3Q6ICZtdXQgVE91dHB1dFByb3RvY29sKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geyIKKyAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICAvLyB3cml0ZSBzdHJ1Y3QgaGVhZGVyIHRvIG91dHB1dCBwcm90b2NvbAorICAvLyBub3RlOiB1c2UgdGhlICpvcmlnaW5hbCogc3RydWN0IG5hbWUgaGVyZQorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCBzdHJ1Y3RfaWRlbnQgPSBUU3RydWN0SWRlbnRpZmllcjo6bmV3KFwiIiArIHRzdHJ1Y3QtPmdldF9uYW1lKCkgKyAiXCIpOyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZzdHJ1Y3RfaWRlbnQpPzsiIDw8IGVuZGw7CisKKyAgLy8gd3JpdGUgdGhlIGVudW0gZmllbGQgdG8gdGhlIG91dHB1dCBwcm90b2NvbAorICB2ZWN0b3I8dF9maWVsZCo+IG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgaWYgKCFtZW1iZXJzLmVtcHR5KCkpIHsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm1hdGNoICpzZWxmIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgbWVtYmVyc19pdGVyOworICAgIGZvcihtZW1iZXJzX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1lbWJlcnNfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21lbWJlcnNfaXRlcikgeworICAgICAgdF9maWVsZCogbWVtYmVyID0gKCptZW1iZXJzX2l0ZXIpOworICAgICAgdF9maWVsZDo6ZV9yZXEgbWVtYmVyX3JlcSA9IHRfZmllbGQ6OlRfUkVRVUlSRUQ7CisgICAgICB0X3R5cGUqIHR0eXBlID0gbWVtYmVyLT5nZXRfdHlwZSgpOworICAgICAgc3RyaW5nIG1hdGNoX3ZhcigodHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICF0dHlwZS0+aXNfc3RyaW5nKCkpID8gImYiIDogInJlZiBmIik7CisgICAgICBmX2dlbl8KKyAgICAgICAgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgdW5pb25fbmFtZSA8PCAiOjoiIDw8IHJ1c3RfdW5pb25fZmllbGRfbmFtZShtZW1iZXIpCisgICAgICAgIDw8ICIoIiA8PCBtYXRjaF92YXIgPDwgIikgPT4geyIKKyAgICAgICAgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgcmVuZGVyX3N0cnVjdF9maWVsZF9zeW5jX3dyaXRlKCJmIiwgdHJ1ZSwgbWVtYmVyLCBtZW1iZXJfcmVxKTsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0sIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfQorCisgIC8vIHdyaXRlIHN0cnVjdCBmb290ZXIgdG8gb3V0cHV0IHByb3RvY29sCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKT87IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3RydWN0X2ZpZWxkX3N5bmNfd3JpdGUoCisgIGNvbnN0IHN0cmluZyAmZmllbGRfdmFyLAorICBib29sIGZpZWxkX3Zhcl9pc19yZWYsCisgIHRfZmllbGQgKnRmaWVsZCwKKyAgdF9maWVsZDo6ZV9yZXEgcmVxCispIHsKKyAgdF90eXBlKiBmaWVsZF90eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOworICB0X3R5cGUqIGFjdHVhbF90eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZF90eXBlKTsKKworICBvc3RyaW5nc3RyZWFtIGZpZWxkX3N0cmVhbTsKKyAgZmllbGRfc3RyZWFtCisgICAgPDwgIlRGaWVsZElkZW50aWZpZXI6Om5ldygiCisgICAgPDwgIlwiIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIlwiIiA8PCAiLCAiIC8vIG5vdGU6IHVzZSAqb3JpZ2luYWwqIG5hbWUKKyAgICA8PCB0b19ydXN0X2ZpZWxkX3R5cGVfZW51bShmaWVsZF90eXBlKSA8PCAiLCAiCisgICAgPDwgdGZpZWxkLT5nZXRfa2V5KCkgPDwgIikiOworICBzdHJpbmcgZmllbGRfaWRlbnRfc3RyaW5nID0gZmllbGRfc3RyZWFtLnN0cigpOworCisgIGlmIChpc19vcHRpb25hbChyZXEpKSB7CisgICAgc3RyaW5nIGxldF92YXIoKGFjdHVhbF90eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAhYWN0dWFsX3R5cGUtPmlzX3N0cmluZygpKSA/ICJmbGRfdmFyIiA6ICJyZWYgZmxkX3ZhciIpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiaWYgbGV0IFNvbWUoIiA8PCBsZXRfdmFyIDw8ICIpID0gIiA8PCBmaWVsZF92YXIgPDwgIiB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCYiIDw8IGZpZWxkX2lkZW50X3N0cmluZyA8PCAiKT87IiA8PCBlbmRsOworICAgIHJlbmRlcl90eXBlX3N5bmNfd3JpdGUoImZsZF92YXIiLCB0cnVlLCBmaWVsZF90eXBlKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9maWVsZF9lbmQoKT87IiA8PCBlbmRsOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiKCkiIDw8IGVuZGw7IC8vIEZJWE1FOiByZW1vdmUgdGhpcyBleHRyYW5lb3VzICcoKScKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7IC8vIEZJWE1FOiByZW1vdmUgZWxzZSBicmFuY2gKKyAgICBpbmRlbnRfdXAoKTsKKyAgICAvKiBGSVhNRTogcmV0aGluayBob3cgSSBkZWFsIHdpdGggT1BUX0lOX1JFUV9PVVQKKyAgICBpZiAocmVxID09IHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQpIHsKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IGZpZWxkX2lkZW50ID0gIiA8PCBmaWVsZF9pZGVudF9zdHJpbmcgPDwgIjsiIDw8IGVuZGw7CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnQpPzsiIDw8IGVuZGw7CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9maWVsZF9lbmQoKT87IiA8PCBlbmRsOworICAgIH0qLworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiKCkiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJiIgPDwgZmllbGRfaWRlbnRfc3RyaW5nIDw8ICIpPzsiIDw8IGVuZGw7CisgICAgcmVuZGVyX3R5cGVfc3luY193cml0ZShmaWVsZF92YXIsIGZpZWxkX3Zhcl9pc19yZWYsIHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCk/OyIgPDwgZW5kbDsKKyAgfQorfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfdHlwZV9zeW5jX3dyaXRlKGNvbnN0IHN0cmluZyAmdHlwZV92YXIsIGJvb2wgdHlwZV92YXJfaXNfcmVmLCB0X3R5cGUgKnR0eXBlKSB7CisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZSogdGJhc2VfdHlwZSA9ICh0X2Jhc2VfdHlwZSopdHR5cGU7CisgICAgc3dpdGNoICh0YmFzZV90eXBlLT5nZXRfYmFzZSgpKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgImNhbm5vdCB3cml0ZSBmaWVsZCBvZiB0eXBlIFRZUEVfVk9JRCB0byBvdXRwdXQgcHJvdG9jb2wiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOiB7CisgICAgICBzdHJpbmcgcmVmKHR5cGVfdmFyX2lzX3JlZiA/ICIiIDogIiYiKTsKKyAgICAgIGlmICh0YmFzZV90eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9ieXRlcygiICsgcmVmICsgdHlwZV92YXIgKyAiKT87IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfc3RyaW5nKCIgKyByZWYgKyB0eXBlX3ZhciArICIpPzsiIDw8IGVuZGw7CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgfQorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX2Jvb2woIiArIHR5cGVfdmFyICsgIik/OyIgPDwgZW5kbDsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfaTgoIiArIHR5cGVfdmFyICsgIik/OyIgPDwgZW5kbDsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX2kxNigiICsgdHlwZV92YXIgKyAiKT87IiA8PCBlbmRsOworICAgICAgcmV0dXJuOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfaTMyKCIgKyB0eXBlX3ZhciArICIpPzsiIDw8IGVuZGw7CisgICAgICByZXR1cm47CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9pNjQoIiArIHR5cGVfdmFyICsgIik/OyIgPDwgZW5kbDsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX2RvdWJsZSgiICsgdHlwZV92YXIgKyAiLmludG8oKSk/OyIgPDwgZW5kbDsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHRfdHlwZWRlZiogdHR5cGVkZWYgPSAodF90eXBlZGVmKikgdHR5cGU7CisgICAgcmVuZGVyX3R5cGVfc3luY193cml0ZSh0eXBlX3ZhciwgdHlwZV92YXJfaXNfcmVmLCB0dHlwZWRlZi0+Z2V0X3R5cGUoKSk7CisgICAgcmV0dXJuOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8IHR5cGVfdmFyICsgIi53cml0ZV90b19vdXRfcHJvdG9jb2wob19wcm90KT87IiA8PCBlbmRsOworICAgIHJldHVybjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZW5kZXJfbWFwX3N5bmNfd3JpdGUodHlwZV92YXIsIHR5cGVfdmFyX2lzX3JlZiwgKHRfbWFwICopIHR0eXBlKTsKKyAgICByZXR1cm47CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmVuZGVyX3NldF9zeW5jX3dyaXRlKHR5cGVfdmFyLCB0eXBlX3Zhcl9pc19yZWYsICh0X3NldCAqKSB0dHlwZSk7CisgICAgcmV0dXJuOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZW5kZXJfbGlzdF9zeW5jX3dyaXRlKHR5cGVfdmFyLCB0eXBlX3Zhcl9pc19yZWYsICh0X2xpc3QgKikgdHR5cGUpOworICAgIHJldHVybjsKKyAgfQorCisgIHRocm93ICJjYW5ub3Qgd3JpdGUgdW5zdXBwb3J0ZWQgdHlwZSAiICsgdHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9saXN0X3N5bmNfd3JpdGUoY29uc3Qgc3RyaW5nICZsaXN0X3ZhciwgYm9vbCBsaXN0X3Zhcl9pc19yZWYsIHRfbGlzdCAqdGxpc3QpIHsKKyAgdF90eXBlKiBlbGVtX3R5cGUgPSB0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpOworCisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgIm9fcHJvdC53cml0ZV9saXN0X2JlZ2luKCIKKyAgICA8PCAiJlRMaXN0SWRlbnRpZmllcjo6bmV3KCIKKyAgICA8PCB0b19ydXN0X2ZpZWxkX3R5cGVfZW51bShlbGVtX3R5cGUpIDw8ICIsICIKKyAgICA8PCBsaXN0X3ZhciA8PCAiLmxlbigpIGFzIGkzMiIgPDwgIikiCisgICAgPDwgIik/OyIKKyAgICA8PCBlbmRsOworCisgIHN0cmluZyByZWYobGlzdF92YXJfaXNfcmVmID8gIiIgOiAiJiIpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImZvciBlIGluICIgPDwgcmVmIDw8IGxpc3RfdmFyIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHJlbmRlcl90eXBlX3N5bmNfd3JpdGUoc3RyaW5nX2NvbnRhaW5lcl93cml0ZV92YXJpYWJsZShlbGVtX3R5cGUsICJlIiksIHRydWUsIGVsZW1fdHlwZSk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX2xpc3RfZW5kKCk/OyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc2V0X3N5bmNfd3JpdGUoY29uc3Qgc3RyaW5nICZzZXRfdmFyLCBib29sIHNldF92YXJfaXNfcmVmLCB0X3NldCAqdHNldCkgeworICB0X3R5cGUqIGVsZW1fdHlwZSA9IHRzZXQtPmdldF9lbGVtX3R5cGUoKTsKKworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJvX3Byb3Qud3JpdGVfc2V0X2JlZ2luKCIKKyAgICA8PCAiJlRTZXRJZGVudGlmaWVyOjpuZXcoIgorICAgIDw8IHRvX3J1c3RfZmllbGRfdHlwZV9lbnVtKGVsZW1fdHlwZSkgPDwgIiwgIgorICAgIDw8IHNldF92YXIgPDwgIi5sZW4oKSBhcyBpMzIiIDw8ICIpIgorICAgIDw8ICIpPzsiCisgICAgPDwgZW5kbDsKKworICBzdHJpbmcgcmVmKHNldF92YXJfaXNfcmVmID8gIiIgOiAiJiIpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImZvciBlIGluICIgPDwgcmVmIDw8IHNldF92YXIgPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgcmVuZGVyX3R5cGVfc3luY193cml0ZShzdHJpbmdfY29udGFpbmVyX3dyaXRlX3ZhcmlhYmxlKGVsZW1fdHlwZSwgImUiKSwgdHJ1ZSwgZWxlbV90eXBlKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfc2V0X2VuZCgpPzsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX21hcF9zeW5jX3dyaXRlKGNvbnN0IHN0cmluZyAmbWFwX3ZhciwgYm9vbCBtYXBfdmFyX2lzX3JlZiwgdF9tYXAgKnRtYXApIHsKKyAgdF90eXBlKiBrZXlfdHlwZSA9IHRtYXAtPmdldF9rZXlfdHlwZSgpOworICB0X3R5cGUqIHZhbF90eXBlID0gdG1hcC0+Z2V0X3ZhbF90eXBlKCk7CisKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAib19wcm90LndyaXRlX21hcF9iZWdpbigiCisgICAgPDwgIiZUTWFwSWRlbnRpZmllcjo6bmV3KCIKKyAgICA8PCB0b19ydXN0X2ZpZWxkX3R5cGVfZW51bShrZXlfdHlwZSkgPDwgIiwgIgorICAgIDw8IHRvX3J1c3RfZmllbGRfdHlwZV9lbnVtKHZhbF90eXBlKSA8PCAiLCAiCisgICAgPDwgbWFwX3ZhciA8PCAiLmxlbigpIGFzIGkzMikiCisgICAgPDwgIik/OyIKKyAgICA8PCBlbmRsOworCisgIHN0cmluZyByZWYobWFwX3Zhcl9pc19yZWYgPyAiIiA6ICImIik7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiZm9yIChrLCB2KSBpbiAiIDw8IHJlZiA8PCBtYXBfdmFyIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHJlbmRlcl90eXBlX3N5bmNfd3JpdGUoc3RyaW5nX2NvbnRhaW5lcl93cml0ZV92YXJpYWJsZShrZXlfdHlwZSwgImsiKSwgdHJ1ZSwga2V5X3R5cGUpOworICByZW5kZXJfdHlwZV9zeW5jX3dyaXRlKHN0cmluZ19jb250YWluZXJfd3JpdGVfdmFyaWFibGUodmFsX3R5cGUsICJ2IiksIHRydWUsIHZhbF90eXBlKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfbWFwX2VuZCgpPzsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpzdHJpbmdfY29udGFpbmVyX3dyaXRlX3ZhcmlhYmxlKHRfdHlwZSogdHR5cGUsIGNvbnN0IHN0cmluZyYgYmFzZV92YXIpIHsKKyAgYm9vbCB0eXBlX25lZWRzX2RlcmVmID0gbmVlZHNfZGVyZWZfb25fY29udGFpbmVyX3dyaXRlKHR0eXBlKTsKKyAgYm9vbCB0eXBlX2lzX2RvdWJsZSA9IGlzX2RvdWJsZSh0dHlwZSk7CisKKyAgc3RyaW5nIHdyaXRlX3ZhcmlhYmxlOworCisgIGlmICh0eXBlX2lzX2RvdWJsZSAmJiB0eXBlX25lZWRzX2RlcmVmKSB7CisgICAgd3JpdGVfdmFyaWFibGUgPSAiKCoiICsgYmFzZV92YXIgKyAiKSI7CisgIH0gZWxzZSBpZiAodHlwZV9uZWVkc19kZXJlZikgeworICAgIHdyaXRlX3ZhcmlhYmxlID0gIioiICsgYmFzZV92YXI7CisgIH0gZWxzZSB7CisgICAgd3JpdGVfdmFyaWFibGUgPSBiYXNlX3ZhcjsKKyAgfQorCisgIHJldHVybiB3cml0ZV92YXJpYWJsZTsKK30KKworYm9vbCB0X3JzX2dlbmVyYXRvcjo6bmVlZHNfZGVyZWZfb25fY29udGFpbmVyX3dyaXRlKHRfdHlwZSogdHR5cGUpIHsKKyAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKyAgcmV0dXJuIHR0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAhdHR5cGUtPmlzX3N0cmluZygpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gU3luYyBTdHJ1Y3QgUmVhZAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N0cnVjdF9zeW5jX3JlYWQoCisgICAgY29uc3Qgc3RyaW5nICZzdHJ1Y3RfbmFtZSwKKyAgICB0X3N0cnVjdCAqdHN0cnVjdCwgdF9yc19nZW5lcmF0b3I6OmVfc3RydWN0X3R5cGUgc3RydWN0X3R5cGUKKykgeworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8IHZpc2liaWxpdHlfcXVhbGlmaWVyKHN0cnVjdF90eXBlKQorICAgIDw8ICJmbiByZWFkX2Zyb21faW5fcHJvdG9jb2woaV9wcm90OiAmbXV0IFRJbnB1dFByb3RvY29sKSAtPiB0aHJpZnQ6OlJlc3VsdDwiIDw8IHN0cnVjdF9uYW1lIDw8ICI+IHsiCisgICAgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImlfcHJvdC5yZWFkX3N0cnVjdF9iZWdpbigpPzsiIDw8IGVuZGw7CisKKyAgLy8gY3JlYXRlIHRlbXBvcmFyeSB2YXJpYWJsZXM6IG9uZSBmb3IgZWFjaCBmaWVsZCBpbiB0aGUgc3RydWN0CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4gbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtZW1iZXJzX2l0ZXI7CisgIGZvciAobWVtYmVyc19pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtZW1iZXJzX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttZW1iZXJzX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBtZW1iZXIgPSAoKm1lbWJlcnNfaXRlcik7CisgICAgdF9maWVsZDo6ZV9yZXEgbWVtYmVyX3JlcSA9IGFjdHVhbF9maWVsZF9yZXEobWVtYmVyLCBzdHJ1Y3RfdHlwZSk7CisKKyAgICBmX2dlbl8KKyAgICAgIDw8IGluZGVudCgpCisgICAgICA8PCAibGV0IG11dCAiIDw8IHN0cnVjdF9maWVsZF9yZWFkX3RlbXBfdmFyaWFibGUobWVtYmVyKQorICAgICAgPDwgIjogT3B0aW9uPCIgPDwgdG9fcnVzdF90eXBlKG1lbWJlci0+Z2V0X3R5cGUoKSkgPDwgIj4gPSAiOworICAgICAgaWYgKG1lbWJlcl9yZXEgPT0gdF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCkgeworICAgICAgICBmX2dlbl8gPDwgb3B0X2luX3JlcV9vdXRfdmFsdWUobWVtYmVyLT5nZXRfdHlwZSgpKSA8PCAiOyI7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX2dlbl8gPDwgIk5vbmU7IjsKKyAgICAgIH0KKyAgICAgIGZfZ2VuXyA8PCBlbmRsOworICB9CisKKyAgLy8gbm93IGxvb3AgdGhyb3VnaCB0aGUgZmllbGRzIHdlJ3ZlIHJlY2VpdmVkCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibG9vcCB7IiA8PCBlbmRsOyAvLyBzdGFydCBsb29wCisgIGluZGVudF91cCgpOworCisgIC8vIGJyZWFrIG91dCBpZiB5b3UndmUgZm91bmQgdGhlIFN0b3AgZmllbGQKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgZmllbGRfaWRlbnQgPSBpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiaWYgZmllbGRfaWRlbnQuZmllbGRfdHlwZSA9PSBUVHlwZTo6U3RvcCB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAvLyBub3cgcmVhZCBhbGwgdGhlIGZpZWxkcyBmb3VuZAorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCBmaWVsZF9pZCA9IGZpZWxkX2lkKCZmaWVsZF9pZGVudCk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJtYXRjaCBmaWVsZF9pZCB7IiA8PCBlbmRsOyAvLyBzdGFydCBtYXRjaAorICBpbmRlbnRfdXAoKTsKKworICBmb3IgKG1lbWJlcnNfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbWVtYmVyc19pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbWVtYmVyc19pdGVyKSB7CisgICAgdF9maWVsZCogdGZpZWxkID0gKCptZW1iZXJzX2l0ZXIpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCB0ZmllbGQtPmdldF9rZXkoKSA8PCAiID0+IHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgcmVuZGVyX3R5cGVfc3luY19yZWFkKCJ2YWwiLCB0ZmllbGQtPmdldF90eXBlKCkpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCBzdHJ1Y3RfZmllbGRfcmVhZF90ZW1wX3ZhcmlhYmxlKHRmaWVsZCkgPDwgIiA9IFNvbWUodmFsKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0sIiA8PCBlbmRsOworICB9CisKKyAgLy8gZGVmYXVsdCBjYXNlIChza2lwIGZpZWxkcykKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJfID0+IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImlfcHJvdC5za2lwKGZpZWxkX2lkZW50LmZpZWxkX3R5cGUpPzsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSwiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9OyIgPDwgZW5kbDsgLy8gZmluaXNoIG1hdGNoCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiaV9wcm90LnJlYWRfZmllbGRfZW5kKCk/OyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOyAvLyBmaW5pc2ggbG9vcAorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImlfcHJvdC5yZWFkX3N0cnVjdF9lbmQoKT87IiA8PCBlbmRsOyAvLyByZWFkIG1lc3NhZ2UgZm9vdGVyIGZyb20gdGhlIHdpcmUKKworICAvLyB2ZXJpZnkgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGV4aXN0CisgIGZvciAobWVtYmVyc19pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtZW1iZXJzX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttZW1iZXJzX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiB0ZmllbGQgPSAoKm1lbWJlcnNfaXRlcik7CisgICAgdF9maWVsZDo6ZV9yZXEgcmVxID0gYWN0dWFsX2ZpZWxkX3JlcSh0ZmllbGQsIHN0cnVjdF90eXBlKTsKKyAgICBpZiAoIWlzX29wdGlvbmFsKHJlcSkpIHsKKyAgICAgIGZfZ2VuXworICAgICAgICA8PCBpbmRlbnQoKQorICAgICAgICA8PCAidmVyaWZ5X3JlcXVpcmVkX2ZpZWxkX2V4aXN0cygiCisgICAgICAgIDw8ICJcIiIgPDwgc3RydWN0X25hbWUgPDwgIi4iIDw8IHJ1c3RfZmllbGRfbmFtZSh0ZmllbGQpIDw8ICJcIiIKKyAgICAgICAgPDwgIiwgIgorICAgICAgICA8PCAiJiIgPDwgc3RydWN0X2ZpZWxkX3JlYWRfdGVtcF92YXJpYWJsZSh0ZmllbGQpCisgICAgICAgIDw8ICIpPzsiIDw8IGVuZGw7CisgICAgfQorICB9CisKKyAgLy8gY29uc3RydWN0IHRoZSBzdHJ1Y3QKKyAgaWYgKG1lbWJlcnMuc2l6ZSgpID09IDApIHsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCByZXQgPSAiIDw8IHN0cnVjdF9uYW1lIDw8ICIge307IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IHJldCA9ICIgPDwgc3RydWN0X25hbWUgPDwgIiB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgZm9yIChtZW1iZXJzX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1lbWJlcnNfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21lbWJlcnNfaXRlcikgeworICAgICAgdF9maWVsZCogdGZpZWxkID0gKCptZW1iZXJzX2l0ZXIpOworICAgICAgdF9maWVsZDo6ZV9yZXEgcmVxID0gYWN0dWFsX2ZpZWxkX3JlcSh0ZmllbGQsIHN0cnVjdF90eXBlKTsKKyAgICAgIHN0cmluZyBmaWVsZF9uYW1lKHJ1c3RfZmllbGRfbmFtZSh0ZmllbGQpKTsKKyAgICAgIHN0cmluZyBmaWVsZF9rZXkgPSBzdHJ1Y3RfZmllbGRfcmVhZF90ZW1wX3ZhcmlhYmxlKHRmaWVsZCk7CisgICAgICBpZiAoaXNfb3B0aW9uYWwocmVxKSkgeworICAgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgZmllbGRfbmFtZSA8PCAiOiAiIDw8IGZpZWxkX2tleSA8PCAiLCIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfZ2VuXworICAgICAgICAgIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgZmllbGRfbmFtZQorICAgICAgICAgIDw8ICI6ICIKKyAgICAgICAgICA8PCBmaWVsZF9rZXkKKyAgICAgICAgICA8PCAiLmV4cGVjdChcImF1dG8tZ2VuZXJhdGVkIGNvZGUgc2hvdWxkIGhhdmUgY2hlY2tlZCBmb3IgcHJlc2VuY2Ugb2YgcmVxdWlyZWQgZmllbGRzXCIpIgorICAgICAgICAgIDw8ICIsIgorICAgICAgICAgIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn07IiA8PCBlbmRsOworICB9CisKKyAgLy8gcmV0dXJuIHRoZSBjb25zdHJ1Y3RlZCB2YWx1ZQorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIk9rKHJldCkiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfdW5pb25fc3luY19yZWFkKGNvbnN0IHN0cmluZyAmdW5pb25fbmFtZSwgdF9zdHJ1Y3QgKnRzdHJ1Y3QpIHsKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAicHViIGZuIHJlYWRfZnJvbV9pbl9wcm90b2NvbChpX3Byb3Q6ICZtdXQgVElucHV0UHJvdG9jb2wpIC0+IHRocmlmdDo6UmVzdWx0PCIgPDwgdW5pb25fbmFtZSA8PCAiPiB7IgorICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIC8vIGNyZWF0ZSB0ZW1wb3JhcnkgdmFyaWFibGVzIHRvIGhvbGQgdGhlCisgIC8vIGNvbXBsZXRlZCB1bmlvbiBhcyB3ZWxsIGFzIGEgY291bnQgb2YgZmllbGRzIHJlYWQKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgbXV0IHJldDogT3B0aW9uPCIgPDwgdW5pb25fbmFtZSA8PCAiPiA9IE5vbmU7IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCBtdXQgcmVjZWl2ZWRfZmllbGRfY291bnQgPSAwOyIgPDwgZW5kbDsKKworICAvLyByZWFkIHRoZSBzdHJ1Y3QgcHJlYW1ibGUKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJpX3Byb3QucmVhZF9zdHJ1Y3RfYmVnaW4oKT87IiA8PCBlbmRsOworCisgIC8vIG5vdyBsb29wIHRocm91Z2ggdGhlIGZpZWxkcyB3ZSd2ZSByZWNlaXZlZAorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxvb3AgeyIgPDwgZW5kbDsgLy8gc3RhcnQgbG9vcAorICBpbmRlbnRfdXAoKTsKKworICAvLyBicmVhayBvdXQgaWYgeW91J3ZlIGZvdW5kIHRoZSBTdG9wIGZpZWxkCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IGZpZWxkX2lkZW50ID0gaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKT87IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImlmIGZpZWxkX2lkZW50LmZpZWxkX3R5cGUgPT0gVFR5cGU6OlN0b3AgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgLy8gbm93IHJlYWQgYWxsIHRoZSBmaWVsZHMgZm91bmQKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgZmllbGRfaWQgPSBmaWVsZF9pZCgmZmllbGRfaWRlbnQpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibWF0Y2ggZmllbGRfaWQgeyIgPDwgZW5kbDsgLy8gc3RhcnQgbWF0Y2gKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1lbWJlcnNfaXRlcjsKKyAgZm9yIChtZW1iZXJzX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1lbWJlcnNfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21lbWJlcnNfaXRlcikgeworICAgIHRfZmllbGQqIG1lbWJlciA9ICgqbWVtYmVyc19pdGVyKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgbWVtYmVyLT5nZXRfa2V5KCkgPDwgIiA9PiB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIHJlbmRlcl90eXBlX3N5bmNfcmVhZCgidmFsIiwgbWVtYmVyLT5nZXRfdHlwZSgpKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImlmIHJldC5pc19ub25lKCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX2dlbl8KKyAgICAgIDw8IGluZGVudCgpCisgICAgICA8PCAicmV0ID0gU29tZSgiIDw8IHVuaW9uX25hbWUgPDwgIjo6IiA8PCBydXN0X3VuaW9uX2ZpZWxkX25hbWUobWVtYmVyKSA8PCAiKHZhbCkpOyIKKyAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJyZWNlaXZlZF9maWVsZF9jb3VudCArPSAxOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSwiIDw8IGVuZGw7CisgIH0KKworICAvLyBkZWZhdWx0IGNhc2UgKHNraXAgZmllbGRzKQorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIl8gPT4geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiaV9wcm90LnNraXAoZmllbGRfaWRlbnQuZmllbGRfdHlwZSk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJyZWNlaXZlZF9maWVsZF9jb3VudCArPSAxOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9LCIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn07IiA8PCBlbmRsOyAvLyBmaW5pc2ggbWF0Y2gKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJpX3Byb3QucmVhZF9maWVsZF9lbmQoKT87IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7IC8vIGZpbmlzaCBsb29wCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiaV9wcm90LnJlYWRfc3RydWN0X2VuZCgpPzsiIDw8IGVuZGw7IC8vIGZpbmlzaCByZWFkaW5nIG1lc3NhZ2UgZnJvbSB3aXJlCisKKyAgLy8gcmV0dXJuIHRoZSB2YWx1ZSBvciBhbiBlcnJvcgorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImlmIHJlY2VpdmVkX2ZpZWxkX2NvdW50ID09IDAgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHJlbmRlcl90aHJpZnRfZXJyb3IoCisgICAgIlByb3RvY29sIiwKKyAgICAiUHJvdG9jb2xFcnJvciIsCisgICAgIlByb3RvY29sRXJyb3JLaW5kOjpJbnZhbGlkRGF0YSIsCisgICAgIlwicmVjZWl2ZWQgZW1wdHkgdW5pb24gZnJvbSByZW1vdGUgIiArIHVuaW9uX25hbWUgKyAiXCIiCisgICk7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIGlmIHJlY2VpdmVkX2ZpZWxkX2NvdW50ID4gMSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgcmVuZGVyX3RocmlmdF9lcnJvcigKKyAgICAiUHJvdG9jb2wiLAorICAgICJQcm90b2NvbEVycm9yIiwKKyAgICAiUHJvdG9jb2xFcnJvcktpbmQ6OkludmFsaWREYXRhIiwKKyAgICAiXCJyZWNlaXZlZCBtdWx0aXBsZSBmaWVsZHMgZm9yIHVuaW9uIGZyb20gcmVtb3RlICIgKyB1bmlvbl9uYW1lICsgIlwiIgorICApOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJPayhyZXQuZXhwZWN0KFwicmV0dXJuIHZhbHVlIHNob3VsZCBoYXZlIGJlZW4gY29uc3RydWN0ZWRcIikpIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCisvLyBDb25zdHJ1Y3QgdGhlIHJ1c3QgcmVwcmVzZW50YXRpb24gb2YgYWxsIHN1cHBvcnRlZCB0eXBlcyBmcm9tIHRoZSB3aXJlLgordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3R5cGVfc3luY19yZWFkKGNvbnN0IHN0cmluZyAmdHlwZV92YXIsIHRfdHlwZSAqdHR5cGUsIGJvb2wgaXNfYm94ZWQpIHsKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlKiB0YmFzZV90eXBlID0gKHRfYmFzZV90eXBlKil0dHlwZTsKKyAgICBzd2l0Y2ggKHRiYXNlX3R5cGUtPmdldF9iYXNlKCkpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiY2Fubm90IHJlYWQgZmllbGQgb2YgdHlwZSBUWVBFX1ZPSUQgZnJvbSBpbnB1dCBwcm90b2NvbCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBpZiAodGJhc2VfdHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgIiA8PCB0eXBlX3ZhciA8PCAiID0gaV9wcm90LnJlYWRfYnl0ZXMoKT87IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgIiA8PCB0eXBlX3ZhciA8PCAiID0gaV9wcm90LnJlYWRfc3RyaW5nKCk/OyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIHJldHVybjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCAiIDw8IHR5cGVfdmFyIDw8ICIgPSBpX3Byb3QucmVhZF9ib29sKCk/OyIgPDwgZW5kbDsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgIiA8PCB0eXBlX3ZhciA8PCAiID0gaV9wcm90LnJlYWRfaTgoKT87IiA8PCBlbmRsOworICAgICAgcmV0dXJuOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgIiA8PCB0eXBlX3ZhciA8PCAiID0gaV9wcm90LnJlYWRfaTE2KCk/OyIgPDwgZW5kbDsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0ICIgPDwgdHlwZV92YXIgPDwgIiA9IGlfcHJvdC5yZWFkX2kzMigpPzsiIDw8IGVuZGw7CisgICAgICByZXR1cm47CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCAiIDw8IHR5cGVfdmFyIDw8ICIgPSBpX3Byb3QucmVhZF9pNjQoKT87IiA8PCBlbmRsOworICAgICAgcmV0dXJuOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgIiA8PCB0eXBlX3ZhciA8PCAiID0gT3JkZXJlZEZsb2F0Ojpmcm9tKGlfcHJvdC5yZWFkX2RvdWJsZSgpPyk7IiA8PCBlbmRsOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgLy8gRklYTUU6IG5vdCBhIGZhbiBvZiBzZXBhcmF0ZSBgaXNfYm94ZWRgIHBhcmFtZXRlcgorICAgIC8vIFRoaXMgaXMgcHJvYmxlbWF0aWMgYmVjYXVzZSBpdCdzIGFuIG9wdGlvbmFsIHBhcmFtZXRlciwgYW5kIG9ubHkgY29tZXMKKyAgICAvLyBpbnRvIHBsYXkgb25jZS4gVGhlIGNvcmUgaXNzdWUgaXMgdGhhdCBJIGxvc2UgYW4gaW1wb3J0YW50IHBpZWNlIG9mIHR5cGUKKyAgICAvLyBpbmZvcm1hdGlvbiAod2hldGhlciB0aGUgdHlwZSBpcyBhIGZ3ZCByZWYpIGJ5IHVud3JhcHBpbmcgdGhlIHR5cGVkZWYnZAorICAgIC8vIHR5cGUgYW5kIG1ha2luZyB0aGUgcmVjdXJzaXZlIGNhbGwgdXNpbmcgaXQuIEkgY2FuJ3QgbW9kaWZ5IG9yIHdyYXAgdGhlCisgICAgLy8gZ2VuZXJhdGVkIHN0cmluZyBhZnRlciB0aGUgZmFjdCBiZWNhdXNlIGl0J3Mgd3JpdHRlbiBkaXJlY3RseSBpbnRvIHRoZSBmaWxlLAorICAgIC8vIHNvIEkgaGF2ZSB0byBwYXNzIHRoaXMgcGFyYW1ldGVyIGFsb25nLiBHb2luZyB3aXRoIHRoaXMgYXBwcm9hY2ggYmVjYXVzZSBpdAorICAgIC8vIHNlZW1zIGxpa2UgdGhlIGxvd2VzdC1jb3N0IG9wdGlvbiB0byBlYXNpbHkgc3VwcG9ydCByZWN1cnNpdmUgdHlwZXMuCisgICAgdF90eXBlZGVmKiB0dHlwZWRlZiA9ICh0X3R5cGVkZWYqKXR0eXBlOworICAgIHJlbmRlcl90eXBlX3N5bmNfcmVhZCh0eXBlX3ZhciwgdHR5cGVkZWYtPmdldF90eXBlKCksIHR0eXBlZGVmLT5pc19mb3J3YXJkX3R5cGVkZWYoKSk7CisgICAgcmV0dXJuOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgc3RyaW5nIHJlYWRfY2FsbCh0b19ydXN0X3R5cGUodHR5cGUpICsgIjo6cmVhZF9mcm9tX2luX3Byb3RvY29sKGlfcHJvdCk/Iik7CisgICAgcmVhZF9jYWxsID0gaXNfYm94ZWQgPyAiQm94OjpuZXcoIiArIHJlYWRfY2FsbCArICIpIiA6IHJlYWRfY2FsbDsKKyAgICBmX2dlbl8KKyAgICAgIDw8IGluZGVudCgpCisgICAgICA8PCAibGV0ICIgPDwgdHlwZV92YXIgPDwgIiA9ICIgPDwgIHJlYWRfY2FsbCA8PCAiOyIKKyAgICAgIDw8IGVuZGw7CisgICAgcmV0dXJuOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHJlbmRlcl9tYXBfc3luY19yZWFkKCh0X21hcCAqKSB0dHlwZSwgdHlwZV92YXIpOworICAgIHJldHVybjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZW5kZXJfc2V0X3N5bmNfcmVhZCgodF9zZXQgKikgdHR5cGUsIHR5cGVfdmFyKTsKKyAgICByZXR1cm47CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJlbmRlcl9saXN0X3N5bmNfcmVhZCgodF9saXN0ICopIHR0eXBlLCB0eXBlX3Zhcik7CisgICAgcmV0dXJuOworICB9CisKKyAgdGhyb3cgImNhbm5vdCByZWFkIHVuc3VwcG9ydGVkIHR5cGUgIiArIHR0eXBlLT5nZXRfbmFtZSgpOworfQorCisvLyBDb25zdHJ1Y3QgdGhlIHJ1c3QgcmVwcmVzZW50YXRpb24gb2YgYSBsaXN0IGZyb20gdGhlIHdpcmUuCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfbGlzdF9zeW5jX3JlYWQodF9saXN0ICp0bGlzdCwgY29uc3Qgc3RyaW5nICZsaXN0X3ZhcikgeworICB0X3R5cGUqIGVsZW1fdHlwZSA9IHRsaXN0LT5nZXRfZWxlbV90eXBlKCk7CisKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgbGlzdF9pZGVudCA9IGlfcHJvdC5yZWFkX2xpc3RfYmVnaW4oKT87IiA8PCBlbmRsOworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJsZXQgbXV0ICIgPDwgbGlzdF92YXIgPDwgIjogIiA8PCB0b19ydXN0X3R5cGUoKHRfdHlwZSopIHRsaXN0KQorICAgIDw8ICIgPSBWZWM6OndpdGhfY2FwYWNpdHkobGlzdF9pZGVudC5zaXplIGFzIHVzaXplKTsiCisgICAgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJmb3IgXyBpbiAwLi5saXN0X2lkZW50LnNpemUgeyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICBzdHJpbmcgbGlzdF9lbGVtX3ZhciA9IHRtcCgibGlzdF9lbGVtXyIpOworICByZW5kZXJfdHlwZV9zeW5jX3JlYWQobGlzdF9lbGVtX3ZhciwgZWxlbV90eXBlKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8IGxpc3RfdmFyIDw8ICIucHVzaCgiIDw8IGxpc3RfZWxlbV92YXIgPDwgIik7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImlfcHJvdC5yZWFkX2xpc3RfZW5kKCk/OyIgPDwgZW5kbDsKK30KKworLy8gQ29uc3RydWN0IHRoZSBydXN0IHJlcHJlc2VudGF0aW9uIG9mIGEgc2V0IGZyb20gdGhlIHdpcmUuCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc2V0X3N5bmNfcmVhZCh0X3NldCAqdHNldCwgY29uc3Qgc3RyaW5nICZzZXRfdmFyKSB7CisgIHRfdHlwZSogZWxlbV90eXBlID0gdHNldC0+Z2V0X2VsZW1fdHlwZSgpOworCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IHNldF9pZGVudCA9IGlfcHJvdC5yZWFkX3NldF9iZWdpbigpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgImxldCBtdXQgIiA8PCBzZXRfdmFyIDw8ICI6ICIgPDwgdG9fcnVzdF90eXBlKCh0X3R5cGUqKSB0c2V0KQorICAgIDw8ICIgPSBCVHJlZVNldDo6bmV3KCk7IgorICAgIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiZm9yIF8gaW4gMC4uc2V0X2lkZW50LnNpemUgeyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICBzdHJpbmcgc2V0X2VsZW1fdmFyID0gdG1wKCJzZXRfZWxlbV8iKTsKKyAgcmVuZGVyX3R5cGVfc3luY19yZWFkKHNldF9lbGVtX3ZhciwgZWxlbV90eXBlKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8IHNldF92YXIgPDwgIi5pbnNlcnQoIiA8PCBzZXRfZWxlbV92YXIgPDwgIik7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImlfcHJvdC5yZWFkX3NldF9lbmQoKT87IiA8PCBlbmRsOworfQorCisvLyBDb25zdHJ1Y3QgdGhlIHJ1c3QgcmVwcmVzZW50YXRpb24gb2YgYSBtYXAgZnJvbSB0aGUgd2lyZS4KK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9tYXBfc3luY19yZWFkKHRfbWFwICp0bWFwLCBjb25zdCBzdHJpbmcgJm1hcF92YXIpIHsKKyAgdF90eXBlKiBrZXlfdHlwZSA9IHRtYXAtPmdldF9rZXlfdHlwZSgpOworICB0X3R5cGUqIHZhbF90eXBlID0gdG1hcC0+Z2V0X3ZhbF90eXBlKCk7CisKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgbWFwX2lkZW50ID0gaV9wcm90LnJlYWRfbWFwX2JlZ2luKCk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAibGV0IG11dCAiIDw8IG1hcF92YXIgPDwgIjogIiA8PCB0b19ydXN0X3R5cGUoKHRfdHlwZSopIHRtYXApCisgICAgPDwgIiA9IEJUcmVlTWFwOjpuZXcoKTsiCisgICAgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJmb3IgXyBpbiAwLi5tYXBfaWRlbnQuc2l6ZSB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIHN0cmluZyBrZXlfZWxlbV92YXIgPSB0bXAoIm1hcF9rZXlfIik7CisgIHJlbmRlcl90eXBlX3N5bmNfcmVhZChrZXlfZWxlbV92YXIsIGtleV90eXBlKTsKKyAgc3RyaW5nIHZhbF9lbGVtX3ZhciA9IHRtcCgibWFwX3ZhbF8iKTsKKyAgcmVuZGVyX3R5cGVfc3luY19yZWFkKHZhbF9lbGVtX3ZhciwgdmFsX3R5cGUpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgbWFwX3ZhciA8PCAiLmluc2VydCgiIDw8IGtleV9lbGVtX3ZhciA8PCAiLCAiIDw8IHZhbF9lbGVtX3ZhciA8PCAiKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiaV9wcm90LnJlYWRfbWFwX2VuZCgpPzsiIDw8IGVuZGw7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6c3RydWN0X2ZpZWxkX3JlYWRfdGVtcF92YXJpYWJsZSh0X2ZpZWxkKiB0ZmllbGQpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIGZvc3M7CisgIGZvc3MgPDwgImZfIiA8PCB0ZmllbGQtPmdldF9rZXkoKTsKKyAgcmV0dXJuIGZvc3Muc3RyKCk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBTeW5jIENsaWVudAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHJlbmRlcl9zeW5jX2NsaWVudCh0c2VydmljZSk7CisgIHJlbmRlcl9zeW5jX3Byb2Nlc3Nvcih0c2VydmljZSk7CisgIHJlbmRlcl9zZXJ2aWNlX2NhbGxfc3RydWN0cyh0c2VydmljZSk7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zZXJ2aWNlX2NhbGxfc3RydWN0cyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICBzdGQ6OnZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZ1bmNfaXRlcjsKKworICAvLyB0aHJpZnQgYXJncyBmb3Igc2VydmljZSBjYWxscyBhcmUgcGFja2VkCisgIC8vIGludG8gYSBzdHJ1Y3QgdGhhdCdzIHRyYW5zbWl0dGVkIG92ZXIgdGhlIHdpcmUsIHNvCisgIC8vIGdlbmVyYXRlIHN0cnVjdHMgZm9yIHRob3NlIHRvbworICAvLworICAvLyB0aHJpZnQgcmV0dXJucyBhcmUgKmFsc28qIHBhY2tlZCBpbnRvIGEgc3RydWN0CisgIC8vIHRoYXQncyBwYXNzZWQgb3ZlciB0aGUgd2lyZSwgc28sIGdlbmVyYXRlIHRoZSBzdHJ1Y3QKKyAgLy8gZm9yIHRoYXQgdG9vLiBOb3RlIHRoYXQgdGhpcyByZXN1bHQgc3RydWN0ICphbHNvKgorICAvLyBjb250YWlucyB0aGUgZXhjZXB0aW9ucyBhcyB3ZWxsCisgIGZvcihmdW5jX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZnVuY19pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmdW5jX2l0ZXIpIHsKKyAgICB0X2Z1bmN0aW9uKiB0ZnVuYyA9ICgqZnVuY19pdGVyKTsKKyAgICByZW5kZXJfc2VydmljZV9jYWxsX2FyZ3Nfc3RydWN0KHRmdW5jKTsKKyAgICBpZiAoIXRmdW5jLT5pc19vbmV3YXkoKSkgeworICAgICAgcmVuZGVyX3NlcnZpY2VfY2FsbF9yZXN1bHRfdmFsdWVfc3RydWN0KHRmdW5jKTsKKyAgICB9CisgIH0KK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N5bmNfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGNsaWVudF9pbXBsX25hbWUocnVzdF9zeW5jX2NsaWVudF9pbXBsX25hbWUodHNlcnZpY2UpKTsKKworICByZW5kZXJfdHlwZV9jb21tZW50KHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIiBzZXJ2aWNlIGNsaWVudCIpOyAvLyBub3RlOiB1c2UgKm9yaWdpbmFsKiBuYW1lCisgIHJlbmRlcl9zeW5jX2NsaWVudF90cmFpdCh0c2VydmljZSk7CisgIHJlbmRlcl9zeW5jX2NsaWVudF9tYXJrZXJfdHJhaXQodHNlcnZpY2UpOworICByZW5kZXJfc3luY19jbGllbnRfZGVmaW5pdGlvbl9hbmRfaW1wbChjbGllbnRfaW1wbF9uYW1lKTsKKyAgcmVuZGVyX3N5bmNfY2xpZW50X3R0aHJpZnRjbGllbnRfaW1wbChjbGllbnRfaW1wbF9uYW1lKTsKKyAgcmVuZGVyX3N5bmNfY2xpZW50X21hcmtlcl90cmFpdF9pbXBscyh0c2VydmljZSwgY2xpZW50X2ltcGxfbmFtZSk7IGZfZ2VuXyA8PCBlbmRsOworICByZW5kZXJfc3luY19jbGllbnRfcHJvY2Vzc19pbXBsKHRzZXJ2aWNlKTsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N5bmNfY2xpZW50X3RyYWl0KHRfc2VydmljZSAqdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuc2lvbiA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpIHsKKyAgICB0X3NlcnZpY2UqIGV4dGVuZHMgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKyAgICBleHRlbnNpb24gPSAiIDogIiArIHJ1c3RfbmFtZXNwYWNlKGV4dGVuZHMpICsgcnVzdF9zeW5jX2NsaWVudF90cmFpdF9uYW1lKGV4dGVuZHMpOworICB9CisKKyAgcmVuZGVyX3J1c3Rkb2MoKHRfZG9jKikgdHNlcnZpY2UpOworICBmX2dlbl8gPDwgInB1YiB0cmFpdCAiIDw8IHJ1c3Rfc3luY19jbGllbnRfdHJhaXRfbmFtZSh0c2VydmljZSkgPDwgZXh0ZW5zaW9uIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHN0ZDo6dmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZnVuY19pdGVyOworICBmb3IoZnVuY19pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZ1bmNfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZnVuY19pdGVyKSB7CisgICAgdF9mdW5jdGlvbiogdGZ1bmMgPSAoKmZ1bmNfaXRlcik7CisgICAgc3RyaW5nIGZ1bmNfbmFtZSA9IHNlcnZpY2VfY2FsbF9jbGllbnRfZnVuY3Rpb25fbmFtZSh0ZnVuYyk7CisgICAgc3RyaW5nIGZ1bmNfYXJncyA9IHJ1c3Rfc3luY19zZXJ2aWNlX2NhbGxfZGVjbGFyYXRpb24odGZ1bmMsIHRydWUpOworICAgIHN0cmluZyBmdW5jX3JldHVybiA9IHRvX3J1c3RfdHlwZSh0ZnVuYy0+Z2V0X3JldHVybnR5cGUoKSk7CisgICAgcmVuZGVyX3J1c3Rkb2MoKHRfZG9jKikgdGZ1bmMpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiZm4gIiA8PCBmdW5jX25hbWUgPDwgIGZ1bmNfYXJncyA8PCAiIC0+IHRocmlmdDo6UmVzdWx0PCIgPDwgZnVuY19yZXR1cm4gPDwgIj47IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N5bmNfY2xpZW50X21hcmtlcl90cmFpdCh0X3NlcnZpY2UgKnRzZXJ2aWNlKSB7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAicHViIHRyYWl0ICIgPDwgcnVzdF9zeW5jX2NsaWVudF9tYXJrZXJfdHJhaXRfbmFtZSh0c2VydmljZSkgPDwgIiB7fSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX2NsaWVudF9tYXJrZXJfdHJhaXRfaW1wbHModF9zZXJ2aWNlICp0c2VydmljZSwgY29uc3Qgc3RyaW5nICZpbXBsX3N0cnVjdF9uYW1lKSB7CisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgImltcGwgIgorICAgIDw8IFNZTkNfQ0xJRU5UX0dFTkVSSUNfQk9VTkRfVkFSUworICAgIDw8ICIgIgorICAgIDw8IHJ1c3RfbmFtZXNwYWNlKHRzZXJ2aWNlKSA8PCBydXN0X3N5bmNfY2xpZW50X21hcmtlcl90cmFpdF9uYW1lKHRzZXJ2aWNlKQorICAgIDw8ICIgZm9yICIKKyAgICA8PCBpbXBsX3N0cnVjdF9uYW1lIDw8IFNZTkNfQ0xJRU5UX0dFTkVSSUNfQk9VTkRfVkFSUworICAgIDw8ICIgIgorICAgIDw8IFNZTkNfQ0xJRU5UX0dFTkVSSUNfQk9VTkRTCisgICAgPDwgIiB7fSIKKyAgICA8PCBlbmRsOworCisgIHRfc2VydmljZSogZXh0ZW5kcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICBpZiAoZXh0ZW5kcykgeworICAgIHJlbmRlcl9zeW5jX2NsaWVudF9tYXJrZXJfdHJhaXRfaW1wbHMoZXh0ZW5kcywgaW1wbF9zdHJ1Y3RfbmFtZSk7CisgIH0KK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N5bmNfY2xpZW50X2RlZmluaXRpb25fYW5kX2ltcGwoY29uc3Qgc3RyaW5nJiBjbGllbnRfaW1wbF9uYW1lKSB7CisKKyAgLy8gcmVuZGVyIHRoZSBkZWZpbml0aW9uIGZvciB0aGUgY2xpZW50IHN0cnVjdAorICBmX2dlbl8KKyAgICA8PCAicHViIHN0cnVjdCAiCisgICAgPDwgY2xpZW50X2ltcGxfbmFtZQorICAgIDw8IFNZTkNfQ0xJRU5UX0dFTkVSSUNfQk9VTkRfVkFSUworICAgIDw8ICIgIgorICAgIDw8IFNZTkNfQ0xJRU5UX0dFTkVSSUNfQk9VTkRTCisgICAgPDwgIiB7IgorICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIl9pX3Byb3Q6IElQLCIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJfb19wcm90OiBPUCwiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiX3NlcXVlbmNlX251bWJlcjogaTMyLCIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKKworICAvLyByZW5kZXIgdGhlIHN0cnVjdCBpbXBsZW1lbnRhdGlvbgorICAvLyB0aGlzIGluY2x1ZGVzIHRoZSBuZXcoKSBmdW5jdGlvbiBhcyB3ZWxsIGFzIHRoZSBoZWxwZXIgc2VuZC9yZWN2IG1ldGhvZHMgZm9yIGVhY2ggc2VydmljZSBjYWxsCisgIGZfZ2VuXworICAgIDw8ICJpbXBsICIKKyAgICA8PCBTWU5DX0NMSUVOVF9HRU5FUklDX0JPVU5EX1ZBUlMKKyAgICA8PCAiICIKKyAgICA8PCBjbGllbnRfaW1wbF9uYW1lCisgICAgPDwgU1lOQ19DTElFTlRfR0VORVJJQ19CT1VORF9WQVJTCisgICAgPDwgIiAiCisgICAgPDwgU1lOQ19DTElFTlRfR0VORVJJQ19CT1VORFMKKyAgICA8PCAiIHsiCisgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHJlbmRlcl9zeW5jX2NsaWVudF9saWZlY3ljbGVfZnVuY3Rpb25zKGNsaWVudF9pbXBsX25hbWUpOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3luY19jbGllbnRfbGlmZWN5Y2xlX2Z1bmN0aW9ucyhjb25zdCBzdHJpbmcmIGNsaWVudF9zdHJ1Y3QpIHsKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAicHViIGZuIG5ldyhpbnB1dF9wcm90b2NvbDogSVAsIG91dHB1dF9wcm90b2NvbDogT1ApIC0+ICIKKyAgICA8PCBjbGllbnRfc3RydWN0CisgICAgPDwgU1lOQ19DTElFTlRfR0VORVJJQ19CT1VORF9WQVJTCisgICAgPDwgIiB7IgorICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgY2xpZW50X3N0cnVjdAorICAgIDw8ICIgeyBfaV9wcm90OiBpbnB1dF9wcm90b2NvbCwgX29fcHJvdDogb3V0cHV0X3Byb3RvY29sLCBfc2VxdWVuY2VfbnVtYmVyOiAwIH0iCisgICAgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX2NsaWVudF90dGhyaWZ0Y2xpZW50X2ltcGwoY29uc3Qgc3RyaW5nICZjbGllbnRfaW1wbF9uYW1lKSB7CisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgImltcGwgIgorICAgIDw8IFNZTkNfQ0xJRU5UX0dFTkVSSUNfQk9VTkRfVkFSUworICAgIDw8ICIgVFRocmlmdENsaWVudCBmb3IgIgorICAgIDw8IGNsaWVudF9pbXBsX25hbWUKKyAgICA8PCBTWU5DX0NMSUVOVF9HRU5FUklDX0JPVU5EX1ZBUlMKKyAgICA8PCAiICIKKyAgICA8PCBTWU5DX0NMSUVOVF9HRU5FUklDX0JPVU5EUworICAgIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJmbiBpX3Byb3RfbXV0KCZtdXQgc2VsZikgLT4gJm11dCBUSW5wdXRQcm90b2NvbCB7ICZtdXQgc2VsZi5faV9wcm90IH0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiZm4gb19wcm90X211dCgmbXV0IHNlbGYpIC0+ICZtdXQgVE91dHB1dFByb3RvY29sIHsgJm11dCBzZWxmLl9vX3Byb3QgfSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJmbiBzZXF1ZW5jZV9udW1iZXIoJnNlbGYpIC0+IGkzMiB7IHNlbGYuX3NlcXVlbmNlX251bWJlciB9IiA8PCBlbmRsOworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJmbiBpbmNyZW1lbnRfc2VxdWVuY2VfbnVtYmVyKCZtdXQgc2VsZikgLT4gaTMyIHsgc2VsZi5fc2VxdWVuY2VfbnVtYmVyICs9IDE7IHNlbGYuX3NlcXVlbmNlX251bWJlciB9IgorICAgIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N5bmNfY2xpZW50X3Byb2Nlc3NfaW1wbCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBtYXJrZXJfZXh0ZW5zaW9uID0gIiIgKyBzeW5jX2NsaWVudF9tYXJrZXJfdHJhaXRzX2Zvcl9leHRlbnNpb24odHNlcnZpY2UpOworCisgIGZfZ2VuXworICAgIDw8ICJpbXBsIDxDOiBUVGhyaWZ0Q2xpZW50ICsgIiA8PCBydXN0X3N5bmNfY2xpZW50X21hcmtlcl90cmFpdF9uYW1lKHRzZXJ2aWNlKSA8PCBtYXJrZXJfZXh0ZW5zaW9uIDw8ICI+ICIKKyAgICA8PCBydXN0X3N5bmNfY2xpZW50X3RyYWl0X25hbWUodHNlcnZpY2UpCisgICAgPDwgIiBmb3IgQyB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgc3RkOjp2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmdW5jX2l0ZXI7CisgIGZvcihmdW5jX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZnVuY19pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmdW5jX2l0ZXIpIHsKKyAgICB0X2Z1bmN0aW9uKiBmdW5jID0gKCpmdW5jX2l0ZXIpOworICAgIHJlbmRlcl9zeW5jX3NlbmRfcmVjdl93cmFwcGVyKGZ1bmMpOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpzeW5jX2NsaWVudF9tYXJrZXJfdHJhaXRzX2Zvcl9leHRlbnNpb24odF9zZXJ2aWNlICp0c2VydmljZSkgeworICBzdHJpbmcgbWFya2VyX2V4dGVuc2lvbjsKKworICB0X3NlcnZpY2UqIGV4dGVuZHMgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKyAgaWYgKGV4dGVuZHMpIHsKKyAgICBtYXJrZXJfZXh0ZW5zaW9uID0gIiArICIgKyBydXN0X25hbWVzcGFjZShleHRlbmRzKSArIHJ1c3Rfc3luY19jbGllbnRfbWFya2VyX3RyYWl0X25hbWUoZXh0ZW5kcyk7CisgICAgbWFya2VyX2V4dGVuc2lvbiA9IG1hcmtlcl9leHRlbnNpb24gKyBzeW5jX2NsaWVudF9tYXJrZXJfdHJhaXRzX2Zvcl9leHRlbnNpb24oZXh0ZW5kcyk7CisgIH0KKworICByZXR1cm4gbWFya2VyX2V4dGVuc2lvbjsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N5bmNfc2VuZF9yZWN2X3dyYXBwZXIodF9mdW5jdGlvbiogdGZ1bmMpIHsKKyAgc3RyaW5nIGZ1bmNfbmFtZSA9IHNlcnZpY2VfY2FsbF9jbGllbnRfZnVuY3Rpb25fbmFtZSh0ZnVuYyk7CisgIHN0cmluZyBmdW5jX2RlY2xfYXJncyA9IHJ1c3Rfc3luY19zZXJ2aWNlX2NhbGxfZGVjbGFyYXRpb24odGZ1bmMsIHRydWUpOworICBzdHJpbmcgZnVuY19jYWxsX2FyZ3MgPSBydXN0X3N5bmNfc2VydmljZV9jYWxsX2ludm9jYXRpb24odGZ1bmMpOworICBzdHJpbmcgZnVuY19yZXR1cm4gPSB0b19ydXN0X3R5cGUodGZ1bmMtPmdldF9yZXR1cm50eXBlKCkpOworCisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgImZuICIgPDwgZnVuY19uYW1lIDw8ICBmdW5jX2RlY2xfYXJncyA8PCAiIC0+IHRocmlmdDo6UmVzdWx0PCIgPDwgZnVuY19yZXR1cm4KKyAgICA8PCAiPiB7IgorICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiKCIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHJlbmRlcl9zeW5jX3NlbmQodGZ1bmMpOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIik/OyIgPDwgZW5kbDsKKyAgaWYgKHRmdW5jLT5pc19vbmV3YXkoKSkgeworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiT2soKCkpIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHJlbmRlcl9zeW5jX3JlY3YodGZ1bmMpOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3luY19zZW5kKHRfZnVuY3Rpb24qIHRmdW5jKSB7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gaW5jcmVtZW50IHRoZSBzZXF1ZW5jZSBudW1iZXIgYW5kIGdlbmVyYXRlIHRoZSBjYWxsIGhlYWRlcgorICBzdHJpbmcgbWVzc2FnZV90eXBlID0gdGZ1bmMtPmlzX29uZXdheSgpID8gIlRNZXNzYWdlVHlwZTo6T25lV2F5IiA6ICJUTWVzc2FnZVR5cGU6OkNhbGwiOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInNlbGYuaW5jcmVtZW50X3NlcXVlbmNlX251bWJlcigpOyIgPDwgZW5kbDsKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAibGV0IG1lc3NhZ2VfaWRlbnQgPSAiCisgICAgPDwgIlRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KFwiIiA8PCB0ZnVuYy0+Z2V0X25hbWUoKSA8PCAiXCIsICIgLy8gbm90ZTogdXNlICpvcmlnaW5hbCogbmFtZQorICAgIDw8IG1lc3NhZ2VfdHlwZSA8PCAiLCAiCisgICAgPDwgInNlbGYuc2VxdWVuY2VfbnVtYmVyKCkpOyIKKyAgICA8PCBlbmRsOworICAvLyBwYWNrIHRoZSBhcmd1bWVudHMgaW50byB0aGUgY29udGFpbmluZyBzdHJ1Y3QgdGhhdCB3ZSdsbCB3cml0ZSBvdXQgb3ZlciB0aGUgd2lyZQorICAvLyBub3RlIHRoYXQgdGhpcyBzdHJ1Y3QgaXMgZ2VuZXJhdGVkIGV2ZW4gaWYgd2UgaGF2ZSAwIGFyZ3MKKyAgb3N0cmluZ3N0cmVhbSBzdHJ1Y3RfZGVmaW5pdGlvbjsKKyAgdmVjdG9yPHRfZmllbGQqPiBtZW1iZXJzID0gdGZ1bmMtPmdldF9hcmdsaXN0KCktPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+OjppdGVyYXRvciBtZW1iZXJzX2l0ZXI7CisgIGZvciAobWVtYmVyc19pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtZW1iZXJzX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttZW1iZXJzX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBtZW1iZXIgPSAoKm1lbWJlcnNfaXRlcik7CisgICAgc3RyaW5nIG1lbWJlcl9uYW1lKHJ1c3RfZmllbGRfbmFtZShtZW1iZXIpKTsKKyAgICBzdHJ1Y3RfZGVmaW5pdGlvbiA8PCBtZW1iZXJfbmFtZSA8PCAiOiAiIDw8IG1lbWJlcl9uYW1lIDw8ICIsICI7CisgIH0KKyAgc3RyaW5nIHN0cnVjdF9maWVsZHMgPSBzdHJ1Y3RfZGVmaW5pdGlvbi5zdHIoKTsKKyAgaWYgKHN0cnVjdF9maWVsZHMuc2l6ZSgpID4gMCkgeworICAgIHN0cnVjdF9maWVsZHMgPSBzdHJ1Y3RfZmllbGRzLnN1YnN0cigwLCBzdHJ1Y3RfZmllbGRzLnNpemUoKSAtIDIpOyAvLyBzdHJpcCB0cmFpbGluZyBjb21tYQorICB9CisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgImxldCBjYWxsX2FyZ3MgPSAiCisgICAgPDwgc2VydmljZV9jYWxsX2FyZ3Nfc3RydWN0X25hbWUodGZ1bmMpCisgICAgPDwgIiB7ICIKKyAgICA8PCBzdHJ1Y3RfZmllbGRzCisgICAgPDwgIiB9OyIKKyAgICA8PCBlbmRsOworICAvLyB3cml0ZSBldmVyeXRoaW5nIG92ZXIgdGhlIHdpcmUKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJzZWxmLm9fcHJvdF9tdXQoKS53cml0ZV9tZXNzYWdlX2JlZ2luKCZtZXNzYWdlX2lkZW50KT87IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImNhbGxfYXJncy53cml0ZV90b19vdXRfcHJvdG9jb2woc2VsZi5vX3Byb3RfbXV0KCkpPzsiIDw8IGVuZGw7IC8vIHdyaXR0ZW4gZXZlbiBpZiB3ZSBoYXZlIDAgYXJncworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInNlbGYub19wcm90X211dCgpLndyaXRlX21lc3NhZ2VfZW5kKCk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJzZWxmLm9fcHJvdF9tdXQoKS5mbHVzaCgpIiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N5bmNfcmVjdih0X2Z1bmN0aW9uKiB0ZnVuYykgeworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IG1lc3NhZ2VfaWRlbnQgPSBzZWxmLmlfcHJvdF9tdXQoKS5yZWFkX21lc3NhZ2VfYmVnaW4oKT87IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInZlcmlmeV9leHBlY3RlZF9zZXF1ZW5jZV9udW1iZXIoc2VsZi5zZXF1ZW5jZV9udW1iZXIoKSwgbWVzc2FnZV9pZGVudC5zZXF1ZW5jZV9udW1iZXIpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAidmVyaWZ5X2V4cGVjdGVkX3NlcnZpY2VfY2FsbChcIiIgPDwgdGZ1bmMtPmdldF9uYW1lKCkgPDwiXCIsICZtZXNzYWdlX2lkZW50Lm5hbWUpPzsiIDw8IGVuZGw7IC8vIG5vdGU6IHVzZSAqb3JpZ2luYWwqIG5hbWUKKyAgLy8gRklYTUU6IHJlcGxhY2Ugd2l0aCBhICJ0cnkiIGJsb2NrCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiaWYgbWVzc2FnZV9pZGVudC5tZXNzYWdlX3R5cGUgPT0gVE1lc3NhZ2VUeXBlOjpFeGNlcHRpb24geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IHJlbW90ZV9lcnJvciA9IHRocmlmdDo6RXJyb3I6OnJlYWRfYXBwbGljYXRpb25fZXJyb3JfZnJvbV9pbl9wcm90b2NvbChzZWxmLmlfcHJvdF9tdXQoKSk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJzZWxmLmlfcHJvdF9tdXQoKS5yZWFkX21lc3NhZ2VfZW5kKCk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gRXJyKHRocmlmdDo6RXJyb3I6OkFwcGxpY2F0aW9uKHJlbW90ZV9lcnJvcikpIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAidmVyaWZ5X2V4cGVjdGVkX21lc3NhZ2VfdHlwZShUTWVzc2FnZVR5cGU6OlJlcGx5LCBtZXNzYWdlX2lkZW50Lm1lc3NhZ2VfdHlwZSk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgcmVzdWx0ID0gIiA8PCBzZXJ2aWNlX2NhbGxfcmVzdWx0X3N0cnVjdF9uYW1lKHRmdW5jKSA8PCAiOjpyZWFkX2Zyb21faW5fcHJvdG9jb2woc2VsZi5pX3Byb3RfbXV0KCkpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAic2VsZi5pX3Byb3RfbXV0KCkucmVhZF9tZXNzYWdlX2VuZCgpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0Lm9rX29yKCkiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnJ1c3Rfc3luY19zZXJ2aWNlX2NhbGxfZGVjbGFyYXRpb24odF9mdW5jdGlvbiogdGZ1bmMsIGJvb2wgc2VsZl9pc19tdXRhYmxlKSB7CisgIG9zdHJpbmdzdHJlYW0gZnVuY19hcmdzOworCisgIGlmIChzZWxmX2lzX211dGFibGUpIHsKKyAgICBmdW5jX2FyZ3MgPDwgIigmbXV0IHNlbGYiOworICB9IGVsc2UgeworICAgIGZ1bmNfYXJncyA8PCAiKCZzZWxmIjsKKyAgfQorCisgIGlmIChoYXNfYXJncyh0ZnVuYykpIHsKKyAgICBmdW5jX2FyZ3MgPDwgIiwgIjsgLy8gcHV0IGNvbW1hIGFmdGVyICJzZWxmIgorICAgIGZ1bmNfYXJncyA8PCBzdHJ1Y3RfdG9fZGVjbGFyYXRpb24odGZ1bmMtPmdldF9hcmdsaXN0KCksIFRfQVJHUyk7CisgIH0KKworICBmdW5jX2FyZ3MgPDwgIikiOworICByZXR1cm4gZnVuY19hcmdzLnN0cigpOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnJ1c3Rfc3luY19zZXJ2aWNlX2NhbGxfaW52b2NhdGlvbih0X2Z1bmN0aW9uKiB0ZnVuYywgY29uc3Qgc3RyaW5nJiBmaWVsZF9wcmVmaXgpIHsKKyAgb3N0cmluZ3N0cmVhbSBmdW5jX2FyZ3M7CisgIGZ1bmNfYXJncyA8PCAiKCI7CisKKyAgaWYgKGhhc19hcmdzKHRmdW5jKSkgeworICAgIGZ1bmNfYXJncyA8PCBzdHJ1Y3RfdG9faW52b2NhdGlvbih0ZnVuYy0+Z2V0X2FyZ2xpc3QoKSwgZmllbGRfcHJlZml4KTsKKyAgfQorCisgIGZ1bmNfYXJncyA8PCAiKSI7CisgIHJldHVybiBmdW5jX2FyZ3Muc3RyKCk7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6c3RydWN0X3RvX2RlY2xhcmF0aW9uKHRfc3RydWN0KiB0c3RydWN0LCB0X3JzX2dlbmVyYXRvcjo6ZV9zdHJ1Y3RfdHlwZSBzdHJ1Y3RfdHlwZSkgeworICBvc3RyaW5nc3RyZWFtIGFyZ3M7CisKKyAgYm9vbCBmaXJzdF9hcmcgPSB0cnVlOworICBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4gZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHN0ZDo6dmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgZmllbGRfaXRlcjsKKyAgZm9yIChmaWVsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZpZWxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZpZWxkX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiB0ZmllbGQgPSAoKmZpZWxkX2l0ZXIpOworICAgIHRfZmllbGQ6OmVfcmVxIGZpZWxkX3JlcSA9IGFjdHVhbF9maWVsZF9yZXEodGZpZWxkLCBzdHJ1Y3RfdHlwZSk7CisgICAgc3RyaW5nIHJ1c3RfdHlwZSA9IHRvX3J1c3RfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOworICAgIHJ1c3RfdHlwZSA9IGlzX29wdGlvbmFsKGZpZWxkX3JlcSkgPyAiT3B0aW9uPCIgKyBydXN0X3R5cGUgKyAiPiIgOiBydXN0X3R5cGU7CisKKyAgICBpZiAoZmlyc3RfYXJnKSB7CisgICAgICBmaXJzdF9hcmcgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgYXJncyA8PCAiLCAiOworICAgIH0KKworICAgIGFyZ3MgPDwgcnVzdF9maWVsZF9uYW1lKHRmaWVsZCkgPDwgIjogIiA8PCBydXN0X3R5cGU7CisgIH0KKworICByZXR1cm4gYXJncy5zdHIoKTsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpzdHJ1Y3RfdG9faW52b2NhdGlvbih0X3N0cnVjdCogdHN0cnVjdCwgY29uc3Qgc3RyaW5nJiBmaWVsZF9wcmVmaXgpIHsKKyAgb3N0cmluZ3N0cmVhbSBhcmdzOworCisgIGJvb2wgZmlyc3RfYXJnID0gdHJ1ZTsKKyAgc3RkOjp2ZWN0b3I8dF9maWVsZCo+IGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIGZpZWxkX2l0ZXI7CisgIGZvciAoZmllbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmaWVsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmaWVsZF9pdGVyKSB7CisgICAgdF9maWVsZCogdGZpZWxkID0gKCpmaWVsZF9pdGVyKTsKKworICAgIGlmIChmaXJzdF9hcmcpIHsKKyAgICAgIGZpcnN0X2FyZyA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBhcmdzIDw8ICIsICI7CisgICAgfQorCisgICAgYXJncyA8PCBmaWVsZF9wcmVmaXggPDwgcnVzdF9maWVsZF9uYW1lKHRmaWVsZCk7CisgIH0KKworICByZXR1cm4gYXJncy5zdHIoKTsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3NlcnZpY2VfY2FsbF9hcmdzX3N0cnVjdCh0X2Z1bmN0aW9uKiB0ZnVuYykgeworICAgIHN0cmluZyBhcmdzX3N0cnVjdF9uYW1lKHNlcnZpY2VfY2FsbF9hcmdzX3N0cnVjdF9uYW1lKHRmdW5jKSk7CisgICAgcmVuZGVyX3N0cnVjdChhcmdzX3N0cnVjdF9uYW1lLCB0ZnVuYy0+Z2V0X2FyZ2xpc3QoKSwgdF9yc19nZW5lcmF0b3I6OlRfQVJHUyk7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zZXJ2aWNlX2NhbGxfcmVzdWx0X3ZhbHVlX3N0cnVjdCh0X2Z1bmN0aW9uKiB0ZnVuYykgeworICBzdHJpbmcgcmVzdWx0X3N0cnVjdF9uYW1lID0gc2VydmljZV9jYWxsX3Jlc3VsdF9zdHJ1Y3RfbmFtZSh0ZnVuYyk7CisgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgcmVzdWx0X3N0cnVjdF9uYW1lKTsKKworICB0X2ZpZWxkIHJldHVybl92YWx1ZSh0ZnVuYy0+Z2V0X3JldHVybnR5cGUoKSwgU0VSVklDRV9SRVNVTFRfVkFSSUFCTEUsIDApOworICByZXR1cm5fdmFsdWUuc2V0X3JlcSh0X2ZpZWxkOjpUX09QVElPTkFMKTsKKyAgaWYgKCF0ZnVuYy0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgcmVzdWx0LmFwcGVuZCgmcmV0dXJuX3ZhbHVlKTsKKyAgfQorCisgIHRfc3RydWN0KiBleGNlcHRpb25zID0gdGZ1bmMtPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZXhjZXB0aW9uX3R5cGVzID0gZXhjZXB0aW9ucy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZXhjZXB0aW9uX2l0ZXI7CisgIGZvcihleGNlcHRpb25faXRlciA9IGV4Y2VwdGlvbl90eXBlcy5iZWdpbigpOyBleGNlcHRpb25faXRlciAhPSBleGNlcHRpb25fdHlwZXMuZW5kKCk7ICsrZXhjZXB0aW9uX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiBleGNlcHRpb25fdHlwZSA9ICpleGNlcHRpb25faXRlcjsKKyAgICBleGNlcHRpb25fdHlwZS0+c2V0X3JlcSh0X2ZpZWxkOjpUX09QVElPTkFMKTsKKyAgICByZXN1bHQuYXBwZW5kKGV4Y2VwdGlvbl90eXBlKTsKKyAgfQorCisgIHJlbmRlcl9zdHJ1Y3QocmVzdWx0X3N0cnVjdF9uYW1lLCAmcmVzdWx0LCB0X3JzX2dlbmVyYXRvcjo6VF9SRVNVTFQpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gU3luYyBQcm9jZXNzb3IKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX3Byb2Nlc3Nvcih0X3NlcnZpY2UgKnRzZXJ2aWNlKSB7CisgIHJlbmRlcl90eXBlX2NvbW1lbnQodHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiIHNlcnZpY2UgcHJvY2Vzc29yIik7IC8vIG5vdGU6IHVzZSAqb3JpZ2luYWwqIG5hbWUKKyAgcmVuZGVyX3N5bmNfaGFuZGxlcl90cmFpdCh0c2VydmljZSk7CisgIHJlbmRlcl9zeW5jX3Byb2Nlc3Nvcl9kZWZpbml0aW9uX2FuZF9pbXBsKHRzZXJ2aWNlKTsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N5bmNfaGFuZGxlcl90cmFpdCh0X3NlcnZpY2UgKnRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbnNpb24gPSAiIjsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICB0X3NlcnZpY2UqIGV4dGVuZHMgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKyAgICBleHRlbnNpb24gPSAiIDogIiArIHJ1c3RfbmFtZXNwYWNlKGV4dGVuZHMpICsgcnVzdF9zeW5jX2hhbmRsZXJfdHJhaXRfbmFtZShleHRlbmRzKTsKKyAgfQorCisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICBzdGQ6OnZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZ1bmNfaXRlcjsKKworICByZW5kZXJfcnVzdGRvYygodF9kb2MqKSB0c2VydmljZSk7CisgIGZfZ2VuXyA8PCAicHViIHRyYWl0ICIgPDwgcnVzdF9zeW5jX2hhbmRsZXJfdHJhaXRfbmFtZSh0c2VydmljZSkgPDwgZXh0ZW5zaW9uIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZvcihmdW5jX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZnVuY19pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmdW5jX2l0ZXIpIHsKKyAgICB0X2Z1bmN0aW9uKiB0ZnVuYyA9ICgqZnVuY19pdGVyKTsKKyAgICBzdHJpbmcgZnVuY19uYW1lID0gc2VydmljZV9jYWxsX2hhbmRsZXJfZnVuY3Rpb25fbmFtZSh0ZnVuYyk7CisgICAgc3RyaW5nIGZ1bmNfYXJncyA9IHJ1c3Rfc3luY19zZXJ2aWNlX2NhbGxfZGVjbGFyYXRpb24odGZ1bmMsIGZhbHNlKTsKKyAgICBzdHJpbmcgZnVuY19yZXR1cm4gPSB0b19ydXN0X3R5cGUodGZ1bmMtPmdldF9yZXR1cm50eXBlKCkpOworICAgIHJlbmRlcl9ydXN0ZG9jKCh0X2RvYyopIHRmdW5jKTsKKyAgICBmX2dlbl8KKyAgICAgIDw8IGluZGVudCgpCisgICAgICA8PCAiZm4gIgorICAgICAgPDwgZnVuY19uYW1lIDw8ICBmdW5jX2FyZ3MKKyAgICAgIDw8ICIgLT4gdGhyaWZ0OjpSZXN1bHQ8IiA8PCBmdW5jX3JldHVybiA8PCAiPjsiCisgICAgICA8PCBlbmRsOworICB9CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX3Byb2Nlc3Nvcl9kZWZpbml0aW9uX2FuZF9pbXBsKHRfc2VydmljZSAqdHNlcnZpY2UpIHsKKyAgc3RyaW5nIHNlcnZpY2VfcHJvY2Vzc29yX25hbWUgPSBydXN0X3N5bmNfcHJvY2Vzc29yX25hbWUodHNlcnZpY2UpOworICBzdHJpbmcgaGFuZGxlcl90cmFpdF9uYW1lID0gcnVzdF9zeW5jX2hhbmRsZXJfdHJhaXRfbmFtZSh0c2VydmljZSk7CisKKyAgLy8gc3RydWN0CisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgInB1YiBzdHJ1Y3QgIiA8PCBzZXJ2aWNlX3Byb2Nlc3Nvcl9uYW1lCisgICAgPDwgIjxIOiAiIDw8IGhhbmRsZXJfdHJhaXRfbmFtZQorICAgIDw8ICI+IHsiCisgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiaGFuZGxlcjogSCwiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7CisKKyAgLy8gZGVsZWdhdGluZyBpbXBsCisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgImltcGwgPEg6ICIgPDwgaGFuZGxlcl90cmFpdF9uYW1lIDw8ICI+ICIKKyAgICA8PCBzZXJ2aWNlX3Byb2Nlc3Nvcl9uYW1lCisgICAgPDwgIjxIPiB7IgorICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInB1YiBmbiBuZXcoaGFuZGxlcjogSCkgLT4gIiA8PCBzZXJ2aWNlX3Byb2Nlc3Nvcl9uYW1lIDw8ICI8SD4geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCBzZXJ2aWNlX3Byb2Nlc3Nvcl9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiaGFuZGxlciwiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICByZW5kZXJfc3luY19wcm9jZXNzX2RlbGVnYXRpb25fZnVuY3Rpb25zKHRzZXJ2aWNlKTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKKworICAvLyBhY3R1YWwgaW1wbAorICBzdHJpbmcgc2VydmljZV9hY3R1YWxfcHJvY2Vzc29yX25hbWUgPSBydXN0X3N5bmNfcHJvY2Vzc29yX2ltcGxfbmFtZSh0c2VydmljZSk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAicHViIHN0cnVjdCAiIDw8IHNlcnZpY2VfYWN0dWFsX3Byb2Nlc3Nvcl9uYW1lIDw8ICI7IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJpbXBsICIgPDwgc2VydmljZV9hY3R1YWxfcHJvY2Vzc29yX25hbWUgPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZ1bmNfaXRlcjsKKyAgZm9yKGZ1bmNfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmdW5jX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2Z1bmNfaXRlcikgeworICAgIHRfZnVuY3Rpb24qIHRmdW5jID0gKCpmdW5jX2l0ZXIpOworICAgIHJlbmRlcl9zeW5jX3Byb2Nlc3NfZnVuY3Rpb24odGZ1bmMsIGhhbmRsZXJfdHJhaXRfbmFtZSk7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworCisgIC8vIHByb2Nlc3NvciBpbXBsCisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgImltcGwgPEg6ICIKKyAgICA8PCBoYW5kbGVyX3RyYWl0X25hbWUgPDwgIj4gVFByb2Nlc3NvciBmb3IgIgorICAgIDw8IHNlcnZpY2VfcHJvY2Vzc29yX25hbWUKKyAgICA8PCAiPEg+IHsiCisgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAiZm4gcHJvY2Vzcygmc2VsZiwgaV9wcm90OiAmbXV0IFRJbnB1dFByb3RvY29sLCBvX3Byb3Q6ICZtdXQgVE91dHB1dFByb3RvY29sKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geyIKKyAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCBtZXNzYWdlX2lkZW50ID0gaV9wcm90LnJlYWRfbWVzc2FnZV9iZWdpbigpPzsiIDw8IGVuZGw7CisKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgcmVzID0gbWF0Y2ggJiptZXNzYWdlX2lkZW50Lm5hbWUgeyIgPDwgZW5kbDsgLy8gW3NpZ2hdIGV4cGxpY2l0IGRlcmVmIGNvZXJjaW9uCisgIGluZGVudF91cCgpOworICByZW5kZXJfcHJvY2Vzc19tYXRjaF9zdGF0ZW1lbnRzKHRzZXJ2aWNlKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJtZXRob2QgPT4geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHJlbmRlcl90aHJpZnRfZXJyb3IoCisgICAgIkFwcGxpY2F0aW9uIiwKKyAgICAiQXBwbGljYXRpb25FcnJvciIsCisgICAgIkFwcGxpY2F0aW9uRXJyb3JLaW5kOjpVbmtub3duTWV0aG9kIiwKKyAgICAiZm9ybWF0IShcInVua25vd24gbWV0aG9kIHt9XCIsIG1ldGhvZCkiCisgICk7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSwiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ0aHJpZnQ6OnNlcnZlcjo6aGFuZGxlX3Byb2Nlc3NfcmVzdWx0KCZtZXNzYWdlX2lkZW50LCByZXMsIG9fcHJvdCkiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX3Byb2Nlc3NfZGVsZWdhdGlvbl9mdW5jdGlvbnModF9zZXJ2aWNlICp0c2VydmljZSkgeworICBzdHJpbmcgYWN0dWFsX3Byb2Nlc3NvcihydXN0X25hbWVzcGFjZSh0c2VydmljZSkgKyBydXN0X3N5bmNfcHJvY2Vzc29yX2ltcGxfbmFtZSh0c2VydmljZSkpOworCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZnVuY19pdGVyOworICBmb3IoZnVuY19pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZ1bmNfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZnVuY19pdGVyKSB7CisgICAgdF9mdW5jdGlvbiogdGZ1bmMgPSAoKmZ1bmNfaXRlcik7CisgICAgc3RyaW5nIGZ1bmN0aW9uX25hbWUoInByb2Nlc3NfIiArIHJ1c3Rfc25ha2VfY2FzZSh0ZnVuYy0+Z2V0X25hbWUoKSkpOworICAgIGZfZ2VuXworICAgICAgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJmbiAiIDw8IGZ1bmN0aW9uX25hbWUKKyAgICAgIDw8ICIoJnNlbGYsICIKKyAgICAgIDw8ICJpbmNvbWluZ19zZXF1ZW5jZV9udW1iZXI6IGkzMiwgIgorICAgICAgPDwgImlfcHJvdDogJm11dCBUSW5wdXRQcm90b2NvbCwgIgorICAgICAgPDwgIm9fcHJvdDogJm11dCBUT3V0cHV0UHJvdG9jb2wpICIKKyAgICAgIDw8ICItPiB0aHJpZnQ6OlJlc3VsdDwoKT4geyIKKyAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBmX2dlbl8KKyAgICAgIDw8IGluZGVudCgpCisgICAgICA8PCBhY3R1YWxfcHJvY2Vzc29yCisgICAgICA8PCAiOjoiIDw8IGZ1bmN0aW9uX25hbWUKKyAgICAgIDw8ICIoIgorICAgICAgPDwgIiZzZWxmLmhhbmRsZXIsICIKKyAgICAgIDw8ICJpbmNvbWluZ19zZXF1ZW5jZV9udW1iZXIsICIKKyAgICAgIDw8ICJpX3Byb3QsICIKKyAgICAgIDw8ICJvX3Byb3QiCisgICAgICA8PCAiKSIKKyAgICAgIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfQorCisgIHRfc2VydmljZSogZXh0ZW5kcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICBpZiAoZXh0ZW5kcykgeworICAgIHJlbmRlcl9zeW5jX3Byb2Nlc3NfZGVsZWdhdGlvbl9mdW5jdGlvbnMoZXh0ZW5kcyk7CisgIH0KK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3Byb2Nlc3NfbWF0Y2hfc3RhdGVtZW50cyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZnVuY19pdGVyOworICBmb3IoZnVuY19pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZ1bmNfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZnVuY19pdGVyKSB7CisgICAgdF9mdW5jdGlvbiogdGZ1bmMgPSAoKmZ1bmNfaXRlcik7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJcIiIgPDwgdGZ1bmMtPmdldF9uYW1lKCkgPDwgIlwiIiA8PCAiID0+IHsiIDw8IGVuZGw7IC8vIG5vdGU6IHVzZSAqb3JpZ2luYWwqIG5hbWUKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX2dlbl8KKyAgICAgIDw8IGluZGVudCgpCisgICAgICA8PCAic2VsZi5wcm9jZXNzXyIgPDwgcnVzdF9zbmFrZV9jYXNlKHRmdW5jLT5nZXRfbmFtZSgpKQorICAgICAgPDwgIihtZXNzYWdlX2lkZW50LnNlcXVlbmNlX251bWJlciwgaV9wcm90LCBvX3Byb3QpIgorICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSwiIDw8IGVuZGw7CisgIH0KKworICB0X3NlcnZpY2UqIGV4dGVuZHMgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKKyAgaWYgKGV4dGVuZHMpIHsKKyAgICByZW5kZXJfcHJvY2Vzc19tYXRjaF9zdGF0ZW1lbnRzKGV4dGVuZHMpOworICB9Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX3Byb2Nlc3NfZnVuY3Rpb24odF9mdW5jdGlvbiAqdGZ1bmMsIGNvbnN0IHN0cmluZyAmaGFuZGxlcl90eXBlKSB7CisgIHN0cmluZyBzZXF1ZW5jZV9udW1iZXJfcGFyYW0oImluY29taW5nX3NlcXVlbmNlX251bWJlciIpOworICBzdHJpbmcgb3V0cHV0X3Byb3RvY29sX3BhcmFtKCJvX3Byb3QiKTsKKworICBpZiAodGZ1bmMtPmlzX29uZXdheSgpKSB7CisgICAgc2VxdWVuY2VfbnVtYmVyX3BhcmFtID0gIl8iOworICAgIG91dHB1dF9wcm90b2NvbF9wYXJhbSA9ICJfIjsKKyAgfQorCisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgInB1YiBmbiBwcm9jZXNzXyIgPDwgcnVzdF9zbmFrZV9jYXNlKHRmdW5jLT5nZXRfbmFtZSgpKQorICAgIDw8ICI8SDogIiA8PCBoYW5kbGVyX3R5cGUgPDwgIj4iCisgICAgPDwgIihoYW5kbGVyOiAmSCwgIgorICAgIDw8IHNlcXVlbmNlX251bWJlcl9wYXJhbSA8PCAiOiBpMzIsICIKKyAgICA8PCAiaV9wcm90OiAmbXV0IFRJbnB1dFByb3RvY29sLCAiCisgICAgPDwgb3V0cHV0X3Byb3RvY29sX3BhcmFtIDw8ICI6ICZtdXQgVE91dHB1dFByb3RvY29sKSAiCisgICAgPDwgIi0+IHRocmlmdDo6UmVzdWx0PCgpPiB7IgorICAgIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gKmFsd2F5cyogcmVhZCBhcmd1bWVudHMgZnJvbSB0aGUgaW5wdXQgcHJvdG9jb2wKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAibGV0ICIKKyAgICA8PCAoaGFzX25vbl92b2lkX2FyZ3ModGZ1bmMpID8gImFyZ3MiIDogIl8iKQorICAgIDw8ICIgPSAiCisgICAgPDwgc2VydmljZV9jYWxsX2FyZ3Nfc3RydWN0X25hbWUodGZ1bmMpCisgICAgPDwgIjo6cmVhZF9mcm9tX2luX3Byb3RvY29sKGlfcHJvdCk/OyIKKyAgICA8PCBlbmRsOworCisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgIm1hdGNoIGhhbmRsZXIuIgorICAgIDw8IHNlcnZpY2VfY2FsbF9oYW5kbGVyX2Z1bmN0aW9uX25hbWUodGZ1bmMpCisgICAgPDwgcnVzdF9zeW5jX3NlcnZpY2VfY2FsbF9pbnZvY2F0aW9uKHRmdW5jLCAiYXJncy4iKQorICAgIDw8ICIgeyIKKyAgICA8PCBlbmRsOyAvLyBzdGFydCBtYXRjaAorICBpbmRlbnRfdXAoKTsKKworICAvLyBoYW5kbGVyIHN1Y2NlZWRlZAorICBzdHJpbmcgaGFuZGxlcl9yZXR1cm5fdmFyaWFibGUgPSB0ZnVuYy0+aXNfb25ld2F5KCkgfHwgdGZ1bmMtPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSA/ICJfIiA6ICJoYW5kbGVyX3JldHVybiI7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiT2soIiA8PCBoYW5kbGVyX3JldHVybl92YXJpYWJsZSA8PCAiKSA9PiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgcmVuZGVyX3N5bmNfaGFuZGxlcl9zdWNjZWVkZWQodGZ1bmMpOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0sIiA8PCBlbmRsOworICAvLyBoYW5kbGVyIGZhaWxlZAorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIkVycihlKSA9PiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgcmVuZGVyX3N5bmNfaGFuZGxlcl9mYWlsZWQodGZ1bmMpOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0sIiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsgLy8gZW5kIG1hdGNoCisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOyAvLyBlbmQgZnVuY3Rpb24KK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N5bmNfaGFuZGxlcl9zdWNjZWVkZWQodF9mdW5jdGlvbiAqdGZ1bmMpIHsKKyAgaWYgKHRmdW5jLT5pc19vbmV3YXkoKSkgeworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiT2soKCkpIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfZ2VuXworICAgICAgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJsZXQgbWVzc2FnZV9pZGVudCA9IFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KCIKKyAgICAgIDw8ICJcIiIgPDwgdGZ1bmMtPmdldF9uYW1lKCkgPDwgIlwiLCAiIC8vIG5vdGU6IHVzZSAqb3JpZ2luYWwqIG5hbWUKKyAgICAgIDw8ICJUTWVzc2FnZVR5cGU6OlJlcGx5LCAiCisgICAgICA8PCAiaW5jb21pbmdfc2VxdWVuY2VfbnVtYmVyKTsiCisgICAgICA8PCBlbmRsOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oJm1lc3NhZ2VfaWRlbnQpPzsiIDw8IGVuZGw7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgcmV0ID0gIiA8PCBoYW5kbGVyX3N1Y2Nlc3NmdWxfcmV0dXJuX3N0cnVjdCh0ZnVuYykgPDwiOyIgPDwgZW5kbDsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInJldC53cml0ZV90b19vdXRfcHJvdG9jb2wob19wcm90KT87IiA8PCBlbmRsOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX21lc3NhZ2VfZW5kKCk/OyIgPDwgZW5kbDsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC5mbHVzaCgpIiA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX2hhbmRsZXJfZmFpbGVkKHRfZnVuY3Rpb24gKnRmdW5jKSB7CisgIHN0cmluZyBlcnJfdmFyKCJlIik7CisKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJtYXRjaCAiIDw8IGVycl92YXIgPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICAvLyBpZiB0aGVyZSBhcmUgYW55IHVzZXItZGVmaW5lZCBleGNlcHRpb25zIGZvciB0aGlzIHNlcnZpY2UgY2FsbCBoYW5kbGUgdGhlbSBmaXJzdAorICBpZiAodGZ1bmMtPmdldF94Y2VwdGlvbnMoKSAhPSBOVUxMICYmIHRmdW5jLT5nZXRfeGNlcHRpb25zKCktPmdldF9zb3J0ZWRfbWVtYmVycygpLnNpemUoKSA+IDApIHsKKyAgICBzdHJpbmcgdXNlcl9lcnJfdmFyKCJ1c3JfZXJyIik7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ0aHJpZnQ6OkVycm9yOjpVc2VyKCIgPDwgdXNlcl9lcnJfdmFyIDw8ICIpID0+IHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgcmVuZGVyX3N5bmNfaGFuZGxlcl9mYWlsZWRfdXNlcl9leGNlcHRpb25fYnJhbmNoKHRmdW5jKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSwiIDw8IGVuZGw7CisgIH0KKworICAvLyBhcHBsaWNhdGlvbiBlcnJvcgorICBzdHJpbmcgYXBwX2Vycl92YXIoImFwcF9lcnIiKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ0aHJpZnQ6OkVycm9yOjpBcHBsaWNhdGlvbigiIDw8IGFwcF9lcnJfdmFyIDw8ICIpID0+IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICByZW5kZXJfc3luY19oYW5kbGVyX2ZhaWxlZF9hcHBsaWNhdGlvbl9leGNlcHRpb25fYnJhbmNoKHRmdW5jLCBhcHBfZXJyX3Zhcik7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSwiIDw8IGVuZGw7CisKKyAgLy8gZGVmYXVsdCBjYXNlCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiXyA9PiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgcmVuZGVyX3N5bmNfaGFuZGxlcl9mYWlsZWRfZGVmYXVsdF9leGNlcHRpb25fYnJhbmNoKHRmdW5jKTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9LCIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX2hhbmRsZXJfZmFpbGVkX3VzZXJfZXhjZXB0aW9uX2JyYW5jaCh0X2Z1bmN0aW9uICp0ZnVuYykgeworICBpZiAodGZ1bmMtPmdldF94Y2VwdGlvbnMoKSA9PSBOVUxMIHx8IHRmdW5jLT5nZXRfeGNlcHRpb25zKCktPmdldF9zb3J0ZWRfbWVtYmVycygpLmVtcHR5KCkpIHsKKyAgICB0aHJvdyAiY2Fubm90IHJlbmRlciB1c2VyIGV4Y2VwdGlvbiBicmFuY2hlcyBpZiBubyB1c2VyIGV4Y2VwdGlvbnMgZGVmaW5lZCI7CisgIH0KKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+IHR4Y2VwdGlvbnMgPSB0ZnVuYy0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeGNlcHRpb25faXRlcjsKKyAgaW50IGJyYW5jaGVzX3JlbmRlcmVkID0gMDsKKworICAvLyBydW4gdGhyb3VnaCBhbGwgdXNlci1kZWZpbmVkIGV4Y2VwdGlvbnMKKyAgZm9yICh4Y2VwdGlvbl9pdGVyID0gdHhjZXB0aW9ucy5iZWdpbigpOyB4Y2VwdGlvbl9pdGVyICE9IHR4Y2VwdGlvbnMuZW5kKCk7ICsreGNlcHRpb25faXRlcikgeworICAgIHRfZmllbGQqIHhjZXB0aW9uX2ZpZWxkID0gKCp4Y2VwdGlvbl9pdGVyKTsKKworICAgIHN0cmluZyBpZl9zdGF0ZW1lbnQoYnJhbmNoZXNfcmVuZGVyZWQgPT0gMCA/ICJpZiB1c3JfZXJyIiA6ICJ9IGVsc2UgaWYgdXNyX2VyciIpOworICAgIHN0cmluZyBleGNlcHRpb25fdHlwZSh0b19ydXN0X3R5cGUoeGNlcHRpb25fZmllbGQtPmdldF90eXBlKCkpKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgaWZfc3RhdGVtZW50IDw8ICIuZG93bmNhc3RfcmVmOjo8IiA8PCBleGNlcHRpb25fdHlwZSA8PCAiPigpLmlzX3NvbWUoKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgZl9nZW5fCisgICAgICA8PCBpbmRlbnQoKQorICAgICAgPDwgImxldCBlcnIgPSB1c3JfZXJyLmRvd25jYXN0Ojo8IiA8PCBleGNlcHRpb25fdHlwZSA8PCAiPigpLmV4cGVjdChcImRvd25jYXN0IGFscmVhZHkgY2hlY2tlZFwiKTsiCisgICAgICA8PCBlbmRsOworCisgICAgLy8gcmVuZGVyIHRoZSBtZW1iZXJzIG9mIHRoZSByZXR1cm4gc3RydWN0CisgICAgb3N0cmluZ3N0cmVhbSBtZW1iZXJzOworCisgICAgYm9vbCBoYXNfcmVzdWx0X3ZhcmlhYmxlID0gISh0ZnVuYy0+aXNfb25ld2F5KCkgfHwgdGZ1bmMtPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSk7CisgICAgaWYgKGhhc19yZXN1bHRfdmFyaWFibGUpIHsKKyAgICAgIG1lbWJlcnMgPDwgU0VSVklDRV9SRVNVTFRfVkFSSUFCTEUgPDwgIjogTm9uZSwgIjsKKyAgICB9CisKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4Y2VwdGlvbl9tZW1iZXJzX2l0ZXI7CisgICAgZm9yKHhjZXB0aW9uX21lbWJlcnNfaXRlciA9IHR4Y2VwdGlvbnMuYmVnaW4oKTsgeGNlcHRpb25fbWVtYmVyc19pdGVyICE9IHR4Y2VwdGlvbnMuZW5kKCk7ICsreGNlcHRpb25fbWVtYmVyc19pdGVyKSB7CisgICAgICB0X2ZpZWxkKiBtZW1iZXIgPSAoKnhjZXB0aW9uX21lbWJlcnNfaXRlcik7CisgICAgICBzdHJpbmcgbWVtYmVyX25hbWUocnVzdF9maWVsZF9uYW1lKG1lbWJlcikpOworICAgICAgaWYgKG1lbWJlciA9PSB4Y2VwdGlvbl9maWVsZCkgeworICAgICAgICBtZW1iZXJzIDw8IG1lbWJlcl9uYW1lIDw8ICI6IFNvbWUoKmVyciksICI7CisgICAgICB9IGVsc2UgeworICAgICAgICBtZW1iZXJzIDw8IG1lbWJlcl9uYW1lIDw8ICI6IE5vbmUsICI7CisgICAgICB9CisgICAgfQorCisgICAgc3RyaW5nIG1lbWJlcl9zdHJpbmcgPSBtZW1iZXJzLnN0cigpOworICAgIG1lbWJlcl9zdHJpbmcucmVwbGFjZShtZW1iZXJfc3RyaW5nLnNpemUoKSAtIDIsIDIsICIgIik7IC8vIHRyaW0gdHJhaWxpbmcgY29tbWEKKworICAgIC8vIG5vdyB3cml0ZSBvdXQgdGhlIHJldHVybiBzdHJ1Y3QKKyAgICBmX2dlbl8KKyAgICAgIDw8IGluZGVudCgpCisgICAgICA8PCAibGV0IHJldF9lcnIgPSAiCisgICAgICA8PCBzZXJ2aWNlX2NhbGxfcmVzdWx0X3N0cnVjdF9uYW1lKHRmdW5jKQorICAgICAgPDwgInsgIiA8PCBtZW1iZXJfc3RyaW5nIDw8ICJ9OyIKKyAgICAgIDw8IGVuZGw7CisKKyAgICBmX2dlbl8KKyAgICAgIDw8IGluZGVudCgpCisgICAgICA8PCAibGV0IG1lc3NhZ2VfaWRlbnQgPSAiCisgICAgICA8PCAiVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoIgorICAgICAgPDwgIlwiIiA8PCB0ZnVuYy0+Z2V0X25hbWUoKSA8PCAiXCIsICIgLy8gbm90ZTogdXNlICpvcmlnaW5hbCogbmFtZQorICAgICAgPDwgIlRNZXNzYWdlVHlwZTo6UmVwbHksICIKKyAgICAgIDw8ICJpbmNvbWluZ19zZXF1ZW5jZV9udW1iZXIpOyIKKyAgICAgIDw8IGVuZGw7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfbWVzc2FnZV9iZWdpbigmbWVzc2FnZV9pZGVudCk/OyIgPDwgZW5kbDsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInJldF9lcnIud3JpdGVfdG9fb3V0X3Byb3RvY29sKG9fcHJvdCk/OyIgPDwgZW5kbDsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9tZXNzYWdlX2VuZCgpPzsiIDw8IGVuZGw7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3QuZmx1c2goKSIgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisKKyAgICBicmFuY2hlc19yZW5kZXJlZCsrOworICB9CisKKyAgLy8gdGhlIGNhdGNoIGFsbCwgaWYgc29tZWhvdyBpdCB3YXMgYSB1c2VyIGV4Y2VwdGlvbiB0aGF0IHdlIGRvbid0IHN1cHBvcnQKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gRklYTUU6IHNhbWUgYXMgZGVmYXVsdCBibG9jayBiZWxvdworCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IHJldF9lcnIgPSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgcmVuZGVyX3RocmlmdF9lcnJvcl9zdHJ1Y3QoIkFwcGxpY2F0aW9uRXJyb3IiLCAiQXBwbGljYXRpb25FcnJvcktpbmQ6OlVua25vd24iLCAidXNyX2Vyci5kZXNjcmlwdGlvbigpIik7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifTsiIDw8IGVuZGw7CisgIHJlbmRlcl9zeW5jX2hhbmRsZXJfc2VuZF9leGNlcHRpb25fcmVzcG9uc2UodGZ1bmMsICJyZXRfZXJyIik7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3luY19oYW5kbGVyX2ZhaWxlZF9hcHBsaWNhdGlvbl9leGNlcHRpb25fYnJhbmNoKAorICAgIHRfZnVuY3Rpb24gKnRmdW5jLAorICAgIGNvbnN0IHN0cmluZyAmYXBwX2Vycl92YXIKKykgeworICBpZiAodGZ1bmMtPmlzX29uZXdheSgpKSB7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJFcnIodGhyaWZ0OjpFcnJvcjo6QXBwbGljYXRpb24oIiA8PCBhcHBfZXJyX3ZhciA8PCAiKSkiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgcmVuZGVyX3N5bmNfaGFuZGxlcl9zZW5kX2V4Y2VwdGlvbl9yZXNwb25zZSh0ZnVuYywgYXBwX2Vycl92YXIpOworICB9Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX2hhbmRsZXJfZmFpbGVkX2RlZmF1bHRfZXhjZXB0aW9uX2JyYW5jaCh0X2Z1bmN0aW9uICp0ZnVuYykgeworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCByZXRfZXJyID0geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHJlbmRlcl90aHJpZnRfZXJyb3Jfc3RydWN0KCJBcHBsaWNhdGlvbkVycm9yIiwgIkFwcGxpY2F0aW9uRXJyb3JLaW5kOjpVbmtub3duIiwgImUuZGVzY3JpcHRpb24oKSIpOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn07IiA8PCBlbmRsOworICBpZiAodGZ1bmMtPmlzX29uZXdheSgpKSB7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJFcnIodGhyaWZ0OjpFcnJvcjo6QXBwbGljYXRpb24ocmV0X2VycikpIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHJlbmRlcl9zeW5jX2hhbmRsZXJfc2VuZF9leGNlcHRpb25fcmVzcG9uc2UodGZ1bmMsICJyZXRfZXJyIik7CisgIH0KK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N5bmNfaGFuZGxlcl9zZW5kX2V4Y2VwdGlvbl9yZXNwb25zZSh0X2Z1bmN0aW9uICp0ZnVuYywgY29uc3Qgc3RyaW5nICZlcnJfdmFyKSB7CisgIGZfZ2VuXworICAgICAgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJsZXQgbWVzc2FnZV9pZGVudCA9IFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KCIKKyAgICAgIDw8ICJcIiIgPDwgdGZ1bmMtPmdldF9uYW1lKCkgPDwgIlwiLCAiIC8vIG5vdGU6IHVzZSAqb3JpZ2luYWwqIG5hbWUKKyAgICAgIDw8ICJUTWVzc2FnZVR5cGU6OkV4Y2VwdGlvbiwgIgorICAgICAgPDwgImluY29taW5nX3NlcXVlbmNlX251bWJlcik7IgorICAgICAgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfbWVzc2FnZV9iZWdpbigmbWVzc2FnZV9pZGVudCk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ0aHJpZnQ6OkVycm9yOjp3cml0ZV9hcHBsaWNhdGlvbl9lcnJvcl90b19vdXRfcHJvdG9jb2woJiIgPDwgZXJyX3ZhciA8PCAiLCBvX3Byb3QpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX21lc3NhZ2VfZW5kKCk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3QuZmx1c2goKSIgPDwgZW5kbDsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpoYW5kbGVyX3N1Y2Nlc3NmdWxfcmV0dXJuX3N0cnVjdCh0X2Z1bmN0aW9uKiB0ZnVuYykgeworICBpbnQgbWVtYmVyX2NvdW50ID0gMDsKKyAgb3N0cmluZ3N0cmVhbSByZXR1cm5fc3RydWN0OworCisgIHJldHVybl9zdHJ1Y3QgPDwgc2VydmljZV9jYWxsX3Jlc3VsdF9zdHJ1Y3RfbmFtZSh0ZnVuYykgPDwgIiB7ICI7CisKKyAgLy8gYWN0dWFsIHJldHVybgorICBpZiAoIXRmdW5jLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICByZXR1cm5fc3RydWN0IDw8ICJyZXN1bHRfdmFsdWU6IFNvbWUoaGFuZGxlcl9yZXR1cm4pIjsKKyAgICBtZW1iZXJfY291bnQrKzsKKyAgfQorCisgIC8vIGFueSB1c2VyLWRlZmluZWQgZXhjZXB0aW9ucworICBpZiAodGZ1bmMtPmdldF94Y2VwdGlvbnMoKSAhPSBOVUxMKSB7CisgICAgdF9zdHJ1Y3QqIHR4Y2VwdGlvbnMgPSB0ZnVuYy0+Z2V0X3hjZXB0aW9ucygpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4gbWVtYmVycyA9IHR4Y2VwdGlvbnMtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1lbWJlcnNfaXRlcjsKKyAgICBmb3IgKG1lbWJlcnNfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbWVtYmVyc19pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbWVtYmVyc19pdGVyKSB7CisgICAgICB0X2ZpZWxkKiB4Y2VwdGlvbl9maWVsZCA9ICgqbWVtYmVyc19pdGVyKTsKKyAgICAgIGlmIChtZW1iZXJfY291bnQgPiAwKSB7IHJldHVybl9zdHJ1Y3QgPDwgIiwgIjsgfQorICAgICAgcmV0dXJuX3N0cnVjdCA8PCBydXN0X2ZpZWxkX25hbWUoeGNlcHRpb25fZmllbGQpIDw8ICI6IE5vbmUiOworICAgICAgbWVtYmVyX2NvdW50Kys7CisgICAgfQorICB9CisKKyAgcmV0dXJuX3N0cnVjdCA8PCAiIH0iOworCisgIHJldHVybiAgcmV0dXJuX3N0cnVjdC5zdHIoKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFV0aWxpdHkKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl90eXBlX2NvbW1lbnQoY29uc3Qgc3RyaW5nJiB0eXBlX25hbWUpIHsKKyAgZl9nZW5fIDw8ICIvLyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICIvLyAiIDw8IHR5cGVfbmFtZSA8PCBlbmRsOworICBmX2dlbl8gPDwgIi8vIiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKK30KKworLy8gTk9URTogZG8gKm5vdCogcHV0IGluIGFuIGV4dHJhIG5ld2xpbmUgYWZ0ZXIgZG9jIGlzIGdlbmVyYXRlZC4KKy8vIFRoaXMgaXMgYmVjYXVzZSBydXN0IGRvY3MgaGF2ZSB0byBhYnV0IHRoZSBsaW5lIHRoZXkncmUgZG9jdW1lbnRpbmcuCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfcnVzdGRvYyh0X2RvYyogdGRvYykgeworICBpZiAoIXRkb2MtPmhhc19kb2MoKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KGZfZ2VuXywgIiIsICIvLy8gIiwgdGRvYy0+Z2V0X2RvYygpLCAiIik7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl90aHJpZnRfZXJyb3IoCisgIGNvbnN0IHN0cmluZyYgZXJyb3Jfa2luZCwKKyAgY29uc3Qgc3RyaW5nJiBlcnJvcl9zdHJ1Y3QsCisgIGNvbnN0IHN0cmluZyYgc3ViX2Vycm9yX2tpbmQsCisgIGNvbnN0IHN0cmluZyYgZXJyb3JfbWVzc2FnZQorKSB7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiRXJyKCIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAidGhyaWZ0OjpFcnJvcjo6IiA8PCBlcnJvcl9raW5kIDw8ICIoIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgcmVuZGVyX3RocmlmdF9lcnJvcl9zdHJ1Y3QoZXJyb3Jfc3RydWN0LCBzdWJfZXJyb3Jfa2luZCwgZXJyb3JfbWVzc2FnZSk7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiKSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICIpIiA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfdGhyaWZ0X2Vycm9yX3N0cnVjdCgKKyAgY29uc3Qgc3RyaW5nJiBlcnJvcl9zdHJ1Y3QsCisgIGNvbnN0IHN0cmluZyYgc3ViX2Vycm9yX2tpbmQsCisgIGNvbnN0IHN0cmluZyYgZXJyb3JfbWVzc2FnZQorKSB7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCBlcnJvcl9zdHJ1Y3QgPDwgIjo6bmV3KCIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCBzdWJfZXJyb3Jfa2luZCA8PCAiLCIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8IGVycm9yX21lc3NhZ2UgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICIpIiA8PCBlbmRsOworfQorCitib29sIHRfcnNfZ2VuZXJhdG9yOjppc19kb3VibGUodF90eXBlKiB0dHlwZSkgeworICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBpZiAodGJhc2UgPT0gdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6dG9fcnVzdF90eXBlKHRfdHlwZSogdHR5cGUsIGJvb2wgb3JkZXJlZF9mbG9hdCkgeworICAvLyB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOyA8LS0gcmVjdXJzZXMgdGhyb3VnaCBhcyBtYW55IHR5cGVkZWYgbGF5ZXJzIGFzIG5lY2Vzc2FyeQorICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGUqIHRiYXNlX3R5cGUgPSAoKHRfYmFzZV90eXBlKil0dHlwZSk7CisgICAgc3dpdGNoICh0YmFzZV90eXBlLT5nZXRfYmFzZSgpKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgcmV0dXJuICIoKSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBpZiAodGJhc2VfdHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgcmV0dXJuICJWZWM8dTg+IjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAiU3RyaW5nIjsKKyAgICAgIH0KKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gImJvb2wiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICByZXR1cm4gImk4IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiaTE2IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiaTMyIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiaTY0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmIChvcmRlcmVkX2Zsb2F0KSB7CisgICAgICAgIHJldHVybiAiT3JkZXJlZEZsb2F0PGY2ND4iOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuICJmNjQiOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgdF90eXBlZGVmKiB0dHlwZWRlZiA9ICh0X3R5cGVkZWYqKXR0eXBlOworICAgIHN0cmluZyBydXN0X3R5cGUgPSBydXN0X25hbWVzcGFjZSh0dHlwZSkgKyB0dHlwZWRlZi0+Z2V0X3N5bWJvbGljKCk7CisgICAgcnVzdF90eXBlID0gIHR0eXBlZGVmLT5pc19mb3J3YXJkX3R5cGVkZWYoKSA/ICJCb3g8IiArIHJ1c3RfdHlwZSArICI+IiA6IHJ1c3RfdHlwZTsKKyAgICByZXR1cm4gcnVzdF90eXBlOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gcnVzdF9uYW1lc3BhY2UodHR5cGUpICsgcnVzdF9jYW1lbF9jYXNlKHR0eXBlLT5nZXRfbmFtZSgpKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gcnVzdF9uYW1lc3BhY2UodHR5cGUpICsgcnVzdF9jYW1lbF9jYXNlKHR0eXBlLT5nZXRfbmFtZSgpKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X21hcCogdG1hcCA9ICh0X21hcCopdHR5cGU7CisgICAgcmV0dXJuICJCVHJlZU1hcDwiICsgdG9fcnVzdF90eXBlKHRtYXAtPmdldF9rZXlfdHlwZSgpKSArICIsICIgKyB0b19ydXN0X3R5cGUodG1hcC0+Z2V0X3ZhbF90eXBlKCkpICsgIj4iOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHRfc2V0KiB0c2V0ID0gKHRfc2V0Kil0dHlwZTsKKyAgICByZXR1cm4gIkJUcmVlU2V0PCIgKyB0b19ydXN0X3R5cGUodHNldC0+Z2V0X2VsZW1fdHlwZSgpKSArICI+IjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgdF9saXN0KiB0bGlzdCA9ICh0X2xpc3QqKXR0eXBlOworICAgIHJldHVybiAiVmVjPCIgKyB0b19ydXN0X3R5cGUodGxpc3QtPmdldF9lbGVtX3R5cGUoKSkgKyAiPiI7CisgIH0KKworICB0aHJvdyAiY2Fubm90IGZpbmQgcnVzdCB0eXBlIGZvciAiICsgdHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6dG9fcnVzdF9jb25zdF90eXBlKHRfdHlwZSogdHR5cGUsIGJvb2wgb3JkZXJlZF9mbG9hdCkgeworICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGUqIHRiYXNlX3R5cGUgPSAoKHRfYmFzZV90eXBlKil0dHlwZSk7CisgICAgaWYgKHRiYXNlX3R5cGUtPmdldF9iYXNlKCkgPT0gdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HKSB7CisgICAgICBpZiAodGJhc2VfdHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgcmV0dXJuICImW3U4XSI7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gIiZzdHIiOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJldHVybiB0b19ydXN0X3R5cGUodHR5cGUsIG9yZGVyZWRfZmxvYXQpOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnRvX3J1c3RfZmllbGRfdHlwZV9lbnVtKHRfdHlwZSogdHR5cGUpIHsKKyAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJ3aWxsIG5vdCBnZW5lcmF0ZSBwcm90b2NvbDo6VFR5cGUgZm9yIFRZUEVfVk9JRCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6IC8vIGJvdGggc3RyaW5ncyBhbmQgYmluYXJ5IGFyZSBhY3R1YWxseSBlbmNvZGVkIGFzIFRUeXBlOjpTdHJpbmcKKyAgICAgIHJldHVybiAiVFR5cGU6OlN0cmluZyI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJUVHlwZTo6Qm9vbCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiVFR5cGU6OkkwOCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIlRUeXBlOjpJMTYiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJUVHlwZTo6STMyIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiVFR5cGU6Okk2NCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIlRUeXBlOjpEb3VibGUiOworICAgIH0KKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJUVHlwZTo6STMyIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlOjpTdHJ1Y3QiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiVFR5cGU6Ok1hcCI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJUVHlwZTo6U2V0IjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICJUVHlwZTo6TGlzdCI7CisgIH0KKworICB0aHJvdyAiY2Fubm90IGZpbmQgVFR5cGUgZm9yICIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpvcHRfaW5fcmVxX291dF92YWx1ZSh0X3R5cGUqIHR0eXBlKSB7CisgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZSogdGJhc2VfdHlwZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKTsKKyAgICBzd2l0Y2ggKHRiYXNlX3R5cGUtPmdldF9iYXNlKCkpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiY2Fubm90IGdlbmVyYXRlIE9QVF9JTl9SRVFfT1VUIHZhbHVlIGZvciB2b2lkIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIGlmICh0YmFzZV90eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICByZXR1cm4gIlNvbWUoVmVjOjpuZXcoKSkiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuICJTb21lKFwiXCIudG9fb3duZWQoKSkiOworICAgICAgfQorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiU29tZShmYWxzZSkiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlNvbWUoMCkiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJTb21lKE9yZGVyZWRGbG9hdDo6ZnJvbSgwLjApKSI7CisgICAgfQorCisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSB8fCB0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gIk5vbmUiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIlNvbWUoVmVjOjpuZXcoKSkiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHJldHVybiAiU29tZShCVHJlZVNldDo6bmV3KCkpIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gIlNvbWUoQlRyZWVNYXA6Om5ldygpKSI7CisgIH0KKworICB0aHJvdyAiY2Fubm90IGdlbmVyYXRlIG9wdC1pbi1yZXEtb3V0IHZhbHVlIGZvciB0eXBlICIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKK30KKworYm9vbCB0X3JzX2dlbmVyYXRvcjo6Y2FuX2dlbmVyYXRlX3NpbXBsZV9jb25zdCh0X3R5cGUqIHR0eXBlKSB7CisgIHRfdHlwZSogYWN0dWFsX3R5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKyAgaWYgKGFjdHVhbF90eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlKiB0YmFzZV90eXBlID0gKHRfYmFzZV90eXBlKilhY3R1YWxfdHlwZTsKKyAgICByZXR1cm4gISh0YmFzZV90eXBlLT5nZXRfYmFzZSgpID09IHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRSk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK2Jvb2wgdF9yc19nZW5lcmF0b3I6OmNhbl9nZW5lcmF0ZV9jb25zdF9ob2xkZXIodF90eXBlKiB0dHlwZSkgeworICB0X3R5cGUqIGFjdHVhbF90eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisgIHJldHVybiAhY2FuX2dlbmVyYXRlX3NpbXBsZV9jb25zdChhY3R1YWxfdHlwZSkgJiYgIWFjdHVhbF90eXBlLT5pc19zZXJ2aWNlKCk7Cit9CisKK2Jvb2wgdF9yc19nZW5lcmF0b3I6OmlzX3ZvaWQodF90eXBlKiB0dHlwZSkgeworICByZXR1cm4gdHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOworfQorCitib29sIHRfcnNfZ2VuZXJhdG9yOjppc19vcHRpb25hbCh0X2ZpZWxkOjplX3JlcSByZXEpIHsKKyAgcmV0dXJuIHJlcSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMIHx8IHJlcSA9PSB0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUOworfQorCit0X2ZpZWxkOjplX3JlcSB0X3JzX2dlbmVyYXRvcjo6YWN0dWFsX2ZpZWxkX3JlcSh0X2ZpZWxkKiB0ZmllbGQsIHRfcnNfZ2VuZXJhdG9yOjplX3N0cnVjdF90eXBlIHN0cnVjdF90eXBlKSB7CisgIHJldHVybiBzdHJ1Y3RfdHlwZSA9PSB0X3JzX2dlbmVyYXRvcjo6VF9BUkdTID8gdF9maWVsZDo6VF9SRVFVSVJFRCA6IHRmaWVsZC0+Z2V0X3JlcSgpOworfQorCitib29sIHRfcnNfZ2VuZXJhdG9yOjpoYXNfYXJncyh0X2Z1bmN0aW9uKiB0ZnVuYykgeworICByZXR1cm4gdGZ1bmMtPmdldF9hcmdsaXN0KCkgIT0gTlVMTCAmJiAhdGZ1bmMtPmdldF9hcmdsaXN0KCktPmdldF9zb3J0ZWRfbWVtYmVycygpLmVtcHR5KCk7Cit9CisKK2Jvb2wgdF9yc19nZW5lcmF0b3I6Omhhc19ub25fdm9pZF9hcmdzKHRfZnVuY3Rpb24qIHRmdW5jKSB7CisgIGJvb2wgaGFzX25vbl92b2lkX2FyZ3MgPSBmYWxzZTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+IGFyZ3MgPSB0ZnVuYy0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGFyZ3NfaXRlcjsKKyAgZm9yIChhcmdzX2l0ZXIgPSBhcmdzLmJlZ2luKCk7IGFyZ3NfaXRlciAhPSBhcmdzLmVuZCgpOyArK2FyZ3NfaXRlcikgeworICAgIHRfZmllbGQqIHRmaWVsZCA9ICgqYXJnc19pdGVyKTsKKyAgICBpZiAoIXRmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICBoYXNfbm9uX3ZvaWRfYXJncyA9IHRydWU7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICByZXR1cm4gaGFzX25vbl92b2lkX2FyZ3M7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6dmlzaWJpbGl0eV9xdWFsaWZpZXIodF9yc19nZW5lcmF0b3I6OmVfc3RydWN0X3R5cGUgc3RydWN0X3R5cGUpIHsKKyAgc3dpdGNoKHN0cnVjdF90eXBlKSB7CisgIGNhc2UgdF9yc19nZW5lcmF0b3I6OlRfQVJHUzoKKyAgY2FzZSB0X3JzX2dlbmVyYXRvcjo6VF9SRVNVTFQ6CisgICAgcmV0dXJuICIiOworICBkZWZhdWx0OgorICAgIHJldHVybiAicHViICI7CisgIH0KK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpydXN0X25hbWVzcGFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIGlmICh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKSAhPSBnZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpKSB7CisgICAgcmV0dXJuIHJ1c3Rfc25ha2VfY2FzZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKSkgKyAiOjoiOworICB9IGVsc2UgeworICAgIHJldHVybiAiIjsKKyAgfQorfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnJ1c3RfbmFtZXNwYWNlKHRfdHlwZSogdHR5cGUpIHsKKyAgaWYgKHR0eXBlLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpICE9IGdldF9wcm9ncmFtKCktPmdldF9uYW1lKCkpIHsKKyAgICByZXR1cm4gcnVzdF9zbmFrZV9jYXNlKHR0eXBlLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpKSArICI6OiI7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuICIiOworICB9Cit9CisKK2Jvb2wgdF9yc19nZW5lcmF0b3I6OmlzX3Jlc2VydmVkKGNvbnN0IHN0cmluZyYgbmFtZSkgeworICByZXR1cm4gUlVTVF9SRVNFUlZFRF9XT1JEU19TRVQuZmluZChuYW1lKSAhPSBSVVNUX1JFU0VSVkVEX1dPUkRTX1NFVC5lbmQoKTsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpydXN0X3N0cnVjdF9uYW1lKHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyBiYXNlX3N0cnVjdF9uYW1lKHJ1c3RfY2FtZWxfY2FzZSh0c3RydWN0LT5nZXRfbmFtZSgpKSk7CisgIHJldHVybiBydXN0X3NhZmVfbmFtZShiYXNlX3N0cnVjdF9uYW1lKTsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpydXN0X2ZpZWxkX25hbWUodF9maWVsZCogdGZpZWxkKSB7CisgIHN0cmluZyBiYXNlX2ZpZWxkX25hbWUocnVzdF9zbmFrZV9jYXNlKHRmaWVsZC0+Z2V0X25hbWUoKSkpOworICByZXR1cm4gcnVzdF9zYWZlX25hbWUoYmFzZV9maWVsZF9uYW1lKTsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpydXN0X3VuaW9uX2ZpZWxkX25hbWUodF9maWVsZCogdGZpZWxkKSB7CisgIHN0cmluZyBiYXNlX2ZpZWxkX25hbWUocnVzdF9jYW1lbF9jYXNlKHRmaWVsZC0+Z2V0X25hbWUoKSkpOworICByZXR1cm4gcnVzdF9zYWZlX25hbWUoYmFzZV9maWVsZF9uYW1lKTsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpydXN0X3NhZmVfbmFtZShjb25zdCBzdHJpbmcmIG5hbWUpIHsKKyAgaWYgKGlzX3Jlc2VydmVkKG5hbWUpKSB7CisgICAgcmV0dXJuIG5hbWUgKyAiXyI7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIG5hbWU7CisgIH0KK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpzZXJ2aWNlX2NhbGxfY2xpZW50X2Z1bmN0aW9uX25hbWUodF9mdW5jdGlvbiogdGZ1bmMpIHsKKyAgcmV0dXJuIHJ1c3Rfc25ha2VfY2FzZSh0ZnVuYy0+Z2V0X25hbWUoKSk7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6c2VydmljZV9jYWxsX2hhbmRsZXJfZnVuY3Rpb25fbmFtZSh0X2Z1bmN0aW9uKiB0ZnVuYykgeworICByZXR1cm4gImhhbmRsZV8iICsgcnVzdF9zbmFrZV9jYXNlKHRmdW5jLT5nZXRfbmFtZSgpKTsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpzZXJ2aWNlX2NhbGxfYXJnc19zdHJ1Y3RfbmFtZSh0X2Z1bmN0aW9uKiB0ZnVuYykgeworICAvLyBUaHJpZnQgYXV0b21hdGljYWxseSBhcHBlbmRzIGBBcmdzYCB0byB0aGUgYXJnbGlzdCBuYW1lLiBObyBuZWVkIHRvIGRvIGl0IGhlcmUuCisgIHJldHVybiBydXN0X2NhbWVsX2Nhc2Uoc2VydmljZV9uYW1lXykgKyBydXN0X2NhbWVsX2Nhc2UodGZ1bmMtPmdldF9hcmdsaXN0KCktPmdldF9uYW1lKCkpOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnNlcnZpY2VfY2FsbF9yZXN1bHRfc3RydWN0X25hbWUodF9mdW5jdGlvbiogdGZ1bmMpIHsKKyAgcmV0dXJuIHJ1c3RfY2FtZWxfY2FzZShzZXJ2aWNlX25hbWVfKSArIHJ1c3RfY2FtZWxfY2FzZSh0ZnVuYy0+Z2V0X25hbWUoKSkgKyBSRVNVTFRfU1RSVUNUX1NVRkZJWDsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpydXN0X3N5bmNfY2xpZW50X21hcmtlcl90cmFpdF9uYW1lKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgcmV0dXJuICJUIiArIHJ1c3RfY2FtZWxfY2FzZSh0c2VydmljZS0+Z2V0X25hbWUoKSkgKyAiU3luY0NsaWVudE1hcmtlciI7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6cnVzdF9zeW5jX2NsaWVudF90cmFpdF9uYW1lKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgcmV0dXJuICJUIiArIHJ1c3RfY2FtZWxfY2FzZSh0c2VydmljZS0+Z2V0X25hbWUoKSkgKyAiU3luY0NsaWVudCI7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6cnVzdF9zeW5jX2NsaWVudF9pbXBsX25hbWUodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICByZXR1cm4gcnVzdF9jYW1lbF9jYXNlKHRzZXJ2aWNlLT5nZXRfbmFtZSgpKSArICJTeW5jQ2xpZW50IjsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpydXN0X3N5bmNfaGFuZGxlcl90cmFpdF9uYW1lKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgcmV0dXJuIHJ1c3RfY2FtZWxfY2FzZSh0c2VydmljZS0+Z2V0X25hbWUoKSkgKyAiU3luY0hhbmRsZXIiOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnJ1c3Rfc3luY19wcm9jZXNzb3JfbmFtZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHJldHVybiBydXN0X2NhbWVsX2Nhc2UodHNlcnZpY2UtPmdldF9uYW1lKCkpICsgIlN5bmNQcm9jZXNzb3IiOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnJ1c3Rfc3luY19wcm9jZXNzb3JfaW1wbF9uYW1lKHRfc2VydmljZSAqdHNlcnZpY2UpIHsKKyAgcmV0dXJuICJUIiArIHJ1c3RfY2FtZWxfY2FzZSh0c2VydmljZS0+Z2V0X25hbWUoKSkgKyAiUHJvY2Vzc0Z1bmN0aW9ucyI7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6cnVzdF9lbnVtX3ZhcmlhbnRfbmFtZShjb25zdCBzdHJpbmcgJm5hbWUpIHsKKyAgYm9vbCBhbGxfdXBwZXJjYXNlID0gdHJ1ZTsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5hbWUuc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAoaXNhbG51bShuYW1lW2ldKSAmJiBpc2xvd2VyKG5hbWVbaV0pKSB7CisgICAgICBhbGxfdXBwZXJjYXNlID0gZmFsc2U7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBpZiAoYWxsX3VwcGVyY2FzZSkgeworICAgIHJldHVybiBjYXBpdGFsaXplKGNhbWVsY2FzZShsb3dlcmNhc2UobmFtZSkpKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gY2FwaXRhbGl6ZShjYW1lbGNhc2UobmFtZSkpOworICB9Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6cnVzdF91cHBlcl9jYXNlKGNvbnN0IHN0cmluZyYgbmFtZSkgeworICBzdHJpbmcgc3RyKHVwcGVyY2FzZSh1bmRlcnNjb3JlKG5hbWUpKSk7CisgIHN0cmluZ19yZXBsYWNlKHN0ciwgIl9fIiwgIl8iKTsKKyAgcmV0dXJuIHN0cjsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpydXN0X3NuYWtlX2Nhc2UoY29uc3Qgc3RyaW5nJiBuYW1lKSB7CisgIHN0cmluZyBzdHIoZGVjYXBpdGFsaXplKHVuZGVyc2NvcmUobmFtZSkpKTsKKyAgc3RyaW5nX3JlcGxhY2Uoc3RyLCAiX18iLCAiXyIpOworICByZXR1cm4gc3RyOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnJ1c3RfY2FtZWxfY2FzZShjb25zdCBzdHJpbmcmIG5hbWUpIHsKKyAgc3RyaW5nIHN0cihjYXBpdGFsaXplKGNhbWVsY2FzZShuYW1lKSkpOworICBzdHJpbmdfcmVwbGFjZShzdHIsICJfIiwgIiIpOworICByZXR1cm4gc3RyOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpzdHJpbmdfcmVwbGFjZShzdHJpbmcmIHRhcmdldCwgY29uc3Qgc3RyaW5nJiBzZWFyY2hfc3RyaW5nLCBjb25zdCBzdHJpbmcmIHJlcGxhY2Vfc3RyaW5nKSB7CisgIGlmICh0YXJnZXQuZW1wdHkoKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIHNpemVfdCBtYXRjaF9sZW4gPSBzZWFyY2hfc3RyaW5nLmxlbmd0aCgpOworICBzaXplX3QgcmVwbGFjZV9sZW4gPSByZXBsYWNlX3N0cmluZy5sZW5ndGgoKTsKKworICBzaXplX3Qgc2VhcmNoX2lkeCA9IDA7CisgIHNpemVfdCBtYXRjaF9pZHg7CisgIHdoaWxlICgobWF0Y2hfaWR4ID0gdGFyZ2V0LmZpbmQoc2VhcmNoX3N0cmluZywgc2VhcmNoX2lkeCkpICE9IHN0cmluZzo6bnBvcykgeworICAgIHRhcmdldC5yZXBsYWNlKG1hdGNoX2lkeCwgbWF0Y2hfbGVuLCByZXBsYWNlX3N0cmluZyk7CisgICAgc2VhcmNoX2lkeCA9IG1hdGNoX2lkeCArIHJlcGxhY2VfbGVuOworICB9Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoCisgIHJzLAorICAiUnVzdCIsCisgICJcbiIpIC8vIG5vIFJ1c3QtZ2VuZXJhdG9yLXNwZWNpZmljIG9wdGlvbnMKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3Rfc3RfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9zdF9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk1YTk0OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3Rfc3RfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsMTA1NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvdmVyc2lvbi5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9mc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCisKKy8qKgorICogU21hbGx0YWxrIGNvZGUgZ2VuZXJhdG9yLgorICoKKyAqLworY2xhc3MgdF9zdF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9zdF9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisgICAgdGVtcG9yYXJ5X3ZhciA9IDA7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIC8qIG5vIG9wdGlvbnMgeWV0ICovCisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gc3Q6IiArIGl0ZXItPmZpcnN0OworICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLXN0IjsKKyAgfQorCisgIC8qKgorICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCisgICAqLworCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICAvKioKKyAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9jbGFzc19zaWRlX2RlZmluaXRpb24oKTsKKyAgdm9pZCBnZW5lcmF0ZV9mb3JjZV9jb25zdHMoKTsKKworICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CisKKyAgLyoqCisgICAqIFN0cnVjdCBnZW5lcmF0aW9uIGNvZGUKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9zdF9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfYWNjZXNzb3JzKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgLyoqCisgICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICB2b2lkIGdlbmVyYXRlX3NlbmRfbWV0aG9kKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfcmVjdl9tZXRob2QodF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKworICBzdGQ6OnN0cmluZyBtYXBfcmVhZGVyKHRfbWFwKiB0bWFwKTsKKyAgc3RkOjpzdHJpbmcgbGlzdF9yZWFkZXIodF9saXN0KiB0bGlzdCk7CisgIHN0ZDo6c3RyaW5nIHNldF9yZWFkZXIodF9zZXQqIHRzZXQpOworICBzdGQ6OnN0cmluZyBzdHJ1Y3RfcmVhZGVyKHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBjbHNOYW1lKTsKKworICBzdGQ6OnN0cmluZyBtYXBfd3JpdGVyKHRfbWFwKiB0bWFwLCBzdGQ6OnN0cmluZyBuYW1lKTsKKyAgc3RkOjpzdHJpbmcgbGlzdF93cml0ZXIodF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgbmFtZSk7CisgIHN0ZDo6c3RyaW5nIHNldF93cml0ZXIodF9zZXQqIHRzZXQsIHN0ZDo6c3RyaW5nIG5hbWUpOworICBzdGQ6OnN0cmluZyBzdHJ1Y3Rfd3JpdGVyKHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBmbmFtZSk7CisKKyAgc3RkOjpzdHJpbmcgd3JpdGVfdmFsKHRfdHlwZSogdCwgc3RkOjpzdHJpbmcgZm5hbWUpOworICBzdGQ6OnN0cmluZyByZWFkX3ZhbCh0X3R5cGUqIHQpOworCisgIC8qKgorICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucworICAgKi8KKworICBzdGQ6OnN0cmluZyBzdF9hdXRvZ2VuX2NvbW1lbnQoKTsKKworICB2b2lkIHN0X2NsYXNzX2RlZihzdGQ6Om9zdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgbmFtZSk7CisgIHZvaWQgc3RfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBjbHMsIHN0ZDo6c3RyaW5nIG5hbWUpOworICB2b2lkIHN0X21ldGhvZChzdGQ6Om9zdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgY2xzLCBzdGQ6OnN0cmluZyBuYW1lLCBzdGQ6OnN0cmluZyBjYXRlZ29yeSk7CisgIHZvaWQgc3RfY2xvc2VfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0KTsKKyAgdm9pZCBzdF9jbGFzc19tZXRob2Qoc3RkOjpvc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIGNscywgc3RkOjpzdHJpbmcgbmFtZSk7CisgIHZvaWQgc3RfY2xhc3NfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBjbHMsIHN0ZDo6c3RyaW5nIG5hbWUsIHN0ZDo6c3RyaW5nIGNhdGVnb3J5KTsKKyAgdm9pZCBzdF9zZXR0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIGNscywgc3RkOjpzdHJpbmcgbmFtZSwgc3RkOjpzdHJpbmcgdHlwZSk7CisgIHZvaWQgc3RfZ2V0dGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBjbHMsIHN0ZDo6c3RyaW5nIG5hbWUpOworICB2b2lkIHN0X2FjY2Vzc29ycyhzdGQ6Om9zdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgY2xzLCBzdGQ6OnN0cmluZyBuYW1lLCBzdGQ6OnN0cmluZyB0eXBlKTsKKworICBzdGQ6OnN0cmluZyBjbGFzc19uYW1lKCk7CisgIHN0YXRpYyBib29sIGlzX3ZhbGlkX25hbWVzcGFjZShjb25zdCBzdGQ6OnN0cmluZyYgc3ViX25hbWVzcGFjZSk7CisgIHN0ZDo6c3RyaW5nIGNsaWVudF9jbGFzc19uYW1lKCk7CisgIHN0ZDo6c3RyaW5nIHByZWZpeChzdGQ6OnN0cmluZyBuYW1lKTsKKyAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQpOworICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSk7CisKKyAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl90eXBlc19jb21tZW50KHRfZnVuY3Rpb24qIGZuKTsKKworICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIGFfdHlwZSh0X3R5cGUqIHR5cGUpOworICBib29sIGlzX3Zvd2VsKGNoYXIgYyk7CisgIHN0ZDo6c3RyaW5nIHRlbXBfbmFtZSgpOworICBzdGQ6OnN0cmluZyBnZW5lcmF0ZWRfY2F0ZWdvcnkoKTsKKworcHJpdmF0ZToKKyAgLyoqCisgICAqIEZpbGUgc3RyZWFtcworICAgKi8KKyAgaW50IHRlbXBvcmFyeV92YXI7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl87Cit9OworCisvKioKKyAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0CisgKiBzdHJlYW1zLgorICoKKyAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQorICovCit2b2lkIHRfc3RfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5CisgIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7CisKKyAgdGVtcG9yYXJ5X3ZhciA9IDA7CisKKyAgLy8gTWFrZSBvdXRwdXQgZmlsZQorICBzdHJpbmcgZl9uYW1lID0gZ2V0X291dF9kaXIoKSArICIvIiArIHByb2dyYW1fbmFtZV8gKyAiLnN0IjsKKyAgZl8ub3BlbihmX25hbWUuY19zdHIoKSk7CisKKyAgLy8gUHJpbnQgaGVhZGVyCisgIGZfIDw8IHN0X2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7CisKKyAgc3RfY2xhc3NfZGVmKGZfLCBwcm9ncmFtX25hbWVfKTsKKyAgZ2VuZXJhdGVfY2xhc3Nfc2lkZV9kZWZpbml0aW9uKCk7CisKKyAgLy8gR2VuZXJhdGUgZW51bXMKKyAgdmVjdG9yPHRfZW51bSo+IGVudW1zID0gcHJvZ3JhbV8tPmdldF9lbnVtcygpOworICB2ZWN0b3I8dF9lbnVtKj46Oml0ZXJhdG9yIGVuX2l0ZXI7CisgIGZvciAoZW5faXRlciA9IGVudW1zLmJlZ2luKCk7IGVuX2l0ZXIgIT0gZW51bXMuZW5kKCk7ICsrZW5faXRlcikgeworICAgIGdlbmVyYXRlX2VudW0oKmVuX2l0ZXIpOworICB9Cit9CisKK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6Y2xhc3NfbmFtZSgpIHsKKyAgcmV0dXJuIGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXyk7Cit9CisKK2Jvb2wgdF9zdF9nZW5lcmF0b3I6OmlzX3ZhbGlkX25hbWVzcGFjZShjb25zdCBzdGQ6OnN0cmluZyYgc3ViX25hbWVzcGFjZSkgeworICByZXR1cm4gc3ViX25hbWVzcGFjZSA9PSAicHJlZml4IiB8fCBzdWJfbmFtZXNwYWNlID09ICJjYXRlZ29yeSI7Cit9CisKK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6cHJlZml4KHN0cmluZyBjbGFzc19uYW1lKSB7CisgIHN0cmluZyBwcmVmaXggPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgic21hbGx0YWxrLnByZWZpeCIpOworICBzdHJpbmcgbmFtZSA9IGNhcGl0YWxpemUoY2xhc3NfbmFtZSk7CisgIG5hbWUgPSBwcmVmaXguZW1wdHkoKSA/IG5hbWUgOiAocHJlZml4ICsgbmFtZSk7CisgIHJldHVybiBuYW1lOworfQorCitzdHJpbmcgdF9zdF9nZW5lcmF0b3I6OmNsaWVudF9jbGFzc19uYW1lKCkgeworICByZXR1cm4gY2FwaXRhbGl6ZShzZXJ2aWNlX25hbWVfKSArICJDbGllbnQiOworfQorCisvKioKKyAqIEF1dG9nZW4nZCBjb21tZW50CisgKi8KK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6c3RfYXV0b2dlbl9jb21tZW50KCkgeworICByZXR1cm4gc3RkOjpzdHJpbmcoIiciKSArICJBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoIiArIFRIUklGVF9WRVJTSU9OICsgIilcbiIgKyAiXG4iCisgICAgICAgICArICJETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HXG4iICsgIichXG4iOworfQorCit2b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mb3JjZV9jb25zdHMoKSB7CisgIGZfIDw8IHByZWZpeChjbGFzc19uYW1lKCkpIDw8ICIgZW51bXMga2V5c0FuZFZhbHVlc0RvOiBbOmsgOnYgfCAiIDw8IHByZWZpeChjbGFzc19uYW1lKCkpCisgICAgIDw8ICIgZW51bXMgYXQ6IGsgcHV0OiB2IHZhbHVlXS4hIiA8PCBlbmRsOworCisgIGZfIDw8IHByZWZpeChjbGFzc19uYW1lKCkpIDw8ICIgY29uc3RhbnRzIGtleXNBbmRWYWx1ZXNEbzogWzprIDp2IHwgIiA8PCBwcmVmaXgoY2xhc3NfbmFtZSgpKQorICAgICA8PCAiIGNvbnN0YW50cyBhdDogayBwdXQ6IHYgdmFsdWVdLiEiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKKyAgZ2VuZXJhdGVfZm9yY2VfY29uc3RzKCk7CisgIGZfLmNsb3NlKCk7Cit9CisKK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVkX2NhdGVnb3J5KCkgeworICBzdHJpbmcgY2F0ID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoInNtYWxsdGFsay5jYXRlZ29yeSIpOworICAvLyBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBUaHJpZnQgZ3JhbW1hciwgdGhlIGNhdGVnb3J5IG11c3QKKyAgLy8gYmUgcHVuY3R1YXRlZCBieSBkb3RzLiAgUmVwbGFjZXMgdGhlbSB3aXRoIGRhc2hlcyBoZXJlLgorICBmb3IgKHN0cmluZzo6aXRlcmF0b3IgaXRlciA9IGNhdC5iZWdpbigpOyBpdGVyICE9IGNhdC5lbmQoKTsgKytpdGVyKSB7CisgICAgaWYgKCppdGVyID09ICcuJykgeworICAgICAgKml0ZXIgPSAnLSc7CisgICAgfQorICB9CisgIHJldHVybiBjYXQuc2l6ZSgpID8gY2F0IDogIkdlbmVyYXRlZC0iICsgY2xhc3NfbmFtZSgpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gU21hbGx0YWxrLCB0eXBlcyBhcmUgYWxsIGltcGxpY2l0LgorICoKKyAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICAodm9pZCl0dHlwZWRlZjsKK30KKwordm9pZCB0X3N0X2dlbmVyYXRvcjo6c3RfY2xhc3NfZGVmKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSkgeworICBvdXQgPDwgIk9iamVjdCBzdWJjbGFzczogIyIgPDwgcHJlZml4KG5hbWUpIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgImluc3RhbmNlVmFyaWFibGVOYW1lczogJyciIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImNsYXNzVmFyaWFibGVOYW1lczogJyciCisgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJwb29sRGljdGlvbmFyaWVzOiAnJyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiY2F0ZWdvcnk6ICciCisgICAgICA8PCBnZW5lcmF0ZWRfY2F0ZWdvcnkoKSA8PCAiJyEiIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X3N0X2dlbmVyYXRvcjo6c3RfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdHJpbmcgY2xzLCBzdHJpbmcgbmFtZSkgeworICBzdF9tZXRob2Qob3V0LCBjbHMsIG5hbWUsICJhcyB5ZXQgdW5jYXRlZ29yaXplZCIpOworfQorCit2b2lkIHRfc3RfZ2VuZXJhdG9yOjpzdF9jbGFzc19tZXRob2Qoc3RkOjpvc3RyZWFtJiBvdXQsIHN0cmluZyBjbHMsIHN0cmluZyBuYW1lKSB7CisgIHN0X21ldGhvZChvdXQsIGNscyArICIgY2xhc3MiLCBuYW1lKTsKK30KKwordm9pZCB0X3N0X2dlbmVyYXRvcjo6c3RfY2xhc3NfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdHJpbmcgY2xzLCBzdHJpbmcgbmFtZSwgc3RyaW5nIGNhdGVnb3J5KSB7CisgIHN0X21ldGhvZChvdXQsIGNscywgbmFtZSwgY2F0ZWdvcnkpOworfQorCit2b2lkIHRfc3RfZ2VuZXJhdG9yOjpzdF9tZXRob2Qoc3RkOjpvc3RyZWFtJiBvdXQsIHN0cmluZyBjbHMsIHN0cmluZyBuYW1lLCBzdHJpbmcgY2F0ZWdvcnkpIHsKKyAgY2hhciB0aW1lc3RyWzUwXTsKKyAgdGltZV90IHJhd3RpbWU7CisgIHN0cnVjdCB0bSogdGluZm87CisKKyAgdGltZSgmcmF3dGltZSk7CisgIHRpbmZvID0gbG9jYWx0aW1lKCZyYXd0aW1lKTsKKyAgc3RyZnRpbWUodGltZXN0ciwgNTAsICIlbS8lZC8lWSAlSDolTSIsIHRpbmZvKTsKKworICBvdXQgPDwgIiEiIDw8IHByZWZpeChjbHMpIDw8ICIgbWV0aG9kc0ZvcjogJyIgKyBjYXRlZ29yeSArICInIHN0YW1wOiAndGhyaWZ0ICIgPDwgdGltZXN0cgorICAgICAgPDwgIichXG4iIDw8IG5hbWUgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKyAgb3V0IDw8IGluZGVudCgpOworfQorCit2b2lkIHRfc3RfZ2VuZXJhdG9yOjpzdF9jbG9zZV9tZXRob2Qoc3RkOjpvc3RyZWFtJiBvdXQpIHsKKyAgb3V0IDw8ICIhICEiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKK30KKwordm9pZCB0X3N0X2dlbmVyYXRvcjo6c3Rfc2V0dGVyKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHR5cGUgPSAiYW5PYmplY3QiKSB7CisgIHN0X21ldGhvZChvdXQsIGNscywgbmFtZSArICI6ICIgKyB0eXBlKTsKKyAgb3V0IDw8IG5hbWUgPDwgIiA6PSAiICsgdHlwZTsKKyAgc3RfY2xvc2VfbWV0aG9kKG91dCk7Cit9CisKK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OnN0X2dldHRlcihzdGQ6Om9zdHJlYW0mIG91dCwgc3RyaW5nIGNscywgc3RyaW5nIG5hbWUpIHsKKyAgc3RfbWV0aG9kKG91dCwgY2xzLCBuYW1lICsgIiIpOworICBvdXQgPDwgIl4gIiA8PCBuYW1lOworICBzdF9jbG9zZV9tZXRob2Qob3V0KTsKK30KKwordm9pZCB0X3N0X2dlbmVyYXRvcjo6c3RfYWNjZXNzb3JzKHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHR5cGUgPSAiYW5PYmplY3QiKSB7CisgIHN0X3NldHRlcihvdXQsIGNscywgbmFtZSwgdHlwZSk7CisgIHN0X2dldHRlcihvdXQsIGNscywgbmFtZSk7Cit9CisKK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NsYXNzX3NpZGVfZGVmaW5pdGlvbigpIHsKKyAgZl8gPDwgcHJlZml4KGNsYXNzX25hbWUoKSkgPDwgIiBjbGFzcyIgPDwgZW5kbCA8PCAiXHRpbnN0YW5jZVZhcmlhYmxlTmFtZXM6ICdjb25zdGFudHMgZW51bXMnISIKKyAgICAgPDwgZW5kbCA8PCBlbmRsOworCisgIHN0X2FjY2Vzc29ycyhmXywgY2xhc3NfbmFtZSgpICsgIiBjbGFzcyIsICJlbnVtcyIpOworICBzdF9hY2Nlc3NvcnMoZl8sIGNsYXNzX25hbWUoKSArICIgY2xhc3MiLCAiY29uc3RhbnRzIik7CisKKyAgZl8gPDwgcHJlZml4KGNsYXNzX25hbWUoKSkgPDwgIiBlbnVtczogRGljdGlvbmFyeSBuZXchIiA8PCBlbmRsOworICBmXyA8PCBwcmVmaXgoY2xhc3NfbmFtZSgpKSA8PCAiIGNvbnN0YW50czogRGljdGlvbmFyeSBuZXchIiA8PCBlbmRsOworCisgIGZfIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4gRG9uZSB1c2luZyBhIGNsYXNzIHRvIHNjb3BlCisgKiB0aGUgdmFsdWVzLgorICoKKyAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KKyAqLwordm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIHN0cmluZyBjbHNfbmFtZSA9IHByb2dyYW1fbmFtZV8gKyBjYXBpdGFsaXplKHRlbnVtLT5nZXRfbmFtZSgpKTsKKworICBmXyA8PCBwcmVmaXgoY2xhc3NfbmFtZSgpKSA8PCAiIGVudW1zIGF0OiAnIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiJyBwdXQ6IFsiCisgICAgIDw8ICIoRGljdGlvbmFyeSBuZXcgIiA8PCBlbmRsOworCisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworICAgIGZfIDw8ICJcdGF0OiAnIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIicgcHV0OiAiIDw8IHZhbHVlIDw8ICI7IiA8PCBlbmRsOworICB9CisKKyAgZl8gPDwgIlx0eW91cnNlbGYpXSEiIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZSBhIGNvbnN0YW50IHZhbHVlCisgKi8KK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgeworICB0X3R5cGUqIHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7CisgIHN0cmluZyBuYW1lID0gdGNvbnN0LT5nZXRfbmFtZSgpOworICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IHRjb25zdC0+Z2V0X3ZhbHVlKCk7CisKKyAgZl8gPDwgcHJlZml4KGNsYXNzX25hbWUoKSkgPDwgIiBjb25zdGFudHMgYXQ6ICciIDw8IG5hbWUgPDwgIicgcHV0OiBbIgorICAgICA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpIDw8ICJdISIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZworICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKKyAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCisgKi8KK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICBvdXQgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgb3V0IDw8ICh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDAgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgb3V0IDw8ICIoIiA8PCBjYXBpdGFsaXplKHR5cGUtPmdldF9uYW1lKCkpIDw8ICIgbmV3ICIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworCisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKKyAgICAgIH0KKworICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSA8PCAiOiAiCisgICAgICAgICAgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ5b3Vyc2VsZikiOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICBvdXQgPDwgIihEaWN0aW9uYXJ5IG5ldyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgaW5kZW50KCk7CisgICAgICBvdXQgPDwgImF0OiAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgdl9pdGVyLT5maXJzdCk7CisgICAgICBvdXQgPDwgIiBwdXQ6ICI7CisgICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBpbmRlbnQoKSA8PCBpbmRlbnQoKSA8PCAieW91cnNlbGYpIjsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudF9kb3duKCk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF90eXBlKiBldHlwZTsKKyAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0gZWxzZSB7CisgICAgICBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfQorICAgIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgICAgb3V0IDw8ICIoU2V0IG5ldyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICIoT3JkZXJlZENvbGxlY3Rpb24gbmV3IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBpbmRlbnQoKTsKKyAgICAgIG91dCA8PCAiYWRkOiAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlcik7CisgICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBpbmRlbnQoKSA8PCBpbmRlbnQoKSA8PCAieW91cnNlbGYpIjsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudF9kb3duKCk7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBDT05TVEFOVCBGT1IgVFlQRTogIiArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKyAgcmV0dXJuIG91dC5zdHIoKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBTbWFsbHRhbGsgc3RydWN0CisgKi8KK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9zdF9zdHJ1Y3QoZl8sIHRzdHJ1Y3QsIGZhbHNlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZXhjZXB0aW9uLiBCYXNpY2FsbHkgdGhlIHNhbWUKKyAqIGFzIGEgc3RydWN0IGJ1dCBleHRlbmRzIHRoZSBFeGNlcHRpb24gY2xhc3MuCisgKgorICogQHBhcmFtIHR4Y2VwdGlvbiBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqLwordm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgeworICBnZW5lcmF0ZV9zdF9zdHJ1Y3QoZl8sIHR4Y2VwdGlvbiwgdHJ1ZSk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc21hbGx0YWxrIGNsYXNzIHRvIHJlcHJlc2VudCBhIHN0cnVjdAorICovCit2b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdF9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24gPSBmYWxzZSkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGlmIChpc19leGNlcHRpb24pCisgICAgb3V0IDw8ICJFcnJvciI7CisgIGVsc2UKKyAgICBvdXQgPDwgIk9iamVjdCI7CisKKyAgb3V0IDw8ICIgc3ViY2xhc3M6ICMiIDw8IHByZWZpeCh0eXBlX25hbWUodHN0cnVjdCkpIDw8IGVuZGwgPDwgIlx0aW5zdGFuY2VWYXJpYWJsZU5hbWVzOiAnIjsKKworICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgaWYgKG1faXRlciAhPSBtZW1iZXJzLmJlZ2luKCkpCisgICAgICAgIG91dCA8PCAiICI7CisgICAgICBvdXQgPDwgY2FtZWxjYXNlKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgfQorICB9CisKKyAgb3V0IDw8ICInXG4iCisgICAgICA8PCAiXHRjbGFzc1ZhcmlhYmxlTmFtZXM6ICcnXG4iCisgICAgICA8PCAiXHRwb29sRGljdGlvbmFyaWVzOiAnJ1xuIgorICAgICAgPDwgIlx0Y2F0ZWdvcnk6ICciIDw8IGdlbmVyYXRlZF9jYXRlZ29yeSgpIDw8ICInIVxuXG4iOworCisgIGdlbmVyYXRlX2FjY2Vzc29ycyhvdXQsIHRzdHJ1Y3QpOworfQorCitib29sIHRfc3RfZ2VuZXJhdG9yOjppc192b3dlbChjaGFyIGMpIHsKKyAgc3dpdGNoICh0b2xvd2VyKGMpKSB7CisgIGNhc2UgJ2EnOgorICBjYXNlICdlJzoKKyAgY2FzZSAnaSc6CisgIGNhc2UgJ28nOgorICBjYXNlICd1JzoKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6YV90eXBlKHRfdHlwZSogdHlwZSkgeworICBzdHJpbmcgcHJlZml4OworCisgIGlmIChpc192b3dlbCh0eXBlX25hbWUodHlwZSlbMF0pKQorICAgIHByZWZpeCA9ICJhbiI7CisgIGVsc2UKKyAgICBwcmVmaXggPSAiYSI7CisKKyAgcmV0dXJuIHByZWZpeCArIGNhcGl0YWxpemUodHlwZV9uYW1lKHR5cGUpKTsKK30KKwordm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfYWNjZXNzb3JzKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworICBzdHJpbmcgdHlwZTsKKyAgc3RyaW5nIHByZWZpeDsKKworICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgc3RfYWNjZXNzb3JzKG91dCwKKyAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKHR5cGVfbmFtZSh0c3RydWN0KSksCisgICAgICAgICAgICAgICAgICAgY2FtZWxjYXNlKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSksCisgICAgICAgICAgICAgICAgICAgYV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkpOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7CisgIC8vIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRzZXJ2aWNlKTsKK30KKworc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjp0ZW1wX25hbWUoKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisgIG91dCA8PCAidGVtcCIgPDwgdGVtcG9yYXJ5X3ZhcisrOworICByZXR1cm4gb3V0LnN0cigpOworfQorCitzdHJpbmcgdF9zdF9nZW5lcmF0b3I6Om1hcF93cml0ZXIodF9tYXAqIHRtYXAsIHN0cmluZyBmbmFtZSkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OworICBzdHJpbmcga2V5ID0gdGVtcF9uYW1lKCk7CisgIHN0cmluZyB2YWwgPSB0ZW1wX25hbWUoKTsKKworICBvdXQgPDwgIltvcHJvdCB3cml0ZU1hcEJlZ2luOiAoVE1hcCBuZXcga2V5VHlwZTogIiA8PCB0eXBlX3RvX2VudW0odG1hcC0+Z2V0X2tleV90eXBlKCkpCisgICAgICA8PCAiOyB2YWx1ZVR5cGU6ICIgPDwgdHlwZV90b19lbnVtKHRtYXAtPmdldF92YWxfdHlwZSgpKSA8PCAiOyBzaXplOiAiIDw8IGZuYW1lIDw8ICIgc2l6ZSkuIgorICAgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8IGZuYW1lIDw8ICIga2V5c0FuZFZhbHVlc0RvOiBbOiIgPDwga2V5IDw8ICIgOiIgPDwgdmFsIDw8ICIgfCIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8IHdyaXRlX3ZhbCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KSA8PCAiLiIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgPDwgd3JpdGVfdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOworICBpbmRlbnRfZG93bigpOworCisgIG91dCA8PCAiXS4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90IHdyaXRlTWFwRW5kXSB2YWx1ZSI7CisgIGluZGVudF9kb3duKCk7CisKKyAgcmV0dXJuIG91dC5zdHIoKTsKK30KKworc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjptYXBfcmVhZGVyKHRfbWFwKiB0bWFwKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7CisgIHN0cmluZyBkZXNjID0gdGVtcF9uYW1lKCk7CisgIHN0cmluZyB2YWwgPSB0ZW1wX25hbWUoKTsKKworICBvdXQgPDwgIlt8IiA8PCBkZXNjIDw8ICIgIiA8PCB2YWwgPDwgInwgIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgZGVzYyA8PCAiIDo9IGlwcm90IHJlYWRNYXBCZWdpbi4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgdmFsCisgICAgICA8PCAiIDo9IERpY3Rpb25hcnkgbmV3LiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBkZXNjIDw8ICIgc2l6ZSB0aW1lc1JlcGVhdDogWyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8IHZhbCA8PCAiIGF0OiAiIDw8IHJlYWRfdmFsKHRtYXAtPmdldF9rZXlfdHlwZSgpKQorICAgICAgPDwgIiBwdXQ6ICIgPDwgcmVhZF92YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCkpOworICBpbmRlbnRfZG93bigpOworCisgIG91dCA8PCAiXS4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlwcm90IHJlYWRNYXBFbmQuIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHZhbCA8PCAiXSB2YWx1ZSI7CisgIGluZGVudF9kb3duKCk7CisKKyAgcmV0dXJuIG91dC5zdHIoKTsKK30KKworc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjpsaXN0X3dyaXRlcih0X2xpc3QqIHRsaXN0LCBzdHJpbmcgZm5hbWUpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKyAgc3RyaW5nIHZhbCA9IHRlbXBfbmFtZSgpOworCisgIG91dCA8PCAiW29wcm90IHdyaXRlTGlzdEJlZ2luOiAoVExpc3QgbmV3IGVsZW1UeXBlOiAiIDw8IHR5cGVfdG9fZW51bSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpKQorICAgICAgPDwgIjsgc2l6ZTogIiA8PCBmbmFtZSA8PCAiIHNpemUpLiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8IGZuYW1lIDw8ICIgZG86IFs6IiA8PCB2YWwgPDwgInwiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCB3cml0ZV92YWwodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgdmFsKSA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworCisgIG91dCA8PCAiXS4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90IHdyaXRlTGlzdEVuZF0gdmFsdWUiOworICBpbmRlbnRfZG93bigpOworCisgIHJldHVybiBvdXQuc3RyKCk7Cit9CisKK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6bGlzdF9yZWFkZXIodF9saXN0KiB0bGlzdCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OworICBzdHJpbmcgZGVzYyA9IHRlbXBfbmFtZSgpOworICBzdHJpbmcgdmFsID0gdGVtcF9uYW1lKCk7CisKKyAgb3V0IDw8ICJbfCIgPDwgZGVzYyA8PCAiICIgPDwgdmFsIDw8ICJ8ICIgPDwgZGVzYyA8PCAiIDo9IGlwcm90IHJlYWRMaXN0QmVnaW4uIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgdmFsIDw8ICIgOj0gT3JkZXJlZENvbGxlY3Rpb24gbmV3LiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBkZXNjCisgICAgICA8PCAiIHNpemUgdGltZXNSZXBlYXQ6IFsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCB2YWwgPDwgIiBhZGQ6ICIgPDwgcmVhZF92YWwodGxpc3QtPmdldF9lbGVtX3R5cGUoKSk7CisgIGluZGVudF9kb3duKCk7CisKKyAgb3V0IDw8ICJdLiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaXByb3QgcmVhZExpc3RFbmQuIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHZhbCA8PCAiXSB2YWx1ZSI7CisgIGluZGVudF9kb3duKCk7CisKKyAgcmV0dXJuIG91dC5zdHIoKTsKK30KKworc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjpzZXRfd3JpdGVyKHRfc2V0KiB0c2V0LCBzdHJpbmcgZm5hbWUpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKyAgc3RyaW5nIHZhbCA9IHRlbXBfbmFtZSgpOworCisgIG91dCA8PCAiW29wcm90IHdyaXRlU2V0QmVnaW46IChUU2V0IG5ldyBlbGVtVHlwZTogIiA8PCB0eXBlX3RvX2VudW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpKQorICAgICAgPDwgIjsgc2l6ZTogIiA8PCBmbmFtZSA8PCAiIHNpemUpLiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8IGZuYW1lIDw8ICIgZG86IFs6IiA8PCB2YWwgPDwgInwiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIG91dCA8PCBpbmRlbnQoKSA8PCB3cml0ZV92YWwodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCB2YWwpIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisKKyAgb3V0IDw8ICJdLiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qgd3JpdGVTZXRFbmRdIHZhbHVlIjsKKyAgaW5kZW50X2Rvd24oKTsKKworICByZXR1cm4gb3V0LnN0cigpOworfQorCitzdHJpbmcgdF9zdF9nZW5lcmF0b3I6OnNldF9yZWFkZXIodF9zZXQqIHRzZXQpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKyAgc3RyaW5nIGRlc2MgPSB0ZW1wX25hbWUoKTsKKyAgc3RyaW5nIHZhbCA9IHRlbXBfbmFtZSgpOworCisgIG91dCA8PCAiW3wiIDw8IGRlc2MgPDwgIiAiIDw8IHZhbCA8PCAifCAiIDw8IGRlc2MgPDwgIiA6PSBpcHJvdCByZWFkU2V0QmVnaW4uIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgdmFsIDw8ICIgOj0gU2V0IG5ldy4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgZGVzYyA8PCAiIHNpemUgdGltZXNSZXBlYXQ6IFsiCisgICAgICA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgdmFsIDw8ICIgYWRkOiAiIDw8IHJlYWRfdmFsKHRzZXQtPmdldF9lbGVtX3R5cGUoKSk7CisgIGluZGVudF9kb3duKCk7CisKKyAgb3V0IDw8ICJdLiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaXByb3QgcmVhZFNldEVuZC4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgdmFsIDw8ICJdIHZhbHVlIjsKKyAgaW5kZW50X2Rvd24oKTsKKworICByZXR1cm4gb3V0LnN0cigpOworfQorCitzdHJpbmcgdF9zdF9nZW5lcmF0b3I6OnN0cnVjdF93cml0ZXIodF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBzbmFtZSkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisKKyAgb3V0IDw8ICJbb3Byb3Qgd3JpdGVTdHJ1Y3RCZWdpbjogIgorICAgICAgPDwgIihUU3RydWN0IG5ldyBuYW1lOiAnIiArIHRzdHJ1Y3QtPmdldF9uYW1lKCkgKyAiJykuIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgIGJvb2wgb3B0aW9uYWwgPSAoKmZsZF9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7CisgICAgc3RyaW5nIGZuYW1lID0gY2FtZWxjYXNlKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICBzdHJpbmcgYWNjZXNzb3IgPSBzbmFtZSArICIgIiArIGNhbWVsY2FzZShmbmFtZSk7CisKKyAgICBpZiAob3B0aW9uYWwpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBhY2Nlc3NvciA8PCAiIGlmTm90TmlsOiBbIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdCB3cml0ZUZpZWxkQmVnaW46IChURmllbGQgbmV3IG5hbWU6ICciIDw8IGZuYW1lCisgICAgICAgIDw8ICInOyB0eXBlOiAiIDw8IHR5cGVfdG9fZW51bSgoKmZsZF9pdGVyKS0+Z2V0X3R5cGUoKSkKKyAgICAgICAgPDwgIjsgaWQ6ICIgPDwgKCpmbGRfaXRlciktPmdldF9rZXkoKSA8PCAiKS4iIDw8IGVuZGw7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgd3JpdGVfdmFsKCgqZmxkX2l0ZXIpLT5nZXRfdHlwZSgpLCBhY2Nlc3NvcikgPDwgIi4iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgPDwgIm9wcm90IHdyaXRlRmllbGRFbmQiOworCisgICAgaWYgKG9wdGlvbmFsKSB7CisgICAgICBvdXQgPDwgIl0iOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisKKyAgICBvdXQgPDwgIi4iIDw8IGVuZGw7CisgIH0KKworICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90IHdyaXRlRmllbGRTdG9wOyB3cml0ZVN0cnVjdEVuZF0gdmFsdWUiOworICBpbmRlbnRfZG93bigpOworCisgIHJldHVybiBvdXQuc3RyKCk7Cit9CisKK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6c3RydWN0X3JlYWRlcih0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIGNsc05hbWUgPSAiIikgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKyAgc3RyaW5nIHZhbCA9IHRlbXBfbmFtZSgpOworICBzdHJpbmcgZGVzYyA9IHRlbXBfbmFtZSgpOworICBzdHJpbmcgZm91bmQgPSB0ZW1wX25hbWUoKTsKKworICBpZiAoY2xzTmFtZS5zaXplKCkgPT0gMCkgeworICAgIGNsc05hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICB9CisKKyAgb3V0IDw8ICJbfCIgPDwgZGVzYyA8PCAiICIgPDwgdmFsIDw8ICJ8IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICAvLyBUaGlzIGlzIG5hc3R5LCBidXQgd2l0aG91dCBpdCB3ZSdsbCBicmVhayB0aGluZ3MgYnkgcHJlZml4aW5nIFRSZXN1bHQuCisgIHN0cmluZyBuYW1lID0gKChjYXBpdGFsaXplKGNsc05hbWUpID09ICJUUmVzdWx0IikgPyBjYXBpdGFsaXplKGNsc05hbWUpIDogcHJlZml4KGNsc05hbWUpKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8IHZhbCA8PCAiIDo9ICIgPDwgbmFtZSA8PCAiIG5ldy4iIDw8IGVuZGw7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJpcHJvdCByZWFkU3RydWN0QmVnaW4uIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJbIiA8PCBkZXNjCisgICAgICA8PCAiIDo9IGlwcm90IHJlYWRGaWVsZEJlZ2luLiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBkZXNjCisgICAgICA8PCAiIHR5cGUgPSBUVHlwZSBzdG9wXSB3aGlsZUZhbHNlOiBbfCIgPDwgZm91bmQgPDwgInwiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IGRlc2MgPDwgIiBpZCA9ICIgPDwgKCpmbGRfaXRlciktPmdldF9rZXkoKSA8PCAiIGlmVHJ1ZTogWyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBmb3VuZCA8PCAiIDo9IHRydWUuIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHZhbCA8PCAiICIKKyAgICAgICAgPDwgY2FtZWxjYXNlKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOiAiIDw8IHJlYWRfdmFsKCgqZmxkX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgb3V0IDw8ICJdLiIgPDwgZW5kbDsKKyAgfQorCisgIG91dCA8PCBpbmRlbnQoKSA8PCBmb3VuZCA8PCAiIGlmTmlsOiBbaXByb3Qgc2tpcDogIiA8PCBkZXNjIDw8ICIgdHlwZV1dLiIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90IHJlYWRTdHJ1Y3RFbmQuIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHZhbCA8PCAiXSB2YWx1ZSI7CisgIGluZGVudF9kb3duKCk7CisKKyAgcmV0dXJuIG91dC5zdHIoKTsKK30KKworc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjp3cml0ZV92YWwodF90eXBlKiB0LCBzdHJpbmcgZm5hbWUpIHsKKyAgdCA9IGdldF90cnVlX3R5cGUodCk7CisKKyAgaWYgKHQtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXQpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiaXByb3Qgd3JpdGVEb3VibGU6ICIgKyBmbmFtZSArICIgYXNGbG9hdCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJpcHJvdCB3cml0ZSIgKyBjYXBpdGFsaXplKHR5cGVfbmFtZSh0KSkgKyAiOiAiICsgZm5hbWUgKyAiIGFzSW50ZWdlciI7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAiaXByb3Qgd3JpdGUiICsgY2FwaXRhbGl6ZSh0eXBlX25hbWUodCkpICsgIjogIiArIGZuYW1lOworICAgIH0KKyAgfSBlbHNlIGlmICh0LT5pc19tYXAoKSkgeworICAgIHJldHVybiBtYXBfd3JpdGVyKCh0X21hcCopdCwgZm5hbWUpOworICB9IGVsc2UgaWYgKHQtPmlzX3N0cnVjdCgpIHx8IHQtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gc3RydWN0X3dyaXRlcigodF9zdHJ1Y3QqKXQsIGZuYW1lKTsKKyAgfSBlbHNlIGlmICh0LT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gbGlzdF93cml0ZXIoKHRfbGlzdCopdCwgZm5hbWUpOworICB9IGVsc2UgaWYgKHQtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuIHNldF93cml0ZXIoKHRfc2V0Kil0LCBmbmFtZSk7CisgIH0gZWxzZSBpZiAodC0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJpcHJvdCB3cml0ZUkzMjogIiArIGZuYW1lOworICB9IGVsc2UgeworICAgIHRocm93ICJTb3JyeSwgSSBkb24ndCBrbm93IGhvdyB0byB3cml0ZSB0aGlzOiAiICsgdHlwZV9uYW1lKHQpOworICB9Cit9CisKK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6cmVhZF92YWwodF90eXBlKiB0KSB7CisgIHQgPSBnZXRfdHJ1ZV90eXBlKHQpOworCisgIGlmICh0LT5pc19iYXNlX3R5cGUoKSkgeworICAgIHJldHVybiAiaXByb3QgcmVhZCIgKyBjYXBpdGFsaXplKHR5cGVfbmFtZSh0KSk7CisgIH0gZWxzZSBpZiAodC0+aXNfbWFwKCkpIHsKKyAgICByZXR1cm4gbWFwX3JlYWRlcigodF9tYXAqKXQpOworICB9IGVsc2UgaWYgKHQtPmlzX3N0cnVjdCgpIHx8IHQtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gc3RydWN0X3JlYWRlcigodF9zdHJ1Y3QqKXQpOworICB9IGVsc2UgaWYgKHQtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiBsaXN0X3JlYWRlcigodF9saXN0Kil0KTsKKyAgfSBlbHNlIGlmICh0LT5pc19zZXQoKSkgeworICAgIHJldHVybiBzZXRfcmVhZGVyKCh0X3NldCopdCk7CisgIH0gZWxzZSBpZiAodC0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICJpcHJvdCByZWFkSTMyIjsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiU29ycnksIEkgZG9uJ3Qga25vdyBob3cgdG8gcmVhZCB0aGlzOiAiICsgdHlwZV9uYW1lKHQpOworICB9Cit9CisKK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlbmRfbWV0aG9kKHRfZnVuY3Rpb24qIGZ1bmN0aW9uKSB7CisgIHN0cmluZyBmdW5uYW1lID0gZnVuY3Rpb24tPmdldF9uYW1lKCk7CisgIHN0cmluZyBzaWduYXR1cmUgPSBmdW5jdGlvbl9zaWduYXR1cmUoZnVuY3Rpb24pOworICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKKworICBzdF9tZXRob2QoZl8sIGNsaWVudF9jbGFzc19uYW1lKCksICJzZW5kIiArIGNhcGl0YWxpemUoc2lnbmF0dXJlKSk7CisgIGZfIDw8ICJvcHJvdCB3cml0ZU1lc3NhZ2VCZWdpbjoiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfIDw8IGluZGVudCgpIDw8ICIoVENhbGxNZXNzYWdlIG5ldyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl8gPDwgaW5kZW50KCkgPDwgIm5hbWU6ICciIDw8IGZ1bm5hbWUgPDwgIic7ICIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAic2VxaWQ6IHNlbGYgbmV4dFNlcWlkKS4iCisgICAgIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGluZGVudF9kb3duKCk7CisKKyAgZl8gPDwgaW5kZW50KCkgPDwgIm9wcm90IHdyaXRlU3RydWN0QmVnaW46ICIKKyAgICAgPDwgIihUU3RydWN0IG5ldyBuYW1lOiAnIiArIGNhcGl0YWxpemUoY2FtZWxjYXNlKGZ1bm5hbWUpKSArICJfYXJncycpLiIgPDwgZW5kbDsKKworICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgIHN0cmluZyBmbmFtZSA9IGNhbWVsY2FzZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSk7CisKKyAgICBmXyA8PCBpbmRlbnQoKSA8PCAib3Byb3Qgd3JpdGVGaWVsZEJlZ2luOiAoVEZpZWxkIG5ldyBuYW1lOiAnIiA8PCBmbmFtZQorICAgICAgIDw8ICInOyB0eXBlOiAiIDw8IHR5cGVfdG9fZW51bSgoKmZsZF9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjsgaWQ6ICIgPDwgKCpmbGRfaXRlciktPmdldF9rZXkoKQorICAgICAgIDw8ICIpLiIgPDwgZW5kbDsKKworICAgIGZfIDw8IGluZGVudCgpIDw8IHdyaXRlX3ZhbCgoKmZsZF9pdGVyKS0+Z2V0X3R5cGUoKSwgZm5hbWUpIDw8ICIuIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgPDwgIm9wcm90IHdyaXRlRmllbGRFbmQuIiA8PCBlbmRsOworICB9CisKKyAgZl8gPDwgaW5kZW50KCkgPDwgIm9wcm90IHdyaXRlRmllbGRTdG9wOyB3cml0ZVN0cnVjdEVuZDsgd3JpdGVNZXNzYWdlRW5kLiIgPDwgZW5kbDsKKyAgZl8gPDwgaW5kZW50KCkgPDwgIm9wcm90IHRyYW5zcG9ydCBmbHVzaCI7CisKKyAgc3RfY2xvc2VfbWV0aG9kKGZfKTsKK30KKworLy8gV2Ugb25seSBzdXBwb3J0IHJlY2VpdmluZyBUUmVzdWx0IHN0cnVjdHVyZXMgKHNvIHRoaXMgd29uJ3Qgd29yayBvbiB0aGUgc2VydmVyIHNpZGUpCit2b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yZWN2X21ldGhvZCh0X2Z1bmN0aW9uKiBmdW5jdGlvbikgeworICBzdHJpbmcgZnVubmFtZSA9IGNhbWVsY2FzZShmdW5jdGlvbi0+Z2V0X25hbWUoKSk7CisgIHN0cmluZyBzaWduYXR1cmUgPSBmdW5jdGlvbl9zaWduYXR1cmUoZnVuY3Rpb24pOworCisgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgIlRSZXN1bHQiKTsKKyAgdF9maWVsZCBzdWNjZXNzKGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOworICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKKworICB0X3N0cnVjdCogeHMgPSBmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIC8vIGR1cGxpY2F0ZSB0aGUgZmllbGQsIGJ1dCBjYWxsIGl0ICJleGNlcHRpb24iLi4uIHdlIGRvbid0IG5lZWQgYSBkeW5hbWljIG5hbWUKKyAgICB0X2ZpZWxkKiBleGNlcHRpb24gPSBuZXcgdF9maWVsZCgoKmZfaXRlciktPmdldF90eXBlKCksICJleGNlcHRpb24iLCAoKmZfaXRlciktPmdldF9rZXkoKSk7CisgICAgcmVzdWx0LmFwcGVuZChleGNlcHRpb24pOworICB9CisKKyAgc3RfbWV0aG9kKGZfLCBjbGllbnRfY2xhc3NfbmFtZSgpLCAicmVjdiIgKyBjYXBpdGFsaXplKGZ1bm5hbWUpKTsKKyAgZl8gPDwgInwgZiBtc2cgcmVzIHwgIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJtc2cgOj0gb3Byb3QgcmVhZE1lc3NhZ2VCZWdpbi4iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgPDwgInNlbGYgdmFsaWRhdGVSZW1vdGVNZXNzYWdlOiBtc2cuIiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgIDw8ICJyZXMgOj0gIiA8PCBzdHJ1Y3RfcmVhZGVyKCZyZXN1bHQpIDw8ICIuIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdCByZWFkTWVzc2FnZUVuZC4iCisgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90IHRyYW5zcG9ydCBmbHVzaC4iIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgPDwgInJlcyBleGNlcHRpb24gaWZOb3ROaWw6IFtyZXMgZXhjZXB0aW9uIHNpZ25hbF0uIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJeIHJlcyI7CisgIHN0X2Nsb3NlX21ldGhvZChmXyk7Cit9CisKK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6ZnVuY3Rpb25fdHlwZXNfY29tbWVudCh0X2Z1bmN0aW9uKiBmbikgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBmbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIG91dCA8PCAiXCIiOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgb3V0IDw8IGNhbWVsY2FzZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICI6ICIgPDwgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKChmX2l0ZXIgKyAxKSAhPSBmaWVsZHMuZW5kKCkpIHsKKyAgICAgIG91dCA8PCAiLCAiOworICAgIH0KKyAgfQorCisgIG91dCA8PCAiXCIiOworCisgIHJldHVybiBvdXQuc3RyKCk7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgorICovCit2b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzID0gIiI7CisgIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICJUQ2xpZW50IjsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICBleHRlbmRzX2NsaWVudCA9IGV4dGVuZHMgKyAiQ2xpZW50IjsKKyAgfQorCisgIGZfIDw8IGV4dGVuZHNfY2xpZW50IDw8ICIgc3ViY2xhc3M6ICMiIDw8IHByZWZpeChjbGllbnRfY2xhc3NfbmFtZSgpKSA8PCBlbmRsCisgICAgIDw8ICJcdGluc3RhbmNlVmFyaWFibGVOYW1lczogJydcbiIKKyAgICAgPDwgIlx0Y2xhc3NWYXJpYWJsZU5hbWVzOiAnJ1xuIgorICAgICA8PCAiXHRwb29sRGljdGlvbmFyaWVzOiAnJ1xuIgorICAgICA8PCAiXHRjYXRlZ29yeTogJyIgPDwgZ2VuZXJhdGVkX2NhdGVnb3J5KCkgPDwgIichXG5cbiI7CisKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBzdHJpbmcgZnVubmFtZSA9IGNhbWVsY2FzZSgoKmZfaXRlciktPmdldF9uYW1lKCkpOworICAgIHN0cmluZyBzaWduYXR1cmUgPSBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcik7CisKKyAgICBzdF9tZXRob2QoZl8sIGNsaWVudF9jbGFzc19uYW1lKCksIHNpZ25hdHVyZSk7CisgICAgZl8gPDwgZnVuY3Rpb25fdHlwZXNfY29tbWVudCgqZl9pdGVyKSA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJzZWxmIHNlbmQiCisgICAgICAgPDwgY2FwaXRhbGl6ZShzaWduYXR1cmUpIDw8ICIuIiA8PCBlbmRsOworCisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBmXyA8PCBpbmRlbnQoKSA8PCAiXiBzZWxmIHJlY3YiIDw8IGNhcGl0YWxpemUoZnVubmFtZSkgPDwgIiBzdWNjZXNzICIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBzdF9jbG9zZV9tZXRob2QoZl8pOworCisgICAgZ2VuZXJhdGVfc2VuZF9tZXRob2QoKmZfaXRlcik7CisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBnZW5lcmF0ZV9yZWN2X21ldGhvZCgqZl9pdGVyKTsKKyAgICB9CisgIH0KK30KKworLyoqCisgKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICByZXR1cm4gY2FtZWxjYXNlKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyBjYXBpdGFsaXplKGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSk7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZpZWxkIGxpc3QKKyAqLworc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyByZXN1bHQgPSAiIjsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9ICIgIjsKKyAgICB9CisgICAgc3RyaW5nIG5hbWUgPSBjYW1lbGNhc2UoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICByZXN1bHQgKz0gbmFtZSArICI6ICIgKyBuYW1lOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0cmluZyB0X3N0X2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpIHsKKyAgc3RyaW5nIHByZWZpeCA9ICIiOworICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKKyAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7CisgICAgaWYgKCF0dHlwZS0+aXNfc2VydmljZSgpKSB7CisgICAgICBwcmVmaXggPSBwcm9ncmFtLT5nZXRfbmFtZSgpICsgIl90eXBlcy4iOworICAgIH0KKyAgfQorCisgIHN0cmluZyBuYW1lID0gdHR5cGUtPmdldF9uYW1lKCk7CisgIGlmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBuYW1lID0gY2FwaXRhbGl6ZSh0dHlwZS0+Z2V0X25hbWUoKSk7CisgIH0KKworICByZXR1cm4gcHJlZml4ICsgbmFtZTsKK30KKworLyogQ29udmVydCB0X3R5cGUgdG8gU21hbGx0YWxrIHR5cGUgY29kZSAqLworc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworCisgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJUVHlwZSBzdHJpbmciOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiVFR5cGUgYm9vbCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiVFR5cGUgYnl0ZSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICByZXR1cm4gIlRUeXBlIGkxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIlRUeXBlIGkzMiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICByZXR1cm4gIlRUeXBlIGk2NCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIlRUeXBlIGRvdWJsZSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiAiVFR5cGUgaTMyIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuICJUVHlwZSBzdHJ1Y3QiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJUVHlwZSBtYXAiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJUVHlwZSBzZXQiOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiVFR5cGUgbGlzdCI7CisgIH0KKworICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1Ioc3QsICJTbWFsbHRhbGsiLCAiIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3Rfc3dpZnRfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9zd2lmdF9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFkYjA0ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3Rfc3dpZnRfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsMzE5OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHNldD4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzZXQ7Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKKworLyoqCisgKiBTd2lmdCAzIGNvZGUgZ2VuZXJhdG9yLgorICoKKyAqIERlc2lnbmVkIGZyb20gdGhlIFN3aWZ0L0NvY29hIGNvZGUgZ2VuZXJhdG9yKHMpCisgKi8KK2NsYXNzIHRfc3dpZnRfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7CitwdWJsaWM6CisgIHRfc3dpZnRfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgbWFwPHN0cmluZywgc3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKSB7CisgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgbG9nX3VuZXhwZWN0ZWRfID0gZmFsc2U7CisgICAgYXN5bmNfY2xpZW50c18gPSBmYWxzZTsKKyAgICBkZWJ1Z19kZXNjcmlwdGlvbnNfID0gZmFsc2U7CisgICAgbm9fc3RyaWN0XyA9IGZhbHNlOworICAgIG5hbWVzcGFjZWRfID0gZmFsc2U7CisgICAgZ2VuX2NvY29hXyA9IGZhbHNlOworICAgIHByb21pc2Vfa2l0XyA9IGZhbHNlOworICAgIHNhZmVfZW51bXNfID0gZmFsc2U7CisKKyAgICBmb3IoIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5iZWdpbigpOyBpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJsb2dfdW5leHBlY3RlZCIpID09IDApIHsKKyAgICAgICAgbG9nX3VuZXhwZWN0ZWRfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiYXN5bmNfY2xpZW50cyIpID09IDApIHsKKyAgICAgICAgYXN5bmNfY2xpZW50c18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJub19zdHJpY3QiKSA9PSAwKSB7CisgICAgICAgIG5vX3N0cmljdF8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJkZWJ1Z19kZXNjcmlwdGlvbnMiKSA9PSAwKSB7CisgICAgICAgIGRlYnVnX2Rlc2NyaXB0aW9uc18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJuYW1lc3BhY2VkIikgPT0gMCkgeworICAgICAgICBuYW1lc3BhY2VkXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImNvY29hIikgPT0gMCkgeworICAgICAgICBnZW5fY29jb2FfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgic2FmZV9lbnVtcyIpID09IDApIHsKKyAgICAgICAgc2FmZV9lbnVtc18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJwcm9taXNlX2tpdCIpID09IDApIHsKKyAgICAgICAgaWYgKGdlbl9jb2NvYV8gPT0gZmFsc2UpIHsKKyAgICAgICAgICB0aHJvdyAiUHJvbWlzZUtpdCBvbmx5IGF2YWlsYWJsZSB3aXRoIFN3aWZ0IDIueCwgdXNlIGBjb2NvYWAgb3B0aW9uIiArIGl0ZXItPmZpcnN0OworICAgICAgICB9CisgICAgICAgIHByb21pc2Vfa2l0XyA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gc3dpZnQ6IiArIGl0ZXItPmZpcnN0OworICAgICAgfQorICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLXN3aWZ0IjsKKyAgfQorCisgIC8qKgorICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCisgICAqLworCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICB2b2lkIGdlbmVyYXRlX2NvbnN0cyh2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7CisKKyAgLyoqCisgICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKKyAgICovCisKKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworCisKKyAgdm9pZCByZW5kZXJfY29uc3RfdmFsdWUob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKworICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3ByaXZhdGUpOworCisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X2luaXQob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcHJpdmF0ZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3RfaW1wbGVtZW50YXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcHJpdmF0ZSk7CisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X2hhc2hhYmxlX2V4dGVuc2lvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcHJpdmF0ZSk7CisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X2VxdWF0YWJsZV9leHRlbnNpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcHJpdmF0ZSk7CisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X3RocmlmdF9leHRlbnNpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcHJpdmF0ZSk7CisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3ByaXZhdGUpOworCisKKyAgdm9pZCBnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3RfcHJpbnRhYmxlX2V4dGVuc2lvbihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zd2lmdF91bmlvbl9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgc3RyaW5nIGZ1bmN0aW9uX3Jlc3VsdF9oZWxwZXJfc3RydWN0X3R5cGUodF9zZXJ2aWNlICp0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgc3RyaW5nIGZ1bmN0aW9uX2FyZ3NfaGVscGVyX3N0cnVjdF90eXBlKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X3NlcnZpY2UgKnRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCisgIC8qKgorICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9wcm90b2NvbChvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfcHJvdG9jb2xfYXN5bmMob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50KG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfYXN5bmMob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X3NlbmRfZnVuY3Rpb25faW1wbGVtZW50YXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXJ2aWNlKiB0c2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbmVlZHNfcHJvdG9jb2wpOworICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X3NlbmRfZnVuY3Rpb25faW52b2NhdGlvbihvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfc2VuZF9hc3luY19mdW5jdGlvbl9pbnZvY2F0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9yZWN2X2Z1bmN0aW9uX2ltcGxlbWVudGF0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5lZWRzX3Byb3RvY29sKTsKKyAgdm9pZCBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9pbXBsZW1lbnRhdGlvbihvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X2FzeW5jX2ltcGxlbWVudGF0aW9uKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX3NlcnZlcihvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2Vfc2VydmVyX2ltcGxlbWVudGF0aW9uKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIC8qKgorICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucworICAgKi8KKworICBzdHJpbmcgc3dpZnRfaW1wb3J0cygpOworICBzdHJpbmcgc3dpZnRfdGhyaWZ0X2ltcG9ydHMoKTsKKyAgc3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGlzX29wdGlvbmFsPWZhbHNlLCBib29sIGlzX2ZvcmNlZD1mYWxzZSk7CisgIHN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdGJhc2UpOworICBzdHJpbmcgZGVjbGFyZV9wcm9wZXJ0eSh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaXNfcHJpdmF0ZSk7CisgIHN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgc3RyaW5nIGFzeW5jX2Z1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCisKKyAgc3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcm90b2NvbF9uYW1lLCBib29sIGlzX2ludGVybmFsKTsKKyAgc3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlLCBib29sIHF1YWxpZmllZD1mYWxzZSk7CisgIHN0cmluZyBtYXliZV9lc2NhcGVfaWRlbnRpZmllcihjb25zdCBzdHJpbmcmIGlkZW50aWZpZXIpOworICB2b2lkIHBvcHVsYXRlX3Jlc2VydmVkX3dvcmRzKCk7CisgIC8qKiBTd2lmdCAzIHNwZWNpZmljICovCisgIHN0cmluZyBlbnVtX2Nhc2VfbmFtZSh0X2VudW1fdmFsdWUqIHRlbnVtX2Nhc2UsIGJvb2wgZGVjbGFyYXRpb24pOworICBzdHJpbmcgZW51bV9jb25zdF9uYW1lKHN0cmluZyBlbnVtX2lkZW50aWZpZXIpOworICB2b2lkIGZ1bmN0aW9uX2RvY3N0cmluZyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgYXN5bmNfZnVuY3Rpb25fZG9jc3RyaW5nKG9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9kb2NzdHJpbmcob3N0cmVhbSYgb3V0LCBzdHJpbmcmIGRvYyk7CisKKyAgLyoqIFN3aWZ0IDIvQ29jb2EgY2FycnlvdmVyICovCisgIHN0cmluZyBwcm9taXNlX2Z1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICBzdHJpbmcgZnVuY3Rpb25fbmFtZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICB2b2lkIGdlbmVyYXRlX29sZF9zd2lmdF9zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCx0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19wcml2YXRlKTsKKyAgdm9pZCBnZW5lcmF0ZV9vbGRfc3dpZnRfc3RydWN0X3Jlc3VsdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgLyoqIFN3aWZ0IDIvQ29jb2EgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkqLworICB2b2lkIGdlbmVyYXRlX29sZF9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX29sZF9zd2lmdF9zdHJ1Y3Qob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3ByaXZhdGUpOworICB2b2lkIGdlbmVyYXRlX29sZF9zd2lmdF9zZXJ2aWNlX2NsaWVudF9hc3luY19pbXBsZW1lbnRhdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXRfcmVhbF9zd2lmdF9tb2R1bGUoY29uc3QgdF9wcm9ncmFtKiBwcm9ncmFtKSB7CisgICAgc3RkOjpzdHJpbmcgcmVhbF9tb2R1bGUgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJzd2lmdCIpOworICAgIGlmIChyZWFsX21vZHVsZS5lbXB0eSgpKSB7CisgICAgICByZXR1cm4gcHJvZ3JhbS0+Z2V0X25hbWUoKTsKKyAgICB9CisgICAgcmV0dXJuIHJlYWxfbW9kdWxlOworICB9Citwcml2YXRlOgorCisgIHZvaWQgYmxvY2tfb3Blbihvc3RyZWFtJiBvdXQpIHsKKyAgICBvdXQgPDwgIiB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICB9CisKKyAgdm9pZCBibG9ja19jbG9zZShvc3RyZWFtJiBvdXQsIGJvb2wgZW5kX2xpbmU9dHJ1ZSkgeworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iOworICAgIGlmIChlbmRfbGluZSkgb3V0IDw8IGVuZGw7CisgIH0KKworICBib29sIGZpZWxkX2lzX29wdGlvbmFsKHRfZmllbGQqIHRmaWVsZCkgeworICAgIGJvb2wgb3B0ID0gdGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKKyAgICBpZiAodGZpZWxkLT5hbm5vdGF0aW9uc18uZmluZCgic3dpZnQubnVsbGFibGUiKSAhPSB0ZmllbGQtPmFubm90YXRpb25zXy5lbmQoKSAmJiB0ZmllbGQtPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBvcHQgPSB0cnVlOworICAgIH0KKyAgICBpZiAoZ2VuX2NvY29hXykgeyAvLyBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgb25seSBpZiBpdHMgYWN0dWFsbHkgIm9wdGlvbmFsIgorICAgICAgb3B0ID0gdGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKKyAgICB9CisgICAgcmV0dXJuIG9wdDsKKyAgfQorCisgIGJvb2wgc3RydWN0X2hhc19yZXF1aXJlZF9maWVsZHModF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgaWYgKCFmaWVsZF9pc19vcHRpb25hbCgqbV9pdGVyKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgYm9vbCBzdHJ1Y3RfaGFzX29wdGlvbmFsX2ZpZWxkcyh0X3N0cnVjdCogdHN0cnVjdCkgeworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBpZiAoZmllbGRfaXNfb3B0aW9uYWwoKm1faXRlcikpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHN0cmluZyBjb25zdGFudHNfZGVjbGFyYXRpb25zXzsKKworICAvKioKKyAgICogRmlsZSBzdHJlYW1zCisgICAqLworCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9kZWNsXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2ltcGxfOworCisgIGJvb2wgbG9nX3VuZXhwZWN0ZWRfOworICBib29sIGFzeW5jX2NsaWVudHNfOworCisgIGJvb2wgZGVidWdfZGVzY3JpcHRpb25zXzsKKyAgYm9vbCBub19zdHJpY3RfOworICBib29sIG5hbWVzcGFjZWRfOworICBib29sIHNhZmVfZW51bXNfOworICBzZXQ8c3RyaW5nPiBzd2lmdF9yZXNlcnZlZF93b3Jkc187CisKKyAgLyoqIFN3aWZ0IDIvQ29jb2EgY29tcGF0aWJpbGl0eSAqLworICBib29sIGdlbl9jb2NvYV87CisgIGJvb2wgcHJvbWlzZV9raXRfOworCit9OworCisvKioKKyAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0CisgKiBzdHJlYW1zLgorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKKyAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5CisgIHN0cmluZyBtb2R1bGUgPSBnZXRfcmVhbF9zd2lmdF9tb2R1bGUocHJvZ3JhbV8pOworICBzdHJpbmcgb3V0X2RpciA9IGdldF9vdXRfZGlyKCk7CisgIHN0cmluZyBtb2R1bGVfcGF0aCA9IG91dF9kaXI7CisgIHN0cmluZyBuYW1lID0gcHJvZ3JhbV9uYW1lXzsKKyAgaWYgKG5hbWVzcGFjZWRfICYmICFtb2R1bGUuZW1wdHkoKSkgeworICAgIG1vZHVsZV9wYXRoID0gbW9kdWxlX3BhdGggKyAiLyIgKyBtb2R1bGU7CisgICAgbmFtZSA9IG1vZHVsZTsKKyAgfQorICBNS0RJUihtb2R1bGVfcGF0aC5jX3N0cigpKTsKKworICBwb3B1bGF0ZV9yZXNlcnZlZF93b3JkcygpOworCisgIC8vIHdlIGhhdmUgYSAuc3dpZnQgZGVjbGFyYXRpb25zIGZpbGUuLi4KKyAgc3RyaW5nIGZfZGVjbF9uYW1lID0gbmFtZSArICIuc3dpZnQiOworICBzdHJpbmcgZl9kZWNsX2Z1bGxuYW1lID0gbW9kdWxlX3BhdGggKyAiLyIgKyBmX2RlY2xfbmFtZTsKKyAgZl9kZWNsXy5vcGVuKGZfZGVjbF9mdWxsbmFtZS5jX3N0cigpKTsKKworICBmX2RlY2xfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7CisKKyAgZl9kZWNsXyA8PCBzd2lmdF9pbXBvcnRzKCkgPDwgc3dpZnRfdGhyaWZ0X2ltcG9ydHMoKSA8PCBlbmRsOworCisgIC8vIC4uLmFuZCBhIC5zd2lmdCBpbXBsZW1lbnRhdGlvbiBleHRlbnNpb25zIGZpbGUKKyAgc3RyaW5nIGZfaW1wbF9uYW1lID0gbmFtZSArICIrRXh0cy5zd2lmdCI7CisgIHN0cmluZyBmX2ltcGxfZnVsbG5hbWUgPSBtb2R1bGVfcGF0aCArICIvIiArIGZfaW1wbF9uYW1lOworICBmX2ltcGxfLm9wZW4oZl9pbXBsX2Z1bGxuYW1lLmNfc3RyKCkpOworCisgIGZfaW1wbF8gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKKworICBmX2ltcGxfIDw8IHN3aWZ0X2ltcG9ydHMoKSA8PCBzd2lmdF90aHJpZnRfaW1wb3J0cygpIDw8IGVuZGw7CisKK30KKworLyoqCisgKiBQcmludHMgc3RhbmRhcmQgQ29jb2EgaW1wb3J0cworICoKKyAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIGZvciBDb2NvYSBsaWJyYXJpZXMKKyAqLworc3RyaW5nIHRfc3dpZnRfZ2VuZXJhdG9yOjpzd2lmdF9pbXBvcnRzKCkgeworCisgIHZlY3RvcjxzdHJpbmc+IGluY2x1ZGVzX2xpc3Q7CisgIGluY2x1ZGVzX2xpc3QucHVzaF9iYWNrKCJGb3VuZGF0aW9uIik7CisKKyAgb3N0cmluZ3N0cmVhbSBpbmNsdWRlczsKKworICB2ZWN0b3I8c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaV9pdGVyOworICBmb3IgKGlfaXRlcj1pbmNsdWRlc19saXN0LmJlZ2luKCk7IGlfaXRlciE9aW5jbHVkZXNfbGlzdC5lbmQoKTsgKytpX2l0ZXIpIHsKKyAgICBpbmNsdWRlcyA8PCAiaW1wb3J0ICIgPDwgKmlfaXRlciA8PCBlbmRsOworICB9CisKKyAgaWYgKG5hbWVzcGFjZWRfKSB7CisgICAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBwcm9ncmFtX2luY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcHJvZ3JhbV9pbmNsdWRlcy5zaXplKCk7ICsraSkgeworICAgICAgaW5jbHVkZXMgPDwgKCJpbXBvcnQgIiArIGdldF9yZWFsX3N3aWZ0X21vZHVsZShwcm9ncmFtX2luY2x1ZGVzW2ldKSkgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgaW5jbHVkZXMgPDwgZW5kbDsKKworICByZXR1cm4gaW5jbHVkZXMuc3RyKCk7Cit9CisKKy8qKgorICogUHJpbnRzIFRocmlmdCBydW50aW1lIGltcG9ydHMKKyAqCisgKiBAcmV0dXJuIExpc3Qgb2YgaW1wb3J0cyBuZWNlc3NhcnkgZm9yIFRocmlmdCBydW50aW1lCisgKi8KK3N0cmluZyB0X3N3aWZ0X2dlbmVyYXRvcjo6c3dpZnRfdGhyaWZ0X2ltcG9ydHMoKSB7CisKKyAgdmVjdG9yPHN0cmluZz4gaW5jbHVkZXNfbGlzdDsKKyAgaW5jbHVkZXNfbGlzdC5wdXNoX2JhY2soIlRocmlmdCIpOworCisgIGlmIChnZW5fY29jb2FfICYmIHByb21pc2Vfa2l0XykgeworICAgIGluY2x1ZGVzX2xpc3QucHVzaF9iYWNrKCJQcm9taXNlS2l0Iik7CisgIH0KKworICBvc3RyaW5nc3RyZWFtIGluY2x1ZGVzOworCisgIHZlY3RvcjxzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpX2l0ZXI7CisgIGZvciAoaV9pdGVyPWluY2x1ZGVzX2xpc3QuYmVnaW4oKTsgaV9pdGVyIT1pbmNsdWRlc19saXN0LmVuZCgpOyArK2lfaXRlcikgeworICAgIGluY2x1ZGVzIDw8ICJpbXBvcnQgIiA8PCAqaV9pdGVyIDw8IGVuZGw7CisgIH0KKworICBpbmNsdWRlcyA8PCBlbmRsOworCisgIHJldHVybiBpbmNsdWRlcy5zdHIoKTsKK30KKworLyoqCisgKiBGaW5pc2ggdXAgZ2VuZXJhdGlvbi4KKyAqLwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworICAvLyBzdGljayBvdXIgY29uc3RhbnRzIGRlY2xhcmF0aW9ucyBhdCB0aGUgZW5kIG9mIHRoZSBoZWFkZXIgZmlsZQorICAvLyBzaW5jZSB0aGV5IHJlZmVyIHRvIHRoaW5ncyB3ZSBhcmUgZGVmaW5pbmcuCisgIGZfZGVjbF8gPDwgY29uc3RhbnRzX2RlY2xhcmF0aW9uc18gPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBUaGlzIGlzIGp1c3QgYSBzaW1wbGUgMS1saW5lciBpbiBTd2lmdAorICoKKyAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICBmX2RlY2xfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgdHlwZWFsaWFzICIgPDwgdHR5cGVkZWYtPmdldF9zeW1ib2xpYygpCisgICAgICAgICAgPDwgIiA9ICIgPDwgdHlwZV9uYW1lKHR0eXBlZGVmLT5nZXRfdHlwZSgpKSA8PCBlbmRsOworICBmX2RlY2xfIDw8IGVuZGw7Cit9CisKKworLyoqCisgKiBHZW5lcmF0ZXMgY29kZSBmb3IgYW4gZW51bWVyYXRlZCB0eXBlLiBJbiBTd2lmdCwgdGhpcyBpcworICogZXNzZW50aWFsbHkgdGhlIHNhbWUgYXMgdGhlIHRocmlmdCBkZWZpbml0aW9uIGl0c2VsZiwgdXNpbmcKKyAqIFN3aWZ0IHN5bnRheC4gIENvbmZvcm1zIHRvIFRFbnVtIHdoaWNoCisgKiBpbXBsZW1lbnRlcyByZWFkL3dyaXRlLgorICoKKyAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KKyAqLwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CisgIGlmIChnZW5fY29jb2FfKSB7CisgICAgZ2VuZXJhdGVfb2xkX2VudW0odGVudW0pOworICAgIHJldHVybjsKKyAgfQorICBmX2RlY2xfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgZW51bSAiIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICIgOiBURW51bSI7CisgIGJsb2NrX29wZW4oZl9kZWNsXyk7CisKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOworCisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAiY2FzZSAiIDw8IGVudW1fY2FzZV9uYW1lKCgqY19pdGVyKSwgdHJ1ZSkgPDwgZW5kbDsKKyAgfQorCisgIC8vIHVua25vd24gYXNzb2NpYXRlZCB2YWx1ZSBjYXNlIGZvciBzYWZldHkgYW5kIHNpbWlsYXIgYmVoYXZpb3IgdG8gb3RoZXIgbGFuZ3VhZ2VzCisgIGlmIChzYWZlX2VudW1zXykgeworICAgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgImNhc2UgdW5rbm93bihJbnQzMikiIDw8IGVuZGw7CisgIH0KKyAgZl9kZWNsXyA8PCBlbmRsOworCisgIC8vIFRTZXJpYWxpemFibGUgcmVhZChmcm9tOikKKyAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAicHVibGljIHN0YXRpYyBmdW5jIHJlYWQoZnJvbSBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gIgorICAgICAgICAgIDw8IHRlbnVtLT5nZXRfbmFtZSgpOworICBibG9ja19vcGVuKGZfZGVjbF8pOworICBmX2RlY2xfIDw8IGluZGVudCgpIDw8ICJsZXQgcmF3OiBJbnQzMiA9IHRyeSBwcm90by5yZWFkKCkiIDw8IGVuZGw7CisgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgImxldCBuZXcgPSAiIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICIocmF3VmFsdWU6IHJhdykiIDw8IGVuZGw7CisKKyAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAiaWYgbGV0IHVud3JhcHBlZCA9IG5ldyB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHVud3JhcHBlZCIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2RlY2xfIDw8IGluZGVudCgpIDw8ICJ0aHJvdyBUUHJvdG9jb2xFcnJvcihlcnJvcjogLmludmFsaWREYXRhLCIgPDwgZW5kbDsKKyAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogXCJJbnZhbGlkIGVudW0gdmFsdWUgKFxcKHJhdykpIGZvciBcXCgiCisgICAgICAgICAgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIi5zZWxmKVwiKSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgYmxvY2tfY2xvc2UoZl9kZWNsXyk7CisKKyAgLy8gZW1wdHkgaW5pdCBmb3IgVFNlcmlhbGl6YWJsZQorICBmX2RlY2xfIDw8IGVuZGw7CisgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgInB1YmxpYyBpbml0KCkiOworICBibG9ja19vcGVuKGZfZGVjbF8pOworCisgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgInNlbGYgPSAuIiA8PCBlbnVtX2Nhc2VfbmFtZShjb25zdGFudHMuZnJvbnQoKSwgZmFsc2UpIDw8IGVuZGw7CisgIGJsb2NrX2Nsb3NlKGZfZGVjbF8pOworICBmX2RlY2xfIDw8IGVuZGw7CisKKyAgLy8gcmF3VmFsdWUgZ2V0dGVyCisgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgInB1YmxpYyB2YXIgcmF3VmFsdWU6IEludDMyIjsKKyAgYmxvY2tfb3BlbihmX2RlY2xfKTsKKyAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAic3dpdGNoIHNlbGYgeyIgPDwgZW5kbDsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICBmX2RlY2xfIDw8IGluZGVudCgpIDw8ICJjYXNlIC4iIDw8IGVudW1fY2FzZV9uYW1lKCgqY19pdGVyKSwgdHJ1ZSkKKyAgICAgICAgICAgIDw8ICI6IHJldHVybiAiIDw8ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkgPDwgZW5kbDsKKyAgfQorICBpZiAoc2FmZV9lbnVtc18pIHsKKyAgICBmX2RlY2xfIDw8IGluZGVudCgpIDw8ICJjYXNlIC51bmtub3duKGxldCB2YWx1ZSk6IHJldHVybiB2YWx1ZSIgPDwgZW5kbDsKKyAgfQorICBmX2RlY2xfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBibG9ja19jbG9zZShmX2RlY2xfKTsKKyAgZl9kZWNsXyA8PCBlbmRsOworCisgIC8vIGNvbnZlbmllbmNlIHJhd1ZhbHVlIGluaXRhbGl6ZXIKKyAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAicHVibGljIGluaXQ/KHJhd1ZhbHVlOiBJbnQzMikiOworICBibG9ja19vcGVuKGZfZGVjbF8pOworICBmX2RlY2xfIDw8IGluZGVudCgpIDw8ICJzd2l0Y2ggcmF3VmFsdWUgeyIgPDwgZW5kbDs7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAiY2FzZSAiIDw8ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkKKyAgICAgICAgICAgIDw8ICI6IHNlbGYgPSAuIiA8PCBlbnVtX2Nhc2VfbmFtZSgoKmNfaXRlciksIHRydWUpIDw8IGVuZGw7CisgIH0KKyAgaWYgKCFzYWZlX2VudW1zXykgeworICAgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgImRlZmF1bHQ6IHJldHVybiBuaWwiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAiZGVmYXVsdDogc2VsZiA9IC51bmtub3duKHJhd1ZhbHVlKSIgPDwgZW5kbDsKKyAgfQorICBmX2RlY2xfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBibG9ja19jbG9zZShmX2RlY2xfKTsKKworCisKKworICBibG9ja19jbG9zZShmX2RlY2xfKTsKKyAgZl9kZWNsXyA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuIFRoaXMgaXMgZm9yIFN3aWZ0IDIueC9Db2NvYQorICogYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKKyAqCisgKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX29sZF9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAicHVibGljIGVudW0gIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiIDogSW50MzIiOworICBibG9ja19vcGVuKGZfZGVjbF8pOworCisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKKworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgImNhc2UgIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgIDw8ICIgPSAiIDw8ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkgPDwgZW5kbDsKKyAgfQorCisgIGZfZGVjbF8gPDwgZW5kbDsKKyAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAicHVibGljIGluaXQoKSB7IHNlbGYuaW5pdChyYXdWYWx1ZTogIiA8PCBjb25zdGFudHMuZnJvbnQoKS0+Z2V0X3ZhbHVlKCkgPDwgIikhIH0iIDw8IGVuZGw7CisKKyAgYmxvY2tfY2xvc2UoZl9kZWNsXyk7CisgIGZfZGVjbF8gPDwgZW5kbDsKKworICBmX2ltcGxfIDw8IGluZGVudCgpIDw8ICJleHRlbnNpb24gIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiIDogVEVudW0iOworICBibG9ja19vcGVuKGZfaW1wbF8pOworCisgIGZfaW1wbF8gPDwgZW5kbDsKKworICBmX2ltcGxfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgc3RhdGljIGZ1bmMgcmVhZFZhbHVlRnJvbVByb3RvY29sKHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiAiIDw8IHRlbnVtLT5nZXRfbmFtZSgpOworICBibG9ja19vcGVuKGZfaW1wbF8pOworICBmX2ltcGxfIDw8IGluZGVudCgpIDw8ICJ2YXIgcmF3ID0gSW50MzIoKSIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0cnkgcHJvdG8ucmVhZEkzMigmcmF3KSIgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiKHJhd1ZhbHVlOiByYXcpISIgPDwgZW5kbDsKKyAgYmxvY2tfY2xvc2UoZl9pbXBsXyk7CisgIGZfaW1wbF8gPDwgZW5kbDsKKworICBmX2ltcGxfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgc3RhdGljIGZ1bmMgd3JpdGVWYWx1ZSh2YWx1ZTogIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiLCB0b1Byb3RvY29sIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyI7CisgIGJsb2NrX29wZW4oZl9pbXBsXyk7CisgIGZfaW1wbF8gPDwgaW5kZW50KCkgPDwgInRyeSBwcm90by53cml0ZUkzMih2YWx1ZS5yYXdWYWx1ZSkiIDw8IGVuZGw7CisgIGJsb2NrX2Nsb3NlKGZfaW1wbF8pOworICBmX2ltcGxfIDw8IGVuZGw7CisKKyAgYmxvY2tfY2xvc2UoZl9pbXBsXyk7CisgIGZfaW1wbF8gPDwgZW5kbDsKK30KKworc3RyaW5nIHRfc3dpZnRfZ2VuZXJhdG9yOjplbnVtX2Nhc2VfbmFtZSh0X2VudW1fdmFsdWUqIHRlbnVtX2Nhc2UsIGJvb2wgZGVjbGFyYXRpb24pIHsKKyAgc3RyaW5nIG5hbWUgPSB0ZW51bV9jYXNlLT5nZXRfbmFtZSgpOworICAvLyBmb3JjZSB0byBsb3dlcmNhc2UgZm9yIFN3aWZ0IHN0eWxlLCBtYXliZSBlc2NhcGUgaWYgaXRzIGEga2V5d29yZAorICBzdGQ6OnRyYW5zZm9ybShuYW1lLmJlZ2luKCksIG5hbWUuZW5kKCksIG5hbWUuYmVnaW4oKSwgOjp0b2xvd2VyKTsKKyAgaWYgKGRlY2xhcmF0aW9uKSB7CisgICAgbmFtZSA9IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKG5hbWUpOworICB9CisgIHJldHVybiBuYW1lOworfQorCisvKioKKyAqIFJlbmRlcnMgYSBjb25zdGFudCBlbnVtIHZhbHVlIGJ5IHRyYW5zZm9ybWluZyB0aGUgdmFsdWUgcG9ydGlvbiB0byBsb3dlcmNhc2UKKyAqIGZvciBTd2lmdCBzdHlsZS4KKyAqLworc3RyaW5nIHRfc3dpZnRfZ2VuZXJhdG9yOjplbnVtX2NvbnN0X25hbWUoc3RyaW5nIGVudW1faWRlbnRpZmllcikgeworICBzdHJpbmc6Oml0ZXJhdG9yIGl0OworICBmb3IgKGl0ID0gZW51bV9pZGVudGlmaWVyLmJlZ2luKCk7IGl0IDwgZW51bV9pZGVudGlmaWVyLmVuZCgpOyArK2l0KSB7CisgICAgaWYgKCgqaXQpID09ICcuJykgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHN0ZDo6dHJhbnNmb3JtKGl0LCBlbnVtX2lkZW50aWZpZXIuZW5kKCksIGl0LCA6OnRvbG93ZXIpOworICByZXR1cm4gZW51bV9pZGVudGlmaWVyOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBwdWJsaWMgY29uc3RhbnRzIGZvciBhbGwgVGhyaWZ0IGNvbnN0YW50cy4KKyAqCisgKiBAcGFyYW0gY29uc3RzIENvbnN0YW50cyB0byBnZW5lcmF0ZQorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHModmVjdG9yPHRfY29uc3QqPiBjb25zdHMpIHsKKworICBvc3RyaW5nc3RyZWFtIGNvbnN0X2ludGVyZmFjZTsKKworICAvLyBQdWJsaWMgY29uc3RhbnRzIGZvciBiYXNlIHR5cGVzICYgc3RyaW5ncworICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgdF90eXBlKiB0eXBlID0gKCpjX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgIGNvbnN0X2ludGVyZmFjZSA8PCAicHVibGljIGxldCAiIDw8IGNhcGl0YWxpemUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiIDogIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiA9ICI7CisgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKGNvbnN0X2ludGVyZmFjZSwgdHlwZSwgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSk7CisgICAgY29uc3RfaW50ZXJmYWNlIDw8IGVuZGwgPDwgZW5kbDsKKyAgfQorCisgIC8vIHRoaXMgZ2V0cyBzcGl0IGludG8gdGhlIGhlYWRlciBmaWxlIGluIDo6Y2xvc2VfZ2VuZXJhdG9yCisgIGNvbnN0YW50c19kZWNsYXJhdGlvbnNfID0gY29uc3RfaW50ZXJmYWNlLnN0cigpOworCit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4gVGhpcyBpcyBhIHN0cnVjdAorICogd2l0aCBwdWJsaWMgbWVtYmVycy4gT3B0aW9uYWwgdHlwZXMgYXJlIHVzZWQgZm9yIG9wdGlvbmFsIHByb3BlcnRpZXMgdG8KKyAqIGFsbG93IHRoZW0gdG8gYmUgdGVzdGVkIGZvciBhdmFpbGFiaWxpdHkuIFNlcGFyYXRlIGluaXRzIGFyZSBpbmNsdWRlZCBmb3IKKyAqIHJlcXVpcmVkIHByb3BlcnRpZXMgJiBhbGwgcHJvcGVydGllcy4KKyAqCisgKiBHZW5lcmF0ZXMgZXh0ZW5zaW9ucyB0byBwcm92aWRlIGNvbmZvcm1hbmNlIHRvIFRTdHJ1Y3QsIFRTZXJpYWxpemFibGUsCisgKiBIYXNoYWJsZSAmIEVxdWF0YWJsZQorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgZ2VuZXJhdGVfc3dpZnRfc3RydWN0KGZfZGVjbF8sIHRzdHJ1Y3QsIGZhbHNlKTsKKyAgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X2ltcGxlbWVudGF0aW9uKGZfaW1wbF8sIHRzdHJ1Y3QsIGZhbHNlLCBmYWxzZSk7Cit9CisKKy8qKgorICogRXhjZXB0aW9ucyBhcmUgc3RydWN0cywgYnV0IHRoZXkgY29uZm9ybSB0byBFcnJvcgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7CisgIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdChmX2RlY2xfLCB0eGNlcHRpb24sIGZhbHNlKTsKKyAgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X2ltcGxlbWVudGF0aW9uKGZfaW1wbF8sIHR4Y2VwdGlvbiwgZmFsc2UsIGZhbHNlKTsKK30KKwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZG9jc3RyaW5nKG9zdHJlYW0mIG91dCwgc3RyaW5nJiBkb2MpIHsKKyAgaWYgKGRvYyAhPSAiIikgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzdHJpbmdzOworCisgICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBwb3MgPSAwOworICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgcHJldiA9IDA7CisgICAgd2hpbGUgKCgocG9zID0gZG9jLmZpbmQoIlxuIiwgcHJldikpICE9IHN0ZDo6c3RyaW5nOjpucG9zKQorICAgICAgICB8fCAoKHBvcyA9IGRvYy5maW5kKCJcciIsIHByZXYpKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykKKyAgICAgICAgfHwgKChwb3MgPSBkb2MuZmluZCgiXHJcbiIsIHByZXYpKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykpCisgICAgeworICAgICAgICBzdHJpbmdzLnB1c2hfYmFjayhkb2Muc3Vic3RyKHByZXYsIHBvcyAtIHByZXYpKTsKKyAgICAgICAgcHJldiA9IHBvcyArIDE7CisgICAgfQorCisgICAgLy8gVG8gZ2V0IHRoZSBsYXN0IHN1YnN0cmluZyAob3Igb25seSwgaWYgZGVsaW1pdGVyIGlzIG5vdCBmb3VuZCkKKyAgICBzdHJpbmdzLnB1c2hfYmFjayhkb2Muc3Vic3RyKHByZXYpKTsKKworICAgIHZlY3RvcjxzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBkX2l0ZXI7CisgICAgZm9yIChkX2l0ZXIgPSBzdHJpbmdzLmJlZ2luKCk7IGRfaXRlciAhPSBzdHJpbmdzLmVuZCgpOyArK2RfaXRlcikgeworICAgICAgaWYgKCgqZF9pdGVyKSAhPSAiIikgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIi8vLyAiIDw8ICgqZF9pdGVyKSA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisKKworLyoqCisgKiBHZW5lcmF0ZSB0aGUgaW50ZXJmYWNlIGZvciBhIHN0cnVjdC4gT25seSBwcm9wZXJ0aWVzIGFuZAorICogaW5pdCBtZXRob2RzIGFyZSBpbmNsdWRlZC4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KKyAqIEBwYXJhbSBpc19wcml2YXRlCisgKiAgICAgICAgICAgICAgICBJcyB0aGUgc3RydWN0IHB1YmxpYyBvciBwcml2YXRlCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3N0cnVjdChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19wcml2YXRlKSB7CisKKyAgaWYgKGdlbl9jb2NvYV8pIHsKKyAgICBnZW5lcmF0ZV9vbGRfc3dpZnRfc3RydWN0KG91dCwgdHN0cnVjdCwgaXNfcHJpdmF0ZSk7CisgICAgcmV0dXJuOworICB9CisgIHN0cmluZyBkb2MgPSB0c3RydWN0LT5nZXRfZG9jKCk7CisgIGdlbmVyYXRlX2RvY3N0cmluZyhvdXQsIGRvYyk7CisKKworICAvLyBwcm9wZXJ0aWVzCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKworICBpZiAodHN0cnVjdC0+aXNfdW5pb24oKSkgeworICAgIC8vIHNwZWNpYWwsIHVuaW9ucworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGVudW0gIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpOworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICAgIHN0cmluZyBkb2MgPSAoKm1faXRlciktPmdldF9kb2MoKTsKKyAgICAgIGdlbmVyYXRlX2RvY3N0cmluZyhvdXQsIGRvYyk7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImNhc2UgIgorICAgICAgICAgIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIih2YWw6ICIKKyAgICAgICAgICA8PCB0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSkgPDwgIikiIDw8IGVuZGw7CisgICAgfQorICB9IGVsc2UgeworICAgIC8vIE5vcm1hbCBzdHJ1Y3RzCisKKyAgICBzdHJpbmcgdmlzaWJpbGl0eSA9IGlzX3ByaXZhdGUgPyAoZ2VuX2NvY29hXyA/ICJwcml2YXRlIiA6ICJmaWxlcHJpdmF0ZSIpIDogInB1YmxpYyI7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgdmlzaWJpbGl0eSA8PCAiIGZpbmFsIGNsYXNzICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKTsKKworICAgIGlmICh0c3RydWN0LT5pc194Y2VwdGlvbigpKSB7CisgICAgICBvdXQgPDwgIiA6IFN3aWZ0LkVycm9yIjsgLy8gRXJyb3Igc2VlbXMgdG8gYmUgYSBjb21tb24gZXhjZXB0aW9uIG5hbWUgaW4gdGhyaWZ0CisgICAgfQorCisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIG91dCA8PCBlbmRsOworICAgICAgLy8gVE9ETzogRGVmYXVsdHMKKworICAgICAgc3RyaW5nIGRvYyA9ICgqbV9pdGVyKS0+Z2V0X2RvYygpOworICAgICAgZ2VuZXJhdGVfZG9jc3RyaW5nKG91dCwgZG9jKTsKKworICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGRlY2xhcmVfcHJvcGVydHkoKm1faXRlciwgaXNfcHJpdmF0ZSkgPDwgZW5kbDsKKyAgICB9CisKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGlmICghc3RydWN0X2hhc19yZXF1aXJlZF9maWVsZHModHN0cnVjdCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8IHZpc2liaWxpdHkgPDwgIiBpbml0KCkgeyB9IiA8PCBlbmRsOworICAgIH0KKyAgICBpZiAoc3RydWN0X2hhc19yZXF1aXJlZF9maWVsZHModHN0cnVjdCkpIHsKKyAgICAgIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9pbml0KG91dCwgdHN0cnVjdCwgZmFsc2UsIGlzX3ByaXZhdGUpOworICAgIH0KKyAgICBpZiAoc3RydWN0X2hhc19vcHRpb25hbF9maWVsZHModHN0cnVjdCkpIHsKKyAgICAgIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9pbml0KG91dCwgdHN0cnVjdCwgdHJ1ZSwgaXNfcHJpdmF0ZSk7CisgICAgfQorICB9CisKKyAgYmxvY2tfY2xvc2Uob3V0KTsKKworICBvdXQgPDwgZW5kbDsKK30KKworLyoqCisgKiBMZWdhY3kgU3dpZnQyL0NvY29hIGdlbmVyYXRvcgorICoKKyAqIEBwYXJhbSB0c3RydWN0CisgKiBAcGFyYW0gaXNfcHJpdmF0ZQorICovCisKKwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2xkX3N3aWZ0X3N0cnVjdChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3ByaXZhdGUpIHsKKyAgc3RyaW5nIHZpc2liaWxpdHkgPSBpc19wcml2YXRlID8gInByaXZhdGUiIDogInB1YmxpYyI7CisKKyAgb3V0IDw8IGluZGVudCgpIDw8IHZpc2liaWxpdHkgPDwgIiBmaW5hbCBjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisKKyAgaWYgKHRzdHJ1Y3QtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBvdXQgPDwgIiA6IEVycm9yVHlwZSI7CisgIH0KKworICBibG9ja19vcGVuKG91dCk7CisKKyAgLy8gcHJvcGVydGllcworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgZGVjbGFyZV9wcm9wZXJ0eSgqbV9pdGVyLCBpc19wcml2YXRlKSA8PCBlbmRsOworICB9CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gaW5pdAorCisgIGluZGVudChvdXQpIDw8IHZpc2liaWxpdHkgPDwgIiBpbml0KCkiOworICBibG9ja19vcGVuKG91dCk7CisgIGJsb2NrX2Nsb3NlKG91dCk7CisKKyAgb3V0IDw8IGVuZGw7CisKKyAgaWYgKHN0cnVjdF9oYXNfcmVxdWlyZWRfZmllbGRzKHRzdHJ1Y3QpKSB7CisgICAgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X2luaXQob3V0LCB0c3RydWN0LCBmYWxzZSwgaXNfcHJpdmF0ZSk7CisgIH0KKyAgaWYgKHN0cnVjdF9oYXNfb3B0aW9uYWxfZmllbGRzKHRzdHJ1Y3QpKSB7CisgICAgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X2luaXQob3V0LCB0c3RydWN0LCB0cnVlLCBpc19wcml2YXRlKTsKKyAgfQorCisgIGJsb2NrX2Nsb3NlKG91dCk7CisKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGUgc3RydWN0IGluaXQgZm9yIHByb3BlcnRpZXMKKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0dXJlIGRlZmluaXRpb24KKyAqIEBwYXJhbSBhbGwgICAgIEdlbmVyYXRlIGluaXQgd2l0aCBhbGwgb3IganVzdCByZXF1aXJlZCBwcm9wZXJ0aWVzCisgKiBAcGFyYW0gaXNfcHJpdmF0ZQorICogICAgICAgICAgICAgICAgSXMgdGhlIGluaXRpYWxpemVyIHB1YmxpYyBvciBwcml2YXRlCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9pbml0KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3ByaXZhdGUpIHsKKworICBzdHJpbmcgdmlzaWJpbGl0eSA9IGlzX3ByaXZhdGUgPyAoZ2VuX2NvY29hXyA/ICJwcml2YXRlIiA6ICJmaWxlcHJpdmF0ZSIpIDogInB1YmxpYyI7CisKKyAgaW5kZW50KG91dCkgPDwgdmlzaWJpbGl0eSA8PCAiIGluaXQoIjsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGJvb2wgZmlyc3Q9dHJ1ZTsKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOykgeworICAgIGlmIChhbGwgfHwgIWZpZWxkX2lzX29wdGlvbmFsKCptX2l0ZXIpKSB7CisgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBvdXQgPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIG91dCA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjogIgorICAgICAgICAgIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKHR5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCksIGZpZWxkX2lzX29wdGlvbmFsKCptX2l0ZXIpKSk7CisgICAgfQorICAgICsrbV9pdGVyOworICB9CisgIG91dCA8PCAiKSI7CisKKyAgYmxvY2tfb3BlbihvdXQpOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICAgIGJvb2wgc2hvdWxkX3NldCA9IGFsbDsKKyAgICAgIHNob3VsZF9zZXQgPSBzaG91bGRfc2V0IHx8ICFmaWVsZF9pc19vcHRpb25hbCgoKm1faXRlcikpOworICAgICAgaWYgKHNob3VsZF9zZXQpIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJzZWxmLiIgPDwgbWF5YmVfZXNjYXBlX2lkZW50aWZpZXIoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiID0gIgorICAgICAgICAgICAgPDwgbWF5YmVfZXNjYXBlX2lkZW50aWZpZXIoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCBlbmRsOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvKiogbGVnYWN5IFN3aWZ0Mi9Db2NvYSAqLworICAgICAgaWYgKGFsbCB8fCAoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEIHx8ICgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQpIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJzZWxmLiIgPDwgbWF5YmVfZXNjYXBlX2lkZW50aWZpZXIoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiID0gIgorICAgICAgICAgICAgPDwgbWF5YmVfZXNjYXBlX2lkZW50aWZpZXIoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCBlbmRsOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGJsb2NrX2Nsb3NlKG91dCk7CisKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGUgdGhlIGhhc2hhYmxlIHByb3RvY29sIGltcGxtZW50YXRpb24KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0dXJlIGRlZmluaXRpb24KKyAqIEBwYXJhbSBpc19wcml2YXRlCisgKiAgICAgICAgICAgICAgICBJcyB0aGUgc3RydWN0IHB1YmxpYyBvciBwcml2YXRlCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9oYXNoYWJsZV9leHRlbnNpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19wcml2YXRlKSB7CisKKyAgc3RyaW5nIHZpc2liaWxpdHkgPSBpc19wcml2YXRlID8gKGdlbl9jb2NvYV8gPyAicHJpdmF0ZSIgOiAiZmlsZXByaXZhdGUiKSA6ICJwdWJsaWMiOworICBpbmRlbnQob3V0KSA8PCAiZXh0ZW5zaW9uICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIDogSGFzaGFibGUiOworICBibG9ja19vcGVuKG91dCk7CisgIG91dCA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCB2aXNpYmlsaXR5IDw8ICIgdmFyIGhhc2hWYWx1ZSA6IEludCI7CisgIGJsb2NrX29wZW4ob3V0KTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgIGlmICghbWVtYmVycy5lbXB0eSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImxldCBwcmltZSA9IDMxIiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ2YXIgcmVzdWx0ID0gMSIgPDwgZW5kbDsKKyAgICBpZiAoIXRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKKyAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgICAgdF9maWVsZCogdGZpZWxkID0gKm1faXRlcjsKKyAgICAgICAgc3RyaW5nIGFjY2Vzc29yID0gZmllbGRfaXNfb3B0aW9uYWwodGZpZWxkKSA/ICI/LiIgOiAiLiI7CisgICAgICAgIHN0cmluZyBkZWZhdWx0b3IgPSBmaWVsZF9pc19vcHRpb25hbCh0ZmllbGQpID8gIiA/PyAwIiA6ICIiOworICAgICAgICBpbmRlbnQob3V0KSA8PCAicmVzdWx0ID0gcHJpbWUgJiogcmVzdWx0ICYrICgiIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKHRmaWVsZC0+Z2V0X25hbWUoKSkgPDwgYWNjZXNzb3IKKyAgICAgICAgICAgICAgICAgICAgPDwgICJoYXNoVmFsdWUiIDw8IGRlZmF1bHRvciA8PCAiKSIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgInN3aXRjaCBzZWxmIHsiIDw8IGVuZGw7CisgICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7IG1faXRlcisrKSB7CisgICAgICAgIHRfZmllbGQgKnRmaWVsZCA9ICptX2l0ZXI7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJjYXNlIC4iIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKGxldCB2YWwpOiByZXN1bHQgPSBwcmltZSAmKiB2YWwuaGFzaFZhbHVlIiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiByZXN1bHQiIDw8IGVuZGw7CisgIH0KKyAgZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiAzMSIgPDwgZW5kbDsKKyAgfQorCisgIGJsb2NrX2Nsb3NlKG91dCk7CisgIG91dCA8PCBlbmRsOworICBibG9ja19jbG9zZShvdXQpOworICBvdXQgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZSB0aGUgZXF1YXRhYmxlIHByb3RvY29sIGltcGxlbWVudGF0aW9uCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgKiBAcGFyYW0gaXNfcHJpdmF0ZQorICogICAgICAgICAgICAgICAgSXMgdGhlIHN0cnVjdCBwdWJsaWMgb3IgcHJpdmF0ZQorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3RfZXF1YXRhYmxlX2V4dGVuc2lvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcHJpdmF0ZSkgeworCisgIHN0cmluZyB2aXNpYmlsaXR5ID0gaXNfcHJpdmF0ZSA/IChnZW5fY29jb2FfID8gInByaXZhdGUiIDogImZpbGVwcml2YXRlIikgOiAicHVibGljIjsKKworICBpbmRlbnQob3V0KSA8PCB2aXNpYmlsaXR5IDw8ICIgZnVuYyA9PShsaHM6ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIsIHJoczogIgorICAgICAgICAgICAgICA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIikgLT4gQm9vbCI7CisgIGJsb2NrX29wZW4ob3V0KTsKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiI7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworICBpZiAobWVtYmVycy5zaXplKCkpIHsKKyAgICBpZiAoIXRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKKyAgICAgIG91dCA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTspIHsKKyAgICAgICAgdF9maWVsZCogdGZpZWxkID0gKm1faXRlcjsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIihsaHMuIiA8PCBtYXliZV9lc2NhcGVfaWRlbnRpZmllcih0ZmllbGQtPmdldF9uYW1lKCkpCisgICAgICAgICAgICAgICAgICAgIDw8IChnZW5fY29jb2FfID8gIiA/IiA6ICIgIikgPDwgIj09IHJocy4iIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKHRmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIikiOyAvLyBzd2lmdCAyID89PSBvcGVyYXRvciBub3QgaW4gMz8KKyAgICAgICAgaWYgKCsrbV9pdGVyICE9IG1lbWJlcnMuZW5kKCkpIHsKKyAgICAgICAgICBvdXQgPDwgIiAmJiI7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnRfZG93bigpOworICAgIH0gZWxzZSB7CisgICAgICBibG9ja19vcGVuKG91dCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChsaHMsIHJocykgeyIgPDwgZW5kbDsKKyAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgICAgdF9maWVsZCogdGZpZWxkID0gKm1faXRlcjsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImNhc2UgKC4iIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKGxldCBsdmFsKSwgLiIKKyAgICAgICAgICAgICAgICAgICAgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIobGV0IHJ2YWwpKTogcmV0dXJuIGx2YWwgPT0gcnZhbCIKKyAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiByZXR1cm4gZmFsc2UiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAifSgpIiA8PCBlbmRsOworICAgIH0KKyAgfQorICBlbHNlIHsKKyAgICBvdXQgPDwgIiB0cnVlIiA8PCBlbmRsOworICB9CisKKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGUgc3RydWN0IGltcGxlbWVudGF0aW9uLiBQcm9kdWNlcyBleHRlbnNpb25zIHRoYXQKKyAqIGZ1bGZpbGwgdGhlIHJlcXVpc2l0ZSBwcm90b2NvbHMgdG8gY29tcGxldGUgdGhlIHZhbHVlLgorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICogQHBhcmFtIGlzX3Jlc3VsdAorICogICAgICAgICAgICAgICAgSWYgdGhpcyBpcyBhIHJlc3VsdCBpdCBuZWVkcyBhIGRpZmZlcmVudCB3cml0ZXIKKyAqIEBwYXJhbSBpc19wcml2YXRlCisgKiAgICAgICAgICAgICAgICBJcyB0aGUgc3RydWN0IHB1YmxpYyBvciBwcml2YXRlCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9pbXBsZW1lbnRhdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19wcml2YXRlKSB7CisKKyAgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X2VxdWF0YWJsZV9leHRlbnNpb24ob3V0LCB0c3RydWN0LCBpc19wcml2YXRlKTsKKworICBpZiAoIWlzX3ByaXZhdGUgJiYgIWlzX3Jlc3VsdCAmJiAhZ2VuX2NvY29hXykgeyAgLy8gb2xkIGNvbXBpbGVyIGRpZG4ndCB1c2UgZGVidWdfZGVzY3JpcHRpb25zLCBPUiBpdCB3aXRoIGdlbl9jb2NvYV8gc28gdGhlIGZsYWcgZG9lc24ndCBtYXR0ZXIgdy8gY29jb2EKKyAgICBnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3RfcHJpbnRhYmxlX2V4dGVuc2lvbihvdXQsIHRzdHJ1Y3QpOworICB9CisKKyAgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X2hhc2hhYmxlX2V4dGVuc2lvbihvdXQsIHRzdHJ1Y3QsIGlzX3ByaXZhdGUpOworICBnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3RfdGhyaWZ0X2V4dGVuc2lvbihvdXQsIHRzdHJ1Y3QsIGlzX3Jlc3VsdCwgaXNfcHJpdmF0ZSk7CisKKyAgb3V0IDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZSB0aGUgVFN0cnVjdCBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0dXJlIGRlZmluaXRpb24KKyAqIEBwYXJhbSBpc19yZXN1bHQKKyAqICAgICAgICAgICAgICAgIElzIHRoZSBzdHJ1Y3QgYSByZXN1bHQgdmFsdWUKKyAqIEBwYXJhbSBpc19wcml2YXRlCisgKiAgICAgICAgICAgICAgICBJcyB0aGUgc3RydWN0IHB1YmxpYyBvciBwcml2YXRlCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3N0cnVjdF90aHJpZnRfZXh0ZW5zaW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3ByaXZhdGUpIHsKKworICBpbmRlbnQob3V0KSA8PCAiZXh0ZW5zaW9uICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIDogVFN0cnVjdCI7CisKKyAgYmxvY2tfb3BlbihvdXQpOworCisgIG91dCA8PCBlbmRsOworICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICAvKiogU3dpZnQgMywgbm8gd3JpdGVyIHdlIGp1c3Qgd3JpdGUgZmllbGQgSUQncyAqLworICAgIHN0cmluZyBhY2Nlc3MgPSAoaXNfcHJpdmF0ZSkgPyAoZ2VuX2NvY29hXyA/ICJwcml2YXRlIiA6ICJmaWxlcHJpdmF0ZSIpIDogInB1YmxpYyI7CisgICAgLy8gZ2VuZXJhdGUgZmllbGRJRCdzIGRpY3Rpb25hcnkKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgYWNjZXNzIDw8ICIgc3RhdGljIHZhciBmaWVsZElkczogW1N0cmluZzogSW50MzJdIjsKKyAgICBibG9ja19vcGVuKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gWyI7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgYm9vbCB3cm90ZSA9IGZhbHNlOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICB3cm90ZSA9IHRydWU7CisgICAgICBvdXQgPDwgIlwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiOiAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIsICI7CisgICAgfQorICAgIGlmICghd3JvdGUpIHsKKyAgICAgIC8vIHBhZCBhIGNvbG9uCisgICAgICBvdXQgPDwgIjoiOworICAgIH0KKyAgICBvdXQgPDwgIl0iIDw8IGVuZGw7CisgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgYWNjZXNzIDw8ICIgc3RhdGljIHZhciBzdHJ1Y3ROYW1lOiBTdHJpbmcgeyByZXR1cm4gXCIiCisgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlwiIH0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGlmICh0c3RydWN0LT5pc191bmlvbigpKSB7CisgICAgICBnZW5lcmF0ZV9zd2lmdF91bmlvbl9yZWFkZXIob3V0LCB0c3RydWN0KTsKKyAgICB9IGVsc2UgeworICAgICAgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QsIGlzX3ByaXZhdGUpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvKiogTGVnYWN5IFN3aWZ0Mi9Db2NvYSAqLworCisgICAgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QsIGlzX3ByaXZhdGUpOworCisgICAgaWYgKGlzX3Jlc3VsdCkgeworICAgICAgZ2VuZXJhdGVfb2xkX3N3aWZ0X3N0cnVjdF9yZXN1bHRfd3JpdGVyKG91dCwgdHN0cnVjdCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgZ2VuZXJhdGVfb2xkX3N3aWZ0X3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0LCBpc19wcml2YXRlKTsKKyAgICB9CisgIH0KKworICBibG9ja19jbG9zZShvdXQpOworICBvdXQgPDwgZW5kbDsKK30KKwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3dpZnRfdW5pb25fcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBzdGF0aWMgZnVuYyByZWFkKGZyb20gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+ICIKKyAgICAgICAgICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgYmxvY2tfb3BlbihvdXQpOworICBpbmRlbnQob3V0KSA8PCAiXyA9IHRyeSBwcm90by5yZWFkU3RydWN0QmVnaW4oKSIgPDwgZW5kbDsKKworICBpbmRlbnQob3V0KSA8PCAidmFyIHJldDogIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI/IjsKKyAgb3V0IDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJmaWVsZHM6IHdoaWxlIHRydWUiOworICBibG9ja19vcGVuKG91dCk7CisgIG91dCA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAibGV0IChfLCBmaWVsZFR5cGUsIGZpZWxkSUQpID0gdHJ5IHByb3RvLnJlYWRGaWVsZEJlZ2luKCkiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGRJRCwgZmllbGRUeXBlKSI7CisgIGJsb2NrX29wZW4ob3V0KTsKKyAgaW5kZW50KG91dCkgPDwgImNhc2UgKF8sIC5zdG9wKTogICAgICAgICAgICBicmVhayBmaWVsZHMiIDw8IGVuZGw7CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIGluZGVudChvdXQpIDw8ICJjYXNlICgiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIsICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIik6IjsKKyAgICBzdHJpbmcgcGFkZGluZyA9ICIiOworCisgICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSgoKmZfaXRlciktPmdldF90eXBlKCkpOworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgICAgcGFkZGluZyA9ICIgICAgICAgICAgICI7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICAgIHBhZGRpbmcgPSAiICAgICAgICAgICAgIjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgICBwYWRkaW5nID0gIiAgICAgICAgICAgICAiOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSB8fCB0eXBlLT5pc19zZXQoKSB8fCB0eXBlLT5pc19tYXAoKSkgeworICAgICAgcGFkZGluZyA9ICIgICAgICAgICAgICAgIjsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgIHBhZGRpbmcgPSAiICAgICAgICAgICAiOworICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBwYWRkaW5nID0gIiAgICAgICAgICAgICI7CisgICAgfQorCisgICAgaW5kZW50KG91dCkgPDwgcGFkZGluZyA8PCAicmV0ID0gIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIuIgorICAgICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKHZhbDogIiA8PCAidHJ5ICIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpCisgICAgICAgICAgICAgICAgPDwgIi5yZWFkKGZyb206IHByb3RvKSkiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAiY2FzZSBsZXQgKF8sIHVua25vd25UeXBlKTogIHRyeSBwcm90by5za2lwKHR5cGU6IHVua25vd25UeXBlKSIgPDwgZW5kbDsKKworICBibG9ja19jbG9zZShvdXQpOworICBpbmRlbnQob3V0KSA8PCAidHJ5IHByb3RvLnJlYWRGaWVsZEVuZCgpIiA8PCBlbmRsOworCisgIGJsb2NrX2Nsb3NlKG91dCk7CisgIG91dCA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJ0cnkgcHJvdG8ucmVhZFN0cnVjdEVuZCgpIiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJpZiBsZXQgcmV0ID0gcmV0IjsKKyAgYmxvY2tfb3BlbihvdXQpOworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHJldCIgPDwgZW5kbDsKKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBUUHJvdG9jb2xFcnJvcihlcnJvcjogLnVua25vd24sIG1lc3NhZ2U6IFwiTWlzc2luZyByZXF1aXJlZCB2YWx1ZSBmb3IgdHlwZTogIgorICAgICAgICAgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJcIikiOworICBibG9ja19jbG9zZShvdXQpOworICBvdXQgPDwgZW5kbDsKKworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHJlYWQgYSBzdHJ1Y3QgZnJvbQorICogZnJvbSBhIHByb3RvY29sLiAoVFN0cnVjdCBjb21wbGlhbmNlKQorICoKKyAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbgorICogQHBhcmFtIGlzX3ByaXZhdGUKKyAqICAgICAgICAgICAgICAgIElzIHRoZSBzdHJ1Y3QgcHVibGljIG9yIHByaXZhdGUKKyAqLwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3dpZnRfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3ByaXZhdGUpIHsKKworICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICAvKiogU3dpZnQgMyBjYXNlICovCisgICAgc3RyaW5nIHZpc2liaWxpdHkgPSBpc19wcml2YXRlID8gImZpbGVwcml2YXRlIiA6ICJwdWJsaWMiOworCisgICAgaW5kZW50KG91dCkgPDwgdmlzaWJpbGl0eSA8PCAiIHN0YXRpYyBmdW5jIHJlYWQoZnJvbSBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gIgorICAgICAgICAgICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKTsKKworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBpbmRlbnQob3V0KSA8PCAiXyA9IHRyeSBwcm90by5yZWFkU3RydWN0QmVnaW4oKSIgPDwgZW5kbDsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGJvb2wgb3B0aW9uYWwgPSBmaWVsZF9pc19vcHRpb25hbCgqZl9pdGVyKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ2YXIgIiA8PCBtYXliZV9lc2NhcGVfaWRlbnRpZmllcigoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICI6ICIKKyAgICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCksIG9wdGlvbmFsLCAhb3B0aW9uYWwpIDw8IGVuZGw7CisgICAgfQorCisgICAgb3V0IDw8IGVuZGw7CisKKyAgICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKKyAgICBpbmRlbnQob3V0KSA8PCAiZmllbGRzOiB3aGlsZSB0cnVlIjsKKyAgICBibG9ja19vcGVuKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBpbmRlbnQob3V0KSA8PCAibGV0IChfLCBmaWVsZFR5cGUsIGZpZWxkSUQpID0gdHJ5IHByb3RvLnJlYWRGaWVsZEJlZ2luKCkiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZElELCBmaWVsZFR5cGUpIjsKKyAgICBibG9ja19vcGVuKG91dCk7CisgICAgaW5kZW50KG91dCkgPDwgImNhc2UgKF8sIC5zdG9wKTogICAgICAgICAgICBicmVhayBmaWVsZHMiIDw8IGVuZGw7CisKKworICAgIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAoIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiLCAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpOiI7CisgICAgICBzdHJpbmcgcGFkZGluZyA9ICIiOworCisgICAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgICAgICBwYWRkaW5nID0gIiAgICAgICAgICAgIjsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICAgICAgcGFkZGluZyA9ICIgICAgICAgICAgICAiOworICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgICAgcGFkZGluZyA9ICIgICAgICAgICAgICAgIjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkgfHwgdHlwZS0+aXNfc2V0KCkgfHwgdHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgICAgcGFkZGluZyA9ICIgICAgICAgICAgICAgIjsKKyAgICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgICBwYWRkaW5nID0gIiAgICAgICAgICAgIjsKKyAgICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICAgIHBhZGRpbmcgPSAiICAgICAgICAgICAgIjsKKyAgICAgIH0KKworICAgICAgb3V0IDw8IHBhZGRpbmcgPDwgbWF5YmVfZXNjYXBlX2lkZW50aWZpZXIoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiID0gdHJ5ICIKKyAgICAgICAgICA8PCB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpIDw8ICIucmVhZChmcm9tOiBwcm90bykiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50KG91dCkgPDwgImNhc2UgbGV0IChfLCB1bmtub3duVHlwZSk6ICB0cnkgcHJvdG8uc2tpcCh0eXBlOiB1bmtub3duVHlwZSkiIDw8IGVuZGw7CisgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIC8vIFJlYWQgZmllbGQgZW5kIG1hcmtlcgorICAgIGluZGVudChvdXQpIDw8ICJ0cnkgcHJvdG8ucmVhZEZpZWxkRW5kKCkiIDw8IGVuZGw7CisgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAidHJ5IHByb3RvLnJlYWRTdHJ1Y3RFbmQoKSIgPDwgZW5kbDsKKworICAgIGlmIChzdHJ1Y3RfaGFzX3JlcXVpcmVkX2ZpZWxkcyh0c3RydWN0KSkgeworICAgICAgLy8gcGVyZm9ybXMgdmFyaW91cyBjaGVja3MgKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCisgICAgICBpbmRlbnQob3V0KSA8PCAiLy8gUmVxdWlyZWQgZmllbGRzIiA8PCBlbmRsOworCisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoZmllbGRfaXNfb3B0aW9uYWwoKmZfaXRlcikpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpbmRlbnQob3V0KSA8PCAidHJ5IHByb3RvLnZhbGlkYXRlVmFsdWUoIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgICA8PCAibmFtZWQ6IFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiKSIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoIjsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOykgeworICAgICAgb3V0IDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOiAiIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgICBpZiAoKytmX2l0ZXIgIT0gZmllbGRzLmVuZCgpKSB7CisgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgfQorICAgIH0KKworICB9IGVsc2UgeworICAgIC8qKiBMZWdhY3kgU3dpZjIvQ29jb2EgY2FzZSAqLworICAgIHN0cmluZyB2aXNpYmlsaXR5ID0gaXNfcHJpdmF0ZSA/ICJwcml2YXRlIiA6ICJwdWJsaWMiOworCisgICAgaW5kZW50KG91dCkgPDwgdmlzaWJpbGl0eSA8PCAiIHN0YXRpYyBmdW5jIHJlYWRWYWx1ZUZyb21Qcm90b2NvbChfX3Byb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiAiCisgICAgICAgICAgICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKTsKKworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAidHJ5IF9fcHJvdG8ucmVhZFN0cnVjdEJlZ2luKCkiIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGJvb2wgb3B0aW9uYWwgPSBmaWVsZF9pc19vcHRpb25hbCgqZl9pdGVyKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ2YXIgIiA8PCBtYXliZV9lc2NhcGVfaWRlbnRpZmllcigoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgOiAiCisgICAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLCBvcHRpb25hbCwgIW9wdGlvbmFsKSA8PCBlbmRsOworICAgIH0KKworICAgIG91dCA8PCBlbmRsOworCisgICAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCisgICAgaW5kZW50KG91dCkgPDwgImZpZWxkczogd2hpbGUgdHJ1ZSI7CisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIG91dCA8PCBlbmRsOworCisgICAgaW5kZW50KG91dCkgPDwgImxldCAoXywgZmllbGRUeXBlLCBmaWVsZElEKSA9IHRyeSBfX3Byb3RvLnJlYWRGaWVsZEJlZ2luKCkiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZElELCBmaWVsZFR5cGUpIjsKKworICAgIGJsb2NrX29wZW4ob3V0KTsKKworICAgIGluZGVudChvdXQpIDw8ICJjYXNlIChfLCAuU1RPUCk6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJicmVhayBmaWVsZHMiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworCisgICAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKworICAgICAgaW5kZW50KG91dCkgPDwgImNhc2UgKCIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiwgIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKToiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChvdXQpIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA9IHRyeSBfX3Byb3RvLnJlYWRWYWx1ZSgpIGFzICIKKyAgICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8IGVuZGwgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisKKyAgICB9CisKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSBsZXQgKF8sIHVua25vd25UeXBlKToiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgInRyeSBfX3Byb3RvLnNraXBUeXBlKHVua25vd25UeXBlKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisKKyAgICAvLyBSZWFkIGZpZWxkIGVuZCBtYXJrZXIKKyAgICBpbmRlbnQob3V0KSA8PCAidHJ5IF9fcHJvdG8ucmVhZEZpZWxkRW5kKCkiIDw8IGVuZGw7CisKKyAgICBibG9ja19jbG9zZShvdXQpOworICAgIG91dCA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ0cnkgX19wcm90by5yZWFkU3RydWN0RW5kKCkiIDw8IGVuZGw7CisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBpZiAoc3RydWN0X2hhc19yZXF1aXJlZF9maWVsZHModHN0cnVjdCkpIHsKKyAgICAgIC8vIHBlcmZvcm1zIHZhcmlvdXMgY2hlY2tzIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQorICAgICAgaW5kZW50KG91dCkgPDwgIi8vIFJlcXVpcmVkIGZpZWxkcyIgPDwgZW5kbDsKKworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKGZpZWxkX2lzX29wdGlvbmFsKCpmX2l0ZXIpKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaW5kZW50KG91dCkgPDwgInRyeSBfX3Byb3RvLnZhbGlkYXRlVmFsdWUoIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgICA8PCAibmFtZWQ6IFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiKSIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoIjsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOykgeworICAgICAgb3V0IDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOiAiIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgICBpZiAoKytmX2l0ZXIgIT0gZmllbGRzLmVuZCgpKSB7CisgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgfQorICAgIH0KKyAgfQorICBvdXQgPDwgIikiIDw8IGVuZGw7CisKKyAgYmxvY2tfY2xvc2Uob3V0KTsKKworICBvdXQgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byB3cml0ZSBhIHN0cnVjdCB0bworICogYSBwcm90b2NvbC4gKFRTdHJ1Y3QgY29tcGxpYW5jZSkgT05MWSBGT1IgU1dJRlQyL0NPQ09BCisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdHVyZSBkZWZpbml0aW9uCisgKiBAcGFyYW0gaXNfcHJpdmF0ZQorICogICAgICAgICAgICAgICAgSXMgdGhlIHN0cnVjdCBwdWJsaWMgb3IgcHJpdmF0ZQorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9vbGRfc3dpZnRfc3RydWN0X3dyaXRlcihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcHJpdmF0ZSkgeworCisgIHN0cmluZyB2aXNpYmlsaXR5ID0gaXNfcHJpdmF0ZSA/ICJwcml2YXRlIiA6ICJwdWJsaWMiOworCisgIGluZGVudChvdXQpIDw8IHZpc2liaWxpdHkgPDwgIiBzdGF0aWMgZnVuYyB3cml0ZVZhbHVlKF9fdmFsdWU6ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICA8PCAiLCB0b1Byb3RvY29sIF9fcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIjsKKyAgYmxvY2tfb3BlbihvdXQpOworICBvdXQgPDwgZW5kbDsKKworICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpbmRlbnQob3V0KSA8PCAidHJ5IF9fcHJvdG8ud3JpdGVTdHJ1Y3RCZWdpbldpdGhOYW1lKFwiIiA8PCBuYW1lIDw8ICJcIikiIDw8IGVuZGw7CisgIG91dCA8PCBlbmRsOworCisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgdF9maWVsZCAqdGZpZWxkID0gKmZfaXRlcjsKKworICAgIGJvb2wgb3B0aW9uYWwgPSBmaWVsZF9pc19vcHRpb25hbCh0ZmllbGQpOworICAgIGlmIChvcHRpb25hbCkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmIGxldCAiIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKHRmaWVsZC0+Z2V0X25hbWUoKSkKKyAgICAgICAgICAgICAgICAgIDw8ICIgPSBfX3ZhbHVlLiIgPDwgbWF5YmVfZXNjYXBlX2lkZW50aWZpZXIodGZpZWxkLT5nZXRfbmFtZSgpKTsKKyAgICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICB9CisKKyAgICBpbmRlbnQob3V0KSA8PCAidHJ5IF9fcHJvdG8ud3JpdGVGaWVsZFZhbHVlKCIKKyAgICAgICAgICAgICAgICA8PCAob3B0aW9uYWwgPyAiIiA6ICJfX3ZhbHVlLiIpIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKHRmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIiwgIgorICAgICAgICAgICAgICAgIDw8ICJuYW1lOiBcIiIgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICJcIiwgIgorICAgICAgICAgICAgICAgIDw8ICJ0eXBlOiAiIDw8IHR5cGVfdG9fZW51bSh0ZmllbGQtPmdldF90eXBlKCkpIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCAiaWQ6ICIgPDwgdGZpZWxkLT5nZXRfa2V5KCkgPDwgIikiIDw8IGVuZGw7CisKKyAgICBpZiAob3B0aW9uYWwpIHsKKyAgICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgfQorCisgICAgb3V0IDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAidHJ5IF9fcHJvdG8ud3JpdGVGaWVsZFN0b3AoKSIgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAidHJ5IF9fcHJvdG8ud3JpdGVTdHJ1Y3RFbmQoKSIgPDwgZW5kbDsKKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gcmVhZCBhIHN0cnVjdCBmcm9tCisgKiBmcm9tIGEgcHJvdG9jb2wuIChUU3RydWN0IGNvbXBsaWFuY2UpICBPTkxZIEZPUiBTV0lGVCAyL0NPQ09BCisgKgorICogVGhpcyBpcyBzcGVjaWZpY2FsbHkgYSBmdW5jdGlvbiByZXN1bHQuIE9ubHkKKyAqIHRoZSBmaXJzdCBhdmFpbGFibGUgZmllbGQgaXMgd3JpdHRlbi4KKyAqCisgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0dXJlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2xkX3N3aWZ0X3N0cnVjdF9yZXN1bHRfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKworICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBzdGF0aWMgZnVuYyB3cml0ZVZhbHVlKF9fdmFsdWU6ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICA8PCAiLCB0b1Byb3RvY29sIF9fcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIjsKKyAgYmxvY2tfb3BlbihvdXQpOworICBvdXQgPDwgZW5kbDsKKyAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGluZGVudChvdXQpIDw8ICJ0cnkgX19wcm90by53cml0ZVN0cnVjdEJlZ2luV2l0aE5hbWUoXCIiIDw8IG5hbWUgPDwgIlwiKSIgPDwgZW5kbDsKKyAgb3V0IDw8IGVuZGw7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkICp0ZmllbGQgPSAqZl9pdGVyOworCisgICAgaW5kZW50KG91dCkgPDwgImlmIGxldCByZXN1bHQgPSBfX3ZhbHVlLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworCisgICAgYmxvY2tfb3BlbihvdXQpOworCisgICAgaW5kZW50KG91dCkgPDwgInRyeSBfX3Byb3RvLndyaXRlRmllbGRWYWx1ZShyZXN1bHQsICIKKyAgICAgICAgICAgICAgICA8PCAibmFtZTogXCIiIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiXCIsICIKKyAgICAgICAgICAgICAgICA8PCAidHlwZTogIiA8PCB0eXBlX3RvX2VudW0odGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgImlkOiAiIDw8IHRmaWVsZC0+Z2V0X2tleSgpIDw8ICIpIiA8PCBlbmRsOworCisgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgfQorICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAorICBpbmRlbnQob3V0KSA8PCAidHJ5IF9fcHJvdG8ud3JpdGVGaWVsZFN0b3AoKSIgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAidHJ5IF9fcHJvdG8ud3JpdGVTdHJ1Y3RFbmQoKSIgPDwgZW5kbDsKKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZGVzY3JpcHRpb24gbWV0aG9kIGZvciB0aGUgZ2l2ZW4gc3RydWN0CisgKgorICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9wcmludGFibGVfZXh0ZW5zaW9uKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKworICAvLyBBbGxvdyB1c2Ugb2YgZGVidWdEZXNjcmlwdGlvbiBzbyB0aGUgYXBwIGNhbiBhZGQgZGVzY3JpcHRpb24gdmlhIGEgY2F0ZW9nb3J5L2V4dGVuc2lvbgorCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpbmRlbnQob3V0KSA8PCAiZXh0ZW5zaW9uICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIDogIgorICAgICAgICAgICAgICA8PCAoZGVidWdfZGVzY3JpcHRpb25zXyA/ICJDdXN0b21EZWJ1Z1N0cmluZ0NvbnZlcnRpYmxlIiA6ICJDdXN0b21TdHJpbmdDb252ZXJ0aWJsZSIpOworCisgIGJsb2NrX29wZW4ob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdmFyIGRlc2NyaXB0aW9uIDogU3RyaW5nIjsKKyAgYmxvY2tfb3BlbihvdXQpOworICBpbmRlbnQob3V0KSA8PCAidmFyIGRlc2MgPSBcIiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKTsKKworICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICBpZiAoIXRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKKyAgICAgIG91dCA8PCAiKFwiIiA8PCBlbmRsOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTspIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImRlc2MgKz0gXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICA8PCAiPVxcKFN0cmluZyhkZXNjcmliaW5nOiBzZWxmLiIgPDwgbWF5YmVfZXNjYXBlX2lkZW50aWZpZXIoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKSkiOworICAgICAgICBpZiAoKytmX2l0ZXIgIT0gZmllbGRzLmVuZCgpKSB7CisgICAgICAgICAgb3V0IDw8ICIsICI7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8ICJcIiIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICIuXCIiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIHNlbGYgeyIgPDwgZW5kbDsKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7Zl9pdGVyKyspIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImNhc2UgLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIobGV0IHZhbCk6ICIKKyAgICAgICAgICAgICAgICAgICAgPDwgImRlc2MgKz0gXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKHZhbDogXFwodmFsKSlcIiIKKyAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgIihcIiIgPDwgZW5kbDsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOykgeworICAgICAgaW5kZW50KG91dCkgPDwgImRlc2MgKz0gXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgPDwgIj1cXChzZWxmLiIgPDwgbWF5YmVfZXNjYXBlX2lkZW50aWZpZXIoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKSI7CisgICAgICBpZiAoKytmX2l0ZXIgIT0gZmllbGRzLmVuZCgpKSB7CisgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgfQorICAgICAgb3V0IDw8ICJcIiIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgImRlc2MgKz0gXCIpXCIiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIGRlc2MiIDw8IGVuZGw7CisgIGJsb2NrX2Nsb3NlKG91dCk7CisgIG91dCA8PCBlbmRsOworICBibG9ja19jbG9zZShvdXQpOworICBvdXQgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4gIEluIFN3aWZ0IHRoaXMgY29uc2lzdHMgb2YgYQorICogcHJvdG9jb2wgZGVmaW5pdGlvbiBhbmQgYSBjbGllbnQgKHdpdGggaXQncyBpbXBsZW1lbnRhdGlvbgorICogc2VwYXJhdGVkIGludG8gZXh0cyBmaWxlKS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKworICBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX3Byb3RvY29sKGZfZGVjbF8sIHRzZXJ2aWNlKTsKKyAgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnQoZl9kZWNsXywgdHNlcnZpY2UpOworICBpZiAoYXN5bmNfY2xpZW50c18pIHsKKyAgICBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX3Byb3RvY29sX2FzeW5jKGZfZGVjbF8sIHRzZXJ2aWNlKTsKKyAgICBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9hc3luYyhmX2RlY2xfLCB0c2VydmljZSk7CisgIH0KKyAgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9zZXJ2ZXIoZl9kZWNsXywgdHNlcnZpY2UpOworCisgIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7CisKKyAgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfaW1wbGVtZW50YXRpb24oZl9pbXBsXywgdHNlcnZpY2UpOworICBpZiAoYXN5bmNfY2xpZW50c18pIHsKKyAgICBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9hc3luY19pbXBsZW1lbnRhdGlvbihmX2ltcGxfLCB0c2VydmljZSk7CisgIH0KKyAgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9zZXJ2ZXJfaW1wbGVtZW50YXRpb24oZl9pbXBsXywgdHNlcnZpY2UpOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBzdHJ1Y3RzIGZvciBhbGwgdGhlIHNlcnZpY2UgcmV0dXJuIHR5cGVzCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworCisgICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworCisgICAgc3RyaW5nIHFuYW1lID0gZnVuY3Rpb25fYXJnc19oZWxwZXJfc3RydWN0X3R5cGUodHNlcnZpY2UsICpmX2l0ZXIpOworCisgICAgdF9zdHJ1Y3QgcW5hbWVfdHMgPSB0X3N0cnVjdCh0cy0+Z2V0X3Byb2dyYW0oKSwgcW5hbWUpOworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBxbmFtZV90cy5hcHBlbmQoKm1faXRlcik7CisgICAgfQorCisgICAgZ2VuZXJhdGVfc3dpZnRfc3RydWN0KGZfaW1wbF8sICZxbmFtZV90cywgdHJ1ZSk7CisgICAgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X2ltcGxlbWVudGF0aW9uKGZfaW1wbF8sICZxbmFtZV90cywgZmFsc2UsIHRydWUpOworICAgIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModHNlcnZpY2UsICpmX2l0ZXIpOworICB9Cit9CisKK3N0cmluZyB0X3N3aWZ0X2dlbmVyYXRvcjo6ZnVuY3Rpb25fcmVzdWx0X2hlbHBlcl9zdHJ1Y3RfdHlwZSh0X3NlcnZpY2UgKnRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICByZXR1cm4gdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOworICB9Cit9CisKK3N0cmluZyB0X3N3aWZ0X2dlbmVyYXRvcjo6ZnVuY3Rpb25fYXJnc19oZWxwZXJfc3RydWN0X3R5cGUodF9zZXJ2aWNlICp0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIHJldHVybiB0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyI7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9zZXJ2aWNlICp0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gY3JlYXRlIGEgcmVzdWx0IHN0cnVjdCB3aXRoIGEgc3VjY2VzcyBmaWVsZCBvZiB0aGUgcmV0dXJuIHR5cGUsCisgIC8vIGFuZCBhIGZpZWxkIGZvciBlYWNoIHR5cGUgb2YgZXhjZXB0aW9uIHRocm93bgorICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIGZ1bmN0aW9uX3Jlc3VsdF9oZWxwZXJfc3RydWN0X3R5cGUodHNlcnZpY2UsIHRmdW5jdGlvbikpOworICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgdF9maWVsZCogc3VjY2VzcyA9IG5ldyB0X2ZpZWxkKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKKyAgICBzdWNjZXNzLT5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUSU9OQUwpOworICAgIHJlc3VsdC5hcHBlbmQoc3VjY2Vzcyk7CisgIH0KKworICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICB0X2ZpZWxkICp4ID0gKmZfaXRlcjsKKyAgICB0X2ZpZWxkICpveCA9IG5ldyB0X2ZpZWxkKHgtPmdldF90eXBlKCksIHgtPmdldF9uYW1lKCksIHgtPmdldF9rZXkoKSk7CisgICAgb3gtPnNldF9yZXEodF9maWVsZDo6VF9PUFRJT05BTCk7CisgICAgcmVzdWx0LmFwcGVuZChveCk7CisgIH0KKworICAvLyBnZW5lcmF0ZSB0aGUgcmVzdWx0IHN0cnVjdAorICBnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3QoZl9pbXBsXywgJnJlc3VsdCwgdHJ1ZSk7CisgIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9pbXBsZW1lbnRhdGlvbihmX2ltcGxfLCAmcmVzdWx0LCB0cnVlLCB0cnVlKTsKKworICBmb3IgKGZfaXRlciA9IHJlc3VsdC5nZXRfbWVtYmVycygpLmJlZ2luKCk7IGZfaXRlciAhPSByZXN1bHQuZ2V0X21lbWJlcnMoKS5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICBkZWxldGUgKmZfaXRlcjsKKyAgfQorfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgcHJvdG9jb2wgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBwcm90b2NvbCBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX3Byb3RvY29sKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICBzdHJpbmcgZG9jID0gdHNlcnZpY2UtPmdldF9kb2MoKTsKKyAgICBnZW5lcmF0ZV9kb2NzdHJpbmcob3V0LCBkb2MpOworCisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBwcm90b2NvbCAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpOworICAgIHRfc2VydmljZSogcGFyZW50ID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgICAgaWYgKHBhcmVudCAhPSBOVUxMKSB7CisgICAgICBvdXQgPDwgIiA6ICIgPDwgcGFyZW50LT5nZXRfbmFtZSgpOworICAgIH0KKyAgICBibG9ja19vcGVuKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisKKyAgICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgICAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgICAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGZ1bmN0aW9uX2RvY3N0cmluZyhvdXQsICpmX2l0ZXIpOworICAgICAgaW5kZW50KG91dCkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHByb3RvY29sICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCk7CisgICAgYmxvY2tfb3BlbihvdXQpOworCisgICAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICAgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiICAvLyBleGNlcHRpb25zOiAiOworICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgIG91dCA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKSArICIsICI7CisgICAgICB9CisgICAgICBvdXQgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGFuIGFzeW5jaHJvbm91cyBzZXJ2aWNlIHByb3RvY29sIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgcHJvdG9jb2wgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3dpZnRfc2VydmljZV9wcm90b2NvbF9hc3luYyhvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgaWYgKCFnZW5fY29jb2FfKSB7CisgICAgc3RyaW5nIGRvYyA9IHRzZXJ2aWNlLT5nZXRfZG9jKCk7CisgICAgZ2VuZXJhdGVfZG9jc3RyaW5nKG91dCwgZG9jKTsKKyAgfQorICBpbmRlbnQob3V0KSA8PCAicHVibGljIHByb3RvY29sICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkFzeW5jIjsKKworICBibG9ja19vcGVuKG91dCk7CisgIGlmICghZ2VuX2NvY29hXykgeyAgb3V0IDw8IGVuZGw7IH0KKworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgYXN5bmNfZnVuY3Rpb25fZG9jc3RyaW5nKG91dCwgKmZfaXRlcik7CisgICAgICBpbmRlbnQob3V0KSA8PCBhc3luY19mdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbCA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgb3V0IDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCBhc3luY19mdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKKyAgICAgIGlmIChwcm9taXNlX2tpdF8pIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgcHJvbWlzZV9mdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKKyAgICAgIH0gLy8KKyAgICAgIG91dCA8PCBlbmRsOworICAgIH0KKyAgfQorICBibG9ja19jbG9zZShvdXQpOworICBvdXQgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBjbGllbnQgaW50ZXJmYWNlIGRlZmluaXRpb24gZm9yCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50KG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3BlbiBjbGFzcyAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJDbGllbnQiOy8vIDogIgorCisgICAgLy8gSW5oZXJpdCBmcm9tIFBhcmVudENsaWVudAorICAgIHRfc2VydmljZSogcGFyZW50ID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgICAgb3V0IDw8ICIgOiAiIDw8ICgocGFyZW50ID09IE5VTEwpID8gIlRDbGllbnQiIDogcGFyZW50LT5nZXRfbmFtZSgpICsgIkNsaWVudCIpOworICAgIG91dCA8PCAgIiAvKiAsICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIiAqLyI7CisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIG91dCA8PCBlbmRsOworICB9IGVsc2UgeworICAgIC8vIGEKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGNsYXNzICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkNsaWVudCAvKiA6ICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIiAqLyI7CisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIG91dCA8PCBlbmRsOworCisgICAgaW5kZW50KG91dCkgPDwgImxldCBfX2luUHJvdG9jb2wgOiBUUHJvdG9jb2wiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAibGV0IF9fb3V0UHJvdG9jb2wgOiBUUHJvdG9jb2wiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGluaXQoaW5vdXRQcm90b2NvbDogVFByb3RvY29sKSI7CisgICAgYmxvY2tfb3BlbihvdXQpOworCisgICAgaW5kZW50KG91dCkgPDwgIl9faW5Qcm90b2NvbCA9IGlub3V0UHJvdG9jb2wiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgIl9fb3V0UHJvdG9jb2wgPSBpbm91dFByb3RvY29sIiA8PCBlbmRsOworICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGluaXQoaW5Qcm90b2NvbDogVFByb3RvY29sLCBvdXRQcm90b2NvbDogVFByb3RvY29sKSI7CisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIGluZGVudChvdXQpIDw8ICJfX2luUHJvdG9jb2wgPSBpblByb3RvY29sIiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJfX291dFByb3RvY29sID0gb3V0UHJvdG9jb2wiIDw8IGVuZGw7CisgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKyAgfQorCisgIGJsb2NrX2Nsb3NlKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGludGVyZmFjZSBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGNsaWVudCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfYXN5bmMob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIGlmICghZ2VuX2NvY29hXykgeworICAgIGluZGVudChvdXQpIDw8ICJvcGVuIGNsYXNzICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICA8PCAiQXN5bmNDbGllbnQ8UHJvdG9jb2w6IFRQcm90b2NvbCwgRmFjdG9yeTogVEFzeW5jVHJhbnNwb3J0RmFjdG9yeT4iOy8vIDogIgorCisgICAgLy8gSW5oZXJpdCBmcm9tIFBhcmVudENsaWVudAorICAgIHRfc2VydmljZSogcGFyZW50ID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisKKyAgICBvdXQgPDwgIiA6ICIgPDwgKChwYXJlbnQgPT0gTlVMTCkgPyAiVCIgOiAgcGFyZW50LT5nZXRfbmFtZSgpKSArICJBc3luY0NsaWVudDxQcm90b2NvbCwgRmFjdG9yeT4iOworICAgIG91dCA8PCAgIiAvKiAsICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIiAqLyI7CisKKyAgICBibG9ja19vcGVuKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBjbGFzcyAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJBc3luY0NsaWVudCAvKiA6ICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIiAqLyI7CisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIG91dCA8PCBlbmRsOworCisgICAgaW5kZW50KG91dCkgPDwgImxldCBfX3Byb3RvY29sRmFjdG9yeSA6IFRQcm90b2NvbEZhY3RvcnkiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAibGV0IF9fdHJhbnNwb3J0RmFjdG9yeSA6IFRBc3luY1RyYW5zcG9ydEZhY3RvcnkiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGluaXQocHJvdG9jb2xGYWN0b3J5OiBUUHJvdG9jb2xGYWN0b3J5LCB0cmFuc3BvcnRGYWN0b3J5OiBUQXN5bmNUcmFuc3BvcnRGYWN0b3J5KSI7CisgICAgYmxvY2tfb3BlbihvdXQpOworCisgICAgaW5kZW50KG91dCkgPDwgIl9fcHJvdG9jb2xGYWN0b3J5ID0gcHJvdG9jb2xGYWN0b3J5IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJfX3RyYW5zcG9ydEZhY3RvcnkgPSB0cmFuc3BvcnRGYWN0b3J5IiA8PCBlbmRsOworICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisgIH0KKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgaW50ZXJmYWNlIGRlZmluaXRpb24uIEluIG90aGVyIHdvcmRzLAorICogdGhlIFRQcm9jZXNzIGltcGxlbWVudGF0aW9uIGZvciB0aGUgc2VydmljZSBkZWZpbml0aW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGNsaWVudCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmb3IKKyAqLwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3dpZnRfc2VydmljZV9zZXJ2ZXIob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIGlmICghZ2VuX2NvY29hXykgeworICAgIGluZGVudChvdXQpIDw8ICJvcGVuIGNsYXNzICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIlByb2Nlc3NvciAvKiAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICIgKi8iOworCisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIG91dCA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidHlwZWFsaWFzIFByb2Nlc3NvckhhbmRsZXJEaWN0aW9uYXJ5ID0gIgorICAgICAgICA8PCAiW1N0cmluZzogKEludDMyLCBUUHJvdG9jb2wsIFRQcm90b2NvbCwgIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiKSB0aHJvd3MgLT4gVm9pZF0iIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicHVibGljIHZhciBzZXJ2aWNlOiAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicHVibGljIHJlcXVpcmVkIGluaXQoc2VydmljZTogIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiKSI7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBjbGFzcyAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJQcm9jZXNzb3IgOiBOU09iamVjdCAvKiAiCisgICAgICAgICAgICAgICAgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIiAqLyI7CisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIG91dCA8PCBlbmRsOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0eXBlYWxpYXMgUHJvY2Vzc29ySGFuZGxlckRpY3Rpb25hcnkgPSAiCisgICAgICAgIDw8ICJbU3RyaW5nOiAoSW50LCBUUHJvdG9jb2wsIFRQcm90b2NvbCwgIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiKSB0aHJvd3MgLT4gVm9pZF0iIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAibGV0IHNlcnZpY2UgOiAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicHVibGljIGluaXQoc2VydmljZTogIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiKSI7CisgIH0KKworICBibG9ja19vcGVuKG91dCk7CisgIGluZGVudChvdXQpIDw8ICJzZWxmLnNlcnZpY2UgPSBzZXJ2aWNlIiA8PCBlbmRsOworICBibG9ja19jbG9zZShvdXQpOworICBvdXQgPDwgZW5kbDsKKworICBibG9ja19jbG9zZShvdXQpOworICBvdXQgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdpbGwgc2VuZCB0aGUgYXJndW1lbnRzCisgKiBmb3IgYSBzZXJ2aWNlIGZ1bmN0aW9uIHZpYSBhIHByb3RvY29sLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSAgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIGdlbmVyYXRlCisgKiBAcGFyYW0gbmVlZHNfcHJvdG9jb2wKKyAqICAgICAgICAgICAgICAgICAgV2V0aGVyIHRoZSBmaXJzdCBwYXJhbWV0ZXIgbXVzdCBiZSBhIHByb3RvY29sIG9yIGlmCisgKiAgICAgICAgICAgICAgICAgIHRoZSBwcm90b2NvbCBpcyB0byBiZSBhc3N1bWVkCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X3NlbmRfZnVuY3Rpb25faW1wbGVtZW50YXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UgKnRzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbmVlZHNfcHJvdG9jb2wpIHsKKworICBzdHJpbmcgZnVubmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKTsKKworICB0X2Z1bmN0aW9uIHNlbmRfZnVuY3Rpb24oZ190eXBlX2Jvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VuZF8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKTsKKworICBzdHJpbmcgYXJnc25hbWUgPSBmdW5jdGlvbl9hcmdzX2hlbHBlcl9zdHJ1Y3RfdHlwZSh0c2VydmljZSwgdGZ1bmN0aW9uKTsKKyAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisKKyAgc3RyaW5nIHByb3RvID0gbmVlZHNfcHJvdG9jb2wgPyAoZ2VuX2NvY29hXyA/ICJfX291dFByb3RvY29sIiA6ICJvbiBvdXRQcm90b2NvbCIpIDogIiI7CisgIC8vIE9wZW4gZnVuY3Rpb24KKyAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgZnVuYyAiIDw8IHNlbmRfZnVuY3Rpb24uZ2V0X25hbWUoKSA8PCAiKCIKKyAgICAgICAgICAgICAgPDwgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCksIHByb3RvLCB0cnVlKQorICAgICAgICAgICAgICA8PCAiKSB0aHJvd3MiOworICBibG9ja19vcGVuKG91dCk7CisgIGlmICghZ2VuX2NvY29hXykgeworICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdAorICAgIGluZGVudChvdXQpIDw8ICJ0cnkgb3V0UHJvdG9jb2wud3JpdGVNZXNzYWdlQmVnaW4obmFtZTogXCIiIDw8IGZ1bm5hbWUgPDwgIlwiLCAiCisgICAgICAgICAgICAgICAgPDwgInR5cGU6ICIgPDwgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkgPyAiLm9uZXdheSIgOiAiLmNhbGwiKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgInNlcXVlbmNlSUQ6IDApIiA8PCBlbmRsOworCisgICAgaW5kZW50KG91dCkgPDwgImxldCBhcmdzID0gIiA8PCBhcmdzbmFtZSA8PCAiKCI7CisKKyAgICAvLyB3cml0ZSBvdXQgZnVuY3Rpb24gcGFyYW1ldGVycworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOykgeworICAgICAgdF9maWVsZCAqdGZpZWxkID0gKCpmX2l0ZXIpOworICAgICAgb3V0IDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiOiAiIDw8IHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgICAgIGlmICgrK2ZfaXRlciAhPSBmaWVsZHMuZW5kKCkpIHsKKyAgICAgICAgb3V0IDw8ICIsICI7CisgICAgICB9CisgICAgfQorICAgIG91dCA8PCAiKSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAidHJ5IGFyZ3Mud3JpdGUodG86IG91dFByb3RvY29sKSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAidHJ5IG91dFByb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIG91dCA8PCBlbmRsOworCisgICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0CisgICAgaW5kZW50KG91dCkgPDwgInRyeSBfX291dFByb3RvY29sLndyaXRlTWVzc2FnZUJlZ2luV2l0aE5hbWUoXCIiIDw8IGZ1bm5hbWUgPDwgIlwiLCAiCisgICAgICAgICAgICAgICAgPDwgInR5cGU6ICIgPDwgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkgPyAiLk9ORVdBWSIgOiAiLkNBTEwiKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgInNlcXVlbmNlSUQ6IDApIiA8PCBlbmRsOworCisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBpbmRlbnQob3V0KSA8PCAibGV0IF9fYXJncyA9ICIgPDwgYXJnc25hbWUgPDwgIigiOworCisgICAgLy8gd3JpdGUgb3V0IGZ1bmN0aW9uIHBhcmFtZXRlcnMKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTspIHsKKyAgICAgIHRfZmllbGQgKnRmaWVsZCA9ICgqZl9pdGVyKTsKKyAgICAgIG91dCA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIjogIiA8PCB0ZmllbGQtPmdldF9uYW1lKCk7CisgICAgICBpZiAoKytmX2l0ZXIgIT0gZmllbGRzLmVuZCgpKSB7CisgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgfQorICAgIH0KKyAgICBvdXQgPDwgIikiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInRyeSAiIDw8IGFyZ3NuYW1lIDw8ICIud3JpdGVWYWx1ZShfX2FyZ3MsIHRvUHJvdG9jb2w6IF9fb3V0UHJvdG9jb2wpIiA8PCBlbmRsIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInRyeSBfX291dFByb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsOworICB9CisKKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdGhhdCB3aWxsIHJlY3YgdGhlIHJlc3VsdCBmb3IgYQorICogc2VydmljZSBmdW5jdGlvbiB2aWEgYSBwcm90b2NvbC4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlCisgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byBnZW5lcmF0ZQorICogQHBhcmFtIG5lZWRzX3Byb3RvY29sCisgKiAgICAgICAgICAgICAgICAgIFdldGhlciB0aGUgZmlyc3QgcGFyYW1ldGVyIG11c3QgYmUgYSBwcm90b2NvbCBvciBpZgorICogICAgICAgICAgICAgICAgICB0aGUgcHJvdG9jb2wgaXMgdG8gYmUgYXNzdW1lZAorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9yZWN2X2Z1bmN0aW9uX2ltcGxlbWVudGF0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXJ2aWNlKiB0c2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5lZWRzX3Byb3RvY29sKSB7CisKKyAgLy8gT3BlbiBmdW5jdGlvbgorICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBmdW5jIHJlY3ZfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOworICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICBpZiAobmVlZHNfcHJvdG9jb2wpIHsKKyAgICAgIG91dCA8PCAib24gaW5Qcm90b2NvbDogVFByb3RvY29sIjsKKyAgICB9CisgICAgb3V0IDw8ICIpIHRocm93cyI7CisgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgb3V0IDw8ICIgLT4gIiA8PCB0eXBlX25hbWUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKTsKKyAgICB9CisKKyAgICBibG9ja19vcGVuKG91dCk7CisKKyAgICAvLyBjaGVjayBmb3IgYW4gZXhjZXB0aW9uCisKKyAgICBpbmRlbnQob3V0KSA8PCAidHJ5IGluUHJvdG9jb2wucmVhZFJlc3VsdE1lc3NhZ2VCZWdpbigpICIgPDwgZW5kbDsKKworICAgIHN0cmluZyByZXN1bHRuYW1lID0gZnVuY3Rpb25fcmVzdWx0X2hlbHBlcl9zdHJ1Y3RfdHlwZSh0c2VydmljZSwgdGZ1bmN0aW9uKTsKKyAgICBpbmRlbnQob3V0KTsKKyAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpIHx8ICF0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKS5lbXB0eSgpKSB7CisgICAgICBvdXQgPDwgImxldCByZXN1bHQgPSAiOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgIl8gPSAiOworICAgIH0KKworICAgIHN0cmluZyByZXR1cm5fdHlwZV9uYW1lID0gdHlwZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSk7CisgICAgb3V0IDw8ICJ0cnkgIiA8PCByZXN1bHRuYW1lIDw8ICIucmVhZChmcm9tOiBpblByb3RvY29sKSIgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8ICJ0cnkgaW5Qcm90b2NvbC5yZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KKyAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgbGV0IHN1Y2Nlc3MgPSByZXN1bHQuc3VjY2VzcyI7CisgICAgICBibG9ja19vcGVuKG91dCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHN1Y2Nlc3MiIDw8IGVuZGw7CisgICAgICBibG9ja19jbG9zZShvdXQpOworICAgIH0KKworICAgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKworICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgbGV0ICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSByZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCk7CisgICAgICBibG9ja19vcGVuKG91dCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhyb3cgIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgZW5kbDsKKyAgICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgfQorCisgICAgLy8gSWYgeW91IGdldCBoZXJlIGl0J3MgYW4gZXhjZXB0aW9uLCB1bmxlc3MgYSB2b2lkIGZ1bmN0aW9uCisgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgInRocm93IFRBcHBsaWNhdGlvbkVycm9yKGVycm9yOiAubWlzc2luZ1Jlc3VsdChtZXRob2ROYW1lOiBcIiIKKyAgICAgICAgICAgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIpKSIgPDwgZW5kbDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKG5lZWRzX3Byb3RvY29sKSB7CisgICAgICBvdXQgPDwgIl9faW5Qcm90b2NvbDogVFByb3RvY29sIjsKKyAgICB9CisKKyAgICBvdXQgPDwgIikgdGhyb3dzIjsKKworICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgIG91dCA8PCAiIC0+ICIgPDwgdHlwZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSk7CisgICAgfQorCisgICAgYmxvY2tfb3BlbihvdXQpOworCisgICAgLy8gY2hlY2sgZm9yIGFuIGV4Y2VwdGlvbgorICAgIG91dCA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ0cnkgX19pblByb3RvY29sLnJlYWRSZXN1bHRNZXNzYWdlQmVnaW4oKSAiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBzdHJpbmcgcmVzdWx0bmFtZSA9IGZ1bmN0aW9uX3Jlc3VsdF9oZWxwZXJfc3RydWN0X3R5cGUodHNlcnZpY2UsIHRmdW5jdGlvbik7CisgICAgaW5kZW50KG91dCk7CisgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSB8fCAhdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCkuZW1wdHkoKSkgeworICAgICAgb3V0IDw8ICJsZXQgX19yZXN1bHQgPSAiOworICAgIH0KKyAgICBvdXQgPDwgInRyeSAiIDw8IHJlc3VsdG5hbWUgPDwgIi5yZWFkVmFsdWVGcm9tUHJvdG9jb2woX19pblByb3RvY29sKSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgaW5kZW50KG91dCkgPDwgInRyeSBfX2luUHJvdG9jb2wucmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCisgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmIGxldCBfX3N1Y2Nlc3MgPSBfX3Jlc3VsdC5zdWNjZXNzIjsKKyAgICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gX19zdWNjZXNzIiA8PCBlbmRsOworICAgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICB9CisKKyAgICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisKKyAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmIGxldCAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gX19yZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCk7CisgICAgICBibG9ja19vcGVuKG91dCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhyb3cgIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgZW5kbDsKKyAgICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgfQorCisgICAgLy8gSWYgeW91IGdldCBoZXJlIGl0J3MgYW4gZXhjZXB0aW9uLCB1bmxlc3MgYSB2b2lkIGZ1bmN0aW9uCisgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgInRocm93IE5TRXJyb3IoIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiZG9tYWluOiBUQXBwbGljYXRpb25FcnJvckRvbWFpbiwgIiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgImNvZGU6IEludChUQXBwbGljYXRpb25FcnJvci5NaXNzaW5nUmVzdWx0LnJhd1ZhbHVlKSwiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAidXNlckluZm86IFtUQXBwbGljYXRpb25FcnJvck1ldGhvZEtleTogXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCJdKSIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgfQorICB9CisKKyAgLy8gQ2xvc2UgZnVuY3Rpb24KKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGFuIGludm9jYXRpb24gb2YgYSBnaXZlbiB0aGUgc2VuZCBmdW5jdGlvbiBmb3IgdGhlCisgKiBzZXJ2aWNlIGZ1bmN0aW9uLgorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYW4gaW1wbGVtZW50YXRpb24gZm9yCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X3NlbmRfZnVuY3Rpb25faW52b2NhdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisKKyAgaW5kZW50KG91dCkgPDwgInRyeSBzZW5kXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKKworICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTspIHsKKyAgICBvdXQgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6ICIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIGlmICgrK2ZfaXRlciAhPSBmaWVsZHMuZW5kKCkpIHsKKyAgICAgIG91dCA8PCAiLCAiOworICAgIH0KKyAgfQorCisgIG91dCA8PCAiKSIgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYW4gaW52b2NhdGlvbiBvZiBhIGdpdmVuIHRoZSBzZW5kIGZ1bmN0aW9uIGZvciB0aGUKKyAqIHNlcnZpY2UgZnVuY3Rpb24uIFRoaXMgaXMgZm9yIGFzeW5jaHJvbm91cyBwcm90b2NvbHMuCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhbiBpbXBsZW1lbnRhdGlvbiBmb3IKKyAqLwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfc2VuZF9hc3luY19mdW5jdGlvbl9pbnZvY2F0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKworICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgIGlmICghZ2VuX2NvY29hXykgeworICAgIGluZGVudChvdXQpIDw8ICJ0cnkgc2VuZF8iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKG9uOiBwcm90byI7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgInRyeSBzZW5kXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoX19wcm90b2NvbCI7IC8vCisgIH0KKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIG91dCA8PCAiLCAiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOiAiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgfQorCisgIG91dCA8PCAiKSIgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiB2aWEgZXh0ZW5zaW9uLgorICoKKyAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhbiBpbXBsZW1lbnRhdGlvbiBmb3IKKyAqLwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfaW1wbGVtZW50YXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXJ2aWNlKiB0c2VydmljZSkgeworCisgIHN0cmluZyBuYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiQ2xpZW50IjsKKyAgaW5kZW50KG91dCkgPDwgImV4dGVuc2lvbiAiIDw8IG5hbWUgPDwgIiA6ICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCk7CisgIGJsb2NrX29wZW4ob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gZ2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisKKyAgICBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9zZW5kX2Z1bmN0aW9uX2ltcGxlbWVudGF0aW9uKG91dCwgdHNlcnZpY2UsICpmX2l0ZXIsIGZhbHNlKTsKKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfcmVjdl9mdW5jdGlvbl9pbXBsZW1lbnRhdGlvbihvdXQsIHRzZXJ2aWNlLCAqZl9pdGVyLCBmYWxzZSk7CisgICAgfQorCisgICAgLy8gT3BlbiBmdW5jdGlvbgorICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcik7CisgICAgYmxvY2tfb3BlbihvdXQpOworCisgICAgaWYgKGdlbl9jb2NvYV8pIHsgb3V0IDw8IGVuZGw7IH0KKworICAgIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X3NlbmRfZnVuY3Rpb25faW52b2NhdGlvbihvdXQsICpmX2l0ZXIpOworICAgIGlmICghZ2VuX2NvY29hXykgeworICAgICAgaW5kZW50KG91dCkgPDwgInRyeSBvdXRQcm90b2NvbC50cmFuc3BvcnQuZmx1c2goKSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAidHJ5IF9fb3V0UHJvdG9jb2wudHJhbnNwb3J0KCkuZmx1c2goKSIgPDwgZW5kbCA8PCBlbmRsOworICAgIH0KKworICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ0cnkgcmVjdl8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCkiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRyeSByZWN2XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoKSIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKyAgfQorICBibG9ja19jbG9zZShvdXQpOworICBvdXQgPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGFzeW5jaHJvbm91cyBjbGllbnQgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gdmlhIGV4dGVuc2lvbi4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYW4gaW1wbGVtZW50YXRpb24gZm9yCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X2FzeW5jX2ltcGxlbWVudGF0aW9uKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBpZiAoZ2VuX2NvY29hXykgeworICAgIGdlbmVyYXRlX29sZF9zd2lmdF9zZXJ2aWNlX2NsaWVudF9hc3luY19pbXBsZW1lbnRhdGlvbihvdXQsIHRzZXJ2aWNlKTsKKyAgICByZXR1cm47CisgIH0KKyAgc3RyaW5nIG5hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKSArICJBc3luY0NsaWVudCI7CisgIHN0cmluZyBwcm90b2NvbF9uYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiQXN5bmMiOworCisgIGluZGVudChvdXQpIDw8ICJleHRlbnNpb24gIiA8PCBuYW1lIDw8ICIgOiAiIDw8IHByb3RvY29sX25hbWU7CisgIGJsb2NrX29wZW4ob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gZ2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisKKyAgICBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9zZW5kX2Z1bmN0aW9uX2ltcGxlbWVudGF0aW9uKG91dCwgdHNlcnZpY2UsICpmX2l0ZXIsIHRydWUpOworCisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9yZWN2X2Z1bmN0aW9uX2ltcGxlbWVudGF0aW9uKG91dCwgdHNlcnZpY2UsICpmX2l0ZXIsIHRydWUpOworICAgIH0KKworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCBhc3luY19mdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcik7CisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIG91dCA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAibGV0IHRyYW5zcG9ydCAgID0gZmFjdG9yeS5uZXdUcmFuc3BvcnQoKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAibGV0IHByb3RvID0gUHJvdG9jb2wob246IHRyYW5zcG9ydCkiIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbDsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZG8iOworICAgIGJsb2NrX29wZW4ob3V0KTsKKworICAgIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X3NlbmRfYXN5bmNfZnVuY3Rpb25faW52b2NhdGlvbihvdXQsICpmX2l0ZXIpOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gY2F0Y2ggbGV0IGVycm9yIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJjb21wbGV0aW9uKC5lcnJvcihlcnJvcikpIiA8PCBlbmRsOworICAgIGJsb2NrX2Nsb3NlKG91dCk7CisKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGJvb2wgcmV0X2lzX3ZvaWQgPSAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKTsKKyAgICBib29sIGlzX29uZXdheSA9ICgqZl9pdGVyKS0+aXNfb25ld2F5KCk7CisKKyAgICBzdHJpbmcgZXJyb3JfY29tcGxldGlvbl9jYWxsID0gImNvbXBsZXRpb24oLmVycm9yKGVycm9yKSkiOworICAgIGluZGVudChvdXQpIDw8ICJ0cmFuc3BvcnQuZmx1c2giOworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIih0cmFucywgZXJyb3IpIGluIiA8PCBlbmRsIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiBsZXQgZXJyb3IgPSBlcnJvciI7CisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBlcnJvcl9jb21wbGV0aW9uX2NhbGwgPDwgZW5kbDsKKyAgICBibG9ja19jbG9zZShvdXQpOworCisgICAgaWYgKCFpc19vbmV3YXkpIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZG8iOworICAgICAgYmxvY2tfb3BlbihvdXQpOworICAgICAgaW5kZW50KG91dCk7CisgICAgICBpZiAoIXJldF9pc192b2lkKSB7CisgICAgICAgIG91dCA8PCAibGV0IHJlc3VsdCA9ICI7CisgICAgICB9CisgICAgICBvdXQgPDwgInRyeSBzZWxmLnJlY3ZfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIihvbjogcHJvdG8pIiA8PCBlbmRsOworCisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgKHJldF9pc192b2lkID8gImNvbXBsZXRpb24oLnN1Y2Nlc3MoVm9pZCgpKSkiIDogImNvbXBsZXRpb24oLnN1Y2Nlc3MocmVzdWx0KSkiKSA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBjYXRjaCBsZXQgZXJyb3IgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGVycm9yX2NvbXBsZXRpb25fY2FsbCA8PCBlbmRsOworCisgICAgICBibG9ja19jbG9zZShvdXQpOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImNvbXBsZXRpb24oLnN1Y2Nlc3MoVm9pZCgpKSkiIDw8IGVuZGw7CisgICAgfQorICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgYmxvY2tfY2xvc2Uob3V0KTsKKworICB9CisgIGJsb2NrX2Nsb3NlKG91dCk7CisgIG91dCA8PCBlbmRsOworfQorCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9vbGRfc3dpZnRfc2VydmljZV9jbGllbnRfYXN5bmNfaW1wbGVtZW50YXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UpIHsKKworICBzdHJpbmcgbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIkFzeW5jQ2xpZW50IjsKKyAgc3RyaW5nIHByb3RvY29sX25hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKSArICJBc3luYyI7CisKKyAgaW5kZW50KG91dCkgPDwgImV4dGVuc2lvbiAiIDw8IG5hbWUgPDwgIiA6ICIgPDwgcHJvdG9jb2xfbmFtZTsKKyAgYmxvY2tfb3BlbihvdXQpOworICBvdXQgPDwgZW5kbDsKKworICAvLyBnZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKworICAgIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X3NlbmRfZnVuY3Rpb25faW1wbGVtZW50YXRpb24ob3V0LCB0c2VydmljZSwgKmZfaXRlciwgdHJ1ZSk7CisKKyAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X3JlY3ZfZnVuY3Rpb25faW1wbGVtZW50YXRpb24ob3V0LCB0c2VydmljZSwgKmZfaXRlciwgdHJ1ZSk7CisgICAgfQorCisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IGFzeW5jX2Z1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKTsKKyAgICBibG9ja19vcGVuKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImxldCBfX3RyYW5zcG9ydCA9IF9fdHJhbnNwb3J0RmFjdG9yeS5uZXdUcmFuc3BvcnQoKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAibGV0IF9fcHJvdG9jb2wgPSBfX3Byb3RvY29sRmFjdG9yeS5uZXdQcm90b2NvbE9uVHJhbnNwb3J0KF9fdHJhbnNwb3J0KSIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsOworCisgICAgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfc2VuZF9hc3luY19mdW5jdGlvbl9pbnZvY2F0aW9uKG91dCwgKmZfaXRlcik7CisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBpbmRlbnQob3V0KSA8PCAiX190cmFuc3BvcnQuZmx1c2hXaXRoQ29tcGxldGlvbigiOworCisgICAgaWYgKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgIG91dCA8PCAic3VjY2VzcywgZmFpbHVyZTogZmFpbHVyZSkiIDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UgeworICAgICAgYmxvY2tfb3BlbihvdXQpOworICAgICAgaW5kZW50KG91dCkgPDwgImRvIjsKKyAgICAgIGJsb2NrX29wZW4ob3V0KTsKKworICAgICAgaW5kZW50KG91dCk7CisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIG91dCA8PCAibGV0IHJlc3VsdCA9ICI7CisgICAgICB9CisgICAgICBvdXQgPDwgInRyeSBzZWxmLnJlY3ZfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIihfX3Byb3RvY29sKSIgPDwgZW5kbDsKKworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJzdWNjZXNzKCI7CisgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICAgIG91dCA8PCAicmVzdWx0IjsKKyAgICAgIH0KKyAgICAgIG91dCA8PCAiKSIgPDwgZW5kbDsKKworICAgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJjYXRjaCBsZXQgZXJyb3IiOworICAgICAgYmxvY2tfb3BlbihvdXQpOworICAgICAgaW5kZW50KG91dCkgPDwgImZhaWx1cmUoZXJyb3IgYXMgTlNFcnJvcikiIDw8IGVuZGw7CisgICAgICBibG9ja19jbG9zZShvdXQpOworICAgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICAgIGluZGVudChvdXQpIDw8ICIsIGZhaWx1cmU6IGZhaWx1cmUpIiA8PCBlbmRsOworICAgIH0KKworICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisKKyAgICAvLyBQcm9taXNlIGZ1bmN0aW9uCisgICAgaWYgKHByb21pc2Vfa2l0XykgeworCisgICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgcHJvbWlzZV9mdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcik7CisgICAgICBibG9ja19vcGVuKG91dCk7CisKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAibGV0IChfX3Byb21pc2UsIF9fZnVsZmlsbCwgX19yZWplY3QpID0gUHJvbWlzZTwiIDw8IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpIDw8ICI+LnBlbmRpbmdQcm9taXNlKCkiIDw8IGVuZGwgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJsZXQgX190cmFuc3BvcnQgPSBfX3RyYW5zcG9ydEZhY3RvcnkubmV3VHJhbnNwb3J0KCkiIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAibGV0IF9fcHJvdG9jb2wgPSBfX3Byb3RvY29sRmFjdG9yeS5uZXdQcm90b2NvbE9uVHJhbnNwb3J0KF9fdHJhbnNwb3J0KSIgPDwgZW5kbAorICAgICAgICAgIDw8IGVuZGw7CisKKyAgICAgIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X3NlbmRfYXN5bmNfZnVuY3Rpb25faW52b2NhdGlvbihvdXQsICpmX2l0ZXIpOworICAgICAgb3V0IDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiX190cmFuc3BvcnQuZmx1c2hXaXRoQ29tcGxldGlvbigiOworCisgICAgICBpZiAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgeworICAgICAgICBvdXQgPDwgInsgX19mdWxmaWxsKCkgfSwgZmFpbHVyZTogeyBfX3JlamVjdCgkMCkgfSkiIDw8IGVuZGw7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgYmxvY2tfb3BlbihvdXQpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAiZG8iOworICAgICAgICBibG9ja19vcGVuKG91dCk7CisKKyAgICAgICAgaW5kZW50KG91dCk7CisgICAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgICBvdXQgPDwgImxldCByZXN1bHQgPSAiOworICAgICAgICB9CisgICAgICAgIG91dCA8PCAidHJ5IHNlbGYucmVjdl8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKF9fcHJvdG9jb2wpIiA8PCBlbmRsOworCisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiX19mdWxmaWxsKCI7CisgICAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgICBvdXQgPDwgInJlc3VsdCI7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8ICIpIiA8PCBlbmRsOworCisgICAgICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJjYXRjaCBsZXQgZXJyb3IiOworICAgICAgICBibG9ja19vcGVuKG91dCk7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJfX3JlamVjdChlcnJvcikiIDw8IGVuZGw7CisgICAgICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgICAgIGJsb2NrX2Nsb3NlKG91dCk7CisKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIiwgZmFpbHVyZTogeyBlcnJvciBpbiAiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAiX19yZWplY3QoZXJyb3IpIiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBpbmRlbnQob3V0KSA8PCAifSkiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gX19wcm9taXNlIiA8PCBlbmRsOworICAgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICAgIG91dCA8PCBlbmRsOworCisgICAgfQorCisgIH0KKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgaW1wbGVtZW50YXRpb24uCisgKgorICogSW1wbGVtZW50ZWQgYnkgZ2VuZXJhdGluZyBhIGJsb2NrIGZvciBlYWNoIHNlcnZpY2UgZnVuY3Rpb24gdGhhdAorICogaGFuZGxlcyB0aGUgcHJvY2Vzc2luZyBvZiB0aGF0IGZ1bmN0aW9uLiBUaGUgYmxvY2tzIGFyZSBzdG9yZWQgaW4KKyAqIGEgbWFwIGFuZCBsb29rZWQgdXAgdmlhIGZ1bmN0aW9uL21lc3NhZ2UgbmFtZS4KKyAqCisgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYW4gaW1wbGVtZW50YXRpb24gZm9yCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3NlcnZpY2Vfc2VydmVyX2ltcGxlbWVudGF0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UpIHsKKworICBzdHJpbmcgbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIlByb2Nlc3NvciI7CisKKyAgaW5kZW50KG91dCkgPDwgImV4dGVuc2lvbiAiIDw8IG5hbWUgPDwgIiA6IFRQcm9jZXNzb3IiOworICBibG9ja19vcGVuKG91dCk7CisgIG91dCA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAic3RhdGljIGxldCBwcm9jZXNzb3JIYW5kbGVycyIgPDwgKGdlbl9jb2NvYV8gPyAiICIgOiAiIikgPDwgIjogUHJvY2Vzc29ySGFuZGxlckRpY3Rpb25hcnkgPSI7CisgIGJsb2NrX29wZW4ob3V0KTsKKworICBvdXQgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgcHJvY2Vzc29ySGFuZGxlcnMgPSBQcm9jZXNzb3JIYW5kbGVyRGljdGlvbmFyeSgpIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gZ2VuZXJhdGUgbWV0aG9kIG1hcCBmb3Igcm91dGluZyBpbmNvbWluZyBjYWxscworICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKworICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbiA9ICpmX2l0ZXI7CisKKyAgICBzdHJpbmcgYXJnc190eXBlID0gZnVuY3Rpb25fYXJnc19oZWxwZXJfc3RydWN0X3R5cGUodHNlcnZpY2UsICpmX2l0ZXIpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwcm9jZXNzb3JIYW5kbGVyc1tcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIl0gPSB7IHNlcXVlbmNlSUQsIGluUHJvdG9jb2wsIG91dFByb3RvY29sLCBoYW5kbGVyIGluIiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAibGV0IGFyZ3MgPSB0cnkgIiA8PCBhcmdzX3R5cGUgPDwgIi5yZWFkKGZyb206IGluUHJvdG9jb2wpIiA8PCBlbmRsCisgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0cnkgaW5Qcm90b2NvbC5yZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsCisgICAgICAgICAgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJsZXQgYXJncyA9IHRyeSAiIDw8IGFyZ3NfdHlwZSA8PCAiLnJlYWRWYWx1ZUZyb21Qcm90b2NvbChpblByb3RvY29sKSIgPDwgZW5kbAorICAgICAgICAgIDw8IGVuZGwKKyAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidHJ5IGluUHJvdG9jb2wucmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbAorICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorCisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICkgeworICAgICAgc3RyaW5nIHJlc3VsdF90eXBlID0gZnVuY3Rpb25fcmVzdWx0X2hlbHBlcl9zdHJ1Y3RfdHlwZSh0c2VydmljZSwgdGZ1bmN0aW9uKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ2YXIgcmVzdWx0ID0gIiA8PCByZXN1bHRfdHlwZSA8PCAiKCkiIDw8IGVuZGw7CisKKyAgICAgIGluZGVudChvdXQpIDw8ICJkbyI7CisgICAgICBibG9ja19vcGVuKG91dCk7CisKKyAgICAgIGluZGVudChvdXQpOworICAgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgICBvdXQgPDwgInJlc3VsdC5zdWNjZXNzID0gIjsKKyAgICAgIH0KKyAgICAgIG91dCA8PCAidHJ5IGhhbmRsZXIuIiA8PCAoZ2VuX2NvY29hXyA/IGZ1bmN0aW9uX25hbWUodGZ1bmN0aW9uKSA6IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgPDwgIigiOworCisgICAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7KSB7CisgICAgICAgIHN0cmluZyBmaWVsZE5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgICAgIGlmICghZ2VuX2NvY29hXyB8fCBmX2l0ZXIgIT0gZmllbGRzLmJlZ2luKCkpIHsKKyAgICAgICAgICBvdXQgPDwgZmllbGROYW1lIDw8ICI6ICI7CisgICAgICAgIH0KKworICAgICAgICBvdXQgPDwgImFyZ3MuIiA8PCBmaWVsZE5hbWU7CisgICAgICAgIGlmICgrK2ZfaXRlciAhPSBmaWVsZHMuZW5kKCkpIHsKKyAgICAgICAgICBvdXQgPDwgIiwgIjsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBvdXQgPDwgIikiIDw8IGVuZGw7CisgICAgICBibG9ja19jbG9zZShvdXQpOworCisgICAgICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHhmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKworICAgICAgaWYgKCFnZW5fY29jb2FfKSB7CisgICAgICAgIGZvciAoeF9pdGVyID0geGZpZWxkcy5iZWdpbigpOyB4X2l0ZXIgIT0geGZpZWxkcy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgICBpbmRlbnQob3V0KSA8PCAiY2F0Y2ggbGV0IGVycm9yIGFzICI7CisKKyAgICAgICAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSAoKnhfaXRlciktPmdldF90eXBlKCktPmdldF9wcm9ncmFtKCk7CisgICAgICAgICAgaWYgKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSA9PSAiRXJyb3IiICYmIG5hbWVzcGFjZWRfICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKKyAgICAgICAgICAgIG91dCA8PCBnZXRfcmVhbF9zd2lmdF9tb2R1bGUocHJvZ3JhbSkgPDwgIi4iOworICAgICAgICAgIH0KKyAgICAgICAgICBvdXQgPDwgKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpOworCisgICAgICAgICAgb3V0IDw8ICIgeyByZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IGVycm9yIH0iIDw8IGVuZGw7CisgICAgICAgIH0KKworICAgICAgICBpbmRlbnQob3V0KSA8PCAiY2F0Y2ggbGV0IGVycm9yIHsgdGhyb3cgZXJyb3IgfSIgPDwgZW5kbDsKKyAgICAgICAgb3V0IDw8IGVuZGw7CisKKyAgICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0cnkgb3V0UHJvdG9jb2wud3JpdGVNZXNzYWdlQmVnaW4obmFtZTogXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIsIHR5cGU6IC5yZXBseSwgc2VxdWVuY2VJRDogc2VxdWVuY2VJRCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInRyeSByZXN1bHQud3JpdGUodG86IG91dFByb3RvY29sKSIgPDwgZW5kbAorICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidHJ5IG91dFByb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBmb3IgKHhfaXRlciA9IHhmaWVsZHMuYmVnaW4oKTsgeF9pdGVyICE9IHhmaWVsZHMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgImNhdGNoIGxldCBlcnJvciBhcyAiIDw8ICgqeF9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKTsKKyAgICAgICAgICBibG9ja19vcGVuKG91dCk7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgInJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gZXJyb3IiIDw8IGVuZGw7CisgICAgICAgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICAgICAgfQorCisgICAgICAgIGluZGVudChvdXQpIDw8ICJjYXRjaCBsZXQgZXJyb3IiOworICAgICAgICBibG9ja19vcGVuKG91dCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGhyb3cgZXJyb3IiIDw8IGVuZGw7CisgICAgICAgIGJsb2NrX2Nsb3NlKG91dCk7CisKKyAgICAgICAgb3V0IDw8IGVuZGw7CisKKyAgICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0cnkgb3V0UHJvdG9jb2wud3JpdGVNZXNzYWdlQmVnaW5XaXRoTmFtZShcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIiwgdHlwZTogLlJFUExZLCBzZXF1ZW5jZUlEOiBzZXF1ZW5jZUlEKSIgPDwgZW5kbAorICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidHJ5ICIgPDwgcmVzdWx0X3R5cGUgPDwgIi53cml0ZVZhbHVlKHJlc3VsdCwgdG9Qcm90b2NvbDogb3V0UHJvdG9jb2wpIiA8PCBlbmRsCisgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0cnkgb3V0UHJvdG9jb2wud3JpdGVNZXNzYWdlRW5kKCkiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgYmxvY2tfY2xvc2Uob3V0KTsKKworICB9CisKKyAgaW5kZW50KG91dCkgPDwgInJldHVybiBwcm9jZXNzb3JIYW5kbGVycyIgPDwgZW5kbDsKKworICBibG9ja19jbG9zZShvdXQsZmFsc2UpOworICBvdXQgPDwgIigpIiA8PCBlbmRsOworICBvdXQgPDwgZW5kbDsKKworICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmMgcHJvY2VzcyhvbiBpblByb3RvY29sOiBUUHJvdG9jb2wsIG91dFByb3RvY29sOiBUUHJvdG9jb2wpIHRocm93cyI7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jIHByb2Nlc3NPbklucHV0UHJvdG9jb2woaW5Qcm90b2NvbDogVFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCBvdXRQcm90b2NvbDogVFByb3RvY29sKSB0aHJvd3MiOworICB9CisgIGJsb2NrX29wZW4ob3V0KTsKKworICBvdXQgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJsZXQgKG1lc3NhZ2VOYW1lLCBfLCBzZXF1ZW5jZUlEKSA9IHRyeSBpblByb3RvY29sLnJlYWRNZXNzYWdlQmVnaW4oKSIgPDwgZW5kbAorICAgICAgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgImlmIGxldCBwcm9jZXNzb3JIYW5kbGVyID0gIiA8PCBuYW1lIDw8ICIucHJvY2Vzc29ySGFuZGxlcnNbbWVzc2FnZU5hbWVdIjsKKyAgYmxvY2tfb3BlbihvdXQpOworICBvdXQgPDwgaW5kZW50KCkgPDwgImRvIjsKKyAgYmxvY2tfb3BlbihvdXQpOworICBvdXQgPDwgaW5kZW50KCkgPDwgInRyeSBwcm9jZXNzb3JIYW5kbGVyKHNlcXVlbmNlSUQsIGluUHJvdG9jb2wsIG91dFByb3RvY29sLCBzZXJ2aWNlKSIgPDwgZW5kbDsKKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgaWYgKCFnZW5fY29jb2FfKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJjYXRjaCBsZXQgZXJyb3IgYXMgVEFwcGxpY2F0aW9uRXJyb3IiOworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRyeSBvdXRQcm90b2NvbC53cml0ZUV4Y2VwdGlvbihtZXNzYWdlTmFtZTogbWVzc2FnZU5hbWUsIHNlcXVlbmNlSUQ6IHNlcXVlbmNlSUQsIGV4OiBlcnJvcikiIDw8IGVuZGw7CisgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICBibG9ja19jbG9zZShvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZWxzZSI7CisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidHJ5IGluUHJvdG9jb2wuc2tpcCh0eXBlOiAuc3RydWN0KSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAidHJ5IGluUHJvdG9jb2wucmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAibGV0IGV4ID0gVEFwcGxpY2F0aW9uRXJyb3IoZXJyb3I6IC51bmtub3duTWV0aG9kKG1ldGhvZE5hbWU6IG1lc3NhZ2VOYW1lKSkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInRyeSBvdXRQcm90b2NvbC53cml0ZUV4Y2VwdGlvbihtZXNzYWdlTmFtZTogbWVzc2FnZU5hbWUsICIKKyAgICAgICAgPDwgInNlcXVlbmNlSUQ6IHNlcXVlbmNlSUQsIGV4OiBleCkiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJjYXRjaCBsZXQgZXJyb3IgYXMgTlNFcnJvciI7CisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidHJ5IG91dFByb3RvY29sLndyaXRlRXhjZXB0aW9uRm9yTWVzc2FnZU5hbWUobWVzc2FnZU5hbWUsIHNlcXVlbmNlSUQ6IHNlcXVlbmNlSUQsIGV4OiBlcnJvcikiIDw8IGVuZGw7CisgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICBibG9ja19jbG9zZShvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZWxzZSI7CisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidHJ5IGluUHJvdG9jb2wuc2tpcFR5cGUoLlNUUlVDVCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInRyeSBpblByb3RvY29sLnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInRyeSBvdXRQcm90b2NvbC53cml0ZUV4Y2VwdGlvbkZvck1lc3NhZ2VOYW1lKG1lc3NhZ2VOYW1lLCIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInNlcXVlbmNlSUQ6IHNlcXVlbmNlSUQsIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJleDogTlNFcnJvcigiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJkb21haW46IFRBcHBsaWNhdGlvbkVycm9yRG9tYWluLCAiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImNvZGU6IEludChUQXBwbGljYXRpb25FcnJvci5Vbmtub3duTWV0aG9kLnJhd1ZhbHVlKSwgIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ1c2VySW5mbzogW1RBcHBsaWNhdGlvbkVycm9yTWV0aG9kS2V5OiBtZXNzYWdlTmFtZV0pKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudF9kb3duKCk7CisgIH0KKworICBibG9ja19jbG9zZShvdXQpOworICBibG9ja19jbG9zZShvdXQpOworICBibG9ja19jbG9zZShvdXQpOworICBvdXQgPDwgZW5kbDsKK30KKworLyoqCisgKiBSZXR1cm5zIGFuIFN3aWZ0IG5hbWUKKyAqCisgKiBAcGFyYW0gdHR5cGUgVGhlIHR5cGUKKyAqIEBwYXJhbSBjbGFzc19yZWYgRG8gd2Ugd2FudCBhIENsYXNzIHJlZmVyZW5jZSBpc3RlYWQgb2YgYSB0eXBlIHJlZmVyZW5jZT8KKyAqIEByZXR1cm4gU3dpZnQgdHlwZSBuYW1lLCBpLmUuIERpY3Rpb25hcnk8S2V5LFZhbHVlPgorICovCitzdHJpbmcgdF9zd2lmdF9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGlzX29wdGlvbmFsLCBib29sIGlzX2ZvcmNlZCkgeworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHJlc3VsdCArPSBiYXNlX3R5cGVfbmFtZSgodF9iYXNlX3R5cGUqKXR0eXBlKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X21hcCAqbWFwID0gKHRfbWFwICopdHR5cGU7CisgICAgcmVzdWx0ICs9ICJUTWFwPCIgKyB0eXBlX25hbWUobWFwLT5nZXRfa2V5X3R5cGUoKSkgKyAiLCAiICsgdHlwZV9uYW1lKG1hcC0+Z2V0X3ZhbF90eXBlKCkpICsgIj4iOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHRfc2V0ICpzZXQgPSAodF9zZXQgKil0dHlwZTsKKyAgICByZXN1bHQgKz0gIlRTZXQ8IiArIHR5cGVfbmFtZShzZXQtPmdldF9lbGVtX3R5cGUoKSkgKyAiPiI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHRfbGlzdCAqbGlzdCA9ICh0X2xpc3QgKil0dHlwZTsKKyAgICByZXN1bHQgKz0gIlRMaXN0PCIgKyB0eXBlX25hbWUobGlzdC0+Z2V0X2VsZW1fdHlwZSgpKSArICI+IjsKKyAgfQorICBlbHNlIHsKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKKyAgICBpZiAobmFtZXNwYWNlZF8gJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgeworICAgICAgcmVzdWx0ICs9IGdldF9yZWFsX3N3aWZ0X21vZHVsZShwcm9ncmFtKSArICIuIjsKKyAgICB9CisgICAgcmVzdWx0ICs9IHR0eXBlLT5nZXRfbmFtZSgpOworICB9CisKKyAgaWYgKGlzX29wdGlvbmFsKSB7CisgICAgcmVzdWx0ICs9ICI/IjsKKyAgfQorICBpZiAoaXNfZm9yY2VkKSB7CisgICAgcmVzdWx0ICs9ICIhIjsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgU3dpZnQgdHlwZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSB0aHJpZnQgdHlwZS4KKyAqCisgKiBAcGFyYW0gdGJhc2UgVGhlIGJhc2UgdHlwZQorICovCitzdHJpbmcgdF9zd2lmdF9nZW5lcmF0b3I6OmJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0eXBlKSB7CisgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSB0eXBlLT5nZXRfYmFzZSgpOworCisgIHN3aXRjaCAodGJhc2UpIHsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgIHJldHVybiAiVm9pZCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgcmV0dXJuIGdlbl9jb2NvYV8gPyAiVEJpbmFyeSIgOiAiRGF0YSI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAiU3RyaW5nIjsKKyAgICB9CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICByZXR1cm4gIkJvb2wiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIHJldHVybiAiSW50OCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIHJldHVybiAiSW50MTYiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICByZXR1cm4gIkludDMyIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgcmV0dXJuICJJbnQ2NCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgIHJldHVybiAiRG91YmxlIjsKKyAgZGVmYXVsdDoKKyAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFN3aWZ0IG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgfQorfQorCisvKioKKyAqIFJlbmRlcnMgZnVsbCBjb25zdGFudCB2YWx1ZSAoYXMgd291bGQgYmUgc2VlbiBhZnRlciBhbiAnPScpCisgKgorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgb3V0IDw8ICJcIiIgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAiXCIiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgb3V0IDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIG91dCA8PCB0eXBlX25hbWUodHlwZSkgPDwgIigiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICIpIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgb3V0IDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKCI7CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKKyAgICAgIH0KKyAgICAgIG91dCA8PCAiKSI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIG91dCA8PCAoZ2VuX2NvY29hXyA/IHZhbHVlLT5nZXRfaWRlbnRpZmllcigpIDogZW51bV9jb25zdF9uYW1lKHZhbHVlLT5nZXRfaWRlbnRpZmllcigpKSk7IC8vIFN3aWZ0Mi9Db2NvYSBjb21wYXRpYmlsaXR5CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworCisgICAgb3V0IDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKCI7CisKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworCisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTspIHsKKyAgICAgIHRfZmllbGQqIHRmaWVsZCA9ICpmX2l0ZXI7CisgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IE5VTEw7CisgICAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgICBpZiAodGZpZWxkLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgeworICAgICAgICAgIHZhbHVlID0gdl9pdGVyLT5zZWNvbmQ7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKHZhbHVlKSB7CisgICAgICAgIG91dCA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIjogIjsKKyAgICAgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgdGZpZWxkLT5nZXRfdHlwZSgpLCB2YWx1ZSk7CisgICAgICB9CisgICAgICBlbHNlIGlmICghZmllbGRfaXNfb3B0aW9uYWwodGZpZWxkKSkgeworICAgICAgICB0aHJvdyAiY29uc3RhbnQgZXJyb3I6IHJlcXVpcmVkIGZpZWxkICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIi4iICsgdGZpZWxkLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gdmFsdWUiOworICAgICAgfQorCisgICAgICBpZiAoKytmX2l0ZXIgIT0gZmllbGRzLmVuZCgpKSB7CisgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgfQorICAgIH0KKworICAgIG91dCA8PCAiKSI7CisKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworCisgICAgb3V0IDw8ICJbIjsKKworICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOykgeworCisgICAgICByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBrdHlwZSwgdl9pdGVyLT5maXJzdCk7CisgICAgICBvdXQgPDwgIjogIjsKKyAgICAgIHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7CisKKyAgICAgIGlmICgrK3ZfaXRlciAhPSB2YWwuZW5kKCkpIHsKKyAgICAgICAgb3V0IDw8ICIsICI7CisgICAgICB9CisgICAgfQorCisgICAgb3V0IDw8ICJdIjsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworCisgICAgb3V0IDw8ICJbIjsKKworICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOykgeworCisgICAgICByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBldHlwZSwgdl9pdGVyLT5maXJzdCk7CisKKyAgICAgIGlmICgrK3ZfaXRlciAhPSB2YWwuZW5kKCkpIHsKKyAgICAgICAgb3V0IDw8ICIsICI7CisgICAgICB9CisgICAgfQorCisgICAgb3V0IDw8ICJdIjsKKworICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisKKyAgICBvdXQgPDwgIlsiOworCisgICAgdF90eXBlKiBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworCisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTspIHsKKworICAgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgZXR5cGUsIHZfaXRlci0+Zmlyc3QpOworCisgICAgICBpZiAoKyt2X2l0ZXIgIT0gdmFsLmVuZCgpKSB7CisgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgfQorICAgIH0KKworICAgIG91dCA8PCAiXSI7CisKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIHR5cGUgIiArIHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKworfQorCisvKioKKyAqIERlY2xhcmVzIGFuIFN3aWZ0IHByb3BlcnR5LgorICoKKyAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIGRlY2xhcmUgYSBwcm9wZXJ0eSBmb3IKKyAqLworc3RyaW5nIHRfc3dpZnRfZ2VuZXJhdG9yOjpkZWNsYXJlX3Byb3BlcnR5KHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpc19wcml2YXRlKSB7CisKKyAgc3RyaW5nIHZpc2liaWxpdHkgPSBpc19wcml2YXRlID8gKGdlbl9jb2NvYV8gPyAicHJpdmF0ZSIgOiAiZmlsZXByaXZhdGUiKSA6ICJwdWJsaWMiOworCisgIG9zdHJpbmdzdHJlYW0gcmVuZGVyOworCisgIHJlbmRlciA8PCB2aXNpYmlsaXR5IDw8ICIgdmFyICIgPDwgbWF5YmVfZXNjYXBlX2lkZW50aWZpZXIodGZpZWxkLT5nZXRfbmFtZSgpKTsKKworICBpZiAoZmllbGRfaXNfb3B0aW9uYWwodGZpZWxkKSkgeworICAgIHJlbmRlciA8PCAoZ2VuX2NvY29hXyA/ICIgIiA6ICIiKSA8PCAiOiAiIDw8IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCksIHRydWUpOworICB9CisgIGVsc2UgeworICAgIGlmICghZ2VuX2NvY29hXykgeworICAgICAgcmVuZGVyIDw8ICI6ICIgPDwgdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSwgZmFsc2UpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBTd2lmdDIvQ29jb2EgYmFja3dhcmQgY29tcGF0LCBCYWQsIGRlZmF1bHQgaW5pdAorICAgICAgcmVuZGVyIDw8ICIgPSAiIDw8IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCksIGZhbHNlKSA8PCAiKCkiOworICAgIH0KKyAgfQorCisgIHJldHVybiByZW5kZXIuc3RyKCk7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZQorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCitzdHJpbmcgdF9zd2lmdF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKworICBzdHJpbmcgcmVzdWx0ID0gImZ1bmMgIiArIChnZW5fY29jb2FfID8gZnVuY3Rpb25fbmFtZSh0ZnVuY3Rpb24pIDogdGZ1bmN0aW9uLT5nZXRfbmFtZSgpKTsKKworICByZXN1bHQgKz0gIigiICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCksICIiLCBmYWxzZSkgKyAiKSB0aHJvd3MiOyAvLy8gYXJnc3JldmlldworCisgIHRfdHlwZSogdHR5cGUgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7CisgIGlmICghdHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHJlc3VsdCArPSAiIC0+ICIgKyB0eXBlX25hbWUodHR5cGUpOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZnVuY3Rpb24gZG9jc3RyaW5nCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmZ1bmN0aW9uX2RvY3N0cmluZyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworCisgICAgLy8gR2VuZXJhdGUgZG9jc3RyaW5nIHdpdGggZm9sbG93aW5nIGZvcm1hdDoKKyAgICAvLyAvLy8gPERlc2NyaXB0aW9uPgorICAgIC8vIC8vLyA8ZW1wdHkgbGluZT4KKyAgICAvLyAvLy8gLSBQYXJhbWV0ZXJzOgorICAgIC8vIC8vLyAgIC0gPHBhcmFtZXRlcj46IDxwYXJhbWV0ZXIgZG9jc3RyaW5nPgorICAgIC8vIC8vLyAtIFJldHVybnM6IDxyZXR1cm4gdHlwZT4gKFRocmlmdCBoYXMgbm8gZG9jc3RyaW5nIG9uIHJldHVybiB2YWwpCisgICAgLy8gLy8vIC0gVGhyb3dzOiA8ZXhjZXB0aW9uIHR5cGVzPgorCisgICAgLy8gRGVzY3JpcHRpb24KKyAgICBzdHJpbmcgZG9jID0gdGZ1bmN0aW9uLT5nZXRfZG9jKCk7CisgICAgZ2VuZXJhdGVfZG9jc3RyaW5nKG91dCwgZG9jKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiLy8vIiA8PCBlbmRsOworCisgICAgLy8gUGFyYW1ldGVycworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgaWYgKCFmaWVsZHMuZW1wdHkoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIi8vLyAtIFBhcmFtZXRlcnM6IiA8PCBlbmRsOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIi8vLyAgIC0gIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjogIjsKKyAgICAgICAgc3RyaW5nIGRvYyA9ICgqZl9pdGVyKS0+Z2V0X2RvYygpOworICAgICAgICBpZiAoIWRvYy5lbXB0eSgpICYmIGRvY1tkb2MubGVuZ3RoKCktMV0gPT0gJ1xuJykgeworICAgICAgICAgICAgZG9jLmVyYXNlKGRvYy5sZW5ndGgoKS0xKTsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwgZG9jIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgLy8gUmV0dXJucworICAgIHRfdHlwZSogdHR5cGUgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7CisgICAgaWYgKCF0dHlwZS0+aXNfdm9pZCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiLy8vIC0gUmV0dXJuczogIiA8PCB0eXBlX25hbWUodHR5cGUpIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gVGhyb3dzCisgICAgaW5kZW50KG91dCkgPDwgIi8vLyAtIFRocm93czogIjsKKyAgICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgIG91dCA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgIGlmICgqeF9pdGVyICE9IHhjZXB0aW9ucy5iYWNrKCkpIHsKKyAgICAgICAgb3V0IDw8ICIsICI7CisgICAgICB9ICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgZnVuY3Rpb24gZG9jc3RyaW5nCisgKgorICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCisgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCisgKi8KK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmFzeW5jX2Z1bmN0aW9uX2RvY3N0cmluZyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICAgIC8vIEdlbmVyYXRlIGRvY3N0cmluZyB3aXRoIGZvbGxvd2luZyBmb3JtYXQ6CisgICAgLy8gLy8vIDxEZXNjcmlwdGlvbj4KKyAgICAvLyAvLy8gPGVtcHR5IGxpbmU+CisgICAgLy8gLy8vIC0gUGFyYW1ldGVyczoKKyAgICAvLyAvLy8gICAtIDxwYXJhbWV0ZXI+OiA8cGFyYW1ldGVyIGRvY3N0cmluZz4KKyAgICAvLyAvLy8gICAtIGNhbGxiYWNrOiA8Y2FsbGJhY2sgdHlwZXM+CisKKyAgICAvLyBEZXNjcmlwdGlvbgorICAgIHN0cmluZyBkb2MgPSB0ZnVuY3Rpb24tPmdldF9kb2MoKTsKKyAgICBnZW5lcmF0ZV9kb2NzdHJpbmcob3V0LCBkb2MpOworICAgIGluZGVudChvdXQpIDw8ICIvLy8iIDw8IGVuZGw7CisKKyAgICAvLyBQYXJhbWV0ZXJzCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBpZiAoIWZpZWxkcy5lbXB0eSgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiLy8vIC0gUGFyYW1ldGVyczoiIDw8IGVuZGw7CisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiLy8vICAgLSAiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOiAiOworICAgICAgICBzdHJpbmcgZG9jID0gKCpmX2l0ZXIpLT5nZXRfZG9jKCk7CisgICAgICAgIGlmICghZG9jLmVtcHR5KCkgJiYgZG9jW2RvYy5sZW5ndGgoKS0xXSA9PSAnXG4nKSB7CisgICAgICAgICAgICBkb2MuZXJhc2UoZG9jLmxlbmd0aCgpLTEpOworICAgICAgICB9CisgICAgICAgIG91dCA8PCBkb2MgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBjb21wbGV0aW9uCisgICAgaW5kZW50KG91dCkgPDwgIi8vLyAgIC0gY29tcGxldGlvbjogVEFzeW5jUmVzdWx0PCIgPDwgdHlwZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkKKyAgICAgICAgICAgICAgICA8PCAiPiB3cmFwcGluZyByZXR1cm4gYW5kIGZvbGxvd2luZyBFeGNlcHRpb25zOiAiOworICAgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgb3V0IDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCkpOworICAgICAgaWYgKCp4X2l0ZXIgIT0geGNlcHRpb25zLmJhY2soKSkgeworICAgICAgICBvdXQgPDwgIiwgIjsKKyAgICAgIH0KKyAgICB9CisgICAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSB0aGF0IHJldHVybnMgYXN5bmNocm9ub3VzbHkgdmlhIGJsb2Nrcy4KKyAqCisgKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KKyAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KKyAqLworc3RyaW5nIHRfc3dpZnRfZ2VuZXJhdG9yOjphc3luY19mdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIHRfdHlwZSogdHR5cGUgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7CisgIHRfc3RydWN0KiB0YXJnbGlzdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKKyAgc3RyaW5nIHJlc3VsdCA9ICJmdW5jICIgKyAoZ2VuX2NvY29hXyA/IGZ1bmN0aW9uX25hbWUodGZ1bmN0aW9uKSA6IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSk7CisKKyAgaWYgKCFnZW5fY29jb2FfKSB7CisgICAgc3RyaW5nIHJlc3BvbnNlX3N0cmluZyA9ICIoVEFzeW5jUmVzdWx0PCI7CisgICAgcmVzcG9uc2Vfc3RyaW5nICs9ICh0dHlwZS0+aXNfdm9pZCgpKSA/ICJWb2lkIiA6IHR5cGVfbmFtZSh0dHlwZSk7CisgICAgcmVzcG9uc2Vfc3RyaW5nICs9ICI+KSAtPiBWb2lkIjsKKyAgICByZXN1bHQgKz0gIigiICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCksICIiLCBmYWxzZSkKKyAgICAgICAgICAgICsgKHRhcmdsaXN0LT5nZXRfbWVtYmVycygpLnNpemUoKSA/ICIsICIgOiAiIikKKyAgICAgICAgICAgICsgImNvbXBsZXRpb246IEBlc2NhcGluZyAiICsgcmVzcG9uc2Vfc3RyaW5nICsgIikiOworICB9IGVsc2UgeworICAgIHN0cmluZyByZXNwb25zZV9wYXJhbSA9ICIoIiArICgodHR5cGUtPmlzX3ZvaWQoKSkgPyAiIiA6IHR5cGVfbmFtZSh0dHlwZSkpICsgIikgLT4gVm9pZCI7CisgICAgcmVzdWx0ICs9ICIoIiArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLCAiIiwgZmFsc2UpCisgICAgICAgICAgICArICh0YXJnbGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPyAiLCAiIDogIiIpCisgICAgICAgICAgICArICJzdWNjZXNzOiAiICsgcmVzcG9uc2VfcGFyYW0gKyAiLCAiCisgICAgICAgICAgICArICJmYWlsdXJlOiAoTlNFcnJvcikgLT4gVm9pZCkgdGhyb3dzIjsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgdGhhdCByZXR1cm5zIGFzeW5jaHJvbm91c2x5IHZpYSBwcm9taXNlcy4KKyAqIE9OTFkgRk9SIFN3aWZ0Mi9Db2NvYSBCQUNLV0FSRFMgQ09NUEFUSUJJTElUWQorICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCitzdHJpbmcgdF9zd2lmdF9nZW5lcmF0b3I6OnByb21pc2VfZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICByZXR1cm4gImZ1bmMgIiArIGZ1bmN0aW9uX25hbWUodGZ1bmN0aW9uKSArICIoIiArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLCAiIiwgZmFsc2UpICsgIikgdGhyb3dzICIKKyAgICAgICAgICsgIi0+IFByb21pc2U8IiArIHR5cGVfbmFtZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpICsgIj4iOworfQorCisvKioKKyAqIFJlbmRlcnMgYSB2ZXJib3NlIGZ1bmN0aW9uIG5hbWUgc3VpdGFibGUgZm9yIGEgU3dpZnQgbWV0aG9kLiAgT05MWSBGT1IgU3dpZnQyL0NvY29hIEJBQ0tXQVJEUyBDT01QQVRJQklMSVRZCisgKi8KK3N0cmluZyB0X3N3aWZ0X2dlbmVyYXRvcjo6ZnVuY3Rpb25fbmFtZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgc3RyaW5nIG5hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCk7CisgIGlmICghdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpLmVtcHR5KCkpIHsKKyAgICBzdHJpbmcgZmlyc3RfYXJnID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpLmZyb250KCktPmdldF9uYW1lKCk7CisgICAgaWYgKG5hbWUuc2l6ZSgpIDwgZmlyc3RfYXJnLnNpemUoKSB8fAorICAgICAgICBsb3dlcmNhc2UobmFtZS5zdWJzdHIobmFtZS5zaXplKCktZmlyc3RfYXJnLnNpemUoKSkpICE9IGxvd2VyY2FzZShmaXJzdF9hcmcpKSB7CisgICAgICBuYW1lICs9ICJXaXRoIiArIGNhcGl0YWxpemUodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpWzBdLT5nZXRfbmFtZSgpKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG5hbWU7Cit9CisKKy8qKgorICogUmVuZGVycyBhIFN3aWZ0IG1ldGhvZCBhcmd1bWVudCBsaXN0CisgKi8KK3N0cmluZyB0X3N3aWZ0X2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByb3RvY29sX25hbWUsIGJvb2wgaXNfaW50ZXJuYWwpIHsKKyAgc3RyaW5nIHJlc3VsdCA9ICIiOworICBib29sIGluY2x1ZGVfcHJvdG9jb2wgPSAhcHJvdG9jb2xfbmFtZS5lbXB0eSgpOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICBpZiAoaW5jbHVkZV9wcm90b2NvbCkgeworICAgIHJlc3VsdCArPSBwcm90b2NvbF9uYW1lICsgIjogVFByb3RvY29sIjsKKyAgICBpZiAoIWZpZWxkcy5lbXB0eSgpKSB7CisgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICB9CisgIH0gZWxzZSBpZiAoIWZpZWxkcy5lbXB0eSgpICYmIGlzX2ludGVybmFsICYmIGdlbl9jb2NvYV8pIHsKKyAgICAvLyBGb3JjZSBmaXJzdCBhcmd1bWVudCB0byBiZSBuYW1lZCwgU3dpZnQyL0NvY29hIGJhY2t3YXJkcyBjb21wYXQKKyAgICByZXN1bHQgKz0gZmllbGRzLmZyb250KCktPmdldF9uYW1lKCkgKyAiICI7CisgIH0KKworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOykgeworICAgIHRfZmllbGQqIGFyZyA9ICpmX2l0ZXI7CisKKyAgICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICAgIC8vIG9wdGlvbmFsIGFyZ3Mgbm90IHVzdWFsbHkgcGVybWl0dGVkIGZvciBzb21lIHJlYXNvbiwgZXZlbiB0aG91Z2ggZHluYW1pYyBsYW5ncyBoYW5kbGUgaXQKKyAgICAgIC8vIHVzZSBhbm5vdGF0aW9uICJzd2lmdC5udWxsYWJsZSIgdG8gYWNoaWV2ZQorICAgICAgcmVzdWx0ICs9IGFyZy0+Z2V0X25hbWUoKSArICI6ICIgKyB0eXBlX25hbWUoYXJnLT5nZXRfdHlwZSgpLCBmaWVsZF9pc19vcHRpb25hbChhcmcpKTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9IGFyZy0+Z2V0X25hbWUoKSArICI6ICIgKyB0eXBlX25hbWUoYXJnLT5nZXRfdHlwZSgpKTsKKyAgICB9CisKKyAgICBpZiAoKytmX2l0ZXIgIT0gZmllbGRzLmVuZCgpKSB7CisgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBodHRwczovL2RldmVsb3Blci5hcHBsZS5jb20vbGlicmFyeS9pb3MvZG9jdW1lbnRhdGlvbi9Td2lmdC9Db25jZXB0dWFsL1N3aWZ0X1Byb2dyYW1taW5nX0xhbmd1YWdlL0xleGljYWxTdHJ1Y3R1cmUuaHRtbAorICoKKyAqLworCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpwb3B1bGF0ZV9yZXNlcnZlZF93b3JkcygpIHsKKyAgaWYgKCFnZW5fY29jb2FfKSB7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiX19DT0xVTU5fXyIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIl9fRklMRV9fIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiX19GVU5DVElPTl9fIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiX19MSU5FX18iKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJBbnkiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJhcyIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImFzc29jaWF0ZWR0eXBlIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiYXNzb2NpYXRpdml0eSIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImJyZWFrIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiY2FzZSIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImNhdGNoIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiY2xhc3MiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJjb250aW51ZSIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImNvbnZlbmllbmNlIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZGVmYXVsdCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImRlZmVyIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZGVpbml0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZGlkU2V0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZG8iKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJkeW5hbWljIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZHluYW1pY1R5cGUiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJlbHNlIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZW51bSIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImV4dGVuc2lvbiIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImZhbGx0aHJvdWdoIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZmFsc2UiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJmaWxlcHJpdmF0ZSIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImZpbmFsIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZm9yIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZnVuYyIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImdldCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImd1YXJkIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiaWYiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJpbXBvcnQiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJpbiIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImluZGlyZWN0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiaW5maXgiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJpbml0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiaW5vdXQiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJpbnRlcm5hbCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImlzIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgibGF6eSIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImxlZnQiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJsZXQiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJtdXRhdGluZyIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIm5pbCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIm5vbmUiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJub25tdXRhdGluZyIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIm9wZW4iKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJvcGVyYXRvciIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIm9wdGlvbmFsIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgib3ZlcnJpZGUiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJwb3N0Zml4Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgicHJlY2VkZW5jZSIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInByZWZpeCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInByaXZhdGUiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJwcm90b2NvbCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIlByb3RvY29sIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgicHVibGljIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgicmVwZWF0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgicmVxdWlyZWQiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJyZXRocm93cyIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInJldHVybiIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInJpZ2h0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgic2VsZiIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIlNlbGYiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJzZXQiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJzdGF0aWMiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJzdHJ1Y3QiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJzdWJzY3JpcHQiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJzdXBlciIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInN3aXRjaCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInRocm93Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgidGhyb3dzIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgidHJ1ZSIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInRyeSIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIlR5cGUiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJ0eXBlYWxpYXMiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJ1bm93bmVkIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgidmFyIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgid2VhayIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIndoZXJlIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgid2hpbGUiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJ3aWxsU2V0Iik7CisgIH0gZWxzZSB7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiU2VsZiIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImFzc29jaWF0ZWR0eXBlIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZGVmZXIiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJkZWluaXQiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJkeW5hbWljVHlwZSIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImVudW0iKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJleHRlbnNpb24iKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJmYWxsdGhyb3VnaCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImZhbHNlIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZnVuYyIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImd1YXJkIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiaW5pdCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImlub3V0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiaW50ZXJuYWwiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJsZXQiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJvcGVyYXRvciIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInByb3RvY29sIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgicmVwZWF0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgicmV0aHJvd3MiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJzdHJ1Y3QiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJzdWJzY3JpcHQiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJ0aHJvd3MiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJ0cnVlIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgidHlwZWFsaWFzIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgid2hlcmUiKTsKKyAgfQorfQorCitzdHJpbmcgdF9zd2lmdF9nZW5lcmF0b3I6Om1heWJlX2VzY2FwZV9pZGVudGlmaWVyKGNvbnN0IHN0cmluZyYgaWRlbnRpZmllcikgeworICBpZiAoc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmZpbmQoaWRlbnRpZmllcikgIT0gc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmVuZCgpKSB7CisgICAgcmV0dXJuICJgIiArIGlkZW50aWZpZXIgKyAiYCI7CisgIH0KKyAgcmV0dXJuIGlkZW50aWZpZXI7Cit9CisKKy8qKgorICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBTd2lmdCBUVHlwZSBlbnVtZXJhdGlvbi4KKyAqLworc3RyaW5nIHRfc3dpZnRfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlLCBib29sIHF1YWxpZmllZCkgeworICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKKworICBzdHJpbmcgcmVzdWx0ID0gcXVhbGlmaWVkID8gIlRUeXBlLiIgOiAiLiI7CisgIGlmICghZ2VuX2NvY29hXykgeworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgInN0cmluZyI7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgImJvb2wiOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICAgIHJldHVybiByZXN1bHQgKyAiaTgiOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgImkxNiI7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICAgIHJldHVybiByZXN1bHQgKyAiaTMyIjsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICJpNjQiOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgImRvdWJsZSI7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIHJldHVybiByZXN1bHQgKyAiaTMyIjsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgIHJldHVybiByZXN1bHQgKyAic3RydWN0IjsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgICByZXR1cm4gcmVzdWx0ICsgIm1hcCI7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgICAgcmV0dXJuIHJlc3VsdCArICJzZXQiOworICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICByZXR1cm4gcmVzdWx0ICsgImxpc3QiOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICJTVFJJTkciOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICJCT09MIjsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgIkJZVEUiOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgIkkxNiI7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICAgIHJldHVybiByZXN1bHQgKyAiSTMyIjsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICJJNjQiOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgIkRPVUJMRSI7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIHJldHVybiByZXN1bHQgKyAiSTMyIjsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgIHJldHVybiByZXN1bHQgKyAiU1RSVUNUIjsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgICByZXR1cm4gcmVzdWx0ICsgIk1BUCI7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgICAgcmV0dXJuIHJlc3VsdCArICJTRVQiOworICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICByZXR1cm4gcmVzdWx0ICsgIkxJU1QiOworICAgIH0KKyAgfQorCisgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKK30KKworCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAorICAgIHN3aWZ0LAorICAgICJTd2lmdCAzLjAiLAorICAgICIgICAgbG9nX3VuZXhwZWN0ZWQ6ICBMb2cgZXZlcnkgdGltZSBhbiB1bmV4cGVjdGVkIGZpZWxkIElEIG9yIHR5cGUgaXMgZW5jb3VudGVyZWQuXG4iCisgICAgIiAgICBkZWJ1Z19kZXNjcmlwdGlvbnM6XG4iCisgICAgIiAgICAgICAgICAgICAgICAgICAgIEFsbG93IHVzZSBvZiBkZWJ1Z0Rlc2NyaXB0aW9uIHNvIHRoZSBhcHAgY2FuIGFkZCBkZXNjcmlwdGlvbiB2aWEgYSBjYXRlb2dvcnkvZXh0ZW5zaW9uXG4iCisgICAgIiAgICBhc3luY19jbGllbnRzOiAgIEdlbmVyYXRlIGNsaWVudHMgd2hpY2ggaW52b2tlIGFzeW5jaHJvbm91c2x5IHZpYSBibG9jayBzeW50YXguXG4iCisgICAgIiAgICBuYW1lc3BhY2VkOiAgICAgIEdlbmVyYXRlIHNvdXJjZSBpbiBNb2R1bGUgc2NvcGVkIG91dHB1dCBkaXJlY3RvcmllcyBmb3IgU3dpZnQgTmFtZXNwYWNpbmcuXG4iCisgICAgIiAgICBjb2NvYTogICAgICAgICAgIEdlbmVyYXRlIFN3aWZ0IDIueCBjb2RlIGNvbXBhdGlibGUgd2l0aCB0aGUgVGhyaWZ0L0NvY29hIGxpYnJhcnlcbiIKKyAgICAiICAgIHByb21pc2Vfa2l0OiAgICAgR2VuZXJhdGUgY2xpZW50cyB3aGljaCBpbnZva2UgYXN5bmNocm9ub3VzbHkgdmlhIHByb21pc2VzIChvbmx5IHVzZSB3aXRoIGNvY29hIGZsYWcpXG4iCisgICAgIiAgICBzYWZlX2VudW1zOiAgICAgIEdlbmVyYXRlIGVudW0gdHlwZXMgd2l0aCBhbiB1bmtub3duIGNhc2UgdG8gaGFuZGxlIHVuc3BlY2lmaWVkIHZhbHVlcyByYXRoZXIgdGhhbiB0aHJvdyBhIHNlcmlhbGl6YXRpb24gZXJyb3JcbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3htbF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3htbF9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVmZWQxNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfeG1sX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDY5MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPGxpbWl0cz4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworI2luY2x1ZGUgInRocmlmdC9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b2ZzdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjp2ZWN0b3I7Cit1c2luZyBzdGQ6OnN0YWNrOwordXNpbmcgc3RkOjpzZXQ7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgZW5kbCA9ICJcbiI7CitzdGF0aWMgY29uc3Qgc3RyaW5nIHF1b3QgPSAiXCIiOworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGRlZmF1bHRfbnNfcHJlZml4ID0gImh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy94bWwvbnMvIjsKKworLyoqCisgKiBUaGlzIGdlbmVyYXRvciBjcmVhdGVzIGFuIFhNTCBtb2RlbCBvZiB0aGUgcGFyc2VkIElETCB0cmVlLCBhbmQgaXMgZGVzaWduZWQKKyAqIHRvIG1ha2UgaXQgZWFzeSB0byB1c2UgdGhpcyBmaWxlIGFzIHRoZSBpbnB1dCBmb3Igb3RoZXIgdGVtcGxhdGUgZW5naW5lcywKKyAqIHN1Y2ggYXMgWFNMVC4gIFRvIHRoaXMgZW5kLCB0aGUgZ2VuZXJhdGVkIFhNTCBpcyBzbGlnaHRseSBtb3JlIHZlcmJvc2UgdGhhbgorICogeW91IG1pZ2h0IGV4cGVjdC4uLiBmb3IgZXhhbXBsZSwgcmVmZXJlbmNlcyB0byAiaWQiIHR5cGVzIChzdWNoIGFzIHN0cnVjdHMsCisgKiB1bmlvbnMsIGV0YykgYWx3YXlzIHNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIElETCBkb2N1bWVudCwgZXZlbiBpZiB0aGUgdHlwZQorICogaXMgZGVmaW5lZCBpbiB0aGUgc2FtZSBkb2N1bWVudCBhcyB0aGUgcmVmZXJlbmNlLgorICovCitjbGFzcyB0X3htbF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X3htbF9nZW5lcmF0b3IoIHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICBzaG91bGRfbWVyZ2VfaW5jbHVkZXNfID0gZmFsc2U7CisgICAgc2hvdWxkX3VzZV9kZWZhdWx0X25zXyA9IHRydWU7CisgICAgc2hvdWxkX3VzZV9uYW1lc3BhY2VzXyA9IHRydWU7CisgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibWVyZ2UiKSA9PSAwKSB7CisgICAgICAgIHNob3VsZF9tZXJnZV9pbmNsdWRlc18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJub19kZWZhdWx0X25zIikgPT0gMCkgeworICAgICAgICBzaG91bGRfdXNlX2RlZmF1bHRfbnNfID0gZmFsc2U7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoIm5vX25hbWVzcGFjZXMiKSA9PSAwKSB7CisgICAgICAgIHNob3VsZF91c2VfbmFtZXNwYWNlc18gPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiB4bWw6IiArIGl0ZXItPmZpcnN0OworICAgICAgfQorICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLXhtbCI7CisgIH0KKworICB2aXJ0dWFsIH50X3htbF9nZW5lcmF0b3IoKSB7fQorCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKyAgdm9pZCBnZW5lcmF0ZV9wcm9ncmFtKCk7CisKKyAgdm9pZCBpdGVyYXRlX3Byb2dyYW0odF9wcm9ncmFtKiBwcm9ncmFtKTsKKyAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOworICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7CisgIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb24odF9mdW5jdGlvbiogdGZ1bmMpOworICB2b2lkIGdlbmVyYXRlX2ZpZWxkKHRfZmllbGQqIGZpZWxkKTsKKworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKworICB2b2lkIGdlbmVyYXRlX2Fubm90YXRpb25zKHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gYW5ub3RhdGlvbnMpOworCitwcml2YXRlOgorICBib29sIHNob3VsZF9tZXJnZV9pbmNsdWRlc187CisgIGJvb2wgc2hvdWxkX3VzZV9kZWZhdWx0X25zXzsKKyAgYm9vbCBzaG91bGRfdXNlX25hbWVzcGFjZXNfOworCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl94bWxfOworCisgIHN0ZDo6c2V0PHN0cmluZz4gcHJvZ3JhbXNfOworICBzdGQ6OnN0YWNrPHN0cmluZz4gZWxlbWVudHNfOworICBib29sIHRvcF9lbGVtZW50X2lzX2VtcHR5OworICBib29sIHRvcF9lbGVtZW50X2lzX29wZW47CisKKyAgc3RyaW5nIHRhcmdldF9uYW1lc3BhY2UodF9wcm9ncmFtKiBwcm9ncmFtKTsKKyAgdm9pZCB3cml0ZV9lbGVtZW50X3N0YXJ0KGNvbnN0IHN0cmluZyBuYW1lKTsKKyAgdm9pZCBjbG9zZV90b3BfZWxlbWVudCgpOworICB2b2lkIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisgIHZvaWQgd3JpdGVfYXR0cmlidXRlKHN0cmluZyBrZXksIHN0cmluZyB2YWwpOworICB2b2lkIHdyaXRlX2ludF9hdHRyaWJ1dGUoc3RyaW5nIGtleSwgaW50IHZhbCk7CisgIHN0cmluZyBlc2NhcGVfeG1sX3N0cmluZyhjb25zdCBzdHJpbmcmIGlucHV0KTsKKworICB2b2lkIHdyaXRlX3htbF9jb21tZW50KHN0cmluZyBtc2cpOworCisgIHZvaWQgd3JpdGVfdHlwZSh0X3R5cGUqIHR0eXBlKTsKKyAgdm9pZCB3cml0ZV9kb2ModF9kb2MqIHRkb2MpOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBzdHJpbmcgbnVtYmVyX3RvX3N0cmluZyhUIHQpIHsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OworICAgIG91dC5pbWJ1ZShzdGQ6OmxvY2FsZTo6Y2xhc3NpYygpKTsKKyAgICBvdXQucHJlY2lzaW9uKHN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmRpZ2l0czEwKTsKKyAgICBvdXQgPDwgdDsKKyAgICByZXR1cm4gb3V0LnN0cigpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHZvaWQgd3JpdGVfbnVtYmVyKFQgbikgeworICAgIGZfeG1sXyA8PCBudW1iZXJfdG9fc3RyaW5nKG4pOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHZvaWQgd3JpdGVfZWxlbWVudF9udW1iZXIoc3RyaW5nIG5hbWUsIFQgbikgeworICAgIHdyaXRlX2VsZW1lbnRfc3RyaW5nKG5hbWUsIG51bWJlcl90b19zdHJpbmcobikpOworICB9CisKKyAgc3RyaW5nIGdldF90eXBlX25hbWUodF90eXBlKiB0dHlwZSk7CisKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdGFudCh0X2NvbnN0KiBjb24pOworCisgIHZvaWQgd3JpdGVfZWxlbWVudF9zdHJpbmcoc3RyaW5nIG5hbWUsIHN0cmluZyB2YWx1ZSk7CisgIHZvaWQgd3JpdGVfdmFsdWUodF90eXBlKiB0dmFsdWUpOworICB2b2lkIHdyaXRlX2NvbnN0X3ZhbHVlKHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKyAgdmlydHVhbCBzdGQ6OnN0cmluZyB4bWxfYXV0b2dlbl9jb21tZW50KCkgeworICAgIHJldHVybiBzdGQ6OnN0cmluZygiXG4iKSArICIgKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoIiArIFRIUklGVF9WRVJTSU9OICsgIilcbiIKKyAgICAgICAgICAgKyAiICpcbiIgKyAiICogRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lOR1xuIjsKKyAgfQorfTsKKwordm9pZCB0X3htbF9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworCisgIHN0cmluZyBmX3htbF9uYW1lID0gZ2V0X291dF9kaXIoKSArIHByb2dyYW1fLT5nZXRfbmFtZSgpICsgIi54bWwiOworICBmX3htbF8ub3BlbihmX3htbF9uYW1lLmNfc3RyKCkpOworCisgIHRvcF9lbGVtZW50X2lzX29wZW4gPSBmYWxzZTsKK30KKworc3RyaW5nIHRfeG1sX2dlbmVyYXRvcjo6dGFyZ2V0X25hbWVzcGFjZSh0X3Byb2dyYW0qIHByb2dyYW0pIHsKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBtYXA7CisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIGl0ZXI7CisgIG1hcCA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2VfYW5ub3RhdGlvbnMoInhtbCIpOworICBpZiAoKGl0ZXIgPSBtYXAuZmluZCgidGFyZ2V0TmFtZXNwYWNlIikpICE9IG1hcC5lbmQoKSkgeworICAgIHJldHVybiBpdGVyLT5zZWNvbmQ7CisgIH0KKyAgbWFwID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZXMoKTsKKyAgaWYgKChpdGVyID0gbWFwLmZpbmQoInhtbCIpKSAhPSBtYXAuZW5kKCkpIHsKKyAgICByZXR1cm4gZGVmYXVsdF9uc19wcmVmaXggKyBpdGVyLT5zZWNvbmQ7CisgIH0KKyAgbWFwID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZV9hbm5vdGF0aW9ucygiKiIpOworICBpZiAoKGl0ZXIgPSBtYXAuZmluZCgieG1sLnRhcmdldE5hbWVzcGFjZSIpKSAhPSBtYXAuZW5kKCkpIHsKKyAgICByZXR1cm4gaXRlci0+c2Vjb25kOworICB9CisgIG1hcCA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2VzKCk7CisgIGlmICgoaXRlciA9IG1hcC5maW5kKCIqIikpICE9IG1hcC5lbmQoKSkgeworICAgIHJldHVybiBkZWZhdWx0X25zX3ByZWZpeCArIGl0ZXItPnNlY29uZDsKKyAgfQorICByZXR1cm4gZGVmYXVsdF9uc19wcmVmaXggKyBwcm9ncmFtLT5nZXRfbmFtZSgpOworfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6d3JpdGVfeG1sX2NvbW1lbnQoc3RyaW5nIG1zZykgeworICBjbG9zZV90b3BfZWxlbWVudCgpOworICAvLyBUT0RPOiBpbmRlbnQgYW55IEVPTHMgdGhhdCBtYXkgb2NjdXIgd2l0aCBtc2cKKyAgLy8gVE9ETzogcHJvcGVyIG1zZyBlc2NhcGluZyBuZWVkZWQ/CisgIGZfeG1sXyA8PCBpbmRlbnQoKSA8PCAiPCEtLSAiIDw8IG1zZyA8PCAiIC0tPiIgIDw8IGVuZGw7CisgIHRvcF9lbGVtZW50X2lzX2VtcHR5ID0gZmFsc2U7Cit9CisKK3ZvaWQgdF94bWxfZ2VuZXJhdG9yOjpjbG9zZV90b3BfZWxlbWVudCgpIHsKKyAgaWYoIHRvcF9lbGVtZW50X2lzX29wZW4pIHsKKyAgICB0b3BfZWxlbWVudF9pc19vcGVuID0gZmFsc2U7CisgICAgaWYgKGVsZW1lbnRzXy5zaXplKCkgPiAwICYmIHRvcF9lbGVtZW50X2lzX2VtcHR5KSB7CisgICAgICBmX3htbF8gPDwgIj4iIDw8IGVuZGw7CisgICAgfQorICB9Cit9CisKK3ZvaWQgdF94bWxfZ2VuZXJhdG9yOjp3cml0ZV9lbGVtZW50X3N0YXJ0KHN0cmluZyBuYW1lKSB7CisgIGlmIChzaG91bGRfdXNlX25hbWVzcGFjZXNfICYmICFzaG91bGRfdXNlX2RlZmF1bHRfbnNfKSB7CisgICAgbmFtZSA9ICJpZGw6IiArIG5hbWU7CisgIH0KKyAgY2xvc2VfdG9wX2VsZW1lbnQoKTsKKyAgZl94bWxfIDw8IGluZGVudCgpIDw8ICI8IiA8PCBuYW1lOworICBlbGVtZW50c18ucHVzaChuYW1lKTsKKyAgdG9wX2VsZW1lbnRfaXNfZW1wdHkgPSB0cnVlOworICB0b3BfZWxlbWVudF9pc19vcGVuID0gdHJ1ZTsKKyAgaW5kZW50X3VwKCk7Cit9CisKK3ZvaWQgdF94bWxfZ2VuZXJhdG9yOjp3cml0ZV9lbGVtZW50X2VuZCgpIHsKKyAgaW5kZW50X2Rvd24oKTsKKyAgaWYgKHRvcF9lbGVtZW50X2lzX2VtcHR5ICYmIHRvcF9lbGVtZW50X2lzX29wZW4pIHsKKyAgICBmX3htbF8gPDwgIiAvPiIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX3htbF8gPDwgaW5kZW50KCkgPDwgIjwvIiA8PCBlbGVtZW50c18udG9wKCkgPDwgIj4iIDw8IGVuZGw7CisgIH0KKyAgdG9wX2VsZW1lbnRfaXNfZW1wdHkgPSBmYWxzZTsKKyAgZWxlbWVudHNfLnBvcCgpOworfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6d3JpdGVfYXR0cmlidXRlKHN0cmluZyBrZXksIHN0cmluZyB2YWwpIHsKKyAgZl94bWxfIDw8ICIgIiA8PCBrZXkgPDwgIj1cIiIgPDwgZXNjYXBlX3htbF9zdHJpbmcodmFsKSA8PCAiXCIiOworfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6d3JpdGVfaW50X2F0dHJpYnV0ZShzdHJpbmcga2V5LCBpbnQgdmFsKSB7CisgIHdyaXRlX2F0dHJpYnV0ZShrZXksIG51bWJlcl90b19zdHJpbmcodmFsKSk7Cit9CisKK3ZvaWQgdF94bWxfZ2VuZXJhdG9yOjp3cml0ZV9lbGVtZW50X3N0cmluZyhzdHJpbmcgbmFtZSwgc3RyaW5nIHZhbCkgeworICBpZiAoc2hvdWxkX3VzZV9uYW1lc3BhY2VzXyAmJiAhc2hvdWxkX3VzZV9kZWZhdWx0X25zXykgeworICAgIG5hbWUgPSAiaWRsOiIgKyBuYW1lOworICB9CisgIGNsb3NlX3RvcF9lbGVtZW50KCk7CisgIHRvcF9lbGVtZW50X2lzX2VtcHR5ID0gZmFsc2U7CisgIGZfeG1sXyA8PCBpbmRlbnQoKQorICAgIDw8ICI8IiA8PCBuYW1lIDw8ICI+IiA8PCBlc2NhcGVfeG1sX3N0cmluZyh2YWwpIDw8ICI8LyIgPDwgbmFtZSA8PCAiPiIKKyAgICA8PCBlbmRsOworfQorCitzdHJpbmcgdF94bWxfZ2VuZXJhdG9yOjplc2NhcGVfeG1sX3N0cmluZyhjb25zdCBzdHJpbmcmIGlucHV0KSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzczsKKyAgZm9yIChzdGQ6OnN0cmluZzo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IGlucHV0LmJlZ2luKCk7IGl0ZXIgIT0gaW5wdXQuZW5kKCk7IGl0ZXIrKykgeworICAgIHN3aXRjaCAoKml0ZXIpIHsKKyAgICBjYXNlICcmJzoKKyAgICAgIHNzIDw8ICImYW1wOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlICciJzoKKyAgICAgIHNzIDw8ICImcXVvdDsiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnXCcnOgorICAgICAgc3MgPDwgIiZhcG9zOyI7CisgICAgICBicmVhazsKKyAgICBjYXNlICc8JzoKKyAgICAgIHNzIDw8ICImbHQ7IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJz4nOgorICAgICAgc3MgPDwgIiZndDsiOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHNzIDw8ICppdGVyOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiBzcy5zdHIoKTsKK30KKwordm9pZCB0X3htbF9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKKyAgZl94bWxfLmNsb3NlKCk7Cit9CisKK3ZvaWQgdF94bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9ncmFtKCkgeworCisgIGluaXRfZ2VuZXJhdG9yKCk7CisKKyAgd3JpdGVfZWxlbWVudF9zdGFydCgiaWRsIik7CisgIGlmIChzaG91bGRfdXNlX25hbWVzcGFjZXNfKSB7CisgICAgaWYgKHNob3VsZF91c2VfZGVmYXVsdF9uc18pIHsKKyAgICAgIHdyaXRlX2F0dHJpYnV0ZSgieG1sbnMiLCAiaHR0cDovL3RocmlmdC5hcGFjaGUub3JnL3htbC9pZGwiKTsKKyAgICB9CisgICAgd3JpdGVfYXR0cmlidXRlKCJ4bWxuczppZGwiLCAiaHR0cDovL3RocmlmdC5hcGFjaGUub3JnL3htbC9pZGwiKTsKKyAgfQorCisgIHdyaXRlX3htbF9jb21tZW50KCB4bWxfYXV0b2dlbl9jb21tZW50KCkpOworCisgIGl0ZXJhdGVfcHJvZ3JhbShwcm9ncmFtXyk7CisKKyAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKworICBjbG9zZV9nZW5lcmF0b3IoKTsKKworfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6aXRlcmF0ZV9wcm9ncmFtKHRfcHJvZ3JhbSogcHJvZ3JhbSkgeworCisgIHdyaXRlX2VsZW1lbnRfc3RhcnQoImRvY3VtZW50Iik7CisgIHdyaXRlX2F0dHJpYnV0ZSgibmFtZSIsIHByb2dyYW0tPmdldF9uYW1lKCkpOworICBpZiAoc2hvdWxkX3VzZV9uYW1lc3BhY2VzXykgeworICAgIGNvbnN0IHN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSB0YXJnZXRfbmFtZXNwYWNlKHByb2dyYW0pOworICAgIHdyaXRlX2F0dHJpYnV0ZSgidGFyZ2V0TmFtZXNwYWNlIiwgdGFyZ2V0TmFtZXNwYWNlKTsKKyAgICB3cml0ZV9hdHRyaWJ1dGUoInhtbG5zOiIgKyBwcm9ncmFtLT5nZXRfbmFtZSgpLCB0YXJnZXROYW1lc3BhY2UpOworICB9CisgIHdyaXRlX2RvYyhwcm9ncmFtKTsKKworICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4gaW5jbHVkZXMgPSBwcm9ncmFtLT5nZXRfaW5jbHVkZXMoKTsKKyAgdmVjdG9yPHRfcHJvZ3JhbSo+Ojpjb25zdF9pdGVyYXRvciBpbmNfaXQ7CisgIGZvciAoaW5jX2l0ID0gaW5jbHVkZXMuYmVnaW4oKTsgaW5jX2l0ICE9IGluY2x1ZGVzLmVuZCgpOyArK2luY19pdCkgeworICAgIHdyaXRlX2VsZW1lbnRfc3RhcnQoImluY2x1ZGUiKTsKKyAgICB3cml0ZV9hdHRyaWJ1dGUoIm5hbWUiLCAoKmluY19pdCktPmdldF9uYW1lKCkpOworICAgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisgIH0KKworICBjb25zdCBtYXA8c3RyaW5nLCBzdHJpbmc+JiBuYW1lc3BhY2VzID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZXMoKTsKKyAgbWFwPHN0cmluZywgc3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgbnNfaXQ7CisgIGZvciAobnNfaXQgPSBuYW1lc3BhY2VzLmJlZ2luKCk7IG5zX2l0ICE9IG5hbWVzcGFjZXMuZW5kKCk7ICsrbnNfaXQpIHsKKyAgICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJuYW1lc3BhY2UiKTsKKyAgICB3cml0ZV9hdHRyaWJ1dGUoIm5hbWUiLCBuc19pdC0+Zmlyc3QpOworICAgIHdyaXRlX2F0dHJpYnV0ZSgidmFsdWUiLCBuc19pdC0+c2Vjb25kKTsKKyAgICBnZW5lcmF0ZV9hbm5vdGF0aW9ucyhwcm9ncmFtLT5nZXRfbmFtZXNwYWNlX2Fubm90YXRpb25zKG5zX2l0LT5maXJzdCkpOworICAgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisgIH0KKworICAvLyBUT0RPOiBjYW4gY29uc3RhbnRzIGhhdmUgYW5ub3RhdGlvbnM/CisgIHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzID0gcHJvZ3JhbS0+Z2V0X2NvbnN0cygpOworICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgZ2VuZXJhdGVfY29uc3RhbnQoKmNfaXRlcik7CisgIH0KKworICB2ZWN0b3I8dF90eXBlZGVmKj4gdHlwZWRlZnMgPSBwcm9ncmFtLT5nZXRfdHlwZWRlZnMoKTsKKyAgdmVjdG9yPHRfdHlwZWRlZio+OjppdGVyYXRvciB0ZF9pdGVyOworICBmb3IgKHRkX2l0ZXIgPSB0eXBlZGVmcy5iZWdpbigpOyB0ZF9pdGVyICE9IHR5cGVkZWZzLmVuZCgpOyArK3RkX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV90eXBlZGVmKCp0ZF9pdGVyKTsKKyAgfQorCisgIHZlY3Rvcjx0X2VudW0qPiBlbnVtcyA9IHByb2dyYW0tPmdldF9lbnVtcygpOworICB2ZWN0b3I8dF9lbnVtKj46Oml0ZXJhdG9yIGVuX2l0ZXI7CisgIGZvciAoZW5faXRlciA9IGVudW1zLmJlZ2luKCk7IGVuX2l0ZXIgIT0gZW51bXMuZW5kKCk7ICsrZW5faXRlcikgeworICAgIGdlbmVyYXRlX2VudW0oKmVuX2l0ZXIpOworICB9CisKKyAgdmVjdG9yPHRfc3RydWN0Kj4gb2JqZWN0cyA9IHByb2dyYW0tPmdldF9vYmplY3RzKCk7CisgIHZlY3Rvcjx0X3N0cnVjdCo+OjppdGVyYXRvciBvX2l0ZXI7CisgIGZvciAob19pdGVyID0gb2JqZWN0cy5iZWdpbigpOyBvX2l0ZXIgIT0gb2JqZWN0cy5lbmQoKTsgKytvX2l0ZXIpIHsKKyAgICBpZiAoKCpvX2l0ZXIpLT5pc194Y2VwdGlvbigpKSB7CisgICAgICBnZW5lcmF0ZV94Y2VwdGlvbigqb19pdGVyKTsKKyAgICB9IGVsc2UgeworICAgICAgZ2VuZXJhdGVfc3RydWN0KCpvX2l0ZXIpOworICAgIH0KKyAgfQorCisgIHZlY3Rvcjx0X3NlcnZpY2UqPiBzZXJ2aWNlcyA9IHByb2dyYW0tPmdldF9zZXJ2aWNlcygpOworICB2ZWN0b3I8dF9zZXJ2aWNlKj46Oml0ZXJhdG9yIHN2X2l0ZXI7CisgIGZvciAoc3ZfaXRlciA9IHNlcnZpY2VzLmJlZ2luKCk7IHN2X2l0ZXIgIT0gc2VydmljZXMuZW5kKCk7ICsrc3ZfaXRlcikgeworICAgIGdlbmVyYXRlX3NlcnZpY2UoKnN2X2l0ZXIpOworICB9CisKKyAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKworICBpZiAoc2hvdWxkX21lcmdlX2luY2x1ZGVzXykgeworICAgIHByb2dyYW1zXy5pbnNlcnQocHJvZ3JhbS0+Z2V0X25hbWUoKSk7CisgICAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+IHByb2dyYW1zID0gcHJvZ3JhbS0+Z2V0X2luY2x1ZGVzKCk7CisgICAgdmVjdG9yPHRfcHJvZ3JhbSo+Ojpjb25zdF9pdGVyYXRvciBwcm9nX2l0OworICAgIGZvciAocHJvZ19pdCA9IHByb2dyYW1zLmJlZ2luKCk7IHByb2dfaXQgIT0gcHJvZ3JhbXMuZW5kKCk7ICsrcHJvZ19pdCkgeworICAgICAgaWYgKCFwcm9ncmFtc18uY291bnQoKCpwcm9nX2l0KS0+Z2V0X25hbWUoKSkpIHsKKyAgICAgICAgaXRlcmF0ZV9wcm9ncmFtKCpwcm9nX2l0KTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgIHdyaXRlX2VsZW1lbnRfc3RhcnQoInR5cGVkZWYiKTsKKyAgd3JpdGVfYXR0cmlidXRlKCJuYW1lIiwgdHR5cGVkZWYtPmdldF9uYW1lKCkpOworICB3cml0ZV9kb2ModHR5cGVkZWYpOworICB3cml0ZV90eXBlKHR0eXBlZGVmLT5nZXRfdHJ1ZV90eXBlKCkpOworICBnZW5lcmF0ZV9hbm5vdGF0aW9ucyh0dHlwZWRlZi0+YW5ub3RhdGlvbnNfKTsKKyAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKyAgcmV0dXJuOworfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6d3JpdGVfdHlwZSh0X3R5cGUqIHR0eXBlKSB7CisgIGNvbnN0IHN0cmluZyB0eXBlID0gZ2V0X3R5cGVfbmFtZSh0dHlwZSk7CisgIHdyaXRlX2F0dHJpYnV0ZSgidHlwZSIsIHR5cGUpOworICBpZiAodHlwZSA9PSAiaWQiKSB7CisgICAgd3JpdGVfYXR0cmlidXRlKCJ0eXBlLW1vZHVsZSIsIHR0eXBlLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpKTsKKyAgICB3cml0ZV9hdHRyaWJ1dGUoInR5cGUtaWQiLCB0dHlwZS0+Z2V0X25hbWUoKSk7CisgIH0gZWxzZSBpZiAodHlwZSA9PSAibGlzdCIpIHsKKyAgICB0X3R5cGUqIGV0eXBlID0gKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIHdyaXRlX2VsZW1lbnRfc3RhcnQoImVsZW1UeXBlIik7CisgICAgd3JpdGVfdHlwZShldHlwZSk7CisgICAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKyAgfSBlbHNlIGlmICh0eXBlID09ICJzZXQiKSB7CisgICAgdF90eXBlKiBldHlwZSA9ICgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIHdyaXRlX2VsZW1lbnRfc3RhcnQoImVsZW1UeXBlIik7CisgICAgd3JpdGVfdHlwZShldHlwZSk7CisgICAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKyAgfSBlbHNlIGlmICh0eXBlID09ICJtYXAiKSB7CisgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgd3JpdGVfZWxlbWVudF9zdGFydCgia2V5VHlwZSIpOworICAgIHdyaXRlX3R5cGUoa3R5cGUpOworICAgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgd3JpdGVfZWxlbWVudF9zdGFydCgidmFsdWVUeXBlIik7CisgICAgd3JpdGVfdHlwZSh2dHlwZSk7CisgICAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKyAgfQorfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6d3JpdGVfZG9jKHRfZG9jKiB0ZG9jKSB7CisgIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKKyAgICBzdHJpbmcgZG9jID0gdGRvYy0+Z2V0X2RvYygpOworICAgIC8vIGZvciBzb21lIHJlYXNvbiB0aGVyZSBhbHdheXMgc2VlbXMgdG8gYmUgYSB0cmFpbGluZyBuZXdsaW5lIG9uIGRvYworICAgIC8vIGNvbW1lbnRzOyBsb29wIGJlbG93IG5haXZlbHkgdHJpZXMgdG8gc3RyaXAgb2ZmIHRyYWlsaW5nIGNyL2xmCisgICAgaW50IG4gPSAwOworICAgIGZvciAoc3RyaW5nOjpyZXZlcnNlX2l0ZXJhdG9yIGkgPSBkb2MucmJlZ2luKCk7IGkgIT0gZG9jLnJlbmQoKTsgaSsrLG4rKykgeworICAgICAgaWYgKCppICE9ICdcbicgfHwgKmkgPT0gJ1xyJykgeworICAgICAgICBpZiAobiA+IDApIHsKKyAgICAgICAgICBkb2MuZXJhc2UoZG9jLmxlbmd0aCgpIC0gbik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIHdyaXRlX2F0dHJpYnV0ZSgiZG9jIiwgZG9jKTsKKyAgfQorfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYW5ub3RhdGlvbnMoCisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBhbm5vdGF0aW9ucykgeworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+OjppdGVyYXRvciBpdGVyOworICBmb3IgKGl0ZXIgPSBhbm5vdGF0aW9ucy5iZWdpbigpOyBpdGVyICE9IGFubm90YXRpb25zLmVuZCgpOyArK2l0ZXIpIHsKKyAgICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJhbm5vdGF0aW9uIik7CisgICAgd3JpdGVfYXR0cmlidXRlKCJrZXkiLCBpdGVyLT5maXJzdCk7CisgICAgd3JpdGVfYXR0cmlidXRlKCJ2YWx1ZSIsIGl0ZXItPnNlY29uZCk7CisgICAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKyAgfQorfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RhbnQodF9jb25zdCogY29uKSB7CisgIHdyaXRlX2VsZW1lbnRfc3RhcnQoImNvbnN0Iik7CisgIHdyaXRlX2F0dHJpYnV0ZSgibmFtZSIsIGNvbi0+Z2V0X25hbWUoKSk7CisgIHdyaXRlX2RvYyhjb24pOworICB3cml0ZV90eXBlKGNvbi0+Z2V0X3R5cGUoKSk7CisgIHdyaXRlX2NvbnN0X3ZhbHVlKGNvbi0+Z2V0X3ZhbHVlKCkpOworICB3cml0ZV9lbGVtZW50X2VuZCgpOworfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6d3JpdGVfY29uc3RfdmFsdWUodF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKworICBzd2l0Y2ggKHZhbHVlLT5nZXRfdHlwZSgpKSB7CisKKyAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9JREVOVElGSUVSOgorICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVI6CisgICAgd3JpdGVfZWxlbWVudF9udW1iZXIoImludCIsIHZhbHVlLT5nZXRfaW50ZWdlcigpKTsKKyAgICBicmVhazsKKworICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0RPVUJMRToKKyAgICB3cml0ZV9lbGVtZW50X251bWJlcigiZG91YmxlIiwgdmFsdWUtPmdldF9kb3VibGUoKSk7CisgICAgYnJlYWs7CisKKyAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9TVFJJTkc6CisgICAgd3JpdGVfZWxlbWVudF9zdHJpbmcoInN0cmluZyIsIHZhbHVlLT5nZXRfc3RyaW5nKCkpOworICAgIGJyZWFrOworCisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfTElTVDogeworICAgIHdyaXRlX2VsZW1lbnRfc3RhcnQoImxpc3QiKTsKKyAgICBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4gbGlzdCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIHN0ZDo6dmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6aXRlcmF0b3IgbGl0OworICAgIGZvciAobGl0ID0gbGlzdC5iZWdpbigpOyBsaXQgIT0gbGlzdC5lbmQoKTsgKytsaXQpIHsKKyAgICAgIHdyaXRlX2VsZW1lbnRfc3RhcnQoImVudHJ5Iik7CisgICAgICB3cml0ZV9jb25zdF92YWx1ZSgqbGl0KTsKKyAgICAgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisgICAgfQorICAgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisgICAgYnJlYWs7CisgIH0KKworICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX01BUDogeworICAgIHdyaXRlX2VsZW1lbnRfc3RhcnQoIm1hcCIpOworICAgIHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4gbWFwID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+OjppdGVyYXRvciBtaXQ7CisgICAgZm9yIChtaXQgPSBtYXAuYmVnaW4oKTsgbWl0ICE9IG1hcC5lbmQoKTsgKyttaXQpIHsKKyAgICAgIHdyaXRlX2VsZW1lbnRfc3RhcnQoImVudHJ5Iik7CisgICAgICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJrZXkiKTsKKyAgICAgIHdyaXRlX2NvbnN0X3ZhbHVlKG1pdC0+Zmlyc3QpOworICAgICAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKyAgICAgIHdyaXRlX2VsZW1lbnRfc3RhcnQoInZhbHVlIik7CisgICAgICB3cml0ZV9jb25zdF92YWx1ZShtaXQtPnNlY29uZCk7CisgICAgICB3cml0ZV9lbGVtZW50X2VuZCgpOworICAgICAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKyAgICB9CisgICAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKyAgICBicmVhazsKKyAgfQorCisgIGRlZmF1bHQ6CisgICAgaW5kZW50X3VwKCk7CisgICAgZl94bWxfIDw8IGluZGVudCgpIDw8ICI8bnVsbCAvPiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGJyZWFrOworICB9CisKK30KKwordm9pZCB0X3htbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworCisgIHdyaXRlX2VsZW1lbnRfc3RhcnQoImVudW0iKTsKKyAgd3JpdGVfYXR0cmlidXRlKCJuYW1lIiwgdGVudW0tPmdldF9uYW1lKCkpOworICB3cml0ZV9kb2ModGVudW0pOworCisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiB2YWx1ZXMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIHZhbF9pdGVyOworICBmb3IgKHZhbF9pdGVyID0gdmFsdWVzLmJlZ2luKCk7IHZhbF9pdGVyICE9IHZhbHVlcy5lbmQoKTsgKyt2YWxfaXRlcikgeworICAgIHRfZW51bV92YWx1ZSogdmFsID0gKCp2YWxfaXRlcik7CisgICAgd3JpdGVfZWxlbWVudF9zdGFydCgibWVtYmVyIik7CisgICAgd3JpdGVfYXR0cmlidXRlKCJuYW1lIiwgdmFsLT5nZXRfbmFtZSgpKTsKKyAgICB3cml0ZV9pbnRfYXR0cmlidXRlKCJ2YWx1ZSIsIHZhbC0+Z2V0X3ZhbHVlKCkpOworICAgIHdyaXRlX2RvYyh2YWwpOworICAgIGdlbmVyYXRlX2Fubm90YXRpb25zKHZhbC0+YW5ub3RhdGlvbnNfKTsKKyAgICB3cml0ZV9lbGVtZW50X2VuZCgpOworICB9CisKKyAgZ2VuZXJhdGVfYW5ub3RhdGlvbnModGVudW0tPmFubm90YXRpb25zXyk7CisKKyAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKworfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7CisKKyAgc3RyaW5nIHRhZ25hbWUgPSAic3RydWN0IjsKKyAgaWYgKHRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKKyAgICB0YWduYW1lID0gInVuaW9uIjsKKyAgfSBlbHNlIGlmICh0c3RydWN0LT5pc194Y2VwdGlvbigpKSB7CisgICAgdGFnbmFtZSA9ICJleGNlcHRpb24iOworICB9CisKKyAgd3JpdGVfZWxlbWVudF9zdGFydCh0YWduYW1lKTsKKyAgd3JpdGVfYXR0cmlidXRlKCJuYW1lIiwgdHN0cnVjdC0+Z2V0X25hbWUoKSk7CisgIHdyaXRlX2RvYyh0c3RydWN0KTsKKyAgdmVjdG9yPHRfZmllbGQqPiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgbWVtX2l0ZXI7CisgIGZvciAobWVtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1lbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7IG1lbV9pdGVyKyspIHsKKyAgICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJmaWVsZCIpOworICAgIGdlbmVyYXRlX2ZpZWxkKCptZW1faXRlcik7CisgICAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKyAgfQorCisgIGdlbmVyYXRlX2Fubm90YXRpb25zKHRzdHJ1Y3QtPmFubm90YXRpb25zXyk7CisKKyAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKworfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGQodF9maWVsZCogZmllbGQpIHsKKyAgd3JpdGVfYXR0cmlidXRlKCJuYW1lIiwgZmllbGQtPmdldF9uYW1lKCkpOworICB3cml0ZV9pbnRfYXR0cmlidXRlKCJmaWVsZC1pZCIsIGZpZWxkLT5nZXRfa2V5KCkpOworICB3cml0ZV9kb2MoZmllbGQpOworICBzdHJpbmcgcmVxdWlyZWRuZXNzOworICBzd2l0Y2ggKGZpZWxkLT5nZXRfcmVxKCkpIHsKKyAgY2FzZSB0X2ZpZWxkOjpUX1JFUVVJUkVEOgorICAgIHJlcXVpcmVkbmVzcyA9ICJyZXF1aXJlZCI7CisgICAgYnJlYWs7CisgIGNhc2UgdF9maWVsZDo6VF9PUFRJT05BTDoKKyAgICByZXF1aXJlZG5lc3MgPSAib3B0aW9uYWwiOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIHJlcXVpcmVkbmVzcyA9ICIiOworICAgIGJyZWFrOworICB9CisgIGlmIChyZXF1aXJlZG5lc3MgIT0gIiIpIHsKKyAgICB3cml0ZV9hdHRyaWJ1dGUoInJlcXVpcmVkIiwgcmVxdWlyZWRuZXNzKTsKKyAgfQorICB3cml0ZV90eXBlKGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgaWYgKGZpZWxkLT5nZXRfdmFsdWUoKSkgeworICAgIHdyaXRlX2VsZW1lbnRfc3RhcnQoImRlZmF1bHQiKTsKKyAgICB3cml0ZV9jb25zdF92YWx1ZShmaWVsZC0+Z2V0X3ZhbHVlKCkpOworICAgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisgIH0KKyAgZ2VuZXJhdGVfYW5ub3RhdGlvbnMoZmllbGQtPmFubm90YXRpb25zXyk7Cit9CisKK3ZvaWQgdF94bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKworICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJzZXJ2aWNlIik7CisgIHdyaXRlX2F0dHJpYnV0ZSgibmFtZSIsIHRzZXJ2aWNlLT5nZXRfbmFtZSgpKTsKKworICBpZiAoc2hvdWxkX3VzZV9uYW1lc3BhY2VzXykgeworICAgIHN0cmluZyBwcm9nX25zID0gdGFyZ2V0X25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSk7CisgICAgaWYgKCpwcm9nX25zLnJiZWdpbigpICE9ICcvJykgeworICAgICAgcHJvZ19ucy5wdXNoX2JhY2soJy8nKTsKKyAgICB9CisgICAgY29uc3Qgc3RyaW5nIHRucyA9IHByb2dfbnMgKyB0c2VydmljZS0+Z2V0X25hbWUoKTsKKyAgICB3cml0ZV9hdHRyaWJ1dGUoInRhcmdldE5hbWVzcGFjZSIsIHRucyk7CisgICAgd3JpdGVfYXR0cmlidXRlKCJ4bWxuczp0bnMiLCB0bnMpOworICB9CisKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKSB7CisgICAgY29uc3QgdF9zZXJ2aWNlKiBleHRlbmRzID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgICAgd3JpdGVfYXR0cmlidXRlKCJwYXJlbnQtbW9kdWxlIiwgZXh0ZW5kcy0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKSk7CisgICAgd3JpdGVfYXR0cmlidXRlKCJwYXJlbnQtaWQiLCBleHRlbmRzLT5nZXRfbmFtZSgpKTsKKyAgfQorCisgIHdyaXRlX2RvYyh0c2VydmljZSk7CisKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmbl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7CisgIGZvciAoOyBmbl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgZm5faXRlcisrKSB7CisgICAgZ2VuZXJhdGVfZnVuY3Rpb24oKmZuX2l0ZXIpOworICB9CisKKyAgZ2VuZXJhdGVfYW5ub3RhdGlvbnModHNlcnZpY2UtPmFubm90YXRpb25zXyk7CisKKyAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKworfQorCit2b2lkIHRfeG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnVuY3Rpb24odF9mdW5jdGlvbiogdGZ1bmMpIHsKKworICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJtZXRob2QiKTsKKworICB3cml0ZV9hdHRyaWJ1dGUoIm5hbWUiLCB0ZnVuYy0+Z2V0X25hbWUoKSk7CisgIGlmICh0ZnVuYy0+aXNfb25ld2F5KCkpIHsKKyAgICB3cml0ZV9hdHRyaWJ1dGUoIm9uZXdheSIsICJ0cnVlIik7CisgIH0KKworICB3cml0ZV9kb2ModGZ1bmMpOworCisgIHdyaXRlX2VsZW1lbnRfc3RhcnQoInJldHVybnMiKTsKKyAgd3JpdGVfdHlwZSh0ZnVuYy0+Z2V0X3JldHVybnR5cGUoKSk7CisgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisKKyAgdmVjdG9yPHRfZmllbGQqPiBtZW1iZXJzID0gdGZ1bmMtPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIG1lbV9pdGVyID0gbWVtYmVycy5iZWdpbigpOworICBmb3IgKDsgbWVtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgbWVtX2l0ZXIrKykgeworICAgIHdyaXRlX2VsZW1lbnRfc3RhcnQoImFyZyIpOworICAgIGdlbmVyYXRlX2ZpZWxkKCptZW1faXRlcik7CisgICAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKyAgfQorCisgIHZlY3Rvcjx0X2ZpZWxkKj4gZXhjZXB0cyA9IHRmdW5jLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIGV4X2l0ZXIgPSBleGNlcHRzLmJlZ2luKCk7CisgIGZvciAoOyBleF9pdGVyICE9IGV4Y2VwdHMuZW5kKCk7IGV4X2l0ZXIrKykgeworICAgIHdyaXRlX2VsZW1lbnRfc3RhcnQoInRocm93cyIpOworICAgIGdlbmVyYXRlX2ZpZWxkKCpleF9pdGVyKTsKKyAgICB3cml0ZV9lbGVtZW50X2VuZCgpOworICB9CisKKyAgZ2VuZXJhdGVfYW5ub3RhdGlvbnModGZ1bmMtPmFubm90YXRpb25zXyk7CisKKyAgd3JpdGVfZWxlbWVudF9lbmQoKTsKKworfQorCitzdHJpbmcgdF94bWxfZ2VuZXJhdG9yOjpnZXRfdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpIHsKKyAgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gImxpc3QiOworICB9CisgIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gInNldCI7CisgIH0KKyAgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAibWFwIjsKKyAgfQorICBpZiAoKHR0eXBlLT5pc19lbnVtKCkgICAgKXx8CisgICAgICAodHR5cGUtPmlzX3N0cnVjdCgpICApfHwKKyAgICAgICh0dHlwZS0+aXNfdHlwZWRlZigpICl8fAorICAgICAgKHR0eXBlLT5pc194Y2VwdGlvbigpKSl7CisgICAgcmV0dXJuICJpZCI7CisgIH0KKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlKiB0YmFzZXR5cGUgPSAodF9iYXNlX3R5cGUqKXR0eXBlOworICAgIGlmICh0YmFzZXR5cGUtPmlzX2JpbmFyeSgpICkgeworICAgICAgcmV0dXJuICJiaW5hcnkiOworICAgIH0KKyAgICByZXR1cm4gdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNldHlwZS0+Z2V0X2Jhc2UoKSk7CisgIH0KKyAgcmV0dXJuICIodW5rbm93bikiOworfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKAorICB4bWwsCisgICJYTUwiLAorICAiICAgIG1lcmdlOiAgICAgICAgICAgR2VuZXJhdGUgb3V0cHV0IHdpdGggaW5jbHVkZWQgZmlsZXMgbWVyZ2VkXG4iCisgICIgICAgbm9fZGVmYXVsdF9uczogICBPbWl0IGRlZmF1bHQgeG1sbnMgYW5kIGFkZCBpZGw6IHByZWZpeCB0byBhbGwgZWxlbWVudHNcbiIKKyAgIiAgICBub19uYW1lc3BhY2VzOiAgIERvIG5vdCBhZGQgbmFtZXNwYWNlIGRlZmluaXRpb25zIHRvIHRoZSBYTUwgbW9kZWxcbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3hzZF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3hzZF9nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ4N2ZmYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfeHNkX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDM3NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgInRocmlmdC92ZXJzaW9uLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvZnN0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworCisvKioKKyAqIFhTRCBnZW5lcmF0b3IsIGNyZWF0ZXMgYW4gWFNEIGZvciB0aGUgYmFzZSB0eXBlcyBldGMuCisgKgorICovCitjbGFzcyB0X3hzZF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9nZW5lcmF0b3IgeworcHVibGljOgorICB0X3hzZF9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfZ2VuZXJhdG9yKHByb2dyYW0pIHsKKyAgICAodm9pZClvcHRpb25fc3RyaW5nOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisKKyAgICAvKiBubyBvcHRpb25zIHlldCAqLworICAgIGZvciggaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgeworICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIHhzZDoiICsgaXRlci0+Zmlyc3Q7CisgICAgfQorCisgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4teHNkIjsKKyAgfQorCisgIHZpcnR1YWwgfnRfeHNkX2dlbmVyYXRvcigpIHt9CisKKyAgLyoqCisgICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKKyAgICovCisKKyAgdm9pZCBpbml0X2dlbmVyYXRvcigpOworICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOworCisgIC8qKgorICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCisgICAqLworCisgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsgKHZvaWQpdGVudW07IH0KKworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KTsKKworcHJpdmF0ZToKKyAgdm9pZCBnZW5lcmF0ZV9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogYXR0cnMgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvcHRpb25hbCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBuaWxsYWJsZSA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsaXN0X2VsZW1lbnQgPSBmYWxzZSk7CisKKyAgc3RkOjpzdHJpbmcgbnMoc3RkOjpzdHJpbmcgaW4sIHN0ZDo6c3RyaW5nIG5zKSB7IHJldHVybiBucyArICI6IiArIGluOyB9CisKKyAgc3RkOjpzdHJpbmcgeHNkKHN0ZDo6c3RyaW5nIGluKSB7IHJldHVybiBucyhpbiwgInhzZCIpOyB9CisKKyAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpOworICBzdGQ6OnN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlKTsKKworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIHhtbF9hdXRvZ2VuX2NvbW1lbnQoKSB7CisgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCI8IS0tXG4iKSArICIgKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoIiArIFRIUklGVF9WRVJTSU9OICsgIilcbiIKKyAgICAgICAgICAgKyAiICpcbiIgKyAiICogRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lOR1xuIgorICAgICAgICAgICArICIgLS0+XG4iOworICB9CisKKyAgLyoqCisgICAqIE91dHB1dCB4c2QvcGhwIGZpbGUKKyAgICovCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl94c2RfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfcGhwXzsKKworICAvKioKKyAgICogT3V0cHV0IHN0cmluZyBzdHJlYW0KKyAgICovCisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzX3hzZF90eXBlc187Cit9OworCit2b2lkIHRfeHNkX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7CisgIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQorICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworCisgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKKyAgc3RyaW5nIGZfcGhwX25hbWUgPSBnZXRfb3V0X2RpcigpICsgcHJvZ3JhbV8tPmdldF9uYW1lKCkgKyAiX3hzZC5waHAiOworICBmX3BocF8ub3BlbihmX3BocF9uYW1lLmNfc3RyKCkpOworCisgIGZfcGhwXyA8PCAiPD9waHAiIDw8IGVuZGwKKyAgICAgICAgIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF94c2RfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7CisgIGZfcGhwXyA8PCAiPz4iIDw8IGVuZGw7CisgIGZfcGhwXy5jbG9zZSgpOworfQorCit2b2lkIHRfeHNkX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgIGluZGVudChzX3hzZF90eXBlc18pIDw8ICI8eHNkOnNpbXBsZVR5cGUgbmFtZT1cIiIgPDwgdHR5cGVkZWYtPmdldF9uYW1lKCkgPDwgIlwiPiIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGlmICh0dHlwZWRlZi0+Z2V0X3R5cGUoKS0+aXNfc3RyaW5nKCkgJiYgKCh0X2Jhc2VfdHlwZSopdHR5cGVkZWYtPmdldF90eXBlKCkpLT5pc19zdHJpbmdfZW51bSgpKSB7CisgICAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwgIjx4c2Q6cmVzdHJpY3Rpb24gYmFzZT1cIiIgPDwgdHlwZV9uYW1lKHR0eXBlZGVmLT5nZXRfdHlwZSgpKSA8PCAiXCI+IgorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgY29uc3QgdmVjdG9yPHN0cmluZz4mIHZhbHVlcyA9ICgodF9iYXNlX3R5cGUqKXR0eXBlZGVmLT5nZXRfdHlwZSgpKS0+Z2V0X3N0cmluZ19lbnVtX3ZhbHMoKTsKKyAgICB2ZWN0b3I8c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsdWVzLmJlZ2luKCk7IHZfaXRlciAhPSB2YWx1ZXMuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBpbmRlbnQoc194c2RfdHlwZXNfKSA8PCAiPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT1cIiIgPDwgKCp2X2l0ZXIpIDw8ICJcIiAvPiIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQoc194c2RfdHlwZXNfKSA8PCAiPC94c2Q6cmVzdHJpY3Rpb24+IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChzX3hzZF90eXBlc18pIDw8ICI8eHNkOnJlc3RyaWN0aW9uIGJhc2U9XCIiIDw8IHR5cGVfbmFtZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSkgPDwgIlwiIC8+IgorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwgIjwveHNkOnNpbXBsZVR5cGU+IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF94c2RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgYm9vbCB4c2RfYWxsID0gdHN0cnVjdC0+Z2V0X3hzZF9hbGwoKTsKKworICBpbmRlbnQoc194c2RfdHlwZXNfKSA8PCAiPHhzZDpjb21wbGV4VHlwZSBuYW1lPVwiIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJcIj4iIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpZiAoeHNkX2FsbCkgeworICAgIGluZGVudChzX3hzZF90eXBlc18pIDw8ICI8eHNkOmFsbD4iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwgIjx4c2Q6c2VxdWVuY2U+IiA8PCBlbmRsOworICB9CisgIGluZGVudF91cCgpOworCisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBnZW5lcmF0ZV9lbGVtZW50KHNfeHNkX3R5cGVzXywKKyAgICAgICAgICAgICAgICAgICAgICgqbV9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICgqbV9pdGVyKS0+Z2V0X3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICgqbV9pdGVyKS0+Z2V0X3hzZF9hdHRycygpLAorICAgICAgICAgICAgICAgICAgICAgKCptX2l0ZXIpLT5nZXRfeHNkX29wdGlvbmFsKCkgfHwgeHNkX2FsbCwKKyAgICAgICAgICAgICAgICAgICAgICgqbV9pdGVyKS0+Z2V0X3hzZF9uaWxsYWJsZSgpKTsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGlmICh4c2RfYWxsKSB7CisgICAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwgIjwveHNkOmFsbD4iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwgIjwveHNkOnNlcXVlbmNlPiIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBpbmRlbnQoc194c2RfdHlwZXNfKSA8PCAiPC94c2Q6Y29tcGxleFR5cGU+IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF94c2RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbGVtZW50KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiBhdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb3B0aW9uYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5pbGxhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsaXN0X2VsZW1lbnQpIHsKKyAgc3RyaW5nIHNtaW5PY2N1cnMgPSAob3B0aW9uYWwgfHwgbGlzdF9lbGVtZW50KSA/ICIgbWluT2NjdXJzPVwiMFwiIiA6ICIiOworICBzdHJpbmcgc21heE9jY3VycyA9IGxpc3RfZWxlbWVudCA/ICIgbWF4T2NjdXJzPVwidW5ib3VuZGVkXCIiIDogIiI7CisgIHN0cmluZyBzb3B0aW9uYWwgPSBzbWluT2NjdXJzICsgc21heE9jY3VyczsKKyAgc3RyaW5nIHNuaWxsYWJsZSA9IG5pbGxhYmxlID8gIiBuaWxsYWJsZT1cInRydWVcIiIgOiAiIjsKKworICBpZiAodHR5cGUtPmlzX3ZvaWQoKSB8fCB0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgIjx4c2Q6ZWxlbWVudCBuYW1lPVwiIiA8PCBuYW1lIDw8ICJcIiIgPDwgc29wdGlvbmFsIDw8IHNuaWxsYWJsZSA8PCAiPiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpZiAoYXR0cnMgPT0gTlVMTCAmJiB0dHlwZS0+aXNfdm9pZCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiPHhzZDpjb21wbGV4VHlwZSAvPiIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgIjx4c2Q6Y29tcGxleFR5cGU+IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgICBpbmRlbnQob3V0KSA8PCAiPHhzZDpzZXF1ZW5jZSBtaW5PY2N1cnM9XCIwXCIgbWF4T2NjdXJzPVwidW5ib3VuZGVkXCI+IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgc3RyaW5nIHN1Ym5hbWU7CisgICAgICAgIHRfdHlwZSogc3VidHlwZSA9ICgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgICAgaWYgKHN1YnR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHN1YnR5cGUtPmlzX2NvbnRhaW5lcigpKSB7CisgICAgICAgICAgc3VibmFtZSA9IG5hbWUgKyAiX2VsdCI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc3VibmFtZSA9IHR5cGVfbmFtZShzdWJ0eXBlKTsKKyAgICAgICAgfQorICAgICAgICBmX3BocF8gPDwgIiRHTE9CQUxTWyciIDw8IHByb2dyYW1fLT5nZXRfbmFtZSgpIDw8ICJfeHNkX2VsdF8iIDw8IG5hbWUgPDwgIiddID0gJyIgPDwgc3VibmFtZQorICAgICAgICAgICAgICAgPDwgIic7IiA8PCBlbmRsOworICAgICAgICBnZW5lcmF0ZV9lbGVtZW50KG91dCwgc3VibmFtZSwgc3VidHlwZSwgTlVMTCwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIjwveHNkOnNlcXVlbmNlPiIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIjx4c2Q6YXR0cmlidXRlIG5hbWU9XCJsaXN0XCIgdHlwZT1cInhzZDpib29sZWFuXCIgLz4iIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpZiAoYXR0cnMgIT0gTlVMTCkgeworICAgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gYXR0cnMtPmdldF9tZW1iZXJzKCk7CisgICAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGFfaXRlcjsKKyAgICAgICAgZm9yIChhX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IGFfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK2FfaXRlcikgeworICAgICAgICAgIGluZGVudChvdXQpIDw8ICI8eHNkOmF0dHJpYnV0ZSBuYW1lPVwiIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiIHR5cGU9XCIiCisgICAgICAgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKCgqYV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIlwiIC8+IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICB9CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIjwveHNkOmNvbXBsZXhUeXBlPiIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiPC94c2Q6ZWxlbWVudD4iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaWYgKGF0dHJzID09IE5VTEwpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICI8eHNkOmVsZW1lbnQgbmFtZT1cIiIgPDwgbmFtZSA8PCAiXCIiCisgICAgICAgICAgICAgICAgICA8PCAiIHR5cGU9XCIiIDw8IHR5cGVfbmFtZSh0dHlwZSkgPDwgIlwiIiA8PCBzb3B0aW9uYWwgPDwgc25pbGxhYmxlIDw8ICIgLz4iCisgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICAvLyBXb3csIGFsbCB0aGlzIHdvcmsgZm9yIGEgU0lNUExFIFRZUEUgd2l0aCBhdHRyaWJ1dGVzPyE/IT8hCisgICAgICBpbmRlbnQob3V0KSA8PCAiPHhzZDplbGVtZW50IG5hbWU9XCIiIDw8IG5hbWUgPDwgIlwiIiA8PCBzb3B0aW9uYWwgPDwgc25pbGxhYmxlIDw8ICI+IgorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KG91dCkgPDwgIjx4c2Q6Y29tcGxleFR5cGU+IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiPHhzZDpjb21wbGV4Q29udGVudD4iIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICI8eHNkOmV4dGVuc2lvbiBiYXNlPVwiIiA8PCB0eXBlX25hbWUodHR5cGUpIDw8ICJcIj4iIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSBhdHRycy0+Z2V0X21lbWJlcnMoKTsKKyAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGFfaXRlcjsKKyAgICAgIGZvciAoYV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBhX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKythX2l0ZXIpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIjx4c2Q6YXR0cmlidXRlIG5hbWU9XCIiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIgdHlwZT1cIiIKKyAgICAgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKCgqYV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIlwiIC8+IiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICI8L3hzZDpleHRlbnNpb24+IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICI8L3hzZDpjb21wbGV4Q29udGVudD4iIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIjwveHNkOmNvbXBsZXhUeXBlPiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiPC94c2Q6ZWxlbWVudD4iIDw8IGVuZGw7CisgICAgfQorICB9Cit9CisKKwordm9pZCB0X3hzZF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICAvLyBNYWtlIG91dHB1dCBmaWxlCisgIHN0cmluZyBmX3hzZF9uYW1lID0gZ2V0X291dF9kaXIoKSArIHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIi54c2QiOworICBmX3hzZF8ub3BlbihmX3hzZF9uYW1lLmNfc3RyKCkpOworCisgIHN0cmluZyBucyA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJ4c2QiKTsKKyAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBhbm5vdCA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlX2Fubm90YXRpb25zKCJ4c2QiKTsKKyAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgdXJpID0gYW5ub3QuZmluZCgidXJpIik7CisgIGlmICh1cmkgIT0gYW5ub3QuZW5kKCkpIHsKKyAgICBucyA9IHVyaS0+c2Vjb25kOworICB9CisgIGlmIChucy5zaXplKCkgPiAwKSB7CisgICAgbnMgPSAiIHRhcmdldE5hbWVzcGFjZT1cIiIgKyBucyArICJcIiB4bWxucz1cIiIgKyBucyArICJcIiAiCisgICAgICAgICArICJlbGVtZW50Rm9ybURlZmF1bHQ9XCJxdWFsaWZpZWRcIiI7CisgIH0KKworICAvLyBQcmludCB0aGUgWFNEIGhlYWRlcgorICBmX3hzZF8gPDwgIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCIgPz4iIDw8IGVuZGwKKyAgICAgICAgIDw8ICI8eHNkOnNjaGVtYSB4bWxuczp4c2Q9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYVwiIiA8PCBucyA8PCAiPiIgPDwgZW5kbAorICAgICAgICAgPDwgeG1sX2F1dG9nZW5fY29tbWVudCgpCisgICAgICAgICA8PCBlbmRsOworCisgIC8vIFByaW50IG91dCB0aGUgdHlwZSBkZWZpbml0aW9ucworICBpbmRlbnQoZl94c2RfKSA8PCBzX3hzZF90eXBlc18uc3RyKCk7CisKKyAgLy8gS2VlcCBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBleGNlcHRpb25zIHRoYXQgbWlnaHQgZ2V0IHRocm93bgorICBtYXA8c3RyaW5nLCB0X3N0cnVjdCo+IGFsbF94Y2VwdGlvbnM7CisKKyAgLy8gTGlzdCB0aGUgZWxlbWVudHMgdGhhdCB5b3UgbWlnaHQgYWN0dWFsbHkgZ2V0CisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBlbGVtbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzcG9uc2UiOworICAgIHRfdHlwZSogcmV0dXJudHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKTsKKyAgICBnZW5lcmF0ZV9lbGVtZW50KGZfeHNkXywgZWxlbW5hbWUsIHJldHVybnR5cGUpOworICAgIGZfeHNkXyA8PCBlbmRsOworCisgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgIGFsbF94Y2VwdGlvbnNbKCp4X2l0ZXIpLT5nZXRfbmFtZSgpXSA9ICh0X3N0cnVjdCopKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgfQorICB9CisKKyAgbWFwPHN0cmluZywgdF9zdHJ1Y3QqPjo6aXRlcmF0b3IgYXhfaXRlcjsKKyAgZm9yIChheF9pdGVyID0gYWxsX3hjZXB0aW9ucy5iZWdpbigpOyBheF9pdGVyICE9IGFsbF94Y2VwdGlvbnMuZW5kKCk7ICsrYXhfaXRlcikgeworICAgIGdlbmVyYXRlX2VsZW1lbnQoZl94c2RfLCBheF9pdGVyLT5maXJzdCwgYXhfaXRlci0+c2Vjb25kKTsKKyAgfQorCisgIC8vIENsb3NlIHRoZSBYU0QgZG9jdW1lbnQKKyAgZl94c2RfIDw8IGVuZGwgPDwgIjwveHNkOnNjaGVtYT4iIDw8IGVuZGw7CisgIGZfeHNkXy5jbG9zZSgpOworfQorCitzdHJpbmcgdF94c2RfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSkgeworICBpZiAodHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHJldHVybiB0dHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICByZXR1cm4geHNkKGJhc2VfdHlwZV9uYW1lKCgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKSkpOworICB9CisKKyAgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4geHNkKCJpbnQiKTsKKyAgfQorCisgIGlmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZXR1cm4gdHR5cGUtPmdldF9uYW1lKCk7CisgIH0KKworICByZXR1cm4gImNvbnRhaW5lciI7Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgWFNEIHR5cGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgdGhyaWZ0IHR5cGUuCisgKgorICogQHBhcmFtIHRiYXNlIFRoZSBiYXNlIHR5cGUKKyAqIEByZXR1cm4gRXhwbGljaXQgWFNEIHR5cGUsIGkuZS4geHNkOnN0cmluZworICovCitzdHJpbmcgdF94c2RfZ2VuZXJhdG9yOjpiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlKSB7CisgIHN3aXRjaCAodGJhc2UpIHsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgIHJldHVybiAidm9pZCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgIHJldHVybiAic3RyaW5nIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgIHJldHVybiAiYm9vbGVhbiI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgcmV0dXJuICJieXRlIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgcmV0dXJuICJzaG9ydCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIHJldHVybiAiaW50IjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgcmV0dXJuICJsb25nIjsKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgcmV0dXJuICJkZWNpbWFsIjsKKyAgZGVmYXVsdDoKKyAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFhTRCBiYXNlIHR5cGUgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOworICB9Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoeHNkLCAiWFNEIiwgIiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90aHJpZnQtdF9waHBfZ2VuZXJhdG9yLm8tYTYwYTM4ZTkgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90aHJpZnQtdF9waHBfZ2VuZXJhdG9yLm8tYTYwYTM4ZTkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RocmlmdC10X3BocF9nZW5lcmF0b3Iuby1hNjBhMzhlOQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2xvYmFscy5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2xvYmFscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2MWM2ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nbG9iYWxzLmgKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX0dMT0JBTFNfSAorI2RlZmluZSBUX0dMT0JBTFNfSAorCisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHF1ZXVlPgorI2luY2x1ZGUgPHN0YWNrPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKy8qKgorICogVGhpcyBtb2R1bGUgY29udGFpbnMgYWxsIHRoZSBnbG9iYWwgdmFyaWFibGVzIChzbGFwIG9uIHRoZSB3cmlzdCkgdGhhdCBhcmUKKyAqIHNoYXJlZCB0aHJvdWdob3V0IHRoZSBwcm9ncmFtLiBUaGUgcmVhc29uIGZvciB0aGlzIGlzIHRvIGZhY2lsaXRhdGUgc2ltcGxlCisgKiBpbnRlcmFjdGlvbiBiZXR3ZWVuIHRoZSBwYXJzZXIgYW5kIHRoZSByZXN0IG9mIHRoZSBwcm9ncmFtLiBCZWZvcmUgY2FsbGluZworICogeXlwYXJzZSgpLCB0aGUgbWFpbi5jYyBwcm9ncmFtIHdpbGwgbWFrZSBuZWNlc3NhcnkgYWRqdXN0bWVudHMgdG8gdGhlc2UKKyAqIGdsb2JhbCB2YXJpYWJsZXMgc3VjaCB0aGF0IHRoZSBwYXJzZXIgZG9lcyB0aGUgcmlnaHQgdGhpbmcgYW5kIHB1dHMgZW50cmllcworICogaW50byB0aGUgcmlnaHQgY29udGFpbmVycywgZXRjLgorICoKKyAqLworCisvKioKKyAqIEhvb3JheSBmb3IgZm9yd2FyZCBkZWNsYXJhdGlvbiBvZiB0eXBlcyEKKyAqLworCitjbGFzcyB0X3Byb2dyYW07CitjbGFzcyB0X3Njb3BlOworY2xhc3MgdF90eXBlOworCisvKioKKyAqIFBhcnNpbmcgbW9kZSwgdHdvIHBhc3NlcyB1cCBpbiB0aGlzIGdpbiBydW1teSEKKyAqLworCitlbnVtIFBBUlNFX01PREUgeyBJTkNMVURFUyA9IDEsIFBST0dSQU0gPSAyIH07CisKKy8qKgorICogU3RyaWN0bmVzcyBsZXZlbAorICovCitleHRlcm4gaW50IGdfc3RyaWN0OworCisvKioKKyAqIFRoZSBtYXN0ZXIgcHJvZ3JhbSBwYXJzZSB0cmVlLiBUaGlzIGlzIGFjY2Vzc2VkIGZyb20gd2l0aGluIHRoZSBwYXJzZXIgY29kZQorICogdG8gYnVpbGQgdXAgdGhlIHByb2dyYW0gZWxlbWVudHMuCisgKi8KK2V4dGVybiB0X3Byb2dyYW0qIGdfcHJvZ3JhbTsKKworLyoqCisgKiBUaGUgc2NvcGUgdGhhdCB3ZSBhcmUgY3VycmVudGx5IHBhcnNpbmcgaW50bworICovCitleHRlcm4gdF9zY29wZSogZ19zY29wZTsKKworLyoqCisgKiBUaGUgcGFyZW50IHNjb3BlIHRvIGFsc28gbG9hZCBzeW1ib2xzIGludG8KKyAqLworZXh0ZXJuIHRfc2NvcGUqIGdfcGFyZW50X3Njb3BlOworCisvKioKKyAqIFRoZSBwcmVmaXggZm9yIHRoZSBwYXJlbnQgc2NvcGUgZW50cmllcworICovCitleHRlcm4gc3RkOjpzdHJpbmcgZ19wYXJlbnRfcHJlZml4OworCisvKioKKyAqIFRoZSBwYXJzaW5nIHBhc3MgdGhhdCB3ZSBhcmUgb24uIFdlIGRvIGRpZmZlcmVudCB0aGluZ3Mgb24gZWFjaCBwYXNzLgorICovCitleHRlcm4gUEFSU0VfTU9ERSBnX3BhcnNlX21vZGU7CisKKy8qKgorICogR2xvYmFsIHRpbWUgc3RyaW5nLCB1c2VkIGluIGZvcm1hdHRpbmcgZXJyb3IgbWVzc2FnZXMgZXRjLgorICovCitleHRlcm4gY2hhciogZ190aW1lX3N0cjsKKworLyoqCisgKiBUaGUgbGFzdCBwYXJzZWQgZG9jdGV4dCBjb21tZW50LgorICovCitleHRlcm4gY2hhciogZ19kb2N0ZXh0OworCisvKioKKyAqIFRoZSBsb2NhdGlvbiBvZiB0aGUgbGFzdCBwYXJzZWQgZG9jdGV4dCBjb21tZW50LgorICovCitleHRlcm4gaW50IGdfZG9jdGV4dF9saW5lbm87CisKKy8qKgorICogU3RhdHVzIG9mIHByb2dyYW0gbGV2ZWwgZG9jdGV4dCBjYW5kaWRhdGUKKyAqLworZW51bSBQUk9HRE9DVEVYVF9TVEFUVVMgeworICBJTlZBTElEID0gMCwKKyAgU1RJTExfQ0FORElEQVRFID0gMSwgICAvLyB0aGUgdGV4dCBtYXkgb3IgbWF5IG5vdCBiZSB0aGUgcHJvZ3JhbSBkb2N0ZXh0CisgIEFMUkVBRFlfUFJPQ0VTU0VEID0gMiwgLy8gZG9jdGV4dCBoYXMgYmVlbiB1c2VkIGFuZCBpcyBubyBsb25nZXIgYXZhaWxhYmxlCisgIEFCU09MVVRFTFlfU1VSRSA9IDMsICAgLy8gdGhpcyBpcyB0aGUgcHJvZ3JhbSBkb2N0ZXh0CisgIE5PX1BST0dSQU1fRE9DVEVYVCA9IDQgLy8gdGhlcmUgaXMgbm8gcHJvZ3JhbSBkb2N0ZXh0Cit9OworCisvKioKKyAqIFRoZSBwcm9ncmFtIGxldmVsIGRvY3RleHQuIFN0b3JlZCBzZXBhcmF0ZWx5IHRvIG1ha2UgcGFyc2luZyBlYXNpZXIuCisgKi8KK2V4dGVybiBjaGFyKiBnX3Byb2dyYW1fZG9jdGV4dF9jYW5kaWRhdGU7CitleHRlcm4gaW50IGdfcHJvZ3JhbV9kb2N0ZXh0X2xpbmVubzsKK2V4dGVybiBQUk9HRE9DVEVYVF9TVEFUVVMgZ19wcm9ncmFtX2RvY3RleHRfc3RhdHVzOworCisvKioKKyAqIFdoZXRoZXIgb3Igbm90IG5lZ2F0aXZlIGZpZWxkIGtleXMgYXJlIGFjY2VwdGVkLgorICoKKyAqIFdoZW4gYSBmaWVsZCBkb2VzIG5vdCBoYXZlIGEgdXNlci1zcGVjaWZpZWQga2V5LCB0aHJpZnQgYXV0b21hdGljYWxseQorICogYXNzaWducyBhIG5lZ2F0aXZlIHZhbHVlLiAgSG93ZXZlciwgdGhpcyBpcyBmcmFnaWxlIHNpbmNlIGNoYW5nZXMgdG8gdGhlCisgKiBmaWxlIG1heSB1bmludGVudGlvbmFsbHkgY2hhbmdlIHRoZSBrZXkgbnVtYmVyaW5nLCByZXN1bHRpbmcgaW4gYSBuZXcKKyAqIHByb3RvY29sIHRoYXQgaXMgbm90IGJhY2t3YXJkcyBjb21wYXRpYmxlLgorICoKKyAqIFdoZW4gZ19hbGxvd19uZWdfZmllbGRfa2V5cyBpcyBlbmFibGVkLCB1c2VycyBjYW4gZXhwbGljaXRseSBzcGVjaWZ5CisgKiBuZWdhdGl2ZSBrZXlzLiAgVGhpcyB3YXkgdGhleSBjYW4gd3JpdGUgYSAudGhyaWZ0IGZpbGUgd2l0aCBleHBsaWNpdGx5CisgKiBzcGVjaWZpZWQga2V5cyB0aGF0IGlzIHN0aWxsIGJhY2t3YXJkcyBjb21wYXRpYmxlIHdpdGggb2xkZXIgLnRocmlmdCBmaWxlcworICogdGhhdCBkaWQgbm90IHNwZWNpZnkga2V5IHZhbHVlcy4KKyAqLworZXh0ZXJuIGludCBnX2FsbG93X25lZ19maWVsZF9rZXlzOworCisvKioKKyAqIFdoZXRoZXIgb3Igbm90IDY0LWJpdCBjb25zdGFudHMgd2lsbCBnZW5lcmF0ZSBhIHdhcm5pbmcuCisgKgorICogU29tZSBsYW5ndWFnZXMgZG9uJ3Qgc3VwcG9ydCA2NC1iaXQgY29uc3RhbnRzLCBidXQgbWFueSBkbywgc28gd2UgY2FuCisgKiBzdXBwcmVzcyB0aGlzIHdhcm5pbmcgZm9yIHByb2plY3RzIHRoYXQgZG9uJ3QgdXNlIGFueSBub24tNjQtYml0LXNhZmUKKyAqIGxhbmd1YWdlcy4KKyAqLworZXh0ZXJuIGludCBnX2FsbG93XzY0Yml0X2NvbnN0czsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9sb2dnaW5nLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvbG9nZ2luZy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODIxZjVmCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvbG9nZ2luZy5jYwpAQCAtMCwwICsxLDc3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogTG9nZ2luZyBmdW5jdGlvbnMgY29waWVkIGZyb20gbWFpbi5jYyB0byBhdm9pZCBsaW5rIGVycm9ycyBmb3IgcGx1Z2lucworICovCisKKyNpbmNsdWRlICJ0aHJpZnQvbG9nZ2luZy5oIgorI2luY2x1ZGUgInRocmlmdC9nbG9iYWxzLmgiCisjaW5jbHVkZSA8Y3N0ZGFyZz4KKyNpbmNsdWRlIDxjc3RkaW8+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKworLy8gVE9ETzogbWFrZSBwbHVnaW5zIGFjY2VwdCBsb2cgb3B0aW9ucyBmcm9tIG1haW4gY29tcGlsZXIKK2ludCBnX2RlYnVnID0gMDsKK2ludCBnX3dhcm4gPSAxOworaW50IGdfdmVyYm9zZSA9IDA7CisKK3ZvaWQgcGRlYnVnKGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7CisgIGlmIChnX2RlYnVnID09IDApIHsKKyAgICByZXR1cm47CisgIH0KKyAgdmFfbGlzdCBhcmdzOworICAvLyBwcmludGYoIltQQVJTRTolZF0gIiwgeXlsaW5lbm8pOworICB2YV9zdGFydChhcmdzLCBmbXQpOworICB2cHJpbnRmKGZtdCwgYXJncyk7CisgIHZhX2VuZChhcmdzKTsKKyAgcHJpbnRmKCJcbiIpOworfQorCit2b2lkIHB2ZXJib3NlKGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7CisgIGlmIChnX3ZlcmJvc2UgPT0gMCkgeworICAgIHJldHVybjsKKyAgfQorICB2YV9saXN0IGFyZ3M7CisgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisgIHZwcmludGYoZm10LCBhcmdzKTsKKyAgdmFfZW5kKGFyZ3MpOworfQorCit2b2lkIHB3YXJuaW5nKGludCBsZXZlbCwgY29uc3QgY2hhciogZm10LCAuLi4pIHsKKyAgaWYgKGdfd2FybiA8IGxldmVsKSB7CisgICAgcmV0dXJuOworICB9CisgIHZhX2xpc3QgYXJnczsKKyAgLy8gcHJpbnRmKCJbV0FSTklORzolczolZF0gIiwgZ19jdXJwYXRoLmNfc3RyKCksIHl5bGluZW5vKTsKKyAgdmFfc3RhcnQoYXJncywgZm10KTsKKyAgdnByaW50ZihmbXQsIGFyZ3MpOworICB2YV9lbmQoYXJncyk7CisgIHByaW50ZigiXG4iKTsKK30KKwordm9pZCBmYWlsdXJlKGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7CisgIHZhX2xpc3QgYXJnczsKKyAgLy8gZnByaW50ZihzdGRlcnIsICJbRkFJTFVSRTolczolZF0gIiwgZ19jdXJwYXRoLmNfc3RyKCksIHl5bGluZW5vKTsKKyAgdmFfc3RhcnQoYXJncywgZm10KTsKKyAgdmZwcmludGYoc3RkZXJyLCBmbXQsIGFyZ3MpOworICB2YV9lbmQoYXJncyk7CisgIHByaW50ZigiXG4iKTsKKyAgZXhpdCgxKTsKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2xvZ2dpbmcuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2xvZ2dpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmVmYmYyCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvbG9nZ2luZy5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX0xPR0dJTkdfSAorI2RlZmluZSBUX0xPR0dJTkdfSAorCitleHRlcm4gaW50IGdfZGVidWc7CitleHRlcm4gaW50IGdfd2FybjsKK2V4dGVybiBpbnQgZ192ZXJib3NlOworCisvKioKKyAqIFBhcnNlIGRlYnVnZ2luZyBvdXRwdXQsIHVzZWQgdG8gcHJpbnQgaGVscGZ1bCBpbmZvCisgKi8KK3ZvaWQgcGRlYnVnKGNvbnN0IGNoYXIqIGZtdCwgLi4uKTsKKworLyoqCisgKiBQYXJzZXIgd2FybmluZworICovCit2b2lkIHB3YXJuaW5nKGludCBsZXZlbCwgY29uc3QgY2hhciogZm10LCAuLi4pOworCisvKioKKyAqIFByaW50IHZlcmJvc2Ugb3V0cHV0IG1lc3NhZ2UKKyAqLwordm9pZCBwdmVyYm9zZShjb25zdCBjaGFyKiBmbXQsIC4uLik7CisKKy8qKgorICogRmFpbHVyZSEKKyAqLwordm9pZCBmYWlsdXJlKGNvbnN0IGNoYXIqIGZtdCwgLi4uKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9tYWluLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvbWFpbi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGMxNzFjCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvbWFpbi5jYwpAQCAtMCwwICsxLDEzMDggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiB0aHJpZnQgLSBhIGxpZ2h0d2VpZ2h0IGNyb3NzLWxhbmd1YWdlIHJwYy9zZXJpYWxpemF0aW9uIHRvb2wKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIG1haW4gY29tcGlsZXIgZW5naW5lIGZvciBUaHJpZnQsIHdoaWNoIGludm9rZXMgdGhlCisgKiBzY2FubmVyL3BhcnNlciB0byBidWlsZCB0aGUgdGhyaWZ0IG9iamVjdCB0cmVlLiBUaGUgaW50ZXJmYWNlIGdlbmVyYXRpb24KKyAqIGNvZGUgZm9yIGVhY2ggbGFuZ3VhZ2UgbGl2ZXMgaW4gYSBmaWxlIGJ5IHRoZSBsYW5ndWFnZSBuYW1lIHVuZGVyIHRoZQorICogZ2VuZXJhdGUvIGZvbGRlciwgYW5kIGFsbCBwYXJzZSBzdHJ1Y3R1cmVzIGxpdmUgaW4gcGFyc2UvCisgKgorICovCisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorCisjaWZkZWYgX1dJTjMyCisjaW5jbHVkZSA8d2luZG93cy5oPiAvKiBmb3IgR2V0RnVsbFBhdGhOYW1lICovCisjZW5kaWYKKworLy8gQ2FyZWZ1bDogbXVzdCBpbmNsdWRlIGdsb2JhbHMgZmlyc3QgZm9yIGV4dGVybiBkZWZpbml0aW9ucworI2luY2x1ZGUgInRocmlmdC9jb21tb24uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2xvYmFscy5oIgorCisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L21haW4uaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9wcm9ncmFtLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3Rfc2NvcGUuaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaCIKKyNpbmNsdWRlICJ0aHJpZnQvYXVkaXQvdF9hdWRpdC5oIgorI2lmZGVmIFRIUklGVF9FTkFCTEVfUExVR0lOCisjaW5jbHVkZSAidGhyaWZ0L3BsdWdpbi9wbHVnaW5fb3V0cHV0LmgiCisjZW5kaWYKKworI2luY2x1ZGUgInRocmlmdC92ZXJzaW9uLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKKy8qKgorICogR2xvYmFsIHByb2dyYW0gdHJlZQorICovCit0X3Byb2dyYW0qIGdfcHJvZ3JhbTsKKworLyoqCisgKiBHbG9iYWwgc2NvcGUKKyAqLwordF9zY29wZSogZ19zY29wZTsKKworLyoqCisgKiBQYXJlbnQgc2NvcGUgdG8gYWxzbyBwYXJzZSB0eXBlcworICovCit0X3Njb3BlKiBnX3BhcmVudF9zY29wZTsKKworLyoqCisgKiBQcmVmaXggZm9yIHB1dHRpbmcgdHlwZXMgaW4gcGFyZW50IHNjb3BlCisgKi8KK3N0cmluZyBnX3BhcmVudF9wcmVmaXg7CisKKy8qKgorICogUGFyc2luZyBwYXNzCisgKi8KK1BBUlNFX01PREUgZ19wYXJzZV9tb2RlOworCisvKioKKyAqIEN1cnJlbnQgZGlyZWN0b3J5IG9mIGZpbGUgYmVpbmcgcGFyc2VkCisgKi8KK3N0cmluZyBnX2N1cmRpcjsKKworLyoqCisgKiBDdXJyZW50IGZpbGUgYmVpbmcgcGFyc2VkCisgKi8KK3N0cmluZyBnX2N1cnBhdGg7CisKKy8qKgorICogU2VhcmNoIHBhdGggZm9yIGluY2x1c2lvbnMKKyAqLwordmVjdG9yPHN0cmluZz4gZ19pbmNsX3NlYXJjaHBhdGg7CisKKy8qKgorICogR2xvYmFsIGRlYnVnIHN0YXRlCisgKi8KK2ludCBnX2RlYnVnID0gMDsKKworLyoqCisgKiBTdHJpY3RuZXNzIGxldmVsCisgKi8KK2ludCBnX3N0cmljdCA9IDEyNzsKKworLyoqCisgKiBXYXJuaW5nIGxldmVsCisgKi8KK2ludCBnX3dhcm4gPSAxOworCisvKioKKyAqIFZlcmJvc2Ugb3V0cHV0CisgKi8KK2ludCBnX3ZlcmJvc2UgPSAwOworCisvKioKKyAqIEdsb2JhbCB0aW1lIHN0cmluZworICovCitjaGFyKiBnX3RpbWVfc3RyOworCisvKioKKyAqIFRoZSBsYXN0IHBhcnNlZCBkb2N0ZXh0IGNvbW1lbnQuCisgKi8KK2NoYXIqIGdfZG9jdGV4dDsKKworLyoqCisgKiBUaGUgRmlyc3QgZG9jdGV4dCBjb21tZW50CisgKi8KK2NoYXIqIGdfcHJvZ3JhbV9kb2N0ZXh0X2NhbmRpZGF0ZTsKKworLyoqCisgKiBXaGV0aGVyIG9yIG5vdCBuZWdhdGl2ZSBmaWVsZCBrZXlzIGFyZSBhY2NlcHRlZC4KKyAqLworaW50IGdfYWxsb3dfbmVnX2ZpZWxkX2tleXM7CisKKy8qKgorICogV2hldGhlciBvciBub3QgNjQtYml0IGNvbnN0YW50cyB3aWxsIGdlbmVyYXRlIGEgd2FybmluZy4KKyAqLworaW50IGdfYWxsb3dfNjRiaXRfY29uc3RzID0gMDsKKworLyoqCisgKiBGbGFncyB0byBjb250cm9sIGNvZGUgZ2VuZXJhdGlvbgorICovCitib29sIGdlbl9yZWN1cnNlID0gZmFsc2U7CisKKy8qKgorICogRmxhZ3MgdG8gY29udHJvbCB0aHJpZnQgYXVkaXQKKyAqLworYm9vbCBnX2F1ZGl0ID0gZmFsc2U7CisKKy8qKgorICogRmxhZyB0byBjb250cm9sIHJldHVybiBzdGF0dXMKKyAqLworYm9vbCBnX3JldHVybl9mYWlsdXJlID0gZmFsc2U7Citib29sIGdfYXVkaXRfZmF0YWwgPSB0cnVlOworYm9vbCBnX2dlbmVyYXRvcl9mYWlsdXJlID0gZmFsc2U7CisKKy8qKgorICogV2luMzIgZG9lc24ndCBoYXZlIHJlYWxwYXRoLCBzbyB1c2UgZmFsbGJhY2sgaW1wbGVtZW50YXRpb24gaW4gdGhhdCBjYXNlLAorICogb3RoZXJ3aXNlIHRoaXMganVzdCBjYWxscyB0aHJvdWdoIHRvIHJlYWxwYXRoCisgKi8KK2NoYXIqIHNhZmVyZWFscGF0aChjb25zdCBjaGFyKiBwYXRoLCBjaGFyKiByZXNvbHZlZF9wYXRoKSB7CisjaWZkZWYgX1dJTjMyCisgIGNoYXIgYnVmW01BWF9QQVRIXTsKKyAgY2hhciogYmFzZW5hbWU7CisgIERXT1JEIGxlbiA9IEdldEZ1bGxQYXRoTmFtZShwYXRoLCBNQVhfUEFUSCwgYnVmLCAmYmFzZW5hbWUpOworICBpZiAobGVuID09IDAgfHwgbGVuID4gTUFYX1BBVEggLSAxKSB7CisgICAgc3RyY3B5KHJlc29sdmVkX3BhdGgsIHBhdGgpOworICB9IGVsc2UgeworICAgIHN0cmNweShyZXNvbHZlZF9wYXRoLCBidWYpOworICB9CisKKyAgLy8gUmVwbGFjZSBiYWNrc2xhc2hlcyB3aXRoIGZvcndhcmQgc2xhc2hlcyBzbyB0aGUKKyAgLy8gcmVzdCBvZiB0aGUgY29kZSBiZWhhdmVzIGNvcnJlY3RseS4KKyAgc2l6ZV90IHJlc29sdmVkX2xlbiA9IHN0cmxlbihyZXNvbHZlZF9wYXRoKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXNvbHZlZF9sZW47IGkrKykgeworICAgIGlmIChyZXNvbHZlZF9wYXRoW2ldID09ICdcXCcpIHsKKyAgICAgIHJlc29sdmVkX3BhdGhbaV0gPSAnLyc7CisgICAgfQorICB9CisgIHJldHVybiByZXNvbHZlZF9wYXRoOworI2Vsc2UKKyAgcmV0dXJuIHJlYWxwYXRoKHBhdGgsIHJlc29sdmVkX3BhdGgpOworI2VuZGlmCit9CisKK2Jvb2wgY2hlY2tfaXNfZGlyZWN0b3J5KGNvbnN0IGNoYXIqIGRpcl9uYW1lKSB7CisjaWZkZWYgX1dJTjMyCisgIERXT1JEIGF0dHJpYnV0ZXMgPSA6OkdldEZpbGVBdHRyaWJ1dGVzQShkaXJfbmFtZSk7CisgIGlmIChhdHRyaWJ1dGVzID09IElOVkFMSURfRklMRV9BVFRSSUJVVEVTKSB7CisgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAiT3V0cHV0IGRpcmVjdG9yeSAlcyBpcyB1bnVzYWJsZTogR2V0TGFzdEVycm9yKCkgPSAlbGRcbiIsCisgICAgICAgICAgICBkaXJfbmFtZSwKKyAgICAgICAgICAgIEdldExhc3RFcnJvcigpKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKChhdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZKSAhPSBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlkpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIk91dHB1dCBkaXJlY3RvcnkgJXMgZXhpc3RzIGJ1dCBpcyBub3QgYSBkaXJlY3RvcnlcbiIsIGRpcl9uYW1lKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7CisjZWxzZQorICBzdHJ1Y3Qgc3RhdCBzYjsKKyAgaWYgKHN0YXQoZGlyX25hbWUsICZzYikgPCAwKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJPdXRwdXQgZGlyZWN0b3J5ICVzIGlzIHVudXNhYmxlOiAlc1xuIiwgZGlyX25hbWUsIHN0cmVycm9yKGVycm5vKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghU19JU0RJUihzYi5zdF9tb2RlKSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiT3V0cHV0IGRpcmVjdG9yeSAlcyBleGlzdHMgYnV0IGlzIG5vdCBhIGRpcmVjdG9yeVxuIiwgZGlyX25hbWUpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKKyNlbmRpZgorfQorCisvKioKKyAqIFJlcG9ydCBhbiBlcnJvciB0byB0aGUgdXNlci4gVGhpcyBpcyBjYWxsZWQgeXllcnJvciBmb3IgaGlzdG9yaWNhbAorICogcmVhc29ucyAobGV4IGFuZCB5YWNjIGV4cGVjdCB0aGUgZXJyb3IgcmVwb3J0aW5nIHJvdXRpbmUgdG8gYmUgY2FsbGVkCisgKiB0aGlzKS4gQ2FsbCB0aGlzIGZ1bmN0aW9uIHRvIHJlcG9ydCBhbnkgZXJyb3JzIHRvIHRoZSB1c2VyLgorICogeXllcnJvciB0YWtlcyBwcmludGYgc3R5bGUgYXJndW1lbnRzLgorICoKKyAqIEBwYXJhbSBmbXQgQyBmb3JtYXQgc3RyaW5nIGZvbGxvd2VkIGJ5IGFkZGl0aW9uYWwgYXJndW1lbnRzCisgKi8KK3ZvaWQgeXllcnJvcihjb25zdCBjaGFyKiBmbXQsIC4uLikgeworICB2YV9saXN0IGFyZ3M7CisgIGZwcmludGYoc3RkZXJyLCAiW0VSUk9SOiVzOiVkXSAobGFzdCB0b2tlbiB3YXMgJyVzJylcbiIsIGdfY3VycGF0aC5jX3N0cigpLCB5eWxpbmVubywgeXl0ZXh0KTsKKworICB2YV9zdGFydChhcmdzLCBmbXQpOworICB2ZnByaW50ZihzdGRlcnIsIGZtdCwgYXJncyk7CisgIHZhX2VuZChhcmdzKTsKKworICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7Cit9CisKKy8qKgorICogUHJpbnRzIGEgZGVidWcgbWVzc2FnZSBmcm9tIHRoZSBwYXJzZXIuCisgKgorICogQHBhcmFtIGZtdCBDIGZvcm1hdCBzdHJpbmcgZm9sbG93ZWQgYnkgYWRkaXRpb25hbCBhcmd1bWVudHMKKyAqLwordm9pZCBwZGVidWcoY29uc3QgY2hhciogZm10LCAuLi4pIHsKKyAgaWYgKGdfZGVidWcgPT0gMCkgeworICAgIHJldHVybjsKKyAgfQorICB2YV9saXN0IGFyZ3M7CisgIHByaW50ZigiW1BBUlNFOiVkXSAiLCB5eWxpbmVubyk7CisgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisgIHZwcmludGYoZm10LCBhcmdzKTsKKyAgdmFfZW5kKGFyZ3MpOworICBwcmludGYoIlxuIik7Cit9CisKKy8qKgorICogUHJpbnRzIGEgdmVyYm9zZSBvdXRwdXQgbW9kZSBtZXNzYWdlCisgKgorICogQHBhcmFtIGZtdCBDIGZvcm1hdCBzdHJpbmcgZm9sbG93ZWQgYnkgYWRkaXRpb25hbCBhcmd1bWVudHMKKyAqLwordm9pZCBwdmVyYm9zZShjb25zdCBjaGFyKiBmbXQsIC4uLikgeworICBpZiAoZ192ZXJib3NlID09IDApIHsKKyAgICByZXR1cm47CisgIH0KKyAgdmFfbGlzdCBhcmdzOworICB2YV9zdGFydChhcmdzLCBmbXQpOworICB2cHJpbnRmKGZtdCwgYXJncyk7CisgIHZhX2VuZChhcmdzKTsKK30KKworLyoqCisgKiBQcmludHMgYSB3YXJuaW5nIG1lc3NhZ2UKKyAqCisgKiBAcGFyYW0gZm10IEMgZm9ybWF0IHN0cmluZyBmb2xsb3dlZCBieSBhZGRpdGlvbmFsIGFyZ3VtZW50cworICovCit2b2lkIHB3YXJuaW5nKGludCBsZXZlbCwgY29uc3QgY2hhciogZm10LCAuLi4pIHsKKyAgaWYgKGdfd2FybiA8IGxldmVsKSB7CisgICAgcmV0dXJuOworICB9CisgIHZhX2xpc3QgYXJnczsKKyAgcHJpbnRmKCJbV0FSTklORzolczolZF0gIiwgZ19jdXJwYXRoLmNfc3RyKCksIHl5bGluZW5vKTsKKyAgdmFfc3RhcnQoYXJncywgZm10KTsKKyAgdnByaW50ZihmbXQsIGFyZ3MpOworICB2YV9lbmQoYXJncyk7CisgIHByaW50ZigiXG4iKTsKK30KKworLyoqCisgKiBQcmludHMgYSBmYWlsdXJlIG1lc3NhZ2UgYW5kIGV4aXRzCisgKgorICogQHBhcmFtIGZtdCBDIGZvcm1hdCBzdHJpbmcgZm9sbG93ZWQgYnkgYWRkaXRpb25hbCBhcmd1bWVudHMKKyAqLwordm9pZCBmYWlsdXJlKGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7CisgIHZhX2xpc3QgYXJnczsKKyAgZnByaW50ZihzdGRlcnIsICJbRkFJTFVSRTolczolZF0gIiwgZ19jdXJwYXRoLmNfc3RyKCksIHl5bGluZW5vKTsKKyAgdmFfc3RhcnQoYXJncywgZm10KTsKKyAgdmZwcmludGYoc3RkZXJyLCBmbXQsIGFyZ3MpOworICB2YV9lbmQoYXJncyk7CisgIHByaW50ZigiXG4iKTsKKyAgZXhpdCgxKTsKK30KKworLyoqCisgKiBDb252ZXJ0cyBhIHN0cmluZyBmaWxlbmFtZSBpbnRvIGEgdGhyaWZ0IHByb2dyYW0gbmFtZQorICovCitzdHJpbmcgcHJvZ3JhbV9uYW1lKHN0cmluZyBmaWxlbmFtZSkgeworICBzdHJpbmc6OnNpemVfdHlwZSBzbGFzaCA9IGZpbGVuYW1lLnJmaW5kKCIvIik7CisgIGlmIChzbGFzaCAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICBmaWxlbmFtZSA9IGZpbGVuYW1lLnN1YnN0cihzbGFzaCArIDEpOworICB9CisgIHN0cmluZzo6c2l6ZV90eXBlIGRvdCA9IGZpbGVuYW1lLnJmaW5kKCIuIik7CisgIGlmIChkb3QgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgZmlsZW5hbWUgPSBmaWxlbmFtZS5zdWJzdHIoMCwgZG90KTsKKyAgfQorICByZXR1cm4gZmlsZW5hbWU7Cit9CisKKy8qKgorICogR2V0cyB0aGUgZGlyZWN0b3J5IHBhdGggb2YgYSBmaWxlbmFtZQorICovCitzdHJpbmcgZGlyZWN0b3J5X25hbWUoc3RyaW5nIGZpbGVuYW1lKSB7CisgIHN0cmluZzo6c2l6ZV90eXBlIHNsYXNoID0gZmlsZW5hbWUucmZpbmQoIi8iKTsKKyAgLy8gTm8gc2xhc2gsIGp1c3QgdXNlIHRoZSBjdXJyZW50IGRpcmVjdG9yeQorICBpZiAoc2xhc2ggPT0gc3RyaW5nOjpucG9zKSB7CisgICAgcmV0dXJuICIuIjsKKyAgfQorICByZXR1cm4gZmlsZW5hbWUuc3Vic3RyKDAsIHNsYXNoKTsKK30KKworLyoqCisgKiBGaW5kcyB0aGUgYXBwcm9wcmlhdGUgZmlsZSBwYXRoIGZvciB0aGUgZ2l2ZW4gZmlsZW5hbWUKKyAqLworc3RyaW5nIGluY2x1ZGVfZmlsZShzdHJpbmcgZmlsZW5hbWUpIHsKKyAgLy8gQWJzb2x1dGUgcGF0aD8gSnVzdCB0cnkgdGhhdAorICBpZiAoZmlsZW5hbWVbMF0gPT0gJy8nKSB7CisgICAgLy8gUmVhbHBhdGghCisgICAgY2hhciBycFtUSFJJRlRfUEFUSF9NQVhdOworICAgIC8vIGNwcGNoZWNrLXN1cHByZXNzIHVuaW5pdHZhcgorICAgIGlmIChzYWZlcmVhbHBhdGgoZmlsZW5hbWUuY19zdHIoKSwgcnApID09IE5VTEwpIHsKKyAgICAgIHB3YXJuaW5nKDAsICJDYW5ub3Qgb3BlbiBpbmNsdWRlIGZpbGUgJXNcbiIsIGZpbGVuYW1lLmNfc3RyKCkpOworICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCk7CisgICAgfQorCisgICAgLy8gU3RhdCB0aGlzIGZpbGUKKyAgICBzdHJ1Y3Qgc3RhdCBmaW5mbzsKKyAgICBpZiAoc3RhdChycCwgJmZpbmZvKSA9PSAwKSB7CisgICAgICByZXR1cm4gcnA7CisgICAgfQorICB9IGVsc2UgeyAvLyByZWxhdGl2ZSBwYXRoLCBzdGFydCBzZWFyY2hpbmcKKyAgICAvLyBuZXcgc2VhcmNoIHBhdGggd2l0aCBjdXJyZW50IGRpciBnbG9iYWwKKyAgICB2ZWN0b3I8c3RyaW5nPiBzcCA9IGdfaW5jbF9zZWFyY2hwYXRoOworICAgIHNwLmluc2VydChzcC5iZWdpbigpLCBnX2N1cmRpcik7CisKKyAgICAvLyBpdGVyYXRlIHRocm91Z2ggcGF0aHMKKyAgICB2ZWN0b3I8c3RyaW5nPjo6aXRlcmF0b3IgaXQ7CisgICAgZm9yIChpdCA9IHNwLmJlZ2luKCk7IGl0ICE9IHNwLmVuZCgpOyBpdCsrKSB7CisgICAgICBzdHJpbmcgc2ZpbGVuYW1lID0gKihpdCkgKyAiLyIgKyBmaWxlbmFtZTsKKworICAgICAgLy8gUmVhbHBhdGghCisgICAgICBjaGFyIHJwW1RIUklGVF9QQVRIX01BWF07CisgICAgICAvLyBjcHBjaGVjay1zdXBwcmVzcyB1bmluaXR2YXIKKyAgICAgIGlmIChzYWZlcmVhbHBhdGgoc2ZpbGVuYW1lLmNfc3RyKCksIHJwKSA9PSBOVUxMKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICAvLyBTdGF0IHRoaXMgZmlsZXMKKyAgICAgIHN0cnVjdCBzdGF0IGZpbmZvOworICAgICAgaWYgKHN0YXQocnAsICZmaW5mbykgPT0gMCkgeworICAgICAgICByZXR1cm4gcnA7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gVWggb2gKKyAgcHdhcm5pbmcoMCwgIkNvdWxkIG5vdCBmaW5kIGluY2x1ZGUgZmlsZSAlc1xuIiwgZmlsZW5hbWUuY19zdHIoKSk7CisgIHJldHVybiBzdGQ6OnN0cmluZygpOworfQorCisvKioKKyAqIENsZWFycyBhbnkgcHJldmlvdXNseSBzdG9yZWQgZG9jdGV4dCBzdHJpbmcuCisgKiBBbHNvIHByaW50cyBhIHdhcm5pbmcgaWYgd2UgYXJlIGRpc2NhcmRpbmcgaW5mb3JtYXRpb24uCisgKi8KK3ZvaWQgY2xlYXJfZG9jdGV4dCgpIHsKKyAgaWYgKGdfZG9jdGV4dCAhPSBOVUxMKSB7CisgICAgcHdhcm5pbmcoMiwgIlVuY2FwdHVyZWQgZG9jdGV4dCBhdCBvbiBsaW5lICVkLiIsIGdfZG9jdGV4dF9saW5lbm8pOworICB9CisgIGZyZWUoZ19kb2N0ZXh0KTsKKyAgZ19kb2N0ZXh0ID0gTlVMTDsKK30KKworLyoqCisgKiBSZXNldCBwcm9ncmFtIGRvY3RleHQgaW5mb3JtYXRpb24gYWZ0ZXIgcHJvY2Vzc2luZyBhIGZpbGUKKyAqLwordm9pZCByZXNldF9wcm9ncmFtX2RvY3RleHRfaW5mbygpIHsKKyAgaWYgKGdfcHJvZ3JhbV9kb2N0ZXh0X2NhbmRpZGF0ZSAhPSBOVUxMKSB7CisgICAgZnJlZShnX3Byb2dyYW1fZG9jdGV4dF9jYW5kaWRhdGUpOworICAgIGdfcHJvZ3JhbV9kb2N0ZXh0X2NhbmRpZGF0ZSA9IE5VTEw7CisgIH0KKyAgZ19wcm9ncmFtX2RvY3RleHRfbGluZW5vID0gMDsKKyAgZ19wcm9ncmFtX2RvY3RleHRfc3RhdHVzID0gSU5WQUxJRDsKKyAgcGRlYnVnKCIlcyIsICJwcm9ncmFtIGRvY3RleHQgc2V0IHRvIElOVkFMSUQiKTsKK30KKworLyoqCisgKiBXZSBhcmUgc3VyZSB0aGUgcHJvZ3JhbSBkb2N0ZXh0IGNhbmRpZGF0ZSBpcyByZWFsbHkgdGhlIHByb2dyYW0gZG9jdGV4dC4KKyAqLwordm9pZCBkZWNsYXJlX3ZhbGlkX3Byb2dyYW1fZG9jdGV4dCgpIHsKKyAgaWYgKChnX3Byb2dyYW1fZG9jdGV4dF9jYW5kaWRhdGUgIT0gTlVMTCkgJiYgKGdfcHJvZ3JhbV9kb2N0ZXh0X3N0YXR1cyA9PSBTVElMTF9DQU5ESURBVEUpKSB7CisgICAgZ19wcm9ncmFtX2RvY3RleHRfc3RhdHVzID0gQUJTT0xVVEVMWV9TVVJFOworICAgIHBkZWJ1ZygiJXMiLCAicHJvZ3JhbSBkb2N0ZXh0IHNldCB0byBBQlNPTFVURUxZX1NVUkUiKTsKKyAgfSBlbHNlIHsKKyAgICBnX3Byb2dyYW1fZG9jdGV4dF9zdGF0dXMgPSBOT19QUk9HUkFNX0RPQ1RFWFQ7CisgICAgcGRlYnVnKCIlcyIsICJwcm9ncmFtIGRvY3RleHQgc2V0IHRvIE5PX1BST0dSQU1fRE9DVEVYVCIpOworICB9Cit9CisKKy8qKgorICogQ2xlYW5zIHVwIHRleHQgY29tbW9ubHkgZm91bmQgaW4gZG94eWdlbi1saWtlIGNvbW1lbnRzCisgKgorICogV2FybmluZzogaWYgeW91IG1peCB0YWJzIGFuZCBzcGFjZXMgaW4gYSBub24tdW5pZm9ybSB3YXksCisgKiB5b3Ugd2lsbCBnZXQgd2hhdCB5b3UgZGVzZXJ2ZS4KKyAqLworY2hhciogY2xlYW5fdXBfZG9jdGV4dChjaGFyKiBkb2N0ZXh0KSB7CisgIC8vIENvbnZlcnQgdG8gQysrIHN0cmluZywgYW5kIHJlbW92ZSBXaW5kb3dzJ3MgY2FycmlhZ2UgcmV0dXJucy4KKyAgc3RyaW5nIGRvY3N0cmluZyA9IGRvY3RleHQ7CisgIGRvY3N0cmluZy5lcmFzZShyZW1vdmUoZG9jc3RyaW5nLmJlZ2luKCksIGRvY3N0cmluZy5lbmQoKSwgJ1xyJyksIGRvY3N0cmluZy5lbmQoKSk7CisKKyAgLy8gU2VwYXJhdGUgaW50byBsaW5lcy4KKyAgdmVjdG9yPHN0cmluZz4gbGluZXM7CisgIHN0cmluZzo6c2l6ZV90eXBlIHBvcyA9IHN0cmluZzo6bnBvczsKKyAgc3RyaW5nOjpzaXplX3R5cGUgbGFzdDsKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBsYXN0ID0gKHBvcyA9PSBzdHJpbmc6Om5wb3MpID8gMCA6IHBvcyArIDE7CisgICAgcG9zID0gZG9jc3RyaW5nLmZpbmQoJ1xuJywgbGFzdCk7CisgICAgaWYgKHBvcyA9PSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgIC8vIEZpcnN0IGJpdCBvZiBjbGVhbmluZy4gIElmIHRoZSBsYXN0IGxpbmUgaXMgb25seSB3aGl0ZXNwYWNlLCBkcm9wIGl0LgorICAgICAgc3RyaW5nOjpzaXplX3R5cGUgbm9ud2hpdGUgPSBkb2NzdHJpbmcuZmluZF9maXJzdF9ub3Rfb2YoIiBcdCIsIGxhc3QpOworICAgICAgaWYgKG5vbndoaXRlICE9IHN0cmluZzo6bnBvcykgeworICAgICAgICBsaW5lcy5wdXNoX2JhY2soZG9jc3RyaW5nLnN1YnN0cihsYXN0KSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgbGluZXMucHVzaF9iYWNrKGRvY3N0cmluZy5zdWJzdHIobGFzdCwgcG9zIC0gbGFzdCkpOworICB9CisKKyAgLy8gQSB2ZXJ5IHByb2ZvdW5kIGRvY3N0cmluZy4KKyAgaWYgKGxpbmVzLmVtcHR5KCkpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIC8vIENsZWFyIGxlYWRpbmcgd2hpdGVzcGFjZSBmcm9tIHRoZSBmaXJzdCBsaW5lLgorICBwb3MgPSBsaW5lcy5mcm9udCgpLmZpbmRfZmlyc3Rfbm90X29mKCIgXHQiKTsKKyAgbGluZXMuZnJvbnQoKS5lcmFzZSgwLCBwb3MpOworCisgIC8vIElmIGV2ZXJ5IG5vbmJsYW5rIGxpbmUgYWZ0ZXIgdGhlIGZpcnN0IGhhcyB0aGUgc2FtZSBudW1iZXIgb2Ygc3BhY2VzL3RhYnMsCisgIC8vIHRoZW4gYSBzdGFyLCByZW1vdmUgdGhlbS4KKyAgYm9vbCBoYXZlX3ByZWZpeCA9IHRydWU7CisgIGJvb2wgZm91bmRfcHJlZml4ID0gZmFsc2U7CisgIHN0cmluZzo6c2l6ZV90eXBlIHByZWZpeF9sZW4gPSAwOworICB2ZWN0b3I8c3RyaW5nPjo6aXRlcmF0b3IgbF9pdGVyOworICBmb3IgKGxfaXRlciA9IGxpbmVzLmJlZ2luKCkgKyAxOyBsX2l0ZXIgIT0gbGluZXMuZW5kKCk7ICsrbF9pdGVyKSB7CisgICAgaWYgKGxfaXRlci0+ZW1wdHkoKSkgeworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgcG9zID0gbF9pdGVyLT5maW5kX2ZpcnN0X25vdF9vZigiIFx0Iik7CisgICAgaWYgKCFmb3VuZF9wcmVmaXgpIHsKKyAgICAgIGlmIChwb3MgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgICAgIGlmIChsX2l0ZXItPmF0KHBvcykgPT0gJyonKSB7CisgICAgICAgICAgZm91bmRfcHJlZml4ID0gdHJ1ZTsKKyAgICAgICAgICBwcmVmaXhfbGVuID0gcG9zOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGhhdmVfcHJlZml4ID0gZmFsc2U7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFdoaXRlc3BhY2Utb25seSBsaW5lLiAgVHJ1bmNhdGUgaXQuCisgICAgICAgIGxfaXRlci0+Y2xlYXIoKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGxfaXRlci0+c2l6ZSgpID4gcG9zICYmIGxfaXRlci0+YXQocG9zKSA9PSAnKicgJiYgcG9zID09IHByZWZpeF9sZW4pIHsKKyAgICAgIC8vIEJ1c2luZXNzIGFzIHVzdWFsLgorICAgIH0gZWxzZSBpZiAocG9zID09IHN0cmluZzo6bnBvcykgeworICAgICAgLy8gV2hpdGVzcGFjZS1vbmx5IGxpbmUuICBMZXQncyB0cnVuY2F0ZSBpdCBmb3IgdGhlbS4KKyAgICAgIGxfaXRlci0+Y2xlYXIoKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gVGhlIHBhdHRlcm4gaGFzIGJlZW4gYnJva2VuLgorICAgICAgaGF2ZV9wcmVmaXggPSBmYWxzZTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIC8vIElmIG91ciBwcmVmaXggc3Vydml2ZWQsIGRlbGV0ZSBpdCBmcm9tIGV2ZXJ5IGxpbmUuCisgIGlmIChoYXZlX3ByZWZpeCkgeworICAgIC8vIEdldCB0aGUgc3RhciB0b28uCisgICAgcHJlZml4X2xlbisrOworICAgIGZvciAobF9pdGVyID0gbGluZXMuYmVnaW4oKSArIDE7IGxfaXRlciAhPSBsaW5lcy5lbmQoKTsgKytsX2l0ZXIpIHsKKyAgICAgIGxfaXRlci0+ZXJhc2UoMCwgcHJlZml4X2xlbik7CisgICAgfQorICB9CisKKyAgLy8gTm93IGRlbGV0ZSB0aGUgbWluaW11bSBhbW91bnQgb2YgbGVhZGluZyB3aGl0ZXNwYWNlIGZyb20gZWFjaCBsaW5lLgorICBwcmVmaXhfbGVuID0gc3RyaW5nOjpucG9zOworICBmb3IgKGxfaXRlciA9IGxpbmVzLmJlZ2luKCkgKyAxOyBsX2l0ZXIgIT0gbGluZXMuZW5kKCk7ICsrbF9pdGVyKSB7CisgICAgaWYgKGxfaXRlci0+ZW1wdHkoKSkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIHBvcyA9IGxfaXRlci0+ZmluZF9maXJzdF9ub3Rfb2YoIiBcdCIpOworICAgIGlmIChwb3MgIT0gc3RyaW5nOjpucG9zICYmIChwcmVmaXhfbGVuID09IHN0cmluZzo6bnBvcyB8fCBwb3MgPCBwcmVmaXhfbGVuKSkgeworICAgICAgcHJlZml4X2xlbiA9IHBvczsKKyAgICB9CisgIH0KKworICAvLyBJZiBvdXIgcHJlZml4IHN1cnZpdmVkLCBkZWxldGUgaXQgZnJvbSBldmVyeSBsaW5lLgorICBpZiAocHJlZml4X2xlbiAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICBmb3IgKGxfaXRlciA9IGxpbmVzLmJlZ2luKCkgKyAxOyBsX2l0ZXIgIT0gbGluZXMuZW5kKCk7ICsrbF9pdGVyKSB7CisgICAgICBsX2l0ZXItPmVyYXNlKDAsIHByZWZpeF9sZW4pOworICAgIH0KKyAgfQorCisgIC8vIFJlbW92ZSB0cmFpbGluZyB3aGl0ZXNwYWNlIGZyb20gZXZlcnkgbGluZS4KKyAgZm9yIChsX2l0ZXIgPSBsaW5lcy5iZWdpbigpOyBsX2l0ZXIgIT0gbGluZXMuZW5kKCk7ICsrbF9pdGVyKSB7CisgICAgcG9zID0gbF9pdGVyLT5maW5kX2xhc3Rfbm90X29mKCIgXHQiKTsKKyAgICBpZiAocG9zICE9IHN0cmluZzo6bnBvcyAmJiBwb3MgIT0gbF9pdGVyLT5sZW5ndGgoKSAtIDEpIHsKKyAgICAgIGxfaXRlci0+ZXJhc2UocG9zICsgMSk7CisgICAgfQorICB9CisKKyAgLy8gSWYgdGhlIGZpcnN0IGxpbmUgaXMgZW1wdHksIHJlbW92ZSBpdC4KKyAgLy8gRG9uJ3QgZG8gdGhpcyBlYXJsaWVyIGJlY2F1c2UgYSBsb3Qgb2Ygc3RlcHMgc2tpcCB0aGUgZmlyc3QgbGluZS4KKyAgaWYgKGxpbmVzLmZyb250KCkuZW1wdHkoKSkgeworICAgIGxpbmVzLmVyYXNlKGxpbmVzLmJlZ2luKCkpOworICB9CisKKyAgLy8gTm93IHJlam9pbiB0aGUgbGluZXMgYW5kIGNvcHkgdGhlbSBiYWNrIGludG8gZG9jdGV4dC4KKyAgZG9jc3RyaW5nLmNsZWFyKCk7CisgIGZvciAobF9pdGVyID0gbGluZXMuYmVnaW4oKTsgbF9pdGVyICE9IGxpbmVzLmVuZCgpOyArK2xfaXRlcikgeworICAgIGRvY3N0cmluZyArPSAqbF9pdGVyOworICAgIGRvY3N0cmluZyArPSAnXG4nOworICB9CisKKyAgLy8gYXNzZXJ0KGRvY3N0cmluZy5sZW5ndGgoKSA8PSBzdHJsZW4oZG9jdGV4dCkpOyAgbWF5IGhhcHBlbiwgc2VlIFRIUklGVC0xNzU1CisgIGlmIChkb2NzdHJpbmcubGVuZ3RoKCkgPD0gc3RybGVuKGRvY3RleHQpKSB7CisgICAgc3RyY3B5KGRvY3RleHQsIGRvY3N0cmluZy5jX3N0cigpKTsKKyAgfSBlbHNlIHsKKyAgICBmcmVlKGRvY3RleHQpOyAvLyB0b28gc2hvcnQKKyAgICBkb2N0ZXh0ID0gc3RyZHVwKGRvY3N0cmluZy5jX3N0cigpKTsKKyAgfQorICByZXR1cm4gZG9jdGV4dDsKK30KKworLyoqIFNldCB0byB0cnVlIHRvIGRlYnVnIGRvY3N0cmluZyBwYXJzaW5nICovCitzdGF0aWMgYm9vbCBkdW1wX2RvY3MgPSBmYWxzZTsKKworLyoqCisgKiBEdW1wcyBkb2NzdHJpbmdzIHRvIHN0ZG91dAorICogT25seSB3b3JrcyBmb3IgdG9wLWxldmVsIGRlZmluaXRpb25zIGFuZCB0aGUgd2hvbGUgcHJvZ3JhbSBkb2MKKyAqIChpLmUuLCBub3QgZW51bSBjb25zdGFudHMsIHN0cnVjdCBmaWVsZHMsIG9yIGZ1bmN0aW9ucy4KKyAqLwordm9pZCBkdW1wX2RvY3N0cmluZ3ModF9wcm9ncmFtKiBwcm9ncmFtKSB7CisgIHN0cmluZyBwcm9nZG9jID0gcHJvZ3JhbS0+Z2V0X2RvYygpOworICBpZiAoIXByb2dkb2MuZW1wdHkoKSkgeworICAgIHByaW50ZigiV2hvbGUgcHJvZ3JhbSBkb2M6XG4lc1xuIiwgcHJvZ2RvYy5jX3N0cigpKTsKKyAgfQorICBjb25zdCB2ZWN0b3I8dF90eXBlZGVmKj4mIHR5cGVkZWZzID0gcHJvZ3JhbS0+Z2V0X3R5cGVkZWZzKCk7CisgIHZlY3Rvcjx0X3R5cGVkZWYqPjo6Y29uc3RfaXRlcmF0b3IgdF9pdGVyOworICBmb3IgKHRfaXRlciA9IHR5cGVkZWZzLmJlZ2luKCk7IHRfaXRlciAhPSB0eXBlZGVmcy5lbmQoKTsgKyt0X2l0ZXIpIHsKKyAgICB0X3R5cGVkZWYqIHRkID0gKnRfaXRlcjsKKyAgICBpZiAodGQtPmhhc19kb2MoKSkgeworICAgICAgcHJpbnRmKCJ0eXBlZGVmICVzOlxuJXNcbiIsIHRkLT5nZXRfbmFtZSgpLmNfc3RyKCksIHRkLT5nZXRfZG9jKCkuY19zdHIoKSk7CisgICAgfQorICB9CisgIGNvbnN0IHZlY3Rvcjx0X2VudW0qPiYgZW51bXMgPSBwcm9ncmFtLT5nZXRfZW51bXMoKTsKKyAgdmVjdG9yPHRfZW51bSo+Ojpjb25zdF9pdGVyYXRvciBlX2l0ZXI7CisgIGZvciAoZV9pdGVyID0gZW51bXMuYmVnaW4oKTsgZV9pdGVyICE9IGVudW1zLmVuZCgpOyArK2VfaXRlcikgeworICAgIHRfZW51bSogZW4gPSAqZV9pdGVyOworICAgIGlmIChlbi0+aGFzX2RvYygpKSB7CisgICAgICBwcmludGYoImVudW0gJXM6XG4lc1xuIiwgZW4tPmdldF9uYW1lKCkuY19zdHIoKSwgZW4tPmdldF9kb2MoKS5jX3N0cigpKTsKKyAgICB9CisgIH0KKyAgY29uc3QgdmVjdG9yPHRfY29uc3QqPiYgY29uc3RzID0gcHJvZ3JhbS0+Z2V0X2NvbnN0cygpOworICB2ZWN0b3I8dF9jb25zdCo+Ojpjb25zdF9pdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgdF9jb25zdCogY28gPSAqY19pdGVyOworICAgIGlmIChjby0+aGFzX2RvYygpKSB7CisgICAgICBwcmludGYoImNvbnN0ICVzOlxuJXNcbiIsIGNvLT5nZXRfbmFtZSgpLmNfc3RyKCksIGNvLT5nZXRfZG9jKCkuY19zdHIoKSk7CisgICAgfQorICB9CisgIGNvbnN0IHZlY3Rvcjx0X3N0cnVjdCo+JiBzdHJ1Y3RzID0gcHJvZ3JhbS0+Z2V0X3N0cnVjdHMoKTsKKyAgdmVjdG9yPHRfc3RydWN0Kj46OmNvbnN0X2l0ZXJhdG9yIHNfaXRlcjsKKyAgZm9yIChzX2l0ZXIgPSBzdHJ1Y3RzLmJlZ2luKCk7IHNfaXRlciAhPSBzdHJ1Y3RzLmVuZCgpOyArK3NfaXRlcikgeworICAgIHRfc3RydWN0KiBzdCA9ICpzX2l0ZXI7CisgICAgaWYgKHN0LT5oYXNfZG9jKCkpIHsKKyAgICAgIHByaW50Zigic3RydWN0ICVzOlxuJXNcbiIsIHN0LT5nZXRfbmFtZSgpLmNfc3RyKCksIHN0LT5nZXRfZG9jKCkuY19zdHIoKSk7CisgICAgfQorICB9CisgIGNvbnN0IHZlY3Rvcjx0X3N0cnVjdCo+JiB4Y2VwdGlvbnMgPSBwcm9ncmFtLT5nZXRfeGNlcHRpb25zKCk7CisgIHZlY3Rvcjx0X3N0cnVjdCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIHhuID0gKnhfaXRlcjsKKyAgICBpZiAoeG4tPmhhc19kb2MoKSkgeworICAgICAgcHJpbnRmKCJ4Y2VwdGlvbiAlczpcbiVzXG4iLCB4bi0+Z2V0X25hbWUoKS5jX3N0cigpLCB4bi0+Z2V0X2RvYygpLmNfc3RyKCkpOworICAgIH0KKyAgfQorICBjb25zdCB2ZWN0b3I8dF9zZXJ2aWNlKj4mIHNlcnZpY2VzID0gcHJvZ3JhbS0+Z2V0X3NlcnZpY2VzKCk7CisgIHZlY3Rvcjx0X3NlcnZpY2UqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICBmb3IgKHZfaXRlciA9IHNlcnZpY2VzLmJlZ2luKCk7IHZfaXRlciAhPSBzZXJ2aWNlcy5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICB0X3NlcnZpY2UqIHN2ID0gKnZfaXRlcjsKKyAgICBpZiAoc3YtPmhhc19kb2MoKSkgeworICAgICAgcHJpbnRmKCJzZXJ2aWNlICVzOlxuJXNcbiIsIHN2LT5nZXRfbmFtZSgpLmNfc3RyKCksIHN2LT5nZXRfZG9jKCkuY19zdHIoKSk7CisgICAgfQorICB9Cit9CisKKy8qKgorICogRW1pdHMgYSB3YXJuaW5nIG9uIGxpc3Q8Ynl0ZT4sIGJpbmFyeSB0eXBlIGlzIHR5cGljYWxseSBhIG11Y2ggYmV0dGVyIGNob2ljZS4KKyAqLwordm9pZCBjaGVja19mb3JfbGlzdF9vZl9ieXRlcyh0X3R5cGUqIGxpc3RfZWxlbV90eXBlKSB7CisgIGlmICgoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pICYmIChsaXN0X2VsZW1fdHlwZSAhPSBOVUxMKSAmJiBsaXN0X2VsZW1fdHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZSogdGJhc2UgPSAodF9iYXNlX3R5cGUqKWxpc3RfZWxlbV90eXBlOworICAgIGlmICh0YmFzZS0+Z2V0X2Jhc2UoKSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9JOCkgeworICAgICAgcHdhcm5pbmcoMSwgIkNvbnNpZGVyIHVzaW5nIHRoZSBtb3JlIGVmZmljaWVudCBcImJpbmFyeVwiIHR5cGUgaW5zdGVhZCBvZiBcImxpc3Q8Ynl0ZT5cIi4iKTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIGJvb2wgZ19ieXRlX3dhcm5pbmdfZW1pdHRlZCA9IGZhbHNlOworCisvKioKKyAqIEVtaXRzIGEgb25lLXRpbWUgd2FybmluZyBvbiBieXRlIHR5cGUsIHByb21vdGluZyB0aGUgbmV3IGk4IHR5cGUgaW5zdGVhZAorICovCit2b2lkIGVtaXRfYnl0ZV90eXBlX3dhcm5pbmcoKSB7CisgIGlmICghZ19ieXRlX3dhcm5pbmdfZW1pdHRlZCkgeworICAgIHB3YXJuaW5nKDEsCisgICAgICAgICAgICAgIlRoZSBcImJ5dGVcIiB0eXBlIGlzIGEgY29tcGF0aWJpbGl0eSBhbGlhcyBmb3IgXCJpOFwiLiBVc2UgXCJpOFwiIHRvIGVtcGhhc2l6ZSB0aGUgIgorICAgICAgICAgICAgICJzaWduZWRuZXNzIG9mIHRoaXMgdHlwZS5cbiIpOworICAgIGdfYnl0ZV93YXJuaW5nX2VtaXR0ZWQgPSB0cnVlOworICB9Cit9CisKKy8qKgorICogUHJpbnRzIGRlcHJlY2F0aW9uIG5vdGljZSBmb3Igb2xkIE5TIGRlY2xhcmF0aW9ucyB0aGF0IGFyZSBubyBsb25nZXIgc3VwcG9ydGVkCisgKiBJZiBuZXdfZm9ybSBpcyBOVUxMLCBvbGRfZm9ybSBpcyBhc3N1bWVkIHRvIGJlIGEgbGFuZ3VhZ2UgaWRlbnRpZmllciwgc3VjaCBhcyAiY3BwIgorICogSWYgbmV3X2Zvcm0gaXMgbm90IE5VTEwsIGJvdGggYXJndW1lbnRzIGFyZSB1c2VkIGV4YWN0bHkgYXMgZ2l2ZW4KKyAqLwordm9pZCBlcnJvcl91bnN1cHBvcnRlZF9uYW1lc3BhY2VfZGVjbChjb25zdCBjaGFyKiBvbGRfZm9ybSwgY29uc3QgY2hhciogbmV3X2Zvcm0pIHsKKyAgY29uc3QgY2hhciogcmVtYWluZGVyID0gIiI7CisgIGlmKCBuZXdfZm9ybSA9PSBOVUxMKSB7CisgICAgbmV3X2Zvcm0gPSBvbGRfZm9ybTsKKyAgICByZW1haW5kZXIgPSAiX25hbWVzcGFjZSI7CisgIH0KKyAgZmFpbHVyZSgiVW5zdXBwb3J0ZWQgZGVjbGFyYXRpb24gJyVzJXMnLiBVc2UgJ25hbWVzcGFjZSAlcycgaW5zdGVhZC4iLCBvbGRfZm9ybSwgcmVtYWluZGVyLCBuZXdfZm9ybSk7Cit9CisKKy8qKgorICogUHJpbnRzIHRoZSB2ZXJzaW9uIG51bWJlcgorICovCit2b2lkIHZlcnNpb24oKSB7CisgIHByaW50ZigiVGhyaWZ0IHZlcnNpb24gJXNcbiIsIFRIUklGVF9WRVJTSU9OKTsKK30KKworLyoqCisgKiBEaXNwbGF5IHRoZSB1c2FnZSBtZXNzYWdlIGFuZCB0aGVuIGV4aXQgd2l0aCBhbiBlcnJvciBjb2RlLgorICovCit2b2lkIHVzYWdlKCkgeworICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiB0aHJpZnQgW29wdGlvbnNdIGZpbGVcblxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiVXNlIHRocmlmdCAtaGVscCBmb3IgYSBsaXN0IG9mIG9wdGlvbnNcbiIpOworICBleGl0KDEpOworfQorCisvKioKKyAqIERpcGxheXMgdGhlIGhlbHAgbWVzc2FnZSBhbmQgdGhlbiBleGl0cyB3aXRoIGFuIGVycm9yIGNvZGUuCisgKi8KK3ZvaWQgaGVscCgpIHsKKyAgZnByaW50ZihzdGRlcnIsICJVc2FnZTogdGhyaWZ0IFtvcHRpb25zXSBmaWxlXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICJPcHRpb25zOlxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtdmVyc2lvbiAgICBQcmludCB0aGUgY29tcGlsZXIgdmVyc2lvblxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtbyBkaXIgICAgICBTZXQgdGhlIG91dHB1dCBkaXJlY3RvcnkgZm9yIGdlbi0qIHBhY2thZ2VzXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAoZGVmYXVsdDogY3VycmVudCBkaXJlY3RvcnkpXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC1vdXQgZGlyICAgIFNldCB0aGUgb3VwdXQgbG9jYXRpb24gZm9yIGdlbmVyYXRlZCBmaWxlcy5cbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgIChubyBnZW4tKiBmb2xkZXIgd2lsbCBiZSBjcmVhdGVkKVxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtSSBkaXIgICAgICBBZGQgYSBkaXJlY3RvcnkgdG8gdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXNcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICBzZWFyY2hlZCBmb3IgaW5jbHVkZSBkaXJlY3RpdmVzXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC1ub3dhcm4gICAgIFN1cHByZXNzIGFsbCBjb21waWxlciB3YXJuaW5ncyAoQkFEISlcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLXN0cmljdCAgICAgU3RyaWN0IGNvbXBpbGVyIHdhcm5pbmdzIG9uXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC12W2VyYm9zZV0gIFZlcmJvc2UgbW9kZVxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtcltlY3Vyc2VdICBBbHNvIGdlbmVyYXRlIGluY2x1ZGVkIGZpbGVzXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC1kZWJ1ZyAgICAgIFBhcnNlIGRlYnVnIHRyYWNlIHRvIHN0ZG91dFxuIik7CisgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICIgIC0tYWxsb3ctbmVnLWtleXMgIEFsbG93IG5lZ2F0aXZlIGZpZWxkIGtleXMgKFVzZWQgdG8gIgorICAgICAgICAgICJwcmVzZXJ2ZSBwcm90b2NvbFxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciAudGhyaWZ0IGZpbGVzKVxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtLWFsbG93LTY0Yml0LWNvbnN0cyAgRG8gbm90IHByaW50IHdhcm5pbmdzIGFib3V0IHVzaW5nIDY0LWJpdCBjb25zdGFudHNcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLS1nZW4gU1RSICAgR2VuZXJhdGUgY29kZSB3aXRoIGEgZHluYW1pY2FsbHktcmVnaXN0ZXJlZCBnZW5lcmF0b3IuXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgU1RSIGhhcyB0aGUgZm9ybSBsYW5ndWFnZVs6a2V5MT12YWwxWyxrZXkyWyxrZXkzPXZhbDNdXV0uXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgS2V5cyBhbmQgdmFsdWVzIGFyZSBvcHRpb25zIHBhc3NlZCB0byB0aGUgZ2VuZXJhdG9yLlxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgIE1hbnkgb3B0aW9ucyB3aWxsIG5vdCByZXF1aXJlIHZhbHVlcy5cbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiT3B0aW9ucyByZWxhdGVkIHRvIGF1ZGl0IG9wZXJhdGlvblxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAgLS1hdWRpdCBPbGRGaWxlICAgT2xkIFRocmlmdCBmaWxlIHRvIGJlIGF1ZGl0ZWQgd2l0aCAnZmlsZSdcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLUlvbGQgZGlyICAgIEFkZCBhIGRpcmVjdG9yeSB0byB0aGUgbGlzdCBvZiBkaXJlY3Rvcmllc1xuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgIHNlYXJjaGVkIGZvciBpbmNsdWRlIGRpcmVjdGl2ZXMgZm9yIG9sZCB0aHJpZnQgZmlsZVxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtSW5ldyBkaXIgICAgQWRkIGEgZGlyZWN0b3J5IHRvIHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgc2VhcmNoZWQgZm9yIGluY2x1ZGUgZGlyZWN0aXZlcyBmb3IgbmV3IHRocmlmdCBmaWxlXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICJcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIkF2YWlsYWJsZSBnZW5lcmF0b3JzIChhbmQgb3B0aW9ucyk6XG4iKTsKKworICB0X2dlbmVyYXRvcl9yZWdpc3RyeTo6Z2VuX21hcF90IGdlbl9tYXAgPSB0X2dlbmVyYXRvcl9yZWdpc3RyeTo6Z2V0X2dlbmVyYXRvcl9tYXAoKTsKKyAgdF9nZW5lcmF0b3JfcmVnaXN0cnk6Omdlbl9tYXBfdDo6aXRlcmF0b3IgaXRlcjsKKyAgZm9yIChpdGVyID0gZ2VuX21hcC5iZWdpbigpOyBpdGVyICE9IGdlbl9tYXAuZW5kKCk7ICsraXRlcikgeworICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgIiAgJXMgKCVzKTpcbiIsCisgICAgICAgICAgICBpdGVyLT5zZWNvbmQtPmdldF9zaG9ydF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgIGl0ZXItPnNlY29uZC0+Z2V0X2xvbmdfbmFtZSgpLmNfc3RyKCkpOworICAgIGZwcmludGYoc3RkZXJyLCAiJXMiLCBpdGVyLT5zZWNvbmQtPmdldF9kb2N1bWVudGF0aW9uKCkuY19zdHIoKSk7CisgIH0KKyAgZXhpdCgxKTsKK30KKworLyoqCisgKiBZb3Uga25vdywgd2hlbiBJIHN0YXJ0ZWQgd29ya2luZyBvbiBUaHJpZnQgSSByZWFsbHkgdGhvdWdodCBpdCB3YXNuJ3QgZ29pbmcKKyAqIHRvIGJlY29tZSBhIHByb2dyYW1taW5nIGxhbmd1YWdlIGJlY2F1c2UgaXQgd2FzIGp1c3QgYSBnZW5lcmF0b3IgYW5kIGl0CisgKiB3b3VsZG4ndCBuZWVkIHJ1bnRpbWUgdHlwZSBpbmZvcm1hdGlvbiBhbmQgYWxsIHRoYXQgamF6ei4gQnV0IHRoZW4gd2UKKyAqIGRlY2lkZWQgdG8gYWRkIGNvbnN0YW50cywgYW5kIGFsbCBvZiBhIHN1ZGRlbiB0aGF0IG1lYW5zIHJ1bnRpbWUgdHlwZQorICogdmFsaWRhdGlvbiBhbmQgaW5mZXJlbmNlLCBleGNlcHQgdGhlICJydW50aW1lIiBpcyB0aGUgY29kZSBnZW5lcmF0b3IKKyAqIHJ1bnRpbWUuCisgKi8KK3ZvaWQgdmFsaWRhdGVfY29uc3RfcmVjKHN0ZDo6c3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgeworICAgIHRocm93ICJ0eXBlIGVycm9yOiBjYW5ub3QgZGVjbGFyZSBhIHZvaWQgY29uc3Q6ICIgKyBuYW1lOworICB9CisKKyAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9TVFJJTkcpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6IGNvbnN0IFwiIiArIG5hbWUgKyAiXCIgd2FzIGRlY2xhcmVkIGFzIHN0cmluZyI7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogY29uc3QgXCIiICsgbmFtZSArICJcIiB3YXMgZGVjbGFyZWQgYXMgYm9vbCI7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpICE9IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6IGNvbnN0IFwiIiArIG5hbWUgKyAiXCIgd2FzIGRlY2xhcmVkIGFzIGJ5dGUiOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogY29uc3QgXCIiICsgbmFtZSArICJcIiB3YXMgZGVjbGFyZWQgYXMgaTE2IjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpICE9IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6IGNvbnN0IFwiIiArIG5hbWUgKyAiXCIgd2FzIGRlY2xhcmVkIGFzIGkzMiI7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiBjb25zdCBcIiIgKyBuYW1lICsgIlwiIHdhcyBkZWNsYXJlZCBhcyBpNjQiOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUgorICAgICAgICAgICYmIHZhbHVlLT5nZXRfdHlwZSgpICE9IHRfY29uc3RfdmFsdWU6OkNWX0RPVUJMRSkgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogY29uc3QgXCIiICsgbmFtZSArICJcIiB3YXMgZGVjbGFyZWQgYXMgZG91YmxlIjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKSArIG5hbWU7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9JREVOVElGSUVSKSB7CisgICAgICB0aHJvdyAidHlwZSBlcnJvcjogY29uc3QgXCIiICsgbmFtZSArICJcIiB3YXMgZGVjbGFyZWQgYXMgZW51bSI7CisgICAgfQorCisgICAgLy8gc2VlIGlmIHRoZXJlJ3MgYSBkb3QgaW4gdGhlIGlkZW50aWZpZXIKKyAgICBzdGQ6OnN0cmluZyBuYW1lX3BvcnRpb24gPSB2YWx1ZS0+Z2V0X2lkZW50aWZpZXJfbmFtZSgpOworCisgICAgY29uc3QgdmVjdG9yPHRfZW51bV92YWx1ZSo+JiBlbnVtX3ZhbHVlcyA9ICgodF9lbnVtKil0eXBlKS0+Z2V0X2NvbnN0YW50cygpOworICAgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IgY19pdGVyOworICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKworICAgIGZvciAoY19pdGVyID0gZW51bV92YWx1ZXMuYmVnaW4oKTsgY19pdGVyICE9IGVudW1fdmFsdWVzLmVuZCgpOyArK2NfaXRlcikgeworICAgICAgaWYgKCgqY19pdGVyKS0+Z2V0X25hbWUoKSA9PSBuYW1lX3BvcnRpb24pIHsKKyAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFmb3VuZCkgeworICAgICAgdGhyb3cgInR5cGUgZXJyb3I6IGNvbnN0ICIgKyBuYW1lICsgIiB3YXMgZGVjbGFyZWQgYXMgdHlwZSAiICsgdHlwZS0+Z2V0X25hbWUoKQorICAgICAgICAgICsgIiB3aGljaCBpcyBhbiBlbnVtLCBidXQgIiArIHZhbHVlLT5nZXRfaWRlbnRpZmllcigpCisgICAgICAgICAgKyAiIGlzIG5vdCBhIHZhbGlkIHZhbHVlIGZvciB0aGF0IGVudW0iOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpICE9IHRfY29uc3RfdmFsdWU6OkNWX01BUCkgeworICAgICAgdGhyb3cgInR5cGUgZXJyb3I6IGNvbnN0IFwiIiArIG5hbWUgKyAiXCIgd2FzIGRlY2xhcmVkIGFzIHN0cnVjdC94Y2VwdGlvbiI7CisgICAgfQorICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIGlmICh2X2l0ZXItPmZpcnN0LT5nZXRfdHlwZSgpICE9IHRfY29uc3RfdmFsdWU6OkNWX1NUUklORykgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIG5hbWUgKyAiIHN0cnVjdCBrZXkgbXVzdCBiZSBzdHJpbmciOworICAgICAgfQorICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7CisgICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOworICAgICAgfQorCisgICAgICB2YWxpZGF0ZV9jb25zdF9yZWMobmFtZSArICIuIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSwgZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOworICAgIH0KKyAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgeworICAgIHRfdHlwZSoga190eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdl90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHZhbGlkYXRlX2NvbnN0X3JlYyhuYW1lICsgIjxrZXk+Iiwga190eXBlLCB2X2l0ZXItPmZpcnN0KTsKKyAgICAgIHZhbGlkYXRlX2NvbnN0X3JlYyhuYW1lICsgIjx2YWw+Iiwgdl90eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgeworICAgIHRfdHlwZSogZV90eXBlOworICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGVfdHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0gZWxzZSB7CisgICAgICBlX3R5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgIH0KKyAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIHZhbGlkYXRlX2NvbnN0X3JlYyhuYW1lICsgIjxlbGVtPiIsIGVfdHlwZSwgKnZfaXRlcik7CisgICAgfQorICB9Cit9CisKKy8qKgorICogQ2hlY2sgc2ltcGxlIGlkZW50aWZpZXIgbmFtZXMKKyAqIEl0J3MgZWFzaWVyIHRvIGRvIGl0IHRoaXMgd2F5IGluc3RlYWQgb2YgcmV3cml0aW5nIHRoZSB3aG9sZSBncmFtbWFyIGV0Yy4KKyAqLwordm9pZCB2YWxpZGF0ZV9zaW1wbGVfaWRlbnRpZmllcihjb25zdCBjaGFyKiBpZGVudGlmaWVyKSB7CisgIHN0cmluZyBuYW1lKGlkZW50aWZpZXIpOworICBpZiAobmFtZS5maW5kKCIuIikgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgeXllcnJvcigiSWRlbnRpZmllciAlcyBjYW4ndCBoYXZlIGEgZG90LiIsIGlkZW50aWZpZXIpOworICAgIGV4aXQoMSk7CisgIH0KK30KKworLyoqCisgKiBDaGVjayB0aGUgdHlwZSBvZiB0aGUgcGFyc2VkIGNvbnN0IGluZm9ybWF0aW9uIGFnYWluc3QgaXRzIGRlY2xhcmVkIHR5cGUKKyAqLwordm9pZCB2YWxpZGF0ZV9jb25zdF90eXBlKHRfY29uc3QqIGMpIHsKKyAgdmFsaWRhdGVfY29uc3RfcmVjKGMtPmdldF9uYW1lKCksIGMtPmdldF90eXBlKCksIGMtPmdldF92YWx1ZSgpKTsKK30KKworLyoqCisgKiBDaGVjayB0aGUgdHlwZSBvZiBhIGRlZmF1bHQgdmFsdWUgYXNzaWduZWQgdG8gYSBmaWVsZC4KKyAqLwordm9pZCB2YWxpZGF0ZV9maWVsZF92YWx1ZSh0X2ZpZWxkKiBmaWVsZCwgdF9jb25zdF92YWx1ZSogY3YpIHsKKyAgdmFsaWRhdGVfY29uc3RfcmVjKGZpZWxkLT5nZXRfbmFtZSgpLCBmaWVsZC0+Z2V0X3R5cGUoKSwgY3YpOworfQorCisvKioKKyAqIENoZWNrIHRoYXQgYWxsIHRoZSBlbGVtZW50cyBvZiBhIHRocm93cyBibG9jayBhcmUgYWN0dWFsbHkgZXhjZXB0aW9ucy4KKyAqLworYm9vbCB2YWxpZGF0ZV90aHJvd3ModF9zdHJ1Y3QqIHRocm93cykgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdGhyb3dzLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICBpZiAoIXRfZ2VuZXJhdG9yOjpnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSktPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICogU2tpcHMgVVRGLTggQk9NIGlmIHRoZXJlIGlzIG9uZQorICovCitib29sIHNraXBfdXRmOF9ib20oRklMRSogZikgeworCisgIC8vIHByZXR0eSBzdHJhaWdodGZvcndhcmQsIGJ1dCB3b3JrcworICBpZiAoZmdldGMoZikgPT0gMHhFRikgeworICAgIGlmIChmZ2V0YyhmKSA9PSAweEJCKSB7CisgICAgICBpZiAoZmdldGMoZikgPT0gMHhCRikgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXdpbmQoZik7CisgIHJldHVybiBmYWxzZTsKK30KKworLyoqCisgKiBQYXJzZXMgYSBwcm9ncmFtCisgKi8KK3ZvaWQgcGFyc2UodF9wcm9ncmFtKiBwcm9ncmFtLCB0X3Byb2dyYW0qIHBhcmVudF9wcm9ncmFtKSB7CisgIC8vIEdldCBzY29wZSBmaWxlIHBhdGgKKyAgc3RyaW5nIHBhdGggPSBwcm9ncmFtLT5nZXRfcGF0aCgpOworCisgIC8vIFNldCBjdXJyZW50IGRpciBnbG9iYWwsIHdoaWNoIGlzIHVzZWQgaW4gdGhlIGluY2x1ZGVfZmlsZSBmdW5jdGlvbgorICBnX2N1cmRpciA9IGRpcmVjdG9yeV9uYW1lKHBhdGgpOworICBnX2N1cnBhdGggPSBwYXRoOworCisgIC8vIE9wZW4gdGhlIGZpbGUKKyAgLy8gc2tpcCBVVEYtOCBCT00gaWYgdGhlcmUgaXMgb25lCisgIHl5aW4gPSBmb3BlbihwYXRoLmNfc3RyKCksICJyIik7CisgIGlmICh5eWluID09IDApIHsKKyAgICBmYWlsdXJlKCJDb3VsZCBub3Qgb3BlbiBpbnB1dCBmaWxlOiBcIiVzXCIiLCBwYXRoLmNfc3RyKCkpOworICB9CisgIGlmIChza2lwX3V0ZjhfYm9tKHl5aW4pKQorICAgIHB2ZXJib3NlKCJTa2lwcGVkIFVURi04IEJPTSBhdCAlc1xuIiwgcGF0aC5jX3N0cigpKTsKKworICAvLyBDcmVhdGUgbmV3IHNjb3BlIGFuZCBzY2FuIGZvciBpbmNsdWRlcworICBwdmVyYm9zZSgiU2Nhbm5pbmcgJXMgZm9yIGluY2x1ZGVzXG4iLCBwYXRoLmNfc3RyKCkpOworICBnX3BhcnNlX21vZGUgPSBJTkNMVURFUzsKKyAgZ19wcm9ncmFtID0gcHJvZ3JhbTsKKyAgZ19zY29wZSA9IHByb2dyYW0tPnNjb3BlKCk7CisgIHRyeSB7CisgICAgeXlsaW5lbm8gPSAxOworICAgIGlmICh5eXBhcnNlKCkgIT0gMCkgeworICAgICAgZmFpbHVyZSgiUGFyc2VyIGVycm9yIGR1cmluZyBpbmNsdWRlIHBhc3MuIik7CisgICAgfQorICB9IGNhdGNoIChzdHJpbmcgeCkgeworICAgIGZhaWx1cmUoeC5jX3N0cigpKTsKKyAgfQorICBmY2xvc2UoeXlpbik7CisKKyAgLy8gUmVjdXJzaXZlbHkgcGFyc2UgYWxsIHRoZSBpbmNsdWRlIHByb2dyYW1zCisgIHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtLT5nZXRfaW5jbHVkZXMoKTsKKyAgdmVjdG9yPHRfcHJvZ3JhbSo+OjppdGVyYXRvciBpdGVyOworICBmb3IgKGl0ZXIgPSBpbmNsdWRlcy5iZWdpbigpOyBpdGVyICE9IGluY2x1ZGVzLmVuZCgpOyArK2l0ZXIpIHsKKyAgICBwYXJzZSgqaXRlciwgcHJvZ3JhbSk7CisgIH0KKworICAvLyByZXNldCBwcm9ncmFtIGRvY3RleHQgc3RhdHVzIGJlZm9yZSBwYXJzaW5nIGEgbmV3IGZpbGUKKyAgcmVzZXRfcHJvZ3JhbV9kb2N0ZXh0X2luZm8oKTsKKworICAvLyBQYXJzZSB0aGUgcHJvZ3JhbSBmaWxlCisgIGdfcGFyc2VfbW9kZSA9IFBST0dSQU07CisgIGdfcHJvZ3JhbSA9IHByb2dyYW07CisgIGdfc2NvcGUgPSBwcm9ncmFtLT5zY29wZSgpOworICBnX3BhcmVudF9zY29wZSA9IChwYXJlbnRfcHJvZ3JhbSAhPSBOVUxMKSA/IHBhcmVudF9wcm9ncmFtLT5zY29wZSgpIDogTlVMTDsKKyAgZ19wYXJlbnRfcHJlZml4ID0gcHJvZ3JhbS0+Z2V0X25hbWUoKSArICIuIjsKKyAgZ19jdXJwYXRoID0gcGF0aDsKKworICAvLyBPcGVuIHRoZSBmaWxlCisgIC8vIHNraXAgVVRGLTggQk9NIGlmIHRoZXJlIGlzIG9uZQorICB5eWluID0gZm9wZW4ocGF0aC5jX3N0cigpLCAiciIpOworICBpZiAoeXlpbiA9PSAwKSB7CisgICAgZmFpbHVyZSgiQ291bGQgbm90IG9wZW4gaW5wdXQgZmlsZTogXCIlc1wiIiwgcGF0aC5jX3N0cigpKTsKKyAgfQorICBpZiAoc2tpcF91dGY4X2JvbSh5eWluKSkKKyAgICBwdmVyYm9zZSgiU2tpcHBlZCBVVEYtOCBCT00gYXQgJXNcbiIsIHBhdGguY19zdHIoKSk7CisKKyAgcHZlcmJvc2UoIlBhcnNpbmcgJXMgZm9yIHR5cGVzXG4iLCBwYXRoLmNfc3RyKCkpOworICB5eWxpbmVubyA9IDE7CisgIHRyeSB7CisgICAgaWYgKHl5cGFyc2UoKSAhPSAwKSB7CisgICAgICBmYWlsdXJlKCJQYXJzZXIgZXJyb3IgZHVyaW5nIHR5cGVzIHBhc3MuIik7CisgICAgfQorICB9IGNhdGNoIChzdHJpbmcgeCkgeworICAgIGZhaWx1cmUoeC5jX3N0cigpKTsKKyAgfQorICBmY2xvc2UoeXlpbik7Cit9CisKKy8qKgorICogR2VuZXJhdGUgY29kZQorICovCit2b2lkIGdlbmVyYXRlKHRfcHJvZ3JhbSogcHJvZ3JhbSwgY29uc3QgdmVjdG9yPHN0cmluZz4mIGdlbmVyYXRvcl9zdHJpbmdzKSB7CisgIC8vIE9vb29oaCwgcmVjdXJzaXZlIGNvZGUgZ2VuZXJhdGlvbiwgaG90ISEKKyAgaWYgKGdlbl9yZWN1cnNlKSB7CisgICAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW0tPmdldF9pbmNsdWRlcygpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgIC8vIFByb3BhZ2F0ZSBvdXRwdXQgcGF0aCBmcm9tIHBhcmVudCB0byBjaGlsZCBwcm9ncmFtcworICAgICAgaW5jbHVkZXNbaV0tPnNldF9vdXRfcGF0aChwcm9ncmFtLT5nZXRfb3V0X3BhdGgoKSwgcHJvZ3JhbS0+aXNfb3V0X3BhdGhfYWJzb2x1dGUoKSk7CisKKyAgICAgIGdlbmVyYXRlKGluY2x1ZGVzW2ldLCBnZW5lcmF0b3Jfc3RyaW5ncyk7CisgICAgfQorICB9CisKKyAgLy8gR2VuZXJhdGUgY29kZSEKKyAgdHJ5IHsKKyAgICBwdmVyYm9zZSgiUHJvZ3JhbTogJXNcbiIsIHByb2dyYW0tPmdldF9wYXRoKCkuY19zdHIoKSk7CisKKyAgICBpZiAoZHVtcF9kb2NzKSB7CisgICAgICBkdW1wX2RvY3N0cmluZ3MocHJvZ3JhbSk7CisgICAgfQorCisgICAgdmVjdG9yPHN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisgICAgZm9yIChpdGVyID0gZ2VuZXJhdG9yX3N0cmluZ3MuYmVnaW4oKTsgaXRlciAhPSBnZW5lcmF0b3Jfc3RyaW5ncy5lbmQoKTsgKytpdGVyKSB7CisgICAgICB0X2dlbmVyYXRvciogZ2VuZXJhdG9yID0gdF9nZW5lcmF0b3JfcmVnaXN0cnk6OmdldF9nZW5lcmF0b3IocHJvZ3JhbSwgKml0ZXIpOworCisgICAgICBpZiAoZ2VuZXJhdG9yID09IE5VTEwpIHsKKyNpZmRlZiBUSFJJRlRfRU5BQkxFX1BMVUdJTgorICAgICAgICBzd2l0Y2ggKHBsdWdpbl9vdXRwdXQ6OmRlbGVnYXRlVG9QbHVnaW4ocHJvZ3JhbSwgKml0ZXIpKSB7CisgICAgICAgICAgY2FzZSBwbHVnaW5fb3V0cHV0OjpQTFVHSU5fTk9UX0ZPVU5EOgorICAgICAgICAgICAgcHdhcm5pbmcoMSwgIlVuYWJsZSB0byBnZXQgYSBnZW5lcmF0b3IgZm9yIFwiJXNcIi5cbiIsIGl0ZXItPmNfc3RyKCkpOworICAgICAgICAgICAgZ19nZW5lcmF0b3JfZmFpbHVyZSA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIHBsdWdpbl9vdXRwdXQ6OlBMVUdJTl9GQUlMVVJFOgorICAgICAgICAgICAgcHdhcm5pbmcoMSwgIlBsdWdpbiBnZW5lcmF0b3IgZm9yIFwiJXNcIiBmYWlsZWQuXG4iLCBpdGVyLT5jX3N0cigpKTsKKyAgICAgICAgICAgIGdfZ2VuZXJhdG9yX2ZhaWx1cmUgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBwbHVnaW5fb3V0cHV0OjpQTFVHSU5fU1VDQ0VFU1M6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXNzZXJ0KGZhbHNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisjZWxzZQorICAgICAgICBwd2FybmluZygxLCAiVW5hYmxlIHRvIGdldCBhIGdlbmVyYXRvciBmb3IgXCIlc1wiLlxuIiwgaXRlci0+Y19zdHIoKSk7CisgICAgICAgIGdfZ2VuZXJhdG9yX2ZhaWx1cmUgPSB0cnVlOworI2VuZGlmCisgICAgICB9IGVsc2UgaWYgKGdlbmVyYXRvcikgeworICAgICAgICBnZW5lcmF0b3ItPnZhbGlkYXRlX2lucHV0KCk7CisgICAgICAgIHB2ZXJib3NlKCJHZW5lcmF0aW5nIFwiJXNcIlxuIiwgaXRlci0+Y19zdHIoKSk7CisgICAgICAgIGdlbmVyYXRvci0+Z2VuZXJhdGVfcHJvZ3JhbSgpOworICAgICAgICBkZWxldGUgZ2VuZXJhdG9yOworICAgICAgfQorICAgIH0KKyAgfSBjYXRjaCAoc3RyaW5nIHMpIHsKKyAgICBmYWlsdXJlKCJFcnJvcjogJXNcbiIsIHMuY19zdHIoKSk7CisgIH0gY2F0Y2ggKGNvbnN0IGNoYXIqIGV4YykgeworICAgIGZhaWx1cmUoIkVycm9yOiAlc1xuIiwgZXhjKTsKKyAgfQorfQorCit2b2lkIGF1ZGl0KHRfcHJvZ3JhbSogbmV3X3Byb2dyYW0sCisgICAgICAgICAgIHRfcHJvZ3JhbSogb2xkX3Byb2dyYW0sCisgICAgICAgICAgIHN0cmluZyBuZXdfdGhyaWZ0X2luY2x1ZGVfcGF0aCwKKyAgICAgICAgICAgc3RyaW5nIG9sZF90aHJpZnRfaW5jbHVkZV9wYXRoKSB7CisgIHZlY3RvcjxzdHJpbmc+IHRlbXBfaW5jbF9zZWFyY2hwYXRoID0gZ19pbmNsX3NlYXJjaHBhdGg7CisgIGlmICghb2xkX3RocmlmdF9pbmNsdWRlX3BhdGguZW1wdHkoKSkgeworICAgIGdfaW5jbF9zZWFyY2hwYXRoLnB1c2hfYmFjayhvbGRfdGhyaWZ0X2luY2x1ZGVfcGF0aCk7CisgIH0KKworICBwYXJzZShvbGRfcHJvZ3JhbSwgTlVMTCk7CisKKyAgZ19pbmNsX3NlYXJjaHBhdGggPSB0ZW1wX2luY2xfc2VhcmNocGF0aDsKKyAgaWYgKCFuZXdfdGhyaWZ0X2luY2x1ZGVfcGF0aC5lbXB0eSgpKSB7CisgICAgZ19pbmNsX3NlYXJjaHBhdGgucHVzaF9iYWNrKG5ld190aHJpZnRfaW5jbHVkZV9wYXRoKTsKKyAgfQorCisgIHBhcnNlKG5ld19wcm9ncmFtLCBOVUxMKTsKKworICBjb21wYXJlX25hbWVzcGFjZShuZXdfcHJvZ3JhbSwgb2xkX3Byb2dyYW0pOworICBjb21wYXJlX3NlcnZpY2VzKG5ld19wcm9ncmFtLT5nZXRfc2VydmljZXMoKSwgb2xkX3Byb2dyYW0tPmdldF9zZXJ2aWNlcygpKTsKKyAgY29tcGFyZV9lbnVtcyhuZXdfcHJvZ3JhbS0+Z2V0X2VudW1zKCksIG9sZF9wcm9ncmFtLT5nZXRfZW51bXMoKSk7CisgIGNvbXBhcmVfc3RydWN0cyhuZXdfcHJvZ3JhbS0+Z2V0X3N0cnVjdHMoKSwgb2xkX3Byb2dyYW0tPmdldF9zdHJ1Y3RzKCkpOworICBjb21wYXJlX3N0cnVjdHMobmV3X3Byb2dyYW0tPmdldF94Y2VwdGlvbnMoKSwgb2xkX3Byb2dyYW0tPmdldF94Y2VwdGlvbnMoKSk7CisgIGNvbXBhcmVfY29uc3RzKG5ld19wcm9ncmFtLT5nZXRfY29uc3RzKCksIG9sZF9wcm9ncmFtLT5nZXRfY29uc3RzKCkpOworfQorCisvKioKKyAqIFBhcnNlIGl0IHVwLi4gdGhlbiBzcGl0IGl0IGJhY2sgb3V0LCBpbiBwcmV0dHkgbXVjaCBldmVyeSBsYW5ndWFnZS4gQWxyaWdodAorICogbm90IHRoYXQgbWFueSBsYW5ndWFnZXMsIGJ1dCB0aGUgY29vbCBvbmVzIHRoYXQgd2UgY2FyZSBhYm91dC4KKyAqLworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgIGludCBpOworICBzdGQ6OnN0cmluZyBvdXRfcGF0aDsKKyAgYm9vbCBvdXRfcGF0aF9pc19hYnNvbHV0ZSA9IGZhbHNlOworCisgIC8vIFNldHVwIHRpbWUgc3RyaW5nCisgIHRpbWVfdCBub3cgPSB0aW1lKE5VTEwpOworICBnX3RpbWVfc3RyID0gY3RpbWUoJm5vdyk7CisKKyAgLy8gQ2hlY2sgZm9yIG5lY2Vzc2FyeSBhcmd1bWVudHMsIHlvdSBnb3R0YSBoYXZlIGF0IGxlYXN0IGEgZmlsZW5hbWUgYW5kCisgIC8vIGFuIG91dHB1dCBsYW5ndWFnZSBmbGFnCisgIGlmIChhcmdjIDwgMikgeworICAgIHVzYWdlKCk7CisgIH0KKworICB2ZWN0b3I8c3RyaW5nPiBnZW5lcmF0b3Jfc3RyaW5nczsKKyAgc3RyaW5nIG9sZF90aHJpZnRfaW5jbHVkZV9wYXRoOworICBzdHJpbmcgbmV3X3RocmlmdF9pbmNsdWRlX3BhdGg7CisgIHN0cmluZyBvbGRfaW5wdXRfZmlsZTsKKworICAvLyBTZXQgdGhlIGN1cnJlbnQgcGF0aCB0byBhIGR1bW15IHZhbHVlIHRvIG1ha2Ugd2FybmluZyBtZXNzYWdlcyBjbGVhcmVyLgorICBnX2N1cnBhdGggPSAiYXJndW1lbnRzIjsKKworICAvLyBIYWNreSBwYXJhbWV0ZXIgaGFuZGxpbmcuLi4gSSBkaWRuJ3QgZmVlbCBsaWtlIHVzaW5nIGEgbGlicmFyeSBzb3JyeSEKKyAgZm9yIChpID0gMTsgaSA8IGFyZ2MgLSAxOyBpKyspIHsKKyAgICBjaGFyKiBhcmc7CisKKyAgICBhcmcgPSBzdHJ0b2soYXJndltpXSwgIiAiKTsKKyAgICB3aGlsZSAoYXJnICE9IE5VTEwpIHsKKyAgICAgIC8vIFRyZWF0IGRvdWJsZSBkYXNoZXMgYXMgc2luZ2xlIGRhc2hlcworICAgICAgaWYgKGFyZ1swXSA9PSAnLScgJiYgYXJnWzFdID09ICctJykgeworICAgICAgICArK2FyZzsKKyAgICAgIH0KKworICAgICAgaWYgKHN0cmNtcChhcmcsICItaGVscCIpID09IDApIHsKKyAgICAgICAgaGVscCgpOworICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLXZlcnNpb24iKSA9PSAwKSB7CisgICAgICAgIHZlcnNpb24oKTsKKyAgICAgICAgZXhpdCgwKTsKKyAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1kZWJ1ZyIpID09IDApIHsKKyAgICAgICAgZ19kZWJ1ZyA9IDE7CisgICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItbm93YXJuIikgPT0gMCkgeworICAgICAgICBnX3dhcm4gPSAwOworICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLXN0cmljdCIpID09IDApIHsKKyAgICAgICAgZ19zdHJpY3QgPSAyNTU7CisgICAgICAgIGdfd2FybiA9IDI7CisgICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItdiIpID09IDAgfHwgc3RyY21wKGFyZywgIi12ZXJib3NlIikgPT0gMCkgeworICAgICAgICBnX3ZlcmJvc2UgPSAxOworICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLXIiKSA9PSAwIHx8IHN0cmNtcChhcmcsICItcmVjdXJzZSIpID09IDApIHsKKyAgICAgICAgZ2VuX3JlY3Vyc2UgPSB0cnVlOworICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLWFsbG93LW5lZy1rZXlzIikgPT0gMCkgeworICAgICAgICBnX2FsbG93X25lZ19maWVsZF9rZXlzID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1hbGxvdy02NGJpdC1jb25zdHMiKSA9PSAwKSB7CisgICAgICAgIGdfYWxsb3dfNjRiaXRfY29uc3RzID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1nZW4iKSA9PSAwKSB7CisgICAgICAgIGFyZyA9IGFyZ3ZbKytpXTsKKyAgICAgICAgaWYgKGFyZyA9PSBOVUxMKSB7CisgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJNaXNzaW5nIGdlbmVyYXRvciBzcGVjaWZpY2F0aW9uXG4iKTsKKyAgICAgICAgICB1c2FnZSgpOworICAgICAgICB9CisgICAgICAgIGdlbmVyYXRvcl9zdHJpbmdzLnB1c2hfYmFjayhhcmcpOworICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLUkiKSA9PSAwKSB7CisgICAgICAgIC8vIEFuIGFyZ3VtZW50IG9mICItSVwgYXNkZiIgaXMgaW52YWxpZCBhbmQgaGFzIHVua25vd24gcmVzdWx0cworICAgICAgICBhcmcgPSBhcmd2WysraV07CisKKyAgICAgICAgaWYgKGFyZyA9PSBOVUxMKSB7CisgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJNaXNzaW5nIEluY2x1ZGUgZGlyZWN0b3J5XG4iKTsKKyAgICAgICAgICB1c2FnZSgpOworICAgICAgICB9CisgICAgICAgIGdfaW5jbF9zZWFyY2hwYXRoLnB1c2hfYmFjayhhcmcpOworICAgICAgfSBlbHNlIGlmICgoc3RyY21wKGFyZywgIi1vIikgPT0gMCkgfHwgKHN0cmNtcChhcmcsICItb3V0IikgPT0gMCkpIHsKKyAgICAgICAgb3V0X3BhdGhfaXNfYWJzb2x1dGUgPSAoc3RyY21wKGFyZywgIi1vdXQiKSA9PSAwKSA/IHRydWUgOiBmYWxzZTsKKyAgICAgICAgYXJnID0gYXJndlsrK2ldOworICAgICAgICBpZiAoYXJnID09IE5VTEwpIHsKKyAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIi1vOiBtaXNzaW5nIG91dHB1dCBkaXJlY3RvcnlcbiIpOworICAgICAgICAgIHVzYWdlKCk7CisgICAgICAgIH0KKyAgICAgICAgb3V0X3BhdGggPSBhcmc7CisKKyNpZmRlZiBfV0lOMzIKKyAgICAgICAgLy8gc3RyaXAgb3V0IHRyYWlsaW5nIFwgb24gV2luZG93cworICAgICAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGxhc3QgPSBvdXRfcGF0aC5sZW5ndGgoKSAtIDE7CisgICAgICAgIGlmIChvdXRfcGF0aFtsYXN0XSA9PSAnXFwnKSB7CisgICAgICAgICAgb3V0X3BhdGguZXJhc2UobGFzdCk7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBpZiAoIWNoZWNrX2lzX2RpcmVjdG9yeShvdXRfcGF0aC5jX3N0cigpKSkKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItYXVkaXQiKSA9PSAwKSB7CisgICAgICAgIGdfYXVkaXQgPSB0cnVlOworICAgICAgICBhcmcgPSBhcmd2WysraV07CisgICAgICAgIGlmIChhcmcgPT0gTlVMTCkgeworICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTWlzc2luZyBvbGQgdGhyaWZ0IGZpbGUgbmFtZSBmb3IgYXVkaXQgb3BlcmF0aW9uXG4iKTsKKyAgICAgICAgICB1c2FnZSgpOworICAgICAgICB9CisgICAgICAgIGNoYXIgb2xkX3RocmlmdF9maWxlX3JwW1RIUklGVF9QQVRIX01BWF07CisKKyAgICAgICAgLy8gY3BwY2hlY2stc3VwcHJlc3MgdW5pbml0dmFyCisgICAgICAgIGlmIChzYWZlcmVhbHBhdGgoYXJnLCBvbGRfdGhyaWZ0X2ZpbGVfcnApID09IE5VTEwpIHsKKyAgICAgICAgICBmYWlsdXJlKCJDb3VsZCBub3Qgb3BlbiBpbnB1dCBmaWxlIHdpdGggcmVhbHBhdGg6ICVzIiwgYXJnKTsKKyAgICAgICAgfQorICAgICAgICBvbGRfaW5wdXRfZmlsZSA9IHN0cmluZyhvbGRfdGhyaWZ0X2ZpbGVfcnApOworICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLWF1ZGl0LW5vZmF0YWwiKSA9PSAwKSB7CisgICAgICAgIGdfYXVkaXRfZmF0YWwgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1Jb2xkIikgPT0gMCkgeworICAgICAgICBhcmcgPSBhcmd2WysraV07CisgICAgICAgIGlmIChhcmcgPT0gTlVMTCkgeworICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTWlzc2luZyBJbmNsdWRlIGRpcmVjdG9yeSBmb3Igb2xkIHRocmlmdCBmaWxlXG4iKTsKKyAgICAgICAgICB1c2FnZSgpOworICAgICAgICB9CisgICAgICAgIG9sZF90aHJpZnRfaW5jbHVkZV9wYXRoID0gc3RyaW5nKGFyZyk7CisgICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItSW5ldyIpID09IDApIHsKKyAgICAgICAgYXJnID0gYXJndlsrK2ldOworICAgICAgICBpZiAoYXJnID09IE5VTEwpIHsKKyAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk1pc3NpbmcgSW5jbHVkZSBkaXJlY3RvcnkgZm9yIG5ldyB0aHJpZnQgZmlsZVxuIik7CisgICAgICAgICAgdXNhZ2UoKTsKKyAgICAgICAgfQorICAgICAgICBuZXdfdGhyaWZ0X2luY2x1ZGVfcGF0aCA9IHN0cmluZyhhcmcpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJVbnJlY29nbml6ZWQgb3B0aW9uOiAlc1xuIiwgYXJnKTsKKyAgICAgICAgdXNhZ2UoKTsKKyAgICAgIH0KKworICAgICAgLy8gVG9rZW5pemUgbW9yZQorICAgICAgYXJnID0gc3RydG9rKE5VTEwsICIgIik7CisgICAgfQorICB9CisKKyAgLy8gZGlzcGxheSBoZWxwCisgIGlmICgoc3RyY21wKGFyZ3ZbYXJnYyAtIDFdLCAiLWhlbHAiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbYXJnYyAtIDFdLCAiLS1oZWxwIikgPT0gMCkpIHsKKyAgICBoZWxwKCk7CisgIH0KKworICAvLyBpZiB5b3UncmUgYXNraW5nIGZvciB2ZXJzaW9uLCB5b3UgaGF2ZSBhIHJpZ2h0IG5vdCB0byBwYXNzIGEgZmlsZQorICBpZiAoKHN0cmNtcChhcmd2W2FyZ2MgLSAxXSwgIi12ZXJzaW9uIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2W2FyZ2MgLSAxXSwgIi0tdmVyc2lvbiIpID09IDApKSB7CisgICAgdmVyc2lvbigpOworICAgIGV4aXQoMCk7CisgIH0KKworICAvLyBJbml0aWFsaXplIGdsb2JhbCB0eXBlcworICBpbml0R2xvYmFscygpOworCisgIGlmIChnX2F1ZGl0KSB7CisgICAgLy8gQXVkaXQgb3BlcmF0aW9uCisKKyAgICBpZiAob2xkX2lucHV0X2ZpbGUuZW1wdHkoKSkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJNaXNzaW5nIGZpbGUgbmFtZSBvZiBvbGQgdGhyaWZ0IGZpbGUgZm9yIGF1ZGl0XG4iKTsKKyAgICAgIHVzYWdlKCk7CisgICAgfQorCisgICAgY2hhciBuZXdfdGhyaWZ0X2ZpbGVfcnBbVEhSSUZUX1BBVEhfTUFYXTsKKyAgICBpZiAoYXJndltpXSA9PSBOVUxMKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIk1pc3NpbmcgZmlsZSBuYW1lIG9mIG5ldyB0aHJpZnQgZmlsZSBmb3IgYXVkaXRcbiIpOworICAgICAgdXNhZ2UoKTsKKyAgICB9CisgICAgLy8gY3BwY2hlY2stc3VwcHJlc3MgdW5pbml0dmFyCisgICAgaWYgKHNhZmVyZWFscGF0aChhcmd2W2ldLCBuZXdfdGhyaWZ0X2ZpbGVfcnApID09IE5VTEwpIHsKKyAgICAgIGZhaWx1cmUoIkNvdWxkIG5vdCBvcGVuIGlucHV0IGZpbGUgd2l0aCByZWFscGF0aDogJXMiLCBhcmd2W2ldKTsKKyAgICB9CisgICAgc3RyaW5nIG5ld19pbnB1dF9maWxlKG5ld190aHJpZnRfZmlsZV9ycCk7CisKKyAgICB0X3Byb2dyYW0gbmV3X3Byb2dyYW0obmV3X2lucHV0X2ZpbGUpOworICAgIHRfcHJvZ3JhbSBvbGRfcHJvZ3JhbShvbGRfaW5wdXRfZmlsZSk7CisKKyAgICBhdWRpdCgmbmV3X3Byb2dyYW0sICZvbGRfcHJvZ3JhbSwgbmV3X3RocmlmdF9pbmNsdWRlX3BhdGgsIG9sZF90aHJpZnRfaW5jbHVkZV9wYXRoKTsKKworICB9IGVsc2UgeworICAgIC8vIEdlbmVyYXRlIG9wdGlvbnMKKworICAgIC8vIFlvdSBnb3R0YSBnZW5lcmF0ZSBzb21ldGhpbmchCisgICAgaWYgKGdlbmVyYXRvcl9zdHJpbmdzLmVtcHR5KCkpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiTm8gb3V0cHV0IGxhbmd1YWdlKHMpIHNwZWNpZmllZFxuIik7CisgICAgICB1c2FnZSgpOworICAgIH0KKworICAgIC8vIFJlYWwtcGF0aGlmeSBpdAorICAgIGNoYXIgcnBbVEhSSUZUX1BBVEhfTUFYXTsKKyAgICBpZiAoYXJndltpXSA9PSBOVUxMKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIk1pc3NpbmcgZmlsZSBuYW1lXG4iKTsKKyAgICAgIHVzYWdlKCk7CisgICAgfQorICAgIC8vIGNwcGNoZWNrLXN1cHByZXNzIHVuaW5pdHZhcgorICAgIGlmIChzYWZlcmVhbHBhdGgoYXJndltpXSwgcnApID09IE5VTEwpIHsKKyAgICAgIGZhaWx1cmUoIkNvdWxkIG5vdCBvcGVuIGlucHV0IGZpbGUgd2l0aCByZWFscGF0aDogJXMiLCBhcmd2W2ldKTsKKyAgICB9CisgICAgc3RyaW5nIGlucHV0X2ZpbGUocnApOworCisgICAgLy8gSW5zdGFuY2Ugb2YgdGhlIGdsb2JhbCBwYXJzZSB0cmVlCisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gbmV3IHRfcHJvZ3JhbShpbnB1dF9maWxlKTsKKyAgICBpZiAob3V0X3BhdGguc2l6ZSgpKSB7CisgICAgICBwcm9ncmFtLT5zZXRfb3V0X3BhdGgob3V0X3BhdGgsIG91dF9wYXRoX2lzX2Fic29sdXRlKTsKKyAgICB9CisKKyAgICAvLyBDb21wdXRlIHRoZSBjcHAgaW5jbHVkZSBwcmVmaXguCisgICAgLy8gaW5mZXIgdGhpcyBmcm9tIHRoZSBmaWxlbmFtZSBwYXNzZWQgaW4KKyAgICBzdHJpbmcgaW5wdXRfZmlsZW5hbWUgPSBhcmd2W2ldOworICAgIHN0cmluZyBpbmNsdWRlX3ByZWZpeDsKKworICAgIHN0cmluZzo6c2l6ZV90eXBlIGxhc3Rfc2xhc2ggPSBzdHJpbmc6Om5wb3M7CisgICAgaWYgKChsYXN0X3NsYXNoID0gaW5wdXRfZmlsZW5hbWUucmZpbmQoIi8iKSkgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgICBpbmNsdWRlX3ByZWZpeCA9IGlucHV0X2ZpbGVuYW1lLnN1YnN0cigwLCBsYXN0X3NsYXNoKTsKKyAgICB9CisKKyAgICBwcm9ncmFtLT5zZXRfaW5jbHVkZV9wcmVmaXgoaW5jbHVkZV9wcmVmaXgpOworCisgICAgLy8gUGFyc2UgaXQhCisgICAgcGFyc2UocHJvZ3JhbSwgTlVMTCk7CisKKyAgICAvLyBUaGUgY3VycmVudCBwYXRoIGlzIG5vdCByZWFsbHkgcmVsZXZhbnQgd2hlbiB3ZSBhcmUgZG9pbmcgZ2VuZXJhdGlvbi4KKyAgICAvLyBSZXNldCB0aGUgdmFyaWFibGUgdG8gbWFrZSB3YXJuaW5nIG1lc3NhZ2VzIGNsZWFyZXIuCisgICAgZ19jdXJwYXRoID0gImdlbmVyYXRpb24iOworICAgIC8vIFJlc2V0IHl5bGluZW5vIGZvciB0aGUgaGVjayBvZiBpdC4gIFVzZSAxIGluc3RlYWQgb2YgMCBiZWNhdXNlCisgICAgLy8gVGhhdCBpcyB3aGF0IHNob3dzIHVwIGR1cmluZyBhcmd1bWVudCBwYXJzaW5nLgorICAgIHl5bGluZW5vID0gMTsKKworICAgIC8vIEdlbmVyYXRlIGl0IQorICAgIGdlbmVyYXRlKHByb2dyYW0sIGdlbmVyYXRvcl9zdHJpbmdzKTsKKyAgICBkZWxldGUgcHJvZ3JhbTsKKyAgfQorCisgIC8vIENsZWFuIHVwLiBXaG8gYW0gSSBraWRkaW5nLi4uIHRoaXMgcHJvZ3JhbSBwcm9iYWJseSBvcnBoYW5zIGhlYXAgbWVtb3J5CisgIC8vIGFsbCBvdmVyIHRoZSBwbGFjZSwgYnV0IHdobyBjYXJlcyBiZWNhdXNlIGl0IGlzIGFib3V0IHRvIGV4aXQgYW5kIGl0IGlzCisgIC8vIGFsbCByZWZlcmVuY2VkIGFuZCB1c2VkIGJ5IHRoaXMgd2Fja3kgcGFyc2UgdHJlZSB1cCB1bnRpbCBub3cgYW55d2F5cy4KKyAgY2xlYXJHbG9iYWxzKCk7CisKKyAgLy8gRmluaXNoZWQKKyAgaWYgKGdfcmV0dXJuX2ZhaWx1cmUgJiYgZ19hdWRpdF9mYXRhbCkgeworICAgIGV4aXQoMik7CisgIH0KKyAgaWYgKGdfZ2VuZXJhdG9yX2ZhaWx1cmUpIHsKKyAgICBleGl0KDMpOworICB9CisgIC8vIEZpbmlzaGVkCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvbWFpbi5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvbWFpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0YWJiMDMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9tYWluLmgKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX01BSU5fSAorI2RlZmluZSBUX01BSU5fSAorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGNzdGRpbz4KKworI2luY2x1ZGUgInRocmlmdC9sb2dnaW5nLmgiCisKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9jb25zdC5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2ZpZWxkLmgiCisKKy8qKgorICogRGVmaW5lZCBpbiB0aGUgZmxleCBsaWJyYXJ5CisgKi8KKworZXh0ZXJuICJDIiB7IGludCB5eWxleCh2b2lkKTsgfQorCitpbnQgeXlwYXJzZSh2b2lkKTsKKworLyoqCisgKiBFeHBlY3RlZCB0byBiZSBkZWZpbmVkIGJ5IEZsZXgvQmlzb24KKyAqLwordm9pZCB5eWVycm9yKGNvbnN0IGNoYXIqIGZtdCwgLi4uKTsKKworLyoqCisgKiBDaGVjayBzaW1wbGUgaWRlbnRpZmllciBuYW1lcworICovCit2b2lkIHZhbGlkYXRlX3NpbXBsZV9pZGVudGlmaWVyKGNvbnN0IGNoYXIqIGlkZW50aWZpZXIpOworCisvKioKKyAqIENoZWNrIGNvbnN0YW50IHR5cGVzCisgKi8KK3ZvaWQgdmFsaWRhdGVfY29uc3RfdHlwZSh0X2NvbnN0KiBjKTsKKworLyoqCisgKiBDaGVjayBjb25zdGFudCB0eXBlcworICovCit2b2lkIHZhbGlkYXRlX2ZpZWxkX3ZhbHVlKHRfZmllbGQqIGZpZWxkLCB0X2NvbnN0X3ZhbHVlKiBjdik7CisKKy8qKgorICogQ2hlY2sgbWVtYmVycyBvZiBhIHRocm93cyBibG9jaworICovCitib29sIHZhbGlkYXRlX3Rocm93cyh0X3N0cnVjdCogdGhyb3dzKTsKKworLyoqCisgKiBDb252ZXJ0cyBhIHN0cmluZyBmaWxlbmFtZSBpbnRvIGEgdGhyaWZ0IHByb2dyYW0gbmFtZQorICovCitzdGQ6OnN0cmluZyBwcm9ncmFtX25hbWUoc3RkOjpzdHJpbmcgZmlsZW5hbWUpOworCisvKioKKyAqIEdldHMgdGhlIGRpcmVjdG9yeSBwYXRoIG9mIGEgZmlsZW5hbWUKKyAqLworc3RkOjpzdHJpbmcgZGlyZWN0b3J5X25hbWUoc3RkOjpzdHJpbmcgZmlsZW5hbWUpOworCisvKioKKyAqIEdldCB0aGUgYWJzb2x1dGUgcGF0aCBmb3IgYW4gaW5jbHVkZSBmaWxlCisgKi8KK3N0ZDo6c3RyaW5nIGluY2x1ZGVfZmlsZShzdGQ6OnN0cmluZyBmaWxlbmFtZSk7CisKKy8qKgorICogQ2xlYXJzIGFueSBwcmV2aW91c2x5IHN0b3JlZCBkb2N0ZXh0IHN0cmluZy4KKyAqLwordm9pZCBjbGVhcl9kb2N0ZXh0KCk7CisKKy8qKgorICogQ2xlYW5zIHVwIHRleHQgY29tbW9ubHkgZm91bmQgaW4gZG94eWdlbi1saWtlIGNvbW1lbnRzCisgKi8KK2NoYXIqIGNsZWFuX3VwX2RvY3RleHQoY2hhciogZG9jdGV4dCk7CisKKy8qKgorICogV2UgYXJlIHN1cmUgdGhlIHByb2dyYW0gZG9jdGV4dCBjYW5kaWRhdGUgaXMgcmVhbGx5IHRoZSBwcm9ncmFtIGRvY3RleHQuCisgKi8KK3ZvaWQgZGVjbGFyZV92YWxpZF9wcm9ncmFtX2RvY3RleHQoKTsKKworLyoqCisgKiBFbWl0cyBhIHdhcm5pbmcgb24gbGlzdDxieXRlPiwgYmluYXJ5IHR5cGUgaXMgdHlwaWNhbGx5IGEgbXVjaCBiZXR0ZXIgY2hvaWNlLgorICovCit2b2lkIGNoZWNrX2Zvcl9saXN0X29mX2J5dGVzKHRfdHlwZSogbGlzdF9lbGVtX3R5cGUpOworCisvKioKKyAqIEVtaXRzIGEgb25lLXRpbWUgd2FybmluZyBvbiBieXRlIHR5cGUsIHByb21vdGluZyB0aGUgbmV3IGk4IHR5cGUgaW5zdGVhZAorICovCit2b2lkIGVtaXRfYnl0ZV90eXBlX3dhcm5pbmcoKTsKKworLyoqCisgKiBQcmludHMgZGVwcmVjYXRpb24gbm90aWNlIGZvciBvbGQgTlMgZGVjbGFyYXRpb25zIHRoYXQgYXJlIG5vIGxvbmdlciBzdXBwb3J0ZWQKKyAqIElmIG5ld19mb3JtIGlzIE5VTEwsIG9sZF9mb3JtIGlzIGFzc3VtZWQgdG8gYmUgYSBsYW5ndWFnZSBpZGVudGlmaWVyLCBzdWNoIGFzICJjcHAiCisgKiBJZiBuZXdfZm9ybSBpcyBub3QgTlVMTCwgYm90aCBhcmd1bWVudHMgYXJlIHVzZWQgZXhhY3RseSBhcyBnaXZlbgorICovCit2b2lkIGVycm9yX3Vuc3VwcG9ydGVkX25hbWVzcGFjZV9kZWNsKGNvbnN0IGNoYXIqIG9sZF9mb3JtLCBjb25zdCBjaGFyKiBuZXdfZm9ybSA9IE5VTEwpOworCisvKioKKyAqIEZsZXggdXRpbGl0aWVzCisgKi8KKworZXh0ZXJuIGludCB5eWxpbmVubzsKK2V4dGVybiBjaGFyIHl5dGV4dFtdOworZXh0ZXJuIHN0ZDo6RklMRSogeXlpbjsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS9wYXJzZS5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3BhcnNlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZjc2MzcKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS9wYXJzZS5jYwpAQCAtMCwwICsxLDM5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF90eXBlLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfdHlwZWRlZi5oIgorCisjaW5jbHVkZSAidGhyaWZ0L21haW4uaCIKKwordF90eXBlKiB0X3R5cGU6OmdldF90cnVlX3R5cGUoKSB7CisgIHRfdHlwZSogdHlwZSA9IHRoaXM7CisgIHdoaWxlICh0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICB0eXBlID0gKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpOworICB9CisgIHJldHVybiB0eXBlOworfQorCitjb25zdCB0X3R5cGUqIHRfdHlwZTo6Z2V0X3RydWVfdHlwZSgpIGNvbnN0IHsKKyAgY29uc3QgdF90eXBlKiB0eXBlID0gdGhpczsKKyAgd2hpbGUgKHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHR5cGUgPSAoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCk7CisgIH0KKyAgcmV0dXJuIHR5cGU7Cit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2Jhc2VfdHlwZS5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9iYXNlX3R5cGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTM5OGJhCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9iYXNlX3R5cGUuaApAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfQkFTRV9UWVBFX0gKKyNkZWZpbmUgVF9CQVNFX1RZUEVfSAorCisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF90eXBlLmgiCisKKy8qKgorICogQSB0aHJpZnQgYmFzZSB0eXBlLCB3aGljaCBtdXN0IGJlIG9uZSBvZiB0aGUgZGVmaW5lZCBlbnVtZXJhdGVkIHR5cGVzIGluc2lkZQorICogdGhpcyBkZWZpbml0aW9uLgorICoKKyAqLworY2xhc3MgdF9iYXNlX3R5cGUgOiBwdWJsaWMgdF90eXBlIHsKK3B1YmxpYzoKKyAgLyoqCisgICAqIEVudW1lcmF0aW9uIG9mIHRocmlmdCBiYXNlIHR5cGVzCisgICAqLworICBlbnVtIHRfYmFzZSB7CisgICAgVFlQRV9WT0lELAorICAgIFRZUEVfU1RSSU5HLAorICAgIFRZUEVfQk9PTCwKKyAgICBUWVBFX0k4LAorICAgIFRZUEVfSTE2LAorICAgIFRZUEVfSTMyLAorICAgIFRZUEVfSTY0LAorICAgIFRZUEVfRE9VQkxFCisgIH07CisKKyAgdF9iYXNlX3R5cGUoc3RkOjpzdHJpbmcgbmFtZSwgdF9iYXNlIGJhc2UpCisgICAgOiB0X3R5cGUobmFtZSksIGJhc2VfKGJhc2UpLCBzdHJpbmdfbGlzdF8oZmFsc2UpLCBiaW5hcnlfKGZhbHNlKSwgc3RyaW5nX2VudW1fKGZhbHNlKSB7fQorCisgIHRfYmFzZSBnZXRfYmFzZSgpIGNvbnN0IHsgcmV0dXJuIGJhc2VfOyB9CisKKyAgYm9vbCBpc192b2lkKCkgY29uc3QgeyByZXR1cm4gYmFzZV8gPT0gVFlQRV9WT0lEOyB9CisKKyAgYm9vbCBpc19zdHJpbmcoKSBjb25zdCB7IHJldHVybiBiYXNlXyA9PSBUWVBFX1NUUklORzsgfQorCisgIGJvb2wgaXNfYm9vbCgpIGNvbnN0IHsgcmV0dXJuIGJhc2VfID09IFRZUEVfQk9PTDsgfQorCisgIHZvaWQgc2V0X3N0cmluZ19saXN0KGJvb2wgdmFsKSB7IHN0cmluZ19saXN0XyA9IHZhbDsgfQorCisgIGJvb2wgaXNfc3RyaW5nX2xpc3QoKSBjb25zdCB7IHJldHVybiBzdHJpbmdfbGlzdF8gJiYgKGJhc2VfID09IFRZUEVfU1RSSU5HKTsgfQorCisgIHZvaWQgc2V0X2JpbmFyeShib29sIHZhbCkgeyBiaW5hcnlfID0gdmFsOyB9CisKKyAgYm9vbCBpc19iaW5hcnkoKSBjb25zdCB7IHJldHVybiBiaW5hcnlfICYmIChiYXNlXyA9PSBUWVBFX1NUUklORyk7IH0KKworICB2b2lkIHNldF9zdHJpbmdfZW51bShib29sIHZhbCkgeyBzdHJpbmdfZW51bV8gPSB2YWw7IH0KKworICBib29sIGlzX3N0cmluZ19lbnVtKCkgY29uc3QgeyByZXR1cm4gc3RyaW5nX2VudW1fICYmIGJhc2VfID09IFRZUEVfU1RSSU5HOyB9CisKKyAgdm9pZCBhZGRfc3RyaW5nX2VudW1fdmFsKHN0ZDo6c3RyaW5nIHZhbCkgeyBzdHJpbmdfZW51bV92YWxzXy5wdXNoX2JhY2sodmFsKTsgfQorCisgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgZ2V0X3N0cmluZ19lbnVtX3ZhbHMoKSBjb25zdCB7IHJldHVybiBzdHJpbmdfZW51bV92YWxzXzsgfQorCisgIGJvb2wgaXNfYmFzZV90eXBlKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCisgIHN0YXRpYyBzdGQ6OnN0cmluZyB0X2Jhc2VfbmFtZSh0X2Jhc2UgdGJhc2UpIHsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSBUWVBFX1ZPSUQ6CisgICAgICByZXR1cm4gInZvaWQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUWVBFX1NUUklORzoKKyAgICAgIHJldHVybiAic3RyaW5nIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVFlQRV9CT09MOgorICAgICAgcmV0dXJuICJib29sIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVFlQRV9JODoKKyAgICAgIHJldHVybiAiaTgiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiaTE2IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVFlQRV9JMzI6CisgICAgICByZXR1cm4gImkzMiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRZUEVfSTY0OgorICAgICAgcmV0dXJuICJpNjQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiZG91YmxlIjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gIih1bmtub3duKSI7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworcHJpdmF0ZToKKyAgdF9iYXNlIGJhc2VfOworCisgIGJvb2wgc3RyaW5nX2xpc3RfOworICBib29sIGJpbmFyeV87CisgIGJvb2wgc3RyaW5nX2VudW1fOworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc3RyaW5nX2VudW1fdmFsc187Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfY29uc3QuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfY29uc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzA4ZTBkCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9jb25zdC5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX0NPTlNUX0gKKyNkZWZpbmUgVF9DT05TVF9ICisKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF90eXBlLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfY29uc3RfdmFsdWUuaCIKKworLyoqCisgKiBBIGNvbnN0IGlzIGEgY29uc3RhbnQgdmFsdWUgZGVmaW5lZCBhY3Jvc3MgbGFuZ3VhZ2VzIHRoYXQgaGFzIGEgdHlwZSBhbmQKKyAqIGEgdmFsdWUuIFRoZSB0cmljayBoZXJlIGlzIHRoYXQgdGhlIGRlY2xhcmVkIHR5cGUgbWlnaHQgbm90IG1hdGNoIHRoZSB0eXBlCisgKiBvZiB0aGUgdmFsdWUgb2JqZWN0LCBzaW5jZSB0aGF0IGlzIG5vdCBkZXRlcm1pbmVkIHVudGlsIGFmdGVyIHBhcnNpbmcgdGhlCisgKiB3aG9sZSB0aGluZyBvdXQuCisgKgorICovCitjbGFzcyB0X2NvbnN0IDogcHVibGljIHRfZG9jIHsKK3B1YmxpYzoKKyAgdF9jb25zdCh0X3R5cGUqIHR5cGUsIHN0ZDo6c3RyaW5nIG5hbWUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKQorICAgIDogdHlwZV8odHlwZSksIG5hbWVfKG5hbWUpLCB2YWx1ZV8odmFsdWUpIHt9CisKKyAgdF90eXBlKiBnZXRfdHlwZSgpIGNvbnN0IHsgcmV0dXJuIHR5cGVfOyB9CisKKyAgc3RkOjpzdHJpbmcgZ2V0X25hbWUoKSBjb25zdCB7IHJldHVybiBuYW1lXzsgfQorCisgIHRfY29uc3RfdmFsdWUqIGdldF92YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlXzsgfQorCitwcml2YXRlOgorICB0X3R5cGUqIHR5cGVfOworICBzdGQ6OnN0cmluZyBuYW1lXzsKKyAgdF9jb25zdF92YWx1ZSogdmFsdWVfOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2NvbnN0X3ZhbHVlLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2NvbnN0X3ZhbHVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmExMTRjZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfY29uc3RfdmFsdWUuaApAQCAtMCwwICsxLDIxMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfQ09OU1RfVkFMVUVfSAorI2RlZmluZSBUX0NPTlNUX1ZBTFVFX0gKKworI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2VudW0uaCIKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIHBsdWdpbl9vdXRwdXQgewordGVtcGxhdGUgPHR5cGVuYW1lIEZyb20sIHR5cGVuYW1lIFRvPgordm9pZCBjb252ZXJ0KEZyb20qLCBUbyYpOworfQorCisvKioKKyAqIEEgY29uc3QgdmFsdWUgaXMgc29tZXRoaW5nIHBhcnNlZCB0aGF0IGNvdWxkIGJlIGEgbWFwLCBzZXQsIGxpc3QsIHN0cnVjdAorICogb3Igd2hhdGV2ZXIuCisgKgorICovCitjbGFzcyB0X2NvbnN0X3ZhbHVlIHsKK3B1YmxpYzoKKyAgLyoqCisgICAqIENvbXBhcmF0b3IgdG8gc29ydCBmaWVsZHMgaW4gYXNjZW5kaW5nIG9yZGVyIGJ5IGtleS4KKyAgICogTWFrZSB0aGlzIGEgZnVuY3RvciBpbnN0ZWFkIG9mIGEgZnVuY3Rpb24gdG8gaGVscCBHQ0MgaW5saW5lIGl0LgorICAgKi8KKyAgc3RydWN0IHZhbHVlX2NvbXBhcmUgeworICBwdWJsaWM6CisgICAgYm9vbCBvcGVyYXRvcigpKHRfY29uc3RfdmFsdWUgY29uc3QqIGNvbnN0JiBsZWZ0LCB0X2NvbnN0X3ZhbHVlIGNvbnN0KiBjb25zdCYgcmlnaHQpIGNvbnN0IHsKKyAgICAgIHJldHVybiAqbGVmdCA8ICpyaWdodDsKKyAgICB9CisgIH07CisKKyAgZW51bSB0X2NvbnN0X3ZhbHVlX3R5cGUgeyBDVl9JTlRFR0VSLCBDVl9ET1VCTEUsIENWX1NUUklORywgQ1ZfTUFQLCBDVl9MSVNULCBDVl9JREVOVElGSUVSLCBDVl9VTktOT1dOIH07CisKKyAgdF9jb25zdF92YWx1ZSgpIDogaW50VmFsXygwKSwgZG91YmxlVmFsXygwLjBmKSwgZW51bV8oKHRfZW51bSopMCksIHZhbFR5cGVfKENWX1VOS05PV04pIHt9CisKKyAgdF9jb25zdF92YWx1ZShpbnQ2NF90IHZhbCkgOiBkb3VibGVWYWxfKDAuMGYpLCBlbnVtXygodF9lbnVtKikwKSwgdmFsVHlwZV8oQ1ZfVU5LTk9XTikgeyBzZXRfaW50ZWdlcih2YWwpOyB9CisKKyAgdF9jb25zdF92YWx1ZShzdGQ6OnN0cmluZyB2YWwpIDogaW50VmFsXygwKSwgZG91YmxlVmFsXygwLjBmKSwgZW51bV8oKHRfZW51bSopMCksIHZhbFR5cGVfKENWX1VOS05PV04pIHsgc2V0X3N0cmluZyh2YWwpOyB9CisKKyAgdm9pZCBzZXRfc3RyaW5nKHN0ZDo6c3RyaW5nIHZhbCkgeworICAgIHZhbFR5cGVfID0gQ1ZfU1RSSU5HOworICAgIHN0cmluZ1ZhbF8gPSB2YWw7CisgIH0KKworICBzdGQ6OnN0cmluZyBnZXRfc3RyaW5nKCkgY29uc3QgeyByZXR1cm4gc3RyaW5nVmFsXzsgfQorCisgIHZvaWQgc2V0X2ludGVnZXIoaW50NjRfdCB2YWwpIHsKKyAgICB2YWxUeXBlXyA9IENWX0lOVEVHRVI7CisgICAgaW50VmFsXyA9IHZhbDsKKyAgfQorCisgIGludDY0X3QgZ2V0X2ludGVnZXIoKSBjb25zdCB7CisgICAgaWYgKHZhbFR5cGVfID09IENWX0lERU5USUZJRVIpIHsKKyAgICAgIGlmIChlbnVtXyA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJoYXZlIGlkZW50aWZpZXIgXCIiICsgZ2V0X2lkZW50aWZpZXIoKSArICJcIiwgYnV0IHVuc2V0IGVudW0gb24gbGluZSEiOworICAgICAgfQorICAgICAgc3RkOjpzdHJpbmcgaWRlbnRpZmllciA9IGdldF9pZGVudGlmaWVyKCk7CisgICAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGRvdCA9IGlkZW50aWZpZXIucmZpbmQoJy4nKTsKKyAgICAgIGlmIChkb3QgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgaWRlbnRpZmllciA9IGlkZW50aWZpZXIuc3Vic3RyKGRvdCArIDEpOworICAgICAgfQorICAgICAgdF9lbnVtX3ZhbHVlKiB2YWwgPSBlbnVtXy0+Z2V0X2NvbnN0YW50X2J5X25hbWUoaWRlbnRpZmllcik7CisgICAgICBpZiAodmFsID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgIlVuYWJsZSB0byBmaW5kIGVudW0gdmFsdWUgXCIiICsgaWRlbnRpZmllciArICJcIiBpbiBlbnVtIFwiIiArIGVudW1fLT5nZXRfbmFtZSgpCisgICAgICAgICAgICArICJcIiI7CisgICAgICB9CisgICAgICByZXR1cm4gdmFsLT5nZXRfdmFsdWUoKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGludFZhbF87CisgICAgfQorICB9CisKKyAgdm9pZCBzZXRfZG91YmxlKGRvdWJsZSB2YWwpIHsKKyAgICB2YWxUeXBlXyA9IENWX0RPVUJMRTsKKyAgICBkb3VibGVWYWxfID0gdmFsOworICB9CisKKyAgZG91YmxlIGdldF9kb3VibGUoKSBjb25zdCB7IHJldHVybiBkb3VibGVWYWxfOyB9CisKKyAgdm9pZCBzZXRfbWFwKCkgeyB2YWxUeXBlXyA9IENWX01BUDsgfQorCisgIHZvaWQgYWRkX21hcCh0X2NvbnN0X3ZhbHVlKiBrZXksIHRfY29uc3RfdmFsdWUqIHZhbCkgeyBtYXBWYWxfW2tleV0gPSB2YWw7IH0KKworICBjb25zdCBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiBnZXRfbWFwKCkgY29uc3QgeyByZXR1cm4gbWFwVmFsXzsgfQorCisgIHZvaWQgc2V0X2xpc3QoKSB7IHZhbFR5cGVfID0gQ1ZfTElTVDsgfQorCisgIHZvaWQgYWRkX2xpc3QodF9jb25zdF92YWx1ZSogdmFsKSB7IGxpc3RWYWxfLnB1c2hfYmFjayh2YWwpOyB9CisKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiBnZXRfbGlzdCgpIGNvbnN0IHsgcmV0dXJuIGxpc3RWYWxfOyB9CisKKyAgdm9pZCBzZXRfaWRlbnRpZmllcihzdGQ6OnN0cmluZyB2YWwpIHsKKyAgICB2YWxUeXBlXyA9IENWX0lERU5USUZJRVI7CisgICAgaWRlbnRpZmllclZhbF8gPSB2YWw7CisgIH0KKworICBzdGQ6OnN0cmluZyBnZXRfaWRlbnRpZmllcigpIGNvbnN0IHsgcmV0dXJuIGlkZW50aWZpZXJWYWxfOyB9CisKKyAgc3RkOjpzdHJpbmcgZ2V0X2lkZW50aWZpZXJfbmFtZSgpIGNvbnN0IHsKKyAgICBzdGQ6OnN0cmluZyByZXQgPSBnZXRfaWRlbnRpZmllcigpOworICAgIHNpemVfdCBzID0gcmV0LmZpbmQoJy4nKTsKKyAgICBpZiAocyA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgdGhyb3cgImVycm9yOiBpZGVudGlmaWVyICIgKyByZXQgKyAiIGlzIHVucXVhbGlmaWVkISI7CisgICAgfQorICAgIHJldCA9IHJldC5zdWJzdHIocyArIDEpOworICAgIHMgPSByZXQuZmluZCgnLicpOworICAgIGlmIChzICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICByZXQgPSByZXQuc3Vic3RyKHMgKyAxKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIGdldF9pZGVudGlmaWVyX3dpdGhfcGFyZW50KCkgY29uc3QgeworICAgIHN0ZDo6c3RyaW5nIHJldCA9IGdldF9pZGVudGlmaWVyKCk7CisgICAgc2l6ZV90IHMgPSByZXQuZmluZCgnLicpOworICAgIGlmIChzID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICB0aHJvdyAiZXJyb3I6IGlkZW50aWZpZXIgIiArIHJldCArICIgaXMgdW5xdWFsaWZpZWQhIjsKKyAgICB9CisgICAgc2l6ZV90IHMyID0gcmV0LmZpbmQoJy4nLCBzICsgMSk7CisgICAgaWYgKHMyICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICByZXQgPSByZXQuc3Vic3RyKHMgKyAxKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKKyAgfQorCisgIHZvaWQgc2V0X2VudW0odF9lbnVtKiB0ZW51bSkgeyBlbnVtXyA9IHRlbnVtOyB9CisKKyAgdF9jb25zdF92YWx1ZV90eXBlIGdldF90eXBlKCkgY29uc3QgeyBpZiAodmFsVHlwZV8gPT0gQ1ZfVU5LTk9XTikgeyB0aHJvdyBzdGQ6OnN0cmluZygidW5rbm93biB0X2NvbnN0X3ZhbHVlIik7IH0gcmV0dXJuIHZhbFR5cGVfOyB9CisKKyAgLyoqCisgICAqIENvbXBhcmF0b3IgdG8gc29ydCBtYXAgZmllbGRzIGluIGFzY2VuZGluZyBvcmRlciBieSBrZXkgYW5kIHRoZW4gdmFsdWUuCisgICAqIFRoaXMgaXMgdXNlZCBmb3IgbWFwIGNvbXBhcmlzb24gaW4gbGV4aWNvZ3JhcGhpYyBvcmRlci4KKyAgICovCisgIHN0cnVjdCBtYXBfZW50cnlfY29tcGFyZSB7CisgIHByaXZhdGU6CisgICAgdHlwZWRlZiBzdGQ6OnBhaXI8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiBDb25zdFBhaXI7CisgIHB1YmxpYzoKKyAgICBib29sIG9wZXJhdG9yKCkoQ29uc3RQYWlyIGxlZnQsIENvbnN0UGFpciByaWdodCkgY29uc3QgeworICAgICAgaWYgKCoobGVmdC5maXJzdCkgPCAqKHJpZ2h0LmZpcnN0KSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICgqKHJpZ2h0LmZpcnN0KSA8ICoobGVmdC5maXJzdCkpIHsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmV0dXJuICoobGVmdC5zZWNvbmQpIDwgKihyaWdodC5zZWNvbmQpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9OworCisgIGJvb2wgb3BlcmF0b3IgPCAoY29uc3QgdF9jb25zdF92YWx1ZSYgdGhhdCkgY29uc3QgeworICAgIDo6dF9jb25zdF92YWx1ZTo6dF9jb25zdF92YWx1ZV90eXBlIHQxID0gZ2V0X3R5cGUoKTsKKyAgICA6OnRfY29uc3RfdmFsdWU6OnRfY29uc3RfdmFsdWVfdHlwZSB0MiA9IHRoYXQuZ2V0X3R5cGUoKTsKKyAgICBpZiAodDEgIT0gdDIpCisgICAgICByZXR1cm4gdDEgPCB0MjsKKyAgICBzd2l0Y2ggKHQxKSB7CisgICAgY2FzZSA6OnRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVI6CisgICAgICByZXR1cm4gaW50VmFsXyA8IHRoYXQuaW50VmFsXzsKKyAgICBjYXNlIDo6dF9jb25zdF92YWx1ZTo6Q1ZfRE9VQkxFOgorICAgICAgcmV0dXJuIGRvdWJsZVZhbF8gPCB0aGF0LmRvdWJsZVZhbF87CisgICAgY2FzZSA6OnRfY29uc3RfdmFsdWU6OkNWX1NUUklORzoKKyAgICAgIHJldHVybiBzdHJpbmdWYWxfIDwgdGhhdC5zdHJpbmdWYWxfOworICAgIGNhc2UgOjp0X2NvbnN0X3ZhbHVlOjpDVl9JREVOVElGSUVSOgorICAgICAgcmV0dXJuIGlkZW50aWZpZXJWYWxfIDwgdGhhdC5pZGVudGlmaWVyVmFsXzsKKyAgICBjYXNlIDo6dF9jb25zdF92YWx1ZTo6Q1ZfTUFQOgorICAgICAgcmV0dXJuIHN0ZDo6bGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoCisgICAgICAgICAgbWFwVmFsXy5iZWdpbigpLCBtYXBWYWxfLmVuZCgpLCB0aGF0Lm1hcFZhbF8uYmVnaW4oKSwgdGhhdC5tYXBWYWxfLmVuZCgpLCBtYXBfZW50cnlfY29tcGFyZSgpKTsKKyAgICBjYXNlIDo6dF9jb25zdF92YWx1ZTo6Q1ZfTElTVDoKKyAgICAgIHJldHVybiBzdGQ6OmxleGljb2dyYXBoaWNhbF9jb21wYXJlKAorICAgICAgICAgIGxpc3RWYWxfLmJlZ2luKCksIGxpc3RWYWxfLmVuZCgpLCB0aGF0Lmxpc3RWYWxfLmJlZ2luKCksIHRoYXQubGlzdFZhbF8uZW5kKCksIHZhbHVlX2NvbXBhcmUoKSk7CisgICAgY2FzZSA6OnRfY29uc3RfdmFsdWU6OkNWX1VOS05PV046CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJ1bmtub3duIHZhbHVlIHR5cGUiOworICAgIH0KKyAgfQorCitwcml2YXRlOgorICBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHZhbHVlX2NvbXBhcmU+IG1hcFZhbF87CisgIHN0ZDo6dmVjdG9yPHRfY29uc3RfdmFsdWUqPiBsaXN0VmFsXzsKKyAgc3RkOjpzdHJpbmcgc3RyaW5nVmFsXzsKKyAgaW50NjRfdCBpbnRWYWxfOworICBkb3VibGUgZG91YmxlVmFsXzsKKyAgc3RkOjpzdHJpbmcgaWRlbnRpZmllclZhbF87CisgIHRfZW51bSogZW51bV87CisKKyAgdF9jb25zdF92YWx1ZV90eXBlIHZhbFR5cGVfOworCisgIC8vIHRvIHJlYWQgZW51bV8KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEZyb20sIHR5cGVuYW1lIFRvPgorICBmcmllbmQgdm9pZCBwbHVnaW5fb3V0cHV0Ojpjb252ZXJ0KEZyb20qLCBUbyYpOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2NvbnRhaW5lci5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9jb250YWluZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmRhYjcwCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9jb250YWluZXIuaApAQCAtMCwwICsxLDQ3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9DT05UQUlORVJfSAorI2RlZmluZSBUX0NPTlRBSU5FUl9ICisKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF90eXBlLmgiCisKK2NsYXNzIHRfY29udGFpbmVyIDogcHVibGljIHRfdHlwZSB7CitwdWJsaWM6CisgIHRfY29udGFpbmVyKCkgOiBjcHBfbmFtZV8oKSwgaGFzX2NwcF9uYW1lXyhmYWxzZSkge30KKworICB2aXJ0dWFsIH50X2NvbnRhaW5lcigpIHt9CisKKyAgdm9pZCBzZXRfY3BwX25hbWUoc3RkOjpzdHJpbmcgY3BwX25hbWUpIHsKKyAgICBjcHBfbmFtZV8gPSBjcHBfbmFtZTsKKyAgICBoYXNfY3BwX25hbWVfID0gdHJ1ZTsKKyAgfQorCisgIGJvb2wgaGFzX2NwcF9uYW1lKCkgY29uc3QgeyByZXR1cm4gaGFzX2NwcF9uYW1lXzsgfQorCisgIHN0ZDo6c3RyaW5nIGdldF9jcHBfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGNwcF9uYW1lXzsgfQorCisgIGJvb2wgaXNfY29udGFpbmVyKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCitwcml2YXRlOgorICBzdGQ6OnN0cmluZyBjcHBfbmFtZV87CisgIGJvb2wgaGFzX2NwcF9uYW1lXzsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9kb2MuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfZG9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JjYjhmNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfZG9jLmgKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfRE9DX0gKKyNkZWZpbmUgVF9ET0NfSAorCisjaW5jbHVkZSAidGhyaWZ0L2dsb2JhbHMuaCIKKyNpbmNsdWRlICJ0aHJpZnQvbG9nZ2luZy5oIgorCisvKioKKyAqIERvY3VtZW50YXRpb24gc3R1YnMKKyAqCisgKi8KK2NsYXNzIHRfZG9jIHsKKworcHVibGljOgorICB0X2RvYygpIDogaGFzX2RvY18oZmFsc2UpIHt9CisgIHZpcnR1YWwgfnRfZG9jKCkge30KKworICB2b2lkIHNldF9kb2MoY29uc3Qgc3RkOjpzdHJpbmcmIGRvYykgeworICAgIGRvY18gPSBkb2M7CisgICAgaGFzX2RvY18gPSB0cnVlOworICAgIGlmICgoZ19wcm9ncmFtX2RvY3RleHRfbGluZW5vID09IGdfZG9jdGV4dF9saW5lbm8pCisgICAgICAgICYmIChnX3Byb2dyYW1fZG9jdGV4dF9zdGF0dXMgPT0gU1RJTExfQ0FORElEQVRFKSkgeworICAgICAgZ19wcm9ncmFtX2RvY3RleHRfc3RhdHVzID0gQUxSRUFEWV9QUk9DRVNTRUQ7CisgICAgICBwZGVidWcoIiVzIiwgInByb2dyYW0gZG9jdGV4dCBzZXQgdG8gQUxSRUFEWV9QUk9DRVNTRUQiKTsKKyAgICB9CisgIH0KKworICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0X2RvYygpIGNvbnN0IHsgcmV0dXJuIGRvY187IH0KKworICBib29sIGhhc19kb2MoKSB7IHJldHVybiBoYXNfZG9jXzsgfQorCitwcml2YXRlOgorICBzdGQ6OnN0cmluZyBkb2NfOworICBib29sIGhhc19kb2NfOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2VudW0uaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfZW51bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMjM3ODAKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2VudW0uaApAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfRU5VTV9ICisjZGVmaW5lIFRfRU5VTV9ICisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9lbnVtX3ZhbHVlLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfdHlwZS5oIgorCisvKioKKyAqIEFuIGVudW1lcmF0ZWQgdHlwZS4gQSBsaXN0IG9mIGNvbnN0YW50IG9iamVjdHMgd2l0aCBhIG5hbWUgZm9yIHRoZSB0eXBlLgorICoKKyAqLworY2xhc3MgdF9lbnVtIDogcHVibGljIHRfdHlwZSB7CitwdWJsaWM6CisgIHRfZW51bSh0X3Byb2dyYW0qIHByb2dyYW0pIDogdF90eXBlKHByb2dyYW0pIHt9CisKKyAgdm9pZCBzZXRfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgeyBuYW1lXyA9IG5hbWU7IH0KKworICB2b2lkIGFwcGVuZCh0X2VudW1fdmFsdWUqIGNvbnN0YW50KSB7IGNvbnN0YW50c18ucHVzaF9iYWNrKGNvbnN0YW50KTsgfQorCisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+JiBnZXRfY29uc3RhbnRzKCkgY29uc3QgeyByZXR1cm4gY29uc3RhbnRzXzsgfQorCisgIHRfZW51bV92YWx1ZSogZ2V0X2NvbnN0YW50X2J5X25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2VudW1fdmFsdWUqPiYgZW51bV92YWx1ZXMgPSBnZXRfY29uc3RhbnRzKCk7CisgICAgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGNfaXRlcjsKKyAgICBmb3IgKGNfaXRlciA9IGVudW1fdmFsdWVzLmJlZ2luKCk7IGNfaXRlciAhPSBlbnVtX3ZhbHVlcy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICAgIGlmICgoKmNfaXRlciktPmdldF9uYW1lKCkgPT0gbmFtZSkgeworICAgICAgICByZXR1cm4gKmNfaXRlcjsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICB0X2VudW1fdmFsdWUqIGdldF9jb25zdGFudF9ieV92YWx1ZShpbnQ2NF90IHZhbHVlKSB7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4mIGVudW1fdmFsdWVzID0gZ2V0X2NvbnN0YW50cygpOworICAgIHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBjX2l0ZXI7CisgICAgZm9yIChjX2l0ZXIgPSBlbnVtX3ZhbHVlcy5iZWdpbigpOyBjX2l0ZXIgIT0gZW51bV92YWx1ZXMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgICBpZiAoKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSA9PSB2YWx1ZSkgeworICAgICAgICByZXR1cm4gKmNfaXRlcjsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICB0X2VudW1fdmFsdWUqIGdldF9taW5fdmFsdWUoKSB7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4mIGVudW1fdmFsdWVzID0gZ2V0X2NvbnN0YW50cygpOworICAgIHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBjX2l0ZXI7CisgICAgdF9lbnVtX3ZhbHVlKiBtaW5fdmFsdWU7CisgICAgaWYgKGVudW1fdmFsdWVzLnNpemUoKSA9PSAwKSB7CisgICAgICBtaW5fdmFsdWUgPSBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICBpbnQgbWluX3ZhbHVlX3ZhbHVlOworICAgICAgbWluX3ZhbHVlID0gZW51bV92YWx1ZXMuZnJvbnQoKTsKKyAgICAgIG1pbl92YWx1ZV92YWx1ZSA9IG1pbl92YWx1ZS0+Z2V0X3ZhbHVlKCk7CisgICAgICBmb3IgKGNfaXRlciA9IGVudW1fdmFsdWVzLmJlZ2luKCk7IGNfaXRlciAhPSBlbnVtX3ZhbHVlcy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkgPCBtaW5fdmFsdWVfdmFsdWUpIHsKKyAgICAgICAgICBtaW5fdmFsdWUgPSAoKmNfaXRlcik7CisgICAgICAgICAgbWluX3ZhbHVlX3ZhbHVlID0gbWluX3ZhbHVlLT5nZXRfdmFsdWUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbWluX3ZhbHVlOworICB9CisKKyAgdF9lbnVtX3ZhbHVlKiBnZXRfbWF4X3ZhbHVlKCkgeworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+JiBlbnVtX3ZhbHVlcyA9IGdldF9jb25zdGFudHMoKTsKKyAgICBzdGQ6OnZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IgY19pdGVyOworICAgIHRfZW51bV92YWx1ZSogbWF4X3ZhbHVlOworICAgIGlmIChlbnVtX3ZhbHVlcy5zaXplKCkgPT0gMCkgeworICAgICAgbWF4X3ZhbHVlID0gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgaW50IG1heF92YWx1ZV92YWx1ZTsKKyAgICAgIG1heF92YWx1ZSA9IGVudW1fdmFsdWVzLmJhY2soKTsKKyAgICAgIG1heF92YWx1ZV92YWx1ZSA9IG1heF92YWx1ZS0+Z2V0X3ZhbHVlKCk7CisgICAgICBmb3IgKGNfaXRlciA9IGVudW1fdmFsdWVzLmJlZ2luKCk7IGNfaXRlciAhPSBlbnVtX3ZhbHVlcy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkgPiBtYXhfdmFsdWVfdmFsdWUpIHsKKyAgICAgICAgICBtYXhfdmFsdWUgPSAoKmNfaXRlcik7CisgICAgICAgICAgbWF4X3ZhbHVlX3ZhbHVlID0gbWF4X3ZhbHVlLT5nZXRfdmFsdWUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbWF4X3ZhbHVlOworICB9CisKKyAgYm9vbCBpc19lbnVtKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCitwcml2YXRlOgorICBzdGQ6OnZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHNfOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2VudW1fdmFsdWUuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfZW51bV92YWx1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwYmYzYWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2VudW1fdmFsdWUuaApAQCAtMCwwICsxLDUwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9FTlVNX1ZBTFVFX0gKKyNkZWZpbmUgVF9FTlVNX1ZBTFVFX0gKKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfZG9jLmgiCisKKy8qKgorICogQSBjb25zdGFudC4gVGhlc2UgYXJlIHVzZWQgaW5zaWRlIG9mIGVudW0gZGVmaW5pdGlvbnMuIENvbnN0YW50cyBhcmUganVzdAorICogc3ltYm9sIGlkZW50aWZpZXJzIHRoYXQgbWF5IG9yIG1heSBub3QgaGF2ZSBhbiBleHBsaWNpdCB2YWx1ZSBhc3NvY2lhdGVkCisgKiB3aXRoIHRoZW0uCisgKgorICovCitjbGFzcyB0X2VudW1fdmFsdWUgOiBwdWJsaWMgdF9kb2MgeworcHVibGljOgorICB0X2VudW1fdmFsdWUoc3RkOjpzdHJpbmcgbmFtZSwgaW50IHZhbHVlKSA6IG5hbWVfKG5hbWUpLCB2YWx1ZV8odmFsdWUpIHt9CisKKyAgfnRfZW51bV92YWx1ZSgpIHt9CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9uYW1lKCkgY29uc3QgeyByZXR1cm4gbmFtZV87IH0KKworICBpbnQgZ2V0X3ZhbHVlKCkgY29uc3QgeyByZXR1cm4gdmFsdWVfOyB9CisKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBhbm5vdGF0aW9uc187CisKK3ByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIG5hbWVfOworICBpbnQgdmFsdWVfOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2ZpZWxkLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2ZpZWxkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVmMWY4MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfZmllbGQuaApAQCAtMCwwICsxLDEzNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfRklFTERfSAorI2RlZmluZSBUX0ZJRUxEX0gKKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2RvYy5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3R5cGUuaCIKKworLy8gRm9yd2FyZCBkZWNsYXJlIGZvciB4c2RfYXR0cnMKK2NsYXNzIHRfc3RydWN0OworCisvKioKKyAqIENsYXNzIHRvIHJlcHJlc2VudCBhIGZpZWxkIGluIGEgdGhyaWZ0IHN0cnVjdHVyZS4gQSBmaWVsZCBoYXMgYSBkYXRhIHR5cGUsCisgKiBhIHN5bWJvbGljIG5hbWUsIGFuZCBhIG51bWVyaWMgaWRlbnRpZmllci4KKyAqCisgKi8KK2NsYXNzIHRfZmllbGQgOiBwdWJsaWMgdF9kb2MgeworcHVibGljOgorICB0X2ZpZWxkKHRfdHlwZSogdHlwZSwgc3RkOjpzdHJpbmcgbmFtZSkKKyAgICA6IHR5cGVfKHR5cGUpLAorICAgICAgbmFtZV8obmFtZSksCisgICAgICBrZXlfKDApLAorICAgICAgdmFsdWVfKE5VTEwpLAorICAgICAgeHNkX29wdGlvbmFsXyhmYWxzZSksCisgICAgICB4c2RfbmlsbGFibGVfKGZhbHNlKSwKKyAgICAgIHhzZF9hdHRyc18oTlVMTCksCisgICAgICByZWZlcmVuY2VfKGZhbHNlKSB7fQorCisgIHRfZmllbGQodF90eXBlKiB0eXBlLCBzdGQ6OnN0cmluZyBuYW1lLCBpbnQzMl90IGtleSkKKyAgICA6IHR5cGVfKHR5cGUpLAorICAgICAgbmFtZV8obmFtZSksCisgICAgICBrZXlfKGtleSksCisgICAgICByZXFfKFRfT1BUX0lOX1JFUV9PVVQpLAorICAgICAgdmFsdWVfKE5VTEwpLAorICAgICAgeHNkX29wdGlvbmFsXyhmYWxzZSksCisgICAgICB4c2RfbmlsbGFibGVfKGZhbHNlKSwKKyAgICAgIHhzZF9hdHRyc18oTlVMTCksCisgICAgICByZWZlcmVuY2VfKGZhbHNlKSB7fQorCisgIH50X2ZpZWxkKCkge30KKworICB0X3R5cGUqIGdldF90eXBlKCkgeyByZXR1cm4gdHlwZV87IH0KKworICBjb25zdCB0X3R5cGUqIGdldF90eXBlKCkgY29uc3QgeyByZXR1cm4gdHlwZV87IH0KKworICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0X25hbWUoKSBjb25zdCB7IHJldHVybiBuYW1lXzsgfQorCisgIGludDMyX3QgZ2V0X2tleSgpIGNvbnN0IHsgcmV0dXJuIGtleV87IH0KKworICBlbnVtIGVfcmVxIHsgVF9SRVFVSVJFRCwgVF9PUFRJT05BTCwgVF9PUFRfSU5fUkVRX09VVCB9OworCisgIHZvaWQgc2V0X3JlcShlX3JlcSByZXEpIHsgcmVxXyA9IHJlcTsgfQorCisgIGVfcmVxIGdldF9yZXEoKSBjb25zdCB7IHJldHVybiByZXFfOyB9CisKKyAgdm9pZCBzZXRfdmFsdWUodF9jb25zdF92YWx1ZSogdmFsdWUpIHsgdmFsdWVfID0gdmFsdWU7IH0KKworICB0X2NvbnN0X3ZhbHVlKiBnZXRfdmFsdWUoKSB7IHJldHVybiB2YWx1ZV87IH0KKworICBjb25zdCB0X2NvbnN0X3ZhbHVlKiBnZXRfdmFsdWUoKSBjb25zdCB7IHJldHVybiB2YWx1ZV87IH0KKworICB2b2lkIHNldF94c2Rfb3B0aW9uYWwoYm9vbCB4c2Rfb3B0aW9uYWwpIHsgeHNkX29wdGlvbmFsXyA9IHhzZF9vcHRpb25hbDsgfQorCisgIGJvb2wgZ2V0X3hzZF9vcHRpb25hbCgpIGNvbnN0IHsgcmV0dXJuIHhzZF9vcHRpb25hbF87IH0KKworICB2b2lkIHNldF94c2RfbmlsbGFibGUoYm9vbCB4c2RfbmlsbGFibGUpIHsgeHNkX25pbGxhYmxlXyA9IHhzZF9uaWxsYWJsZTsgfQorCisgIGJvb2wgZ2V0X3hzZF9uaWxsYWJsZSgpIGNvbnN0IHsgcmV0dXJuIHhzZF9uaWxsYWJsZV87IH0KKworICB2b2lkIHNldF94c2RfYXR0cnModF9zdHJ1Y3QqIHhzZF9hdHRycykgeyB4c2RfYXR0cnNfID0geHNkX2F0dHJzOyB9CisKKyAgdF9zdHJ1Y3QqIGdldF94c2RfYXR0cnMoKSB7IHJldHVybiB4c2RfYXR0cnNfOyB9CisKKyAgLyoqCisgICAqIENvbXBhcmF0b3IgdG8gc29ydCBmaWVsZHMgaW4gYXNjZW5kaW5nIG9yZGVyIGJ5IGtleS4KKyAgICogTWFrZSB0aGlzIGEgZnVuY3RvciBpbnN0ZWFkIG9mIGEgZnVuY3Rpb24gdG8gaGVscCBHQ0MgaW5saW5lIGl0LgorICAgKiBUaGUgYXJndW1lbnRzIGFyZSAoY29uc3QpIHJlZmVyZW5jZXMgdG8gY29uc3QgcG9pbnRlcnMgdG8gY29uc3QgdF9maWVsZHMuCisgICAqLworICBzdHJ1Y3Qga2V5X2NvbXBhcmUgeworICAgIGJvb2wgb3BlcmF0b3IoKSh0X2ZpZWxkIGNvbnN0KiBjb25zdCYgYSwgdF9maWVsZCBjb25zdCogY29uc3QmIGIpIHsKKyAgICAgIHJldHVybiBhLT5nZXRfa2V5KCkgPCBiLT5nZXRfa2V5KCk7CisgICAgfQorICB9OworCisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gYW5ub3RhdGlvbnNfOworCisgIGJvb2wgZ2V0X3JlZmVyZW5jZSgpIHsgcmV0dXJuIHJlZmVyZW5jZV87IH0KKworICB2b2lkIHNldF9yZWZlcmVuY2UoYm9vbCByZWZlcmVuY2UpIHsgcmVmZXJlbmNlXyA9IHJlZmVyZW5jZTsgfQorCitwcml2YXRlOgorICB0X3R5cGUqIHR5cGVfOworICBzdGQ6OnN0cmluZyBuYW1lXzsKKyAgaW50MzJfdCBrZXlfOworICBlX3JlcSByZXFfOworICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZV87CisKKyAgYm9vbCB4c2Rfb3B0aW9uYWxfOworICBib29sIHhzZF9uaWxsYWJsZV87CisgIHRfc3RydWN0KiB4c2RfYXR0cnNfOworICBib29sIHJlZmVyZW5jZV87Cit9OworCisvKioKKyAqIEEgc2ltcGxlIHN0cnVjdCBmb3IgdGhlIHBhcnNlciB0byB1c2UgdG8gc3RvcmUgYSBmaWVsZCBJRCwgYW5kIHdoZXRoZXIgb3IKKyAqIG5vdCBpdCB3YXMgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyIG9yIGF1dG9tYXRpY2FsbHkgY2hvc2VuLgorICovCitzdHJ1Y3QgdF9maWVsZF9pZCB7CisgIGludDMyX3QgdmFsdWU7CisgIGJvb2wgYXV0b19hc3NpZ25lZDsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9mdW5jdGlvbi5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9mdW5jdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyZDI2MDkKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2Z1bmN0aW9uLmgKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfRlVOQ1RJT05fSAorI2RlZmluZSBUX0ZVTkNUSU9OX0gKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF90eXBlLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3Rfc3RydWN0LmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfZG9jLmgiCisKKy8qKgorICogUmVwcmVzZW50YXRpb24gb2YgYSBmdW5jdGlvbi4gS2V5IHBhcnRzIGFyZSByZXR1cm4gdHlwZSwgZnVuY3Rpb24gbmFtZSwKKyAqIG9wdGlvbmFsIG1vZGlmaWVycywgYW5kIGFuIGFyZ3VtZW50IGxpc3QsIHdoaWNoIGlzIGltcGxlbWVudGVkIGFzIGEgdGhyaWZ0CisgKiBzdHJ1Y3QuCisgKgorICovCitjbGFzcyB0X2Z1bmN0aW9uIDogcHVibGljIHRfZG9jIHsKK3B1YmxpYzoKKyAgdF9mdW5jdGlvbih0X3R5cGUqIHJldHVybnR5cGUsIHN0ZDo6c3RyaW5nIG5hbWUsIHRfc3RydWN0KiBhcmdsaXN0LCBib29sIG9uZXdheSA9IGZhbHNlKQorICAgIDogcmV0dXJudHlwZV8ocmV0dXJudHlwZSksCisgICAgICBuYW1lXyhuYW1lKSwKKyAgICAgIGFyZ2xpc3RfKGFyZ2xpc3QpLAorICAgICAgeGNlcHRpb25zXyhuZXcgdF9zdHJ1Y3QoTlVMTCkpLAorICAgICAgb3duX3hjZXB0aW9uc18odHJ1ZSksCisgICAgICBvbmV3YXlfKG9uZXdheSkgeworICAgIGlmIChvbmV3YXlfICYmICghcmV0dXJudHlwZV8tPmlzX3ZvaWQoKSkpIHsKKyAgICAgIHB3YXJuaW5nKDEsICJPbmV3YXkgbWV0aG9kcyBzaG91bGQgcmV0dXJuIHZvaWQuXG4iKTsKKyAgICB9CisgIH0KKworICB0X2Z1bmN0aW9uKHRfdHlwZSogcmV0dXJudHlwZSwKKyAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAorICAgICAgICAgICAgIHRfc3RydWN0KiBhcmdsaXN0LAorICAgICAgICAgICAgIHRfc3RydWN0KiB4Y2VwdGlvbnMsCisgICAgICAgICAgICAgYm9vbCBvbmV3YXkgPSBmYWxzZSkKKyAgICA6IHJldHVybnR5cGVfKHJldHVybnR5cGUpLAorICAgICAgbmFtZV8obmFtZSksCisgICAgICBhcmdsaXN0XyhhcmdsaXN0KSwKKyAgICAgIHhjZXB0aW9uc18oeGNlcHRpb25zKSwKKyAgICAgIG93bl94Y2VwdGlvbnNfKGZhbHNlKSwKKyAgICAgIG9uZXdheV8ob25ld2F5KSB7CisgICAgaWYgKG9uZXdheV8gJiYgIXhjZXB0aW9uc18tPmdldF9tZW1iZXJzKCkuZW1wdHkoKSkgeworICAgICAgdGhyb3cgc3RkOjpzdHJpbmcoIk9uZXdheSBtZXRob2RzIGNhbid0IHRocm93IGV4Y2VwdGlvbnMuIik7CisgICAgfQorICAgIGlmIChvbmV3YXlfICYmICghcmV0dXJudHlwZV8tPmlzX3ZvaWQoKSkpIHsKKyAgICAgIHB3YXJuaW5nKDEsICJPbmV3YXkgbWV0aG9kcyBzaG91bGQgcmV0dXJuIHZvaWQuXG4iKTsKKyAgICB9CisgIH0KKworICB+dF9mdW5jdGlvbigpIHsKKyAgICBpZiAob3duX3hjZXB0aW9uc18pCisgICAgICBkZWxldGUgeGNlcHRpb25zXzsKKyAgfQorCisgIHRfdHlwZSogZ2V0X3JldHVybnR5cGUoKSBjb25zdCB7IHJldHVybiByZXR1cm50eXBlXzsgfQorCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG5hbWVfOyB9CisKKyAgdF9zdHJ1Y3QqIGdldF9hcmdsaXN0KCkgY29uc3QgeyByZXR1cm4gYXJnbGlzdF87IH0KKworICB0X3N0cnVjdCogZ2V0X3hjZXB0aW9ucygpIGNvbnN0IHsgcmV0dXJuIHhjZXB0aW9uc187IH0KKworICBib29sIGlzX29uZXdheSgpIGNvbnN0IHsgcmV0dXJuIG9uZXdheV87IH0KKworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IGFubm90YXRpb25zXzsKKworcHJpdmF0ZToKKyAgdF90eXBlKiByZXR1cm50eXBlXzsKKyAgc3RkOjpzdHJpbmcgbmFtZV87CisgIHRfc3RydWN0KiBhcmdsaXN0XzsKKyAgdF9zdHJ1Y3QqIHhjZXB0aW9uc187CisgIGJvb2wgb3duX3hjZXB0aW9uc187CisgIGJvb2wgb25ld2F5XzsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9saXN0LmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2xpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2Y2ODY1Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9saXN0LmgKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfTElTVF9ICisjZGVmaW5lIFRfTElTVF9ICisKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9jb250YWluZXIuaCIKKworLyoqCisgKiBBIGxpc3QgaXMgYSBsaWdodHdlaWdodCBjb250YWluZXIgdHlwZSB0aGF0IGp1c3Qgd3JhcHMgYW5vdGhlciBkYXRhIHR5cGUuCisgKgorICovCitjbGFzcyB0X2xpc3QgOiBwdWJsaWMgdF9jb250YWluZXIgeworcHVibGljOgorICB0X2xpc3QodF90eXBlKiBlbGVtX3R5cGUpIDogZWxlbV90eXBlXyhlbGVtX3R5cGUpIHt9CisKKyAgdF90eXBlKiBnZXRfZWxlbV90eXBlKCkgY29uc3QgeyByZXR1cm4gZWxlbV90eXBlXzsgfQorCisgIGJvb2wgaXNfbGlzdCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKworcHJpdmF0ZToKKyAgdF90eXBlKiBlbGVtX3R5cGVfOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X21hcC5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9tYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDNmMDg5Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9tYXAuaApAQCAtMCwwICsxLDQ1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9NQVBfSAorI2RlZmluZSBUX01BUF9ICisKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9jb250YWluZXIuaCIKKworLyoqCisgKiBBIG1hcCBpcyBhIGxpZ2h0d2VpZ2h0IGNvbnRhaW5lciB0eXBlIHRoYXQganVzdCB3cmFwcyBhbm90aGVyIHR3byBkYXRhCisgKiB0eXBlcy4KKyAqCisgKi8KK2NsYXNzIHRfbWFwIDogcHVibGljIHRfY29udGFpbmVyIHsKK3B1YmxpYzoKKyAgdF9tYXAodF90eXBlKiBrZXlfdHlwZSwgdF90eXBlKiB2YWxfdHlwZSkgOiBrZXlfdHlwZV8oa2V5X3R5cGUpLCB2YWxfdHlwZV8odmFsX3R5cGUpIHt9CisKKyAgdF90eXBlKiBnZXRfa2V5X3R5cGUoKSBjb25zdCB7IHJldHVybiBrZXlfdHlwZV87IH0KKworICB0X3R5cGUqIGdldF92YWxfdHlwZSgpIGNvbnN0IHsgcmV0dXJuIHZhbF90eXBlXzsgfQorCisgIGJvb2wgaXNfbWFwKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCitwcml2YXRlOgorICB0X3R5cGUqIGtleV90eXBlXzsKKyAgdF90eXBlKiB2YWxfdHlwZV87Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfcHJvZ3JhbS5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9wcm9ncmFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNkZDQ1YQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfcHJvZ3JhbS5oCkBAIC0wLDAgKzEsMzk1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9QUk9HUkFNX0gKKyNkZWZpbmUgVF9QUk9HUkFNX0gKKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisvLyBGb3IgcHJvZ3JhbV9uYW1lKCkKKyNpbmNsdWRlICJ0aHJpZnQvbWFpbi5oIgorCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfZG9jLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3Rfc2NvcGUuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9iYXNlX3R5cGUuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF90eXBlZGVmLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfZW51bS5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2NvbnN0LmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3Rfc3RydWN0LmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3Rfc2VydmljZS5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2xpc3QuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9tYXAuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9zZXQuaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3JfcmVnaXN0cnkuaCIKKy8vI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2RvYy5oIgorCisvKioKKyAqIFRvcCBsZXZlbCBjbGFzcyByZXByZXNlbnRpbmcgYW4gZW50aXJlIHRocmlmdCBwcm9ncmFtLiBBIHByb2dyYW0gY29uc2lzdHMKKyAqIGZ1bmRhbWVudGFsbHkgb2YgdGhlIGZvbGxvd2luZzoKKyAqCisgKiAgIFR5cGVkZWZzCisgKiAgIEVudW1lcmF0aW9ucworICogICBDb25zdGFudHMKKyAqICAgU3RydWN0cworICogICBFeGNlcHRpb25zCisgKiAgIFNlcnZpY2VzCisgKgorICogVGhlIHByb2dyYW0gbW9kdWxlIGFsc28gY29udGFpbnMgdGhlIGRlZmluaXRpb25zIG9mIHRoZSBiYXNlIHR5cGVzLgorICoKKyAqLworY2xhc3MgdF9wcm9ncmFtIDogcHVibGljIHRfZG9jIHsKK3B1YmxpYzoKKyAgdF9wcm9ncmFtKHN0ZDo6c3RyaW5nIHBhdGgsIHN0ZDo6c3RyaW5nIG5hbWUpCisgICAgOiBwYXRoXyhwYXRoKSwgbmFtZV8obmFtZSksIG91dF9wYXRoXygiLi8iKSwgb3V0X3BhdGhfaXNfYWJzb2x1dGVfKGZhbHNlKSwgc2NvcGVfKG5ldyB0X3Njb3BlKSB7fQorCisgIHRfcHJvZ3JhbShzdGQ6OnN0cmluZyBwYXRoKSA6IHBhdGhfKHBhdGgpLCBvdXRfcGF0aF8oIi4vIiksIG91dF9wYXRoX2lzX2Fic29sdXRlXyhmYWxzZSkgeworICAgIG5hbWVfID0gcHJvZ3JhbV9uYW1lKHBhdGgpOworICAgIHNjb3BlXyA9IG5ldyB0X3Njb3BlKCk7CisgIH0KKworICB+dF9wcm9ncmFtKCkgeworICAgIGlmIChzY29wZV8pIHsKKyAgICAgIGRlbGV0ZSBzY29wZV87CisgICAgICBzY29wZV8gPSBOVUxMOworICAgIH0KKyAgfQorCisgIC8vIFBhdGggYWNjZXNzb3IKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9wYXRoKCkgY29uc3QgeyByZXR1cm4gcGF0aF87IH0KKworICAvLyBPdXRwdXQgcGF0aCBhY2Nlc3NvcgorICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0X291dF9wYXRoKCkgY29uc3QgeyByZXR1cm4gb3V0X3BhdGhfOyB9CisKKyAgLy8gQ3JlYXRlIGdlbi0qIGRpciBhY2Nlc3NvcgorICBib29sIGlzX291dF9wYXRoX2Fic29sdXRlKCkgY29uc3QgeyByZXR1cm4gb3V0X3BhdGhfaXNfYWJzb2x1dGVfOyB9CisKKyAgLy8gTmFtZSBhY2Nlc3NvcgorICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0X25hbWUoKSBjb25zdCB7IHJldHVybiBuYW1lXzsgfQorCisgIC8vIE5hbWVzcGFjZQorICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0X25hbWVzcGFjZSgpIGNvbnN0IHsgcmV0dXJuIG5hbWVzcGFjZV87IH0KKworICAvLyBJbmNsdWRlIHByZWZpeCBhY2Nlc3NvcgorICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0X2luY2x1ZGVfcHJlZml4KCkgY29uc3QgeyByZXR1cm4gaW5jbHVkZV9wcmVmaXhfOyB9CisKKyAgLy8gQWNjZXNzb3JzIGZvciBwcm9ncmFtIGVsZW1lbnRzCisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfdHlwZWRlZio+JiBnZXRfdHlwZWRlZnMoKSBjb25zdCB7IHJldHVybiB0eXBlZGVmc187IH0KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9lbnVtKj4mIGdldF9lbnVtcygpIGNvbnN0IHsgcmV0dXJuIGVudW1zXzsgfQorICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4mIGdldF9jb25zdHMoKSBjb25zdCB7IHJldHVybiBjb25zdHNfOyB9CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfc3RydWN0Kj4mIGdldF9zdHJ1Y3RzKCkgY29uc3QgeyByZXR1cm4gc3RydWN0c187IH0KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9zdHJ1Y3QqPiYgZ2V0X3hjZXB0aW9ucygpIGNvbnN0IHsgcmV0dXJuIHhjZXB0aW9uc187IH0KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9zdHJ1Y3QqPiYgZ2V0X29iamVjdHMoKSBjb25zdCB7IHJldHVybiBvYmplY3RzXzsgfQorICBjb25zdCBzdGQ6OnZlY3Rvcjx0X3NlcnZpY2UqPiYgZ2V0X3NlcnZpY2VzKCkgY29uc3QgeyByZXR1cm4gc2VydmljZXNfOyB9CisgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIGdldF9uYW1lc3BhY2VzKCkgY29uc3QgeyByZXR1cm4gbmFtZXNwYWNlc187IH0KKworICAvLyBQcm9ncmFtIGVsZW1lbnRzCisgIHZvaWQgYWRkX3R5cGVkZWYodF90eXBlZGVmKiB0ZCkgeyB0eXBlZGVmc18ucHVzaF9iYWNrKHRkKTsgfQorICB2b2lkIGFkZF9lbnVtKHRfZW51bSogdGUpIHsgZW51bXNfLnB1c2hfYmFjayh0ZSk7IH0KKyAgdm9pZCBhZGRfY29uc3QodF9jb25zdCogdGMpIHsgY29uc3RzXy5wdXNoX2JhY2sodGMpOyB9CisgIHZvaWQgYWRkX3N0cnVjdCh0X3N0cnVjdCogdHMpIHsKKyAgICBvYmplY3RzXy5wdXNoX2JhY2sodHMpOworICAgIHN0cnVjdHNfLnB1c2hfYmFjayh0cyk7CisgIH0KKyAgdm9pZCBhZGRfeGNlcHRpb24odF9zdHJ1Y3QqIHR4KSB7CisgICAgb2JqZWN0c18ucHVzaF9iYWNrKHR4KTsKKyAgICB4Y2VwdGlvbnNfLnB1c2hfYmFjayh0eCk7CisgIH0KKyAgdm9pZCBhZGRfc2VydmljZSh0X3NlcnZpY2UqIHRzKSB7IHNlcnZpY2VzXy5wdXNoX2JhY2sodHMpOyB9CisKKyAgLy8gUHJvZ3JhbXMgdG8gaW5jbHVkZQorICBjb25zdCBzdGQ6OnZlY3Rvcjx0X3Byb2dyYW0qPiYgZ2V0X2luY2x1ZGVzKCkgY29uc3QgeyByZXR1cm4gaW5jbHVkZXNfOyB9CisKKyAgdm9pZCBzZXRfb3V0X3BhdGgoc3RkOjpzdHJpbmcgb3V0X3BhdGgsIGJvb2wgb3V0X3BhdGhfaXNfYWJzb2x1dGUpIHsKKyAgICBvdXRfcGF0aF8gPSBvdXRfcGF0aDsKKyAgICBvdXRfcGF0aF9pc19hYnNvbHV0ZV8gPSBvdXRfcGF0aF9pc19hYnNvbHV0ZTsKKyAgICAvLyBFbnN1cmUgdGhhdCBpdCBlbmRzIHdpdGggYSB0cmFpbGluZyAnLycgKG9yICdcJyBmb3Igd2luZG93cyBtYWNoaW5lcykKKyAgICBjaGFyIGMgPSBvdXRfcGF0aF8uYXQob3V0X3BhdGhfLnNpemUoKSAtIDEpOworICAgIGlmICghKGMgPT0gJy8nIHx8IGMgPT0gJ1xcJykpIHsKKyAgICAgIG91dF9wYXRoXy5wdXNoX2JhY2soJy8nKTsKKyAgICB9CisgIH0KKworICAvLyBUeXBlbmFtZSBjb2xsaXNpb24gZGV0ZWN0aW9uCisgIC8qKgorICAgKiBTZWFyY2ggZm9yIHR5cGVuYW1lIGNvbGxpc2lvbnMKKyAgICogQHBhcmFtIHQgICAgdGhlIHR5cGUgdG8gdGVzdCBmb3IgY29sbGlzaW9ucworICAgKiBAcmV0dXJuICAgICB0cnVlIGlmIGEgY2VydGFpbiBjb2xsaXNpb24gd2FzIGZvdW5kLCBvdGhlcndpc2UgZmFsc2UKKyAgICovCisgIGJvb2wgaXNfdW5pcXVlX3R5cGVuYW1lKHRfdHlwZSogdCkgeworICAgIGludCBvY2N1cnJlbmNlcyA9IHByb2dyYW1fdHlwZW5hbWVfY291bnQodGhpcywgdCk7CisgICAgZm9yIChzdGQ6OnZlY3Rvcjx0X3Byb2dyYW0qPjo6aXRlcmF0b3IgaXQgPSBpbmNsdWRlc18uYmVnaW4oKTsgaXQgIT0gaW5jbHVkZXNfLmVuZCgpOyArK2l0KSB7CisgICAgICBvY2N1cnJlbmNlcyArPSBwcm9ncmFtX3R5cGVuYW1lX2NvdW50KCppdCwgdCk7CisgICAgfQorICAgIHJldHVybiAwID09IG9jY3VycmVuY2VzOworICB9CisKKyAgLyoqCisgICAqIFNlYXJjaCBhbGwgdHlwZSBjb2xsZWN0aW9ucyBmb3IgZHVwbGljYXRlIHR5cGVuYW1lcworICAgKiBAcGFyYW0gcHJvZyB0aGUgcHJvZ3JhbSB0byBzZWFyY2gKKyAgICogQHBhcmFtIHQgICAgdGhlIHR5cGUgdG8gdGVzdCBmb3IgY29sbGlzaW9ucworICAgKiBAcmV0dXJuICAgICB0aGUgbnVtYmVyIG9mIGNlcnRhaW4gdHlwZW5hbWUgY29sbGlzaW9ucworICAgKi8KKyAgaW50IHByb2dyYW1fdHlwZW5hbWVfY291bnQodF9wcm9ncmFtKiBwcm9nLCB0X3R5cGUqIHQpIHsKKyAgICBpbnQgb2NjdXJyZW5jZXMgPSAwOworICAgIG9jY3VycmVuY2VzICs9IGNvbGxlY3Rpb25fdHlwZW5hbWVfY291bnQocHJvZywgcHJvZy0+dHlwZWRlZnNfLCB0KTsKKyAgICBvY2N1cnJlbmNlcyArPSBjb2xsZWN0aW9uX3R5cGVuYW1lX2NvdW50KHByb2csIHByb2ctPmVudW1zXywgdCk7CisgICAgb2NjdXJyZW5jZXMgKz0gY29sbGVjdGlvbl90eXBlbmFtZV9jb3VudChwcm9nLCBwcm9nLT5vYmplY3RzXywgdCk7CisgICAgb2NjdXJyZW5jZXMgKz0gY29sbGVjdGlvbl90eXBlbmFtZV9jb3VudChwcm9nLCBwcm9nLT5zZXJ2aWNlc18sIHQpOworICAgIHJldHVybiBvY2N1cnJlbmNlczsKKyAgfQorCisgIC8qKgorICAgKiBTZWFyY2ggYSB0eXBlIGNvbGxlY3Rpb24gZm9yIGR1cGxpY2F0ZSB0eXBlbmFtZXMKKyAgICogQHBhcmFtIHByb2cgICAgICAgICAgICB0aGUgcHJvZ3JhbSB0byBzZWFyY2gKKyAgICogQHBhcmFtIHR5cGVfY29sbGVjdGlvbiB0aGUgdHlwZSBjb2xsZWN0aW9uIHRvIHNlYXJjaAorICAgKiBAcGFyYW0gdCAgICAgICAgICAgICAgIHRoZSB0eXBlIHRvIHRlc3QgZm9yIGNvbGxpc2lvbnMKKyAgICogQHJldHVybiAgICAgICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNlcnRhaW4gdHlwZW5hbWUgY29sbGlzaW9ucworICAgKi8KKyAgdGVtcGxhdGUgPGNsYXNzIFQ+CisgIGludCBjb2xsZWN0aW9uX3R5cGVuYW1lX2NvdW50KHRfcHJvZ3JhbSogcHJvZywgVCB0eXBlX2NvbGxlY3Rpb24sIHRfdHlwZSogdCkgeworICAgIGludCBvY2N1cnJlbmNlcyA9IDA7CisgICAgZm9yICh0eXBlbmFtZSBUOjppdGVyYXRvciBpdCA9IHR5cGVfY29sbGVjdGlvbi5iZWdpbigpOyBpdCAhPSB0eXBlX2NvbGxlY3Rpb24uZW5kKCk7ICsraXQpCisgICAgICBpZiAodCAhPSAqaXQgJiYgMCA9PSB0LT5nZXRfbmFtZSgpLmNvbXBhcmUoKCppdCktPmdldF9uYW1lKCkpICYmIGlzX2NvbW1vbl9uYW1lc3BhY2UocHJvZywgdCkpCisgICAgICAgICsrb2NjdXJyZW5jZXM7CisgICAgcmV0dXJuIG9jY3VycmVuY2VzOworICB9CisKKyAgLyoqCisgICAqIERldGVybWluZSB3aGV0aGVyIGlkZW50aWNhbCB0eXBlbmFtZXMgd2lsbCBjb2xsaWRlIGJhc2VkIG9uIG5hbWVzcGFjZXMuCisgICAqCisgICAqIEJlY2F1c2Ugd2UgZG8gbm90IGtub3cgd2hpY2ggbGFuZ3VhZ2VzIHRoZSB1c2VyIHdpbGwgZ2VuZXJhdGUgY29kZSBmb3IsCisgICAqIGNvbGxpc2lvbnMgd2l0aGluIHByb2dyYW1zIChJREwgZmlsZXMpIGhhdmluZyBuYW1lc3BhY2UgZGVjbGFyYXRpb25zIGNhbiBiZQorICAgKiBkaWZmaWN1bHQgdG8gZGV0ZXJtaW5lLiBPbmx5IGd1YXJhbnRlZWQgY29sbGlzaW9ucyByZXR1cm4gdHJ1ZSAoY2F1c2UgYW4gZXJyb3IpLgorICAgKiBQb3NzaWJsZSBjb2xsaXNpb25zIGludm9sdmluZyBleHBsaWNpdCBuYW1lc3BhY2UgZGVjbGFyYXRpb25zIHByb2R1Y2UgYSB3YXJuaW5nLgorICAgKiBPdGhlciBwb3NzaWJsZSBjb2xsaXNpb25zIGdvIHVucmVwb3J0ZWQuCisgICAqIEBwYXJhbSBwcm9nIHRoZSBwcm9ncmFtIGNvbnRhaW5pbmcgdGhlIHByZWV4aXN0aW5nIHR5cGVuYW1lCisgICAqIEBwYXJhbSB0ICAgIHRoZSB0eXBlIGNvbnRhaW5pbmcgdGhlIHR5cGVuYW1lIG1hdGNoCisgICAqIEByZXR1cm4gICAgIHRydWUgaWYgYSBjb2xsaXNpb24gd2l0aGluIG5hbWVzcGFjZXMgaXMgZm91bmQsIG90aGVyd2lzZSBmYWxzZQorICAgKi8KKyAgYm9vbCBpc19jb21tb25fbmFtZXNwYWNlKHRfcHJvZ3JhbSogcHJvZywgdF90eXBlKiB0KSB7CisgICAgLy8gQ2FzZSAxOiBUeXBlbmFtZXMgYXJlIGluIHRoZSBzYW1lIHByb2dyYW0gW2NvbGxpc2lvbl0KKyAgICBpZiAocHJvZyA9PSB0LT5nZXRfcHJvZ3JhbSgpKSB7CisgICAgICBwd2FybmluZygxLAorICAgICAgICAgICAgICAgIkR1cGxpY2F0ZSB0eXBlbmFtZSAlcyBmb3VuZCBpbiAlcyIsCisgICAgICAgICAgICAgICB0LT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgICAgICB0LT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gQ2FzZSAyOiBCb3RoIHByb2dyYW1zIGhhdmUgaWRlbnRpY2FsIG5hbWVzcGFjZSBzY29wZS9uYW1lIGRlY2xhcmF0aW9ucyBbY29sbGlzaW9uXQorICAgIGJvb2wgbWF0Y2ggPSB0cnVlOworICAgIGZvciAoc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6aXRlcmF0b3IgaXQgPSBwcm9nLT5uYW1lc3BhY2VzXy5iZWdpbigpOworICAgICAgICAgaXQgIT0gcHJvZy0+bmFtZXNwYWNlc18uZW5kKCk7CisgICAgICAgICArK2l0KSB7CisgICAgICBpZiAoMCA9PSBpdC0+c2Vjb25kLmNvbXBhcmUodC0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWVzcGFjZShpdC0+Zmlyc3QpKSkgeworICAgICAgICBwd2FybmluZygxLAorICAgICAgICAgICAgICAgICAiRHVwbGljYXRlIHR5cGVuYW1lICVzIGZvdW5kIGluICVzLCVzLCVzIGFuZCAlcywlcywlcyBbZmlsZSxzY29wZSxuc10iLAorICAgICAgICAgICAgICAgICB0LT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgIHQtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgaXQtPmZpcnN0LmNfc3RyKCksCisgICAgICAgICAgICAgICAgIGl0LT5zZWNvbmQuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgcHJvZy0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICBpdC0+Zmlyc3QuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgaXQtPnNlY29uZC5jX3N0cigpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1hdGNoID0gZmFsc2U7CisgICAgICB9CisgICAgfQorICAgIGZvciAoc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6aXRlcmF0b3IgaXQgPSB0LT5nZXRfcHJvZ3JhbSgpLT5uYW1lc3BhY2VzXy5iZWdpbigpOworICAgICAgICAgaXQgIT0gdC0+Z2V0X3Byb2dyYW0oKS0+bmFtZXNwYWNlc18uZW5kKCk7CisgICAgICAgICArK2l0KSB7CisgICAgICBpZiAoMCA9PSBpdC0+c2Vjb25kLmNvbXBhcmUocHJvZy0+Z2V0X25hbWVzcGFjZShpdC0+Zmlyc3QpKSkgeworICAgICAgICBwd2FybmluZygxLAorICAgICAgICAgICAgICAgICAiRHVwbGljYXRlIHR5cGVuYW1lICVzIGZvdW5kIGluICVzLCVzLCVzIGFuZCAlcywlcywlcyBbZmlsZSxzY29wZSxuc10iLAorICAgICAgICAgICAgICAgICB0LT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgIHQtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgaXQtPmZpcnN0LmNfc3RyKCksCisgICAgICAgICAgICAgICAgIGl0LT5zZWNvbmQuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgcHJvZy0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICBpdC0+Zmlyc3QuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgaXQtPnNlY29uZC5jX3N0cigpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1hdGNoID0gZmFsc2U7CisgICAgICB9CisgICAgfQorICAgIGlmICgwID09IHByb2ctPm5hbWVzcGFjZXNfLnNpemUoKSAmJiAwID09IHQtPmdldF9wcm9ncmFtKCktPm5hbWVzcGFjZXNfLnNpemUoKSkgeworICAgICAgcHdhcm5pbmcoMSwKKyAgICAgICAgICAgICAgICJEdXBsaWNhdGUgdHlwZW5hbWUgJXMgZm91bmQgaW4gJXMgYW5kICVzIiwKKyAgICAgICAgICAgICAgIHQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgIHQtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgIHByb2ctPmdldF9uYW1lKCkuY19zdHIoKSk7CisgICAgfQorICAgIHJldHVybiBtYXRjaDsKKyAgfQorCisgIC8vIFNjb3BpbmcgYW5kIG5hbWVzcGFjaW5nCisgIHZvaWQgc2V0X25hbWVzcGFjZShzdGQ6OnN0cmluZyBuYW1lKSB7IG5hbWVzcGFjZV8gPSBuYW1lOyB9CisKKyAgLy8gU2NvcGUgYWNjZXNzb3IKKyAgdF9zY29wZSogc2NvcGUoKSBjb25zdCB7IHJldHVybiBzY29wZV87IH0KKworICAvLyBJbmNsdWRlcworCisgIHZvaWQgYWRkX2luY2x1ZGUodF9wcm9ncmFtKiBwcm9ncmFtKSB7CisgICAgaW5jbHVkZXNfLnB1c2hfYmFjayhwcm9ncmFtKTsKKyAgfQorCisgIHZvaWQgYWRkX2luY2x1ZGUoc3RkOjpzdHJpbmcgcGF0aCwgc3RkOjpzdHJpbmcgaW5jbHVkZV9zaXRlKSB7CisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gbmV3IHRfcHJvZ3JhbShwYXRoKTsKKworICAgIC8vIGluY2x1ZGUgcHJlZml4IGZvciB0aGlzIHByb2dyYW0gaXMgdGhlIHNpdGUgYXQgd2hpY2ggaXQgd2FzIGluY2x1ZGVkCisgICAgLy8gKG1pbnVzIHRoZSBmaWxlbmFtZSkKKyAgICBzdGQ6OnN0cmluZyBpbmNsdWRlX3ByZWZpeDsKKyAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGxhc3Rfc2xhc2ggPSBzdGQ6OnN0cmluZzo6bnBvczsKKyAgICBpZiAoKGxhc3Rfc2xhc2ggPSBpbmNsdWRlX3NpdGUucmZpbmQoIi8iKSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgIGluY2x1ZGVfcHJlZml4ID0gaW5jbHVkZV9zaXRlLnN1YnN0cigwLCBsYXN0X3NsYXNoKTsKKyAgICB9CisKKyAgICBwcm9ncmFtLT5zZXRfaW5jbHVkZV9wcmVmaXgoaW5jbHVkZV9wcmVmaXgpOworICAgIGluY2x1ZGVzXy5wdXNoX2JhY2socHJvZ3JhbSk7CisgIH0KKworICBzdGQ6OnZlY3Rvcjx0X3Byb2dyYW0qPiYgZ2V0X2luY2x1ZGVzKCkgeyByZXR1cm4gaW5jbHVkZXNfOyB9CisKKyAgdm9pZCBzZXRfaW5jbHVkZV9wcmVmaXgoc3RkOjpzdHJpbmcgaW5jbHVkZV9wcmVmaXgpIHsKKyAgICBpbmNsdWRlX3ByZWZpeF8gPSBpbmNsdWRlX3ByZWZpeDsKKworICAgIC8vIHRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgYSBkaXJlY3Rvcnk7IGFkZCBhIHRyYWlsaW5nIHNsYXNoIGlmIG5lY2Vzc2FyeQorICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgbGVuID0gaW5jbHVkZV9wcmVmaXhfLnNpemUoKTsKKyAgICBpZiAobGVuID4gMCAmJiBpbmNsdWRlX3ByZWZpeF9bbGVuIC0gMV0gIT0gJy8nKSB7CisgICAgICBpbmNsdWRlX3ByZWZpeF8gKz0gJy8nOworICAgIH0KKyAgfQorCisgIC8vIExhbmd1YWdlIG5ldXRyYWwgbmFtZXNwYWNlIC8gcGFja2FnaW5nCisgIHZvaWQgc2V0X25hbWVzcGFjZShzdGQ6OnN0cmluZyBsYW5ndWFnZSwgc3RkOjpzdHJpbmcgbmFtZV9zcGFjZSkgeworICAgIGlmIChsYW5ndWFnZSAhPSAiKiIpIHsKKyAgICAgIHNpemVfdCBzdWJfaW5kZXggPSBsYW5ndWFnZS5maW5kKCcuJyk7CisgICAgICBzdGQ6OnN0cmluZyBiYXNlX2xhbmd1YWdlID0gbGFuZ3VhZ2Uuc3Vic3RyKDAsIHN1Yl9pbmRleCk7CisgICAgICBzdGQ6OnN0cmluZyBzdWJfbmFtZXNwYWNlOworCisgICAgICBpZiAoYmFzZV9sYW5ndWFnZSA9PSAic21hbGx0YWxrIikgeworICAgICAgICBwd2FybmluZygxLCAiTmFtZXNwYWNlICdzbWFsbHRhbGsnIGlzIGRlcHJlY2F0ZWQuIFVzZSAnc3QnIGluc3RlYWQiKTsKKyAgICAgICAgYmFzZV9sYW5ndWFnZSA9ICJzdCI7CisgICAgICB9CisKKyAgICAgIHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpnZW5fbWFwX3QgbXlfY29weSA9IHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpnZXRfZ2VuZXJhdG9yX21hcCgpOworCisgICAgICB0X2dlbmVyYXRvcl9yZWdpc3RyeTo6Z2VuX21hcF90OjppdGVyYXRvciBpdDsKKyAgICAgIGl0ID0gbXlfY29weS5maW5kKGJhc2VfbGFuZ3VhZ2UpOworCisgICAgICBpZiAoaXQgPT0gbXlfY29weS5lbmQoKSkgeworICAgICAgICBzdGQ6OnN0cmluZyB3YXJuaW5nID0gIk5vIGdlbmVyYXRvciBuYW1lZCAnIiArIGJhc2VfbGFuZ3VhZ2UgKyAiJyBjb3VsZCBiZSBmb3VuZCEiOworICAgICAgICBwd2FybmluZygxLCB3YXJuaW5nLmNfc3RyKCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHN1Yl9pbmRleCAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgIHN0ZDo6c3RyaW5nIHN1Yl9uYW1lc3BhY2UgPSBsYW5ndWFnZS5zdWJzdHIoc3ViX2luZGV4ICsgMSk7CisgICAgICAgICAgaWYgKCFpdC0+c2Vjb25kLT5pc192YWxpZF9uYW1lc3BhY2Uoc3ViX25hbWVzcGFjZSkpIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHdhcm5pbmcgPSBiYXNlX2xhbmd1YWdlICsgIiBnZW5lcmF0b3IgZG9lcyBub3QgYWNjZXB0ICciICsgc3ViX25hbWVzcGFjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIicgYXMgc3ViLW5hbWVzcGFjZSEiOworICAgICAgICAgICAgcHdhcm5pbmcoMSwgd2FybmluZy5jX3N0cigpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBuYW1lc3BhY2VzX1tsYW5ndWFnZV0gPSBuYW1lX3NwYWNlOworICB9CisKKyAgc3RkOjpzdHJpbmcgZ2V0X25hbWVzcGFjZShzdGQ6OnN0cmluZyBsYW5ndWFnZSkgY29uc3QgeworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7CisgICAgaWYgKChpdGVyID0gbmFtZXNwYWNlc18uZmluZChsYW5ndWFnZSkpICE9IG5hbWVzcGFjZXNfLmVuZCgpCisgICAgICAgIHx8IChpdGVyID0gbmFtZXNwYWNlc18uZmluZCgiKiIpKSAhPSBuYW1lc3BhY2VzXy5lbmQoKSkgeworICAgICAgcmV0dXJuIGl0ZXItPnNlY29uZDsKKyAgICB9CisgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCk7CisgIH0KKworICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBnZXRfYWxsX25hbWVzcGFjZXMoKXsKKyAgICAgcmV0dXJuIG5hbWVzcGFjZXNfOworICB9CisKKyAgdm9pZCBzZXRfbmFtZXNwYWNlX2Fubm90YXRpb25zKHN0ZDo6c3RyaW5nIGxhbmd1YWdlLCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IGFubm90YXRpb25zKSB7CisgICAgbmFtZXNwYWNlX2Fubm90YXRpb25zX1tsYW5ndWFnZV0gPSBhbm5vdGF0aW9uczsKKyAgfQorCisgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIGdldF9uYW1lc3BhY2VfYW5ub3RhdGlvbnMoc3RkOjpzdHJpbmcgbGFuZ3VhZ2UpIHsKKyAgICByZXR1cm4gbmFtZXNwYWNlX2Fubm90YXRpb25zX1tsYW5ndWFnZV07CisgIH0KKworICAvLyBMYW5ndWFnZSBzcGVjaWZpYyBuYW1lc3BhY2UgLyBwYWNrYWdpbmcKKworICB2b2lkIGFkZF9jcHBfaW5jbHVkZShzdGQ6OnN0cmluZyBwYXRoKSB7IGNwcF9pbmNsdWRlc18ucHVzaF9iYWNrKHBhdGgpOyB9CisKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBnZXRfY3BwX2luY2x1ZGVzKCkgeyByZXR1cm4gY3BwX2luY2x1ZGVzXzsgfQorCisgIHZvaWQgYWRkX2NfaW5jbHVkZShzdGQ6OnN0cmluZyBwYXRoKSB7IGNfaW5jbHVkZXNfLnB1c2hfYmFjayhwYXRoKTsgfQorCisgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgZ2V0X2NfaW5jbHVkZXMoKSB7IHJldHVybiBjX2luY2x1ZGVzXzsgfQorCitwcml2YXRlOgorICAvLyBGaWxlIHBhdGgKKyAgc3RkOjpzdHJpbmcgcGF0aF87CisKKyAgLy8gTmFtZQorICBzdGQ6OnN0cmluZyBuYW1lXzsKKworICAvLyBPdXRwdXQgZGlyZWN0b3J5CisgIHN0ZDo6c3RyaW5nIG91dF9wYXRoXzsKKworICAvLyBPdXRwdXQgZGlyZWN0b3J5IGlzIGFic29sdXRlIGxvY2F0aW9uIGZvciBnZW5lcmF0ZWQgc291cmNlIChubyBnZW4tKikKKyAgYm9vbCBvdXRfcGF0aF9pc19hYnNvbHV0ZV87CisKKyAgLy8gTmFtZXNwYWNlCisgIHN0ZDo6c3RyaW5nIG5hbWVzcGFjZV87CisKKyAgLy8gSW5jbHVkZWQgcHJvZ3JhbXMKKyAgc3RkOjp2ZWN0b3I8dF9wcm9ncmFtKj4gaW5jbHVkZXNfOworCisgIC8vIEluY2x1ZGUgcHJlZml4IGZvciB0aGlzIHByb2dyYW0sIGlmIGFueQorICBzdGQ6OnN0cmluZyBpbmNsdWRlX3ByZWZpeF87CisKKyAgLy8gSWRlbnRpZmllciBsb29rdXAgc2NvcGUKKyAgdF9zY29wZSogc2NvcGVfOworCisgIC8vIENvbXBvbmVudHMgdG8gZ2VuZXJhdGUgY29kZSBmb3IKKyAgc3RkOjp2ZWN0b3I8dF90eXBlZGVmKj4gdHlwZWRlZnNfOworICBzdGQ6OnZlY3Rvcjx0X2VudW0qPiBlbnVtc187CisgIHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHNfOworICBzdGQ6OnZlY3Rvcjx0X3N0cnVjdCo+IG9iamVjdHNfOworICBzdGQ6OnZlY3Rvcjx0X3N0cnVjdCo+IHN0cnVjdHNfOworICBzdGQ6OnZlY3Rvcjx0X3N0cnVjdCo+IHhjZXB0aW9uc187CisgIHN0ZDo6dmVjdG9yPHRfc2VydmljZSo+IHNlcnZpY2VzXzsKKworICAvLyBEeW5hbWljIG5hbWVzcGFjZXMKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBuYW1lc3BhY2VzXzsKKworICAvLyBBbm5vdGF0aW9ucyBmb3IgZHluYW1pYyBuYW1lc3BhY2VzCisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+ID4gbmFtZXNwYWNlX2Fubm90YXRpb25zXzsKKworICAvLyBDKysgZXh0cmEgaW5jbHVkZXMKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNwcF9pbmNsdWRlc187CisKKyAgLy8gQyBleHRyYSBpbmNsdWRlcworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY19pbmNsdWRlc187Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3Rfc2NvcGUuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3Rfc2NvcGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjE2MGE1Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9zY29wZS5oCkBAIC0wLDAgKzEsMTg4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9TQ09QRV9ICisjZGVmaW5lIFRfU0NPUEVfSAorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfdHlwZS5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3NlcnZpY2UuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9jb25zdC5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2NvbnN0X3ZhbHVlLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfYmFzZV90eXBlLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfbWFwLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfbGlzdC5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3NldC5oIgorCituYW1lc3BhY2UgcGx1Z2luX291dHB1dCB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgRnJvbSwgdHlwZW5hbWUgVG8+Cit2b2lkIGNvbnZlcnQoRnJvbSosIFRvJik7Cit9CisKKy8qKgorICogVGhpcyByZXByZXNlbnRzIGEgdmFyaWFibGUgc2NvcGUgdXNlZCBmb3IgbG9va2luZyB1cCBwcmVkZWZpbmVkIHR5cGVzIGFuZAorICogc2VydmljZXMuIFR5cGljYWxseSwgYSBzY29wZSBpcyBhc3NvY2lhdGVkIHdpdGggYSB0X3Byb2dyYW0uIFNjb3BlcyBhcmUgbm90CisgKiB1c2VkIHRvIGRldGVybWluZSBjb2RlIGdlbmVyYXRpb24sIGJ1dCByYXRoZXIgdG8gcmVzb2x2ZSBpZGVudGlmaWVycyBhdAorICogcGFyc2UgdGltZS4KKyAqCisgKi8KK2NsYXNzIHRfc2NvcGUgeworcHVibGljOgorICB0X3Njb3BlKCkge30KKworICB2b2lkIGFkZF90eXBlKHN0ZDo6c3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSkgeyB0eXBlc19bbmFtZV0gPSB0eXBlOyB9CisKKyAgdF90eXBlKiBnZXRfdHlwZShzdGQ6OnN0cmluZyBuYW1lKSB7IHJldHVybiB0eXBlc19bbmFtZV07IH0KKworICB2b2lkIGFkZF9zZXJ2aWNlKHN0ZDo6c3RyaW5nIG5hbWUsIHRfc2VydmljZSogc2VydmljZSkgeyBzZXJ2aWNlc19bbmFtZV0gPSBzZXJ2aWNlOyB9CisKKyAgdF9zZXJ2aWNlKiBnZXRfc2VydmljZShzdGQ6OnN0cmluZyBuYW1lKSB7IHJldHVybiBzZXJ2aWNlc19bbmFtZV07IH0KKworICB2b2lkIGFkZF9jb25zdGFudChzdGQ6OnN0cmluZyBuYW1lLCB0X2NvbnN0KiBjb25zdGFudCkgeworICAgIGlmIChjb25zdGFudHNfLmZpbmQobmFtZSkgIT0gY29uc3RhbnRzXy5lbmQoKSkgeworICAgICAgdGhyb3cgIkVudW0gIiArIG5hbWUgKyAiIGlzIGFscmVhZHkgZGVmaW5lZCEiOworICAgIH0gZWxzZSB7CisgICAgICBjb25zdGFudHNfW25hbWVdID0gY29uc3RhbnQ7CisgICAgfQorICB9CisKKyAgdF9jb25zdCogZ2V0X2NvbnN0YW50KHN0ZDo6c3RyaW5nIG5hbWUpIHsgcmV0dXJuIGNvbnN0YW50c19bbmFtZV07IH0KKworICB2b2lkIHByaW50KCkgeworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB0X3R5cGUqPjo6aXRlcmF0b3IgaXRlcjsKKyAgICBmb3IgKGl0ZXIgPSB0eXBlc18uYmVnaW4oKTsgaXRlciAhPSB0eXBlc18uZW5kKCk7ICsraXRlcikgeworICAgICAgcHJpbnRmKCIlcyA9PiAlc1xuIiwgaXRlci0+Zmlyc3QuY19zdHIoKSwgaXRlci0+c2Vjb25kLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICAgIH0KKyAgfQorCisgIHZvaWQgcmVzb2x2ZV9jb25zdF92YWx1ZSh0X2NvbnN0X3ZhbHVlKiBjb25zdF92YWwsIHRfdHlwZSogdHR5cGUpIHsKKyAgICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgICBjb25zdCBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiBtYXAgPSBjb25zdF92YWwtPmdldF9tYXAoKTsKKyAgICAgIHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICAgIGZvciAodl9pdGVyID0gbWFwLmJlZ2luKCk7IHZfaXRlciAhPSBtYXAuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICAgIHJlc29sdmVfY29uc3RfdmFsdWUodl9pdGVyLT5maXJzdCwgKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSk7CisgICAgICAgIHJlc29sdmVfY29uc3RfdmFsdWUodl9pdGVyLT5zZWNvbmQsICgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSBjb25zdF92YWwtPmdldF9saXN0KCk7CisgICAgICBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICAgIHJlc29sdmVfY29uc3RfdmFsdWUoKCp2X2l0ZXIpLCAoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IGNvbnN0X3ZhbC0+Z2V0X2xpc3QoKTsKKyAgICAgIHN0ZDo6dmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgICAgcmVzb2x2ZV9jb25zdF92YWx1ZSgoKnZfaXRlciksICgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSkgeworICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QgPSAodF9zdHJ1Y3QqKXR0eXBlOworICAgICAgY29uc3Qgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgbWFwID0gY29uc3RfdmFsLT5nZXRfbWFwKCk7CisgICAgICBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgICBmb3IgKHZfaXRlciA9IG1hcC5iZWdpbigpOyB2X2l0ZXIgIT0gbWFwLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgICB0X2ZpZWxkKiBmaWVsZCA9IHRzdHJ1Y3QtPmdldF9maWVsZF9ieV9uYW1lKHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSk7CisgICAgICAgIGlmIChmaWVsZCA9PSBOVUxMKSB7CisgICAgICAgICAgdGhyb3cgIk5vIGZpZWxkIG5hbWVkIFwiIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKQorICAgICAgICAgICAgICArICJcIiB3YXMgZm91bmQgaW4gc3RydWN0IG9mIHR5cGUgXCIiICsgdHN0cnVjdC0+Z2V0X25hbWUoKSArICJcIiI7CisgICAgICAgIH0KKyAgICAgICAgcmVzb2x2ZV9jb25zdF92YWx1ZSh2X2l0ZXItPnNlY29uZCwgZmllbGQtPmdldF90eXBlKCkpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoY29uc3RfdmFsLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lERU5USUZJRVIpIHsKKyAgICAgIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgICAgIGNvbnN0X3ZhbC0+c2V0X2VudW0oKHRfZW51bSopdHR5cGUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdF9jb25zdCogY29uc3RhbnQgPSBnZXRfY29uc3RhbnQoY29uc3RfdmFsLT5nZXRfaWRlbnRpZmllcigpKTsKKyAgICAgICAgaWYgKGNvbnN0YW50ID09IE5VTEwpIHsKKyAgICAgICAgICB0aHJvdyAiTm8gZW51bSB2YWx1ZSBvciBjb25zdGFudCBmb3VuZCBuYW1lZCBcIiIgKyBjb25zdF92YWwtPmdldF9pZGVudGlmaWVyKCkgKyAiXCIhIjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlc29sdmUgdHlwZWRlZnMgdG8gdGhlIHVuZGVybHlpbmcgdHlwZQorICAgICAgICB0X3R5cGUqIGNvbnN0X3R5cGUgPSBjb25zdGFudC0+Z2V0X3R5cGUoKS0+Z2V0X3RydWVfdHlwZSgpOworCisgICAgICAgIGlmIChjb25zdF90eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgICAgIHN3aXRjaCAoKCh0X2Jhc2VfdHlwZSopY29uc3RfdHlwZSktPmdldF9iYXNlKCkpIHsKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgICAgIGNvbnN0X3ZhbC0+c2V0X2ludGVnZXIoY29uc3RhbnQtPmdldF92YWx1ZSgpLT5nZXRfaW50ZWdlcigpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICAgICAgY29uc3RfdmFsLT5zZXRfc3RyaW5nKGNvbnN0YW50LT5nZXRfdmFsdWUoKS0+Z2V0X3N0cmluZygpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICAgICAgY29uc3RfdmFsLT5zZXRfZG91YmxlKGNvbnN0YW50LT5nZXRfdmFsdWUoKS0+Z2V0X2RvdWJsZSgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgICAgIHRocm93ICJDb25zdGFudHMgY2Fubm90IGJlIG9mIHR5cGUgVk9JRCI7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGNvbnN0X3R5cGUtPmlzX21hcCgpKSB7CisgICAgICAgICAgY29uc3Qgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgbWFwID0gY29uc3RhbnQtPmdldF92YWx1ZSgpLT5nZXRfbWFwKCk7CisgICAgICAgICAgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworCisgICAgICAgICAgY29uc3RfdmFsLT5zZXRfbWFwKCk7CisgICAgICAgICAgZm9yICh2X2l0ZXIgPSBtYXAuYmVnaW4oKTsgdl9pdGVyICE9IG1hcC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgICAgICAgIGNvbnN0X3ZhbC0+YWRkX21hcCh2X2l0ZXItPmZpcnN0LCB2X2l0ZXItPnNlY29uZCk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGNvbnN0X3R5cGUtPmlzX2xpc3QoKSkgeworICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gY29uc3RhbnQtPmdldF92YWx1ZSgpLT5nZXRfbGlzdCgpOworICAgICAgICAgIHN0ZDo6dmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworCisgICAgICAgICAgY29uc3RfdmFsLT5zZXRfbGlzdCgpOworICAgICAgICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICAgICAgICBjb25zdF92YWwtPmFkZF9saXN0KCp2X2l0ZXIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgLy8gZW51bSBjb25zdGFudCB3aXRoIG5vbi1pZGVudGlmaWVyIHZhbHVlLiBzZXQgdGhlIGVudW0gYW5kIGZpbmQgdGhlCisgICAgICAvLyB2YWx1ZSdzIG5hbWUuCisgICAgICB0X2VudW0qIHRlbnVtID0gKHRfZW51bSopdHR5cGU7CisgICAgICB0X2VudW1fdmFsdWUqIGVudW1fdmFsdWUgPSB0ZW51bS0+Z2V0X2NvbnN0YW50X2J5X3ZhbHVlKGNvbnN0X3ZhbC0+Z2V0X2ludGVnZXIoKSk7CisgICAgICBpZiAoZW51bV92YWx1ZSA9PSBOVUxMKSB7CisgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSB2YWxzdG07CisgICAgICAgIHZhbHN0bSA8PCBjb25zdF92YWwtPmdldF9pbnRlZ2VyKCk7CisgICAgICAgIHRocm93ICJDb3VsZG4ndCBmaW5kIGEgbmFtZWQgdmFsdWUgaW4gZW51bSAiICsgdGVudW0tPmdldF9uYW1lKCkgKyAiIGZvciB2YWx1ZSAiCisgICAgICAgICAgICArIHZhbHN0bS5zdHIoKTsKKyAgICAgIH0KKyAgICAgIGNvbnN0X3ZhbC0+c2V0X2lkZW50aWZpZXIodGVudW0tPmdldF9uYW1lKCkgKyAiLiIgKyBlbnVtX3ZhbHVlLT5nZXRfbmFtZSgpKTsKKyAgICAgIGNvbnN0X3ZhbC0+c2V0X2VudW0odGVudW0pOworICAgIH0KKyAgfQorCitwcml2YXRlOgorICAvLyBNYXAgb2YgbmFtZXMgdG8gdHlwZXMKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHRfdHlwZSo+IHR5cGVzXzsKKworICAvLyBNYXAgb2YgbmFtZXMgdG8gY29uc3RhbnRzCisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB0X2NvbnN0Kj4gY29uc3RhbnRzXzsKKworICAvLyBNYXAgb2YgbmFtZXMgdG8gc2VydmljZXMKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHRfc2VydmljZSo+IHNlcnZpY2VzXzsKKworICAvLyB0byBsaXN0IG1hcCBlbnRyaWVzCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGcm9tLCB0eXBlbmFtZSBUbz4KKyAgICBmcmllbmQgdm9pZCBwbHVnaW5fb3V0cHV0Ojpjb252ZXJ0KEZyb20qLCBUbyYpOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3NlcnZpY2UuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3Rfc2VydmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMjA0Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3NlcnZpY2UuaApAQCAtMCwwICsxLDYxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9TRVJWSUNFX0gKKyNkZWZpbmUgVF9TRVJWSUNFX0gKKworI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2Z1bmN0aW9uLmgiCisjaW5jbHVkZSA8dmVjdG9yPgorCitjbGFzcyB0X3Byb2dyYW07CisKKy8qKgorICogQSBzZXJ2aWNlIGNvbnNpc3RzIG9mIGEgc2V0IG9mIGZ1bmN0aW9ucy4KKyAqCisgKi8KK2NsYXNzIHRfc2VydmljZSA6IHB1YmxpYyB0X3R5cGUgeworcHVibGljOgorICB0X3NlcnZpY2UodF9wcm9ncmFtKiBwcm9ncmFtKSA6IHRfdHlwZShwcm9ncmFtKSwgZXh0ZW5kc18oTlVMTCkge30KKworICBib29sIGlzX3NlcnZpY2UoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisKKyAgdm9pZCBzZXRfZXh0ZW5kcyh0X3NlcnZpY2UqIGV4dGVuZHMpIHsgZXh0ZW5kc18gPSBleHRlbmRzOyB9CisKKyAgdm9pZCBhZGRfZnVuY3Rpb24odF9mdW5jdGlvbiogZnVuYykgeworICAgIHN0ZDo6dmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKyAgICBmb3IgKGl0ZXIgPSBmdW5jdGlvbnNfLmJlZ2luKCk7IGl0ZXIgIT0gZnVuY3Rpb25zXy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiAoZnVuYy0+Z2V0X25hbWUoKSA9PSAoKml0ZXIpLT5nZXRfbmFtZSgpKSB7CisgICAgICAgIHRocm93ICJGdW5jdGlvbiAiICsgZnVuYy0+Z2V0X25hbWUoKSArICIgaXMgYWxyZWFkeSBkZWZpbmVkIjsKKyAgICAgIH0KKyAgICB9CisgICAgZnVuY3Rpb25zXy5wdXNoX2JhY2soZnVuYyk7CisgIH0KKworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2Z1bmN0aW9uKj4mIGdldF9mdW5jdGlvbnMoKSBjb25zdCB7IHJldHVybiBmdW5jdGlvbnNfOyB9CisKKyAgdF9zZXJ2aWNlKiBnZXRfZXh0ZW5kcygpIHsgcmV0dXJuIGV4dGVuZHNfOyB9CisKKyAgY29uc3QgdF9zZXJ2aWNlKiBnZXRfZXh0ZW5kcygpIGNvbnN0IHsgcmV0dXJuIGV4dGVuZHNfOyB9CisKK3ByaXZhdGU6CisgIHN0ZDo6dmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnNfOworICB0X3NlcnZpY2UqIGV4dGVuZHNfOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3NldC5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9zZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTEzYmU0Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9zZXQuaApAQCAtMCwwICsxLDQxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9TRVRfSAorI2RlZmluZSBUX1NFVF9ICisKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9jb250YWluZXIuaCIKKworLyoqCisgKiBBIHNldCBpcyBhIGxpZ2h0d2VpZ2h0IGNvbnRhaW5lciB0eXBlIHRoYXQganVzdCB3cmFwcyBhbm90aGVyIGRhdGEgdHlwZS4KKyAqCisgKi8KK2NsYXNzIHRfc2V0IDogcHVibGljIHRfY29udGFpbmVyIHsKK3B1YmxpYzoKKyAgdF9zZXQodF90eXBlKiBlbGVtX3R5cGUpIDogZWxlbV90eXBlXyhlbGVtX3R5cGUpIHt9CisKKyAgdF90eXBlKiBnZXRfZWxlbV90eXBlKCkgY29uc3QgeyByZXR1cm4gZWxlbV90eXBlXzsgfQorCisgIGJvb2wgaXNfc2V0KCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCitwcml2YXRlOgorICB0X3R5cGUqIGVsZW1fdHlwZV87Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3Rfc3RydWN0LmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3N0cnVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMDJkYTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3N0cnVjdC5oCkBAIC0wLDAgKzEsMTcxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9TVFJVQ1RfSAorI2RlZmluZSBUX1NUUlVDVF9ICisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfdHlwZS5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2ZpZWxkLmgiCisKKy8vIEZvcndhcmQgZGVjbGFyZSB0aGF0IHB1cHB5CitjbGFzcyB0X3Byb2dyYW07CisKKy8qKgorICogQSBzdHJ1Y3QgaXMgYSBjb250YWluZXIgZm9yIGEgc2V0IG9mIG1lbWJlciBmaWVsZHMgdGhhdCBoYXMgYSBuYW1lLiBTdHJ1Y3RzCisgKiBhcmUgYWxzbyB1c2VkIHRvIGltcGxlbWVudCBleGNlcHRpb24gdHlwZXMuCisgKgorICovCitjbGFzcyB0X3N0cnVjdCA6IHB1YmxpYyB0X3R5cGUgeworcHVibGljOgorICB0eXBlZGVmIHN0ZDo6dmVjdG9yPHRfZmllbGQqPiBtZW1iZXJzX3R5cGU7CisKKyAgdF9zdHJ1Y3QodF9wcm9ncmFtKiBwcm9ncmFtKQorICAgIDogdF90eXBlKHByb2dyYW0pLAorICAgICAgaXNfeGNlcHRpb25fKGZhbHNlKSwKKyAgICAgIGlzX3VuaW9uXyhmYWxzZSksCisgICAgICBtZW1iZXJzX3ZhbGlkYXRlZChmYWxzZSksCisgICAgICBtZW1iZXJzX3dpdGhfdmFsdWUoMCksCisgICAgICB4c2RfYWxsXyhmYWxzZSkge30KKworICB0X3N0cnVjdCh0X3Byb2dyYW0qIHByb2dyYW0sIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKQorICAgIDogdF90eXBlKHByb2dyYW0sIG5hbWUpLAorICAgICAgaXNfeGNlcHRpb25fKGZhbHNlKSwKKyAgICAgIGlzX3VuaW9uXyhmYWxzZSksCisgICAgICBtZW1iZXJzX3ZhbGlkYXRlZChmYWxzZSksCisgICAgICBtZW1iZXJzX3dpdGhfdmFsdWUoMCksCisgICAgICB4c2RfYWxsXyhmYWxzZSkge30KKworICB2b2lkIHNldF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7CisgICAgbmFtZV8gPSBuYW1lOworICAgIHZhbGlkYXRlX3VuaW9uX21lbWJlcnMoKTsKKyAgfQorCisgIHZvaWQgc2V0X3hjZXB0aW9uKGJvb2wgaXNfeGNlcHRpb24pIHsgaXNfeGNlcHRpb25fID0gaXNfeGNlcHRpb247IH0KKworICB2b2lkIHZhbGlkYXRlX3VuaW9uX21lbWJlcih0X2ZpZWxkKiBmaWVsZCkgeworICAgIGlmIChpc191bmlvbl8gJiYgKCFuYW1lXy5lbXB0eSgpKSkgeworCisgICAgICAvLyAxKSB1bmlvbnMgY2FuJ3QgaGF2ZSByZXF1aXJlZCBmaWVsZHMKKyAgICAgIC8vIDIpIHVuaW9uIG1lbWJlcnMgYXJlIGltcGxpY2l0bHkgb3B0aW9uYWwsIG90aGVyd2lzZSBidWdzIGxpa2UgVEhSSUZULTM2NTAgd2FpdCB0byBoYXBwZW4KKyAgICAgIGlmIChmaWVsZC0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKKyAgICAgICAgLy8gbm8gd2FybmluZyBvbiBkZWZhdWx0IHJlcXVpcmVkbmVzcywgYnV0IGRvIHdhcm4gb24gYW55dGhpbmcgZWxzZSB0aGF0IGlzIGV4cGxpY2l0bHkgYXNrZWQgZm9yCisgICAgICAgIGlmKGZpZWxkLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCkgeworICAgICAgICAgIHB3YXJuaW5nKDEsCisgICAgICAgICAgICAgICAgICAgIlVuaW9uICVzIGZpZWxkICVzOiB1bmlvbiBtZW1iZXJzIG11c3QgYmUgb3B0aW9uYWwsIGlnbm9yaW5nIHNwZWNpZmllZCByZXF1aXJlZG5lc3MuXG4iLAorICAgICAgICAgICAgICAgICAgIG5hbWVfLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICAgICAgZmllbGQtPnNldF9yZXEodF9maWVsZDo6VF9PUFRJT05BTCk7CisgICAgICB9CisKKyAgICAgIC8vIHVuaW9ucyBtYXkgaGF2ZSB1cCB0byBvbmUgbWVtYmVyIGRlZmF1bHRlZCwgYnV0IG5vdCBtb3JlCisgICAgICBpZiAoZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKDEgPCArK21lbWJlcnNfd2l0aF92YWx1ZSkgeworICAgICAgICAgIHRocm93ICJFcnJvcjogRmllbGQgIiArIGZpZWxkLT5nZXRfbmFtZSgpICsgIiBwcm92aWRlcyBhbm90aGVyIGRlZmF1bHQgdmFsdWUgZm9yIHVuaW9uICIKKyAgICAgICAgICAgICAgKyBuYW1lXzsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHZvaWQgdmFsaWRhdGVfdW5pb25fbWVtYmVycygpIHsKKyAgICBpZiAoaXNfdW5pb25fICYmICghbmFtZV8uZW1wdHkoKSkgJiYgKCFtZW1iZXJzX3ZhbGlkYXRlZCkpIHsKKyAgICAgIG1lbWJlcnNfdHlwZTo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworICAgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzX2luX2lkX29yZGVyXy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVyc19pbl9pZF9vcmRlcl8uZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICAgIHZhbGlkYXRlX3VuaW9uX21lbWJlcigqbV9pdGVyKTsKKyAgICAgIH0KKyAgICAgIG1lbWJlcnNfdmFsaWRhdGVkID0gdHJ1ZTsKKyAgICB9CisgIH0KKworICB2b2lkIHNldF91bmlvbihib29sIGlzX3VuaW9uKSB7CisgICAgaXNfdW5pb25fID0gaXNfdW5pb247CisgICAgdmFsaWRhdGVfdW5pb25fbWVtYmVycygpOworICB9CisKKyAgdm9pZCBzZXRfeHNkX2FsbChib29sIHhzZF9hbGwpIHsgeHNkX2FsbF8gPSB4c2RfYWxsOyB9CisKKyAgYm9vbCBnZXRfeHNkX2FsbCgpIGNvbnN0IHsgcmV0dXJuIHhzZF9hbGxfOyB9CisKKyAgYm9vbCBhcHBlbmQodF9maWVsZCogZWxlbSkgeworICAgIHR5cGVkZWYgbWVtYmVyc190eXBlOjppdGVyYXRvciBpdGVyX3R5cGU7CisgICAgc3RkOjpwYWlyPGl0ZXJfdHlwZSwgaXRlcl90eXBlPiBib3VuZHMgPSBzdGQ6OmVxdWFsX3JhbmdlKG1lbWJlcnNfaW5faWRfb3JkZXJfLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlcnNfaW5faWRfb3JkZXJfLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkOjprZXlfY29tcGFyZSgpKTsKKyAgICBpZiAoYm91bmRzLmZpcnN0ICE9IGJvdW5kcy5zZWNvbmQpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgLy8gcmV0dXJucyBmYWxzZSB3aGVuIHRoZXJlIGlzIGEgY29uZmxpY3Qgb2YgZmllbGQgbmFtZXMKKyAgICBpZiAoZ2V0X2ZpZWxkX2J5X25hbWUoZWxlbS0+Z2V0X25hbWUoKSkgIT0gTlVMTCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBtZW1iZXJzXy5wdXNoX2JhY2soZWxlbSk7CisgICAgbWVtYmVyc19pbl9pZF9vcmRlcl8uaW5zZXJ0KGJvdW5kcy5zZWNvbmQsIGVsZW0pOworICAgIHZhbGlkYXRlX3VuaW9uX21lbWJlcihlbGVtKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGNvbnN0IG1lbWJlcnNfdHlwZSYgZ2V0X21lbWJlcnMoKSBjb25zdCB7IHJldHVybiBtZW1iZXJzXzsgfQorCisgIGNvbnN0IG1lbWJlcnNfdHlwZSYgZ2V0X3NvcnRlZF9tZW1iZXJzKCkgeyByZXR1cm4gbWVtYmVyc19pbl9pZF9vcmRlcl87IH0KKworICBib29sIGlzX3N0cnVjdCgpIGNvbnN0IHsgcmV0dXJuICFpc194Y2VwdGlvbl87IH0KKworICBib29sIGlzX3hjZXB0aW9uKCkgY29uc3QgeyByZXR1cm4gaXNfeGNlcHRpb25fOyB9CisKKyAgYm9vbCBpc191bmlvbigpIGNvbnN0IHsgcmV0dXJuIGlzX3VuaW9uXzsgfQorCisgIHRfZmllbGQqIGdldF9maWVsZF9ieV9uYW1lKHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUpIHsKKyAgICBtZW1iZXJzX3R5cGU6OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnNfaW5faWRfb3JkZXJfLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzX2luX2lkX29yZGVyXy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGlmICgoKm1faXRlciktPmdldF9uYW1lKCkgPT0gZmllbGRfbmFtZSkgeworICAgICAgICByZXR1cm4gKm1faXRlcjsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBjb25zdCB0X2ZpZWxkKiBnZXRfZmllbGRfYnlfbmFtZShzdGQ6OnN0cmluZyBmaWVsZF9uYW1lKSBjb25zdCB7CisgICAgbWVtYmVyc190eXBlOjpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzX2luX2lkX29yZGVyXy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVyc19pbl9pZF9vcmRlcl8uZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfbmFtZSgpID09IGZpZWxkX25hbWUpIHsKKyAgICAgICAgcmV0dXJuICptX2l0ZXI7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBOVUxMOworICB9CisKK3ByaXZhdGU6CisgIG1lbWJlcnNfdHlwZSBtZW1iZXJzXzsKKyAgbWVtYmVyc190eXBlIG1lbWJlcnNfaW5faWRfb3JkZXJfOworICBib29sIGlzX3hjZXB0aW9uXzsKKyAgYm9vbCBpc191bmlvbl87CisgIGJvb2wgbWVtYmVyc192YWxpZGF0ZWQ7CisgIGludCBtZW1iZXJzX3dpdGhfdmFsdWU7CisKKyAgYm9vbCB4c2RfYWxsXzsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF90eXBlLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3R5cGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTZkMWUwCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF90eXBlLmgKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX1RZUEVfSAorI2RlZmluZSBUX1RZUEVfSAorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2RvYy5oIgorCitjbGFzcyB0X3Byb2dyYW07CisKKy8qKgorICogR2VuZXJpYyByZXByZXNlbnRhdGlvbiBvZiBhIHRocmlmdCB0eXBlLiBUaGVzZSBvYmplY3RzIGFyZSB1c2VkIGJ5IHRoZQorICogcGFyc2VyIG1vZHVsZSB0byBidWlsZCB1cCBhIHRyZWUgb2Ygb2JqZWN0IHRoYXQgYXJlIGFsbCBleHBsaWNpdGx5IHR5cGVkLgorICogVGhlIGdlbmVyaWMgdF90eXBlIGNsYXNzIGV4cG9ydHMgYSB2YXJpZXR5IG9mIHVzZWZ1bCBtZXRob2RzIHRoYXQgYXJlCisgKiB1c2VkIGJ5IHRoZSBjb2RlIGdlbmVyYXRvciB0byBicmFuY2ggYmFzZWQgdXBvbiBkaWZmZXJlbnQgaGFuZGxpbmcgZm9yIHRoZQorICogdmFyaW91cyB0eXBlcy4KKyAqCisgKi8KK2NsYXNzIHRfdHlwZSA6IHB1YmxpYyB0X2RvYyB7CitwdWJsaWM6CisgIHZpcnR1YWwgfnRfdHlwZSgpIHt9CisKKyAgdmlydHVhbCB2b2lkIHNldF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7IG5hbWVfID0gbmFtZTsgfQorCisgIHZpcnR1YWwgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9uYW1lKCkgY29uc3QgeyByZXR1cm4gbmFtZV87IH0KKworICB2aXJ0dWFsIGJvb2wgaXNfdm9pZCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgYm9vbCBpc19iYXNlX3R5cGUoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICB2aXJ0dWFsIGJvb2wgaXNfc3RyaW5nKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgdmlydHVhbCBib29sIGlzX2JpbmFyeSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgYm9vbCBpc19ib29sKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgdmlydHVhbCBib29sIGlzX3R5cGVkZWYoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICB2aXJ0dWFsIGJvb2wgaXNfZW51bSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgYm9vbCBpc19zdHJ1Y3QoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICB2aXJ0dWFsIGJvb2wgaXNfeGNlcHRpb24oKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICB2aXJ0dWFsIGJvb2wgaXNfY29udGFpbmVyKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgdmlydHVhbCBib29sIGlzX2xpc3QoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICB2aXJ0dWFsIGJvb2wgaXNfc2V0KCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgdmlydHVhbCBib29sIGlzX21hcCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgYm9vbCBpc19zZXJ2aWNlKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKworICB0X3Byb2dyYW0qIGdldF9wcm9ncmFtKCkgeyByZXR1cm4gcHJvZ3JhbV87IH0KKworICBjb25zdCB0X3Byb2dyYW0qIGdldF9wcm9ncmFtKCkgY29uc3QgeyByZXR1cm4gcHJvZ3JhbV87IH0KKworICB0X3R5cGUqIGdldF90cnVlX3R5cGUoKTsKKyAgY29uc3QgdF90eXBlKiBnZXRfdHJ1ZV90eXBlKCkgY29uc3Q7CisKKyAgLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGJyZWFrIChtYXliZSBiYWRseSkgdW5sZXNzIDAgPD0gbnVtIDw9IDE2LgorICBzdGF0aWMgY2hhciBueWJibGVfdG9feGRpZ2l0KGludCBudW0pIHsKKyAgICBpZiAobnVtIDwgMTApIHsKKyAgICAgIHJldHVybiAnMCcgKyBudW07CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAnQScgKyBudW0gLSAxMDsKKyAgICB9CisgIH0KKworICBzdGF0aWMgc3RkOjpzdHJpbmcgYnl0ZV90b19oZXgodWludDhfdCBieXRlKSB7CisgICAgc3RkOjpzdHJpbmcgcnY7CisgICAgcnYgKz0gbnliYmxlX3RvX3hkaWdpdChieXRlID4+IDQpOworICAgIHJ2ICs9IG55YmJsZV90b194ZGlnaXQoYnl0ZSAmIDB4MGYpOworICAgIHJldHVybiBydjsKKyAgfQorCisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gYW5ub3RhdGlvbnNfOworCitwcm90ZWN0ZWQ6CisgIHRfdHlwZSgpIDogcHJvZ3JhbV8oTlVMTCkgeyA7IH0KKworICB0X3R5cGUodF9wcm9ncmFtKiBwcm9ncmFtKSA6IHByb2dyYW1fKHByb2dyYW0pIHsgOyB9CisKKyAgdF90eXBlKHRfcHJvZ3JhbSogcHJvZ3JhbSwgc3RkOjpzdHJpbmcgbmFtZSkgOiBwcm9ncmFtXyhwcm9ncmFtKSwgbmFtZV8obmFtZSkgeyA7IH0KKworICB0X3R5cGUoc3RkOjpzdHJpbmcgbmFtZSkgOiBwcm9ncmFtXyhOVUxMKSwgbmFtZV8obmFtZSkgeyA7IH0KKworICB0X3Byb2dyYW0qIHByb2dyYW1fOworICBzdGQ6OnN0cmluZyBuYW1lXzsKK307CisKKy8qKgorICogUGxhY2Vob2xkZXIgc3RydWN0IGZvciByZXR1cm5pbmcgdGhlIGtleSBhbmQgdmFsdWUgb2YgYW4gYW5ub3RhdGlvbgorICogZHVyaW5nIHBhcnNpbmcuCisgKi8KK3N0cnVjdCB0X2Fubm90YXRpb24geworICBzdGQ6OnN0cmluZyBrZXk7CisgIHN0ZDo6c3RyaW5nIHZhbDsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF90eXBlZGVmLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF90eXBlZGVmLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5ZmZkYjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3R5cGVkZWYuY2MKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgPGNzdGRpbz4KKworI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3R5cGVkZWYuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9wcm9ncmFtLmgiCisKK3RfdHlwZSogdF90eXBlZGVmOjpnZXRfdHlwZSgpIGNvbnN0IHsKKyAgaWYgKHR5cGVfID09IE5VTEwpIHsKKyAgICB0X3R5cGUqIHR5cGUgPSBnZXRfcHJvZ3JhbSgpLT5zY29wZSgpLT5nZXRfdHlwZShzeW1ib2xpY18pOworICAgIGlmICh0eXBlID09IE5VTEwpIHsKKyAgICAgIHByaW50ZigiVHlwZSBcIiVzXCIgbm90IGRlZmluZWRcbiIsIHN5bWJvbGljXy5jX3N0cigpKTsKKyAgICAgIGV4aXQoMSk7CisgICAgfQorICAgIHJldHVybiB0eXBlOworICB9CisgIHJldHVybiB0eXBlXzsKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfdHlwZWRlZi5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF90eXBlZGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFkM2E1MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfdHlwZWRlZi5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX1RZUEVERUZfSAorI2RlZmluZSBUX1RZUEVERUZfSAorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3R5cGUuaCIKKworLyoqCisgKiBBIHR5cGVkZWYgaXMgYSBtYXBwaW5nIGZyb20gYSBzeW1ib2xpYyBuYW1lIHRvIGFub3RoZXIgdHlwZS4gSW4gZHltYW5pY2FsbHkKKyAqIHR5cGVkIGxhbmd1YWdlcyAoaS5lLiBwaHAvcHl0aG9uKSB0aGUgY29kZSBnZW5lcmF0b3IgY2FuIGFjdHVhbGx5IHVzdWFsbHkKKyAqIGlnbm9yZSB0eXBlZGVmcyBhbmQganVzdCB1c2UgdGhlIHVuZGVybHlpbmcgdHlwZSBkaXJlY3RseSwgdGhvdWdoIGluIEMrKworICogdGhlIHN5bWJvbGljIG5hbWluZyBjYW4gYmUgcXVpdGUgdXNlZnVsIGZvciBjb2RlIGNsYXJpdHkuCisgKgorICovCitjbGFzcyB0X3R5cGVkZWYgOiBwdWJsaWMgdF90eXBlIHsKK3B1YmxpYzoKKyAgdF90eXBlZGVmKHRfcHJvZ3JhbSogcHJvZ3JhbSwgdF90eXBlKiB0eXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgc3ltYm9saWMpCisgICAgOiB0X3R5cGUocHJvZ3JhbSwgc3ltYm9saWMpLCB0eXBlXyh0eXBlKSwgc3ltYm9saWNfKHN5bWJvbGljKSwgZm9yd2FyZF8oZmFsc2UpIHt9CisKKyAgLyoqCisgICAqIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCB0byByZWZlciB0byBhIHR5cGUgdGhhdCBpcyBsYXppbHkKKyAgICogcmVzb2x2ZWQgYXQgYSBsYXRlciB0aW1lLCBsaWtlIGZvciBmb3J3YXJkIGRlY2xhcmF0aW9ucyBvcgorICAgKiByZWN1cnNpdmUgdHlwZXMuCisgICAqLworICB0X3R5cGVkZWYodF9wcm9ncmFtKiBwcm9ncmFtLCBjb25zdCBzdGQ6OnN0cmluZyYgc3ltYm9saWMsIGJvb2wgZm9yd2FyZCkKKyAgICA6IHRfdHlwZShwcm9ncmFtLCBzeW1ib2xpYyksCisgICAgICB0eXBlXyhOVUxMKSwKKyAgICAgIHN5bWJvbGljXyhzeW1ib2xpYyksCisgICAgICBmb3J3YXJkXyhmb3J3YXJkKQorICB7fQorCisgIH50X3R5cGVkZWYoKSB7fQorCisgIHRfdHlwZSogZ2V0X3R5cGUoKSBjb25zdDsKKworICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0X3N5bWJvbGljKCkgY29uc3QgeyByZXR1cm4gc3ltYm9saWNfOyB9CisKKyAgYm9vbCBpc19mb3J3YXJkX3R5cGVkZWYoKSBjb25zdCB7IHJldHVybiBmb3J3YXJkXzsgfQorCisgIGJvb2wgaXNfdHlwZWRlZigpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKworcHJpdmF0ZToKKyAgdF90eXBlKiB0eXBlXzsKKyAgc3RkOjpzdHJpbmcgc3ltYm9saWNfOworICBib29sIGZvcndhcmRfOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbGF0Zm9ybS5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGxhdGZvcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDlhZGI5Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGxhdGZvcm0uaApAQCAtMCwwICsxLDUwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogZGVmaW5lIGZvciBta2RpcixzaW5jZSB0aGUgbWV0aG9kIHNpZ25hdHVyZQorICogaXMgZGlmZmVyZW50IGZvciB0aGUgbm9uLVBPU0lYIE1pbkdXCisgKi8KKworI2lmZGVmIF9NU0NfVkVSCisjaW5jbHVkZSAidGhyaWZ0L3dpbmRvd3MvY29uZmlnLmgiCisjZW5kaWYKKworI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgPGRpcmVjdC5oPgorI2luY2x1ZGUgPGlvLmg+CisjZWxzZQorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGNlcnJubz4KKworLy8gaWdub3JlIEVFWElTVCwgdGhyb3cgb24gYW55IG90aGVyIGVycm9yCisjaWZkZWYgX1dJTjMyCisjZGVmaW5lIE1LRElSKHgpIHsgaW50IHIgPSBfbWtkaXIoeCk7IGlmIChyID09IC0xICYmIGVycm5vICE9IEVFWElTVCkgeyB0aHJvdyAoc3RkOjpzdHJpbmcoeCkgKyAiOiAiKSArIHN0cmVycm9yKGVycm5vKTsgfSB9CisjZWxzZQorI2RlZmluZSBNS0RJUih4KSB7IGludCByID0gbWtkaXIoeCwgU19JUldYVSB8IFNfSVJXWEcgfCBTX0lSV1hPKTsgaWYgKHIgPT0gLTEgJiYgZXJybm8gIT0gRUVYSVNUKSB7IHRocm93IChzdGQ6OnN0cmluZyh4KSArICI6ICIpICsgc3RyZXJyb3IoZXJybm8pOyB9IH0KKyNlbmRpZgorCisjaWZkZWYgUEFUSF9NQVgKKyNkZWZpbmUgVEhSSUZUX1BBVEhfTUFYIFBBVEhfTUFYCisjZWxzZQorI2RlZmluZSBUSFJJRlRfUEFUSF9NQVggTUFYX1BBVEgKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL01ha2VmaWxlLmFtIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NGNkYmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw0NyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisjCisjIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisjIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisjIGRldGFpbHMuCisKK0FVVE9NQUtFX09QVElPTlMgPSBzdWJkaXItb2JqZWN0cworCitpZiBXSVRIX1BMVUdJTgorcGx1Z2luX2dlbiA9IHBsdWdpbl90eXBlcy5oIFwKKyAgICAgICAgICAgICBwbHVnaW5fdHlwZXMuY3BwIFwKKyAgICAgICAgICAgICBwbHVnaW5fY29uc3RhbnRzLmggXAorICAgICAgICAgICAgIHBsdWdpbl9jb25zdGFudHMuY3BwCisKK0JVSUxUX1NPVVJDRVMgPSAkKHBsdWdpbl9nZW4pCitnZW4uc3RhbXA6IHBsdWdpbi50aHJpZnQgJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3RocmlmdC1ib290c3RyYXAKKwlAJChSTSkgLWYgZ2VuLnRtcAorCUB0b3VjaCBnZW4udG1wCisJJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3RocmlmdC1ib290c3RyYXAgLWdlbiBjcHAgLW91dCAuICQ8CisJQG12IC1mIGdlbi50bXAgJEAKKworJChwbHVnaW5fZ2VuKTogZ2VuLnN0YW1wCisJQGlmIHRlc3QgLWYgJEA7IHRoZW4gOjsgZWxzZSBcCisJJChSTSkgLWYgZ2VuLnN0YW1wOyBcCisJJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZ2VuLnN0YW1wOyBcCisJZmkKKworY2xlYW4tbG9jYWw6CisJJChSTSkgdmVyc2lvbi5oIHdpbmRvd3MvdmVyc2lvbi5oICQocGx1Z2luX2dlbikKK2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3BsdWdpbi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzRjNDMyCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3BsdWdpbi5jYwpAQCAtMCwwICsxLDUxMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAidGhyaWZ0L3BsdWdpbi9wbHVnaW4uaCIKKworI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8aW8uaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgPGJvb3N0L3JhbmdlL2FkYXB0b3IvbWFwLmhwcD4KKyNpbmNsdWRlIDxib29zdC9yYW5nZS9hbGdvcml0aG0vZm9yX2VhY2guaHBwPgorCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BsdWdpbi90eXBlX3V0aWwuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmgiCisjaW5jbHVkZSAidGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oIgorI2luY2x1ZGUgInRocmlmdC90cmFuc3BvcnQvVEZEVHJhbnNwb3J0LmgiCisjaW5jbHVkZSAidGhyaWZ0L3BsdWdpbi9wbHVnaW5fdHlwZXMuaCIKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwbHVnaW4geworCit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRCaW5hcnlQcm90b2NvbDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRGRFRyYW5zcG9ydDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRGcmFtZWRUcmFuc3BvcnQ7CisKKyNkZWZpbmUgVEhSSUZUX0NPTlZFUlRfRk9SV0FSRChmcm9tX3R5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdHlwZW5hbWUgVG9UeXBlPGZyb21fdHlwZT46OnR5cGUqIGNvbnZlcnRfZm9yd2FyZDxmcm9tX3R5cGU+KGNvbnN0IGZyb21fdHlwZSYgZnJvbSkKKworI2RlZmluZSBUSFJJRlRfQ09OVkVSVF9DT01QTEVURV9ERUNMKGZyb21fdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2b2lkIGNvbnZlcnQoY29uc3QgZnJvbV90eXBlJiBmcm9tLCBUb1R5cGU8ZnJvbV90eXBlPjo6dHlwZSogdG8pCisKKyNkZWZpbmUgVEhSSUZUX0NPTlZFUlRfVU5BUllfREVDTChmcm9tX3R5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdHlwZW5hbWUgVG9UeXBlPGZyb21fdHlwZT46OnR5cGUqIGNvbnZlcnQ8ZnJvbV90eXBlPihjb25zdCBmcm9tX3R5cGUmIGZyb20pCisKKyNkZWZpbmUgVEhSSUZUX0NPTlZFUlNJT05fREVDTChmcm9tX3R5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVEhSSUZUX0NPTlZFUlRfRk9SV0FSRChmcm9tX3R5cGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVEhSSUZUX0NPTlZFUlRfQ09NUExFVEVfREVDTChmcm9tX3R5cGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVEhSSUZUX0NPTlZFUlRfVU5BUllfREVDTChmcm9tX3R5cGUpCisKKyNkZWZpbmUgVEhSSUZUX0NPTlZFUlRfQ09NUExFVEUoZnJvbV90eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVEhSSUZUX0NPTlZFUlNJT05fREVDTChmcm9tX3R5cGUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUb1R5cGU8ZnJvbV90eXBlPjo6dHlwZSogdG8gPSBjb252ZXJ0X2ZvcndhcmQoZnJvbSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb252ZXJ0KGZyb20sIHRvKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gdG87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVEhSSUZUX0NPTlZFUlRfQ09NUExFVEVfREVDTChmcm9tX3R5cGUpCisKKyNkZWZpbmUgVEhSSUZUX0NPTlZFUlNJT04oZnJvbV90eXBlLCAuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVEhSSUZUX0NPTlZFUlRfRk9SV0FSRChmcm9tX3R5cGUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAodm9pZClmcm9tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gbmV3IFRvVHlwZTxmcm9tX3R5cGU+Ojp0eXBlKF9fVkFfQVJHU19fKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVEhSSUZUX0NPTlZFUlRfQ09NUExFVEUoZnJvbV90eXBlKQorCisjZGVmaW5lIFRIUklGVF9BU1NJR05fRE9DKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGZyb20uX19pc3NldC5kb2MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB0by0+c2V0X2RvYyhmcm9tLmRvYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgVEhSSUZUX0FTU0lHTl9BTk5PVEFUSU9OUygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVEhSSUZUX0FTU0lHTl9ET0MoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZnJvbS5fX2lzc2V0LmFubm90YXRpb25zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHRvLT5hbm5vdGF0aW9uc18gPSBmcm9tLmFubm90YXRpb25zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBUSFJJRlRfQVNTSUdOX01FVEFEQVRBKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRvLT5zZXRfbmFtZShmcm9tLm1ldGFkYXRhLm5hbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChmcm9tLm1ldGFkYXRhLl9faXNzZXQuZG9jKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdG8tPnNldF9kb2MoZnJvbS5tZXRhZGF0YS5kb2MpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChmcm9tLm1ldGFkYXRhLl9faXNzZXQuYW5ub3RhdGlvbnMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdG8tPmFubm90YXRpb25zXyA9IGZyb20ubWV0YWRhdGEuYW5ub3RhdGlvbnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCis6OnRfcHJvZ3JhbSogZ19wcm9ncmFtID0gMDsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEMsIHR5cGVuYW1lIFM+CitzdHJ1Y3QgVHlwZUNhY2hlIHsKKyAgQyogb3BlcmF0b3JbXShjb25zdCBpbnQ2NF90JiBrKSB7CisgICAgdHlwZW5hbWUgc3RkOjptYXA8aW50NjRfdCwgQyo+OjppdGVyYXRvciBpdCA9IGNhY2hlLmZpbmQoayk7CisgICAgaWYgKGl0ICE9IGNhY2hlLmVuZCgpKSB7CisgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICB9IGVsc2UgeworICAgICAgdHlwZW5hbWUgc3RkOjptYXA8aW50NjRfdCwgUz46OmNvbnN0X2l0ZXJhdG9yIGNpdCA9IHNvdXJjZS0+ZmluZChrKTsKKyAgICAgIGlmIChjaXQgPT0gc291cmNlLT5lbmQoKSkgeworICAgICAgICB0aHJvdyBUaHJpZnRQbHVnaW5FcnJvcigiVHlwZSBub3QgZm91bmQiKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiAoY2FjaGUpW2tdID0gY29udmVydF9mb3J3YXJkKGNpdC0+c2Vjb25kKTsKKyAgICB9CisgIH0KKworICB2b2lkIGNvbXBpbGVBbGwoKSB7CisgICAgYm9vc3Q6OmZvcl9lYWNoKCpzb3VyY2UgfCBib29zdDo6YWRhcHRvcnM6Om1hcF9rZXlzLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OmJpbmQoJlR5cGVDYWNoZTo6Y29tcGlsZSwgdGhpcywgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xKSk7CisgIH0KKworICBzdGQ6Om1hcDxpbnQ2NF90LCBTPiBjb25zdCogc291cmNlOworCisgIHZvaWQgY2xlYXIoKSB7CisgICAgc291cmNlID0gbnVsbHB0ciA7CisgICAgY2FjaGUuY2xlYXIoKSA7CisgIH0KKworcHJvdGVjdGVkOgorICBzdGQ6Om1hcDxpbnQ2NF90LCBDKj4gY2FjaGU7CisKK3ByaXZhdGU6CisgIHZvaWQgY29tcGlsZShjb25zdCBpbnQ2NF90JiBrKSB7CisgICAgdHlwZW5hbWUgc3RkOjptYXA8aW50NjRfdCwgUz46OmNvbnN0X2l0ZXJhdG9yIGNpdCA9IHNvdXJjZS0+ZmluZChrKTsKKyAgICBpZiAoY2l0ID09IHNvdXJjZS0+ZW5kKCkpIHsKKyAgICAgIHRocm93IFRocmlmdFBsdWdpbkVycm9yKCJUeXBlIG5vdCBmb3VuZCAiKTsKKyAgICB9CisgICAgY29udmVydChjaXQtPnNlY29uZCwgKCp0aGlzKVtrXSk7CisgIH0KK307CitzdGQ6Om1hcDxpbnQ2NF90LCA6OnRfcHJvZ3JhbSo+IGdfcHJvZ3JhbV9jYWNoZTsKK1R5cGVDYWNoZTwgOjp0X3R5cGUsIHRfdHlwZT4gZ190eXBlX2NhY2hlOworVHlwZUNhY2hlPCA6OnRfY29uc3QsIHRfY29uc3Q+IGdfY29uc3RfY2FjaGU7CitUeXBlQ2FjaGU8IDo6dF9zZXJ2aWNlLCB0X3NlcnZpY2U+IGdfc2VydmljZV9jYWNoZTsKKwordm9pZCBjbGVhcl9nbG9iYWxfY2FjaGUoKSB7CisgIGdfdHlwZV9jYWNoZS5jbGVhcigpOworICBnX2NvbnN0X2NhY2hlLmNsZWFyKCk7CisgIGdfc2VydmljZV9jYWNoZS5jbGVhcigpOworfQorCit2b2lkIHNldF9nbG9iYWxfY2FjaGUoY29uc3QgVHlwZVJlZ2lzdHJ5JiBmcm9tKSB7CisgIGdfdHlwZV9jYWNoZS5zb3VyY2UgPSAmZnJvbS50eXBlczsKKyAgZ19jb25zdF9jYWNoZS5zb3VyY2UgPSAmZnJvbS5jb25zdGFudHM7CisgIGdfc2VydmljZV9jYWNoZS5zb3VyY2UgPSAmZnJvbS5zZXJ2aWNlczsKKworICBnX3R5cGVfY2FjaGUuY29tcGlsZUFsbCgpOworICBnX2NvbnN0X2NhY2hlLmNvbXBpbGVBbGwoKTsKKyAgZ19zZXJ2aWNlX2NhY2hlLmNvbXBpbGVBbGwoKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitUKiByZXNvbHZlX3R5cGUoaW50NjRfdCBuYW1lKSB7CisgIHJldHVybiByZWludGVycHJldF9jYXN0PFQqPihnX3R5cGVfY2FjaGVbbmFtZV0pOworfQorCis6OnRfY29uc3QqIHJlc29sdmVfY29uc3QoaW50NjRfdCBuYW1lKSB7CisgIHJldHVybiBnX2NvbnN0X2NhY2hlW25hbWVdOworfQorCis6OnRfc2VydmljZSogcmVzb2x2ZV9zZXJ2aWNlKGludDY0X3QgbmFtZSkgeworICByZXR1cm4gZ19zZXJ2aWNlX2NhY2hlW25hbWVdOworfQorCitUSFJJRlRfQ09OVkVSVF9GT1JXQVJEKHRfYmFzZV90eXBlKSB7CisjZGVmaW5lIFRfQkFTRVRZUEVfQ0FTRSh0eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNhc2UgdF9iYXNlOjpUWVBFXyMjdHlwZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdCA9IDo6dF9iYXNlX3R5cGU6OlRZUEVfIyN0eXBlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYnJlYWsKKworICA6OnRfYmFzZV90eXBlOjp0X2Jhc2UgdCA9IDo6dF9iYXNlX3R5cGU6OlRZUEVfVk9JRDsKKyAgYm9vbCBpc19iaW5hcnkgPSBmYWxzZTsKKyAgc3dpdGNoIChmcm9tLnZhbHVlKSB7CisgICAgVF9CQVNFVFlQRV9DQVNFKFZPSUQpOworICAgIFRfQkFTRVRZUEVfQ0FTRShTVFJJTkcpOworICAgIFRfQkFTRVRZUEVfQ0FTRShCT09MKTsKKyAgICBUX0JBU0VUWVBFX0NBU0UoSTgpOworICAgIFRfQkFTRVRZUEVfQ0FTRShJMTYpOworICAgIFRfQkFTRVRZUEVfQ0FTRShJMzIpOworICAgIFRfQkFTRVRZUEVfQ0FTRShJNjQpOworICAgIFRfQkFTRVRZUEVfQ0FTRShET1VCTEUpOworICBjYXNlIHRfYmFzZTo6VFlQRV9CSU5BUlk6CisgICAgdCA9IDo6dF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOworICAgIGlzX2JpbmFyeSA9IHRydWU7CisgICAgYnJlYWs7CisgIH0KKyAgOjp0X2Jhc2VfdHlwZSogdG8gPSBuZXcgOjp0X2Jhc2VfdHlwZShmcm9tLm1ldGFkYXRhLm5hbWUsIHQpOworICB0by0+c2V0X2JpbmFyeShpc19iaW5hcnkpOworICByZXR1cm4gdG87CisjdW5kZWYgVF9CQVNFVFlQRV9DQVNFCit9CitUSFJJRlRfQ09OVkVSVF9DT01QTEVURSh0X2Jhc2VfdHlwZSkgeworICBUSFJJRlRfQVNTSUdOX01FVEFEQVRBKCk7Cit9CisKK1RIUklGVF9DT05WRVJUX0ZPUldBUkQodF90eXBlZGVmKSB7CisgIDo6dF90eXBlZGVmKiB0bzsKKyAgaWYgKGZyb20uZm9yd2FyZCkgeworICAgIHRvID0gbmV3IDo6dF90eXBlZGVmKGdfcHJvZ3JhbV9jYWNoZVtmcm9tLm1ldGFkYXRhLnByb2dyYW1faWRdLCBmcm9tLnN5bWJvbGljLCB0cnVlKTsKKyAgfSBlbHNlIHsKKyAgICB0byA9IG5ldyA6OnRfdHlwZWRlZihnX3Byb2dyYW1fY2FjaGVbZnJvbS5tZXRhZGF0YS5wcm9ncmFtX2lkXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlX3R5cGU8IDo6dF90eXBlPihmcm9tLnR5cGUpLCBmcm9tLnN5bWJvbGljKTsKKyAgfQorICByZXR1cm4gdG87Cit9CitUSFJJRlRfQ09OVkVSVF9DT01QTEVURSh0X3R5cGVkZWYpIHsKKyAgVEhSSUZUX0FTU0lHTl9NRVRBREFUQSgpOworfQorVEhSSUZUX0NPTlZFUlNJT04odF9lbnVtX3ZhbHVlLCBmcm9tLm5hbWUsIGZyb20udmFsdWUpIHsKKyAgYXNzZXJ0KHRvKTsKKyAgVEhSSUZUX0FTU0lHTl9BTk5PVEFUSU9OUygpOworfQorVEhSSUZUX0NPTlZFUlNJT04odF9lbnVtLCBnX3Byb2dyYW1fY2FjaGVbZnJvbS5tZXRhZGF0YS5wcm9ncmFtX2lkXSkgeworICBhc3NlcnQodG8pOworICBUSFJJRlRfQVNTSUdOX01FVEFEQVRBKCk7CisgIGJvb3N0Ojpmb3JfZWFjaChmcm9tLmNvbnN0YW50cyB8IGJvb3N0OjphZGFwdG9yczo6dHJhbnNmb3JtZWQoY29udmVydDx0X2VudW1fdmFsdWU+KSwKKyAgICAgICAgICAgICAgICAgIHN0ZDo6YmluZCgmOjp0X2VudW06OmFwcGVuZCwgdG8sIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSkpOworfQorVEhSSUZUX0NPTlZFUlNJT04odF9saXN0LCByZXNvbHZlX3R5cGU8IDo6dF90eXBlPihmcm9tLmVsZW1fdHlwZSkpIHsKKyAgYXNzZXJ0KHRvKTsKKyAgVEhSSUZUX0FTU0lHTl9NRVRBREFUQSgpOworICBpZiAoZnJvbS5fX2lzc2V0LmNwcF9uYW1lKQorICAgIHRvLT5zZXRfY3BwX25hbWUoZnJvbS5jcHBfbmFtZSk7Cit9CitUSFJJRlRfQ09OVkVSU0lPTih0X3NldCwgcmVzb2x2ZV90eXBlPCA6OnRfdHlwZT4oZnJvbS5lbGVtX3R5cGUpKSB7CisgIGFzc2VydCh0byk7CisgIFRIUklGVF9BU1NJR05fTUVUQURBVEEoKTsKKyAgaWYgKGZyb20uX19pc3NldC5jcHBfbmFtZSkKKyAgICB0by0+c2V0X2NwcF9uYW1lKGZyb20uY3BwX25hbWUpOworfQorVEhSSUZUX0NPTlZFUlNJT04odF9tYXAsCisgICAgICAgICAgICAgICAgICByZXNvbHZlX3R5cGU8IDo6dF90eXBlPihmcm9tLmtleV90eXBlKSwKKyAgICAgICAgICAgICAgICAgIHJlc29sdmVfdHlwZTwgOjp0X3R5cGU+KGZyb20udmFsX3R5cGUpKSB7CisgIGFzc2VydCh0byk7CisgIFRIUklGVF9BU1NJR05fTUVUQURBVEEoKTsKKyAgaWYgKGZyb20uX19pc3NldC5jcHBfbmFtZSkKKyAgICB0by0+c2V0X2NwcF9uYW1lKGZyb20uY3BwX25hbWUpOworfQorVEhSSUZUX0NPTlZFUlNJT04odF9jb25zdF92YWx1ZSwgKSB7CisjZGVmaW5lIFRfQ09OU1RfVkFMVUVfQ0FTRSh0eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChmcm9tLl9faXNzZXQudHlwZSMjX3ZhbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRvLT5zZXRfIyN0eXBlKGZyb20udHlwZSMjX3ZhbCkKKworICBhc3NlcnQodG8pOworICBpZiAoZnJvbS5fX2lzc2V0Lm1hcF92YWwpIHsKKyAgICB0by0+c2V0X21hcCgpOworICAgIGZvciAoc3RkOjptYXA8dF9jb25zdF92YWx1ZSwgdF9jb25zdF92YWx1ZT46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gZnJvbS5tYXBfdmFsLmJlZ2luKCk7CisgICAgICAgICBpdCAhPSBmcm9tLm1hcF92YWwuZW5kKCk7IGl0KyspIHsKKyAgICAgIHRvLT5hZGRfbWFwKGNvbnZlcnQoaXQtPmZpcnN0KSwgY29udmVydChpdC0+c2Vjb25kKSk7CisgICAgfQorICB9IGVsc2UgaWYgKGZyb20uX19pc3NldC5saXN0X3ZhbCkgeworICAgIHRvLT5zZXRfbGlzdCgpOworICAgIGJvb3N0Ojpmb3JfZWFjaChmcm9tLmxpc3RfdmFsIHwgYm9vc3Q6OmFkYXB0b3JzOjp0cmFuc2Zvcm1lZCgmY29udmVydDx0X2NvbnN0X3ZhbHVlPiksCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6YmluZCgmOjp0X2NvbnN0X3ZhbHVlOjphZGRfbGlzdCwgdG8sIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSkpOworICB9IGVsc2UKKyAgICBUX0NPTlNUX1ZBTFVFX0NBU0Uoc3RyaW5nKTsKKyAgZWxzZSBUX0NPTlNUX1ZBTFVFX0NBU0UoaW50ZWdlcik7CisgIGVsc2UgVF9DT05TVF9WQUxVRV9DQVNFKGRvdWJsZSk7CisgIGVsc2UgaWYgKGZyb20uX19pc3NldC5jb25zdF9pZGVudGlmaWVyX3ZhbCkgeworICAgIHRvLT5zZXRfaWRlbnRpZmllcihmcm9tLmNvbnN0X2lkZW50aWZpZXJfdmFsLmlkZW50aWZpZXJfdmFsKSA7CisgICAgdG8tPnNldF9lbnVtKHJlc29sdmVfdHlwZTwgOjp0X2VudW0+KGZyb20uY29uc3RfaWRlbnRpZmllcl92YWwuZW51bV92YWwpKSA7CisgIH0KKworI3VuZGVmIFRfQ09OU1RfVkFMVUVfQ0FTRQorfQorVEhSSUZUX0NPTlZFUlNJT04odF9maWVsZCwgcmVzb2x2ZV90eXBlPCA6OnRfdHlwZT4oZnJvbS50eXBlKSwgZnJvbS5uYW1lLCBmcm9tLmtleSkgeworICBhc3NlcnQodG8pOworICBUSFJJRlRfQVNTSUdOX0FOTk9UQVRJT05TKCk7CisgIHRvLT5zZXRfcmVmZXJlbmNlKGZyb20ucmVmZXJlbmNlKTsKKyAgdG8tPnNldF9yZXEoc3RhdGljX2Nhc3Q8IDo6dF9maWVsZDo6ZV9yZXE+KGZyb20ucmVxKSk7CisgIGlmIChmcm9tLl9faXNzZXQudmFsdWUpIHsKKyAgICB0by0+c2V0X3ZhbHVlKGNvbnZlcnQoZnJvbS52YWx1ZSkpOworICB9Cit9CitUSFJJRlRfQ09OVkVSU0lPTih0X3N0cnVjdCwgZ19wcm9ncmFtX2NhY2hlW2Zyb20ubWV0YWRhdGEucHJvZ3JhbV9pZF0pIHsKKyAgYXNzZXJ0KHRvKTsKKyAgVEhSSUZUX0FTU0lHTl9NRVRBREFUQSgpOworICB0by0+c2V0X3VuaW9uKGZyb20uaXNfdW5pb24pOworICB0by0+c2V0X3hjZXB0aW9uKGZyb20uaXNfeGNlcHRpb24pOworICBib29zdDo6Zm9yX2VhY2goZnJvbS5tZW1iZXJzIHwgYm9vc3Q6OmFkYXB0b3JzOjp0cmFuc2Zvcm1lZChjb252ZXJ0PHRfZmllbGQ+KSwKKyAgICAgICAgICAgICAgICAgIHN0ZDo6YmluZCgmOjp0X3N0cnVjdDo6YXBwZW5kLCB0bywgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xKSk7Cit9CitUSFJJRlRfQ09OVkVSU0lPTih0X2NvbnN0LAorICAgICAgICAgICAgICAgICAgcmVzb2x2ZV90eXBlPCA6OnRfdHlwZT4oZnJvbS50eXBlKSwKKyAgICAgICAgICAgICAgICAgIGZyb20ubmFtZSwKKyAgICAgICAgICAgICAgICAgIGNvbnZlcnQ8dF9jb25zdF92YWx1ZT4oZnJvbS52YWx1ZSkpIHsKKyAgYXNzZXJ0KHRvKTsKKyAgVEhSSUZUX0FTU0lHTl9ET0MoKTsKK30KKworVEhSSUZUX0NPTlZFUlNJT04odF9mdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgIHJlc29sdmVfdHlwZTwgOjp0X3R5cGU+KGZyb20ucmV0dXJudHlwZSksCisgICAgICAgICAgICAgICAgICBmcm9tLm5hbWUsCisgICAgICAgICAgICAgICAgICByZXNvbHZlX3R5cGU8IDo6dF9zdHJ1Y3Q+KGZyb20uYXJnbGlzdCksCisgICAgICAgICAgICAgICAgICByZXNvbHZlX3R5cGU8IDo6dF9zdHJ1Y3Q+KGZyb20ueGNlcHRpb25zKSwKKyAgICAgICAgICAgICAgICAgIGZyb20uaXNfb25ld2F5KSB7CisgIGFzc2VydCh0byk7CisgIFRIUklGVF9BU1NJR05fRE9DKCk7Cit9CisKK1RIUklGVF9DT05WRVJTSU9OKHRfc2VydmljZSwgZ19wcm9ncmFtX2NhY2hlW2Zyb20ubWV0YWRhdGEucHJvZ3JhbV9pZF0pIHsKKyAgYXNzZXJ0KHRvKTsKKyAgYXNzZXJ0KGZyb20ubWV0YWRhdGEucHJvZ3JhbV9pZCk7CisgIGFzc2VydChnX3Byb2dyYW1fY2FjaGVbZnJvbS5tZXRhZGF0YS5wcm9ncmFtX2lkXSk7CisgIFRIUklGVF9BU1NJR05fTUVUQURBVEEoKTsKKworICBib29zdDo6Zm9yX2VhY2goZnJvbS5mdW5jdGlvbnMgfCBib29zdDo6YWRhcHRvcnM6OnRyYW5zZm9ybWVkKGNvbnZlcnQ8dF9mdW5jdGlvbj4pLAorICAgICAgICAgICAgICAgICAgc3RkOjpiaW5kKCY6OnRfc2VydmljZTo6YWRkX2Z1bmN0aW9uLCB0bywgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xKSk7CisKKyAgaWYgKGZyb20uX19pc3NldC5leHRlbmRzXykKKyAgICB0by0+c2V0X2V4dGVuZHMocmVzb2x2ZV9zZXJ2aWNlKGZyb20uZXh0ZW5kc18pKTsKK30KKworVEhSSUZUX0NPTlZFUlRfRk9SV0FSRCh0X3R5cGUpIHsKKyNkZWZpbmUgVF9UWVBFX0NBU0VfRldfVChjYXNlLCB0eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKGZyb20uX19pc3NldC5jYXNlIyNfdmFsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcmV0dXJuIGNvbnZlcnRfZm9yd2FyZDx0eXBlPihmcm9tLmNhc2UjI192YWwpCisjZGVmaW5lIFRfVFlQRV9DQVNFX0ZXKGNhc2UpIFRfVFlQRV9DQVNFX0ZXX1QoY2FzZSwgdF8jI2Nhc2UpCisKKyAgVF9UWVBFX0NBU0VfRlcoYmFzZV90eXBlKTsKKyAgVF9UWVBFX0NBU0VfRlcodHlwZWRlZik7CisgIFRfVFlQRV9DQVNFX0ZXKGVudW0pOworICBUX1RZUEVfQ0FTRV9GVyhzdHJ1Y3QpOworICBUX1RZUEVfQ0FTRV9GV19UKHhjZXB0aW9uLCB0X3N0cnVjdCk7CisgIFRfVFlQRV9DQVNFX0ZXKGxpc3QpOworICBUX1RZUEVfQ0FTRV9GVyhzZXQpOworICBUX1RZUEVfQ0FTRV9GVyhtYXApOworICBUX1RZUEVfQ0FTRV9GVyhzZXJ2aWNlKTsKKyAgdGhyb3cgVGhyaWZ0UGx1Z2luRXJyb3IoIkludmFsaWQgZGF0YTogVHlwZSB1bmlvbiBoYXMgbm8gdmFsdWUuIik7CisjdW5kZWYgVF9UWVBFX0NBU0VfRldfVAorI3VuZGVmIFRfVFlQRV9DQVNFX0ZXCit9CitUSFJJRlRfQ09OVkVSVF9DT01QTEVURSh0X3R5cGUpIHsKKyNkZWZpbmUgVF9UWVBFX0NBU0VfVChjYXNlLCB0eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZWxzZSBpZiAoZnJvbS5fX2lzc2V0LmNhc2UjI192YWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvbnZlcnQ8dHlwZSwgOjp0eXBlPihmcm9tLmNhc2UjI192YWwsIHJlaW50ZXJwcmV0X2Nhc3Q8IDo6dHlwZSo+KHRvKSkKKyNkZWZpbmUgVF9UWVBFX0NBU0UoY2FzZSkgVF9UWVBFX0NBU0VfVChjYXNlLCB0XyMjY2FzZSkKKworICBpZiAoZmFsc2UpIHsKKyAgfQorICBUX1RZUEVfQ0FTRShiYXNlX3R5cGUpOworICBUX1RZUEVfQ0FTRSh0eXBlZGVmKTsKKyAgVF9UWVBFX0NBU0UoZW51bSk7CisgIFRfVFlQRV9DQVNFKHN0cnVjdCk7CisgIFRfVFlQRV9DQVNFX1QoeGNlcHRpb24sIHRfc3RydWN0KTsKKyAgVF9UWVBFX0NBU0UobGlzdCk7CisgIFRfVFlQRV9DQVNFKHNldCk7CisgIFRfVFlQRV9DQVNFKG1hcCk7CisgIFRfVFlQRV9DQVNFKHNlcnZpY2UpOworICBlbHNlIHsKKyAgICB0aHJvdyBUaHJpZnRQbHVnaW5FcnJvcigiSW52YWxpZCBkYXRhOiBUeXBlIHVuaW9uIGhhcyBubyB2YWx1ZS4iKTsKKyAgfQorI3VuZGVmIFRfVFlQRV9DQVNFX1QKKyN1bmRlZiBUX1RZUEVfQ0FTRQorfQorCitUSFJJRlRfQ09OVkVSU0lPTih0X3Njb3BlLCApIHsKKyAgYXNzZXJ0KHRvKTsKKyNkZWZpbmUgVF9TQ09QRV9SRVNPTFZFKHR5cGUsIG5hbWUsIGEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZm9yIChzdGQ6OnZlY3RvcjxpbnQ2NF90Pjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBmcm9tLm5hbWUjI3MuYmVnaW4oKTsgaXQgIT0gZnJvbS5uYW1lIyNzLmVuZCgpOyAgIFwKKyAgICAgICBpdCsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICA6OnRfIyN0eXBlKiB0ID0gcmVzb2x2ZV8jI3R5cGUgYSgqaXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0by0+YWRkXyMjbmFtZSh0LT5nZXRfbmFtZSgpLCB0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorICBUX1NDT1BFX1JFU09MVkUodHlwZSwgdHlwZSwgPCA6OnRfdHlwZT4pOworICBUX1NDT1BFX1JFU09MVkUoY29uc3QsIGNvbnN0YW50LCApOworICBUX1NDT1BFX1JFU09MVkUoc2VydmljZSwgc2VydmljZSwgKTsKKyN1bmRlZiBUX1NDT1BFX1JFU09MVkUKK30KKworVEhSSUZUX0NPTlZFUlRfRk9SV0FSRCh0X3Byb2dyYW0pIHsKKyAgOjp0X3Byb2dyYW0qIHRvID0gbmV3IDo6dF9wcm9ncmFtKGZyb20ucGF0aCwgZnJvbS5uYW1lKTsKKyAgZm9yIChzdGQ6OnZlY3Rvcjx0X3Byb2dyYW0+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGZyb20uaW5jbHVkZXMuYmVnaW4oKTsgaXQgIT0gZnJvbS5pbmNsdWRlcy5lbmQoKTsKKyAgICAgICBpdCsrKSB7CisgICAgdG8tPmFkZF9pbmNsdWRlKGNvbnZlcnRfZm9yd2FyZCgqaXQpKTsKKyAgfQorICBnX3Byb2dyYW1fY2FjaGVbZnJvbS5wcm9ncmFtX2lkXSA9IHRvOworICByZXR1cm4gdG87Cit9CitUSFJJRlRfQ09OVkVSVF9DT01QTEVURSh0X3Byb2dyYW0pIHsKKyAgYXNzZXJ0KHRvKTsKKyAgZ19wcm9ncmFtID0gdG87CisgIGNvbnZlcnQ8dF9zY29wZSwgOjp0X3Njb3BlPihmcm9tLnNjb3BlLCB0by0+c2NvcGUoKSk7CisgIFRIUklGVF9BU1NJR05fRE9DKCk7CisKKyAgdG8tPnNldF9vdXRfcGF0aChmcm9tLm91dF9wYXRoLCBmcm9tLm91dF9wYXRoX2lzX2Fic29sdXRlKTsKKworICBib29zdDo6Zm9yX2VhY2goZnJvbS50eXBlZGVmcyB8IGJvb3N0OjphZGFwdG9yczo6dHJhbnNmb3JtZWQoJnJlc29sdmVfdHlwZTwgOjp0X3R5cGVkZWY+KSwKKyAgICAgICAgICAgICAgICAgIHN0ZDo6YmluZCgmOjp0X3Byb2dyYW06OmFkZF90eXBlZGVmLCB0bywgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xKSk7CisgIGJvb3N0Ojpmb3JfZWFjaChmcm9tLmVudW1zIHwgYm9vc3Q6OmFkYXB0b3JzOjp0cmFuc2Zvcm1lZCgmcmVzb2x2ZV90eXBlPCA6OnRfZW51bT4pLAorICAgICAgICAgICAgICAgICAgc3RkOjpiaW5kKCY6OnRfcHJvZ3JhbTo6YWRkX2VudW0sIHRvLCBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpKTsKKyAgZm9yIChzdGQ6OnZlY3RvcjxpbnQ2NF90Pjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBmcm9tLm9iamVjdHMuYmVnaW4oKTsgaXQgIT0gZnJvbS5vYmplY3RzLmVuZCgpOworICAgICAgIGl0KyspIHsKKyAgICA6OnRfc3RydWN0KiB0MiA9IHJlc29sdmVfdHlwZTwgOjp0X3N0cnVjdD4oKml0KTsKKyAgICBpZiAodDItPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgIHRvLT5hZGRfeGNlcHRpb24odDIpOworICAgIH0gZWxzZSB7CisgICAgICB0by0+YWRkX3N0cnVjdCh0Mik7CisgICAgfQorICB9CisgIGJvb3N0Ojpmb3JfZWFjaChmcm9tLmNvbnN0cyB8IGJvb3N0OjphZGFwdG9yczo6dHJhbnNmb3JtZWQoJnJlc29sdmVfY29uc3QpLAorICAgICAgICAgICAgICAgICAgc3RkOjpiaW5kKCY6OnRfcHJvZ3JhbTo6YWRkX2NvbnN0LCB0bywgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xKSk7CisgIGJvb3N0Ojpmb3JfZWFjaChmcm9tLnNlcnZpY2VzIHwgYm9vc3Q6OmFkYXB0b3JzOjp0cmFuc2Zvcm1lZCgmcmVzb2x2ZV9zZXJ2aWNlKSwKKyAgICAgICAgICAgICAgICAgIHN0ZDo6YmluZCgmOjp0X3Byb2dyYW06OmFkZF9zZXJ2aWNlLCB0bywgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xKSk7CisKKyAgZm9yIChzdGQ6OnZlY3Rvcjx0X3Byb2dyYW0+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGZyb20uaW5jbHVkZXMuYmVnaW4oKTsgaXQgIT0gZnJvbS5pbmNsdWRlcy5lbmQoKTsKKyAgICAgICBpdCsrKSB7CisgICAgY29udmVydCgqaXQsIGdfcHJvZ3JhbV9jYWNoZVtpdC0+cHJvZ3JhbV9pZF0pOworICB9CisgIHN0ZDo6Zm9yX2VhY2goZnJvbS5jX2luY2x1ZGVzLmJlZ2luKCksIGZyb20uY19pbmNsdWRlcy5lbmQoKSwKKyAgICAgICAgICAgICAgICBzdGQ6OmJpbmQoJjo6dF9wcm9ncmFtOjphZGRfY19pbmNsdWRlLCB0bywgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xKSk7CisgIHN0ZDo6Zm9yX2VhY2goZnJvbS5jcHBfaW5jbHVkZXMuYmVnaW4oKSwgZnJvbS5jcHBfaW5jbHVkZXMuZW5kKCksCisgICAgICAgICAgICAgICAgc3RkOjpiaW5kKCY6OnRfcHJvZ3JhbTo6YWRkX2NwcF9pbmNsdWRlLCB0bywgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xKSk7CisgIGZvciAoc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBmcm9tLm5hbWVzcGFjZXMuYmVnaW4oKTsKKyAgICAgICBpdCAhPSBmcm9tLm5hbWVzcGFjZXMuZW5kKCk7IGl0KyspIHsKKyAgICB0by0+c2V0X25hbWVzcGFjZShpdC0+Zmlyc3QsIGl0LT5zZWNvbmQpOworICB9CisKKyAgdG8tPnNldF9pbmNsdWRlX3ByZWZpeChmcm9tLmluY2x1ZGVfcHJlZml4KTsKKyAgdG8tPnNldF9uYW1lc3BhY2UoZnJvbS5uYW1lc3BhY2VfKTsKK30KKworaW50IEdlbmVyYXRvclBsdWdpbjo6ZXhlYyhpbnQsIGNoYXIqIFtdKSB7CisjaWZkZWYgX1dJTjMyCisgIF9zZXRtb2RlKGZpbGVubyhzdGRpbiksIF9PX0JJTkFSWSk7CisjZW5kaWYKKyAgc3RkOjpzaGFyZWRfcHRyPFRGcmFtZWRUcmFuc3BvcnQ+IHRyYW5zcG9ydCgKKyAgICAgIG5ldyBURnJhbWVkVHJhbnNwb3J0KHN0ZDo6bWFrZV9zaGFyZWQ8VEZEVHJhbnNwb3J0PihmaWxlbm8oc3RkaW4pKSkpOworICBUQmluYXJ5UHJvdG9jb2wgcHJvdG8odHJhbnNwb3J0KTsKKyAgR2VuZXJhdG9ySW5wdXQgaW5wdXQ7CisgIHRyeSB7CisgICAgaW5wdXQucmVhZCgmcHJvdG8pOworICB9IGNhdGNoIChzdGQ6OmV4Y2VwdGlvbiYgZXJyKSB7CisgICAgc3RkOjpjZXJyIDw8ICJFcnJvciB3aGlsZSByZWNlaXZpbmcgcGx1Z2luIGRhdGE6ICIgPDwgZXJyLndoYXQoKSA8PCBzdGQ6OmVuZGw7CisgICAgcmV0dXJuIC0xOworICB9CisgIGluaXRHbG9iYWxzKCk7CisgIDo6dF9wcm9ncmFtKiBwID0gZ19wcm9ncmFtID0gY29udmVydF9mb3J3YXJkKGlucHV0LnByb2dyYW0pOworICBzZXRfZ2xvYmFsX2NhY2hlKGlucHV0LnR5cGVfcmVnaXN0cnkpOworICBjb252ZXJ0KGlucHV0LnByb2dyYW0sIHApOworCisgIGludCByZXQgPSBnZW5lcmF0ZShwLCBpbnB1dC5wYXJzZWRfb3B0aW9ucyk7CisgIGNsZWFyR2xvYmFscygpOworCisgIHJldHVybiByZXQ7Cit9CisKKzo6dF9jb25zdF92YWx1ZTo6dF9jb25zdF92YWx1ZV90eXBlIGNvbnN0X3ZhbHVlX2Nhc2UoY29uc3QgdF9jb25zdF92YWx1ZSYgdikgeworICBpZiAodi5fX2lzc2V0Lm1hcF92YWwpCisgICAgcmV0dXJuIDo6dF9jb25zdF92YWx1ZTo6Q1ZfTUFQOworICBpZiAodi5fX2lzc2V0Lmxpc3RfdmFsKQorICAgIHJldHVybiA6OnRfY29uc3RfdmFsdWU6OkNWX0xJU1Q7CisgIGlmICh2Ll9faXNzZXQuc3RyaW5nX3ZhbCkKKyAgICByZXR1cm4gOjp0X2NvbnN0X3ZhbHVlOjpDVl9TVFJJTkc7CisgIGlmICh2Ll9faXNzZXQuaW50ZWdlcl92YWwpCisgICAgcmV0dXJuIDo6dF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUjsKKyAgaWYgKHYuX19pc3NldC5kb3VibGVfdmFsKQorICAgIHJldHVybiA6OnRfY29uc3RfdmFsdWU6OkNWX0RPVUJMRTsKKyAgaWYgKHYuX19pc3NldC5jb25zdF9pZGVudGlmaWVyX3ZhbCkKKyAgICByZXR1cm4gOjp0X2NvbnN0X3ZhbHVlOjpDVl9JREVOVElGSUVSOworICB0aHJvdyBUaHJpZnRQbHVnaW5FcnJvcigiVW5rbm93biBjb25zdCB2YWx1ZSB0eXBlIik7Cit9CisKK2Jvb2wgdF9jb25zdF92YWx1ZTo6b3BlcmF0b3I8KGNvbnN0IHRfY29uc3RfdmFsdWUmIHRoYXQpIGNvbnN0IHsKKyAgOjp0X2NvbnN0X3ZhbHVlOjp0X2NvbnN0X3ZhbHVlX3R5cGUgdDEgPSBjb25zdF92YWx1ZV9jYXNlKCp0aGlzKTsKKyAgOjp0X2NvbnN0X3ZhbHVlOjp0X2NvbnN0X3ZhbHVlX3R5cGUgdDIgPSBjb25zdF92YWx1ZV9jYXNlKHRoYXQpOworICBpZiAodDEgIT0gdDIpCisgICAgcmV0dXJuIHQxIDwgdDI7CisgIHN3aXRjaCAodDEpIHsKKyAgY2FzZSA6OnRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVI6CisgICAgcmV0dXJuIGludGVnZXJfdmFsIDwgdGhhdC5pbnRlZ2VyX3ZhbDsKKyAgY2FzZSA6OnRfY29uc3RfdmFsdWU6OkNWX0RPVUJMRToKKyAgICByZXR1cm4gZG91YmxlX3ZhbCA8IHRoYXQuZG91YmxlX3ZhbDsKKyAgY2FzZSA6OnRfY29uc3RfdmFsdWU6OkNWX1NUUklORzoKKyAgICByZXR1cm4gc3RyaW5nX3ZhbCA8IHRoYXQuc3RyaW5nX3ZhbDsKKyAgY2FzZSA6OnRfY29uc3RfdmFsdWU6OkNWX01BUDoKKyAgICBpZiAodGhhdC5tYXBfdmFsLmVtcHR5KCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgZWxzZSBpZiAobWFwX3ZhbC5lbXB0eSgpKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgZWxzZQorICAgICAgcmV0dXJuIG1hcF92YWwuYmVnaW4oKS0+Zmlyc3QgPCB0aGF0Lm1hcF92YWwuYmVnaW4oKS0+Zmlyc3Q7CisgIGNhc2UgOjp0X2NvbnN0X3ZhbHVlOjpDVl9MSVNUOgorICAgIGlmICh0aGF0Lmxpc3RfdmFsLmVtcHR5KCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgZWxzZSBpZiAobGlzdF92YWwuZW1wdHkoKSkKKyAgICAgIHJldHVybiB0cnVlOworICAgIGVsc2UKKyAgICAgIHJldHVybiBsaXN0X3ZhbC5mcm9udCgpIDwgdGhhdC5saXN0X3ZhbC5mcm9udCgpOworICBjYXNlIDo6dF9jb25zdF92YWx1ZTo6Q1ZfSURFTlRJRklFUjoKKyAgICByZXR1cm4gaW50ZWdlcl92YWwgPCB0aGF0LmludGVnZXJfdmFsOworICB9CisgIHRocm93IFRocmlmdFBsdWdpbkVycm9yKCJVbmtub3duIGNvbnN0IHZhbHVlIHR5cGUiKTsKK30KK30KK30KK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW4uaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDVjZDQxCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3BsdWdpbi5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX1BMVUdJTl9QTFVHSU5fSAorI2RlZmluZSBUX1BMVUdJTl9QTFVHSU5fSAorCisjaW5jbHVkZSAidGhyaWZ0L1RocmlmdC5oIgorCitjbGFzcyB0X3Byb2dyYW07CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcGx1Z2luIHsKKworc3RydWN0IFRocmlmdFBsdWdpbkVycm9yIDogcHVibGljIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uIHsKKyAgVGhyaWZ0UGx1Z2luRXJyb3IoY29uc3Qgc3RkOjpzdHJpbmcmIG1zZykgOiBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbihtc2cpIHt9Cit9OworCitjbGFzcyBHZW5lcmF0b3JQbHVnaW4geworcHVibGljOgorICBpbnQgZXhlYyhpbnQgYXJnYywgY2hhciogYXJndltdKTsKKyAgdmlydHVhbCBpbnQgZ2VuZXJhdGUoOjp0X3Byb2dyYW0qLCBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JikgPSAwOworfTsKK30KK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luLnRocmlmdCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW4udGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkOThmOTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luLnRocmlmdApAQCAtMCwwICsxLDIwNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCituYW1lc3BhY2UgYXMzIG9yZy5hcGFjaGUudGhyaWZ0LnBsdWdpbgorbmFtZXNwYWNlIGNwcCBhcGFjaGUudGhyaWZ0LnBsdWdpbgorbmFtZXNwYWNlIGNzaGFycCBUaHJpZnQuUGx1Z2luCituYW1lc3BhY2UgZCB0aHJpZnQucGx1Z2luCituYW1lc3BhY2UgZGVscGhpIFRocmlmdC5QbHVnaW4KK25hbWVzcGFjZSBlcmwgdGhyaWZ0LnBsdWdpbgorbmFtZXNwYWNlIGdvIHRocmlmdAorbmFtZXNwYWNlIGhheGUgb3JnLmFwYWNoZS50aHJpZnQucGx1Z2luCituYW1lc3BhY2UgaHMgVGhyaWZ0LlBsdWdpbgorbmFtZXNwYWNlIGphdmEgb3JnLmFwYWNoZS50aHJpZnQucGx1Z2luCituYW1lc3BhY2Ugb2NhbWwgVGhyaWZ0CituYW1lc3BhY2UgcGVybCBUaHJpZnQuUGx1Z2luCituYW1lc3BhY2UgcGhwIHRocmlmdC5wbHVnaW4KK25hbWVzcGFjZSBweSB0aHJpZnQucGx1Z2luCituYW1lc3BhY2UgcmIgVGhyaWZ0CisKK3R5cGVkZWYgaTY0IHRfcHJvZ3JhbV9pZAordHlwZWRlZiBpNjQgdF90eXBlX2lkCit0eXBlZGVmIGk2NCB0X2NvbnN0X2lkCit0eXBlZGVmIGk2NCB0X3NlcnZpY2VfaWQKKworZW51bSB0X2Jhc2UgeworICAgIFRZUEVfVk9JRAorICAgIFRZUEVfU1RSSU5HCisgICAgVFlQRV9CT09MCisgICAgVFlQRV9JOAorICAgIFRZUEVfSTE2CisgICAgVFlQRV9JMzIKKyAgICBUWVBFX0k2NAorICAgIFRZUEVfRE9VQkxFCisgICAgVFlQRV9CSU5BUlkKK30KKworc3RydWN0IFR5cGVNZXRhZGF0YSB7CisgIDE6IHJlcXVpcmVkIHN0cmluZyBuYW1lCisgIDI6IHJlcXVpcmVkIHRfcHJvZ3JhbV9pZCBwcm9ncmFtX2lkCisgIDk5OiBvcHRpb25hbCBtYXA8c3RyaW5nLCBzdHJpbmc+IGFubm90YXRpb25zCisgIDEwMDogb3B0aW9uYWwgc3RyaW5nIGRvYworfQorCitzdHJ1Y3QgdF9iYXNlX3R5cGUgeworICAxOiByZXF1aXJlZCBUeXBlTWV0YWRhdGEgbWV0YWRhdGEKKyAgMjogcmVxdWlyZWQgdF9iYXNlIHZhbHVlCit9CisKK3N0cnVjdCB0X2xpc3QgeworICAxOiByZXF1aXJlZCBUeXBlTWV0YWRhdGEgbWV0YWRhdGEKKyAgMjogb3B0aW9uYWwgc3RyaW5nIGNwcF9uYW1lCisgIDM6IHJlcXVpcmVkIHRfdHlwZV9pZCBlbGVtX3R5cGUKK30KKworc3RydWN0IHRfc2V0IHsKKyAgMTogcmVxdWlyZWQgVHlwZU1ldGFkYXRhIG1ldGFkYXRhCisgIDI6IG9wdGlvbmFsIHN0cmluZyBjcHBfbmFtZQorICAzOiByZXF1aXJlZCB0X3R5cGVfaWQgZWxlbV90eXBlCit9CisKK3N0cnVjdCB0X21hcCB7CisgIDE6IHJlcXVpcmVkIFR5cGVNZXRhZGF0YSBtZXRhZGF0YQorICAyOiBvcHRpb25hbCBzdHJpbmcgY3BwX25hbWUKKyAgMzogcmVxdWlyZWQgdF90eXBlX2lkIGtleV90eXBlCisgIDQ6IHJlcXVpcmVkIHRfdHlwZV9pZCB2YWxfdHlwZQorfQorCitzdHJ1Y3QgdF90eXBlZGVmIHsKKyAgMTogcmVxdWlyZWQgVHlwZU1ldGFkYXRhIG1ldGFkYXRhCisgIDI6IHJlcXVpcmVkIHRfdHlwZV9pZCB0eXBlCisgIDM6IHJlcXVpcmVkIHN0cmluZyBzeW1ib2xpYworICA0OiByZXF1aXJlZCBib29sIGZvcndhcmQKK30KKworc3RydWN0IHRfZW51bV92YWx1ZSB7CisgIDE6IHJlcXVpcmVkIHN0cmluZyBuYW1lCisgIDI6IHJlcXVpcmVkIGkzMiB2YWx1ZQorICA5OTogb3B0aW9uYWwgbWFwPHN0cmluZywgc3RyaW5nPiBhbm5vdGF0aW9ucworICAxMDA6IG9wdGlvbmFsIHN0cmluZyBkb2MKK30KK3N0cnVjdCB0X2VudW0geworICAxOiByZXF1aXJlZCBUeXBlTWV0YWRhdGEgbWV0YWRhdGEKKyAgMjogcmVxdWlyZWQgbGlzdDx0X2VudW1fdmFsdWU+IGNvbnN0YW50cworfQorCitlbnVtIFJlcXVpcmVkbmVzcyB7CisgIFRfUkVRVUlSRUQgPSAwCisgIFRfT1BUSU9OQUwgPSAxCisgIFRfT1BUX0lOX1JFUV9PVVQgPSAyCit9CisKK3N0cnVjdCB0X2NvbnN0X2lkZW50aWZpZXJfdmFsdWUgeworICAxOiByZXF1aXJlZCBzdHJpbmcgaWRlbnRpZmllcl92YWwKKyAgMjogcmVxdWlyZWQgdF90eXBlX2lkIGVudW1fdmFsCit9CisKK3VuaW9uIHRfY29uc3RfdmFsdWUgeworICAxOiBvcHRpb25hbCBtYXA8dF9jb25zdF92YWx1ZSwgdF9jb25zdF92YWx1ZT4gbWFwX3ZhbAorICAyOiBvcHRpb25hbCBsaXN0PHRfY29uc3RfdmFsdWU+IGxpc3RfdmFsCisgIDM6IG9wdGlvbmFsIHN0cmluZyBzdHJpbmdfdmFsCisgIDQ6IG9wdGlvbmFsIGk2NCBpbnRlZ2VyX3ZhbAorICA1OiBvcHRpb25hbCBkb3VibGUgZG91YmxlX3ZhbAorICA4OiBvcHRpb25hbCB0X2NvbnN0X2lkZW50aWZpZXJfdmFsdWUgY29uc3RfaWRlbnRpZmllcl92YWwKK30KKworc3RydWN0IHRfY29uc3QgeworICAxOiByZXF1aXJlZCBzdHJpbmcgbmFtZQorICAyOiByZXF1aXJlZCB0X3R5cGVfaWQgdHlwZQorICAzOiByZXF1aXJlZCB0X2NvbnN0X3ZhbHVlIHZhbHVlCisgIDEwMDogb3B0aW9uYWwgc3RyaW5nIGRvYworfQorc3RydWN0IHRfZmllbGQgeworICAxOiByZXF1aXJlZCBzdHJpbmcgbmFtZQorICAyOiByZXF1aXJlZCB0X3R5cGVfaWQgdHlwZQorICAzOiByZXF1aXJlZCBpMzIga2V5CisgIDQ6IHJlcXVpcmVkIFJlcXVpcmVkbmVzcyByZXEKKyAgNTogb3B0aW9uYWwgdF9jb25zdF92YWx1ZSB2YWx1ZQorICAxMDogcmVxdWlyZWQgYm9vbCByZWZlcmVuY2UKKyAgOTk6IG9wdGlvbmFsIG1hcDxzdHJpbmcsIHN0cmluZz4gYW5ub3RhdGlvbnMKKyAgMTAwOiBvcHRpb25hbCBzdHJpbmcgZG9jCit9CitzdHJ1Y3QgdF9zdHJ1Y3QgeworICAxOiByZXF1aXJlZCBUeXBlTWV0YWRhdGEgbWV0YWRhdGEKKyAgMjogcmVxdWlyZWQgbGlzdDx0X2ZpZWxkPiBtZW1iZXJzCisgIDM6IHJlcXVpcmVkIGJvb2wgaXNfdW5pb24KKyAgNDogcmVxdWlyZWQgYm9vbCBpc194Y2VwdGlvbgorfQorc3RydWN0IHRfZnVuY3Rpb24geworICAxOiByZXF1aXJlZCBzdHJpbmcgbmFtZQorICAyOiByZXF1aXJlZCB0X3R5cGVfaWQgcmV0dXJudHlwZQorICAzOiByZXF1aXJlZCB0X3R5cGVfaWQgYXJnbGlzdAorICA0OiByZXF1aXJlZCB0X3R5cGVfaWQgeGNlcHRpb25zCisgIDU6IHJlcXVpcmVkIGJvb2wgaXNfb25ld2F5CisgIDEwMDogb3B0aW9uYWwgc3RyaW5nIGRvYworfQorc3RydWN0IHRfc2VydmljZSB7CisgIDE6IHJlcXVpcmVkIFR5cGVNZXRhZGF0YSBtZXRhZGF0YQorICAyOiByZXF1aXJlZCBsaXN0PHRfZnVuY3Rpb24+IGZ1bmN0aW9ucworICAzOiBvcHRpb25hbCB0X3NlcnZpY2VfaWQgZXh0ZW5kc18KK30KK3VuaW9uIHRfdHlwZSB7CisgIDE6IG9wdGlvbmFsIHRfYmFzZV90eXBlIGJhc2VfdHlwZV92YWwKKyAgMjogb3B0aW9uYWwgdF90eXBlZGVmIHR5cGVkZWZfdmFsCisgIDM6IG9wdGlvbmFsIHRfZW51bSBlbnVtX3ZhbAorICA0OiBvcHRpb25hbCB0X3N0cnVjdCBzdHJ1Y3RfdmFsCisgIDU6IG9wdGlvbmFsIHRfc3RydWN0IHhjZXB0aW9uX3ZhbAorICA2OiBvcHRpb25hbCB0X2xpc3QgbGlzdF92YWwKKyAgNzogb3B0aW9uYWwgdF9zZXQgc2V0X3ZhbAorICA4OiBvcHRpb25hbCB0X21hcCBtYXBfdmFsCisgIDk6IG9wdGlvbmFsIHRfc2VydmljZSBzZXJ2aWNlX3ZhbAorfQorc3RydWN0IHRfc2NvcGUgeworICAxOiByZXF1aXJlZCBsaXN0PHRfdHlwZV9pZD4gdHlwZXMKKyAgMjogcmVxdWlyZWQgbGlzdDx0X2NvbnN0X2lkPiBjb25zdGFudHMKKyAgMzogcmVxdWlyZWQgbGlzdDx0X3NlcnZpY2VfaWQ+IHNlcnZpY2VzCit9CisKK3N0cnVjdCBUeXBlUmVnaXN0cnkgeworICAxOiByZXF1aXJlZCBtYXA8dF90eXBlX2lkLCB0X3R5cGU+IHR5cGVzCisgIDI6IHJlcXVpcmVkIG1hcDx0X2NvbnN0X2lkLCB0X2NvbnN0PiBjb25zdGFudHMKKyAgMzogcmVxdWlyZWQgbWFwPHRfc2VydmljZV9pZCwgdF9zZXJ2aWNlPiBzZXJ2aWNlcworfQorCitzdHJ1Y3QgdF9wcm9ncmFtIHsKKyAgMTogcmVxdWlyZWQgc3RyaW5nIG5hbWUKKyAgMjogcmVxdWlyZWQgdF9wcm9ncmFtX2lkIHByb2dyYW1faWQKKyAgMzogcmVxdWlyZWQgc3RyaW5nIHBhdGgKKyAgNDogcmVxdWlyZWQgc3RyaW5nIG5hbWVzcGFjZV8KKyAgNTogcmVxdWlyZWQgc3RyaW5nIG91dF9wYXRoCisgIDY6IHJlcXVpcmVkIGJvb2wgb3V0X3BhdGhfaXNfYWJzb2x1dGUKKyAgODogcmVxdWlyZWQgbGlzdDx0X3Byb2dyYW0+IGluY2x1ZGVzCisgIDk6IHJlcXVpcmVkIHN0cmluZyBpbmNsdWRlX3ByZWZpeAorICAxMDogcmVxdWlyZWQgdF9zY29wZSBzY29wZQorCisgIDExOiByZXF1aXJlZCBsaXN0PHRfdHlwZV9pZD4gdHlwZWRlZnMKKyAgMTI6IHJlcXVpcmVkIGxpc3Q8dF90eXBlX2lkPiBlbnVtcworICAxMzogcmVxdWlyZWQgbGlzdDx0X2NvbnN0X2lkPiBjb25zdHMKKyAgMTQ6IHJlcXVpcmVkIGxpc3Q8dF90eXBlX2lkPiBvYmplY3RzCisgIDE1OiByZXF1aXJlZCBsaXN0PHRfc2VydmljZV9pZD4gc2VydmljZXMKKworICAxNjogcmVxdWlyZWQgbWFwPHN0cmluZywgc3RyaW5nPiBuYW1lc3BhY2VzCisgIDE3OiByZXF1aXJlZCBsaXN0PHN0cmluZz4gY3BwX2luY2x1ZGVzCisgIDE4OiByZXF1aXJlZCBsaXN0PHN0cmluZz4gY19pbmNsdWRlcworICAxMDA6IG9wdGlvbmFsIHN0cmluZyBkb2MKK30KKworc3RydWN0IEdlbmVyYXRvcklucHV0IHsKKyAgMTogcmVxdWlyZWQgdF9wcm9ncmFtIHByb2dyYW0KKyAgMjogcmVxdWlyZWQgVHlwZVJlZ2lzdHJ5IHR5cGVfcmVnaXN0cnkKKyAgMzogcmVxdWlyZWQgbWFwPHN0cmluZywgc3RyaW5nPiBwYXJzZWRfb3B0aW9ucworfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3BsdWdpbl9vdXRwdXQuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luX291dHB1dC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODIyM2RlCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3BsdWdpbl9vdXRwdXQuY2MKQEAgLTAsMCArMSw0NTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgPGNzdGRpbz4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGlvLmg+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjZGVmaW5lIFRIUklGVF9QT1BFTihjbWQpIF9wb3BlbihjbWQsICJ3YiIpCisjZGVmaW5lIFRIUklGVF9QQ0xPU0UgX3BjbG9zZQorI2Vsc2UKKyNkZWZpbmUgVEhSSUZUX1BPUEVOKGNtZCkgcG9wZW4oY21kLCAidyIpCisjZGVmaW5lIFRIUklGVF9QQ0xPU0UgcGNsb3NlCisjZW5kaWYKKworI2luY2x1ZGUgInRocmlmdC9wbHVnaW4vcGx1Z2luX291dHB1dC5oIgorCisjaW5jbHVkZSA8Ym9vc3QvcmFuZ2UvYWRhcHRvci9tYXAuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3JhbmdlL2FsZ29yaXRobS9jb3B5LmhwcD4KKyNpbmNsdWRlIDxib29zdC9yYW5nZS9hbGdvcml0aG0vdHJhbnNmb3JtLmhwcD4KKworI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5oIgorI2luY2x1ZGUgInRocmlmdC9wbHVnaW4vcGx1Z2luLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BsdWdpbi90eXBlX3V0aWwuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmgiCisjaW5jbHVkZSAidGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oIgorI2luY2x1ZGUgInRocmlmdC90cmFuc3BvcnQvVEZEVHJhbnNwb3J0LmgiCisKKyNpbmNsdWRlICJ0aHJpZnQvcGx1Z2luL3BsdWdpbl90eXBlcy5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgcGx1Z2luX291dHB1dCB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBGcm9tPgordHlwZW5hbWUgYXBhY2hlOjp0aHJpZnQ6OnBsdWdpbjo6VG9UeXBlPEZyb20+Ojp0eXBlIGNvbnZlcnQoRnJvbSogZnJvbSkgeworICB0eXBlbmFtZSBhcGFjaGU6OnRocmlmdDo6cGx1Z2luOjpUb1R5cGU8RnJvbT46OnR5cGUgdG87CisgIGNvbnZlcnQoZnJvbSwgdG8pOworICByZXR1cm4gdG87Cit9CisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VEJpbmFyeVByb3RvY29sOwordXNpbmcgc3RkOjptYWtlX3NoYXJlZDsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRGRFRyYW5zcG9ydDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRGcmFtZWRUcmFuc3BvcnQ7CisKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKKworI2RlZmluZSBUSFJJRlRfQ09OVkVSU0lPTl9OKGZyb21fdHlwZSwgdG9fdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2b2lkIGNvbnZlcnQ8ZnJvbV90eXBlLCB0b190eXBlPihmcm9tX3R5cGUgKiBmcm9tLCB0b190eXBlICYgdG8pCisjZGVmaW5lIFRIUklGVF9DT05WRVJTSU9OKHR5cGUpIFRIUklGVF9DT05WRVJTSU9OX04oOjp0eXBlLCBwbHVnaW46OnR5cGUpCisKKyNkZWZpbmUgVEhSSUZUX0FTU0lHTl9OKGZyb21fbmFtZSwgdG9fbmFtZSwgcHJlZml4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZnJvbSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHRvLl9fc2V0XyMjdG9fbmFtZShwcmVmaXgoZnJvbS0+ZnJvbV9uYW1lKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBUSFJJRlRfQVNTSUdOKG5hbWUpIFRIUklGVF9BU1NJR05fTihnZXRfIyNuYW1lKCksIG5hbWUsICkKKyNkZWZpbmUgVEhSSUZUX0FTU0lHTl9DT05WRVJUKHR5cGUsIGZyb21fbmFtZSwgdG9fbmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZnJvbSAmJiBmcm9tLT5mcm9tX25hbWUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHRvLl9fc2V0XyMjdG9fbmFtZShjb252ZXJ0KGZyb20tPmZyb21fbmFtZSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBUSFJJRlRfQVNTSUdOX09QVChuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChmcm9tLT5oYXNfIyNuYW1lKCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgVEhSSUZUX0FTU0lHTihuYW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIFRIUklGVF9BU1NJR05fTElTVF9OKHR5cGUsIGZyb21fbmFtZSwgdG9fbmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGZyb20gJiYgIWZyb20tPmZyb21fbmFtZS5lbXB0eSgpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzdGQ6OnRyYW5zZm9ybShmcm9tLT5mcm9tX25hbWUuYmVnaW4oKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICBmcm9tLT5mcm9tX25hbWUuZW5kKCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICBzdGQ6OmJhY2tfaW5zZXJ0ZXIodG8udG9fbmFtZSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0PCA6OnR5cGU+KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgVEhSSUZUX0FTU0lHTl9NRVRBREFUQSgpIGNvbnZlcnQocmVpbnRlcnByZXRfY2FzdDx0X3R5cGUqPihmcm9tKSwgdG8ubWV0YWRhdGEpCisKKy8vIGEgZ2VuZXJhdG9yIG9mIHNlcXVlbnRpYWwgdW5pcXVlIGlkZW50aWZpZXJzIGZvciBhZGRyZXNzZXMgLS0gc28KKy8vIHRoYXQgdGhlIFR5cGVDYWNoZSBiZWxvdyBjYW4gdXNlIHRob3NlIElEcyBpbnN0ZWFkIG9mCisvLyBhZGRyZXNzZXMuIFRoaXMgYWxsb3dzIEdlbmVyYXRvcklucHV0J3MgdmFyaW91cworLy8gdF97cHJvZ3JhbSx0eXBlLGV0Y31faWQgdHlwZXMgdG8gYmUgZGVuc2UgY29uc2VjdXRpdmVseS1udW1iZXJlZAorLy8gaW50ZWdlcnMsIGluc3RlYWQgb2YgbGFyZ2UgcmFuZG9tLXNlZW1pbmcgaW50ZWdlcnMuCisvLworLy8gRnVydGhlcm1vcmUsIHRoaXMgYWxsb3dzIEdlbmVyYXRvcklucHV0IHRvIGJlIGRldGVybWluaXN0aWMgKG5vCisvLyBhZGRyZXNzZXMsIHNvIG5vIHBzZXVkby1yYW5kb21uZXNzKSBhbmQgdGhhdCBtZWFucyByZXByb2R1Y2liaWxpdHkKKy8vIG9mIG91dHB1dC4KK2NvbnN0IGludDY0X3QgT05FX01JTExJT04gPSAxMDAwICogMTAwMDsKK2NsYXNzIGlkX2dlbmVyYXRvciB7CitwdWJsaWM6CisgIGlkX2dlbmVyYXRvcigpIDogYWRkcjJpZF8oKSwgbmV4dF9pZF8oT05FX01JTExJT04pIHt9CisKKyAgdm9pZCBjbGVhcigpIHsKKyAgICBhZGRyMmlkXy5jbGVhcigpIDsKKyAgICBuZXh0X2lkXyA9IE9ORV9NSUxMSU9OIDsKKyAgfQorCisgIGludDY0X3QgZ2Vuc3ltKGNvbnN0IGludDY0X3QgYWRkcikgeworICAgIGlmICghYWRkcikgcmV0dXJuIDBMIDsKKyAgICBzdGQ6Om1hcDxpbnQ2NF90LCBpbnQ2NF90Pjo6aXRlcmF0b3IgaXQgPSBhZGRyMmlkXy5maW5kKGFkZHIpOworICAgIGlmIChpdCAhPSBhZGRyMmlkXy5lbmQoKSkgcmV0dXJuIGl0LT5zZWNvbmQgOworICAgIGludDY0X3QgaWQgPSBuZXh0X2lkXysrIDsKKyAgICBhZGRyMmlkXy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoYWRkciwgaWQpKSA7CisgICAgcmV0dXJuIGlkIDsKKyAgfQorCisgIHN0ZDo6bWFwPGludDY0X3QsIGludDY0X3Q+IGFkZHIyaWRfIDsKKyAgaW50NjRfdCBuZXh0X2lkXyA7Cit9IDsKKworLy8gVG8gYXZvaWQgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHNhbWUgdHlwZSwgdF90eXBlLCB0X2NvbnN0IGFuZCB0X3NlcnZpY2UgYXJlIHN0b3JlZCBpbiBvbmUgcGxhY2UKKy8vIGFuZCByZWZlcmVuY2VkIGJ5IElELgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgVHlwZUNhY2hlIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBwbHVnaW46OlRvVHlwZTxUPjo6dHlwZSB0b190eXBlOworICBpZF9nZW5lcmF0b3IgaWRnZW4gOworICBzdGQ6Om1hcDxpbnQ2NF90LCB0b190eXBlPiBjYWNoZTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDI+CisgIGludDY0X3Qgc3RvcmUoVDIqIHQpIHsKKyAgICBpbnRwdHJfdCBhZGRyID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4odCk7CisgICAgaWYgKCFhZGRyKSByZXR1cm4gMEwgOworCisgICAgaW50NjRfdCBpZCA9IGlkZ2VuLmdlbnN5bShhZGRyKSA7CisgICAgaWYgKGNhY2hlLmVuZCgpICE9IGNhY2hlLmZpbmQoaWQpKSByZXR1cm4gaWQgOworCisgICAgLy8gSEFDSzogZmFrZSByZXNvbHZlIGZvciByZWN1cnNpdmUgdHlwZQorICAgIGNhY2hlLmluc2VydChzdGQ6Om1ha2VfcGFpcihpZCwgdG9fdHlwZSgpKSk7CisgICAgLy8gb3ZlcndyaXRlIHdpdGggdHJ1ZSB2YWx1ZQorICAgIGNhY2hlW2lkXSA9IGNvbnZlcnQodCk7CisgICAgcmV0dXJuIGlkIDsKKyAgfQorCisgIHZvaWQgY2xlYXIoKSB7IGNhY2hlLmNsZWFyKCkgOyBpZGdlbi5jbGVhcigpOyB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2ludDY0X3Qgc3RvcmVfdHlwZShUKiB0KTsKKworI2RlZmluZSBUX1NUT1JFKHR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUeXBlQ2FjaGU8dF8jI3R5cGU+IHR5cGUjI19jYWNoZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBwbHVnaW46OnRfIyN0eXBlIyNfaWQgc3RvcmVfdHlwZTx0XyMjdHlwZT4odF8jI3R5cGUgKiB0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiB0eXBlIyNfY2FjaGUuc3RvcmU8dF8jI3R5cGU+KHQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CitUX1NUT1JFKHR5cGUpCitUX1NUT1JFKGNvbnN0KQorVF9TVE9SRShzZXJ2aWNlKQorI3VuZGVmIFRfU1RPUkUKKy8vIHRoaXMgaWRfZ2VuZXJhdG9yIGlzIGZvciBnZW5zeW1tLWluZyB0X3Byb2dyYW1faWQKK2lkX2dlbmVyYXRvciBwcm9ncmFtX2NhY2hlIDsKKworI2RlZmluZSBUSFJJRlRfQVNTSUdOX0lEX04odCwgZnJvbV9uYW1lLCB0b19uYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChmcm9tICYmIGZyb20tPmZyb21fbmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdG8uX19zZXRfIyN0b19uYW1lKHN0b3JlX3R5cGU8dD4oZnJvbS0+ZnJvbV9uYW1lKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIFRIUklGVF9BU1NJR05fSUQobmFtZSkgVEhSSUZUX0FTU0lHTl9JRF9OKHRfdHlwZSwgZ2V0XyMjbmFtZSgpLCBuYW1lKQorCisjZGVmaW5lIFRIUklGVF9BU1NJR05fTElTVF9JRCh0LCBuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGZyb20gJiYgIWZyb20tPmdldF8jI25hbWUjI3MoKS5lbXB0eSgpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBzdGQ6OnRyYW5zZm9ybShmcm9tLT5nZXRfIyNuYW1lIyNzKCkuYmVnaW4oKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICBmcm9tLT5nZXRfIyNuYW1lIyNzKCkuZW5kKCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICBzdGQ6OmJhY2tfaW5zZXJ0ZXIodG8ubmFtZSMjcyksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAmc3RvcmVfdHlwZTx0Pik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKK1RIUklGVF9DT05WRVJTSU9OX04oOjp0X3R5cGUsIHBsdWdpbjo6VHlwZU1ldGFkYXRhKSB7CisgIHRvLnByb2dyYW1faWQgPSBwcm9ncmFtX2NhY2hlLmdlbnN5bShyZWludGVycHJldF9jYXN0PGludDY0X3Q+KGZyb20tPmdldF9wcm9ncmFtKCkpKTsKKyAgVEhSSUZUX0FTU0lHTl9OKGFubm90YXRpb25zXywgYW5ub3RhdGlvbnMsICk7CisgIGlmIChmcm9tLT5oYXNfZG9jKCkpIHsKKyAgICB0by5fX3NldF9kb2MoZnJvbS0+Z2V0X2RvYygpKTsKKyAgfQorICBUSFJJRlRfQVNTSUdOKG5hbWUpOworfQorCitUSFJJRlRfQ09OVkVSU0lPTih0X3R5cGVkZWYpIHsKKyAgVEhSSUZUX0FTU0lHTl9NRVRBREFUQSgpOworICBUSFJJRlRfQVNTSUdOX0lEKHR5cGUpOworICBUSFJJRlRfQVNTSUdOKHN5bWJvbGljKTsKKyAgVEhSSUZUX0FTU0lHTl9OKGlzX2ZvcndhcmRfdHlwZWRlZigpLCBmb3J3YXJkLCApOworfQorCitUSFJJRlRfQ09OVkVSU0lPTih0X2VudW1fdmFsdWUpIHsKKyAgVEhSSUZUX0FTU0lHTl9PUFQoZG9jKTsKKyAgVEhSSUZUX0FTU0lHTihuYW1lKTsKKyAgVEhSSUZUX0FTU0lHTih2YWx1ZSk7Cit9CisKK1RIUklGVF9DT05WRVJTSU9OKHRfZW51bSkgeworICBUSFJJRlRfQVNTSUdOX01FVEFEQVRBKCk7CisgIFRIUklGVF9BU1NJR05fTElTVF9OKHRfZW51bV92YWx1ZSwgZ2V0X2NvbnN0YW50cygpLCBjb25zdGFudHMpOworfQorCitUSFJJRlRfQ09OVkVSU0lPTih0X2NvbnN0X3ZhbHVlKSB7CisgIHN3aXRjaCAoZnJvbS0+Z2V0X3R5cGUoKSkgeworICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVI6CisgICAgVEhSSUZUX0FTU0lHTl9OKGdldF9pbnRlZ2VyKCksIGludGVnZXJfdmFsLCApOworICAgIGJyZWFrOworICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0RPVUJMRToKKyAgICBUSFJJRlRfQVNTSUdOX04oZ2V0X2RvdWJsZSgpLCBkb3VibGVfdmFsLCApOworICAgIGJyZWFrOworICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX1NUUklORzoKKyAgICBUSFJJRlRfQVNTSUdOX04oZ2V0X3N0cmluZygpLCBzdHJpbmdfdmFsLCApOworICAgIGJyZWFrOworICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0lERU5USUZJRVI6CisgICAgaWYgKGZyb20pIHsKKyAgICAgIGFwYWNoZTo6dGhyaWZ0OjpwbHVnaW46OnRfY29uc3RfaWRlbnRpZmllcl92YWx1ZSBjaWR2YWwgOworICAgICAgaWYgKGZyb20tPmVudW1fKQorCWNpZHZhbC5fX3NldF9lbnVtX3ZhbChzdG9yZV90eXBlPHRfdHlwZT4oZnJvbS0+ZW51bV8pKTsKKyAgICAgIGNpZHZhbC5fX3NldF9pZGVudGlmaWVyX3ZhbChmcm9tLT5nZXRfaWRlbnRpZmllcigpKTsKKyAgICAgIHRvLl9fc2V0X2NvbnN0X2lkZW50aWZpZXJfdmFsKGNpZHZhbCkgOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9NQVA6CisgICAgdG8uX19pc3NldC5tYXBfdmFsID0gdHJ1ZTsKKyAgICBpZiAoZnJvbSAmJiAhZnJvbS0+Z2V0X21hcCgpLmVtcHR5KCkpIHsKKyAgICAgIGZvciAoc3RkOjptYXA8IDo6dF9jb25zdF92YWx1ZSosIDo6dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBpdAorICAgICAgICAgICA9IGZyb20tPmdldF9tYXAoKS5iZWdpbigpOworICAgICAgICAgICBpdCAhPSBmcm9tLT5nZXRfbWFwKCkuZW5kKCk7CisgICAgICAgICAgIGl0KyspIHsKKyAgICAgICAgdG8ubWFwX3ZhbC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoY29udmVydChpdC0+Zmlyc3QpLCBjb252ZXJ0KGl0LT5zZWNvbmQpKSk7CisgICAgICB9CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0xJU1Q6CisgICAgdG8uX19pc3NldC5saXN0X3ZhbCA9IHRydWU7CisgICAgVEhSSUZUX0FTU0lHTl9MSVNUX04odF9jb25zdF92YWx1ZSwgZ2V0X2xpc3QoKSwgbGlzdF92YWwpOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIHRocm93IHBsdWdpbjo6VGhyaWZ0UGx1Z2luRXJyb3IoImNvbnN0IHZhbHVlIGhhcyBubyB2YWx1ZSIpOworICB9Cit9CitUSFJJRlRfQ09OVkVSU0lPTih0X2NvbnN0KSB7CisgIFRIUklGVF9BU1NJR05fT1BUKGRvYyk7CisgIFRIUklGVF9BU1NJR04obmFtZSk7CisgIFRIUklGVF9BU1NJR05fSUQodHlwZSk7CisgIFRIUklGVF9BU1NJR05fQ09OVkVSVCh0X2NvbnN0X3ZhbHVlLCBnZXRfdmFsdWUoKSwgdmFsdWUpOworfQorVEhSSUZUX0NPTlZFUlNJT04odF9maWVsZCkgeworICBUSFJJRlRfQVNTSUdOX09QVChkb2MpOworICBUSFJJRlRfQVNTSUdOKG5hbWUpOworICBUSFJJRlRfQVNTSUdOKGtleSk7CisgIFRIUklGVF9BU1NJR05fTihnZXRfcmVxKCksIHJlcSwgKHBsdWdpbjo6UmVxdWlyZWRuZXNzOjp0eXBlKSk7CisgIFRIUklGVF9BU1NJR04ocmVmZXJlbmNlKTsKKyAgVEhSSUZUX0FTU0lHTl9JRCh0eXBlKTsKKyAgVEhSSUZUX0FTU0lHTl9DT05WRVJUKHRfY29uc3RfdmFsdWUsIGdldF92YWx1ZSgpLCB2YWx1ZSk7Cit9CitUSFJJRlRfQ09OVkVSU0lPTih0X3N0cnVjdCkgeworICBUSFJJRlRfQVNTSUdOX01FVEFEQVRBKCk7CisgIFRIUklGVF9BU1NJR05fTElTVF9OKHRfZmllbGQsIGdldF9tZW1iZXJzKCksIG1lbWJlcnMpOworICBUSFJJRlRfQVNTSUdOX04oaXNfdW5pb24oKSwgaXNfdW5pb24sICk7CisgIFRIUklGVF9BU1NJR05fTihpc194Y2VwdGlvbigpLCBpc194Y2VwdGlvbiwgKTsKK30KK1RIUklGVF9DT05WRVJTSU9OKHRfZnVuY3Rpb24pIHsKKyAgVEhSSUZUX0FTU0lHTl9PUFQoZG9jKTsKKyAgVEhSSUZUX0FTU0lHTihuYW1lKTsKKyAgVEhSSUZUX0FTU0lHTl9JRChyZXR1cm50eXBlKTsKKyAgVEhSSUZUX0FTU0lHTl9OKGlzX29uZXdheSgpLCBpc19vbmV3YXksICk7CisgIFRIUklGVF9BU1NJR05fSUQoYXJnbGlzdCk7CisgIFRIUklGVF9BU1NJR05fSUQoeGNlcHRpb25zKTsKK30KKworVEhSSUZUX0NPTlZFUlNJT04odF9saXN0KSB7CisgIFRIUklGVF9BU1NJR05fTUVUQURBVEEoKTsKKyAgVEhSSUZUX0FTU0lHTl9PUFQoY3BwX25hbWUpOworICBUSFJJRlRfQVNTSUdOX0lEKGVsZW1fdHlwZSk7Cit9CitUSFJJRlRfQ09OVkVSU0lPTih0X3NldCkgeworICBUSFJJRlRfQVNTSUdOX01FVEFEQVRBKCk7CisgIFRIUklGVF9BU1NJR05fT1BUKGNwcF9uYW1lKTsKKyAgVEhSSUZUX0FTU0lHTl9JRChlbGVtX3R5cGUpOworfQorVEhSSUZUX0NPTlZFUlNJT04odF9tYXApIHsKKyAgVEhSSUZUX0FTU0lHTl9NRVRBREFUQSgpOworICBUSFJJRlRfQVNTSUdOX09QVChjcHBfbmFtZSk7CisgIFRIUklGVF9BU1NJR05fSUQoa2V5X3R5cGUpOworICBUSFJJRlRfQVNTSUdOX0lEKHZhbF90eXBlKTsKK30KKworVEhSSUZUX0NPTlZFUlNJT04odF9zZXJ2aWNlKSB7CisgIFRIUklGVF9BU1NJR05fTUVUQURBVEEoKTsKKyAgVEhSSUZUX0FTU0lHTl9MSVNUX04odF9mdW5jdGlvbiwgZ2V0X2Z1bmN0aW9ucygpLCBmdW5jdGlvbnMpOworICBUSFJJRlRfQVNTSUdOX0lEX04odF9zZXJ2aWNlLCBnZXRfZXh0ZW5kcygpLCBleHRlbmRzXyk7Cit9CisKK1RIUklGVF9DT05WRVJTSU9OKHRfYmFzZV90eXBlKSB7CisgIFRIUklGVF9BU1NJR05fTUVUQURBVEEoKTsKKyAgaWYgKGZyb20tPmlzX2JpbmFyeSgpKSB7CisgICAgdG8udmFsdWUgPSBwbHVnaW46OnRfYmFzZTo6VFlQRV9CSU5BUlk7CisgIH0gZWxzZSB7CisgICAgc3dpdGNoIChmcm9tLT5nZXRfYmFzZSgpKSB7CisjZGVmaW5lIFRfQkFTRVRZUEVfQ0FTRShuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfIyNuYW1lOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdG8udmFsdWUgPSBwbHVnaW46OnRfYmFzZTo6VFlQRV8jI25hbWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYnJlYWsKKyAgICAgIFRfQkFTRVRZUEVfQ0FTRShWT0lEKTsKKyAgICAgIFRfQkFTRVRZUEVfQ0FTRShTVFJJTkcpOworICAgICAgVF9CQVNFVFlQRV9DQVNFKEJPT0wpOworICAgICAgVF9CQVNFVFlQRV9DQVNFKEk4KTsKKyAgICAgIFRfQkFTRVRZUEVfQ0FTRShJMTYpOworICAgICAgVF9CQVNFVFlQRV9DQVNFKEkzMik7CisgICAgICBUX0JBU0VUWVBFX0NBU0UoSTY0KTsKKyAgICAgIFRfQkFTRVRZUEVfQ0FTRShET1VCTEUpOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyBwbHVnaW46OlRocmlmdFBsdWdpbkVycm9yKCJCYXNlIHR5cGUgdW5pb24gaGFzIG5vIHZhbHVlIik7CisgICAgICBicmVhazsKKyN1bmRlZiBUX0JBU0VUWVBFX0NBU0UKKyAgICB9CisgIH0KK30KK1RIUklGVF9DT05WRVJTSU9OKHRfdHlwZSkgeworI2RlZmluZSBUX0NPTlZFUlRfVU5JT05fTihuYW1lLCB0eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBlbHNlIGlmIChmcm9tLT5pc18jI25hbWUoKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRvLl9faXNzZXQubmFtZSMjX3ZhbCA9IHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnZlcnQocmVpbnRlcnByZXRfY2FzdDwgOjp0eXBlKj4oZnJvbSksIHRvLm5hbWUjI192YWwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisjZGVmaW5lIFRfQ09OVkVSVF9VTklPTihuYW1lKSBUX0NPTlZFUlRfVU5JT05fTihuYW1lLCB0XyMjbmFtZSkKKyAgaWYgKGZhbHNlKSB7CisgIH0KKyAgVF9DT05WRVJUX1VOSU9OKGJhc2VfdHlwZSkKKyAgVF9DT05WRVJUX1VOSU9OKHR5cGVkZWYpCisgIFRfQ09OVkVSVF9VTklPTihlbnVtKQorICBUX0NPTlZFUlRfVU5JT04oc3RydWN0KQorICBUX0NPTlZFUlRfVU5JT05fTih4Y2VwdGlvbiwgdF9zdHJ1Y3QpCisgIFRfQ09OVkVSVF9VTklPTihsaXN0KQorICBUX0NPTlZFUlRfVU5JT04oc2V0KQorICBUX0NPTlZFUlRfVU5JT04obWFwKQorICBUX0NPTlZFUlRfVU5JT04oc2VydmljZSkKKyAgZWxzZSB7CisgICAgdGhyb3cgcGx1Z2luOjpUaHJpZnRQbHVnaW5FcnJvcigiVHlwZSB1bmlvbiBoYXMgbm8gdmFsdWUiKTsKKyAgfQorI3VuZGVmIFRfQ09OVkVSVF9VTklPTl9OCisjdW5kZWYgVF9DT05WRVJUX1VOSU9OCit9CisKK1RIUklGVF9DT05WRVJTSU9OKHRfc2NvcGUpIHsKKyNkZWZpbmUgVF9TQ09QRV9BU1NJR04obmFtZSwgdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYm9vc3Q6OmNvcHkoZnJvbS0+bmFtZSMjc18gfCBib29zdDo6YWRhcHRvcnM6Om1hcF92YWx1ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgfCBib29zdDo6YWRhcHRvcnM6OnRyYW5zZm9ybWVkKCZzdG9yZV90eXBlPHR5cGU+KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgc3RkOjpiYWNrX2luc2VydGVyKHRvLm5hbWUjI3MpKQorICBUX1NDT1BFX0FTU0lHTih0eXBlLCB0X3R5cGUpOworICBUX1NDT1BFX0FTU0lHTihjb25zdGFudCwgdF9jb25zdCk7CisgIFRfU0NPUEVfQVNTSUdOKHNlcnZpY2UsIHRfc2VydmljZSk7CisjdW5kZWYgVF9TQ09QRV9BU1NJR04KK30KKwordm9pZCBnZXRfZ2xvYmFsX2NhY2hlKHBsdWdpbjo6VHlwZVJlZ2lzdHJ5JiByZWcpIHsKKyAgcmVnLnR5cGVzID0gdHlwZV9jYWNoZS5jYWNoZTsKKyAgcmVnLmNvbnN0YW50cyA9IGNvbnN0X2NhY2hlLmNhY2hlOworICByZWcuc2VydmljZXMgPSBzZXJ2aWNlX2NhY2hlLmNhY2hlOworfQorCit2b2lkIGNsZWFyX2dsb2JhbF9jYWNoZSgpIHsKKyAgdHlwZV9jYWNoZS5jbGVhcigpOworICBjb25zdF9jYWNoZS5jbGVhcigpOworICBzZXJ2aWNlX2NhY2hlLmNsZWFyKCk7CisgIHByb2dyYW1fY2FjaGUuY2xlYXIoKSA7Cit9CisKK1RIUklGVF9DT05WRVJTSU9OKHRfcHJvZ3JhbSkgeworICBUSFJJRlRfQVNTSUdOX0NPTlZFUlQodF9zY29wZSwgc2NvcGUoKSwgc2NvcGUpOworICBUSFJJRlRfQVNTSUdOKHBhdGgpOworICBUSFJJRlRfQVNTSUdOKG91dF9wYXRoKTsKKyAgVEhSSUZUX0FTU0lHTihuYW1lKTsKKyAgVEhSSUZUX0FTU0lHTihpbmNsdWRlX3ByZWZpeCk7CisgIFRIUklGVF9BU1NJR04oY3BwX2luY2x1ZGVzKTsKKyAgVEhSSUZUX0FTU0lHTihjX2luY2x1ZGVzKTsKKyAgVEhSSUZUX0FTU0lHTihuYW1lc3BhY2VzKTsKKyAgVEhSSUZUX0FTU0lHTl9OKGlzX291dF9wYXRoX2Fic29sdXRlKCksIG91dF9wYXRoX2lzX2Fic29sdXRlLCApOworICBUSFJJRlRfQVNTSUdOX04oZ2V0X25hbWVzcGFjZSgpLCBuYW1lc3BhY2VfLCApOworICBUSFJJRlRfQVNTSUdOX0xJU1RfSUQodF90eXBlLCB0eXBlZGVmKTsKKyAgVEhSSUZUX0FTU0lHTl9MSVNUX0lEKHRfdHlwZSwgZW51bSk7CisgIFRIUklGVF9BU1NJR05fTElTVF9JRCh0X3R5cGUsIG9iamVjdCk7CisgIFRIUklGVF9BU1NJR05fTElTVF9JRCh0X2NvbnN0LCBjb25zdCk7CisgIFRIUklGVF9BU1NJR05fTElTVF9JRCh0X3NlcnZpY2UsIHNlcnZpY2UpOworICBUSFJJRlRfQVNTSUdOX0xJU1RfTih0X3Byb2dyYW0sIGdldF9pbmNsdWRlcygpLCBpbmNsdWRlcyk7CisgIHRvLnByb2dyYW1faWQgPSBwcm9ncmFtX2NhY2hlLmdlbnN5bShyZWludGVycHJldF9jYXN0PHBsdWdpbjo6dF9wcm9ncmFtX2lkPihmcm9tKSk7Cit9CisKK1BsdWdpbkRlbGVnYXRlUmVzdWx0IGRlbGVnYXRlVG9QbHVnaW4odF9wcm9ncmFtKiBwcm9ncmFtLCBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9ucykgeworICBzdGQ6OnN0cmluZyBsYW5ndWFnZTsKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBwYXJzZWRfb3B0aW9uczsKKyAgdF9nZW5lcmF0b3I6OnBhcnNlX29wdGlvbnMob3B0aW9ucywgbGFuZ3VhZ2UsIHBhcnNlZF9vcHRpb25zKTsKKyAgc3RkOjpzdHJpbmcgY21kID0gInRocmlmdC1nZW4tIjsKKyAgaWYgKGxhbmd1YWdlLmZpbmRfZmlyc3Rfbm90X29mKCJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaXy0wMTIzNDU2Nzg5IikKKyAgICAgICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgc3RkOjpjZXJyIDw8ICJJbnZhbGlkIGxhbmd1YWdlIG5hbWUiIDw8IHN0ZDo6ZW5kbDsKKyAgICByZXR1cm4gUExVR0lOX0ZBSUxVUkU7CisgIH0KKyAgY21kLmFwcGVuZChsYW5ndWFnZSk7CisgIEZJTEUqIGZkID0gVEhSSUZUX1BPUEVOKGNtZC5jX3N0cigpKTsKKyAgaWYgKGZkKSB7CisjaWZkZWYgX1dJTjMyCisgICAgX3NldG1vZGUoZmlsZW5vKGZkKSwgX09fQklOQVJZKTsKKyNlbmRpZgorICAgIHNoYXJlZF9wdHI8VEZyYW1lZFRyYW5zcG9ydD4gdHJhbnNwb3J0KAorICAgICAgICBuZXcgVEZyYW1lZFRyYW5zcG9ydChtYWtlX3NoYXJlZDxURkRUcmFuc3BvcnQ+KGZpbGVubyhmZCkpKSk7CisgICAgVEJpbmFyeVByb3RvY29sIHByb3RvKHRyYW5zcG9ydCk7CisKKyAgICBwbHVnaW46OkdlbmVyYXRvcklucHV0IGlucHV0OworICAgIGlucHV0Ll9fc2V0X3BhcnNlZF9vcHRpb25zKHBhcnNlZF9vcHRpb25zKTsKKyAgICBjbGVhcl9nbG9iYWxfY2FjaGUoKTsKKyAgICBjb252ZXJ0KHByb2dyYW0sIGlucHV0LnByb2dyYW0pOworICAgIGdldF9nbG9iYWxfY2FjaGUoaW5wdXQudHlwZV9yZWdpc3RyeSk7CisgICAgdHJ5IHsKKyAgICAgIGlucHV0LndyaXRlKCZwcm90byk7CisgICAgICB0cmFuc3BvcnQtPmZsdXNoKCk7CisgICAgfSBjYXRjaCAoc3RkOjpleGNlcHRpb24mIGVycikgeworICAgICAgc3RkOjpjZXJyIDw8ICJFcnJvciB3aGlsZSBzZW5kaW5nIGRhdGEgdG8gcGx1Z2luOiAiIDw8IGVyci53aGF0KCkgPDwgc3RkOjplbmRsOworICAgICAgVEhSSUZUX1BDTE9TRShmZCk7CisgICAgICByZXR1cm4gUExVR0lOX0ZBSUxVUkU7CisgICAgfQorCisgICAgLy8gVE9ETzogYmUgcHJlcGFyZWQgZm9yIGhhbmcgb3IgY3Jhc2ggb2YgY2hpbGQgcHJvY2VzcworICAgIGludCByZXQgPSBUSFJJRlRfUENMT1NFKGZkKTsKKyAgICBpZiAoIXJldCkgeworICAgICAgcmV0dXJuIFBMVUdJTl9TVUNDRUVTUzsKKyAgICB9IGVsc2UgeworICAgICAgc3RkOjpjZXJyIDw8ICJwbHVnaW4gcHJvY2VzcyByZXR1cm5lZCBub24gemVybyBleGl0IGNvZGU6ICIgPDwgcmV0IDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiBQTFVHSU5fRkFJTFVSRTsKKyAgICB9CisgIH0KKyAgY2xlYXJfZ2xvYmFsX2NhY2hlKCk7CisgIHJldHVybiBQTFVHSU5fTk9UX0ZPVU5EOworfQorfQorCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luX291dHB1dC5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3BsdWdpbl9vdXRwdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWIyZDFiCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3BsdWdpbl9vdXRwdXQuaApAQCAtMCwwICsxLDM4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9QTFVHSU5fUExVR0lOX09VVFBVVF9ICisjZGVmaW5lIFRfUExVR0lOX1BMVUdJTl9PVVRQVVRfSAorCisjaW5jbHVkZSA8c3RyaW5nPgorCitjbGFzcyB0X3Byb2dyYW07CisKK25hbWVzcGFjZSBwbHVnaW5fb3V0cHV0IHsKKworZW51bSBQbHVnaW5EZWxlZ2F0ZVJlc3VsdCB7CisgIFBMVUdJTl9OT1RfRk9VTkQsCisgIFBMVUdJTl9GQUlMVVJFLAorICBQTFVHSU5fU1VDQ0VFU1MsCit9OworCitQbHVnaW5EZWxlZ2F0ZVJlc3VsdCBkZWxlZ2F0ZVRvUGx1Z2luKHRfcHJvZ3JhbSogcHJvZ3JhbSwgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbnMpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi90eXBlX3V0aWwuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi90eXBlX3V0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTZiNWM2Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3R5cGVfdXRpbC5oCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX1BMVUdJTl9UWVBFX1VUSUxfSAorI2RlZmluZSBUX1BMVUdJTl9UWVBFX1VUSUxfSAorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHBsdWdpbiB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBGcm9tPgorc3RydWN0IFRvVHlwZSB7fTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEZyb20+Cit0eXBlbmFtZSBUb1R5cGU8RnJvbT46OnR5cGUqIGNvbnZlcnRfZm9yd2FyZChjb25zdCBGcm9tJik7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBGcm9tLCB0eXBlbmFtZSBUbz4KK3ZvaWQgY29udmVydChjb25zdCBGcm9tJiwgVG8qKTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEZyb20+Cit0eXBlbmFtZSBUb1R5cGU8RnJvbT46OnR5cGUqIGNvbnZlcnQoY29uc3QgRnJvbSYgZnJvbSk7CisKK2NsYXNzIFR5cGVSZWdpc3RyeTsKK3ZvaWQgc2V0X2dsb2JhbF9jYWNoZShjb25zdCBUeXBlUmVnaXN0cnkmKTsKK3ZvaWQgY2xlYXJfZ2xvYmFsX2NhY2hlKCk7Cit9Cit9Cit9CisKKy8vIGNvbnZlcnNpb24gZnJvbSByYXcgY29tcGlsZXIgdHlwZXMgdG8gcGx1Z2luIHdpcmUgdHlwZQorbmFtZXNwYWNlIHBsdWdpbl9vdXRwdXQgeworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRnJvbSwgdHlwZW5hbWUgVG8+Cit2b2lkIGNvbnZlcnQoRnJvbSogZnJvbSwgVG8mIHRvKTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEZyb20+Cit0eXBlbmFtZSBhcGFjaGU6OnRocmlmdDo6cGx1Z2luOjpUb1R5cGU8RnJvbT46OnR5cGUgY29udmVydChGcm9tKiBmcm9tKTsKKwordm9pZCBnZXRfZ2xvYmFsX2NhY2hlKGFwYWNoZTo6dGhyaWZ0OjpwbHVnaW46OlR5cGVSZWdpc3RyeSYpOwordm9pZCBjbGVhcl9nbG9iYWxfY2FjaGUoKTsKK30KKworI2RlZmluZSBUSFJJRlRfVFlQRV9NQVBQSU5HKFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjbGFzcyBUWVBFOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBuYW1lc3BhY2UgYXBhY2hlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBuYW1lc3BhY2UgdGhyaWZ0IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBuYW1lc3BhY2UgcGx1Z2luIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjbGFzcyBUWVBFOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdHJ1Y3QgVG9UeXBlPCA6OlRZUEU+IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHR5cGVkZWYgVFlQRSB0eXBlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdHJ1Y3QgVG9UeXBlPFRZUEU+IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHR5cGVkZWYgOjpUWVBFIHR5cGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CitUSFJJRlRfVFlQRV9NQVBQSU5HKHRfYmFzZV90eXBlKQorVEhSSUZUX1RZUEVfTUFQUElORyh0X2NvbnN0KQorVEhSSUZUX1RZUEVfTUFQUElORyh0X2NvbnN0X3ZhbHVlKQorVEhSSUZUX1RZUEVfTUFQUElORyh0X2NvbnRhaW5lcikKK1RIUklGVF9UWVBFX01BUFBJTkcodF9kb2MpCitUSFJJRlRfVFlQRV9NQVBQSU5HKHRfZW51bSkKK1RIUklGVF9UWVBFX01BUFBJTkcodF9lbnVtX3ZhbHVlKQorVEhSSUZUX1RZUEVfTUFQUElORyh0X2ZpZWxkKQorVEhSSUZUX1RZUEVfTUFQUElORyh0X2Z1bmN0aW9uKQorVEhSSUZUX1RZUEVfTUFQUElORyh0X2xpc3QpCitUSFJJRlRfVFlQRV9NQVBQSU5HKHRfbWFwKQorVEhSSUZUX1RZUEVfTUFQUElORyh0X3Byb2dyYW0pCitUSFJJRlRfVFlQRV9NQVBQSU5HKHRfc2NvcGUpCitUSFJJRlRfVFlQRV9NQVBQSU5HKHRfc2VydmljZSkKK1RIUklGVF9UWVBFX01BUFBJTkcodF9zZXQpCitUSFJJRlRfVFlQRV9NQVBQSU5HKHRfc3RydWN0KQorVEhSSUZUX1RZUEVfTUFQUElORyh0X3R5cGUpCitUSFJJRlRfVFlQRV9NQVBQSU5HKHRfdHlwZWRlZikKKyN1bmRlZiBUSFJJRlRfVFlQRV9NQVBQSU5HCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3RocmlmdGwubGwgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC90aHJpZnRsLmxsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmNzgzYmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC90aHJpZnRsLmxsCkBAIC0wLDAgKzEsMzYzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogVGhyaWZ0IHNjYW5uZXIuCisgKgorICogVG9rZW5pemVzIGEgdGhyaWZ0IGRlZmluaXRpb24gZmlsZS4KKyAqLworCisleworCisvKiBUaGlzIGlzIHJlZHVuZGFudCB3aXRoIHNvbWUgb2YgdGhlIGZsYWdzIGluIE1ha2VmaWxlLmFtLCBidXQgaXQgd29ya3MKKyAqIHdoZW4gcGVvcGxlIG92ZXJyaWRlIENYWEZMQUdTIHdpdGhvdXQgYmVpbmcgY2FyZWZ1bC4gVGhlIHByYWdtYXMgYXJlCisgKiB0aGUgJ3JpZ2h0JyB3YXkgdG8gZG8gaXQsIGJ1dCBkb24ndCB3b3JrIG9uIG9sZC1lbm91Z2ggR0NDIChpbiBwYXJ0aWN1bGFyCisgKiB0aGUgR0NDIHRoYXQgc2hpcCBvbiBNYWMgT1MgWCAxMC42LjUsICpjb3VudGVyKiB0byB3aGF0IHRoZSBHTlUgZG9jcyBzYXkpCisgKgorICogV2Ugc2hvdWxkIHJldmVydCB0aGUgTWFrZWZpbGUuYW0gY2hhbmdlcyBvbmNlIEFwcGxlIHNoaXBzIGEgcmVhc29uYWJsZQorICogR0NDLgorICovCisjaWZkZWYgX19HTlVDX18KKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVd1bnVzZWQtZnVuY3Rpb24iCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XdW51c2VkLWxhYmVsIgorI2VuZGlmCisKKyNpZmRlZiBfTVNDX1ZFUgorI3ByYWdtYSB3YXJuaW5nKCBwdXNoICkKKworLy8gd2FybmluZyBDNDEwMjogJ2ZpbmRfcnVsZScgOiB1bnJlZmVyZW5jZWQgbGFiZWwKKyNwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQxMDIgKQorCisvLyB3YXJuaW5nIEM0MjY3OiAnYXJndW1lbnQnIDogY29udmVyc2lvbiBmcm9tICdzaXplX3QnIHRvICdpbnQnLCBwb3NzaWJsZSBsb3NzIG9mIGRhdGEKKyNwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQyNjcgKQorCisvLyBhdm9pZCBpc2F0dHkgcmVkZWZpbml0aW9uCisjZGVmaW5lIFlZX05FVkVSX0lOVEVSQUNUSVZFIDEKKworI2RlZmluZSBZWV9OT19VTklTVERfSCAxCisjZW5kaWYKKworI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpZmRlZiBfTVNDX1ZFUgorI2luY2x1ZGUgInRocmlmdC93aW5kb3dzL2NvbmZpZy5oIgorI2VuZGlmCisjaW5jbHVkZSAidGhyaWZ0L21haW4uaCIKKyNpbmNsdWRlICJ0aHJpZnQvY29tbW9uLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dsb2JhbHMuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9wcm9ncmFtLmgiCisKKy8qKgorICogTXVzdCBiZSBpbmNsdWRlZCBBRlRFUiBwYXJzZS90X3Byb2dyYW0uaCwgYnV0IEkgY2FuJ3QgcmVtZW1iZXIgd2h5IGFueW1vcmUKKyAqIGJlY2F1c2UgSSB3cm90ZSB0aGlzIGEgd2hpbGUgYWdvLgorICovCisjaWYgZGVmaW5lZChCSVNPTl9VU0VfUEFSU0VSX0hfRVhURU5TSU9OKQorI2luY2x1ZGUgInRocmlmdC90aHJpZnR5LmgiCisjZWxzZQorI2luY2x1ZGUgInRocmlmdC90aHJpZnR5LmhoIgorI2VuZGlmCisKK3ZvaWQgaW50ZWdlcl9vdmVyZmxvdyhjaGFyKiB0ZXh0KSB7CisgIHl5ZXJyb3IoIlRoaXMgaW50ZWdlciBpcyB0b28gYmlnOiBcIiVzXCJcbiIsIHRleHQpOworICBleGl0KDEpOworfQorCit2b2lkIHVuZXhwZWN0ZWRfdG9rZW4oY2hhciogdGV4dCkgeworICB5eWVycm9yKCJVbmV4cGVjdGVkIHRva2VuIGluIGlucHV0OiBcIiVzXCJcbiIsIHRleHQpOworICBleGl0KDEpOworfQorCislfQorCisvKioKKyAqIFByb3ZpZGVzIHRoZSB5eWxpbmVubyBnbG9iYWwsIHVzZWZ1bCBmb3IgZGVidWdnaW5nIG91dHB1dAorICovCislb3B0aW9uIGxleC1jb21wYXQKKworLyoqCisgKiBPdXIgaW5wdXRzIGFyZSBhbGwgc2luZ2xlIGZpbGVzLCBzbyBubyBuZWVkIGZvciB5eXdyYXAKKyAqLworJW9wdGlvbiBub3l5d3JhcAorCisvKioKKyAqIFdlIGRvbid0IHVzZSBpdCwgYW5kIGl0IGZpcmVzIHVwIHdhcm5pbmdzIGF0IC1XYWxsCisgKi8KKyVvcHRpb24gbm91bnB1dAorCisvKioKKyAqIEhlbHBlciBkZWZpbml0aW9ucywgY29tbWVudHMsIGNvbnN0YW50cywgYW5kIHdoYXRub3QKKyAqLworCitpbnRjb25zdGFudCAgIChbKy1dP1swLTldKykKK2hleGNvbnN0YW50ICAgKFsrLV0/IjB4IlswLTlBLUZhLWZdKykKK2R1YmNvbnN0YW50ICAgKFsrLV0/WzAtOV0qKFwuWzAtOV0rKT8oW2VFXVsrLV0/WzAtOV0rKT8pCitpZGVudGlmaWVyICAgIChbYS16QS1aX10oXC5bYS16QS1aXzAtOV18W2EtekEtWl8wLTldKSopCit3aGl0ZXNwYWNlICAgIChbIFx0XHJcbl0qKQorc2lsbHljb21tICAgICAoIi8qIiIqIioiKi8iKQorbXVsdGljbV9iZWdpbiAoIi8qIikKK2RvY3RleHRfYmVnaW4gKCIvKioiKQorY29tbWVudCAgICAgICAoIi8vIlteXG5dKikKK3VuaXhjb21tZW50ICAgKCIjIlteXG5dKikKK3N5bWJvbCAgICAgICAgKFs6O1wsXHtcfVwoXClcPTw+XFtcXV0pCitsaXRlcmFsX2JlZ2luIChbJ1wiXSkKKworJSUKKwore3doaXRlc3BhY2V9ICAgICAgICAgeyAvKiBkbyBub3RoaW5nICovICAgICAgICAgICAgICAgICB9Cit7c2lsbHljb21tfSAgICAgICAgICB7IC8qIGRvIG5vdGhpbmcgKi8gICAgICAgICAgICAgICAgIH0KKwore2RvY3RleHRfYmVnaW59IHsKKyAgc3RkOjpzdHJpbmcgcGFyc2VkKCIvKioiKTsKKyAgaW50IHN0YXRlID0gMDsgIC8vIDAgPSBub3JtYWwsIDEgPSAiKiIgc2VlbiwgIiovIiBzZWVuCisgIHdoaWxlKHN0YXRlIDwgMikKKyAgeworICAgIGludCBjaCA9IHl5aW5wdXQoKTsKKyAgICBwYXJzZWQucHVzaF9iYWNrKGNoKTsKKyAgICBzd2l0Y2ggKGNoKSB7CisgICAgICBjYXNlIEVPRjoKKyAgICAgICAgeXllcnJvcigiVW5leHBlY3RlZCBlbmQgb2YgZmlsZSBpbiBkb2MtY29tbWVudCBhdCAlZFxuIiwgeXlsaW5lbm8pOworICAgICAgICBleGl0KDEpOworICAgICAgY2FzZSAnKic6CisgICAgICAgIHN0YXRlID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICcvJzoKKyAgICAgICAgc3RhdGUgPSAoc3RhdGUgPT0gMSkgPyAyIDogMDsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBzdGF0ZSA9IDA7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBwZGVidWcoImRvY3RleHQgPSBcIiVzXCJcbiIscGFyc2VkLmNfc3RyKCkpOworCisgLyogVGhpcyBkb2VzIG5vdCBzaG93IHVwIGluIHRoZSBwYXJzZSB0cmVlLiAqLworIC8qIFJhdGhlciwgdGhlIHBhcnNlciB3aWxsIGdyYWIgaXQgb3V0IG9mIHRoZSBnbG9iYWwuICovCisgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgeworICAgIGNsZWFyX2RvY3RleHQoKTsKKyAgICBnX2RvY3RleHQgPSBzdHJkdXAocGFyc2VkLmNfc3RyKCkgKyAzKTsKKyAgICBhc3NlcnQoc3RybGVuKGdfZG9jdGV4dCkgPj0gMik7CisgICAgZ19kb2N0ZXh0W3N0cmxlbihnX2RvY3RleHQpIC0gMl0gPSAnICc7CisgICAgZ19kb2N0ZXh0W3N0cmxlbihnX2RvY3RleHQpIC0gMV0gPSAnXDAnOworICAgIGdfZG9jdGV4dCA9IGNsZWFuX3VwX2RvY3RleHQoZ19kb2N0ZXh0KTsKKyAgICBnX2RvY3RleHRfbGluZW5vID0geXlsaW5lbm87CisgICAgaWYoIChnX3Byb2dyYW1fZG9jdGV4dF9jYW5kaWRhdGUgPT0gTlVMTCkgJiYgKGdfcHJvZ3JhbV9kb2N0ZXh0X3N0YXR1cyA9PSBJTlZBTElEKSl7CisgICAgICBnX3Byb2dyYW1fZG9jdGV4dF9jYW5kaWRhdGUgPSBzdHJkdXAoZ19kb2N0ZXh0KTsKKyAgICAgIGdfcHJvZ3JhbV9kb2N0ZXh0X2xpbmVubyA9IGdfZG9jdGV4dF9saW5lbm87CisgICAgICBnX3Byb2dyYW1fZG9jdGV4dF9zdGF0dXMgPSBTVElMTF9DQU5ESURBVEU7CisgICAgICBwZGVidWcoIiVzIiwicHJvZ3JhbSBkb2N0ZXh0IHNldCB0byBTVElMTF9DQU5ESURBVEUiKTsKKyAgICB9CisgIH0KK30KKwore211bHRpY21fYmVnaW59ICB7IC8qIHBhcnNlZCwgYnV0IHRocm93biBhd2F5ICovCisgIHN0ZDo6c3RyaW5nIHBhcnNlZCgiLyoiKTsKKyAgaW50IHN0YXRlID0gMDsgIC8vIDAgPSBub3JtYWwsIDEgPSAiKiIgc2VlbiwgIiovIiBzZWVuCisgIHdoaWxlKHN0YXRlIDwgMikKKyAgeworICAgIGludCBjaCA9IHl5aW5wdXQoKTsKKyAgICBwYXJzZWQucHVzaF9iYWNrKGNoKTsKKyAgICBzd2l0Y2ggKGNoKSB7CisgICAgICBjYXNlIEVPRjoKKyAgICAgICAgeXllcnJvcigiVW5leHBlY3RlZCBlbmQgb2YgZmlsZSBpbiBtdWx0aWxpbmUgY29tbWVudCBhdCAlZFxuIiwgeXlsaW5lbm8pOworICAgICAgICBleGl0KDEpOworICAgICAgY2FzZSAnKic6CisgICAgICAgIHN0YXRlID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICcvJzoKKyAgICAgICAgc3RhdGUgPSAoc3RhdGUgPT0gMSkgPyAyIDogMDsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBzdGF0ZSA9IDA7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBwZGVidWcoIm11bHRpX2NvbW0gPSBcIiVzXCJcbiIscGFyc2VkLmNfc3RyKCkpOworfQorCit7Y29tbWVudH0gICAgICAgICAgICB7IC8qIGRvIG5vdGhpbmcgKi8gICAgICAgICAgICAgICAgIH0KK3t1bml4Y29tbWVudH0gICAgICAgIHsgLyogZG8gbm90aGluZyAqLyAgICAgICAgICAgICAgICAgfQorCit7c3ltYm9sfSAgICAgICAgICAgICB7IHJldHVybiB5eXRleHRbMF07ICAgICAgICAgICAgICAgIH0KKyIqIiAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIHl5dGV4dFswXTsgICAgICAgICAgICAgICAgfQorCisiZmFsc2UiICAgICAgICAgICAgICB7IHl5bHZhbC5pY29uc3Q9MDsgcmV0dXJuIHRva19pbnRfY29uc3RhbnQ7IH0KKyJ0cnVlIiAgICAgICAgICAgICAgIHsgeXlsdmFsLmljb25zdD0xOyByZXR1cm4gdG9rX2ludF9jb25zdGFudDsgfQorCisibmFtZXNwYWNlIiAgICAgICAgICB7IHJldHVybiB0b2tfbmFtZXNwYWNlOyAgICAgICAgICAgIH0KKyJjcHBfbmFtZXNwYWNlIiAgICAgIHsgZXJyb3JfdW5zdXBwb3J0ZWRfbmFtZXNwYWNlX2RlY2woImNwcCIpOyAvKiBkbyBub3RoaW5nICovIH0KKyJjcHBfaW5jbHVkZSIgICAgICAgIHsgcmV0dXJuIHRva19jcHBfaW5jbHVkZTsgICAgICAgICAgfQorImNwcF90eXBlIiAgICAgICAgICAgeyByZXR1cm4gdG9rX2NwcF90eXBlOyAgICAgICAgICAgICB9CisiamF2YV9wYWNrYWdlIiAgICAgICB7IGVycm9yX3Vuc3VwcG9ydGVkX25hbWVzcGFjZV9kZWNsKCJqYXZhX3BhY2thZ2UiLCAiamF2YSIpOyAvKiBkbyBub3RoaW5nICovIH0KKyJjb2NvYV9wcmVmaXgiICAgICAgIHsgZXJyb3JfdW5zdXBwb3J0ZWRfbmFtZXNwYWNlX2RlY2woImNvY29hX3ByZWZpeCIsICJjb2NvYSIpOyAvKiBkbyBub3RoaW5nICovIH0KKyJjc2hhcnBfbmFtZXNwYWNlIiAgIHsgZXJyb3JfdW5zdXBwb3J0ZWRfbmFtZXNwYWNlX2RlY2woImNzaGFycCIpOyAvKiBkbyBub3RoaW5nICovIH0KKyJkZWxwaGlfbmFtZXNwYWNlIiAgIHsgZXJyb3JfdW5zdXBwb3J0ZWRfbmFtZXNwYWNlX2RlY2woImRlbHBoaSIpOyAvKiBkbyBub3RoaW5nICovIH0KKyJwaHBfbmFtZXNwYWNlIiAgICAgIHsgZXJyb3JfdW5zdXBwb3J0ZWRfbmFtZXNwYWNlX2RlY2woInBocCIpOyAvKiBkbyBub3RoaW5nICovIH0KKyJweV9tb2R1bGUiICAgICAgICAgIHsgZXJyb3JfdW5zdXBwb3J0ZWRfbmFtZXNwYWNlX2RlY2woInB5X21vZHVsZSIsICJweSIpOyAvKiBkbyBub3RoaW5nICovIH0KKyJwZXJsX3BhY2thZ2UiICAgICAgIHsgZXJyb3JfdW5zdXBwb3J0ZWRfbmFtZXNwYWNlX2RlY2woInBlcmxfcGFja2FnZSIsICJwZXJsIik7IC8qIGRvIG5vdGhpbmcgKi8gfQorInJ1YnlfbmFtZXNwYWNlIiAgICAgeyBlcnJvcl91bnN1cHBvcnRlZF9uYW1lc3BhY2VfZGVjbCgicnVieSIpOyAvKiBkbyBub3RoaW5nICovIH0KKyJzbWFsbHRhbGtfY2F0ZWdvcnkiIHsgZXJyb3JfdW5zdXBwb3J0ZWRfbmFtZXNwYWNlX2RlY2woInNtYWxsdGFsa19jYXRlZ29yeSIsICJzbWFsbHRhbGsuY2F0ZWdvcnkiKTsgLyogZG8gbm90aGluZyAqLyB9Cisic21hbGx0YWxrX3ByZWZpeCIgICB7IGVycm9yX3Vuc3VwcG9ydGVkX25hbWVzcGFjZV9kZWNsKCJzbWFsbHRhbGtfY2F0ZWdvcnkiLCAic21hbGx0YWxrLmNhdGVnb3J5Iik7IC8qIGRvIG5vdGhpbmcgKi8gfQorInhzZF9hbGwiICAgICAgICAgICAgeyByZXR1cm4gdG9rX3hzZF9hbGw7ICAgICAgICAgICAgICB9CisieHNkX29wdGlvbmFsIiAgICAgICB7IHJldHVybiB0b2tfeHNkX29wdGlvbmFsOyAgICAgICAgIH0KKyJ4c2RfbmlsbGFibGUiICAgICAgIHsgcmV0dXJuIHRva194c2RfbmlsbGFibGU7ICAgICAgICAgfQorInhzZF9uYW1lc3BhY2UiICAgICAgeyBlcnJvcl91bnN1cHBvcnRlZF9uYW1lc3BhY2VfZGVjbCgieHNkIik7IC8qIGRvIG5vdGhpbmcgKi8gfQorInhzZF9hdHRycyIgICAgICAgICAgeyByZXR1cm4gdG9rX3hzZF9hdHRyczsgICAgICAgICAgICB9CisiaW5jbHVkZSIgICAgICAgICAgICB7IHJldHVybiB0b2tfaW5jbHVkZTsgICAgICAgICAgICAgIH0KKyJ2b2lkIiAgICAgICAgICAgICAgIHsgcmV0dXJuIHRva192b2lkOyAgICAgICAgICAgICAgICAgfQorImJvb2wiICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX2Jvb2w7ICAgICAgICAgICAgICAgICB9CisiYnl0ZSIgICAgICAgICAgICAgICB7CisgIGVtaXRfYnl0ZV90eXBlX3dhcm5pbmcoKTsKKyAgcmV0dXJuIHRva19pODsKK30KKyJpOCIgICAgICAgICAgICAgICAgIHsgcmV0dXJuIHRva19pODsgICAgICAgICAgICAgICAgICAgfQorImkxNiIgICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX2kxNjsgICAgICAgICAgICAgICAgICB9CisiaTMyIiAgICAgICAgICAgICAgICB7IHJldHVybiB0b2tfaTMyOyAgICAgICAgICAgICAgICAgIH0KKyJpNjQiICAgICAgICAgICAgICAgIHsgcmV0dXJuIHRva19pNjQ7ICAgICAgICAgICAgICAgICAgfQorImRvdWJsZSIgICAgICAgICAgICAgeyByZXR1cm4gdG9rX2RvdWJsZTsgICAgICAgICAgICAgICB9Cisic3RyaW5nIiAgICAgICAgICAgICB7IHJldHVybiB0b2tfc3RyaW5nOyAgICAgICAgICAgICAgIH0KKyJiaW5hcnkiICAgICAgICAgICAgIHsgcmV0dXJuIHRva19iaW5hcnk7ICAgICAgICAgICAgICAgfQorInNsaXN0IiB7CisgIHB3YXJuaW5nKDAsICJcInNsaXN0XCIgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIGNvbXBpbGVyIHZlcnNpb24uICBUaGlzIHR5cGUgc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGggXCJzdHJpbmdcIi5cbiIpOworICByZXR1cm4gdG9rX3NsaXN0OworfQorInNlbnVtIiB7CisgIHB3YXJuaW5nKDAsICJcInNlbnVtXCIgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIGNvbXBpbGVyIHZlcnNpb24uICBUaGlzIHR5cGUgc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGggXCJzdHJpbmdcIi5cbiIpOworICByZXR1cm4gdG9rX3NlbnVtOworfQorIm1hcCIgICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX21hcDsgICAgICAgICAgICAgICAgICB9CisibGlzdCIgICAgICAgICAgICAgICB7IHJldHVybiB0b2tfbGlzdDsgICAgICAgICAgICAgICAgIH0KKyJzZXQiICAgICAgICAgICAgICAgIHsgcmV0dXJuIHRva19zZXQ7ICAgICAgICAgICAgICAgICAgfQorIm9uZXdheSIgICAgICAgICAgICAgeyByZXR1cm4gdG9rX29uZXdheTsgICAgICAgICAgICAgICB9CisidHlwZWRlZiIgICAgICAgICAgICB7IHJldHVybiB0b2tfdHlwZWRlZjsgICAgICAgICAgICAgIH0KKyJzdHJ1Y3QiICAgICAgICAgICAgIHsgcmV0dXJuIHRva19zdHJ1Y3Q7ICAgICAgICAgICAgICAgfQorInVuaW9uIiAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX3VuaW9uOyAgICAgICAgICAgICAgICB9CisiZXhjZXB0aW9uIiAgICAgICAgICB7IHJldHVybiB0b2tfeGNlcHRpb247ICAgICAgICAgICAgIH0KKyJleHRlbmRzIiAgICAgICAgICAgIHsgcmV0dXJuIHRva19leHRlbmRzOyAgICAgICAgICAgICAgfQorInRocm93cyIgICAgICAgICAgICAgeyByZXR1cm4gdG9rX3Rocm93czsgICAgICAgICAgICAgICB9Cisic2VydmljZSIgICAgICAgICAgICB7IHJldHVybiB0b2tfc2VydmljZTsgICAgICAgICAgICAgIH0KKyJlbnVtIiAgICAgICAgICAgICAgIHsgcmV0dXJuIHRva19lbnVtOyAgICAgICAgICAgICAgICAgfQorImNvbnN0IiAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX2NvbnN0OyAgICAgICAgICAgICAgICB9CisicmVxdWlyZWQiICAgICAgICAgICB7IHJldHVybiB0b2tfcmVxdWlyZWQ7ICAgICAgICAgICAgIH0KKyJvcHRpb25hbCIgICAgICAgICAgIHsgcmV0dXJuIHRva19vcHRpb25hbDsgICAgICAgICAgICAgfQorImFzeW5jIiB7CisgIHB3YXJuaW5nKDAsICJcImFzeW5jXCIgaXMgZGVwcmVjYXRlZC4gIEl0IGlzIGNhbGxlZCBcIm9uZXdheVwiIG5vdy5cbiIpOworICByZXR1cm4gdG9rX29uZXdheTsKK30KKyImIiAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIHRva19yZWZlcmVuY2U7ICAgICAgICAgICAgfQorCit7aW50Y29uc3RhbnR9IHsKKyAgZXJybm8gPSAwOworICB5eWx2YWwuaWNvbnN0ID0gc3RydG9sbCh5eXRleHQsIE5VTEwsIDEwKTsKKyAgaWYgKGVycm5vID09IEVSQU5HRSkgeworICAgIGludGVnZXJfb3ZlcmZsb3coeXl0ZXh0KTsKKyAgfQorICByZXR1cm4gdG9rX2ludF9jb25zdGFudDsKK30KKwore2hleGNvbnN0YW50fSB7CisgIGVycm5vID0gMDsKKyAgY2hhciBzaWduID0geXl0ZXh0WzBdOworICBpbnQgc2hpZnQgPSBzaWduID09ICcwJyA/IDIgOiAzOworICB5eWx2YWwuaWNvbnN0ID0gc3RydG9sbCh5eXRleHQrc2hpZnQsIE5VTEwsIDE2KTsKKyAgaWYgKHNpZ24gPT0gJy0nKSB7CisgICAgeXlsdmFsLmljb25zdCA9IC15eWx2YWwuaWNvbnN0OworICB9CisgIGlmIChlcnJubyA9PSBFUkFOR0UpIHsKKyAgICBpbnRlZ2VyX292ZXJmbG93KHl5dGV4dCk7CisgIH0KKyAgcmV0dXJuIHRva19pbnRfY29uc3RhbnQ7Cit9CisKK3tpZGVudGlmaWVyfSB7CisgIHl5bHZhbC5pZCA9IHN0cmR1cCh5eXRleHQpOworICByZXR1cm4gdG9rX2lkZW50aWZpZXI7Cit9CisKK3tkdWJjb25zdGFudH0geworIC8qIERlbGliZXJhdGVseSBwbGFjZWQgYWZ0ZXIgaWRlbnRpZmllciwgc2luY2UgImUxMCIgaXMgTk9UIGEgZG91YmxlIGxpdGVyYWwgKFRIUklGVC0zNDc3KSAqLworICB5eWx2YWwuZGNvbnN0ID0gYXRvZih5eXRleHQpOworICByZXR1cm4gdG9rX2R1Yl9jb25zdGFudDsKK30KKwore2xpdGVyYWxfYmVnaW59IHsKKyAgY2hhciBtYXJrID0geXl0ZXh0WzBdOworICBzdGQ6OnN0cmluZyByZXN1bHQ7CisgIGZvcig7OykKKyAgeworICAgIGludCBjaCA9IHl5aW5wdXQoKTsKKyAgICBzd2l0Y2ggKGNoKSB7CisgICAgICBjYXNlIEVPRjoKKyAgICAgICAgeXllcnJvcigiRW5kIG9mIGZpbGUgd2hpbGUgcmVhZCBzdHJpbmcgYXQgJWRcbiIsIHl5bGluZW5vKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICAgIGNhc2UgJ1xuJzoKKyAgICAgICAgeXllcnJvcigiRW5kIG9mIGxpbmUgd2hpbGUgcmVhZCBzdHJpbmcgYXQgJWRcbiIsIHl5bGluZW5vIC0gMSk7CisgICAgICAgIGV4aXQoMSk7CisgICAgICBjYXNlICdcXCc6CisgICAgICAgIGNoID0geXlpbnB1dCgpOworICAgICAgICBzd2l0Y2ggKGNoKSB7CisgICAgICAgICAgY2FzZSAncic6CisgICAgICAgICAgICByZXN1bHQucHVzaF9iYWNrKCdccicpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgY2FzZSAnbic6CisgICAgICAgICAgICByZXN1bHQucHVzaF9iYWNrKCdcbicpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgY2FzZSAndCc6CisgICAgICAgICAgICByZXN1bHQucHVzaF9iYWNrKCdcdCcpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgY2FzZSAnIic6CisgICAgICAgICAgICByZXN1bHQucHVzaF9iYWNrKCciJyk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICBjYXNlICdcJyc6CisgICAgICAgICAgICByZXN1bHQucHVzaF9iYWNrKCdcJycpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgY2FzZSAnXFwnOgorICAgICAgICAgICAgcmVzdWx0LnB1c2hfYmFjaygnXFwnKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB5eWVycm9yKCJCYWQgZXNjYXBlIGNoYXJhY3RlclxuIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBpZiAoY2ggPT0gbWFyaykgeworICAgICAgICAgIHl5bHZhbC5pZCA9IHN0cmR1cChyZXN1bHQuY19zdHIoKSk7CisgICAgICAgICAgcmV0dXJuIHRva19saXRlcmFsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soY2gpOworICAgICAgICB9CisgICAgfQorICB9Cit9CisKKworLiB7CisgIHVuZXhwZWN0ZWRfdG9rZW4oeXl0ZXh0KTsKK30KKworJSUKKworI2lmZGVmIF9NU0NfVkVSCisjcHJhZ21hIHdhcm5pbmcoIHBvcCApCisjZW5kaWYKKworLyogdmltOiBmaWxldHlwZT1sZXgKKyovCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC90aHJpZnR5Lnl5IGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvdGhyaWZ0eS55eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjM0YWRmCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvdGhyaWZ0eS55eQpAQCAtMCwwICsxLDEyMDEgQEAKKyVjb2RlIHJlcXVpcmVzIHsKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9wcm9ncmFtLmgiCit9CisleworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqIFRocmlmdCBwYXJzZXIuCisgKgorICogVGhpcyBwYXJzZXIgaXMgdXNlZCBvbiBhIHRocmlmdCBkZWZpbml0aW9uIGZpbGUuCisgKgorICovCisKKyNpZm5kZWYgX19TVERDX0xJTUlUX01BQ1JPUworI2RlZmluZSBfX1NURENfTElNSVRfTUFDUk9TCisjZW5kaWYKKyNpZm5kZWYgX19TVERDX0ZPUk1BVF9NQUNST1MKKyNkZWZpbmUgX19TVERDX0ZPUk1BVF9NQUNST1MKKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWZuZGVmIF9NU0NfVkVSCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbHNlCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpZmRlZiBfTVNDX1ZFUgorI2luY2x1ZGUgInRocmlmdC93aW5kb3dzL2NvbmZpZy5oIgorI2VuZGlmCisjaW5jbHVkZSAidGhyaWZ0L21haW4uaCIKKyNpbmNsdWRlICJ0aHJpZnQvY29tbW9uLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dsb2JhbHMuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9wcm9ncmFtLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3Rfc2NvcGUuaCIKKworI2lmZGVmIF9NU0NfVkVSCisvL3dhcm5pbmcgQzQwNjU6IHN3aXRjaCBzdGF0ZW1lbnQgY29udGFpbnMgJ2RlZmF1bHQnIGJ1dCBubyAnY2FzZScgbGFiZWxzCisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0MDY1KQorI2VuZGlmCisKKy8qKgorICogVGhpcyBnbG9iYWwgdmFyaWFibGUgaXMgdXNlZCBmb3IgYXV0b21hdGljIG51bWJlcmluZyBvZiBmaWVsZCBpbmRpY2VzIGV0Yy4KKyAqIHdoZW4gcGFyc2luZyB0aGUgbWVtYmVycyBvZiBhIHN0cnVjdC4gRmllbGQgdmFsdWVzIGFyZSBhdXRvbWF0aWNhbGx5CisgKiBhc3NpZ25lZCBzdGFydGluZyBmcm9tIC0xIGFuZCB3b3JraW5nIHRoZWlyIHdheSBkb3duLgorICovCitpbnQgeV9maWVsZF92YWwgPSAtMTsKKy8qKgorICogVGhpcyBnbG9iYWwgdmFyaWFibGUgaXMgdXNlZCBmb3IgYXV0b21hdGljIG51bWJlcmluZyBvZiBlbnVtIHZhbHVlcy4KKyAqIHlfZW51bV92YWwgaXMgdGhlIGxhc3QgdmFsdWUgYXNzaWduZWQ7IHRoZSBuZXh0IGF1dG8tYXNzaWduZWQgdmFsdWUgd2lsbCBiZQorICogeV9lbnVtX3ZhbCsxLCBhbmQgdGhlbiBpdCBjb250aW51ZXMgd29ya2luZyB1cHdhcmRzLiAgRXhwbGljaXRseSBzcGVjaWZpZWQKKyAqIGVudW0gdmFsdWVzIHJlc2V0IHlfZW51bV92YWwgdG8gdGhhdCB2YWx1ZS4KKyAqLworaW50MzJfdCB5X2VudW1fdmFsID0gLTE7CitpbnQgZ19hcmdsaXN0ID0gMDsKK2NvbnN0IGludCBzdHJ1Y3RfaXNfc3RydWN0ID0gMDsKK2NvbnN0IGludCBzdHJ1Y3RfaXNfdW5pb24gPSAxOworCislfQorCisvKioKKyAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgYnkgdGhlIHBhcnNlciB0byBob2xkIHRoZSBkYXRhIHR5cGVzIGFzc29jaWF0ZWQgd2l0aAorICogdmFyaW91cyBwYXJzZSBub2Rlcy4KKyAqLworJXVuaW9uIHsKKyAgY2hhciogICAgICAgICAgaWQ7CisgIGludDY0X3QgICAgICAgIGljb25zdDsKKyAgZG91YmxlICAgICAgICAgZGNvbnN0OworICBib29sICAgICAgICAgICB0Ym9vbDsKKyAgdF9kb2MqICAgICAgICAgdGRvYzsKKyAgdF90eXBlKiAgICAgICAgdHR5cGU7CisgIHRfYmFzZV90eXBlKiAgIHRiYXNlOworICB0X3R5cGVkZWYqICAgICB0dHlwZWRlZjsKKyAgdF9lbnVtKiAgICAgICAgdGVudW07CisgIHRfZW51bV92YWx1ZSogIHRlbnVtdjsKKyAgdF9jb25zdCogICAgICAgdGNvbnN0OworICB0X2NvbnN0X3ZhbHVlKiB0Y29uc3R2OworICB0X3N0cnVjdCogICAgICB0c3RydWN0OworICB0X3NlcnZpY2UqICAgICB0c2VydmljZTsKKyAgdF9mdW5jdGlvbiogICAgdGZ1bmN0aW9uOworICB0X2ZpZWxkKiAgICAgICB0ZmllbGQ7CisgIGNoYXIqICAgICAgICAgIGR0ZXh0OworICB0X2ZpZWxkOjplX3JlcSBlcmVxOworICB0X2Fubm90YXRpb24qICB0YW5ub3Q7CisgIHRfZmllbGRfaWQgICAgIHRmaWVsZGlkOworfQorCisvKioKKyAqIFN0cmluZ3MgaWRlbnRpZmllcgorICovCisldG9rZW48aWQ+ICAgICB0b2tfaWRlbnRpZmllcgorJXRva2VuPGlkPiAgICAgdG9rX2xpdGVyYWwKKyV0b2tlbjxkdGV4dD4gIHRva19kb2N0ZXh0CisKKy8qKgorICogQ29uc3RhbnQgdmFsdWVzCisgKi8KKyV0b2tlbjxpY29uc3Q+IHRva19pbnRfY29uc3RhbnQKKyV0b2tlbjxkY29uc3Q+IHRva19kdWJfY29uc3RhbnQKKworLyoqCisgKiBIZWFkZXIga2V5d29yZHMKKyAqLworJXRva2VuIHRva19pbmNsdWRlCisldG9rZW4gdG9rX25hbWVzcGFjZQorJXRva2VuIHRva19jcHBfaW5jbHVkZQorJXRva2VuIHRva19jcHBfdHlwZQorJXRva2VuIHRva194c2RfYWxsCisldG9rZW4gdG9rX3hzZF9vcHRpb25hbAorJXRva2VuIHRva194c2RfbmlsbGFibGUKKyV0b2tlbiB0b2tfeHNkX2F0dHJzCisKKy8qKgorICogQmFzZSBkYXRhdHlwZSBrZXl3b3JkcworICovCisldG9rZW4gdG9rX3ZvaWQKKyV0b2tlbiB0b2tfYm9vbAorJXRva2VuIHRva19zdHJpbmcKKyV0b2tlbiB0b2tfYmluYXJ5CisldG9rZW4gdG9rX3NsaXN0CisldG9rZW4gdG9rX3NlbnVtCisldG9rZW4gdG9rX2k4CisldG9rZW4gdG9rX2kxNgorJXRva2VuIHRva19pMzIKKyV0b2tlbiB0b2tfaTY0CisldG9rZW4gdG9rX2RvdWJsZQorCisvKioKKyAqIENvbXBsZXggdHlwZSBrZXl3b3JkcworICovCisldG9rZW4gdG9rX21hcAorJXRva2VuIHRva19saXN0CisldG9rZW4gdG9rX3NldAorCisvKioKKyAqIEZ1bmN0aW9uIG1vZGlmaWVycworICovCisldG9rZW4gdG9rX29uZXdheQorCisvKioKKyAqIFRocmlmdCBsYW5ndWFnZSBrZXl3b3JkcworICovCisldG9rZW4gdG9rX3R5cGVkZWYKKyV0b2tlbiB0b2tfc3RydWN0CisldG9rZW4gdG9rX3hjZXB0aW9uCisldG9rZW4gdG9rX3Rocm93cworJXRva2VuIHRva19leHRlbmRzCisldG9rZW4gdG9rX3NlcnZpY2UKKyV0b2tlbiB0b2tfZW51bQorJXRva2VuIHRva19jb25zdAorJXRva2VuIHRva19yZXF1aXJlZAorJXRva2VuIHRva19vcHRpb25hbAorJXRva2VuIHRva191bmlvbgorJXRva2VuIHRva19yZWZlcmVuY2UKKworLyoqCisgKiBHcmFtbWFyIG5vZGVzCisgKi8KKworJXR5cGU8dHR5cGU+ICAgICBCYXNlVHlwZQorJXR5cGU8dHR5cGU+ICAgICBTaW1wbGVCYXNlVHlwZQorJXR5cGU8dHR5cGU+ICAgICBDb250YWluZXJUeXBlCisldHlwZTx0dHlwZT4gICAgIFNpbXBsZUNvbnRhaW5lclR5cGUKKyV0eXBlPHR0eXBlPiAgICAgTWFwVHlwZQorJXR5cGU8dHR5cGU+ICAgICBTZXRUeXBlCisldHlwZTx0dHlwZT4gICAgIExpc3RUeXBlCisKKyV0eXBlPHRkb2M+ICAgICAgRGVmaW5pdGlvbgorJXR5cGU8dHR5cGU+ICAgICBUeXBlRGVmaW5pdGlvbgorCisldHlwZTx0dHlwZWRlZj4gIFR5cGVkZWYKKworJXR5cGU8dHR5cGU+ICAgICBUeXBlQW5ub3RhdGlvbnMKKyV0eXBlPHR0eXBlPiAgICAgVHlwZUFubm90YXRpb25MaXN0CisldHlwZTx0YW5ub3Q+ICAgIFR5cGVBbm5vdGF0aW9uCisldHlwZTxpZD4gICAgICAgIFR5cGVBbm5vdGF0aW9uVmFsdWUKKworJXR5cGU8dGZpZWxkPiAgICBGaWVsZAorJXR5cGU8dGZpZWxkaWQ+ICBGaWVsZElkZW50aWZpZXIKKyV0eXBlPGVyZXE+ICAgICAgRmllbGRSZXF1aXJlZG5lc3MKKyV0eXBlPHR0eXBlPiAgICAgRmllbGRUeXBlCisldHlwZTx0Y29uc3R2PiAgIEZpZWxkVmFsdWUKKyV0eXBlPHRzdHJ1Y3Q+ICAgRmllbGRMaXN0CisldHlwZTx0Ym9vbD4gICAgIEZpZWxkUmVmZXJlbmNlCisKKyV0eXBlPHRlbnVtPiAgICAgRW51bQorJXR5cGU8dGVudW0+ICAgICBFbnVtRGVmTGlzdAorJXR5cGU8dGVudW12PiAgICBFbnVtRGVmCisldHlwZTx0ZW51bXY+ICAgIEVudW1WYWx1ZQorCisldHlwZTx0dHlwZWRlZj4gIFNlbnVtCisldHlwZTx0YmFzZT4gICAgIFNlbnVtRGVmTGlzdAorJXR5cGU8aWQ+ICAgICAgICBTZW51bURlZgorCisldHlwZTx0Y29uc3Q+ICAgIENvbnN0CisldHlwZTx0Y29uc3R2PiAgIENvbnN0VmFsdWUKKyV0eXBlPHRjb25zdHY+ICAgQ29uc3RMaXN0CisldHlwZTx0Y29uc3R2PiAgIENvbnN0TGlzdENvbnRlbnRzCisldHlwZTx0Y29uc3R2PiAgIENvbnN0TWFwCisldHlwZTx0Y29uc3R2PiAgIENvbnN0TWFwQ29udGVudHMKKworJXR5cGU8aWNvbnN0PiAgICBTdHJ1Y3RIZWFkCisldHlwZTx0c3RydWN0PiAgIFN0cnVjdAorJXR5cGU8dHN0cnVjdD4gICBYY2VwdGlvbgorJXR5cGU8dHNlcnZpY2U+ICBTZXJ2aWNlCisKKyV0eXBlPHRmdW5jdGlvbj4gRnVuY3Rpb24KKyV0eXBlPHR0eXBlPiAgICAgRnVuY3Rpb25UeXBlCisldHlwZTx0c2VydmljZT4gIEZ1bmN0aW9uTGlzdAorCisldHlwZTx0c3RydWN0PiAgIFRocm93cworJXR5cGU8dHNlcnZpY2U+ICBFeHRlbmRzCisldHlwZTx0Ym9vbD4gICAgIE9uZXdheQorJXR5cGU8dGJvb2w+ICAgICBYc2RBbGwKKyV0eXBlPHRib29sPiAgICAgWHNkT3B0aW9uYWwKKyV0eXBlPHRib29sPiAgICAgWHNkTmlsbGFibGUKKyV0eXBlPHRzdHJ1Y3Q+ICAgWHNkQXR0cmlidXRlcworJXR5cGU8aWQ+ICAgICAgICBDcHBUeXBlCisKKyV0eXBlPGR0ZXh0PiAgICAgQ2FwdHVyZURvY1RleHQKKworJSUKKworLyoqCisgKiBUaHJpZnQgR3JhbW1hciBJbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBGb3IgdGhlIG1vc3QgcGFydCB0aGlzIHNvdXJjZSBmaWxlIHdvcmtzIGl0cyB3YXkgdG9wIGRvd24gZnJvbSB3aGF0IHlvdQorICogbWlnaHQgZXhwZWN0IHRvIGZpbmQgaW4gYSB0eXBpY2FsIC50aHJpZnQgZmlsZSwgaS5lLiB0eXBlIGRlZmluaXRpb25zIGFuZAorICogbmFtZXNwYWNlcyB1cCB0b3AgZm9sbG93ZWQgYnkgc2VydmljZSBkZWZpbml0aW9ucyB1c2luZyB0aG9zZSB0eXBlcy4KKyAqLworCitQcm9ncmFtOgorICBIZWFkZXJMaXN0IERlZmluaXRpb25MaXN0CisgICAgeworICAgICAgcGRlYnVnKCJQcm9ncmFtIC0+IEhlYWRlcnMgRGVmaW5pdGlvbkxpc3QiKTsKKyAgICAgIGlmKChnX3Byb2dyYW1fZG9jdGV4dF9jYW5kaWRhdGUgIT0gTlVMTCkgJiYgKGdfcHJvZ3JhbV9kb2N0ZXh0X3N0YXR1cyAhPSBBTFJFQURZX1BST0NFU1NFRCkpCisgICAgICB7CisgICAgICAgIGdfcHJvZ3JhbS0+c2V0X2RvYyhnX3Byb2dyYW1fZG9jdGV4dF9jYW5kaWRhdGUpOworICAgICAgICBnX3Byb2dyYW1fZG9jdGV4dF9zdGF0dXMgPSBBTFJFQURZX1BST0NFU1NFRDsKKyAgICAgIH0KKyAgICAgIGNsZWFyX2RvY3RleHQoKTsKKyAgICB9CisKK0NhcHR1cmVEb2NUZXh0OgorICAgIHsKKyAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgeworICAgICAgICAkJCA9IGdfZG9jdGV4dDsKKyAgICAgICAgZ19kb2N0ZXh0ID0gTlVMTDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICQkID0gTlVMTDsKKyAgICAgIH0KKyAgICB9CisKKy8qIFRPRE8oZHJlaXNzKTogVHJ5IHRvIERlc3Ryb3lEb2NUZXh0IGluIGFsbCBzb3J0cyBvciByYW5kb20gcGxhY2VzLiAqLworRGVzdHJveURvY1RleHQ6CisgICAgeworICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7CisgICAgICAgIGNsZWFyX2RvY3RleHQoKTsKKyAgICAgIH0KKyAgICB9CisKKy8qIFdlIGhhdmUgdG8gRGVzdHJveURvY1RleHQgaGVyZSwgb3RoZXJ3aXNlIGl0IGNhdGNoZXMgdGhlIGRvY3RleHQKKyAgIG9uIHRoZSBmaXJzdCByZWFsIGVsZW1lbnQuICovCitIZWFkZXJMaXN0OgorICBIZWFkZXJMaXN0IERlc3Ryb3lEb2NUZXh0IEhlYWRlcgorICAgIHsKKyAgICAgIHBkZWJ1ZygiSGVhZGVyTGlzdCAtPiBIZWFkZXJMaXN0IEhlYWRlciIpOworICAgIH0KK3wKKyAgICB7CisgICAgICBwZGVidWcoIkhlYWRlckxpc3QgLT4gIik7CisgICAgfQorCitIZWFkZXI6CisgIEluY2x1ZGUKKyAgICB7CisgICAgICBwZGVidWcoIkhlYWRlciAtPiBJbmNsdWRlIik7CisgICAgfQorfCB0b2tfbmFtZXNwYWNlIHRva19pZGVudGlmaWVyIHRva19pZGVudGlmaWVyIFR5cGVBbm5vdGF0aW9ucworICAgIHsKKyAgICAgIHBkZWJ1ZygiSGVhZGVyIC0+IHRva19uYW1lc3BhY2UgdG9rX2lkZW50aWZpZXIgdG9rX2lkZW50aWZpZXIiKTsKKyAgICAgIGRlY2xhcmVfdmFsaWRfcHJvZ3JhbV9kb2N0ZXh0KCk7CisgICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKKyAgICAgICAgZ19wcm9ncmFtLT5zZXRfbmFtZXNwYWNlKCQyLCAkMyk7CisgICAgICB9CisgICAgICBpZiAoJDQgIT0gTlVMTCkgeworICAgICAgICBnX3Byb2dyYW0tPnNldF9uYW1lc3BhY2VfYW5ub3RhdGlvbnMoJDIsICQ0LT5hbm5vdGF0aW9uc18pOworICAgICAgICBkZWxldGUgJDQ7CisgICAgICB9CisgICAgfQorfCB0b2tfbmFtZXNwYWNlICcqJyB0b2tfaWRlbnRpZmllcgorICAgIHsKKyAgICAgIHBkZWJ1ZygiSGVhZGVyIC0+IHRva19uYW1lc3BhY2UgKiB0b2tfaWRlbnRpZmllciIpOworICAgICAgZGVjbGFyZV92YWxpZF9wcm9ncmFtX2RvY3RleHQoKTsKKyAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgeworICAgICAgICBnX3Byb2dyYW0tPnNldF9uYW1lc3BhY2UoIioiLCAkMyk7CisgICAgICB9CisgICAgfQorfCB0b2tfY3BwX2luY2x1ZGUgdG9rX2xpdGVyYWwKKyAgICB7CisgICAgICBwZGVidWcoIkhlYWRlciAtPiB0b2tfY3BwX2luY2x1ZGUgdG9rX2xpdGVyYWwiKTsKKyAgICAgIGRlY2xhcmVfdmFsaWRfcHJvZ3JhbV9kb2N0ZXh0KCk7CisgICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKKyAgICAgICAgZ19wcm9ncmFtLT5hZGRfY3BwX2luY2x1ZGUoJDIpOworICAgICAgfQorICAgIH0KKworSW5jbHVkZToKKyAgdG9rX2luY2x1ZGUgdG9rX2xpdGVyYWwKKyAgICB7CisgICAgICBwZGVidWcoIkluY2x1ZGUgLT4gdG9rX2luY2x1ZGUgdG9rX2xpdGVyYWwiKTsKKyAgICAgIGRlY2xhcmVfdmFsaWRfcHJvZ3JhbV9kb2N0ZXh0KCk7CisgICAgICBpZiAoZ19wYXJzZV9tb2RlID09IElOQ0xVREVTKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIHBhdGggPSBpbmNsdWRlX2ZpbGUoc3RkOjpzdHJpbmcoJDIpKTsKKyAgICAgICAgaWYgKCFwYXRoLmVtcHR5KCkpIHsKKyAgICAgICAgICBnX3Byb2dyYW0tPmFkZF9pbmNsdWRlKHBhdGgsIHN0ZDo6c3RyaW5nKCQyKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKK0RlZmluaXRpb25MaXN0OgorICBEZWZpbml0aW9uTGlzdCBDYXB0dXJlRG9jVGV4dCBEZWZpbml0aW9uCisgICAgeworICAgICAgcGRlYnVnKCJEZWZpbml0aW9uTGlzdCAtPiBEZWZpbml0aW9uTGlzdCBEZWZpbml0aW9uIik7CisgICAgICBpZiAoJDIgIT0gTlVMTCAmJiAkMyAhPSBOVUxMKSB7CisgICAgICAgICQzLT5zZXRfZG9jKCQyKTsKKyAgICAgIH0KKyAgICB9Cit8CisgICAgeworICAgICAgcGRlYnVnKCJEZWZpbml0aW9uTGlzdCAtPiAiKTsKKyAgICB9CisKK0RlZmluaXRpb246CisgIENvbnN0CisgICAgeworICAgICAgcGRlYnVnKCJEZWZpbml0aW9uIC0+IENvbnN0Iik7CisgICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKKyAgICAgICAgZ19wcm9ncmFtLT5hZGRfY29uc3QoJDEpOworICAgICAgfQorICAgICAgJCQgPSAkMTsKKyAgICB9Cit8IFR5cGVEZWZpbml0aW9uCisgICAgeworICAgICAgcGRlYnVnKCJEZWZpbml0aW9uIC0+IFR5cGVEZWZpbml0aW9uIik7CisgICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKKyAgICAgICAgZ19zY29wZS0+YWRkX3R5cGUoJDEtPmdldF9uYW1lKCksICQxKTsKKyAgICAgICAgaWYgKGdfcGFyZW50X3Njb3BlICE9IE5VTEwpIHsKKyAgICAgICAgICBnX3BhcmVudF9zY29wZS0+YWRkX3R5cGUoZ19wYXJlbnRfcHJlZml4ICsgJDEtPmdldF9uYW1lKCksICQxKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoISBnX3Byb2dyYW0tPmlzX3VuaXF1ZV90eXBlbmFtZSgkMSkpIHsKKyAgICAgICAgICB5eWVycm9yKCJUeXBlIFwiJXNcIiBpcyBhbHJlYWR5IGRlZmluZWQuIiwgJDEtPmdldF9uYW1lKCkuY19zdHIoKSk7CisgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgJCQgPSAkMTsKKyAgICB9Cit8IFNlcnZpY2UKKyAgICB7CisgICAgICBwZGVidWcoIkRlZmluaXRpb24gLT4gU2VydmljZSIpOworICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7CisgICAgICAgIGdfc2NvcGUtPmFkZF9zZXJ2aWNlKCQxLT5nZXRfbmFtZSgpLCAkMSk7CisgICAgICAgIGlmIChnX3BhcmVudF9zY29wZSAhPSBOVUxMKSB7CisgICAgICAgICAgZ19wYXJlbnRfc2NvcGUtPmFkZF9zZXJ2aWNlKGdfcGFyZW50X3ByZWZpeCArICQxLT5nZXRfbmFtZSgpLCAkMSk7CisgICAgICAgIH0KKyAgICAgICAgZ19wcm9ncmFtLT5hZGRfc2VydmljZSgkMSk7CisgICAgICAgIGlmICghIGdfcHJvZ3JhbS0+aXNfdW5pcXVlX3R5cGVuYW1lKCQxKSkgeworICAgICAgICAgIHl5ZXJyb3IoIlR5cGUgXCIlc1wiIGlzIGFscmVhZHkgZGVmaW5lZC4iLCAkMS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgICB9CisgICAgICAkJCA9ICQxOworICAgIH0KKworVHlwZURlZmluaXRpb246CisgIFR5cGVkZWYKKyAgICB7CisgICAgICBwZGVidWcoIlR5cGVEZWZpbml0aW9uIC0+IFR5cGVkZWYiKTsKKyAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgeworICAgICAgICBnX3Byb2dyYW0tPmFkZF90eXBlZGVmKCQxKTsKKyAgICAgIH0KKyAgICB9Cit8IEVudW0KKyAgICB7CisgICAgICBwZGVidWcoIlR5cGVEZWZpbml0aW9uIC0+IEVudW0iKTsKKyAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgeworICAgICAgICBnX3Byb2dyYW0tPmFkZF9lbnVtKCQxKTsKKyAgICAgIH0KKyAgICB9Cit8IFNlbnVtCisgICAgeworICAgICAgcGRlYnVnKCJUeXBlRGVmaW5pdGlvbiAtPiBTZW51bSIpOworICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7CisgICAgICAgIGdfcHJvZ3JhbS0+YWRkX3R5cGVkZWYoJDEpOworICAgICAgfQorICAgIH0KK3wgU3RydWN0CisgICAgeworICAgICAgcGRlYnVnKCJUeXBlRGVmaW5pdGlvbiAtPiBTdHJ1Y3QiKTsKKyAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgeworICAgICAgICBnX3Byb2dyYW0tPmFkZF9zdHJ1Y3QoJDEpOworICAgICAgfQorICAgIH0KK3wgWGNlcHRpb24KKyAgICB7CisgICAgICBwZGVidWcoIlR5cGVEZWZpbml0aW9uIC0+IFhjZXB0aW9uIik7CisgICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKKyAgICAgICAgZ19wcm9ncmFtLT5hZGRfeGNlcHRpb24oJDEpOworICAgICAgfQorICAgIH0KKworQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsOgorICAnLCcKKyAgICB7fQorfCAnOycKKyAgICB7fQorfAorICAgIHt9CisKK1R5cGVkZWY6CisgIHRva190eXBlZGVmIEZpZWxkVHlwZSB0b2tfaWRlbnRpZmllciBUeXBlQW5ub3RhdGlvbnMgQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsCisgICAgeworICAgICAgcGRlYnVnKCJUeXBlRGVmIC0+IHRva190eXBlZGVmIEZpZWxkVHlwZSB0b2tfaWRlbnRpZmllciIpOworICAgICAgdmFsaWRhdGVfc2ltcGxlX2lkZW50aWZpZXIoICQzKTsKKyAgICAgIHRfdHlwZWRlZiAqdGQgPSBuZXcgdF90eXBlZGVmKGdfcHJvZ3JhbSwgJDIsICQzKTsKKyAgICAgICQkID0gdGQ7CisgICAgICBpZiAoJDQgIT0gTlVMTCkgeworICAgICAgICAkJC0+YW5ub3RhdGlvbnNfID0gJDQtPmFubm90YXRpb25zXzsKKyAgICAgICAgZGVsZXRlICQ0OworICAgICAgfQorICAgIH0KKworRW51bToKKyAgdG9rX2VudW0gdG9rX2lkZW50aWZpZXIgJ3snIEVudW1EZWZMaXN0ICd9JyBUeXBlQW5ub3RhdGlvbnMKKyAgICB7CisgICAgICBwZGVidWcoIkVudW0gLT4gdG9rX2VudW0gdG9rX2lkZW50aWZpZXIgeyBFbnVtRGVmTGlzdCB9Iik7CisgICAgICAkJCA9ICQ0OworICAgICAgdmFsaWRhdGVfc2ltcGxlX2lkZW50aWZpZXIoICQyKTsKKyAgICAgICQkLT5zZXRfbmFtZSgkMik7CisgICAgICBpZiAoJDYgIT0gTlVMTCkgeworICAgICAgICAkJC0+YW5ub3RhdGlvbnNfID0gJDYtPmFubm90YXRpb25zXzsKKyAgICAgICAgZGVsZXRlICQ2OworICAgICAgfQorCisgICAgICAvLyBtYWtlIGNvbnN0YW50cyBmb3IgYWxsIHRoZSBlbnVtIHZhbHVlcworICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7CisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+JiBlbnVtX3ZhbHVlcyA9ICQkLT5nZXRfY29uc3RhbnRzKCk7CisgICAgICAgIHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBjX2l0ZXI7CisgICAgICAgIGZvciAoY19pdGVyID0gZW51bV92YWx1ZXMuYmVnaW4oKTsgY19pdGVyICE9IGVudW1fdmFsdWVzLmVuZCgpOyArK2NfaXRlcikgeworICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0X25hbWUgPSAkJC0+Z2V0X25hbWUoKSArICIuIiArICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiBjb25zdF92YWwgPSBuZXcgdF9jb25zdF92YWx1ZSgoKmNfaXRlciktPmdldF92YWx1ZSgpKTsKKyAgICAgICAgICBjb25zdF92YWwtPnNldF9lbnVtKCQkKTsKKyAgICAgICAgICBnX3Njb3BlLT5hZGRfY29uc3RhbnQoY29uc3RfbmFtZSwgbmV3IHRfY29uc3QoZ190eXBlX2kzMiwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpLCBjb25zdF92YWwpKTsKKyAgICAgICAgICBpZiAoZ19wYXJlbnRfc2NvcGUgIT0gTlVMTCkgeworICAgICAgICAgICAgZ19wYXJlbnRfc2NvcGUtPmFkZF9jb25zdGFudChnX3BhcmVudF9wcmVmaXggKyBjb25zdF9uYW1lLCBuZXcgdF9jb25zdChnX3R5cGVfaTMyLCAoKmNfaXRlciktPmdldF9uYW1lKCksIGNvbnN0X3ZhbCkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworRW51bURlZkxpc3Q6CisgIEVudW1EZWZMaXN0IEVudW1EZWYKKyAgICB7CisgICAgICBwZGVidWcoIkVudW1EZWZMaXN0IC0+IEVudW1EZWZMaXN0IEVudW1EZWYiKTsKKyAgICAgICQkID0gJDE7CisgICAgICAkJC0+YXBwZW5kKCQyKTsKKyAgICB9Cit8CisgICAgeworICAgICAgcGRlYnVnKCJFbnVtRGVmTGlzdCAtPiAiKTsKKyAgICAgICQkID0gbmV3IHRfZW51bShnX3Byb2dyYW0pOworICAgICAgeV9lbnVtX3ZhbCA9IC0xOworICAgIH0KKworRW51bURlZjoKKyAgQ2FwdHVyZURvY1RleHQgRW51bVZhbHVlIFR5cGVBbm5vdGF0aW9ucyBDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWwKKyAgICB7CisgICAgICBwZGVidWcoIkVudW1EZWYgLT4gRW51bVZhbHVlIik7CisgICAgICAkJCA9ICQyOworICAgICAgaWYgKCQxICE9IE5VTEwpIHsKKyAgICAgICAgJCQtPnNldF9kb2MoJDEpOworICAgICAgfQorCSAgaWYgKCQzICE9IE5VTEwpIHsKKyAgICAgICAgJCQtPmFubm90YXRpb25zXyA9ICQzLT5hbm5vdGF0aW9uc187CisgICAgICAgIGRlbGV0ZSAkMzsKKyAgICAgIH0KKyAgICB9CisKK0VudW1WYWx1ZToKKyAgdG9rX2lkZW50aWZpZXIgJz0nIHRva19pbnRfY29uc3RhbnQKKyAgICB7CisgICAgICBwZGVidWcoIkVudW1WYWx1ZSAtPiB0b2tfaWRlbnRpZmllciA9IHRva19pbnRfY29uc3RhbnQiKTsKKyAgICAgIGlmICgkMyA8IElOVDMyX01JTiB8fCAkMyA+IElOVDMyX01BWCkgeworICAgICAgICAvLyBOb3RlOiB0aGlzIHVzZWQgdG8gYmUganVzdCBhIHdhcm5pbmcuICBIb3dldmVyLCBzaW5jZSB0aHJpZnQgYWx3YXlzCisgICAgICAgIC8vIHRyZWF0cyBlbnVtcyBhcyBpMzIgdmFsdWVzLCBJJ20gY2hhbmdpbmcgaXQgdG8gYSBmYXRhbCBlcnJvci4KKyAgICAgICAgLy8gSSBkb3VidCB0aGlzIHdpbGwgYWZmZWN0IG1hbnkgcGVvcGxlLCBidXQgdXNlcnMgd2hvIHJ1biBpbnRvIHRoaXMKKyAgICAgICAgLy8gd2lsbCBoYXZlIHRvIHVwZGF0ZSB0aGVpciB0aHJpZnQgZmlsZXMgdG8gbWFudWFsbHkgc3BlY2lmeSB0aGUKKyAgICAgICAgLy8gdHJ1bmNhdGVkIGkzMiB2YWx1ZSB0aGF0IHRocmlmdCBoYXMgYWx3YXlzIGJlZW4gdXNpbmcgYW55d2F5LgorICAgICAgICBmYWlsdXJlKCI2NC1iaXQgdmFsdWUgc3VwcGxpZWQgZm9yIGVudW0gJXMgd2lsbCBiZSB0cnVuY2F0ZWQuIiwgJDEpOworICAgICAgfQorICAgICAgeV9lbnVtX3ZhbCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KCQzKTsKKyAgICAgICQkID0gbmV3IHRfZW51bV92YWx1ZSgkMSwgeV9lbnVtX3ZhbCk7CisgICAgfQorIHwKKyAgdG9rX2lkZW50aWZpZXIKKyAgICB7CisgICAgICBwZGVidWcoIkVudW1WYWx1ZSAtPiB0b2tfaWRlbnRpZmllciIpOworICAgICAgdmFsaWRhdGVfc2ltcGxlX2lkZW50aWZpZXIoICQxKTsKKyAgICAgIGlmICh5X2VudW1fdmFsID09IElOVDMyX01BWCkgeworICAgICAgICBmYWlsdXJlKCJlbnVtIHZhbHVlIG92ZXJmbG93IGF0IGVudW0gJXMiLCAkMSk7CisgICAgICB9CisgICAgICArK3lfZW51bV92YWw7CisgICAgICAkJCA9IG5ldyB0X2VudW1fdmFsdWUoJDEsIHlfZW51bV92YWwpOworICAgIH0KKworU2VudW06CisgIHRva19zZW51bSB0b2tfaWRlbnRpZmllciAneycgU2VudW1EZWZMaXN0ICd9JyBUeXBlQW5ub3RhdGlvbnMKKyAgICB7CisgICAgICBwZGVidWcoIlNlbnVtIC0+IHRva19zZW51bSB0b2tfaWRlbnRpZmllciB7IFNlbnVtRGVmTGlzdCB9Iik7CisgICAgICB2YWxpZGF0ZV9zaW1wbGVfaWRlbnRpZmllciggJDIpOworICAgICAgJCQgPSBuZXcgdF90eXBlZGVmKGdfcHJvZ3JhbSwgJDQsICQyKTsKKyAgICAgIGlmICgkNiAhPSBOVUxMKSB7CisgICAgICAgICQkLT5hbm5vdGF0aW9uc18gPSAkNi0+YW5ub3RhdGlvbnNfOworICAgICAgICBkZWxldGUgJDY7CisgICAgICB9CisgICAgfQorCitTZW51bURlZkxpc3Q6CisgIFNlbnVtRGVmTGlzdCBTZW51bURlZgorICAgIHsKKyAgICAgIHBkZWJ1ZygiU2VudW1EZWZMaXN0IC0+IFNlbnVtRGVmTGlzdCBTZW51bURlZiIpOworICAgICAgJCQgPSAkMTsKKyAgICAgICQkLT5hZGRfc3RyaW5nX2VudW1fdmFsKCQyKTsKKyAgICB9Cit8CisgICAgeworICAgICAgcGRlYnVnKCJTZW51bURlZkxpc3QgLT4gIik7CisgICAgICAkJCA9IG5ldyB0X2Jhc2VfdHlwZSgic3RyaW5nIiwgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HKTsKKyAgICAgICQkLT5zZXRfc3RyaW5nX2VudW0odHJ1ZSk7CisgICAgfQorCitTZW51bURlZjoKKyAgdG9rX2xpdGVyYWwgQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsCisgICAgeworICAgICAgcGRlYnVnKCJTZW51bURlZiAtPiB0b2tfbGl0ZXJhbCIpOworICAgICAgJCQgPSAkMTsKKyAgICB9CisKK0NvbnN0OgorICB0b2tfY29uc3QgRmllbGRUeXBlIHRva19pZGVudGlmaWVyICc9JyBDb25zdFZhbHVlIENvbW1hT3JTZW1pY29sb25PcHRpb25hbAorICAgIHsKKyAgICAgIHBkZWJ1ZygiQ29uc3QgLT4gdG9rX2NvbnN0IEZpZWxkVHlwZSB0b2tfaWRlbnRpZmllciA9IENvbnN0VmFsdWUiKTsKKyAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgeworICAgICAgICB2YWxpZGF0ZV9zaW1wbGVfaWRlbnRpZmllciggJDMpOworICAgICAgICBnX3Njb3BlLT5yZXNvbHZlX2NvbnN0X3ZhbHVlKCQ1LCAkMik7CisgICAgICAgICQkID0gbmV3IHRfY29uc3QoJDIsICQzLCAkNSk7CisgICAgICAgIHZhbGlkYXRlX2NvbnN0X3R5cGUoJCQpOworCisgICAgICAgIGdfc2NvcGUtPmFkZF9jb25zdGFudCgkMywgJCQpOworICAgICAgICBpZiAoZ19wYXJlbnRfc2NvcGUgIT0gTlVMTCkgeworICAgICAgICAgIGdfcGFyZW50X3Njb3BlLT5hZGRfY29uc3RhbnQoZ19wYXJlbnRfcHJlZml4ICsgJDMsICQkKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgJCQgPSBOVUxMOworICAgICAgfQorICAgIH0KKworQ29uc3RWYWx1ZToKKyAgdG9rX2ludF9jb25zdGFudAorICAgIHsKKyAgICAgIHBkZWJ1ZygiQ29uc3RWYWx1ZSA9PiB0b2tfaW50X2NvbnN0YW50Iik7CisgICAgICAkJCA9IG5ldyB0X2NvbnN0X3ZhbHVlKCk7CisgICAgICAkJC0+c2V0X2ludGVnZXIoJDEpOworICAgICAgaWYgKCFnX2FsbG93XzY0Yml0X2NvbnN0cyAmJiAoJDEgPCBJTlQzMl9NSU4gfHwgJDEgPiBJTlQzMl9NQVgpKSB7CisgICAgICAgIHB3YXJuaW5nKDEsICI2NC1iaXQgY29uc3RhbnQgXCIlIiBQUklpNjQiXCIgbWF5IG5vdCB3b3JrIGluIGFsbCBsYW5ndWFnZXMuXG4iLCAkMSk7CisgICAgICB9CisgICAgfQorfCB0b2tfZHViX2NvbnN0YW50CisgICAgeworICAgICAgcGRlYnVnKCJDb25zdFZhbHVlID0+IHRva19kdWJfY29uc3RhbnQiKTsKKyAgICAgICQkID0gbmV3IHRfY29uc3RfdmFsdWUoKTsKKyAgICAgICQkLT5zZXRfZG91YmxlKCQxKTsKKyAgICB9Cit8IHRva19saXRlcmFsCisgICAgeworICAgICAgcGRlYnVnKCJDb25zdFZhbHVlID0+IHRva19saXRlcmFsIik7CisgICAgICAkJCA9IG5ldyB0X2NvbnN0X3ZhbHVlKCQxKTsKKyAgICB9Cit8IHRva19pZGVudGlmaWVyCisgICAgeworICAgICAgcGRlYnVnKCJDb25zdFZhbHVlID0+IHRva19pZGVudGlmaWVyIik7CisgICAgICAkJCA9IG5ldyB0X2NvbnN0X3ZhbHVlKCk7CisgICAgICAkJC0+c2V0X2lkZW50aWZpZXIoJDEpOworICAgIH0KK3wgQ29uc3RMaXN0CisgICAgeworICAgICAgcGRlYnVnKCJDb25zdFZhbHVlID0+IENvbnN0TGlzdCIpOworICAgICAgJCQgPSAkMTsKKyAgICB9Cit8IENvbnN0TWFwCisgICAgeworICAgICAgcGRlYnVnKCJDb25zdFZhbHVlID0+IENvbnN0TWFwIik7CisgICAgICAkJCA9ICQxOworICAgIH0KKworQ29uc3RMaXN0OgorICAnWycgQ29uc3RMaXN0Q29udGVudHMgJ10nCisgICAgeworICAgICAgcGRlYnVnKCJDb25zdExpc3QgPT4gWyBDb25zdExpc3RDb250ZW50cyBdIik7CisgICAgICAkJCA9ICQyOworICAgIH0KKworQ29uc3RMaXN0Q29udGVudHM6CisgIENvbnN0TGlzdENvbnRlbnRzIENvbnN0VmFsdWUgQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsCisgICAgeworICAgICAgcGRlYnVnKCJDb25zdExpc3RDb250ZW50cyA9PiBDb25zdExpc3RDb250ZW50cyBDb25zdFZhbHVlIENvbW1hT3JTZW1pY29sb25PcHRpb25hbCIpOworICAgICAgJCQgPSAkMTsKKyAgICAgICQkLT5hZGRfbGlzdCgkMik7CisgICAgfQorfAorICAgIHsKKyAgICAgIHBkZWJ1ZygiQ29uc3RMaXN0Q29udGVudHMgPT4iKTsKKyAgICAgICQkID0gbmV3IHRfY29uc3RfdmFsdWUoKTsKKyAgICAgICQkLT5zZXRfbGlzdCgpOworICAgIH0KKworQ29uc3RNYXA6CisgICd7JyBDb25zdE1hcENvbnRlbnRzICd9JworICAgIHsKKyAgICAgIHBkZWJ1ZygiQ29uc3RNYXAgPT4geyBDb25zdE1hcENvbnRlbnRzIH0iKTsKKyAgICAgICQkID0gJDI7CisgICAgfQorCitDb25zdE1hcENvbnRlbnRzOgorICBDb25zdE1hcENvbnRlbnRzIENvbnN0VmFsdWUgJzonIENvbnN0VmFsdWUgQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsCisgICAgeworICAgICAgcGRlYnVnKCJDb25zdE1hcENvbnRlbnRzID0+IENvbnN0TWFwQ29udGVudHMgQ29uc3RWYWx1ZSBDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWwiKTsKKyAgICAgICQkID0gJDE7CisgICAgICAkJC0+YWRkX21hcCgkMiwgJDQpOworICAgIH0KK3wKKyAgICB7CisgICAgICBwZGVidWcoIkNvbnN0TWFwQ29udGVudHMgPT4iKTsKKyAgICAgICQkID0gbmV3IHRfY29uc3RfdmFsdWUoKTsKKyAgICAgICQkLT5zZXRfbWFwKCk7CisgICAgfQorCitTdHJ1Y3RIZWFkOgorICB0b2tfc3RydWN0CisgICAgeworICAgICAgJCQgPSBzdHJ1Y3RfaXNfc3RydWN0OworICAgIH0KK3wgdG9rX3VuaW9uCisgICAgeworICAgICAgJCQgPSBzdHJ1Y3RfaXNfdW5pb247CisgICAgfQorCitTdHJ1Y3Q6CisgIFN0cnVjdEhlYWQgdG9rX2lkZW50aWZpZXIgWHNkQWxsICd7JyBGaWVsZExpc3QgJ30nIFR5cGVBbm5vdGF0aW9ucworICAgIHsKKyAgICAgIHBkZWJ1ZygiU3RydWN0IC0+IHRva19zdHJ1Y3QgdG9rX2lkZW50aWZpZXIgeyBGaWVsZExpc3QgfSIpOworICAgICAgdmFsaWRhdGVfc2ltcGxlX2lkZW50aWZpZXIoICQyKTsKKyAgICAgICQ1LT5zZXRfeHNkX2FsbCgkMyk7CisgICAgICAkNS0+c2V0X3VuaW9uKCQxID09IHN0cnVjdF9pc191bmlvbik7CisgICAgICAkJCA9ICQ1OworICAgICAgJCQtPnNldF9uYW1lKCQyKTsKKyAgICAgIGlmICgkNyAhPSBOVUxMKSB7CisgICAgICAgICQkLT5hbm5vdGF0aW9uc18gPSAkNy0+YW5ub3RhdGlvbnNfOworICAgICAgICBkZWxldGUgJDc7CisgICAgICB9CisgICAgfQorCitYc2RBbGw6CisgIHRva194c2RfYWxsCisgICAgeworICAgICAgJCQgPSB0cnVlOworICAgIH0KK3wKKyAgICB7CisgICAgICAkJCA9IGZhbHNlOworICAgIH0KKworWHNkT3B0aW9uYWw6CisgIHRva194c2Rfb3B0aW9uYWwKKyAgICB7CisgICAgICAkJCA9IHRydWU7CisgICAgfQorfAorICAgIHsKKyAgICAgICQkID0gZmFsc2U7CisgICAgfQorCitYc2ROaWxsYWJsZToKKyAgdG9rX3hzZF9uaWxsYWJsZQorICAgIHsKKyAgICAgICQkID0gdHJ1ZTsKKyAgICB9Cit8CisgICAgeworICAgICAgJCQgPSBmYWxzZTsKKyAgICB9CisKK1hzZEF0dHJpYnV0ZXM6CisgIHRva194c2RfYXR0cnMgJ3snIEZpZWxkTGlzdCAnfScKKyAgICB7CisgICAgICAkJCA9ICQzOworICAgIH0KK3wKKyAgICB7CisgICAgICAkJCA9IE5VTEw7CisgICAgfQorCitYY2VwdGlvbjoKKyAgdG9rX3hjZXB0aW9uIHRva19pZGVudGlmaWVyICd7JyBGaWVsZExpc3QgJ30nIFR5cGVBbm5vdGF0aW9ucworICAgIHsKKyAgICAgIHBkZWJ1ZygiWGNlcHRpb24gLT4gdG9rX3hjZXB0aW9uIHRva19pZGVudGlmaWVyIHsgRmllbGRMaXN0IH0iKTsKKyAgICAgIHZhbGlkYXRlX3NpbXBsZV9pZGVudGlmaWVyKCAkMik7CisgICAgICAkNC0+c2V0X25hbWUoJDIpOworICAgICAgJDQtPnNldF94Y2VwdGlvbih0cnVlKTsKKyAgICAgICQkID0gJDQ7CisgICAgICBpZiAoJDYgIT0gTlVMTCkgeworICAgICAgICAkJC0+YW5ub3RhdGlvbnNfID0gJDYtPmFubm90YXRpb25zXzsKKyAgICAgICAgZGVsZXRlICQ2OworICAgICAgfQorICAgIH0KKworU2VydmljZToKKyAgdG9rX3NlcnZpY2UgdG9rX2lkZW50aWZpZXIgRXh0ZW5kcyAneycgRmxhZ0FyZ3MgRnVuY3Rpb25MaXN0IFVuZmxhZ0FyZ3MgJ30nIFR5cGVBbm5vdGF0aW9ucworICAgIHsKKyAgICAgIHBkZWJ1ZygiU2VydmljZSAtPiB0b2tfc2VydmljZSB0b2tfaWRlbnRpZmllciB7IEZ1bmN0aW9uTGlzdCB9Iik7CisgICAgICB2YWxpZGF0ZV9zaW1wbGVfaWRlbnRpZmllciggJDIpOworICAgICAgJCQgPSAkNjsKKyAgICAgICQkLT5zZXRfbmFtZSgkMik7CisgICAgICAkJC0+c2V0X2V4dGVuZHMoJDMpOworICAgICAgaWYgKCQ5ICE9IE5VTEwpIHsKKyAgICAgICAgJCQtPmFubm90YXRpb25zXyA9ICQ5LT5hbm5vdGF0aW9uc187CisgICAgICAgIGRlbGV0ZSAkOTsKKyAgICAgIH0KKyAgICB9CisKK0ZsYWdBcmdzOgorICAgIHsKKyAgICAgICBnX2FyZ2xpc3QgPSAxOworICAgIH0KKworVW5mbGFnQXJnczoKKyAgICB7CisgICAgICAgZ19hcmdsaXN0ID0gMDsKKyAgICB9CisKK0V4dGVuZHM6CisgIHRva19leHRlbmRzIHRva19pZGVudGlmaWVyCisgICAgeworICAgICAgcGRlYnVnKCJFeHRlbmRzIC0+IHRva19leHRlbmRzIHRva19pZGVudGlmaWVyIik7CisgICAgICAkJCA9IE5VTEw7CisgICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKKyAgICAgICAgJCQgPSBnX3Njb3BlLT5nZXRfc2VydmljZSgkMik7CisgICAgICAgIGlmICgkJCA9PSBOVUxMKSB7CisgICAgICAgICAgeXllcnJvcigiU2VydmljZSBcIiVzXCIgaGFzIG5vdCBiZWVuIGRlZmluZWQuIiwgJDIpOworICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9Cit8CisgICAgeworICAgICAgJCQgPSBOVUxMOworICAgIH0KKworRnVuY3Rpb25MaXN0OgorICBGdW5jdGlvbkxpc3QgRnVuY3Rpb24KKyAgICB7CisgICAgICBwZGVidWcoIkZ1bmN0aW9uTGlzdCAtPiBGdW5jdGlvbkxpc3QgRnVuY3Rpb24iKTsKKyAgICAgICQkID0gJDE7CisgICAgICAkMS0+YWRkX2Z1bmN0aW9uKCQyKTsKKyAgICB9Cit8CisgICAgeworICAgICAgcGRlYnVnKCJGdW5jdGlvbkxpc3QgLT4gIik7CisgICAgICAkJCA9IG5ldyB0X3NlcnZpY2UoZ19wcm9ncmFtKTsKKyAgICB9CisKK0Z1bmN0aW9uOgorICBDYXB0dXJlRG9jVGV4dCBPbmV3YXkgRnVuY3Rpb25UeXBlIHRva19pZGVudGlmaWVyICcoJyBGaWVsZExpc3QgJyknIFRocm93cyBUeXBlQW5ub3RhdGlvbnMgQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsCisgICAgeworICAgICAgdmFsaWRhdGVfc2ltcGxlX2lkZW50aWZpZXIoICQ0KTsKKyAgICAgICQ2LT5zZXRfbmFtZShzdGQ6OnN0cmluZygkNCkgKyAiX2FyZ3MiKTsKKyAgICAgICQkID0gbmV3IHRfZnVuY3Rpb24oJDMsICQ0LCAkNiwgJDgsICQyKTsKKyAgICAgIGlmICgkMSAhPSBOVUxMKSB7CisgICAgICAgICQkLT5zZXRfZG9jKCQxKTsKKyAgICAgIH0KKyAgICAgIGlmICgkOSAhPSBOVUxMKSB7CisgICAgICAgICQkLT5hbm5vdGF0aW9uc18gPSAkOS0+YW5ub3RhdGlvbnNfOworICAgICAgICBkZWxldGUgJDk7CisgICAgICB9CisgICAgfQorCitPbmV3YXk6CisgIHRva19vbmV3YXkKKyAgICB7CisgICAgICAkJCA9IHRydWU7CisgICAgfQorfAorICAgIHsKKyAgICAgICQkID0gZmFsc2U7CisgICAgfQorCitUaHJvd3M6CisgIHRva190aHJvd3MgJygnIEZpZWxkTGlzdCAnKScKKyAgICB7CisgICAgICBwZGVidWcoIlRocm93cyAtPiB0b2tfdGhyb3dzICggRmllbGRMaXN0ICkiKTsKKyAgICAgICQkID0gJDM7CisgICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0gJiYgIXZhbGlkYXRlX3Rocm93cygkJCkpIHsKKyAgICAgICAgeXllcnJvcigiVGhyb3dzIGNsYXVzZSBtYXkgbm90IGNvbnRhaW4gbm9uLWV4Y2VwdGlvbiB0eXBlcyIpOworICAgICAgICBleGl0KDEpOworICAgICAgfQorICAgIH0KK3wKKyAgICB7CisgICAgICAkJCA9IG5ldyB0X3N0cnVjdChnX3Byb2dyYW0pOworICAgIH0KKworRmllbGRMaXN0OgorICBGaWVsZExpc3QgRmllbGQKKyAgICB7CisgICAgICBwZGVidWcoIkZpZWxkTGlzdCAtPiBGaWVsZExpc3QgLCBGaWVsZCIpOworICAgICAgJCQgPSAkMTsKKyAgICAgIGlmICghKCQkLT5hcHBlbmQoJDIpKSkgeworICAgICAgICB5eWVycm9yKCJcIiVkOiAlc1wiIC0gZmllbGQgaWRlbnRpZmllci9uYW1lIGhhcyBhbHJlYWR5IGJlZW4gdXNlZCIsICQyLT5nZXRfa2V5KCksICQyLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICAgICAgICBleGl0KDEpOworICAgICAgfQorICAgIH0KK3wKKyAgICB7CisgICAgICBwZGVidWcoIkZpZWxkTGlzdCAtPiAiKTsKKyAgICAgIHlfZmllbGRfdmFsID0gLTE7CisgICAgICAkJCA9IG5ldyB0X3N0cnVjdChnX3Byb2dyYW0pOworICAgIH0KKworRmllbGQ6CisgIENhcHR1cmVEb2NUZXh0IEZpZWxkSWRlbnRpZmllciBGaWVsZFJlcXVpcmVkbmVzcyBGaWVsZFR5cGUgRmllbGRSZWZlcmVuY2UgdG9rX2lkZW50aWZpZXIgRmllbGRWYWx1ZSBYc2RPcHRpb25hbCBYc2ROaWxsYWJsZSBYc2RBdHRyaWJ1dGVzIFR5cGVBbm5vdGF0aW9ucyBDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWwKKyAgICB7CisgICAgICBwZGVidWcoInRva19pbnRfY29uc3RhbnQgOiBGaWVsZCAtPiBGaWVsZFR5cGUgdG9rX2lkZW50aWZpZXIiKTsKKyAgICAgIGlmICgkMi5hdXRvX2Fzc2lnbmVkKSB7CisgICAgICAgIHB3YXJuaW5nKDEsICJObyBmaWVsZCBrZXkgc3BlY2lmaWVkIGZvciAlcywgcmVzdWx0aW5nIHByb3RvY29sIG1heSBoYXZlIGNvbmZsaWN0cyBvciBub3QgYmUgYmFja3dhcmRzIGNvbXBhdGlibGUhXG4iLCAkNik7CisgICAgICAgIGlmIChnX3N0cmljdCA+PSAxOTIpIHsKKyAgICAgICAgICB5eWVycm9yKCJJbXBsaWNpdCBmaWVsZCBrZXlzIGFyZSBkZXByZWNhdGVkIGFuZCBub3QgYWxsb3dlZCB3aXRoIC1zdHJpY3QiKTsKKyAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgICB9CisgICAgICB2YWxpZGF0ZV9zaW1wbGVfaWRlbnRpZmllcigkNik7CisgICAgICAkJCA9IG5ldyB0X2ZpZWxkKCQ0LCAkNiwgJDIudmFsdWUpOworICAgICAgJCQtPnNldF9yZWZlcmVuY2UoJDUpOworICAgICAgJCQtPnNldF9yZXEoJDMpOworICAgICAgaWYgKCQ3ICE9IE5VTEwpIHsKKyAgICAgICAgZ19zY29wZS0+cmVzb2x2ZV9jb25zdF92YWx1ZSgkNywgJDQpOworICAgICAgICB2YWxpZGF0ZV9maWVsZF92YWx1ZSgkJCwgJDcpOworICAgICAgICAkJC0+c2V0X3ZhbHVlKCQ3KTsKKyAgICAgIH0KKyAgICAgICQkLT5zZXRfeHNkX29wdGlvbmFsKCQ4KTsKKyAgICAgICQkLT5zZXRfeHNkX25pbGxhYmxlKCQ5KTsKKyAgICAgIGlmICgkMSAhPSBOVUxMKSB7CisgICAgICAgICQkLT5zZXRfZG9jKCQxKTsKKyAgICAgIH0KKyAgICAgIGlmICgkMTAgIT0gTlVMTCkgeworICAgICAgICAkJC0+c2V0X3hzZF9hdHRycygkMTApOworICAgICAgfQorICAgICAgaWYgKCQxMSAhPSBOVUxMKSB7CisgICAgICAgICQkLT5hbm5vdGF0aW9uc18gPSAkMTEtPmFubm90YXRpb25zXzsKKyAgICAgICAgZGVsZXRlICQxMTsKKyAgICAgIH0KKyAgICB9CisKK0ZpZWxkSWRlbnRpZmllcjoKKyAgdG9rX2ludF9jb25zdGFudCAnOicKKyAgICB7CisgICAgICBpZiAoJDEgPD0gMCkgeworICAgICAgICBpZiAoZ19hbGxvd19uZWdfZmllbGRfa2V5cykgeworICAgICAgICAgIC8qCisgICAgICAgICAgICogZ19hbGxvd19uZWdfZmllbGRfa2V5cyBleGlzdHMgdG8gYWxsb3cgdXNlcnMgdG8gYWRkIGV4cGxpY2l0bHkKKyAgICAgICAgICAgKiBzcGVjaWZpZWQga2V5IHZhbHVlcyB0byBvbGQgLnRocmlmdCBmaWxlcyB3aXRob3V0IGJyZWFraW5nCisgICAgICAgICAgICogcHJvdG9jb2wgY29tcGF0aWJpbGl0eS4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICBpZiAoJDEgIT0geV9maWVsZF92YWwpIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiB3YXJuIGlmIHRoZSB1c2VyLXNwZWNpZmllZCBuZWdhdGl2ZSB2YWx1ZSBpc24ndCB3aGF0CisgICAgICAgICAgICAgKiB0aHJpZnQgd291bGQgaGF2ZSBhdXRvLWFzc2lnbmVkLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwd2FybmluZygxLCAiTm9ucG9zaXRpdmUgZmllbGQga2V5ICglIiBQUklpNjQiKSBkaWZmZXJzIGZyb20gd2hhdCB3b3VsZCBiZSAiCisgICAgICAgICAgICAgICAgICAgICAiYXV0by1hc3NpZ25lZCBieSB0aHJpZnQgKCVkKS5cbiIsICQxLCB5X2ZpZWxkX3ZhbCk7CisgICAgICAgICAgfQorICAgICAgICAgIC8qCisgICAgICAgICAgICogTGVhdmUgJDEgYXMtaXMsIGFuZCB1cGRhdGUgeV9maWVsZF92YWwgdG8gYmUgb25lIGxlc3MgdGhhbiAkMS4KKyAgICAgICAgICAgKiBUaGUgRmllbGRMaXN0IHBhcnNpbmcgd2lsbCBjYXRjaCBhbnkgZHVwbGljYXRlIGtleSB2YWx1ZXMuCisgICAgICAgICAgICovCisgICAgICAgICAgeV9maWVsZF92YWwgPSBzdGF0aWNfY2FzdDxpbnQzMl90PigkMSAtIDEpOworICAgICAgICAgICQkLnZhbHVlID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oJDEpOworICAgICAgICAgICQkLmF1dG9fYXNzaWduZWQgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwd2FybmluZygxLCAiTm9ucG9zaXRpdmUgdmFsdWUgKCVkKSBub3QgYWxsb3dlZCBhcyBhIGZpZWxkIGtleS5cbiIsCisgICAgICAgICAgICAgICAgICAgJDEpOworICAgICAgICAgICQkLnZhbHVlID0geV9maWVsZF92YWwtLTsKKyAgICAgICAgICAkJC5hdXRvX2Fzc2lnbmVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgJCQudmFsdWUgPSBzdGF0aWNfY2FzdDxpbnQzMl90PigkMSk7CisgICAgICAgICQkLmF1dG9fYXNzaWduZWQgPSBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGlmKCAoU0hSVF9NSU4gPiAkJC52YWx1ZSkgfHwgKCQkLnZhbHVlID4gU0hSVF9NQVgpKSB7CisgICAgICAgIHB3YXJuaW5nKDEsICJGaWVsZCBrZXkgKCVkKSBleGNlZWRzIGFsbG93ZWQgcmFuZ2UgKCVkLi4lZCkuXG4iLAorICAgICAgICAgICAgICAgICAkJC52YWx1ZSwgU0hSVF9NSU4sIFNIUlRfTUFYKTsKKyAgICAgIH0KKyAgICB9Cit8CisgICAgeworICAgICAgJCQudmFsdWUgPSB5X2ZpZWxkX3ZhbC0tOworICAgICAgJCQuYXV0b19hc3NpZ25lZCA9IHRydWU7CisgICAgICBpZiggKFNIUlRfTUlOID4gJCQudmFsdWUpIHx8ICgkJC52YWx1ZSA+IFNIUlRfTUFYKSkgeworICAgICAgICBwd2FybmluZygxLCAiRmllbGQga2V5ICglZCkgZXhjZWVkcyBhbGxvd2VkIHJhbmdlICglZC4uJWQpLlxuIiwKKyAgICAgICAgICAgICAgICAgJCQudmFsdWUsIFNIUlRfTUlOLCBTSFJUX01BWCk7CisgICAgICB9CisgICAgfQorCitGaWVsZFJlZmVyZW5jZToKKyAgdG9rX3JlZmVyZW5jZQorICAgIHsKKyAgICAgICQkID0gdHJ1ZTsKKyAgICB9Cit8CisgICB7CisgICAgICQkID0gZmFsc2U7CisgICB9CisKK0ZpZWxkUmVxdWlyZWRuZXNzOgorICB0b2tfcmVxdWlyZWQKKyAgICB7CisgICAgICAkJCA9IHRfZmllbGQ6OlRfUkVRVUlSRUQ7CisgICAgfQorfCB0b2tfb3B0aW9uYWwKKyAgICB7CisgICAgICBpZiAoZ19hcmdsaXN0KSB7CisgICAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgeworICAgICAgICAgIHB3YXJuaW5nKDEsICJvcHRpb25hbCBrZXl3b3JkIGlzIGlnbm9yZWQgaW4gYXJndW1lbnQgbGlzdHMuXG4iKTsKKyAgICAgICAgfQorICAgICAgICAkJCA9IHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQ7CisgICAgICB9IGVsc2UgeworICAgICAgICAkJCA9IHRfZmllbGQ6OlRfT1BUSU9OQUw7CisgICAgICB9CisgICAgfQorfAorICAgIHsKKyAgICAgICQkID0gdF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVDsKKyAgICB9CisKK0ZpZWxkVmFsdWU6CisgICc9JyBDb25zdFZhbHVlCisgICAgeworICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7CisgICAgICAgICQkID0gJDI7CisgICAgICB9IGVsc2UgeworICAgICAgICAkJCA9IE5VTEw7CisgICAgICB9CisgICAgfQorfAorICAgIHsKKyAgICAgICQkID0gTlVMTDsKKyAgICB9CisKK0Z1bmN0aW9uVHlwZToKKyAgRmllbGRUeXBlCisgICAgeworICAgICAgcGRlYnVnKCJGdW5jdGlvblR5cGUgLT4gRmllbGRUeXBlIik7CisgICAgICAkJCA9ICQxOworICAgIH0KK3wgdG9rX3ZvaWQKKyAgICB7CisgICAgICBwZGVidWcoIkZ1bmN0aW9uVHlwZSAtPiB0b2tfdm9pZCIpOworICAgICAgJCQgPSBnX3R5cGVfdm9pZDsKKyAgICB9CisKK0ZpZWxkVHlwZToKKyAgdG9rX2lkZW50aWZpZXIKKyAgICB7CisgICAgICBwZGVidWcoIkZpZWxkVHlwZSAtPiB0b2tfaWRlbnRpZmllciIpOworICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBJTkNMVURFUykgeworICAgICAgICAvLyBJZ25vcmUgaWRlbnRpZmllcnMgaW4gaW5jbHVkZSBtb2RlCisgICAgICAgICQkID0gTlVMTDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIExvb2t1cCB0aGUgaWRlbnRpZmllciBpbiB0aGUgY3VycmVudCBzY29wZQorICAgICAgICAkJCA9IGdfc2NvcGUtPmdldF90eXBlKCQxKTsKKyAgICAgICAgaWYgKCQkID09IE5VTEwpIHsKKyAgICAgICAgICAvKgorICAgICAgICAgICAqIEVpdGhlciB0aGlzIHR5cGUgaXNuJ3QgeWV0IGRlY2xhcmVkLCBvciBpdCdzIG5ldmVyCisgICAgICAgICAgICAgZGVjbGFyZWQuICBFaXRoZXIgd2F5IGFsbG93IGl0IGFuZCB3ZSdsbCBmaWd1cmUgaXQgb3V0CisgICAgICAgICAgICAgZHVyaW5nIGdlbmVyYXRpb24uCisgICAgICAgICAgICovCisgICAgICAgICAgJCQgPSBuZXcgdF90eXBlZGVmKGdfcHJvZ3JhbSwgJDEsIHRydWUpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorfCBCYXNlVHlwZQorICAgIHsKKyAgICAgIHBkZWJ1ZygiRmllbGRUeXBlIC0+IEJhc2VUeXBlIik7CisgICAgICAkJCA9ICQxOworICAgIH0KK3wgQ29udGFpbmVyVHlwZQorICAgIHsKKyAgICAgIHBkZWJ1ZygiRmllbGRUeXBlIC0+IENvbnRhaW5lclR5cGUiKTsKKyAgICAgICQkID0gJDE7CisgICAgfQorCitCYXNlVHlwZTogU2ltcGxlQmFzZVR5cGUgVHlwZUFubm90YXRpb25zCisgICAgeworICAgICAgcGRlYnVnKCJCYXNlVHlwZSAtPiBTaW1wbGVCYXNlVHlwZSBUeXBlQW5ub3RhdGlvbnMiKTsKKyAgICAgIGlmICgkMiAhPSBOVUxMKSB7CisgICAgICAgICQkID0gbmV3IHRfYmFzZV90eXBlKCpzdGF0aWNfY2FzdDx0X2Jhc2VfdHlwZSo+KCQxKSk7CisgICAgICAgICQkLT5hbm5vdGF0aW9uc18gPSAkMi0+YW5ub3RhdGlvbnNfOworICAgICAgICBkZWxldGUgJDI7CisgICAgICB9IGVsc2UgeworICAgICAgICAkJCA9ICQxOworICAgICAgfQorICAgIH0KKworU2ltcGxlQmFzZVR5cGU6CisgIHRva19zdHJpbmcKKyAgICB7CisgICAgICBwZGVidWcoIkJhc2VUeXBlIC0+IHRva19zdHJpbmciKTsKKyAgICAgICQkID0gZ190eXBlX3N0cmluZzsKKyAgICB9Cit8IHRva19iaW5hcnkKKyAgICB7CisgICAgICBwZGVidWcoIkJhc2VUeXBlIC0+IHRva19iaW5hcnkiKTsKKyAgICAgICQkID0gZ190eXBlX2JpbmFyeTsKKyAgICB9Cit8IHRva19zbGlzdAorICAgIHsKKyAgICAgIHBkZWJ1ZygiQmFzZVR5cGUgLT4gdG9rX3NsaXN0Iik7CisgICAgICAkJCA9IGdfdHlwZV9zbGlzdDsKKyAgICB9Cit8IHRva19ib29sCisgICAgeworICAgICAgcGRlYnVnKCJCYXNlVHlwZSAtPiB0b2tfYm9vbCIpOworICAgICAgJCQgPSBnX3R5cGVfYm9vbDsKKyAgICB9Cit8IHRva19pOAorICAgIHsKKyAgICAgIHBkZWJ1ZygiQmFzZVR5cGUgLT4gdG9rX2k4Iik7CisgICAgICAkJCA9IGdfdHlwZV9pODsKKyAgICB9Cit8IHRva19pMTYKKyAgICB7CisgICAgICBwZGVidWcoIkJhc2VUeXBlIC0+IHRva19pMTYiKTsKKyAgICAgICQkID0gZ190eXBlX2kxNjsKKyAgICB9Cit8IHRva19pMzIKKyAgICB7CisgICAgICBwZGVidWcoIkJhc2VUeXBlIC0+IHRva19pMzIiKTsKKyAgICAgICQkID0gZ190eXBlX2kzMjsKKyAgICB9Cit8IHRva19pNjQKKyAgICB7CisgICAgICBwZGVidWcoIkJhc2VUeXBlIC0+IHRva19pNjQiKTsKKyAgICAgICQkID0gZ190eXBlX2k2NDsKKyAgICB9Cit8IHRva19kb3VibGUKKyAgICB7CisgICAgICBwZGVidWcoIkJhc2VUeXBlIC0+IHRva19kb3VibGUiKTsKKyAgICAgICQkID0gZ190eXBlX2RvdWJsZTsKKyAgICB9CisKK0NvbnRhaW5lclR5cGU6IFNpbXBsZUNvbnRhaW5lclR5cGUgVHlwZUFubm90YXRpb25zCisgICAgeworICAgICAgcGRlYnVnKCJDb250YWluZXJUeXBlIC0+IFNpbXBsZUNvbnRhaW5lclR5cGUgVHlwZUFubm90YXRpb25zIik7CisgICAgICAkJCA9ICQxOworICAgICAgaWYgKCQyICE9IE5VTEwpIHsKKyAgICAgICAgJCQtPmFubm90YXRpb25zXyA9ICQyLT5hbm5vdGF0aW9uc187CisgICAgICAgIGRlbGV0ZSAkMjsKKyAgICAgIH0KKyAgICB9CisKK1NpbXBsZUNvbnRhaW5lclR5cGU6CisgIE1hcFR5cGUKKyAgICB7CisgICAgICBwZGVidWcoIlNpbXBsZUNvbnRhaW5lclR5cGUgLT4gTWFwVHlwZSIpOworICAgICAgJCQgPSAkMTsKKyAgICB9Cit8IFNldFR5cGUKKyAgICB7CisgICAgICBwZGVidWcoIlNpbXBsZUNvbnRhaW5lclR5cGUgLT4gU2V0VHlwZSIpOworICAgICAgJCQgPSAkMTsKKyAgICB9Cit8IExpc3RUeXBlCisgICAgeworICAgICAgcGRlYnVnKCJTaW1wbGVDb250YWluZXJUeXBlIC0+IExpc3RUeXBlIik7CisgICAgICAkJCA9ICQxOworICAgIH0KKworTWFwVHlwZToKKyAgdG9rX21hcCBDcHBUeXBlICc8JyBGaWVsZFR5cGUgJywnIEZpZWxkVHlwZSAnPicKKyAgICB7CisgICAgICBwZGVidWcoIk1hcFR5cGUgLT4gdG9rX21hcCA8RmllbGRUeXBlLCBGaWVsZFR5cGU+Iik7CisgICAgICAkJCA9IG5ldyB0X21hcCgkNCwgJDYpOworICAgICAgaWYgKCQyICE9IE5VTEwpIHsKKyAgICAgICAgKCh0X2NvbnRhaW5lciopJCQpLT5zZXRfY3BwX25hbWUoc3RkOjpzdHJpbmcoJDIpKTsKKyAgICAgIH0KKyAgICB9CisKK1NldFR5cGU6CisgIHRva19zZXQgQ3BwVHlwZSAnPCcgRmllbGRUeXBlICc+JworICAgIHsKKyAgICAgIHBkZWJ1ZygiU2V0VHlwZSAtPiB0b2tfc2V0PEZpZWxkVHlwZT4iKTsKKyAgICAgICQkID0gbmV3IHRfc2V0KCQ0KTsKKyAgICAgIGlmICgkMiAhPSBOVUxMKSB7CisgICAgICAgICgodF9jb250YWluZXIqKSQkKS0+c2V0X2NwcF9uYW1lKHN0ZDo6c3RyaW5nKCQyKSk7CisgICAgICB9CisgICAgfQorCitMaXN0VHlwZToKKyAgdG9rX2xpc3QgJzwnIEZpZWxkVHlwZSAnPicgQ3BwVHlwZQorICAgIHsKKyAgICAgIHBkZWJ1ZygiTGlzdFR5cGUgLT4gdG9rX2xpc3Q8RmllbGRUeXBlPiIpOworICAgICAgY2hlY2tfZm9yX2xpc3Rfb2ZfYnl0ZXMoJDMpOworICAgICAgJCQgPSBuZXcgdF9saXN0KCQzKTsKKyAgICAgIGlmICgkNSAhPSBOVUxMKSB7CisgICAgICAgICgodF9jb250YWluZXIqKSQkKS0+c2V0X2NwcF9uYW1lKHN0ZDo6c3RyaW5nKCQ1KSk7CisgICAgICB9CisgICAgfQorCitDcHBUeXBlOgorICB0b2tfY3BwX3R5cGUgdG9rX2xpdGVyYWwKKyAgICB7CisgICAgICAkJCA9ICQyOworICAgIH0KK3wKKyAgICB7CisgICAgICAkJCA9IE5VTEw7CisgICAgfQorCitUeXBlQW5ub3RhdGlvbnM6CisgICcoJyBUeXBlQW5ub3RhdGlvbkxpc3QgJyknCisgICAgeworICAgICAgcGRlYnVnKCJUeXBlQW5ub3RhdGlvbnMgLT4gKCBUeXBlQW5ub3RhdGlvbkxpc3QgKSIpOworICAgICAgJCQgPSAkMjsKKyAgICB9Cit8CisgICAgeworICAgICAgJCQgPSBOVUxMOworICAgIH0KKworVHlwZUFubm90YXRpb25MaXN0OgorICBUeXBlQW5ub3RhdGlvbkxpc3QgVHlwZUFubm90YXRpb24KKyAgICB7CisgICAgICBwZGVidWcoIlR5cGVBbm5vdGF0aW9uTGlzdCAtPiBUeXBlQW5ub3RhdGlvbkxpc3QgLCBUeXBlQW5ub3RhdGlvbiIpOworICAgICAgJCQgPSAkMTsKKyAgICAgICQkLT5hbm5vdGF0aW9uc19bJDItPmtleV0gPSAkMi0+dmFsOworICAgICAgZGVsZXRlICQyOworICAgIH0KK3wKKyAgICB7CisgICAgICAvKiBKdXN0IHVzZSBhIGR1bW15IHN0cnVjdHVyZSB0byBob2xkIHRoZSBhbm5vdGF0aW9ucy4gKi8KKyAgICAgICQkID0gbmV3IHRfc3RydWN0KGdfcHJvZ3JhbSk7CisgICAgfQorCitUeXBlQW5ub3RhdGlvbjoKKyAgdG9rX2lkZW50aWZpZXIgVHlwZUFubm90YXRpb25WYWx1ZSBDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWwKKyAgICB7CisgICAgICBwZGVidWcoIlR5cGVBbm5vdGF0aW9uIC0+IFR5cGVBbm5vdGF0aW9uVmFsdWUiKTsKKyAgICAgICQkID0gbmV3IHRfYW5ub3RhdGlvbjsKKyAgICAgICQkLT5rZXkgPSAkMTsKKyAgICAgICQkLT52YWwgPSAkMjsKKyAgICB9CisKK1R5cGVBbm5vdGF0aW9uVmFsdWU6CisgICc9JyB0b2tfbGl0ZXJhbAorICAgIHsKKyAgICAgIHBkZWJ1ZygiVHlwZUFubm90YXRpb25WYWx1ZSAtPiA9IHRva19saXRlcmFsIik7CisgICAgICAkJCA9ICQyOworICAgIH0KK3wKKyAgICB7CisgICAgICBwZGVidWcoIlR5cGVBbm5vdGF0aW9uVmFsdWUgLT4iKTsKKyAgICAgICQkID0gc3RyZHVwKCIxIik7CisgICAgfQorCislJQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvdmVyc2lvbi5oLmluIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvdmVyc2lvbi5oLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlZjA3NmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC92ZXJzaW9uLmguaW4KQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVkVSU0lPTl9IXworI2RlZmluZSBfVEhSSUZUX1ZFUlNJT05fSF8gMQorCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID4gMTIwMCkKKyNwcmFnbWEgb25jZQorI2VuZGlmIC8vIF9NU0NfVkVSCisKKyNkZWZpbmUgVEhSSUZUX1ZFUlNJT04gIkBQQUNLQUdFX1ZFUlNJT05AIgorCisjZW5kaWYgLy8gX1RIUklGVF9WRVJTSU9OX0hfCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC93aW5kb3dzL2NvbmZpZy5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9jb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjI2OWNmCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9jb25maWcuaApAQCAtMCwwICsxLDcwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9XSU5ET1dTX0NPTkZJR19IXworI2RlZmluZSBfVEhSSUZUX1dJTkRPV1NfQ09ORklHX0hfIDEKKworI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+IDEyMDApCisjcHJhZ21hIG9uY2UKKyNlbmRpZiAvLyBfTVNDX1ZFUgorCisjaWZuZGVmIF9XSU4zMgorI2Vycm9yICJUaGlzIGlzIGEgV2luZG93cyBoZWFkZXIgb25seSIKKyNlbmRpZgorCisjaW5jbHVkZSA8aW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxkaXJlY3QuaD4KKworI2RlZmluZSBzdHJ0b2xsKGJlZ2luX3B0ciwgZW5kX3B0ciwgbGVuZ3RoKSBfc3RydG9pNjQoYmVnaW5fcHRyLCBlbmRfcHRyLCBsZW5ndGgpCisKKyNpZm5kZWYgUFJJdTY0CisjZGVmaW5lIFBSSXU2NCAiSTY0dSIKKyNlbmRpZgorCisjaWZuZGVmIFBSSWk2NAorI2RlZmluZSBQUklpNjQgIkk2NGkiCisjZW5kaWYKKy8vIHNxdWVsY2ggZGVwcmVjYXRpb24gd2FybmluZ3MKKyNwcmFnbWEgd2FybmluZyhkaXNhYmxlIDogNDk5NikKKy8vIHNxdWVsY2ggYm9vbCBjb252ZXJzaW9uIHBlcmZvcm1hbmNlIHdhcm5pbmcKKyNwcmFnbWEgd2FybmluZyhkaXNhYmxlIDogNDgwMCkKKworLy8gTVNWQzEwICgyMDEwKSBvciBsYXRlciBoYXMgc3RkaW50LmgKKyNpZiBfTVNDX1ZFUiA+PSAxNjAwCisjZGVmaW5lIEhBVkVfU1RESU5UX0ggMQorI2VuZGlmCisKKy8vIE11c3QgYmUgdXNpbmcgVlMyMDEwIG9yIGxhdGVyLCBvciBib29zdCwgc28gdGhhdCBDOTkgdHlwZXMgYXJlIGRlZmluZWQgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UKKyNpZmRlZiBIQVZFX1NURElOVF9ICisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZWxzZQorI2luY2x1ZGUgPGJvb3N0L2NzdGRpbnQuaHBwPgorCit0eXBlZGVmIGJvb3N0OjppbnQ2NF90IGludDY0X3Q7Cit0eXBlZGVmIGJvb3N0Ojp1aW50NjRfdCB1aW50NjRfdDsKK3R5cGVkZWYgYm9vc3Q6OmludDMyX3QgaW50MzJfdDsKK3R5cGVkZWYgYm9vc3Q6OnVpbnQzMl90IHVpbnQzMl90OwordHlwZWRlZiBib29zdDo6aW50MTZfdCBpbnQxNl90OwordHlwZWRlZiBib29zdDo6dWludDE2X3QgdWludDE2X3Q7Cit0eXBlZGVmIGJvb3N0OjppbnQ4X3QgaW50OF90OwordHlwZWRlZiBib29zdDo6dWludDhfdCB1aW50OF90OworI2VuZGlmCisKKyNlbmRpZiAvLyBfVEhSSUZUX1dJTkRPV1NfQ09ORklHX0hfCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdGwubGwgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdGwubGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3NzEyNjk3Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0bC5sbAorKysgL2Rldi9udWxsCkBAIC0xLDQyMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogVGhyaWZ0IHNjYW5uZXIuCi0gKgotICogVG9rZW5pemVzIGEgdGhyaWZ0IGRlZmluaXRpb24gZmlsZS4KLSAqLwotCi0lewotCi0vKiBUaGlzIGlzIHJlZHVuZGFudCB3aXRoIHNvbWUgb2YgdGhlIGZsYWdzIGluIE1ha2VmaWxlLmFtLCBidXQgaXQgd29ya3MKLSAqIHdoZW4gcGVvcGxlIG92ZXJyaWRlIENYWEZMQUdTIHdpdGhvdXQgYmVpbmcgY2FyZWZ1bC4gVGhlIHByYWdtYXMgYXJlCi0gKiB0aGUgJ3JpZ2h0JyB3YXkgdG8gZG8gaXQsIGJ1dCBkb24ndCB3b3JrIG9uIG9sZC1lbm91Z2ggR0NDIChpbiBwYXJ0aWN1bGFyCi0gKiB0aGUgR0NDIHRoYXQgc2hpcCBvbiBNYWMgT1MgWCAxMC42LjUsICpjb3VudGVyKiB0byB3aGF0IHRoZSBHTlUgZG9jcyBzYXkpCi0gKgotICogV2Ugc2hvdWxkIHJldmVydCB0aGUgTWFrZWZpbGUuYW0gY2hhbmdlcyBvbmNlIEFwcGxlIHNoaXBzIGEgcmVhc29uYWJsZQotICogR0NDLgotICovCi0jaWZkZWYgX19HTlVDX18KLSNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVd1bnVzZWQtZnVuY3Rpb24iCi0jcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XdW51c2VkLWxhYmVsIgotI2VuZGlmCi0KLSNpZmRlZiBfTVNDX1ZFUgotLy93YXJuaW5nIEM0MTAyOiAnZmluZF9ydWxlJyA6IHVucmVmZXJlbmNlZCBsYWJlbAotI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDEwMikKLS8vYXZvaWQgaXNhdHR5IHJlZGVmaW5pdGlvbgotI2RlZmluZSBZWV9ORVZFUl9JTlRFUkFDVElWRSAxCi0KLSNkZWZpbmUgWVlfTk9fVU5JU1REX0ggMQotI2VuZGlmCi0KLSNpbmNsdWRlIDxjYXNzZXJ0PgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaWZkZWYgX01TQ19WRVIKLSNpbmNsdWRlICJ3aW5kb3dzL2NvbmZpZy5oIgotI2VuZGlmCi0jaW5jbHVkZSAibWFpbi5oIgotI2luY2x1ZGUgImdsb2JhbHMuaCIKLSNpbmNsdWRlICJwYXJzZS90X3Byb2dyYW0uaCIKLQotLyoqCi0gKiBNdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHBhcnNlL3RfcHJvZ3JhbS5oLCBidXQgSSBjYW4ndCByZW1lbWJlciB3aHkgYW55bW9yZQotICogYmVjYXVzZSBJIHdyb3RlIHRoaXMgYSB3aGlsZSBhZ28uCi0gKi8KLSNpZiBkZWZpbmVkKEJJU09OX1VTRV9QQVJTRVJfSF9FWFRFTlNJT04pCi0jaW5jbHVkZSAidGhyaWZ0eS5oIgotI2Vsc2UKLSNpbmNsdWRlICJ0aHJpZnR5LmhoIgotI2VuZGlmCi0KLXZvaWQgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoY2hhcioga2V5d29yZCkgewotICB5eWVycm9yKCJDYW5ub3QgdXNlIHJlc2VydmVkIGxhbmd1YWdlIGtleXdvcmQ6IFwiJXNcIlxuIiwga2V5d29yZCk7Ci0gIGV4aXQoMSk7Ci19Ci0KLXZvaWQgaW50ZWdlcl9vdmVyZmxvdyhjaGFyKiB0ZXh0KSB7Ci0gIHl5ZXJyb3IoIlRoaXMgaW50ZWdlciBpcyB0b28gYmlnOiBcIiVzXCJcbiIsIHRleHQpOwotICBleGl0KDEpOwotfQotCi12b2lkIHVuZXhwZWN0ZWRfdG9rZW4oY2hhciogdGV4dCkgewotICB5eWVycm9yKCJVbmV4cGVjdGVkIHRva2VuIGluIGlucHV0OiBcIiVzXCJcbiIsIHRleHQpOwotICBleGl0KDEpOwotfQotCi0lfQotCi0vKioKLSAqIFByb3ZpZGVzIHRoZSB5eWxpbmVubyBnbG9iYWwsIHVzZWZ1bCBmb3IgZGVidWdnaW5nIG91dHB1dAotICovCi0lb3B0aW9uIGxleC1jb21wYXQKLQotLyoqCi0gKiBPdXIgaW5wdXRzIGFyZSBhbGwgc2luZ2xlIGZpbGVzLCBzbyBubyBuZWVkIGZvciB5eXdyYXAKLSAqLwotJW9wdGlvbiBub3l5d3JhcAotCi0vKioKLSAqIFdlIGRvbid0IHVzZSBpdCwgYW5kIGl0IGZpcmVzIHVwIHdhcm5pbmdzIGF0IC1XYWxsCi0gKi8KLSVvcHRpb24gbm91bnB1dAotCi0vKioKLSAqIEhlbHBlciBkZWZpbml0aW9ucywgY29tbWVudHMsIGNvbnN0YW50cywgYW5kIHdoYXRub3QKLSAqLwotCi1pbnRjb25zdGFudCAgIChbKy1dP1swLTldKykKLWhleGNvbnN0YW50ICAgKFsrLV0/IjB4IlswLTlBLUZhLWZdKykKLWR1YmNvbnN0YW50ICAgKFsrLV0/WzAtOV0qKFwuWzAtOV0rKT8oW2VFXVsrLV0/WzAtOV0rKT8pCi1pZGVudGlmaWVyICAgIChbYS16QS1aX10oXC5bYS16QS1aXzAtOV18W2EtekEtWl8wLTldKSopCi13aGl0ZXNwYWNlICAgIChbIFx0XHJcbl0qKQotc2lsbHljb21tICAgICAoIi8qIiIqIioiKi8iKQotbXVsdGljb21tICAgICAoIi8qIlteKl0iLyIqKFteKi9dfFteKl0iLyJ8IioiW14vXSkqIioiKiIqLyIpCi1kb2N0ZXh0ICAgICAgICgiLyoqIihbXiovXXxbXipdIi8ifCIqIlteL10pKiIqIioiKi8iKQotY29tbWVudCAgICAgICAoIi8vIlteXG5dKikKLXVuaXhjb21tZW50ICAgKCIjIlteXG5dKikKLXN5bWJvbCAgICAgICAgKFs6O1wsXHtcfVwoXClcPTw+XFtcXV0pCi1zdF9pZGVudGlmaWVyIChbYS16QS1aLV0oXC5bYS16QS1aXzAtOS1dfFthLXpBLVpfMC05LV0pKikKLWxpdGVyYWxfYmVnaW4gKFsnXCJdKQotCi0lJQotCi17d2hpdGVzcGFjZX0gICAgICAgICB7IC8qIGRvIG5vdGhpbmcgKi8gICAgICAgICAgICAgICAgIH0KLXtzaWxseWNvbW19ICAgICAgICAgIHsgLyogZG8gbm90aGluZyAqLyAgICAgICAgICAgICAgICAgfQote211bHRpY29tbX0gICAgICAgICAgeyAvKiBkbyBub3RoaW5nICovICAgICAgICAgICAgICAgICB9Ci17Y29tbWVudH0gICAgICAgICAgICB7IC8qIGRvIG5vdGhpbmcgKi8gICAgICAgICAgICAgICAgIH0KLXt1bml4Y29tbWVudH0gICAgICAgIHsgLyogZG8gbm90aGluZyAqLyAgICAgICAgICAgICAgICAgfQotCi17c3ltYm9sfSAgICAgICAgICAgICB7IHJldHVybiB5eXRleHRbMF07ICAgICAgICAgICAgICAgIH0KLSIqIiAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIHl5dGV4dFswXTsgICAgICAgICAgICAgICAgfQotCi0iZmFsc2UiICAgICAgICAgICAgICB7IHl5bHZhbC5pY29uc3Q9MDsgcmV0dXJuIHRva19pbnRfY29uc3RhbnQ7IH0KLSJ0cnVlIiAgICAgICAgICAgICAgIHsgeXlsdmFsLmljb25zdD0xOyByZXR1cm4gdG9rX2ludF9jb25zdGFudDsgfQotCi0ibmFtZXNwYWNlIiAgICAgICAgICB7IHJldHVybiB0b2tfbmFtZXNwYWNlOyAgICAgICAgICAgIH0KLSJjcHBfbmFtZXNwYWNlIiAgICAgIHsgcmV0dXJuIHRva19jcHBfbmFtZXNwYWNlOyAgICAgICAgfQotImNwcF9pbmNsdWRlIiAgICAgICAgeyByZXR1cm4gdG9rX2NwcF9pbmNsdWRlOyAgICAgICAgICB9Ci0iY3BwX3R5cGUiICAgICAgICAgICB7IHJldHVybiB0b2tfY3BwX3R5cGU7ICAgICAgICAgICAgIH0KLSJqYXZhX3BhY2thZ2UiICAgICAgIHsgcmV0dXJuIHRva19qYXZhX3BhY2thZ2U7ICAgICAgICAgfQotImNvY29hX3ByZWZpeCIgICAgICAgeyByZXR1cm4gdG9rX2NvY29hX3ByZWZpeDsgICAgICAgICB9Ci0iY3NoYXJwX25hbWVzcGFjZSIgICB7IHJldHVybiB0b2tfY3NoYXJwX25hbWVzcGFjZTsgICAgIH0KLSJkZWxwaGlfbmFtZXNwYWNlIiAgIHsgcmV0dXJuIHRva19kZWxwaGlfbmFtZXNwYWNlOyAgICAgfQotInBocF9uYW1lc3BhY2UiICAgICAgeyByZXR1cm4gdG9rX3BocF9uYW1lc3BhY2U7ICAgICAgICB9Ci0icHlfbW9kdWxlIiAgICAgICAgICB7IHJldHVybiB0b2tfcHlfbW9kdWxlOyAgICAgICAgICAgIH0KLSJwZXJsX3BhY2thZ2UiICAgICAgIHsgcmV0dXJuIHRva19wZXJsX3BhY2thZ2U7ICAgICAgICAgfQotInJ1YnlfbmFtZXNwYWNlIiAgICAgeyByZXR1cm4gdG9rX3J1YnlfbmFtZXNwYWNlOyAgICAgICB9Ci0ic21hbGx0YWxrX2NhdGVnb3J5IiB7IHJldHVybiB0b2tfc21hbGx0YWxrX2NhdGVnb3J5OyAgIH0KLSJzbWFsbHRhbGtfcHJlZml4IiAgIHsgcmV0dXJuIHRva19zbWFsbHRhbGtfcHJlZml4OyAgICAgfQotInhzZF9hbGwiICAgICAgICAgICAgeyByZXR1cm4gdG9rX3hzZF9hbGw7ICAgICAgICAgICAgICB9Ci0ieHNkX29wdGlvbmFsIiAgICAgICB7IHJldHVybiB0b2tfeHNkX29wdGlvbmFsOyAgICAgICAgIH0KLSJ4c2RfbmlsbGFibGUiICAgICAgIHsgcmV0dXJuIHRva194c2RfbmlsbGFibGU7ICAgICAgICAgfQotInhzZF9uYW1lc3BhY2UiICAgICAgeyByZXR1cm4gdG9rX3hzZF9uYW1lc3BhY2U7ICAgICAgICB9Ci0ieHNkX2F0dHJzIiAgICAgICAgICB7IHJldHVybiB0b2tfeHNkX2F0dHJzOyAgICAgICAgICAgIH0KLSJpbmNsdWRlIiAgICAgICAgICAgIHsgcmV0dXJuIHRva19pbmNsdWRlOyAgICAgICAgICAgICAgfQotInZvaWQiICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX3ZvaWQ7ICAgICAgICAgICAgICAgICB9Ci0iYm9vbCIgICAgICAgICAgICAgICB7IHJldHVybiB0b2tfYm9vbDsgICAgICAgICAgICAgICAgIH0KLSJieXRlIiAgICAgICAgICAgICAgIHsgcmV0dXJuIHRva19ieXRlOyAgICAgICAgICAgICAgICAgfQotImkxNiIgICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX2kxNjsgICAgICAgICAgICAgICAgICB9Ci0iaTMyIiAgICAgICAgICAgICAgICB7IHJldHVybiB0b2tfaTMyOyAgICAgICAgICAgICAgICAgIH0KLSJpNjQiICAgICAgICAgICAgICAgIHsgcmV0dXJuIHRva19pNjQ7ICAgICAgICAgICAgICAgICAgfQotImRvdWJsZSIgICAgICAgICAgICAgeyByZXR1cm4gdG9rX2RvdWJsZTsgICAgICAgICAgICAgICB9Ci0ic3RyaW5nIiAgICAgICAgICAgICB7IHJldHVybiB0b2tfc3RyaW5nOyAgICAgICAgICAgICAgIH0KLSJiaW5hcnkiICAgICAgICAgICAgIHsgcmV0dXJuIHRva19iaW5hcnk7ICAgICAgICAgICAgICAgfQotInNsaXN0IiB7Ci0gIHB3YXJuaW5nKDAsICJcInNsaXN0XCIgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIGNvbXBpbGVyIHZlcnNpb24uICBUaGlzIHR5cGUgc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGggXCJzdHJpbmdcIi5cbiIpOwotICByZXR1cm4gdG9rX3NsaXN0OwotfQotInNlbnVtIiB7Ci0gIHB3YXJuaW5nKDAsICJcInNlbnVtXCIgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIGNvbXBpbGVyIHZlcnNpb24uICBUaGlzIHR5cGUgc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGggXCJzdHJpbmdcIi5cbiIpOwotICByZXR1cm4gdG9rX3NlbnVtOwotfQotIm1hcCIgICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX21hcDsgICAgICAgICAgICAgICAgICB9Ci0ibGlzdCIgICAgICAgICAgICAgICB7IHJldHVybiB0b2tfbGlzdDsgICAgICAgICAgICAgICAgIH0KLSJzZXQiICAgICAgICAgICAgICAgIHsgcmV0dXJuIHRva19zZXQ7ICAgICAgICAgICAgICAgICAgfQotIm9uZXdheSIgICAgICAgICAgICAgeyByZXR1cm4gdG9rX29uZXdheTsgICAgICAgICAgICAgICB9Ci0idHlwZWRlZiIgICAgICAgICAgICB7IHJldHVybiB0b2tfdHlwZWRlZjsgICAgICAgICAgICAgIH0KLSJzdHJ1Y3QiICAgICAgICAgICAgIHsgcmV0dXJuIHRva19zdHJ1Y3Q7ICAgICAgICAgICAgICAgfQotInVuaW9uIiAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX3VuaW9uOyAgICAgICAgICAgICAgICB9Ci0iZXhjZXB0aW9uIiAgICAgICAgICB7IHJldHVybiB0b2tfeGNlcHRpb247ICAgICAgICAgICAgIH0KLSJleHRlbmRzIiAgICAgICAgICAgIHsgcmV0dXJuIHRva19leHRlbmRzOyAgICAgICAgICAgICAgfQotInRocm93cyIgICAgICAgICAgICAgeyByZXR1cm4gdG9rX3Rocm93czsgICAgICAgICAgICAgICB9Ci0ic2VydmljZSIgICAgICAgICAgICB7IHJldHVybiB0b2tfc2VydmljZTsgICAgICAgICAgICAgIH0KLSJlbnVtIiAgICAgICAgICAgICAgIHsgcmV0dXJuIHRva19lbnVtOyAgICAgICAgICAgICAgICAgfQotImNvbnN0IiAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX2NvbnN0OyAgICAgICAgICAgICAgICB9Ci0icmVxdWlyZWQiICAgICAgICAgICB7IHJldHVybiB0b2tfcmVxdWlyZWQ7ICAgICAgICAgICAgIH0KLSJvcHRpb25hbCIgICAgICAgICAgIHsgcmV0dXJuIHRva19vcHRpb25hbDsgICAgICAgICAgICAgfQotImFzeW5jIiB7Ci0gIHB3YXJuaW5nKDAsICJcImFzeW5jXCIgaXMgZGVwcmVjYXRlZC4gIEl0IGlzIGNhbGxlZCBcIm9uZXdheVwiIG5vdy5cbiIpOwotICByZXR1cm4gdG9rX29uZXdheTsKLX0KLSImIiAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIHRva19yZWZlcmVuY2U7ICAgICAgICAgICAgfQotCi0KLSJCRUdJTiIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotIkVORCIgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iX19DTEFTU19fIiAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJfX0RJUl9fIiAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotIl9fRklMRV9fIiAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iX19GVU5DVElPTl9fIiAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJfX0xJTkVfXyIgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotIl9fTUVUSE9EX18iICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iX19OQU1FU1BBQ0VfXyIgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJhYnN0cmFjdCIgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImFsaWFzIiAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iYW5kIiAgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJhcmdzIiAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImFzIiAgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iYXNzZXJ0IiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJiZWdpbiIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImJyZWFrIiAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iY2FzZSIgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJjYXRjaCIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImNsYXNzIiAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iY2xvbmUiICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJjb250aW51ZSIgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImRlY2xhcmUiICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZGVmIiAgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJkZWZhdWx0IiAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImRlbCIgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZGVsZXRlIiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJkbyIgICAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImR5bmFtaWMiICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZWxpZiIgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJlbHNlIiAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImVsc2VpZiIgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZWxzaWYiICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJlbmQiICAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImVuZGRlY2xhcmUiICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZW5kZm9yIiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJlbmRmb3JlYWNoIiAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImVuZGlmIiAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZW5kc3dpdGNoIiAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJlbmR3aGlsZSIgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImVuc3VyZSIgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZXhjZXB0IiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJleGVjIiAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImZpbmFsbHkiICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZmxvYXQiICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJmb3IiICAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImZvcmVhY2giICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZnJvbSIgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJmdW5jdGlvbiIgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImdsb2JhbCIgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZ290byIgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJpZiIgICAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImltcGxlbWVudHMiICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iaW1wb3J0IiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJpbiIgICAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImlubGluZSIgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iaW5zdGFuY2VvZiIgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJpbnRlcmZhY2UiICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImlzIiAgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0ibGFtYmRhIiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJtb2R1bGUiICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotIm5hdGl2ZSIgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0ibmV3IiAgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJuZXh0IiAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotIm5pbCIgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0ibm90IiAgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJvciIgICAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInBhY2thZ2UiICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0icGFzcyIgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJwdWJsaWMiICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInByaW50IiAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0icHJpdmF0ZSIgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJwcm90ZWN0ZWQiICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInB1YmxpYyIgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0icmFpc2UiICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJyZWRvIiAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInJlc2N1ZSIgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0icmV0cnkiICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJyZWdpc3RlciIgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInJldHVybiIgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0ic2VsZiIgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJzaXplb2YiICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInN0YXRpYyIgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0ic3VwZXIiICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJzd2l0Y2giICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInN5bmNocm9uaXplZCIgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0idGhlbiIgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJ0aGlzIiAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInRocm93IiAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0idHJhbnNpZW50IiAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJ0cnkiICAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInVuZGVmIiAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0idW5pb24iICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJ1bmxlc3MiICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInVuc2lnbmVkIiAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0idW50aWwiICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJ1c2UiICAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInZhciIgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0idmlydHVhbCIgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJ2b2xhdGlsZSIgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotIndoZW4iICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0id2hpbGUiICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJ3aXRoIiAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInhvciIgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0ieWllbGQiICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLQote2ludGNvbnN0YW50fSB7Ci0gIGVycm5vID0gMDsKLSAgeXlsdmFsLmljb25zdCA9IHN0cnRvbGwoeXl0ZXh0LCBOVUxMLCAxMCk7Ci0gIGlmIChlcnJubyA9PSBFUkFOR0UpIHsKLSAgICBpbnRlZ2VyX292ZXJmbG93KHl5dGV4dCk7Ci0gIH0KLSAgcmV0dXJuIHRva19pbnRfY29uc3RhbnQ7Ci19Ci0KLXtoZXhjb25zdGFudH0gewotICBlcnJubyA9IDA7Ci0gIGNoYXIgc2lnbiA9IHl5dGV4dFswXTsKLSAgaW50IHNoaWZ0ID0gc2lnbiA9PSAnMCcgPyAyIDogMzsKLSAgeXlsdmFsLmljb25zdCA9IHN0cnRvbGwoeXl0ZXh0K3NoaWZ0LCBOVUxMLCAxNik7Ci0gIGlmIChzaWduID09ICctJykgewotICAgIHl5bHZhbC5pY29uc3QgPSAteXlsdmFsLmljb25zdDsKLSAgfQotICBpZiAoZXJybm8gPT0gRVJBTkdFKSB7Ci0gICAgaW50ZWdlcl9vdmVyZmxvdyh5eXRleHQpOwotICB9Ci0gIHJldHVybiB0b2tfaW50X2NvbnN0YW50OwotfQotCi17ZHViY29uc3RhbnR9IHsKLSAgeXlsdmFsLmRjb25zdCA9IGF0b2YoeXl0ZXh0KTsKLSAgcmV0dXJuIHRva19kdWJfY29uc3RhbnQ7Ci19Ci0KLXtpZGVudGlmaWVyfSB7Ci0gIHl5bHZhbC5pZCA9IHN0cmR1cCh5eXRleHQpOwotICByZXR1cm4gdG9rX2lkZW50aWZpZXI7Ci19Ci0KLXtzdF9pZGVudGlmaWVyfSB7Ci0gIHl5bHZhbC5pZCA9IHN0cmR1cCh5eXRleHQpOwotICByZXR1cm4gdG9rX3N0X2lkZW50aWZpZXI7Ci19Ci0KLXtsaXRlcmFsX2JlZ2lufSB7Ci0gIGNoYXIgbWFyayA9IHl5dGV4dFswXTsKLSAgc3RkOjpzdHJpbmcgcmVzdWx0OwotICBmb3IoOzspCi0gIHsKLSAgICBpbnQgY2ggPSB5eWlucHV0KCk7Ci0gICAgc3dpdGNoIChjaCkgewotICAgICAgY2FzZSBFT0Y6Ci0gICAgICAgIHl5ZXJyb3IoIkVuZCBvZiBmaWxlIHdoaWxlIHJlYWQgc3RyaW5nIGF0ICVkXG4iLCB5eWxpbmVubyk7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgICBjYXNlICdcbic6Ci0gICAgICAgIHl5ZXJyb3IoIkVuZCBvZiBsaW5lIHdoaWxlIHJlYWQgc3RyaW5nIGF0ICVkXG4iLCB5eWxpbmVubyAtIDEpOwotICAgICAgICBleGl0KDEpOwotICAgICAgY2FzZSAnXFwnOgotICAgICAgICBjaCA9IHl5aW5wdXQoKTsKLSAgICAgICAgc3dpdGNoIChjaCkgewotICAgICAgICAgIGNhc2UgJ3InOgotICAgICAgICAgICAgcmVzdWx0LnB1c2hfYmFjaygnXHInKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIGNhc2UgJ24nOgotICAgICAgICAgICAgcmVzdWx0LnB1c2hfYmFjaygnXG4nKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIGNhc2UgJ3QnOgotICAgICAgICAgICAgcmVzdWx0LnB1c2hfYmFjaygnXHQnKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIGNhc2UgJyInOgotICAgICAgICAgICAgcmVzdWx0LnB1c2hfYmFjaygnIicpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgY2FzZSAnXCcnOgotICAgICAgICAgICAgcmVzdWx0LnB1c2hfYmFjaygnXCcnKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIGNhc2UgJ1xcJzoKLSAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soJ1xcJyk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgeXllcnJvcigiQmFkIGVzY2FwZSBjaGFyYWN0ZXJcbiIpOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgaWYgKGNoID09IG1hcmspIHsKLSAgICAgICAgICB5eWx2YWwuaWQgPSBzdHJkdXAocmVzdWx0LmNfc3RyKCkpOwotICAgICAgICAgIHJldHVybiB0b2tfbGl0ZXJhbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICByZXN1bHQucHVzaF9iYWNrKGNoKTsKLSAgICAgICAgfQotICAgIH0KLSAgfQotfQotCi0KLXtkb2N0ZXh0fSB7Ci0gLyogVGhpcyBkb2VzIG5vdCBzaG93IHVwIGluIHRoZSBwYXJzZSB0cmVlLiAqLwotIC8qIFJhdGhlciwgdGhlIHBhcnNlciB3aWxsIGdyYWIgaXQgb3V0IG9mIHRoZSBnbG9iYWwuICovCi0gIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgIGNsZWFyX2RvY3RleHQoKTsKLSAgICBnX2RvY3RleHQgPSBzdHJkdXAoeXl0ZXh0ICsgMyk7Ci0gICAgYXNzZXJ0KHN0cmxlbihnX2RvY3RleHQpID49IDIpOwotICAgIGdfZG9jdGV4dFtzdHJsZW4oZ19kb2N0ZXh0KSAtIDJdID0gJyAnOwotICAgIGdfZG9jdGV4dFtzdHJsZW4oZ19kb2N0ZXh0KSAtIDFdID0gJ1wwJzsKLSAgICBnX2RvY3RleHQgPSBjbGVhbl91cF9kb2N0ZXh0KGdfZG9jdGV4dCk7Ci0gICAgZ19kb2N0ZXh0X2xpbmVubyA9IHl5bGluZW5vOwotICAgIGlmKCAoZ19wcm9ncmFtX2RvY3RleHRfY2FuZGlkYXRlID09IE5VTEwpICYmIChnX3Byb2dyYW1fZG9jdGV4dF9zdGF0dXMgPT0gSU5WQUxJRCkpewotICAgICAgZ19wcm9ncmFtX2RvY3RleHRfY2FuZGlkYXRlID0gc3RyZHVwKGdfZG9jdGV4dCk7Ci0gICAgICBnX3Byb2dyYW1fZG9jdGV4dF9saW5lbm8gPSBnX2RvY3RleHRfbGluZW5vOwotICAgICAgZ19wcm9ncmFtX2RvY3RleHRfc3RhdHVzID0gU1RJTExfQ0FORElEQVRFOwotICAgICAgcGRlYnVnKCIlcyIsInByb2dyYW0gZG9jdGV4dCBzZXQgdG8gU1RJTExfQ0FORElEQVRFIik7Ci0gICAgfQotICB9Ci19Ci0KLS4gewotICB1bmV4cGVjdGVkX3Rva2VuKHl5dGV4dCk7Ci19Ci0KLQotLiB7Ci0gIC8qIENhdGNoLWFsbCB0byBsZXQgdXMgY2F0Y2ggIioiIGluIHRoZSBwYXJzZXIuICovCi0gIHJldHVybiAoaW50KSB5eXRleHRbMF07Ci19Ci0KLSUlCi0KLS8qIHZpbTogZmlsZXR5cGU9bGV4Ci0qLwpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnR5Lnl5IGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnR5Lnl5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWQ0MjMxLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0eS55eQorKysgL2Rldi9udWxsCkBAIC0xLDEzMTIgKzAsMCBAQAotJXsKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBUaHJpZnQgcGFyc2VyLgotICoKLSAqIFRoaXMgcGFyc2VyIGlzIHVzZWQgb24gYSB0aHJpZnQgZGVmaW5pdGlvbiBmaWxlLgotICoKLSAqLwotCi0jZGVmaW5lIF9fU1REQ19MSU1JVF9NQUNST1MKLSNkZWZpbmUgX19TVERDX0ZPUk1BVF9NQUNST1MKLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmbmRlZiBfTVNDX1ZFUgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jZWxzZQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2VuZGlmCi0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jaWZkZWYgX01TQ19WRVIKLSNpbmNsdWRlICJ3aW5kb3dzL2NvbmZpZy5oIgotI2VuZGlmCi0jaW5jbHVkZSAibWFpbi5oIgotI2luY2x1ZGUgImdsb2JhbHMuaCIKLSNpbmNsdWRlICJwYXJzZS90X3Byb2dyYW0uaCIKLSNpbmNsdWRlICJwYXJzZS90X3Njb3BlLmgiCi0KLSNpZmRlZiBfTVNDX1ZFUgotLy93YXJuaW5nIEM0MDY1OiBzd2l0Y2ggc3RhdGVtZW50IGNvbnRhaW5zICdkZWZhdWx0JyBidXQgbm8gJ2Nhc2UnIGxhYmVscwotI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDA2NSkKLSNlbmRpZgotCi0vKioKLSAqIFRoaXMgZ2xvYmFsIHZhcmlhYmxlIGlzIHVzZWQgZm9yIGF1dG9tYXRpYyBudW1iZXJpbmcgb2YgZmllbGQgaW5kaWNlcyBldGMuCi0gKiB3aGVuIHBhcnNpbmcgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuIEZpZWxkIHZhbHVlcyBhcmUgYXV0b21hdGljYWxseQotICogYXNzaWduZWQgc3RhcnRpbmcgZnJvbSAtMSBhbmQgd29ya2luZyB0aGVpciB3YXkgZG93bi4KLSAqLwotaW50IHlfZmllbGRfdmFsID0gLTE7Ci0vKioKLSAqIFRoaXMgZ2xvYmFsIHZhcmlhYmxlIGlzIHVzZWQgZm9yIGF1dG9tYXRpYyBudW1iZXJpbmcgb2YgZW51bSB2YWx1ZXMuCi0gKiB5X2VudW1fdmFsIGlzIHRoZSBsYXN0IHZhbHVlIGFzc2lnbmVkOyB0aGUgbmV4dCBhdXRvLWFzc2lnbmVkIHZhbHVlIHdpbGwgYmUKLSAqIHlfZW51bV92YWwrMSwgYW5kIHRoZW4gaXQgY29udGludWVzIHdvcmtpbmcgdXB3YXJkcy4gIEV4cGxpY2l0bHkgc3BlY2lmaWVkCi0gKiBlbnVtIHZhbHVlcyByZXNldCB5X2VudW1fdmFsIHRvIHRoYXQgdmFsdWUuCi0gKi8KLWludDMyX3QgeV9lbnVtX3ZhbCA9IC0xOwotaW50IGdfYXJnbGlzdCA9IDA7Ci1jb25zdCBpbnQgc3RydWN0X2lzX3N0cnVjdCA9IDA7Ci1jb25zdCBpbnQgc3RydWN0X2lzX3VuaW9uID0gMTsKLQotJX0KLQotLyoqCi0gKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGJ5IHRoZSBwYXJzZXIgdG8gaG9sZCB0aGUgZGF0YSB0eXBlcyBhc3NvY2lhdGVkIHdpdGgKLSAqIHZhcmlvdXMgcGFyc2Ugbm9kZXMuCi0gKi8KLSV1bmlvbiB7Ci0gIGNoYXIqICAgICAgICAgIGlkOwotICBpbnQ2NF90ICAgICAgICBpY29uc3Q7Ci0gIGRvdWJsZSAgICAgICAgIGRjb25zdDsKLSAgYm9vbCAgICAgICAgICAgdGJvb2w7Ci0gIHRfZG9jKiAgICAgICAgIHRkb2M7Ci0gIHRfdHlwZSogICAgICAgIHR0eXBlOwotICB0X2Jhc2VfdHlwZSogICB0YmFzZTsKLSAgdF90eXBlZGVmKiAgICAgdHR5cGVkZWY7Ci0gIHRfZW51bSogICAgICAgIHRlbnVtOwotICB0X2VudW1fdmFsdWUqICB0ZW51bXY7Ci0gIHRfY29uc3QqICAgICAgIHRjb25zdDsKLSAgdF9jb25zdF92YWx1ZSogdGNvbnN0djsKLSAgdF9zdHJ1Y3QqICAgICAgdHN0cnVjdDsKLSAgdF9zZXJ2aWNlKiAgICAgdHNlcnZpY2U7Ci0gIHRfZnVuY3Rpb24qICAgIHRmdW5jdGlvbjsKLSAgdF9maWVsZCogICAgICAgdGZpZWxkOwotICBjaGFyKiAgICAgICAgICBkdGV4dDsKLSAgdF9maWVsZDo6ZV9yZXEgZXJlcTsKLSAgdF9hbm5vdGF0aW9uKiAgdGFubm90OwotICB0X2ZpZWxkX2lkICAgICB0ZmllbGRpZDsKLX0KLQotLyoqCi0gKiBTdHJpbmdzIGlkZW50aWZpZXIKLSAqLwotJXRva2VuPGlkPiAgICAgdG9rX2lkZW50aWZpZXIKLSV0b2tlbjxpZD4gICAgIHRva19saXRlcmFsCi0ldG9rZW48ZHRleHQ+ICB0b2tfZG9jdGV4dAotJXRva2VuPGlkPiAgICAgdG9rX3N0X2lkZW50aWZpZXIKLQotLyoqCi0gKiBDb25zdGFudCB2YWx1ZXMKLSAqLwotJXRva2VuPGljb25zdD4gdG9rX2ludF9jb25zdGFudAotJXRva2VuPGRjb25zdD4gdG9rX2R1Yl9jb25zdGFudAotCi0vKioKLSAqIEhlYWRlciBrZXl3b3JkcwotICovCi0ldG9rZW4gdG9rX2luY2x1ZGUKLSV0b2tlbiB0b2tfbmFtZXNwYWNlCi0ldG9rZW4gdG9rX2NwcF9uYW1lc3BhY2UKLSV0b2tlbiB0b2tfY3BwX2luY2x1ZGUKLSV0b2tlbiB0b2tfY3BwX3R5cGUKLSV0b2tlbiB0b2tfcGhwX25hbWVzcGFjZQotJXRva2VuIHRva19weV9tb2R1bGUKLSV0b2tlbiB0b2tfcGVybF9wYWNrYWdlCi0ldG9rZW4gdG9rX2phdmFfcGFja2FnZQotJXRva2VuIHRva194c2RfYWxsCi0ldG9rZW4gdG9rX3hzZF9vcHRpb25hbAotJXRva2VuIHRva194c2RfbmlsbGFibGUKLSV0b2tlbiB0b2tfeHNkX25hbWVzcGFjZQotJXRva2VuIHRva194c2RfYXR0cnMKLSV0b2tlbiB0b2tfcnVieV9uYW1lc3BhY2UKLSV0b2tlbiB0b2tfc21hbGx0YWxrX2NhdGVnb3J5Ci0ldG9rZW4gdG9rX3NtYWxsdGFsa19wcmVmaXgKLSV0b2tlbiB0b2tfY29jb2FfcHJlZml4Ci0ldG9rZW4gdG9rX2NzaGFycF9uYW1lc3BhY2UKLSV0b2tlbiB0b2tfZGVscGhpX25hbWVzcGFjZQotCi0vKioKLSAqIEJhc2UgZGF0YXR5cGUga2V5d29yZHMKLSAqLwotJXRva2VuIHRva192b2lkCi0ldG9rZW4gdG9rX2Jvb2wKLSV0b2tlbiB0b2tfYnl0ZQotJXRva2VuIHRva19zdHJpbmcKLSV0b2tlbiB0b2tfYmluYXJ5Ci0ldG9rZW4gdG9rX3NsaXN0Ci0ldG9rZW4gdG9rX3NlbnVtCi0ldG9rZW4gdG9rX2kxNgotJXRva2VuIHRva19pMzIKLSV0b2tlbiB0b2tfaTY0Ci0ldG9rZW4gdG9rX2RvdWJsZQotCi0vKioKLSAqIENvbXBsZXggdHlwZSBrZXl3b3JkcwotICovCi0ldG9rZW4gdG9rX21hcAotJXRva2VuIHRva19saXN0Ci0ldG9rZW4gdG9rX3NldAotCi0vKioKLSAqIEZ1bmN0aW9uIG1vZGlmaWVycwotICovCi0ldG9rZW4gdG9rX29uZXdheQotCi0vKioKLSAqIFRocmlmdCBsYW5ndWFnZSBrZXl3b3JkcwotICovCi0ldG9rZW4gdG9rX3R5cGVkZWYKLSV0b2tlbiB0b2tfc3RydWN0Ci0ldG9rZW4gdG9rX3hjZXB0aW9uCi0ldG9rZW4gdG9rX3Rocm93cwotJXRva2VuIHRva19leHRlbmRzCi0ldG9rZW4gdG9rX3NlcnZpY2UKLSV0b2tlbiB0b2tfZW51bQotJXRva2VuIHRva19jb25zdAotJXRva2VuIHRva19yZXF1aXJlZAotJXRva2VuIHRva19vcHRpb25hbAotJXRva2VuIHRva191bmlvbgotJXRva2VuIHRva19yZWZlcmVuY2UKLQotLyoqCi0gKiBHcmFtbWFyIG5vZGVzCi0gKi8KLQotJXR5cGU8dHR5cGU+ICAgICBCYXNlVHlwZQotJXR5cGU8dHR5cGU+ICAgICBTaW1wbGVCYXNlVHlwZQotJXR5cGU8dHR5cGU+ICAgICBDb250YWluZXJUeXBlCi0ldHlwZTx0dHlwZT4gICAgIFNpbXBsZUNvbnRhaW5lclR5cGUKLSV0eXBlPHR0eXBlPiAgICAgTWFwVHlwZQotJXR5cGU8dHR5cGU+ICAgICBTZXRUeXBlCi0ldHlwZTx0dHlwZT4gICAgIExpc3RUeXBlCi0KLSV0eXBlPHRkb2M+ICAgICAgRGVmaW5pdGlvbgotJXR5cGU8dHR5cGU+ICAgICBUeXBlRGVmaW5pdGlvbgotCi0ldHlwZTx0dHlwZWRlZj4gIFR5cGVkZWYKLQotJXR5cGU8dHR5cGU+ICAgICBUeXBlQW5ub3RhdGlvbnMKLSV0eXBlPHR0eXBlPiAgICAgVHlwZUFubm90YXRpb25MaXN0Ci0ldHlwZTx0YW5ub3Q+ICAgIFR5cGVBbm5vdGF0aW9uCi0ldHlwZTxpZD4gICAgICAgIFR5cGVBbm5vdGF0aW9uVmFsdWUKLQotJXR5cGU8dGZpZWxkPiAgICBGaWVsZAotJXR5cGU8dGZpZWxkaWQ+ICBGaWVsZElkZW50aWZpZXIKLSV0eXBlPGVyZXE+ICAgICAgRmllbGRSZXF1aXJlZG5lc3MKLSV0eXBlPHR0eXBlPiAgICAgRmllbGRUeXBlCi0ldHlwZTx0Y29uc3R2PiAgIEZpZWxkVmFsdWUKLSV0eXBlPHRzdHJ1Y3Q+ICAgRmllbGRMaXN0Ci0ldHlwZTx0Ym9vbD4gICAgIEZpZWxkUmVmZXJlbmNlCi0KLSV0eXBlPHRlbnVtPiAgICAgRW51bQotJXR5cGU8dGVudW0+ICAgICBFbnVtRGVmTGlzdAotJXR5cGU8dGVudW12PiAgICBFbnVtRGVmCi0ldHlwZTx0ZW51bXY+ICAgIEVudW1WYWx1ZQotCi0ldHlwZTx0dHlwZWRlZj4gIFNlbnVtCi0ldHlwZTx0YmFzZT4gICAgIFNlbnVtRGVmTGlzdAotJXR5cGU8aWQ+ICAgICAgICBTZW51bURlZgotCi0ldHlwZTx0Y29uc3Q+ICAgIENvbnN0Ci0ldHlwZTx0Y29uc3R2PiAgIENvbnN0VmFsdWUKLSV0eXBlPHRjb25zdHY+ICAgQ29uc3RMaXN0Ci0ldHlwZTx0Y29uc3R2PiAgIENvbnN0TGlzdENvbnRlbnRzCi0ldHlwZTx0Y29uc3R2PiAgIENvbnN0TWFwCi0ldHlwZTx0Y29uc3R2PiAgIENvbnN0TWFwQ29udGVudHMKLQotJXR5cGU8aWNvbnN0PiAgICBTdHJ1Y3RIZWFkCi0ldHlwZTx0c3RydWN0PiAgIFN0cnVjdAotJXR5cGU8dHN0cnVjdD4gICBYY2VwdGlvbgotJXR5cGU8dHNlcnZpY2U+ICBTZXJ2aWNlCi0KLSV0eXBlPHRmdW5jdGlvbj4gRnVuY3Rpb24KLSV0eXBlPHR0eXBlPiAgICAgRnVuY3Rpb25UeXBlCi0ldHlwZTx0c2VydmljZT4gIEZ1bmN0aW9uTGlzdAotCi0ldHlwZTx0c3RydWN0PiAgIFRocm93cwotJXR5cGU8dHNlcnZpY2U+ICBFeHRlbmRzCi0ldHlwZTx0Ym9vbD4gICAgIE9uZXdheQotJXR5cGU8dGJvb2w+ICAgICBYc2RBbGwKLSV0eXBlPHRib29sPiAgICAgWHNkT3B0aW9uYWwKLSV0eXBlPHRib29sPiAgICAgWHNkTmlsbGFibGUKLSV0eXBlPHRzdHJ1Y3Q+ICAgWHNkQXR0cmlidXRlcwotJXR5cGU8aWQ+ICAgICAgICBDcHBUeXBlCi0KLSV0eXBlPGR0ZXh0PiAgICAgQ2FwdHVyZURvY1RleHQKLQotJSUKLQotLyoqCi0gKiBUaHJpZnQgR3JhbW1hciBJbXBsZW1lbnRhdGlvbi4KLSAqCi0gKiBGb3IgdGhlIG1vc3QgcGFydCB0aGlzIHNvdXJjZSBmaWxlIHdvcmtzIGl0cyB3YXkgdG9wIGRvd24gZnJvbSB3aGF0IHlvdQotICogbWlnaHQgZXhwZWN0IHRvIGZpbmQgaW4gYSB0eXBpY2FsIC50aHJpZnQgZmlsZSwgaS5lLiB0eXBlIGRlZmluaXRpb25zIGFuZAotICogbmFtZXNwYWNlcyB1cCB0b3AgZm9sbG93ZWQgYnkgc2VydmljZSBkZWZpbml0aW9ucyB1c2luZyB0aG9zZSB0eXBlcy4KLSAqLwotCi1Qcm9ncmFtOgotICBIZWFkZXJMaXN0IERlZmluaXRpb25MaXN0Ci0gICAgewotICAgICAgcGRlYnVnKCJQcm9ncmFtIC0+IEhlYWRlcnMgRGVmaW5pdGlvbkxpc3QiKTsKLSAgICAgIGlmKChnX3Byb2dyYW1fZG9jdGV4dF9jYW5kaWRhdGUgIT0gTlVMTCkgJiYgKGdfcHJvZ3JhbV9kb2N0ZXh0X3N0YXR1cyAhPSBBTFJFQURZX1BST0NFU1NFRCkpCi0gICAgICB7Ci0gICAgICAgIGdfcHJvZ3JhbS0+c2V0X2RvYyhnX3Byb2dyYW1fZG9jdGV4dF9jYW5kaWRhdGUpOwotICAgICAgICBnX3Byb2dyYW1fZG9jdGV4dF9zdGF0dXMgPSBBTFJFQURZX1BST0NFU1NFRDsKLSAgICAgIH0KLSAgICAgIGNsZWFyX2RvY3RleHQoKTsKLSAgICB9Ci0KLUNhcHR1cmVEb2NUZXh0OgotICAgIHsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICAkJCA9IGdfZG9jdGV4dDsKLSAgICAgICAgZ19kb2N0ZXh0ID0gTlVMTDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICQkID0gTlVMTDsKLSAgICAgIH0KLSAgICB9Ci0KLS8qIFRPRE8oZHJlaXNzKTogVHJ5IHRvIERlc3Ryb3lEb2NUZXh0IGluIGFsbCBzb3J0cyBvciByYW5kb20gcGxhY2VzLiAqLwotRGVzdHJveURvY1RleHQ6Ci0gICAgewotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgIGNsZWFyX2RvY3RleHQoKTsKLSAgICAgIH0KLSAgICB9Ci0KLS8qIFdlIGhhdmUgdG8gRGVzdHJveURvY1RleHQgaGVyZSwgb3RoZXJ3aXNlIGl0IGNhdGNoZXMgdGhlIGRvY3RleHQKLSAgIG9uIHRoZSBmaXJzdCByZWFsIGVsZW1lbnQuICovCi1IZWFkZXJMaXN0OgotICBIZWFkZXJMaXN0IERlc3Ryb3lEb2NUZXh0IEhlYWRlcgotICAgIHsKLSAgICAgIHBkZWJ1ZygiSGVhZGVyTGlzdCAtPiBIZWFkZXJMaXN0IEhlYWRlciIpOwotICAgIH0KLXwKLSAgICB7Ci0gICAgICBwZGVidWcoIkhlYWRlckxpc3QgLT4gIik7Ci0gICAgfQotCi1IZWFkZXI6Ci0gIEluY2x1ZGUKLSAgICB7Ci0gICAgICBwZGVidWcoIkhlYWRlciAtPiBJbmNsdWRlIik7Ci0gICAgfQotfCB0b2tfbmFtZXNwYWNlIHRva19pZGVudGlmaWVyIHRva19pZGVudGlmaWVyCi0gICAgewotICAgICAgcGRlYnVnKCJIZWFkZXIgLT4gdG9rX25hbWVzcGFjZSB0b2tfaWRlbnRpZmllciB0b2tfaWRlbnRpZmllciIpOwotICAgICAgZGVjbGFyZV92YWxpZF9wcm9ncmFtX2RvY3RleHQoKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Byb2dyYW0tPnNldF9uYW1lc3BhY2UoJDIsICQzKTsKLSAgICAgIH0KLSAgICB9Ci18IHRva19uYW1lc3BhY2UgJyonIHRva19pZGVudGlmaWVyCi0gICAgewotICAgICAgcGRlYnVnKCJIZWFkZXIgLT4gdG9rX25hbWVzcGFjZSAqIHRva19pZGVudGlmaWVyIik7Ci0gICAgICBkZWNsYXJlX3ZhbGlkX3Byb2dyYW1fZG9jdGV4dCgpOwotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgIGdfcHJvZ3JhbS0+c2V0X25hbWVzcGFjZSgiKiIsICQzKTsKLSAgICAgIH0KLSAgICB9Ci0vKiBUT0RPKGRyZWlzcyk6IEdldCByaWQgb2YgdGhpcyBvbmNlIGV2ZXJ5b25lIGlzIHVzaW5nIHRoZSBuZXcgaG90bmVzcy4gKi8KLXwgdG9rX2NwcF9uYW1lc3BhY2UgdG9rX2lkZW50aWZpZXIKLSAgICB7Ci0gICAgICBwd2FybmluZygxLCAiJ2NwcF9uYW1lc3BhY2UnIGlzIGRlcHJlY2F0ZWQuIFVzZSAnbmFtZXNwYWNlIGNwcCcgaW5zdGVhZCIpOwotICAgICAgcGRlYnVnKCJIZWFkZXIgLT4gdG9rX2NwcF9uYW1lc3BhY2UgdG9rX2lkZW50aWZpZXIiKTsKLSAgICAgIGRlY2xhcmVfdmFsaWRfcHJvZ3JhbV9kb2N0ZXh0KCk7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19wcm9ncmFtLT5zZXRfbmFtZXNwYWNlKCJjcHAiLCAkMik7Ci0gICAgICB9Ci0gICAgfQotfCB0b2tfY3BwX2luY2x1ZGUgdG9rX2xpdGVyYWwKLSAgICB7Ci0gICAgICBwZGVidWcoIkhlYWRlciAtPiB0b2tfY3BwX2luY2x1ZGUgdG9rX2xpdGVyYWwiKTsKLSAgICAgIGRlY2xhcmVfdmFsaWRfcHJvZ3JhbV9kb2N0ZXh0KCk7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19wcm9ncmFtLT5hZGRfY3BwX2luY2x1ZGUoJDIpOwotICAgICAgfQotICAgIH0KLXwgdG9rX3BocF9uYW1lc3BhY2UgdG9rX2lkZW50aWZpZXIKLSAgICB7Ci0gICAgICBwd2FybmluZygxLCAiJ3BocF9uYW1lc3BhY2UnIGlzIGRlcHJlY2F0ZWQuIFVzZSAnbmFtZXNwYWNlIHBocCcgaW5zdGVhZCIpOwotICAgICAgcGRlYnVnKCJIZWFkZXIgLT4gdG9rX3BocF9uYW1lc3BhY2UgdG9rX2lkZW50aWZpZXIiKTsKLSAgICAgIGRlY2xhcmVfdmFsaWRfcHJvZ3JhbV9kb2N0ZXh0KCk7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19wcm9ncmFtLT5zZXRfbmFtZXNwYWNlKCJwaHAiLCAkMik7Ci0gICAgICB9Ci0gICAgfQotLyogVE9ETyhkcmVpc3MpOiBHZXQgcmlkIG9mIHRoaXMgb25jZSBldmVyeW9uZSBpcyB1c2luZyB0aGUgbmV3IGhvdG5lc3MuICovCi18IHRva19weV9tb2R1bGUgdG9rX2lkZW50aWZpZXIKLSAgICB7Ci0gICAgICBwd2FybmluZygxLCAiJ3B5X21vZHVsZScgaXMgZGVwcmVjYXRlZC4gVXNlICduYW1lc3BhY2UgcHknIGluc3RlYWQiKTsKLSAgICAgIHBkZWJ1ZygiSGVhZGVyIC0+IHRva19weV9tb2R1bGUgdG9rX2lkZW50aWZpZXIiKTsKLSAgICAgIGRlY2xhcmVfdmFsaWRfcHJvZ3JhbV9kb2N0ZXh0KCk7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19wcm9ncmFtLT5zZXRfbmFtZXNwYWNlKCJweSIsICQyKTsKLSAgICAgIH0KLSAgICB9Ci0vKiBUT0RPKGRyZWlzcyk6IEdldCByaWQgb2YgdGhpcyBvbmNlIGV2ZXJ5b25lIGlzIHVzaW5nIHRoZSBuZXcgaG90bmVzcy4gKi8KLXwgdG9rX3BlcmxfcGFja2FnZSB0b2tfaWRlbnRpZmllcgotICAgIHsKLSAgICAgIHB3YXJuaW5nKDEsICIncGVybF9wYWNrYWdlJyBpcyBkZXByZWNhdGVkLiBVc2UgJ25hbWVzcGFjZSBwZXJsJyBpbnN0ZWFkIik7Ci0gICAgICBwZGVidWcoIkhlYWRlciAtPiB0b2tfcGVybF9uYW1lc3BhY2UgdG9rX2lkZW50aWZpZXIiKTsKLSAgICAgIGRlY2xhcmVfdmFsaWRfcHJvZ3JhbV9kb2N0ZXh0KCk7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19wcm9ncmFtLT5zZXRfbmFtZXNwYWNlKCJwZXJsIiwgJDIpOwotICAgICAgfQotICAgIH0KLS8qIFRPRE8oZHJlaXNzKTogR2V0IHJpZCBvZiB0aGlzIG9uY2UgZXZlcnlvbmUgaXMgdXNpbmcgdGhlIG5ldyBob3RuZXNzLiAqLwotfCB0b2tfcnVieV9uYW1lc3BhY2UgdG9rX2lkZW50aWZpZXIKLSAgICB7Ci0gICAgICBwd2FybmluZygxLCAiJ3J1YnlfbmFtZXNwYWNlJyBpcyBkZXByZWNhdGVkLiBVc2UgJ25hbWVzcGFjZSByYicgaW5zdGVhZCIpOwotICAgICAgcGRlYnVnKCJIZWFkZXIgLT4gdG9rX3J1YnlfbmFtZXNwYWNlIHRva19pZGVudGlmaWVyIik7Ci0gICAgICBkZWNsYXJlX3ZhbGlkX3Byb2dyYW1fZG9jdGV4dCgpOwotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgIGdfcHJvZ3JhbS0+c2V0X25hbWVzcGFjZSgicmIiLCAkMik7Ci0gICAgICB9Ci0gICAgfQotLyogVE9ETyhkcmVpc3MpOiBHZXQgcmlkIG9mIHRoaXMgb25jZSBldmVyeW9uZSBpcyB1c2luZyB0aGUgbmV3IGhvdG5lc3MuICovCi18IHRva19zbWFsbHRhbGtfY2F0ZWdvcnkgdG9rX3N0X2lkZW50aWZpZXIKLSAgICB7Ci0gICAgICBwd2FybmluZygxLCAiJ3NtYWxsdGFsa19jYXRlZ29yeScgaXMgZGVwcmVjYXRlZC4gVXNlICduYW1lc3BhY2Ugc21hbGx0YWxrLmNhdGVnb3J5JyBpbnN0ZWFkIik7Ci0gICAgICBwZGVidWcoIkhlYWRlciAtPiB0b2tfc21hbGx0YWxrX2NhdGVnb3J5IHRva19zdF9pZGVudGlmaWVyIik7Ci0gICAgICBkZWNsYXJlX3ZhbGlkX3Byb2dyYW1fZG9jdGV4dCgpOwotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgIGdfcHJvZ3JhbS0+c2V0X25hbWVzcGFjZSgic21hbGx0YWxrLmNhdGVnb3J5IiwgJDIpOwotICAgICAgfQotICAgIH0KLS8qIFRPRE8oZHJlaXNzKTogR2V0IHJpZCBvZiB0aGlzIG9uY2UgZXZlcnlvbmUgaXMgdXNpbmcgdGhlIG5ldyBob3RuZXNzLiAqLwotfCB0b2tfc21hbGx0YWxrX3ByZWZpeCB0b2tfaWRlbnRpZmllcgotICAgIHsKLSAgICAgIHB3YXJuaW5nKDEsICInc21hbGx0YWxrX3ByZWZpeCcgaXMgZGVwcmVjYXRlZC4gVXNlICduYW1lc3BhY2Ugc21hbGx0YWxrLnByZWZpeCcgaW5zdGVhZCIpOwotICAgICAgcGRlYnVnKCJIZWFkZXIgLT4gdG9rX3NtYWxsdGFsa19wcmVmaXggdG9rX2lkZW50aWZpZXIiKTsKLSAgICAgIGRlY2xhcmVfdmFsaWRfcHJvZ3JhbV9kb2N0ZXh0KCk7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19wcm9ncmFtLT5zZXRfbmFtZXNwYWNlKCJzbWFsbHRhbGsucHJlZml4IiwgJDIpOwotICAgICAgfQotICAgIH0KLS8qIFRPRE8oZHJlaXNzKTogR2V0IHJpZCBvZiB0aGlzIG9uY2UgZXZlcnlvbmUgaXMgdXNpbmcgdGhlIG5ldyBob3RuZXNzLiAqLwotfCB0b2tfamF2YV9wYWNrYWdlIHRva19pZGVudGlmaWVyCi0gICAgewotICAgICAgcHdhcm5pbmcoMSwgIidqYXZhX3BhY2thZ2UnIGlzIGRlcHJlY2F0ZWQuIFVzZSAnbmFtZXNwYWNlIGphdmEnIGluc3RlYWQiKTsKLSAgICAgIHBkZWJ1ZygiSGVhZGVyIC0+IHRva19qYXZhX3BhY2thZ2UgdG9rX2lkZW50aWZpZXIiKTsKLSAgICAgIGRlY2xhcmVfdmFsaWRfcHJvZ3JhbV9kb2N0ZXh0KCk7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19wcm9ncmFtLT5zZXRfbmFtZXNwYWNlKCJqYXZhIiwgJDIpOwotICAgICAgfQotICAgIH0KLS8qIFRPRE8oZHJlaXNzKTogR2V0IHJpZCBvZiB0aGlzIG9uY2UgZXZlcnlvbmUgaXMgdXNpbmcgdGhlIG5ldyBob3RuZXNzLiAqLwotfCB0b2tfY29jb2FfcHJlZml4IHRva19pZGVudGlmaWVyCi0gICAgewotICAgICAgcHdhcm5pbmcoMSwgIidjb2NvYV9wcmVmaXgnIGlzIGRlcHJlY2F0ZWQuIFVzZSAnbmFtZXNwYWNlIGNvY29hJyBpbnN0ZWFkIik7Ci0gICAgICBwZGVidWcoIkhlYWRlciAtPiB0b2tfY29jb2FfcHJlZml4IHRva19pZGVudGlmaWVyIik7Ci0gICAgICBkZWNsYXJlX3ZhbGlkX3Byb2dyYW1fZG9jdGV4dCgpOwotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgIGdfcHJvZ3JhbS0+c2V0X25hbWVzcGFjZSgiY29jb2EiLCAkMik7Ci0gICAgICB9Ci0gICAgfQotLyogVE9ETyhkcmVpc3MpOiBHZXQgcmlkIG9mIHRoaXMgb25jZSBldmVyeW9uZSBpcyB1c2luZyB0aGUgbmV3IGhvdG5lc3MuICovCi18IHRva194c2RfbmFtZXNwYWNlIHRva19saXRlcmFsCi0gICAgewotICAgICAgcHdhcm5pbmcoMSwgIid4c2RfbmFtZXNwYWNlJyBpcyBkZXByZWNhdGVkLiBVc2UgJ25hbWVzcGFjZSB4c2QnIGluc3RlYWQiKTsKLSAgICAgIHBkZWJ1ZygiSGVhZGVyIC0+IHRva194c2RfbmFtZXNwYWNlIHRva19saXRlcmFsIik7Ci0gICAgICBkZWNsYXJlX3ZhbGlkX3Byb2dyYW1fZG9jdGV4dCgpOwotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgIGdfcHJvZ3JhbS0+c2V0X25hbWVzcGFjZSgiY29jb2EiLCAkMik7Ci0gICAgICB9Ci0gICAgfQotLyogVE9ETyhkcmVpc3MpOiBHZXQgcmlkIG9mIHRoaXMgb25jZSBldmVyeW9uZSBpcyB1c2luZyB0aGUgbmV3IGhvdG5lc3MuICovCi18IHRva19jc2hhcnBfbmFtZXNwYWNlIHRva19pZGVudGlmaWVyCi0gICB7Ci0gICAgIHB3YXJuaW5nKDEsICInY3NoYXJwX25hbWVzcGFjZScgaXMgZGVwcmVjYXRlZC4gVXNlICduYW1lc3BhY2UgY3NoYXJwJyBpbnN0ZWFkIik7Ci0gICAgIHBkZWJ1ZygiSGVhZGVyIC0+IHRva19jc2hhcnBfbmFtZXNwYWNlIHRva19pZGVudGlmaWVyIik7Ci0gICAgIGRlY2xhcmVfdmFsaWRfcHJvZ3JhbV9kb2N0ZXh0KCk7Ci0gICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgIGdfcHJvZ3JhbS0+c2V0X25hbWVzcGFjZSgiY3NoYXJwIiwgJDIpOwotICAgICB9Ci0gICB9Ci0vKiBUT0RPKGRyZWlzcyk6IEdldCByaWQgb2YgdGhpcyBvbmNlIGV2ZXJ5b25lIGlzIHVzaW5nIHRoZSBuZXcgaG90bmVzcy4gKi8KLXwgdG9rX2RlbHBoaV9uYW1lc3BhY2UgdG9rX2lkZW50aWZpZXIKLSAgIHsKLSAgICAgcHdhcm5pbmcoMSwgIidkZWxwaGlfbmFtZXNwYWNlJyBpcyBkZXByZWNhdGVkLiBVc2UgJ25hbWVzcGFjZSBkZWxwaGknIGluc3RlYWQiKTsKLSAgICAgcGRlYnVnKCJIZWFkZXIgLT4gdG9rX2RlbHBoaV9uYW1lc3BhY2UgdG9rX2lkZW50aWZpZXIiKTsKLSAgICAgZGVjbGFyZV92YWxpZF9wcm9ncmFtX2RvY3RleHQoKTsKLSAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgZ19wcm9ncmFtLT5zZXRfbmFtZXNwYWNlKCJkZWxwaGkiLCAkMik7Ci0gICAgIH0KLSAgIH0KLQotSW5jbHVkZToKLSAgdG9rX2luY2x1ZGUgdG9rX2xpdGVyYWwKLSAgICB7Ci0gICAgICBwZGVidWcoIkluY2x1ZGUgLT4gdG9rX2luY2x1ZGUgdG9rX2xpdGVyYWwiKTsKLSAgICAgIGRlY2xhcmVfdmFsaWRfcHJvZ3JhbV9kb2N0ZXh0KCk7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IElOQ0xVREVTKSB7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIHBhdGggPSBpbmNsdWRlX2ZpbGUoc3RkOjpzdHJpbmcoJDIpKTsKLSAgICAgICAgaWYgKCFwYXRoLmVtcHR5KCkpIHsKLSAgICAgICAgICBnX3Byb2dyYW0tPmFkZF9pbmNsdWRlKHBhdGgsIHN0ZDo6c3RyaW5nKCQyKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLURlZmluaXRpb25MaXN0OgotICBEZWZpbml0aW9uTGlzdCBDYXB0dXJlRG9jVGV4dCBEZWZpbml0aW9uCi0gICAgewotICAgICAgcGRlYnVnKCJEZWZpbml0aW9uTGlzdCAtPiBEZWZpbml0aW9uTGlzdCBEZWZpbml0aW9uIik7Ci0gICAgICBpZiAoJDIgIT0gTlVMTCAmJiAkMyAhPSBOVUxMKSB7Ci0gICAgICAgICQzLT5zZXRfZG9jKCQyKTsKLSAgICAgIH0KLSAgICB9Ci18Ci0gICAgewotICAgICAgcGRlYnVnKCJEZWZpbml0aW9uTGlzdCAtPiAiKTsKLSAgICB9Ci0KLURlZmluaXRpb246Ci0gIENvbnN0Ci0gICAgewotICAgICAgcGRlYnVnKCJEZWZpbml0aW9uIC0+IENvbnN0Iik7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19wcm9ncmFtLT5hZGRfY29uc3QoJDEpOwotICAgICAgfQotICAgICAgJCQgPSAkMTsKLSAgICB9Ci18IFR5cGVEZWZpbml0aW9uCi0gICAgewotICAgICAgcGRlYnVnKCJEZWZpbml0aW9uIC0+IFR5cGVEZWZpbml0aW9uIik7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19zY29wZS0+YWRkX3R5cGUoJDEtPmdldF9uYW1lKCksICQxKTsKLSAgICAgICAgaWYgKGdfcGFyZW50X3Njb3BlICE9IE5VTEwpIHsKLSAgICAgICAgICBnX3BhcmVudF9zY29wZS0+YWRkX3R5cGUoZ19wYXJlbnRfcHJlZml4ICsgJDEtPmdldF9uYW1lKCksICQxKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoISBnX3Byb2dyYW0tPmlzX3VuaXF1ZV90eXBlbmFtZSgkMSkpIHsKLSAgICAgICAgICB5eWVycm9yKCJUeXBlIFwiJXNcIiBpcyBhbHJlYWR5IGRlZmluZWQuIiwgJDEtPmdldF9uYW1lKCkuY19zdHIoKSk7Ci0gICAgICAgICAgZXhpdCgxKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgJCQgPSAkMTsKLSAgICB9Ci18IFNlcnZpY2UKLSAgICB7Ci0gICAgICBwZGVidWcoIkRlZmluaXRpb24gLT4gU2VydmljZSIpOwotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgIGdfc2NvcGUtPmFkZF9zZXJ2aWNlKCQxLT5nZXRfbmFtZSgpLCAkMSk7Ci0gICAgICAgIGlmIChnX3BhcmVudF9zY29wZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgZ19wYXJlbnRfc2NvcGUtPmFkZF9zZXJ2aWNlKGdfcGFyZW50X3ByZWZpeCArICQxLT5nZXRfbmFtZSgpLCAkMSk7Ci0gICAgICAgIH0KLSAgICAgICAgZ19wcm9ncmFtLT5hZGRfc2VydmljZSgkMSk7Ci0gICAgICAgIGlmICghIGdfcHJvZ3JhbS0+aXNfdW5pcXVlX3R5cGVuYW1lKCQxKSkgewotICAgICAgICAgIHl5ZXJyb3IoIlR5cGUgXCIlc1wiIGlzIGFscmVhZHkgZGVmaW5lZC4iLCAkMS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKLSAgICAgICAgICBleGl0KDEpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAkJCA9ICQxOwotICAgIH0KLQotVHlwZURlZmluaXRpb246Ci0gIFR5cGVkZWYKLSAgICB7Ci0gICAgICBwZGVidWcoIlR5cGVEZWZpbml0aW9uIC0+IFR5cGVkZWYiKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Byb2dyYW0tPmFkZF90eXBlZGVmKCQxKTsKLSAgICAgIH0KLSAgICB9Ci18IEVudW0KLSAgICB7Ci0gICAgICBwZGVidWcoIlR5cGVEZWZpbml0aW9uIC0+IEVudW0iKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Byb2dyYW0tPmFkZF9lbnVtKCQxKTsKLSAgICAgIH0KLSAgICB9Ci18IFNlbnVtCi0gICAgewotICAgICAgcGRlYnVnKCJUeXBlRGVmaW5pdGlvbiAtPiBTZW51bSIpOwotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgIGdfcHJvZ3JhbS0+YWRkX3R5cGVkZWYoJDEpOwotICAgICAgfQotICAgIH0KLXwgU3RydWN0Ci0gICAgewotICAgICAgcGRlYnVnKCJUeXBlRGVmaW5pdGlvbiAtPiBTdHJ1Y3QiKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Byb2dyYW0tPmFkZF9zdHJ1Y3QoJDEpOwotICAgICAgfQotICAgIH0KLXwgWGNlcHRpb24KLSAgICB7Ci0gICAgICBwZGVidWcoIlR5cGVEZWZpbml0aW9uIC0+IFhjZXB0aW9uIik7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19wcm9ncmFtLT5hZGRfeGNlcHRpb24oJDEpOwotICAgICAgfQotICAgIH0KLQotQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsOgotICAnLCcKLSAgICB7fQotfCAnOycKLSAgICB7fQotfAotICAgIHt9Ci0KLVR5cGVkZWY6Ci0gIHRva190eXBlZGVmIEZpZWxkVHlwZSB0b2tfaWRlbnRpZmllciBUeXBlQW5ub3RhdGlvbnMgQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsCi0gICAgewotICAgICAgcGRlYnVnKCJUeXBlRGVmIC0+IHRva190eXBlZGVmIEZpZWxkVHlwZSB0b2tfaWRlbnRpZmllciIpOwotICAgICAgdmFsaWRhdGVfc2ltcGxlX2lkZW50aWZpZXIoICQzKTsKLSAgICAgIHRfdHlwZWRlZiAqdGQgPSBuZXcgdF90eXBlZGVmKGdfcHJvZ3JhbSwgJDIsICQzKTsKLSAgICAgICQkID0gdGQ7Ci0gICAgICBpZiAoJDQgIT0gTlVMTCkgewotICAgICAgICAkJC0+YW5ub3RhdGlvbnNfID0gJDQtPmFubm90YXRpb25zXzsKLSAgICAgICAgZGVsZXRlICQ0OwotICAgICAgfQotICAgIH0KLQotRW51bToKLSAgdG9rX2VudW0gdG9rX2lkZW50aWZpZXIgJ3snIEVudW1EZWZMaXN0ICd9JyBUeXBlQW5ub3RhdGlvbnMKLSAgICB7Ci0gICAgICBwZGVidWcoIkVudW0gLT4gdG9rX2VudW0gdG9rX2lkZW50aWZpZXIgeyBFbnVtRGVmTGlzdCB9Iik7Ci0gICAgICAkJCA9ICQ0OwotICAgICAgdmFsaWRhdGVfc2ltcGxlX2lkZW50aWZpZXIoICQyKTsKLSAgICAgICQkLT5zZXRfbmFtZSgkMik7Ci0gICAgICBpZiAoJDYgIT0gTlVMTCkgewotICAgICAgICAkJC0+YW5ub3RhdGlvbnNfID0gJDYtPmFubm90YXRpb25zXzsKLSAgICAgICAgZGVsZXRlICQ2OwotICAgICAgfQotCi0gICAgICAvLyBtYWtlIGNvbnN0YW50cyBmb3IgYWxsIHRoZSBlbnVtIHZhbHVlcwotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+JiBlbnVtX3ZhbHVlcyA9ICQkLT5nZXRfY29uc3RhbnRzKCk7Ci0gICAgICAgIHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBjX2l0ZXI7Ci0gICAgICAgIGZvciAoY19pdGVyID0gZW51bV92YWx1ZXMuYmVnaW4oKTsgY19pdGVyICE9IGVudW1fdmFsdWVzLmVuZCgpOyArK2NfaXRlcikgewotICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0X25hbWUgPSAkJC0+Z2V0X25hbWUoKSArICIuIiArICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiBjb25zdF92YWwgPSBuZXcgdF9jb25zdF92YWx1ZSgoKmNfaXRlciktPmdldF92YWx1ZSgpKTsKLSAgICAgICAgICBjb25zdF92YWwtPnNldF9lbnVtKCQkKTsKLSAgICAgICAgICBnX3Njb3BlLT5hZGRfY29uc3RhbnQoY29uc3RfbmFtZSwgbmV3IHRfY29uc3QoZ190eXBlX2kzMiwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpLCBjb25zdF92YWwpKTsKLSAgICAgICAgICBpZiAoZ19wYXJlbnRfc2NvcGUgIT0gTlVMTCkgewotICAgICAgICAgICAgZ19wYXJlbnRfc2NvcGUtPmFkZF9jb25zdGFudChnX3BhcmVudF9wcmVmaXggKyBjb25zdF9uYW1lLCBuZXcgdF9jb25zdChnX3R5cGVfaTMyLCAoKmNfaXRlciktPmdldF9uYW1lKCksIGNvbnN0X3ZhbCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotRW51bURlZkxpc3Q6Ci0gIEVudW1EZWZMaXN0IEVudW1EZWYKLSAgICB7Ci0gICAgICBwZGVidWcoIkVudW1EZWZMaXN0IC0+IEVudW1EZWZMaXN0IEVudW1EZWYiKTsKLSAgICAgICQkID0gJDE7Ci0gICAgICAkJC0+YXBwZW5kKCQyKTsKLSAgICB9Ci18Ci0gICAgewotICAgICAgcGRlYnVnKCJFbnVtRGVmTGlzdCAtPiAiKTsKLSAgICAgICQkID0gbmV3IHRfZW51bShnX3Byb2dyYW0pOwotICAgICAgeV9lbnVtX3ZhbCA9IC0xOwotICAgIH0KLQotRW51bURlZjoKLSAgQ2FwdHVyZURvY1RleHQgRW51bVZhbHVlIFR5cGVBbm5vdGF0aW9ucyBDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWwKLSAgICB7Ci0gICAgICBwZGVidWcoIkVudW1EZWYgLT4gRW51bVZhbHVlIik7Ci0gICAgICAkJCA9ICQyOwotICAgICAgaWYgKCQxICE9IE5VTEwpIHsKLSAgICAgICAgJCQtPnNldF9kb2MoJDEpOwotICAgICAgfQotCSAgaWYgKCQzICE9IE5VTEwpIHsKLSAgICAgICAgJCQtPmFubm90YXRpb25zXyA9ICQzLT5hbm5vdGF0aW9uc187Ci0gICAgICAgIGRlbGV0ZSAkMzsKLSAgICAgIH0KLSAgICB9Ci0KLUVudW1WYWx1ZToKLSAgdG9rX2lkZW50aWZpZXIgJz0nIHRva19pbnRfY29uc3RhbnQKLSAgICB7Ci0gICAgICBwZGVidWcoIkVudW1WYWx1ZSAtPiB0b2tfaWRlbnRpZmllciA9IHRva19pbnRfY29uc3RhbnQiKTsKLSAgICAgIGlmICgkMyA8IElOVDMyX01JTiB8fCAkMyA+IElOVDMyX01BWCkgewotICAgICAgICAvLyBOb3RlOiB0aGlzIHVzZWQgdG8gYmUganVzdCBhIHdhcm5pbmcuICBIb3dldmVyLCBzaW5jZSB0aHJpZnQgYWx3YXlzCi0gICAgICAgIC8vIHRyZWF0cyBlbnVtcyBhcyBpMzIgdmFsdWVzLCBJJ20gY2hhbmdpbmcgaXQgdG8gYSBmYXRhbCBlcnJvci4KLSAgICAgICAgLy8gSSBkb3VidCB0aGlzIHdpbGwgYWZmZWN0IG1hbnkgcGVvcGxlLCBidXQgdXNlcnMgd2hvIHJ1biBpbnRvIHRoaXMKLSAgICAgICAgLy8gd2lsbCBoYXZlIHRvIHVwZGF0ZSB0aGVpciB0aHJpZnQgZmlsZXMgdG8gbWFudWFsbHkgc3BlY2lmeSB0aGUKLSAgICAgICAgLy8gdHJ1bmNhdGVkIGkzMiB2YWx1ZSB0aGF0IHRocmlmdCBoYXMgYWx3YXlzIGJlZW4gdXNpbmcgYW55d2F5LgotICAgICAgICBmYWlsdXJlKCI2NC1iaXQgdmFsdWUgc3VwcGxpZWQgZm9yIGVudW0gJXMgd2lsbCBiZSB0cnVuY2F0ZWQuIiwgJDEpOwotICAgICAgfQotICAgICAgeV9lbnVtX3ZhbCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KCQzKTsKLSAgICAgICQkID0gbmV3IHRfZW51bV92YWx1ZSgkMSwgeV9lbnVtX3ZhbCk7Ci0gICAgfQotIHwKLSAgdG9rX2lkZW50aWZpZXIKLSAgICB7Ci0gICAgICBwZGVidWcoIkVudW1WYWx1ZSAtPiB0b2tfaWRlbnRpZmllciIpOwotICAgICAgdmFsaWRhdGVfc2ltcGxlX2lkZW50aWZpZXIoICQxKTsKLSAgICAgIGlmICh5X2VudW1fdmFsID09IElOVDMyX01BWCkgewotICAgICAgICBmYWlsdXJlKCJlbnVtIHZhbHVlIG92ZXJmbG93IGF0IGVudW0gJXMiLCAkMSk7Ci0gICAgICB9Ci0gICAgICArK3lfZW51bV92YWw7Ci0gICAgICAkJCA9IG5ldyB0X2VudW1fdmFsdWUoJDEsIHlfZW51bV92YWwpOwotICAgIH0KLQotU2VudW06Ci0gIHRva19zZW51bSB0b2tfaWRlbnRpZmllciAneycgU2VudW1EZWZMaXN0ICd9JyBUeXBlQW5ub3RhdGlvbnMKLSAgICB7Ci0gICAgICBwZGVidWcoIlNlbnVtIC0+IHRva19zZW51bSB0b2tfaWRlbnRpZmllciB7IFNlbnVtRGVmTGlzdCB9Iik7Ci0gICAgICB2YWxpZGF0ZV9zaW1wbGVfaWRlbnRpZmllciggJDIpOwotICAgICAgJCQgPSBuZXcgdF90eXBlZGVmKGdfcHJvZ3JhbSwgJDQsICQyKTsKLSAgICAgIGlmICgkNiAhPSBOVUxMKSB7Ci0gICAgICAgICQkLT5hbm5vdGF0aW9uc18gPSAkNi0+YW5ub3RhdGlvbnNfOwotICAgICAgICBkZWxldGUgJDY7Ci0gICAgICB9Ci0gICAgfQotCi1TZW51bURlZkxpc3Q6Ci0gIFNlbnVtRGVmTGlzdCBTZW51bURlZgotICAgIHsKLSAgICAgIHBkZWJ1ZygiU2VudW1EZWZMaXN0IC0+IFNlbnVtRGVmTGlzdCBTZW51bURlZiIpOwotICAgICAgJCQgPSAkMTsKLSAgICAgICQkLT5hZGRfc3RyaW5nX2VudW1fdmFsKCQyKTsKLSAgICB9Ci18Ci0gICAgewotICAgICAgcGRlYnVnKCJTZW51bURlZkxpc3QgLT4gIik7Ci0gICAgICAkJCA9IG5ldyB0X2Jhc2VfdHlwZSgic3RyaW5nIiwgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HKTsKLSAgICAgICQkLT5zZXRfc3RyaW5nX2VudW0odHJ1ZSk7Ci0gICAgfQotCi1TZW51bURlZjoKLSAgdG9rX2xpdGVyYWwgQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsCi0gICAgewotICAgICAgcGRlYnVnKCJTZW51bURlZiAtPiB0b2tfbGl0ZXJhbCIpOwotICAgICAgJCQgPSAkMTsKLSAgICB9Ci0KLUNvbnN0OgotICB0b2tfY29uc3QgRmllbGRUeXBlIHRva19pZGVudGlmaWVyICc9JyBDb25zdFZhbHVlIENvbW1hT3JTZW1pY29sb25PcHRpb25hbAotICAgIHsKLSAgICAgIHBkZWJ1ZygiQ29uc3QgLT4gdG9rX2NvbnN0IEZpZWxkVHlwZSB0b2tfaWRlbnRpZmllciA9IENvbnN0VmFsdWUiKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICB2YWxpZGF0ZV9zaW1wbGVfaWRlbnRpZmllciggJDMpOwotICAgICAgICBnX3Njb3BlLT5yZXNvbHZlX2NvbnN0X3ZhbHVlKCQ1LCAkMik7Ci0gICAgICAgICQkID0gbmV3IHRfY29uc3QoJDIsICQzLCAkNSk7Ci0gICAgICAgIHZhbGlkYXRlX2NvbnN0X3R5cGUoJCQpOwotCi0gICAgICAgIGdfc2NvcGUtPmFkZF9jb25zdGFudCgkMywgJCQpOwotICAgICAgICBpZiAoZ19wYXJlbnRfc2NvcGUgIT0gTlVMTCkgewotICAgICAgICAgIGdfcGFyZW50X3Njb3BlLT5hZGRfY29uc3RhbnQoZ19wYXJlbnRfcHJlZml4ICsgJDMsICQkKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgJCQgPSBOVUxMOwotICAgICAgfQotICAgIH0KLQotQ29uc3RWYWx1ZToKLSAgdG9rX2ludF9jb25zdGFudAotICAgIHsKLSAgICAgIHBkZWJ1ZygiQ29uc3RWYWx1ZSA9PiB0b2tfaW50X2NvbnN0YW50Iik7Ci0gICAgICAkJCA9IG5ldyB0X2NvbnN0X3ZhbHVlKCk7Ci0gICAgICAkJC0+c2V0X2ludGVnZXIoJDEpOwotICAgICAgaWYgKCFnX2FsbG93XzY0Yml0X2NvbnN0cyAmJiAoJDEgPCBJTlQzMl9NSU4gfHwgJDEgPiBJTlQzMl9NQVgpKSB7Ci0gICAgICAgIHB3YXJuaW5nKDEsICI2NC1iaXQgY29uc3RhbnQgXCIlIiBQUklpNjQiXCIgbWF5IG5vdCB3b3JrIGluIGFsbCBsYW5ndWFnZXMuXG4iLCAkMSk7Ci0gICAgICB9Ci0gICAgfQotfCB0b2tfZHViX2NvbnN0YW50Ci0gICAgewotICAgICAgcGRlYnVnKCJDb25zdFZhbHVlID0+IHRva19kdWJfY29uc3RhbnQiKTsKLSAgICAgICQkID0gbmV3IHRfY29uc3RfdmFsdWUoKTsKLSAgICAgICQkLT5zZXRfZG91YmxlKCQxKTsKLSAgICB9Ci18IHRva19saXRlcmFsCi0gICAgewotICAgICAgcGRlYnVnKCJDb25zdFZhbHVlID0+IHRva19saXRlcmFsIik7Ci0gICAgICAkJCA9IG5ldyB0X2NvbnN0X3ZhbHVlKCQxKTsKLSAgICB9Ci18IHRva19pZGVudGlmaWVyCi0gICAgewotICAgICAgcGRlYnVnKCJDb25zdFZhbHVlID0+IHRva19pZGVudGlmaWVyIik7Ci0gICAgICAkJCA9IG5ldyB0X2NvbnN0X3ZhbHVlKCk7Ci0gICAgICAkJC0+c2V0X2lkZW50aWZpZXIoJDEpOwotICAgIH0KLXwgQ29uc3RMaXN0Ci0gICAgewotICAgICAgcGRlYnVnKCJDb25zdFZhbHVlID0+IENvbnN0TGlzdCIpOwotICAgICAgJCQgPSAkMTsKLSAgICB9Ci18IENvbnN0TWFwCi0gICAgewotICAgICAgcGRlYnVnKCJDb25zdFZhbHVlID0+IENvbnN0TWFwIik7Ci0gICAgICAkJCA9ICQxOwotICAgIH0KLQotQ29uc3RMaXN0OgotICAnWycgQ29uc3RMaXN0Q29udGVudHMgJ10nCi0gICAgewotICAgICAgcGRlYnVnKCJDb25zdExpc3QgPT4gWyBDb25zdExpc3RDb250ZW50cyBdIik7Ci0gICAgICAkJCA9ICQyOwotICAgIH0KLQotQ29uc3RMaXN0Q29udGVudHM6Ci0gIENvbnN0TGlzdENvbnRlbnRzIENvbnN0VmFsdWUgQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsCi0gICAgewotICAgICAgcGRlYnVnKCJDb25zdExpc3RDb250ZW50cyA9PiBDb25zdExpc3RDb250ZW50cyBDb25zdFZhbHVlIENvbW1hT3JTZW1pY29sb25PcHRpb25hbCIpOwotICAgICAgJCQgPSAkMTsKLSAgICAgICQkLT5hZGRfbGlzdCgkMik7Ci0gICAgfQotfAotICAgIHsKLSAgICAgIHBkZWJ1ZygiQ29uc3RMaXN0Q29udGVudHMgPT4iKTsKLSAgICAgICQkID0gbmV3IHRfY29uc3RfdmFsdWUoKTsKLSAgICAgICQkLT5zZXRfbGlzdCgpOwotICAgIH0KLQotQ29uc3RNYXA6Ci0gICd7JyBDb25zdE1hcENvbnRlbnRzICd9JwotICAgIHsKLSAgICAgIHBkZWJ1ZygiQ29uc3RNYXAgPT4geyBDb25zdE1hcENvbnRlbnRzIH0iKTsKLSAgICAgICQkID0gJDI7Ci0gICAgfQotCi1Db25zdE1hcENvbnRlbnRzOgotICBDb25zdE1hcENvbnRlbnRzIENvbnN0VmFsdWUgJzonIENvbnN0VmFsdWUgQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsCi0gICAgewotICAgICAgcGRlYnVnKCJDb25zdE1hcENvbnRlbnRzID0+IENvbnN0TWFwQ29udGVudHMgQ29uc3RWYWx1ZSBDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWwiKTsKLSAgICAgICQkID0gJDE7Ci0gICAgICAkJC0+YWRkX21hcCgkMiwgJDQpOwotICAgIH0KLXwKLSAgICB7Ci0gICAgICBwZGVidWcoIkNvbnN0TWFwQ29udGVudHMgPT4iKTsKLSAgICAgICQkID0gbmV3IHRfY29uc3RfdmFsdWUoKTsKLSAgICAgICQkLT5zZXRfbWFwKCk7Ci0gICAgfQotCi1TdHJ1Y3RIZWFkOgotICB0b2tfc3RydWN0Ci0gICAgewotICAgICAgJCQgPSBzdHJ1Y3RfaXNfc3RydWN0OwotICAgIH0KLXwgdG9rX3VuaW9uCi0gICAgewotICAgICAgJCQgPSBzdHJ1Y3RfaXNfdW5pb247Ci0gICAgfQotCi1TdHJ1Y3Q6Ci0gIFN0cnVjdEhlYWQgdG9rX2lkZW50aWZpZXIgWHNkQWxsICd7JyBGaWVsZExpc3QgJ30nIFR5cGVBbm5vdGF0aW9ucwotICAgIHsKLSAgICAgIHBkZWJ1ZygiU3RydWN0IC0+IHRva19zdHJ1Y3QgdG9rX2lkZW50aWZpZXIgeyBGaWVsZExpc3QgfSIpOwotICAgICAgdmFsaWRhdGVfc2ltcGxlX2lkZW50aWZpZXIoICQyKTsKLSAgICAgICQ1LT5zZXRfeHNkX2FsbCgkMyk7Ci0gICAgICAkNS0+c2V0X3VuaW9uKCQxID09IHN0cnVjdF9pc191bmlvbik7Ci0gICAgICAkJCA9ICQ1OwotICAgICAgJCQtPnNldF9uYW1lKCQyKTsKLSAgICAgIGlmICgkNyAhPSBOVUxMKSB7Ci0gICAgICAgICQkLT5hbm5vdGF0aW9uc18gPSAkNy0+YW5ub3RhdGlvbnNfOwotICAgICAgICBkZWxldGUgJDc7Ci0gICAgICB9Ci0gICAgfQotCi1Yc2RBbGw6Ci0gIHRva194c2RfYWxsCi0gICAgewotICAgICAgJCQgPSB0cnVlOwotICAgIH0KLXwKLSAgICB7Ci0gICAgICAkJCA9IGZhbHNlOwotICAgIH0KLQotWHNkT3B0aW9uYWw6Ci0gIHRva194c2Rfb3B0aW9uYWwKLSAgICB7Ci0gICAgICAkJCA9IHRydWU7Ci0gICAgfQotfAotICAgIHsKLSAgICAgICQkID0gZmFsc2U7Ci0gICAgfQotCi1Yc2ROaWxsYWJsZToKLSAgdG9rX3hzZF9uaWxsYWJsZQotICAgIHsKLSAgICAgICQkID0gdHJ1ZTsKLSAgICB9Ci18Ci0gICAgewotICAgICAgJCQgPSBmYWxzZTsKLSAgICB9Ci0KLVhzZEF0dHJpYnV0ZXM6Ci0gIHRva194c2RfYXR0cnMgJ3snIEZpZWxkTGlzdCAnfScKLSAgICB7Ci0gICAgICAkJCA9ICQzOwotICAgIH0KLXwKLSAgICB7Ci0gICAgICAkJCA9IE5VTEw7Ci0gICAgfQotCi1YY2VwdGlvbjoKLSAgdG9rX3hjZXB0aW9uIHRva19pZGVudGlmaWVyICd7JyBGaWVsZExpc3QgJ30nIFR5cGVBbm5vdGF0aW9ucwotICAgIHsKLSAgICAgIHBkZWJ1ZygiWGNlcHRpb24gLT4gdG9rX3hjZXB0aW9uIHRva19pZGVudGlmaWVyIHsgRmllbGRMaXN0IH0iKTsKLSAgICAgIHZhbGlkYXRlX3NpbXBsZV9pZGVudGlmaWVyKCAkMik7Ci0gICAgICAkNC0+c2V0X25hbWUoJDIpOwotICAgICAgJDQtPnNldF94Y2VwdGlvbih0cnVlKTsKLSAgICAgICQkID0gJDQ7Ci0gICAgICBpZiAoJDYgIT0gTlVMTCkgewotICAgICAgICAkJC0+YW5ub3RhdGlvbnNfID0gJDYtPmFubm90YXRpb25zXzsKLSAgICAgICAgZGVsZXRlICQ2OwotICAgICAgfQotICAgIH0KLQotU2VydmljZToKLSAgdG9rX3NlcnZpY2UgdG9rX2lkZW50aWZpZXIgRXh0ZW5kcyAneycgRmxhZ0FyZ3MgRnVuY3Rpb25MaXN0IFVuZmxhZ0FyZ3MgJ30nIFR5cGVBbm5vdGF0aW9ucwotICAgIHsKLSAgICAgIHBkZWJ1ZygiU2VydmljZSAtPiB0b2tfc2VydmljZSB0b2tfaWRlbnRpZmllciB7IEZ1bmN0aW9uTGlzdCB9Iik7Ci0gICAgICB2YWxpZGF0ZV9zaW1wbGVfaWRlbnRpZmllciggJDIpOwotICAgICAgJCQgPSAkNjsKLSAgICAgICQkLT5zZXRfbmFtZSgkMik7Ci0gICAgICAkJC0+c2V0X2V4dGVuZHMoJDMpOwotICAgICAgaWYgKCQ5ICE9IE5VTEwpIHsKLSAgICAgICAgJCQtPmFubm90YXRpb25zXyA9ICQ5LT5hbm5vdGF0aW9uc187Ci0gICAgICAgIGRlbGV0ZSAkOTsKLSAgICAgIH0KLSAgICB9Ci0KLUZsYWdBcmdzOgotICAgIHsKLSAgICAgICBnX2FyZ2xpc3QgPSAxOwotICAgIH0KLQotVW5mbGFnQXJnczoKLSAgICB7Ci0gICAgICAgZ19hcmdsaXN0ID0gMDsKLSAgICB9Ci0KLUV4dGVuZHM6Ci0gIHRva19leHRlbmRzIHRva19pZGVudGlmaWVyCi0gICAgewotICAgICAgcGRlYnVnKCJFeHRlbmRzIC0+IHRva19leHRlbmRzIHRva19pZGVudGlmaWVyIik7Ci0gICAgICAkJCA9IE5VTEw7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgJCQgPSBnX3Njb3BlLT5nZXRfc2VydmljZSgkMik7Ci0gICAgICAgIGlmICgkJCA9PSBOVUxMKSB7Ci0gICAgICAgICAgeXllcnJvcigiU2VydmljZSBcIiVzXCIgaGFzIG5vdCBiZWVuIGRlZmluZWQuIiwgJDIpOwotICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci18Ci0gICAgewotICAgICAgJCQgPSBOVUxMOwotICAgIH0KLQotRnVuY3Rpb25MaXN0OgotICBGdW5jdGlvbkxpc3QgRnVuY3Rpb24KLSAgICB7Ci0gICAgICBwZGVidWcoIkZ1bmN0aW9uTGlzdCAtPiBGdW5jdGlvbkxpc3QgRnVuY3Rpb24iKTsKLSAgICAgICQkID0gJDE7Ci0gICAgICAkMS0+YWRkX2Z1bmN0aW9uKCQyKTsKLSAgICB9Ci18Ci0gICAgewotICAgICAgcGRlYnVnKCJGdW5jdGlvbkxpc3QgLT4gIik7Ci0gICAgICAkJCA9IG5ldyB0X3NlcnZpY2UoZ19wcm9ncmFtKTsKLSAgICB9Ci0KLUZ1bmN0aW9uOgotICBDYXB0dXJlRG9jVGV4dCBPbmV3YXkgRnVuY3Rpb25UeXBlIHRva19pZGVudGlmaWVyICcoJyBGaWVsZExpc3QgJyknIFRocm93cyBUeXBlQW5ub3RhdGlvbnMgQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsCi0gICAgewotICAgICAgdmFsaWRhdGVfc2ltcGxlX2lkZW50aWZpZXIoICQ0KTsKLSAgICAgICQ2LT5zZXRfbmFtZShzdGQ6OnN0cmluZygkNCkgKyAiX2FyZ3MiKTsKLSAgICAgICQkID0gbmV3IHRfZnVuY3Rpb24oJDMsICQ0LCAkNiwgJDgsICQyKTsKLSAgICAgIGlmICgkMSAhPSBOVUxMKSB7Ci0gICAgICAgICQkLT5zZXRfZG9jKCQxKTsKLSAgICAgIH0KLSAgICAgIGlmICgkOSAhPSBOVUxMKSB7Ci0gICAgICAgICQkLT5hbm5vdGF0aW9uc18gPSAkOS0+YW5ub3RhdGlvbnNfOwotICAgICAgICBkZWxldGUgJDk7Ci0gICAgICB9Ci0gICAgfQotCi1PbmV3YXk6Ci0gIHRva19vbmV3YXkKLSAgICB7Ci0gICAgICAkJCA9IHRydWU7Ci0gICAgfQotfAotICAgIHsKLSAgICAgICQkID0gZmFsc2U7Ci0gICAgfQotCi1UaHJvd3M6Ci0gIHRva190aHJvd3MgJygnIEZpZWxkTGlzdCAnKScKLSAgICB7Ci0gICAgICBwZGVidWcoIlRocm93cyAtPiB0b2tfdGhyb3dzICggRmllbGRMaXN0ICkiKTsKLSAgICAgICQkID0gJDM7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0gJiYgIXZhbGlkYXRlX3Rocm93cygkJCkpIHsKLSAgICAgICAgeXllcnJvcigiVGhyb3dzIGNsYXVzZSBtYXkgbm90IGNvbnRhaW4gbm9uLWV4Y2VwdGlvbiB0eXBlcyIpOwotICAgICAgICBleGl0KDEpOwotICAgICAgfQotICAgIH0KLXwKLSAgICB7Ci0gICAgICAkJCA9IG5ldyB0X3N0cnVjdChnX3Byb2dyYW0pOwotICAgIH0KLQotRmllbGRMaXN0OgotICBGaWVsZExpc3QgRmllbGQKLSAgICB7Ci0gICAgICBwZGVidWcoIkZpZWxkTGlzdCAtPiBGaWVsZExpc3QgLCBGaWVsZCIpOwotICAgICAgJCQgPSAkMTsKLSAgICAgIGlmICghKCQkLT5hcHBlbmQoJDIpKSkgewotICAgICAgICB5eWVycm9yKCJcIiVkOiAlc1wiIC0gZmllbGQgaWRlbnRpZmllci9uYW1lIGhhcyBhbHJlYWR5IGJlZW4gdXNlZCIsICQyLT5nZXRfa2V5KCksICQyLT5nZXRfbmFtZSgpLmNfc3RyKCkpOwotICAgICAgICBleGl0KDEpOwotICAgICAgfQotICAgIH0KLXwKLSAgICB7Ci0gICAgICBwZGVidWcoIkZpZWxkTGlzdCAtPiAiKTsKLSAgICAgIHlfZmllbGRfdmFsID0gLTE7Ci0gICAgICAkJCA9IG5ldyB0X3N0cnVjdChnX3Byb2dyYW0pOwotICAgIH0KLQotRmllbGQ6Ci0gIENhcHR1cmVEb2NUZXh0IEZpZWxkSWRlbnRpZmllciBGaWVsZFJlcXVpcmVkbmVzcyBGaWVsZFR5cGUgRmllbGRSZWZlcmVuY2UgdG9rX2lkZW50aWZpZXIgRmllbGRWYWx1ZSBYc2RPcHRpb25hbCBYc2ROaWxsYWJsZSBYc2RBdHRyaWJ1dGVzIFR5cGVBbm5vdGF0aW9ucyBDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWwKLSAgICB7Ci0gICAgICBwZGVidWcoInRva19pbnRfY29uc3RhbnQgOiBGaWVsZCAtPiBGaWVsZFR5cGUgdG9rX2lkZW50aWZpZXIiKTsKLSAgICAgIGlmICgkMi5hdXRvX2Fzc2lnbmVkKSB7Ci0gICAgICAgIHB3YXJuaW5nKDEsICJObyBmaWVsZCBrZXkgc3BlY2lmaWVkIGZvciAlcywgcmVzdWx0aW5nIHByb3RvY29sIG1heSBoYXZlIGNvbmZsaWN0cyBvciBub3QgYmUgYmFja3dhcmRzIGNvbXBhdGlibGUhXG4iLCAkNik7Ci0gICAgICAgIGlmIChnX3N0cmljdCA+PSAxOTIpIHsKLSAgICAgICAgICB5eWVycm9yKCJJbXBsaWNpdCBmaWVsZCBrZXlzIGFyZSBkZXByZWNhdGVkIGFuZCBub3QgYWxsb3dlZCB3aXRoIC1zdHJpY3QiKTsKLSAgICAgICAgICBleGl0KDEpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICB2YWxpZGF0ZV9zaW1wbGVfaWRlbnRpZmllcigkNik7Ci0gICAgICAkJCA9IG5ldyB0X2ZpZWxkKCQ0LCAkNiwgJDIudmFsdWUpOwotICAgICAgJCQtPnNldF9yZWZlcmVuY2UoJDUpOwotICAgICAgJCQtPnNldF9yZXEoJDMpOwotICAgICAgaWYgKCQ3ICE9IE5VTEwpIHsKLSAgICAgICAgZ19zY29wZS0+cmVzb2x2ZV9jb25zdF92YWx1ZSgkNywgJDQpOwotICAgICAgICB2YWxpZGF0ZV9maWVsZF92YWx1ZSgkJCwgJDcpOwotICAgICAgICAkJC0+c2V0X3ZhbHVlKCQ3KTsKLSAgICAgIH0KLSAgICAgICQkLT5zZXRfeHNkX29wdGlvbmFsKCQ4KTsKLSAgICAgICQkLT5zZXRfeHNkX25pbGxhYmxlKCQ5KTsKLSAgICAgIGlmICgkMSAhPSBOVUxMKSB7Ci0gICAgICAgICQkLT5zZXRfZG9jKCQxKTsKLSAgICAgIH0KLSAgICAgIGlmICgkMTAgIT0gTlVMTCkgewotICAgICAgICAkJC0+c2V0X3hzZF9hdHRycygkMTApOwotICAgICAgfQotICAgICAgaWYgKCQxMSAhPSBOVUxMKSB7Ci0gICAgICAgICQkLT5hbm5vdGF0aW9uc18gPSAkMTEtPmFubm90YXRpb25zXzsKLSAgICAgICAgZGVsZXRlICQxMTsKLSAgICAgIH0KLSAgICB9Ci0KLUZpZWxkSWRlbnRpZmllcjoKLSAgdG9rX2ludF9jb25zdGFudCAnOicKLSAgICB7Ci0gICAgICBpZiAoJDEgPD0gMCkgewotICAgICAgICBpZiAoZ19hbGxvd19uZWdfZmllbGRfa2V5cykgewotICAgICAgICAgIC8qCi0gICAgICAgICAgICogZ19hbGxvd19uZWdfZmllbGRfa2V5cyBleGlzdHMgdG8gYWxsb3cgdXNlcnMgdG8gYWRkIGV4cGxpY2l0bHkKLSAgICAgICAgICAgKiBzcGVjaWZpZWQga2V5IHZhbHVlcyB0byBvbGQgLnRocmlmdCBmaWxlcyB3aXRob3V0IGJyZWFraW5nCi0gICAgICAgICAgICogcHJvdG9jb2wgY29tcGF0aWJpbGl0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBpZiAoJDEgIT0geV9maWVsZF92YWwpIHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiB3YXJuIGlmIHRoZSB1c2VyLXNwZWNpZmllZCBuZWdhdGl2ZSB2YWx1ZSBpc24ndCB3aGF0Ci0gICAgICAgICAgICAgKiB0aHJpZnQgd291bGQgaGF2ZSBhdXRvLWFzc2lnbmVkLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwd2FybmluZygxLCAiTm9ucG9zaXRpdmUgZmllbGQga2V5ICglIiBQUklpNjQiKSBkaWZmZXJzIGZyb20gd2hhdCB3b3VsZCBiZSAiCi0gICAgICAgICAgICAgICAgICAgICAiYXV0by1hc3NpZ25lZCBieSB0aHJpZnQgKCVkKS5cbiIsICQxLCB5X2ZpZWxkX3ZhbCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIC8qCi0gICAgICAgICAgICogTGVhdmUgJDEgYXMtaXMsIGFuZCB1cGRhdGUgeV9maWVsZF92YWwgdG8gYmUgb25lIGxlc3MgdGhhbiAkMS4KLSAgICAgICAgICAgKiBUaGUgRmllbGRMaXN0IHBhcnNpbmcgd2lsbCBjYXRjaCBhbnkgZHVwbGljYXRlIGtleSB2YWx1ZXMuCi0gICAgICAgICAgICovCi0gICAgICAgICAgeV9maWVsZF92YWwgPSBzdGF0aWNfY2FzdDxpbnQzMl90PigkMSAtIDEpOwotICAgICAgICAgICQkLnZhbHVlID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oJDEpOwotICAgICAgICAgICQkLmF1dG9fYXNzaWduZWQgPSBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBwd2FybmluZygxLCAiTm9ucG9zaXRpdmUgdmFsdWUgKCVkKSBub3QgYWxsb3dlZCBhcyBhIGZpZWxkIGtleS5cbiIsCi0gICAgICAgICAgICAgICAgICAgJDEpOwotICAgICAgICAgICQkLnZhbHVlID0geV9maWVsZF92YWwtLTsKLSAgICAgICAgICAkJC5hdXRvX2Fzc2lnbmVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgJCQudmFsdWUgPSBzdGF0aWNfY2FzdDxpbnQzMl90PigkMSk7Ci0gICAgICAgICQkLmF1dG9fYXNzaWduZWQgPSBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci18Ci0gICAgewotICAgICAgJCQudmFsdWUgPSB5X2ZpZWxkX3ZhbC0tOwotICAgICAgJCQuYXV0b19hc3NpZ25lZCA9IHRydWU7Ci0gICAgfQotCi1GaWVsZFJlZmVyZW5jZToKLSAgdG9rX3JlZmVyZW5jZQotICAgIHsKLSAgICAgICQkID0gdHJ1ZTsKLSAgICB9Ci18Ci0gICB7Ci0gICAgICQkID0gZmFsc2U7Ci0gICB9Ci0KLUZpZWxkUmVxdWlyZWRuZXNzOgotICB0b2tfcmVxdWlyZWQKLSAgICB7Ci0gICAgICAkJCA9IHRfZmllbGQ6OlRfUkVRVUlSRUQ7Ci0gICAgfQotfCB0b2tfb3B0aW9uYWwKLSAgICB7Ci0gICAgICBpZiAoZ19hcmdsaXN0KSB7Ci0gICAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICAgIHB3YXJuaW5nKDEsICJvcHRpb25hbCBrZXl3b3JkIGlzIGlnbm9yZWQgaW4gYXJndW1lbnQgbGlzdHMuXG4iKTsKLSAgICAgICAgfQotICAgICAgICAkJCA9IHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQ7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAkJCA9IHRfZmllbGQ6OlRfT1BUSU9OQUw7Ci0gICAgICB9Ci0gICAgfQotfAotICAgIHsKLSAgICAgICQkID0gdF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVDsKLSAgICB9Ci0KLUZpZWxkVmFsdWU6Ci0gICc9JyBDb25zdFZhbHVlCi0gICAgewotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgICQkID0gJDI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAkJCA9IE5VTEw7Ci0gICAgICB9Ci0gICAgfQotfAotICAgIHsKLSAgICAgICQkID0gTlVMTDsKLSAgICB9Ci0KLUZ1bmN0aW9uVHlwZToKLSAgRmllbGRUeXBlCi0gICAgewotICAgICAgcGRlYnVnKCJGdW5jdGlvblR5cGUgLT4gRmllbGRUeXBlIik7Ci0gICAgICAkJCA9ICQxOwotICAgIH0KLXwgdG9rX3ZvaWQKLSAgICB7Ci0gICAgICBwZGVidWcoIkZ1bmN0aW9uVHlwZSAtPiB0b2tfdm9pZCIpOwotICAgICAgJCQgPSBnX3R5cGVfdm9pZDsKLSAgICB9Ci0KLUZpZWxkVHlwZToKLSAgdG9rX2lkZW50aWZpZXIKLSAgICB7Ci0gICAgICBwZGVidWcoIkZpZWxkVHlwZSAtPiB0b2tfaWRlbnRpZmllciIpOwotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBJTkNMVURFUykgewotICAgICAgICAvLyBJZ25vcmUgaWRlbnRpZmllcnMgaW4gaW5jbHVkZSBtb2RlCi0gICAgICAgICQkID0gTlVMTDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIExvb2t1cCB0aGUgaWRlbnRpZmllciBpbiB0aGUgY3VycmVudCBzY29wZQotICAgICAgICAkJCA9IGdfc2NvcGUtPmdldF90eXBlKCQxKTsKLSAgICAgICAgaWYgKCQkID09IE5VTEwpIHsKLSAgICAgICAgICAvKgotICAgICAgICAgICAqIEVpdGhlciB0aGlzIHR5cGUgaXNuJ3QgeWV0IGRlY2xhcmVkLCBvciBpdCdzIG5ldmVyCi0gICAgICAgICAgICAgZGVjbGFyZWQuICBFaXRoZXIgd2F5IGFsbG93IGl0IGFuZCB3ZSdsbCBmaWd1cmUgaXQgb3V0Ci0gICAgICAgICAgICAgZHVyaW5nIGdlbmVyYXRpb24uCi0gICAgICAgICAgICovCi0gICAgICAgICAgJCQgPSBuZXcgdF90eXBlZGVmKGdfcHJvZ3JhbSwgJDEsIHRydWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotfCBCYXNlVHlwZQotICAgIHsKLSAgICAgIHBkZWJ1ZygiRmllbGRUeXBlIC0+IEJhc2VUeXBlIik7Ci0gICAgICAkJCA9ICQxOwotICAgIH0KLXwgQ29udGFpbmVyVHlwZQotICAgIHsKLSAgICAgIHBkZWJ1ZygiRmllbGRUeXBlIC0+IENvbnRhaW5lclR5cGUiKTsKLSAgICAgICQkID0gJDE7Ci0gICAgfQotCi1CYXNlVHlwZTogU2ltcGxlQmFzZVR5cGUgVHlwZUFubm90YXRpb25zCi0gICAgewotICAgICAgcGRlYnVnKCJCYXNlVHlwZSAtPiBTaW1wbGVCYXNlVHlwZSBUeXBlQW5ub3RhdGlvbnMiKTsKLSAgICAgIGlmICgkMiAhPSBOVUxMKSB7Ci0gICAgICAgICQkID0gbmV3IHRfYmFzZV90eXBlKCpzdGF0aWNfY2FzdDx0X2Jhc2VfdHlwZSo+KCQxKSk7Ci0gICAgICAgICQkLT5hbm5vdGF0aW9uc18gPSAkMi0+YW5ub3RhdGlvbnNfOwotICAgICAgICBkZWxldGUgJDI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAkJCA9ICQxOwotICAgICAgfQotICAgIH0KLQotU2ltcGxlQmFzZVR5cGU6Ci0gIHRva19zdHJpbmcKLSAgICB7Ci0gICAgICBwZGVidWcoIkJhc2VUeXBlIC0+IHRva19zdHJpbmciKTsKLSAgICAgICQkID0gZ190eXBlX3N0cmluZzsKLSAgICB9Ci18IHRva19iaW5hcnkKLSAgICB7Ci0gICAgICBwZGVidWcoIkJhc2VUeXBlIC0+IHRva19iaW5hcnkiKTsKLSAgICAgICQkID0gZ190eXBlX2JpbmFyeTsKLSAgICB9Ci18IHRva19zbGlzdAotICAgIHsKLSAgICAgIHBkZWJ1ZygiQmFzZVR5cGUgLT4gdG9rX3NsaXN0Iik7Ci0gICAgICAkJCA9IGdfdHlwZV9zbGlzdDsKLSAgICB9Ci18IHRva19ib29sCi0gICAgewotICAgICAgcGRlYnVnKCJCYXNlVHlwZSAtPiB0b2tfYm9vbCIpOwotICAgICAgJCQgPSBnX3R5cGVfYm9vbDsKLSAgICB9Ci18IHRva19ieXRlCi0gICAgewotICAgICAgcGRlYnVnKCJCYXNlVHlwZSAtPiB0b2tfYnl0ZSIpOwotICAgICAgJCQgPSBnX3R5cGVfYnl0ZTsKLSAgICB9Ci18IHRva19pMTYKLSAgICB7Ci0gICAgICBwZGVidWcoIkJhc2VUeXBlIC0+IHRva19pMTYiKTsKLSAgICAgICQkID0gZ190eXBlX2kxNjsKLSAgICB9Ci18IHRva19pMzIKLSAgICB7Ci0gICAgICBwZGVidWcoIkJhc2VUeXBlIC0+IHRva19pMzIiKTsKLSAgICAgICQkID0gZ190eXBlX2kzMjsKLSAgICB9Ci18IHRva19pNjQKLSAgICB7Ci0gICAgICBwZGVidWcoIkJhc2VUeXBlIC0+IHRva19pNjQiKTsKLSAgICAgICQkID0gZ190eXBlX2k2NDsKLSAgICB9Ci18IHRva19kb3VibGUKLSAgICB7Ci0gICAgICBwZGVidWcoIkJhc2VUeXBlIC0+IHRva19kb3VibGUiKTsKLSAgICAgICQkID0gZ190eXBlX2RvdWJsZTsKLSAgICB9Ci0KLUNvbnRhaW5lclR5cGU6IFNpbXBsZUNvbnRhaW5lclR5cGUgVHlwZUFubm90YXRpb25zCi0gICAgewotICAgICAgcGRlYnVnKCJDb250YWluZXJUeXBlIC0+IFNpbXBsZUNvbnRhaW5lclR5cGUgVHlwZUFubm90YXRpb25zIik7Ci0gICAgICAkJCA9ICQxOwotICAgICAgaWYgKCQyICE9IE5VTEwpIHsKLSAgICAgICAgJCQtPmFubm90YXRpb25zXyA9ICQyLT5hbm5vdGF0aW9uc187Ci0gICAgICAgIGRlbGV0ZSAkMjsKLSAgICAgIH0KLSAgICB9Ci0KLVNpbXBsZUNvbnRhaW5lclR5cGU6Ci0gIE1hcFR5cGUKLSAgICB7Ci0gICAgICBwZGVidWcoIlNpbXBsZUNvbnRhaW5lclR5cGUgLT4gTWFwVHlwZSIpOwotICAgICAgJCQgPSAkMTsKLSAgICB9Ci18IFNldFR5cGUKLSAgICB7Ci0gICAgICBwZGVidWcoIlNpbXBsZUNvbnRhaW5lclR5cGUgLT4gU2V0VHlwZSIpOwotICAgICAgJCQgPSAkMTsKLSAgICB9Ci18IExpc3RUeXBlCi0gICAgewotICAgICAgcGRlYnVnKCJTaW1wbGVDb250YWluZXJUeXBlIC0+IExpc3RUeXBlIik7Ci0gICAgICAkJCA9ICQxOwotICAgIH0KLQotTWFwVHlwZToKLSAgdG9rX21hcCBDcHBUeXBlICc8JyBGaWVsZFR5cGUgJywnIEZpZWxkVHlwZSAnPicKLSAgICB7Ci0gICAgICBwZGVidWcoIk1hcFR5cGUgLT4gdG9rX21hcCA8RmllbGRUeXBlLCBGaWVsZFR5cGU+Iik7Ci0gICAgICAkJCA9IG5ldyB0X21hcCgkNCwgJDYpOwotICAgICAgaWYgKCQyICE9IE5VTEwpIHsKLSAgICAgICAgKCh0X2NvbnRhaW5lciopJCQpLT5zZXRfY3BwX25hbWUoc3RkOjpzdHJpbmcoJDIpKTsKLSAgICAgIH0KLSAgICB9Ci0KLVNldFR5cGU6Ci0gIHRva19zZXQgQ3BwVHlwZSAnPCcgRmllbGRUeXBlICc+JwotICAgIHsKLSAgICAgIHBkZWJ1ZygiU2V0VHlwZSAtPiB0b2tfc2V0PEZpZWxkVHlwZT4iKTsKLSAgICAgICQkID0gbmV3IHRfc2V0KCQ0KTsKLSAgICAgIGlmICgkMiAhPSBOVUxMKSB7Ci0gICAgICAgICgodF9jb250YWluZXIqKSQkKS0+c2V0X2NwcF9uYW1lKHN0ZDo6c3RyaW5nKCQyKSk7Ci0gICAgICB9Ci0gICAgfQotCi1MaXN0VHlwZToKLSAgdG9rX2xpc3QgJzwnIEZpZWxkVHlwZSAnPicgQ3BwVHlwZQotICAgIHsKLSAgICAgIHBkZWJ1ZygiTGlzdFR5cGUgLT4gdG9rX2xpc3Q8RmllbGRUeXBlPiIpOwotICAgICAgY2hlY2tfZm9yX2xpc3Rfb2ZfYnl0ZXMoJDMpOwotICAgICAgJCQgPSBuZXcgdF9saXN0KCQzKTsKLSAgICAgIGlmICgkNSAhPSBOVUxMKSB7Ci0gICAgICAgICgodF9jb250YWluZXIqKSQkKS0+c2V0X2NwcF9uYW1lKHN0ZDo6c3RyaW5nKCQ1KSk7Ci0gICAgICB9Ci0gICAgfQotCi1DcHBUeXBlOgotICB0b2tfY3BwX3R5cGUgdG9rX2xpdGVyYWwKLSAgICB7Ci0gICAgICAkJCA9ICQyOwotICAgIH0KLXwKLSAgICB7Ci0gICAgICAkJCA9IE5VTEw7Ci0gICAgfQotCi1UeXBlQW5ub3RhdGlvbnM6Ci0gICcoJyBUeXBlQW5ub3RhdGlvbkxpc3QgJyknCi0gICAgewotICAgICAgcGRlYnVnKCJUeXBlQW5ub3RhdGlvbnMgLT4gKCBUeXBlQW5ub3RhdGlvbkxpc3QgKSIpOwotICAgICAgJCQgPSAkMjsKLSAgICB9Ci18Ci0gICAgewotICAgICAgJCQgPSBOVUxMOwotICAgIH0KLQotVHlwZUFubm90YXRpb25MaXN0OgotICBUeXBlQW5ub3RhdGlvbkxpc3QgVHlwZUFubm90YXRpb24KLSAgICB7Ci0gICAgICBwZGVidWcoIlR5cGVBbm5vdGF0aW9uTGlzdCAtPiBUeXBlQW5ub3RhdGlvbkxpc3QgLCBUeXBlQW5ub3RhdGlvbiIpOwotICAgICAgJCQgPSAkMTsKLSAgICAgICQkLT5hbm5vdGF0aW9uc19bJDItPmtleV0gPSAkMi0+dmFsOwotICAgICAgZGVsZXRlICQyOwotICAgIH0KLXwKLSAgICB7Ci0gICAgICAvKiBKdXN0IHVzZSBhIGR1bW15IHN0cnVjdHVyZSB0byBob2xkIHRoZSBhbm5vdGF0aW9ucy4gKi8KLSAgICAgICQkID0gbmV3IHRfc3RydWN0KGdfcHJvZ3JhbSk7Ci0gICAgfQotCi1UeXBlQW5ub3RhdGlvbjoKLSAgdG9rX2lkZW50aWZpZXIgVHlwZUFubm90YXRpb25WYWx1ZSBDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWwKLSAgICB7Ci0gICAgICBwZGVidWcoIlR5cGVBbm5vdGF0aW9uIC0+IFR5cGVBbm5vdGF0aW9uVmFsdWUiKTsKLSAgICAgICQkID0gbmV3IHRfYW5ub3RhdGlvbjsKLSAgICAgICQkLT5rZXkgPSAkMTsKLSAgICAgICQkLT52YWwgPSAkMjsKLSAgICB9Ci0KLVR5cGVBbm5vdGF0aW9uVmFsdWU6Ci0gICc9JyB0b2tfbGl0ZXJhbAotICAgIHsKLSAgICAgIHBkZWJ1ZygiVHlwZUFubm90YXRpb25WYWx1ZSAtPiA9IHRva19saXRlcmFsIik7Ci0gICAgICAkJCA9ICQyOwotICAgIH0KLXwKLSAgICB7Ci0gICAgICBwZGVidWcoIlR5cGVBbm5vdGF0aW9uVmFsdWUgLT4iKTsKLSAgICAgICQkID0gc3RyZHVwKCIxIik7Ci0gICAgfQotCi0lJQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy93aW5kb3dzL2NvbmZpZy5oIGIvY29tcGlsZXIvY3BwL3NyYy93aW5kb3dzL2NvbmZpZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjAwMDgwLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvd2luZG93cy9jb25maWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1dJTkRPV1NfQ09ORklHX0hfCi0jZGVmaW5lIF9USFJJRlRfV0lORE9XU19DT05GSUdfSF8gMQotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID4gMTIwMCkKLSNwcmFnbWEgb25jZQotI2VuZGlmIC8vIF9NU0NfVkVSCi0KLSNpZm5kZWYgX1dJTjMyCi0jZXJyb3IgIlRoaXMgaXMgYSBXaW5kb3dzIGhlYWRlciBvbmx5IgotI2VuZGlmCi0KLSNpbmNsdWRlIDxpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGRpcmVjdC5oPgotCi0jZGVmaW5lIHN0cnRvbGwoYmVnaW5fcHRyLCBlbmRfcHRyLCBsZW5ndGgpIF9zdHJ0b2k2NChiZWdpbl9wdHIsIGVuZF9wdHIsIGxlbmd0aCkKLQotI2RlZmluZSBQUkl1NjQgIkk2NGQiCi0jZGVmaW5lIFBSSWk2NCAiSTY0ZCIKLQotLy8gc3F1ZWxjaCBkZXByZWNhdGlvbiB3YXJuaW5ncwotI3ByYWdtYSB3YXJuaW5nKGRpc2FibGUgOiA0OTk2KQotLy8gc3F1ZWxjaCBib29sIGNvbnZlcnNpb24gcGVyZm9ybWFuY2Ugd2FybmluZwotI3ByYWdtYSB3YXJuaW5nKGRpc2FibGUgOiA0ODAwKQotCi0jZW5kaWYgLy8gX1RIUklGVF9XSU5ET1dTX0NPTkZJR19IXwpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy93aW5kb3dzL3ZlcnNpb24uaC5pbiBiL2NvbXBpbGVyL2NwcC9zcmMvd2luZG93cy92ZXJzaW9uLmguaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwZWJjYTYuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy93aW5kb3dzL3ZlcnNpb24uaC5pbgorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1dJTkRPV1NfVkVSU0lPTl9IXwotI2RlZmluZSBfVEhSSUZUX1dJTkRPV1NfVkVSU0lPTl9IXyAxCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPiAxMjAwKQotI3ByYWdtYSBvbmNlCi0jZW5kaWYgLy8gX01TQ19WRVIKLQotI2lmbmRlZiBfV0lOMzIKLSNlcnJvciAiVGhpcyBpcyBhIFdpbmRvd3MgaGVhZGVyIG9ubHkiCi0jZW5kaWYKLQotI2RlZmluZSBUSFJJRlRfVkVSU0lPTiAiQFBBQ0tBR0VfVkVSU0lPTkAiCi0KLSNlbmRpZiAvLyBfVEhSSUZUX1dJTkRPV1NfVkVSU0lPTl9IXwpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3QvQ01ha2VMaXN0cy50eHQgYi9jb21waWxlci9jcHAvdGVzdC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDlmMjNkCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3QvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw5MiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKworaWYoJHtXSVRIX1BMVUdJTn0pCisgICAgaW5jbHVkZV9kaXJlY3RvcmllcyhTWVNURU0gIiR7Qm9vc3RfSU5DTFVERV9ESVJTfSIpCisKKyAgICAjIE1ha2Ugc3VyZSBnZW4tY3BwIGZpbGVzIGNhbiBiZSBpbmNsdWRlZAorICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMoIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfSIpCisKKyAgICBzZXQocGx1Z2ludGVzdF9TT1VSQ0VTCisgICAgICAgIHBsdWdpbi9jb252ZXJzaW9uX3Rlc3QuY2MKKyAgICApCisgICAgYWRkX2V4ZWN1dGFibGUocGx1Z2ludGVzdCAke3BsdWdpbnRlc3RfU09VUkNFU30pCisgICAgaWYoV0lUSF9TSEFSRURfTElCIEFORCBOT1QgTVNWQykKKyAgICAgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKHBsdWdpbnRlc3QKKyAgICAgICAgICAgIHRocmlmdGMKKyAgICAgICAgICAgICR7Qm9vc3RfTElCUkFSSUVTfQorICAgICAgICApCisgICAgZWxzZSgpCisgICAgICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyhwbHVnaW50ZXN0CisgICAgICAgICAgICB0aHJpZnRjX3N0YXRpYworICAgICAgICAgICAgdGhyaWZ0X3N0YXRpYworICAgICAgICAgICAgJHtCb29zdF9MSUJSQVJJRVN9CisgICAgICAgICkKKyAgICBlbmRpZigpCisgICAgYWRkX3Rlc3QoTkFNRSBQbHVnaW5Vbml0VGVzdCBDT01NQU5EIHBsdWdpbnRlc3QpCisKKyAgICBzZXQodGhyaWZ0LWdlbi1teWNwcF9TT1VSQ0VTCisgICAgICAgIC4uL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9jcHBfZ2VuZXJhdG9yLmNjCisgICAgICAgIHBsdWdpbi9jcHBfcGx1Z2luLmNjCisgICAgKQorICAgIGFkZF9leGVjdXRhYmxlKHRocmlmdC1nZW4tbXljcHAgJHt0aHJpZnQtZ2VuLW15Y3BwX1NPVVJDRVN9KQorICAgIGlmKFdJVEhfU0hBUkVEX0xJQiBBTkQgTk9UIE1TVkMpCisgICAgICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyh0aHJpZnQtZ2VuLW15Y3BwIHRocmlmdGMpCisgICAgZWxzZSgpCisgICAgICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyh0aHJpZnQtZ2VuLW15Y3BwIHRocmlmdGNfc3RhdGljIHRocmlmdF9zdGF0aWMpCisgICAgZW5kaWYoKQorCisgICAgaWYoQ01BS0VfQlVJTERfVFlQRSBTVFJFUVVBTCAiRGVidWciKQorICAgICAgICBzZXQoQlVJTERUWVBFICJEZWJ1ZyIpCisgICAgZWxzZSgpCisgICAgICAgICMgUmVsV2l0aERlYkluZm8gZ2VuZXJhdGVzIGJpbmFyaWVzIGluICJSZWxlYXNlIiBkaXJlY3RvcnkgdG9vCisgICAgICAgIHNldChCVUlMRFRZUEUgIlJlbGVhc2UiKQorICAgIGVuZGlmKCkKKworICAgIHNldF9kaXJlY3RvcnlfcHJvcGVydGllcyhQUk9QRVJUSUVTCisgICAgICAgIEFERElUSU9OQUxfTUFLRV9DTEVBTl9GSUxFUyBnZW4tY3BwCisgICAgICAgIEFERElUSU9OQUxfTUFLRV9DTEVBTl9GSUxFUyBnZW4tbXljcHApCisKKyAgICBmaWxlKE1BS0VfRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4tY3BwKQorICAgIGZpbGUoTUFLRV9ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1teWNwcCkKKyAgICBhZGRfdGVzdChOQU1FIFBsdWdpbkludGVncmF0aW9uVGVzdAorICAgICAgICAgICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfQorICAgICAgICAgICAgICAgICAtRFRIUklGVF9DT01QSUxFUj0ke1RIUklGVF9DT01QSUxFUn0KKyAgICAgICAgICAgICAgICAgLURCSU5ESVI9JHtDTUFLRV9SVU5USU1FX09VVFBVVF9ESVJFQ1RPUll9CisgICAgICAgICAgICAgICAgIC1EQlVJTERUWVBFPSR7QlVJTERUWVBFfQorICAgICAgICAgICAgICAgICAtRENVUkRJUj0ke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0KKyAgICAgICAgICAgICAgICAgLURTUkNESVI9JHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9CisgICAgICAgICAgICAgICAgIC1QICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9jcHBfcGx1Z2luX3Rlc3QuY21ha2UpCitlbmRpZigpCisKK2ZpbGUoR0xPQiBLRVlXT1JEX1NBTVBMRVMgIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9rZXl3b3JkLXNhbXBsZXMvKi50aHJpZnQiKQorZm9yZWFjaChMQU5HICR7dGhyaWZ0X2NvbXBpbGVyX0xBTkdTfSkKKyAgICBmb3JlYWNoKFNBTVBMRSAke0tFWVdPUkRfU0FNUExFU30pCisgICAgICAgIGdldF9maWxlbmFtZV9jb21wb25lbnQoRklMRU5BTUUgJHtTQU1QTEV9IE5BTUVfV0UpCisgICAgICAgIGFkZF90ZXN0KE5BTUUgIiR7TEFOR31fJHtGSUxFTkFNRX0iCisgICAgICAgICAgICBDT01NQU5EIHRocmlmdC1jb21waWxlciAtLWdlbiAke0xBTkd9ICR7U0FNUExFfSkKKyAgICAgICAgc2V0X3Rlc3RzX3Byb3BlcnRpZXMoIiR7TEFOR31fJHtGSUxFTkFNRX0iIFBST1BFUlRJRVMKKyAgICAgICAgICAgIFBBU1NfUkVHVUxBUl9FWFBSRVNTSU9OICJDYW5ub3QgdXNlIHJlc2VydmVkIGxhbmd1YWdlIGtleXdvcmQiKQorICAgIGVuZGZvcmVhY2goKQorZW5kZm9yZWFjaCgpCisKKworZmluZF9wYWNrYWdlKFB5dGhvbkludGVycCBSRVFVSVJFRCkKK2FkZF90ZXN0KE5BTUUgU3RhbGVuZXNzQ2hlY2tUZXN0IENPTU1BTkQgJHtQWVRIT05fRVhFQ1VUQUJMRX0gJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2NvbXBpbGVyL3N0YWxlbmVzc19jaGVjay5weSAke1RIUklGVF9DT01QSUxFUn0pCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9NYWtlZmlsZS5hbSBiL2NvbXBpbGVyL2NwcC90ZXN0L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ZmM5MWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDYwIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMKKyMgQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyMgUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyMgZGV0YWlscy4KKworQVVUT01BS0VfT1BUSU9OUyA9IHN1YmRpci1vYmplY3RzIHNlcmlhbC10ZXN0cworCitBTV9DUFBGTEFHUyA9ICQoQk9PU1RfQ1BQRkxBR1MpIC1JJCh0b3Bfc3JjZGlyKS9jb21waWxlci9jcHAvc3JjCitBTV9MREZMQUdTID0gJChCT09TVF9MREZMQUdTKQorQU1fQ1hYRkxBR1MgPSAtV2FsbCAtV2V4dHJhIC1wZWRhbnRpYworCitpZiBXSVRIX1BMVUdJTgorY2hlY2tfUFJPR1JBTVMgPSBwbHVnaW50ZXN0CisKK25vaW5zdF9QUk9HUkFNUyA9IHRocmlmdC1nZW4tbXljcHAKKworYWxsLWxvY2FsOiB0aHJpZnQtZ2VuLWJpbmNhdAorCitBTV9DUFBGTEFHUyArPSAtSSQodG9wX3NyY2RpcikvbGliL2NwcC9zcmMgLUkkKHRvcF9idWlsZGRpcikvbGliL2NwcC9zcmMKKworcGx1Z2ludGVzdF9TT1VSQ0VTID0gcGx1Z2luL2NvbnZlcnNpb25fdGVzdC5jYworcGx1Z2ludGVzdF9MREFERCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvbGlidGhyaWZ0Yy5sYQorCit0aHJpZnRfZ2VuX215Y3BwX1NPVVJDRVMgPSBwbHVnaW4vY3BwX3BsdWdpbi5jYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4vdF9jcHBfZ2VuZXJhdG9yLmNjCit0aHJpZnRfZ2VuX215Y3BwX0NQUEZMQUdTID0gJChBTV9DUFBGTEFHUykgLUkkKHRvcF9zcmNkaXIpL2NvbXBpbGVyL2NwcCAtSSQodG9wX3NyY2RpcikvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZQordGhyaWZ0X2dlbl9teWNwcF9MREFERCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvbGlidGhyaWZ0Yy5sYQorCitjcHBfcGx1Z2luX3Rlc3Quc2g6IHRocmlmdC1nZW4tbXljcHAKKwordGhyaWZ0LWdlbi1iaW5jYXQ6CisJY3AgYmluY2F0LnNoICRACisJY2htb2QgNzU1ICRACisKK3BsdWdpbl9zdGFiaWxpdHlfdGVzdC5zaDogdGhyaWZ0LWdlbi1iaW5jYXQKKworVEVTVFMgPSAkKGNoZWNrX1BST0dSQU1TKSBjcHBfcGx1Z2luX3Rlc3Quc2ggcGx1Z2luX3N0YWJpbGl0eV90ZXN0LnNoCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yZiBnZW4tY3BwIGdlbi1teWNwcCBnZW4tYmluY2F0IHRocmlmdC1nZW4tYmluY2F0CisKK2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9iaW5jYXQuc2ggYi9jb21waWxlci9jcHAvdGVzdC9iaW5jYXQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzdmOTA3OAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L2JpbmNhdC5zaApAQCAtMCwwICsxLDMgQEAKKyMhL2Jpbi9iYXNoCisKK2V4ZWMgL2Jpbi9jYXQKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2NvbXBpbGVyL0luY2x1ZGVkLnRocmlmdCBiL2NvbXBpbGVyL2NwcC90ZXN0L2NvbXBpbGVyL0luY2x1ZGVkLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTg0YWI2Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3QvY29tcGlsZXIvSW5jbHVkZWQudGhyaWZ0CkBAIC0wLDAgKzEsMTggQEAKK2NvbnN0IHN0cmluZyBmb28gPSAiYmFyIgorCitzdHJ1Y3QgYV9zdHJ1Y3QgeworICAxOiBib29sIGltX3RydWUsCisgIDI6IGJvb2wgaW1fZmFsc2UsCisgIDM6IGk4IGFfYml0ZSwKKyAgNDogaTE2IGludGVnZXIxNiwKKyAgNTogaTMyIGludGVnZXIzMiwKKyAgNjogaTY0IGludGVnZXI2NCwKKyAgNzogZG91YmxlIGRvdWJsZV9wcmVjaXNpb24sCisgIDg6IHN0cmluZyBzb21lX2NoYXJhY3RlcnMsCisgIDk6IHN0cmluZyB6b21nX3VuaWNvZGUsCisgIDEwOiBib29sIHdoYXRfd2hvLAorfQorCitzZXJ2aWNlIEFTZXJ2aWNlIHsKKyAgaTMyIGFfcHJvY2VkdXJlKDE6IGkzMiBhcmcpCit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9jb21waWxlci9JbmNsdWRpbmcudGhyaWZ0IGIvY29tcGlsZXIvY3BwL3Rlc3QvY29tcGlsZXIvSW5jbHVkaW5nLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzdhZjdiCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3QvY29tcGlsZXIvSW5jbHVkaW5nLnRocmlmdApAQCAtMCwwICsxLDcgQEAKK2luY2x1ZGUgIkluY2x1ZGVkLnRocmlmdCIKKworY29uc3Qgc3RyaW5nIHMgPSAic3RyaW5nIgorCitzdHJ1Y3QgQlN0cnVjdCB7CisgIDE6IEluY2x1ZGVkLmFfc3RydWN0IG9uZV9vZl9lYWNoCit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9jb21waWxlci9TaW5nbGUudGhyaWZ0IGIvY29tcGlsZXIvY3BwL3Rlc3QvY29tcGlsZXIvU2luZ2xlLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWMzMDFmCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3QvY29tcGlsZXIvU2luZ2xlLnRocmlmdApAQCAtMCwwICsxIEBACitjb25zdCBzdHJpbmcgZm9vID0gImJhciIKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2NvbXBpbGVyL3N0YWxlbmVzc19jaGVjay5weSBiL2NvbXBpbGVyL2NwcC90ZXN0L2NvbXBpbGVyL3N0YWxlbmVzc19jaGVjay5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41YjExZGZmCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3QvY29tcGlsZXIvc3RhbGVuZXNzX2NoZWNrLnB5CkBAIC0wLDAgKzEsMTQyIEBACisjIS91c3IvYmluL2VudiBweXRob24zCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KK2ltcG9ydCBvcworaW1wb3J0IHNodXRpbAoraW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IHRpbWUKK2ltcG9ydCB1bml0dGVzdAorCisKK2NsYXNzIFRlc3RTdGFsZW5lc3NDaGVjayh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBDVVJSRU5UX0RJUl9QQVRIID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGgucmVhbHBhdGgoX19maWxlX18pKQorICAgIFRIUklGVF9FWEVDVVRBQkxFX1BBVEggPSBOb25lCisgICAgU0lOR0xFX1RIUklGVF9GSUxFX1BBVEggPSBvcy5wYXRoLmpvaW4oQ1VSUkVOVF9ESVJfUEFUSCwgIlNpbmdsZS50aHJpZnQiKQorICAgIElOQ0xVRElOR19USFJJRlRfRklMRV9QQVRIID0gb3MucGF0aC5qb2luKENVUlJFTlRfRElSX1BBVEgsICJJbmNsdWRpbmcudGhyaWZ0IikKKyAgICBJTkNMVURFRF9USFJJRlRfRklMRV9QQVRIID0gb3MucGF0aC5qb2luKENVUlJFTlRfRElSX1BBVEgsICJJbmNsdWRlZC50aHJpZnQiKQorCisgICAgZGVmIHRlc3Rfc3RhbGVuZXNzX2NoZWNrX29mX3NpbmdsZV90aHJpZnRfZmlsZV93aXRob3V0X2NoYW5nZWRfb3V0cHV0KHNlbGYpOgorICAgICAgICB0ZW1wX2RpciA9IHRlbXBmaWxlLm1rZHRlbXAoZGlyPVRlc3RTdGFsZW5lc3NDaGVjay5DVVJSRU5UX0RJUl9QQVRIKQorCisgICAgICAgIGNvbW1hbmQgPSBbVGVzdFN0YWxlbmVzc0NoZWNrLlRIUklGVF9FWEVDVVRBQkxFX1BBVEgsICItZ2VuIiwgImNwcCIsICItbyIsIHRlbXBfZGlyXQorICAgICAgICBjb21tYW5kICs9IFtUZXN0U3RhbGVuZXNzQ2hlY2suU0lOR0xFX1RIUklGVF9GSUxFX1BBVEhdCisgICAgICAgIHN1YnByb2Nlc3MuY2FsbChjb21tYW5kKQorCisgICAgICAgIHVzZWRfZmlsZV9wYXRoID0gb3MucGF0aC5qb2luKHRlbXBfZGlyLCAiZ2VuLWNwcCIsICJTaW5nbGVfY29uc3RhbnRzLmNwcCIpCisKKyAgICAgICAgZmlyc3RfbW9kaWZpY2F0aW9uX3RpbWUgPSBvcy5wYXRoLmdldG10aW1lKG9zLnBhdGguam9pbih1c2VkX2ZpbGVfcGF0aCkpCisKKyAgICAgICAgdGltZS5zbGVlcCgwLjEpCisKKyAgICAgICAgc3VicHJvY2Vzcy5jYWxsKGNvbW1hbmQpCisKKyAgICAgICAgc2Vjb25kX21vZGlmaWNhdGlvbl90aW1lID0gb3MucGF0aC5nZXRtdGltZSh1c2VkX2ZpbGVfcGF0aCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlY29uZF9tb2RpZmljYXRpb25fdGltZSwgZmlyc3RfbW9kaWZpY2F0aW9uX3RpbWUpCisKKyAgICAgICAgc2h1dGlsLnJtdHJlZSh0ZW1wX2RpciwgaWdub3JlX2Vycm9ycz1UcnVlKQorCisgICAgZGVmIHRlc3Rfc3RhbGVuZXNzX2NoZWNrX29mX3NpbmdsZV90aHJpZnRfZmlsZV93aXRoX2NoYW5nZWRfb3V0cHV0KHNlbGYpOgorICAgICAgICB0ZW1wX2RpciA9IHRlbXBmaWxlLm1rZHRlbXAoZGlyPVRlc3RTdGFsZW5lc3NDaGVjay5DVVJSRU5UX0RJUl9QQVRIKQorCisgICAgICAgIGNvbW1hbmQgPSBbVGVzdFN0YWxlbmVzc0NoZWNrLlRIUklGVF9FWEVDVVRBQkxFX1BBVEgsICItZ2VuIiwgImNwcCIsICItbyIsIHRlbXBfZGlyXQorICAgICAgICBjb21tYW5kICs9IFtUZXN0U3RhbGVuZXNzQ2hlY2suU0lOR0xFX1RIUklGVF9GSUxFX1BBVEhdCisgICAgICAgIHN1YnByb2Nlc3MuY2FsbChjb21tYW5kKQorCisgICAgICAgIHVzZWRfZmlsZV9wYXRoID0gb3MucGF0aC5qb2luKHRlbXBfZGlyLCAiZ2VuLWNwcCIsICJTaW5nbGVfY29uc3RhbnRzLmNwcCIpCisKKyAgICAgICAgZmlyc3RfbW9kaWZpY2F0aW9uX3RpbWUgPSBvcy5wYXRoLmdldG10aW1lKG9zLnBhdGguam9pbih1c2VkX2ZpbGVfcGF0aCkpCisgICAgICAgIHVzZWRfZmlsZSA9IG9wZW4odXNlZF9maWxlX3BhdGgsICJyIikKKyAgICAgICAgZmlyc3RfY29udGVudHMgPSB1c2VkX2ZpbGUucmVhZCgpCisgICAgICAgIHVzZWRfZmlsZS5jbG9zZSgpCisKKyAgICAgICAgdXNlZF9maWxlID0gb3Blbih1c2VkX2ZpbGVfcGF0aCwgImEiKQorICAgICAgICB1c2VkX2ZpbGUud3JpdGUoIlxuLyogVGhpcyBpcyBhIGNvbW1lbnQgKi9cbiIpCisgICAgICAgIHVzZWRfZmlsZS5jbG9zZSgpCisKKyAgICAgICAgdGltZS5zbGVlcCgwLjEpCisKKyAgICAgICAgc3VicHJvY2Vzcy5jYWxsKGNvbW1hbmQpCisKKyAgICAgICAgc2Vjb25kX21vZGlmaWNhdGlvbl90aW1lID0gb3MucGF0aC5nZXRtdGltZSh1c2VkX2ZpbGVfcGF0aCkKKyAgICAgICAgdXNlZF9maWxlID0gb3Blbih1c2VkX2ZpbGVfcGF0aCwgInIiKQorICAgICAgICBzZWNvbmRfY29udGVudHMgPSB1c2VkX2ZpbGUucmVhZCgpCisgICAgICAgIHVzZWRfZmlsZS5jbG9zZSgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyKHNlY29uZF9tb2RpZmljYXRpb25fdGltZSwgZmlyc3RfbW9kaWZpY2F0aW9uX3RpbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlyc3RfY29udGVudHMsIHNlY29uZF9jb250ZW50cykKKworICAgICAgICBzaHV0aWwucm10cmVlKHRlbXBfZGlyLCBpZ25vcmVfZXJyb3JzPVRydWUpCisKKyAgICBkZWYgdGVzdF9zdGFsZW5lc3NfY2hlY2tfb2ZfaW5jbHVkZWRfZmlsZShzZWxmKToKKyAgICAgICAgdGVtcF9kaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKGRpcj1UZXN0U3RhbGVuZXNzQ2hlY2suQ1VSUkVOVF9ESVJfUEFUSCkKKworICAgICAgICB0ZW1wX2luY2x1ZGVkX2ZpbGVfcGF0aCA9IG9zLnBhdGguam9pbih0ZW1wX2RpciwgIkluY2x1ZGVkLnRocmlmdCIpCisgICAgICAgIHRlbXBfaW5jbHVkaW5nX2ZpbGVfcGF0aCA9IG9zLnBhdGguam9pbih0ZW1wX2RpciwgIkluY2x1ZGluZy50aHJpZnQiKQorCisgICAgICAgIHNodXRpbC5jb3B5MihUZXN0U3RhbGVuZXNzQ2hlY2suSU5DTFVERURfVEhSSUZUX0ZJTEVfUEFUSCwgdGVtcF9pbmNsdWRlZF9maWxlX3BhdGgpCisgICAgICAgIHNodXRpbC5jb3B5MihUZXN0U3RhbGVuZXNzQ2hlY2suSU5DTFVESU5HX1RIUklGVF9GSUxFX1BBVEgsIHRlbXBfaW5jbHVkaW5nX2ZpbGVfcGF0aCkKKworICAgICAgICBjb21tYW5kID0gW1Rlc3RTdGFsZW5lc3NDaGVjay5USFJJRlRfRVhFQ1VUQUJMRV9QQVRILCAiLWdlbiIsICJjcHAiLCAiLXJlY3Vyc2UiLCAiLW8iLCB0ZW1wX2Rpcl0KKyAgICAgICAgY29tbWFuZCArPSBbdGVtcF9pbmNsdWRpbmdfZmlsZV9wYXRoXQorCisgICAgICAgIHN1YnByb2Nlc3MuY2FsbChjb21tYW5kKQorCisgICAgICAgIGluY2x1ZGVkX2NvbnN0YW50c19jcHBfZmlsZV9wYXRoID0gb3MucGF0aC5qb2luKHRlbXBfZGlyLCAiZ2VuLWNwcCIsICJJbmNsdWRlZF9jb25zdGFudHMuY3BwIikKKyAgICAgICAgaW5jbHVkaW5nX2NvbnN0YW50c19jcHBfZmlsZV9wYXRoID0gb3MucGF0aC5qb2luKHRlbXBfZGlyLCAiZ2VuLWNwcCIsICJJbmNsdWRpbmdfY29uc3RhbnRzLmNwcCIpCisKKyAgICAgICAgaW5jbHVkZWRfY29uc3RhbnRzX2NwcF9maXJzdF9tb2RpZmljYXRpb25fdGltZSA9IG9zLnBhdGguZ2V0bXRpbWUoaW5jbHVkZWRfY29uc3RhbnRzX2NwcF9maWxlX3BhdGgpCisgICAgICAgIGluY2x1ZGluZ19jb25zdGFudHNfY3BwX2ZpcnN0X21vZGlmaWNhdGlvbl90aW1lID0gb3MucGF0aC5nZXRtdGltZShpbmNsdWRpbmdfY29uc3RhbnRzX2NwcF9maWxlX3BhdGgpCisKKyAgICAgICAgdGVtcF9pbmNsdWRlZF9maWxlID0gb3Blbih0ZW1wX2luY2x1ZGVkX2ZpbGVfcGF0aCwgImEiKQorICAgICAgICB0ZW1wX2luY2x1ZGVkX2ZpbGUud3JpdGUoIlxuY29uc3QgaTMyIGFuX2ludGVnZXIgPSA0MlxuIikKKyAgICAgICAgdGVtcF9pbmNsdWRlZF9maWxlLmNsb3NlKCkKKworICAgICAgICB0aW1lLnNsZWVwKDAuMSkKKworICAgICAgICBzdWJwcm9jZXNzLmNhbGwoY29tbWFuZCkKKworICAgICAgICBpbmNsdWRlZF9jb25zdGFudHNfY3BwX3NlY29uZF9tb2RpZmljYXRpb25fdGltZSA9IG9zLnBhdGguZ2V0bXRpbWUoaW5jbHVkZWRfY29uc3RhbnRzX2NwcF9maWxlX3BhdGgpCisgICAgICAgIGluY2x1ZGluZ19jb25zdGFudHNfY3BwX3NlY29uZF9tb2RpZmljYXRpb25fdGltZSA9IG9zLnBhdGguZ2V0bXRpbWUoaW5jbHVkaW5nX2NvbnN0YW50c19jcHBfZmlsZV9wYXRoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlcigKKyAgICAgICAgICAgIGluY2x1ZGVkX2NvbnN0YW50c19jcHBfc2Vjb25kX21vZGlmaWNhdGlvbl90aW1lLCBpbmNsdWRlZF9jb25zdGFudHNfY3BwX2ZpcnN0X21vZGlmaWNhdGlvbl90aW1lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgaW5jbHVkaW5nX2NvbnN0YW50c19jcHBfZmlyc3RfbW9kaWZpY2F0aW9uX3RpbWUsIGluY2x1ZGluZ19jb25zdGFudHNfY3BwX3NlY29uZF9tb2RpZmljYXRpb25fdGltZSkKKworICAgICAgICBzaHV0aWwucm10cmVlKHRlbXBfZGlyLCBpZ25vcmVfZXJyb3JzPVRydWUpCisKKworZGVmIHN1aXRlKCk6CisgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShUZXN0U3RhbGVuZXNzQ2hlY2spKQorICAgIHJldHVybiBzdWl0ZQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgIyBUaGUgcGF0aCBvZiBUaHJpZnQgY29tcGlsZXIgIGlzICBwYXNzZWQgYXMgYW4gYXJndW1lbnQgdG8gdGhlIHRlc3Qgc2NyaXB0LgorICAgICMgUmVtb3ZlIGl0IHRvIG5vdCBjb25mdXNlIHRoZSB1bml0IHRlc3RpbmcgZnJhbWV3b3JrCisgICAgVGVzdFN0YWxlbmVzc0NoZWNrLlRIUklGVF9FWEVDVVRBQkxFX1BBVEggPSBzeXMuYXJndlstMV0KKyAgICBkZWwgc3lzLmFyZ3ZbLTFdCisgICAgdW5pdHRlc3QubWFpbihkZWZhdWx0VGVzdD0ic3VpdGUiLCB0ZXN0UnVubmVyPXVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKHZlcmJvc2l0eT0yKSkKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2NwcF9wbHVnaW5fdGVzdC5jbWFrZSBiL2NvbXBpbGVyL2NwcC90ZXN0L2NwcF9wbHVnaW5fdGVzdC5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDE4MjgxCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3QvY3BwX3BsdWdpbl90ZXN0LmNtYWtlCkBAIC0wLDAgKzEsNDUgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitmaWxlKE1BS0VfRElSRUNUT1JZICR7Q1VSRElSfS9nZW4tY3BwKQorZXhlY3V0ZV9wcm9jZXNzKENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC1yIC1vdXQgJHtDVVJESVJ9L2dlbi1jcHAgLWdlbiBjcHAgJHtTUkNESVJ9Ly4uLy4uLy4uL3Rlc3QvSW5jbHVkZS50aHJpZnQpCitpZihFWElUQ09ERSkKKyAgbWVzc2FnZShGQVRBTF9FUlJPUiAiRkFJTEVEOiBcIiR7QVJHVn1cIjogXCIke0VYSVRDT0RFfVwiIikKK2VuZGlmKCkKK2lmKFdJTjMyKQorICAgIHNldChFTlZ7UEFUSH0gIiR7QklORElSfS8ke0JVSUxEVFlQRX07JHtCSU5ESVJ9OyRFTlZ7UEFUSH0iKQorZWxzZSgpCisgICAgc2V0KEVOVntQQVRIfSAiJHtCSU5ESVJ9OiRFTlZ7UEFUSH0iKQorZW5kaWYoKQorCitmaWxlKE1BS0VfRElSRUNUT1JZICR7Q1VSRElSfS9nZW4tbXljcHApCitleGVjdXRlX3Byb2Nlc3MoQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLXIgLW91dCAke0NVUkRJUn0vZ2VuLW15Y3BwIC1nZW4gbXljcHAgJHtTUkNESVJ9Ly4uLy4uLy4uL3Rlc3QvSW5jbHVkZS50aHJpZnQgUkVTVUxUX1ZBUklBQkxFIEVYSVRDT0RFKQoraWYoRVhJVENPREUpCisgIG1lc3NhZ2UoRkFUQUxfRVJST1IgIkZBSUxFRDogXCIke0VYSVRDT0RFfVwiIikKK2VuZGlmKCkKKworZmluZF9wcm9ncmFtKERJRkYgZGlmZikKK2lmKERJRkYpCisgIGV4ZWN1dGVfcHJvY2VzcyhDT01NQU5EICR7RElGRn0gLXVyTiBnZW4tY3BwIGdlbi1teWNwcCBSRVNVTFRfVkFSSUFCTEUgRVhJVENPREUpCisgIGlmKEVYSVRDT0RFKQorICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IgIkZBSUxFRDogXCIke0VYSVRDT0RFfVwiIikKKyAgZW5kaWYoKQorZWxzZSgpCisgICAgbWVzc2FnZShXQVJOSU5HICJkaWZmIGV4ZWN1dGFibGUgaXMgbm90IGF2YWlsYWJsZS4gTm90IHZhbGlkYXRpbmcgcGx1Z2luLWdlbmVyYXRlZCBjb2RlLiIpCitlbmRpZigpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9jcHBfcGx1Z2luX3Rlc3Quc2ggYi9jb21waWxlci9jcHAvdGVzdC9jcHBfcGx1Z2luX3Rlc3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGRiMmUwYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L2NwcF9wbHVnaW5fdGVzdC5zaApAQCAtMCwwICsxLDI3IEBACisjIS9iaW4vc2gKKworIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgdGhpcyBmaWxlIGlzIGludGVuZGVkIHRvIGJlIGludm9rZWQgYnkgbWFrZS4KK3NldCAtZQorbWtkaXIgLXAgZ2VuLWNwcCBnZW4tbXljcHAKK1BBVEg9LjoiJFBBVEgiIC4uL3RocmlmdCAtciAtb3V0IGdlbi1jcHAgLWdlbiBjcHAgLi4vLi4vLi4vdGVzdC9JbmNsdWRlLnRocmlmdAorUEFUSD0uOiIkUEFUSCIgLi4vdGhyaWZ0IC1yIC1vdXQgZ2VuLW15Y3BwIC1nZW4gbXljcHAgLi4vLi4vLi4vdGVzdC9JbmNsdWRlLnRocmlmdAorZGlmZiAtdXJOIGdlbi1jcHAgZ2VuLW15Y3BwCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvY29uc3QxX3JldHVybi50aHJpZnQgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvY29uc3QxX3JldHVybi50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM1ZTRhYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9jb25zdDFfcmV0dXJuLnRocmlmdApAQCAtMCwwICsxIEBACitjb25zdCBib29sIHJldHVybiA9IDAKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9lbnVtMV9yZXR1cm4udGhyaWZ0IGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL2VudW0xX3JldHVybi50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ4MzRlMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9lbnVtMV9yZXR1cm4udGhyaWZ0CkBAIC0wLDAgKzEsMiBAQAorZW51bSByZXR1cm4geworfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL2VudW0yX3JldHVybi50aHJpZnQgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvZW51bTJfcmV0dXJuLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmNhYThlCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL2VudW0yX3JldHVybi50aHJpZnQKQEAgLTAsMCArMSwzIEBACitlbnVtIGVudW1fbmFtZSB7CisgIHJldHVybgorfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL2V4Y2VwdGlvbjFfcmV0dXJuLnRocmlmdCBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9leGNlcHRpb24xX3JldHVybi50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFkYjMzOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9leGNlcHRpb24xX3JldHVybi50aHJpZnQKQEAgLTAsMCArMSBAQAorZXhjZXB0aW9uIHJldHVybiB7fQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL2V4Y2VwdGlvbjJfcmV0dXJuLnRocmlmdCBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9leGNlcHRpb24yX3JldHVybi50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkzYzM1MgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9leGNlcHRpb24yX3JldHVybi50aHJpZnQKQEAgLTAsMCArMSwzIEBACitleGNlcHRpb24gZXhjZXB0aW9uX25hbWUgeworICAxOiByZXF1aXJlZCBpOCByZXR1cm4KK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9zZXJ2aWNlMV9yZXR1cm4udGhyaWZ0IGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3NlcnZpY2UxX3JldHVybi50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI4NmEzNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9zZXJ2aWNlMV9yZXR1cm4udGhyaWZ0CkBAIC0wLDAgKzEgQEAKK3NlcnZpY2UgcmV0dXJuIHt9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvc2VydmljZTJfcmV0dXJuLnRocmlmdCBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9zZXJ2aWNlMl9yZXR1cm4udGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmNzMzMWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvc2VydmljZTJfcmV0dXJuLnRocmlmdApAQCAtMCwwICsxLDMgQEAKK3NlcnZpY2Ugc2VydmljZV9uYW1lIHsKKyAgYm9vbCBmdW5jdGlvbl9uYW1lKDE6IGkzMiByZXR1cm4pCit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvc2VydmljZTNfcmV0dXJuLnRocmlmdCBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9zZXJ2aWNlM19yZXR1cm4udGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ZGQ5NDYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvc2VydmljZTNfcmV0dXJuLnRocmlmdApAQCAtMCwwICsxLDMgQEAKK3NlcnZpY2Ugc2VydmljZV9uYW1lIHsKKyAgdm9pZCByZXR1cm4oKQorfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3NlcnZpY2U0X3JldHVybi50aHJpZnQgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvc2VydmljZTRfcmV0dXJuLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDc4N2RmCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3NlcnZpY2U0X3JldHVybi50aHJpZnQKQEAgLTAsMCArMSw1IEBACitleGNlcHRpb24gZXhjZXB0aW9uX25hbWUge30KKworc2VydmljZSBzZXJ2aWNlX25hbWUgeworICB2b2lkIGZ1bmN0aW9uX25hbWUoKSB0aHJvd3MgKCAxOiBleGNlcHRpb25fbmFtZSByZXR1cm4pCit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvc3RydWN0MV9yZXR1cm4udGhyaWZ0IGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3N0cnVjdDFfcmV0dXJuLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODJiOGI5Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3N0cnVjdDFfcmV0dXJuLnRocmlmdApAQCAtMCwwICsxIEBACitzdHJ1Y3QgcmV0dXJuIHt9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvc3RydWN0Ml9yZXR1cm4udGhyaWZ0IGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3N0cnVjdDJfcmV0dXJuLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDcwMGQxCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3N0cnVjdDJfcmV0dXJuLnRocmlmdApAQCAtMCwwICsxLDMgQEAKK3N0cnVjdCBzdHJ1Y3RfbmFtZSB7CisgIDE6IHJlcXVpcmVkIGJvb2wgcmV0dXJuID0gMQorfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3R5cGVkZWYxX3JldHVybi50aHJpZnQgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvdHlwZWRlZjFfcmV0dXJuLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTU5YmI4Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3R5cGVkZWYxX3JldHVybi50aHJpZnQKQEAgLTAsMCArMSBAQAordHlwZWRlZiBib29sIHJldHVybgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3VuaW9uMV9yZXR1cm4udGhyaWZ0IGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3VuaW9uMV9yZXR1cm4udGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2OGRmMTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvdW5pb24xX3JldHVybi50aHJpZnQKQEAgLTAsMCArMSBAQAordW5pb24gcmV0dXJuIHt9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvdW5pb24yX3JldHVybi50aHJpZnQgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvdW5pb24yX3JldHVybi50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTcxOWQxZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy91bmlvbjJfcmV0dXJuLnRocmlmdApAQCAtMCwwICsxLDMgQEAKK3VuaW9uIHVuaW9uX25hbWUgeworICAxOiBvcHRpb25hbCBib29sIHJldHVybj0xCit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9wbHVnaW4vY29udmVyc2lvbl90ZXN0LmNjIGIvY29tcGlsZXIvY3BwL3Rlc3QvcGx1Z2luL2NvbnZlcnNpb25fdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzhkODEyCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3QvcGx1Z2luL2NvbnZlcnNpb25fdGVzdC5jYwpAQCAtMCwwICsxLDQ5OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfcHJvZ3JhbS5oIgorI2luY2x1ZGUgInRocmlmdC9wbHVnaW4vdHlwZV91dGlsLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BsdWdpbi9wbHVnaW5fdHlwZXMuaCIKKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxib29zdC9wcmVwcm9jZXNzb3IuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3Rlc3QvaW5jbHVkZWQvdW5pdF90ZXN0LmhwcD4KKyNpbmNsdWRlIDxib29zdC90ZXN0L3BhcmFtZXRlcml6ZWRfdGVzdC5ocHA+CisKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKK3VzaW5nIG5hbWVzcGFjZSBib29zdDo6dW5pdF90ZXN0OworCituYW1lc3BhY2UgdGVzdF9kYXRhIHsKKyNkZWZpbmUgVF9URVNUX1RZUEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQk9PU1RfUFBfVFVQTEVfVE9fTElTVCgxNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAocHJvZ3JhbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZV90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bV92YWx1ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfdmFsdWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZWRlZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZSkpCisjZGVmaW5lIFRfREVMRVRFX1RFU1REQVRBKHIsIGQsIGVsZW0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZvciAoc3RkOjp2ZWN0b3I8dF8jI2VsZW0qPjo6cmV2ZXJzZV9pdGVyYXRvciBpdCA9IGVsZW0jI3MucmJlZ2luKCk7IGl0ICE9IGVsZW0jI3MucmVuZCgpOyBpdCsrKSBcCisgICAgZGVsZXRlICppdDsKKyNkZWZpbmUgVF9ERUNMX1RFU1REQVRBKHIsIGQsIGVsZW0pIHN0YXRpYyBzdGQ6OnZlY3RvcjwgOjp0XyMjZWxlbSo+IGVsZW0jI3M7CitCT09TVF9QUF9MSVNUX0ZPUl9FQUNIKFRfREVDTF9URVNUREFUQSwgXywgVF9URVNUX1RZUEVTKQorI3VuZGVmIFRfREVDTF9URVNUREFUQQorCitib29sIGhhc19kYXRhID0gZmFsc2U7Cit2b2lkIGNsZWFudXAoKSB7CisgIGlmIChoYXNfZGF0YSkgeworICAgIGhhc19kYXRhID0gZmFsc2U7CisgICAgQk9PU1RfUFBfTElTVF9GT1JfRUFDSChUX0RFTEVURV9URVNUREFUQSwgXywgVF9URVNUX1RZUEVTKQorICB9Cit9CisKK3ZvaWQgaW5pdF9wcm9ncmFtcygpIHsKKyAgcHJvZ3JhbXMucHVzaF9iYWNrKG5ldyB0X3Byb2dyYW0oInByb2cgcGF0aCIsICJwcm9nX25hbWUiKSk7Cit9CisKK3ZvaWQgaW5pdF9iYXNlX3R5cGVzKCkgeworICBiYXNlX3R5cGVzLnB1c2hfYmFjayhuZXcgOjp0X2Jhc2VfdHlwZSgibmFtZTAiLCA6OnRfYmFzZV90eXBlOjpUWVBFX1ZPSUQpKTsKKyAgYmFzZV90eXBlcy5wdXNoX2JhY2sobmV3IDo6dF9iYXNlX3R5cGUoIm5hbWUxIiwgOjp0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcpKTsKKyAgYmFzZV90eXBlcy5wdXNoX2JhY2sobmV3IDo6dF9iYXNlX3R5cGUoIm5hbWUyIiwgOjp0X2Jhc2VfdHlwZTo6VFlQRV9CT09MKSk7CisgIGJhc2VfdHlwZXMucHVzaF9iYWNrKG5ldyA6OnRfYmFzZV90eXBlKCJuYW1lMyIsIDo6dF9iYXNlX3R5cGU6OlRZUEVfSTgpKTsKKyAgYmFzZV90eXBlcy5wdXNoX2JhY2sobmV3IDo6dF9iYXNlX3R5cGUoIm5hbWU0IiwgOjp0X2Jhc2VfdHlwZTo6VFlQRV9JMTYpKTsKKyAgYmFzZV90eXBlcy5wdXNoX2JhY2sobmV3IDo6dF9iYXNlX3R5cGUoIm5hbWU1IiwgOjp0X2Jhc2VfdHlwZTo6VFlQRV9JMzIpKTsKKyAgYmFzZV90eXBlcy5wdXNoX2JhY2sobmV3IDo6dF9iYXNlX3R5cGUoIm5hbWU2IiwgOjp0X2Jhc2VfdHlwZTo6VFlQRV9JNjQpKTsKKyAgYmFzZV90eXBlcy5wdXNoX2JhY2sobmV3IDo6dF9iYXNlX3R5cGUoIm5hbWU3IiwgOjp0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEUpKTsKK30KKwordm9pZCBpbml0X2NvbnN0X3ZhbHVlcygpIHsKKyAgY29uc3RfdmFsdWVzLnB1c2hfYmFjayhuZXcgdF9jb25zdF92YWx1ZSg0MikpOworICBjb25zdF92YWx1ZXMucHVzaF9iYWNrKG5ldyB0X2NvbnN0X3ZhbHVlKCJmb28iKSk7CisgIHsKKyAgICB0X2NvbnN0X3ZhbHVlKiB4ID0gbmV3IHRfY29uc3RfdmFsdWU7CisgICAgeC0+c2V0X2RvdWJsZSgzLjE0MTUpOworICAgIGNvbnN0X3ZhbHVlcy5wdXNoX2JhY2soeCk7CisgIH0KKyAgeworICAgIHRfY29uc3RfdmFsdWUqIHggPSBuZXcgdF9jb25zdF92YWx1ZTsKKyAgICB4LT5zZXRfaWRlbnRpZmllcigiYmFyIik7CisgICAgeC0+c2V0X2VudW0oZW51bXNbMF0pOworICAgIGNvbnN0X3ZhbHVlcy5wdXNoX2JhY2soeCk7CisgIH0KKyAgeworICAgIHRfY29uc3RfdmFsdWUqIHggPSBuZXcgdF9jb25zdF92YWx1ZTsKKyAgICB4LT5zZXRfbWFwKCk7CisgICAgeC0+YWRkX21hcChjb25zdF92YWx1ZXNbMF0sIGNvbnN0X3ZhbHVlc1sxXSk7CisgICAgeC0+YWRkX21hcChjb25zdF92YWx1ZXNbMV0sIGNvbnN0X3ZhbHVlc1swXSk7CisgICAgY29uc3RfdmFsdWVzLnB1c2hfYmFjayh4KTsKKyAgfQorICB7CisgICAgdF9jb25zdF92YWx1ZSogeCA9IG5ldyB0X2NvbnN0X3ZhbHVlOworICAgIHgtPnNldF9saXN0KCk7CisgICAgeC0+YWRkX2xpc3QoY29uc3RfdmFsdWVzWzBdKTsKKyAgICB4LT5hZGRfbGlzdChjb25zdF92YWx1ZXNbMV0pOworICAgIGNvbnN0X3ZhbHVlcy5wdXNoX2JhY2soeCk7CisgIH0KK30KKwordm9pZCBpbml0X2NvbnN0cygpIHsKKyAgLy8gYmFzZV90eXBlL2VudW0gaW5kZXhlcyBmb3IgdGhpcyBhbmQgb3RoZXIgdGVzdHMgYXJlIGFyYml0cmFyeQorICBjb25zdHMucHVzaF9iYWNrKG5ldyB0X2NvbnN0KGJhc2VfdHlwZXNbMl0sICJhYWEiLCBjb25zdF92YWx1ZXNbMF0pKTsKKyAgY29uc3RzLmJhY2soKS0+c2V0X2RvYygic29lbSBkb2MiKTsKKyAgY29uc3RzLnB1c2hfYmFjayhuZXcgdF9jb25zdChiYXNlX3R5cGVzWzNdLCAiYmJiIiwgY29uc3RfdmFsdWVzWzFdKSk7Cit9CisKK3ZvaWQgaW5pdF9lbnVtX3ZhbHVlcygpIHsKKyAgZW51bV92YWx1ZXMucHVzaF9iYWNrKG5ldyB0X2VudW1fdmFsdWUoIlZBTDEiLCAxMSkpOworICBlbnVtX3ZhbHVlcy5iYWNrKCktPnNldF9kb2MoImVudW0gZG9jIDEiKTsKKyAgZW51bV92YWx1ZXMuYmFjaygpLT5hbm5vdGF0aW9uc18uaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKCJhbm5vMSIsICJ2YWwxIikpOworCisgIGVudW1fdmFsdWVzLnB1c2hfYmFjayhuZXcgdF9lbnVtX3ZhbHVlKCJWQUwyIiwgMjIpKTsKK30KKwordm9pZCBpbml0X2VudW1zKCkgeworICBlbnVtcy5wdXNoX2JhY2sobmV3IHRfZW51bShwcm9ncmFtc1swXSkpOworICBlbnVtcy5iYWNrKCktPnNldF9kb2MoImVudW0gZG9jIDEiKTsKKyAgZW51bXMuYmFjaygpLT5hbm5vdGF0aW9uc18uaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKCJhbm5vMSIsICJ2YWwxIikpOworICBlbnVtcy5iYWNrKCktPnNldF9uYW1lKCJmb29vIik7CisgIGVudW1zLmJhY2soKS0+YXBwZW5kKGVudW1fdmFsdWVzWzBdKTsKKyAgZW51bXMuYmFjaygpLT5hcHBlbmQoZW51bV92YWx1ZXNbMV0pOworfQorCit2b2lkIGluaXRfbGlzdHMoKSB7CisgIGxpc3RzLnB1c2hfYmFjayhuZXcgdF9saXN0KGVudW1zWzBdKSk7CisgIGxpc3RzLnB1c2hfYmFjayhuZXcgdF9saXN0KGJhc2VfdHlwZXNbNV0pKTsKKyAgbGlzdHMuYmFjaygpLT5zZXRfY3BwX25hbWUoImxpc3RfY3BwX25hbWVfMSIpOworfQordm9pZCBpbml0X3NldHMoKSB7CisgIHNldHMucHVzaF9iYWNrKG5ldyB0X3NldChiYXNlX3R5cGVzWzRdKSk7CisgIHNldHMucHVzaF9iYWNrKG5ldyB0X3NldChlbnVtc1swXSkpOworICBzZXRzLmJhY2soKS0+c2V0X2NwcF9uYW1lKCJzZXRfY3BwX25hbWVfMSIpOworfQordm9pZCBpbml0X21hcHMoKSB7CisgIG1hcHMucHVzaF9iYWNrKG5ldyB0X21hcChiYXNlX3R5cGVzWzRdLCBiYXNlX3R5cGVzWzFdKSk7CisgIG1hcHMucHVzaF9iYWNrKG5ldyB0X21hcChiYXNlX3R5cGVzWzVdLCBlbnVtc1swXSkpOworICBtYXBzLmJhY2soKS0+c2V0X2NwcF9uYW1lKCJtYXBfY3BwX25hbWVfMSIpOworfQorCit2b2lkIGluaXRfdHlwZWRlZnMoKSB7CisgIHR5cGVkZWZzLnB1c2hfYmFjayhuZXcgdF90eXBlZGVmKHByb2dyYW1zWzBdLCBiYXNlX3R5cGVzWzNdLCAiVkFMMSIpKTsKK30KK3ZvaWQgaW5pdF9maWVsZHMoKSB7CisgIGZpZWxkcy5wdXNoX2JhY2sobmV3IHRfZmllbGQoYmFzZV90eXBlc1sxXSwgImYxIikpOworICBmaWVsZHMuYmFjaygpLT5zZXRfcmVmZXJlbmNlKGZhbHNlKTsKKyAgZmllbGRzLmJhY2soKS0+c2V0X3JlcSh0X2ZpZWxkOjpUX09QVElPTkFMKTsKKyAgZmllbGRzLnB1c2hfYmFjayhuZXcgdF9maWVsZChiYXNlX3R5cGVzWzJdLCAiZjIiLCA5KSk7CisgIGZpZWxkcy5iYWNrKCktPnNldF9yZWZlcmVuY2UodHJ1ZSk7CisgIGZpZWxkcy5wdXNoX2JhY2sobmV3IHRfZmllbGQoYmFzZV90eXBlc1szXSwgImYzIiwgMTEpKTsKKyAgZmllbGRzLmJhY2soKS0+c2V0X3JlcSh0X2ZpZWxkOjpUX1JFUVVJUkVEKTsKKyAgZmllbGRzLmJhY2soKS0+c2V0X3ZhbHVlKGNvbnN0X3ZhbHVlc1swXSk7Cit9Cit2b2lkIGluaXRfc3RydWN0cygpIHsKKyAgc3RydWN0cy5wdXNoX2JhY2sobmV3IHRfc3RydWN0KHByb2dyYW1zWzBdLCAic3RydWN0MSIpKTsKKyAgc3RydWN0cy5iYWNrKCktPmFwcGVuZChmaWVsZHNbMF0pOworICBzdHJ1Y3RzLmJhY2soKS0+YXBwZW5kKGZpZWxkc1sxXSk7CisgIHN0cnVjdHMucHVzaF9iYWNrKG5ldyB0X3N0cnVjdChwcm9ncmFtc1swXSwgInVuaW9uMSIpKTsKKyAgc3RydWN0cy5iYWNrKCktPmFwcGVuZChmaWVsZHNbMF0pOworICBzdHJ1Y3RzLmJhY2soKS0+YXBwZW5kKGZpZWxkc1sxXSk7CisgIHN0cnVjdHMuYmFjaygpLT5zZXRfdW5pb24odHJ1ZSk7CisgIHN0cnVjdHMucHVzaF9iYWNrKG5ldyB0X3N0cnVjdChwcm9ncmFtc1swXSwgInhjZXB0MSIpKTsKKyAgc3RydWN0cy5iYWNrKCktPnNldF94Y2VwdGlvbih0cnVlKTsKK30KK3ZvaWQgaW5pdF9mdW5jdGlvbnMoKSB7CisgIHN0cnVjdHMucHVzaF9iYWNrKG5ldyB0X3N0cnVjdChwcm9ncmFtc1swXSwgImVycnMxIikpOworICB0X3N0cnVjdCogZXJyb3JzID0gc3RydWN0cy5iYWNrKCk7CisgIHN0cnVjdHMucHVzaF9iYWNrKG5ldyB0X3N0cnVjdChwcm9ncmFtc1swXSwgImFyZ3MxIikpOworICB0X3N0cnVjdCogYXJnbGlzdCA9IHN0cnVjdHMuYmFjaygpOworICBmdW5jdGlvbnMucHVzaF9iYWNrKG5ldyB0X2Z1bmN0aW9uKGJhc2VfdHlwZXNbMF0sICJmdW5jMSIsIGVycm9ycywgYXJnbGlzdCwgZmFsc2UpKTsKKyAgZnVuY3Rpb25zLnB1c2hfYmFjayhuZXcgdF9mdW5jdGlvbihiYXNlX3R5cGVzWzBdLCAiZnVuYzIiLCBlcnJvcnMsIGFyZ2xpc3QsIHRydWUpKTsKK30KK3ZvaWQgaW5pdF9zZXJ2aWNlcygpIHsKKyAgc2VydmljZXMucHVzaF9iYWNrKG5ldyB0X3NlcnZpY2UocHJvZ3JhbXNbMF0pKTsKKyAgc2VydmljZXMuYmFjaygpLT5zZXRfZG9jKCJzcnYxIGRvYyIpOworICBzZXJ2aWNlcy5iYWNrKCktPnNldF9uYW1lKCJzcnYxIik7CisgIHNlcnZpY2VzLmJhY2soKS0+YWRkX2Z1bmN0aW9uKGZ1bmN0aW9uc1swXSk7CisgIHNlcnZpY2VzLmJhY2soKS0+YWRkX2Z1bmN0aW9uKGZ1bmN0aW9uc1sxXSk7CisKKyAgc2VydmljZXMucHVzaF9iYWNrKG5ldyB0X3NlcnZpY2UocHJvZ3JhbXNbMF0pKTsKKyAgc2VydmljZXMuYmFjaygpLT5zZXRfbmFtZSgic3J2MiIpOworICBzZXJ2aWNlcy5iYWNrKCktPnNldF9leHRlbmRzKHNlcnZpY2VzWzBdKTsKK30KKworc3RkOjp2ZWN0b3I8dF90eXBlKj4gdHlwZXM7Cit2b2lkIGluaXRfdHlwZXMoKSB7CisjZGVmaW5lIFRfQ09QWV9UWVBFUyh0eXBlKSBzdGQ6OmNvcHkodHlwZSMjcy5iZWdpbigpLCB0eXBlIyNzLmVuZCgpLCBzdGQ6OmJhY2tfaW5zZXJ0ZXIodHlwZXMpKQorICBUX0NPUFlfVFlQRVMoYmFzZV90eXBlKTsKKyAgVF9DT1BZX1RZUEVTKGVudW0pOworICBUX0NPUFlfVFlQRVModHlwZWRlZik7CisgIFRfQ09QWV9UWVBFUyhzdHJ1Y3QpOworICBUX0NPUFlfVFlQRVMobGlzdCk7CisgIFRfQ09QWV9UWVBFUyhzZXQpOworICBUX0NPUFlfVFlQRVMobWFwKTsKKy8vIFRfQ09QWV9UWVBFUyhzZXJ2aWNlKTsKKyN1bmRlZiBUX0NPUFlfVFlQRVMKK30KKwordm9pZCBpbml0KCkgeworICBpZiAoIWhhc19kYXRhKSB7CisgICAgaGFzX2RhdGEgPSB0cnVlOworI2RlZmluZSBUX0lOSVRfVEVTVERBVEEociwgZCwgZWxlbSkgaW5pdF8jI2VsZW0jI3MoKTsKKyAgICBCT09TVF9QUF9MSVNUX0ZPUl9FQUNIKFRfSU5JVF9URVNUREFUQSwgXywgVF9URVNUX1RZUEVTKQorICAgIGluaXRfdHlwZXMoKTsKKyN1bmRlZiBUX0lOSVRfVEVTVERBVEEKKyAgfQorfQorfQorc3RydWN0IEdsb2JhbEZpeHR1cmUgeworICB+R2xvYmFsRml4dHVyZSgpIHsgdGVzdF9kYXRhOjpjbGVhbnVwKCk7IH0KK307CisjaWYgKEJPT1NUX1ZFUlNJT04gPj0gMTA1OTAwKQorQk9PU1RfR0xPQkFMX0ZJWFRVUkUoR2xvYmFsRml4dHVyZSk7CisjZWxzZQorQk9PU1RfR0xPQkFMX0ZJWFRVUkUoR2xvYmFsRml4dHVyZSkKKyNlbmRpZgorCit2b2lkIG1pZ3JhdGVfZ2xvYmFsX2NhY2hlKCkgeworICBwbHVnaW46OlR5cGVSZWdpc3RyeSByZWc7CisgIHBsdWdpbl9vdXRwdXQ6OmdldF9nbG9iYWxfY2FjaGUocmVnKTsKKyAgcGx1Z2luOjpzZXRfZ2xvYmFsX2NhY2hlKHJlZyk7CisgIHBsdWdpbl9vdXRwdXQ6OmNsZWFyX2dsb2JhbF9jYWNoZSgpOworfQordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitUKiByb3VuZF90cmlwKFQqIHQpIHsKKyAgdHlwZW5hbWUgcGx1Z2luOjpUb1R5cGU8VD46OnR5cGUgcDsKKyAgcGx1Z2luOjpjbGVhcl9nbG9iYWxfY2FjaGUoKTsKKyAgcGx1Z2luX291dHB1dDo6Y2xlYXJfZ2xvYmFsX2NhY2hlKCk7CisgIHBsdWdpbl9vdXRwdXQ6OmNvbnZlcnQodCwgcCk7CisgIG1pZ3JhdGVfZ2xvYmFsX2NhY2hlKCk7CisgIHJldHVybiBwbHVnaW46OmNvbnZlcnQocCk7Cit9CisKK3ZvaWQgdGVzdF9iYXNlX3R5cGUoOjp0X2Jhc2VfdHlwZSogc3V0KSB7CisgIHBsdWdpbjo6dF9iYXNlX3R5cGUgcDsKKyAgcGx1Z2luX291dHB1dDo6Y29udmVydChzdXQsIHApOworICBib29zdDo6c2NvcGVkX3B0cjwgOjp0X2Jhc2VfdHlwZT4gc3V0MihwbHVnaW46OmNvbnZlcnQocCkpOworCisjZGVmaW5lIFRIUklGVF9DSEVDSyhyLCBkYXRhLCBlbGVtKSBCT09TVF9QUF9FWFBBTkQoQk9PU1RfQ0hFQ0tfRVFVQUwoZGF0YSBlbGVtLCBzdXQyLT5lbGVtKSk7CisgIEJPT1NUX1BQX0xJU1RfRk9SX0VBQ0goVEhSSUZUX0NIRUNLLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN1dC0+LAorICAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX1BQX1RVUExFX1RPX0xJU1QoNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpc192b2lkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfc3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfYm9vbCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3N0cmluZ19saXN0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfYmluYXJ5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfc3RyaW5nX2VudW0oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19iYXNlX3R5cGUoKSkpKQorfQorCit2b2lkIHRlc3RfY29uc3RfdmFsdWUodF9jb25zdF92YWx1ZSogc3V0KSB7CisgIGJvb3N0OjpzY29wZWRfcHRyPHRfY29uc3RfdmFsdWU+IHN1dDIocm91bmRfdHJpcChzdXQpKTsKKworICBCT09TVF9DSEVDS19FUVVBTChzdXQtPmdldF90eXBlKCksIHN1dDItPmdldF90eXBlKCkpOworICBzd2l0Y2ggKHN1dC0+Z2V0X3R5cGUoKSkgeworI2RlZmluZSBUX0NPTlNUX1ZBTFVFX0NBU0UodHlwZSwgbmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjYXNlIHRfY29uc3RfdmFsdWU6OnR5cGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEJPT1NUX0NIRUNLX0VRVUFMKHN1dC0+Z2V0XyMjbmFtZSgpLCBzdXQyLT5nZXRfIyNuYW1lKCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGJyZWFrCisgICAgVF9DT05TVF9WQUxVRV9DQVNFKENWX0lOVEVHRVIsIGludGVnZXIpOworICAgIFRfQ09OU1RfVkFMVUVfQ0FTRShDVl9ET1VCTEUsIGRvdWJsZSk7CisgICAgVF9DT05TVF9WQUxVRV9DQVNFKENWX1NUUklORywgc3RyaW5nKTsKKyAgICBUX0NPTlNUX1ZBTFVFX0NBU0UoQ1ZfSURFTlRJRklFUiwgaWRlbnRpZmllcik7CisjdW5kZWYgVF9DT05TVF9WQUxVRV9DQVNFCisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfTUFQOgorICAgIEJPT1NUX0NIRUNLX0VRVUFMKHN1dC0+Z2V0X21hcCgpLnNpemUoKSwgc3V0Mi0+Z2V0X21hcCgpLnNpemUoKSk7CisgICAgeworICAgICAgc3RkOjptYXA8dF9jb25zdF92YWx1ZTo6dF9jb25zdF92YWx1ZV90eXBlLCB0X2NvbnN0X3ZhbHVlOjp0X2NvbnN0X3ZhbHVlX3R5cGU+IHN1dF92YWx1ZXM7CisgICAgICBmb3IgKHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gc3V0LT5nZXRfbWFwKCkuYmVnaW4oKTsKKyAgICAgICAgICAgaXQgIT0gc3V0LT5nZXRfbWFwKCkuZW5kKCk7IGl0KyspIHsKKyAgICAgICAgc3V0X3ZhbHVlc1tpdC0+Zmlyc3QtPmdldF90eXBlKCldID0gaXQtPnNlY29uZC0+Z2V0X3R5cGUoKTsKKyAgICAgIH0KKyAgICAgIHN0ZDo6bWFwPHRfY29uc3RfdmFsdWU6OnRfY29uc3RfdmFsdWVfdHlwZSwgdF9jb25zdF92YWx1ZTo6dF9jb25zdF92YWx1ZV90eXBlPiBzdXQyX3ZhbHVlczsKKyAgICAgIGZvciAoc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBzdXQyLT5nZXRfbWFwKCkuYmVnaW4oKTsKKyAgICAgICAgICAgaXQgIT0gc3V0Mi0+Z2V0X21hcCgpLmVuZCgpOyBpdCsrKSB7CisgICAgICAgIHN1dDJfdmFsdWVzW2l0LT5maXJzdC0+Z2V0X3R5cGUoKV0gPSBpdC0+c2Vjb25kLT5nZXRfdHlwZSgpOworICAgICAgfQorICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoc3V0X3ZhbHVlcy5iZWdpbigpLT5maXJzdCwgc3V0Ml92YWx1ZXMuYmVnaW4oKS0+Zmlyc3QpOworICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoc3V0X3ZhbHVlcy5iZWdpbigpLT5zZWNvbmQsIHN1dDJfdmFsdWVzLmJlZ2luKCktPnNlY29uZCk7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0xJU1Q6CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoc3V0LT5nZXRfbGlzdCgpLnNpemUoKSwgc3V0Mi0+Z2V0X2xpc3QoKS5zaXplKCkpOworICAgIEJPT1NUX0NIRUNLX0VRVUFMKHN1dC0+Z2V0X2xpc3QoKS5mcm9udCgpLT5nZXRfdHlwZSgpLCBzdXQyLT5nZXRfbGlzdCgpLmZyb250KCktPmdldF90eXBlKCkpOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIEJPT1NUX0FTU0VSVChmYWxzZSk7CisgICAgYnJlYWs7CisgIH0KK30KKwordm9pZCB0ZXN0X2NvbnN0KHRfY29uc3QqIHN1dCkgeworICBib29zdDo6c2NvcGVkX3B0cjwgOjp0X2NvbnN0PiBzdXQyKHJvdW5kX3RyaXAoc3V0KSk7CisKKyAgQk9PU1RfUFBfTElTVF9GT1JfRUFDSChUSFJJRlRfQ0hFQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgc3V0LT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgQk9PU1RfUFBfVFVQTEVfVE9fTElTVCg0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdldF90eXBlKCktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfdmFsdWUoKS0+Z2V0X3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfZG9jKCkpKSkKK30KKwordm9pZCB0ZXN0X2VudW1fdmFsdWUodF9lbnVtX3ZhbHVlKiBzdXQpIHsKKyAgYm9vc3Q6OnNjb3BlZF9wdHI8dF9lbnVtX3ZhbHVlPiBzdXQyKHJvdW5kX3RyaXAoc3V0KSk7CisKKyAgQk9PU1RfUFBfTElTVF9GT1JfRUFDSChUSFJJRlRfQ0hFQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgc3V0LT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgQk9PU1RfUFBfVFVQTEVfVE9fTElTVCgzLCAoZ2V0X25hbWUoKSwgZ2V0X3ZhbHVlKCksIGdldF9kb2MoKSkpKQorfQorCit2b2lkIHRlc3RfZW51bSh0X2VudW0qIHN1dCkgeworICBib29zdDo6c2NvcGVkX3B0cjwgOjp0X2VudW0+IHN1dDIocm91bmRfdHJpcChzdXQpKTsKKworICBCT09TVF9QUF9MSVNUX0ZPUl9FQUNIKFRIUklGVF9DSEVDSywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdXQtPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCT09TVF9QUF9UVVBMRV9UT19MSVNUKDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfbWluX3ZhbHVlKCktPmdldF92YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9tYXhfdmFsdWUoKS0+Z2V0X3ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2NvbnN0YW50X2J5X3ZhbHVlKDExKS0+Z2V0X3ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2NvbnN0YW50X2J5X25hbWUoIlZBTDEiKS0+Z2V0X3ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2RvYygpKSkpCit9CisKK3ZvaWQgdGVzdF9saXN0KHRfbGlzdCogc3V0KSB7CisgIGJvb3N0OjpzY29wZWRfcHRyPHRfbGlzdD4gc3V0Mihyb3VuZF90cmlwKHN1dCkpOworCisgIEJPT1NUX1BQX0xJU1RfRk9SX0VBQ0goVEhSSUZUX0NIRUNLLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN1dC0+LAorICAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX1BQX1RVUExFX1RPX0xJU1QoNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnZXRfZWxlbV90eXBlKCktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzX2NwcF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2RvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9uYW1lKCkpKSkKKyAgaWYgKHN1dC0+aGFzX2NwcF9uYW1lKCkpCisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoc3V0LT5nZXRfY3BwX25hbWUoKSwgc3V0Mi0+Z2V0X2NwcF9uYW1lKCkpOworfQordm9pZCB0ZXN0X3NldCh0X3NldCogc3V0KSB7CisgIGJvb3N0OjpzY29wZWRfcHRyPHRfc2V0PiBzdXQyKHJvdW5kX3RyaXAoc3V0KSk7CisKKyAgQk9PU1RfUFBfTElTVF9GT1JfRUFDSChUSFJJRlRfQ0hFQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgc3V0LT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgQk9PU1RfUFBfVFVQTEVfVE9fTElTVCg0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdldF9lbGVtX3R5cGUoKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNfY3BwX25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfZG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X25hbWUoKSkpKQorICBpZiAoc3V0LT5oYXNfY3BwX25hbWUoKSkKKyAgICBCT09TVF9DSEVDS19FUVVBTChzdXQtPmdldF9jcHBfbmFtZSgpLCBzdXQyLT5nZXRfY3BwX25hbWUoKSk7Cit9Cit2b2lkIHRlc3RfbWFwKHRfbWFwKiBzdXQpIHsKKyAgYm9vc3Q6OnNjb3BlZF9wdHI8dF9tYXA+IHN1dDIocm91bmRfdHJpcChzdXQpKTsKKworICBCT09TVF9QUF9MSVNUX0ZPUl9FQUNIKFRIUklGVF9DSEVDSywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdXQtPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCT09TVF9QUF9UVVBMRV9UT19MSVNUKDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2V0X2tleV90eXBlKCktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3ZhbF90eXBlKCktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzX2NwcF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2RvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9uYW1lKCkpKSkKKyAgaWYgKHN1dC0+aGFzX2NwcF9uYW1lKCkpCisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoc3V0LT5nZXRfY3BwX25hbWUoKSwgc3V0Mi0+Z2V0X2NwcF9uYW1lKCkpOworfQorCit2b2lkIHRlc3RfdHlwZWRlZih0X3R5cGVkZWYqIHN1dCkgeworICBib29zdDo6c2NvcGVkX3B0cjx0X3R5cGVkZWY+IHN1dDIocm91bmRfdHJpcChzdXQpKTsKKworICBCT09TVF9QUF9MSVNUX0ZPUl9FQUNIKFRIUklGVF9DSEVDSywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdXQtPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCT09TVF9QUF9UVVBMRV9UT19MSVNUKDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2V0X2RvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3N5bWJvbGljKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZm9yd2FyZF90eXBlZGVmKCkpKSkKK30KKwordm9pZCB0ZXN0X3R5cGUodF90eXBlKiBzdXQpIHsKKyAgYm9vc3Q6OnNjb3BlZF9wdHI8dF90eXBlPiBzdXQyKHJvdW5kX3RyaXAoc3V0KSk7CisKKyAgQk9PU1RfUFBfTElTVF9GT1JfRUFDSChUSFJJRlRfQ0hFQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgc3V0LT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgQk9PU1RfUFBfVFVQTEVfVE9fTElTVCgxNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpc192b2lkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfYmFzZV90eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfc3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfYm9vbCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3R5cGVkZWYoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19lbnVtKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfc3RydWN0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfeGNlcHRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19jb250YWluZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19saXN0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfbWFwKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfc2VydmljZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9kb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfbmFtZSgpKSkpCit9CisKK3ZvaWQgdGVzdF9maWVsZCh0X2ZpZWxkKiBzdXQpIHsKKyAgYm9vc3Q6OnNjb3BlZF9wdHI8dF9maWVsZD4gc3V0Mihyb3VuZF90cmlwKHN1dCkpOworCisgIEJPT1NUX1BQX0xJU1RfRk9SX0VBQ0goVEhSSUZUX0NIRUNLLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN1dC0+LAorICAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX1BQX1RVUExFX1RPX0xJU1QoNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnZXRfcmVxKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3JlZmVyZW5jZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9rZXkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfZG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X25hbWUoKSkpKQorICBpZiAoc3V0LT5nZXRfdmFsdWUoKSkgeworICAgIFRIUklGVF9DSEVDSygsIHN1dC0+LCBnZXRfdmFsdWUoKS0+Z2V0X3R5cGUoKSk7CisgIH0gZWxzZSB7CisgICAgQk9PU1RfQ0hFQ0soIXN1dDItPmdldF92YWx1ZSgpKTsKKyAgfQorICBpZiAoc3V0LT5nZXRfdHlwZSgpKSB7CisgICAgVEhSSUZUX0NIRUNLKCwgc3V0LT4sIGdldF90eXBlKCktPmdldF9uYW1lKCkpOworICB9IGVsc2UgeworICAgIEJPT1NUX0NIRUNLKCFzdXQyLT5nZXRfdHlwZSgpKTsKKyAgfQorfQordm9pZCB0ZXN0X3N0cnVjdCh0X3N0cnVjdCogc3V0KSB7CisgIGJvb3N0OjpzY29wZWRfcHRyPHRfc3RydWN0PiBzdXQyKHJvdW5kX3RyaXAoc3V0KSk7CisKKyAgQk9PU1RfUFBfTElTVF9GT1JfRUFDSChUSFJJRlRfQ0hFQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgc3V0LT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgQk9PU1RfUFBfVFVQTEVfVE9fTElTVCg1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlzX3VuaW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfeGNlcHRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19zdHJ1Y3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfZG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X25hbWUoKSkpKQorfQorCit2b2lkIHRlc3RfZnVuY3Rpb24odF9mdW5jdGlvbiogc3V0KSB7CisgIGJvb3N0OjpzY29wZWRfcHRyPHRfZnVuY3Rpb24+IHN1dDIocm91bmRfdHJpcChzdXQpKTsKKworICBCT09TVF9QUF9MSVNUX0ZPUl9FQUNIKAorICAgICAgVEhSSUZUX0NIRUNLLAorICAgICAgc3V0LT4sCisgICAgICBCT09TVF9QUF9UVVBMRV9UT19MSVNUKDQsIChnZXRfZG9jKCksIGdldF9uYW1lKCksIGdldF9yZXR1cm50eXBlKCktPmdldF9uYW1lKCksIGlzX29uZXdheSgpKSkpCit9Cit2b2lkIHRlc3Rfc2VydmljZSh0X3NlcnZpY2UqIHN1dCkgeworICBib29zdDo6c2NvcGVkX3B0cjx0X3NlcnZpY2U+IHN1dDIocm91bmRfdHJpcChzdXQpKTsKKworICBCT09TVF9QUF9MSVNUX0ZPUl9FQUNIKFRIUklGVF9DSEVDSywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdXQtPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCT09TVF9QUF9UVVBMRV9UT19MSVNUKDMsIChnZXRfZG9jKCksIGdldF9uYW1lKCksIGdldF9mdW5jdGlvbnMoKS5zaXplKCkpKSkKKyAgaWYgKHN1dC0+Z2V0X2V4dGVuZHMoKSkgeworICAgIFRIUklGVF9DSEVDSygsIHN1dC0+LCBnZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpKTsKKyAgfSBlbHNlIHsKKyAgICBCT09TVF9DSEVDSyghc3V0Mi0+Z2V0X2V4dGVuZHMoKSk7CisgIH0KK30KKwordm9pZCB0ZXN0X3Byb2dyYW0odF9wcm9ncmFtKiBzdXQpIHsKKyAgYm9vc3Q6OnNjb3BlZF9wdHI8dF9wcm9ncmFtPiBzdXQyKHJvdW5kX3RyaXAoc3V0KSk7CisKKyAgQk9PU1RfUFBfTElTVF9GT1JfRUFDSChUSFJJRlRfQ0hFQ0ssIHN1dC0+LCBCT09TVF9QUF9UVVBMRV9UT19MSVNUKDIsIChnZXRfZG9jKCksIGdldF9uYW1lKCkpKSkKK30KK2Jvb3N0Ojp1bml0X3Rlc3Q6OnRlc3Rfc3VpdGUqIGRvX2luaXRfdW5pdF90ZXN0X3N1aXRlKCkgeworICB0ZXN0X2RhdGE6OmluaXQoKTsKKyAgdGVzdF9zdWl0ZSogdHMgPSBCT09TVF9URVNUX1NVSVRFKCJQbHVnaW5Db252ZXJzaW9uVGVzdCIpOworCisjZGVmaW5lIFRfVEVTVF9DQVNFKHIsIGQsIHR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRzLT5hZGQoQk9PU1RfUEFSQU1fVEVTVF9DQVNFKHRlc3RfIyN0eXBlLCB0ZXN0X2RhdGE6OnR5cGUjI3MuYmVnaW4oKSwgdGVzdF9kYXRhOjp0eXBlIyNzLmVuZCgpKSk7CisgIEJPT1NUX1BQX0xJU1RfRk9SX0VBQ0goVF9URVNUX0NBU0UsIF8sIFRfVEVTVF9UWVBFUykKKyAgVF9URVNUX0NBU0UoXywgXywgdHlwZSkKKyN1bmRlZiBUX1RFU1RfQ0FTRQorICByZXR1cm4gdHM7Cit9CisKKyNpZmRlZiBCT09TVF9URVNUX0RZTl9MSU5LCitib29sIGluaXRfdW5pdF90ZXN0X3N1aXRlKCkgeworICBmcmFtZXdvcms6Om1hc3Rlcl90ZXN0X3N1aXRlKCkuYWRkKGRvX2luaXRfdW5pdF90ZXN0X3N1aXRlKCkpOworICByZXR1cm4gdHJ1ZTsKK30KK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKKyAgcmV0dXJuIDo6Ym9vc3Q6OnVuaXRfdGVzdDo6dW5pdF90ZXN0X21haW4oJmluaXRfdW5pdF90ZXN0X3N1aXRlLCBhcmdjLCBhcmd2KTsKK30KKyNlbHNlCitib29zdDo6dW5pdF90ZXN0Ojp0ZXN0X3N1aXRlKiBpbml0X3VuaXRfdGVzdF9zdWl0ZShpbnQgYXJnYywgY2hhciogYXJndltdKSB7CisgIHJldHVybiBkb19pbml0X3VuaXRfdGVzdF9zdWl0ZSgpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9wbHVnaW4vY3BwX3BsdWdpbi5jYyBiL2NvbXBpbGVyL2NwcC90ZXN0L3BsdWdpbi9jcHBfcGx1Z2luLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjYzE5ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9wbHVnaW4vY3BwX3BsdWdpbi5jYwpAQCAtMCwwICsxLDQzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJ0aHJpZnQvcGx1Z2luL3BsdWdpbi5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5oIgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHBsdWdpbiB7CisKK2NsYXNzIE15Q3BwR2VuZXJhdG9yIDogcHVibGljIEdlbmVyYXRvclBsdWdpbiB7CisgIHZpcnR1YWwgaW50IGdlbmVyYXRlKDo6dF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucykgeworICAgIHRfZ2VuZXJhdG9yKiBnZW4gPSB0X2dlbmVyYXRvcl9yZWdpc3RyeTo6Z2V0X2dlbmVyYXRvcihwcm9ncmFtLCAiY3BwIiwgcGFyc2VkX29wdGlvbnMsICIiKTsKKyAgICBnZW4tPmdlbmVyYXRlX3Byb2dyYW0oKTsKKyAgICBkZWxldGUgZ2VuOworICAgIHJldHVybiAwOworICB9Cit9OworfQorfQorfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKSB7CisgIGFwYWNoZTo6dGhyaWZ0OjpwbHVnaW46Ok15Q3BwR2VuZXJhdG9yIHA7CisgIHJldHVybiBwLmV4ZWMoYXJnYywgYXJndik7Cit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9wbHVnaW5fc3RhYmlsaXR5X3Rlc3Quc2ggYi9jb21waWxlci9jcHAvdGVzdC9wbHVnaW5fc3RhYmlsaXR5X3Rlc3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWI3YzkzZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L3BsdWdpbl9zdGFiaWxpdHlfdGVzdC5zaApAQCAtMCwwICsxLDMyIEBACisjIS9iaW4vc2gKKworIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgdGhpcyBmaWxlIGlzIGludGVuZGVkIHRvIGJlIGludm9rZWQgYnkgbWFrZS4KKyMKKyMgVGhpcyBmaWxlIHJ1bnMgdGhlIGNvbXBpbGVyIHR3aWNlLCB1c2luZyBhIHBsdWdpbiB0aGF0IGp1c3QgaW52b2tlcworIyAvYmluL2NhdCwgYW5kIGNvbXBhcmVzIHRoZSBvdXRwdXQuICBJZiBHZW5lcmF0b3JJbnB1dCBpcworIyBub25kZXRlcm1pbnNpdGljLCB5b3UnZCBleHBlY3QgdGhlIG91dHB1dCB0byBkaWZmZXIgZnJvbSBydW4tdG8tcnVuLgorIyBTbyB0aGlzIHRlc3RzIHRoYXQgaW4gZmFjdCwgdGhlIG91dHB1dCBpcyBzdGFibGUgZnJvbSBydW4tdG8tcnVuLgorc2V0IC1lCitta2RpciAtcCBnZW4tYmluY2F0CitQQVRIPS46IiRQQVRIIiAuLi90aHJpZnQgLXIgLWdlbiBiaW5jYXQgLi4vLi4vLi4vdGVzdC9JbmNsdWRlLnRocmlmdCA+IGdlbi1iaW5jYXQvMS5zZXIKK1BBVEg9LjoiJFBBVEgiIC4uL3RocmlmdCAtciAtZ2VuIGJpbmNhdCAuLi8uLi8uLi90ZXN0L0luY2x1ZGUudGhyaWZ0ID4gZ2VuLWJpbmNhdC8yLnNlcgorZGlmZiAtLWJpbmFyeSBnZW4tYmluY2F0LzEuc2VyIGdlbi1iaW5jYXQvMi5zZXIKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0cy9DTWFrZUxpc3RzLnR4dCBiL2NvbXBpbGVyL2NwcC90ZXN0cy9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmIxMDBjCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3RzL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTUzIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKK2NtYWtlX21pbmltdW1fcmVxdWlyZWQoVkVSU0lPTiAyLjguMTIpCisKK3Byb2plY3QodGhyaWZ0X2NvbXBpbGVyX3Rlc3RzKQorCitzZXQoVEhSSUZUX0NPTVBJTEVSX1NPVVJDRV9ESVIKKyAgICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vLi4KKykKKworIyBkb24ndCBnZW5lcmF0ZSBaRVJPX0NIRUNLCitzZXQoQ01BS0VfU1VQUFJFU1NfUkVHRU5FUkFUSU9OIHRydWUpCisKK2NvbmZpZ3VyZV9maWxlKCR7VEhSSUZUX0NPTVBJTEVSX1NPVVJDRV9ESVJ9L3NyYy90aHJpZnQvdmVyc2lvbi5oLmluICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvdmVyc2lvbi5oKQoraWYoTVNWQykKKyAgICAjIFRoZSB3aW5mbGV4Ymlzb24gZ2VuZXJhdG9yIG91dHB1dHMgc29tZSBtYWNyb3MgdGhhdCBjb25mbGljdCB3aXRoIHRoZSBWaXN1YWwgU3R1ZGlvIDIwMTAgY29weSBvZiBzdGRpbnQuaAorICAgICMgVGhpcyBtaWdodCBiZSBmaXhlZCBpbiBsYXRlciB2ZXJzaW9ucyBvZiBWaXN1YWwgU3R1ZGlvLCBidXQgYW4gZWFzeSBzb2x1dGlvbiBpcyB0byBpbmNsdWRlIHN0ZGludC5oIGZpcnN0CisgICAgaWYoSEFWRV9TVERJTlRfSCkKKyAgICAgICAgYWRkX2RlZmluaXRpb25zKC1EX19TVERDX0xJTUlUX01BQ1JPUykKKyAgICAgICAgYWRkX2RlZmluaXRpb25zKC9GSSJzdGRpbnQuaCIpCisgICAgZW5kaWYoSEFWRV9TVERJTlRfSCkKK2VuZGlmKCkKKworZmluZF9wYWNrYWdlKEZMRVggUkVRVUlSRUQpCitmaW5kX3BhY2thZ2UoQklTT04gUkVRVUlSRUQpCisKKyMgY3JlYXRlIGRpcmVjdG9yeSBmb3IgdGhyaWZ0eSBhbmQgdGhyaWZ0bAorZmlsZShNQUtFX0RJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0LykKKworIyBDcmVhdGUgZmxleCBhbmQgYmlzb24gZmlsZXMgYW5kIGJ1aWxkIHRoZSBsaWIgcGFyc2Ugc3RhdGljIGxpYnJhcnkKK0JJU09OX1RBUkdFVCh0aHJpZnR5ICR7VEhSSUZUX0NPTVBJTEVSX1NPVVJDRV9ESVJ9L3NyYy90aHJpZnQvdGhyaWZ0eS55eSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0L3RocmlmdHkuY2MpCitGTEVYX1RBUkdFVCh0aHJpZnRsICR7VEhSSUZUX0NPTVBJTEVSX1NPVVJDRV9ESVJ9L3NyYy90aHJpZnQvdGhyaWZ0bC5sbCAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0L3RocmlmdGwuY2MpCitBRERfRkxFWF9CSVNPTl9ERVBFTkRFTkNZKHRocmlmdGwgdGhyaWZ0eSkKKworc2V0KHBhcnNlX1NPVVJDRVMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0L3RocmlmdHkuY2MKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0L3RocmlmdGwuY2MKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0L3RocmlmdHkuaGgKKykKKworYWRkX2xpYnJhcnkocGFyc2UgU1RBVElDICR7cGFyc2VfU09VUkNFU30pCisKKyMgVGhyaWZ0IGNvbXBpbGVyIHRlc3RzCitzZXQodGhyaWZ0X2NvbXBpbGVyX3Rlc3RzCispCisKKyMgeW91IGNhbiBhZGQgc29tZSBmaWxlcyBtYW51YWxseSB0aGVyZSAKK3NldCh0aHJpZnRfY29tcGlsZXJfdGVzdHNfbWFudWFsX1NPVVJDRVMKKyAgICAjIHRlc3RzIGZpbGUgdG8gYXZvaWQgbWFpbiBpbiBldmVyeSB0ZXN0IGZpbGUKKyAgICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vdGVzdHNfbWFpbi5jYworKQorCisjIHNldCB2YXJpYWJsZSBmb3IgdGVzdHMgc291cmNlcyAtIHdpbGwgYmUgZmlsbGVkIGxhdGVyCitzZXQodGhyaWZ0X2NvbXBpbGVyX3Rlc3RzX1NPVVJDRVMKKykKKworc2V0KHRocmlmdF9jb21waWxlcl9TT1VSQ0VTCisgICAgJHtUSFJJRlRfQ09NUElMRVJfU09VUkNFX0RJUn0vc3JjL3RocmlmdC9sb2dnaW5nLmNjICMgd2UgdXNlIGxvZ2dpbmcgaW5zdGVhZCBvZiBtYWluIHRvIGF2b2lkIGJyZWFraW5nIGNvbXBpbGxhdGlvbiAoMiBtYWluIHYpCisgICAgJHtUSFJJRlRfQ09NUElMRVJfU09VUkNFX0RJUn0vc3JjL3RocmlmdC9hdWRpdC90X2F1ZGl0LmNwcAorICAgICR7VEhSSUZUX0NPTVBJTEVSX1NPVVJDRV9ESVJ9L3NyYy90aHJpZnQvY29tbW9uLmNjCisgICAgJHtUSFJJRlRfQ09NUElMRVJfU09VUkNFX0RJUn0vc3JjL3RocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5jYworICAgICR7VEhSSUZUX0NPTVBJTEVSX1NPVVJDRV9ESVJ9L3NyYy90aHJpZnQvcGFyc2UvdF90eXBlZGVmLmNjCisgICAgJHtUSFJJRlRfQ09NUElMRVJfU09VUkNFX0RJUn0vc3JjL3RocmlmdC9wYXJzZS9wYXJzZS5jYworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvdmVyc2lvbi5oCispCisKKyMgVGhpcyBtYWNybyBhZGRzIGFuIG9wdGlvbiBUSFJJRlRfQ09NUElMRVJfJHtOQU1FfQorIyB0aGF0IGFsbG93cyBlbmFibGluZyBvciBkaXNhYmxpbmcgY2VydGFpbiBsYW5ndWFnZXMKK21hY3JvKFRIUklGVF9BRERfQ09NUElMRVIgbmFtZSBkZXNjcmlwdGlvbiBpbml0aWFsKQorICAgIHN0cmluZyhUT1VQUEVSICJUSFJJRlRfQ09NUElMRVJfJHtuYW1lfSIgZW5hYmxlcikKKyAgICBzZXQoc3JjICIke1RIUklGVF9DT01QSUxFUl9TT1VSQ0VfRElSfS9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfJHtuYW1lfV9nZW5lcmF0b3IuY2MiKQorICAgIG9wdGlvbigke2VuYWJsZXJ9ICR7ZGVzY3JpcHRpb259ICR7aW5pdGlhbH0pCisgICAgaWYoJHtlbmFibGVyfSkKKyAgICAgICAgbGlzdChBUFBFTkQgdGhyaWZ0X2NvbXBpbGVyX1NPVVJDRVMgJHtzcmN9KQorICAgICAgICBmaWxlKEdMT0IgdGhyaWZ0X2NvbXBpbGVyX3Rlc3RzX1NPVVJDRVMKKyAgICAgICAgICAgICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vJHtuYW1lfS8qLmMqIgorICAgICAgICAgICAgIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS8ke25hbWV9LyoudGhyaWZ0IgorICAgICAgICApCisgICAgZW5kaWYoKQorZW5kbWFjcm8oKQorCisjIFRoZSBmb2xsb3dpbmcgY29tcGlsZXIgd2l0aCB1bml0IHRlc3RzIGNhbiBiZSBlbmFibGVkIG9yIGRpc2FibGVkCitUSFJJRlRfQUREX0NPTVBJTEVSKGNfZ2xpYiAgIkVuYWJsZSBjb21waWxlciBmb3IgQyB3aXRoIEdsaWIiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIoY3BwICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBDKysiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIoamF2YSAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBKYXZhIiAgIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIoYXMzICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBBY3Rpb25TY3JpcHQgMyIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihkYXJ0ICAgICJFbmFibGUgY29tcGlsZXIgZm9yIERhcnQiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIoaGF4ZSAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBIYXhlIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKGNzaGFycCAgIkVuYWJsZSBjb21waWxlciBmb3IgQyMiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIobmV0Y29yZSAiRW5hYmxlIGNvbXBpbGVyIGZvciAuTkVUIENvcmUiIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihweSAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIFB5dGhvbiAyLjAiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIocmIgICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBSdWJ5IiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKHBlcmwgICAgIkVuYWJsZSBjb21waWxlciBmb3IgUGVybCIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihwaHAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIFBIUCIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihlcmwgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEVybGFuZyIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihjb2NvYSAgICJFbmFibGUgY29tcGlsZXIgZm9yIENvY29hIE9iamVjdGl2ZS1DIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKHN3aWZ0ICAgIkVuYWJsZSBjb21waWxlciBmb3IgQ29jb2EgU3dpZnQiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIoc3QgICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBTbWFsbHRhbGsiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIob2NhbWwgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBPQ2FtbCIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihocyAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEhhc2tlbGwiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIoeHNkICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBYU0QiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIoaHRtbCAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBIVE1MIERvY3VtZW50YXRpb24iIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIoanMgICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBKYXZhU2NyaXB0IiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKGpzb24gICAgIkVuYWJsZSBjb21waWxlciBmb3IgSlNPTiIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihqYXZhbWUgICJFbmFibGUgY29tcGlsZXIgZm9yIEphdmEgTUUiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIoZGVscGhpICAiRW5hYmxlIGNvbXBpbGVyIGZvciBEZWxwaGkiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIoZ28gICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBHbyIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihkICAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEQiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIobHVhICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBMdWEiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIoZ3YgICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBHcmFwaFZpeiIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihycyAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIFJ1c3QiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIoeG1sICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBYTUwiIE9GRikKKworIyBUaHJpZnQgaXMgbG9va2luZyBmb3IgaW5jbHVkZSBmaWxlcyBpbiB0aGUgc3JjIGRpcmVjdG9yeQorIyB3ZSBhbHNvIGFkZCB0aGUgY3VycmVudCBiaW5hcnkgZGlyZWN0b3J5IGZvciBnZW5lcmF0ZWQgZmlsZXMKK2luY2x1ZGVfZGlyZWN0b3JpZXMoJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9ICR7VEhSSUZUX0NPTVBJTEVSX1NPVVJDRV9ESVJ9L3NyYyAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vY2F0Y2gpCisKK2FkZF9saWJyYXJ5KHRocmlmdF9jb21waWxlciAke3RocmlmdF9jb21waWxlcl9TT1VSQ0VTfSkKKworI2xpbmsgcGFyc2UgbGliIHRvIHRocmlmdF9jb21waWxlciBsaWIKK3RhcmdldF9saW5rX2xpYnJhcmllcyh0aHJpZnRfY29tcGlsZXIgcGFyc2UpCisKKyMgYWRkIHRlc3RzIGV4ZWN1dGFibGUKK2FkZF9leGVjdXRhYmxlKHRocmlmdF9jb21waWxlcl90ZXN0cyAke3RocmlmdF9jb21waWxlcl90ZXN0c19tYW51YWxfU09VUkNFU30gJHt0aHJpZnRfY29tcGlsZXJfdGVzdHNfU09VUkNFU30pCisKKyMgaWYgZ2VuZXJhdGVzIGZvciBWaXN1YWwgU3R1ZGlvIHNldCB0aHJpZnRfY29tcGlsZXJfdGVzdHMgYXMgZGVmYXVsdCBwcm9qZWN0CitpZihNU1ZDKQorICAgIHNldF9wcm9wZXJ0eShUQVJHRVQgdGhyaWZ0X2NvbXBpbGVyX3Rlc3RzIFBST1BFUlRZIFZTX1NUQVJUVVBfUFJPSkVDVCB0aHJpZnRfY29tcGlsZXJfdGVzdHMpCitlbmRpZigpCisKK3NldF90YXJnZXRfcHJvcGVydGllcyh0aHJpZnRfY29tcGlsZXJfdGVzdHMgUFJPUEVSVElFUyBSVU5USU1FX09VVFBVVF9ESVJFQ1RPUlkgYmluLykKK3NldF90YXJnZXRfcHJvcGVydGllcyh0aHJpZnRfY29tcGlsZXJfdGVzdHMgUFJPUEVSVElFUyBPVVRQVVRfTkFNRSB0aHJpZnRfY29tcGlsZXJfdGVzdHMpCisKK3RhcmdldF9saW5rX2xpYnJhcmllcyh0aHJpZnRfY29tcGlsZXJfdGVzdHMgdGhyaWZ0X2NvbXBpbGVyKQorCitlbmFibGVfdGVzdGluZygpCithZGRfdGVzdChOQU1FIFRocmlmdFRlc3RzIENPTU1BTkQgdGhyaWZ0X2NvbXBpbGVyX3Rlc3RzKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0cy9SRUFETUUubWQgYi9jb21waWxlci9jcHAvdGVzdHMvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3YmU0OTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdHMvUkVBRE1FLm1kCkBAIC0wLDAgKzEsODggQEAKKyMgQnVpbGQgYW5kIHJ1biBjb21waWxlciB0ZXN0cyB1c2luZyBDTWFrZQorCis8IS0tIFRPQyAtLT4KKworLSBbQnVpbGQgYW5kIHJ1biBjb21waWxlciB0ZXN0cyB1c2luZyBDTWFrZV0oI2J1aWxkLWFuZC1ydW4tY29tcGlsZXItdGVzdHMtdXNpbmctY21ha2UpCisgICAgLSBbR2VuZXJhbCBpbmZvcm1hdGlvbl0oI2dlbmVyYWwtaW5mb3JtYXRpb24pCisgICAgLSBbSG93IHRvIGFkZCB5b3VyIHRlc3RzXSgjaG93LXRvLWFkZC15b3VyLXRlc3RzKQorICAgIC0gW0J1aWxkIGFuZCBydW4gdGVzdHMgb24gVW5peC1saWtlIHN5c3RlbXNdKCNidWlsZC1hbmQtcnVuLXRlc3RzLW9uLXVuaXgtbGlrZS1zeXN0ZW1zKQorICAgICAgICAtIFtQcmVyZXF1aXNpdGVzOl0oI3ByZXJlcXVpc2l0ZXMpCisgICAgICAgIC0gW0J1aWxkIGFuZCBydW4gdGVzdCB3aXRoIENNYWtlXSgjYnVpbGQtYW5kLXJ1bi10ZXN0LXdpdGgtY21ha2UpCisgICAgLSBbQnVpbGQgYW5kIHJ1biB0ZXN0cyBvbiBXaW5kb3dzXSgjYnVpbGQtYW5kLXJ1bi10ZXN0cy1vbi13aW5kb3dzKQorICAgICAgICAtIFtQcmVyZXF1aXNpdGVzOl0oI3ByZXJlcXVpc2l0ZXMtMSkKKyAgICAgICAgLSBbR2VuZXJhdGlvbiBvZiBWUyBwcm9qZWN0IHdpdGggQ01ha2UsIGJ1aWxkIGFuZCBydW4gb24gV2luZG93c10oI2dlbmVyYXRpb24tb2YtdnMtcHJvamVjdC13aXRoLWNtYWtlLWJ1aWxkLWFuZC1ydW4tb24td2luZG93cykKKworPCEtLSAvVE9DIC0tPgorCisjIyBHZW5lcmFsIGluZm9ybWF0aW9uIAorCitBZGRlZCBnZW5lcmljIHdheSB0byBjb3ZlciBjb2RlIGJ5IHRlc3RzIGZvciBtYW55IGxhbmd1YWdlcyAoeW91IGp1c3QgbmVlZCB0byBtYWtlIGEgY29ycmVjdCBoZWFkZXIgZmlsZSBmb3IgZ2VuZXJhdG9yIGZvciB5b3VyIGxhbmd1YWdlIC0gZXhhbXBsZSBpbiAqKm5ldGNvcmUqKiBpbXBsZW1lbnRhdGlvbikKKworQXQgY3VycmVudCBtb21lbnQgdGhlc2UgdGVzdHMgdXNlIGZyZWUgQ2F0Y2ggbGlicmFyeSAoaHR0cHM6Ly9naXRodWIuY29tL2NhdGNob3JnL0NhdGNoMi90cmVlL0NhdGNoMS54KSBmb3IgZWFzeSB0ZXN0IGNyZWF0aW9uIGFuZCB1c2FnZS4KK0RlY2lzaW9uIHRvIHVzZSBpdCB3YXMgYmVjYXVzZSBvZiBzaW1wbGljaXR5LCBlYXN5IHVzYWdlLCBvbmUgaGVhZGVyIGZpbGUgdG8gdXNlLCBzdGFibGUgY29tbXVuaXR5IGFuZCBncm93aW5nIGludGVyZXN0ICAoaHR0cHM6Ly9jcHAubGliaHVudC5jb20vcHJvamVjdC9nb29nbGV0ZXN0LWdvb2dsZS92cy9jYXRjaD9yZWw9Y21wLWNtcCkKKworQWxzbywgbWF5YmUsIGxhdGVyIGl0IHdpbGwgYmUgbWlncmF0ZWQgdG8gQ2F0Y2gyIChodHRwczovL2dpdGh1Yi5jb20vcGhpbHNxdWFyZWQvQ2F0Y2gpIC0gZGVwZW5kcyBvbiBuZWVkIHRvIHN1cHBvcnQgbGVnYWN5IGNvbXBpbGVycyAoYysrOTgpCisKKyMjIEhvdyB0byBhZGQgeW91ciB0ZXN0cworCistIE9wZW4gKipDTWFrZUxpc3RzLnR4dCoqCistIFNldCAqKk9uKiogdG8gY2FsbCBvZiAqKlRIUklGVF9BRERfQ09NUElMRVIqKiBmb3IgeW91ciBsYW5ndWFnZQorCitgYGAgY21ha2UgCitUSFJJRlRfQUREX0NPTVBJTEVSKG5ldGNvcmUgIkVuYWJsZSBjb21waWxlciBmb3IgLk5FVCBDb3JlIiBPTikKK2BgYAorCistIENyZWF0ZSBmb2xkZXIgd2l0aCBuYW1lIHNwZWNpZmllZCBpbiBsaXN0IG9mIGxhbmd1YWdlcyBpbiAqKkNNYWtlTGlzdHMudHh0KioKKy0gQ3JlYXRlIHRlc3RzIGluIGZvbGRlciBmb3IgeW91ciBsYW5ndWFnZSAod2l0aCBleHRlbnNpb25zIGxpa2UgKi5jKiAtIGNjLCBjcHAsIGV0YykKKyAgLSBEb24ndCBmb3JnZXQgdG8gYWRkIGluY2x1ZGUgb2YgY2F0Y2guaHBwIGluIHlvdXIgdGVzdCBmaWxlCisgIGBgYCBDCisgICNpbmNsdWRlICIuLi9jYXRjaC9jYXRjaC5ocHAiCisgIGBgYAorCistIElmIHlvdSBuZWVkIC0gYWRkIGZpbGVzIG1hbnVhbGx5IHRvICoqdGhyaWZ0X2NvbXBpbGVyX3Rlc3RzX21hbnVhbF9TT1VSQ0VTKiogaW4gKipDTWFrZUxpc3RzLnR4dCoqIHNpbWlsYXIgdG8gCisKK2BgYCBjbWFrZQorIyB5b3UgY2FuIGFkZCBzb21lIGZpbGVzIG1hbnVhbGx5IHRoZXJlIAorc2V0KHRocmlmdF9jb21waWxlcl90ZXN0c19tYW51YWxfU09VUkNFUworICAgICMgdGVzdHMgZmlsZSB0byBhdm9pZCBtYWluIGluIGV2ZXJ5IHRlc3QgZmlsZQorICAgICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS90ZXN0c19tYWluLmNjCispCitgYGAKKworLSBSdW4gKipjbWFrZSoqIHdpdGggYXJndW1lbnRzIGZvciB5b3VyIGVudmlyb25tZW50IGFuZCBjb21waWxlciAKKy0gRW5qb3kKKworIyMgQnVpbGQgYW5kIHJ1biB0ZXN0cyBvbiBVbml4LWxpa2Ugc3lzdGVtcworCisjIyMgUHJlcmVxdWlzaXRlczoKKy0gSW5zdGFsbCBDTWFrZSAtIDxodHRwczovL2NtYWtlLm9yZy9kb3dubG9hZC8+CistIEluc3RhbGwgd2luZmxleGJpc29uIC0gPGh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL3dpbmZsZXhiaXNvbi8+CisKKyMjIyBCdWlsZCBhbmQgcnVuIHRlc3Qgd2l0aCBDTWFrZQorCistIFJ1biBjb21tYW5kcyBpbiBjb21tYW5kIGxpbmUgaW4gY3VycmVudCBkaXJlY3Rvcnk6CisKK2BgYAorbWtkaXIgY21ha2UtdnMgJiYgY2QgY21ha2UtdnMKK2NtYWtlIC4uCitjbWFrZSAtLWJ1aWxkIC4KK2N0ZXN0IC1DIERlYnVnIC1WCitgYGAKKworIyMgQnVpbGQgYW5kIHJ1biB0ZXN0cyBvbiBXaW5kb3dzCisKKyMjIyBQcmVyZXF1aXNpdGVzOgorLSBJbnN0YWxsIENNYWtlIC0gPGh0dHBzOi8vY21ha2Uub3JnL2Rvd25sb2FkLz4KKy0gSW5zdGFsbCB3aW5mbGV4Ymlzb24gLSA8aHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvd2luZmxleGJpc29uLz4KKy0gSW5zdGFsbCBWUzIwMTcgQ29tbXVuaXR5IEVkaXRpb24gLSA8aHR0cHM6Ly93d3cudmlzdWFsc3R1ZGlvLmNvbS92cy93aGF0c25ldy8+IChlbnN1cmUgdGhhdCB5b3UgaW5zdGFsbGVkIHdvcmtsb2FkICJEZXNrdG9wIERldmVsb3BtZW50IHdpdGggQysrIiBmb3IgVlMyMDE3KQorCisjIyMgR2VuZXJhdGlvbiBvZiBWUyBwcm9qZWN0IHdpdGggQ01ha2UsIGJ1aWxkIGFuZCBydW4gb24gV2luZG93cworLSBSdW4gY29tbWFuZHMgaW4gY29tbWFuZCBsaW5lIGluIGN1cnJlbnQgZGlyZWN0b3J5IChlbnN1cmUgdGhhdCBWUyBpbnN0YWxsZWQpOgorCitgYGAKK21rZGlyIGNtYWtlLXZzCitjZCBjbWFrZS12cworY21ha2UgLi4KK2NtYWtlIC0tYnVpbGQgLgorY3Rlc3QgLUMgRGVidWcgLVYKK2BgYApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0cy9jYXRjaC9jYXRjaC5ocHAgYi9jb21waWxlci9jcHAvdGVzdHMvY2F0Y2gvY2F0Y2guaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZDAzN2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdHMvY2F0Y2gvY2F0Y2guaHBwCkBAIC0wLDAgKzEsMTE1MDggQEAKKy8qCisgKiAgQ2F0Y2ggdjEuOS40CisgKiAgR2VuZXJhdGVkOiAyMDE3LTA1LTE2IDEzOjUxOjU1LjUwNjUxOQorICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBUaGlzIGZpbGUgaGFzIGJlZW4gbWVyZ2VkIGZyb20gbXVsdGlwbGUgaGVhZGVycy4gUGxlYXNlIGRvbid0IGVkaXQgaXQgZGlyZWN0bHkKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTIgVHdvIEJsdWUgQ3ViZXMgTHRkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCisgKiAgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisgKi8KKyNpZm5kZWYgVFdPQkxVRUNVQkVTX1NJTkdMRV9JTkNMVURFX0NBVENIX0hQUF9JTkNMVURFRAorI2RlZmluZSBUV09CTFVFQ1VCRVNfU0lOR0xFX0lOQ0xVREVfQ0FUQ0hfSFBQX0lOQ0xVREVECisKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0hQUF9JTkNMVURFRAorCisjaWZkZWYgX19jbGFuZ19fCisjICAgIHByYWdtYSBjbGFuZyBzeXN0ZW1faGVhZGVyCisjZWxpZiBkZWZpbmVkIF9fR05VQ19fCisjICAgIHByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorI2VuZGlmCisKKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF9zdXBwcmVzc193YXJuaW5ncy5oCisKKyNpZmRlZiBfX2NsYW5nX18KKyMgICBpZmRlZiBfX0lDQyAvLyBpY3BjIGRlZmluZXMgdGhlIF9fY2xhbmdfXyBtYWNybworIyAgICAgICBwcmFnbWEgd2FybmluZyhwdXNoKQorIyAgICAgICBwcmFnbWEgd2FybmluZyhkaXNhYmxlOiAxNjEgMTY4MikKKyMgICBlbHNlIC8vIF9fSUNDCisjICAgICAgIHByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XZ2xvYmFsLWNvbnN0cnVjdG9ycyIKKyMgICAgICAgcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVd2YXJpYWRpYy1tYWNyb3MiCisjICAgICAgIHByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XYzk5LWV4dGVuc2lvbnMiCisjICAgICAgIHByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XdW51c2VkLXZhcmlhYmxlIgorIyAgICAgICBwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCisjICAgICAgIHByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XcGFkZGVkIgorIyAgICAgICBwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV2MrKzk4LWNvbXBhdCIKKyMgICAgICAgcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdjKys5OC1jb21wYXQtcGVkYW50aWMiCisjICAgICAgIHByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1Xc3dpdGNoLWVudW0iCisjICAgICAgIHByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XY292ZXJlZC1zd2l0Y2gtZGVmYXVsdCIKKyMgICAgZW5kaWYKKyNlbGlmIGRlZmluZWQgX19HTlVDX18KKyMgICAgcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XdmFyaWFkaWMtbWFjcm9zIgorIyAgICBwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVd1bnVzZWQtdmFyaWFibGUiCisjICAgIHByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV3BhcmVudGhlc2VzIgorCisjICAgIHByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwdXNoCisjICAgIHByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV3BhZGRlZCIKKyNlbmRpZgorI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX01BSU4pIHx8IGRlZmluZWQoQ0FUQ0hfQ09ORklHX1JVTk5FUikKKyMgIGRlZmluZSBDQVRDSF9JTVBMCisjZW5kaWYKKworI2lmZGVmIENBVENIX0lNUEwKKyMgIGlmbmRlZiBDTEFSQV9DT05GSUdfTUFJTgorIyAgICBkZWZpbmUgQ0xBUkFfQ09ORklHX01BSU5fTk9UX0RFRklORUQKKyMgICAgZGVmaW5lIENMQVJBX0NPTkZJR19NQUlOCisjICBlbmRpZgorI2VuZGlmCisKKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF9ub3RpbXBsZW1lbnRlZF9leGNlcHRpb24uaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfTk9USU1QTEVNRU5URURfRVhDRVBUSU9OX0hfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2NvbW1vbi5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9DT01NT05fSF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfY29tcGlsZXJfY2FwYWJpbGl0aWVzLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0NPTVBJTEVSX0NBUEFCSUxJVElFU19IUFBfSU5DTFVERUQKKworLy8gRGV0ZWN0IGEgbnVtYmVyIG9mIGNvbXBpbGVyIGZlYXR1cmVzIC0gbW9zdGx5IEMrKzExLzE0IGNvbmZvcm1hbmNlIC0gYnkgY29tcGlsZXIKKy8vIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGRlZmluZWQ6CisvLworLy8gQ0FUQ0hfQ09ORklHX0NQUDExX05VTExQVFIgOiBpcyBudWxscHRyIHN1cHBvcnRlZD8KKy8vIENBVENIX0NPTkZJR19DUFAxMV9OT0VYQ0VQVCA6IGlzIG5vZXhjZXB0IHN1cHBvcnRlZD8KKy8vIENBVENIX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUyA6IFRoZSBkZWxldGUgYW5kIGRlZmF1bHQga2V5d29yZHMgZm9yIGNvbXBpbGVyIGdlbmVyYXRlZCBtZXRob2RzCisvLyBDQVRDSF9DT05GSUdfQ1BQMTFfSVNfRU5VTSA6IHN0ZDo6aXNfZW51bSBpcyBzdXBwb3J0ZWQ/CisvLyBDQVRDSF9DT05GSUdfQ1BQMTFfVFVQTEUgOiBzdGQ6OnR1cGxlIGlzIHN1cHBvcnRlZAorLy8gQ0FUQ0hfQ09ORklHX0NQUDExX0xPTkdfTE9ORyA6IGlzIGxvbmcgbG9uZyBzdXBwb3J0ZWQ/CisvLyBDQVRDSF9DT05GSUdfQ1BQMTFfT1ZFUlJJREUgOiBpcyBvdmVycmlkZSBzdXBwb3J0ZWQ/CisvLyBDQVRDSF9DT05GSUdfQ1BQMTFfVU5JUVVFX1BUUiA6IGlzIHVuaXF1ZV9wdHIgc3VwcG9ydGVkIChvdGhlcndpc2UgdXNlIGF1dG9fcHRyKQorLy8gQ0FUQ0hfQ09ORklHX0NQUDExX1NIVUZGTEUgOiBpcyBzdGQ6OnNodWZmbGUgc3VwcG9ydGVkPworLy8gQ0FUQ0hfQ09ORklHX0NQUDExX1RZUEVfVFJBSVRTIDogYXJlIHR5cGVfdHJhaXRzIGFuZCBlbmFibGVfaWYgc3VwcG9ydGVkPworCisvLyBDQVRDSF9DT05GSUdfQ1BQMTFfT1JfR1JFQVRFUiA6IElzIEMrKzExIHN1cHBvcnRlZD8KKworLy8gQ0FUQ0hfQ09ORklHX1ZBUklBRElDX01BQ1JPUyA6IGFyZSB2YXJpYWRpYyBtYWNyb3Mgc3VwcG9ydGVkPworLy8gQ0FUQ0hfQ09ORklHX0NPVU5URVIgOiBpcyB0aGUgX19DT1VOVEVSX18gbWFjcm8gc3VwcG9ydGVkPworLy8gQ0FUQ0hfQ09ORklHX1dJTkRPV1NfU0VIIDogaXMgV2luZG93cyBTRUggc3VwcG9ydGVkPworLy8gQ0FUQ0hfQ09ORklHX1BPU0lYX1NJR05BTFMgOiBhcmUgUE9TSVggc2lnbmFscyBzdXBwb3J0ZWQ/CisvLyAqKioqKioqKioqKioqKioqCisvLyBOb3RlIHRvIG1haW50YWluZXJzOiBpZiBuZXcgdG9nZ2xlcyBhcmUgYWRkZWQgcGxlYXNlIGRvY3VtZW50IHRoZW0KKy8vIGluIGNvbmZpZ3VyYXRpb24ubWQsIHRvbworLy8gKioqKioqKioqKioqKioqKgorCisvLyBJbiBnZW5lcmFsIGVhY2ggbWFjcm8gaGFzIGEgX05PXzxmZWF0dXJlIG5hbWU+IGZvcm0KKy8vIChlLmcuIENBVENIX0NPTkZJR19DUFAxMV9OT19OVUxMUFRSKSB3aGljaCBkaXNhYmxlcyB0aGUgZmVhdHVyZS4KKy8vIE1hbnkgZmVhdHVyZXMsIGF0IHBvaW50IG9mIGRldGVjdGlvbiwgZGVmaW5lIGFuIF9JTlRFUk5BTF8gbWFjcm8sIHNvIHRoZXkKKy8vIGNhbiBiZSBjb21iaW5lZCwgZW4tbWFzcywgd2l0aCB0aGUgX05PXyBmb3JtcyBsYXRlci4KKworLy8gQWxsIHRoZSBDKysxMSBmZWF0dXJlcyBjYW4gYmUgZGlzYWJsZWQgd2l0aCBDQVRDSF9DT05GSUdfTk9fQ1BQMTEKKworI2lmZGVmIF9fY3BsdXNwbHVzCisKKyMgIGlmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyMgICAgZGVmaW5lIENBVENIX0NQUDExX09SX0dSRUFURVIKKyMgIGVuZGlmCisKKyMgIGlmIF9fY3BsdXNwbHVzID49IDIwMTQwMkwKKyMgICAgZGVmaW5lIENBVENIX0NQUDE0X09SX0dSRUFURVIKKyMgIGVuZGlmCisKKyNlbmRpZgorCisjaWZkZWYgX19jbGFuZ19fCisKKyMgIGlmIF9faGFzX2ZlYXR1cmUoY3h4X251bGxwdHIpCisjICAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTlVMTFBUUgorIyAgZW5kaWYKKworIyAgaWYgX19oYXNfZmVhdHVyZShjeHhfbm9leGNlcHQpCisjICAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTk9FWENFUFQKKyMgIGVuZGlmCisKKyMgICBpZiBkZWZpbmVkKENBVENIX0NQUDExX09SX0dSRUFURVIpCisjICAgICAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19FVERfV0FSTklOR1MgXAorICAgICAgICAgICAgX1ByYWdtYSggImNsYW5nIGRpYWdub3N0aWMgcHVzaCIgKSBcCisgICAgICAgICAgICBfUHJhZ21hKCAiY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkIFwiLVdleGl0LXRpbWUtZGVzdHJ1Y3RvcnNcIiIgKQorIyAgICAgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfVU5TVVBQUkVTU19FVERfV0FSTklOR1MgXAorICAgICAgICAgICAgX1ByYWdtYSggImNsYW5nIGRpYWdub3N0aWMgcG9wIiApCisKKyMgICAgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX1BBUkVOVEhFU0VTX1dBUk5JTkdTIFwKKyAgICAgICAgICAgIF9QcmFnbWEoICJjbGFuZyBkaWFnbm9zdGljIHB1c2giICkgXAorICAgICAgICAgICAgX1ByYWdtYSggImNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCBcIi1XcGFyZW50aGVzZXNcIiIgKQorIyAgICAgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfVU5TVVBQUkVTU19QQVJFTlRIRVNFU19XQVJOSU5HUyBcCisgICAgICAgICAgICBfUHJhZ21hKCAiY2xhbmcgZGlhZ25vc3RpYyBwb3AiICkKKyMgICBlbmRpZgorCisjZW5kaWYgLy8gX19jbGFuZ19fCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBXZSBrbm93IHNvbWUgZW52aXJvbm1lbnRzIG5vdCB0byBzdXBwb3J0IGZ1bGwgUE9TSVggc2lnbmFscworI2lmIGRlZmluZWQoX19DWUdXSU5fXykgfHwgZGVmaW5lZChfX1FOWF9fKQorCisjICAgaWYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX1BPU0lYX1NJR05BTFMpCisjICAgICAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfTk9fUE9TSVhfU0lHTkFMUworIyAgIGVuZGlmCisKKyNlbmRpZgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ3lnd2luCisjaWZkZWYgX19DWUdXSU5fXworCisvLyBSZXF1aXJlZCBmb3Igc29tZSB2ZXJzaW9ucyBvZiBDeWd3aW4gdG8gZGVjbGFyZSBnZXR0aW1lb2ZkYXkKKy8vIHNlZTogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zNjkwMTgwMy9nZXR0aW1lb2ZkYXktbm90LWRlY2xhcmVkLWluLXRoaXMtc2NvcGUtY3lnd2luCisjICAgZGVmaW5lIF9CU0RfU09VUkNFCisKKyNlbmRpZiAvLyBfX0NZR1dJTl9fCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBCb3JsYW5kCisjaWZkZWYgX19CT1JMQU5EQ19fCisKKyNlbmRpZiAvLyBfX0JPUkxBTkRDX18KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEVERworI2lmZGVmIF9fRURHX1ZFUlNJT05fXworCisjZW5kaWYgLy8gX19FREdfVkVSU0lPTl9fCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBEaWdpdGFsIE1hcnMKKyNpZmRlZiBfX0RNQ19fCisKKyNlbmRpZiAvLyBfX0RNQ19fCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBHQ0MKKyNpZmRlZiBfX0dOVUNfXworCisjICAgaWYgX19HTlVDX18gPT0gNCAmJiBfX0dOVUNfTUlOT1JfXyA+PSA2ICYmIGRlZmluZWQoX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18pCisjICAgICAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTlVMTFBUUgorIyAgIGVuZGlmCisKKy8vIC0gb3RoZXJ3aXNlIG1vcmUgcmVjZW50IHZlcnNpb25zIGRlZmluZSBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisvLyBhbmQgd2lsbCBnZXQgcGlja2VkIHVwIGJlbG93CisKKyNlbmRpZiAvLyBfX0dOVUNfXworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVmlzdWFsIEMrKworI2lmZGVmIF9NU0NfVkVSCisKKyNkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX1dJTkRPV1NfU0VICisKKyNpZiAoX01TQ19WRVIgPj0gMTYwMCkKKyMgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX05VTExQVFIKKyMgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX1VOSVFVRV9QVFIKKyNlbmRpZgorCisjaWYgKF9NU0NfVkVSID49IDE5MDAgKSAvLyAoVkMrKyAxMyAoVlMyMDE1KSkKKyNkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX05PRVhDRVBUCisjZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUworI2RlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfU0hVRkZMRQorI2RlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfVFlQRV9UUkFJVFMKKyNlbmRpZgorCisjZW5kaWYgLy8gX01TQ19WRVIKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8gVXNlIHZhcmlhZGljIG1hY3JvcyBpZiB0aGUgY29tcGlsZXIgc3VwcG9ydHMgdGhlbQorI2lmICggZGVmaW5lZCBfTVNDX1ZFUiAmJiBfTVNDX1ZFUiA+IDE0MDAgJiYgIWRlZmluZWQgX19FREdFX18pIHx8IFwKKyAgICAoIGRlZmluZWQgX19XQVZFX18gJiYgX19XQVZFX0hBU19WQVJJQURJQ1MgKSB8fCBcCisgICAgKCBkZWZpbmVkIF9fR05VQ19fICYmIF9fR05VQ19fID49IDMgKSB8fCBcCisgICAgKCAhZGVmaW5lZCBfX2NwbHVzcGx1cyAmJiBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwgfHwgX19jcGx1c3BsdXMgPj0gMjAxMTAzTCApCisKKyNkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX1ZBUklBRElDX01BQ1JPUworCisjZW5kaWYKKworLy8gVXNlIF9fQ09VTlRFUl9fIGlmIHRoZSBjb21waWxlciBzdXBwb3J0cyBpdAorI2lmICggZGVmaW5lZCBfTVNDX1ZFUiAmJiBfTVNDX1ZFUiA+PSAxMzAwICkgfHwgXAorICAgICggZGVmaW5lZCBfX0dOVUNfXyAgJiYgX19HTlVDX18gPj0gNCAmJiBfX0dOVUNfTUlOT1JfXyA+PSAzICkgfHwgXAorICAgICggZGVmaW5lZCBfX2NsYW5nX18gJiYgX19jbGFuZ19tYWpvcl9fID49IDMgKQorCisjZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DT1VOVEVSCisKKyNlbmRpZgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQysrIGxhbmd1YWdlIGZlYXR1cmUgc3VwcG9ydAorCisvLyBjYXRjaCBhbGwgc3VwcG9ydCBmb3IgQysrMTEKKyNpZiBkZWZpbmVkKENBVENIX0NQUDExX09SX0dSRUFURVIpCisKKyMgIGlmICFkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OVUxMUFRSKQorIyAgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX05VTExQVFIKKyMgIGVuZGlmCisKKyMgIGlmbmRlZiBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTk9FWENFUFQKKyMgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OT0VYQ0VQVAorIyAgZW5kaWYKKworIyAgaWZuZGVmIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUworIyAgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTCisjICBlbmRpZgorCisjICBpZm5kZWYgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX0lTX0VOVU0KKyMgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9JU19FTlVNCisjICBlbmRpZgorCisjICBpZm5kZWYgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX1RVUExFCisjICAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfVFVQTEUKKyMgIGVuZGlmCisKKyMgIGlmbmRlZiBDQVRDSF9JTlRFUk5BTF9DT05GSUdfVkFSSUFESUNfTUFDUk9TCisjICAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfVkFSSUFESUNfTUFDUk9TCisjICBlbmRpZgorCisjICBpZiAhZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTE9OR19MT05HKQorIyAgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX0xPTkdfTE9ORworIyAgZW5kaWYKKworIyAgaWYgIWRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX09WRVJSSURFKQorIyAgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX09WRVJSSURFCisjICBlbmRpZgorIyAgaWYgIWRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX1VOSVFVRV9QVFIpCisjICAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfVU5JUVVFX1BUUgorIyAgZW5kaWYKKyMgaWYgIWRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX1NIVUZGTEUpCisjICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9TSFVGRkxFCisjICBlbmRpZgorIyBpZiAhZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfVFlQRV9UUkFJVFMpCisjICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX1RZUEVfVFJBSVRTCisjIGVuZGlmCisKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisKKy8vIE5vdyBzZXQgdGhlIGFjdHVhbCBkZWZpbmVzIGJhc2VkIG9uIHRoZSBhYm92ZSArIGFueXRoaW5nIHRoZSB1c2VyIGhhcyBjb25maWd1cmVkCisjaWYgZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTlVMTFBUUikgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX05PX05VTExQVFIpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9OVUxMUFRSKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfTk9fQ1BQMTEpCisjICAgZGVmaW5lIENBVENIX0NPTkZJR19DUFAxMV9OVUxMUFRSCisjZW5kaWYKKyNpZiBkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OT0VYQ0VQVCkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX05PX05PRVhDRVBUKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfTk9FWENFUFQpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19OT19DUFAxMSkKKyMgICBkZWZpbmUgQ0FUQ0hfQ09ORklHX0NQUDExX05PRVhDRVBUCisjZW5kaWYKKyNpZiBkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUykgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX05PX0dFTkVSQVRFRF9NRVRIT0RTKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19OT19DUFAxMSkKKyMgICBkZWZpbmUgQ0FUQ0hfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTCisjZW5kaWYKKyNpZiBkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9JU19FTlVNKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfTk9fSVNfRU5VTSkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX0lTX0VOVU0pICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19OT19DUFAxMSkKKyMgICBkZWZpbmUgQ0FUQ0hfQ09ORklHX0NQUDExX0lTX0VOVU0KKyNlbmRpZgorI2lmIGRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX1RVUExFKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfTk9fVFVQTEUpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9UVVBMRSkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX05PX0NQUDExKQorIyAgIGRlZmluZSBDQVRDSF9DT05GSUdfQ1BQMTFfVFVQTEUKKyNlbmRpZgorI2lmIGRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX1ZBUklBRElDX01BQ1JPUykgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX05PX1ZBUklBRElDX01BQ1JPUykgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX1ZBUklBRElDX01BQ1JPUykKKyMgICBkZWZpbmUgQ0FUQ0hfQ09ORklHX1ZBUklBRElDX01BQ1JPUworI2VuZGlmCisjaWYgZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTE9OR19MT05HKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfTk9fTE9OR19MT05HKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfTE9OR19MT05HKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfTk9fQ1BQMTEpCisjICAgZGVmaW5lIENBVENIX0NPTkZJR19DUFAxMV9MT05HX0xPTkcKKyNlbmRpZgorI2lmIGRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX09WRVJSSURFKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfTk9fT1ZFUlJJREUpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9PVkVSUklERSkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX05PX0NQUDExKQorIyAgIGRlZmluZSBDQVRDSF9DT05GSUdfQ1BQMTFfT1ZFUlJJREUKKyNlbmRpZgorI2lmIGRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX1VOSVFVRV9QVFIpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9OT19VTklRVUVfUFRSKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfVU5JUVVFX1BUUikgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX05PX0NQUDExKQorIyAgIGRlZmluZSBDQVRDSF9DT05GSUdfQ1BQMTFfVU5JUVVFX1BUUgorI2VuZGlmCisvLyBVc2Ugb2YgX19DT1VOVEVSX18gaXMgc3VwcHJlc3NlZCBpZiBfX0pFVEJSQUlOU19JREVfXyBpcyAjZGVmaW5lZCAobWVhbmluZyB3ZSdyZSBiZWluZyBwYXJzZWQgYnkgYSBKZXRCcmFpbnMgSURFIGZvcgorLy8gYW5hbHl0aWNzKSBiZWNhdXNlLCBhdCB0aW1lIG9mIHdyaXRpbmcsIF9fQ09VTlRFUl9fIGlzIG5vdCBwcm9wZXJseSBoYW5kbGVkIGJ5IGl0LgorLy8gVGhpcyBkb2VzIG5vdCBhZmZlY3QgY29tcGlsYXRpb24KKyNpZiBkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19DT1VOVEVSKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfTk9fQ09VTlRFUikgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NPVU5URVIpICYmICFkZWZpbmVkKF9fSkVUQlJBSU5TX0lERV9fKQorIyAgIGRlZmluZSBDQVRDSF9DT05GSUdfQ09VTlRFUgorI2VuZGlmCisjaWYgZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfU0hVRkZMRSkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX05PX1NIVUZGTEUpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9TSFVGRkxFKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfTk9fQ1BQMTEpCisjICAgZGVmaW5lIENBVENIX0NPTkZJR19DUFAxMV9TSFVGRkxFCisjZW5kaWYKKyMgaWYgZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfVFlQRV9UUkFJVFMpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9OT19UWVBFX1RSQUlUUykgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX1RZUEVfVFJBSVRTKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfTk9fQ1BQMTEpCisjICBkZWZpbmUgQ0FUQ0hfQ09ORklHX0NQUDExX1RZUEVfVFJBSVRTCisjIGVuZGlmCisjaWYgZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfV0lORE9XU19TRUgpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19OT19XSU5ET1dTX1NFSCkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX1dJTkRPV1NfU0VIKQorIyAgIGRlZmluZSBDQVRDSF9DT05GSUdfV0lORE9XU19TRUgKKyNlbmRpZgorLy8gVGhpcyBpcyBzZXQgYnkgZGVmYXVsdCwgYmVjYXVzZSB3ZSBhc3N1bWUgdGhhdCB1bml4IGNvbXBpbGVycyBhcmUgcG9zaXgtc2lnbmFsLWNvbXBhdGlibGUgYnkgZGVmYXVsdC4KKyNpZiAhZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfTk9fUE9TSVhfU0lHTkFMUykgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX05PX1BPU0lYX1NJR05BTFMpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19QT1NJWF9TSUdOQUxTKQorIyAgIGRlZmluZSBDQVRDSF9DT05GSUdfUE9TSVhfU0lHTkFMUworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19QQVJFTlRIRVNFU19XQVJOSU5HUykKKyMgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfUEFSRU5USEVTRVNfV0FSTklOR1MKKyMgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfVU5TVVBQUkVTU19QQVJFTlRIRVNFU19XQVJOSU5HUworI2VuZGlmCisjaWYgIWRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfRVREX1dBUk5JTkdTKQorIyAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19FVERfV0FSTklOR1MKKyMgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfVU5TVVBQUkVTU19FVERfV0FSTklOR1MKKyNlbmRpZgorCisvLyBub2V4Y2VwdCBzdXBwb3J0OgorI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX05PRVhDRVBUKSAmJiAhZGVmaW5lZChDQVRDSF9OT0VYQ0VQVCkKKyMgIGRlZmluZSBDQVRDSF9OT0VYQ0VQVCBub2V4Y2VwdAorIyAgZGVmaW5lIENBVENIX05PRVhDRVBUX0lTKHgpIG5vZXhjZXB0KHgpCisjZWxzZQorIyAgZGVmaW5lIENBVENIX05PRVhDRVBUIHRocm93KCkKKyMgIGRlZmluZSBDQVRDSF9OT0VYQ0VQVF9JUyh4KQorI2VuZGlmCisKKy8vIG51bGxwdHIgc3VwcG9ydAorI2lmZGVmIENBVENIX0NPTkZJR19DUFAxMV9OVUxMUFRSCisjICAgZGVmaW5lIENBVENIX05VTEwgbnVsbHB0cgorI2Vsc2UKKyMgICBkZWZpbmUgQ0FUQ0hfTlVMTCBOVUxMCisjZW5kaWYKKworLy8gb3ZlcnJpZGUgc3VwcG9ydAorI2lmZGVmIENBVENIX0NPTkZJR19DUFAxMV9PVkVSUklERQorIyAgIGRlZmluZSBDQVRDSF9PVkVSUklERSBvdmVycmlkZQorI2Vsc2UKKyMgICBkZWZpbmUgQ0FUQ0hfT1ZFUlJJREUKKyNlbmRpZgorCisvLyB1bmlxdWVfcHRyIHN1cHBvcnQKKyNpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfVU5JUVVFX1BUUgorIyAgIGRlZmluZSBDQVRDSF9BVVRPX1BUUiggVCApIHN0ZDo6dW5pcXVlX3B0cjxUPgorI2Vsc2UKKyMgICBkZWZpbmUgQ0FUQ0hfQVVUT19QVFIoIFQgKSBzdGQ6OmF1dG9fcHRyPFQ+CisjZW5kaWYKKworI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRV9MSU5FMiggbmFtZSwgbGluZSApIG5hbWUjI2xpbmUKKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUVfTElORSggbmFtZSwgbGluZSApIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FX0xJTkUyKCBuYW1lLCBsaW5lICkKKyNpZmRlZiBDQVRDSF9DT05GSUdfQ09VTlRFUgorIyAgZGVmaW5lIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBuYW1lICkgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUVfTElORSggbmFtZSwgX19DT1VOVEVSX18gKQorI2Vsc2UKKyMgIGRlZmluZSBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggbmFtZSApIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FX0xJTkUoIG5hbWUsIF9fTElORV9fICkKKyNlbmRpZgorCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX1NUUklOR0lGWTIoIGV4cHIgKSAjZXhwcgorI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9TVFJJTkdJRlkoIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9TVFJJTkdJRlkyKCBleHByICkKKworI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IElDb25maWc7CisKKyAgICBzdHJ1Y3QgQ2FzZVNlbnNpdGl2ZSB7IGVudW0gQ2hvaWNlIHsKKyAgICAgICAgWWVzLAorICAgICAgICBObworICAgIH07IH07CisKKyAgICBjbGFzcyBOb25Db3B5YWJsZSB7CisjaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTCisgICAgICAgIE5vbkNvcHlhYmxlKCBOb25Db3B5YWJsZSBjb25zdCYgKSAgICAgICAgICAgICAgPSBkZWxldGU7CisgICAgICAgIE5vbkNvcHlhYmxlKCBOb25Db3B5YWJsZSAmJiApICAgICAgICAgICAgICAgICAgPSBkZWxldGU7CisgICAgICAgIE5vbkNvcHlhYmxlJiBvcGVyYXRvciA9ICggTm9uQ29weWFibGUgY29uc3QmICkgPSBkZWxldGU7CisgICAgICAgIE5vbkNvcHlhYmxlJiBvcGVyYXRvciA9ICggTm9uQ29weWFibGUgJiYgKSAgICAgPSBkZWxldGU7CisjZWxzZQorICAgICAgICBOb25Db3B5YWJsZSggTm9uQ29weWFibGUgY29uc3QmIGluZm8gKTsKKyAgICAgICAgTm9uQ29weWFibGUmIG9wZXJhdG9yID0gKCBOb25Db3B5YWJsZSBjb25zdCYgKTsKKyNlbmRpZgorCisgICAgcHJvdGVjdGVkOgorICAgICAgICBOb25Db3B5YWJsZSgpIHt9CisgICAgICAgIHZpcnR1YWwgfk5vbkNvcHlhYmxlKCk7CisgICAgfTsKKworICAgIGNsYXNzIFNhZmVCb29sIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHR5cGVkZWYgdm9pZCAoU2FmZUJvb2w6Oip0eXBlKSgpIGNvbnN0OworCisgICAgICAgIHN0YXRpYyB0eXBlIG1ha2VTYWZlKCBib29sIHZhbHVlICkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlID8gJlNhZmVCb29sOjp0cnVlVmFsdWUgOiAwOworICAgICAgICB9CisgICAgcHJpdmF0ZToKKyAgICAgICAgdm9pZCB0cnVlVmFsdWUoKSBjb25zdCB7fQorICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDb250YWluZXJUPgorICAgIGlubGluZSB2b2lkIGRlbGV0ZUFsbCggQ29udGFpbmVyVCYgY29udGFpbmVyICkgeworICAgICAgICB0eXBlbmFtZSBDb250YWluZXJUOjpjb25zdF9pdGVyYXRvciBpdCA9IGNvbnRhaW5lci5iZWdpbigpOworICAgICAgICB0eXBlbmFtZSBDb250YWluZXJUOjpjb25zdF9pdGVyYXRvciBpdEVuZCA9IGNvbnRhaW5lci5lbmQoKTsKKyAgICAgICAgZm9yKDsgaXQgIT0gaXRFbmQ7ICsraXQgKQorICAgICAgICAgICAgZGVsZXRlICppdDsKKyAgICB9CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQXNzb2NpYXRpdmVDb250YWluZXJUPgorICAgIGlubGluZSB2b2lkIGRlbGV0ZUFsbFZhbHVlcyggQXNzb2NpYXRpdmVDb250YWluZXJUJiBjb250YWluZXIgKSB7CisgICAgICAgIHR5cGVuYW1lIEFzc29jaWF0aXZlQ29udGFpbmVyVDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBjb250YWluZXIuYmVnaW4oKTsKKyAgICAgICAgdHlwZW5hbWUgQXNzb2NpYXRpdmVDb250YWluZXJUOjpjb25zdF9pdGVyYXRvciBpdEVuZCA9IGNvbnRhaW5lci5lbmQoKTsKKyAgICAgICAgZm9yKDsgaXQgIT0gaXRFbmQ7ICsraXQgKQorICAgICAgICAgICAgZGVsZXRlIGl0LT5zZWNvbmQ7CisgICAgfQorCisgICAgYm9vbCBzdGFydHNXaXRoKCBzdGQ6OnN0cmluZyBjb25zdCYgcywgc3RkOjpzdHJpbmcgY29uc3QmIHByZWZpeCApOworICAgIGJvb2wgc3RhcnRzV2l0aCggc3RkOjpzdHJpbmcgY29uc3QmIHMsIGNoYXIgcHJlZml4ICk7CisgICAgYm9vbCBlbmRzV2l0aCggc3RkOjpzdHJpbmcgY29uc3QmIHMsIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdWZmaXggKTsKKyAgICBib29sIGVuZHNXaXRoKCBzdGQ6OnN0cmluZyBjb25zdCYgcywgY2hhciBzdWZmaXggKTsKKyAgICBib29sIGNvbnRhaW5zKCBzdGQ6OnN0cmluZyBjb25zdCYgcywgc3RkOjpzdHJpbmcgY29uc3QmIGluZml4ICk7CisgICAgdm9pZCB0b0xvd2VySW5QbGFjZSggc3RkOjpzdHJpbmcmIHMgKTsKKyAgICBzdGQ6OnN0cmluZyB0b0xvd2VyKCBzdGQ6OnN0cmluZyBjb25zdCYgcyApOworICAgIHN0ZDo6c3RyaW5nIHRyaW0oIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIgKTsKKyAgICBib29sIHJlcGxhY2VJblBsYWNlKCBzdGQ6OnN0cmluZyYgc3RyLCBzdGQ6OnN0cmluZyBjb25zdCYgcmVwbGFjZVRoaXMsIHN0ZDo6c3RyaW5nIGNvbnN0JiB3aXRoVGhpcyApOworCisgICAgc3RydWN0IHBsdXJhbGlzZSB7CisgICAgICAgIHBsdXJhbGlzZSggc3RkOjpzaXplX3QgY291bnQsIHN0ZDo6c3RyaW5nIGNvbnN0JiBsYWJlbCApOworCisgICAgICAgIGZyaWVuZCBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yIDw8ICggc3RkOjpvc3RyZWFtJiBvcywgcGx1cmFsaXNlIGNvbnN0JiBwbHVyYWxpc2VyICk7CisKKyAgICAgICAgc3RkOjpzaXplX3QgbV9jb3VudDsKKyAgICAgICAgc3RkOjpzdHJpbmcgbV9sYWJlbDsKKyAgICB9OworCisgICAgc3RydWN0IFNvdXJjZUxpbmVJbmZvIHsKKworICAgICAgICBTb3VyY2VMaW5lSW5mbygpOworICAgICAgICBTb3VyY2VMaW5lSW5mbyggY2hhciBjb25zdCogX2ZpbGUsIHN0ZDo6c2l6ZV90IF9saW5lICk7CisjICBpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMKKyAgICAgICAgU291cmNlTGluZUluZm8oU291cmNlTGluZUluZm8gY29uc3QmIG90aGVyKSAgICAgICAgICA9IGRlZmF1bHQ7CisgICAgICAgIFNvdXJjZUxpbmVJbmZvKCBTb3VyY2VMaW5lSW5mbyAmJiApICAgICAgICAgICAgICAgICAgPSBkZWZhdWx0OworICAgICAgICBTb3VyY2VMaW5lSW5mbyYgb3BlcmF0b3IgPSAoIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiApID0gZGVmYXVsdDsKKyAgICAgICAgU291cmNlTGluZUluZm8mIG9wZXJhdG9yID0gKCBTb3VyY2VMaW5lSW5mbyAmJiApICAgICA9IGRlZmF1bHQ7CisjICBlbmRpZgorICAgICAgICBib29sIGVtcHR5KCkgY29uc3Q7CisgICAgICAgIGJvb2wgb3BlcmF0b3IgPT0gKCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgb3RoZXIgKSBjb25zdDsKKyAgICAgICAgYm9vbCBvcGVyYXRvciA8ICggU291cmNlTGluZUluZm8gY29uc3QmIG90aGVyICkgY29uc3Q7CisKKyAgICAgICAgY2hhciBjb25zdCogZmlsZTsKKyAgICAgICAgc3RkOjpzaXplX3QgbGluZTsKKyAgICB9OworCisgICAgc3RkOjpvc3RyZWFtJiBvcGVyYXRvciA8PCAoIHN0ZDo6b3N0cmVhbSYgb3MsIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBpbmZvICk7CisKKyAgICAvLyBUaGlzIGlzIGp1c3QgaGVyZSB0byBhdm9pZCBjb21waWxlciB3YXJuaW5ncyB3aXRoIG1hY3JvIGNvbnN0YW50cyBhbmQgYm9vbGVhbiBsaXRlcmFscworICAgIGlubGluZSBib29sIGlzVHJ1ZSggYm9vbCB2YWx1ZSApeyByZXR1cm4gdmFsdWU7IH0KKyAgICBpbmxpbmUgYm9vbCBhbHdheXNUcnVlKCkgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGlubGluZSBib29sIGFsd2F5c0ZhbHNlKCkgeyByZXR1cm4gZmFsc2U7IH0KKworICAgIHZvaWQgdGhyb3dMb2dpY0Vycm9yKCBzdGQ6OnN0cmluZyBjb25zdCYgbWVzc2FnZSwgU291cmNlTGluZUluZm8gY29uc3QmIGxvY2F0aW9uSW5mbyApOworCisgICAgdm9pZCBzZWVkUm5nKCBJQ29uZmlnIGNvbnN0JiBjb25maWcgKTsKKyAgICB1bnNpZ25lZCBpbnQgcm5nU2VlZCgpOworCisgICAgLy8gVXNlIHRoaXMgaW4gdmFyaWFkaWMgc3RyZWFtaW5nIG1hY3JvcyB0byBhbGxvdworICAgIC8vICAgID4+ICtTdHJlYW1FbmRTdG9wCisgICAgLy8gYXMgd2VsbCBhcworICAgIC8vICAgID4+IHN0dWZmICtTdHJlYW1FbmRTdG9wCisgICAgc3RydWN0IFN0cmVhbUVuZFN0b3AgeworICAgICAgICBzdGQ6OnN0cmluZyBvcGVyYXRvcisoKSB7CisgICAgICAgICAgICByZXR1cm4gc3RkOjpzdHJpbmcoKTsKKyAgICAgICAgfQorICAgIH07CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBUIGNvbnN0JiBvcGVyYXRvciArICggVCBjb25zdCYgdmFsdWUsIFN0cmVhbUVuZFN0b3AgKSB7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9Cit9CisKKyNkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8gOjpDYXRjaDo6U291cmNlTGluZUluZm8oIF9fRklMRV9fLCBzdGF0aWNfY2FzdDxzdGQ6OnNpemVfdD4oIF9fTElORV9fICkgKQorI2RlZmluZSBDQVRDSF9JTlRFUk5BTF9FUlJPUiggbXNnICkgOjpDYXRjaDo6dGhyb3dMb2dpY0Vycm9yKCBtc2csIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPICk7CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBjbGFzcyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbiA6IHB1YmxpYyBzdGQ6OmV4Y2VwdGlvbgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAgIE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8gKTsKKyAgICAgICAgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oIE5vdEltcGxlbWVudGVkRXhjZXB0aW9uIGNvbnN0JiApIHt9CisKKyAgICAgICAgdmlydHVhbCB+Tm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKSBDQVRDSF9OT0VYQ0VQVCB7fQorCisgICAgICAgIHZpcnR1YWwgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IENBVENIX05PRVhDRVBUOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjpzdHJpbmcgbV93aGF0OworICAgICAgICBTb3VyY2VMaW5lSW5mbyBtX2xpbmVJbmZvOworICAgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisjZGVmaW5lIENBVENIX05PVF9JTVBMRU1FTlRFRCB0aHJvdyBDYXRjaDo6Tm90SW1wbGVtZW50ZWRFeGNlcHRpb24oIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPICkKKworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX2NvbnRleHQuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfQ09OVEVYVF9IX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9pbnRlcmZhY2VzX2dlbmVyYXRvcnMuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfSU5URVJGQUNFU19HRU5FUkFUT1JTX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBJR2VuZXJhdG9ySW5mbyB7CisgICAgICAgIHZpcnR1YWwgfklHZW5lcmF0b3JJbmZvKCk7CisgICAgICAgIHZpcnR1YWwgYm9vbCBtb3ZlTmV4dCgpID0gMDsKKyAgICAgICAgdmlydHVhbCBzdGQ6OnNpemVfdCBnZXRDdXJyZW50SW5kZXgoKSBjb25zdCA9IDA7CisgICAgfTsKKworICAgIHN0cnVjdCBJR2VuZXJhdG9yc0ZvclRlc3QgeworICAgICAgICB2aXJ0dWFsIH5JR2VuZXJhdG9yc0ZvclRlc3QoKTsKKworICAgICAgICB2aXJ0dWFsIElHZW5lcmF0b3JJbmZvJiBnZXRHZW5lcmF0b3JJbmZvKCBzdGQ6OnN0cmluZyBjb25zdCYgZmlsZUluZm8sIHN0ZDo6c2l6ZV90IHNpemUgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgYm9vbCBtb3ZlTmV4dCgpID0gMDsKKyAgICB9OworCisgICAgSUdlbmVyYXRvcnNGb3JUZXN0KiBjcmVhdGVHZW5lcmF0b3JzRm9yVGVzdCgpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3B0ci5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1BUUl9IUFBfSU5DTFVERUQKKworI2lmZGVmIF9fY2xhbmdfXworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV3BhZGRlZCIKKyNlbmRpZgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgLy8gQW4gaW50cnVzaXZlIHJlZmVyZW5jZSBjb3VudGluZyBzbWFydCBwb2ludGVyLgorICAgIC8vIFQgbXVzdCBpbXBsZW1lbnQgYWRkUmVmKCkgYW5kIHJlbGVhc2UoKSBtZXRob2RzCisgICAgLy8gdHlwaWNhbGx5IGltcGxlbWVudGluZyB0aGUgSVNoYXJlZCBpbnRlcmZhY2UKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGNsYXNzIFB0ciB7CisgICAgcHVibGljOgorICAgICAgICBQdHIoKSA6IG1fcCggQ0FUQ0hfTlVMTCApe30KKyAgICAgICAgUHRyKCBUKiBwICkgOiBtX3AoIHAgKXsKKyAgICAgICAgICAgIGlmKCBtX3AgKQorICAgICAgICAgICAgICAgIG1fcC0+YWRkUmVmKCk7CisgICAgICAgIH0KKyAgICAgICAgUHRyKCBQdHIgY29uc3QmIG90aGVyICkgOiBtX3AoIG90aGVyLm1fcCApeworICAgICAgICAgICAgaWYoIG1fcCApCisgICAgICAgICAgICAgICAgbV9wLT5hZGRSZWYoKTsKKyAgICAgICAgfQorICAgICAgICB+UHRyKCl7CisgICAgICAgICAgICBpZiggbV9wICkKKyAgICAgICAgICAgICAgICBtX3AtPnJlbGVhc2UoKTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHJlc2V0KCkgeworICAgICAgICAgICAgaWYoIG1fcCApCisgICAgICAgICAgICAgICAgbV9wLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBtX3AgPSBDQVRDSF9OVUxMOworICAgICAgICB9CisgICAgICAgIFB0ciYgb3BlcmF0b3IgPSAoIFQqIHAgKXsKKyAgICAgICAgICAgIFB0ciB0ZW1wKCBwICk7CisgICAgICAgICAgICBzd2FwKCB0ZW1wICk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKyAgICAgICAgUHRyJiBvcGVyYXRvciA9ICggUHRyIGNvbnN0JiBvdGhlciApeworICAgICAgICAgICAgUHRyIHRlbXAoIG90aGVyICk7CisgICAgICAgICAgICBzd2FwKCB0ZW1wICk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBzd2FwKCBQdHImIG90aGVyICkgeyBzdGQ6OnN3YXAoIG1fcCwgb3RoZXIubV9wICk7IH0KKyAgICAgICAgVCogZ2V0KCkgY29uc3R7IHJldHVybiBtX3A7IH0KKyAgICAgICAgVCYgb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gKm1fcDsgfQorICAgICAgICBUKiBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gbV9wOyB9CisgICAgICAgIGJvb2wgb3BlcmF0b3IgISgpIGNvbnN0IHsgcmV0dXJuIG1fcCA9PSBDQVRDSF9OVUxMOyB9CisgICAgICAgIG9wZXJhdG9yIFNhZmVCb29sOjp0eXBlKCkgY29uc3QgeyByZXR1cm4gU2FmZUJvb2w6Om1ha2VTYWZlKCBtX3AgIT0gQ0FUQ0hfTlVMTCApOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBUKiBtX3A7CisgICAgfTsKKworICAgIHN0cnVjdCBJU2hhcmVkIDogTm9uQ29weWFibGUgeworICAgICAgICB2aXJ0dWFsIH5JU2hhcmVkKCk7CisgICAgICAgIHZpcnR1YWwgdm9pZCBhZGRSZWYoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlKCkgY29uc3QgPSAwOworICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUID0gSVNoYXJlZD4KKyAgICBzdHJ1Y3QgU2hhcmVkSW1wbCA6IFQgeworCisgICAgICAgIFNoYXJlZEltcGwoKSA6IG1fcmMoIDAgKXt9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGFkZFJlZigpIGNvbnN0IHsKKyAgICAgICAgICAgICsrbV9yYzsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZSgpIGNvbnN0IHsKKyAgICAgICAgICAgIGlmKCAtLW1fcmMgPT0gMCApCisgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBtdXRhYmxlIHVuc2lnbmVkIGludCBtX3JjOworICAgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisjaWZkZWYgX19jbGFuZ19fCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCisjZW5kaWYKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGNsYXNzIFRlc3RDYXNlOworICAgIGNsYXNzIFN0cmVhbTsKKyAgICBzdHJ1Y3QgSVJlc3VsdENhcHR1cmU7CisgICAgc3RydWN0IElSdW5uZXI7CisgICAgc3RydWN0IElHZW5lcmF0b3JzRm9yVGVzdDsKKyAgICBzdHJ1Y3QgSUNvbmZpZzsKKworICAgIHN0cnVjdCBJQ29udGV4dAorICAgIHsKKyAgICAgICAgdmlydHVhbCB+SUNvbnRleHQoKTsKKworICAgICAgICB2aXJ0dWFsIElSZXN1bHRDYXB0dXJlKiBnZXRSZXN1bHRDYXB0dXJlKCkgPSAwOworICAgICAgICB2aXJ0dWFsIElSdW5uZXIqIGdldFJ1bm5lcigpID0gMDsKKyAgICAgICAgdmlydHVhbCBzaXplX3QgZ2V0R2VuZXJhdG9ySW5kZXgoIHN0ZDo6c3RyaW5nIGNvbnN0JiBmaWxlSW5mbywgc2l6ZV90IHRvdGFsU2l6ZSApID0gMDsKKyAgICAgICAgdmlydHVhbCBib29sIGFkdmFuY2VHZW5lcmF0b3JzRm9yQ3VycmVudFRlc3QoKSA9IDA7CisgICAgICAgIHZpcnR1YWwgUHRyPElDb25maWcgY29uc3Q+IGdldENvbmZpZygpIGNvbnN0ID0gMDsKKyAgICB9OworCisgICAgc3RydWN0IElNdXRhYmxlQ29udGV4dCA6IElDb250ZXh0CisgICAgeworICAgICAgICB2aXJ0dWFsIH5JTXV0YWJsZUNvbnRleHQoKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHNldFJlc3VsdENhcHR1cmUoIElSZXN1bHRDYXB0dXJlKiByZXN1bHRDYXB0dXJlICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0UnVubmVyKCBJUnVubmVyKiBydW5uZXIgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZXRDb25maWcoIFB0cjxJQ29uZmlnIGNvbnN0PiBjb25zdCYgY29uZmlnICkgPSAwOworICAgIH07CisKKyAgICBJQ29udGV4dCYgZ2V0Q3VycmVudENvbnRleHQoKTsKKyAgICBJTXV0YWJsZUNvbnRleHQmIGdldEN1cnJlbnRNdXRhYmxlQ29udGV4dCgpOworICAgIHZvaWQgY2xlYW5VcENvbnRleHQoKTsKKyAgICBTdHJlYW0gY3JlYXRlU3RyZWFtKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyZWFtTmFtZSApOworCit9CisKKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF90ZXN0X3JlZ2lzdHJ5LmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfVEVTVF9SRUdJU1RSWV9IUFBfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2ludGVyZmFjZXNfdGVzdGNhc2UuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfSU5URVJGQUNFU19URVNUQ0FTRV9IX0lOQ0xVREVECisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBjbGFzcyBUZXN0U3BlYzsKKworICAgIHN0cnVjdCBJVGVzdENhc2UgOiBJU2hhcmVkIHsKKyAgICAgICAgdmlydHVhbCB2b2lkIGludm9rZSAoKSBjb25zdCA9IDA7CisgICAgcHJvdGVjdGVkOgorICAgICAgICB2aXJ0dWFsIH5JVGVzdENhc2UoKTsKKyAgICB9OworCisgICAgY2xhc3MgVGVzdENhc2U7CisgICAgc3RydWN0IElDb25maWc7CisKKyAgICBzdHJ1Y3QgSVRlc3RDYXNlUmVnaXN0cnkgeworICAgICAgICB2aXJ0dWFsIH5JVGVzdENhc2VSZWdpc3RyeSgpOworICAgICAgICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBjb25zdCYgZ2V0QWxsVGVzdHMoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IGNvbnN0JiBnZXRBbGxUZXN0c1NvcnRlZCggSUNvbmZpZyBjb25zdCYgY29uZmlnICkgY29uc3QgPSAwOworICAgIH07CisKKyAgICBib29sIG1hdGNoVGVzdCggVGVzdENhc2UgY29uc3QmIHRlc3RDYXNlLCBUZXN0U3BlYyBjb25zdCYgdGVzdFNwZWMsIElDb25maWcgY29uc3QmIGNvbmZpZyApOworICAgIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBmaWx0ZXJUZXN0cyggc3RkOjp2ZWN0b3I8VGVzdENhc2U+IGNvbnN0JiB0ZXN0Q2FzZXMsIFRlc3RTcGVjIGNvbnN0JiB0ZXN0U3BlYywgSUNvbmZpZyBjb25zdCYgY29uZmlnICk7CisgICAgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IGNvbnN0JiBnZXRBbGxUZXN0Q2FzZXNTb3J0ZWQoIElDb25maWcgY29uc3QmIGNvbmZpZyApOworCit9CisKK25hbWVzcGFjZSBDYXRjaCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIEM+CitjbGFzcyBNZXRob2RUZXN0Q2FzZSA6IHB1YmxpYyBTaGFyZWRJbXBsPElUZXN0Q2FzZT4geworCitwdWJsaWM6CisgICAgTWV0aG9kVGVzdENhc2UoIHZvaWQgKEM6OiptZXRob2QpKCkgKSA6IG1fbWV0aG9kKCBtZXRob2QgKSB7fQorCisgICAgdmlydHVhbCB2b2lkIGludm9rZSgpIGNvbnN0IHsKKyAgICAgICAgQyBvYmo7CisgICAgICAgIChvYmouKm1fbWV0aG9kKSgpOworICAgIH0KKworcHJpdmF0ZToKKyAgICB2aXJ0dWFsIH5NZXRob2RUZXN0Q2FzZSgpIHt9CisKKyAgICB2b2lkIChDOjoqbV9tZXRob2QpKCk7Cit9OworCit0eXBlZGVmIHZvaWQoKlRlc3RGdW5jdGlvbikoKTsKKworc3RydWN0IE5hbWVBbmREZXNjIHsKKyAgICBOYW1lQW5kRGVzYyggY29uc3QgY2hhciogX25hbWUgPSAiIiwgY29uc3QgY2hhciogX2Rlc2NyaXB0aW9uPSAiIiApCisgICAgOiBuYW1lKCBfbmFtZSApLCBkZXNjcmlwdGlvbiggX2Rlc2NyaXB0aW9uICkKKyAgICB7fQorCisgICAgY29uc3QgY2hhciogbmFtZTsKKyAgICBjb25zdCBjaGFyKiBkZXNjcmlwdGlvbjsKK307CisKK3ZvaWQgcmVnaXN0ZXJUZXN0Q2FzZQorICAgICggICBJVGVzdENhc2UqIHRlc3RDYXNlLAorICAgICAgICBjaGFyIGNvbnN0KiBjbGFzc05hbWUsCisgICAgICAgIE5hbWVBbmREZXNjIGNvbnN0JiBuYW1lQW5kRGVzYywKKyAgICAgICAgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvICk7CisKK3N0cnVjdCBBdXRvUmVnIHsKKworICAgIEF1dG9SZWcKKyAgICAgICAgKCAgIFRlc3RGdW5jdGlvbiBmdW5jdGlvbiwKKyAgICAgICAgICAgIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBsaW5lSW5mbywKKyAgICAgICAgICAgIE5hbWVBbmREZXNjIGNvbnN0JiBuYW1lQW5kRGVzYyApOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQz4KKyAgICBBdXRvUmVnCisgICAgICAgICggICB2b2lkIChDOjoqbWV0aG9kKSgpLAorICAgICAgICAgICAgY2hhciBjb25zdCogY2xhc3NOYW1lLAorICAgICAgICAgICAgTmFtZUFuZERlc2MgY29uc3QmIG5hbWVBbmREZXNjLAorICAgICAgICAgICAgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvICkgeworCisgICAgICAgIHJlZ2lzdGVyVGVzdENhc2UKKyAgICAgICAgICAgICggICBuZXcgTWV0aG9kVGVzdENhc2U8Qz4oIG1ldGhvZCApLAorICAgICAgICAgICAgICAgIGNsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICBuYW1lQW5kRGVzYywKKyAgICAgICAgICAgICAgICBsaW5lSW5mbyApOworICAgIH0KKworICAgIH5BdXRvUmVnKCk7CisKK3ByaXZhdGU6CisgICAgQXV0b1JlZyggQXV0b1JlZyBjb25zdCYgKTsKKyAgICB2b2lkIG9wZXJhdG9yPSAoIEF1dG9SZWcgY29uc3QmICk7Cit9OworCit2b2lkIHJlZ2lzdGVyVGVzdENhc2VGdW5jdGlvbgorICAgICggICBUZXN0RnVuY3Rpb24gZnVuY3Rpb24sCisgICAgICAgIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBsaW5lSW5mbywKKyAgICAgICAgTmFtZUFuZERlc2MgY29uc3QmIG5hbWVBbmREZXNjICk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisjaWZkZWYgQ0FUQ0hfQ09ORklHX1ZBUklBRElDX01BQ1JPUworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RFU1RDQVNFMiggVGVzdE5hbWUsIC4uLiApIFwKKyAgICAgICAgc3RhdGljIHZvaWQgVGVzdE5hbWUoKTsgXAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19FVERfV0FSTklOR1MgXAorICAgICAgICBuYW1lc3BhY2V7IENhdGNoOjpBdXRvUmVnIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBhdXRvUmVnaXN0cmFyICkoICZUZXN0TmFtZSwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8sIENhdGNoOjpOYW1lQW5kRGVzYyggX19WQV9BUkdTX18gKSApOyB9IFwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfVU5TVVBQUkVTU19FVERfV0FSTklOR1MgXAorICAgICAgICBzdGF0aWMgdm9pZCBUZXN0TmFtZSgpCisgICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9URVNUQ0FTRSggLi4uICkgXAorICAgICAgICBJTlRFUk5BTF9DQVRDSF9URVNUQ0FTRTIoIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBfX19fQ19BX1RfQ19IX19fX1RfRV9TX1RfX19fICksIF9fVkFfQVJHU19fICkKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX01FVEhPRF9BU19URVNUX0NBU0UoIFF1YWxpZmllZE1ldGhvZCwgLi4uICkgXAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19FVERfV0FSTklOR1MgXAorICAgICAgICBuYW1lc3BhY2V7IENhdGNoOjpBdXRvUmVnIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBhdXRvUmVnaXN0cmFyICkoICZRdWFsaWZpZWRNZXRob2QsICImIiAjUXVhbGlmaWVkTWV0aG9kLCBDYXRjaDo6TmFtZUFuZERlc2MoIF9fVkFfQVJHU19fICksIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPICk7IH0gXAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9VTlNVUFBSRVNTX0VURF9XQVJOSU5HUworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVEVTVF9DQVNFX01FVEhPRDIoIFRlc3ROYW1lLCBDbGFzc05hbWUsIC4uLiApXAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19FVERfV0FSTklOR1MgXAorICAgICAgICBuYW1lc3BhY2V7IFwKKyAgICAgICAgICAgIHN0cnVjdCBUZXN0TmFtZSA6IENsYXNzTmFtZXsgXAorICAgICAgICAgICAgICAgIHZvaWQgdGVzdCgpOyBcCisgICAgICAgICAgICB9OyBcCisgICAgICAgICAgICBDYXRjaDo6QXV0b1JlZyBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggYXV0b1JlZ2lzdHJhciApICggJlRlc3ROYW1lOjp0ZXN0LCAjQ2xhc3NOYW1lLCBDYXRjaDo6TmFtZUFuZERlc2MoIF9fVkFfQVJHU19fICksIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPICk7IFwKKyAgICAgICAgfSBcCisgICAgICAgIENBVENIX0lOVEVSTkFMX1VOU1VQUFJFU1NfRVREX1dBUk5JTkdTIFwKKyAgICAgICAgdm9pZCBUZXN0TmFtZTo6dGVzdCgpCisgICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9URVNUX0NBU0VfTUVUSE9EKCBDbGFzc05hbWUsIC4uLiApIFwKKyAgICAgICAgSU5URVJOQUxfQ0FUQ0hfVEVTVF9DQVNFX01FVEhPRDIoIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBfX19fQ19BX1RfQ19IX19fX1RfRV9TX1RfX19fICksIENsYXNzTmFtZSwgX19WQV9BUkdTX18gKQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfUkVHSVNURVJfVEVTVENBU0UoIEZ1bmN0aW9uLCAuLi4gKSBcCisgICAgICAgIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX0VURF9XQVJOSU5HUyBcCisgICAgICAgIENhdGNoOjpBdXRvUmVnKCBGdW5jdGlvbiwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8sIENhdGNoOjpOYW1lQW5kRGVzYyggX19WQV9BUkdTX18gKSApOyBcCisgICAgICAgIENBVENIX0lOVEVSTkFMX1VOU1VQUFJFU1NfRVREX1dBUk5JTkdTCisKKyNlbHNlCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVEVTVENBU0UyKCBUZXN0TmFtZSwgTmFtZSwgRGVzYyApIFwKKyAgICAgICAgc3RhdGljIHZvaWQgVGVzdE5hbWUoKTsgXAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19FVERfV0FSTklOR1MgXAorICAgICAgICBuYW1lc3BhY2V7IENhdGNoOjpBdXRvUmVnIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBhdXRvUmVnaXN0cmFyICkoICZUZXN0TmFtZSwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8sIENhdGNoOjpOYW1lQW5kRGVzYyggTmFtZSwgRGVzYyApICk7IH1cCisgICAgICAgIENBVENIX0lOVEVSTkFMX1VOU1VQUFJFU1NfRVREX1dBUk5JTkdTIFwKKyAgICAgICAgc3RhdGljIHZvaWQgVGVzdE5hbWUoKQorICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVEVTVENBU0UoIE5hbWUsIERlc2MgKSBcCisgICAgICAgIElOVEVSTkFMX0NBVENIX1RFU1RDQVNFMiggSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIF9fX19DX0FfVF9DX0hfX19fVF9FX1NfVF9fX18gKSwgTmFtZSwgRGVzYyApCisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9NRVRIT0RfQVNfVEVTVF9DQVNFKCBRdWFsaWZpZWRNZXRob2QsIE5hbWUsIERlc2MgKSBcCisgICAgICAgIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX0VURF9XQVJOSU5HUyBcCisgICAgICAgIG5hbWVzcGFjZXsgQ2F0Y2g6OkF1dG9SZWcgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIGF1dG9SZWdpc3RyYXIgKSggJlF1YWxpZmllZE1ldGhvZCwgIiYiICNRdWFsaWZpZWRNZXRob2QsIENhdGNoOjpOYW1lQW5kRGVzYyggTmFtZSwgRGVzYyApLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTyApOyB9IFwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfVU5TVVBQUkVTU19FVERfV0FSTklOR1MKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RFU1RfQ0FTRV9NRVRIT0QyKCBUZXN0Q2FzZU5hbWUsIENsYXNzTmFtZSwgVGVzdE5hbWUsIERlc2MgKVwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfRVREX1dBUk5JTkdTIFwKKyAgICAgICAgbmFtZXNwYWNleyBcCisgICAgICAgICAgICBzdHJ1Y3QgVGVzdENhc2VOYW1lIDogQ2xhc3NOYW1leyBcCisgICAgICAgICAgICAgICAgdm9pZCB0ZXN0KCk7IFwKKyAgICAgICAgICAgIH07IFwKKyAgICAgICAgICAgIENhdGNoOjpBdXRvUmVnIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBhdXRvUmVnaXN0cmFyICkgKCAmVGVzdENhc2VOYW1lOjp0ZXN0LCAjQ2xhc3NOYW1lLCBDYXRjaDo6TmFtZUFuZERlc2MoIFRlc3ROYW1lLCBEZXNjICksIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPICk7IFwKKyAgICAgICAgfSBcCisgICAgICAgIENBVENIX0lOVEVSTkFMX1VOU1VQUFJFU1NfRVREX1dBUk5JTkdTIFwKKyAgICAgICAgdm9pZCBUZXN0Q2FzZU5hbWU6OnRlc3QoKQorICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVEVTVF9DQVNFX01FVEhPRCggQ2xhc3NOYW1lLCBUZXN0TmFtZSwgRGVzYyApXAorICAgICAgICBJTlRFUk5BTF9DQVRDSF9URVNUX0NBU0VfTUVUSE9EMiggSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIF9fX19DX0FfVF9DX0hfX19fVF9FX1NfVF9fX18gKSwgQ2xhc3NOYW1lLCBUZXN0TmFtZSwgRGVzYyApCisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9SRUdJU1RFUl9URVNUQ0FTRSggRnVuY3Rpb24sIE5hbWUsIERlc2MgKSBcCisgICAgICAgIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX0VURF9XQVJOSU5HUyBcCisgICAgICAgIENhdGNoOjpBdXRvUmVnKCBGdW5jdGlvbiwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8sIENhdGNoOjpOYW1lQW5kRGVzYyggTmFtZSwgRGVzYyApICk7IFwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfVU5TVVBQUkVTU19FVERfV0FSTklOR1MKKworI2VuZGlmCisKKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF9jYXB0dXJlLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfQ0FQVFVSRV9IUFBfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3Jlc3VsdF9idWlsZGVyLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1JFU1VMVF9CVUlMREVSX0hfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3Jlc3VsdF90eXBlLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1JFU1VMVF9UWVBFX0hfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIC8vIFJlc3VsdFdhczo6T2ZUeXBlIGVudW0KKyAgICBzdHJ1Y3QgUmVzdWx0V2FzIHsgZW51bSBPZlR5cGUgeworICAgICAgICBVbmtub3duID0gLTEsCisgICAgICAgIE9rID0gMCwKKyAgICAgICAgSW5mbyA9IDEsCisgICAgICAgIFdhcm5pbmcgPSAyLAorCisgICAgICAgIEZhaWx1cmVCaXQgPSAweDEwLAorCisgICAgICAgIEV4cHJlc3Npb25GYWlsZWQgPSBGYWlsdXJlQml0IHwgMSwKKyAgICAgICAgRXhwbGljaXRGYWlsdXJlID0gRmFpbHVyZUJpdCB8IDIsCisKKyAgICAgICAgRXhjZXB0aW9uID0gMHgxMDAgfCBGYWlsdXJlQml0LAorCisgICAgICAgIFRocmV3RXhjZXB0aW9uID0gRXhjZXB0aW9uIHwgMSwKKyAgICAgICAgRGlkbnRUaHJvd0V4Y2VwdGlvbiA9IEV4Y2VwdGlvbiB8IDIsCisKKyAgICAgICAgRmF0YWxFcnJvckNvbmRpdGlvbiA9IDB4MjAwIHwgRmFpbHVyZUJpdAorCisgICAgfTsgfTsKKworICAgIGlubGluZSBib29sIGlzT2soIFJlc3VsdFdhczo6T2ZUeXBlIHJlc3VsdFR5cGUgKSB7CisgICAgICAgIHJldHVybiAoIHJlc3VsdFR5cGUgJiBSZXN1bHRXYXM6OkZhaWx1cmVCaXQgKSA9PSAwOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBpc0p1c3RJbmZvKCBpbnQgZmxhZ3MgKSB7CisgICAgICAgIHJldHVybiBmbGFncyA9PSBSZXN1bHRXYXM6OkluZm87CisgICAgfQorCisgICAgLy8gUmVzdWx0RGlzcG9zaXRpb246OkZsYWdzIGVudW0KKyAgICBzdHJ1Y3QgUmVzdWx0RGlzcG9zaXRpb24geyBlbnVtIEZsYWdzIHsKKyAgICAgICAgTm9ybWFsID0gMHgwMSwKKworICAgICAgICBDb250aW51ZU9uRmFpbHVyZSA9IDB4MDIsICAgLy8gRmFpbHVyZXMgZmFpbCB0ZXN0LCBidXQgZXhlY3V0aW9uIGNvbnRpbnVlcworICAgICAgICBGYWxzZVRlc3QgPSAweDA0LCAgICAgICAgICAgLy8gUHJlZml4IGV4cHJlc3Npb24gd2l0aCAhCisgICAgICAgIFN1cHByZXNzRmFpbCA9IDB4MDggICAgICAgICAvLyBGYWlsdXJlcyBhcmUgcmVwb3J0ZWQgYnV0IGRvIG5vdCBmYWlsIHRoZSB0ZXN0CisgICAgfTsgfTsKKworICAgIGlubGluZSBSZXN1bHREaXNwb3NpdGlvbjo6RmxhZ3Mgb3BlcmF0b3IgfCAoIFJlc3VsdERpc3Bvc2l0aW9uOjpGbGFncyBsaHMsIFJlc3VsdERpc3Bvc2l0aW9uOjpGbGFncyByaHMgKSB7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHREaXNwb3NpdGlvbjo6RmxhZ3M+KCBzdGF0aWNfY2FzdDxpbnQ+KCBsaHMgKSB8IHN0YXRpY19jYXN0PGludD4oIHJocyApICk7CisgICAgfQorCisgICAgaW5saW5lIGJvb2wgc2hvdWxkQ29udGludWVPbkZhaWx1cmUoIGludCBmbGFncyApICAgIHsgcmV0dXJuICggZmxhZ3MgJiBSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUgKSAhPSAwOyB9CisgICAgaW5saW5lIGJvb2wgaXNGYWxzZVRlc3QoIGludCBmbGFncyApICAgICAgICAgICAgICAgIHsgcmV0dXJuICggZmxhZ3MgJiBSZXN1bHREaXNwb3NpdGlvbjo6RmFsc2VUZXN0ICkgIT0gMDsgfQorICAgIGlubGluZSBib29sIHNob3VsZFN1cHByZXNzRmFpbHVyZSggaW50IGZsYWdzICkgICAgICB7IHJldHVybiAoIGZsYWdzICYgUmVzdWx0RGlzcG9zaXRpb246OlN1cHByZXNzRmFpbCApICE9IDA7IH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9hc3NlcnRpb25yZXN1bHQuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfQVNTRVJUSU9OUkVTVUxUX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBTVEFUSUNfQVNTRVJUX0V4cHJlc3Npb25fVG9vX0NvbXBsZXhfUGxlYXNlX1Jld3JpdGVfQXNfQmluYXJ5X0NvbXBhcmlzb247CisKKyAgICBzdHJ1Y3QgRGVjb21wb3NlZEV4cHJlc3Npb24KKyAgICB7CisgICAgICAgIHZpcnR1YWwgfkRlY29tcG9zZWRFeHByZXNzaW9uKCkge30KKyAgICAgICAgdmlydHVhbCBib29sIGlzQmluYXJ5RXhwcmVzc2lvbigpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgcmVjb25zdHJ1Y3RFeHByZXNzaW9uKCBzdGQ6OnN0cmluZyYgZGVzdCApIGNvbnN0ID0gMDsKKworICAgICAgICAvLyBPbmx5IHNpbXBsZSBiaW5hcnkgY29tcGFyaXNvbnMgY2FuIGJlIGRlY29tcG9zZWQuCisgICAgICAgIC8vIElmIG1vcmUgY29tcGxleCBjaGVjayBpcyByZXF1aXJlZCB0aGVuIHdyYXAgc3ViLWV4cHJlc3Npb25zIGluIHBhcmVudGhlc2VzLgorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBTVEFUSUNfQVNTRVJUX0V4cHJlc3Npb25fVG9vX0NvbXBsZXhfUGxlYXNlX1Jld3JpdGVfQXNfQmluYXJ5X0NvbXBhcmlzb24mIG9wZXJhdG9yICsgKCBUIGNvbnN0JiApOworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBTVEFUSUNfQVNTRVJUX0V4cHJlc3Npb25fVG9vX0NvbXBsZXhfUGxlYXNlX1Jld3JpdGVfQXNfQmluYXJ5X0NvbXBhcmlzb24mIG9wZXJhdG9yIC0gKCBUIGNvbnN0JiApOworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBTVEFUSUNfQVNTRVJUX0V4cHJlc3Npb25fVG9vX0NvbXBsZXhfUGxlYXNlX1Jld3JpdGVfQXNfQmluYXJ5X0NvbXBhcmlzb24mIG9wZXJhdG9yICogKCBUIGNvbnN0JiApOworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBTVEFUSUNfQVNTRVJUX0V4cHJlc3Npb25fVG9vX0NvbXBsZXhfUGxlYXNlX1Jld3JpdGVfQXNfQmluYXJ5X0NvbXBhcmlzb24mIG9wZXJhdG9yIC8gKCBUIGNvbnN0JiApOworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBTVEFUSUNfQVNTRVJUX0V4cHJlc3Npb25fVG9vX0NvbXBsZXhfUGxlYXNlX1Jld3JpdGVfQXNfQmluYXJ5X0NvbXBhcmlzb24mIG9wZXJhdG9yICUgKCBUIGNvbnN0JiApOworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBTVEFUSUNfQVNTRVJUX0V4cHJlc3Npb25fVG9vX0NvbXBsZXhfUGxlYXNlX1Jld3JpdGVfQXNfQmluYXJ5X0NvbXBhcmlzb24mIG9wZXJhdG9yICYmICggVCBjb25zdCYgKTsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gU1RBVElDX0FTU0VSVF9FeHByZXNzaW9uX1Rvb19Db21wbGV4X1BsZWFzZV9SZXdyaXRlX0FzX0JpbmFyeV9Db21wYXJpc29uJiBvcGVyYXRvciB8fCAoIFQgY29uc3QmICk7CisKKwlwcml2YXRlOgorCQlEZWNvbXBvc2VkRXhwcmVzc2lvbiYgb3BlcmF0b3IgPSAoRGVjb21wb3NlZEV4cHJlc3Npb24gY29uc3QmKTsKKyAgICB9OworCisgICAgc3RydWN0IEFzc2VydGlvbkluZm8KKyAgICB7CisgICAgICAgIEFzc2VydGlvbkluZm8oKSB7fQorICAgICAgICBBc3NlcnRpb25JbmZvKCAgc3RkOjpzdHJpbmcgY29uc3QmIF9tYWNyb05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgX2xpbmVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIF9jYXB0dXJlZEV4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHREaXNwb3NpdGlvbjo6RmxhZ3MgX3Jlc3VsdERpc3Bvc2l0aW9uICk7CisKKyAgICAgICAgc3RkOjpzdHJpbmcgbWFjcm9OYW1lOworICAgICAgICBTb3VyY2VMaW5lSW5mbyBsaW5lSW5mbzsKKyAgICAgICAgc3RkOjpzdHJpbmcgY2FwdHVyZWRFeHByZXNzaW9uOworICAgICAgICBSZXN1bHREaXNwb3NpdGlvbjo6RmxhZ3MgcmVzdWx0RGlzcG9zaXRpb247CisgICAgfTsKKworICAgIHN0cnVjdCBBc3NlcnRpb25SZXN1bHREYXRhCisgICAgeworICAgICAgICBBc3NlcnRpb25SZXN1bHREYXRhKCkgOiBkZWNvbXBvc2VkRXhwcmVzc2lvbiggQ0FUQ0hfTlVMTCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIHJlc3VsdFR5cGUoIFJlc3VsdFdhczo6VW5rbm93biApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIG5lZ2F0ZWQoIGZhbHNlICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgcGFyZW50aGVzaXplZCggZmFsc2UgKSB7fQorCisgICAgICAgIHZvaWQgbmVnYXRlKCBib29sIHBhcmVudGhlc2l6ZSApIHsKKyAgICAgICAgICAgIG5lZ2F0ZWQgPSAhbmVnYXRlZDsKKyAgICAgICAgICAgIHBhcmVudGhlc2l6ZWQgPSBwYXJlbnRoZXNpemU7CisgICAgICAgICAgICBpZiggcmVzdWx0VHlwZSA9PSBSZXN1bHRXYXM6Ok9rICkKKyAgICAgICAgICAgICAgICByZXN1bHRUeXBlID0gUmVzdWx0V2FzOjpFeHByZXNzaW9uRmFpbGVkOworICAgICAgICAgICAgZWxzZSBpZiggcmVzdWx0VHlwZSA9PSBSZXN1bHRXYXM6OkV4cHJlc3Npb25GYWlsZWQgKQorICAgICAgICAgICAgICAgIHJlc3VsdFR5cGUgPSBSZXN1bHRXYXM6Ok9rOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIHJlY29uc3RydWN0RXhwcmVzc2lvbigpIGNvbnN0IHsKKyAgICAgICAgICAgIGlmKCBkZWNvbXBvc2VkRXhwcmVzc2lvbiAhPSBDQVRDSF9OVUxMICkgeworICAgICAgICAgICAgICAgIGRlY29tcG9zZWRFeHByZXNzaW9uLT5yZWNvbnN0cnVjdEV4cHJlc3Npb24oIHJlY29uc3RydWN0ZWRFeHByZXNzaW9uICk7CisgICAgICAgICAgICAgICAgaWYoIHBhcmVudGhlc2l6ZWQgKSB7CisgICAgICAgICAgICAgICAgICAgIHJlY29uc3RydWN0ZWRFeHByZXNzaW9uLmluc2VydCggMCwgMSwgJygnICk7CisgICAgICAgICAgICAgICAgICAgIHJlY29uc3RydWN0ZWRFeHByZXNzaW9uLmFwcGVuZCggMSwgJyknICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKCBuZWdhdGVkICkgeworICAgICAgICAgICAgICAgICAgICByZWNvbnN0cnVjdGVkRXhwcmVzc2lvbi5pbnNlcnQoIDAsIDEsICchJyApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZWNvbXBvc2VkRXhwcmVzc2lvbiA9IENBVENIX05VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmVjb25zdHJ1Y3RlZEV4cHJlc3Npb247CisgICAgICAgIH0KKworICAgICAgICBtdXRhYmxlIERlY29tcG9zZWRFeHByZXNzaW9uIGNvbnN0KiBkZWNvbXBvc2VkRXhwcmVzc2lvbjsKKyAgICAgICAgbXV0YWJsZSBzdGQ6OnN0cmluZyByZWNvbnN0cnVjdGVkRXhwcmVzc2lvbjsKKyAgICAgICAgc3RkOjpzdHJpbmcgbWVzc2FnZTsKKyAgICAgICAgUmVzdWx0V2FzOjpPZlR5cGUgcmVzdWx0VHlwZTsKKyAgICAgICAgYm9vbCBuZWdhdGVkOworICAgICAgICBib29sIHBhcmVudGhlc2l6ZWQ7CisgICAgfTsKKworICAgIGNsYXNzIEFzc2VydGlvblJlc3VsdCB7CisgICAgcHVibGljOgorICAgICAgICBBc3NlcnRpb25SZXN1bHQoKTsKKyAgICAgICAgQXNzZXJ0aW9uUmVzdWx0KCBBc3NlcnRpb25JbmZvIGNvbnN0JiBpbmZvLCBBc3NlcnRpb25SZXN1bHREYXRhIGNvbnN0JiBkYXRhICk7CisgICAgICAgIH5Bc3NlcnRpb25SZXN1bHQoKTsKKyMgIGlmZGVmIENBVENIX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUworICAgICAgICAgQXNzZXJ0aW9uUmVzdWx0KCBBc3NlcnRpb25SZXN1bHQgY29uc3QmICkgICAgICAgICAgICAgID0gZGVmYXVsdDsKKyAgICAgICAgIEFzc2VydGlvblJlc3VsdCggQXNzZXJ0aW9uUmVzdWx0ICYmICkgICAgICAgICAgICAgICAgICA9IGRlZmF1bHQ7CisgICAgICAgICBBc3NlcnRpb25SZXN1bHQmIG9wZXJhdG9yID0gKCBBc3NlcnRpb25SZXN1bHQgY29uc3QmICkgPSBkZWZhdWx0OworICAgICAgICAgQXNzZXJ0aW9uUmVzdWx0JiBvcGVyYXRvciA9ICggQXNzZXJ0aW9uUmVzdWx0ICYmICkgICAgID0gZGVmYXVsdDsKKyMgIGVuZGlmCisKKyAgICAgICAgYm9vbCBpc09rKCkgY29uc3Q7CisgICAgICAgIGJvb2wgc3VjY2VlZGVkKCkgY29uc3Q7CisgICAgICAgIFJlc3VsdFdhczo6T2ZUeXBlIGdldFJlc3VsdFR5cGUoKSBjb25zdDsKKyAgICAgICAgYm9vbCBoYXNFeHByZXNzaW9uKCkgY29uc3Q7CisgICAgICAgIGJvb2wgaGFzTWVzc2FnZSgpIGNvbnN0OworICAgICAgICBzdGQ6OnN0cmluZyBnZXRFeHByZXNzaW9uKCkgY29uc3Q7CisgICAgICAgIHN0ZDo6c3RyaW5nIGdldEV4cHJlc3Npb25Jbk1hY3JvKCkgY29uc3Q7CisgICAgICAgIGJvb2wgaGFzRXhwYW5kZWRFeHByZXNzaW9uKCkgY29uc3Q7CisgICAgICAgIHN0ZDo6c3RyaW5nIGdldEV4cGFuZGVkRXhwcmVzc2lvbigpIGNvbnN0OworICAgICAgICBzdGQ6OnN0cmluZyBnZXRNZXNzYWdlKCkgY29uc3Q7CisgICAgICAgIFNvdXJjZUxpbmVJbmZvIGdldFNvdXJjZUluZm8oKSBjb25zdDsKKyAgICAgICAgc3RkOjpzdHJpbmcgZ2V0VGVzdE1hY3JvTmFtZSgpIGNvbnN0OworICAgICAgICB2b2lkIGRpc2NhcmREZWNvbXBvc2VkRXhwcmVzc2lvbigpIGNvbnN0OworICAgICAgICB2b2lkIGV4cGFuZERlY29tcG9zZWRFeHByZXNzaW9uKCkgY29uc3Q7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIEFzc2VydGlvbkluZm8gbV9pbmZvOworICAgICAgICBBc3NlcnRpb25SZXN1bHREYXRhIG1fcmVzdWx0RGF0YTsKKyAgICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX21hdGNoZXJzLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfTUFUQ0hFUlNfSFBQX0lOQ0xVREVECisKK25hbWVzcGFjZSBDYXRjaCB7CituYW1lc3BhY2UgTWF0Y2hlcnMgeworICAgIG5hbWVzcGFjZSBJbXBsIHsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBcmdUPiBzdHJ1Y3QgTWF0Y2hBbGxPZjsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQXJnVD4gc3RydWN0IE1hdGNoQW55T2Y7CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFyZ1Q+IHN0cnVjdCBNYXRjaE5vdE9mOworCisgICAgICAgIGNsYXNzIE1hdGNoZXJVbnR5cGVkQmFzZSB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgICAgICAgICAgICAgIGlmKCBtX2NhY2hlZFRvU3RyaW5nLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgICAgICBtX2NhY2hlZFRvU3RyaW5nID0gZGVzY3JpYmUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbV9jYWNoZWRUb1N0cmluZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQ6CisgICAgICAgICAgICB2aXJ0dWFsIH5NYXRjaGVyVW50eXBlZEJhc2UoKTsKKyAgICAgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZGVzY3JpYmUoKSBjb25zdCA9IDA7CisgICAgICAgICAgICBtdXRhYmxlIHN0ZDo6c3RyaW5nIG1fY2FjaGVkVG9TdHJpbmc7CisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICBNYXRjaGVyVW50eXBlZEJhc2UmIG9wZXJhdG9yID0gKCBNYXRjaGVyVW50eXBlZEJhc2UgY29uc3QmICk7CisgICAgICAgIH07CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgT2JqZWN0VD4KKyAgICAgICAgc3RydWN0IE1hdGNoZXJNZXRob2QgeworICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoKCBPYmplY3RUIGNvbnN0JiBhcmcgKSBjb25zdCA9IDA7CisgICAgICAgIH07CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFB0clQ+CisgICAgICAgIHN0cnVjdCBNYXRjaGVyTWV0aG9kPFB0clQqPiB7CisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWF0Y2goIFB0clQqIGFyZyApIGNvbnN0ID0gMDsKKyAgICAgICAgfTsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPYmplY3RULCB0eXBlbmFtZSBDb21wYXJhdG9yVCA9IE9iamVjdFQ+CisgICAgICAgIHN0cnVjdCBNYXRjaGVyQmFzZSA6IE1hdGNoZXJVbnR5cGVkQmFzZSwgTWF0Y2hlck1ldGhvZDxPYmplY3RUPiB7CisKKyAgICAgICAgICAgIE1hdGNoQWxsT2Y8Q29tcGFyYXRvclQ+IG9wZXJhdG9yICYmICggTWF0Y2hlckJhc2UgY29uc3QmIG90aGVyICkgY29uc3Q7CisgICAgICAgICAgICBNYXRjaEFueU9mPENvbXBhcmF0b3JUPiBvcGVyYXRvciB8fCAoIE1hdGNoZXJCYXNlIGNvbnN0JiBvdGhlciApIGNvbnN0OworICAgICAgICAgICAgTWF0Y2hOb3RPZjxDb21wYXJhdG9yVD4gb3BlcmF0b3IgISAoKSBjb25zdDsKKyAgICAgICAgfTsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBcmdUPgorICAgICAgICBzdHJ1Y3QgTWF0Y2hBbGxPZiA6IE1hdGNoZXJCYXNlPEFyZ1Q+IHsKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXRjaCggQXJnVCBjb25zdCYgYXJnICkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIGZvciggc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBtX21hdGNoZXJzLnNpemUoKTsgKytpICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIW1fbWF0Y2hlcnNbaV0tPm1hdGNoKGFyZykpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBkZXNjcmliZSgpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBkZXNjcmlwdGlvbjsKKyAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbi5yZXNlcnZlKCA0ICsgbV9tYXRjaGVycy5zaXplKCkqMzIgKTsKKyAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiArPSAiKCAiOworICAgICAgICAgICAgICAgIGZvciggc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBtX21hdGNoZXJzLnNpemUoKTsgKytpICkgeworICAgICAgICAgICAgICAgICAgICBpZiggaSAhPSAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICs9ICIgYW5kICI7CisgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICs9IG1fbWF0Y2hlcnNbaV0tPnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICs9ICIgKSI7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBNYXRjaEFsbE9mPEFyZ1Q+JiBvcGVyYXRvciAmJiAoIE1hdGNoZXJCYXNlPEFyZ1Q+IGNvbnN0JiBvdGhlciApIHsKKyAgICAgICAgICAgICAgICBtX21hdGNoZXJzLnB1c2hfYmFjayggJm90aGVyICk7CisgICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxNYXRjaGVyQmFzZTxBcmdUPiBjb25zdCo+IG1fbWF0Y2hlcnM7CisgICAgICAgIH07CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFyZ1Q+CisgICAgICAgIHN0cnVjdCBNYXRjaEFueU9mIDogTWF0Y2hlckJhc2U8QXJnVD4geworCisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWF0Y2goIEFyZ1QgY29uc3QmIGFyZyApIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICBmb3IoIHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgbV9tYXRjaGVycy5zaXplKCk7ICsraSApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fbWF0Y2hlcnNbaV0tPm1hdGNoKGFyZykpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBkZXNjcmliZSgpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBkZXNjcmlwdGlvbjsKKyAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbi5yZXNlcnZlKCA0ICsgbV9tYXRjaGVycy5zaXplKCkqMzIgKTsKKyAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiArPSAiKCAiOworICAgICAgICAgICAgICAgIGZvciggc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBtX21hdGNoZXJzLnNpemUoKTsgKytpICkgeworICAgICAgICAgICAgICAgICAgICBpZiggaSAhPSAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICs9ICIgb3IgIjsKKyAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gKz0gbV9tYXRjaGVyc1tpXS0+dG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gKz0gIiApIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRpb247CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIE1hdGNoQW55T2Y8QXJnVD4mIG9wZXJhdG9yIHx8ICggTWF0Y2hlckJhc2U8QXJnVD4gY29uc3QmIG90aGVyICkgeworICAgICAgICAgICAgICAgIG1fbWF0Y2hlcnMucHVzaF9iYWNrKCAmb3RoZXIgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE1hdGNoZXJCYXNlPEFyZ1Q+IGNvbnN0Kj4gbV9tYXRjaGVyczsKKyAgICAgICAgfTsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBcmdUPgorICAgICAgICBzdHJ1Y3QgTWF0Y2hOb3RPZiA6IE1hdGNoZXJCYXNlPEFyZ1Q+IHsKKworICAgICAgICAgICAgTWF0Y2hOb3RPZiggTWF0Y2hlckJhc2U8QXJnVD4gY29uc3QmIHVuZGVybHlpbmdNYXRjaGVyICkgOiBtX3VuZGVybHlpbmdNYXRjaGVyKCB1bmRlcmx5aW5nTWF0Y2hlciApIHt9CisKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXRjaCggQXJnVCBjb25zdCYgYXJnICkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIHJldHVybiAhbV91bmRlcmx5aW5nTWF0Y2hlci5tYXRjaCggYXJnICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZGVzY3JpYmUoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJub3QgIiArIG1fdW5kZXJseWluZ01hdGNoZXIudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE1hdGNoZXJCYXNlPEFyZ1Q+IGNvbnN0JiBtX3VuZGVybHlpbmdNYXRjaGVyOworICAgICAgICB9OworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIE9iamVjdFQsIHR5cGVuYW1lIENvbXBhcmF0b3JUPgorICAgICAgICBNYXRjaEFsbE9mPENvbXBhcmF0b3JUPiBNYXRjaGVyQmFzZTxPYmplY3RULCBDb21wYXJhdG9yVD46Om9wZXJhdG9yICYmICggTWF0Y2hlckJhc2UgY29uc3QmIG90aGVyICkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIE1hdGNoQWxsT2Y8Q29tcGFyYXRvclQ+KCkgJiYgKnRoaXMgJiYgb3RoZXI7CisgICAgICAgIH0KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgT2JqZWN0VCwgdHlwZW5hbWUgQ29tcGFyYXRvclQ+CisgICAgICAgIE1hdGNoQW55T2Y8Q29tcGFyYXRvclQ+IE1hdGNoZXJCYXNlPE9iamVjdFQsIENvbXBhcmF0b3JUPjo6b3BlcmF0b3IgfHwgKCBNYXRjaGVyQmFzZSBjb25zdCYgb3RoZXIgKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gTWF0Y2hBbnlPZjxDb21wYXJhdG9yVD4oKSB8fCAqdGhpcyB8fCBvdGhlcjsKKyAgICAgICAgfQorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPYmplY3RULCB0eXBlbmFtZSBDb21wYXJhdG9yVD4KKyAgICAgICAgTWF0Y2hOb3RPZjxDb21wYXJhdG9yVD4gTWF0Y2hlckJhc2U8T2JqZWN0VCwgQ29tcGFyYXRvclQ+OjpvcGVyYXRvciAhICgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBNYXRjaE5vdE9mPENvbXBhcmF0b3JUPiggKnRoaXMgKTsKKyAgICAgICAgfQorCisgICAgfSAvLyBuYW1lc3BhY2UgSW1wbAorCisgICAgLy8gVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgY3JlYXRlIHRoZSBhY3R1YWwgbWF0Y2hlciBvYmplY3RzLgorICAgIC8vIFRoaXMgYWxsb3dzIHRoZSB0eXBlcyB0byBiZSBpbmZlcnJlZAorICAgIC8vIC0gZGVwcmVjYXRlZDogcHJlZmVyIHx8LCAmJiBhbmQgIQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgaW5saW5lIEltcGw6Ok1hdGNoTm90T2Y8VD4gTm90KCBJbXBsOjpNYXRjaGVyQmFzZTxUPiBjb25zdCYgdW5kZXJseWluZ01hdGNoZXIgKSB7CisgICAgICAgIHJldHVybiBJbXBsOjpNYXRjaE5vdE9mPFQ+KCB1bmRlcmx5aW5nTWF0Y2hlciApOworICAgIH0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGlubGluZSBJbXBsOjpNYXRjaEFsbE9mPFQ+IEFsbE9mKCBJbXBsOjpNYXRjaGVyQmFzZTxUPiBjb25zdCYgbTEsIEltcGw6Ok1hdGNoZXJCYXNlPFQ+IGNvbnN0JiBtMiApIHsKKyAgICAgICAgcmV0dXJuIEltcGw6Ok1hdGNoQWxsT2Y8VD4oKSAmJiBtMSAmJiBtMjsKKyAgICB9CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBpbmxpbmUgSW1wbDo6TWF0Y2hBbGxPZjxUPiBBbGxPZiggSW1wbDo6TWF0Y2hlckJhc2U8VD4gY29uc3QmIG0xLCBJbXBsOjpNYXRjaGVyQmFzZTxUPiBjb25zdCYgbTIsIEltcGw6Ok1hdGNoZXJCYXNlPFQ+IGNvbnN0JiBtMyApIHsKKyAgICAgICAgcmV0dXJuIEltcGw6Ok1hdGNoQWxsT2Y8VD4oKSAmJiBtMSAmJiBtMiAmJiBtMzsKKyAgICB9CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBpbmxpbmUgSW1wbDo6TWF0Y2hBbnlPZjxUPiBBbnlPZiggSW1wbDo6TWF0Y2hlckJhc2U8VD4gY29uc3QmIG0xLCBJbXBsOjpNYXRjaGVyQmFzZTxUPiBjb25zdCYgbTIgKSB7CisgICAgICAgIHJldHVybiBJbXBsOjpNYXRjaEFueU9mPFQ+KCkgfHwgbTEgfHwgbTI7CisgICAgfQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgaW5saW5lIEltcGw6Ok1hdGNoQW55T2Y8VD4gQW55T2YoIEltcGw6Ok1hdGNoZXJCYXNlPFQ+IGNvbnN0JiBtMSwgSW1wbDo6TWF0Y2hlckJhc2U8VD4gY29uc3QmIG0yLCBJbXBsOjpNYXRjaGVyQmFzZTxUPiBjb25zdCYgbTMgKSB7CisgICAgICAgIHJldHVybiBJbXBsOjpNYXRjaEFueU9mPFQ+KCkgfHwgbTEgfHwgbTIgfHwgbTM7CisgICAgfQorCit9IC8vIG5hbWVzcGFjZSBNYXRjaGVycworCit1c2luZyBuYW1lc3BhY2UgTWF0Y2hlcnM7Cit1c2luZyBNYXRjaGVyczo6SW1wbDo6TWF0Y2hlckJhc2U7CisKK30gLy8gbmFtZXNwYWNlIENhdGNoCisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdHJ1Y3QgVGVzdEZhaWx1cmVFeGNlcHRpb257fTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIEV4cHJlc3Npb25MaHM7CisKKyAgICBzdHJ1Y3QgQ29weWFibGVTdHJlYW0geworICAgICAgICBDb3B5YWJsZVN0cmVhbSgpIHt9CisgICAgICAgIENvcHlhYmxlU3RyZWFtKCBDb3B5YWJsZVN0cmVhbSBjb25zdCYgb3RoZXIgKSB7CisgICAgICAgICAgICBvc3MgPDwgb3RoZXIub3NzLnN0cigpOworICAgICAgICB9CisgICAgICAgIENvcHlhYmxlU3RyZWFtJiBvcGVyYXRvcj0oIENvcHlhYmxlU3RyZWFtIGNvbnN0JiBvdGhlciApIHsKKyAgICAgICAgICAgIG9zcy5zdHIoc3RkOjpzdHJpbmcoKSk7CisgICAgICAgICAgICBvc3MgPDwgb3RoZXIub3NzLnN0cigpOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgfTsKKworICAgIGNsYXNzIFJlc3VsdEJ1aWxkZXIgOiBwdWJsaWMgRGVjb21wb3NlZEV4cHJlc3Npb24geworICAgIHB1YmxpYzoKKyAgICAgICAgUmVzdWx0QnVpbGRlciggIGNoYXIgY29uc3QqIG1hY3JvTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBsaW5lSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgY29uc3QqIGNhcHR1cmVkRXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdERpc3Bvc2l0aW9uOjpGbGFncyByZXN1bHREaXNwb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgY29uc3QqIHNlY29uZEFyZyA9ICIiICk7CisgICAgICAgIH5SZXN1bHRCdWlsZGVyKCk7CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgRXhwcmVzc2lvbkxoczxUIGNvbnN0Jj4gb3BlcmF0b3IgPD0gKCBUIGNvbnN0JiBvcGVyYW5kICk7CisgICAgICAgIEV4cHJlc3Npb25MaHM8Ym9vbD4gb3BlcmF0b3IgPD0gKCBib29sIHZhbHVlICk7CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgUmVzdWx0QnVpbGRlciYgb3BlcmF0b3IgPDwgKCBUIGNvbnN0JiB2YWx1ZSApIHsKKyAgICAgICAgICAgIG1fc3RyZWFtLm9zcyA8PCB2YWx1ZTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIFJlc3VsdEJ1aWxkZXImIHNldFJlc3VsdFR5cGUoIFJlc3VsdFdhczo6T2ZUeXBlIHJlc3VsdCApOworICAgICAgICBSZXN1bHRCdWlsZGVyJiBzZXRSZXN1bHRUeXBlKCBib29sIHJlc3VsdCApOworCisgICAgICAgIHZvaWQgZW5kRXhwcmVzc2lvbiggRGVjb21wb3NlZEV4cHJlc3Npb24gY29uc3QmIGV4cHIgKTsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgcmVjb25zdHJ1Y3RFeHByZXNzaW9uKCBzdGQ6OnN0cmluZyYgZGVzdCApIGNvbnN0IENBVENIX09WRVJSSURFOworCisgICAgICAgIEFzc2VydGlvblJlc3VsdCBidWlsZCgpIGNvbnN0OworICAgICAgICBBc3NlcnRpb25SZXN1bHQgYnVpbGQoIERlY29tcG9zZWRFeHByZXNzaW9uIGNvbnN0JiBleHByICkgY29uc3Q7CisKKyAgICAgICAgdm9pZCB1c2VBY3RpdmVFeGNlcHRpb24oIFJlc3VsdERpc3Bvc2l0aW9uOjpGbGFncyByZXN1bHREaXNwb3NpdGlvbiA9IFJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwgKTsKKyAgICAgICAgdm9pZCBjYXB0dXJlUmVzdWx0KCBSZXN1bHRXYXM6Ok9mVHlwZSByZXN1bHRUeXBlICk7CisgICAgICAgIHZvaWQgY2FwdHVyZUV4cHJlc3Npb24oKTsKKyAgICAgICAgdm9pZCBjYXB0dXJlRXhwZWN0ZWRFeGNlcHRpb24oIHN0ZDo6c3RyaW5nIGNvbnN0JiBleHBlY3RlZE1lc3NhZ2UgKTsKKyAgICAgICAgdm9pZCBjYXB0dXJlRXhwZWN0ZWRFeGNlcHRpb24oIE1hdGNoZXJzOjpJbXBsOjpNYXRjaGVyQmFzZTxzdGQ6OnN0cmluZz4gY29uc3QmIG1hdGNoZXIgKTsKKyAgICAgICAgdm9pZCBoYW5kbGVSZXN1bHQoIEFzc2VydGlvblJlc3VsdCBjb25zdCYgcmVzdWx0ICk7CisgICAgICAgIHZvaWQgcmVhY3QoKTsKKyAgICAgICAgYm9vbCBzaG91bGREZWJ1Z0JyZWFrKCkgY29uc3Q7CisgICAgICAgIGJvb2wgYWxsb3dUaHJvd3MoKSBjb25zdDsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBcmdULCB0eXBlbmFtZSBNYXRjaGVyVD4KKyAgICAgICAgdm9pZCBjYXB0dXJlTWF0Y2goIEFyZ1QgY29uc3QmIGFyZywgTWF0Y2hlclQgY29uc3QmIG1hdGNoZXIsIGNoYXIgY29uc3QqIG1hdGNoZXJTdHJpbmcgKTsKKworICAgICAgICB2b2lkIHNldEV4Y2VwdGlvbkd1YXJkKCk7CisgICAgICAgIHZvaWQgdW5zZXRFeGNlcHRpb25HdWFyZCgpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgQXNzZXJ0aW9uSW5mbyBtX2Fzc2VydGlvbkluZm87CisgICAgICAgIEFzc2VydGlvblJlc3VsdERhdGEgbV9kYXRhOworICAgICAgICBDb3B5YWJsZVN0cmVhbSBtX3N0cmVhbTsKKworICAgICAgICBib29sIG1fc2hvdWxkRGVidWdCcmVhazsKKyAgICAgICAgYm9vbCBtX3Nob3VsZFRocm93OworICAgICAgICBib29sIG1fZ3VhcmRFeGNlcHRpb247CisgICAgfTsKKworfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gSW5jbHVkZSBhZnRlciBkdWUgdG8gY2lyY3VsYXIgZGVwZW5kZW5jeToKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9leHByZXNzaW9uX2xocy5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0VYUFJFU1NJT05fTEhTX0hQUF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfZXZhbHVhdGUuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9FVkFMVUFURV9IUFBfSU5DTFVERUQKKworI2lmZGVmIF9NU0NfVkVSCisjcHJhZ21hIHdhcm5pbmcocHVzaCkKKyNwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQzODkpIC8vICc9PScgOiBzaWduZWQvdW5zaWduZWQgbWlzbWF0Y2gKKyNwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQzMTIpIC8vIENvbnZlcnRpbmcgaW50IHRvIFQqIHVzaW5nIHJlaW50ZXJwcmV0X2Nhc3QgKGlzc3VlIG9uIHg2NCBwbGF0Zm9ybSkKKyNlbmRpZgorCisjaW5jbHVkZSA8Y3N0ZGRlZj4KKworbmFtZXNwYWNlIENhdGNoIHsKK25hbWVzcGFjZSBJbnRlcm5hbCB7CisKKyAgICBlbnVtIE9wZXJhdG9yIHsKKyAgICAgICAgSXNFcXVhbFRvLAorICAgICAgICBJc05vdEVxdWFsVG8sCisgICAgICAgIElzTGVzc1RoYW4sCisgICAgICAgIElzR3JlYXRlclRoYW4sCisgICAgICAgIElzTGVzc1RoYW5PckVxdWFsVG8sCisgICAgICAgIElzR3JlYXRlclRoYW5PckVxdWFsVG8KKyAgICB9OworCisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IHN0cnVjdCBPcGVyYXRvclRyYWl0cyAgICAgICAgICAgICB7IHN0YXRpYyBjb25zdCBjaGFyKiBnZXROYW1lKCl7IHJldHVybiAiKmVycm9yKiI7IH0gfTsKKyAgICB0ZW1wbGF0ZTw+IHN0cnVjdCBPcGVyYXRvclRyYWl0czxJc0VxdWFsVG8+ICAgICAgICAgICAgIHsgc3RhdGljIGNvbnN0IGNoYXIqIGdldE5hbWUoKXsgcmV0dXJuICI9PSI7IH0gfTsKKyAgICB0ZW1wbGF0ZTw+IHN0cnVjdCBPcGVyYXRvclRyYWl0czxJc05vdEVxdWFsVG8+ICAgICAgICAgIHsgc3RhdGljIGNvbnN0IGNoYXIqIGdldE5hbWUoKXsgcmV0dXJuICIhPSI7IH0gfTsKKyAgICB0ZW1wbGF0ZTw+IHN0cnVjdCBPcGVyYXRvclRyYWl0czxJc0xlc3NUaGFuPiAgICAgICAgICAgIHsgc3RhdGljIGNvbnN0IGNoYXIqIGdldE5hbWUoKXsgcmV0dXJuICI8IjsgfSB9OworICAgIHRlbXBsYXRlPD4gc3RydWN0IE9wZXJhdG9yVHJhaXRzPElzR3JlYXRlclRoYW4+ICAgICAgICAgeyBzdGF0aWMgY29uc3QgY2hhciogZ2V0TmFtZSgpeyByZXR1cm4gIj4iOyB9IH07CisgICAgdGVtcGxhdGU8PiBzdHJ1Y3QgT3BlcmF0b3JUcmFpdHM8SXNMZXNzVGhhbk9yRXF1YWxUbz4gICB7IHN0YXRpYyBjb25zdCBjaGFyKiBnZXROYW1lKCl7IHJldHVybiAiPD0iOyB9IH07CisgICAgdGVtcGxhdGU8PiBzdHJ1Y3QgT3BlcmF0b3JUcmFpdHM8SXNHcmVhdGVyVGhhbk9yRXF1YWxUbz57IHN0YXRpYyBjb25zdCBjaGFyKiBnZXROYW1lKCl7IHJldHVybiAiPj0iOyB9IH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGlubGluZSBUJiBvcENhc3QoVCBjb25zdCYgdCkgeyByZXR1cm4gY29uc3RfY2FzdDxUJj4odCk7IH0KKworLy8gbnVsbHB0cl90IHN1cHBvcnQgYmFzZWQgb24gcHVsbCByZXF1ZXN0ICMxNTQgZnJvbSBLb25zdGFudGluIEJhdW1hbm4KKyNpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfTlVMTFBUUgorICAgIGlubGluZSBzdGQ6Om51bGxwdHJfdCBvcENhc3Qoc3RkOjpudWxscHRyX3QpIHsgcmV0dXJuIG51bGxwdHI7IH0KKyNlbmRpZiAvLyBDQVRDSF9DT05GSUdfQ1BQMTFfTlVMTFBUUgorCisgICAgLy8gU28gdGhlIGNvbXBhcmUgb3ZlcmxvYWRzIGNhbiBiZSBvcGVyYXRvciBhZ25vc3RpYyB3ZSBjb252ZXkgdGhlIG9wZXJhdG9yIGFzIGEgdGVtcGxhdGUKKyAgICAvLyBlbnVtLCB3aGljaCBpcyB1c2VkIHRvIHNwZWNpYWxpc2UgYW4gRXZhbHVhdG9yIGZvciBkb2luZyB0aGUgY29tcGFyaXNvbi4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIE9wZXJhdG9yIE9wPgorICAgIGNsYXNzIEV2YWx1YXRvcnt9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorICAgIHN0cnVjdCBFdmFsdWF0b3I8VDEsIFQyLCBJc0VxdWFsVG8+IHsKKyAgICAgICAgc3RhdGljIGJvb2wgZXZhbHVhdGUoIFQxIGNvbnN0JiBsaHMsIFQyIGNvbnN0JiByaHMpIHsKKyAgICAgICAgICAgIHJldHVybiBib29sKCBvcENhc3QoIGxocyApID09ICBvcENhc3QoIHJocyApICk7CisgICAgICAgIH0KKyAgICB9OworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KKyAgICBzdHJ1Y3QgRXZhbHVhdG9yPFQxLCBUMiwgSXNOb3RFcXVhbFRvPiB7CisgICAgICAgIHN0YXRpYyBib29sIGV2YWx1YXRlKCBUMSBjb25zdCYgbGhzLCBUMiBjb25zdCYgcmhzICkgeworICAgICAgICAgICAgcmV0dXJuIGJvb2woIG9wQ2FzdCggbGhzICkgIT0gb3BDYXN0KCByaHMgKSApOworICAgICAgICB9CisgICAgfTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CisgICAgc3RydWN0IEV2YWx1YXRvcjxUMSwgVDIsIElzTGVzc1RoYW4+IHsKKyAgICAgICAgc3RhdGljIGJvb2wgZXZhbHVhdGUoIFQxIGNvbnN0JiBsaHMsIFQyIGNvbnN0JiByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gYm9vbCggb3BDYXN0KCBsaHMgKSA8IG9wQ2FzdCggcmhzICkgKTsKKyAgICAgICAgfQorICAgIH07CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorICAgIHN0cnVjdCBFdmFsdWF0b3I8VDEsIFQyLCBJc0dyZWF0ZXJUaGFuPiB7CisgICAgICAgIHN0YXRpYyBib29sIGV2YWx1YXRlKCBUMSBjb25zdCYgbGhzLCBUMiBjb25zdCYgcmhzICkgeworICAgICAgICAgICAgcmV0dXJuIGJvb2woIG9wQ2FzdCggbGhzICkgPiBvcENhc3QoIHJocyApICk7CisgICAgICAgIH0KKyAgICB9OworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KKyAgICBzdHJ1Y3QgRXZhbHVhdG9yPFQxLCBUMiwgSXNHcmVhdGVyVGhhbk9yRXF1YWxUbz4geworICAgICAgICBzdGF0aWMgYm9vbCBldmFsdWF0ZSggVDEgY29uc3QmIGxocywgVDIgY29uc3QmIHJocyApIHsKKyAgICAgICAgICAgIHJldHVybiBib29sKCBvcENhc3QoIGxocyApID49IG9wQ2FzdCggcmhzICkgKTsKKyAgICAgICAgfQorICAgIH07CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorICAgIHN0cnVjdCBFdmFsdWF0b3I8VDEsIFQyLCBJc0xlc3NUaGFuT3JFcXVhbFRvPiB7CisgICAgICAgIHN0YXRpYyBib29sIGV2YWx1YXRlKCBUMSBjb25zdCYgbGhzLCBUMiBjb25zdCYgcmhzICkgeworICAgICAgICAgICAgcmV0dXJuIGJvb2woIG9wQ2FzdCggbGhzICkgPD0gb3BDYXN0KCByaHMgKSApOworICAgICAgICB9CisgICAgfTsKKworICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wLCB0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CisgICAgYm9vbCBhcHBseUV2YWx1YXRvciggVDEgY29uc3QmIGxocywgVDIgY29uc3QmIHJocyApIHsKKyAgICAgICAgcmV0dXJuIEV2YWx1YXRvcjxUMSwgVDIsIE9wPjo6ZXZhbHVhdGUoIGxocywgcmhzICk7CisgICAgfQorCisgICAgLy8gVGhpcyBsZXZlbCBvZiBpbmRpcmVjdGlvbiBhbGxvd3MgdXMgdG8gc3BlY2lhbGlzZSBmb3IgaW50ZWdlciB0eXBlcworICAgIC8vIHRvIGF2b2lkIHNpZ25lZC8gdW5zaWduZWQgd2FybmluZ3MKKworICAgIC8vICJiYXNlIiBvdmVybG9hZAorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wLCB0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CisgICAgYm9vbCBjb21wYXJlKCBUMSBjb25zdCYgbGhzLCBUMiBjb25zdCYgcmhzICkgeworICAgICAgICByZXR1cm4gRXZhbHVhdG9yPFQxLCBUMiwgT3A+OjpldmFsdWF0ZSggbGhzLCByaHMgKTsKKyAgICB9CisKKyAgICAvLyB1bnNpZ25lZCBYIHRvIGludAorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wPiBib29sIGNvbXBhcmUoIHVuc2lnbmVkIGludCBsaHMsIGludCByaHMgKSB7CisgICAgICAgIHJldHVybiBhcHBseUV2YWx1YXRvcjxPcD4oIGxocywgc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PiggcmhzICkgKTsKKyAgICB9CisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IGJvb2wgY29tcGFyZSggdW5zaWduZWQgbG9uZyBsaHMsIGludCByaHMgKSB7CisgICAgICAgIHJldHVybiBhcHBseUV2YWx1YXRvcjxPcD4oIGxocywgc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PiggcmhzICkgKTsKKyAgICB9CisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IGJvb2wgY29tcGFyZSggdW5zaWduZWQgY2hhciBsaHMsIGludCByaHMgKSB7CisgICAgICAgIHJldHVybiBhcHBseUV2YWx1YXRvcjxPcD4oIGxocywgc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PiggcmhzICkgKTsKKyAgICB9CisKKyAgICAvLyB1bnNpZ25lZCBYIHRvIGxvbmcKKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCB1bnNpZ25lZCBpbnQgbGhzLCBsb25nIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggbGhzLCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPiggcmhzICkgKTsKKyAgICB9CisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IGJvb2wgY29tcGFyZSggdW5zaWduZWQgbG9uZyBsaHMsIGxvbmcgcmhzICkgeworICAgICAgICByZXR1cm4gYXBwbHlFdmFsdWF0b3I8T3A+KCBsaHMsIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KCByaHMgKSApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCB1bnNpZ25lZCBjaGFyIGxocywgbG9uZyByaHMgKSB7CisgICAgICAgIHJldHVybiBhcHBseUV2YWx1YXRvcjxPcD4oIGxocywgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oIHJocyApICk7CisgICAgfQorCisgICAgLy8gaW50IHRvIHVuc2lnbmVkIFgKKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCBpbnQgbGhzLCB1bnNpZ25lZCBpbnQgcmhzICkgeworICAgICAgICByZXR1cm4gYXBwbHlFdmFsdWF0b3I8T3A+KCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KCBsaHMgKSwgcmhzICk7CisgICAgfQorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wPiBib29sIGNvbXBhcmUoIGludCBsaHMsIHVuc2lnbmVkIGxvbmcgcmhzICkgeworICAgICAgICByZXR1cm4gYXBwbHlFdmFsdWF0b3I8T3A+KCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KCBsaHMgKSwgcmhzICk7CisgICAgfQorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wPiBib29sIGNvbXBhcmUoIGludCBsaHMsIHVuc2lnbmVkIGNoYXIgcmhzICkgeworICAgICAgICByZXR1cm4gYXBwbHlFdmFsdWF0b3I8T3A+KCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KCBsaHMgKSwgcmhzICk7CisgICAgfQorCisgICAgLy8gbG9uZyB0byB1bnNpZ25lZCBYCisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IGJvb2wgY29tcGFyZSggbG9uZyBsaHMsIHVuc2lnbmVkIGludCByaHMgKSB7CisgICAgICAgIHJldHVybiBhcHBseUV2YWx1YXRvcjxPcD4oIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KCBsaHMgKSwgcmhzICk7CisgICAgfQorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wPiBib29sIGNvbXBhcmUoIGxvbmcgbGhzLCB1bnNpZ25lZCBsb25nIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oIGxocyApLCByaHMgKTsKKyAgICB9CisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IGJvb2wgY29tcGFyZSggbG9uZyBsaHMsIHVuc2lnbmVkIGNoYXIgcmhzICkgeworICAgICAgICByZXR1cm4gYXBwbHlFdmFsdWF0b3I8T3A+KCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPiggbGhzICksIHJocyApOworICAgIH0KKworICAgIC8vIHBvaW50ZXIgdG8gbG9uZyAod2hlbiBjb21wYXJpbmcgYWdhaW5zdCBOVUxMKQorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wLCB0eXBlbmFtZSBUPiBib29sIGNvbXBhcmUoIGxvbmcgbGhzLCBUKiByaHMgKSB7CisgICAgICAgIHJldHVybiBFdmFsdWF0b3I8VCosIFQqLCBPcD46OmV2YWx1YXRlKCByZWludGVycHJldF9jYXN0PFQqPiggbGhzICksIHJocyApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcCwgdHlwZW5hbWUgVD4gYm9vbCBjb21wYXJlKCBUKiBsaHMsIGxvbmcgcmhzICkgeworICAgICAgICByZXR1cm4gRXZhbHVhdG9yPFQqLCBUKiwgT3A+OjpldmFsdWF0ZSggbGhzLCByZWludGVycHJldF9jYXN0PFQqPiggcmhzICkgKTsKKyAgICB9CisKKyAgICAvLyBwb2ludGVyIHRvIGludCAod2hlbiBjb21wYXJpbmcgYWdhaW5zdCBOVUxMKQorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wLCB0eXBlbmFtZSBUPiBib29sIGNvbXBhcmUoIGludCBsaHMsIFQqIHJocyApIHsKKyAgICAgICAgcmV0dXJuIEV2YWx1YXRvcjxUKiwgVCosIE9wPjo6ZXZhbHVhdGUoIHJlaW50ZXJwcmV0X2Nhc3Q8VCo+KCBsaHMgKSwgcmhzICk7CisgICAgfQorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wLCB0eXBlbmFtZSBUPiBib29sIGNvbXBhcmUoIFQqIGxocywgaW50IHJocyApIHsKKyAgICAgICAgcmV0dXJuIEV2YWx1YXRvcjxUKiwgVCosIE9wPjo6ZXZhbHVhdGUoIGxocywgcmVpbnRlcnByZXRfY2FzdDxUKj4oIHJocyApICk7CisgICAgfQorCisjaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX0xPTkdfTE9ORworICAgIC8vIGxvbmcgbG9uZyB0byB1bnNpZ25lZCBYCisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IGJvb2wgY29tcGFyZSggbG9uZyBsb25nIGxocywgdW5zaWduZWQgaW50IHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oIGxocyApLCByaHMgKTsKKyAgICB9CisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IGJvb2wgY29tcGFyZSggbG9uZyBsb25nIGxocywgdW5zaWduZWQgbG9uZyByaHMgKSB7CisgICAgICAgIHJldHVybiBhcHBseUV2YWx1YXRvcjxPcD4oIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KCBsaHMgKSwgcmhzICk7CisgICAgfQorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wPiBib29sIGNvbXBhcmUoIGxvbmcgbG9uZyBsaHMsIHVuc2lnbmVkIGxvbmcgbG9uZyByaHMgKSB7CisgICAgICAgIHJldHVybiBhcHBseUV2YWx1YXRvcjxPcD4oIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KCBsaHMgKSwgcmhzICk7CisgICAgfQorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wPiBib29sIGNvbXBhcmUoIGxvbmcgbG9uZyBsaHMsIHVuc2lnbmVkIGNoYXIgcmhzICkgeworICAgICAgICByZXR1cm4gYXBwbHlFdmFsdWF0b3I8T3A+KCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPiggbGhzICksIHJocyApOworICAgIH0KKworICAgIC8vIHVuc2lnbmVkIGxvbmcgbG9uZyB0byBYCisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IGJvb2wgY29tcGFyZSggdW5zaWduZWQgbG9uZyBsb25nIGxocywgaW50IHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggc3RhdGljX2Nhc3Q8bG9uZz4oIGxocyApLCByaHMgKTsKKyAgICB9CisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IGJvb2wgY29tcGFyZSggdW5zaWduZWQgbG9uZyBsb25nIGxocywgbG9uZyByaHMgKSB7CisgICAgICAgIHJldHVybiBhcHBseUV2YWx1YXRvcjxPcD4oIHN0YXRpY19jYXN0PGxvbmc+KCBsaHMgKSwgcmhzICk7CisgICAgfQorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wPiBib29sIGNvbXBhcmUoIHVuc2lnbmVkIGxvbmcgbG9uZyBsaHMsIGxvbmcgbG9uZyByaHMgKSB7CisgICAgICAgIHJldHVybiBhcHBseUV2YWx1YXRvcjxPcD4oIHN0YXRpY19jYXN0PGxvbmc+KCBsaHMgKSwgcmhzICk7CisgICAgfQorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wPiBib29sIGNvbXBhcmUoIHVuc2lnbmVkIGxvbmcgbG9uZyBsaHMsIGNoYXIgcmhzICkgeworICAgICAgICByZXR1cm4gYXBwbHlFdmFsdWF0b3I8T3A+KCBzdGF0aWNfY2FzdDxsb25nPiggbGhzICksIHJocyApOworICAgIH0KKworICAgIC8vIHBvaW50ZXIgdG8gbG9uZyBsb25nICh3aGVuIGNvbXBhcmluZyBhZ2FpbnN0IE5VTEwpCisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3AsIHR5cGVuYW1lIFQ+IGJvb2wgY29tcGFyZSggbG9uZyBsb25nIGxocywgVCogcmhzICkgeworICAgICAgICByZXR1cm4gRXZhbHVhdG9yPFQqLCBUKiwgT3A+OjpldmFsdWF0ZSggcmVpbnRlcnByZXRfY2FzdDxUKj4oIGxocyApLCByaHMgKTsKKyAgICB9CisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3AsIHR5cGVuYW1lIFQ+IGJvb2wgY29tcGFyZSggVCogbGhzLCBsb25nIGxvbmcgcmhzICkgeworICAgICAgICByZXR1cm4gRXZhbHVhdG9yPFQqLCBUKiwgT3A+OjpldmFsdWF0ZSggbGhzLCByZWludGVycHJldF9jYXN0PFQqPiggcmhzICkgKTsKKyAgICB9CisjZW5kaWYgLy8gQ0FUQ0hfQ09ORklHX0NQUDExX0xPTkdfTE9ORworCisjaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX05VTExQVFIKKyAgICAvLyBwb2ludGVyIHRvIG51bGxwdHJfdCAod2hlbiBjb21wYXJpbmcgYWdhaW5zdCBudWxscHRyKQorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wLCB0eXBlbmFtZSBUPiBib29sIGNvbXBhcmUoIHN0ZDo6bnVsbHB0cl90LCBUKiByaHMgKSB7CisgICAgICAgIHJldHVybiBFdmFsdWF0b3I8VCosIFQqLCBPcD46OmV2YWx1YXRlKCBudWxscHRyLCByaHMgKTsKKyAgICB9CisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3AsIHR5cGVuYW1lIFQ+IGJvb2wgY29tcGFyZSggVCogbGhzLCBzdGQ6Om51bGxwdHJfdCApIHsKKyAgICAgICAgcmV0dXJuIEV2YWx1YXRvcjxUKiwgVCosIE9wPjo6ZXZhbHVhdGUoIGxocywgbnVsbHB0ciApOworICAgIH0KKyNlbmRpZiAvLyBDQVRDSF9DT05GSUdfQ1BQMTFfTlVMTFBUUgorCit9IC8vIGVuZCBvZiBuYW1lc3BhY2UgSW50ZXJuYWwKK30gLy8gZW5kIG9mIG5hbWVzcGFjZSBDYXRjaAorCisjaWZkZWYgX01TQ19WRVIKKyNwcmFnbWEgd2FybmluZyhwb3ApCisjZW5kaWYKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3Rvc3RyaW5nLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1RPU1RSSU5HX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8aW9tYW5pcD4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGNzdGRkZWY+CisKKyNpZmRlZiBfX09CSkNfXworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX29iamNfYXJjLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfT0JKQ19BUkNfSFBQX0lOQ0xVREVECisKKyNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgorCisjaWZkZWYgX19oYXNfZmVhdHVyZQorI2RlZmluZSBDQVRDSF9BUkNfRU5BQkxFRCBfX2hhc19mZWF0dXJlKG9iamNfYXJjKQorI2Vsc2UKKyNkZWZpbmUgQ0FUQ0hfQVJDX0VOQUJMRUQgMAorI2VuZGlmCisKK3ZvaWQgYXJjU2FmZVJlbGVhc2UoIE5TT2JqZWN0KiBvYmogKTsKK2lkIHBlcmZvcm1PcHRpb25hbFNlbGVjdG9yKCBpZCBvYmosIFNFTCBzZWwgKTsKKworI2lmICFDQVRDSF9BUkNfRU5BQkxFRAoraW5saW5lIHZvaWQgYXJjU2FmZVJlbGVhc2UoIE5TT2JqZWN0KiBvYmogKSB7CisgICAgW29iaiByZWxlYXNlXTsKK30KK2lubGluZSBpZCBwZXJmb3JtT3B0aW9uYWxTZWxlY3RvciggaWQgb2JqLCBTRUwgc2VsICkgeworICAgIGlmKCBbb2JqIHJlc3BvbmRzVG9TZWxlY3Rvcjogc2VsXSApCisgICAgICAgIHJldHVybiBbb2JqIHBlcmZvcm1TZWxlY3Rvcjogc2VsXTsKKyAgICByZXR1cm4gbmlsOworfQorI2RlZmluZSBDQVRDSF9VTlNBRkVfVU5SRVRBSU5FRAorI2RlZmluZSBDQVRDSF9BUkNfU1RST05HCisjZWxzZQoraW5saW5lIHZvaWQgYXJjU2FmZVJlbGVhc2UoIE5TT2JqZWN0KiApe30KK2lubGluZSBpZCBwZXJmb3JtT3B0aW9uYWxTZWxlY3RvciggaWQgb2JqLCBTRUwgc2VsICkgeworI2lmZGVmIF9fY2xhbmdfXworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV2FyYy1wZXJmb3JtU2VsZWN0b3ItbGVha3MiCisjZW5kaWYKKyAgICBpZiggW29iaiByZXNwb25kc1RvU2VsZWN0b3I6IHNlbF0gKQorICAgICAgICByZXR1cm4gW29iaiBwZXJmb3JtU2VsZWN0b3I6IHNlbF07CisjaWZkZWYgX19jbGFuZ19fCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCisjZW5kaWYKKyAgICByZXR1cm4gbmlsOworfQorI2RlZmluZSBDQVRDSF9VTlNBRkVfVU5SRVRBSU5FRCBfX3Vuc2FmZV91bnJldGFpbmVkCisjZGVmaW5lIENBVENIX0FSQ19TVFJPTkcgX19zdHJvbmcKKyNlbmRpZgorCisjZW5kaWYKKworI2lmZGVmIENBVENIX0NPTkZJR19DUFAxMV9UVVBMRQorI2luY2x1ZGUgPHR1cGxlPgorI2VuZGlmCisKKyNpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfSVNfRU5VTQorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2VuZGlmCisKK25hbWVzcGFjZSBDYXRjaCB7CisKKy8vIFdoeSB3ZSdyZSBoZXJlLgordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBUIGNvbnN0JiB2YWx1ZSApOworCisvLyBCdWlsdCBpbiBvdmVybG9hZHMKKworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIHN0ZDo6c3RyaW5nIGNvbnN0JiB2YWx1ZSApOworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIHN0ZDo6d3N0cmluZyBjb25zdCYgdmFsdWUgKTsKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBjb25zdCBjaGFyKiBjb25zdCB2YWx1ZSApOworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIGNoYXIqIGNvbnN0IHZhbHVlICk7CitzdGQ6OnN0cmluZyB0b1N0cmluZyggY29uc3Qgd2NoYXJfdCogY29uc3QgdmFsdWUgKTsKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCB3Y2hhcl90KiBjb25zdCB2YWx1ZSApOworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIGludCB2YWx1ZSApOworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIHVuc2lnbmVkIGxvbmcgdmFsdWUgKTsKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCB1bnNpZ25lZCBpbnQgdmFsdWUgKTsKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBjb25zdCBkb3VibGUgdmFsdWUgKTsKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBjb25zdCBmbG9hdCB2YWx1ZSApOworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIGJvb2wgdmFsdWUgKTsKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBjaGFyIHZhbHVlICk7CitzdGQ6OnN0cmluZyB0b1N0cmluZyggc2lnbmVkIGNoYXIgdmFsdWUgKTsKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCB1bnNpZ25lZCBjaGFyIHZhbHVlICk7CisKKyNpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfTE9OR19MT05HCitzdGQ6OnN0cmluZyB0b1N0cmluZyggbG9uZyBsb25nIHZhbHVlICk7CitzdGQ6OnN0cmluZyB0b1N0cmluZyggdW5zaWduZWQgbG9uZyBsb25nIHZhbHVlICk7CisjZW5kaWYKKworI2lmZGVmIENBVENIX0NPTkZJR19DUFAxMV9OVUxMUFRSCitzdGQ6OnN0cmluZyB0b1N0cmluZyggc3RkOjpudWxscHRyX3QgKTsKKyNlbmRpZgorCisjaWZkZWYgX19PQkpDX18KKyAgICBzdGQ6OnN0cmluZyB0b1N0cmluZyggTlNTdHJpbmcgY29uc3QgKiBjb25zdCYgbnNzdHJpbmcgKTsKKyAgICBzdGQ6OnN0cmluZyB0b1N0cmluZyggTlNTdHJpbmcgKiBDQVRDSF9BUkNfU1RST05HIGNvbnN0JiBuc3N0cmluZyApOworICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCBOU09iamVjdCogY29uc3QmIG5zT2JqZWN0ICk7CisjZW5kaWYKKworbmFtZXNwYWNlIERldGFpbCB7CisKKyAgICBleHRlcm4gY29uc3Qgc3RkOjpzdHJpbmcgdW5wcmludGFibGVTdHJpbmc7CisKKyAjaWYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX1NUUkVBTV9JTlNFUlRBQkxFX0NIRUNLKQorICAgIHN0cnVjdCBCb3JnVHlwZSB7CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IEJvcmdUeXBlKCBUIGNvbnN0JiApOworICAgIH07CisKKyAgICBzdHJ1Y3QgVHJ1ZVR5cGUgeyBjaGFyIHNpemVyWzFdOyB9OworICAgIHN0cnVjdCBGYWxzZVR5cGUgeyBjaGFyIHNpemVyWzJdOyB9OworCisgICAgVHJ1ZVR5cGUmIHRlc3RTdHJlYW1hYmxlKCBzdGQ6Om9zdHJlYW0mICk7CisgICAgRmFsc2VUeXBlIHRlc3RTdHJlYW1hYmxlKCBGYWxzZVR5cGUgKTsKKworICAgIEZhbHNlVHlwZSBvcGVyYXRvcjw8KCBzdGQ6Om9zdHJlYW0gY29uc3QmLCBCb3JnVHlwZSBjb25zdCYgKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgc3RydWN0IElzU3RyZWFtSW5zZXJ0YWJsZSB7CisgICAgICAgIHN0YXRpYyBzdGQ6Om9zdHJlYW0gJnM7CisgICAgICAgIHN0YXRpYyBUICBjb25zdCZ0OworICAgICAgICBlbnVtIHsgdmFsdWUgPSBzaXplb2YoIHRlc3RTdHJlYW1hYmxlKHMgPDwgdCkgKSA9PSBzaXplb2YoIFRydWVUeXBlICkgfTsKKyAgICB9OworI2Vsc2UKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGNsYXNzIElzU3RyZWFtSW5zZXJ0YWJsZSB7CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFNTLCB0eXBlbmFtZSBUVD4KKyAgICAgICAgc3RhdGljIGF1dG8gdGVzdChpbnQpCisgICAgICAgIC0+IGRlY2x0eXBlKCBzdGQ6OmRlY2x2YWw8U1MmPigpIDw8IHN0ZDo6ZGVjbHZhbDxUVD4oKSwgc3RkOjp0cnVlX3R5cGUoKSApOworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLCB0eXBlbmFtZT4KKyAgICAgICAgc3RhdGljIGF1dG8gdGVzdCguLi4pIC0+IHN0ZDo6ZmFsc2VfdHlwZTsKKworICAgIHB1YmxpYzoKKyAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBkZWNsdHlwZSh0ZXN0PHN0ZDo6b3N0cmVhbSxjb25zdCBUJj4oMCkpOjp2YWx1ZTsKKyAgICB9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9JU19FTlVNKQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsCisgICAgICAgICAgICAgYm9vbCBJc0VudW0gPSBzdGQ6OmlzX2VudW08VD46OnZhbHVlCisgICAgICAgICAgICAgPgorICAgIHN0cnVjdCBFbnVtU3RyaW5nTWFrZXIKKyAgICB7CisgICAgICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBjb252ZXJ0KCBUIGNvbnN0JiApIHsgcmV0dXJuIHVucHJpbnRhYmxlU3RyaW5nOyB9CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgc3RydWN0IEVudW1TdHJpbmdNYWtlcjxULHRydWU+CisgICAgeworICAgICAgICBzdGF0aWMgc3RkOjpzdHJpbmcgY29udmVydCggVCBjb25zdCYgdiApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA6OkNhdGNoOjp0b1N0cmluZygKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx0eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxUPjo6dHlwZT4odikKKyAgICAgICAgICAgICAgICApOworICAgICAgICB9CisgICAgfTsKKyNlbmRpZgorICAgIHRlbXBsYXRlPGJvb2wgQz4KKyAgICBzdHJ1Y3QgU3RyaW5nTWFrZXJCYXNlIHsKKyNpZiBkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9JU19FTlVNKQorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBzdGF0aWMgc3RkOjpzdHJpbmcgY29udmVydCggVCBjb25zdCYgdiApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBFbnVtU3RyaW5nTWFrZXI8VD46OmNvbnZlcnQoIHYgKTsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGNvbnZlcnQoIFQgY29uc3QmICkgeyByZXR1cm4gdW5wcmludGFibGVTdHJpbmc7IH0KKyNlbmRpZgorICAgIH07CisKKyAgICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IFN0cmluZ01ha2VyQmFzZTx0cnVlPiB7CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBjb252ZXJ0KCBUIGNvbnN0JiBfdmFsdWUgKSB7CisgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICAgICAgb3NzIDw8IF92YWx1ZTsKKyAgICAgICAgICAgIHJldHVybiBvc3Muc3RyKCk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgc3RkOjpzdHJpbmcgcmF3TWVtb3J5VG9TdHJpbmcoIGNvbnN0IHZvaWQgKm9iamVjdCwgc3RkOjpzaXplX3Qgc2l6ZSApOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBpbmxpbmUgc3RkOjpzdHJpbmcgcmF3TWVtb3J5VG9TdHJpbmcoIGNvbnN0IFQmIG9iamVjdCApIHsKKyAgICAgIHJldHVybiByYXdNZW1vcnlUb1N0cmluZyggJm9iamVjdCwgc2l6ZW9mKG9iamVjdCkgKTsKKyAgICB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBEZXRhaWwKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBTdHJpbmdNYWtlciA6CisgICAgRGV0YWlsOjpTdHJpbmdNYWtlckJhc2U8RGV0YWlsOjpJc1N0cmVhbUluc2VydGFibGU8VD46OnZhbHVlPiB7fTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBTdHJpbmdNYWtlcjxUKj4geworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFU+CisgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGNvbnZlcnQoIFUqIHAgKSB7CisgICAgICAgIGlmKCAhcCApCisgICAgICAgICAgICByZXR1cm4gIk5VTEwiOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gRGV0YWlsOjpyYXdNZW1vcnlUb1N0cmluZyggcCApOworICAgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEM+CitzdHJ1Y3QgU3RyaW5nTWFrZXI8UiBDOjoqPiB7CisgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGNvbnZlcnQoIFIgQzo6KiBwICkgeworICAgICAgICBpZiggIXAgKQorICAgICAgICAgICAgcmV0dXJuICJOVUxMIjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIERldGFpbDo6cmF3TWVtb3J5VG9TdHJpbmcoIHAgKTsKKyAgICB9Cit9OworCituYW1lc3BhY2UgRGV0YWlsIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbnB1dEl0ZXJhdG9yPgorICAgIHN0ZDo6c3RyaW5nIHJhbmdlVG9TdHJpbmcoIElucHV0SXRlcmF0b3IgZmlyc3QsIElucHV0SXRlcmF0b3IgbGFzdCApOworfQorCisvL3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEFsbG9jYXRvcj4KKy8vc3RydWN0IFN0cmluZ01ha2VyPHN0ZDo6dmVjdG9yPFQsIEFsbG9jYXRvcj4gPiB7CisvLyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgY29udmVydCggc3RkOjp2ZWN0b3I8VCxBbGxvY2F0b3I+IGNvbnN0JiB2ICkgeworLy8gICAgICAgIHJldHVybiBEZXRhaWw6OnJhbmdlVG9TdHJpbmcoIHYuYmVnaW4oKSwgdi5lbmQoKSApOworLy8gICAgfQorLy99OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBBbGxvY2F0b3I+CitzdGQ6OnN0cmluZyB0b1N0cmluZyggc3RkOjp2ZWN0b3I8VCxBbGxvY2F0b3I+IGNvbnN0JiB2ICkgeworICAgIHJldHVybiBEZXRhaWw6OnJhbmdlVG9TdHJpbmcoIHYuYmVnaW4oKSwgdi5lbmQoKSApOworfQorCisjaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX1RVUExFCisKKy8vIHRvU3RyaW5nIGZvciB0dXBsZXMKK25hbWVzcGFjZSBUdXBsZURldGFpbCB7CisgIHRlbXBsYXRlPAorICAgICAgdHlwZW5hbWUgVHVwbGUsCisgICAgICBzdGQ6OnNpemVfdCBOID0gMCwKKyAgICAgIGJvb2wgPSAoTiA8IHN0ZDo6dHVwbGVfc2l6ZTxUdXBsZT46OnZhbHVlKQorICAgICAgPgorICBzdHJ1Y3QgRWxlbWVudFByaW50ZXIgeworICAgICAgc3RhdGljIHZvaWQgcHJpbnQoIGNvbnN0IFR1cGxlJiB0dXBsZSwgc3RkOjpvc3RyZWFtJiBvcyApCisgICAgICB7CisgICAgICAgICAgb3MgPDwgKCBOID8gIiwgIiA6ICIgIiApCisgICAgICAgICAgICAgPDwgQ2F0Y2g6OnRvU3RyaW5nKHN0ZDo6Z2V0PE4+KHR1cGxlKSk7CisgICAgICAgICAgRWxlbWVudFByaW50ZXI8VHVwbGUsTisxPjo6cHJpbnQodHVwbGUsb3MpOworICAgICAgfQorICB9OworCisgIHRlbXBsYXRlPAorICAgICAgdHlwZW5hbWUgVHVwbGUsCisgICAgICBzdGQ6OnNpemVfdCBOCisgICAgICA+CisgIHN0cnVjdCBFbGVtZW50UHJpbnRlcjxUdXBsZSxOLGZhbHNlPiB7CisgICAgICBzdGF0aWMgdm9pZCBwcmludCggY29uc3QgVHVwbGUmLCBzdGQ6Om9zdHJlYW0mICkge30KKyAgfTsKKworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5UeXBlcz4KK3N0cnVjdCBTdHJpbmdNYWtlcjxzdGQ6OnR1cGxlPFR5cGVzLi4uPj4geworCisgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGNvbnZlcnQoIGNvbnN0IHN0ZDo6dHVwbGU8VHlwZXMuLi4+JiB0dXBsZSApCisgICAgeworICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7CisgICAgICAgIG9zIDw8ICd7JzsKKyAgICAgICAgVHVwbGVEZXRhaWw6OkVsZW1lbnRQcmludGVyPHN0ZDo6dHVwbGU8VHlwZXMuLi4+Pjo6cHJpbnQoIHR1cGxlLCBvcyApOworICAgICAgICBvcyA8PCAiIH0iOworICAgICAgICByZXR1cm4gb3Muc3RyKCk7CisgICAgfQorfTsKKyNlbmRpZiAvLyBDQVRDSF9DT05GSUdfQ1BQMTFfVFVQTEUKKworbmFtZXNwYWNlIERldGFpbCB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdGQ6OnN0cmluZyBtYWtlU3RyaW5nKCBUIGNvbnN0JiB2YWx1ZSApIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZ01ha2VyPFQ+Ojpjb252ZXJ0KCB2YWx1ZSApOworICAgIH0KK30gLy8gZW5kIG5hbWVzcGFjZSBEZXRhaWwKKworLy8vIFxicmllZiBjb252ZXJ0cyBhbnkgdHlwZSB0byBhIHN0cmluZworLy8vCisvLy8gVGhlIGRlZmF1bHQgdGVtcGxhdGUgZm9yd2FyZHMgb24gdG8gb3N0cmluZ3N0cmVhbSAtIGV4Y2VwdCB3aGVuIGFuCisvLy8gb3N0cmluZ3N0cmVhbSBvdmVybG9hZCBkb2VzIG5vdCBleGlzdCAtIGluIHdoaWNoIGNhc2UgaXQgYXR0ZW1wdHMgdG8gZGV0ZWN0CisvLy8gdGhhdCBhbmQgd3JpdGVzIHs/fS4KKy8vLyBPdmVybG9hZCAobm90IHNwZWNpYWxpc2UpIHRoaXMgdGVtcGxhdGUgZm9yIGN1c3RvbSB0eXBzIHRoYXQgeW91IGRvbid0IHdhbnQKKy8vLyB0byBwcm92aWRlIGFuIG9zdHJlYW0gb3ZlcmxvYWQgZm9yLgordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBUIGNvbnN0JiB2YWx1ZSApIHsKKyAgICByZXR1cm4gU3RyaW5nTWFrZXI8VD46OmNvbnZlcnQoIHZhbHVlICk7Cit9CisKKyAgICBuYW1lc3BhY2UgRGV0YWlsIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbnB1dEl0ZXJhdG9yPgorICAgIHN0ZDo6c3RyaW5nIHJhbmdlVG9TdHJpbmcoIElucHV0SXRlcmF0b3IgZmlyc3QsIElucHV0SXRlcmF0b3IgbGFzdCApIHsKKyAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgb3NzIDw8ICJ7ICI7CisgICAgICAgIGlmKCBmaXJzdCAhPSBsYXN0ICkgeworICAgICAgICAgICAgb3NzIDw8IENhdGNoOjp0b1N0cmluZyggKmZpcnN0ICk7CisgICAgICAgICAgICBmb3IoICsrZmlyc3QgOyBmaXJzdCAhPSBsYXN0IDsgKytmaXJzdCApCisgICAgICAgICAgICAgICAgb3NzIDw8ICIsICIgPDwgQ2F0Y2g6OnRvU3RyaW5nKCAqZmlyc3QgKTsKKyAgICAgICAgfQorICAgICAgICBvc3MgPDwgIiB9IjsKKyAgICAgICAgcmV0dXJuIG9zcy5zdHIoKTsKKyAgICB9Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCituYW1lc3BhY2UgQ2F0Y2ggeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHNULCBJbnRlcm5hbDo6T3BlcmF0b3IgT3AsIHR5cGVuYW1lIFJoc1Q+CitjbGFzcyBCaW5hcnlFeHByZXNzaW9uOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBBcmdULCB0eXBlbmFtZSBNYXRjaGVyVD4KK2NsYXNzIE1hdGNoRXhwcmVzc2lvbjsKKworLy8gV3JhcHMgdGhlIExIUyBvZiBhbiBleHByZXNzaW9uIGFuZCBvdmVybG9hZHMgY29tcGFyaXNvbiBvcGVyYXRvcnMKKy8vIGZvciBhbHNvIGNhcHR1cmluZyB0aG9zZSBhbmQgUkhTIChpZiBhbnkpCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgRXhwcmVzc2lvbkxocyA6IHB1YmxpYyBEZWNvbXBvc2VkRXhwcmVzc2lvbiB7CitwdWJsaWM6CisgICAgRXhwcmVzc2lvbkxocyggUmVzdWx0QnVpbGRlciYgcmIsIFQgbGhzICkgOiBtX3JiKCByYiApLCBtX2xocyggbGhzICksIG1fdHJ1dGh5KGZhbHNlKSB7fQorCisgICAgRXhwcmVzc2lvbkxocyYgb3BlcmF0b3IgPSAoIGNvbnN0IEV4cHJlc3Npb25MaHMmICk7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSaHNUPgorICAgIEJpbmFyeUV4cHJlc3Npb248VCwgSW50ZXJuYWw6OklzRXF1YWxUbywgUmhzVCBjb25zdCY+CisgICAgb3BlcmF0b3IgPT0gKCBSaHNUIGNvbnN0JiByaHMgKSB7CisgICAgICAgIHJldHVybiBjYXB0dXJlRXhwcmVzc2lvbjxJbnRlcm5hbDo6SXNFcXVhbFRvPiggcmhzICk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUmhzVD4KKyAgICBCaW5hcnlFeHByZXNzaW9uPFQsIEludGVybmFsOjpJc05vdEVxdWFsVG8sIFJoc1QgY29uc3QmPgorICAgIG9wZXJhdG9yICE9ICggUmhzVCBjb25zdCYgcmhzICkgeworICAgICAgICByZXR1cm4gY2FwdHVyZUV4cHJlc3Npb248SW50ZXJuYWw6OklzTm90RXF1YWxUbz4oIHJocyApOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJoc1Q+CisgICAgQmluYXJ5RXhwcmVzc2lvbjxULCBJbnRlcm5hbDo6SXNMZXNzVGhhbiwgUmhzVCBjb25zdCY+CisgICAgb3BlcmF0b3IgPCAoIFJoc1QgY29uc3QmIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGNhcHR1cmVFeHByZXNzaW9uPEludGVybmFsOjpJc0xlc3NUaGFuPiggcmhzICk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUmhzVD4KKyAgICBCaW5hcnlFeHByZXNzaW9uPFQsIEludGVybmFsOjpJc0dyZWF0ZXJUaGFuLCBSaHNUIGNvbnN0Jj4KKyAgICBvcGVyYXRvciA+ICggUmhzVCBjb25zdCYgcmhzICkgeworICAgICAgICByZXR1cm4gY2FwdHVyZUV4cHJlc3Npb248SW50ZXJuYWw6OklzR3JlYXRlclRoYW4+KCByaHMgKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSaHNUPgorICAgIEJpbmFyeUV4cHJlc3Npb248VCwgSW50ZXJuYWw6OklzTGVzc1RoYW5PckVxdWFsVG8sIFJoc1QgY29uc3QmPgorICAgIG9wZXJhdG9yIDw9ICggUmhzVCBjb25zdCYgcmhzICkgeworICAgICAgICByZXR1cm4gY2FwdHVyZUV4cHJlc3Npb248SW50ZXJuYWw6OklzTGVzc1RoYW5PckVxdWFsVG8+KCByaHMgKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSaHNUPgorICAgIEJpbmFyeUV4cHJlc3Npb248VCwgSW50ZXJuYWw6OklzR3JlYXRlclRoYW5PckVxdWFsVG8sIFJoc1QgY29uc3QmPgorICAgIG9wZXJhdG9yID49ICggUmhzVCBjb25zdCYgcmhzICkgeworICAgICAgICByZXR1cm4gY2FwdHVyZUV4cHJlc3Npb248SW50ZXJuYWw6OklzR3JlYXRlclRoYW5PckVxdWFsVG8+KCByaHMgKTsKKyAgICB9CisKKyAgICBCaW5hcnlFeHByZXNzaW9uPFQsIEludGVybmFsOjpJc0VxdWFsVG8sIGJvb2w+IG9wZXJhdG9yID09ICggYm9vbCByaHMgKSB7CisgICAgICAgIHJldHVybiBjYXB0dXJlRXhwcmVzc2lvbjxJbnRlcm5hbDo6SXNFcXVhbFRvPiggcmhzICk7CisgICAgfQorCisgICAgQmluYXJ5RXhwcmVzc2lvbjxULCBJbnRlcm5hbDo6SXNOb3RFcXVhbFRvLCBib29sPiBvcGVyYXRvciAhPSAoIGJvb2wgcmhzICkgeworICAgICAgICByZXR1cm4gY2FwdHVyZUV4cHJlc3Npb248SW50ZXJuYWw6OklzTm90RXF1YWxUbz4oIHJocyApOworICAgIH0KKworICAgIHZvaWQgZW5kRXhwcmVzc2lvbigpIHsKKyAgICAgICAgbV90cnV0aHkgPSBtX2xocyA/IHRydWUgOiBmYWxzZTsKKyAgICAgICAgbV9yYgorICAgICAgICAgICAgLnNldFJlc3VsdFR5cGUoIG1fdHJ1dGh5ICkKKyAgICAgICAgICAgIC5lbmRFeHByZXNzaW9uKCAqdGhpcyApOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCByZWNvbnN0cnVjdEV4cHJlc3Npb24oIHN0ZDo6c3RyaW5nJiBkZXN0ICkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICBkZXN0ID0gQ2F0Y2g6OnRvU3RyaW5nKCBtX3RydXRoeSApOworICAgIH0KKworcHJpdmF0ZToKKyAgICB0ZW1wbGF0ZTxJbnRlcm5hbDo6T3BlcmF0b3IgT3AsIHR5cGVuYW1lIFJoc1Q+CisgICAgQmluYXJ5RXhwcmVzc2lvbjxULCBPcCwgUmhzVCY+IGNhcHR1cmVFeHByZXNzaW9uKCBSaHNUJiByaHMgKSBjb25zdCB7CisgICAgICAgIHJldHVybiBCaW5hcnlFeHByZXNzaW9uPFQsIE9wLCBSaHNUJj4oIG1fcmIsIG1fbGhzLCByaHMgKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTxJbnRlcm5hbDo6T3BlcmF0b3IgT3A+CisgICAgQmluYXJ5RXhwcmVzc2lvbjxULCBPcCwgYm9vbD4gY2FwdHVyZUV4cHJlc3Npb24oIGJvb2wgcmhzICkgY29uc3QgeworICAgICAgICByZXR1cm4gQmluYXJ5RXhwcmVzc2lvbjxULCBPcCwgYm9vbD4oIG1fcmIsIG1fbGhzLCByaHMgKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgUmVzdWx0QnVpbGRlciYgbV9yYjsKKyAgICBUIG1fbGhzOworICAgIGJvb2wgbV90cnV0aHk7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHNULCBJbnRlcm5hbDo6T3BlcmF0b3IgT3AsIHR5cGVuYW1lIFJoc1Q+CitjbGFzcyBCaW5hcnlFeHByZXNzaW9uIDogcHVibGljIERlY29tcG9zZWRFeHByZXNzaW9uIHsKK3B1YmxpYzoKKyAgICBCaW5hcnlFeHByZXNzaW9uKCBSZXN1bHRCdWlsZGVyJiByYiwgTGhzVCBsaHMsIFJoc1QgcmhzICkKKyAgICAgICAgOiBtX3JiKCByYiApLCBtX2xocyggbGhzICksIG1fcmhzKCByaHMgKSB7fQorCisgICAgQmluYXJ5RXhwcmVzc2lvbiYgb3BlcmF0b3IgPSAoIEJpbmFyeUV4cHJlc3Npb24mICk7CisKKyAgICB2b2lkIGVuZEV4cHJlc3Npb24oKSBjb25zdCB7CisgICAgICAgIG1fcmIKKyAgICAgICAgICAgIC5zZXRSZXN1bHRUeXBlKCBJbnRlcm5hbDo6Y29tcGFyZTxPcD4oIG1fbGhzLCBtX3JocyApICkKKyAgICAgICAgICAgIC5lbmRFeHByZXNzaW9uKCAqdGhpcyApOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBpc0JpbmFyeUV4cHJlc3Npb24oKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCByZWNvbnN0cnVjdEV4cHJlc3Npb24oIHN0ZDo6c3RyaW5nJiBkZXN0ICkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICBzdGQ6OnN0cmluZyBsaHMgPSBDYXRjaDo6dG9TdHJpbmcoIG1fbGhzICk7CisgICAgICAgIHN0ZDo6c3RyaW5nIHJocyA9IENhdGNoOjp0b1N0cmluZyggbV9yaHMgKTsKKyAgICAgICAgY2hhciBkZWxpbSA9IGxocy5zaXplKCkgKyByaHMuc2l6ZSgpIDwgNDAgJiYKKyAgICAgICAgICAgICAgICAgICAgIGxocy5maW5kKCdcbicpID09IHN0ZDo6c3RyaW5nOjpucG9zICYmCisgICAgICAgICAgICAgICAgICAgICByaHMuZmluZCgnXG4nKSA9PSBzdGQ6OnN0cmluZzo6bnBvcyA/ICcgJyA6ICdcbic7CisgICAgICAgIGRlc3QucmVzZXJ2ZSggNyArIGxocy5zaXplKCkgKyByaHMuc2l6ZSgpICk7CisgICAgICAgICAgICAgICAgICAgLy8gMiBmb3Igc3BhY2VzIGFyb3VuZCBvcGVyYXRvcgorICAgICAgICAgICAgICAgICAgIC8vIDIgZm9yIG9wZXJhdG9yCisgICAgICAgICAgICAgICAgICAgLy8gMiBmb3IgcGFyZW50aGVzZXMgKGNvbmRpdGlvbmFsbHkgYWRkZWQgbGF0ZXIpCisgICAgICAgICAgICAgICAgICAgLy8gMSBmb3IgbmVnYXRpb24gKGNvbmRpdGlvbmFsbHkgYWRkZWQgbGF0ZXIpCisgICAgICAgIGRlc3QgPSBsaHM7CisgICAgICAgIGRlc3QgKz0gZGVsaW07CisgICAgICAgIGRlc3QgKz0gSW50ZXJuYWw6Ok9wZXJhdG9yVHJhaXRzPE9wPjo6Z2V0TmFtZSgpOworICAgICAgICBkZXN0ICs9IGRlbGltOworICAgICAgICBkZXN0ICs9IHJoczsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgUmVzdWx0QnVpbGRlciYgbV9yYjsKKyAgICBMaHNUIG1fbGhzOworICAgIFJoc1QgbV9yaHM7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBBcmdULCB0eXBlbmFtZSBNYXRjaGVyVD4KK2NsYXNzIE1hdGNoRXhwcmVzc2lvbiA6IHB1YmxpYyBEZWNvbXBvc2VkRXhwcmVzc2lvbiB7CitwdWJsaWM6CisgICAgTWF0Y2hFeHByZXNzaW9uKCBBcmdUIGFyZywgTWF0Y2hlclQgbWF0Y2hlciwgY2hhciBjb25zdCogbWF0Y2hlclN0cmluZyApCisgICAgICAgIDogbV9hcmcoIGFyZyApLCBtX21hdGNoZXIoIG1hdGNoZXIgKSwgbV9tYXRjaGVyU3RyaW5nKCBtYXRjaGVyU3RyaW5nICkge30KKworICAgIHZpcnR1YWwgYm9vbCBpc0JpbmFyeUV4cHJlc3Npb24oKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCByZWNvbnN0cnVjdEV4cHJlc3Npb24oIHN0ZDo6c3RyaW5nJiBkZXN0ICkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICBzdGQ6OnN0cmluZyBtYXRjaGVyQXNTdHJpbmcgPSBtX21hdGNoZXIudG9TdHJpbmcoKTsKKyAgICAgICAgZGVzdCA9IENhdGNoOjp0b1N0cmluZyggbV9hcmcgKTsKKyAgICAgICAgZGVzdCArPSAnICc7CisgICAgICAgIGlmKCBtYXRjaGVyQXNTdHJpbmcgPT0gRGV0YWlsOjp1bnByaW50YWJsZVN0cmluZyApCisgICAgICAgICAgICBkZXN0ICs9IG1fbWF0Y2hlclN0cmluZzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZGVzdCArPSBtYXRjaGVyQXNTdHJpbmc7CisgICAgfQorCitwcml2YXRlOgorICAgIEFyZ1QgbV9hcmc7CisgICAgTWF0Y2hlclQgbV9tYXRjaGVyOworICAgIGNoYXIgY29uc3QqIG1fbWF0Y2hlclN0cmluZzsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGlubGluZSBFeHByZXNzaW9uTGhzPFQgY29uc3QmPiBSZXN1bHRCdWlsZGVyOjpvcGVyYXRvciA8PSAoIFQgY29uc3QmIG9wZXJhbmQgKSB7CisgICAgICAgIHJldHVybiBFeHByZXNzaW9uTGhzPFQgY29uc3QmPiggKnRoaXMsIG9wZXJhbmQgKTsKKyAgICB9CisKKyAgICBpbmxpbmUgRXhwcmVzc2lvbkxoczxib29sPiBSZXN1bHRCdWlsZGVyOjpvcGVyYXRvciA8PSAoIGJvb2wgdmFsdWUgKSB7CisgICAgICAgIHJldHVybiBFeHByZXNzaW9uTGhzPGJvb2w+KCAqdGhpcywgdmFsdWUgKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBcmdULCB0eXBlbmFtZSBNYXRjaGVyVD4KKyAgICBpbmxpbmUgdm9pZCBSZXN1bHRCdWlsZGVyOjpjYXB0dXJlTWF0Y2goIEFyZ1QgY29uc3QmIGFyZywgTWF0Y2hlclQgY29uc3QmIG1hdGNoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNvbnN0KiBtYXRjaGVyU3RyaW5nICkgeworICAgICAgICBNYXRjaEV4cHJlc3Npb248QXJnVCBjb25zdCYsIE1hdGNoZXJUIGNvbnN0Jj4gZXhwciggYXJnLCBtYXRjaGVyLCBtYXRjaGVyU3RyaW5nICk7CisgICAgICAgIHNldFJlc3VsdFR5cGUoIG1hdGNoZXIubWF0Y2goIGFyZyApICk7CisgICAgICAgIGVuZEV4cHJlc3Npb24oIGV4cHIgKTsKKyAgICB9CisKK30gLy8gbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9tZXNzYWdlLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX01FU1NBR0VfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IE1lc3NhZ2VJbmZvIHsKKyAgICAgICAgTWVzc2FnZUluZm8oICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfbWFjcm9OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTGluZUluZm8gY29uc3QmIF9saW5lSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdFdhczo6T2ZUeXBlIF90eXBlICk7CisKKyAgICAgICAgc3RkOjpzdHJpbmcgbWFjcm9OYW1lOworICAgICAgICBTb3VyY2VMaW5lSW5mbyBsaW5lSW5mbzsKKyAgICAgICAgUmVzdWx0V2FzOjpPZlR5cGUgdHlwZTsKKyAgICAgICAgc3RkOjpzdHJpbmcgbWVzc2FnZTsKKyAgICAgICAgdW5zaWduZWQgaW50IHNlcXVlbmNlOworCisgICAgICAgIGJvb2wgb3BlcmF0b3IgPT0gKCBNZXNzYWdlSW5mbyBjb25zdCYgb3RoZXIgKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gc2VxdWVuY2UgPT0gb3RoZXIuc2VxdWVuY2U7CisgICAgICAgIH0KKyAgICAgICAgYm9vbCBvcGVyYXRvciA8ICggTWVzc2FnZUluZm8gY29uc3QmIG90aGVyICkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIHNlcXVlbmNlIDwgb3RoZXIuc2VxdWVuY2U7CisgICAgICAgIH0KKyAgICBwcml2YXRlOgorICAgICAgICBzdGF0aWMgdW5zaWduZWQgaW50IGdsb2JhbENvdW50OworICAgIH07CisKKyAgICBzdHJ1Y3QgTWVzc2FnZUJ1aWxkZXIgeworICAgICAgICBNZXNzYWdlQnVpbGRlciggc3RkOjpzdHJpbmcgY29uc3QmIG1hY3JvTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBsaW5lSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdFdhczo6T2ZUeXBlIHR5cGUgKQorICAgICAgICA6IG1faW5mbyggbWFjcm9OYW1lLCBsaW5lSW5mbywgdHlwZSApCisgICAgICAgIHt9CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgTWVzc2FnZUJ1aWxkZXImIG9wZXJhdG9yIDw8ICggVCBjb25zdCYgdmFsdWUgKSB7CisgICAgICAgICAgICBtX3N0cmVhbSA8PCB2YWx1ZTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIE1lc3NhZ2VJbmZvIG1faW5mbzsKKyAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG1fc3RyZWFtOworICAgIH07CisKKyAgICBjbGFzcyBTY29wZWRNZXNzYWdlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFNjb3BlZE1lc3NhZ2UoIE1lc3NhZ2VCdWlsZGVyIGNvbnN0JiBidWlsZGVyICk7CisgICAgICAgIFNjb3BlZE1lc3NhZ2UoIFNjb3BlZE1lc3NhZ2UgY29uc3QmIG90aGVyICk7CisgICAgICAgIH5TY29wZWRNZXNzYWdlKCk7CisKKyAgICAgICAgTWVzc2FnZUluZm8gbV9pbmZvOworICAgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfaW50ZXJmYWNlc19jYXB0dXJlLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0lOVEVSRkFDRVNfQ0FQVFVSRV9IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBjbGFzcyBUZXN0Q2FzZTsKKyAgICBjbGFzcyBBc3NlcnRpb25SZXN1bHQ7CisgICAgc3RydWN0IEFzc2VydGlvbkluZm87CisgICAgc3RydWN0IFNlY3Rpb25JbmZvOworICAgIHN0cnVjdCBTZWN0aW9uRW5kSW5mbzsKKyAgICBzdHJ1Y3QgTWVzc2FnZUluZm87CisgICAgY2xhc3MgU2NvcGVkTWVzc2FnZUJ1aWxkZXI7CisgICAgc3RydWN0IENvdW50czsKKworICAgIHN0cnVjdCBJUmVzdWx0Q2FwdHVyZSB7CisKKyAgICAgICAgdmlydHVhbCB+SVJlc3VsdENhcHR1cmUoKTsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgYXNzZXJ0aW9uRW5kZWQoIEFzc2VydGlvblJlc3VsdCBjb25zdCYgcmVzdWx0ICkgPSAwOworICAgICAgICB2aXJ0dWFsIGJvb2wgc2VjdGlvblN0YXJ0ZWQoICAgIFNlY3Rpb25JbmZvIGNvbnN0JiBzZWN0aW9uSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3VudHMmIGFzc2VydGlvbnMgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uRW5kZWQoIFNlY3Rpb25FbmRJbmZvIGNvbnN0JiBlbmRJbmZvICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvbkVuZGVkRWFybHkoIFNlY3Rpb25FbmRJbmZvIGNvbnN0JiBlbmRJbmZvICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgcHVzaFNjb3BlZE1lc3NhZ2UoIE1lc3NhZ2VJbmZvIGNvbnN0JiBtZXNzYWdlICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgcG9wU2NvcGVkTWVzc2FnZSggTWVzc2FnZUluZm8gY29uc3QmIG1lc3NhZ2UgKSA9IDA7CisKKyAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRDdXJyZW50VGVzdE5hbWUoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgY29uc3QgQXNzZXJ0aW9uUmVzdWx0KiBnZXRMYXN0UmVzdWx0KCkgY29uc3QgPSAwOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBleGNlcHRpb25FYXJseVJlcG9ydGVkKCkgPSAwOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBoYW5kbGVGYXRhbEVycm9yQ29uZGl0aW9uKCBzdGQ6OnN0cmluZyBjb25zdCYgbWVzc2FnZSApID0gMDsKKyAgICB9OworCisgICAgSVJlc3VsdENhcHR1cmUmIGdldFJlc3VsdENhcHR1cmUoKTsKK30KKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2RlYnVnZ2VyLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0RFQlVHR0VSX0hfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3BsYXRmb3JtLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1BMQVRGT1JNX0hfSU5DTFVERUQKKworI2lmIGRlZmluZWQoX19NQUNfT1NfWF9WRVJTSU9OX01JTl9SRVFVSVJFRCkKKyMgIGRlZmluZSBDQVRDSF9QTEFURk9STV9NQUMKKyNlbGlmICBkZWZpbmVkKF9fSVBIT05FX09TX1ZFUlNJT05fTUlOX1JFUVVJUkVEKQorIyAgZGVmaW5lIENBVENIX1BMQVRGT1JNX0lQSE9ORQorI2VsaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX2xpbnV4KSB8fCBkZWZpbmVkKF9fbGludXhfXykKKyMgIGRlZmluZSBDQVRDSF9QTEFURk9STV9MSU5VWAorI2VsaWYgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfX1dJTjMyX18pIHx8IGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9NU0NfVkVSKQorIyAgZGVmaW5lIENBVENIX1BMQVRGT1JNX1dJTkRPV1MKKyMgIGlmICFkZWZpbmVkKE5PTUlOTUFYKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfTk9fTk9NSU5NQVgpCisjICAgIGRlZmluZSBDQVRDSF9ERUZJTkVTX05PTUlOTUFYCisjICBlbmRpZgorIyAgaWYgIWRlZmluZWQoV0lOMzJfTEVBTl9BTkRfTUVBTikgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX05PX1dJTjMyX0xFQU5fQU5EX01FQU4pCisjICAgIGRlZmluZSBDQVRDSF9ERUZJTkVTX1dJTjMyX0xFQU5fQU5EX01FQU4KKyMgIGVuZGlmCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIENhdGNoeworCisgICAgYm9vbCBpc0RlYnVnZ2VyQWN0aXZlKCk7CisgICAgdm9pZCB3cml0ZVRvRGVidWdDb25zb2xlKCBzdGQ6OnN0cmluZyBjb25zdCYgdGV4dCApOworfQorCisjaWZkZWYgQ0FUQ0hfUExBVEZPUk1fTUFDCisKKyAgICAvLyBUaGUgZm9sbG93aW5nIGNvZGUgc25pcHBldCBiYXNlZCBvbjoKKyAgICAvLyBodHRwOi8vY29jb2F3aXRobG92ZS5jb20vMjAwOC8wMy9icmVhay1pbnRvLWRlYnVnZ2VyLmh0bWwKKyAgICAjaWYgZGVmaW5lZChfX3BwYzY0X18pIHx8IGRlZmluZWQoX19wcGNfXykKKyAgICAgICAgI2RlZmluZSBDQVRDSF9UUkFQKCkgXAorICAgICAgICAgICAgICAgIF9fYXNtX18oImxpIHIwLCAyMFxuc2Ncbm5vcFxubGkgcjAsIDM3XG5saSByNCwgMlxuc2Ncbm5vcFxuIiBcCisgICAgICAgICAgICAgICAgOiA6IDogIm1lbW9yeSIsInIwIiwicjMiLCJyNCIgKQorICAgICNlbHNlCisgICAgICAgICNkZWZpbmUgQ0FUQ0hfVFJBUCgpIF9fYXNtX18oImludCAkM1xuIiA6IDogKQorICAgICNlbmRpZgorCisjZWxpZiBkZWZpbmVkKENBVENIX1BMQVRGT1JNX0xJTlVYKQorICAgIC8vIElmIHdlIGNhbiB1c2UgaW5saW5lIGFzc2VtYmxlciwgZG8gaXQgYmVjYXVzZSB0aGlzIGFsbG93cyB1cyB0byBicmVhaworICAgIC8vIGRpcmVjdGx5IGF0IHRoZSBsb2NhdGlvbiBvZiB0aGUgZmFpbGluZyBjaGVjayBpbnN0ZWFkIG9mIGJyZWFraW5nIGluc2lkZQorICAgIC8vIHJhaXNlKCkgY2FsbGVkIGZyb20gaXQsIGkuZS4gb25lIHN0YWNrIGZyYW1lIGJlbG93LgorICAgICNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoZGVmaW5lZChfX2kzODYpIHx8IGRlZmluZWQoX194ODZfNjQpKQorICAgICAgICAjZGVmaW5lIENBVENIX1RSQVAoKSBhc20gdm9sYXRpbGUgKCJpbnQgJDMiKQorICAgICNlbHNlIC8vIEZhbGwgYmFjayB0byB0aGUgZ2VuZXJpYyB3YXkuCisgICAgICAgICNpbmNsdWRlIDxzaWduYWwuaD4KKworICAgICAgICAjZGVmaW5lIENBVENIX1RSQVAoKSByYWlzZShTSUdUUkFQKQorICAgICNlbmRpZgorI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKKyAgICAjZGVmaW5lIENBVENIX1RSQVAoKSBfX2RlYnVnYnJlYWsoKQorI2VsaWYgZGVmaW5lZChfX01JTkdXMzJfXykKKyAgICBleHRlcm4gIkMiIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSB2b2lkIF9fc3RkY2FsbCBEZWJ1Z0JyZWFrKCk7CisgICAgI2RlZmluZSBDQVRDSF9UUkFQKCkgRGVidWdCcmVhaygpCisjZW5kaWYKKworI2lmZGVmIENBVENIX1RSQVAKKyAgICAjZGVmaW5lIENBVENIX0JSRUFLX0lOVE9fREVCVUdHRVIoKSBpZiggQ2F0Y2g6OmlzRGVidWdnZXJBY3RpdmUoKSApIHsgQ0FUQ0hfVFJBUCgpOyB9CisjZWxzZQorICAgICNkZWZpbmUgQ0FUQ0hfQlJFQUtfSU5UT19ERUJVR0dFUigpIENhdGNoOjphbHdheXNUcnVlKCk7CisjZW5kaWYKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2ludGVyZmFjZXNfcnVubmVyLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0lOVEVSRkFDRVNfUlVOTkVSX0hfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKKyAgICBjbGFzcyBUZXN0Q2FzZTsKKworICAgIHN0cnVjdCBJUnVubmVyIHsKKyAgICAgICAgdmlydHVhbCB+SVJ1bm5lcigpOworICAgICAgICB2aXJ0dWFsIGJvb2wgYWJvcnRpbmcoKSBjb25zdCA9IDA7CisgICAgfTsKK30KKworI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0ZBU1RfQ09NUElMRSkKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFdlIGNhbiBzcGVlZHVwIGNvbXBpbGF0aW9uIHNpZ25pZmljYW50bHkgYnkgYnJlYWtpbmcgaW50byBkZWJ1Z2dlciBsb3dlciBpbgorLy8gdGhlIGNhbGxzdGFjaywgYmVjYXVzZSB0aGVuIHdlIGRvbid0IGhhdmUgdG8gZXhwYW5kIENBVENIX0JSRUFLX0lOVE9fREVCVUdHRVIKKy8vIG1hY3JvIGluIGVhY2ggYXNzZXJ0aW9uCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX1JFQUNUKCByZXN1bHRCdWlsZGVyICkgXAorICAgIHJlc3VsdEJ1aWxkZXIucmVhY3QoKTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQW5vdGhlciB3YXkgdG8gc3BlZWQtdXAgY29tcGlsYXRpb24gaXMgdG8gb21pdCBsb2NhbCB0cnktY2F0Y2ggZm9yIFJFUVVJUkUqCisvLyBtYWNyb3MuCisvLyBUaGlzIGNhbiBwb3RlbnRpYWxseSBjYXVzZSBmYWxzZSBuZWdhdGl2ZSwgaWYgdGhlIHRlc3QgY29kZSBjYXRjaGVzCisvLyB0aGUgZXhjZXB0aW9uIGJlZm9yZSBpdCBwcm9wYWdhdGVzIGJhY2sgdXAgdG8gdGhlIHJ1bm5lci4KKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVEVTVF9OT19UUlkoIG1hY3JvTmFtZSwgcmVzdWx0RGlzcG9zaXRpb24sIGV4cHIgKSBcCisgICAgZG8geyBcCisgICAgICAgIENhdGNoOjpSZXN1bHRCdWlsZGVyIF9fY2F0Y2hSZXN1bHQoIG1hY3JvTmFtZSwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8sICNleHByLCByZXN1bHREaXNwb3NpdGlvbiApOyBcCisgICAgICAgIF9fY2F0Y2hSZXN1bHQuc2V0RXhjZXB0aW9uR3VhcmQoKTsgXAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19QQVJFTlRIRVNFU19XQVJOSU5HUyBcCisgICAgICAgICggX19jYXRjaFJlc3VsdCA8PSBleHByICkuZW5kRXhwcmVzc2lvbigpOyBcCisgICAgICAgIENBVENIX0lOVEVSTkFMX1VOU1VQUFJFU1NfUEFSRU5USEVTRVNfV0FSTklOR1MgXAorICAgICAgICBfX2NhdGNoUmVzdWx0LnVuc2V0RXhjZXB0aW9uR3VhcmQoKTsgXAorICAgICAgICBJTlRFUk5BTF9DQVRDSF9SRUFDVCggX19jYXRjaFJlc3VsdCApIFwKKyAgICB9IHdoaWxlKCBDYXRjaDo6aXNUcnVlKCBmYWxzZSAmJiBzdGF0aWNfY2FzdDxib29sPiggISEoZXhwcikgKSApICkgLy8gZXhwciBoZXJlIGlzIG5ldmVyIGV2YWx1YXRlZCBhdCBydW50aW1lIGJ1dCBpdCBmb3JjZXMgdGhlIGNvbXBpbGVyIHRvIGdpdmUgaXQgYSBsb29rCisvLyBUaGUgZG91YmxlIG5lZ2F0aW9uIHNpbGVuY2VzIE1TVkMncyBDNDgwMCB3YXJuaW5nLCB0aGUgc3RhdGljX2Nhc3QgZm9yY2VzIHNob3J0LWNpcmN1aXQgZXZhbHVhdGlvbiBpZiB0aGUgdHlwZSBoYXMgb3ZlcmxvYWRlZCAmJi4KKworI2RlZmluZSBJTlRFUk5BTF9DSEVDS19USEFUX05PX1RSWSggbWFjcm9OYW1lLCBtYXRjaGVyLCByZXN1bHREaXNwb3NpdGlvbiwgYXJnICkgXAorICAgIGRvIHsgXAorICAgICAgICBDYXRjaDo6UmVzdWx0QnVpbGRlciBfX2NhdGNoUmVzdWx0KCBtYWNyb05hbWUsIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCAjYXJnICIsICIgI21hdGNoZXIsIHJlc3VsdERpc3Bvc2l0aW9uICk7IFwKKyAgICAgICAgX19jYXRjaFJlc3VsdC5zZXRFeGNlcHRpb25HdWFyZCgpOyBcCisgICAgICAgIF9fY2F0Y2hSZXN1bHQuY2FwdHVyZU1hdGNoKCBhcmcsIG1hdGNoZXIsICNtYXRjaGVyICk7IFwKKyAgICAgICAgX19jYXRjaFJlc3VsdC51bnNldEV4Y2VwdGlvbkd1YXJkKCk7IFwKKyAgICAgICAgSU5URVJOQUxfQ0FUQ0hfUkVBQ1QoIF9fY2F0Y2hSZXN1bHQgKSBcCisgICAgfSB3aGlsZSggQ2F0Y2g6OmFsd2F5c0ZhbHNlKCkgKQorCisjZWxzZQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gSW4gdGhlIGV2ZW50IG9mIGEgZmFpbHVyZSB3b3JrcyBvdXQgaWYgdGhlIGRlYnVnZ2VyIG5lZWRzIHRvIGJlIGludm9rZWQKKy8vIGFuZC9vciBhbiBleGNlcHRpb24gdGhyb3duIGFuZCB0YWtlcyBhcHByb3ByaWF0ZSBhY3Rpb24uCisvLyBUaGlzIG5lZWRzIHRvIGJlIGRvbmUgYXMgYSBtYWNybyBzbyB0aGUgZGVidWdnZXIgd2lsbCBzdG9wIGluIHRoZSB1c2VyCisvLyBzb3VyY2UgY29kZSByYXRoZXIgdGhhbiBpbiBDYXRjaCBsaWJyYXJ5IGNvZGUKKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfUkVBQ1QoIHJlc3VsdEJ1aWxkZXIgKSBcCisgICAgaWYoIHJlc3VsdEJ1aWxkZXIuc2hvdWxkRGVidWdCcmVhaygpICkgQ0FUQ0hfQlJFQUtfSU5UT19ERUJVR0dFUigpOyBcCisgICAgcmVzdWx0QnVpbGRlci5yZWFjdCgpOworI2VuZGlmCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVEVTVCggbWFjcm9OYW1lLCByZXN1bHREaXNwb3NpdGlvbiwgZXhwciApIFwKKyAgICBkbyB7IFwKKyAgICAgICAgQ2F0Y2g6OlJlc3VsdEJ1aWxkZXIgX19jYXRjaFJlc3VsdCggbWFjcm9OYW1lLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTywgI2V4cHIsIHJlc3VsdERpc3Bvc2l0aW9uICk7IFwKKyAgICAgICAgdHJ5IHsgXAorICAgICAgICAgICAgQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfUEFSRU5USEVTRVNfV0FSTklOR1MgXAorICAgICAgICAgICAgKCBfX2NhdGNoUmVzdWx0IDw9IGV4cHIgKS5lbmRFeHByZXNzaW9uKCk7IFwKKyAgICAgICAgICAgIENBVENIX0lOVEVSTkFMX1VOU1VQUFJFU1NfUEFSRU5USEVTRVNfV0FSTklOR1MgXAorICAgICAgICB9IFwKKyAgICAgICAgY2F0Y2goIC4uLiApIHsgXAorICAgICAgICAgICAgX19jYXRjaFJlc3VsdC51c2VBY3RpdmVFeGNlcHRpb24oIHJlc3VsdERpc3Bvc2l0aW9uICk7IFwKKyAgICAgICAgfSBcCisgICAgICAgIElOVEVSTkFMX0NBVENIX1JFQUNUKCBfX2NhdGNoUmVzdWx0ICkgXAorICAgIH0gd2hpbGUoIENhdGNoOjppc1RydWUoIGZhbHNlICYmIHN0YXRpY19jYXN0PGJvb2w+KCAhIShleHByKSApICkgKSAvLyBleHByIGhlcmUgaXMgbmV2ZXIgZXZhbHVhdGVkIGF0IHJ1bnRpbWUgYnV0IGl0IGZvcmNlcyB0aGUgY29tcGlsZXIgdG8gZ2l2ZSBpdCBhIGxvb2sKKyAgICAvLyBUaGUgZG91YmxlIG5lZ2F0aW9uIHNpbGVuY2VzIE1TVkMncyBDNDgwMCB3YXJuaW5nLCB0aGUgc3RhdGljX2Nhc3QgZm9yY2VzIHNob3J0LWNpcmN1aXQgZXZhbHVhdGlvbiBpZiB0aGUgdHlwZSBoYXMgb3ZlcmxvYWRlZCAmJi4KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9JRiggbWFjcm9OYW1lLCByZXN1bHREaXNwb3NpdGlvbiwgZXhwciApIFwKKyAgICBJTlRFUk5BTF9DQVRDSF9URVNUKCBtYWNyb05hbWUsIHJlc3VsdERpc3Bvc2l0aW9uLCBleHByICk7IFwKKyAgICBpZiggQ2F0Y2g6OmdldFJlc3VsdENhcHR1cmUoKS5nZXRMYXN0UmVzdWx0KCktPnN1Y2NlZWRlZCgpICkKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9FTFNFKCBtYWNyb05hbWUsIHJlc3VsdERpc3Bvc2l0aW9uLCBleHByICkgXAorICAgIElOVEVSTkFMX0NBVENIX1RFU1QoIG1hY3JvTmFtZSwgcmVzdWx0RGlzcG9zaXRpb24sIGV4cHIgKTsgXAorICAgIGlmKCAhQ2F0Y2g6OmdldFJlc3VsdENhcHR1cmUoKS5nZXRMYXN0UmVzdWx0KCktPnN1Y2NlZWRlZCgpICkKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9OT19USFJPVyggbWFjcm9OYW1lLCByZXN1bHREaXNwb3NpdGlvbiwgZXhwciApIFwKKyAgICBkbyB7IFwKKyAgICAgICAgQ2F0Y2g6OlJlc3VsdEJ1aWxkZXIgX19jYXRjaFJlc3VsdCggbWFjcm9OYW1lLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTywgI2V4cHIsIHJlc3VsdERpc3Bvc2l0aW9uICk7IFwKKyAgICAgICAgdHJ5IHsgXAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dm9pZD4oZXhwcik7IFwKKyAgICAgICAgICAgIF9fY2F0Y2hSZXN1bHQuY2FwdHVyZVJlc3VsdCggQ2F0Y2g6OlJlc3VsdFdhczo6T2sgKTsgXAorICAgICAgICB9IFwKKyAgICAgICAgY2F0Y2goIC4uLiApIHsgXAorICAgICAgICAgICAgX19jYXRjaFJlc3VsdC51c2VBY3RpdmVFeGNlcHRpb24oIHJlc3VsdERpc3Bvc2l0aW9uICk7IFwKKyAgICAgICAgfSBcCisgICAgICAgIElOVEVSTkFMX0NBVENIX1JFQUNUKCBfX2NhdGNoUmVzdWx0ICkgXAorICAgIH0gd2hpbGUoIENhdGNoOjphbHdheXNGYWxzZSgpICkKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9USFJPV1MoIG1hY3JvTmFtZSwgcmVzdWx0RGlzcG9zaXRpb24sIG1hdGNoZXIsIGV4cHIgKSBcCisgICAgZG8geyBcCisgICAgICAgIENhdGNoOjpSZXN1bHRCdWlsZGVyIF9fY2F0Y2hSZXN1bHQoIG1hY3JvTmFtZSwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8sICNleHByLCByZXN1bHREaXNwb3NpdGlvbiwgI21hdGNoZXIgKTsgXAorICAgICAgICBpZiggX19jYXRjaFJlc3VsdC5hbGxvd1Rocm93cygpICkgXAorICAgICAgICAgICAgdHJ5IHsgXAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHZvaWQ+KGV4cHIpOyBcCisgICAgICAgICAgICAgICAgX19jYXRjaFJlc3VsdC5jYXB0dXJlUmVzdWx0KCBDYXRjaDo6UmVzdWx0V2FzOjpEaWRudFRocm93RXhjZXB0aW9uICk7IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgY2F0Y2goIC4uLiApIHsgXAorICAgICAgICAgICAgICAgIF9fY2F0Y2hSZXN1bHQuY2FwdHVyZUV4cGVjdGVkRXhjZXB0aW9uKCBtYXRjaGVyICk7IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICBlbHNlIFwKKyAgICAgICAgICAgIF9fY2F0Y2hSZXN1bHQuY2FwdHVyZVJlc3VsdCggQ2F0Y2g6OlJlc3VsdFdhczo6T2sgKTsgXAorICAgICAgICBJTlRFUk5BTF9DQVRDSF9SRUFDVCggX19jYXRjaFJlc3VsdCApIFwKKyAgICB9IHdoaWxlKCBDYXRjaDo6YWx3YXlzRmFsc2UoKSApCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVEhST1dTX0FTKCBtYWNyb05hbWUsIGV4Y2VwdGlvblR5cGUsIHJlc3VsdERpc3Bvc2l0aW9uLCBleHByICkgXAorICAgIGRvIHsgXAorICAgICAgICBDYXRjaDo6UmVzdWx0QnVpbGRlciBfX2NhdGNoUmVzdWx0KCBtYWNyb05hbWUsIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCAjZXhwciAiLCAiICNleGNlcHRpb25UeXBlLCByZXN1bHREaXNwb3NpdGlvbiApOyBcCisgICAgICAgIGlmKCBfX2NhdGNoUmVzdWx0LmFsbG93VGhyb3dzKCkgKSBcCisgICAgICAgICAgICB0cnkgeyBcCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dm9pZD4oZXhwcik7IFwKKyAgICAgICAgICAgICAgICBfX2NhdGNoUmVzdWx0LmNhcHR1cmVSZXN1bHQoIENhdGNoOjpSZXN1bHRXYXM6OkRpZG50VGhyb3dFeGNlcHRpb24gKTsgXAorICAgICAgICAgICAgfSBcCisgICAgICAgICAgICBjYXRjaCggZXhjZXB0aW9uVHlwZSApIHsgXAorICAgICAgICAgICAgICAgIF9fY2F0Y2hSZXN1bHQuY2FwdHVyZVJlc3VsdCggQ2F0Y2g6OlJlc3VsdFdhczo6T2sgKTsgXAorICAgICAgICAgICAgfSBcCisgICAgICAgICAgICBjYXRjaCggLi4uICkgeyBcCisgICAgICAgICAgICAgICAgX19jYXRjaFJlc3VsdC51c2VBY3RpdmVFeGNlcHRpb24oIHJlc3VsdERpc3Bvc2l0aW9uICk7IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICBlbHNlIFwKKyAgICAgICAgICAgIF9fY2F0Y2hSZXN1bHQuY2FwdHVyZVJlc3VsdCggQ2F0Y2g6OlJlc3VsdFdhczo6T2sgKTsgXAorICAgICAgICBJTlRFUk5BTF9DQVRDSF9SRUFDVCggX19jYXRjaFJlc3VsdCApIFwKKyAgICB9IHdoaWxlKCBDYXRjaDo6YWx3YXlzRmFsc2UoKSApCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNpZmRlZiBDQVRDSF9DT05GSUdfVkFSSUFESUNfTUFDUk9TCisgICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9NU0coIG1hY3JvTmFtZSwgbWVzc2FnZVR5cGUsIHJlc3VsdERpc3Bvc2l0aW9uLCAuLi4gKSBcCisgICAgICAgIGRvIHsgXAorICAgICAgICAgICAgQ2F0Y2g6OlJlc3VsdEJ1aWxkZXIgX19jYXRjaFJlc3VsdCggbWFjcm9OYW1lLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTywgIiIsIHJlc3VsdERpc3Bvc2l0aW9uICk7IFwKKyAgICAgICAgICAgIF9fY2F0Y2hSZXN1bHQgPDwgX19WQV9BUkdTX18gKyA6OkNhdGNoOjpTdHJlYW1FbmRTdG9wKCk7IFwKKyAgICAgICAgICAgIF9fY2F0Y2hSZXN1bHQuY2FwdHVyZVJlc3VsdCggbWVzc2FnZVR5cGUgKTsgXAorICAgICAgICAgICAgSU5URVJOQUxfQ0FUQ0hfUkVBQ1QoIF9fY2F0Y2hSZXN1bHQgKSBcCisgICAgICAgIH0gd2hpbGUoIENhdGNoOjphbHdheXNGYWxzZSgpICkKKyNlbHNlCisgICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9NU0coIG1hY3JvTmFtZSwgbWVzc2FnZVR5cGUsIHJlc3VsdERpc3Bvc2l0aW9uLCBsb2cgKSBcCisgICAgICAgIGRvIHsgXAorICAgICAgICAgICAgQ2F0Y2g6OlJlc3VsdEJ1aWxkZXIgX19jYXRjaFJlc3VsdCggbWFjcm9OYW1lLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTywgIiIsIHJlc3VsdERpc3Bvc2l0aW9uICk7IFwKKyAgICAgICAgICAgIF9fY2F0Y2hSZXN1bHQgPDwgbG9nICsgOjpDYXRjaDo6U3RyZWFtRW5kU3RvcCgpOyBcCisgICAgICAgICAgICBfX2NhdGNoUmVzdWx0LmNhcHR1cmVSZXN1bHQoIG1lc3NhZ2VUeXBlICk7IFwKKyAgICAgICAgICAgIElOVEVSTkFMX0NBVENIX1JFQUNUKCBfX2NhdGNoUmVzdWx0ICkgXAorICAgICAgICB9IHdoaWxlKCBDYXRjaDo6YWx3YXlzRmFsc2UoKSApCisjZW5kaWYKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9JTkZPKCBtYWNyb05hbWUsIGxvZyApIFwKKyAgICBDYXRjaDo6U2NvcGVkTWVzc2FnZSBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggc2NvcGVkTWVzc2FnZSApID0gQ2F0Y2g6Ok1lc3NhZ2VCdWlsZGVyKCBtYWNyb05hbWUsIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCBDYXRjaDo6UmVzdWx0V2FzOjpJbmZvICkgPDwgbG9nOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisjZGVmaW5lIElOVEVSTkFMX0NIRUNLX1RIQVQoIG1hY3JvTmFtZSwgbWF0Y2hlciwgcmVzdWx0RGlzcG9zaXRpb24sIGFyZyApIFwKKyAgICBkbyB7IFwKKyAgICAgICAgQ2F0Y2g6OlJlc3VsdEJ1aWxkZXIgX19jYXRjaFJlc3VsdCggbWFjcm9OYW1lLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTywgI2FyZyAiLCAiICNtYXRjaGVyLCByZXN1bHREaXNwb3NpdGlvbiApOyBcCisgICAgICAgIHRyeSB7IFwKKyAgICAgICAgICAgIF9fY2F0Y2hSZXN1bHQuY2FwdHVyZU1hdGNoKCBhcmcsIG1hdGNoZXIsICNtYXRjaGVyICk7IFwKKyAgICAgICAgfSBjYXRjaCggLi4uICkgeyBcCisgICAgICAgICAgICBfX2NhdGNoUmVzdWx0LnVzZUFjdGl2ZUV4Y2VwdGlvbiggcmVzdWx0RGlzcG9zaXRpb24gfCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlICk7IFwKKyAgICAgICAgfSBcCisgICAgICAgIElOVEVSTkFMX0NBVENIX1JFQUNUKCBfX2NhdGNoUmVzdWx0ICkgXAorICAgIH0gd2hpbGUoIENhdGNoOjphbHdheXNGYWxzZSgpICkKKworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX3NlY3Rpb24uaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfU0VDVElPTl9IX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9zZWN0aW9uX2luZm8uaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfU0VDVElPTl9JTkZPX0hfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3RvdGFscy5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1RPVEFMU19IUFBfSU5DTFVERUQKKworI2luY2x1ZGUgPGNzdGRkZWY+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdHJ1Y3QgQ291bnRzIHsKKyAgICAgICAgQ291bnRzKCkgOiBwYXNzZWQoIDAgKSwgZmFpbGVkKCAwICksIGZhaWxlZEJ1dE9rKCAwICkge30KKworICAgICAgICBDb3VudHMgb3BlcmF0b3IgLSAoIENvdW50cyBjb25zdCYgb3RoZXIgKSBjb25zdCB7CisgICAgICAgICAgICBDb3VudHMgZGlmZjsKKyAgICAgICAgICAgIGRpZmYucGFzc2VkID0gcGFzc2VkIC0gb3RoZXIucGFzc2VkOworICAgICAgICAgICAgZGlmZi5mYWlsZWQgPSBmYWlsZWQgLSBvdGhlci5mYWlsZWQ7CisgICAgICAgICAgICBkaWZmLmZhaWxlZEJ1dE9rID0gZmFpbGVkQnV0T2sgLSBvdGhlci5mYWlsZWRCdXRPazsKKyAgICAgICAgICAgIHJldHVybiBkaWZmOworICAgICAgICB9CisgICAgICAgIENvdW50cyYgb3BlcmF0b3IgKz0gKCBDb3VudHMgY29uc3QmIG90aGVyICkgeworICAgICAgICAgICAgcGFzc2VkICs9IG90aGVyLnBhc3NlZDsKKyAgICAgICAgICAgIGZhaWxlZCArPSBvdGhlci5mYWlsZWQ7CisgICAgICAgICAgICBmYWlsZWRCdXRPayArPSBvdGhlci5mYWlsZWRCdXRPazsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6c2l6ZV90IHRvdGFsKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIHBhc3NlZCArIGZhaWxlZCArIGZhaWxlZEJ1dE9rOworICAgICAgICB9CisgICAgICAgIGJvb2wgYWxsUGFzc2VkKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIGZhaWxlZCA9PSAwICYmIGZhaWxlZEJ1dE9rID09IDA7CisgICAgICAgIH0KKyAgICAgICAgYm9vbCBhbGxPaygpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBmYWlsZWQgPT0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6c2l6ZV90IHBhc3NlZDsKKyAgICAgICAgc3RkOjpzaXplX3QgZmFpbGVkOworICAgICAgICBzdGQ6OnNpemVfdCBmYWlsZWRCdXRPazsKKyAgICB9OworCisgICAgc3RydWN0IFRvdGFscyB7CisKKyAgICAgICAgVG90YWxzIG9wZXJhdG9yIC0gKCBUb3RhbHMgY29uc3QmIG90aGVyICkgY29uc3QgeworICAgICAgICAgICAgVG90YWxzIGRpZmY7CisgICAgICAgICAgICBkaWZmLmFzc2VydGlvbnMgPSBhc3NlcnRpb25zIC0gb3RoZXIuYXNzZXJ0aW9uczsKKyAgICAgICAgICAgIGRpZmYudGVzdENhc2VzID0gdGVzdENhc2VzIC0gb3RoZXIudGVzdENhc2VzOworICAgICAgICAgICAgcmV0dXJuIGRpZmY7CisgICAgICAgIH0KKworICAgICAgICBUb3RhbHMgZGVsdGEoIFRvdGFscyBjb25zdCYgcHJldlRvdGFscyApIGNvbnN0IHsKKyAgICAgICAgICAgIFRvdGFscyBkaWZmID0gKnRoaXMgLSBwcmV2VG90YWxzOworICAgICAgICAgICAgaWYoIGRpZmYuYXNzZXJ0aW9ucy5mYWlsZWQgPiAwICkKKyAgICAgICAgICAgICAgICArK2RpZmYudGVzdENhc2VzLmZhaWxlZDsKKyAgICAgICAgICAgIGVsc2UgaWYoIGRpZmYuYXNzZXJ0aW9ucy5mYWlsZWRCdXRPayA+IDAgKQorICAgICAgICAgICAgICAgICsrZGlmZi50ZXN0Q2FzZXMuZmFpbGVkQnV0T2s7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgKytkaWZmLnRlc3RDYXNlcy5wYXNzZWQ7CisgICAgICAgICAgICByZXR1cm4gZGlmZjsKKyAgICAgICAgfQorCisgICAgICAgIFRvdGFscyYgb3BlcmF0b3IgKz0gKCBUb3RhbHMgY29uc3QmIG90aGVyICkgeworICAgICAgICAgICAgYXNzZXJ0aW9ucyArPSBvdGhlci5hc3NlcnRpb25zOworICAgICAgICAgICAgdGVzdENhc2VzICs9IG90aGVyLnRlc3RDYXNlczsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIENvdW50cyBhc3NlcnRpb25zOworICAgICAgICBDb3VudHMgdGVzdENhc2VzOworICAgIH07Cit9CisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdHJ1Y3QgU2VjdGlvbkluZm8geworICAgICAgICBTZWN0aW9uSW5mbworICAgICAgICAgICAgKCAgIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBfbGluZUluZm8sCisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIF9uYW1lLAorICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfZGVzY3JpcHRpb24gPSBzdGQ6OnN0cmluZygpICk7CisKKyAgICAgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICAgICAgc3RkOjpzdHJpbmcgZGVzY3JpcHRpb247CisgICAgICAgIFNvdXJjZUxpbmVJbmZvIGxpbmVJbmZvOworICAgIH07CisKKyAgICBzdHJ1Y3QgU2VjdGlvbkVuZEluZm8geworICAgICAgICBTZWN0aW9uRW5kSW5mbyggU2VjdGlvbkluZm8gY29uc3QmIF9zZWN0aW9uSW5mbywgQ291bnRzIGNvbnN0JiBfcHJldkFzc2VydGlvbnMsIGRvdWJsZSBfZHVyYXRpb25JblNlY29uZHMgKQorICAgICAgICA6IHNlY3Rpb25JbmZvKCBfc2VjdGlvbkluZm8gKSwgcHJldkFzc2VydGlvbnMoIF9wcmV2QXNzZXJ0aW9ucyApLCBkdXJhdGlvbkluU2Vjb25kcyggX2R1cmF0aW9uSW5TZWNvbmRzICkKKyAgICAgICAge30KKworICAgICAgICBTZWN0aW9uSW5mbyBzZWN0aW9uSW5mbzsKKyAgICAgICAgQ291bnRzIHByZXZBc3NlcnRpb25zOworICAgICAgICBkb3VibGUgZHVyYXRpb25JblNlY29uZHM7CisgICAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF90aW1lci5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9USU1FUl9IX0lOQ0xVREVECisKKyNpZmRlZiBfTVNDX1ZFUgorCituYW1lc3BhY2UgQ2F0Y2ggeworICAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIFVJbnQ2NDsKK30KKyNlbHNlCisjaW5jbHVkZSA8c3RkaW50Lmg+CituYW1lc3BhY2UgQ2F0Y2ggeworICAgIHR5cGVkZWYgdWludDY0X3QgVUludDY0OworfQorI2VuZGlmCisKK25hbWVzcGFjZSBDYXRjaCB7CisgICAgY2xhc3MgVGltZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgVGltZXIoKSA6IG1fdGlja3MoIDAgKSB7fQorICAgICAgICB2b2lkIHN0YXJ0KCk7CisgICAgICAgIHVuc2lnbmVkIGludCBnZXRFbGFwc2VkTWljcm9zZWNvbmRzKCkgY29uc3Q7CisgICAgICAgIHVuc2lnbmVkIGludCBnZXRFbGFwc2VkTWlsbGlzZWNvbmRzKCkgY29uc3Q7CisgICAgICAgIGRvdWJsZSBnZXRFbGFwc2VkU2Vjb25kcygpIGNvbnN0OworCisgICAgcHJpdmF0ZToKKyAgICAgICAgVUludDY0IG1fdGlja3M7CisgICAgfTsKKworfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGNsYXNzIFNlY3Rpb24gOiBOb25Db3B5YWJsZSB7CisgICAgcHVibGljOgorICAgICAgICBTZWN0aW9uKCBTZWN0aW9uSW5mbyBjb25zdCYgaW5mbyApOworICAgICAgICB+U2VjdGlvbigpOworCisgICAgICAgIC8vIFRoaXMgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHNlY3Rpb24gc2hvdWxkIGJlIGV4ZWN1dGVkIG9yIG5vdAorICAgICAgICBvcGVyYXRvciBib29sKCkgY29uc3Q7CisKKyAgICBwcml2YXRlOgorICAgICAgICBTZWN0aW9uSW5mbyBtX2luZm87CisKKyAgICAgICAgc3RkOjpzdHJpbmcgbV9uYW1lOworICAgICAgICBDb3VudHMgbV9hc3NlcnRpb25zOworICAgICAgICBib29sIG1fc2VjdGlvbkluY2x1ZGVkOworICAgICAgICBUaW1lciBtX3RpbWVyOworICAgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisjaWZkZWYgQ0FUQ0hfQ09ORklHX1ZBUklBRElDX01BQ1JPUworICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfU0VDVElPTiggLi4uICkgXAorICAgICAgICBpZiggQ2F0Y2g6OlNlY3Rpb24gY29uc3QmIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBjYXRjaF9pbnRlcm5hbF9TZWN0aW9uICkgPSBDYXRjaDo6U2VjdGlvbkluZm8oIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCBfX1ZBX0FSR1NfXyApICkKKyNlbHNlCisgICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9TRUNUSU9OKCBuYW1lLCBkZXNjICkgXAorICAgICAgICBpZiggQ2F0Y2g6OlNlY3Rpb24gY29uc3QmIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBjYXRjaF9pbnRlcm5hbF9TZWN0aW9uICkgPSBDYXRjaDo6U2VjdGlvbkluZm8oIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCBuYW1lLCBkZXNjICkgKQorI2VuZGlmCisKKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF9nZW5lcmF0b3JzLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfR0VORVJBVE9SU19IUFBfSU5DTFVERUQKKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgSUdlbmVyYXRvciB7CisgICAgdmlydHVhbCB+SUdlbmVyYXRvcigpIHt9CisgICAgdmlydHVhbCBUIGdldFZhbHVlKCBzdGQ6OnNpemVfdCBpbmRleCApIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHN0ZDo6c2l6ZV90IHNpemUgKCkgY29uc3QgPSAwOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIEJldHdlZW5HZW5lcmF0b3IgOiBwdWJsaWMgSUdlbmVyYXRvcjxUPiB7CitwdWJsaWM6CisgICAgQmV0d2VlbkdlbmVyYXRvciggVCBmcm9tLCBUIHRvICkgOiBtX2Zyb20oIGZyb20gKSwgbV90byggdG8gKXt9CisKKyAgICB2aXJ0dWFsIFQgZ2V0VmFsdWUoIHN0ZDo6c2l6ZV90IGluZGV4ICkgY29uc3QgeworICAgICAgICByZXR1cm4gbV9mcm9tK3N0YXRpY19jYXN0PGludD4oIGluZGV4ICk7CisgICAgfQorCisgICAgdmlydHVhbCBzdGQ6OnNpemVfdCBzaXplKCkgY29uc3QgeworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c3RkOjpzaXplX3Q+KCAxK21fdG8tbV9mcm9tICk7CisgICAgfQorCitwcml2YXRlOgorCisgICAgVCBtX2Zyb207CisgICAgVCBtX3RvOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIFZhbHVlc0dlbmVyYXRvciA6IHB1YmxpYyBJR2VuZXJhdG9yPFQ+IHsKK3B1YmxpYzoKKyAgICBWYWx1ZXNHZW5lcmF0b3IoKXt9CisKKyAgICB2b2lkIGFkZCggVCB2YWx1ZSApIHsKKyAgICAgICAgbV92YWx1ZXMucHVzaF9iYWNrKCB2YWx1ZSApOworICAgIH0KKworICAgIHZpcnR1YWwgVCBnZXRWYWx1ZSggc3RkOjpzaXplX3QgaW5kZXggKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX3ZhbHVlc1tpbmRleF07CisgICAgfQorCisgICAgdmlydHVhbCBzdGQ6OnNpemVfdCBzaXplKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV92YWx1ZXMuc2l6ZSgpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnZlY3RvcjxUPiBtX3ZhbHVlczsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBDb21wb3NpdGVHZW5lcmF0b3IgeworcHVibGljOgorICAgIENvbXBvc2l0ZUdlbmVyYXRvcigpIDogbV90b3RhbFNpemUoIDAgKSB7fQorCisgICAgLy8gKioqIE1vdmUgc2VtYW50aWNzLCBzaW1pbGFyIHRvIGF1dG9fcHRyICoqKgorICAgIENvbXBvc2l0ZUdlbmVyYXRvciggQ29tcG9zaXRlR2VuZXJhdG9yJiBvdGhlciApCisgICAgOiAgIG1fZmlsZUluZm8oIG90aGVyLm1fZmlsZUluZm8gKSwKKyAgICAgICAgbV90b3RhbFNpemUoIDAgKQorICAgIHsKKyAgICAgICAgbW92ZSggb3RoZXIgKTsKKyAgICB9CisKKyAgICBDb21wb3NpdGVHZW5lcmF0b3ImIHNldEZpbGVJbmZvKCBjb25zdCBjaGFyKiBmaWxlSW5mbyApIHsKKyAgICAgICAgbV9maWxlSW5mbyA9IGZpbGVJbmZvOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgfkNvbXBvc2l0ZUdlbmVyYXRvcigpIHsKKyAgICAgICAgZGVsZXRlQWxsKCBtX2NvbXBvc2VkICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVCAoKSBjb25zdCB7CisgICAgICAgIHNpemVfdCBvdmVyYWxsSW5kZXggPSBnZXRDdXJyZW50Q29udGV4dCgpLmdldEdlbmVyYXRvckluZGV4KCBtX2ZpbGVJbmZvLCBtX3RvdGFsU2l6ZSApOworCisgICAgICAgIHR5cGVuYW1lIHN0ZDo6dmVjdG9yPGNvbnN0IElHZW5lcmF0b3I8VD4qPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2NvbXBvc2VkLmJlZ2luKCk7CisgICAgICAgIHR5cGVuYW1lIHN0ZDo6dmVjdG9yPGNvbnN0IElHZW5lcmF0b3I8VD4qPjo6Y29uc3RfaXRlcmF0b3IgaXRFbmQgPSBtX2NvbXBvc2VkLmVuZCgpOworICAgICAgICBmb3IoIHNpemVfdCBpbmRleCA9IDA7IGl0ICE9IGl0RW5kOyArK2l0ICkKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgSUdlbmVyYXRvcjxUPiogZ2VuZXJhdG9yID0gKml0OworICAgICAgICAgICAgaWYoIG92ZXJhbGxJbmRleCA+PSBpbmRleCAmJiBvdmVyYWxsSW5kZXggPCBpbmRleCArIGdlbmVyYXRvci0+c2l6ZSgpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2VuZXJhdG9yLT5nZXRWYWx1ZSggb3ZlcmFsbEluZGV4LWluZGV4ICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbmRleCArPSBnZW5lcmF0b3ItPnNpemUoKTsKKyAgICAgICAgfQorICAgICAgICBDQVRDSF9JTlRFUk5BTF9FUlJPUiggIkluZGV4ZWQgcGFzdCBlbmQgb2YgZ2VuZXJhdGVkIHJhbmdlIiApOworICAgICAgICByZXR1cm4gVCgpOyAvLyBTdXBwcmVzcyBzcHVyaW91cyAibm90IGFsbCBjb250cm9sIHBhdGhzIHJldHVybiBhIHZhbHVlIiB3YXJuaW5nIGluIFZpc3VhbCBTdHVkaW8gLSBpZiB5b3Uga25vdyBob3cgdG8gZml4IHRoaXMgcGxlYXNlIGRvIHNvCisgICAgfQorCisgICAgdm9pZCBhZGQoIGNvbnN0IElHZW5lcmF0b3I8VD4qIGdlbmVyYXRvciApIHsKKyAgICAgICAgbV90b3RhbFNpemUgKz0gZ2VuZXJhdG9yLT5zaXplKCk7CisgICAgICAgIG1fY29tcG9zZWQucHVzaF9iYWNrKCBnZW5lcmF0b3IgKTsKKyAgICB9CisKKyAgICBDb21wb3NpdGVHZW5lcmF0b3ImIHRoZW4oIENvbXBvc2l0ZUdlbmVyYXRvciYgb3RoZXIgKSB7CisgICAgICAgIG1vdmUoIG90aGVyICk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBDb21wb3NpdGVHZW5lcmF0b3ImIHRoZW4oIFQgdmFsdWUgKSB7CisgICAgICAgIFZhbHVlc0dlbmVyYXRvcjxUPiogdmFsdWVzR2VuID0gbmV3IFZhbHVlc0dlbmVyYXRvcjxUPigpOworICAgICAgICB2YWx1ZXNHZW4tPmFkZCggdmFsdWUgKTsKKyAgICAgICAgYWRkKCB2YWx1ZXNHZW4gKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworcHJpdmF0ZToKKworICAgIHZvaWQgbW92ZSggQ29tcG9zaXRlR2VuZXJhdG9yJiBvdGhlciApIHsKKyAgICAgICAgbV9jb21wb3NlZC5pbnNlcnQoIG1fY29tcG9zZWQuZW5kKCksIG90aGVyLm1fY29tcG9zZWQuYmVnaW4oKSwgb3RoZXIubV9jb21wb3NlZC5lbmQoKSApOworICAgICAgICBtX3RvdGFsU2l6ZSArPSBvdGhlci5tX3RvdGFsU2l6ZTsKKyAgICAgICAgb3RoZXIubV9jb21wb3NlZC5jbGVhcigpOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IElHZW5lcmF0b3I8VD4qPiBtX2NvbXBvc2VkOworICAgIHN0ZDo6c3RyaW5nIG1fZmlsZUluZm87CisgICAgc2l6ZV90IG1fdG90YWxTaXplOworfTsKKworbmFtZXNwYWNlIEdlbmVyYXRvcnMKK3sKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIENvbXBvc2l0ZUdlbmVyYXRvcjxUPiBiZXR3ZWVuKCBUIGZyb20sIFQgdG8gKSB7CisgICAgICAgIENvbXBvc2l0ZUdlbmVyYXRvcjxUPiBnZW5lcmF0b3JzOworICAgICAgICBnZW5lcmF0b3JzLmFkZCggbmV3IEJldHdlZW5HZW5lcmF0b3I8VD4oIGZyb20sIHRvICkgKTsKKyAgICAgICAgcmV0dXJuIGdlbmVyYXRvcnM7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBDb21wb3NpdGVHZW5lcmF0b3I8VD4gdmFsdWVzKCBUIHZhbDEsIFQgdmFsMiApIHsKKyAgICAgICAgQ29tcG9zaXRlR2VuZXJhdG9yPFQ+IGdlbmVyYXRvcnM7CisgICAgICAgIFZhbHVlc0dlbmVyYXRvcjxUPiogdmFsdWVzR2VuID0gbmV3IFZhbHVlc0dlbmVyYXRvcjxUPigpOworICAgICAgICB2YWx1ZXNHZW4tPmFkZCggdmFsMSApOworICAgICAgICB2YWx1ZXNHZW4tPmFkZCggdmFsMiApOworICAgICAgICBnZW5lcmF0b3JzLmFkZCggdmFsdWVzR2VuICk7CisgICAgICAgIHJldHVybiBnZW5lcmF0b3JzOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgQ29tcG9zaXRlR2VuZXJhdG9yPFQ+IHZhbHVlcyggVCB2YWwxLCBUIHZhbDIsIFQgdmFsMyApeworICAgICAgICBDb21wb3NpdGVHZW5lcmF0b3I8VD4gZ2VuZXJhdG9yczsKKyAgICAgICAgVmFsdWVzR2VuZXJhdG9yPFQ+KiB2YWx1ZXNHZW4gPSBuZXcgVmFsdWVzR2VuZXJhdG9yPFQ+KCk7CisgICAgICAgIHZhbHVlc0dlbi0+YWRkKCB2YWwxICk7CisgICAgICAgIHZhbHVlc0dlbi0+YWRkKCB2YWwyICk7CisgICAgICAgIHZhbHVlc0dlbi0+YWRkKCB2YWwzICk7CisgICAgICAgIGdlbmVyYXRvcnMuYWRkKCB2YWx1ZXNHZW4gKTsKKyAgICAgICAgcmV0dXJuIGdlbmVyYXRvcnM7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBDb21wb3NpdGVHZW5lcmF0b3I8VD4gdmFsdWVzKCBUIHZhbDEsIFQgdmFsMiwgVCB2YWwzLCBUIHZhbDQgKSB7CisgICAgICAgIENvbXBvc2l0ZUdlbmVyYXRvcjxUPiBnZW5lcmF0b3JzOworICAgICAgICBWYWx1ZXNHZW5lcmF0b3I8VD4qIHZhbHVlc0dlbiA9IG5ldyBWYWx1ZXNHZW5lcmF0b3I8VD4oKTsKKyAgICAgICAgdmFsdWVzR2VuLT5hZGQoIHZhbDEgKTsKKyAgICAgICAgdmFsdWVzR2VuLT5hZGQoIHZhbDIgKTsKKyAgICAgICAgdmFsdWVzR2VuLT5hZGQoIHZhbDMgKTsKKyAgICAgICAgdmFsdWVzR2VuLT5hZGQoIHZhbDQgKTsKKyAgICAgICAgZ2VuZXJhdG9ycy5hZGQoIHZhbHVlc0dlbiApOworICAgICAgICByZXR1cm4gZ2VuZXJhdG9yczsKKyAgICB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBHZW5lcmF0b3JzCisKK3VzaW5nIG5hbWVzcGFjZSBHZW5lcmF0b3JzOworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9MSU5FU1RSMiggbGluZSApICNsaW5lCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX0xJTkVTVFIoIGxpbmUgKSBJTlRFUk5BTF9DQVRDSF9MSU5FU1RSMiggbGluZSApCisKKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfR0VORVJBVEUoIGV4cHIgKSBleHByLnNldEZpbGVJbmZvKCBfX0ZJTEVfXyAiKCIgSU5URVJOQUxfQ0FUQ0hfTElORVNUUiggX19MSU5FX18gKSAiKSIgKQorCisvLyAjaW5jbHVkZWQgZnJvbTogaW50ZXJuYWwvY2F0Y2hfaW50ZXJmYWNlc19leGNlcHRpb24uaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfSU5URVJGQUNFU19FWENFUFRJT05fSF9JTkNMVURFRAorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2ludGVyZmFjZXNfcmVnaXN0cnlfaHViLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0lOVEVSRkFDRVNfUkVHSVNUUllfSFVCX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGNsYXNzIFRlc3RDYXNlOworICAgIHN0cnVjdCBJVGVzdENhc2VSZWdpc3RyeTsKKyAgICBzdHJ1Y3QgSUV4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeTsKKyAgICBzdHJ1Y3QgSUV4Y2VwdGlvblRyYW5zbGF0b3I7CisgICAgc3RydWN0IElSZXBvcnRlclJlZ2lzdHJ5OworICAgIHN0cnVjdCBJUmVwb3J0ZXJGYWN0b3J5OworICAgIHN0cnVjdCBJVGFnQWxpYXNSZWdpc3RyeTsKKworICAgIHN0cnVjdCBJUmVnaXN0cnlIdWIgeworICAgICAgICB2aXJ0dWFsIH5JUmVnaXN0cnlIdWIoKTsKKworICAgICAgICB2aXJ0dWFsIElSZXBvcnRlclJlZ2lzdHJ5IGNvbnN0JiBnZXRSZXBvcnRlclJlZ2lzdHJ5KCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIElUZXN0Q2FzZVJlZ2lzdHJ5IGNvbnN0JiBnZXRUZXN0Q2FzZVJlZ2lzdHJ5KCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIElUYWdBbGlhc1JlZ2lzdHJ5IGNvbnN0JiBnZXRUYWdBbGlhc1JlZ2lzdHJ5KCkgY29uc3QgPSAwOworCisgICAgICAgIHZpcnR1YWwgSUV4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeSYgZ2V0RXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5KCkgPSAwOworICAgIH07CisKKyAgICBzdHJ1Y3QgSU11dGFibGVSZWdpc3RyeUh1YiB7CisgICAgICAgIHZpcnR1YWwgfklNdXRhYmxlUmVnaXN0cnlIdWIoKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHJlZ2lzdGVyUmVwb3J0ZXIoIHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lLCBQdHI8SVJlcG9ydGVyRmFjdG9yeT4gY29uc3QmIGZhY3RvcnkgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCByZWdpc3Rlckxpc3RlbmVyKCBQdHI8SVJlcG9ydGVyRmFjdG9yeT4gY29uc3QmIGZhY3RvcnkgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCByZWdpc3RlclRlc3QoIFRlc3RDYXNlIGNvbnN0JiB0ZXN0SW5mbyApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHJlZ2lzdGVyVHJhbnNsYXRvciggY29uc3QgSUV4Y2VwdGlvblRyYW5zbGF0b3IqIHRyYW5zbGF0b3IgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCByZWdpc3RlclRhZ0FsaWFzKCBzdGQ6OnN0cmluZyBjb25zdCYgYWxpYXMsIHN0ZDo6c3RyaW5nIGNvbnN0JiB0YWcsIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBsaW5lSW5mbyApID0gMDsKKyAgICB9OworCisgICAgSVJlZ2lzdHJ5SHViJiBnZXRSZWdpc3RyeUh1YigpOworICAgIElNdXRhYmxlUmVnaXN0cnlIdWImIGdldE11dGFibGVSZWdpc3RyeUh1YigpOworICAgIHZvaWQgY2xlYW5VcCgpOworICAgIHN0ZDo6c3RyaW5nIHRyYW5zbGF0ZUFjdGl2ZUV4Y2VwdGlvbigpOworCit9CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICB0eXBlZGVmIHN0ZDo6c3RyaW5nKCpleGNlcHRpb25UcmFuc2xhdGVGdW5jdGlvbikoKTsKKworICAgIHN0cnVjdCBJRXhjZXB0aW9uVHJhbnNsYXRvcjsKKyAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPGNvbnN0IElFeGNlcHRpb25UcmFuc2xhdG9yKj4gRXhjZXB0aW9uVHJhbnNsYXRvcnM7CisKKyAgICBzdHJ1Y3QgSUV4Y2VwdGlvblRyYW5zbGF0b3IgeworICAgICAgICB2aXJ0dWFsIH5JRXhjZXB0aW9uVHJhbnNsYXRvcigpOworICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIHRyYW5zbGF0ZSggRXhjZXB0aW9uVHJhbnNsYXRvcnM6OmNvbnN0X2l0ZXJhdG9yIGl0LCBFeGNlcHRpb25UcmFuc2xhdG9yczo6Y29uc3RfaXRlcmF0b3IgaXRFbmQgKSBjb25zdCA9IDA7CisgICAgfTsKKworICAgIHN0cnVjdCBJRXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5IHsKKyAgICAgICAgdmlydHVhbCB+SUV4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeSgpOworCisgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgdHJhbnNsYXRlQWN0aXZlRXhjZXB0aW9uKCkgY29uc3QgPSAwOworICAgIH07CisKKyAgICBjbGFzcyBFeGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cmFyIHsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgY2xhc3MgRXhjZXB0aW9uVHJhbnNsYXRvciA6IHB1YmxpYyBJRXhjZXB0aW9uVHJhbnNsYXRvciB7CisgICAgICAgIHB1YmxpYzoKKworICAgICAgICAgICAgRXhjZXB0aW9uVHJhbnNsYXRvciggc3RkOjpzdHJpbmcoKnRyYW5zbGF0ZUZ1bmN0aW9uKSggVCYgKSApCisgICAgICAgICAgICA6IG1fdHJhbnNsYXRlRnVuY3Rpb24oIHRyYW5zbGF0ZUZ1bmN0aW9uICkKKyAgICAgICAgICAgIHt9CisKKyAgICAgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgdHJhbnNsYXRlKCBFeGNlcHRpb25UcmFuc2xhdG9yczo6Y29uc3RfaXRlcmF0b3IgaXQsIEV4Y2VwdGlvblRyYW5zbGF0b3JzOjpjb25zdF9pdGVyYXRvciBpdEVuZCApIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpZiggaXQgPT0gaXRFbmQgKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3c7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoKml0KS0+dHJhbnNsYXRlKCBpdCsxLCBpdEVuZCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCggVCYgZXggKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX3RyYW5zbGF0ZUZ1bmN0aW9uKCBleCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQ6CisgICAgICAgICAgICBzdGQ6OnN0cmluZygqbV90cmFuc2xhdGVGdW5jdGlvbikoIFQmICk7CisgICAgICAgIH07CisKKyAgICBwdWJsaWM6CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIEV4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyYXIoIHN0ZDo6c3RyaW5nKCp0cmFuc2xhdGVGdW5jdGlvbikoIFQmICkgKSB7CisgICAgICAgICAgICBnZXRNdXRhYmxlUmVnaXN0cnlIdWIoKS5yZWdpc3RlclRyYW5zbGF0b3IKKyAgICAgICAgICAgICAgICAoIG5ldyBFeGNlcHRpb25UcmFuc2xhdG9yPFQ+KCB0cmFuc2xhdGVGdW5jdGlvbiApICk7CisgICAgICAgIH0KKyAgICB9OworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RSQU5TTEFURV9FWENFUFRJT04yKCB0cmFuc2xhdG9yTmFtZSwgc2lnbmF0dXJlICkgXAorICAgIHN0YXRpYyBzdGQ6OnN0cmluZyB0cmFuc2xhdG9yTmFtZSggc2lnbmF0dXJlICk7IFwKKyAgICBuYW1lc3BhY2V7IENhdGNoOjpFeGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cmFyIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBjYXRjaF9pbnRlcm5hbF9FeGNlcHRpb25SZWdpc3RyYXIgKSggJnRyYW5zbGF0b3JOYW1lICk7IH1cCisgICAgc3RhdGljIHN0ZDo6c3RyaW5nIHRyYW5zbGF0b3JOYW1lKCBzaWduYXR1cmUgKQorCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RSQU5TTEFURV9FWENFUFRJT04oIHNpZ25hdHVyZSApIElOVEVSTkFMX0NBVENIX1RSQU5TTEFURV9FWENFUFRJT04yKCBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggY2F0Y2hfaW50ZXJuYWxfRXhjZXB0aW9uVHJhbnNsYXRvciApLCBzaWduYXR1cmUgKQorCisvLyAjaW5jbHVkZWQgZnJvbTogaW50ZXJuYWwvY2F0Y2hfYXBwcm94LmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfQVBQUk9YX0hQUF9JTkNMVURFRAorCisjaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8bGltaXRzPgorCisjaWYgZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfVFlQRV9UUkFJVFMpCisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjZW5kaWYKKworbmFtZXNwYWNlIENhdGNoIHsKK25hbWVzcGFjZSBEZXRhaWwgeworCisgICAgY2xhc3MgQXBwcm94IHsKKyAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IEFwcHJveCAoIGRvdWJsZSB2YWx1ZSApCisgICAgICAgIDogICBtX2Vwc2lsb24oIHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjplcHNpbG9uKCkqMTAwICksCisgICAgICAgICAgICBtX21hcmdpbiggMC4wICksCisgICAgICAgICAgICBtX3NjYWxlKCAxLjAgKSwKKyAgICAgICAgICAgIG1fdmFsdWUoIHZhbHVlICkKKyAgICAgICAge30KKworICAgICAgICBBcHByb3goIEFwcHJveCBjb25zdCYgb3RoZXIgKQorICAgICAgICA6ICAgbV9lcHNpbG9uKCBvdGhlci5tX2Vwc2lsb24gKSwKKyAgICAgICAgICAgIG1fbWFyZ2luKCBvdGhlci5tX21hcmdpbiApLAorICAgICAgICAgICAgbV9zY2FsZSggb3RoZXIubV9zY2FsZSApLAorICAgICAgICAgICAgbV92YWx1ZSggb3RoZXIubV92YWx1ZSApCisgICAgICAgIHt9CisKKyAgICAgICAgc3RhdGljIEFwcHJveCBjdXN0b20oKSB7CisgICAgICAgICAgICByZXR1cm4gQXBwcm94KCAwICk7CisgICAgICAgIH0KKworI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX1RZUEVfVFJBSVRTKQorCisgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTxkb3VibGUsIFQ+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIEFwcHJveCBvcGVyYXRvcigpKCBUIHZhbHVlICkgeworICAgICAgICAgICAgQXBwcm94IGFwcHJveCggc3RhdGljX2Nhc3Q8ZG91YmxlPih2YWx1ZSkgKTsKKyAgICAgICAgICAgIGFwcHJveC5lcHNpbG9uKCBtX2Vwc2lsb24gKTsKKyAgICAgICAgICAgIGFwcHJveC5tYXJnaW4oIG1fbWFyZ2luICk7CisgICAgICAgICAgICBhcHByb3guc2NhbGUoIG1fc2NhbGUgKTsKKyAgICAgICAgICAgIHJldHVybiBhcHByb3g7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8ZG91YmxlLCBUPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBleHBsaWNpdCBBcHByb3goIFQgdmFsdWUgKTogQXBwcm94KHN0YXRpY19jYXN0PGRvdWJsZT4odmFsdWUpKQorICAgICAgICB7fQorCisgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTxkb3VibGUsIFQ+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yID09ICggY29uc3QgVCYgbGhzLCBBcHByb3ggY29uc3QmIHJocyApIHsKKyAgICAgICAgICAgIC8vIFRoYW5rcyB0byBSaWNoYXJkIEhhcnJpcyBmb3IgaGlzIGhlbHAgcmVmaW5pbmcgdGhpcyBmb3JtdWxhCisgICAgICAgICAgICBhdXRvIGxoc192ID0gZG91YmxlKGxocyk7CisgICAgICAgICAgICBib29sIHJlbGF0aXZlT0sgPSBzdGQ6OmZhYnMobGhzX3YgLSByaHMubV92YWx1ZSkgPCByaHMubV9lcHNpbG9uICogKHJocy5tX3NjYWxlICsgKHN0ZDo6bWF4KShzdGQ6OmZhYnMobGhzX3YpLCBzdGQ6OmZhYnMocmhzLm1fdmFsdWUpKSk7CisgICAgICAgICAgICBpZiAocmVsYXRpdmVPSykgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHN0ZDo6ZmFicyhsaHNfdiAtIHJocy5tX3ZhbHVlKSA8IHJocy5tX21hcmdpbjsKKyAgICAgICAgfQorCisgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTxkb3VibGUsIFQ+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yID09ICggQXBwcm94IGNvbnN0JiBsaHMsIGNvbnN0IFQmIHJocyApIHsKKyAgICAgICAgICAgIHJldHVybiBvcGVyYXRvcj09KCByaHMsIGxocyApOworICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPGRvdWJsZSwgVD46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IgIT0gKCBUIGxocywgQXBwcm94IGNvbnN0JiByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIGxocywgcmhzICk7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8ZG91YmxlLCBUPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciAhPSAoIEFwcHJveCBjb25zdCYgbGhzLCBUIHJocyApIHsKKyAgICAgICAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzLCBsaHMgKTsKKyAgICAgICAgfQorCisgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTxkb3VibGUsIFQ+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yIDw9ICggVCBsaHMsIEFwcHJveCBjb25zdCYgcmhzICkgeworICAgICAgICAgICAgcmV0dXJuIGRvdWJsZShsaHMpIDwgcmhzLm1fdmFsdWUgfHwgbGhzID09IHJoczsKKyAgICAgICAgfQorCisgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTxkb3VibGUsIFQ+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yIDw9ICggQXBwcm94IGNvbnN0JiBsaHMsIFQgcmhzICkgeworICAgICAgICAgICAgcmV0dXJuIGxocy5tX3ZhbHVlIDwgZG91YmxlKHJocykgfHwgbGhzID09IHJoczsKKyAgICAgICAgfQorCisgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTxkb3VibGUsIFQ+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yID49ICggVCBsaHMsIEFwcHJveCBjb25zdCYgcmhzICkgeworICAgICAgICAgICAgcmV0dXJuIGRvdWJsZShsaHMpID4gcmhzLm1fdmFsdWUgfHwgbGhzID09IHJoczsKKyAgICAgICAgfQorCisgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTxkb3VibGUsIFQ+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yID49ICggQXBwcm94IGNvbnN0JiBsaHMsIFQgcmhzICkgeworICAgICAgICAgICAgcmV0dXJuIGxocy5tX3ZhbHVlID4gZG91YmxlKHJocykgfHwgbGhzID09IHJoczsKKyAgICAgICAgfQorCisgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTxkb3VibGUsIFQ+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIEFwcHJveCYgZXBzaWxvbiggVCBuZXdFcHNpbG9uICkgeworICAgICAgICAgICAgbV9lcHNpbG9uID0gZG91YmxlKG5ld0Vwc2lsb24pOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPGRvdWJsZSwgVD46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgQXBwcm94JiBtYXJnaW4oIFQgbmV3TWFyZ2luICkgeworICAgICAgICAgICAgbV9tYXJnaW4gPSBkb3VibGUobmV3TWFyZ2luKTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTxkb3VibGUsIFQ+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIEFwcHJveCYgc2NhbGUoIFQgbmV3U2NhbGUgKSB7CisgICAgICAgICAgICBtX3NjYWxlID0gZG91YmxlKG5ld1NjYWxlKTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisjZWxzZQorCisgICAgICAgIEFwcHJveCBvcGVyYXRvcigpKCBkb3VibGUgdmFsdWUgKSB7CisgICAgICAgICAgICBBcHByb3ggYXBwcm94KCB2YWx1ZSApOworICAgICAgICAgICAgYXBwcm94LmVwc2lsb24oIG1fZXBzaWxvbiApOworICAgICAgICAgICAgYXBwcm94Lm1hcmdpbiggbV9tYXJnaW4gKTsKKyAgICAgICAgICAgIGFwcHJveC5zY2FsZSggbV9zY2FsZSApOworICAgICAgICAgICAgcmV0dXJuIGFwcHJveDsKKyAgICAgICAgfQorCisgICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yID09ICggZG91YmxlIGxocywgQXBwcm94IGNvbnN0JiByaHMgKSB7CisgICAgICAgICAgICAvLyBUaGFua3MgdG8gUmljaGFyZCBIYXJyaXMgZm9yIGhpcyBoZWxwIHJlZmluaW5nIHRoaXMgZm9ybXVsYQorICAgICAgICAgICAgYm9vbCByZWxhdGl2ZU9LID0gc3RkOjpmYWJzKCBsaHMgLSByaHMubV92YWx1ZSApIDwgcmhzLm1fZXBzaWxvbiAqIChyaHMubV9zY2FsZSArIChzdGQ6Om1heCkoIHN0ZDo6ZmFicyhsaHMpLCBzdGQ6OmZhYnMocmhzLm1fdmFsdWUpICkgKTsKKyAgICAgICAgICAgIGlmIChyZWxhdGl2ZU9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc3RkOjpmYWJzKGxocyAtIHJocy5tX3ZhbHVlKSA8IHJocy5tX21hcmdpbjsKKyAgICAgICAgfQorCisgICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yID09ICggQXBwcm94IGNvbnN0JiBsaHMsIGRvdWJsZSByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gb3BlcmF0b3I9PSggcmhzLCBsaHMgKTsKKyAgICAgICAgfQorCisgICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yICE9ICggZG91YmxlIGxocywgQXBwcm94IGNvbnN0JiByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIGxocywgcmhzICk7CisgICAgICAgIH0KKworICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciAhPSAoIEFwcHJveCBjb25zdCYgbGhzLCBkb3VibGUgcmhzICkgeworICAgICAgICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMsIGxocyApOworICAgICAgICB9CisKKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IgPD0gKCBkb3VibGUgbGhzLCBBcHByb3ggY29uc3QmIHJocyApIHsKKyAgICAgICAgICAgIHJldHVybiBsaHMgPCByaHMubV92YWx1ZSB8fCBsaHMgPT0gcmhzOworICAgICAgICB9CisKKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IgPD0gKCBBcHByb3ggY29uc3QmIGxocywgZG91YmxlIHJocyApIHsKKyAgICAgICAgICAgIHJldHVybiBsaHMubV92YWx1ZSA8IHJocyB8fCBsaHMgPT0gcmhzOworICAgICAgICB9CisKKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IgPj0gKCBkb3VibGUgbGhzLCBBcHByb3ggY29uc3QmIHJocyApIHsKKyAgICAgICAgICAgIHJldHVybiBsaHMgPiByaHMubV92YWx1ZSB8fCBsaHMgPT0gcmhzOworICAgICAgICB9CisKKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IgPj0gKCBBcHByb3ggY29uc3QmIGxocywgZG91YmxlIHJocyApIHsKKyAgICAgICAgICAgIHJldHVybiBsaHMubV92YWx1ZSA+IHJocyB8fCBsaHMgPT0gcmhzOworICAgICAgICB9CisKKyAgICAgICAgQXBwcm94JiBlcHNpbG9uKCBkb3VibGUgbmV3RXBzaWxvbiApIHsKKyAgICAgICAgICAgIG1fZXBzaWxvbiA9IG5ld0Vwc2lsb247CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICBBcHByb3gmIG1hcmdpbiggZG91YmxlIG5ld01hcmdpbiApIHsKKyAgICAgICAgICAgIG1fbWFyZ2luID0gbmV3TWFyZ2luOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgQXBwcm94JiBzY2FsZSggZG91YmxlIG5ld1NjYWxlICkgeworICAgICAgICAgICAgbV9zY2FsZSA9IG5ld1NjYWxlOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICBzdGQ6OnN0cmluZyB0b1N0cmluZygpIGNvbnN0IHsKKyAgICAgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgICAgICBvc3MgPDwgIkFwcHJveCggIiA8PCBDYXRjaDo6dG9TdHJpbmcoIG1fdmFsdWUgKSA8PCAiICkiOworICAgICAgICAgICAgcmV0dXJuIG9zcy5zdHIoKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgZG91YmxlIG1fZXBzaWxvbjsKKyAgICAgICAgZG91YmxlIG1fbWFyZ2luOworICAgICAgICBkb3VibGUgbV9zY2FsZTsKKyAgICAgICAgZG91YmxlIG1fdmFsdWU7CisgICAgfTsKK30KKwordGVtcGxhdGU8PgoraW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nPERldGFpbDo6QXBwcm94PiggRGV0YWlsOjpBcHByb3ggY29uc3QmIHZhbHVlICkgeworICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX21hdGNoZXJzX3N0cmluZy5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9NQVRDSEVSU19TVFJJTkdfSF9JTkNMVURFRAorCituYW1lc3BhY2UgQ2F0Y2ggeworbmFtZXNwYWNlIE1hdGNoZXJzIHsKKworICAgIG5hbWVzcGFjZSBTdGRTdHJpbmcgeworCisgICAgICAgIHN0cnVjdCBDYXNlZFN0cmluZworICAgICAgICB7CisgICAgICAgICAgICBDYXNlZFN0cmluZyggc3RkOjpzdHJpbmcgY29uc3QmIHN0ciwgQ2FzZVNlbnNpdGl2ZTo6Q2hvaWNlIGNhc2VTZW5zaXRpdml0eSApOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgYWRqdXN0U3RyaW5nKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyICkgY29uc3Q7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBjYXNlU2Vuc2l0aXZpdHlTdWZmaXgoKSBjb25zdDsKKworICAgICAgICAgICAgQ2FzZVNlbnNpdGl2ZTo6Q2hvaWNlIG1fY2FzZVNlbnNpdGl2aXR5OworICAgICAgICAgICAgc3RkOjpzdHJpbmcgbV9zdHI7CisgICAgICAgIH07CisKKyAgICAgICAgc3RydWN0IFN0cmluZ01hdGNoZXJCYXNlIDogTWF0Y2hlckJhc2U8c3RkOjpzdHJpbmc+IHsKKyAgICAgICAgICAgIFN0cmluZ01hdGNoZXJCYXNlKCBzdGQ6OnN0cmluZyBjb25zdCYgb3BlcmF0aW9uLCBDYXNlZFN0cmluZyBjb25zdCYgY29tcGFyYXRvciApOworICAgICAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBkZXNjcmliZSgpIGNvbnN0IENBVENIX09WRVJSSURFOworCisgICAgICAgICAgICBDYXNlZFN0cmluZyBtX2NvbXBhcmF0b3I7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBtX29wZXJhdGlvbjsKKyAgICAgICAgfTsKKworICAgICAgICBzdHJ1Y3QgRXF1YWxzTWF0Y2hlciA6IFN0cmluZ01hdGNoZXJCYXNlIHsKKyAgICAgICAgICAgIEVxdWFsc01hdGNoZXIoIENhc2VkU3RyaW5nIGNvbnN0JiBjb21wYXJhdG9yICk7CisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWF0Y2goIHN0ZDo6c3RyaW5nIGNvbnN0JiBzb3VyY2UgKSBjb25zdCBDQVRDSF9PVkVSUklERTsKKyAgICAgICAgfTsKKyAgICAgICAgc3RydWN0IENvbnRhaW5zTWF0Y2hlciA6IFN0cmluZ01hdGNoZXJCYXNlIHsKKyAgICAgICAgICAgIENvbnRhaW5zTWF0Y2hlciggQ2FzZWRTdHJpbmcgY29uc3QmIGNvbXBhcmF0b3IgKTsKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXRjaCggc3RkOjpzdHJpbmcgY29uc3QmIHNvdXJjZSApIGNvbnN0IENBVENIX09WRVJSSURFOworICAgICAgICB9OworICAgICAgICBzdHJ1Y3QgU3RhcnRzV2l0aE1hdGNoZXIgOiBTdHJpbmdNYXRjaGVyQmFzZSB7CisgICAgICAgICAgICBTdGFydHNXaXRoTWF0Y2hlciggQ2FzZWRTdHJpbmcgY29uc3QmIGNvbXBhcmF0b3IgKTsKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXRjaCggc3RkOjpzdHJpbmcgY29uc3QmIHNvdXJjZSApIGNvbnN0IENBVENIX09WRVJSSURFOworICAgICAgICB9OworICAgICAgICBzdHJ1Y3QgRW5kc1dpdGhNYXRjaGVyIDogU3RyaW5nTWF0Y2hlckJhc2UgeworICAgICAgICAgICAgRW5kc1dpdGhNYXRjaGVyKCBDYXNlZFN0cmluZyBjb25zdCYgY29tcGFyYXRvciApOworICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoKCBzdGQ6OnN0cmluZyBjb25zdCYgc291cmNlICkgY29uc3QgQ0FUQ0hfT1ZFUlJJREU7CisgICAgICAgIH07CisKKyAgICB9IC8vIG5hbWVzcGFjZSBTdGRTdHJpbmcKKworICAgIC8vIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGNyZWF0ZSB0aGUgYWN0dWFsIG1hdGNoZXIgb2JqZWN0cy4KKyAgICAvLyBUaGlzIGFsbG93cyB0aGUgdHlwZXMgdG8gYmUgaW5mZXJyZWQKKworICAgIFN0ZFN0cmluZzo6RXF1YWxzTWF0Y2hlciBFcXVhbHMoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIsIENhc2VTZW5zaXRpdmU6OkNob2ljZSBjYXNlU2Vuc2l0aXZpdHkgPSBDYXNlU2Vuc2l0aXZlOjpZZXMgKTsKKyAgICBTdGRTdHJpbmc6OkNvbnRhaW5zTWF0Y2hlciBDb250YWlucyggc3RkOjpzdHJpbmcgY29uc3QmIHN0ciwgQ2FzZVNlbnNpdGl2ZTo6Q2hvaWNlIGNhc2VTZW5zaXRpdml0eSA9IENhc2VTZW5zaXRpdmU6OlllcyApOworICAgIFN0ZFN0cmluZzo6RW5kc1dpdGhNYXRjaGVyIEVuZHNXaXRoKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyLCBDYXNlU2Vuc2l0aXZlOjpDaG9pY2UgY2FzZVNlbnNpdGl2aXR5ID0gQ2FzZVNlbnNpdGl2ZTo6WWVzICk7CisgICAgU3RkU3RyaW5nOjpTdGFydHNXaXRoTWF0Y2hlciBTdGFydHNXaXRoKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyLCBDYXNlU2Vuc2l0aXZlOjpDaG9pY2UgY2FzZVNlbnNpdGl2aXR5ID0gQ2FzZVNlbnNpdGl2ZTo6WWVzICk7CisKK30gLy8gbmFtZXNwYWNlIE1hdGNoZXJzCit9IC8vIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogaW50ZXJuYWwvY2F0Y2hfbWF0Y2hlcnNfdmVjdG9yLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX01BVENIRVJTX1ZFQ1RPUl9IX0lOQ0xVREVECisKK25hbWVzcGFjZSBDYXRjaCB7CituYW1lc3BhY2UgTWF0Y2hlcnMgeworCisgICAgbmFtZXNwYWNlIFZlY3RvciB7CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgc3RydWN0IENvbnRhaW5zRWxlbWVudE1hdGNoZXIgOiBNYXRjaGVyQmFzZTxzdGQ6OnZlY3RvcjxUPiwgVD4geworCisgICAgICAgICAgICBDb250YWluc0VsZW1lbnRNYXRjaGVyKFQgY29uc3QgJmNvbXBhcmF0b3IpIDogbV9jb21wYXJhdG9yKCBjb21wYXJhdG9yKSB7fQorCisgICAgICAgICAgICBib29sIG1hdGNoKHN0ZDo6dmVjdG9yPFQ+IGNvbnN0ICZ2KSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0ZDo6ZmluZCh2LmJlZ2luKCksIHYuZW5kKCksIG1fY29tcGFyYXRvcikgIT0gdi5lbmQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBkZXNjcmliZSgpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIkNvbnRhaW5zOiAiICsgQ2F0Y2g6OnRvU3RyaW5nKCBtX2NvbXBhcmF0b3IgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgVCBjb25zdCYgbV9jb21wYXJhdG9yOworICAgICAgICB9OworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIHN0cnVjdCBDb250YWluc01hdGNoZXIgOiBNYXRjaGVyQmFzZTxzdGQ6OnZlY3RvcjxUPiwgc3RkOjp2ZWN0b3I8VD4gPiB7CisKKyAgICAgICAgICAgIENvbnRhaW5zTWF0Y2hlcihzdGQ6OnZlY3RvcjxUPiBjb25zdCAmY29tcGFyYXRvcikgOiBtX2NvbXBhcmF0b3IoIGNvbXBhcmF0b3IgKSB7fQorCisgICAgICAgICAgICBib29sIG1hdGNoKHN0ZDo6dmVjdG9yPFQ+IGNvbnN0ICZ2KSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgLy8gIVRCRDogc2VlIG5vdGUgaW4gRXF1YWxzTWF0Y2hlcgorICAgICAgICAgICAgICAgIGlmIChtX2NvbXBhcmF0b3Iuc2l6ZSgpID4gdi5zaXplKCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fY29tcGFyYXRvci5zaXplKCk7ICsraSkKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZDo6ZmluZCh2LmJlZ2luKCksIHYuZW5kKCksIG1fY29tcGFyYXRvcltpXSkgPT0gdi5lbmQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZGVzY3JpYmUoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJDb250YWluczogIiArIENhdGNoOjp0b1N0cmluZyggbV9jb21wYXJhdG9yICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFQ+IGNvbnN0JiBtX2NvbXBhcmF0b3I7CisgICAgICAgIH07CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgc3RydWN0IEVxdWFsc01hdGNoZXIgOiBNYXRjaGVyQmFzZTxzdGQ6OnZlY3RvcjxUPiwgc3RkOjp2ZWN0b3I8VD4gPiB7CisKKyAgICAgICAgICAgIEVxdWFsc01hdGNoZXIoc3RkOjp2ZWN0b3I8VD4gY29uc3QgJmNvbXBhcmF0b3IpIDogbV9jb21wYXJhdG9yKCBjb21wYXJhdG9yICkge30KKworICAgICAgICAgICAgYm9vbCBtYXRjaChzdGQ6OnZlY3RvcjxUPiBjb25zdCAmdikgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIC8vICFUQkQ6IFRoaXMgY3VycmVudGx5IHdvcmtzIGlmIGFsbCBlbGVtZW50cyBjYW4gYmUgY29tcGFyZWQgdXNpbmcgIT0KKyAgICAgICAgICAgICAgICAvLyAtIGEgbW9yZSBnZW5lcmFsIGFwcHJvYWNoIHdvdWxkIGJlIHZpYSBhIGNvbXBhcmUgdGVtcGxhdGUgdGhhdCBkZWZhdWx0cworICAgICAgICAgICAgICAgIC8vIHRvIHVzaW5nICE9LiBidXQgY291bGQgYmUgc3BlY2lhbGlzZWQgZm9yLCBlLmcuIHN0ZDo6dmVjdG9yPFQ+IGV0YworICAgICAgICAgICAgICAgIC8vIC0gdGhlbiBqdXN0IGNhbGwgdGhhdCBkaXJlY3RseQorICAgICAgICAgICAgICAgIGlmIChtX2NvbXBhcmF0b3Iuc2l6ZSgpICE9IHYuc2l6ZSgpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB2LnNpemUoKTsgKytpKQorICAgICAgICAgICAgICAgICAgICBpZiAobV9jb21wYXJhdG9yW2ldICE9IHZbaV0pCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIHJldHVybiAiRXF1YWxzOiAiICsgQ2F0Y2g6OnRvU3RyaW5nKCBtX2NvbXBhcmF0b3IgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFQ+IGNvbnN0JiBtX2NvbXBhcmF0b3I7CisgICAgICAgIH07CisKKyAgICB9IC8vIG5hbWVzcGFjZSBWZWN0b3IKKworICAgIC8vIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGNyZWF0ZSB0aGUgYWN0dWFsIG1hdGNoZXIgb2JqZWN0cy4KKyAgICAvLyBUaGlzIGFsbG93cyB0aGUgdHlwZXMgdG8gYmUgaW5mZXJyZWQKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgVmVjdG9yOjpDb250YWluc01hdGNoZXI8VD4gQ29udGFpbnMoIHN0ZDo6dmVjdG9yPFQ+IGNvbnN0JiBjb21wYXJhdG9yICkgeworICAgICAgICByZXR1cm4gVmVjdG9yOjpDb250YWluc01hdGNoZXI8VD4oIGNvbXBhcmF0b3IgKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIFZlY3Rvcjo6Q29udGFpbnNFbGVtZW50TWF0Y2hlcjxUPiBWZWN0b3JDb250YWlucyggVCBjb25zdCYgY29tcGFyYXRvciApIHsKKyAgICAgICAgcmV0dXJuIFZlY3Rvcjo6Q29udGFpbnNFbGVtZW50TWF0Y2hlcjxUPiggY29tcGFyYXRvciApOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgVmVjdG9yOjpFcXVhbHNNYXRjaGVyPFQ+IEVxdWFscyggc3RkOjp2ZWN0b3I8VD4gY29uc3QmIGNvbXBhcmF0b3IgKSB7CisgICAgICAgIHJldHVybiBWZWN0b3I6OkVxdWFsc01hdGNoZXI8VD4oIGNvbXBhcmF0b3IgKTsKKyAgICB9CisKK30gLy8gbmFtZXNwYWNlIE1hdGNoZXJzCit9IC8vIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogaW50ZXJuYWwvY2F0Y2hfaW50ZXJmYWNlc190YWdfYWxpYXNfcmVnaXN0cnkuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfSU5URVJGQUNFU19UQUdfQUxJQVNfUkVHSVNUUllfSF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfdGFnX2FsaWFzLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1RBR19BTElBU19IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdHJ1Y3QgVGFnQWxpYXMgeworICAgICAgICBUYWdBbGlhcyggc3RkOjpzdHJpbmcgY29uc3QmIF90YWcsIFNvdXJjZUxpbmVJbmZvIF9saW5lSW5mbyApIDogdGFnKCBfdGFnICksIGxpbmVJbmZvKCBfbGluZUluZm8gKSB7fQorCisgICAgICAgIHN0ZDo6c3RyaW5nIHRhZzsKKyAgICAgICAgU291cmNlTGluZUluZm8gbGluZUluZm87CisgICAgfTsKKworICAgIHN0cnVjdCBSZWdpc3RyYXJGb3JUYWdBbGlhc2VzIHsKKyAgICAgICAgUmVnaXN0cmFyRm9yVGFnQWxpYXNlcyggY2hhciBjb25zdCogYWxpYXMsIGNoYXIgY29uc3QqIHRhZywgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvICk7CisgICAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKyNkZWZpbmUgQ0FUQ0hfUkVHSVNURVJfVEFHX0FMSUFTKCBhbGlhcywgc3BlYyApIG5hbWVzcGFjZXsgQ2F0Y2g6OlJlZ2lzdHJhckZvclRhZ0FsaWFzZXMgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIEF1dG9SZWdpc3RlclRhZ0FsaWFzICkoIGFsaWFzLCBzcGVjLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTyApOyB9CisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfb3B0aW9uLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfT1BUSU9OX0hQUF9JTkNMVURFRAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgLy8gQW4gb3B0aW9uYWwgdHlwZQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgY2xhc3MgT3B0aW9uIHsKKyAgICBwdWJsaWM6CisgICAgICAgIE9wdGlvbigpIDogbnVsbGFibGVWYWx1ZSggQ0FUQ0hfTlVMTCApIHt9CisgICAgICAgIE9wdGlvbiggVCBjb25zdCYgX3ZhbHVlICkKKyAgICAgICAgOiBudWxsYWJsZVZhbHVlKCBuZXcoIHN0b3JhZ2UgKSBUKCBfdmFsdWUgKSApCisgICAgICAgIHt9CisgICAgICAgIE9wdGlvbiggT3B0aW9uIGNvbnN0JiBfb3RoZXIgKQorICAgICAgICA6IG51bGxhYmxlVmFsdWUoIF9vdGhlciA/IG5ldyggc3RvcmFnZSApIFQoICpfb3RoZXIgKSA6IENBVENIX05VTEwgKQorICAgICAgICB7fQorCisgICAgICAgIH5PcHRpb24oKSB7CisgICAgICAgICAgICByZXNldCgpOworICAgICAgICB9CisKKyAgICAgICAgT3B0aW9uJiBvcGVyYXRvcj0gKCBPcHRpb24gY29uc3QmIF9vdGhlciApIHsKKyAgICAgICAgICAgIGlmKCAmX290aGVyICE9IHRoaXMgKSB7CisgICAgICAgICAgICAgICAgcmVzZXQoKTsKKyAgICAgICAgICAgICAgICBpZiggX290aGVyICkKKyAgICAgICAgICAgICAgICAgICAgbnVsbGFibGVWYWx1ZSA9IG5ldyggc3RvcmFnZSApIFQoICpfb3RoZXIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorICAgICAgICBPcHRpb24mIG9wZXJhdG9yID0gKCBUIGNvbnN0JiBfdmFsdWUgKSB7CisgICAgICAgICAgICByZXNldCgpOworICAgICAgICAgICAgbnVsbGFibGVWYWx1ZSA9IG5ldyggc3RvcmFnZSApIFQoIF92YWx1ZSApOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCByZXNldCgpIHsKKyAgICAgICAgICAgIGlmKCBudWxsYWJsZVZhbHVlICkKKyAgICAgICAgICAgICAgICBudWxsYWJsZVZhbHVlLT5+VCgpOworICAgICAgICAgICAgbnVsbGFibGVWYWx1ZSA9IENBVENIX05VTEw7CisgICAgICAgIH0KKworICAgICAgICBUJiBvcGVyYXRvciooKSB7IHJldHVybiAqbnVsbGFibGVWYWx1ZTsgfQorICAgICAgICBUIGNvbnN0JiBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiAqbnVsbGFibGVWYWx1ZTsgfQorICAgICAgICBUKiBvcGVyYXRvci0+KCkgeyByZXR1cm4gbnVsbGFibGVWYWx1ZTsgfQorICAgICAgICBjb25zdCBUKiBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gbnVsbGFibGVWYWx1ZTsgfQorCisgICAgICAgIFQgdmFsdWVPciggVCBjb25zdCYgZGVmYXVsdFZhbHVlICkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG51bGxhYmxlVmFsdWUgPyAqbnVsbGFibGVWYWx1ZSA6IGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgc29tZSgpIGNvbnN0IHsgcmV0dXJuIG51bGxhYmxlVmFsdWUgIT0gQ0FUQ0hfTlVMTDsgfQorICAgICAgICBib29sIG5vbmUoKSBjb25zdCB7IHJldHVybiBudWxsYWJsZVZhbHVlID09IENBVENIX05VTEw7IH0KKworICAgICAgICBib29sIG9wZXJhdG9yICEoKSBjb25zdCB7IHJldHVybiBudWxsYWJsZVZhbHVlID09IENBVENIX05VTEw7IH0KKyAgICAgICAgb3BlcmF0b3IgU2FmZUJvb2w6OnR5cGUoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gU2FmZUJvb2w6Om1ha2VTYWZlKCBzb21lKCkgKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgVCAqbnVsbGFibGVWYWx1ZTsKKyAgICAgICAgdW5pb24geworICAgICAgICAgICAgY2hhciBzdG9yYWdlW3NpemVvZihUKV07CisKKyAgICAgICAgICAgIC8vIFRoZXNlIGFyZSBoZXJlIHRvIGZvcmNlIGFsaWdubWVudCBmb3IgdGhlIHN0b3JhZ2UKKyAgICAgICAgICAgIGxvbmcgZG91YmxlIGR1bW15MTsKKyAgICAgICAgICAgIHZvaWQgKCpkdW1teTIpKCk7CisgICAgICAgICAgICBsb25nIGRvdWJsZSBkdW1teTM7CisjaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX0xPTkdfTE9ORworICAgICAgICAgICAgbG9uZyBsb25nIGR1bW15NDsKKyNlbmRpZgorICAgICAgICB9OworICAgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IElUYWdBbGlhc1JlZ2lzdHJ5IHsKKyAgICAgICAgdmlydHVhbCB+SVRhZ0FsaWFzUmVnaXN0cnkoKTsKKyAgICAgICAgdmlydHVhbCBPcHRpb248VGFnQWxpYXM+IGZpbmQoIHN0ZDo6c3RyaW5nIGNvbnN0JiBhbGlhcyApIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBleHBhbmRBbGlhc2VzKCBzdGQ6OnN0cmluZyBjb25zdCYgdW5leHBhbmRlZFRlc3RTcGVjICkgY29uc3QgPSAwOworCisgICAgICAgIHN0YXRpYyBJVGFnQWxpYXNSZWdpc3RyeSBjb25zdCYgZ2V0KCk7CisgICAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vIFRoZXNlIGZpbGVzIGFyZSBpbmNsdWRlZCBoZXJlIHNvIHRoZSBzaW5nbGVfaW5jbHVkZSBzY3JpcHQgZG9lc24ndCBwdXQgdGhlbQorLy8gaW4gdGhlIGNvbmRpdGlvbmFsbHkgY29tcGlsZWQgc2VjdGlvbnMKKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF90ZXN0X2Nhc2VfaW5mby5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9URVNUX0NBU0VfSU5GT19IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c2V0PgorCisjaWZkZWYgX19jbGFuZ19fCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XcGFkZGVkIgorI2VuZGlmCisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdHJ1Y3QgSVRlc3RDYXNlOworCisgICAgc3RydWN0IFRlc3RDYXNlSW5mbyB7CisgICAgICAgIGVudW0gU3BlY2lhbFByb3BlcnRpZXN7CisgICAgICAgICAgICBOb25lID0gMCwKKyAgICAgICAgICAgIElzSGlkZGVuID0gMSA8PCAxLAorICAgICAgICAgICAgU2hvdWxkRmFpbCA9IDEgPDwgMiwKKyAgICAgICAgICAgIE1heUZhaWwgPSAxIDw8IDMsCisgICAgICAgICAgICBUaHJvd3MgPSAxIDw8IDQsCisgICAgICAgICAgICBOb25Qb3J0YWJsZSA9IDEgPDwgNQorICAgICAgICB9OworCisgICAgICAgIFRlc3RDYXNlSW5mbyggICBzdGQ6OnN0cmluZyBjb25zdCYgX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgX2NsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfZGVzY3JpcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gY29uc3QmIF90YWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTGluZUluZm8gY29uc3QmIF9saW5lSW5mbyApOworCisgICAgICAgIFRlc3RDYXNlSW5mbyggVGVzdENhc2VJbmZvIGNvbnN0JiBvdGhlciApOworCisgICAgICAgIGZyaWVuZCB2b2lkIHNldFRhZ3MoIFRlc3RDYXNlSW5mbyYgdGVzdENhc2VJbmZvLCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gY29uc3QmIHRhZ3MgKTsKKworICAgICAgICBib29sIGlzSGlkZGVuKCkgY29uc3Q7CisgICAgICAgIGJvb2wgdGhyb3dzKCkgY29uc3Q7CisgICAgICAgIGJvb2wgb2tUb0ZhaWwoKSBjb25zdDsKKyAgICAgICAgYm9vbCBleHBlY3RlZFRvRmFpbCgpIGNvbnN0OworCisgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgICAgIHN0ZDo6c3RyaW5nIGNsYXNzTmFtZTsKKyAgICAgICAgc3RkOjpzdHJpbmcgZGVzY3JpcHRpb247CisgICAgICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiB0YWdzOworICAgICAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gbGNhc2VUYWdzOworICAgICAgICBzdGQ6OnN0cmluZyB0YWdzQXNTdHJpbmc7CisgICAgICAgIFNvdXJjZUxpbmVJbmZvIGxpbmVJbmZvOworICAgICAgICBTcGVjaWFsUHJvcGVydGllcyBwcm9wZXJ0aWVzOworICAgIH07CisKKyAgICBjbGFzcyBUZXN0Q2FzZSA6IHB1YmxpYyBUZXN0Q2FzZUluZm8geworICAgIHB1YmxpYzoKKworICAgICAgICBUZXN0Q2FzZSggSVRlc3RDYXNlKiB0ZXN0Q2FzZSwgVGVzdENhc2VJbmZvIGNvbnN0JiBpbmZvICk7CisgICAgICAgIFRlc3RDYXNlKCBUZXN0Q2FzZSBjb25zdCYgb3RoZXIgKTsKKworICAgICAgICBUZXN0Q2FzZSB3aXRoTmFtZSggc3RkOjpzdHJpbmcgY29uc3QmIF9uZXdOYW1lICkgY29uc3Q7CisKKyAgICAgICAgdm9pZCBpbnZva2UoKSBjb25zdDsKKworICAgICAgICBUZXN0Q2FzZUluZm8gY29uc3QmIGdldFRlc3RDYXNlSW5mbygpIGNvbnN0OworCisgICAgICAgIHZvaWQgc3dhcCggVGVzdENhc2UmIG90aGVyICk7CisgICAgICAgIGJvb2wgb3BlcmF0b3IgPT0gKCBUZXN0Q2FzZSBjb25zdCYgb3RoZXIgKSBjb25zdDsKKyAgICAgICAgYm9vbCBvcGVyYXRvciA8ICggVGVzdENhc2UgY29uc3QmIG90aGVyICkgY29uc3Q7CisgICAgICAgIFRlc3RDYXNlJiBvcGVyYXRvciA9ICggVGVzdENhc2UgY29uc3QmIG90aGVyICk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBQdHI8SVRlc3RDYXNlPiB0ZXN0OworICAgIH07CisKKyAgICBUZXN0Q2FzZSBtYWtlVGVzdENhc2UoICBJVGVzdENhc2UqIHRlc3RDYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBjbGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIGRlc2NyaXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBsaW5lSW5mbyApOworfQorCisjaWZkZWYgX19jbGFuZ19fCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCisjZW5kaWYKKworCisjaWZkZWYgX19PQkpDX18KKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF9vYmpjLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfT0JKQ19IUFBfSU5DTFVERUQKKworI2ltcG9ydCA8b2JqYy9ydW50aW1lLmg+CisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKy8vIE5CLiBBbnkgZ2VuZXJhbCBjYXRjaCBoZWFkZXJzIGluY2x1ZGVkIGhlcmUgbXVzdCBiZSBpbmNsdWRlZAorLy8gaW4gY2F0Y2guaHBwIGZpcnN0IHRvIG1ha2Ugc3VyZSB0aGV5IGFyZSBpbmNsdWRlZCBieSB0aGUgc2luZ2xlCisvLyBoZWFkZXIgZm9yIG5vbiBvYmotdXNhZ2UKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVGhpcyBwcm90b2NvbCBpcyByZWFsbHkgb25seSBoZXJlIGZvciAoc2VsZikgZG9jdW1lbnRpbmcgcHVycG9zZXMsIHNpbmNlCisvLyBhbGwgaXRzIG1ldGhvZHMgYXJlIG9wdGlvbmFsLgorQHByb3RvY29sIE9jRml4dHVyZQorCitAb3B0aW9uYWwKKworLSh2b2lkKSBzZXRVcDsKKy0odm9pZCkgdGVhckRvd247CisKK0BlbmQKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGNsYXNzIE9jTWV0aG9kIDogcHVibGljIFNoYXJlZEltcGw8SVRlc3RDYXNlPiB7CisKKyAgICBwdWJsaWM6CisgICAgICAgIE9jTWV0aG9kKCBDbGFzcyBjbHMsIFNFTCBzZWwgKSA6IG1fY2xzKCBjbHMgKSwgbV9zZWwoIHNlbCApIHt9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGludm9rZSgpIGNvbnN0IHsKKyAgICAgICAgICAgIGlkIG9iaiA9IFtbbV9jbHMgYWxsb2NdIGluaXRdOworCisgICAgICAgICAgICBwZXJmb3JtT3B0aW9uYWxTZWxlY3Rvciggb2JqLCBAc2VsZWN0b3Ioc2V0VXApICApOworICAgICAgICAgICAgcGVyZm9ybU9wdGlvbmFsU2VsZWN0b3IoIG9iaiwgbV9zZWwgKTsKKyAgICAgICAgICAgIHBlcmZvcm1PcHRpb25hbFNlbGVjdG9yKCBvYmosIEBzZWxlY3Rvcih0ZWFyRG93bikgICk7CisKKyAgICAgICAgICAgIGFyY1NhZmVSZWxlYXNlKCBvYmogKTsKKyAgICAgICAgfQorICAgIHByaXZhdGU6CisgICAgICAgIHZpcnR1YWwgfk9jTWV0aG9kKCkge30KKworICAgICAgICBDbGFzcyBtX2NsczsKKyAgICAgICAgU0VMIG1fc2VsOworICAgIH07CisKKyAgICBuYW1lc3BhY2UgRGV0YWlseworCisgICAgICAgIGlubGluZSBzdGQ6OnN0cmluZyBnZXRBbm5vdGF0aW9uKCAgIENsYXNzIGNscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIGFubm90YXRpb25OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgdGVzdENhc2VOYW1lICkgeworICAgICAgICAgICAgTlNTdHJpbmcqIHNlbFN0ciA9IFtbTlNTdHJpbmcgYWxsb2NdIGluaXRXaXRoRm9ybWF0OkAiQ2F0Y2hfJXNfJXMiLCBhbm5vdGF0aW9uTmFtZS5jX3N0cigpLCB0ZXN0Q2FzZU5hbWUuY19zdHIoKV07CisgICAgICAgICAgICBTRUwgc2VsID0gTlNTZWxlY3RvckZyb21TdHJpbmcoIHNlbFN0ciApOworICAgICAgICAgICAgYXJjU2FmZVJlbGVhc2UoIHNlbFN0ciApOworICAgICAgICAgICAgaWQgdmFsdWUgPSBwZXJmb3JtT3B0aW9uYWxTZWxlY3RvciggY2xzLCBzZWwgKTsKKyAgICAgICAgICAgIGlmKCB2YWx1ZSApCisgICAgICAgICAgICAgICAgcmV0dXJuIFsoTlNTdHJpbmcqKXZhbHVlIFVURjhTdHJpbmddOworICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICB9CisgICAgfQorCisgICAgaW5saW5lIHNpemVfdCByZWdpc3RlclRlc3RNZXRob2RzKCkgeworICAgICAgICBzaXplX3Qgbm9UZXN0TWV0aG9kcyA9IDA7CisgICAgICAgIGludCBub0NsYXNzZXMgPSBvYmpjX2dldENsYXNzTGlzdCggQ0FUQ0hfTlVMTCwgMCApOworCisgICAgICAgIENsYXNzKiBjbGFzc2VzID0gKENBVENIX1VOU0FGRV9VTlJFVEFJTkVEIENsYXNzICopbWFsbG9jKCBzaXplb2YoQ2xhc3MpICogbm9DbGFzc2VzKTsKKyAgICAgICAgb2JqY19nZXRDbGFzc0xpc3QoIGNsYXNzZXMsIG5vQ2xhc3NlcyApOworCisgICAgICAgIGZvciggaW50IGMgPSAwOyBjIDwgbm9DbGFzc2VzOyBjKysgKSB7CisgICAgICAgICAgICBDbGFzcyBjbHMgPSBjbGFzc2VzW2NdOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVfaW50IGNvdW50OworICAgICAgICAgICAgICAgIE1ldGhvZCogbWV0aG9kcyA9IGNsYXNzX2NvcHlNZXRob2RMaXN0KCBjbHMsICZjb3VudCApOworICAgICAgICAgICAgICAgIGZvciggdV9pbnQgbSA9IDA7IG0gPCBjb3VudCA7IG0rKyApIHsKKyAgICAgICAgICAgICAgICAgICAgU0VMIHNlbGVjdG9yID0gbWV0aG9kX2dldE5hbWUobWV0aG9kc1ttXSk7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1ldGhvZE5hbWUgPSBzZWxfZ2V0TmFtZShzZWxlY3Rvcik7CisgICAgICAgICAgICAgICAgICAgIGlmKCBzdGFydHNXaXRoKCBtZXRob2ROYW1lLCAiQ2F0Y2hfVGVzdENhc2VfIiApICkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdGVzdENhc2VOYW1lID0gbWV0aG9kTmFtZS5zdWJzdHIoIDE1ICk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lID0gRGV0YWlsOjpnZXRBbm5vdGF0aW9uKCBjbHMsICJOYW1lIiwgdGVzdENhc2VOYW1lICk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBkZXNjID0gRGV0YWlsOjpnZXRBbm5vdGF0aW9uKCBjbHMsICJEZXNjcmlwdGlvbiIsIHRlc3RDYXNlTmFtZSApOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY2xhc3NOYW1lID0gY2xhc3NfZ2V0TmFtZSggY2xzICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldE11dGFibGVSZWdpc3RyeUh1YigpLnJlZ2lzdGVyVGVzdCggbWFrZVRlc3RDYXNlKCBuZXcgT2NNZXRob2QoIGNscywgc2VsZWN0b3IgKSwgY2xhc3NOYW1lLCBuYW1lLmNfc3RyKCksIGRlc2MuY19zdHIoKSwgU291cmNlTGluZUluZm8oKSApICk7CisgICAgICAgICAgICAgICAgICAgICAgICBub1Rlc3RNZXRob2RzKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZnJlZShtZXRob2RzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbm9UZXN0TWV0aG9kczsKKyAgICB9CisKKyAgICBuYW1lc3BhY2UgTWF0Y2hlcnMgeworICAgICAgICBuYW1lc3BhY2UgSW1wbCB7CisgICAgICAgIG5hbWVzcGFjZSBOU1N0cmluZ01hdGNoZXJzIHsKKworICAgICAgICAgICAgc3RydWN0IFN0cmluZ0hvbGRlciA6IE1hdGNoZXJCYXNlPE5TU3RyaW5nKj57CisgICAgICAgICAgICAgICAgU3RyaW5nSG9sZGVyKCBOU1N0cmluZyogc3Vic3RyICkgOiBtX3N1YnN0ciggW3N1YnN0ciBjb3B5XSApe30KKyAgICAgICAgICAgICAgICBTdHJpbmdIb2xkZXIoIFN0cmluZ0hvbGRlciBjb25zdCYgb3RoZXIgKSA6IG1fc3Vic3RyKCBbb3RoZXIubV9zdWJzdHIgY29weV0gKXt9CisgICAgICAgICAgICAgICAgU3RyaW5nSG9sZGVyKCkgeworICAgICAgICAgICAgICAgICAgICBhcmNTYWZlUmVsZWFzZSggbV9zdWJzdHIgKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWF0Y2goIE5TU3RyaW5nKiBhcmcgKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBOU1N0cmluZyogbV9zdWJzdHI7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBzdHJ1Y3QgRXF1YWxzIDogU3RyaW5nSG9sZGVyIHsKKyAgICAgICAgICAgICAgICBFcXVhbHMoIE5TU3RyaW5nKiBzdWJzdHIgKSA6IFN0cmluZ0hvbGRlciggc3Vic3RyICl7fQorCisgICAgICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoKCBOU1N0cmluZyogc3RyICkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gIChzdHIgIT0gbmlsIHx8IG1fc3Vic3RyID09IG5pbCApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0ciBpc0VxdWFsVG9TdHJpbmc6bV9zdWJzdHJdOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZGVzY3JpYmUoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiZXF1YWxzIHN0cmluZzogIiArIENhdGNoOjp0b1N0cmluZyggbV9zdWJzdHIgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBzdHJ1Y3QgQ29udGFpbnMgOiBTdHJpbmdIb2xkZXIgeworICAgICAgICAgICAgICAgIENvbnRhaW5zKCBOU1N0cmluZyogc3Vic3RyICkgOiBTdHJpbmdIb2xkZXIoIHN1YnN0ciApe30KKworICAgICAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXRjaCggTlNTdHJpbmcqIHN0ciApIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICAoc3RyICE9IG5pbCB8fCBtX3N1YnN0ciA9PSBuaWwgKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHIgcmFuZ2VPZlN0cmluZzptX3N1YnN0cl0ubG9jYXRpb24gIT0gTlNOb3RGb3VuZDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gImNvbnRhaW5zIHN0cmluZzogIiArIENhdGNoOjp0b1N0cmluZyggbV9zdWJzdHIgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBzdHJ1Y3QgU3RhcnRzV2l0aCA6IFN0cmluZ0hvbGRlciB7CisgICAgICAgICAgICAgICAgU3RhcnRzV2l0aCggTlNTdHJpbmcqIHN1YnN0ciApIDogU3RyaW5nSG9sZGVyKCBzdWJzdHIgKXt9CisKKyAgICAgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWF0Y2goIE5TU3RyaW5nKiBzdHIgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAgKHN0ciAhPSBuaWwgfHwgbV9zdWJzdHIgPT0gbmlsICkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3RyIHJhbmdlT2ZTdHJpbmc6bV9zdWJzdHJdLmxvY2F0aW9uID09IDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBkZXNjcmliZSgpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJzdGFydHMgd2l0aDogIiArIENhdGNoOjp0b1N0cmluZyggbV9zdWJzdHIgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgc3RydWN0IEVuZHNXaXRoIDogU3RyaW5nSG9sZGVyIHsKKyAgICAgICAgICAgICAgICBFbmRzV2l0aCggTlNTdHJpbmcqIHN1YnN0ciApIDogU3RyaW5nSG9sZGVyKCBzdWJzdHIgKXt9CisKKyAgICAgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWF0Y2goIE5TU3RyaW5nKiBzdHIgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAgKHN0ciAhPSBuaWwgfHwgbV9zdWJzdHIgPT0gbmlsICkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3RyIHJhbmdlT2ZTdHJpbmc6bV9zdWJzdHJdLmxvY2F0aW9uID09IFtzdHIgbGVuZ3RoXSAtIFttX3N1YnN0ciBsZW5ndGhdOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZGVzY3JpYmUoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiZW5kcyB3aXRoOiAiICsgQ2F0Y2g6OnRvU3RyaW5nKCBtX3N1YnN0ciApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgfSAvLyBuYW1lc3BhY2UgTlNTdHJpbmdNYXRjaGVycworICAgICAgICB9IC8vIG5hbWVzcGFjZSBJbXBsCisKKyAgICAgICAgaW5saW5lIEltcGw6Ok5TU3RyaW5nTWF0Y2hlcnM6OkVxdWFscworICAgICAgICAgICAgRXF1YWxzKCBOU1N0cmluZyogc3Vic3RyICl7IHJldHVybiBJbXBsOjpOU1N0cmluZ01hdGNoZXJzOjpFcXVhbHMoIHN1YnN0ciApOyB9CisKKyAgICAgICAgaW5saW5lIEltcGw6Ok5TU3RyaW5nTWF0Y2hlcnM6OkNvbnRhaW5zCisgICAgICAgICAgICBDb250YWlucyggTlNTdHJpbmcqIHN1YnN0ciApeyByZXR1cm4gSW1wbDo6TlNTdHJpbmdNYXRjaGVyczo6Q29udGFpbnMoIHN1YnN0ciApOyB9CisKKyAgICAgICAgaW5saW5lIEltcGw6Ok5TU3RyaW5nTWF0Y2hlcnM6OlN0YXJ0c1dpdGgKKyAgICAgICAgICAgIFN0YXJ0c1dpdGgoIE5TU3RyaW5nKiBzdWJzdHIgKXsgcmV0dXJuIEltcGw6Ok5TU3RyaW5nTWF0Y2hlcnM6OlN0YXJ0c1dpdGgoIHN1YnN0ciApOyB9CisKKyAgICAgICAgaW5saW5lIEltcGw6Ok5TU3RyaW5nTWF0Y2hlcnM6OkVuZHNXaXRoCisgICAgICAgICAgICBFbmRzV2l0aCggTlNTdHJpbmcqIHN1YnN0ciApeyByZXR1cm4gSW1wbDo6TlNTdHJpbmdNYXRjaGVyczo6RW5kc1dpdGgoIHN1YnN0ciApOyB9CisKKyAgICB9IC8vIG5hbWVzcGFjZSBNYXRjaGVycworCisgICAgdXNpbmcgbmFtZXNwYWNlIE1hdGNoZXJzOworCit9IC8vIG5hbWVzcGFjZSBDYXRjaAorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisjZGVmaW5lIE9DX1RFU1RfQ0FTRSggbmFtZSwgZGVzYyApXAorKyhOU1N0cmluZyopIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBDYXRjaF9OYW1lX3Rlc3QgKSBcCit7XAorcmV0dXJuIEAgbmFtZTsgXAorfVwKKysoTlNTdHJpbmcqKSBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggQ2F0Y2hfRGVzY3JpcHRpb25fdGVzdCApIFwKK3sgXAorcmV0dXJuIEAgZGVzYzsgXAorfSBcCistKHZvaWQpIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBDYXRjaF9UZXN0Q2FzZV90ZXN0ICkKKworI2VuZGlmCisKKyNpZmRlZiBDQVRDSF9JTVBMCisKKy8vICFUQkQ6IE1vdmUgdGhlIGxlYWsgZGV0ZWN0b3IgY29kZSBpbnRvIGEgc2VwYXJhdGUgaGVhZGVyCisjaWZkZWYgQ0FUQ0hfQ09ORklHX1dJTkRPV1NfQ1JUREJHCisjaW5jbHVkZSA8Y3J0ZGJnLmg+CitjbGFzcyBMZWFrRGV0ZWN0b3IgeworcHVibGljOgorCUxlYWtEZXRlY3RvcigpIHsKKwkJaW50IGZsYWcgPSBfQ3J0U2V0RGJnRmxhZyhfQ1JUREJHX1JFUE9SVF9GTEFHKTsKKwkJZmxhZyB8PSBfQ1JUREJHX0xFQUtfQ0hFQ0tfREY7CisJCWZsYWcgfD0gX0NSVERCR19BTExPQ19NRU1fREY7CisJCV9DcnRTZXREYmdGbGFnKGZsYWcpOworCQlfQ3J0U2V0UmVwb3J0TW9kZShfQ1JUX1dBUk4sIF9DUlREQkdfTU9ERV9GSUxFIHwgX0NSVERCR19NT0RFX0RFQlVHKTsKKwkJX0NydFNldFJlcG9ydEZpbGUoX0NSVF9XQVJOLCBfQ1JUREJHX0ZJTEVfU1RERVJSKTsKKwkJLy8gQ2hhbmdlIHRoaXMgdG8gbGVha2luZyBhbGxvY2F0aW9uJ3MgbnVtYmVyIHRvIGJyZWFrIHRoZXJlCisJCV9DcnRTZXRCcmVha0FsbG9jKC0xKTsKKwl9Cit9OworI2Vsc2UKK2NsYXNzIExlYWtEZXRlY3RvciB7fTsKKyNlbmRpZgorCitMZWFrRGV0ZWN0b3IgbGVha0RldGVjdG9yOworCisvLyAjaW5jbHVkZWQgZnJvbTogaW50ZXJuYWwvY2F0Y2hfaW1wbC5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0lNUExfSFBQX0lOQ0xVREVECisKKy8vIENvbGxlY3QgYWxsIHRoZSBpbXBsZW1lbnRhdGlvbiBmaWxlcyB0b2dldGhlciBoZXJlCisvLyBUaGVzZSBhcmUgdGhlIGVxdWl2YWxlbnQgb2Ygd2hhdCB3b3VsZCB1c3VhbGx5IGJlIGNwcCBmaWxlcworCisjaWZkZWYgX19jbGFuZ19fCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1Xd2Vhay12dGFibGVzIgorI2VuZGlmCisKKy8vICNpbmNsdWRlZCBmcm9tOiAuLi9jYXRjaF9zZXNzaW9uLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfUlVOTkVSX0hQUF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogaW50ZXJuYWwvY2F0Y2hfY29tbWFuZGxpbmUuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9DT01NQU5ETElORV9IUFBfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2NvbmZpZy5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0NPTkZJR19IUFBfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3Rlc3Rfc3BlY19wYXJzZXIuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9URVNUX1NQRUNfUEFSU0VSX0hQUF9JTkNMVURFRAorCisjaWZkZWYgX19jbGFuZ19fCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XcGFkZGVkIgorI2VuZGlmCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF90ZXN0X3NwZWMuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9URVNUX1NQRUNfSFBQX0lOQ0xVREVECisKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdwYWRkZWQiCisjZW5kaWYKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3dpbGRjYXJkX3BhdHRlcm4uaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9XSUxEQ0FSRF9QQVRURVJOX0hQUF9JTkNMVURFRAorCisjaW5jbHVkZSA8c3RkZXhjZXB0PgorCituYW1lc3BhY2UgQ2F0Y2gKK3sKKyAgICBjbGFzcyBXaWxkY2FyZFBhdHRlcm4geworICAgICAgICBlbnVtIFdpbGRjYXJkUG9zaXRpb24geworICAgICAgICAgICAgTm9XaWxkY2FyZCA9IDAsCisgICAgICAgICAgICBXaWxkY2FyZEF0U3RhcnQgPSAxLAorICAgICAgICAgICAgV2lsZGNhcmRBdEVuZCA9IDIsCisgICAgICAgICAgICBXaWxkY2FyZEF0Qm90aEVuZHMgPSBXaWxkY2FyZEF0U3RhcnQgfCBXaWxkY2FyZEF0RW5kCisgICAgICAgIH07CisKKyAgICBwdWJsaWM6CisKKyAgICAgICAgV2lsZGNhcmRQYXR0ZXJuKCBzdGQ6OnN0cmluZyBjb25zdCYgcGF0dGVybiwgQ2FzZVNlbnNpdGl2ZTo6Q2hvaWNlIGNhc2VTZW5zaXRpdml0eSApCisgICAgICAgIDogICBtX2Nhc2VTZW5zaXRpdml0eSggY2FzZVNlbnNpdGl2aXR5ICksCisgICAgICAgICAgICBtX3dpbGRjYXJkKCBOb1dpbGRjYXJkICksCisgICAgICAgICAgICBtX3BhdHRlcm4oIGFkanVzdENhc2UoIHBhdHRlcm4gKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBzdGFydHNXaXRoKCBtX3BhdHRlcm4sICcqJyApICkgeworICAgICAgICAgICAgICAgIG1fcGF0dGVybiA9IG1fcGF0dGVybi5zdWJzdHIoIDEgKTsKKyAgICAgICAgICAgICAgICBtX3dpbGRjYXJkID0gV2lsZGNhcmRBdFN0YXJ0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoIGVuZHNXaXRoKCBtX3BhdHRlcm4sICcqJyApICkgeworICAgICAgICAgICAgICAgIG1fcGF0dGVybiA9IG1fcGF0dGVybi5zdWJzdHIoIDAsIG1fcGF0dGVybi5zaXplKCktMSApOworICAgICAgICAgICAgICAgIG1fd2lsZGNhcmQgPSBzdGF0aWNfY2FzdDxXaWxkY2FyZFBvc2l0aW9uPiggbV93aWxkY2FyZCB8IFdpbGRjYXJkQXRFbmQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIH5XaWxkY2FyZFBhdHRlcm4oKTsKKyAgICAgICAgdmlydHVhbCBib29sIG1hdGNoZXMoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIgKSBjb25zdCB7CisgICAgICAgICAgICBzd2l0Y2goIG1fd2lsZGNhcmQgKSB7CisgICAgICAgICAgICAgICAgY2FzZSBOb1dpbGRjYXJkOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9wYXR0ZXJuID09IGFkanVzdENhc2UoIHN0ciApOworICAgICAgICAgICAgICAgIGNhc2UgV2lsZGNhcmRBdFN0YXJ0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW5kc1dpdGgoIGFkanVzdENhc2UoIHN0ciApLCBtX3BhdHRlcm4gKTsKKyAgICAgICAgICAgICAgICBjYXNlIFdpbGRjYXJkQXRFbmQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGFydHNXaXRoKCBhZGp1c3RDYXNlKCBzdHIgKSwgbV9wYXR0ZXJuICk7CisgICAgICAgICAgICAgICAgY2FzZSBXaWxkY2FyZEF0Qm90aEVuZHM6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250YWlucyggYWRqdXN0Q2FzZSggc3RyICksIG1fcGF0dGVybiApOworICAgICAgICAgICAgfQorCisjaWZkZWYgX19jbGFuZ19fCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XdW5yZWFjaGFibGUtY29kZSIKKyNlbmRpZgorICAgICAgICAgICAgdGhyb3cgc3RkOjpsb2dpY19lcnJvciggIlVua25vd24gZW51bSIgKTsKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKKyNlbmRpZgorICAgICAgICB9CisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjpzdHJpbmcgYWRqdXN0Q2FzZSggc3RkOjpzdHJpbmcgY29uc3QmIHN0ciApIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtX2Nhc2VTZW5zaXRpdml0eSA9PSBDYXNlU2Vuc2l0aXZlOjpObyA/IHRvTG93ZXIoIHN0ciApIDogc3RyOworICAgICAgICB9CisgICAgICAgIENhc2VTZW5zaXRpdmU6OkNob2ljZSBtX2Nhc2VTZW5zaXRpdml0eTsKKyAgICAgICAgV2lsZGNhcmRQb3NpdGlvbiBtX3dpbGRjYXJkOworICAgICAgICBzdGQ6OnN0cmluZyBtX3BhdHRlcm47CisgICAgfTsKK30KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBjbGFzcyBUZXN0U3BlYyB7CisgICAgICAgIHN0cnVjdCBQYXR0ZXJuIDogU2hhcmVkSW1wbDw+IHsKKyAgICAgICAgICAgIHZpcnR1YWwgflBhdHRlcm4oKTsKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXRjaGVzKCBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RDYXNlICkgY29uc3QgPSAwOworICAgICAgICB9OworICAgICAgICBjbGFzcyBOYW1lUGF0dGVybiA6IHB1YmxpYyBQYXR0ZXJuIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgTmFtZVBhdHRlcm4oIHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lICkKKyAgICAgICAgICAgIDogbV93aWxkY2FyZFBhdHRlcm4oIHRvTG93ZXIoIG5hbWUgKSwgQ2FzZVNlbnNpdGl2ZTo6Tm8gKQorICAgICAgICAgICAge30KKyAgICAgICAgICAgIHZpcnR1YWwgfk5hbWVQYXR0ZXJuKCk7CisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWF0Y2hlcyggVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0Q2FzZSApIGNvbnN0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbV93aWxkY2FyZFBhdHRlcm4ubWF0Y2hlcyggdG9Mb3dlciggdGVzdENhc2UubmFtZSApICk7CisgICAgICAgICAgICB9CisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICBXaWxkY2FyZFBhdHRlcm4gbV93aWxkY2FyZFBhdHRlcm47CisgICAgICAgIH07CisKKyAgICAgICAgY2xhc3MgVGFnUGF0dGVybiA6IHB1YmxpYyBQYXR0ZXJuIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgVGFnUGF0dGVybiggc3RkOjpzdHJpbmcgY29uc3QmIHRhZyApIDogbV90YWcoIHRvTG93ZXIoIHRhZyApICkge30KKyAgICAgICAgICAgIHZpcnR1YWwgflRhZ1BhdHRlcm4oKTsKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXRjaGVzKCBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RDYXNlICkgY29uc3QgeworICAgICAgICAgICAgICAgIHJldHVybiB0ZXN0Q2FzZS5sY2FzZVRhZ3MuZmluZCggbV90YWcgKSAhPSB0ZXN0Q2FzZS5sY2FzZVRhZ3MuZW5kKCk7CisgICAgICAgICAgICB9CisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBtX3RhZzsKKyAgICAgICAgfTsKKworICAgICAgICBjbGFzcyBFeGNsdWRlZFBhdHRlcm4gOiBwdWJsaWMgUGF0dGVybiB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIEV4Y2x1ZGVkUGF0dGVybiggUHRyPFBhdHRlcm4+IGNvbnN0JiB1bmRlcmx5aW5nUGF0dGVybiApIDogbV91bmRlcmx5aW5nUGF0dGVybiggdW5kZXJseWluZ1BhdHRlcm4gKSB7fQorICAgICAgICAgICAgdmlydHVhbCB+RXhjbHVkZWRQYXR0ZXJuKCk7CisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWF0Y2hlcyggVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0Q2FzZSApIGNvbnN0IHsgcmV0dXJuICFtX3VuZGVybHlpbmdQYXR0ZXJuLT5tYXRjaGVzKCB0ZXN0Q2FzZSApOyB9CisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICBQdHI8UGF0dGVybj4gbV91bmRlcmx5aW5nUGF0dGVybjsKKyAgICAgICAgfTsKKworICAgICAgICBzdHJ1Y3QgRmlsdGVyIHsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFB0cjxQYXR0ZXJuPiA+IG1fcGF0dGVybnM7CisKKyAgICAgICAgICAgIGJvb2wgbWF0Y2hlcyggVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0Q2FzZSApIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAvLyBBbGwgcGF0dGVybnMgaW4gYSBmaWx0ZXIgbXVzdCBtYXRjaCBmb3IgdGhlIGZpbHRlciB0byBiZSBhIG1hdGNoCisgICAgICAgICAgICAgICAgZm9yKCBzdGQ6OnZlY3RvcjxQdHI8UGF0dGVybj4gPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3BhdHRlcm5zLmJlZ2luKCksIGl0RW5kID0gbV9wYXR0ZXJucy5lbmQoKTsgaXQgIT0gaXRFbmQ7ICsraXQgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCAhKCppdCktPm1hdGNoZXMoIHRlc3RDYXNlICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgIHB1YmxpYzoKKyAgICAgICAgYm9vbCBoYXNGaWx0ZXJzKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuICFtX2ZpbHRlcnMuZW1wdHkoKTsKKyAgICAgICAgfQorICAgICAgICBib29sIG1hdGNoZXMoIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdENhc2UgKSBjb25zdCB7CisgICAgICAgICAgICAvLyBBIFRlc3RTcGVjIG1hdGNoZXMgaWYgYW55IGZpbHRlciBtYXRjaGVzCisgICAgICAgICAgICBmb3IoIHN0ZDo6dmVjdG9yPEZpbHRlcj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9maWx0ZXJzLmJlZ2luKCksIGl0RW5kID0gbV9maWx0ZXJzLmVuZCgpOyBpdCAhPSBpdEVuZDsgKytpdCApCisgICAgICAgICAgICAgICAgaWYoIGl0LT5tYXRjaGVzKCB0ZXN0Q2FzZSApICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6dmVjdG9yPEZpbHRlcj4gbV9maWx0ZXJzOworCisgICAgICAgIGZyaWVuZCBjbGFzcyBUZXN0U3BlY1BhcnNlcjsKKyAgICB9OworfQorCisjaWZkZWYgX19jbGFuZ19fCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCisjZW5kaWYKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGNsYXNzIFRlc3RTcGVjUGFyc2VyIHsKKyAgICAgICAgZW51bSBNb2RleyBOb25lLCBOYW1lLCBRdW90ZWROYW1lLCBUYWcsIEVzY2FwZWROYW1lIH07CisgICAgICAgIE1vZGUgbV9tb2RlOworICAgICAgICBib29sIG1fZXhjbHVzaW9uOworICAgICAgICBzdGQ6OnNpemVfdCBtX3N0YXJ0LCBtX3BvczsKKyAgICAgICAgc3RkOjpzdHJpbmcgbV9hcmc7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2l6ZV90PiBtX2VzY2FwZUNoYXJzOworICAgICAgICBUZXN0U3BlYzo6RmlsdGVyIG1fY3VycmVudEZpbHRlcjsKKyAgICAgICAgVGVzdFNwZWMgbV90ZXN0U3BlYzsKKyAgICAgICAgSVRhZ0FsaWFzUmVnaXN0cnkgY29uc3QqIG1fdGFnQWxpYXNlczsKKworICAgIHB1YmxpYzoKKyAgICAgICAgVGVzdFNwZWNQYXJzZXIoIElUYWdBbGlhc1JlZ2lzdHJ5IGNvbnN0JiB0YWdBbGlhc2VzICkgOiBtX3RhZ0FsaWFzZXMoICZ0YWdBbGlhc2VzICkge30KKworICAgICAgICBUZXN0U3BlY1BhcnNlciYgcGFyc2UoIHN0ZDo6c3RyaW5nIGNvbnN0JiBhcmcgKSB7CisgICAgICAgICAgICBtX21vZGUgPSBOb25lOworICAgICAgICAgICAgbV9leGNsdXNpb24gPSBmYWxzZTsKKyAgICAgICAgICAgIG1fc3RhcnQgPSBzdGQ6OnN0cmluZzo6bnBvczsKKyAgICAgICAgICAgIG1fYXJnID0gbV90YWdBbGlhc2VzLT5leHBhbmRBbGlhc2VzKCBhcmcgKTsKKyAgICAgICAgICAgIG1fZXNjYXBlQ2hhcnMuY2xlYXIoKTsKKyAgICAgICAgICAgIGZvciggbV9wb3MgPSAwOyBtX3BvcyA8IG1fYXJnLnNpemUoKTsgKyttX3BvcyApCisgICAgICAgICAgICAgICAgdmlzaXRDaGFyKCBtX2FyZ1ttX3Bvc10gKTsKKyAgICAgICAgICAgIGlmKCBtX21vZGUgPT0gTmFtZSApCisgICAgICAgICAgICAgICAgYWRkUGF0dGVybjxUZXN0U3BlYzo6TmFtZVBhdHRlcm4+KCk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKyAgICAgICAgVGVzdFNwZWMgdGVzdFNwZWMoKSB7CisgICAgICAgICAgICBhZGRGaWx0ZXIoKTsKKyAgICAgICAgICAgIHJldHVybiBtX3Rlc3RTcGVjOworICAgICAgICB9CisgICAgcHJpdmF0ZToKKyAgICAgICAgdm9pZCB2aXNpdENoYXIoIGNoYXIgYyApIHsKKyAgICAgICAgICAgIGlmKCBtX21vZGUgPT0gTm9uZSApIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2goIGMgKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnICc6IHJldHVybjsKKyAgICAgICAgICAgICAgICBjYXNlICd+JzogbV9leGNsdXNpb24gPSB0cnVlOyByZXR1cm47CisgICAgICAgICAgICAgICAgY2FzZSAnWyc6IHJldHVybiBzdGFydE5ld01vZGUoIFRhZywgKyttX3BvcyApOworICAgICAgICAgICAgICAgIGNhc2UgJyInOiByZXR1cm4gc3RhcnROZXdNb2RlKCBRdW90ZWROYW1lLCArK21fcG9zICk7CisgICAgICAgICAgICAgICAgY2FzZSAnXFwnOiByZXR1cm4gZXNjYXBlKCk7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogc3RhcnROZXdNb2RlKCBOYW1lLCBtX3BvcyApOyBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggbV9tb2RlID09IE5hbWUgKSB7CisgICAgICAgICAgICAgICAgaWYoIGMgPT0gJywnICkgeworICAgICAgICAgICAgICAgICAgICBhZGRQYXR0ZXJuPFRlc3RTcGVjOjpOYW1lUGF0dGVybj4oKTsKKyAgICAgICAgICAgICAgICAgICAgYWRkRmlsdGVyKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYoIGMgPT0gJ1snICkgeworICAgICAgICAgICAgICAgICAgICBpZiggc3ViU3RyaW5nKCkgPT0gImV4Y2x1ZGU6IiApCisgICAgICAgICAgICAgICAgICAgICAgICBtX2V4Y2x1c2lvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZFBhdHRlcm48VGVzdFNwZWM6Ok5hbWVQYXR0ZXJuPigpOworICAgICAgICAgICAgICAgICAgICBzdGFydE5ld01vZGUoIFRhZywgKyttX3BvcyApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKCBjID09ICdcXCcgKQorICAgICAgICAgICAgICAgICAgICBlc2NhcGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoIG1fbW9kZSA9PSBFc2NhcGVkTmFtZSApCisgICAgICAgICAgICAgICAgbV9tb2RlID0gTmFtZTsKKyAgICAgICAgICAgIGVsc2UgaWYoIG1fbW9kZSA9PSBRdW90ZWROYW1lICYmIGMgPT0gJyInICkKKyAgICAgICAgICAgICAgICBhZGRQYXR0ZXJuPFRlc3RTcGVjOjpOYW1lUGF0dGVybj4oKTsKKyAgICAgICAgICAgIGVsc2UgaWYoIG1fbW9kZSA9PSBUYWcgJiYgYyA9PSAnXScgKQorICAgICAgICAgICAgICAgIGFkZFBhdHRlcm48VGVzdFNwZWM6OlRhZ1BhdHRlcm4+KCk7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBzdGFydE5ld01vZGUoIE1vZGUgbW9kZSwgc3RkOjpzaXplX3Qgc3RhcnQgKSB7CisgICAgICAgICAgICBtX21vZGUgPSBtb2RlOworICAgICAgICAgICAgbV9zdGFydCA9IHN0YXJ0OworICAgICAgICB9CisgICAgICAgIHZvaWQgZXNjYXBlKCkgeworICAgICAgICAgICAgaWYoIG1fbW9kZSA9PSBOb25lICkKKyAgICAgICAgICAgICAgICBtX3N0YXJ0ID0gbV9wb3M7CisgICAgICAgICAgICBtX21vZGUgPSBFc2NhcGVkTmFtZTsKKyAgICAgICAgICAgIG1fZXNjYXBlQ2hhcnMucHVzaF9iYWNrKCBtX3BvcyApOworICAgICAgICB9CisgICAgICAgIHN0ZDo6c3RyaW5nIHN1YlN0cmluZygpIGNvbnN0IHsgcmV0dXJuIG1fYXJnLnN1YnN0ciggbV9zdGFydCwgbV9wb3MgLSBtX3N0YXJ0ICk7IH0KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgdm9pZCBhZGRQYXR0ZXJuKCkgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgdG9rZW4gPSBzdWJTdHJpbmcoKTsKKyAgICAgICAgICAgIGZvciggc2l6ZV90IGkgPSAwOyBpIDwgbV9lc2NhcGVDaGFycy5zaXplKCk7ICsraSApCisgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbi5zdWJzdHIoIDAsIG1fZXNjYXBlQ2hhcnNbaV0tbV9zdGFydC1pICkgKyB0b2tlbi5zdWJzdHIoIG1fZXNjYXBlQ2hhcnNbaV0tbV9zdGFydC1pKzEgKTsKKyAgICAgICAgICAgIG1fZXNjYXBlQ2hhcnMuY2xlYXIoKTsKKyAgICAgICAgICAgIGlmKCBzdGFydHNXaXRoKCB0b2tlbiwgImV4Y2x1ZGU6IiApICkgeworICAgICAgICAgICAgICAgIG1fZXhjbHVzaW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2VuLnN1YnN0ciggOCApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoICF0b2tlbi5lbXB0eSgpICkgeworICAgICAgICAgICAgICAgIFB0cjxUZXN0U3BlYzo6UGF0dGVybj4gcGF0dGVybiA9IG5ldyBUKCB0b2tlbiApOworICAgICAgICAgICAgICAgIGlmKCBtX2V4Y2x1c2lvbiApCisgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSBuZXcgVGVzdFNwZWM6OkV4Y2x1ZGVkUGF0dGVybiggcGF0dGVybiApOworICAgICAgICAgICAgICAgIG1fY3VycmVudEZpbHRlci5tX3BhdHRlcm5zLnB1c2hfYmFjayggcGF0dGVybiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbV9leGNsdXNpb24gPSBmYWxzZTsKKyAgICAgICAgICAgIG1fbW9kZSA9IE5vbmU7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBhZGRGaWx0ZXIoKSB7CisgICAgICAgICAgICBpZiggIW1fY3VycmVudEZpbHRlci5tX3BhdHRlcm5zLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAgICAgbV90ZXN0U3BlYy5tX2ZpbHRlcnMucHVzaF9iYWNrKCBtX2N1cnJlbnRGaWx0ZXIgKTsKKyAgICAgICAgICAgICAgICBtX2N1cnJlbnRGaWx0ZXIgPSBUZXN0U3BlYzo6RmlsdGVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworICAgIGlubGluZSBUZXN0U3BlYyBwYXJzZVRlc3RTcGVjKCBzdGQ6OnN0cmluZyBjb25zdCYgYXJnICkgeworICAgICAgICByZXR1cm4gVGVzdFNwZWNQYXJzZXIoIElUYWdBbGlhc1JlZ2lzdHJ5OjpnZXQoKSApLnBhcnNlKCBhcmcgKS50ZXN0U3BlYygpOworICAgIH0KKworfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKworI2lmZGVmIF9fY2xhbmdfXworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAorI2VuZGlmCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9pbnRlcmZhY2VzX2NvbmZpZy5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9JTlRFUkZBQ0VTX0NPTkZJR19IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxpb3Nmd2Q+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBWZXJib3NpdHkgeyBlbnVtIExldmVsIHsKKyAgICAgICAgTm9PdXRwdXQgPSAwLAorICAgICAgICBRdWlldCwKKyAgICAgICAgTm9ybWFsCisgICAgfTsgfTsKKworICAgIHN0cnVjdCBXYXJuQWJvdXQgeyBlbnVtIFdoYXQgeworICAgICAgICBOb3RoaW5nID0gMHgwMCwKKyAgICAgICAgTm9Bc3NlcnRpb25zID0gMHgwMQorICAgIH07IH07CisKKyAgICBzdHJ1Y3QgU2hvd0R1cmF0aW9ucyB7IGVudW0gT3JOb3QgeworICAgICAgICBEZWZhdWx0Rm9yUmVwb3J0ZXIsCisgICAgICAgIEFsd2F5cywKKyAgICAgICAgTmV2ZXIKKyAgICB9OyB9OworICAgIHN0cnVjdCBSdW5UZXN0cyB7IGVudW0gSW5XaGF0T3JkZXIgeworICAgICAgICBJbkRlY2xhcmF0aW9uT3JkZXIsCisgICAgICAgIEluTGV4aWNvZ3JhcGhpY2FsT3JkZXIsCisgICAgICAgIEluUmFuZG9tT3JkZXIKKyAgICB9OyB9OworICAgIHN0cnVjdCBVc2VDb2xvdXIgeyBlbnVtIFllc09yTm8geworICAgICAgICBBdXRvLAorICAgICAgICBZZXMsCisgICAgICAgIE5vCisgICAgfTsgfTsKKworICAgIGNsYXNzIFRlc3RTcGVjOworCisgICAgc3RydWN0IElDb25maWcgOiBJU2hhcmVkIHsKKworICAgICAgICB2aXJ0dWFsIH5JQ29uZmlnKCk7CisKKyAgICAgICAgdmlydHVhbCBib29sIGFsbG93VGhyb3dzKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIHN0ZDo6b3N0cmVhbSYgc3RyZWFtKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIG5hbWUoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgYm9vbCBpbmNsdWRlU3VjY2Vzc2Z1bFJlc3VsdHMoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgYm9vbCBzaG91bGREZWJ1Z0JyZWFrKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIGJvb2wgd2FybkFib3V0TWlzc2luZ0Fzc2VydGlvbnMoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgaW50IGFib3J0QWZ0ZXIoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgYm9vbCBzaG93SW52aXNpYmxlcygpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBTaG93RHVyYXRpb25zOjpPck5vdCBzaG93RHVyYXRpb25zKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIFRlc3RTcGVjIGNvbnN0JiB0ZXN0U3BlYygpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBSdW5UZXN0czo6SW5XaGF0T3JkZXIgcnVuT3JkZXIoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgdW5zaWduZWQgaW50IHJuZ1NlZWQoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgVXNlQ29sb3VyOjpZZXNPck5vIHVzZUNvbG91cigpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY29uc3QmIGdldFNlY3Rpb25zVG9SdW4oKSBjb25zdCA9IDA7CisKKyAgICB9OworfQorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfc3RyZWFtLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1NUUkVBTV9IX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9zdHJlYW1idWYuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfU1RSRUFNQlVGX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPHN0cmVhbWJ1Zj4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGNsYXNzIFN0cmVhbUJ1ZkJhc2UgOiBwdWJsaWMgc3RkOjpzdHJlYW1idWYgeworICAgIHB1YmxpYzoKKyAgICAgICAgdmlydHVhbCB+U3RyZWFtQnVmQmFzZSgpIENBVENIX05PRVhDRVBUOworICAgIH07Cit9CisKKyNpbmNsdWRlIDxzdHJlYW1idWY+CisjaW5jbHVkZSA8b3N0cmVhbT4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0ZDo6b3N0cmVhbSYgY291dCgpOworICAgIHN0ZDo6b3N0cmVhbSYgY2VycigpOworCisgICAgc3RydWN0IElTdHJlYW0geworICAgICAgICB2aXJ0dWFsIH5JU3RyZWFtKCkgQ0FUQ0hfTk9FWENFUFQ7CisgICAgICAgIHZpcnR1YWwgc3RkOjpvc3RyZWFtJiBzdHJlYW0oKSBjb25zdCA9IDA7CisgICAgfTsKKworICAgIGNsYXNzIEZpbGVTdHJlYW0gOiBwdWJsaWMgSVN0cmVhbSB7CisgICAgICAgIG11dGFibGUgc3RkOjpvZnN0cmVhbSBtX29mczsKKyAgICBwdWJsaWM6CisgICAgICAgIEZpbGVTdHJlYW0oIHN0ZDo6c3RyaW5nIGNvbnN0JiBmaWxlbmFtZSApOworICAgICAgICB2aXJ0dWFsIH5GaWxlU3RyZWFtKCkgQ0FUQ0hfTk9FWENFUFQ7CisgICAgcHVibGljOiAvLyBJU3RyZWFtCisgICAgICAgIHZpcnR1YWwgc3RkOjpvc3RyZWFtJiBzdHJlYW0oKSBjb25zdCBDQVRDSF9PVkVSUklERTsKKyAgICB9OworCisgICAgY2xhc3MgQ291dFN0cmVhbSA6IHB1YmxpYyBJU3RyZWFtIHsKKyAgICAgICAgbXV0YWJsZSBzdGQ6Om9zdHJlYW0gbV9vczsKKyAgICBwdWJsaWM6CisgICAgICAgIENvdXRTdHJlYW0oKTsKKyAgICAgICAgdmlydHVhbCB+Q291dFN0cmVhbSgpIENBVENIX05PRVhDRVBUOworCisgICAgcHVibGljOiAvLyBJU3RyZWFtCisgICAgICAgIHZpcnR1YWwgc3RkOjpvc3RyZWFtJiBzdHJlYW0oKSBjb25zdCBDQVRDSF9PVkVSUklERTsKKyAgICB9OworCisgICAgY2xhc3MgRGVidWdPdXRTdHJlYW0gOiBwdWJsaWMgSVN0cmVhbSB7CisgICAgICAgIENBVENIX0FVVE9fUFRSKCBTdHJlYW1CdWZCYXNlICkgbV9zdHJlYW1CdWY7CisgICAgICAgIG11dGFibGUgc3RkOjpvc3RyZWFtIG1fb3M7CisgICAgcHVibGljOgorICAgICAgICBEZWJ1Z091dFN0cmVhbSgpOworICAgICAgICB2aXJ0dWFsIH5EZWJ1Z091dFN0cmVhbSgpIENBVENIX05PRVhDRVBUOworCisgICAgcHVibGljOiAvLyBJU3RyZWFtCisgICAgICAgIHZpcnR1YWwgc3RkOjpvc3RyZWFtJiBzdHJlYW0oKSBjb25zdCBDQVRDSF9PVkVSUklERTsKKyAgICB9OworfQorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorCisjaWZuZGVmIENBVENIX0NPTkZJR19DT05TT0xFX1dJRFRICisjZGVmaW5lIENBVENIX0NPTkZJR19DT05TT0xFX1dJRFRIIDgwCisjZW5kaWYKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBDb25maWdEYXRhIHsKKworICAgICAgICBDb25maWdEYXRhKCkKKyAgICAgICAgOiAgIGxpc3RUZXN0cyggZmFsc2UgKSwKKyAgICAgICAgICAgIGxpc3RUYWdzKCBmYWxzZSApLAorICAgICAgICAgICAgbGlzdFJlcG9ydGVycyggZmFsc2UgKSwKKyAgICAgICAgICAgIGxpc3RUZXN0TmFtZXNPbmx5KCBmYWxzZSApLAorICAgICAgICAgICAgc2hvd1N1Y2Nlc3NmdWxUZXN0cyggZmFsc2UgKSwKKyAgICAgICAgICAgIHNob3VsZERlYnVnQnJlYWsoIGZhbHNlICksCisgICAgICAgICAgICBub1Rocm93KCBmYWxzZSApLAorICAgICAgICAgICAgc2hvd0hlbHAoIGZhbHNlICksCisgICAgICAgICAgICBzaG93SW52aXNpYmxlcyggZmFsc2UgKSwKKyAgICAgICAgICAgIGZpbGVuYW1lc0FzVGFncyggZmFsc2UgKSwKKyAgICAgICAgICAgIGFib3J0QWZ0ZXIoIC0xICksCisgICAgICAgICAgICBybmdTZWVkKCAwICksCisgICAgICAgICAgICB2ZXJib3NpdHkoIFZlcmJvc2l0eTo6Tm9ybWFsICksCisgICAgICAgICAgICB3YXJuaW5ncyggV2FybkFib3V0OjpOb3RoaW5nICksCisgICAgICAgICAgICBzaG93RHVyYXRpb25zKCBTaG93RHVyYXRpb25zOjpEZWZhdWx0Rm9yUmVwb3J0ZXIgKSwKKyAgICAgICAgICAgIHJ1bk9yZGVyKCBSdW5UZXN0czo6SW5EZWNsYXJhdGlvbk9yZGVyICksCisgICAgICAgICAgICB1c2VDb2xvdXIoIFVzZUNvbG91cjo6QXV0byApCisgICAgICAgIHt9CisKKyAgICAgICAgYm9vbCBsaXN0VGVzdHM7CisgICAgICAgIGJvb2wgbGlzdFRhZ3M7CisgICAgICAgIGJvb2wgbGlzdFJlcG9ydGVyczsKKyAgICAgICAgYm9vbCBsaXN0VGVzdE5hbWVzT25seTsKKworICAgICAgICBib29sIHNob3dTdWNjZXNzZnVsVGVzdHM7CisgICAgICAgIGJvb2wgc2hvdWxkRGVidWdCcmVhazsKKyAgICAgICAgYm9vbCBub1Rocm93OworICAgICAgICBib29sIHNob3dIZWxwOworICAgICAgICBib29sIHNob3dJbnZpc2libGVzOworICAgICAgICBib29sIGZpbGVuYW1lc0FzVGFnczsKKworICAgICAgICBpbnQgYWJvcnRBZnRlcjsKKyAgICAgICAgdW5zaWduZWQgaW50IHJuZ1NlZWQ7CisKKyAgICAgICAgVmVyYm9zaXR5OjpMZXZlbCB2ZXJib3NpdHk7CisgICAgICAgIFdhcm5BYm91dDo6V2hhdCB3YXJuaW5nczsKKyAgICAgICAgU2hvd0R1cmF0aW9uczo6T3JOb3Qgc2hvd0R1cmF0aW9uczsKKyAgICAgICAgUnVuVGVzdHM6OkluV2hhdE9yZGVyIHJ1bk9yZGVyOworICAgICAgICBVc2VDb2xvdXI6Olllc09yTm8gdXNlQ29sb3VyOworCisgICAgICAgIHN0ZDo6c3RyaW5nIG91dHB1dEZpbGVuYW1lOworICAgICAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgICAgICBzdGQ6OnN0cmluZyBwcm9jZXNzTmFtZTsKKworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcmVwb3J0ZXJOYW1lczsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHRlc3RzT3JUYWdzOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc2VjdGlvbnNUb1J1bjsKKyAgICB9OworCisgICAgY2xhc3MgQ29uZmlnIDogcHVibGljIFNoYXJlZEltcGw8SUNvbmZpZz4geworICAgIHByaXZhdGU6CisgICAgICAgIENvbmZpZyggQ29uZmlnIGNvbnN0JiBvdGhlciApOworICAgICAgICBDb25maWcmIG9wZXJhdG9yID0gKCBDb25maWcgY29uc3QmIG90aGVyICk7CisgICAgICAgIHZpcnR1YWwgdm9pZCBkdW1teSgpOworICAgIHB1YmxpYzoKKworICAgICAgICBDb25maWcoKQorICAgICAgICB7fQorCisgICAgICAgIENvbmZpZyggQ29uZmlnRGF0YSBjb25zdCYgZGF0YSApCisgICAgICAgIDogICBtX2RhdGEoIGRhdGEgKSwKKyAgICAgICAgICAgIG1fc3RyZWFtKCBvcGVuU3RyZWFtKCkgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggIWRhdGEudGVzdHNPclRhZ3MuZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICBUZXN0U3BlY1BhcnNlciBwYXJzZXIoIElUYWdBbGlhc1JlZ2lzdHJ5OjpnZXQoKSApOworICAgICAgICAgICAgICAgIGZvciggc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBkYXRhLnRlc3RzT3JUYWdzLnNpemUoKTsgKytpICkKKyAgICAgICAgICAgICAgICAgICAgcGFyc2VyLnBhcnNlKCBkYXRhLnRlc3RzT3JUYWdzW2ldICk7CisgICAgICAgICAgICAgICAgbV90ZXN0U3BlYyA9IHBhcnNlci50ZXN0U3BlYygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB+Q29uZmlnKCkge30KKworICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgZ2V0RmlsZW5hbWUoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbV9kYXRhLm91dHB1dEZpbGVuYW1lIDsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgbGlzdFRlc3RzKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhLmxpc3RUZXN0czsgfQorICAgICAgICBib29sIGxpc3RUZXN0TmFtZXNPbmx5KCkgY29uc3QgeyByZXR1cm4gbV9kYXRhLmxpc3RUZXN0TmFtZXNPbmx5OyB9CisgICAgICAgIGJvb2wgbGlzdFRhZ3MoKSBjb25zdCB7IHJldHVybiBtX2RhdGEubGlzdFRhZ3M7IH0KKyAgICAgICAgYm9vbCBsaXN0UmVwb3J0ZXJzKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhLmxpc3RSZXBvcnRlcnM7IH0KKworICAgICAgICBzdGQ6OnN0cmluZyBnZXRQcm9jZXNzTmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YS5wcm9jZXNzTmFtZTsgfQorCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjb25zdCYgZ2V0UmVwb3J0ZXJOYW1lcygpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YS5yZXBvcnRlck5hbWVzOyB9CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjb25zdCYgZ2V0U2VjdGlvbnNUb1J1bigpIGNvbnN0IENBVENIX09WRVJSSURFIHsgcmV0dXJuIG1fZGF0YS5zZWN0aW9uc1RvUnVuOyB9CisKKyAgICAgICAgdmlydHVhbCBUZXN0U3BlYyBjb25zdCYgdGVzdFNwZWMoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7IHJldHVybiBtX3Rlc3RTcGVjOyB9CisKKyAgICAgICAgYm9vbCBzaG93SGVscCgpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YS5zaG93SGVscDsgfQorCisgICAgICAgIC8vIElDb25maWcgaW50ZXJmYWNlCisgICAgICAgIHZpcnR1YWwgYm9vbCBhbGxvd1Rocm93cygpIGNvbnN0IENBVENIX09WRVJSSURFICAgICAgICAgICAgICAgICB7IHJldHVybiAhbV9kYXRhLm5vVGhyb3c7IH0KKyAgICAgICAgdmlydHVhbCBzdGQ6Om9zdHJlYW0mIHN0cmVhbSgpIGNvbnN0IENBVENIX09WRVJSSURFICAgICAgICAgICAgIHsgcmV0dXJuIG1fc3RyZWFtLT5zdHJlYW0oKTsgfQorICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIG5hbWUoKSBjb25zdCBDQVRDSF9PVkVSUklERSAgICAgICAgICAgICAgICAgeyByZXR1cm4gbV9kYXRhLm5hbWUuZW1wdHkoKSA/IG1fZGF0YS5wcm9jZXNzTmFtZSA6IG1fZGF0YS5uYW1lOyB9CisgICAgICAgIHZpcnR1YWwgYm9vbCBpbmNsdWRlU3VjY2Vzc2Z1bFJlc3VsdHMoKSBjb25zdCBDQVRDSF9PVkVSUklERSAgICB7IHJldHVybiBtX2RhdGEuc2hvd1N1Y2Nlc3NmdWxUZXN0czsgfQorICAgICAgICB2aXJ0dWFsIGJvb2wgd2FybkFib3V0TWlzc2luZ0Fzc2VydGlvbnMoKSBjb25zdCBDQVRDSF9PVkVSUklERSAgeyByZXR1cm4gbV9kYXRhLndhcm5pbmdzICYgV2FybkFib3V0OjpOb0Fzc2VydGlvbnM7IH0KKyAgICAgICAgdmlydHVhbCBTaG93RHVyYXRpb25zOjpPck5vdCBzaG93RHVyYXRpb25zKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeyByZXR1cm4gbV9kYXRhLnNob3dEdXJhdGlvbnM7IH0KKyAgICAgICAgdmlydHVhbCBSdW5UZXN0czo6SW5XaGF0T3JkZXIgcnVuT3JkZXIoKSBjb25zdCBDQVRDSF9PVkVSUklERSAgIHsgcmV0dXJuIG1fZGF0YS5ydW5PcmRlcjsgfQorICAgICAgICB2aXJ0dWFsIHVuc2lnbmVkIGludCBybmdTZWVkKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgICAgICAgICAgICAgeyByZXR1cm4gbV9kYXRhLnJuZ1NlZWQ7IH0KKyAgICAgICAgdmlydHVhbCBVc2VDb2xvdXI6Olllc09yTm8gdXNlQ29sb3VyKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgICAgIHsgcmV0dXJuIG1fZGF0YS51c2VDb2xvdXI7IH0KKyAgICAgICAgdmlydHVhbCBib29sIHNob3VsZERlYnVnQnJlYWsoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7IHJldHVybiBtX2RhdGEuc2hvdWxkRGVidWdCcmVhazsgfQorICAgICAgICB2aXJ0dWFsIGludCBhYm9ydEFmdGVyKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeyByZXR1cm4gbV9kYXRhLmFib3J0QWZ0ZXI7IH0KKyAgICAgICAgdmlydHVhbCBib29sIHNob3dJbnZpc2libGVzKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeyByZXR1cm4gbV9kYXRhLnNob3dJbnZpc2libGVzOyB9CisKKyAgICBwcml2YXRlOgorCisgICAgICAgIElTdHJlYW0gY29uc3QqIG9wZW5TdHJlYW0oKSB7CisgICAgICAgICAgICBpZiggbV9kYXRhLm91dHB1dEZpbGVuYW1lLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ291dFN0cmVhbSgpOworICAgICAgICAgICAgZWxzZSBpZiggbV9kYXRhLm91dHB1dEZpbGVuYW1lWzBdID09ICclJyApIHsKKyAgICAgICAgICAgICAgICBpZiggbV9kYXRhLm91dHB1dEZpbGVuYW1lID09ICIlZGVidWciICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEZWJ1Z091dFN0cmVhbSgpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3RkOjpkb21haW5fZXJyb3IoICJVbnJlY29nbmlzZWQgc3RyZWFtOiAiICsgbV9kYXRhLm91dHB1dEZpbGVuYW1lICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWxlU3RyZWFtKCBtX2RhdGEub3V0cHV0RmlsZW5hbWUgKTsKKyAgICAgICAgfQorICAgICAgICBDb25maWdEYXRhIG1fZGF0YTsKKworICAgICAgICBDQVRDSF9BVVRPX1BUUiggSVN0cmVhbSBjb25zdCApIG1fc3RyZWFtOworICAgICAgICBUZXN0U3BlYyBtX3Rlc3RTcGVjOworICAgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfY2xhcmEuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfQ0xBUkFfSF9JTkNMVURFRAorCisvLyBVc2UgQ2F0Y2gncyB2YWx1ZSBmb3IgY29uc29sZSB3aWR0aCAoc3RvcmUgQ2xhcmEncyBvZmYgdG8gdGhlIHNpZGUsIGlmIHByZXNlbnQpCisjaWZkZWYgQ0xBUkFfQ09ORklHX0NPTlNPTEVfV0lEVEgKKyNkZWZpbmUgQ0FUQ0hfVEVNUF9DTEFSQV9DT05GSUdfQ09OU09MRV9XSURUSCBDTEFSQV9DT05GSUdfQ09OU09MRV9XSURUSAorI3VuZGVmIENMQVJBX0NPTkZJR19DT05TT0xFX1dJRFRICisjZW5kaWYKKyNkZWZpbmUgQ0xBUkFfQ09ORklHX0NPTlNPTEVfV0lEVEggQ0FUQ0hfQ09ORklHX0NPTlNPTEVfV0lEVEgKKworLy8gRGVjbGFyZSBDbGFyYSBpbnNpZGUgdGhlIENhdGNoIG5hbWVzcGFjZQorI2RlZmluZSBTVElUQ0hfQ0xBUkFfT1BFTl9OQU1FU1BBQ0UgbmFtZXNwYWNlIENhdGNoIHsKKy8vICNpbmNsdWRlZCBmcm9tOiAuLi9leHRlcm5hbC9jbGFyYS5oCisKKy8vIFZlcnNpb24gMC4wLjIuNAorCisvLyBPbmx5IHVzZSBoZWFkZXIgZ3VhcmQgaWYgd2UgYXJlIG5vdCB1c2luZyBhbiBvdXRlciBuYW1lc3BhY2UKKyNpZiAhZGVmaW5lZChUV09CTFVFQ1VCRVNfQ0xBUkFfSF9JTkNMVURFRCkgfHwgZGVmaW5lZChTVElUQ0hfQ0xBUkFfT1BFTl9OQU1FU1BBQ0UpCisKKyNpZm5kZWYgU1RJVENIX0NMQVJBX09QRU5fTkFNRVNQQUNFCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DTEFSQV9IX0lOQ0xVREVECisjZGVmaW5lIFNUSVRDSF9DTEFSQV9PUEVOX05BTUVTUEFDRQorI2RlZmluZSBTVElUQ0hfQ0xBUkFfQ0xPU0VfTkFNRVNQQUNFCisjZWxzZQorI2RlZmluZSBTVElUQ0hfQ0xBUkFfQ0xPU0VfTkFNRVNQQUNFIH0KKyNlbmRpZgorCisjZGVmaW5lIFNUSVRDSF9UQkNfVEVYVF9GT1JNQVRfT1BFTl9OQU1FU1BBQ0UgU1RJVENIX0NMQVJBX09QRU5fTkFNRVNQQUNFCisKKy8vIC0tLS0tLS0tLS0tICNpbmNsdWRlZCBmcm9tIHRiY190ZXh0X2Zvcm1hdC5oIC0tLS0tLS0tLS0tCisKKy8vIE9ubHkgdXNlIGhlYWRlciBndWFyZCBpZiB3ZSBhcmUgbm90IHVzaW5nIGFuIG91dGVyIG5hbWVzcGFjZQorI2lmICFkZWZpbmVkKFRCQ19URVhUX0ZPUk1BVF9IX0lOQ0xVREVEKSB8fCBkZWZpbmVkKFNUSVRDSF9UQkNfVEVYVF9GT1JNQVRfT1VURVJfTkFNRVNQQUNFKQorI2lmbmRlZiBTVElUQ0hfVEJDX1RFWFRfRk9STUFUX09VVEVSX05BTUVTUEFDRQorI2RlZmluZSBUQkNfVEVYVF9GT1JNQVRfSF9JTkNMVURFRAorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNjdHlwZT4KKworLy8gVXNlIG9wdGlvbmFsIG91dGVyIG5hbWVzcGFjZQorI2lmZGVmIFNUSVRDSF9UQkNfVEVYVF9GT1JNQVRfT1VURVJfTkFNRVNQQUNFCituYW1lc3BhY2UgU1RJVENIX1RCQ19URVhUX0ZPUk1BVF9PVVRFUl9OQU1FU1BBQ0UgeworI2VuZGlmCisKK25hbWVzcGFjZSBUYmMgeworCisjaWZkZWYgVEJDX1RFWFRfRk9STUFUX0NPTlNPTEVfV0lEVEgKKyAgICBjb25zdCB1bnNpZ25lZCBpbnQgY29uc29sZVdpZHRoID0gVEJDX1RFWFRfRk9STUFUX0NPTlNPTEVfV0lEVEg7CisjZWxzZQorICAgIGNvbnN0IHVuc2lnbmVkIGludCBjb25zb2xlV2lkdGggPSA4MDsKKyNlbmRpZgorCisgICAgc3RydWN0IFRleHRBdHRyaWJ1dGVzIHsKKyAgICAgICAgVGV4dEF0dHJpYnV0ZXMoKQorICAgICAgICA6ICAgaW5pdGlhbEluZGVudCggc3RkOjpzdHJpbmc6Om5wb3MgKSwKKyAgICAgICAgICAgIGluZGVudCggMCApLAorICAgICAgICAgICAgd2lkdGgoIGNvbnNvbGVXaWR0aC0xICksCisgICAgICAgICAgICB0YWJDaGFyKCAnXHQnICkKKyAgICAgICAge30KKworICAgICAgICBUZXh0QXR0cmlidXRlcyYgc2V0SW5pdGlhbEluZGVudCggc3RkOjpzaXplX3QgX3ZhbHVlICkgIHsgaW5pdGlhbEluZGVudCA9IF92YWx1ZTsgcmV0dXJuICp0aGlzOyB9CisgICAgICAgIFRleHRBdHRyaWJ1dGVzJiBzZXRJbmRlbnQoIHN0ZDo6c2l6ZV90IF92YWx1ZSApICAgICAgICAgeyBpbmRlbnQgPSBfdmFsdWU7IHJldHVybiAqdGhpczsgfQorICAgICAgICBUZXh0QXR0cmlidXRlcyYgc2V0V2lkdGgoIHN0ZDo6c2l6ZV90IF92YWx1ZSApICAgICAgICAgIHsgd2lkdGggPSBfdmFsdWU7IHJldHVybiAqdGhpczsgfQorICAgICAgICBUZXh0QXR0cmlidXRlcyYgc2V0VGFiQ2hhciggY2hhciBfdmFsdWUgKSAgICAgICAgICAgICAgIHsgdGFiQ2hhciA9IF92YWx1ZTsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgICAgc3RkOjpzaXplX3QgaW5pdGlhbEluZGVudDsgIC8vIGluZGVudCBvZiBmaXJzdCBsaW5lLCBvciBucG9zCisgICAgICAgIHN0ZDo6c2l6ZV90IGluZGVudDsgICAgICAgICAvLyBpbmRlbnQgb2Ygc3Vic2VxdWVudCBsaW5lcywgb3IgYWxsIGlmIGluaXRpYWxJbmRlbnQgaXMgbnBvcworICAgICAgICBzdGQ6OnNpemVfdCB3aWR0aDsgICAgICAgICAgLy8gbWF4aW11bSB3aWR0aCBvZiB0ZXh0LCBpbmNsdWRpbmcgaW5kZW50LiBMb25nZXIgdGV4dCB3aWxsIHdyYXAKKyAgICAgICAgY2hhciB0YWJDaGFyOyAgICAgICAgICAgICAgIC8vIElmIHRoaXMgY2hhciBpcyBzZWVuIHRoZSBpbmRlbnQgaXMgY2hhbmdlZCB0byBjdXJyZW50IHBvcworICAgIH07CisKKyAgICBjbGFzcyBUZXh0IHsKKyAgICBwdWJsaWM6CisgICAgICAgIFRleHQoIHN0ZDo6c3RyaW5nIGNvbnN0JiBfc3RyLCBUZXh0QXR0cmlidXRlcyBjb25zdCYgX2F0dHIgPSBUZXh0QXR0cmlidXRlcygpICkKKyAgICAgICAgOiBhdHRyKCBfYXR0ciApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHdyYXBwYWJsZUNoYXJzID0gIiBbKHsuLC98XFwtIjsKKyAgICAgICAgICAgIHN0ZDo6c2l6ZV90IGluZGVudCA9IF9hdHRyLmluaXRpYWxJbmRlbnQgIT0gc3RkOjpzdHJpbmc6Om5wb3MKKyAgICAgICAgICAgICAgICA/IF9hdHRyLmluaXRpYWxJbmRlbnQKKyAgICAgICAgICAgICAgICA6IF9hdHRyLmluZGVudDsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHJlbWFpbmRlciA9IF9zdHI7CisKKyAgICAgICAgICAgIHdoaWxlKCAhcmVtYWluZGVyLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAgICAgaWYoIGxpbmVzLnNpemUoKSA+PSAxMDAwICkgeworICAgICAgICAgICAgICAgICAgICBsaW5lcy5wdXNoX2JhY2soICIuLi4gbWVzc2FnZSB0cnVuY2F0ZWQgZHVlIHRvIGV4Y2Vzc2l2ZSBzaXplIiApOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0ZDo6c2l6ZV90IHRhYlBvcyA9IHN0ZDo6c3RyaW5nOjpucG9zOworICAgICAgICAgICAgICAgIHN0ZDo6c2l6ZV90IHdpZHRoID0gKHN0ZDo6bWluKSggcmVtYWluZGVyLnNpemUoKSwgX2F0dHIud2lkdGggLSBpbmRlbnQgKTsKKyAgICAgICAgICAgICAgICBzdGQ6OnNpemVfdCBwb3MgPSByZW1haW5kZXIuZmluZF9maXJzdF9vZiggJ1xuJyApOworICAgICAgICAgICAgICAgIGlmKCBwb3MgPD0gd2lkdGggKSB7CisgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gcG9zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwb3MgPSByZW1haW5kZXIuZmluZF9sYXN0X29mKCBfYXR0ci50YWJDaGFyLCB3aWR0aCApOworICAgICAgICAgICAgICAgIGlmKCBwb3MgIT0gc3RkOjpzdHJpbmc6Om5wb3MgKSB7CisgICAgICAgICAgICAgICAgICAgIHRhYlBvcyA9IHBvczsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHJlbWFpbmRlclt3aWR0aF0gPT0gJ1xuJyApCisgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aC0tOworICAgICAgICAgICAgICAgICAgICByZW1haW5kZXIgPSByZW1haW5kZXIuc3Vic3RyKCAwLCB0YWJQb3MgKSArIHJlbWFpbmRlci5zdWJzdHIoIHRhYlBvcysxICk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYoIHdpZHRoID09IHJlbWFpbmRlci5zaXplKCkgKSB7CisgICAgICAgICAgICAgICAgICAgIHNwbGljZUxpbmUoIGluZGVudCwgcmVtYWluZGVyLCB3aWR0aCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKCByZW1haW5kZXJbd2lkdGhdID09ICdcbicgKSB7CisgICAgICAgICAgICAgICAgICAgIHNwbGljZUxpbmUoIGluZGVudCwgcmVtYWluZGVyLCB3aWR0aCApOworICAgICAgICAgICAgICAgICAgICBpZiggd2lkdGggPD0gMSB8fCByZW1haW5kZXIuc2l6ZSgpICE9IDEgKQorICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluZGVyID0gcmVtYWluZGVyLnN1YnN0ciggMSApOworICAgICAgICAgICAgICAgICAgICBpbmRlbnQgPSBfYXR0ci5pbmRlbnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwb3MgPSByZW1haW5kZXIuZmluZF9sYXN0X29mKCB3cmFwcGFibGVDaGFycywgd2lkdGggKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHBvcyAhPSBzdGQ6OnN0cmluZzo6bnBvcyAmJiBwb3MgPiAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3BsaWNlTGluZSggaW5kZW50LCByZW1haW5kZXIsIHBvcyApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHJlbWFpbmRlclswXSA9PSAnICcgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmRlciA9IHJlbWFpbmRlci5zdWJzdHIoIDEgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwbGljZUxpbmUoIGluZGVudCwgcmVtYWluZGVyLCB3aWR0aC0xICk7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lcy5iYWNrKCkgKz0gIi0iOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKCBsaW5lcy5zaXplKCkgPT0gMSApCisgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQgPSBfYXR0ci5pbmRlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmKCB0YWJQb3MgIT0gc3RkOjpzdHJpbmc6Om5wb3MgKQorICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50ICs9IHRhYlBvczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHNwbGljZUxpbmUoIHN0ZDo6c2l6ZV90IF9pbmRlbnQsIHN0ZDo6c3RyaW5nJiBfcmVtYWluZGVyLCBzdGQ6OnNpemVfdCBfcG9zICkgeworICAgICAgICAgICAgbGluZXMucHVzaF9iYWNrKCBzdGQ6OnN0cmluZyggX2luZGVudCwgJyAnICkgKyBfcmVtYWluZGVyLnN1YnN0ciggMCwgX3BvcyApICk7CisgICAgICAgICAgICBfcmVtYWluZGVyID0gX3JlbWFpbmRlci5zdWJzdHIoIF9wb3MgKTsKKyAgICAgICAgfQorCisgICAgICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKKworICAgICAgICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGxpbmVzLmJlZ2luKCk7IH0KKyAgICAgICAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gbGluZXMuZW5kKCk7IH0KKyAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIGxhc3QoKSBjb25zdCB7IHJldHVybiBsaW5lcy5iYWNrKCk7IH0KKyAgICAgICAgc3RkOjpzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGxpbmVzLnNpemUoKTsgfQorICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgb3BlcmF0b3JbXSggc3RkOjpzaXplX3QgX2luZGV4ICkgY29uc3QgeyByZXR1cm4gbGluZXNbX2luZGV4XTsgfQorICAgICAgICBzdGQ6OnN0cmluZyB0b1N0cmluZygpIGNvbnN0IHsKKyAgICAgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgICAgICBvc3MgPDwgKnRoaXM7CisgICAgICAgICAgICByZXR1cm4gb3NzLnN0cigpOworICAgICAgICB9CisKKyAgICAgICAgaW5saW5lIGZyaWVuZCBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yIDw8ICggc3RkOjpvc3RyZWFtJiBfc3RyZWFtLCBUZXh0IGNvbnN0JiBfdGV4dCApIHsKKyAgICAgICAgICAgIGZvciggVGV4dDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBfdGV4dC5iZWdpbigpLCBpdEVuZCA9IF90ZXh0LmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOyArK2l0ICkgeworICAgICAgICAgICAgICAgIGlmKCBpdCAhPSBfdGV4dC5iZWdpbigpICkKKyAgICAgICAgICAgICAgICAgICAgX3N0cmVhbSA8PCAiXG4iOworICAgICAgICAgICAgICAgIF9zdHJlYW0gPDwgKml0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIF9zdHJlYW07CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6c3RyaW5nIHN0cjsKKyAgICAgICAgVGV4dEF0dHJpYnV0ZXMgYXR0cjsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGxpbmVzOworICAgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBUYmMKKworI2lmZGVmIFNUSVRDSF9UQkNfVEVYVF9GT1JNQVRfT1VURVJfTkFNRVNQQUNFCit9IC8vIGVuZCBvdXRlciBuYW1lc3BhY2UKKyNlbmRpZgorCisjZW5kaWYgLy8gVEJDX1RFWFRfRk9STUFUX0hfSU5DTFVERUQKKworLy8gLS0tLS0tLS0tLS0gZW5kIG9mICNpbmNsdWRlIGZyb20gdGJjX3RleHRfZm9ybWF0LmggLS0tLS0tLS0tLS0KKy8vIC4uLi4uLi4uLi4uIGJhY2sgaW4gY2xhcmEuaAorCisjdW5kZWYgU1RJVENIX1RCQ19URVhUX0ZPUk1BVF9PUEVOX05BTUVTUEFDRQorCisvLyAtLS0tLS0tLS0tLSAjaW5jbHVkZWQgZnJvbSBjbGFyYV9jb21waWxlcnMuaCAtLS0tLS0tLS0tLQorCisjaWZuZGVmIFRXT0JMVUVDVUJFU19DTEFSQV9DT01QSUxFUlNfSF9JTkNMVURFRAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0xBUkFfQ09NUElMRVJTX0hfSU5DTFVERUQKKworLy8gRGV0ZWN0IGEgbnVtYmVyIG9mIGNvbXBpbGVyIGZlYXR1cmVzIC0gbW9zdGx5IEMrKzExLzE0IGNvbmZvcm1hbmNlIC0gYnkgY29tcGlsZXIKKy8vIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGRlZmluZWQ6CisvLworLy8gQ0xBUkFfQ09ORklHX0NQUDExX05VTExQVFIgOiBpcyBudWxscHRyIHN1cHBvcnRlZD8KKy8vIENMQVJBX0NPTkZJR19DUFAxMV9OT0VYQ0VQVCA6IGlzIG5vZXhjZXB0IHN1cHBvcnRlZD8KKy8vIENMQVJBX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUyA6IFRoZSBkZWxldGUgYW5kIGRlZmF1bHQga2V5d29yZHMgZm9yIGNvbXBpbGVyIGdlbmVyYXRlZCBtZXRob2RzCisvLyBDTEFSQV9DT05GSUdfQ1BQMTFfT1ZFUlJJREUgOiBpcyBvdmVycmlkZSBzdXBwb3J0ZWQ/CisvLyBDTEFSQV9DT05GSUdfQ1BQMTFfVU5JUVVFX1BUUiA6IGlzIHVuaXF1ZV9wdHIgc3VwcG9ydGVkIChvdGhlcndpc2UgdXNlIGF1dG9fcHRyKQorCisvLyBDTEFSQV9DT05GSUdfQ1BQMTFfT1JfR1JFQVRFUiA6IElzIEMrKzExIHN1cHBvcnRlZD8KKworLy8gQ0xBUkFfQ09ORklHX1ZBUklBRElDX01BQ1JPUyA6IGFyZSB2YXJpYWRpYyBtYWNyb3Mgc3VwcG9ydGVkPworCisvLyBJbiBnZW5lcmFsIGVhY2ggbWFjcm8gaGFzIGEgX05PXzxmZWF0dXJlIG5hbWU+IGZvcm0KKy8vIChlLmcuIENMQVJBX0NPTkZJR19DUFAxMV9OT19OVUxMUFRSKSB3aGljaCBkaXNhYmxlcyB0aGUgZmVhdHVyZS4KKy8vIE1hbnkgZmVhdHVyZXMsIGF0IHBvaW50IG9mIGRldGVjdGlvbiwgZGVmaW5lIGFuIF9JTlRFUk5BTF8gbWFjcm8sIHNvIHRoZXkKKy8vIGNhbiBiZSBjb21iaW5lZCwgZW4tbWFzcywgd2l0aCB0aGUgX05PXyBmb3JtcyBsYXRlci4KKworLy8gQWxsIHRoZSBDKysxMSBmZWF0dXJlcyBjYW4gYmUgZGlzYWJsZWQgd2l0aCBDTEFSQV9DT05GSUdfTk9fQ1BQMTEKKworI2lmZGVmIF9fY2xhbmdfXworCisjaWYgX19oYXNfZmVhdHVyZShjeHhfbnVsbHB0cikKKyNkZWZpbmUgQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX05VTExQVFIKKyNlbmRpZgorCisjaWYgX19oYXNfZmVhdHVyZShjeHhfbm9leGNlcHQpCisjZGVmaW5lIENMQVJBX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OT0VYQ0VQVAorI2VuZGlmCisKKyNlbmRpZiAvLyBfX2NsYW5nX18KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEdDQworI2lmZGVmIF9fR05VQ19fCisKKyNpZiBfX0dOVUNfXyA9PSA0ICYmIF9fR05VQ19NSU5PUl9fID49IDYgJiYgZGVmaW5lZChfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXykKKyNkZWZpbmUgQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX05VTExQVFIKKyNlbmRpZgorCisvLyAtIG90aGVyd2lzZSBtb3JlIHJlY2VudCB2ZXJzaW9ucyBkZWZpbmUgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorLy8gYW5kIHdpbGwgZ2V0IHBpY2tlZCB1cCBiZWxvdworCisjZW5kaWYgLy8gX19HTlVDX18KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFZpc3VhbCBDKysKKyNpZmRlZiBfTVNDX1ZFUgorCisjaWYgKF9NU0NfVkVSID49IDE2MDApCisjZGVmaW5lIENMQVJBX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OVUxMUFRSCisjZGVmaW5lIENMQVJBX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9VTklRVUVfUFRSCisjZW5kaWYKKworI2lmIChfTVNDX1ZFUiA+PSAxOTAwICkgLy8gKFZDKysgMTMgKFZTMjAxNSkpCisjZGVmaW5lIENMQVJBX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OT0VYQ0VQVAorI2RlZmluZSBDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMKKyNlbmRpZgorCisjZW5kaWYgLy8gX01TQ19WRVIKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEMrKyBsYW5ndWFnZSBmZWF0dXJlIHN1cHBvcnQKKworLy8gY2F0Y2ggYWxsIHN1cHBvcnQgZm9yIEMrKzExCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgJiYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorCisjZGVmaW5lIENMQVJBX0NQUDExX09SX0dSRUFURVIKKworI2lmICFkZWZpbmVkKENMQVJBX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OVUxMUFRSKQorI2RlZmluZSBDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTlVMTFBUUgorI2VuZGlmCisKKyNpZm5kZWYgQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX05PRVhDRVBUCisjZGVmaW5lIENMQVJBX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OT0VYQ0VQVAorI2VuZGlmCisKKyNpZm5kZWYgQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTCisjZGVmaW5lIENMQVJBX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfT1ZFUlJJREUpCisjZGVmaW5lIENMQVJBX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9PVkVSUklERQorI2VuZGlmCisjaWYgIWRlZmluZWQoQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX1VOSVFVRV9QVFIpCisjZGVmaW5lIENMQVJBX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9VTklRVUVfUFRSCisjZW5kaWYKKworI2VuZGlmIC8vIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKworLy8gTm93IHNldCB0aGUgYWN0dWFsIGRlZmluZXMgYmFzZWQgb24gdGhlIGFib3ZlICsgYW55dGhpbmcgdGhlIHVzZXIgaGFzIGNvbmZpZ3VyZWQKKyNpZiBkZWZpbmVkKENMQVJBX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OVUxMUFRSKSAmJiAhZGVmaW5lZChDTEFSQV9DT05GSUdfQ1BQMTFfTk9fTlVMTFBUUikgJiYgIWRlZmluZWQoQ0xBUkFfQ09ORklHX0NQUDExX05VTExQVFIpICYmICFkZWZpbmVkKENMQVJBX0NPTkZJR19OT19DUFAxMSkKKyNkZWZpbmUgQ0xBUkFfQ09ORklHX0NQUDExX05VTExQVFIKKyNlbmRpZgorI2lmIGRlZmluZWQoQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX05PRVhDRVBUKSAmJiAhZGVmaW5lZChDTEFSQV9DT05GSUdfQ1BQMTFfTk9fTk9FWENFUFQpICYmICFkZWZpbmVkKENMQVJBX0NPTkZJR19DUFAxMV9OT0VYQ0VQVCkgJiYgIWRlZmluZWQoQ0xBUkFfQ09ORklHX05PX0NQUDExKQorI2RlZmluZSBDTEFSQV9DT05GSUdfQ1BQMTFfTk9FWENFUFQKKyNlbmRpZgorI2lmIGRlZmluZWQoQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTKSAmJiAhZGVmaW5lZChDTEFSQV9DT05GSUdfQ1BQMTFfTk9fR0VORVJBVEVEX01FVEhPRFMpICYmICFkZWZpbmVkKENMQVJBX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUykgJiYgIWRlZmluZWQoQ0xBUkFfQ09ORklHX05PX0NQUDExKQorI2RlZmluZSBDTEFSQV9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMKKyNlbmRpZgorI2lmIGRlZmluZWQoQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX09WRVJSSURFKSAmJiAhZGVmaW5lZChDTEFSQV9DT05GSUdfTk9fT1ZFUlJJREUpICYmICFkZWZpbmVkKENMQVJBX0NPTkZJR19DUFAxMV9PVkVSUklERSkgJiYgIWRlZmluZWQoQ0xBUkFfQ09ORklHX05PX0NQUDExKQorI2RlZmluZSBDTEFSQV9DT05GSUdfQ1BQMTFfT1ZFUlJJREUKKyNlbmRpZgorI2lmIGRlZmluZWQoQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX1VOSVFVRV9QVFIpICYmICFkZWZpbmVkKENMQVJBX0NPTkZJR19OT19VTklRVUVfUFRSKSAmJiAhZGVmaW5lZChDTEFSQV9DT05GSUdfQ1BQMTFfVU5JUVVFX1BUUikgJiYgIWRlZmluZWQoQ0xBUkFfQ09ORklHX05PX0NQUDExKQorI2RlZmluZSBDTEFSQV9DT05GSUdfQ1BQMTFfVU5JUVVFX1BUUgorI2VuZGlmCisKKy8vIG5vZXhjZXB0IHN1cHBvcnQ6CisjaWYgZGVmaW5lZChDTEFSQV9DT05GSUdfQ1BQMTFfTk9FWENFUFQpICYmICFkZWZpbmVkKENMQVJBX05PRVhDRVBUKQorI2RlZmluZSBDTEFSQV9OT0VYQ0VQVCBub2V4Y2VwdAorIyAgZGVmaW5lIENMQVJBX05PRVhDRVBUX0lTKHgpIG5vZXhjZXB0KHgpCisjZWxzZQorI2RlZmluZSBDTEFSQV9OT0VYQ0VQVCB0aHJvdygpCisjICBkZWZpbmUgQ0xBUkFfTk9FWENFUFRfSVMoeCkKKyNlbmRpZgorCisvLyBudWxscHRyIHN1cHBvcnQKKyNpZmRlZiBDTEFSQV9DT05GSUdfQ1BQMTFfTlVMTFBUUgorI2RlZmluZSBDTEFSQV9OVUxMIG51bGxwdHIKKyNlbHNlCisjZGVmaW5lIENMQVJBX05VTEwgTlVMTAorI2VuZGlmCisKKy8vIG92ZXJyaWRlIHN1cHBvcnQKKyNpZmRlZiBDTEFSQV9DT05GSUdfQ1BQMTFfT1ZFUlJJREUKKyNkZWZpbmUgQ0xBUkFfT1ZFUlJJREUgb3ZlcnJpZGUKKyNlbHNlCisjZGVmaW5lIENMQVJBX09WRVJSSURFCisjZW5kaWYKKworLy8gdW5pcXVlX3B0ciBzdXBwb3J0CisjaWZkZWYgQ0xBUkFfQ09ORklHX0NQUDExX1VOSVFVRV9QVFIKKyMgICBkZWZpbmUgQ0xBUkFfQVVUT19QVFIoIFQgKSBzdGQ6OnVuaXF1ZV9wdHI8VD4KKyNlbHNlCisjICAgZGVmaW5lIENMQVJBX0FVVE9fUFRSKCBUICkgc3RkOjphdXRvX3B0cjxUPgorI2VuZGlmCisKKyNlbmRpZiAvLyBUV09CTFVFQ1VCRVNfQ0xBUkFfQ09NUElMRVJTX0hfSU5DTFVERUQKKworLy8gLS0tLS0tLS0tLS0gZW5kIG9mICNpbmNsdWRlIGZyb20gY2xhcmFfY29tcGlsZXJzLmggLS0tLS0tLS0tLS0KKy8vIC4uLi4uLi4uLi4uIGJhY2sgaW4gY2xhcmEuaAorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpZiBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9fV0lOMzJfXykgfHwgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX01TQ19WRVIpCisjZGVmaW5lIENMQVJBX1BMQVRGT1JNX1dJTkRPV1MKKyNlbmRpZgorCisvLyBVc2Ugb3B0aW9uYWwgb3V0ZXIgbmFtZXNwYWNlCisjaWZkZWYgU1RJVENIX0NMQVJBX09QRU5fTkFNRVNQQUNFCitTVElUQ0hfQ0xBUkFfT1BFTl9OQU1FU1BBQ0UKKyNlbmRpZgorCituYW1lc3BhY2UgQ2xhcmEgeworCisgICAgc3RydWN0IFVucG9zaXRpb25hbFRhZyB7fTsKKworICAgIGV4dGVybiBVbnBvc2l0aW9uYWxUYWcgXzsKKworI2lmZGVmIENMQVJBX0NPTkZJR19NQUlOCisgICAgVW5wb3NpdGlvbmFsVGFnIF87CisjZW5kaWYKKworICAgIG5hbWVzcGFjZSBEZXRhaWwgeworCisjaWZkZWYgQ0xBUkFfQ09OU09MRV9XSURUSAorICAgIGNvbnN0IHVuc2lnbmVkIGludCBjb25zb2xlV2lkdGggPSBDTEFSQV9DT05GSUdfQ09OU09MRV9XSURUSDsKKyNlbHNlCisgICAgY29uc3QgdW5zaWduZWQgaW50IGNvbnNvbGVXaWR0aCA9IDgwOworI2VuZGlmCisKKyAgICAgICAgdXNpbmcgbmFtZXNwYWNlIFRiYzsKKworICAgICAgICBpbmxpbmUgYm9vbCBzdGFydHNXaXRoKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyLCBzdGQ6OnN0cmluZyBjb25zdCYgcHJlZml4ICkgeworICAgICAgICAgICAgcmV0dXJuIHN0ci5zaXplKCkgPj0gcHJlZml4LnNpemUoKSAmJiBzdHIuc3Vic3RyKCAwLCBwcmVmaXguc2l6ZSgpICkgPT0gcHJlZml4OworICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IFJlbW92ZUNvbnN0UmVmeyB0eXBlZGVmIFQgdHlwZTsgfTsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IFJlbW92ZUNvbnN0UmVmPFQmPnsgdHlwZWRlZiBUIHR5cGU7IH07CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBSZW1vdmVDb25zdFJlZjxUIGNvbnN0Jj57IHR5cGVkZWYgVCB0eXBlOyB9OworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgUmVtb3ZlQ29uc3RSZWY8VCBjb25zdD57IHR5cGVkZWYgVCB0eXBlOyB9OworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+ICAgIHN0cnVjdCBJc0Jvb2wgICAgICAgeyBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IGZhbHNlOyB9OworICAgICAgICB0ZW1wbGF0ZTw+ICAgICAgICAgICAgICBzdHJ1Y3QgSXNCb29sPGJvb2w+IHsgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOyB9OworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIHZvaWQgY29udmVydEludG8oIHN0ZDo6c3RyaW5nIGNvbnN0JiBfc291cmNlLCBUJiBfZGVzdCApIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgICAgICAgICAgc3MgPDwgX3NvdXJjZTsKKyAgICAgICAgICAgIHNzID4+IF9kZXN0OworICAgICAgICAgICAgaWYoIHNzLmZhaWwoKSApCisgICAgICAgICAgICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCAiVW5hYmxlIHRvIGNvbnZlcnQgIiArIF9zb3VyY2UgKyAiIHRvIGRlc3RpbmF0aW9uIHR5cGUiICk7CisgICAgICAgIH0KKyAgICAgICAgaW5saW5lIHZvaWQgY29udmVydEludG8oIHN0ZDo6c3RyaW5nIGNvbnN0JiBfc291cmNlLCBzdGQ6OnN0cmluZyYgX2Rlc3QgKSB7CisgICAgICAgICAgICBfZGVzdCA9IF9zb3VyY2U7CisgICAgICAgIH0KKyAgICAgICAgY2hhciB0b0xvd2VyQ2goY2hhciBjKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y2hhcj4oIHN0ZDo6dG9sb3dlciggYyApICk7CisgICAgICAgIH0KKyAgICAgICAgaW5saW5lIHZvaWQgY29udmVydEludG8oIHN0ZDo6c3RyaW5nIGNvbnN0JiBfc291cmNlLCBib29sJiBfZGVzdCApIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNvdXJjZUxDID0gX3NvdXJjZTsKKyAgICAgICAgICAgIHN0ZDo6dHJhbnNmb3JtKCBzb3VyY2VMQy5iZWdpbigpLCBzb3VyY2VMQy5lbmQoKSwgc291cmNlTEMuYmVnaW4oKSwgdG9Mb3dlckNoICk7CisgICAgICAgICAgICBpZiggc291cmNlTEMgPT0gInkiIHx8IHNvdXJjZUxDID09ICIxIiB8fCBzb3VyY2VMQyA9PSAidHJ1ZSIgfHwgc291cmNlTEMgPT0gInllcyIgfHwgc291cmNlTEMgPT0gIm9uIiApCisgICAgICAgICAgICAgICAgX2Rlc3QgPSB0cnVlOworICAgICAgICAgICAgZWxzZSBpZiggc291cmNlTEMgPT0gIm4iIHx8IHNvdXJjZUxDID09ICIwIiB8fCBzb3VyY2VMQyA9PSAiZmFsc2UiIHx8IHNvdXJjZUxDID09ICJubyIgfHwgc291cmNlTEMgPT0gIm9mZiIgKQorICAgICAgICAgICAgICAgIF9kZXN0ID0gZmFsc2U7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCAiRXhwZWN0ZWQgYSBib29sZWFuIHZhbHVlIGJ1dCBkaWQgbm90IHJlY29nbmlzZTpcbiAgJyIgKyBfc291cmNlICsgIiciICk7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDb25maWdUPgorICAgICAgICBzdHJ1Y3QgSUFyZ0Z1bmN0aW9uIHsKKyAgICAgICAgICAgIHZpcnR1YWwgfklBcmdGdW5jdGlvbigpIHt9CisjaWZkZWYgQ0xBUkFfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTCisgICAgICAgICAgICBJQXJnRnVuY3Rpb24oKSAgICAgICAgICAgICAgICAgICAgICA9IGRlZmF1bHQ7CisgICAgICAgICAgICBJQXJnRnVuY3Rpb24oIElBcmdGdW5jdGlvbiBjb25zdCYgKSA9IGRlZmF1bHQ7CisjZW5kaWYKKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBzZXQoIENvbmZpZ1QmIGNvbmZpZywgc3RkOjpzdHJpbmcgY29uc3QmIHZhbHVlICkgY29uc3QgPSAwOworICAgICAgICAgICAgdmlydHVhbCBib29sIHRha2VzQXJnKCkgY29uc3QgPSAwOworICAgICAgICAgICAgdmlydHVhbCBJQXJnRnVuY3Rpb24qIGNsb25lKCkgY29uc3QgPSAwOworICAgICAgICB9OworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIENvbmZpZ1Q+CisgICAgICAgIGNsYXNzIEJvdW5kQXJnRnVuY3Rpb24geworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBCb3VuZEFyZ0Z1bmN0aW9uKCkgOiBmdW5jdGlvbk9iaiggQ0xBUkFfTlVMTCApIHt9CisgICAgICAgICAgICBCb3VuZEFyZ0Z1bmN0aW9uKCBJQXJnRnVuY3Rpb248Q29uZmlnVD4qIF9mdW5jdGlvbk9iaiApIDogZnVuY3Rpb25PYmooIF9mdW5jdGlvbk9iaiApIHt9CisgICAgICAgICAgICBCb3VuZEFyZ0Z1bmN0aW9uKCBCb3VuZEFyZ0Z1bmN0aW9uIGNvbnN0JiBvdGhlciApIDogZnVuY3Rpb25PYmooIG90aGVyLmZ1bmN0aW9uT2JqID8gb3RoZXIuZnVuY3Rpb25PYmotPmNsb25lKCkgOiBDTEFSQV9OVUxMICkge30KKyAgICAgICAgICAgIEJvdW5kQXJnRnVuY3Rpb24mIG9wZXJhdG9yID0gKCBCb3VuZEFyZ0Z1bmN0aW9uIGNvbnN0JiBvdGhlciApIHsKKyAgICAgICAgICAgICAgICBJQXJnRnVuY3Rpb248Q29uZmlnVD4qIG5ld0Z1bmN0aW9uT2JqID0gb3RoZXIuZnVuY3Rpb25PYmogPyBvdGhlci5mdW5jdGlvbk9iai0+Y2xvbmUoKSA6IENMQVJBX05VTEw7CisgICAgICAgICAgICAgICAgZGVsZXRlIGZ1bmN0aW9uT2JqOworICAgICAgICAgICAgICAgIGZ1bmN0aW9uT2JqID0gbmV3RnVuY3Rpb25PYmo7CisgICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgfkJvdW5kQXJnRnVuY3Rpb24oKSB7IGRlbGV0ZSBmdW5jdGlvbk9iajsgfQorCisgICAgICAgICAgICB2b2lkIHNldCggQ29uZmlnVCYgY29uZmlnLCBzdGQ6OnN0cmluZyBjb25zdCYgdmFsdWUgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgZnVuY3Rpb25PYmotPnNldCggY29uZmlnLCB2YWx1ZSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYm9vbCB0YWtlc0FyZygpIGNvbnN0IHsgcmV0dXJuIGZ1bmN0aW9uT2JqLT50YWtlc0FyZygpOyB9CisKKyAgICAgICAgICAgIGJvb2wgaXNTZXQoKSBjb25zdCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uT2JqICE9IENMQVJBX05VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICBJQXJnRnVuY3Rpb248Q29uZmlnVD4qIGZ1bmN0aW9uT2JqOworICAgICAgICB9OworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEM+CisgICAgICAgIHN0cnVjdCBOdWxsQmluZGVyIDogSUFyZ0Z1bmN0aW9uPEM+eworICAgICAgICAgICAgdmlydHVhbCB2b2lkIHNldCggQyYsIHN0ZDo6c3RyaW5nIGNvbnN0JiApIGNvbnN0IHt9CisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgdGFrZXNBcmcoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisgICAgICAgICAgICB2aXJ0dWFsIElBcmdGdW5jdGlvbjxDPiogY2xvbmUoKSBjb25zdCB7IHJldHVybiBuZXcgTnVsbEJpbmRlciggKnRoaXMgKTsgfQorICAgICAgICB9OworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEMsIHR5cGVuYW1lIE0+CisgICAgICAgIHN0cnVjdCBCb3VuZERhdGFNZW1iZXIgOiBJQXJnRnVuY3Rpb248Qz57CisgICAgICAgICAgICBCb3VuZERhdGFNZW1iZXIoIE0gQzo6KiBfbWVtYmVyICkgOiBtZW1iZXIoIF9tZW1iZXIgKSB7fQorICAgICAgICAgICAgdmlydHVhbCB2b2lkIHNldCggQyYgcCwgc3RkOjpzdHJpbmcgY29uc3QmIHN0cmluZ1ZhbHVlICkgY29uc3QgeworICAgICAgICAgICAgICAgIGNvbnZlcnRJbnRvKCBzdHJpbmdWYWx1ZSwgcC4qbWVtYmVyICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgdGFrZXNBcmcoKSBjb25zdCB7IHJldHVybiAhSXNCb29sPE0+Ojp2YWx1ZTsgfQorICAgICAgICAgICAgdmlydHVhbCBJQXJnRnVuY3Rpb248Qz4qIGNsb25lKCkgY29uc3QgeyByZXR1cm4gbmV3IEJvdW5kRGF0YU1lbWJlciggKnRoaXMgKTsgfQorICAgICAgICAgICAgTSBDOjoqIG1lbWJlcjsKKyAgICAgICAgfTsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQywgdHlwZW5hbWUgTT4KKyAgICAgICAgc3RydWN0IEJvdW5kVW5hcnlNZXRob2QgOiBJQXJnRnVuY3Rpb248Qz57CisgICAgICAgICAgICBCb3VuZFVuYXJ5TWV0aG9kKCB2b2lkIChDOjoqX21lbWJlcikoIE0gKSApIDogbWVtYmVyKCBfbWVtYmVyICkge30KKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBzZXQoIEMmIHAsIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHJpbmdWYWx1ZSApIGNvbnN0IHsKKyAgICAgICAgICAgICAgICB0eXBlbmFtZSBSZW1vdmVDb25zdFJlZjxNPjo6dHlwZSB2YWx1ZTsKKyAgICAgICAgICAgICAgICBjb252ZXJ0SW50byggc3RyaW5nVmFsdWUsIHZhbHVlICk7CisgICAgICAgICAgICAgICAgKHAuKm1lbWJlcikoIHZhbHVlICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgdGFrZXNBcmcoKSBjb25zdCB7IHJldHVybiAhSXNCb29sPE0+Ojp2YWx1ZTsgfQorICAgICAgICAgICAgdmlydHVhbCBJQXJnRnVuY3Rpb248Qz4qIGNsb25lKCkgY29uc3QgeyByZXR1cm4gbmV3IEJvdW5kVW5hcnlNZXRob2QoICp0aGlzICk7IH0KKyAgICAgICAgICAgIHZvaWQgKEM6OiptZW1iZXIpKCBNICk7CisgICAgICAgIH07CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEM+CisgICAgICAgIHN0cnVjdCBCb3VuZE51bGxhcnlNZXRob2QgOiBJQXJnRnVuY3Rpb248Qz57CisgICAgICAgICAgICBCb3VuZE51bGxhcnlNZXRob2QoIHZvaWQgKEM6OipfbWVtYmVyKSgpICkgOiBtZW1iZXIoIF9tZW1iZXIgKSB7fQorICAgICAgICAgICAgdmlydHVhbCB2b2lkIHNldCggQyYgcCwgc3RkOjpzdHJpbmcgY29uc3QmIHN0cmluZ1ZhbHVlICkgY29uc3QgeworICAgICAgICAgICAgICAgIGJvb2wgdmFsdWU7CisgICAgICAgICAgICAgICAgY29udmVydEludG8oIHN0cmluZ1ZhbHVlLCB2YWx1ZSApOworICAgICAgICAgICAgICAgIGlmKCB2YWx1ZSApCisgICAgICAgICAgICAgICAgICAgIChwLiptZW1iZXIpKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgdGFrZXNBcmcoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICAgICAgICAgICAgdmlydHVhbCBJQXJnRnVuY3Rpb248Qz4qIGNsb25lKCkgY29uc3QgeyByZXR1cm4gbmV3IEJvdW5kTnVsbGFyeU1ldGhvZCggKnRoaXMgKTsgfQorICAgICAgICAgICAgdm9pZCAoQzo6Km1lbWJlcikoKTsKKyAgICAgICAgfTsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDPgorICAgICAgICBzdHJ1Y3QgQm91bmRVbmFyeUZ1bmN0aW9uIDogSUFyZ0Z1bmN0aW9uPEM+eworICAgICAgICAgICAgQm91bmRVbmFyeUZ1bmN0aW9uKCB2b2lkICgqX2Z1bmN0aW9uKSggQyYgKSApIDogZnVuY3Rpb24oIF9mdW5jdGlvbiApIHt9CisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0KCBDJiBvYmosIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHJpbmdWYWx1ZSApIGNvbnN0IHsKKyAgICAgICAgICAgICAgICBib29sIHZhbHVlOworICAgICAgICAgICAgICAgIGNvbnZlcnRJbnRvKCBzdHJpbmdWYWx1ZSwgdmFsdWUgKTsKKyAgICAgICAgICAgICAgICBpZiggdmFsdWUgKQorICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiggb2JqICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgdGFrZXNBcmcoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICAgICAgICAgICAgdmlydHVhbCBJQXJnRnVuY3Rpb248Qz4qIGNsb25lKCkgY29uc3QgeyByZXR1cm4gbmV3IEJvdW5kVW5hcnlGdW5jdGlvbiggKnRoaXMgKTsgfQorICAgICAgICAgICAgdm9pZCAoKmZ1bmN0aW9uKSggQyYgKTsKKyAgICAgICAgfTsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDLCB0eXBlbmFtZSBUPgorICAgICAgICBzdHJ1Y3QgQm91bmRCaW5hcnlGdW5jdGlvbiA6IElBcmdGdW5jdGlvbjxDPnsKKyAgICAgICAgICAgIEJvdW5kQmluYXJ5RnVuY3Rpb24oIHZvaWQgKCpfZnVuY3Rpb24pKCBDJiwgVCApICkgOiBmdW5jdGlvbiggX2Z1bmN0aW9uICkge30KKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBzZXQoIEMmIG9iaiwgc3RkOjpzdHJpbmcgY29uc3QmIHN0cmluZ1ZhbHVlICkgY29uc3QgeworICAgICAgICAgICAgICAgIHR5cGVuYW1lIFJlbW92ZUNvbnN0UmVmPFQ+Ojp0eXBlIHZhbHVlOworICAgICAgICAgICAgICAgIGNvbnZlcnRJbnRvKCBzdHJpbmdWYWx1ZSwgdmFsdWUgKTsKKyAgICAgICAgICAgICAgICBmdW5jdGlvbiggb2JqLCB2YWx1ZSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlydHVhbCBib29sIHRha2VzQXJnKCkgY29uc3QgeyByZXR1cm4gIUlzQm9vbDxUPjo6dmFsdWU7IH0KKyAgICAgICAgICAgIHZpcnR1YWwgSUFyZ0Z1bmN0aW9uPEM+KiBjbG9uZSgpIGNvbnN0IHsgcmV0dXJuIG5ldyBCb3VuZEJpbmFyeUZ1bmN0aW9uKCAqdGhpcyApOyB9CisgICAgICAgICAgICB2b2lkICgqZnVuY3Rpb24pKCBDJiwgVCApOworICAgICAgICB9OworCisgICAgfSAvLyBuYW1lc3BhY2UgRGV0YWlsCisKKyAgICBpbmxpbmUgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGFyZ3NUb1ZlY3RvciggaW50IGFyZ2MsIGNoYXIgY29uc3QqIGNvbnN0KiBjb25zdCBhcmd2ICkgeworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gYXJncyggc3RhdGljX2Nhc3Q8c3RkOjpzaXplX3Q+KCBhcmdjICkgKTsKKyAgICAgICAgZm9yKCBzdGQ6OnNpemVfdCBpID0gMDsgaSA8IHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90PiggYXJnYyApOyArK2kgKQorICAgICAgICAgICAgYXJnc1tpXSA9IGFyZ3ZbaV07CisKKyAgICAgICAgcmV0dXJuIGFyZ3M7CisgICAgfQorCisgICAgY2xhc3MgUGFyc2VyIHsKKyAgICAgICAgZW51bSBNb2RlIHsgTm9uZSwgTWF5YmVTaG9ydE9wdCwgU2xhc2hPcHQsIFNob3J0T3B0LCBMb25nT3B0LCBQb3NpdGlvbmFsIH07CisgICAgICAgIE1vZGUgbW9kZTsKKyAgICAgICAgc3RkOjpzaXplX3QgZnJvbTsKKyAgICAgICAgYm9vbCBpblF1b3RlczsKKyAgICBwdWJsaWM6CisKKyAgICAgICAgc3RydWN0IFRva2VuIHsKKyAgICAgICAgICAgIGVudW0gVHlwZSB7IFBvc2l0aW9uYWwsIFNob3J0T3B0LCBMb25nT3B0IH07CisgICAgICAgICAgICBUb2tlbiggVHlwZSBfdHlwZSwgc3RkOjpzdHJpbmcgY29uc3QmIF9kYXRhICkgOiB0eXBlKCBfdHlwZSApLCBkYXRhKCBfZGF0YSApIHt9CisgICAgICAgICAgICBUeXBlIHR5cGU7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBkYXRhOworICAgICAgICB9OworCisgICAgICAgIFBhcnNlcigpIDogbW9kZSggTm9uZSApLCBmcm9tKCAwICksIGluUXVvdGVzKCBmYWxzZSApe30KKworICAgICAgICB2b2lkIHBhcnNlSW50b1Rva2Vucyggc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNvbnN0JiBhcmdzLCBzdGQ6OnZlY3RvcjxUb2tlbj4mIHRva2VucyApIHsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGRvdWJsZURhc2ggPSAiLS0iOworICAgICAgICAgICAgZm9yKCBzdGQ6OnNpemVfdCBpID0gMTsgaSA8IGFyZ3Muc2l6ZSgpICYmIGFyZ3NbaV0gIT0gZG91YmxlRGFzaDsgKytpICkKKyAgICAgICAgICAgICAgICBwYXJzZUludG9Ub2tlbnMoIGFyZ3NbaV0sIHRva2Vucyk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHBhcnNlSW50b1Rva2Vucyggc3RkOjpzdHJpbmcgY29uc3QmIGFyZywgc3RkOjp2ZWN0b3I8VG9rZW4+JiB0b2tlbnMgKSB7CisgICAgICAgICAgICBmb3IoIHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgYXJnLnNpemUoKTsgKytpICkgeworICAgICAgICAgICAgICAgIGNoYXIgYyA9IGFyZ1tpXTsKKyAgICAgICAgICAgICAgICBpZiggYyA9PSAnIicgKQorICAgICAgICAgICAgICAgICAgICBpblF1b3RlcyA9ICFpblF1b3RlczsKKyAgICAgICAgICAgICAgICBtb2RlID0gaGFuZGxlTW9kZSggaSwgYywgYXJnLCB0b2tlbnMgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1vZGUgPSBoYW5kbGVNb2RlKCBhcmcuc2l6ZSgpLCAnXDAnLCBhcmcsIHRva2VucyApOworICAgICAgICB9CisgICAgICAgIE1vZGUgaGFuZGxlTW9kZSggc3RkOjpzaXplX3QgaSwgY2hhciBjLCBzdGQ6OnN0cmluZyBjb25zdCYgYXJnLCBzdGQ6OnZlY3RvcjxUb2tlbj4mIHRva2VucyApIHsKKyAgICAgICAgICAgIHN3aXRjaCggbW9kZSApIHsKKyAgICAgICAgICAgICAgICBjYXNlIE5vbmU6IHJldHVybiBoYW5kbGVOb25lKCBpLCBjICk7CisgICAgICAgICAgICAgICAgY2FzZSBNYXliZVNob3J0T3B0OiByZXR1cm4gaGFuZGxlTWF5YmVTaG9ydE9wdCggaSwgYyApOworICAgICAgICAgICAgICAgIGNhc2UgU2hvcnRPcHQ6CisgICAgICAgICAgICAgICAgY2FzZSBMb25nT3B0OgorICAgICAgICAgICAgICAgIGNhc2UgU2xhc2hPcHQ6IHJldHVybiBoYW5kbGVPcHQoIGksIGMsIGFyZywgdG9rZW5zICk7CisgICAgICAgICAgICAgICAgY2FzZSBQb3NpdGlvbmFsOiByZXR1cm4gaGFuZGxlUG9zaXRpb25hbCggaSwgYywgYXJnLCB0b2tlbnMgKTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCAiVW5rbm93biBtb2RlIiApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgTW9kZSBoYW5kbGVOb25lKCBzdGQ6OnNpemVfdCBpLCBjaGFyIGMgKSB7CisgICAgICAgICAgICBpZiggaW5RdW90ZXMgKSB7CisgICAgICAgICAgICAgICAgZnJvbSA9IGk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFBvc2l0aW9uYWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2goIGMgKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnLSc6IHJldHVybiBNYXliZVNob3J0T3B0OworI2lmZGVmIENMQVJBX1BMQVRGT1JNX1dJTkRPV1MKKyAgICAgICAgICAgICAgICBjYXNlICcvJzogZnJvbSA9IGkrMTsgcmV0dXJuIFNsYXNoT3B0OworI2VuZGlmCisgICAgICAgICAgICAgICAgZGVmYXVsdDogZnJvbSA9IGk7IHJldHVybiBQb3NpdGlvbmFsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIE1vZGUgaGFuZGxlTWF5YmVTaG9ydE9wdCggc3RkOjpzaXplX3QgaSwgY2hhciBjICkgeworICAgICAgICAgICAgc3dpdGNoKCBjICkgeworICAgICAgICAgICAgICAgIGNhc2UgJy0nOiBmcm9tID0gaSsxOyByZXR1cm4gTG9uZ09wdDsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiBmcm9tID0gaTsgcmV0dXJuIFNob3J0T3B0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgTW9kZSBoYW5kbGVPcHQoIHN0ZDo6c2l6ZV90IGksIGNoYXIgYywgc3RkOjpzdHJpbmcgY29uc3QmIGFyZywgc3RkOjp2ZWN0b3I8VG9rZW4+JiB0b2tlbnMgKSB7CisgICAgICAgICAgICBpZiggc3RkOjpzdHJpbmcoICI6PVwwIiwgMyApLmZpbmQoIGMgKSA9PSBzdGQ6OnN0cmluZzo6bnBvcyApCisgICAgICAgICAgICAgICAgcmV0dXJuIG1vZGU7CisKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG9wdE5hbWUgPSBhcmcuc3Vic3RyKCBmcm9tLCBpLWZyb20gKTsKKyAgICAgICAgICAgIGlmKCBtb2RlID09IFNob3J0T3B0ICkKKyAgICAgICAgICAgICAgICBmb3IoIHN0ZDo6c2l6ZV90IGogPSAwOyBqIDwgb3B0TmFtZS5zaXplKCk7ICsraiApCisgICAgICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoX2JhY2soIFRva2VuKCBUb2tlbjo6U2hvcnRPcHQsIG9wdE5hbWUuc3Vic3RyKCBqLCAxICkgKSApOworICAgICAgICAgICAgZWxzZSBpZiggbW9kZSA9PSBTbGFzaE9wdCAmJiBvcHROYW1lLnNpemUoKSA9PSAxICkKKyAgICAgICAgICAgICAgICB0b2tlbnMucHVzaF9iYWNrKCBUb2tlbiggVG9rZW46OlNob3J0T3B0LCBvcHROYW1lICkgKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0b2tlbnMucHVzaF9iYWNrKCBUb2tlbiggVG9rZW46OkxvbmdPcHQsIG9wdE5hbWUgKSApOworICAgICAgICAgICAgcmV0dXJuIE5vbmU7CisgICAgICAgIH0KKyAgICAgICAgTW9kZSBoYW5kbGVQb3NpdGlvbmFsKCBzdGQ6OnNpemVfdCBpLCBjaGFyIGMsIHN0ZDo6c3RyaW5nIGNvbnN0JiBhcmcsIHN0ZDo6dmVjdG9yPFRva2VuPiYgdG9rZW5zICkgeworICAgICAgICAgICAgaWYoIGluUXVvdGVzIHx8IHN0ZDo6c3RyaW5nKCAiXDAiLCAxICkuZmluZCggYyApID09IHN0ZDo6c3RyaW5nOjpucG9zICkKKyAgICAgICAgICAgICAgICByZXR1cm4gbW9kZTsKKworICAgICAgICAgICAgc3RkOjpzdHJpbmcgZGF0YSA9IGFyZy5zdWJzdHIoIGZyb20sIGktZnJvbSApOworICAgICAgICAgICAgdG9rZW5zLnB1c2hfYmFjayggVG9rZW4oIFRva2VuOjpQb3NpdGlvbmFsLCBkYXRhICkgKTsKKyAgICAgICAgICAgIHJldHVybiBOb25lOworICAgICAgICB9CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIENvbmZpZ1Q+CisgICAgc3RydWN0IENvbW1vbkFyZ1Byb3BlcnRpZXMgeworICAgICAgICBDb21tb25BcmdQcm9wZXJ0aWVzKCkge30KKyAgICAgICAgQ29tbW9uQXJnUHJvcGVydGllcyggRGV0YWlsOjpCb3VuZEFyZ0Z1bmN0aW9uPENvbmZpZ1Q+IGNvbnN0JiBfYm91bmRGaWVsZCApIDogYm91bmRGaWVsZCggX2JvdW5kRmllbGQgKSB7fQorCisgICAgICAgIERldGFpbDo6Qm91bmRBcmdGdW5jdGlvbjxDb25maWdUPiBib3VuZEZpZWxkOworICAgICAgICBzdGQ6OnN0cmluZyBkZXNjcmlwdGlvbjsKKyAgICAgICAgc3RkOjpzdHJpbmcgZGV0YWlsOworICAgICAgICBzdGQ6OnN0cmluZyBwbGFjZWhvbGRlcjsgLy8gT25seSB2YWx1ZSBpZiBib3VuZEZpZWxkIHRha2VzIGFuIGFyZworCisgICAgICAgIGJvb2wgdGFrZXNBcmcoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gIXBsYWNlaG9sZGVyLmVtcHR5KCk7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCB2YWxpZGF0ZSgpIGNvbnN0IHsKKyAgICAgICAgICAgIGlmKCAhYm91bmRGaWVsZC5pc1NldCgpICkKKyAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCAib3B0aW9uIG5vdCBib3VuZCIgKTsKKyAgICAgICAgfQorICAgIH07CisgICAgc3RydWN0IE9wdGlvbkFyZ1Byb3BlcnRpZXMgeworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc2hvcnROYW1lczsKKyAgICAgICAgc3RkOjpzdHJpbmcgbG9uZ05hbWU7CisKKyAgICAgICAgYm9vbCBoYXNTaG9ydE5hbWUoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzaG9ydE5hbWUgKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gc3RkOjpmaW5kKCBzaG9ydE5hbWVzLmJlZ2luKCksIHNob3J0TmFtZXMuZW5kKCksIHNob3J0TmFtZSApICE9IHNob3J0TmFtZXMuZW5kKCk7CisgICAgICAgIH0KKyAgICAgICAgYm9vbCBoYXNMb25nTmFtZSggc3RkOjpzdHJpbmcgY29uc3QmIF9sb25nTmFtZSApIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBfbG9uZ05hbWUgPT0gbG9uZ05hbWU7CisgICAgICAgIH0KKyAgICB9OworICAgIHN0cnVjdCBQb3NpdGlvbmFsQXJnUHJvcGVydGllcyB7CisgICAgICAgIFBvc2l0aW9uYWxBcmdQcm9wZXJ0aWVzKCkgOiBwb3NpdGlvbiggLTEgKSB7fQorICAgICAgICBpbnQgcG9zaXRpb247IC8vIC0xIG1lYW5zIG5vbi1wb3NpdGlvbmFsIChmbG9hdGluZykKKworICAgICAgICBib29sIGlzRml4ZWRQb3NpdGlvbmFsKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIHBvc2l0aW9uICE9IC0xOworICAgICAgICB9CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIENvbmZpZ1Q+CisgICAgY2xhc3MgQ29tbWFuZExpbmUgeworCisgICAgICAgIHN0cnVjdCBBcmcgOiBDb21tb25BcmdQcm9wZXJ0aWVzPENvbmZpZ1Q+LCBPcHRpb25BcmdQcm9wZXJ0aWVzLCBQb3NpdGlvbmFsQXJnUHJvcGVydGllcyB7CisgICAgICAgICAgICBBcmcoKSB7fQorICAgICAgICAgICAgQXJnKCBEZXRhaWw6OkJvdW5kQXJnRnVuY3Rpb248Q29uZmlnVD4gY29uc3QmIF9ib3VuZEZpZWxkICkgOiBDb21tb25BcmdQcm9wZXJ0aWVzPENvbmZpZ1Q+KCBfYm91bmRGaWVsZCApIHt9CisKKyAgICAgICAgICAgIHVzaW5nIENvbW1vbkFyZ1Byb3BlcnRpZXM8Q29uZmlnVD46OnBsYWNlaG9sZGVyOyAvLyAhVEJECisKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRiZ05hbWUoKSBjb25zdCB7CisgICAgICAgICAgICAgICAgaWYoICFsb25nTmFtZS5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICItLSIgKyBsb25nTmFtZTsKKyAgICAgICAgICAgICAgICBpZiggIXNob3J0TmFtZXMuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiLSIgKyBzaG9ydE5hbWVzWzBdOworICAgICAgICAgICAgICAgIHJldHVybiAicG9zaXRpb25hbCBhcmdzIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbW1hbmRzKCkgY29uc3QgeworICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgICAgICAgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdCA9IHNob3J0TmFtZXMuYmVnaW4oKSwgaXRFbmQgPSBzaG9ydE5hbWVzLmVuZCgpOworICAgICAgICAgICAgICAgIGZvcig7IGl0ICE9IGl0RW5kOyArK2l0ICkgeworICAgICAgICAgICAgICAgICAgICBpZiggZmlyc3QgKQorICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgb3NzIDw8ICIsICI7CisgICAgICAgICAgICAgICAgICAgIG9zcyA8PCAiLSIgPDwgKml0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiggIWxvbmdOYW1lLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCAhZmlyc3QgKQorICAgICAgICAgICAgICAgICAgICAgICAgb3NzIDw8ICIsICI7CisgICAgICAgICAgICAgICAgICAgIG9zcyA8PCAiLS0iIDw8IGxvbmdOYW1lOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiggIXBsYWNlaG9sZGVyLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgICAgICBvc3MgPDwgIiA8IiA8PCBwbGFjZWhvbGRlciA8PCAiPiI7CisgICAgICAgICAgICAgICAgcmV0dXJuIG9zcy5zdHIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICB0eXBlZGVmIENMQVJBX0FVVE9fUFRSKCBBcmcgKSBBcmdBdXRvUHRyOworCisgICAgICAgIGZyaWVuZCB2b2lkIGFkZE9wdE5hbWUoIEFyZyYgYXJnLCBzdGQ6OnN0cmluZyBjb25zdCYgb3B0TmFtZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBvcHROYW1lLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGlmKCBEZXRhaWw6OnN0YXJ0c1dpdGgoIG9wdE5hbWUsICItLSIgKSApIHsKKyAgICAgICAgICAgICAgICBpZiggIWFyZy5sb25nTmFtZS5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3RkOjpsb2dpY19lcnJvciggIk9ubHkgb25lIGxvbmcgb3B0IG1heSBiZSBzcGVjaWZpZWQuICciCisgICAgICAgICAgICAgICAgICAgICAgICArIGFyZy5sb25nTmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiJyBhbHJlYWR5IHNwZWNpZmllZCwgbm93IGF0dGVtcHRpbmcgdG8gYWRkICciCisgICAgICAgICAgICAgICAgICAgICAgICArIG9wdE5hbWUgKyAiJyIgKTsKKyAgICAgICAgICAgICAgICBhcmcubG9uZ05hbWUgPSBvcHROYW1lLnN1YnN0ciggMiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggRGV0YWlsOjpzdGFydHNXaXRoKCBvcHROYW1lLCAiLSIgKSApCisgICAgICAgICAgICAgICAgYXJnLnNob3J0TmFtZXMucHVzaF9iYWNrKCBvcHROYW1lLnN1YnN0ciggMSApICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdGhyb3cgc3RkOjpsb2dpY19lcnJvciggIm9wdGlvbiBtdXN0IGJlZ2luIHdpdGggLSBvciAtLS4gT3B0aW9uIHdhczogJyIgKyBvcHROYW1lICsgIiciICk7CisgICAgICAgIH0KKyAgICAgICAgZnJpZW5kIHZvaWQgc2V0UG9zaXRpb25hbEFyZyggQXJnJiBhcmcsIGludCBwb3NpdGlvbiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGFyZy5wb3NpdGlvbiA9IHBvc2l0aW9uOworICAgICAgICB9CisKKyAgICAgICAgY2xhc3MgQXJnQnVpbGRlciB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIEFyZ0J1aWxkZXIoIEFyZyogYXJnICkgOiBtX2FyZyggYXJnICkge30KKworICAgICAgICAgICAgLy8gQmluZCBhIG5vbi1ib29sZWFuIGRhdGEgbWVtYmVyIChyZXF1aXJlcyBwbGFjZWhvbGRlciBzdHJpbmcpCisgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDLCB0eXBlbmFtZSBNPgorICAgICAgICAgICAgdm9pZCBiaW5kKCBNIEM6OiogZmllbGQsIHN0ZDo6c3RyaW5nIGNvbnN0JiBwbGFjZWhvbGRlciApIHsKKyAgICAgICAgICAgICAgICBtX2FyZy0+Ym91bmRGaWVsZCA9IG5ldyBEZXRhaWw6OkJvdW5kRGF0YU1lbWJlcjxDLE0+KCBmaWVsZCApOworICAgICAgICAgICAgICAgIG1fYXJnLT5wbGFjZWhvbGRlciA9IHBsYWNlaG9sZGVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gQmluZCBhIGJvb2xlYW4gZGF0YSBtZW1iZXIgKG5vIHBsYWNlaG9sZGVyIHJlcXVpcmVkKQorICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQz4KKyAgICAgICAgICAgIHZvaWQgYmluZCggYm9vbCBDOjoqIGZpZWxkICkgeworICAgICAgICAgICAgICAgIG1fYXJnLT5ib3VuZEZpZWxkID0gbmV3IERldGFpbDo6Qm91bmREYXRhTWVtYmVyPEMsYm9vbD4oIGZpZWxkICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEJpbmQgYSBtZXRob2QgdGFraW5nIGEgc2luZ2xlLCBub24tYm9vbGVhbiBhcmd1bWVudCAocmVxdWlyZXMgYSBwbGFjZWhvbGRlciBzdHJpbmcpCisgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDLCB0eXBlbmFtZSBNPgorICAgICAgICAgICAgdm9pZCBiaW5kKCB2b2lkIChDOjoqIHVuYXJ5TWV0aG9kKSggTSApLCBzdGQ6OnN0cmluZyBjb25zdCYgcGxhY2Vob2xkZXIgKSB7CisgICAgICAgICAgICAgICAgbV9hcmctPmJvdW5kRmllbGQgPSBuZXcgRGV0YWlsOjpCb3VuZFVuYXJ5TWV0aG9kPEMsTT4oIHVuYXJ5TWV0aG9kICk7CisgICAgICAgICAgICAgICAgbV9hcmctPnBsYWNlaG9sZGVyID0gcGxhY2Vob2xkZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEJpbmQgYSBtZXRob2QgdGFraW5nIGEgc2luZ2xlLCBib29sZWFuIGFyZ3VtZW50IChubyBwbGFjZWhvbGRlciBzdHJpbmcgcmVxdWlyZWQpCisgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDPgorICAgICAgICAgICAgdm9pZCBiaW5kKCB2b2lkIChDOjoqIHVuYXJ5TWV0aG9kKSggYm9vbCApICkgeworICAgICAgICAgICAgICAgIG1fYXJnLT5ib3VuZEZpZWxkID0gbmV3IERldGFpbDo6Qm91bmRVbmFyeU1ldGhvZDxDLGJvb2w+KCB1bmFyeU1ldGhvZCApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBCaW5kIGEgbWV0aG9kIHRoYXQgdGFrZXMgbm8gYXJndW1lbnRzICh3aWxsIGJlIGNhbGxlZCBpZiBvcHQgaXMgcHJlc2VudCkKKyAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEM+CisgICAgICAgICAgICB2b2lkIGJpbmQoIHZvaWQgKEM6OiogbnVsbGFyeU1ldGhvZCkoKSApIHsKKyAgICAgICAgICAgICAgICBtX2FyZy0+Ym91bmRGaWVsZCA9IG5ldyBEZXRhaWw6OkJvdW5kTnVsbGFyeU1ldGhvZDxDPiggbnVsbGFyeU1ldGhvZCApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBCaW5kIGEgZnJlZSBmdW5jdGlvbiB0YWtpbmcgYSBzaW5nbGUgYXJndW1lbnQgLSB0aGUgb2JqZWN0IHRvIG9wZXJhdGUgb24gKG5vIHBsYWNlaG9sZGVyIHN0cmluZyByZXF1aXJlZCkKKyAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEM+CisgICAgICAgICAgICB2b2lkIGJpbmQoIHZvaWQgKCogdW5hcnlGdW5jdGlvbikoIEMmICkgKSB7CisgICAgICAgICAgICAgICAgbV9hcmctPmJvdW5kRmllbGQgPSBuZXcgRGV0YWlsOjpCb3VuZFVuYXJ5RnVuY3Rpb248Qz4oIHVuYXJ5RnVuY3Rpb24gKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQmluZCBhIGZyZWUgZnVuY3Rpb24gdGFraW5nIGEgc2luZ2xlIGFyZ3VtZW50IC0gdGhlIG9iamVjdCB0byBvcGVyYXRlIG9uIChyZXF1aXJlcyBhIHBsYWNlaG9sZGVyIHN0cmluZykKKyAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEMsIHR5cGVuYW1lIFQ+CisgICAgICAgICAgICB2b2lkIGJpbmQoIHZvaWQgKCogYmluYXJ5RnVuY3Rpb24pKCBDJiwgVCApLCBzdGQ6OnN0cmluZyBjb25zdCYgcGxhY2Vob2xkZXIgKSB7CisgICAgICAgICAgICAgICAgbV9hcmctPmJvdW5kRmllbGQgPSBuZXcgRGV0YWlsOjpCb3VuZEJpbmFyeUZ1bmN0aW9uPEMsIFQ+KCBiaW5hcnlGdW5jdGlvbiApOworICAgICAgICAgICAgICAgIG1fYXJnLT5wbGFjZWhvbGRlciA9IHBsYWNlaG9sZGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBcmdCdWlsZGVyJiBkZXNjcmliZSggc3RkOjpzdHJpbmcgY29uc3QmIGRlc2NyaXB0aW9uICkgeworICAgICAgICAgICAgICAgIG1fYXJnLT5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworICAgICAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFyZ0J1aWxkZXImIGRldGFpbCggc3RkOjpzdHJpbmcgY29uc3QmIGRldGFpbCApIHsKKyAgICAgICAgICAgICAgICBtX2FyZy0+ZGV0YWlsID0gZGV0YWlsOworICAgICAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQ6CisgICAgICAgICAgICBBcmcqIG1fYXJnOworICAgICAgICB9OworCisgICAgICAgIGNsYXNzIE9wdEJ1aWxkZXIgOiBwdWJsaWMgQXJnQnVpbGRlciB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIE9wdEJ1aWxkZXIoIEFyZyogYXJnICkgOiBBcmdCdWlsZGVyKCBhcmcgKSB7fQorICAgICAgICAgICAgT3B0QnVpbGRlciggT3B0QnVpbGRlciYgb3RoZXIgKSA6IEFyZ0J1aWxkZXIoIG90aGVyICkge30KKworICAgICAgICAgICAgT3B0QnVpbGRlciYgb3BlcmF0b3JbXSggc3RkOjpzdHJpbmcgY29uc3QmIG9wdE5hbWUgKSB7CisgICAgICAgICAgICAgICAgYWRkT3B0TmFtZSggKkFyZ0J1aWxkZXI6Om1fYXJnLCBvcHROYW1lICk7CisgICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgcHVibGljOgorCisgICAgICAgIENvbW1hbmRMaW5lKCkKKyAgICAgICAgOiAgIG1fYm91bmRQcm9jZXNzTmFtZSggbmV3IERldGFpbDo6TnVsbEJpbmRlcjxDb25maWdUPigpICksCisgICAgICAgICAgICBtX2hpZ2hlc3RTcGVjaWZpZWRBcmdQb3NpdGlvbiggMCApLAorICAgICAgICAgICAgbV90aHJvd09uVW5yZWNvZ25pc2VkVG9rZW5zKCBmYWxzZSApCisgICAgICAgIHt9CisgICAgICAgIENvbW1hbmRMaW5lKCBDb21tYW5kTGluZSBjb25zdCYgb3RoZXIgKQorICAgICAgICA6ICAgbV9ib3VuZFByb2Nlc3NOYW1lKCBvdGhlci5tX2JvdW5kUHJvY2Vzc05hbWUgKSwKKyAgICAgICAgICAgIG1fb3B0aW9ucyAoIG90aGVyLm1fb3B0aW9ucyApLAorICAgICAgICAgICAgbV9wb3NpdGlvbmFsQXJncyggb3RoZXIubV9wb3NpdGlvbmFsQXJncyApLAorICAgICAgICAgICAgbV9oaWdoZXN0U3BlY2lmaWVkQXJnUG9zaXRpb24oIG90aGVyLm1faGlnaGVzdFNwZWNpZmllZEFyZ1Bvc2l0aW9uICksCisgICAgICAgICAgICBtX3Rocm93T25VbnJlY29nbmlzZWRUb2tlbnMoIG90aGVyLm1fdGhyb3dPblVucmVjb2duaXNlZFRva2VucyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBvdGhlci5tX2Zsb2F0aW5nQXJnLmdldCgpICkKKyAgICAgICAgICAgICAgICBtX2Zsb2F0aW5nQXJnLnJlc2V0KCBuZXcgQXJnKCAqb3RoZXIubV9mbG9hdGluZ0FyZyApICk7CisgICAgICAgIH0KKworICAgICAgICBDb21tYW5kTGluZSYgc2V0VGhyb3dPblVucmVjb2duaXNlZFRva2VucyggYm9vbCBzaG91bGRUaHJvdyA9IHRydWUgKSB7CisgICAgICAgICAgICBtX3Rocm93T25VbnJlY29nbmlzZWRUb2tlbnMgPSBzaG91bGRUaHJvdzsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIE9wdEJ1aWxkZXIgb3BlcmF0b3JbXSggc3RkOjpzdHJpbmcgY29uc3QmIG9wdE5hbWUgKSB7CisgICAgICAgICAgICBtX29wdGlvbnMucHVzaF9iYWNrKCBBcmcoKSApOworICAgICAgICAgICAgYWRkT3B0TmFtZSggbV9vcHRpb25zLmJhY2soKSwgb3B0TmFtZSApOworICAgICAgICAgICAgT3B0QnVpbGRlciBidWlsZGVyKCAmbV9vcHRpb25zLmJhY2soKSApOworICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXI7CisgICAgICAgIH0KKworICAgICAgICBBcmdCdWlsZGVyIG9wZXJhdG9yW10oIGludCBwb3NpdGlvbiApIHsKKyAgICAgICAgICAgIG1fcG9zaXRpb25hbEFyZ3MuaW5zZXJ0KCBzdGQ6Om1ha2VfcGFpciggcG9zaXRpb24sIEFyZygpICkgKTsKKyAgICAgICAgICAgIGlmKCBwb3NpdGlvbiA+IG1faGlnaGVzdFNwZWNpZmllZEFyZ1Bvc2l0aW9uICkKKyAgICAgICAgICAgICAgICBtX2hpZ2hlc3RTcGVjaWZpZWRBcmdQb3NpdGlvbiA9IHBvc2l0aW9uOworICAgICAgICAgICAgc2V0UG9zaXRpb25hbEFyZyggbV9wb3NpdGlvbmFsQXJnc1twb3NpdGlvbl0sIHBvc2l0aW9uICk7CisgICAgICAgICAgICBBcmdCdWlsZGVyIGJ1aWxkZXIoICZtX3Bvc2l0aW9uYWxBcmdzW3Bvc2l0aW9uXSApOworICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXI7CisgICAgICAgIH0KKworICAgICAgICAvLyBJbnZva2UgdGhpcyB3aXRoIHRoZSBfIGluc3RhbmNlCisgICAgICAgIEFyZ0J1aWxkZXIgb3BlcmF0b3JbXSggVW5wb3NpdGlvbmFsVGFnICkgeworICAgICAgICAgICAgaWYoIG1fZmxvYXRpbmdBcmcuZ2V0KCkgKQorICAgICAgICAgICAgICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoICJPbmx5IG9uZSB1bnBvc2l0aW9uYWwgYXJndW1lbnQgY2FuIGJlIGFkZGVkIiApOworICAgICAgICAgICAgbV9mbG9hdGluZ0FyZy5yZXNldCggbmV3IEFyZygpICk7CisgICAgICAgICAgICBBcmdCdWlsZGVyIGJ1aWxkZXIoIG1fZmxvYXRpbmdBcmcuZ2V0KCkgKTsKKyAgICAgICAgICAgIHJldHVybiBidWlsZGVyOworICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQywgdHlwZW5hbWUgTT4KKyAgICAgICAgdm9pZCBiaW5kUHJvY2Vzc05hbWUoIE0gQzo6KiBmaWVsZCApIHsKKyAgICAgICAgICAgIG1fYm91bmRQcm9jZXNzTmFtZSA9IG5ldyBEZXRhaWw6OkJvdW5kRGF0YU1lbWJlcjxDLE0+KCBmaWVsZCApOworICAgICAgICB9CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEMsIHR5cGVuYW1lIE0+CisgICAgICAgIHZvaWQgYmluZFByb2Nlc3NOYW1lKCB2b2lkIChDOjoqX3VuYXJ5TWV0aG9kKSggTSApICkgeworICAgICAgICAgICAgbV9ib3VuZFByb2Nlc3NOYW1lID0gbmV3IERldGFpbDo6Qm91bmRVbmFyeU1ldGhvZDxDLE0+KCBfdW5hcnlNZXRob2QgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgb3B0VXNhZ2UoIHN0ZDo6b3N0cmVhbSYgb3MsIHN0ZDo6c2l6ZV90IGluZGVudCA9IDAsIHN0ZDo6c2l6ZV90IHdpZHRoID0gRGV0YWlsOjpjb25zb2xlV2lkdGggKSBjb25zdCB7CisgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OnZlY3RvcjxBcmc+Ojpjb25zdF9pdGVyYXRvciBpdEJlZ2luID0gbV9vcHRpb25zLmJlZ2luKCksIGl0RW5kID0gbV9vcHRpb25zLmVuZCgpLCBpdDsKKyAgICAgICAgICAgIHN0ZDo6c2l6ZV90IG1heFdpZHRoID0gMDsKKyAgICAgICAgICAgIGZvciggaXQgPSBpdEJlZ2luOyBpdCAhPSBpdEVuZDsgKytpdCApCisgICAgICAgICAgICAgICAgbWF4V2lkdGggPSAoc3RkOjptYXgpKCBtYXhXaWR0aCwgaXQtPmNvbW1hbmRzKCkuc2l6ZSgpICk7CisKKyAgICAgICAgICAgIGZvciggaXQgPSBpdEJlZ2luOyBpdCAhPSBpdEVuZDsgKytpdCApIHsKKyAgICAgICAgICAgICAgICBEZXRhaWw6OlRleHQgdXNhZ2UoIGl0LT5jb21tYW5kcygpLCBEZXRhaWw6OlRleHRBdHRyaWJ1dGVzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFdpZHRoKCBtYXhXaWR0aCtpbmRlbnQgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0SW5kZW50KCBpbmRlbnQgKSApOworICAgICAgICAgICAgICAgIERldGFpbDo6VGV4dCBkZXNjKCBpdC0+ZGVzY3JpcHRpb24sIERldGFpbDo6VGV4dEF0dHJpYnV0ZXMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0V2lkdGgoIHdpZHRoIC0gbWF4V2lkdGggLSAzICkgKTsKKworICAgICAgICAgICAgICAgIGZvciggc3RkOjpzaXplX3QgaSA9IDA7IGkgPCAoc3RkOjptYXgpKCB1c2FnZS5zaXplKCksIGRlc2Muc2l6ZSgpICk7ICsraSApIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdXNhZ2VDb2wgPSBpIDwgdXNhZ2Uuc2l6ZSgpID8gdXNhZ2VbaV0gOiAiIjsKKyAgICAgICAgICAgICAgICAgICAgb3MgPDwgdXNhZ2VDb2w7CisKKyAgICAgICAgICAgICAgICAgICAgaWYoIGkgPCBkZXNjLnNpemUoKSAmJiAhZGVzY1tpXS5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICAgICAgICAgIG9zICA8PCBzdGQ6OnN0cmluZyggaW5kZW50ICsgMiArIG1heFdpZHRoIC0gdXNhZ2VDb2wuc2l6ZSgpLCAnICcgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGRlc2NbaV07CisgICAgICAgICAgICAgICAgICAgIG9zIDw8ICJcbiI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN0ZDo6c3RyaW5nIG9wdFVzYWdlKCkgY29uc3QgeworICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgIG9wdFVzYWdlKCBvc3MgKTsKKyAgICAgICAgICAgIHJldHVybiBvc3Muc3RyKCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGFyZ1N5bm9wc2lzKCBzdGQ6Om9zdHJlYW0mIG9zICkgY29uc3QgeworICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDE7IGkgPD0gbV9oaWdoZXN0U3BlY2lmaWVkQXJnUG9zaXRpb247ICsraSApIHsKKyAgICAgICAgICAgICAgICBpZiggaSA+IDEgKQorICAgICAgICAgICAgICAgICAgICBvcyA8PCAiICI7CisgICAgICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjptYXA8aW50LCBBcmc+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fcG9zaXRpb25hbEFyZ3MuZmluZCggaSApOworICAgICAgICAgICAgICAgIGlmKCBpdCAhPSBtX3Bvc2l0aW9uYWxBcmdzLmVuZCgpICkKKyAgICAgICAgICAgICAgICAgICAgb3MgPDwgIjwiIDw8IGl0LT5zZWNvbmQucGxhY2Vob2xkZXIgPDwgIj4iOworICAgICAgICAgICAgICAgIGVsc2UgaWYoIG1fZmxvYXRpbmdBcmcuZ2V0KCkgKQorICAgICAgICAgICAgICAgICAgICBvcyA8PCAiPCIgPDwgbV9mbG9hdGluZ0FyZy0+cGxhY2Vob2xkZXIgPDwgIj4iOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3RkOjpsb2dpY19lcnJvciggIm5vbiBjb25zZWN1dGl2ZSBwb3NpdGlvbmFsIGFyZ3VtZW50cyB3aXRoIG5vIGZsb2F0aW5nIGFyZ3MiICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAhVEJEIE5vIGluZGljYXRpb24gb2YgbWFuZGF0b3J5IGFyZ3MKKyAgICAgICAgICAgIGlmKCBtX2Zsb2F0aW5nQXJnLmdldCgpICkgeworICAgICAgICAgICAgICAgIGlmKCBtX2hpZ2hlc3RTcGVjaWZpZWRBcmdQb3NpdGlvbiA+IDEgKQorICAgICAgICAgICAgICAgICAgICBvcyA8PCAiICI7CisgICAgICAgICAgICAgICAgb3MgPDwgIls8IiA8PCBtX2Zsb2F0aW5nQXJnLT5wbGFjZWhvbGRlciA8PCAiPiAuLi5dIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdGQ6OnN0cmluZyBhcmdTeW5vcHNpcygpIGNvbnN0IHsKKyAgICAgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgICAgICBhcmdTeW5vcHNpcyggb3NzICk7CisgICAgICAgICAgICByZXR1cm4gb3NzLnN0cigpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB1c2FnZSggc3RkOjpvc3RyZWFtJiBvcywgc3RkOjpzdHJpbmcgY29uc3QmIHByb2NOYW1lICkgY29uc3QgeworICAgICAgICAgICAgdmFsaWRhdGUoKTsKKyAgICAgICAgICAgIG9zIDw8ICJ1c2FnZTpcbiAgIiA8PCBwcm9jTmFtZSA8PCAiICI7CisgICAgICAgICAgICBhcmdTeW5vcHNpcyggb3MgKTsKKyAgICAgICAgICAgIGlmKCAhbV9vcHRpb25zLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAgICAgb3MgPDwgIiBbb3B0aW9uc11cblxud2hlcmUgb3B0aW9ucyBhcmU6IFxuIjsKKyAgICAgICAgICAgICAgICBvcHRVc2FnZSggb3MsIDIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9zIDw8ICJcbiI7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpzdHJpbmcgdXNhZ2UoIHN0ZDo6c3RyaW5nIGNvbnN0JiBwcm9jTmFtZSApIGNvbnN0IHsKKyAgICAgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgICAgICB1c2FnZSggb3NzLCBwcm9jTmFtZSApOworICAgICAgICAgICAgcmV0dXJuIG9zcy5zdHIoKTsKKyAgICAgICAgfQorCisgICAgICAgIENvbmZpZ1QgcGFyc2UoIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjb25zdCYgYXJncyApIGNvbnN0IHsKKyAgICAgICAgICAgIENvbmZpZ1QgY29uZmlnOworICAgICAgICAgICAgcGFyc2VJbnRvKCBhcmdzLCBjb25maWcgKTsKKyAgICAgICAgICAgIHJldHVybiBjb25maWc7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnZlY3RvcjxQYXJzZXI6OlRva2VuPiBwYXJzZUludG8oIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjb25zdCYgYXJncywgQ29uZmlnVCYgY29uZmlnICkgY29uc3QgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJvY2Vzc05hbWUgPSBhcmdzLmVtcHR5KCkgPyBzdGQ6OnN0cmluZygpIDogYXJnc1swXTsKKyAgICAgICAgICAgIHN0ZDo6c2l6ZV90IGxhc3RTbGFzaCA9IHByb2Nlc3NOYW1lLmZpbmRfbGFzdF9vZiggIi9cXCIgKTsKKyAgICAgICAgICAgIGlmKCBsYXN0U2xhc2ggIT0gc3RkOjpzdHJpbmc6Om5wb3MgKQorICAgICAgICAgICAgICAgIHByb2Nlc3NOYW1lID0gcHJvY2Vzc05hbWUuc3Vic3RyKCBsYXN0U2xhc2grMSApOworICAgICAgICAgICAgbV9ib3VuZFByb2Nlc3NOYW1lLnNldCggY29uZmlnLCBwcm9jZXNzTmFtZSApOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8UGFyc2VyOjpUb2tlbj4gdG9rZW5zOworICAgICAgICAgICAgUGFyc2VyIHBhcnNlcjsKKyAgICAgICAgICAgIHBhcnNlci5wYXJzZUludG9Ub2tlbnMoIGFyZ3MsIHRva2VucyApOworICAgICAgICAgICAgcmV0dXJuIHBvcHVsYXRlKCB0b2tlbnMsIGNvbmZpZyApOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8UGFyc2VyOjpUb2tlbj4gcG9wdWxhdGUoIHN0ZDo6dmVjdG9yPFBhcnNlcjo6VG9rZW4+IGNvbnN0JiB0b2tlbnMsIENvbmZpZ1QmIGNvbmZpZyApIGNvbnN0IHsKKyAgICAgICAgICAgIHZhbGlkYXRlKCk7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxQYXJzZXI6OlRva2VuPiB1bnVzZWRUb2tlbnMgPSBwb3B1bGF0ZU9wdGlvbnMoIHRva2VucywgY29uZmlnICk7CisgICAgICAgICAgICB1bnVzZWRUb2tlbnMgPSBwb3B1bGF0ZUZpeGVkQXJncyggdW51c2VkVG9rZW5zLCBjb25maWcgKTsKKyAgICAgICAgICAgIHVudXNlZFRva2VucyA9IHBvcHVsYXRlRmxvYXRpbmdBcmdzKCB1bnVzZWRUb2tlbnMsIGNvbmZpZyApOworICAgICAgICAgICAgcmV0dXJuIHVudXNlZFRva2VuczsKKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6dmVjdG9yPFBhcnNlcjo6VG9rZW4+IHBvcHVsYXRlT3B0aW9ucyggc3RkOjp2ZWN0b3I8UGFyc2VyOjpUb2tlbj4gY29uc3QmIHRva2VucywgQ29uZmlnVCYgY29uZmlnICkgY29uc3QgeworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8UGFyc2VyOjpUb2tlbj4gdW51c2VkVG9rZW5zOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGVycm9yczsKKyAgICAgICAgICAgIGZvciggc3RkOjpzaXplX3QgaSA9IDA7IGkgPCB0b2tlbnMuc2l6ZSgpOyArK2kgKSB7CisgICAgICAgICAgICAgICAgUGFyc2VyOjpUb2tlbiBjb25zdCYgdG9rZW4gPSB0b2tlbnNbaV07CisgICAgICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjp2ZWN0b3I8QXJnPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX29wdGlvbnMuYmVnaW4oKSwgaXRFbmQgPSBtX29wdGlvbnMuZW5kKCk7CisgICAgICAgICAgICAgICAgZm9yKDsgaXQgIT0gaXRFbmQ7ICsraXQgKSB7CisgICAgICAgICAgICAgICAgICAgIEFyZyBjb25zdCYgYXJnID0gKml0OworCisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggKCB0b2tlbi50eXBlID09IFBhcnNlcjo6VG9rZW46OlNob3J0T3B0ICYmIGFyZy5oYXNTaG9ydE5hbWUoIHRva2VuLmRhdGEgKSApIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCB0b2tlbi50eXBlID09IFBhcnNlcjo6VG9rZW46OkxvbmdPcHQgJiYgYXJnLmhhc0xvbmdOYW1lKCB0b2tlbi5kYXRhICkgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggYXJnLnRha2VzQXJnKCkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBpID09IHRva2Vucy5zaXplKCktMSB8fCB0b2tlbnNbaSsxXS50eXBlICE9IFBhcnNlcjo6VG9rZW46OlBvc2l0aW9uYWwgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2hfYmFjayggIkV4cGVjdGVkIGFyZ3VtZW50IHRvIG9wdGlvbjogIiArIHRva2VuLmRhdGEgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnLmJvdW5kRmllbGQuc2V0KCBjb25maWcsIHRva2Vuc1srK2ldLmRhdGEgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZy5ib3VuZEZpZWxkLnNldCggY29uZmlnLCAidHJ1ZSIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2goIHN0ZDo6ZXhjZXB0aW9uJiBleCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoX2JhY2soIHN0ZDo6c3RyaW5nKCBleC53aGF0KCkgKSArICJcbi0gd2hpbGUgcGFyc2luZzogKCIgKyBhcmcuY29tbWFuZHMoKSArICIpIiApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKCBpdCA9PSBpdEVuZCApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHRva2VuLnR5cGUgPT0gUGFyc2VyOjpUb2tlbjo6UG9zaXRpb25hbCB8fCAhbV90aHJvd09uVW5yZWNvZ25pc2VkVG9rZW5zICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHVudXNlZFRva2Vucy5wdXNoX2JhY2soIHRva2VuICk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIGVycm9ycy5lbXB0eSgpICYmIG1fdGhyb3dPblVucmVjb2duaXNlZFRva2VucyApCisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaF9iYWNrKCAidW5yZWNvZ25pc2VkIG9wdGlvbjogIiArIHRva2VuLmRhdGEgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggIWVycm9ycy5lbXB0eSgpICkgeworICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgICAgICAgICAgZm9yKCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gZXJyb3JzLmJlZ2luKCksIGl0RW5kID0gZXJyb3JzLmVuZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICArK2l0ICkgeworICAgICAgICAgICAgICAgICAgICBpZiggaXQgIT0gZXJyb3JzLmJlZ2luKCkgKQorICAgICAgICAgICAgICAgICAgICAgICAgb3NzIDw8ICJcbiI7CisgICAgICAgICAgICAgICAgICAgIG9zcyA8PCAqaXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvciggb3NzLnN0cigpICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdW51c2VkVG9rZW5zOworICAgICAgICB9CisgICAgICAgIHN0ZDo6dmVjdG9yPFBhcnNlcjo6VG9rZW4+IHBvcHVsYXRlRml4ZWRBcmdzKCBzdGQ6OnZlY3RvcjxQYXJzZXI6OlRva2VuPiBjb25zdCYgdG9rZW5zLCBDb25maWdUJiBjb25maWcgKSBjb25zdCB7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxQYXJzZXI6OlRva2VuPiB1bnVzZWRUb2tlbnM7CisgICAgICAgICAgICBpbnQgcG9zaXRpb24gPSAxOworICAgICAgICAgICAgZm9yKCBzdGQ6OnNpemVfdCBpID0gMDsgaSA8IHRva2Vucy5zaXplKCk7ICsraSApIHsKKyAgICAgICAgICAgICAgICBQYXJzZXI6OlRva2VuIGNvbnN0JiB0b2tlbiA9IHRva2Vuc1tpXTsKKyAgICAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6Om1hcDxpbnQsIEFyZz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9wb3NpdGlvbmFsQXJncy5maW5kKCBwb3NpdGlvbiApOworICAgICAgICAgICAgICAgIGlmKCBpdCAhPSBtX3Bvc2l0aW9uYWxBcmdzLmVuZCgpICkKKyAgICAgICAgICAgICAgICAgICAgaXQtPnNlY29uZC5ib3VuZEZpZWxkLnNldCggY29uZmlnLCB0b2tlbi5kYXRhICk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB1bnVzZWRUb2tlbnMucHVzaF9iYWNrKCB0b2tlbiApOworICAgICAgICAgICAgICAgIGlmKCB0b2tlbi50eXBlID09IFBhcnNlcjo6VG9rZW46OlBvc2l0aW9uYWwgKQorICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbisrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHVudXNlZFRva2VuczsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnZlY3RvcjxQYXJzZXI6OlRva2VuPiBwb3B1bGF0ZUZsb2F0aW5nQXJncyggc3RkOjp2ZWN0b3I8UGFyc2VyOjpUb2tlbj4gY29uc3QmIHRva2VucywgQ29uZmlnVCYgY29uZmlnICkgY29uc3QgeworICAgICAgICAgICAgaWYoICFtX2Zsb2F0aW5nQXJnLmdldCgpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5zOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8UGFyc2VyOjpUb2tlbj4gdW51c2VkVG9rZW5zOworICAgICAgICAgICAgZm9yKCBzdGQ6OnNpemVfdCBpID0gMDsgaSA8IHRva2Vucy5zaXplKCk7ICsraSApIHsKKyAgICAgICAgICAgICAgICBQYXJzZXI6OlRva2VuIGNvbnN0JiB0b2tlbiA9IHRva2Vuc1tpXTsKKyAgICAgICAgICAgICAgICBpZiggdG9rZW4udHlwZSA9PSBQYXJzZXI6OlRva2VuOjpQb3NpdGlvbmFsICkKKyAgICAgICAgICAgICAgICAgICAgbV9mbG9hdGluZ0FyZy0+Ym91bmRGaWVsZC5zZXQoIGNvbmZpZywgdG9rZW4uZGF0YSApOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdW51c2VkVG9rZW5zLnB1c2hfYmFjayggdG9rZW4gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB1bnVzZWRUb2tlbnM7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHZhbGlkYXRlKCkgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIG1fb3B0aW9ucy5lbXB0eSgpICYmIG1fcG9zaXRpb25hbEFyZ3MuZW1wdHkoKSAmJiAhbV9mbG9hdGluZ0FyZy5nZXQoKSApCisgICAgICAgICAgICAgICAgdGhyb3cgc3RkOjpsb2dpY19lcnJvciggIk5vIG9wdGlvbnMgb3IgYXJndW1lbnRzIHNwZWNpZmllZCIgKTsKKworICAgICAgICAgICAgZm9yKCB0eXBlbmFtZSBzdGQ6OnZlY3RvcjxBcmc+Ojpjb25zdF9pdGVyYXRvciAgaXQgPSBtX29wdGlvbnMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0RW5kID0gbV9vcHRpb25zLmVuZCgpOworICAgICAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsgKytpdCApCisgICAgICAgICAgICAgICAgaXQtPnZhbGlkYXRlKCk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIERldGFpbDo6Qm91bmRBcmdGdW5jdGlvbjxDb25maWdUPiBtX2JvdW5kUHJvY2Vzc05hbWU7CisgICAgICAgIHN0ZDo6dmVjdG9yPEFyZz4gbV9vcHRpb25zOworICAgICAgICBzdGQ6Om1hcDxpbnQsIEFyZz4gbV9wb3NpdGlvbmFsQXJnczsKKyAgICAgICAgQXJnQXV0b1B0ciBtX2Zsb2F0aW5nQXJnOworICAgICAgICBpbnQgbV9oaWdoZXN0U3BlY2lmaWVkQXJnUG9zaXRpb247CisgICAgICAgIGJvb2wgbV90aHJvd09uVW5yZWNvZ25pc2VkVG9rZW5zOworICAgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDbGFyYQorCitTVElUQ0hfQ0xBUkFfQ0xPU0VfTkFNRVNQQUNFCisjdW5kZWYgU1RJVENIX0NMQVJBX09QRU5fTkFNRVNQQUNFCisjdW5kZWYgU1RJVENIX0NMQVJBX0NMT1NFX05BTUVTUEFDRQorCisjZW5kaWYgLy8gVFdPQkxVRUNVQkVTX0NMQVJBX0hfSU5DTFVERUQKKyN1bmRlZiBTVElUQ0hfQ0xBUkFfT1BFTl9OQU1FU1BBQ0UKKworLy8gUmVzdG9yZSBDbGFyYSdzIHZhbHVlIGZvciBjb25zb2xlIHdpZHRoLCBpZiBwcmVzZW50CisjaWZkZWYgQ0FUQ0hfVEVNUF9DTEFSQV9DT05GSUdfQ09OU09MRV9XSURUSAorI2RlZmluZSBDTEFSQV9DT05GSUdfQ09OU09MRV9XSURUSCBDQVRDSF9URU1QX0NMQVJBX0NPTkZJR19DT05TT0xFX1dJRFRICisjdW5kZWYgQ0FUQ0hfVEVNUF9DTEFSQV9DT05GSUdfQ09OU09MRV9XSURUSAorI2VuZGlmCisKKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGN0aW1lPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgaW5saW5lIHZvaWQgYWJvcnRBZnRlckZpcnN0KCBDb25maWdEYXRhJiBjb25maWcgKSB7IGNvbmZpZy5hYm9ydEFmdGVyID0gMTsgfQorICAgIGlubGluZSB2b2lkIGFib3J0QWZ0ZXJYKCBDb25maWdEYXRhJiBjb25maWcsIGludCB4ICkgeworICAgICAgICBpZiggeCA8IDEgKQorICAgICAgICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCAiVmFsdWUgYWZ0ZXIgLXggb3IgLS1hYm9ydEFmdGVyIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8iICk7CisgICAgICAgIGNvbmZpZy5hYm9ydEFmdGVyID0geDsKKyAgICB9CisgICAgaW5saW5lIHZvaWQgYWRkVGVzdE9yVGFncyggQ29uZmlnRGF0YSYgY29uZmlnLCBzdGQ6OnN0cmluZyBjb25zdCYgX3Rlc3RTcGVjICkgeyBjb25maWcudGVzdHNPclRhZ3MucHVzaF9iYWNrKCBfdGVzdFNwZWMgKTsgfQorICAgIGlubGluZSB2b2lkIGFkZFNlY3Rpb25Ub1J1biggQ29uZmlnRGF0YSYgY29uZmlnLCBzdGQ6OnN0cmluZyBjb25zdCYgc2VjdGlvbk5hbWUgKSB7IGNvbmZpZy5zZWN0aW9uc1RvUnVuLnB1c2hfYmFjayggc2VjdGlvbk5hbWUgKTsgfQorICAgIGlubGluZSB2b2lkIGFkZFJlcG9ydGVyTmFtZSggQ29uZmlnRGF0YSYgY29uZmlnLCBzdGQ6OnN0cmluZyBjb25zdCYgX3JlcG9ydGVyTmFtZSApIHsgY29uZmlnLnJlcG9ydGVyTmFtZXMucHVzaF9iYWNrKCBfcmVwb3J0ZXJOYW1lICk7IH0KKworICAgIGlubGluZSB2b2lkIGFkZFdhcm5pbmcoIENvbmZpZ0RhdGEmIGNvbmZpZywgc3RkOjpzdHJpbmcgY29uc3QmIF93YXJuaW5nICkgeworICAgICAgICBpZiggX3dhcm5pbmcgPT0gIk5vQXNzZXJ0aW9ucyIgKQorICAgICAgICAgICAgY29uZmlnLndhcm5pbmdzID0gc3RhdGljX2Nhc3Q8V2FybkFib3V0OjpXaGF0PiggY29uZmlnLndhcm5pbmdzIHwgV2FybkFib3V0OjpOb0Fzc2VydGlvbnMgKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCAiVW5yZWNvZ25pc2VkIHdhcm5pbmc6ICciICsgX3dhcm5pbmcgKyAnXCcnICk7CisgICAgfQorICAgIGlubGluZSB2b2lkIHNldE9yZGVyKCBDb25maWdEYXRhJiBjb25maWcsIHN0ZDo6c3RyaW5nIGNvbnN0JiBvcmRlciApIHsKKyAgICAgICAgaWYoIHN0YXJ0c1dpdGgoICJkZWNsYXJlZCIsIG9yZGVyICkgKQorICAgICAgICAgICAgY29uZmlnLnJ1bk9yZGVyID0gUnVuVGVzdHM6OkluRGVjbGFyYXRpb25PcmRlcjsKKyAgICAgICAgZWxzZSBpZiggc3RhcnRzV2l0aCggImxleGljYWwiLCBvcmRlciApICkKKyAgICAgICAgICAgIGNvbmZpZy5ydW5PcmRlciA9IFJ1blRlc3RzOjpJbkxleGljb2dyYXBoaWNhbE9yZGVyOworICAgICAgICBlbHNlIGlmKCBzdGFydHNXaXRoKCAicmFuZG9tIiwgb3JkZXIgKSApCisgICAgICAgICAgICBjb25maWcucnVuT3JkZXIgPSBSdW5UZXN0czo6SW5SYW5kb21PcmRlcjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCAiVW5yZWNvZ25pc2VkIG9yZGVyaW5nOiAnIiArIG9yZGVyICsgJ1wnJyApOworICAgIH0KKyAgICBpbmxpbmUgdm9pZCBzZXRSbmdTZWVkKCBDb25maWdEYXRhJiBjb25maWcsIHN0ZDo6c3RyaW5nIGNvbnN0JiBzZWVkICkgeworICAgICAgICBpZiggc2VlZCA9PSAidGltZSIgKSB7CisgICAgICAgICAgICBjb25maWcucm5nU2VlZCA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oIHN0ZDo6dGltZSgwKSApOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgICAgICAgICBzcyA8PCBzZWVkOworICAgICAgICAgICAgc3MgPj4gY29uZmlnLnJuZ1NlZWQ7CisgICAgICAgICAgICBpZiggc3MuZmFpbCgpICkKKyAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoICJBcmd1bWVudCB0byAtLXJuZy1zZWVkIHNob3VsZCBiZSB0aGUgd29yZCAndGltZScgb3IgYSBudW1iZXIiICk7CisgICAgICAgIH0KKyAgICB9CisgICAgaW5saW5lIHZvaWQgc2V0VmVyYm9zaXR5KCBDb25maWdEYXRhJiBjb25maWcsIGludCBsZXZlbCApIHsKKyAgICAgICAgLy8gIVRCRDogYWNjZXB0IHN0cmluZ3M/CisgICAgICAgIGNvbmZpZy52ZXJib3NpdHkgPSBzdGF0aWNfY2FzdDxWZXJib3NpdHk6OkxldmVsPiggbGV2ZWwgKTsKKyAgICB9CisgICAgaW5saW5lIHZvaWQgc2V0U2hvd0R1cmF0aW9ucyggQ29uZmlnRGF0YSYgY29uZmlnLCBib29sIF9zaG93RHVyYXRpb25zICkgeworICAgICAgICBjb25maWcuc2hvd0R1cmF0aW9ucyA9IF9zaG93RHVyYXRpb25zCisgICAgICAgICAgICA/IFNob3dEdXJhdGlvbnM6OkFsd2F5cworICAgICAgICAgICAgOiBTaG93RHVyYXRpb25zOjpOZXZlcjsKKyAgICB9CisgICAgaW5saW5lIHZvaWQgc2V0VXNlQ29sb3VyKCBDb25maWdEYXRhJiBjb25maWcsIHN0ZDo6c3RyaW5nIGNvbnN0JiB2YWx1ZSApIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgbW9kZSA9IHRvTG93ZXIoIHZhbHVlICk7CisKKyAgICAgICAgaWYoIG1vZGUgPT0gInllcyIgKQorICAgICAgICAgICAgY29uZmlnLnVzZUNvbG91ciA9IFVzZUNvbG91cjo6WWVzOworICAgICAgICBlbHNlIGlmKCBtb2RlID09ICJubyIgKQorICAgICAgICAgICAgY29uZmlnLnVzZUNvbG91ciA9IFVzZUNvbG91cjo6Tm87CisgICAgICAgIGVsc2UgaWYoIG1vZGUgPT0gImF1dG8iICkKKyAgICAgICAgICAgIGNvbmZpZy51c2VDb2xvdXIgPSBVc2VDb2xvdXI6OkF1dG87CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvciggImNvbG91ciBtb2RlIG11c3QgYmUgb25lIG9mOiBhdXRvLCB5ZXMgb3Igbm8iICk7CisgICAgfQorICAgIGlubGluZSB2b2lkIGZvcmNlQ29sb3VyKCBDb25maWdEYXRhJiBjb25maWcgKSB7CisgICAgICAgIGNvbmZpZy51c2VDb2xvdXIgPSBVc2VDb2xvdXI6OlllczsKKyAgICB9CisgICAgaW5saW5lIHZvaWQgbG9hZFRlc3ROYW1lc0Zyb21GaWxlKCBDb25maWdEYXRhJiBjb25maWcsIHN0ZDo6c3RyaW5nIGNvbnN0JiBfZmlsZW5hbWUgKSB7CisgICAgICAgIHN0ZDo6aWZzdHJlYW0gZiggX2ZpbGVuYW1lLmNfc3RyKCkgKTsKKyAgICAgICAgaWYoICFmLmlzX29wZW4oKSApCisgICAgICAgICAgICB0aHJvdyBzdGQ6OmRvbWFpbl9lcnJvciggIlVuYWJsZSB0byBsb2FkIGlucHV0IGZpbGU6ICIgKyBfZmlsZW5hbWUgKTsKKworICAgICAgICBzdGQ6OnN0cmluZyBsaW5lOworICAgICAgICB3aGlsZSggc3RkOjpnZXRsaW5lKCBmLCBsaW5lICkgKSB7CisgICAgICAgICAgICBsaW5lID0gdHJpbShsaW5lKTsKKyAgICAgICAgICAgIGlmKCAhbGluZS5lbXB0eSgpICYmICFzdGFydHNXaXRoKCBsaW5lLCAnIycgKSApIHsKKyAgICAgICAgICAgICAgICBpZiggIXN0YXJ0c1dpdGgoIGxpbmUsICciJyApICkKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9ICciJyArIGxpbmUgKyAnIic7CisgICAgICAgICAgICAgICAgYWRkVGVzdE9yVGFncyggY29uZmlnLCBsaW5lICsgJywnICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbmxpbmUgQ2xhcmE6OkNvbW1hbmRMaW5lPENvbmZpZ0RhdGE+IG1ha2VDb21tYW5kTGluZVBhcnNlcigpIHsKKworICAgICAgICB1c2luZyBuYW1lc3BhY2UgQ2xhcmE7CisgICAgICAgIENvbW1hbmRMaW5lPENvbmZpZ0RhdGE+IGNsaTsKKworICAgICAgICBjbGkuYmluZFByb2Nlc3NOYW1lKCAmQ29uZmlnRGF0YTo6cHJvY2Vzc05hbWUgKTsKKworICAgICAgICBjbGlbIi0/Il1bIi1oIl1bIi0taGVscCJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJkaXNwbGF5IHVzYWdlIGluZm9ybWF0aW9uIiApCisgICAgICAgICAgICAuYmluZCggJkNvbmZpZ0RhdGE6OnNob3dIZWxwICk7CisKKyAgICAgICAgY2xpWyItbCJdWyItLWxpc3QtdGVzdHMiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAibGlzdCBhbGwvbWF0Y2hpbmcgdGVzdCBjYXNlcyIgKQorICAgICAgICAgICAgLmJpbmQoICZDb25maWdEYXRhOjpsaXN0VGVzdHMgKTsKKworICAgICAgICBjbGlbIi10Il1bIi0tbGlzdC10YWdzIl0KKyAgICAgICAgICAgIC5kZXNjcmliZSggImxpc3QgYWxsL21hdGNoaW5nIHRhZ3MiICkKKyAgICAgICAgICAgIC5iaW5kKCAmQ29uZmlnRGF0YTo6bGlzdFRhZ3MgKTsKKworICAgICAgICBjbGlbIi1zIl1bIi0tc3VjY2VzcyJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJpbmNsdWRlIHN1Y2Nlc3NmdWwgdGVzdHMgaW4gb3V0cHV0IiApCisgICAgICAgICAgICAuYmluZCggJkNvbmZpZ0RhdGE6OnNob3dTdWNjZXNzZnVsVGVzdHMgKTsKKworICAgICAgICBjbGlbIi1iIl1bIi0tYnJlYWsiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAiYnJlYWsgaW50byBkZWJ1Z2dlciBvbiBmYWlsdXJlIiApCisgICAgICAgICAgICAuYmluZCggJkNvbmZpZ0RhdGE6OnNob3VsZERlYnVnQnJlYWsgKTsKKworICAgICAgICBjbGlbIi1lIl1bIi0tbm90aHJvdyJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJza2lwIGV4Y2VwdGlvbiB0ZXN0cyIgKQorICAgICAgICAgICAgLmJpbmQoICZDb25maWdEYXRhOjpub1Rocm93ICk7CisKKyAgICAgICAgY2xpWyItaSJdWyItLWludmlzaWJsZXMiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAic2hvdyBpbnZpc2libGVzICh0YWJzLCBuZXdsaW5lcykiICkKKyAgICAgICAgICAgIC5iaW5kKCAmQ29uZmlnRGF0YTo6c2hvd0ludmlzaWJsZXMgKTsKKworICAgICAgICBjbGlbIi1vIl1bIi0tb3V0Il0KKyAgICAgICAgICAgIC5kZXNjcmliZSggIm91dHB1dCBmaWxlbmFtZSIgKQorICAgICAgICAgICAgLmJpbmQoICZDb25maWdEYXRhOjpvdXRwdXRGaWxlbmFtZSwgImZpbGVuYW1lIiApOworCisgICAgICAgIGNsaVsiLXIiXVsiLS1yZXBvcnRlciJdCisvLyAgICAgICAgICAgIC5wbGFjZWhvbGRlciggIm5hbWVbOmZpbGVuYW1lXSIgKQorICAgICAgICAgICAgLmRlc2NyaWJlKCAicmVwb3J0ZXIgdG8gdXNlIChkZWZhdWx0cyB0byBjb25zb2xlKSIgKQorICAgICAgICAgICAgLmJpbmQoICZhZGRSZXBvcnRlck5hbWUsICJuYW1lIiApOworCisgICAgICAgIGNsaVsiLW4iXVsiLS1uYW1lIl0KKyAgICAgICAgICAgIC5kZXNjcmliZSggInN1aXRlIG5hbWUiICkKKyAgICAgICAgICAgIC5iaW5kKCAmQ29uZmlnRGF0YTo6bmFtZSwgIm5hbWUiICk7CisKKyAgICAgICAgY2xpWyItYSJdWyItLWFib3J0Il0KKyAgICAgICAgICAgIC5kZXNjcmliZSggImFib3J0IGF0IGZpcnN0IGZhaWx1cmUiICkKKyAgICAgICAgICAgIC5iaW5kKCAmYWJvcnRBZnRlckZpcnN0ICk7CisKKyAgICAgICAgY2xpWyIteCJdWyItLWFib3J0eCJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJhYm9ydCBhZnRlciB4IGZhaWx1cmVzIiApCisgICAgICAgICAgICAuYmluZCggJmFib3J0QWZ0ZXJYLCAibm8uIGZhaWx1cmVzIiApOworCisgICAgICAgIGNsaVsiLXciXVsiLS13YXJuIl0KKyAgICAgICAgICAgIC5kZXNjcmliZSggImVuYWJsZSB3YXJuaW5ncyIgKQorICAgICAgICAgICAgLmJpbmQoICZhZGRXYXJuaW5nLCAid2FybmluZyBuYW1lIiApOworCisvLyAtIG5lZWRzIHVwZGF0aW5nIGlmIHJlaW5zdGF0ZWQKKy8vICAgICAgICBjbGkuaW50byggJnNldFZlcmJvc2l0eSApCisvLyAgICAgICAgICAgIC5kZXNjcmliZSggImxldmVsIG9mIHZlcmJvc2l0eSAoMD1ubyBvdXRwdXQpIiApCisvLyAgICAgICAgICAgIC5zaG9ydE9wdCggInYiKQorLy8gICAgICAgICAgICAubG9uZ09wdCggInZlcmJvc2l0eSIgKQorLy8gICAgICAgICAgICAucGxhY2Vob2xkZXIoICJsZXZlbCIgKTsKKworICAgICAgICBjbGlbX10KKyAgICAgICAgICAgIC5kZXNjcmliZSggIndoaWNoIHRlc3Qgb3IgdGVzdHMgdG8gdXNlIiApCisgICAgICAgICAgICAuYmluZCggJmFkZFRlc3RPclRhZ3MsICJ0ZXN0IG5hbWUsIHBhdHRlcm4gb3IgdGFncyIgKTsKKworICAgICAgICBjbGlbIi1kIl1bIi0tZHVyYXRpb25zIl0KKyAgICAgICAgICAgIC5kZXNjcmliZSggInNob3cgdGVzdCBkdXJhdGlvbnMiICkKKyAgICAgICAgICAgIC5iaW5kKCAmc2V0U2hvd0R1cmF0aW9ucywgInllc3xubyIgKTsKKworICAgICAgICBjbGlbIi1mIl1bIi0taW5wdXQtZmlsZSJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJsb2FkIHRlc3QgbmFtZXMgdG8gcnVuIGZyb20gYSBmaWxlIiApCisgICAgICAgICAgICAuYmluZCggJmxvYWRUZXN0TmFtZXNGcm9tRmlsZSwgImZpbGVuYW1lIiApOworCisgICAgICAgIGNsaVsiLSMiXVsiLS1maWxlbmFtZXMtYXMtdGFncyJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJhZGRzIGEgdGFnIGZvciB0aGUgZmlsZW5hbWUiICkKKyAgICAgICAgICAgIC5iaW5kKCAmQ29uZmlnRGF0YTo6ZmlsZW5hbWVzQXNUYWdzICk7CisKKyAgICAgICAgY2xpWyItYyJdWyItLXNlY3Rpb24iXQorICAgICAgICAgICAgICAgIC5kZXNjcmliZSggInNwZWNpZnkgc2VjdGlvbiB0byBydW4iICkKKyAgICAgICAgICAgICAgICAuYmluZCggJmFkZFNlY3Rpb25Ub1J1biwgInNlY3Rpb24gbmFtZSIgKTsKKworICAgICAgICAvLyBMZXNzIGNvbW1vbiBjb21tYW5kcyB3aGljaCBkb24ndCBoYXZlIGEgc2hvcnQgZm9ybQorICAgICAgICBjbGlbIi0tbGlzdC10ZXN0LW5hbWVzLW9ubHkiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAibGlzdCBhbGwvbWF0Y2hpbmcgdGVzdCBjYXNlcyBuYW1lcyBvbmx5IiApCisgICAgICAgICAgICAuYmluZCggJkNvbmZpZ0RhdGE6Omxpc3RUZXN0TmFtZXNPbmx5ICk7CisKKyAgICAgICAgY2xpWyItLWxpc3QtcmVwb3J0ZXJzIl0KKyAgICAgICAgICAgIC5kZXNjcmliZSggImxpc3QgYWxsIHJlcG9ydGVycyIgKQorICAgICAgICAgICAgLmJpbmQoICZDb25maWdEYXRhOjpsaXN0UmVwb3J0ZXJzICk7CisKKyAgICAgICAgY2xpWyItLW9yZGVyIl0KKyAgICAgICAgICAgIC5kZXNjcmliZSggInRlc3QgY2FzZSBvcmRlciAoZGVmYXVsdHMgdG8gZGVjbCkiICkKKyAgICAgICAgICAgIC5iaW5kKCAmc2V0T3JkZXIsICJkZWNsfGxleHxyYW5kIiApOworCisgICAgICAgIGNsaVsiLS1ybmctc2VlZCJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJzZXQgYSBzcGVjaWZpYyBzZWVkIGZvciByYW5kb20gbnVtYmVycyIgKQorICAgICAgICAgICAgLmJpbmQoICZzZXRSbmdTZWVkLCAiJ3RpbWUnfG51bWJlciIgKTsKKworICAgICAgICBjbGlbIi0tZm9yY2UtY29sb3VyIl0KKyAgICAgICAgICAgIC5kZXNjcmliZSggImZvcmNlIGNvbG91cmlzZWQgb3V0cHV0IChkZXByZWNhdGVkKSIgKQorICAgICAgICAgICAgLmJpbmQoICZmb3JjZUNvbG91ciApOworCisgICAgICAgIGNsaVsiLS11c2UtY29sb3VyIl0KKyAgICAgICAgICAgIC5kZXNjcmliZSggInNob3VsZCBvdXRwdXQgYmUgY29sb3VyaXNlZCIgKQorICAgICAgICAgICAgLmJpbmQoICZzZXRVc2VDb2xvdXIsICJ5ZXN8bm8iICk7CisKKyAgICAgICAgcmV0dXJuIGNsaTsKKyAgICB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogaW50ZXJuYWwvY2F0Y2hfbGlzdC5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0xJU1RfSFBQX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF90ZXh0LmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1RFWFRfSF9JTkNMVURFRAorCisjZGVmaW5lIFRCQ19URVhUX0ZPUk1BVF9DT05TT0xFX1dJRFRIIENBVENIX0NPTkZJR19DT05TT0xFX1dJRFRICisKKyNkZWZpbmUgQ0xJQ0hFX1RCQ19URVhUX0ZPUk1BVF9PVVRFUl9OQU1FU1BBQ0UgQ2F0Y2gKKy8vICNpbmNsdWRlZCBmcm9tOiAuLi9leHRlcm5hbC90YmNfdGV4dF9mb3JtYXQuaAorLy8gT25seSB1c2UgaGVhZGVyIGd1YXJkIGlmIHdlIGFyZSBub3QgdXNpbmcgYW4gb3V0ZXIgbmFtZXNwYWNlCisjaWZuZGVmIENMSUNIRV9UQkNfVEVYVF9GT1JNQVRfT1VURVJfTkFNRVNQQUNFCisjIGlmZGVmIFRXT0JMVUVDVUJFU19URVhUX0ZPUk1BVF9IX0lOQ0xVREVECisjICBpZm5kZWYgVFdPQkxVRUNVQkVTX1RFWFRfRk9STUFUX0hfQUxSRUFEWV9JTkNMVURFRAorIyAgIGRlZmluZSBUV09CTFVFQ1VCRVNfVEVYVF9GT1JNQVRfSF9BTFJFQURZX0lOQ0xVREVECisjICBlbmRpZgorIyBlbHNlCisjICBkZWZpbmUgVFdPQkxVRUNVQkVTX1RFWFRfRk9STUFUX0hfSU5DTFVERUQKKyMgZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBUV09CTFVFQ1VCRVNfVEVYVF9GT1JNQVRfSF9BTFJFQURZX0lOQ0xVREVECisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCisvLyBVc2Ugb3B0aW9uYWwgb3V0ZXIgbmFtZXNwYWNlCisjaWZkZWYgQ0xJQ0hFX1RCQ19URVhUX0ZPUk1BVF9PVVRFUl9OQU1FU1BBQ0UKK25hbWVzcGFjZSBDTElDSEVfVEJDX1RFWFRfRk9STUFUX09VVEVSX05BTUVTUEFDRSB7CisjZW5kaWYKKworbmFtZXNwYWNlIFRiYyB7CisKKyNpZmRlZiBUQkNfVEVYVF9GT1JNQVRfQ09OU09MRV9XSURUSAorICAgIGNvbnN0IHVuc2lnbmVkIGludCBjb25zb2xlV2lkdGggPSBUQkNfVEVYVF9GT1JNQVRfQ09OU09MRV9XSURUSDsKKyNlbHNlCisgICAgY29uc3QgdW5zaWduZWQgaW50IGNvbnNvbGVXaWR0aCA9IDgwOworI2VuZGlmCisKKyAgICBzdHJ1Y3QgVGV4dEF0dHJpYnV0ZXMgeworICAgICAgICBUZXh0QXR0cmlidXRlcygpCisgICAgICAgIDogICBpbml0aWFsSW5kZW50KCBzdGQ6OnN0cmluZzo6bnBvcyApLAorICAgICAgICAgICAgaW5kZW50KCAwICksCisgICAgICAgICAgICB3aWR0aCggY29uc29sZVdpZHRoLTEgKQorICAgICAgICB7fQorCisgICAgICAgIFRleHRBdHRyaWJ1dGVzJiBzZXRJbml0aWFsSW5kZW50KCBzdGQ6OnNpemVfdCBfdmFsdWUgKSAgeyBpbml0aWFsSW5kZW50ID0gX3ZhbHVlOyByZXR1cm4gKnRoaXM7IH0KKyAgICAgICAgVGV4dEF0dHJpYnV0ZXMmIHNldEluZGVudCggc3RkOjpzaXplX3QgX3ZhbHVlICkgICAgICAgICB7IGluZGVudCA9IF92YWx1ZTsgcmV0dXJuICp0aGlzOyB9CisgICAgICAgIFRleHRBdHRyaWJ1dGVzJiBzZXRXaWR0aCggc3RkOjpzaXplX3QgX3ZhbHVlICkgICAgICAgICAgeyB3aWR0aCA9IF92YWx1ZTsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgICAgc3RkOjpzaXplX3QgaW5pdGlhbEluZGVudDsgIC8vIGluZGVudCBvZiBmaXJzdCBsaW5lLCBvciBucG9zCisgICAgICAgIHN0ZDo6c2l6ZV90IGluZGVudDsgICAgICAgICAvLyBpbmRlbnQgb2Ygc3Vic2VxdWVudCBsaW5lcywgb3IgYWxsIGlmIGluaXRpYWxJbmRlbnQgaXMgbnBvcworICAgICAgICBzdGQ6OnNpemVfdCB3aWR0aDsgICAgICAgICAgLy8gbWF4aW11bSB3aWR0aCBvZiB0ZXh0LCBpbmNsdWRpbmcgaW5kZW50LiBMb25nZXIgdGV4dCB3aWxsIHdyYXAKKyAgICB9OworCisgICAgY2xhc3MgVGV4dCB7CisgICAgcHVibGljOgorICAgICAgICBUZXh0KCBzdGQ6OnN0cmluZyBjb25zdCYgX3N0ciwgVGV4dEF0dHJpYnV0ZXMgY29uc3QmIF9hdHRyID0gVGV4dEF0dHJpYnV0ZXMoKSApCisgICAgICAgIDogYXR0ciggX2F0dHIgKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyB3cmFwcGFibGVCZWZvcmVDaGFycyA9ICJbKHs8XHQiOworICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgd3JhcHBhYmxlQWZ0ZXJDaGFycyA9ICJdKX0+LSwuL3xcXCI7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyB3cmFwcGFibGVJbnN0ZWFkT2ZDaGFycyA9ICIgXG5cciI7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBpbmRlbnQgPSBfYXR0ci5pbml0aWFsSW5kZW50ICE9IHN0ZDo6c3RyaW5nOjpucG9zCisgICAgICAgICAgICAgICAgPyBzdGQ6OnN0cmluZyggX2F0dHIuaW5pdGlhbEluZGVudCwgJyAnICkKKyAgICAgICAgICAgICAgICA6IHN0ZDo6c3RyaW5nKCBfYXR0ci5pbmRlbnQsICcgJyApOworCisgICAgICAgICAgICB0eXBlZGVmIHN0ZDo6c3RyaW5nOjpjb25zdF9pdGVyYXRvciBpdGVyYXRvcjsKKyAgICAgICAgICAgIGl0ZXJhdG9yIGl0ID0gX3N0ci5iZWdpbigpOworICAgICAgICAgICAgY29uc3QgaXRlcmF0b3Igc3RyRW5kID0gX3N0ci5lbmQoKTsKKworICAgICAgICAgICAgd2hpbGUoIGl0ICE9IHN0ckVuZCApIHsKKworICAgICAgICAgICAgICAgIGlmKCBsaW5lcy5zaXplKCkgPj0gMTAwMCApIHsKKyAgICAgICAgICAgICAgICAgICAgbGluZXMucHVzaF9iYWNrKCAiLi4uIG1lc3NhZ2UgdHJ1bmNhdGVkIGR1ZSB0byBleGNlc3NpdmUgc2l6ZSIgKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHN1ZmZpeDsKKyAgICAgICAgICAgICAgICBzdGQ6OnNpemVfdCB3aWR0aCA9IChzdGQ6Om1pbikoIHN0YXRpY19jYXN0PHNpemVfdD4oIHN0ckVuZC1pdCApLCBfYXR0ci53aWR0aC1zdGF0aWNfY2FzdDxzaXplX3Q+KCBpbmRlbnQuc2l6ZSgpICkgKTsKKyAgICAgICAgICAgICAgICBpdGVyYXRvciBpdEVuZCA9IGl0K3dpZHRoOworICAgICAgICAgICAgICAgIGl0ZXJhdG9yIGl0TmV4dCA9IF9zdHIuZW5kKCk7CisKKyAgICAgICAgICAgICAgICBpdGVyYXRvciBpdE5ld0xpbmUgPSBzdGQ6OmZpbmQoIGl0LCBpdEVuZCwgJ1xuJyApOworICAgICAgICAgICAgICAgIGlmKCBpdE5ld0xpbmUgIT0gaXRFbmQgKQorICAgICAgICAgICAgICAgICAgICBpdEVuZCA9IGl0TmV3TGluZTsKKworICAgICAgICAgICAgICAgIGlmKCBpdEVuZCAhPSBzdHJFbmQgICkgeworICAgICAgICAgICAgICAgICAgICBib29sIGZvdW5kV3JhcFBvaW50ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yIGZpbmRJdCA9IGl0RW5kOworICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggd3JhcHBhYmxlQWZ0ZXJDaGFycy5maW5kKCAqZmluZEl0ICkgIT0gc3RkOjpzdHJpbmc6Om5wb3MgJiYgZmluZEl0ICE9IGl0RW5kICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0RW5kID0gZmluZEl0KzE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXROZXh0ID0gZmluZEl0KzE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRXcmFwUG9pbnQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggZmluZEl0ID4gaXQgJiYgd3JhcHBhYmxlQmVmb3JlQ2hhcnMuZmluZCggKmZpbmRJdCApICE9IHN0ZDo6c3RyaW5nOjpucG9zICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0RW5kID0gZmluZEl0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0TmV4dCA9IGZpbmRJdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZFdyYXBQb2ludCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB3cmFwcGFibGVJbnN0ZWFkT2ZDaGFycy5maW5kKCAqZmluZEl0ICkgIT0gc3RkOjpzdHJpbmc6Om5wb3MgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXROZXh0ID0gZmluZEl0KzE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRFbmQgPSBmaW5kSXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRXcmFwUG9pbnQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGZpbmRJdCA9PSBpdCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1maW5kSXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUoICFmb3VuZFdyYXBQb2ludCApOworCisgICAgICAgICAgICAgICAgICAgIGlmKCAhZm91bmRXcmFwUG9pbnQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBObyBnb29kIHdyYXAgY2hhciwgc28gd2UnbGwgYnJlYWsgbWlkIHdvcmQgYW5kIGFkZCBhIGh5cGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgLS1pdEVuZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0TmV4dCA9IGl0RW5kOworICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4ID0gIi0iOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoIGl0RW5kID4gaXQgJiYgd3JhcHBhYmxlSW5zdGVhZE9mQ2hhcnMuZmluZCggKihpdEVuZC0xKSApICE9IHN0ZDo6c3RyaW5nOjpucG9zICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLWl0RW5kOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxpbmVzLnB1c2hfYmFjayggaW5kZW50ICsgc3RkOjpzdHJpbmcoIGl0LCBpdEVuZCApICsgc3VmZml4ICk7CisKKyAgICAgICAgICAgICAgICBpZiggaW5kZW50LnNpemUoKSAhPSBfYXR0ci5pbmRlbnQgKQorICAgICAgICAgICAgICAgICAgICBpbmRlbnQgPSBzdGQ6OnN0cmluZyggX2F0dHIuaW5kZW50LCAnICcgKTsKKyAgICAgICAgICAgICAgICBpdCA9IGl0TmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKKworICAgICAgICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGxpbmVzLmJlZ2luKCk7IH0KKyAgICAgICAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gbGluZXMuZW5kKCk7IH0KKyAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIGxhc3QoKSBjb25zdCB7IHJldHVybiBsaW5lcy5iYWNrKCk7IH0KKyAgICAgICAgc3RkOjpzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGxpbmVzLnNpemUoKTsgfQorICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgb3BlcmF0b3JbXSggc3RkOjpzaXplX3QgX2luZGV4ICkgY29uc3QgeyByZXR1cm4gbGluZXNbX2luZGV4XTsgfQorICAgICAgICBzdGQ6OnN0cmluZyB0b1N0cmluZygpIGNvbnN0IHsKKyAgICAgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgICAgICBvc3MgPDwgKnRoaXM7CisgICAgICAgICAgICByZXR1cm4gb3NzLnN0cigpOworICAgICAgICB9CisKKyAgICAgICAgaW5saW5lIGZyaWVuZCBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yIDw8ICggc3RkOjpvc3RyZWFtJiBfc3RyZWFtLCBUZXh0IGNvbnN0JiBfdGV4dCApIHsKKyAgICAgICAgICAgIGZvciggVGV4dDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBfdGV4dC5iZWdpbigpLCBpdEVuZCA9IF90ZXh0LmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOyArK2l0ICkgeworICAgICAgICAgICAgICAgIGlmKCBpdCAhPSBfdGV4dC5iZWdpbigpICkKKyAgICAgICAgICAgICAgICAgICAgX3N0cmVhbSA8PCAiXG4iOworICAgICAgICAgICAgICAgIF9zdHJlYW0gPDwgKml0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIF9zdHJlYW07CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6c3RyaW5nIHN0cjsKKyAgICAgICAgVGV4dEF0dHJpYnV0ZXMgYXR0cjsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGxpbmVzOworICAgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBUYmMKKworI2lmZGVmIENMSUNIRV9UQkNfVEVYVF9GT1JNQVRfT1VURVJfTkFNRVNQQUNFCit9IC8vIGVuZCBvdXRlciBuYW1lc3BhY2UKKyNlbmRpZgorCisjZW5kaWYgLy8gVFdPQkxVRUNVQkVTX1RFWFRfRk9STUFUX0hfQUxSRUFEWV9JTkNMVURFRAorI3VuZGVmIENMSUNIRV9UQkNfVEVYVF9GT1JNQVRfT1VURVJfTkFNRVNQQUNFCisKK25hbWVzcGFjZSBDYXRjaCB7CisgICAgdXNpbmcgVGJjOjpUZXh0OworICAgIHVzaW5nIFRiYzo6VGV4dEF0dHJpYnV0ZXM7Cit9CisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9jb25zb2xlX2NvbG91ci5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0NPTlNPTEVfQ09MT1VSX0hQUF9JTkNMVURFRAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IENvbG91ciB7CisgICAgICAgIGVudW0gQ29kZSB7CisgICAgICAgICAgICBOb25lID0gMCwKKworICAgICAgICAgICAgV2hpdGUsCisgICAgICAgICAgICBSZWQsCisgICAgICAgICAgICBHcmVlbiwKKyAgICAgICAgICAgIEJsdWUsCisgICAgICAgICAgICBDeWFuLAorICAgICAgICAgICAgWWVsbG93LAorICAgICAgICAgICAgR3JleSwKKworICAgICAgICAgICAgQnJpZ2h0ID0gMHgxMCwKKworICAgICAgICAgICAgQnJpZ2h0UmVkID0gQnJpZ2h0IHwgUmVkLAorICAgICAgICAgICAgQnJpZ2h0R3JlZW4gPSBCcmlnaHQgfCBHcmVlbiwKKyAgICAgICAgICAgIExpZ2h0R3JleSA9IEJyaWdodCB8IEdyZXksCisgICAgICAgICAgICBCcmlnaHRXaGl0ZSA9IEJyaWdodCB8IFdoaXRlLAorCisgICAgICAgICAgICAvLyBCeSBpbnRlbnRpb24KKyAgICAgICAgICAgIEZpbGVOYW1lID0gTGlnaHRHcmV5LAorICAgICAgICAgICAgV2FybmluZyA9IFllbGxvdywKKyAgICAgICAgICAgIFJlc3VsdEVycm9yID0gQnJpZ2h0UmVkLAorICAgICAgICAgICAgUmVzdWx0U3VjY2VzcyA9IEJyaWdodEdyZWVuLAorICAgICAgICAgICAgUmVzdWx0RXhwZWN0ZWRGYWlsdXJlID0gV2FybmluZywKKworICAgICAgICAgICAgRXJyb3IgPSBCcmlnaHRSZWQsCisgICAgICAgICAgICBTdWNjZXNzID0gR3JlZW4sCisKKyAgICAgICAgICAgIE9yaWdpbmFsRXhwcmVzc2lvbiA9IEN5YW4sCisgICAgICAgICAgICBSZWNvbnN0cnVjdGVkRXhwcmVzc2lvbiA9IFllbGxvdywKKworICAgICAgICAgICAgU2Vjb25kYXJ5VGV4dCA9IExpZ2h0R3JleSwKKyAgICAgICAgICAgIEhlYWRlcnMgPSBXaGl0ZQorICAgICAgICB9OworCisgICAgICAgIC8vIFVzZSBjb25zdHJ1Y3RlZCBvYmplY3QgZm9yIFJBSUkgZ3VhcmQKKyAgICAgICAgQ29sb3VyKCBDb2RlIF9jb2xvdXJDb2RlICk7CisgICAgICAgIENvbG91ciggQ29sb3VyIGNvbnN0JiBvdGhlciApOworICAgICAgICB+Q29sb3VyKCk7CisKKyAgICAgICAgLy8gVXNlIHN0YXRpYyBtZXRob2QgZm9yIG9uZS1zaG90IGNoYW5nZXMKKyAgICAgICAgc3RhdGljIHZvaWQgdXNlKCBDb2RlIF9jb2xvdXJDb2RlICk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBib29sIG1fbW92ZWQ7CisgICAgfTsKKworICAgIGlubGluZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yIDw8ICggc3RkOjpvc3RyZWFtJiBvcywgQ29sb3VyIGNvbnN0JiApIHsgcmV0dXJuIG9zOyB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfaW50ZXJmYWNlc19yZXBvcnRlci5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9JTlRFUkZBQ0VTX1JFUE9SVEVSX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxvc3RyZWFtPgorI2luY2x1ZGUgPG1hcD4KKworbmFtZXNwYWNlIENhdGNoCit7CisgICAgc3RydWN0IFJlcG9ydGVyQ29uZmlnIHsKKyAgICAgICAgZXhwbGljaXQgUmVwb3J0ZXJDb25maWcoIFB0cjxJQ29uZmlnIGNvbnN0PiBjb25zdCYgX2Z1bGxDb25maWcgKQorICAgICAgICA6ICAgbV9zdHJlYW0oICZfZnVsbENvbmZpZy0+c3RyZWFtKCkgKSwgbV9mdWxsQ29uZmlnKCBfZnVsbENvbmZpZyApIHt9CisKKyAgICAgICAgUmVwb3J0ZXJDb25maWcoIFB0cjxJQ29uZmlnIGNvbnN0PiBjb25zdCYgX2Z1bGxDb25maWcsIHN0ZDo6b3N0cmVhbSYgX3N0cmVhbSApCisgICAgICAgIDogICBtX3N0cmVhbSggJl9zdHJlYW0gKSwgbV9mdWxsQ29uZmlnKCBfZnVsbENvbmZpZyApIHt9CisKKyAgICAgICAgc3RkOjpvc3RyZWFtJiBzdHJlYW0oKSBjb25zdCAgICB7IHJldHVybiAqbV9zdHJlYW07IH0KKyAgICAgICAgUHRyPElDb25maWcgY29uc3Q+IGZ1bGxDb25maWcoKSBjb25zdCB7IHJldHVybiBtX2Z1bGxDb25maWc7IH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6b3N0cmVhbSogbV9zdHJlYW07CisgICAgICAgIFB0cjxJQ29uZmlnIGNvbnN0PiBtX2Z1bGxDb25maWc7CisgICAgfTsKKworICAgIHN0cnVjdCBSZXBvcnRlclByZWZlcmVuY2VzIHsKKyAgICAgICAgUmVwb3J0ZXJQcmVmZXJlbmNlcygpCisgICAgICAgIDogc2hvdWxkUmVkaXJlY3RTdGRPdXQoIGZhbHNlICkKKyAgICAgICAge30KKworICAgICAgICBib29sIHNob3VsZFJlZGlyZWN0U3RkT3V0OworICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0cnVjdCBMYXp5U3RhdCA6IE9wdGlvbjxUPiB7CisgICAgICAgIExhenlTdGF0KCkgOiB1c2VkKCBmYWxzZSApIHt9CisgICAgICAgIExhenlTdGF0JiBvcGVyYXRvcj0oIFQgY29uc3QmIF92YWx1ZSApIHsKKyAgICAgICAgICAgIE9wdGlvbjxUPjo6b3BlcmF0b3I9KCBfdmFsdWUgKTsKKyAgICAgICAgICAgIHVzZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHJlc2V0KCkgeworICAgICAgICAgICAgT3B0aW9uPFQ+OjpyZXNldCgpOworICAgICAgICAgICAgdXNlZCA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIGJvb2wgdXNlZDsKKyAgICB9OworCisgICAgc3RydWN0IFRlc3RSdW5JbmZvIHsKKyAgICAgICAgVGVzdFJ1bkluZm8oIHN0ZDo6c3RyaW5nIGNvbnN0JiBfbmFtZSApIDogbmFtZSggX25hbWUgKSB7fQorICAgICAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgIH07CisgICAgc3RydWN0IEdyb3VwSW5mbyB7CisgICAgICAgIEdyb3VwSW5mbyggIHN0ZDo6c3RyaW5nIGNvbnN0JiBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzaXplX3QgX2dyb3VwSW5kZXgsCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2l6ZV90IF9ncm91cHNDb3VudCApCisgICAgICAgIDogICBuYW1lKCBfbmFtZSApLAorICAgICAgICAgICAgZ3JvdXBJbmRleCggX2dyb3VwSW5kZXggKSwKKyAgICAgICAgICAgIGdyb3Vwc0NvdW50cyggX2dyb3Vwc0NvdW50ICkKKyAgICAgICAge30KKworICAgICAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgICAgICBzdGQ6OnNpemVfdCBncm91cEluZGV4OworICAgICAgICBzdGQ6OnNpemVfdCBncm91cHNDb3VudHM7CisgICAgfTsKKworICAgIHN0cnVjdCBBc3NlcnRpb25TdGF0cyB7CisgICAgICAgIEFzc2VydGlvblN0YXRzKCBBc3NlcnRpb25SZXN1bHQgY29uc3QmIF9hc3NlcnRpb25SZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxNZXNzYWdlSW5mbz4gY29uc3QmIF9pbmZvTWVzc2FnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBUb3RhbHMgY29uc3QmIF90b3RhbHMgKQorICAgICAgICA6ICAgYXNzZXJ0aW9uUmVzdWx0KCBfYXNzZXJ0aW9uUmVzdWx0ICksCisgICAgICAgICAgICBpbmZvTWVzc2FnZXMoIF9pbmZvTWVzc2FnZXMgKSwKKyAgICAgICAgICAgIHRvdGFscyggX3RvdGFscyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBhc3NlcnRpb25SZXN1bHQuaGFzTWVzc2FnZSgpICkgeworICAgICAgICAgICAgICAgIC8vIENvcHkgbWVzc2FnZSBpbnRvIG1lc3NhZ2VzIGxpc3QuCisgICAgICAgICAgICAgICAgLy8gIVRCRCBUaGlzIHNob3VsZCBoYXZlIGJlZW4gZG9uZSBlYXJsaWVyLCBzb21ld2hlcmUKKyAgICAgICAgICAgICAgICBNZXNzYWdlQnVpbGRlciBidWlsZGVyKCBhc3NlcnRpb25SZXN1bHQuZ2V0VGVzdE1hY3JvTmFtZSgpLCBhc3NlcnRpb25SZXN1bHQuZ2V0U291cmNlSW5mbygpLCBhc3NlcnRpb25SZXN1bHQuZ2V0UmVzdWx0VHlwZSgpICk7CisgICAgICAgICAgICAgICAgYnVpbGRlciA8PCBhc3NlcnRpb25SZXN1bHQuZ2V0TWVzc2FnZSgpOworICAgICAgICAgICAgICAgIGJ1aWxkZXIubV9pbmZvLm1lc3NhZ2UgPSBidWlsZGVyLm1fc3RyZWFtLnN0cigpOworCisgICAgICAgICAgICAgICAgaW5mb01lc3NhZ2VzLnB1c2hfYmFjayggYnVpbGRlci5tX2luZm8gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIH5Bc3NlcnRpb25TdGF0cygpOworCisjICBpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMKKyAgICAgICAgQXNzZXJ0aW9uU3RhdHMoIEFzc2VydGlvblN0YXRzIGNvbnN0JiApICAgICAgICAgICAgICA9IGRlZmF1bHQ7CisgICAgICAgIEFzc2VydGlvblN0YXRzKCBBc3NlcnRpb25TdGF0cyAmJiApICAgICAgICAgICAgICAgICAgPSBkZWZhdWx0OworICAgICAgICBBc3NlcnRpb25TdGF0cyYgb3BlcmF0b3IgPSAoIEFzc2VydGlvblN0YXRzIGNvbnN0JiApID0gZGVmYXVsdDsKKyAgICAgICAgQXNzZXJ0aW9uU3RhdHMmIG9wZXJhdG9yID0gKCBBc3NlcnRpb25TdGF0cyAmJiApICAgICA9IGRlZmF1bHQ7CisjICBlbmRpZgorCisgICAgICAgIEFzc2VydGlvblJlc3VsdCBhc3NlcnRpb25SZXN1bHQ7CisgICAgICAgIHN0ZDo6dmVjdG9yPE1lc3NhZ2VJbmZvPiBpbmZvTWVzc2FnZXM7CisgICAgICAgIFRvdGFscyB0b3RhbHM7CisgICAgfTsKKworICAgIHN0cnVjdCBTZWN0aW9uU3RhdHMgeworICAgICAgICBTZWN0aW9uU3RhdHMoICAgU2VjdGlvbkluZm8gY29uc3QmIF9zZWN0aW9uSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgIENvdW50cyBjb25zdCYgX2Fzc2VydGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgX2R1cmF0aW9uSW5TZWNvbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBfbWlzc2luZ0Fzc2VydGlvbnMgKQorICAgICAgICA6ICAgc2VjdGlvbkluZm8oIF9zZWN0aW9uSW5mbyApLAorICAgICAgICAgICAgYXNzZXJ0aW9ucyggX2Fzc2VydGlvbnMgKSwKKyAgICAgICAgICAgIGR1cmF0aW9uSW5TZWNvbmRzKCBfZHVyYXRpb25JblNlY29uZHMgKSwKKyAgICAgICAgICAgIG1pc3NpbmdBc3NlcnRpb25zKCBfbWlzc2luZ0Fzc2VydGlvbnMgKQorICAgICAgICB7fQorICAgICAgICB2aXJ0dWFsIH5TZWN0aW9uU3RhdHMoKTsKKyMgIGlmZGVmIENBVENIX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUworICAgICAgICBTZWN0aW9uU3RhdHMoIFNlY3Rpb25TdGF0cyBjb25zdCYgKSAgICAgICAgICAgICAgPSBkZWZhdWx0OworICAgICAgICBTZWN0aW9uU3RhdHMoIFNlY3Rpb25TdGF0cyAmJiApICAgICAgICAgICAgICAgICAgPSBkZWZhdWx0OworICAgICAgICBTZWN0aW9uU3RhdHMmIG9wZXJhdG9yID0gKCBTZWN0aW9uU3RhdHMgY29uc3QmICkgPSBkZWZhdWx0OworICAgICAgICBTZWN0aW9uU3RhdHMmIG9wZXJhdG9yID0gKCBTZWN0aW9uU3RhdHMgJiYgKSAgICAgPSBkZWZhdWx0OworIyAgZW5kaWYKKworICAgICAgICBTZWN0aW9uSW5mbyBzZWN0aW9uSW5mbzsKKyAgICAgICAgQ291bnRzIGFzc2VydGlvbnM7CisgICAgICAgIGRvdWJsZSBkdXJhdGlvbkluU2Vjb25kczsKKyAgICAgICAgYm9vbCBtaXNzaW5nQXNzZXJ0aW9uczsKKyAgICB9OworCisgICAgc3RydWN0IFRlc3RDYXNlU3RhdHMgeworICAgICAgICBUZXN0Q2FzZVN0YXRzKCAgVGVzdENhc2VJbmZvIGNvbnN0JiBfdGVzdEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICBUb3RhbHMgY29uc3QmIF90b3RhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgX3N0ZE91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfc3RkRXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBfYWJvcnRpbmcgKQorICAgICAgICA6IHRlc3RJbmZvKCBfdGVzdEluZm8gKSwKKyAgICAgICAgICAgIHRvdGFscyggX3RvdGFscyApLAorICAgICAgICAgICAgc3RkT3V0KCBfc3RkT3V0ICksCisgICAgICAgICAgICBzdGRFcnIoIF9zdGRFcnIgKSwKKyAgICAgICAgICAgIGFib3J0aW5nKCBfYWJvcnRpbmcgKQorICAgICAgICB7fQorICAgICAgICB2aXJ0dWFsIH5UZXN0Q2FzZVN0YXRzKCk7CisKKyMgIGlmZGVmIENBVENIX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUworICAgICAgICBUZXN0Q2FzZVN0YXRzKCBUZXN0Q2FzZVN0YXRzIGNvbnN0JiApICAgICAgICAgICAgICA9IGRlZmF1bHQ7CisgICAgICAgIFRlc3RDYXNlU3RhdHMoIFRlc3RDYXNlU3RhdHMgJiYgKSAgICAgICAgICAgICAgICAgID0gZGVmYXVsdDsKKyAgICAgICAgVGVzdENhc2VTdGF0cyYgb3BlcmF0b3IgPSAoIFRlc3RDYXNlU3RhdHMgY29uc3QmICkgPSBkZWZhdWx0OworICAgICAgICBUZXN0Q2FzZVN0YXRzJiBvcGVyYXRvciA9ICggVGVzdENhc2VTdGF0cyAmJiApICAgICA9IGRlZmF1bHQ7CisjICBlbmRpZgorCisgICAgICAgIFRlc3RDYXNlSW5mbyB0ZXN0SW5mbzsKKyAgICAgICAgVG90YWxzIHRvdGFsczsKKyAgICAgICAgc3RkOjpzdHJpbmcgc3RkT3V0OworICAgICAgICBzdGQ6OnN0cmluZyBzdGRFcnI7CisgICAgICAgIGJvb2wgYWJvcnRpbmc7CisgICAgfTsKKworICAgIHN0cnVjdCBUZXN0R3JvdXBTdGF0cyB7CisgICAgICAgIFRlc3RHcm91cFN0YXRzKCBHcm91cEluZm8gY29uc3QmIF9ncm91cEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICBUb3RhbHMgY29uc3QmIF90b3RhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIF9hYm9ydGluZyApCisgICAgICAgIDogICBncm91cEluZm8oIF9ncm91cEluZm8gKSwKKyAgICAgICAgICAgIHRvdGFscyggX3RvdGFscyApLAorICAgICAgICAgICAgYWJvcnRpbmcoIF9hYm9ydGluZyApCisgICAgICAgIHt9CisgICAgICAgIFRlc3RHcm91cFN0YXRzKCBHcm91cEluZm8gY29uc3QmIF9ncm91cEluZm8gKQorICAgICAgICA6ICAgZ3JvdXBJbmZvKCBfZ3JvdXBJbmZvICksCisgICAgICAgICAgICBhYm9ydGluZyggZmFsc2UgKQorICAgICAgICB7fQorICAgICAgICB2aXJ0dWFsIH5UZXN0R3JvdXBTdGF0cygpOworCisjICBpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMKKyAgICAgICAgVGVzdEdyb3VwU3RhdHMoIFRlc3RHcm91cFN0YXRzIGNvbnN0JiApICAgICAgICAgICAgICA9IGRlZmF1bHQ7CisgICAgICAgIFRlc3RHcm91cFN0YXRzKCBUZXN0R3JvdXBTdGF0cyAmJiApICAgICAgICAgICAgICAgICAgPSBkZWZhdWx0OworICAgICAgICBUZXN0R3JvdXBTdGF0cyYgb3BlcmF0b3IgPSAoIFRlc3RHcm91cFN0YXRzIGNvbnN0JiApID0gZGVmYXVsdDsKKyAgICAgICAgVGVzdEdyb3VwU3RhdHMmIG9wZXJhdG9yID0gKCBUZXN0R3JvdXBTdGF0cyAmJiApICAgICA9IGRlZmF1bHQ7CisjICBlbmRpZgorCisgICAgICAgIEdyb3VwSW5mbyBncm91cEluZm87CisgICAgICAgIFRvdGFscyB0b3RhbHM7CisgICAgICAgIGJvb2wgYWJvcnRpbmc7CisgICAgfTsKKworICAgIHN0cnVjdCBUZXN0UnVuU3RhdHMgeworICAgICAgICBUZXN0UnVuU3RhdHMoICAgVGVzdFJ1bkluZm8gY29uc3QmIF9ydW5JbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgVG90YWxzIGNvbnN0JiBfdG90YWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBfYWJvcnRpbmcgKQorICAgICAgICA6ICAgcnVuSW5mbyggX3J1bkluZm8gKSwKKyAgICAgICAgICAgIHRvdGFscyggX3RvdGFscyApLAorICAgICAgICAgICAgYWJvcnRpbmcoIF9hYm9ydGluZyApCisgICAgICAgIHt9CisgICAgICAgIHZpcnR1YWwgflRlc3RSdW5TdGF0cygpOworCisjICBpZm5kZWYgQ0FUQ0hfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTCisgICAgICAgIFRlc3RSdW5TdGF0cyggVGVzdFJ1blN0YXRzIGNvbnN0JiBfb3RoZXIgKQorICAgICAgICA6ICAgcnVuSW5mbyggX290aGVyLnJ1bkluZm8gKSwKKyAgICAgICAgICAgIHRvdGFscyggX290aGVyLnRvdGFscyApLAorICAgICAgICAgICAgYWJvcnRpbmcoIF9vdGhlci5hYm9ydGluZyApCisgICAgICAgIHt9CisjICBlbHNlCisgICAgICAgIFRlc3RSdW5TdGF0cyggVGVzdFJ1blN0YXRzIGNvbnN0JiApICAgICAgICAgICAgICA9IGRlZmF1bHQ7CisgICAgICAgIFRlc3RSdW5TdGF0cyggVGVzdFJ1blN0YXRzICYmICkgICAgICAgICAgICAgICAgICA9IGRlZmF1bHQ7CisgICAgICAgIFRlc3RSdW5TdGF0cyYgb3BlcmF0b3IgPSAoIFRlc3RSdW5TdGF0cyBjb25zdCYgKSA9IGRlZmF1bHQ7CisgICAgICAgIFRlc3RSdW5TdGF0cyYgb3BlcmF0b3IgPSAoIFRlc3RSdW5TdGF0cyAmJiApICAgICA9IGRlZmF1bHQ7CisjICBlbmRpZgorCisgICAgICAgIFRlc3RSdW5JbmZvIHJ1bkluZm87CisgICAgICAgIFRvdGFscyB0b3RhbHM7CisgICAgICAgIGJvb2wgYWJvcnRpbmc7CisgICAgfTsKKworICAgIGNsYXNzIE11bHRpcGxlUmVwb3J0ZXJzOworCisgICAgc3RydWN0IElTdHJlYW1pbmdSZXBvcnRlciA6IElTaGFyZWQgeworICAgICAgICB2aXJ0dWFsIH5JU3RyZWFtaW5nUmVwb3J0ZXIoKTsKKworICAgICAgICAvLyBJbXBsZW1lbnRpbmcgY2xhc3MgbXVzdCBhbHNvIHByb3ZpZGUgdGhlIGZvbGxvd2luZyBzdGF0aWMgbWV0aG9kOgorICAgICAgICAvLyBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKKworICAgICAgICB2aXJ0dWFsIFJlcG9ydGVyUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZXMoKSBjb25zdCA9IDA7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIG5vTWF0Y2hpbmdUZXN0Q2FzZXMoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzcGVjICkgPSAwOworCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0UnVuU3RhcnRpbmcoIFRlc3RSdW5JbmZvIGNvbnN0JiB0ZXN0UnVuSW5mbyApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RHcm91cFN0YXJ0aW5nKCBHcm91cEluZm8gY29uc3QmIGdyb3VwSW5mbyApID0gMDsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdENhc2VTdGFydGluZyggVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0SW5mbyApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHNlY3Rpb25TdGFydGluZyggU2VjdGlvbkluZm8gY29uc3QmIHNlY3Rpb25JbmZvICkgPSAwOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBhc3NlcnRpb25TdGFydGluZyggQXNzZXJ0aW9uSW5mbyBjb25zdCYgYXNzZXJ0aW9uSW5mbyApID0gMDsKKworICAgICAgICAvLyBUaGUgcmV0dXJuIHZhbHVlIGluZGljYXRlcyBpZiB0aGUgbWVzc2FnZXMgYnVmZmVyIHNob3VsZCBiZSBjbGVhcmVkOgorICAgICAgICB2aXJ0dWFsIGJvb2wgYXNzZXJ0aW9uRW5kZWQoIEFzc2VydGlvblN0YXRzIGNvbnN0JiBhc3NlcnRpb25TdGF0cyApID0gMDsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvbkVuZGVkKCBTZWN0aW9uU3RhdHMgY29uc3QmIHNlY3Rpb25TdGF0cyApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RDYXNlRW5kZWQoIFRlc3RDYXNlU3RhdHMgY29uc3QmIHRlc3RDYXNlU3RhdHMgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0R3JvdXBFbmRlZCggVGVzdEdyb3VwU3RhdHMgY29uc3QmIHRlc3RHcm91cFN0YXRzICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdFJ1bkVuZGVkKCBUZXN0UnVuU3RhdHMgY29uc3QmIHRlc3RSdW5TdGF0cyApID0gMDsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgc2tpcFRlc3QoIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdEluZm8gKSA9IDA7CisKKyAgICAgICAgdmlydHVhbCBNdWx0aXBsZVJlcG9ydGVycyogdHJ5QXNNdWx0aSgpIHsgcmV0dXJuIENBVENIX05VTEw7IH0KKyAgICB9OworCisgICAgc3RydWN0IElSZXBvcnRlckZhY3RvcnkgOiBJU2hhcmVkIHsKKyAgICAgICAgdmlydHVhbCB+SVJlcG9ydGVyRmFjdG9yeSgpOworICAgICAgICB2aXJ0dWFsIElTdHJlYW1pbmdSZXBvcnRlciogY3JlYXRlKCBSZXBvcnRlckNvbmZpZyBjb25zdCYgY29uZmlnICkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldERlc2NyaXB0aW9uKCkgY29uc3QgPSAwOworICAgIH07CisKKyAgICBzdHJ1Y3QgSVJlcG9ydGVyUmVnaXN0cnkgeworICAgICAgICB0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBQdHI8SVJlcG9ydGVyRmFjdG9yeT4gPiBGYWN0b3J5TWFwOworICAgICAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPFB0cjxJUmVwb3J0ZXJGYWN0b3J5PiA+IExpc3RlbmVyczsKKworICAgICAgICB2aXJ0dWFsIH5JUmVwb3J0ZXJSZWdpc3RyeSgpOworICAgICAgICB2aXJ0dWFsIElTdHJlYW1pbmdSZXBvcnRlciogY3JlYXRlKCBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSwgUHRyPElDb25maWcgY29uc3Q+IGNvbnN0JiBjb25maWcgKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgRmFjdG9yeU1hcCBjb25zdCYgZ2V0RmFjdG9yaWVzKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIExpc3RlbmVycyBjb25zdCYgZ2V0TGlzdGVuZXJzKCkgY29uc3QgPSAwOworICAgIH07CisKKyAgICBQdHI8SVN0cmVhbWluZ1JlcG9ydGVyPiBhZGRSZXBvcnRlciggUHRyPElTdHJlYW1pbmdSZXBvcnRlcj4gY29uc3QmIGV4aXN0aW5nUmVwb3J0ZXIsIFB0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+IGNvbnN0JiBhZGRpdGlvbmFsUmVwb3J0ZXIgKTsKKworfQorCisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGlubGluZSBzdGQ6OnNpemVfdCBsaXN0VGVzdHMoIENvbmZpZyBjb25zdCYgY29uZmlnICkgeworCisgICAgICAgIFRlc3RTcGVjIHRlc3RTcGVjID0gY29uZmlnLnRlc3RTcGVjKCk7CisgICAgICAgIGlmKCBjb25maWcudGVzdFNwZWMoKS5oYXNGaWx0ZXJzKCkgKQorICAgICAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCAiTWF0Y2hpbmcgdGVzdCBjYXNlczpcbiI7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCAiQWxsIGF2YWlsYWJsZSB0ZXN0IGNhc2VzOlxuIjsKKyAgICAgICAgICAgIHRlc3RTcGVjID0gVGVzdFNwZWNQYXJzZXIoIElUYWdBbGlhc1JlZ2lzdHJ5OjpnZXQoKSApLnBhcnNlKCAiKiIgKS50ZXN0U3BlYygpOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjpzaXplX3QgbWF0Y2hlZFRlc3RzID0gMDsKKyAgICAgICAgVGV4dEF0dHJpYnV0ZXMgbmFtZUF0dHIsIHRhZ3NBdHRyOworICAgICAgICBuYW1lQXR0ci5zZXRJbml0aWFsSW5kZW50KCAyICkuc2V0SW5kZW50KCA0ICk7CisgICAgICAgIHRhZ3NBdHRyLnNldEluZGVudCggNiApOworCisgICAgICAgIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBtYXRjaGVkVGVzdENhc2VzID0gZmlsdGVyVGVzdHMoIGdldEFsbFRlc3RDYXNlc1NvcnRlZCggY29uZmlnICksIHRlc3RTcGVjLCBjb25maWcgKTsKKyAgICAgICAgZm9yKCBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbWF0Y2hlZFRlc3RDYXNlcy5iZWdpbigpLCBpdEVuZCA9IG1hdGNoZWRUZXN0Q2FzZXMuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApIHsKKyAgICAgICAgICAgIG1hdGNoZWRUZXN0cysrOworICAgICAgICAgICAgVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0Q2FzZUluZm8gPSBpdC0+Z2V0VGVzdENhc2VJbmZvKCk7CisgICAgICAgICAgICBDb2xvdXI6OkNvZGUgY29sb3VyID0gdGVzdENhc2VJbmZvLmlzSGlkZGVuKCkKKyAgICAgICAgICAgICAgICA/IENvbG91cjo6U2Vjb25kYXJ5VGV4dAorICAgICAgICAgICAgICAgIDogQ29sb3VyOjpOb25lOworICAgICAgICAgICAgQ29sb3VyIGNvbG91ckd1YXJkKCBjb2xvdXIgKTsKKworICAgICAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCBUZXh0KCB0ZXN0Q2FzZUluZm8ubmFtZSwgbmFtZUF0dHIgKSA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICBpZiggIXRlc3RDYXNlSW5mby50YWdzLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgVGV4dCggdGVzdENhc2VJbmZvLnRhZ3NBc1N0cmluZywgdGFnc0F0dHIgKSA8PCBzdGQ6OmVuZGw7CisgICAgICAgIH0KKworICAgICAgICBpZiggIWNvbmZpZy50ZXN0U3BlYygpLmhhc0ZpbHRlcnMoKSApCisgICAgICAgICAgICBDYXRjaDo6Y291dCgpIDw8IHBsdXJhbGlzZSggbWF0Y2hlZFRlc3RzLCAidGVzdCBjYXNlIiApIDw8ICdcbicgPDwgc3RkOjplbmRsOworICAgICAgICBlbHNlCisgICAgICAgICAgICBDYXRjaDo6Y291dCgpIDw8IHBsdXJhbGlzZSggbWF0Y2hlZFRlc3RzLCAibWF0Y2hpbmcgdGVzdCBjYXNlIiApIDw8ICdcbicgPDwgc3RkOjplbmRsOworICAgICAgICByZXR1cm4gbWF0Y2hlZFRlc3RzOworICAgIH0KKworICAgIGlubGluZSBzdGQ6OnNpemVfdCBsaXN0VGVzdHNOYW1lc09ubHkoIENvbmZpZyBjb25zdCYgY29uZmlnICkgeworICAgICAgICBUZXN0U3BlYyB0ZXN0U3BlYyA9IGNvbmZpZy50ZXN0U3BlYygpOworICAgICAgICBpZiggIWNvbmZpZy50ZXN0U3BlYygpLmhhc0ZpbHRlcnMoKSApCisgICAgICAgICAgICB0ZXN0U3BlYyA9IFRlc3RTcGVjUGFyc2VyKCBJVGFnQWxpYXNSZWdpc3RyeTo6Z2V0KCkgKS5wYXJzZSggIioiICkudGVzdFNwZWMoKTsKKyAgICAgICAgc3RkOjpzaXplX3QgbWF0Y2hlZFRlc3RzID0gMDsKKyAgICAgICAgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IG1hdGNoZWRUZXN0Q2FzZXMgPSBmaWx0ZXJUZXN0cyggZ2V0QWxsVGVzdENhc2VzU29ydGVkKCBjb25maWcgKSwgdGVzdFNwZWMsIGNvbmZpZyApOworICAgICAgICBmb3IoIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtYXRjaGVkVGVzdENhc2VzLmJlZ2luKCksIGl0RW5kID0gbWF0Y2hlZFRlc3RDYXNlcy5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkgeworICAgICAgICAgICAgbWF0Y2hlZFRlc3RzKys7CisgICAgICAgICAgICBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RDYXNlSW5mbyA9IGl0LT5nZXRUZXN0Q2FzZUluZm8oKTsKKyAgICAgICAgICAgIGlmKCBzdGFydHNXaXRoKCB0ZXN0Q2FzZUluZm8ubmFtZSwgJyMnICkgKQorICAgICAgICAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCAnIicgPDwgdGVzdENhc2VJbmZvLm5hbWUgPDwgJyInIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgdGVzdENhc2VJbmZvLm5hbWUgPDwgc3RkOjplbmRsOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtYXRjaGVkVGVzdHM7CisgICAgfQorCisgICAgc3RydWN0IFRhZ0luZm8geworICAgICAgICBUYWdJbmZvKCkgOiBjb3VudCAoIDAgKSB7fQorICAgICAgICB2b2lkIGFkZCggc3RkOjpzdHJpbmcgY29uc3QmIHNwZWxsaW5nICkgeworICAgICAgICAgICAgKytjb3VudDsKKyAgICAgICAgICAgIHNwZWxsaW5ncy5pbnNlcnQoIHNwZWxsaW5nICk7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpzdHJpbmcgYWxsKCkgY29uc3QgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgb3V0OworICAgICAgICAgICAgZm9yKCBzdGQ6OnNldDxzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gc3BlbGxpbmdzLmJlZ2luKCksIGl0RW5kID0gc3BlbGxpbmdzLmVuZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgICAgICBvdXQgKz0gIlsiICsgKml0ICsgIl0iOworICAgICAgICAgICAgcmV0dXJuIG91dDsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gc3BlbGxpbmdzOworICAgICAgICBzdGQ6OnNpemVfdCBjb3VudDsKKyAgICB9OworCisgICAgaW5saW5lIHN0ZDo6c2l6ZV90IGxpc3RUYWdzKCBDb25maWcgY29uc3QmIGNvbmZpZyApIHsKKyAgICAgICAgVGVzdFNwZWMgdGVzdFNwZWMgPSBjb25maWcudGVzdFNwZWMoKTsKKyAgICAgICAgaWYoIGNvbmZpZy50ZXN0U3BlYygpLmhhc0ZpbHRlcnMoKSApCisgICAgICAgICAgICBDYXRjaDo6Y291dCgpIDw8ICJUYWdzIGZvciBtYXRjaGluZyB0ZXN0IGNhc2VzOlxuIjsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBDYXRjaDo6Y291dCgpIDw8ICJBbGwgYXZhaWxhYmxlIHRhZ3M6XG4iOworICAgICAgICAgICAgdGVzdFNwZWMgPSBUZXN0U3BlY1BhcnNlciggSVRhZ0FsaWFzUmVnaXN0cnk6OmdldCgpICkucGFyc2UoICIqIiApLnRlc3RTcGVjKCk7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgVGFnSW5mbz4gdGFnQ291bnRzOworCisgICAgICAgIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBtYXRjaGVkVGVzdENhc2VzID0gZmlsdGVyVGVzdHMoIGdldEFsbFRlc3RDYXNlc1NvcnRlZCggY29uZmlnICksIHRlc3RTcGVjLCBjb25maWcgKTsKKyAgICAgICAgZm9yKCBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbWF0Y2hlZFRlc3RDYXNlcy5iZWdpbigpLCBpdEVuZCA9IG1hdGNoZWRUZXN0Q2FzZXMuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApIHsKKyAgICAgICAgICAgIGZvciggc3RkOjpzZXQ8c3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciAgdGFnSXQgPSBpdC0+Z2V0VGVzdENhc2VJbmZvKCkudGFncy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdJdEVuZCA9IGl0LT5nZXRUZXN0Q2FzZUluZm8oKS50YWdzLmVuZCgpOworICAgICAgICAgICAgICAgICAgICB0YWdJdCAhPSB0YWdJdEVuZDsKKyAgICAgICAgICAgICAgICAgICAgKyt0YWdJdCApIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB0YWdOYW1lID0gKnRhZ0l0OworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGxjYXNlVGFnTmFtZSA9IHRvTG93ZXIoIHRhZ05hbWUgKTsKKyAgICAgICAgICAgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgVGFnSW5mbz46Oml0ZXJhdG9yIGNvdW50SXQgPSB0YWdDb3VudHMuZmluZCggbGNhc2VUYWdOYW1lICk7CisgICAgICAgICAgICAgICAgaWYoIGNvdW50SXQgPT0gdGFnQ291bnRzLmVuZCgpICkKKyAgICAgICAgICAgICAgICAgICAgY291bnRJdCA9IHRhZ0NvdW50cy5pbnNlcnQoIHN0ZDo6bWFrZV9wYWlyKCBsY2FzZVRhZ05hbWUsIFRhZ0luZm8oKSApICkuZmlyc3Q7CisgICAgICAgICAgICAgICAgY291bnRJdC0+c2Vjb25kLmFkZCggdGFnTmFtZSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yKCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgVGFnSW5mbz46OmNvbnN0X2l0ZXJhdG9yIGNvdW50SXQgPSB0YWdDb3VudHMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50SXRFbmQgPSB0YWdDb3VudHMuZW5kKCk7CisgICAgICAgICAgICAgICAgY291bnRJdCAhPSBjb3VudEl0RW5kOworICAgICAgICAgICAgICAgICsrY291bnRJdCApIHsKKyAgICAgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgICAgICBvc3MgPDwgIiAgIiA8PCBzdGQ6OnNldHcoMikgPDwgY291bnRJdC0+c2Vjb25kLmNvdW50IDw8ICIgICI7CisgICAgICAgICAgICBUZXh0IHdyYXBwZXIoIGNvdW50SXQtPnNlY29uZC5hbGwoKSwgVGV4dEF0dHJpYnV0ZXMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJbml0aWFsSW5kZW50KCAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0SW5kZW50KCBvc3Muc3RyKCkuc2l6ZSgpICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0V2lkdGgoIENBVENIX0NPTkZJR19DT05TT0xFX1dJRFRILTEwICkgKTsKKyAgICAgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgb3NzLnN0cigpIDw8IHdyYXBwZXIgPDwgJ1xuJzsKKyAgICAgICAgfQorICAgICAgICBDYXRjaDo6Y291dCgpIDw8IHBsdXJhbGlzZSggdGFnQ291bnRzLnNpemUoKSwgInRhZyIgKSA8PCAnXG4nIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgcmV0dXJuIHRhZ0NvdW50cy5zaXplKCk7CisgICAgfQorCisgICAgaW5saW5lIHN0ZDo6c2l6ZV90IGxpc3RSZXBvcnRlcnMoIENvbmZpZyBjb25zdCYgLypjb25maWcqLyApIHsKKyAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCAiQXZhaWxhYmxlIHJlcG9ydGVyczpcbiI7CisgICAgICAgIElSZXBvcnRlclJlZ2lzdHJ5OjpGYWN0b3J5TWFwIGNvbnN0JiBmYWN0b3JpZXMgPSBnZXRSZWdpc3RyeUh1YigpLmdldFJlcG9ydGVyUmVnaXN0cnkoKS5nZXRGYWN0b3JpZXMoKTsKKyAgICAgICAgSVJlcG9ydGVyUmVnaXN0cnk6OkZhY3RvcnlNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0QmVnaW4gPSBmYWN0b3JpZXMuYmVnaW4oKSwgaXRFbmQgPSBmYWN0b3JpZXMuZW5kKCksIGl0OworICAgICAgICBzdGQ6OnNpemVfdCBtYXhOYW1lTGVuID0gMDsKKyAgICAgICAgZm9yKGl0ID0gaXRCZWdpbjsgaXQgIT0gaXRFbmQ7ICsraXQgKQorICAgICAgICAgICAgbWF4TmFtZUxlbiA9IChzdGQ6Om1heCkoIG1heE5hbWVMZW4sIGl0LT5maXJzdC5zaXplKCkgKTsKKworICAgICAgICBmb3IoaXQgPSBpdEJlZ2luOyBpdCAhPSBpdEVuZDsgKytpdCApIHsKKyAgICAgICAgICAgIFRleHQgd3JhcHBlciggaXQtPnNlY29uZC0+Z2V0RGVzY3JpcHRpb24oKSwgVGV4dEF0dHJpYnV0ZXMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0SW5pdGlhbEluZGVudCggMCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJbmRlbnQoIDcrbWF4TmFtZUxlbiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRXaWR0aCggQ0FUQ0hfQ09ORklHX0NPTlNPTEVfV0lEVEggLSBtYXhOYW1lTGVuLTggKSApOworICAgICAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCAiICAiCisgICAgICAgICAgICAgICAgICAgIDw8IGl0LT5maXJzdAorICAgICAgICAgICAgICAgICAgICA8PCAnOicKKyAgICAgICAgICAgICAgICAgICAgPDwgc3RkOjpzdHJpbmcoIG1heE5hbWVMZW4gLSBpdC0+Zmlyc3Quc2l6ZSgpICsgMiwgJyAnICkKKyAgICAgICAgICAgICAgICAgICAgPDwgd3JhcHBlciA8PCAnXG4nOworICAgICAgICB9CisgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgc3RkOjplbmRsOworICAgICAgICByZXR1cm4gZmFjdG9yaWVzLnNpemUoKTsKKyAgICB9CisKKyAgICBpbmxpbmUgT3B0aW9uPHN0ZDo6c2l6ZV90PiBsaXN0KCBDb25maWcgY29uc3QmIGNvbmZpZyApIHsKKyAgICAgICAgT3B0aW9uPHN0ZDo6c2l6ZV90PiBsaXN0ZWRDb3VudDsKKyAgICAgICAgaWYoIGNvbmZpZy5saXN0VGVzdHMoKSApCisgICAgICAgICAgICBsaXN0ZWRDb3VudCA9IGxpc3RlZENvdW50LnZhbHVlT3IoMCkgKyBsaXN0VGVzdHMoIGNvbmZpZyApOworICAgICAgICBpZiggY29uZmlnLmxpc3RUZXN0TmFtZXNPbmx5KCkgKQorICAgICAgICAgICAgbGlzdGVkQ291bnQgPSBsaXN0ZWRDb3VudC52YWx1ZU9yKDApICsgbGlzdFRlc3RzTmFtZXNPbmx5KCBjb25maWcgKTsKKyAgICAgICAgaWYoIGNvbmZpZy5saXN0VGFncygpICkKKyAgICAgICAgICAgIGxpc3RlZENvdW50ID0gbGlzdGVkQ291bnQudmFsdWVPcigwKSArIGxpc3RUYWdzKCBjb25maWcgKTsKKyAgICAgICAgaWYoIGNvbmZpZy5saXN0UmVwb3J0ZXJzKCkgKQorICAgICAgICAgICAgbGlzdGVkQ291bnQgPSBsaXN0ZWRDb3VudC52YWx1ZU9yKDApICsgbGlzdFJlcG9ydGVycyggY29uZmlnICk7CisgICAgICAgIHJldHVybiBsaXN0ZWRDb3VudDsKKyAgICB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogaW50ZXJuYWwvY2F0Y2hfcnVuX2NvbnRleHQuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9SVU5ORVJfSU1QTF9IUFBfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3Rlc3RfY2FzZV90cmFja2VyLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfVEVTVF9DQVNFX1RSQUNLRVJfSFBQX0lOQ0xVREVECisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzdGRleGNlcHQ+CisKK0NBVENIX0lOVEVSTkFMX1NVUFBSRVNTX0VURF9XQVJOSU5HUworCituYW1lc3BhY2UgQ2F0Y2ggeworbmFtZXNwYWNlIFRlc3RDYXNlVHJhY2tpbmcgeworCisgICAgc3RydWN0IE5hbWVBbmRMb2NhdGlvbiB7CisgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgICAgIFNvdXJjZUxpbmVJbmZvIGxvY2F0aW9uOworCisgICAgICAgIE5hbWVBbmRMb2NhdGlvbiggc3RkOjpzdHJpbmcgY29uc3QmIF9uYW1lLCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgX2xvY2F0aW9uICkKKyAgICAgICAgOiAgIG5hbWUoIF9uYW1lICksCisgICAgICAgICAgICBsb2NhdGlvbiggX2xvY2F0aW9uICkKKyAgICAgICAge30KKyAgICB9OworCisgICAgc3RydWN0IElUcmFja2VyIDogU2hhcmVkSW1wbDw+IHsKKyAgICAgICAgdmlydHVhbCB+SVRyYWNrZXIoKTsKKworICAgICAgICAvLyBzdGF0aWMgcXVlcmllcworICAgICAgICB2aXJ0dWFsIE5hbWVBbmRMb2NhdGlvbiBjb25zdCYgbmFtZUFuZExvY2F0aW9uKCkgY29uc3QgPSAwOworCisgICAgICAgIC8vIGR5bmFtaWMgcXVlcmllcworICAgICAgICB2aXJ0dWFsIGJvb2wgaXNDb21wbGV0ZSgpIGNvbnN0ID0gMDsgLy8gU3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZCBvciBmYWlsZWQKKyAgICAgICAgdmlydHVhbCBib29sIGlzU3VjY2Vzc2Z1bGx5Q29tcGxldGVkKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIGJvb2wgaXNPcGVuKCkgY29uc3QgPSAwOyAvLyBTdGFydGVkIGJ1dCBub3QgY29tcGxldGUKKyAgICAgICAgdmlydHVhbCBib29sIGhhc0NoaWxkcmVuKCkgY29uc3QgPSAwOworCisgICAgICAgIHZpcnR1YWwgSVRyYWNrZXImIHBhcmVudCgpID0gMDsKKworICAgICAgICAvLyBhY3Rpb25zCisgICAgICAgIHZpcnR1YWwgdm9pZCBjbG9zZSgpID0gMDsgLy8gU3VjY2Vzc2Z1bGx5IGNvbXBsZXRlCisgICAgICAgIHZpcnR1YWwgdm9pZCBmYWlsKCkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgbWFya0FzTmVlZGluZ0Fub3RoZXJSdW4oKSA9IDA7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGFkZENoaWxkKCBQdHI8SVRyYWNrZXI+IGNvbnN0JiBjaGlsZCApID0gMDsKKyAgICAgICAgdmlydHVhbCBJVHJhY2tlciogZmluZENoaWxkKCBOYW1lQW5kTG9jYXRpb24gY29uc3QmIG5hbWVBbmRMb2NhdGlvbiApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIG9wZW5DaGlsZCgpID0gMDsKKworICAgICAgICAvLyBEZWJ1Zy8gY2hlY2tpbmcKKyAgICAgICAgdmlydHVhbCBib29sIGlzU2VjdGlvblRyYWNrZXIoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgYm9vbCBpc0luZGV4VHJhY2tlcigpIGNvbnN0ID0gMDsKKyAgICB9OworCisgICAgY2xhc3MgIFRyYWNrZXJDb250ZXh0IHsKKworICAgICAgICBlbnVtIFJ1blN0YXRlIHsKKyAgICAgICAgICAgIE5vdFN0YXJ0ZWQsCisgICAgICAgICAgICBFeGVjdXRpbmcsCisgICAgICAgICAgICBDb21wbGV0ZWRDeWNsZQorICAgICAgICB9OworCisgICAgICAgIFB0cjxJVHJhY2tlcj4gbV9yb290VHJhY2tlcjsKKyAgICAgICAgSVRyYWNrZXIqIG1fY3VycmVudFRyYWNrZXI7CisgICAgICAgIFJ1blN0YXRlIG1fcnVuU3RhdGU7CisKKyAgICBwdWJsaWM6CisKKyAgICAgICAgc3RhdGljIFRyYWNrZXJDb250ZXh0JiBpbnN0YW5jZSgpIHsKKyAgICAgICAgICAgIHN0YXRpYyBUcmFja2VyQ29udGV4dCBzX2luc3RhbmNlOworICAgICAgICAgICAgcmV0dXJuIHNfaW5zdGFuY2U7CisgICAgICAgIH0KKworICAgICAgICBUcmFja2VyQ29udGV4dCgpCisgICAgICAgIDogICBtX2N1cnJlbnRUcmFja2VyKCBDQVRDSF9OVUxMICksCisgICAgICAgICAgICBtX3J1blN0YXRlKCBOb3RTdGFydGVkICkKKyAgICAgICAge30KKworICAgICAgICBJVHJhY2tlciYgc3RhcnRSdW4oKTsKKworICAgICAgICB2b2lkIGVuZFJ1bigpIHsKKyAgICAgICAgICAgIG1fcm9vdFRyYWNrZXIucmVzZXQoKTsKKyAgICAgICAgICAgIG1fY3VycmVudFRyYWNrZXIgPSBDQVRDSF9OVUxMOworICAgICAgICAgICAgbV9ydW5TdGF0ZSA9IE5vdFN0YXJ0ZWQ7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHN0YXJ0Q3ljbGUoKSB7CisgICAgICAgICAgICBtX2N1cnJlbnRUcmFja2VyID0gbV9yb290VHJhY2tlci5nZXQoKTsKKyAgICAgICAgICAgIG1fcnVuU3RhdGUgPSBFeGVjdXRpbmc7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBjb21wbGV0ZUN5Y2xlKCkgeworICAgICAgICAgICAgbV9ydW5TdGF0ZSA9IENvbXBsZXRlZEN5Y2xlOworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBjb21wbGV0ZWRDeWNsZSgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtX3J1blN0YXRlID09IENvbXBsZXRlZEN5Y2xlOworICAgICAgICB9CisgICAgICAgIElUcmFja2VyJiBjdXJyZW50VHJhY2tlcigpIHsKKyAgICAgICAgICAgIHJldHVybiAqbV9jdXJyZW50VHJhY2tlcjsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHNldEN1cnJlbnRUcmFja2VyKCBJVHJhY2tlciogdHJhY2tlciApIHsKKyAgICAgICAgICAgIG1fY3VycmVudFRyYWNrZXIgPSB0cmFja2VyOworICAgICAgICB9CisgICAgfTsKKworICAgIGNsYXNzIFRyYWNrZXJCYXNlIDogcHVibGljIElUcmFja2VyIHsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIGVudW0gQ3ljbGVTdGF0ZSB7CisgICAgICAgICAgICBOb3RTdGFydGVkLAorICAgICAgICAgICAgRXhlY3V0aW5nLAorICAgICAgICAgICAgRXhlY3V0aW5nQ2hpbGRyZW4sCisgICAgICAgICAgICBOZWVkc0Fub3RoZXJSdW4sCisgICAgICAgICAgICBDb21wbGV0ZWRTdWNjZXNzZnVsbHksCisgICAgICAgICAgICBGYWlsZWQKKyAgICAgICAgfTsKKyAgICAgICAgY2xhc3MgVHJhY2tlckhhc05hbWUgeworICAgICAgICAgICAgTmFtZUFuZExvY2F0aW9uIG1fbmFtZUFuZExvY2F0aW9uOworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBUcmFja2VySGFzTmFtZSggTmFtZUFuZExvY2F0aW9uIGNvbnN0JiBuYW1lQW5kTG9jYXRpb24gKSA6IG1fbmFtZUFuZExvY2F0aW9uKCBuYW1lQW5kTG9jYXRpb24gKSB7fQorICAgICAgICAgICAgYm9vbCBvcGVyYXRvciAoKSggUHRyPElUcmFja2VyPiBjb25zdCYgdHJhY2tlciApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICAgICAgdHJhY2tlci0+bmFtZUFuZExvY2F0aW9uKCkubmFtZSA9PSBtX25hbWVBbmRMb2NhdGlvbi5uYW1lICYmCisgICAgICAgICAgICAgICAgICAgIHRyYWNrZXItPm5hbWVBbmRMb2NhdGlvbigpLmxvY2F0aW9uID09IG1fbmFtZUFuZExvY2F0aW9uLmxvY2F0aW9uOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPFB0cjxJVHJhY2tlcj4gPiBDaGlsZHJlbjsKKyAgICAgICAgTmFtZUFuZExvY2F0aW9uIG1fbmFtZUFuZExvY2F0aW9uOworICAgICAgICBUcmFja2VyQ29udGV4dCYgbV9jdHg7CisgICAgICAgIElUcmFja2VyKiBtX3BhcmVudDsKKyAgICAgICAgQ2hpbGRyZW4gbV9jaGlsZHJlbjsKKyAgICAgICAgQ3ljbGVTdGF0ZSBtX3J1blN0YXRlOworICAgIHB1YmxpYzoKKyAgICAgICAgVHJhY2tlckJhc2UoIE5hbWVBbmRMb2NhdGlvbiBjb25zdCYgbmFtZUFuZExvY2F0aW9uLCBUcmFja2VyQ29udGV4dCYgY3R4LCBJVHJhY2tlciogcGFyZW50ICkKKyAgICAgICAgOiAgIG1fbmFtZUFuZExvY2F0aW9uKCBuYW1lQW5kTG9jYXRpb24gKSwKKyAgICAgICAgICAgIG1fY3R4KCBjdHggKSwKKyAgICAgICAgICAgIG1fcGFyZW50KCBwYXJlbnQgKSwKKyAgICAgICAgICAgIG1fcnVuU3RhdGUoIE5vdFN0YXJ0ZWQgKQorICAgICAgICB7fQorICAgICAgICB2aXJ0dWFsIH5UcmFja2VyQmFzZSgpOworCisgICAgICAgIHZpcnR1YWwgTmFtZUFuZExvY2F0aW9uIGNvbnN0JiBuYW1lQW5kTG9jYXRpb24oKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICByZXR1cm4gbV9uYW1lQW5kTG9jYXRpb247CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBib29sIGlzQ29tcGxldGUoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICByZXR1cm4gbV9ydW5TdGF0ZSA9PSBDb21wbGV0ZWRTdWNjZXNzZnVsbHkgfHwgbV9ydW5TdGF0ZSA9PSBGYWlsZWQ7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBib29sIGlzU3VjY2Vzc2Z1bGx5Q29tcGxldGVkKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgcmV0dXJuIG1fcnVuU3RhdGUgPT0gQ29tcGxldGVkU3VjY2Vzc2Z1bGx5OworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgYm9vbCBpc09wZW4oKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICByZXR1cm4gbV9ydW5TdGF0ZSAhPSBOb3RTdGFydGVkICYmICFpc0NvbXBsZXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBib29sIGhhc0NoaWxkcmVuKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgcmV0dXJuICFtX2NoaWxkcmVuLmVtcHR5KCk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgYWRkQ2hpbGQoIFB0cjxJVHJhY2tlcj4gY29uc3QmIGNoaWxkICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgbV9jaGlsZHJlbi5wdXNoX2JhY2soIGNoaWxkICk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIElUcmFja2VyKiBmaW5kQ2hpbGQoIE5hbWVBbmRMb2NhdGlvbiBjb25zdCYgbmFtZUFuZExvY2F0aW9uICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgQ2hpbGRyZW46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gc3RkOjpmaW5kX2lmKCBtX2NoaWxkcmVuLmJlZ2luKCksIG1fY2hpbGRyZW4uZW5kKCksIFRyYWNrZXJIYXNOYW1lKCBuYW1lQW5kTG9jYXRpb24gKSApOworICAgICAgICAgICAgcmV0dXJuKCBpdCAhPSBtX2NoaWxkcmVuLmVuZCgpICkKKyAgICAgICAgICAgICAgICA/IGl0LT5nZXQoKQorICAgICAgICAgICAgICAgIDogQ0FUQ0hfTlVMTDsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIElUcmFja2VyJiBwYXJlbnQoKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBhc3NlcnQoIG1fcGFyZW50ICk7IC8vIFNob3VsZCBhbHdheXMgYmUgbm9uLW51bGwgZXhjZXB0IGZvciByb290CisgICAgICAgICAgICByZXR1cm4gKm1fcGFyZW50OworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIG9wZW5DaGlsZCgpIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIGlmKCBtX3J1blN0YXRlICE9IEV4ZWN1dGluZ0NoaWxkcmVuICkgeworICAgICAgICAgICAgICAgIG1fcnVuU3RhdGUgPSBFeGVjdXRpbmdDaGlsZHJlbjsKKyAgICAgICAgICAgICAgICBpZiggbV9wYXJlbnQgKQorICAgICAgICAgICAgICAgICAgICBtX3BhcmVudC0+b3BlbkNoaWxkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIGJvb2wgaXNTZWN0aW9uVHJhY2tlcigpIGNvbnN0IENBVENIX09WRVJSSURFIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAgIHZpcnR1YWwgYm9vbCBpc0luZGV4VHJhY2tlcigpIGNvbnN0IENBVENIX09WRVJSSURFIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICAgICAgdm9pZCBvcGVuKCkgeworICAgICAgICAgICAgbV9ydW5TdGF0ZSA9IEV4ZWN1dGluZzsKKyAgICAgICAgICAgIG1vdmVUb1RoaXMoKTsKKyAgICAgICAgICAgIGlmKCBtX3BhcmVudCApCisgICAgICAgICAgICAgICAgbV9wYXJlbnQtPm9wZW5DaGlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGNsb3NlKCkgQ0FUQ0hfT1ZFUlJJREUgeworCisgICAgICAgICAgICAvLyBDbG9zZSBhbnkgc3RpbGwgb3BlbiBjaGlsZHJlbiAoZS5nLiBnZW5lcmF0b3JzKQorICAgICAgICAgICAgd2hpbGUoICZtX2N0eC5jdXJyZW50VHJhY2tlcigpICE9IHRoaXMgKQorICAgICAgICAgICAgICAgIG1fY3R4LmN1cnJlbnRUcmFja2VyKCkuY2xvc2UoKTsKKworICAgICAgICAgICAgc3dpdGNoKCBtX3J1blN0YXRlICkgeworICAgICAgICAgICAgICAgIGNhc2UgTm90U3RhcnRlZDoKKyAgICAgICAgICAgICAgICBjYXNlIENvbXBsZXRlZFN1Y2Nlc3NmdWxseToKKyAgICAgICAgICAgICAgICBjYXNlIEZhaWxlZDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3RkOjpsb2dpY19lcnJvciggIklsbG9naWNhbCBzdGF0ZSIgKTsKKworICAgICAgICAgICAgICAgIGNhc2UgTmVlZHNBbm90aGVyUnVuOgorICAgICAgICAgICAgICAgICAgICBicmVhazs7CisKKyAgICAgICAgICAgICAgICBjYXNlIEV4ZWN1dGluZzoKKyAgICAgICAgICAgICAgICAgICAgbV9ydW5TdGF0ZSA9IENvbXBsZXRlZFN1Y2Nlc3NmdWxseTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBFeGVjdXRpbmdDaGlsZHJlbjoKKyAgICAgICAgICAgICAgICAgICAgaWYoIG1fY2hpbGRyZW4uZW1wdHkoKSB8fCBtX2NoaWxkcmVuLmJhY2soKS0+aXNDb21wbGV0ZSgpICkKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fcnVuU3RhdGUgPSBDb21wbGV0ZWRTdWNjZXNzZnVsbHk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3RkOjpsb2dpY19lcnJvciggIlVuZXhwZWN0ZWQgc3RhdGUiICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtb3ZlVG9QYXJlbnQoKTsKKyAgICAgICAgICAgIG1fY3R4LmNvbXBsZXRlQ3ljbGUoKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgZmFpbCgpIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIG1fcnVuU3RhdGUgPSBGYWlsZWQ7CisgICAgICAgICAgICBpZiggbV9wYXJlbnQgKQorICAgICAgICAgICAgICAgIG1fcGFyZW50LT5tYXJrQXNOZWVkaW5nQW5vdGhlclJ1bigpOworICAgICAgICAgICAgbW92ZVRvUGFyZW50KCk7CisgICAgICAgICAgICBtX2N0eC5jb21wbGV0ZUN5Y2xlKCk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIG1hcmtBc05lZWRpbmdBbm90aGVyUnVuKCkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgbV9ydW5TdGF0ZSA9IE5lZWRzQW5vdGhlclJ1bjsKKyAgICAgICAgfQorICAgIHByaXZhdGU6CisgICAgICAgIHZvaWQgbW92ZVRvUGFyZW50KCkgeworICAgICAgICAgICAgYXNzZXJ0KCBtX3BhcmVudCApOworICAgICAgICAgICAgbV9jdHguc2V0Q3VycmVudFRyYWNrZXIoIG1fcGFyZW50ICk7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBtb3ZlVG9UaGlzKCkgeworICAgICAgICAgICAgbV9jdHguc2V0Q3VycmVudFRyYWNrZXIoIHRoaXMgKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBjbGFzcyBTZWN0aW9uVHJhY2tlciA6IHB1YmxpYyBUcmFja2VyQmFzZSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBtX2ZpbHRlcnM7CisgICAgcHVibGljOgorICAgICAgICBTZWN0aW9uVHJhY2tlciggTmFtZUFuZExvY2F0aW9uIGNvbnN0JiBuYW1lQW5kTG9jYXRpb24sIFRyYWNrZXJDb250ZXh0JiBjdHgsIElUcmFja2VyKiBwYXJlbnQgKQorICAgICAgICA6ICAgVHJhY2tlckJhc2UoIG5hbWVBbmRMb2NhdGlvbiwgY3R4LCBwYXJlbnQgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggcGFyZW50ICkgeworICAgICAgICAgICAgICAgIHdoaWxlKCAhcGFyZW50LT5pc1NlY3Rpb25UcmFja2VyKCkgKQorICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSAmcGFyZW50LT5wYXJlbnQoKTsKKworICAgICAgICAgICAgICAgIFNlY3Rpb25UcmFja2VyJiBwYXJlbnRTZWN0aW9uID0gc3RhdGljX2Nhc3Q8U2VjdGlvblRyYWNrZXImPiggKnBhcmVudCApOworICAgICAgICAgICAgICAgIGFkZE5leHRGaWx0ZXJzKCBwYXJlbnRTZWN0aW9uLm1fZmlsdGVycyApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgflNlY3Rpb25UcmFja2VyKCk7CisKKyAgICAgICAgdmlydHVhbCBib29sIGlzU2VjdGlvblRyYWNrZXIoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7IHJldHVybiB0cnVlOyB9CisKKyAgICAgICAgc3RhdGljIFNlY3Rpb25UcmFja2VyJiBhY3F1aXJlKCBUcmFja2VyQ29udGV4dCYgY3R4LCBOYW1lQW5kTG9jYXRpb24gY29uc3QmIG5hbWVBbmRMb2NhdGlvbiApIHsKKyAgICAgICAgICAgIFNlY3Rpb25UcmFja2VyKiBzZWN0aW9uID0gQ0FUQ0hfTlVMTDsKKworICAgICAgICAgICAgSVRyYWNrZXImIGN1cnJlbnRUcmFja2VyID0gY3R4LmN1cnJlbnRUcmFja2VyKCk7CisgICAgICAgICAgICBpZiggSVRyYWNrZXIqIGNoaWxkVHJhY2tlciA9IGN1cnJlbnRUcmFja2VyLmZpbmRDaGlsZCggbmFtZUFuZExvY2F0aW9uICkgKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0KCBjaGlsZFRyYWNrZXIgKTsKKyAgICAgICAgICAgICAgICBhc3NlcnQoIGNoaWxkVHJhY2tlci0+aXNTZWN0aW9uVHJhY2tlcigpICk7CisgICAgICAgICAgICAgICAgc2VjdGlvbiA9IHN0YXRpY19jYXN0PFNlY3Rpb25UcmFja2VyKj4oIGNoaWxkVHJhY2tlciApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgc2VjdGlvbiA9IG5ldyBTZWN0aW9uVHJhY2tlciggbmFtZUFuZExvY2F0aW9uLCBjdHgsICZjdXJyZW50VHJhY2tlciApOworICAgICAgICAgICAgICAgIGN1cnJlbnRUcmFja2VyLmFkZENoaWxkKCBzZWN0aW9uICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggIWN0eC5jb21wbGV0ZWRDeWNsZSgpICkKKyAgICAgICAgICAgICAgICBzZWN0aW9uLT50cnlPcGVuKCk7CisgICAgICAgICAgICByZXR1cm4gKnNlY3Rpb247CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHRyeU9wZW4oKSB7CisgICAgICAgICAgICBpZiggIWlzQ29tcGxldGUoKSAmJiAobV9maWx0ZXJzLmVtcHR5KCkgfHwgbV9maWx0ZXJzWzBdLmVtcHR5KCkgfHwgIG1fZmlsdGVyc1swXSA9PSBtX25hbWVBbmRMb2NhdGlvbi5uYW1lICkgKQorICAgICAgICAgICAgICAgIG9wZW4oKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgYWRkSW5pdGlhbEZpbHRlcnMoIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjb25zdCYgZmlsdGVycyApIHsKKyAgICAgICAgICAgIGlmKCAhZmlsdGVycy5lbXB0eSgpICkgeworICAgICAgICAgICAgICAgIG1fZmlsdGVycy5wdXNoX2JhY2soIiIpOyAvLyBSb290IC0gc2hvdWxkIG5ldmVyIGJlIGNvbnN1bHRlZAorICAgICAgICAgICAgICAgIG1fZmlsdGVycy5wdXNoX2JhY2soIiIpOyAvLyBUZXN0IENhc2UgLSBub3QgYSBzZWN0aW9uIGZpbHRlcgorICAgICAgICAgICAgICAgIG1fZmlsdGVycy5pbnNlcnQoIG1fZmlsdGVycy5lbmQoKSwgZmlsdGVycy5iZWdpbigpLCBmaWx0ZXJzLmVuZCgpICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBhZGROZXh0RmlsdGVycyggc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNvbnN0JiBmaWx0ZXJzICkgeworICAgICAgICAgICAgaWYoIGZpbHRlcnMuc2l6ZSgpID4gMSApCisgICAgICAgICAgICAgICAgbV9maWx0ZXJzLmluc2VydCggbV9maWx0ZXJzLmVuZCgpLCArK2ZpbHRlcnMuYmVnaW4oKSwgZmlsdGVycy5lbmQoKSApOworICAgICAgICB9CisgICAgfTsKKworICAgIGNsYXNzIEluZGV4VHJhY2tlciA6IHB1YmxpYyBUcmFja2VyQmFzZSB7CisgICAgICAgIGludCBtX3NpemU7CisgICAgICAgIGludCBtX2luZGV4OworICAgIHB1YmxpYzoKKyAgICAgICAgSW5kZXhUcmFja2VyKCBOYW1lQW5kTG9jYXRpb24gY29uc3QmIG5hbWVBbmRMb2NhdGlvbiwgVHJhY2tlckNvbnRleHQmIGN0eCwgSVRyYWNrZXIqIHBhcmVudCwgaW50IHNpemUgKQorICAgICAgICA6ICAgVHJhY2tlckJhc2UoIG5hbWVBbmRMb2NhdGlvbiwgY3R4LCBwYXJlbnQgKSwKKyAgICAgICAgICAgIG1fc2l6ZSggc2l6ZSApLAorICAgICAgICAgICAgbV9pbmRleCggLTEgKQorICAgICAgICB7fQorICAgICAgICB2aXJ0dWFsIH5JbmRleFRyYWNrZXIoKTsKKworICAgICAgICB2aXJ0dWFsIGJvb2wgaXNJbmRleFRyYWNrZXIoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7IHJldHVybiB0cnVlOyB9CisKKyAgICAgICAgc3RhdGljIEluZGV4VHJhY2tlciYgYWNxdWlyZSggVHJhY2tlckNvbnRleHQmIGN0eCwgTmFtZUFuZExvY2F0aW9uIGNvbnN0JiBuYW1lQW5kTG9jYXRpb24sIGludCBzaXplICkgeworICAgICAgICAgICAgSW5kZXhUcmFja2VyKiB0cmFja2VyID0gQ0FUQ0hfTlVMTDsKKworICAgICAgICAgICAgSVRyYWNrZXImIGN1cnJlbnRUcmFja2VyID0gY3R4LmN1cnJlbnRUcmFja2VyKCk7CisgICAgICAgICAgICBpZiggSVRyYWNrZXIqIGNoaWxkVHJhY2tlciA9IGN1cnJlbnRUcmFja2VyLmZpbmRDaGlsZCggbmFtZUFuZExvY2F0aW9uICkgKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0KCBjaGlsZFRyYWNrZXIgKTsKKyAgICAgICAgICAgICAgICBhc3NlcnQoIGNoaWxkVHJhY2tlci0+aXNJbmRleFRyYWNrZXIoKSApOworICAgICAgICAgICAgICAgIHRyYWNrZXIgPSBzdGF0aWNfY2FzdDxJbmRleFRyYWNrZXIqPiggY2hpbGRUcmFja2VyICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB0cmFja2VyID0gbmV3IEluZGV4VHJhY2tlciggbmFtZUFuZExvY2F0aW9uLCBjdHgsICZjdXJyZW50VHJhY2tlciwgc2l6ZSApOworICAgICAgICAgICAgICAgIGN1cnJlbnRUcmFja2VyLmFkZENoaWxkKCB0cmFja2VyICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCAhY3R4LmNvbXBsZXRlZEN5Y2xlKCkgJiYgIXRyYWNrZXItPmlzQ29tcGxldGUoKSApIHsKKyAgICAgICAgICAgICAgICBpZiggdHJhY2tlci0+bV9ydW5TdGF0ZSAhPSBFeGVjdXRpbmdDaGlsZHJlbiAmJiB0cmFja2VyLT5tX3J1blN0YXRlICE9IE5lZWRzQW5vdGhlclJ1biApCisgICAgICAgICAgICAgICAgICAgIHRyYWNrZXItPm1vdmVOZXh0KCk7CisgICAgICAgICAgICAgICAgdHJhY2tlci0+b3BlbigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gKnRyYWNrZXI7CisgICAgICAgIH0KKworICAgICAgICBpbnQgaW5kZXgoKSBjb25zdCB7IHJldHVybiBtX2luZGV4OyB9CisKKyAgICAgICAgdm9pZCBtb3ZlTmV4dCgpIHsKKyAgICAgICAgICAgIG1faW5kZXgrKzsKKyAgICAgICAgICAgIG1fY2hpbGRyZW4uY2xlYXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBjbG9zZSgpIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIFRyYWNrZXJCYXNlOjpjbG9zZSgpOworICAgICAgICAgICAgaWYoIG1fcnVuU3RhdGUgPT0gQ29tcGxldGVkU3VjY2Vzc2Z1bGx5ICYmIG1faW5kZXggPCBtX3NpemUtMSApCisgICAgICAgICAgICAgICAgbV9ydW5TdGF0ZSA9IEV4ZWN1dGluZzsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBpbmxpbmUgSVRyYWNrZXImIFRyYWNrZXJDb250ZXh0OjpzdGFydFJ1bigpIHsKKyAgICAgICAgbV9yb290VHJhY2tlciA9IG5ldyBTZWN0aW9uVHJhY2tlciggTmFtZUFuZExvY2F0aW9uKCAie3Jvb3R9IiwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8gKSwgKnRoaXMsIENBVENIX05VTEwgKTsKKyAgICAgICAgbV9jdXJyZW50VHJhY2tlciA9IENBVENIX05VTEw7CisgICAgICAgIG1fcnVuU3RhdGUgPSBFeGVjdXRpbmc7CisgICAgICAgIHJldHVybiAqbV9yb290VHJhY2tlcjsKKyAgICB9CisKK30gLy8gbmFtZXNwYWNlIFRlc3RDYXNlVHJhY2tpbmcKKwordXNpbmcgVGVzdENhc2VUcmFja2luZzo6SVRyYWNrZXI7Cit1c2luZyBUZXN0Q2FzZVRyYWNraW5nOjpUcmFja2VyQ29udGV4dDsKK3VzaW5nIFRlc3RDYXNlVHJhY2tpbmc6OlNlY3Rpb25UcmFja2VyOwordXNpbmcgVGVzdENhc2VUcmFja2luZzo6SW5kZXhUcmFja2VyOworCit9IC8vIG5hbWVzcGFjZSBDYXRjaAorCitDQVRDSF9JTlRFUk5BTF9VTlNVUFBSRVNTX0VURF9XQVJOSU5HUworCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfZmF0YWxfY29uZGl0aW9uLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfRkFUQUxfQ09ORElUSU9OX0hfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIC8vIFJlcG9ydCB0aGUgZXJyb3IgY29uZGl0aW9uCisgICAgaW5saW5lIHZvaWQgcmVwb3J0RmF0YWwoIHN0ZDo6c3RyaW5nIGNvbnN0JiBtZXNzYWdlICkgeworICAgICAgICBJQ29udGV4dCYgY29udGV4dCA9IENhdGNoOjpnZXRDdXJyZW50Q29udGV4dCgpOworICAgICAgICBJUmVzdWx0Q2FwdHVyZSogcmVzdWx0Q2FwdHVyZSA9IGNvbnRleHQuZ2V0UmVzdWx0Q2FwdHVyZSgpOworICAgICAgICByZXN1bHRDYXB0dXJlLT5oYW5kbGVGYXRhbEVycm9yQ29uZGl0aW9uKCBtZXNzYWdlICk7CisgICAgfQorCit9IC8vIG5hbWVzcGFjZSBDYXRjaAorCisjaWYgZGVmaW5lZCAoIENBVENIX1BMQVRGT1JNX1dJTkRPV1MgKSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3dpbmRvd3NfaF9wcm94eS5oCisKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1dJTkRPV1NfSF9QUk9YWV9IX0lOQ0xVREVECisKKyNpZmRlZiBDQVRDSF9ERUZJTkVTX05PTUlOTUFYCisjICBkZWZpbmUgTk9NSU5NQVgKKyNlbmRpZgorI2lmZGVmIENBVENIX0RFRklORVNfV0lOMzJfTEVBTl9BTkRfTUVBTgorIyAgZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KKyNlbmRpZgorCisjaWZkZWYgX19BRlhETEwKKyNpbmNsdWRlIDxBZnhXaW4uaD4KKyNlbHNlCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2VuZGlmCisKKyNpZmRlZiBDQVRDSF9ERUZJTkVTX05PTUlOTUFYCisjICB1bmRlZiBOT01JTk1BWAorI2VuZGlmCisjaWZkZWYgQ0FUQ0hfREVGSU5FU19XSU4zMl9MRUFOX0FORF9NRUFOCisjICB1bmRlZiBXSU4zMl9MRUFOX0FORF9NRUFOCisjZW5kaWYKKworCisjICBpZiAhZGVmaW5lZCAoIENBVENIX0NPTkZJR19XSU5ET1dTX1NFSCApCisKK25hbWVzcGFjZSBDYXRjaCB7CisgICAgc3RydWN0IEZhdGFsQ29uZGl0aW9uSGFuZGxlciB7CisgICAgICAgIHZvaWQgcmVzZXQoKSB7fQorICAgIH07Cit9CisKKyMgIGVsc2UgLy8gQ0FUQ0hfQ09ORklHX1dJTkRPV1NfU0VIIGlzIGRlZmluZWQKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBTaWduYWxEZWZzIHsgRFdPUkQgaWQ7IGNvbnN0IGNoYXIqIG5hbWU7IH07CisgICAgZXh0ZXJuIFNpZ25hbERlZnMgc2lnbmFsRGVmc1tdOworICAgIC8vIFRoZXJlIGlzIG5vIDEtMSBtYXBwaW5nIGJldHdlZW4gc2lnbmFscyBhbmQgd2luZG93cyBleGNlcHRpb25zLgorICAgIC8vIFdpbmRvd3MgY2FuIGVhc2lseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIFNPIGFuZCBTaWdTZWdWLAorICAgIC8vIGJ1dCBTaWdJbnQsIFNpZ1Rlcm0sIGV0YyBhcmUgaGFuZGxlZCBkaWZmZXJlbnRseS4KKyAgICBTaWduYWxEZWZzIHNpZ25hbERlZnNbXSA9IHsKKyAgICAgICAgeyBFWENFUFRJT05fSUxMRUdBTF9JTlNUUlVDVElPTiwgICJTSUdJTEwgLSBJbGxlZ2FsIGluc3RydWN0aW9uIHNpZ25hbCIgfSwKKyAgICAgICAgeyBFWENFUFRJT05fU1RBQ0tfT1ZFUkZMT1csICJTSUdTRUdWIC0gU3RhY2sgb3ZlcmZsb3ciIH0sCisgICAgICAgIHsgRVhDRVBUSU9OX0FDQ0VTU19WSU9MQVRJT04sICJTSUdTRUdWIC0gU2VnbWVudGF0aW9uIHZpb2xhdGlvbiBzaWduYWwiIH0sCisgICAgICAgIHsgRVhDRVBUSU9OX0lOVF9ESVZJREVfQllfWkVSTywgIkRpdmlkZSBieSB6ZXJvIGVycm9yIiB9LAorICAgIH07CisKKyAgICBzdHJ1Y3QgRmF0YWxDb25kaXRpb25IYW5kbGVyIHsKKworICAgICAgICBzdGF0aWMgTE9ORyBDQUxMQkFDSyBoYW5kbGVWZWN0b3JlZEV4Y2VwdGlvbihQRVhDRVBUSU9OX1BPSU5URVJTIEV4Y2VwdGlvbkluZm8pIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZW9mKHNpZ25hbERlZnMpIC8gc2l6ZW9mKFNpZ25hbERlZnMpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBpZiAoRXhjZXB0aW9uSW5mby0+RXhjZXB0aW9uUmVjb3JkLT5FeGNlcHRpb25Db2RlID09IHNpZ25hbERlZnNbaV0uaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVwb3J0RmF0YWwoc2lnbmFsRGVmc1tpXS5uYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBJZiBpdHMgbm90IGFuIGV4Y2VwdGlvbiB3ZSBjYXJlIGFib3V0LCBwYXNzIGl0IGFsb25nLgorICAgICAgICAgICAgLy8gVGhpcyBzdG9wcyB1cyBmcm9tIGVhdGluZyBkZWJ1Z2dlciBicmVha3MgZXRjLgorICAgICAgICAgICAgcmV0dXJuIEVYQ0VQVElPTl9DT05USU5VRV9TRUFSQ0g7CisgICAgICAgIH0KKworICAgICAgICBGYXRhbENvbmRpdGlvbkhhbmRsZXIoKSB7CisgICAgICAgICAgICBpc1NldCA9IHRydWU7CisgICAgICAgICAgICAvLyAzMmsgc2VlbXMgZW5vdWdoIGZvciBDYXRjaCB0byBoYW5kbGUgc3RhY2sgb3ZlcmZsb3csCisgICAgICAgICAgICAvLyBidXQgdGhlIHZhbHVlIHdhcyBmb3VuZCBleHBlcmltZW50YWxseSwgc28gdGhlcmUgaXMgbm8gc3Ryb25nIGd1YXJhbnRlZQorICAgICAgICAgICAgZ3VhcmFudGVlU2l6ZSA9IDMyICogMTAyNDsKKyAgICAgICAgICAgIGV4Y2VwdGlvbkhhbmRsZXJIYW5kbGUgPSBDQVRDSF9OVUxMOworICAgICAgICAgICAgLy8gUmVnaXN0ZXIgYXMgZmlyc3QgaGFuZGxlciBpbiBjdXJyZW50IGNoYWluCisgICAgICAgICAgICBleGNlcHRpb25IYW5kbGVySGFuZGxlID0gQWRkVmVjdG9yZWRFeGNlcHRpb25IYW5kbGVyKDEsIGhhbmRsZVZlY3RvcmVkRXhjZXB0aW9uKTsKKyAgICAgICAgICAgIC8vIFBhc3MgaW4gZ3VhcmFudGVlIHNpemUgdG8gYmUgZmlsbGVkCisgICAgICAgICAgICBTZXRUaHJlYWRTdGFja0d1YXJhbnRlZSgmZ3VhcmFudGVlU2l6ZSk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgdm9pZCByZXNldCgpIHsKKyAgICAgICAgICAgIGlmIChpc1NldCkgeworICAgICAgICAgICAgICAgIC8vIFVucmVnaXN0ZXIgaGFuZGxlciBhbmQgcmVzdG9yZSB0aGUgb2xkIGd1YXJhbnRlZQorICAgICAgICAgICAgICAgIFJlbW92ZVZlY3RvcmVkRXhjZXB0aW9uSGFuZGxlcihleGNlcHRpb25IYW5kbGVySGFuZGxlKTsKKyAgICAgICAgICAgICAgICBTZXRUaHJlYWRTdGFja0d1YXJhbnRlZSgmZ3VhcmFudGVlU2l6ZSk7CisgICAgICAgICAgICAgICAgZXhjZXB0aW9uSGFuZGxlckhhbmRsZSA9IENBVENIX05VTEw7CisgICAgICAgICAgICAgICAgaXNTZXQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIH5GYXRhbENvbmRpdGlvbkhhbmRsZXIoKSB7CisgICAgICAgICAgICByZXNldCgpOworICAgICAgICB9CisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RhdGljIGJvb2wgaXNTZXQ7CisgICAgICAgIHN0YXRpYyBVTE9ORyBndWFyYW50ZWVTaXplOworICAgICAgICBzdGF0aWMgUFZPSUQgZXhjZXB0aW9uSGFuZGxlckhhbmRsZTsKKyAgICB9OworCisgICAgYm9vbCBGYXRhbENvbmRpdGlvbkhhbmRsZXI6OmlzU2V0ID0gZmFsc2U7CisgICAgVUxPTkcgRmF0YWxDb25kaXRpb25IYW5kbGVyOjpndWFyYW50ZWVTaXplID0gMDsKKyAgICBQVk9JRCBGYXRhbENvbmRpdGlvbkhhbmRsZXI6OmV4Y2VwdGlvbkhhbmRsZXJIYW5kbGUgPSBDQVRDSF9OVUxMOworCit9IC8vIG5hbWVzcGFjZSBDYXRjaAorCisjICBlbmRpZiAvLyBDQVRDSF9DT05GSUdfV0lORE9XU19TRUgKKworI2Vsc2UgLy8gTm90IFdpbmRvd3MgLSBhc3N1bWVkIHRvIGJlIFBPU0lYIGNvbXBhdGlibGUgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworIyAgaWYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX1BPU0lYX1NJR05BTFMpCisKK25hbWVzcGFjZSBDYXRjaCB7CisgICAgc3RydWN0IEZhdGFsQ29uZGl0aW9uSGFuZGxlciB7CisgICAgICAgIHZvaWQgcmVzZXQoKSB7fQorICAgIH07Cit9CisKKyMgIGVsc2UgLy8gQ0FUQ0hfQ09ORklHX1BPU0lYX1NJR05BTFMgaXMgZGVmaW5lZAorCisjaW5jbHVkZSA8c2lnbmFsLmg+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdHJ1Y3QgU2lnbmFsRGVmcyB7CisgICAgICAgIGludCBpZDsKKyAgICAgICAgY29uc3QgY2hhciogbmFtZTsKKyAgICB9OworICAgIGV4dGVybiBTaWduYWxEZWZzIHNpZ25hbERlZnNbXTsKKyAgICBTaWduYWxEZWZzIHNpZ25hbERlZnNbXSA9IHsKKyAgICAgICAgICAgIHsgU0lHSU5ULCAgIlNJR0lOVCAtIFRlcm1pbmFsIGludGVycnVwdCBzaWduYWwiIH0sCisgICAgICAgICAgICB7IFNJR0lMTCwgICJTSUdJTEwgLSBJbGxlZ2FsIGluc3RydWN0aW9uIHNpZ25hbCIgfSwKKyAgICAgICAgICAgIHsgU0lHRlBFLCAgIlNJR0ZQRSAtIEZsb2F0aW5nIHBvaW50IGVycm9yIHNpZ25hbCIgfSwKKyAgICAgICAgICAgIHsgU0lHU0VHViwgIlNJR1NFR1YgLSBTZWdtZW50YXRpb24gdmlvbGF0aW9uIHNpZ25hbCIgfSwKKyAgICAgICAgICAgIHsgU0lHVEVSTSwgIlNJR1RFUk0gLSBUZXJtaW5hdGlvbiByZXF1ZXN0IHNpZ25hbCIgfSwKKyAgICAgICAgICAgIHsgU0lHQUJSVCwgIlNJR0FCUlQgLSBBYm9ydCAoYWJub3JtYWwgdGVybWluYXRpb24pIHNpZ25hbCIgfQorICAgIH07CisKKyAgICBzdHJ1Y3QgRmF0YWxDb25kaXRpb25IYW5kbGVyIHsKKworICAgICAgICBzdGF0aWMgYm9vbCBpc1NldDsKKyAgICAgICAgc3RhdGljIHN0cnVjdCBzaWdhY3Rpb24gb2xkU2lnQWN0aW9ucyBbc2l6ZW9mKHNpZ25hbERlZnMpL3NpemVvZihTaWduYWxEZWZzKV07CisgICAgICAgIHN0YXRpYyBzdGFja190IG9sZFNpZ1N0YWNrOworICAgICAgICBzdGF0aWMgY2hhciBhbHRTdGFja01lbVtTSUdTVEtTWl07CisKKyAgICAgICAgc3RhdGljIHZvaWQgaGFuZGxlU2lnbmFsKCBpbnQgc2lnICkgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSA9ICI8dW5rbm93biBzaWduYWw+IjsKKyAgICAgICAgICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBzaXplb2Yoc2lnbmFsRGVmcykgLyBzaXplb2YoU2lnbmFsRGVmcyk7ICsraSkgeworICAgICAgICAgICAgICAgIFNpZ25hbERlZnMgJmRlZiA9IHNpZ25hbERlZnNbaV07CisgICAgICAgICAgICAgICAgaWYgKHNpZyA9PSBkZWYuaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGRlZi5uYW1lOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXNldCgpOworICAgICAgICAgICAgcmVwb3J0RmF0YWwobmFtZSk7CisgICAgICAgICAgICByYWlzZSggc2lnICk7CisgICAgICAgIH0KKworICAgICAgICBGYXRhbENvbmRpdGlvbkhhbmRsZXIoKSB7CisgICAgICAgICAgICBpc1NldCA9IHRydWU7CisgICAgICAgICAgICBzdGFja190IHNpZ1N0YWNrOworICAgICAgICAgICAgc2lnU3RhY2suc3Nfc3AgPSBhbHRTdGFja01lbTsKKyAgICAgICAgICAgIHNpZ1N0YWNrLnNzX3NpemUgPSBTSUdTVEtTWjsKKyAgICAgICAgICAgIHNpZ1N0YWNrLnNzX2ZsYWdzID0gMDsKKyAgICAgICAgICAgIHNpZ2FsdHN0YWNrKCZzaWdTdGFjaywgJm9sZFNpZ1N0YWNrKTsKKyAgICAgICAgICAgIHN0cnVjdCBzaWdhY3Rpb24gc2EgPSB7IDAgfTsKKworICAgICAgICAgICAgc2Euc2FfaGFuZGxlciA9IGhhbmRsZVNpZ25hbDsKKyAgICAgICAgICAgIHNhLnNhX2ZsYWdzID0gU0FfT05TVEFDSzsKKyAgICAgICAgICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBzaXplb2Yoc2lnbmFsRGVmcykvc2l6ZW9mKFNpZ25hbERlZnMpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBzaWdhY3Rpb24oc2lnbmFsRGVmc1tpXS5pZCwgJnNhLCAmb2xkU2lnQWN0aW9uc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB+RmF0YWxDb25kaXRpb25IYW5kbGVyKCkgeworICAgICAgICAgICAgcmVzZXQoKTsKKyAgICAgICAgfQorICAgICAgICBzdGF0aWMgdm9pZCByZXNldCgpIHsKKyAgICAgICAgICAgIGlmKCBpc1NldCApIHsKKyAgICAgICAgICAgICAgICAvLyBTZXQgc2lnbmFscyBiYWNrIHRvIHByZXZpb3VzIHZhbHVlcyAtLSBob3BlZnVsbHkgbm9ib2R5IG92ZXJ3cm90ZSB0aGVtIGluIHRoZSBtZWFudGltZQorICAgICAgICAgICAgICAgIGZvciggc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBzaXplb2Yoc2lnbmFsRGVmcykvc2l6ZW9mKFNpZ25hbERlZnMpOyArK2kgKSB7CisgICAgICAgICAgICAgICAgICAgIHNpZ2FjdGlvbihzaWduYWxEZWZzW2ldLmlkLCAmb2xkU2lnQWN0aW9uc1tpXSwgQ0FUQ0hfTlVMTCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIFJldHVybiB0aGUgb2xkIHN0YWNrCisgICAgICAgICAgICAgICAgc2lnYWx0c3RhY2soJm9sZFNpZ1N0YWNrLCBDQVRDSF9OVUxMKTsKKyAgICAgICAgICAgICAgICBpc1NldCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIGJvb2wgRmF0YWxDb25kaXRpb25IYW5kbGVyOjppc1NldCA9IGZhbHNlOworICAgIHN0cnVjdCBzaWdhY3Rpb24gRmF0YWxDb25kaXRpb25IYW5kbGVyOjpvbGRTaWdBY3Rpb25zW3NpemVvZihzaWduYWxEZWZzKS9zaXplb2YoU2lnbmFsRGVmcyldID0ge307CisgICAgc3RhY2tfdCBGYXRhbENvbmRpdGlvbkhhbmRsZXI6Om9sZFNpZ1N0YWNrID0ge307CisgICAgY2hhciBGYXRhbENvbmRpdGlvbkhhbmRsZXI6OmFsdFN0YWNrTWVtW1NJR1NUS1NaXSA9IHt9OworCit9IC8vIG5hbWVzcGFjZSBDYXRjaAorCisjICBlbmRpZiAvLyBDQVRDSF9DT05GSUdfUE9TSVhfU0lHTkFMUworCisjZW5kaWYgLy8gbm90IFdpbmRvd3MKKworI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBjbGFzcyBTdHJlYW1SZWRpcmVjdCB7CisKKyAgICBwdWJsaWM6CisgICAgICAgIFN0cmVhbVJlZGlyZWN0KCBzdGQ6Om9zdHJlYW0mIHN0cmVhbSwgc3RkOjpzdHJpbmcmIHRhcmdldFN0cmluZyApCisgICAgICAgIDogICBtX3N0cmVhbSggc3RyZWFtICksCisgICAgICAgICAgICBtX3ByZXZCdWYoIHN0cmVhbS5yZGJ1ZigpICksCisgICAgICAgICAgICBtX3RhcmdldFN0cmluZyggdGFyZ2V0U3RyaW5nICkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyZWFtLnJkYnVmKCBtX29zcy5yZGJ1ZigpICk7CisgICAgICAgIH0KKworICAgICAgICB+U3RyZWFtUmVkaXJlY3QoKSB7CisgICAgICAgICAgICBtX3RhcmdldFN0cmluZyArPSBtX29zcy5zdHIoKTsKKyAgICAgICAgICAgIG1fc3RyZWFtLnJkYnVmKCBtX3ByZXZCdWYgKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjpvc3RyZWFtJiBtX3N0cmVhbTsKKyAgICAgICAgc3RkOjpzdHJlYW1idWYqIG1fcHJldkJ1ZjsKKyAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG1fb3NzOworICAgICAgICBzdGQ6OnN0cmluZyYgbV90YXJnZXRTdHJpbmc7CisgICAgfTsKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgY2xhc3MgUnVuQ29udGV4dCA6IHB1YmxpYyBJUmVzdWx0Q2FwdHVyZSwgcHVibGljIElSdW5uZXIgeworCisgICAgICAgIFJ1bkNvbnRleHQoIFJ1bkNvbnRleHQgY29uc3QmICk7CisgICAgICAgIHZvaWQgb3BlcmF0b3IgPSggUnVuQ29udGV4dCBjb25zdCYgKTsKKworICAgIHB1YmxpYzoKKworICAgICAgICBleHBsaWNpdCBSdW5Db250ZXh0KCBQdHI8SUNvbmZpZyBjb25zdD4gY29uc3QmIF9jb25maWcsIFB0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+IGNvbnN0JiByZXBvcnRlciApCisgICAgICAgIDogICBtX3J1bkluZm8oIF9jb25maWctPm5hbWUoKSApLAorICAgICAgICAgICAgbV9jb250ZXh0KCBnZXRDdXJyZW50TXV0YWJsZUNvbnRleHQoKSApLAorICAgICAgICAgICAgbV9hY3RpdmVUZXN0Q2FzZSggQ0FUQ0hfTlVMTCApLAorICAgICAgICAgICAgbV9jb25maWcoIF9jb25maWcgKSwKKyAgICAgICAgICAgIG1fcmVwb3J0ZXIoIHJlcG9ydGVyICksCisgICAgICAgICAgICBtX3Nob3VsZFJlcG9ydFVuZXhwZWN0ZWQgKCB0cnVlICkKKyAgICAgICAgeworICAgICAgICAgICAgbV9jb250ZXh0LnNldFJ1bm5lciggdGhpcyApOworICAgICAgICAgICAgbV9jb250ZXh0LnNldENvbmZpZyggbV9jb25maWcgKTsKKyAgICAgICAgICAgIG1fY29udGV4dC5zZXRSZXN1bHRDYXB0dXJlKCB0aGlzICk7CisgICAgICAgICAgICBtX3JlcG9ydGVyLT50ZXN0UnVuU3RhcnRpbmcoIG1fcnVuSW5mbyApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB+UnVuQ29udGV4dCgpIHsKKyAgICAgICAgICAgIG1fcmVwb3J0ZXItPnRlc3RSdW5FbmRlZCggVGVzdFJ1blN0YXRzKCBtX3J1bkluZm8sIG1fdG90YWxzLCBhYm9ydGluZygpICkgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgdGVzdEdyb3VwU3RhcnRpbmcoIHN0ZDo6c3RyaW5nIGNvbnN0JiB0ZXN0U3BlYywgc3RkOjpzaXplX3QgZ3JvdXBJbmRleCwgc3RkOjpzaXplX3QgZ3JvdXBzQ291bnQgKSB7CisgICAgICAgICAgICBtX3JlcG9ydGVyLT50ZXN0R3JvdXBTdGFydGluZyggR3JvdXBJbmZvKCB0ZXN0U3BlYywgZ3JvdXBJbmRleCwgZ3JvdXBzQ291bnQgKSApOworICAgICAgICB9CisgICAgICAgIHZvaWQgdGVzdEdyb3VwRW5kZWQoIHN0ZDo6c3RyaW5nIGNvbnN0JiB0ZXN0U3BlYywgVG90YWxzIGNvbnN0JiB0b3RhbHMsIHN0ZDo6c2l6ZV90IGdyb3VwSW5kZXgsIHN0ZDo6c2l6ZV90IGdyb3Vwc0NvdW50ICkgeworICAgICAgICAgICAgbV9yZXBvcnRlci0+dGVzdEdyb3VwRW5kZWQoIFRlc3RHcm91cFN0YXRzKCBHcm91cEluZm8oIHRlc3RTcGVjLCBncm91cEluZGV4LCBncm91cHNDb3VudCApLCB0b3RhbHMsIGFib3J0aW5nKCkgKSApOworICAgICAgICB9CisKKyAgICAgICAgVG90YWxzIHJ1blRlc3QoIFRlc3RDYXNlIGNvbnN0JiB0ZXN0Q2FzZSApIHsKKyAgICAgICAgICAgIFRvdGFscyBwcmV2VG90YWxzID0gbV90b3RhbHM7CisKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHJlZGlyZWN0ZWRDb3V0OworICAgICAgICAgICAgc3RkOjpzdHJpbmcgcmVkaXJlY3RlZENlcnI7CisKKyAgICAgICAgICAgIFRlc3RDYXNlSW5mbyB0ZXN0SW5mbyA9IHRlc3RDYXNlLmdldFRlc3RDYXNlSW5mbygpOworCisgICAgICAgICAgICBtX3JlcG9ydGVyLT50ZXN0Q2FzZVN0YXJ0aW5nKCB0ZXN0SW5mbyApOworCisgICAgICAgICAgICBtX2FjdGl2ZVRlc3RDYXNlID0gJnRlc3RDYXNlOworCisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgSVRyYWNrZXImIHJvb3RUcmFja2VyID0gbV90cmFja2VyQ29udGV4dC5zdGFydFJ1bigpOworICAgICAgICAgICAgICAgIGFzc2VydCggcm9vdFRyYWNrZXIuaXNTZWN0aW9uVHJhY2tlcigpICk7CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8U2VjdGlvblRyYWNrZXImPiggcm9vdFRyYWNrZXIgKS5hZGRJbml0aWFsRmlsdGVycyggbV9jb25maWctPmdldFNlY3Rpb25zVG9SdW4oKSApOworICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgbV90cmFja2VyQ29udGV4dC5zdGFydEN5Y2xlKCk7CisgICAgICAgICAgICAgICAgICAgIG1fdGVzdENhc2VUcmFja2VyID0gJlNlY3Rpb25UcmFja2VyOjphY3F1aXJlKCBtX3RyYWNrZXJDb250ZXh0LCBUZXN0Q2FzZVRyYWNraW5nOjpOYW1lQW5kTG9jYXRpb24oIHRlc3RJbmZvLm5hbWUsIHRlc3RJbmZvLmxpbmVJbmZvICkgKTsKKyAgICAgICAgICAgICAgICAgICAgcnVuQ3VycmVudFRlc3QoIHJlZGlyZWN0ZWRDb3V0LCByZWRpcmVjdGVkQ2VyciApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3aGlsZSggIW1fdGVzdENhc2VUcmFja2VyLT5pc1N1Y2Nlc3NmdWxseUNvbXBsZXRlZCgpICYmICFhYm9ydGluZygpICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAhVEJEOiBkZXByZWNhdGVkIC0gdGhpcyB3aWxsIGJlIHJlcGxhY2VkIGJ5IGluZGV4ZWQgdHJhY2tlcnMKKyAgICAgICAgICAgIHdoaWxlKCBnZXRDdXJyZW50Q29udGV4dCgpLmFkdmFuY2VHZW5lcmF0b3JzRm9yQ3VycmVudFRlc3QoKSAmJiAhYWJvcnRpbmcoKSApOworCisgICAgICAgICAgICBUb3RhbHMgZGVsdGFUb3RhbHMgPSBtX3RvdGFscy5kZWx0YSggcHJldlRvdGFscyApOworICAgICAgICAgICAgaWYoIHRlc3RJbmZvLmV4cGVjdGVkVG9GYWlsKCkgJiYgZGVsdGFUb3RhbHMudGVzdENhc2VzLnBhc3NlZCA+IDAgKSB7CisgICAgICAgICAgICAgICAgZGVsdGFUb3RhbHMuYXNzZXJ0aW9ucy5mYWlsZWQrKzsKKyAgICAgICAgICAgICAgICBkZWx0YVRvdGFscy50ZXN0Q2FzZXMucGFzc2VkLS07CisgICAgICAgICAgICAgICAgZGVsdGFUb3RhbHMudGVzdENhc2VzLmZhaWxlZCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbV90b3RhbHMudGVzdENhc2VzICs9IGRlbHRhVG90YWxzLnRlc3RDYXNlczsKKyAgICAgICAgICAgIG1fcmVwb3J0ZXItPnRlc3RDYXNlRW5kZWQoIFRlc3RDYXNlU3RhdHMoICAgdGVzdEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhVG90YWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdGVkQ291dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RlZENlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0aW5nKCkgKSApOworCisgICAgICAgICAgICBtX2FjdGl2ZVRlc3RDYXNlID0gQ0FUQ0hfTlVMTDsKKyAgICAgICAgICAgIG1fdGVzdENhc2VUcmFja2VyID0gQ0FUQ0hfTlVMTDsKKworICAgICAgICAgICAgcmV0dXJuIGRlbHRhVG90YWxzOworICAgICAgICB9CisKKyAgICAgICAgUHRyPElDb25maWcgY29uc3Q+IGNvbmZpZygpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtX2NvbmZpZzsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZTogLy8gSVJlc3VsdENhcHR1cmUKKworICAgICAgICB2aXJ0dWFsIHZvaWQgYXNzZXJ0aW9uRW5kZWQoIEFzc2VydGlvblJlc3VsdCBjb25zdCYgcmVzdWx0ICkgeworICAgICAgICAgICAgaWYoIHJlc3VsdC5nZXRSZXN1bHRUeXBlKCkgPT0gUmVzdWx0V2FzOjpPayApIHsKKyAgICAgICAgICAgICAgICBtX3RvdGFscy5hc3NlcnRpb25zLnBhc3NlZCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggIXJlc3VsdC5pc09rKCkgKSB7CisgICAgICAgICAgICAgICAgbV90b3RhbHMuYXNzZXJ0aW9ucy5mYWlsZWQrKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gV2UgaGF2ZSBubyB1c2UgZm9yIHRoZSByZXR1cm4gdmFsdWUgKHdoZXRoZXIgbWVzc2FnZXMgc2hvdWxkIGJlIGNsZWFyZWQpLCBiZWNhdXNlIG1lc3NhZ2VzIHdlcmUgbWFkZSBzY29wZWQKKyAgICAgICAgICAgIC8vIGFuZCBzaG91bGQgYmUgbGV0IHRvIGNsZWFyIHRoZW1zZWx2ZXMgb3V0LgorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dm9pZD4obV9yZXBvcnRlci0+YXNzZXJ0aW9uRW5kZWQoQXNzZXJ0aW9uU3RhdHMocmVzdWx0LCBtX21lc3NhZ2VzLCBtX3RvdGFscykpKTsKKworICAgICAgICAgICAgLy8gUmVzZXQgd29ya2luZyBzdGF0ZQorICAgICAgICAgICAgbV9sYXN0QXNzZXJ0aW9uSW5mbyA9IEFzc2VydGlvbkluZm8oIHN0ZDo6c3RyaW5nKCksIG1fbGFzdEFzc2VydGlvbkluZm8ubGluZUluZm8sICJ7VW5rbm93biBleHByZXNzaW9uIGFmdGVyIHRoZSByZXBvcnRlZCBsaW5lfSIgLCBtX2xhc3RBc3NlcnRpb25JbmZvLnJlc3VsdERpc3Bvc2l0aW9uICk7CisgICAgICAgICAgICBtX2xhc3RSZXN1bHQgPSByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIGJvb2wgc2VjdGlvblN0YXJ0ZWQgKAorICAgICAgICAgICAgU2VjdGlvbkluZm8gY29uc3QmIHNlY3Rpb25JbmZvLAorICAgICAgICAgICAgQ291bnRzJiBhc3NlcnRpb25zCisgICAgICAgICkKKyAgICAgICAgeworICAgICAgICAgICAgSVRyYWNrZXImIHNlY3Rpb25UcmFja2VyID0gU2VjdGlvblRyYWNrZXI6OmFjcXVpcmUoIG1fdHJhY2tlckNvbnRleHQsIFRlc3RDYXNlVHJhY2tpbmc6Ok5hbWVBbmRMb2NhdGlvbiggc2VjdGlvbkluZm8ubmFtZSwgc2VjdGlvbkluZm8ubGluZUluZm8gKSApOworICAgICAgICAgICAgaWYoICFzZWN0aW9uVHJhY2tlci5pc09wZW4oKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgbV9hY3RpdmVTZWN0aW9ucy5wdXNoX2JhY2soICZzZWN0aW9uVHJhY2tlciApOworCisgICAgICAgICAgICBtX2xhc3RBc3NlcnRpb25JbmZvLmxpbmVJbmZvID0gc2VjdGlvbkluZm8ubGluZUluZm87CisKKyAgICAgICAgICAgIG1fcmVwb3J0ZXItPnNlY3Rpb25TdGFydGluZyggc2VjdGlvbkluZm8gKTsKKworICAgICAgICAgICAgYXNzZXJ0aW9ucyA9IG1fdG90YWxzLmFzc2VydGlvbnM7CisKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGJvb2wgdGVzdEZvck1pc3NpbmdBc3NlcnRpb25zKCBDb3VudHMmIGFzc2VydGlvbnMgKSB7CisgICAgICAgICAgICBpZiggYXNzZXJ0aW9ucy50b3RhbCgpICE9IDAgKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmKCAhbV9jb25maWctPndhcm5BYm91dE1pc3NpbmdBc3NlcnRpb25zKCkgKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmKCBtX3RyYWNrZXJDb250ZXh0LmN1cnJlbnRUcmFja2VyKCkuaGFzQ2hpbGRyZW4oKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgbV90b3RhbHMuYXNzZXJ0aW9ucy5mYWlsZWQrKzsKKyAgICAgICAgICAgIGFzc2VydGlvbnMuZmFpbGVkKys7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uRW5kZWQoIFNlY3Rpb25FbmRJbmZvIGNvbnN0JiBlbmRJbmZvICkgeworICAgICAgICAgICAgQ291bnRzIGFzc2VydGlvbnMgPSBtX3RvdGFscy5hc3NlcnRpb25zIC0gZW5kSW5mby5wcmV2QXNzZXJ0aW9uczsKKyAgICAgICAgICAgIGJvb2wgbWlzc2luZ0Fzc2VydGlvbnMgPSB0ZXN0Rm9yTWlzc2luZ0Fzc2VydGlvbnMoIGFzc2VydGlvbnMgKTsKKworICAgICAgICAgICAgaWYoICFtX2FjdGl2ZVNlY3Rpb25zLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAgICAgbV9hY3RpdmVTZWN0aW9ucy5iYWNrKCktPmNsb3NlKCk7CisgICAgICAgICAgICAgICAgbV9hY3RpdmVTZWN0aW9ucy5wb3BfYmFjaygpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtX3JlcG9ydGVyLT5zZWN0aW9uRW5kZWQoIFNlY3Rpb25TdGF0cyggZW5kSW5mby5zZWN0aW9uSW5mbywgYXNzZXJ0aW9ucywgZW5kSW5mby5kdXJhdGlvbkluU2Vjb25kcywgbWlzc2luZ0Fzc2VydGlvbnMgKSApOworICAgICAgICAgICAgbV9tZXNzYWdlcy5jbGVhcigpOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHNlY3Rpb25FbmRlZEVhcmx5KCBTZWN0aW9uRW5kSW5mbyBjb25zdCYgZW5kSW5mbyApIHsKKyAgICAgICAgICAgIGlmKCBtX3VuZmluaXNoZWRTZWN0aW9ucy5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICBtX2FjdGl2ZVNlY3Rpb25zLmJhY2soKS0+ZmFpbCgpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG1fYWN0aXZlU2VjdGlvbnMuYmFjaygpLT5jbG9zZSgpOworICAgICAgICAgICAgbV9hY3RpdmVTZWN0aW9ucy5wb3BfYmFjaygpOworCisgICAgICAgICAgICBtX3VuZmluaXNoZWRTZWN0aW9ucy5wdXNoX2JhY2soIGVuZEluZm8gKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBwdXNoU2NvcGVkTWVzc2FnZSggTWVzc2FnZUluZm8gY29uc3QmIG1lc3NhZ2UgKSB7CisgICAgICAgICAgICBtX21lc3NhZ2VzLnB1c2hfYmFjayggbWVzc2FnZSApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHBvcFNjb3BlZE1lc3NhZ2UoIE1lc3NhZ2VJbmZvIGNvbnN0JiBtZXNzYWdlICkgeworICAgICAgICAgICAgbV9tZXNzYWdlcy5lcmFzZSggc3RkOjpyZW1vdmUoIG1fbWVzc2FnZXMuYmVnaW4oKSwgbV9tZXNzYWdlcy5lbmQoKSwgbWVzc2FnZSApLCBtX21lc3NhZ2VzLmVuZCgpICk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldEN1cnJlbnRUZXN0TmFtZSgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtX2FjdGl2ZVRlc3RDYXNlCisgICAgICAgICAgICAgICAgPyBtX2FjdGl2ZVRlc3RDYXNlLT5nZXRUZXN0Q2FzZUluZm8oKS5uYW1lCisgICAgICAgICAgICAgICAgOiBzdGQ6OnN0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCBjb25zdCBBc3NlcnRpb25SZXN1bHQqIGdldExhc3RSZXN1bHQoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gJm1fbGFzdFJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBleGNlcHRpb25FYXJseVJlcG9ydGVkKCkgeworICAgICAgICAgICAgbV9zaG91bGRSZXBvcnRVbmV4cGVjdGVkID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgaGFuZGxlRmF0YWxFcnJvckNvbmRpdGlvbiggc3RkOjpzdHJpbmcgY29uc3QmIG1lc3NhZ2UgKSB7CisgICAgICAgICAgICAvLyBEb24ndCByZWJ1aWxkIHRoZSByZXN1bHQgLS0gdGhlIHN0cmluZ2lmaWNhdGlvbiBpdHNlbGYgY2FuIGNhdXNlIG1vcmUgZmF0YWwgZXJyb3JzCisgICAgICAgICAgICAvLyBJbnN0ZWFkLCBmYWtlIGEgcmVzdWx0IGRhdGEuCisgICAgICAgICAgICBBc3NlcnRpb25SZXN1bHREYXRhIHRlbXBSZXN1bHQ7CisgICAgICAgICAgICB0ZW1wUmVzdWx0LnJlc3VsdFR5cGUgPSBSZXN1bHRXYXM6OkZhdGFsRXJyb3JDb25kaXRpb247CisgICAgICAgICAgICB0ZW1wUmVzdWx0Lm1lc3NhZ2UgPSBtZXNzYWdlOworICAgICAgICAgICAgQXNzZXJ0aW9uUmVzdWx0IHJlc3VsdChtX2xhc3RBc3NlcnRpb25JbmZvLCB0ZW1wUmVzdWx0KTsKKworICAgICAgICAgICAgZ2V0UmVzdWx0Q2FwdHVyZSgpLmFzc2VydGlvbkVuZGVkKHJlc3VsdCk7CisKKyAgICAgICAgICAgIGhhbmRsZVVuZmluaXNoZWRTZWN0aW9ucygpOworCisgICAgICAgICAgICAvLyBSZWNyZWF0ZSBzZWN0aW9uIGZvciB0ZXN0IGNhc2UgKGFzIHdlIHdpbGwgbG9zZSB0aGUgb25lIHRoYXQgd2FzIGluIHNjb3BlKQorICAgICAgICAgICAgVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0Q2FzZUluZm8gPSBtX2FjdGl2ZVRlc3RDYXNlLT5nZXRUZXN0Q2FzZUluZm8oKTsKKyAgICAgICAgICAgIFNlY3Rpb25JbmZvIHRlc3RDYXNlU2VjdGlvbiggdGVzdENhc2VJbmZvLmxpbmVJbmZvLCB0ZXN0Q2FzZUluZm8ubmFtZSwgdGVzdENhc2VJbmZvLmRlc2NyaXB0aW9uICk7CisKKyAgICAgICAgICAgIENvdW50cyBhc3NlcnRpb25zOworICAgICAgICAgICAgYXNzZXJ0aW9ucy5mYWlsZWQgPSAxOworICAgICAgICAgICAgU2VjdGlvblN0YXRzIHRlc3RDYXNlU2VjdGlvblN0YXRzKCB0ZXN0Q2FzZVNlY3Rpb24sIGFzc2VydGlvbnMsIDAsIGZhbHNlICk7CisgICAgICAgICAgICBtX3JlcG9ydGVyLT5zZWN0aW9uRW5kZWQoIHRlc3RDYXNlU2VjdGlvblN0YXRzICk7CisKKyAgICAgICAgICAgIFRlc3RDYXNlSW5mbyB0ZXN0SW5mbyA9IG1fYWN0aXZlVGVzdENhc2UtPmdldFRlc3RDYXNlSW5mbygpOworCisgICAgICAgICAgICBUb3RhbHMgZGVsdGFUb3RhbHM7CisgICAgICAgICAgICBkZWx0YVRvdGFscy50ZXN0Q2FzZXMuZmFpbGVkID0gMTsKKyAgICAgICAgICAgIG1fcmVwb3J0ZXItPnRlc3RDYXNlRW5kZWQoIFRlc3RDYXNlU3RhdHMoICAgdGVzdEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhVG90YWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSApICk7CisgICAgICAgICAgICBtX3RvdGFscy50ZXN0Q2FzZXMuZmFpbGVkKys7CisgICAgICAgICAgICB0ZXN0R3JvdXBFbmRlZCggc3RkOjpzdHJpbmcoKSwgbV90b3RhbHMsIDEsIDEgKTsKKyAgICAgICAgICAgIG1fcmVwb3J0ZXItPnRlc3RSdW5FbmRlZCggVGVzdFJ1blN0YXRzKCBtX3J1bkluZm8sIG1fdG90YWxzLCBmYWxzZSApICk7CisgICAgICAgIH0KKworICAgIHB1YmxpYzoKKyAgICAgICAgLy8gIVRCRCBXZSBuZWVkIHRvIGRvIHRoaXMgYW5vdGhlciB3YXkhCisgICAgICAgIGJvb2wgYWJvcnRpbmcoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbV90b3RhbHMuYXNzZXJ0aW9ucy5mYWlsZWQgPT0gc3RhdGljX2Nhc3Q8c3RkOjpzaXplX3Q+KCBtX2NvbmZpZy0+YWJvcnRBZnRlcigpICk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisKKyAgICAgICAgdm9pZCBydW5DdXJyZW50VGVzdCggc3RkOjpzdHJpbmcmIHJlZGlyZWN0ZWRDb3V0LCBzdGQ6OnN0cmluZyYgcmVkaXJlY3RlZENlcnIgKSB7CisgICAgICAgICAgICBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RDYXNlSW5mbyA9IG1fYWN0aXZlVGVzdENhc2UtPmdldFRlc3RDYXNlSW5mbygpOworICAgICAgICAgICAgU2VjdGlvbkluZm8gdGVzdENhc2VTZWN0aW9uKCB0ZXN0Q2FzZUluZm8ubGluZUluZm8sIHRlc3RDYXNlSW5mby5uYW1lLCB0ZXN0Q2FzZUluZm8uZGVzY3JpcHRpb24gKTsKKyAgICAgICAgICAgIG1fcmVwb3J0ZXItPnNlY3Rpb25TdGFydGluZyggdGVzdENhc2VTZWN0aW9uICk7CisgICAgICAgICAgICBDb3VudHMgcHJldkFzc2VydGlvbnMgPSBtX3RvdGFscy5hc3NlcnRpb25zOworICAgICAgICAgICAgZG91YmxlIGR1cmF0aW9uID0gMDsKKyAgICAgICAgICAgIG1fc2hvdWxkUmVwb3J0VW5leHBlY3RlZCA9IHRydWU7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1fbGFzdEFzc2VydGlvbkluZm8gPSBBc3NlcnRpb25JbmZvKCAiVEVTVF9DQVNFIiwgdGVzdENhc2VJbmZvLmxpbmVJbmZvLCBzdGQ6OnN0cmluZygpLCBSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsICk7CisKKyAgICAgICAgICAgICAgICBzZWVkUm5nKCAqbV9jb25maWcgKTsKKworICAgICAgICAgICAgICAgIFRpbWVyIHRpbWVyOworICAgICAgICAgICAgICAgIHRpbWVyLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgaWYoIG1fcmVwb3J0ZXItPmdldFByZWZlcmVuY2VzKCkuc2hvdWxkUmVkaXJlY3RTdGRPdXQgKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmVhbVJlZGlyZWN0IGNvdXRSZWRpciggQ2F0Y2g6OmNvdXQoKSwgcmVkaXJlY3RlZENvdXQgKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyZWFtUmVkaXJlY3QgY2VyclJlZGlyKCBDYXRjaDo6Y2VycigpLCByZWRpcmVjdGVkQ2VyciApOworICAgICAgICAgICAgICAgICAgICBpbnZva2VBY3RpdmVUZXN0Q2FzZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaW52b2tlQWN0aXZlVGVzdENhc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZHVyYXRpb24gPSB0aW1lci5nZXRFbGFwc2VkU2Vjb25kcygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2goIFRlc3RGYWlsdXJlRXhjZXB0aW9uJiApIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGp1c3QgbWVhbnMgdGhlIHRlc3Qgd2FzIGFib3J0ZWQgZHVlIHRvIGZhaWx1cmUKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoKC4uLikgeworICAgICAgICAgICAgICAgIC8vIFVuZGVyIENBVENIX0NPTkZJR19GQVNUX0NPTVBJTEUsIHVuZXhwZWN0ZWQgZXhjZXB0aW9ucyB1bmRlciBSRVFVSVJFIGFzc2VydGlvbnMKKyAgICAgICAgICAgICAgICAvLyBhcmUgcmVwb3J0ZWQgd2l0aG91dCB0cmFuc2xhdGlvbiBhdCB0aGUgcG9pbnQgb2Ygb3JpZ2luLgorICAgICAgICAgICAgICAgIGlmIChtX3Nob3VsZFJlcG9ydFVuZXhwZWN0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgbWFrZVVuZXhwZWN0ZWRSZXN1bHRCdWlsZGVyKCkudXNlQWN0aXZlRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbV90ZXN0Q2FzZVRyYWNrZXItPmNsb3NlKCk7CisgICAgICAgICAgICBoYW5kbGVVbmZpbmlzaGVkU2VjdGlvbnMoKTsKKyAgICAgICAgICAgIG1fbWVzc2FnZXMuY2xlYXIoKTsKKworICAgICAgICAgICAgQ291bnRzIGFzc2VydGlvbnMgPSBtX3RvdGFscy5hc3NlcnRpb25zIC0gcHJldkFzc2VydGlvbnM7CisgICAgICAgICAgICBib29sIG1pc3NpbmdBc3NlcnRpb25zID0gdGVzdEZvck1pc3NpbmdBc3NlcnRpb25zKCBhc3NlcnRpb25zICk7CisKKyAgICAgICAgICAgIGlmKCB0ZXN0Q2FzZUluZm8ub2tUb0ZhaWwoKSApIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnN3YXAoIGFzc2VydGlvbnMuZmFpbGVkQnV0T2ssIGFzc2VydGlvbnMuZmFpbGVkICk7CisgICAgICAgICAgICAgICAgbV90b3RhbHMuYXNzZXJ0aW9ucy5mYWlsZWQgLT0gYXNzZXJ0aW9ucy5mYWlsZWRCdXRPazsKKyAgICAgICAgICAgICAgICBtX3RvdGFscy5hc3NlcnRpb25zLmZhaWxlZEJ1dE9rICs9IGFzc2VydGlvbnMuZmFpbGVkQnV0T2s7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNlY3Rpb25TdGF0cyB0ZXN0Q2FzZVNlY3Rpb25TdGF0cyggdGVzdENhc2VTZWN0aW9uLCBhc3NlcnRpb25zLCBkdXJhdGlvbiwgbWlzc2luZ0Fzc2VydGlvbnMgKTsKKyAgICAgICAgICAgIG1fcmVwb3J0ZXItPnNlY3Rpb25FbmRlZCggdGVzdENhc2VTZWN0aW9uU3RhdHMgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgaW52b2tlQWN0aXZlVGVzdENhc2UoKSB7CisgICAgICAgICAgICBGYXRhbENvbmRpdGlvbkhhbmRsZXIgZmF0YWxDb25kaXRpb25IYW5kbGVyOyAvLyBIYW5kbGUgc2lnbmFscworICAgICAgICAgICAgbV9hY3RpdmVUZXN0Q2FzZS0+aW52b2tlKCk7CisgICAgICAgICAgICBmYXRhbENvbmRpdGlvbkhhbmRsZXIucmVzZXQoKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKworICAgICAgICBSZXN1bHRCdWlsZGVyIG1ha2VVbmV4cGVjdGVkUmVzdWx0QnVpbGRlcigpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRCdWlsZGVyKCAgIG1fbGFzdEFzc2VydGlvbkluZm8ubWFjcm9OYW1lLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2xhc3RBc3NlcnRpb25JbmZvLmxpbmVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9sYXN0QXNzZXJ0aW9uSW5mby5jYXB0dXJlZEV4cHJlc3Npb24uY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fbGFzdEFzc2VydGlvbkluZm8ucmVzdWx0RGlzcG9zaXRpb24gKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgaGFuZGxlVW5maW5pc2hlZFNlY3Rpb25zKCkgeworICAgICAgICAgICAgLy8gSWYgc2VjdGlvbnMgZW5kZWQgcHJlbWF0dXJlbHkgZHVlIHRvIGFuIGV4Y2VwdGlvbiB3ZSBzdG9yZWQgdGhlaXIKKyAgICAgICAgICAgIC8vIGluZm9zIGhlcmUgc28gd2UgY2FuIHRlYXIgdGhlbSBkb3duIG91dHNpZGUgdGhlIHVud2luZCBwcm9jZXNzLgorICAgICAgICAgICAgZm9yKCBzdGQ6OnZlY3RvcjxTZWN0aW9uRW5kSW5mbz46OmNvbnN0X3JldmVyc2VfaXRlcmF0b3IgaXQgPSBtX3VuZmluaXNoZWRTZWN0aW9ucy5yYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0RW5kID0gbV91bmZpbmlzaGVkU2VjdGlvbnMucmVuZCgpOworICAgICAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICAgICAgc2VjdGlvbkVuZGVkKCAqaXQgKTsKKyAgICAgICAgICAgIG1fdW5maW5pc2hlZFNlY3Rpb25zLmNsZWFyKCk7CisgICAgICAgIH0KKworICAgICAgICBUZXN0UnVuSW5mbyBtX3J1bkluZm87CisgICAgICAgIElNdXRhYmxlQ29udGV4dCYgbV9jb250ZXh0OworICAgICAgICBUZXN0Q2FzZSBjb25zdCogbV9hY3RpdmVUZXN0Q2FzZTsKKyAgICAgICAgSVRyYWNrZXIqIG1fdGVzdENhc2VUcmFja2VyOworICAgICAgICBJVHJhY2tlciogbV9jdXJyZW50U2VjdGlvblRyYWNrZXI7CisgICAgICAgIEFzc2VydGlvblJlc3VsdCBtX2xhc3RSZXN1bHQ7CisKKyAgICAgICAgUHRyPElDb25maWcgY29uc3Q+IG1fY29uZmlnOworICAgICAgICBUb3RhbHMgbV90b3RhbHM7CisgICAgICAgIFB0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+IG1fcmVwb3J0ZXI7CisgICAgICAgIHN0ZDo6dmVjdG9yPE1lc3NhZ2VJbmZvPiBtX21lc3NhZ2VzOworICAgICAgICBBc3NlcnRpb25JbmZvIG1fbGFzdEFzc2VydGlvbkluZm87CisgICAgICAgIHN0ZDo6dmVjdG9yPFNlY3Rpb25FbmRJbmZvPiBtX3VuZmluaXNoZWRTZWN0aW9uczsKKyAgICAgICAgc3RkOjp2ZWN0b3I8SVRyYWNrZXIqPiBtX2FjdGl2ZVNlY3Rpb25zOworICAgICAgICBUcmFja2VyQ29udGV4dCBtX3RyYWNrZXJDb250ZXh0OworICAgICAgICBib29sIG1fc2hvdWxkUmVwb3J0VW5leHBlY3RlZDsKKyAgICB9OworCisgICAgSVJlc3VsdENhcHR1cmUmIGdldFJlc3VsdENhcHR1cmUoKSB7CisgICAgICAgIGlmKCBJUmVzdWx0Q2FwdHVyZSogY2FwdHVyZSA9IGdldEN1cnJlbnRDb250ZXh0KCkuZ2V0UmVzdWx0Q2FwdHVyZSgpICkKKyAgICAgICAgICAgIHJldHVybiAqY2FwdHVyZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGhyb3cgc3RkOjpsb2dpY19lcnJvciggIk5vIHJlc3VsdCBjYXB0dXJlIGluc3RhbmNlIiApOworICAgIH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF92ZXJzaW9uLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1ZFUlNJT05fSF9JTkNMVURFRAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgLy8gVmVyc2lvbmluZyBpbmZvcm1hdGlvbgorICAgIHN0cnVjdCBWZXJzaW9uIHsKKyAgICAgICAgVmVyc2lvbiggICAgdW5zaWduZWQgaW50IF9tYWpvclZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBfbWlub3JWZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgX3BhdGNoTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICBjaGFyIGNvbnN0ICogY29uc3QgX2JyYW5jaE5hbWUsCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBfYnVpbGROdW1iZXIgKTsKKworICAgICAgICB1bnNpZ25lZCBpbnQgY29uc3QgbWFqb3JWZXJzaW9uOworICAgICAgICB1bnNpZ25lZCBpbnQgY29uc3QgbWlub3JWZXJzaW9uOworICAgICAgICB1bnNpZ25lZCBpbnQgY29uc3QgcGF0Y2hOdW1iZXI7CisKKyAgICAgICAgLy8gYnVpbGROdW1iZXIgaXMgb25seSB1c2VkIGlmIGJyYW5jaE5hbWUgaXMgbm90IG51bGwKKyAgICAgICAgY2hhciBjb25zdCAqIGNvbnN0IGJyYW5jaE5hbWU7CisgICAgICAgIHVuc2lnbmVkIGludCBjb25zdCBidWlsZE51bWJlcjsKKworICAgICAgICBmcmllbmQgc3RkOjpvc3RyZWFtJiBvcGVyYXRvciA8PCAoIHN0ZDo6b3N0cmVhbSYgb3MsIFZlcnNpb24gY29uc3QmIHZlcnNpb24gKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIHZvaWQgb3BlcmF0b3I9KCBWZXJzaW9uIGNvbnN0JiApOworICAgIH07CisKKyAgICBpbmxpbmUgVmVyc2lvbiBsaWJyYXJ5VmVyc2lvbigpOworfQorCisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxsaW1pdHM+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBQdHI8SVN0cmVhbWluZ1JlcG9ydGVyPiBjcmVhdGVSZXBvcnRlciggc3RkOjpzdHJpbmcgY29uc3QmIHJlcG9ydGVyTmFtZSwgUHRyPENvbmZpZz4gY29uc3QmIGNvbmZpZyApIHsKKyAgICAgICAgUHRyPElTdHJlYW1pbmdSZXBvcnRlcj4gcmVwb3J0ZXIgPSBnZXRSZWdpc3RyeUh1YigpLmdldFJlcG9ydGVyUmVnaXN0cnkoKS5jcmVhdGUoIHJlcG9ydGVyTmFtZSwgY29uZmlnLmdldCgpICk7CisgICAgICAgIGlmKCAhcmVwb3J0ZXIgKSB7CisgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICAgICAgb3NzIDw8ICJObyByZXBvcnRlciByZWdpc3RlcmVkIHdpdGggbmFtZTogJyIgPDwgcmVwb3J0ZXJOYW1lIDw8ICInIjsKKyAgICAgICAgICAgIHRocm93IHN0ZDo6ZG9tYWluX2Vycm9yKCBvc3Muc3RyKCkgKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVwb3J0ZXI7CisgICAgfQorCisgICAgUHRyPElTdHJlYW1pbmdSZXBvcnRlcj4gbWFrZVJlcG9ydGVyKCBQdHI8Q29uZmlnPiBjb25zdCYgY29uZmlnICkgeworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcmVwb3J0ZXJzID0gY29uZmlnLT5nZXRSZXBvcnRlck5hbWVzKCk7CisgICAgICAgIGlmKCByZXBvcnRlcnMuZW1wdHkoKSApCisgICAgICAgICAgICByZXBvcnRlcnMucHVzaF9iYWNrKCAiY29uc29sZSIgKTsKKworICAgICAgICBQdHI8SVN0cmVhbWluZ1JlcG9ydGVyPiByZXBvcnRlcjsKKyAgICAgICAgZm9yKCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gcmVwb3J0ZXJzLmJlZ2luKCksIGl0RW5kID0gcmVwb3J0ZXJzLmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgcmVwb3J0ZXIgPSBhZGRSZXBvcnRlciggcmVwb3J0ZXIsIGNyZWF0ZVJlcG9ydGVyKCAqaXQsIGNvbmZpZyApICk7CisgICAgICAgIHJldHVybiByZXBvcnRlcjsKKyAgICB9CisgICAgUHRyPElTdHJlYW1pbmdSZXBvcnRlcj4gYWRkTGlzdGVuZXJzKCBQdHI8SUNvbmZpZyBjb25zdD4gY29uc3QmIGNvbmZpZywgUHRyPElTdHJlYW1pbmdSZXBvcnRlcj4gcmVwb3J0ZXJzICkgeworICAgICAgICBJUmVwb3J0ZXJSZWdpc3RyeTo6TGlzdGVuZXJzIGxpc3RlbmVycyA9IGdldFJlZ2lzdHJ5SHViKCkuZ2V0UmVwb3J0ZXJSZWdpc3RyeSgpLmdldExpc3RlbmVycygpOworICAgICAgICBmb3IoIElSZXBvcnRlclJlZ2lzdHJ5OjpMaXN0ZW5lcnM6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbGlzdGVuZXJzLmJlZ2luKCksIGl0RW5kID0gbGlzdGVuZXJzLmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgcmVwb3J0ZXJzID0gYWRkUmVwb3J0ZXIocmVwb3J0ZXJzLCAoKml0KS0+Y3JlYXRlKCBSZXBvcnRlckNvbmZpZyggY29uZmlnICkgKSApOworICAgICAgICByZXR1cm4gcmVwb3J0ZXJzOworICAgIH0KKworICAgIFRvdGFscyBydW5UZXN0cyggUHRyPENvbmZpZz4gY29uc3QmIGNvbmZpZyApIHsKKworICAgICAgICBQdHI8SUNvbmZpZyBjb25zdD4gaWNvbmZpZyA9IGNvbmZpZy5nZXQoKTsKKworICAgICAgICBQdHI8SVN0cmVhbWluZ1JlcG9ydGVyPiByZXBvcnRlciA9IG1ha2VSZXBvcnRlciggY29uZmlnICk7CisgICAgICAgIHJlcG9ydGVyID0gYWRkTGlzdGVuZXJzKCBpY29uZmlnLCByZXBvcnRlciApOworCisgICAgICAgIFJ1bkNvbnRleHQgY29udGV4dCggaWNvbmZpZywgcmVwb3J0ZXIgKTsKKworICAgICAgICBUb3RhbHMgdG90YWxzOworCisgICAgICAgIGNvbnRleHQudGVzdEdyb3VwU3RhcnRpbmcoIGNvbmZpZy0+bmFtZSgpLCAxLCAxICk7CisKKyAgICAgICAgVGVzdFNwZWMgdGVzdFNwZWMgPSBjb25maWctPnRlc3RTcGVjKCk7CisgICAgICAgIGlmKCAhdGVzdFNwZWMuaGFzRmlsdGVycygpICkKKyAgICAgICAgICAgIHRlc3RTcGVjID0gVGVzdFNwZWNQYXJzZXIoIElUYWdBbGlhc1JlZ2lzdHJ5OjpnZXQoKSApLnBhcnNlKCAiflsuXSIgKS50ZXN0U3BlYygpOyAvLyBBbGwgbm90IGhpZGRlbiB0ZXN0cworCisgICAgICAgIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBjb25zdCYgYWxsVGVzdENhc2VzID0gZ2V0QWxsVGVzdENhc2VzU29ydGVkKCAqaWNvbmZpZyApOworICAgICAgICBmb3IoIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBhbGxUZXN0Q2FzZXMuYmVnaW4oKSwgaXRFbmQgPSBhbGxUZXN0Q2FzZXMuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApIHsKKyAgICAgICAgICAgIGlmKCAhY29udGV4dC5hYm9ydGluZygpICYmIG1hdGNoVGVzdCggKml0LCB0ZXN0U3BlYywgKmljb25maWcgKSApCisgICAgICAgICAgICAgICAgdG90YWxzICs9IGNvbnRleHQucnVuVGVzdCggKml0ICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmVwb3J0ZXItPnNraXBUZXN0KCAqaXQgKTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnRleHQudGVzdEdyb3VwRW5kZWQoIGljb25maWctPm5hbWUoKSwgdG90YWxzLCAxLCAxICk7CisgICAgICAgIHJldHVybiB0b3RhbHM7CisgICAgfQorCisgICAgdm9pZCBhcHBseUZpbGVuYW1lc0FzVGFncyggSUNvbmZpZyBjb25zdCYgY29uZmlnICkgeworICAgICAgICBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gY29uc3QmIHRlc3RzID0gZ2V0QWxsVGVzdENhc2VzU29ydGVkKCBjb25maWcgKTsKKyAgICAgICAgZm9yKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgdGVzdHMuc2l6ZSgpOyArK2kgKSB7CisgICAgICAgICAgICBUZXN0Q2FzZSYgdGVzdCA9IGNvbnN0X2Nhc3Q8VGVzdENhc2UmPiggdGVzdHNbaV0gKTsKKyAgICAgICAgICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiB0YWdzID0gdGVzdC50YWdzOworCisgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWxlbmFtZSA9IHRlc3QubGluZUluZm8uZmlsZTsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgbGFzdFNsYXNoID0gZmlsZW5hbWUuZmluZF9sYXN0X29mKCAiXFwvIiApOworICAgICAgICAgICAgaWYoIGxhc3RTbGFzaCAhPSBzdGQ6OnN0cmluZzo6bnBvcyApCisgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZS5zdWJzdHIoIGxhc3RTbGFzaCsxICk7CisKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgbGFzdERvdCA9IGZpbGVuYW1lLmZpbmRfbGFzdF9vZiggIi4iICk7CisgICAgICAgICAgICBpZiggbGFzdERvdCAhPSBzdGQ6OnN0cmluZzo6bnBvcyApCisgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZS5zdWJzdHIoIDAsIGxhc3REb3QgKTsKKworICAgICAgICAgICAgdGFncy5pbnNlcnQoICIjIiArIGZpbGVuYW1lICk7CisgICAgICAgICAgICBzZXRUYWdzKCB0ZXN0LCB0YWdzICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBTZXNzaW9uIDogTm9uQ29weWFibGUgeworICAgICAgICBzdGF0aWMgYm9vbCBhbHJlYWR5SW5zdGFudGlhdGVkOworCisgICAgcHVibGljOgorCisgICAgICAgIHN0cnVjdCBPblVudXNlZE9wdGlvbnMgeyBlbnVtIERvV2hhdCB7IElnbm9yZSwgRmFpbCB9OyB9OworCisgICAgICAgIFNlc3Npb24oKQorICAgICAgICA6IG1fY2xpKCBtYWtlQ29tbWFuZExpbmVQYXJzZXIoKSApIHsKKyAgICAgICAgICAgIGlmKCBhbHJlYWR5SW5zdGFudGlhdGVkICkgeworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1zZyA9ICJPbmx5IG9uZSBpbnN0YW5jZSBvZiBDYXRjaDo6U2Vzc2lvbiBjYW4gZXZlciBiZSB1c2VkIjsKKyAgICAgICAgICAgICAgICBDYXRjaDo6Y2VycigpIDw8IG1zZyA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICAgICAgdGhyb3cgc3RkOjpsb2dpY19lcnJvciggbXNnICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhbHJlYWR5SW5zdGFudGlhdGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICB+U2Vzc2lvbigpIHsKKyAgICAgICAgICAgIENhdGNoOjpjbGVhblVwKCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHNob3dIZWxwKCBzdGQ6OnN0cmluZyBjb25zdCYgcHJvY2Vzc05hbWUgKSB7CisgICAgICAgICAgICBDYXRjaDo6Y291dCgpIDw8ICJcbkNhdGNoIHYiIDw8IGxpYnJhcnlWZXJzaW9uKCkgPDwgIlxuIjsKKworICAgICAgICAgICAgbV9jbGkudXNhZ2UoIENhdGNoOjpjb3V0KCksIHByb2Nlc3NOYW1lICk7CisgICAgICAgICAgICBDYXRjaDo6Y291dCgpIDw8ICJGb3IgbW9yZSBkZXRhaWwgdXNhZ2UgcGxlYXNlIHNlZSB0aGUgcHJvamVjdCBkb2NzXG4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgfQorCisgICAgICAgIGludCBhcHBseUNvbW1hbmRMaW5lKCBpbnQgYXJnYywgY2hhciBjb25zdCogY29uc3QqIGNvbnN0IGFyZ3YsIE9uVW51c2VkT3B0aW9uczo6RG9XaGF0IHVudXNlZE9wdGlvbkJlaGF2aW91ciA9IE9uVW51c2VkT3B0aW9uczo6RmFpbCApIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbV9jbGkuc2V0VGhyb3dPblVucmVjb2duaXNlZFRva2VucyggdW51c2VkT3B0aW9uQmVoYXZpb3VyID09IE9uVW51c2VkT3B0aW9uczo6RmFpbCApOworICAgICAgICAgICAgICAgIG1fdW51c2VkVG9rZW5zID0gbV9jbGkucGFyc2VJbnRvKCBDbGFyYTo6YXJnc1RvVmVjdG9yKCBhcmdjLCBhcmd2ICksIG1fY29uZmlnRGF0YSApOworICAgICAgICAgICAgICAgIGlmKCBtX2NvbmZpZ0RhdGEuc2hvd0hlbHAgKQorICAgICAgICAgICAgICAgICAgICBzaG93SGVscCggbV9jb25maWdEYXRhLnByb2Nlc3NOYW1lICk7CisgICAgICAgICAgICAgICAgbV9jb25maWcucmVzZXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoKCBzdGQ6OmV4Y2VwdGlvbiYgZXggKSB7CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb2xvdXIgY29sb3VyR3VhcmQoIENvbG91cjo6UmVkICk7CisgICAgICAgICAgICAgICAgICAgIENhdGNoOjpjZXJyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbkVycm9yKHMpIGluIGlucHV0OlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgVGV4dCggZXgud2hhdCgpLCBUZXh0QXR0cmlidXRlcygpLnNldEluZGVudCgyKSApCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXG5cbiI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1fY2xpLnVzYWdlKCBDYXRjaDo6Y291dCgpLCBtX2NvbmZpZ0RhdGEucHJvY2Vzc05hbWUgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHVzZUNvbmZpZ0RhdGEoIENvbmZpZ0RhdGEgY29uc3QmIF9jb25maWdEYXRhICkgeworICAgICAgICAgICAgbV9jb25maWdEYXRhID0gX2NvbmZpZ0RhdGE7CisgICAgICAgICAgICBtX2NvbmZpZy5yZXNldCgpOworICAgICAgICB9CisKKyAgICAgICAgaW50IHJ1biggaW50IGFyZ2MsIGNoYXIgY29uc3QqIGNvbnN0KiBjb25zdCBhcmd2ICkgeworCisgICAgICAgICAgICBpbnQgcmV0dXJuQ29kZSA9IGFwcGx5Q29tbWFuZExpbmUoIGFyZ2MsIGFyZ3YgKTsKKyAgICAgICAgICAgIGlmKCByZXR1cm5Db2RlID09IDAgKQorICAgICAgICAgICAgICAgIHJldHVybkNvZGUgPSBydW4oKTsKKyAgICAgICAgICAgIHJldHVybiByZXR1cm5Db2RlOworICAgICAgICB9CisKKyAgICAjaWYgZGVmaW5lZChXSU4zMikgJiYgZGVmaW5lZChVTklDT0RFKQorICAgICAgICBpbnQgcnVuKCBpbnQgYXJnYywgd2NoYXJfdCBjb25zdCogY29uc3QqIGNvbnN0IGFyZ3YgKSB7CisKKyAgICAgICAgICAgIGNoYXIgKip1dGY4QXJndiA9IG5ldyBjaGFyICpbIGFyZ2MgXTsKKworICAgICAgICAgICAgZm9yICggaW50IGkgPSAwOyBpIDwgYXJnYzsgKytpICkgeworICAgICAgICAgICAgICAgIGludCBidWZTaXplID0gV2lkZUNoYXJUb011bHRpQnl0ZSggQ1BfVVRGOCwgMCwgYXJndltpXSwgLTEsIE5VTEwsIDAsIE5VTEwsIE5VTEwgKTsKKworICAgICAgICAgICAgICAgIHV0ZjhBcmd2WyBpIF0gPSBuZXcgY2hhclsgYnVmU2l6ZSBdOworCisgICAgICAgICAgICAgICAgV2lkZUNoYXJUb011bHRpQnl0ZSggQ1BfVVRGOCwgMCwgYXJndltpXSwgLTEsIHV0ZjhBcmd2W2ldLCBidWZTaXplLCBOVUxMLCBOVUxMICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCByZXR1cm5Db2RlID0gYXBwbHlDb21tYW5kTGluZSggYXJnYywgdXRmOEFyZ3YgKTsKKyAgICAgICAgICAgIGlmKCByZXR1cm5Db2RlID09IDAgKQorICAgICAgICAgICAgICAgIHJldHVybkNvZGUgPSBydW4oKTsKKworICAgICAgICAgICAgZm9yICggaW50IGkgPSAwOyBpIDwgYXJnYzsgKytpICkKKyAgICAgICAgICAgICAgICBkZWxldGUgW10gdXRmOEFyZ3ZbIGkgXTsKKworICAgICAgICAgICAgZGVsZXRlIFtdIHV0ZjhBcmd2OworCisgICAgICAgICAgICByZXR1cm4gcmV0dXJuQ29kZTsKKyAgICAgICAgfQorICAgICNlbmRpZgorCisgICAgICAgIGludCBydW4oKSB7CisgICAgICAgICAgICBpZiggbV9jb25maWdEYXRhLnNob3dIZWxwICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uZmlnKCk7IC8vIEZvcmNlIGNvbmZpZyB0byBiZSBjb25zdHJ1Y3RlZAorCisgICAgICAgICAgICAgICAgc2VlZFJuZyggKm1fY29uZmlnICk7CisKKyAgICAgICAgICAgICAgICBpZiggbV9jb25maWdEYXRhLmZpbGVuYW1lc0FzVGFncyApCisgICAgICAgICAgICAgICAgICAgIGFwcGx5RmlsZW5hbWVzQXNUYWdzKCAqbV9jb25maWcgKTsKKworICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBsaXN0IHJlcXVlc3QKKyAgICAgICAgICAgICAgICBpZiggT3B0aW9uPHN0ZDo6c2l6ZV90PiBsaXN0ZWQgPSBsaXN0KCBjb25maWcoKSApICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oICpsaXN0ZWQgKTsKKworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KCBydW5UZXN0cyggbV9jb25maWcgKS5hc3NlcnRpb25zLmZhaWxlZCApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2goIHN0ZDo6ZXhjZXB0aW9uJiBleCApIHsKKyAgICAgICAgICAgICAgICBDYXRjaDo6Y2VycigpIDw8IGV4LndoYXQoKSA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICAgICAgcmV0dXJuIChzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1heCkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIENsYXJhOjpDb21tYW5kTGluZTxDb25maWdEYXRhPiBjb25zdCYgY2xpKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1fY2xpOworICAgICAgICB9CisgICAgICAgIHN0ZDo6dmVjdG9yPENsYXJhOjpQYXJzZXI6OlRva2VuPiBjb25zdCYgdW51c2VkVG9rZW5zKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1fdW51c2VkVG9rZW5zOworICAgICAgICB9CisgICAgICAgIENvbmZpZ0RhdGEmIGNvbmZpZ0RhdGEoKSB7CisgICAgICAgICAgICByZXR1cm4gbV9jb25maWdEYXRhOworICAgICAgICB9CisgICAgICAgIENvbmZpZyYgY29uZmlnKCkgeworICAgICAgICAgICAgaWYoICFtX2NvbmZpZyApCisgICAgICAgICAgICAgICAgbV9jb25maWcgPSBuZXcgQ29uZmlnKCBtX2NvbmZpZ0RhdGEgKTsKKyAgICAgICAgICAgIHJldHVybiAqbV9jb25maWc7CisgICAgICAgIH0KKyAgICBwcml2YXRlOgorICAgICAgICBDbGFyYTo6Q29tbWFuZExpbmU8Q29uZmlnRGF0YT4gbV9jbGk7CisgICAgICAgIHN0ZDo6dmVjdG9yPENsYXJhOjpQYXJzZXI6OlRva2VuPiBtX3VudXNlZFRva2VuczsKKyAgICAgICAgQ29uZmlnRGF0YSBtX2NvbmZpZ0RhdGE7CisgICAgICAgIFB0cjxDb25maWc+IG1fY29uZmlnOworICAgIH07CisKKyAgICBib29sIFNlc3Npb246OmFscmVhZHlJbnN0YW50aWF0ZWQgPSBmYWxzZTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9yZWdpc3RyeV9odWIuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9SRUdJU1RSWV9IVUJfSFBQX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF90ZXN0X2Nhc2VfcmVnaXN0cnlfaW1wbC5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1RFU1RfQ0FTRV9SRUdJU1RSWV9JTVBMX0hQUF9JTkNMVURFRAorCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBSYW5kb21OdW1iZXJHZW5lcmF0b3IgeworICAgICAgICB0eXBlZGVmIHN0ZDo6cHRyZGlmZl90IHJlc3VsdF90eXBlOworCisgICAgICAgIHJlc3VsdF90eXBlIG9wZXJhdG9yKCkoIHJlc3VsdF90eXBlIG4gKSBjb25zdCB7IHJldHVybiBzdGQ6OnJhbmQoKSAlIG47IH0KKworI2lmZGVmIENBVENIX0NPTkZJR19DUFAxMV9TSFVGRkxFCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgcmVzdWx0X3R5cGUgbWluKCkgeyByZXR1cm4gMDsgfQorICAgICAgICBzdGF0aWMgY29uc3RleHByIHJlc3VsdF90eXBlIG1heCgpIHsgcmV0dXJuIDEwMDAwMDA7IH0KKyAgICAgICAgcmVzdWx0X3R5cGUgb3BlcmF0b3IoKSgpIGNvbnN0IHsgcmV0dXJuIHN0ZDo6cmFuZCgpICUgbWF4KCk7IH0KKyNlbmRpZgorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBWPgorICAgICAgICBzdGF0aWMgdm9pZCBzaHVmZmxlKCBWJiB2ZWN0b3IgKSB7CisgICAgICAgICAgICBSYW5kb21OdW1iZXJHZW5lcmF0b3Igcm5nOworI2lmZGVmIENBVENIX0NPTkZJR19DUFAxMV9TSFVGRkxFCisgICAgICAgICAgICBzdGQ6OnNodWZmbGUoIHZlY3Rvci5iZWdpbigpLCB2ZWN0b3IuZW5kKCksIHJuZyApOworI2Vsc2UKKyAgICAgICAgICAgIHN0ZDo6cmFuZG9tX3NodWZmbGUoIHZlY3Rvci5iZWdpbigpLCB2ZWN0b3IuZW5kKCksIHJuZyApOworI2VuZGlmCisgICAgICAgIH0KKyAgICB9OworCisgICAgaW5saW5lIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBzb3J0VGVzdHMoIElDb25maWcgY29uc3QmIGNvbmZpZywgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IGNvbnN0JiB1bnNvcnRlZFRlc3RDYXNlcyApIHsKKworICAgICAgICBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gc29ydGVkID0gdW5zb3J0ZWRUZXN0Q2FzZXM7CisKKyAgICAgICAgc3dpdGNoKCBjb25maWcucnVuT3JkZXIoKSApIHsKKyAgICAgICAgICAgIGNhc2UgUnVuVGVzdHM6OkluTGV4aWNvZ3JhcGhpY2FsT3JkZXI6CisgICAgICAgICAgICAgICAgc3RkOjpzb3J0KCBzb3J0ZWQuYmVnaW4oKSwgc29ydGVkLmVuZCgpICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFJ1blRlc3RzOjpJblJhbmRvbU9yZGVyOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2VlZFJuZyggY29uZmlnICk7CisgICAgICAgICAgICAgICAgICAgIFJhbmRvbU51bWJlckdlbmVyYXRvcjo6c2h1ZmZsZSggc29ydGVkICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBSdW5UZXN0czo6SW5EZWNsYXJhdGlvbk9yZGVyOgorICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgaW4gZGVjbGFyYXRpb24gb3JkZXIKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc29ydGVkOworICAgIH0KKyAgICBib29sIG1hdGNoVGVzdCggVGVzdENhc2UgY29uc3QmIHRlc3RDYXNlLCBUZXN0U3BlYyBjb25zdCYgdGVzdFNwZWMsIElDb25maWcgY29uc3QmIGNvbmZpZyApIHsKKyAgICAgICAgcmV0dXJuIHRlc3RTcGVjLm1hdGNoZXMoIHRlc3RDYXNlICkgJiYgKCBjb25maWcuYWxsb3dUaHJvd3MoKSB8fCAhdGVzdENhc2UudGhyb3dzKCkgKTsKKyAgICB9CisKKyAgICB2b2lkIGVuZm9yY2VOb0R1cGxpY2F0ZVRlc3RDYXNlcyggc3RkOjp2ZWN0b3I8VGVzdENhc2U+IGNvbnN0JiBmdW5jdGlvbnMgKSB7CisgICAgICAgIHN0ZDo6c2V0PFRlc3RDYXNlPiBzZWVuRnVuY3Rpb25zOworICAgICAgICBmb3IoIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBmdW5jdGlvbnMuYmVnaW4oKSwgaXRFbmQgPSBmdW5jdGlvbnMuZW5kKCk7CisgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICsraXQgKSB7CisgICAgICAgICAgICBzdGQ6OnBhaXI8c3RkOjpzZXQ8VGVzdENhc2U+Ojpjb25zdF9pdGVyYXRvciwgYm9vbD4gcHJldiA9IHNlZW5GdW5jdGlvbnMuaW5zZXJ0KCAqaXQgKTsKKyAgICAgICAgICAgIGlmKCAhcHJldi5zZWNvbmQgKSB7CisgICAgICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIHNzOworCisgICAgICAgICAgICAgICAgc3MgIDw8IENvbG91ciggQ29sb3VyOjpSZWQgKQorICAgICAgICAgICAgICAgICAgICA8PCAiZXJyb3I6IFRFU1RfQ0FTRSggXCIiIDw8IGl0LT5uYW1lIDw8ICJcIiApIGFscmVhZHkgZGVmaW5lZC5cbiIKKyAgICAgICAgICAgICAgICAgICAgPDwgIlx0Rmlyc3Qgc2VlbiBhdCAiIDw8IHByZXYuZmlyc3QtPmdldFRlc3RDYXNlSW5mbygpLmxpbmVJbmZvIDw8ICdcbicKKyAgICAgICAgICAgICAgICAgICAgPDwgIlx0UmVkZWZpbmVkIGF0ICIgPDwgaXQtPmdldFRlc3RDYXNlSW5mbygpLmxpbmVJbmZvIDw8IHN0ZDo6ZW5kbDsKKworICAgICAgICAgICAgICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcihzcy5zdHIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gZmlsdGVyVGVzdHMoIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBjb25zdCYgdGVzdENhc2VzLCBUZXN0U3BlYyBjb25zdCYgdGVzdFNwZWMsIElDb25maWcgY29uc3QmIGNvbmZpZyApIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IGZpbHRlcmVkOworICAgICAgICBmaWx0ZXJlZC5yZXNlcnZlKCB0ZXN0Q2FzZXMuc2l6ZSgpICk7CisgICAgICAgIGZvciggc3RkOjp2ZWN0b3I8VGVzdENhc2U+Ojpjb25zdF9pdGVyYXRvciBpdCA9IHRlc3RDYXNlcy5iZWdpbigpLCBpdEVuZCA9IHRlc3RDYXNlcy5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgIGlmKCBtYXRjaFRlc3QoICppdCwgdGVzdFNwZWMsIGNvbmZpZyApICkKKyAgICAgICAgICAgICAgICBmaWx0ZXJlZC5wdXNoX2JhY2soICppdCApOworICAgICAgICByZXR1cm4gZmlsdGVyZWQ7CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBjb25zdCYgZ2V0QWxsVGVzdENhc2VzU29ydGVkKCBJQ29uZmlnIGNvbnN0JiBjb25maWcgKSB7CisgICAgICAgIHJldHVybiBnZXRSZWdpc3RyeUh1YigpLmdldFRlc3RDYXNlUmVnaXN0cnkoKS5nZXRBbGxUZXN0c1NvcnRlZCggY29uZmlnICk7CisgICAgfQorCisgICAgY2xhc3MgVGVzdFJlZ2lzdHJ5IDogcHVibGljIElUZXN0Q2FzZVJlZ2lzdHJ5IHsKKyAgICBwdWJsaWM6CisgICAgICAgIFRlc3RSZWdpc3RyeSgpCisgICAgICAgIDogICBtX2N1cnJlbnRTb3J0T3JkZXIoIFJ1blRlc3RzOjpJbkRlY2xhcmF0aW9uT3JkZXIgKSwKKyAgICAgICAgICAgIG1fdW5uYW1lZENvdW50KCAwICkKKyAgICAgICAge30KKyAgICAgICAgdmlydHVhbCB+VGVzdFJlZ2lzdHJ5KCk7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHJlZ2lzdGVyVGVzdCggVGVzdENhc2UgY29uc3QmIHRlc3RDYXNlICkgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSA9IHRlc3RDYXNlLmdldFRlc3RDYXNlSW5mbygpLm5hbWU7CisgICAgICAgICAgICBpZiggbmFtZS5lbXB0eSgpICkgeworICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgICAgICAgICAgb3NzIDw8ICJBbm9ueW1vdXMgdGVzdCBjYXNlICIgPDwgKyttX3VubmFtZWRDb3VudDsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVnaXN0ZXJUZXN0KCB0ZXN0Q2FzZS53aXRoTmFtZSggb3NzLnN0cigpICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1fZnVuY3Rpb25zLnB1c2hfYmFjayggdGVzdENhc2UgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IGNvbnN0JiBnZXRBbGxUZXN0cygpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtX2Z1bmN0aW9uczsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBjb25zdCYgZ2V0QWxsVGVzdHNTb3J0ZWQoIElDb25maWcgY29uc3QmIGNvbmZpZyApIGNvbnN0IHsKKyAgICAgICAgICAgIGlmKCBtX3NvcnRlZEZ1bmN0aW9ucy5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICBlbmZvcmNlTm9EdXBsaWNhdGVUZXN0Q2FzZXMoIG1fZnVuY3Rpb25zICk7CisKKyAgICAgICAgICAgIGlmKCAgbV9jdXJyZW50U29ydE9yZGVyICE9IGNvbmZpZy5ydW5PcmRlcigpIHx8IG1fc29ydGVkRnVuY3Rpb25zLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAgICAgbV9zb3J0ZWRGdW5jdGlvbnMgPSBzb3J0VGVzdHMoIGNvbmZpZywgbV9mdW5jdGlvbnMgKTsKKyAgICAgICAgICAgICAgICBtX2N1cnJlbnRTb3J0T3JkZXIgPSBjb25maWcucnVuT3JkZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtX3NvcnRlZEZ1bmN0aW9uczsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IG1fZnVuY3Rpb25zOworICAgICAgICBtdXRhYmxlIFJ1blRlc3RzOjpJbldoYXRPcmRlciBtX2N1cnJlbnRTb3J0T3JkZXI7CisgICAgICAgIG11dGFibGUgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IG1fc29ydGVkRnVuY3Rpb25zOworICAgICAgICBzaXplX3QgbV91bm5hbWVkQ291bnQ7CisgICAgICAgIHN0ZDo6aW9zX2Jhc2U6OkluaXQgbV9vc3RyZWFtSW5pdDsgLy8gRm9yY2VzIGNvdXQvIGNlcnIgdG8gYmUgaW5pdGlhbGlzZWQKKyAgICB9OworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBjbGFzcyBGcmVlRnVuY3Rpb25UZXN0Q2FzZSA6IHB1YmxpYyBTaGFyZWRJbXBsPElUZXN0Q2FzZT4geworICAgIHB1YmxpYzoKKworICAgICAgICBGcmVlRnVuY3Rpb25UZXN0Q2FzZSggVGVzdEZ1bmN0aW9uIGZ1biApIDogbV9mdW4oIGZ1biApIHt9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGludm9rZSgpIGNvbnN0IHsKKyAgICAgICAgICAgIG1fZnVuKCk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHZpcnR1YWwgfkZyZWVGdW5jdGlvblRlc3RDYXNlKCk7CisKKyAgICAgICAgVGVzdEZ1bmN0aW9uIG1fZnVuOworICAgIH07CisKKyAgICBpbmxpbmUgc3RkOjpzdHJpbmcgZXh0cmFjdENsYXNzTmFtZSggc3RkOjpzdHJpbmcgY29uc3QmIGNsYXNzT3JRdWFsaWZpZWRNZXRob2ROYW1lICkgeworICAgICAgICBzdGQ6OnN0cmluZyBjbGFzc05hbWUgPSBjbGFzc09yUXVhbGlmaWVkTWV0aG9kTmFtZTsKKyAgICAgICAgaWYoIHN0YXJ0c1dpdGgoIGNsYXNzTmFtZSwgJyYnICkgKQorICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OnNpemVfdCBsYXN0Q29sb25zID0gY2xhc3NOYW1lLnJmaW5kKCAiOjoiICk7CisgICAgICAgICAgICBzdGQ6OnNpemVfdCBwZW51bHRpbWF0ZUNvbG9ucyA9IGNsYXNzTmFtZS5yZmluZCggIjo6IiwgbGFzdENvbG9ucy0xICk7CisgICAgICAgICAgICBpZiggcGVudWx0aW1hdGVDb2xvbnMgPT0gc3RkOjpzdHJpbmc6Om5wb3MgKQorICAgICAgICAgICAgICAgIHBlbnVsdGltYXRlQ29sb25zID0gMTsKKyAgICAgICAgICAgIGNsYXNzTmFtZSA9IGNsYXNzTmFtZS5zdWJzdHIoIHBlbnVsdGltYXRlQ29sb25zLCBsYXN0Q29sb25zLXBlbnVsdGltYXRlQ29sb25zICk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNsYXNzTmFtZTsKKyAgICB9CisKKyAgICB2b2lkIHJlZ2lzdGVyVGVzdENhc2UKKyAgICAgICAgKCAgIElUZXN0Q2FzZSogdGVzdENhc2UsCisgICAgICAgICAgICBjaGFyIGNvbnN0KiBjbGFzc09yUXVhbGlmaWVkTWV0aG9kTmFtZSwKKyAgICAgICAgICAgIE5hbWVBbmREZXNjIGNvbnN0JiBuYW1lQW5kRGVzYywKKyAgICAgICAgICAgIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBsaW5lSW5mbyApIHsKKworICAgICAgICBnZXRNdXRhYmxlUmVnaXN0cnlIdWIoKS5yZWdpc3RlclRlc3QKKyAgICAgICAgICAgICggbWFrZVRlc3RDYXNlCisgICAgICAgICAgICAgICAgKCAgIHRlc3RDYXNlLAorICAgICAgICAgICAgICAgICAgICBleHRyYWN0Q2xhc3NOYW1lKCBjbGFzc09yUXVhbGlmaWVkTWV0aG9kTmFtZSApLAorICAgICAgICAgICAgICAgICAgICBuYW1lQW5kRGVzYy5uYW1lLAorICAgICAgICAgICAgICAgICAgICBuYW1lQW5kRGVzYy5kZXNjcmlwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgbGluZUluZm8gKSApOworICAgIH0KKyAgICB2b2lkIHJlZ2lzdGVyVGVzdENhc2VGdW5jdGlvbgorICAgICAgICAoICAgVGVzdEZ1bmN0aW9uIGZ1bmN0aW9uLAorICAgICAgICAgICAgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvLAorICAgICAgICAgICAgTmFtZUFuZERlc2MgY29uc3QmIG5hbWVBbmREZXNjICkgeworICAgICAgICByZWdpc3RlclRlc3RDYXNlKCBuZXcgRnJlZUZ1bmN0aW9uVGVzdENhc2UoIGZ1bmN0aW9uICksICIiLCBuYW1lQW5kRGVzYywgbGluZUluZm8gKTsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIEF1dG9SZWc6OkF1dG9SZWcKKyAgICAgICAgKCAgIFRlc3RGdW5jdGlvbiBmdW5jdGlvbiwKKyAgICAgICAgICAgIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBsaW5lSW5mbywKKyAgICAgICAgICAgIE5hbWVBbmREZXNjIGNvbnN0JiBuYW1lQW5kRGVzYyApIHsKKyAgICAgICAgcmVnaXN0ZXJUZXN0Q2FzZUZ1bmN0aW9uKCBmdW5jdGlvbiwgbGluZUluZm8sIG5hbWVBbmREZXNjICk7CisgICAgfQorCisgICAgQXV0b1JlZzo6fkF1dG9SZWcoKSB7fQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3JlcG9ydGVyX3JlZ2lzdHJ5LmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfUkVQT1JURVJfUkVHSVNUUllfSFBQX0lOQ0xVREVECisKKyNpbmNsdWRlIDxtYXA+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBjbGFzcyBSZXBvcnRlclJlZ2lzdHJ5IDogcHVibGljIElSZXBvcnRlclJlZ2lzdHJ5IHsKKworICAgIHB1YmxpYzoKKworICAgICAgICB2aXJ0dWFsIH5SZXBvcnRlclJlZ2lzdHJ5KCkgQ0FUQ0hfT1ZFUlJJREUge30KKworICAgICAgICB2aXJ0dWFsIElTdHJlYW1pbmdSZXBvcnRlciogY3JlYXRlKCBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSwgUHRyPElDb25maWcgY29uc3Q+IGNvbnN0JiBjb25maWcgKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBGYWN0b3J5TWFwOjpjb25zdF9pdGVyYXRvciBpdCA9ICBtX2ZhY3Rvcmllcy5maW5kKCBuYW1lICk7CisgICAgICAgICAgICBpZiggaXQgPT0gbV9mYWN0b3JpZXMuZW5kKCkgKQorICAgICAgICAgICAgICAgIHJldHVybiBDQVRDSF9OVUxMOworICAgICAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQtPmNyZWF0ZSggUmVwb3J0ZXJDb25maWcoIGNvbmZpZyApICk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHJlZ2lzdGVyUmVwb3J0ZXIoIHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lLCBQdHI8SVJlcG9ydGVyRmFjdG9yeT4gY29uc3QmIGZhY3RvcnkgKSB7CisgICAgICAgICAgICBtX2ZhY3Rvcmllcy5pbnNlcnQoIHN0ZDo6bWFrZV9wYWlyKCBuYW1lLCBmYWN0b3J5ICkgKTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHJlZ2lzdGVyTGlzdGVuZXIoIFB0cjxJUmVwb3J0ZXJGYWN0b3J5PiBjb25zdCYgZmFjdG9yeSApIHsKKyAgICAgICAgICAgIG1fbGlzdGVuZXJzLnB1c2hfYmFjayggZmFjdG9yeSApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCBGYWN0b3J5TWFwIGNvbnN0JiBnZXRGYWN0b3JpZXMoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICByZXR1cm4gbV9mYWN0b3JpZXM7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBMaXN0ZW5lcnMgY29uc3QmIGdldExpc3RlbmVycygpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIHJldHVybiBtX2xpc3RlbmVyczsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgRmFjdG9yeU1hcCBtX2ZhY3RvcmllczsKKyAgICAgICAgTGlzdGVuZXJzIG1fbGlzdGVuZXJzOworICAgIH07Cit9CisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9leGNlcHRpb25fdHJhbnNsYXRvcl9yZWdpc3RyeS5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0VYQ0VQVElPTl9UUkFOU0xBVE9SX1JFR0lTVFJZX0hQUF9JTkNMVURFRAorCisjaWZkZWYgX19PQkpDX18KKyNpbXBvcnQgIkZvdW5kYXRpb24vRm91bmRhdGlvbi5oIgorI2VuZGlmCisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBjbGFzcyBFeGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cnkgOiBwdWJsaWMgSUV4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeSB7CisgICAgcHVibGljOgorICAgICAgICB+RXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5KCkgeworICAgICAgICAgICAgZGVsZXRlQWxsKCBtX3RyYW5zbGF0b3JzICk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJUcmFuc2xhdG9yKCBjb25zdCBJRXhjZXB0aW9uVHJhbnNsYXRvciogdHJhbnNsYXRvciApIHsKKyAgICAgICAgICAgIG1fdHJhbnNsYXRvcnMucHVzaF9iYWNrKCB0cmFuc2xhdG9yICk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIHRyYW5zbGF0ZUFjdGl2ZUV4Y2VwdGlvbigpIGNvbnN0IHsKKyAgICAgICAgICAgIHRyeSB7CisjaWZkZWYgX19PQkpDX18KKyAgICAgICAgICAgICAgICAvLyBJbiBPYmplY3RpdmUtQyB0cnkgb2JqZWN0aXZlLWMgZXhjZXB0aW9ucyBmaXJzdAorICAgICAgICAgICAgICAgIEB0cnkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ5VHJhbnNsYXRvcnMoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQGNhdGNoIChOU0V4Y2VwdGlvbiAqZXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDYXRjaDo6dG9TdHJpbmcoIFtleGNlcHRpb24gZGVzY3JpcHRpb25dICk7CisgICAgICAgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ5VHJhbnNsYXRvcnMoKTsKKyNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2goIFRlc3RGYWlsdXJlRXhjZXB0aW9uJiApIHsKKyAgICAgICAgICAgICAgICB0aHJvdzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoKCBzdGQ6OmV4Y2VwdGlvbiYgZXggKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGV4LndoYXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoKCBzdGQ6OnN0cmluZyYgbXNnICkgeworICAgICAgICAgICAgICAgIHJldHVybiBtc2c7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCggY29uc3QgY2hhciogbXNnICkgeworICAgICAgICAgICAgICAgIHJldHVybiBtc2c7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCguLi4pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIlVua25vd24gZXhjZXB0aW9uIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6c3RyaW5nIHRyeVRyYW5zbGF0b3JzKCkgY29uc3QgeworICAgICAgICAgICAgaWYoIG1fdHJhbnNsYXRvcnMuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgdGhyb3c7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIG1fdHJhbnNsYXRvcnNbMF0tPnRyYW5zbGF0ZSggbV90cmFuc2xhdG9ycy5iZWdpbigpKzEsIG1fdHJhbnNsYXRvcnMuZW5kKCkgKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgSUV4Y2VwdGlvblRyYW5zbGF0b3IqPiBtX3RyYW5zbGF0b3JzOworICAgIH07Cit9CisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF90YWdfYWxpYXNfcmVnaXN0cnkuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfVEFHX0FMSUFTX1JFR0lTVFJZX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPG1hcD4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGNsYXNzIFRhZ0FsaWFzUmVnaXN0cnkgOiBwdWJsaWMgSVRhZ0FsaWFzUmVnaXN0cnkgeworICAgIHB1YmxpYzoKKyAgICAgICAgdmlydHVhbCB+VGFnQWxpYXNSZWdpc3RyeSgpOworICAgICAgICB2aXJ0dWFsIE9wdGlvbjxUYWdBbGlhcz4gZmluZCggc3RkOjpzdHJpbmcgY29uc3QmIGFsaWFzICkgY29uc3Q7CisgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZXhwYW5kQWxpYXNlcyggc3RkOjpzdHJpbmcgY29uc3QmIHVuZXhwYW5kZWRUZXN0U3BlYyApIGNvbnN0OworICAgICAgICB2b2lkIGFkZCggc3RkOjpzdHJpbmcgY29uc3QmIGFsaWFzLCBzdGQ6OnN0cmluZyBjb25zdCYgdGFnLCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8gKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBUYWdBbGlhcz4gbV9yZWdpc3RyeTsKKyAgICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIG5hbWVzcGFjZSB7CisKKyAgICAgICAgY2xhc3MgUmVnaXN0cnlIdWIgOiBwdWJsaWMgSVJlZ2lzdHJ5SHViLCBwdWJsaWMgSU11dGFibGVSZWdpc3RyeUh1YiB7CisKKyAgICAgICAgICAgIFJlZ2lzdHJ5SHViKCBSZWdpc3RyeUh1YiBjb25zdCYgKTsKKyAgICAgICAgICAgIHZvaWQgb3BlcmF0b3I9KCBSZWdpc3RyeUh1YiBjb25zdCYgKTsKKworICAgICAgICBwdWJsaWM6IC8vIElSZWdpc3RyeUh1YgorICAgICAgICAgICAgUmVnaXN0cnlIdWIoKSB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXJ0dWFsIElSZXBvcnRlclJlZ2lzdHJ5IGNvbnN0JiBnZXRSZXBvcnRlclJlZ2lzdHJ5KCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIHJldHVybiBtX3JlcG9ydGVyUmVnaXN0cnk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXJ0dWFsIElUZXN0Q2FzZVJlZ2lzdHJ5IGNvbnN0JiBnZXRUZXN0Q2FzZVJlZ2lzdHJ5KCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIHJldHVybiBtX3Rlc3RDYXNlUmVnaXN0cnk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXJ0dWFsIElFeGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cnkmIGdldEV4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeSgpIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbV9leGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cnk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXJ0dWFsIElUYWdBbGlhc1JlZ2lzdHJ5IGNvbnN0JiBnZXRUYWdBbGlhc1JlZ2lzdHJ5KCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIHJldHVybiBtX3RhZ0FsaWFzUmVnaXN0cnk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgcHVibGljOiAvLyBJTXV0YWJsZVJlZ2lzdHJ5SHViCisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJSZXBvcnRlciggc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUsIFB0cjxJUmVwb3J0ZXJGYWN0b3J5PiBjb25zdCYgZmFjdG9yeSApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICBtX3JlcG9ydGVyUmVnaXN0cnkucmVnaXN0ZXJSZXBvcnRlciggbmFtZSwgZmFjdG9yeSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlydHVhbCB2b2lkIHJlZ2lzdGVyTGlzdGVuZXIoIFB0cjxJUmVwb3J0ZXJGYWN0b3J5PiBjb25zdCYgZmFjdG9yeSApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICBtX3JlcG9ydGVyUmVnaXN0cnkucmVnaXN0ZXJMaXN0ZW5lciggZmFjdG9yeSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlydHVhbCB2b2lkIHJlZ2lzdGVyVGVzdCggVGVzdENhc2UgY29uc3QmIHRlc3RJbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIG1fdGVzdENhc2VSZWdpc3RyeS5yZWdpc3RlclRlc3QoIHRlc3RJbmZvICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJUcmFuc2xhdG9yKCBjb25zdCBJRXhjZXB0aW9uVHJhbnNsYXRvciogdHJhbnNsYXRvciApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICBtX2V4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeS5yZWdpc3RlclRyYW5zbGF0b3IoIHRyYW5zbGF0b3IgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCByZWdpc3RlclRhZ0FsaWFzKCBzdGQ6OnN0cmluZyBjb25zdCYgYWxpYXMsIHN0ZDo6c3RyaW5nIGNvbnN0JiB0YWcsIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBsaW5lSW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICBtX3RhZ0FsaWFzUmVnaXN0cnkuYWRkKCBhbGlhcywgdGFnLCBsaW5lSW5mbyApOworICAgICAgICAgICAgfQorCisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICBUZXN0UmVnaXN0cnkgbV90ZXN0Q2FzZVJlZ2lzdHJ5OworICAgICAgICAgICAgUmVwb3J0ZXJSZWdpc3RyeSBtX3JlcG9ydGVyUmVnaXN0cnk7CisgICAgICAgICAgICBFeGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cnkgbV9leGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cnk7CisgICAgICAgICAgICBUYWdBbGlhc1JlZ2lzdHJ5IG1fdGFnQWxpYXNSZWdpc3RyeTsKKyAgICAgICAgfTsKKworICAgICAgICAvLyBTaW5nbGUsIGdsb2JhbCwgaW5zdGFuY2UKKyAgICAgICAgaW5saW5lIFJlZ2lzdHJ5SHViKiYgZ2V0VGhlUmVnaXN0cnlIdWIoKSB7CisgICAgICAgICAgICBzdGF0aWMgUmVnaXN0cnlIdWIqIHRoZVJlZ2lzdHJ5SHViID0gQ0FUQ0hfTlVMTDsKKyAgICAgICAgICAgIGlmKCAhdGhlUmVnaXN0cnlIdWIgKQorICAgICAgICAgICAgICAgIHRoZVJlZ2lzdHJ5SHViID0gbmV3IFJlZ2lzdHJ5SHViKCk7CisgICAgICAgICAgICByZXR1cm4gdGhlUmVnaXN0cnlIdWI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBJUmVnaXN0cnlIdWImIGdldFJlZ2lzdHJ5SHViKCkgeworICAgICAgICByZXR1cm4gKmdldFRoZVJlZ2lzdHJ5SHViKCk7CisgICAgfQorICAgIElNdXRhYmxlUmVnaXN0cnlIdWImIGdldE11dGFibGVSZWdpc3RyeUh1YigpIHsKKyAgICAgICAgcmV0dXJuICpnZXRUaGVSZWdpc3RyeUh1YigpOworICAgIH0KKyAgICB2b2lkIGNsZWFuVXAoKSB7CisgICAgICAgIGRlbGV0ZSBnZXRUaGVSZWdpc3RyeUh1YigpOworICAgICAgICBnZXRUaGVSZWdpc3RyeUh1YigpID0gQ0FUQ0hfTlVMTDsKKyAgICAgICAgY2xlYW5VcENvbnRleHQoKTsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgdHJhbnNsYXRlQWN0aXZlRXhjZXB0aW9uKCkgeworICAgICAgICByZXR1cm4gZ2V0UmVnaXN0cnlIdWIoKS5nZXRFeGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cnkoKS50cmFuc2xhdGVBY3RpdmVFeGNlcHRpb24oKTsKKyAgICB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfbm90aW1wbGVtZW50ZWRfZXhjZXB0aW9uLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfTk9USU1QTEVNRU5URURfRVhDRVBUSU9OX0hQUF9JTkNMVURFRAorCisjaW5jbHVkZSA8c3N0cmVhbT4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIE5vdEltcGxlbWVudGVkRXhjZXB0aW9uOjpOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbiggU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvICkKKyAgICA6ICAgbV9saW5lSW5mbyggbGluZUluZm8gKSB7CisgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgIG9zcyA8PCBsaW5lSW5mbyA8PCAiOiBmdW5jdGlvbiAiOworICAgICAgICBvc3MgPDwgIm5vdCBpbXBsZW1lbnRlZCI7CisgICAgICAgIG1fd2hhdCA9IG9zcy5zdHIoKTsKKyAgICB9CisKKyAgICBjb25zdCBjaGFyKiBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbjo6d2hhdCgpIGNvbnN0IENBVENIX05PRVhDRVBUIHsKKyAgICAgICAgcmV0dXJuIG1fd2hhdC5jX3N0cigpOworICAgIH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9jb250ZXh0X2ltcGwuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9DT05URVhUX0lNUExfSFBQX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9zdHJlYW0uaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9TVFJFQU1fSFBQX0lOQ0xVREVECisKKyNpbmNsdWRlIDxzdGRleGNlcHQ+CisjaW5jbHVkZSA8Y3N0ZGlvPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgV3JpdGVyRiwgc2l6ZV90IGJ1ZmZlclNpemU9MjU2PgorICAgIGNsYXNzIFN0cmVhbUJ1ZkltcGwgOiBwdWJsaWMgU3RyZWFtQnVmQmFzZSB7CisgICAgICAgIGNoYXIgZGF0YVtidWZmZXJTaXplXTsKKyAgICAgICAgV3JpdGVyRiBtX3dyaXRlcjsKKworICAgIHB1YmxpYzoKKyAgICAgICAgU3RyZWFtQnVmSW1wbCgpIHsKKyAgICAgICAgICAgIHNldHAoIGRhdGEsIGRhdGEgKyBzaXplb2YoZGF0YSkgKTsKKyAgICAgICAgfQorCisgICAgICAgIH5TdHJlYW1CdWZJbXBsKCkgQ0FUQ0hfTk9FWENFUFQgeworICAgICAgICAgICAgc3luYygpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBpbnQgb3ZlcmZsb3coIGludCBjICkgeworICAgICAgICAgICAgc3luYygpOworCisgICAgICAgICAgICBpZiggYyAhPSBFT0YgKSB7CisgICAgICAgICAgICAgICAgaWYoIHBiYXNlKCkgPT0gZXBwdHIoKSApCisgICAgICAgICAgICAgICAgICAgIG1fd3JpdGVyKCBzdGQ6OnN0cmluZyggMSwgc3RhdGljX2Nhc3Q8Y2hhcj4oIGMgKSApICk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBzcHV0Yyggc3RhdGljX2Nhc3Q8Y2hhcj4oIGMgKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBpbnQgc3luYygpIHsKKyAgICAgICAgICAgIGlmKCBwYmFzZSgpICE9IHBwdHIoKSApIHsKKyAgICAgICAgICAgICAgICBtX3dyaXRlciggc3RkOjpzdHJpbmcoIHBiYXNlKCksIHN0YXRpY19jYXN0PHN0ZDo6c3RyaW5nOjpzaXplX3R5cGU+KCBwcHRyKCkgLSBwYmFzZSgpICkgKSApOworICAgICAgICAgICAgICAgIHNldHAoIHBiYXNlKCksIGVwcHRyKCkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfTsKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgRmlsZVN0cmVhbTo6RmlsZVN0cmVhbSggc3RkOjpzdHJpbmcgY29uc3QmIGZpbGVuYW1lICkgeworICAgICAgICBtX29mcy5vcGVuKCBmaWxlbmFtZS5jX3N0cigpICk7CisgICAgICAgIGlmKCBtX29mcy5mYWlsKCkgKSB7CisgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICAgICAgb3NzIDw8ICJVbmFibGUgdG8gb3BlbiBmaWxlOiAnIiA8PCBmaWxlbmFtZSA8PCAnXCcnOworICAgICAgICAgICAgdGhyb3cgc3RkOjpkb21haW5fZXJyb3IoIG9zcy5zdHIoKSApOworICAgICAgICB9CisgICAgfQorCisgICAgc3RkOjpvc3RyZWFtJiBGaWxlU3RyZWFtOjpzdHJlYW0oKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX29mczsKKyAgICB9CisKKyAgICBzdHJ1Y3QgT3V0cHV0RGVidWdXcml0ZXIgeworCisgICAgICAgIHZvaWQgb3BlcmF0b3IoKSggc3RkOjpzdHJpbmcgY29uc3Qmc3RyICkgeworICAgICAgICAgICAgd3JpdGVUb0RlYnVnQ29uc29sZSggc3RyICk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgRGVidWdPdXRTdHJlYW06OkRlYnVnT3V0U3RyZWFtKCkKKyAgICA6ICAgbV9zdHJlYW1CdWYoIG5ldyBTdHJlYW1CdWZJbXBsPE91dHB1dERlYnVnV3JpdGVyPigpICksCisgICAgICAgIG1fb3MoIG1fc3RyZWFtQnVmLmdldCgpICkKKyAgICB7fQorCisgICAgc3RkOjpvc3RyZWFtJiBEZWJ1Z091dFN0cmVhbTo6c3RyZWFtKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV9vczsKKyAgICB9CisKKyAgICAvLyBTdG9yZSB0aGUgc3RyZWFtYnVmIGZyb20gY291dCB1cC1mcm9udCBiZWNhdXNlCisgICAgLy8gY291dCBtYXkgZ2V0IHJlZGlyZWN0ZWQgd2hlbiBydW5uaW5nIHRlc3RzCisgICAgQ291dFN0cmVhbTo6Q291dFN0cmVhbSgpCisgICAgOiAgIG1fb3MoIENhdGNoOjpjb3V0KCkucmRidWYoKSApCisgICAge30KKworICAgIHN0ZDo6b3N0cmVhbSYgQ291dFN0cmVhbTo6c3RyZWFtKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV9vczsKKyAgICB9CisKKyNpZm5kZWYgQ0FUQ0hfQ09ORklHX05PU1RET1VUIC8vIElmIHlvdSAjZGVmaW5lIHRoaXMgeW91IG11c3QgaW1wbGVtZW50IHRoZXNlIGZ1bmN0aW9ucworICAgIHN0ZDo6b3N0cmVhbSYgY291dCgpIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6Y291dDsKKyAgICB9CisgICAgc3RkOjpvc3RyZWFtJiBjZXJyKCkgeworICAgICAgICByZXR1cm4gc3RkOjpjZXJyOworICAgIH0KKyNlbmRpZgorfQorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgQ29udGV4dCA6IHB1YmxpYyBJTXV0YWJsZUNvbnRleHQgeworCisgICAgICAgIENvbnRleHQoKSA6IG1fY29uZmlnKCBDQVRDSF9OVUxMICksIG1fcnVubmVyKCBDQVRDSF9OVUxMICksIG1fcmVzdWx0Q2FwdHVyZSggQ0FUQ0hfTlVMTCApIHt9CisgICAgICAgIENvbnRleHQoIENvbnRleHQgY29uc3QmICk7CisgICAgICAgIHZvaWQgb3BlcmF0b3I9KCBDb250ZXh0IGNvbnN0JiApOworCisgICAgcHVibGljOgorICAgICAgICB2aXJ0dWFsIH5Db250ZXh0KCkgeworICAgICAgICAgICAgZGVsZXRlQWxsVmFsdWVzKCBtX2dlbmVyYXRvcnNCeVRlc3ROYW1lICk7CisgICAgICAgIH0KKworICAgIHB1YmxpYzogLy8gSUNvbnRleHQKKyAgICAgICAgdmlydHVhbCBJUmVzdWx0Q2FwdHVyZSogZ2V0UmVzdWx0Q2FwdHVyZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtX3Jlc3VsdENhcHR1cmU7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBJUnVubmVyKiBnZXRSdW5uZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gbV9ydW5uZXI7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBzaXplX3QgZ2V0R2VuZXJhdG9ySW5kZXgoIHN0ZDo6c3RyaW5nIGNvbnN0JiBmaWxlSW5mbywgc2l6ZV90IHRvdGFsU2l6ZSApIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRHZW5lcmF0b3JzRm9yQ3VycmVudFRlc3QoKQorICAgICAgICAgICAgLmdldEdlbmVyYXRvckluZm8oIGZpbGVJbmZvLCB0b3RhbFNpemUgKQorICAgICAgICAgICAgLmdldEN1cnJlbnRJbmRleCgpOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgYm9vbCBhZHZhbmNlR2VuZXJhdG9yc0ZvckN1cnJlbnRUZXN0KCkgeworICAgICAgICAgICAgSUdlbmVyYXRvcnNGb3JUZXN0KiBnZW5lcmF0b3JzID0gZmluZEdlbmVyYXRvcnNGb3JDdXJyZW50VGVzdCgpOworICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRvcnMgJiYgZ2VuZXJhdG9ycy0+bW92ZU5leHQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgUHRyPElDb25maWcgY29uc3Q+IGdldENvbmZpZygpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtX2NvbmZpZzsKKyAgICAgICAgfQorCisgICAgcHVibGljOiAvLyBJTXV0YWJsZUNvbnRleHQKKyAgICAgICAgdmlydHVhbCB2b2lkIHNldFJlc3VsdENhcHR1cmUoIElSZXN1bHRDYXB0dXJlKiByZXN1bHRDYXB0dXJlICkgeworICAgICAgICAgICAgbV9yZXN1bHRDYXB0dXJlID0gcmVzdWx0Q2FwdHVyZTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0UnVubmVyKCBJUnVubmVyKiBydW5uZXIgKSB7CisgICAgICAgICAgICBtX3J1bm5lciA9IHJ1bm5lcjsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0Q29uZmlnKCBQdHI8SUNvbmZpZyBjb25zdD4gY29uc3QmIGNvbmZpZyApIHsKKyAgICAgICAgICAgIG1fY29uZmlnID0gY29uZmlnOworICAgICAgICB9CisKKyAgICAgICAgZnJpZW5kIElNdXRhYmxlQ29udGV4dCYgZ2V0Q3VycmVudE11dGFibGVDb250ZXh0KCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBJR2VuZXJhdG9yc0ZvclRlc3QqIGZpbmRHZW5lcmF0b3JzRm9yQ3VycmVudFRlc3QoKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyB0ZXN0TmFtZSA9IGdldFJlc3VsdENhcHR1cmUoKS0+Z2V0Q3VycmVudFRlc3ROYW1lKCk7CisKKyAgICAgICAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBJR2VuZXJhdG9yc0ZvclRlc3QqPjo6Y29uc3RfaXRlcmF0b3IgaXQgPQorICAgICAgICAgICAgICAgIG1fZ2VuZXJhdG9yc0J5VGVzdE5hbWUuZmluZCggdGVzdE5hbWUgKTsKKyAgICAgICAgICAgIHJldHVybiBpdCAhPSBtX2dlbmVyYXRvcnNCeVRlc3ROYW1lLmVuZCgpCisgICAgICAgICAgICAgICAgPyBpdC0+c2Vjb25kCisgICAgICAgICAgICAgICAgOiBDQVRDSF9OVUxMOworICAgICAgICB9CisKKyAgICAgICAgSUdlbmVyYXRvcnNGb3JUZXN0JiBnZXRHZW5lcmF0b3JzRm9yQ3VycmVudFRlc3QoKSB7CisgICAgICAgICAgICBJR2VuZXJhdG9yc0ZvclRlc3QqIGdlbmVyYXRvcnMgPSBmaW5kR2VuZXJhdG9yc0ZvckN1cnJlbnRUZXN0KCk7CisgICAgICAgICAgICBpZiggIWdlbmVyYXRvcnMgKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdGVzdE5hbWUgPSBnZXRSZXN1bHRDYXB0dXJlKCktPmdldEN1cnJlbnRUZXN0TmFtZSgpOworICAgICAgICAgICAgICAgIGdlbmVyYXRvcnMgPSBjcmVhdGVHZW5lcmF0b3JzRm9yVGVzdCgpOworICAgICAgICAgICAgICAgIG1fZ2VuZXJhdG9yc0J5VGVzdE5hbWUuaW5zZXJ0KCBzdGQ6Om1ha2VfcGFpciggdGVzdE5hbWUsIGdlbmVyYXRvcnMgKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuICpnZW5lcmF0b3JzOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBQdHI8SUNvbmZpZyBjb25zdD4gbV9jb25maWc7CisgICAgICAgIElSdW5uZXIqIG1fcnVubmVyOworICAgICAgICBJUmVzdWx0Q2FwdHVyZSogbV9yZXN1bHRDYXB0dXJlOworICAgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgSUdlbmVyYXRvcnNGb3JUZXN0Kj4gbV9nZW5lcmF0b3JzQnlUZXN0TmFtZTsKKyAgICB9OworCisgICAgbmFtZXNwYWNlIHsKKyAgICAgICAgQ29udGV4dCogY3VycmVudENvbnRleHQgPSBDQVRDSF9OVUxMOworICAgIH0KKyAgICBJTXV0YWJsZUNvbnRleHQmIGdldEN1cnJlbnRNdXRhYmxlQ29udGV4dCgpIHsKKyAgICAgICAgaWYoICFjdXJyZW50Q29udGV4dCApCisgICAgICAgICAgICBjdXJyZW50Q29udGV4dCA9IG5ldyBDb250ZXh0KCk7CisgICAgICAgIHJldHVybiAqY3VycmVudENvbnRleHQ7CisgICAgfQorICAgIElDb250ZXh0JiBnZXRDdXJyZW50Q29udGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIGdldEN1cnJlbnRNdXRhYmxlQ29udGV4dCgpOworICAgIH0KKworICAgIHZvaWQgY2xlYW5VcENvbnRleHQoKSB7CisgICAgICAgIGRlbGV0ZSBjdXJyZW50Q29udGV4dDsKKyAgICAgICAgY3VycmVudENvbnRleHQgPSBDQVRDSF9OVUxMOworICAgIH0KK30KKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2NvbnNvbGVfY29sb3VyX2ltcGwuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9DT05TT0xFX0NPTE9VUl9JTVBMX0hQUF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfZXJybm9fZ3VhcmQuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9FUlJOT19HVUFSRF9IUFBfSU5DTFVERUQKKworI2luY2x1ZGUgPGNlcnJubz4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGNsYXNzIEVycm5vR3VhcmQgeworICAgIHB1YmxpYzoKKyAgICAgICAgRXJybm9HdWFyZCgpOm1fb2xkRXJybm8oZXJybm8pe30KKyAgICAgICAgfkVycm5vR3VhcmQoKSB7IGVycm5vID0gbV9vbGRFcnJubzsgfQorICAgIHByaXZhdGU6CisgICAgICAgIGludCBtX29sZEVycm5vOworICAgIH07CisKK30KKworbmFtZXNwYWNlIENhdGNoIHsKKyAgICBuYW1lc3BhY2UgeworCisgICAgICAgIHN0cnVjdCBJQ29sb3VySW1wbCB7CisgICAgICAgICAgICB2aXJ0dWFsIH5JQ29sb3VySW1wbCgpIHt9CisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgdXNlKCBDb2xvdXI6OkNvZGUgX2NvbG91ckNvZGUgKSA9IDA7CisgICAgICAgIH07CisKKyAgICAgICAgc3RydWN0IE5vQ29sb3VySW1wbCA6IElDb2xvdXJJbXBsIHsKKyAgICAgICAgICAgIHZvaWQgdXNlKCBDb2xvdXI6OkNvZGUgKSB7fQorCisgICAgICAgICAgICBzdGF0aWMgSUNvbG91ckltcGwqIGluc3RhbmNlKCkgeworICAgICAgICAgICAgICAgIHN0YXRpYyBOb0NvbG91ckltcGwgc19pbnN0YW5jZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gJnNfaW5zdGFuY2U7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICB9IC8vIGFub24gbmFtZXNwYWNlCit9IC8vIG5hbWVzcGFjZSBDYXRjaAorCisjaWYgIWRlZmluZWQoIENBVENIX0NPTkZJR19DT0xPVVJfTk9ORSApICYmICFkZWZpbmVkKCBDQVRDSF9DT05GSUdfQ09MT1VSX1dJTkRPV1MgKSAmJiAhZGVmaW5lZCggQ0FUQ0hfQ09ORklHX0NPTE9VUl9BTlNJICkKKyMgICBpZmRlZiBDQVRDSF9QTEFURk9STV9XSU5ET1dTCisjICAgICAgIGRlZmluZSBDQVRDSF9DT05GSUdfQ09MT1VSX1dJTkRPV1MKKyMgICBlbHNlCisjICAgICAgIGRlZmluZSBDQVRDSF9DT05GSUdfQ09MT1VSX0FOU0kKKyMgICBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkICggQ0FUQ0hfQ09ORklHX0NPTE9VUl9XSU5ET1dTICkgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworbmFtZXNwYWNlIENhdGNoIHsKK25hbWVzcGFjZSB7CisKKyAgICBjbGFzcyBXaW4zMkNvbG91ckltcGwgOiBwdWJsaWMgSUNvbG91ckltcGwgeworICAgIHB1YmxpYzoKKyAgICAgICAgV2luMzJDb2xvdXJJbXBsKCkgOiBzdGRvdXRIYW5kbGUoIEdldFN0ZEhhbmRsZShTVERfT1VUUFVUX0hBTkRMRSkgKQorICAgICAgICB7CisgICAgICAgICAgICBDT05TT0xFX1NDUkVFTl9CVUZGRVJfSU5GTyBjc2JpSW5mbzsKKyAgICAgICAgICAgIEdldENvbnNvbGVTY3JlZW5CdWZmZXJJbmZvKCBzdGRvdXRIYW5kbGUsICZjc2JpSW5mbyApOworICAgICAgICAgICAgb3JpZ2luYWxGb3JlZ3JvdW5kQXR0cmlidXRlcyA9IGNzYmlJbmZvLndBdHRyaWJ1dGVzICYgfiggQkFDS0dST1VORF9HUkVFTiB8IEJBQ0tHUk9VTkRfUkVEIHwgQkFDS0dST1VORF9CTFVFIHwgQkFDS0dST1VORF9JTlRFTlNJVFkgKTsKKyAgICAgICAgICAgIG9yaWdpbmFsQmFja2dyb3VuZEF0dHJpYnV0ZXMgPSBjc2JpSW5mby53QXR0cmlidXRlcyAmIH4oIEZPUkVHUk9VTkRfR1JFRU4gfCBGT1JFR1JPVU5EX1JFRCB8IEZPUkVHUk9VTkRfQkxVRSB8IEZPUkVHUk9VTkRfSU5URU5TSVRZICk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgdXNlKCBDb2xvdXI6OkNvZGUgX2NvbG91ckNvZGUgKSB7CisgICAgICAgICAgICBzd2l0Y2goIF9jb2xvdXJDb2RlICkgeworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpOb25lOiAgICAgIHJldHVybiBzZXRUZXh0QXR0cmlidXRlKCBvcmlnaW5hbEZvcmVncm91bmRBdHRyaWJ1dGVzICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OldoaXRlOiAgICAgcmV0dXJuIHNldFRleHRBdHRyaWJ1dGUoIEZPUkVHUk9VTkRfR1JFRU4gfCBGT1JFR1JPVU5EX1JFRCB8IEZPUkVHUk9VTkRfQkxVRSApOworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpSZWQ6ICAgICAgIHJldHVybiBzZXRUZXh0QXR0cmlidXRlKCBGT1JFR1JPVU5EX1JFRCApOworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpHcmVlbjogICAgIHJldHVybiBzZXRUZXh0QXR0cmlidXRlKCBGT1JFR1JPVU5EX0dSRUVOICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkJsdWU6ICAgICAgcmV0dXJuIHNldFRleHRBdHRyaWJ1dGUoIEZPUkVHUk9VTkRfQkxVRSApOworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpDeWFuOiAgICAgIHJldHVybiBzZXRUZXh0QXR0cmlidXRlKCBGT1JFR1JPVU5EX0JMVUUgfCBGT1JFR1JPVU5EX0dSRUVOICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OlllbGxvdzogICAgcmV0dXJuIHNldFRleHRBdHRyaWJ1dGUoIEZPUkVHUk9VTkRfUkVEIHwgRk9SRUdST1VORF9HUkVFTiApOworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpHcmV5OiAgICAgIHJldHVybiBzZXRUZXh0QXR0cmlidXRlKCAwICk7CisKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6TGlnaHRHcmV5OiAgICAgcmV0dXJuIHNldFRleHRBdHRyaWJ1dGUoIEZPUkVHUk9VTkRfSU5URU5TSVRZICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkJyaWdodFJlZDogICAgIHJldHVybiBzZXRUZXh0QXR0cmlidXRlKCBGT1JFR1JPVU5EX0lOVEVOU0lUWSB8IEZPUkVHUk9VTkRfUkVEICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkJyaWdodEdyZWVuOiAgIHJldHVybiBzZXRUZXh0QXR0cmlidXRlKCBGT1JFR1JPVU5EX0lOVEVOU0lUWSB8IEZPUkVHUk9VTkRfR1JFRU4gKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6QnJpZ2h0V2hpdGU6ICAgcmV0dXJuIHNldFRleHRBdHRyaWJ1dGUoIEZPUkVHUk9VTkRfSU5URU5TSVRZIHwgRk9SRUdST1VORF9HUkVFTiB8IEZPUkVHUk9VTkRfUkVEIHwgRk9SRUdST1VORF9CTFVFICk7CisKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6QnJpZ2h0OiB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCAibm90IGEgY29sb3VyIiApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICB2b2lkIHNldFRleHRBdHRyaWJ1dGUoIFdPUkQgX3RleHRBdHRyaWJ1dGUgKSB7CisgICAgICAgICAgICBTZXRDb25zb2xlVGV4dEF0dHJpYnV0ZSggc3Rkb3V0SGFuZGxlLCBfdGV4dEF0dHJpYnV0ZSB8IG9yaWdpbmFsQmFja2dyb3VuZEF0dHJpYnV0ZXMgKTsKKyAgICAgICAgfQorICAgICAgICBIQU5ETEUgc3Rkb3V0SGFuZGxlOworICAgICAgICBXT1JEIG9yaWdpbmFsRm9yZWdyb3VuZEF0dHJpYnV0ZXM7CisgICAgICAgIFdPUkQgb3JpZ2luYWxCYWNrZ3JvdW5kQXR0cmlidXRlczsKKyAgICB9OworCisgICAgSUNvbG91ckltcGwqIHBsYXRmb3JtQ29sb3VySW5zdGFuY2UoKSB7CisgICAgICAgIHN0YXRpYyBXaW4zMkNvbG91ckltcGwgc19pbnN0YW5jZTsKKworICAgICAgICBQdHI8SUNvbmZpZyBjb25zdD4gY29uZmlnID0gZ2V0Q3VycmVudENvbnRleHQoKS5nZXRDb25maWcoKTsKKyAgICAgICAgVXNlQ29sb3VyOjpZZXNPck5vIGNvbG91ck1vZGUgPSBjb25maWcKKyAgICAgICAgICAgID8gY29uZmlnLT51c2VDb2xvdXIoKQorICAgICAgICAgICAgOiBVc2VDb2xvdXI6OkF1dG87CisgICAgICAgIGlmKCBjb2xvdXJNb2RlID09IFVzZUNvbG91cjo6QXV0byApCisgICAgICAgICAgICBjb2xvdXJNb2RlID0gIWlzRGVidWdnZXJBY3RpdmUoKQorICAgICAgICAgICAgICAgID8gVXNlQ29sb3VyOjpZZXMKKyAgICAgICAgICAgICAgICA6IFVzZUNvbG91cjo6Tm87CisgICAgICAgIHJldHVybiBjb2xvdXJNb2RlID09IFVzZUNvbG91cjo6WWVzCisgICAgICAgICAgICA/ICZzX2luc3RhbmNlCisgICAgICAgICAgICA6IE5vQ29sb3VySW1wbDo6aW5zdGFuY2UoKTsKKyAgICB9CisKK30gLy8gZW5kIGFub24gbmFtZXNwYWNlCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworI2VsaWYgZGVmaW5lZCggQ0FUQ0hfQ09ORklHX0NPTE9VUl9BTlNJICkgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorCituYW1lc3BhY2UgQ2F0Y2ggeworbmFtZXNwYWNlIHsKKworICAgIC8vIHVzZSBQT1NJWC8gQU5TSSBjb25zb2xlIHRlcm1pbmFsIGNvZGVzCisgICAgLy8gVGhhbmtzIHRvIEFkYW0gU3RyemVsZWNraSBmb3Igb3JpZ2luYWwgY29udHJpYnV0aW9uCisgICAgLy8gKGh0dHA6Ly9naXRodWIuY29tL25hbm9hbnQpCisgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3BoaWxzcXVhcmVkL0NhdGNoL3B1bGwvMTMxCisgICAgY2xhc3MgUG9zaXhDb2xvdXJJbXBsIDogcHVibGljIElDb2xvdXJJbXBsIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHZpcnR1YWwgdm9pZCB1c2UoIENvbG91cjo6Q29kZSBfY29sb3VyQ29kZSApIHsKKyAgICAgICAgICAgIHN3aXRjaCggX2NvbG91ckNvZGUgKSB7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6Ok5vbmU6CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OldoaXRlOiAgICAgcmV0dXJuIHNldENvbG91ciggIlswbSIgKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6UmVkOiAgICAgICByZXR1cm4gc2V0Q29sb3VyKCAiWzA7MzFtIiApOworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpHcmVlbjogICAgIHJldHVybiBzZXRDb2xvdXIoICJbMDszMm0iICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkJsdWU6ICAgICAgcmV0dXJuIHNldENvbG91ciggIlswOzM0bSIgKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6Q3lhbjogICAgICByZXR1cm4gc2V0Q29sb3VyKCAiWzA7MzZtIiApOworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpZZWxsb3c6ICAgIHJldHVybiBzZXRDb2xvdXIoICJbMDszM20iICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkdyZXk6ICAgICAgcmV0dXJuIHNldENvbG91ciggIlsxOzMwbSIgKTsKKworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpMaWdodEdyZXk6ICAgICByZXR1cm4gc2V0Q29sb3VyKCAiWzA7MzdtIiApOworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpCcmlnaHRSZWQ6ICAgICByZXR1cm4gc2V0Q29sb3VyKCAiWzE7MzFtIiApOworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpCcmlnaHRHcmVlbjogICByZXR1cm4gc2V0Q29sb3VyKCAiWzE7MzJtIiApOworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpCcmlnaHRXaGl0ZTogICByZXR1cm4gc2V0Q29sb3VyKCAiWzE7MzdtIiApOworCisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkJyaWdodDogdGhyb3cgc3RkOjpsb2dpY19lcnJvciggIm5vdCBhIGNvbG91ciIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdGF0aWMgSUNvbG91ckltcGwqIGluc3RhbmNlKCkgeworICAgICAgICAgICAgc3RhdGljIFBvc2l4Q29sb3VySW1wbCBzX2luc3RhbmNlOworICAgICAgICAgICAgcmV0dXJuICZzX2luc3RhbmNlOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICB2b2lkIHNldENvbG91ciggY29uc3QgY2hhciogX2VzY2FwZUNvZGUgKSB7CisgICAgICAgICAgICBDYXRjaDo6Y291dCgpIDw8ICdcMDMzJyA8PCBfZXNjYXBlQ29kZTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBJQ29sb3VySW1wbCogcGxhdGZvcm1Db2xvdXJJbnN0YW5jZSgpIHsKKyAgICAgICAgRXJybm9HdWFyZCBndWFyZDsKKyAgICAgICAgUHRyPElDb25maWcgY29uc3Q+IGNvbmZpZyA9IGdldEN1cnJlbnRDb250ZXh0KCkuZ2V0Q29uZmlnKCk7CisgICAgICAgIFVzZUNvbG91cjo6WWVzT3JObyBjb2xvdXJNb2RlID0gY29uZmlnCisgICAgICAgICAgICA/IGNvbmZpZy0+dXNlQ29sb3VyKCkKKyAgICAgICAgICAgIDogVXNlQ29sb3VyOjpBdXRvOworICAgICAgICBpZiggY29sb3VyTW9kZSA9PSBVc2VDb2xvdXI6OkF1dG8gKQorICAgICAgICAgICAgY29sb3VyTW9kZSA9ICghaXNEZWJ1Z2dlckFjdGl2ZSgpICYmIGlzYXR0eShTVERPVVRfRklMRU5PKSApCisgICAgICAgICAgICAgICAgPyBVc2VDb2xvdXI6OlllcworICAgICAgICAgICAgICAgIDogVXNlQ29sb3VyOjpObzsKKyAgICAgICAgcmV0dXJuIGNvbG91ck1vZGUgPT0gVXNlQ29sb3VyOjpZZXMKKyAgICAgICAgICAgID8gUG9zaXhDb2xvdXJJbXBsOjppbnN0YW5jZSgpCisgICAgICAgICAgICA6IE5vQ29sb3VySW1wbDo6aW5zdGFuY2UoKTsKKyAgICB9CisKK30gLy8gZW5kIGFub24gbmFtZXNwYWNlCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworI2Vsc2UgIC8vIG5vdCBXaW5kb3dzIG9yIEFOU0kgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0YXRpYyBJQ29sb3VySW1wbCogcGxhdGZvcm1Db2xvdXJJbnN0YW5jZSgpIHsgcmV0dXJuIE5vQ29sb3VySW1wbDo6aW5zdGFuY2UoKTsgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworI2VuZGlmIC8vIFdpbmRvd3MvIEFOU0kvIE5vbmUKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIENvbG91cjo6Q29sb3VyKCBDb2RlIF9jb2xvdXJDb2RlICkgOiBtX21vdmVkKCBmYWxzZSApIHsgdXNlKCBfY29sb3VyQ29kZSApOyB9CisgICAgQ29sb3VyOjpDb2xvdXIoIENvbG91ciBjb25zdCYgX290aGVyICkgOiBtX21vdmVkKCBmYWxzZSApIHsgY29uc3RfY2FzdDxDb2xvdXImPiggX290aGVyICkubV9tb3ZlZCA9IHRydWU7IH0KKyAgICBDb2xvdXI6On5Db2xvdXIoKXsgaWYoICFtX21vdmVkICkgdXNlKCBOb25lICk7IH0KKworICAgIHZvaWQgQ29sb3VyOjp1c2UoIENvZGUgX2NvbG91ckNvZGUgKSB7CisgICAgICAgIHN0YXRpYyBJQ29sb3VySW1wbCogaW1wbCA9IHBsYXRmb3JtQ29sb3VySW5zdGFuY2UoKTsKKyAgICAgICAgaW1wbC0+dXNlKCBfY29sb3VyQ29kZSApOworICAgIH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9nZW5lcmF0b3JzX2ltcGwuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9HRU5FUkFUT1JTX0lNUExfSFBQX0lOQ0xVREVECisKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPG1hcD4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBHZW5lcmF0b3JJbmZvIDogSUdlbmVyYXRvckluZm8geworCisgICAgICAgIEdlbmVyYXRvckluZm8oIHN0ZDo6c2l6ZV90IHNpemUgKQorICAgICAgICA6ICAgbV9zaXplKCBzaXplICksCisgICAgICAgICAgICBtX2N1cnJlbnRJbmRleCggMCApCisgICAgICAgIHt9CisKKyAgICAgICAgYm9vbCBtb3ZlTmV4dCgpIHsKKyAgICAgICAgICAgIGlmKCArK21fY3VycmVudEluZGV4ID09IG1fc2l6ZSApIHsKKyAgICAgICAgICAgICAgICBtX2N1cnJlbnRJbmRleCA9IDA7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnNpemVfdCBnZXRDdXJyZW50SW5kZXgoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbV9jdXJyZW50SW5kZXg7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnNpemVfdCBtX3NpemU7CisgICAgICAgIHN0ZDo6c2l6ZV90IG1fY3VycmVudEluZGV4OworICAgIH07CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIGNsYXNzIEdlbmVyYXRvcnNGb3JUZXN0IDogcHVibGljIElHZW5lcmF0b3JzRm9yVGVzdCB7CisKKyAgICBwdWJsaWM6CisgICAgICAgIH5HZW5lcmF0b3JzRm9yVGVzdCgpIHsKKyAgICAgICAgICAgIGRlbGV0ZUFsbCggbV9nZW5lcmF0b3JzSW5PcmRlciApOworICAgICAgICB9CisKKyAgICAgICAgSUdlbmVyYXRvckluZm8mIGdldEdlbmVyYXRvckluZm8oIHN0ZDo6c3RyaW5nIGNvbnN0JiBmaWxlSW5mbywgc3RkOjpzaXplX3Qgc2l6ZSApIHsKKyAgICAgICAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBJR2VuZXJhdG9ySW5mbyo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fZ2VuZXJhdG9yc0J5TmFtZS5maW5kKCBmaWxlSW5mbyApOworICAgICAgICAgICAgaWYoIGl0ID09IG1fZ2VuZXJhdG9yc0J5TmFtZS5lbmQoKSApIHsKKyAgICAgICAgICAgICAgICBJR2VuZXJhdG9ySW5mbyogaW5mbyA9IG5ldyBHZW5lcmF0b3JJbmZvKCBzaXplICk7CisgICAgICAgICAgICAgICAgbV9nZW5lcmF0b3JzQnlOYW1lLmluc2VydCggc3RkOjptYWtlX3BhaXIoIGZpbGVJbmZvLCBpbmZvICkgKTsKKyAgICAgICAgICAgICAgICBtX2dlbmVyYXRvcnNJbk9yZGVyLnB1c2hfYmFjayggaW5mbyApOworICAgICAgICAgICAgICAgIHJldHVybiAqaW5mbzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAqaXQtPnNlY29uZDsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgbW92ZU5leHQoKSB7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxJR2VuZXJhdG9ySW5mbyo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fZ2VuZXJhdG9yc0luT3JkZXIuYmVnaW4oKTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPElHZW5lcmF0b3JJbmZvKj46OmNvbnN0X2l0ZXJhdG9yIGl0RW5kID0gbV9nZW5lcmF0b3JzSW5PcmRlci5lbmQoKTsKKyAgICAgICAgICAgIGZvcig7IGl0ICE9IGl0RW5kOyArK2l0ICkgeworICAgICAgICAgICAgICAgIGlmKCAoKml0KS0+bW92ZU5leHQoKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgSUdlbmVyYXRvckluZm8qPiBtX2dlbmVyYXRvcnNCeU5hbWU7CisgICAgICAgIHN0ZDo6dmVjdG9yPElHZW5lcmF0b3JJbmZvKj4gbV9nZW5lcmF0b3JzSW5PcmRlcjsKKyAgICB9OworCisgICAgSUdlbmVyYXRvcnNGb3JUZXN0KiBjcmVhdGVHZW5lcmF0b3JzRm9yVGVzdCgpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IEdlbmVyYXRvcnNGb3JUZXN0KCk7CisgICAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2Fzc2VydGlvbnJlc3VsdC5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0FTU0VSVElPTlJFU1VMVF9IUFBfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIEFzc2VydGlvbkluZm86OkFzc2VydGlvbkluZm8oICAgc3RkOjpzdHJpbmcgY29uc3QmIF9tYWNyb05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgX2xpbmVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIF9jYXB0dXJlZEV4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHREaXNwb3NpdGlvbjo6RmxhZ3MgX3Jlc3VsdERpc3Bvc2l0aW9uICkKKyAgICA6ICAgbWFjcm9OYW1lKCBfbWFjcm9OYW1lICksCisgICAgICAgIGxpbmVJbmZvKCBfbGluZUluZm8gKSwKKyAgICAgICAgY2FwdHVyZWRFeHByZXNzaW9uKCBfY2FwdHVyZWRFeHByZXNzaW9uICksCisgICAgICAgIHJlc3VsdERpc3Bvc2l0aW9uKCBfcmVzdWx0RGlzcG9zaXRpb24gKQorICAgIHt9CisKKyAgICBBc3NlcnRpb25SZXN1bHQ6OkFzc2VydGlvblJlc3VsdCgpIHt9CisKKyAgICBBc3NlcnRpb25SZXN1bHQ6OkFzc2VydGlvblJlc3VsdCggQXNzZXJ0aW9uSW5mbyBjb25zdCYgaW5mbywgQXNzZXJ0aW9uUmVzdWx0RGF0YSBjb25zdCYgZGF0YSApCisgICAgOiAgIG1faW5mbyggaW5mbyApLAorICAgICAgICBtX3Jlc3VsdERhdGEoIGRhdGEgKQorICAgIHt9CisKKyAgICBBc3NlcnRpb25SZXN1bHQ6On5Bc3NlcnRpb25SZXN1bHQoKSB7fQorCisgICAgLy8gUmVzdWx0IHdhcyBhIHN1Y2Nlc3MKKyAgICBib29sIEFzc2VydGlvblJlc3VsdDo6c3VjY2VlZGVkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gQ2F0Y2g6OmlzT2soIG1fcmVzdWx0RGF0YS5yZXN1bHRUeXBlICk7CisgICAgfQorCisgICAgLy8gUmVzdWx0IHdhcyBhIHN1Y2Nlc3MsIG9yIGZhaWx1cmUgaXMgc3VwcHJlc3NlZAorICAgIGJvb2wgQXNzZXJ0aW9uUmVzdWx0Ojppc09rKCkgY29uc3QgeworICAgICAgICByZXR1cm4gQ2F0Y2g6OmlzT2soIG1fcmVzdWx0RGF0YS5yZXN1bHRUeXBlICkgfHwgc2hvdWxkU3VwcHJlc3NGYWlsdXJlKCBtX2luZm8ucmVzdWx0RGlzcG9zaXRpb24gKTsKKyAgICB9CisKKyAgICBSZXN1bHRXYXM6Ok9mVHlwZSBBc3NlcnRpb25SZXN1bHQ6OmdldFJlc3VsdFR5cGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX3Jlc3VsdERhdGEucmVzdWx0VHlwZTsKKyAgICB9CisKKyAgICBib29sIEFzc2VydGlvblJlc3VsdDo6aGFzRXhwcmVzc2lvbigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICFtX2luZm8uY2FwdHVyZWRFeHByZXNzaW9uLmVtcHR5KCk7CisgICAgfQorCisgICAgYm9vbCBBc3NlcnRpb25SZXN1bHQ6Omhhc01lc3NhZ2UoKSBjb25zdCB7CisgICAgICAgIHJldHVybiAhbV9yZXN1bHREYXRhLm1lc3NhZ2UuZW1wdHkoKTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBBc3NlcnRpb25SZXN1bHQ6OmdldEV4cHJlc3Npb24oKSBjb25zdCB7CisgICAgICAgIGlmKCBpc0ZhbHNlVGVzdCggbV9pbmZvLnJlc3VsdERpc3Bvc2l0aW9uICkgKQorICAgICAgICAgICAgcmV0dXJuICchJyArIG1faW5mby5jYXB0dXJlZEV4cHJlc3Npb247CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBtX2luZm8uY2FwdHVyZWRFeHByZXNzaW9uOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyBBc3NlcnRpb25SZXN1bHQ6OmdldEV4cHJlc3Npb25Jbk1hY3JvKCkgY29uc3QgeworICAgICAgICBpZiggbV9pbmZvLm1hY3JvTmFtZS5lbXB0eSgpICkKKyAgICAgICAgICAgIHJldHVybiBtX2luZm8uY2FwdHVyZWRFeHByZXNzaW9uOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gbV9pbmZvLm1hY3JvTmFtZSArICIoICIgKyBtX2luZm8uY2FwdHVyZWRFeHByZXNzaW9uICsgIiApIjsKKyAgICB9CisKKyAgICBib29sIEFzc2VydGlvblJlc3VsdDo6aGFzRXhwYW5kZWRFeHByZXNzaW9uKCkgY29uc3QgeworICAgICAgICByZXR1cm4gaGFzRXhwcmVzc2lvbigpICYmIGdldEV4cGFuZGVkRXhwcmVzc2lvbigpICE9IGdldEV4cHJlc3Npb24oKTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBBc3NlcnRpb25SZXN1bHQ6OmdldEV4cGFuZGVkRXhwcmVzc2lvbigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fcmVzdWx0RGF0YS5yZWNvbnN0cnVjdEV4cHJlc3Npb24oKTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBBc3NlcnRpb25SZXN1bHQ6OmdldE1lc3NhZ2UoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX3Jlc3VsdERhdGEubWVzc2FnZTsKKyAgICB9CisgICAgU291cmNlTGluZUluZm8gQXNzZXJ0aW9uUmVzdWx0OjpnZXRTb3VyY2VJbmZvKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV9pbmZvLmxpbmVJbmZvOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIEFzc2VydGlvblJlc3VsdDo6Z2V0VGVzdE1hY3JvTmFtZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1faW5mby5tYWNyb05hbWU7CisgICAgfQorCisgICAgdm9pZCBBc3NlcnRpb25SZXN1bHQ6OmRpc2NhcmREZWNvbXBvc2VkRXhwcmVzc2lvbigpIGNvbnN0IHsKKyAgICAgICAgbV9yZXN1bHREYXRhLmRlY29tcG9zZWRFeHByZXNzaW9uID0gQ0FUQ0hfTlVMTDsKKyAgICB9CisKKyAgICB2b2lkIEFzc2VydGlvblJlc3VsdDo6ZXhwYW5kRGVjb21wb3NlZEV4cHJlc3Npb24oKSBjb25zdCB7CisgICAgICAgIG1fcmVzdWx0RGF0YS5yZWNvbnN0cnVjdEV4cHJlc3Npb24oKTsKKyAgICB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfdGVzdF9jYXNlX2luZm8uaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9URVNUX0NBU0VfSU5GT19IUFBfSU5DTFVERUQKKworI2luY2x1ZGUgPGNjdHlwZT4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGlubGluZSBUZXN0Q2FzZUluZm86OlNwZWNpYWxQcm9wZXJ0aWVzIHBhcnNlU3BlY2lhbFRhZyggc3RkOjpzdHJpbmcgY29uc3QmIHRhZyApIHsKKyAgICAgICAgaWYoIHN0YXJ0c1dpdGgoIHRhZywgJy4nICkgfHwKKyAgICAgICAgICAgIHRhZyA9PSAiaGlkZSIgfHwKKyAgICAgICAgICAgIHRhZyA9PSAiIWhpZGUiICkKKyAgICAgICAgICAgIHJldHVybiBUZXN0Q2FzZUluZm86OklzSGlkZGVuOworICAgICAgICBlbHNlIGlmKCB0YWcgPT0gIiF0aHJvd3MiICkKKyAgICAgICAgICAgIHJldHVybiBUZXN0Q2FzZUluZm86OlRocm93czsKKyAgICAgICAgZWxzZSBpZiggdGFnID09ICIhc2hvdWxkZmFpbCIgKQorICAgICAgICAgICAgcmV0dXJuIFRlc3RDYXNlSW5mbzo6U2hvdWxkRmFpbDsKKyAgICAgICAgZWxzZSBpZiggdGFnID09ICIhbWF5ZmFpbCIgKQorICAgICAgICAgICAgcmV0dXJuIFRlc3RDYXNlSW5mbzo6TWF5RmFpbDsKKyAgICAgICAgZWxzZSBpZiggdGFnID09ICIhbm9ucG9ydGFibGUiICkKKyAgICAgICAgICAgIHJldHVybiBUZXN0Q2FzZUluZm86Ok5vblBvcnRhYmxlOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gVGVzdENhc2VJbmZvOjpOb25lOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBpc1Jlc2VydmVkVGFnKCBzdGQ6OnN0cmluZyBjb25zdCYgdGFnICkgeworICAgICAgICByZXR1cm4gcGFyc2VTcGVjaWFsVGFnKCB0YWcgKSA9PSBUZXN0Q2FzZUluZm86Ok5vbmUgJiYgdGFnLnNpemUoKSA+IDAgJiYgIXN0ZDo6aXNhbG51bSggdGFnWzBdICk7CisgICAgfQorICAgIGlubGluZSB2b2lkIGVuZm9yY2VOb3RSZXNlcnZlZFRhZyggc3RkOjpzdHJpbmcgY29uc3QmIHRhZywgU291cmNlTGluZUluZm8gY29uc3QmIF9saW5lSW5mbyApIHsKKyAgICAgICAgaWYoIGlzUmVzZXJ2ZWRUYWcoIHRhZyApICkgeworICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIHNzOworICAgICAgICAgICAgc3MgPDwgQ29sb3VyKENvbG91cjo6UmVkKQorICAgICAgICAgICAgICAgPDwgIlRhZyBuYW1lIFsiIDw8IHRhZyA8PCAiXSBub3QgYWxsb3dlZC5cbiIKKyAgICAgICAgICAgICAgIDw8ICJUYWcgbmFtZXMgc3RhcnRpbmcgd2l0aCBub24gYWxwaGEtbnVtZXJpYyBjaGFyYWN0ZXJzIGFyZSByZXNlcnZlZFxuIgorICAgICAgICAgICAgICAgPDwgQ29sb3VyKENvbG91cjo6RmlsZU5hbWUpCisgICAgICAgICAgICAgICA8PCBfbGluZUluZm8gPDwgJ1xuJzsKKyAgICAgICAgICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcihzcy5zdHIoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBUZXN0Q2FzZSBtYWtlVGVzdENhc2UoICBJVGVzdENhc2UqIF90ZXN0Q2FzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgX2NsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIF9kZXNjT3JUYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBfbGluZUluZm8gKQorICAgIHsKKyAgICAgICAgYm9vbCBpc0hpZGRlbiggc3RhcnRzV2l0aCggX25hbWUsICIuLyIgKSApOyAvLyBMZWdhY3kgc3VwcG9ydAorCisgICAgICAgIC8vIFBhcnNlIG91dCB0YWdzCisgICAgICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiB0YWdzOworICAgICAgICBzdGQ6OnN0cmluZyBkZXNjLCB0YWc7CisgICAgICAgIGJvb2wgaW5UYWcgPSBmYWxzZTsKKyAgICAgICAgZm9yKCBzdGQ6OnNpemVfdCBpID0gMDsgaSA8IF9kZXNjT3JUYWdzLnNpemUoKTsgKytpICkgeworICAgICAgICAgICAgY2hhciBjID0gX2Rlc2NPclRhZ3NbaV07CisgICAgICAgICAgICBpZiggIWluVGFnICkgeworICAgICAgICAgICAgICAgIGlmKCBjID09ICdbJyApCisgICAgICAgICAgICAgICAgICAgIGluVGFnID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGRlc2MgKz0gYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlmKCBjID09ICddJyApIHsKKyAgICAgICAgICAgICAgICAgICAgVGVzdENhc2VJbmZvOjpTcGVjaWFsUHJvcGVydGllcyBwcm9wID0gcGFyc2VTcGVjaWFsVGFnKCB0YWcgKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHByb3AgPT0gVGVzdENhc2VJbmZvOjpJc0hpZGRlbiApCisgICAgICAgICAgICAgICAgICAgICAgICBpc0hpZGRlbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHByb3AgPT0gVGVzdENhc2VJbmZvOjpOb25lICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZm9yY2VOb3RSZXNlcnZlZFRhZyggdGFnLCBfbGluZUluZm8gKTsKKworICAgICAgICAgICAgICAgICAgICB0YWdzLmluc2VydCggdGFnICk7CisgICAgICAgICAgICAgICAgICAgIHRhZy5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICBpblRhZyA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHRhZyArPSBjOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmKCBpc0hpZGRlbiApIHsKKyAgICAgICAgICAgIHRhZ3MuaW5zZXJ0KCAiaGlkZSIgKTsKKyAgICAgICAgICAgIHRhZ3MuaW5zZXJ0KCAiLiIgKTsKKyAgICAgICAgfQorCisgICAgICAgIFRlc3RDYXNlSW5mbyBpbmZvKCBfbmFtZSwgX2NsYXNzTmFtZSwgZGVzYywgdGFncywgX2xpbmVJbmZvICk7CisgICAgICAgIHJldHVybiBUZXN0Q2FzZSggX3Rlc3RDYXNlLCBpbmZvICk7CisgICAgfQorCisgICAgdm9pZCBzZXRUYWdzKCBUZXN0Q2FzZUluZm8mIHRlc3RDYXNlSW5mbywgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IGNvbnN0JiB0YWdzICkKKyAgICB7CisgICAgICAgIHRlc3RDYXNlSW5mby50YWdzID0gdGFnczsKKyAgICAgICAgdGVzdENhc2VJbmZvLmxjYXNlVGFncy5jbGVhcigpOworCisgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgIGZvciggc3RkOjpzZXQ8c3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdCA9IHRhZ3MuYmVnaW4oKSwgaXRFbmQgPSB0YWdzLmVuZCgpOyBpdCAhPSBpdEVuZDsgKytpdCApIHsKKyAgICAgICAgICAgIG9zcyA8PCAnWycgPDwgKml0IDw8ICddJzsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGxjYXNlVGFnID0gdG9Mb3dlciggKml0ICk7CisgICAgICAgICAgICB0ZXN0Q2FzZUluZm8ucHJvcGVydGllcyA9IHN0YXRpY19jYXN0PFRlc3RDYXNlSW5mbzo6U3BlY2lhbFByb3BlcnRpZXM+KCB0ZXN0Q2FzZUluZm8ucHJvcGVydGllcyB8IHBhcnNlU3BlY2lhbFRhZyggbGNhc2VUYWcgKSApOworICAgICAgICAgICAgdGVzdENhc2VJbmZvLmxjYXNlVGFncy5pbnNlcnQoIGxjYXNlVGFnICk7CisgICAgICAgIH0KKyAgICAgICAgdGVzdENhc2VJbmZvLnRhZ3NBc1N0cmluZyA9IG9zcy5zdHIoKTsKKyAgICB9CisKKyAgICBUZXN0Q2FzZUluZm86OlRlc3RDYXNlSW5mbyggc3RkOjpzdHJpbmcgY29uc3QmIF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgX2NsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIF9kZXNjcmlwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IGNvbnN0JiBfdGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTGluZUluZm8gY29uc3QmIF9saW5lSW5mbyApCisgICAgOiAgIG5hbWUoIF9uYW1lICksCisgICAgICAgIGNsYXNzTmFtZSggX2NsYXNzTmFtZSApLAorICAgICAgICBkZXNjcmlwdGlvbiggX2Rlc2NyaXB0aW9uICksCisgICAgICAgIGxpbmVJbmZvKCBfbGluZUluZm8gKSwKKyAgICAgICAgcHJvcGVydGllcyggTm9uZSApCisgICAgeworICAgICAgICBzZXRUYWdzKCAqdGhpcywgX3RhZ3MgKTsKKyAgICB9CisKKyAgICBUZXN0Q2FzZUluZm86OlRlc3RDYXNlSW5mbyggVGVzdENhc2VJbmZvIGNvbnN0JiBvdGhlciApCisgICAgOiAgIG5hbWUoIG90aGVyLm5hbWUgKSwKKyAgICAgICAgY2xhc3NOYW1lKCBvdGhlci5jbGFzc05hbWUgKSwKKyAgICAgICAgZGVzY3JpcHRpb24oIG90aGVyLmRlc2NyaXB0aW9uICksCisgICAgICAgIHRhZ3MoIG90aGVyLnRhZ3MgKSwKKyAgICAgICAgbGNhc2VUYWdzKCBvdGhlci5sY2FzZVRhZ3MgKSwKKyAgICAgICAgdGFnc0FzU3RyaW5nKCBvdGhlci50YWdzQXNTdHJpbmcgKSwKKyAgICAgICAgbGluZUluZm8oIG90aGVyLmxpbmVJbmZvICksCisgICAgICAgIHByb3BlcnRpZXMoIG90aGVyLnByb3BlcnRpZXMgKQorICAgIHt9CisKKyAgICBib29sIFRlc3RDYXNlSW5mbzo6aXNIaWRkZW4oKSBjb25zdCB7CisgICAgICAgIHJldHVybiAoIHByb3BlcnRpZXMgJiBJc0hpZGRlbiApICE9IDA7CisgICAgfQorICAgIGJvb2wgVGVzdENhc2VJbmZvOjp0aHJvd3MoKSBjb25zdCB7CisgICAgICAgIHJldHVybiAoIHByb3BlcnRpZXMgJiBUaHJvd3MgKSAhPSAwOworICAgIH0KKyAgICBib29sIFRlc3RDYXNlSW5mbzo6b2tUb0ZhaWwoKSBjb25zdCB7CisgICAgICAgIHJldHVybiAoIHByb3BlcnRpZXMgJiAoU2hvdWxkRmFpbCB8IE1heUZhaWwgKSApICE9IDA7CisgICAgfQorICAgIGJvb2wgVGVzdENhc2VJbmZvOjpleHBlY3RlZFRvRmFpbCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICggcHJvcGVydGllcyAmIChTaG91bGRGYWlsICkgKSAhPSAwOworICAgIH0KKworICAgIFRlc3RDYXNlOjpUZXN0Q2FzZSggSVRlc3RDYXNlKiB0ZXN0Q2FzZSwgVGVzdENhc2VJbmZvIGNvbnN0JiBpbmZvICkgOiBUZXN0Q2FzZUluZm8oIGluZm8gKSwgdGVzdCggdGVzdENhc2UgKSB7fQorCisgICAgVGVzdENhc2U6OlRlc3RDYXNlKCBUZXN0Q2FzZSBjb25zdCYgb3RoZXIgKQorICAgIDogICBUZXN0Q2FzZUluZm8oIG90aGVyICksCisgICAgICAgIHRlc3QoIG90aGVyLnRlc3QgKQorICAgIHt9CisKKyAgICBUZXN0Q2FzZSBUZXN0Q2FzZTo6d2l0aE5hbWUoIHN0ZDo6c3RyaW5nIGNvbnN0JiBfbmV3TmFtZSApIGNvbnN0IHsKKyAgICAgICAgVGVzdENhc2Ugb3RoZXIoICp0aGlzICk7CisgICAgICAgIG90aGVyLm5hbWUgPSBfbmV3TmFtZTsKKyAgICAgICAgcmV0dXJuIG90aGVyOworICAgIH0KKworICAgIHZvaWQgVGVzdENhc2U6OnN3YXAoIFRlc3RDYXNlJiBvdGhlciApIHsKKyAgICAgICAgdGVzdC5zd2FwKCBvdGhlci50ZXN0ICk7CisgICAgICAgIG5hbWUuc3dhcCggb3RoZXIubmFtZSApOworICAgICAgICBjbGFzc05hbWUuc3dhcCggb3RoZXIuY2xhc3NOYW1lICk7CisgICAgICAgIGRlc2NyaXB0aW9uLnN3YXAoIG90aGVyLmRlc2NyaXB0aW9uICk7CisgICAgICAgIHRhZ3Muc3dhcCggb3RoZXIudGFncyApOworICAgICAgICBsY2FzZVRhZ3Muc3dhcCggb3RoZXIubGNhc2VUYWdzICk7CisgICAgICAgIHRhZ3NBc1N0cmluZy5zd2FwKCBvdGhlci50YWdzQXNTdHJpbmcgKTsKKyAgICAgICAgc3RkOjpzd2FwKCBUZXN0Q2FzZUluZm86OnByb3BlcnRpZXMsIHN0YXRpY19jYXN0PFRlc3RDYXNlSW5mbyY+KCBvdGhlciApLnByb3BlcnRpZXMgKTsKKyAgICAgICAgc3RkOjpzd2FwKCBsaW5lSW5mbywgb3RoZXIubGluZUluZm8gKTsKKyAgICB9CisKKyAgICB2b2lkIFRlc3RDYXNlOjppbnZva2UoKSBjb25zdCB7CisgICAgICAgIHRlc3QtPmludm9rZSgpOworICAgIH0KKworICAgIGJvb2wgVGVzdENhc2U6Om9wZXJhdG9yID09ICggVGVzdENhc2UgY29uc3QmIG90aGVyICkgY29uc3QgeworICAgICAgICByZXR1cm4gIHRlc3QuZ2V0KCkgPT0gb3RoZXIudGVzdC5nZXQoKSAmJgorICAgICAgICAgICAgICAgIG5hbWUgPT0gb3RoZXIubmFtZSAmJgorICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9PSBvdGhlci5jbGFzc05hbWU7CisgICAgfQorCisgICAgYm9vbCBUZXN0Q2FzZTo6b3BlcmF0b3IgPCAoIFRlc3RDYXNlIGNvbnN0JiBvdGhlciApIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG5hbWUgPCBvdGhlci5uYW1lOworICAgIH0KKyAgICBUZXN0Q2FzZSYgVGVzdENhc2U6Om9wZXJhdG9yID0gKCBUZXN0Q2FzZSBjb25zdCYgb3RoZXIgKSB7CisgICAgICAgIFRlc3RDYXNlIHRlbXAoIG90aGVyICk7CisgICAgICAgIHN3YXAoIHRlbXAgKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFRlc3RDYXNlSW5mbyBjb25zdCYgVGVzdENhc2U6OmdldFRlc3RDYXNlSW5mbygpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3ZlcnNpb24uaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9WRVJTSU9OX0hQUF9JTkNMVURFRAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgVmVyc2lvbjo6VmVyc2lvbgorICAgICAgICAoICAgdW5zaWduZWQgaW50IF9tYWpvclZlcnNpb24sCisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgX21pbm9yVmVyc2lvbiwKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBfcGF0Y2hOdW1iZXIsCisgICAgICAgICAgICBjaGFyIGNvbnN0ICogY29uc3QgX2JyYW5jaE5hbWUsCisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgX2J1aWxkTnVtYmVyICkKKyAgICA6ICAgbWFqb3JWZXJzaW9uKCBfbWFqb3JWZXJzaW9uICksCisgICAgICAgIG1pbm9yVmVyc2lvbiggX21pbm9yVmVyc2lvbiApLAorICAgICAgICBwYXRjaE51bWJlciggX3BhdGNoTnVtYmVyICksCisgICAgICAgIGJyYW5jaE5hbWUoIF9icmFuY2hOYW1lICksCisgICAgICAgIGJ1aWxkTnVtYmVyKCBfYnVpbGROdW1iZXIgKQorICAgIHt9CisKKyAgICBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yIDw8ICggc3RkOjpvc3RyZWFtJiBvcywgVmVyc2lvbiBjb25zdCYgdmVyc2lvbiApIHsKKyAgICAgICAgb3MgIDw8IHZlcnNpb24ubWFqb3JWZXJzaW9uIDw8ICcuJworICAgICAgICAgICAgPDwgdmVyc2lvbi5taW5vclZlcnNpb24gPDwgJy4nCisgICAgICAgICAgICA8PCB2ZXJzaW9uLnBhdGNoTnVtYmVyOworICAgICAgICAvLyBicmFuY2hOYW1lIGlzIG5ldmVyIG51bGwgLT4gMHRoIGNoYXIgaXMgXDAgaWYgaXQgaXMgZW1wdHkKKyAgICAgICAgaWYgKHZlcnNpb24uYnJhbmNoTmFtZVswXSkgeworICAgICAgICAgICAgb3MgPDwgJy0nIDw8IHZlcnNpb24uYnJhbmNoTmFtZQorICAgICAgICAgICAgICAgPDwgJy4nIDw8IHZlcnNpb24uYnVpbGROdW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG9zOworICAgIH0KKworICAgIGlubGluZSBWZXJzaW9uIGxpYnJhcnlWZXJzaW9uKCkgeworICAgICAgICBzdGF0aWMgVmVyc2lvbiB2ZXJzaW9uKCAxLCA5LCA0LCAiIiwgMCApOworICAgICAgICByZXR1cm4gdmVyc2lvbjsKKyAgICB9CisKK30KKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX21lc3NhZ2UuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9NRVNTQUdFX0hQUF9JTkNMVURFRAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgTWVzc2FnZUluZm86Ok1lc3NhZ2VJbmZvKCAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfbWFjcm9OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgX2xpbmVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHRXYXM6Ok9mVHlwZSBfdHlwZSApCisgICAgOiAgIG1hY3JvTmFtZSggX21hY3JvTmFtZSApLAorICAgICAgICBsaW5lSW5mbyggX2xpbmVJbmZvICksCisgICAgICAgIHR5cGUoIF90eXBlICksCisgICAgICAgIHNlcXVlbmNlKCArK2dsb2JhbENvdW50ICkKKyAgICB7fQorCisgICAgLy8gVGhpcyBtYXkgbmVlZCBwcm90ZWN0aW5nIGlmIHRocmVhZGluZyBzdXBwb3J0IGlzIGFkZGVkCisgICAgdW5zaWduZWQgaW50IE1lc3NhZ2VJbmZvOjpnbG9iYWxDb3VudCA9IDA7CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBTY29wZWRNZXNzYWdlOjpTY29wZWRNZXNzYWdlKCBNZXNzYWdlQnVpbGRlciBjb25zdCYgYnVpbGRlciApCisgICAgOiBtX2luZm8oIGJ1aWxkZXIubV9pbmZvICkKKyAgICB7CisgICAgICAgIG1faW5mby5tZXNzYWdlID0gYnVpbGRlci5tX3N0cmVhbS5zdHIoKTsKKyAgICAgICAgZ2V0UmVzdWx0Q2FwdHVyZSgpLnB1c2hTY29wZWRNZXNzYWdlKCBtX2luZm8gKTsKKyAgICB9CisgICAgU2NvcGVkTWVzc2FnZTo6U2NvcGVkTWVzc2FnZSggU2NvcGVkTWVzc2FnZSBjb25zdCYgb3RoZXIgKQorICAgIDogbV9pbmZvKCBvdGhlci5tX2luZm8gKQorICAgIHt9CisKKyAgICBTY29wZWRNZXNzYWdlOjp+U2NvcGVkTWVzc2FnZSgpIHsKKyAgICAgICAgaWYgKCAhc3RkOjp1bmNhdWdodF9leGNlcHRpb24oKSApeworICAgICAgICAgICAgZ2V0UmVzdWx0Q2FwdHVyZSgpLnBvcFNjb3BlZE1lc3NhZ2UobV9pbmZvKTsKKyAgICAgICAgfQorICAgIH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9sZWdhY3lfcmVwb3J0ZXJfYWRhcHRlci5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0xFR0FDWV9SRVBPUlRFUl9BREFQVEVSX0hQUF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfbGVnYWN5X3JlcG9ydGVyX2FkYXB0ZXIuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfTEVHQUNZX1JFUE9SVEVSX0FEQVBURVJfSF9JTkNMVURFRAorCituYW1lc3BhY2UgQ2F0Y2gKK3sKKyAgICAvLyBEZXByZWNhdGVkCisgICAgc3RydWN0IElSZXBvcnRlciA6IElTaGFyZWQgeworICAgICAgICB2aXJ0dWFsIH5JUmVwb3J0ZXIoKTsKKworICAgICAgICB2aXJ0dWFsIGJvb2wgc2hvdWxkUmVkaXJlY3RTdGRvdXQoKSBjb25zdCA9IDA7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIFN0YXJ0VGVzdGluZygpID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIEVuZFRlc3RpbmcoIFRvdGFscyBjb25zdCYgdG90YWxzICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgU3RhcnRHcm91cCggc3RkOjpzdHJpbmcgY29uc3QmIGdyb3VwTmFtZSApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIEVuZEdyb3VwKCBzdGQ6OnN0cmluZyBjb25zdCYgZ3JvdXBOYW1lLCBUb3RhbHMgY29uc3QmIHRvdGFscyApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIFN0YXJ0VGVzdENhc2UoIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdEluZm8gKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBFbmRUZXN0Q2FzZSggVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0SW5mbywgVG90YWxzIGNvbnN0JiB0b3RhbHMsIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdGRPdXQsIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdGRFcnIgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBTdGFydFNlY3Rpb24oIHN0ZDo6c3RyaW5nIGNvbnN0JiBzZWN0aW9uTmFtZSwgc3RkOjpzdHJpbmcgY29uc3QmIGRlc2NyaXB0aW9uICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgRW5kU2VjdGlvbiggc3RkOjpzdHJpbmcgY29uc3QmIHNlY3Rpb25OYW1lLCBDb3VudHMgY29uc3QmIGFzc2VydGlvbnMgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBOb0Fzc2VydGlvbnNJblNlY3Rpb24oIHN0ZDo6c3RyaW5nIGNvbnN0JiBzZWN0aW9uTmFtZSApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIE5vQXNzZXJ0aW9uc0luVGVzdENhc2UoIHN0ZDo6c3RyaW5nIGNvbnN0JiB0ZXN0TmFtZSApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIEFib3J0ZWQoKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBSZXN1bHQoIEFzc2VydGlvblJlc3VsdCBjb25zdCYgcmVzdWx0ICkgPSAwOworICAgIH07CisKKyAgICBjbGFzcyBMZWdhY3lSZXBvcnRlckFkYXB0ZXIgOiBwdWJsaWMgU2hhcmVkSW1wbDxJU3RyZWFtaW5nUmVwb3J0ZXI+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgICAgTGVnYWN5UmVwb3J0ZXJBZGFwdGVyKCBQdHI8SVJlcG9ydGVyPiBjb25zdCYgbGVnYWN5UmVwb3J0ZXIgKTsKKyAgICAgICAgdmlydHVhbCB+TGVnYWN5UmVwb3J0ZXJBZGFwdGVyKCk7CisKKyAgICAgICAgdmlydHVhbCBSZXBvcnRlclByZWZlcmVuY2VzIGdldFByZWZlcmVuY2VzKCkgY29uc3Q7CisgICAgICAgIHZpcnR1YWwgdm9pZCBub01hdGNoaW5nVGVzdENhc2VzKCBzdGQ6OnN0cmluZyBjb25zdCYgKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RSdW5TdGFydGluZyggVGVzdFJ1bkluZm8gY29uc3QmICk7CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0R3JvdXBTdGFydGluZyggR3JvdXBJbmZvIGNvbnN0JiBncm91cEluZm8gKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RDYXNlU3RhcnRpbmcoIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdEluZm8gKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHNlY3Rpb25TdGFydGluZyggU2VjdGlvbkluZm8gY29uc3QmIHNlY3Rpb25JbmZvICk7CisgICAgICAgIHZpcnR1YWwgdm9pZCBhc3NlcnRpb25TdGFydGluZyggQXNzZXJ0aW9uSW5mbyBjb25zdCYgKTsKKyAgICAgICAgdmlydHVhbCBib29sIGFzc2VydGlvbkVuZGVkKCBBc3NlcnRpb25TdGF0cyBjb25zdCYgYXNzZXJ0aW9uU3RhdHMgKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHNlY3Rpb25FbmRlZCggU2VjdGlvblN0YXRzIGNvbnN0JiBzZWN0aW9uU3RhdHMgKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RDYXNlRW5kZWQoIFRlc3RDYXNlU3RhdHMgY29uc3QmIHRlc3RDYXNlU3RhdHMgKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RHcm91cEVuZGVkKCBUZXN0R3JvdXBTdGF0cyBjb25zdCYgdGVzdEdyb3VwU3RhdHMgKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RSdW5FbmRlZCggVGVzdFJ1blN0YXRzIGNvbnN0JiB0ZXN0UnVuU3RhdHMgKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHNraXBUZXN0KCBUZXN0Q2FzZUluZm8gY29uc3QmICk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBQdHI8SVJlcG9ydGVyPiBtX2xlZ2FjeVJlcG9ydGVyOworICAgIH07Cit9CisKK25hbWVzcGFjZSBDYXRjaAoreworICAgIExlZ2FjeVJlcG9ydGVyQWRhcHRlcjo6TGVnYWN5UmVwb3J0ZXJBZGFwdGVyKCBQdHI8SVJlcG9ydGVyPiBjb25zdCYgbGVnYWN5UmVwb3J0ZXIgKQorICAgIDogICBtX2xlZ2FjeVJlcG9ydGVyKCBsZWdhY3lSZXBvcnRlciApCisgICAge30KKyAgICBMZWdhY3lSZXBvcnRlckFkYXB0ZXI6On5MZWdhY3lSZXBvcnRlckFkYXB0ZXIoKSB7fQorCisgICAgUmVwb3J0ZXJQcmVmZXJlbmNlcyBMZWdhY3lSZXBvcnRlckFkYXB0ZXI6OmdldFByZWZlcmVuY2VzKCkgY29uc3QgeworICAgICAgICBSZXBvcnRlclByZWZlcmVuY2VzIHByZWZzOworICAgICAgICBwcmVmcy5zaG91bGRSZWRpcmVjdFN0ZE91dCA9IG1fbGVnYWN5UmVwb3J0ZXItPnNob3VsZFJlZGlyZWN0U3Rkb3V0KCk7CisgICAgICAgIHJldHVybiBwcmVmczsKKyAgICB9CisKKyAgICB2b2lkIExlZ2FjeVJlcG9ydGVyQWRhcHRlcjo6bm9NYXRjaGluZ1Rlc3RDYXNlcyggc3RkOjpzdHJpbmcgY29uc3QmICkge30KKyAgICB2b2lkIExlZ2FjeVJlcG9ydGVyQWRhcHRlcjo6dGVzdFJ1blN0YXJ0aW5nKCBUZXN0UnVuSW5mbyBjb25zdCYgKSB7CisgICAgICAgIG1fbGVnYWN5UmVwb3J0ZXItPlN0YXJ0VGVzdGluZygpOworICAgIH0KKyAgICB2b2lkIExlZ2FjeVJlcG9ydGVyQWRhcHRlcjo6dGVzdEdyb3VwU3RhcnRpbmcoIEdyb3VwSW5mbyBjb25zdCYgZ3JvdXBJbmZvICkgeworICAgICAgICBtX2xlZ2FjeVJlcG9ydGVyLT5TdGFydEdyb3VwKCBncm91cEluZm8ubmFtZSApOworICAgIH0KKyAgICB2b2lkIExlZ2FjeVJlcG9ydGVyQWRhcHRlcjo6dGVzdENhc2VTdGFydGluZyggVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0SW5mbyApIHsKKyAgICAgICAgbV9sZWdhY3lSZXBvcnRlci0+U3RhcnRUZXN0Q2FzZSggdGVzdEluZm8gKTsKKyAgICB9CisgICAgdm9pZCBMZWdhY3lSZXBvcnRlckFkYXB0ZXI6OnNlY3Rpb25TdGFydGluZyggU2VjdGlvbkluZm8gY29uc3QmIHNlY3Rpb25JbmZvICkgeworICAgICAgICBtX2xlZ2FjeVJlcG9ydGVyLT5TdGFydFNlY3Rpb24oIHNlY3Rpb25JbmZvLm5hbWUsIHNlY3Rpb25JbmZvLmRlc2NyaXB0aW9uICk7CisgICAgfQorICAgIHZvaWQgTGVnYWN5UmVwb3J0ZXJBZGFwdGVyOjphc3NlcnRpb25TdGFydGluZyggQXNzZXJ0aW9uSW5mbyBjb25zdCYgKSB7CisgICAgICAgIC8vIE5vdCBvbiBsZWdhY3kgaW50ZXJmYWNlCisgICAgfQorCisgICAgYm9vbCBMZWdhY3lSZXBvcnRlckFkYXB0ZXI6OmFzc2VydGlvbkVuZGVkKCBBc3NlcnRpb25TdGF0cyBjb25zdCYgYXNzZXJ0aW9uU3RhdHMgKSB7CisgICAgICAgIGlmKCBhc3NlcnRpb25TdGF0cy5hc3NlcnRpb25SZXN1bHQuZ2V0UmVzdWx0VHlwZSgpICE9IFJlc3VsdFdhczo6T2sgKSB7CisgICAgICAgICAgICBmb3IoIHN0ZDo6dmVjdG9yPE1lc3NhZ2VJbmZvPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBhc3NlcnRpb25TdGF0cy5pbmZvTWVzc2FnZXMuYmVnaW4oKSwgaXRFbmQgPSBhc3NlcnRpb25TdGF0cy5pbmZvTWVzc2FnZXMuZW5kKCk7CisgICAgICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICAgICArK2l0ICkgeworICAgICAgICAgICAgICAgIGlmKCBpdC0+dHlwZSA9PSBSZXN1bHRXYXM6OkluZm8gKSB7CisgICAgICAgICAgICAgICAgICAgIFJlc3VsdEJ1aWxkZXIgcmIoIGl0LT5tYWNyb05hbWUuY19zdHIoKSwgaXQtPmxpbmVJbmZvLCAiIiwgUmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCApOworICAgICAgICAgICAgICAgICAgICByYiA8PCBpdC0+bWVzc2FnZTsKKyAgICAgICAgICAgICAgICAgICAgcmIuc2V0UmVzdWx0VHlwZSggUmVzdWx0V2FzOjpJbmZvICk7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydGlvblJlc3VsdCByZXN1bHQgPSByYi5idWlsZCgpOworICAgICAgICAgICAgICAgICAgICBtX2xlZ2FjeVJlcG9ydGVyLT5SZXN1bHQoIHJlc3VsdCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtX2xlZ2FjeVJlcG9ydGVyLT5SZXN1bHQoIGFzc2VydGlvblN0YXRzLmFzc2VydGlvblJlc3VsdCApOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgdm9pZCBMZWdhY3lSZXBvcnRlckFkYXB0ZXI6OnNlY3Rpb25FbmRlZCggU2VjdGlvblN0YXRzIGNvbnN0JiBzZWN0aW9uU3RhdHMgKSB7CisgICAgICAgIGlmKCBzZWN0aW9uU3RhdHMubWlzc2luZ0Fzc2VydGlvbnMgKQorICAgICAgICAgICAgbV9sZWdhY3lSZXBvcnRlci0+Tm9Bc3NlcnRpb25zSW5TZWN0aW9uKCBzZWN0aW9uU3RhdHMuc2VjdGlvbkluZm8ubmFtZSApOworICAgICAgICBtX2xlZ2FjeVJlcG9ydGVyLT5FbmRTZWN0aW9uKCBzZWN0aW9uU3RhdHMuc2VjdGlvbkluZm8ubmFtZSwgc2VjdGlvblN0YXRzLmFzc2VydGlvbnMgKTsKKyAgICB9CisgICAgdm9pZCBMZWdhY3lSZXBvcnRlckFkYXB0ZXI6OnRlc3RDYXNlRW5kZWQoIFRlc3RDYXNlU3RhdHMgY29uc3QmIHRlc3RDYXNlU3RhdHMgKSB7CisgICAgICAgIG1fbGVnYWN5UmVwb3J0ZXItPkVuZFRlc3RDYXNlCisgICAgICAgICAgICAoICAgdGVzdENhc2VTdGF0cy50ZXN0SW5mbywKKyAgICAgICAgICAgICAgICB0ZXN0Q2FzZVN0YXRzLnRvdGFscywKKyAgICAgICAgICAgICAgICB0ZXN0Q2FzZVN0YXRzLnN0ZE91dCwKKyAgICAgICAgICAgICAgICB0ZXN0Q2FzZVN0YXRzLnN0ZEVyciApOworICAgIH0KKyAgICB2b2lkIExlZ2FjeVJlcG9ydGVyQWRhcHRlcjo6dGVzdEdyb3VwRW5kZWQoIFRlc3RHcm91cFN0YXRzIGNvbnN0JiB0ZXN0R3JvdXBTdGF0cyApIHsKKyAgICAgICAgaWYoIHRlc3RHcm91cFN0YXRzLmFib3J0aW5nICkKKyAgICAgICAgICAgIG1fbGVnYWN5UmVwb3J0ZXItPkFib3J0ZWQoKTsKKyAgICAgICAgbV9sZWdhY3lSZXBvcnRlci0+RW5kR3JvdXAoIHRlc3RHcm91cFN0YXRzLmdyb3VwSW5mby5uYW1lLCB0ZXN0R3JvdXBTdGF0cy50b3RhbHMgKTsKKyAgICB9CisgICAgdm9pZCBMZWdhY3lSZXBvcnRlckFkYXB0ZXI6OnRlc3RSdW5FbmRlZCggVGVzdFJ1blN0YXRzIGNvbnN0JiB0ZXN0UnVuU3RhdHMgKSB7CisgICAgICAgIG1fbGVnYWN5UmVwb3J0ZXItPkVuZFRlc3RpbmcoIHRlc3RSdW5TdGF0cy50b3RhbHMgKTsKKyAgICB9CisgICAgdm9pZCBMZWdhY3lSZXBvcnRlckFkYXB0ZXI6OnNraXBUZXN0KCBUZXN0Q2FzZUluZm8gY29uc3QmICkgeworICAgIH0KK30KKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3RpbWVyLmhwcAorCisjaWZkZWYgX19jbGFuZ19fCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XYysrMTEtbG9uZy1sb25nIgorI2VuZGlmCisKKyNpZmRlZiBDQVRDSF9QTEFURk9STV9XSU5ET1dTCisKKyNlbHNlCisKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorCisjZW5kaWYKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIG5hbWVzcGFjZSB7CisjaWZkZWYgQ0FUQ0hfUExBVEZPUk1fV0lORE9XUworICAgICAgICBVSW50NjQgZ2V0Q3VycmVudFRpY2tzKCkgeworICAgICAgICAgICAgc3RhdGljIFVJbnQ2NCBoej0wLCBoem89MDsKKyAgICAgICAgICAgIGlmICghaHopIHsKKyAgICAgICAgICAgICAgICBRdWVyeVBlcmZvcm1hbmNlRnJlcXVlbmN5KCByZWludGVycHJldF9jYXN0PExBUkdFX0lOVEVHRVIqPiggJmh6ICkgKTsKKyAgICAgICAgICAgICAgICBRdWVyeVBlcmZvcm1hbmNlQ291bnRlciggcmVpbnRlcnByZXRfY2FzdDxMQVJHRV9JTlRFR0VSKj4oICZoem8gKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVUludDY0IHQ7CisgICAgICAgICAgICBRdWVyeVBlcmZvcm1hbmNlQ291bnRlciggcmVpbnRlcnByZXRfY2FzdDxMQVJHRV9JTlRFR0VSKj4oICZ0ICkgKTsKKyAgICAgICAgICAgIHJldHVybiAoKHQtaHpvKSoxMDAwMDAwKS9oejsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgVUludDY0IGdldEN1cnJlbnRUaWNrcygpIHsKKyAgICAgICAgICAgIHRpbWV2YWwgdDsKKyAgICAgICAgICAgIGdldHRpbWVvZmRheSgmdCxDQVRDSF9OVUxMKTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxVSW50NjQ+KCB0LnR2X3NlYyApICogMTAwMDAwMHVsbCArIHN0YXRpY19jYXN0PFVJbnQ2ND4oIHQudHZfdXNlYyApOworICAgICAgICB9CisjZW5kaWYKKyAgICB9CisKKyAgICB2b2lkIFRpbWVyOjpzdGFydCgpIHsKKyAgICAgICAgbV90aWNrcyA9IGdldEN1cnJlbnRUaWNrcygpOworICAgIH0KKyAgICB1bnNpZ25lZCBpbnQgVGltZXI6OmdldEVsYXBzZWRNaWNyb3NlY29uZHMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KGdldEN1cnJlbnRUaWNrcygpIC0gbV90aWNrcyk7CisgICAgfQorICAgIHVuc2lnbmVkIGludCBUaW1lcjo6Z2V0RWxhcHNlZE1pbGxpc2Vjb25kcygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oZ2V0RWxhcHNlZE1pY3Jvc2Vjb25kcygpLzEwMDApOworICAgIH0KKyAgICBkb3VibGUgVGltZXI6OmdldEVsYXBzZWRTZWNvbmRzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gZ2V0RWxhcHNlZE1pY3Jvc2Vjb25kcygpLzEwMDAwMDAuMDsKKyAgICB9CisKK30gLy8gbmFtZXNwYWNlIENhdGNoCisKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKKyNlbmRpZgorLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2NvbW1vbi5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0NPTU1PTl9IUFBfSU5DTFVERUQKKworI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8Y2N0eXBlPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgYm9vbCBzdGFydHNXaXRoKCBzdGQ6OnN0cmluZyBjb25zdCYgcywgc3RkOjpzdHJpbmcgY29uc3QmIHByZWZpeCApIHsKKyAgICAgICAgcmV0dXJuIHMuc2l6ZSgpID49IHByZWZpeC5zaXplKCkgJiYgc3RkOjplcXVhbChwcmVmaXguYmVnaW4oKSwgcHJlZml4LmVuZCgpLCBzLmJlZ2luKCkpOworICAgIH0KKyAgICBib29sIHN0YXJ0c1dpdGgoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzLCBjaGFyIHByZWZpeCApIHsKKyAgICAgICAgcmV0dXJuICFzLmVtcHR5KCkgJiYgc1swXSA9PSBwcmVmaXg7CisgICAgfQorICAgIGJvb2wgZW5kc1dpdGgoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzLCBzdGQ6OnN0cmluZyBjb25zdCYgc3VmZml4ICkgeworICAgICAgICByZXR1cm4gcy5zaXplKCkgPj0gc3VmZml4LnNpemUoKSAmJiBzdGQ6OmVxdWFsKHN1ZmZpeC5yYmVnaW4oKSwgc3VmZml4LnJlbmQoKSwgcy5yYmVnaW4oKSk7CisgICAgfQorICAgIGJvb2wgZW5kc1dpdGgoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzLCBjaGFyIHN1ZmZpeCApIHsKKyAgICAgICAgcmV0dXJuICFzLmVtcHR5KCkgJiYgc1tzLnNpemUoKS0xXSA9PSBzdWZmaXg7CisgICAgfQorICAgIGJvb2wgY29udGFpbnMoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzLCBzdGQ6OnN0cmluZyBjb25zdCYgaW5maXggKSB7CisgICAgICAgIHJldHVybiBzLmZpbmQoIGluZml4ICkgIT0gc3RkOjpzdHJpbmc6Om5wb3M7CisgICAgfQorICAgIGNoYXIgdG9Mb3dlckNoKGNoYXIgYykgeworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y2hhcj4oIHN0ZDo6dG9sb3dlciggYyApICk7CisgICAgfQorICAgIHZvaWQgdG9Mb3dlckluUGxhY2UoIHN0ZDo6c3RyaW5nJiBzICkgeworICAgICAgICBzdGQ6OnRyYW5zZm9ybSggcy5iZWdpbigpLCBzLmVuZCgpLCBzLmJlZ2luKCksIHRvTG93ZXJDaCApOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyB0b0xvd2VyKCBzdGQ6OnN0cmluZyBjb25zdCYgcyApIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgbGMgPSBzOworICAgICAgICB0b0xvd2VySW5QbGFjZSggbGMgKTsKKyAgICAgICAgcmV0dXJuIGxjOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyB0cmltKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyICkgeworICAgICAgICBzdGF0aWMgY2hhciBjb25zdCogd2hpdGVzcGFjZUNoYXJzID0gIlxuXHJcdCAiOworICAgICAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIHN0YXJ0ID0gc3RyLmZpbmRfZmlyc3Rfbm90X29mKCB3aGl0ZXNwYWNlQ2hhcnMgKTsKKyAgICAgICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBlbmQgPSBzdHIuZmluZF9sYXN0X25vdF9vZiggd2hpdGVzcGFjZUNoYXJzICk7CisKKyAgICAgICAgcmV0dXJuIHN0YXJ0ICE9IHN0ZDo6c3RyaW5nOjpucG9zID8gc3RyLnN1YnN0ciggc3RhcnQsIDErZW5kLXN0YXJ0ICkgOiBzdGQ6OnN0cmluZygpOworICAgIH0KKworICAgIGJvb2wgcmVwbGFjZUluUGxhY2UoIHN0ZDo6c3RyaW5nJiBzdHIsIHN0ZDo6c3RyaW5nIGNvbnN0JiByZXBsYWNlVGhpcywgc3RkOjpzdHJpbmcgY29uc3QmIHdpdGhUaGlzICkgeworICAgICAgICBib29sIHJlcGxhY2VkID0gZmFsc2U7CisgICAgICAgIHN0ZDo6c2l6ZV90IGkgPSBzdHIuZmluZCggcmVwbGFjZVRoaXMgKTsKKyAgICAgICAgd2hpbGUoIGkgIT0gc3RkOjpzdHJpbmc6Om5wb3MgKSB7CisgICAgICAgICAgICByZXBsYWNlZCA9IHRydWU7CisgICAgICAgICAgICBzdHIgPSBzdHIuc3Vic3RyKCAwLCBpICkgKyB3aXRoVGhpcyArIHN0ci5zdWJzdHIoIGkrcmVwbGFjZVRoaXMuc2l6ZSgpICk7CisgICAgICAgICAgICBpZiggaSA8IHN0ci5zaXplKCktd2l0aFRoaXMuc2l6ZSgpICkKKyAgICAgICAgICAgICAgICBpID0gc3RyLmZpbmQoIHJlcGxhY2VUaGlzLCBpK3dpdGhUaGlzLnNpemUoKSApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGkgPSBzdGQ6OnN0cmluZzo6bnBvczsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVwbGFjZWQ7CisgICAgfQorCisgICAgcGx1cmFsaXNlOjpwbHVyYWxpc2UoIHN0ZDo6c2l6ZV90IGNvdW50LCBzdGQ6OnN0cmluZyBjb25zdCYgbGFiZWwgKQorICAgIDogICBtX2NvdW50KCBjb3VudCApLAorICAgICAgICBtX2xhYmVsKCBsYWJlbCApCisgICAge30KKworICAgIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwgKCBzdGQ6Om9zdHJlYW0mIG9zLCBwbHVyYWxpc2UgY29uc3QmIHBsdXJhbGlzZXIgKSB7CisgICAgICAgIG9zIDw8IHBsdXJhbGlzZXIubV9jb3VudCA8PCAnICcgPDwgcGx1cmFsaXNlci5tX2xhYmVsOworICAgICAgICBpZiggcGx1cmFsaXNlci5tX2NvdW50ICE9IDEgKQorICAgICAgICAgICAgb3MgPDwgJ3MnOworICAgICAgICByZXR1cm4gb3M7CisgICAgfQorCisgICAgU291cmNlTGluZUluZm86OlNvdXJjZUxpbmVJbmZvKCkgOiBmaWxlKCIiKSwgbGluZSggMCApe30KKyAgICBTb3VyY2VMaW5lSW5mbzo6U291cmNlTGluZUluZm8oIGNoYXIgY29uc3QqIF9maWxlLCBzdGQ6OnNpemVfdCBfbGluZSApCisgICAgOiAgIGZpbGUoIF9maWxlICksCisgICAgICAgIGxpbmUoIF9saW5lICkKKyAgICB7fQorICAgIGJvb2wgU291cmNlTGluZUluZm86OmVtcHR5KCkgY29uc3QgeworICAgICAgICByZXR1cm4gZmlsZVswXSA9PSAnXDAnOworICAgIH0KKyAgICBib29sIFNvdXJjZUxpbmVJbmZvOjpvcGVyYXRvciA9PSAoIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBvdGhlciApIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGxpbmUgPT0gb3RoZXIubGluZSAmJiAoZmlsZSA9PSBvdGhlci5maWxlIHx8IHN0ZDo6c3RyY21wKGZpbGUsIG90aGVyLmZpbGUpID09IDApOworICAgIH0KKyAgICBib29sIFNvdXJjZUxpbmVJbmZvOjpvcGVyYXRvciA8ICggU291cmNlTGluZUluZm8gY29uc3QmIG90aGVyICkgY29uc3QgeworICAgICAgICByZXR1cm4gbGluZSA8IG90aGVyLmxpbmUgfHwgKCBsaW5lID09IG90aGVyLmxpbmUgJiYgKHN0ZDo6c3RyY21wKGZpbGUsIG90aGVyLmZpbGUpIDwgMCkpOworICAgIH0KKworICAgIHZvaWQgc2VlZFJuZyggSUNvbmZpZyBjb25zdCYgY29uZmlnICkgeworICAgICAgICBpZiggY29uZmlnLnJuZ1NlZWQoKSAhPSAwICkKKyAgICAgICAgICAgIHN0ZDo6c3JhbmQoIGNvbmZpZy5ybmdTZWVkKCkgKTsKKyAgICB9CisgICAgdW5zaWduZWQgaW50IHJuZ1NlZWQoKSB7CisgICAgICAgIHJldHVybiBnZXRDdXJyZW50Q29udGV4dCgpLmdldENvbmZpZygpLT5ybmdTZWVkKCk7CisgICAgfQorCisgICAgc3RkOjpvc3RyZWFtJiBvcGVyYXRvciA8PCAoIHN0ZDo6b3N0cmVhbSYgb3MsIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBpbmZvICkgeworI2lmbmRlZiBfX0dOVUdfXworICAgICAgICBvcyA8PCBpbmZvLmZpbGUgPDwgJygnIDw8IGluZm8ubGluZSA8PCAnKSc7CisjZWxzZQorICAgICAgICBvcyA8PCBpbmZvLmZpbGUgPDwgJzonIDw8IGluZm8ubGluZTsKKyNlbmRpZgorICAgICAgICByZXR1cm4gb3M7CisgICAgfQorCisgICAgdm9pZCB0aHJvd0xvZ2ljRXJyb3IoIHN0ZDo6c3RyaW5nIGNvbnN0JiBtZXNzYWdlLCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbG9jYXRpb25JbmZvICkgeworICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICBvc3MgPDwgbG9jYXRpb25JbmZvIDw8ICI6IEludGVybmFsIENhdGNoIGVycm9yOiAnIiA8PCBtZXNzYWdlIDw8ICdcJyc7CisgICAgICAgIGlmKCBhbHdheXNUcnVlKCkgKQorICAgICAgICAgICAgdGhyb3cgc3RkOjpsb2dpY19lcnJvciggb3NzLnN0cigpICk7CisgICAgfQorfQorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfc2VjdGlvbi5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1NFQ1RJT05fSFBQX0lOQ0xVREVECisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBTZWN0aW9uSW5mbzo6U2VjdGlvbkluZm8KKyAgICAgICAgKCAgIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBfbGluZUluZm8sCisgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgX25hbWUsCisgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgX2Rlc2NyaXB0aW9uICkKKyAgICA6ICAgbmFtZSggX25hbWUgKSwKKyAgICAgICAgZGVzY3JpcHRpb24oIF9kZXNjcmlwdGlvbiApLAorICAgICAgICBsaW5lSW5mbyggX2xpbmVJbmZvICkKKyAgICB7fQorCisgICAgU2VjdGlvbjo6U2VjdGlvbiggU2VjdGlvbkluZm8gY29uc3QmIGluZm8gKQorICAgIDogICBtX2luZm8oIGluZm8gKSwKKyAgICAgICAgbV9zZWN0aW9uSW5jbHVkZWQoIGdldFJlc3VsdENhcHR1cmUoKS5zZWN0aW9uU3RhcnRlZCggbV9pbmZvLCBtX2Fzc2VydGlvbnMgKSApCisgICAgeworICAgICAgICBtX3RpbWVyLnN0YXJ0KCk7CisgICAgfQorCisgICAgU2VjdGlvbjo6flNlY3Rpb24oKSB7CisgICAgICAgIGlmKCBtX3NlY3Rpb25JbmNsdWRlZCApIHsKKyAgICAgICAgICAgIFNlY3Rpb25FbmRJbmZvIGVuZEluZm8oIG1faW5mbywgbV9hc3NlcnRpb25zLCBtX3RpbWVyLmdldEVsYXBzZWRTZWNvbmRzKCkgKTsKKyAgICAgICAgICAgIGlmKCBzdGQ6OnVuY2F1Z2h0X2V4Y2VwdGlvbigpICkKKyAgICAgICAgICAgICAgICBnZXRSZXN1bHRDYXB0dXJlKCkuc2VjdGlvbkVuZGVkRWFybHkoIGVuZEluZm8gKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBnZXRSZXN1bHRDYXB0dXJlKCkuc2VjdGlvbkVuZGVkKCBlbmRJbmZvICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUaGlzIGluZGljYXRlcyB3aGV0aGVyIHRoZSBzZWN0aW9uIHNob3VsZCBiZSBleGVjdXRlZCBvciBub3QKKyAgICBTZWN0aW9uOjpvcGVyYXRvciBib29sKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV9zZWN0aW9uSW5jbHVkZWQ7CisgICAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2RlYnVnZ2VyLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfREVCVUdHRVJfSFBQX0lOQ0xVREVECisKKyNpZmRlZiBDQVRDSF9QTEFURk9STV9NQUMKKworICAgICNpbmNsdWRlIDxhc3NlcnQuaD4KKyAgICAjaW5jbHVkZSA8c3RkYm9vbC5oPgorICAgICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyAgICAjaW5jbHVkZSA8dW5pc3RkLmg+CisgICAgI2luY2x1ZGUgPHN5cy9zeXNjdGwuaD4KKworICAgIG5hbWVzcGFjZSBDYXRjaHsKKworICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIGlzIHRha2VuIGRpcmVjdGx5IGZyb20gdGhlIGZvbGxvd2luZyB0ZWNobmljYWwgbm90ZToKKyAgICAgICAgLy8gaHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vbGlicmFyeS9tYWMvI3FhL3FhMjAwNC9xYTEzNjEuaHRtbAorCisgICAgICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgY3VycmVudCBwcm9jZXNzIGlzIGJlaW5nIGRlYnVnZ2VkIChlaXRoZXIKKyAgICAgICAgLy8gcnVubmluZyB1bmRlciB0aGUgZGVidWdnZXIgb3IgaGFzIGEgZGVidWdnZXIgYXR0YWNoZWQgcG9zdCBmYWN0bykuCisgICAgICAgIGJvb2wgaXNEZWJ1Z2dlckFjdGl2ZSgpeworCisgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgIG1pYls0XTsKKyAgICAgICAgICAgIHN0cnVjdCBraW5mb19wcm9jICAgaW5mbzsKKyAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgc2l6ZTsKKworICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgZmxhZ3Mgc28gdGhhdCwgaWYgc3lzY3RsIGZhaWxzIGZvciBzb21lIGJpemFycmUKKyAgICAgICAgICAgIC8vIHJlYXNvbiwgd2UgZ2V0IGEgcHJlZGljdGFibGUgcmVzdWx0LgorCisgICAgICAgICAgICBpbmZvLmtwX3Byb2MucF9mbGFnID0gMDsKKworICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSBtaWIsIHdoaWNoIHRlbGxzIHN5c2N0bCB0aGUgaW5mbyB3ZSB3YW50LCBpbiB0aGlzIGNhc2UKKyAgICAgICAgICAgIC8vIHdlJ3JlIGxvb2tpbmcgZm9yIGluZm9ybWF0aW9uIGFib3V0IGEgc3BlY2lmaWMgcHJvY2VzcyBJRC4KKworICAgICAgICAgICAgbWliWzBdID0gQ1RMX0tFUk47CisgICAgICAgICAgICBtaWJbMV0gPSBLRVJOX1BST0M7CisgICAgICAgICAgICBtaWJbMl0gPSBLRVJOX1BST0NfUElEOworICAgICAgICAgICAgbWliWzNdID0gZ2V0cGlkKCk7CisKKyAgICAgICAgICAgIC8vIENhbGwgc3lzY3RsLgorCisgICAgICAgICAgICBzaXplID0gc2l6ZW9mKGluZm8pOworICAgICAgICAgICAgaWYoIHN5c2N0bChtaWIsIHNpemVvZihtaWIpIC8gc2l6ZW9mKCptaWIpLCAmaW5mbywgJnNpemUsIENBVENIX05VTEwsIDApICE9IDAgKSB7CisgICAgICAgICAgICAgICAgQ2F0Y2g6OmNlcnIoKSA8PCAiXG4qKiBDYWxsIHRvIHN5c2N0bCBmYWlsZWQgLSB1bmFibGUgdG8gZGV0ZXJtaW5lIGlmIGRlYnVnZ2VyIGlzIGFjdGl2ZSAqKlxuIiA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBXZSdyZSBiZWluZyBkZWJ1Z2dlZCBpZiB0aGUgUF9UUkFDRUQgZmxhZyBpcyBzZXQuCisKKyAgICAgICAgICAgIHJldHVybiAoIChpbmZvLmtwX3Byb2MucF9mbGFnICYgUF9UUkFDRUQpICE9IDAgKTsKKyAgICAgICAgfQorICAgIH0gLy8gbmFtZXNwYWNlIENhdGNoCisKKyNlbGlmIGRlZmluZWQoQ0FUQ0hfUExBVEZPUk1fTElOVVgpCisgICAgI2luY2x1ZGUgPGZzdHJlYW0+CisgICAgI2luY2x1ZGUgPHN0cmluZz4KKworICAgIG5hbWVzcGFjZSBDYXRjaHsKKyAgICAgICAgLy8gVGhlIHN0YW5kYXJkIFBPU0lYIHdheSBvZiBkZXRlY3RpbmcgYSBkZWJ1Z2dlciBpcyB0byBhdHRlbXB0IHRvCisgICAgICAgIC8vIHB0cmFjZSgpIHRoZSBwcm9jZXNzLCBidXQgdGhpcyBuZWVkcyB0byBiZSBkb25lIGZyb20gYSBjaGlsZCBhbmQgbm90CisgICAgICAgIC8vIHRoaXMgcHJvY2VzcyBpdHNlbGYgdG8gc3RpbGwgYWxsb3cgYXR0YWNoaW5nIHRvIHRoaXMgcHJvY2VzcyBsYXRlcgorICAgICAgICAvLyBpZiB3YW50ZWQsIHNvIGlzIHJhdGhlciBoZWF2eS4gVW5kZXIgTGludXggd2UgaGF2ZSB0aGUgUElEIG9mIHRoZQorICAgICAgICAvLyAiZGVidWdnZXIiICh3aGljaCBkb2Vzbid0IG5lZWQgdG8gYmUgZ2RiLCBvZiBjb3Vyc2UsIGl0IGNvdWxkIGFsc28KKyAgICAgICAgLy8gYmUgc3RyYWNlLCBmb3IgZXhhbXBsZSkgaW4gL3Byb2MvJFBJRC9zdGF0dXMsIHNvIGp1c3QgZ2V0IGl0IGZyb20KKyAgICAgICAgLy8gdGhlcmUgaW5zdGVhZC4KKyAgICAgICAgYm9vbCBpc0RlYnVnZ2VyQWN0aXZlKCl7CisgICAgICAgICAgICAvLyBMaWJzdGRjKysgaGFzIGEgYnVnLCB3aGVyZSBzdGQ6Omlmc3RyZWFtIHNldHMgZXJybm8gdG8gMAorICAgICAgICAgICAgLy8gVGhpcyB3YXkgb3VyIHVzZXJzIGNhbiBwcm9wZXJseSBhc3NlcnQgb3ZlciBlcnJubyB2YWx1ZXMKKyAgICAgICAgICAgIEVycm5vR3VhcmQgZ3VhcmQ7CisgICAgICAgICAgICBzdGQ6Omlmc3RyZWFtIGluKCIvcHJvYy9zZWxmL3N0YXR1cyIpOworICAgICAgICAgICAgZm9yKCBzdGQ6OnN0cmluZyBsaW5lOyBzdGQ6OmdldGxpbmUoaW4sIGxpbmUpOyApIHsKKyAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgaW50IFBSRUZJWF9MRU4gPSAxMTsKKyAgICAgICAgICAgICAgICBpZiggbGluZS5jb21wYXJlKDAsIFBSRUZJWF9MRU4sICJUcmFjZXJQaWQ6XHQiKSA9PSAwICkgeworICAgICAgICAgICAgICAgICAgICAvLyBXZSdyZSB0cmFjZWQgaWYgdGhlIFBJRCBpcyBub3QgMCBhbmQgbm8gb3RoZXIgUElEIHN0YXJ0cworICAgICAgICAgICAgICAgICAgICAvLyB3aXRoIDAgZGlnaXQsIHNvIGl0J3MgZW5vdWdoIHRvIGNoZWNrIGZvciBqdXN0IGEgc2luZ2xlCisgICAgICAgICAgICAgICAgICAgIC8vIGNoYXJhY3Rlci4KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxpbmUubGVuZ3RoKCkgPiBQUkVGSVhfTEVOICYmIGxpbmVbUFJFRklYX0xFTl0gIT0gJzAnOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpCisgICAgZXh0ZXJuICJDIiBfX2RlY2xzcGVjKGRsbGltcG9ydCkgaW50IF9fc3RkY2FsbCBJc0RlYnVnZ2VyUHJlc2VudCgpOworICAgIG5hbWVzcGFjZSBDYXRjaCB7CisgICAgICAgIGJvb2wgaXNEZWJ1Z2dlckFjdGl2ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBJc0RlYnVnZ2VyUHJlc2VudCgpICE9IDA7CisgICAgICAgIH0KKyAgICB9CisjZWxpZiBkZWZpbmVkKF9fTUlOR1czMl9fKQorICAgIGV4dGVybiAiQyIgX19kZWNsc3BlYyhkbGxpbXBvcnQpIGludCBfX3N0ZGNhbGwgSXNEZWJ1Z2dlclByZXNlbnQoKTsKKyAgICBuYW1lc3BhY2UgQ2F0Y2ggeworICAgICAgICBib29sIGlzRGVidWdnZXJBY3RpdmUoKSB7CisgICAgICAgICAgICByZXR1cm4gSXNEZWJ1Z2dlclByZXNlbnQoKSAhPSAwOworICAgICAgICB9CisgICAgfQorI2Vsc2UKKyAgICBuYW1lc3BhY2UgQ2F0Y2ggeworICAgICAgIGlubGluZSBib29sIGlzRGVidWdnZXJBY3RpdmUoKSB7IHJldHVybiBmYWxzZTsgfQorICAgIH0KKyNlbmRpZiAvLyBQbGF0Zm9ybQorCisjaWZkZWYgQ0FUQ0hfUExBVEZPUk1fV0lORE9XUworCisgICAgbmFtZXNwYWNlIENhdGNoIHsKKyAgICAgICAgdm9pZCB3cml0ZVRvRGVidWdDb25zb2xlKCBzdGQ6OnN0cmluZyBjb25zdCYgdGV4dCApIHsKKyAgICAgICAgICAgIDo6T3V0cHV0RGVidWdTdHJpbmdBKCB0ZXh0LmNfc3RyKCkgKTsKKyAgICAgICAgfQorICAgIH0KKyNlbHNlCisgICAgbmFtZXNwYWNlIENhdGNoIHsKKyAgICAgICAgdm9pZCB3cml0ZVRvRGVidWdDb25zb2xlKCBzdGQ6OnN0cmluZyBjb25zdCYgdGV4dCApIHsKKyAgICAgICAgICAgIC8vICFUQkQ6IE5lZWQgYSB2ZXJzaW9uIGZvciBNYWMvIFhDb2RlIGFuZCBvdGhlciBJREVzCisgICAgICAgICAgICBDYXRjaDo6Y291dCgpIDw8IHRleHQ7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLy8gUGxhdGZvcm0KKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3Rvc3RyaW5nLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfVE9TVFJJTkdfSFBQX0lOQ0xVREVECisKK25hbWVzcGFjZSBDYXRjaCB7CisKK25hbWVzcGFjZSBEZXRhaWwgeworCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgdW5wcmludGFibGVTdHJpbmcgPSAiez99IjsKKworICAgIG5hbWVzcGFjZSB7CisgICAgICAgIGNvbnN0IGludCBoZXhUaHJlc2hvbGQgPSAyNTU7CisKKyAgICAgICAgc3RydWN0IEVuZGlhbm5lc3MgeworICAgICAgICAgICAgZW51bSBBcmNoIHsgQmlnLCBMaXR0bGUgfTsKKworICAgICAgICAgICAgc3RhdGljIEFyY2ggd2hpY2goKSB7CisgICAgICAgICAgICAgICAgdW5pb24gX3sKKyAgICAgICAgICAgICAgICAgICAgaW50IGFzSW50OworICAgICAgICAgICAgICAgICAgICBjaGFyIGFzQ2hhcltzaXplb2YgKGludCldOworICAgICAgICAgICAgICAgIH0gdTsKKworICAgICAgICAgICAgICAgIHUuYXNJbnQgPSAxOworICAgICAgICAgICAgICAgIHJldHVybiAoIHUuYXNDaGFyW3NpemVvZihpbnQpLTFdID09IDEgKSA/IEJpZyA6IExpdHRsZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyByYXdNZW1vcnlUb1N0cmluZyggY29uc3Qgdm9pZCAqb2JqZWN0LCBzdGQ6OnNpemVfdCBzaXplICkKKyAgICB7CisgICAgICAgIC8vIFJldmVyc2Ugb3JkZXIgZm9yIGxpdHRsZSBlbmRpYW4gYXJjaGl0ZWN0dXJlcworICAgICAgICBpbnQgaSA9IDAsIGVuZCA9IHN0YXRpY19jYXN0PGludD4oIHNpemUgKSwgaW5jID0gMTsKKyAgICAgICAgaWYoIEVuZGlhbm5lc3M6OndoaWNoKCkgPT0gRW5kaWFubmVzczo6TGl0dGxlICkgeworICAgICAgICAgICAgaSA9IGVuZC0xOworICAgICAgICAgICAgZW5kID0gaW5jID0gLTE7CisgICAgICAgIH0KKworICAgICAgICB1bnNpZ25lZCBjaGFyIGNvbnN0ICpieXRlcyA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXIgY29uc3QgKj4ob2JqZWN0KTsKKyAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zOworICAgICAgICBvcyA8PCAiMHgiIDw8IHN0ZDo6c2V0ZmlsbCgnMCcpIDw8IHN0ZDo6aGV4OworICAgICAgICBmb3IoIDsgaSAhPSBlbmQ7IGkgKz0gaW5jICkKKyAgICAgICAgICAgICBvcyA8PCBzdGQ6OnNldHcoMikgPDwgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGJ5dGVzW2ldKTsKKyAgICAgICByZXR1cm4gb3Muc3RyKCk7CisgICAgfQorfQorCitzdGQ6OnN0cmluZyB0b1N0cmluZyggc3RkOjpzdHJpbmcgY29uc3QmIHZhbHVlICkgeworICAgIHN0ZDo6c3RyaW5nIHMgPSB2YWx1ZTsKKyAgICBpZiggZ2V0Q3VycmVudENvbnRleHQoKS5nZXRDb25maWcoKS0+c2hvd0ludmlzaWJsZXMoKSApIHsKKyAgICAgICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IHMuc2l6ZSgpOyArK2kgKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBzdWJzOworICAgICAgICAgICAgc3dpdGNoKCBzW2ldICkgeworICAgICAgICAgICAgY2FzZSAnXG4nOiBzdWJzID0gIlxcbiI7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAnXHQnOiBzdWJzID0gIlxcdCI7IGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggIXN1YnMuZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICBzID0gcy5zdWJzdHIoIDAsIGkgKSArIHN1YnMgKyBzLnN1YnN0ciggaSsxICk7CisgICAgICAgICAgICAgICAgKytpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAnIicgKyBzICsgJyInOworfQorc3RkOjpzdHJpbmcgdG9TdHJpbmcoIHN0ZDo6d3N0cmluZyBjb25zdCYgdmFsdWUgKSB7CisKKyAgICBzdGQ6OnN0cmluZyBzOworICAgIHMucmVzZXJ2ZSggdmFsdWUuc2l6ZSgpICk7CisgICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IHZhbHVlLnNpemUoKTsgKytpICkKKyAgICAgICAgcyArPSB2YWx1ZVtpXSA8PSAweGZmID8gc3RhdGljX2Nhc3Q8Y2hhcj4oIHZhbHVlW2ldICkgOiAnPyc7CisgICAgcmV0dXJuIENhdGNoOjp0b1N0cmluZyggcyApOworfQorCitzdGQ6OnN0cmluZyB0b1N0cmluZyggY29uc3QgY2hhciogY29uc3QgdmFsdWUgKSB7CisgICAgcmV0dXJuIHZhbHVlID8gQ2F0Y2g6OnRvU3RyaW5nKCBzdGQ6OnN0cmluZyggdmFsdWUgKSApIDogc3RkOjpzdHJpbmcoICJ7bnVsbCBzdHJpbmd9IiApOworfQorCitzdGQ6OnN0cmluZyB0b1N0cmluZyggY2hhciogY29uc3QgdmFsdWUgKSB7CisgICAgcmV0dXJuIENhdGNoOjp0b1N0cmluZyggc3RhdGljX2Nhc3Q8Y29uc3QgY2hhcio+KCB2YWx1ZSApICk7Cit9CisKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBjb25zdCB3Y2hhcl90KiBjb25zdCB2YWx1ZSApCit7CisgICAgcmV0dXJuIHZhbHVlID8gQ2F0Y2g6OnRvU3RyaW5nKCBzdGQ6OndzdHJpbmcodmFsdWUpICkgOiBzdGQ6OnN0cmluZyggIntudWxsIHN0cmluZ30iICk7Cit9CisKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCB3Y2hhcl90KiBjb25zdCB2YWx1ZSApCit7CisgICAgcmV0dXJuIENhdGNoOjp0b1N0cmluZyggc3RhdGljX2Nhc3Q8Y29uc3Qgd2NoYXJfdCo+KCB2YWx1ZSApICk7Cit9CisKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBpbnQgdmFsdWUgKSB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICBvc3MgPDwgdmFsdWU7CisgICAgaWYoIHZhbHVlID4gRGV0YWlsOjpoZXhUaHJlc2hvbGQgKQorICAgICAgICBvc3MgPDwgIiAoMHgiIDw8IHN0ZDo6aGV4IDw8IHZhbHVlIDw8ICcpJzsKKyAgICByZXR1cm4gb3NzLnN0cigpOworfQorCitzdGQ6OnN0cmluZyB0b1N0cmluZyggdW5zaWduZWQgbG9uZyB2YWx1ZSApIHsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgIG9zcyA8PCB2YWx1ZTsKKyAgICBpZiggdmFsdWUgPiBEZXRhaWw6OmhleFRocmVzaG9sZCApCisgICAgICAgIG9zcyA8PCAiICgweCIgPDwgc3RkOjpoZXggPDwgdmFsdWUgPDwgJyknOworICAgIHJldHVybiBvc3Muc3RyKCk7Cit9CisKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCB1bnNpZ25lZCBpbnQgdmFsdWUgKSB7CisgICAgcmV0dXJuIENhdGNoOjp0b1N0cmluZyggc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oIHZhbHVlICkgKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0ZDo6c3RyaW5nIGZwVG9TdHJpbmcoIFQgdmFsdWUsIGludCBwcmVjaXNpb24gKSB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICBvc3MgPDwgc3RkOjpzZXRwcmVjaXNpb24oIHByZWNpc2lvbiApCisgICAgICAgIDw8IHN0ZDo6Zml4ZWQKKyAgICAgICAgPDwgdmFsdWU7CisgICAgc3RkOjpzdHJpbmcgZCA9IG9zcy5zdHIoKTsKKyAgICBzdGQ6OnNpemVfdCBpID0gZC5maW5kX2xhc3Rfbm90X29mKCAnMCcgKTsKKyAgICBpZiggaSAhPSBzdGQ6OnN0cmluZzo6bnBvcyAmJiBpICE9IGQuc2l6ZSgpLTEgKSB7CisgICAgICAgIGlmKCBkW2ldID09ICcuJyApCisgICAgICAgICAgICBpKys7CisgICAgICAgIGQgPSBkLnN1YnN0ciggMCwgaSsxICk7CisgICAgfQorICAgIHJldHVybiBkOworfQorCitzdGQ6OnN0cmluZyB0b1N0cmluZyggY29uc3QgZG91YmxlIHZhbHVlICkgeworICAgIHJldHVybiBmcFRvU3RyaW5nKCB2YWx1ZSwgMTAgKTsKK30KK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBjb25zdCBmbG9hdCB2YWx1ZSApIHsKKyAgICByZXR1cm4gZnBUb1N0cmluZyggdmFsdWUsIDUgKSArICdmJzsKK30KKworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIGJvb2wgdmFsdWUgKSB7CisgICAgcmV0dXJuIHZhbHVlID8gInRydWUiIDogImZhbHNlIjsKK30KKworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIGNoYXIgdmFsdWUgKSB7CisgICAgaWYgKCB2YWx1ZSA9PSAnXHInICkKKyAgICAgICAgcmV0dXJuICInXFxyJyI7CisgICAgaWYgKCB2YWx1ZSA9PSAnXGYnICkKKyAgICAgICAgcmV0dXJuICInXFxmJyI7CisgICAgaWYgKCB2YWx1ZSA9PSAnXG4nICkKKyAgICAgICAgcmV0dXJuICInXFxuJyI7CisgICAgaWYgKCB2YWx1ZSA9PSAnXHQnICkKKyAgICAgICAgcmV0dXJuICInXFx0JyI7CisgICAgaWYgKCAnXDAnIDw9IHZhbHVlICYmIHZhbHVlIDwgJyAnICkKKyAgICAgICAgcmV0dXJuIHRvU3RyaW5nKCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KCB2YWx1ZSApICk7CisgICAgY2hhciBjaHN0cltdID0gIicgJyI7CisgICAgY2hzdHJbMV0gPSB2YWx1ZTsKKyAgICByZXR1cm4gY2hzdHI7Cit9CisKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBzaWduZWQgY2hhciB2YWx1ZSApIHsKKyAgICByZXR1cm4gdG9TdHJpbmcoIHN0YXRpY19jYXN0PGNoYXI+KCB2YWx1ZSApICk7Cit9CisKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCB1bnNpZ25lZCBjaGFyIHZhbHVlICkgeworICAgIHJldHVybiB0b1N0cmluZyggc3RhdGljX2Nhc3Q8Y2hhcj4oIHZhbHVlICkgKTsKK30KKworI2lmZGVmIENBVENIX0NPTkZJR19DUFAxMV9MT05HX0xPTkcKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBsb25nIGxvbmcgdmFsdWUgKSB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICBvc3MgPDwgdmFsdWU7CisgICAgaWYoIHZhbHVlID4gRGV0YWlsOjpoZXhUaHJlc2hvbGQgKQorICAgICAgICBvc3MgPDwgIiAoMHgiIDw8IHN0ZDo6aGV4IDw8IHZhbHVlIDw8ICcpJzsKKyAgICByZXR1cm4gb3NzLnN0cigpOworfQorc3RkOjpzdHJpbmcgdG9TdHJpbmcoIHVuc2lnbmVkIGxvbmcgbG9uZyB2YWx1ZSApIHsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgIG9zcyA8PCB2YWx1ZTsKKyAgICBpZiggdmFsdWUgPiBEZXRhaWw6OmhleFRocmVzaG9sZCApCisgICAgICAgIG9zcyA8PCAiICgweCIgPDwgc3RkOjpoZXggPDwgdmFsdWUgPDwgJyknOworICAgIHJldHVybiBvc3Muc3RyKCk7Cit9CisjZW5kaWYKKworI2lmZGVmIENBVENIX0NPTkZJR19DUFAxMV9OVUxMUFRSCitzdGQ6OnN0cmluZyB0b1N0cmluZyggc3RkOjpudWxscHRyX3QgKSB7CisgICAgcmV0dXJuICJudWxscHRyIjsKK30KKyNlbmRpZgorCisjaWZkZWYgX19PQkpDX18KKyAgICBzdGQ6OnN0cmluZyB0b1N0cmluZyggTlNTdHJpbmcgY29uc3QgKiBjb25zdCYgbnNzdHJpbmcgKSB7CisgICAgICAgIGlmKCAhbnNzdHJpbmcgKQorICAgICAgICAgICAgcmV0dXJuICJuaWwiOworICAgICAgICByZXR1cm4gIkAiICsgdG9TdHJpbmcoW25zc3RyaW5nIFVURjhTdHJpbmddKTsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoIE5TU3RyaW5nICogQ0FUQ0hfQVJDX1NUUk9ORyBjb25zdCYgbnNzdHJpbmcgKSB7CisgICAgICAgIGlmKCAhbnNzdHJpbmcgKQorICAgICAgICAgICAgcmV0dXJuICJuaWwiOworICAgICAgICByZXR1cm4gIkAiICsgdG9TdHJpbmcoW25zc3RyaW5nIFVURjhTdHJpbmddKTsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoIE5TT2JqZWN0KiBjb25zdCYgbnNPYmplY3QgKSB7CisgICAgICAgIHJldHVybiB0b1N0cmluZyggW25zT2JqZWN0IGRlc2NyaXB0aW9uXSApOworICAgIH0KKyNlbmRpZgorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3Jlc3VsdF9idWlsZGVyLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfUkVTVUxUX0JVSUxERVJfSFBQX0lOQ0xVREVECisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdGQ6OnN0cmluZyBjYXB0dXJlZEV4cHJlc3Npb25XaXRoU2Vjb25kQXJndW1lbnQoIHN0ZDo6c3RyaW5nIGNvbnN0JiBjYXB0dXJlZEV4cHJlc3Npb24sIHN0ZDo6c3RyaW5nIGNvbnN0JiBzZWNvbmRBcmcgKSB7CisgICAgICAgIHJldHVybiBzZWNvbmRBcmcuZW1wdHkoKSB8fCBzZWNvbmRBcmcgPT0gIlwiXCIiCisgICAgICAgICAgICA/IGNhcHR1cmVkRXhwcmVzc2lvbgorICAgICAgICAgICAgOiBjYXB0dXJlZEV4cHJlc3Npb24gKyAiLCAiICsgc2Vjb25kQXJnOworICAgIH0KKyAgICBSZXN1bHRCdWlsZGVyOjpSZXN1bHRCdWlsZGVyKCAgIGNoYXIgY29uc3QqIG1hY3JvTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBsaW5lSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgY29uc3QqIGNhcHR1cmVkRXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdERpc3Bvc2l0aW9uOjpGbGFncyByZXN1bHREaXNwb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgY29uc3QqIHNlY29uZEFyZyApCisgICAgOiAgIG1fYXNzZXJ0aW9uSW5mbyggbWFjcm9OYW1lLCBsaW5lSW5mbywgY2FwdHVyZWRFeHByZXNzaW9uV2l0aFNlY29uZEFyZ3VtZW50KCBjYXB0dXJlZEV4cHJlc3Npb24sIHNlY29uZEFyZyApLCByZXN1bHREaXNwb3NpdGlvbiApLAorICAgICAgICBtX3Nob3VsZERlYnVnQnJlYWsoIGZhbHNlICksCisgICAgICAgIG1fc2hvdWxkVGhyb3coIGZhbHNlICksCisgICAgICAgIG1fZ3VhcmRFeGNlcHRpb24oIGZhbHNlICkKKyAgICB7fQorCisgICAgUmVzdWx0QnVpbGRlcjo6flJlc3VsdEJ1aWxkZXIoKSB7CisjaWYgZGVmaW5lZChDQVRDSF9DT05GSUdfRkFTVF9DT01QSUxFKQorICAgICAgICBpZiAoIG1fZ3VhcmRFeGNlcHRpb24gKSB7CisgICAgICAgICAgICBtX3N0cmVhbS5vc3MgPDwgIkV4Y2VwdGlvbiB0cmFuc2xhdGlvbiB3YXMgZGlzYWJsZWQgYnkgQ0FUQ0hfQ09ORklHX0ZBU1RfQ09NUElMRSI7CisgICAgICAgICAgICBjYXB0dXJlUmVzdWx0KCBSZXN1bHRXYXM6OlRocmV3RXhjZXB0aW9uICk7CisgICAgICAgICAgICBnZXRDdXJyZW50Q29udGV4dCgpLmdldFJlc3VsdENhcHR1cmUoKS0+ZXhjZXB0aW9uRWFybHlSZXBvcnRlZCgpOworICAgICAgICB9CisjZW5kaWYKKyAgICB9CisKKyAgICBSZXN1bHRCdWlsZGVyJiBSZXN1bHRCdWlsZGVyOjpzZXRSZXN1bHRUeXBlKCBSZXN1bHRXYXM6Ok9mVHlwZSByZXN1bHQgKSB7CisgICAgICAgIG1fZGF0YS5yZXN1bHRUeXBlID0gcmVzdWx0OworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIFJlc3VsdEJ1aWxkZXImIFJlc3VsdEJ1aWxkZXI6OnNldFJlc3VsdFR5cGUoIGJvb2wgcmVzdWx0ICkgeworICAgICAgICBtX2RhdGEucmVzdWx0VHlwZSA9IHJlc3VsdCA/IFJlc3VsdFdhczo6T2sgOiBSZXN1bHRXYXM6OkV4cHJlc3Npb25GYWlsZWQ7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICB2b2lkIFJlc3VsdEJ1aWxkZXI6OmVuZEV4cHJlc3Npb24oIERlY29tcG9zZWRFeHByZXNzaW9uIGNvbnN0JiBleHByICkgeworICAgICAgICBBc3NlcnRpb25SZXN1bHQgcmVzdWx0ID0gYnVpbGQoIGV4cHIgKTsKKyAgICAgICAgaGFuZGxlUmVzdWx0KCByZXN1bHQgKTsKKyAgICB9CisKKyAgICB2b2lkIFJlc3VsdEJ1aWxkZXI6OnVzZUFjdGl2ZUV4Y2VwdGlvbiggUmVzdWx0RGlzcG9zaXRpb246OkZsYWdzIHJlc3VsdERpc3Bvc2l0aW9uICkgeworICAgICAgICBtX2Fzc2VydGlvbkluZm8ucmVzdWx0RGlzcG9zaXRpb24gPSByZXN1bHREaXNwb3NpdGlvbjsKKyAgICAgICAgbV9zdHJlYW0ub3NzIDw8IENhdGNoOjp0cmFuc2xhdGVBY3RpdmVFeGNlcHRpb24oKTsKKyAgICAgICAgY2FwdHVyZVJlc3VsdCggUmVzdWx0V2FzOjpUaHJld0V4Y2VwdGlvbiApOworICAgIH0KKworICAgIHZvaWQgUmVzdWx0QnVpbGRlcjo6Y2FwdHVyZVJlc3VsdCggUmVzdWx0V2FzOjpPZlR5cGUgcmVzdWx0VHlwZSApIHsKKyAgICAgICAgc2V0UmVzdWx0VHlwZSggcmVzdWx0VHlwZSApOworICAgICAgICBjYXB0dXJlRXhwcmVzc2lvbigpOworICAgIH0KKworICAgIHZvaWQgUmVzdWx0QnVpbGRlcjo6Y2FwdHVyZUV4cGVjdGVkRXhjZXB0aW9uKCBzdGQ6OnN0cmluZyBjb25zdCYgZXhwZWN0ZWRNZXNzYWdlICkgeworICAgICAgICBpZiggZXhwZWN0ZWRNZXNzYWdlLmVtcHR5KCkgKQorICAgICAgICAgICAgY2FwdHVyZUV4cGVjdGVkRXhjZXB0aW9uKCBNYXRjaGVyczo6SW1wbDo6TWF0Y2hBbGxPZjxzdGQ6OnN0cmluZz4oKSApOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjYXB0dXJlRXhwZWN0ZWRFeGNlcHRpb24oIE1hdGNoZXJzOjpFcXVhbHMoIGV4cGVjdGVkTWVzc2FnZSApICk7CisgICAgfQorCisgICAgdm9pZCBSZXN1bHRCdWlsZGVyOjpjYXB0dXJlRXhwZWN0ZWRFeGNlcHRpb24oIE1hdGNoZXJzOjpJbXBsOjpNYXRjaGVyQmFzZTxzdGQ6OnN0cmluZz4gY29uc3QmIG1hdGNoZXIgKSB7CisKKyAgICAgICAgYXNzZXJ0KCAhaXNGYWxzZVRlc3QoIG1fYXNzZXJ0aW9uSW5mby5yZXN1bHREaXNwb3NpdGlvbiApICk7CisgICAgICAgIEFzc2VydGlvblJlc3VsdERhdGEgZGF0YSA9IG1fZGF0YTsKKyAgICAgICAgZGF0YS5yZXN1bHRUeXBlID0gUmVzdWx0V2FzOjpPazsKKyAgICAgICAgZGF0YS5yZWNvbnN0cnVjdGVkRXhwcmVzc2lvbiA9IG1fYXNzZXJ0aW9uSW5mby5jYXB0dXJlZEV4cHJlc3Npb247CisKKyAgICAgICAgc3RkOjpzdHJpbmcgYWN0dWFsTWVzc2FnZSA9IENhdGNoOjp0cmFuc2xhdGVBY3RpdmVFeGNlcHRpb24oKTsKKyAgICAgICAgaWYoICFtYXRjaGVyLm1hdGNoKCBhY3R1YWxNZXNzYWdlICkgKSB7CisgICAgICAgICAgICBkYXRhLnJlc3VsdFR5cGUgPSBSZXN1bHRXYXM6OkV4cHJlc3Npb25GYWlsZWQ7CisgICAgICAgICAgICBkYXRhLnJlY29uc3RydWN0ZWRFeHByZXNzaW9uID0gYWN0dWFsTWVzc2FnZTsKKyAgICAgICAgfQorICAgICAgICBBc3NlcnRpb25SZXN1bHQgcmVzdWx0KCBtX2Fzc2VydGlvbkluZm8sIGRhdGEgKTsKKyAgICAgICAgaGFuZGxlUmVzdWx0KCByZXN1bHQgKTsKKyAgICB9CisKKyAgICB2b2lkIFJlc3VsdEJ1aWxkZXI6OmNhcHR1cmVFeHByZXNzaW9uKCkgeworICAgICAgICBBc3NlcnRpb25SZXN1bHQgcmVzdWx0ID0gYnVpbGQoKTsKKyAgICAgICAgaGFuZGxlUmVzdWx0KCByZXN1bHQgKTsKKyAgICB9CisKKyAgICB2b2lkIFJlc3VsdEJ1aWxkZXI6OmhhbmRsZVJlc3VsdCggQXNzZXJ0aW9uUmVzdWx0IGNvbnN0JiByZXN1bHQgKQorICAgIHsKKyAgICAgICAgZ2V0UmVzdWx0Q2FwdHVyZSgpLmFzc2VydGlvbkVuZGVkKCByZXN1bHQgKTsKKworICAgICAgICBpZiggIXJlc3VsdC5pc09rKCkgKSB7CisgICAgICAgICAgICBpZiggZ2V0Q3VycmVudENvbnRleHQoKS5nZXRDb25maWcoKS0+c2hvdWxkRGVidWdCcmVhaygpICkKKyAgICAgICAgICAgICAgICBtX3Nob3VsZERlYnVnQnJlYWsgPSB0cnVlOworICAgICAgICAgICAgaWYoIGdldEN1cnJlbnRDb250ZXh0KCkuZ2V0UnVubmVyKCktPmFib3J0aW5nKCkgfHwgKG1fYXNzZXJ0aW9uSW5mby5yZXN1bHREaXNwb3NpdGlvbiAmIFJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwpICkKKyAgICAgICAgICAgICAgICBtX3Nob3VsZFRocm93ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgUmVzdWx0QnVpbGRlcjo6cmVhY3QoKSB7CisjaWYgZGVmaW5lZChDQVRDSF9DT05GSUdfRkFTVF9DT01QSUxFKQorICAgICAgICBpZiAobV9zaG91bGREZWJ1Z0JyZWFrKSB7CisgICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgICAgICAvLyBUbyBpbnNwZWN0IHRoZSBzdGF0ZSBkdXJpbmcgdGVzdCwgeW91IG5lZWQgdG8gZ28gb25lIGxldmVsIHVwIHRoZSBjYWxsc3RhY2sKKyAgICAgICAgICAgIC8vIFRvIGdvIGJhY2sgdG8gdGhlIHRlc3QgYW5kIGNoYW5nZSBleGVjdXRpb24sIGp1bXAgb3ZlciB0aGUgdGhyb3cgc3RhdGVtZW50CisgICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgICAgICBDQVRDSF9CUkVBS19JTlRPX0RFQlVHR0VSKCk7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBpZiggbV9zaG91bGRUaHJvdyApCisgICAgICAgICAgICB0aHJvdyBDYXRjaDo6VGVzdEZhaWx1cmVFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBib29sIFJlc3VsdEJ1aWxkZXI6OnNob3VsZERlYnVnQnJlYWsoKSBjb25zdCB7IHJldHVybiBtX3Nob3VsZERlYnVnQnJlYWs7IH0KKyAgICBib29sIFJlc3VsdEJ1aWxkZXI6OmFsbG93VGhyb3dzKCkgY29uc3QgeyByZXR1cm4gZ2V0Q3VycmVudENvbnRleHQoKS5nZXRDb25maWcoKS0+YWxsb3dUaHJvd3MoKTsgfQorCisgICAgQXNzZXJ0aW9uUmVzdWx0IFJlc3VsdEJ1aWxkZXI6OmJ1aWxkKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBidWlsZCggKnRoaXMgKTsKKyAgICB9CisKKyAgICAvLyBDQVZFQVQ6IFRoZSByZXR1cm5lZCBBc3NlcnRpb25SZXN1bHQgc3RvcmVzIGEgcG9pbnRlciB0byB0aGUgYXJndW1lbnQgZXhwciwKKyAgICAvLyAgICAgICAgIGEgdGVtcG9yYXJ5IERlY29tcG9zZWRFeHByZXNzaW9uLCB3aGljaCBpbiB0dXJuIGhvbGRzIHJlZmVyZW5jZXMgdG8KKyAgICAvLyAgICAgICAgIG9wZXJhbmRzLCBwb3NzaWJseSB0ZW1wb3JhcnkgYXMgd2VsbC4KKyAgICAvLyAgICAgICAgIEl0IHNob3VsZCBpbW1lZGlhdGVseSBiZSBwYXNzZWQgdG8gaGFuZGxlUmVzdWx0OyBpZiB0aGUgZXhwcmVzc2lvbgorICAgIC8vICAgICAgICAgbmVlZHMgdG8gYmUgcmVwb3J0ZWQsIGl0cyBzdHJpbmcgZXhwYW5zaW9uIG11c3QgYmUgY29tcG9zZWQgYmVmb3JlCisgICAgLy8gICAgICAgICB0aGUgdGVtcG9yYXJpZXMgYXJlIGRlc3Ryb3llZC4KKyAgICBBc3NlcnRpb25SZXN1bHQgUmVzdWx0QnVpbGRlcjo6YnVpbGQoIERlY29tcG9zZWRFeHByZXNzaW9uIGNvbnN0JiBleHByICkgY29uc3QKKyAgICB7CisgICAgICAgIGFzc2VydCggbV9kYXRhLnJlc3VsdFR5cGUgIT0gUmVzdWx0V2FzOjpVbmtub3duICk7CisgICAgICAgIEFzc2VydGlvblJlc3VsdERhdGEgZGF0YSA9IG1fZGF0YTsKKworICAgICAgICAvLyBGbGlwIGJvb2wgcmVzdWx0cyBpZiBGYWxzZVRlc3QgZmxhZyBpcyBzZXQKKyAgICAgICAgaWYoIGlzRmFsc2VUZXN0KCBtX2Fzc2VydGlvbkluZm8ucmVzdWx0RGlzcG9zaXRpb24gKSApIHsKKyAgICAgICAgICAgIGRhdGEubmVnYXRlKCBleHByLmlzQmluYXJ5RXhwcmVzc2lvbigpICk7CisgICAgICAgIH0KKworICAgICAgICBkYXRhLm1lc3NhZ2UgPSBtX3N0cmVhbS5vc3Muc3RyKCk7CisgICAgICAgIGRhdGEuZGVjb21wb3NlZEV4cHJlc3Npb24gPSAmZXhwcjsgLy8gZm9yIGxhenkgcmVjb25zdHJ1Y3Rpb24KKyAgICAgICAgcmV0dXJuIEFzc2VydGlvblJlc3VsdCggbV9hc3NlcnRpb25JbmZvLCBkYXRhICk7CisgICAgfQorCisgICAgdm9pZCBSZXN1bHRCdWlsZGVyOjpyZWNvbnN0cnVjdEV4cHJlc3Npb24oIHN0ZDo6c3RyaW5nJiBkZXN0ICkgY29uc3QgeworICAgICAgICBkZXN0ID0gbV9hc3NlcnRpb25JbmZvLmNhcHR1cmVkRXhwcmVzc2lvbjsKKyAgICB9CisKKyAgICB2b2lkIFJlc3VsdEJ1aWxkZXI6OnNldEV4Y2VwdGlvbkd1YXJkKCkgeworICAgICAgICBtX2d1YXJkRXhjZXB0aW9uID0gdHJ1ZTsKKyAgICB9CisgICAgdm9pZCBSZXN1bHRCdWlsZGVyOjp1bnNldEV4Y2VwdGlvbkd1YXJkKCkgeworICAgICAgICBtX2d1YXJkRXhjZXB0aW9uID0gZmFsc2U7CisgICAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3RhZ19hbGlhc19yZWdpc3RyeS5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1RBR19BTElBU19SRUdJU1RSWV9IUFBfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIFRhZ0FsaWFzUmVnaXN0cnk6On5UYWdBbGlhc1JlZ2lzdHJ5KCkge30KKworICAgIE9wdGlvbjxUYWdBbGlhcz4gVGFnQWxpYXNSZWdpc3RyeTo6ZmluZCggc3RkOjpzdHJpbmcgY29uc3QmIGFsaWFzICkgY29uc3QgeworICAgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgVGFnQWxpYXM+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fcmVnaXN0cnkuZmluZCggYWxpYXMgKTsKKyAgICAgICAgaWYoIGl0ICE9IG1fcmVnaXN0cnkuZW5kKCkgKQorICAgICAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBPcHRpb248VGFnQWxpYXM+KCk7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgVGFnQWxpYXNSZWdpc3RyeTo6ZXhwYW5kQWxpYXNlcyggc3RkOjpzdHJpbmcgY29uc3QmIHVuZXhwYW5kZWRUZXN0U3BlYyApIGNvbnN0IHsKKyAgICAgICAgc3RkOjpzdHJpbmcgZXhwYW5kZWRUZXN0U3BlYyA9IHVuZXhwYW5kZWRUZXN0U3BlYzsKKyAgICAgICAgZm9yKCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgVGFnQWxpYXM+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fcmVnaXN0cnkuYmVnaW4oKSwgaXRFbmQgPSBtX3JlZ2lzdHJ5LmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICsraXQgKSB7CisgICAgICAgICAgICBzdGQ6OnNpemVfdCBwb3MgPSBleHBhbmRlZFRlc3RTcGVjLmZpbmQoIGl0LT5maXJzdCApOworICAgICAgICAgICAgaWYoIHBvcyAhPSBzdGQ6OnN0cmluZzo6bnBvcyApIHsKKyAgICAgICAgICAgICAgICBleHBhbmRlZFRlc3RTcGVjID0gIGV4cGFuZGVkVGVzdFNwZWMuc3Vic3RyKCAwLCBwb3MgKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdC0+c2Vjb25kLnRhZyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBhbmRlZFRlc3RTcGVjLnN1YnN0ciggcG9zICsgaXQtPmZpcnN0LnNpemUoKSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBleHBhbmRlZFRlc3RTcGVjOworICAgIH0KKworICAgIHZvaWQgVGFnQWxpYXNSZWdpc3RyeTo6YWRkKCBzdGQ6OnN0cmluZyBjb25zdCYgYWxpYXMsIHN0ZDo6c3RyaW5nIGNvbnN0JiB0YWcsIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBsaW5lSW5mbyApIHsKKworICAgICAgICBpZiggIXN0YXJ0c1dpdGgoIGFsaWFzLCAiW0AiICkgfHwgIWVuZHNXaXRoKCBhbGlhcywgJ10nICkgKSB7CisgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICAgICAgb3NzIDw8IENvbG91ciggQ29sb3VyOjpSZWQgKQorICAgICAgICAgICAgICAgIDw8ICJlcnJvcjogdGFnIGFsaWFzLCBcIiIgPDwgYWxpYXMgPDwgIlwiIGlzIG5vdCBvZiB0aGUgZm9ybSBbQGFsaWFzIG5hbWVdLlxuIgorICAgICAgICAgICAgICAgIDw8IENvbG91ciggQ29sb3VyOjpGaWxlTmFtZSApCisgICAgICAgICAgICAgICAgPDwgbGluZUluZm8gPDwgJ1xuJzsKKyAgICAgICAgICAgIHRocm93IHN0ZDo6ZG9tYWluX2Vycm9yKCBvc3Muc3RyKCkuY19zdHIoKSApOworICAgICAgICB9CisgICAgICAgIGlmKCAhbV9yZWdpc3RyeS5pbnNlcnQoIHN0ZDo6bWFrZV9wYWlyKCBhbGlhcywgVGFnQWxpYXMoIHRhZywgbGluZUluZm8gKSApICkuc2Vjb25kICkgeworICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgIG9zcyA8PCBDb2xvdXIoIENvbG91cjo6UmVkICkKKyAgICAgICAgICAgICAgICA8PCAiZXJyb3I6IHRhZyBhbGlhcywgXCIiIDw8IGFsaWFzIDw8ICJcIiBhbHJlYWR5IHJlZ2lzdGVyZWQuXG4iCisgICAgICAgICAgICAgICAgPDwgIlx0Rmlyc3Qgc2VlbiBhdCAiCisgICAgICAgICAgICAgICAgPDwgQ29sb3VyKCBDb2xvdXI6OlJlZCApIDw8IGZpbmQoYWxpYXMpLT5saW5lSW5mbyA8PCAnXG4nCisgICAgICAgICAgICAgICAgPDwgQ29sb3VyKCBDb2xvdXI6OlJlZCApIDw8ICJcdFJlZGVmaW5lZCBhdCAiCisgICAgICAgICAgICAgICAgPDwgQ29sb3VyKCBDb2xvdXI6OkZpbGVOYW1lKSA8PCBsaW5lSW5mbyA8PCAnXG4nOworICAgICAgICAgICAgdGhyb3cgc3RkOjpkb21haW5fZXJyb3IoIG9zcy5zdHIoKS5jX3N0cigpICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBJVGFnQWxpYXNSZWdpc3RyeTo6fklUYWdBbGlhc1JlZ2lzdHJ5KCkge30KKworICAgIElUYWdBbGlhc1JlZ2lzdHJ5IGNvbnN0JiBJVGFnQWxpYXNSZWdpc3RyeTo6Z2V0KCkgeworICAgICAgICByZXR1cm4gZ2V0UmVnaXN0cnlIdWIoKS5nZXRUYWdBbGlhc1JlZ2lzdHJ5KCk7CisgICAgfQorCisgICAgUmVnaXN0cmFyRm9yVGFnQWxpYXNlczo6UmVnaXN0cmFyRm9yVGFnQWxpYXNlcyggY2hhciBjb25zdCogYWxpYXMsIGNoYXIgY29uc3QqIHRhZywgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvICkgeworICAgICAgICBnZXRNdXRhYmxlUmVnaXN0cnlIdWIoKS5yZWdpc3RlclRhZ0FsaWFzKCBhbGlhcywgdGFnLCBsaW5lSW5mbyApOworICAgIH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9tYXRjaGVyc19zdHJpbmcuaHBwCisKK25hbWVzcGFjZSBDYXRjaCB7CituYW1lc3BhY2UgTWF0Y2hlcnMgeworCisgICAgbmFtZXNwYWNlIFN0ZFN0cmluZyB7CisKKyAgICAgICAgQ2FzZWRTdHJpbmc6OkNhc2VkU3RyaW5nKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyLCBDYXNlU2Vuc2l0aXZlOjpDaG9pY2UgY2FzZVNlbnNpdGl2aXR5ICkKKyAgICAgICAgOiAgIG1fY2FzZVNlbnNpdGl2aXR5KCBjYXNlU2Vuc2l0aXZpdHkgKSwKKyAgICAgICAgICAgIG1fc3RyKCBhZGp1c3RTdHJpbmcoIHN0ciApICkKKyAgICAgICAge30KKyAgICAgICAgc3RkOjpzdHJpbmcgQ2FzZWRTdHJpbmc6OmFkanVzdFN0cmluZyggc3RkOjpzdHJpbmcgY29uc3QmIHN0ciApIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtX2Nhc2VTZW5zaXRpdml0eSA9PSBDYXNlU2Vuc2l0aXZlOjpObworICAgICAgICAgICAgICAgICAgID8gdG9Mb3dlciggc3RyICkKKyAgICAgICAgICAgICAgICAgICA6IHN0cjsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnN0cmluZyBDYXNlZFN0cmluZzo6Y2FzZVNlbnNpdGl2aXR5U3VmZml4KCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1fY2FzZVNlbnNpdGl2aXR5ID09IENhc2VTZW5zaXRpdmU6Ok5vCisgICAgICAgICAgICAgICAgICAgPyAiIChjYXNlIGluc2Vuc2l0aXZlKSIKKyAgICAgICAgICAgICAgICAgICA6IHN0ZDo6c3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmdNYXRjaGVyQmFzZTo6U3RyaW5nTWF0Y2hlckJhc2UoIHN0ZDo6c3RyaW5nIGNvbnN0JiBvcGVyYXRpb24sIENhc2VkU3RyaW5nIGNvbnN0JiBjb21wYXJhdG9yICkKKyAgICAgICAgOiBtX2NvbXBhcmF0b3IoIGNvbXBhcmF0b3IgKSwKKyAgICAgICAgICBtX29wZXJhdGlvbiggb3BlcmF0aW9uICkgeworICAgICAgICB9CisKKyAgICAgICAgc3RkOjpzdHJpbmcgU3RyaW5nTWF0Y2hlckJhc2U6OmRlc2NyaWJlKCkgY29uc3QgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgZGVzY3JpcHRpb247CisgICAgICAgICAgICBkZXNjcmlwdGlvbi5yZXNlcnZlKDUgKyBtX29wZXJhdGlvbi5zaXplKCkgKyBtX2NvbXBhcmF0b3IubV9zdHIuc2l6ZSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2NvbXBhcmF0b3IuY2FzZVNlbnNpdGl2aXR5U3VmZml4KCkuc2l6ZSgpKTsKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uICs9IG1fb3BlcmF0aW9uOworICAgICAgICAgICAgZGVzY3JpcHRpb24gKz0gIjogXCIiOworICAgICAgICAgICAgZGVzY3JpcHRpb24gKz0gbV9jb21wYXJhdG9yLm1fc3RyOworICAgICAgICAgICAgZGVzY3JpcHRpb24gKz0gIlwiIjsKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uICs9IG1fY29tcGFyYXRvci5jYXNlU2Vuc2l0aXZpdHlTdWZmaXgoKTsKKyAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIEVxdWFsc01hdGNoZXI6OkVxdWFsc01hdGNoZXIoIENhc2VkU3RyaW5nIGNvbnN0JiBjb21wYXJhdG9yICkgOiBTdHJpbmdNYXRjaGVyQmFzZSggImVxdWFscyIsIGNvbXBhcmF0b3IgKSB7fQorCisgICAgICAgIGJvb2wgRXF1YWxzTWF0Y2hlcjo6bWF0Y2goIHN0ZDo6c3RyaW5nIGNvbnN0JiBzb3VyY2UgKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbV9jb21wYXJhdG9yLmFkanVzdFN0cmluZyggc291cmNlICkgPT0gbV9jb21wYXJhdG9yLm1fc3RyOworICAgICAgICB9CisKKyAgICAgICAgQ29udGFpbnNNYXRjaGVyOjpDb250YWluc01hdGNoZXIoIENhc2VkU3RyaW5nIGNvbnN0JiBjb21wYXJhdG9yICkgOiBTdHJpbmdNYXRjaGVyQmFzZSggImNvbnRhaW5zIiwgY29tcGFyYXRvciApIHt9CisKKyAgICAgICAgYm9vbCBDb250YWluc01hdGNoZXI6Om1hdGNoKCBzdGQ6OnN0cmluZyBjb25zdCYgc291cmNlICkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5zKCBtX2NvbXBhcmF0b3IuYWRqdXN0U3RyaW5nKCBzb3VyY2UgKSwgbV9jb21wYXJhdG9yLm1fc3RyICk7CisgICAgICAgIH0KKworICAgICAgICBTdGFydHNXaXRoTWF0Y2hlcjo6U3RhcnRzV2l0aE1hdGNoZXIoIENhc2VkU3RyaW5nIGNvbnN0JiBjb21wYXJhdG9yICkgOiBTdHJpbmdNYXRjaGVyQmFzZSggInN0YXJ0cyB3aXRoIiwgY29tcGFyYXRvciApIHt9CisKKyAgICAgICAgYm9vbCBTdGFydHNXaXRoTWF0Y2hlcjo6bWF0Y2goIHN0ZDo6c3RyaW5nIGNvbnN0JiBzb3VyY2UgKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gc3RhcnRzV2l0aCggbV9jb21wYXJhdG9yLmFkanVzdFN0cmluZyggc291cmNlICksIG1fY29tcGFyYXRvci5tX3N0ciApOworICAgICAgICB9CisKKyAgICAgICAgRW5kc1dpdGhNYXRjaGVyOjpFbmRzV2l0aE1hdGNoZXIoIENhc2VkU3RyaW5nIGNvbnN0JiBjb21wYXJhdG9yICkgOiBTdHJpbmdNYXRjaGVyQmFzZSggImVuZHMgd2l0aCIsIGNvbXBhcmF0b3IgKSB7fQorCisgICAgICAgIGJvb2wgRW5kc1dpdGhNYXRjaGVyOjptYXRjaCggc3RkOjpzdHJpbmcgY29uc3QmIHNvdXJjZSApIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBlbmRzV2l0aCggbV9jb21wYXJhdG9yLmFkanVzdFN0cmluZyggc291cmNlICksIG1fY29tcGFyYXRvci5tX3N0ciApOworICAgICAgICB9CisKKyAgICB9IC8vIG5hbWVzcGFjZSBTdGRTdHJpbmcKKworICAgIFN0ZFN0cmluZzo6RXF1YWxzTWF0Y2hlciBFcXVhbHMoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIsIENhc2VTZW5zaXRpdmU6OkNob2ljZSBjYXNlU2Vuc2l0aXZpdHkgKSB7CisgICAgICAgIHJldHVybiBTdGRTdHJpbmc6OkVxdWFsc01hdGNoZXIoIFN0ZFN0cmluZzo6Q2FzZWRTdHJpbmcoIHN0ciwgY2FzZVNlbnNpdGl2aXR5KSApOworICAgIH0KKyAgICBTdGRTdHJpbmc6OkNvbnRhaW5zTWF0Y2hlciBDb250YWlucyggc3RkOjpzdHJpbmcgY29uc3QmIHN0ciwgQ2FzZVNlbnNpdGl2ZTo6Q2hvaWNlIGNhc2VTZW5zaXRpdml0eSApIHsKKyAgICAgICAgcmV0dXJuIFN0ZFN0cmluZzo6Q29udGFpbnNNYXRjaGVyKCBTdGRTdHJpbmc6OkNhc2VkU3RyaW5nKCBzdHIsIGNhc2VTZW5zaXRpdml0eSkgKTsKKyAgICB9CisgICAgU3RkU3RyaW5nOjpFbmRzV2l0aE1hdGNoZXIgRW5kc1dpdGgoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIsIENhc2VTZW5zaXRpdmU6OkNob2ljZSBjYXNlU2Vuc2l0aXZpdHkgKSB7CisgICAgICAgIHJldHVybiBTdGRTdHJpbmc6OkVuZHNXaXRoTWF0Y2hlciggU3RkU3RyaW5nOjpDYXNlZFN0cmluZyggc3RyLCBjYXNlU2Vuc2l0aXZpdHkpICk7CisgICAgfQorICAgIFN0ZFN0cmluZzo6U3RhcnRzV2l0aE1hdGNoZXIgU3RhcnRzV2l0aCggc3RkOjpzdHJpbmcgY29uc3QmIHN0ciwgQ2FzZVNlbnNpdGl2ZTo6Q2hvaWNlIGNhc2VTZW5zaXRpdml0eSApIHsKKyAgICAgICAgcmV0dXJuIFN0ZFN0cmluZzo6U3RhcnRzV2l0aE1hdGNoZXIoIFN0ZFN0cmluZzo6Q2FzZWRTdHJpbmcoIHN0ciwgY2FzZVNlbnNpdGl2aXR5KSApOworICAgIH0KKworfSAvLyBuYW1lc3BhY2UgTWF0Y2hlcnMKK30gLy8gbmFtZXNwYWNlIENhdGNoCisvLyAjaW5jbHVkZWQgZnJvbTogLi4vcmVwb3J0ZXJzL2NhdGNoX3JlcG9ydGVyX211bHRpLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfUkVQT1JURVJfTVVMVElfSFBQX0lOQ0xVREVECisKK25hbWVzcGFjZSBDYXRjaCB7CisKK2NsYXNzIE11bHRpcGxlUmVwb3J0ZXJzIDogcHVibGljIFNoYXJlZEltcGw8SVN0cmVhbWluZ1JlcG9ydGVyPiB7CisgICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxQdHI8SVN0cmVhbWluZ1JlcG9ydGVyPiA+IFJlcG9ydGVyczsKKyAgICBSZXBvcnRlcnMgbV9yZXBvcnRlcnM7CisKK3B1YmxpYzoKKyAgICB2b2lkIGFkZCggUHRyPElTdHJlYW1pbmdSZXBvcnRlcj4gY29uc3QmIHJlcG9ydGVyICkgeworICAgICAgICBtX3JlcG9ydGVycy5wdXNoX2JhY2soIHJlcG9ydGVyICk7CisgICAgfQorCitwdWJsaWM6IC8vIElTdHJlYW1pbmdSZXBvcnRlcgorCisgICAgdmlydHVhbCBSZXBvcnRlclByZWZlcmVuY2VzIGdldFByZWZlcmVuY2VzKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICByZXR1cm4gbV9yZXBvcnRlcnNbMF0tPmdldFByZWZlcmVuY2VzKCk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG5vTWF0Y2hpbmdUZXN0Q2FzZXMoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzcGVjICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICBmb3IoIFJlcG9ydGVyczo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3JlcG9ydGVycy5iZWdpbigpLCBpdEVuZCA9IG1fcmVwb3J0ZXJzLmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgKCppdCktPm5vTWF0Y2hpbmdUZXN0Q2FzZXMoIHNwZWMgKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgdGVzdFJ1blN0YXJ0aW5nKCBUZXN0UnVuSW5mbyBjb25zdCYgdGVzdFJ1bkluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIGZvciggUmVwb3J0ZXJzOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fcmVwb3J0ZXJzLmJlZ2luKCksIGl0RW5kID0gbV9yZXBvcnRlcnMuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICAoKml0KS0+dGVzdFJ1blN0YXJ0aW5nKCB0ZXN0UnVuSW5mbyApOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCB0ZXN0R3JvdXBTdGFydGluZyggR3JvdXBJbmZvIGNvbnN0JiBncm91cEluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIGZvciggUmVwb3J0ZXJzOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fcmVwb3J0ZXJzLmJlZ2luKCksIGl0RW5kID0gbV9yZXBvcnRlcnMuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICAoKml0KS0+dGVzdEdyb3VwU3RhcnRpbmcoIGdyb3VwSW5mbyApOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCB0ZXN0Q2FzZVN0YXJ0aW5nKCBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RJbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICBmb3IoIFJlcG9ydGVyczo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3JlcG9ydGVycy5iZWdpbigpLCBpdEVuZCA9IG1fcmVwb3J0ZXJzLmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgKCppdCktPnRlc3RDYXNlU3RhcnRpbmcoIHRlc3RJbmZvICk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHNlY3Rpb25TdGFydGluZyggU2VjdGlvbkluZm8gY29uc3QmIHNlY3Rpb25JbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICBmb3IoIFJlcG9ydGVyczo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3JlcG9ydGVycy5iZWdpbigpLCBpdEVuZCA9IG1fcmVwb3J0ZXJzLmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgKCppdCktPnNlY3Rpb25TdGFydGluZyggc2VjdGlvbkluZm8gKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgYXNzZXJ0aW9uU3RhcnRpbmcoIEFzc2VydGlvbkluZm8gY29uc3QmIGFzc2VydGlvbkluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIGZvciggUmVwb3J0ZXJzOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fcmVwb3J0ZXJzLmJlZ2luKCksIGl0RW5kID0gbV9yZXBvcnRlcnMuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICAoKml0KS0+YXNzZXJ0aW9uU3RhcnRpbmcoIGFzc2VydGlvbkluZm8gKTsKKyAgICB9CisKKyAgICAvLyBUaGUgcmV0dXJuIHZhbHVlIGluZGljYXRlcyBpZiB0aGUgbWVzc2FnZXMgYnVmZmVyIHNob3VsZCBiZSBjbGVhcmVkOgorICAgIHZpcnR1YWwgYm9vbCBhc3NlcnRpb25FbmRlZCggQXNzZXJ0aW9uU3RhdHMgY29uc3QmIGFzc2VydGlvblN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICBib29sIGNsZWFyQnVmZmVyID0gZmFsc2U7CisgICAgICAgIGZvciggUmVwb3J0ZXJzOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fcmVwb3J0ZXJzLmJlZ2luKCksIGl0RW5kID0gbV9yZXBvcnRlcnMuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICBjbGVhckJ1ZmZlciB8PSAoKml0KS0+YXNzZXJ0aW9uRW5kZWQoIGFzc2VydGlvblN0YXRzICk7CisgICAgICAgIHJldHVybiBjbGVhckJ1ZmZlcjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvbkVuZGVkKCBTZWN0aW9uU3RhdHMgY29uc3QmIHNlY3Rpb25TdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgZm9yKCBSZXBvcnRlcnM6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9yZXBvcnRlcnMuYmVnaW4oKSwgaXRFbmQgPSBtX3JlcG9ydGVycy5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgICgqaXQpLT5zZWN0aW9uRW5kZWQoIHNlY3Rpb25TdGF0cyApOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCB0ZXN0Q2FzZUVuZGVkKCBUZXN0Q2FzZVN0YXRzIGNvbnN0JiB0ZXN0Q2FzZVN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICBmb3IoIFJlcG9ydGVyczo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3JlcG9ydGVycy5iZWdpbigpLCBpdEVuZCA9IG1fcmVwb3J0ZXJzLmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgKCppdCktPnRlc3RDYXNlRW5kZWQoIHRlc3RDYXNlU3RhdHMgKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgdGVzdEdyb3VwRW5kZWQoIFRlc3RHcm91cFN0YXRzIGNvbnN0JiB0ZXN0R3JvdXBTdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgZm9yKCBSZXBvcnRlcnM6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9yZXBvcnRlcnMuYmVnaW4oKSwgaXRFbmQgPSBtX3JlcG9ydGVycy5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgICgqaXQpLT50ZXN0R3JvdXBFbmRlZCggdGVzdEdyb3VwU3RhdHMgKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgdGVzdFJ1bkVuZGVkKCBUZXN0UnVuU3RhdHMgY29uc3QmIHRlc3RSdW5TdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgZm9yKCBSZXBvcnRlcnM6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9yZXBvcnRlcnMuYmVnaW4oKSwgaXRFbmQgPSBtX3JlcG9ydGVycy5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgICgqaXQpLT50ZXN0UnVuRW5kZWQoIHRlc3RSdW5TdGF0cyApOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBza2lwVGVzdCggVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0SW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgZm9yKCBSZXBvcnRlcnM6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9yZXBvcnRlcnMuYmVnaW4oKSwgaXRFbmQgPSBtX3JlcG9ydGVycy5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgICgqaXQpLT5za2lwVGVzdCggdGVzdEluZm8gKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIE11bHRpcGxlUmVwb3J0ZXJzKiB0cnlBc011bHRpKCkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKK307CisKK1B0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+IGFkZFJlcG9ydGVyKCBQdHI8SVN0cmVhbWluZ1JlcG9ydGVyPiBjb25zdCYgZXhpc3RpbmdSZXBvcnRlciwgUHRyPElTdHJlYW1pbmdSZXBvcnRlcj4gY29uc3QmIGFkZGl0aW9uYWxSZXBvcnRlciApIHsKKyAgICBQdHI8SVN0cmVhbWluZ1JlcG9ydGVyPiByZXN1bHRpbmdSZXBvcnRlcjsKKworICAgIGlmKCBleGlzdGluZ1JlcG9ydGVyICkgeworICAgICAgICBNdWx0aXBsZVJlcG9ydGVycyogbXVsdGkgPSBleGlzdGluZ1JlcG9ydGVyLT50cnlBc011bHRpKCk7CisgICAgICAgIGlmKCAhbXVsdGkgKSB7CisgICAgICAgICAgICBtdWx0aSA9IG5ldyBNdWx0aXBsZVJlcG9ydGVyczsKKyAgICAgICAgICAgIHJlc3VsdGluZ1JlcG9ydGVyID0gUHRyPElTdHJlYW1pbmdSZXBvcnRlcj4oIG11bHRpICk7CisgICAgICAgICAgICBpZiggZXhpc3RpbmdSZXBvcnRlciApCisgICAgICAgICAgICAgICAgbXVsdGktPmFkZCggZXhpc3RpbmdSZXBvcnRlciApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlc3VsdGluZ1JlcG9ydGVyID0gZXhpc3RpbmdSZXBvcnRlcjsKKyAgICAgICAgbXVsdGktPmFkZCggYWRkaXRpb25hbFJlcG9ydGVyICk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmVzdWx0aW5nUmVwb3J0ZXIgPSBhZGRpdGlvbmFsUmVwb3J0ZXI7CisKKyAgICByZXR1cm4gcmVzdWx0aW5nUmVwb3J0ZXI7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogLi4vcmVwb3J0ZXJzL2NhdGNoX3JlcG9ydGVyX3htbC5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1JFUE9SVEVSX1hNTF9IUFBfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3JlcG9ydGVyX2Jhc2VzLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfUkVQT1JURVJfQkFTRVNfSFBQX0lOQ0xVREVECisKKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPGNmbG9hdD4KKyNpbmNsdWRlIDxjc3RkaW8+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBuYW1lc3BhY2UgeworICAgICAgICAvLyBCZWNhdXNlIGZvcm1hdHRpbmcgdXNpbmcgYysrIHN0cmVhbXMgaXMgc3RhdGVmdWwsIGRyb3AgZG93biB0byBDIGlzIHJlcXVpcmVkCisgICAgICAgIC8vIEFsdGVybmF0aXZlbHkgd2UgY291bGQgdXNlIHN0cmluZ3N0cmVhbSwgYnV0IGl0cyBwZXJmb3JtYW5jZSBpcy4uLiBub3QgZ29vZC4KKyAgICAgICAgc3RkOjpzdHJpbmcgZ2V0Rm9ybWF0dGVkRHVyYXRpb24oIGRvdWJsZSBkdXJhdGlvbiApIHsKKyAgICAgICAgICAgIC8vIE1heCBleHBvbmVudCArIDEgaXMgcmVxdWlyZWQgdG8gcmVwcmVzZW50IHRoZSB3aG9sZSBwYXJ0CisgICAgICAgICAgICAvLyArIDEgZm9yIGRlY2ltYWwgcG9pbnQKKyAgICAgICAgICAgIC8vICsgMyBmb3IgdGhlIDMgZGVjaW1hbCBwbGFjZXMKKyAgICAgICAgICAgIC8vICsgMSBmb3IgbnVsbCB0ZXJtaW5hdG9yCisgICAgICAgICAgICBjb25zdCBzaXplX3QgbWF4RG91YmxlU2l6ZSA9IERCTF9NQVhfMTBfRVhQICsgMSArIDEgKyAzICsgMTsKKyAgICAgICAgICAgIGNoYXIgYnVmZmVyW21heERvdWJsZVNpemVdOworCisgICAgICAgICAgICAvLyBTYXZlIHByZXZpb3VzIGVycm5vLCB0byBwcmV2ZW50IHNwcmludGYgZnJvbSBvdmVyd3JpdGluZyBpdAorICAgICAgICAgICAgRXJybm9HdWFyZCBndWFyZDsKKyNpZmRlZiBfTVNDX1ZFUgorICAgICAgICAgICAgc3ByaW50Zl9zKGJ1ZmZlciwgIiUuM2YiLCBkdXJhdGlvbik7CisjZWxzZQorICAgICAgICAgICAgc3ByaW50ZihidWZmZXIsICIlLjNmIiwgZHVyYXRpb24pOworI2VuZGlmCisgICAgICAgICAgICByZXR1cm4gc3RkOjpzdHJpbmcoYnVmZmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0cnVjdCBTdHJlYW1pbmdSZXBvcnRlckJhc2UgOiBTaGFyZWRJbXBsPElTdHJlYW1pbmdSZXBvcnRlcj4geworCisgICAgICAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZSggUmVwb3J0ZXJDb25maWcgY29uc3QmIF9jb25maWcgKQorICAgICAgICA6ICAgbV9jb25maWcoIF9jb25maWcuZnVsbENvbmZpZygpICksCisgICAgICAgICAgICBzdHJlYW0oIF9jb25maWcuc3RyZWFtKCkgKQorICAgICAgICB7CisgICAgICAgICAgICBtX3JlcG9ydGVyUHJlZnMuc2hvdWxkUmVkaXJlY3RTdGRPdXQgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgUmVwb3J0ZXJQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcygpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIHJldHVybiBtX3JlcG9ydGVyUHJlZnM7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIH5TdHJlYW1pbmdSZXBvcnRlckJhc2UoKSBDQVRDSF9PVkVSUklERTsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgbm9NYXRjaGluZ1Rlc3RDYXNlcyggc3RkOjpzdHJpbmcgY29uc3QmICkgQ0FUQ0hfT1ZFUlJJREUge30KKworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdFJ1blN0YXJ0aW5nKCBUZXN0UnVuSW5mbyBjb25zdCYgX3Rlc3RSdW5JbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgY3VycmVudFRlc3RSdW5JbmZvID0gX3Rlc3RSdW5JbmZvOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0R3JvdXBTdGFydGluZyggR3JvdXBJbmZvIGNvbnN0JiBfZ3JvdXBJbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgY3VycmVudEdyb3VwSW5mbyA9IF9ncm91cEluZm87CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdENhc2VTdGFydGluZyggVGVzdENhc2VJbmZvIGNvbnN0JiBfdGVzdEluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBjdXJyZW50VGVzdENhc2VJbmZvID0gX3Rlc3RJbmZvOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uU3RhcnRpbmcoIFNlY3Rpb25JbmZvIGNvbnN0JiBfc2VjdGlvbkluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBtX3NlY3Rpb25TdGFjay5wdXNoX2JhY2soIF9zZWN0aW9uSW5mbyApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHNlY3Rpb25FbmRlZCggU2VjdGlvblN0YXRzIGNvbnN0JiAvKiBfc2VjdGlvblN0YXRzICovICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgbV9zZWN0aW9uU3RhY2sucG9wX2JhY2soKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdENhc2VFbmRlZCggVGVzdENhc2VTdGF0cyBjb25zdCYgLyogX3Rlc3RDYXNlU3RhdHMgKi8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBjdXJyZW50VGVzdENhc2VJbmZvLnJlc2V0KCk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RHcm91cEVuZGVkKCBUZXN0R3JvdXBTdGF0cyBjb25zdCYgLyogX3Rlc3RHcm91cFN0YXRzICovICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgY3VycmVudEdyb3VwSW5mby5yZXNldCgpOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0UnVuRW5kZWQoIFRlc3RSdW5TdGF0cyBjb25zdCYgLyogX3Rlc3RSdW5TdGF0cyAqLyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIGN1cnJlbnRUZXN0Q2FzZUluZm8ucmVzZXQoKTsKKyAgICAgICAgICAgIGN1cnJlbnRHcm91cEluZm8ucmVzZXQoKTsKKyAgICAgICAgICAgIGN1cnJlbnRUZXN0UnVuSW5mby5yZXNldCgpOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHNraXBUZXN0KCBUZXN0Q2FzZUluZm8gY29uc3QmICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgLy8gRG9uJ3QgZG8gYW55dGhpbmcgd2l0aCB0aGlzIGJ5IGRlZmF1bHQuCisgICAgICAgICAgICAvLyBJdCBjYW4gb3B0aW9uYWxseSBiZSBvdmVycmlkZGVuIGluIHRoZSBkZXJpdmVkIGNsYXNzLgorICAgICAgICB9CisKKyAgICAgICAgUHRyPElDb25maWcgY29uc3Q+IG1fY29uZmlnOworICAgICAgICBzdGQ6Om9zdHJlYW0mIHN0cmVhbTsKKworICAgICAgICBMYXp5U3RhdDxUZXN0UnVuSW5mbz4gY3VycmVudFRlc3RSdW5JbmZvOworICAgICAgICBMYXp5U3RhdDxHcm91cEluZm8+IGN1cnJlbnRHcm91cEluZm87CisgICAgICAgIExhenlTdGF0PFRlc3RDYXNlSW5mbz4gY3VycmVudFRlc3RDYXNlSW5mbzsKKworICAgICAgICBzdGQ6OnZlY3RvcjxTZWN0aW9uSW5mbz4gbV9zZWN0aW9uU3RhY2s7CisgICAgICAgIFJlcG9ydGVyUHJlZmVyZW5jZXMgbV9yZXBvcnRlclByZWZzOworICAgIH07CisKKyAgICBzdHJ1Y3QgQ3VtdWxhdGl2ZVJlcG9ydGVyQmFzZSA6IFNoYXJlZEltcGw8SVN0cmVhbWluZ1JlcG9ydGVyPiB7CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIENoaWxkTm9kZVQ+CisgICAgICAgIHN0cnVjdCBOb2RlIDogU2hhcmVkSW1wbDw+IHsKKyAgICAgICAgICAgIGV4cGxpY2l0IE5vZGUoIFQgY29uc3QmIF92YWx1ZSApIDogdmFsdWUoIF92YWx1ZSApIHt9CisgICAgICAgICAgICB2aXJ0dWFsIH5Ob2RlKCkge30KKworICAgICAgICAgICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxQdHI8Q2hpbGROb2RlVD4gPiBDaGlsZE5vZGVzOworICAgICAgICAgICAgVCB2YWx1ZTsKKyAgICAgICAgICAgIENoaWxkTm9kZXMgY2hpbGRyZW47CisgICAgICAgIH07CisgICAgICAgIHN0cnVjdCBTZWN0aW9uTm9kZSA6IFNoYXJlZEltcGw8PiB7CisgICAgICAgICAgICBleHBsaWNpdCBTZWN0aW9uTm9kZSggU2VjdGlvblN0YXRzIGNvbnN0JiBfc3RhdHMgKSA6IHN0YXRzKCBfc3RhdHMgKSB7fQorICAgICAgICAgICAgdmlydHVhbCB+U2VjdGlvbk5vZGUoKTsKKworICAgICAgICAgICAgYm9vbCBvcGVyYXRvciA9PSAoIFNlY3Rpb25Ob2RlIGNvbnN0JiBvdGhlciApIGNvbnN0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHMuc2VjdGlvbkluZm8ubGluZUluZm8gPT0gb3RoZXIuc3RhdHMuc2VjdGlvbkluZm8ubGluZUluZm87CisgICAgICAgICAgICB9CisgICAgICAgICAgICBib29sIG9wZXJhdG9yID09ICggUHRyPFNlY3Rpb25Ob2RlPiBjb25zdCYgb3RoZXIgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG9wZXJhdG9yPT0oICpvdGhlciApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTZWN0aW9uU3RhdHMgc3RhdHM7CisgICAgICAgICAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPFB0cjxTZWN0aW9uTm9kZT4gPiBDaGlsZFNlY3Rpb25zOworICAgICAgICAgICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxBc3NlcnRpb25TdGF0cz4gQXNzZXJ0aW9uczsKKyAgICAgICAgICAgIENoaWxkU2VjdGlvbnMgY2hpbGRTZWN0aW9uczsKKyAgICAgICAgICAgIEFzc2VydGlvbnMgYXNzZXJ0aW9uczsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHN0ZE91dDsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHN0ZEVycjsKKyAgICAgICAgfTsKKworICAgICAgICBzdHJ1Y3QgQnlTZWN0aW9uSW5mbyB7CisgICAgICAgICAgICBCeVNlY3Rpb25JbmZvKCBTZWN0aW9uSW5mbyBjb25zdCYgb3RoZXIgKSA6IG1fb3RoZXIoIG90aGVyICkge30KKyAgICAgICAgICAgIEJ5U2VjdGlvbkluZm8oIEJ5U2VjdGlvbkluZm8gY29uc3QmIG90aGVyICkgOiBtX290aGVyKCBvdGhlci5tX290aGVyICkge30KKyAgICAgICAgICAgIGJvb2wgb3BlcmF0b3IoKSAoIFB0cjxTZWN0aW9uTm9kZT4gY29uc3QmIG5vZGUgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGUtPnN0YXRzLnNlY3Rpb25JbmZvLmxpbmVJbmZvID09IG1fb3RoZXIubGluZUluZm87CisgICAgICAgICAgICB9CisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICB2b2lkIG9wZXJhdG9yPSggQnlTZWN0aW9uSW5mbyBjb25zdCYgKTsKKyAgICAgICAgICAgIFNlY3Rpb25JbmZvIGNvbnN0JiBtX290aGVyOworICAgICAgICB9OworCisgICAgICAgIHR5cGVkZWYgTm9kZTxUZXN0Q2FzZVN0YXRzLCBTZWN0aW9uTm9kZT4gVGVzdENhc2VOb2RlOworICAgICAgICB0eXBlZGVmIE5vZGU8VGVzdEdyb3VwU3RhdHMsIFRlc3RDYXNlTm9kZT4gVGVzdEdyb3VwTm9kZTsKKyAgICAgICAgdHlwZWRlZiBOb2RlPFRlc3RSdW5TdGF0cywgVGVzdEdyb3VwTm9kZT4gVGVzdFJ1bk5vZGU7CisKKyAgICAgICAgQ3VtdWxhdGl2ZVJlcG9ydGVyQmFzZSggUmVwb3J0ZXJDb25maWcgY29uc3QmIF9jb25maWcgKQorICAgICAgICA6ICAgbV9jb25maWcoIF9jb25maWcuZnVsbENvbmZpZygpICksCisgICAgICAgICAgICBzdHJlYW0oIF9jb25maWcuc3RyZWFtKCkgKQorICAgICAgICB7CisgICAgICAgICAgICBtX3JlcG9ydGVyUHJlZnMuc2hvdWxkUmVkaXJlY3RTdGRPdXQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB+Q3VtdWxhdGl2ZVJlcG9ydGVyQmFzZSgpOworCisgICAgICAgIHZpcnR1YWwgUmVwb3J0ZXJQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcygpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIHJldHVybiBtX3JlcG9ydGVyUHJlZnM7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdFJ1blN0YXJ0aW5nKCBUZXN0UnVuSW5mbyBjb25zdCYgKSBDQVRDSF9PVkVSUklERSB7fQorICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdEdyb3VwU3RhcnRpbmcoIEdyb3VwSW5mbyBjb25zdCYgKSBDQVRDSF9PVkVSUklERSB7fQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0Q2FzZVN0YXJ0aW5nKCBUZXN0Q2FzZUluZm8gY29uc3QmICkgQ0FUQ0hfT1ZFUlJJREUge30KKworICAgICAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvblN0YXJ0aW5nKCBTZWN0aW9uSW5mbyBjb25zdCYgc2VjdGlvbkluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBTZWN0aW9uU3RhdHMgaW5jb21wbGV0ZVN0YXRzKCBzZWN0aW9uSW5mbywgQ291bnRzKCksIDAsIGZhbHNlICk7CisgICAgICAgICAgICBQdHI8U2VjdGlvbk5vZGU+IG5vZGU7CisgICAgICAgICAgICBpZiggbV9zZWN0aW9uU3RhY2suZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICBpZiggIW1fcm9vdFNlY3Rpb24gKQorICAgICAgICAgICAgICAgICAgICBtX3Jvb3RTZWN0aW9uID0gbmV3IFNlY3Rpb25Ob2RlKCBpbmNvbXBsZXRlU3RhdHMgKTsKKyAgICAgICAgICAgICAgICBub2RlID0gbV9yb290U2VjdGlvbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIFNlY3Rpb25Ob2RlJiBwYXJlbnROb2RlID0gKm1fc2VjdGlvblN0YWNrLmJhY2soKTsKKyAgICAgICAgICAgICAgICBTZWN0aW9uTm9kZTo6Q2hpbGRTZWN0aW9uczo6Y29uc3RfaXRlcmF0b3IgaXQgPQorICAgICAgICAgICAgICAgICAgICBzdGQ6OmZpbmRfaWYoICAgcGFyZW50Tm9kZS5jaGlsZFNlY3Rpb25zLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnROb2RlLmNoaWxkU2VjdGlvbnMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeVNlY3Rpb25JbmZvKCBzZWN0aW9uSW5mbyApICk7CisgICAgICAgICAgICAgICAgaWYoIGl0ID09IHBhcmVudE5vZGUuY2hpbGRTZWN0aW9ucy5lbmQoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgbm9kZSA9IG5ldyBTZWN0aW9uTm9kZSggaW5jb21wbGV0ZVN0YXRzICk7CisgICAgICAgICAgICAgICAgICAgIHBhcmVudE5vZGUuY2hpbGRTZWN0aW9ucy5wdXNoX2JhY2soIG5vZGUgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBub2RlID0gKml0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgbV9zZWN0aW9uU3RhY2sucHVzaF9iYWNrKCBub2RlICk7CisgICAgICAgICAgICBtX2RlZXBlc3RTZWN0aW9uID0gbm9kZTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBhc3NlcnRpb25TdGFydGluZyggQXNzZXJ0aW9uSW5mbyBjb25zdCYgKSBDQVRDSF9PVkVSUklERSB7fQorCisgICAgICAgIHZpcnR1YWwgYm9vbCBhc3NlcnRpb25FbmRlZCggQXNzZXJ0aW9uU3RhdHMgY29uc3QmIGFzc2VydGlvblN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgYXNzZXJ0KCAhbV9zZWN0aW9uU3RhY2suZW1wdHkoKSApOworICAgICAgICAgICAgU2VjdGlvbk5vZGUmIHNlY3Rpb25Ob2RlID0gKm1fc2VjdGlvblN0YWNrLmJhY2soKTsKKyAgICAgICAgICAgIHNlY3Rpb25Ob2RlLmFzc2VydGlvbnMucHVzaF9iYWNrKCBhc3NlcnRpb25TdGF0cyApOworICAgICAgICAgICAgLy8gQXNzZXJ0aW9uUmVzdWx0IGhvbGRzIGEgcG9pbnRlciB0byBhIHRlbXBvcmFyeSBEZWNvbXBvc2VkRXhwcmVzc2lvbiwKKyAgICAgICAgICAgIC8vIHdoaWNoIGdldEV4cGFuZGVkRXhwcmVzc2lvbigpIGNhbGxzIHRvIGJ1aWxkIHRoZSBleHByZXNzaW9uIHN0cmluZy4KKyAgICAgICAgICAgIC8vIE91ciBzZWN0aW9uIHN0YWNrIGNvcHkgb2YgdGhlIGFzc2VydGlvblJlc3VsdCB3aWxsIGxpa2VseSBvdXRsaXZlIHRoZQorICAgICAgICAgICAgLy8gdGVtcG9yYXJ5LCBzbyBpdCBtdXN0IGJlIGV4cGFuZGVkIG9yIGRpc2NhcmRlZCBub3cgdG8gYXZvaWQgY2FsbGluZworICAgICAgICAgICAgLy8gYSBkZXN0cm95ZWQgb2JqZWN0IGxhdGVyLgorICAgICAgICAgICAgcHJlcGFyZUV4cGFuZGVkRXhwcmVzc2lvbiggc2VjdGlvbk5vZGUuYXNzZXJ0aW9ucy5iYWNrKCkuYXNzZXJ0aW9uUmVzdWx0ICk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvbkVuZGVkKCBTZWN0aW9uU3RhdHMgY29uc3QmIHNlY3Rpb25TdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIGFzc2VydCggIW1fc2VjdGlvblN0YWNrLmVtcHR5KCkgKTsKKyAgICAgICAgICAgIFNlY3Rpb25Ob2RlJiBub2RlID0gKm1fc2VjdGlvblN0YWNrLmJhY2soKTsKKyAgICAgICAgICAgIG5vZGUuc3RhdHMgPSBzZWN0aW9uU3RhdHM7CisgICAgICAgICAgICBtX3NlY3Rpb25TdGFjay5wb3BfYmFjaygpOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0Q2FzZUVuZGVkKCBUZXN0Q2FzZVN0YXRzIGNvbnN0JiB0ZXN0Q2FzZVN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgUHRyPFRlc3RDYXNlTm9kZT4gbm9kZSA9IG5ldyBUZXN0Q2FzZU5vZGUoIHRlc3RDYXNlU3RhdHMgKTsKKyAgICAgICAgICAgIGFzc2VydCggbV9zZWN0aW9uU3RhY2suc2l6ZSgpID09IDAgKTsKKyAgICAgICAgICAgIG5vZGUtPmNoaWxkcmVuLnB1c2hfYmFjayggbV9yb290U2VjdGlvbiApOworICAgICAgICAgICAgbV90ZXN0Q2FzZXMucHVzaF9iYWNrKCBub2RlICk7CisgICAgICAgICAgICBtX3Jvb3RTZWN0aW9uLnJlc2V0KCk7CisKKyAgICAgICAgICAgIGFzc2VydCggbV9kZWVwZXN0U2VjdGlvbiApOworICAgICAgICAgICAgbV9kZWVwZXN0U2VjdGlvbi0+c3RkT3V0ID0gdGVzdENhc2VTdGF0cy5zdGRPdXQ7CisgICAgICAgICAgICBtX2RlZXBlc3RTZWN0aW9uLT5zdGRFcnIgPSB0ZXN0Q2FzZVN0YXRzLnN0ZEVycjsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdEdyb3VwRW5kZWQoIFRlc3RHcm91cFN0YXRzIGNvbnN0JiB0ZXN0R3JvdXBTdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIFB0cjxUZXN0R3JvdXBOb2RlPiBub2RlID0gbmV3IFRlc3RHcm91cE5vZGUoIHRlc3RHcm91cFN0YXRzICk7CisgICAgICAgICAgICBub2RlLT5jaGlsZHJlbi5zd2FwKCBtX3Rlc3RDYXNlcyApOworICAgICAgICAgICAgbV90ZXN0R3JvdXBzLnB1c2hfYmFjayggbm9kZSApOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0UnVuRW5kZWQoIFRlc3RSdW5TdGF0cyBjb25zdCYgdGVzdFJ1blN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgUHRyPFRlc3RSdW5Ob2RlPiBub2RlID0gbmV3IFRlc3RSdW5Ob2RlKCB0ZXN0UnVuU3RhdHMgKTsKKyAgICAgICAgICAgIG5vZGUtPmNoaWxkcmVuLnN3YXAoIG1fdGVzdEdyb3VwcyApOworICAgICAgICAgICAgbV90ZXN0UnVucy5wdXNoX2JhY2soIG5vZGUgKTsKKyAgICAgICAgICAgIHRlc3RSdW5FbmRlZEN1bXVsYXRpdmUoKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdFJ1bkVuZGVkQ3VtdWxhdGl2ZSgpID0gMDsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgc2tpcFRlc3QoIFRlc3RDYXNlSW5mbyBjb25zdCYgKSBDQVRDSF9PVkVSUklERSB7fQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBwcmVwYXJlRXhwYW5kZWRFeHByZXNzaW9uKCBBc3NlcnRpb25SZXN1bHQmIHJlc3VsdCApIGNvbnN0IHsKKyAgICAgICAgICAgIGlmKCByZXN1bHQuaXNPaygpICkKKyAgICAgICAgICAgICAgICByZXN1bHQuZGlzY2FyZERlY29tcG9zZWRFeHByZXNzaW9uKCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmVzdWx0LmV4cGFuZERlY29tcG9zZWRFeHByZXNzaW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBQdHI8SUNvbmZpZyBjb25zdD4gbV9jb25maWc7CisgICAgICAgIHN0ZDo6b3N0cmVhbSYgc3RyZWFtOworICAgICAgICBzdGQ6OnZlY3RvcjxBc3NlcnRpb25TdGF0cz4gbV9hc3NlcnRpb25zOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxQdHI8U2VjdGlvbk5vZGU+ID4gPiBtX3NlY3Rpb25zOworICAgICAgICBzdGQ6OnZlY3RvcjxQdHI8VGVzdENhc2VOb2RlPiA+IG1fdGVzdENhc2VzOworICAgICAgICBzdGQ6OnZlY3RvcjxQdHI8VGVzdEdyb3VwTm9kZT4gPiBtX3Rlc3RHcm91cHM7CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8UHRyPFRlc3RSdW5Ob2RlPiA+IG1fdGVzdFJ1bnM7CisKKyAgICAgICAgUHRyPFNlY3Rpb25Ob2RlPiBtX3Jvb3RTZWN0aW9uOworICAgICAgICBQdHI8U2VjdGlvbk5vZGU+IG1fZGVlcGVzdFNlY3Rpb247CisgICAgICAgIHN0ZDo6dmVjdG9yPFB0cjxTZWN0aW9uTm9kZT4gPiBtX3NlY3Rpb25TdGFjazsKKyAgICAgICAgUmVwb3J0ZXJQcmVmZXJlbmNlcyBtX3JlcG9ydGVyUHJlZnM7CisKKyAgICB9OworCisgICAgdGVtcGxhdGU8Y2hhciBDPgorICAgIGNoYXIgY29uc3QqIGdldExpbmVPZkNoYXJzKCkgeworICAgICAgICBzdGF0aWMgY2hhciBsaW5lW0NBVENIX0NPTkZJR19DT05TT0xFX1dJRFRIXSA9IHswfTsKKyAgICAgICAgaWYoICEqbGluZSApIHsKKyAgICAgICAgICAgIHN0ZDo6bWVtc2V0KCBsaW5lLCBDLCBDQVRDSF9DT05GSUdfQ09OU09MRV9XSURUSC0xICk7CisgICAgICAgICAgICBsaW5lW0NBVENIX0NPTkZJR19DT05TT0xFX1dJRFRILTFdID0gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGluZTsKKyAgICB9CisKKyAgICBzdHJ1Y3QgVGVzdEV2ZW50TGlzdGVuZXJCYXNlIDogU3RyZWFtaW5nUmVwb3J0ZXJCYXNlIHsKKyAgICAgICAgVGVzdEV2ZW50TGlzdGVuZXJCYXNlKCBSZXBvcnRlckNvbmZpZyBjb25zdCYgX2NvbmZpZyApCisgICAgICAgIDogICBTdHJlYW1pbmdSZXBvcnRlckJhc2UoIF9jb25maWcgKQorICAgICAgICB7fQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBhc3NlcnRpb25TdGFydGluZyggQXNzZXJ0aW9uSW5mbyBjb25zdCYgKSBDQVRDSF9PVkVSUklERSB7fQorICAgICAgICB2aXJ0dWFsIGJvb2wgYXNzZXJ0aW9uRW5kZWQoIEFzc2VydGlvblN0YXRzIGNvbnN0JiApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogLi4vaW50ZXJuYWwvY2F0Y2hfcmVwb3J0ZXJfcmVnaXN0cmFycy5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1JFUE9SVEVSX1JFR0lTVFJBUlNfSFBQX0lOQ0xVREVECisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGNsYXNzIExlZ2FjeVJlcG9ydGVyUmVnaXN0cmFyIHsKKworICAgICAgICBjbGFzcyBSZXBvcnRlckZhY3RvcnkgOiBwdWJsaWMgSVJlcG9ydGVyRmFjdG9yeSB7CisgICAgICAgICAgICB2aXJ0dWFsIElTdHJlYW1pbmdSZXBvcnRlciogY3JlYXRlKCBSZXBvcnRlckNvbmZpZyBjb25zdCYgY29uZmlnICkgY29uc3QgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTGVnYWN5UmVwb3J0ZXJBZGFwdGVyKCBuZXcgVCggY29uZmlnICkgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXREZXNjcmlwdGlvbigpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVDo6Z2V0RGVzY3JpcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgIHB1YmxpYzoKKworICAgICAgICBMZWdhY3lSZXBvcnRlclJlZ2lzdHJhciggc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUgKSB7CisgICAgICAgICAgICBnZXRNdXRhYmxlUmVnaXN0cnlIdWIoKS5yZWdpc3RlclJlcG9ydGVyKCBuYW1lLCBuZXcgUmVwb3J0ZXJGYWN0b3J5KCkgKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGNsYXNzIFJlcG9ydGVyUmVnaXN0cmFyIHsKKworICAgICAgICBjbGFzcyBSZXBvcnRlckZhY3RvcnkgOiBwdWJsaWMgU2hhcmVkSW1wbDxJUmVwb3J0ZXJGYWN0b3J5PiB7CisKKyAgICAgICAgICAgIC8vICoqKiBQbGVhc2UgTm90ZSAqKio6CisgICAgICAgICAgICAvLyAtIElmIHlvdSBlbmQgdXAgaGVyZSBsb29raW5nIGF0IGEgY29tcGlsZXIgZXJyb3IgYmVjYXVzZSBpdCdzIHRyeWluZyB0byByZWdpc3RlcgorICAgICAgICAgICAgLy8geW91ciBjdXN0b20gcmVwb3J0ZXIgY2xhc3MgYmUgYXdhcmUgdGhhdCB0aGUgbmF0aXZlIHJlcG9ydGVyIGludGVyZmFjZSBoYXMgY2hhbmdlZAorICAgICAgICAgICAgLy8gdG8gSVN0cmVhbWluZ1JlcG9ydGVyLiBUaGUgImxlZ2FjeSIgaW50ZXJmYWNlLCBJUmVwb3J0ZXIsIGlzIHN0aWxsIHN1cHBvcnRlZCB2aWEKKyAgICAgICAgICAgIC8vIGFuIGFkYXB0ZXIuIEp1c3QgdXNlIFJFR0lTVEVSX0xFR0FDWV9SRVBPUlRFUiB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgYWRhcHRlci4KKyAgICAgICAgICAgIC8vIEhvd2V2ZXIgcGxlYXNlIGNvbnNpZGVyIHVwZGF0aW5nIHRvIHRoZSBuZXcgaW50ZXJmYWNlIGFzIHRoZSBvbGQgb25lIGlzIG5vdworICAgICAgICAgICAgLy8gZGVwcmVjYXRlZCBhbmQgd2lsbCBwcm9iYWJseSBiZSByZW1vdmVkIHF1aXRlIHNvb24hCisgICAgICAgICAgICAvLyBQbGVhc2UgY29udGFjdCBtZSB2aWEgZ2l0aHViIGlmIHlvdSBoYXZlIGFueSBxdWVzdGlvbnMgYXQgYWxsIGFib3V0IHRoaXMuCisgICAgICAgICAgICAvLyBJbiBmYWN0LCBpZGVhbGx5LCBwbGVhc2UgY29udGFjdCBtZSBhbnl3YXkgdG8gbGV0IG1lIGtub3cgeW91J3ZlIGhpdCB0aGlzIC0gYXMgSSBoYXZlCisgICAgICAgICAgICAvLyBubyBpZGVhIHdobyBpcyBhY3R1YWxseSB1c2luZyBjdXN0b20gcmVwb3J0ZXJzIGF0IGFsbCAocG9zc2libHkgbm8tb25lISkuCisgICAgICAgICAgICAvLyBUaGUgbmV3IGludGVyZmFjZSBpcyBkZXNpZ25lZCB0byBtaW5pbWlzZSBleHBvc3VyZSB0byBpbnRlcmZhY2UgY2hhbmdlcyBpbiB0aGUgZnV0dXJlLgorICAgICAgICAgICAgdmlydHVhbCBJU3RyZWFtaW5nUmVwb3J0ZXIqIGNyZWF0ZSggUmVwb3J0ZXJDb25maWcgY29uc3QmIGNvbmZpZyApIGNvbnN0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFQoIGNvbmZpZyApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldERlc2NyaXB0aW9uKCkgY29uc3QgeworICAgICAgICAgICAgICAgIHJldHVybiBUOjpnZXREZXNjcmlwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgcHVibGljOgorCisgICAgICAgIFJlcG9ydGVyUmVnaXN0cmFyKCBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSApIHsKKyAgICAgICAgICAgIGdldE11dGFibGVSZWdpc3RyeUh1YigpLnJlZ2lzdGVyUmVwb3J0ZXIoIG5hbWUsIG5ldyBSZXBvcnRlckZhY3RvcnkoKSApOworICAgICAgICB9CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgY2xhc3MgTGlzdGVuZXJSZWdpc3RyYXIgeworCisgICAgICAgIGNsYXNzIExpc3RlbmVyRmFjdG9yeSA6IHB1YmxpYyBTaGFyZWRJbXBsPElSZXBvcnRlckZhY3Rvcnk+IHsKKworICAgICAgICAgICAgdmlydHVhbCBJU3RyZWFtaW5nUmVwb3J0ZXIqIGNyZWF0ZSggUmVwb3J0ZXJDb25maWcgY29uc3QmIGNvbmZpZyApIGNvbnN0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFQoIGNvbmZpZyApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXREZXNjcmlwdGlvbigpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RkOjpzdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgIHB1YmxpYzoKKworICAgICAgICBMaXN0ZW5lclJlZ2lzdHJhcigpIHsKKyAgICAgICAgICAgIGdldE11dGFibGVSZWdpc3RyeUh1YigpLnJlZ2lzdGVyTGlzdGVuZXIoIG5ldyBMaXN0ZW5lckZhY3RvcnkoKSApOworICAgICAgICB9CisgICAgfTsKK30KKworI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9SRUdJU1RFUl9MRUdBQ1lfUkVQT1JURVIoIG5hbWUsIHJlcG9ydGVyVHlwZSApIFwKKyAgICBuYW1lc3BhY2V7IENhdGNoOjpMZWdhY3lSZXBvcnRlclJlZ2lzdHJhcjxyZXBvcnRlclR5cGU+IGNhdGNoX2ludGVybmFsX1JlZ2lzdHJhckZvciMjcmVwb3J0ZXJUeXBlKCBuYW1lICk7IH0KKworI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9SRUdJU1RFUl9SRVBPUlRFUiggbmFtZSwgcmVwb3J0ZXJUeXBlICkgXAorICAgIG5hbWVzcGFjZXsgQ2F0Y2g6OlJlcG9ydGVyUmVnaXN0cmFyPHJlcG9ydGVyVHlwZT4gY2F0Y2hfaW50ZXJuYWxfUmVnaXN0cmFyRm9yIyNyZXBvcnRlclR5cGUoIG5hbWUgKTsgfQorCisvLyBEZXByZWNhdGVkIC0gdXNlIHRoZSBmb3JtIHdpdGhvdXQgSU5URVJOQUxfCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX1JFR0lTVEVSX0xJU1RFTkVSKCBsaXN0ZW5lclR5cGUgKSBcCisgICAgbmFtZXNwYWNleyBDYXRjaDo6TGlzdGVuZXJSZWdpc3RyYXI8bGlzdGVuZXJUeXBlPiBjYXRjaF9pbnRlcm5hbF9SZWdpc3RyYXJGb3IjI2xpc3RlbmVyVHlwZTsgfQorCisjZGVmaW5lIENBVENIX1JFR0lTVEVSX0xJU1RFTkVSKCBsaXN0ZW5lclR5cGUgKSBcCisgICAgbmFtZXNwYWNleyBDYXRjaDo6TGlzdGVuZXJSZWdpc3RyYXI8bGlzdGVuZXJUeXBlPiBjYXRjaF9pbnRlcm5hbF9SZWdpc3RyYXJGb3IjI2xpc3RlbmVyVHlwZTsgfQorCisvLyAjaW5jbHVkZWQgZnJvbTogLi4vaW50ZXJuYWwvY2F0Y2hfeG1sd3JpdGVyLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfWE1MV1JJVEVSX0hQUF9JTkNMVURFRAorCisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGlvbWFuaXA+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBjbGFzcyBYbWxFbmNvZGUgeworICAgIHB1YmxpYzoKKyAgICAgICAgZW51bSBGb3JXaGF0IHsgRm9yVGV4dE5vZGVzLCBGb3JBdHRyaWJ1dGVzIH07CisKKyAgICAgICAgWG1sRW5jb2RlKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyLCBGb3JXaGF0IGZvcldoYXQgPSBGb3JUZXh0Tm9kZXMgKQorICAgICAgICA6ICAgbV9zdHIoIHN0ciApLAorICAgICAgICAgICAgbV9mb3JXaGF0KCBmb3JXaGF0ICkKKyAgICAgICAge30KKworICAgICAgICB2b2lkIGVuY29kZVRvKCBzdGQ6Om9zdHJlYW0mIG9zICkgY29uc3QgeworCisgICAgICAgICAgICAvLyBBcG9zdHJvcGhlIGVzY2FwaW5nIG5vdCBuZWNlc3NhcnkgaWYgd2UgYWx3YXlzIHVzZSAiIHRvIHdyaXRlIGF0dHJpYnV0ZXMKKyAgICAgICAgICAgIC8vIChzZWU6IGh0dHA6Ly93d3cudzMub3JnL1RSL3htbC8jc3ludGF4KQorCisgICAgICAgICAgICBmb3IoIHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgbV9zdHIuc2l6ZSgpOyArKyBpICkgeworICAgICAgICAgICAgICAgIGNoYXIgYyA9IG1fc3RyW2ldOworICAgICAgICAgICAgICAgIHN3aXRjaCggYyApIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnPCc6ICAgb3MgPDwgIiZsdDsiOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnJic6ICAgb3MgPDwgIiZhbXA7IjsgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnPic6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZWU6IGh0dHA6Ly93d3cudzMub3JnL1RSL3htbC8jc3ludGF4CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggaSA+IDIgJiYgbV9zdHJbaS0xXSA9PSAnXScgJiYgbV9zdHJbaS0yXSA9PSAnXScgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zIDw8ICImZ3Q7IjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcyA8PCBjOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnXCInOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYoIG1fZm9yV2hhdCA9PSBGb3JBdHRyaWJ1dGVzICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcyA8PCAiJnF1b3Q7IjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcyA8PCBjOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVzY2FwZSBjb250cm9sIGNoYXJzIC0gYmFzZWQgb24gY29udHJpYnV0aW9uIGJ5IEBlc3BlbmFsYiBpbiBQUiAjNDY1IGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnkgQG1ycGkgUFIgIzU4OAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoIGMgPj0gMCAmJiBjIDwgJ1x4MDknICkgfHwgKCBjID4gJ1x4MEQnICYmIGMgPCAnXHgyMCcpIHx8IGM9PSdceDdGJyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWUgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80MDQxMDcvd2h5LWFyZS1jb250cm9sLWNoYXJhY3RlcnMtaWxsZWdhbC1pbi14bWwtMS0wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MgPDwgIlxceCIgPDwgc3RkOjp1cHBlcmNhc2UgPDwgc3RkOjpoZXggPDwgc3RkOjpzZXRmaWxsKCcwJykgPDwgc3RkOjpzZXR3KDIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RhdGljX2Nhc3Q8aW50PiggYyApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zIDw8IGM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwgKCBzdGQ6Om9zdHJlYW0mIG9zLCBYbWxFbmNvZGUgY29uc3QmIHhtbEVuY29kZSApIHsKKyAgICAgICAgICAgIHhtbEVuY29kZS5lbmNvZGVUbyggb3MgKTsKKyAgICAgICAgICAgIHJldHVybiBvczsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjpzdHJpbmcgbV9zdHI7CisgICAgICAgIEZvcldoYXQgbV9mb3JXaGF0OworICAgIH07CisKKyAgICBjbGFzcyBYbWxXcml0ZXIgeworICAgIHB1YmxpYzoKKworICAgICAgICBjbGFzcyBTY29wZWRFbGVtZW50IHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgU2NvcGVkRWxlbWVudCggWG1sV3JpdGVyKiB3cml0ZXIgKQorICAgICAgICAgICAgOiAgIG1fd3JpdGVyKCB3cml0ZXIgKQorICAgICAgICAgICAge30KKworICAgICAgICAgICAgU2NvcGVkRWxlbWVudCggU2NvcGVkRWxlbWVudCBjb25zdCYgb3RoZXIgKQorICAgICAgICAgICAgOiAgIG1fd3JpdGVyKCBvdGhlci5tX3dyaXRlciApeworICAgICAgICAgICAgICAgIG90aGVyLm1fd3JpdGVyID0gQ0FUQ0hfTlVMTDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgflNjb3BlZEVsZW1lbnQoKSB7CisgICAgICAgICAgICAgICAgaWYoIG1fd3JpdGVyICkKKyAgICAgICAgICAgICAgICAgICAgbV93cml0ZXItPmVuZEVsZW1lbnQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU2NvcGVkRWxlbWVudCYgd3JpdGVUZXh0KCBzdGQ6OnN0cmluZyBjb25zdCYgdGV4dCwgYm9vbCBpbmRlbnQgPSB0cnVlICkgeworICAgICAgICAgICAgICAgIG1fd3JpdGVyLT53cml0ZVRleHQoIHRleHQsIGluZGVudCApOworICAgICAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgICAgIFNjb3BlZEVsZW1lbnQmIHdyaXRlQXR0cmlidXRlKCBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSwgVCBjb25zdCYgYXR0cmlidXRlICkgeworICAgICAgICAgICAgICAgIG1fd3JpdGVyLT53cml0ZUF0dHJpYnV0ZSggbmFtZSwgYXR0cmlidXRlICk7CisgICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAgICAgfQorCisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICBtdXRhYmxlIFhtbFdyaXRlciogbV93cml0ZXI7CisgICAgICAgIH07CisKKyAgICAgICAgWG1sV3JpdGVyKCkKKyAgICAgICAgOiAgIG1fdGFnSXNPcGVuKCBmYWxzZSApLAorICAgICAgICAgICAgbV9uZWVkc05ld2xpbmUoIGZhbHNlICksCisgICAgICAgICAgICBtX29zKCBDYXRjaDo6Y291dCgpICkKKyAgICAgICAgeworICAgICAgICAgICAgd3JpdGVEZWNsYXJhdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgWG1sV3JpdGVyKCBzdGQ6Om9zdHJlYW0mIG9zICkKKyAgICAgICAgOiAgIG1fdGFnSXNPcGVuKCBmYWxzZSApLAorICAgICAgICAgICAgbV9uZWVkc05ld2xpbmUoIGZhbHNlICksCisgICAgICAgICAgICBtX29zKCBvcyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHdyaXRlRGVjbGFyYXRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIH5YbWxXcml0ZXIoKSB7CisgICAgICAgICAgICB3aGlsZSggIW1fdGFncy5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICBlbmRFbGVtZW50KCk7CisgICAgICAgIH0KKworICAgICAgICBYbWxXcml0ZXImIHN0YXJ0RWxlbWVudCggc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUgKSB7CisgICAgICAgICAgICBlbnN1cmVUYWdDbG9zZWQoKTsKKyAgICAgICAgICAgIG5ld2xpbmVJZk5lY2Vzc2FyeSgpOworICAgICAgICAgICAgbV9vcyA8PCBtX2luZGVudCA8PCAnPCcgPDwgbmFtZTsKKyAgICAgICAgICAgIG1fdGFncy5wdXNoX2JhY2soIG5hbWUgKTsKKyAgICAgICAgICAgIG1faW5kZW50ICs9ICIgICI7CisgICAgICAgICAgICBtX3RhZ0lzT3BlbiA9IHRydWU7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICBTY29wZWRFbGVtZW50IHNjb3BlZEVsZW1lbnQoIHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lICkgeworICAgICAgICAgICAgU2NvcGVkRWxlbWVudCBzY29wZWQoIHRoaXMgKTsKKyAgICAgICAgICAgIHN0YXJ0RWxlbWVudCggbmFtZSApOworICAgICAgICAgICAgcmV0dXJuIHNjb3BlZDsKKyAgICAgICAgfQorCisgICAgICAgIFhtbFdyaXRlciYgZW5kRWxlbWVudCgpIHsKKyAgICAgICAgICAgIG5ld2xpbmVJZk5lY2Vzc2FyeSgpOworICAgICAgICAgICAgbV9pbmRlbnQgPSBtX2luZGVudC5zdWJzdHIoIDAsIG1faW5kZW50LnNpemUoKS0yICk7CisgICAgICAgICAgICBpZiggbV90YWdJc09wZW4gKSB7CisgICAgICAgICAgICAgICAgbV9vcyA8PCAiLz4iOworICAgICAgICAgICAgICAgIG1fdGFnSXNPcGVuID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBtX29zIDw8IG1faW5kZW50IDw8ICI8LyIgPDwgbV90YWdzLmJhY2soKSA8PCAiPiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtX29zIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgIG1fdGFncy5wb3BfYmFjaygpOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgWG1sV3JpdGVyJiB3cml0ZUF0dHJpYnV0ZSggc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUsIHN0ZDo6c3RyaW5nIGNvbnN0JiBhdHRyaWJ1dGUgKSB7CisgICAgICAgICAgICBpZiggIW5hbWUuZW1wdHkoKSAmJiAhYXR0cmlidXRlLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgIG1fb3MgPDwgJyAnIDw8IG5hbWUgPDwgIj1cIiIgPDwgWG1sRW5jb2RlKCBhdHRyaWJ1dGUsIFhtbEVuY29kZTo6Rm9yQXR0cmlidXRlcyApIDw8ICciJzsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIFhtbFdyaXRlciYgd3JpdGVBdHRyaWJ1dGUoIHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lLCBib29sIGF0dHJpYnV0ZSApIHsKKyAgICAgICAgICAgIG1fb3MgPDwgJyAnIDw8IG5hbWUgPDwgIj1cIiIgPDwgKCBhdHRyaWJ1dGUgPyAidHJ1ZSIgOiAiZmFsc2UiICkgPDwgJyInOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgWG1sV3JpdGVyJiB3cml0ZUF0dHJpYnV0ZSggc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUsIFQgY29uc3QmIGF0dHJpYnV0ZSApIHsKKyAgICAgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgICAgICBvc3MgPDwgYXR0cmlidXRlOworICAgICAgICAgICAgcmV0dXJuIHdyaXRlQXR0cmlidXRlKCBuYW1lLCBvc3Muc3RyKCkgKTsKKyAgICAgICAgfQorCisgICAgICAgIFhtbFdyaXRlciYgd3JpdGVUZXh0KCBzdGQ6OnN0cmluZyBjb25zdCYgdGV4dCwgYm9vbCBpbmRlbnQgPSB0cnVlICkgeworICAgICAgICAgICAgaWYoICF0ZXh0LmVtcHR5KCkgKXsKKyAgICAgICAgICAgICAgICBib29sIHRhZ1dhc09wZW4gPSBtX3RhZ0lzT3BlbjsKKyAgICAgICAgICAgICAgICBlbnN1cmVUYWdDbG9zZWQoKTsKKyAgICAgICAgICAgICAgICBpZiggdGFnV2FzT3BlbiAmJiBpbmRlbnQgKQorICAgICAgICAgICAgICAgICAgICBtX29zIDw8IG1faW5kZW50OworICAgICAgICAgICAgICAgIG1fb3MgPDwgWG1sRW5jb2RlKCB0ZXh0ICk7CisgICAgICAgICAgICAgICAgbV9uZWVkc05ld2xpbmUgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgWG1sV3JpdGVyJiB3cml0ZUNvbW1lbnQoIHN0ZDo6c3RyaW5nIGNvbnN0JiB0ZXh0ICkgeworICAgICAgICAgICAgZW5zdXJlVGFnQ2xvc2VkKCk7CisgICAgICAgICAgICBtX29zIDw8IG1faW5kZW50IDw8ICI8IS0tIiA8PCB0ZXh0IDw8ICItLT4iOworICAgICAgICAgICAgbV9uZWVkc05ld2xpbmUgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB3cml0ZVN0eWxlc2hlZXRSZWYoIHN0ZDo6c3RyaW5nIGNvbnN0JiB1cmwgKSB7CisgICAgICAgICAgICBtX29zIDw8ICI8P3htbC1zdHlsZXNoZWV0IHR5cGU9XCJ0ZXh0L3hzbFwiIGhyZWY9XCIiIDw8IHVybCA8PCAiXCI/PlxuIjsKKyAgICAgICAgfQorCisgICAgICAgIFhtbFdyaXRlciYgd3JpdGVCbGFua0xpbmUoKSB7CisgICAgICAgICAgICBlbnN1cmVUYWdDbG9zZWQoKTsKKyAgICAgICAgICAgIG1fb3MgPDwgJ1xuJzsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgZW5zdXJlVGFnQ2xvc2VkKCkgeworICAgICAgICAgICAgaWYoIG1fdGFnSXNPcGVuICkgeworICAgICAgICAgICAgICAgIG1fb3MgPDwgIj4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgICAgICBtX3RhZ0lzT3BlbiA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBYbWxXcml0ZXIoIFhtbFdyaXRlciBjb25zdCYgKTsKKyAgICAgICAgdm9pZCBvcGVyYXRvcj0oIFhtbFdyaXRlciBjb25zdCYgKTsKKworICAgICAgICB2b2lkIHdyaXRlRGVjbGFyYXRpb24oKSB7CisgICAgICAgICAgICBtX29zIDw8ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbiI7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIG5ld2xpbmVJZk5lY2Vzc2FyeSgpIHsKKyAgICAgICAgICAgIGlmKCBtX25lZWRzTmV3bGluZSApIHsKKyAgICAgICAgICAgICAgICBtX29zIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgICAgICBtX25lZWRzTmV3bGluZSA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYm9vbCBtX3RhZ0lzT3BlbjsKKyAgICAgICAgYm9vbCBtX25lZWRzTmV3bGluZTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG1fdGFnczsKKyAgICAgICAgc3RkOjpzdHJpbmcgbV9pbmRlbnQ7CisgICAgICAgIHN0ZDo6b3N0cmVhbSYgbV9vczsKKyAgICB9OworCit9CisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfcmVlbmFibGVfd2FybmluZ3MuaAorCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9SRUVOQUJMRV9XQVJOSU5HU19IX0lOQ0xVREVECisKKyNpZmRlZiBfX2NsYW5nX18KKyMgICAgaWZkZWYgX19JQ0MgLy8gaWNwYyBkZWZpbmVzIHRoZSBfX2NsYW5nX18gbWFjcm8KKyMgICAgICAgIHByYWdtYSB3YXJuaW5nKHBvcCkKKyMgICAgZWxzZQorIyAgICAgICAgcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCisjICAgIGVuZGlmCisjZWxpZiBkZWZpbmVkIF9fR05VQ19fCisjICAgIHByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwb3AKKyNlbmRpZgorCisKK25hbWVzcGFjZSBDYXRjaCB7CisgICAgY2xhc3MgWG1sUmVwb3J0ZXIgOiBwdWJsaWMgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFhtbFJlcG9ydGVyKCBSZXBvcnRlckNvbmZpZyBjb25zdCYgX2NvbmZpZyApCisgICAgICAgIDogICBTdHJlYW1pbmdSZXBvcnRlckJhc2UoIF9jb25maWcgKSwKKyAgICAgICAgICAgIG1feG1sKF9jb25maWcuc3RyZWFtKCkpLAorICAgICAgICAgICAgbV9zZWN0aW9uRGVwdGgoIDAgKQorICAgICAgICB7CisgICAgICAgICAgICBtX3JlcG9ydGVyUHJlZnMuc2hvdWxkUmVkaXJlY3RTdGRPdXQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB+WG1sUmVwb3J0ZXIoKSBDQVRDSF9PVkVSUklERTsKKworICAgICAgICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gIlJlcG9ydHMgdGVzdCByZXN1bHRzIGFzIGFuIFhNTCBkb2N1bWVudCI7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldFN0eWxlc2hlZXRSZWYoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gc3RkOjpzdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgd3JpdGVTb3VyY2VJbmZvKCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgc291cmNlSW5mbyApIHsKKyAgICAgICAgICAgIG1feG1sCisgICAgICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCAiZmlsZW5hbWUiLCBzb3VyY2VJbmZvLmZpbGUgKQorICAgICAgICAgICAgICAgIC53cml0ZUF0dHJpYnV0ZSggImxpbmUiLCBzb3VyY2VJbmZvLmxpbmUgKTsKKyAgICAgICAgfQorCisgICAgcHVibGljOiAvLyBTdHJlYW1pbmdSZXBvcnRlckJhc2UKKworICAgICAgICB2aXJ0dWFsIHZvaWQgbm9NYXRjaGluZ1Rlc3RDYXNlcyggc3RkOjpzdHJpbmcgY29uc3QmIHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2U6Om5vTWF0Y2hpbmdUZXN0Q2FzZXMoIHMgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0UnVuU3RhcnRpbmcoIFRlc3RSdW5JbmZvIGNvbnN0JiB0ZXN0SW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZTo6dGVzdFJ1blN0YXJ0aW5nKCB0ZXN0SW5mbyApOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgc3R5bGVzaGVldFJlZiA9IGdldFN0eWxlc2hlZXRSZWYoKTsKKyAgICAgICAgICAgIGlmKCAhc3R5bGVzaGVldFJlZi5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICBtX3htbC53cml0ZVN0eWxlc2hlZXRSZWYoIHN0eWxlc2hlZXRSZWYgKTsKKyAgICAgICAgICAgIG1feG1sLnN0YXJ0RWxlbWVudCggIkNhdGNoIiApOworICAgICAgICAgICAgaWYoICFtX2NvbmZpZy0+bmFtZSgpLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgIG1feG1sLndyaXRlQXR0cmlidXRlKCAibmFtZSIsIG1fY29uZmlnLT5uYW1lKCkgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0R3JvdXBTdGFydGluZyggR3JvdXBJbmZvIGNvbnN0JiBncm91cEluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2U6OnRlc3RHcm91cFN0YXJ0aW5nKCBncm91cEluZm8gKTsKKyAgICAgICAgICAgIG1feG1sLnN0YXJ0RWxlbWVudCggIkdyb3VwIiApCisgICAgICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCAibmFtZSIsIGdyb3VwSW5mby5uYW1lICk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdENhc2VTdGFydGluZyggVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0SW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZTo6dGVzdENhc2VTdGFydGluZyh0ZXN0SW5mbyk7CisgICAgICAgICAgICBtX3htbC5zdGFydEVsZW1lbnQoICJUZXN0Q2FzZSIgKQorICAgICAgICAgICAgICAgIC53cml0ZUF0dHJpYnV0ZSggIm5hbWUiLCB0cmltKCB0ZXN0SW5mby5uYW1lICkgKQorICAgICAgICAgICAgICAgIC53cml0ZUF0dHJpYnV0ZSggImRlc2NyaXB0aW9uIiwgdGVzdEluZm8uZGVzY3JpcHRpb24gKQorICAgICAgICAgICAgICAgIC53cml0ZUF0dHJpYnV0ZSggInRhZ3MiLCB0ZXN0SW5mby50YWdzQXNTdHJpbmcgKTsKKworICAgICAgICAgICAgd3JpdGVTb3VyY2VJbmZvKCB0ZXN0SW5mby5saW5lSW5mbyApOworCisgICAgICAgICAgICBpZiAoIG1fY29uZmlnLT5zaG93RHVyYXRpb25zKCkgPT0gU2hvd0R1cmF0aW9uczo6QWx3YXlzICkKKyAgICAgICAgICAgICAgICBtX3Rlc3RDYXNlVGltZXIuc3RhcnQoKTsKKyAgICAgICAgICAgIG1feG1sLmVuc3VyZVRhZ0Nsb3NlZCgpOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHNlY3Rpb25TdGFydGluZyggU2VjdGlvbkluZm8gY29uc3QmIHNlY3Rpb25JbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlOjpzZWN0aW9uU3RhcnRpbmcoIHNlY3Rpb25JbmZvICk7CisgICAgICAgICAgICBpZiggbV9zZWN0aW9uRGVwdGgrKyA+IDAgKSB7CisgICAgICAgICAgICAgICAgbV94bWwuc3RhcnRFbGVtZW50KCAiU2VjdGlvbiIgKQorICAgICAgICAgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJuYW1lIiwgdHJpbSggc2VjdGlvbkluZm8ubmFtZSApICkKKyAgICAgICAgICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCAiZGVzY3JpcHRpb24iLCBzZWN0aW9uSW5mby5kZXNjcmlwdGlvbiApOworICAgICAgICAgICAgICAgIHdyaXRlU291cmNlSW5mbyggc2VjdGlvbkluZm8ubGluZUluZm8gKTsKKyAgICAgICAgICAgICAgICBtX3htbC5lbnN1cmVUYWdDbG9zZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBhc3NlcnRpb25TdGFydGluZyggQXNzZXJ0aW9uSW5mbyBjb25zdCYgKSBDQVRDSF9PVkVSUklERSB7IH0KKworICAgICAgICB2aXJ0dWFsIGJvb2wgYXNzZXJ0aW9uRW5kZWQoIEFzc2VydGlvblN0YXRzIGNvbnN0JiBhc3NlcnRpb25TdGF0cyApIENBVENIX09WRVJSSURFIHsKKworICAgICAgICAgICAgQXNzZXJ0aW9uUmVzdWx0IGNvbnN0JiByZXN1bHQgPSBhc3NlcnRpb25TdGF0cy5hc3NlcnRpb25SZXN1bHQ7CisKKyAgICAgICAgICAgIGJvb2wgaW5jbHVkZVJlc3VsdHMgPSBtX2NvbmZpZy0+aW5jbHVkZVN1Y2Nlc3NmdWxSZXN1bHRzKCkgfHwgIXJlc3VsdC5pc09rKCk7CisKKyAgICAgICAgICAgIGlmKCBpbmNsdWRlUmVzdWx0cyApIHsKKyAgICAgICAgICAgICAgICAvLyBQcmludCBhbnkgaW5mbyBtZXNzYWdlcyBpbiA8SW5mbz4gdGFncy4KKyAgICAgICAgICAgICAgICBmb3IoIHN0ZDo6dmVjdG9yPE1lc3NhZ2VJbmZvPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBhc3NlcnRpb25TdGF0cy5pbmZvTWVzc2FnZXMuYmVnaW4oKSwgaXRFbmQgPSBhc3NlcnRpb25TdGF0cy5pbmZvTWVzc2FnZXMuZW5kKCk7CisgICAgICAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICAgICAgICsraXQgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBpdC0+dHlwZSA9PSBSZXN1bHRXYXM6OkluZm8gKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX3htbC5zY29wZWRFbGVtZW50KCAiSW5mbyIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud3JpdGVUZXh0KCBpdC0+bWVzc2FnZSApOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCBpdC0+dHlwZSA9PSBSZXN1bHRXYXM6Oldhcm5pbmcgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX3htbC5zY29wZWRFbGVtZW50KCAiV2FybmluZyIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud3JpdGVUZXh0KCBpdC0+bWVzc2FnZSApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBEcm9wIG91dCBpZiByZXN1bHQgd2FzIHN1Y2Nlc3NmdWwgYnV0IHdlJ3JlIG5vdCBwcmludGluZyB0aGVtLgorICAgICAgICAgICAgaWYoICFpbmNsdWRlUmVzdWx0cyAmJiByZXN1bHQuZ2V0UmVzdWx0VHlwZSgpICE9IFJlc3VsdFdhczo6V2FybmluZyApCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgICAgIC8vIFByaW50IHRoZSBleHByZXNzaW9uIGlmIHRoZXJlIGlzIG9uZS4KKyAgICAgICAgICAgIGlmKCByZXN1bHQuaGFzRXhwcmVzc2lvbigpICkgeworICAgICAgICAgICAgICAgIG1feG1sLnN0YXJ0RWxlbWVudCggIkV4cHJlc3Npb24iICkKKyAgICAgICAgICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCAic3VjY2VzcyIsIHJlc3VsdC5zdWNjZWVkZWQoKSApCisgICAgICAgICAgICAgICAgICAgIC53cml0ZUF0dHJpYnV0ZSggInR5cGUiLCByZXN1bHQuZ2V0VGVzdE1hY3JvTmFtZSgpICk7CisKKyAgICAgICAgICAgICAgICB3cml0ZVNvdXJjZUluZm8oIHJlc3VsdC5nZXRTb3VyY2VJbmZvKCkgKTsKKworICAgICAgICAgICAgICAgIG1feG1sLnNjb3BlZEVsZW1lbnQoICJPcmlnaW5hbCIgKQorICAgICAgICAgICAgICAgICAgICAud3JpdGVUZXh0KCByZXN1bHQuZ2V0RXhwcmVzc2lvbigpICk7CisgICAgICAgICAgICAgICAgbV94bWwuc2NvcGVkRWxlbWVudCggIkV4cGFuZGVkIiApCisgICAgICAgICAgICAgICAgICAgIC53cml0ZVRleHQoIHJlc3VsdC5nZXRFeHBhbmRlZEV4cHJlc3Npb24oKSApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBBbmQuLi4gUHJpbnQgYSByZXN1bHQgYXBwbGljYWJsZSB0byBlYWNoIHJlc3VsdCB0eXBlLgorICAgICAgICAgICAgc3dpdGNoKCByZXN1bHQuZ2V0UmVzdWx0VHlwZSgpICkgeworICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpUaHJld0V4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgbV94bWwuc3RhcnRFbGVtZW50KCAiRXhjZXB0aW9uIiApOworICAgICAgICAgICAgICAgICAgICB3cml0ZVNvdXJjZUluZm8oIHJlc3VsdC5nZXRTb3VyY2VJbmZvKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgbV94bWwud3JpdGVUZXh0KCByZXN1bHQuZ2V0TWVzc2FnZSgpICk7CisgICAgICAgICAgICAgICAgICAgIG1feG1sLmVuZEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkZhdGFsRXJyb3JDb25kaXRpb246CisgICAgICAgICAgICAgICAgICAgIG1feG1sLnN0YXJ0RWxlbWVudCggIkZhdGFsRXJyb3JDb25kaXRpb24iICk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlU291cmNlSW5mbyggcmVzdWx0LmdldFNvdXJjZUluZm8oKSApOworICAgICAgICAgICAgICAgICAgICBtX3htbC53cml0ZVRleHQoIHJlc3VsdC5nZXRNZXNzYWdlKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgbV94bWwuZW5kRWxlbWVudCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6SW5mbzoKKyAgICAgICAgICAgICAgICAgICAgbV94bWwuc2NvcGVkRWxlbWVudCggIkluZm8iICkKKyAgICAgICAgICAgICAgICAgICAgICAgIC53cml0ZVRleHQoIHJlc3VsdC5nZXRNZXNzYWdlKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6Oldhcm5pbmc6CisgICAgICAgICAgICAgICAgICAgIC8vIFdhcm5pbmcgd2lsbCBhbHJlYWR5IGhhdmUgYmVlbiB3cml0dGVuCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpFeHBsaWNpdEZhaWx1cmU6CisgICAgICAgICAgICAgICAgICAgIG1feG1sLnN0YXJ0RWxlbWVudCggIkZhaWx1cmUiICk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlU291cmNlSW5mbyggcmVzdWx0LmdldFNvdXJjZUluZm8oKSApOworICAgICAgICAgICAgICAgICAgICBtX3htbC53cml0ZVRleHQoIHJlc3VsdC5nZXRNZXNzYWdlKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgbV94bWwuZW5kRWxlbWVudCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoIHJlc3VsdC5oYXNFeHByZXNzaW9uKCkgKQorICAgICAgICAgICAgICAgIG1feG1sLmVuZEVsZW1lbnQoKTsKKworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvbkVuZGVkKCBTZWN0aW9uU3RhdHMgY29uc3QmIHNlY3Rpb25TdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZTo6c2VjdGlvbkVuZGVkKCBzZWN0aW9uU3RhdHMgKTsKKyAgICAgICAgICAgIGlmKCAtLW1fc2VjdGlvbkRlcHRoID4gMCApIHsKKyAgICAgICAgICAgICAgICBYbWxXcml0ZXI6OlNjb3BlZEVsZW1lbnQgZSA9IG1feG1sLnNjb3BlZEVsZW1lbnQoICJPdmVyYWxsUmVzdWx0cyIgKTsKKyAgICAgICAgICAgICAgICBlLndyaXRlQXR0cmlidXRlKCAic3VjY2Vzc2VzIiwgc2VjdGlvblN0YXRzLmFzc2VydGlvbnMucGFzc2VkICk7CisgICAgICAgICAgICAgICAgZS53cml0ZUF0dHJpYnV0ZSggImZhaWx1cmVzIiwgc2VjdGlvblN0YXRzLmFzc2VydGlvbnMuZmFpbGVkICk7CisgICAgICAgICAgICAgICAgZS53cml0ZUF0dHJpYnV0ZSggImV4cGVjdGVkRmFpbHVyZXMiLCBzZWN0aW9uU3RhdHMuYXNzZXJ0aW9ucy5mYWlsZWRCdXRPayApOworCisgICAgICAgICAgICAgICAgaWYgKCBtX2NvbmZpZy0+c2hvd0R1cmF0aW9ucygpID09IFNob3dEdXJhdGlvbnM6OkFsd2F5cyApCisgICAgICAgICAgICAgICAgICAgIGUud3JpdGVBdHRyaWJ1dGUoICJkdXJhdGlvbkluU2Vjb25kcyIsIHNlY3Rpb25TdGF0cy5kdXJhdGlvbkluU2Vjb25kcyApOworCisgICAgICAgICAgICAgICAgbV94bWwuZW5kRWxlbWVudCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RDYXNlRW5kZWQoIFRlc3RDYXNlU3RhdHMgY29uc3QmIHRlc3RDYXNlU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2U6OnRlc3RDYXNlRW5kZWQoIHRlc3RDYXNlU3RhdHMgKTsKKyAgICAgICAgICAgIFhtbFdyaXRlcjo6U2NvcGVkRWxlbWVudCBlID0gbV94bWwuc2NvcGVkRWxlbWVudCggIk92ZXJhbGxSZXN1bHQiICk7CisgICAgICAgICAgICBlLndyaXRlQXR0cmlidXRlKCAic3VjY2VzcyIsIHRlc3RDYXNlU3RhdHMudG90YWxzLmFzc2VydGlvbnMuYWxsT2soKSApOworCisgICAgICAgICAgICBpZiAoIG1fY29uZmlnLT5zaG93RHVyYXRpb25zKCkgPT0gU2hvd0R1cmF0aW9uczo6QWx3YXlzICkKKyAgICAgICAgICAgICAgICBlLndyaXRlQXR0cmlidXRlKCAiZHVyYXRpb25JblNlY29uZHMiLCBtX3Rlc3RDYXNlVGltZXIuZ2V0RWxhcHNlZFNlY29uZHMoKSApOworCisgICAgICAgICAgICBpZiggIXRlc3RDYXNlU3RhdHMuc3RkT3V0LmVtcHR5KCkgKQorICAgICAgICAgICAgICAgIG1feG1sLnNjb3BlZEVsZW1lbnQoICJTdGRPdXQiICkud3JpdGVUZXh0KCB0cmltKCB0ZXN0Q2FzZVN0YXRzLnN0ZE91dCApLCBmYWxzZSApOworICAgICAgICAgICAgaWYoICF0ZXN0Q2FzZVN0YXRzLnN0ZEVyci5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICBtX3htbC5zY29wZWRFbGVtZW50KCAiU3RkRXJyIiApLndyaXRlVGV4dCggdHJpbSggdGVzdENhc2VTdGF0cy5zdGRFcnIgKSwgZmFsc2UgKTsKKworICAgICAgICAgICAgbV94bWwuZW5kRWxlbWVudCgpOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RHcm91cEVuZGVkKCBUZXN0R3JvdXBTdGF0cyBjb25zdCYgdGVzdEdyb3VwU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2U6OnRlc3RHcm91cEVuZGVkKCB0ZXN0R3JvdXBTdGF0cyApOworICAgICAgICAgICAgLy8gVE9ETzogQ2hlY2sgdGVzdEdyb3VwU3RhdHMuYWJvcnRpbmcgYW5kIGFjdCBhY2NvcmRpbmdseS4KKyAgICAgICAgICAgIG1feG1sLnNjb3BlZEVsZW1lbnQoICJPdmVyYWxsUmVzdWx0cyIgKQorICAgICAgICAgICAgICAgIC53cml0ZUF0dHJpYnV0ZSggInN1Y2Nlc3NlcyIsIHRlc3RHcm91cFN0YXRzLnRvdGFscy5hc3NlcnRpb25zLnBhc3NlZCApCisgICAgICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCAiZmFpbHVyZXMiLCB0ZXN0R3JvdXBTdGF0cy50b3RhbHMuYXNzZXJ0aW9ucy5mYWlsZWQgKQorICAgICAgICAgICAgICAgIC53cml0ZUF0dHJpYnV0ZSggImV4cGVjdGVkRmFpbHVyZXMiLCB0ZXN0R3JvdXBTdGF0cy50b3RhbHMuYXNzZXJ0aW9ucy5mYWlsZWRCdXRPayApOworICAgICAgICAgICAgbV94bWwuZW5kRWxlbWVudCgpOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RSdW5FbmRlZCggVGVzdFJ1blN0YXRzIGNvbnN0JiB0ZXN0UnVuU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2U6OnRlc3RSdW5FbmRlZCggdGVzdFJ1blN0YXRzICk7CisgICAgICAgICAgICBtX3htbC5zY29wZWRFbGVtZW50KCAiT3ZlcmFsbFJlc3VsdHMiICkKKyAgICAgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJzdWNjZXNzZXMiLCB0ZXN0UnVuU3RhdHMudG90YWxzLmFzc2VydGlvbnMucGFzc2VkICkKKyAgICAgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJmYWlsdXJlcyIsIHRlc3RSdW5TdGF0cy50b3RhbHMuYXNzZXJ0aW9ucy5mYWlsZWQgKQorICAgICAgICAgICAgICAgIC53cml0ZUF0dHJpYnV0ZSggImV4cGVjdGVkRmFpbHVyZXMiLCB0ZXN0UnVuU3RhdHMudG90YWxzLmFzc2VydGlvbnMuZmFpbGVkQnV0T2sgKTsKKyAgICAgICAgICAgIG1feG1sLmVuZEVsZW1lbnQoKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgVGltZXIgbV90ZXN0Q2FzZVRpbWVyOworICAgICAgICBYbWxXcml0ZXIgbV94bWw7CisgICAgICAgIGludCBtX3NlY3Rpb25EZXB0aDsKKyAgICB9OworCisgICAgIElOVEVSTkFMX0NBVENIX1JFR0lTVEVSX1JFUE9SVEVSKCAieG1sIiwgWG1sUmVwb3J0ZXIgKQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IC4uL3JlcG9ydGVycy9jYXRjaF9yZXBvcnRlcl9qdW5pdC5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1JFUE9SVEVSX0pVTklUX0hQUF9JTkNMVURFRAorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBuYW1lc3BhY2UgeworICAgICAgICBzdGQ6OnN0cmluZyBnZXRDdXJyZW50VGltZXN0YW1wKCkgeworICAgICAgICAgICAgLy8gQmV3YXJlLCB0aGlzIGlzIG5vdCByZWVudHJhbnQgYmVjYXVzZSBvZiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGlzc3VlcworICAgICAgICAgICAgLy8gQWxzbywgVVRDIG9ubHksIGFnYWluIGJlY2F1c2Ugb2YgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAoJXogaXMgQysrMTEpCisgICAgICAgICAgICB0aW1lX3QgcmF3dGltZTsKKyAgICAgICAgICAgIHN0ZDo6dGltZSgmcmF3dGltZSk7CisgICAgICAgICAgICBjb25zdCBzaXplX3QgdGltZVN0YW1wU2l6ZSA9IHNpemVvZigiMjAxNy0wMS0xNlQxNzowNjo0NVoiKTsKKworI2lmZGVmIF9NU0NfVkVSCisgICAgICAgICAgICBzdGQ6OnRtIHRpbWVJbmZvID0ge307CisgICAgICAgICAgICBnbXRpbWVfcygmdGltZUluZm8sICZyYXd0aW1lKTsKKyNlbHNlCisgICAgICAgICAgICBzdGQ6OnRtKiB0aW1lSW5mbzsKKyAgICAgICAgICAgIHRpbWVJbmZvID0gc3RkOjpnbXRpbWUoJnJhd3RpbWUpOworI2VuZGlmCisKKyAgICAgICAgICAgIGNoYXIgdGltZVN0YW1wW3RpbWVTdGFtcFNpemVdOworICAgICAgICAgICAgY29uc3QgY2hhciAqIGNvbnN0IGZtdCA9ICIlWS0lbS0lZFQlSDolTTolU1oiOworCisjaWZkZWYgX01TQ19WRVIKKyAgICAgICAgICAgIHN0ZDo6c3RyZnRpbWUodGltZVN0YW1wLCB0aW1lU3RhbXBTaXplLCBmbXQsICZ0aW1lSW5mbyk7CisjZWxzZQorICAgICAgICAgICAgc3RkOjpzdHJmdGltZSh0aW1lU3RhbXAsIHRpbWVTdGFtcFNpemUsIGZtdCwgdGltZUluZm8pOworI2VuZGlmCisgICAgICAgICAgICByZXR1cm4gc3RkOjpzdHJpbmcodGltZVN0YW1wKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgY2xhc3MgSnVuaXRSZXBvcnRlciA6IHB1YmxpYyBDdW11bGF0aXZlUmVwb3J0ZXJCYXNlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIEp1bml0UmVwb3J0ZXIoIFJlcG9ydGVyQ29uZmlnIGNvbnN0JiBfY29uZmlnICkKKyAgICAgICAgOiAgIEN1bXVsYXRpdmVSZXBvcnRlckJhc2UoIF9jb25maWcgKSwKKyAgICAgICAgICAgIHhtbCggX2NvbmZpZy5zdHJlYW0oKSApLAorICAgICAgICAgICAgbV9va1RvRmFpbCggZmFsc2UgKQorICAgICAgICB7CisgICAgICAgICAgICBtX3JlcG9ydGVyUHJlZnMuc2hvdWxkUmVkaXJlY3RTdGRPdXQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB+SnVuaXRSZXBvcnRlcigpIENBVENIX09WRVJSSURFOworCisgICAgICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiAiUmVwb3J0cyB0ZXN0IHJlc3VsdHMgaW4gYW4gWE1MIGZvcm1hdCB0aGF0IGxvb2tzIGxpa2UgQW50J3MganVuaXRyZXBvcnQgdGFyZ2V0IjsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBub01hdGNoaW5nVGVzdENhc2VzKCBzdGQ6OnN0cmluZyBjb25zdCYgLypzcGVjKi8gKSBDQVRDSF9PVkVSUklERSB7fQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0UnVuU3RhcnRpbmcoIFRlc3RSdW5JbmZvIGNvbnN0JiBydW5JbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgQ3VtdWxhdGl2ZVJlcG9ydGVyQmFzZTo6dGVzdFJ1blN0YXJ0aW5nKCBydW5JbmZvICk7CisgICAgICAgICAgICB4bWwuc3RhcnRFbGVtZW50KCAidGVzdHN1aXRlcyIgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0R3JvdXBTdGFydGluZyggR3JvdXBJbmZvIGNvbnN0JiBncm91cEluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBzdWl0ZVRpbWVyLnN0YXJ0KCk7CisgICAgICAgICAgICBzdGRPdXRGb3JTdWl0ZS5zdHIoIiIpOworICAgICAgICAgICAgc3RkRXJyRm9yU3VpdGUuc3RyKCIiKTsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb25zID0gMDsKKyAgICAgICAgICAgIEN1bXVsYXRpdmVSZXBvcnRlckJhc2U6OnRlc3RHcm91cFN0YXJ0aW5nKCBncm91cEluZm8gKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0Q2FzZVN0YXJ0aW5nKCBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RDYXNlSW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIG1fb2tUb0ZhaWwgPSB0ZXN0Q2FzZUluZm8ub2tUb0ZhaWwoKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIGJvb2wgYXNzZXJ0aW9uRW5kZWQoIEFzc2VydGlvblN0YXRzIGNvbnN0JiBhc3NlcnRpb25TdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIGlmKCBhc3NlcnRpb25TdGF0cy5hc3NlcnRpb25SZXN1bHQuZ2V0UmVzdWx0VHlwZSgpID09IFJlc3VsdFdhczo6VGhyZXdFeGNlcHRpb24gJiYgIW1fb2tUb0ZhaWwgKQorICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb25zKys7CisgICAgICAgICAgICByZXR1cm4gQ3VtdWxhdGl2ZVJlcG9ydGVyQmFzZTo6YXNzZXJ0aW9uRW5kZWQoIGFzc2VydGlvblN0YXRzICk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdENhc2VFbmRlZCggVGVzdENhc2VTdGF0cyBjb25zdCYgdGVzdENhc2VTdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIHN0ZE91dEZvclN1aXRlIDw8IHRlc3RDYXNlU3RhdHMuc3RkT3V0OworICAgICAgICAgICAgc3RkRXJyRm9yU3VpdGUgPDwgdGVzdENhc2VTdGF0cy5zdGRFcnI7CisgICAgICAgICAgICBDdW11bGF0aXZlUmVwb3J0ZXJCYXNlOjp0ZXN0Q2FzZUVuZGVkKCB0ZXN0Q2FzZVN0YXRzICk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdEdyb3VwRW5kZWQoIFRlc3RHcm91cFN0YXRzIGNvbnN0JiB0ZXN0R3JvdXBTdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIGRvdWJsZSBzdWl0ZVRpbWUgPSBzdWl0ZVRpbWVyLmdldEVsYXBzZWRTZWNvbmRzKCk7CisgICAgICAgICAgICBDdW11bGF0aXZlUmVwb3J0ZXJCYXNlOjp0ZXN0R3JvdXBFbmRlZCggdGVzdEdyb3VwU3RhdHMgKTsKKyAgICAgICAgICAgIHdyaXRlR3JvdXAoICptX3Rlc3RHcm91cHMuYmFjaygpLCBzdWl0ZVRpbWUgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0UnVuRW5kZWRDdW11bGF0aXZlKCkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgeG1sLmVuZEVsZW1lbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgd3JpdGVHcm91cCggVGVzdEdyb3VwTm9kZSBjb25zdCYgZ3JvdXBOb2RlLCBkb3VibGUgc3VpdGVUaW1lICkgeworICAgICAgICAgICAgWG1sV3JpdGVyOjpTY29wZWRFbGVtZW50IGUgPSB4bWwuc2NvcGVkRWxlbWVudCggInRlc3RzdWl0ZSIgKTsKKyAgICAgICAgICAgIFRlc3RHcm91cFN0YXRzIGNvbnN0JiBzdGF0cyA9IGdyb3VwTm9kZS52YWx1ZTsKKyAgICAgICAgICAgIHhtbC53cml0ZUF0dHJpYnV0ZSggIm5hbWUiLCBzdGF0cy5ncm91cEluZm8ubmFtZSApOworICAgICAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKCAiZXJyb3JzIiwgdW5leHBlY3RlZEV4Y2VwdGlvbnMgKTsKKyAgICAgICAgICAgIHhtbC53cml0ZUF0dHJpYnV0ZSggImZhaWx1cmVzIiwgc3RhdHMudG90YWxzLmFzc2VydGlvbnMuZmFpbGVkLXVuZXhwZWN0ZWRFeGNlcHRpb25zICk7CisgICAgICAgICAgICB4bWwud3JpdGVBdHRyaWJ1dGUoICJ0ZXN0cyIsIHN0YXRzLnRvdGFscy5hc3NlcnRpb25zLnRvdGFsKCkgKTsKKyAgICAgICAgICAgIHhtbC53cml0ZUF0dHJpYnV0ZSggImhvc3RuYW1lIiwgInRiZCIgKTsgLy8gIVRCRAorICAgICAgICAgICAgaWYoIG1fY29uZmlnLT5zaG93RHVyYXRpb25zKCkgPT0gU2hvd0R1cmF0aW9uczo6TmV2ZXIgKQorICAgICAgICAgICAgICAgIHhtbC53cml0ZUF0dHJpYnV0ZSggInRpbWUiLCAiIiApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHhtbC53cml0ZUF0dHJpYnV0ZSggInRpbWUiLCBzdWl0ZVRpbWUgKTsKKyAgICAgICAgICAgIHhtbC53cml0ZUF0dHJpYnV0ZSggInRpbWVzdGFtcCIsIGdldEN1cnJlbnRUaW1lc3RhbXAoKSApOworCisgICAgICAgICAgICAvLyBXcml0ZSB0ZXN0IGNhc2VzCisgICAgICAgICAgICBmb3IoIFRlc3RHcm91cE5vZGU6OkNoaWxkTm9kZXM6OmNvbnN0X2l0ZXJhdG9yCisgICAgICAgICAgICAgICAgICAgIGl0ID0gZ3JvdXBOb2RlLmNoaWxkcmVuLmJlZ2luKCksIGl0RW5kID0gZ3JvdXBOb2RlLmNoaWxkcmVuLmVuZCgpOworICAgICAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICAgICAgd3JpdGVUZXN0Q2FzZSggKippdCApOworCisgICAgICAgICAgICB4bWwuc2NvcGVkRWxlbWVudCggInN5c3RlbS1vdXQiICkud3JpdGVUZXh0KCB0cmltKCBzdGRPdXRGb3JTdWl0ZS5zdHIoKSApLCBmYWxzZSApOworICAgICAgICAgICAgeG1sLnNjb3BlZEVsZW1lbnQoICJzeXN0ZW0tZXJyIiApLndyaXRlVGV4dCggdHJpbSggc3RkRXJyRm9yU3VpdGUuc3RyKCkgKSwgZmFsc2UgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgd3JpdGVUZXN0Q2FzZSggVGVzdENhc2VOb2RlIGNvbnN0JiB0ZXN0Q2FzZU5vZGUgKSB7CisgICAgICAgICAgICBUZXN0Q2FzZVN0YXRzIGNvbnN0JiBzdGF0cyA9IHRlc3RDYXNlTm9kZS52YWx1ZTsKKworICAgICAgICAgICAgLy8gQWxsIHRlc3QgY2FzZXMgaGF2ZSBleGFjdGx5IG9uZSBzZWN0aW9uIC0gd2hpY2ggcmVwcmVzZW50cyB0aGUKKyAgICAgICAgICAgIC8vIHRlc3QgY2FzZSBpdHNlbGYuIFRoYXQgc2VjdGlvbiBtYXkgaGF2ZSAwLW4gbmVzdGVkIHNlY3Rpb25zCisgICAgICAgICAgICBhc3NlcnQoIHRlc3RDYXNlTm9kZS5jaGlsZHJlbi5zaXplKCkgPT0gMSApOworICAgICAgICAgICAgU2VjdGlvbk5vZGUgY29uc3QmIHJvb3RTZWN0aW9uID0gKnRlc3RDYXNlTm9kZS5jaGlsZHJlbi5mcm9udCgpOworCisgICAgICAgICAgICBzdGQ6OnN0cmluZyBjbGFzc05hbWUgPSBzdGF0cy50ZXN0SW5mby5jbGFzc05hbWU7CisKKyAgICAgICAgICAgIGlmKCBjbGFzc05hbWUuZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICBpZiggcm9vdFNlY3Rpb24uY2hpbGRTZWN0aW9ucy5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gImdsb2JhbCI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3cml0ZVNlY3Rpb24oIGNsYXNzTmFtZSwgIiIsIHJvb3RTZWN0aW9uICk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHdyaXRlU2VjdGlvbiggIHN0ZDo6c3RyaW5nIGNvbnN0JiBjbGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIHJvb3ROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlY3Rpb25Ob2RlIGNvbnN0JiBzZWN0aW9uTm9kZSApIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSB0cmltKCBzZWN0aW9uTm9kZS5zdGF0cy5zZWN0aW9uSW5mby5uYW1lICk7CisgICAgICAgICAgICBpZiggIXJvb3ROYW1lLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgIG5hbWUgPSByb290TmFtZSArICcvJyArIG5hbWU7CisKKyAgICAgICAgICAgIGlmKCAhc2VjdGlvbk5vZGUuYXNzZXJ0aW9ucy5lbXB0eSgpIHx8CisgICAgICAgICAgICAgICAgIXNlY3Rpb25Ob2RlLnN0ZE91dC5lbXB0eSgpIHx8CisgICAgICAgICAgICAgICAgIXNlY3Rpb25Ob2RlLnN0ZEVyci5lbXB0eSgpICkgeworICAgICAgICAgICAgICAgIFhtbFdyaXRlcjo6U2NvcGVkRWxlbWVudCBlID0geG1sLnNjb3BlZEVsZW1lbnQoICJ0ZXN0Y2FzZSIgKTsKKyAgICAgICAgICAgICAgICBpZiggY2xhc3NOYW1lLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAgICAgICAgIHhtbC53cml0ZUF0dHJpYnV0ZSggImNsYXNzbmFtZSIsIG5hbWUgKTsKKyAgICAgICAgICAgICAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKCAibmFtZSIsICJyb290IiApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKCAiY2xhc3NuYW1lIiwgY2xhc3NOYW1lICk7CisgICAgICAgICAgICAgICAgICAgIHhtbC53cml0ZUF0dHJpYnV0ZSggIm5hbWUiLCBuYW1lICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHhtbC53cml0ZUF0dHJpYnV0ZSggInRpbWUiLCBDYXRjaDo6dG9TdHJpbmcoIHNlY3Rpb25Ob2RlLnN0YXRzLmR1cmF0aW9uSW5TZWNvbmRzICkgKTsKKworICAgICAgICAgICAgICAgIHdyaXRlQXNzZXJ0aW9ucyggc2VjdGlvbk5vZGUgKTsKKworICAgICAgICAgICAgICAgIGlmKCAhc2VjdGlvbk5vZGUuc3RkT3V0LmVtcHR5KCkgKQorICAgICAgICAgICAgICAgICAgICB4bWwuc2NvcGVkRWxlbWVudCggInN5c3RlbS1vdXQiICkud3JpdGVUZXh0KCB0cmltKCBzZWN0aW9uTm9kZS5zdGRPdXQgKSwgZmFsc2UgKTsKKyAgICAgICAgICAgICAgICBpZiggIXNlY3Rpb25Ob2RlLnN0ZEVyci5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICAgICAgeG1sLnNjb3BlZEVsZW1lbnQoICJzeXN0ZW0tZXJyIiApLndyaXRlVGV4dCggdHJpbSggc2VjdGlvbk5vZGUuc3RkRXJyICksIGZhbHNlICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IoIFNlY3Rpb25Ob2RlOjpDaGlsZFNlY3Rpb25zOjpjb25zdF9pdGVyYXRvcgorICAgICAgICAgICAgICAgICAgICBpdCA9IHNlY3Rpb25Ob2RlLmNoaWxkU2VjdGlvbnMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgaXRFbmQgPSBzZWN0aW9uTm9kZS5jaGlsZFNlY3Rpb25zLmVuZCgpOworICAgICAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICAgICAgaWYoIGNsYXNzTmFtZS5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVTZWN0aW9uKCBuYW1lLCAiIiwgKippdCApOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVTZWN0aW9uKCBjbGFzc05hbWUsIG5hbWUsICoqaXQgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgd3JpdGVBc3NlcnRpb25zKCBTZWN0aW9uTm9kZSBjb25zdCYgc2VjdGlvbk5vZGUgKSB7CisgICAgICAgICAgICBmb3IoIFNlY3Rpb25Ob2RlOjpBc3NlcnRpb25zOjpjb25zdF9pdGVyYXRvcgorICAgICAgICAgICAgICAgICAgICBpdCA9IHNlY3Rpb25Ob2RlLmFzc2VydGlvbnMuYmVnaW4oKSwgaXRFbmQgPSBzZWN0aW9uTm9kZS5hc3NlcnRpb25zLmVuZCgpOworICAgICAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICAgICAgd3JpdGVBc3NlcnRpb24oICppdCApOworICAgICAgICB9CisgICAgICAgIHZvaWQgd3JpdGVBc3NlcnRpb24oIEFzc2VydGlvblN0YXRzIGNvbnN0JiBzdGF0cyApIHsKKyAgICAgICAgICAgIEFzc2VydGlvblJlc3VsdCBjb25zdCYgcmVzdWx0ID0gc3RhdHMuYXNzZXJ0aW9uUmVzdWx0OworICAgICAgICAgICAgaWYoICFyZXN1bHQuaXNPaygpICkgeworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGVsZW1lbnROYW1lOworICAgICAgICAgICAgICAgIHN3aXRjaCggcmVzdWx0LmdldFJlc3VsdFR5cGUoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OlRocmV3RXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6RmF0YWxFcnJvckNvbmRpdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnROYW1lID0gImVycm9yIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6RXhwbGljaXRGYWlsdXJlOgorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudE5hbWUgPSAiZmFpbHVyZSI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkV4cHJlc3Npb25GYWlsZWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TmFtZSA9ICJmYWlsdXJlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6RGlkbnRUaHJvd0V4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnROYW1lID0gImZhaWx1cmUiOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIG5ldmVyIHNlZSB0aGVzZSBoZXJlOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6SW5mbzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6Oldhcm5pbmc6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpPazoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OlVua25vd246CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpGYWlsdXJlQml0OgorICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6RXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudE5hbWUgPSAiaW50ZXJuYWxFcnJvciI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBYbWxXcml0ZXI6OlNjb3BlZEVsZW1lbnQgZSA9IHhtbC5zY29wZWRFbGVtZW50KCBlbGVtZW50TmFtZSApOworCisgICAgICAgICAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKCAibWVzc2FnZSIsIHJlc3VsdC5nZXRFeHBhbmRlZEV4cHJlc3Npb24oKSApOworICAgICAgICAgICAgICAgIHhtbC53cml0ZUF0dHJpYnV0ZSggInR5cGUiLCByZXN1bHQuZ2V0VGVzdE1hY3JvTmFtZSgpICk7CisKKyAgICAgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICAgICAgICAgIGlmKCAhcmVzdWx0LmdldE1lc3NhZ2UoKS5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICAgICAgb3NzIDw8IHJlc3VsdC5nZXRNZXNzYWdlKCkgPDwgJ1xuJzsKKyAgICAgICAgICAgICAgICBmb3IoIHN0ZDo6dmVjdG9yPE1lc3NhZ2VJbmZvPjo6Y29uc3RfaXRlcmF0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0ID0gc3RhdHMuaW5mb01lc3NhZ2VzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICBpdEVuZCA9IHN0YXRzLmluZm9NZXNzYWdlcy5lbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgICAgICAgICAgaWYoIGl0LT50eXBlID09IFJlc3VsdFdhczo6SW5mbyApCisgICAgICAgICAgICAgICAgICAgICAgICBvc3MgPDwgaXQtPm1lc3NhZ2UgPDwgJ1xuJzsKKworICAgICAgICAgICAgICAgIG9zcyA8PCAiYXQgIiA8PCByZXN1bHQuZ2V0U291cmNlSW5mbygpOworICAgICAgICAgICAgICAgIHhtbC53cml0ZVRleHQoIG9zcy5zdHIoKSwgZmFsc2UgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFhtbFdyaXRlciB4bWw7CisgICAgICAgIFRpbWVyIHN1aXRlVGltZXI7CisgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzdGRPdXRGb3JTdWl0ZTsKKyAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIHN0ZEVyckZvclN1aXRlOworICAgICAgICB1bnNpZ25lZCBpbnQgdW5leHBlY3RlZEV4Y2VwdGlvbnM7CisgICAgICAgIGJvb2wgbV9va1RvRmFpbDsKKyAgICB9OworCisgICAgSU5URVJOQUxfQ0FUQ0hfUkVHSVNURVJfUkVQT1JURVIoICJqdW5pdCIsIEp1bml0UmVwb3J0ZXIgKQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IC4uL3JlcG9ydGVycy9jYXRjaF9yZXBvcnRlcl9jb25zb2xlLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfUkVQT1JURVJfQ09OU09MRV9IUFBfSU5DTFVERUQKKworI2luY2x1ZGUgPGNmbG9hdD4KKyNpbmNsdWRlIDxjc3RkaW8+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdHJ1Y3QgQ29uc29sZVJlcG9ydGVyIDogU3RyZWFtaW5nUmVwb3J0ZXJCYXNlIHsKKyAgICAgICAgQ29uc29sZVJlcG9ydGVyKCBSZXBvcnRlckNvbmZpZyBjb25zdCYgX2NvbmZpZyApCisgICAgICAgIDogICBTdHJlYW1pbmdSZXBvcnRlckJhc2UoIF9jb25maWcgKSwKKyAgICAgICAgICAgIG1faGVhZGVyUHJpbnRlZCggZmFsc2UgKQorICAgICAgICB7fQorCisgICAgICAgIHZpcnR1YWwgfkNvbnNvbGVSZXBvcnRlcigpIENBVENIX09WRVJSSURFOworICAgICAgICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gIlJlcG9ydHMgdGVzdCByZXN1bHRzIGFzIHBsYWluIGxpbmVzIG9mIHRleHQiOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIG5vTWF0Y2hpbmdUZXN0Q2FzZXMoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzcGVjICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgc3RyZWFtIDw8ICJObyB0ZXN0IGNhc2VzIG1hdGNoZWQgJyIgPDwgc3BlYyA8PCAnXCcnIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBhc3NlcnRpb25TdGFydGluZyggQXNzZXJ0aW9uSW5mbyBjb25zdCYgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIGJvb2wgYXNzZXJ0aW9uRW5kZWQoIEFzc2VydGlvblN0YXRzIGNvbnN0JiBfYXNzZXJ0aW9uU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBBc3NlcnRpb25SZXN1bHQgY29uc3QmIHJlc3VsdCA9IF9hc3NlcnRpb25TdGF0cy5hc3NlcnRpb25SZXN1bHQ7CisKKyAgICAgICAgICAgIGJvb2wgaW5jbHVkZVJlc3VsdHMgPSBtX2NvbmZpZy0+aW5jbHVkZVN1Y2Nlc3NmdWxSZXN1bHRzKCkgfHwgIXJlc3VsdC5pc09rKCk7CisKKyAgICAgICAgICAgIC8vIERyb3Agb3V0IGlmIHJlc3VsdCB3YXMgc3VjY2Vzc2Z1bCBidXQgd2UncmUgbm90IHByaW50aW5nIHRoZW0uCisgICAgICAgICAgICBpZiggIWluY2x1ZGVSZXN1bHRzICYmIHJlc3VsdC5nZXRSZXN1bHRUeXBlKCkgIT0gUmVzdWx0V2FzOjpXYXJuaW5nICkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgIGxhenlQcmludCgpOworCisgICAgICAgICAgICBBc3NlcnRpb25QcmludGVyIHByaW50ZXIoIHN0cmVhbSwgX2Fzc2VydGlvblN0YXRzLCBpbmNsdWRlUmVzdWx0cyApOworICAgICAgICAgICAgcHJpbnRlci5wcmludCgpOworICAgICAgICAgICAgc3RyZWFtIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHNlY3Rpb25TdGFydGluZyggU2VjdGlvbkluZm8gY29uc3QmIF9zZWN0aW9uSW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIG1faGVhZGVyUHJpbnRlZCA9IGZhbHNlOworICAgICAgICAgICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlOjpzZWN0aW9uU3RhcnRpbmcoIF9zZWN0aW9uSW5mbyApOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uRW5kZWQoIFNlY3Rpb25TdGF0cyBjb25zdCYgX3NlY3Rpb25TdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIGlmKCBfc2VjdGlvblN0YXRzLm1pc3NpbmdBc3NlcnRpb25zICkgeworICAgICAgICAgICAgICAgIGxhenlQcmludCgpOworICAgICAgICAgICAgICAgIENvbG91ciBjb2xvdXIoIENvbG91cjo6UmVzdWx0RXJyb3IgKTsKKyAgICAgICAgICAgICAgICBpZiggbV9zZWN0aW9uU3RhY2suc2l6ZSgpID4gMSApCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAiXG5ObyBhc3NlcnRpb25zIGluIHNlY3Rpb24iOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICJcbk5vIGFzc2VydGlvbnMgaW4gdGVzdCBjYXNlIjsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwgIiAnIiA8PCBfc2VjdGlvblN0YXRzLnNlY3Rpb25JbmZvLm5hbWUgPDwgIidcbiIgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoIG1fY29uZmlnLT5zaG93RHVyYXRpb25zKCkgPT0gU2hvd0R1cmF0aW9uczo6QWx3YXlzICkgeworICAgICAgICAgICAgICAgIHN0cmVhbSA8PCBnZXRGb3JtYXR0ZWREdXJhdGlvbihfc2VjdGlvblN0YXRzLmR1cmF0aW9uSW5TZWNvbmRzKSA8PCAiIHM6ICIgPDwgX3NlY3Rpb25TdGF0cy5zZWN0aW9uSW5mby5uYW1lIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCBtX2hlYWRlclByaW50ZWQgKSB7CisgICAgICAgICAgICAgICAgbV9oZWFkZXJQcmludGVkID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2U6OnNlY3Rpb25FbmRlZCggX3NlY3Rpb25TdGF0cyApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RDYXNlRW5kZWQoIFRlc3RDYXNlU3RhdHMgY29uc3QmIF90ZXN0Q2FzZVN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlOjp0ZXN0Q2FzZUVuZGVkKCBfdGVzdENhc2VTdGF0cyApOworICAgICAgICAgICAgbV9oZWFkZXJQcmludGVkID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RHcm91cEVuZGVkKCBUZXN0R3JvdXBTdGF0cyBjb25zdCYgX3Rlc3RHcm91cFN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgaWYoIGN1cnJlbnRHcm91cEluZm8udXNlZCApIHsKKyAgICAgICAgICAgICAgICBwcmludFN1bW1hcnlEaXZpZGVyKCk7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICJTdW1tYXJ5IGZvciBncm91cCAnIiA8PCBfdGVzdEdyb3VwU3RhdHMuZ3JvdXBJbmZvLm5hbWUgPDwgIic6XG4iOworICAgICAgICAgICAgICAgIHByaW50VG90YWxzKCBfdGVzdEdyb3VwU3RhdHMudG90YWxzICk7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICdcbicgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlOjp0ZXN0R3JvdXBFbmRlZCggX3Rlc3RHcm91cFN0YXRzICk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RSdW5FbmRlZCggVGVzdFJ1blN0YXRzIGNvbnN0JiBfdGVzdFJ1blN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgcHJpbnRUb3RhbHNEaXZpZGVyKCBfdGVzdFJ1blN0YXRzLnRvdGFscyApOworICAgICAgICAgICAgcHJpbnRUb3RhbHMoIF90ZXN0UnVuU3RhdHMudG90YWxzICk7CisgICAgICAgICAgICBzdHJlYW0gPDwgc3RkOjplbmRsOworICAgICAgICAgICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlOjp0ZXN0UnVuRW5kZWQoIF90ZXN0UnVuU3RhdHMgKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKworICAgICAgICBjbGFzcyBBc3NlcnRpb25QcmludGVyIHsKKyAgICAgICAgICAgIHZvaWQgb3BlcmF0b3I9ICggQXNzZXJ0aW9uUHJpbnRlciBjb25zdCYgKTsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgQXNzZXJ0aW9uUHJpbnRlciggc3RkOjpvc3RyZWFtJiBfc3RyZWFtLCBBc3NlcnRpb25TdGF0cyBjb25zdCYgX3N0YXRzLCBib29sIF9wcmludEluZm9NZXNzYWdlcyApCisgICAgICAgICAgICA6ICAgc3RyZWFtKCBfc3RyZWFtICksCisgICAgICAgICAgICAgICAgc3RhdHMoIF9zdGF0cyApLAorICAgICAgICAgICAgICAgIHJlc3VsdCggX3N0YXRzLmFzc2VydGlvblJlc3VsdCApLAorICAgICAgICAgICAgICAgIGNvbG91ciggQ29sb3VyOjpOb25lICksCisgICAgICAgICAgICAgICAgbWVzc2FnZSggcmVzdWx0LmdldE1lc3NhZ2UoKSApLAorICAgICAgICAgICAgICAgIG1lc3NhZ2VzKCBfc3RhdHMuaW5mb01lc3NhZ2VzICksCisgICAgICAgICAgICAgICAgcHJpbnRJbmZvTWVzc2FnZXMoIF9wcmludEluZm9NZXNzYWdlcyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoKCByZXN1bHQuZ2V0UmVzdWx0VHlwZSgpICkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6T2s6CisgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSBDb2xvdXI6OlN1Y2Nlc3M7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzT3JGYWlsID0gIlBBU1NFRCI7CisgICAgICAgICAgICAgICAgICAgICAgICAvL2lmKCByZXN1bHQuaGFzTWVzc2FnZSgpICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBfc3RhdHMuaW5mb01lc3NhZ2VzLnNpemUoKSA9PSAxICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlTGFiZWwgPSAid2l0aCBtZXNzYWdlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBfc3RhdHMuaW5mb01lc3NhZ2VzLnNpemUoKSA+IDEgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VMYWJlbCA9ICJ3aXRoIG1lc3NhZ2VzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6RXhwcmVzc2lvbkZhaWxlZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCByZXN1bHQuaXNPaygpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9IENvbG91cjo6U3VjY2VzczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzT3JGYWlsID0gIkZBSUxFRCAtIGJ1dCB3YXMgb2siOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gQ29sb3VyOjpFcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzT3JGYWlsID0gIkZBSUxFRCI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggX3N0YXRzLmluZm9NZXNzYWdlcy5zaXplKCkgPT0gMSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUxhYmVsID0gIndpdGggbWVzc2FnZSI7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggX3N0YXRzLmluZm9NZXNzYWdlcy5zaXplKCkgPiAxICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlTGFiZWwgPSAid2l0aCBtZXNzYWdlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OlRocmV3RXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gQ29sb3VyOjpFcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NPckZhaWwgPSAiRkFJTEVEIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VMYWJlbCA9ICJkdWUgdG8gdW5leHBlY3RlZCBleGNlcHRpb24gd2l0aCAiOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9zdGF0cy5pbmZvTWVzc2FnZXMuc2l6ZSgpID09IDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUxhYmVsICs9ICJtZXNzYWdlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfc3RhdHMuaW5mb01lc3NhZ2VzLnNpemUoKSA+IDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUxhYmVsICs9ICJtZXNzYWdlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkZhdGFsRXJyb3JDb25kaXRpb246CisgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSBDb2xvdXI6OkVycm9yOworICAgICAgICAgICAgICAgICAgICAgICAgcGFzc09yRmFpbCA9ICJGQUlMRUQiOworICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUxhYmVsID0gImR1ZSB0byBhIGZhdGFsIGVycm9yIGNvbmRpdGlvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkRpZG50VGhyb3dFeGNlcHRpb246CisgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSBDb2xvdXI6OkVycm9yOworICAgICAgICAgICAgICAgICAgICAgICAgcGFzc09yRmFpbCA9ICJGQUlMRUQiOworICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUxhYmVsID0gImJlY2F1c2Ugbm8gZXhjZXB0aW9uIHdhcyB0aHJvd24gd2hlcmUgb25lIHdhcyBleHBlY3RlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkluZm86CisgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlTGFiZWwgPSAiaW5mbyI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6Oldhcm5pbmc6CisgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlTGFiZWwgPSAid2FybmluZyI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkV4cGxpY2l0RmFpbHVyZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NPckZhaWwgPSAiRkFJTEVEIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9IENvbG91cjo6RXJyb3I7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggX3N0YXRzLmluZm9NZXNzYWdlcy5zaXplKCkgPT0gMSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUxhYmVsID0gImV4cGxpY2l0bHkgd2l0aCBtZXNzYWdlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBfc3RhdHMuaW5mb01lc3NhZ2VzLnNpemUoKSA+IDEgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VMYWJlbCA9ICJleHBsaWNpdGx5IHdpdGggbWVzc2FnZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoZXNlIGNhc2VzIGFyZSBoZXJlIHRvIHByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OlVua25vd246CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpGYWlsdXJlQml0OgorICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6RXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICAgICAgICAgcGFzc09yRmFpbCA9ICIqKiBpbnRlcm5hbCBlcnJvciAqKiI7CisgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSBDb2xvdXI6OkVycm9yOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2b2lkIHByaW50KCkgY29uc3QgeworICAgICAgICAgICAgICAgIHByaW50U291cmNlSW5mbygpOworICAgICAgICAgICAgICAgIGlmKCBzdGF0cy50b3RhbHMuYXNzZXJ0aW9ucy50b3RhbCgpID4gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHJlc3VsdC5pc09rKCkgKQorICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICdcbic7CisgICAgICAgICAgICAgICAgICAgIHByaW50UmVzdWx0VHlwZSgpOworICAgICAgICAgICAgICAgICAgICBwcmludE9yaWdpbmFsRXhwcmVzc2lvbigpOworICAgICAgICAgICAgICAgICAgICBwcmludFJlY29uc3RydWN0ZWRFeHByZXNzaW9uKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgJ1xuJzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHJpbnRNZXNzYWdlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIHZvaWQgcHJpbnRSZXN1bHRUeXBlKCkgY29uc3QgeworICAgICAgICAgICAgICAgIGlmKCAhcGFzc09yRmFpbC5lbXB0eSgpICkgeworICAgICAgICAgICAgICAgICAgICBDb2xvdXIgY29sb3VyR3VhcmQoIGNvbG91ciApOworICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgcGFzc09yRmFpbCA8PCAiOlxuIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2b2lkIHByaW50T3JpZ2luYWxFeHByZXNzaW9uKCkgY29uc3QgeworICAgICAgICAgICAgICAgIGlmKCByZXN1bHQuaGFzRXhwcmVzc2lvbigpICkgeworICAgICAgICAgICAgICAgICAgICBDb2xvdXIgY29sb3VyR3VhcmQoIENvbG91cjo6T3JpZ2luYWxFeHByZXNzaW9uICk7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSAgPDwgIiAgIjsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8IHJlc3VsdC5nZXRFeHByZXNzaW9uSW5NYWNybygpOworICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgJ1xuJzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2b2lkIHByaW50UmVjb25zdHJ1Y3RlZEV4cHJlc3Npb24oKSBjb25zdCB7CisgICAgICAgICAgICAgICAgaWYoIHJlc3VsdC5oYXNFeHBhbmRlZEV4cHJlc3Npb24oKSApIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICJ3aXRoIGV4cGFuc2lvbjpcbiI7CisgICAgICAgICAgICAgICAgICAgIENvbG91ciBjb2xvdXJHdWFyZCggQ29sb3VyOjpSZWNvbnN0cnVjdGVkRXhwcmVzc2lvbiApOworICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgVGV4dCggcmVzdWx0LmdldEV4cGFuZGVkRXhwcmVzc2lvbigpLCBUZXh0QXR0cmlidXRlcygpLnNldEluZGVudCgyKSApIDw8ICdcbic7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdm9pZCBwcmludE1lc3NhZ2UoKSBjb25zdCB7CisgICAgICAgICAgICAgICAgaWYoICFtZXNzYWdlTGFiZWwuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCBtZXNzYWdlTGFiZWwgPDwgJzonIDw8ICdcbic7CisgICAgICAgICAgICAgICAgZm9yKCBzdGQ6OnZlY3RvcjxNZXNzYWdlSW5mbz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbWVzc2FnZXMuYmVnaW4oKSwgaXRFbmQgPSBtZXNzYWdlcy5lbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICAgICAgICAgKytpdCApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBhc3NlcnRpb24gaXMgYSB3YXJuaW5nIGlnbm9yZSBhbnkgSU5GTyBtZXNzYWdlcworICAgICAgICAgICAgICAgICAgICBpZiggcHJpbnRJbmZvTWVzc2FnZXMgfHwgaXQtPnR5cGUgIT0gUmVzdWx0V2FzOjpJbmZvICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCBUZXh0KCBpdC0+bWVzc2FnZSwgVGV4dEF0dHJpYnV0ZXMoKS5zZXRJbmRlbnQoMikgKSA8PCAnXG4nOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZvaWQgcHJpbnRTb3VyY2VJbmZvKCkgY29uc3QgeworICAgICAgICAgICAgICAgIENvbG91ciBjb2xvdXJHdWFyZCggQ29sb3VyOjpGaWxlTmFtZSApOworICAgICAgICAgICAgICAgIHN0cmVhbSA8PCByZXN1bHQuZ2V0U291cmNlSW5mbygpIDw8ICI6ICI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgc3RyZWFtOworICAgICAgICAgICAgQXNzZXJ0aW9uU3RhdHMgY29uc3QmIHN0YXRzOworICAgICAgICAgICAgQXNzZXJ0aW9uUmVzdWx0IGNvbnN0JiByZXN1bHQ7CisgICAgICAgICAgICBDb2xvdXI6OkNvZGUgY29sb3VyOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgcGFzc09yRmFpbDsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1lc3NhZ2VMYWJlbDsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1lc3NhZ2U7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxNZXNzYWdlSW5mbz4gbWVzc2FnZXM7CisgICAgICAgICAgICBib29sIHByaW50SW5mb01lc3NhZ2VzOworICAgICAgICB9OworCisgICAgICAgIHZvaWQgbGF6eVByaW50KCkgeworCisgICAgICAgICAgICBpZiggIWN1cnJlbnRUZXN0UnVuSW5mby51c2VkICkKKyAgICAgICAgICAgICAgICBsYXp5UHJpbnRSdW5JbmZvKCk7CisgICAgICAgICAgICBpZiggIWN1cnJlbnRHcm91cEluZm8udXNlZCApCisgICAgICAgICAgICAgICAgbGF6eVByaW50R3JvdXBJbmZvKCk7CisKKyAgICAgICAgICAgIGlmKCAhbV9oZWFkZXJQcmludGVkICkgeworICAgICAgICAgICAgICAgIHByaW50VGVzdENhc2VBbmRTZWN0aW9uSGVhZGVyKCk7CisgICAgICAgICAgICAgICAgbV9oZWFkZXJQcmludGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB2b2lkIGxhenlQcmludFJ1bkluZm8oKSB7CisgICAgICAgICAgICBzdHJlYW0gIDw8ICdcbicgPDwgZ2V0TGluZU9mQ2hhcnM8J34nPigpIDw8ICdcbic7CisgICAgICAgICAgICBDb2xvdXIgY29sb3VyKCBDb2xvdXI6OlNlY29uZGFyeVRleHQgKTsKKyAgICAgICAgICAgIHN0cmVhbSAgPDwgY3VycmVudFRlc3RSdW5JbmZvLT5uYW1lCisgICAgICAgICAgICAgICAgICAgIDw8ICIgaXMgYSBDYXRjaCB2IiAgPDwgbGlicmFyeVZlcnNpb24oKSA8PCAiIGhvc3QgYXBwbGljYXRpb24uXG4iCisgICAgICAgICAgICAgICAgICAgIDw8ICJSdW4gd2l0aCAtPyBmb3Igb3B0aW9uc1xuXG4iOworCisgICAgICAgICAgICBpZiggbV9jb25maWctPnJuZ1NlZWQoKSAhPSAwICkKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwgIlJhbmRvbW5lc3Mgc2VlZGVkIHRvOiAiIDw8IG1fY29uZmlnLT5ybmdTZWVkKCkgPDwgIlxuXG4iOworCisgICAgICAgICAgICBjdXJyZW50VGVzdFJ1bkluZm8udXNlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBsYXp5UHJpbnRHcm91cEluZm8oKSB7CisgICAgICAgICAgICBpZiggIWN1cnJlbnRHcm91cEluZm8tPm5hbWUuZW1wdHkoKSAmJiBjdXJyZW50R3JvdXBJbmZvLT5ncm91cHNDb3VudHMgPiAxICkgeworICAgICAgICAgICAgICAgIHByaW50Q2xvc2VkSGVhZGVyKCAiR3JvdXA6ICIgKyBjdXJyZW50R3JvdXBJbmZvLT5uYW1lICk7CisgICAgICAgICAgICAgICAgY3VycmVudEdyb3VwSW5mby51c2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB2b2lkIHByaW50VGVzdENhc2VBbmRTZWN0aW9uSGVhZGVyKCkgeworICAgICAgICAgICAgYXNzZXJ0KCAhbV9zZWN0aW9uU3RhY2suZW1wdHkoKSApOworICAgICAgICAgICAgcHJpbnRPcGVuSGVhZGVyKCBjdXJyZW50VGVzdENhc2VJbmZvLT5uYW1lICk7CisKKyAgICAgICAgICAgIGlmKCBtX3NlY3Rpb25TdGFjay5zaXplKCkgPiAxICkgeworICAgICAgICAgICAgICAgIENvbG91ciBjb2xvdXJHdWFyZCggQ29sb3VyOjpIZWFkZXJzICk7CisKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTZWN0aW9uSW5mbz46OmNvbnN0X2l0ZXJhdG9yCisgICAgICAgICAgICAgICAgICAgIGl0ID0gbV9zZWN0aW9uU3RhY2suYmVnaW4oKSsxLCAvLyBTa2lwIGZpcnN0IHNlY3Rpb24gKHRlc3QgY2FzZSkKKyAgICAgICAgICAgICAgICAgICAgaXRFbmQgPSBtX3NlY3Rpb25TdGFjay5lbmQoKTsKKyAgICAgICAgICAgICAgICBmb3IoIDsgaXQgIT0gaXRFbmQ7ICsraXQgKQorICAgICAgICAgICAgICAgICAgICBwcmludEhlYWRlclN0cmluZyggaXQtPm5hbWUsIDIgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU291cmNlTGluZUluZm8gbGluZUluZm8gPSBtX3NlY3Rpb25TdGFjay5iYWNrKCkubGluZUluZm87CisKKyAgICAgICAgICAgIGlmKCAhbGluZUluZm8uZW1wdHkoKSApeworICAgICAgICAgICAgICAgIHN0cmVhbSA8PCBnZXRMaW5lT2ZDaGFyczwnLSc+KCkgPDwgJ1xuJzsKKyAgICAgICAgICAgICAgICBDb2xvdXIgY29sb3VyR3VhcmQoIENvbG91cjo6RmlsZU5hbWUgKTsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwgbGluZUluZm8gPDwgJ1xuJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0cmVhbSA8PCBnZXRMaW5lT2ZDaGFyczwnLic+KCkgPDwgJ1xuJyA8PCBzdGQ6OmVuZGw7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHByaW50Q2xvc2VkSGVhZGVyKCBzdGQ6OnN0cmluZyBjb25zdCYgX25hbWUgKSB7CisgICAgICAgICAgICBwcmludE9wZW5IZWFkZXIoIF9uYW1lICk7CisgICAgICAgICAgICBzdHJlYW0gPDwgZ2V0TGluZU9mQ2hhcnM8Jy4nPigpIDw8ICdcbic7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBwcmludE9wZW5IZWFkZXIoIHN0ZDo6c3RyaW5nIGNvbnN0JiBfbmFtZSApIHsKKyAgICAgICAgICAgIHN0cmVhbSAgPDwgZ2V0TGluZU9mQ2hhcnM8Jy0nPigpIDw8ICdcbic7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29sb3VyIGNvbG91ckd1YXJkKCBDb2xvdXI6OkhlYWRlcnMgKTsKKyAgICAgICAgICAgICAgICBwcmludEhlYWRlclN0cmluZyggX25hbWUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGlmIHN0cmluZyBoYXMgYSA6IGluIGZpcnN0IGxpbmUgd2lsbCBzZXQgaW5kZW50IHRvIGZvbGxvdyBpdCBvbgorICAgICAgICAvLyBzdWJzZXF1ZW50IGxpbmVzCisgICAgICAgIHZvaWQgcHJpbnRIZWFkZXJTdHJpbmcoIHN0ZDo6c3RyaW5nIGNvbnN0JiBfc3RyaW5nLCBzdGQ6OnNpemVfdCBpbmRlbnQgPSAwICkgeworICAgICAgICAgICAgc3RkOjpzaXplX3QgaSA9IF9zdHJpbmcuZmluZCggIjogIiApOworICAgICAgICAgICAgaWYoIGkgIT0gc3RkOjpzdHJpbmc6Om5wb3MgKQorICAgICAgICAgICAgICAgIGkrPTI7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaSA9IDA7CisgICAgICAgICAgICBzdHJlYW0gPDwgVGV4dCggX3N0cmluZywgVGV4dEF0dHJpYnV0ZXMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJbmRlbnQoIGluZGVudCtpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJbml0aWFsSW5kZW50KCBpbmRlbnQgKSApIDw8ICdcbic7CisgICAgICAgIH0KKworICAgICAgICBzdHJ1Y3QgU3VtbWFyeUNvbHVtbiB7CisKKyAgICAgICAgICAgIFN1bW1hcnlDb2x1bW4oIHN0ZDo6c3RyaW5nIGNvbnN0JiBfbGFiZWwsIENvbG91cjo6Q29kZSBfY29sb3VyICkKKyAgICAgICAgICAgIDogICBsYWJlbCggX2xhYmVsICksCisgICAgICAgICAgICAgICAgY29sb3VyKCBfY29sb3VyICkKKyAgICAgICAgICAgIHt9CisgICAgICAgICAgICBTdW1tYXJ5Q29sdW1uIGFkZFJvdyggc3RkOjpzaXplX3QgY291bnQgKSB7CisgICAgICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgICAgICBvc3MgPDwgY291bnQ7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcm93ID0gb3NzLnN0cigpOworICAgICAgICAgICAgICAgIGZvciggc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+OjppdGVyYXRvciBpdCA9IHJvd3MuYmVnaW4oKTsgaXQgIT0gcm93cy5lbmQoKTsgKytpdCApIHsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUoIGl0LT5zaXplKCkgPCByb3cuc2l6ZSgpICkKKyAgICAgICAgICAgICAgICAgICAgICAgICppdCA9ICcgJyArICppdDsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUoIGl0LT5zaXplKCkgPiByb3cuc2l6ZSgpICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvdyA9ICcgJyArIHJvdzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcm93cy5wdXNoX2JhY2soIHJvdyApOworICAgICAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RkOjpzdHJpbmcgbGFiZWw7CisgICAgICAgICAgICBDb2xvdXI6OkNvZGUgY29sb3VyOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHJvd3M7CisKKyAgICAgICAgfTsKKworICAgICAgICB2b2lkIHByaW50VG90YWxzKCBUb3RhbHMgY29uc3QmIHRvdGFscyApIHsKKyAgICAgICAgICAgIGlmKCB0b3RhbHMudGVzdENhc2VzLnRvdGFsKCkgPT0gMCApIHsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwgQ29sb3VyKCBDb2xvdXI6Oldhcm5pbmcgKSA8PCAiTm8gdGVzdHMgcmFuXG4iOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggdG90YWxzLmFzc2VydGlvbnMudG90YWwoKSA+IDAgJiYgdG90YWxzLnRlc3RDYXNlcy5hbGxQYXNzZWQoKSApIHsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwgQ29sb3VyKCBDb2xvdXI6OlJlc3VsdFN1Y2Nlc3MgKSA8PCAiQWxsIHRlc3RzIHBhc3NlZCI7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICIgKCIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IHBsdXJhbGlzZSggdG90YWxzLmFzc2VydGlvbnMucGFzc2VkLCAiYXNzZXJ0aW9uIiApIDw8ICIgaW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgcGx1cmFsaXNlKCB0b3RhbHMudGVzdENhc2VzLnBhc3NlZCwgInRlc3QgY2FzZSIgKSA8PCAnKScKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICdcbic7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFN1bW1hcnlDb2x1bW4+IGNvbHVtbnM7CisgICAgICAgICAgICAgICAgY29sdW1ucy5wdXNoX2JhY2soIFN1bW1hcnlDb2x1bW4oICIiLCBDb2xvdXI6Ok5vbmUgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRSb3coIHRvdGFscy50ZXN0Q2FzZXMudG90YWwoKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFJvdyggdG90YWxzLmFzc2VydGlvbnMudG90YWwoKSApICk7CisgICAgICAgICAgICAgICAgY29sdW1ucy5wdXNoX2JhY2soIFN1bW1hcnlDb2x1bW4oICJwYXNzZWQiLCBDb2xvdXI6OlN1Y2Nlc3MgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRSb3coIHRvdGFscy50ZXN0Q2FzZXMucGFzc2VkICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUm93KCB0b3RhbHMuYXNzZXJ0aW9ucy5wYXNzZWQgKSApOworICAgICAgICAgICAgICAgIGNvbHVtbnMucHVzaF9iYWNrKCBTdW1tYXJ5Q29sdW1uKCAiZmFpbGVkIiwgQ29sb3VyOjpSZXN1bHRFcnJvciApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFJvdyggdG90YWxzLnRlc3RDYXNlcy5mYWlsZWQgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRSb3coIHRvdGFscy5hc3NlcnRpb25zLmZhaWxlZCApICk7CisgICAgICAgICAgICAgICAgY29sdW1ucy5wdXNoX2JhY2soIFN1bW1hcnlDb2x1bW4oICJmYWlsZWQgYXMgZXhwZWN0ZWQiLCBDb2xvdXI6OlJlc3VsdEV4cGVjdGVkRmFpbHVyZSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFJvdyggdG90YWxzLnRlc3RDYXNlcy5mYWlsZWRCdXRPayApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFJvdyggdG90YWxzLmFzc2VydGlvbnMuZmFpbGVkQnV0T2sgKSApOworCisgICAgICAgICAgICAgICAgcHJpbnRTdW1tYXJ5Um93KCAidGVzdCBjYXNlcyIsIGNvbHVtbnMsIDAgKTsKKyAgICAgICAgICAgICAgICBwcmludFN1bW1hcnlSb3coICJhc3NlcnRpb25zIiwgY29sdW1ucywgMSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHZvaWQgcHJpbnRTdW1tYXJ5Um93KCBzdGQ6OnN0cmluZyBjb25zdCYgbGFiZWwsIHN0ZDo6dmVjdG9yPFN1bW1hcnlDb2x1bW4+IGNvbnN0JiBjb2xzLCBzdGQ6OnNpemVfdCByb3cgKSB7CisgICAgICAgICAgICBmb3IoIHN0ZDo6dmVjdG9yPFN1bW1hcnlDb2x1bW4+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGNvbHMuYmVnaW4oKTsgaXQgIT0gY29scy5lbmQoKTsgKytpdCApIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2YWx1ZSA9IGl0LT5yb3dzW3Jvd107CisgICAgICAgICAgICAgICAgaWYoIGl0LT5sYWJlbC5lbXB0eSgpICkgeworICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgbGFiZWwgPDwgIjogIjsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHZhbHVlICE9ICIwIiApCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgdmFsdWU7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCBDb2xvdXIoIENvbG91cjo6V2FybmluZyApIDw8ICItIG5vbmUgLSI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYoIHZhbHVlICE9ICIwIiApIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtICA8PCBDb2xvdXIoIENvbG91cjo6TGlnaHRHcmV5ICkgPDwgIiB8ICI7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSAgPDwgQ29sb3VyKCBpdC0+Y29sb3VyICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCB2YWx1ZSA8PCAnICcgPDwgaXQtPmxhYmVsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0cmVhbSA8PCAnXG4nOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIHN0ZDo6c2l6ZV90IG1ha2VSYXRpbyggc3RkOjpzaXplX3QgbnVtYmVyLCBzdGQ6OnNpemVfdCB0b3RhbCApIHsKKyAgICAgICAgICAgIHN0ZDo6c2l6ZV90IHJhdGlvID0gdG90YWwgPiAwID8gQ0FUQ0hfQ09ORklHX0NPTlNPTEVfV0lEVEggKiBudW1iZXIvIHRvdGFsIDogMDsKKyAgICAgICAgICAgIHJldHVybiAoIHJhdGlvID09IDAgJiYgbnVtYmVyID4gMCApID8gMSA6IHJhdGlvOworICAgICAgICB9CisgICAgICAgIHN0YXRpYyBzdGQ6OnNpemVfdCYgZmluZE1heCggc3RkOjpzaXplX3QmIGksIHN0ZDo6c2l6ZV90JiBqLCBzdGQ6OnNpemVfdCYgayApIHsKKyAgICAgICAgICAgIGlmKCBpID4gaiAmJiBpID4gayApCisgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgICAgICBlbHNlIGlmKCBqID4gayApCisgICAgICAgICAgICAgICAgcmV0dXJuIGo7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIGs7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHByaW50VG90YWxzRGl2aWRlciggVG90YWxzIGNvbnN0JiB0b3RhbHMgKSB7CisgICAgICAgICAgICBpZiggdG90YWxzLnRlc3RDYXNlcy50b3RhbCgpID4gMCApIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnNpemVfdCBmYWlsZWRSYXRpbyA9IG1ha2VSYXRpbyggdG90YWxzLnRlc3RDYXNlcy5mYWlsZWQsIHRvdGFscy50ZXN0Q2FzZXMudG90YWwoKSApOworICAgICAgICAgICAgICAgIHN0ZDo6c2l6ZV90IGZhaWxlZEJ1dE9rUmF0aW8gPSBtYWtlUmF0aW8oIHRvdGFscy50ZXN0Q2FzZXMuZmFpbGVkQnV0T2ssIHRvdGFscy50ZXN0Q2FzZXMudG90YWwoKSApOworICAgICAgICAgICAgICAgIHN0ZDo6c2l6ZV90IHBhc3NlZFJhdGlvID0gbWFrZVJhdGlvKCB0b3RhbHMudGVzdENhc2VzLnBhc3NlZCwgdG90YWxzLnRlc3RDYXNlcy50b3RhbCgpICk7CisgICAgICAgICAgICAgICAgd2hpbGUoIGZhaWxlZFJhdGlvICsgZmFpbGVkQnV0T2tSYXRpbyArIHBhc3NlZFJhdGlvIDwgQ0FUQ0hfQ09ORklHX0NPTlNPTEVfV0lEVEgtMSApCisgICAgICAgICAgICAgICAgICAgIGZpbmRNYXgoIGZhaWxlZFJhdGlvLCBmYWlsZWRCdXRPa1JhdGlvLCBwYXNzZWRSYXRpbyApKys7CisgICAgICAgICAgICAgICAgd2hpbGUoIGZhaWxlZFJhdGlvICsgZmFpbGVkQnV0T2tSYXRpbyArIHBhc3NlZFJhdGlvID4gQ0FUQ0hfQ09ORklHX0NPTlNPTEVfV0lEVEgtMSApCisgICAgICAgICAgICAgICAgICAgIGZpbmRNYXgoIGZhaWxlZFJhdGlvLCBmYWlsZWRCdXRPa1JhdGlvLCBwYXNzZWRSYXRpbyApLS07CisKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwgQ29sb3VyKCBDb2xvdXI6OkVycm9yICkgPDwgc3RkOjpzdHJpbmcoIGZhaWxlZFJhdGlvLCAnPScgKTsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwgQ29sb3VyKCBDb2xvdXI6OlJlc3VsdEV4cGVjdGVkRmFpbHVyZSApIDw8IHN0ZDo6c3RyaW5nKCBmYWlsZWRCdXRPa1JhdGlvLCAnPScgKTsKKyAgICAgICAgICAgICAgICBpZiggdG90YWxzLnRlc3RDYXNlcy5hbGxQYXNzZWQoKSApCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCBDb2xvdXIoIENvbG91cjo6UmVzdWx0U3VjY2VzcyApIDw8IHN0ZDo6c3RyaW5nKCBwYXNzZWRSYXRpbywgJz0nICk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgQ29sb3VyKCBDb2xvdXI6OlN1Y2Nlc3MgKSA8PCBzdGQ6OnN0cmluZyggcGFzc2VkUmF0aW8sICc9JyApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8IENvbG91ciggQ29sb3VyOjpXYXJuaW5nICkgPDwgc3RkOjpzdHJpbmcoIENBVENIX0NPTkZJR19DT05TT0xFX1dJRFRILTEsICc9JyApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RyZWFtIDw8ICdcbic7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBwcmludFN1bW1hcnlEaXZpZGVyKCkgeworICAgICAgICAgICAgc3RyZWFtIDw8IGdldExpbmVPZkNoYXJzPCctJz4oKSA8PCAnXG4nOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBib29sIG1faGVhZGVyUHJpbnRlZDsKKyAgICB9OworCisgICAgSU5URVJOQUxfQ0FUQ0hfUkVHSVNURVJfUkVQT1JURVIoICJjb25zb2xlIiwgQ29uc29sZVJlcG9ydGVyICkKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiAuLi9yZXBvcnRlcnMvY2F0Y2hfcmVwb3J0ZXJfY29tcGFjdC5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1JFUE9SVEVSX0NPTVBBQ1RfSFBQX0lOQ0xVREVECisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdHJ1Y3QgQ29tcGFjdFJlcG9ydGVyIDogU3RyZWFtaW5nUmVwb3J0ZXJCYXNlIHsKKworICAgICAgICBDb21wYWN0UmVwb3J0ZXIoIFJlcG9ydGVyQ29uZmlnIGNvbnN0JiBfY29uZmlnICkKKyAgICAgICAgOiBTdHJlYW1pbmdSZXBvcnRlckJhc2UoIF9jb25maWcgKQorICAgICAgICB7fQorCisgICAgICAgIHZpcnR1YWwgfkNvbXBhY3RSZXBvcnRlcigpOworCisgICAgICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiAiUmVwb3J0cyB0ZXN0IHJlc3VsdHMgb24gYSBzaW5nbGUgbGluZSwgc3VpdGFibGUgZm9yIElERXMiOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCBSZXBvcnRlclByZWZlcmVuY2VzIGdldFByZWZlcmVuY2VzKCkgY29uc3QgeworICAgICAgICAgICAgUmVwb3J0ZXJQcmVmZXJlbmNlcyBwcmVmczsKKyAgICAgICAgICAgIHByZWZzLnNob3VsZFJlZGlyZWN0U3RkT3V0ID0gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gcHJlZnM7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgbm9NYXRjaGluZ1Rlc3RDYXNlcyggc3RkOjpzdHJpbmcgY29uc3QmIHNwZWMgKSB7CisgICAgICAgICAgICBzdHJlYW0gPDwgIk5vIHRlc3QgY2FzZXMgbWF0Y2hlZCAnIiA8PCBzcGVjIDw8ICdcJycgPDwgc3RkOjplbmRsOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGFzc2VydGlvblN0YXJ0aW5nKCBBc3NlcnRpb25JbmZvIGNvbnN0JiApIHt9CisKKyAgICAgICAgdmlydHVhbCBib29sIGFzc2VydGlvbkVuZGVkKCBBc3NlcnRpb25TdGF0cyBjb25zdCYgX2Fzc2VydGlvblN0YXRzICkgeworICAgICAgICAgICAgQXNzZXJ0aW9uUmVzdWx0IGNvbnN0JiByZXN1bHQgPSBfYXNzZXJ0aW9uU3RhdHMuYXNzZXJ0aW9uUmVzdWx0OworCisgICAgICAgICAgICBib29sIHByaW50SW5mb01lc3NhZ2VzID0gdHJ1ZTsKKworICAgICAgICAgICAgLy8gRHJvcCBvdXQgaWYgcmVzdWx0IHdhcyBzdWNjZXNzZnVsIGFuZCB3ZSdyZSBub3QgcHJpbnRpbmcgdGhvc2UKKyAgICAgICAgICAgIGlmKCAhbV9jb25maWctPmluY2x1ZGVTdWNjZXNzZnVsUmVzdWx0cygpICYmIHJlc3VsdC5pc09rKCkgKSB7CisgICAgICAgICAgICAgICAgaWYoIHJlc3VsdC5nZXRSZXN1bHRUeXBlKCkgIT0gUmVzdWx0V2FzOjpXYXJuaW5nICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIHByaW50SW5mb01lc3NhZ2VzID0gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFzc2VydGlvblByaW50ZXIgcHJpbnRlciggc3RyZWFtLCBfYXNzZXJ0aW9uU3RhdHMsIHByaW50SW5mb01lc3NhZ2VzICk7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCk7CisKKyAgICAgICAgICAgIHN0cmVhbSA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uRW5kZWQoU2VjdGlvblN0YXRzIGNvbnN0JiBfc2VjdGlvblN0YXRzKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBpZiAobV9jb25maWctPnNob3dEdXJhdGlvbnMoKSA9PSBTaG93RHVyYXRpb25zOjpBbHdheXMpIHsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwgZ2V0Rm9ybWF0dGVkRHVyYXRpb24oX3NlY3Rpb25TdGF0cy5kdXJhdGlvbkluU2Vjb25kcykgPDwgIiBzOiAiIDw8IF9zZWN0aW9uU3RhdHMuc2VjdGlvbkluZm8ubmFtZSA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdFJ1bkVuZGVkKCBUZXN0UnVuU3RhdHMgY29uc3QmIF90ZXN0UnVuU3RhdHMgKSB7CisgICAgICAgICAgICBwcmludFRvdGFscyggX3Rlc3RSdW5TdGF0cy50b3RhbHMgKTsKKyAgICAgICAgICAgIHN0cmVhbSA8PCAnXG4nIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZTo6dGVzdFJ1bkVuZGVkKCBfdGVzdFJ1blN0YXRzICk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIGNsYXNzIEFzc2VydGlvblByaW50ZXIgeworICAgICAgICAgICAgdm9pZCBvcGVyYXRvcj0gKCBBc3NlcnRpb25QcmludGVyIGNvbnN0JiApOworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBBc3NlcnRpb25QcmludGVyKCBzdGQ6Om9zdHJlYW0mIF9zdHJlYW0sIEFzc2VydGlvblN0YXRzIGNvbnN0JiBfc3RhdHMsIGJvb2wgX3ByaW50SW5mb01lc3NhZ2VzICkKKyAgICAgICAgICAgIDogc3RyZWFtKCBfc3RyZWFtICkKKyAgICAgICAgICAgICwgc3RhdHMoIF9zdGF0cyApCisgICAgICAgICAgICAsIHJlc3VsdCggX3N0YXRzLmFzc2VydGlvblJlc3VsdCApCisgICAgICAgICAgICAsIG1lc3NhZ2VzKCBfc3RhdHMuaW5mb01lc3NhZ2VzICkKKyAgICAgICAgICAgICwgaXRNZXNzYWdlKCBfc3RhdHMuaW5mb01lc3NhZ2VzLmJlZ2luKCkgKQorICAgICAgICAgICAgLCBwcmludEluZm9NZXNzYWdlcyggX3ByaW50SW5mb01lc3NhZ2VzICkKKyAgICAgICAgICAgIHt9CisKKyAgICAgICAgICAgIHZvaWQgcHJpbnQoKSB7CisgICAgICAgICAgICAgICAgcHJpbnRTb3VyY2VJbmZvKCk7CisKKyAgICAgICAgICAgICAgICBpdE1lc3NhZ2UgPSBtZXNzYWdlcy5iZWdpbigpOworCisgICAgICAgICAgICAgICAgc3dpdGNoKCByZXN1bHQuZ2V0UmVzdWx0VHlwZSgpICkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6T2s6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlc3VsdFR5cGUoIENvbG91cjo6UmVzdWx0U3VjY2VzcywgcGFzc2VkU3RyaW5nKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50T3JpZ2luYWxFeHByZXNzaW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlY29uc3RydWN0ZWRFeHByZXNzaW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEgcmVzdWx0Lmhhc0V4cHJlc3Npb24oKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZW1haW5pbmdNZXNzYWdlcyggQ29sb3VyOjpOb25lICk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZW1haW5pbmdNZXNzYWdlcygpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpFeHByZXNzaW9uRmFpbGVkOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHJlc3VsdC5pc09rKCkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVzdWx0VHlwZSggQ29sb3VyOjpSZXN1bHRTdWNjZXNzLCBmYWlsZWRTdHJpbmcoKSArIHN0ZDo6c3RyaW5nKCAiIC0gYnV0IHdhcyBvayIgKSApOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVzdWx0VHlwZSggQ29sb3VyOjpFcnJvciwgZmFpbGVkU3RyaW5nKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50T3JpZ2luYWxFeHByZXNzaW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlY29uc3RydWN0ZWRFeHByZXNzaW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlbWFpbmluZ01lc3NhZ2VzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OlRocmV3RXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZXN1bHRUeXBlKCBDb2xvdXI6OkVycm9yLCBmYWlsZWRTdHJpbmcoKSApOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRJc3N1ZSggInVuZXhwZWN0ZWQgZXhjZXB0aW9uIHdpdGggbWVzc2FnZToiICk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludE1lc3NhZ2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50RXhwcmVzc2lvbldhcygpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZW1haW5pbmdNZXNzYWdlcygpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpGYXRhbEVycm9yQ29uZGl0aW9uOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZXN1bHRUeXBlKCBDb2xvdXI6OkVycm9yLCBmYWlsZWRTdHJpbmcoKSApOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRJc3N1ZSggImZhdGFsIGVycm9yIGNvbmRpdGlvbiB3aXRoIG1lc3NhZ2U6IiApOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludEV4cHJlc3Npb25XYXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVtYWluaW5nTWVzc2FnZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6RGlkbnRUaHJvd0V4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVzdWx0VHlwZSggQ29sb3VyOjpFcnJvciwgZmFpbGVkU3RyaW5nKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50SXNzdWUoICJleHBlY3RlZCBleGNlcHRpb24sIGdvdCBub25lIiApOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRFeHByZXNzaW9uV2FzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlbWFpbmluZ01lc3NhZ2VzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkluZm86CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlc3VsdFR5cGUoIENvbG91cjo6Tm9uZSwgImluZm8iICk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludE1lc3NhZ2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVtYWluaW5nTWVzc2FnZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6V2FybmluZzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVzdWx0VHlwZSggQ29sb3VyOjpOb25lLCAid2FybmluZyIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50TWVzc2FnZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZW1haW5pbmdNZXNzYWdlcygpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpFeHBsaWNpdEZhaWx1cmU6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlc3VsdFR5cGUoIENvbG91cjo6RXJyb3IsIGZhaWxlZFN0cmluZygpICk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludElzc3VlKCAiZXhwbGljaXRseSIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVtYWluaW5nTWVzc2FnZXMoIENvbG91cjo6Tm9uZSApOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoZXNlIGNhc2VzIGFyZSBoZXJlIHRvIHByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OlVua25vd246CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpGYWlsdXJlQml0OgorICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6RXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZXN1bHRUeXBlKCBDb2xvdXI6OkVycm9yLCAiKiogaW50ZXJuYWwgZXJyb3IgKioiICk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIC8vIENvbG91cjo6TGlnaHRHcmV5CisKKyAgICAgICAgICAgIHN0YXRpYyBDb2xvdXI6OkNvZGUgZGltQ29sb3VyKCkgeyByZXR1cm4gQ29sb3VyOjpGaWxlTmFtZTsgfQorCisjaWZkZWYgQ0FUQ0hfUExBVEZPUk1fTUFDCisgICAgICAgICAgICBzdGF0aWMgY29uc3QgY2hhciogZmFpbGVkU3RyaW5nKCkgeyByZXR1cm4gIkZBSUxFRCI7IH0KKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyKiBwYXNzZWRTdHJpbmcoKSB7IHJldHVybiAiUEFTU0VEIjsgfQorI2Vsc2UKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyKiBmYWlsZWRTdHJpbmcoKSB7IHJldHVybiAiZmFpbGVkIjsgfQorICAgICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIqIHBhc3NlZFN0cmluZygpIHsgcmV0dXJuICJwYXNzZWQiOyB9CisjZW5kaWYKKworICAgICAgICAgICAgdm9pZCBwcmludFNvdXJjZUluZm8oKSBjb25zdCB7CisgICAgICAgICAgICAgICAgQ29sb3VyIGNvbG91ckd1YXJkKCBDb2xvdXI6OkZpbGVOYW1lICk7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8IHJlc3VsdC5nZXRTb3VyY2VJbmZvKCkgPDwgJzonOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2b2lkIHByaW50UmVzdWx0VHlwZSggQ29sb3VyOjpDb2RlIGNvbG91ciwgc3RkOjpzdHJpbmcgY29uc3QmIHBhc3NPckZhaWwgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgaWYoICFwYXNzT3JGYWlsLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbG91ciBjb2xvdXJHdWFyZCggY29sb3VyICk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgJyAnIDw8IHBhc3NPckZhaWw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICc6JzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZvaWQgcHJpbnRJc3N1ZSggc3RkOjpzdHJpbmcgY29uc3QmIGlzc3VlICkgY29uc3QgeworICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAnICcgPDwgaXNzdWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZvaWQgcHJpbnRFeHByZXNzaW9uV2FzKCkgeworICAgICAgICAgICAgICAgIGlmKCByZXN1bHQuaGFzRXhwcmVzc2lvbigpICkgeworICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgJzsnOworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb2xvdXIgY29sb3VyKCBkaW1Db2xvdXIoKSApOworICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICIgZXhwcmVzc2lvbiB3YXM6IjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwcmludE9yaWdpbmFsRXhwcmVzc2lvbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdm9pZCBwcmludE9yaWdpbmFsRXhwcmVzc2lvbigpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICBpZiggcmVzdWx0Lmhhc0V4cHJlc3Npb24oKSApIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICcgJyA8PCByZXN1bHQuZ2V0RXhwcmVzc2lvbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdm9pZCBwcmludFJlY29uc3RydWN0ZWRFeHByZXNzaW9uKCkgY29uc3QgeworICAgICAgICAgICAgICAgIGlmKCByZXN1bHQuaGFzRXhwYW5kZWRFeHByZXNzaW9uKCkgKSB7CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbG91ciBjb2xvdXIoIGRpbUNvbG91cigpICk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgIiBmb3I6ICI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8IHJlc3VsdC5nZXRFeHBhbmRlZEV4cHJlc3Npb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZvaWQgcHJpbnRNZXNzYWdlKCkgeworICAgICAgICAgICAgICAgIGlmICggaXRNZXNzYWdlICE9IG1lc3NhZ2VzLmVuZCgpICkgeworICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgIiAnIiA8PCBpdE1lc3NhZ2UtPm1lc3NhZ2UgPDwgJ1wnJzsKKyAgICAgICAgICAgICAgICAgICAgKytpdE1lc3NhZ2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2b2lkIHByaW50UmVtYWluaW5nTWVzc2FnZXMoIENvbG91cjo6Q29kZSBjb2xvdXIgPSBkaW1Db2xvdXIoKSApIHsKKyAgICAgICAgICAgICAgICBpZiAoIGl0TWVzc2FnZSA9PSBtZXNzYWdlcy5lbmQoKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgICAgIC8vIHVzaW5nIG1lc3NhZ2VzLmVuZCgpIGRpcmVjdGx5IHlpZWxkcyBjb21waWxhdGlvbiBlcnJvcjoKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxNZXNzYWdlSW5mbz46OmNvbnN0X2l0ZXJhdG9yIGl0RW5kID0gbWVzc2FnZXMuZW5kKCk7CisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaXplX3QgTiA9IHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90Piggc3RkOjpkaXN0YW5jZSggaXRNZXNzYWdlLCBpdEVuZCApICk7CisKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbG91ciBjb2xvdXJHdWFyZCggY29sb3VyICk7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAiIHdpdGggIiA8PCBwbHVyYWxpc2UoIE4sICJtZXNzYWdlIiApIDw8ICc6JzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IoOyBpdE1lc3NhZ2UgIT0gaXRFbmQ7ICkgeworICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGFzc2VydGlvbiBpcyBhIHdhcm5pbmcgaWdub3JlIGFueSBJTkZPIG1lc3NhZ2VzCisgICAgICAgICAgICAgICAgICAgIGlmKCBwcmludEluZm9NZXNzYWdlcyB8fCBpdE1lc3NhZ2UtPnR5cGUgIT0gUmVzdWx0V2FzOjpJbmZvICkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICIgJyIgPDwgaXRNZXNzYWdlLT5tZXNzYWdlIDw8ICdcJyc7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICsraXRNZXNzYWdlICE9IGl0RW5kICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbG91ciBjb2xvdXJHdWFyZCggZGltQ29sb3VyKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgIiBhbmQiOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIHN0cmVhbTsKKyAgICAgICAgICAgIEFzc2VydGlvblN0YXRzIGNvbnN0JiBzdGF0czsKKyAgICAgICAgICAgIEFzc2VydGlvblJlc3VsdCBjb25zdCYgcmVzdWx0OworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TWVzc2FnZUluZm8+IG1lc3NhZ2VzOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TWVzc2FnZUluZm8+Ojpjb25zdF9pdGVyYXRvciBpdE1lc3NhZ2U7CisgICAgICAgICAgICBib29sIHByaW50SW5mb01lc3NhZ2VzOworICAgICAgICB9OworCisgICAgICAgIC8vIENvbG91ciwgbWVzc2FnZSB2YXJpYW50czoKKyAgICAgICAgLy8gLSB3aGl0ZTogTm8gdGVzdHMgcmFuLgorICAgICAgICAvLyAtICAgcmVkOiBGYWlsZWQgW2JvdGgvYWxsXSBOIHRlc3QgY2FzZXMsIGZhaWxlZCBbYm90aC9hbGxdIE0gYXNzZXJ0aW9ucy4KKyAgICAgICAgLy8gLSB3aGl0ZTogUGFzc2VkIFtib3RoL2FsbF0gTiB0ZXN0IGNhc2VzIChubyBhc3NlcnRpb25zKS4KKyAgICAgICAgLy8gLSAgIHJlZDogRmFpbGVkIE4gdGVzdHMgY2FzZXMsIGZhaWxlZCBNIGFzc2VydGlvbnMuCisgICAgICAgIC8vIC0gZ3JlZW46IFBhc3NlZCBbYm90aC9hbGxdIE4gdGVzdHMgY2FzZXMgd2l0aCBNIGFzc2VydGlvbnMuCisKKyAgICAgICAgc3RkOjpzdHJpbmcgYm90aE9yQWxsKCBzdGQ6OnNpemVfdCBjb3VudCApIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBjb3VudCA9PSAxID8gc3RkOjpzdHJpbmcoKSA6IGNvdW50ID09IDIgPyAiYm90aCAiIDogImFsbCAiIDsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgcHJpbnRUb3RhbHMoIGNvbnN0IFRvdGFscyYgdG90YWxzICkgY29uc3QgeworICAgICAgICAgICAgaWYoIHRvdGFscy50ZXN0Q2FzZXMudG90YWwoKSA9PSAwICkgeworICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAiTm8gdGVzdHMgcmFuLiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCB0b3RhbHMudGVzdENhc2VzLmZhaWxlZCA9PSB0b3RhbHMudGVzdENhc2VzLnRvdGFsKCkgKSB7CisgICAgICAgICAgICAgICAgQ29sb3VyIGNvbG91ciggQ29sb3VyOjpSZXN1bHRFcnJvciApOworICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHF1YWxpZnlfYXNzZXJ0aW9uc19mYWlsZWQgPQorICAgICAgICAgICAgICAgICAgICB0b3RhbHMuYXNzZXJ0aW9ucy5mYWlsZWQgPT0gdG90YWxzLmFzc2VydGlvbnMudG90YWwoKSA/CisgICAgICAgICAgICAgICAgICAgICAgICBib3RoT3JBbGwoIHRvdGFscy5hc3NlcnRpb25zLmZhaWxlZCApIDogc3RkOjpzdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwKKyAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCAiIDw8IGJvdGhPckFsbCggdG90YWxzLnRlc3RDYXNlcy5mYWlsZWQgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgcGx1cmFsaXNlKCB0b3RhbHMudGVzdENhc2VzLmZhaWxlZCwgInRlc3QgY2FzZSIgICkgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgICAiZmFpbGVkICIgPDwgcXVhbGlmeV9hc3NlcnRpb25zX2ZhaWxlZCA8PAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1cmFsaXNlKCB0b3RhbHMuYXNzZXJ0aW9ucy5mYWlsZWQsICJhc3NlcnRpb24iICkgPDwgJy4nOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggdG90YWxzLmFzc2VydGlvbnMudG90YWwoKSA9PSAwICkgeworICAgICAgICAgICAgICAgIHN0cmVhbSA8PAorICAgICAgICAgICAgICAgICAgICAiUGFzc2VkICIgPDwgYm90aE9yQWxsKCB0b3RhbHMudGVzdENhc2VzLnRvdGFsKCkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgcGx1cmFsaXNlKCB0b3RhbHMudGVzdENhc2VzLnRvdGFsKCksICJ0ZXN0IGNhc2UiICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgKG5vIGFzc2VydGlvbnMpLiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCB0b3RhbHMuYXNzZXJ0aW9ucy5mYWlsZWQgKSB7CisgICAgICAgICAgICAgICAgQ29sb3VyIGNvbG91ciggQ29sb3VyOjpSZXN1bHRFcnJvciApOworICAgICAgICAgICAgICAgIHN0cmVhbSA8PAorICAgICAgICAgICAgICAgICAgICAiRmFpbGVkICIgPDwgcGx1cmFsaXNlKCB0b3RhbHMudGVzdENhc2VzLmZhaWxlZCwgInRlc3QgY2FzZSIgICkgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgICAiZmFpbGVkICIgPDwgcGx1cmFsaXNlKCB0b3RhbHMuYXNzZXJ0aW9ucy5mYWlsZWQsICJhc3NlcnRpb24iICkgPDwgJy4nOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgQ29sb3VyIGNvbG91ciggQ29sb3VyOjpSZXN1bHRTdWNjZXNzICk7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8CisgICAgICAgICAgICAgICAgICAgICJQYXNzZWQgIiA8PCBib3RoT3JBbGwoIHRvdGFscy50ZXN0Q2FzZXMucGFzc2VkICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHBsdXJhbGlzZSggdG90YWxzLnRlc3RDYXNlcy5wYXNzZWQsICJ0ZXN0IGNhc2UiICApIDw8CisgICAgICAgICAgICAgICAgICAgICIgd2l0aCAiICA8PCBwbHVyYWxpc2UoIHRvdGFscy5hc3NlcnRpb25zLnBhc3NlZCwgImFzc2VydGlvbiIgKSA8PCAnLic7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgSU5URVJOQUxfQ0FUQ0hfUkVHSVNURVJfUkVQT1JURVIoICJjb21wYWN0IiwgQ29tcGFjdFJlcG9ydGVyICkKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKK25hbWVzcGFjZSBDYXRjaCB7CisgICAgLy8gVGhlc2UgYXJlIGFsbCBoZXJlIHRvIGF2b2lkIHdhcm5pbmdzIGFib3V0IG5vdCBoYXZpbmcgYW55IG91dCBvZiBsaW5lCisgICAgLy8gdmlydHVhbCBtZXRob2RzCisgICAgTm9uQ29weWFibGU6On5Ob25Db3B5YWJsZSgpIHt9CisgICAgSVNoYXJlZDo6fklTaGFyZWQoKSB7fQorICAgIElTdHJlYW06On5JU3RyZWFtKCkgQ0FUQ0hfTk9FWENFUFQge30KKyAgICBGaWxlU3RyZWFtOjp+RmlsZVN0cmVhbSgpIENBVENIX05PRVhDRVBUIHt9CisgICAgQ291dFN0cmVhbTo6fkNvdXRTdHJlYW0oKSBDQVRDSF9OT0VYQ0VQVCB7fQorICAgIERlYnVnT3V0U3RyZWFtOjp+RGVidWdPdXRTdHJlYW0oKSBDQVRDSF9OT0VYQ0VQVCB7fQorICAgIFN0cmVhbUJ1ZkJhc2U6On5TdHJlYW1CdWZCYXNlKCkgQ0FUQ0hfTk9FWENFUFQge30KKyAgICBJQ29udGV4dDo6fklDb250ZXh0KCkge30KKyAgICBJUmVzdWx0Q2FwdHVyZTo6fklSZXN1bHRDYXB0dXJlKCkge30KKyAgICBJVGVzdENhc2U6On5JVGVzdENhc2UoKSB7fQorICAgIElUZXN0Q2FzZVJlZ2lzdHJ5Ojp+SVRlc3RDYXNlUmVnaXN0cnkoKSB7fQorICAgIElSZWdpc3RyeUh1Yjo6fklSZWdpc3RyeUh1YigpIHt9CisgICAgSU11dGFibGVSZWdpc3RyeUh1Yjo6fklNdXRhYmxlUmVnaXN0cnlIdWIoKSB7fQorICAgIElFeGNlcHRpb25UcmFuc2xhdG9yOjp+SUV4Y2VwdGlvblRyYW5zbGF0b3IoKSB7fQorICAgIElFeGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cnk6On5JRXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5KCkge30KKyAgICBJUmVwb3J0ZXI6On5JUmVwb3J0ZXIoKSB7fQorICAgIElSZXBvcnRlckZhY3Rvcnk6On5JUmVwb3J0ZXJGYWN0b3J5KCkge30KKyAgICBJUmVwb3J0ZXJSZWdpc3RyeTo6fklSZXBvcnRlclJlZ2lzdHJ5KCkge30KKyAgICBJU3RyZWFtaW5nUmVwb3J0ZXI6On5JU3RyZWFtaW5nUmVwb3J0ZXIoKSB7fQorICAgIEFzc2VydGlvblN0YXRzOjp+QXNzZXJ0aW9uU3RhdHMoKSB7fQorICAgIFNlY3Rpb25TdGF0czo6flNlY3Rpb25TdGF0cygpIHt9CisgICAgVGVzdENhc2VTdGF0czo6flRlc3RDYXNlU3RhdHMoKSB7fQorICAgIFRlc3RHcm91cFN0YXRzOjp+VGVzdEdyb3VwU3RhdHMoKSB7fQorICAgIFRlc3RSdW5TdGF0czo6flRlc3RSdW5TdGF0cygpIHt9CisgICAgQ3VtdWxhdGl2ZVJlcG9ydGVyQmFzZTo6U2VjdGlvbk5vZGU6On5TZWN0aW9uTm9kZSgpIHt9CisgICAgQ3VtdWxhdGl2ZVJlcG9ydGVyQmFzZTo6fkN1bXVsYXRpdmVSZXBvcnRlckJhc2UoKSB7fQorCisgICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlOjp+U3RyZWFtaW5nUmVwb3J0ZXJCYXNlKCkge30KKyAgICBDb25zb2xlUmVwb3J0ZXI6On5Db25zb2xlUmVwb3J0ZXIoKSB7fQorICAgIENvbXBhY3RSZXBvcnRlcjo6fkNvbXBhY3RSZXBvcnRlcigpIHt9CisgICAgSVJ1bm5lcjo6fklSdW5uZXIoKSB7fQorICAgIElNdXRhYmxlQ29udGV4dDo6fklNdXRhYmxlQ29udGV4dCgpIHt9CisgICAgSUNvbmZpZzo6fklDb25maWcoKSB7fQorICAgIFhtbFJlcG9ydGVyOjp+WG1sUmVwb3J0ZXIoKSB7fQorICAgIEp1bml0UmVwb3J0ZXI6On5KdW5pdFJlcG9ydGVyKCkge30KKyAgICBUZXN0UmVnaXN0cnk6On5UZXN0UmVnaXN0cnkoKSB7fQorICAgIEZyZWVGdW5jdGlvblRlc3RDYXNlOjp+RnJlZUZ1bmN0aW9uVGVzdENhc2UoKSB7fQorICAgIElHZW5lcmF0b3JJbmZvOjp+SUdlbmVyYXRvckluZm8oKSB7fQorICAgIElHZW5lcmF0b3JzRm9yVGVzdDo6fklHZW5lcmF0b3JzRm9yVGVzdCgpIHt9CisgICAgV2lsZGNhcmRQYXR0ZXJuOjp+V2lsZGNhcmRQYXR0ZXJuKCkge30KKyAgICBUZXN0U3BlYzo6UGF0dGVybjo6flBhdHRlcm4oKSB7fQorICAgIFRlc3RTcGVjOjpOYW1lUGF0dGVybjo6fk5hbWVQYXR0ZXJuKCkge30KKyAgICBUZXN0U3BlYzo6VGFnUGF0dGVybjo6flRhZ1BhdHRlcm4oKSB7fQorICAgIFRlc3RTcGVjOjpFeGNsdWRlZFBhdHRlcm46On5FeGNsdWRlZFBhdHRlcm4oKSB7fQorICAgIE1hdGNoZXJzOjpJbXBsOjpNYXRjaGVyVW50eXBlZEJhc2U6On5NYXRjaGVyVW50eXBlZEJhc2UoKSB7fQorCisgICAgdm9pZCBDb25maWc6OmR1bW15KCkge30KKworICAgIG5hbWVzcGFjZSBUZXN0Q2FzZVRyYWNraW5nIHsKKyAgICAgICAgSVRyYWNrZXI6On5JVHJhY2tlcigpIHt9CisgICAgICAgIFRyYWNrZXJCYXNlOjp+VHJhY2tlckJhc2UoKSB7fQorICAgICAgICBTZWN0aW9uVHJhY2tlcjo6flNlY3Rpb25UcmFja2VyKCkge30KKyAgICAgICAgSW5kZXhUcmFja2VyOjp+SW5kZXhUcmFja2VyKCkge30KKyAgICB9Cit9CisKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKKyNlbmRpZgorCisjZW5kaWYKKworI2lmZGVmIENBVENIX0NPTkZJR19NQUlOCisvLyAjaW5jbHVkZWQgZnJvbTogaW50ZXJuYWwvY2F0Y2hfZGVmYXVsdF9tYWluLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfREVGQVVMVF9NQUlOX0hQUF9JTkNMVURFRAorCisjaWZuZGVmIF9fT0JKQ19fCisKKyNpZiBkZWZpbmVkKFdJTjMyKSAmJiBkZWZpbmVkKF9VTklDT0RFKSAmJiAhZGVmaW5lZChET19OT1RfVVNFX1dNQUlOKQorLy8gU3RhbmRhcmQgQy9DKysgV2luMzIgVW5pY29kZSB3bWFpbiBlbnRyeSBwb2ludAorZXh0ZXJuICJDIiBpbnQgd21haW4gKGludCBhcmdjLCB3Y2hhcl90ICogYXJndltdLCB3Y2hhcl90ICogW10pIHsKKyNlbHNlCisvLyBTdGFuZGFyZCBDL0MrKyBtYWluIGVudHJ5IHBvaW50CitpbnQgbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiBhcmd2W10pIHsKKyNlbmRpZgorCisJaW50IHJlc3VsdCA9IENhdGNoOjpTZXNzaW9uKCkucnVuKCBhcmdjLCBhcmd2ICk7CisgICAgcmV0dXJuICggcmVzdWx0IDwgMHhmZiA/IHJlc3VsdCA6IDB4ZmYgKTsKK30KKworI2Vsc2UgLy8gX19PQkpDX18KKworLy8gT2JqZWN0aXZlLUMgZW50cnkgcG9pbnQKK2ludCBtYWluIChpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkgeworI2lmICFDQVRDSF9BUkNfRU5BQkxFRAorICAgIE5TQXV0b3JlbGVhc2VQb29sICogcG9vbCA9IFtbTlNBdXRvcmVsZWFzZVBvb2wgYWxsb2NdIGluaXRdOworI2VuZGlmCisKKyAgICBDYXRjaDo6cmVnaXN0ZXJUZXN0TWV0aG9kcygpOworICAgIGludCByZXN1bHQgPSBDYXRjaDo6U2Vzc2lvbigpLnJ1biggYXJnYywgKGNoYXIqIGNvbnN0Kilhcmd2ICk7CisKKyNpZiAhQ0FUQ0hfQVJDX0VOQUJMRUQKKyAgICBbcG9vbCBkcmFpbl07CisjZW5kaWYKKworICAgIHJldHVybiAoIHJlc3VsdCA8IDB4ZmYgPyByZXN1bHQgOiAweGZmICk7Cit9CisKKyNlbmRpZiAvLyBfX09CSkNfXworCisjZW5kaWYKKworI2lmZGVmIENMQVJBX0NPTkZJR19NQUlOX05PVF9ERUZJTkVECisjICB1bmRlZiBDTEFSQV9DT05GSUdfTUFJTgorI2VuZGlmCisKKy8vLy8vLworCisvLyBJZiB0aGlzIGNvbmZpZyBpZGVudGlmaWVyIGlzIGRlZmluZWQgdGhlbiBhbGwgQ0FUQ0ggbWFjcm9zIGFyZSBwcmVmaXhlZCB3aXRoIENBVENIXworI2lmZGVmIENBVENIX0NPTkZJR19QUkVGSVhfQUxMCisKKyNpZiBkZWZpbmVkKENBVENIX0NPTkZJR19GQVNUX0NPTVBJTEUpCisjZGVmaW5lIENBVENIX1JFUVVJUkUoIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9URVNUX05PX1RSWSggIkNBVENIX1JFUVVJUkUiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgZXhwciApCisjZGVmaW5lIENBVENIX1JFUVVJUkVfRkFMU0UoIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9URVNUX05PX1RSWSggIkNBVENIX1JFUVVJUkVfRkFMU0UiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCB8IENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6RmFsc2VUZXN0LCBleHByICkKKyNlbHNlCisjZGVmaW5lIENBVENIX1JFUVVJUkUoIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9URVNUKCAiQ0FUQ0hfUkVRVUlSRSIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBleHByICkKKyNkZWZpbmUgQ0FUQ0hfUkVRVUlSRV9GQUxTRSggZXhwciApIElOVEVSTkFMX0NBVENIX1RFU1QoICJDQVRDSF9SRVFVSVJFX0ZBTFNFIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwgfCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkZhbHNlVGVzdCwgZXhwciAgKQorI2VuZGlmCisKKyNkZWZpbmUgQ0FUQ0hfUkVRVUlSRV9USFJPV1MoIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9USFJPV1MoICJDQVRDSF9SRVFVSVJFX1RIUk9XUyIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCAiIiwgZXhwciApCisjZGVmaW5lIENBVENIX1JFUVVJUkVfVEhST1dTX0FTKCBleHByLCBleGNlcHRpb25UeXBlICkgSU5URVJOQUxfQ0FUQ0hfVEhST1dTX0FTKCAiQ0FUQ0hfUkVRVUlSRV9USFJPV1NfQVMiLCBleGNlcHRpb25UeXBlLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgZXhwciApCisjZGVmaW5lIENBVENIX1JFUVVJUkVfVEhST1dTX1dJVEgoIGV4cHIsIG1hdGNoZXIgKSBJTlRFUk5BTF9DQVRDSF9USFJPV1MoICJDQVRDSF9SRVFVSVJFX1RIUk9XU19XSVRIIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIG1hdGNoZXIsIGV4cHIgKQorI2RlZmluZSBDQVRDSF9SRVFVSVJFX05PVEhST1coIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9OT19USFJPVyggIkNBVENIX1JFUVVJUkVfTk9USFJPVyIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBleHByICkKKworI2RlZmluZSBDQVRDSF9DSEVDSyggZXhwciApIElOVEVSTkFMX0NBVENIX1RFU1QoICJDQVRDSF9DSEVDSyIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIGV4cHIgKQorI2RlZmluZSBDQVRDSF9DSEVDS19GQUxTRSggZXhwciApIElOVEVSTkFMX0NBVENIX1RFU1QoICJDQVRDSF9DSEVDS19GQUxTRSIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUgfCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkZhbHNlVGVzdCwgZXhwciApCisjZGVmaW5lIENBVENIX0NIRUNLRURfSUYoIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9JRiggIkNBVENIX0NIRUNLRURfSUYiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBleHByICkKKyNkZWZpbmUgQ0FUQ0hfQ0hFQ0tFRF9FTFNFKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfRUxTRSggIkNBVENIX0NIRUNLRURfRUxTRSIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIGV4cHIgKQorI2RlZmluZSBDQVRDSF9DSEVDS19OT0ZBSUwoIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9URVNUKCAiQ0FUQ0hfQ0hFQ0tfTk9GQUlMIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSB8IENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6U3VwcHJlc3NGYWlsLCBleHByICkKKworI2RlZmluZSBDQVRDSF9DSEVDS19USFJPV1MoIGV4cHIgKSAgSU5URVJOQUxfQ0FUQ0hfVEhST1dTKCAiQ0FUQ0hfQ0hFQ0tfVEhST1dTIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgIiIsIGV4cHIgKQorI2RlZmluZSBDQVRDSF9DSEVDS19USFJPV1NfQVMoIGV4cHIsIGV4Y2VwdGlvblR5cGUgKSBJTlRFUk5BTF9DQVRDSF9USFJPV1NfQVMoICJDQVRDSF9DSEVDS19USFJPV1NfQVMiLCBleGNlcHRpb25UeXBlLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBleHByICkKKyNkZWZpbmUgQ0FUQ0hfQ0hFQ0tfVEhST1dTX1dJVEgoIGV4cHIsIG1hdGNoZXIgKSBJTlRFUk5BTF9DQVRDSF9USFJPV1MoICJDQVRDSF9DSEVDS19USFJPV1NfV0lUSCIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIG1hdGNoZXIsIGV4cHIgKQorI2RlZmluZSBDQVRDSF9DSEVDS19OT1RIUk9XKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfTk9fVEhST1coICJDQVRDSF9DSEVDS19OT1RIUk9XIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgZXhwciApCisKKyNkZWZpbmUgQ0FUQ0hfQ0hFQ0tfVEhBVCggYXJnLCBtYXRjaGVyICkgSU5URVJOQUxfQ0hFQ0tfVEhBVCggIkNBVENIX0NIRUNLX1RIQVQiLCBtYXRjaGVyLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBhcmcgKQorCisjaWYgZGVmaW5lZChDQVRDSF9DT05GSUdfRkFTVF9DT01QSUxFKQorI2RlZmluZSBDQVRDSF9SRVFVSVJFX1RIQVQoIGFyZywgbWF0Y2hlciApIElOVEVSTkFMX0NIRUNLX1RIQVRfTk9fVFJZKCAiQ0FUQ0hfUkVRVUlSRV9USEFUIiwgbWF0Y2hlciwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIGFyZyApCisjZWxzZQorI2RlZmluZSBDQVRDSF9SRVFVSVJFX1RIQVQoIGFyZywgbWF0Y2hlciApIElOVEVSTkFMX0NIRUNLX1RIQVQoICJDQVRDSF9SRVFVSVJFX1RIQVQiLCBtYXRjaGVyLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgYXJnICkKKyNlbmRpZgorCisjZGVmaW5lIENBVENIX0lORk8oIG1zZyApIElOVEVSTkFMX0NBVENIX0lORk8oICJDQVRDSF9JTkZPIiwgbXNnICkKKyNkZWZpbmUgQ0FUQ0hfV0FSTiggbXNnICkgSU5URVJOQUxfQ0FUQ0hfTVNHKCAiQ0FUQ0hfV0FSTiIsIENhdGNoOjpSZXN1bHRXYXM6Oldhcm5pbmcsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIG1zZyApCisjZGVmaW5lIENBVENIX1NDT1BFRF9JTkZPKCBtc2cgKSBJTlRFUk5BTF9DQVRDSF9JTkZPKCAiQ0FUQ0hfSU5GTyIsIG1zZyApCisjZGVmaW5lIENBVENIX0NBUFRVUkUoIG1zZyApIElOVEVSTkFMX0NBVENIX0lORk8oICJDQVRDSF9DQVBUVVJFIiwgI21zZyAiIDo9ICIgPDwgQ2F0Y2g6OnRvU3RyaW5nKG1zZykgKQorI2RlZmluZSBDQVRDSF9TQ09QRURfQ0FQVFVSRSggbXNnICkgSU5URVJOQUxfQ0FUQ0hfSU5GTyggIkNBVENIX0NBUFRVUkUiLCAjbXNnICIgOj0gIiA8PCBDYXRjaDo6dG9TdHJpbmcobXNnKSApCisKKyNpZmRlZiBDQVRDSF9DT05GSUdfVkFSSUFESUNfTUFDUk9TCisgICAgI2RlZmluZSBDQVRDSF9URVNUX0NBU0UoIC4uLiApIElOVEVSTkFMX0NBVENIX1RFU1RDQVNFKCBfX1ZBX0FSR1NfXyApCisgICAgI2RlZmluZSBDQVRDSF9URVNUX0NBU0VfTUVUSE9EKCBjbGFzc05hbWUsIC4uLiApIElOVEVSTkFMX0NBVENIX1RFU1RfQ0FTRV9NRVRIT0QoIGNsYXNzTmFtZSwgX19WQV9BUkdTX18gKQorICAgICNkZWZpbmUgQ0FUQ0hfTUVUSE9EX0FTX1RFU1RfQ0FTRSggbWV0aG9kLCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9NRVRIT0RfQVNfVEVTVF9DQVNFKCBtZXRob2QsIF9fVkFfQVJHU19fICkKKyAgICAjZGVmaW5lIENBVENIX1JFR0lTVEVSX1RFU1RfQ0FTRSggRnVuY3Rpb24sIC4uLiApIElOVEVSTkFMX0NBVENIX1JFR0lTVEVSX1RFU1RDQVNFKCBGdW5jdGlvbiwgX19WQV9BUkdTX18gKQorICAgICNkZWZpbmUgQ0FUQ0hfU0VDVElPTiggLi4uICkgSU5URVJOQUxfQ0FUQ0hfU0VDVElPTiggX19WQV9BUkdTX18gKQorICAgICNkZWZpbmUgQ0FUQ0hfRkFJTCggLi4uICkgSU5URVJOQUxfQ0FUQ0hfTVNHKCAiQ0FUQ0hfRkFJTCIsIENhdGNoOjpSZXN1bHRXYXM6OkV4cGxpY2l0RmFpbHVyZSwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIF9fVkFfQVJHU19fICkKKyAgICAjZGVmaW5lIENBVENIX0ZBSUxfQ0hFQ0soIC4uLiApIElOVEVSTkFMX0NBVENIX01TRyggIkNBVENIX0ZBSUxfQ0hFQ0siLCBDYXRjaDo6UmVzdWx0V2FzOjpFeHBsaWNpdEZhaWx1cmUsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIF9fVkFfQVJHU19fICkKKyAgICAjZGVmaW5lIENBVENIX1NVQ0NFRUQoIC4uLiApIElOVEVSTkFMX0NBVENIX01TRyggIkNBVENIX1NVQ0NFRUQiLCBDYXRjaDo6UmVzdWx0V2FzOjpPaywgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgX19WQV9BUkdTX18gKQorI2Vsc2UKKyAgICAjZGVmaW5lIENBVENIX1RFU1RfQ0FTRSggbmFtZSwgZGVzY3JpcHRpb24gKSBJTlRFUk5BTF9DQVRDSF9URVNUQ0FTRSggbmFtZSwgZGVzY3JpcHRpb24gKQorICAgICNkZWZpbmUgQ0FUQ0hfVEVTVF9DQVNFX01FVEhPRCggY2xhc3NOYW1lLCBuYW1lLCBkZXNjcmlwdGlvbiApIElOVEVSTkFMX0NBVENIX1RFU1RfQ0FTRV9NRVRIT0QoIGNsYXNzTmFtZSwgbmFtZSwgZGVzY3JpcHRpb24gKQorICAgICNkZWZpbmUgQ0FUQ0hfTUVUSE9EX0FTX1RFU1RfQ0FTRSggbWV0aG9kLCBuYW1lLCBkZXNjcmlwdGlvbiApIElOVEVSTkFMX0NBVENIX01FVEhPRF9BU19URVNUX0NBU0UoIG1ldGhvZCwgbmFtZSwgZGVzY3JpcHRpb24gKQorICAgICNkZWZpbmUgQ0FUQ0hfUkVHSVNURVJfVEVTVF9DQVNFKCBmdW5jdGlvbiwgbmFtZSwgZGVzY3JpcHRpb24gKSBJTlRFUk5BTF9DQVRDSF9SRUdJU1RFUl9URVNUQ0FTRSggZnVuY3Rpb24sIG5hbWUsIGRlc2NyaXB0aW9uICkKKyAgICAjZGVmaW5lIENBVENIX1NFQ1RJT04oIG5hbWUsIGRlc2NyaXB0aW9uICkgSU5URVJOQUxfQ0FUQ0hfU0VDVElPTiggbmFtZSwgZGVzY3JpcHRpb24gKQorICAgICNkZWZpbmUgQ0FUQ0hfRkFJTCggbXNnICkgSU5URVJOQUxfQ0FUQ0hfTVNHKCAiQ0FUQ0hfRkFJTCIsIENhdGNoOjpSZXN1bHRXYXM6OkV4cGxpY2l0RmFpbHVyZSwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIG1zZyApCisgICAgI2RlZmluZSBDQVRDSF9GQUlMX0NIRUNLKCBtc2cgKSBJTlRFUk5BTF9DQVRDSF9NU0coICJDQVRDSF9GQUlMX0NIRUNLIiwgQ2F0Y2g6OlJlc3VsdFdhczo6RXhwbGljaXRGYWlsdXJlLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBtc2cgKQorICAgICNkZWZpbmUgQ0FUQ0hfU1VDQ0VFRCggbXNnICkgSU5URVJOQUxfQ0FUQ0hfTVNHKCAiQ0FUQ0hfU1VDQ0VFRCIsIENhdGNoOjpSZXN1bHRXYXM6Ok9rLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBtc2cgKQorI2VuZGlmCisjZGVmaW5lIENBVENIX0FOT05fVEVTVF9DQVNFKCkgSU5URVJOQUxfQ0FUQ0hfVEVTVENBU0UoICIiLCAiIiApCisKKyNkZWZpbmUgQ0FUQ0hfUkVHSVNURVJfUkVQT1JURVIoIG5hbWUsIHJlcG9ydGVyVHlwZSApIElOVEVSTkFMX0NBVENIX1JFR0lTVEVSX1JFUE9SVEVSKCBuYW1lLCByZXBvcnRlclR5cGUgKQorI2RlZmluZSBDQVRDSF9SRUdJU1RFUl9MRUdBQ1lfUkVQT1JURVIoIG5hbWUsIHJlcG9ydGVyVHlwZSApIElOVEVSTkFMX0NBVENIX1JFR0lTVEVSX0xFR0FDWV9SRVBPUlRFUiggbmFtZSwgcmVwb3J0ZXJUeXBlICkKKworI2RlZmluZSBDQVRDSF9HRU5FUkFURSggZXhwcikgSU5URVJOQUxfQ0FUQ0hfR0VORVJBVEUoIGV4cHIgKQorCisvLyAiQkRELXN0eWxlIiBjb252ZW5pZW5jZSB3cmFwcGVycworI2lmZGVmIENBVENIX0NPTkZJR19WQVJJQURJQ19NQUNST1MKKyNkZWZpbmUgQ0FUQ0hfU0NFTkFSSU8oIC4uLiApIENBVENIX1RFU1RfQ0FTRSggIlNjZW5hcmlvOiAiIF9fVkFfQVJHU19fICkKKyNkZWZpbmUgQ0FUQ0hfU0NFTkFSSU9fTUVUSE9EKCBjbGFzc05hbWUsIC4uLiApIElOVEVSTkFMX0NBVENIX1RFU1RfQ0FTRV9NRVRIT0QoIGNsYXNzTmFtZSwgIlNjZW5hcmlvOiAiIF9fVkFfQVJHU19fICkKKyNlbHNlCisjZGVmaW5lIENBVENIX1NDRU5BUklPKCBuYW1lLCB0YWdzICkgQ0FUQ0hfVEVTVF9DQVNFKCAiU2NlbmFyaW86ICIgbmFtZSwgdGFncyApCisjZGVmaW5lIENBVENIX1NDRU5BUklPX01FVEhPRCggY2xhc3NOYW1lLCBuYW1lLCB0YWdzICkgSU5URVJOQUxfQ0FUQ0hfVEVTVF9DQVNFX01FVEhPRCggY2xhc3NOYW1lLCAiU2NlbmFyaW86ICIgbmFtZSwgdGFncyApCisjZW5kaWYKKyNkZWZpbmUgQ0FUQ0hfR0lWRU4oIGRlc2MgKSAgICBDQVRDSF9TRUNUSU9OKCBzdGQ6OnN0cmluZyggIkdpdmVuOiAiKSArIGRlc2MsICIiICkKKyNkZWZpbmUgQ0FUQ0hfV0hFTiggZGVzYyApICAgICBDQVRDSF9TRUNUSU9OKCBzdGQ6OnN0cmluZyggIiBXaGVuOiAiKSArIGRlc2MsICIiICkKKyNkZWZpbmUgQ0FUQ0hfQU5EX1dIRU4oIGRlc2MgKSBDQVRDSF9TRUNUSU9OKCBzdGQ6OnN0cmluZyggIiAgQW5kOiAiKSArIGRlc2MsICIiICkKKyNkZWZpbmUgQ0FUQ0hfVEhFTiggZGVzYyApICAgICBDQVRDSF9TRUNUSU9OKCBzdGQ6OnN0cmluZyggIiBUaGVuOiAiKSArIGRlc2MsICIiICkKKyNkZWZpbmUgQ0FUQ0hfQU5EX1RIRU4oIGRlc2MgKSBDQVRDSF9TRUNUSU9OKCBzdGQ6OnN0cmluZyggIiAgQW5kOiAiKSArIGRlc2MsICIiICkKKworLy8gSWYgQ0FUQ0hfQ09ORklHX1BSRUZJWF9BTEwgaXMgbm90IGRlZmluZWQgdGhlbiB0aGUgQ0FUQ0hfIHByZWZpeCBpcyBub3QgcmVxdWlyZWQKKyNlbHNlCisKKyNpZiBkZWZpbmVkKENBVENIX0NPTkZJR19GQVNUX0NPTVBJTEUpCisjZGVmaW5lIFJFUVVJUkUoIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9URVNUX05PX1RSWSggIlJFUVVJUkUiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgZXhwciApCisjZGVmaW5lIFJFUVVJUkVfRkFMU0UoIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9URVNUX05PX1RSWSggIlJFUVVJUkVfRkFMU0UiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCB8IENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6RmFsc2VUZXN0LCBleHByICkKKworI2Vsc2UKKyNkZWZpbmUgUkVRVUlSRSggZXhwciApIElOVEVSTkFMX0NBVENIX1RFU1QoICJSRVFVSVJFIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIGV4cHIgICkKKyNkZWZpbmUgUkVRVUlSRV9GQUxTRSggZXhwciApIElOVEVSTkFMX0NBVENIX1RFU1QoICJSRVFVSVJFX0ZBTFNFIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwgfCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkZhbHNlVGVzdCwgZXhwciApCisjZW5kaWYKKworI2RlZmluZSBSRVFVSVJFX1RIUk9XUyggZXhwciApIElOVEVSTkFMX0NBVENIX1RIUk9XUyggIlJFUVVJUkVfVEhST1dTIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsICIiLCBleHByICkKKyNkZWZpbmUgUkVRVUlSRV9USFJPV1NfQVMoIGV4cHIsIGV4Y2VwdGlvblR5cGUgKSBJTlRFUk5BTF9DQVRDSF9USFJPV1NfQVMoICJSRVFVSVJFX1RIUk9XU19BUyIsIGV4Y2VwdGlvblR5cGUsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBleHByICkKKyNkZWZpbmUgUkVRVUlSRV9USFJPV1NfV0lUSCggZXhwciwgbWF0Y2hlciApIElOVEVSTkFMX0NBVENIX1RIUk9XUyggIlJFUVVJUkVfVEhST1dTX1dJVEgiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgbWF0Y2hlciwgZXhwciApCisjZGVmaW5lIFJFUVVJUkVfTk9USFJPVyggZXhwciApIElOVEVSTkFMX0NBVENIX05PX1RIUk9XKCAiUkVRVUlSRV9OT1RIUk9XIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIGV4cHIgKQorCisjZGVmaW5lIENIRUNLKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfVEVTVCggIkNIRUNLIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgZXhwciApCisjZGVmaW5lIENIRUNLX0ZBTFNFKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfVEVTVCggIkNIRUNLX0ZBTFNFIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSB8IENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6RmFsc2VUZXN0LCBleHByICkKKyNkZWZpbmUgQ0hFQ0tFRF9JRiggZXhwciApIElOVEVSTkFMX0NBVENIX0lGKCAiQ0hFQ0tFRF9JRiIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIGV4cHIgKQorI2RlZmluZSBDSEVDS0VEX0VMU0UoIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9FTFNFKCAiQ0hFQ0tFRF9FTFNFIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgZXhwciApCisjZGVmaW5lIENIRUNLX05PRkFJTCggZXhwciApIElOVEVSTkFMX0NBVENIX1RFU1QoICJDSEVDS19OT0ZBSUwiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlIHwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpTdXBwcmVzc0ZhaWwsIGV4cHIgKQorCisjZGVmaW5lIENIRUNLX1RIUk9XUyggZXhwciApICBJTlRFUk5BTF9DQVRDSF9USFJPV1MoICJDSEVDS19USFJPV1MiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCAiIiwgZXhwciApCisjZGVmaW5lIENIRUNLX1RIUk9XU19BUyggZXhwciwgZXhjZXB0aW9uVHlwZSApIElOVEVSTkFMX0NBVENIX1RIUk9XU19BUyggIkNIRUNLX1RIUk9XU19BUyIsIGV4Y2VwdGlvblR5cGUsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIGV4cHIgKQorI2RlZmluZSBDSEVDS19USFJPV1NfV0lUSCggZXhwciwgbWF0Y2hlciApIElOVEVSTkFMX0NBVENIX1RIUk9XUyggIkNIRUNLX1RIUk9XU19XSVRIIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgbWF0Y2hlciwgZXhwciApCisjZGVmaW5lIENIRUNLX05PVEhST1coIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9OT19USFJPVyggIkNIRUNLX05PVEhST1ciLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBleHByICkKKworI2RlZmluZSBDSEVDS19USEFUKCBhcmcsIG1hdGNoZXIgKSBJTlRFUk5BTF9DSEVDS19USEFUKCAiQ0hFQ0tfVEhBVCIsIG1hdGNoZXIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIGFyZyApCisKKyNpZiBkZWZpbmVkKENBVENIX0NPTkZJR19GQVNUX0NPTVBJTEUpCisjZGVmaW5lIFJFUVVJUkVfVEhBVCggYXJnLCBtYXRjaGVyICkgSU5URVJOQUxfQ0hFQ0tfVEhBVF9OT19UUlkoICJSRVFVSVJFX1RIQVQiLCBtYXRjaGVyLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgYXJnICkKKyNlbHNlCisjZGVmaW5lIFJFUVVJUkVfVEhBVCggYXJnLCBtYXRjaGVyICkgSU5URVJOQUxfQ0hFQ0tfVEhBVCggIlJFUVVJUkVfVEhBVCIsIG1hdGNoZXIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBhcmcgKQorI2VuZGlmCisKKyNkZWZpbmUgSU5GTyggbXNnICkgSU5URVJOQUxfQ0FUQ0hfSU5GTyggIklORk8iLCBtc2cgKQorI2RlZmluZSBXQVJOKCBtc2cgKSBJTlRFUk5BTF9DQVRDSF9NU0coICJXQVJOIiwgQ2F0Y2g6OlJlc3VsdFdhczo6V2FybmluZywgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgbXNnICkKKyNkZWZpbmUgU0NPUEVEX0lORk8oIG1zZyApIElOVEVSTkFMX0NBVENIX0lORk8oICJJTkZPIiwgbXNnICkKKyNkZWZpbmUgQ0FQVFVSRSggbXNnICkgSU5URVJOQUxfQ0FUQ0hfSU5GTyggIkNBUFRVUkUiLCAjbXNnICIgOj0gIiA8PCBDYXRjaDo6dG9TdHJpbmcobXNnKSApCisjZGVmaW5lIFNDT1BFRF9DQVBUVVJFKCBtc2cgKSBJTlRFUk5BTF9DQVRDSF9JTkZPKCAiQ0FQVFVSRSIsICNtc2cgIiA6PSAiIDw8IENhdGNoOjp0b1N0cmluZyhtc2cpICkKKworI2lmZGVmIENBVENIX0NPTkZJR19WQVJJQURJQ19NQUNST1MKKyNkZWZpbmUgVEVTVF9DQVNFKCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9URVNUQ0FTRSggX19WQV9BUkdTX18gKQorI2RlZmluZSBURVNUX0NBU0VfTUVUSE9EKCBjbGFzc05hbWUsIC4uLiApIElOVEVSTkFMX0NBVENIX1RFU1RfQ0FTRV9NRVRIT0QoIGNsYXNzTmFtZSwgX19WQV9BUkdTX18gKQorI2RlZmluZSBNRVRIT0RfQVNfVEVTVF9DQVNFKCBtZXRob2QsIC4uLiApIElOVEVSTkFMX0NBVENIX01FVEhPRF9BU19URVNUX0NBU0UoIG1ldGhvZCwgX19WQV9BUkdTX18gKQorI2RlZmluZSBSRUdJU1RFUl9URVNUX0NBU0UoIEZ1bmN0aW9uLCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9SRUdJU1RFUl9URVNUQ0FTRSggRnVuY3Rpb24sIF9fVkFfQVJHU19fICkKKyNkZWZpbmUgU0VDVElPTiggLi4uICkgSU5URVJOQUxfQ0FUQ0hfU0VDVElPTiggX19WQV9BUkdTX18gKQorI2RlZmluZSBGQUlMKCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9NU0coICJGQUlMIiwgQ2F0Y2g6OlJlc3VsdFdhczo6RXhwbGljaXRGYWlsdXJlLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgX19WQV9BUkdTX18gKQorI2RlZmluZSBGQUlMX0NIRUNLKCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9NU0coICJGQUlMX0NIRUNLIiwgQ2F0Y2g6OlJlc3VsdFdhczo6RXhwbGljaXRGYWlsdXJlLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIFNVQ0NFRUQoIC4uLiApIElOVEVSTkFMX0NBVENIX01TRyggIlNVQ0NFRUQiLCBDYXRjaDo6UmVzdWx0V2FzOjpPaywgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgX19WQV9BUkdTX18gKQorI2Vsc2UKKyNkZWZpbmUgVEVTVF9DQVNFKCBuYW1lLCBkZXNjcmlwdGlvbiApIElOVEVSTkFMX0NBVENIX1RFU1RDQVNFKCBuYW1lLCBkZXNjcmlwdGlvbiApCisgICAgI2RlZmluZSBURVNUX0NBU0VfTUVUSE9EKCBjbGFzc05hbWUsIG5hbWUsIGRlc2NyaXB0aW9uICkgSU5URVJOQUxfQ0FUQ0hfVEVTVF9DQVNFX01FVEhPRCggY2xhc3NOYW1lLCBuYW1lLCBkZXNjcmlwdGlvbiApCisgICAgI2RlZmluZSBNRVRIT0RfQVNfVEVTVF9DQVNFKCBtZXRob2QsIG5hbWUsIGRlc2NyaXB0aW9uICkgSU5URVJOQUxfQ0FUQ0hfTUVUSE9EX0FTX1RFU1RfQ0FTRSggbWV0aG9kLCBuYW1lLCBkZXNjcmlwdGlvbiApCisgICAgI2RlZmluZSBSRUdJU1RFUl9URVNUX0NBU0UoIG1ldGhvZCwgbmFtZSwgZGVzY3JpcHRpb24gKSBJTlRFUk5BTF9DQVRDSF9SRUdJU1RFUl9URVNUQ0FTRSggbWV0aG9kLCBuYW1lLCBkZXNjcmlwdGlvbiApCisgICAgI2RlZmluZSBTRUNUSU9OKCBuYW1lLCBkZXNjcmlwdGlvbiApIElOVEVSTkFMX0NBVENIX1NFQ1RJT04oIG5hbWUsIGRlc2NyaXB0aW9uICkKKyAgICAjZGVmaW5lIEZBSUwoIG1zZyApIElOVEVSTkFMX0NBVENIX01TRyggIkZBSUwiLCBDYXRjaDo6UmVzdWx0V2FzOjpFeHBsaWNpdEZhaWx1cmUsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBtc2cgKQorICAgICNkZWZpbmUgRkFJTF9DSEVDSyggbXNnICkgSU5URVJOQUxfQ0FUQ0hfTVNHKCAiRkFJTF9DSEVDSyIsIENhdGNoOjpSZXN1bHRXYXM6OkV4cGxpY2l0RmFpbHVyZSwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgbXNnICkKKyAgICAjZGVmaW5lIFNVQ0NFRUQoIG1zZyApIElOVEVSTkFMX0NBVENIX01TRyggIlNVQ0NFRUQiLCBDYXRjaDo6UmVzdWx0V2FzOjpPaywgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgbXNnICkKKyNlbmRpZgorI2RlZmluZSBBTk9OX1RFU1RfQ0FTRSgpIElOVEVSTkFMX0NBVENIX1RFU1RDQVNFKCAiIiwgIiIgKQorCisjZGVmaW5lIFJFR0lTVEVSX1JFUE9SVEVSKCBuYW1lLCByZXBvcnRlclR5cGUgKSBJTlRFUk5BTF9DQVRDSF9SRUdJU1RFUl9SRVBPUlRFUiggbmFtZSwgcmVwb3J0ZXJUeXBlICkKKyNkZWZpbmUgUkVHSVNURVJfTEVHQUNZX1JFUE9SVEVSKCBuYW1lLCByZXBvcnRlclR5cGUgKSBJTlRFUk5BTF9DQVRDSF9SRUdJU1RFUl9MRUdBQ1lfUkVQT1JURVIoIG5hbWUsIHJlcG9ydGVyVHlwZSApCisKKyNkZWZpbmUgR0VORVJBVEUoIGV4cHIpIElOVEVSTkFMX0NBVENIX0dFTkVSQVRFKCBleHByICkKKworI2VuZGlmCisKKyNkZWZpbmUgQ0FUQ0hfVFJBTlNMQVRFX0VYQ0VQVElPTiggc2lnbmF0dXJlICkgSU5URVJOQUxfQ0FUQ0hfVFJBTlNMQVRFX0VYQ0VQVElPTiggc2lnbmF0dXJlICkKKworLy8gIkJERC1zdHlsZSIgY29udmVuaWVuY2Ugd3JhcHBlcnMKKyNpZmRlZiBDQVRDSF9DT05GSUdfVkFSSUFESUNfTUFDUk9TCisjZGVmaW5lIFNDRU5BUklPKCAuLi4gKSBURVNUX0NBU0UoICJTY2VuYXJpbzogIiBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIFNDRU5BUklPX01FVEhPRCggY2xhc3NOYW1lLCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9URVNUX0NBU0VfTUVUSE9EKCBjbGFzc05hbWUsICJTY2VuYXJpbzogIiBfX1ZBX0FSR1NfXyApCisjZWxzZQorI2RlZmluZSBTQ0VOQVJJTyggbmFtZSwgdGFncyApIFRFU1RfQ0FTRSggIlNjZW5hcmlvOiAiIG5hbWUsIHRhZ3MgKQorI2RlZmluZSBTQ0VOQVJJT19NRVRIT0QoIGNsYXNzTmFtZSwgbmFtZSwgdGFncyApIElOVEVSTkFMX0NBVENIX1RFU1RfQ0FTRV9NRVRIT0QoIGNsYXNzTmFtZSwgIlNjZW5hcmlvOiAiIG5hbWUsIHRhZ3MgKQorI2VuZGlmCisjZGVmaW5lIEdJVkVOKCBkZXNjICkgICAgU0VDVElPTiggc3RkOjpzdHJpbmcoIiAgIEdpdmVuOiAiKSArIGRlc2MsICIiICkKKyNkZWZpbmUgV0hFTiggZGVzYyApICAgICBTRUNUSU9OKCBzdGQ6OnN0cmluZygiICAgIFdoZW46ICIpICsgZGVzYywgIiIgKQorI2RlZmluZSBBTkRfV0hFTiggZGVzYyApIFNFQ1RJT04oIHN0ZDo6c3RyaW5nKCJBbmQgd2hlbjogIikgKyBkZXNjLCAiIiApCisjZGVmaW5lIFRIRU4oIGRlc2MgKSAgICAgU0VDVElPTiggc3RkOjpzdHJpbmcoIiAgICBUaGVuOiAiKSArIGRlc2MsICIiICkKKyNkZWZpbmUgQU5EX1RIRU4oIGRlc2MgKSBTRUNUSU9OKCBzdGQ6OnN0cmluZygiICAgICBBbmQ6ICIpICsgZGVzYywgIiIgKQorCit1c2luZyBDYXRjaDo6RGV0YWlsOjpBcHByb3g7CisKKyNlbmRpZiAvLyBUV09CTFVFQ1VCRVNfU0lOR0xFX0lOQ0xVREVfQ0FUQ0hfSFBQX0lOQ0xVREVECisKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0cy9uZXRjb3JlL3RfbmV0Y29yZV9nZW5lcmF0b3JfZnVuY3Rpb25hbF90ZXN0cy5jYyBiL2NvbXBpbGVyL2NwcC90ZXN0cy9uZXRjb3JlL3RfbmV0Y29yZV9nZW5lcmF0b3JfZnVuY3Rpb25hbF90ZXN0cy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjhjODM3Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3RzL25ldGNvcmUvdF9uZXRjb3JlX2dlbmVyYXRvcl9mdW5jdGlvbmFsX3Rlc3RzLmNjCkBAIC0wLDAgKzEsMzM5IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiLi4vY2F0Y2gvY2F0Y2guaHBwIgorI2luY2x1ZGUgPHRocmlmdC9wYXJzZS90X3Byb2dyYW0uaD4KKyNpbmNsdWRlIDx0aHJpZnQvZ2VuZXJhdGUvdF9uZXRjb3JlX2dlbmVyYXRvci5oPgorI2luY2x1ZGUgInRfbmV0Y29yZV9nZW5lcmF0b3JfZnVuY3Rpb25hbF90ZXN0c19oZWxwZXJzLmgiCisKK1RFU1RfQ0FTRSggInRfbmV0Y29yZV9nZW5lcmF0b3Igc2hvdWxkIGdlbmVyYXRlIHZhbGlkIGVudW0iLCAiW2Z1bmN0aW9uYWxdIiApCit7CisgICAgc3RyaW5nIHBhdGggPSAiQ2Fzc2FuZHJhVGVzdC50aHJpZnQiOworICAgIHN0cmluZyBuYW1lID0gIm5ldGNvcmUiOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gcGFyc2VkX29wdGlvbnMgPSB7IHsgIndjZiIsICJ3Y2YiIH0gfTsKKyAgICBzdHJpbmcgb3B0aW9uX3N0cmluZyA9ICIiOworCisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gbmV3IHRfcHJvZ3JhbShwYXRoLCBuYW1lKTsKKyAgICB0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4gPSBuZXcgdF9uZXRjb3JlX2dlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9uX3N0cmluZyk7CisKKyAgICBzdGQ6OnBhaXI8c3RyaW5nLCB0X2VudW0qPiBwYWlyID0gVGVzdERhdGFHZW5lcmF0b3I6OmdldF90ZXN0X2VudW1fZGF0YShwcm9ncmFtKTsKKyAgICBzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0ID0gcGFpci5maXJzdDsKKyAgICB0X2VudW0qIHRlc3RfZW51bSA9IHBhaXIuc2Vjb25kOworCisgICAgc3RyaW5nIGZpbGVfcGF0aCA9IHRlc3RfZW51bS0+Z2V0X25hbWUoKSArICIuY3MiOworICAgIG9mc3RyZWFtIG91dDsKKyAgICBvdXQub3BlbihmaWxlX3BhdGguY19zdHIoKSk7CisKKyAgICBSRVFVSVJFX05PVEhST1coZ2VuLT5nZW5lcmF0ZV9lbnVtKG91dCwgdGVzdF9lbnVtKSk7CisKKyAgICBvdXQuY2xvc2UoKTsKKworICAgIHN0ZDo6aWZzdHJlYW0gaWZzKGZpbGVfcGF0aCk7CisgICAgc3RyaW5nIGFjdHVhbF9yZXN1bHQoKHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPihpZnMpKSwgKHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPigpKSk7CisgICAgc3RkOjpyZW1vdmUoZmlsZV9wYXRoLmNfc3RyKCkpOworCisgICAgUkVRVUlSRShleHBlY3RlZF9yZXN1bHQgPT0gYWN0dWFsX3Jlc3VsdCk7CisKKyAgICBkZWxldGUgdGVzdF9lbnVtOworICAgIGRlbGV0ZSBnZW47CisgICAgZGVsZXRlIHByb2dyYW07CQorfQorCitURVNUX0NBU0UoInRfbmV0Y29yZV9nZW5lcmF0b3Igc2hvdWxkIGdlbmVyYXRlIHZhbGlkIHZvaWQiLCAiW2Z1bmN0aW9uYWxdIikKK3sKKyAgICBzdHJpbmcgcGF0aCA9ICJDYXNzYW5kcmFUZXN0LnRocmlmdCI7CisgICAgc3RyaW5nIG5hbWUgPSAibmV0Y29yZSI7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiBwYXJzZWRfb3B0aW9ucyA9IHsgeyAid2NmIiwgIndjZiIgfSB9OworICAgIHN0cmluZyBvcHRpb25fc3RyaW5nID0gIiI7CisKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSBuZXcgdF9wcm9ncmFtKHBhdGgsIG5hbWUpOworICAgIHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbiA9IG5ldyB0X25ldGNvcmVfZ2VuZXJhdG9yKHByb2dyYW0sIHBhcnNlZF9vcHRpb25zLCBvcHRpb25fc3RyaW5nKTsKKworICAgIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBwYWlyID0gVGVzdERhdGFHZW5lcmF0b3I6OmdldF90ZXN0X3ZvaWRfY29uc3RfZGF0YShnZW4pOworICAgIHN0cmluZyBleHBlY3RlZF9yZXN1bHQgPSBwYWlyLmZpcnN0OworICAgIHRfY29uc3QqIGNvbnN0XyA9IHBhaXIuc2Vjb25kOworICAgIHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzXzsKKyAgICBjb25zdHNfLnB1c2hfYmFjayhjb25zdF8pOworCisgICAgc3RyaW5nIGZpbGVfcGF0aCA9IGNvbnN0Xy0+Z2V0X25hbWUoKSArICIuY3MiOworICAgIG9mc3RyZWFtIG91dDsKKyAgICBvdXQub3BlbihmaWxlX3BhdGguY19zdHIoKSk7CisKKyAgICBSRVFVSVJFX1RIUk9XUyhnZW4tPmdlbmVyYXRlX2NvbnN0cyhvdXQsIGNvbnN0c18pKTsKKworICAgIG91dC5jbG9zZSgpOworCisgICAgc3RkOjppZnN0cmVhbSBpZnMoZmlsZV9wYXRoKTsKKyAgICBzdHJpbmcgYWN0dWFsX3Jlc3VsdCgoc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KGlmcykpLCAoc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KCkpKTsKKyAgICBzdGQ6OnJlbW92ZShmaWxlX3BhdGguY19zdHIoKSk7CisKKyAgICBkZWxldGUgY29uc3RfOworICAgIGRlbGV0ZSBnZW47CisgICAgZGVsZXRlIHByb2dyYW07Cit9CisKK1RFU1RfQ0FTRSgidF9uZXRjb3JlX2dlbmVyYXRvciBzaG91bGQgZ2VuZXJhdGUgdmFsaWQgc3RyaW5nIHdpdGggZXNjYXBpbmcga2V5d29yZCIsICJbZnVuY3Rpb25hbF0iKQoreworICAgIHN0cmluZyBwYXRoID0gIkNhc3NhbmRyYVRlc3QudGhyaWZ0IjsKKyAgICBzdHJpbmcgbmFtZSA9ICJuZXRjb3JlIjsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHBhcnNlZF9vcHRpb25zID0geyB7ICJ3Y2YiLCAid2NmIiB9IH07CisgICAgc3RyaW5nIG9wdGlvbl9zdHJpbmcgPSAiIjsKKworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IG5ldyB0X3Byb2dyYW0ocGF0aCwgbmFtZSk7CisgICAgdF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuID0gbmV3IHRfbmV0Y29yZV9nZW5lcmF0b3IocHJvZ3JhbSwgcGFyc2VkX29wdGlvbnMsIG9wdGlvbl9zdHJpbmcpOworICAgIGdlbi0+aW5pdF9nZW5lcmF0b3IoKTsKKworICAgIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBwYWlyID0gVGVzdERhdGFHZW5lcmF0b3I6OmdldF90ZXN0X3N0cmluZ19jb25zdF9kYXRhKGdlbik7CisgICAgc3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCA9IHBhaXIuZmlyc3Q7CisgICAgdF9jb25zdCogY29uc3RfID0gcGFpci5zZWNvbmQ7CisgICAgdmVjdG9yPHRfY29uc3QqPiBjb25zdHNfOworICAgIGNvbnN0c18ucHVzaF9iYWNrKGNvbnN0Xyk7CisKKyAgICBzdHJpbmcgZmlsZV9wYXRoID0gY29uc3RfLT5nZXRfbmFtZSgpICsgIi5jcyI7CisgICAgb2ZzdHJlYW0gb3V0OworICAgIG91dC5vcGVuKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIFJFUVVJUkVfTk9USFJPVyhnZW4tPmdlbmVyYXRlX2NvbnN0cyhvdXQsIGNvbnN0c18pKTsKKworICAgIG91dC5jbG9zZSgpOworCisgICAgc3RkOjppZnN0cmVhbSBpZnMoZmlsZV9wYXRoKTsKKyAgICBzdHJpbmcgYWN0dWFsX3Jlc3VsdCgoc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KGlmcykpLCAoc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KCkpKTsKKyAgICBzdGQ6OnJlbW92ZShmaWxlX3BhdGguY19zdHIoKSk7CisKKyAgICBSRVFVSVJFKGV4cGVjdGVkX3Jlc3VsdCA9PSBhY3R1YWxfcmVzdWx0KTsKKworICAgIGRlbGV0ZSBjb25zdF87CisgICAgZGVsZXRlIGdlbjsKKyAgICBkZWxldGUgcHJvZ3JhbTsKK30KKworVEVTVF9DQVNFKCJ0X25ldGNvcmVfZ2VuZXJhdG9yIHNob3VsZCBnZW5lcmF0ZSB2YWxpZCBib29sIHdpdGggZXNjYXBpbmcga2V5d29yZCIsICJbZnVuY3Rpb25hbF0iKQoreworICAgIHN0cmluZyBwYXRoID0gIkNhc3NhbmRyYVRlc3QudGhyaWZ0IjsKKyAgICBzdHJpbmcgbmFtZSA9ICJuZXRjb3JlIjsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHBhcnNlZF9vcHRpb25zID0geyB7ICJ3Y2YiLCAid2NmIiB9IH07CisgICAgc3RyaW5nIG9wdGlvbl9zdHJpbmcgPSAiIjsKKworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IG5ldyB0X3Byb2dyYW0ocGF0aCwgbmFtZSk7CisgICAgdF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuID0gbmV3IHRfbmV0Y29yZV9nZW5lcmF0b3IocHJvZ3JhbSwgcGFyc2VkX29wdGlvbnMsIG9wdGlvbl9zdHJpbmcpOworICAgIGdlbi0+aW5pdF9nZW5lcmF0b3IoKTsKKworICAgIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBwYWlyID0gVGVzdERhdGFHZW5lcmF0b3I6OmdldF90ZXN0X2Jvb2xfY29uc3RfZGF0YShnZW4pOworICAgIHN0cmluZyBleHBlY3RlZF9yZXN1bHQgPSBwYWlyLmZpcnN0OworICAgIHRfY29uc3QqIGNvbnN0XyA9IHBhaXIuc2Vjb25kOworICAgIHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzXzsKKyAgICBjb25zdHNfLnB1c2hfYmFjayhjb25zdF8pOworCisgICAgc3RyaW5nIGZpbGVfcGF0aCA9IGNvbnN0Xy0+Z2V0X25hbWUoKSArICIuY3MiOworICAgIG9mc3RyZWFtIG91dDsKKyAgICBvdXQub3BlbihmaWxlX3BhdGguY19zdHIoKSk7CisKKyAgICBSRVFVSVJFX05PVEhST1coZ2VuLT5nZW5lcmF0ZV9jb25zdHMob3V0LCBjb25zdHNfKSk7CisKKyAgICBvdXQuY2xvc2UoKTsKKworICAgIHN0ZDo6aWZzdHJlYW0gaWZzKGZpbGVfcGF0aCk7CisgICAgc3RyaW5nIGFjdHVhbF9yZXN1bHQoKHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPihpZnMpKSwgKHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPigpKSk7CisgICAgc3RkOjpyZW1vdmUoZmlsZV9wYXRoLmNfc3RyKCkpOworCisgICAgUkVRVUlSRShleHBlY3RlZF9yZXN1bHQgPT0gYWN0dWFsX3Jlc3VsdCk7CisKKyAgICBkZWxldGUgY29uc3RfOworICAgIGRlbGV0ZSBnZW47CisgICAgZGVsZXRlIHByb2dyYW07Cit9CisKK1RFU1RfQ0FTRSgidF9uZXRjb3JlX2dlbmVyYXRvciBzaG91bGQgZ2VuZXJhdGUgdmFsaWQgc2J5dGUgKGk4KSB3aXRoIGVzY2FwaW5nIGtleXdvcmQiLCAiW2Z1bmN0aW9uYWxdIikKK3sKKyAgICBzdHJpbmcgcGF0aCA9ICJDYXNzYW5kcmFUZXN0LnRocmlmdCI7CisgICAgc3RyaW5nIG5hbWUgPSAibmV0Y29yZSI7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiBwYXJzZWRfb3B0aW9ucyA9IHsgeyAid2NmIiwgIndjZiIgfSB9OworICAgIHN0cmluZyBvcHRpb25fc3RyaW5nID0gIiI7CisKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSBuZXcgdF9wcm9ncmFtKHBhdGgsIG5hbWUpOworICAgIHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbiA9IG5ldyB0X25ldGNvcmVfZ2VuZXJhdG9yKHByb2dyYW0sIHBhcnNlZF9vcHRpb25zLCBvcHRpb25fc3RyaW5nKTsKKyAgICBnZW4tPmluaXRfZ2VuZXJhdG9yKCk7CisKKyAgICBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gcGFpciA9IFRlc3REYXRhR2VuZXJhdG9yOjpnZXRfdGVzdF9pOF9jb25zdF9kYXRhKGdlbik7CisgICAgc3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCA9IHBhaXIuZmlyc3Q7CisgICAgdF9jb25zdCogY29uc3RfID0gcGFpci5zZWNvbmQ7CisgICAgdmVjdG9yPHRfY29uc3QqPiBjb25zdHNfOworICAgIGNvbnN0c18ucHVzaF9iYWNrKGNvbnN0Xyk7CisKKyAgICBzdHJpbmcgZmlsZV9wYXRoID0gY29uc3RfLT5nZXRfbmFtZSgpICsgIi5jcyI7CisgICAgb2ZzdHJlYW0gb3V0OworICAgIG91dC5vcGVuKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIFJFUVVJUkVfTk9USFJPVyhnZW4tPmdlbmVyYXRlX2NvbnN0cyhvdXQsIGNvbnN0c18pKTsKKworICAgIG91dC5jbG9zZSgpOworCisgICAgc3RkOjppZnN0cmVhbSBpZnMoZmlsZV9wYXRoKTsKKyAgICBzdHJpbmcgYWN0dWFsX3Jlc3VsdCgoc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KGlmcykpLCAoc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KCkpKTsKKyAgICBzdGQ6OnJlbW92ZShmaWxlX3BhdGguY19zdHIoKSk7CisKKyAgICBSRVFVSVJFKGV4cGVjdGVkX3Jlc3VsdCA9PSBhY3R1YWxfcmVzdWx0KTsKKworICAgIGRlbGV0ZSBjb25zdF87CisgICAgZGVsZXRlIGdlbjsKKyAgICBkZWxldGUgcHJvZ3JhbTsKK30KKworVEVTVF9DQVNFKCJ0X25ldGNvcmVfZ2VuZXJhdG9yIHNob3VsZCBnZW5lcmF0ZSB2YWxpZCBzaG9ydCAoaTE2KSB3aXRoIGVzY2FwaW5nIGtleXdvcmQiLCAiW2Z1bmN0aW9uYWxdIikKK3sKKyAgICBzdHJpbmcgcGF0aCA9ICJDYXNzYW5kcmFUZXN0LnRocmlmdCI7CisgICAgc3RyaW5nIG5hbWUgPSAibmV0Y29yZSI7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiBwYXJzZWRfb3B0aW9ucyA9IHsgeyAid2NmIiwgIndjZiIgfSB9OworICAgIHN0cmluZyBvcHRpb25fc3RyaW5nID0gIiI7CisKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSBuZXcgdF9wcm9ncmFtKHBhdGgsIG5hbWUpOworICAgIHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbiA9IG5ldyB0X25ldGNvcmVfZ2VuZXJhdG9yKHByb2dyYW0sIHBhcnNlZF9vcHRpb25zLCBvcHRpb25fc3RyaW5nKTsKKyAgICBnZW4tPmluaXRfZ2VuZXJhdG9yKCk7CisKKyAgICBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gcGFpciA9IFRlc3REYXRhR2VuZXJhdG9yOjpnZXRfdGVzdF9pMTZfY29uc3RfZGF0YShnZW4pOworICAgIHN0cmluZyBleHBlY3RlZF9yZXN1bHQgPSBwYWlyLmZpcnN0OworICAgIHRfY29uc3QqIGNvbnN0XyA9IHBhaXIuc2Vjb25kOworICAgIHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzXzsKKyAgICBjb25zdHNfLnB1c2hfYmFjayhjb25zdF8pOworCisgICAgc3RyaW5nIGZpbGVfcGF0aCA9IGNvbnN0Xy0+Z2V0X25hbWUoKSArICIuY3MiOworICAgIG9mc3RyZWFtIG91dDsKKyAgICBvdXQub3BlbihmaWxlX3BhdGguY19zdHIoKSk7CisKKyAgICBSRVFVSVJFX05PVEhST1coZ2VuLT5nZW5lcmF0ZV9jb25zdHMob3V0LCBjb25zdHNfKSk7CisKKyAgICBvdXQuY2xvc2UoKTsKKworICAgIHN0ZDo6aWZzdHJlYW0gaWZzKGZpbGVfcGF0aCk7CisgICAgc3RyaW5nIGFjdHVhbF9yZXN1bHQoKHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPihpZnMpKSwgKHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPigpKSk7CisgICAgc3RkOjpyZW1vdmUoZmlsZV9wYXRoLmNfc3RyKCkpOworCisgICAgUkVRVUlSRShleHBlY3RlZF9yZXN1bHQgPT0gYWN0dWFsX3Jlc3VsdCk7CisKKyAgICBkZWxldGUgY29uc3RfOworICAgIGRlbGV0ZSBnZW47CisgICAgZGVsZXRlIHByb2dyYW07Cit9CisKK1RFU1RfQ0FTRSgidF9uZXRjb3JlX2dlbmVyYXRvciBzaG91bGQgZ2VuZXJhdGUgdmFsaWQgaW50ZWdlciAoaTMyKSB3aXRoIGVzY2FwaW5nIGtleXdvcmQiLCAiW2Z1bmN0aW9uYWxdIikKK3sKKyAgICBzdHJpbmcgcGF0aCA9ICJDYXNzYW5kcmFUZXN0LnRocmlmdCI7CisgICAgc3RyaW5nIG5hbWUgPSAibmV0Y29yZSI7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiBwYXJzZWRfb3B0aW9ucyA9IHsgeyAid2NmIiwgIndjZiIgfSB9OworICAgIHN0cmluZyBvcHRpb25fc3RyaW5nID0gIiI7CisKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSBuZXcgdF9wcm9ncmFtKHBhdGgsIG5hbWUpOworICAgIHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbiA9IG5ldyB0X25ldGNvcmVfZ2VuZXJhdG9yKHByb2dyYW0sIHBhcnNlZF9vcHRpb25zLCBvcHRpb25fc3RyaW5nKTsKKyAgICBnZW4tPmluaXRfZ2VuZXJhdG9yKCk7CisKKyAgICBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gcGFpciA9IFRlc3REYXRhR2VuZXJhdG9yOjpnZXRfdGVzdF9pMzJfY29uc3RfZGF0YShnZW4pOworICAgIHN0cmluZyBleHBlY3RlZF9yZXN1bHQgPSBwYWlyLmZpcnN0OworICAgIHRfY29uc3QqIGNvbnN0XyA9IHBhaXIuc2Vjb25kOworICAgIHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzXzsKKyAgICBjb25zdHNfLnB1c2hfYmFjayhjb25zdF8pOworCisgICAgc3RyaW5nIGZpbGVfcGF0aCA9IGNvbnN0Xy0+Z2V0X25hbWUoKSArICIuY3MiOworICAgIG9mc3RyZWFtIG91dDsKKyAgICBvdXQub3BlbihmaWxlX3BhdGguY19zdHIoKSk7CisKKyAgICBSRVFVSVJFX05PVEhST1coZ2VuLT5nZW5lcmF0ZV9jb25zdHMob3V0LCBjb25zdHNfKSk7CisKKyAgICBvdXQuY2xvc2UoKTsKKworICAgIHN0ZDo6aWZzdHJlYW0gaWZzKGZpbGVfcGF0aCk7CisgICAgc3RyaW5nIGFjdHVhbF9yZXN1bHQoKHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPihpZnMpKSwgKHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPigpKSk7CisgICAgc3RkOjpyZW1vdmUoZmlsZV9wYXRoLmNfc3RyKCkpOworCisgICAgUkVRVUlSRShleHBlY3RlZF9yZXN1bHQgPT0gYWN0dWFsX3Jlc3VsdCk7CisKKyAgICBkZWxldGUgY29uc3RfOworICAgIGRlbGV0ZSBnZW47CisgICAgZGVsZXRlIHByb2dyYW07Cit9CisKK1RFU1RfQ0FTRSgidF9uZXRjb3JlX2dlbmVyYXRvciBzaG91bGQgZ2VuZXJhdGUgdmFsaWQgbG9uZyAoaTY0KSB3aXRoIGVzY2FwaW5nIGtleXdvcmQiLCAiW2Z1bmN0aW9uYWxdIikKK3sKKyAgICBzdHJpbmcgcGF0aCA9ICJDYXNzYW5kcmFUZXN0LnRocmlmdCI7CisgICAgc3RyaW5nIG5hbWUgPSAibmV0Y29yZSI7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiBwYXJzZWRfb3B0aW9ucyA9IHsgeyAid2NmIiwgIndjZiIgfSB9OworICAgIHN0cmluZyBvcHRpb25fc3RyaW5nID0gIiI7CisKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSBuZXcgdF9wcm9ncmFtKHBhdGgsIG5hbWUpOworICAgIHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbiA9IG5ldyB0X25ldGNvcmVfZ2VuZXJhdG9yKHByb2dyYW0sIHBhcnNlZF9vcHRpb25zLCBvcHRpb25fc3RyaW5nKTsKKyAgICBnZW4tPmluaXRfZ2VuZXJhdG9yKCk7CisKKyAgICBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gcGFpciA9IFRlc3REYXRhR2VuZXJhdG9yOjpnZXRfdGVzdF9pNjRfY29uc3RfZGF0YShnZW4pOworICAgIHN0cmluZyBleHBlY3RlZF9yZXN1bHQgPSBwYWlyLmZpcnN0OworICAgIHRfY29uc3QqIGNvbnN0XyA9IHBhaXIuc2Vjb25kOworICAgIHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzXzsKKyAgICBjb25zdHNfLnB1c2hfYmFjayhjb25zdF8pOworCisgICAgc3RyaW5nIGZpbGVfcGF0aCA9IGNvbnN0Xy0+Z2V0X25hbWUoKSArICIuY3MiOworICAgIG9mc3RyZWFtIG91dDsKKyAgICBvdXQub3BlbihmaWxlX3BhdGguY19zdHIoKSk7CisKKyAgICBSRVFVSVJFX05PVEhST1coZ2VuLT5nZW5lcmF0ZV9jb25zdHMob3V0LCBjb25zdHNfKSk7CisKKyAgICBvdXQuY2xvc2UoKTsKKworICAgIHN0ZDo6aWZzdHJlYW0gaWZzKGZpbGVfcGF0aCk7CisgICAgc3RyaW5nIGFjdHVhbF9yZXN1bHQoKHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPihpZnMpKSwgKHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPigpKSk7CisgICAgc3RkOjpyZW1vdmUoZmlsZV9wYXRoLmNfc3RyKCkpOworCisgICAgUkVRVUlSRShleHBlY3RlZF9yZXN1bHQgPT0gYWN0dWFsX3Jlc3VsdCk7CisKKyAgICBkZWxldGUgY29uc3RfOworICAgIGRlbGV0ZSBnZW47CisgICAgZGVsZXRlIHByb2dyYW07Cit9CisKK1RFU1RfQ0FTRSgidF9uZXRjb3JlX2dlbmVyYXRvciBzaG91bGQgZ2VuZXJhdGUgdmFsaWQgZG91YmxlIHdpdGggZXNjYXBpbmcga2V5d29yZCIsICJbZnVuY3Rpb25hbF0iKQoreworICAgIHN0cmluZyBwYXRoID0gIkNhc3NhbmRyYVRlc3QudGhyaWZ0IjsKKyAgICBzdHJpbmcgbmFtZSA9ICJuZXRjb3JlIjsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHBhcnNlZF9vcHRpb25zID0geyB7ICJ3Y2YiLCAid2NmIiB9IH07CisgICAgc3RyaW5nIG9wdGlvbl9zdHJpbmcgPSAiIjsKKworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IG5ldyB0X3Byb2dyYW0ocGF0aCwgbmFtZSk7CisgICAgdF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuID0gbmV3IHRfbmV0Y29yZV9nZW5lcmF0b3IocHJvZ3JhbSwgcGFyc2VkX29wdGlvbnMsIG9wdGlvbl9zdHJpbmcpOworICAgIGdlbi0+aW5pdF9nZW5lcmF0b3IoKTsKKworICAgIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBwYWlyID0gVGVzdERhdGFHZW5lcmF0b3I6OmdldF90ZXN0X2RvdWJsZV9jb25zdF9kYXRhKGdlbik7CisgICAgc3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCA9IHBhaXIuZmlyc3Q7CisgICAgdF9jb25zdCogY29uc3RfID0gcGFpci5zZWNvbmQ7CisgICAgdmVjdG9yPHRfY29uc3QqPiBjb25zdHNfOworICAgIGNvbnN0c18ucHVzaF9iYWNrKGNvbnN0Xyk7CisKKyAgICBzdHJpbmcgZmlsZV9wYXRoID0gY29uc3RfLT5nZXRfbmFtZSgpICsgIi5jcyI7CisgICAgb2ZzdHJlYW0gb3V0OworICAgIG91dC5vcGVuKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIFJFUVVJUkVfTk9USFJPVyhnZW4tPmdlbmVyYXRlX2NvbnN0cyhvdXQsIGNvbnN0c18pKTsKKworICAgIG91dC5jbG9zZSgpOworCisgICAgc3RkOjppZnN0cmVhbSBpZnMoZmlsZV9wYXRoKTsKKyAgICBzdHJpbmcgYWN0dWFsX3Jlc3VsdCgoc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KGlmcykpLCAoc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KCkpKTsKKyAgICBzdGQ6OnJlbW92ZShmaWxlX3BhdGguY19zdHIoKSk7CisKKyAgICBSRVFVSVJFKGV4cGVjdGVkX3Jlc3VsdCA9PSBhY3R1YWxfcmVzdWx0KTsKKworICAgIGRlbGV0ZSBjb25zdF87CisgICAgZGVsZXRlIGdlbjsKKyAgICBkZWxldGUgcHJvZ3JhbTsKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0cy9uZXRjb3JlL3RfbmV0Y29yZV9nZW5lcmF0b3JfZnVuY3Rpb25hbF90ZXN0c19oZWxwZXJzLmNjIGIvY29tcGlsZXIvY3BwL3Rlc3RzL25ldGNvcmUvdF9uZXRjb3JlX2dlbmVyYXRvcl9mdW5jdGlvbmFsX3Rlc3RzX2hlbHBlcnMuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJjMTcwYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0cy9uZXRjb3JlL3RfbmV0Y29yZV9nZW5lcmF0b3JfZnVuY3Rpb25hbF90ZXN0c19oZWxwZXJzLmNjCkBAIC0wLDAgKzEsMjM3IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSA8dGhyaWZ0L3BhcnNlL3RfcHJvZ3JhbS5oPgorI2luY2x1ZGUgInRocmlmdC9jb21tb24uaCIKKyNpbmNsdWRlIDx0aHJpZnQvZ2VuZXJhdGUvdF9uZXRjb3JlX2dlbmVyYXRvci5oPgorI2luY2x1ZGUgInRfbmV0Y29yZV9nZW5lcmF0b3JfZnVuY3Rpb25hbF90ZXN0c19oZWxwZXJzLmgiCisKK2NvbnN0IHN0cmluZyBUZXN0RGF0YUdlbmVyYXRvcjo6REVGQVVMVF9GSUxFX0hFQURFUiA9ICIvKioiICJcbiIKKyAgICAgICAgICAgICIgKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoKSIgIlxuIgorICAgICAgICAgICAgIiAqIiAiXG4iCisgICAgICAgICAgICAiICogRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lORyIgIlxuIgorICAgICAgICAgICAgIiAqICBAZ2VuZXJhdGVkIiAiXG4iCisgICAgICAgICAgICAiICovIjsKKworc3RkOjpwYWlyPHN0cmluZywgdF9lbnVtKj4gVGVzdERhdGFHZW5lcmF0b3I6OmdldF90ZXN0X2VudW1fZGF0YSh0X3Byb2dyYW0qIHByb2dyYW0pCit7CisgICAgc3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCA9IERFRkFVTFRfRklMRV9IRUFERVIgKworICAgICAgICAiXG4iCisgICAgICAgICJcbiIKKyAgICAgICAgIi8vLyA8c3VtbWFyeT5cbiIKKyAgICAgICAgIi8vLyBUZXN0RG9jXG4iCisgICAgICAgICIvLy8gPC9zdW1tYXJ5PlxuIgorICAgICAgICAicHVibGljIGVudW0gVGVzdE5hbWVcbiIKKyAgICAgICAgIntcbiIKKyAgICAgICAgIiAgTm9uZSA9IDAsXG4iCisgICAgICAgICIgIEZpcnN0ID0gMSxcbiIKKyAgICAgICAgIiAgU2Vjb25kID0gMixcbiIKKyAgICAgICAgIn1cbiI7CisKKyAgICB0X2VudW0qIGVudW1fID0gbmV3IHRfZW51bShwcm9ncmFtKTsKKyAgICBlbnVtXy0+c2V0X25hbWUoIlRlc3ROYW1lIik7CisgICAgZW51bV8tPnNldF9kb2MoIlRlc3REb2MiKTsKKyAgICBlbnVtXy0+YXBwZW5kKG5ldyB0X2VudW1fdmFsdWUoIk5vbmUiLCAwKSk7CisgICAgZW51bV8tPmFwcGVuZChuZXcgdF9lbnVtX3ZhbHVlKCJGaXJzdCIsIDEpKTsKKyAgICBlbnVtXy0+YXBwZW5kKG5ldyB0X2VudW1fdmFsdWUoIlNlY29uZCIsIDIpKTsKKworICAgIHJldHVybiBzdGQ6OnBhaXI8c3RyaW5nLCB0X2VudW0qPihleHBlY3RlZF9yZXN1bHQsIGVudW1fKTsKK30KKworc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IFRlc3REYXRhR2VuZXJhdG9yOjpnZXRfdGVzdF92b2lkX2NvbnN0X2RhdGEodF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuKQoreworICAgIHN0cmluZyBleHBlY3RlZF9yZXN1bHQgPSBERUZBVUxUX0ZJTEVfSEVBREVSOworCisgICAgdF90eXBlKiB0eXBlXyA9IG5ldyB0X2Jhc2VfdHlwZSgidm9pZCIsIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQpOworICAgIHR5cGVfLT5zZXRfZG9jKCJUZXN0RG9jIik7CisKKyAgICB0X2NvbnN0X3ZhbHVlKiBjb25zdF92YWx1ZV8gPSBuZXcgdF9jb25zdF92YWx1ZSgpOworICAgIGNvbnN0X3ZhbHVlXy0+c2V0X3N0cmluZygiVm9pZFZhbHVlIik7CisKKyAgICB0X2NvbnN0KiBjb25zdF8gPSBuZXcgdF9jb25zdCh0eXBlXywgInZvaWQiLCBjb25zdF92YWx1ZV8pOworICAgIGNvbnN0Xy0+c2V0X2RvYygiVGVzdERvYyIpOworCisgICAgcmV0dXJuIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPihleHBlY3RlZF9yZXN1bHQsIGNvbnN0Xyk7Cit9CisKK3N0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBUZXN0RGF0YUdlbmVyYXRvcjo6Z2V0X3Rlc3Rfc3RyaW5nX2NvbnN0X2RhdGEodF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuKQoreworICAgIHN0cmluZyBleHBlY3RlZF9yZXN1bHQgPSBERUZBVUxUX0ZJTEVfSEVBREVSICsgIlxuIiArZ2VuLT5uZXRjb3JlX3R5cGVfdXNpbmdzKCkgKyAKKyAgICAgICAgIlxuIgorICAgICAgICAicHVibGljIHN0YXRpYyBjbGFzcyBuZXRjb3JlQ29uc3RhbnRzXG4iCisgICAgICAgICJ7XG4iCisgICAgICAgICIgIC8vLyA8c3VtbWFyeT5cbiIKKyAgICAgICAgIiAgLy8vIFRlc3REb2NcbiIKKyAgICAgICAgIiAgLy8vIDwvc3VtbWFyeT5cbiIKKyAgICAgICAgIiAgcHVibGljIGNvbnN0IHN0cmluZyBAc3RyaW5nID0gXCJTdHJpbmdWYWx1ZVwiO1xuIgorICAgICAgICAifVxuIjsKKworICAgIHRfdHlwZSogdHlwZV8gPSBuZXcgdF9iYXNlX3R5cGUoInN0cmluZyIsIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORyk7CisgICAgdHlwZV8tPnNldF9kb2MoIlRlc3REb2MiKTsKKworICAgIHRfY29uc3RfdmFsdWUqIGNvbnN0X3ZhbHVlXyA9IG5ldyB0X2NvbnN0X3ZhbHVlKCk7CisgICAgY29uc3RfdmFsdWVfLT5zZXRfc3RyaW5nKCJTdHJpbmdWYWx1ZSIpOworCisgICAgdF9jb25zdCogY29uc3RfID0gbmV3IHRfY29uc3QodHlwZV8sICJzdHJpbmciLCBjb25zdF92YWx1ZV8pOworICAgIGNvbnN0Xy0+c2V0X2RvYygiVGVzdERvYyIpOworCisgICAgcmV0dXJuIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPihleHBlY3RlZF9yZXN1bHQsIGNvbnN0Xyk7Cit9CisKK3N0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBUZXN0RGF0YUdlbmVyYXRvcjo6Z2V0X3Rlc3RfYm9vbF9jb25zdF9kYXRhKHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbikKK3sKKyAgICBzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0ID0gREVGQVVMVF9GSUxFX0hFQURFUiArICJcbiIgK2dlbi0+bmV0Y29yZV90eXBlX3VzaW5ncygpICsKKyAgICAgICAgIlxuIgorICAgICAgICAicHVibGljIHN0YXRpYyBjbGFzcyBuZXRjb3JlQ29uc3RhbnRzXG4iCisgICAgICAgICJ7XG4iCisgICAgICAgICIgIC8vLyA8c3VtbWFyeT5cbiIKKyAgICAgICAgIiAgLy8vIFRlc3REb2NcbiIKKyAgICAgICAgIiAgLy8vIDwvc3VtbWFyeT5cbiIKKyAgICAgICAgIiAgcHVibGljIGNvbnN0IGJvb2wgQGJvb2wgPSB0cnVlO1xuIgorICAgICAgICAifVxuIjsKKworICAgIHRfdHlwZSogdHlwZV8gPSBuZXcgdF9iYXNlX3R5cGUoImJvb2wiLCB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MKTsKKyAgICB0eXBlXy0+c2V0X2RvYygiVGVzdERvYyIpOworCisgICAgdF9jb25zdF92YWx1ZSogY29uc3RfdmFsdWVfID0gbmV3IHRfY29uc3RfdmFsdWUoKTsKKyAgICBjb25zdF92YWx1ZV8tPnNldF9pbnRlZ2VyKDEpOworCisgICAgdF9jb25zdCogY29uc3RfID0gbmV3IHRfY29uc3QodHlwZV8sICJib29sIiwgY29uc3RfdmFsdWVfKTsKKyAgICBjb25zdF8tPnNldF9kb2MoIlRlc3REb2MiKTsKKworICAgIHJldHVybiBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4oZXhwZWN0ZWRfcmVzdWx0LCBjb25zdF8pOworfQorCitzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gVGVzdERhdGFHZW5lcmF0b3I6OmdldF90ZXN0X2k4X2NvbnN0X2RhdGEodF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuKQoreworICAgIHN0cmluZyBleHBlY3RlZF9yZXN1bHQgPSBERUZBVUxUX0ZJTEVfSEVBREVSICsgIlxuIiArZ2VuLT5uZXRjb3JlX3R5cGVfdXNpbmdzKCkgKworICAgICAgICAiXG4iCisgICAgICAgICJwdWJsaWMgc3RhdGljIGNsYXNzIG5ldGNvcmVDb25zdGFudHNcbiIKKyAgICAgICAgIntcbiIKKyAgICAgICAgIiAgLy8vIDxzdW1tYXJ5PlxuIgorICAgICAgICAiICAvLy8gVGVzdERvY1xuIgorICAgICAgICAiICAvLy8gPC9zdW1tYXJ5PlxuIgorICAgICAgICAiICBwdWJsaWMgY29uc3Qgc2J5dGUgQHNieXRlID0gMTI3O1xuIgorICAgICAgICAifVxuIjsKKworICAgIHRfdHlwZSogdHlwZV8gPSBuZXcgdF9iYXNlX3R5cGUoIkk4IiwgdF9iYXNlX3R5cGU6OlRZUEVfSTgpOworICAgIHR5cGVfLT5zZXRfZG9jKCJUZXN0RG9jIik7CisKKyAgICB0X2NvbnN0X3ZhbHVlKiBjb25zdF92YWx1ZV8gPSBuZXcgdF9jb25zdF92YWx1ZSgpOworICAgIGNvbnN0X3ZhbHVlXy0+c2V0X2ludGVnZXIoMTI3KTsKKworICAgIHRfY29uc3QqIGNvbnN0XyA9IG5ldyB0X2NvbnN0KHR5cGVfLCAic2J5dGUiLCBjb25zdF92YWx1ZV8pOworICAgIGNvbnN0Xy0+c2V0X2RvYygiVGVzdERvYyIpOworCisgICAgcmV0dXJuIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPihleHBlY3RlZF9yZXN1bHQsIGNvbnN0Xyk7Cit9CisKK3N0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBUZXN0RGF0YUdlbmVyYXRvcjo6Z2V0X3Rlc3RfaTE2X2NvbnN0X2RhdGEodF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuKQoreworICAgIHN0cmluZyBleHBlY3RlZF9yZXN1bHQgPSBERUZBVUxUX0ZJTEVfSEVBREVSICsgIlxuIiArZ2VuLT5uZXRjb3JlX3R5cGVfdXNpbmdzKCkgKworICAgICAgICAiXG4iCisgICAgICAgICJwdWJsaWMgc3RhdGljIGNsYXNzIG5ldGNvcmVDb25zdGFudHNcbiIKKyAgICAgICAgIntcbiIKKyAgICAgICAgIiAgLy8vIDxzdW1tYXJ5PlxuIgorICAgICAgICAiICAvLy8gVGVzdERvY1xuIgorICAgICAgICAiICAvLy8gPC9zdW1tYXJ5PlxuIgorICAgICAgICAiICBwdWJsaWMgY29uc3Qgc2hvcnQgQHNob3J0ID0gMzI3Njc7XG4iCisgICAgICAgICJ9XG4iOworCisgICAgdF90eXBlKiB0eXBlXyA9IG5ldyB0X2Jhc2VfdHlwZSgiaTE2IiwgdF9iYXNlX3R5cGU6OlRZUEVfSTE2KTsKKyAgICB0eXBlXy0+c2V0X2RvYygiVGVzdERvYyIpOworCisgICAgdF9jb25zdF92YWx1ZSogY29uc3RfdmFsdWVfID0gbmV3IHRfY29uc3RfdmFsdWUoKTsKKyAgICBjb25zdF92YWx1ZV8tPnNldF9pbnRlZ2VyKDMyNzY3KTsKKworICAgIHRfY29uc3QqIGNvbnN0XyA9IG5ldyB0X2NvbnN0KHR5cGVfLCAic2hvcnQiLCBjb25zdF92YWx1ZV8pOworICAgIGNvbnN0Xy0+c2V0X2RvYygiVGVzdERvYyIpOworCisgICAgcmV0dXJuIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPihleHBlY3RlZF9yZXN1bHQsIGNvbnN0Xyk7Cit9CisKK3N0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBUZXN0RGF0YUdlbmVyYXRvcjo6Z2V0X3Rlc3RfaTMyX2NvbnN0X2RhdGEodF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuKQoreworICAgIHN0cmluZyBleHBlY3RlZF9yZXN1bHQgPSBERUZBVUxUX0ZJTEVfSEVBREVSICsgIlxuIiArZ2VuLT5uZXRjb3JlX3R5cGVfdXNpbmdzKCkgKworICAgICAgICAiXG4iCisgICAgICAgICJwdWJsaWMgc3RhdGljIGNsYXNzIG5ldGNvcmVDb25zdGFudHNcbiIKKyAgICAgICAgIntcbiIKKyAgICAgICAgIiAgLy8vIDxzdW1tYXJ5PlxuIgorICAgICAgICAiICAvLy8gVGVzdERvY1xuIgorICAgICAgICAiICAvLy8gPC9zdW1tYXJ5PlxuIgorICAgICAgICAiICBwdWJsaWMgY29uc3QgaW50IEBpbnQgPSAyMTQ3NDgzNjQ3O1xuIgorICAgICAgICAifVxuIjsKKworICAgIHRfdHlwZSogdHlwZV8gPSBuZXcgdF9iYXNlX3R5cGUoImkzMiIsIHRfYmFzZV90eXBlOjpUWVBFX0kzMik7CisgICAgdHlwZV8tPnNldF9kb2MoIlRlc3REb2MiKTsKKworICAgIHRfY29uc3RfdmFsdWUqIGNvbnN0X3ZhbHVlXyA9IG5ldyB0X2NvbnN0X3ZhbHVlKCk7CisgICAgY29uc3RfdmFsdWVfLT5zZXRfaW50ZWdlcigyMTQ3NDgzNjQ3KTsKKworICAgIHRfY29uc3QqIGNvbnN0XyA9IG5ldyB0X2NvbnN0KHR5cGVfLCAiaW50IiwgY29uc3RfdmFsdWVfKTsKKyAgICBjb25zdF8tPnNldF9kb2MoIlRlc3REb2MiKTsKKworICAgIHJldHVybiBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4oZXhwZWN0ZWRfcmVzdWx0LCBjb25zdF8pOworfQorCitzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gVGVzdERhdGFHZW5lcmF0b3I6OmdldF90ZXN0X2k2NF9jb25zdF9kYXRhKHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbikKK3sKKyAgICBzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0ID0gREVGQVVMVF9GSUxFX0hFQURFUiArICJcbiIgK2dlbi0+bmV0Y29yZV90eXBlX3VzaW5ncygpICsKKyAgICAgICAgIlxuIgorICAgICAgICAicHVibGljIHN0YXRpYyBjbGFzcyBuZXRjb3JlQ29uc3RhbnRzXG4iCisgICAgICAgICJ7XG4iCisgICAgICAgICIgIC8vLyA8c3VtbWFyeT5cbiIKKyAgICAgICAgIiAgLy8vIFRlc3REb2NcbiIKKyAgICAgICAgIiAgLy8vIDwvc3VtbWFyeT5cbiIKKyAgICAgICAgIiAgcHVibGljIGNvbnN0IGxvbmcgQGxvbmcgPSA5MjIzMzcyMDM2ODU0Nzc1ODA3O1xuIgorICAgICAgICAifVxuIjsKKworICAgIHRfdHlwZSogdHlwZV8gPSBuZXcgdF9iYXNlX3R5cGUoImk2NCIsIHRfYmFzZV90eXBlOjpUWVBFX0k2NCk7CisgICAgdHlwZV8tPnNldF9kb2MoIlRlc3REb2MiKTsKKworICAgIHRfY29uc3RfdmFsdWUqIGNvbnN0X3ZhbHVlXyA9IG5ldyB0X2NvbnN0X3ZhbHVlKCk7CisgICAgY29uc3RfdmFsdWVfLT5zZXRfaW50ZWdlcig5MjIzMzcyMDM2ODU0Nzc1ODA3KTsKKworICAgIHRfY29uc3QqIGNvbnN0XyA9IG5ldyB0X2NvbnN0KHR5cGVfLCAibG9uZyIsIGNvbnN0X3ZhbHVlXyk7CisgICAgY29uc3RfLT5zZXRfZG9jKCJUZXN0RG9jIik7CisKKyAgICByZXR1cm4gc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+KGV4cGVjdGVkX3Jlc3VsdCwgY29uc3RfKTsKK30KKworc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IFRlc3REYXRhR2VuZXJhdG9yOjpnZXRfdGVzdF9kb3VibGVfY29uc3RfZGF0YSh0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4pCit7CisgICAgc3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCA9IERFRkFVTFRfRklMRV9IRUFERVIgKyAiXG4iICtnZW4tPm5ldGNvcmVfdHlwZV91c2luZ3MoKSArCisgICAgICAgICJcbiIKKyAgICAgICAgInB1YmxpYyBzdGF0aWMgY2xhc3MgbmV0Y29yZUNvbnN0YW50c1xuIgorICAgICAgICAie1xuIgorICAgICAgICAiICAvLy8gPHN1bW1hcnk+XG4iCisgICAgICAgICIgIC8vLyBUZXN0RG9jXG4iCisgICAgICAgICIgIC8vLyA8L3N1bW1hcnk+XG4iCisgICAgICAgICIgIHB1YmxpYyBjb25zdCBkb3VibGUgQGRvdWJsZSA9IDkuMjIzMzdlKzE4O1xuIgorICAgICAgICAifVxuIjsKKworICAgIHRfdHlwZSogdHlwZV8gPSBuZXcgdF9iYXNlX3R5cGUoImRvdWJsZSIsIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRSk7CisgICAgdHlwZV8tPnNldF9kb2MoIlRlc3REb2MiKTsKKworICAgIHRfY29uc3RfdmFsdWUqIGNvbnN0X3ZhbHVlXyA9IG5ldyB0X2NvbnN0X3ZhbHVlKCk7CisgICAgY29uc3RfdmFsdWVfLT5zZXRfZG91YmxlKDkyMjMzNzIwMzY4NTQ3NzU4MDcuMSk7CisKKyAgICB0X2NvbnN0KiBjb25zdF8gPSBuZXcgdF9jb25zdCh0eXBlXywgImRvdWJsZSIsIGNvbnN0X3ZhbHVlXyk7CisgICAgY29uc3RfLT5zZXRfZG9jKCJUZXN0RG9jIik7CisKKyAgICByZXR1cm4gc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+KGV4cGVjdGVkX3Jlc3VsdCwgY29uc3RfKTsKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0cy9uZXRjb3JlL3RfbmV0Y29yZV9nZW5lcmF0b3JfZnVuY3Rpb25hbF90ZXN0c19oZWxwZXJzLmggYi9jb21waWxlci9jcHAvdGVzdHMvbmV0Y29yZS90X25ldGNvcmVfZ2VuZXJhdG9yX2Z1bmN0aW9uYWxfdGVzdHNfaGVscGVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ZWFhYzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdHMvbmV0Y29yZS90X25ldGNvcmVfZ2VuZXJhdG9yX2Z1bmN0aW9uYWxfdGVzdHNfaGVscGVycy5oCkBAIC0wLDAgKzEsMzQgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlIDx0aHJpZnQvcGFyc2UvdF9wcm9ncmFtLmg+CisKK2NsYXNzIFRlc3REYXRhR2VuZXJhdG9yCit7CitwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IHN0cmluZyBERUZBVUxUX0ZJTEVfSEVBREVSOworCisgICAgc3RhdGljIHN0ZDo6cGFpcjxzdHJpbmcsIHRfZW51bSo+IGdldF90ZXN0X2VudW1fZGF0YSh0X3Byb2dyYW0qIHByb2dyYW0pOworICAgIHN0YXRpYyBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gZ2V0X3Rlc3Rfdm9pZF9jb25zdF9kYXRhKHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbik7CisgICAgc3RhdGljIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBnZXRfdGVzdF9zdHJpbmdfY29uc3RfZGF0YSh0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4pOworICAgIHN0YXRpYyBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gZ2V0X3Rlc3RfYm9vbF9jb25zdF9kYXRhKHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbik7CisgICAgc3RhdGljIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBnZXRfdGVzdF9pOF9jb25zdF9kYXRhKHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbik7CisgICAgc3RhdGljIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBnZXRfdGVzdF9pMTZfY29uc3RfZGF0YSh0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4pOworICAgIHN0YXRpYyBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gZ2V0X3Rlc3RfaTMyX2NvbnN0X2RhdGEodF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuKTsKKyAgICBzdGF0aWMgc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IGdldF90ZXN0X2k2NF9jb25zdF9kYXRhKHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbik7CisgICAgc3RhdGljIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBnZXRfdGVzdF9kb3VibGVfY29uc3RfZGF0YSh0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4pOworfTsKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0cy9uZXRjb3JlL3RfbmV0Y29yZV9nZW5lcmF0b3JfaGVscGVyc190ZXN0cy5jYyBiL2NvbXBpbGVyL2NwcC90ZXN0cy9uZXRjb3JlL3RfbmV0Y29yZV9nZW5lcmF0b3JfaGVscGVyc190ZXN0cy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmNiZWVkCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3RzL25ldGNvcmUvdF9uZXRjb3JlX2dlbmVyYXRvcl9oZWxwZXJzX3Rlc3RzLmNjCkBAIC0wLDAgKzEsMjA5IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiLi4vY2F0Y2gvY2F0Y2guaHBwIgorI2luY2x1ZGUgPHRocmlmdC9wYXJzZS90X3Byb2dyYW0uaD4KKyNpbmNsdWRlIDx0aHJpZnQvZ2VuZXJhdGUvdF9uZXRjb3JlX2dlbmVyYXRvci5oPgorCit1c2luZyBzdGQ6OnZlY3RvcjsKKworVEVTVF9DQVNFKCJ0X25ldGNvcmVfZ2VuZXJhdG9yOjpuZXRjb3JlX3R5cGVfdXNpbmdzKCkgd2l0aG91dCBvcHRpb24gd2NmIHNob3VsZCByZXR1cm4gdmFsaWQgbmFtZXNwYWNlcyIsICJbaGVscGVyc10iKQoreworICAgIHN0cmluZyBwYXRoID0gIkNhc3NhbmRyYVRlc3QudGhyaWZ0IjsKKyAgICBzdHJpbmcgbmFtZSA9ICJuZXRjb3JlIjsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHBhcnNlZF9vcHRpb25zID0geyB7ICJ1bmlvbiIsICJ1bmlvbiIgfSB9OworICAgIHN0cmluZyBvcHRpb25fc3RyaW5nID0gIiI7CisKKyAgICBzdHJpbmcgZXhwZWN0ZWRfbmFtZXNwYWNlcyA9ICJ1c2luZyBTeXN0ZW07XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnM7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYztcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIFN5c3RlbS5UZXh0O1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgU3lzdGVtLklPO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgU3lzdGVtLlRocmVhZGluZztcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBUaHJpZnQ7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBUaHJpZnQuQ29sbGVjdGlvbnM7XG4iICsgZW5kbDsKKworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IG5ldyB0X3Byb2dyYW0ocGF0aCwgbmFtZSk7CisgICAgdF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuID0gbmV3IHRfbmV0Y29yZV9nZW5lcmF0b3IocHJvZ3JhbSwgcGFyc2VkX29wdGlvbnMsIG9wdGlvbl9zdHJpbmcpOworCisgICAgUkVRVUlSRV9GQUxTRShnZW4tPmlzX3djZl9lbmFibGVkKCkpOworICAgIFJFUVVJUkUoZ2VuLT5uZXRjb3JlX3R5cGVfdXNpbmdzKCkgPT0gZXhwZWN0ZWRfbmFtZXNwYWNlcyk7CisKKyAgICBkZWxldGUgZ2VuOworICAgIGRlbGV0ZSBwcm9ncmFtOworfQorCitURVNUX0NBU0UoInRfbmV0Y29yZV9nZW5lcmF0b3I6Om5ldGNvcmVfdHlwZV91c2luZ3MoKSB3aXRoIG9wdGlvbiB3Y2Ygc2hvdWxkIHJldHVybiB2YWxpZCBuYW1lc3BhY2VzIiwgIltoZWxwZXJzXSIpCit7CisgICAgc3RyaW5nIHBhdGggPSAiQ2Fzc2FuZHJhVGVzdC50aHJpZnQiOworICAgIHN0cmluZyBuYW1lID0gIm5ldGNvcmUiOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gcGFyc2VkX29wdGlvbnMgPSB7IHsgIndjZiIsICJ3Y2YiIH0gfTsKKyAgICBzdHJpbmcgb3B0aW9uX3N0cmluZyA9ICIiOworCisgICAgc3RyaW5nIGV4cGVjdGVkX25hbWVzcGFjZXNfd2NmID0gInVzaW5nIFN5c3RlbTtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnM7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgU3lzdGVtLlRleHQ7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgU3lzdGVtLklPO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIFN5c3RlbS5UaHJlYWRpbmc7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrcztcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBUaHJpZnQ7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgVGhyaWZ0LkNvbGxlY3Rpb25zO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIFN5c3RlbS5TZXJ2aWNlTW9kZWw7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbjtcbiIgKyBlbmRsOworCisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gbmV3IHRfcHJvZ3JhbShwYXRoLCBuYW1lKTsKKyAgICB0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4gPSBuZXcgdF9uZXRjb3JlX2dlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9uX3N0cmluZyk7CisKKyAgICBSRVFVSVJFKGdlbi0+aXNfd2NmX2VuYWJsZWQoKSk7CisgICAgUkVRVUlSRShnZW4tPm5ldGNvcmVfdHlwZV91c2luZ3MoKSA9PSBleHBlY3RlZF9uYW1lc3BhY2VzX3djZik7CisKKyAgICBkZWxldGUgZ2VuOworICAgIGRlbGV0ZSBwcm9ncmFtOworfQorCitURVNUX0NBU0UoInRfbmV0Y29yZV9nZW5lcmF0b3Igc2hvdWxkIGNvbnRhaW5zIGxhdGVzdCBDIyBrZXl3b3JkcyB0byBub3JtYWxpemUgd2l0aCBAIiwgIltoZWxwZXJzXSIpCit7CisgICAgc3RyaW5nIHBhdGggPSAiQ2Fzc2FuZHJhVGVzdC50aHJpZnQiOworICAgIHN0cmluZyBuYW1lID0gIm5ldGNvcmUiOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gcGFyc2VkX29wdGlvbnMgPSB7IHsgIndjZiIsICJ3Y2YiIH0gfTsKKyAgICBzdHJpbmcgb3B0aW9uX3N0cmluZyA9ICIiOworICAgIHZlY3RvcjxzdHJpbmc+IGN1cnJlbnRfa2V5d29yZHMgPSB7CisgICAgICAgIHsgImFic3RyYWN0IiB9LAorICAgICAgICB7ICJhcyIgfSwKKyAgICAgICAgeyAiYmFzZSIgfSwKKyAgICAgICAgeyAiYm9vbCIgfSwKKyAgICAgICAgeyAiYnJlYWsiIH0sCisgICAgICAgIHsgImJ5dGUiIH0sCisgICAgICAgIHsgImNhc2UiIH0sCisgICAgICAgIHsgImNhdGNoIiB9LAorICAgICAgICB7ICJjaGFyIiB9LAorICAgICAgICB7ICJjaGVja2VkIiB9LAorICAgICAgICB7ICJjbGFzcyIgfSwKKyAgICAgICAgeyAiY29uc3QiIH0sCisgICAgICAgIHsgImNvbnRpbnVlIiB9LAorICAgICAgICB7ICJkZWNpbWFsIiB9LAorICAgICAgICB7ICJkZWZhdWx0IiB9LAorICAgICAgICB7ICJkZWxlZ2F0ZSIgfSwKKyAgICAgICAgeyAiZG8iIH0sCisgICAgICAgIHsgImRvdWJsZSIgfSwKKyAgICAgICAgeyAiZWxzZSIgfSwKKyAgICAgICAgeyAiZW51bSIgfSwKKyAgICAgICAgeyAiZXZlbnQiIH0sCisgICAgICAgIHsgImV4cGxpY2l0IiB9LAorICAgICAgICB7ICJleHRlcm4iIH0sCisgICAgICAgIHsgImZhbHNlIiB9LAorICAgICAgICB7ICJmaW5hbGx5IiB9LAorICAgICAgICB7ICJmaXhlZCIgfSwKKyAgICAgICAgeyAiZmxvYXQiIH0sCisgICAgICAgIHsgImZvciIgfSwKKyAgICAgICAgeyAiZm9yZWFjaCIgfSwKKyAgICAgICAgeyAiZ290byIgfSwKKyAgICAgICAgeyAiaWYiIH0sCisgICAgICAgIHsgImltcGxpY2l0IiB9LAorICAgICAgICB7ICJpbiIgfSwKKyAgICAgICAgeyAiaW50IiB9LAorICAgICAgICB7ICJpbnRlcmZhY2UiIH0sCisgICAgICAgIHsgImludGVybmFsIiB9LAorICAgICAgICB7ICJpcyIgfSwKKyAgICAgICAgeyAibG9jayIgfSwKKyAgICAgICAgeyAibG9uZyIgfSwKKyAgICAgICAgeyAibmFtZXNwYWNlIiB9LAorICAgICAgICB7ICJuZXciIH0sCisgICAgICAgIHsgIm51bGwiIH0sCisgICAgICAgIHsgIm9iamVjdCIgfSwKKyAgICAgICAgeyAib3BlcmF0b3IiIH0sCisgICAgICAgIHsgIm91dCIgfSwKKyAgICAgICAgeyAib3ZlcnJpZGUiIH0sCisgICAgICAgIHsgInBhcmFtcyIgfSwKKyAgICAgICAgeyAicHJpdmF0ZSIgfSwKKyAgICAgICAgeyAicHJvdGVjdGVkIiB9LAorICAgICAgICB7ICJwdWJsaWMiIH0sCisgICAgICAgIHsgInJlYWRvbmx5IiB9LAorICAgICAgICB7ICJyZWYiIH0sCisgICAgICAgIHsgInJldHVybiIgfSwKKyAgICAgICAgeyAic2J5dGUiIH0sCisgICAgICAgIHsgInNlYWxlZCIgfSwKKyAgICAgICAgeyAic2hvcnQiIH0sCisgICAgICAgIHsgInNpemVvZiIgfSwKKyAgICAgICAgeyAic3RhY2thbGxvYyIgfSwKKyAgICAgICAgeyAic3RhdGljIiB9LAorICAgICAgICB7ICJzdHJpbmciIH0sCisgICAgICAgIHsgInN0cnVjdCIgfSwKKyAgICAgICAgeyAic3dpdGNoIiB9LAorICAgICAgICB7ICJ0aGlzIiB9LAorICAgICAgICB7ICJ0aHJvdyIgfSwKKyAgICAgICAgeyAidHJ1ZSIgfSwKKyAgICAgICAgeyAidHJ5IiB9LAorICAgICAgICB7ICJ0eXBlb2YiIH0sCisgICAgICAgIHsgInVpbnQiIH0sCisgICAgICAgIHsgInVsb25nIiB9LAorICAgICAgICB7ICJ1bmNoZWNrZWQiIH0sCisgICAgICAgIHsgInVuc2FmZSIgfSwKKyAgICAgICAgeyAidXNob3J0IiB9LAorICAgICAgICB7ICJ1c2luZyIgfSwKKyAgICAgICAgeyAidm9pZCIgfSwKKyAgICAgICAgeyAidm9sYXRpbGUiIH0sCisgICAgICAgIHsgIndoaWxlIiB9LAorICAgICAgICAvLyBDb250ZXh0dWFsIEtleXdvcmRzCisgICAgICAgIHsgImFkZCIgfSwKKyAgICAgICAgeyAiYWxpYXMiIH0sCisgICAgICAgIHsgImFzY2VuZGluZyIgfSwKKyAgICAgICAgeyAiYXN5bmMiIH0sCisgICAgICAgIHsgImF3YWl0IiB9LAorICAgICAgICB7ICJkZXNjZW5kaW5nIiB9LAorICAgICAgICB7ICJkeW5hbWljIiB9LAorICAgICAgICB7ICJmcm9tIiB9LAorICAgICAgICB7ICJnZXQiIH0sCisgICAgICAgIHsgImdsb2JhbCIgfSwKKyAgICAgICAgeyAiZ3JvdXAiIH0sCisgICAgICAgIHsgImludG8iIH0sCisgICAgICAgIHsgImpvaW4iIH0sCisgICAgICAgIHsgImxldCIgfSwKKyAgICAgICAgeyAib3JkZXJieSIgfSwKKyAgICAgICAgeyAicGFydGlhbCIgfSwKKyAgICAgICAgeyAicmVtb3ZlIiB9LAorICAgICAgICB7ICJzZWxlY3QiIH0sCisgICAgICAgIHsgInNldCIgfSwKKyAgICAgICAgeyAidmFsdWUiIH0sCisgICAgICAgIHsgInZhciIgfSwKKyAgICAgICAgeyAid2hlbiIgfSwKKyAgICAgICAgeyAid2hlcmUiIH0sCisgICAgICAgIHsgInlpZWxkIiB9CisgICAgfTsKKworICAgIHN0cmluZyBtaXNzZWRfa2V5d29yZHMgPSAiIjsKKworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IG5ldyB0X3Byb2dyYW0ocGF0aCwgbmFtZSk7CisgICAgdF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuID0gbmV3IHRfbmV0Y29yZV9nZW5lcmF0b3IocHJvZ3JhbSwgcGFyc2VkX29wdGlvbnMsIG9wdGlvbl9zdHJpbmcpOworICAgIGdlbi0+aW5pdF9nZW5lcmF0b3IoKTsKKyAgICBtYXA8c3RyaW5nLCBpbnQ+IGdlbmVyYXRvcnNfa2V5d29yZHMgPSBnZW4tPmdldF9rZXl3b3Jkc19saXN0KCk7CisKKyAgICBmb3IgKHZlY3RvcjxzdHJpbmc+OjppdGVyYXRvciBpdCA9IGN1cnJlbnRfa2V5d29yZHMuYmVnaW4oKTsgaXQgIT0gY3VycmVudF9rZXl3b3Jkcy5lbmQoKTsgKytpdCkKKyAgICB7CisgICAgICAgIGlmIChnZW5lcmF0b3JzX2tleXdvcmRzLmZpbmQoKml0KSA9PSBnZW5lcmF0b3JzX2tleXdvcmRzLmVuZCgpKQorICAgICAgICB7CisgICAgICAgICAgICBtaXNzZWRfa2V5d29yZHMgPSBtaXNzZWRfa2V5d29yZHMgKyAqaXQgKyAiLCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBSRVFVSVJFKG1pc3NlZF9rZXl3b3JkcyA9PSAiIik7CisKKyAgICBkZWxldGUgZ2VuOworICAgIGRlbGV0ZSBwcm9ncmFtOworfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3RzL25ldGNvcmUvdF9uZXRjb3JlX2dlbmVyYXRvcl9pbml0aWFsaXphdGlvbl90ZXN0cy5jYyBiL2NvbXBpbGVyL2NwcC90ZXN0cy9uZXRjb3JlL3RfbmV0Y29yZV9nZW5lcmF0b3JfaW5pdGlhbGl6YXRpb25fdGVzdHMuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMxNzczMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0cy9uZXRjb3JlL3RfbmV0Y29yZV9nZW5lcmF0b3JfaW5pdGlhbGl6YXRpb25fdGVzdHMuY2MKQEAgLTAsMCArMSw3NCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgIi4uL2NhdGNoL2NhdGNoLmhwcCIKKyNpbmNsdWRlIDx0aHJpZnQvcGFyc2UvdF9wcm9ncmFtLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2dlbmVyYXRlL3RfbmV0Y29yZV9nZW5lcmF0b3IuaD4KKworVEVTVF9DQVNFKCAidF9uZXRjb3JlX2dlbmVyYXRvciBzaG91bGQgdGhyb3cgZXJyb3Igd2l0aCB1bmtub3duIG9wdGlvbnMiLCAiW2luaXRpYWxpemF0aW9uXSIgKQoreworICAgIHN0cmluZyBwYXRoID0gIkNhc3NhbmRyYVRlc3QudGhyaWZ0IjsKKyAgICBzdHJpbmcgbmFtZSA9ICJuZXRjb3JlIjsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHBhcnNlZF9vcHRpb25zID0geyB7ICJrZXlzIiwgImtleXMiIH0gfTsKKyAgICBzdHJpbmcgb3B0aW9uX3N0cmluZyA9ICIiOworCisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gbmV3IHRfcHJvZ3JhbShwYXRoLCBuYW1lKTsKKyAgICB0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4gPSBudWxscHRyOworCisgICAgUkVRVUlSRV9USFJPV1MoZ2VuID0gbmV3IHRfbmV0Y29yZV9nZW5lcmF0b3IocHJvZ3JhbSwgcGFyc2VkX29wdGlvbnMsIG9wdGlvbl9zdHJpbmcpKTsJCisKKyAgICBkZWxldGUgZ2VuOworICAgIGRlbGV0ZSBwcm9ncmFtOwkKK30KKworVEVTVF9DQVNFKCJ0X25ldGNvcmVfZ2VuZXJhdG9yIHNob3VsZCBjcmVhdGUgdmFsaWQgaW5zdGFuY2Ugd2l0aCB2YWxpZCBvcHRpb25zIiwgIltpbml0aWFsaXphdGlvbl0iKQoreworICAgIHN0cmluZyBwYXRoID0gIkNhc3NhbmRyYVRlc3QudGhyaWZ0IjsKKyAgICBzdHJpbmcgbmFtZSA9ICJuZXRjb3JlIjsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHBhcnNlZF9vcHRpb25zID0geyB7ICJ3Y2YiLCAid2NmIiB9LCB7ICJudWxsYWJsZSIsICJudWxsYWJsZSJ9IH07CisgICAgc3RyaW5nIG9wdGlvbl9zdHJpbmcgPSAiIjsKKworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IG5ldyB0X3Byb2dyYW0ocGF0aCwgbmFtZSk7CisgICAgdF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuID0gbnVsbHB0cjsKKworICAgIFJFUVVJUkVfTk9USFJPVyhnZW4gPSBuZXcgdF9uZXRjb3JlX2dlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9uX3N0cmluZykpOworICAgIFJFUVVJUkUoZ2VuICE9IG51bGxwdHIpOworICAgIFJFUVVJUkUoZ2VuLT5pc193Y2ZfZW5hYmxlZCgpKTsKKyAgICBSRVFVSVJFKGdlbi0+aXNfbnVsbGFibGVfZW5hYmxlZCgpKTsKKyAgICBSRVFVSVJFX0ZBTFNFKGdlbi0+aXNfaGFzaGNvZGVfZW5hYmxlZCgpKTsKKyAgICBSRVFVSVJFX0ZBTFNFKGdlbi0+aXNfc2VyaWFsaXplX2VuYWJsZWQoKSk7CisgICAgUkVRVUlSRV9GQUxTRShnZW4tPmlzX3VuaW9uX2VuYWJsZWQoKSk7CisKKyAgICBkZWxldGUgZ2VuOworICAgIGRlbGV0ZSBwcm9ncmFtOworfQorCitURVNUX0NBU0UoInRfbmV0Y29yZV9nZW5lcmF0b3Igc2hvdWxkIHBhc3MgaW5pdCBzdWNjZXNmdWxseSIsICJbaW5pdGlhbGl6YXRpb25dIikKK3sKKyAgICBzdHJpbmcgcGF0aCA9ICJDYXNzYW5kcmFUZXN0LnRocmlmdCI7CisgICAgc3RyaW5nIG5hbWUgPSAibmV0Y29yZSI7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiBwYXJzZWRfb3B0aW9ucyA9IHsgeyAid2NmIiwgIndjZiIgfSx7ICJudWxsYWJsZSIsICJudWxsYWJsZSIgfSB9OworICAgIHN0cmluZyBvcHRpb25fc3RyaW5nID0gIiI7CisKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSBuZXcgdF9wcm9ncmFtKHBhdGgsIG5hbWUpOworICAgIHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbiA9IG5ldyB0X25ldGNvcmVfZ2VuZXJhdG9yKHByb2dyYW0sIHBhcnNlZF9vcHRpb25zLCBvcHRpb25fc3RyaW5nKTsKKworICAgIFJFUVVJUkVfTk9USFJPVyhnZW4tPmluaXRfZ2VuZXJhdG9yKCkpOworCisgICAgZGVsZXRlIGdlbjsKKyAgICBkZWxldGUgcHJvZ3JhbTsKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0cy90ZXN0c19tYWluLmNjIGIvY29tcGlsZXIvY3BwL3Rlc3RzL3Rlc3RzX21haW4uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFkMDliOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0cy90ZXN0c19tYWluLmNjCkBAIC0wLDAgKzEsMTkgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNkZWZpbmUgQ0FUQ0hfQ09ORklHX01BSU4KKyNpbmNsdWRlICJjYXRjaC9jYXRjaC5ocHAiCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdmVyc2lvbi5oLmluIGIvY29tcGlsZXIvY3BwL3ZlcnNpb24uaC5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc3MGVjOS4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvdmVyc2lvbi5oLmluCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotI2RlZmluZSBUSFJJRlRfVkVSU0lPTiAiQFBBQ0tBR0VfVkVSU0lPTkAiCmRpZmYgLS1naXQgYS9jb21wb3Nlci5qc29uIGIvY29tcG9zZXIuanNvbgppbmRleCAwZjIyYjc2Li4xZDNhNmMwIDEwMDY0NAotLS0gYS9jb21wb3Nlci5qc29uCisrKyBiL2NvbXBvc2VyLmpzb24KQEAgLTEsOSArMSwxMSBAQAogewogICAgICJuYW1lIjogImFwYWNoZS90aHJpZnQiLAogICAgICJkZXNjcmlwdGlvbiI6ICJBcGFjaGUgVGhyaWZ0IFJQQyBzeXN0ZW0iLAotICAgICJob21lcGFnZSI6ICJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvIiwKKyAgICAiaG9tZXBhZ2UiOiAiaHR0cDovL3RocmlmdC5hcGFjaGUub3JnIiwKICAgICAidHlwZSI6ICJsaWJyYXJ5IiwKKyAgICAia2V5d29yZHMiOiBbIlJQQyJdLAogICAgICJsaWNlbnNlIjogIkFwYWNoZS0yLjAiLAorICAgICJyZWFkbWUiOiAiUkVBRE1FLm1kIiwKICAgICAiYXV0aG9ycyI6IFsKICAgICAgICAgewogICAgICAgICAgICAgIm5hbWUiOiAiQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIiwKQEAgLTE2LDEyICsxOCwxOSBAQAogICAgICAgICAiaXNzdWVzIjogImh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUIgogICAgIH0sCiAgICAgInJlcXVpcmUiOiB7Ci0gICAgICAgICJwaHAiOiAiPj01LjMuMCIKKyAgICAgICAgInBocCI6ICJeNS41IHx8IF43LjAiCisgICAgfSwKKyAgICAicmVxdWlyZS1kZXYiOiB7CisgICAgICAgICJwaHB1bml0L3BocHVuaXQiOiAifjQuOC4zNiIsCisgICAgICAgICJzcXVpemxhYnMvcGhwX2NvZGVzbmlmZmVyIjogIjMuKiIKICAgICB9LAogICAgICJhdXRvbG9hZCI6IHsKLSAgICAgICAgInBzci0wIjogeyJUaHJpZnQiOiAibGliL3BocC9saWIvIn0KKyAgICAgICAgInBzci00IjogeyJUaHJpZnRcXCI6ICJsaWIvcGhwL2xpYi8ifQogICAgIH0sCi0gICAgIm1pbmltdW0tc3RhYmlsaXR5IjogImRldiIsCisgICAgImF1dG9sb2FkLWRldiI6IHsKKyAgICAgICAgInBzci00IjogeyJUZXN0XFxUaHJpZnRcXCI6ICJsaWIvcGhwL3Rlc3QvIn0KKyAgICB9LAorICAgICJtaW5pbXVtLXN0YWJpbGl0eSI6ICJzdGFibGUiLAogICAgICJleHRyYSI6IHsKICAgICAgICAgImJyYW5jaC1hbGlhcyI6IHsKICAgICAgICAgICAgICJkZXYtbWFzdGVyIjogIjEuMC54LWRldiIKZGlmZiAtLWdpdCBhL2NvbmZpZ3VyZS5hYyBiL2NvbmZpZ3VyZS5hYwppbmRleCAxOGUzMjMzLi4yMTc0NjI5IDEwMDc1NQotLS0gYS9jb25maWd1cmUuYWMKKysrIGIvY29uZmlndXJlLmFjCkBAIC0yMCw3ICsyMCw3IEBACiBBQ19QUkVSRVEoMi42NSkKIEFDX0NPTkZJR19NQUNST19ESVIoWy4vYWNsb2NhbF0pCiAKLUFDX0lOSVQoW3RocmlmdF0sIFswLjkuM10pCitBQ19JTklUKFt0aHJpZnRdLCBbMS4wLjBdKQogCiBBQ19DT05GSUdfQVVYX0RJUihbLl0pCiAKQEAgLTM0LDEwICszNCwxMCBAQAogQVNfSUYoW3Rlc3QgIngkUFlfUFJFRklYIiA9IHhdLCBbUFlfUFJFRklYPSIvdXNyIl0pCiAKIEFDX0FSR19WQVIoW0pBVkFfUFJFRklYXSwgW1ByZWZpeCBmb3IgaW5zdGFsbGluZyB0aGUgSmF2YSBsaWIgamFyLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKE5vcm1hbCAtLXByZWZpeCBpcyBpZ25vcmVkIGZvciBKYXZhIGJlY2F1c2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEphdmEgaGFzIGRpZmZlcmVudCBjb252ZW50aW9ucy4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0ID0gIi91c3IvbG9jYWwvbGliIl0pCi1BU19JRihbdGVzdCAieCRKQVZBX1BSRUZJWCIgPSB4XSwgW0pBVkFfUFJFRklYPSIvdXNyL2xvY2FsL2xpYiJdKQorQVNfSUYoW3Rlc3QgIngkSkFWQV9QUkVGSVgiICE9IHhdLCBbSkFWQV9QUkVGSVg9IiRKQVZBX1BSRUZJWC91c3IvbG9jYWwvbGliIl0sCisgICAgICBbdGVzdCAieCRQUkVGSVgiICE9IHhdLCBbSkFWQV9QUkVGSVg9IiRQUkVGSVgvdXNyL2xvY2FsL2xpYiJdLAorICAgICAgW0pBVkFfUFJFRklYPSIvdXNyL2xvY2FsL2xpYiJdKQogCiBBQ19BUkdfVkFSKFtSVUJZX1BSRUZJWF0sIFtQcmVmaXggZm9yIGluc3RhbGxpbmcgUnVieSBtb2R1bGVzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgKE5vcm1hbCAtLXByZWZpeCBpcyBpZ25vcmVkIGZvciBSdWJ5IGJlY2F1c2UKQEAgLTgzLDYgKzgzLDkgQEAKIEFDX0FSR19WQVIoW0RNRF9MSUJFVkVOVF9GTEFHU10sIFtETUQgZmxhZ3MgZm9yIGxpbmtpbmcgbGliZXZlbnQgKGF1dG8tZGV0ZWN0ZWQgaWYgbm90IHNldCkuXSkKIEFDX0FSR19WQVIoW0RNRF9PUEVOU1NMX0ZMQUdTXSwgW0RNRCBmbGFncyBmb3IgbGlua2luZyBPcGVuU1NMIChhdXRvLWRldGVjdGVkIGlmIG5vdCBzZXQpLl0pCiAKK0FDX0FSR19WQVIoW1RIUklGVF0sIFtQYXRoIHRvIHRoZSB0aHJpZnQgdG9vbCAobmVlZGVkIGZvciBjcm9zcy1jb21waWxhdGlvbikuXSkKK0FTX0lGKFt0ZXN0ICJ4JFRIUklGVCIgPSB4XSwgW1RIUklGVD1gcHdkYC9jb21waWxlci9jcHAvdGhyaWZ0XSkKKwogQUNfUFJPR19DQwogQUNfUFJPR19DUFAKIEFDX1BST0dfQ1hYCkBAIC05OSwxMCArMTAyLDEyIEBACiBBQ19QUk9HX1JBTkxJQgogCiBBQ19MQU5HKFtDKytdKQotQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXzExKFtub2V4dF0sIFtvcHRpb25hbF0pCitBWF9DWFhfQ09NUElMRV9TVERDWFhfMTEoW25vZXh0XSwgW21hbmRhdG9yeV0pCiAKIEFNX0VYVFJBX1JFQ1VSU0lWRV9UQVJHRVRTKFtzdHlsZV0pCiBBQ19TVUJTVChDUFBTVFlMRV9DTUQsICdmaW5kIC4gLXR5cGUgZiBcKCAtaW5hbWUgIiouaCIgLW9yIC1pbmFtZSAiKi5jcHAiIC1vciAtaW5hbWUgIiouY2MiIC1vciAtaW5hbWUgIioudGNjIiBcKSAtcHJpbnRmICJSZWZvcm1hdHRpbmc6ICVoLyVmXG4iIC1leGVjIGNsYW5nLWZvcm1hdCAtaSB7fSBcOycpCisjICcKKyMgVGhlIGFib3ZlIGNvbW1lbnQgaXMgdG8gZml4IGVkaXRvciBzeW50YXggaGlnaGxpZ2h0aW5nCiAKIEFDX0FSR19FTkFCTEUoW2xpYnNdLAogICBBU19IRUxQX1NUUklORyhbLS1lbmFibGUtbGlic10sIFtidWlsZCB0aGUgQXBhY2hlIFRocmlmdCBsaWJyYXJpZXMgW2RlZmF1bHQ9eWVzXV0pLApAQCAtMTEzLDIzICsxMTgsMjkgQEAKICAgaGF2ZV9saWJzPSJubyIKICAgd2l0aF9jcHA9Im5vIgogICB3aXRoX2NfZ2xpYj0ibm8iCisgIHdpdGhfY2w9Im5vIgogICB3aXRoX2phdmE9Im5vIgogICB3aXRoX2NzaGFycD0ibm8iCiAgIHdpdGhfcHl0aG9uPSJubyIKKyAgd2l0aF9weTM9Im5vIgogICB3aXRoX3J1Ynk9Im5vIgogICB3aXRoX2hhc2tlbGw9Im5vIgogICB3aXRoX2hheGU9Im5vIgorICB3aXRoX2RvdG5ldGNvcmU9Im5vIgogICB3aXRoX3Blcmw9Im5vIgogICB3aXRoX3BocD0ibm8iCiAgIHdpdGhfcGhwX2V4dGVuc2lvbj0ibm8iCisgIHdpdGhfZGFydD0ibm8iCiAgIHdpdGhfZXJsYW5nPSJubyIKICAgd2l0aF9nbz0ibm8iCiAgIHdpdGhfZD0ibm8iCiAgIHdpdGhfbm9kZWpzPSJubyIKKyAgd2l0aF9ub2RldHM9Im5vIgogICB3aXRoX2x1YT0ibm8iCisgIHdpdGhfcnM9Im5vIgorICB3aXRoX3N3aWZ0PSJubyIKIGZpCiAKLQogQVhfVEhSSUZUX0xJQihjcHAsIFtDKytdLCB5ZXMpCiBoYXZlX2NwcD1ubwogaWYgdGVzdCAiJHdpdGhfY3BwIiA9ICJ5ZXMiOyAgdGhlbgpAQCAtMTQ0LDkgKzE1NSw3IEBACiAgICAgaGF2ZV9jcHA9InllcyIKICAgZmkKIAotICBBWF9DSEVDS19PUEVOU1NMKCkKLQotICBBWF9MSUJfRVZFTlQoWzEuMF0pCisgIEFYX0xJQl9FVkVOVChbMi4wXSkKICAgaGF2ZV9saWJldmVudD0kc3VjY2VzcwogCiAgIEFYX0xJQl9aTElCKFsxLjIuM10pCkBAIC0xOTYsNiArMjA1LDEyIEBACiBmaQogQU1fQ09ORElUSU9OQUwoV0lUSF9DX0dMSUIsIFt0ZXN0ICIkaGF2ZV9nbGliMiIgPSAieWVzIiAtYSAiJGhhdmVfZ29iamVjdDIiID0gInllcyJdKQogCitlY2hvICJPcGVuU1NMIGNoZWNrIgoraWYgdGVzdCAiJGhhdmVfY3BwIiA9ICJ5ZXMiIC1vICIkaGF2ZV9jX2dsaWIiID0gInllcyI7ICB0aGVuCisgIGVjaG8gIkhhdmUgY3BwIG9yIGMgc28gd2UgY2hlY2sgZm9yIE9wZW5TU0wiCisgIEFYX0NIRUNLX09QRU5TU0woKQorZmkKKwogQVhfVEhSSUZUX0xJQihjc2hhcnAsIFtDI10sIHllcykKIGlmIHRlc3QgIiR3aXRoX2NzaGFycCIgPSAieWVzIjsgIHRoZW4KICAgUEtHX0NIRUNLX01PRFVMRVMoTU9OTywgbW9ubyA+PSAyLjExLjAsIG1vbm9fMl8xMT15ZXMsIG1vbm9fMl8xMT1ubykKQEAgLTIyMiw2ICsyMzcsNyBAQAogICBBWF9DSEVDS19BTlRfVkVSU0lPTigkQU5ULCAxLjcpCiAgIEFDX1NVQlNUKENMQVNTUEFUSCkKICAgQUNfU1VCU1QoQU5UX0ZMQUdTKQorICBBQ19TVUJTVChHUkFETEVfT1BUUykKICAgaWYgdGVzdCAieCRKQVZBIiAhPSAieCIgJiYgdGVzdCAieCRKQVZBQyIgIT0gIngiICYmIHRlc3QgIngkQU5UIiAhPSAieCIgOyB0aGVuCiAgICAgaGF2ZV9qYXZhPSJ5ZXMiCiAgIGZpCkBAIC0yMzIsMTMgKzI0OCwxNCBAQAogaWYgdGVzdCAiJHdpdGhfZXJsYW5nIiA9ICJ5ZXMiOyAgdGhlbgogICBBQ19FUkxBTkdfUEFUSF9FUkwKICAgQUNfRVJMQU5HX1BBVEhfRVJMQworICBBQ19QQVRIX1BST0coW1JFQkFSXSwgW3JlYmFyXSkKICAgaWYgdGVzdCAtbiAiJEVSTEMiIDsgdGhlbgogICAgIEFDX0VSTEFOR19TVUJTVF9MSUJfRElSCiAgICAgIyBJbnN0YWxsIGludG8gdGhlIGRldGVjdGVkIEVybGFuZyBkaXJlY3RvcnkgaW5zdGVhZCBvZiAkbGliZGlyL2VybGFuZy9saWIKICAgICBFUkxBTkdfSU5TVEFMTF9MSUJfRElSPSIkRVJMQU5HX0xJQl9ESVIiCiAgICAgQUNfRVJMQU5HX1NVQlNUX0lOU1RBTExfTElCX1NVQkRJUihBQ19QQUNLQUdFX05BTUUsIEFDX1BBQ0tBR0VfVkVSU0lPTikKICAgZmkKLSAgaWYgdGVzdCAtbiAiJEVSTCIgLWEgLW4gIiRFUkxDIiA7IHRoZW4KKyAgaWYgdGVzdCAtbiAiJEVSTCIgLWEgLW4gIiRFUkxDIiAmJiB0ZXN0ICJ4JFJFQkFSIiAhPSAieCIgOyB0aGVuCiAgICAgaGF2ZV9lcmxhbmc9InllcyIKIAogICAgICMgb3RwX3JlbGVhc2UgaXMgc2ltcGx5IGEgbnVtYmVyIChsaWtlICIxNyIpIGZvciBPVFAxNysgd2hpbGUgIlIxNi4uLiIgZm9yIE9UUDE2IG9yIGxlc3MuCkBAIC0yNjMsNiArMjgwLDE4IEBACiBBTV9DT05ESVRJT05BTChXSVRIX05PREVKUywgW3Rlc3QgIiRoYXZlX25vZGVqcyIgPSAieWVzIl0pCiBBTV9DT05ESVRJT05BTChIQVZFX05QTSwgW3Rlc3QgIngkTlBNIiAhPSAieCJdKQogCitBWF9USFJJRlRfTElCKG5vZGV0cywgW05vZGV0c10sIHllcykKK2hhdmVfbm9kZXRzPW5vCitpZiB0ZXN0ICIkd2l0aF9ub2RldHMiID0gInllcyI7IHRoZW4KKyAgQUNfUEFUSF9QUk9HUyhbTk9ERVRTXSwgW25vZGV0cyBub2RlXSkKKyAgQUNfUEFUSF9QUk9HKFtOUE1dLCBbbnBtXSkKKyAgaWYgdGVzdCAieCROT0RFVFMiICE9ICJ4IiAtYSAieCROUE0iICE9ICJ4IjsgdGhlbgorICAgIGhhdmVfbm9kZXRzPSJ5ZXMiCisgIGZpCitmaQorQU1fQ09ORElUSU9OQUwoV0lUSF9OT0RFVFMsIFt0ZXN0ICIkaGF2ZV9ub2RldHMiID0gInllcyJdKQorQU1fQ09ORElUSU9OQUwoSEFWRV9OUE0sIFt0ZXN0ICJ4JE5QTSIgIT0gIngiXSkKKwogQVhfVEhSSUZUX0xJQihsdWEsIFtMdWFdLCB5ZXMpCiBoYXZlX2x1YT1ubwogaWYgdGVzdCAiJHdpdGhfbHVhIiA9ICJ5ZXMiOyB0aGVuCkBAIC0yNzQsMTUgKzMwMywzNSBAQAogZmkKIEFNX0NPTkRJVElPTkFMKFdJVEhfTFVBLCBbdGVzdCAiJGhhdmVfbHVhIiA9ICJ5ZXMiXSkKIAorIyBGaW5kIHB5dGhvbiByZWdhcmRsZXNzIG9mIHdpdGhfcHl0aG9uIHZhbHVlLCBiZWNhdXNlIGl0J3MgbmVlZGVkIGJ5IG1ha2UgY3Jvc3MKK0FNX1BBVEhfUFlUSE9OKDIuNiwsIDopCiBBWF9USFJJRlRfTElCKHB5dGhvbiwgW1B5dGhvbl0sIHllcykKIGlmIHRlc3QgIiR3aXRoX3B5dGhvbiIgPSAieWVzIjsgIHRoZW4KLSAgQUNfUEFUSF9QUk9HKFtUUklBTF0sIFt0cmlhbF0pCi0gIEFNX1BBVEhfUFlUSE9OKDIuNCwsIDopCi0gIGlmIHRlc3QgLW4gIiRUUklBTCIgJiYgdGVzdCAieCRQWVRIT04iICE9ICJ4IiAmJiB0ZXN0ICJ4JFBZVEhPTiIgIT0gIng6IiA7IHRoZW4KKyAgaWYgdGVzdCAtbiAiJFBZVEhPTiI7IHRoZW4KICAgICBoYXZlX3B5dGhvbj0ieWVzIgogICBmaQorICBBQ19QQVRIX1BST0coW1RSSUFMXSwgW3RyaWFsXSkKKyAgaWYgdGVzdCAtbiAiJFRSSUFMIjsgdGhlbgorICAgIGhhdmVfdHJpYWw9InllcyIKKyAgZmkKIGZpCiBBTV9DT05ESVRJT05BTChXSVRIX1BZVEhPTiwgW3Rlc3QgIiRoYXZlX3B5dGhvbiIgPSAieWVzIl0pCitBTV9DT05ESVRJT05BTChXSVRIX1RXSVNURURfVEVTVCwgW3Rlc3QgIiRoYXZlX3RyaWFsIiA9ICJ5ZXMiXSkKKworIyBGaW5kICJweXRob24zIiBleGVjdXRhYmxlLgorIyBJdCdzIGRpc3RybyBzcGVjaWZpYyBhbmQgZmFyIGZyb20gaWRlYWwgYnV0IG5lZWRlZCB0byBjcm9zcyB0ZXN0IHB5Mi0zIGF0IG9uY2UuCisjIFRPRE86IGZpbmQgInB5dGhvbjIiIGlmIGl0J3MgMy54CitoYXZlX3B5Mz0ibm8iCitBWF9USFJJRlRfTElCKHB5MywgW1B5M10sIHllcykKK2lmIHRlc3QgIiR3aXRoX3B5MyIgPSAieWVzIjsgdGhlbgorICBpZiAkUFlUSE9OIC0tdmVyc2lvbiAyPiYxIHwgZ3JlcCAtcSAiUHl0aG9uIDIiOyB0aGVuCisgICAgQUNfUEFUSF9QUk9HUyhbUFlUSE9OM10sIFtweXRob24zIHB5dGhvbjMuNyBweXRob24zNyBweXRob24zLjYgcHl0aG9uMzYgcHl0aG9uMy41IHB5dGhvbjM1IHB5dGhvbjMuNCBweXRob24zNF0pCisgICAgaWYgdGVzdCAtbiAiJFBZVEhPTjMiOyB0aGVuCisgICAgICBoYXZlX3B5Mz0ieWVzIgorICAgIGZpCisgIGZpCitmaQorQU1fQ09ORElUSU9OQUwoV0lUSF9QWTMsIFt0ZXN0ICIkaGF2ZV9weTMiID0gInllcyJdKQogCiBBWF9USFJJRlRfTElCKHBlcmwsIFtQZXJsXSwgeWVzKQogaWYgdGVzdCAiJHdpdGhfcGVybCIgPSAieWVzIjsgdGhlbgpAQCAtMzIyLDggKzM3MSwxNSBAQAogZmkKIEFNX0NPTkRJVElPTkFMKFdJVEhfUEhQX0VYVEVOU0lPTiwgW3Rlc3QgIiRoYXZlX3BocF9leHRlbnNpb24iID0gInllcyJdKQogCi1BQ19QQVRIX1BST0coW1BIUFVOSVRdLCBbcGhwdW5pdF0pCi1BTV9DT05ESVRJT05BTChIQVZFX1BIUFVOSVQsIFt0ZXN0ICJ4JFBIUFVOSVQiICE9ICJ4Il0pCitBWF9USFJJRlRfTElCKGRhcnQsIFtEQVJUXSwgeWVzKQoraWYgdGVzdCAiJHdpdGhfZGFydCIgPSAieWVzIjsgdGhlbgorICBBQ19QQVRIX1BST0coW0RBUlRdLCBbZGFydF0pCisgIEFDX1BBVEhfUFJPRyhbREFSVFBVQl0sIFtwdWJdKQorICBpZiB0ZXN0ICJ4JERBUlQiICE9ICJ4IiAtYSAieCREQVJUUFVCIiAhPSAieCI7IHRoZW4KKyAgICBoYXZlX2RhcnQ9InllcyIKKyAgZmkKK2ZpCitBTV9DT05ESVRJT05BTChXSVRIX0RBUlQsIFt0ZXN0ICIkaGF2ZV9kYXJ0IiA9ICJ5ZXMiXSkKIAogQVhfVEhSSUZUX0xJQihydWJ5LCBbUnVieV0sIHllcykKIGhhdmVfcnVieT1ubwpAQCAtMzYxLDYgKzQxNyw3IEBACiAgIGlmIFtbIC14ICIkR08iIF1dIDsgdGhlbgogICAgIEFTX0lGKFt0ZXN0IC1uICIkR08iXSxbCiAgICAgICBheF9nb192ZXJzaW9uPSIxLjQiCisgICAgICBheF9nbzE3X3ZlcnNpb249IjEuNyIKIAogICAgICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgR28gdmVyc2lvbl0pCiAgICAgICBnb2xhbmdfdmVyc2lvbj1gJEdPIHZlcnNpb24gMj4mMSB8ICRTRUQgLWUgJ3MvXChnbyBcKVwodmVyc2lvbiBcKVwoZ29cKVwoQDw6QDAtOUA6PkAuQDw6QDAtOUA6PkAuQDw6QDAtOUA6PkBcKVwoQDw6QFwqQDo+QCpcKS4qL1w0LydgCkBAIC0zNzMsNiArNDMwLDEzIEBACiAgICAgICA6CiAgICAgICAgIGhhdmVfZ289Im5vIgogICAgICAgXSkKKyAgICAgIEFYX0NPTVBBUkVfVkVSU0lPTihbJGdvbGFuZ192ZXJzaW9uXSxbbHRdLFskYXhfZ28xN192ZXJzaW9uXSxbCisgICAgICA6CisgICAgICAgIGdvX3ZlcnNpb25fbHRfMTc9InllcyIKKyAgICAgIF0sWworICAgICAgOgorICAgICAgICBnb192ZXJzaW9uX2x0XzE3PSJubyIKKyAgICAgIF0pCiAgICAgXSxbCiAgICAgICBBQ19NU0dfV0FSTihbY291bGQgbm90IGZpbmQgR28gXSkKICAgICAgIGhhdmVfZ289Im5vIgpAQCAtMzgwLDcgKzQ0NCw1MSBAQAogICBmaQogZmkKIEFNX0NPTkRJVElPTkFMKFdJVEhfR08sIFt0ZXN0ICIkaGF2ZV9nbyIgPSAieWVzIl0pCitBTV9DT05ESVRJT05BTChbR09WRVJTSU9OX0xUXzE3XSwgW3Rlc3QgIiRnb192ZXJzaW9uX2x0XzE3IiA9ICJ5ZXMiXSkKIAorQVhfVEhSSUZUX0xJQihzd2lmdCwgW1N3aWZ0XSwgeWVzKQoraGF2ZV9zd2lmdD0ibm8iCitpZiB0ZXN0ICIkd2l0aF9zd2lmdCIgPSAieWVzIjsgdGhlbgorICBBQ19QQVRIX1BST0coW1NXSUZUXSwgW3N3aWZ0XSkKKyAgaWYgdGVzdCAieCRTV0lGVCIgIT0gIngiIC1hICJ4JFNXSUZUIiAhPSAieCI7IHRoZW4KKyAgICBoYXZlX3N3aWZ0PSJ5ZXMiCisgIGZpCitmaQorQU1fQ09ORElUSU9OQUwoW1dJVEhfU1dJRlRdLCBbdGVzdCAiJGhhdmVfc3dpZnQiID0gInllcyJdKQorCitBWF9USFJJRlRfTElCKHJzLCBbUnVzdF0sIHllcykKK2hhdmVfcnM9Im5vIgoraWYgdGVzdCAiJHdpdGhfcnMiID0gInllcyI7ICB0aGVuCisgIEFDX1BBVEhfUFJPRyhbQ0FSR09dLCBbY2FyZ29dKQorICBBQ19QQVRIX1BST0coW1JVU1RDXSwgW3J1c3RjXSkKKyAgaWYgW1sgLXggIiRDQVJHTyIgXV0gJiYgW1sgLXggIiRSVVNUQyIgXV07IHRoZW4KKyAgICAgIG1pbl9ydXN0Y192ZXJzaW9uPSIxLjEzIgorCisgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBydXN0YyB2ZXJzaW9uXSkKKyAgICAgIHJ1c3RjX3ZlcnNpb249YCRSVVNUQyAtLXZlcnNpb24gMj4mMSB8ICRTRUQgLWUgJ3MvXChydXN0YyBcKVwoWzAtOV1cKVwuXChbMC05XVswLTldKlwpXC5cKFswLTldWzAtOV0qXCkuKi9cMi5cMy8nYAorICAgICAgQUNfTVNHX1JFU1VMVCgkcnVzdGNfdmVyc2lvbikKKyAgICAgIEFDX1NVQlNUKFtydXN0Y192ZXJzaW9uXSxbJHJ1c3RjX3ZlcnNpb25dKQorCisgICAgICBBWF9DT01QQVJFX1ZFUlNJT04oWyRtaW5fcnVzdGNfdmVyc2lvbl0sW2xlXSxbJHJ1c3RjX3ZlcnNpb25dLFsKKyAgICAgIDoKKyAgICAgICAgaGF2ZV9ycz0ieWVzIgorICAgICAgXSxbCisgICAgICA6CisgICAgICAgIGhhdmVfcnM9Im5vIgorICAgICAgXSkKKyAgZmkKK2ZpCitBTV9DT05ESVRJT05BTChXSVRIX1JTLCBbdGVzdCAiJGhhdmVfcnMiID0gInllcyJdKQorCitBWF9USFJJRlRfTElCKGNsLCBbQ29tbW9uIExpc3BdLCB5ZXMpCitoYXZlX2NsPSJubyIKK2lmIHRlc3QgIiR3aXRoX2NsIiA9ICJ5ZXMiOyAgdGhlbgorICBBQ19QQVRIX1BST0coW1NCQ0xdLCBbc2JjbF0pCisgIGlmIHRlc3QgIngkU0JDTCIgIT0gIngiOyB0aGVuCisgICAgaGF2ZV9jbD0ieWVzIgorICBmaQorZmkKK0FNX0NPTkRJVElPTkFMKFdJVEhfQ0wsIFt0ZXN0ICIkaGF2ZV9jbCIgPSAieWVzIl0pCiAKIEFYX1RIUklGVF9MSUIoaGF4ZSwgW0hheGVdLCB5ZXMpCiBpZiB0ZXN0ICIkd2l0aF9oYXhlIiA9ICJ5ZXMiOyAgdGhlbgpAQCAtMzkyLDYgKzUwMCwxNiBAQAogQU1fQ09ORElUSU9OQUwoV0lUSF9IQVhFLCBbdGVzdCAiJGhhdmVfaGF4ZSIgPSAieWVzIl0pCiAKIAorQVhfVEhSSUZUX0xJQihkb3RuZXRjb3JlLCBbLk5FVCBDb3JlXSwgeWVzKQoraWYgdGVzdCAiJHdpdGhfZG90bmV0Y29yZSIgPSAieWVzIjsgIHRoZW4KKyAgQUNfUEFUSF9QUk9HKFtET1RORVRDT1JFXSwgW2RvdG5ldF0pCisgIGlmIFtbIC14ICIkRE9UTkVUQ09SRSIgXV0gOyB0aGVuCisgICAgQVhfUFJPR19ET1RORVRDT1JFX1ZFUlNJT04oIFsyLjAuMF0sIGhhdmVfZG90bmV0Y29yZT0ieWVzIiwgaGF2ZV9kb3RuZXRjb3JlPSJubyIpCisgIGZpCitmaQorQU1fQ09ORElUSU9OQUwoV0lUSF9ET1RORVRDT1JFLCBbdGVzdCAiJGhhdmVfZG90bmV0Y29yZSIgPSAieWVzIl0pCisKKwogQVhfVEhSSUZUX0xJQihkLCBbRF0sIHllcykKIGlmIHRlc3QgIiR3aXRoX2QiID0gInllcyI7ICB0aGVuCiAgIEFYX0RNRApAQCAtNDMyLDcgKzU1MCw3IEBACiAgICAgICBlbHNlCiAgICAgICAgIEFYX0xJQl9FVkVOVChbMi4wXSkKICAgICAgICAgaWYgdGVzdCAiJHN1Y2Nlc3MiID0gInllcyI7IHRoZW4KLSAgICAgICAgICBETURfTElCRVZFTlRfRkxBR1M9JChlY2hvICIkTElCRVZFTlRfTERGTEFHUyAkTElCRVZFTlRfTElCUyIgfCBcCisgICAgICAgICAgRE1EX0xJQkVWRU5UX0ZMQUdTPSQoZWNobyAiLWZ1c2UtbGQ9Z29sZCAkTElCRVZFTlRfTERGTEFHUyAkTElCRVZFTlRfTElCUyIgfCBcCiAgICAgICAgICAgICBzZWQgLWUgJ3MvXiAqLy9nO3MvICokLy9nO3MvXlwoLlwpLy1MXDEvZztzLyAgKi8gLUwvZycpCiAgICAgICAgICAgd2l0aF9kX2V2ZW50X3Rlc3RzPSJ5ZXMiCiAgICAgICAgIGVsc2UKQEAgLTQ1Niw3ICs1NzQsNyBAQAogICAgICAgZWxzZQogICAgICAgICBBWF9DSEVDS19PUEVOU1NMKFt3aXRoX2Rfc3NsX3Rlc3RzPSJ5ZXMiXSkKICAgICAgICAgaWYgdGVzdCAiJHdpdGhfZF9zc2xfdGVzdHMiID0gInllcyI7IHRoZW4KLSAgICAgICAgICBETURfT1BFTlNTTF9GTEFHUz0kKGVjaG8gIiRPUEVOU1NMX0xERkxBR1MgJE9QRU5TU0xfTElCUyIgfCBcCisgICAgICAgICAgRE1EX09QRU5TU0xfRkxBR1M9JChlY2hvICItZnVzZS1sZD1nb2xkICRPUEVOU1NMX0xERkxBR1MgJE9QRU5TU0xfTElCUyIgfCBcCiAgICAgICAgICAgICBzZWQgLWUgJ3MvXiAqLy9nO3MvICokLy9nO3MvXlwoLlwpLy1MXDEvZztzLyAgKi8gLUwvZycpCiAgICAgICAgIGVsc2UKICAgICAgICAgICBBQ19NU0dfV0FSTihbRCBPcGVuU1NMIGludGVyZmFjZSBwcmVzZW50LCBidXQgT3BlblNTTCBsaWJyYXJ5IG5vdCBmb3VuZC5dKQpAQCAtNDg4LDYgKzYwNiwyMCBAQAogZmkKIEFNX0NPTkRJVElPTkFMKFdJVEhfVEVTVFMsIFt0ZXN0ICIkaGF2ZV90ZXN0cyIgPSAieWVzIl0pCiAKK0FDX0FSR19FTkFCTEUoW3BsdWdpbl0sCisgIEFTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1wbHVnaW5dLCBbYnVpbGQgY29tcGlsZXIgcGx1Z2luIHN1cHBvcnQgW2RlZmF1bHQ9bm9dXSksCisgIFtdLCBlbmFibGVfcGx1Z2luPW5vCispCitoYXZlX3BsdWdpbj15ZXMKK2lmIHRlc3QgIiRoYXZlX2NwcCIgPSAibm8iIDsgdGhlbgorICBoYXZlX3BsdWdpbj0ibm8iCitmaQoraWYgdGVzdCAiJGVuYWJsZV9wbHVnaW4iID0gIm5vIjsgdGhlbgorICBoYXZlX3BsdWdpbj0ibm8iCitmaQorQUNfQ09ORklHX0xJTktTKFtjb21waWxlci9jcHAvdGVzdC9wbHVnaW4vdF9jcHBfZ2VuZXJhdG9yLmNjOmNvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY3BwX2dlbmVyYXRvci5jY10pCitBTV9DT05ESVRJT05BTChXSVRIX1BMVUdJTiwgW3Rlc3QgIiRoYXZlX3BsdWdpbiIgPSAieWVzIl0pCisKIEFDX0FSR19FTkFCTEUoW3R1dG9yaWFsXSwKICAgQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXR1dG9yaWFsXSwgW2J1aWxkIHR1dG9yaWFsIFtkZWZhdWx0PXllc11dKSwKICAgW10sIGVuYWJsZV90dXRvcmlhbD15ZXMKQEAgLTUyNywxMSArNjU5LDE0IEBACiBBQ19DSEVDS19IRUFERVJTKFtuZXRkYi5oXSkKIEFDX0NIRUNLX0hFQURFUlMoW25ldGluZXQvaW4uaF0pCiBBQ19DSEVDS19IRUFERVJTKFtwdGhyZWFkLmhdKQorQUNfQ0hFQ0tfSEVBREVSUyhbc2lnbmFsLmhdKQogQUNfQ0hFQ0tfSEVBREVSUyhbc3RkZGVmLmhdKQogQUNfQ0hFQ0tfSEVBREVSUyhbc3RkbGliLmhdKQorQUNfQ0hFQ0tfSEVBREVSUyhbc3lzL2lvY3RsLmhdKQogQUNfQ0hFQ0tfSEVBREVSUyhbc3lzL3NvY2tldC5oXSkKIEFDX0NIRUNLX0hFQURFUlMoW3N5cy90aW1lLmhdKQogQUNfQ0hFQ0tfSEVBREVSUyhbc3lzL3VuLmhdKQorQUNfQ0hFQ0tfSEVBREVSUyhbcG9sbC5oXSkKIEFDX0NIRUNLX0hFQURFUlMoW3N5cy9wb2xsLmhdKQogQUNfQ0hFQ0tfSEVBREVSUyhbc3lzL3Jlc291cmNlLmhdKQogQUNfQ0hFQ0tfSEVBREVSUyhbdW5pc3RkLmhdKQpAQCAtNTUyLDIxICs2ODcsNiBAQAogQUNfQ0hFQ0tfTElCKHJ0LCBjbG9ja19nZXR0aW1lKQogQUNfQ0hFQ0tfTElCKHNvY2tldCwgc2V0c29ja29wdCkKIAotaWYgdGVzdCAiJGhhdmVfY3BwIiA9ICJ5ZXMiIDsgdGhlbgotIyBtaW5ndyB0b29sY2hhaW4gdXNlZCB0byBidWlsZCAiVGhyaWZ0IENvbXBpbGVyIGZvciBXaW5kb3dzIgotIyBkb2VzIG5vdCBzdXBwb3J0IGxpYmNyeXB0bywgc28gd2UganVzdCBjaGVjayBpZiB3ZSBidWlsZGluZyB0aGUgY3BwIGxpYnJhcnkKLUFDX0NIRUNLX0xJQihjcnlwdG8sCi0gICAgQk5faW5pdCwKLSAgICBbQUNfQ0hFQ0tfTElCKHNzbCwKLSAgICAgICAgU1NMX2N0cmwsCi0gICAgICAgIFtMSUJTPSItbHNzbCAtbGNyeXB0byAkTElCUyJdLAotICAgICAgICBbQUNfTVNHX0VSUk9SKFsiRXJyb3I6IGxpYnNzbCByZXF1aXJlZCJdKV0sCi0gICAgICAgIC1sY3J5cHRvCi0gICAgKV0sCi0gICAgW0FDX01TR19FUlJPUihbIkVycm9yOiBsaWJjcnlwdG8gcmVxdWlyZWQuIl0pXQotKQotZmkKLQogQUNfVFlQRV9JTlQxNl9UCiBBQ19UWVBFX0lOVDMyX1QKIEFDX1RZUEVfSU5UNjRfVApAQCAtNTc5LDcgKzY5OSw3IEBACiBBQ19UWVBFX1VJTlQzMl9UCiBBQ19UWVBFX1VJTlQ2NF9UCiBBQ19UWVBFX1VJTlQ4X1QKLUFDX0NIRUNLX1RZUEVTKFtwdHJkaWZmX3RdLCBbXSwgW2V4aXQgMV0pCitBQ19DSEVDS19UWVBFUyhbcHRyZGlmZl90XSwgW10sIFtlY2hvICJwdHJkaWZmX3Qgbm90IGZvdW5kIG9yIGcrKyBub3QgaW5zdGFsbGVkIC0gY2Fubm90IGNvbnRpbnVlIiAmJiBleGl0IDFdKQogCiBBQ19TVFJVQ1RfVE0KIApAQCAtNjY1LDI2ICs3ODUsOSBAQAogQUNfU1VCU1QoR0NPVl9DWFhGTEFHUykKIEFDX1NVQlNUKEdDT1ZfTERGTEFHUykKIAotQUNfQVJHX0VOQUJMRShib29zdHRocmVhZHMsCi0gICAgICAgICAgICAgIFsgIC0tZW5hYmxlLWJvb3N0dGhyZWFkcyAgICAgIHVzZSBib29zdCB0aHJlYWRzLCBpbnN0ZWFkIG9mIFBPU0lYIHB0aHJlYWQgKGV4cGVyaW1lbnRhbCkgXSwKLSAgICAgICAgICAgICAgW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgICAgICAgICAgICAgICB5ZXMpIEVOQUJMRV9CT09TVFRIUkVBRFM9MSA7OwotICAgICAgICAgICAgICAgIG5vKSBFTkFCTEVfQk9PU1RUSFJFQURTPTAgOzsKLSAgICAgICAgICAgICAgICAqKSBBQ19NU0dfRVJST1IoYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgLS1lbmFibGUtY292KSA7OwotICAgICAgICAgICAgICBlc2FjXSwKLSAgICAgICAgICAgICAgW0VOQUJMRV9CT09TVFRIUkVBRFM9Ml0pCi0KLQotaWYgdGVzdCAieFskXUVOQUJMRV9CT09TVFRIUkVBRFMiID0gIngxIjsgdGhlbgotICBBQ19NU0dfV0FSTihlbmFibGUgYm9vc3R0aHJlYWRzKQotICBBQ19ERUZJTkUoW1VTRV9CT09TVF9USFJFQURdLCBbMV0sIFtleHBlcmltZW50YWwgLS1lbmFibGUtYm9vc3R0aHJlYWRzIHRoYXQgcmVwbGFjZXMgUE9TSVggcHRocmVhZCBieSBib29zdDo6dGhyZWFkXSkKLSAgTElCUz0iLWxib29zdF90aHJlYWQgJExJQlMiCi1maQotCi1BTV9DT05ESVRJT05BTChbV0lUSF9CT09TVFRIUkVBRFNdLCBbdGVzdCAieFskXUVOQUJMRV9CT09TVFRIUkVBRFMiID0gIngxIl0pCi0KIEFDX0NPTkZJR19IRUFERVJTKGNvbmZpZy5oOmNvbmZpZy5oaW4pCiBBQ19DT05GSUdfSEVBREVSUyhsaWIvY3BwL3NyYy90aHJpZnQvY29uZmlnLmg6Y29uZmlnLmhpbikKK0FDX0NPTkZJR19IRUFERVJTKGxpYi9jX2dsaWIvc3JjL3RocmlmdC9jb25maWcuaDpjb25maWcuaGluKQogIyBncnVhcmQgYWdhaW5zdCBwcmUgZGVmaW5lZCBjb25maWcuaAogQUhfVE9QKFsKICNpZm5kZWYgQ09ORklHX0gKQEAgLTY5OCw5ICs4MDEsMTIgQEAKIEFDX0NPTkZJR19GSUxFUyhbCiAgIE1ha2VmaWxlCiAgIGNvbXBpbGVyL2NwcC9NYWtlZmlsZQotICBjb21waWxlci9jcHAvdmVyc2lvbi5oCi0gIGNvbXBpbGVyL2NwcC9zcmMvd2luZG93cy92ZXJzaW9uLmgKKyAgY29tcGlsZXIvY3BwL3NyYy9NYWtlZmlsZQorICBjb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vTWFrZWZpbGUKKyAgY29tcGlsZXIvY3BwL3Rlc3QvTWFrZWZpbGUKKyAgY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvdmVyc2lvbi5oCiAgIGxpYi9NYWtlZmlsZQorICBsaWIvY2wvTWFrZWZpbGUKICAgbGliL2NwcC9NYWtlZmlsZQogICBsaWIvY3BwL3Rlc3QvTWFrZWZpbGUKICAgbGliL2NwcC90aHJpZnQtbmIucGMKQEAgLTcxMiw3ICs4MTgsNyBAQAogICBsaWIvY19nbGliL3RocmlmdF9jX2dsaWIucGMKICAgbGliL2NfZ2xpYi90ZXN0L01ha2VmaWxlCiAgIGxpYi9jc2hhcnAvTWFrZWZpbGUKLSAgbGliL2NzaGFycC90ZXN0L1RocmlmdFRlc3QvTWFrZWZpbGUKKyAgbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9NYWtlZmlsZQogICBsaWIvZC9NYWtlZmlsZQogICBsaWIvZC90ZXN0L01ha2VmaWxlCiAgIGxpYi9lcmwvTWFrZWZpbGUKQEAgLTcyMSw2NSArODI3LDEwOCBAQAogICBsaWIvaGF4ZS90ZXN0L01ha2VmaWxlCiAgIGxpYi9ocy9NYWtlZmlsZQogICBsaWIvamF2YS9NYWtlZmlsZQorICBsaWIvanMvTWFrZWZpbGUKICAgbGliL2pzL3Rlc3QvTWFrZWZpbGUKKyAgbGliL2pzb24vTWFrZWZpbGUKKyAgbGliL2pzb24vdGVzdC9NYWtlZmlsZQorICBsaWIvbmV0Y29yZS9NYWtlZmlsZQogICBsaWIvbm9kZWpzL01ha2VmaWxlCisgIGxpYi9ub2RldHMvTWFrZWZpbGUKICAgbGliL3BlcmwvTWFrZWZpbGUKICAgbGliL3BlcmwvdGVzdC9NYWtlZmlsZQogICBsaWIvcGhwL01ha2VmaWxlCiAgIGxpYi9waHAvdGVzdC9NYWtlZmlsZQorICBsaWIvZGFydC9NYWtlZmlsZQogICBsaWIvcHkvTWFrZWZpbGUKICAgbGliL3JiL01ha2VmaWxlCisgIGxpYi9ycy9NYWtlZmlsZQorICBsaWIvcnMvdGVzdC9NYWtlZmlsZQogICBsaWIvbHVhL01ha2VmaWxlCisgIGxpYi9zd2lmdC9NYWtlZmlsZQorICBsaWIveG1sL01ha2VmaWxlCisgIGxpYi94bWwvdGVzdC9NYWtlZmlsZQogICB0ZXN0L01ha2VmaWxlCisgIHRlc3QvZmVhdHVyZXMvTWFrZWZpbGUKICAgdGVzdC9jX2dsaWIvTWFrZWZpbGUKKyAgdGVzdC9jbC9NYWtlZmlsZQogICB0ZXN0L2NwcC9NYWtlZmlsZQorICB0ZXN0L2NzaGFycC9NYWtlZmlsZQogICB0ZXN0L2VybC9NYWtlZmlsZQogICB0ZXN0L2dvL01ha2VmaWxlCiAgIHRlc3QvaGF4ZS9NYWtlZmlsZQogICB0ZXN0L2hzL01ha2VmaWxlCisgIHRlc3QvbHVhL01ha2VmaWxlCisgIHRlc3QvbmV0Y29yZS9NYWtlZmlsZQogICB0ZXN0L3BocC9NYWtlZmlsZQorICB0ZXN0L2RhcnQvTWFrZWZpbGUKICAgdGVzdC9wZXJsL01ha2VmaWxlCiAgIHRlc3QvcHkvTWFrZWZpbGUKICAgdGVzdC9weS50d2lzdGVkL01ha2VmaWxlCiAgIHRlc3QvcHkudG9ybmFkby9NYWtlZmlsZQogICB0ZXN0L3JiL01ha2VmaWxlCisgIHRlc3QvcnMvTWFrZWZpbGUKICAgdHV0b3JpYWwvTWFrZWZpbGUKICAgdHV0b3JpYWwvY19nbGliL01ha2VmaWxlCisgIHR1dG9yaWFsL2NsL01ha2VmaWxlCiAgIHR1dG9yaWFsL2NwcC9NYWtlZmlsZQorICB0dXRvcmlhbC9kL01ha2VmaWxlCiAgIHR1dG9yaWFsL2dvL01ha2VmaWxlCiAgIHR1dG9yaWFsL2hheGUvTWFrZWZpbGUKICAgdHV0b3JpYWwvaHMvTWFrZWZpbGUKICAgdHV0b3JpYWwvamF2YS9NYWtlZmlsZQogICB0dXRvcmlhbC9qcy9NYWtlZmlsZQorICB0dXRvcmlhbC9uZXRjb3JlL01ha2VmaWxlCiAgIHR1dG9yaWFsL25vZGVqcy9NYWtlZmlsZQorICB0dXRvcmlhbC9kYXJ0L01ha2VmaWxlCiAgIHR1dG9yaWFsL3B5L01ha2VmaWxlCiAgIHR1dG9yaWFsL3B5LnR3aXN0ZWQvTWFrZWZpbGUKICAgdHV0b3JpYWwvcHkudG9ybmFkby9NYWtlZmlsZQogICB0dXRvcmlhbC9yYi9NYWtlZmlsZQorICB0dXRvcmlhbC9ycy9NYWtlZmlsZQogXSkKIAogaWYgdGVzdCAiJGhhdmVfY3BwIiA9ICJ5ZXMiIDsgdGhlbiBNQVlCRV9DUFA9ImNwcCIgOyBlbHNlIE1BWUJFX0NQUD0iIiA7IGZpCiBBQ19TVUJTVChbTUFZQkVfQ1BQXSkKIGlmIHRlc3QgIiRoYXZlX2NfZ2xpYiIgPSAieWVzIiA7IHRoZW4gTUFZQkVfQ19HTElCPSJjX2dsaWIiIDsgZWxzZSBNQVlCRV9DX0dMSUI9IiIgOyBmaQogQUNfU1VCU1QoW01BWUJFX0NfR0xJQl0pCitpZiB0ZXN0ICIkaGF2ZV9kIiA9ICJ5ZXMiIC1hICIkaGF2ZV9kZWltb3NfZXZlbnQyIiA9ICJ5ZXMiIC1hICIkaGF2ZV9kZWltb3Nfb3BlbnNzbCIgPSAieWVzIjsgdGhlbiBNQVlCRV9EPSJkIiA7IGVsc2UgTUFZQkVfRD0iIiA7IGZpCitBQ19TVUJTVChbTUFZQkVfRF0pCiBpZiB0ZXN0ICIkaGF2ZV9qYXZhIiA9ICJ5ZXMiIDsgdGhlbiBNQVlCRV9KQVZBPSJqYXZhIiA7IGVsc2UgTUFZQkVfSkFWQT0iIiA7IGZpCiBBQ19TVUJTVChbTUFZQkVfSkFWQV0pCiBpZiB0ZXN0ICIkaGF2ZV9jc2hhcnAiID0gInllcyIgOyB0aGVuIE1BWUJFX0NTSEFSUD0iY3NoYXJwIiA7IGVsc2UgTUFZQkVfQ1NIQVJQPSIiIDsgZmkKIEFDX1NVQlNUKFtNQVlCRV9DU0hBUlBdKQotaWYgdGVzdCAiJGhhdmVfcHl0aG9uIiA9ICJ5ZXMiIDsgdGhlbiBNQVlCRV9QWVRIT049InB5dGhvbiIgOyBlbHNlIE1BWUJFX1BZVEhPTj0iIiA7IGZpCitpZiB0ZXN0ICIkaGF2ZV9weXRob24iID0gInllcyIgOyB0aGVuIE1BWUJFX1BZVEhPTj0icHkiIDsgZWxzZSBNQVlCRV9QWVRIT049IiIgOyBmaQogQUNfU1VCU1QoW01BWUJFX1BZVEhPTl0pCitpZiB0ZXN0ICIkaGF2ZV9weTMiID0gInllcyIgOyB0aGVuIE1BWUJFX1BZMz0icHkzIiA7IGVsc2UgTUFZQkVfUFkzPSIiIDsgZmkKK0FDX1NVQlNUKFtNQVlCRV9QWTNdKQogaWYgdGVzdCAiJGhhdmVfcnVieSIgPSAieWVzIiA7IHRoZW4gTUFZQkVfUlVCWT0icmIiIDsgZWxzZSBNQVlCRV9SVUJZPSIiIDsgZmkKIEFDX1NVQlNUKFtNQVlCRV9SVUJZXSkKLWlmIHRlc3QgIiRoYXZlX2hhc2tlbGwiID0gInllcyIgOyB0aGVuIE1BWUJFX0hBU0tFTEw9Imhhc2tlbGwiIDsgZWxzZSBNQVlCRV9IQVNLRUxMPSIiIDsgZmkKK2lmIHRlc3QgIiRoYXZlX2hhc2tlbGwiID0gInllcyIgOyB0aGVuIE1BWUJFX0hBU0tFTEw9ImhzIiA7IGVsc2UgTUFZQkVfSEFTS0VMTD0iIiA7IGZpCiBBQ19TVUJTVChbTUFZQkVfSEFTS0VMTF0pCiBpZiB0ZXN0ICIkaGF2ZV9wZXJsIiA9ICJ5ZXMiIDsgdGhlbiBNQVlCRV9QRVJMPSJwZXJsIiA7IGVsc2UgTUFZQkVfUEVSTD0iIiA7IGZpCiBBQ19TVUJTVChbTUFZQkVfUEVSTF0pCiBpZiB0ZXN0ICIkaGF2ZV9waHAiID0gInllcyIgOyB0aGVuIE1BWUJFX1BIUD0icGhwIiA7IGVsc2UgTUFZQkVfUEhQPSIiIDsgZmkKIEFDX1NVQlNUKFtNQVlCRV9QSFBdKQoraWYgdGVzdCAiJGhhdmVfZGFydCIgPSAieWVzIiA7IHRoZW4gTUFZQkVfREFSVD0iZGFydCIgOyBlbHNlIE1BWUJFX0RBUlQ9IiIgOyBmaQorQUNfU1VCU1QoW01BWUJFX0RBUlRdKQogaWYgdGVzdCAiJGhhdmVfZ28iID0gInllcyIgOyB0aGVuIE1BWUJFX0dPPSJnbyIgOyBlbHNlIE1BWUJFX0dPPSIiIDsgZmkKIEFDX1NVQlNUKFtNQVlCRV9HT10pCiBpZiB0ZXN0ICIkaGF2ZV9ub2RlanMiID0gInllcyIgOyB0aGVuIE1BWUJFX05PREVKUz0ibm9kZWpzIiA7IGVsc2UgTUFZQkVfTk9ERUpTPSIiIDsgZmkKIEFDX1NVQlNUKFtNQVlCRV9OT0RFSlNdKQoraWYgdGVzdCAiJGhhdmVfbm9kZXRzIiA9ICJ5ZXMiIDsgdGhlbiBNQVlCRV9OT0RFVFM9Im5vZGV0cyIgOyBlbHNlIE1BWUJFX05PREVUUz0iIiA7IGZpCitBQ19TVUJTVChbTUFZQkVfTk9ERVRTXSkKK2lmIHRlc3QgIiRoYXZlX2VybGFuZyIgPSAieWVzIiA7IHRoZW4gTUFZQkVfRVJMQU5HPSJlcmwiIDsgZWxzZSBNQVlCRV9FUkxBTkc9IiIgOyBmaQorQUNfU1VCU1QoW01BWUJFX0VSTEFOR10pCitpZiB0ZXN0ICIkaGF2ZV9sdWEiID0gInllcyIgOyB0aGVuIE1BWUJFX0xVQT0ibHVhIiA7IGVsc2UgTUFZQkVfTFVBPSIiIDsgZmkKK0FDX1NVQlNUKFtNQVlCRV9MVUFdKQoraWYgdGVzdCAiJGhhdmVfcnMiID0gInllcyIgOyB0aGVuIE1BWUJFX1JTPSJycyIgOyBlbHNlIE1BWUJFX1JTPSIiIDsgZmkKK0FDX1NVQlNUKFtNQVlCRV9SU10pCitpZiB0ZXN0ICIkaGF2ZV9zd2lmdCIgPSAieWVzIiA7IHRoZW4gTUFZQkVfU1dJRlQ9InN3aWZ0IiA7IGVsc2UgTUFZQkVfU1dJRlQ9IiIgOyBmaQorQUNfU1VCU1QoW01BWUJFX1NXSUZUXSkKK2lmIHRlc3QgIiRoYXZlX2RvdG5ldGNvcmUiID0gInllcyIgOyB0aGVuIE1BWUJFX0RPVE5FVENPUkU9Im5ldGNvcmUiIDsgZWxzZSBNQVlCRV9ET1RORVRDT1JFPSIiIDsgZmkKK0FDX1NVQlNUKFtNQVlCRV9ET1RORVRDT1JFXSkKK2lmIHRlc3QgIiRoYXZlX2NsIiA9ICJ5ZXMiIDsgdGhlbiBNQVlCRV9DTD0iY2wiIDsgZWxzZSBNQVlCRV9DTD0iIiA7IGZpCitBQ19TVUJTVChbTUFZQkVfQ0xdKQogCiBBQ19PVVRQVVQKIApAQCAtNzg3LDg1ICs5MzYsNTAgQEAKIGVjaG8KIGVjaG8gIiRQQUNLQUdFICRWRVJTSU9OIgogZWNobwotZWNobyAiQnVpbGRpbmcgQysrIExpYnJhcnkgLi4uLi4uLi4uIDogJGhhdmVfY3BwIgogZWNobyAiQnVpbGRpbmcgQyAoR0xpYikgTGlicmFyeSAuLi4uIDogJGhhdmVfY19nbGliIgotZWNobyAiQnVpbGRpbmcgSmF2YSBMaWJyYXJ5IC4uLi4uLi4uIDogJGhhdmVfamF2YSIKLWVjaG8gIkJ1aWxkaW5nIEMjIExpYnJhcnkgLi4uLi4uLi4uLiA6ICRoYXZlX2NzaGFycCIKLWVjaG8gIkJ1aWxkaW5nIFB5dGhvbiBMaWJyYXJ5IC4uLi4uLiA6ICRoYXZlX3B5dGhvbiIKLWVjaG8gIkJ1aWxkaW5nIFJ1YnkgTGlicmFyeSAuLi4uLi4uLiA6ICRoYXZlX3J1YnkiCi1lY2hvICJCdWlsZGluZyBIYXhlIExpYnJhcnkgLi4uLi4uLi4gOiAkaGF2ZV9oYXhlIgotZWNobyAiQnVpbGRpbmcgSGFza2VsbCBMaWJyYXJ5IC4uLi4uIDogJGhhdmVfaGFza2VsbCIKLWVjaG8gIkJ1aWxkaW5nIFBlcmwgTGlicmFyeSAuLi4uLi4uLiA6ICRoYXZlX3BlcmwiCi1lY2hvICJCdWlsZGluZyBQSFAgTGlicmFyeSAuLi4uLi4uLi4gOiAkaGF2ZV9waHAiCitlY2hvICJCdWlsZGluZyBDIyAoTW9ubykgTGlicmFyeSAuLi4gOiAkaGF2ZV9jc2hhcnAiCitlY2hvICJCdWlsZGluZyBDKysgTGlicmFyeSAuLi4uLi4uLi4gOiAkaGF2ZV9jcHAiCitlY2hvICJCdWlsZGluZyBDb21tb24gTGlzcCBMaWJyYXJ5Li4gOiAkaGF2ZV9jbCIKK2VjaG8gIkJ1aWxkaW5nIEQgTGlicmFyeSAuLi4uLi4uLi4uLiA6ICRoYXZlX2QiCitlY2hvICJCdWlsZGluZyBEYXJ0IExpYnJhcnkgLi4uLi4uLi4gOiAkaGF2ZV9kYXJ0IgorZWNobyAiQnVpbGRpbmcgZG90bmV0Y29yZSBMaWJyYXJ5IC4uIDogJGhhdmVfZG90bmV0Y29yZSIKIGVjaG8gIkJ1aWxkaW5nIEVybGFuZyBMaWJyYXJ5IC4uLi4uLiA6ICRoYXZlX2VybGFuZyIKIGVjaG8gIkJ1aWxkaW5nIEdvIExpYnJhcnkgLi4uLi4uLi4uLiA6ICRoYXZlX2dvIgotZWNobyAiQnVpbGRpbmcgRCBMaWJyYXJ5IC4uLi4uLi4uLi4uIDogJGhhdmVfZCIKLWVjaG8gIkJ1aWxkaW5nIE5vZGVKUyBMaWJyYXJ5IC4uLi4uLiA6ICRoYXZlX25vZGVqcyIKK2VjaG8gIkJ1aWxkaW5nIEhhc2tlbGwgTGlicmFyeSAuLi4uLiA6ICRoYXZlX2hhc2tlbGwiCitlY2hvICJCdWlsZGluZyBIYXhlIExpYnJhcnkgLi4uLi4uLi4gOiAkaGF2ZV9oYXhlIgorZWNobyAiQnVpbGRpbmcgSmF2YSBMaWJyYXJ5IC4uLi4uLi4uIDogJGhhdmVfamF2YSIKIGVjaG8gIkJ1aWxkaW5nIEx1YSBMaWJyYXJ5IC4uLi4uLi4uLiA6ICRoYXZlX2x1YSIKK2VjaG8gIkJ1aWxkaW5nIE5vZGVKUyBMaWJyYXJ5IC4uLi4uLiA6ICRoYXZlX25vZGVqcyIKK2VjaG8gIkJ1aWxkaW5nIFBlcmwgTGlicmFyeSAuLi4uLi4uLiA6ICRoYXZlX3BlcmwiCitlY2hvICJCdWlsZGluZyBQSFAgTGlicmFyeSAuLi4uLi4uLi4gOiAkaGF2ZV9waHAiCitlY2hvICJCdWlsZGluZyBQbHVnaW4gU3VwcG9ydCAuLi4uLi4gOiAkaGF2ZV9wbHVnaW4iCitlY2hvICJCdWlsZGluZyBQeXRob24gTGlicmFyeSAuLi4uLi4gOiAkaGF2ZV9weXRob24iCitlY2hvICJCdWlsZGluZyBQeTMgTGlicmFyeSAuLi4uLi4uLi4gOiAkaGF2ZV9weTMiCitlY2hvICJCdWlsZGluZyBSdWJ5IExpYnJhcnkgLi4uLi4uLi4gOiAkaGF2ZV9ydWJ5IgorZWNobyAiQnVpbGRpbmcgUnVzdCBMaWJyYXJ5IC4uLi4uLi4uIDogJGhhdmVfcnMiCitlY2hvICJCdWlsZGluZyBTd2lmdCBMaWJyYXJ5IC4uLi4uLi4gOiAkaGF2ZV9zd2lmdCIKIAotaWYgdGVzdCAiJGhhdmVfY3BwIiA9ICJ5ZXMiIDsgdGhlbgotICBlY2hvCi0gIGVjaG8gIkMrKyBMaWJyYXJ5OiIKLSAgZWNobyAiICAgQnVpbGQgVFpsaWJUcmFuc3BvcnQgLi4uLi4uIDogJGhhdmVfemxpYiIKLSAgZWNobyAiICAgQnVpbGQgVE5vbmJsb2NraW5nU2VydmVyIC4uIDogJGhhdmVfbGliZXZlbnQiCi0gIGVjaG8gIiAgIEJ1aWxkIFRRVGNwU2VydmVyIChRdDQpIC4uLi4gOiAkaGF2ZV9xdCIKLSAgZWNobyAiICAgQnVpbGQgVFFUY3BTZXJ2ZXIgKFF0NSkgLi4uLiA6ICRoYXZlX3F0NSIKLWZpCi1pZiB0ZXN0ICIkaGF2ZV9qYXZhIiA9ICJ5ZXMiIDsgdGhlbgotICBlY2hvCi0gIGVjaG8gIkphdmEgTGlicmFyeToiCi0gIGVjaG8gIiAgIFVzaW5nIGphdmFjIC4uLi4uLi4uLi4uLi4uLiA6ICRKQVZBQyIKLSAgZWNobyAiICAgVXNpbmcgamF2YSAuLi4uLi4uLi4uLi4uLi4uIDogJEpBVkEiCi0gIGVjaG8gIiAgIFVzaW5nIGFudCAuLi4uLi4uLi4uLi4uLi4uLiA6ICRBTlQiCi1maQogaWYgdGVzdCAiJGhhdmVfY3NoYXJwIiA9ICJ5ZXMiIDsgdGhlbgogICBlY2hvCiAgIGVjaG8gIkMjIExpYnJhcnk6IgogICBlY2hvICIgICBVc2luZyAuTkVUIDMuNSAuLi4uLi4uLi4uLi4gOiAkbmV0XzNfNSIKKyAgZWNobyAiICAgVXNpbmcgbW9ubyB2ZXJzaW9uIC4uLi4uLi4uIDogJCgkTUNTIC0tdmVyc2lvbiB8IGhlYWQgLTEpIgogZmkKLWlmIHRlc3QgIiRoYXZlX3B5dGhvbiIgPSAieWVzIiA7IHRoZW4KK2lmIHRlc3QgIiRoYXZlX2NwcCIgPSAieWVzIiA7IHRoZW4KICAgZWNobwotICBlY2hvICJQeXRob24gTGlicmFyeToiCi0gIGVjaG8gIiAgIFVzaW5nIFB5dGhvbiAuLi4uLi4uLi4uLi4uLiA6ICRQWVRIT04iCi0gIGVjaG8gIiAgIFVzaW5nIFRyaWFsIC4uLi4uLi4uLi4uLi4uLiA6ICRUUklBTCIKKyAgZWNobyAiQysrIExpYnJhcnk6IgorICBlY2hvICIgICBDKysgY29tcGlsZXIgLi4uLi4uLi4uLi4uLi4gOiAkQ1hYIgorICBlY2hvICIgICBCdWlsZCBUWmxpYlRyYW5zcG9ydCAuLi4uLi4gOiAkaGF2ZV96bGliIgorICBlY2hvICIgICBCdWlsZCBUTm9uYmxvY2tpbmdTZXJ2ZXIgLi4gOiAkaGF2ZV9saWJldmVudCIKKyAgZWNobyAiICAgQnVpbGQgVFFUY3BTZXJ2ZXIgKFF0NCkgLi4uIDogJGhhdmVfcXQiCisgIGVjaG8gIiAgIEJ1aWxkIFRRVGNwU2VydmVyIChRdDUpIC4uLiA6ICRoYXZlX3F0NSIKKyAgZWNobyAiICAgQysrIGNvbXBpbGVyIHZlcnNpb24gLi4uLi4uIDogJCgkQ1hYIC0tdmVyc2lvbiB8IGhlYWQgLTEpIgogZmkKLWlmIHRlc3QgIiRoYXZlX3BocCIgPSAieWVzIiA7IHRoZW4KK2lmIHRlc3QgIiRoYXZlX2NsIiA9ICJ5ZXMiIDsgdGhlbgogICBlY2hvCi0gIGVjaG8gIlBIUCBMaWJyYXJ5OiIKLSAgZWNobyAiICAgVXNpbmcgcGhwLWNvbmZpZyAuLi4uLi4uLi4uIDogJFBIUF9DT05GSUciCi1maQotaWYgdGVzdCAiJGhhdmVfcnVieSIgPSAieWVzIiA7IHRoZW4KLSAgZWNobwotICBlY2hvICJSdWJ5IExpYnJhcnk6IgotICBlY2hvICIgICBVc2luZyBSdWJ5IC4uLi4uLi4uLi4uLi4uLi4gOiAkUlVCWSIKLWZpCi1pZiB0ZXN0ICIkaGF2ZV9oYXNrZWxsIiA9ICJ5ZXMiIDsgdGhlbgotICBlY2hvCi0gIGVjaG8gIkhhc2tlbGwgTGlicmFyeToiCi0gIGVjaG8gIiAgIFVzaW5nIEhhc2tlbGwgLi4uLi4uLi4uLi4uLiA6ICRSVU5IQVNLRUxMIgotICBlY2hvICIgICBVc2luZyBDYWJhbCAuLi4uLi4uLi4uLi4uLi4gOiAkQ0FCQUwiCi1maQotaWYgdGVzdCAiJGhhdmVfaGF4ZSIgPSAieWVzIiA7IHRoZW4KLSAgZWNobwotICBlY2hvICJIYXhlIExpYnJhcnk6IgotICBlY2hvICIgICBVc2luZyBIYXhlIC4uLi4uLi4uLi4uLi4uLi4gOiAkSEFYRSIKLSAgZWNobyAiICAgVXNpbmcgSGF4ZSB2ZXJzaW9uIC4uLi4uLi4uIDogJEhBWEVfVkVSU0lPTiIKLWZpCi1pZiB0ZXN0ICIkaGF2ZV9wZXJsIiA9ICJ5ZXMiIDsgdGhlbgotICBlY2hvCi0gIGVjaG8gIlBlcmwgTGlicmFyeToiCi0gIGVjaG8gIiAgIFVzaW5nIFBlcmwgLi4uLi4uLi4uLi4uLi4uLiA6ICRQRVJMIgotZmkKLWlmIHRlc3QgIiRoYXZlX2VybGFuZyIgPSAieWVzIiA7IHRoZW4KLSAgZWNobwotICBlY2hvICJFcmxhbmcgTGlicmFyeToiCi0gIGVjaG8gIiAgIFVzaW5nIGVybGMgLi4uLi4uLi4uLi4uLi4uLiA6ICRFUkxDIgotZmkKLWlmIHRlc3QgIiRoYXZlX2dvIiA9ICJ5ZXMiIDsgdGhlbgotICBlY2hvCi0gIGVjaG8gIkdvIExpYnJhcnk6IgotICBlY2hvICIgICBVc2luZyBHby4uLi4uLi4uLi4uLi4uLi4uLi4gOiAkR08iCi0gIGVjaG8gIiAgIFVzaW5nIEdvIHZlcnNpb24uLi4uLi4uLi4uLiA6ICQoJEdPIHZlcnNpb24pIgorICBlY2hvICJDb21tb24gTGlzcCBMaWJyYXJ5OiIKKyAgZWNobyAiICAgVXNpbmcgQ29tbW9uIExpc3AgLi4uLi4uLi4uIDogJFNCQ0wiCisgIGVjaG8gIiAgIFVzaW5nIENvbW1vbiBMaXNwIHZlcnNpb24gLiA6ICQoJFNCQ0wgLS12ZXJzaW9uKSIKIGZpCiBpZiB0ZXN0ICIkaGF2ZV9kIiA9ICJ5ZXMiIDsgdGhlbgogICBlY2hvCkBAIC04NzMsNiArOTg3LDYxIEBACiAgIGVjaG8gIiAgIFVzaW5nIEQgQ29tcGlsZXIgLi4uLi4uLi4uLiA6ICRETUQiCiAgIGVjaG8gIiAgIEJ1aWxkaW5nIEQgbGliZXZlbnQgdGVzdHMgLiA6ICR3aXRoX2RfZXZlbnRfdGVzdHMiCiAgIGVjaG8gIiAgIEJ1aWxkaW5nIEQgU1NMIHRlc3RzIC4uLi4uLiA6ICR3aXRoX2Rfc3NsX3Rlc3RzIgorICBlY2hvICIgICBVc2luZyBEIHZlcnNpb24gLi4uLi4uLi4uLi4gOiAkKCRETUQgLS12ZXJzaW9uIHwgaGVhZCAtMSkiCitmaQoraWYgdGVzdCAiJGhhdmVfZGFydCIgPSAieWVzIiA7IHRoZW4KKyAgZWNobworICBlY2hvICJEYXJ0IExpYnJhcnk6IgorICBlY2hvICIgICBVc2luZyBEYXJ0IC4uLi4uLi4uLi4uLi4uLi4gOiAkREFSVCIKKyAgZWNobyAiICAgVXNpbmcgUHViIC4uLi4uLi4uLi4uLi4uLi4uIDogJERBUlRQVUIiCisgIGVjaG8gIiAgIFVzaW5nIERhcnQgdmVyc2lvbiAuLi4uLi4uLiA6ICQoJERBUlQgLS12ZXJzaW9uIDI+JjEpIgorZmkKK2lmIHRlc3QgIiRoYXZlX2RvdG5ldGNvcmUiID0gInllcyIgOyB0aGVuCisgIGVjaG8KKyAgZWNobyAiLk5FVCBDb3JlIExpYnJhcnk6IgorICBlY2hvICIgICBVc2luZyAuTkVUIENvcmUgLi4uLi4uLi4uLi4gOiAkRE9UTkVUQ09SRSIKKyAgZWNobyAiICAgVXNpbmcgLk5FVCBDb3JlIHZlcnNpb24gLi4uIDogJERPVE5FVENPUkVfVkVSU0lPTiIKK2ZpCitpZiB0ZXN0ICIkaGF2ZV9lcmxhbmciID0gInllcyIgOyB0aGVuCisgIGVjaG8KKyAgZWNobyAiRXJsYW5nIExpYnJhcnk6IgorICBlY2hvICIgICBVc2luZyBlcmxjIC4uLi4uLi4uLi4uLi4uLi4gOiAkRVJMQyIKKyAgZWNobyAiICAgVXNpbmcgcmViYXIgLi4uLi4uLi4uLi4uLi4uIDogJFJFQkFSIgorICBlY2hvICIgICBVc2luZyBlcmxjIHZlcnNpb24gLi4uLi4uLi4gOiAkKCRFUkwgLWV2YWwgJ2VybGFuZzpkaXNwbGF5KGVybGFuZzpzeXN0ZW1faW5mbyhvdHBfcmVsZWFzZSkpLCBoYWx0KCkuJyAtbm9zaGVsbCB8IHRyIC1kICdcIicpIgorZmkKK2lmIHRlc3QgIiRoYXZlX2dvIiA9ICJ5ZXMiIDsgdGhlbgorICBlY2hvCisgIGVjaG8gIkdvIExpYnJhcnk6IgorICBlY2hvICIgICBVc2luZyBHby4uLi4uLi4uLi4uLi4uLi4uLi4gOiAkR08iCisgIGVjaG8gIiAgIFVzaW5nIEdvIHZlcnNpb24uLi4uLi4uLi4uLiA6ICQoJEdPIHZlcnNpb24pIgorZmkKK2lmIHRlc3QgIiRoYXZlX2hhc2tlbGwiID0gInllcyIgOyB0aGVuCisgIGVjaG8KKyAgZWNobyAiSGFza2VsbCBMaWJyYXJ5OiIKKyAgZWNobyAiICAgVXNpbmcgQ2FiYWwgLi4uLi4uLi4uLi4uLi4uIDogJENBQkFMIgorICBlY2hvICIgICBVc2luZyBIYXNrZWxsIC4uLi4uLi4uLi4uLi4gOiAkUlVOSEFTS0VMTCIKKyAgZWNobyAiICAgVXNpbmcgSGFza2VsbCB2ZXJzaW9uIC4uLi4uIDogJCgkUlVOSEFTS0VMTCAtLXZlcnNpb24pIgorZmkKK2lmIHRlc3QgIiRoYXZlX2hheGUiID0gInllcyIgOyB0aGVuCisgIGVjaG8KKyAgZWNobyAiSGF4ZSBMaWJyYXJ5OiIKKyAgZWNobyAiICAgVXNpbmcgSGF4ZSAuLi4uLi4uLi4uLi4uLi4uIDogJEhBWEUiCisgIGVjaG8gIiAgIFVzaW5nIEhheGUgdmVyc2lvbiAuLi4uLi4uLiA6ICRIQVhFX1ZFUlNJT04iCitmaQoraWYgdGVzdCAiJGhhdmVfamF2YSIgPSAieWVzIiA7IHRoZW4KKyAgZWNobworICBlY2hvICJKYXZhIExpYnJhcnk6IgorICBlY2hvICIgICBVc2luZyBncmFkbGV3IC4uLi4uLi4uLi4uLi4gOiBsaWIvamF2YS9ncmFkbGV3IgorICBlY2hvICIgICBVc2luZyBqYXZhIC4uLi4uLi4uLi4uLi4uLi4gOiAkSkFWQSIKKyAgZWNobyAiICAgVXNpbmcgamF2YWMgLi4uLi4uLi4uLi4uLi4uIDogJEpBVkFDIgorICBlY2hvICIgICBVc2luZyBHcmFkbGUgdmVyc2lvbiAuLi4uLi4gOiAkKGxpYi9qYXZhL2dyYWRsZXcgLS12ZXJzaW9uIC0tcXVpZXQgfCBncmVwIEdyYWRsZSAyPiYxKSIKKyAgZWNobyAiICAgVXNpbmcgamF2YSB2ZXJzaW9uIC4uLi4uLi4uIDogJCgkSkFWQSAtdmVyc2lvbiAyPiYxIHwgZ3JlcCAndmVyc2lvbiAnKSIKK2ZpCitpZiB0ZXN0ICIkaGF2ZV9sdWEiID0gInllcyIgOyB0aGVuCisgIGVjaG8KKyAgZWNobyAiTHVhIExpYnJhcnk6IgorICBlY2hvICIgICBVc2luZyBMdWEgLi4uLi4uLi4uLi4uLi4uLi4gOiAkTFVBIgorICBlY2hvICIgICBVc2luZyBMdWEgdmVyc2lvbi4uLi4uLi4uLi4gOiAkKCRMVUEgLXYpIgogZmkKIGlmIHRlc3QgIiRoYXZlX25vZGVqcyIgPSAieWVzIiA7IHRoZW4KICAgZWNobwpAQCAtODgwLDEyICsxMDQ5LDUyIEBACiAgIGVjaG8gIiAgIFVzaW5nIE5vZGVKUyAuLi4uLi4uLi4uLi4uLiA6ICROT0RFSlMiCiAgIGVjaG8gIiAgIFVzaW5nIE5vZGVKUyB2ZXJzaW9uLi4uLi4uLiA6ICQoJE5PREVKUyAtLXZlcnNpb24pIgogZmkKLWlmIHRlc3QgIiRoYXZlX2x1YSIgPSAieWVzIiA7IHRoZW4KK2lmIHRlc3QgIiRoYXZlX3BlcmwiID0gInllcyIgOyB0aGVuCiAgIGVjaG8KLSAgZWNobyAiTHVhIExpYnJhcnk6IgotICBlY2hvICIgICBVc2luZyBMdWEgLi4uLi4uLi4uLi4uLi4gOiAkTFVBIgorICBlY2hvICJQZXJsIExpYnJhcnk6IgorICBlY2hvICIgICBVc2luZyBQZXJsIC4uLi4uLi4uLi4uLi4uLi4gOiAkUEVSTCIKKyAgZWNobyAiICAgVXNpbmcgUGVybCB2ZXJzaW9uIC4uLi4uLi4uIDogJCgkUEVSTCAtdiB8IGdyZXAgJ3ZlcnNpb24gJykiCitmaQoraWYgdGVzdCAiJGhhdmVfcGhwIiA9ICJ5ZXMiIDsgdGhlbgorICBlY2hvCisgIGVjaG8gIlBIUCBMaWJyYXJ5OiIKKyAgZWNobyAiICAgVXNpbmcgcGhwLWNvbmZpZyAuLi4uLi4uLi4uIDogJFBIUF9DT05GSUciCisgIGVjaG8gIiAgIFVzaW5nIHBocCB2ZXJzaW9uIC4uLi4uLi4uLiA6ICQoJFBIUCAtLXZlcnNpb24gfCBoZWFkIC0xKSIKK2ZpCitpZiB0ZXN0ICIkaGF2ZV9weXRob24iID0gInllcyIgOyB0aGVuCisgIGVjaG8KKyAgZWNobyAiUHl0aG9uIExpYnJhcnk6IgorICBlY2hvICIgICBVc2luZyBQeXRob24gLi4uLi4uLi4uLi4uLi4gOiAkUFlUSE9OIgorICBlY2hvICIgICBVc2luZyBQeXRob24gdmVyc2lvbiAuLi4uLi4gOiAkKCRQWVRIT04gLS12ZXJzaW9uIDI+JjEpIgorICBpZiB0ZXN0ICIkaGF2ZV9weTMiID0gInllcyIgOyB0aGVuCisgIGVjaG8gIiAgIFVzaW5nIFB5dGhvbjMgLi4uLi4uLi4uLi4uLiA6ICRQWVRIT04zIgorICBlY2hvICIgICBVc2luZyBQeXRob24zIHZlcnNpb24gLi4uLi4gOiAkKCRQWVRIT04zIC0tdmVyc2lvbikiCisgIGZpCisgIGlmIHRlc3QgIiRoYXZlX3RyaWFsIiA9ICJ5ZXMiOyB0aGVuCisgIGVjaG8gIiAgIFVzaW5nIHRyaWFsIC4uLi4uLi4uLi4uLi4uLiA6ICRUUklBTCIKKyAgZmkKK2ZpCitpZiB0ZXN0ICIkaGF2ZV9ydWJ5IiA9ICJ5ZXMiIDsgdGhlbgorICBlY2hvCisgIGVjaG8gIlJ1YnkgTGlicmFyeToiCisgIGVjaG8gIiAgIFVzaW5nIFJ1YnkgLi4uLi4uLi4uLi4uLi4uLiA6ICRSVUJZIgorICBlY2hvICIgICBVc2luZyBSdWJ5IHZlcnNpb24gLi4uLi4uLi4gOiAkKCRSVUJZIC0tdmVyc2lvbikiCitmaQoraWYgdGVzdCAiJGhhdmVfcnMiID0gInllcyIgOyB0aGVuCisgIGVjaG8KKyAgZWNobyAiUnVzdCBMaWJyYXJ5OiIKKyAgZWNobyAiICAgVXNpbmcgQ2FyZ28uLi4uLi4uLi4uLi4uLi4uIDogJENBUkdPIgorICBlY2hvICIgICBVc2luZyBydXN0Yy4uLi4uLi4uLi4uLi4uLi4gOiAkUlVTVEMiCisgIGVjaG8gIiAgIFVzaW5nIFJ1c3QgdmVyc2lvbi4uLi4uLi4uLiA6ICQoJFJVU1RDIC0tdmVyc2lvbikiCitmaQoraWYgdGVzdCAiJGhhdmVfc3dpZnQiID0gInllcyIgOyB0aGVuCisgIGVjaG8KKyAgZWNobyAiU3dpZnQgTGlicmFyeToiCisgIGVjaG8gIiAgIFVzaW5nIFN3aWZ0IC4uLi4uLi4uLi4uLi4uLiA6ICRTV0lGVCIKKyAgZWNobyAiICAgVXNpbmcgU3dpZnQgdmVyc2lvbiAuLi4uLi4uIDogJCgkU1dJRlQgLS12ZXJzaW9uIHwgaGVhZCAtMSkiCiBmaQogZWNobwogZWNobyAiSWYgc29tZXRoaW5nIGlzIG1pc3NpbmcgdGhhdCB5b3UgdGhpbmsgc2hvdWxkIGJlIHByZXNlbnQsIgogZWNobyAicGxlYXNlIHNraW0gdGhlIG91dHB1dCBvZiBjb25maWd1cmUgdG8gZmluZCB0aGUgbWlzc2luZyIKIGVjaG8gImNvbXBvbmVudC4gIERldGFpbHMgYXJlIHByZXNlbnQgaW4gY29uZmlnLmxvZy4iCitlY2hvCmRpZmYgLS1naXQgYS9jb250cmliL1JlYnVzL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvY29udHJpYi9SZWJ1cy9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwppbmRleCA1ZGU2YTE0Li5lNDc2ZWFiIDEwMDY0NAotLS0gYS9jb250cmliL1JlYnVzL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCisrKyBiL2NvbnRyaWIvUmVidXMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKQEAgLTI2LDcgKzI2LDcgQEAKIFthc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KIFthc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCIiKV0KIFthc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJSZWJ1c1NhbXBsZSIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiQ29weXJpZ2h0IMKpICAyMDE1IildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJDb3B5cmlnaHQgwqkgIDIwMTQiKV0KIFthc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQogW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoIiIpXQogCkBAIC0zNCw1ICszNCw1IEBACiAKIFthc3NlbWJseTogR3VpZCgiMGFmMTA5ODQtNDBkMy00NTNkLWIxZTUtNDIxNTI5ZThjN2UyIildCiAKLVthc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIwLjkuMy4wIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjAuOS4zLjAiKV0KK1thc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuMC4wIildCitbYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjEuMC4wLjAiKV0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvVmFncmFudGZpbGUgYi9jb250cmliL1ZhZ3JhbnRmaWxlCmluZGV4IGQ5YTkwOGQuLmZmNTMzMTYgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvVmFncmFudGZpbGUKKysrIGIvY29udHJpYi9WYWdyYW50ZmlsZQpAQCAtNDMsMTAgKzQzLDEwIEBACiBzdWRvIGFwdC1nZXQgaW5zdGFsbCAtcXEgbGliYm9vc3QtZGV2IGxpYmJvb3N0LXRlc3QtZGV2IGxpYmJvb3N0LXByb2dyYW0tb3B0aW9ucy1kZXYgbGliYm9vc3QtZmlsZXN5c3RlbS1kZXYgbGliYm9vc3Qtc3lzdGVtLWRldiBsaWJldmVudC1kZXYgCiAKICMgSmF2YSBkZXBlbmRlbmNpZXMKLXN1ZG8gYXB0LWdldCBpbnN0YWxsIC1xcSBhbnQgb3Blbmpkay03LWpkayBtYXZlbgorc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIGFudCBvcGVuamRrLTgtamRrIG1hdmVuCiAKICMgUHl0aG9uIGRlcGVuZGVuY2llcwotc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIHB5dGhvbi1hbGwgcHl0aG9uLWFsbC1kZXYgcHl0aG9uLWFsbC1kYmcgcHl0aG9uLXNldHVwdG9vbHMgcHl0aG9uLXN1cHBvcnQKK3N1ZG8gYXB0LWdldCBpbnN0YWxsIC1xcSBweXRob24tYWxsIHB5dGhvbi1hbGwtZGV2IHB5dGhvbi1hbGwtZGJnIHB5dGhvbi1zZXR1cHRvb2xzIHB5dGhvbi1zdXBwb3J0IHB5dGhvbi1zaXggcHl0aG9uMy1zaXgKIAogIyBSdWJ5IGRlcGVuZGVuY2llcwogc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIHJ1YnkgcnVieS1kZXYKQEAgLTYyLDcgKzYyLDcgQEAKIHN1ZG8gYXB0LWdldCBpbnN0YWxsIC1xcSBsaWJnbGliMi4wLWRldgogCiAjIEVybGFuZyBkZXBlbmRlbmNpZXMKLXN1ZG8gYXB0LWdldCBpbnN0YWxsIC1xcSBlcmxhbmctYmFzZSBlcmxhbmctZXVuaXQgZXJsYW5nLWRldgorc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIGVybGFuZy1iYXNlIGVybGFuZy1ldW5pdCBlcmxhbmctZGV2IGVybGFuZy10b29scwogCiAjIEdPIGRlcGVuZGVuY2llcwogZWNobyAiZ29sYW5nLWdvIGdvbGFuZy1nby9kYXNoYm9hcmQgYm9vbGVhbiBmYWxzZSIgfCBkZWJjb25mLXNldC1zZWxlY3Rpb25zCkBAIC04OSw4ICs4OSw4IEBACiAKICMgQ3VzdG9taXplIHRoZSBzeXN0ZW0KICMgLS0tCi0jIERlZmF1bHQgamF2YSB0byBsYXRlc3QgMS43IHZlcnNpb24KLXVwZGF0ZS1qYXZhLWFsdGVybmF0aXZlcyAtcyBqYXZhLTEuNy4wLW9wZW5qZGstYW1kNjQgCisjIERlZmF1bHQgamF2YSB0byBsYXRlc3QgMS44IHZlcnNpb24KK3VwZGF0ZS1qYXZhLWFsdGVybmF0aXZlcyAtcyBqYXZhLTEuOC4wLW9wZW5qZGstYW1kNjQgCiAKICMgUEhQVW5pdCBwYWNrYWdlIGJyb2tlbiBpbiB1YnVudHUuIHNlZSBodHRwczovL2J1Z3MubGF1bmNocGFkLm5ldC91YnVudHUvK3NvdXJjZS9waHB1bml0LytidWcvNzAxNTQ0CiBzdWRvIGFwdC1nZXQgdXBncmFkZSBwZWFyCmRpZmYgLS1naXQgYS9jb250cmliL2FzeW5jLXRlc3QvdGVzdC1sZWFmLnB5IGIvY29udHJpYi9hc3luYy10ZXN0L3Rlc3QtbGVhZi5weQppbmRleCA4YjdjM2UzLi40ZWE0YTliIDEwMDc1NQotLS0gYS9jb250cmliL2FzeW5jLXRlc3QvdGVzdC1sZWFmLnB5CisrKyBiL2NvbnRyaWIvYXN5bmMtdGVzdC90ZXN0LWxlYWYucHkKQEAgLTcsMTYgKzcsMTcgQEAKIGZyb20gdGhyaWZ0LnNlcnZlciBpbXBvcnQgVEh0dHBTZXJ2ZXIKIGZyb20gYWdnciBpbXBvcnQgQWdncgogCisKIGNsYXNzIEFnZ3JIYW5kbGVyKEFnZ3IuSWZhY2UpOgotICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgc2VsZi52YWx1ZXMgPSBbXQorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi52YWx1ZXMgPSBbXQogCi0gIGRlZiBhZGRWYWx1ZShzZWxmLCB2YWx1ZSk6Ci0gICAgc2VsZi52YWx1ZXMuYXBwZW5kKHZhbHVlKQorICAgIGRlZiBhZGRWYWx1ZShzZWxmLCB2YWx1ZSk6CisgICAgICAgIHNlbGYudmFsdWVzLmFwcGVuZCh2YWx1ZSkKIAotICBkZWYgZ2V0VmFsdWVzKHNlbGYsICk6Ci0gICAgdGltZS5zbGVlcCgxKQotICAgIHJldHVybiBzZWxmLnZhbHVlcworICAgIGRlZiBnZXRWYWx1ZXMoc2VsZiwgKToKKyAgICAgICAgdGltZS5zbGVlcCgxKQorICAgICAgICByZXR1cm4gc2VsZi52YWx1ZXMKIAogcHJvY2Vzc29yID0gQWdnci5Qcm9jZXNzb3IoQWdnckhhbmRsZXIoKSkKIHBmYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKQpkaWZmIC0tZ2l0IGEvY29udHJpYi9mYjMwMy9jcHAvRmFjZWJvb2tCYXNlLmggYi9jb250cmliL2ZiMzAzL2NwcC9GYWNlYm9va0Jhc2UuaAppbmRleCAyMTU5Yzk1Li5kYWE1MjQ2IDEwMDY0NAotLS0gYS9jb250cmliL2ZiMzAzL2NwcC9GYWNlYm9va0Jhc2UuaAorKysgYi9jb250cmliL2ZiMzAzL2NwcC9GYWNlYm9va0Jhc2UuaApAQCAtMjIsNiArMjIsNyBAQAogCiAjaW5jbHVkZSAiRmFjZWJvb2tTZXJ2aWNlLmgiCiAKKyNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KICNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RTZXJ2ZXIuaD4KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguaD4KIApkaWZmIC0tZ2l0IGEvY29udHJpYi9mYjMwMy9pZi9mYjMwMy50aHJpZnQgYi9jb250cmliL2ZiMzAzL2lmL2ZiMzAzLnRocmlmdAppbmRleCA2NmM4MzE1Li44OWJkNmViIDEwMDY0NAotLS0gYS9jb250cmliL2ZiMzAzL2lmL2ZiMzAzLnRocmlmdAorKysgYi9jb250cmliL2ZiMzAzL2lmL2ZiMzAzLnRocmlmdApAQCAtMjQsNiArMjQsNyBAQAogbmFtZXNwYWNlIGphdmEgY29tLmZhY2Vib29rLmZiMzAzCiBuYW1lc3BhY2UgY3BwIGZhY2Vib29rLmZiMzAzCiBuYW1lc3BhY2UgcGVybCBGYWNlYm9vay5GQjMwMworbmFtZXNwYWNlIG5ldGNvcmUgRmFjZWJvb2suRkIzMDMuVGVzdAogCiAvKioKICAqIENvbW1vbiBzdGF0dXMgcmVwb3J0aW5nIG1lY2hhbmlzbSBhY3Jvc3MgYWxsIHNlcnZpY2VzCmRpZmYgLS1naXQgYS9jb250cmliL2ZiMzAzL2phdmEvYnVpbGQucHJvcGVydGllcyBiL2NvbnRyaWIvZmIzMDMvamF2YS9idWlsZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NjM2NjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2ZiMzAzL2phdmEvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDUgQEAKKyMgTWF2ZW4gQW50IHRhc2tzIEphciBkZXRhaWxzCittdm4uYW50LnRhc2sudmVyc2lvbj0yLjEuMworbXZuLnJlcG89aHR0cDovL3JlcG8xLm1hdmVuLm9yZy9tYXZlbjIKK212bi5hbnQudGFzay51cmw9JHttdm4ucmVwb30vb3JnL2FwYWNoZS9tYXZlbi9tYXZlbi1hbnQtdGFza3MvJHttdm4uYW50LnRhc2sudmVyc2lvbn0KK212bi5hbnQudGFzay5qYXI9bWF2ZW4tYW50LXRhc2tzLSR7bXZuLmFudC50YXNrLnZlcnNpb259LmphcgpkaWZmIC0tZ2l0IGEvY29udHJpYi9mYjMwMy9qYXZhL2J1aWxkLnhtbCBiL2NvbnRyaWIvZmIzMDMvamF2YS9idWlsZC54bWwKaW5kZXggOGYyZmE1MS4uN2ExYjhmMSAxMDA3NTUKLS0tIGEvY29udHJpYi9mYjMwMy9qYXZhL2J1aWxkLnhtbAorKysgYi9jb250cmliL2ZiMzAzL2phdmEvYnVpbGQueG1sCkBAIC03LDkgKzcsOSBAQAogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCiAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gCisKICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAKKwogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQpAQCAtMjYsMjAgKzI2LDIwIEBACiAgIDxwcm9wZXJ0eSBuYW1lPSJpbnRlcmZhY2UuZGlyIiB2YWx1ZT0iJHtiYXNlZGlyfS8uLi9pZiIvPgogICA8cHJvcGVydHkgbmFtZT0idGhyaWZ0LmphdmEuZGlyIiBsb2NhdGlvbj0iJHt0aHJpZnQucm9vdH0vbGliL2phdmEiLz4KICAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLnRvb2xzLmRpciIgbG9jYXRpb249IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC90b29scy8iLz4KLSAgPHByb3BlcnR5IG5hbWU9InRocmlmdF9jb21waWxlciIgdmFsdWU9IiR7dGhyaWZ0LnJvb3R9L2NvbXBpbGVyL2NwcC90aHJpZnQiLz4gCisgIDxwcm9wZXJ0eSBuYW1lPSJ0aHJpZnRfY29tcGlsZXIiIHZhbHVlPSIke3RocmlmdC5yb290fS9jb21waWxlci9jcHAvdGhyaWZ0Ii8+CisgIDxwcm9wZXJ0eSBmaWxlPSIke2Jhc2VkaXJ9L2J1aWxkLnByb3BlcnRpZXMiLz4KIAogICA8IS0tIGluaGVyaXQgZnJvbSB0aGUgamF2YSBidWlsZCBmaWxlIGZvciB2ZXJzaW9uIGFuZCBvdGhlciBwcm9wZXJ0aWVzIC0tPgotICA8cHJvcGVydHkgZmlsZT0iJHt0aHJpZnQuamF2YS5kaXJ9L2J1aWxkLnByb3BlcnRpZXMiIC8+CisgIDxwcm9wZXJ0eSBmaWxlPSIke3RocmlmdC5qYXZhLmRpcn0vZ3JhZGxlLnByb3BlcnRpZXMiIC8+CiAKICAgPHByb3BlcnR5IGVudmlyb25tZW50PSJlbnYiLz4KIAogICA8Y29uZGl0aW9uIHByb3BlcnR5PSJ2ZXJzaW9uIiB2YWx1ZT0iJHt0aHJpZnQudmVyc2lvbn0iPgogICAgIDxpc3NldCBwcm9wZXJ0eT0icmVsZWFzZSIvPgogICA8L2NvbmRpdGlvbj4KLSAgPHByb3BlcnR5IG5hbWU9InZlcnNpb24iIHZhbHVlPSIke3RocmlmdC52ZXJzaW9ufS1zbmFwc2hvdCIvPgorICA8cHJvcGVydHkgbmFtZT0idmVyc2lvbiIgdmFsdWU9IiR7dGhyaWZ0LnZlcnNpb259LVNOQVBTSE9UIi8+CiAKICAgPHByb3BlcnR5IG5hbWU9ImZiMzAzLmZpbmFsLm5hbWUiIHZhbHVlPSIke2ZiMzAzLmFydGlmYWN0aWR9LSR7dmVyc2lvbn0iLz4KLSAgPHByb3BlcnR5IG5hbWU9InRocmlmdC5qYXZhLmxpYnRocmlmdCIgdmFsdWU9IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC9saWJ0aHJpZnQtJHt2ZXJzaW9ufS5qYXIiLz4KIAogICA8cHJvcGVydHkgbmFtZT0ic3JjIiB2YWx1ZT0iJHtiYXNlZGlyfS9zcmMiLz4KICAgPHByb3BlcnR5IG5hbWU9ImdlbiIgdmFsdWU9IiR7YmFzZWRpcn0vZ2VuLWphdmEiLz4KQEAgLTc0LDggKzc0LDEyIEBACiAgICAgPGVjaG8gbWVzc2FnZT0iQnVpbGRpbmcgJHtmYjMwMy5maW5hbC5uYW1lfS5qYXIiLz4KICAgICA8amF2YWMgZGVzdGRpcj0iJHtidWlsZC5jbGFzc2VzLmRpcn0iIGRlYnVnPSJvbiI+CiAgICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dGhyaWZ0LmphdmEubGlidGhyaWZ0fSIvPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7dGhyaWZ0LnJvb3R9L2xpYi9qYXZhL2J1aWxkL2xpYiI+CisgICAgICAgIDxmaWxlc2V0IGRpcj0iJHt0aHJpZnQuamF2YS5kaXJ9L2J1aWxkL2xpYnMiPgorICAgICAgICAgIDxpbmNsdWRlIG5hbWU9ImxpYnRocmlmdCouamFyIiAvPgorICAgICAgICAgIDxleGNsdWRlIG5hbWU9ImxpYnRocmlmdCpqYXZhZG9jLmphciIgLz4KKyAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJsaWJ0aHJpZnQqc291cmNlcy5qYXIiIC8+CisgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgPGZpbGVzZXQgZGlyPSIke3RocmlmdC5qYXZhLmRpcn0vYnVpbGQvZGVwcyI+CiAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiLz4KICAgICAgICAgPC9maWxlc2V0PgogICAgICAgPC9jbGFzc3BhdGg+CkBAIC0xMjAsMjEgKzEyNCwyMSBAQAogICAgIDxhcnRpZmFjdDpyZW1vdGVSZXBvc2l0b3J5IGlkPSJhcGFjaGUiIHVybD0iJHthcGFjaGUucmVwb30iLz4KIAogICAgIDwhLS0gUG9tIGZpbGUgaW5mb3JtYXRpb24gLS0+Ci0gICAgPGFydGlmYWN0OnBvbSBpZD0icG9tIiAKLSAgICAgIGdyb3VwSWQ9IiR7dGhyaWZ0Lmdyb3VwaWR9IiAKKyAgICA8YXJ0aWZhY3Q6cG9tIGlkPSJwb20iCisgICAgICBncm91cElkPSIke3RocmlmdC5ncm91cGlkfSIKICAgICAgIGFydGlmYWN0SWQ9IiR7ZmIzMDMuYXJ0aWZhY3RpZH0iCi0gICAgICB2ZXJzaW9uPSIke3ZlcnNpb259IiAKKyAgICAgIHZlcnNpb249IiR7dmVyc2lvbn0iCiAgICAgICB1cmw9Imh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZyIKICAgICAgIG5hbWU9IkFwYWNoZSBUaHJpZnQiCiAgICAgICBkZXNjcmlwdGlvbj0iVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcyBkZXZlbG9wbWVudC4iCi0gICAgICBwYWNrYWdpbmc9InBvbSIKKyAgICAgIHBhY2thZ2luZz0iamFyIgogICAgID4KICAgICAgIDxyZW1vdGVSZXBvc2l0b3J5IHJlZmlkPSJjZW50cmFsIi8+CiAgICAgICA8cmVtb3RlUmVwb3NpdG9yeSByZWZpZD0iYXBhY2hlIi8+CiAgICAgICA8bGljZW5zZSBuYW1lPSJUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMi4wIiB1cmw9IiR7bGljZW5zZX0iLz4KLSAgICAgIDxzY20gY29ubmVjdGlvbj0ic2NtOmdpdDpodHRwczovL2dpdC13aXAtdXMuYXBhY2hlLm9yZy9yZXBvcy9hc2YvdGhyaWZ0LmdpdCIgCi0gICAgICBkZXZlbG9wZXJDb25uZWN0aW9uPSJzY206Z2l0Omh0dHBzOi8vZ2l0LXdpcC11cy5hcGFjaGUub3JnL3JlcG9zL2FzZi90aHJpZnQuZ2l0IgotICAgICAgdXJsPSJodHRwczovL2dpdC13aXAtdXMuYXBhY2hlLm9yZy9yZXBvcy9hc2Y/cD10aHJpZnQuZ2l0IgorICAgICAgPHNjbSBjb25uZWN0aW9uPSJzY206Z2l0Omh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0LmdpdCIKKyAgICAgIGRldmVsb3BlckNvbm5lY3Rpb249InNjbTpnaXQ6aHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQuZ2l0IgorICAgICAgdXJsPSJodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdCIKICAgICAvPgogICAgICAgPCEtLSBUaHJpZnQgRGV2ZWxvcGVycyAtLT4KICAgICAgIDxkZXZlbG9wZXIgaWQ9Im1jc2xlZSIgbmFtZT0iTWFyayBTbGVlIi8+CmRpZmYgLS1naXQgYS9jb250cmliL2ZiMzAzL3B5L2ZiMzAzL0ZhY2Vib29rQmFzZS5weSBiL2NvbnRyaWIvZmIzMDMvcHkvZmIzMDMvRmFjZWJvb2tCYXNlLnB5CmluZGV4IDY4NWZmMjAuLjA3ZGIxMGMgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvZmIzMDMvcHkvZmIzMDMvRmFjZWJvb2tCYXNlLnB5CisrKyBiL2NvbnRyaWIvZmIzMDMvcHkvZmIzMDMvRmFjZWJvb2tCYXNlLnB5CkBAIC0yNCw1OSArMjQsNjAgQEAKIGltcG9ydCB0aHJpZnQucmVmbGVjdGlvbi5saW1pdGVkCiBmcm9tIHR0eXBlcyBpbXBvcnQgZmJfc3RhdHVzCiAKKwogY2xhc3MgRmFjZWJvb2tCYXNlKEZhY2Vib29rU2VydmljZS5JZmFjZSk6CiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUpOgotICAgIHNlbGYubmFtZSA9IG5hbWUKLSAgICBzZWxmLmFsaXZlID0gaW50KHRpbWUudGltZSgpKQotICAgIHNlbGYuY291bnRlcnMgPSB7fQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lKToKKyAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorICAgICAgICBzZWxmLmFsaXZlID0gaW50KHRpbWUudGltZSgpKQorICAgICAgICBzZWxmLmNvdW50ZXJzID0ge30KIAotICBkZWYgZ2V0TmFtZShzZWxmLCApOgotICAgIHJldHVybiBzZWxmLm5hbWUKKyAgICBkZWYgZ2V0TmFtZShzZWxmLCApOgorICAgICAgICByZXR1cm4gc2VsZi5uYW1lCiAKLSAgZGVmIGdldFZlcnNpb24oc2VsZiwgKToKLSAgICByZXR1cm4gJycKKyAgICBkZWYgZ2V0VmVyc2lvbihzZWxmLCApOgorICAgICAgICByZXR1cm4gJycKIAotICBkZWYgZ2V0U3RhdHVzKHNlbGYsICk6Ci0gICAgcmV0dXJuIGZiX3N0YXR1cy5BTElWRQorICAgIGRlZiBnZXRTdGF0dXMoc2VsZiwgKToKKyAgICAgICAgcmV0dXJuIGZiX3N0YXR1cy5BTElWRQogCi0gIGRlZiBnZXRDb3VudGVycyhzZWxmKToKLSAgICByZXR1cm4gc2VsZi5jb3VudGVycworICAgIGRlZiBnZXRDb3VudGVycyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuY291bnRlcnMKIAotICBkZWYgcmVzZXRDb3VudGVyKHNlbGYsIGtleSk6Ci0gICAgc2VsZi5jb3VudGVyc1trZXldID0gMAorICAgIGRlZiByZXNldENvdW50ZXIoc2VsZiwga2V5KToKKyAgICAgICAgc2VsZi5jb3VudGVyc1trZXldID0gMAogCi0gIGRlZiBnZXRDb3VudGVyKHNlbGYsIGtleSk6Ci0gICAgaWYgc2VsZi5jb3VudGVycy5oYXNfa2V5KGtleSk6Ci0gICAgICByZXR1cm4gc2VsZi5jb3VudGVyc1trZXldCi0gICAgcmV0dXJuIDAKKyAgICBkZWYgZ2V0Q291bnRlcihzZWxmLCBrZXkpOgorICAgICAgICBpZiBzZWxmLmNvdW50ZXJzLmhhc19rZXkoa2V5KToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmNvdW50ZXJzW2tleV0KKyAgICAgICAgcmV0dXJuIDAKIAotICBkZWYgaW5jcmVtZW50Q291bnRlcihzZWxmLCBrZXkpOgotICAgIHNlbGYuY291bnRlcnNba2V5XSA9IHNlbGYuZ2V0Q291bnRlcihrZXkpICsgMQorICAgIGRlZiBpbmNyZW1lbnRDb3VudGVyKHNlbGYsIGtleSk6CisgICAgICAgIHNlbGYuY291bnRlcnNba2V5XSA9IHNlbGYuZ2V0Q291bnRlcihrZXkpICsgMQogCi0gIGRlZiBzZXRPcHRpb24oc2VsZiwga2V5LCB2YWx1ZSk6Ci0gICAgcGFzcworICAgIGRlZiBzZXRPcHRpb24oc2VsZiwga2V5LCB2YWx1ZSk6CisgICAgICAgIHBhc3MKIAotICBkZWYgZ2V0T3B0aW9uKHNlbGYsIGtleSk6Ci0gICAgcmV0dXJuICIiCisgICAgZGVmIGdldE9wdGlvbihzZWxmLCBrZXkpOgorICAgICAgICByZXR1cm4gIiIKIAotICBkZWYgZ2V0T3B0aW9ucyhzZWxmKToKLSAgICByZXR1cm4ge30KKyAgICBkZWYgZ2V0T3B0aW9ucyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHt9CiAKLSAgZGVmIGdldE9wdGlvbnMoc2VsZik6Ci0gICAgcmV0dXJuIHt9CisgICAgZGVmIGdldE9wdGlvbnMoc2VsZik6CisgICAgICAgIHJldHVybiB7fQogCi0gIGRlZiBhbGl2ZVNpbmNlKHNlbGYpOgotICAgIHJldHVybiBzZWxmLmFsaXZlCisgICAgZGVmIGFsaXZlU2luY2Uoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmFsaXZlCiAKLSAgZGVmIGdldENwdVByb2ZpbGUoc2VsZiwgZHVyYXRpb24pOgotICAgIHJldHVybiAiIgorICAgIGRlZiBnZXRDcHVQcm9maWxlKHNlbGYsIGR1cmF0aW9uKToKKyAgICAgICAgcmV0dXJuICIiCiAKLSAgZGVmIGdldExpbWl0ZWRSZWZsZWN0aW9uKHNlbGYpOgotICAgIHJldHVybiB0aHJpZnQucmVmbGVjdGlvbi5saW1pdGVkLlNlcnZpY2UoKQorICAgIGRlZiBnZXRMaW1pdGVkUmVmbGVjdGlvbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHRocmlmdC5yZWZsZWN0aW9uLmxpbWl0ZWQuU2VydmljZSgpCiAKLSAgZGVmIHJlaW5pdGlhbGl6ZShzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlaW5pdGlhbGl6ZShzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiBzaHV0ZG93bihzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHNodXRkb3duKHNlbGYpOgorICAgICAgICBwYXNzCmRpZmYgLS1naXQgYS9jb250cmliL2ZiMzAzL3B5L2ZiMzAzX3NjcmlwdHMvZmIzMDNfc2ltcGxlX21nbXQucHkgYi9jb250cmliL2ZiMzAzL3B5L2ZiMzAzX3NjcmlwdHMvZmIzMDNfc2ltcGxlX21nbXQucHkKaW5kZXggNGY4Y2U5OS4uNWM4ZjQwOSAxMDA2NDQKLS0tIGEvY29udHJpYi9mYjMwMy9weS9mYjMwM19zY3JpcHRzL2ZiMzAzX3NpbXBsZV9tZ210LnB5CisrKyBiL2NvbnRyaWIvZmIzMDMvcHkvZmIzMDNfc2NyaXB0cy9mYjMwM19zaW1wbGVfbWdtdC5weQpAQCAtMSw0ICsxLDQgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uIAogCiAjCiAjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKQEAgLTE5LDcgKzE5LDkgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLWltcG9ydCBzeXMsIG9zCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCitpbXBvcnQgc3lzCitpbXBvcnQgb3MKIGZyb20gb3B0cGFyc2UgaW1wb3J0IE9wdGlvblBhcnNlcgogCiBmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0ICoKQEAgLTMxLDExICszMywxMiBAQAogZnJvbSBmYjMwMyBpbXBvcnQgKgogZnJvbSBmYjMwMy50dHlwZXMgaW1wb3J0ICoKIAorCiBkZWYgc2VydmljZV9jdHJsKAotICAgICAgICAgICAgICAgICBjb21tYW5kLAotICAgICAgICAgICAgICAgICBwb3J0LAotICAgICAgICAgICAgICAgICB0cmFuc19mYWN0b3J5ID0gTm9uZSwKLSAgICAgICAgICAgICAgICAgcHJvdF9mYWN0b3J5ID0gTm9uZSk6CisgICAgICAgIGNvbW1hbmQsCisgICAgICAgIHBvcnQsCisgICAgICAgIHRyYW5zX2ZhY3Rvcnk9Tm9uZSwKKyAgICAgICAgcHJvdF9mYWN0b3J5PU5vbmUpOgogICAgICIiIgogICAgIHNlcnZpY2VfY3RybCBpcyBhIGdlbmVyaWMgZnVuY3Rpb24gdG8gZXhlY3V0ZSBzdGFuZGFyZCBmYjMwMyBmdW5jdGlvbnMKIApAQCAtNTUsNjYgKzU4LDU5IEBACiAgICAgICAgICAgICBtc2cgPSBmYl9zdGF0dXNfc3RyaW5nKHN0YXR1cykKICAgICAgICAgICAgIGlmIChsZW4oc3RhdHVzX2RldGFpbHMpKToKICAgICAgICAgICAgICAgICBtc2cgKz0gIiAtICVzIiAlIHN0YXR1c19kZXRhaWxzCi0gICAgICAgICAgICBwcmludCBtc2cKLQotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBmYl9zdGF0dXMuQUxJVkUpOgotICAgICAgICAgICAgICAgIHJldHVybiAyCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHJldHVybiAzCisgICAgICAgICAgICBwcmludChtc2cpCisgICAgICAgICAgICByZXR1cm4gMiBpZiBzdGF0dXMgPT0gZmJfc3RhdHVzLkFMSVZFIGVsc2UgMwogICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICBwcmludCAiRmFpbGVkIHRvIGdldCBzdGF0dXMiCisgICAgICAgICAgICBwcmludCgiRmFpbGVkIHRvIGdldCBzdGF0dXMiKQogICAgICAgICAgICAgcmV0dXJuIDMKIAogICAgICMgc2NhbGFyIGNvbW1hbmRzCi0gICAgaWYgY29tbWFuZCBpbiBbInZlcnNpb24iLCJhbGl2ZSIsIm5hbWUiXToKKyAgICBpZiBjb21tYW5kIGluIFsidmVyc2lvbiIsICJhbGl2ZSIsICJuYW1lIl06CiAgICAgICAgIHRyeToKLSAgICAgICAgICAgIHJlc3VsdCA9IGZiMzAzX3dyYXBwZXIoY29tbWFuZCwgIHBvcnQsIHRyYW5zX2ZhY3RvcnksIHByb3RfZmFjdG9yeSkKLSAgICAgICAgICAgIHByaW50IHJlc3VsdAorICAgICAgICAgICAgcmVzdWx0ID0gZmIzMDNfd3JhcHBlcihjb21tYW5kLCBwb3J0LCB0cmFuc19mYWN0b3J5LCBwcm90X2ZhY3RvcnkpCisgICAgICAgICAgICBwcmludChyZXN1bHQpCiAgICAgICAgICAgICByZXR1cm4gMAogICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICBwcmludCAiZmFpbGVkIHRvIGdldCAiLGNvbW1hbmQKKyAgICAgICAgICAgIHByaW50KCJmYWlsZWQgdG8gZ2V0ICIsIGNvbW1hbmQpCiAgICAgICAgICAgICByZXR1cm4gMwogCiAgICAgIyBjb3VudGVycwogICAgIGlmIGNvbW1hbmQgaW4gWyJjb3VudGVycyJdOgogICAgICAgICB0cnk6Ci0gICAgICAgICAgICBjb3VudGVycyA9IGZiMzAzX3dyYXBwZXIoJ2NvdW50ZXJzJywgIHBvcnQsIHRyYW5zX2ZhY3RvcnksIHByb3RfZmFjdG9yeSkKKyAgICAgICAgICAgIGNvdW50ZXJzID0gZmIzMDNfd3JhcHBlcignY291bnRlcnMnLCBwb3J0LCB0cmFuc19mYWN0b3J5LCBwcm90X2ZhY3RvcnkpCiAgICAgICAgICAgICBmb3IgY291bnRlciBpbiBjb3VudGVyczoKLSAgICAgICAgICAgICAgICBwcmludCAiJXM6ICVkIiAlIChjb3VudGVyLCBjb3VudGVyc1tjb3VudGVyXSkKKyAgICAgICAgICAgICAgICBwcmludCgiJXM6ICVkIiAlIChjb3VudGVyLmVuY29kZSgndXRmLTgnKSwgY291bnRlcnNbY291bnRlcl0pKQogICAgICAgICAgICAgcmV0dXJuIDAKICAgICAgICAgZXhjZXB0OgotICAgICAgICAgICAgcHJpbnQgImZhaWxlZCB0byBnZXQgY291bnRlcnMiCisgICAgICAgICAgICBwcmludCgiZmFpbGVkIHRvIGdldCBjb3VudGVycyIpCiAgICAgICAgICAgICByZXR1cm4gMwogCi0KICAgICAjIE9ubHkgcm9vdCBzaG91bGQgYmUgYWJsZSB0byBydW4gdGhlIGZvbGxvd2luZyBjb21tYW5kcwogICAgIGlmIG9zLmdldHVpZCgpID09IDA6CiAgICAgICAgICMgYXN5bmMgY29tbWFuZHMKLSAgICAgICAgaWYgY29tbWFuZCBpbiBbInN0b3AiLCJyZWxvYWQiXSA6CisgICAgICAgIGlmIGNvbW1hbmQgaW4gWyJzdG9wIiwgInJlbG9hZCJdOgogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIGZiMzAzX3dyYXBwZXIoY29tbWFuZCwgcG9ydCwgdHJhbnNfZmFjdG9yeSwgcHJvdF9mYWN0b3J5KQogICAgICAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICAgICAgcHJpbnQgImZhaWxlZCB0byB0ZWxsIHRoZSBzZXJ2aWNlIHRvICIsIGNvbW1hbmQKKyAgICAgICAgICAgICAgICBwcmludCgiZmFpbGVkIHRvIHRlbGwgdGhlIHNlcnZpY2UgdG8gIiwgY29tbWFuZCkKICAgICAgICAgICAgICAgICByZXR1cm4gMwogICAgIGVsc2U6Ci0gICAgICAgIGlmIGNvbW1hbmQgaW4gWyJzdG9wIiwicmVsb2FkIl06Ci0gICAgICAgICAgICBwcmludCAicm9vdCBwcml2aWxlZ2VzIGFyZSByZXF1aXJlZCB0byBzdG9wIG9yIHJlbG9hZCB0aGUgc2VydmljZS4iCisgICAgICAgIGlmIGNvbW1hbmQgaW4gWyJzdG9wIiwgInJlbG9hZCJdOgorICAgICAgICAgICAgcHJpbnQoInJvb3QgcHJpdmlsZWdlcyBhcmUgcmVxdWlyZWQgdG8gc3RvcCBvciByZWxvYWQgdGhlIHNlcnZpY2UuIikKICAgICAgICAgICAgIHJldHVybiA0CiAKLSAgICBwcmludCAiVGhlIGZvbGxvd2luZyBjb21tYW5kcyBhcmUgYXZhaWxhYmxlOiIKLSAgICBmb3IgY29tbWFuZCBpbiBbImNvdW50ZXJzIiwibmFtZSIsInZlcnNpb24iLCJhbGl2ZSIsInN0YXR1cyJdOgotICAgICAgICBwcmludCAiXHQlcyIgJSBjb21tYW5kCi0gICAgcHJpbnQgIlRoZSBmb2xsb3dpbmcgY29tbWFuZHMgYXJlIGF2YWlsYWJsZSBmb3IgdXNlcnMgd2l0aCByb290IHByaXZpbGVnZXM6IgotICAgIGZvciBjb21tYW5kIGluIFsic3RvcCIsInJlbG9hZCJdOgotICAgICAgICBwcmludCAiXHQlcyIgJSBjb21tYW5kCisgICAgcHJpbnQoIlRoZSBmb2xsb3dpbmcgY29tbWFuZHMgYXJlIGF2YWlsYWJsZToiKQorICAgIGZvciBjb21tYW5kIGluIFsiY291bnRlcnMiLCAibmFtZSIsICJ2ZXJzaW9uIiwgImFsaXZlIiwgInN0YXR1cyJdOgorICAgICAgICBwcmludCgiXHQlcyIgJSBjb21tYW5kKQorICAgIHByaW50KCJUaGUgZm9sbG93aW5nIGNvbW1hbmRzIGFyZSBhdmFpbGFibGUgZm9yIHVzZXJzIHdpdGggcm9vdCBwcml2aWxlZ2VzOiIpCisgICAgZm9yIGNvbW1hbmQgaW4gWyJzdG9wIiwgInJlbG9hZCJdOgorICAgICAgICBwcmludCgiXHQlcyIgJSBjb21tYW5kKQorCisgICAgcmV0dXJuIDAKIAogCi0KLSAgICByZXR1cm4gMDsKLQotCi1kZWYgZmIzMDNfd3JhcHBlcihjb21tYW5kLCBwb3J0LCB0cmFuc19mYWN0b3J5ID0gTm9uZSwgcHJvdF9mYWN0b3J5ID0gTm9uZSk6CitkZWYgZmIzMDNfd3JhcHBlcihjb21tYW5kLCBwb3J0LCB0cmFuc19mYWN0b3J5PU5vbmUsIHByb3RfZmFjdG9yeT1Ob25lKToKICAgICBzb2NrID0gVFNvY2tldC5UU29ja2V0KCdsb2NhbGhvc3QnLCBwb3J0KQogCiAgICAgIyB1c2UgaW5wdXQgdHJhbnNwb3J0IGZhY3RvcnkgaWYgcHJvdmlkZWQKQEAgLTE3OSwxMSArMTc1LDExIEBACiAKICAgICAjIHBhcnNlIGNvbW1hbmQgbGluZSBvcHRpb25zCiAgICAgcGFyc2VyID0gT3B0aW9uUGFyc2VyKCkKLSAgICBjb21tYW5kcz1bInN0b3AiLCJjb3VudGVycyIsInN0YXR1cyIsInJlbG9hZCIsInZlcnNpb24iLCJuYW1lIiwiYWxpdmUiXQorICAgIGNvbW1hbmRzID0gWyJzdG9wIiwgImNvdW50ZXJzIiwgInN0YXR1cyIsICJyZWxvYWQiLCAidmVyc2lvbiIsICJuYW1lIiwgImFsaXZlIl0KIAogICAgIHBhcnNlci5hZGRfb3B0aW9uKCItYyIsICItLWNvbW1hbmQiLCBkZXN0PSJjb21tYW5kIiwgaGVscD0iZXhlY3V0ZSB0aGlzIEFQSSIsCiAgICAgICAgICAgICAgICAgICAgICAgY2hvaWNlcz1jb21tYW5kcywgZGVmYXVsdD0ic3RhdHVzIikKLSAgICBwYXJzZXIuYWRkX29wdGlvbigiLXAiLCItLXBvcnQiLGRlc3Q9InBvcnQiLGhlbHA9InRoZSBzZXJ2aWNlJ3MgcG9ydCIsCisgICAgcGFyc2VyLmFkZF9vcHRpb24oIi1wIiwgIi0tcG9ydCIsIGRlc3Q9InBvcnQiLCBoZWxwPSJ0aGUgc2VydmljZSdzIHBvcnQiLAogICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9OTA4MikKIAogICAgIChvcHRpb25zLCBhcmdzKSA9IHBhcnNlci5wYXJzZV9hcmdzKCkKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZmIzMDMvcHkvc2V0dXAucHkgYi9jb250cmliL2ZiMzAzL3B5L3NldHVwLnB5CmluZGV4IDZkNDJiZDEuLmQyN2MyOTYgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvZmIzMDMvcHkvc2V0dXAucHkKKysrIGIvY29udHJpYi9mYjMwMy9weS9zZXR1cC5weQpAQCAtMjQsMjYgKzI0LDI1IEBACiAgICAgZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBzZXR1cCwgRXh0ZW5zaW9uCiBleGNlcHQ6CiAgICAgZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgc2V0dXAsIEV4dGVuc2lvbiwgQ29tbWFuZAotICAgICAgICAKLXNldHVwKG5hbWUgPSAndGhyaWZ0X2ZiMzAzJywKLSAgICB2ZXJzaW9uID0gJzAuOS4zJywKLSAgICBkZXNjcmlwdGlvbiA9ICdQeXRob24gYmluZGluZ3MgZm9yIHRoZSBBcGFjaGUgVGhyaWZ0IEZCMzAzJywKLSAgICBhdXRob3IgPSBbJ1RocmlmdCBEZXZlbG9wZXJzJ10sCi0gICAgYXV0aG9yX2VtYWlsID0gWydkZXZAdGhyaWZ0LmFwYWNoZS5vcmcnXSwKLSAgICB1cmwgPSAnaHR0cDovL3RocmlmdC5hcGFjaGUub3JnJywKLSAgICBsaWNlbnNlID0gJ0FwYWNoZSBMaWNlbnNlIDIuMCcsCi0gICAgcGFja2FnZXMgPSBbCi0gICAgICAgICdmYjMwMycsCi0gICAgICAgICdmYjMwM19zY3JpcHRzJywKLSAgICBdLAotICAgIGNsYXNzaWZpZXJzID0gWwotICAgICAgICAnRGV2ZWxvcG1lbnQgU3RhdHVzIDo6IDUgLSBQcm9kdWN0aW9uL1N0YWJsZScsCi0gICAgICAgICdFbnZpcm9ubWVudCA6OiBDb25zb2xlJywKLSAgICAgICAgJ0ludGVuZGVkIEF1ZGllbmNlIDo6IERldmVsb3BlcnMnLAotICAgICAgICAnUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uJywKLSAgICAgICAgJ1Byb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAyJywKLSAgICAgICAgJ1RvcGljIDo6IFNvZnR3YXJlIERldmVsb3BtZW50IDo6IExpYnJhcmllcycsCi0gICAgICAgICdUb3BpYyA6OiBTeXN0ZW0gOjogTmV0d29ya2luZycKLSAgICBdLAotKQogCitzZXR1cChuYW1lPSd0aHJpZnRfZmIzMDMnLAorICAgICAgdmVyc2lvbj0nMS4wLjAnLAorICAgICAgZGVzY3JpcHRpb249J1B5dGhvbiBiaW5kaW5ncyBmb3IgdGhlIEFwYWNoZSBUaHJpZnQgRkIzMDMnLAorICAgICAgYXV0aG9yPVsnQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzJ10sCisgICAgICBhdXRob3JfZW1haWw9WydkZXZAdGhyaWZ0LmFwYWNoZS5vcmcnXSwKKyAgICAgIHVybD0naHR0cDovL3RocmlmdC5hcGFjaGUub3JnJywKKyAgICAgIGxpY2Vuc2U9J0FwYWNoZSBMaWNlbnNlIDIuMCcsCisgICAgICBwYWNrYWdlcz1bCisgICAgICAgICAgJ2ZiMzAzJywKKyAgICAgICAgICAnZmIzMDNfc2NyaXB0cycsCisgICAgICBdLAorICAgICAgY2xhc3NpZmllcnM9WworICAgICAgICAgICdEZXZlbG9wbWVudCBTdGF0dXMgOjogNyAtIEluYWN0aXZlJywKKyAgICAgICAgICAnRW52aXJvbm1lbnQgOjogQ29uc29sZScsCisgICAgICAgICAgJ0ludGVuZGVkIEF1ZGllbmNlIDo6IERldmVsb3BlcnMnLAorICAgICAgICAgICdQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24nLAorICAgICAgICAgICdQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMicsCisgICAgICAgICAgJ1RvcGljIDo6IFNvZnR3YXJlIERldmVsb3BtZW50IDo6IExpYnJhcmllcycsCisgICAgICAgICAgJ1RvcGljIDo6IFN5c3RlbSA6OiBOZXR3b3JraW5nJworICAgICAgXSwKKyAgICAgICkKZGlmZiAtLWdpdCBhL2NvbnRyaWIvcGFyc2VfcHJvZmlsaW5nLnB5IGIvY29udHJpYi9wYXJzZV9wcm9maWxpbmcucHkKaW5kZXggM2Q0NmZiOC4uMGJlNWYyOSAxMDA3NTUKLS0tIGEvY29udHJpYi9wYXJzZV9wcm9maWxpbmcucHkKKysrIGIvY29udHJpYi9wYXJzZV9wcm9maWxpbmcucHkKQEAgLTQ2LDYgKzQ2LDggQEAKIAogCiBnX2FkZHJzX2J5X2ZpbGVuYW1lID0ge30KKworCiBkZWYgZ2V0X2FkZHJlc3MoZmlsZW5hbWUsIGFkZHJlc3MpOgogICAgICIiIgogICAgIFJldHJpZXZlIGFuIEFkZHJlc3NJbmZvIG9iamVjdCBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QgZmlsZSBhbmQgYWRkcmVzcy4KQEAgLTEwMywxMiArMTA1LDEyIEBACiAgICAgICAgIGlkeCA9IGZpbGVfYW5kX2xpbmUucmZpbmQoJzonKQogICAgICAgICBpZiBpZHggPCAwOgogICAgICAgICAgICAgbXNnID0gJ2V4cGVjdGVkIGZpbGUgYW5kIGxpbmUgbnVtYmVyIGZyb20gYWRkcjJsaW5lOyBnb3QgJXInICUgXAotICAgICAgICAgICAgICAgICAgICAoZmlsZV9hbmRfbGluZSwpCisgICAgICAgICAgICAgICAgKGZpbGVfYW5kX2xpbmUsKQogICAgICAgICAgICAgbXNnICs9ICdcbmZpbGU9JXIsIGFkZHJlc3M9JXInICUgKGZpbGVuYW1lLCBhZGRyZXNzLmFkZHJlc3MpCiAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24obXNnKQogCiAgICAgICAgIGFkZHJlc3Muc291cmNlRmlsZSA9IGZpbGVfYW5kX2xpbmVbOmlkeF0KLSAgICAgICAgYWRkcmVzcy5zb3VyY2VMaW5lID0gZmlsZV9hbmRfbGluZVtpZHgrMTpdCisgICAgICAgIGFkZHJlc3Muc291cmNlTGluZSA9IGZpbGVfYW5kX2xpbmVbaWR4ICsgMTpdCiAKICAgICAocmVtYWluaW5nX291dCwgY21kX2VycikgPSBwcm9jLmNvbW11bmljYXRlKCkKICAgICByZXRjb2RlID0gcHJvYy53YWl0KCkKQEAgLTE4MCw3ICsxODIsNyBAQAogCiAgICAgdmlydF9jYWxsX3JlZ2V4ID0gcmUuY29tcGlsZShyJ15ccypUX1ZJUlRVQUxfQ0FMTDogKFxkKykgY2FsbHMgb24gKC4qKTokJykKICAgICBnZW5fcHJvdF9yZWdleCA9IHJlLmNvbXBpbGUoCi0gICAgICAgICAgICByJ15ccypUX0dFTkVSSUNfUFJPVE9DT0w6IChcZCspIGNhbGxzIHRvICguKikgd2l0aCBhICguKik6JCcpCisgICAgICAgIHInXlxzKlRfR0VORVJJQ19QUk9UT0NPTDogKFxkKykgY2FsbHMgdG8gKC4qKSB3aXRoIGEgKC4qKTokJykKICAgICBidF9yZWdleCA9IHJlLmNvbXBpbGUocideXHMqIyhcZCspXHMqKC4qKSBcWygweFswLTlBLVphLXpdKylcXSQnKQogCiAgICAgIyBQYXJzZSBhbGwgb2YgdGhlIGlucHV0LCBhbmQgc3RvcmUgaXQgYXMgRW50cnkgb2JqZWN0cwpAQCAtMjA5LDcgKzIxMSw3IEBACiAgICAgICAgICAgICAgICAgIyAiX1oiIHRvIHRoZSB0eXBlIG5hbWUgdG8gbWFrZSBpdCBsb29rIGxpa2UgYW4gZXh0ZXJuYWwgbmFtZS4KICAgICAgICAgICAgICAgICB0eXBlX25hbWUgPSAnX1onICsgdHlwZV9uYW1lCiAgICAgICAgICAgICBoZWFkZXIgPSAnVF9WSVJUVUFMX0NBTEw6ICVkIGNhbGxzIG9uICIlcyInICUgXAotICAgICAgICAgICAgICAgICAgICAobnVtX2NhbGxzLCB0eXBlX25hbWUpCisgICAgICAgICAgICAgICAgKG51bV9jYWxscywgdHlwZV9uYW1lKQogICAgICAgICAgICAgaWYgY3VycmVudF9lbnRyeSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICBlbnRyaWVzLmFwcGVuZChjdXJyZW50X2VudHJ5KQogICAgICAgICAgICAgY3VycmVudF9lbnRyeSA9IEVudHJ5KGhlYWRlcikKQEAgLTIyNCw3ICsyMjYsNyBAQAogICAgICAgICAgICAgICAgIHR5cGVfbmFtZTEgPSAnX1onICsgdHlwZV9uYW1lMQogICAgICAgICAgICAgICAgIHR5cGVfbmFtZTIgPSAnX1onICsgdHlwZV9uYW1lMgogICAgICAgICAgICAgaGVhZGVyID0gJ1RfR0VORVJJQ19QUk9UT0NPTDogJWQgY2FsbHMgdG8gIiVzIiB3aXRoIGEgIiVzIicgJSBcCi0gICAgICAgICAgICAgICAgICAgIChudW1fY2FsbHMsIHR5cGVfbmFtZTEsIHR5cGVfbmFtZTIpCisgICAgICAgICAgICAgICAgKG51bV9jYWxscywgdHlwZV9uYW1lMSwgdHlwZV9uYW1lMikKICAgICAgICAgICAgIGlmIGN1cnJlbnRfZW50cnkgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgZW50cmllcy5hcHBlbmQoY3VycmVudF9lbnRyeSkKICAgICAgICAgICAgIGN1cnJlbnRfZW50cnkgPSBFbnRyeShoZWFkZXIpCmRpZmYgLS1naXQgYS9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vcG9tLnhtbCBiL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9wb20ueG1sCmluZGV4IGIxMmE4MjEuLjFkNjZiYzYgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9wb20ueG1sCisrKyBiL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9wb20ueG1sCkBAIC0yNywxNSArMjcsMTUgQEAKICAgPGFydGlmYWN0SWQ+dGhyaWZ0LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KICAgPHBhY2thZ2luZz5tYXZlbi1wbHVnaW48L3BhY2thZ2luZz4KICAgPG5hbWU+dGhyaWZ0LW1hdmVuLXBsdWdpbjwvbmFtZT4KLSAgPHZlcnNpb24+MC45LjM8L3ZlcnNpb24+CisgIDx2ZXJzaW9uPjEuMC4wPC92ZXJzaW9uPgogICA8YnVpbGQ+CiAgICAgPHBsdWdpbnM+CiAgICAgICA8cGx1Z2luPgogICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CiAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPHNvdXJjZT4xLjc8L3NvdXJjZT4KLSAgICAgICAgICA8dGFyZ2V0PjEuNzwvdGFyZ2V0PgorICAgICAgICAgIDxzb3VyY2U+MS44PC9zb3VyY2U+CisgICAgICAgICAgPHRhcmdldD4xLjg8L3RhcmdldD4KICAgICAgICAgPC9jb25maWd1cmF0aW9uPgogICAgICAgPC9wbHVnaW4+CiAgICAgICA8cGx1Z2luPgpAQCAtNzcsNiArNzcsMTIgQEAKICAgICAgIDxhcnRpZmFjdElkPnBsZXh1cy11dGlsczwvYXJ0aWZhY3RJZD4KICAgICAgIDx2ZXJzaW9uPjMuMC4xNDwvdmVyc2lvbj4KICAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcubW9ja2l0bzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPm1vY2tpdG8tYWxsPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4xMC4xOTwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgIDwvZGVwZW5kZW5jeT4KICAgPC9kZXBlbmRlbmNpZXM+CiAgIDxwcm9wZXJ0aWVzPgogICAgIDx0aHJpZnQucm9vdD4ke2Jhc2VkaXJ9Ly4uLy4uPC90aHJpZnQucm9vdD4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGhyaWZ0L21hdmVuL0Fic3RyYWN0VGhyaWZ0TW9qby5qYXZhIGIvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aHJpZnQvbWF2ZW4vQWJzdHJhY3RUaHJpZnRNb2pvLmphdmEKaW5kZXggNjM0NTFjMy4uODY5YmU5NSAxMDA2NDQKLS0tIGEvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aHJpZnQvbWF2ZW4vQWJzdHJhY3RUaHJpZnRNb2pvLmphdmEKKysrIGIvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aHJpZnQvbWF2ZW4vQWJzdHJhY3RUaHJpZnRNb2pvLmphdmEKQEAgLTkzLDcgKzkzLDcgQEAKICAgICAgKiBpdCB3aWxsIGdlbmVyYXRlIEphdmEgb3V0cHV0LiBUaGUgbWFpbiByZWFzb24gZm9yIHRoaXMgb3B0aW9uIGlzIHRvIGJlIGFibGUgdG8gYWRkIG9wdGlvbnMKICAgICAgKiB0byB0aGUgSmF2YSBnZW5lcmF0b3IgLSBpZiB5b3UgZ2VuZXJhdGUgc29tZXRoaW5nIGVsc2UsIHlvdSdyZSBvbiB5b3VyIG93bi4KICAgICAgKgotICAgICAqIEBwYXJhbWV0ZXIgZGVmYXVsdC12YWx1ZT0iamF2YTpoYXNoY29kZSIKKyAgICAgKiBAcGFyYW1ldGVyIGRlZmF1bHQtdmFsdWU9ImphdmEiCiAgICAgICovCiAgICAgcHJpdmF0ZSBTdHJpbmcgZ2VuZXJhdG9yOwogCkBAIC0xMDYsNyArMTA2LDcgQEAKICAgICAgKiBTaW5jZSB7QGNvZGUgdGhyaWZ0fSBjYW5ub3QgYWNjZXNzIGphcnMsIHRocmlmdCBmaWxlcyBpbiBkZXBlbmRlbmNpZXMgYXJlIGV4dHJhY3RlZCB0byB0aGlzIGxvY2F0aW9uCiAgICAgICogYW5kIGRlbGV0ZWQgb24gZXhpdC4gVGhpcyBkaXJlY3RvcnkgaXMgYWx3YXlzIGNsZWFuZWQgZHVyaW5nIGV4ZWN1dGlvbi4KICAgICAgKgotICAgICAqIEBwYXJhbWV0ZXIgcHJvcGVydHk9IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3RocmlmdC1kZXBlbmRlbmNpZXMiCisgICAgICogQHBhcmFtZXRlciBkZWZhdWx0LXZhbHVlPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS90aHJpZnQtZGVwZW5kZW5jaWVzIgogICAgICAqIEByZXF1aXJlZAogICAgICAqLwogICAgIHByaXZhdGUgRmlsZSB0ZW1wb3JhcnlUaHJpZnRGaWxlRGlyZWN0b3J5OwpAQCAtMTE3LDcgKzExNyw3IEBACiAgICAgICogQHBhcmFtZXRlciBkZWZhdWx0LXZhbHVlPSIke2xvY2FsUmVwb3NpdG9yeX0iCiAgICAgICogQHJlcXVpcmVkCiAgICAgICovCi0gICAgcHJpdmF0ZSBBcnRpZmFjdFJlcG9zaXRvcnkgbG9jYWxSZXBvc2l0b3J5OworICAgIHByb3RlY3RlZCBBcnRpZmFjdFJlcG9zaXRvcnkgbG9jYWxSZXBvc2l0b3J5OwogCiAgICAgLyoqCiAgICAgICogU2V0IHRoaXMgdG8ge0Bjb2RlIGZhbHNlfSB0byBkaXNhYmxlIGhhc2hpbmcgb2YgZGVwZW5kZW50IGphciBwYXRocy4KQEAgLTEyOSw3ICsxMjksNyBAQAogICAgICAqIEBwYXJhbWV0ZXIgZGVmYXVsdC12YWx1ZT0idHJ1ZSIKICAgICAgKiBAcmVxdWlyZWQKICAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzaERlcGVuZGVudFBhdGhzOworICAgIHByb3RlY3RlZCBib29sZWFuIGhhc2hEZXBlbmRlbnRQYXRoczsKIAogICAgIC8qKgogICAgICAqIEBwYXJhbWV0ZXIKQEAgLTIyOSw3ICsyMjksNyBAQAogICAgICAgICBjaGVja05vdE51bGwoZ2VuZXJhdG9yLCAiZ2VuZXJhdG9yIik7CiAgICAgICAgIGZpbmFsIEZpbGUgdGhyaWZ0U291cmNlUm9vdCA9IGdldFRocmlmdFNvdXJjZVJvb3QoKTsKICAgICAgICAgY2hlY2tOb3ROdWxsKHRocmlmdFNvdXJjZVJvb3QpOwotICAgICAgICBjaGVja0FyZ3VtZW50KCF0aHJpZnRTb3VyY2VSb290LmlzRmlsZSgpLCAidGhyaWZ0U291cmNlUm9vdCBpcyBhIGZpbGUsIG5vdCBhIGRpcmV0b3J5Iik7CisgICAgICAgIGNoZWNrQXJndW1lbnQoIXRocmlmdFNvdXJjZVJvb3QuaXNGaWxlKCksICJ0aHJpZnRTb3VyY2VSb290IGlzIGEgZmlsZSwgbm90IGEgZGlyZWN0b3J5Iik7CiAgICAgICAgIGNoZWNrTm90TnVsbCh0ZW1wb3JhcnlUaHJpZnRGaWxlRGlyZWN0b3J5LCAidGVtcG9yYXJ5VGhyaWZ0RmlsZURpcmVjdG9yeSIpOwogICAgICAgICBjaGVja1N0YXRlKCF0ZW1wb3JhcnlUaHJpZnRGaWxlRGlyZWN0b3J5LmlzRmlsZSgpLCAidGVtcG9yYXJ5VGhyaWZ0RmlsZURpcmVjdG9yeSBpcyBhIGZpbGUsIG5vdCBhIGRpcmVjdG9yeSIpOwogICAgICAgICBmaW5hbCBGaWxlIG91dHB1dERpcmVjdG9yeSA9IGdldE91dHB1dERpcmVjdG9yeSgpOwpAQCAtMjY4LDcgKzI2OCw5IEBACiAgICAgICAgIGlmICh0ZW1wb3JhcnlUaHJpZnRGaWxlRGlyZWN0b3J5LmV4aXN0cygpKSB7CiAgICAgICAgICAgICBjbGVhbkRpcmVjdG9yeSh0ZW1wb3JhcnlUaHJpZnRGaWxlRGlyZWN0b3J5KTsKICAgICAgICAgfQorCiAgICAgICAgIFNldDxGaWxlPiB0aHJpZnREaXJlY3RvcmllcyA9IG5ld0hhc2hTZXQoKTsKKwogICAgICAgICBmb3IgKEZpbGUgY2xhc3NwYXRoRWxlbWVudEZpbGUgOiBjbGFzc3BhdGhFbGVtZW50RmlsZXMpIHsKICAgICAgICAgICAgIC8vIGZvciBzb21lIHJlYXNvbiB1bmRlciBJQU0sIHdlIHJlY2VpdmUgcG9tcyBhcyBkZXBlbmRlbnQgZmlsZXMKICAgICAgICAgICAgIC8vIEkgYW0gZXhjbHVkaW5nIC54bWwgcmF0aGVyIHRoYW4gaW5jbHVkaW5nIC5qYXIgYXMgdGhlcmUgbWF5IGJlIG90aGVyIGV4dGVuc2lvbnMgaW4gdXNlIChzYXIsIGhhciwgemlwKQpAQCAtMjgzLDE4ICsyODUsMjcgQEAKICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihmb3JtYXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIHdhcyBub3QgYSByZWFkYWJsZSBhcnRpZmFjdCIsIGNsYXNzcGF0aEVsZW1lbnRGaWxlKSk7CiAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICogQ29weSBlYWNoIC50aHJpZnQgZmlsZSBmb3VuZCBpbiB0aGUgSkFSIGludG8gYSB0ZW1wb3JhcnkgZGlyZWN0b3J5LCBwcmVzZXJ2aW5nIHRoZQorICAgICAgICAgICAgICAgICAqIGRpcmVjdG9yeSBwYXRoIGl0IGhhZCByZWxhdGl2ZSB0byBpdHMgY29udGFpbmluZyBKQVIuIEFkZCB0aGUgcmVzdWx0aW5nIHJvb3QgZGlyZWN0b3J5CisgICAgICAgICAgICAgICAgICogKHVuaXF1ZSBmb3IgZWFjaCBKQVIgcHJvY2Vzc2VkKSB0byB0aGUgc2V0IG9mIHRocmlmdCBpbmNsdWRlIGRpcmVjdG9yaWVzIHRvIHVzZSB3aGVuCisgICAgICAgICAgICAgICAgICogY29tcGlsaW5nLgorICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgIGZvciAoSmFyRW50cnkgamFyRW50cnkgOiBsaXN0KGNsYXNzcGF0aEphci5lbnRyaWVzKCkpKSB7CiAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBqYXJFbnRyeU5hbWUgPSBqYXJFbnRyeS5nZXROYW1lKCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChqYXJFbnRyeS5nZXROYW1lKCkuZW5kc1dpdGgoVEhSSUZUX0ZJTEVfU1VGRklYKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHRydW5jYXRlZEphclBhdGggPSB0cnVuY2F0ZVBhdGgoY2xhc3NwYXRoSmFyLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBGaWxlIHRocmlmdFJvb3REaXJlY3RvcnkgPSBuZXcgRmlsZSh0ZW1wb3JhcnlUaHJpZnRGaWxlRGlyZWN0b3J5LCB0cnVuY2F0ZWRKYXJQYXRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEZpbGUgdW5jb21wcmVzc2VkQ29weSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKG5ldyBGaWxlKHRlbXBvcmFyeVRocmlmdEZpbGVEaXJlY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1bmNhdGVQYXRoKGNsYXNzcGF0aEphci5nZXROYW1lKCkpKSwgamFyRW50cnlOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUodGhyaWZ0Um9vdERpcmVjdG9yeSwgamFyRW50cnlOYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHVuY29tcHJlc3NlZENvcHkuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwogICAgICAgICAgICAgICAgICAgICAgICAgY29weVN0cmVhbVRvRmlsZShuZXcgUmF3SW5wdXRTdHJlYW1GYWNhZGUoY2xhc3NwYXRoSmFyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRJbnB1dFN0cmVhbShqYXJFbnRyeSkpLCB1bmNvbXByZXNzZWRDb3B5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocmlmdERpcmVjdG9yaWVzLmFkZCh1bmNvbXByZXNzZWRDb3B5LmdldFBhcmVudEZpbGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJpZnREaXJlY3Rvcmllcy5hZGQodGhyaWZ0Um9vdERpcmVjdG9yeSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2xhc3NwYXRoRWxlbWVudEZpbGUuaXNEaXJlY3RvcnkoKSkgewogICAgICAgICAgICAgICAgIEZpbGVbXSB0aHJpZnRGaWxlcyA9IGNsYXNzcGF0aEVsZW1lbnRGaWxlLmxpc3RGaWxlcyhuZXcgRmlsZW5hbWVGaWx0ZXIoKSB7CiAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGRpciwgU3RyaW5nIG5hbWUpIHsKQEAgLTMwNyw2ICszMTgsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQorCiAgICAgICAgIHJldHVybiBJbW11dGFibGVTZXQuY29weU9mKHRocmlmdERpcmVjdG9yaWVzKTsKICAgICB9CiAKQEAgLTMxOSwxNSArMzMxLDYgQEAKICAgICAgICAgcmV0dXJuIEltbXV0YWJsZVNldC5jb3B5T2YodGhyaWZ0RmlsZXNJbkRpcmVjdG9yeSk7CiAgICAgfQogCi0gICAgSW1tdXRhYmxlU2V0PEZpbGU+IGZpbmRUaHJpZnRGaWxlc0luRGlyZWN0b3JpZXMoSXRlcmFibGU8RmlsZT4gZGlyZWN0b3JpZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGNoZWNrTm90TnVsbChkaXJlY3Rvcmllcyk7Ci0gICAgICAgIFNldDxGaWxlPiB0aHJpZnRGaWxlcyA9IG5ld0hhc2hTZXQoKTsKLSAgICAgICAgZm9yIChGaWxlIGRpcmVjdG9yeSA6IGRpcmVjdG9yaWVzKSB7Ci0gICAgICAgICAgICB0aHJpZnRGaWxlcy5hZGRBbGwoZmluZFRocmlmdEZpbGVzSW5EaXJlY3RvcnkoZGlyZWN0b3J5KSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEltbXV0YWJsZVNldC5jb3B5T2YodGhyaWZ0RmlsZXMpOwotICAgIH0KLQogICAgIC8qKgogICAgICAqIFRydW5jYXRlcyB0aGUgcGF0aCBvZiBqYXIgZmlsZXMgc28gdGhhdCB0aGV5IGFyZSByZWxhdGl2ZSB0byB0aGUgbG9jYWwgcmVwb3NpdG9yeS4KICAgICAgKgpkaWZmIC0tZ2l0IGEvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aHJpZnQvbWF2ZW4vVGhyaWZ0VGVzdENvbXBpbGVNb2pvLmphdmEgYi9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RocmlmdC9tYXZlbi9UaHJpZnRUZXN0Q29tcGlsZU1vam8uamF2YQppbmRleCBmYjg5ZDk2Li4xYjFkOTllIDEwMDY0NAotLS0gYS9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RocmlmdC9tYXZlbi9UaHJpZnRUZXN0Q29tcGlsZU1vam8uamF2YQorKysgYi9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RocmlmdC9tYXZlbi9UaHJpZnRUZXN0Q29tcGlsZU1vam8uamF2YQpAQCAtMjMsNiArMjMsNyBAQAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuQXJ0aWZhY3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QucmVwb3NpdG9yeS5BcnRpZmFjdFJlcG9zaXRvcnk7CiAKIC8qKgogICogQHBoYXNlIGdlbmVyYXRlLXRlc3Qtc291cmNlcwpAQCAtNzEsNCArNzIsMjIgQEAKICAgICBwcm90ZWN0ZWQgRmlsZSBnZXRUaHJpZnRTb3VyY2VSb290KCkgewogICAgICAgICByZXR1cm4gdGhyaWZ0VGVzdFNvdXJjZVJvb3Q7CiAgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBsb2NhbCBtYXZlbiBBcnRpZmFjdFJlcG9zaXRvcnkuIEV4cG9zZWQgb25seSB0byBhbGxvdyB0ZXN0aW5nIG91dHNpZGUgb2YgTWF2ZW4gaXRzZWxmLgorICAgICAqCisgICAgICogQHBhcmFtIGxvY2FsUmVwb3NpdG9yeSBsb2NhbCBBcnRpZmFjdFJlcG9zaXRvcnkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbE1hdmVuUmVwb3NpdG9yeShmaW5hbCBBcnRpZmFjdFJlcG9zaXRvcnkgbG9jYWxSZXBvc2l0b3J5KSB7CisgICAgICAgIHRoaXMubG9jYWxSZXBvc2l0b3J5ID0gbG9jYWxSZXBvc2l0b3J5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgb3B0aW9uIHRvIGhhc2ggZGVwZW5kZW50IEpBUiBwYXRocy4gRXhwb3NlZCBvbmx5IHRvIGFsbG93IHRlc3Rpbmcgb3V0c2lkZSBvZiBNYXZlbiBpdHNlbGYuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaGFzaERlcGVuZGVudFBhdGhzIHdoZXRoZXIgb3Igbm90IHRvIGhhc2ggcGF0aHMgdG8gZGVwZW5kZW50IEpBUnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRIYXNoRGVwZW5kZW50UGF0aHMoZmluYWwgYm9vbGVhbiBoYXNoRGVwZW5kZW50UGF0aHMpIHsKKyAgICAgICAgdGhpcy5oYXNoRGVwZW5kZW50UGF0aHMgPSBoYXNoRGVwZW5kZW50UGF0aHM7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aHJpZnQvbWF2ZW4vVGVzdEFic3RyYWN0VGhyaWZ0TW9qby5qYXZhIGIvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aHJpZnQvbWF2ZW4vVGVzdEFic3RyYWN0VGhyaWZ0TW9qby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMTc2NzEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RocmlmdC9tYXZlbi9UZXN0QWJzdHJhY3RUaHJpZnRNb2pvLmphdmEKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQubWF2ZW47CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LnJlcG9zaXRvcnkuQXJ0aWZhY3RSZXBvc2l0b3J5OworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0bzsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZS5hc3NlcnRFcXVhbHM7CisKKworcHVibGljIGNsYXNzIFRlc3RBYnN0cmFjdFRocmlmdE1vam8geworCisgICAgcHJpdmF0ZSBUaHJpZnRUZXN0Q29tcGlsZU1vam8gbW9qbzsKKyAgICBwcml2YXRlIEZpbGUgdGVzdFJvb3REaXI7CisgICAgcHJpdmF0ZSBBcnRpZmFjdFJlcG9zaXRvcnkgbWF2ZW5SZXBvc2l0b3J5OworCisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgRmlsZSB0bXBEaXIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIikpOworICAgICAgICB0ZXN0Um9vdERpciA9IG5ldyBGaWxlKHRtcERpciwgInRocmlmdC10ZXN0Iik7CisKKyAgICAgICAgLy8gdGhlIHRydW5jYXRlUGF0aCBtZXRob2QgYXNzdW1lcyBhIG1hdmVuIHJlcG9zaXRvcnksIGJ1dCBpdCBvbmx5IGNhcmVzIGFib3V0IHRoZSBiYXNlIGRpcgorICAgICAgICBtYXZlblJlcG9zaXRvcnkgPSBNb2NraXRvLm1vY2soQXJ0aWZhY3RSZXBvc2l0b3J5LmNsYXNzKTsKKyAgICAgICAgTW9ja2l0by53aGVuKG1hdmVuUmVwb3NpdG9yeS5nZXRCYXNlZGlyKCkpLnRoZW5SZXR1cm4oIi90ZXN0L21hdmVuL3JlcG8vYmFzZWRpciIpOworCisgICAgICAgIG1vam8gPSBuZXcgVGhyaWZ0VGVzdENvbXBpbGVNb2pvKCk7CisgICAgICAgIG1vam8uc2V0TG9jYWxNYXZlblJlcG9zaXRvcnkobWF2ZW5SZXBvc2l0b3J5KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYWtlVGhyaWZ0UGF0aEZyb21KYXJzKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGZpbmFsIEZpbGUgdGVtcG9yYXJ5VGhyaWZ0RmlsZURpcmVjdG9yeSA9IHRlc3RSb290RGlyOworCisgICAgICAgIC8vIFRoZSBTaGFyZWRJZGwuamFyIGZpbGUgY29udGFpbnMgdGhlIHNhbWUgaWRsL3NoYXJlZC50aHJpZnQgYW5kIGlkbC90dXRvcmlhbC50aHJpZnQgaGllcmFyY2h5CisgICAgICAgIC8vIHVzZWQgYnkgb3RoZXIgdGVzdHMuIEl0J3MgdXNlZCBoZXJlIHRvIHJlcHJlc2VudCBhIGRlcGVuZGVuY3kgb2YgdGhlIHByb2plY3QgbWF2ZW4gaXMgYnVpbGRpbmcsCisgICAgICAgIC8vIG9uZSB0aGF0IGlzIGNvbnRyaWJ1dGluZyAudGhyaWZ0IElETCBmaWxlcyBhcyB3ZWxsIGFzIGFueSBvdGhlciBhcnRpZmFjdHMuCisgICAgICAgIGZpbmFsIEl0ZXJhYmxlPEZpbGU+IGNsYXNzcGF0aEVsZW1lbnRGaWxlcyA9IExpc3RzLm5ld0FycmF5TGlzdCgKKyAgICAgICAgICAgICAgICBuZXcgRmlsZSgic3JjL3Rlc3QvcmVzb3VyY2VzL2RlcGVuZGVuY3ktamFyLXRlc3QvU2hhcmVkSWRsLmphciIpCisgICAgICAgICk7CisKKyAgICAgICAgZmluYWwgU2V0PEZpbGU+IHRocmlmdERpcmVjdG9yaWVzID0gbW9qby5tYWtlVGhyaWZ0UGF0aEZyb21KYXJzKHRlbXBvcmFyeVRocmlmdEZpbGVEaXJlY3RvcnksIGNsYXNzcGF0aEVsZW1lbnRGaWxlcyk7CisKKyAgICAgICAgLy8gVGhlIHJlc3VsdHMgc2hvdWxkIGJlIGEgcGF0aCB0byBhIGRpcmVjdG9yeSBuYW1lZCBhZnRlciB0aGUgSkFSIGl0c2VsZiAoYXNzdW1pbmcgbm8gcGF0aCBoYXNoaW5nLAorICAgICAgICAvLyBidXQgc2VlIGJlbG93IGZvciBhIHNlcGFyYXRlIHRlc3Qgb2YgdGhhdCkgcmVwcmVzZW50aW5nIHRoZSByb290IG9mIGEgaGllcmFyY2h5IGNvbnRhaW5pbmcgdGhyaWZ0CisgICAgICAgIC8vIGZpbGVzLCBzdWl0YWJsZSBmb3IgcHJvdmlkaW5nIHRvIHRoZSB0aHJpZnQgY29tcGlsZXIgYXMgYW4gaW5jbHVkZSBkaXJlY3RvcnkuIEluIHRoaXMgY2FzZSwgdGhhdAorICAgICAgICAvLyBtZWFucyBpdCBwb2ludHMgdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSAiaWRsIiBoaWVyYXJjaHkgcmF0aGVyIHRoYW4gdG8gdGhlIGlkbCBkaXJlY3RvcnkKKyAgICAgICAgLy8gaXRzZWxmLgorICAgICAgICBmaW5hbCBTZXQ8RmlsZT4gZXhwZWN0ZWQgPSBTZXRzLm5ld0hhc2hTZXQoCisgICAgICAgICAgICAgICAgbmV3IEZpbGUodGVzdFJvb3REaXIsICJzcmMvdGVzdC9yZXNvdXJjZXMvZGVwZW5kZW5jeS1qYXItdGVzdC9TaGFyZWRJZGwuamFyIikKKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIm1ha2VUaHJpZnRQYXRoRnJvbUphcnMgc2hvdWxkIHJldHVybiB0aHJpZnQgSURMIGJhc2UgcGF0aCBmcm9tIHdpdGhpbiBKQVIiLCBleHBlY3RlZCwgdGhyaWZ0RGlyZWN0b3JpZXMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRydW5jYXRlUGF0aCgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICAvLyBKQVIgcGF0aCBpcyB1bnJlbGF0ZWQgdG8gbWF2ZW4gcmVwbywgYW5kIHNob3VsZCBiZSB1bmNoYW5nZWQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvcGF0aC90by9zb21lamFyLmphciIsIG1vam8udHJ1bmNhdGVQYXRoKCIvcGF0aC90by9zb21lamFyLmphciIpKTsKKworICAgICAgICAvLyBKQVIgcGF0aCBpcyB3aXRoaW4gbWF2ZW4gcmVwbywgYW5kIHNob3VsZCBiZSBtYWRlIHJlbGF0aXZlIHRvIHRoZSByZXBvCisgICAgICAgIGFzc2VydEVxdWFscygicGF0aC90by9zb21lamFyLmphciIsIG1vam8udHJ1bmNhdGVQYXRoKCIvdGVzdC9tYXZlbi9yZXBvL2Jhc2VkaXIvcGF0aC90by9zb21lamFyLmphciIpKTsKKworICAgICAgICAvLyBKQVIgcGF0aCBjb250YWlucyBmb3J3YXJkIHNsYXNoZXMgdGhhdCBzaG91bGQgYmUgbm9ybWFsaXplZAorICAgICAgICBhc3NlcnRFcXVhbHMoIi9wYXRoL3RvL3NvbWVqYXIuamFyIiwgbW9qby50cnVuY2F0ZVBhdGgoIlxccGF0aFxcdG9cXHNvbWVqYXIuamFyIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRydW5jYXRlUGF0aFdpdGhEZXBlbmRlbnRQYXRoSGFzaGluZygpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBtb2pvLnNldEhhc2hEZXBlbmRlbnRQYXRocyh0cnVlKTsKKworICAgICAgICAvLyBoYXNoRGVwZW5kZW50UGF0aHMgc2V0IHRvIHRydWUsIHRoZSBKQVIgcGF0aCBpcyBpbW1lZGlhdGVseSBoYXNoZWQgKE1ENSkgYW5kIGNvbnZlcnRlZCB0byBhIGhleCBzdHJpbmcKKworICAgICAgICBhc3NlcnRFcXVhbHMoIjFjODU5NTA5ODdiMjM0OTM0NjJjZjNjMjYxZDk1MTBhIiwgbW9qby50cnVuY2F0ZVBhdGgoIi9wYXRoL3RvL3NvbWVqYXIuamFyIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjM5ZmMyYjRjMzRjYjZjYjBkYTM4YmVkNWQ4YjVmYzY3IiwgbW9qby50cnVuY2F0ZVBhdGgoIi90ZXN0L21hdmVuL3JlcG8vYmFzZWRpci9wYXRoL3RvL3NvbWVqYXIuamFyIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjI1YjY5MjRmNWIwZTE5NDg2ZDBmZjg4NDQ4ZTk5OWQ1IiwgbW9qby50cnVuY2F0ZVBhdGgoIlxccGF0aFxcdG9cXHNvbWVqYXIuamFyIikpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aHJpZnQvbWF2ZW4vVGVzdFRocmlmdC5qYXZhIGIvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aHJpZnQvbWF2ZW4vVGVzdFRocmlmdC5qYXZhCmluZGV4IDNlY2QwOTQuLjdjNzg5MWUgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGhyaWZ0L21hdmVuL1Rlc3RUaHJpZnQuamF2YQorKysgYi9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RocmlmdC9tYXZlbi9UZXN0VGhyaWZ0LmphdmEKQEAgLTczLDcgKzczLDcgQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFRocmlmdENvbXBpbGVXaXRoR2VuZXJhdG9yT3B0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGJ1aWxkZXIuc2V0R2VuZXJhdG9yKCJqYXZhOnByaXZhdGUtbWVtYmVycyxoYXNoY29kZSIpOworICAgICAgICBidWlsZGVyLnNldEdlbmVyYXRvcigiamF2YTpwcml2YXRlLW1lbWJlcnMiKTsKICAgICAgICAgZXhlY3V0ZVRocmlmdENvbXBpbGUoKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGhyaWZ0LnNwZWMgYi9jb250cmliL3RocmlmdC5zcGVjCmluZGV4IGRhYjMyNzUuLmNjM2MzM2MgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvdGhyaWZ0LnNwZWMKKysrIGIvY29udHJpYi90aHJpZnQuc3BlYwpAQCAtMjgsNyArMjgsNyBAQAogTGljZW5zZTogICAgICAgIEFwYWNoZSBMaWNlbnNlIHYyLjAKIEdyb3VwOiAgICAgICAgICBEZXZlbG9wbWVudAogU3VtbWFyeTogICAgICAgIFJQQyBhbmQgc2VyaWFsaXphdGlvbiBmcmFtZXdvcmsKLVZlcnNpb246ICAgICAgICAwLjkuMworVmVyc2lvbjogICAgICAgIDEuMC4wCiBSZWxlYXNlOiAgICAgICAgMAogVVJMOiAgICAgICAgICAgIGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZwogUGFja2FnZXI6ICAgICAgIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+CkBAIC0xNzgsNiArMTc4LDE5IEBACiAgIC0td2l0aG91dC1jc2hhcnAgXAogICAtLXdpdGhvdXQtZXJsYW5nIFwKIAorJWlmIDAleyE/d2l0aG91dF9ydWJ5OjF9CitldmFsICQoZ3JlcCAiXldJVEhfUlVCWV9UUlVFIiBjb25maWcubG9nKQoraWYgW1sgIiR7V0lUSF9SVUJZX1RSVUV9IiAhPSAiIiBdXTsgdGhlbgorICBzZXQgK3gKKyAgZWNobyAiIgorICBlY2hvICJjb25maWd1cmUgZGV0ZXJtaW5lZCB0aGF0IHJ1YnkgcmVxdWlyZW1lbnRzIGFyZSBtaXNzaW5nIChidW5kbGVyIGdlbT8pLCBlaXRoZXIgaW5zdGFsbCBtaXNzaW5nIGNvbXBvbmVudHMiID4mMgorICBlY2hvICJvciBkaXNhYmxlIHRoZSBydWJ5IHN1Yi1wYWNrYWdlcyBhcyBmb2xsb3dzOiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4mMgorICBlY2hvICIgICAgIHJwbWJ1aWxkIC1EJyV3aXRob3V0X3J1YnkgMScgLi4uIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4mMgorICBlY2hvICIiCisgIGV4aXQgMQorZmkKKyVlbmRpZgorCiBtYWtlICV7P19zbXBfbWZsYWdzfQogCiAlaWYgMCV7IT93aXRob3V0X2phdmE6MX0KQEAgLTIzNCw1ICsyNDcsNyBAQAogL3NiaW4vbGRjb25maWcgPiAvZGV2L251bGwgMj4mMQogCiAlY2hhbmdlbG9nCi0qIFdlZCBTZXB0IDI1IDIwMTUgVGhyaWZ0IERldiA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPgotLSBUaHJpZnQgMC45LjMgcmVsZWFzZS4KKyogV2VkIEF1ZyAyMSAyMDEzIFRocmlmdCBEZXYgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KKy0gVGhyaWZ0IDAuOS4xIHJlbGVhc2UuCisqIFdlZCBPY3QgMTAgMjAxMiBUaHJpZnQgRGV2IDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+IAorLSBUaHJpZnQgMC45LjAgcmVsZWFzZS4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGhyaWZ0LnZpbSBiL2NvbnRyaWIvdGhyaWZ0LnZpbQppbmRleCAzMDAwYjQ2Li42MjMxOTU1IDEwMDY0NAotLS0gYS9jb250cmliL3RocmlmdC52aW0KKysrIGIvY29udHJpYi90aHJpZnQudmltCkBAIC01MSw3ICs1MSw3IEBACiBzeW4ga2V5d29yZCB0aHJpZnRLZXl3b3JkIG5hbWVzcGFjZQogc3luIGtleXdvcmQgdGhyaWZ0S2V5d29yZCB4c2RfYWxsIHhzZF9vcHRpb25hbCB4c2RfbmlsbGFibGUgeHNkX2F0dHJzCiBzeW4ga2V5d29yZCB0aHJpZnRLZXl3b3JkIGluY2x1ZGUgY3BwX2luY2x1ZGUgY3BwX3R5cGUgY29uc3Qgb3B0aW9uYWwgcmVxdWlyZWQKLXN5biBrZXl3b3JkIHRocmlmdEJhc2ljVHlwZXMgdm9pZCBib29sIGJ5dGUgaTE2IGkzMiBpNjQgZG91YmxlIHN0cmluZyBiaW5hcnkKK3N5biBrZXl3b3JkIHRocmlmdEJhc2ljVHlwZXMgdm9pZCBib29sIGJ5dGUgaTggaTE2IGkzMiBpNjQgZG91YmxlIHN0cmluZyBiaW5hcnkKIHN5biBrZXl3b3JkIHRocmlmdFN0cnVjdHVyZSBtYXAgbGlzdCBzZXQgc3RydWN0IHR5cGVkZWYgZXhjZXB0aW9uIGVudW0gdGhyb3dzIHVuaW9uCiAKICIgU3BlY2lhbApkaWZmIC0tZ2l0IGEvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL1RocmlmdENvbW1vbi5oIGIvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL1RocmlmdENvbW1vbi5oCmluZGV4IGQyNGQxYTcuLmUxNmQ4N2QgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9UaHJpZnRDb21tb24uaAorKysgYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvVGhyaWZ0Q29tbW9uLmgKQEAgLTE2LDggKzE2LDYgQEAKIC8vCiAKICNpZmRlZiBfV0lOMzIgLy90aHJpZnQgaXMgY3Jhc2hpbmcgd2hlbiB1c2luZyBib29zdCB0aHJlYWRzIG9uIE1hYyBPU1gKLSMgIGRlZmluZSBVU0VfQk9PU1RfVEhSRUFEIDEKLSMgIGluY2x1ZGUgPGJvb3N0L3RocmVhZC5ocHA+CiAjZWxzZQogIyAgaW5jbHVkZSA8c3lzL3NvY2tldC5oPgogIyAgaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgpkaWZmIC0tZ2l0IGEvY29udHJpYi92YWdyYW50L2NlbnRvcy02LjUvUkVBRE1FLm1kIGIvY29udHJpYi92YWdyYW50L2NlbnRvcy02LjUvUkVBRE1FLm1kCmluZGV4IDc2ZGNhNDQuLjU1NTgzZjkgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvdmFncmFudC9jZW50b3MtNi41L1JFQURNRS5tZAorKysgYi9jb250cmliL3ZhZ3JhbnQvY2VudG9zLTYuNS9SRUFETUUubWQKQEAgLTExLDcgKzExLDcgQEAKICAgICQgdmFncmFudCBzc2gKICAgIFt2YWdyYW50QHRocmlmdCB+XSQgY2QgL3RocmlmdAogICAgW3ZhZ3JhbnRAdGhyaWZ0IHRocmlmdF0kIGNvbXBpbGVyL2NwcC90aHJpZnQgLS12ZXJzaW9uCi0gICBUaHJpZnQgdmVyc2lvbiAxLjAuMC1kZXYKKyAgIFRocmlmdCB2ZXJzaW9uIDx2ZXJzaW9uPgogCiBUaGUgcHJvdmlzaW9uaW5nIHNjcmlwdCAoaW5zaWRlIHRoZSBWYWdyYW50ZmlsZSkgcnVucyAuL2Jvb3RzdHJhcC5zaCwgLi9jb25maWd1cmUsIG1ha2UgYW5kIG1ha2UgY2hlY2ssIGJ1dCBkb2VzIG5vdCBpbnN0YWxsIHRocmlmdC4gVG8gaW5zdGFsbCB0aHJpZnQgcnVuICJtYWtlIGluc3RhbGwiLgogCmRpZmYgLS1naXQgYS9jb250cmliL3ZhZ3JhbnQvY2VudG9zLTYuNS9WYWdyYW50ZmlsZSBiL2NvbnRyaWIvdmFncmFudC9jZW50b3MtNi41L1ZhZ3JhbnRmaWxlCmluZGV4IDYyMDc5NTguLjUxYTIyMzkgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvdmFncmFudC9jZW50b3MtNi41L1ZhZ3JhbnRmaWxlCisrKyBiL2NvbnRyaWIvdmFncmFudC9jZW50b3MtNi41L1ZhZ3JhbnRmaWxlCkBAIC04Nyw3ICs4Nyw3IEBACiAKICMgSmF2YSBMSUIgRGVwZW5kZW5jaWVzCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zdWRvIHl1bSBpbnN0YWxsIC15IGFudCBqdW5pdCBhbnQtbm9kZXBzIGFudC1qdW5pdCBqYXZhLTEuNy4wLW9wZW5qZGstZGV2ZWwKK3N1ZG8geXVtIGluc3RhbGwgLXkgYW50IGp1bml0IGFudC1ub2RlcHMgYW50LWp1bml0IGphdmEtMS44LjAtb3Blbmpkay1kZXZlbAogCiAjIFB5dGhvbiBMSUIgRGVwZW5kZW5jaWVzCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9jb250cmliL3plcm9tcS9NYWtlZmlsZSBiL2NvbnRyaWIvemVyb21xL01ha2VmaWxlCmluZGV4IGIwOWY0ZWUuLmVlMzk4ZTIgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvemVyb21xL01ha2VmaWxlCisrKyBiL2NvbnRyaWIvemVyb21xL01ha2VmaWxlCkBAIC0yNiw3ICsyNiw3IEBACiAKIHN0b3JhZ2UvX19pbml0X18ucHk6IHN0b3JhZ2UudGhyaWZ0CiAJJChSTSkgJChkaXIgJEApCi0JJChUSFJJRlQpIC0tZ2VuIHB5Om5ld3N0eWxlICQ8CisJJChUSFJJRlQpIC0tZ2VuIHB5ICQ8CiAJbXYgZ2VuLXB5LyQoZGlyICRAKSAuCiAKICQoR0VOU1JDUyk6IHN0b3JhZ2UudGhyaWZ0CmRpZmYgLS1naXQgYS9jb250cmliL3plcm9tcS9UWm1xQ2xpZW50LnB5IGIvY29udHJpYi96ZXJvbXEvVFptcUNsaWVudC5weQppbmRleCBkNTYwNjk3Li4xYmQ2MGExIDEwMDY0NAotLS0gYS9jb250cmliL3plcm9tcS9UWm1xQ2xpZW50LnB5CisrKyBiL2NvbnRyaWIvemVyb21xL1RabXFDbGllbnQucHkKQEAgLTIwLDQ0ICsyMCw0NSBAQAogZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCiBmcm9tIHRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydEJhc2UsIENSZWFkYWJsZVRyYW5zcG9ydAogCisKIGNsYXNzIFRabXFDbGllbnQoVFRyYW5zcG9ydEJhc2UsIENSZWFkYWJsZVRyYW5zcG9ydCk6Ci0gIGRlZiBfX2luaXRfXyhzZWxmLCBjdHgsIGVuZHBvaW50LCBzb2NrX3R5cGUpOgotICAgIHNlbGYuX3NvY2sgPSBjdHguc29ja2V0KHNvY2tfdHlwZSkKLSAgICBzZWxmLl9lbmRwb2ludCA9IGVuZHBvaW50Ci0gICAgc2VsZi5fd2J1ZiA9IFN0cmluZ0lPKCkKLSAgICBzZWxmLl9yYnVmID0gU3RyaW5nSU8oKQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjdHgsIGVuZHBvaW50LCBzb2NrX3R5cGUpOgorICAgICAgICBzZWxmLl9zb2NrID0gY3R4LnNvY2tldChzb2NrX3R5cGUpCisgICAgICAgIHNlbGYuX2VuZHBvaW50ID0gZW5kcG9pbnQKKyAgICAgICAgc2VsZi5fd2J1ZiA9IFN0cmluZ0lPKCkKKyAgICAgICAgc2VsZi5fcmJ1ZiA9IFN0cmluZ0lPKCkKIAotICBkZWYgb3BlbihzZWxmKToKLSAgICBzZWxmLl9zb2NrLmNvbm5lY3Qoc2VsZi5fZW5kcG9pbnQpCisgICAgZGVmIG9wZW4oc2VsZik6CisgICAgICAgIHNlbGYuX3NvY2suY29ubmVjdChzZWxmLl9lbmRwb2ludCkKIAotICBkZWYgcmVhZChzZWxmLCBzaXplKToKLSAgICByZXQgPSBzZWxmLl9yYnVmLnJlYWQoc2l6ZSkKLSAgICBpZiBsZW4ocmV0KSAhPSAwOgotICAgICAgcmV0dXJuIHJldAotICAgIHNlbGYuX3JlYWRfbWVzc2FnZSgpCi0gICAgcmV0dXJuIHNlbGYuX3JidWYucmVhZChzaXplKQorICAgIGRlZiByZWFkKHNlbGYsIHNpemUpOgorICAgICAgICByZXQgPSBzZWxmLl9yYnVmLnJlYWQoc2l6ZSkKKyAgICAgICAgaWYgbGVuKHJldCkgIT0gMDoKKyAgICAgICAgICAgIHJldHVybiByZXQKKyAgICAgICAgc2VsZi5fcmVhZF9tZXNzYWdlKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX3JidWYucmVhZChzaXplKQogCi0gIGRlZiBfcmVhZF9tZXNzYWdlKHNlbGYpOgotICAgIG1zZyA9IHNlbGYuX3NvY2sucmVjdigpCi0gICAgc2VsZi5fcmJ1ZiA9IFN0cmluZ0lPKG1zZykKKyAgICBkZWYgX3JlYWRfbWVzc2FnZShzZWxmKToKKyAgICAgICAgbXNnID0gc2VsZi5fc29jay5yZWN2KCkKKyAgICAgICAgc2VsZi5fcmJ1ZiA9IFN0cmluZ0lPKG1zZykKIAotICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKLSAgICBzZWxmLl93YnVmLndyaXRlKGJ1ZikKKyAgICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKKyAgICAgICAgc2VsZi5fd2J1Zi53cml0ZShidWYpCiAKLSAgZGVmIGZsdXNoKHNlbGYpOgotICAgIG1zZyA9IHNlbGYuX3didWYuZ2V0dmFsdWUoKQotICAgIHNlbGYuX3didWYgPSBTdHJpbmdJTygpCi0gICAgc2VsZi5fc29jay5zZW5kKG1zZykKKyAgICBkZWYgZmx1c2goc2VsZik6CisgICAgICAgIG1zZyA9IHNlbGYuX3didWYuZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLl93YnVmID0gU3RyaW5nSU8oKQorICAgICAgICBzZWxmLl9zb2NrLnNlbmQobXNnKQogCi0gICMgSW1wbGVtZW50IHRoZSBDUmVhZGFibGVUcmFuc3BvcnQgaW50ZXJmYWNlLgotICBAcHJvcGVydHkKLSAgZGVmIGNzdHJpbmdpb19idWYoc2VsZik6Ci0gICAgcmV0dXJuIHNlbGYuX3JidWYKKyAgICAjIEltcGxlbWVudCB0aGUgQ1JlYWRhYmxlVHJhbnNwb3J0IGludGVyZmFjZS4KKyAgICBAcHJvcGVydHkKKyAgICBkZWYgY3N0cmluZ2lvX2J1ZihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3JidWYKIAotICAjIE5PVEU6IFRoaXMgd2lsbCBwcm9iYWJseSBub3QgYWN0dWFsbHkgd29yay4KLSAgZGVmIGNzdHJpbmdpb19yZWZpbGwoc2VsZiwgcHJlZml4LCByZXFsZW4pOgotICAgIHdoaWxlIGxlbihwcmVmaXgpIDwgcmVxbGVuOgotICAgICAgc2VsZi5yZWFkX21lc3NhZ2UoKQotICAgICAgcHJlZml4ICs9IHNlbGYuX3JidWYuZ2V0dmFsdWUoKQotICAgIHNlbGYuX3JidWYgPSBTdHJpbmdJTyhwcmVmaXgpCi0gICAgcmV0dXJuIHNlbGYuX3JidWYKKyAgICAjIE5PVEU6IFRoaXMgd2lsbCBwcm9iYWJseSBub3QgYWN0dWFsbHkgd29yay4KKyAgICBkZWYgY3N0cmluZ2lvX3JlZmlsbChzZWxmLCBwcmVmaXgsIHJlcWxlbik6CisgICAgICAgIHdoaWxlIGxlbihwcmVmaXgpIDwgcmVxbGVuOgorICAgICAgICAgICAgc2VsZi5yZWFkX21lc3NhZ2UoKQorICAgICAgICAgICAgcHJlZml4ICs9IHNlbGYuX3JidWYuZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLl9yYnVmID0gU3RyaW5nSU8ocHJlZml4KQorICAgICAgICByZXR1cm4gc2VsZi5fcmJ1ZgpkaWZmIC0tZ2l0IGEvY29udHJpYi96ZXJvbXEvVFptcVNlcnZlci5jcHAgYi9jb250cmliL3plcm9tcS9UWm1xU2VydmVyLmNwcAppbmRleCBmMDMxNDU4Li44ODY2MGEzIDEwMDY0NAotLS0gYS9jb250cmliL3plcm9tcS9UWm1xU2VydmVyLmNwcAorKysgYi9jb250cmliL3plcm9tcS9UWm1xU2VydmVyLmNwcApAQCAtMjEsNyArMjEsNyBAQAogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KICNpbmNsdWRlIDxib29zdC9zY29wZWRfcHRyLmhwcD4KIAotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6c3RkOjpzaGFyZWRfcHRyOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcjsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sOwogCmRpZmYgLS1naXQgYS9jb250cmliL3plcm9tcS9UWm1xU2VydmVyLmggYi9jb250cmliL3plcm9tcS9UWm1xU2VydmVyLmgKaW5kZXggYTg0MGM4Ni4uZWNkMTNiNCAxMDA2NDQKLS0tIGEvY29udHJpYi96ZXJvbXEvVFptcVNlcnZlci5oCisrKyBiL2NvbnRyaWIvemVyb21xL1RabXFTZXJ2ZXIuaApAQCAtMjAsNiArMjAsNyBAQAogI2lmbmRlZiBfVEhSSUZUX1NFUlZFUl9UWk1RU0VSVkVSX0hfCiAjZGVmaW5lIF9USFJJRlRfU0VSVkVSX1RaTVFTRVJWRVJfSF8gMQogCisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHptcS5ocHA+CiAjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2VydmVyLmg+CiAKQEAgLTI4LDcgKzI5LDcgQEAKIGNsYXNzIFRabXFTZXJ2ZXIgOiBwdWJsaWMgVFNlcnZlciB7CiAgcHVibGljOgogICBUWm1xU2VydmVyKAotICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yLAorICAgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKICAgICAgIHptcTo6Y29udGV4dF90JiBjdHgsIGNvbnN0IHN0ZDo6c3RyaW5nJiBlbmRwb2ludCwgaW50IHR5cGUpCiAgICAgOiBUU2VydmVyKHByb2Nlc3NvcikKICAgICAsIHByb2Nlc3Nvcl8ocHJvY2Vzc29yKQpAQCAtNTYsNyArNTcsNyBAQAogICB9CiAKICBwcml2YXRlOgotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3JfOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yXzsKICAgaW50IHptcV90eXBlXzsKICAgem1xOjpzb2NrZXRfdCBzb2NrXzsKIH07CmRpZmYgLS1naXQgYS9jb250cmliL3plcm9tcS9UWm1xU2VydmVyLnB5IGIvY29udHJpYi96ZXJvbXEvVFptcVNlcnZlci5weQppbmRleCBjODNjYzhkLi4xNWMxNTQzIDEwMDY0NAotLS0gYS9jb250cmliL3plcm9tcS9UWm1xU2VydmVyLnB5CisrKyBiL2NvbnRyaWIvemVyb21xL1RabXFTZXJ2ZXIucHkKQEAgLTIxLDU4ICsyMSw1OSBAQAogaW1wb3J0IHRocmlmdC5zZXJ2ZXIuVFNlcnZlcgogaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydAogCisKIGNsYXNzIFRabXFTZXJ2ZXIodGhyaWZ0LnNlcnZlci5UU2VydmVyLlRTZXJ2ZXIpOgotICBkZWYgX19pbml0X18oc2VsZiwgcHJvY2Vzc29yLCBjdHgsIGVuZHBvaW50LCBzb2NrX3R5cGUpOgotICAgIHRocmlmdC5zZXJ2ZXIuVFNlcnZlci5UU2VydmVyLl9faW5pdF9fKHNlbGYsIHByb2Nlc3NvciwgTm9uZSkKLSAgICBzZWxmLnptcV90eXBlID0gc29ja190eXBlCi0gICAgc2VsZi5zb2NrZXQgPSBjdHguc29ja2V0KHNvY2tfdHlwZSkKLSAgICBzZWxmLnNvY2tldC5iaW5kKGVuZHBvaW50KQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcm9jZXNzb3IsIGN0eCwgZW5kcG9pbnQsIHNvY2tfdHlwZSk6CisgICAgICAgIHRocmlmdC5zZXJ2ZXIuVFNlcnZlci5UU2VydmVyLl9faW5pdF9fKHNlbGYsIHByb2Nlc3NvciwgTm9uZSkKKyAgICAgICAgc2VsZi56bXFfdHlwZSA9IHNvY2tfdHlwZQorICAgICAgICBzZWxmLnNvY2tldCA9IGN0eC5zb2NrZXQoc29ja190eXBlKQorICAgICAgICBzZWxmLnNvY2tldC5iaW5kKGVuZHBvaW50KQogCi0gIGRlZiBzZXJ2ZU9uZShzZWxmKToKLSAgICBtc2cgPSBzZWxmLnNvY2tldC5yZWN2KCkKLSAgICBpdHJhbnMgPSB0aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihtc2cpCi0gICAgb3RyYW5zID0gdGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQotICAgIGlwcm90ID0gc2VsZi5pbnB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChpdHJhbnMpCi0gICAgb3Byb3QgPSBzZWxmLm91dHB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChvdHJhbnMpCisgICAgZGVmIHNlcnZlT25lKHNlbGYpOgorICAgICAgICBtc2cgPSBzZWxmLnNvY2tldC5yZWN2KCkKKyAgICAgICAgaXRyYW5zID0gdGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIobXNnKQorICAgICAgICBvdHJhbnMgPSB0aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCisgICAgICAgIGlwcm90ID0gc2VsZi5pbnB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChpdHJhbnMpCisgICAgICAgIG9wcm90ID0gc2VsZi5vdXRwdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2wob3RyYW5zKQogCi0gICAgdHJ5OgotICAgICAgc2VsZi5wcm9jZXNzb3IucHJvY2VzcyhpcHJvdCwgb3Byb3QpCi0gICAgZXhjZXB0IEV4Y2VwdGlvbjoKLSAgICAgIGxvZ2dpbmcuZXhjZXB0aW9uKCJFeGNlcHRpb24gd2hpbGUgcHJvY2Vzc2luZyByZXF1ZXN0IikKLSAgICAgICMgRmFsbCB0aHJvdWdoIGFuZCBzZW5kIGJhY2sgYSByZXNwb25zZSwgZXZlbiBpZiBlbXB0eSBvciBpbmNvbXBsZXRlLgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnByb2Nlc3Nvci5wcm9jZXNzKGlwcm90LCBvcHJvdCkKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgIGxvZ2dpbmcuZXhjZXB0aW9uKCJFeGNlcHRpb24gd2hpbGUgcHJvY2Vzc2luZyByZXF1ZXN0IikKKyAgICAgICAgICAgICMgRmFsbCB0aHJvdWdoIGFuZCBzZW5kIGJhY2sgYSByZXNwb25zZSwgZXZlbiBpZiBlbXB0eSBvciBpbmNvbXBsZXRlLgogCi0gICAgaWYgc2VsZi56bXFfdHlwZSA9PSB6bXEuUkVQOgotICAgICAgbXNnID0gb3RyYW5zLmdldHZhbHVlKCkKLSAgICAgIHNlbGYuc29ja2V0LnNlbmQobXNnKQorICAgICAgICBpZiBzZWxmLnptcV90eXBlID09IHptcS5SRVA6CisgICAgICAgICAgICBtc2cgPSBvdHJhbnMuZ2V0dmFsdWUoKQorICAgICAgICAgICAgc2VsZi5zb2NrZXQuc2VuZChtc2cpCiAKLSAgZGVmIHNlcnZlKHNlbGYpOgotICAgIHdoaWxlIFRydWU6Ci0gICAgICBzZWxmLnNlcnZlT25lKCkKKyAgICBkZWYgc2VydmUoc2VsZik6CisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBzZWxmLnNlcnZlT25lKCkKIAogCiBjbGFzcyBUWm1xTXVsdGlTZXJ2ZXIob2JqZWN0KToKLSAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgIHNlbGYuc2VydmVycyA9IFtdCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLnNlcnZlcnMgPSBbXQogCi0gIGRlZiBzZXJ2ZU9uZShzZWxmLCB0aW1lb3V0ID0gLTEpOgotICAgIHNlbGYuX3NlcnZlQWN0aXZlKHNlbGYuX3NldHVwUG9sbCgpLCB0aW1lb3V0KQorICAgIGRlZiBzZXJ2ZU9uZShzZWxmLCB0aW1lb3V0PS0xKToKKyAgICAgICAgc2VsZi5fc2VydmVBY3RpdmUoc2VsZi5fc2V0dXBQb2xsKCksIHRpbWVvdXQpCiAKLSAgZGVmIHNlcnZlRm9yZXZlcihzZWxmKToKLSAgICBwb2xsX2luZm8gPSBzZWxmLl9zZXR1cFBvbGwoKQotICAgIHdoaWxlIFRydWU6Ci0gICAgICBzZWxmLl9zZXJ2ZUFjdGl2ZShwb2xsX2luZm8sIC0xKQorICAgIGRlZiBzZXJ2ZUZvcmV2ZXIoc2VsZik6CisgICAgICAgIHBvbGxfaW5mbyA9IHNlbGYuX3NldHVwUG9sbCgpCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBzZWxmLl9zZXJ2ZUFjdGl2ZShwb2xsX2luZm8sIC0xKQogCi0gIGRlZiBfc2V0dXBQb2xsKHNlbGYpOgotICAgIHNlcnZlcl9tYXAgPSB7fQotICAgIHBvbGxlciA9IHptcS5Qb2xsZXIoKQotICAgIGZvciBzZXJ2ZXIgaW4gc2VsZi5zZXJ2ZXJzOgotICAgICAgc2VydmVyX21hcFtzZXJ2ZXIuc29ja2V0XSA9IHNlcnZlcgotICAgICAgcG9sbGVyLnJlZ2lzdGVyKHNlcnZlci5zb2NrZXQsIHptcS5QT0xMSU4pCi0gICAgcmV0dXJuIChzZXJ2ZXJfbWFwLCBwb2xsZXIpCisgICAgZGVmIF9zZXR1cFBvbGwoc2VsZik6CisgICAgICAgIHNlcnZlcl9tYXAgPSB7fQorICAgICAgICBwb2xsZXIgPSB6bXEuUG9sbGVyKCkKKyAgICAgICAgZm9yIHNlcnZlciBpbiBzZWxmLnNlcnZlcnM6CisgICAgICAgICAgICBzZXJ2ZXJfbWFwW3NlcnZlci5zb2NrZXRdID0gc2VydmVyCisgICAgICAgICAgICBwb2xsZXIucmVnaXN0ZXIoc2VydmVyLnNvY2tldCwgem1xLlBPTExJTikKKyAgICAgICAgcmV0dXJuIChzZXJ2ZXJfbWFwLCBwb2xsZXIpCiAKLSAgZGVmIF9zZXJ2ZUFjdGl2ZShzZWxmLCBwb2xsX2luZm8sIHRpbWVvdXQpOgotICAgIChzZXJ2ZXJfbWFwLCBwb2xsZXIpID0gcG9sbF9pbmZvCi0gICAgcmVhZHkgPSBkaWN0KHBvbGxlci5wb2xsKCkpCi0gICAgZm9yIHNvY2ssIHN0YXRlIGluIHJlYWR5Lml0ZW1zKCk6Ci0gICAgICBhc3NlcnQgKHN0YXRlICYgem1xLlBPTExJTikgIT0gMAotICAgICAgc2VydmVyX21hcFtzb2NrXS5zZXJ2ZU9uZSgpCisgICAgZGVmIF9zZXJ2ZUFjdGl2ZShzZWxmLCBwb2xsX2luZm8sIHRpbWVvdXQpOgorICAgICAgICAoc2VydmVyX21hcCwgcG9sbGVyKSA9IHBvbGxfaW5mbworICAgICAgICByZWFkeSA9IGRpY3QocG9sbGVyLnBvbGwoKSkKKyAgICAgICAgZm9yIHNvY2ssIHN0YXRlIGluIHJlYWR5Lml0ZW1zKCk6CisgICAgICAgICAgICBhc3NlcnQgKHN0YXRlICYgem1xLlBPTExJTikgIT0gMAorICAgICAgICAgICAgc2VydmVyX21hcFtzb2NrXS5zZXJ2ZU9uZSgpCmRpZmYgLS1naXQgYS9jb250cmliL3plcm9tcS9jc2hhcnAvVGhyaWZ0Wk1RLmNzcHJvaiBiL2NvbnRyaWIvemVyb21xL2NzaGFycC9UaHJpZnRaTVEuY3Nwcm9qCmluZGV4IDk1OGZjNTUuLjgwYWQxZGIgMTAwNzU1Ci0tLSBhL2NvbnRyaWIvemVyb21xL2NzaGFycC9UaHJpZnRaTVEuY3Nwcm9qCisrKyBiL2NvbnRyaWIvemVyb21xL2NzaGFycC9UaHJpZnRaTVEuY3Nwcm9qCkBAIC0yNSw3ICsyNSw3IEBACiAgICAgPFVwZGF0ZVJlcXVpcmVkPmZhbHNlPC9VcGRhdGVSZXF1aXJlZD4KICAgICA8TWFwRmlsZUV4dGVuc2lvbnM+dHJ1ZTwvTWFwRmlsZUV4dGVuc2lvbnM+CiAgICAgPEFwcGxpY2F0aW9uUmV2aXNpb24+MDwvQXBwbGljYXRpb25SZXZpc2lvbj4KLSAgICA8QXBwbGljYXRpb25WZXJzaW9uPjAuOS4zLiUyYTwvQXBwbGljYXRpb25WZXJzaW9uPgorICAgIDxBcHBsaWNhdGlvblZlcnNpb24+MS4wLjAuMDwvQXBwbGljYXRpb25WZXJzaW9uPgogICAgIDxJc1dlYkJvb3RzdHJhcHBlcj5mYWxzZTwvSXNXZWJCb290c3RyYXBwZXI+CiAgICAgPFVzZUFwcGxpY2F0aW9uVHJ1c3Q+ZmFsc2U8L1VzZUFwcGxpY2F0aW9uVHJ1c3Q+CiAgICAgPEJvb3RzdHJhcHBlckVuYWJsZWQ+dHJ1ZTwvQm9vdHN0cmFwcGVyRW5hYmxlZD4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvemVyb21xL3Rlc3QtY2xpZW50LmNwcCBiL2NvbnRyaWIvemVyb21xL3Rlc3QtY2xpZW50LmNwcAppbmRleCBkMmZjNTZjLi4xNTljMjUwIDEwMDY0NAotLS0gYS9jb250cmliL3plcm9tcS90ZXN0LWNsaWVudC5jcHAKKysrIGIvY29udHJpYi96ZXJvbXEvdGVzdC1jbGllbnQuY3BwCkBAIC02LDcgKzYsNyBAQAogI2luY2x1ZGUgIlRabXFDbGllbnQuaCIKICNpbmNsdWRlICJTdG9yYWdlLmgiCiAKLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnN0ZDo6c2hhcmVkX3B0cjsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRabXFDbGllbnQ7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRCaW5hcnlQcm90b2NvbDsKIApAQCAtMTcsNyArMTcsNyBAQAogICBpZiAoYXJnYyA+IDEpIHsKICAgICBpbmNyID0gYXRvaShhcmd2WzFdKTsKICAgICBpZiAoaW5jcikgewotICAgICAgc29ja3R5cGUgPSBaTVFfRE9XTlNUUkVBTTsKKyAgICAgIHNvY2t0eXBlID0gWk1RX1BVU0g7CiAgICAgICBlbmRwb2ludCA9ICJ0Y3A6Ly8xMjcuMC4wLjE6OTA5MSI7CiAgICAgfQogICB9CmRpZmYgLS1naXQgYS9jb250cmliL3plcm9tcS90ZXN0LWNsaWVudC5weSBiL2NvbnRyaWIvemVyb21xL3Rlc3QtY2xpZW50LnB5CmluZGV4IDE4ODZkOWMuLmQ1MTIxNmUgMTAwNzU1Ci0tLSBhL2NvbnRyaWIvemVyb21xL3Rlc3QtY2xpZW50LnB5CisrKyBiL2NvbnRyaWIvemVyb21xL3Rlc3QtY2xpZW50LnB5CkBAIC05LDI4ICs5LDI4IEBACiAKIAogZGVmIG1haW4oYXJncyk6Ci0gIGVuZHBvaW50ID0gInRjcDovLzEyNy4wLjAuMTo5MDkwIgotICBzb2NrdHlwZSA9IHptcS5SRVEKLSAgaW5jciA9IDAKLSAgaWYgbGVuKGFyZ3MpID4gMToKLSAgICBpbmNyID0gaW50KGFyZ3NbMV0pCisgICAgZW5kcG9pbnQgPSAidGNwOi8vMTI3LjAuMC4xOjkwOTAiCisgICAgc29ja3R5cGUgPSB6bXEuUkVRCisgICAgaW5jciA9IDAKKyAgICBpZiBsZW4oYXJncykgPiAxOgorICAgICAgICBpbmNyID0gaW50KGFyZ3NbMV0pCisgICAgICAgIGlmIGluY3I6CisgICAgICAgICAgICBzb2NrdHlwZSA9IHptcS5QVVNICisgICAgICAgICAgICBlbmRwb2ludCA9ICJ0Y3A6Ly8xMjcuMC4wLjE6OTA5MSIKKworICAgIGN0eCA9IHptcS5Db250ZXh0KCkKKyAgICB0cmFuc3BvcnQgPSBUWm1xQ2xpZW50LlRabXFDbGllbnQoY3R4LCBlbmRwb2ludCwgc29ja3R5cGUpCisgICAgcHJvdG9jb2wgPSB0aHJpZnQucHJvdG9jb2wuVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKHRyYW5zcG9ydCkKKyAgICBjbGllbnQgPSBzdG9yYWdlLlN0b3JhZ2UuQ2xpZW50KHByb3RvY29sKQorICAgIHRyYW5zcG9ydC5vcGVuKCkKKwogICAgIGlmIGluY3I6Ci0gICAgICBzb2NrdHlwZSA9IHptcS5ET1dOU1RSRUFNCi0gICAgICBlbmRwb2ludCA9ICJ0Y3A6Ly8xMjcuMC4wLjE6OTA5MSIKLQotICBjdHggPSB6bXEuQ29udGV4dCgpCi0gIHRyYW5zcG9ydCA9IFRabXFDbGllbnQuVFptcUNsaWVudChjdHgsIGVuZHBvaW50LCBzb2NrdHlwZSkKLSAgcHJvdG9jb2wgPSB0aHJpZnQucHJvdG9jb2wuVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKHRyYW5zcG9ydCkKLSAgY2xpZW50ID0gc3RvcmFnZS5TdG9yYWdlLkNsaWVudChwcm90b2NvbCkKLSAgdHJhbnNwb3J0Lm9wZW4oKQotCi0gIGlmIGluY3I6Ci0gICAgY2xpZW50LmluY3IoaW5jcikKLSAgICB0aW1lLnNsZWVwKDAuMDUpCi0gIGVsc2U6Ci0gICAgdmFsdWUgPSBjbGllbnQuZ2V0KCkKLSAgICBwcmludCB2YWx1ZQorICAgICAgICBjbGllbnQuaW5jcihpbmNyKQorICAgICAgICB0aW1lLnNsZWVwKDAuMDUpCisgICAgZWxzZToKKyAgICAgICAgdmFsdWUgPSBjbGllbnQuZ2V0KCkKKyAgICAgICAgcHJpbnQodmFsdWUpCiAKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLSAgbWFpbihzeXMuYXJndikKKyAgICBtYWluKHN5cy5hcmd2KQpkaWZmIC0tZ2l0IGEvY29udHJpYi96ZXJvbXEvdGVzdC1yZWNlaXZlci5jcHAgYi9jb250cmliL3plcm9tcS90ZXN0LXJlY2VpdmVyLmNwcAppbmRleCA4ZmU2OWRhLi5kNDY1YmZmIDEwMDY0NAotLS0gYS9jb250cmliL3plcm9tcS90ZXN0LXJlY2VpdmVyLmNwcAorKysgYi9jb250cmliL3plcm9tcS90ZXN0LXJlY2VpdmVyLmNwcApAQCAtMiw3ICsyLDcgQEAKICNpbmNsdWRlICJUWm1xU2VydmVyLmgiCiAjaW5jbHVkZSAiU3RvcmFnZS5oIgogCi11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0OjpzdGQ6OnNoYXJlZF9wdHI7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvcjsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI6OlRabXFTZXJ2ZXI7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6c2VydmVyOjpUWm1xTXVsdGlTZXJ2ZXI7CmRpZmYgLS1naXQgYS9jb250cmliL3plcm9tcS90ZXN0LXNlbmRlci5jcHAgYi9jb250cmliL3plcm9tcS90ZXN0LXNlbmRlci5jcHAKaW5kZXggNmIwZWVmMS4uNWMwODZhMSAxMDA2NDQKLS0tIGEvY29udHJpYi96ZXJvbXEvdGVzdC1zZW5kZXIuY3BwCisrKyBiL2NvbnRyaWIvemVyb21xL3Rlc3Qtc2VuZGVyLmNwcApAQCAtNiw3ICs2LDcgQEAKICNpbmNsdWRlICJUWm1xQ2xpZW50LmgiCiAjaW5jbHVkZSAiU3RvcmFnZS5oIgogCi11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0OjpzdGQ6OnNoYXJlZF9wdHI7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUWm1xQ2xpZW50OwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUQmluYXJ5UHJvdG9jb2w7CiAKZGlmZiAtLWdpdCBhL2NvbnRyaWIvemVyb21xL3Rlc3Qtc2VydmVyLmNwcCBiL2NvbnRyaWIvemVyb21xL3Rlc3Qtc2VydmVyLmNwcAppbmRleCBjNjI0YjBkLi5lNmYxYjIwIDEwMDY0NAotLS0gYS9jb250cmliL3plcm9tcS90ZXN0LXNlcnZlci5jcHAKKysrIGIvY29udHJpYi96ZXJvbXEvdGVzdC1zZXJ2ZXIuY3BwCkBAIC0yLDcgKzIsNyBAQAogI2luY2x1ZGUgIlRabXFTZXJ2ZXIuaCIKICNpbmNsdWRlICJTdG9yYWdlLmgiCiAKLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnN0ZDo6c2hhcmVkX3B0cjsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjo6VFptcVNlcnZlcjsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI6OlRabXFNdWx0aVNlcnZlcjsKQEAgLTMzLDcgKzMzLDcgQEAKIAogICB6bXE6OmNvbnRleHRfdCBjdHgoMSk7CiAgIFRabXFTZXJ2ZXIgcmVxcmVwX3NlcnZlcihwcm9jZXNzb3IsIGN0eCwgInRjcDovLzAuMC4wLjA6OTA5MCIsIFpNUV9SRVApOwotICBUWm1xU2VydmVyIG9uZXdheV9zZXJ2ZXIocHJvY2Vzc29yLCBjdHgsICJ0Y3A6Ly8wLjAuMC4wOjkwOTEiLCBaTVFfVVBTVFJFQU0pOworICBUWm1xU2VydmVyIG9uZXdheV9zZXJ2ZXIocHJvY2Vzc29yLCBjdHgsICJ0Y3A6Ly8wLjAuMC4wOjkwOTEiLCBaTVFfUFVMTCk7CiAgIFRabXFNdWx0aVNlcnZlciBtdWx0aXNlcnZlcjsKICAgbXVsdGlzZXJ2ZXIuc2VydmVycygpLnB1c2hfYmFjaygmcmVxcmVwX3NlcnZlcik7CiAgIG11bHRpc2VydmVyLnNlcnZlcnMoKS5wdXNoX2JhY2soJm9uZXdheV9zZXJ2ZXIpOwpkaWZmIC0tZ2l0IGEvY29udHJpYi96ZXJvbXEvdGVzdC1zZXJ2ZXIucHkgYi9jb250cmliL3plcm9tcS90ZXN0LXNlcnZlci5weQppbmRleCA1NzY3YjcxLi5kODliMzdiIDEwMDc1NQotLS0gYS9jb250cmliL3plcm9tcS90ZXN0LXNlcnZlci5weQorKysgYi9jb250cmliL3plcm9tcS90ZXN0LXNlcnZlci5weQpAQCAtNiwyOCArNiwyOCBAQAogCiAKIGNsYXNzIFN0b3JhZ2VIYW5kbGVyKHN0b3JhZ2UuU3RvcmFnZS5JZmFjZSk6Ci0gIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICBzZWxmLnZhbHVlID0gMAorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi52YWx1ZSA9IDAKIAotICBkZWYgaW5jcihzZWxmLCBhbW91bnQpOgotICAgIHNlbGYudmFsdWUgKz0gYW1vdW50CisgICAgZGVmIGluY3Ioc2VsZiwgYW1vdW50KToKKyAgICAgICAgc2VsZi52YWx1ZSArPSBhbW91bnQKIAotICBkZWYgZ2V0KHNlbGYpOgotICAgIHJldHVybiBzZWxmLnZhbHVlCisgICAgZGVmIGdldChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudmFsdWUKIAogCiBkZWYgbWFpbigpOgotICBoYW5kbGVyID0gU3RvcmFnZUhhbmRsZXIoKQotICBwcm9jZXNzb3IgPSBzdG9yYWdlLlN0b3JhZ2UuUHJvY2Vzc29yKGhhbmRsZXIpCisgICAgaGFuZGxlciA9IFN0b3JhZ2VIYW5kbGVyKCkKKyAgICBwcm9jZXNzb3IgPSBzdG9yYWdlLlN0b3JhZ2UuUHJvY2Vzc29yKGhhbmRsZXIpCiAKLSAgY3R4ID0gem1xLkNvbnRleHQoKQotICByZXFyZXBfc2VydmVyID0gVFptcVNlcnZlci5UWm1xU2VydmVyKHByb2Nlc3NvciwgY3R4LCAidGNwOi8vMC4wLjAuMDo5MDkwIiwgem1xLlJFUCkKLSAgb25ld2F5X3NlcnZlciA9IFRabXFTZXJ2ZXIuVFptcVNlcnZlcihwcm9jZXNzb3IsIGN0eCwgInRjcDovLzAuMC4wLjA6OTA5MSIsIHptcS5VUFNUUkVBTSkKLSAgbXVsdGlzZXJ2ZXIgPSBUWm1xU2VydmVyLlRabXFNdWx0aVNlcnZlcigpCi0gIG11bHRpc2VydmVyLnNlcnZlcnMuYXBwZW5kKHJlcXJlcF9zZXJ2ZXIpCi0gIG11bHRpc2VydmVyLnNlcnZlcnMuYXBwZW5kKG9uZXdheV9zZXJ2ZXIpCi0gIG11bHRpc2VydmVyLnNlcnZlRm9yZXZlcigpCisgICAgY3R4ID0gem1xLkNvbnRleHQoKQorICAgIHJlcXJlcF9zZXJ2ZXIgPSBUWm1xU2VydmVyLlRabXFTZXJ2ZXIocHJvY2Vzc29yLCBjdHgsICJ0Y3A6Ly8wLjAuMC4wOjkwOTAiLCB6bXEuUkVQKQorICAgIG9uZXdheV9zZXJ2ZXIgPSBUWm1xU2VydmVyLlRabXFTZXJ2ZXIocHJvY2Vzc29yLCBjdHgsICJ0Y3A6Ly8wLjAuMC4wOjkwOTEiLCB6bXEuUFVMTCkKKyAgICBtdWx0aXNlcnZlciA9IFRabXFTZXJ2ZXIuVFptcU11bHRpU2VydmVyKCkKKyAgICBtdWx0aXNlcnZlci5zZXJ2ZXJzLmFwcGVuZChyZXFyZXBfc2VydmVyKQorICAgIG11bHRpc2VydmVyLnNlcnZlcnMuYXBwZW5kKG9uZXdheV9zZXJ2ZXIpCisgICAgbXVsdGlzZXJ2ZXIuc2VydmVGb3JldmVyKCkKIAogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotICBtYWluKCkKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL2RlYmlhbi9SRUFETUUubWQgYi9kZWJpYW4vUkVBRE1FLm1kCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggOThkNGRhMC4uOGViZmVlYQotLS0gYS9kZWJpYW4vUkVBRE1FLm1kCisrKyBiL2RlYmlhbi9SRUFETUUubWQKQEAgLTEsMTkgKzEsNDEgQEAKLXNvbWUgdGlwcyBvbiBEZWJpYW4gUGFja2FnaW5nCisjIyBTb21lIHRpcHMgb24gRGViaWFuIFBhY2thZ2luZworCiAtIERlYmlhbiBOZXcgTWFpbnRhaW5lcnMnIEd1aWRlIFtodHRwOi8vd3d3LmRlYmlhbi5vcmcvZG9jL2RlYmlhbi1wb2xpY3kvXQogLSBEZWJpYW4gUG9saWN5IE1hbnVhbCBbaHR0cDovL3d3dy5kZWJpYW4ub3JnL2RvYy9tYW51YWxzL21haW50LWd1aWRlL10KIC0gTWFjaGluZS1yZWFkYWJsZSBkZWJpYW4vY29weXJpZ2h0IGZpbGUgW2h0dHA6Ly9kZXAuZGViaWFuLm5ldC9kZXBzL2RlcDUvXQorLSBEZWJTcmMgMy4wIGd1aWRlbGluZXMgW2h0dHBzOi8vd2lraS5kZWJpYW4ub3JnL1Byb2plY3RzL0RlYlNyYzMuMF0KIAotYnVpbGQKKworIyMgQnVpbGQgdXNpbmcgZHBrZy1idWlsZHBhY2thZ2U6CisKK2BgYGJhc2gKICQgZHBrZy1idWlsZHBhY2thZ2UgLWQgLXRjCi0gIC1kICAgICAgICAgICAgIGRvIG5vdCBjaGVjayBidWlsZCBkZXBlbmRlbmNpZXMgYW5kIGNvbmZsaWN0cy4KLSAgLXRjICAgICAgICAgICAgY2xlYW4gc291cmNlIHRyZWUgd2hlbiBmaW5pc2hlZC4KKyAgLWQgICAjIGRvIG5vdCBjaGVjayBidWlsZCBkZXBlbmRlbmNpZXMgYW5kIGNvbmZsaWN0cy4KKyAgLXRjICAjIGNsZWFuIHNvdXJjZSB0cmVlIHdoZW4gZmluaXNoZWQuCitgYGAKIAotdXBkYXRlIGNoYW5nZWxvZworCisjIyBVcGRhdGUgY2hhbmdlbG9nOgorCitgYGBiYXNoCiAkIGRhdGUgLVIKK2BgYAogCi1jaGVjayBwYWNrYWdlcworT25lIGNhbiBhbHNvIGluc3RhbGwgYGRldnNjcmlwdHNgIHBhY2thZ2UgYW5kIHJ1bjoKKworYGBgYmFzaAorJCBkY2ggLWkKK2BgYAorCisKKyMjIENoZWNrIHBhY2thZ2VzOgorCitgYGBiYXNoCiAkIGRwa2cgLWMgKi5kZWIKICQgbGludGlhbiAqLmRlYgorYGBgCiAKLXRvZG8KLW1ha2UgaXQgcGVyZmVjdCEKKworIyMgVE9ETworCitNYWtlIGl0IHBlcmZlY3QhCmRpZmYgLS1naXQgYS9kZWJpYW4vY2hhbmdlbG9nIGIvZGViaWFuL2NoYW5nZWxvZwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDQ2MzhhMWYuLjY5YjVmMjAKLS0tIGEvZGViaWFuL2NoYW5nZWxvZworKysgYi9kZWJpYW4vY2hhbmdlbG9nCkBAIC0xLDE2ICsxLDI2IEBACit0aHJpZnQgKDAuMTIuMCkgc3RhYmxlOyB1cmdlbmN5PWxvdworCisgICogdXBkYXRlIHRvIDAuMTIuMAorCisgLS0gQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+ICBXZWQsIDI4IERlYyAyMDE4IDEyOjAwOjAwIC0wNTAwCisKK3RocmlmdCAoMC4xMS4wKSBzdGFibGU7IHVyZ2VuY3k9bG93CisKKyAgKiB1cGRhdGUgdG8gMC4xMS4wCisKKyAtLSBKYWtlIEZhcnJlbGwgPGpmYXJyZWxsQGFwYWNoZS5vcmc+ICBXZWQsIDA3IERlYyAyMDE3IDIwOjA3OjAwIC0wNTAwCisKK3RocmlmdCAoMC4xMC4wKSBzdGFibGU7IHVyZ2VuY3k9bG93CisKKyAgKiB1cGRhdGUgdG8gMC4xMC4wCisKKyAtLSBKYWtlIEZhcnJlbGwgPGpmYXJyZWxsQGFwYWNoZS5vcmc+ICBXZWQsIDAzIEphbiAyMDE3IDE2OjUyOjAwIC0wNTAwCisKIHRocmlmdCAoMC45LjMpIHN0YWJsZTsgdXJnZW5jeT1sb3cKKwogICAqIHVwZGF0ZSB0byAwLjkuMwogCi0gLS0gSmFrZSBGYXJyZWxsIDxqZmFycmVsbEBhcGFjaGUub3JnPiAgRnJpLCAyNSBTZXAgMjAxNSAxMjowMDowMCAtMDUwMAotCi10aHJpZnQgKDAuOS4yKSBzdGFibGU7IHVyZ2VuY3k9bG93Ci0KLSAgKiB1cGRhdGUgdG8gMC45LjIKLQotIC0tIEpha2UgRmFycmVsbCA8amZhcnJlbGxAYXBhY2hlLm9yZz4gIFRodSwgMzAgT2N0IDIwMTQgMTI6MDA6MDAgLTA1MDAKLQotdGhyaWZ0ICgwLjkuMSkgc3RhYmxlOyB1cmdlbmN5PWxvdwotICAqIHVwZGF0ZSB0byAwLjkuMQorIC0tIEpha2UgRmFycmVsbCA8amZhcnJlbGxAYXBhY2hlLm9yZz4gIFdlZCwgMTEgT2N0IDIwMTUgMTc6MjI6MDAgLTA1MDAKIAogdGhyaWZ0ICgwLjkuMCkgc3RhYmxlOyB1cmdlbmN5PWxvdwogCmRpZmYgLS1naXQgYS9kZWJpYW4vY29tcGF0IGIvZGViaWFuL2NvbXBhdAppbmRleCA3ZWQ2ZmY4Li5lYzYzNTE0IDEwMDY0NAotLS0gYS9kZWJpYW4vY29tcGF0CisrKyBiL2RlYmlhbi9jb21wYXQKQEAgLTEgKzEgQEAKLTUKKzkKZGlmZiAtLWdpdCBhL2RlYmlhbi9jb250cm9sIGIvZGViaWFuL2NvbnRyb2wKaW5kZXggMzlkNTdmOS4uOTgxOGEzNyAxMDA2NDQKLS0tIGEvZGViaWFuL2NvbnRyb2wKKysrIGIvZGViaWFuL2NvbnRyb2wKQEAgLTEsMTggKzEsMjEgQEAKIFNvdXJjZTogdGhyaWZ0CiBTZWN0aW9uOiBkZXZlbAogUHJpb3JpdHk6IGV4dHJhCi1CdWlsZC1EZXBlbmRzOiBkZWJoZWxwZXIgKD49IDUpLCBidWlsZC1lc3NlbnRpYWwsIG1vbm8tZ21jcywgcHl0aG9uLWRldiwgYW50LAotICAgIG1vbm8tZGV2ZWwsICBsaWJtb25vLXN5c3RlbS13ZWIyLjAtY2lsLCBlcmxhbmctYmFzZSwgcnVieTEuOC1kZXYsIGF1dG9jb25mLCBhdXRvbWFrZSwKLSAgICBwa2ctY29uZmlnLCBsaWJ0b29sLCBiaXNvbiwgZmxleCwgbGliYm9vc3QtZGV2IHwgbGliYm9vc3QxLjQwLWRldiwgcHl0aG9uLWFsbCwKLSAgICBweXRob24tYWxsLWRldiwgcHl0aG9uLWFsbC1kYmcsIG9wZW5qZGstNi1qZGsgfCBqYXZhLXNkaywKLSAgICBsaWJib29zdC10ZXN0LWRldiB8IGxpYmJvb3N0LXRlc3QxLjQwLWRldiwgbGliZXZlbnQtZGV2LCBwZXJsICg+PSA1LjguMC03KSwKLSAgICBwaHA1LCBwaHA1LWRldiwgbGliZ2xpYjIuMC1kZXYsIGxpYnF0NC1kZXYKK0J1aWxkLURlcGVuZHM6IGRlYmhlbHBlciAoPj0gOSksIGJ1aWxkLWVzc2VudGlhbCwgbW9uby1tY3MsIHB5dGhvbi1kZXYsIGFudCwKKyAgICBtb25vLWRldmVsLCAgbGlibW9uby1zeXN0ZW0td2ViNC4wLWNpbCwgZXJsYW5nLWJhc2UsIHJ1YnktZGV2IHwgcnVieTEuOS4xLWRldiwgcnVieS1idW5kbGVyICxhdXRvY29uZiwgYXV0b21ha2UsCisgICAgcGtnLWNvbmZpZywgbGlidG9vbCwgYmlzb24sIGZsZXgsIGxpYmJvb3N0LWRldiB8IGxpYmJvb3N0MS41My1kZXYgfCBsaWJib29zdDEuNjMtYWxsLWRldiwKKyAgICBweXRob24tYWxsLCBweXRob24tc2V0dXB0b29scywgcHl0aG9uLWFsbC1kZXYsIHB5dGhvbi1hbGwtZGJnLAorICAgIHB5dGhvbjMtYWxsLCBweXRob24zLXNldHVwdG9vbHMsIHB5dGhvbjMtYWxsLWRldiwgcHl0aG9uMy1hbGwtZGJnLAorICAgIG9wZW5qZGstNy1qZGsgfCBvcGVuamRrLTgtamRrIHwgZGVmYXVsdC1qZGssCisgICAgbGliYm9vc3QtdGVzdC1kZXYgfCBsaWJib29zdC10ZXN0MS41My1kZXYgfCBsaWJib29zdC10ZXN0MS42My1kZXYsIGxpYmV2ZW50LWRldiwgbGlic3NsLWRldiwgcGVybCAoPj0gNS44LjAtNyksCisgICAgcGhwICg+PSA1KSwgcGhwLWRldiAoPj0gNSksIGxpYmdsaWIyLjAtZGV2LCBxdGNob29zZXIsIHF0YmFzZTUtZGV2LXRvb2xzCiBNYWludGFpbmVyOiBUaHJpZnQgRGV2ZWxvcGVyJ3MgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KIEhvbWVwYWdlOiBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvCi1WY3MtR2l0OiBodHRwczovL2dpdC13aXAtdXMuYXBhY2hlLm9yZy9yZXBvcy9hc2YvdGhyaWZ0LmdpdAotVmNzLUJyb3dzZXI6IGh0dHBzOi8vZ2l0LXdpcC11cy5hcGFjaGUub3JnL3JlcG9zL2FzZj9wPXRocmlmdC5naXQKLVN0YW5kYXJkcy1WZXJzaW9uOiAzLjcuMgorVmNzLUdpdDogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQuZ2l0CitWY3MtQnJvd3NlcjogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQKK1N0YW5kYXJkcy1WZXJzaW9uOiAzLjkuNwogWC1QeXRob24tVmVyc2lvbjogPj0gMi42CitYLVB5dGhvbjMtVmVyc2lvbjogPj0gMy4zCiAKIFBhY2thZ2U6IHRocmlmdC1jb21waWxlcgogQXJjaGl0ZWN0dXJlOiBhbnkKQEAgLTI5LDEwICszMiwxMCBAQAogUGFja2FnZTogcHl0aG9uLXRocmlmdAogQXJjaGl0ZWN0dXJlOiBhbnkKIFNlY3Rpb246IHB5dGhvbgotRGVwZW5kczogJHtweXRob246RGVwZW5kc30sICR7c2hsaWJzOkRlcGVuZHN9LCAke21pc2M6RGVwZW5kc30KLVJlY29tbWVuZHM6IHB5dGhvbi10d2lzdGVkLWNvcmUKK0RlcGVuZHM6ICR7cHl0aG9uOkRlcGVuZHN9LCAke3NobGliczpEZXBlbmRzfSwgJHttaXNjOkRlcGVuZHN9LCBweXRob24tc2l4CitSZWNvbW1lbmRzOiBweXRob24tdHdpc3RlZC13ZWIsIHB5dGhvbi1iYWNrcG9ydHMuc3NsLW1hdGNoLWhvc3RuYW1lLCBweXRob24taXBhZGRyZXNzCiBQcm92aWRlczogJHtweXRob246UHJvdmlkZXN9Ci1EZXNjcmlwdGlvbjogUHl0aG9uIGJpbmRpbmdzIGZvciBUaHJpZnQKK0Rlc2NyaXB0aW9uOiBQeXRob24gYmluZGluZ3MgZm9yIFRocmlmdCAoUHl0aG9uIDIpCiAgVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcwogIGRldmVsb3BtZW50LiBJdCBjb21iaW5lcyBhIHNvZnR3YXJlIHN0YWNrIHdpdGggYSBjb2RlIGdlbmVyYXRpb24gZW5naW5lIHRvCiAgYnVpbGQgc2VydmljZXMgdGhhdCB3b3JrIGVmZmljaWVudGx5IGFuZCBzZWFtbGVzc2x5LgpAQCAtNDEsMTAgKzQ0LDEyIEBACiAgdG9vbCAoaW4gdGhlIHRocmlmdC1jb21waWxlciBwYWNrYWdlKSB0byBjb21waWxlIHlvdXIgZGVmaW5pdGlvbiB0byBQeXRob24KICBjbGFzc2VzLCBhbmQgdGhlbiB0aGUgbW9kdWxlcyBpbiB0aGlzIHBhY2thZ2Ugd2lsbCBhbGxvdyB5b3UgdG8gdXNlIHRob3NlCiAgY2xhc3NlcyBpbiB5b3VyIHByb2dyYW1zLgorIC4KKyBUaGlzIHBhY2thZ2UgaW5zdGFsbHMgdGhlIGxpYnJhcnkgZm9yIFB5dGhvbiAyLgogCiBQYWNrYWdlOiBweXRob24tdGhyaWZ0LWRiZwogQXJjaGl0ZWN0dXJlOiBhbnkKLVNlY3Rpb246IHB5dGhvbgorU2VjdGlvbjogZGVidWcKIERlcGVuZHM6ICR7c2hsaWJzOkRlcGVuZHN9LCAke21pc2M6RGVwZW5kc30sIHB5dGhvbi10aHJpZnQgKD0gJHtiaW5hcnk6VmVyc2lvbn0pLCBweXRob24tYWxsLWRiZwogUHJvdmlkZXM6ICR7cHl0aG9uOlByb3ZpZGVzfQogRGVzY3JpcHRpb246IFB5dGhvbiBiaW5kaW5ncyBmb3IgVGhyaWZ0IChkZWJ1ZyB2ZXJzaW9uKQpAQCAtNTcsNiArNjIsMzkgQEAKICBkZWZpbml0aW9uIHRvIFB5dGhvbiBjbGFzc2VzLCBhbmQgdGhlbiB0aGUgbW9kdWxlcyBpbiB0aGlzIHBhY2thZ2Ugd2lsbCBhbGxvdwogIHlvdSB0byB1c2UgdGhvc2UgY2xhc3NlcyBpbiB5b3VyIHByb2dyYW1zLgogCitQYWNrYWdlOiBweXRob24zLXRocmlmdAorQXJjaGl0ZWN0dXJlOiBhbnkKK1NlY3Rpb246IHB5dGhvbgorRGVwZW5kczogJHtweXRob24zOkRlcGVuZHN9LCAke3NobGliczpEZXBlbmRzfSwgJHttaXNjOkRlcGVuZHN9LCBweXRob24zLXNpeAorUmVjb21tZW5kczogcHl0aG9uMy10d2lzdGVkLXdlYgorUHJvdmlkZXM6ICR7cHl0aG9uOlByb3ZpZGVzfQorRGVzY3JpcHRpb246IFB5dGhvbiBiaW5kaW5ncyBmb3IgVGhyaWZ0IChQeXRob24gMykKKyBUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzCisgZGV2ZWxvcG1lbnQuIEl0IGNvbWJpbmVzIGEgc29mdHdhcmUgc3RhY2sgd2l0aCBhIGNvZGUgZ2VuZXJhdGlvbiBlbmdpbmUgdG8KKyBidWlsZCBzZXJ2aWNlcyB0aGF0IHdvcmsgZWZmaWNpZW50bHkgYW5kIHNlYW1sZXNzbHkuCisgLgorIFRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgUHl0aG9uIGJpbmRpbmdzIGZvciBUaHJpZnQuIFlvdSB3aWxsIG5lZWQgdGhlIHRocmlmdAorIHRvb2wgKGluIHRoZSB0aHJpZnQtY29tcGlsZXIgcGFja2FnZSkgdG8gY29tcGlsZSB5b3VyIGRlZmluaXRpb24gdG8gUHl0aG9uCisgY2xhc3NlcywgYW5kIHRoZW4gdGhlIG1vZHVsZXMgaW4gdGhpcyBwYWNrYWdlIHdpbGwgYWxsb3cgeW91IHRvIHVzZSB0aG9zZQorIGNsYXNzZXMgaW4geW91ciBwcm9ncmFtcy4KKyAuCisgVGhpcyBwYWNrYWdlIGluc3RhbGxzIHRoZSBsaWJyYXJ5IGZvciBQeXRob24gMy4KKworUGFja2FnZTogcHl0aG9uMy10aHJpZnQtZGJnCitBcmNoaXRlY3R1cmU6IGFueQorU2VjdGlvbjogZGVidWcKK0RlcGVuZHM6ICR7c2hsaWJzOkRlcGVuZHN9LCAke21pc2M6RGVwZW5kc30sIHB5dGhvbjMtdGhyaWZ0ICg9ICR7YmluYXJ5OlZlcnNpb259KSwgcHl0aG9uMy1hbGwtZGJnCitQcm92aWRlczogJHtweXRob246UHJvdmlkZXN9CitEZXNjcmlwdGlvbjogUHl0aG9uIGJpbmRpbmdzIGZvciBUaHJpZnQgKGRlYnVnIHZlcnNpb24pCisgVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcworIGRldmVsb3BtZW50LiBJdCBjb21iaW5lcyBhIHNvZnR3YXJlIHN0YWNrIHdpdGggYSBjb2RlIGdlbmVyYXRpb24gZW5naW5lIHRvCisgYnVpbGQgc2VydmljZXMgdGhhdCB3b3JrIGVmZmljaWVudGx5IGFuZCBzZWFtbGVzc2x5LgorIC4KKyBUaGlzIHBhY2thZ2UgY29udGFpbnMgdGhlIFB5dGhvbiBiaW5kaW5ncyBmb3IgVGhyaWZ0IHdpdGggZGVidWdnaW5nIHN5bWJvbHMuCisgWW91IHdpbGwgbmVlZCB0aGUgdGhyaWZ0IHRvb2wgKGluIHRoZSB0aHJpZnQtY29tcGlsZXIgcGFja2FnZSkgdG8gY29tcGlsZSB5b3VyCisgZGVmaW5pdGlvbiB0byBQeXRob24gY2xhc3NlcywgYW5kIHRoZW4gdGhlIG1vZHVsZXMgaW4gdGhpcyBwYWNrYWdlIHdpbGwgYWxsb3cKKyB5b3UgdG8gdXNlIHRob3NlIGNsYXNzZXMgaW4geW91ciBwcm9ncmFtcy4KKwogUGFja2FnZTogcnVieS10aHJpZnQKIEFyY2hpdGVjdHVyZTogYWxsCiBTZWN0aW9uOiBsaWJzCkBAIC03Niw4ICsxMTQsOCBAQAogCiBQYWNrYWdlOiBsaWJ0aHJpZnQtamF2YQogQXJjaGl0ZWN0dXJlOiBhbGwKLVNlY3Rpb246IGxpYnMKLURlcGVuZHM6IGphdmEtZ2NqLWNvbXBhdCB8IGphdmExLXJ1bnRpbWUgfCBqYXZhMi1ydW50aW1lLCAke21pc2M6RGVwZW5kc30KK1NlY3Rpb246IGphdmEKK0RlcGVuZHM6ICR7bWlzYzpEZXBlbmRzfQogRGVzY3JpcHRpb246IEphdmEgYmluZGluZ3MgZm9yIFRocmlmdAogIFRocmlmdCBpcyBhIHNvZnR3YXJlIGZyYW1ld29yayBmb3Igc2NhbGFibGUgY3Jvc3MtbGFuZ3VhZ2Ugc2VydmljZXMKICBkZXZlbG9wbWVudC4gSXQgY29tYmluZXMgYSBzb2Z0d2FyZSBzdGFjayB3aXRoIGEgY29kZSBnZW5lcmF0aW9uIGVuZ2luZSB0bwpAQCAtOTAsOSArMTI4LDkgQEAKIAogUGFja2FnZTogbGlidGhyaWZ0LWNpbAogQXJjaGl0ZWN0dXJlOiBhbGwKLVNlY3Rpb246IGxpYnMKLURlcGVuZHM6IGNsaS1jb21tb24sIGxpYm1vbm8tY29ybGliMS4wLWNpbCAoPj0gMS4wKSwgbGlibW9uby1zeXN0ZW0xLjAtY2lsICg+PSAxLjApLCAKLSAgICBsaWJtb25vLXN5c3RlbS13ZWIyLjAtY2lsLCAke21pc2M6RGVwZW5kc30KK1NlY3Rpb246IGNsaS1tb25vCitEZXBlbmRzOiBjbGktY29tbW9uLCBsaWJtb25vLWNvcmxpYjQuMC1jaWwgKD49IDIuMTApIHwgbGlibW9uby1jb3JsaWI0LjUtY2lsICg+PTMuMiksIGxpYm1vbm8tc3lzdGVtNC4wLWNpbCAoPj0gMi4xMCksCisgICAgbGlibW9uby1zeXN0ZW0td2ViNC4wLWNpbCAoPj0gMi4xMCksICR7bWlzYzpEZXBlbmRzfQogRGVzY3JpcHRpb246IENMSSBiaW5kaW5ncyBmb3IgVGhyaWZ0CiAgVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcwogIGRldmVsb3BtZW50LiBJdCBjb21iaW5lcyBhIHNvZnR3YXJlIHN0YWNrIHdpdGggYSBjb2RlIGdlbmVyYXRpb24gZW5naW5lIHRvCkBAIC0xMjgsMTAgKzE2NiwyMSBAQAogIFRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgcnVudGltZSBsaWJyYXJpZXMgbmVlZGVkIGZvciBDKysgYXBwbGljYXRpb25zCiAgdXNpbmcgVGhyaWZ0LgogCitQYWNrYWdlOiBsaWJ0aHJpZnQwLWRiZworQXJjaGl0ZWN0dXJlOiBhbnkKK1NlY3Rpb246IGRlYnVnCitEZXBlbmRzOiAke3NobGliczpEZXBlbmRzfSwgJHttaXNjOkRlcGVuZHN9LCBsaWJ0aHJpZnQwICg9ICR7YmluYXJ5OlZlcnNpb259KQorRGVzY3JpcHRpb246IFRocmlmdCBDKysgbGlicmFyeSBkZWJ1ZyBzeW1ib2xzCisgVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcworIGRldmVsb3BtZW50LiBJdCBjb21iaW5lcyBhIHNvZnR3YXJlIHN0YWNrIHdpdGggYSBjb2RlIGdlbmVyYXRpb24gZW5naW5lIHRvCisgYnVpbGQgc2VydmljZXMgdGhhdCB3b3JrIGVmZmljaWVudGx5IGFuZCBzZWFtbGVzc2x5LgorIC4KKyBUaGlzIHBhY2thZ2UgY29udGFpbnMgdGhlIGRlYnVnIHN5bWJvbHMgZm9yIHRoZSBUaHJpZnQgQysrIHJ1bnRpbWUgbGlicmFyaWVzLgorCiBQYWNrYWdlOiBsaWJ0aHJpZnQtZGV2CiBBcmNoaXRlY3R1cmU6IGFueQogU2VjdGlvbjogbGliZGV2ZWwKLURlcGVuZHM6ICR7c2hsaWJzOkRlcGVuZHN9LCAke21pc2M6RGVwZW5kc30sIGxpYnRocmlmdDAsIGxpYmdsaWIyLjAtZGV2CitEZXBlbmRzOiAke3NobGliczpEZXBlbmRzfSwgJHttaXNjOkRlcGVuZHN9LCBsaWJ0aHJpZnQwICg9ICR7YmluYXJ5OlZlcnNpb259KSwgbGliZ2xpYjIuMC1kZXYKIERlc2NyaXB0aW9uOiBUaHJpZnQgQysrIGxpYnJhcnkgKGRldmVsb3BtZW50IGhlYWRlcnMpCiAgVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcwogIGRldmVsb3BtZW50LiBJdCBjb21iaW5lcyBhIHNvZnR3YXJlIHN0YWNrIHdpdGggYSBjb2RlIGdlbmVyYXRpb24gZW5naW5lIHRvCmRpZmYgLS1naXQgYS9kZWJpYW4vY29weXJpZ2h0IGIvZGViaWFuL2NvcHlyaWdodAppbmRleCAyNTU0NmI0Li44NTA2NDNjIDEwMDY0NAotLS0gYS9kZWJpYW4vY29weXJpZ2h0CisrKyBiL2RlYmlhbi9jb3B5cmlnaHQKQEAgLTQsNyArNCw3IEBACiBUaGlzIHBhY2thZ2UgYW5kIHRoZSBEZWJpYW4gcGFja2FnaW5nIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwKIHNlZSBgL3Vzci9zaGFyZS9jb21tb24tbGljZW5zZXMvQXBhY2hlLTIuMCcuCiAKLVRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb25zIHdhcyBjb3BpZWQgZnJvbSBBcGFjaGUgVGhyaWZ0IExJQ0VOU0UgZmlsZS4KK1RoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24gd2FzIGNvcGllZCBmcm9tIEFwYWNoZSBUaHJpZnQgTElDRU5TRSBmaWxlLgogCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU09GVFdBUkUgRElTVFJJQlVURUQgV0lUSCBUSFJJRlQ6CmRpZmYgLS1naXQgYS9kZWJpYW4vbGlidGhyaWZ0MC5pbnN0YWxsIGIvZGViaWFuL2xpYnRocmlmdDAuaW5zdGFsbApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9kZWJpYW4vcnVsZXMgYi9kZWJpYW4vcnVsZXMKaW5kZXggZDg0NjJkMS4uOWI0MzZkOSAxMDA3NTUKLS0tIGEvZGViaWFuL3J1bGVzCisrKyBiL2RlYmlhbi9ydWxlcwpAQCAtMTgsMTIgKzE4LDE4IEBACiAKIFBZVkVSUyA6PSAkKHNoZWxsIHB5dmVyc2lvbnMgLXIpCiAKK2V4cG9ydCBDUFBGTEFHUzo9JChzaGVsbCBkcGtnLWJ1aWxkZmxhZ3MgLS1nZXQgQ1BQRkxBR1MpCitleHBvcnQgQ0ZMQUdTOj0kKHNoZWxsIGRwa2ctYnVpbGRmbGFncyAtLWdldCBDRkxBR1MpCitleHBvcnQgQ1hYRkxBR1M6PSQoc2hlbGwgZHBrZy1idWlsZGZsYWdzIC0tZ2V0IENYWEZMQUdTKQorZXhwb3J0IExERkxBR1M6PSQoc2hlbGwgZHBrZy1idWlsZGZsYWdzIC0tZ2V0IExERkxBR1MpCisKIGNvbmZpZ3VyZTogY29uZmlndXJlLXN0YW1wCiBjb25maWd1cmUtc3RhbXA6CiAJZGhfdGVzdGRpcgorCiAJIyBBZGQgaGVyZSBjb21tYW5kcyB0byBjb25maWd1cmUgdGhlIHBhY2thZ2UuCiAJaWYgWyAtZiBib290c3RyYXAuc2ggXTsgdGhlbiAkKENVUkRJUikvYm9vdHN0cmFwLnNoOyBmaQotCSQoQ1VSRElSKS9jb25maWd1cmUgLS1wcmVmaXg9L3VzciAtLXdpdGgtY19nbGliIC0td2l0aG91dC1lcmxhbmcKKwkkKENVUkRJUikvY29uZmlndXJlIC0tcHJlZml4PS91c3IgLS1lbmFibGUtcGx1Z2luPW5vCiAKIAl0b3VjaCBjb25maWd1cmUtc3RhbXAKIApAQCAtMzQsNyArNDAsNyBAQAogCSMgJChNQUtFKSAtQyB0ZXN0IGNoZWNrCiAKIGJ1aWxkLWFyY2g6IGJ1aWxkLWFyY2gtc3RhbXAKLWJ1aWxkLWFyY2gtc3RhbXA6IGNvbmZpZ3VyZS1zdGFtcAorJChDVVJESVIpL2NvbXBpbGVyL2NwcC90aHJpZnQgYnVpbGQtYXJjaC1zdGFtcDogY29uZmlndXJlLXN0YW1wCiAKIAkjIENvbXBpbGUgY29tcGlsZXIKIAkkKE1BS0UpIC1DICQoQ1VSRElSKS9jb21waWxlci9jcHAKQEAgLTU1LDE5ICs2MSwxOSBAQAogCSMgUEhQCiAJY2QgJChDVVJESVIpL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wgJiYgXAogCQlwaHBpemUgJiYgXAotCQkuL2NvbmZpZ3VyZSAmJiBtYWtlCisJCS4vY29uZmlndXJlICYmICQoTUFLRSkKIAogCXRvdWNoICRACiAKIGJ1aWxkLWluZGVwOiBidWlsZC1pbmRlcC1zdGFtcAotYnVpbGQtaW5kZXAtc3RhbXA6IGNvbmZpZ3VyZS1zdGFtcAorYnVpbGQtaW5kZXAtc3RhbXA6IGNvbmZpZ3VyZS1zdGFtcCAkKENVUkRJUikvY29tcGlsZXIvY3BwL3RocmlmdAogCiAJIyBBZGQgaGVyZSBjb21tYW5kcyB0byBjb21waWxlIHRoZSBpbmRlcCBwYXJ0IG9mIHRoZSBwYWNrYWdlLgogCSMkKE1BS0UpIGRvYwogCiAJIyBKYXZhCiAJY2QgJChDVVJESVIpL2xpYi9qYXZhICYmIFwKLQkJYW50CisJCS4vZ3JhZGxldyAtLW5vLWRhZW1vbiAtUHJlbGVhc2U9dHJ1ZSBqYXIKIAogCSMgQyMKIAkkKE1BS0UpIC1DICQoQ1VSRElSKS9saWIvY3NoYXJwCkBAIC04NSwzMyArOTEsMzIgQEAKIAlkaF90ZXN0cm9vdAogCXJtIC1mIGJ1aWxkLWFyY2gtc3RhbXAgYnVpbGQtaW5kZXAtc3RhbXAgY29uZmlndXJlLXN0YW1wCiAKKwljZCAkKENVUkRJUikvbGliL3B5ICYmIHB5dGhvbiBzZXR1cC5weSBjbGVhbiAtLWFsbAorCiAJIyBBZGQgaGVyZSBjb21tYW5kcyB0byBjbGVhbiB1cCBhZnRlciB0aGUgYnVpbGQgcHJvY2Vzcy4KIAktJChNQUtFKSBjbGVhbgogCisJJChDVVJESVIpL2NsZWFudXAuc2gKKwogCWRoX2NsZWFuCiAKIGluc3RhbGw6IGluc3RhbGwtaW5kZXAgaW5zdGFsbC1hcmNoCiBpbnN0YWxsLWluZGVwOgogCWRoX3Rlc3RkaXIKIAlkaF90ZXN0cm9vdAotCWRoX2NsZWFuIC1rIC1pCisJZGhfcHJlcCAtaQogCWRoX2luc3RhbGxkaXJzIC1pCiAKIAkjIEFkZCBoZXJlIGNvbW1hbmRzIHRvIGluc3RhbGwgdGhlIGluZGVwIHBhcnQgb2YgdGhlIHBhY2thZ2UgaW50bwogCSMgZGViaWFuLzxwYWNrYWdlPi1kb2MuCiAJI0lOU1RBTExET0MjCiAKLSAgICAgICAgIyBKYXZhCisJIyBKYXZhCiAJbWtkaXIgLXAgJChDVVJESVIpL2RlYmlhbi9saWJ0aHJpZnQtamF2YS91c3Ivc2hhcmUvamF2YS8gJiYgXAotCWNwICQoQ1VSRElSKS9saWIvamF2YS9idWlsZC9saWJ0aHJpZnQqLmphciBcCisJY3AgJChDVVJESVIpL2xpYi9qYXZhL2J1aWxkL2xpYnMvbGlidGhyaWZ0Ki5qYXIgXAogCQkkKENVUkRJUikvZGViaWFuL2xpYnRocmlmdC1qYXZhL3Vzci9zaGFyZS9qYXZhLwogCi0gICAgICAgICMgUnVieQotCW1rZGlyIC1wICQoQ1VSRElSKS9kZWJpYW4vcnVieS10aHJpZnQvdXNyL2xpYi9ydWJ5LzEuOCAmJiBcCi0JY3AgJChDVVJESVIpL2xpYi9yYi9saWIvdGhyaWZ0LnJiIFwKLQkJJChDVVJESVIpL2RlYmlhbi9ydWJ5LXRocmlmdC91c3IvbGliL3J1YnkvMS44Ci0JY3AgLXIgJChDVVJESVIpL2xpYi9yYi9saWIvdGhyaWZ0IFwKLQkJJChDVVJESVIpL2RlYmlhbi9ydWJ5LXRocmlmdC91c3IvbGliL3J1YnkvMS44CisJIyBSdWJ5CiAJbWtkaXIgLXAgJChDVVJESVIpL2RlYmlhbi9ydWJ5LXRocmlmdC91c3IvbGliL3J1YnkvMS45LjEgJiYgXAogCWNwICQoQ1VSRElSKS9saWIvcmIvbGliL3RocmlmdC5yYiBcCiAJCSQoQ1VSRElSKS9kZWJpYW4vcnVieS10aHJpZnQvdXNyL2xpYi9ydWJ5LzEuOS4xCkBAIC0xMjQsNyArMTI5LDExIEBACiAJCSQoQ1VSRElSKS9kZWJpYW4vbGlidGhyaWZ0LWNpbC91c3IvbGliL2NsaS90aHJpZnQvVGhyaWZ0LmRsbAogCiAJIyBQZXJsCi0JJChNQUtFKSAtQyAkKENVUkRJUikvbGliL3BlcmwgaW5zdGFsbCBERVNURElSPSQoQ1VSRElSKS9kZWJpYW4vbGlidGhyaWZ0LXBlcmwvdXNyCisJJChNQUtFKSAtQyAkKENVUkRJUikvbGliL3BlcmwgaW5zdGFsbCBERVNURElSPSQoQ1VSRElSKS9kZWJpYW4vbGlidGhyaWZ0LXBlcmwKKwlta2RpciAtcCAkKENVUkRJUikvZGViaWFuL2xpYnRocmlmdC1wZXJsL3Vzci9zaGFyZQorCW12ICQoQ1VSRElSKS9kZWJpYW4vbGlidGhyaWZ0LXBlcmwvdXNyL2xvY2FsL2xpYi9wZXJsNSAkKENVUkRJUikvZGViaWFuL2xpYnRocmlmdC1wZXJsL3Vzci9zaGFyZQorCXJtZGlyICQoQ1VSRElSKS9kZWJpYW4vbGlidGhyaWZ0LXBlcmwvdXNyL2xvY2FsL2xpYgorCXJtZGlyICQoQ1VSRElSKS9kZWJpYW4vbGlidGhyaWZ0LXBlcmwvdXNyL2xvY2FsCiAKIAlkaF9pbnN0YWxsIC1pCiAKQEAgLTE0NiwxNiArMTU1LDI3IEBACiAKIAkjIFB5dGhvbgogCWNkICQoQ1VSRElSKS9saWIvcHkgJiYgXAotCWZvciBweSBpbiAkKFBZVkVSUyk7IGRvIFwKLQkJJCRweSBzZXR1cC5weSBpbnN0YWxsIC0tbm8tY29tcGlsZSAtLXJvb3Q9JChDVVJESVIpL2RlYmlhbi9weXRob24tdGhyaWZ0OyBcCi0JCSQkcHktZGJnIHNldHVwLnB5IGluc3RhbGwgLS1uby1jb21waWxlIC0tcm9vdD0kKENVUkRJUikvZGViaWFuL3B5dGhvbi10aHJpZnQtZGJnOyBcCi0JZG9uZQorCXB5dGhvbjIgc2V0dXAucHkgaW5zdGFsbCAtLWluc3RhbGwtbGF5b3V0PWRlYiAtLW5vLWNvbXBpbGUgLS1yb290PSQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uLXRocmlmdCAmJiBcCisJcHl0aG9uMi1kYmcgc2V0dXAucHkgaW5zdGFsbCAtLWluc3RhbGwtbGF5b3V0PWRlYiAtLW5vLWNvbXBpbGUgLS1yb290PSQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uLXRocmlmdC1kYmcgJiYgXAorCXB5dGhvbjMgc2V0dXAucHkgaW5zdGFsbCAtLWluc3RhbGwtbGF5b3V0PWRlYiAtLW5vLWNvbXBpbGUgLS1yb290PSQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uMy10aHJpZnQgJiYgXAorCXB5dGhvbjMtZGJnIHNldHVwLnB5IGluc3RhbGwgLS1pbnN0YWxsLWxheW91dD1kZWIgLS1uby1jb21waWxlIC0tcm9vdD0kKENVUkRJUikvZGViaWFuL3B5dGhvbjMtdGhyaWZ0LWRiZwogCi0JZmluZCAkKENVUkRJUikvZGViaWFuL3B5dGhvbi10aHJpZnQtZGJnIC1uYW1lICIqLnB5YyIgLXByaW50MCB8IHhhcmdzIC0wIHJtIC1mCisJZmluZCAkKENVUkRJUikvZGViaWFuL3B5dGhvbi10aHJpZnQgLW5hbWUgIioucHlbY29dIiAtcHJpbnQwIHwgeGFyZ3MgLTAgcm0gLWYKKwlmaW5kICQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uLXRocmlmdCAtbmFtZSAiX19weWNhY2hlX18iIC1wcmludDAgfCB4YXJncyAtMCBybSAtZnIKKwlmaW5kICQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uLXRocmlmdC1kYmcgLW5hbWUgIl9fcHljYWNoZV9fIiAtcHJpbnQwIHwgeGFyZ3MgLTAgcm0gLWZyCisJZmluZCAkKENVUkRJUikvZGViaWFuL3B5dGhvbi10aHJpZnQtZGJnIC1uYW1lICIqLnB5W2NvXSIgLXByaW50MCB8IHhhcmdzIC0wIHJtIC1mCiAJZmluZCAkKENVUkRJUikvZGViaWFuL3B5dGhvbi10aHJpZnQtZGJnIC1uYW1lICIqLnB5IiAtcHJpbnQwIHwgeGFyZ3MgLTAgcm0gLWYKIAlmaW5kICQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uLXRocmlmdC1kYmcgLW5hbWUgIiouZWdnLWluZm8iIC1wcmludDAgfCB4YXJncyAtMCBybSAtcmYKIAlmaW5kICQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uLXRocmlmdC1kYmcgLWRlcHRoIC10eXBlIGQgLWVtcHR5IC1leGVjIHJtZGlyIHt9IFw7CiAKKwlmaW5kICQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uMy10aHJpZnQgLW5hbWUgIioucHlbY29dIiAtcHJpbnQwIHwgeGFyZ3MgLTAgcm0gLWYKKwlmaW5kICQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uMy10aHJpZnQgLW5hbWUgIl9fcHljYWNoZV9fIiAtcHJpbnQwIHwgeGFyZ3MgLTAgcm0gLWZyCisJZmluZCAkKENVUkRJUikvZGViaWFuL3B5dGhvbjMtdGhyaWZ0LWRiZyAtbmFtZSAiX19weWNhY2hlX18iIC1wcmludDAgfCB4YXJncyAtMCBybSAtZnIKKwlmaW5kICQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uMy10aHJpZnQtZGJnIC1uYW1lICIqLnB5W2NvXSIgLXByaW50MCB8IHhhcmdzIC0wIHJtIC1mCisJZmluZCAkKENVUkRJUikvZGViaWFuL3B5dGhvbjMtdGhyaWZ0LWRiZyAtbmFtZSAiKi5weSIgLXByaW50MCB8IHhhcmdzIC0wIHJtIC1mCisJZmluZCAkKENVUkRJUikvZGViaWFuL3B5dGhvbjMtdGhyaWZ0LWRiZyAtbmFtZSAiKi5lZ2ctaW5mbyIgLXByaW50MCB8IHhhcmdzIC0wIHJtIC1yZgorCWZpbmQgJChDVVJESVIpL2RlYmlhbi9weXRob24zLXRocmlmdC1kYmcgLWRlcHRoIC10eXBlIGQgLWVtcHR5IC1leGVjIHJtZGlyIHt9IFw7CisKIAkjIFBIUAogCW1rZGlyIC1wICQoQ1VSRElSKS9kZWJpYW4vcGhwNS10aHJpZnQKIAljZCAkKENVUkRJUikvbGliL3BocCAmJiBcCkBAIC0xNjQsOSArMTg0LDkgQEAKIAkjIEMrKyBhbmQgQyAoZ2xpYikKIAlta2RpciAtcCAkKENVUkRJUikvZGViaWFuL3RtcDsgXAogCWNkICQoQ1VSRElSKS9saWIvY3BwICYmIFwKLQkJbWFrZSBERVNURElSPSQoQ1VSRElSKS9kZWJpYW4vdG1wIGluc3RhbGwKKwkJJChNQUtFKSBERVNURElSPSQoQ1VSRElSKS9kZWJpYW4vdG1wIGluc3RhbGwKIAljZCAkKENVUkRJUikvbGliL2NfZ2xpYiAmJiBcCi0JCW1ha2UgREVTVERJUj0kKENVUkRJUikvZGViaWFuL3RtcCBpbnN0YWxsCisJCSQoTUFLRSkgREVTVERJUj0kKENVUkRJUikvZGViaWFuL3RtcCBpbnN0YWxsCiAKIAlkaF9pbnN0YWxsIC0tc291cmNlZGlyPWRlYmlhbi90bXAgLXMKIApAQCAtMTgyLDggKzIwMiwxMCBAQAogCWRoX2luc3RhbGxleGFtcGxlcwogCWRoX2luc3RhbGxtYW4KIAlkaF9saW5rCi0JZGhfc3RyaXAgLU5weXRob24tdGhyaWZ0LWRiZyAtTnRocmlmdC1jb21waWxlciAtTmxpYnRocmlmdDAgLS1kYmc9cHl0aG9uLXRocmlmdC1kYmcKLQlkaF9zdHJpcCAtTnB5dGhvbi10aHJpZnQtZGJnCisJZGhfc3RyaXAgLXBsaWJ0aHJpZnQwIC0tZGJnLXBhY2thZ2U9bGlidGhyaWZ0MC1kYmcKKwlkaF9zdHJpcCAtcHB5dGhvbi10aHJpZnQgLS1kYmctcGFja2FnZT1weXRob24tdGhyaWZ0LWRiZworCWRoX3N0cmlwIC1wcHl0aG9uMy10aHJpZnQgLS1kYmctcGFja2FnZT1weXRob24zLXRocmlmdC1kYmcKKwlkaF9zdHJpcCAtcHRocmlmdC1jb21waWxlcgogCWRoX2NvbXByZXNzCiAJZGhfZml4cGVybXMKIAlkaF9tYWtlc2hsaWJzCkBAIC0xOTksNyArMjIxLDcgQEAKIAogIyBCdWlsZCBhcmNoaXRlY3R1cmUgZGVwZW5kZW50IHBhY2thZ2VzIHVzaW5nIHRoZSBjb21tb24gdGFyZ2V0LgogYmluYXJ5LWFyY2g6IGJ1aWxkLWFyY2ggaW5zdGFsbC1hcmNoCi0JZWNobyAicGhwOkRlcGVuZHM9cGhwYXBpLSQocGhwLWNvbmZpZzUgLS1waHBhcGkpIiA+IGRlYmlhbi9zdWJzdHZhcnMKKwllY2hvICJwaHA6RGVwZW5kcz1waHBhcGktJChzaGVsbCBwaHAtY29uZmlnNSAtLXBocGFwaSkiID4gJChDVVJESVIpL2RlYmlhbi9zdWJzdHZhcnMKIAkkKE1BS0UpIC1mIGRlYmlhbi9ydWxlcyBESF9PUFRJT05TPS1zIGJpbmFyeS1jb21tb24KIAogYmluYXJ5OiBiaW5hcnktYXJjaCBiaW5hcnktaW5kZXAKZGlmZiAtLWdpdCBhL2RlYmlhbi9zdWJzdHZhcnMgYi9kZWJpYW4vc3Vic3R2YXJzCmluZGV4IGJhZGY1NzIuLjk4NDFmMmQgMTAwNjQ0Ci0tLSBhL2RlYmlhbi9zdWJzdHZhcnMKKysrIGIvZGViaWFuL3N1YnN0dmFycwpAQCAtMSArMSBAQAotcGhwOkRlcGVuZHM9cGhwYXBpLQorcGhwOkRlcGVuZHM9cGhwYXBpLTIwMTIxMjEyCmRpZmYgLS1naXQgYS9kb2FwLnJkZiBiL2RvYXAucmRmCmluZGV4IDVmZjk5NDUuLmNiNzZmYWMgMTAwNzU1Ci0tLSBhL2RvYXAucmRmCisrKyBiL2RvYXAucmRmCkBAIC0zOCwxMCArMzgsMTIgQEAKICAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+QysrPC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KICAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+Q29jb2E8L3Byb2dyYW1taW5nLWxhbmd1YWdlPgogICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5EPC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KKyAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+RGFydDwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+CiAgICAgPHByb2dyYW1taW5nLWxhbmd1YWdlPkRlbHBoaTwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+CiAgICAgPHByb2dyYW1taW5nLWxhbmd1YWdlPkVybGFuZzwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+CiAgICAgPHByb2dyYW1taW5nLWxhbmd1YWdlPkdvPC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KICAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+SGFza2VsbDwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+CisgICAgPHByb2dyYW1taW5nLWxhbmd1YWdlPkhheGU8L3Byb2dyYW1taW5nLWxhbmd1YWdlPgogICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5KYXZhPC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KICAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+SmF2YVNjcmlwdDwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+CiAgICAgPHByb2dyYW1taW5nLWxhbmd1YWdlPm5vZGUuanM8L3Byb2dyYW1taW5nLWxhbmd1YWdlPgpAQCAtNDksNiArNTEsNyBAQAogICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5QZXJsPC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KICAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+UEhQPC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KICAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+UHl0aG9uPC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KKyAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+UnVzdDwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+CiAgICAgPHByb2dyYW1taW5nLWxhbmd1YWdlPlNtYWxsVGFsazwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+CiAgICAgPGNhdGVnb3J5IHJkZjpyZXNvdXJjZT0iaHR0cDovL3Byb2plY3RzLmFwYWNoZS5vcmcvY2F0ZWdvcnkvaHR0cCIgLz4KICAgICA8Y2F0ZWdvcnkgcmRmOnJlc291cmNlPSJodHRwOi8vcHJvamVjdHMuYXBhY2hlLm9yZy9jYXRlZ29yeS9saWJyYXJ5IiAvPgpAQCAtNTcsMTEgKzYwLDMxIEBACiAgICAgPHJlbGVhc2UgcmRmOnBhcnNlVHlwZT0iQ29sbGVjdGlvbiI+CiAgICAgICA8VmVyc2lvbj4KICAgICAgICAgPG5hbWU+QXBhY2hlIFRocmlmdDwvbmFtZT4KKyAgICAgICAgPGNyZWF0ZWQ+MjAxOC0xMi0yODwvY3JlYXRlZD4KKyAgICAgICAgPHJldmlzaW9uPjAuMTIuMDwvcmV2aXNpb24+CisgICAgICA8L1ZlcnNpb24+CisgICAgICA8VmVyc2lvbj4KKyAgICAgICAgPG5hbWU+QXBhY2hlIFRocmlmdDwvbmFtZT4KKyAgICAgICAgPGNyZWF0ZWQ+MjAxNy0xMS0zMDwvY3JlYXRlZD4KKyAgICAgICAgPHJldmlzaW9uPjAuMTEuMDwvcmV2aXNpb24+CisgICAgICA8L1ZlcnNpb24+CisgICAgICA8VmVyc2lvbj4KKyAgICAgICAgPG5hbWU+QXBhY2hlIFRocmlmdDwvbmFtZT4KKyAgICAgICAgPGNyZWF0ZWQ+MjAxNy0wMy0wMTwvY3JlYXRlZD4KKyAgICAgICAgPHJldmlzaW9uPjAuMTAuMDwvcmV2aXNpb24+CisgICAgICA8L1ZlcnNpb24+CisgICAgICA8VmVyc2lvbj4KKyAgICAgICAgPG5hbWU+QXBhY2hlIFRocmlmdDwvbmFtZT4KICAgICAgICAgPGNyZWF0ZWQ+MjAxNS0wOS0yNTwvY3JlYXRlZD4KICAgICAgICAgPHJldmlzaW9uPjAuOS4zPC9yZXZpc2lvbj4KICAgICAgIDwvVmVyc2lvbj4KICAgICAgIDxWZXJzaW9uPgogICAgICAgICA8bmFtZT5BcGFjaGUgVGhyaWZ0PC9uYW1lPgorICAgICAgICA8Y3JlYXRlZD4yMDE0LTExLTA1PC9jcmVhdGVkPgorICAgICAgICA8cmV2aXNpb24+MC45LjI8L3JldmlzaW9uPgorICAgICAgPC9WZXJzaW9uPgorICAgICAgPFZlcnNpb24+CisgICAgICAgIDxuYW1lPkFwYWNoZSBUaHJpZnQ8L25hbWU+CiAgICAgICAgIDxjcmVhdGVkPjIwMTMtMDgtMjI8L2NyZWF0ZWQ+CiAgICAgICAgIDxyZXZpc2lvbj4wLjkuMTwvcmV2aXNpb24+CiAgICAgICA8L1ZlcnNpb24+CkBAIC0xMTMsOCArMTM2LDggQEAKICAgICA8L3JlbGVhc2U+CiAgICAgPHJlcG9zaXRvcnk+CiAgICAgICA8R2l0UmVwb3NpdG9yeT4KLSAgICAgICAgPGxvY2F0aW9uIHJkZjpyZXNvdXJjZT0iaHR0cHM6Ly9naXQtd2lwLXVzLmFwYWNoZS5vcmcvcmVwb3MvYXNmL3RocmlmdC5naXQiLz4KLSAgICAgICAgPGJyb3dzZSByZGY6cmVzb3VyY2U9Imh0dHBzOi8vZ2l0LXdpcC11cy5hcGFjaGUub3JnL3JlcG9zL2FzZj9wPXRocmlmdC5naXQiLz4KKyAgICAgICAgPGxvY2F0aW9uIHJkZjpyZXNvdXJjZT0iaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQuZ2l0Ii8+CisgICAgICAgIDxicm93c2UgcmRmOnJlc291cmNlPSJodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdCIvPgogICAgICAgPC9HaXRSZXBvc2l0b3J5PgogICAgIDwvcmVwb3NpdG9yeT4KICAgICA8bWFpbnRhaW5lcj4KZGlmZiAtLWdpdCBhL2RvYy9jb21taXR0ZXJzLm1kIGIvZG9jL2NvbW1pdHRlcnMubWQKaW5kZXggYjAyZWRiZS4uZGNkZDdiNyAxMDA2NDQKLS0tIGEvZG9jL2NvbW1pdHRlcnMubWQKKysrIGIvZG9jL2NvbW1pdHRlcnMubWQKQEAgLTQsNyArNCw3IEBACiAKIDEuIENoZWNrIG91dCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhlIHNvdXJjZSBjb2RlCiAKLSAgKiBnaXQgY2xvbmUgaHR0cHM6Ly9naXQtd2lwLXVzLmFwYWNoZS5vcmcvcmVwb3MvYXNmL3RocmlmdC5naXQgdGhyaWZ0CisgICogZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0LmdpdCB0aHJpZnQKIAogMS4gQXBwbHkgdGhlIHBhdGNoCiAKZGlmZiAtLWdpdCBhL2RvYy9pbWFnZXMvY2dybi5wbmcgYi9kb2MvaW1hZ2VzL2Nncm4ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMDk2NGUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaW1hZ2VzL2Nncm4ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9pbWFnZXMvY3JlZC5wbmcgYi9kb2MvaW1hZ2VzL2NyZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4NmE1ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaW1hZ2VzL2NyZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9pbWFnZXMvY3JlZGZ1bGwucG5nIGIvZG9jL2ltYWdlcy9jcmVkZnVsbC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY2NjQwNAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9pbWFnZXMvY3JlZGZ1bGwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9pbWFnZXMvY3llbC5wbmcgYi9kb2MvaW1hZ2VzL2N5ZWwucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMWRmYzcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaW1hZ2VzL2N5ZWwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9pbWFnZXMvdGhyaWZ0LWxheWVycy5wbmcgYi9kb2MvaW1hZ2VzL3RocmlmdC1sYXllcnMucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYWNjZjQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaW1hZ2VzL3RocmlmdC1sYXllcnMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9pbnN0YWxsL1JFQURNRS5tZCBiL2RvYy9pbnN0YWxsL1JFQURNRS5tZAppbmRleCBlMzdmNGZmLi4yMjIzMWNkIDEwMDY0NAotLS0gYS9kb2MvaW5zdGFsbC9SRUFETUUubWQKKysrIGIvZG9jL2luc3RhbGwvUkVBRE1FLm1kCkBAIC0yNyw3ICsyNyw3IEBACiAgICAgKiBsaWJldmVudCAob3B0aW9uYWwsIHRvIGJ1aWxkIHRoZSBub25ibG9ja2luZyBzZXJ2ZXIpCiAgICAgKiB6bGliIChvcHRpb25hbCkKICogSmF2YQotICAgICogSmF2YSAxLjcKKyAgICAqIEphdmEgMS44CiAgICAgKiBBcGFjaGUgQW50CiAqIEMjOiBNb25vIDEuMi40IChhbmQgcGtnLWNvbmZpZyB0byBkZXRlY3QgaXQpIG9yIFZpc3VhbCBTdHVkaW8gMjAwNSsKICogUHl0aG9uIDIuNiAoaW5jbHVkaW5nIGhlYWRlciBmaWxlcyBmb3IgZXh0ZW5zaW9uIG1vZHVsZXMpCmRpZmYgLS1naXQgYS9kb2MvaW5zdGFsbC9jZW50b3MubWQgYi9kb2MvaW5zdGFsbC9jZW50b3MubWQKaW5kZXggNjA5ZTExOC4uMDQ5MzJjMiAxMDA2NDQKLS0tIGEvZG9jL2luc3RhbGwvY2VudG9zLm1kCisrKyBiL2RvYy9pbnN0YWxsL2NlbnRvcy5tZApAQCAtNjQsNyArNjQsNyBAQAogCiAjIyBCdWlsZCBhbmQgSW5zdGFsbCB0aGUgQXBhY2hlIFRocmlmdCBJREwgQ29tcGlsZXIKIAotCWdpdCBjbG9uZSBodHRwczovL2dpdC13aXAtdXMuYXBhY2hlLm9yZy9yZXBvcy9hc2YvdGhyaWZ0LmdpdAorCWdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC5naXQKIAljZCB0aHJpZnQKIAkuL2Jvb3RzdHJhcC5zaAogCS4vY29uZmlndXJlIC0td2l0aC1sdWE9bm8KZGlmZiAtLWdpdCBhL2RvYy9pbnN0YWxsL2RlYmlhbi5tZCBiL2RvYy9pbnN0YWxsL2RlYmlhbi5tZAppbmRleCBhNDM0NGM3Li44NGY2OTZlIDEwMDY0NAotLS0gYS9kb2MvaW5zdGFsbC9kZWJpYW4ubWQKKysrIGIvZG9jL2luc3RhbGwvZGViaWFuLm1kCkBAIC0xLDIxICsxLDI3IEBACi0jIyBEZWJpYW4gb3IgVWJ1bnR1IHNldHVwCi1UaGUgZm9sbG93aW5nIGNvbW1hbmQgaW5zdGFsbCBhbGwgdGhlIHJlcXVpcmVkIHRvb2xzIGFuZCBsaWJyYXJpZXMgdG8gYnVpbGQgYW5kIGluc3RhbGwgdGhlIEFwYWNoZSBUaHJpZnQgY29tcGlsZXIgb24gYSBEZWJpYW4vVWJ1bnR1IExpbnV4IGJhc2VkIHN5c3RlbS4KKyMjIERlYmlhbi9VYnVudHUgaW5zdGFsbAorVGhlIGZvbGxvd2luZyBjb21tYW5kIHdpbGwgaW5zdGFsbCB0b29scyBhbmQgbGlicmFyaWVzIHJlcXVpcmVkIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIHRoZSBBcGFjaGUgVGhyaWZ0IGNvbXBpbGVyIGFuZCBDKysgbGlicmFyaWVzIG9uIGEgRGViaWFuL1VidW50dSBMaW51eCBiYXNlZCBzeXN0ZW0uCiAKLQlzdWRvIGFwdC1nZXQgaW5zdGFsbCBsaWJib29zdC1kZXYgbGliYm9vc3QtdGVzdC1kZXYgbGliYm9vc3QtcHJvZ3JhbS1vcHRpb25zLWRldiBsaWJib29zdC1zeXN0ZW0tZGV2IGxpYmJvb3N0LWZpbGVzeXN0ZW0tZGV2IGxpYmV2ZW50LWRldiBhdXRvbWFrZSBsaWJ0b29sIGZsZXggYmlzb24gcGtnLWNvbmZpZyBnKysgbGlic3NsLWRldiBhbnQKKwlzdWRvIGFwdC1nZXQgaW5zdGFsbCBhdXRvbWFrZSBiaXNvbiBmbGV4IGcrKyBnaXQgbGliYm9vc3QtYWxsLWRldiBsaWJldmVudC1kZXYgbGlic3NsLWRldiBsaWJ0b29sIG1ha2UgcGtnLWNvbmZpZwogCi1UaGVuIGluc3RhbGwgdGhlIEphdmEgSkRLIG9mIHlvdXIgY2hvaWNlLiBUeXBlICoqamF2YWMqKiB0byBzZWUgYSBsaXN0IG9mIGF2YWlsYWJsZSBwYWNrYWdlcywgcGljayB0aGUgb25lIHlvdSBwcmVmZXIgYW5kICoqYXB0LWdldCBpbnN0YWxsKiogaXQuCitEZWJpYW4gNy9VYnVudHUgMTIgdXNlcnMgbmVlZCB0byBtYW51YWxseSBpbnN0YWxsIGEgbW9yZSByZWNlbnQgdmVyc2lvbiBvZiBhdXRvbWFrZSBhbmQgKGZvciBDKysgbGlicmFyeSBhbmQgdGVzdCBzdXBwb3J0KSBib29zdDoKIAotRGViaWFuIHN0YWJsZSB1c2VycyBuZWVkIHRvIG1hbnVhbGx5IGluc3RhbGwgYSBtb3JlIHJlY2VudCBhdXRvbWFrZSB2ZXJzaW9uOgorICAgIHdnZXQgaHR0cDovL2Z0cC5kZWJpYW4ub3JnL2RlYmlhbi9wb29sL21haW4vYS9hdXRvbWFrZS0xLjE1L2F1dG9tYWtlXzEuMTUtM19hbGwuZGViCisgICAgc3VkbyBkcGtnIC1pIGF1dG9tYWtlXzEuMTUtM19hbGwuZGViCiAKLSAgICB3Z2V0IGh0dHA6Ly9mdHAuZGViaWFuLm9yZy9kZWJpYW4vcG9vbC9tYWluL2EvYXV0b21ha2UtMS4xNC9hdXRvbWFrZV8xLjE0LjEtM19hbGwuZGViCi0gICAgc3VkbyBkcGtnIC1pIGF1dG9tYWtlXzEuMTQuMS0zX2FsbC5kZWIKKyAgICB3Z2V0IGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvYm9vc3QvZmlsZXMvYm9vc3QvMS42MC4wL2Jvb3N0XzFfNjBfMC50YXIuZ3ogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyIHh2ZiBib29zdF8xXzYwXzAudGFyLmd6CisgICAgY2QgYm9vc3RfMV82MF8wCisgICAgLi9ib290c3RyYXAuc2gKKyAgICBzdWRvIC4vYjIgaW5zdGFsbAogCiAjIyBPcHRpb25hbCBwYWNrYWdlcwogCi1Tb21lIG90aGVyIHBhY2thZ2VzIGRlcGVuZCBvbiB3aGF0IGxhbmd1YWdlcyB5b3Ugd2FudCBUaHJpZnQgdG8gc3VwcG9ydC4KK0lmIHlvdSB3b3VsZCBsaWtlIHRvIGJ1aWxkIEFwYWNoZSBUaHJpZnQgbGlicmFyaWVzIGZvciBvdGhlciBwcm9ncmFtbWluZyBsYW5ndWFnZXMgeW91IG1heSBuZWVkIHRvIGluc3RhbGwgYWRkaXRpb25hbCBwYWNrYWdlcy4gVGhlIGZvbGxvd2luZyBsYW5ndWFnZXMgcmVxdWlyZSB0aGUgc3BlY2lmaWVkIGFkZGl0aW9uYWwgcGFja2FnZXM6CiAKLSAqIFJ1YnkgCi0JKiBydWJ5LWZ1bGwgcnVieS1kZXYgcnVieS1yc3BlYyByYWtlIHJ1YnlnZW1zIGxpYmRhZW1vbnMtcnVieSBsaWJnZW1wbHVnaW4tcnVieSBtb25ncmVsCisgKiBKYXZhCisJKiBwYWNrYWdlczogYW50ICAKKwkqIFlvdSB3aWxsIGFsc28gbmVlZCBKYXZhIEpESyB2MS44IG9yIGhpZ2hlci4gVHlwZSAqKmphdmFjKiogdG8gc2VlIGEgbGlzdCBvZiBhdmFpbGFibGUgcGFja2FnZXMsIHBpY2sgdGhlIG9uZSB5b3UgcHJlZmVyIGFuZCAqKmFwdC1nZXQgaW5zdGFsbCoqIGl0IChlLmcuIGRlZmF1bHQtamRrKS4KKyAqIFJ1YnkKKwkqIHJ1YnktZnVsbCBydWJ5LWRldiBydWJ5LXJzcGVjIHJha2UgcnVieWdlbXMgYnVuZGxlcgogICogUHl0aG9uCiAJKiBweXRob24tYWxsIHB5dGhvbi1hbGwtZGV2IHB5dGhvbi1hbGwtZGJnCiAgKiBQZXJsCkBAIC0yNSwxNCArMzEsMjkgQEAKICAqIENfZ2xpYgogCSogbGliZ2xpYjIuMC1kZXYKICAqIEVybGFuZwotCSogZXJsYW5nLWJhc2UgZXJsYW5nLWV1bml0IGVybGFuZy1kZXYKKwkqIGVybGFuZy1iYXNlIGVybGFuZy1ldW5pdCBlcmxhbmctZGV2IHJlYmFyCiAgKiBDc2hhcnAKIAkqIG1vbm8tZ21jcyBtb25vLWRldmVsIGxpYm1vbm8tc3lzdGVtLXdlYjIuMC1jaWwgbnVuaXQgbnVuaXQtY29uc29sZQogICogSGFza2VsbAotCSogZ2hjNiBjYWJhbC1pbnN0YWxsIGxpYmdoYzYtYmluYXJ5LWRldiBsaWJnaGM2LW5ldHdvcmstZGV2IGxpYmdoYzYtaHR0cC1kZXYKKwkqIGdoYyBjYWJhbC1pbnN0YWxsIGxpYmdoYy1iaW5hcnktZGV2IGxpYmdoYy1uZXR3b3JrLWRldiBsaWJnaGMtaHR0cC1kZXYKICAqIFRocmlmdCBDb21waWxlciBmb3IgV2luZG93cwotCSogbWluZ3czMiBtaW5ndzMyLWJpbnV0aWxzIG1pbmd3MzItcnVudGltZSBuc2lzCi0KKwkqIG1pbmd3LXc2NCBtaW5ndy13NjQteDg2LTY0LWRldiBuc2lzCisgKiBSdXN0CisJKiBydXN0YyBjYXJnbworICogSGF4ZQorCSogaGF4ZQorICogTHVhCisgICAgKiBsdWE1LjMgbGlibHVhNS4zLWRldgorICogTm9kZUpzCisgICAgKiBub2RlanMgbnBtCisgKiBkb3RuZXRjb3JlCisgICAgKiBodHRwczovL3d3dy5taWNyb3NvZnQuY29tL25ldC9sZWFybi9nZXQtc3RhcnRlZC9saW51eHVidW50dQorICogZC1sYW5nCisgICAgKiBjdXJsIC1mc1MgaHR0cHM6Ly9kbGFuZy5vcmcvaW5zdGFsbC5zaCB8IGJhc2ggLXMgZG1kCisgKiBkYXJ0ICYgcHViCisgICAgKiBodHRwczovL3d3dy5kYXJ0bGFuZy5vcmcvaW5zdGFsbC9saW51eAorICAgICogaHR0cHM6Ly93d3cuZGFydGxhbmcub3JnL3Rvb2xzL3B1Yi9pbnN0YWxsaW5nCisJCiAKICMjIEFkZGl0aW9uYWwgcmVhZGluZwogCmRpZmYgLS1naXQgYS9kb2MvaW5zdGFsbC93aW5kb3dzLm1kIGIvZG9jL2luc3RhbGwvd2luZG93cy5tZAppbmRleCA3YjA5ODQwLi44NjE4OTM0IDEwMDY0NAotLS0gYS9kb2MvaW5zdGFsbC93aW5kb3dzLm1kCisrKyBiL2RvYy9pbnN0YWxsL3dpbmRvd3MubWQKQEAgLTE0NSw3ICsxNDUsNyBAQAogCiBNYWtlIHN1cmUgeW91IGhhdmUgamF2YSBpbiB5b3VyICRQQVRIIHZhcmlhYmxlLCBpZiBub3QgZG8oYWRqdXN0IHBhdGggaWYgbmVjZXNzYXJ5KToKIAotCWV4cG9ydCBQQVRIPSRQQVRIOiIvY3lnZHJpdmUvYy9wcm9ncmFtIGZpbGVzL2phdmEvanJlMS42LjBfMDUvYmluIgorCWV4cG9ydCBQQVRIPSRQQVRIOiIvY3lnZHJpdmUvYy9wcm9ncmFtIGZpbGVzL2phdmEvanJlMS44LjBfMTkxL2JpbiIKIAogUnVuIGNvbmZpZ3VyZSAtIHVzaW5nIENYWEZMQUdTIHRvIHdvcmsgYXJvdW5kIGFuIGlzc3VlIHdpdGggYW4gb2xkIHB0aHJlYWRzIGRlZmluZSAodW50ZXN0ZWQgb24gTWluR1cgLSB3b3JrcyBvbiBDeWd3aW4pOgogCmRpZmYgLS1naXQgYS9kb2Mvc3BlY3MvSGVhZGVyRm9ybWF0Lm1kIGIvZG9jL3NwZWNzL0hlYWRlckZvcm1hdC5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmVjN2FlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NwZWNzL0hlYWRlckZvcm1hdC5tZApAQCAtMCwwICsxLDgyIEBACis8bGluayBocmVmPSJodHRwOi8va2V2aW5idXJrZS5iaXRidWNrZXQub3JnL21hcmtkb3duY3NzL21hcmtkb3duLmNzcyIgcmVsPSJzdHlsZXNoZWV0Ij48L2xpbms+CisKK0hlYWRlciBmb3JtYXQgZm9yIHRoZSBUSGVhZGVyLmgKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgMCAxIDIgMyA0IDUgNiA3IDggOSBhIGIgYyBkIGUgZiAwIDEgMiAzIDQgNSA2IDcgOCA5IGEgYiBjIGQgZSBmCisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCAwfCAgICAgICAgICAgICAgICAgICAgICAgICAgTEVOR1RIICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCAwfCAgICAgICBIRUFERVIgTUFHSUMgICAgICAgICAgfCAgICAgICAgICAgIEZMQUdTICAgICAgICAgICAgICB8CisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBTRVFVRU5DRSBOVU1CRVIgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCAwfCAgICAgSGVhZGVyIFNpemUoLzMyKSAgICAgICAgfCAuLi4KKyAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAgICAgICBIZWFkZXIgaXMgb2YgdmFyaWFibGUgc2l6ZToKKyAgICAgICAgICAgICAgICAgICAgICAgKGFuZCBzdGFydHMgYXQgb2Zmc2V0IDE0KQorCisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCAgICAgICAgIFBST1RPQ09MIElEICAodmFyaW50KSAgfCAgIE5VTSBUUkFOU0ZPUk1TICh2YXJpbnQpICAgICB8CisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCAgICAgIFRSQU5TRk9STSAwIElEICh2YXJpbnQpICAgfCAgICAgICAgVFJBTlNGT1JNIDAgREFUQSAuLi4KKyAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICB8ICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgIHwKKyAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICB8ICAgICAgICBJTkZPIDAgSUQgKHZhcmludCkgICAgICB8ICAgICAgIElORk8gMCAgREFUQSAuLi4KKyAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICB8ICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgIHwKKyAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFZTE9BRCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKworVGhlIGBMRU5HVEhgIGZpZWxkIGlzIDMyIGJpdHMsIGFuZCBjb3VudHMgdGhlIHJlbWFpbmluZyBieXRlcyBpbiB0aGUKK3BhY2tldCwgTk9UIGluY2x1ZGluZyB0aGUgbGVuZ3RoIGZpZWxkLiAgVGhlIGhlYWRlciBzaXplIGZpZWxkIGlzIDE2CitiaXRzLCBhbmQgZGVmaW5lcyB0aGUgc2l6ZSBvZiB0aGUgaGVhZGVyIHJlbWFpbmluZyBOT1QgaW5jbHVkaW5nIHRoZQorYEhFQURFUiBNQUdJQ2AsIGBGTEFHU2AsIGBTRVFVRU5DRSBOVU1CRVJgIGFuZCBoZWFkZXIgc2l6ZSBmaWVsZHMuICBUaGUKK0hlYWRlciBzaXplIGZpZWxkIGlzIGluIGJ5dGVzLzQuCisKK1RoZSB0cmFuc2Zvcm0gSUQncyBhcmUgdmFyaW50cy4gIFRoZSBkYXRhIGZvciBlYWNoIHRyYW5zZm9ybSBpcworZGVmaW5lZCBieSB0aGUgdHJhbnNmb3JtIElEIGluIHRoZSBjb2RlIC0gbm8gc2l6ZSBpcyBnaXZlbiBpbiB0aGUKK2hlYWRlci4gIElmIGEgdHJhbnNmb3JtIElEIGlzIHNwZWNpZmllZCBmcm9tIGEgY2xpZW50IGFuZCB0aGUgc2VydmVyCitkb2Vzbid0IGtub3cgYWJvdXQgdGhlIHRyYW5zZm9ybSBJRCwgYW4gZXJyb3IgTVVTVCBiZSByZXR1cm5lZCBhcyB3ZQorZG9uJ3Qga25vdyBob3cgdG8gdHJhbnNmb3JtIHRoZSBkYXRhLgorCitDb252ZXJzZWx5LCBkYXRhIGluIHRoZSBpbmZvIGhlYWRlcnMgaXMgaWdub3JhYmxlLiAgVGhpcyBzaG91bGQgb25seQorYmUgdGhpbmdzIGxpa2UgdGltZXN0YW1wcywgZGVidWdpbmcgdHJhY2luZywgZXRjLiAgVXNpbmcgdGhlIGhlYWRlcgorc2l6ZSB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gc2tpcCB0aGlzIGRhdGEgYW5kIHJlYWQgdGhlIHBheWxvYWQgc2FmZWx5CitpZiB5b3UgZG9uJ3Qga25vdyB0aGUgaW5mbyBJRC4KKworSW5mbydzIHNob3VsZCBiZSBvbGRlc3Qgc3VwcG9ydGVkIHRvIG5ld2VzdCBzdXBwb3J0ZWQgb3JkZXIsIHNvIHRoYXQKK2lmIHdlIHJlYWQgYW4gaW5mbyBJRCB3ZSBkb24ndCBzdXBwb3J0LCBub25lIG9mIHRoZSByZW1haW5pbmcgaW5mbworSUQncyB3aWxsIGJlIHN1cHBvcnRlZCBlaXRoZXIsIGFuZCB3ZSBjYW4gc2FmZWx5IHNraXAgdG8gdGhlIHBheWxvYWQuCisKK0luZm8gSUQncyBhbmQgdHJhbnNmb3JtIElEJ3Mgc2hvdWxkIHNoYXJlIHRoZSBzYW1lIElEIHNwYWNlLgorCisjIyMgUEFERElORzoKKworSGVhZGVyIHdpbGwgYmUgcGFkZGVkIG91dCB0byBuZXh0IDQtYnl0ZSBib3VuZGFyeSB3aXRoIGAweDAwYC4KKworTWF4IGZyYW1lIHNpemUgaXMgYDB4M0ZGRkZGRkZgLCB3aGljaCBpcyBzbGlnaHRseSBsZXNzIHRoYW4gYEhUVFBfTUFHSUNgLgorVGhpcyBhbGxvd3MgdXMgdG8gZGlzdGluZ3VzaCBiZXR3ZWVuIGRpZmZlcmVudCAob2xkZXIpIHRyYW5zcG9ydHMuCisKKyMjIyBUcmFuc2Zvcm0gSURzOgorCisgICAgWkxJQl9UUkFOU0ZPUk0gMHgwMSAtIE5vIGRhdGEgZm9yIHRoaXMuICBVc2UgemxpYiB0byAoZGUpY29tcHJlc3MgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuCisKKyAgICBITUFDX1RSQU5TRk9STSAweDAyIC0gVmFyaWFibGUgYW1vdW50IG9mIG1hYyBkYXRhLiAgT25lIGJ5dGUgdG8gc3BlY2lmeQorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLiBNYWMgZGF0YSBpcyBhcHBlbmRlZCBhdCB0aGUgZW5kIG9mIHRoZSBwYWNrZXQuCisgICAgU05BUFBZX1RSQU5TRk9STSAgMHgwMyAgLSBObyBkYXRhIGZvciB0aGlzLiAgVXNlIHNuYXBweSB0byAoZGUpY29tcHJlc3MgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuCisKKworIyMjSW5mbyBJRHM6CisKKyAgICBJTkZPX0tFWVZBTFVFIDB4MDEgLSB2YXJpbnQzMiBudW1iZXIgb2YgaGVhZGVycy4KKyAgICAgICAgICAgICAgICAgICAgICAgLSBrZXkvdmFsdWUgcGFpcnMgb2YgdmFyc3RyaW5ncyAodmFyaW50MTYgbGVuZ3RoIHBsdXMKKyAgICAgICAgICAgICAgICAgICAgICAgICBuby10cmFpbGluZy1udWxsIHN0cmluZykuCisKZGlmZiAtLWdpdCBhL2RvYy9zcGVjcy9pZGwubWQgYi9kb2Mvc3BlY3MvaWRsLm1kCmluZGV4IDZkYTQ2OTYuLmJmMjJmNTQgMTAwNjQ0Ci0tLSBhL2RvYy9zcGVjcy9pZGwubWQKKysrIGIvZG9jL3NwZWNzL2lkbC5tZApAQCAtOTgsNyArOTgsNyBAQAogCiAjIyMgVW5pb24KIAotVW5pb25zIGFyZSBzaW1pbGFyIHRvIHN0cnVjdHMsIGV4Y2VwdCB0aGF0IHRoZXkgcHJvdmlkZSBhIG1lYW5zIHRvIHRyYW5zcG9ydCBleGFjdGx5IG9uZSBmaWVsZCBvZiBhIHBvc3NpYmxlIHNldCBvZiBmaWVsZHMsIGp1c3QgbGlrZSB1bmlvbiB7fSBpbiBDKysuIENvbnNlcXVlbnRseSwgdW5pb24gbWVtYmVycyBjYW5ub3QgYmUgcmVxdWlyZWQgZmllbGRzLgorVW5pb25zIGFyZSBzaW1pbGFyIHRvIHN0cnVjdHMsIGV4Y2VwdCB0aGF0IHRoZXkgcHJvdmlkZSBhIG1lYW5zIHRvIHRyYW5zcG9ydCBleGFjdGx5IG9uZSBmaWVsZCBvZiBhIHBvc3NpYmxlIHNldCBvZiBmaWVsZHMsIGp1c3QgbGlrZSB1bmlvbiB7fSBpbiBDKysuIENvbnNlcXVlbnRseSwgdW5pb24gbWVtYmVycyBhcmUgaW1wbGljaXRseSBjb25zaWRlcmVkIG9wdGlvbmFsIChzZWUgcmVxdWlyZWRuZXNzKS4KIAogICAgIFsxM10gVW5pb24gICAgICAgICAgOjo9ICAndW5pb24nIElkZW50aWZpZXIgJ3hzZF9hbGwnPyAneycgRmllbGQqICd9JwogCkBAIC0xMjYsNyArMTI2LDQzIEBACiAKICMjIyBGaWVsZCBSZXF1aXJlZG5lc3MKIAotICAgIFsxOF0gRmllbGRSZXEgICAgICAgIDo6PSAgJ3JlcXVpcmVkJyB8ICdvcHRpb25hbCcKK1RoZXJlIGFyZSB0d28gZXhwbGljaXQgcmVxdWlyZWRuZXNzIHZhbHVlcywgYW5kIGEgdGhpcmQgb25lIHRoYXQgaXMgYXBwbGllZCBpbXBsaWNpdHkgaWYgbmVpdGhlciAgKnJlcXVpcmVkKiBub3IgKm9wdGlvbmFsKiBhcmUgZ2l2ZW46ICpkZWZhdWx0KiByZXF1aXJlZG5lc3MuCisKKyAgICBbMThdIEZpZWxkUmVxICAgICAgICA6Oj0gICdyZXF1aXJlZCcgfCAnb3B0aW9uYWwnIAorCitUaGUgZ2VuZXJhbCBydWxlcyBmb3IgcmVxdWlyZWRuZXNzIGFyZSBhcyBmb2xsb3dzOgorCisjIyMjIHJlcXVpcmVkCisKKy0gV3JpdGU6IFJlcXVpcmVkIGZpZWxkcyBhcmUgYWx3YXlzIHdyaXR0ZW4gYW5kIGFyZSBleHBlY3RlZCB0byBiZSBzZXQuCistIFJlYWQ6IFJlcXVpcmVkIGZpZWxkcyBhcmUgYWx3YXlzIHJlYWQgYW5kIGFyZSBleHBlY3RlZCB0byBiZSBjb250YWluZWQgaW4gdGhlIGlucHV0IHN0cmVhbS4KKy0gRGVmYXVsdHMgdmFsdWVzOiBhcmUgYWx3YXlzIHdyaXR0ZW4KKworSWYgYSByZXF1aXJlZCBmaWVsZCBpcyBtaXNzaW5nIGR1cmluZyByZWFkLCB0aGUgZXhwZWN0ZWQgYmVoYXZpb3VyIGlzIHRvIGluZGljYXRlIGFuIHVuc3VjY2Vzc2Z1bCByZWFkIG9wZXJhdGlvbiB0byB0aGUgY2FsbGVyLCBlLmcuIGJ5IHRocm93aW5nIGFuIGV4Y2VwdGlvbiBvciByZXR1cm5pbmcgYW4gZXJyb3IuIAorCitCZWNhdXNlIG9mIHRoaXMgYmVoYXZpb3VyLCByZXF1aXJlZCBmaWVsZHMgZHJhc3RpY2FsbHkgbGltaXQgdGhlIG9wdGlvbnMgd2l0aCByZWdhcmQgdG8gc29mdCB2ZXJzaW9uaW5nLiBCZWNhdXNlIHRoZXkgbXVzdCBiZSBwcmVzZW50IG9uIHJlYWQsIHRoZSBmaWVsZHMgY2Fubm90IGJlIGRlcHJlY2F0ZWQuIElmIGEgcmVxdWlyZWQgZmllbGQgd291bGQgYmUgcmVtb3ZlZCAob3IgY2hhbmdlZCB0byBvcHRpb25hbCksIHRoZSBkYXRhIGFyZSBubyBsb25nZXIgY29tcGF0aWJsZSBiZXR3ZWVuIHZlcnNpb25zLgorCQorIyMjIyBvcHRpb25hbAorCistIFdyaXRlOiBPcHRpb25hbCBmaWVsZHMgYXJlIG9ubHkgd3JpdHRlbiB3aGVuIHRoZXkgYXJlIHNldAorLSBSZWFkOiBPcHRpb25hbCBmaWVsZHMgbWF5LCBvciBtYXkgbm90IGJlIHBhcnQgb2YgdGhlIGlucHV0IHN0cmVhbS4gCistIERlZmF1bHQgdmFsdWVzOiBhcmUgd3JpdHRlbiB3aGVuIHRoZSBpc3NldCBmbGFnIGlzIHNldAorCitNb3N0IGxhbmd1YWdlIGltcGxlbWVudGF0aW9ucyB1c2UgdGhlIHJlY29tbWVuZGVkIHByYXRpY2Ugb2Ygc28tY2FsbGVkICJpc3NldCIgZmxhZ3MgdG8gaW5kaWNhdGUgd2hldGhlciBhIHBhcnRpY3VsYXIgb3B0aW9uYWwgZmllbGQgaXMgc2V0IG9yIG5vdC4gT25seSBmaWVsZHMgd2l0aCB0aGlzIGZsYWcgc2V0IGFyZSB3cml0dGVuLCBhbmQgY29udmVyc2VseSB0aGUgZmxhZyBpcyBvbmx5IHNldCB3aGVuIGEgZmllbGQgdmFsdWUgaGFzIGJlZW4gcmVhZCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0uIAorCQorIyMjIyBkZWZhdWx0IHJlcXVpcmVkbmVzcyAoaW1wbGljaXQpCisKKy0gV3JpdGU6IEluIHRoZW9yeSwgdGhlIGZpZWxkcyBhcmUgYWx3YXlzIHdyaXR0ZW4uIFRoZXJlIGFyZSBzb21lIGV4Y2VwdGlvbnMgdG8gdGhhdCBydWxlLCBzZWUgYmVsb3cuCistIFJlYWQ6IExpa2Ugb3B0aW9uYWwsIHRoZSBmaWVsZCBtYXksIG9yIG1heSBub3QgYmUgcGFydCBvZiB0aGUgaW5wdXQgc3RyZWFtLiAKKy0gRGVmYXVsdCB2YWx1ZXM6IG1heSBub3QgYmUgd3JpdHRlbiAoc2VlIG5leHQgc2VjdGlvbikKKworRGVmYXVsdCByZXF1aXJlZG5lc3MgaXMgYSBnb29kIHN0YXJ0aW5nIHBvaW50LiBUaGUgZGVzaXJlZCBiZWhhdmlvdXIgaXMgYSBtaXggb2Ygb3B0aW9uYWwgYW5kIHJlcXVpcmVkLCBoZW5jZSB0aGUgaW50ZXJuYWwgbmFtZSAib3B0LWluLCByZXEtb3V0Ii4gQWx0aG91Z2ggaW4gdGhlb3J5IHRoZXNlIGZpZWxkcyBhcmUgc3VwcG9zZWQgdG8gYmUgd3JpdHRlbiAoInJlcS1vdXQiKSwgaW4gcmVhbGl0eSB1bnNldCBmaWVsZHMgYXJlIG5vdCBhbHdheXMgd3JpdHRlbi4gVGhpcyBpcyBlc3BlY2lhbGx5IHRoZSBjYXNlLCB3aGVuIHRoZSBmaWVsZCBjb250YWlucyBhIDxudWxsPiB2YWx1ZSwgd2hpY2ggYnkgZGVmaW5pdGlvbiBjYW5ub3QgYmUgdHJhbnNwb3J0ZWQgdGhyb3VnaCB0aHJpZnQuIFRoZSBvbmx5IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgYnkgbm90IHdyaXRpbmcgdGhhdCBmaWVsZCBhdCBhbGwsIGFuZCB0aGF0J3Mgd2hhdCBtb3N0IGxhbmd1YWdlcyBkby4KKwkKKyMjIyMgU2VtYW50aWNzIG9mIERlZmF1bHQgVmFsdWVzCisKK1RoZXJlIGFyZSBvbmdvaW5nIGRpc2N1c3Npb25zIGFib3V0IHRoYXQgdG9waWMsIHNlZSBKSVJBIGZvciBkZXRhaWxzLiBOb3QgYWxsIGltcGxlbWVudGF0aW9ucyB0cmVhdCBkZWZhdWx0IHZhbHVlcyBpbiB0aGUgdmVyeSBzYW1lIHdheSwgYnV0IHRoZSBjdXJyZW50IHN0YXR1cyBxdW8gaXMgbW9yZSBvciBsZXNzIHRoYXQgZGVmYXVsdCBmaWVsZHMgYXJlIHR5cGljYWxseSBzZXQgYXQgaW5pdGlhbGl6YXRpb24gdGltZS4gVGhlcmVmb3JlLCBhIHZhbHVlIHRoYXQgZXF1YWxzIHRoZSBkZWZhdWx0IG1heSBub3QgYmUgd3JpdHRlbiwgYmVjYXVzZSB0aGUgcmVhZCBlbmQgd2lsbCBzZXQgdGhlIHZhbHVlIGltcGxpY2l0bHkuIE9uIHRoZSBvdGhlciBoYW5kLCBhbiBpbXBsZW1lbnRhdGlvbiBpcyBmcmVlIHRvIHdyaXRlIHRoZSBkZWZhdWx0IHZhbHVlIGFueXdheXMsIGFzIHRoZXJlIGlzIG5vIGhhcmQgcmVzdHJpY3Rpb24gdGhhdCBwcmV2ZW50cyB0aGlzLiAKKworVGhlIG1ham9yIHBvaW50IHRvIGtlZXAgaW4gbWluZCBoZXJlIGlzIHRoZSBmYWN0LCB0aGF0IGFueSB1bndyaXR0ZW4gZGVmYXVsdCB2YWx1ZSBpbXBsaWNpdGx5IGJlY29tZXMgcGFydCBvZiB0aGUgaW50ZXJmYWNlIHZlcnNpb24uIElmIHRoYXQgZGVmYXVsdCBpcyBjaGFuZ2VkLCB0aGUgaW50ZXJmYWNlIGNoYW5nZXMuIElmLCBpbiBjb250cmFzdCwgdGhlIGRlZmF1bHQgdmFsdWUgaXMgd3JpdHRlbiBpbnRvIHRoZSBvdXRwdXQgZGF0YSwgdGhlIGRlZmF1bHQgaW4gdGhlIElETCBjYW4gY2hhbmdlIGF0IGFueSB0aW1lIHdpdGhvdXQgYWZmZWN0aW5nIHNlcmlhbGl6ZWQgZGF0YS4KIAogIyMjIFhTRCBPcHRpb25zCiAKQEAgLTE1MCw3ICsxODYsNyBAQAogCiAgICAgWzI1XSBEZWZpbml0aW9uVHlwZSAgOjo9ICBCYXNlVHlwZSB8IENvbnRhaW5lclR5cGUKIAotICAgIFsyNl0gQmFzZVR5cGUgICAgICAgIDo6PSAgJ2Jvb2wnIHwgJ2J5dGUnIHwgJ2kxNicgfCAnaTMyJyB8ICdpNjQnIHwgJ2RvdWJsZScgfCAnc3RyaW5nJyB8ICdiaW5hcnknIHwgJ3NsaXN0JworICAgIFsyNl0gQmFzZVR5cGUgICAgICAgIDo6PSAgJ2Jvb2wnIHwgJ2J5dGUnIHwgJ2k4JyB8ICdpMTYnIHwgJ2kzMicgfCAnaTY0JyB8ICdkb3VibGUnIHwgJ3N0cmluZycgfCAnYmluYXJ5JyB8ICdzbGlzdCcKIAogICAgIFsyN10gQ29udGFpbmVyVHlwZSAgIDo6PSAgTWFwVHlwZSB8IFNldFR5cGUgfCBMaXN0VHlwZQogCkBAIC0yMDYsOSArMjQyLDkgQEAKICAqIFtBcGFjaGUgQ2Fzc2FuZHJhJ3NdW10gVGhyaWZ0IElETDogW2Nhc3NhbmRyYS50aHJpZnRdW10KICAqIFtFdmVybm90ZSBBUEldW10KIAotIFtUaHJpZnRUZXN0LnRocmlmdF06ICBodHRwczovL2dpdC13aXAtdXMuYXBhY2hlLm9yZy9yZXBvcy9hc2Y/cD10aHJpZnQuZ2l0O2E9YmxvYl9wbGFpbjtmPXRlc3QvVGhyaWZ0VGVzdC50aHJpZnQ7aGI9SEVBRAorIFtUaHJpZnRUZXN0LnRocmlmdF06ICBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYXBhY2hlL3RocmlmdC9tYXN0ZXIvdGVzdC9UaHJpZnRUZXN0LnRocmlmdAogIFt0dXRvcmlhbF06ICAgICAgICAgICAvdHV0b3JpYWwvCi0gW2ZiMzAzLnRocmlmdF06ICAgICAgIGh0dHBzOi8vZ2l0LXdpcC11cy5hcGFjaGUub3JnL3JlcG9zL2FzZj9wPXRocmlmdC5naXQ7YT1ibG9iX3BsYWluO2Y9Y29udHJpYi9mYjMwMy9pZi9mYjMwMy50aHJpZnQ7aGI9SEVBRAorIFtmYjMwMy50aHJpZnRdOiAgICAgICBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYXBhY2hlL3RocmlmdC9tYXN0ZXIvY29udHJpYi9mYjMwMy9pZi9mYjMwMy50aHJpZnQKICBbQXBhY2hlIENhc3NhbmRyYSdzXTogaHR0cDovL2Nhc3NhbmRyYS5hcGFjaGUub3JnLwogIFtjYXNzYW5kcmEudGhyaWZ0XTogICBodHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL2Nhc3NhbmRyYS90cnVuay9pbnRlcmZhY2UvY2Fzc2FuZHJhLnRocmlmdD92aWV3PWNvCiAgW0V2ZXJub3RlIEFQSV06ICAgICAgIGh0dHA6Ly93d3cuZXZlcm5vdGUuY29tL2Fib3V0L2RldmVsb3Blci9hcGkvCmRpZmYgLS1naXQgYS9kb2Mvc3BlY3MvdGhyaWZ0LWJpbmFyeS1wcm90b2NvbC5tZCBiL2RvYy9zcGVjcy90aHJpZnQtYmluYXJ5LXByb3RvY29sLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NTI2ODUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc3BlY3MvdGhyaWZ0LWJpbmFyeS1wcm90b2NvbC5tZApAQCAtMCwwICsxLDI1NCBAQAorVGhyaWZ0IEJpbmFyeSBwcm90b2NvbCBlbmNvZGluZyAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworPCEtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK2Rpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCitzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwordW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLT4KKworVGhpcyBkb2N1bWVudHMgZGVzY3JpYmVzIHRoZSB3aXJlIGVuY29kaW5nIGZvciBSUEMgdXNpbmcgdGhlIG9sZGVyIFRocmlmdCAqYmluYXJ5IHByb3RvY29sKi4KKworVGhlIGluZm9ybWF0aW9uIGhlcmUgaXMgX21vc3RseV8gYmFzZWQgb24gdGhlIEphdmEgaW1wbGVtZW50YXRpb24gaW4gdGhlIEFwYWNoZSB0aHJpZnQgbGlicmFyeSAodmVyc2lvbiAwLjkuMSBhbmQKKzAuOS4zKS4gT3RoZXIgaW1wbGVtZW50YXRpb24gaG93ZXZlciwgc2hvdWxkIGJlaGF2ZSB0aGUgc2FtZS4KKworRm9yIGJhY2tncm91bmQgb24gVGhyaWZ0IHNlZSB0aGUgW1RocmlmdCB3aGl0ZXBhcGVyIChwZGYpXShodHRwczovL3RocmlmdC5hcGFjaGUub3JnL3N0YXRpYy9maWxlcy90aHJpZnQtMjAwNzA0MDEucGRmKS4KKworIyBDb250ZW50cworCisqIEJpbmFyeSBwcm90b2NvbAorICAqIEJhc2UgdHlwZXMKKyAgKiBNZXNzYWdlCisgICogU3RydWN0CisgICogTGlzdCBhbmQgU2V0CisgICogTWFwCisqIEJORiBub3RhdGlvbiB1c2VkIGluIHRoaXMgZG9jdW1lbnQKKworIyBCaW5hcnkgcHJvdG9jb2wKKworIyMgQmFzZSB0eXBlcworCisjIyMgSW50ZWdlciBlbmNvZGluZworCitJbiB0aGUgX2JpbmFyeSBwcm90b2NvbF8gaW50ZWdlcnMgYXJlIGVuY29kZWQgd2l0aCB0aGUgbW9zdCBzaWduaWZpY2FudCBieXRlIGZpcnN0IChiaWcgZW5kaWFuIGJ5dGUgb3JkZXIsIGFrYSBuZXR3b3JrCitvcmRlcikuIEFuIGBpbnQ4YCBuZWVkcyAxIGJ5dGUsIGFuIGBpbnQxNmAgMiwgYW4gYGludDMyYCA0IGFuZCBhbiBgaW50NjRgIG5lZWRzIDggYnl0ZXMuCisKK1RoZSBDUFAgdmVyc2lvbiBoYXMgdGhlIG9wdGlvbiB0byB1c2UgdGhlIGJpbmFyeSBwcm90b2NvbCB3aXRoIGxpdHRsZSBlbmRpYW4gb3JkZXIuIExpdHRsZSBlbmRpYW4gZ2l2ZXMgYSBzbWFsbCBidXQKK25vdGljZWFibGUgcGVyZm9ybWFuY2UgYm9vc3QgYmVjYXVzZSBjb250ZW1wb3JhcnkgQ1BVcyB1c2UgbGl0dGxlIGVuZGlhbiB3aGVuIHN0b3JpbmcgaW50ZWdlcnMgdG8gUkFNLgorCisjIyMgRW51bSBlbmNvZGluZworCitUaGUgZ2VuZXJhdGVkIGNvZGUgZW5jb2RlcyBgRW51bWBzIGJ5IHRha2luZyB0aGUgb3JkaW5hbCB2YWx1ZSBhbmQgdGhlbiBlbmNvZGluZyB0aGF0IGFzIGFuIGludDMyLgorCisjIyMgQmluYXJ5IGVuY29kaW5nCisKK0JpbmFyeSBpcyBzZW50IGFzIGZvbGxvd3M6CisKK2BgYAorQmluYXJ5IHByb3RvY29sLCBiaW5hcnkgZGF0YSwgNCsgYnl0ZXM6CisrLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKworfCBieXRlIGxlbmd0aCAgICAgICAgICAgICAgICAgICAgICAgfCBieXRlcyAgICAgICAgICAgICAgICB8CisrLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKworYGBgCisKK1doZXJlOgorCisqIGBieXRlIGxlbmd0aGAgaXMgdGhlIGxlbmd0aCBvZiB0aGUgYnl0ZSBhcnJheSwgYSBzaWduZWQgMzIgYml0IGludGVnZXIgZW5jb2RlZCBpbiBuZXR3b3JrIChiaWcgZW5kaWFuKSBvcmRlciAobXVzdCBiZSA+PSAwKS4KKyogYGJ5dGVzYCBhcmUgdGhlIGJ5dGVzIG9mIHRoZSBieXRlIGFycmF5LgorCisjIyMgU3RyaW5nIGVuY29kaW5nCisKKypTdHJpbmcqcyBhcmUgZmlyc3QgZW5jb2RlZCB0byBVVEYtOCwgYW5kIHRoZW4gc2VuZCBhcyBiaW5hcnkuCisKKyMjIyBEb3VibGUgZW5jb2RpbmcKKworVmFsdWVzIG9mIHR5cGUgYGRvdWJsZWAgYXJlIGZpcnN0IGNvbnZlcnRlZCB0byBhbiBpbnQ2NCBhY2NvcmRpbmcgdG8gdGhlIElFRUUgNzU0IGZsb2F0aW5nLXBvaW50ICJkb3VibGUgZm9ybWF0IiBiaXQKK2xheW91dC4gTW9zdCBydW4tdGltZXMgcHJvdmlkZSBhIGxpYnJhcnkgdG8gbWFrZSB0aGlzIGNvbnZlcnNpb24uIEJvdGggdGhlIGJpbmFyeSBwcm90b2NvbCBhcyB0aGUgY29tcGFjdCBwcm90b2NvbCB0aGVuCitlbmNvZGUgdGhlIGludDY0IGluIDggYnl0ZXMgaW4gYmlnIGVuZGlhbiBvcmRlci4KKworIyMjIEJvb2xlYW4gZW5jb2RpbmcKKworVmFsdWVzIG9mIGBib29sYCB0eXBlIGFyZSBmaXJzdCBjb252ZXJ0ZWQgdG8gYW4gaW50OC4gVHJ1ZSBpcyBjb252ZXJ0ZWQgdG8gYDFgLCBmYWxzZSB0byBgMGAuCisKKyMjIE1lc3NhZ2UKKworQSBgTWVzc2FnZWAgY2FuIGJlIGVuY29kZWQgaW4gdHdvIGRpZmZlcmVudCB3YXlzOgorCitgYGAKK0JpbmFyeSBwcm90b2NvbCBNZXNzYWdlLCBzdHJpY3QgZW5jb2RpbmcsIDEyKyBieXRlczoKKystLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rCit8MXZ2dnZ2dnZ8dnZ2dnZ2dnZ8dW51c2VkICB8MDAwMDBtbW18IG5hbWUgbGVuZ3RoICAgICAgICAgICAgICAgICAgICAgICB8IG5hbWUgICAgICAgICAgICAgICAgfCBzZXEgaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsKK2BgYAorCitXaGVyZToKKworKiBgdnZ2dnZ2dnZ2dnZ2dnZ2YCBpcyB0aGUgdmVyc2lvbiwgYW4gdW5zaWduZWQgMTUgYml0IG51bWJlciBmaXhlZCB0byBgMWAgKGluIGJpbmFyeTogYDAwMCAwMDAwIDAwMDAgMDAwMWApLgorICBUaGUgbGVhZGluZyBiaXQgaXMgYDFgLgorKiBgdW51c2VkYCBpcyBhbiBpZ25vcmVkIGJ5dGUuCisqIGBtbW1gIGlzIHRoZSBtZXNzYWdlIHR5cGUsIGFuIHVuc2lnbmVkIDMgYml0IGludGVnZXIuIFRoZSA1IGxlYWRpbmcgYml0cyBtdXN0IGJlIGAwYCBhcyBzb21lIGNsaWVudHMgKGNoZWNrZWQgZm9yCisgIGphdmEgaW4gMC45LjEpIHRha2UgdGhlIHdob2xlIGJ5dGUuCisqIGBuYW1lIGxlbmd0aGAgaXMgdGhlIGJ5dGUgbGVuZ3RoIG9mIHRoZSBuYW1lIGZpZWxkLCBhIHNpZ25lZCAzMiBiaXQgaW50ZWdlciBlbmNvZGVkIGluIG5ldHdvcmsgKGJpZyBlbmRpYW4pIG9yZGVyIChtdXN0IGJlID49IDApLgorKiBgbmFtZWAgaXMgdGhlIG1ldGhvZCBuYW1lLCBhIFVURi04IGVuY29kZWQgc3RyaW5nLgorKiBgc2VxIGlkYCBpcyB0aGUgc2VxdWVuY2UgaWQsIGEgc2lnbmVkIDMyIGJpdCBpbnRlZ2VyIGVuY29kZWQgaW4gbmV0d29yayAoYmlnIGVuZGlhbikgb3JkZXIuCisKK1RoZSBzZWNvbmQsIG9sZGVyIGVuY29kaW5nIChha2Egbm9uLXN0cmljdCkgaXM6CisKK2BgYAorQmluYXJ5IHByb3RvY29sIE1lc3NhZ2UsIG9sZCBlbmNvZGluZywgOSsgYnl0ZXM6CisrLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKworfCBuYW1lIGxlbmd0aCAgICAgICAgICAgICAgICAgICAgICAgfCBuYW1lICAgICAgICAgICAgICAgIHwwMDAwMG1tbXwgc2VxIGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKystLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rCitgYGAKKworV2hlcmUgYG5hbWUgbGVuZ3RoYCwgYG5hbWVgLCBgbW1tYCwgYHNlcSBpZGAgYXJlIGFzIGFib3ZlLgorCitCZWNhdXNlIGBuYW1lIGxlbmd0aGAgbXVzdCBiZSBwb3NpdGl2ZSAodGhlcmVmb3JlIHRoZSBmaXJzdCBiaXQgaXMgYWx3YXlzIGAwYCksIHRoZSBmaXJzdCBiaXQgYWxsb3dzIHRoZSByZWNlaXZlciB0byBzZWUKK3doZXRoZXIgdGhlIHN0cmljdCBmb3JtYXQgb3IgdGhlIG9sZCBmb3JtYXQgaXMgdXNlZC4gVGhlcmVmb3JlIGEgc2VydmVyIGFuZCBjbGllbnQgdXNpbmcgdGhlIGRpZmZlcmVudCB2YXJpYW50cyBvZiB0aGUKK2JpbmFyeSBwcm90b2NvbCBjYW4gdHJhbnNwYXJlbnRseSB0YWxrIHdpdGggZWFjaCBvdGhlci4gSG93ZXZlciwgd2hlbiBzdHJpY3QgbW9kZSBpcyBlbmZvcmNlZCwgdGhlIG9sZCBmb3JtYXQgaXMKK3JlamVjdGVkLgorCitNZXNzYWdlIHR5cGVzIGFyZSBlbmNvZGVkIHdpdGggdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisKKyogX0NhbGxfOiAxCisqIF9SZXBseV86IDIKKyogX0V4Y2VwdGlvbl86IDMKKyogX09uZXdheV86IDQKKworIyMgU3RydWN0CisKK0EgKlN0cnVjdCogaXMgYSBzZXF1ZW5jZSBvZiB6ZXJvIG9yIG1vcmUgZmllbGRzLCBmb2xsb3dlZCBieSBhIHN0b3AgZmllbGQuIEVhY2ggZmllbGQgc3RhcnRzIHdpdGggYSBmaWVsZCBoZWFkZXIgYW5kCitpcyBmb2xsb3dlZCBieSB0aGUgZW5jb2RlZCBmaWVsZCB2YWx1ZS4gVGhlIGVuY29kaW5nIGNhbiBiZSBzdW1tYXJpemVkIGJ5IHRoZSBmb2xsb3dpbmcgQk5GOgorCitgYGAKK3N0cnVjdCAgICAgICAgOjo9ICggZmllbGQtaGVhZGVyIGZpZWxkLXZhbHVlICkqIHN0b3AtZmllbGQKK2ZpZWxkLWhlYWRlciAgOjo9IGZpZWxkLXR5cGUgZmllbGQtaWQKK2BgYAorCitCZWNhdXNlIGVhY2ggZmllbGQgaGVhZGVyIGNvbnRhaW5zIHRoZSBmaWVsZC1pZCAoYXMgZGVmaW5lZCBieSB0aGUgVGhyaWZ0IElETCBmaWxlKSwgdGhlIGZpZWxkcyBjYW4gYmUgZW5jb2RlZCBpbiBhbnkKK29yZGVyLiBUaHJpZnQncyB0eXBlIHN5c3RlbSBpcyBub3QgZXh0ZW5zaWJsZTsgeW91IGNhbiBvbmx5IGVuY29kZSB0aGUgcHJpbWl0aXZlIHR5cGVzIGFuZCBzdHJ1Y3RzLiBUaGVyZWZvcmUgaXMgYWxzbworcG9zc2libGUgdG8gaGFuZGxlIHVua25vd24gZmllbGRzIHdoaWxlIGRlY29kaW5nOyB0aGVzZSBhcmUgc2ltcGx5IGlnbm9yZWQuIFdoaWxlIGRlY29kaW5nIHRoZSBmaWVsZCB0eXBlIGNhbiBiZSB1c2VkIHRvCitkZXRlcm1pbmUgaG93IHRvIGRlY29kZSB0aGUgZmllbGQgdmFsdWUuCisKK05vdGUgdGhhdCB0aGUgZmllbGQgbmFtZSBpcyBub3QgZW5jb2RlZCBzbyBmaWVsZCByZW5hbWVzIGluIHRoZSBJREwgZG8gbm90IGFmZmVjdCBmb3J3YXJkIGFuZCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorCitUaGUgZGVmYXVsdCBKYXZhIGltcGxlbWVudGF0aW9uIChBcGFjaGUgVGhyaWZ0IDAuOS4xKSBoYXMgdW5kZWZpbmVkIGJlaGF2aW9yIHdoZW4gaXQgdHJpZXMgdG8gZGVjb2RlIGEgZmllbGQgdGhhdCBoYXMKK2Fub3RoZXIgZmllbGQtdHlwZSB0aGVuIHdoYXQgaXMgZXhwZWN0ZWQuIFRoZW9yZXRpY2FsbHkgdGhpcyBjb3VsZCBiZSBkZXRlY3RlZCBhdCB0aGUgY29zdCBvZiBzb21lIGFkZGl0aW9uYWwgY2hlY2tpbmcuCitPdGhlciBpbXBsZW1lbnRhdGlvbiBtYXkgcGVyZm9ybSB0aGlzIGNoZWNrIGFuZCB0aGVuIGVpdGhlciBpZ25vcmUgdGhlIGZpZWxkLCBvciByZXR1cm4gYSBwcm90b2NvbCBleGNlcHRpb24uCisKK0EgKlVuaW9uKiBpcyBlbmNvZGVkIGV4YWN0bHkgdGhlIHNhbWUgYXMgYSBzdHJ1Y3Qgd2l0aCB0aGUgYWRkaXRpb25hbCByZXN0cmljdGlvbiB0aGF0IGF0IG1vc3QgMSBmaWVsZCBtYXkgYmUgZW5jb2RlZC4KKworQW4gKkV4Y2VwdGlvbiogaXMgZW5jb2RlZCBleGFjdGx5IHRoZSBzYW1lIGFzIGEgc3RydWN0LgorCisjIyMgU3RydWN0IGVuY29kaW5nCisKK0luIHRoZSBiaW5hcnkgcHJvdG9jb2wgZmllbGQgaGVhZGVycyBhbmQgdGhlIHN0b3AgZmllbGQgYXJlIGVuY29kZWQgYXMgZm9sbG93czoKKworYGBgCitCaW5hcnkgcHJvdG9jb2wgZmllbGQgaGVhZGVyIGFuZCBmaWVsZCB2YWx1ZToKKystLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rCit8dHR0dHR0dHR8IGZpZWxkIGlkICAgICAgICB8IGZpZWxkIHZhbHVlICAgICAgICAgfAorKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSsKKworQmluYXJ5IHByb3RvY29sIHN0b3AgZmllbGQ6CisrLS0tLS0tLS0rCit8MDAwMDAwMDB8CisrLS0tLS0tLS0rCitgYGAKKworV2hlcmU6CisKKyogYHR0dHR0dHR0YCB0aGUgZmllbGQtdHlwZSwgYSBzaWduZWQgOCBiaXQgaW50ZWdlci4KKyogYGZpZWxkIGlkYCB0aGUgZmllbGQtaWQsIGEgc2lnbmVkIDE2IGJpdCBpbnRlZ2VyIGluIGJpZyBlbmRpYW4gb3JkZXIuCisqIGBmaWVsZC12YWx1ZWAgdGhlIGVuY29kZWQgZmllbGQgdmFsdWUuCisKK1RoZSBmb2xsb3dpbmcgZmllbGQtdHlwZXMgYXJlIHVzZWQ6CisKKyogYEJPT0xgLCBlbmNvZGVkIGFzIGAyYAorKiBgQllURWAsIGVuY29kZWQgYXMgYDNgCisqIGBET1VCTEVgLCBlbmNvZGVkIGFzIGA0YAorKiBgSTE2YCwgZW5jb2RlZCBhcyBgNmAKKyogYEkzMmAsIGVuY29kZWQgYXMgYDhgCisqIGBJNjRgLCBlbmNvZGVkIGFzIGAxMGAKKyogYFNUUklOR2AsIHVzZWQgZm9yIGJpbmFyeSBhbmQgc3RyaW5nIGZpZWxkcywgZW5jb2RlZCBhcyBgMTFgCisqIGBTVFJVQ1RgLCB1c2VkIGZvciBzdHJ1Y3RzIGFuZCB1bmlvbiBmaWVsZHMsIGVuY29kZWQgYXMgYDEyYAorKiBgTUFQYCwgZW5jb2RlZCBhcyBgMTNgCisqIGBTRVRgLCBlbmNvZGVkIGFzIGAxNGAKKyogYExJU1RgLCBlbmNvZGVkIGFzIGAxNWAKKworIyMgTGlzdCBhbmQgU2V0CisKK0xpc3QgYW5kIHNldHMgYXJlIGVuY29kZWQgdGhlIHNhbWU6IGEgaGVhZGVyIGluZGljYXRpbmcgdGhlIHNpemUgYW5kIHRoZSBlbGVtZW50LXR5cGUgb2YgdGhlIGVsZW1lbnRzLCBmb2xsb3dlZCBieSB0aGUKK2VuY29kZWQgZWxlbWVudHMuCisKK2BgYAorQmluYXJ5IHByb3RvY29sIGxpc3QgKDUrIGJ5dGVzKSBhbmQgZWxlbWVudHM6CisrLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKworfHR0dHR0dHR0fCBzaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBlbGVtZW50cyAgICAgICAgICAgIHwKKystLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rCitgYGAKKworV2hlcmU6CisKKyogYHR0dHR0dHR0YCBpcyB0aGUgZWxlbWVudC10eXBlLCBlbmNvZGVkIGFzIGFuIGludDgKKyogYHNpemVgIGlzIHRoZSBzaXplLCBlbmNvZGVkIGFzIGFuIGludDMyLCBwb3NpdGl2ZSB2YWx1ZXMgb25seQorKiBgZWxlbWVudHNgIHRoZSBlbGVtZW50IHZhbHVlcworCitUaGUgZWxlbWVudC10eXBlIHZhbHVlcyBhcmUgdGhlIHNhbWUgYXMgZmllbGQtdHlwZXMuIFRoZSBmdWxsIGxpc3QgaXMgaW5jbHVkZWQgaW4gdGhlIHN0cnVjdCBzZWN0aW9uIGFib3ZlLgorCitUaGUgbWF4aW11bSBsaXN0L3NldCBzaXplIGlzIGNvbmZpZ3VyYWJsZS4gQnkgZGVmYXVsdCB0aGVyZSBpcyBubyBsaW1pdCAobWVhbmluZyB0aGUgbGltaXQgaXMgdGhlIG1heGltdW0gaW50MzIgdmFsdWU6CisyMTQ3NDgzNjQ3KS4KKworIyMgTWFwCisKK01hcHMgYXJlIGVuY29kZWQgd2l0aCBhIGhlYWRlciBpbmRpY2F0aW5nIHRoZSBzaXplLCB0aGUgZWxlbWVudC10eXBlIG9mIHRoZSBrZXlzIGFuZCB0aGUgZWxlbWVudC10eXBlIG9mIHRoZSBlbGVtZW50cywKK2ZvbGxvd2VkIGJ5IHRoZSBlbmNvZGVkIGVsZW1lbnRzLiBUaGUgZW5jb2RpbmcgZm9sbG93cyB0aGlzIEJORjoKKworYGBgCittYXAgIDo6PSAga2V5LWVsZW1lbnQtdHlwZSB2YWx1ZS1lbGVtZW50LXR5cGUgc2l6ZSAoIGtleSB2YWx1ZSApKgorYGBgCisKK2BgYAorQmluYXJ5IHByb3RvY29sIG1hcCAoNisgYnl0ZXMpIGFuZCBrZXkgdmFsdWUgcGFpcnM6CisrLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKworfGtra2tra2trfHZ2dnZ2dnZ2fCBzaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBrZXkgdmFsdWUgcGFpcnMgICAgIHwKKystLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rCitgYGAKKworV2hlcmU6CisKKyogYGtra2tra2trYCBpcyB0aGUga2V5IGVsZW1lbnQtdHlwZSwgZW5jb2RlZCBhcyBhbiBpbnQ4CisqIGB2dnZ2dnZ2dmAgaXMgdGhlIHZhbHVlIGVsZW1lbnQtdHlwZSwgZW5jb2RlZCBhcyBhbiBpbnQ4CisqIGBzaXplYCBpcyB0aGUgc2l6ZSBvZiB0aGUgbWFwLCBlbmNvZGVkIGFzIGFuIGludDMyLCBwb3NpdGl2ZSB2YWx1ZXMgb25seQorKiBga2V5IHZhbHVlIHBhaXJzYCBhcmUgdGhlIGVuY29kZWQga2V5cyBhbmQgdmFsdWVzCisKK1RoZSBlbGVtZW50LXR5cGUgdmFsdWVzIGFyZSB0aGUgc2FtZSBhcyBmaWVsZC10eXBlcy4gVGhlIGZ1bGwgbGlzdCBpcyBpbmNsdWRlZCBpbiB0aGUgc3RydWN0IHNlY3Rpb24gYWJvdmUuCisKK1RoZSBtYXhpbXVtIG1hcCBzaXplIGlzIGNvbmZpZ3VyYWJsZS4gQnkgZGVmYXVsdCB0aGVyZSBpcyBubyBsaW1pdCAobWVhbmluZyB0aGUgbGltaXQgaXMgdGhlIG1heGltdW0gaW50MzIgdmFsdWU6CisyMTQ3NDgzNjQ3KS4KKworIyBCTkYgbm90YXRpb24gdXNlZCBpbiB0aGlzIGRvY3VtZW50CisKK1RoZSBmb2xsb3dpbmcgQk5GIG5vdGF0aW9uIGlzIHVzZWQ6CisKKyogYSBwbHVzIGArYCBhcHBlbmRlZCB0byBhbiBpdGVtIHJlcHJlc2VudHMgcmVwZXRpdGlvbjsgdGhlIGl0ZW0gaXMgcmVwZWF0ZWQgMSBvciBtb3JlIHRpbWVzCisqIGEgc3RhciBgKmAgYXBwZW5kZWQgdG8gYW4gaXRlbSByZXByZXNlbnRzIG9wdGlvbmFsIHJlcGV0aXRpb247IHRoZSBpdGVtIGlzIHJlcGVhdGVkIDAgb3IgbW9yZSB0aW1lcworKiBhIHBpcGUgYHxgIGJldHdlZW4gaXRlbXMgcmVwcmVzZW50cyBjaG9pY2UsIHRoZSBmaXJzdCBtYXRjaGluZyBpdGVtIGlzIHNlbGVjdGVkCisqIHBhcmVudGhlc2lzIGAoYCBhbmQgYClgIGFyZSB1c2VkIGZvciBncm91cGluZyBtdWx0aXBsZSBpdGVtcwpkaWZmIC0tZ2l0IGEvZG9jL3NwZWNzL3RocmlmdC1jb21wYWN0LXByb3RvY29sLm1kIGIvZG9jL3NwZWNzL3RocmlmdC1jb21wYWN0LXByb3RvY29sLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyNDY3ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc3BlY3MvdGhyaWZ0LWNvbXBhY3QtcHJvdG9jb2wubWQKQEAgLTAsMCArMSwyOTQgQEAKK1RocmlmdCBDb21wYWN0IHByb3RvY29sIGVuY29kaW5nIAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworPCEtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK2Rpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCitzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwordW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLT4KKworVGhpcyBkb2N1bWVudHMgZGVzY3JpYmVzIHRoZSB3aXJlIGVuY29kaW5nIGZvciBSUEMgdXNpbmcgdGhlIFRocmlmdCAqY29tcGFjdCBwcm90b2NvbCouCisKK1RoZSBpbmZvcm1hdGlvbiBoZXJlIGlzIF9tb3N0bHlfIGJhc2VkIG9uIHRoZSBKYXZhIGltcGxlbWVudGF0aW9uIGluIHRoZSBBcGFjaGUgdGhyaWZ0IGxpYnJhcnkgKHZlcnNpb24gMC45LjEpIGFuZAorW1RIUklGVC0xMTAgQSBtb3JlIGNvbXBhY3QgZm9ybWF0XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xMTApLiBPdGhlciBpbXBsZW1lbnRhdGlvbiBob3dldmVyLAorc2hvdWxkIGJlaGF2ZSB0aGUgc2FtZS4KKworRm9yIGJhY2tncm91bmQgb24gVGhyaWZ0IHNlZSB0aGUgW1RocmlmdCB3aGl0ZXBhcGVyIChwZGYpXShodHRwczovL3RocmlmdC5hcGFjaGUub3JnL3N0YXRpYy9maWxlcy90aHJpZnQtMjAwNzA0MDEucGRmKS4KKworIyBDb250ZW50cworCisqIENvbXBhY3QgcHJvdG9jb2wKKyAgKiBCYXNlIHR5cGVzCisgICogTWVzc2FnZQorICAqIFN0cnVjdAorICAqIExpc3QgYW5kIFNldAorICAqIE1hcAorKiBCTkYgbm90YXRpb24gdXNlZCBpbiB0aGlzIGRvY3VtZW50CisKKyMgQ29tcGFjdCBwcm90b2NvbAorCisjIyBCYXNlIHR5cGVzCisKKyMjIyBJbnRlZ2VyIGVuY29kaW5nCisKK1RoZSBfY29tcGFjdCBwcm90b2NvbF8gdXNlcyBtdWx0aXBsZSBlbmNvZGluZ3MgZm9yIGludHM6IHRoZSBfemlnemFnIGludF8sIGFuZCB0aGUgX3ZhciBpbnRfLgorCitWYWx1ZXMgb2YgdHlwZSBgaW50MzJgIGFuZCBgaW50NjRgIGFyZSBmaXJzdCB0cmFuc2Zvcm1lZCB0byBhICp6aWd6YWcgaW50Ki4gQSB6aWd6YWcgaW50IGZvbGRzIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZQorbnVtYmVycyBpbnRvIHRoZSBwb3NpdGl2ZSBudW1iZXIgc3BhY2UuIFdoZW4gd2UgcmVhZCAwLCAxLCAyLCAzLCA0IG9yIDUgZnJvbSB0aGUgd2lyZSwgdGhpcyBpcyB0cmFuc2xhdGVkIHRvIDAsIC0xLCAxLAorLTIgb3IgMiByZXNwZWN0aXZlbHkuIEhlcmUgYXJlIHRoZSAoU2NhbGEpIGZvcm11bGFzIHRvIGNvbnZlcnQgZnJvbSBpbnQzMi9pbnQ2NCB0byBhIHppZ3phZyBpbnQgYW5kIGJhY2s6CisKK2BgYHNjYWxhCitkZWYgaW50VG9aaWdaYWcobjogSW50KTogSW50ID0gKG4gPDwgMSkgXiAobiA+PiAzMSkKK2RlZiB6aWd6YWdUb0ludChuOiBJbnQpOiBJbnQgPSAobiA+Pj4gMSkgXiAtIChuICYgMSkKK2RlZiBsb25nVG9aaWdaYWcobjogTG9uZyk6IExvbmcgPSAobiA8PCAxKSBeIChuID4+IDYzKQorZGVmIHppZ3phZ1RvTG9uZyhuOiBMb25nKTogTG9uZyA9IChuID4+PiAxKSBeIC0gKG4gJiAxKQorYGBgCisKK1RoZSB6aWd6YWcgaW50IGlzIHRoZW4gZW5jb2RlZCBhcyBhICp2YXIgaW50Ki4gVmFyIGludHMgdGFrZSAxIHRvIDUgYnl0ZXMgKGludDMyKSBvciAxIHRvIDEwIGJ5dGVzIChpbnQ2NCkuIFRoZSBtb3N0CitzaWduaWZpY2FudCBiaXQgb2YgZWFjaCBieXRlIGluZGljYXRlcyBpZiBtb3JlIGJ5dGVzIGZvbGxvdy4gVGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIGxlYXN0IHNpZ25pZmljYW50IDcgYml0cyBmcm9tIGVhY2gKK2J5dGUgZm9ybSB0aGUgbnVtYmVyLCB3aGVyZSB0aGUgZmlyc3QgYnl0ZSBoYXMgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0cyAoc28gdGhleSBhcmUgaW4gYmlnIGVuZGlhbiBvciBuZXR3b3JrIG9yZGVyKS4KKworVmFyIGludHMgYXJlIHNvbWV0aW1lcyB1c2VkIGRpcmVjdGx5IGluc2lkZSB0aGUgY29tcGFjdCBwcm90b2NvbCB0byByZXByZXNlbnQgcG9zaXRpdmUgbnVtYmVycy4KKworVG8gZW5jb2RlIGFuIGBpbnQxNmAgYXMgemlnemFnIGludCwgaXQgaXMgZmlyc3QgY29udmVydGVkIHRvIGFuIGBpbnQzMmAgYW5kIHRoZW4gZW5jb2RlZCBhcyBzdWNoLiBUaGUgdHlwZSBgaW50OGAgc2ltcGx5Cit1c2VzIGEgc2luZ2xlIGJ5dGUgYXMgaW4gdGhlIGJpbmFyeSBwcm90b2NvbC4KKworIyMjIEVudW0gZW5jb2RpbmcKKworVGhlIGdlbmVyYXRlZCBjb2RlIGVuY29kZXMgYEVudW1gcyBieSB0YWtpbmcgdGhlIG9yZGluYWwgdmFsdWUgYW5kIHRoZW4gZW5jb2RpbmcgdGhhdCBhcyBhbiBpbnQzMi4KKworIyMjIEJpbmFyeSBlbmNvZGluZworCitCaW5hcnkgaXMgc2VudCBhcyBmb2xsb3dzOgorCitgYGAKK0JpbmFyeSBwcm90b2NvbCwgYmluYXJ5IGRhdGEsIDErIGJ5dGVzOgorKy0tLS0tLS0tKy4uListLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rCit8IGJ5dGUgbGVuZ3RoICAgICAgICAgfCBieXRlcyAgICAgICAgICAgICAgIHwKKystLS0tLS0tLSsuLi4rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKworYGBgCisKK1doZXJlOgorCisqIGBieXRlIGxlbmd0aGAgaXMgdGhlIGxlbmd0aCBvZiB0aGUgYnl0ZSBhcnJheSwgdXNpbmcgdmFyIGludCBlbmNvZGluZyAobXVzdCBiZSA+PSAwKS4KKyogYGJ5dGVzYCBhcmUgdGhlIGJ5dGVzIG9mIHRoZSBieXRlIGFycmF5LgorCisjIyMgU3RyaW5nIGVuY29kaW5nCisKKypTdHJpbmcqcyBhcmUgZmlyc3QgZW5jb2RlZCB0byBVVEYtOCwgYW5kIHRoZW4gc2VuZCBhcyBiaW5hcnkuCisKKyMjIyBEb3VibGUgZW5jb2RpbmcKKworVmFsdWVzIG9mIHR5cGUgYGRvdWJsZWAgYXJlIGZpcnN0IGNvbnZlcnRlZCB0byBhbiBpbnQ2NCBhY2NvcmRpbmcgdG8gdGhlIElFRUUgNzU0IGZsb2F0aW5nLXBvaW50ICJkb3VibGUgZm9ybWF0IiBiaXQKK2xheW91dC4gTW9zdCBydW4tdGltZXMgcHJvdmlkZSBhIGxpYnJhcnkgdG8gbWFrZSB0aGlzIGNvbnZlcnNpb24uIEJvdGggdGhlIGJpbmFyeSBwcm90b2NvbCBhcyB0aGUgY29tcGFjdCBwcm90b2NvbCB0aGVuCitlbmNvZGUgdGhlIGludDY0IGluIDggYnl0ZXMgaW4gYmlnIGVuZGlhbiBvcmRlci4KKworIyMjIEJvb2xlYW4gZW5jb2RpbmcKKworQm9vbGVhbnMgYXJlIGVuY29kZWQgZGlmZmVyZW50bHkgZGVwZW5kaW5nIG9uIHdoZXRoZXIgaXQgaXMgYSBmaWVsZCB2YWx1ZSAoaW4gYSBzdHJ1Y3QpIG9yIGFuIGVsZW1lbnQgdmFsdWUgKGluIGEgc2V0LAorbGlzdCBvciBtYXApLiBGaWVsZCB2YWx1ZXMgYXJlIGVuY29kZWQgZGlyZWN0bHkgaW4gdGhlIGZpZWxkIGhlYWRlci4gRWxlbWVudCB2YWx1ZXMgb2YgdHlwZSBgYm9vbGAgYXJlIHNlbnQgYXMgYW4gaW50ODsKK3RydWUgYXMgYDFgIGFuZCBmYWxzZSBhcyBgMGAuCisKKyMjIE1lc3NhZ2UKKworQSBgTWVzc2FnZWAgb24gdGhlIHdpcmUgbG9va3MgYXMgZm9sbG93czoKKworYGBgCitDb21wYWN0IHByb3RvY29sIE1lc3NhZ2UgKDQrIGJ5dGVzKToKKystLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSsKK3xwcHBwcHBwcHxtbW12dnZ2dnwgc2VxIGlkICAgICAgICAgICAgICB8IG5hbWUgbGVuZ3RoICAgICAgICAgfCBuYW1lICAgICAgICAgICAgICAgIHwKKystLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSsKK2BgYAorCitXaGVyZToKKworKiBgcHBwcHBwcHBgIGlzIHRoZSBwcm90b2NvbCBpZCwgZml4ZWQgdG8gYDEwMDAgMDAxMGAsIDB4ODIuCisqIGBtbW1gIGlzIHRoZSBtZXNzYWdlIHR5cGUsIGFuIHVuc2lnbmVkIDMgYml0IGludGVnZXIuCisqIGB2dnZ2dmAgaXMgdGhlIHZlcnNpb24sIGFuIHVuc2lnbmVkIDUgYml0IGludGVnZXIsIGZpeGVkIHRvIGAwMDAwMWAuCisqIGBzZXEgaWRgIGlzIHRoZSBzZXF1ZW5jZSBpZCwgYSBzaWduZWQgMzIgYml0IGludGVnZXIgZW5jb2RlZCBhcyBhIHZhciBpbnQuCisqIGBuYW1lIGxlbmd0aGAgaXMgdGhlIGJ5dGUgbGVuZ3RoIG9mIHRoZSBuYW1lIGZpZWxkLCBhIHNpZ25lZCAzMiBiaXQgaW50ZWdlciBlbmNvZGVkIGFzIGEgdmFyIGludCAobXVzdCBiZSA+PSAwKS4KKyogYG5hbWVgIGlzIHRoZSBtZXRob2QgbmFtZSB0byBpbnZva2UsIGEgVVRGLTggZW5jb2RlZCBzdHJpbmcuCisKK01lc3NhZ2UgdHlwZXMgYXJlIGVuY29kZWQgd2l0aCB0aGUgZm9sbG93aW5nIHZhbHVlczoKKworKiBfQ2FsbF86IDEKKyogX1JlcGx5XzogMgorKiBfRXhjZXB0aW9uXzogMworKiBfT25ld2F5XzogNAorCisjIyMgU3RydWN0CisKK0EgKlN0cnVjdCogaXMgYSBzZXF1ZW5jZSBvZiB6ZXJvIG9yIG1vcmUgZmllbGRzLCBmb2xsb3dlZCBieSBhIHN0b3AgZmllbGQuIEVhY2ggZmllbGQgc3RhcnRzIHdpdGggYSBmaWVsZCBoZWFkZXIgYW5kCitpcyBmb2xsb3dlZCBieSB0aGUgZW5jb2RlZCBmaWVsZCB2YWx1ZS4gVGhlIGVuY29kaW5nIGNhbiBiZSBzdW1tYXJpemVkIGJ5IHRoZSBmb2xsb3dpbmcgQk5GOgorCitgYGAKK3N0cnVjdCAgICAgICAgOjo9ICggZmllbGQtaGVhZGVyIGZpZWxkLXZhbHVlICkqIHN0b3AtZmllbGQKK2ZpZWxkLWhlYWRlciAgOjo9IGZpZWxkLXR5cGUgZmllbGQtaWQKK2BgYAorCitCZWNhdXNlIGVhY2ggZmllbGQgaGVhZGVyIGNvbnRhaW5zIHRoZSBmaWVsZC1pZCAoYXMgZGVmaW5lZCBieSB0aGUgVGhyaWZ0IElETCBmaWxlKSwgdGhlIGZpZWxkcyBjYW4gYmUgZW5jb2RlZCBpbiBhbnkKK29yZGVyLiBUaHJpZnQncyB0eXBlIHN5c3RlbSBpcyBub3QgZXh0ZW5zaWJsZTsgeW91IGNhbiBvbmx5IGVuY29kZSB0aGUgcHJpbWl0aXZlIHR5cGVzIGFuZCBzdHJ1Y3RzLiBUaGVyZWZvcmUgaXMgYWxzbworcG9zc2libGUgdG8gaGFuZGxlIHVua25vd24gZmllbGRzIHdoaWxlIGRlY29kaW5nOyB0aGVzZSBhcmUgc2ltcGx5IGlnbm9yZWQuIFdoaWxlIGRlY29kaW5nIHRoZSBmaWVsZCB0eXBlIGNhbiBiZSB1c2VkIHRvCitkZXRlcm1pbmUgaG93IHRvIGRlY29kZSB0aGUgZmllbGQgdmFsdWUuCisKK05vdGUgdGhhdCB0aGUgZmllbGQgbmFtZSBpcyBub3QgZW5jb2RlZCBzbyBmaWVsZCByZW5hbWVzIGluIHRoZSBJREwgZG8gbm90IGFmZmVjdCBmb3J3YXJkIGFuZCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorCitUaGUgZGVmYXVsdCBKYXZhIGltcGxlbWVudGF0aW9uIChBcGFjaGUgVGhyaWZ0IDAuOS4xKSBoYXMgdW5kZWZpbmVkIGJlaGF2aW9yIHdoZW4gaXQgdHJpZXMgdG8gZGVjb2RlIGEgZmllbGQgdGhhdCBoYXMKK2Fub3RoZXIgZmllbGQtdHlwZSB0aGFuIHdoYXQgaXMgZXhwZWN0ZWQuIFRoZW9yZXRpY2FsbHkgdGhpcyBjb3VsZCBiZSBkZXRlY3RlZCBhdCB0aGUgY29zdCBvZiBzb21lIGFkZGl0aW9uYWwgY2hlY2tpbmcuCitPdGhlciBpbXBsZW1lbnRhdGlvbiBtYXkgcGVyZm9ybSB0aGlzIGNoZWNrIGFuZCB0aGVuIGVpdGhlciBpZ25vcmUgdGhlIGZpZWxkLCBvciByZXR1cm4gYSBwcm90b2NvbCBleGNlcHRpb24uCisKK0EgKlVuaW9uKiBpcyBlbmNvZGVkIGV4YWN0bHkgdGhlIHNhbWUgYXMgYSBzdHJ1Y3Qgd2l0aCB0aGUgYWRkaXRpb25hbCByZXN0cmljdGlvbiB0aGF0IGF0IG1vc3QgMSBmaWVsZCBtYXkgYmUgZW5jb2RlZC4KKworQW4gKkV4Y2VwdGlvbiogaXMgZW5jb2RlZCBleGFjdGx5IHRoZSBzYW1lIGFzIGEgc3RydWN0LgorCisjIyMgU3RydWN0IGVuY29kaW5nCisKK2BgYAorQ29tcGFjdCBwcm90b2NvbCBmaWVsZCBoZWFkZXIgKHNob3J0IGZvcm0pIGFuZCBmaWVsZCB2YWx1ZToKKystLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rCit8ZGRkZHR0dHR8IGZpZWxkIHZhbHVlICAgICAgICAgfAorKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSsKKworQ29tcGFjdCBwcm90b2NvbCBmaWVsZCBoZWFkZXIgKDEgdG8gMyBieXRlcywgbG9uZyBmb3JtKSBhbmQgZmllbGQgdmFsdWU6CisrLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSsKK3wwMDAwdHR0dHwgZmllbGQgaWQgICAgICAgICAgICB8IGZpZWxkIHZhbHVlICAgICAgICAgfAorKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rCisKK0NvbXBhY3QgcHJvdG9jb2wgc3RvcCBmaWVsZDoKKystLS0tLS0tLSsKK3wwMDAwMDAwMHwKKystLS0tLS0tLSsKK2BgYAorCitXaGVyZToKKworKiBgZGRkZGAgaXMgdGhlIGZpZWxkIGlkIGRlbHRhLCBhbiB1bnNpZ25lZCA0IGJpdHMgaW50ZWdlciwgc3RyaWN0bHkgcG9zaXRpdmUuCisqIGB0dHR0YCBpcyBmaWVsZC10eXBlIGlkLCBhbiB1bnNpZ25lZCA0IGJpdCBpbnRlZ2VyLgorKiBgZmllbGQgaWRgIHRoZSBmaWVsZCBpZCwgYSBzaWduZWQgMTYgYml0IGludGVnZXIgZW5jb2RlZCBhcyB6aWd6YWcgaW50LgorKiBgZmllbGQtdmFsdWVgIHRoZSBlbmNvZGVkIGZpZWxkIHZhbHVlLgorCitUaGUgZmllbGQgaWQgZGVsdGEgY2FuIGJlIGNvbXB1dGVkIGJ5IGBjdXJyZW50LWZpZWxkLWlkIC0gcHJldmlvdXMtZmllbGQtaWRgLCBvciBqdXN0IGBjdXJyZW50LWZpZWxkLWlkYCBpZiB0aGlzIGlzIHRoZQorZmlyc3Qgb2YgdGhlIHN0cnVjdC4gVGhlIHNob3J0IGZvcm0gc2hvdWxkIGJlIHVzZWQgd2hlbiB0aGUgZmllbGQgaWQgZGVsdGEgaXMgaW4gdGhlIHJhbmdlIDEgLSAxNSAoaW5jbHVzaXZlKS4KKworVGhlIGZvbGxvd2luZyBmaWVsZC10eXBlcyBjYW4gYmUgZW5jb2RlZDoKKworKiBgQk9PTEVBTl9UUlVFYCwgZW5jb2RlZCBhcyBgMWAKKyogYEJPT0xFQU5fRkFMU0VgLCBlbmNvZGVkIGFzIGAyYAorKiBgQllURWAsIGVuY29kZWQgYXMgYDNgCisqIGBJMTZgLCBlbmNvZGVkIGFzIGA0YAorKiBgSTMyYCwgZW5jb2RlZCBhcyBgNWAKKyogYEk2NGAsIGVuY29kZWQgYXMgYDZgCisqIGBET1VCTEVgLCBlbmNvZGVkIGFzIGA3YAorKiBgQklOQVJZYCwgdXNlZCBmb3IgYmluYXJ5IGFuZCBzdHJpbmcgZmllbGRzLCBlbmNvZGVkIGFzIGA4YAorKiBgTElTVGAsIGVuY29kZWQgYXMgYDlgCisqIGBTRVRgLCBlbmNvZGVkIGFzIGAxMGAKKyogYE1BUGAsIGVuY29kZWQgYXMgYDExYAorKiBgU1RSVUNUYCwgdXNlZCBmb3IgYm90aCBzdHJ1Y3RzIGFuZCB1bmlvbiBmaWVsZHMsIGVuY29kZWQgYXMgYDEyYAorCitOb3RlIHRoYXQgYmVjYXVzZSB0aGVyZSBhcmUgMiBzcGVjaWZpYyBmaWVsZCB0eXBlcyBmb3IgdGhlIGJvb2xlYW4gdmFsdWVzLCB0aGUgZW5jb2Rpbmcgb2YgYSBib29sZWFuIGZpZWxkIHZhbHVlIGhhcyBubworbGVuZ3RoICgwIGJ5dGVzKS4KKworIyMgTGlzdCBhbmQgU2V0CisKK0xpc3QgYW5kIHNldHMgYXJlIGVuY29kZWQgdGhlIHNhbWU6IGEgaGVhZGVyIGluZGljYXRpbmcgdGhlIHNpemUgYW5kIHRoZSBlbGVtZW50LXR5cGUgb2YgdGhlIGVsZW1lbnRzLCBmb2xsb3dlZCBieSB0aGUKK2VuY29kZWQgZWxlbWVudHMuCisKK2BgYAorQ29tcGFjdCBwcm90b2NvbCBsaXN0IGhlYWRlciAoMSBieXRlLCBzaG9ydCBmb3JtKSBhbmQgZWxlbWVudHM6CisrLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKworfHNzc3N0dHR0fCBlbGVtZW50cyAgICAgICAgICAgIHwKKystLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rCisKK0NvbXBhY3QgcHJvdG9jb2wgbGlzdCBoZWFkZXIgKDIrIGJ5dGVzLCBsb25nIGZvcm0pIGFuZCBlbGVtZW50czoKKystLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKworfDExMTF0dHR0fCBzaXplICAgICAgICAgICAgICAgIHwgZWxlbWVudHMgICAgICAgICAgICB8CisrLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSsKK2BgYAorCitXaGVyZToKKworKiBgc3Nzc2AgaXMgdGhlIHNpemUsIDQgYml0IHVuc2lnbmVkIGludCwgdmFsdWVzIGAwYCAtIGAxNGAKKyogYHR0dHRgIGlzIHRoZSBlbGVtZW50LXR5cGUsIGEgNCBiaXQgdW5zaWduZWQgaW50CisqIGBzaXplYCBpcyB0aGUgc2l6ZSwgYSB2YXIgaW50IChpbnQzMiksIHBvc2l0aXZlIHZhbHVlcyBgMTVgIG9yIGhpZ2hlcgorKiBgZWxlbWVudHNgIGFyZSB0aGUgZW5jb2RlZCBlbGVtZW50cworCitUaGUgc2hvcnQgZm9ybSBzaG91bGQgYmUgdXNlZCB3aGVuIHRoZSBsZW5ndGggaXMgaW4gdGhlIHJhbmdlIDAgLSAxNCAoaW5jbHVzaXZlKS4KKworVGhlIGZvbGxvd2luZyBlbGVtZW50LXR5cGVzIGFyZSB1c2VkIChub3RlIHRoYXQgdGhlc2UgYXJlIF9kaWZmZXJlbnRfIGZyb20gdGhlIGZpZWxkLXR5cGVzKToKKworKiBgQk9PTGAsIGVuY29kZWQgYXMgYDJgCisqIGBCWVRFYCwgZW5jb2RlZCBhcyBgM2AKKyogYERPVUJMRWAsIGVuY29kZWQgYXMgYDRgCisqIGBJMTZgLCBlbmNvZGVkIGFzIGA2YAorKiBgSTMyYCwgZW5jb2RlZCBhcyBgOGAKKyogYEk2NGAsIGVuY29kZWQgYXMgYDEwYAorKiBgU1RSSU5HYCwgdXNlZCBmb3IgYmluYXJ5IGFuZCBzdHJpbmcgZmllbGRzLCBlbmNvZGVkIGFzIGAxMWAKKyogYFNUUlVDVGAsIHVzZWQgZm9yIHN0cnVjdHMgYW5kIHVuaW9uIGZpZWxkcywgZW5jb2RlZCBhcyBgMTJgCisqIGBNQVBgLCBlbmNvZGVkIGFzIGAxM2AKKyogYFNFVGAsIGVuY29kZWQgYXMgYDE0YAorKiBgTElTVGAsIGVuY29kZWQgYXMgYDE1YAorCisKK1RoZSBtYXhpbXVtIGxpc3Qvc2V0IHNpemUgaXMgY29uZmlndXJhYmxlLiBCeSBkZWZhdWx0IHRoZXJlIGlzIG5vIGxpbWl0IChtZWFuaW5nIHRoZSBsaW1pdCBpcyB0aGUgbWF4aW11bSBpbnQzMiB2YWx1ZToKKzIxNDc0ODM2NDcpLgorCisjIyBNYXAKKworTWFwcyBhcmUgZW5jb2RlZCB3aXRoIGEgaGVhZGVyIGluZGljYXRpbmcgdGhlIHNpemUsIHRoZSB0eXBlIG9mIHRoZSBrZXlzIGFuZCB0aGUgZWxlbWVudC10eXBlIG9mIHRoZSBlbGVtZW50cywgZm9sbG93ZWQKK2J5IHRoZSBlbmNvZGVkIGVsZW1lbnRzLiBUaGUgZW5jb2RpbmcgZm9sbG93cyB0aGlzIEJORjoKKworYGBgCittYXAgICAgICAgICAgIDo6PSBlbXB0eS1tYXAgfCBub24tZW1wdHktbWFwCitlbXB0eS1tYXAgICAgIDo6PSBgMGAKK25vbi1lbXB0eS1tYXAgOjo9IHNpemUga2V5LWVsZW1lbnQtdHlwZSB2YWx1ZS1lbGVtZW50LXR5cGUgKGtleSB2YWx1ZSkrCitgYGAKKworYGBgCitDb21wYWN0IHByb3RvY29sIG1hcCBoZWFkZXIgKDEgYnl0ZSwgZW1wdHkgbWFwKToKKystLS0tLS0tLSsKK3wwMDAwMDAwMHwKKystLS0tLS0tLSsKKworQ29tcGFjdCBwcm90b2NvbCBtYXAgaGVhZGVyICgyKyBieXRlcywgbm9uIGVtcHR5IG1hcCkgYW5kIGtleSB2YWx1ZSBwYWlyczoKKystLS0tLS0tLSsuLi4rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKworfCBzaXplICAgICAgICAgICAgICAgIHxra2trdnZ2dnwga2V5IHZhbHVlIHBhaXJzICAgICB8CisrLS0tLS0tLS0rLi4uKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSsKK2BgYAorCitXaGVyZToKKworKiBgc2l6ZWAgaXMgdGhlIHNpemUsIGEgdmFyIGludCAoaW50MzIpLCBzdHJpY3RseSBwb3NpdGl2ZSB2YWx1ZXMKKyogYGtra2tgIGlzIHRoZSBrZXkgZWxlbWVudC10eXBlLCBhIDQgYml0IHVuc2lnbmVkIGludAorKiBgdnZ2dmAgaXMgdGhlIHZhbHVlIGVsZW1lbnQtdHlwZSwgYSA0IGJpdCB1bnNpZ25lZCBpbnQKKyogYGtleSB2YWx1ZSBwYWlyc2AgYXJlIHRoZSBlbmNvZGVkIGtleXMgYW5kIHZhbHVlcworCitUaGUgZWxlbWVudC10eXBlcyBhcmUgdGhlIHNhbWUgYXMgZm9yIGxpc3RzLiBUaGUgZnVsbCBsaXN0IGlzIGluY2x1ZGVkIGluIHRoZSAnTGlzdCBhbmQgc2V0JyBzZWN0aW9uLgorCitUaGUgbWF4aW11bSBtYXAgc2l6ZSBpcyBjb25maWd1cmFibGUuIEJ5IGRlZmF1bHQgdGhlcmUgaXMgbm8gbGltaXQgKG1lYW5pbmcgdGhlIGxpbWl0IGlzIHRoZSBtYXhpbXVtIGludDMyIHZhbHVlOgorMjE0NzQ4MzY0NykuCisKKyMgQk5GIG5vdGF0aW9uIHVzZWQgaW4gdGhpcyBkb2N1bWVudAorCitUaGUgZm9sbG93aW5nIEJORiBub3RhdGlvbiBpcyB1c2VkOgorCisqIGEgcGx1cyBgK2AgYXBwZW5kZWQgdG8gYW4gaXRlbSByZXByZXNlbnRzIHJlcGV0aXRpb247IHRoZSBpdGVtIGlzIHJlcGVhdGVkIDEgb3IgbW9yZSB0aW1lcworKiBhIHN0YXIgYCpgIGFwcGVuZGVkIHRvIGFuIGl0ZW0gcmVwcmVzZW50cyBvcHRpb25hbCByZXBldGl0aW9uOyB0aGUgaXRlbSBpcyByZXBlYXRlZCAwIG9yIG1vcmUgdGltZXMKKyogYSBwaXBlIGB8YCBiZXR3ZWVuIGl0ZW1zIHJlcHJlc2VudHMgY2hvaWNlLCB0aGUgZmlyc3QgbWF0Y2hpbmcgaXRlbSBpcyBzZWxlY3RlZAorKiBwYXJlbnRoZXNpcyBgKGAgYW5kIGApYCBhcmUgdXNlZCBmb3IgZ3JvdXBpbmcgbXVsdGlwbGUgaXRlbXMKZGlmZiAtLWdpdCBhL2RvYy9zcGVjcy90aHJpZnQtcHJvdG9jb2wtc3BlYy5tZCBiL2RvYy9zcGVjcy90aHJpZnQtcHJvdG9jb2wtc3BlYy5tZAppbmRleCA5NTBlMTYzLi4wYzFhNjFjIDEwMDY0NAotLS0gYS9kb2Mvc3BlY3MvdGhyaWZ0LXByb3RvY29sLXNwZWMubWQKKysrIGIvZG9jL3NwZWNzL3RocmlmdC1wcm90b2NvbC1zcGVjLm1kCkBAIC0zLDYgKzMsNyBAQAogCiBMYXN0IE1vZGlmaWVkOiAyMDA3LUp1bi0yOQogCis8IS0tCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCkBAIC0yMyw2ICsyNCw3IEBACiB1bmRlciB0aGUgTGljZW5zZS4KIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tPgogCiBUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgc3RydWN0dXJlIG9mIHRoZSBUaHJpZnQgcHJvdG9jb2wKIHdpdGhvdXQgc3BlY2lmeWluZyB0aGUgZW5jb2RpbmcuIFRodXMsIHRoZSBvcmRlciBvZiBlbGVtZW50cwpkaWZmIC0tZ2l0IGEvZG9jL3NwZWNzL3RocmlmdC1ycGMubWQgYi9kb2Mvc3BlY3MvdGhyaWZ0LXJwYy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDVjMDZmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NwZWNzL3RocmlmdC1ycGMubWQKQEAgLTAsMCArMSwxNzggQEAKK1RocmlmdCBSZW1vdGUgUHJvY2VkdXJlIENhbGwKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworPCEtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK2Rpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCitzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwordW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLT4KKworVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIGhpZ2ggbGV2ZWwgbWVzc2FnZSBleGNoYW5nZSBiZXR3ZWVuIHRoZSBUaHJpZnQgUlBDIGNsaWVudCBhbmQgc2VydmVyLgorU2VlIFt0aHJpZnQtYmluYXJ5LXByb3RvY29sLm1kXSBhbmQgW3RocmlmdC1jb21wYWN0LXByb3RvY29sLm1kXSBmb3IgYSBkZXNjcmlwdGlvbiBvZiBob3cgdGhlIGV4Y2hhbmdlcyBhcmUgZW5jb2RlZCBvbgordGhlIHdpcmUuCisKK0luIGFkZGl0aW9uLCB0aGlzIGRvY3VtZW50IGNvbXBhcmVzIHRoZSBiaW5hcnkgcHJvdG9jb2wgd2l0aCB0aGUgY29tcGFjdCBwcm90b2NvbC4gRmluYWxseSBpdCBkZXNjcmliZXMgdGhlIGZyYW1lZCB2cy4KK3VuZnJhbWVkIHRyYW5zcG9ydC4KKworVGhlIGluZm9ybWF0aW9uIGhlcmUgaXMgX21vc3RseV8gYmFzZWQgb24gdGhlIEphdmEgaW1wbGVtZW50YXRpb24gaW4gdGhlIEFwYWNoZSB0aHJpZnQgbGlicmFyeSAodmVyc2lvbiAwLjkuMSBhbmQKKzAuOS4zKS4gT3RoZXIgaW1wbGVtZW50YXRpb24gaG93ZXZlciwgc2hvdWxkIGJlaGF2ZSB0aGUgc2FtZS4KKworRm9yIGJhY2tncm91bmQgb24gVGhyaWZ0IHNlZSB0aGUgW1RocmlmdCB3aGl0ZXBhcGVyIChwZGYpXShodHRwczovL3RocmlmdC5hcGFjaGUub3JnL3N0YXRpYy9maWxlcy90aHJpZnQtMjAwNzA0MDEucGRmKS4KKworIyBDb250ZW50cworCisqIFRocmlmdCBNZXNzYWdlIGV4Y2hhbmdlIGZvciBSZW1vdGUgUHJvY2VkdXJlIENhbGwKKyAgKiBNZXNzYWdlCisgICogUmVxdWVzdCBzdHJ1Y3QKKyAgKiBSZXNwb25zZSBzdHJ1Y3QKKyogUHJvdG9jb2wgY29uc2lkZXJhdGlvbnMKKyAgKiBDb21wYXJpbmcgYmluYXJ5IGFuZCBjb21wYWN0IHByb3RvY29sCisgICogQ29tcGF0aWJpbGl0eQorICAqIEZyYW1lZCB2cyB1bmZyYW1lZCB0cmFuc3BvcnQKKworIyBUaHJpZnQgUmVtb3RlIFByb2NlZHVyZSBDYWxsIE1lc3NhZ2UgZXhjaGFuZ2UKKworQm90aCB0aGUgYmluYXJ5IHByb3RvY29sIGFuZCB0aGUgY29tcGFjdCBwcm90b2NvbCBhc3N1bWUgYSB0cmFuc3BvcnQgbGF5ZXIgdGhhdCBleHBvc2VzIGEgYmktZGlyZWN0aW9uYWwgYnl0ZSBzdHJlYW0sCitmb3IgZXhhbXBsZSBhIFRDUCBzb2NrZXQuIEJvdGggdXNlIHRoZSBmb2xsb3dpbmcgZXhjaGFuZ2U6CisKKzEuIENsaWVudCBzZW5kcyBhIGBNZXNzYWdlYCAodHlwZSBgQ2FsbGAgb3IgYE9uZXdheWApLiBUaGUgVE1lc3NhZ2UgY29udGFpbnMgc29tZSBtZXRhZGF0YSBhbmQgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZAorICAgdG8gaW52b2tlLgorMi4gQ2xpZW50IHNlbmRzIG1ldGhvZCBhcmd1bWVudHMgKGEgc3RydWN0IGRlZmluZWQgYnkgdGhlIGdlbmVyYXRlIGNvZGUpLgorMy4gU2VydmVyIHNlbmRzIGEgYE1lc3NhZ2VgICh0eXBlIGBSZXBseWAgb3IgYEV4Y2VwdGlvbmApIHRvIHN0YXJ0IHRoZSByZXNwb25zZS4KKzQuIFNlcnZlciBzZW5kcyBhIHN0cnVjdCBjb250YWluaW5nIHRoZSBtZXRob2QgcmVzdWx0IG9yIGV4Y2VwdGlvbi4KKworVGhlIHBhdHRlcm4gaXMgYSBzaW1wbGUgaGFsZiBkdXBsZXggcHJvdG9jb2wgd2hlcmUgdGhlIHBhcnRpZXMgYWx0ZXJuYXRlIGluIHNlbmRpbmcgYSBgTWVzc2FnZWAgZm9sbG93ZWQgYnkgYSBzdHJ1Y3QuCitXaGF0IHRoZXNlIGFyZSBpcyBkZXNjcmliZWQgYmVsb3cuCisKK0FsdGhvdWdoIHRoZSBzdGFuZGFyZCBBcGFjaGUgVGhyaWZ0IEphdmEgY2xpZW50cyBkbyBub3Qgc3VwcG9ydCBwaXBlbGluaW5nIChzZW5kaW5nIG11bHRpcGxlIHJlcXVlc3RzIHdpdGhvdXQgd2FpdGluZworZm9yIGFuIHJlc3BvbnNlKSwgdGhlIHN0YW5kYXJkIEFwYWNoZSBUaHJpZnQgSmF2YSBzZXJ2ZXJzIGRvIHN1cHBvcnQgaXQuCisKKyMjIE1lc3NhZ2UKKworQSAqTWVzc2FnZSogY29udGFpbnM6CisKKyogX05hbWVfLCBhIHN0cmluZyAoY2FuIGJlIGVtcHR5KS4KKyogX01lc3NhZ2UgdHlwZV8sIGEgbWVzc2FnZSB0eXBlcywgb25lIG9mIGBDYWxsYCwgYFJlcGx5YCwgYEV4Y2VwdGlvbmAgYW5kIGBPbmV3YXlgLgorKiBfU2VxdWVuY2UgaWRfLCBhIHNpZ25lZCBpbnQzMiBpbnRlZ2VyLgorCitUaGUgKnNlcXVlbmNlIGlkKiBpcyBhIHNpbXBsZSBtZXNzYWdlIGlkIGFzc2lnbmVkIGJ5IHRoZSBjbGllbnQuIFRoZSBzZXJ2ZXIgd2lsbCB1c2UgdGhlIHNhbWUgc2VxdWVuY2UgaWQgaW4gdGhlCittZXNzYWdlIG9mIHRoZSByZXNwb25zZS4gVGhlIGNsaWVudCB1c2VzIHRoaXMgbnVtYmVyIHRvIGRldGVjdCBvdXQgb2Ygb3JkZXIgcmVzcG9uc2VzLiBFYWNoIGNsaWVudCBoYXMgYW4gaW50MzIgZmllbGQKK3doaWNoIGlzIGluY3JlYXNlZCBmb3IgZWFjaCBtZXNzYWdlLiBUaGUgc2VxdWVuY2UgaWQgc2ltcGx5IHdyYXBzIGFyb3VuZCB3aGVuIGl0IG92ZXJmbG93cy4KKworVGhlICpuYW1lKiBpbmRpY2F0ZXMgdGhlIHNlcnZpY2UgbWV0aG9kIG5hbWUgdG8gaW52b2tlLiBUaGUgc2VydmVyIGNvcGllcyB0aGUgbmFtZSBpbiB0aGUgcmVzcG9uc2UgbWVzc2FnZS4KKworV2hlbiB0aGUgKm11bHRpcGxleGVkIHByb3RvY29sKiBpcyB1c2VkLCB0aGUgbmFtZSBjb250YWlucyB0aGUgc2VydmljZSBuYW1lLCBhIGNvbG9uIGA6YCBhbmQgdGhlIG1ldGhvZCBuYW1lLiBUaGUKK211bHRpcGxleGVkIHByb3RvY29sIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggb3RoZXIgcHJvdG9jb2xzLgorCitUaGUgKm1lc3NhZ2UgdHlwZSogaW5kaWNhdGVzIHdoYXQga2luZCBvZiBtZXNzYWdlIGlzIHNlbnQuIENsaWVudHMgc2VuZCByZXF1ZXN0cyB3aXRoIFRNZXNzYWdlcyBvZiB0eXBlIGBDYWxsYCBvcgorYE9uZXdheWAgKHN0ZXAgMSBpbiB0aGUgcHJvdG9jb2wgZXhjaGFuZ2UpLiBTZXJ2ZXJzIHNlbmQgcmVzcG9uc2VzIHdpdGggbWVzc2FnZXMgb2YgdHlwZSBgRXhjZXB0aW9uYCBvciBgUmVwbHlgIChzdGVwCiszKS4KKworVHlwZSBgUmVwbHlgIGlzIHVzZWQgd2hlbiB0aGUgc2VydmljZSBtZXRob2QgY29tcGxldGVzIG5vcm1hbGx5LiBUaGF0IGlzLCBpdCByZXR1cm5zIGEgdmFsdWUgb3IgaXQgdGhyb3dzIG9uZSBvZiB0aGUKK2V4Y2VwdGlvbnMgZGVmaW5lZCBpbiB0aGUgVGhyaWZ0IElETCBmaWxlLgorCitUeXBlIGBFeGNlcHRpb25gIGlzIHVzZWQgZm9yIG90aGVyIGV4Y2VwdGlvbnMuIFRoYXQgaXM6IHdoZW4gdGhlIHNlcnZpY2UgbWV0aG9kIHRocm93cyBhbiBleGNlcHRpb24gdGhhdCBpcyBub3QgZGVjbGFyZWQKK2luIHRoZSBUaHJpZnQgSURMIGZpbGUsIG9yIHNvbWUgb3RoZXIgcGFydCBvZiB0aGUgVGhyaWZ0IHN0YWNrIHRocm93cyBhbiBleGNlcHRpb24uIEZvciBleGFtcGxlIHdoZW4gdGhlIHNlcnZlciBjb3VsZAorbm90IGVuY29kZSBvciBkZWNvZGUgYSBtZXNzYWdlIG9yIHN0cnVjdC4KKworSW4gdGhlIEphdmEgaW1wbGVtZW50YXRpb24gKDAuOS4zKSB0aGVyZSBpcyBkaWZmZXJlbnQgYmVoYXZpb3IgZm9yIHRoZSBzeW5jaHJvbm91cyBhbmQgYXN5bmNocm9ub3VzIHNlcnZlci4gSW4gdGhlIGFzeW5jCitzZXJ2ZXIgYWxsIGV4Y2VwdGlvbnMgYXJlIHNlbmQgYXMgYSBgVEFwcGxpY2F0aW9uRXhjZXB0aW9uYCAoc2VlICdSZXNwb25zZSBzdHJ1Y3QnIGJlbG93KS4gSW4gdGhlIHN5bmNocm9ub3VzIEphdmEKK2ltcGxlbWVudGF0aW9uIG9ubHkgKHVuZGVjbGFyZWQpIGV4Y2VwdGlvbnMgdGhhdCBleHRlbmQgYFRFeGNlcHRpb25gIGFyZSBzZW5kIGFzIGEgYFRBcHBsaWNhdGlvbkV4Y2VwdGlvbmAuIFVuY2hlY2tlZAorZXhjZXB0aW9ucyBsZWFkIHRvIGFuIGltbWVkaWF0ZSBjbG9zZSBvZiB0aGUgY29ubmVjdGlvbi4KKworVHlwZSBgT25ld2F5YCBpcyBvbmx5IHVzZWQgc3RhcnRpbmcgZnJvbSBBcGFjaGUgVGhyaWZ0IDAuOS4zLiBFYXJsaWVyIHZlcnNpb25zIGRvIF9ub3RfIHNlbmQgVE1lc3NhZ2VzIG9mIHR5cGUgYE9uZXdheWAsCitldmVuIGZvciBzZXJ2aWNlIG1ldGhvZHMgZGVmaW5lZCB3aXRoIHRoZSBgb25ld2F5YCBtb2RpZmllci4KKworV2hlbiBjbGllbnQgc2VuZHMgYSByZXF1ZXN0IHdpdGggdHlwZSBgT25ld2F5YCwgdGhlIHNlcnZlciBtdXN0IF9ub3RfIHNlbmQgYSByZXNwb25zZSAoc3RlcHMgMyBhbmQgNCBhcmUgc2tpcHBlZCkuIE5vdGUKK3RoYXQgdGhlIFRocmlmdCBJREwgZW5mb3JjZXMgYSByZXR1cm4gdHlwZSBvZiBgdm9pZGAgYW5kIGRvZXMgbm90IGFsbG93IGV4Y2VwdGlvbnMgZm9yIG9uZXdheSBzZXJ2aWNlcy4KKworIyMgUmVxdWVzdCBzdHJ1Y3QKKworVGhlIHN0cnVjdCB0aGF0IGZvbGxvd3MgdGhlIG1lc3NhZ2Ugb2YgdHlwZSBgQ2FsbGAgb3IgYE9uZXdheWAgY29udGFpbnMgdGhlIGFyZ3VtZW50cyBvZiB0aGUgc2VydmljZSBtZXRob2QuIFRoZQorYXJndW1lbnQgaWRzIGNvcnJlc3BvbmQgdG8gdGhlIGZpZWxkIGlkcy4gVGhlIG5hbWUgb2YgdGhlIHN0cnVjdCBpcyB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIHdpdGggYF9hcmdzYCBhcHBlbmRlZC4KK0ZvciBtZXRob2RzIHdpdGhvdXQgYXJndW1lbnRzIGFuIHN0cnVjdCBpcyBzZW50IHdpdGhvdXQgZmllbGRzLgorCisjIyBSZXNwb25zZSBzdHJ1Y3QKKworVGhlIHN0cnVjdCB0aGF0IGZvbGxvd3MgdGhlIG1lc3NhZ2Ugb2YgdHlwZSBgUmVwbHlgIGFyZSBzdHJ1Y3RzIGluIHdoaWNoIGV4YWN0bHkgMSBvZiB0aGUgZm9sbG93aW5nIGZpZWxkcyBpcyBlbmNvZGVkOgorCisqIEEgZmllbGQgd2l0aCBuYW1lIGBzdWNjZXNzYCBhbmQgaWQgYDBgLCB1c2VkIGluIGNhc2UgdGhlIG1ldGhvZCBjb21wbGV0ZWQgbm9ybWFsbHkuCisqIEFuIGV4Y2VwdGlvbiBmaWVsZCwgbmFtZSBhbmQgaWQgYXJlIGFzIGRlZmluZWQgaW4gdGhlIGB0aHJvd3NgIGNsYXVzZSBpbiB0aGUgVGhyaWZ0IElETCdzIHNlcnZpY2UgbWV0aG9kIGRlZmluaXRpb24uCisKK1doZW4gdGhlIG1lc3NhZ2UgaXMgb2YgdHlwZSBgRXhjZXB0aW9uYCB0aGUgc3RydWN0IGlzIGVuY29kZWQgYXMgaWYgaXQgd2FzIGRlY2xhcmVkIGJ5IHRoZSBmb2xsb3dpbmcgSURMOgorCitgYGAKK2V4Y2VwdGlvbiBUQXBwbGljYXRpb25FeGNlcHRpb24geworICAxOiBzdHJpbmcgbWVzc2FnZSwKKyAgMjogaTMyIHR5cGUKK30KK2BgYAorCitUaGUgZm9sbG93aW5nIGV4Y2VwdGlvbiB0eXBlcyBhcmUgZGVmaW5lZCBpbiB0aGUgamF2YSBpbXBsZW1lbnRhdGlvbiAoMC45LjMpOgorCisqIF91bmtub3duXzogMCwgdXNlZCBpbiBjYXNlIHRoZSB0eXBlIGZyb20gdGhlIHBlZXIgaXMgdW5rbm93bi4KKyogX3Vua25vd24gbWV0aG9kXzogMSwgdXNlZCBpbiBjYXNlIHRoZSBtZXRob2QgcmVxdWVzdGVkIGJ5IHRoZSBjbGllbnQgaXMgdW5rbm93biBieSB0aGUgc2VydmVyLgorKiBfaW52YWxpZCBtZXNzYWdlIHR5cGVfOiAyLCBubyB1c2FnZSB3YXMgZm91bmQuCisqIF93cm9uZyBtZXRob2QgbmFtZV86IDMsIG5vIHVzYWdlIHdhcyBmb3VuZC4KKyogX2JhZCBzZXF1ZW5jZSBpZF86IDQsIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgY2xpZW50IHRvIGluZGljYXRlIGEgd3Jvbmcgc2VxdWVuY2UgaWQgaW4gdGhlIHJlc3BvbnNlLgorKiBfbWlzc2luZyByZXN1bHRfOiA1LCB1c2VkIGludGVybmFsbHkgYnkgdGhlIGNsaWVudCB0byBpbmRpY2F0ZSBhIHJlc3BvbnNlIHdpdGhvdXQgYW55IGZpZWxkIChyZXN1bHQgbm9yIGV4Y2VwdGlvbikuCisqIF9pbnRlcm5hbCBlcnJvcl86IDYsIHVzZWQgd2hlbiB0aGUgc2VydmVyIHRocm93cyBhbiBleGNlcHRpb24gdGhhdCBpcyBub3QgZGVjbGFyZWQgaW4gdGhlIFRocmlmdCBJREwgZmlsZS4gCisqIF9wcm90b2NvbCBlcnJvcl86IDcsIHVzZWQgd2hlbiBzb21ldGhpbmcgZ29lcyB3cm9uZyBkdXJpbmcgZGVjb2RpbmcuIEZvciBleGFtcGxlIHdoZW4gYSBsaXN0IGlzIHRvbyBsb25nIG9yIGEgcmVxdWlyZWQKKyBmaWVsZCBpcyBtaXNzaW5nLiAKKyogX2ludmFsaWQgdHJhbnNmb3JtXzogOCwgbm8gdXNhZ2Ugd2FzIGZvdW5kLgorKiBfaW52YWxpZCBwcm90b2NvbF86IDksIG5vIHVzYWdlIHdhcyBmb3VuZC4KKyogX3Vuc3VwcG9ydGVkIGNsaWVudCB0eXBlXzogMTAsIG5vIHVzYWdlIHdhcyBmb3VuZC4KKworIyBQcm90b2NvbCBjb25zaWRlcmF0aW9ucworCisjIyBDb21wYXJpbmcgYmluYXJ5IGFuZCBjb21wYWN0IHByb3RvY29sCisKK1RoZSBiaW5hcnkgcHJvdG9jb2wgaXMgZmFpcmx5IHNpbXBsZSBhbmQgdGhlcmVmb3JlIGVhc3kgdG8gcHJvY2Vzcy4gVGhlIGNvbXBhY3QgcHJvdG9jb2wgbmVlZHMgbGVzcyBieXRlcyB0byBzZW5kIHRoZQorc2FtZSBkYXRhIGF0IHRoZSBjb3N0IG9mIGFkZGl0aW9uYWwgcHJvY2Vzc2luZy4gQXMgYmFuZHdpZHRoIGlzIHVzdWFsbHkgdGhlIGJvdHRsZW5lY2ssIHRoZSBjb21wYWN0IHByb3RvY29sIGlzIGFsbW9zdAorYWx3YXlzIHNsaWdodGx5IGZhc3Rlci4KKworIyMgQ29tcGF0aWJpbGl0eQorCitBIHNlcnZlciBjb3VsZCBhdXRvbWF0aWNhbGx5IGRldGVybWluZSB3aGV0aGVyIGEgY2xpZW50IHRhbGtzIHRoZSBiaW5hcnkgcHJvdG9jb2wgb3IgdGhlIGNvbXBhY3QgcHJvdG9jb2wgYnkKK2ludmVzdGlnYXRpbmcgdGhlIGZpcnN0IGJ5dGUuIElmIHRoZSB2YWx1ZSBpcyBgMTAwMCAwMDAxYCBvciBgMDAwMCAwMDAwYCAoYXNzdW1pbmcgYSBuYW1lIHNob3J0ZXIgdGhlbiDCsTE2IE1CKSBpdCBpcyB0aGUKK2JpbmFyeSBwcm90b2NvbC4gV2hlbiB0aGUgdmFsdWUgaXMgYDEwMDAgMDAxMGAgaXQgaXMgdGFsa2luZyB0aGUgY29tcGFjdCBwcm90b2NvbC4KKworIyMgRnJhbWVkIHZzLiB1bmZyYW1lZCB0cmFuc3BvcnQKKworVGhlIGZpcnN0IHRocmlmdCBiaW5hcnkgd2lyZSBmb3JtYXQgd2FzIHVuZnJhbWVkLiBUaGlzIG1lYW5zIHRoYXQgaW5mb3JtYXRpb24gaXMgc2VudCBvdXQgaW4gYSBzaW5nbGUgc3RyZWFtIG9mIGJ5dGVzLgorV2l0aCB1bmZyYW1lZCB0cmFuc3BvcnQgdGhlIChnZW5lcmF0ZWQpIHByb2Nlc3NvcnMgd2lsbCByZWFkIGRpcmVjdGx5IGZyb20gdGhlIHNvY2tldCAodGhvdWdoIEFwYWNoZSBUaHJpZnQgZG9lcyB0cnkgdG8KK2dyYWIgYWxsIGF2YWlsYWJsZSBieXRlcyBmcm9tIHRoZSBzb2NrZXQgaW4gYSBidWZmZXIgd2hlbiBpdCBjYW4pLgorCitMYXRlciwgVGhyaWZ0IGludHJvZHVjZWQgdGhlIGZyYW1lZCB0cmFuc3BvcnQuCisKK1dpdGggZnJhbWVkIHRyYW5zcG9ydCB0aGUgZnVsbCByZXF1ZXN0IGFuZCByZXNwb25zZSAodGhlIFRNZXNzYWdlIGFuZCB0aGUgZm9sbG93aW5nIHN0cnVjdCkgYXJlIGZpcnN0IHdyaXR0ZW4gdG8gYQorYnVmZmVyLiBUaGVuIHdoZW4gdGhlIHN0cnVjdCBpcyBjb21wbGV0ZSAodHJhbnNwb3J0IG1ldGhvZCBgZmx1c2hgIGlzIGhpamFja2VkIGZvciB0aGlzKSwgdGhlIGxlbmd0aCBvZiB0aGUgYnVmZmVyIGlzCit3cml0dGVuIHRvIHRoZSBzb2NrZXQgZmlyc3QsIGZvbGxvd2VkIGJ5IHRoZSBidWZmZXJlZCBieXRlcy4gVGhlIGNvbWJpbmF0aW9uIGlzIGNhbGxlZCBhIF9mcmFtZV8uIE9uIHRoZSByZWNlaXZlciBzaWRlCit0aGUgY29tcGxldGUgZnJhbWUgaXMgZmlyc3QgcmVhZCBpbiBhIGJ1ZmZlciBiZWZvcmUgdGhlIG1lc3NhZ2UgaXMgcGFzc2VkIHRvIGEgcHJvY2Vzc29yLgorCitUaGUgbGVuZ3RoIHByZWZpeCBpcyBhIDQgYnl0ZSBzaWduZWQgaW50LCBzZW5kIGluIG5ldHdvcmsgKGJpZyBlbmRpYW4pIG9yZGVyLgorVGhlIGZvbGxvd2luZyBtdXN0IGJlIHRydWU6IGAwYCA8PSBsZW5ndGggPD0gYDE2Mzg0MDAwYCAoMTZNKS4KKworRnJhbWVkIHRyYW5zcG9ydCB3YXMgaW50cm9kdWNlZCB0byBlYXNlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBhc3luYyBwcm9jZXNzb3JzLiBBbiBhc3luYyBwcm9jZXNzb3IgaXMgb25seSBpbnZva2VkIHdoZW4KK2FsbCBkYXRhIGlzIHJlY2VpdmVkLiBVbmZvcnR1bmF0ZWx5LCBmcmFtZWQgdHJhbnNwb3J0IGlzIG5vdCBpZGVhbCBmb3IgbGFyZ2UgbWVzc2FnZXMgYXMgdGhlIGVudGlyZSBmcmFtZSBzdGF5cyBpbgorbWVtb3J5IHVudGlsIHRoZSBtZXNzYWdlIGhhcyBiZWVuIHByb2Nlc3NlZC4gSW4gYWRkaXRpb24sIHRoZSBqYXZhIGltcGxlbWVudGF0aW9uIG1lcmdlcyB0aGUgaW5jb21pbmcgZGF0YSB0byBhIHNpbmdsZSwKK2dyb3dpbmcgYnl0ZSBhcnJheS4gRXZlcnkgdGltZSB0aGUgYnl0ZSBhcnJheSBpcyBmdWxsIGl0IG5lZWRzIHRvIGJlIGNvcGllZCB0byBhIG5ldyBsYXJnZXIgYnl0ZSBhcnJheS4KKworRnJhbWVkIGFuZCB1bmZyYW1lZCB0cmFuc3BvcnRzIGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIGVhY2ggb3RoZXIuCmRpZmYgLS1naXQgYS9kdWIuanNvbiBiL2R1Yi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNzZhZmMKLS0tIC9kZXYvbnVsbAorKysgYi9kdWIuanNvbgpAQCAtMCwwICsxLDI4IEBACit7CisgICJuYW1lIjogImFwYWNoZS10aHJpZnQiLAorICAiZGVzY3JpcHRpb24iOiAiQXBhY2hlIFRocmlmdCBEIGxpYnJhcnkiLAorICAiYXV0aG9ycyI6IFsKKyAgICAiQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+IgorICBdLAorICAiaG9tZXBhZ2UiOiAiaHR0cDovL3RocmlmdC5hcGFjaGUub3JnIiwKKyAgImxpY2Vuc2UiOiAiQXBhY2hlLTIuMCIsCisgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgImxpYmV2ZW50IjogeworICAgICAgInZlcnNpb24iOiAifj4yLjAuMiIKKyAgICB9LAorICAgICJvcGVuc3NsIjogeworICAgICAgInZlcnNpb24iOiAiPj0xLjEuNiIKKyAgICB9CisgIH0sCisgICJzeXN0ZW1EZXBlbmRlbmNpZXMiOiAiT24gc3lzdGVtcyB3aXRoIG5hdGl2ZSBvcGVuc3NsIDEuMC54IHVzZSBkdWIgcGFja2FnZSBvcGVuc3Nsfj4xLjEsIG9uIHN5c3RlbXMgd2l0aCBuYXRpdmUgb3BlbnNzbCAxLjEueCB1c2UgZHViIHBhY2thZ2Ugb3BlbnNzbH4+Mi4wIiwKKyAgInRhcmdldFR5cGUiOiAibGlicmFyeSIsCisgICJzb3VyY2VQYXRocyI6IFsKKyAgICAibGliL2Qvc3JjIiAKKyAgXSwKKyAgImltcG9ydFBhdGhzIjogWworICAgICJsaWIvZC9zcmMiCisgIF0sCisgICJleGNsdWRlZFNvdXJjZUZpbGVzIjogWworICAgICJsaWIvZC9zcmMvdGhyaWZ0L2luZGV4LmQiCisgIF0KK30KZGlmZiAtLWdpdCBhL2pzb24tc2NoZW1hLmpzb24gYi9qc29uLXNjaGVtYS5qc29uCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjEyMTZhLi4wMDAwMDAwCi0tLSBhL2pzb24tc2NoZW1hLmpzb24KKysrIC9kZXYvbnVsbApAQCAtMSwzMTAgKzAsMCBAQAotewotICAiJHNjaGVtYSI6ICJodHRwOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LTA0L3NjaGVtYSMiLAotCi0gICJpZCI6ICJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvcHJvZ3JhbS1zY2hlbWEjIiwKLSAgImRlc2NyaXB0aW9uIjogIlNjaGVtYSBmb3IgQXBhY2hlIFRocmlmdCBwcm90b2NvbCBkZXNjcmlwdG9ycyIsCi0KLSAgImRlZmluaXRpb25zIjogewotICAgICJ0eXBlLWlkIjogewotICAgICAgImVudW0iOiBbCi0gICAgICAgICJ2b2lkIiwKLSAgICAgICAgInN0cmluZyIsCi0gICAgICAgICJib29sIiwKLSAgICAgICAgImJ5dGUiLAotICAgICAgICAiaTE2IiwKLSAgICAgICAgImkzMiIsCi0gICAgICAgICJpNjQiLAotICAgICAgICAiZG91YmxlIiwKLSAgICAgICAgImxpc3QiLAotICAgICAgICAic2V0IiwKLSAgICAgICAgIm1hcCIsCi0gICAgICAgICJ1bmlvbiIsCi0gICAgICAgICJzdHJ1Y3QiLAotICAgICAgICAiZXhjZXB0aW9uIiwKLSAgICAgICAgImJpbmFyeSIKLSAgICAgIF0KLSAgICB9LAotICAgICJiYXNlLXR5cGUiOiB7Ci0gICAgICAidGl0bGUiOiAiQmFzZSB0eXBlcyIsCi0gICAgICAidHlwZSI6ICJvYmplY3QiLAotICAgICAgInByb3BlcnRpZXMiOiB7Ci0gICAgICAgICJ0eXBlSWQiOiB7Ci0gICAgICAgICAgImVudW0iOiBbICJ2b2lkIiwgInN0cmluZyIsICJib29sIiwgImJ5dGUiLCAiaTE2IiwgImkzMiIsICJpNjQiLCAiZG91YmxlIiwgImJpbmFyeSIgXQotICAgICAgICB9Ci0gICAgICB9LAotICAgICAgInJlcXVpcmVkIjogWyAidHlwZUlkIiBdCi0gICAgfSwKLSAgICAibGlzdC10eXBlIjogewotICAgICAgInRpdGxlIjogIkxpc3QgYW5kIHNldCB0eXBlcyIsCi0gICAgICAidHlwZSI6ICJvYmplY3QiLAotICAgICAgInByb3BlcnRpZXMiOiB7Ci0gICAgICAgICJ0eXBlSWQiOiB7ICJlbnVtIjogWyAibGlzdCIsICJzZXQiIF0gfSwKLSAgICAgICAgImVsZW1UeXBlSWQiOiB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvdHlwZS1pZCIgfSwKLSAgICAgICAgImVsZW1UeXBlIjogeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3R5cGUtc3BlYyIgfQotICAgICAgfSwKLSAgICAgICJyZXF1aXJlZCI6IFsgInR5cGVJZCIsICJlbGVtVHlwZUlkIiwgImVsZW1UeXBlIiBdCi0gICAgfSwKLSAgICAibWFwLXR5cGUiOiB7Ci0gICAgICAidGl0bGUiOiAiTWFwIHR5cGUiLAotICAgICAgInR5cGUiOiAib2JqZWN0IiwKLSAgICAgICJwcm9wZXJ0aWVzIjogewotICAgICAgICAidHlwZUlkIjogICAgICB7ICJlbnVtIjogWyAibWFwIiBdIH0sCi0gICAgICAgICJrZXlUeXBlSWQiOiAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy90eXBlLWlkIiB9LAotICAgICAgICAia2V5VHlwZSI6ICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvdHlwZS1zcGVjIiB9LAotICAgICAgICAidmFsdWVUeXBlSWQiOiB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvdHlwZS1pZCIgfSwKLSAgICAgICAgInZhbHVlVHlwZSI6ICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3R5cGUtc3BlYyIgfQotICAgICAgfSwKLSAgICAgICJyZXF1aXJlZCI6IFsgInR5cGVJZCIsICJrZXlUeXBlSWQiLCAidmFsdWVUeXBlSWQiIF0KLSAgICB9LAotICAgICJzdHJ1Y3Qtc3BlYyI6IHsKLSAgICAgICJ0aXRsZSI6ICJTdHJ1Y3QgYW5kIHVuaW9uIHR5cGVzIiwKLSAgICAgICJ0eXBlIjogIm9iamVjdCIsCi0gICAgICAicHJvcGVydGllcyI6IHsKLSAgICAgICAgInR5cGVJZCI6IHsgImVudW0iOiBbICJ1bmlvbiIsICJzdHJ1Y3QiIF0gfSwKLSAgICAgICAgImNsYXNzIjogeyAidHlwZSI6ICJzdHJpbmciIH0KLSAgICAgIH0sCi0gICAgICAicmVxdWlyZWQiOiBbICJ0eXBlSWQiLCAiY2xhc3MiIF0KLSAgICB9LAotICAgICJ0eXBlLXNwZWMiOiB7Ci0gICAgICAiYWxsT2YiOiBbCi0gICAgICAgIHsgInR5cGUiOiAib2JqZWN0IiB9LAotICAgICAgICB7Ci0gICAgICAgICAgIm9uZU9mIjoKLSAgICAgICAgICBbCi0gICAgICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvYmFzZS10eXBlIiB9LAotICAgICAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2xpc3QtdHlwZSIgfSwKLSAgICAgICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9tYXAtdHlwZSIgfSwKLSAgICAgICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9zdHJ1Y3Qtc3BlYyIgfQotICAgICAgICAgIF0KLSAgICAgICAgfQotICAgICAgXQotICAgIH0sCi0gICAgIm5hbWUtYW5kLWRvYyI6IHsKLSAgICAgICJ0eXBlIjogIm9iamVjdCIsCi0gICAgICAicHJvcGVydGllcyI6IHsKLSAgICAgICAgIm5hbWUiOiB7ICJ0eXBlIjogInN0cmluZyIgfSwKLSAgICAgICAgImRvYyI6IHsgInR5cGUiOiAic3RyaW5nIiB9Ci0gICAgICB9LAotICAgICAgInJlcXVpcmVkIjogWyAibmFtZSIgXQotICAgIH0sCi0gICAgImVudW0iOiB7Ci0gICAgICAidHlwZSI6ICJvYmplY3QiLAotICAgICAgImFsbE9mIjogWwotICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvbmFtZS1hbmQtZG9jIiB9LAotICAgICAgICB7Ci0gICAgICAgICAgInJlcXVpcmVkIjogWyAibWVtYmVycyIgXSwKLSAgICAgICAgICAicHJvcGVydGllcyI6IHsKLSAgICAgICAgICAgICJtZW1iZXJzIjogewotICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCi0gICAgICAgICAgICAgICJpdGVtcyI6IHsKLSAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAotICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewotICAgICAgICAgICAgICAgICAgIm5hbWUiOiB7ICJ0eXBlIjogInN0cmluZyIgfSwKLSAgICAgICAgICAgICAgICAgICJ2YWx1ZSI6IHsgInR5cGUiOiAiaW50ZWdlciIgfQotICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgInJlcXVpcmVkIjogWyAibmFtZSIsICJ2YWx1ZSIgXQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICBdCi0gICAgfSwKLSAgICAidHlwZWRlZiI6IHsKLSAgICAgICJ0eXBlIjogIm9iamVjdCIsCi0gICAgICAiYWxsT2YiOiBbCi0gICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9uYW1lLWFuZC1kb2MiIH0sCi0gICAgICAgIHsKLSAgICAgICAgICAicHJvcGVydGllcyI6IHsKLSAgICAgICAgICAgICJ0eXBlSWQiOiB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvdHlwZS1pZCIgfSwKLSAgICAgICAgICAgICJ0eXBlIjogeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3R5cGUtc3BlYyIgfQotICAgICAgICAgIH0sCi0gICAgICAgICAgInJlcXVpcmVkIjogWyAidHlwZUlkIiBdCi0gICAgICAgIH0KLSAgICAgIF0KLSAgICB9LAotICAgICJjb25zdGFudCI6IHsKLSAgICAgICJ0eXBlIjogIm9iamVjdCIsCi0gICAgICAiYWxsT2YiOiBbCi0gICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9uYW1lLWFuZC1kb2MiIH0sCi0gICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy90eXBlLXNwZWMiIH0sCi0gICAgICAgIHsKLSAgICAgICAgICAicHJvcGVydGllcyI6IHsKLSAgICAgICAgICAgICJ2YWx1ZSI6IHsKLSAgICAgICAgICAgICAgIm9uZU9mIjogWwotICAgICAgICAgICAgICAgIHsgInR5cGUiOiAic3RyaW5nIiB9LAotICAgICAgICAgICAgICAgIHsgInR5cGUiOiAibnVtYmVyIiB9LAotICAgICAgICAgICAgICAgIHsgInR5cGUiOiAiYXJyYXkiIH0sCi0gICAgICAgICAgICAgICAgeyAidHlwZSI6ICJvYmplY3QiIH0KLSAgICAgICAgICAgICAgXQotICAgICAgICAgICAgfQotICAgICAgICAgIH0sCi0gICAgICAgICAgInJlcXVpcmVkIjogWyAidmFsdWUiIF0KLSAgICAgICAgfQotICAgICAgXQotICAgIH0sCi0gICAgImZpZWxkIjogewotICAgICAgInR5cGUiOiAib2JqZWN0IiwKLSAgICAgICJhbGxPZiI6IFsKLSAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL25hbWUtYW5kLWRvYyIgfSwKLSAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3R5cGUtc3BlYyIgfSwKLSAgICAgICAgewotICAgICAgICAgICJwcm9wZXJ0aWVzIjogewotICAgICAgICAgICAgImtleSI6IHsKLSAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIsCi0gICAgICAgICAgICAgICJtaW5pbXVtIjogMSwKLSAgICAgICAgICAgICAgIm1heGltdW0iOiA2NTUzNQotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICJyZXF1aXJlZCI6IHsKLSAgICAgICAgICAgICAgImVudW0iOiBbICJyZXF1aXJlZCIsICJvcHRpb25hbCIsICJyZXFfb3V0IiBdCi0gICAgICAgICAgICB9LAotICAgICAgICAgICAgImRlZmF1bHQiOiB7Ci0gICAgICAgICAgICAgICJvbmVPZiI6IFsKLSAgICAgICAgICAgICAgICB7ICJ0eXBlIjogInN0cmluZyIgfSwKLSAgICAgICAgICAgICAgICB7ICJ0eXBlIjogIm51bWJlciIgfSwKLSAgICAgICAgICAgICAgICB7ICJ0eXBlIjogImFycmF5IiB9LAotICAgICAgICAgICAgICAgIHsgInR5cGUiOiAib2JqZWN0IiB9Ci0gICAgICAgICAgICAgIF0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9LAotICAgICAgICAgICJyZXF1aXJlZCI6IFsgImtleSIsICJyZXF1aXJlZCIgXQotICAgICAgICB9Ci0gICAgICBdCi0gICAgfSwKLSAgICAic3RydWN0IjogewotICAgICAgInR5cGUiOiAib2JqZWN0IiwKLSAgICAgICJhbGxPZiI6IFsKLSAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL25hbWUtYW5kLWRvYyIgfSwKLSAgICAgICAgewotICAgICAgICAgICJwcm9wZXJ0aWVzIjogewotICAgICAgICAgICAgImlzRXhjZXB0aW9uIjogeyAidHlwZSI6ICJib29sZWFuIiB9LAotICAgICAgICAgICAgImlzVW5pb24iOiB7ICJ0eXBlIjogImJvb2xlYW4iIH0sCi0gICAgICAgICAgICAiZmllbGRzIjogewotICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCi0gICAgICAgICAgICAgICJpdGVtcyI6IHsKLSAgICAgICAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2ZpZWxkIgotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSwKLSAgICAgICAgICAicmVxdWlyZWQiOiBbICJpc0V4Y2VwdGlvbiIsICJpc1VuaW9uIiwgImZpZWxkcyIgXQotICAgICAgICB9Ci0gICAgICBdCi0gICAgfSwKLSAgICAidW5pb24iOiB7Ci0gICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3N0cnVjdCIKLSAgICB9LAotICAgICJleGNlcHRpb24iOiB7Ci0gICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3N0cnVjdCIKLSAgICB9LAotICAgICJmdW5jdGlvbiI6IHsKLSAgICAgICJ0eXBlIjogIm9iamVjdCIsCi0gICAgICAiYWxsT2YiOiBbCi0gICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9uYW1lLWFuZC1kb2MiIH0sCi0gICAgICAgIHsKLSAgICAgICAgICAib25lT2YiOiBbCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogeyAib25ld2F5IjogeyAidHlwZSI6ICJib29sZWFuIiB9IH0sCi0gICAgICAgICAgICAgICJyZXF1aXJlZCI6IFsgIm9uZXdheSIgXQotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7ICJyZXR1cm5UeXBlIjogeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3R5cGUtc3BlYyIgfSB9LAotICAgICAgICAgICAgICAicmVxdWlyZWQiOiBbICJyZXR1cm5UeXBlIiBdCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgXQotICAgICAgICB9LAotICAgICAgICB7Ci0gICAgICAgICAgInByb3BlcnRpZXMiOiB7Ci0gICAgICAgICAgICAiYXJndW1lbnRzIjogewotICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCi0gICAgICAgICAgICAgICJpdGVtcyI6IHsKLSAgICAgICAgICAgICAgICAiYWxsT2YiOiBbCi0gICAgICAgICAgICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvZmllbGQiIH0sCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogeyB9Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgXQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9LAotICAgICAgICAgICAgImV4Y2VwdGlvbnMiOiB7Ci0gICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKLSAgICAgICAgICAgICAgIml0ZW1zIjogewotICAgICAgICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvZXhjZXB0aW9uIgotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSwKLSAgICAgICAgICAicmVxdWlyZWQiOiBbICJvbmV3YXkiLCAiYXJndW1lbnRzIiwgImV4Y2VwdGlvbnMiIF0KLSAgICAgICAgfQotICAgICAgXQotICAgIH0sCi0gICAgInNlcnZpY2UiOiB7Ci0gICAgICAidHlwZSI6ICJvYmplY3QiLAotICAgICAgImFsbE9mIjogWwotICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvbmFtZS1hbmQtZG9jIiB9LAotICAgICAgICB7Ci0gICAgICAgICAgInByb3BlcnRpZXMiOiB7Ci0gICAgICAgICAgICAiZnVuY3Rpb25zIjogewotICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCi0gICAgICAgICAgICAgICJpdGVtcyI6IHsKLSAgICAgICAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2Z1bmN0aW9uIgotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSwKLSAgICAgICAgICAicmVxdWlyZWQiOiBbICJmdW5jdGlvbnMiIF0KLSAgICAgICAgfQotICAgICAgXQotICAgIH0KLSAgfSwKLQotICAidHlwZSI6ICJvYmplY3QiLAotICAicmVxdWlyZWQiOiBbCi0gICAgIm5hbWUiLAotICAgICJuYW1lc3BhY2VzIiwKLSAgICAiaW5jbHVkZXMiLAotICAgICJlbnVtcyIsCi0gICAgInR5cGVkZWZzIiwKLSAgICAic3RydWN0cyIsCi0gICAgImNvbnN0YW50cyIsCi0gICAgInNlcnZpY2VzIgotICBdLAotICAicHJvcGVydGllcyI6IHsKLSAgICAibmFtZSI6IHsKLSAgICAgICJ0eXBlIjogInN0cmluZyIKLSAgICB9LAotICAgICJpbmNsdWRlcyI6IHsKLSAgICAgICJ0eXBlIjogImFycmF5IiwKLSAgICAgICJpdGVtcyI6IHsKLSAgICAgICAgInR5cGUiOiAic3RyaW5nIgotICAgICAgfSwKLSAgICAgICJ1bmlxdWVJdGVtcyI6IHRydWUKLSAgICB9LAotICAgICJlbnVtcyI6IHsKLSAgICAgICJ0eXBlIjogImFycmF5IiwKLSAgICAgICJpdGVtcyI6IHsKLSAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9lbnVtIgotICAgICAgfQotICAgIH0sCi0gICAgInR5cGVkZWZzIjogewotICAgICAgInR5cGUiOiAiYXJyYXkiLAotICAgICAgIml0ZW1zIjogewotICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3R5cGVkZWYiCi0gICAgICB9Ci0gICAgfSwKLSAgICAic3RydWN0cyI6IHsKLSAgICAgICJ0eXBlIjogImFycmF5IiwKLSAgICAgICJpdGVtcyI6IHsKLSAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9zdHJ1Y3QiCi0gICAgICB9Ci0gICAgfSwKLSAgICAiY29uc3RhbnRzIjogewotICAgICAgInR5cGUiOiAiYXJyYXkiLAotICAgICAgIml0ZW1zIjogewotICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2NvbnN0YW50IgotICAgICAgfQotICAgIH0sCi0gICAgInNlcnZpY2VzIjogewotICAgICAgInR5cGUiOiAiYXJyYXkiLAotICAgICAgIml0ZW1zIjogewotICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3NlcnZpY2UiCi0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9saWIvTWFrZWZpbGUuYW0gYi9saWIvTWFrZWZpbGUuYW0KaW5kZXggNTA2NmEwMC4uYjZjZTIwZSAxMDA2NDQKLS0tIGEvbGliL01ha2VmaWxlLmFtCisrKyBiL2xpYi9NYWtlZmlsZS5hbQpAQCAtMTcsMTIgKzE3LDE1IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1TVUJESVJTID0KK1NVQkRJUlMgPSBqc29uIHhtbAogUFJFQ1JPU1NfVEFSR0VUID0KIAogaWYgV0lUSF9DUFAKKyMgY3BwIGRpciBpcyBwaWNrZWQgZGlyZWN0bHkgYnkgcGx1Z2luIGJ1aWxkCitpZiAhV0lUSF9QTFVHSU4KIFNVQkRJUlMgKz0gY3BwCiBlbmRpZgorZW5kaWYKIAogaWYgV0lUSF9DX0dMSUIKIFNVQkRJUlMgKz0gY19nbGliCkBAIC0zMCw3ICszMyw2IEBACiAKIGlmIFdJVEhfTU9OTwogU1VCRElSUyArPSBjc2hhcnAKLVBSRUNST1NTX1RBUkdFVCArPSBwcmVjcm9zcy1jc2hhcnAKIGVuZGlmCiAKIGlmIFdJVEhfSkFWQQpAQCAtMzgsNyArNDAsNyBAQAogUFJFQ1JPU1NfVEFSR0VUICs9IHByZWNyb3NzLWphdmEKICMgSmF2YVNjcmlwdCB1bml0IHRlc3QgZGVwZW5kcyBvbiBqYXZhCiAjIHNvIHRlc3Qgb25seSBpZiBqYXZhLCBhbnQgJiBjbyBpcyBhdmFpbGFibGUKLVNVQkRJUlMgKz0ganMvdGVzdAorU1VCRElSUyArPSBqcwogZW5kaWYKIAogaWYgV0lUSF9QWVRIT04KQEAgLTY1LDI5ICs2Nyw1MiBAQAogU1VCRElSUyArPSBwaHAKIGVuZGlmCiAKK2lmIFdJVEhfREFSVAorU1VCRElSUyArPSBkYXJ0CitlbmRpZgorCitpZiBXSVRIX0RPVE5FVENPUkUKK1NVQkRJUlMgKz0gbmV0Y29yZQorZW5kaWYKKwogaWYgV0lUSF9HTwogU1VCRElSUyArPSBnbwogZW5kaWYKIAogaWYgV0lUSF9ECiBTVUJESVJTICs9IGQKK1BSRUNST1NTX1RBUkdFVCArPSBwcmVjcm9zcy1kCiBlbmRpZgogCiBpZiBXSVRIX05PREVKUwogU1VCRElSUyArPSBub2RlanMKIFBSRUNST1NTX1RBUkdFVCArPSBwcmVjcm9zcy1ub2RlanMKK1NVQkRJUlMgKz0gbm9kZXRzCiBlbmRpZgogCiBpZiBXSVRIX0xVQQogU1VCRElSUyArPSBsdWEKIGVuZGlmCiAKK2lmIFdJVEhfUlMKK1NVQkRJUlMgKz0gcnMKK2VuZGlmCisKK2lmIFdJVEhfQ0wKK1NVQkRJUlMgKz0gY2wKK2VuZGlmCisKK2lmIFdJVEhfU1dJRlQKK1NVQkRJUlMgKz0gc3dpZnQKK2VuZGlmCisKICMgQWxsIG9mIHRoZSBsaWJzIHRoYXQgZG9uJ3QgdXNlIEF1dG9tYWtlIG5lZWQgdG8gZ28gaW4gaGVyZQogIyBzbyB0aGV5IHdpbGwgZW5kIHVwIGluIG91ciByZWxlYXNlIHRhcmJhbGxzLgogRVhUUkFfRElTVCA9IFwKIAlhczMgXAogCWNvY29hIFwKIAlkIFwKKwlkYXJ0IFwKIAlkZWxwaGkgXAogCWhheGUgXAogCWphdmFtZSBcCmRpZmYgLS1naXQgYS9saWIvYXMzL2J1aWxkLnByb3BlcnRpZXMgYi9saWIvYXMzL2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ2MzY2OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9hczMvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDUgQEAKKyMgTWF2ZW4gQW50IHRhc2tzIEphciBkZXRhaWxzCittdm4uYW50LnRhc2sudmVyc2lvbj0yLjEuMworbXZuLnJlcG89aHR0cDovL3JlcG8xLm1hdmVuLm9yZy9tYXZlbjIKK212bi5hbnQudGFzay51cmw9JHttdm4ucmVwb30vb3JnL2FwYWNoZS9tYXZlbi9tYXZlbi1hbnQtdGFza3MvJHttdm4uYW50LnRhc2sudmVyc2lvbn0KK212bi5hbnQudGFzay5qYXI9bWF2ZW4tYW50LXRhc2tzLSR7bXZuLmFudC50YXNrLnZlcnNpb259LmphcgpkaWZmIC0tZ2l0IGEvbGliL2FzMy9idWlsZC54bWwgYi9saWIvYXMzL2J1aWxkLnhtbAppbmRleCA2MDRkYTQyLi5iMGM0Yzg1IDEwMDc1NQotLS0gYS9saWIvYXMzL2J1aWxkLnhtbAorKysgYi9saWIvYXMzL2J1aWxkLnhtbApAQCAtNyw5ICs3LDkgQEAKICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQogIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIAorCiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gCisKICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKQEAgLTE5LDIzICsxOSwyNCBAQAogIC0tPgogPHByb2plY3QgbmFtZT0ibGlidGhyaWZ0LWFzMyIgZGVmYXVsdD0iY29tcGlsZSIgYmFzZWRpcj0iLiIKICAgeG1sbnM6YXJ0aWZhY3Q9ImFudGxpYjpvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LmFudCI+Ci0JCisKICAgPHByb3BlcnR5IG5hbWU9ImFzMy5hcnRpZmFjdGlkIiB2YWx1ZT0iJHthbnQucHJvamVjdC5uYW1lfSIvPgotCQorCiAgIDxwcm9wZXJ0eSBuYW1lPSJ0aHJpZnQucm9vdCIgbG9jYXRpb249IiR7YmFzZWRpcn0vLi4vLi4vIi8+CiAgIDxwcm9wZXJ0eSBuYW1lPSJ0aHJpZnQuamF2YS5kaXIiIGxvY2F0aW9uPSIke3RocmlmdC5yb290fS9saWIvamF2YSIvPgogICA8cHJvcGVydHkgbmFtZT0iYnVpbGQudG9vbHMuZGlyIiBsb2NhdGlvbj0iJHt0aHJpZnQuamF2YS5kaXJ9L2J1aWxkL3Rvb2xzLyIvPgotICA8cHJvcGVydHkgbmFtZT0idGhyaWZ0X2NvbXBpbGVyIiB2YWx1ZT0iJHt0aHJpZnQucm9vdH0vY29tcGlsZXIvY3BwL3RocmlmdCIvPiAKKyAgPHByb3BlcnR5IG5hbWU9InRocmlmdF9jb21waWxlciIgdmFsdWU9IiR7dGhyaWZ0LnJvb3R9L2NvbXBpbGVyL2NwcC90aHJpZnQiLz4KKyAgPHByb3BlcnR5IGZpbGU9IiR7YmFzZWRpcn0vYnVpbGQucHJvcGVydGllcyIvPgogCiAgIDwhLS0gaW5oZXJpdCBmcm9tIHRoZSBqYXZhIGJ1aWxkIGZpbGUgZm9yIHZlcnNpb24gYW5kIG90aGVyIHByb3BlcnRpZXMgLS0+Ci0gIDxwcm9wZXJ0eSBmaWxlPSIke3RocmlmdC5qYXZhLmRpcn0vYnVpbGQucHJvcGVydGllcyIgLz4KKyAgPHByb3BlcnR5IGZpbGU9IiR7dGhyaWZ0LmphdmEuZGlyfS9ncmFkbGUucHJvcGVydGllcyIgLz4KIAogICA8cHJvcGVydHkgZW52aXJvbm1lbnQ9ImVudiIvPgogCiAgIDxjb25kaXRpb24gcHJvcGVydHk9InZlcnNpb24iIHZhbHVlPSIke3RocmlmdC52ZXJzaW9ufSI+CiAgICAgPGlzc2V0IHByb3BlcnR5PSJyZWxlYXNlIi8+CiAgIDwvY29uZGl0aW9uPgotICA8cHJvcGVydHkgbmFtZT0idmVyc2lvbiIgdmFsdWU9IiR7dGhyaWZ0LnZlcnNpb259LXNuYXBzaG90Ii8+CisgIDxwcm9wZXJ0eSBuYW1lPSJ2ZXJzaW9uIiB2YWx1ZT0iJHt0aHJpZnQudmVyc2lvbn0tU05BUFNIT1QiLz4KIAogICA8cHJvcGVydHkgbmFtZT0iYXMzLmZpbmFsLm5hbWUiIHZhbHVlPSIke2FzMy5hcnRpZmFjdGlkfS0ke3ZlcnNpb259Ii8+CiAKQEAgLTUyLDEyICs1MywxMyBAQAogICA8dGFyZ2V0IG5hbWU9InNldHVwLmluaXQiPgogICAgIDx0c3RhbXAvPgogICAgIDxta2RpciBkaXI9IiR7YnVpbGQuZGlyfSIvPgorICAgIDxta2RpciBkaXI9IiR7YnVpbGQudG9vbHMuZGlyfSIvPgogICA8L3RhcmdldD4KIAogICA8dGFyZ2V0IG5hbWU9ImZsZXguY2hlY2siIHVubGVzcz0iRkxFWF9IT01FIj4KICAgICA8ZmFpbCBtZXNzYWdlPSdZb3UgbXVzdCBzZXQgdGhlIEZMRVhfSE9NRSBwcm9wZXJ0eSBwb2ludGluZyB0byB5b3VyIGZsZXggU0RLLCBlZy4gYW50IC1ERkxFWF9IT01FPSIvQXBwbGljYXRpb25zL0Fkb2JlIEZsZXggQnVpbGRlciAzL3Nka3MvMy4yLjAiJy8+CiAgIDwvdGFyZ2V0PgotCQorCiAgIDx0YXJnZXQgbmFtZT0iZmxleC5pbml0IiBkZXBlbmRzPSJmbGV4LmNoZWNrIiB1bmxlc3M9ImZsZXguZmluaXNoZWQiPgogICAgIDx0YXNrZGVmIHJlc291cmNlPSJmbGV4VGFza3MudGFza3MiIGNsYXNzcGF0aD0iJHtGTEVYX0hPTUV9L2FudC9saWIvZmxleFRhc2tzLmphciIgLz4KICAgICA8cHJvcGVydHkgbmFtZT0iZmxleC5maW5pc2hlZCIgdmFsdWU9InRydWUiLz4KQEAgLTY5LDEwICs3MSwxMCBAQAogICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmFzIi8+CiAgICAgICA8L2ZpbGVzZXQ+CiAgICAgPC9wYXRoPgotICAgIDxwYXRoY29udmVydCAKLSAgICAgIHByb3BlcnR5PSJhcy5zcmMuY2xhc3NlcyIgCi0gICAgICBwYXRoc2VwPSIgIiAKLSAgICAgIGRpcnNlcD0iLiIgCisgICAgPHBhdGhjb252ZXJ0CisgICAgICBwcm9wZXJ0eT0iYXMuc3JjLmNsYXNzZXMiCisgICAgICBwYXRoc2VwPSIgIgorICAgICAgZGlyc2VwPSIuIgogICAgICAgcmVmaWQ9ImFzLnNyYy5maWxlcyIKICAgICA+CiAgICAgICA8bWFwIGZyb209IiR7c3JjfS8iIHRvPSIiLz4KQEAgLTEwOCwyMSArMTEwLDIxIEBACiAgICAgPGFydGlmYWN0OnJlbW90ZVJlcG9zaXRvcnkgaWQ9ImFwYWNoZSIgdXJsPSIke2FwYWNoZS5yZXBvfSIvPgogCiAgICAgPCEtLSBQb20gZmlsZSBpbmZvcm1hdGlvbiAtLT4KLSAgICA8YXJ0aWZhY3Q6cG9tIGlkPSJwb20iIAotICAgICAgZ3JvdXBJZD0iJHt0aHJpZnQuZ3JvdXBpZH0iIAorICAgIDxhcnRpZmFjdDpwb20gaWQ9InBvbSIKKyAgICAgIGdyb3VwSWQ9IiR7dGhyaWZ0Lmdyb3VwaWR9IgogICAgICAgYXJ0aWZhY3RJZD0iJHthczMuYXJ0aWZhY3RpZH0iCi0gICAgICB2ZXJzaW9uPSIke3ZlcnNpb259IiAKKyAgICAgIHZlcnNpb249IiR7dmVyc2lvbn0iCiAgICAgICB1cmw9Imh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZyIKICAgICAgIG5hbWU9IkFwYWNoZSBUaHJpZnQiCiAgICAgICBkZXNjcmlwdGlvbj0iVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcyBkZXZlbG9wbWVudC4iCi0gICAgICBwYWNrYWdpbmc9InBvbSIKKyAgICAgIHBhY2thZ2luZz0ic3djIgogICAgID4KICAgICAgIDxyZW1vdGVSZXBvc2l0b3J5IHJlZmlkPSJjZW50cmFsIi8+CiAgICAgICA8cmVtb3RlUmVwb3NpdG9yeSByZWZpZD0iYXBhY2hlIi8+CiAgICAgICA8bGljZW5zZSBuYW1lPSJUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMi4wIiB1cmw9IiR7bGljZW5zZX0iLz4KLSAgICAgIDxzY20gY29ubmVjdGlvbj0ic2NtOmdpdDpodHRwczovL2dpdC13aXAtdXMuYXBhY2hlLm9yZy9yZXBvcy9hc2YvdGhyaWZ0LmdpdCIgCi0gICAgICBkZXZlbG9wZXJDb25uZWN0aW9uPSJzY206Z2l0Omh0dHBzOi8vZ2l0LXdpcC11cy5hcGFjaGUub3JnL3JlcG9zL2FzZi90aHJpZnQuZ2l0IgotICAgICAgdXJsPSJodHRwczovL2dpdC13aXAtdXMuYXBhY2hlLm9yZy9yZXBvcy9hc2Y/cD10aHJpZnQuZ2l0IgorICAgICAgPHNjbSBjb25uZWN0aW9uPSJzY206Z2l0Omh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0LmdpdCIKKyAgICAgIGRldmVsb3BlckNvbm5lY3Rpb249InNjbTpnaXQ6aHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQuZ2l0IgorICAgICAgdXJsPSJodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdCIKICAgICAgIC8+CiAgICAgICA8IS0tIFRocmlmdCBEZXZlbG9wZXJzIC0tPgogICAgICAgPGRldmVsb3BlciBpZD0ibWNzbGVlIiBuYW1lPSJNYXJrIFNsZWUiLz4KQEAgLTE3Niw1ICsxNzgsNSBAQAogICAgIDwhLS0gcnVuIHdpdGg6IGFudCAtRHJlbGVhc2U9dHJ1ZSBwdWJsaXNoIC0tPgogICAgIDxzaWduQW5kRGVwbG95IGZpbGU9IiR7YXMzLnBvbS54bWx9IiBwYWNrYWdpbmc9InBvbSIgY2xhc3NpZmllcj0iIiBwb209IiR7YXMzLnBvbS54bWx9Ii8+CiAgICAgPHNpZ25BbmREZXBsb3kgZmlsZT0iJHthczMuc3djLmZpbGV9IiBwYWNrYWdpbmc9InN3YyIgY2xhc3NpZmllcj0iIiBwb209IiR7YXMzLnBvbS54bWx9Ii8+Ci0gIDwvdGFyZ2V0PgkKKyAgPC90YXJnZXQ+CiA8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9saWIvYXMzL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldC5hcyBiL2xpYi9hczMvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0LmFzCmluZGV4IDY4OTEzODguLmM2MGQ3MTEgMTAwNjQ0Ci0tLSBhL2xpYi9hczMvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0LmFzCisrKyBiL2xpYi9hczMvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0LmFzCkBAIC0xMjcsNiArMTI3LDExIEBACiAgICAgewogICAgICAgdGhpcy5ldmVudERpc3BhdGNoZXIuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lciwgdXNlQ2FwdHVyZSwgcHJpb3JpdHksIHVzZVdlYWtSZWZlcmVuY2UpOwogICAgIH0KKyAgICAKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlOlN0cmluZywgbGlzdGVuZXI6RnVuY3Rpb24sIHVzZUNhcHR1cmU6Qm9vbGVhbiA9IGZhbHNlKTp2b2lkCisgICAgeworICAgICAgdGhpcy5ldmVudERpc3BhdGNoZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lciwgdXNlQ2FwdHVyZSk7CisgICAgfQogCiAgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIG9wZW4oKTp2b2lkCiAgICAgewpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9DTWFrZUxpc3RzLnR4dCBiL2xpYi9jX2dsaWIvQ01ha2VMaXN0cy50eHQKaW5kZXggMmMwY2U3Ni4uMzc0M2E2OCAxMDA2NDQKLS0tIGEvbGliL2NfZ2xpYi9DTWFrZUxpc3RzLnR4dAorKysgYi9saWIvY19nbGliL0NNYWtlTGlzdHMudHh0CkBAIC0zMywxMCArMzMsMTUgQEAKICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uLmMKICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X3Byb2Nlc3Nvci5jCiAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9kaXNwYXRjaF9wcm9jZXNzb3IuYworICAgIHNyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLmMKICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuYwogICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9mYWN0b3J5LmMKKyAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yLmMKICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmMKKyAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2wuYwogICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeS5jCisgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wuYworICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sX2ZhY3RvcnkuYwogICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0LmMKICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5LmMKICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mYWN0b3J5LmMKQEAgLTQ1LDEyICs1MCwyNCBAQAogICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5jCiAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0LmMKICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5jCisgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mZF90cmFuc3BvcnQuYwogICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5jCiAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9tZW1vcnlfYnVmZmVyLmMKICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvdGhyaWZ0X3NlcnZlci5jCiAgICAgc3JjL3RocmlmdC9jX2dsaWIvc2VydmVyL3RocmlmdF9zaW1wbGVfc2VydmVyLmMKICkKIAorIyBJZiBPcGVuU1NMIGlzIG5vdCBmb3VuZCBqdXN0IGlnbm9yZSB0aGUgT3BlblNTTCBzdHVmZgorZmluZF9wYWNrYWdlKE9wZW5TU0wpCitpZihPUEVOU1NMX0ZPVU5EIEFORCBXSVRIX09QRU5TU0wpCisgICAgbGlzdCggQVBQRU5EIHRocmlmdGNwcF9TT1VSQ0VTCisJICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc3NsX3NvY2tldC5jCisgICAgKQorICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMoU1lTVEVNICIke09QRU5TU0xfSU5DTFVERV9ESVJ9IikKKyAgICBsaXN0KEFQUEVORCBTWVNMSUJTICIke09QRU5TU0xfTElCUkFSSUVTfSIpCitlbmRpZigpCisKKwogIyBDb250YWlucyB0aGUgdGhyaWZ0IHNwZWNpZmljIEFERF9MSUJSQVJZX1RIUklGVCBhbmQgVEFSR0VUX0xJTktfTElCUkFSSUVTX1RIUklGVAogaW5jbHVkZShUaHJpZnRNYWNyb3MpCiAKQEAgLTYwLDYgKzc3LDkgQEAKICMgSW5zdGFsbCB0aGUgaGVhZGVycwogaW5zdGFsbChESVJFQ1RPUlkgInNyYy90aHJpZnQiIERFU1RJTkFUSU9OICIke0lOQ0xVREVfSU5TVEFMTF9ESVJ9IgogICAgIEZJTEVTX01BVENISU5HIFBBVFRFUk4gIiouaCIpCisjIENvcHkgY29uZmlnLmggZmlsZQoraW5zdGFsbChESVJFQ1RPUlkgIiR7Q01BS0VfQklOQVJZX0RJUn0vdGhyaWZ0IiBERVNUSU5BVElPTiAiJHtJTkNMVURFX0lOU1RBTExfRElSfSIKKyAgICBGSUxFU19NQVRDSElORyBQQVRURVJOICIqLmgiKQogCiBpZihCVUlMRF9URVNUSU5HKQogICAgIGFkZF9zdWJkaXJlY3RvcnkodGVzdCkKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvTWFrZWZpbGUuYW0gYi9saWIvY19nbGliL01ha2VmaWxlLmFtCmluZGV4IDE1M2QxNGIuLjQ5YjViMjMgMTAwNzU1Ci0tLSBhL2xpYi9jX2dsaWIvTWFrZWZpbGUuYW0KKysrIGIvbGliL2NfZ2xpYi9NYWtlZmlsZS5hbQpAQCAtMzQsMjQgKzM0LDMzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uLmMgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9wcm9jZXNzb3IuYyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X2Rpc3BhdGNoX3Byb2Nlc3Nvci5jIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLmMgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvci5jIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9mYWN0b3J5LmMgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5jIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbC5jIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbC5jIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeS5jIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sLmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeS5jIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0LmMgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnRfZmFjdG9yeS5jIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZhY3RvcnkuYyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmFjdG9yeS5jIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0LmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zc2xfc29ja2V0LmMgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0LmMgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0LmMgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZkX3RyYW5zcG9ydC5jIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5jIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfbWVtb3J5X2J1ZmZlci5jIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3NlcnZlci90aHJpZnRfc2VydmVyLmMgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvc2VydmVyL3RocmlmdF9zaW1wbGVfc2VydmVyLmMKIAotbGlidGhyaWZ0X2NfZ2xpYl9sYV9DRkxBR1MgPSAkKEFNX0NGTEFHUykgJChHTElCX0NGTEFHUykKK2xpYnRocmlmdF9jX2dsaWJfbGFfQ0ZMQUdTID0gJChBTV9DRkxBR1MpICQoR0xJQl9DRkxBR1MpICQoR09CSkVDVF9DRkxBR1MpICQoT1BFTlNTTF9JTkNMVURFUykKK2xpYnRocmlmdF9jX2dsaWJfbGFfTERGTEFHUyA9ICQoQU1fTERGTEFHUykgJChHTElCX0xJQlMpICQoR09CSkVDVF9MSUJTKSAgJChPUEVOU1NMX0xERkxBR1MpICQoT1BFTlNTTF9MSUJTKSAKIAogaW5jbHVkZV90aHJpZnRkaXIgPSAkKGluY2x1ZGVkaXIpL3RocmlmdC9jX2dsaWIKIGluY2x1ZGVfdGhyaWZ0X0hFQURFUlMgPSBcCkBAIC02MiwxNyArNzEsMjYgQEAKIAogaW5jbHVkZV9wcm90b2NvbGRpciA9ICQoaW5jbHVkZV90aHJpZnRkaXIpL3Byb3RvY29sCiBpbmNsdWRlX3Byb3RvY29sX0hFQURFUlMgPSBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yLmggXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnkuaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmggXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5LmgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeS5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeS5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbC5oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAogaW5jbHVkZV90cmFuc3BvcnRkaXIgPSAkKGluY2x1ZGVfdGhyaWZ0ZGlyKS90cmFuc3BvcnQKIGluY2x1ZGVfdHJhbnNwb3J0X0hFQURFUlMgPSBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZkX3RyYW5zcG9ydC5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9tZW1vcnlfYnVmZmVyLmggXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9wbGF0Zm9ybV9zb2NrZXQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zc2xfc29ja2V0LmggXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0LmggXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnkuaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmFjdG9yeS5oIFwKQEAgLTg0LDcgKzEwMiw4IEBACiAKIGluY2x1ZGVfcHJvY2Vzc29yZGlyID0gJChpbmNsdWRlX3RocmlmdGRpcikvcHJvY2Vzc29yCiBpbmNsdWRlX3Byb2Nlc3Nvcl9IRUFERVJTID0gc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9wcm9jZXNzb3IuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9kaXNwYXRjaF9wcm9jZXNzb3IuaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfZGlzcGF0Y2hfcHJvY2Vzc29yLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLmgKIAogCiBFWFRSQV9ESVNUID0gXApkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9SRUFETUUubWQgYi9saWIvY19nbGliL1JFQURNRS5tZAppbmRleCBmZDcwZDA4Li5kZDg0ZjNkIDEwMDY0NAotLS0gYS9saWIvY19nbGliL1JFQURNRS5tZAorKysgYi9saWIvY19nbGliL1JFQURNRS5tZApAQCAtMzIsMyArMzIsMTggQEAKIEdMaWIKIGh0dHA6Ly93d3cuZ3RrLm9yZy8KIAorQnJlYWtpbmcgQ2hhbmdlcworPT09PT09PT09PT09PT09PQorCiswLjEyLjAKKy0tLS0tLQorCitUaGUgY29tcGlsZXIncyBoYW5kbGluZyBvZiBuYW1lc3BhY2VzIHdoZW4gZ2VuZXJhdGluZyB0aGUgbmFtZSBvZiB0eXBlcywKK2Z1bmN0aW9ucyBhbmQgaGVhZGVyIGZpbGVzIGhhcyBiZWVuIGltcHJvdmVkLiBUaGlzIG1lYW5zIGNvZGUgd3JpdHRlbiB0byB1c2UKK2NsYXNzZXMgZ2VuZXJhdGVkIGJ5IHByZXZpb3VzIHZlcnNpb25zIG9mIHRoZSBjb21waWxlciBtYXkgbmVlZCB0byBiZSB1cGRhdGVkIHRvCityZWZsZWN0IHRoZSBwcm9wZXIgY29udmVudGlvbiBmb3IgY2xhc3MgbmFtZXMsIHdoaWNoIGlzCisKKy0gQSBsb3dlcmNhc2UsIFtzbmFrZS1jYXNlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TbmFrZV9jYXNlKQorICByZXByZXNlbnRhdGlvbiBvZiB0aGUgY2xhc3MnIG5hbWVzcGFjZSwgZm9sbG93ZWQgYnkKKy0gQW4gdW5kZXJzY29yZSBhbmQKKy0gQSBsb3dlcmNhc2UsIHNuYWtlLWNhc2UgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNsYXNzJyBuYW1lLgpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X2Rpc3BhdGNoX3Byb2Nlc3Nvci5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X2Rpc3BhdGNoX3Byb2Nlc3Nvci5jCmluZGV4IDU3ZjBiZWQuLjU3ZDYyMTcgMTAwNjQ0Ci0tLSBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9kaXNwYXRjaF9wcm9jZXNzb3IuYworKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfZGlzcGF0Y2hfcHJvY2Vzc29yLmMKQEAgLTk4LDYgKzk4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikgPCAwKQogICAgIHJldHVybiBGQUxTRTsKICAgbWVzc2FnZSA9IGdfc3RyY29uY2F0ICgiSW52YWxpZCBtZXRob2QgbmFtZTogJyIsIGZuYW1lLCAiJyIsIE5VTEwpOworICBnX2ZyZWUgKGZuYW1lKTsKICAgeGNlcHRpb24gPQogICAgIGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQVBQTElDQVRJT05fRVhDRVBUSU9OLAogICAgICAgICAgICAgICAgICAgInR5cGUiLCAgICBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX1VOS05PV05fTUVUSE9ELApkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvci5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4YTBmNGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLmMKQEAgLTAsMCArMSwzNDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24uaD4KKworR19ERUZJTkVfVFlQRShUaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvciwgdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3NvciwgVEhSSUZUX1RZUEVfUFJPQ0VTU09SKQorCisKK2VudW0KK3sKKyAgUFJPUF9USFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0RFRkFVTFRfU0VSVklDRV9OQU1FID0gMSwKKyAgUFJPUF9USFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VORAorfTsKKworc3RhdGljIEdQYXJhbVNwZWMgKnRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3Jfb2JqX3Byb3BlcnRpZXNbUFJPUF9USFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VORF0gPSB7IE5VTEwsIH07CisKKworc3RhdGljIGdib29sZWFuCit0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX3JlZ2lzdGVyX3Byb2Nlc3Nvcl9pbXBsKFRocmlmdFByb2Nlc3NvciAqcHJvY2Vzc29yLCBjb25zdCBnY2hhciAqIG11bHRpcGxleGVkX3Byb2Nlc3Nvcl9uYW1lLCBUaHJpZnRQcm9jZXNzb3IgKiBtdWx0aXBsZXhlZF9wcm9jZXNzb3IgLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3IgKnNlbGYgPSBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SKHByb2Nlc3Nvcik7CisgIGdfaGFzaF90YWJsZV9yZXBsYWNlKHNlbGYtPm11bHRpcGxleGVkX3NlcnZpY2VzLAorCQkgICAgICAgZ19zdHJkdXAobXVsdGlwbGV4ZWRfcHJvY2Vzc29yX25hbWUpLAorCQkgICAgICAgZ19vYmplY3RfcmVmIChtdWx0aXBsZXhlZF9wcm9jZXNzb3IpKTsKKworICAvKiBNYWtlIGZpcnN0IHJlZ2lzdGVyZWQgYmVjb21lIGRlZmF1bHQgKi8KKyAgaWYoIXNlbGYtPmRlZmF1bHRfcHJvY2Vzc29yX25hbWUpeworICAgICAgc2VsZi0+ZGVmYXVsdF9wcm9jZXNzb3JfbmFtZSA9IGdfc3RyZHVwKG11bHRpcGxleGVkX3Byb2Nlc3Nvcl9uYW1lKTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworCitzdGF0aWMgZ2Jvb2xlYW4KK3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfcHJvY2Vzc19pbXBsIChUaHJpZnRQcm9jZXNzb3IgKnByb2Nlc3NvciwgVGhyaWZ0UHJvdG9jb2wgKmluLAorCQkJCQkgICBUaHJpZnRQcm90b2NvbCAqb3V0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2Jvb2xlYW4gcmV0dmFsID0gRkFMU0U7CisgIGdib29sZWFuIHRva2VuX2Vycm9yID0gRkFMU0U7CisgIFRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uICp4Y2VwdGlvbjsKKyAgVGhyaWZ0U3RvcmVkTWVzc2FnZVByb3RvY29sICpzdG9yZWRfbWVzc2FnZV9wcm90b2NvbCA9IE5VTEw7CisgIFRocmlmdE1lc3NhZ2VUeXBlIG1lc3NhZ2VfdHlwZTsKKyAgVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3IgKnNlbGYgPSBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SKHByb2Nlc3Nvcik7CisgIFRocmlmdFByb2Nlc3NvciAqbXVsdGlwbGV4ZWRfcHJvY2Vzc29yID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQ7CisgIGNoYXIgKnRva2VuPU5VTEw7CisgIGludCB0b2tlbl9pbmRleD0wOworICBjaGFyICpzdGF0ZT1OVUxMOworICBnY2hhciAqZm5hbWU9TlVMTDsKKyAgZ2ludDMyIHNlcWlkLCByZXN1bHQ7CisKKyAgLyogRklYTUUgSXQgc2VlbXMgdGhhdCBwcmV2aW91cyBwcm9jZXNzb3IgaXMgbm90IG1hbmFnaW5nIGVycm9yIGNvcnJlY3RseSAqLworICBpZigqZXJyb3IhPU5VTEwpIHsKKyAgICAgIGdfZGVidWcgKCJ0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yOiBsYXN0IGVycm9yIG5vdCByZW1vdmVkOiAlcyIsCisgICAgICAJCSAgICplcnJvciAhPSBOVUxMID8gKCplcnJvciktPm1lc3NhZ2UgOiAiKG51bGwpIik7CisgICAgICBnX2NsZWFyX2Vycm9yIChlcnJvcik7CisgIH0KKworCisgIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MoaW4pLT5yZWFkX21lc3NhZ2VfYmVnaW4oaW4sICZmbmFtZSwgJm1lc3NhZ2VfdHlwZSwgJnNlcWlkLCBlcnJvcik7CisKKyAgaWYoIShtZXNzYWdlX3R5cGUgPT0gVF9DQUxMIHx8IG1lc3NhZ2VfdHlwZSA9PSBUX09ORVdBWSkpIHsKKyAgICAgIGdfc2V0X2Vycm9yIChlcnJvciwKKwkJICAgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FUlJPUiwKKwkJICAgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FUlJPUl9NRVNTQUdFX1RZUEUsCisJCSAgICJtZXNzYWdlIHR5cGUgaW52YWxpZCBmb3IgdGhpcyBwcm9jZXNzb3IiKTsKKyAgfWVsc2V7CisgICAgICAvKiBTcGxpdCBieSB0aGUgdG9rZW4gKi8KKyAgICAgIGZvciAodG9rZW4gPSBzdHJ0b2tfcihmbmFtZSwgVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MX0RFRkFVTFRfU0VQQVJBVE9SLCAmc3RhdGUpLAorCSAgdG9rZW5faW5kZXg9MDsKKwkgIHRva2VuICE9IE5VTEwgJiYgIXRva2VuX2Vycm9yOworCSAgdG9rZW4gPSBzdHJ0b2tfcihOVUxMLCBUSFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0xfREVGQVVMVF9TRVBBUkFUT1IsICZzdGF0ZSksCisJICAgICAgdG9rZW5faW5kZXgrKykKKwl7CisJICBzd2l0Y2godG9rZW5faW5kZXgpeworCSAgICBjYXNlIDA6CisJICAgICAgLyogSXQgc2hvdWxkIGJlIHRoZSBzZXJ2aWNlIG5hbWUgKi8KKwkgICAgICBtdWx0aXBsZXhlZF9wcm9jZXNzb3IgPSBnX2hhc2hfdGFibGVfbG9va3VwKHNlbGYtPm11bHRpcGxleGVkX3NlcnZpY2VzLCB0b2tlbik7CisJICAgICAgaWYobXVsdGlwbGV4ZWRfcHJvY2Vzc29yPT1OVUxMKXsKKwkJICB0b2tlbl9lcnJvcj1UUlVFOworCSAgICAgIH0KKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAxOgorCSAgICAgIC8qIEl0IHNob3VsZCBiZSB0aGUgZnVuY3Rpb24gbmFtZSAqLworCSAgICAgIHN0b3JlZF9tZXNzYWdlX3Byb3RvY29sID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTCwKKwkJCQkJCSAgICAgICJwcm90b2NvbCIsIGluLAorCQkJCQkJICAgICAgIm5hbWUiLCB0b2tlbiwKKwkJCQkJCSAgICAgICJ0eXBlIiwgbWVzc2FnZV90eXBlLAorCQkJCQkJICAgICAgInNlcWlkIiwgc2VxaWQsCisJCQkJCQkgICAgICBOVUxMKTsKKwkgICAgICBicmVhazsKKwkgICAgZGVmYXVsdDoKKwkgICAgICBnX3NldF9lcnJvciAoZXJyb3IsCisJCQkgICBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VSUk9SLAorCQkJICAgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FUlJPUl9NRVNTQUdFX1dST05HTFlfTVVMVElQTEVYRUQsCisJCQkgICAidGhlIG1lc3NhZ2UgaGFzIG1vcmUgdG9rZW5zIHRoYW4gZXhwZWN0ZWQhIik7CisJICAgICAgdG9rZW5fZXJyb3I9VFJVRTsKKwkgICAgICBicmVhazsKKwkgIH0KKwl9CisgICAgICAvKiBTZXQgZGVmYXVsdCAqLworICAgICAgaWYoIXN0b3JlZF9tZXNzYWdlX3Byb3RvY29sICYmCisJICAhbXVsdGlwbGV4ZWRfcHJvY2Vzc29yICYmCisJICB0b2tlbl9pbmRleD09MSAmJiBzZWxmLT5kZWZhdWx0X3Byb2Nlc3Nvcl9uYW1lKXsKKwkgIC8qIEl0IHNob3VsZCBiZSB0aGUgc2VydmljZSBuYW1lICovCisJICBtdWx0aXBsZXhlZF9wcm9jZXNzb3IgPSBnX2hhc2hfdGFibGVfbG9va3VwKHNlbGYtPm11bHRpcGxleGVkX3NlcnZpY2VzLCBzZWxmLT5kZWZhdWx0X3Byb2Nlc3Nvcl9uYW1lKTsKKwkgIGlmKG11bHRpcGxleGVkX3Byb2Nlc3Nvcj09TlVMTCl7CisJICAgICAgZ19zZXRfZXJyb3IgKGVycm9yLAorCQkJICAgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FUlJPUiwKKwkJCSAgIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRVJST1JfU0VSVklDRV9VTkFWQUlMQUJMRSwKKwkJCSAgICJzZXJ2aWNlICVzIG5vdCBhdmFpbGFibGUgb24gdGhpcyBwcm9jZXNzb3IiLAorCQkJICAgc2VsZi0+ZGVmYXVsdF9wcm9jZXNzb3JfbmFtZSk7CisJICB9ZWxzZXsKKwkgICAgICAvKiBTZXQgdGhlIG1lc3NhZ2UgbmFtZSB0byB0aGUgb3JpZ2luYWwgbmFtZSAqLworCSAgICAgIHN0b3JlZF9tZXNzYWdlX3Byb3RvY29sID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTCwKKwkJCQkJCSAgICAgICJwcm90b2NvbCIsIGluLAorCQkJCQkJICAgICAgIm5hbWUiLCBmbmFtZSwKKwkJCQkJCSAgICAgICJ0eXBlIiwgbWVzc2FnZV90eXBlLAorCQkJCQkJICAgICAgInNlcWlkIiwgc2VxaWQsCisJCQkJCQkgICAgICBOVUxMKTsKKwkgIH0KKworICAgICAgfQorCisgICAgICBpZihzdG9yZWRfbWVzc2FnZV9wcm90b2NvbCE9TlVMTCAmJiBtdWx0aXBsZXhlZF9wcm9jZXNzb3IhPU5VTEwpeworCSAgcmV0dmFsID0gVEhSSUZUX1BST0NFU1NPUl9HRVRfQ0xBU1MgKG11bHRpcGxleGVkX3Byb2Nlc3NvciktPnByb2Nlc3MgKG11bHRpcGxleGVkX3Byb2Nlc3NvciwgKFRocmlmdFByb3RvY29sICopIHN0b3JlZF9tZXNzYWdlX3Byb3RvY29sLCBvdXQsIGVycm9yKSA7CisgICAgICB9ZWxzZXsKKwkgIGlmKCFlcnJvcikKKwkgIGdfc2V0X2Vycm9yIChlcnJvciwKKwkJICAgICAgIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRVJST1IsCisJCSAgICAgICBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VSUk9SX1NFUlZJQ0VfVU5BVkFJTEFCTEUsCisJCSAgICAgICAic2VydmljZSAlcyBpcyBub3QgbXVsdGlwbGV4ZWQgaW4gdGhpcyBwcm9jZXNzb3IiLAorCQkgICAgICAgZm5hbWUpOworICAgICAgfQorCisKKyAgfQorCisgIGlmKCFyZXR2YWwpeworICAgICAgLyogQnkgZGVmYXVsdCwgcmV0dXJuIGFuIGFwcGxpY2F0aW9uIGV4Y2VwdGlvbiB0byB0aGUgY2xpZW50IGluZGljYXRpbmcgdGhlCisgICAgICAgICAgbWV0aG9kIG5hbWUgaXMgbm90IHJlY29nbml6ZWQuICovCisgICAgICAvKiBDb3BpZWQgZnJvbSBkaXNwYWNoIHByb2Nlc3NvciAqLworCisgICAgICBpZiAoKHRocmlmdF9wcm90b2NvbF9za2lwIChpbiwgVF9TVFJVQ1QsIGVycm9yKSA8IDApIHx8CisJICAodGhyaWZ0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9lbmQgKGluLCBlcnJvcikgPCAwKSkKKwlyZXR1cm4gcmV0dmFsOworCisgICAgICBnX29iamVjdF9nZXQgKGluLCAidHJhbnNwb3J0IiwgJnRyYW5zcG9ydCwgTlVMTCk7CisgICAgICByZXN1bHQgPSB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kICh0cmFuc3BvcnQsIGVycm9yKTsKKyAgICAgIGdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOworICAgICAgaWYgKHJlc3VsdCA8IDApIHsKKwkgIC8qIFdlIG11c3QgZnJlZSBmbmFtZSAqLworCSAgZ19mcmVlKGZuYW1lKTsKKwkgIHJldHVybiByZXR2YWw7CisgICAgICB9CisKKyAgICAgIGlmICh0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAob3V0LAorCQkJCQkgICAgICAgZm5hbWUsCisJCQkJCSAgICAgICBUX0VYQ0VQVElPTiwKKwkJCQkJICAgICAgIHNlcWlkLAorCQkJCQkgICAgICAgZXJyb3IpIDwgMCl7CisJICAvKiBXZSBtdXN0IGZyZWUgZm5hbWUgKi8KKwkgIGdfZnJlZShmbmFtZSk7CisKKwkgIHJldHVybiByZXR2YWw7CisgICAgICB9CisKKworICAgICAgeGNlcHRpb24gPQorCSAgZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9BUFBMSUNBVElPTl9FWENFUFRJT04sCisJCQkidHlwZSIsICAgIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfVU5LTk9XTl9NRVRIT0QsCisJCQkibWVzc2FnZSIsICgqZXJyb3IpLT5tZXNzYWdlLAorCQkJTlVMTCk7CisgICAgICByZXN1bHQgPSB0aHJpZnRfc3RydWN0X3dyaXRlIChUSFJJRlRfU1RSVUNUICh4Y2VwdGlvbiksCisJCQkJICAgIG91dCwKKwkJCQkgICAgZXJyb3IpOworICAgICAgZ19vYmplY3RfdW5yZWYgKHhjZXB0aW9uKTsKKyAgICAgIGlmICgocmVzdWx0IDwgMCkgfHwKKwkgICh0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9lbmQgKG91dCwgZXJyb3IpIDwgMCkpCisJcmV0dXJuIHJldHZhbDsKKworICAgICAgZ19vYmplY3RfZ2V0IChvdXQsICJ0cmFuc3BvcnQiLCAmdHJhbnNwb3J0LCBOVUxMKTsKKyAgICAgIHJldHZhbCA9CisJICAoKHRocmlmdF90cmFuc3BvcnRfd3JpdGVfZW5kICh0cmFuc3BvcnQsIGVycm9yKSA+PSAwKSAmJgorCSAgICAgICh0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIGVycm9yKSA+PSAwKSk7CisgICAgICBnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKKyAgfWVsc2V7CisgICAgICAvKiBUaGUgcHJvdG9jb2wgbm93IGhhcyBhIGNvcHkgd2UgY2FuIGZyZWUgaXQgKi8KKyAgICAgIGdfZnJlZShmbmFtZSk7CisKKyAgfQorCisgIC8qCisgIEZJWE1FIFRoaXMgbWFrZXMgZXZlcnl0aGluZyBmYWlsLCBJIGRvbid0IGtub3cgd2h5LgorICBpZihzdG9yZWRfbWVzc2FnZV9wcm90b2NvbCE9TlVMTCl7CisJICAvLyBBZnRlciBpdHMgdXNlIHdlIG11c3QgZnJlZSBpdAorCSAgZ19vYmplY3RfdW5yZWYoc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2wpOworICB9CisgICovCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qIGRlZmluZSB0aGUgR0Vycm9yIGRvbWFpbiBmb3IgVGhyaWZ0IHRyYW5zcG9ydHMgKi8KK0dRdWFyawordGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9lcnJvcl9xdWFyayAodm9pZCkKK3sKKyAgcmV0dXJuIGdfcXVhcmtfZnJvbV9zdGF0aWNfc3RyaW5nIChUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VSUk9SX0RPTUFJTik7Cit9CisKKworc3RhdGljIHZvaWQKK3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3Jfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICAgICAgKm9iamVjdCwKKyAgICBndWludCAgICAgICAgIHByb3BlcnR5X2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqdmFsdWUsCisgICAgR1BhcmFtU3BlYyAgICpwc3BlYykKK3sKKyAgVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3IgKnNlbGYgPSBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgY2FzZSBQUk9QX1RIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfREVGQVVMVF9TRVJWSUNFX05BTUU6CisgICAgc2VsZi0+ZGVmYXVsdF9wcm9jZXNzb3JfbmFtZSA9IGdfdmFsdWVfZHVwX3N0cmluZyAodmFsdWUpOworICAgIGJyZWFrOworCisgIGRlZmF1bHQ6CisgICAgLyogV2UgZG9uJ3QgaGF2ZSBhbnkgb3RoZXIgcHJvcGVydHkuLi4gKi8KKyAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcGVydHlfaWQsIHBzcGVjKTsKKyAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9nZXRfcHJvcGVydHkgKEdPYmplY3QgICAgKm9iamVjdCwKKyAgICBndWludCAgICAgICBwcm9wZXJ0eV9pZCwKKyAgICBHVmFsdWUgICAgICp2YWx1ZSwKKyAgICBHUGFyYW1TcGVjICpwc3BlYykKK3sKKyAgVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3IgKnNlbGYgPSBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgY2FzZSBQUk9QX1RIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfREVGQVVMVF9TRVJWSUNFX05BTUU6CisgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgc2VsZi0+ZGVmYXVsdF9wcm9jZXNzb3JfbmFtZSk7CisgICAgYnJlYWs7CisKKyAgZGVmYXVsdDoKKyAgICAvKiBXZSBkb24ndCBoYXZlIGFueSBvdGhlciBwcm9wZXJ0eS4uLiAqLworICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wZXJ0eV9pZCwgcHNwZWMpOworICAgIGJyZWFrOworICB9Cit9CisKKy8qIGRlc3RydWN0b3IgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX2ZpbmFsaXplIChHT2JqZWN0ICpvYmplY3QpCit7CisgIFRocmlmdE11bHRpcGxleGVkUHJvY2Vzc29yICpzZWxmID0gVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUihvYmplY3QpOworCisgIC8qIEZyZWUgb3VyIG11bHRpcGxleGVkIGhhc2ggdGFibGUgKi8KKyAgZ19oYXNoX3RhYmxlX3VucmVmIChzZWxmLT5tdWx0aXBsZXhlZF9zZXJ2aWNlcyk7CisgIHNlbGYtPm11bHRpcGxleGVkX3NlcnZpY2VzID0gTlVMTDsKKworICBpZihzZWxmLT5kZWZhdWx0X3Byb2Nlc3Nvcl9uYW1lKXsKKyAgICAgIGdfZnJlZShzZWxmLT5kZWZhdWx0X3Byb2Nlc3Nvcl9uYW1lKTsKKyAgICAgIHNlbGYtPmRlZmF1bHRfcHJvY2Vzc29yX25hbWU9TlVMTDsKKyAgfQorCisgIC8qIENoYWluIHVwIHRvIHBhcmVudCAqLworICBpZiAoR19PQkpFQ1RfQ0xBU1MgKHRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfcGFyZW50X2NsYXNzKS0+ZmluYWxpemUpCisgICAgKCpHX09CSkVDVF9DTEFTUyAodGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9wYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSkgKG9iamVjdCk7Cit9CisKKy8qIGNsYXNzIGluaXRpYWxpemVyIGZvciBUaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvciAqLworc3RhdGljIHZvaWQKK3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfY2xhc3NfaW5pdCAoVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3JDbGFzcyAqY2xzKQoreworICAvKiBPdmVycmlkZSAqLworICBUSFJJRlRfUFJPQ0VTU09SX0NMQVNTKGNscyktPnByb2Nlc3MgPSB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX3Byb2Nlc3NfaW1wbDsKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGNscyk7CisKKyAgLyogT2JqZWN0IG1ldGhvZHMgKi8KKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IHRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IHRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfZmluYWxpemU7CisKKyAgLyogQ2xhc3MgbWV0aG9kcyAqLworICBjbHMtPnJlZ2lzdGVyX3Byb2Nlc3NvciA9IHRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfcmVnaXN0ZXJfcHJvY2Vzc29yX2ltcGw7CisKKworICB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX29ial9wcm9wZXJ0aWVzW1BST1BfVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9ERUZBVUxUX1NFUlZJQ0VfTkFNRV0gPQorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoImRlZmF1bHQiLAorICAgICAgICAgICJEZWZhdWx0IHNlcnZpY2UgbmFtZSB0aGUgcHJvdG9jb2wgcG9pbnRzIHRvIHdoZXJlIG5vIG11bHRpcGxleGVkIGNsaWVudCB1c2VkIiwKKyAgICAgICAgICAiU2V0IHRoZSBkZWZhdWx0IHNlcnZpY2UgbmFtZSIsCisgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAoR19QQVJBTV9SRUFEV1JJVEUpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnRpZXMgKGdvYmplY3RfY2xhc3MsCisJCQkJICAgICBQUk9QX1RIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRU5ELAorICAgICAgdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9vYmpfcHJvcGVydGllcyk7CisKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfaW5pdCAoVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3IgKnNlbGYpCit7CisKKyAgLyogQ3JlYXRlIG91ciBtdWx0aXBsZXhlZCBzZXJ2aWNlcyBoYXNoIHRhYmxlICovCisgIHNlbGYtPm11bHRpcGxleGVkX3NlcnZpY2VzID0gZ19oYXNoX3RhYmxlX25ld19mdWxsICgKKyAgICAgIGdfc3RyX2hhc2gsCisgICAgICBnX3N0cl9lcXVhbCwKKyAgICAgIGdfZnJlZSwKKyAgICAgIGdfb2JqZWN0X3VucmVmKTsKKyAgc2VsZi0+ZGVmYXVsdF9wcm9jZXNzb3JfbmFtZSA9IE5VTEw7Cit9CisKKworZ2Jvb2xlYW4KK3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfcmVnaXN0ZXJfcHJvY2Vzc29yKFRocmlmdFByb2Nlc3NvciAqcHJvY2Vzc29yLCBjb25zdCBnY2hhciAqIG11bHRpcGxleGVkX3Byb2Nlc3Nvcl9uYW1lLCBUaHJpZnRQcm9jZXNzb3IgKiBtdWx0aXBsZXhlZF9wcm9jZXNzb3IgLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfR0VUX0NMQVNTKHByb2Nlc3NvciktPnJlZ2lzdGVyX3Byb2Nlc3Nvcihwcm9jZXNzb3IsIG11bHRpcGxleGVkX3Byb2Nlc3Nvcl9uYW1lLCBtdWx0aXBsZXhlZF9wcm9jZXNzb3IsIGVycm9yKTsKK30KKworCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQwNjYxNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3IuaApAQCAtMCwwICsxLDExNCBAQAorLyoKKyAqIHRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3IuaAorICoKKyAqICBDcmVhdGVkIG9uOiAxNCBzZXB0LiAyMDE3CisgKiAgICAgIEF1dGhvcjogZ2FndWlsYXIKKyAqLworCisjaWZuZGVmIF9USFJJRlRfTVVMVElQTEVYRURfTVVMVElQTEVYRURfUFJPQ0VTU09SX0hfCisjZGVmaW5lIF9USFJJRlRfTVVMVElQTEVYRURfTVVMVElQTEVYRURfUFJPQ0VTU09SX0hfCisKKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfcHJvY2Vzc29yLmg+CisKKworR19CRUdJTl9ERUNMUworCisvKiEgXGZpbGUgdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvci5oCisgKiAgXGJyaWVmIFRoZSBtdWx0aXBsZXhlZCBwcm9jZXNzb3IgZm9yIGNfZ2xpYi4KKyAqLworCisvKiB0eXBlIG1hY3JvcyAqLworI2RlZmluZSBUSFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9DRVNTT1IgKHRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1Iob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9DRVNTT1IsIFRocmlmdE11bHRpcGxleGVkUHJvY2Vzc29yKSkKKyNkZWZpbmUgVEhSSUZUX0lTX01VTFRJUExFWEVEX1BST0NFU1NPUihvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX01VTFRJUExFWEVEX1BST0NFU1NPUikpCisjZGVmaW5lIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX01VTFRJUExFWEVEX1BST0NFU1NPUiwgVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3JDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19NVUxUSVBMRVhFRF9QUk9DRVNTT1JfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX01VTFRJUExFWEVEX1BST0NFU1NPUikpCisjZGVmaW5lIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9DRVNTT1IsIFRocmlmdE11bHRpcGxleGVkUHJvY2Vzc29yQ2xhc3MpKQorCisvKiBkZWZpbmUgdGhlIEdFcnJvciBkb21haW4gc3RyaW5nICovCisjZGVmaW5lIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRVJST1JfRE9NQUlOICJ0aHJpZnQtbXVsdGlwbGV4ZWQtcHJvY2Vzc29yLWVycm9yLXF1YXJrIgorCisKKy8qIQorICogVGhyaWZ0IE11bHRpcGxleGVkUHJvY2Vzc29yIG9iamVjdAorICovCitzdHJ1Y3QgX1RocmlmdE11bHRpcGxleGVkUHJvY2Vzc29yCit7CisgIFRocmlmdFByb2Nlc3NvciBwYXJlbnQ7CisKKyAgLyogcHJpdmF0ZSAqLworICBnY2hhciAqIGRlZmF1bHRfcHJvY2Vzc29yX25hbWU7CisgIEdIYXNoVGFibGUgKm11bHRpcGxleGVkX3NlcnZpY2VzOworfTsKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvciBUaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvcjsKKworLyohCisgKiBUaHJpZnQgTXVsdGlwbGV4ZWRQcm9jZXNzb3IgY2xhc3MKKyAqLworc3RydWN0IF9UaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvckNsYXNzCit7CisgIFRocmlmdFByb2Nlc3NvckNsYXNzIHBhcmVudDsKKworICBnYm9vbGVhbiAoKiByZWdpc3Rlcl9wcm9jZXNzb3IpIChUaHJpZnRQcm9jZXNzb3IgKnNlbGYsIGNvbnN0IGdjaGFyICogbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX25hbWUsIFRocmlmdFByb2Nlc3NvciAqIG11bHRpcGxleGVkX3Byb2Nlc3NvciAsIEdFcnJvciAqKmVycm9yKTsKKworfTsKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvckNsYXNzIFRocmlmdE11bHRpcGxleGVkUHJvY2Vzc29yQ2xhc3M7CisKKy8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfTVVMVElQTEVYRURfUFJPQ0VTU09SICovCitHVHlwZSB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX2dldF90eXBlICh2b2lkKTsKKworLyohCisgKiBQcm9jZXNzZXMgdGhlIHJlcXVlc3QuCisgKiBccHVibGljIFxtZW1iZXJvZiBUaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvckNsYXNzCisgKi8KK2dib29sZWFuIHRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfcHJvY2VzcyAoVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3IgKnByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0UHJvdG9jb2wgKmluLCBUaHJpZnRQcm90b2NvbCAqb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKKworLyogUHVibGljIEFQSSAqLworCisvKioKKyAqIEBicmllZiBSZWdpc3RlcnMgYSBwcm9jZXNzb3IgaW4gdGhlIG11bHRpcGxleGVkIHByb2Nlc3NvciB1bmRlciBpdHMgbmFtZS4gSXQKKyAqIHdpbGwgdGFrZSBhIHJlZmVyZW5jZSB0byB0aGUgcHJvY2Vzc29yIHNvIHJlZmNvdW50IHdpbGwgYmUgaW5jcmVtZW50ZWQuCisgKiBJdCB3aWxsIGFsc28gYmUgZGVjcmVtZW50ZWQgb24gb2JqZWN0IGRlc3RydWN0aW9uLgorICoKKyAqIFRoZSBmaXJzdCByZWdpc3RlcmVkIHByb2Nlc3NvciBiZWNvbWVzIGRlZmF1bHQuIEJ1dCB5b3UgY2FuIG92ZXJyaWRlIGl0IHdpdGgKKyAqICJkZWZhdWx0IiBwcm9wZXJ0eS4KKyAqCisgKiBJdCByZXR1cm5zIGEgY29tcGxpYW50IGVycm9yIGlmIGl0IGNhbm5vdCBiZSByZWdpc3RlcmVkLgorICoKKyAqIEBwYXJhbSBwcm9jZXNzb3IgUG9pbnRlciB0byB0aGUgbXVsdGlwbGV4ZWQgcHJvY2Vzc29yLgorICogQHBhcmFtIG11bHRpcGxleGVkX3Byb2Nlc3Nvcl9uYW1lIE5hbWUgb2YgdGhlIHByb2Nlc3NvciB5b3Ugd2FudCB0byByZWdpc3RlcgorICogQHBhcmFtIG11bHRpcGxleGVkX3Byb2Nlc3NvciBQb2ludGVyIHRvIGltcGxlbWVudGVkIHByb2Nlc3NvciB5b3Ugd2FudCBtdWx0aXBsZXguCisgKiBAcGFyYW0gZXJyb3IgRXJyb3Igb2JqZWN0IHdoZXJlIHdlIHNob3VsZCBzdG9yZSBlcnJvcnMuCisgKgorICogQHNlZSBodHRwczovL2RldmVsb3Blci5nbm9tZS5vcmcvZ2xpYi9zdGFibGUvZ2xpYi1FcnJvci1SZXBvcnRpbmcuaHRtbCNnLXNldC1lcnJvcgorICovCitnYm9vbGVhbiB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX3JlZ2lzdGVyX3Byb2Nlc3NvcihUaHJpZnRQcm9jZXNzb3IgKnByb2Nlc3NvciwgY29uc3QgZ2NoYXIgKiBtdWx0aXBsZXhlZF9wcm9jZXNzb3JfbmFtZSwgVGhyaWZ0UHJvY2Vzc29yICogbXVsdGlwbGV4ZWRfcHJvY2Vzc29yICwgR0Vycm9yICoqZXJyb3IpOworCisKKy8qIGRlZmluZSBlcnJvci9leGNlcHRpb24gdHlwZXMgKi8KK3R5cGVkZWYgZW51bQoreworICBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VSUk9SX1VOS05PV04sCisgIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRVJST1JfU0VSVklDRV9VTkFWQUlMQUJMRSwKKyAgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FUlJPUl9NRVNTQUdFX1RZUEUsCisgIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRVJST1JfTUVTU0FHRV9XUk9OR0xZX01VTFRJUExFWEVELAorICBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VSUk9SX1NFTkQsCisgIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRVJST1JfUkVDRUlWRSwKKyAgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FUlJPUl9DTE9TRQorfSBUaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvckVycm9yOworCisKK0dRdWFyayB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX2Vycm9yX3F1YXJrICh2b2lkKTsKKyNkZWZpbmUgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FUlJPUiAodGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9lcnJvcl9xdWFyayAoKSkKKworCitHX0VORF9ERUNMUworCisKKyNlbmRpZiAvKiBfVEhSSUZUX01VTFRJUExFWEVEX01VTFRJUExFWEVEX1BST0NFU1NPUl9IXyAqLwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuYwppbmRleCAzNTgzOTZjLi43YzJkMDE3IDEwMDY0NAotLS0gYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuYworKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuYwpAQCAtNjQ1LDggKzY0NSw4IEBACiAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKIAogICBpZiAoKHJldCA9IAotICAgICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZCAocHJvdG9jb2wtPnRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIsIDEsIGVycm9yKSkgPCAwKQorICAgICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwgKHByb3RvY29sLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiwgMSwgZXJyb3IpKSA8IDApCiAgIHsKICAgICByZXR1cm4gLTE7CiAgIH0KQEAgLTY2NCw4ICs2NjQsOCBAQAogICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CiAKICAgaWYgKChyZXQgPQotICAgICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZCAocHJvdG9jb2wtPnRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIsIDEsIGVycm9yKSkgPCAwKQorICAgICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwgKHByb3RvY29sLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiwgMSwgZXJyb3IpKSA8IDApCiAgIHsKICAgICByZXR1cm4gLTE7CiAgIH0KQEAgLTY4Nyw4ICs2ODcsOCBAQAogICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CiAKICAgaWYgKChyZXQgPQotICAgICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZCAocHJvdG9jb2wtPnRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIuYnl0ZV9hcnJheSwgMiwgZXJyb3IpKSA8IDApCisgICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbCAocHJvdG9jb2wtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmJ5dGVfYXJyYXksIDIsIGVycm9yKSkgPCAwKQogICB7CiAgICAgcmV0dXJuIC0xOwogICB9CkBAIC03MTAsOCArNzEwLDggQEAKICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOwogCiAgIGlmICgocmV0ID0KLSAgICAgICB0aHJpZnRfdHJhbnNwb3J0X3JlYWQgKHByb3RvY29sLT50cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmJ5dGVfYXJyYXksIDQsIGVycm9yKSkgPCAwKQorICAgICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwgKHByb3RvY29sLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5ieXRlX2FycmF5LCA0LCBlcnJvcikpIDwgMCkKICAgewogICAgIHJldHVybiAtMTsKICAgfQpAQCAtNzMzLDggKzczMyw4IEBACiAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKIAogICBpZiAoKHJldCA9Ci0gICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkIChwcm90b2NvbC0+dHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5ieXRlX2FycmF5LCA4LCBlcnJvcikpIDwgMCkKKyAgICAgICB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsIChwcm90b2NvbC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIuYnl0ZV9hcnJheSwgOCwgZXJyb3IpKSA8IDApCiAgIHsKICAgICByZXR1cm4gLTE7CiAgIH0KQEAgLTc1Niw4ICs3NTYsOCBAQAogICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CiAKICAgaWYgKChyZXQgPQotICAgICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZCAocHJvdG9jb2wtPnRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIuYnl0ZV9hcnJheSwgOCwgZXJyb3IpKSA8IDApCisgICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbCAocHJvdG9jb2wtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmJ5dGVfYXJyYXksIDgsIGVycm9yKSkgPCAwKQogICB7CiAgICAgcmV0dXJuIC0xOwogICB9CkBAIC03ODQsMTQgKzc4NCwyMSBAQAogICB9CiAgIHhmZXIgKz0gcmV0OwogCi0gIGlmIChyZWFkX2xlbiA+IDApCi0gIHsKLSAgICAvKiBhbGxvY2F0ZSB0aGUgbWVtb3J5IGZvciB0aGUgc3RyaW5nICovCi0gICAgbGVuID0gKGd1aW50MzIpIHJlYWRfbGVuICsgMTsgLyogc3BhY2UgZm9yIG51bGwgdGVybWluYXRvciAqLwotICAgICpzdHIgPSBnX25ldzAgKGdjaGFyLCBsZW4pOworICBpZiAocmVhZF9sZW4gPCAwKSB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfUFJPVE9DT0xfRVJST1IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9ORUdBVElWRV9TSVpFLAorICAgICAgICAgICAgICAgICAiZ290IG5lZ2F0aXZlIHNpemUgb2YgJWQiLCByZWFkX2xlbik7CisgICAgKnN0ciA9IE5VTEw7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgLyogYWxsb2NhdGUgdGhlIG1lbW9yeSBmb3IgdGhlIHN0cmluZyAqLworICBsZW4gPSAoZ3VpbnQzMikgcmVhZF9sZW4gKyAxOyAvKiBzcGFjZSBmb3IgbnVsbCB0ZXJtaW5hdG9yICovCisgICpzdHIgPSBnX25ldzAgKGdjaGFyLCBsZW4pOworICBpZiAocmVhZF9sZW4gPiAwKSB7CiAgICAgaWYgKChyZXQgPQotICAgICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkIChwcm90b2NvbC0+dHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3RyLCByZWFkX2xlbiwgZXJyb3IpKSA8IDApCisgICAgICAgICB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsIChwcm90b2NvbC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnN0ciwgcmVhZF9sZW4sIGVycm9yKSkgPCAwKQogICAgIHsKICAgICAgIGdfZnJlZSAoKnN0cik7CiAgICAgICAqc3RyID0gTlVMTDsKQEAgLTgwMCw3ICs4MDcsNyBAQAogICAgIH0KICAgICB4ZmVyICs9IHJldDsKICAgfSBlbHNlIHsKLSAgICAqc3RyID0gTlVMTDsKKyAgICAqKnN0ciA9IDA7CiAgIH0KIAogICByZXR1cm4geGZlcjsKQEAgLTgzMSw4ICs4MzgsOCBAQAogICAgICpsZW4gPSAoZ3VpbnQzMikgcmVhZF9sZW47CiAgICAgKmJ1ZiA9IGdfbmV3IChndWNoYXIsICpsZW4pOwogICAgIGlmICgocmV0ID0KLSAgICAgICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZCAocHJvdG9jb2wtPnRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZiwgKmxlbiwgZXJyb3IpKSA8IDApCisgICAgICAgICB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsIChwcm90b2NvbC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZiwgKmxlbiwgZXJyb3IpKSA8IDApCiAgICAgewogICAgICAgZ19mcmVlICgqYnVmKTsKICAgICAgICpidWYgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbC5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZTQ3NDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sLmMKQEAgLTAsMCArMSwxNjA5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jb25maWcuaD4KKworLyoKKyAqICpfdG9femlnemFnIGRlcGVuZCBvbiB0aGUgZmFjdCB0aGF0IHRoZSByaWdodCBzaGlmdAorICogb3BlcmF0b3Igb24gYSBzaWduZWQgaW50ZWdlciBpcyBhbiBhcml0aG1ldGljIChzaWduLWV4dGVuZGluZykgc2hpZnQuCisgKiBJZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSwgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gd2lsbCBub3Qgd29yay4KKyAqLworI2lmICFkZWZpbmVkKFNJR05FRF9SSUdIVF9TSElGVF9JUykgfHwgIWRlZmluZWQoQVJJVEhNRVRJQ19SSUdIVF9TSElGVCkKKyMgZXJyb3IgIlVuYWJsZSB0byBkZXRlcm1pbmUgdGhlIGJlaGF2aW9yIG9mIGEgc2lnbmVkIHJpZ2h0IHNoaWZ0IgorI2VuZGlmCisjaWYgU0lHTkVEX1JJR0hUX1NISUZUX0lTICE9IEFSSVRITUVUSUNfUklHSFRfU0hJRlQKKyMgZXJyb3IgInRocmlmdF9jb21wYWN0X3Byb3RvY29sIG9ubHkgd29ya3MgaWYgc2lnbmVkIHJpZ2h0IHNoaWZ0IGlzIGFyaXRobWV0aWMiCisjZW5kaWYKKworLyogb2JqZWN0IHByb3BlcnRpZXMgKi8KK2VudW0gX1RocmlmdENvbXBhY3RQcm90b2NvbFByb3BlcnRpZXMKK3sKKyAgICBQUk9QXzAsCisgICAgUFJPUF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9TVFJJTkdfTElNSVQsCisgICAgUFJPUF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9DT05UQUlORVJfTElNSVQKK307CisKK0dfREVGSU5FX1RZUEUgKFRocmlmdENvbXBhY3RQcm90b2NvbCwgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wsCisgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9QUk9UT0NPTCkKKworc3RhdGljIGNvbnN0IGdpbnQ4IFBST1RPQ09MX0lEID0gKGdpbnQ4KTB4ODJ1Oworc3RhdGljIGNvbnN0IGdpbnQ4IFZFUlNJT05fTiA9IDE7CitzdGF0aWMgY29uc3QgZ2ludDggVkVSU0lPTl9NQVNLID0gMHgxZjsgICAgICAgLyogMDAwMSAxMTExICovCitzdGF0aWMgY29uc3QgZ2ludDggVFlQRV9NQVNLID0gKGdpbnQ4KTB4ZTB1OyAgLyogMTExMCAwMDAwICovCitzdGF0aWMgY29uc3QgZ2ludDggVFlQRV9CSVRTID0gMHgwNzsgICAgICAgICAgLyogMDAwMCAwMTExICovCitzdGF0aWMgY29uc3QgZ2ludDMyIFRZUEVfU0hJRlRfQU1PVU5UID0gNTsKKworZW51bSBUeXBlcyB7CisgIENUX1NUT1AgICAgICAgICAgID0gMHgwMCwKKyAgQ1RfQk9PTEVBTl9UUlVFICAgPSAweDAxLAorICBDVF9CT09MRUFOX0ZBTFNFICA9IDB4MDIsCisgIENUX0JZVEUgICAgICAgICAgID0gMHgwMywKKyAgQ1RfSTE2ICAgICAgICAgICAgPSAweDA0LAorICBDVF9JMzIgICAgICAgICAgICA9IDB4MDUsCisgIENUX0k2NCAgICAgICAgICAgID0gMHgwNiwKKyAgQ1RfRE9VQkxFICAgICAgICAgPSAweDA3LAorICBDVF9CSU5BUlkgICAgICAgICA9IDB4MDgsCisgIENUX0xJU1QgICAgICAgICAgID0gMHgwOSwKKyAgQ1RfU0VUICAgICAgICAgICAgPSAweDBBLAorICBDVF9NQVAgICAgICAgICAgICA9IDB4MEIsCisgIENUX1NUUlVDVCAgICAgICAgID0gMHgwQworfTsKKworc3RhdGljIGNvbnN0IGdpbnQ4IFRUeXBlVG9DVHlwZVsxNl0gPSB7CisgIENUX1NUT1AsIC8qIFRfU1RPUCAqLworICAwLCAvKiB1bnVzZWQgKi8KKyAgQ1RfQk9PTEVBTl9UUlVFLCAvKiBUX0JPT0wgKi8KKyAgQ1RfQllURSwgLyogVF9CWVRFICovCisgIENUX0RPVUJMRSwgLyogVF9ET1VCTEUgKi8KKyAgMCwgLyogdW51c2VkICovCisgIENUX0kxNiwgLyogVF9JMTYgKi8KKyAgMCwgLyogdW51c2VkICovCisgIENUX0kzMiwgLyogVF9JMzIgKi8KKyAgMCwgLyogdW51c2VkICovCisgIENUX0k2NCwgLyogVF9JNjQgKi8KKyAgQ1RfQklOQVJZLCAvKiBUX1NUUklORyAqLworICBDVF9TVFJVQ1QsIC8qIFRfU1RSVUNUICovCisgIENUX01BUCwgLyogVF9NQVAgKi8KKyAgQ1RfU0VULCAvKiBUX1NFVCAqLworICBDVF9MSVNULCAvKiBUX0xJU1QgKi8KK307CisKK3N0YXRpYyBndWludDY0Cit0aHJpZnRfYml0d2lzZV9jYXN0X2d1aW50NjQgKGNvbnN0IGdkb3VibGUgdikKK3sKKyAgdW5pb24geworICAgIGdkb3VibGUgZnJvbTsKKyAgICBndWludDY0IHRvOworICB9IHU7CisgIHUuZnJvbSA9IHY7CisgIHJldHVybiB1LnRvOworfQorCitzdGF0aWMgZ2RvdWJsZQordGhyaWZ0X2JpdHdpc2VfY2FzdF9nZG91YmxlIChjb25zdCBndWludDY0IHYpCit7CisgIHVuaW9uIHsKKyAgICBndWludDY0IGZyb207CisgICAgZ2RvdWJsZSB0bzsKKyAgfSB1OworICB1LmZyb20gPSB2OworICByZXR1cm4gdS50bzsKK30KKworLyoqCisgKiBDb252ZXJ0IGwgaW50byBhIHppZ3phZyBsb25nLiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlCisgKiByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCisgKi8KK3N0YXRpYyBndWludDY0CitpNjRfdG9femlnemFnIChjb25zdCBnaW50NjQgbCkKK3sKKyAgcmV0dXJuICgoKGd1aW50NjQpbCkgPDwgMSkgXiAobCA+PiA2Myk7Cit9CisKKy8qKgorICogQ29udmVydCBuIGludG8gYSB6aWd6YWcgaW50LiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlCisgKiByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCisgKi8KK3N0YXRpYyBndWludDMyCitpMzJfdG9femlnemFnIChjb25zdCBnaW50MzIgbikKK3sKKyAgcmV0dXJuICgoKGd1aW50MzIpbikgPDwgMSkgXiAobiA+PiAzMSk7Cit9CisKKy8qKgorICogQ29udmVydCBmcm9tIHppZ3phZyBpbnQgdG8gaW50LgorICovCitzdGF0aWMgZ2ludDMyCit6aWd6YWdfdG9faTMyIChndWludDMyIG4pCit7CisgIHJldHVybiAobiA+PiAxKSBeIChndWludDMyKSAoLShnaW50MzIpIChuICYgMSkpOworfQorCisvKioKKyAqIENvbnZlcnQgZnJvbSB6aWd6YWcgbG9uZyB0byBsb25nLgorICovCitzdGF0aWMgZ2ludDY0Cit6aWd6YWdfdG9faTY0IChndWludDY0IG4pCit7CisgIHJldHVybiAobiA+PiAxKSBeIChndWludDY0KSAoLShnaW50NjQpIChuICYgMSkpOworfQorCitUaHJpZnRUeXBlIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2dldF90dHlwZSAoVGhyaWZ0Q29tcGFjdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50OCB0eXBlLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKKworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIFRfU1RPUDoKKyAgICAgIHJldHVybiBUX1NUT1A7CisgICAgY2FzZSBDVF9CT09MRUFOX0ZBTFNFOgorICAgIGNhc2UgQ1RfQk9PTEVBTl9UUlVFOgorICAgICAgcmV0dXJuIFRfQk9PTDsKKyAgICBjYXNlIENUX0JZVEU6CisgICAgICByZXR1cm4gVF9CWVRFOworICAgIGNhc2UgQ1RfSTE2OgorICAgICAgcmV0dXJuIFRfSTE2OworICAgIGNhc2UgQ1RfSTMyOgorICAgICAgcmV0dXJuIFRfSTMyOworICAgIGNhc2UgQ1RfSTY0OgorICAgICAgcmV0dXJuIFRfSTY0OworICAgIGNhc2UgQ1RfRE9VQkxFOgorICAgICAgcmV0dXJuIFRfRE9VQkxFOworICAgIGNhc2UgQ1RfQklOQVJZOgorICAgICAgcmV0dXJuIFRfU1RSSU5HOworICAgIGNhc2UgQ1RfTElTVDoKKyAgICAgIHJldHVybiBUX0xJU1Q7CisgICAgY2FzZSBDVF9TRVQ6CisgICAgICByZXR1cm4gVF9TRVQ7CisgICAgY2FzZSBDVF9NQVA6CisgICAgICByZXR1cm4gVF9NQVA7CisgICAgY2FzZSBDVF9TVFJVQ1Q6CisgICAgICByZXR1cm4gVF9TVFJVQ1Q7CisgICAgZGVmYXVsdDoKKyAgICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1BST1RPQ09MX0VSUk9SLAorICAgICAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgInVucmVjb2duaXplZCB0eXBlIik7CisgICAgICByZXR1cm4gLTE7CisgIH0KK30KKworLyoqCisgKiBXcml0ZSBhbiBpMzIgYXMgYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS01IGJ5dGVzIG9uIHRoZSB3aXJlLgorICovCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3ZhcmludDMyIChUaHJpZnRDb21wYWN0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ3VpbnQ4IGJ1Zls1XTsKKyAgZ2ludDMyIHhmZXI7CisgIGd1aW50MzIgbTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIHhmZXIgPSAwOworICBtID0gbjsKKworICB3aGlsZSAoVFJVRSkgeworICAgIGlmICgobSAmIH4weDdGKSA9PSAwKSB7CisgICAgICBidWZbeGZlcisrXSA9IChnaW50OCltOworICAgICAgYnJlYWs7CisgICAgfSBlbHNlIHsKKyAgICAgIGJ1Zlt4ZmVyKytdID0gKGdpbnQ4KSgobSAmIDB4N0YpIHwgMHg4MCk7CisgICAgICBtID4+PSA3OworICAgIH0KKyAgfQorCisgIGlmICh0aHJpZnRfdHJhbnNwb3J0X3dyaXRlIChUSFJJRlRfUFJPVE9DT0wgKHByb3RvY29sKS0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGdwb2ludGVyKSBidWYsIHhmZXIsIGVycm9yKSkgeworICAgIHJldHVybiB4ZmVyOworICB9IGVsc2UgeworICAgIHJldHVybiAtMTsKKyAgfQorfQorCisvKioKKyAqIFdyaXRlIGFuIGk2NCBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTEwIGJ5dGVzIG9uIHRoZSB3aXJlLgorICovCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3ZhcmludDY0IChUaHJpZnRDb21wYWN0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50NjQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ3VpbnQ4IGJ1ZlsxMF07CisgIGdpbnQzMiB4ZmVyOworICBndWludDY0IG07CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICB4ZmVyID0gMDsKKyAgbSA9IG47CisKKyAgd2hpbGUgKFRSVUUpIHsKKyAgICBpZiAoKG0gJiB+MHg3RkwpID09IDApIHsKKyAgICAgIGJ1Zlt4ZmVyKytdID0gKGdpbnQ4KW07CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgeworICAgICAgYnVmW3hmZXIrK10gPSAoZ2ludDgpKChtICYgMHg3RikgfCAweDgwKTsKKyAgICAgIG0gPj49IDc7CisgICAgfQorICB9CisKKyAgaWYgKHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKFRIUklGVF9QUk9UT0NPTCAocHJvdG9jb2wpLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgZ3BvaW50ZXIpIGJ1ZiwgeGZlciwgZXJyb3IpKSB7CisgICAgcmV0dXJuIHhmZXI7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIC0xOworICB9Cit9CisKKy8qKgorICogUmVhZCBhbiBpNjQgZnJvbSB0aGUgd2lyZSBhcyBhIHByb3BlciB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorICogaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gcmVhZCB1cCB0byAxMCBieXRlcy4KKyAqLworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3ZhcmludDY0IChUaHJpZnRDb21wYWN0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDY0ICppNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2wgKnRwOworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlcjsKKyAgZ3VpbnQ2NCB2YWw7CisgIGdpbnQgc2hpZnQ7CisgIGd1aW50OCBieXRlOworCisgIHRwID0gVEhSSUZUX1BST1RPQ09MIChwcm90b2NvbCk7CisgIHhmZXIgPSAwOworICB2YWwgPSAwOworICBzaGlmdCA9IDA7CisgIGJ5dGUgPSAwOworCisgIHdoaWxlIChUUlVFKSB7CisgICAgaWYgKChyZXQgPSB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsICh0cC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdwb2ludGVyKSAmYnl0ZSwgMSwgZXJyb3IpKSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgKyt4ZmVyOworICAgIHZhbCB8PSAoZ3VpbnQ2NCkoYnl0ZSAmIDB4N2YpIDw8IHNoaWZ0OworICAgIHNoaWZ0ICs9IDc7CisgICAgaWYgKCEoYnl0ZSAmIDB4ODApKSB7CisgICAgICAqaTY0ID0gKGdpbnQ2NCkgdmFsOworICAgICAgcmV0dXJuIHhmZXI7CisgICAgfQorICAgIGlmIChHX1VOTElLRUxZICh4ZmVyID09IDEwKSkgeyAvKiA3ICogOSA8IDY0IDwgNyAqIDEwICovCisgICAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9QUk9UT0NPTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICJ2YXJpYWJsZS1sZW5ndGggaW50IG92ZXIgMTAgYnl0ZXMiKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIH0KK30KKworLyoqCisgKiBSZWFkIGFuIGkzMiBmcm9tIHRoZSB3aXJlIGFzIGEgdmFyaW50LiBUaGUgTVNCIG9mIGVhY2ggYnl0ZSBpcyBzZXQKKyAqIGlmIHRoZXJlIGlzIGFub3RoZXIgYnl0ZSB0byBmb2xsb3cuIFRoaXMgY2FuIHJlYWQgdXAgdG8gNSBieXRlcy4KKyAqLworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3ZhcmludDMyIChUaHJpZnRDb21wYWN0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDMyICppMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDY0IHZhbDsKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXI7CisKKyAgeGZlciA9IDA7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3ZhcmludDY0IChwcm90b2NvbCwgJnZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICAqaTMyID0gKGdpbnQzMil2YWw7CisKKyAgcmV0dXJuIHhmZXI7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW5faW50ZXJuYWwgKFRocmlmdENvbXBhY3RQcm90b2NvbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50MTYgZmllbGRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDggdHlwZV9vdmVycmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXI7CisgIGdpbnQ4IHR5cGVfdG9fd3JpdGU7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKG5hbWUpOworCisgIHhmZXIgPSAwOworCisgIC8qIGlmIHRoZXJlJ3MgYSB0eXBlIG92ZXJyaWRlLCB1c2UgdGhhdC4gKi8KKyAgdHlwZV90b193cml0ZQorICAgID0gKHR5cGVfb3ZlcnJpZGUgPT0gLTEgPyBUVHlwZVRvQ1R5cGVbZmllbGRfdHlwZV0gOiB0eXBlX292ZXJyaWRlKTsKKworICAvKiBjaGVjayBpZiB3ZSBjYW4gdXNlIGRlbHRhIGVuY29kaW5nIGZvciB0aGUgZmllbGQgaWQgKi8KKyAgaWYgKGZpZWxkX2lkID4gcHJvdG9jb2wtPl9sYXN0X2ZpZWxkX2lkCisgICAgICAmJiBmaWVsZF9pZCAtIHByb3RvY29sLT5fbGFzdF9maWVsZF9pZCA8PSAxNSkgeworICAgIC8qIHdyaXRlIHRoZW0gdG9nZXRoZXIgKi8KKyAgICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9ieXRlIChUSFJJRlRfUFJPVE9DT0wgKHByb3RvY29sKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2ludDgpICgoZmllbGRfaWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBwcm90b2NvbC0+X2xhc3RfZmllbGRfaWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgNCB8IHR5cGVfdG9fd3JpdGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHhmZXIgKz0gcmV0OworICB9IGVsc2UgeworICAgIC8qIHdyaXRlIHRoZW0gc2VwYXJhdGUgKi8KKyAgICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9ieXRlIChUSFJJRlRfUFJPVE9DT0wgKHByb3RvY29sKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlX3RvX3dyaXRlLCBlcnJvcikpIDwgMCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IHJldDsKKworICAgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2kxNiAoVEhSSUZUX1BST1RPQ09MIChwcm90b2NvbCksIGZpZWxkX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeGZlciArPSByZXQ7CisgIH0KKworICBwcm90b2NvbC0+X2xhc3RfZmllbGRfaWQgPSBmaWVsZF9pZDsKKyAgcmV0dXJuIHhmZXI7Cit9CisKKy8qKgorICogTWV0aG9kIGZvciB3cml0aW5nIHRoZSBzdGFydCBvZiBsaXN0cyBhbmQgc2V0cy4gTGlzdCBhbmQgc2V0cyBvbgorICogdGhlIHdpcmUgZGlmZmVyIG9ubHkgYnkgdGhlIHR5cGUgaW5kaWNhdG9yLgorICovCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2NvbGxlY3Rpb25fYmVnaW4gKFRocmlmdENvbXBhY3RQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGVsZW1fdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgc2l6ZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyOworCisgIHhmZXIgPSAwOworCisgIGlmIChzaXplIDw9IDE0KSB7CisgICAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYnl0ZSAoVEhSSUZUX1BST1RPQ09MIChwcm90b2NvbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdpbnQ4KSAoc2l6ZSA8PCA0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBUVHlwZVRvQ1R5cGVbZWxlbV90eXBlXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeGZlciArPSByZXQ7CisgIH0gZWxzZSB7CisgICAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYnl0ZSAoVEhSSUZUX1BST1RPQ09MIChwcm90b2NvbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdpbnQ4KSAoMHhmMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVFR5cGVUb0NUeXBlW2VsZW1fdHlwZV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHhmZXIgKz0gcmV0OworCisgICAgaWYgKChyZXQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV92YXJpbnQzMiAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGd1aW50MzIpIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeGZlciArPSByZXQ7CisgIH0KKworICByZXR1cm4geGZlcjsKK30KKworLyoKKyAqIHB1YmxpYyBtZXRob2RzCisgKi8KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdE1lc3NhZ2VUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQzMiBzZXFpZCwgR0Vycm9yICoqZXJyb3IpCit7CisgIGdpbnQ4IHZlcnNpb247CisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyOworCisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqY3A7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisKKyAgdmVyc2lvbiA9IChWRVJTSU9OX04gJiBWRVJTSU9OX01BU0spCisgICAgICAgICAgICB8ICgoKGdpbnQzMikgbWVzc2FnZV90eXBlIDw8IFRZUEVfU0hJRlRfQU1PVU5UKSAmIFRZUEVfTUFTSyk7CisgIHhmZXIgPSAwOworCisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCBQUk9UT0NPTF9JRCwgZXJyb3IpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIHZlcnNpb24sIGVycm9yKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgIGlmICgocmV0ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfdmFyaW50MzIgKGNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3VpbnQzMikgc2VxaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3N0cmluZyAocHJvdG9jb2wsIG5hbWUsIGVycm9yKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgIHJldHVybiB4ZmVyOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIC8qIHNhdGlzZnkgLVdhbGwgKi8KKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKyAgR1F1ZXVlICpxOworCisgIC8qIHNhdGlzZnkgLVdhbGwgKi8KKyAgVEhSSUZUX1VOVVNFRF9WQVIgKG5hbWUpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgY3AgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpOworICBxID0gJihjcC0+X2xhc3RfZmllbGQpOworCisgIGdfcXVldWVfcHVzaF90YWlsIChxLCBHSU5UX1RPX1BPSU5URVIgKChnaW50KSBjcC0+X2xhc3RfZmllbGRfaWQpKTsKKyAgY3AtPl9sYXN0X2ZpZWxkX2lkID0gMDsKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqY3A7CisgIEdRdWV1ZSAqcTsKKworICAvKiBzYXRpc2Z5IC1XYWxsICovCisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgY3AgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpOworICBxID0gJihjcC0+X2xhc3RfZmllbGQpOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgY3AtPl9sYXN0X2ZpZWxkX2lkID0gKGdpbnQxNikgR1BPSU5URVJfVE9fSU5UIChnX3F1ZXVlX3BvcF90YWlsIChxKSk7CisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQxNiBmaWVsZF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICBpZiAoZmllbGRfdHlwZSA9PSBUX0JPT0wpIHsKKyAgICBjcC0+X2Jvb2xfZmllbGRfbmFtZSA9IG5hbWU7CisgICAgY3AtPl9ib29sX2ZpZWxkX3R5cGUgPSBmaWVsZF90eXBlOworICAgIGNwLT5fYm9vbF9maWVsZF9pZCA9IGZpZWxkX2lkOworICAgIHJldHVybiAwOworICB9IGVsc2UgeworICAgIHJldHVybiB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbl9pbnRlcm5hbCAoY3AsIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfaWQsIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworICB9Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICAvKiBzYXRpc2Z5IC1XYWxsICovCisgIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX3N0b3AgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworICByZXR1cm4gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCAoZ2ludDgpIFRfU1RPUCwgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX21hcF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGtleV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIHZhbHVlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyOworCisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqY3A7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisKKyAgeGZlciA9IDA7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV92YXJpbnQzMiAoY3AsIChndWludDMyKSBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICBpZiAoc2l6ZSA+IDApIHsKKyAgICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2ludDgpIChUVHlwZVRvQ1R5cGVba2V5X3R5cGVdIDw8IDQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRUeXBlVG9DVHlwZVt2YWx1ZV90eXBlXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeGZlciArPSByZXQ7CisgIH0KKworICByZXR1cm4geGZlcjsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9tYXBfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbGlzdF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBlbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICByZXR1cm4gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfY29sbGVjdGlvbl9iZWdpbiAoY3AsIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9saXN0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zZXRfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBlbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqY3A7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2NvbGxlY3Rpb25fYmVnaW4gKGNwLCBlbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLCBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc2V0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYm9vbCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2Jvb2xlYW4gdmFsdWUsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworCisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgY3AgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpOworCisgIHhmZXIgPSAwOworCisgIGlmIChjcC0+X2Jvb2xfZmllbGRfbmFtZSAhPSBOVUxMKSB7CisgICAgLyogd2UgaGF2ZW4ndCB3cml0dGVuIHRoZSBmaWVsZCBoZWFkZXIgeWV0ICovCisgICAgaWYgKChyZXQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbl9pbnRlcm5hbCAoY3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcC0+X2Jvb2xfZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwLT5fYm9vbF9maWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3AtPl9ib29sX2ZpZWxkX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdpbnQ4KSAodmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQ1RfQk9PTEVBTl9UUlVFIDogQ1RfQk9PTEVBTl9GQUxTRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IHJldDsKKworICAgIGNwLT5fYm9vbF9maWVsZF9uYW1lID0gTlVMTDsKKyAgfSBlbHNlIHsKKyAgICAvKiB3ZSdyZSBub3QgcGFydCBvZiBhIGZpZWxkLCBzbyBqdXN0IHdyaXRlIHRoZSB2YWx1ZSAqLworICAgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnaW50OCkgKHZhbHVlID8gQ1RfQk9PTEVBTl9UUlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDVF9CT09MRUFOX0ZBTFNFKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IHJldDsKKyAgfQorICByZXR1cm4geGZlcjsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ieXRlIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQ4IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgaWYgKHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKHByb3RvY29sLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgZ3BvaW50ZXIpICZ2YWx1ZSwgMSwgZXJyb3IpKSB7CisgICAgcmV0dXJuIDE7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIC0xOworICB9Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTE2IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQxNiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqY3A7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3ZhcmludDMyIChjcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpMzJfdG9femlnemFnICgoZ2ludDMyKSB2YWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kzMiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50MzIgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgY3AgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpOworCisgIHJldHVybiB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV92YXJpbnQzMiAoY3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgaTMyX3RvX3ppZ3phZyAodmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pNjQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDY0IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICByZXR1cm4gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfdmFyaW50NjQgKGNwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGk2NF90b196aWd6YWcgKHZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZG91YmxlIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdkb3VibGUgdmFsdWUsIEdFcnJvciAqKmVycm9yKQoreworICBndWludDY0IGJpdHM7CisKKyAgZ19hc3NlcnQgKHNpemVvZiAoZ2RvdWJsZSkgPT0gc2l6ZW9mIChndWludDY0KSk7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBiaXRzID0gR1VJTlQ2NF9UT19MRSAodGhyaWZ0X2JpdHdpc2VfY2FzdF9ndWludDY0ICh2YWx1ZSkpOworICBpZiAodGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAocHJvdG9jb2wtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBncG9pbnRlcikgJmJpdHMsIDgsIGVycm9yKSkgeworICAgIHJldHVybiA4OworICB9IGVsc2UgeworICAgIHJldHVybiAtMTsKKyAgfQorfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3N0cmluZyAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqc3RyLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgc2l6ZV90IGxlbjsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGxlbiA9IHN0ciAhPSBOVUxMID8gc3RybGVuIChzdHIpIDogMDsKKyAgaWYgKGxlbiA+IEdfTUFYSU5UMzIpIHsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9QUk9UT0NPTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX1NJWkVfTElNSVQsCisgICAgICAgICAgICAgICAgICJzdHJpbmcgc2l6ZSAoZ3Vlc3M6ICVsdSkgaXMgdG9vIGxhcmdlIiwgKHVuc2lnbmVkIGxvbmcpIGxlbik7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgLyogd3JpdGUgdGhlIHN0cmluZyBsZW5ndGggKyAxIHdoaWNoIGluY2x1ZGVzIHRoZSBudWxsIHRlcm1pbmF0b3IgKi8KKyAgcmV0dXJuIHRocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCAoY29uc3QgZ3BvaW50ZXIpIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBndWludDMyKSBsZW4sIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9iaW5hcnkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3BvaW50ZXIgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqY3A7CisKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXI7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisKKyAgeGZlciA9IDA7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV92YXJpbnQzMiAoY3AsIGxlbiwgZXJyb3IpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgaWYgKGxlbiA+IDApIHsKKyAgICAvKiBjaGVja2luZyBsZW4gKyB4ZmVyID4gdWludF9tYXgsIGJ1dCB3ZSBkb24ndCB3YW50IHRvIG92ZXJmbG93IHdoaWxlCisgICAgICogY2hlY2tpbmcgZm9yIG92ZXJmbG93cy4gdHJhbnNmb3JtaW5nIHRvIGxlbiA+IHVpbnRfbWF4IC0geGZlci4KKyAgICAgKi8KKyAgICBpZiAobGVuID4gKGd1aW50MzIpIChHX01BWElOVDMyIC0geGZlcikpIHsKKyAgICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1BST1RPQ09MX0VSUk9SLAorICAgICAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9TSVpFX0xJTUlULAorICAgICAgICAgICAgICAgICAgICJzaXplICVkICsgJWQgaXMgdG9vIGxhcmdlIiwgbGVuLCB4ZmVyKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAodGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAocHJvdG9jb2wtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGdwb2ludGVyKSBidWYsIGxlbiwgZXJyb3IpID09IEZBTFNFKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHhmZXIgKz0gbGVuOworICB9CisKKyAgcmV0dXJuIHhmZXI7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0TWVzc2FnZVR5cGUgKm1lc3NhZ2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDMyICpzZXFpZCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqY3A7CisKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXI7CisKKyAgZ2ludDggcHJvdG9jb2xfaWQsIHZlcnNpb25fYW5kX3R5cGUsIHZlcnNpb247CisKKyAgeGZlciA9IDA7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnByb3RvY29sX2lkLCBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICBpZiAocHJvdG9jb2xfaWQgIT0gUFJPVE9DT0xfSUQpIHsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9QUk9UT0NPTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX0JBRF9WRVJTSU9OLAorICAgICAgICAgICAgICAgICAiYmFkIHByb3RvY29sIGlkIik7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnZlcnNpb25fYW5kX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgdmVyc2lvbiA9IChnaW50OCkodmVyc2lvbl9hbmRfdHlwZSAmIFZFUlNJT05fTUFTSyk7CisgIGlmICh2ZXJzaW9uICE9IFZFUlNJT05fTikgeworICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1BST1RPQ09MX0VSUk9SLAorICAgICAgICAgICAgICAgICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfQkFEX1ZFUlNJT04sCisgICAgICAgICAgICAgICAgICJiYWQgdmVyc2lvbiBhbmQvb3IgdHlwZSIpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgICptZXNzYWdlX3R5cGUKKyAgICA9IChUaHJpZnRNZXNzYWdlVHlwZSkoKHZlcnNpb25fYW5kX3R5cGUgPj4gVFlQRV9TSElGVF9BTU9VTlQpICYgVFlQRV9CSVRTKTsKKworICBpZiAoKHJldCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfdmFyaW50MzIgKGNwLCBzZXFpZCwgZXJyb3IpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zdHJpbmcgKHByb3RvY29sLCBuYW1lLCBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICByZXR1cm4geGZlcjsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqY3A7CisgIEdRdWV1ZSAqcTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgY3AgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpOworICBxID0gJihjcC0+X2xhc3RfZmllbGQpOworCisgICpuYW1lID0gTlVMTDsKKworICBnX3F1ZXVlX3B1c2hfdGFpbCAocSwgR0lOVF9UT19QT0lOVEVSICgoZ2ludCkgY3AtPl9sYXN0X2ZpZWxkX2lkKSk7CisgIGNwLT5fbGFzdF9maWVsZF9pZCA9IDA7CisKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworICBHUXVldWUgKnE7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKyAgcSA9ICYoY3AtPl9sYXN0X2ZpZWxkKTsKKworICBjcC0+X2xhc3RfZmllbGRfaWQgPSAoZ2ludDE2KSBHUE9JTlRFUl9UT19JTlQgKGdfcXVldWVfcG9wX3RhaWwgKHEpKTsKKworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICpmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDE2ICpmaWVsZF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworCisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyOworCisgIGdpbnQxNiBtb2RpZmllcjsKKyAgZ2ludDggYnl0ZTsKKyAgZ2ludDggdHlwZTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAobmFtZSk7CisKKyAgeGZlciA9IDA7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJmJ5dGUsIGVycm9yKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgIHR5cGUgPSAoYnl0ZSAmIDB4MGYpOworCisgIC8qIGlmIGl0J3MgYSBzdG9wLCB0aGVuIHdlIGNhbiByZXR1cm4gaW1tZWRpYXRlbHksIGFzIHRoZSBzdHJ1Y3QgaXMgb3Zlci4gKi8KKyAgaWYgKHR5cGUgPT0gVF9TVE9QKSB7CisgICAgKmZpZWxkX3R5cGUgPSBUX1NUT1A7CisgICAgKmZpZWxkX2lkID0gMDsKKyAgICByZXR1cm4geGZlcjsKKyAgfQorCisgIC8qIG1hc2sgb2ZmIHRoZSA0IE1TQiBvZiB0aGUgdHlwZSBoZWFkZXIuCisgICAqIGl0IGNvdWxkIGNvbnRhaW4gYSBmaWVsZCBpZCBkZWx0YS4KKyAgICovCisgIG1vZGlmaWVyID0gKGdpbnQxNikoKChndWludDgpYnl0ZSAmIDB4ZjApID4+IDQpOworICBpZiAobW9kaWZpZXIgPT0gMCkgeworICAgIC8qIG5vdCBhIGRlbHRhLCBsb29rIGFoZWFkIGZvciB0aGUgemlnemFnIHZhcmludCBmaWVsZCBpZC4gKi8KKyAgICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2kxNiAocHJvdG9jb2wsIGZpZWxkX2lkLCBlcnJvcikpIDwgMCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IHJldDsKKyAgfSBlbHNlIHsKKyAgICAqZmllbGRfaWQgPSAoZ2ludDE2KShjcC0+X2xhc3RfZmllbGRfaWQgKyBtb2RpZmllcik7CisgIH0KKyAgaWYgKChyZXQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9nZXRfdHR5cGUgKGNwLCB0eXBlLCBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICAqZmllbGRfdHlwZSA9IHJldDsKKworICAvKiBpZiB0aGlzIGhhcHBlbnMgdG8gYmUgYSBib29sZWFuIGZpZWxkLCB0aGUgdmFsdWUgaXMgZW5jb2RlZCBpbiB0aGUgdHlwZSAqLworICBpZiAodHlwZSA9PSBDVF9CT09MRUFOX1RSVUUgfHwgdHlwZSA9PSBDVF9CT09MRUFOX0ZBTFNFKSB7CisgICAgLyogc2F2ZSB0aGUgYm9vbGVhbiB2YWx1ZSBpbiBhIHNwZWNpYWwgaW5zdGFuY2UgdmFyaWFibGUuICovCisgICAgY3AtPl9oYXNfYm9vbF92YWx1ZSA9IFRSVUU7CisgICAgY3AtPl9ib29sX3ZhbHVlID0KKyAgICAgICh0eXBlID09IENUX0JPT0xFQU5fVFJVRSA/IFRSVUUgOiBGQUxTRSk7CisgIH0KKworICAvKiBwdXNoIHRoZSBuZXcgZmllbGQgb250byB0aGUgZmllbGQgc3RhY2sgc28gd2UgY2FuIGtlZXAgdGhlIGRlbHRhcyBnb2luZy4gKi8KKyAgY3AtPl9sYXN0X2ZpZWxkX2lkID0gKmZpZWxkX2lkOworCisgIHJldHVybiB4ZmVyOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbWFwX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqa2V5X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqdmFsdWVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICpzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlcjsKKworICBnaW50OCBrdl90eXBlOworICBnaW50MzIgbXNpemU7CisKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGt2X3R5cGUgPSAwOworICBtc2l6ZSA9IDA7CisKKyAgY3AgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpOworCisgIHhmZXIgPSAwOworCisgIGlmICgocmV0ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF92YXJpbnQzMiAoY3AsICZtc2l6ZSwgZXJyb3IpKSA8MCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICAvKiBzdGlsbCByZWFkIHRoZSBrdiBieXRlIGlmIG5lZ2F0aXZlIHNpemUgKi8KKyAgaWYgKG1zaXplICE9IDApIHsKKyAgICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAma3ZfdHlwZSwgZXJyb3IpKSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeGZlciArPSByZXQ7CisgIH0KKworICBpZiAoY3AtPmNvbnRhaW5lcl9saW1pdCA+IDAgJiYgbXNpemUgPiBjcC0+Y29udGFpbmVyX2xpbWl0KSB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfUFJPVE9DT0xfRVJST1IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9TSVpFX0xJTUlULAorICAgICAgICAgICAgICAgICAiZ290IHNpemUgb3ZlciBsaW1pdCAoJWQgPiAlZCkiLCBtc2l6ZSwgY3AtPmNvbnRhaW5lcl9saW1pdCk7CisgICAgcmV0dXJuIC0xOworICB9IGVsc2UgaWYgKG1zaXplID4gMCkgeworICAgIGlmICgocmV0ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZ2V0X3R0eXBlIChjcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdpbnQ4KSgoZ3VpbnQ4KWt2X3R5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiA0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgKmtleV90eXBlID0gcmV0OworICAgIGlmICgocmV0ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZ2V0X3R0eXBlIChjcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdpbnQ4KSgoZ3VpbnQ4KWt2X3R5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIDB4ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgICp2YWx1ZV90eXBlID0gcmV0OworICAgICpzaXplID0gKGd1aW50MzIpIG1zaXplOworICB9IGVsc2UgaWYgKG1zaXplID09IDApIHsKKyAgICAqa2V5X3R5cGUgPSAwOworICAgICp2YWx1ZV90eXBlID0gMDsKKyAgICAqc2l6ZSA9IDA7CisgIH0gZWxzZSB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfUFJPVE9DT0xfRVJST1IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9ORUdBVElWRV9TSVpFLAorICAgICAgICAgICAgICAgICAiZ290IG5lZ2F0aXZlIHNpemUgb2YgJWQiLCBtc2l6ZSk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgcmV0dXJuIHhmZXI7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tYXBfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2xpc3RfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICpzaXplLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlcjsKKworICBnaW50OCBzaXplX2FuZF90eXBlOworICBnaW50MzIgbHNpemU7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisKKyAgc2l6ZV9hbmRfdHlwZSA9IDA7CisKKyAgeGZlciA9IDA7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnNpemVfYW5kX3R5cGUsIGVycm9yKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgIGxzaXplID0gKChndWludDgpc2l6ZV9hbmRfdHlwZSA+PiA0KSAmIDB4MGY7CisgIGlmIChsc2l6ZSA9PSAxNSkgeworICAgIGlmICgocmV0ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF92YXJpbnQzMiAoY3AsICZsc2l6ZSwgZXJyb3IpKSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeGZlciArPSByZXQ7CisgIH0KKworICBpZiAobHNpemUgPCAwKSB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfUFJPVE9DT0xfRVJST1IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9ORUdBVElWRV9TSVpFLAorICAgICAgICAgICAgICAgICAiZ290IG5lZ2F0aXZlIHNpemUgb2YgJWQiLCBsc2l6ZSk7CisgICAgcmV0dXJuIC0xOworICB9IGVsc2UgaWYgKGNwLT5jb250YWluZXJfbGltaXQgPiAwICYmIGxzaXplID4gY3AtPmNvbnRhaW5lcl9saW1pdCkgeworICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1BST1RPQ09MX0VSUk9SLAorICAgICAgICAgICAgICAgICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfU0laRV9MSU1JVCwKKyAgICAgICAgICAgICAgICAgImdvdCBzaXplIG92ZXIgbGltaXQgKCVkID4gJWQpIiwgbHNpemUsIGNwLT5jb250YWluZXJfbGltaXQpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGlmICgocmV0ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZ2V0X3R0eXBlIChjcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnaW50OCkoc2l6ZV9hbmRfdHlwZSAmIDB4MGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgKmVsZW1lbnRfdHlwZSA9IHJldDsKKyAgKnNpemUgPSAoZ3VpbnQzMikgbHNpemU7CisKKyAgcmV0dXJuIHhmZXI7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9saXN0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc2V0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgKnNpemUsIEdFcnJvciAqKmVycm9yKQoreworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIHJldHVybiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9saXN0X2JlZ2luIChwcm90b2NvbCwgZWxlbWVudF90eXBlLCBzaXplLCBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zZXRfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2Jvb2wgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2Jvb2xlYW4gKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlcjsKKworICBnaW50OCB2YWw7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisKKyAgeGZlciA9IDA7CisKKyAgaWYgKGNwLT5faGFzX2Jvb2xfdmFsdWUgPT0gVFJVRSkgeworICAgICp2YWx1ZSA9IGNwLT5fYm9vbF92YWx1ZTsKKyAgICBjcC0+X2hhc19ib29sX3ZhbHVlID0gRkFMU0U7CisgICAgcmV0dXJuIDA7CisgIH0gZWxzZSB7CisgICAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnZhbCwgZXJyb3IpKSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeGZlciArPSByZXQ7CisKKyAgICAqdmFsdWUgPSAodmFsID09IENUX0JPT0xFQU5fVFJVRSk7CisgICAgcmV0dXJuIHhmZXI7CisgIH0KK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDggKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDMyIHJldDsKKyAgZ3BvaW50ZXIgYlsxXTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGlmICgocmV0ID0KKyAgICAgICB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsIChwcm90b2NvbC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIsIDEsIGVycm9yKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgICp2YWx1ZSA9ICooZ2ludDggKikgYjsKKyAgcmV0dXJuIHJldDsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2kxNiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50MTYgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworCisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB2YWw7CisgIGdpbnQzMiB4ZmVyOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgY3AgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpOworCisgIHhmZXIgPSAwOworCisgIGlmICgocmV0ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF92YXJpbnQzMiAoY3AsICZ2YWwsIGVycm9yKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgICp2YWx1ZSA9IChnaW50MTYpIHppZ3phZ190b19pMzIgKChndWludDMyKSB2YWwpOworCisgIHJldHVybiB4ZmVyOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTMyIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQzMiAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqY3A7CisKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHZhbDsKKyAgZ2ludDMyIHhmZXI7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisKKyAgeGZlciA9IDA7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3ZhcmludDMyIChjcCwgJnZhbCwgZXJyb3IpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgKnZhbHVlID0gemlnemFnX3RvX2kzMiAoKGd1aW50MzIpIHZhbCk7CisKKyAgcmV0dXJuIHhmZXI7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pNjQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDY0ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKworICBnaW50MzIgcmV0OworICBnaW50NjQgdmFsOworICBnaW50MzIgeGZlcjsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICB4ZmVyID0gMDsKKworICBpZiAoKHJldCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfdmFyaW50NjQgKGNwLCAmdmFsLCBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICAqdmFsdWUgPSB6aWd6YWdfdG9faTY0ICgoZ3VpbnQ2NCkgdmFsKTsKKworICByZXR1cm4geGZlcjsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2RvdWJsZSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdkb3VibGUgKnZhbHVlLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDMyIHJldDsKKyAgdW5pb24geworICAgIGd1aW50NjQgYml0czsKKyAgICBndWludDggYls4XTsKKyAgfSB1OworCisgIGdfYXNzZXJ0IChzaXplb2YgKGdkb3VibGUpID09IHNpemVvZiAoZ3VpbnQ2NCkpOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgaWYgKChyZXQgPQorICAgICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwgKHByb3RvY29sLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdS5iLCA4LCBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICB1LmJpdHMgPSBHVUlOVDY0X0ZST01fTEUgKHUuYml0cyk7CisgICp2YWx1ZSA9IHRocmlmdF9iaXR3aXNlX2Nhc3RfZ2RvdWJsZSAodS5iaXRzKTsKKyAgcmV0dXJuIHJldDsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3N0cmluZyAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqc3RyLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlcjsKKworICBnaW50MzIgcmVhZF9sZW47CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisKKyAgeGZlciA9IDA7CisgIHJlYWRfbGVuID0gMDsKKworICAvKiByZWFkIHRoZSBsZW5ndGggaW50byByZWFkX2xlbiAqLworICBpZiAoKHJldCA9CisgICAgICAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF92YXJpbnQzMiAoY3AsICZyZWFkX2xlbiwgZXJyb3IpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgaWYgKGNwLT5zdHJpbmdfbGltaXQgPiAwICYmIHJlYWRfbGVuID4gY3AtPnN0cmluZ19saW1pdCkgeworICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1BST1RPQ09MX0VSUk9SLAorICAgICAgICAgICAgICAgICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfU0laRV9MSU1JVCwKKyAgICAgICAgICAgICAgICAgImdvdCBzaXplIG92ZXIgbGltaXQgKCVkID4gJWQpIiwgcmVhZF9sZW4sIGNwLT5zdHJpbmdfbGltaXQpOworICAgICpzdHIgPSBOVUxMOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGlmIChyZWFkX2xlbiA8IDApIHsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9QUk9UT0NPTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX05FR0FUSVZFX1NJWkUsCisgICAgICAgICAgICAgICAgICJnb3QgbmVnYXRpdmUgc2l6ZSBvZiAlZCIsIHJlYWRfbGVuKTsKKyAgICAqc3RyID0gTlVMTDsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICAvKiBhbGxvY2F0ZSB0aGUgbWVtb3J5IGFzIGFuIGFycmF5IG9mIHVuc2lnbmVkIGNoYXIgZm9yIGJpbmFyeSBkYXRhICovCisgICpzdHIgPSBnX25ldzAgKGdjaGFyLCByZWFkX2xlbiArIDEpOworICBpZiAocmVhZF9sZW4gPiAwKSB7CisgICAgaWYgKChyZXQgPQorICAgICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbCAocHJvdG9jb2wtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzdHIsIHJlYWRfbGVuLCBlcnJvcikpIDwgMCkgeworICAgICAgZ19mcmVlICgqc3RyKTsKKyAgICAgICpzdHIgPSBOVUxMOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IHJldDsKKyAgfSBlbHNlIHsKKyAgICAqKnN0ciA9IDA7CisgIH0KKworICByZXR1cm4geGZlcjsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2JpbmFyeSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwb2ludGVyICpidWYsIGd1aW50MzIgKmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlcjsKKworICBnaW50MzIgcmVhZF9sZW47CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisKKyAgeGZlciA9IDA7CisgIHJlYWRfbGVuID0gMDsKKworICAvKiByZWFkIHRoZSBsZW5ndGggaW50byByZWFkX2xlbiAqLworICBpZiAoKHJldCA9CisgICAgICAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF92YXJpbnQzMiAoY3AsICZyZWFkX2xlbiwgZXJyb3IpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgaWYgKGNwLT5zdHJpbmdfbGltaXQgPiAwICYmIHJlYWRfbGVuID4gY3AtPnN0cmluZ19saW1pdCkgeworICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1BST1RPQ09MX0VSUk9SLAorICAgICAgICAgICAgICAgICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfU0laRV9MSU1JVCwKKyAgICAgICAgICAgICAgICAgImdvdCBzaXplIG92ZXIgbGltaXQgKCVkID4gJWQpIiwgcmVhZF9sZW4sIGNwLT5zdHJpbmdfbGltaXQpOworICAgICpidWYgPSBOVUxMOworICAgICpsZW4gPSAwOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGlmIChyZWFkX2xlbiA+IDApIHsKKyAgICAvKiBhbGxvY2F0ZSB0aGUgbWVtb3J5IGFzIGFuIGFycmF5IG9mIHVuc2lnbmVkIGNoYXIgZm9yIGJpbmFyeSBkYXRhICovCisgICAgKmxlbiA9IChndWludDMyKSByZWFkX2xlbjsKKyAgICAqYnVmID0gZ19uZXcgKGd1Y2hhciwgKmxlbik7CisgICAgaWYgKChyZXQgPQorICAgICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbCAocHJvdG9jb2wtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWYsICpsZW4sIGVycm9yKSkgPCAwKSB7CisgICAgICBnX2ZyZWUgKCpidWYpOworICAgICAgKmJ1ZiA9IE5VTEw7CisgICAgICAqbGVuID0gMDsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeGZlciArPSByZXQ7CisKKyAgfSBlbHNlIGlmIChyZWFkX2xlbiA9PSAwKSB7CisgICAgKmxlbiA9IChndWludDMyKSByZWFkX2xlbjsKKyAgICAqYnVmID0gTlVMTDsKKworICB9IGVsc2UgeworICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1BST1RPQ09MX0VSUk9SLAorICAgICAgICAgICAgICAgICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfTkVHQVRJVkVfU0laRSwKKyAgICAgICAgICAgICAgICAgImdvdCBuZWdhdGl2ZSBzaXplIG9mICVkIiwgcmVhZF9sZW4pOworICAgICpidWYgPSBOVUxMOworICAgICpsZW4gPSAwOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIHJldHVybiB4ZmVyOworfQorCisvKiBwcm9wZXJ0eSBhY2Nlc3NvciAqLwordm9pZAordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYykKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICp0YzsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOworCisgIHRjID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkgeworICAgIGNhc2UgUFJPUF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9TVFJJTkdfTElNSVQ6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCB0Yy0+c3RyaW5nX2xpbWl0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9DT05UQUlORVJfTElNSVQ6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCB0Yy0+Y29udGFpbmVyX2xpbWl0KTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKy8qIHByb3BlcnR5IG11dGF0b3IgKi8KK3ZvaWQKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqdGM7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKKworICB0YyA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpIHsKKyAgICBjYXNlIFBST1BfVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfU1RSSU5HX0xJTUlUOgorICAgICAgdGMtPnN0cmluZ19saW1pdCA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX0NPTlRBSU5FUl9MSU1JVDoKKyAgICAgIHRjLT5jb250YWluZXJfbGltaXQgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKy8qIGluaXRpYWxpemUgdGhlIGNsYXNzICovCitzdGF0aWMgdm9pZAordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfY2xhc3NfaW5pdCAoVGhyaWZ0Q29tcGFjdFByb3RvY29sQ2xhc3MgKmtsYXNzKQoreworICBUaHJpZnRQcm90b2NvbENsYXNzICpjbHM7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR1BhcmFtU3BlYyAqcGFyYW1fc3BlYzsKKworICBjbHMgPSBUSFJJRlRfUFJPVE9DT0xfQ0xBU1MgKGtsYXNzKTsKKyAgZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChrbGFzcyk7CisgIHBhcmFtX3NwZWMgPSBOVUxMOworCisgIC8qIHNldHVwIGFjY2Vzc29ycyBhbmQgbXV0YXRvcnMgKi8KKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9zZXRfcHJvcGVydHk7CisKKyAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY19pbnQgKCJzdHJpbmdfbGltaXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1heCBhbGxvd2VkIHN0cmluZyBzaXplIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXQgdGhlIG1heCBzdHJpbmcgbGltaXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogbWluICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX01BWElOVDMyLCAvKiBtYXggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIGRlZmF1bHQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fQ09OU1RSVUNUX09OTFkgfCBHX1BBUkFNX1JFQURXUklURSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BfVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfU1RSSU5HX0xJTUlULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9zcGVjKTsKKworICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX2ludCAoImNvbnRhaW5lcl9saW1pdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWF4IGFsbG93ZWQgY29udGFpbmVyIHNpemUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldCB0aGUgbWF4IGNvbnRhaW5lciBsaW1pdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBtaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfTUFYSU5UMzIsIC8qIG1heCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogZGVmYXVsdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8IEdfUEFSQU1fUkVBRFdSSVRFKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9DT05UQUlORVJfTElNSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOworCisgIGNscy0+d3JpdGVfbWVzc2FnZV9iZWdpbiA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW47CisgIGNscy0+d3JpdGVfbWVzc2FnZV9lbmQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2VuZDsKKyAgY2xzLT53cml0ZV9zdHJ1Y3RfYmVnaW4gPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfYmVnaW47CisgIGNscy0+d3JpdGVfc3RydWN0X2VuZCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9lbmQ7CisgIGNscy0+d3JpdGVfZmllbGRfYmVnaW4gPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbjsKKyAgY2xzLT53cml0ZV9maWVsZF9lbmQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQ7CisgIGNscy0+d3JpdGVfZmllbGRfc3RvcCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX3N0b3A7CisgIGNscy0+d3JpdGVfbWFwX2JlZ2luID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbWFwX2JlZ2luOworICBjbHMtPndyaXRlX21hcF9lbmQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9tYXBfZW5kOworICBjbHMtPndyaXRlX2xpc3RfYmVnaW4gPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9saXN0X2JlZ2luOworICBjbHMtPndyaXRlX2xpc3RfZW5kID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbGlzdF9lbmQ7CisgIGNscy0+d3JpdGVfc2V0X2JlZ2luID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc2V0X2JlZ2luOworICBjbHMtPndyaXRlX3NldF9lbmQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zZXRfZW5kOworICBjbHMtPndyaXRlX2Jvb2wgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ib29sOworICBjbHMtPndyaXRlX2J5dGUgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ieXRlOworICBjbHMtPndyaXRlX2kxNiA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kxNjsKKyAgY2xzLT53cml0ZV9pMzIgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMzI7CisgIGNscy0+d3JpdGVfaTY0ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTY0OworICBjbHMtPndyaXRlX2RvdWJsZSA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2RvdWJsZTsKKyAgY2xzLT53cml0ZV9zdHJpbmcgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zdHJpbmc7CisgIGNscy0+d3JpdGVfYmluYXJ5ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYmluYXJ5OworICBjbHMtPnJlYWRfbWVzc2FnZV9iZWdpbiA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbjsKKyAgY2xzLT5yZWFkX21lc3NhZ2VfZW5kID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2VuZDsKKyAgY2xzLT5yZWFkX3N0cnVjdF9iZWdpbiA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc3RydWN0X2JlZ2luOworICBjbHMtPnJlYWRfc3RydWN0X2VuZCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc3RydWN0X2VuZDsKKyAgY2xzLT5yZWFkX2ZpZWxkX2JlZ2luID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbjsKKyAgY2xzLT5yZWFkX2ZpZWxkX2VuZCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kOworICBjbHMtPnJlYWRfbWFwX2JlZ2luID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tYXBfYmVnaW47CisgIGNscy0+cmVhZF9tYXBfZW5kID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tYXBfZW5kOworICBjbHMtPnJlYWRfbGlzdF9iZWdpbiA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbGlzdF9iZWdpbjsKKyAgY2xzLT5yZWFkX2xpc3RfZW5kID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9saXN0X2VuZDsKKyAgY2xzLT5yZWFkX3NldF9iZWdpbiA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc2V0X2JlZ2luOworICBjbHMtPnJlYWRfc2V0X2VuZCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc2V0X2VuZDsKKyAgY2xzLT5yZWFkX2Jvb2wgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2Jvb2w7CisgIGNscy0+cmVhZF9ieXRlID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlOworICBjbHMtPnJlYWRfaTE2ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pMTY7CisgIGNscy0+cmVhZF9pMzIgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2kzMjsKKyAgY2xzLT5yZWFkX2k2NCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTY0OworICBjbHMtPnJlYWRfZG91YmxlID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9kb3VibGU7CisgIGNscy0+cmVhZF9zdHJpbmcgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3N0cmluZzsKKyAgY2xzLT5yZWFkX2JpbmFyeSA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYmluYXJ5OworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfaW5pdCAoVGhyaWZ0Q29tcGFjdFByb3RvY29sICpzZWxmKQoreworICBnX3F1ZXVlX2luaXQgKCYoc2VsZi0+X2xhc3RfZmllbGQpKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmZjYWFkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbC5oCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX0gKKyNkZWZpbmUgX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX0gKKworI2luY2x1ZGUgPGdsaWIuaD4KKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisKK0dfQkVHSU5fREVDTFMKKworLyohIFxmaWxlIHRocmlmdF9jb21wYWN0X3Byb3RvY29sLmgKKyAqICBcYnJpZWYgQ29tcGFjdCBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBvZiBhIFRocmlmdCBwcm90b2NvbC4gIEltcGxlbWVudHMgdGhlCisgKiAgICAgICAgIFRocmlmdFByb3RvY29sIGludGVyZmFjZS4KKyAqLworCisvKiB0eXBlIG1hY3JvcyAqLworI2RlZmluZSBUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0wsIFwKKyAgIFRocmlmdENvbXBhY3RQcm90b2NvbCkpCisjZGVmaW5lIFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MKSkKKyNkZWZpbmUgVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfQ0xBU1MoYykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTCwgXAorICAgVGhyaWZ0Q29tcGFjdFByb3RvY29sQ2xhc3MpKQorI2RlZmluZSBUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTF9DTEFTUyhjKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MKSkKKyNkZWZpbmUgVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfR0VUX0NMQVNTKG9iaikgXAorICAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0wsIFwKKyAgIFRocmlmdENvbXBhY3RQcm90b2NvbENsYXNzKSkKKworCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0Q29tcGFjdFByb3RvY29sIFRocmlmdENvbXBhY3RQcm90b2NvbDsKKworLyohCisgKiBUaHJpZnQgQ29tcGFjdCBQcm90b2NvbCBpbnN0YW5jZS4KKyAqLworc3RydWN0IF9UaHJpZnRDb21wYWN0UHJvdG9jb2wKK3sKKyAgVGhyaWZ0UHJvdG9jb2wgcGFyZW50OworCisgIC8qIHByb3RlY3RlZCAqLworICBnaW50MzIgc3RyaW5nX2xpbWl0OworICBnaW50MzIgY29udGFpbmVyX2xpbWl0OworCisgIC8qIHByaXZhdGUgKi8KKworICAvKioKKyAgICogKFdyaXRpbmcpIElmIHdlIGVuY291bnRlciBhIGJvb2xlYW4gZmllbGQgYmVnaW4sIHNhdmUgdGhlIFRGaWVsZCBoZXJlCisgICAqIHNvIGl0IGNhbiBoYXZlIHRoZSB2YWx1ZSBpbmNvcnBvcmF0ZWQuCisgICAqLworICBjb25zdCBnY2hhciogX2Jvb2xfZmllbGRfbmFtZTsKKyAgVGhyaWZ0VHlwZSBfYm9vbF9maWVsZF90eXBlOworICBnaW50MTYgX2Jvb2xfZmllbGRfaWQ7CisKKyAgLyoqCisgICAqIChSZWFkaW5nKSBJZiB3ZSByZWFkIGEgZmllbGQgaGVhZGVyLCBhbmQgaXQncyBhIGJvb2xlYW4gZmllbGQsIHNhdmUKKyAgICogdGhlIGJvb2xlYW4gdmFsdWUgaGVyZSBzbyB0aGF0IHJlYWRfYm9vbCBjYW4gdXNlIGl0LgorICAgKi8KKyAgZ2Jvb2xlYW4gX2hhc19ib29sX3ZhbHVlOworICBnYm9vbGVhbiBfYm9vbF92YWx1ZTsKKworICAvKioKKyAgICogVXNlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBsYXN0IGZpZWxkIGZvciB0aGUgY3VycmVudCBhbmQgcHJldmlvdXMgc3RydWN0cywKKyAgICogc28gd2UgY2FuIGRvIHRoZSBkZWx0YSBzdHVmZi4KKyAgICovCisKKyAgR1F1ZXVlIF9sYXN0X2ZpZWxkOworICBnaW50MTYgX2xhc3RfZmllbGRfaWQ7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0Q29tcGFjdFByb3RvY29sQ2xhc3MgVGhyaWZ0Q29tcGFjdFByb3RvY29sQ2xhc3M7CisKKy8qIQorICogVGhyaWZ0IENvbXBhY3QgUHJvdG9jb2wgY2xhc3MuCisgKi8KK3N0cnVjdCBfVGhyaWZ0Q29tcGFjdFByb3RvY29sQ2xhc3MKK3sKKyAgVGhyaWZ0UHJvdG9jb2xDbGFzcyBwYXJlbnQ7Cit9OworCisvKiB1c2VkIGJ5IFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0wgKi8KK0dUeXBlIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9IICovCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sX2ZhY3RvcnkuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MjVlMWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sX2ZhY3RvcnkuYwpAQCAtMCwwICsxLDE0MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5Lmg+CisKKy8qIG9iamVjdCBwcm9wZXJ0aWVzICovCitlbnVtIF9UaHJpZnRDb21wYWN0UHJvdG9jb2xGYWN0b3J5UHJvcGVydGllcworeworICAgIFBST1BfMCwKKyAgICBQUk9QX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUllfU1RSSU5HX0xJTUlULAorICAgIFBST1BfVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWV9DT05UQUlORVJfTElNSVQKK307CisKK0dfREVGSU5FX1RZUEUgKFRocmlmdENvbXBhY3RQcm90b2NvbEZhY3RvcnksIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2ZhY3RvcnksCisgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9QUk9UT0NPTF9GQUNUT1JZKQorCitUaHJpZnRQcm90b2NvbCAqCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5X2dldF9wcm90b2NvbCAoVGhyaWZ0UHJvdG9jb2xGYWN0b3J5ICpmYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2xGYWN0b3J5ICp0Y2Y7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqdGM7CisKKyAgdGNmID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWSAoZmFjdG9yeSk7CisKKyAgdGMgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0wsCisgICAgICAgICAgICAgICAgICAgICAidHJhbnNwb3J0IiwgdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgInN0cmluZ19saW1pdCIsIHRjZi0+c3RyaW5nX2xpbWl0LAorICAgICAgICAgICAgICAgICAgICAgImNvbnRhaW5lcl9saW1pdCIsIHRjZi0+Y29udGFpbmVyX2xpbWl0LAorICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTCAodGMpOworfQorCisvKiBwcm9wZXJ0eSBhY2Nlc3NvciAqLwordm9pZAordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbEZhY3RvcnkgKnRjZjsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOworCisgIHRjZiA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUlkgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkgeworICAgIGNhc2UgUFJPUF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZX1NUUklOR19MSU1JVDoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHRjZi0+c3RyaW5nX2xpbWl0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZX0NPTlRBSU5FUl9MSU1JVDoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHRjZi0+Y29udGFpbmVyX2xpbWl0KTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKy8qIHByb3BlcnR5IG11dGF0b3IgKi8KK3ZvaWQKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX2ZhY3Rvcnlfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwc3BlYykKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sRmFjdG9yeSAqdGNmOworCisgIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7CisKKyAgdGNmID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWSAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKSB7CisgICAgY2FzZSBQUk9QX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUllfU1RSSU5HX0xJTUlUOgorICAgICAgdGNmLT5zdHJpbmdfbGltaXQgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZX0NPTlRBSU5FUl9MSU1JVDoKKyAgICAgIHRjZi0+Y29udGFpbmVyX2xpbWl0ID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeV9jbGFzc19pbml0IChUaHJpZnRDb21wYWN0UHJvdG9jb2xGYWN0b3J5Q2xhc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2xhc3MpCit7CisgIFRocmlmdFByb3RvY29sRmFjdG9yeUNsYXNzICpjbHM7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR1BhcmFtU3BlYyAqcGFyYW1fc3BlYzsKKworICBjbHMgPSBUSFJJRlRfUFJPVE9DT0xfRkFDVE9SWV9DTEFTUyAoa2xhc3MpOworICBnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKyAgcGFyYW1fc3BlYyA9IE5VTEw7CisKKyAgLyogc2V0dXAgYWNjZXNzb3JzIGFuZCBtdXRhdG9ycyAqLworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5X2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeV9zZXRfcHJvcGVydHk7CisKKyAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY19pbnQgKCJzdHJpbmdfbGltaXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1heCBhbGxvd2VkIHN0cmluZyBzaXplIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXQgdGhlIG1heCBzdHJpbmcgbGltaXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogbWluICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX01BWElOVDMyLCAvKiBtYXggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIGRlZmF1bHQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fQ09OU1RSVUNUX09OTFkgfCBHX1BBUkFNX1JFQURXUklURSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BfVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWV9TVFJJTkdfTElNSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOworCisgIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfaW50ICgiY29udGFpbmVyX2xpbWl0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYXggYWxsb3dlZCBjb250YWluZXIgc2l6ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2V0IHRoZSBtYXggY29udGFpbmVyIGxpbWl0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIG1pbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19NQVhJTlQzMiwgLyogbWF4ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBkZWZhdWx0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZIHwgR19QQVJBTV9SRUFEV1JJVEUpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgIFBST1BfVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWV9DT05UQUlORVJfTElNSVQsIHBhcmFtX3NwZWMpOworCisgIGNscy0+Z2V0X3Byb3RvY29sID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeV9nZXRfcHJvdG9jb2w7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5X2luaXQgKFRocmlmdENvbXBhY3RQcm90b2NvbEZhY3RvcnkgKmZhY3RvcnkpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChmYWN0b3J5KTsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeS5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JmOTUzYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeS5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWV9ICisjZGVmaW5lIF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZX0gKKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9mYWN0b3J5Lmg+CisKK0dfQkVHSU5fREVDTFMKKworLyogdHlwZSBtYWNyb3MgKi8KKyNkZWZpbmUgVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZIFwKKyAgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2ZhY3RvcnlfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIFRIUklGVF9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUlkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWSwgXAorICAgVGhyaWZ0Q29tcGFjdFByb3RvY29sRmFjdG9yeSkpCisjZGVmaW5lIFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUlkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWSkpCisjZGVmaW5lIFRIUklGVF9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUllfQ0xBU1MoYykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZLCBcCisgICBUaHJpZnRDb21wYWN0UHJvdG9jb2xGYWN0b3J5Q2xhc3MpKQorI2RlZmluZSBUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZX0NMQVNTKGMpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWSkpCisjZGVmaW5lIFRIUklGVF9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUllfR0VUX0NMQVNTKG9iaikgXAorICAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWSwgXAorICAgVGhyaWZ0Q29tcGFjdFByb3RvY29sRmFjdG9yeUNsYXNzKSkKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdENvbXBhY3RQcm90b2NvbEZhY3RvcnkgVGhyaWZ0Q29tcGFjdFByb3RvY29sRmFjdG9yeTsKKworc3RydWN0IF9UaHJpZnRDb21wYWN0UHJvdG9jb2xGYWN0b3J5Cit7CisgIFRocmlmdFByb3RvY29sRmFjdG9yeSBwYXJlbnQ7CisKKyAgLyogcHJvdGVjdGVkICovCisgIGdpbnQzMiBzdHJpbmdfbGltaXQ7CisgIGdpbnQzMiBjb250YWluZXJfbGltaXQ7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0Q29tcGFjdFByb3RvY29sRmFjdG9yeUNsYXNzCisgIFRocmlmdENvbXBhY3RQcm90b2NvbEZhY3RvcnlDbGFzczsKKworc3RydWN0IF9UaHJpZnRDb21wYWN0UHJvdG9jb2xGYWN0b3J5Q2xhc3MKK3sKKyAgVGhyaWZ0UHJvdG9jb2xGYWN0b3J5Q2xhc3MgcGFyZW50OworfTsKKworLyogdXNlZCBieSBUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUlkgKi8KK0dUeXBlIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2ZhY3RvcnlfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUllfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2wuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI3ZjRhOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sLmMKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Z2xpYi5oPgorI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2wuaD4KKworCitlbnVtCit7CisgIFBST1BfVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MX1NFUlZJQ0VfTkFNRSA9IDEsCisgIFBST1BfVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MX0VORAorfTsKKworR19ERUZJTkVfVFlQRShUaHJpZnRNdWx0aXBsZXhlZFByb3RvY29sLCB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2wsIFRIUklGVF9UWVBFX1BST1RPQ09MX0RFQ09SQVRPUikKKworCitzdGF0aWMgR1BhcmFtU3BlYyAqdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sX29ial9wcm9wZXJ0aWVzW1BST1BfVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MX0VORF0gPSB7IE5VTEwsIH07CisKK2dpbnQzMgordGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKFRocmlmdE11bHRpcGxleGVkUHJvdG9jb2wgKnByb3RvY29sLAorICAgIGNvbnN0IGdjaGFyICpuYW1lLCBjb25zdCBUaHJpZnRNZXNzYWdlVHlwZSBtZXNzYWdlX3R5cGUsCisgICAgY29uc3QgZ2ludDMyIHNlcWlkLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDMyIHJldDsKKyAgZ2NoYXIgKnNlcnZpY2VfbmFtZSA9IE5VTEw7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfTVVMVElQTEVYRURfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIFRocmlmdE11bHRpcGxleGVkUHJvdG9jb2wgKnNlbGYgPSBUSFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0wgKHByb3RvY29sKTsKKyAgVGhyaWZ0TXVsdGlwbGV4ZWRQcm90b2NvbENsYXNzICptdWx0aXBsZXhDbGFzcyA9IFRIUklGVF9NVUxUSVBMRVhFRF9QUk9UT0NPTF9HRVRfQ0xBU1Moc2VsZik7CisKKyAgaWYoIChtZXNzYWdlX3R5cGUgPT0gVF9DQUxMIHx8IG1lc3NhZ2VfdHlwZSA9PSBUX09ORVdBWSkgJiYgc2VsZi0+c2VydmljZV9uYW1lICE9IE5VTEwpIHsKKyAgICBzZXJ2aWNlX25hbWUgPSBnX3N0cmR1cF9wcmludGYoIiVzJXMlcyIsIHNlbGYtPnNlcnZpY2VfbmFtZSwgVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MX0RFRkFVTFRfU0VQQVJBVE9SLCBuYW1lKTsKKyAgfWVsc2V7CisgICAgc2VydmljZV9uYW1lID0gZ19zdHJkdXAobmFtZSk7CisgIH0KKworICAvKiByZWxheSB0byB0aGUgcHJvdG9jb2xfZGVjb3JhdG9yICovCisgIHJldCA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfbWVzc2FnZV9iZWdpbihwcm90b2NvbCwgc2VydmljZV9uYW1lLCBtZXNzYWdlX3R5cGUsIHNlcWlkLCBlcnJvcik7CisKKyAgZ19mcmVlKHNlcnZpY2VfbmFtZSk7CisKKyAgcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgdm9pZAordGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sX3NldF9wcm9wZXJ0eSAoR09iamVjdCAgICAgICpvYmplY3QsCisgICAgZ3VpbnQgICAgICAgICBwcm9wZXJ0eV9pZCwKKyAgICBjb25zdCBHVmFsdWUgKnZhbHVlLAorICAgIEdQYXJhbVNwZWMgICAqcHNwZWMpCit7CisgIFRocmlmdE11bHRpcGxleGVkUHJvdG9jb2wgKnNlbGYgPSBUSFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0wgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKKyAgeworICBjYXNlIFBST1BfVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MX1NFUlZJQ0VfTkFNRToKKyAgICBzZWxmLT5zZXJ2aWNlX25hbWUgPSBnX3ZhbHVlX2R1cF9zdHJpbmcgKHZhbHVlKTsKKyAgICBicmVhazsKKworICBkZWZhdWx0OgorICAgIC8qIFdlIGRvbid0IGhhdmUgYW55IG90aGVyIHByb3BlcnR5Li4uICovCisgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7CisgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbF9nZXRfcHJvcGVydHkgKEdPYmplY3QgICAgKm9iamVjdCwKKyAgICBndWludCAgICAgICBwcm9wZXJ0eV9pZCwKKyAgICBHVmFsdWUgICAgICp2YWx1ZSwKKyAgICBHUGFyYW1TcGVjICpwc3BlYykKK3sKKyAgVGhyaWZ0TXVsdGlwbGV4ZWRQcm90b2NvbCAqc2VsZiA9IFRIUklGVF9NVUxUSVBMRVhFRF9QUk9UT0NPTCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKQorICB7CisgIGNhc2UgUFJPUF9USFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0xfU0VSVklDRV9OQU1FOgorICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHNlbGYtPnNlcnZpY2VfbmFtZSk7CisgICAgYnJlYWs7CisKKyAgZGVmYXVsdDoKKyAgICAvKiBXZSBkb24ndCBoYXZlIGFueSBvdGhlciBwcm9wZXJ0eS4uLiAqLworICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wZXJ0eV9pZCwgcHNwZWMpOworICAgIGJyZWFrOworICB9Cit9CisKKworc3RhdGljIHZvaWQKK3RocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbF9pbml0IChUaHJpZnRNdWx0aXBsZXhlZFByb3RvY29sICpwcm90b2NvbCkKK3sKKyAgcHJvdG9jb2wtPnNlcnZpY2VfbmFtZSA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2xfZmluYWxpemUgKEdPYmplY3QgKmdvYmplY3QpCit7CisgIFRocmlmdE11bHRpcGxleGVkUHJvdG9jb2wgKnNlbGYgPSBUSFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0wgKGdvYmplY3QpOworCisgIGlmIChzZWxmLT5zZXJ2aWNlX25hbWUpIHsKKyAgICBnX2ZyZWUoc2VsZi0+c2VydmljZV9uYW1lKTsKKyAgICBzZWxmLT5zZXJ2aWNlX25hbWUgPSBOVUxMOworICB9CisKKyAgLyogQWx3YXlzIGNoYWluIHVwIHRvIHRoZSBwYXJlbnQgY2xhc3M7IGFzIHdpdGggZGlzcG9zZSgpLCBmaW5hbGl6ZSgpCisgICAqIGlzIGd1YXJhbnRlZWQgdG8gZXhpc3Qgb24gdGhlIHBhcmVudCdzIGNsYXNzIHZpcnR1YWwgZnVuY3Rpb24gdGFibGUKKyAgICovCisgIEdfT0JKRUNUX0NMQVNTICh0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2xfcGFyZW50X2NsYXNzKS0+ZmluYWxpemUoZ29iamVjdCk7Cit9CisKKworLyogaW5pdGlhbGl6ZSB0aGUgY2xhc3MgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2xfY2xhc3NfaW5pdCAoVGhyaWZ0TXVsdGlwbGV4ZWRQcm90b2NvbENsYXNzICprbGFzcykKK3sKKyAgVGhyaWZ0UHJvdG9jb2xDbGFzcyAqY2xzID0gVEhSSUZUX1BST1RPQ09MX0NMQVNTIChrbGFzcyk7CisgIEdPYmplY3RDbGFzcyAqb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKworICBjbHMtPndyaXRlX21lc3NhZ2VfYmVnaW4gPSB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbjsKKworICBvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IHRocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbF9zZXRfcHJvcGVydHk7CisgIG9iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sX2dldF9wcm9wZXJ0eTsKKyAgb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IHRocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbF9maW5hbGl6ZTsKKworICB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2xfb2JqX3Byb3BlcnRpZXNbUFJPUF9USFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0xfU0VSVklDRV9OQU1FXSA9CisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgic2VydmljZS1uYW1lIiwKKyAgICAgICAgICAiU2VydmljZSBuYW1lIHRoZSBwcm90b2NvbCBwb2ludHMgdG8iLAorICAgICAgICAgICJTZXQgdGhlIHNlcnZpY2UgbmFtZSIsCisgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAoR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8IEdfUEFSQU1fUkVBRFdSSVRFKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0aWVzIChvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX1RIUklGVF9NVUxUSVBMRVhFRF9QUk9UT0NPTF9FTkQsCisgICAgICB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2xfb2JqX3Byb3BlcnRpZXMpOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2wuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZlMDhmYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sLmgKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0xfSAorI2RlZmluZSBfVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MX0gKKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvci5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKworR19CRUdJTl9ERUNMUworCisvKiEgXGZpbGUgdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sLmgKKyAqICBcYnJpZWYgTXVsdGlwbGV4ZWQgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gb2YgYSBUaHJpZnQgcHJvdG9jb2wuICBJbXBsZW1lbnRzIHRoZQorICogICAgICAgICBUaHJpZnRQcm90b2NvbCBpbnRlcmZhY2UuCisgKi8KKworLyogdHlwZSBtYWNyb3MgKi8KKyNkZWZpbmUgVEhSSUZUX1RZUEVfTVVMVElQTEVYRURfUFJPVE9DT0wgKHRocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbF9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfTVVMVElQTEVYRURfUFJPVE9DT0wsIFRocmlmdE11bHRpcGxleGVkUHJvdG9jb2wpKQorI2RlZmluZSBUSFJJRlRfSVNfTVVMVElQTEVYRURfUFJPVE9DT0wob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9UT0NPTCkpCisjZGVmaW5lIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9UT0NPTF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfTVVMVElQTEVYRURfUFJPVE9DT0wsIFRocmlmdE11bHRpcGxleGVkUHJvdG9jb2xDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19NVUxUSVBMRVhFRF9QUk9UT0NPTF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfTVVMVElQTEVYRURfUFJPVE9DT0wpKQorI2RlZmluZSBUSFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0xfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9UT0NPTCwgVGhyaWZ0TXVsdGlwbGV4ZWRQcm90b2NvbENsYXNzKSkKKworLyogY29uc3RhbnQgKi8KKyNkZWZpbmUgVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MX0RFRkFVTFRfU0VQQVJBVE9SICI6IgorCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0TXVsdGlwbGV4ZWRQcm90b2NvbCBUaHJpZnRNdWx0aXBsZXhlZFByb3RvY29sOworCisKKworLyohCisgKiBUaHJpZnQgTXVsdGlwbGV4ZWQgUHJvdG9jb2wgaW5zdGFuY2UuCisgKi8KK3N0cnVjdCBfVGhyaWZ0TXVsdGlwbGV4ZWRQcm90b2NvbAoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciBwYXJlbnQ7CisKKyAgZ2NoYXIgKnNlcnZpY2VfbmFtZTsKK307CisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRNdWx0aXBsZXhlZFByb3RvY29sQ2xhc3MgVGhyaWZ0TXVsdGlwbGV4ZWRQcm90b2NvbENsYXNzOworCisvKiEKKyAqIFRocmlmdCBNdWx0aXBsZXhlZCBQcm90b2NvbCBjbGFzcy4KKyAqLworc3RydWN0IF9UaHJpZnRNdWx0aXBsZXhlZFByb3RvY29sQ2xhc3MKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3JDbGFzcyBwYXJlbnQ7Cit9OworCisvKiB1c2VkIGJ5IFRIUklGVF9UWVBFX01VTFRJUExFWEVEX1BST1RPQ09MICovCitHVHlwZSB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2xfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX1RIUklGVF9NVUxUSVBMRVhFRF9QUk9UT0NPTF9IICovCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuYwppbmRleCBkNjMxNWQ4Li44Mjk2YThjIDEwMDY0NAotLS0gYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5jCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmMKQEAgLTYxLDE1ICs2MSwxNSBAQAogICBzd2l0Y2ggKHByb3BlcnR5X2lkKQogICB7CiAgICAgY2FzZSBQUk9QX1RIUklGVF9QUk9UT0NPTF9UUkFOU1BPUlQ6Ci0gICAgICBwcm90b2NvbC0+dHJhbnNwb3J0ID0gZ192YWx1ZV9nZXRfb2JqZWN0ICh2YWx1ZSk7CisgICAgICBwcm90b2NvbC0+dHJhbnNwb3J0ID0gZ192YWx1ZV9kdXBfb2JqZWN0ICh2YWx1ZSk7CiAgICAgICBicmVhazsKICAgfQogfQogCiAKIGdpbnQzMgotdGhyaWZ0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgKm5hbWUsIAordGhyaWZ0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRNZXNzYWdlVHlwZSBtZXNzYWdlX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDMyIHNlcWlkLCBHRXJyb3IgKiplcnJvcikKIHsKQEAgLTI0Myw3ICsyNDMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgZXJyb3IpOwogfQogCi1naW50MzIgCitnaW50MzIKIHRocmlmdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdE1lc3NhZ2VUeXBlICptZXNzYWdlX3R5cGUsCkBAIC0yNTQsNyArMjU0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcWlkLCBlcnJvcik7CiB9CiAKLWdpbnQzMiAKK2dpbnQzMgogdGhyaWZ0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKIHsKQEAgLTI2Miw3ICsyNjIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7CiB9CiAKLWdpbnQzMiAKK2dpbnQzMgogdGhyaWZ0X3Byb3RvY29sX3JlYWRfc3RydWN0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCkBAIC0yNzksNyArMjc5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7CiB9CiAKLWdpbnQzMiAKK2dpbnQzMgogdGhyaWZ0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqKm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqZmllbGRfdHlwZSwKQEAgLTI5Myw3ICsyOTMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7CiB9CiAKLWdpbnQzMiAKK2dpbnQzMgogdGhyaWZ0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQogewpAQCAtMzAxLDcgKzMwMSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7CiB9CiAKLWdpbnQzMiAKK2dpbnQzMgogdGhyaWZ0X3Byb3RvY29sX3JlYWRfbWFwX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKmtleV90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICp2YWx1ZV90eXBlLCBndWludDMyICpzaXplLApAQCAtMzExLDE3ICszMTEsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOwogfQogCi1naW50MzIgCitnaW50MzIKIHRocmlmdF9wcm90b2NvbF9yZWFkX21hcF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCiB7CiAgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfbWFwX2VuZCAocHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOwogfQogCi1naW50MzIgCitnaW50MzIKIHRocmlmdF9wcm90b2NvbF9yZWFkX2xpc3RfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKmVsZW1lbnRfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgKnNpemUsIEdFcnJvciAqKmVycm9yKQpAQCAtNDEyLDcgKzQxMiw3IEBACiB9CiAKIGdpbnQzMgotdGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdwb2ludGVyICpidWYsIAordGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdwb2ludGVyICpidWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgKmxlbiwgR0Vycm9yICoqZXJyb3IpCiB7CiAgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfYmluYXJ5IChwcm90b2NvbCwgYnVmLApAQCAtNDY1LDcgKzQ2NSw3IEBACiAgICAgICB9CiAgICAgY2FzZSBUX1NUUlVDVDoKICAgICAgIHsKLSAgICAgICAgZ3VpbnQzMiByZXN1bHQgPSAwOworICAgICAgICBnaW50MzIgcmVzdWx0ID0gMDsKICAgICAgICAgZ2NoYXIgKm5hbWU7CiAgICAgICAgIGdpbnQxNiBmaWQ7CiAgICAgICAgIFRocmlmdFR5cGUgZnR5cGU7CkBAIC00NzUsNiArNDc1LDEwIEBACiAgICAgICAgIHsKICAgICAgICAgICByZXN1bHQgKz0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmbmFtZSwgJmZ0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZCwgZXJyb3IpOworICAgICAgICAgIGlmIChyZXN1bHQgPCAwKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7ICAKKyAgICAgICAgICB9CiAgICAgICAgICAgaWYgKGZ0eXBlID09IFRfU1RPUCkKICAgICAgICAgICB7CiAgICAgICAgICAgICBicmVhazsKQEAgLTQ4NSw5ICs0ODksOSBAQAogICAgICAgICByZXN1bHQgKz0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc3RydWN0X2VuZCAocHJvdG9jb2wsIGVycm9yKTsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgIH0KLSAgICBjYXNlIFRfTUFQOgorICAgIGNhc2UgVF9TRVQ6CiAgICAgICB7Ci0gICAgICAgIGd1aW50MzIgcmVzdWx0ID0gMDsKKyAgICAgICAgZ2ludDMyIHJlc3VsdCA9IDA7CiAgICAgICAgIFRocmlmdFR5cGUgZWxlbV90eXBlOwogICAgICAgICBndWludDMyIGksIHNpemU7CiAgICAgICAgIHJlc3VsdCArPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zZXRfYmVnaW4gKHByb3RvY29sLCAmZWxlbV90eXBlLCAmc2l6ZSwKQEAgLTQ5OSw5ICs1MDMsMjUgQEAKICAgICAgICAgcmVzdWx0ICs9IHRocmlmdF9wcm90b2NvbF9yZWFkX3NldF9lbmQgKHByb3RvY29sLCBlcnJvcik7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICB9CisgICAgY2FzZSBUX01BUDoKKyAgICAgIHsKKyAgICAgICAgZ2ludDMyIHJlc3VsdCA9IDA7CisgICAgICAgIFRocmlmdFR5cGUgZWxlbV90eXBlOworICAgICAgICBUaHJpZnRUeXBlIGtleV90eXBlOworICAgICAgICBndWludDMyIGksIHNpemU7CisgICAgICAgIHJlc3VsdCArPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9tYXBfYmVnaW4gKHByb3RvY29sLCAma2V5X3R5cGUsICZlbGVtX3R5cGUsICZzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICByZXN1bHQgKz0gdGhyaWZ0X3Byb3RvY29sX3NraXAgKHByb3RvY29sLCBrZXlfdHlwZSwgZXJyb3IpOworICAgICAgICAgIHJlc3VsdCArPSB0aHJpZnRfcHJvdG9jb2xfc2tpcCAocHJvdG9jb2wsIGVsZW1fdHlwZSwgZXJyb3IpOworICAgICAgICB9CisgICAgICAgIHJlc3VsdCArPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9tYXBfZW5kIChwcm90b2NvbCwgZXJyb3IpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgfQogICAgIGNhc2UgVF9MSVNUOgogICAgICAgewotICAgICAgICBndWludDMyIHJlc3VsdCA9IDA7CisgICAgICAgIGdpbnQzMiByZXN1bHQgPSAwOwogICAgICAgICBUaHJpZnRUeXBlIGVsZW1fdHlwZTsKICAgICAgICAgZ3VpbnQzMiBpLCBzaXplOwogICAgICAgICByZXN1bHQgKz0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfbGlzdF9iZWdpbiAocHJvdG9jb2wsICZlbGVtX3R5cGUsICZzaXplLApAQCAtNTMzLDEyICs1NTMsMjcgQEAKIH0KIAogc3RhdGljIHZvaWQKK3RocmlmdF9wcm90b2NvbF9kaXNwb3NlIChHT2JqZWN0ICpnb2JqZWN0KQoreworICBUaHJpZnRQcm90b2NvbCAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTCAoZ29iamVjdCk7CisKKyAgZ19jbGVhcl9vYmplY3QoJnNlbGYtPnRyYW5zcG9ydCk7CisKKyAgLyogQWx3YXlzIGNoYWluIHVwIHRvIHRoZSBwYXJlbnQgY2xhc3M7IHRoZXJlIGlzIG5vIG5lZWQgdG8gY2hlY2sgaWYKKyAgICogdGhlIHBhcmVudCBjbGFzcyBpbXBsZW1lbnRzIHRoZSBkaXNwb3NlKCkgdmlydHVhbCBmdW5jdGlvbjogaXQgaXMKKyAgICogYWx3YXlzIGd1YXJhbnRlZWQgdG8gZG8gc28KKyAgICovCisgIEdfT0JKRUNUX0NMQVNTICh0aHJpZnRfcHJvdG9jb2xfcGFyZW50X2NsYXNzKS0+ZGlzcG9zZShnb2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKIHRocmlmdF9wcm90b2NvbF9jbGFzc19pbml0IChUaHJpZnRQcm90b2NvbENsYXNzICpjbHMpCiB7CiAgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChjbHMpOwogCiAgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IHRocmlmdF9wcm90b2NvbF9nZXRfcHJvcGVydHk7CiAgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IHRocmlmdF9wcm90b2NvbF9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmRpc3Bvc2UgPSB0aHJpZnRfcHJvdG9jb2xfZGlzcG9zZTsKIAogICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAogICAgICAgUFJPUF9USFJJRlRfUFJPVE9DT0xfVFJBTlNQT1JULApkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yLmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2Y5NDIwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yLmMKQEAgLTAsMCArMSw2MjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Z2xpYi5oPgorI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yLmg+CisKK0dfREVGSU5FX1RZUEUoVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IsIHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3IsIFRIUklGVF9UWVBFX1BST1RPQ09MKQorCisKK2VudW0KK3sKKyAgUFJPUF9USFJJRlRfVFlQRV9QUk9UT0NPTF9ERUNPUkFUT1JfQ09OQ1JFVEVfUFJPVE9DT0wgPSAxLAorICBQUk9QX1RIUklGVF9UWVBFX1BST1RPQ09MX0RFQ09SQVRPUl9FTkQKK307CisKK3N0YXRpYyBHUGFyYW1TcGVjICp0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX29ial9wcm9wZXJ0aWVzW1BST1BfVEhSSUZUX1RZUEVfUFJPVE9DT0xfREVDT1JBVE9SX0VORF0gPSB7IE5VTEwsIH07CisKKworCisKKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX21lc3NhZ2VfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRNZXNzYWdlVHlwZSBtZXNzYWdlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDMyIHNlcWlkLCBHRXJyb3IgKiplcnJvcikKK3sKKworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKyAgVGhyaWZ0UHJvdG9jb2xDbGFzcyAqcHJvdG8gPSBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCk7CisKKyAgZ19kZWJ1ZygiQ29uY3JldGUgcHJvdG9jb2wgJXAgfCAlcCIsICh2b2lkICopc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsICh2b2lkICopcHJvdG8pOworCisgIHJldHVybiBwcm90by0+d3JpdGVfbWVzc2FnZV9iZWdpbiAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX3R5cGUsIHNlcWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfbWVzc2FnZV9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPndyaXRlX21lc3NhZ2VfZW5kIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX3N0cnVjdF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT53cml0ZV9zdHJ1Y3RfYmVnaW4gKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfc3RydWN0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+d3JpdGVfc3RydWN0X2VuZCAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX2ZpZWxkX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQxNiBmaWVsZF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT53cml0ZV9maWVsZF9iZWdpbiAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfaWQsIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX2ZpZWxkX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+d3JpdGVfZmllbGRfZW5kIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9maWVsZF9zdG9wIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT53cml0ZV9maWVsZF9zdG9wIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfbWFwX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGtleV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSB2YWx1ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBzaXplLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+d3JpdGVfbWFwX2JlZ2luIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV90eXBlLCB2YWx1ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfbWFwX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+d3JpdGVfbWFwX2VuZCAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX2xpc3RfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIHNpemUsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT53cml0ZV9saXN0X2JlZ2luIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRfdHlwZSwgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX2xpc3RfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT53cml0ZV9saXN0X2VuZCAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9zZXRfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBzaXplLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+d3JpdGVfc2V0X2JlZ2luIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRfdHlwZSwgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX3NldF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPndyaXRlX3NldF9lbmQgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9ib29sIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2Jvb2xlYW4gdmFsdWUsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT53cml0ZV9ib29sIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX2J5dGUgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDggdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPndyaXRlX2J5dGUgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfaTE2IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQxNiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT53cml0ZV9pMTYgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9pMzIgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDMyIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPndyaXRlX2kzMiAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX2k2NCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50NjQgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+d3JpdGVfaTY0IChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfZG91YmxlIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnZG91YmxlIHZhbHVlLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+d3JpdGVfZG91YmxlIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfc3RyaW5nIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqc3RyLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+d3JpdGVfc3RyaW5nIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX2JpbmFyeSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPndyaXRlX2JpbmFyeSAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfbWVzc2FnZV9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKipuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0TWVzc2FnZVR5cGUgKm1lc3NhZ2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQzMiAqc2VxaWQsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT5yZWFkX21lc3NhZ2VfYmVnaW4gKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgbWVzc2FnZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxaWQsIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfbWVzc2FnZV9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+cmVhZF9tZXNzYWdlX2VuZCAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfc3RydWN0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPnJlYWRfc3RydWN0X2JlZ2luIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX3N0cnVjdF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPnJlYWRfc3RydWN0X2VuZCAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9maWVsZF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICpmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQxNiAqZmllbGRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPnJlYWRfZmllbGRfYmVnaW4gKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9maWVsZF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPnJlYWRfZmllbGRfZW5kIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfbWFwX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKmtleV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICp2YWx1ZV90eXBlLCBndWludDMyICpzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+cmVhZF9tYXBfYmVnaW4gKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfbWFwX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+cmVhZF9tYXBfZW5kIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX2xpc3RfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKmVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgKnNpemUsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT5yZWFkX2xpc3RfYmVnaW4gKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLCBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX2xpc3RfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT5yZWFkX2xpc3RfZW5kIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9zZXRfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICpzaXplLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+cmVhZF9zZXRfYmVnaW4gKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9zZXRfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT5yZWFkX3NldF9lbmQgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfYm9vbCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnYm9vbGVhbiAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+cmVhZF9ib29sIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9ieXRlIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQ4ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT5yZWFkX2J5dGUgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX2kxNiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50MTYgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+cmVhZF9pMTYgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfaTMyIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQzMiAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT5yZWFkX2kzMiAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9pNjQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDY0ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPnJlYWRfaTY0IChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX2RvdWJsZSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZG91YmxlICp2YWx1ZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPnJlYWRfZG91YmxlIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX3N0cmluZyAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqKnN0ciwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPnJlYWRfc3RyaW5nIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9iaW5hcnkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ3BvaW50ZXIgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAqbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+cmVhZF9iaW5hcnkgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIGVycm9yKTsKK30KKworCitzdGF0aWMgdm9pZAordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9zZXRfcHJvcGVydHkgKEdPYmplY3QgICAgICAqb2JqZWN0LAorICAgIGd1aW50ICAgICAgICAgcHJvcGVydHlfaWQsCisgICAgY29uc3QgR1ZhbHVlICp2YWx1ZSwKKyAgICBHUGFyYW1TcGVjICAgKnBzcGVjKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKKyAgeworICBjYXNlIFBST1BfVEhSSUZUX1RZUEVfUFJPVE9DT0xfREVDT1JBVE9SX0NPTkNSRVRFX1BST1RPQ09MOgorICAgIHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sID0gZ192YWx1ZV9kdXBfb2JqZWN0ICh2YWx1ZSk7CisgICAgYnJlYWs7CisKKyAgZGVmYXVsdDoKKyAgICAvKiBXZSBkb24ndCBoYXZlIGFueSBvdGhlciBwcm9wZXJ0eS4uLiAqLworICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wZXJ0eV9pZCwgcHNwZWMpOworICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX2dldF9wcm9wZXJ0eSAoR09iamVjdCAgICAqb2JqZWN0LAorICAgIGd1aW50ICAgICAgIHByb3BlcnR5X2lkLAorICAgIEdWYWx1ZSAgICAgKnZhbHVlLAorICAgIEdQYXJhbVNwZWMgKnBzcGVjKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKKyAgeworICBjYXNlIFBST1BfVEhSSUZUX1RZUEVfUFJPVE9DT0xfREVDT1JBVE9SX0NPTkNSRVRFX1BST1RPQ09MOgorICAgIGdfdmFsdWVfc2V0X29iamVjdCAodmFsdWUsIHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKTsKKyAgICBicmVhazsKKworICBkZWZhdWx0OgorICAgIC8qIFdlIGRvbid0IGhhdmUgYW55IG90aGVyIHByb3BlcnR5Li4uICovCisgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7CisgICAgYnJlYWs7CisgIH0KK30KKworCitUaHJpZnRQcm90b2NvbCAqCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX2dldF9jb25jcmV0ZV9wcm90b2NvbChUaHJpZnRQcm90b2NvbERlY29yYXRvciAqcHJvdG9jb2wpCit7CisgIFRocmlmdFByb3RvY29sICpyZXR2YWwgPSBOVUxMOworICBpZighVEhSSUZUX0lTX1BST1RPQ09MX0RFQ09SQVRPUihwcm90b2NvbCkpeworICAgIGdfd2FybmluZygiVGhlIHR5cGUgaXMgbm90IHByb3RvY29sIGRlY29yYXRvciIpOworICAgIHJldHVybiBOVUxMOworICB9CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUihwcm90b2NvbCk7CisgIGdfZGVidWcoIkdldHRpbmcgY29uY3JldGUgcHJvdG9jb2wgZnJvbSAlcCAtPiAlcCIsICh2b2lkICopc2VsZiwgKHZvaWQgKilzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworCitzdGF0aWMgdm9pZAordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9pbml0IChUaHJpZnRQcm90b2NvbERlY29yYXRvciAqcHJvdG9jb2wpCit7CisgIHByb3RvY29sLT5jb25jcmV0ZV9wcm90b2NvbCA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX2Rpc3Bvc2UgKEdPYmplY3QgKmdvYmplY3QpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAoZ29iamVjdCk7CisKKyAgZ19jbGVhcl9vYmplY3QoJnNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKTsKKworICAvKiBBbHdheXMgY2hhaW4gdXAgdG8gdGhlIHBhcmVudCBjbGFzczsgdGhlcmUgaXMgbm8gbmVlZCB0byBjaGVjayBpZgorICAgKiB0aGUgcGFyZW50IGNsYXNzIGltcGxlbWVudHMgdGhlIGRpc3Bvc2UoKSB2aXJ0dWFsIGZ1bmN0aW9uOiBpdCBpcworICAgKiBhbHdheXMgZ3VhcmFudGVlZCB0byBkbyBzbworICAgKi8KKyAgR19PQkpFQ1RfQ0xBU1MgKHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcGFyZW50X2NsYXNzKS0+ZGlzcG9zZShnb2JqZWN0KTsKK30KKworLyogaW5pdGlhbGl6ZSB0aGUgY2xhc3MgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX2NsYXNzX2luaXQgKFRocmlmdFByb3RvY29sRGVjb3JhdG9yQ2xhc3MgKmtsYXNzKQoreworICBUaHJpZnRQcm90b2NvbENsYXNzICpjbHMgPSBUSFJJRlRfUFJPVE9DT0xfQ0xBU1MgKGtsYXNzKTsKKyAgR09iamVjdENsYXNzICpvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoa2xhc3MpOworICBvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfc2V0X3Byb3BlcnR5OworICBvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfZ2V0X3Byb3BlcnR5OworICBvYmplY3RfY2xhc3MtPmRpc3Bvc2UgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX2Rpc3Bvc2U7CisKKyAgdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9vYmpfcHJvcGVydGllc1tQUk9QX1RIUklGVF9UWVBFX1BST1RPQ09MX0RFQ09SQVRPUl9DT05DUkVURV9QUk9UT0NPTF0gPQorICAgICAgZ19wYXJhbV9zcGVjX29iamVjdCAoInByb3RvY29sIiwKKyAgICAgICAgICAiUHJvdG9jb2wiLAorICAgICAgICAgICJTZXQgdGhlIHByb3RvY29sIHRvIGJlIGltcGxlbWVudGVkIiwgVEhSSUZUX1RZUEVfUFJPVE9DT0wsCisgICAgICAgICAgKEdfUEFSQU1fQ09OU1RSVUNUX09OTFkgfCBHX1BBUkFNX1JFQURXUklURSkpOworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydGllcyAob2JqZWN0X2NsYXNzLAorICAgICAgUFJPUF9USFJJRlRfVFlQRV9QUk9UT0NPTF9ERUNPUkFUT1JfRU5ELAorICAgICAgdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9vYmpfcHJvcGVydGllcyk7CisKKyAgZ19kZWJ1ZygiQ3VycmVudCBkZWNvcmF0b3Igd3JpdGVfbWVzc2FnZV9iZWdpbiBhZGRyICVwLCBuZXcgJXAiLCBjbHMtPndyaXRlX21lc3NhZ2VfYmVnaW4sIHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfbWVzc2FnZV9iZWdpbik7CisKKyAgY2xzLT53cml0ZV9tZXNzYWdlX2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9tZXNzYWdlX2JlZ2luOworICBjbHMtPndyaXRlX21lc3NhZ2VfZW5kID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9tZXNzYWdlX2VuZDsKKyAgY2xzLT53cml0ZV9zdHJ1Y3RfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX3N0cnVjdF9iZWdpbjsKKyAgY2xzLT53cml0ZV9zdHJ1Y3RfZW5kID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9zdHJ1Y3RfZW5kOworICBjbHMtPndyaXRlX2ZpZWxkX2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9maWVsZF9iZWdpbjsKKyAgY2xzLT53cml0ZV9maWVsZF9lbmQgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX2ZpZWxkX2VuZDsKKyAgY2xzLT53cml0ZV9maWVsZF9zdG9wID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9maWVsZF9zdG9wOworICBjbHMtPndyaXRlX21hcF9iZWdpbiA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfbWFwX2JlZ2luOworICBjbHMtPndyaXRlX21hcF9lbmQgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX21hcF9lbmQ7CisgIGNscy0+d3JpdGVfbGlzdF9iZWdpbiA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfbGlzdF9iZWdpbjsKKyAgY2xzLT53cml0ZV9saXN0X2VuZCA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfbGlzdF9lbmQ7CisgIGNscy0+d3JpdGVfc2V0X2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9zZXRfYmVnaW47CisgIGNscy0+d3JpdGVfc2V0X2VuZCA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfc2V0X2VuZDsKKyAgY2xzLT53cml0ZV9ib29sID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9ib29sOworICBjbHMtPndyaXRlX2J5dGUgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX2J5dGU7CisgIGNscy0+d3JpdGVfaTE2ID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9pMTY7CisgIGNscy0+d3JpdGVfaTMyID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9pMzI7CisgIGNscy0+d3JpdGVfaTY0ID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9pNjQ7CisgIGNscy0+d3JpdGVfZG91YmxlID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9kb3VibGU7CisgIGNscy0+d3JpdGVfc3RyaW5nID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9zdHJpbmc7CisgIGNscy0+d3JpdGVfYmluYXJ5ID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9iaW5hcnk7CisgIGNscy0+cmVhZF9tZXNzYWdlX2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX21lc3NhZ2VfYmVnaW47CisgIGNscy0+cmVhZF9tZXNzYWdlX2VuZCA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9tZXNzYWdlX2VuZDsKKyAgY2xzLT5yZWFkX3N0cnVjdF9iZWdpbiA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9zdHJ1Y3RfYmVnaW47CisgIGNscy0+cmVhZF9zdHJ1Y3RfZW5kID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX3N0cnVjdF9lbmQ7CisgIGNscy0+cmVhZF9maWVsZF9iZWdpbiA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9maWVsZF9iZWdpbjsKKyAgY2xzLT5yZWFkX2ZpZWxkX2VuZCA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9maWVsZF9lbmQ7CisgIGNscy0+cmVhZF9tYXBfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfbWFwX2JlZ2luOworICBjbHMtPnJlYWRfbWFwX2VuZCA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9tYXBfZW5kOworICBjbHMtPnJlYWRfbGlzdF9iZWdpbiA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9saXN0X2JlZ2luOworICBjbHMtPnJlYWRfbGlzdF9lbmQgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfbGlzdF9lbmQ7CisgIGNscy0+cmVhZF9zZXRfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfc2V0X2JlZ2luOworICBjbHMtPnJlYWRfc2V0X2VuZCA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9zZXRfZW5kOworICBjbHMtPnJlYWRfYm9vbCA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9ib29sOworICBjbHMtPnJlYWRfYnl0ZSA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9ieXRlOworICBjbHMtPnJlYWRfaTE2ID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX2kxNjsKKyAgY2xzLT5yZWFkX2kzMiA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9pMzI7CisgIGNscy0+cmVhZF9pNjQgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfaTY0OworICBjbHMtPnJlYWRfZG91YmxlID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX2RvdWJsZTsKKyAgY2xzLT5yZWFkX3N0cmluZyA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9zdHJpbmc7CisgIGNscy0+cmVhZF9iaW5hcnkgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfYmluYXJ5OworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yLmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2I2YWYyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yLmgKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SX0gKKyNkZWZpbmUgX1RIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1JfSAorCisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKy8qISBcZmlsZSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yLmgKKyAqICBcYnJpZWYgTXVsdGlwbGV4ZWQgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gb2YgYSBUaHJpZnQgcHJvdG9jb2wuICBJbXBsZW1lbnRzIHRoZQorICogICAgICAgICBUaHJpZnRQcm90b2NvbCBpbnRlcmZhY2UuCisgKi8KKworLyogdHlwZSBtYWNyb3MgKi8KKyNkZWZpbmUgVEhSSUZUX1RZUEVfUFJPVE9DT0xfREVDT1JBVE9SICh0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX2dldF90eXBlICgpKQorI2RlZmluZSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfUFJPVE9DT0xfREVDT1JBVE9SLCBUaHJpZnRQcm90b2NvbERlY29yYXRvcikpCisjZGVmaW5lIFRIUklGVF9JU19QUk9UT0NPTF9ERUNPUkFUT1Iob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9QUk9UT0NPTF9ERUNPUkFUT1IpKQorI2RlZmluZSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9QUk9UT0NPTF9ERUNPUkFUT1IsIFRocmlmdFByb3RvY29sRGVjb3JhdG9yQ2xhc3MpKQorI2RlZmluZSBUSFJJRlRfSVNfUFJPVE9DT0xfREVDT1JBVE9SX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9QUk9UT0NPTF9ERUNPUkFUT1IpKQorI2RlZmluZSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfUFJPVE9DT0xfREVDT1JBVE9SLCBUaHJpZnRQcm90b2NvbERlY29yYXRvckNsYXNzKSkKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFByb3RvY29sRGVjb3JhdG9yIFRocmlmdFByb3RvY29sRGVjb3JhdG9yOworCisKKy8qIQorICogVGhyaWZ0IFByb3RvY29sIERlY29yYXRvciBpbnN0YW5jZS4KKyAqLworc3RydWN0IF9UaHJpZnRQcm90b2NvbERlY29yYXRvcgoreworICBUaHJpZnRQcm90b2NvbCBwYXJlbnQ7CisKKyAgVGhyaWZ0UHJvdG9jb2wgKmNvbmNyZXRlX3Byb3RvY29sOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFByb3RvY29sRGVjb3JhdG9yQ2xhc3MgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3JDbGFzczsKKworLyohCisgKiBUaHJpZnQgUHJvdG9jb2wgRGVjb3JhdG9yIGNsYXNzLgorICovCitzdHJ1Y3QgX1RocmlmdFByb3RvY29sRGVjb3JhdG9yQ2xhc3MKK3sKKyAgVGhyaWZ0UHJvdG9jb2xDbGFzcyBwYXJlbnQ7CisKK307CisKKy8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfUFJPVE9DT0xfREVDT1JBVE9SICovCitHVHlwZSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9USFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sLmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwZDU2MGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbC5jCkBAIC0wLDAgKzEsMTkyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGdsaWIuaD4KKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvci5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sLmg+CisKKworZW51bQoreworICBQUk9QX1RIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9NRVNTQUdFX05BTUUgPSAxLAorICBQUk9QX1RIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9NRVNTQUdFX1RZUEUsCisgIFBST1BfVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX1NFUVVFTkNFX0lELAorICBQUk9QX1RIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9UUkFOU1BPUlQsIC8qIFRPRE8gdWdseSBoYWNrICovCisgIFBST1BfVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX0VORAorfTsKKworR19ERUZJTkVfVFlQRShUaHJpZnRTdG9yZWRNZXNzYWdlUHJvdG9jb2wsIHRocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbCwgVEhSSUZUX1RZUEVfUFJPVE9DT0xfREVDT1JBVE9SKQorCisKK3N0YXRpYyBHUGFyYW1TcGVjICp0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2xfb2JqX3Byb3BlcnRpZXNbUFJPUF9USFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfRU5EXSA9IHsgTlVMTCwgfTsKKworZ2ludDMyCit0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisJCQkJCSAgIGdjaGFyICoqbmFtZSwKKwkJCQkJICAgVGhyaWZ0TWVzc2FnZVR5cGUgKm1lc3NhZ2VfdHlwZSwKKwkJCQkJICAgZ2ludDMyICpzZXFpZCwgR0Vycm9yICoqZXJyb3IpCit7CisgIGdpbnQzMiByZXQgPSAwOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICBUaHJpZnRTdG9yZWRNZXNzYWdlUHJvdG9jb2wgKnNlbGYgPSBUSFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICAvKiBXZSByZXR1cm4gdGhlIHN0b3JlZCB2YWx1ZXMgb24gY29uc3RydWN0aW9uICovCisgICpuYW1lID0gc2VsZi0+bmFtZTsKKyAgKm1lc3NhZ2VfdHlwZSA9IHNlbGYtPm10eXBlOworICAqc2VxaWQgPSBzZWxmLT5zZXFpZDsKKworICByZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyB2b2lkCit0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2xfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICAgICAgKm9iamVjdCwKKwkJCQkJICAgICBndWludCAgICAgICAgIHByb3BlcnR5X2lkLAorCQkJCQkgICAgIGNvbnN0IEdWYWx1ZSAqdmFsdWUsCisJCQkJCSAgICAgR1BhcmFtU3BlYyAgICpwc3BlYykKK3sKKyAgVGhyaWZ0U3RvcmVkTWVzc2FnZVByb3RvY29sICpzZWxmID0gVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX01FU1NBR0VfTkFNRToKKyAgICAgIHNlbGYtPm5hbWUgPSBnX3ZhbHVlX2R1cF9zdHJpbmcgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfTUVTU0FHRV9UWVBFOgorICAgICAgc2VsZi0+bXR5cGUgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfU0VRVUVOQ0VfSUQ6CisgICAgICBzZWxmLT5zZXFpZCA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgLyogV2UgZG9uJ3QgaGF2ZSBhbnkgb3RoZXIgcHJvcGVydHkuLi4gKi8KKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wZXJ0eV9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbF9nZXRfcHJvcGVydHkgKEdPYmplY3QgICAgKm9iamVjdCwKKwkJCQkJICAgICBndWludCAgICAgICBwcm9wZXJ0eV9pZCwKKwkJCQkJICAgICBHVmFsdWUgICAgICp2YWx1ZSwKKwkJCQkJICAgICBHUGFyYW1TcGVjICpwc3BlYykKK3sKKyAgVGhyaWZ0U3RvcmVkTWVzc2FnZVByb3RvY29sICpzZWxmID0gVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MIChvYmplY3QpOworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqZGVjb3JhdG9yID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAob2JqZWN0KTsKKyAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQ9TlVMTDsKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKKyAgeworICAgIGNhc2UgUFJPUF9USFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfTUVTU0FHRV9OQU1FOgorICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgc2VsZi0+bmFtZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX1RSQU5TUE9SVDoKKyAgICAgIC8qIEZJWE1FIFNpbmNlIHdlIGRvbid0IG92ZXJyaWRlIHByb3BlcnRpZXMgaW4gdGhlIGRlY29yYXRvciBhcyBpdCBzaG91bGQKKyAgICAgICAgIHdlIGp1c3Qgb3ZlcnJpZGUgdGhlIHByb3BlcnRpZXMgdGhhdCB3ZSBrbm93IGFyZSB1c2VkICovCisgICAgICBnX29iamVjdF9nZXQoZGVjb3JhdG9yLT5jb25jcmV0ZV9wcm90b2NvbCxwc3BlYy0+bmFtZSwgJnRyYW5zcG9ydCwgTlVMTCk7CisgICAgICBnX3ZhbHVlX3NldF9wb2ludGVyICh2YWx1ZSwgdHJhbnNwb3J0KTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIC8qIFdlIGRvbid0IGhhdmUgYW55IG90aGVyIHByb3BlcnR5Li4uICovCisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcGVydHlfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKworc3RhdGljIHZvaWQKK3RocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbF9pbml0IChUaHJpZnRTdG9yZWRNZXNzYWdlUHJvdG9jb2wgKnByb3RvY29sKQoreworICBwcm90b2NvbC0+bmFtZSA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2xfZmluYWxpemUgKEdPYmplY3QgKmdvYmplY3QpCit7CisgIFRocmlmdFN0b3JlZE1lc3NhZ2VQcm90b2NvbCAqc2VsZiA9IFRIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTCAoZ29iamVjdCk7CisKKyAgaWYgKHNlbGYtPm5hbWUpIHsKKyAgICAgIGdfZnJlZShzZWxmLT5uYW1lKTsKKyAgICAgIHNlbGYtPm5hbWUgPSBOVUxMOworICB9CisKKyAgLyogQWx3YXlzIGNoYWluIHVwIHRvIHRoZSBwYXJlbnQgY2xhc3M7IGFzIHdpdGggZGlzcG9zZSgpLCBmaW5hbGl6ZSgpCisgICAqIGlzIGd1YXJhbnRlZWQgdG8gZXhpc3Qgb24gdGhlIHBhcmVudCdzIGNsYXNzIHZpcnR1YWwgZnVuY3Rpb24gdGFibGUKKyAgICovCisgIEdfT0JKRUNUX0NMQVNTICh0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2xfcGFyZW50X2NsYXNzKS0+ZmluYWxpemUoZ29iamVjdCk7Cit9CisKKworLyogaW5pdGlhbGl6ZSB0aGUgY2xhc3MgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2xfY2xhc3NfaW5pdCAoVGhyaWZ0U3RvcmVkTWVzc2FnZVByb3RvY29sQ2xhc3MgKmtsYXNzKQoreworICBUaHJpZnRQcm90b2NvbENsYXNzICpjbHMgPSBUSFJJRlRfUFJPVE9DT0xfQ0xBU1MgKGtsYXNzKTsKKyAgR09iamVjdENsYXNzICpvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoa2xhc3MpOworCisgIGNscy0+cmVhZF9tZXNzYWdlX2JlZ2luID0gdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbjsKKworICBvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IHRocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbF9zZXRfcHJvcGVydHk7CisgIG9iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sX2dldF9wcm9wZXJ0eTsKKyAgb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IHRocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbF9maW5hbGl6ZTsKKworICB0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2xfb2JqX3Byb3BlcnRpZXNbUFJPUF9USFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfTUVTU0FHRV9OQU1FXSA9CisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgibmFtZSIsCisJCQkgICAiU2VydmljZSBuYW1lIHRoZSBwcm90b2NvbCBwb2ludHMgdG8iLAorCQkJICAgIlNldCB0aGUgc2VydmljZSBuYW1lIiwKKwkJCSAgIE5VTEwsCisJCQkgICAoR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8IEdfUEFSQU1fUkVBRFdSSVRFKSk7CisgIHRocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbF9vYmpfcHJvcGVydGllc1tQUk9QX1RIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9NRVNTQUdFX1RZUEVdID0KKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJ0eXBlIiwKKwkJCSJNZXNzYWdlIHR5cGUgaW4gdGhlIHdpcmUiLAorCQkJIlNldCB0aGUgbWVzc2FnZSB0eXBlIGluIHRoZSB3aXJlIiwKKwkJCVRfQ0FMTCwgVF9PTkVXQVksCisJCQlUX0NBTEwsCisJCQkoR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8IEdfUEFSQU1fUkVBRFdSSVRFKSk7CisgIHRocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbF9vYmpfcHJvcGVydGllc1tQUk9QX1RIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9TRVFVRU5DRV9JRF0gPQorICAgICAgZ19wYXJhbV9zcGVjX2ludCAoInNlcWlkIiwKKwkJCSJTZXF1ZW5jZSBpZCB0eXBlIGluIHRoZSB3aXJlIiwKKwkJCSJTZXQgdGhlIFNlcXVlbmNlIGlkIGluIHRoZSB3aXJlIiwKKwkJCTAsIEdfTUFYSU5ULAorCQkJMCwKKwkJCShHX1BBUkFNX0NPTlNUUlVDVF9PTkxZIHwgR19QQVJBTV9SRUFEV1JJVEUpKTsKKworICAvKiBUT0RPIFVnbHkgaGFjaywgaW4gdGhlb3J5IHdlIG11c3Qgb3ZlcnJpZGUgYWxsIHByb3BlcnRpZXMgZnJvbSB1bmRlcmxheWluZworICAgICBwcm90b2NvbCAqLworICB0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2xfb2JqX3Byb3BlcnRpZXNbUFJPUF9USFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfVFJBTlNQT1JUXSA9CisgICAgICBnX3BhcmFtX3NwZWNfcG9pbnRlciAoInRyYW5zcG9ydCIsCisJCQkiVHJhbnNwb3J0IG9uIHRoZSB1bmRlcmxheWluZyBpbXBsZW1lbnRhdGlvbiIsCisJCQkiVHJhbnNwb3J0IG9mIGRlY29yYXRlZCBwcm90b2NvbCIsCisJCQlHX1BBUkFNX1JFQURBQkxFKTsKKworCisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0aWVzIChvYmplY3RfY2xhc3MsCisJCQkJICAgICBQUk9QX1RIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9FTkQsCisJCQkJICAgICB0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2xfb2JqX3Byb3BlcnRpZXMpOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2wuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg3ODJhYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sLmgKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfSAorI2RlZmluZSBfVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX0gKKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvci5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKworR19CRUdJTl9ERUNMUworCisvKiEgXGZpbGUgdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sLmgKKyAqICBcYnJpZWYgU3RvcmVkTWVzc2FnZSBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBvZiBhIHByZS1zdG9yZWQgbWVzc2FnZSBoZWFkZXIKKyAqICBvbiBUaHJpZnQgcHJvdG9jb2wuICBJbXBsZW1lbnRzIHRoZSBUaHJpZnRQcm90b2NvbCBpbnRlcmZhY2UuCisgKi8KKworLyogdHlwZSBtYWNyb3MgKi8KKyNkZWZpbmUgVEhSSUZUX1RZUEVfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0wgKHRocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbF9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0wsIFRocmlmdFN0b3JlZE1lc3NhZ2VQcm90b2NvbCkpCisjZGVmaW5lIFRIUklGVF9JU19TVE9SRURfTUVTU0FHRV9QUk9UT0NPTChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MKSkKKyNkZWZpbmUgVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTCwgVGhyaWZ0U3RvcmVkTWVzc2FnZVByb3RvY29sQ2xhc3MpKQorI2RlZmluZSBUSFJJRlRfSVNfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MKSkKKyNkZWZpbmUgVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0wsIFRocmlmdFN0b3JlZE1lc3NhZ2VQcm90b2NvbENsYXNzKSkKKworLyogY29uc3RhbnQgKi8KKyNkZWZpbmUgVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX0RFRkFVTFRfU0VQQVJBVE9SICI6IgorCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0U3RvcmVkTWVzc2FnZVByb3RvY29sIFRocmlmdFN0b3JlZE1lc3NhZ2VQcm90b2NvbDsKKworCisKKy8qIQorICogVGhyaWZ0IFN0b3JlZE1lc3NhZ2UgUHJvdG9jb2wgaW5zdGFuY2UuCisgKi8KK3N0cnVjdCBfVGhyaWZ0U3RvcmVkTWVzc2FnZVByb3RvY29sCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yIHBhcmVudDsKKworICBnY2hhciAqbmFtZTsKKyAgVGhyaWZ0TWVzc2FnZVR5cGUgbXR5cGU7CisgIGdpbnQzMiBzZXFpZDsKK307CisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRTdG9yZWRNZXNzYWdlUHJvdG9jb2xDbGFzcyBUaHJpZnRTdG9yZWRNZXNzYWdlUHJvdG9jb2xDbGFzczsKKworLyohCisgKiBUaHJpZnQgU3RvcmVkTWVzc2FnZSBQcm90b2NvbCBjbGFzcy4KKyAqLworc3RydWN0IF9UaHJpZnRTdG9yZWRNZXNzYWdlUHJvdG9jb2xDbGFzcworeworICBUaHJpZnRQcm90b2NvbERlY29yYXRvckNsYXNzIHBhcmVudDsKK307CisKKy8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0wgKi8KK0dUeXBlIHRocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbF9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvc2VydmVyL3RocmlmdF9zZXJ2ZXIuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvc2VydmVyL3RocmlmdF9zZXJ2ZXIuYwppbmRleCBlOGFmZjQ1Li5jY2Y5MTUzIDEwMDY0NAotLS0gYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3NlcnZlci90aHJpZnRfc2VydmVyLmMKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvdGhyaWZ0X3NlcnZlci5jCkBAIC03NiwyMiArNzYsMjIgQEAKICAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKICAgewogICAgIGNhc2UgUFJPUF9USFJJRlRfU0VSVkVSX1BST0NFU1NPUjoKLSAgICAgIHNlcnZlci0+cHJvY2Vzc29yID0gZ192YWx1ZV9nZXRfb2JqZWN0ICh2YWx1ZSk7CisgICAgICBzZXJ2ZXItPnByb2Nlc3NvciA9IGdfdmFsdWVfZHVwX29iamVjdCAodmFsdWUpOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSBQUk9QX1RIUklGVF9TRVJWRVJfU0VSVkVSX1RSQU5TUE9SVDoKLSAgICAgIHNlcnZlci0+c2VydmVyX3RyYW5zcG9ydCA9IGdfdmFsdWVfZ2V0X29iamVjdCAodmFsdWUpOworICAgICAgc2VydmVyLT5zZXJ2ZXJfdHJhbnNwb3J0ID0gZ192YWx1ZV9kdXBfb2JqZWN0ICh2YWx1ZSk7CiAgICAgICBicmVhazsKICAgICBjYXNlIFBST1BfVEhSSUZUX1NFUlZFUl9JTlBVVF9UUkFOU1BPUlRfRkFDVE9SWToKLSAgICAgIHNlcnZlci0+aW5wdXRfdHJhbnNwb3J0X2ZhY3RvcnkgPSBnX3ZhbHVlX2dldF9vYmplY3QgKHZhbHVlKTsKKyAgICAgIHNlcnZlci0+aW5wdXRfdHJhbnNwb3J0X2ZhY3RvcnkgPSBnX3ZhbHVlX2R1cF9vYmplY3QgKHZhbHVlKTsKICAgICAgIGJyZWFrOwogICAgIGNhc2UgUFJPUF9USFJJRlRfU0VSVkVSX09VVFBVVF9UUkFOU1BPUlRfRkFDVE9SWToKLSAgICAgIHNlcnZlci0+b3V0cHV0X3RyYW5zcG9ydF9mYWN0b3J5ID0gZ192YWx1ZV9nZXRfb2JqZWN0ICh2YWx1ZSk7CisgICAgICBzZXJ2ZXItPm91dHB1dF90cmFuc3BvcnRfZmFjdG9yeSA9IGdfdmFsdWVfZHVwX29iamVjdCAodmFsdWUpOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSBQUk9QX1RIUklGVF9TRVJWRVJfSU5QVVRfUFJPVE9DT0xfRkFDVE9SWToKLSAgICAgIHNlcnZlci0+aW5wdXRfcHJvdG9jb2xfZmFjdG9yeSA9IGdfdmFsdWVfZ2V0X29iamVjdCAodmFsdWUpOworICAgICAgc2VydmVyLT5pbnB1dF9wcm90b2NvbF9mYWN0b3J5ID0gZ192YWx1ZV9kdXBfb2JqZWN0ICh2YWx1ZSk7CiAgICAgICBicmVhazsKICAgICBjYXNlIFBST1BfVEhSSUZUX1NFUlZFUl9PVVRQVVRfUFJPVE9DT0xfRkFDVE9SWToKLSAgICAgIHNlcnZlci0+b3V0cHV0X3Byb3RvY29sX2ZhY3RvcnkgPSBnX3ZhbHVlX2dldF9vYmplY3QgKHZhbHVlKTsKKyAgICAgIHNlcnZlci0+b3V0cHV0X3Byb3RvY29sX2ZhY3RvcnkgPSBnX3ZhbHVlX2R1cF9vYmplY3QgKHZhbHVlKTsKICAgICAgIGJyZWFrOwogICB9CiB9CkBAIC0xMjAsNyArMTIwLDI3IEBACiAgIHNlcnZlci0+b3V0cHV0X3Byb3RvY29sX2ZhY3RvcnkgPSBOVUxMOwogfQogCi0vKiBjbGFzcyBpbml0aWFsaXplciBmb3IgVGhyaWZ0U2VydmVyCitzdGF0aWMgdm9pZAordGhyaWZ0X3NlcnZlcl9kaXNwb3NlIChHT2JqZWN0ICpnb2JqZWN0KQoreworICBUaHJpZnRTZXJ2ZXIgKnNlbGYgPSBUSFJJRlRfU0VSVkVSIChnb2JqZWN0KTsKKworICBnX2NsZWFyX29iamVjdCgmc2VsZi0+b3V0cHV0X3Byb3RvY29sX2ZhY3RvcnkpOworICBnX2NsZWFyX29iamVjdCgmc2VsZi0+aW5wdXRfcHJvdG9jb2xfZmFjdG9yeSk7CisgIGdfY2xlYXJfb2JqZWN0KCZzZWxmLT5vdXRwdXRfdHJhbnNwb3J0X2ZhY3RvcnkpOworICBnX2NsZWFyX29iamVjdCgmc2VsZi0+aW5wdXRfdHJhbnNwb3J0X2ZhY3RvcnkpOworICBnX2NsZWFyX29iamVjdCgmc2VsZi0+c2VydmVyX3RyYW5zcG9ydCk7CisgIGdfY2xlYXJfb2JqZWN0KCZzZWxmLT5wcm9jZXNzb3IpOworCisgIC8qIEFsd2F5cyBjaGFpbiB1cCB0byB0aGUgcGFyZW50IGNsYXNzOyB0aGVyZSBpcyBubyBuZWVkIHRvIGNoZWNrIGlmCisgICAqIHRoZSBwYXJlbnQgY2xhc3MgaW1wbGVtZW50cyB0aGUgZGlzcG9zZSgpIHZpcnR1YWwgZnVuY3Rpb246IGl0IGlzCisgICAqIGFsd2F5cyBndWFyYW50ZWVkIHRvIGRvIHNvCisgICAqLworICBHX09CSkVDVF9DTEFTUyAodGhyaWZ0X3NlcnZlcl9wYXJlbnRfY2xhc3MpLT5kaXNwb3NlKGdvYmplY3QpOworfQorCisvKgorICogY2xhc3MgaW5pdGlhbGl6ZXIgZm9yIFRocmlmdFNlcnZlcgogICogVE9ETzogaW1wbGVtZW50IFNlcnZlckV2ZW50SGFuZGxlciBhcyBhIEdDbG9zdXJlCiAgKi8KIHN0YXRpYyB2b2lkCkBAIC0xMzAsNiArMTUwLDcgQEAKIAogICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSB0aHJpZnRfc2VydmVyX2dldF9wcm9wZXJ0eTsKICAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gdGhyaWZ0X3NlcnZlcl9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmRpc3Bvc2UgPSB0aHJpZnRfc2VydmVyX2Rpc3Bvc2U7CiAKICAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKICAgICAgIFBST1BfVEhSSUZUX1NFUlZFUl9QUk9DRVNTT1IsCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RocmlmdC5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90aHJpZnQuYwppbmRleCAxNWY0MDlmLi44ZGU4NjlmIDEwMDY0NAotLS0gYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RocmlmdC5jCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdGhyaWZ0LmMKQEAgLTMxLDYgKzMxLDY3IEBACiAKICAgKmxpc3QgPSBnX2xpc3RfYXBwZW5kICgqbGlzdCwga2V5KTsKIH0KK3ZvaWQgdGhyaWZ0X3NhZmVfaGFzaF90YWJsZV9kZXN0cm95KEdIYXNoVGFibGUqIGhhc2hfdGFibGUpCit7CisgIGlmIChoYXNoX3RhYmxlKQorICB7CisgICAgZ19oYXNoX3RhYmxlX2Rlc3Ryb3koaGFzaF90YWJsZSk7CisgIH0KK30KKworZ3VpbnQgdGhyaWZ0X2Jvb2xlYW5faGFzaChnY29uc3Rwb2ludGVyIHYpCit7CisgIGNvbnN0IGdib29sZWFuKiBwID0gdjsKKyAgcmV0dXJuIHAgJiYgKnAgPyAxIDogMDsKK30KK2dib29sZWFuIHRocmlmdF9ib29sZWFuX2VxdWFsKGdjb25zdHBvaW50ZXIgYSwgZ2NvbnN0cG9pbnRlciBiKQoreworICBpZiAoYSA9PSBiKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaWYgKCFhIHx8ICFiKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGNvbnN0IGdib29sZWFuKiBwYSA9IGE7CisgIGNvbnN0IGdib29sZWFuKiBwYiA9IGI7CisgIHJldHVybiAqcGEgPT0gKnBiOworfQorCitndWludCB0aHJpZnRfaW50OF9oYXNoKGdjb25zdHBvaW50ZXIgdikKK3sKKyAgY29uc3QgZ2ludDgqIHAgPSB2OworICByZXR1cm4gcCA/ICpwIDogMDsKK30KK2dib29sZWFuIHRocmlmdF9pbnQ4X2VxdWFsKGdjb25zdHBvaW50ZXIgYSwgZ2NvbnN0cG9pbnRlciBiKQoreworICBpZiAoYSA9PSBiKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaWYgKCFhIHx8ICFiKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGNvbnN0IGdpbnQ4KiBwYSA9IGE7CisgIGNvbnN0IGdpbnQ4KiBwYiA9IGI7CisgIHJldHVybiAqcGEgPT0gKnBiOworfQorCitndWludCB0aHJpZnRfaW50MTZfaGFzaChnY29uc3Rwb2ludGVyIHYpCit7CisgIGNvbnN0IGdpbnQxNiogcCA9IHY7CisgIHJldHVybiBwID8gKnAgOiAwOworfQorZ2Jvb2xlYW4gdGhyaWZ0X2ludDE2X2VxdWFsKGdjb25zdHBvaW50ZXIgYSwgZ2NvbnN0cG9pbnRlciBiKQoreworICBpZiAoYSA9PSBiKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaWYgKCFhIHx8ICFiKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGNvbnN0IGdpbnQxNiogcGEgPSBhOworICBjb25zdCBnaW50MTYqIHBiID0gYjsKKyAgcmV0dXJuICpwYSA9PSAqcGI7Cit9CiAKIHZvaWQKIHRocmlmdF9zdHJpbmdfZnJlZSAoZ3BvaW50ZXIgc3RyKQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90aHJpZnQuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdGhyaWZ0LmgKaW5kZXggODU4YWQ4Ni4uOTRhNjQ3OCAxMDA2NDQKLS0tIGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90aHJpZnQuaAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RocmlmdC5oCkBAIC0zMyw2ICszMywxNyBAQAogCiB2b2lkIHRocmlmdF9oYXNoX3RhYmxlX2dldF9rZXlzIChncG9pbnRlciBrZXksIGdwb2ludGVyIHZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BvaW50ZXIgdXNlcl9kYXRhKTsKK3ZvaWQgdGhyaWZ0X3NhZmVfaGFzaF90YWJsZV9kZXN0cm95KEdIYXNoVGFibGUqIGhhc2hfdGFibGUpOworCitndWludCB0aHJpZnRfYm9vbGVhbl9oYXNoKGdjb25zdHBvaW50ZXIgdik7CitnYm9vbGVhbiB0aHJpZnRfYm9vbGVhbl9lcXVhbChnY29uc3Rwb2ludGVyIGEsIGdjb25zdHBvaW50ZXIgYik7CisKK2d1aW50IHRocmlmdF9pbnQ4X2hhc2goZ2NvbnN0cG9pbnRlciB2KTsKK2dib29sZWFuIHRocmlmdF9pbnQ4X2VxdWFsKGdjb25zdHBvaW50ZXIgYSwgZ2NvbnN0cG9pbnRlciBiKTsKKworZ3VpbnQgdGhyaWZ0X2ludDE2X2hhc2goZ2NvbnN0cG9pbnRlciB2KTsKK2dib29sZWFuIHRocmlmdF9pbnQxNl9lcXVhbChnY29uc3Rwb2ludGVyIGEsIGdjb25zdHBvaW50ZXIgYik7CisKIHZvaWQgdGhyaWZ0X3N0cmluZ19mcmVlIChncG9pbnRlciBzdHIpOwogCiAjZW5kaWYgLyogI2lmbmRlZiBfVEhSSUZUX1RIUklGVF9IICovCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0LmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0LmMKaW5kZXggZWRlMjhjZi4uMGFiM2U5MyAxMDA2NDQKLS0tIGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5jCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuYwpAQCAtMTcsNyArMTcsNiBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPG5ldGRiLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KQEAgLTg0LDcgKzgzLDcgQEAKICAgZ3VpbnQzMiBoYXZlID0gdC0+cl9idWYtPmxlbjsKIAogICAvKiB3ZSBzaG91bGRuJ3QgaGl0IHRoaXMgdW5sZXNzIHRoZSBidWZmZXIgZG9lc24ndCBoYXZlIGVub3VnaCB0byByZWFkICovCi0gIGFzc2VydCAodC0+cl9idWYtPmxlbiA8IHdhbnQpOworICBnX2Fzc2VydCAodC0+cl9idWYtPmxlbiA8IHdhbnQpOwogCiAgIC8qIGZpcnN0IGNvcHkgd2hhdCB3ZSBoYXZlIGluIG91ciBidWZmZXIuICovCiAgIGlmIChoYXZlID4gMCkKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mZF90cmFuc3BvcnQuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mZF90cmFuc3BvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGFiZmY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZkX3RyYW5zcG9ydC5jCkBAIC0wLDAgKzEsMjY1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxnbGliLmg+CisjaW5jbHVkZSA8Z2xpYi9nc3RkaW8uaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mZF90cmFuc3BvcnQuaD4KKworLyogb2JqZWN0IHByb3BlcnRpZXMgKi8KK2VudW0gX1RocmlmdEZEVHJhbnNwb3J0UHJvcGVydGllcworeworICBQUk9QXzAsCisgIFBST1BfVEhSSUZUX0ZEX1RSQU5TUE9SVF9GRAorfTsKKworR19ERUZJTkVfVFlQRSAoVGhyaWZ0RkRUcmFuc3BvcnQsIHRocmlmdF9mZF90cmFuc3BvcnQsIFRIUklGVF9UWVBFX1RSQU5TUE9SVCkKKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW4gKi8KK2dib29sZWFuCit0aHJpZnRfZmRfdHJhbnNwb3J0X2lzX29wZW4gKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICBUaHJpZnRGRFRyYW5zcG9ydCAqdDsKKyAgdCA9IFRIUklGVF9GRF9UUkFOU1BPUlQgKHRyYW5zcG9ydCk7CisgIHJldHVybiB0LT5mZCA+PSAwICYmICEgKGZjbnRsICh0LT5mZCwgRl9HRVRGTCkgPT0gLTEgJiYgZXJybm8gPT0gRUJBREYpOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfb3BlbiAqLworZ2Jvb2xlYW4KK3RocmlmdF9mZF90cmFuc3BvcnRfb3BlbiAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gdGhyaWZ0X2ZkX3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKi8KK2dib29sZWFuCit0aHJpZnRfZmRfdHJhbnNwb3J0X2Nsb3NlIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdEZEVHJhbnNwb3J0ICp0OworICB0ID0gVEhSSUZUX0ZEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKKworI2lmIEdMSUJfQ0hFQ0tfVkVSU0lPTiAoMiwgMzYsIDApCisgIHJldHVybiBnX2Nsb3NlICh0LT5mZCwgZXJyb3IpOworI2Vsc2UKKyAgaWYgKGNsb3NlICh0LT5mZCkgPT0gMCkgeworICAgIGdfY2xlYXJfZXJyb3IgKGVycm9yKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfSBlbHNlIHsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfQ0xPU0UsCisgICAgICAgICAgICAgICAgIHN0cmVycm9yIChlcnJubykpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorI2VuZGlmCit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkICovCitnaW50MzIKK3RocmlmdF9mZF90cmFuc3BvcnRfcmVhZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRGRFRyYW5zcG9ydCAqdDsKKyAgc3NpemVfdCBuOworCisgIHQgPSBUSFJJRlRfRkRfVFJBTlNQT1JUICh0cmFuc3BvcnQpOworICBuID0gcmVhZCAodC0+ZmQsIChndWludDggKikgYnVmLCBsZW4pOworICBpZiAobiA9PSAtMSkgeworICAgIGdfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9SRUNFSVZFLAorICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHJlYWQgZnJvbSBmZDogJXMiLAorICAgICAgICAgICAgICAgICBzdHJlcnJvciAoZXJybm8pKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgcmV0dXJuIG47Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZAorICogY2FsbGVkIHdoZW4gd3JpdGUgaXMgY29tcGxldGUuICBub3RoaW5nIHRvIGRvIG9uIG91ciBlbmQuICovCitnYm9vbGVhbgordGhyaWZ0X2ZkX3RyYW5zcG9ydF9yZWFkX2VuZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICAvKiBzYXRpc2Z5IC1XYWxsICovCisgIFRIUklGVF9VTlVTRURfVkFSICh0cmFuc3BvcnQpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gVFJVRTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlICovCitnYm9vbGVhbgordGhyaWZ0X2ZkX3RyYW5zcG9ydF93cml0ZSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdEZEVHJhbnNwb3J0ICp0OworICBndWludDggKl9idWY7CisgIGd1aW50MzIgX2xlbjsKKyAgc3NpemVfdCBuOworCisgIHQgPSBUSFJJRlRfRkRfVFJBTlNQT1JUICh0cmFuc3BvcnQpOworICBfYnVmID0gKGd1aW50OCAqKSBidWY7CisgIF9sZW4gPSBsZW47CisgIHdoaWxlIChfbGVuID4gMCkgeworICAgIG4gPSB3cml0ZSAodC0+ZmQsIF9idWYsIF9sZW4pOworICAgIGlmIChuID09IC0xKSB7CisgICAgICBnX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX1NFTkQsCisgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byB3cml0ZSBmcm9tIGZkOiAlcyIsCisgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfSBlbHNlIHsKKyAgICAgIF9idWYgKz0gbjsKKyAgICAgIF9sZW4gLT0gbjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF93cml0ZV9lbmQKKyAqIGNhbGxlZCB3aGVuIHdyaXRlIGlzIGNvbXBsZXRlLiAgbm90aGluZyB0byBkbyBvbiBvdXIgZW5kLiAqLworZ2Jvb2xlYW4KK3RocmlmdF9mZF90cmFuc3BvcnRfd3JpdGVfZW5kIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSICh0cmFuc3BvcnQpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gVFJVRTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICovCitnYm9vbGVhbgordGhyaWZ0X2ZkX3RyYW5zcG9ydF9mbHVzaCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRGRFRyYW5zcG9ydCAqdDsKKyAgdCA9IFRIUklGVF9GRF9UUkFOU1BPUlQgKHRyYW5zcG9ydCk7CisgIGlmIChmc3luYyAodC0+ZmQpID09IC0xKSB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLAorICAgICAgICAgICAgICAgICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLAorICAgICAgICAgICAgICAgICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX1VOS05PV04sCisgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZmx1c2ggZmQ6ICVzIiwKKyAgICAgICAgICAgICAgICAgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9IGVsc2UgeworICAgIHJldHVybiBUUlVFOworICB9Cit9CisKKy8qIGluaXRpYWxpemVzIHRoZSBpbnN0YW5jZSAqLworc3RhdGljIHZvaWQKK3RocmlmdF9mZF90cmFuc3BvcnRfaW5pdCAoVGhyaWZ0RkRUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgdHJhbnNwb3J0LT5mZCA9IC0xOworfQorCisvKiBkZXN0cnVjdG9yICovCitzdGF0aWMgdm9pZAordGhyaWZ0X2ZkX3RyYW5zcG9ydF9maW5hbGl6ZSAoR09iamVjdCAqb2JqZWN0KQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAob2JqZWN0KTsKK30KKworLyogcHJvcGVydHkgYWNjZXNzb3IgKi8KK3ZvaWQKK3RocmlmdF9mZF90cmFuc3BvcnRfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQoreworICBUaHJpZnRGRFRyYW5zcG9ydCAqdDsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOworCisgIHQgPSBUSFJJRlRfRkRfVFJBTlNQT1JUIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpIHsKKyAgICBjYXNlIFBST1BfVEhSSUZUX0ZEX1RSQU5TUE9SVF9GRDoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHQtPmZkKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcGVydHlfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKy8qIHByb3BlcnR5IG11dGF0b3IgKi8KK3ZvaWQKK3RocmlmdF9mZF90cmFuc3BvcnRfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQoreworICBUaHJpZnRGRFRyYW5zcG9ydCAqdDsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOworCisgIHQgPSBUSFJJRlRfRkRfVFJBTlNQT1JUIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpIHsKKyAgICBjYXNlIFBST1BfVEhSSUZUX0ZEX1RSQU5TUE9SVF9GRDoKKyAgICAgIHQtPmZkID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCisvKiBpbml0aWFsaXplcyB0aGUgY2xhc3MgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfZmRfdHJhbnNwb3J0X2NsYXNzX2luaXQgKFRocmlmdEZEVHJhbnNwb3J0Q2xhc3MgKmNscykKK3sKKyAgVGhyaWZ0VHJhbnNwb3J0Q2xhc3MgKnR0YzsKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHUGFyYW1TcGVjICpwYXJhbV9zcGVjOworCisgIHR0YyA9IFRIUklGVF9UUkFOU1BPUlRfQ0xBU1MgKGNscyk7CisgIGdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoY2xzKTsKKyAgcGFyYW1fc3BlYyA9IE5VTEw7CisKKyAgLyogc2V0dXAgYWNjZXNzb3JzIGFuZCBtdXRhdG9ycyAqLworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSB0aHJpZnRfZmRfdHJhbnNwb3J0X2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gdGhyaWZ0X2ZkX3RyYW5zcG9ydF9zZXRfcHJvcGVydHk7CisKKyAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY19pbnQgKCJmZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmlsZSBkZXNjcmlwdG9yIChjb25zdHJ1Y3QpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXQgdGhlIGZpbGUgZGVzY3JpcHRvciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfTUlOLCAvKiBtaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9NQVgsIC8qIG1heCwgMTAyNCoxMDI0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwgLyogZGVmYXVsdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BfVEhSSUZUX0ZEX1RSQU5TUE9SVF9GRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fc3BlYyk7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSB0aHJpZnRfZmRfdHJhbnNwb3J0X2ZpbmFsaXplOworICB0dGMtPmlzX29wZW4gPSB0aHJpZnRfZmRfdHJhbnNwb3J0X2lzX29wZW47CisgIHR0Yy0+b3BlbiA9IHRocmlmdF9mZF90cmFuc3BvcnRfb3BlbjsKKyAgdHRjLT5jbG9zZSA9IHRocmlmdF9mZF90cmFuc3BvcnRfY2xvc2U7CisgIHR0Yy0+cmVhZCA9IHRocmlmdF9mZF90cmFuc3BvcnRfcmVhZDsKKyAgdHRjLT5yZWFkX2VuZCA9IHRocmlmdF9mZF90cmFuc3BvcnRfcmVhZF9lbmQ7CisgIHR0Yy0+d3JpdGUgPSB0aHJpZnRfZmRfdHJhbnNwb3J0X3dyaXRlOworICB0dGMtPndyaXRlX2VuZCA9IHRocmlmdF9mZF90cmFuc3BvcnRfd3JpdGVfZW5kOworICB0dGMtPmZsdXNoID0gdGhyaWZ0X2ZkX3RyYW5zcG9ydF9mbHVzaDsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mZF90cmFuc3BvcnQuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mZF90cmFuc3BvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTZkNWM0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZkX3RyYW5zcG9ydC5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX0ZEX1RSQU5TUE9SVF9ICisjZGVmaW5lIF9USFJJRlRfRkRfVFJBTlNQT1JUX0gKKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlICJ0aHJpZnRfdHJhbnNwb3J0LmgiCisKK0dfQkVHSU5fREVDTFMKKworLyohIFxmaWxlIHRocmlmdF9mZF90cmFuc3BvcnQuaAorICogIFxicmllZiBDbGFzcyBmb3IgVGhyaWZ0IGZpbGUgZGVzY3JpcHRvciB0cmFuc3BvcnRzLgorICovCisKKy8qIHR5cGUgbWFjcm9zICovCisjZGVmaW5lIFRIUklGVF9UWVBFX0ZEX1RSQU5TUE9SVCAodGhyaWZ0X2ZkX3RyYW5zcG9ydF9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgVEhSSUZUX0ZEX1RSQU5TUE9SVChvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfRkRfVFJBTlNQT1JULCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0RkRUcmFuc3BvcnQpKQorI2RlZmluZSBUSFJJRlRfSVNfRkRfVFJBTlNQT1JUKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9GRF9UUkFOU1BPUlQpKQorI2RlZmluZSBUSFJJRlRfRkRfVFJBTlNQT1JUX0NMQVNTKGMpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX0ZEX1RSQU5TUE9SVCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdEZEVHJhbnNwb3J0Q2xhc3MpKQorI2RlZmluZSBUSFJJRlRfSVNfRkRfVFJBTlNQT1JUX0NMQVNTKGMpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX0ZEX1RSQU5TUE9SVCkpCisjZGVmaW5lIFRIUklGVF9GRF9UUkFOU1BPUlRfR0VUX0NMQVNTKG9iaikgXAorICAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX0ZEX1RSQU5TUE9SVCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0RkRUcmFuc3BvcnRDbGFzcykpCisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRGRFRyYW5zcG9ydCBUaHJpZnRGRFRyYW5zcG9ydDsKKworc3RydWN0IF9UaHJpZnRGRFRyYW5zcG9ydAoreworICBUaHJpZnRUcmFuc3BvcnQgcGFyZW50OworCisgIC8qIHByb3RlY3RlZCAqLworICBnaW50IGZkOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdEZEVHJhbnNwb3J0Q2xhc3MgVGhyaWZ0RkRUcmFuc3BvcnRDbGFzczsKKworLyohCisgKiBUaHJpZnQgVHJhbnNwb3J0IGNsYXNzCisgKi8KK3N0cnVjdCBfVGhyaWZ0RkRUcmFuc3BvcnRDbGFzcworeworICBUaHJpZnRUcmFuc3BvcnRDbGFzcyBwYXJlbnQ7Cit9OworCisvKiB1c2VkIGJ5IFRIUklGVF9UWVBFX0ZEX1RSQU5TUE9SVCAqLworR1R5cGUgdGhyaWZ0X2ZkX3RyYW5zcG9ydF9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfVEhSSUZUX0ZEX1RSQU5TUE9SVF9IICovCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuYwppbmRleCA0YzhiNzFmLi5jNTQ4MjQ2IDEwMDY0NAotLS0gYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5jCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmMKQEAgLTE3LDcgKzE3LDYgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxuZXRkYi5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CkBAIC0xMjAsNyArMTE5LDcgQEAKICAgZ2ludDMyIHJlc3VsdCA9IC0xOwogCiAgIC8qIHdlIHNob3VsZG4ndCBoaXQgdGhpcyB1bmxlc3MgdGhlIGJ1ZmZlciBkb2Vzbid0IGhhdmUgZW5vdWdoIHRvIHJlYWQgKi8KLSAgYXNzZXJ0ICh0LT5yX2J1Zi0+bGVuIDwgd2FudCk7CisgIGdfYXNzZXJ0ICh0LT5yX2J1Zi0+bGVuIDwgd2FudCk7CiAKICAgLyogZmlyc3QgY29weSB3aGF0IHdlIGhhdmUgaW4gb3VyIGJ1ZmZlciwgaWYgdGhlcmUgaXMgYW55dGhpbmcgbGVmdCAqLwogICBpZiAoaGF2ZSA+IDApCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfbWVtb3J5X2J1ZmZlci5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X21lbW9yeV9idWZmZXIuYwppbmRleCA4ZDY2YzNkLi45MTgxOGU5IDEwMDY0NAotLS0gYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfbWVtb3J5X2J1ZmZlci5jCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9tZW1vcnlfYnVmZmVyLmMKQEAgLTE3LDcgKzE3LDYgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxuZXRkYi5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CkBAIC0zMiw3ICszMSw5IEBACiBlbnVtIF9UaHJpZnRNZW1vcnlCdWZmZXJQcm9wZXJ0aWVzCiB7CiAgIFBST1BfMCwKLSAgUFJPUF9USFJJRlRfTUVNT1JZX0JVRkZFUl9CVUZGRVJfU0laRQorICBQUk9QX1RIUklGVF9NRU1PUllfQlVGRkVSX0JVRkZFUl9TSVpFLAorICBQUk9QX1RIUklGVF9NRU1PUllfQlVGRkVSX0JVRkZFUiwKKyAgUFJPUF9USFJJRlRfTUVNT1JZX0JVRkZFUl9PV05FUgogfTsKIAogR19ERUZJTkVfVFlQRShUaHJpZnRNZW1vcnlCdWZmZXIsIHRocmlmdF9tZW1vcnlfYnVmZmVyLCBUSFJJRlRfVFlQRV9UUkFOU1BPUlQpCkBAIC0xNDEsMjQgKzE0MiwyNCBAQAogICByZXR1cm4gVFJVRTsKIH0KIAotLyogaW5pdGlhbGl6ZXMgdGhlIGluc3RhbmNlICovCisvKiBpbml0aWFsaXplcyBjbGFzcyBiZWZvcmUgY29uc3RydWN0b3IgcHJvcGVydGllcyBhcmUgc2V0ICovCiBzdGF0aWMgdm9pZAotdGhyaWZ0X21lbW9yeV9idWZmZXJfaW5pdCAoVGhyaWZ0TWVtb3J5QnVmZmVyICp0cmFuc3BvcnQpCit0aHJpZnRfbWVtb3J5X2J1ZmZlcl9pbml0IChUaHJpZnRNZW1vcnlCdWZmZXIgKnQpCiB7Ci0gIHRyYW5zcG9ydC0+YnVmID0gZ19ieXRlX2FycmF5X25ldyAoKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHQpOwogfQogCiAvKiBkZXN0cnVjdG9yICovCiBzdGF0aWMgdm9pZAogdGhyaWZ0X21lbW9yeV9idWZmZXJfZmluYWxpemUgKEdPYmplY3QgKm9iamVjdCkKIHsKLSAgVGhyaWZ0TWVtb3J5QnVmZmVyICp0cmFuc3BvcnQgPSBUSFJJRlRfTUVNT1JZX0JVRkZFUiAob2JqZWN0KTsKKyAgVGhyaWZ0TWVtb3J5QnVmZmVyICp0ID0gVEhSSUZUX01FTU9SWV9CVUZGRVIgKG9iamVjdCk7CiAKLSAgaWYgKHRyYW5zcG9ydC0+YnVmICE9IE5VTEwpCisgIGlmICh0LT5vd25lciAmJiB0LT5idWYgIT0gTlVMTCkKICAgewotICAgIGdfYnl0ZV9hcnJheV9mcmVlICh0cmFuc3BvcnQtPmJ1ZiwgVFJVRSk7CisgICAgZ19ieXRlX2FycmF5X3VucmVmICh0LT5idWYpOwogICB9Ci0gIHRyYW5zcG9ydC0+YnVmID0gTlVMTDsKKyAgdC0+YnVmID0gTlVMTDsKIH0KIAogLyogcHJvcGVydHkgYWNjZXNzb3IgKi8KQEAgLTE2NiwxNCArMTY3LDIzIEBACiB0aHJpZnRfbWVtb3J5X2J1ZmZlcl9nZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQogewotICBUaHJpZnRNZW1vcnlCdWZmZXIgKnRyYW5zcG9ydCA9IFRIUklGVF9NRU1PUllfQlVGRkVSIChvYmplY3QpOworICBUaHJpZnRNZW1vcnlCdWZmZXIgKnQgPSBUSFJJRlRfTUVNT1JZX0JVRkZFUiAob2JqZWN0KTsKIAogICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOwogCiAgIHN3aXRjaCAocHJvcGVydHlfaWQpCiAgIHsKICAgICBjYXNlIFBST1BfVEhSSUZUX01FTU9SWV9CVUZGRVJfQlVGRkVSX1NJWkU6Ci0gICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgdHJhbnNwb3J0LT5idWZfc2l6ZSk7CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgdC0+YnVmX3NpemUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9NRU1PUllfQlVGRkVSX0JVRkZFUjoKKyAgICAgIGdfdmFsdWVfc2V0X3BvaW50ZXIgKHZhbHVlLCAoZ3BvaW50ZXIpICh0LT5idWYpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfTUVNT1JZX0JVRkZFUl9PV05FUjoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCB0LT5vd25lcik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7CiAgICAgICBicmVhazsKICAgfQogfQpAQCAtMTgzLDE4ICsxOTMsNDAgQEAKIHRocmlmdF9tZW1vcnlfYnVmZmVyX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpCiB7Ci0gIFRocmlmdE1lbW9yeUJ1ZmZlciAqdHJhbnNwb3J0ID0gVEhSSUZUX01FTU9SWV9CVUZGRVIgKG9iamVjdCk7CisgIFRocmlmdE1lbW9yeUJ1ZmZlciAqdCA9IFRIUklGVF9NRU1PUllfQlVGRkVSIChvYmplY3QpOwogCiAgIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7CiAKICAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKICAgewogICAgIGNhc2UgUFJPUF9USFJJRlRfTUVNT1JZX0JVRkZFUl9CVUZGRVJfU0laRToKLSAgICAgIHRyYW5zcG9ydC0+YnVmX3NpemUgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICB0LT5idWZfc2l6ZSA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfTUVNT1JZX0JVRkZFUl9CVUZGRVI6CisgICAgICB0LT5idWYgPSAoR0J5dGVBcnJheSopIGdfdmFsdWVfZ2V0X3BvaW50ZXIgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfTUVNT1JZX0JVRkZFUl9PV05FUjoKKyAgICAgIHQtPm93bmVyID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wZXJ0eV9pZCwgcHNwZWMpOwogICAgICAgYnJlYWs7CiAgIH0KIH0KIAorLyogaW5pdGlhbGl6ZXMgY2xhc3MgYWZ0ZXIgY29uc3RydWN0b3IgcHJvcGVydGllcyBhcmUgc2V0ICovCitzdGF0aWMgdm9pZAordGhyaWZ0X21lbW9yeV9idWZmZXJfY29uc3RydWN0ZWQgKEdPYmplY3QgKm9iamVjdCkKK3sKKyAgVGhyaWZ0TWVtb3J5QnVmZmVyICp0ID0gVEhSSUZUX01FTU9SWV9CVUZGRVIgKG9iamVjdCk7CisKKyAgaWYgKHQtPmJ1ZiA9PSBOVUxMKSB7CisgICAgdC0+YnVmID0gZ19ieXRlX2FycmF5X25ldyAoKTsKKyAgfQorCisgIEdfT0JKRUNUX0NMQVNTICh0aHJpZnRfbWVtb3J5X2J1ZmZlcl9wYXJlbnRfY2xhc3MpLT5jb25zdHJ1Y3RlZCAob2JqZWN0KTsKK30KKwogLyogaW5pdGlhbGl6ZXMgdGhlIGNsYXNzICovCiBzdGF0aWMgdm9pZAogdGhyaWZ0X21lbW9yeV9idWZmZXJfY2xhc3NfaW5pdCAoVGhyaWZ0TWVtb3J5QnVmZmVyQ2xhc3MgKmNscykKQEAgLTIwOSwxNiArMjQxLDM4IEBACiAKICAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY191aW50ICgiYnVmX3NpemUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJidWZmZXIgc2l6ZSAoY29uc3RydWN0KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldCB0aGUgcmVhZCBidWZmZXIgc2l6ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldCB0aGUgcmVhZC93cml0ZSBidWZmZXIgc2l6ZSBsaW1pdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogbWluICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA0ODU3NiwgLyogbWF4LCAxMDI0KjEwMjQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MTIsIC8qIGRlZmF1bHQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX01BWFVJTlQzMiwgLyogbWF4ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19NQVhVSU5UMzIsIC8qIGRlZmF1bHQgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSk7CiAgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BfVEhSSUZUX01FTU9SWV9CVUZGRVJfQlVGRkVSX1NJWkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOwogCisgIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfcG9pbnRlciAoImJ1ZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludGVybmFsIGJ1ZmZlciAoR0J5dGVBcnJheSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXQgdGhlIGludGVybmFsIGJ1ZmZlciAoR0J5dGVBcnJheSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fQ09OU1RSVUNUX09OTFkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9USFJJRlRfTUVNT1JZX0JVRkZFUl9CVUZGRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOworCisgIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfYm9vbGVhbiAoIm93bmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50ZXJuYWwgYnVmZmVyIG1lbW9yeSBtYW5hZ2VtZW50IHBvbGljeSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldCB3aGV0aGVyIGludGVybmFsIGJ1ZmZlciBzaG91bGQgYmUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHVucmVmZXJlbmNlZCB3aGVuIHRocmlmdF9tZW1vcnlfYnVmZmVyIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBpcyBmaW5hbGl6ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QX1RIUklGVF9NRU1PUllfQlVGRkVSX09XTkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9zcGVjKTsKKworICBnb2JqZWN0X2NsYXNzLT5jb25zdHJ1Y3RlZCA9IHRocmlmdF9tZW1vcnlfYnVmZmVyX2NvbnN0cnVjdGVkOwogICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IHRocmlmdF9tZW1vcnlfYnVmZmVyX2ZpbmFsaXplOwogICB0dGMtPmlzX29wZW4gPSB0aHJpZnRfbWVtb3J5X2J1ZmZlcl9pc19vcGVuOwogICB0dGMtPm9wZW4gPSB0aHJpZnRfbWVtb3J5X2J1ZmZlcl9vcGVuOwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X21lbW9yeV9idWZmZXIuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9tZW1vcnlfYnVmZmVyLmgKaW5kZXggNGViZTk4Zi4uZDVkNDdiMyAxMDA2NDQKLS0tIGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X21lbW9yeV9idWZmZXIuaAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfbWVtb3J5X2J1ZmZlci5oCkBAIC01MSw2ICs1MSw3IEBACiAgIC8qIHByaXZhdGUgKi8KICAgR0J5dGVBcnJheSAqYnVmOwogICBndWludDMyIGJ1Zl9zaXplOworICBnYm9vbGVhbiBvd25lcjsKIH07CiAKIHR5cGVkZWYgc3RydWN0IF9UaHJpZnRNZW1vcnlCdWZmZXJDbGFzcyBUaHJpZnRNZW1vcnlCdWZmZXJDbGFzczsKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9wbGF0Zm9ybV9zb2NrZXQuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9wbGF0Zm9ybV9zb2NrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGU2MGYxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3BsYXRmb3JtX3NvY2tldC5oCkBAIC0wLDAgKzEsMTIwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qIGNsYW5nLWZvcm1hdCBvZmYgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9QTEFURk9STV9TT0NLRVRfSF8KKyMgIGRlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9QTEFURk9STV9TT0NLRVRfSF8KKworI2lmZGVmIF9XSU4zMgorIyAgZGVmaW5lIFRIUklGVF9HRVRfU09DS0VUX0VSUk9SIDo6V1NBR2V0TGFzdEVycm9yKCkKKyMgIGRlZmluZSBUSFJJRlRfRVJSTk8gKCpfZXJybm8oKSkKKyMgIGRlZmluZSBUSFJJRlRfRUlOUFJPR1JFU1MgV1NBRUlOUFJPR1JFU1MKKyMgIGRlZmluZSBUSFJJRlRfRUFHQUlOIFdTQUVXT1VMREJMT0NLCisjICBkZWZpbmUgVEhSSUZUX0VJTlRSIFdTQUVJTlRSCisjICBkZWZpbmUgVEhSSUZUX0VDT05OUkVTRVQgV1NBRUNPTk5SRVNFVAorIyAgZGVmaW5lIFRIUklGVF9FTk9UQ09OTiBXU0FFTk9UQ09OTgorIyAgZGVmaW5lIFRIUklGVF9FVElNRURPVVQgV1NBRVRJTUVET1VUCisjICBkZWZpbmUgVEhSSUZUX0VXT1VMREJMT0NLIFdTQUVXT1VMREJMT0NLCisjICBkZWZpbmUgVEhSSUZUX0VQSVBFIFdTQUVDT05OUkVTRVQKKyMgIGRlZmluZSBUSFJJRlRfTk9fU09DS0VUX0NBQ0hJTkcgU09fRVhDTFVTSVZFQUREUlVTRQorIyAgZGVmaW5lIFRIUklGVF9JTlZBTElEX1NPQ0tFVCBJTlZBTElEX1NPQ0tFVAorIyAgZGVmaW5lIFRIUklGVF9TT0NLRVRQQUlSIHRocmlmdF9zb2NrZXRwYWlyCisjICBkZWZpbmUgVEhSSUZUX0ZDTlRMIHRocmlmdF9mY250bAorIyAgZGVmaW5lIFRIUklGVF9PX05PTkJMT0NLIDEKKyMgIGRlZmluZSBUSFJJRlRfRl9HRVRGTCAwCisjICBkZWZpbmUgVEhSSUZUX0ZfU0VURkwgMQorIyAgZGVmaW5lIFRIUklGVF9HRVRUSU1FT0ZEQVkgdGhyaWZ0X2dldHRpbWVvZmRheQorIyAgZGVmaW5lIFRIUklGVF9DTE9TRVNPQ0tFVCBjbG9zZXNvY2tldAorIyAgZGVmaW5lIFRIUklGVF9DTE9TRSBfY2xvc2UKKyMgIGRlZmluZSBUSFJJRlRfT1BFTiBfb3BlbgorIyAgZGVmaW5lIFRIUklGVF9GVFJVTkNBVEUgX2Noc2l6ZV9zCisjICBkZWZpbmUgVEhSSUZUX0ZTWU5DIF9jb21taXQKKyMgIGRlZmluZSBUSFJJRlRfTFNFRUsgX2xzZWVrCisjICBkZWZpbmUgVEhSSUZUX1dSSVRFIF93cml0ZQorIyAgZGVmaW5lIFRIUklGVF9SRUFEIF9yZWFkCisjICBkZWZpbmUgVEhSSUZUX0ZTVEFUIF9mc3RhdAorIyAgZGVmaW5lIFRIUklGVF9TVEFUIF9zdGF0CisjICBpZmRlZiBfV0lOMzJfV0NFCisjICAgIGRlZmluZSBUSFJJRlRfR0FJX1NUUkVSUk9SKC4uLikgdGhyaWZ0X3dzdHIyc3RyKGdhaV9zdHJlcnJvclcoX19WQV9BUkdTX18pKQorIyAgZWxzZQorIyAgICBkZWZpbmUgVEhSSUZUX0dBSV9TVFJFUlJPUiBnYWlfc3RyZXJyb3JBCisjICBlbmRpZgorIyAgZGVmaW5lIFRIUklGVF9TU0laRVQgcHRyZGlmZl90CisjICBkZWZpbmUgVEhSSUZUX1NOUFJJTlRGIF9zbnByaW50ZgorIyAgZGVmaW5lIFRIUklGVF9TTEVFUF9TRUMgdGhyaWZ0X3NsZWVwCisjICBkZWZpbmUgVEhSSUZUX1NMRUVQX1VTRUMgdGhyaWZ0X3VzbGVlcAorIyAgZGVmaW5lIFRIUklGVF9USU1FU1BFQyB0aHJpZnRfdGltZXNwZWMKKyMgIGRlZmluZSBUSFJJRlRfQ1RJTUVfUiB0aHJpZnRfY3RpbWVfcgorIyAgZGVmaW5lIFRIUklGVF9QT0xMIHRocmlmdF9wb2xsCisjICBpZiBXSU5WRVIgPD0gMHgwNTAyIC8qIFhQLCBTZXJ2ZXIyMDAzICovCisjICAgIGRlZmluZSBUSFJJRlRfUE9MTEZEICB0aHJpZnRfcG9sbGZkCisjICAgIGRlZmluZSBUSFJJRlRfUE9MTElOICAweDAzMDAKKyMgICAgZGVmaW5lIFRIUklGVF9QT0xMT1VUIDB4MDAxMAorIyAgZWxzZSAvKiBWaXN0YSwgV2luNy4uLiAqLworIyAgICBkZWZpbmUgVEhSSUZUX1BPTExGRCAgcG9sbGZkCisjICAgIGRlZmluZSBUSFJJRlRfUE9MTElOICBQT0xMSU4KKyMgICAgZGVmaW5lIFRIUklGVF9QT0xMT1VUIFBPTExPVVQKKyMgIGVuZGlmIC8qIFdJTlZFUiAqLworIyAgZGVmaW5lIFRIUklGVF9TSFVUX1JEV1IgU0RfQk9USAorI2Vsc2UgLyogbm90IF9XSU4zMiAqLworIyAgaW5jbHVkZSA8ZXJybm8uaD4KKyMgIGRlZmluZSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUiBlcnJubworIyAgZGVmaW5lIFRIUklGVF9FUlJOTyBlcnJubworIyAgZGVmaW5lIFRIUklGVF9FSU5UUiAgICAgICBFSU5UUgorIyAgZGVmaW5lIFRIUklGVF9FSU5QUk9HUkVTUyBFSU5QUk9HUkVTUworIyAgZGVmaW5lIFRIUklGVF9FQ09OTlJFU0VUICBFQ09OTlJFU0VUCisjICBkZWZpbmUgVEhSSUZUX0VOT1RDT05OICAgIEVOT1RDT05OCisjICBkZWZpbmUgVEhSSUZUX0VUSU1FRE9VVCAgIEVUSU1FRE9VVAorIyAgZGVmaW5lIFRIUklGVF9FV09VTERCTE9DSyBFV09VTERCTE9DSworIyAgZGVmaW5lIFRIUklGVF9FQUdBSU4gICAgICBFQUdBSU4KKyMgIGRlZmluZSBUSFJJRlRfRVBJUEUgICAgICAgRVBJUEUKKyMgIGRlZmluZSBUSFJJRlRfTk9fU09DS0VUX0NBQ0hJTkcgU09fUkVVU0VBRERSCisjICBkZWZpbmUgVEhSSUZUX0lOVkFMSURfU09DS0VUICgtMSkKKyMgIGRlZmluZSBUSFJJRlRfU09DS0VUUEFJUiBzb2NrZXRwYWlyCisjICBkZWZpbmUgVEhSSUZUX0ZDTlRMIGZjbnRsCisjICBkZWZpbmUgVEhSSUZUX09fTk9OQkxPQ0sgT19OT05CTE9DSworIyAgZGVmaW5lIFRIUklGVF9GX0dFVEZMIEZfR0VURkwKKyMgIGRlZmluZSBUSFJJRlRfRl9TRVRGTCBGX1NFVEZMCisjICBkZWZpbmUgVEhSSUZUX0dFVFRJTUVPRkRBWSBnZXR0aW1lb2ZkYXkKKyMgIGRlZmluZSBUSFJJRlRfQ0xPU0VTT0NLRVQgY2xvc2UKKyMgIGRlZmluZSBUSFJJRlRfQ0xPU0UgY2xvc2UKKyMgIGRlZmluZSBUSFJJRlRfT1BFTiBvcGVuCisjICBkZWZpbmUgVEhSSUZUX0ZUUlVOQ0FURSBmdHJ1bmNhdGUKKyMgIGRlZmluZSBUSFJJRlRfRlNZTkMgZnN5bmMKKyMgIGRlZmluZSBUSFJJRlRfTFNFRUsgbHNlZWsKKyMgIGRlZmluZSBUSFJJRlRfV1JJVEUgd3JpdGUKKyMgIGRlZmluZSBUSFJJRlRfUkVBRCByZWFkCisjICBkZWZpbmUgVEhSSUZUX1NUQVQgc3RhdAorIyAgZGVmaW5lIFRIUklGVF9GU1RBVCBmc3RhdAorIyAgZGVmaW5lIFRIUklGVF9HQUlfU1RSRVJST1IgZ2FpX3N0cmVycm9yCisjICBkZWZpbmUgVEhSSUZUX1NTSVpFVCBzc2l6ZV90CisjICBkZWZpbmUgVEhSSUZUX1NOUFJJTlRGIHNucHJpbnRmCisjICBkZWZpbmUgVEhSSUZUX1NMRUVQX1NFQyBzbGVlcAorIyAgZGVmaW5lIFRIUklGVF9TTEVFUF9VU0VDIHVzbGVlcAorIyAgZGVmaW5lIFRIUklGVF9USU1FU1BFQyB0aW1lc3BlYworIyAgZGVmaW5lIFRIUklGVF9DVElNRV9SIGN0aW1lX3IKKyMgIGRlZmluZSBUSFJJRlRfUE9MTCBwb2xsCisjICBkZWZpbmUgVEhSSUZUX1BPTExGRCAgcG9sbGZkCisjICBkZWZpbmUgVEhSSUZUX1BPTExJTiAgUE9MTElOCisjICBkZWZpbmUgVEhSSUZUX1BPTExPVVQgUE9MTE9VVAorIyAgZGVmaW5lIFRIUklGVF9TSFVUX1JEV1IgU0hVVF9SRFdSCisjZW5kaWYKKworI2VuZGlmIC8qIF9USFJJRlRfVFJBTlNQT1JUX1BMQVRGT1JNX1NPQ0tFVF9IXyAqLwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0LmMKaW5kZXggOTdhMGVjMi4uNmVhODk3YyAxMDA2NDQKLS0tIGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuYworKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5jCkBAIC00Miw5ICs0Miw2IEBACiAvKiBkZWZpbmUgdGhlIEdFcnJvciBkb21haW4gc3RyaW5nICovCiAjZGVmaW5lIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SX0RPTUFJTiAidGhyaWZ0LXNlcnZlci1zb2NrZXQtZXJyb3ItcXVhcmsiCiAKLS8qIGZvciBlcnJvcnMgY29taW5nIGZyb20gc29ja2V0KCkgYW5kIGNvbm5lY3QoKSAqLwotZXh0ZXJuIGludCBlcnJubzsKLQogR19ERUZJTkVfVFlQRShUaHJpZnRTZXJ2ZXJTb2NrZXQsIHRocmlmdF9zZXJ2ZXJfc29ja2V0LCBUSFJJRlRfVFlQRV9TRVJWRVJfVFJBTlNQT1JUKQogCiBnYm9vbGVhbgpAQCAtMjI3LDEyICsyMjQsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCAoY29uc3RydWN0KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldCB0aGUgcG9ydCB0byBsaXN0ZW4gdG8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIG1pbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY1NTM0LCAvKiBtYXggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NTUzNSwgLyogbWF4ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTA5MCwgLyogZGVmYXVsdCBieSBjb252ZW50aW9uICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUpOwogICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QX1RIUklGVF9TRVJWRVJfU09DS0VUX1BPUlQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QX1RIUklGVF9TRVJWRVJfU09DS0VUX1BPUlQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOwogCiAgIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfdWludCAoImJhY2tsb2ciLApkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0LmgKaW5kZXggZjA3MmNiMC4uZmQwNDk1NCAxMDA2NDQKLS0tIGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuaAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5oCkBAIC00OSw3ICs0OSw3IEBACiAgIFRocmlmdFNlcnZlclRyYW5zcG9ydCBwYXJlbnQ7CiAKICAgLyogcHJpdmF0ZSAqLwotICBnc2hvcnQgcG9ydDsKKyAgZ3VpbnQgcG9ydDsKICAgZ3Nob3J0IGJhY2tsb2c7CiAgIGludCBzZDsKICAgZ3VpbnQ4ICpidWY7CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0LmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0LmMKaW5kZXggMWMxNDdlYy4uNmRkMGYwZCAxMDA2NDQKLS0tIGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5jCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuYwpAQCAtMzcsOSArMzcsNiBAQAogICBQUk9QX1RIUklGVF9TT0NLRVRfUE9SVAogfTsKIAotLyogZm9yIGVycm9ycyBjb21pbmcgZnJvbSBzb2NrZXQoKSBhbmQgY29ubmVjdCgpICovCi1leHRlcm4gaW50IGVycm5vOwotCiBHX0RFRklORV9UWVBFKFRocmlmdFNvY2tldCwgdGhyaWZ0X3NvY2tldCwgVEhSSUZUX1RZUEVfVFJBTlNQT1JUKQogCiAvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAqLwpAQCAtOTgsNiArOTUsMjUgQEAKICAgcmV0dXJuIHJlc3VsdDsKIH0KIAorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKi8KK2dib29sZWFuCit0aHJpZnRfc29ja2V0X2Nsb3NlIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFNvY2tldCAqc29ja2V0ID0gVEhSSUZUX1NPQ0tFVCAodHJhbnNwb3J0KTsKKworICBpZiAoY2xvc2UgKHNvY2tldC0+c2QpID09IC0xKQorICB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLCBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX0NMT1NFLAorICAgICAgICAgICAgICAgICAidW5hYmxlIHRvIGNsb3NlIHNvY2tldCAtICVzIiwKKyAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBzb2NrZXQtPnNkID0gVEhSSUZUX0lOVkFMSURfU09DS0VUOworICByZXR1cm4gVFJVRTsKK30KKwogLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X29wZW4gKi8KIGdib29sZWFuCiB0aHJpZnRfc29ja2V0X29wZW4gKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKQEAgLTEzMSw4ICsxNDcsOCBAQAogICAvKiBjcmVhdGUgYSBzb2NrZXQgc3RydWN0dXJlICovCiAgIG1lbXNldCAoJnBpbiwgMCwgc2l6ZW9mKHBpbikpOwogICBwaW4uc2luX2ZhbWlseSA9IEFGX0lORVQ7Ci0gIHBpbi5zaW5fYWRkci5zX2FkZHIgPSAoKHN0cnVjdCBpbl9hZGRyICopIChocC0+aF9hZGRyKSktPnNfYWRkcjsKLSAgcGluLnNpbl9wb3J0ID0gaHRvbnMgKHRzb2NrZXQtPnBvcnQpOyAKKyAgcGluLnNpbl9hZGRyLnNfYWRkciA9ICgoc3RydWN0IGluX2FkZHIgKikgKGhwLT5oX2FkZHJfbGlzdFswXSkpLT5zX2FkZHI7CisgIHBpbi5zaW5fcG9ydCA9IGh0b25zICh0c29ja2V0LT5wb3J0KTsKIAogICAvKiBjcmVhdGUgdGhlIHNvY2tldCAqLwogICBpZiAoKHRzb2NrZXQtPnNkID0gc29ja2V0IChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCkpID09IC0xKQpAQCAtMTQ3LDcgKzE2Myw4IEBACiAgIC8qIG9wZW4gYSBjb25uZWN0aW9uICovCiAgIGlmIChjb25uZWN0ICh0c29ja2V0LT5zZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmcGluLCBzaXplb2YocGluKSkgPT0gLTEpCiAgIHsKLSAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfQ09OTkVDVCwKKyAgICAgIHRocmlmdF9zb2NrZXRfY2xvc2UodHNvY2tldCwgTlVMTCk7CisgICAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfQ09OTkVDVCwKICAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBjb25uZWN0IHRvIGhvc3QgJXM6JWQgLSAlcyIsCiAgICAgICAgICAgICAgICAgIHRzb2NrZXQtPmhvc3RuYW1lLCB0c29ja2V0LT5wb3J0LCBzdHJlcnJvcihlcnJubykpOwogICAgIHJldHVybiBGQUxTRTsKQEAgLTE1NiwyMyArMTczLDYgQEAKICAgcmV0dXJuIFRSVUU7CiB9CiAKLS8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAqLwotZ2Jvb2xlYW4KLXRocmlmdF9zb2NrZXRfY2xvc2UgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKLXsKLSAgVGhyaWZ0U29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU09DS0VUICh0cmFuc3BvcnQpOwotCi0gIGlmIChjbG9zZSAoc29ja2V0LT5zZCkgPT0gLTEpCi0gIHsKLSAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfQ0xPU0UsCi0gICAgICAgICAgICAgICAgICJ1bmFibGUgdG8gY2xvc2Ugc29ja2V0IC0gJXMiLAotICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOwotICAgIHJldHVybiBGQUxTRTsKLSAgfQotCi0gIHNvY2tldC0+c2QgPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQ7Ci0gIHJldHVybiBUUlVFOwotfQogCiAvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfcmVhZCAqLwogZ2ludDMyCkBAIC0yMTMsNyArMjEzLDcgQEAKIAogLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlICovCiBnYm9vbGVhbgotdGhyaWZ0X3NvY2tldF93cml0ZSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGNvbnN0IGdwb2ludGVyIGJ1ZiwgICAgIAordGhyaWZ0X3NvY2tldF93cml0ZSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGNvbnN0IGdwb2ludGVyIGJ1ZiwKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKIHsKICAgZ2ludCByZXQgPSAwOwpAQCAtMzE4LDYgKzMxOCw5IEBACiAgIHN3aXRjaCAocHJvcGVydHlfaWQpCiAgIHsKICAgICBjYXNlIFBST1BfVEhSSUZUX1NPQ0tFVF9IT1NUTkFNRToKKyAgICAgIGlmIChzb2NrZXQtPmhvc3RuYW1lKSB7CisgICAgICAgIGdfZnJlZShzb2NrZXQtPmhvc3RuYW1lKTsKKyAgICAgIH0KICAgICAgIHNvY2tldC0+aG9zdG5hbWUgPSBnX3N0cmR1cCAoZ192YWx1ZV9nZXRfc3RyaW5nICh2YWx1ZSkpOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSBQUk9QX1RIUklGVF9TT0NLRVRfUE9SVDoKQEAgLTM1MCw4ICszNTMsOCBAQAogICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX3VpbnQgKCJwb3J0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCAoY29uc3RydWN0KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldCB0aGUgcG9ydCBvZiB0aGUgcmVtb3RlIGhvc3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIG1pbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY1NTM0LCAvKiBtYXggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwdSwgLyogbWluICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjU1MzV1LCAvKiBtYXggKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MDkwLCAvKiBkZWZhdWx0IGJ5IGNvbnZlbnRpb24gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSk7CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0LmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0LmgKaW5kZXggOTgxNTc3ZC4uMmY2ZjY3ZCAxMDA2NDQKLS0tIGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5oCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuaApAQCAtNTAsMTEgKzUwLDggQEAKIAogICAvKiBwcml2YXRlICovCiAgIGdjaGFyICpob3N0bmFtZTsKLSAgZ3Nob3J0IHBvcnQ7CisgIGd1aW50IHBvcnQ7CiAgIGludCBzZDsKLSAgZ3VpbnQ4ICpidWY7Ci0gIGd1aW50MzIgYnVmX3NpemU7Ci0gIGd1aW50MzIgYnVmX2xlbjsKIH07CiAKIHR5cGVkZWYgc3RydWN0IF9UaHJpZnRTb2NrZXRDbGFzcyBUaHJpZnRTb2NrZXRDbGFzczsKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zc2xfc29ja2V0LmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc3NsX3NvY2tldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNTU0MDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc3NsX3NvY2tldC5jCkBAIC0wLDAgKzEsODA2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3NzbC5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisjaW5jbHVkZSA8Z2xpYi5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zc2xfc29ja2V0Lmg+CisKKworI2lmIGRlZmluZWQoV0lOMzIpCisjZGVmaW5lIE1VVEVYX1RZUEUgICAgICAgICAgICBIQU5ETEUKKyNkZWZpbmUgTVVURVhfU0VUVVAoeCkgICAgICAgICh4KSA9IENyZWF0ZU11dGV4KE5VTEwsIEZBTFNFLCBOVUxMKQorI2RlZmluZSBNVVRFWF9DTEVBTlVQKHgpICAgICAgQ2xvc2VIYW5kbGUoeCkKKyNkZWZpbmUgTVVURVhfTE9DSyh4KSAgICAgICAgIFdhaXRGb3JTaW5nbGVPYmplY3QoKHgpLCBJTkZJTklURSkKKyNkZWZpbmUgTVVURVhfVU5MT0NLKHgpICAgICAgIFJlbGVhc2VNdXRleCh4KQorI2Vsc2UKKyNkZWZpbmUgTVVURVhfVFlQRSAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdAorI2RlZmluZSBNVVRFWF9TRVRVUCh4KSAgICAgICAgcHRocmVhZF9tdXRleF9pbml0KCYoeCksIE5VTEwpCisjZGVmaW5lIE1VVEVYX0NMRUFOVVAoeCkgICAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJih4KSkKKyNkZWZpbmUgTVVURVhfTE9DSyh4KSAgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmKHgpKQorI2RlZmluZSBNVVRFWF9VTkxPQ0soeCkgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJih4KSkKKyNlbmRpZgorCisjZGVmaW5lIE9QRU5TU0xfVkVSU0lPTl9OT19USFJFQURfSUQgMHgxMDAwMDAwMEwKKworCisvKiBvYmplY3QgcHJvcGVydGllcyAqLworZW51bSBfVGhyaWZ0U1NMU29ja2V0UHJvcGVydGllcworeworICBQUk9QX1RIUklGVF9TU0xfU09DS0VUX0NPTlRFWFQgPSAzLAorICBQUk9QX1RIUklGVF9TU0xfU0VMRl9TSUdORUQKK307CisKKy8qIFRvIGhvbGQgYSBnbG9iYWwgc3RhdGUgbWFuYWdlbWVudCBvZiBvcGVuc3NsIGZvciBhbGwgaW5zdGFuY2VzICovCitzdGF0aWMgZ2Jvb2xlYW4gdGhyaWZ0X3NzbF9zb2NrZXRfb3BlbnNzbF9pbml0aWFsaXplZD1GQUxTRTsKKy8qIFRoaXMgYXJyYXkgd2lsbCBzdG9yZSBhbGwgb2YgdGhlIG11dGV4ZXMgYXZhaWxhYmxlIHRvIE9wZW5TU0wuICovCitzdGF0aWMgTVVURVhfVFlQRSAqdGhyaWZ0X3NzbF9zb2NrZXRfZ2xvYmFsX211dGV4X2J1Zj1OVUxMOworCisKKy8qKgorICogT3BlblNTTCB1bmlxIGlkIGZ1bmN0aW9uLgorICoKKyAqIEByZXR1cm4gICAgdGhyZWFkIGlkCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHRocmlmdF9zc2xfc29ja2V0X3N0YXRpY19pZF9mdW5jdGlvbih2b2lkKQoreworI2lmIGRlZmluZWQoV0lOMzIpCisgIHJldHVybiBHZXRDdXJyZW50VGhyZWFkSWQoKTsKKyNlbHNlCisgIHJldHVybiAoKHVuc2lnbmVkIGxvbmcpIHB0aHJlYWRfc2VsZigpKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCB0aHJpZnRfc3NsX3NvY2tldF9zdGF0aWNfbG9ja2luZ19jYWxsYmFjayhpbnQgbW9kZSwgaW50IG4sIGNvbnN0IGNoYXIqIHVuaywgaW50IGlkKSB7CisgIGlmIChtb2RlICYgQ1JZUFRPX0xPQ0spCisgICAgTVVURVhfTE9DSyh0aHJpZnRfc3NsX3NvY2tldF9nbG9iYWxfbXV0ZXhfYnVmW25dKTsKKyAgZWxzZQorICAgIE1VVEVYX1VOTE9DSyh0aHJpZnRfc3NsX3NvY2tldF9nbG9iYWxfbXV0ZXhfYnVmW25dKTsKK30KKworc3RhdGljIGludCB0aHJpZnRfc3NsX3NvY2tldF9zdGF0aWNfdGhyZWFkX3NldHVwKHZvaWQpCit7CisgIGludCBpOworCisgIHRocmlmdF9zc2xfc29ja2V0X2dsb2JhbF9tdXRleF9idWYgPSBtYWxsb2MoQ1JZUFRPX251bV9sb2NrcygpICogc2l6ZW9mKE1VVEVYX1RZUEUpKTsKKyAgaWYgKCF0aHJpZnRfc3NsX3NvY2tldF9nbG9iYWxfbXV0ZXhfYnVmKQorICAgIHJldHVybiAwOworICBmb3IgKGkgPSAwOyAgaSA8IENSWVBUT19udW1fbG9ja3MoICApOyAgaSsrKQorICAgIE1VVEVYX1NFVFVQKHRocmlmdF9zc2xfc29ja2V0X2dsb2JhbF9tdXRleF9idWZbaV0pOworICBDUllQVE9fc2V0X2lkX2NhbGxiYWNrKHRocmlmdF9zc2xfc29ja2V0X3N0YXRpY19pZF9mdW5jdGlvbik7CisgIENSWVBUT19zZXRfbG9ja2luZ19jYWxsYmFjayh0aHJpZnRfc3NsX3NvY2tldF9zdGF0aWNfbG9ja2luZ19jYWxsYmFjayk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IHRocmlmdF9zc2xfc29ja2V0X3N0YXRpY190aHJlYWRfY2xlYW51cCh2b2lkKQoreworICBpbnQgaTsKKyAgaWYgKCF0aHJpZnRfc3NsX3NvY2tldF9nbG9iYWxfbXV0ZXhfYnVmKQorICAgIHJldHVybiAwOworICBDUllQVE9fc2V0X2lkX2NhbGxiYWNrKE5VTEwpOworICBDUllQVE9fc2V0X2xvY2tpbmdfY2FsbGJhY2soTlVMTCk7CisgIGZvciAoaSA9IDA7ICBpIDwgQ1JZUFRPX251bV9sb2NrcyggICk7ICBpKyspCisgICAgTVVURVhfQ0xFQU5VUCh0aHJpZnRfc3NsX3NvY2tldF9nbG9iYWxfbXV0ZXhfYnVmW2ldKTsKKyAgZnJlZSh0aHJpZnRfc3NsX3NvY2tldF9nbG9iYWxfbXV0ZXhfYnVmKTsKKyAgdGhyaWZ0X3NzbF9zb2NrZXRfZ2xvYmFsX211dGV4X2J1ZiA9IE5VTEw7CisgIHJldHVybiAxOworfQorCisvKgorc3RhdGljIHZvaWQqIHRocmlmdF9zc2xfc29ja2V0X2R5bl9sb2NrX2NyZWF0ZV9jYWxsYmFjayhjb25zdCBjaGFyKiB1bmssIGludCBpZCkgeworICBnX3ByaW50KCJXZSBzaG91bGQgY3JlYXRlIGEgbG9ja1xuIik7CisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCB0aHJpZnRfc3NsX3NvY2tldF9keW5fbG9ja19jYWxsYmFjayhpbnQgbW9kZSwgdm9pZCogbG9jaywgY29uc3QgY2hhciogdW5rLCBpbnQgaWQpIHsKKyAgaWYgKGxvY2sgIT0gTlVMTCkgeworICAgIGlmIChtb2RlICYgQ1JZUFRPX0xPQ0spIHsKKyAgICAgIGdfcHJpbnRmKCJXZSBzaG91bGQgbG9jayB0aHJlYWQgJWRcbiIpOworICAgIH0gZWxzZSB7CisgICAgICBnX3ByaW50ZigiV2Ugc2hvdWxkIHVubG9jayB0aHJlYWQgJWRcbiIpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCB0aHJpZnRfc3NsX3NvY2tldF9keW5fbG9ja19kZXN0cm95X2NhbGxiYWNrKHZvaWQqIGxvY2ssIGNvbnN0IGNoYXIqIHVuaywgaW50IGlkKSB7CisgIGdfcHJpbnRmKCJXZSBtdXN0IGRlc3Ryb3kgdGhlIGxvY2tcbiIpOworfQorICovCisKKworR19ERUZJTkVfVFlQRShUaHJpZnRTU0xTb2NrZXQsIHRocmlmdF9zc2xfc29ja2V0LCBUSFJJRlRfVFlQRV9TT0NLRVQpCisKKworCisvKioKKyAqIFdoZW4gdGhlcmUncyBhIHRocmVhZCBjb250ZXh0IGF0dGFjaGVkLCB3ZSBwYXNzIHRoZSBTU0wgc29ja2V0IGNvbnRleHQgc28gaXQKKyAqIGNhbiBjaGVjayBpZiB0aGUgZXJyb3IgaXMgb3V0c2lkZSBTU0wsIG9uIEkvTyBmb3IgZXhhbXBsZQorICogQHBhcmFtIHNvY2tldAorICogQHBhcmFtIGVycm9yX21zZworICogQHBhcmFtIHRocmlmdF9lcnJvcl9ubworICogQHBhcmFtIHNzbF9lcnJvcgorICogQHBhcmFtIGVycm9yCisgKi8KK3N0YXRpYwordm9pZCB0aHJpZnRfc3NsX3NvY2tldF9nZXRfc3NsX2Vycm9yKFRocmlmdFNTTFNvY2tldCAqc29ja2V0LCBjb25zdCBndWNoYXIgKmVycm9yX21zZywgZ3VpbnQgdGhyaWZ0X2Vycm9yX25vLCBpbnQgc3NsX2Vycm9yLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgdW5zaWduZWQgbG9uZyBlcnJvcl9jb2RlOworICBjaGFyIGJ1ZmZlclsxMDI0XTsKKyAgaW50IGJ1ZmZlcl9zaXplPTEwMjQ7CisgIGdib29sZWFuIGZpcnN0X2Vycm9yID0gVFJVRTsKKyAgaW50IHNzbF9lcnJvcl90eXBlID0gU1NMX2dldF9lcnJvcihzb2NrZXQtPnNzbCwgc3NsX2Vycm9yKTsKKyAgaWYoc3NsX2Vycm9yX3R5cGU+MCl7CisgICAgICBzd2l0Y2goc3NsX2Vycm9yX3R5cGUpeworCWNhc2UgU1NMX0VSUk9SX1NTTDoKKwkgIGJ1ZmZlcl9zaXplLT1zbnByaW50ZihidWZmZXIsIGJ1ZmZlcl9zaXplLCAiU1NMICVzOiAiLCBlcnJvcl9tc2cpOworCSAgd2hpbGUgKChlcnJvcl9jb2RlID0gRVJSX2dldF9lcnJvcigpKSAhPSAwICYmIGJ1ZmZlcl9zaXplPjEpIHsKKwkgICAgICBjb25zdCBjaGFyKiByZWFzb24gPSBFUlJfcmVhc29uX2Vycm9yX3N0cmluZyhlcnJvcl9jb2RlKTsKKwkgICAgICBpZihyZWFzb24hPU5VTEwpeworCQkgIGlmKCFmaXJzdF9lcnJvcikgeworCQkgICAgICBidWZmZXJfc2l6ZS09c25wcmludGYoYnVmZmVyKygxMDI0LWJ1ZmZlcl9zaXplKSwgYnVmZmVyX3NpemUsICJcblx0Iik7CisJCSAgICAgIGZpcnN0X2Vycm9yPUZBTFNFOworCQkgIH0KKwkJICBidWZmZXJfc2l6ZS09c25wcmludGYoYnVmZmVyKygxMDI0LWJ1ZmZlcl9zaXplKSwgYnVmZmVyX3NpemUsICIlbFgoJXMpIC0+ICVzIiwgZXJyb3JfY29kZSwgcmVhc29uLCBTU0xfc3RhdGVfc3RyaW5nKHNvY2tldC0+c3NsKSk7CisJICAgICAgfQorCSAgfQorCSAgYnJlYWs7CisJY2FzZSBTU0xfRVJST1JfU1lTQ0FMTDoKKwkgIGJ1ZmZlcl9zaXplLT1zbnByaW50ZihidWZmZXIsIGJ1ZmZlcl9zaXplLCAiJXM6ICIsIGVycm9yX21zZyk7CisJICBidWZmZXJfc2l6ZS09c25wcmludGYoYnVmZmVyKygxMDI0LWJ1ZmZlcl9zaXplKSwgYnVmZmVyX3NpemUsICIlbFggLT4gJXMiLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKKwkgIGJyZWFrOworCWNhc2UgU1NMX0VSUk9SX1dBTlRfUkVBRDoKKwkgIGJ1ZmZlcl9zaXplLT1zbnByaW50ZihidWZmZXIsIGJ1ZmZlcl9zaXplLCAiJXM6ICIsIGVycm9yX21zZyk7CisJICBidWZmZXJfc2l6ZS09c25wcmludGYoYnVmZmVyKygxMDI0LWJ1ZmZlcl9zaXplKSwgYnVmZmVyX3NpemUsICIlbFggLT4gJXMiLCBzc2xfZXJyb3JfdHlwZSwgIkVycm9yIHdoaWxlIHJlYWRpbmcgZnJvbSB1bmRlcmxheWluZyBsYXllciIpOworCSAgYnJlYWs7CisJY2FzZSBTU0xfRVJST1JfV0FOVF9XUklURToKKwkgIGJ1ZmZlcl9zaXplLT1zbnByaW50ZihidWZmZXIsIGJ1ZmZlcl9zaXplLCAiJXM6ICIsIGVycm9yX21zZyk7CisJICBidWZmZXJfc2l6ZS09c25wcmludGYoYnVmZmVyKygxMDI0LWJ1ZmZlcl9zaXplKSwgYnVmZmVyX3NpemUsICIlbFggLT4gJXMiLCBzc2xfZXJyb3JfdHlwZSwgIkVycm9yIHdoaWxlIHdyaXR0aW5nIHRvIHVuZGVybGF5aW5nIGxheWVyIik7CisJICBicmVhazsKKworICAgICAgfQorICAgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLAorCQkgICB0aHJpZnRfZXJyb3Jfbm8sICIlcyIsIGJ1ZmZlcik7CisgIH0KK30KKworLyoqCisgKiBGb3IgZ2xvYmFsIFNTTCBlcnJvcnMKKyAqIEBwYXJhbSBlcnJvcl9tc2cKKyAqIEBwYXJhbSB0aHJpZnRfZXJyb3Jfbm8KKyAqIEBwYXJhbSBlcnJvcgorICovCitzdGF0aWMKK3ZvaWQgdGhyaWZ0X3NzbF9zb2NrZXRfZ2V0X2Vycm9yKGNvbnN0IGd1Y2hhciAqZXJyb3JfbXNnLCBndWludCB0aHJpZnRfZXJyb3Jfbm8sIEdFcnJvciAqKmVycm9yKQoreworICB1bnNpZ25lZCBsb25nIGVycm9yX2NvZGU7CisgIHdoaWxlICgoZXJyb3JfY29kZSA9IEVSUl9nZXRfZXJyb3IoKSkgIT0gMCkgeworICAgICAgY29uc3QgY2hhciogcmVhc29uID0gRVJSX3JlYXNvbl9lcnJvcl9zdHJpbmcoZXJyb3JfY29kZSk7CisgICAgICBpZiAocmVhc29uID09IE5VTEwpIHsKKwkgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwKKwkJICAgICAgIHRocmlmdF9lcnJvcl9ubywKKwkJICAgICAgICJTU0wgZXJyb3IgJWxYOiAlcyIsIGVycm9yX2NvZGUsIGVycm9yX21zZyk7CisgICAgICB9ZWxzZXsKKwkgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwKKwkJICAgICAgIHRocmlmdF9lcnJvcl9ubywKKwkJICAgICAgICJTU0wgZXJyb3IgJWxYICVzOiAlcyIsIGVycm9yX2NvZGUscmVhc29uLCBlcnJvcl9tc2cpOworICAgICAgfQorICB9Cit9CisKKworCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAqLworZ2Jvb2xlYW4KK3RocmlmdF9zc2xfc29ja2V0X2lzX29wZW4gKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICByZXR1cm4gdGhyaWZ0X3NvY2tldF9pc19vcGVuKHRyYW5zcG9ydCk7Cit9CisKKy8qIG92ZXJyaWRlcyB0aHJpZnRfdHJhbnNwb3J0X3BlZWsgKi8KK2dib29sZWFuCit0aHJpZnRfc3NsX3NvY2tldF9wZWVrIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIGdib29sZWFuIHJldHZhbCA9IEZBTFNFOworICBUaHJpZnRTU0xTb2NrZXQgKnNzbF9zb2NrZXQgPSBUSFJJRlRfU1NMX1NPQ0tFVCAodHJhbnNwb3J0KTsKKyAgaWYgKHRocmlmdF9zc2xfc29ja2V0X2lzX29wZW4gKHRyYW5zcG9ydCkpCisgICAgeworICAgICAgaW50IHJjOworICAgICAgZ2NoYXIgYnl0ZTsKKyAgICAgIHJjID0gU1NMX3BlZWsoc3NsX3NvY2tldC0+c3NsLCAmYnl0ZSwgMSk7CisgICAgICBpZiAocmMgPCAwKSB7CisJICB0aHJpZnRfc3NsX3NvY2tldF9nZXRfc3NsX2Vycm9yKHNzbF9zb2NrZXQsICJDaGVjayBzb2NrZXQgZGF0YSIsCisJCQkJCSAgVEhSSUZUX1NTTF9TT0NLRVRfRVJST1JfU1NMLCByYywgZXJyb3IpOworICAgICAgfQorICAgICAgaWYgKHJjID09IDApIHsKKwkgIEVSUl9jbGVhcl9lcnJvcigpOworICAgICAgfQorICAgICAgcmV0dmFsID0gKHJjID4gMCk7CisgICAgfQorICByZXR1cm4gcmV0dmFsOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfb3BlbiAqLworZ2Jvb2xlYW4KK3RocmlmdF9zc2xfc29ja2V0X29wZW4gKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgRVJSX2NsZWFyX2Vycm9yKCk7CisKKyAgaWYgKCF0aHJpZnRfc29ja2V0X29wZW4odHJhbnNwb3J0LCBlcnJvcikpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGlmICghVEhSSUZUX1NTTF9TT0NLRVRfR0VUX0NMQVNTKHRyYW5zcG9ydCktPmhhbmRsZV9oYW5kc2hha2UodHJhbnNwb3J0LCBlcnJvcikpIHsKKyAgICAgIHRocmlmdF9zc2xfc29ja2V0X2Nsb3NlKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlICovCitnYm9vbGVhbgordGhyaWZ0X3NzbF9zb2NrZXRfY2xvc2UgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2Jvb2xlYW4gcmV0dmFsID0gRkFMU0U7CisgIFRocmlmdFNTTFNvY2tldCAqc3NsX3NvY2tldCA9IFRIUklGVF9TU0xfU09DS0VUKHRyYW5zcG9ydCk7CisgIGlmKHNzbF9zb2NrZXQhPU5VTEwgJiYgc3NsX3NvY2tldC0+c3NsKSB7CisgICAgICBpbnQgcmMgPSBTU0xfc2h1dGRvd24oc3NsX3NvY2tldC0+c3NsKTsKKy8qICAgICAgaWYgKHJjIDwgMCkgeworCSAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfU1NMX1NPQ0tFVF9FUlJPUl9TU0w7CisgICAgICB9Ki8KKyAgICAgIFNTTF9mcmVlKHNzbF9zb2NrZXQtPnNzbCk7CisgICAgICBzc2xfc29ja2V0LT5zc2wgPSBOVUxMOworICAgICAgRVJSX3JlbW92ZV9zdGF0ZSgwKTsKKyAgfQorICByZXR1cm4gdGhyaWZ0X3NvY2tldF9jbG9zZSh0cmFuc3BvcnQsIGVycm9yKTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3JlYWQgKi8KK2dpbnQzMgordGhyaWZ0X3NzbF9zb2NrZXRfcmVhZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKKwkJCWd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ3VpbnQgbWF4UmVjdlJldHJpZXNfID0gMTA7CisgIFRocmlmdFNTTFNvY2tldCAqc3NsX3NvY2tldCA9IFRIUklGVF9TU0xfU09DS0VUICh0cmFuc3BvcnQpOworICBndWludCBieXRlcyA9IDA7CisgIGd1aW50IHJldHJpZXMgPSAwOworICBUaHJpZnRTb2NrZXQgKnNvY2tldCA9IFRIUklGVF9TT0NLRVQgKHRyYW5zcG9ydCk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChzb2NrZXQtPnNkICE9IFRIUklGVF9JTlZBTElEX1NPQ0tFVCAmJiBzc2xfc29ja2V0LT5zc2whPU5VTEwsIEZBTFNFKTsKKworICBmb3IgKHJldHJpZXM9MDsgcmV0cmllcyA8IG1heFJlY3ZSZXRyaWVzXzsgcmV0cmllcysrKSB7CisgICAgICBieXRlcyA9IFNTTF9yZWFkKHNzbF9zb2NrZXQtPnNzbCwgYnVmLCBsZW4pOworICAgICAgaWYgKGJ5dGVzID49IDApCisJYnJlYWs7CisgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgaWYgKFNTTF9nZXRfZXJyb3Ioc3NsX3NvY2tldC0+c3NsLCBieXRlcykgPT0gU1NMX0VSUk9SX1NZU0NBTEwpIHsKKwkgIGlmIChFUlJfZ2V0X2Vycm9yKCkgPT0gMCAmJiBlcnJub19jb3B5ID09IFRIUklGVF9FSU5UUikgeworCSAgICAgIGNvbnRpbnVlOworCSAgfQorICAgICAgfWVsc2V7CisJICB0aHJpZnRfc3NsX3NvY2tldF9nZXRfc3NsX2Vycm9yKHNzbF9zb2NrZXQsICJSZWNlaXZlIGVycm9yIiwKKwkJCQkJICBUSFJJRlRfU1NMX1NPQ0tFVF9FUlJPUl9TU0wsIGJ5dGVzLCBlcnJvcik7CisKKyAgICAgIH0KKyAgICAgIHJldHVybiAtMTsKKyAgfQorICByZXR1cm4gYnl0ZXM7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZAorICogY2FsbGVkIHdoZW4gd3JpdGUgaXMgY29tcGxldGUuICBub3RoaW5nIHRvIGRvIG9uIG91ciBlbmQuICovCitnYm9vbGVhbgordGhyaWZ0X3NzbF9zb2NrZXRfcmVhZF9lbmQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgLyogc2F0aXNmeSAtV2FsbCAqLworICBUSFJJRlRfVU5VU0VEX1ZBUiAodHJhbnNwb3J0KTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAqLworZ2Jvb2xlYW4KK3RocmlmdF9zc2xfc29ja2V0X3dyaXRlIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgY29uc3QgZ3BvaW50ZXIgYnVmLAorCQkJIGNvbnN0IGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0U1NMU29ja2V0ICpzc2xfc29ja2V0ID0gVEhSSUZUX1NTTF9TT0NLRVQgKHRyYW5zcG9ydCk7CisgIGdpbnQgcmV0ID0gMDsKKyAgZ3VpbnQgc2VudCA9IDA7CisgIFRocmlmdFNvY2tldCAqc29ja2V0ID0gVEhSSUZUX1NPQ0tFVCAodHJhbnNwb3J0KTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHNvY2tldC0+c2QgIT0gVEhSSUZUX0lOVkFMSURfU09DS0VUICYmIHNzbF9zb2NrZXQtPnNzbCE9TlVMTCwgRkFMU0UpOworCisgIHdoaWxlIChzZW50IDwgbGVuKQorICAgIHsKKyAgICAgIHJldCA9IFNTTF93cml0ZSAoc3NsX3NvY2tldC0+c3NsLCAoZ3VpbnQ4ICopYnVmICsgc2VudCwgbGVuIC0gc2VudCk7CisgICAgICBpZiAocmV0IDwgMCkKKwl7CisJICB0aHJpZnRfc3NsX3NvY2tldF9nZXRfc3NsX2Vycm9yKHNzbF9zb2NrZXQsICJTZW5kIGVycm9yIiwKKwkJCQkJICBUSFJJRlRfU1NMX1NPQ0tFVF9FUlJPUl9TU0wsIHJldCwgZXJyb3IpOworCSAgcmV0dXJuIEZBTFNFOworCX0KKyAgICAgIHNlbnQgKz0gcmV0OworICAgIH0KKworICByZXR1cm4gc2VudD09bGVuOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfd3JpdGVfZW5kCisgKiBjYWxsZWQgd2hlbiB3cml0ZSBpcyBjb21wbGV0ZS4gIG5vdGhpbmcgdG8gZG8gb24gb3VyIGVuZC4gKi8KK2dib29sZWFuCit0aHJpZnRfc3NsX3NvY2tldF93cml0ZV9lbmQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgLyogc2F0aXNmeSAtV2FsbCAqLworICBUSFJJRlRfVU5VU0VEX1ZBUiAodHJhbnNwb3J0KTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaAorICogZmx1c2ggcGVuZGluZyBkYXRhLiAgc2luY2Ugd2UgYXJlIG5vdCBidWZmZXJlZCwgdGhpcyBpcyBhIG5vLW9wICovCitnYm9vbGVhbgordGhyaWZ0X3NzbF9zb2NrZXRfZmx1c2ggKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0U1NMU29ja2V0ICpzc2xfc29ja2V0ID0gVEhSSUZUX1NTTF9TT0NLRVQgKHRyYW5zcG9ydCk7CisgIGdpbnQgcmV0ID0gMDsKKyAgZ3VpbnQgc2VudCA9IDA7CisKKyAgVGhyaWZ0U29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU09DS0VUICh0cmFuc3BvcnQpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoc29ja2V0LT5zZCAhPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQgJiYgc3NsX3NvY2tldC0+c3NsIT1OVUxMLCBGQUxTRSk7CisKKyAgQklPKiBiaW8gPSBTU0xfZ2V0X3diaW8oc3NsX3NvY2tldC0+c3NsKTsKKyAgaWYgKGJpbyA9PSBOVUxMKSB7CisgICAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsCisJCSAgIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfU0VORCwKKwkJICAgImZhaWxlZCB0byBmbHVzaCwgd2JpbyByZXR1cm5lZCBudWxsIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKEJJT19mbHVzaChiaW8pICE9IDEpIHsKKyAgICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwKKwkJICAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9TRU5ELAorCQkgICAiZmFpbGVkIHRvIGZsdXNoIGl0IHJldHVybmVkIGVycm9yIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKKworZ2Jvb2xlYW4KK3RocmlmdF9zc2xfc29ja2V0X2hhbmRsZV9oYW5kc2hha2UoVGhyaWZ0VHJhbnNwb3J0ICogdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0U1NMU29ja2V0ICpzc2xfc29ja2V0ID0gVEhSSUZUX1NTTF9TT0NLRVQgKHRyYW5zcG9ydCk7CisgIFRocmlmdFNvY2tldCAqc29ja2V0ID0gVEhSSUZUX1NPQ0tFVCAodHJhbnNwb3J0KTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAodHJhbnNwb3J0KSwgRkFMU0UpOworCisgIGlmKFRIUklGVF9TU0xfU09DS0VUX0dFVF9DTEFTUyhzc2xfc29ja2V0KS0+Y3JlYXRlX3NzbF9jb250ZXh0KHRyYW5zcG9ydCwgZXJyb3IpKXsKKyAgICAgIC8qQ29udGV4dCBjcmVhdGVkKi8KKyAgICAgIFNTTF9zZXRfZmQoc3NsX3NvY2tldC0+c3NsLCBzb2NrZXQtPnNkKTsKKyAgICAgIGludCByYzsKKyAgICAgIGlmKHNzbF9zb2NrZXQtPnNlcnZlcil7CisJICByYyA9IFNTTF9hY2NlcHQoc3NsX3NvY2tldC0+c3NsKTsKKyAgICAgIH1lbHNleworCSAgcmMgPSBTU0xfY29ubmVjdChzc2xfc29ja2V0LT5zc2wpOworICAgICAgfQorICAgICAgaWYgKHJjIDw9IDApIHsKKwkgIHRocmlmdF9zc2xfc29ja2V0X2dldF9zc2xfZXJyb3Ioc3NsX3NvY2tldCwgIkVycm9yIHdoaWxlIGNvbm5lY3QvYmluZCIsIFRIUklGVF9TU0xfU09DS0VUX0VSUk9SX0NPTk5FQ1RfQklORCwgcmMsIGVycm9yKTsKKwkgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgfWVsc2UKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIHRocmlmdF9zc2xfc29ja2V0X2F1dGhvcml6ZSh0cmFuc3BvcnQsIGVycm9yKTsKK30KKworZ2Jvb2xlYW4KK3RocmlmdF9zc2xfc29ja2V0X2NyZWF0ZV9zc2xfY29udGV4dChUaHJpZnRUcmFuc3BvcnQgKiB0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRTU0xTb2NrZXQgKnNvY2tldCA9IFRIUklGVF9TU0xfU09DS0VUICh0cmFuc3BvcnQpOworCisgIGlmKHNvY2tldC0+Y3R4IT1OVUxMKXsKKyAgICAgIGlmKHNvY2tldC0+c3NsIT1OVUxMKSB7CisJICByZXR1cm4gVFJVRTsKKyAgICAgIH0KKworICAgICAgc29ja2V0LT5zc2wgPSBTU0xfbmV3KHNvY2tldC0+Y3R4KTsKKyAgICAgIGlmIChzb2NrZXQtPnNzbCA9PSBOVUxMKSB7CisJICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsCisJCSAgICAgICBUSFJJRlRfU1NMX1NPQ0tFVF9FUlJPUl9UUkFOU1BPUlQsCisJCSAgICAgICAiVW5hYmxlIHRvIGNyZWF0ZSBkZWZhdWx0IFNTTCBjb250ZXh0Iik7CisJICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworCitnYm9vbGVhbiB0aHJpZnRfc3NsX2xvYWRfY2VydF9mcm9tX2ZpbGUoVGhyaWZ0U1NMU29ja2V0ICpzc2xfc29ja2V0LCBjb25zdCBjaGFyICpmaWxlX25hbWUpCit7CisgIGNoYXIgZXJyb3JfYnVmZmVyWzI1NV07CisgIGlmICghdGhyaWZ0X3NzbF9zb2NrZXRfb3BlbnNzbF9pbml0aWFsaXplZCkgeworICAgICAgZ19lcnJvcigiT3BlblNTTCBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0Iik7CisgICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaW50IHJjID0gU1NMX0NUWF9sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoc3NsX3NvY2tldC0+Y3R4LCBmaWxlX25hbWUsIE5VTEwpOworICBpZiAocmMgIT0gMSkgeyAvKnZlcmlmeSBhdXRoZW50aWNhdGlvbiByZXN1bHQqLworICAgICAgRVJSX2Vycm9yX3N0cmluZ19uKEVSUl9nZXRfZXJyb3IoKSwgZXJyb3JfYnVmZmVyLCAyNTQpOworICAgICAgZ193YXJuaW5nKCJMb2FkIG9mIGNlcnRpZmljYXRlcyBmYWlsZWQ6ICVzISIsIGVycm9yX2J1ZmZlcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKKworZ2Jvb2xlYW4gdGhyaWZ0X3NzbF9sb2FkX2NlcnRfZnJvbV9idWZmZXIoVGhyaWZ0U1NMU29ja2V0ICpzc2xfc29ja2V0LCBjb25zdCBjaGFyIGNoYWluX2NlcnRzW10pCit7CisgIGdib29sZWFuIHJldHZhbCA9IEZBTFNFOworICAvKiBMb2FkIGNoYWluIG9mIGNlcnRzKi8KKyAgWDUwOSAqY2FjZXJ0PU5VTEw7CisgIEJJTyAqbWVtID0gQklPX25ld19tZW1fYnVmKGNoYWluX2NlcnRzLHN0cmxlbihjaGFpbl9jZXJ0cykpOworICBYNTA5X1NUT1JFICpjZXJ0X3N0b3JlID0gU1NMX0NUWF9nZXRfY2VydF9zdG9yZShzc2xfc29ja2V0LT5jdHgpOworCisgIGlmKGNlcnRfc3RvcmUhPU5VTEwpeworICAgICAgaW50IGluZGV4ID0gMDsKKyAgICAgIHdoaWxlICgoY2FjZXJ0ID0gUEVNX3JlYWRfYmlvX1g1MDkobWVtLCBOVUxMLCAwLCBOVUxMKSkhPU5VTEwpIHsKKwkgIGlmKGNhY2VydCkgeworCSAgICAgIFg1MDlfU1RPUkVfYWRkX2NlcnQoY2VydF9zdG9yZSwgY2FjZXJ0KTsKKwkgICAgICBYNTA5X2ZyZWUoY2FjZXJ0KTsKKwkgICAgICBjYWNlcnQ9TlVMTDsKKwkgIH0gLyogRnJlZSBpbW1lZGlhdGVseSAqLworCSAgaW5kZXgrKzsKKyAgICAgIH0KKyAgICAgIHJldHZhbD1UUlVFOworICB9CisgIEJJT19mcmVlKG1lbSk7CisgIHJldHVybiByZXR2YWw7Cit9CisKK2dib29sZWFuCit0aHJpZnRfc3NsX3NvY2tldF9hdXRob3JpemUoVGhyaWZ0VHJhbnNwb3J0ICogdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0U29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU09DS0VUICh0cmFuc3BvcnQpOworICBUaHJpZnRTU0xTb2NrZXQgKnNzbF9zb2NrZXQgPSBUSFJJRlRfU1NMX1NPQ0tFVCAodHJhbnNwb3J0KTsKKyAgVGhyaWZ0U1NMU29ja2V0Q2xhc3MgKmNscyA9IFRIUklGVF9TU0xfU09DS0VUX0dFVF9DTEFTUyhzc2xfc29ja2V0KTsKKyAgZ2Jvb2xlYW4gYXV0aG9yaXphdGlvbl9yZXN1bHQgPSBGQUxTRTsKKworICBpZihjbHMhPU5VTEwgJiYgc3NsX3NvY2tldC0+c3NsIT1OVUxMKXsKKyAgICAgIGludCByYyA9IFNTTF9nZXRfdmVyaWZ5X3Jlc3VsdChzc2xfc29ja2V0LT5zc2wpOworICAgICAgaWYgKHJjICE9IFg1MDlfVl9PSykgeyAvKiB2ZXJpZnkgYXV0aGVudGljYXRpb24gcmVzdWx0ICovCisJICBpZiAocmMgPT0gWDUwOV9WX0VSUl9ERVBUSF9aRVJPX1NFTEZfU0lHTkVEX0NFUlQgJiYgc3NsX3NvY2tldC0+YWxsb3dfc2VsZnNpZ25lZCkgeworCSAgICAgIGdfZGVidWcoIlRoZSBjZXJ0aWZpY2F0ZSBpcyBhIHNlbGYtc2lnbmVkIGNlcnRpZmljYXRlIGFuZCBjb25maWd1cmF0aW9uIGFsbG93cyBpdCIpOworCSAgfSBlbHNlIHsKKwkgICAgICBnX3NldF9lcnJvciAoZXJyb3IsCisJCQkgICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLAorCQkJICAgVEhSSUZUX1NTTF9TT0NLRVRfRVJST1JfU1NMX0NFUlRfVkFMSURBVElPTl9GQUlMRUQsCisJCQkgICAiVGhlIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbiBmYWlsZWQ6ICVzICglZCkiLCBYNTA5X3ZlcmlmeV9jZXJ0X2Vycm9yX3N0cmluZyhyYyksIHJjKTsKKwkgICAgICByZXR1cm4gRkFMU0U7CisJICB9CisgICAgICB9CisKKyAgICAgIFg1MDkqIGNlcnQgPSBTU0xfZ2V0X3BlZXJfY2VydGlmaWNhdGUoc3NsX3NvY2tldC0+c3NsKTsKKyAgICAgIGlmIChjZXJ0ID09IE5VTEwpIHsKKwkgIGlmIChTU0xfZ2V0X3ZlcmlmeV9tb2RlKHNzbF9zb2NrZXQtPnNzbCkgJiBTU0xfVkVSSUZZX0ZBSUxfSUZfTk9fUEVFUl9DRVJUKSB7CisJICAgICAgZ19zZXRfZXJyb3IgKGVycm9yLAorCQkJICAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwKKwkJCSAgIFRIUklGVF9TU0xfU09DS0VUX0VSUk9SX1NTTF9DRVJUX1ZBTElEQVRJT05fRkFJTEVELAorCQkJICAgIk5vIGNlcnRpZmljYXRlIHByZXNlbnQuIEFyZSB5b3UgY29ubmVjdGluZyBTU0wgc2VydmVyPyIpOworCSAgICAgIHJldHVybiBGQUxTRTsKKwkgIH0KKwkgIGdfZGVidWcoIk5vIGNlcnRpZmljYXRlIHJlcXVpcmVkIik7CisJICByZXR1cm4gVFJVRTsKKyAgICAgIH0KKworICAgICAgLyogY2VydGlmaWNhdGUgaXMgcHJlc2VudCwgc2luY2Ugd2UgZG9uJ3Qgc3VwcG9ydCBhY2Nlc3MgbWFuYWdlciB3ZSBhcmUgZG9uZSAqLworICAgICAgaWYgKGNscy0+YXV0aG9yaXplX3BlZXIgPT0gTlVMTCkgeworCSAgWDUwOV9mcmVlKGNlcnQpOworCSAgZ19kZWJ1ZygiQ2VydGlmaWNhdGUgcHJlc2VudGVkIGJ1dCB3ZSdyZSBub3QgY2hlY2tpbmcgaXQiKTsKKwkgIHJldHVybiBUUlVFOworICAgICAgfSBlbHNlIHsKKwkgIC8qIGJvdGggY2VydGlmaWNhdGUgYW5kIGFjY2VzcyBtYW5hZ2VyIGFyZSBwcmVzZW50ICovCisJICBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBzYTsKKwkgIHNvY2tsZW5fdCBzYUxlbmd0aCA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSk7CisJICBpZiAoZ2V0cGVlcm5hbWUoc29ja2V0LT5zZCwgKHN0cnVjdCBzb2NrYWRkciopJnNhLCAmc2FMZW5ndGgpICE9IDApIHsKKwkgICAgICBzYS5zc19mYW1pbHkgPSBBRl9VTlNQRUM7CisJICB9CisJICBhdXRob3JpemF0aW9uX3Jlc3VsdCA9IGNscy0+YXV0aG9yaXplX3BlZXIodHJhbnNwb3J0LCBjZXJ0LCAmc2EsIGVycm9yKTsKKyAgICAgIH0KKyAgICAgIGlmKGNlcnQgIT0gTlVMTCkgeworCSAgWDUwOV9mcmVlKGNlcnQpOworICAgICAgfQorICB9CisKKyAgcmV0dXJuIGF1dGhvcml6YXRpb25fcmVzdWx0OworfQorCisKKy8qIGluaXRpYWxpemVzIHRoZSBpbnN0YW5jZSAqLworc3RhdGljIHZvaWQKK3RocmlmdF9zc2xfc29ja2V0X2luaXQgKFRocmlmdFNTTFNvY2tldCAqc29ja2V0KQoreworICBHRXJyb3IgKmVycm9yID0gTlVMTDsKKyAgc29ja2V0LT5zc2wgPSBOVUxMOworICBzb2NrZXQtPmN0eCA9IHRocmlmdF9zc2xfc29ja2V0X2NvbnRleHRfaW5pdGlhbGl6ZShTU0xUTFMsICZlcnJvcik7CisgIGlmKHNvY2tldC0+Y3R4ID09IE5VTEwpIHsKKyAgICAgIGdfaW5mbygiVGhlIFNTTCBjb250ZXh0IHdhcyBub3QgYXV0b21hdGljYWxseSBpbml0aWFsaXplZCB3aXRoIHByb3RvY29sICVkIiwgU1NMVExTKTsKKyAgICAgIGlmKGVycm9yIT1OVUxMKXsKKwkgIGdfaW5mbygiUmVwb3J0ZWQgcmVhc29uICVzIiwgZXJyb3ItPm1lc3NhZ2UpOworCSAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICB9CisgIH0KKyAgc29ja2V0LT5zZXJ2ZXIgPSBGQUxTRTsKKyAgc29ja2V0LT5hbGxvd19zZWxmc2lnbmVkID0gRkFMU0U7CisKK30KKworLyogZGVzdHJ1Y3RvciAqLworc3RhdGljIHZvaWQKK3RocmlmdF9zc2xfc29ja2V0X2ZpbmFsaXplIChHT2JqZWN0ICpvYmplY3QpCit7CisgIFRocmlmdFNTTFNvY2tldCAqc29ja2V0ID0gVEhSSUZUX1NTTF9TT0NLRVQgKG9iamVjdCk7CisgIEdFcnJvciAqZXJyb3I9TlVMTDsKKyAgaWYoc29ja2V0IT1OVUxMKXsKKyAgICAgIGdfZGVidWcoIkluc3RhbmNlICVwIGRlc3Ryb3llZCIsICh2b2lkICopc29ja2V0KTsKKyAgICAgIGlmKHNvY2tldC0+c3NsICE9IE5VTEwpCisJeworCSAgdGhyaWZ0X3NzbF9zb2NrZXRfY2xvc2UoVEhSSUZUX1RSQU5TUE9SVChvYmplY3QpLCAmZXJyb3IpOworCSAgc29ja2V0LT5zc2w9TlVMTDsKKwl9CisKKyAgICAgIGlmKHNvY2tldC0+Y3R4IT1OVUxMKXsKKwkgIGdfZGVidWcoIkZyZWVpbmcgdGhlIGNvbnRleHQgZm9yIHRoZSBpbnN0YW5jZSIpOworCSAgU1NMX0NUWF9mcmVlKHNvY2tldC0+Y3R4KTsKKwkgIHNvY2tldC0+Y3R4PU5VTEw7CisgICAgICB9CisgIH0KKworICBpZiAoR19PQkpFQ1RfQ0xBU1MgKHRocmlmdF9zc2xfc29ja2V0X3BhcmVudF9jbGFzcyktPmZpbmFsaXplKQorICAgICgqR19PQkpFQ1RfQ0xBU1MgKHRocmlmdF9zc2xfc29ja2V0X3BhcmVudF9jbGFzcyktPmZpbmFsaXplKSAob2JqZWN0KTsKK30KKworLyogcHJvcGVydHkgYWNjZXNzb3IgKi8KK3ZvaWQKK3RocmlmdF9zc2xfc29ja2V0X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKKwkJCQlHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYykKK3sKKyAgVGhyaWZ0U1NMU29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU1NMX1NPQ0tFVCAob2JqZWN0KTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKQorICB7CisgICAgY2FzZSBQUk9QX1RIUklGVF9TU0xfU09DS0VUX0NPTlRFWFQ6CisgICAgICBnX3ZhbHVlX3NldF9wb2ludGVyICh2YWx1ZSwgc29ja2V0LT5jdHgpOworICAgICAgYnJlYWs7CisgIH0KK30KKworLyogcHJvcGVydHkgbXV0YXRvciAqLwordm9pZAordGhyaWZ0X3NzbF9zb2NrZXRfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAorCQkJCWNvbnN0IEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQoreworICBUaHJpZnRTU0xTb2NrZXQgKnNvY2tldCA9IFRIUklGVF9TU0xfU09DS0VUIChvYmplY3QpOworCisgIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7CisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NTTF9TT0NLRVRfQ09OVEVYVDoKKyAgICAgIGlmKHNvY2tldC0+Y3R4IT1OVUxMKXsKKwkgIGdfZGVidWcoIkZyZWVpbmcgdGhlIGNvbnRleHQgc2luY2Ugd2UgYXJlIHNldHRpbmcgYSBuZXcgb25lIik7CisJICBTU0xfQ1RYX2ZyZWUoc29ja2V0LT5jdHgpOworICAgICAgfQorICAgICAgc29ja2V0LT5jdHggPSBnX3ZhbHVlX2dldF9wb2ludGVyKHZhbHVlKTsgLyogV2UgY29weSB0aGUgY29udGV4dCAqLworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NTTF9TRUxGX1NJR05FRDoKKyAgICAgIHNvY2tldC0+YWxsb3dfc2VsZnNpZ25lZCA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4odmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGdfd2FybmluZygiVHJ5aW5nIHRvIHNldCBwcm9wZXJ0eSAlaSB0aGF0IGRvZXNuJ3QgZXhpc3RzISIsIHByb3BlcnR5X2lkKTsKKyAgICAgIC8qICAgIHRocmlmdF9zb2NrZXRfc2V0X3Byb3BlcnR5KG9iamVjdCwgcHJvcGVydHlfaWQsIHZhbHVlLCBwc3BlYyk7ICovCisgICAgICBicmVhazsKKyAgfQorfQorCit2b2lkCit0aHJpZnRfc3NsX3NvY2tldF9pbml0aWFsaXplX29wZW5zc2wodm9pZCkKK3sKKyAgaWYodGhyaWZ0X3NzbF9zb2NrZXRfb3BlbnNzbF9pbml0aWFsaXplZCl7CisgICAgICByZXR1cm47CisgIH0KKyAgdGhyaWZ0X3NzbF9zb2NrZXRfb3BlbnNzbF9pbml0aWFsaXplZD1UUlVFOworICBTU0xfbGlicmFyeV9pbml0KCk7CisgIEVSUl9sb2FkX2NyeXB0b19zdHJpbmdzKCk7CisgIFNTTF9sb2FkX2Vycm9yX3N0cmluZ3MoKTsKKyAgRVJSX2xvYWRfQklPX3N0cmluZ3MoKTsKKworICAvKiBTZXR1cCBsb2NraW5nICovCisgIGdfZGVidWcoIldlIHNldHVwICVkIHRocmVhZHMgbG9ja3MiLCB0aHJpZnRfc3NsX3NvY2tldF9zdGF0aWNfdGhyZWFkX3NldHVwKCkpOworCisgIC8qIGR5bmFtaWMgbG9ja2luZworICBDUllQVE9fc2V0X2R5bmxvY2tfY3JlYXRlX2NhbGxiYWNrKHRocmlmdF9zc2xfc29ja2V0X2R5bl9sb2NrX2NyZWF0ZV9jYWxsYmFjayk7CisgIENSWVBUT19zZXRfZHlubG9ja19sb2NrX2NhbGxiYWNrKHRocmlmdF9zc2xfc29ja2V0X2R5bl9sb2NrX2NhbGxiYWNrKTsKKyAgQ1JZUFRPX3NldF9keW5sb2NrX2Rlc3Ryb3lfY2FsbGJhY2sodGhyaWZ0X3NzbF9zb2NrZXRfZHluX2xvY2tfZGVzdHJveV9jYWxsYmFjayk7CisgICAqLworfQorCisKK3ZvaWQgdGhyaWZ0X3NzbF9zb2NrZXRfZmluYWxpemVfb3BlbnNzbCh2b2lkKQoreworICBpZiAoIXRocmlmdF9zc2xfc29ja2V0X29wZW5zc2xfaW5pdGlhbGl6ZWQpIHsKKyAgICAgIHJldHVybjsKKyAgfQorICB0aHJpZnRfc3NsX3NvY2tldF9vcGVuc3NsX2luaXRpYWxpemVkID0gRkFMU0U7CisKKyAgZ19kZWJ1ZygiV2UgY2xlYXJlZCAlZCB0aHJlYWRzIGxvY2tzIiwgdGhyaWZ0X3NzbF9zb2NrZXRfc3RhdGljX3RocmVhZF9jbGVhbnVwKCkpOworICAvKiBOb3Qgc3VwcG9ydGVkCisgIENSWVBUT19zZXRfbG9ja2luZ19jYWxsYmFjayhOVUxMKTsKKyAgQ1JZUFRPX3NldF9keW5sb2NrX2NyZWF0ZV9jYWxsYmFjayhOVUxMKTsKKyAgQ1JZUFRPX3NldF9keW5sb2NrX2xvY2tfY2FsbGJhY2soTlVMTCk7CisgIENSWVBUT19zZXRfZHlubG9ja19kZXN0cm95X2NhbGxiYWNrKE5VTEwpOworICAgKi8KKyAgRVJSX2ZyZWVfc3RyaW5ncygpOworICBFVlBfY2xlYW51cCgpOworICBDUllQVE9fY2xlYW51cF9hbGxfZXhfZGF0YSgpOworICBFUlJfcmVtb3ZlX3N0YXRlKDApOworfQorCisKKy8qIGluaXRpYWxpemVzIHRoZSBjbGFzcyAqLworc3RhdGljIHZvaWQKK3RocmlmdF9zc2xfc29ja2V0X2NsYXNzX2luaXQgKFRocmlmdFNTTFNvY2tldENsYXNzICpjbHMpCit7CisgIFRocmlmdFRyYW5zcG9ydENsYXNzICp0dGMgPSBUSFJJRlRfVFJBTlNQT1JUX0NMQVNTIChjbHMpOworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoY2xzKTsKKyAgR1BhcmFtU3BlYyAqcGFyYW1fc3BlYyA9IE5VTEw7CisKKyAgZ19kZWJ1ZygiSW5pdGlhbGl6YXRpb24gb2YgVGhyaWZ0U1NMU29ja2V0Q2xhc3MiKTsKKyAgLyogc2V0dXAgYWNjZXNzb3JzIGFuZCBtdXRhdG9ycyAqLworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSB0aHJpZnRfc3NsX3NvY2tldF9nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IHRocmlmdF9zc2xfc29ja2V0X3NldF9wcm9wZXJ0eTsKKyAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY19wb2ludGVyICgic3NsX2NvbnRleHQiLAorCQkJCSAgICAgIlNTTENvbnRleHQiLAorCQkJCSAgICAgIlNldCB0aGUgU1NMIGNvbnRleHQgZm9yIGhhbmRzaGFrZSB3aXRoIHRoZSByZW1vdGUgaG9zdCIsCisJCQkJICAgICBHX1BBUkFNX1JFQURXUklURSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfVEhSSUZUX1NTTF9TT0NLRVRfQ09OVEVYVCwKKwkJCQkgICBwYXJhbV9zcGVjKTsKKyAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY19ib29sZWFuICgic3NsX2FjY2VwdF9zZWxmc2lnbmVkIiwKKwkJCQkgICAgICJBY2NlcHQgU2VsZiBTaWduZWQiLAorCQkJCSAgICAgIldoZXRoZXIgb3Igbm90IGFjY2VwdCBzZWxmIHNpZ25lZCBjZXJ0aWZpY2F0ZSIsCisJCQkJICAgICBGQUxTRSwKKwkJCQkgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9USFJJRlRfU1NMX1NFTEZfU0lHTkVELAorCQkJCSAgIHBhcmFtX3NwZWMpOworICAvKiBDbGFzcyBtZXRob2RzICovCisgIGNscy0+aGFuZGxlX2hhbmRzaGFrZSA9IHRocmlmdF9zc2xfc29ja2V0X2hhbmRsZV9oYW5kc2hha2U7CisgIGNscy0+Y3JlYXRlX3NzbF9jb250ZXh0ID0gdGhyaWZ0X3NzbF9zb2NrZXRfY3JlYXRlX3NzbF9jb250ZXh0OworCisgIC8qIE92ZXJyaWRlICovCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gdGhyaWZ0X3NzbF9zb2NrZXRfZmluYWxpemU7CisgIHR0Yy0+aXNfb3BlbiA9IHRocmlmdF9zc2xfc29ja2V0X2lzX29wZW47CisgIHR0Yy0+cGVlayA9IHRocmlmdF9zc2xfc29ja2V0X3BlZWs7CisgIHR0Yy0+b3BlbiA9IHRocmlmdF9zc2xfc29ja2V0X29wZW47CisgIHR0Yy0+Y2xvc2UgPSB0aHJpZnRfc3NsX3NvY2tldF9jbG9zZTsKKyAgdHRjLT5yZWFkID0gdGhyaWZ0X3NzbF9zb2NrZXRfcmVhZDsKKyAgdHRjLT5yZWFkX2VuZCA9IHRocmlmdF9zc2xfc29ja2V0X3JlYWRfZW5kOworICB0dGMtPndyaXRlID0gdGhyaWZ0X3NzbF9zb2NrZXRfd3JpdGU7CisgIHR0Yy0+d3JpdGVfZW5kID0gdGhyaWZ0X3NzbF9zb2NrZXRfd3JpdGVfZW5kOworICB0dGMtPmZsdXNoID0gdGhyaWZ0X3NzbF9zb2NrZXRfZmx1c2g7Cit9CisKKworLyoKKyAqIFB1YmxpYyBBUEkKKyAqLworVGhyaWZ0U1NMU29ja2V0KgordGhyaWZ0X3NzbF9zb2NrZXRfbmV3KFRocmlmdFNTTFNvY2tldFByb3RvY29sIHNzbF9wcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFNTTFNvY2tldCAqdGhyaWZ0U1NMU29ja2V0ID0gTlVMTDsKKyAgU1NMX0NUWCAqc3NsX2NvbnRleHQgPSBOVUxMOworICAvKiBDcmVhdGUgdGhlIGNvbnRleHQgKi8KKyAgaWYoKHNzbF9jb250ZXh0PXRocmlmdF9zc2xfc29ja2V0X2NvbnRleHRfaW5pdGlhbGl6ZShzc2xfcHJvdG9jb2wsIGVycm9yKSk9PU5VTEwpeworICAgICAgZ193YXJuaW5nKCJXZSBjYW5ub3QgaW5pdGlhbGl6ZSBjb250ZXh0IGZvciBwcm90b2NvbCAlZCIsIHNzbF9wcm90b2NvbCk7CisgICAgICByZXR1cm4gdGhyaWZ0U1NMU29ja2V0OworICB9CisKKyAgLyogRklYTUUgaWYgdGhlIHByb3RvY29sIGlzIGRpZmZlcmVudD8gKi8KKyAgdGhyaWZ0U1NMU29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TU0xfU09DS0VULCAic3NsX2NvbnRleHQiLCBzc2xfY29udGV4dCwgTlVMTCk7CisgIHJldHVybiB0aHJpZnRTU0xTb2NrZXQ7Cit9CisKK1RocmlmdFNTTFNvY2tldCoKK3RocmlmdF9zc2xfc29ja2V0X25ld193aXRoX2hvc3QoVGhyaWZ0U1NMU29ja2V0UHJvdG9jb2wgc3NsX3Byb3RvY29sLCBnY2hhciAqaG9zdG5hbWUsIGd1aW50IHBvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRTU0xTb2NrZXQgKnRocmlmdFNTTFNvY2tldCA9IE5VTEw7CisgIFNTTF9DVFggKnNzbF9jb250ZXh0ID0gTlVMTDsKKyAgLyogQ3JlYXRlIHRoZSBjb250ZXh0ICovCisgIGlmKChzc2xfY29udGV4dD10aHJpZnRfc3NsX3NvY2tldF9jb250ZXh0X2luaXRpYWxpemUoc3NsX3Byb3RvY29sLCBlcnJvcikpPT1OVUxMKXsKKyAgICAgIC8qIEZJWE1FIERvIGVycm9yIGNvbnRyb2wgKi8KKyAgICAgIHJldHVybiB0aHJpZnRTU0xTb2NrZXQ7CisgIH0KKyAgLyogRklYTUUgaWYgdGhlIHByb3RvY29sIGlzIGRpZmZlcmVudD8gKi8KKyAgdGhyaWZ0U1NMU29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TU0xfU09DS0VULCAic3NsX2NvbnRleHQiLCBzc2xfY29udGV4dCwgImhvc3RuYW1lIiwgaG9zdG5hbWUsICJwb3J0IiwgcG9ydCwgTlVMTCk7CisgIHJldHVybiB0aHJpZnRTU0xTb2NrZXQ7Cit9CisKK3ZvaWQgdGhyaWZ0X3NzbF9zb2NrZXRfc2V0X21hbmFnZXIoVGhyaWZ0U1NMU29ja2V0ICpzc2xfc29ja2V0LCBBVVRIT1JJWkFUSU9OX01BTkFHRVJfQ0FMTEJBQ0sgY2FsbGJhY2spCit7CisgIFRocmlmdFNTTFNvY2tldENsYXNzICpzc2xTb2NrZXRDbGFzcyA9IFRIUklGVF9TU0xfU09DS0VUX0dFVF9DTEFTUyAoc3NsX3NvY2tldCk7CisgIGlmKHNzbFNvY2tldENsYXNzKXsKKyAgICAgIHNzbFNvY2tldENsYXNzLT5hdXRob3JpemVfcGVlciA9IGNhbGxiYWNrOworICB9Cit9CisKKworU1NMX0NUWCoKK3RocmlmdF9zc2xfc29ja2V0X2NvbnRleHRfaW5pdGlhbGl6ZShUaHJpZnRTU0xTb2NrZXRQcm90b2NvbCBzc2xfcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICBTU0xfQ1RYKiBjb250ZXh0ID0gTlVMTDsKKyAgc3dpdGNoKHNzbF9wcm90b2NvbCl7CisgICAgY2FzZSBTU0xUTFM6CisgICAgICBjb250ZXh0ID0gU1NMX0NUWF9uZXcoU1NMdjIzX21ldGhvZCgpKTsKKyAgICAgIGJyZWFrOworI2lmbmRlZiBPUEVOU1NMX05PX1NTTDMKKyAgICBjYXNlIFNTTHYzOgorICAgICAgY29udGV4dCA9IFNTTF9DVFhfbmV3KFNTTHYzX21ldGhvZCgpKTsKKyAgICAgIGJyZWFrOworI2VuZGlmCisgICAgY2FzZSBUTFN2MV8wOgorICAgICAgY29udGV4dCA9IFNTTF9DVFhfbmV3KFRMU3YxX21ldGhvZCgpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVExTdjFfMToKKyAgICAgIGNvbnRleHQgPSBTU0xfQ1RYX25ldyhUTFN2MV8xX21ldGhvZCgpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVExTdjFfMjoKKyAgICAgIGNvbnRleHQgPSBTU0xfQ1RYX25ldyhUTFN2MV8yX21ldGhvZCgpKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsCisJCSAgIFRIUklGVF9TU0xfU09DS0VUX0VSUk9SX0NJUEhFUl9OT1RfQVZBSUxBQkxFLAorCQkgICAiVGhlIFNTTCBwcm90b2NvbCBpcyB1bmtub3duIGZvciAlZCIsIHNzbF9wcm90b2NvbCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKGNvbnRleHQgPT0gTlVMTCkgeworICAgICAgdGhyaWZ0X3NzbF9zb2NrZXRfZ2V0X2Vycm9yKCJObyBjaXBoZXIgb3ZlcmxheSIsIFRIUklGVF9TU0xfU09DS0VUX0VSUk9SX0NJUEhFUl9OT1RfQVZBSUxBQkxFLCBlcnJvcik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBTU0xfQ1RYX3NldF9tb2RlKGNvbnRleHQsIFNTTF9NT0RFX0FVVE9fUkVUUlkpOworCisgIC8qIERpc2FibGUgaG9ycmlibHkgaW5zZWN1cmUgU1NMdjIgYW5kIFNTTHYzIHByb3RvY29scyBidXQgYWxsb3cgYSBoYW5kc2hha2UKKyAgICAgd2l0aCBvbGRlciBjbGllbnRzIHNvIHRoZXkgZ2V0IGEgZ3JhY2VmdWwgZGVuaWFsLiAqLworICBpZiAoc3NsX3Byb3RvY29sID09IFNTTFRMUykgeworICAgICAgU1NMX0NUWF9zZXRfb3B0aW9ucyhjb250ZXh0LCBTU0xfT1BfTk9fU1NMdjIpOworICAgICAgU1NMX0NUWF9zZXRfb3B0aW9ucyhjb250ZXh0LCBTU0xfT1BfTk9fU1NMdjMpOyAgIC8qIFRIUklGVC0zMTY0ICovCisgIH0KKworICByZXR1cm4gY29udGV4dDsKK30KKwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NzbF9zb2NrZXQuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zc2xfc29ja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNhNDY1YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zc2xfc29ja2V0LmgKQEAgLTAsMCArMSwyMTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1NTTF9TT0NLRVRfSAorI2RlZmluZSBfVEhSSUZUX1NTTF9TT0NLRVRfSAorCisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKyNpbmNsdWRlIDxnbGliLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3NzbC5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOXYzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfcGxhdGZvcm1fc29ja2V0Lmg+CisKK0dfQkVHSU5fREVDTFMKKworLyohIFxmaWxlIHRocmlmdF9zc2xfc29ja2V0LmgKKyAqICBcYnJpZWYgU1NMIFNvY2tldCBpbXBsZW1lbnRhdGlvbiBvZiBhIFRocmlmdCB0cmFuc3BvcnQuICBTdWJjbGFzc2VzIHRoZQorICogICAgICAgICBUaHJpZnRTb2NrZXQgY2xhc3MuIEJhc2VkIG9uIHBsYWluIG9wZW5zc2wuCisgKiAgICAgICAgIEluIHRoZSBmdXR1cmUgd2Ugc2hvdWxkIHRha2UgYSBsb29rIHRvIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTEwMTYKKyAqLworCisvKiB0eXBlIG1hY3JvcyAqLworI2RlZmluZSBUSFJJRlRfVFlQRV9TU0xfU09DS0VUICh0aHJpZnRfc3NsX3NvY2tldF9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgVEhSSUZUX1NTTF9TT0NLRVQob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9TU0xfU09DS0VULCBUaHJpZnRTU0xTb2NrZXQpKQorI2RlZmluZSBUSFJJRlRfSVNfU1NMX1NPQ0tFVChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX1NTTF9TT0NLRVQpKQorI2RlZmluZSBUSFJJRlRfU1NMX1NPQ0tFVF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfU1NMX1NPQ0tFVCwgVGhyaWZ0U1NMU29ja2V0Q2xhc3MpKQorI2RlZmluZSBUSFJJRlRfSVNfU1NMX1NPQ0tFVF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfU1NMX1NPQ0tFVCkpCisjZGVmaW5lIFRIUklGVF9TU0xfU09DS0VUX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfU1NMX1NPQ0tFVCwgVGhyaWZ0U1NMU29ja2V0Q2xhc3MpKQorCisKKy8qIGRlZmluZSBlcnJvci9leGNlcHRpb24gdHlwZXMgKi8KK3R5cGVkZWYgZW51bQoreworICBUSFJJRlRfU1NMX1NPQ0tFVF9FUlJPUl9UUkFOU1BPUlQ9NywKKyAgVEhSSUZUX1NTTF9TT0NLRVRfRVJST1JfQ09OTkVDVF9CSU5ELAorICBUSFJJRlRfU1NMX1NPQ0tFVF9FUlJPUl9DSVBIRVJfTk9UX0FWQUlMQUJMRSwKKyAgVEhSSUZUX1NTTF9TT0NLRVRfRVJST1JfU1NMLAorICBUSFJJRlRfU1NMX1NPQ0tFVF9FUlJPUl9TU0xfQ0VSVF9WQUxJREFUSU9OX0ZBSUxFRAorfSBUaHJpZnRTU0xTb2NrZXRFcnJvcjsKKworCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0U1NMU29ja2V0IFRocmlmdFNTTFNvY2tldDsKKworLyohCisgKiBUaHJpZnQgU1NMIFNvY2tldCBpbnN0YW5jZS4KKyAqLworc3RydWN0IF9UaHJpZnRTU0xTb2NrZXQKK3sKKyAgVGhyaWZ0U29ja2V0IHBhcmVudDsKKworICAvKiBwcml2YXRlICovCisgIFNTTCAqc3NsOworICBTU0xfQ1RYKiBjdHg7CisgIGdib29sZWFuIHNlcnZlcjsKKyAgZ2Jvb2xlYW4gYWxsb3dfc2VsZnNpZ25lZDsKK307CisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRTU0xTb2NrZXRDbGFzcyBUaHJpZnRTU0xTb2NrZXRDbGFzczsKK3R5cGVkZWYgZ2Jvb2xlYW4gKCogQVVUSE9SSVpBVElPTl9NQU5BR0VSX0NBTExCQUNLKSAoVGhyaWZ0VHJhbnNwb3J0ICogdHJhbnNwb3J0LCBYNTA5ICpjZXJ0LCBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqYWRkciwgR0Vycm9yICoqZXJyb3IpOworCisvKiEKKyAqIFRocmlmdCBTb2NrZXQgY2xhc3MuCisgKi8KK3N0cnVjdCBfVGhyaWZ0U1NMU29ja2V0Q2xhc3MKK3sKKyAgVGhyaWZ0U29ja2V0Q2xhc3MgcGFyZW50OworCisgIGdib29sZWFuICgqIGhhbmRsZV9oYW5kc2hha2UpIChUaHJpZnRUcmFuc3BvcnQgKiB0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKTsKKyAgZ2Jvb2xlYW4gKCogY3JlYXRlX3NzbF9jb250ZXh0KSAoVGhyaWZ0VHJhbnNwb3J0ICogdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcik7CisgIGdib29sZWFuICgqIGF1dGhvcml6ZV9wZWVyKSAoVGhyaWZ0VHJhbnNwb3J0ICogdHJhbnNwb3J0LCBYNTA5ICpjZXJ0LCBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqYWRkciwgR0Vycm9yICoqZXJyb3IpOworCisgIC8qIFBhZGRpbmcgdG8gYWxsb3cgYWRkaW5nIHVwIHRvIDEyIG5ldyB2aXJ0dWFsIGZ1bmN0aW9ucyB3aXRob3V0CisgICAqIGJyZWFraW5nIEFCSS4gKi8KKyAgZ3BvaW50ZXIgcGFkZGluZ1sxMl07Cit9OworCitlbnVtIF9UaHJpZnRTU0xTb2NrZXRQcm90b2NvbCB7CisgIFNTTFRMUyAgPSAwLCAgLyogU3VwcG9ydHMgU1NMdjIgYW5kIFNTTHYzIGhhbmRzaGFrZSBidXQgb25seSBuZWdvdGlhdGVzIGF0IFRMU3YxXzAgb3IgbGF0ZXIuICovCisvKlNTTHYyICAgPSAxLCAgIEhPUlJJQkxZIElOU0VDVVJFISAqLworICBTU0x2MyAgID0gMiwgIC8qIFN1cHBvcnRzIFNTTHYzIG9ubHkgLSBhbHNvIGhvcnJpYmx5IGluc2VjdXJlISAqLworICBUTFN2MV8wID0gMywgIC8qIFN1cHBvcnRzIFRMU3YxXzAgb3IgbGF0ZXIuICovCisgIFRMU3YxXzEgPSA0LCAgLyogU3VwcG9ydHMgVExTdjFfMSBvciBsYXRlci4gKi8KKyAgVExTdjFfMiA9IDUsICAvKiBTdXBwb3J0cyBUTFN2MV8yIG9yIGxhdGVyLiAqLworICBMQVRFU1QgID0gVExTdjFfMgorfTsKK3R5cGVkZWYgZW51bSBfVGhyaWZ0U1NMU29ja2V0UHJvdG9jb2wgVGhyaWZ0U1NMU29ja2V0UHJvdG9jb2w7CisKKworLyogSW50ZXJuYWwgZnVuY3Rpb25zICovCitTU0xfQ1RYKgordGhyaWZ0X3NzbF9zb2NrZXRfY29udGV4dF9pbml0aWFsaXplKFRocmlmdFNTTFNvY2tldFByb3RvY29sIHNzbF9wcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpOworCisKKy8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfU1NMX1NPQ0tFVCAqLworR1R5cGUgdGhyaWZ0X3NzbF9zb2NrZXRfZ2V0X3R5cGUgKHZvaWQpOworCisvKiBQdWJsaWMgQVBJICovCisKKy8qKgorICogQGJyaWVmIFNldCBhIHBpbm5pbmcgbWFuYWdlciBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IG9uZS4KKyAqCisgKiBUaGUgcGlubmluZyBtYW5hZ2VyIHdpbGwgYmUgdXNlZCBkdXJpbmcgdGhlIFNTTCBoYW5kc2hha2UgdG8gY2hlY2sgY2VydGlmaWNhdGUKKyAqIGFuZCBwaW5uaW5nIHBhcmFtZXRlcnMuCisgKgorICogQHBhcmFtIHNzbF9zb2NrZXQgU1NMIFNvY2tldCB0byBvcGVyYXRlIG9uLgorICogQHBhcmFtIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgd2lsbCB0YWtlIHRoZSBjb250cm9sIHdoaWxlIHZhbGlkYXRpbmcgcGlubmluZworICoKKyAqLwordm9pZCB0aHJpZnRfc3NsX3NvY2tldF9zZXRfbWFuYWdlcihUaHJpZnRTU0xTb2NrZXQgKnNzbF9zb2NrZXQsIEFVVEhPUklaQVRJT05fTUFOQUdFUl9DQUxMQkFDSyBjYWxsYmFjayk7CisKKy8qIFRoaXMgaXMgdGhlIFNTTCBBUEkgKi8KKy8qKgorICogQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gY3JlYXRlIGEgbmV3IFNTTCBjb250ZXh0IHdpdGggdGhlIHByb3RvY29sIHNwZWNpZmllZAorICogYW5kIGFzc2lnbiB0aGlzIG5ldyBjb250ZXh0IHRvIHRoZSBjcmVhdGVkIFRocmlmdFNTTFNvY2tldCB3aXRoIHNwZWNpZmllZCBob3N0OnBvcnQuCisgKiBAcGFyYW0gc3NsX3Byb3RvY29sCisgKiBAcGFyYW0gaG9zdG5hbWUKKyAqIEBwYXJhbSBwb3J0CisgKiBAcGFyYW0gZXJyb3IKKyAqIEByZXR1cm4KKyAqLworVGhyaWZ0U1NMU29ja2V0KgordGhyaWZ0X3NzbF9zb2NrZXRfbmV3X3dpdGhfaG9zdChUaHJpZnRTU0xTb2NrZXRQcm90b2NvbCBzc2xfcHJvdG9jb2wsIGdjaGFyICpob3N0bmFtZSwgZ3VpbnQgcG9ydCwgR0Vycm9yICoqZXJyb3IpOworCisvKioKKyAqIENvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIG5ldyBTU0wgY29udGV4dCB3aXRoIHRoZSBwcm90b2NvbCBzcGVjaWZpZWQKKyAqIGFuZCBhc3NpZ24gdGhpcyBuZXcgY29udGV4dCB0byB0aGUgY3JlYXRlZCBUaHJpZnRTU0xTb2NrZXQuCisgKiBAcGFyYW0gc3NsX3Byb3RvY29sCisgKiBAcGFyYW0gZXJyb3IKKyAqIEByZXR1cm4KKyAqLworVGhyaWZ0U1NMU29ja2V0KgordGhyaWZ0X3NzbF9zb2NrZXRfbmV3KFRocmlmdFNTTFNvY2tldFByb3RvY29sIHNzbF9wcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpOworCisvKioKKyAqIExvYWQgYSBjZXJ0aWZpY2F0ZSBjaGFpbiBmcm9tIGEgUEVNIGZpbGUuCisgKiBAcGFyYW0gc3NsX3NvY2tldCBUaGUgc3NsIHNvY2tldAorICogQHBhcmFtIGZpbGVfbmFtZSBUaGUgZmlsZSBuYW1lIG9mIHRoZSBQRU0gY2VydGlmaWNhdGUgY2hhaW4KKyAqIEByZXR1cm4KKyAqLworZ2Jvb2xlYW4KK3RocmlmdF9zc2xfbG9hZF9jZXJ0X2Zyb21fZmlsZShUaHJpZnRTU0xTb2NrZXQgKnNzbF9zb2NrZXQsIGNvbnN0IGNoYXIgKmZpbGVfbmFtZSk7CisKKy8qKgorICogTG9hZCBhIGNlcnRpZmljYXRlIGNoYWluIGZyb20gbWVtb3J5CisgKiBAcGFyYW0gc3NsX3NvY2tldCB0aGUgc3NsIHNvY2tldAorICogQHBhcmFtIGNoYWluX2NlcnRzIHRoZSBidWZmZXIgdG8gbG9hZCBQRU0gZnJvbQorICogQHJldHVybgorICovCitnYm9vbGVhbgordGhyaWZ0X3NzbF9sb2FkX2NlcnRfZnJvbV9idWZmZXIoVGhyaWZ0U1NMU29ja2V0ICpzc2xfc29ja2V0LCBjb25zdCBjaGFyIGNoYWluX2NlcnRzW10pOworCisvKioKKyAqIENoZWNrIGlmIHRoZSBzc2wgc29ja2V0IGlzIG9wZW4gYW5kIHJlYWR5IHRvIHNlbmQgYW5kIHJlY2VpdmUKKyAqIEBwYXJhbSB0cmFuc3BvcnQKKyAqIEByZXR1cm4gdHJ1ZSBpZiBvcGVuCisgKi8KK2dib29sZWFuCit0aHJpZnRfc3NsX3NvY2tldF9pc19vcGVuIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCk7CisKKworLyoqCisgKiBPcGVuIGNvbm5lY3Rpb24gaWYgcmVxdWlyZWQgYW5kIHNldCB0aGUgc29ja2V0IHRvIGJlIHJlYWR5IHRvIHNlbmQgYW5kIHJlY2VpdmUKKyAqIEBwYXJhbSB0cmFuc3BvcnQKKyAqIEBwYXJhbSBlcnJvcgorICogQHJldHVybiB0cnVlIGlmIG9wZXJhdGlvbiB3YXMgY29ycmVjdAorICovCitnYm9vbGVhbgordGhyaWZ0X3NzbF9zb2NrZXRfb3BlbiAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKTsKKworCisvKioKKyAqIEBicmllZiBJbml0aWFsaXphdGlvbiBmdW5jdGlvbgorICoKKyAqIEl0IHdpbGwgaW5pdGlhbGl6ZSBPcGVuU1NMIGZ1bmN0aW9uLiBUaGlzIGluaXRpYWxpemF0aW9uIHdpbGwgYmUgZG9uZSBhcHAKKyAqIHdpZGUuIFNvIGlmIHlvdSB3YW50IHRvIGluaXRpYWxpemUgaXQgYnkgeW91cnNlbGYgeW91IHNob3VsZCBub3QgY2FsbCBpdC4KKyAqIEJ1dCBpdCBtZWFucyB5b3UgbXVzdCBoYW5kbGUgT3BlblNTTCBpbml0aWFsaXphdGlvbiBhbmQgaGFuZGxlIGxvY2tpbmcuCisgKgorICogSXQgc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgYW55dGhpbmcgZWxzZS4KKyAqCisgKgorICovCit2b2lkCit0aHJpZnRfc3NsX3NvY2tldF9pbml0aWFsaXplX29wZW5zc2wodm9pZCk7CisvKioKKyAqIEBicmllZiBGaW5hbGl6YXRpb24gZnVuY3Rpb24KKyAqCisgKiBJdCBjbGVhcnMgYWxsIHJlc291cmNlcyBpbml0aWFsaXplZCBpbiBpbml0aWFsaXplIGZ1bmN0aW9uLgorICoKKyAqIEl0IHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgYW55dGhpbmcgZWxzZS4KKyAqCisgKgorICovCit2b2lkCit0aHJpZnRfc3NsX3NvY2tldF9maW5hbGl6ZV9vcGVuc3NsKHZvaWQpOworCitHX0VORF9ERUNMUworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0LmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0LmMKaW5kZXggNTUzMzQzNy4uOWRkMjY3MSAxMDA2NDQKLS0tIGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5jCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuYwpAQCAtODUsNiArODUsMTQgQEAKICAgcmV0dXJuIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0cmFuc3BvcnQpLT5mbHVzaCAodHJhbnNwb3J0LCBlcnJvcik7CiB9CiAKK2dpbnQzMgordGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0cmFuc3BvcnQpLT5yZWFkX2FsbCAodHJhbnNwb3J0LCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgZXJyb3IpOworfQorCiAvKiBieSBkZWZhdWx0LCBwZWVrIHJldHVybnMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgdHJhbnNwb3J0IGlzIG9wZW4gKi8KIHN0YXRpYyBnYm9vbGVhbgogdGhyaWZ0X3RyYW5zcG9ydF9yZWFsX3BlZWsgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKQEAgLTk0LDYgKzEwMiwzMyBAQAogICByZXR1cm4gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCktPmlzX29wZW4gKHRyYW5zcG9ydCk7CiB9CiAKK3N0YXRpYyBnaW50MzIKK3RocmlmdF90cmFuc3BvcnRfcmVhbF9yZWFkX2FsbCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRUcmFuc3BvcnRDbGFzcyAqdHRjOworICBndWludDMyIGhhdmU7CisgIGdpbnQzMiByZXQ7CisgIGdpbnQ4ICpieXRlczsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIHR0YyA9IFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0cmFuc3BvcnQpOworICBoYXZlID0gMDsKKyAgcmV0ID0gMDsKKyAgYnl0ZXMgPSAoZ2ludDgqKSBidWY7CisKKyAgd2hpbGUgKGhhdmUgPCBsZW4pIHsKKyAgICBpZiAoKHJldCA9IHR0Yy0+cmVhZCAodHJhbnNwb3J0LCAoZ3BvaW50ZXIpIChieXRlcyArIGhhdmUpLCBsZW4gLSBoYXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkgeworICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgaGF2ZSArPSByZXQ7CisgIH0KKworICByZXR1cm4gaGF2ZTsKK30KKwogLyogZGVmaW5lIHRoZSBHRXJyb3IgZG9tYWluIGZvciBUaHJpZnQgdHJhbnNwb3J0cyAqLwogR1F1YXJrCiB0aHJpZnRfdHJhbnNwb3J0X2Vycm9yX3F1YXJrICh2b2lkKQpAQCAtMTE1LDggKzE1MCw5IEBACiAgIGNscy0+d3JpdGVfZW5kID0gdGhyaWZ0X3RyYW5zcG9ydF93cml0ZV9lbmQ7CiAgIGNscy0+Zmx1c2ggPSB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoOwogCi0gIC8qIHByb3ZpZGUgYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciB0aGUgcGVlayBtZXRob2QgKi8KKyAgLyogcHJvdmlkZSBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBwZWVrIGFuZCByZWFkX2FsbCBtZXRob2RzICovCiAgIGNscy0+cGVlayA9IHRocmlmdF90cmFuc3BvcnRfcmVhbF9wZWVrOworICBjbHMtPnJlYWRfYWxsID0gdGhyaWZ0X3RyYW5zcG9ydF9yZWFsX3JlYWRfYWxsOwogfQogCiBzdGF0aWMgdm9pZApkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oCmluZGV4IDU1NTVhNWUuLjk0YmI2ZjUgMTAwNjQ0Ci0tLSBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0LmgKQEAgLTczLDYgKzczLDggQEAKICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpOwogICBnYm9vbGVhbiAoKndyaXRlX2VuZCkgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcik7CiAgIGdib29sZWFuICgqZmx1c2gpIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCpyZWFkX2FsbCkgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKTsKIH07CiAKIC8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfVFJBTlNQT1JUICovCkBAIC0xNDMsNiArMTQ1LDEzIEBACiAgKi8KIGdib29sZWFuIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcik7CiAKKy8qIQorICogUmVhZCBsZW4gYnl0ZXMgb2YgZGF0YSBpbnRvIHRoZSBidWZmZXIgYnVmLgorICogXHB1YmxpYyBcbWVtYmVyb2YgVGhyaWZ0VHJhbnNwb3J0SW50ZXJmYWNlCisgKi8KK2dpbnQzMiB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgZ3BvaW50ZXIgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcik7CisKIC8qIGRlZmluZSBlcnJvci9leGNlcHRpb24gdHlwZXMgKi8KIHR5cGVkZWYgZW51bQogewpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L0NNYWtlTGlzdHMudHh0IGIvbGliL2NfZ2xpYi90ZXN0L0NNYWtlTGlzdHMudHh0CmluZGV4IDMxZTZjNmIuLmZiM2U0MWMgMTAwNjQ0Ci0tLSBhL2xpYi9jX2dsaWIvdGVzdC9DTWFrZUxpc3RzLnR4dAorKysgYi9saWIvY19nbGliL3Rlc3QvQ01ha2VMaXN0cy50eHQKQEAgLTE4LDE2ICsxOCwxOCBAQAogIwogCiAKLSNNYWtlIHN1cmUgZ2VuLWNwcCBhbmQgZ2VuLWNfZ2xpYiBmaWxlcyBjYW4gYmUgaW5jbHVkZWQKLWluY2x1ZGVfZGlyZWN0b3JpZXMoIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfSIpCi0KIHNldChURVNUX1BSRUZJWCAiY19nbGliIikKIAotaW5jbHVkZV9kaXJlY3Rvcmllcygke0Jvb3N0X0lOQ0xVREVfRElSU30pCitpbmNsdWRlX2RpcmVjdG9yaWVzKFNZU1RFTSAke0Jvb3N0X0lOQ0xVREVfRElSU30pCisKKyNNYWtlIHN1cmUgZ2VuLWNwcCBhbmQgZ2VuLWNfZ2xpYiBmaWxlcyBjYW4gYmUgaW5jbHVkZWQKK2luY2x1ZGVfZGlyZWN0b3JpZXMoIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfSIpCiAKICMgQ3JlYXRlIHRoZSB0aHJpZnQgQyB0ZXN0IGxpYnJhcnkKIHNldCh0ZXN0Z2VuY19TT1VSQ0VTCiAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZGVidWdfcHJvdG9fdGVzdF90eXBlcy5jCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZW51bV90ZXN0X3R5cGVzLmMKKyAgICBnZW4tY19nbGliL3RfdGVzdF9lbnVtX3Rlc3Rfc2VydmljZS5jCiAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZW1wdHlfc2VydmljZS5jCiAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfaW5oZXJpdGVkLmMKICAgICBnZW4tY19nbGliL3RfdGVzdF9vcHRpb25hbF9yZXF1aXJlZF90ZXN0X3R5cGVzLmMKQEAgLTM4LDYgKzQwLDggQEAKICAgICBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdC5jCiAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3RfdHlwZXMuYwogICAgIGdlbi1jX2dsaWIvdF90ZXN0X2RlYnVnX3Byb3RvX3Rlc3RfdHlwZXMuaAorICAgIGdlbi1jX2dsaWIvdF90ZXN0X2VudW1fdGVzdF90eXBlcy5oCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZW51bV90ZXN0X3NlcnZpY2UuaAogICAgIGdlbi1jX2dsaWIvdF90ZXN0X2VtcHR5X3NlcnZpY2UuaAogICAgIGdlbi1jX2dsaWIvdF90ZXN0X2luaGVyaXRlZC5oCiAgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfdGVzdF90eXBlcy5oCkBAIC01MCwzNSArNTQsNDggQEAKICkKIAogYWRkX2xpYnJhcnkodGVzdGdlbmMgU1RBVElDICR7dGVzdGdlbmNfU09VUkNFU30pCi10YXJnZXRfbGlua19saWJyYXJpZXModGVzdGdlbmMgdGhyaWZ0X2NfZ2xpYikKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWSh0ZXN0Z2VuYyB0aHJpZnRfY19nbGliKQogCiAKK2FkZF9leGVjdXRhYmxlKHRlc3RzZXJpYWxpemF0aW9uIHRlc3RzZXJpYWxpemF0aW9uLmMpCit0YXJnZXRfbGlua19saWJyYXJpZXModGVzdHNlcmlhbGl6YXRpb24gdGVzdGdlbmMpCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkodGVzdHNlcmlhbGl6YXRpb24gdGhyaWZ0X2NfZ2xpYikKK2FkZF90ZXN0KE5BTUUgdGVzdHNlcmlhbGl6YXRpb24gQ09NTUFORCB0ZXN0c2VyaWFsaXphdGlvbikKKwogYWRkX2V4ZWN1dGFibGUodGVzdGFwcGxpY2F0aW9uZXhjZXB0aW9uIHRlc3RhcHBsaWNhdGlvbmV4Y2VwdGlvbi5jKQotdGFyZ2V0X2xpbmtfbGlicmFyaWVzKHRlc3RhcHBsaWNhdGlvbmV4Y2VwdGlvbiB0aHJpZnRfY19nbGliKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKHRlc3RhcHBsaWNhdGlvbmV4Y2VwdGlvbiB0aHJpZnRfY19nbGliKQogYWRkX3Rlc3QoTkFNRSB0ZXN0YXBwbGljYXRpb25leGNlcHRpb24gQ09NTUFORCB0ZXN0YXBwbGljYXRpb25leGNlcHRpb24pCiAKIGFkZF9leGVjdXRhYmxlKHRlc3R0cmFuc3BvcnRzb2NrZXQgdGVzdHRyYW5zcG9ydHNvY2tldC5jKQotdGFyZ2V0X2xpbmtfbGlicmFyaWVzKHRlc3R0cmFuc3BvcnRzb2NrZXQgdGhyaWZ0X2NfZ2xpYikKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWSh0ZXN0dHJhbnNwb3J0c29ja2V0IHRocmlmdF9jX2dsaWIpCiBhZGRfdGVzdChOQU1FIHRlc3R0cmFuc3BvcnRzb2NrZXQgQ09NTUFORCB0ZXN0dHJhbnNwb3J0c29ja2V0KQogCiBhZGRfZXhlY3V0YWJsZSh0ZXN0YmluYXJ5cHJvdG9jb2wgdGVzdGJpbmFyeXByb3RvY29sLmMpCi10YXJnZXRfbGlua19saWJyYXJpZXModGVzdGJpbmFyeXByb3RvY29sIHRocmlmdF9jX2dsaWIpCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkodGVzdGJpbmFyeXByb3RvY29sIHRocmlmdF9jX2dsaWIpCiBhZGRfdGVzdChOQU1FIHRlc3RiaW5hcnlwcm90b2NvbCBDT01NQU5EIHRlc3RiaW5hcnlwcm90b2NvbCkKIAorYWRkX2V4ZWN1dGFibGUodGVzdGNvbXBhY3Rwcm90b2NvbCB0ZXN0Y29tcGFjdHByb3RvY29sLmMpCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkodGVzdGNvbXBhY3Rwcm90b2NvbCB0aHJpZnRfY19nbGliKQorYWRkX3Rlc3QoTkFNRSB0ZXN0Y29tcGFjdHByb3RvY29sIENPTU1BTkQgdGVzdGNvbXBhY3Rwcm90b2NvbCkKKwogYWRkX2V4ZWN1dGFibGUodGVzdGJ1ZmZlcmVkdHJhbnNwb3J0IHRlc3RidWZmZXJlZHRyYW5zcG9ydC5jKQotdGFyZ2V0X2xpbmtfbGlicmFyaWVzKHRlc3RidWZmZXJlZHRyYW5zcG9ydCB0aHJpZnRfY19nbGliKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKHRlc3RidWZmZXJlZHRyYW5zcG9ydCB0aHJpZnRfY19nbGliKQogYWRkX3Rlc3QoTkFNRSB0ZXN0YnVmZmVyZWR0cmFuc3BvcnQgQ09NTUFORCB0ZXN0YnVmZmVyZWR0cmFuc3BvcnQpCiAKIGFkZF9leGVjdXRhYmxlKHRlc3RmcmFtZWR0cmFuc3BvcnQgdGVzdGZyYW1lZHRyYW5zcG9ydC5jKQotdGFyZ2V0X2xpbmtfbGlicmFyaWVzKHRlc3RmcmFtZWR0cmFuc3BvcnQgdGhyaWZ0X2NfZ2xpYikKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWSh0ZXN0ZnJhbWVkdHJhbnNwb3J0IHRocmlmdF9jX2dsaWIpCiBhZGRfdGVzdChOQU1FIHRlc3RmcmFtZWR0cmFuc3BvcnQgQ09NTUFORCB0ZXN0ZnJhbWVkdHJhbnNwb3J0KQogCithZGRfZXhlY3V0YWJsZSh0ZXN0ZmR0cmFuc3BvcnQgdGVzdGZkdHJhbnNwb3J0LmMpCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkodGVzdGZkdHJhbnNwb3J0IHRocmlmdF9jX2dsaWIpCithZGRfdGVzdChOQU1FIHRlc3RmZHRyYW5zcG9ydCBDT01NQU5EIHRlc3RmZHRyYW5zcG9ydCkKKwogYWRkX2V4ZWN1dGFibGUodGVzdG1lbW9yeWJ1ZmZlciB0ZXN0bWVtb3J5YnVmZmVyLmMpCi10YXJnZXRfbGlua19saWJyYXJpZXModGVzdG1lbW9yeWJ1ZmZlciB0aHJpZnRfY19nbGliKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKHRlc3RtZW1vcnlidWZmZXIgdGhyaWZ0X2NfZ2xpYikKIGFkZF90ZXN0KE5BTUUgdGVzdG1lbW9yeWJ1ZmZlciBDT01NQU5EIHRlc3RtZW1vcnlidWZmZXIpCiAKIGFkZF9leGVjdXRhYmxlKHRlc3RzaW1wbGVzZXJ2ZXIgdGVzdHNpbXBsZXNlcnZlci5jKQotdGFyZ2V0X2xpbmtfbGlicmFyaWVzKHRlc3RzaW1wbGVzZXJ2ZXIgdGhyaWZ0X2NfZ2xpYikKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWSh0ZXN0c2ltcGxlc2VydmVyIHRocmlmdF9jX2dsaWIpCiBhZGRfdGVzdChOQU1FIHRlc3RzaW1wbGVzZXJ2ZXIgQ09NTUFORCB0ZXN0c2ltcGxlc2VydmVyKQogCiBhZGRfZXhlY3V0YWJsZSh0ZXN0ZGVidWdwcm90byB0ZXN0ZGVidWdwcm90by5jKQpAQCAtODksNyArMTA2LDE0IEBACiB0YXJnZXRfbGlua19saWJyYXJpZXModGVzdG9wdGlvbmFscmVxdWlyZWQgdGVzdGdlbmMpCiBhZGRfdGVzdChOQU1FIHRlc3RvcHRpb25hbHJlcXVpcmVkIENPTU1BTkQgdGVzdG9wdGlvbmFscmVxdWlyZWQpCiAKLWFkZF9leGVjdXRhYmxlKHRlc3R0aHJpZnR0ZXN0IHRlc3R0aHJpZnR0ZXN0LmMpCitpbmNsdWRlX2RpcmVjdG9yaWVzKCIke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9jX2dsaWIvc3JjIiAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1jX2dsaWIiKQorCithZGRfZXhlY3V0YWJsZSh0ZXN0dGhyaWZ0dGVzdCB0ZXN0dGhyaWZ0dGVzdC5jCisgICAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvY19nbGliL3NyYy90aHJpZnRfdGVzdF9oYW5kbGVyLmMKKyAgICAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9jX2dsaWIvc3JjL3RocmlmdF90ZXN0X2hhbmRsZXIuaAorICAgICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L2NfZ2xpYi9zcmMvdGhyaWZ0X3NlY29uZF9zZXJ2aWNlX2hhbmRsZXIuYworICAgICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L2NfZ2xpYi9zcmMvdGhyaWZ0X3NlY29uZF9zZXJ2aWNlX2hhbmRsZXIuaAorICAgIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0X3R5cGVzLmgpCiB0YXJnZXRfbGlua19saWJyYXJpZXModGVzdHRocmlmdHRlc3QgdGVzdGdlbmMpCiBhZGRfdGVzdChOQU1FIHRlc3R0aHJpZnR0ZXN0IENPTU1BTkQgdGVzdHRocmlmdHRlc3QpCiAKQEAgLTEwOSwxNCArMTMzLDE0IEBACiAgICAgKQogCiAgICAgYWRkX2xpYnJhcnkodGVzdGdlbmNfY3BwIFNUQVRJQyAke3Rlc3RnZW5jX2NwcF9TT1VSQ0VTfSkKLSAgICB0YXJnZXRfbGlua19saWJyYXJpZXModGVzdGdlbmNfY3BwIHRocmlmdCkKKyAgICBMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkodGVzdGdlbmNfY3BwIHRocmlmdCkKIAogICAgICNIQUNLOiB0ZXN0dGhyaWZ0dGVzdGNsaWVudC5jcHAgaW5jbHVkZXMgVGhyaWZ0VGVzdC5oIHdpdGhvdXQgZ2VuLSovIHByZWZpeGVzCiAgICAgIyBzbyB3ZSBpbmNsdWRlIGl0IGhlcmUKICAgICBpbmNsdWRlX2RpcmVjdG9yaWVzKCIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWNwcCIgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4tY19nbGliIikKIAogICAgIGFkZF9leGVjdXRhYmxlKHRlc3R0aHJpZnR0ZXN0Y2xpZW50IHRlc3R0aHJpZnR0ZXN0Y2xpZW50LmNwcCkKLSAgICB0YXJnZXRfbGlua19saWJyYXJpZXModGVzdHRocmlmdHRlc3RjbGllbnQgdGVzdGdlbmMgdGVzdGdlbmNfY3BwKQorICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyh0ZXN0dGhyaWZ0dGVzdGNsaWVudCB0ZXN0Z2VuYyB0ZXN0Z2VuY19jcHAgJHtaTElCX0xJQlJBUklFU30pCiAgICAgYWRkX3Rlc3QoTkFNRSB0ZXN0dGhyaWZ0dGVzdGNsaWVudCBDT01NQU5EIHRlc3R0aHJpZnR0ZXN0Y2xpZW50KQogCiBlbmRpZihCVUlMRF9DUFApCkBAIC0xMzgsMTMgKzE2MiwyMSBAQAogICAgIGdlbi1jX2dsaWIvdF90ZXN0X3NlcnZpY2VfZm9yX2V4Y2VwdGlvbl93aXRoX2FfbWFwLmgKICAgICBnZW4tY19nbGliL3RfdGVzdF9zcnYuYwogICAgIGdlbi1jX2dsaWIvdF90ZXN0X3Nydi5oCi0gICAgQ09NTUFORCB0aHJpZnQtY29tcGlsZXIgLS1nZW4gY19nbGliICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L0RlYnVnUHJvdG9UZXN0LnRocmlmdAorICAgIENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGNfZ2xpYiAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQKKykKKworYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVAorICAgIGdlbi1jX2dsaWIvdF90ZXN0X2VudW1fdGVzdF90eXBlcy5jCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZW51bV90ZXN0X3R5cGVzLmgKKyAgICBnZW4tY19nbGliL3RfdGVzdF9lbnVtX3Rlc3Rfc2VydmljZS5jCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZW51bV90ZXN0X3NlcnZpY2UuaAorICAgIENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGNfZ2xpYiAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9FbnVtVGVzdC50aHJpZnQKICkKIAogYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVAogICAgIGdlbi1jX2dsaWIvdF90ZXN0X29wdGlvbmFsX3JlcXVpcmVkX3Rlc3RfdHlwZXMuYwogICAgIGdlbi1jX2dsaWIvdF90ZXN0X29wdGlvbmFsX3JlcXVpcmVkX3Rlc3RfdHlwZXMuaAotICAgIENPTU1BTkQgdGhyaWZ0LWNvbXBpbGVyIC0tZ2VuIGNfZ2xpYiAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9PcHRpb25hbFJlcXVpcmVkVGVzdC50aHJpZnQKKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBjX2dsaWIgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvT3B0aW9uYWxSZXF1aXJlZFRlc3QudGhyaWZ0CiApCiAKIGFkZF9jdXN0b21fY29tbWFuZChPVVRQVVQKQEAgLTE1NCw3ICsxODYsNyBAQAogICAgIGdlbi1jX2dsaWIvdF90ZXN0X3NlY29uZF9zZXJ2aWNlLmgKICAgICBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdC5oCiAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3RfdHlwZXMuaAotICAgIENPTU1BTkQgdGhyaWZ0LWNvbXBpbGVyIC0tZ2VuIGNfZ2xpYiAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorICAgIENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGNfZ2xpYiAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAogKQogCiBhZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUCkBAIC0xNjQsNyArMTk2LDcgQEAKICAgICBnZW4tY3BwL1RocmlmdFRlc3QuaAogICAgIGdlbi1jcHAvVGhyaWZ0VGVzdF9jb25zdGFudHMuaAogICAgIGdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5oCi0gICAgQ09NTUFORCB0aHJpZnQtY29tcGlsZXIgLS1nZW4gY3BwICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CisgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gY3BwICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CiApCiAKICMgVE9ETzogQWRkIG1lbW9yeSBjaGVja3MgdXNpbmcgY3Rlc3RfbWVtY2hlY2sgb3Igc2ltaWxhcgpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L01ha2VmaWxlLmFtIGIvbGliL2NfZ2xpYi90ZXN0L01ha2VmaWxlLmFtCmluZGV4IDczMTk3NDMuLjVlOWQyZWEgMTAwNzU1Ci0tLSBhL2xpYi9jX2dsaWIvdGVzdC9NYWtlZmlsZS5hbQorKysgYi9saWIvY19nbGliL3Rlc3QvTWFrZWZpbGUuYW0KQEAgLTM2LDE5ICszNiwyMyBAQAogICAgICAgICBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdC5oIFwKICAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3RfdHlwZXMuaAogCi1BTV9DUFBGTEFHUyA9IC1JLi4vc3JjCi1BTV9DRkxBR1MgPSAtZyAtV2FsbCAtV2V4dHJhIC1wZWRhbnRpYyAkKEdMSUJfQ0ZMQUdTKSAkKEdPQkpFQ1RfQ0ZMQUdTKSBcCitBTV9DUFBGTEFHUyA9IC1JLi4vc3JjIC1JLi9nZW4tY19nbGliCitBTV9DRkxBR1MgPSAtZyAtV2FsbCAtV2V4dHJhIC1wZWRhbnRpYyAkKEdMSUJfQ0ZMQUdTKSAkKEdPQkpFQ1RfQ0ZMQUdTKSAkKE9QRU5TU0xfSU5DTFVERVMpIFwKIAlAR0NPVl9DRkxBR1NACiBBTV9DWFhGTEFHUyA9ICQoQU1fQ0ZMQUdTKQotQU1fTERGTEFHUyA9ICQoR0xJQl9MSUJTKSAkKEdPQkpFQ1RfTElCUykgQEdDT1ZfTERGTEFHU0AKK0FNX0xERkxBR1MgPSAkKEdMSUJfTElCUykgJChHT0JKRUNUX0xJQlMpICQoT1BFTlNTTF9MSUJTKSBAR0NPVl9MREZMQUdTQAogCiBjaGVja19QUk9HUkFNUyA9IFwKKyAgdGVzdHNlcmlhbGl6YXRpb24gXAogICB0ZXN0YXBwbGljYXRpb25leGNlcHRpb24gXAogICB0ZXN0Y29udGFpbmVydGVzdCBcCiAgIHRlc3R0cmFuc3BvcnRzb2NrZXQgXAorICB0ZXN0dHJhbnNwb3J0c3Nsc29ja2V0IFwKICAgdGVzdGJpbmFyeXByb3RvY29sIFwKKyAgdGVzdGNvbXBhY3Rwcm90b2NvbCBcCiAgIHRlc3RidWZmZXJlZHRyYW5zcG9ydCBcCiAgIHRlc3RmcmFtZWR0cmFuc3BvcnQgXAorICB0ZXN0ZmR0cmFuc3BvcnQgXAogICB0ZXN0bWVtb3J5YnVmZmVyIFwKICAgdGVzdHN0cnVjdCBcCiAgIHRlc3RzaW1wbGVzZXJ2ZXIgXApAQCAtNjEsNiArNjUsMTIgQEAKICAgY2hlY2tfUFJPR1JBTVMgKz0gdGVzdHRocmlmdHRlc3RjbGllbnQKIGVuZGlmCiAKK3Rlc3RzZXJpYWxpemF0aW9uX1NPVVJDRVMgPSB0ZXN0c2VyaWFsaXphdGlvbi5jCit0ZXN0c2VyaWFsaXphdGlvbl9MREFERCA9IFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9wcm90b2NvbC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfdHJhbnNwb3J0Lm8gXAorICAgIGxpYnRlc3RnZW5jLmxhCisKIHRlc3RhcHBsaWNhdGlvbmV4Y2VwdGlvbl9TT1VSQ0VTID0gdGVzdGFwcGxpY2F0aW9uZXhjZXB0aW9uLmMKIHRlc3RhcHBsaWNhdGlvbmV4Y2VwdGlvbl9MREFERCA9IFwKICAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24ubyBcCkBAIC05MSwxMCArMTAxLDMwIEBACiAgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQubyBcCiAgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlcl9zb2NrZXQubwogCisKK3Rlc3R0cmFuc3BvcnRzc2xzb2NrZXRfU09VUkNFUyA9IHRlc3R0cmFuc3BvcnRzc2xzb2NrZXQuYwordGVzdHRyYW5zcG9ydHNzbHNvY2tldF9MREFERCA9IFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfdHJhbnNwb3J0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zb2NrZXQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc2VydmVyX3NvY2tldC5vCisKKwogdGVzdGJpbmFyeXByb3RvY29sX1NPVVJDRVMgPSB0ZXN0YmluYXJ5cHJvdG9jb2wuYwogdGVzdGJpbmFyeXByb3RvY29sX0xEQUREID0gXAogICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3Byb3RvY29sLm8gXAogICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF90cmFuc3BvcnQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NvY2tldC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc2VydmVyX3NvY2tldC5vCisKK3Rlc3Rjb21wYWN0cHJvdG9jb2xfU09VUkNFUyA9IHRlc3Rjb21wYWN0cHJvdG9jb2wuYwordGVzdGNvbXBhY3Rwcm90b2NvbF9MREFERCA9IFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9wcm90b2NvbC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfdHJhbnNwb3J0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9mcmFtZWRfdHJhbnNwb3J0Lm8gXAogICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zb2NrZXQubyBcCiAgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQubyBcCiAgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlcl9zb2NrZXQubwpAQCAtMTEzLDYgKzE0MywxMSBAQAogICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0Lm8gXAogICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXJfc29ja2V0Lm8KIAordGVzdGZkdHJhbnNwb3J0X1NPVVJDRVMgPSB0ZXN0ZmR0cmFuc3BvcnQuYwordGVzdGZkdHJhbnNwb3J0X0xEQUREID0gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF90cmFuc3BvcnQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X2ZkX3RyYW5zcG9ydC5vCisKIHRlc3RtZW1vcnlidWZmZXJfU09VUkNFUyA9IHRlc3RtZW1vcnlidWZmZXIuYwogdGVzdG1lbW9yeWJ1ZmZlcl9MREFERCA9IFwKICAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfdHJhbnNwb3J0Lm8KQEAgLTE0Niw3ICsxODEsOSBAQAogICAgIGxpYnRlc3RnZW5jLmxhCiAKIHRlc3R0aHJpZnR0ZXN0X1NPVVJDRVMgPSB0ZXN0dGhyaWZ0dGVzdC5jCi10ZXN0dGhyaWZ0dGVzdF9MREFERCA9IGxpYnRlc3RnZW5jLmxhCit0ZXN0dGhyaWZ0dGVzdF9MREFERCA9IGxpYnRlc3RnZW5jLmxhIFwKKyAgICAkKHRvcF9idWlsZGRpcikvdGVzdC9jX2dsaWIvc3JjL3RocmlmdF90ZXN0X2hhbmRsZXIubwordGVzdHRocmlmdHRlc3RfQ0ZMQUdTID0gLUkkKHRvcF9zcmNkaXIpL3Rlc3QvY19nbGliL3NyYyAtSS4vZ2VuLWNfZ2xpYiAkKEdMSUJfQ0ZMQUdTKQogCiB0ZXN0dGhyaWZ0dGVzdGNsaWVudF9TT1VSQ0VTID0gdGVzdHRocmlmdHRlc3RjbGllbnQuY3BwCiB0ZXN0dGhyaWZ0dGVzdGNsaWVudF9DUFBGTEFHUyA9IC1JLi4vLi4vY3BwL3NyYyAkKEJPT1NUX0NQUEZMQUdTKSAtSS4vZ2VuLWNwcCAtSS4uL3NyYyAtSS4vZ2VuLWNfZ2xpYiAkKEdMSUJfQ0ZMQUdTKQpAQCAtMTYyLDYgKzE5OSw4IEBACiBub2Rpc3RfbGlidGVzdGdlbmNfbGFfU09VUkNFUyA9IFwKICAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfY29udGFpbmVyX3Rlc3RfdHlwZXMuYyBcCiAgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X2RlYnVnX3Byb3RvX3Rlc3RfdHlwZXMuYyBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X2VudW1fdGVzdF90eXBlcy5jIFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZW51bV90ZXN0X3NlcnZpY2UuYyBcCiAgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X2VtcHR5X3NlcnZpY2UuYyBcCiAgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X2luaGVyaXRlZC5jIFwKICAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfdGVzdF90eXBlcy5jIFwKQEAgLTE3NCw2ICsyMTMsOCBAQAogICAgICAgICBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdF90eXBlcy5jIFwKICAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfY29udGFpbmVyX3Rlc3RfdHlwZXMuaCBcCiAgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X2RlYnVnX3Byb3RvX3Rlc3RfdHlwZXMuaCBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X2VudW1fdGVzdF90eXBlcy5oIFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZW51bV90ZXN0X3NlcnZpY2UuaCBcCiAgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X2VtcHR5X3NlcnZpY2UuaCBcCiAgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X2luaGVyaXRlZC5oIFwKICAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfdGVzdF90eXBlcy5oIFwKQEAgLTE5NiwyMSArMjM3LDIyIEBACiAgICAgICAgIGdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5oCiBsaWJ0ZXN0Z2VuY3BwX2xhX0NQUEZMQUdTID0gLUkuLi8uLi9jcHAvc3JjICQoQk9PU1RfQ1BQRkxBR1MpIC1JLi9nZW4tY3BwCiAKLVRIUklGVCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0Ci0KLWdlbi1jX2dsaWIvdF90ZXN0X2NvbnRhaW5lcl90ZXN0X3R5cGVzLmMgZ2VuLWNfZ2xpYi90X3Rlc3RfY29udGFpbmVyX3Rlc3RfdHlwZXMuaCBnZW4tY19nbGliL3RfdGVzdF9jb250YWluZXJfc2VydmljZS5jIGdlbi1jX2dsaWIvdF90ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlLmg6IENvbnRhaW5lclRlc3QudGhyaWZ0CitnZW4tY19nbGliL3RfdGVzdF9jb250YWluZXJfdGVzdF90eXBlcy5jIGdlbi1jX2dsaWIvdF90ZXN0X2NvbnRhaW5lcl90ZXN0X3R5cGVzLmggZ2VuLWNfZ2xpYi90X3Rlc3RfY29udGFpbmVyX3NlcnZpY2UuYyBnZW4tY19nbGliL3RfdGVzdF9jb250YWluZXJfc2VydmljZS5oOiBDb250YWluZXJUZXN0LnRocmlmdCAkKFRIUklGVCkKIAkkKFRIUklGVCkgLS1nZW4gY19nbGliICQ8CiAKLWdlbi1jX2dsaWIvdF90ZXN0X2RlYnVnX3Byb3RvX3Rlc3RfdHlwZXMuYyBnZW4tY19nbGliL3RfdGVzdF9kZWJ1Z19wcm90b190ZXN0X3R5cGVzLmggZ2VuLWNfZ2xpYi90X3Rlc3RfZW1wdHlfc2VydmljZS5jIGdlbi1jX2dsaWIvdF90ZXN0X2VtcHR5X3NlcnZpY2UuaCBnZW4tY19nbGliL3RfdGVzdF9pbmhlcml0ZWQuYyBnZW4tY19nbGliL3RfdGVzdF9pbmhlcml0ZWQuaCBnZW4tY19nbGliL3RfdGVzdF9yZXZlcnNlX29yZGVyX3NlcnZpY2UuYyBnZW4tY19nbGliL3RfdGVzdF9yZXZlcnNlX29yZGVyX3NlcnZpY2UuaCBnZW4tY19nbGliL3RfdGVzdF9zZXJ2aWNlX2Zvcl9leGNlcHRpb25fd2l0aF9hX21hcC5jIGdlbi1jX2dsaWIvdF90ZXN0X3NlcnZpY2VfZm9yX2V4Y2VwdGlvbl93aXRoX2FfbWFwLmggZ2VuLWNfZ2xpYi90X3Rlc3Rfc3J2LmMgZ2VuLWNfZ2xpYi90X3Rlc3Rfc3J2Lmg6IC4uLy4uLy4uL3Rlc3QvRGVidWdQcm90b1Rlc3QudGhyaWZ0CitnZW4tY19nbGliL3RfdGVzdF9kZWJ1Z19wcm90b190ZXN0X3R5cGVzLmMgZ2VuLWNfZ2xpYi90X3Rlc3RfZGVidWdfcHJvdG9fdGVzdF90eXBlcy5oIGdlbi1jX2dsaWIvdF90ZXN0X2VtcHR5X3NlcnZpY2UuYyBnZW4tY19nbGliL3RfdGVzdF9lbXB0eV9zZXJ2aWNlLmggZ2VuLWNfZ2xpYi90X3Rlc3RfaW5oZXJpdGVkLmMgZ2VuLWNfZ2xpYi90X3Rlc3RfaW5oZXJpdGVkLmggZ2VuLWNfZ2xpYi90X3Rlc3RfcmV2ZXJzZV9vcmRlcl9zZXJ2aWNlLmMgZ2VuLWNfZ2xpYi90X3Rlc3RfcmV2ZXJzZV9vcmRlcl9zZXJ2aWNlLmggZ2VuLWNfZ2xpYi90X3Rlc3Rfc2VydmljZV9mb3JfZXhjZXB0aW9uX3dpdGhfYV9tYXAuYyBnZW4tY19nbGliL3RfdGVzdF9zZXJ2aWNlX2Zvcl9leGNlcHRpb25fd2l0aF9hX21hcC5oIGdlbi1jX2dsaWIvdF90ZXN0X3Nydi5jIGdlbi1jX2dsaWIvdF90ZXN0X3Nydi5oOiAuLi8uLi8uLi90ZXN0L0RlYnVnUHJvdG9UZXN0LnRocmlmdCAkKFRIUklGVCkKIAkkKFRIUklGVCkgLS1nZW4gY19nbGliICQ8CiAKLWdlbi1jX2dsaWIvdF90ZXN0X29wdGlvbmFsX3JlcXVpcmVkX3Rlc3RfdHlwZXMuYyBnZW4tY19nbGliL3RfdGVzdF9vcHRpb25hbF9yZXF1aXJlZF90ZXN0X3R5cGVzLmg6IC4uLy4uLy4uL3Rlc3QvT3B0aW9uYWxSZXF1aXJlZFRlc3QudGhyaWZ0CitnZW4tY19nbGliL3RfdGVzdF9lbnVtX3Rlc3RfdHlwZXMuYyBnZW4tY19nbGliL3RfdGVzdF9lbnVtX3Rlc3RfdHlwZXMuaCBnZW4tY19nbGliL3RfdGVzdF9lbnVtX3Rlc3Rfc2VydmljZS5jIGdlbi1jX2dsaWIvdF90ZXN0X2VudW1fdGVzdF9zZXJ2aWNlLmggOiAuLi8uLi8uLi90ZXN0L0VudW1UZXN0LnRocmlmdCAkKFRIUklGVCkKIAkkKFRIUklGVCkgLS1nZW4gY19nbGliICQ8CiAKLWdlbi1jX2dsaWIvdF90ZXN0X3NlY29uZF9zZXJ2aWNlLmMgZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3QuYyBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdF90eXBlcy5jIGdlbi1jX2dsaWIvdF90ZXN0X3NlY29uZF9zZXJ2aWNlLmggZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3QuaCBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdF90eXBlcy5oOiAuLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CitnZW4tY19nbGliL3RfdGVzdF9vcHRpb25hbF9yZXF1aXJlZF90ZXN0X3R5cGVzLmMgZ2VuLWNfZ2xpYi90X3Rlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfdGVzdF90eXBlcy5oOiAuLi8uLi8uLi90ZXN0L09wdGlvbmFsUmVxdWlyZWRUZXN0LnRocmlmdCAkKFRIUklGVCkKIAkkKFRIUklGVCkgLS1nZW4gY19nbGliICQ8CiAKLWdlbi1jcHAvVGhyaWZ0VGVzdC5jcHAgZ2VuLWNwcC9UaHJpZnRUZXN0X2NvbnN0YW50cy5jcHAgZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmNwcDogLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorZ2VuLWNfZ2xpYi90X3Rlc3Rfc2Vjb25kX3NlcnZpY2UuYyBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdC5jIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0X3R5cGVzLmMgZ2VuLWNfZ2xpYi90X3Rlc3Rfc2Vjb25kX3NlcnZpY2UuaCBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdC5oIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0X3R5cGVzLmg6IC4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQgJChUSFJJRlQpCisJJChUSFJJRlQpIC0tZ2VuIGNfZ2xpYiAkPAorCitnZW4tY3BwL1RocmlmdFRlc3QuY3BwIGdlbi1jcHAvVGhyaWZ0VGVzdF9jb25zdGFudHMuY3BwIGdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5jcHA6IC4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQgJChUSFJJRlQpCiAJJChUSFJJRlQpIC0tZ2VuIGNwcCAkPAogCiBURVNUUyA9IFwKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0YmluYXJ5cHJvdG9jb2wuYyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0YmluYXJ5cHJvdG9jb2wuYwppbmRleCBjZDY1NTAxLi4xNGY0ZmIwIDEwMDc1NQotLS0gYS9saWIvY19nbGliL3Rlc3QvdGVzdGJpbmFyeXByb3RvY29sLmMKKysrIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RiaW5hcnlwcm90b2NvbC5jCkBAIC0xOSwyMCArMTksMTUgQEAKIAogLyogRGlzYWJsZSBzdHJpbmctZnVuY3Rpb24gb3B0aW1pemF0aW9ucyB3aGVuIGdsaWJjIGlzIHVzZWQsIGFzIHRoZXNlIHByb2R1Y2UKICAgIGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IHN0cmluZyBsZW5ndGggd2hlbiBhIHN0cmluZyBmdW5jdGlvbiBpcyB1c2VkIGluc2lkZQotICAgYSBjYWxsIHRvIGFzc2VydCAoKSAqLwotI2lmICFkZWZpbmVkKF9fQVBQTEVfXykgJiYgIWRlZmluZWQoX19GcmVlQlNEX18pICYmIFwKLSAgICAhZGVmaW5lZChfX09wZW5CU0RfXykgJiYgIWRlZmluZWQoX19OZXRCU0RfXykKLSNpbmNsdWRlIDxmZWF0dXJlcy5oPgotI2VuZGlmCi0KKyAgIGEgY2FsbCB0byBnX2Fzc2VydCAoKSAqLwogI2lmZGVmIF9fR0xJQkNfXworI2luY2x1ZGUgPGZlYXR1cmVzLmg+CiAjZGVmaW5lIF9fTk9fU1RSSU5HX0lOTElORVMgMQogI2VuZGlmCiAKICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPG5ldGRiLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8c3lzL3dhaXQuaD4KQEAgLTQwLDEyICszNSwxMyBAQAogI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5oPgogI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuaD4KIAogI2RlZmluZSBURVNUX0JPT0wgVFJVRQogI2RlZmluZSBURVNUX0JZVEUgMTIzCiAjZGVmaW5lIFRFU1RfSTE2IDEyMzQ1CiAjZGVmaW5lIFRFU1RfSTMyIDEyMzQ1Njc4OTAKLSNkZWZpbmUgVEVTVF9JNjQgMTIzNDU2Nzg5MDEyMzQ1CisjZGVmaW5lIFRFU1RfSTY0IEdfR0lOVDY0X0NPTlNUQU5UICgxMjM0NTY3ODkwMTIzNDUpCiAjZGVmaW5lIFRFU1RfRE9VQkxFIDEyMzQ1Njc4OTAuMTIzCiAjZGVmaW5lIFRFU1RfU1RSSU5HICJ0aGlzIGlzIGEgdGVzdCBzdHJpbmcgMTIzNDU2Nzg5MCFAIyQlXiYqKCkiCiAjZGVmaW5lIFRFU1RfUE9SVCA1MTE5OQpAQCAtNTQsMTQgKzUwLDE0IEBACiBzdGF0aWMgaW50IHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMDsKIHN0YXRpYyBpbnQgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAtMTsKIGdpbnQzMgotbXlfdGhyaWZ0X3RyYW5zcG9ydF9yZWFkIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgZ3BvaW50ZXIgYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCitteV90aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgZ3BvaW50ZXIgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQogewogICBpZiAodHJhbnNwb3J0X3JlYWRfY291bnQgIT0gdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQKICAgICAgICYmIHRyYW5zcG9ydF9yZWFkX2Vycm9yID09IDApCiAgIHsKICAgICB0cmFuc3BvcnRfcmVhZF9jb3VudCsrOwotICAgIHJldHVybiB0aHJpZnRfdHJhbnNwb3J0X3JlYWQgKHRyYW5zcG9ydCwgYnVmLCBsZW4sIGVycm9yKTsKKyAgICByZXR1cm4gdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbCAodHJhbnNwb3J0LCBidWYsIGxlbiwgZXJyb3IpOwogICB9CiAgIHJldHVybiAtMTsKIH0KQEAgLTgyLDE0ICs3OCwxNSBAQAogICByZXR1cm4gRkFMU0U7CiB9CiAKLSNkZWZpbmUgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkIG15X3RocmlmdF90cmFuc3BvcnRfcmVhZAorI2RlZmluZSB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsIG15X3RocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwKICNkZWZpbmUgdGhyaWZ0X3RyYW5zcG9ydF93cml0ZSBteV90aHJpZnRfdHJhbnNwb3J0X3dyaXRlCiAjaW5jbHVkZSAiLi4vc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5jIgotI3VuZGVmIHRocmlmdF90cmFuc3BvcnRfcmVhZAorI3VuZGVmIHRocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwKICN1bmRlZiB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlCiAKIHN0YXRpYyB2b2lkIHRocmlmdF9zZXJ2ZXJfcHJpbWl0aXZlcyAoY29uc3QgaW50IHBvcnQpOwogc3RhdGljIHZvaWQgdGhyaWZ0X3NlcnZlcl9jb21wbGV4X3R5cGVzIChjb25zdCBpbnQgcG9ydCk7CitzdGF0aWMgdm9pZCB0aHJpZnRfc2VydmVyX21hbnlfZnJhbWVzIChjb25zdCBpbnQgcG9ydCk7CiAKIHN0YXRpYyB2b2lkCiB0ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveSh2b2lkKQpAQCAtOTgsNyArOTUsNyBAQAogCiAgIC8qIGNyZWF0ZSBhbiBvYmplY3QgYW5kIHRoZW4gZGVzdHJveSBpdCAqLwogICBvYmplY3QgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCwgTlVMTCk7Ci0gIGFzc2VydCAob2JqZWN0ICE9IE5VTEwpOworICBnX2Fzc2VydCAob2JqZWN0ICE9IE5VTEwpOwogICBnX29iamVjdF91bnJlZiAob2JqZWN0KTsKIH0KIApAQCAtMTEyLDExICsxMDksMTEgQEAKICAgLyogY3JlYXRlIGEgVGhyaWZ0VHJhbnNwb3J0ICovCiAgIHRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgNTExODgsIE5VTEwpOwotICBhc3NlcnQgKHRzb2NrZXQgIT0gTlVMTCk7CisgIGdfYXNzZXJ0ICh0c29ja2V0ICE9IE5VTEwpOwogICAvKiBjcmVhdGUgYSBUaHJpZnRCaW5hcnlQcm90b2NvbCB1c2luZyB0aGUgVHJhbnNwb3J0ICovCiAgIHByb3RvY29sID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wsICJ0cmFuc3BvcnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHNvY2tldCwgTlVMTCk7Ci0gIGFzc2VydCAocHJvdG9jb2wgIT0gTlVMTCk7CisgIGdfYXNzZXJ0IChwcm90b2NvbCAhPSBOVUxMKTsKICAgLyogZmV0Y2ggdGhlIHByb3BlcnRpZXMgKi8KICAgZ19vYmplY3RfZ2V0IChHX09CSkVDVChwcm90b2NvbCksICJ0cmFuc3BvcnQiLCAmdGVtcCwgTlVMTCk7CiAgIGdfb2JqZWN0X3VucmVmICh0ZW1wKTsKQEAgLTE0MSw3ICsxMzgsNyBAQAogCiAgIC8qIGZvcmsgYSBzZXJ2ZXIgZnJvbSB0aGUgY2xpZW50ICovCiAgIHBpZCA9IGZvcmsgKCk7Ci0gIGFzc2VydCAocGlkID49IDApOworICBnX2Fzc2VydCAocGlkID49IDApOwogCiAgIGlmIChwaWQgPT0gMCkKICAgewpAQCAtMTU3LDQ3ICsxNTQsNDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOwogICAgIHRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpOwogICAgIHRocmlmdF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKTsKLSAgICBhc3NlcnQgKHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAodHJhbnNwb3J0KSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAodHJhbnNwb3J0KSk7CiAKICAgICAvKiBjcmVhdGUgYSBUaHJpZnRCaW5hcnlUcmFuc3BvcnQgKi8KICAgICB0YiA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MLCAidHJhbnNwb3J0IiwKICAgICAgICAgICAgICAgICAgICAgICAgdHNvY2tldCwgTlVMTCk7CiAgICAgcHJvdG9jb2wgPSBUSFJJRlRfUFJPVE9DT0wgKHRiKTsKLSAgICBhc3NlcnQgKHByb3RvY29sICE9IE5VTEwpOworICAgIGdfYXNzZXJ0IChwcm90b2NvbCAhPSBOVUxMKTsKIAogICAgIC8qIHdyaXRlIGEgYnVuY2ggb2YgcHJpbWl0aXZlcyAqLwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9ib29sIChwcm90b2NvbCwgVEVTVF9CT09MLCBOVUxMKSA+IDApOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgVEVTVF9CWVRFLCBOVUxMKSA+IDApOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pMTYgKHByb3RvY29sLCBURVNUX0kxNiwgTlVMTCkgPiAwKTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgVEVTVF9JMzIsIE5VTEwpID4gMCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2k2NCAocHJvdG9jb2wsIFRFU1RfSTY0LCBOVUxMKSA+IDApOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9kb3VibGUgKHByb3RvY29sLCAKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9ib29sIChwcm90b2NvbCwgVEVTVF9CT09MLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCBURVNUX0JZVEUsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTE2IChwcm90b2NvbCwgVEVTVF9JMTYsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgVEVTVF9JMzIsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTY0IChwcm90b2NvbCwgVEVTVF9JNjQsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZG91YmxlIChwcm90b2NvbCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVTVF9ET1VCTEUsIE5VTEwpID4gMCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3N0cmluZyAocHJvdG9jb2wsCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc3RyaW5nIChwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURVNUX1NUUklORywgTlVMTCkgPiAwKTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgYmluYXJ5LCAKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zdHJpbmcgKHByb3RvY29sLCAiIiwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCBiaW5hcnksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgTlVMTCkgPiAwKTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgTlVMTCwgMCwgTlVMTCkgPiAwKTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgYmluYXJ5LAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIE5VTEwsIDAsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgYmluYXJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgTlVMTCkgPiAwKTsKIAogICAgIC8qIHRlc3Qgd3JpdGUgZXJyb3JzICovCiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIFRFU1RfQllURSwgCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIFRFU1RfQllURSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IC0xKTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTE2IChwcm90b2NvbCwgVEVTVF9JMTYsIE5VTEwpID09IC0xKTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgVEVTVF9JMzIsIE5VTEwpID09IC0xKTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTY0IChwcm90b2NvbCwgVEVTVF9JNjQsIE5VTEwpID09IC0xKTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZG91YmxlIChwcm90b2NvbCwgVEVTVF9ET1VCTEUsCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTE2IChwcm90b2NvbCwgVEVTVF9JMTYsIE5VTEwpID09IC0xKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCBURVNUX0kzMiwgTlVMTCkgPT0gLTEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2k2NCAocHJvdG9jb2wsIFRFU1RfSTY0LCBOVUxMKSA9PSAtMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZG91YmxlIChwcm90b2NvbCwgVEVTVF9ET1VCTEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPT0gLTEpOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCBiaW5hcnksIGxlbiwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCBiaW5hcnksIGxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA9PSAtMSk7CiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMDsKIAogICAgIC8qIHRlc3QgYmluYXJ5IHBhcnRpYWwgZmFpbHVyZSAqLwogICAgIHRyYW5zcG9ydF93cml0ZV9jb3VudCA9IDA7CiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gMTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgYmluYXJ5LAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIGJpbmFyeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIE5VTEwpID09IC0xKTsKICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAtMTsKIApAQCAtMjA1LDggKzIwMyw4IEBACiAgICAgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKICAgICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7CiAgICAgZ19vYmplY3RfdW5yZWYgKHByb3RvY29sKTsKLSAgICBhc3NlcnQgKHdhaXQgKCZzdGF0dXMpID09IHBpZCk7Ci0gICAgYXNzZXJ0IChzdGF0dXMgPT0gMCk7CisgICAgZ19hc3NlcnQgKHdhaXQgKCZzdGF0dXMpID09IHBpZCk7CisgICAgZ19hc3NlcnQgKHN0YXR1cyA9PSAwKTsKICAgfQogfQogCkBAIC0yMjMsNyArMjIxLDcgQEAKIAogICAvKiBmb3JrIGEgc2VydmVyIGZyb20gdGhlIGNsaWVudCAqLwogICBwaWQgPSBmb3JrICgpOwotICBhc3NlcnQgKHBpZCA+PSAwKTsKKyAgZ19hc3NlcnQgKHBpZCA+PSAwKTsKIAogICBpZiAocGlkID09IDApCiAgIHsKQEAgLTIzOSwzMyArMjM3LDMzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKICAgICB0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KTsKICAgICB0aHJpZnRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW4gKHRyYW5zcG9ydCkpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW4gKHRyYW5zcG9ydCkpOwogCiAgICAgLyogY3JlYXRlIGEgVGhyaWZ0QmluYXJ5VHJhbnNwb3J0ICovCiAgICAgdGIgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCwgInRyYW5zcG9ydCIsCiAgICAgICAgICAgICAgICAgICAgICAgIHRzb2NrZXQsIE5VTEwpOwogICAgIHByb3RvY29sID0gVEhSSUZUX1BST1RPQ09MICh0Yik7Ci0gICAgYXNzZXJ0IChwcm90b2NvbCAhPSBOVUxMKTsKKyAgICBnX2Fzc2VydCAocHJvdG9jb2wgIT0gTlVMTCk7CiAKICAgICAvKiB0ZXN0IHN0cnVjdHVyZXMgKi8KLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2JlZ2luIChwcm90b2NvbCwgCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2JlZ2luIChwcm90b2NvbCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCkgPT0gMCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CiAKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsIFRfVk9JRCwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwgVF9WT0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPiAwKTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CiAKICAgICAvKiB0ZXN0IHdyaXRlIGVycm9yICovCiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsIFRfVk9JRCwgCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsIFRfVk9JRCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA9PSAtMSk7CiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMDsKIAogICAgIC8qIHRlc3QgMm5kIHdyaXRlIGVycm9yICovCiAgICAgdHJhbnNwb3J0X3dyaXRlX2NvdW50ID0gMDsKICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAxOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwgVF9WT0lELAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLCBUX1ZPSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA9PSAtMSk7CiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gLTE7CiAKQEAgLTI3MywxMiArMjcxLDEyIEBACiAgICAgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgVF9WT0lELCBOVUxMKTsKIAogICAgIC8qIHRlc3Qgd3JpdGVfZmllbGRfc3RvcCAqLwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9maWVsZF9zdG9wIChwcm90b2NvbCwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9maWVsZF9zdG9wIChwcm90b2NvbCwgTlVMTCkgPiAwKTsKIAogICAgIC8qIHdyaXRlIGEgbWFwICovCi0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21hcF9iZWdpbiAocHJvdG9jb2wsIFRfVk9JRCwgVF9WT0lELAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21hcF9iZWdpbiAocHJvdG9jb2wsIFRfVk9JRCwgVF9WT0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID4gMCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21hcF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tYXBfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CiAKICAgICAvKiB0ZXN0IDJuZCByZWFkIGZhaWx1cmUgb24gYSBtYXAgKi8KICAgICB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCBUX1ZPSUQsIE5VTEwpOwpAQCAtMjg5LDIxICsyODcsMjEgQEAKIAogICAgIC8qIHRlc3QgMXN0IHdyaXRlIGZhaWx1cmUgb24gYSBtYXAgKi8KICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAxOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tYXBfYmVnaW4gKHByb3RvY29sLCBUX1ZPSUQsIFRfVk9JRCwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tYXBfYmVnaW4gKHByb3RvY29sLCBUX1ZPSUQsIFRfVk9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA9PSAtMSk7CiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMDsKIAogICAgIC8qIHRlc3QgMm5kIHdyaXRlIGZhaWx1cmUgb24gYSBtYXAgKi8KICAgICB0cmFuc3BvcnRfd3JpdGVfY291bnQgPSAwOwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IDE7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21hcF9iZWdpbiAocHJvdG9jb2wsIFRfVk9JRCwgVF9WT0lELAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21hcF9iZWdpbiAocHJvdG9jb2wsIFRfVk9JRCwgVF9WT0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID09IC0xKTsKICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAtMTsKIAogICAgIC8qIHRlc3QgM3JkIHdyaXRlIGZhaWx1cmUgb24gYSBtYXAgKi8KICAgICB0cmFuc3BvcnRfd3JpdGVfY291bnQgPSAwOwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IDI7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21hcF9iZWdpbiAocHJvdG9jb2wsIFRfVk9JRCwgVF9WT0lELAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21hcF9iZWdpbiAocHJvdG9jb2wsIFRfVk9JRCwgVF9WT0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID09IC0xKTsKICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAtMTsKIApAQCAtMzEzLDkgKzMxMSw5IEBACiAgICAgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCAtMTAsIE5VTEwpOwogCiAgICAgLyogdGVzdCBsaXN0IG9wZXJhdGlvbnMgKi8KLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbGlzdF9iZWdpbiAocHJvdG9jb2wsIFRfVk9JRCwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9saXN0X2JlZ2luIChwcm90b2NvbCwgVF9WT0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA+IDApOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9saXN0X2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2xpc3RfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CiAKICAgICAvKiB0ZXN0IDJuZCByZWFkIGZhaWx1cmUgb24gYSBsaXN0ICovCiAgICAgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgVF9WT0lELCBOVUxMKTsKQEAgLTMyNiwyNyArMzI0LDI3IEBACiAKICAgICAvKiB0ZXN0IGZpcnN0IHdyaXRlIGVycm9yIG9uIGEgbGlzdCAqLwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDE7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2xpc3RfYmVnaW4gKHByb3RvY29sLCBUX1ZPSUQsCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbGlzdF9iZWdpbiAocHJvdG9jb2wsIFRfVk9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPT0gLTEpOwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDA7CiAKICAgICAvKiB0ZXN0IDJuZCB3cml0ZSBlcnJvciBvbiBhIGxpc3QgKi8KICAgICB0cmFuc3BvcnRfd3JpdGVfY291bnQgPSAwOwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IDE7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2xpc3RfYmVnaW4gKHByb3RvY29sLCBUX1ZPSUQsCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbGlzdF9iZWdpbiAocHJvdG9jb2wsIFRfVk9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPT0gLTEpOwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IC0xOwogCiAgICAgLyogdGVzdCBzZXQgb3BlcmF0aW9uIHMqLwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zZXRfYmVnaW4gKHByb3RvY29sLCBUX1ZPSUQsCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc2V0X2JlZ2luIChwcm90b2NvbCwgVF9WT0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID4gMCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3NldF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zZXRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CiAKICAgICAvKiBpbnZhbGlkIHZlcnNpb24gKi8KLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgLTEsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgLTEsIE5VTEwpID4gMCk7CiAKICAgICAvKiBzeiA+IDAgZm9yIGEgbWVzc2FnZSAqLwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCAxLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIDEsIE5VTEwpID4gMCk7CiAKICAgICAvKiBzZW5kIGEgdmFsaWQgbWVzc2FnZSAqLwogICAgIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgMHg4MDAxMDAwMCwgTlVMTCk7CkBAIC0zNjEsMjYgKzM1OSwyNiBAQAogICAgIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc3RyaW5nIChwcm90b2NvbCwgInRlc3QiLCBOVUxMKTsKIAogICAgIC8qIHNlbmQgYSB2YWxpZCBtZXNzYWdlICovCi0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9DQUxMLCAxLCBOVUxMKSA+IDApOwogCi0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKIAogICAgIC8qIHNlbmQgYnJva2VuIHdyaXRlcyAqLwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDE7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9DQUxMLCAxLCBOVUxMKSA9PSAtMSk7CiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMDsKIAogICAgIHRyYW5zcG9ydF93cml0ZV9jb3VudCA9IDA7CiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gMjsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0NBTEwsIDEsIE5VTEwpID09IC0xKTsKICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAtMTsKIAogICAgIHRyYW5zcG9ydF93cml0ZV9jb3VudCA9IDA7CiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gMzsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0NBTEwsIDEsIE5VTEwpID09IC0xKTsKICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAtMTsKIApAQCAtMzg4LDggKzM4Niw5NSBAQAogICAgIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CiAgICAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOwogICAgIGdfb2JqZWN0X3VucmVmIChwcm90b2NvbCk7Ci0gICAgYXNzZXJ0ICh3YWl0ICgmc3RhdHVzKSA9PSBwaWQpOwotICAgIGFzc2VydCAoc3RhdHVzID09IDApOworICAgIGdfYXNzZXJ0ICh3YWl0ICgmc3RhdHVzKSA9PSBwaWQpOworICAgIGdfYXNzZXJ0IChzdGF0dXMgPT0gMCk7CisgIH0KK30KKworc3RhdGljIHZvaWQKK3Rlc3RfcmVhZF9hbmRfd3JpdGVfbWFueV9mcmFtZXMgKHZvaWQpCit7CisgIGludCBzdGF0dXM7CisgIHBpZF90IHBpZDsKKyAgVGhyaWZ0U29ja2V0ICp0c29ja2V0ID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICBUaHJpZnRGcmFtZWRUcmFuc3BvcnQgKmZ0ID0gTlVMTDsKKyAgVGhyaWZ0QmluYXJ5UHJvdG9jb2wgKnRiID0gTlVMTDsKKyAgVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sID0gTlVMTDsKKyAgZ3BvaW50ZXIgYmluYXJ5ID0gKGdwb2ludGVyICopIFRFU1RfU1RSSU5HOworICBjb25zdCBndWludDMyIGxlbiA9IHN0cmxlbiAoVEVTVF9TVFJJTkcpOworICBpbnQgcG9ydCA9IFRFU1RfUE9SVDsKKworICAvKiBmb3JrIGEgc2VydmVyIGZyb20gdGhlIGNsaWVudCAqLworICBwaWQgPSBmb3JrICgpOworICBnX2Fzc2VydCAocGlkID49IDApOworCisgIGlmIChwaWQgPT0gMCkKKyAgeworICAgIC8qIGNoaWxkIGxpc3RlbnMgKi8KKyAgICB0aHJpZnRfc2VydmVyX21hbnlfZnJhbWVzIChwb3J0KTsKKyAgICBleGl0ICgwKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBwYXJlbnQuICB3YWl0IGEgYml0IGZvciB0aGUgc29ja2V0IHRvIGJlIGNyZWF0ZWQuICovCisgICAgc2xlZXAgKDEpOworCisgICAgLyogY3JlYXRlIGEgVGhyaWZ0U29ja2V0ICovCisgICAgdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0c29ja2V0ICE9IE5VTEwpOworICAgIHRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpOworCisgICAgLyogd3JhcCBpbiBhIGZyYW1lZCB0cmFuc3BvcnQgKi8KKyAgICBmdCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCwgInRyYW5zcG9ydCIsIHRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIndfYnVmX3NpemUiLCAxLCBOVUxMKTsKKyAgICBnX2Fzc2VydCAoZnQgIT0gTlVMTCk7CisgICAgdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAoZnQpOworCisgICAgdGhyaWZ0X3RyYW5zcG9ydF9vcGVuICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW4gKHRyYW5zcG9ydCkpOworCisgICAgLyogY3JlYXRlIGEgYmluYXJ5IHByb3RvY29sICovCisgICAgdGIgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCwgInRyYW5zcG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydCwgTlVMTCk7CisgICAgcHJvdG9jb2wgPSBUSFJJRlRfUFJPVE9DT0wgKHRiKTsKKyAgICBnX2Fzc2VydCAocHJvdG9jb2wgIT0gTlVMTCk7CisKKyAgICAvKiB3cml0ZSBhIGJ1bmNoIG9mIHByaW1pdGl2ZXMgKi8KKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9ib29sIChwcm90b2NvbCwgVEVTVF9CT09MLCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIFRFU1RfQllURSwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kxNiAocHJvdG9jb2wsIFRFU1RfSTE2LCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgVEVTVF9JMzIsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pNjQgKHByb3RvY29sLCBURVNUX0k2NCwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2RvdWJsZSAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVTVF9ET1VCTEUsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zdHJpbmcgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFU1RfU1RSSU5HLCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc3RyaW5nIChwcm90b2NvbCwgIiIsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCBiaW5hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgTlVMTCwgMCwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIGJpbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKworICAgIC8qIGNsZWFuIHVwICovCisgICAgdGhyaWZ0X3RyYW5zcG9ydF93cml0ZV9lbmQgKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX29iamVjdF91bnJlZiAoZnQpOworICAgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKKyAgICBnX29iamVjdF91bnJlZiAodGIpOworICAgIGdfYXNzZXJ0ICh3YWl0ICgmc3RhdHVzKSA9PSBwaWQpOworICAgIGdfYXNzZXJ0IChzdGF0dXMgPT0gMCk7CiAgIH0KIH0KIApAQCAtNDA4LDYgKzQ5Myw3IEBACiAgIGdpbnQ2NCB2YWx1ZV82NCA9IDA7CiAgIGdkb3VibGUgdmFsdWVfZG91YmxlID0gMDsKICAgZ2NoYXIgKnN0cmluZyA9IE5VTEw7CisgIGdjaGFyICplbXB0eV9zdHJpbmcgPSBOVUxMOwogICBncG9pbnRlciBiaW5hcnkgPSBOVUxMOwogICBndWludDMyIGxlbiA9IDA7CiAgIHZvaWQgKmNvbXBhcmF0b3IgPSAodm9pZCAqKSBURVNUX1NUUklORzsKQEAgLTQxNyw2MSArNTAzLDY4IEBACiAgIHRyYW5zcG9ydCA9IFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUICh0c29ja2V0KTsKICAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfbGlzdGVuICh0cmFuc3BvcnQsIE5VTEwpOwogICBjbGllbnQgPSB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKHRyYW5zcG9ydCwgTlVMTCk7Ci0gIGFzc2VydCAoY2xpZW50ICE9IE5VTEwpOworICBnX2Fzc2VydCAoY2xpZW50ICE9IE5VTEwpOwogCiAgIHRicCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MLCAidHJhbnNwb3J0IiwKICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQsIE5VTEwpOwogICBwcm90b2NvbCA9IFRIUklGVF9QUk9UT0NPTCAodGJwKTsKIAotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9ib29sIChwcm90b2NvbCwKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9ib29sIChwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2Jvb2xlYW4sIE5VTEwpID4gMCk7Ci0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmdmFsdWVfYnl0ZSwgTlVMTCkgPiAwKTsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTE2IChwcm90b2NvbCwgJnZhbHVlXzE2LCBOVUxMKSA+IDApOwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmdmFsdWVfMzIsIE5VTEwpID4gMCk7Ci0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2k2NCAocHJvdG9jb2wsICZ2YWx1ZV82NCwgTlVMTCkgPiAwKTsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfZG91YmxlIChwcm90b2NvbCwKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnZhbHVlX2J5dGUsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTE2IChwcm90b2NvbCwgJnZhbHVlXzE2LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICZ2YWx1ZV8zMiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pNjQgKHByb3RvY29sLCAmdmFsdWVfNjQsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfZG91YmxlIChwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfZG91YmxlLCBOVUxMKSA+IDApOwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9zdHJpbmcgKHByb3RvY29sLCAmc3RyaW5nLCBOVUxMKSA+IDApOwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKHByb3RvY29sLCAmYmluYXJ5LAorICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX3N0cmluZyAocHJvdG9jb2wsICZzdHJpbmcsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfc3RyaW5nIChwcm90b2NvbCwgJmVtcHR5X3N0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2JpbmFyeSAocHJvdG9jb2wsICZiaW5hcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbiwgTlVMTCkgPiAwKTsKIAotICBhc3NlcnQgKHZhbHVlX2Jvb2xlYW4gPT0gVEVTVF9CT09MKTsKLSAgYXNzZXJ0ICh2YWx1ZV9ieXRlID0gVEVTVF9CWVRFKTsKLSAgYXNzZXJ0ICh2YWx1ZV8xNiA9IFRFU1RfSTE2KTsKLSAgYXNzZXJ0ICh2YWx1ZV8zMiA9IFRFU1RfSTMyKTsKLSAgYXNzZXJ0ICh2YWx1ZV82NCA9IFRFU1RfSTY0KTsKLSAgYXNzZXJ0ICh2YWx1ZV9kb3VibGUgPSBURVNUX0RPVUJMRSk7Ci0gIGFzc2VydCAoc3RyY21wIChURVNUX1NUUklORywgc3RyaW5nKSA9PSAwKTsKLSAgYXNzZXJ0IChtZW1jbXAgKGNvbXBhcmF0b3IsIGJpbmFyeSwgbGVuKSA9PSAwKTsKKyAgZ19hc3NlcnQgKHZhbHVlX2Jvb2xlYW4gPT0gVEVTVF9CT09MKTsKKyAgZ19hc3NlcnQgKHZhbHVlX2J5dGUgPT0gVEVTVF9CWVRFKTsKKyAgZ19hc3NlcnQgKHZhbHVlXzE2ID09IFRFU1RfSTE2KTsKKyAgZ19hc3NlcnQgKHZhbHVlXzMyID09IFRFU1RfSTMyKTsKKyAgZ19hc3NlcnQgKHZhbHVlXzY0ID09IFRFU1RfSTY0KTsKKyAgZ19hc3NlcnQgKHZhbHVlX2RvdWJsZSA9PSBURVNUX0RPVUJMRSk7CisgIGdfYXNzZXJ0IChzdHJjbXAgKFRFU1RfU1RSSU5HLCBzdHJpbmcpID09IDApOworICBnX2Fzc2VydCAoc3RyY21wICgiIiwgZW1wdHlfc3RyaW5nKSA9PSAwKTsKKyAgZ19hc3NlcnQgKG1lbWNtcCAoY29tcGFyYXRvciwgYmluYXJ5LCBsZW4pID09IDApOwogCiAgIGdfZnJlZSAoc3RyaW5nKTsKKyAgZ19mcmVlIChlbXB0eV9zdHJpbmcpOwogICBnX2ZyZWUgKGJpbmFyeSk7CiAKLSAgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2JpbmFyeSAocHJvdG9jb2wsICZiaW5hcnksICZsZW4sIE5VTEwpOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2JpbmFyeSAocHJvdG9jb2wsICZiaW5hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKGJpbmFyeSA9PSBOVUxMKTsKKyAgZ19hc3NlcnQgKGxlbiA9PSAwKTsKICAgZ19mcmVlIChiaW5hcnkpOwogCiAgIHRyYW5zcG9ydF9yZWFkX2NvdW50ID0gMDsKICAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAwOwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKHByb3RvY29sLCAmYmluYXJ5LAorICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2JpbmFyeSAocHJvdG9jb2wsICZiaW5hcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbiwgTlVMTCkgPT0gLTEpOwogICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IC0xOwogCiAgIHRyYW5zcG9ydF9yZWFkX2NvdW50ID0gMDsKICAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAxOwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKHByb3RvY29sLCAmYmluYXJ5LAorICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2JpbmFyeSAocHJvdG9jb2wsICZiaW5hcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbiwgTlVMTCkgPT0gLTEpOwogICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IC0xOwogCiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMTsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYm9vbCAocHJvdG9jb2wsCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYm9vbCAocHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9ib29sZWFuLCBOVUxMKSA9PSAtMSk7Ci0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLAorICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfYnl0ZSwgTlVMTCkgPT0gLTEpOwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pMTYgKHByb3RvY29sLAorICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2kxNiAocHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlXzE2LCBOVUxMKSA9PSAtMSk7Ci0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICZ2YWx1ZV8zMiwgTlVMTCkgPT0gLTEpOwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pNjQgKHByb3RvY29sLCAmdmFsdWVfNjQsIE5VTEwpID09IC0xKTsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfZG91YmxlIChwcm90b2NvbCwKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmdmFsdWVfMzIsIE5VTEwpID09IC0xKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pNjQgKHByb3RvY29sLCAmdmFsdWVfNjQsIE5VTEwpID09IC0xKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9kb3VibGUgKHByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9kb3VibGUsIE5VTEwpID09IC0xKTsKICAgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPSAwOwogCkBAIC01MDksNyArNjAyLDcgQEAKICAgdHJhbnNwb3J0ID0gVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlQgKHRzb2NrZXQpOwogICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKHRyYW5zcG9ydCwgTlVMTCk7CiAgIGNsaWVudCA9IHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAodHJhbnNwb3J0LCBOVUxMKTsKLSAgYXNzZXJ0IChjbGllbnQgIT0gTlVMTCk7CisgIGdfYXNzZXJ0IChjbGllbnQgIT0gTlVMTCk7CiAKICAgdGJwID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wsICJ0cmFuc3BvcnQiLAogICAgICAgICAgICAgICAgICAgICAgIGNsaWVudCwgTlVMTCk7CkBAIC01MjQsNyArNjE3LDcgQEAKIAogICAvKiB0ZXN0IGZpcnN0IHJlYWQgZXJyb3Igb24gYSBmaWVsZCAqLwogICB0cmFuc3BvcnRfcmVhZF9lcnJvciA9IDE7Ci0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfbmFtZSwgJmZpZWxkX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID09IC0xKTsKICAgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPSAwOwpAQCAtNTM1LDcgKzYyOCw3IEBACiAgIC8qIHRlc3QgMm5kIHJlYWQgZmFpbHVyZSBvbiBhIGZpZWxkICovCiAgIHRyYW5zcG9ydF9yZWFkX2NvdW50ID0gMDsKICAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAxOwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX25hbWUsICZmaWVsZF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA9PSAtMSk7CiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gLTE7CkBAIC01NTEsNyArNjQ0LDcgQEAKICAgLyogdGVzdCByZWFkIGZhaWx1cmUgb24gYSBtYXAgKi8KICAgdHJhbnNwb3J0X3JlYWRfY291bnQgPSAwOwogICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IDA7Ci0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21hcF9iZWdpbiAocHJvdG9jb2wsCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWFwX2JlZ2luIChwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5X3R5cGUsICZ2YWx1ZV90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLCBOVUxMKSA9PSAtMSk7CiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gLTE7CkBAIC01NTksNyArNjUyLDcgQEAKICAgLyogdGVzdCAybmQgcmVhZCBmYWlsdXJlIG9uIGEgbWFwICovCiAgIHRyYW5zcG9ydF9yZWFkX2NvdW50ID0gMDsKICAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAxOwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tYXBfYmVnaW4gKHByb3RvY29sLAorICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21hcF9iZWdpbiAocHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleV90eXBlLCAmdmFsdWVfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwgTlVMTCkgPT0gLTEpOwogICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IC0xOwpAQCAtNTY3LDcgKzY2MCw3IEBACiAgIC8qIHRlc3QgM3JkIHJlYWQgZmFpbHVyZSBvbiBhIG1hcCAqLwogICB0cmFuc3BvcnRfcmVhZF9jb3VudCA9IDA7CiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gMjsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWFwX2JlZ2luIChwcm90b2NvbCwKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tYXBfYmVnaW4gKHByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlfdHlwZSwgJnZhbHVlX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsIE5VTEwpID09IC0xKTsKICAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAtMTsKQEAgLTU4MCw3ICs2NzMsNyBAQAogICB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ2YWx1ZSwgTlVMTCk7CiAKICAgLyogdGVzdCBuZWdhdGl2ZSBtYXAgc2l6ZSAqLwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tYXBfYmVnaW4gKHByb3RvY29sLAorICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21hcF9iZWdpbiAocHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleV90eXBlLCAmdmFsdWVfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwgTlVMTCkgPT0gLTEpOwogCkBAIC01OTAsNyArNjgzLDcgQEAKIAogICAvKiB0ZXN0IHJlYWQgZmFpbHVyZSAqLwogICB0cmFuc3BvcnRfcmVhZF9lcnJvciA9IDE7Ci0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2xpc3RfYmVnaW4gKHByb3RvY29sLCAmZWxlbWVudF90eXBlLAorICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2xpc3RfYmVnaW4gKHByb3RvY29sLCAmZWxlbWVudF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwgTlVMTCkgPT0gLTEpOwogICB0cmFuc3BvcnRfcmVhZF9lcnJvciA9IDA7CiAKQEAgLTYxMiwyMyArNzA1LDIzIEBACiAKICAgLyogYnJva2VuIHJlYWQgKi8KICAgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPSAxOwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lc3NhZ2VfdHlwZSwgJnNlcWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA9PSAtMSk7CiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMDsKIAogICAvKiBpbnZhbGlkIHByb3RvY29sIHZlcnNpb24gKi8KLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlX3R5cGUsICZzZXFpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPT0gLTEpOwogCiAgIC8qIHN6ID4gMCAqLwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lc3NhZ2VfdHlwZSwgJnNlcWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA+IDApOwogCiAgIC8qIHJlYWQgYSB2YWxpZCBtZXNzYWdlICovCi0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLAorICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZV90eXBlLCAmc2VxaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID4gMCk7CiAgIGdfZnJlZSAobWVzc2FnZV9uYW1lKTsKQEAgLTYzNiw3ICs3MjksNyBAQAogICAvKiBicm9rZW4gMm5kIHJlYWQgb24gYSBtZXNzYWdlICovCiAgIHRyYW5zcG9ydF9yZWFkX2NvdW50ID0gMDsKICAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAxOwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lc3NhZ2VfdHlwZSwgJnNlcWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA9PSAtMSk7CiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gLTE7CkBAIC02NDQsMTkgKzczNywxOSBAQAogICAvKiBicm9rZW4gM3JkIHJlYWQgb24gYSBtZXNzYWdlICovCiAgIHRyYW5zcG9ydF9yZWFkX2NvdW50ID0gMDsKICAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAzOyAvKiByZWFkX3N0cmluZyBkb2VzIHR3byByZWFkcyAqLwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lc3NhZ2VfdHlwZSwgJnNlcWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA9PSAtMSk7CiAgIGdfZnJlZSAobWVzc2FnZV9uYW1lKTsKICAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAtMTsKIAogICAvKiByZWFkIGEgdmFsaWQgbWVzc2FnZSAqLwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lc3NhZ2VfdHlwZSwgJnNlcWlkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPiAwKTsKICAgZ19mcmVlIChtZXNzYWdlX25hbWUpOwogCi0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21lc3NhZ2VfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKIAogICAvKiBoYW5kbGUgMm5kIHdyaXRlIGZhaWx1cmUgb24gYSBtZXNzYWdlICovCiAgIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmdmVyc2lvbiwgTlVMTCk7CkBAIC02NzAsNiArNzYzLDgyIEBACiAgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKIH0KIAorc3RhdGljIHZvaWQKK3RocmlmdF9zZXJ2ZXJfbWFueV9mcmFtZXMgKGNvbnN0IGludCBwb3J0KQoreworICBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCAqY2xpZW50ID0gTlVMTDsKKyAgVGhyaWZ0QmluYXJ5UHJvdG9jb2wgKnRicCA9IE5VTEw7CisgIFRocmlmdFByb3RvY29sICpwcm90b2NvbCA9IE5VTEw7CisgIFRocmlmdFNlcnZlclNvY2tldCAqdHNvY2tldCA9IE5VTEw7CisgIGdib29sZWFuIHZhbHVlX2Jvb2xlYW4gPSBGQUxTRTsKKyAgZ2ludDggdmFsdWVfYnl0ZSA9IDA7CisgIGdpbnQxNiB2YWx1ZV8xNiA9IDA7CisgIGdpbnQzMiB2YWx1ZV8zMiA9IDA7CisgIGdpbnQ2NCB2YWx1ZV82NCA9IDA7CisgIGdkb3VibGUgdmFsdWVfZG91YmxlID0gMDsKKyAgZ2NoYXIgKnN0cmluZyA9IE5VTEw7CisgIGdjaGFyICplbXB0eV9zdHJpbmcgPSBOVUxMOworICBncG9pbnRlciBiaW5hcnkgPSBOVUxMOworICBndWludDMyIGxlbiA9IDA7CisgIHZvaWQgKmNvbXBhcmF0b3IgPSAodm9pZCAqKSBURVNUX1NUUklORzsKKworICB0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULCAicG9ydCIsIHBvcnQsIE5VTEwpOworICB0cmFuc3BvcnQgPSBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVCAodHNvY2tldCk7CisgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2xpc3RlbiAodHJhbnNwb3J0LCBOVUxMKTsKKworICAvKiB3cmFwIHRoZSBjbGllbnQgaW4gYSBmcmFtZWQgdHJhbnNwb3J0ICovCisgIGNsaWVudCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCwgInRyYW5zcG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0ICh0cmFuc3BvcnQsIE5VTEwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJyX2J1Zl9zaXplIiwgMSwgTlVMTCk7CisgIGdfYXNzZXJ0IChjbGllbnQgIT0gTlVMTCk7CisKKyAgdGJwID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wsICJ0cmFuc3BvcnQiLAorICAgICAgICAgICAgICAgICAgICAgIGNsaWVudCwgTlVMTCk7CisgIHByb3RvY29sID0gVEhSSUZUX1BST1RPQ09MICh0YnApOworCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYm9vbCAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9ib29sZWFuLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmdmFsdWVfYnl0ZSwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pMTYgKHByb3RvY29sLCAmdmFsdWVfMTYsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJnZhbHVlXzMyLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2k2NCAocHJvdG9jb2wsICZ2YWx1ZV82NCwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9kb3VibGUgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9kb3VibGUsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfc3RyaW5nIChwcm90b2NvbCwgJnN0cmluZywgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9zdHJpbmcgKHByb3RvY29sLCAmZW1wdHlfc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYmluYXJ5IChwcm90b2NvbCwgJmJpbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuLCBOVUxMKSA+IDApOworCisgIGdfYXNzZXJ0ICh2YWx1ZV9ib29sZWFuID09IFRFU1RfQk9PTCk7CisgIGdfYXNzZXJ0ICh2YWx1ZV9ieXRlID09IFRFU1RfQllURSk7CisgIGdfYXNzZXJ0ICh2YWx1ZV8xNiA9PSBURVNUX0kxNik7CisgIGdfYXNzZXJ0ICh2YWx1ZV8zMiA9PSBURVNUX0kzMik7CisgIGdfYXNzZXJ0ICh2YWx1ZV82NCA9PSBURVNUX0k2NCk7CisgIGdfYXNzZXJ0ICh2YWx1ZV9kb3VibGUgPT0gVEVTVF9ET1VCTEUpOworICBnX2Fzc2VydCAoc3RyY21wIChURVNUX1NUUklORywgc3RyaW5nKSA9PSAwKTsKKyAgZ19hc3NlcnQgKHN0cmNtcCAoIiIsIGVtcHR5X3N0cmluZykgPT0gMCk7CisgIGdfYXNzZXJ0IChtZW1jbXAgKGNvbXBhcmF0b3IsIGJpbmFyeSwgbGVuKSA9PSAwKTsKKworICBnX2ZyZWUgKHN0cmluZyk7CisgIGdfZnJlZSAoZW1wdHlfc3RyaW5nKTsKKyAgZ19mcmVlIChiaW5hcnkpOworCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYmluYXJ5IChwcm90b2NvbCwgJmJpbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAoYmluYXJ5ID09IE5VTEwpOworICBnX2Fzc2VydCAobGVuID09IDApOworICBnX2ZyZWUgKGJpbmFyeSk7CisKKyAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZCAoY2xpZW50LCBOVUxMKTsKKyAgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAoY2xpZW50LCBOVUxMKTsKKworICBnX29iamVjdF91bnJlZiAodGJwKTsKKyAgZ19vYmplY3RfdW5yZWYgKGNsaWVudCk7CisgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKK30KKwogaW50CiBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7CkBAIC02ODMsNiArODUyLDggQEAKICAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RiaW5hcnlwcm90b2NvbC9Jbml0aWFsaXplIiwgdGVzdF9pbml0aWFsaXplKTsKICAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RiaW5hcnlwcm90b2NvbC9SZWFkQW5kV3JpdGVQcmltaXRpdmVzIiwgdGVzdF9yZWFkX2FuZF93cml0ZV9wcmltaXRpdmVzKTsKICAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RiaW5hcnlwcm90b2NvbC9SZWFkQW5kV3JpdGVDb21wbGV4VHlwZXMiLCB0ZXN0X3JlYWRfYW5kX3dyaXRlX2NvbXBsZXhfdHlwZXMpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdGJpbmFyeXByb3RvY29sL1JlYWRBbmRXcml0ZU1hbnlGcmFtZXMiLAorICAgICAgICAgICAgICAgICAgIHRlc3RfcmVhZF9hbmRfd3JpdGVfbWFueV9mcmFtZXMpOwogCiAgIHJldHVybiBnX3Rlc3RfcnVuICgpOwogfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3RidWZmZXJlZHRyYW5zcG9ydC5jIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RidWZmZXJlZHRyYW5zcG9ydC5jCmluZGV4IDMyMDNhNjYuLmQwMTgwNmQgMTAwNzU1Ci0tLSBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0YnVmZmVyZWR0cmFuc3BvcnQuYworKysgYi9saWIvY19nbGliL3Rlc3QvdGVzdGJ1ZmZlcmVkdHJhbnNwb3J0LmMKQEAgLTE3LDcgKzE3LDYgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxuZXRkYi5oPgogI2luY2x1ZGUgPHNpZ25hbC5oPgogI2luY2x1ZGUgPHN5cy93YWl0Lmg+CkBAIC0zMiw2ICszMSw3IEBACiAjaW5jbHVkZSAiLi4vc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuYyIKIAogc3RhdGljIHZvaWQgdGhyaWZ0X3NlcnZlciAoY29uc3QgaW50IHBvcnQpOworc3RhdGljIHZvaWQgdGhyaWZ0X3NvY2tldF9zZXJ2ZXJfb3BlbiAoY29uc3QgaW50IHBvcnQsIGludCB0aW1lcyk7CiAKIC8qIHRlc3Qgb2JqZWN0IGNyZWF0aW9uIGFuZCBkZXN0cnVjdGlvbiAqLwogc3RhdGljIHZvaWQKQEAgLTQzLDEwICs0MywxMCBAQAogCiAgIEdPYmplY3QgKm9iamVjdCA9IE5VTEw7CiAgIG9iamVjdCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JULCBOVUxMKTsKLSAgYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CisgIGdfYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CiAgIGdfb2JqZWN0X2dldCAoR19PQkpFQ1QgKG9iamVjdCksICJ0cmFuc3BvcnQiLCAmdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICJyX2J1Zl9zaXplIiwgJnJfYnVmX3NpemUsCi0gICAgICAgICAgICAgICAgIndfYnVmX3NpemUiLCAmd19idWZfc2l6ZSwgTlVMTCk7CisJCSJyX2J1Zl9zaXplIiwgJnJfYnVmX3NpemUsCisJCSJ3X2J1Zl9zaXplIiwgJndfYnVmX3NpemUsIE5VTEwpOwogICBnX29iamVjdF91bnJlZiAob2JqZWN0KTsKIH0KIApAQCAtNTYsMzUgKzU2LDUyIEBACiAgIFRocmlmdFNvY2tldCAqdHNvY2tldCA9IE5VTEw7CiAgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKICAgR0Vycm9yICplcnIgPSBOVUxMOworICBwaWRfdCBwaWQ7CisgIGludCBwb3J0ID0gNTExOTk7CisgIGludCBzdGF0dXM7CiAKLSAgLyogY3JlYXRlIGEgVGhyaWZ0U29ja2V0ICovCi0gIHRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgNTExODgsIE5VTEwpOyAKKyAgcGlkID0gZm9yayAoKTsKKyAgZ19hc3NlcnQgKCBwaWQgPj0gMCApOwogCi0gIC8qIGNyZWF0ZSBhIEJ1ZmZlcmVkVHJhbnNwb3J0IHdyYXBwZXIgb2YgdGhlIFNvY2tldCAqLwotICB0cmFuc3BvcnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJhbnNwb3J0IiwgVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCksIE5VTEwpOworICBpZiAoIHBpZCA9PSAwICkKKyAgICB7CisgICAgICAvKiBjaGlsZCBsaXN0ZW5zICovCisgICAgICB0aHJpZnRfc29ja2V0X3NlcnZlcl9vcGVuIChwb3J0LDEpOworICAgICAgZXhpdCAoMCk7CisgICAgfSBlbHNlIHsKKwkvKiBwYXJlbnQgY29ubmVjdHMsIHdhaXQgYSBiaXQgZm9yIHRoZSBzb2NrZXQgdG8gYmUgY3JlYXRlZCAqLworCXNsZWVwICgxKTsKKwkvKiBjcmVhdGUgYSBUaHJpZnRTb2NrZXQgKi8KKwl0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QiLAorCQkJCSJwb3J0IiwgcG9ydCwgTlVMTCk7CiAKLSAgLyogdGhpcyBzaG91bGRuJ3Qgd29yayAqLwotICBhc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKSA9PSBGQUxTRSk7Ci0gIGFzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpID09IFRSVUUpOwotICBhc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCkgPT0gVFJVRSk7Ci0gIGdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOwotICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisJLyogY3JlYXRlIGEgQnVmZmVyZWRUcmFuc3BvcnQgd3JhcHBlciBvZiB0aGUgU29ja2V0ICovCisJdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQsCisJCQkJICAidHJhbnNwb3J0IiwgVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCksIE5VTEwpOwogCi0gIC8qIHRyeSBhbmQgdW5kZXJseWluZyBzb2NrZXQgZmFpbHVyZSAqLwotICB0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QuYnJva2VuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisJLyogdGhpcyBzaG91bGRuJ3Qgd29yayAqLworCWdfYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCkgPT0gVFJVRSk7CisJZ19hc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfaXNfb3BlbiAodHJhbnNwb3J0KSA9PSBUUlVFKTsKKwlnX2Fzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKSA9PSBUUlVFKTsKKwlnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKKwlnX29iamVjdF91bnJlZiAodHNvY2tldCk7CiAKLSAgLyogY3JlYXRlIGEgQnVmZmVyZWRUcmFuc3BvcnQgd3JhcHBlciBvZiB0aGUgU29ja2V0ICovCi0gIHRyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc3BvcnQiLCBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KSwgTlVMTCk7CisJLyogdHJ5IGFuZCB1bmRlcmx5aW5nIHNvY2tldCBmYWlsdXJlICovCisJdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0LmJyb2tlbiIsCisJCQkJTlVMTCk7CiAKLSAgYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgJmVycikgPT0gRkFMU0UpOwotICBnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKLSAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOwotICBnX2Vycm9yX2ZyZWUgKGVycik7Ci0gIGVyciA9IE5VTEw7CisJLyogY3JlYXRlIGEgQnVmZmVyZWRUcmFuc3BvcnQgd3JhcHBlciBvZiB0aGUgU29ja2V0ICovCisJdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQsCisJCQkJICAidHJhbnNwb3J0IiwgVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCksIE5VTEwpOworCisJZ19hc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCAmZXJyKSA9PSBGQUxTRSk7CisJZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7CisJZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworCWdfZXJyb3JfZnJlZSAoZXJyKTsKKwllcnIgPSBOVUxMOworCWdfYXNzZXJ0ICggd2FpdCAoJnN0YXR1cykgPT0gcGlkICk7CisJZ19hc3NlcnQgKCBzdGF0dXMgPT0gMCApOworICAgIH0KIH0KIAogc3RhdGljIHZvaWQKQEAgLTk4LDYwICsxMTUsODEgQEAKICAgZ3VjaGFyIGJ1ZlsxMF0gPSBURVNUX0RBVEE7IC8qIGEgYnVmZmVyICovCiAKICAgcGlkID0gZm9yayAoKTsKLSAgYXNzZXJ0ICggcGlkID49IDAgKTsKKyAgZ19hc3NlcnQgKCBwaWQgPj0gMCApOwogCiAgIGlmICggcGlkID09IDAgKQotICB7Ci0gICAgLyogY2hpbGQgbGlzdGVucyAqLwotICAgIHRocmlmdF9zZXJ2ZXIgKHBvcnQpOwotICAgIGV4aXQgKDApOwotICB9IGVsc2UgewotICAgIC8qIHBhcmVudCBjb25uZWN0cywgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkICovCi0gICAgc2xlZXAgKDEpOworICAgIHsKKyAgICAgIC8qIGNoaWxkIGxpc3RlbnMgKi8KKyAgICAgIHRocmlmdF9zZXJ2ZXIgKHBvcnQpOworICAgICAgZXhpdCAoMCk7CisgICAgfSBlbHNlIHsKKwkvKiBwYXJlbnQgY29ubmVjdHMsIHdhaXQgYSBiaXQgZm9yIHRoZSBzb2NrZXQgdG8gYmUgY3JlYXRlZCAqLworCXNsZWVwICgxKTsKIAotICAgIHRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKLSAgICB0cmFuc3BvcnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc3BvcnQiLCBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3X2J1Zl9zaXplIiwgNCwgTlVMTCk7CisJdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKKwkJCQkicG9ydCIsIHBvcnQsIE5VTEwpOworCXRyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JULAorCQkJCSAgInRyYW5zcG9ydCIsIFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpLAorCQkJCSAgIndfYnVmX3NpemUiLCA0LCBOVUxMKTsKIAotICAgIGFzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9vcGVuICh0cmFuc3BvcnQsIE5VTEwpID09IFRSVUUpOwotICAgIGFzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpKTsKKwlnX2Fzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9vcGVuICh0cmFuc3BvcnQsIE5VTEwpID09IFRSVUUpOworCWdfYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2lzX29wZW4gKHRyYW5zcG9ydCkpOwogCi0gICAgLyogd3JpdGUgMTAgYnl0ZXMgKi8KLSAgICB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMTAsIE5VTEwpOworCS8qIHdyaXRlIDEwIGJ5dGVzICovCisJdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEwLCBOVUxMKTsKIAotICAgIC8qIHdyaXRlIDEgYnl0ZSBhdCBhIHRpbWUgKi8KLSAgICB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMSwgTlVMTCk7Ci0gICAgdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEsIE5VTEwpOwotICAgIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxLCBOVUxMKTsKKwkvKiB3cml0ZSAxIGJ5dGUgYXQgYSB0aW1lICovCisJdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEsIE5VTEwpOworCXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxLCBOVUxMKTsKKwl0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMSwgTlVMTCk7CiAKLSAgICAvKiBvdmVyZmxvdyB0aGUgYnVmZmVyICovCi0gICAgdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDIsIE5VTEwpOwotICAgIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxLCBOVUxMKTsKLSAgICB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworCS8qIG92ZXJmbG93IHRoZSBidWZmZXIgKi8KKwl0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMiwgTlVMTCk7CisJdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEsIE5VTEwpOworCXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CiAKLSAgICAvKiB3cml0ZSAxIGJ5dGUgYW5kIGZsdXNoICovCi0gICAgdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEsIE5VTEwpOwotICAgIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisJLyogd3JpdGUgMSBieXRlIGFuZCBmbHVzaCAqLworCXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxLCBOVUxMKTsKKwl0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOwogCi0gICAgLyogd3JpdGUgYW5kIG92ZXJmbG93IGJ1ZmZlciB3aXRoIDIgc3lzdGVtIGNhbGxzICovCi0gICAgdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEsIE5VTEwpOwotICAgIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAzLCBOVUxMKTsKKwkvKiB3cml0ZSBhbmQgb3ZlcmZsb3cgYnVmZmVyIHdpdGggMiBzeXN0ZW0gY2FsbHMgKi8KKwl0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMSwgTlVMTCk7CisJdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDMsIE5VTEwpOwogCi0gICAgLyogd3JpdGUgMTAgYnl0ZXMgKi8KLSAgICB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMTAsIE5VTEwpOworCS8qIHdyaXRlIDEwIGJ5dGVzICovCisJdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEwLCBOVUxMKTsKIAotICAgIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGVfZW5kICh0cmFuc3BvcnQsIE5VTEwpOwotICAgIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7Ci0gICAgdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKKwl0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlX2VuZCAodHJhbnNwb3J0LCBOVUxMKTsKKwl0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworCXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CiAKLSAgICBnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKLSAgICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisJZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7CisJZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOwogCi0gICAgYXNzZXJ0ICggd2FpdCAoJnN0YXR1cykgPT0gcGlkICk7Ci0gICAgYXNzZXJ0ICggc3RhdHVzID09IDAgKTsKKwlnX2Fzc2VydCAoIHdhaXQgKCZzdGF0dXMpID09IHBpZCApOworCWdfYXNzZXJ0ICggc3RhdHVzID09IDAgKTsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQKK3RocmlmdF9zb2NrZXRfc2VydmVyX29wZW4gKGNvbnN0IGludCBwb3J0LCBpbnQgdGltZXMpCit7CisgIFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICpjbGllbnQgPSBOVUxMOworICBpbnQgaTsKKyAgVGhyaWZ0U2VydmVyU29ja2V0ICp0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULAorCQkJCQkgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOworCisgIHRyYW5zcG9ydCA9IFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUICh0c29ja2V0KTsKKyAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfbGlzdGVuICh0cmFuc3BvcnQsIE5VTEwpOworICBmb3IoaT0wO2k8dGltZXM7aSsrKXsKKyAgICAgIGNsaWVudCA9IHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICAgIGdfYXNzZXJ0IChjbGllbnQgIT0gTlVMTCk7CisgICAgICB0aHJpZnRfc29ja2V0X2Nsb3NlIChjbGllbnQsIE5VTEwpOworICAgICAgZ19vYmplY3RfdW5yZWYgKGNsaWVudCk7CiAgIH0KKyAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMTY0LDIxICsyMDIsMjEgQEAKICAgZ3VjaGFyIG1hdGNoWzEwXSA9IFRFU1RfREFUQTsKIAogICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKKwkJCQkJICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKIAogICB0cmFuc3BvcnQgPSBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVCAodHNvY2tldCk7CiAgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2xpc3RlbiAodHJhbnNwb3J0LCBOVUxMKTsKIAogICAvKiB3cmFwIHRoZSBjbGllbnQgaW4gYSBCdWZmZXJlZFRyYW5zcG9ydCAqLwogICBjbGllbnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVCwgInRyYW5zcG9ydCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0ICh0cmFuc3BvcnQsIE5VTEwpLAotICAgICAgICAgICAgICAgICAgICAgICAgICJyX2J1Zl9zaXplIiwgNSwgTlVMTCk7Ci0gIGFzc2VydCAoY2xpZW50ICE9IE5VTEwpOworCQkJIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAodHJhbnNwb3J0LCBOVUxMKSwKKwkJCSAicl9idWZfc2l6ZSIsIDUsIE5VTEwpOworICBnX2Fzc2VydCAoY2xpZW50ICE9IE5VTEwpOwogCiAgIC8qIHJlYWQgMTAgYnl0ZXMgKi8KICAgYnl0ZXMgPSB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3JlYWQgKGNsaWVudCwgYnVmLCAxMCwgTlVMTCk7Ci0gIGFzc2VydCAoYnl0ZXMgPT0gMTApOyAvKiBtYWtlIHN1cmUgd2UndmUgcmVhZCAxMCBieXRlcyAqLwotICBhc3NlcnQgKCBtZW1jbXAgKGJ1ZiwgbWF0Y2gsIDEwKSA9PSAwICk7IC8qIG1ha2Ugc3VyZSB3aGF0IHdlIGdvdCBtYXRjaGVzICovCisgIGdfYXNzZXJ0IChieXRlcyA9PSAxMCk7IC8qIG1ha2Ugc3VyZSB3ZSd2ZSByZWFkIDEwIGJ5dGVzICovCisgIGdfYXNzZXJ0ICggbWVtY21wIChidWYsIG1hdGNoLCAxMCkgPT0gMCApOyAvKiBtYWtlIHN1cmUgd2hhdCB3ZSBnb3QgbWF0Y2hlcyAqLwogCiAgIC8qIHJlYWQgMSBieXRlICovCiAgIGJ5dGVzID0gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9yZWFkIChjbGllbnQsIGJ1ZiwgMSwgTlVMTCk7CkBAIC0yMDcsNjUgKzI0NSw2NSBAQAogICBzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7CiAKICAgcGlkID0gZm9yayAoKTsKLSAgYXNzZXJ0ICggcGlkID49IDAgKTsKKyAgZ19hc3NlcnQgKCBwaWQgPj0gMCApOwogCiAgIGlmICggcGlkID09IDAgKQotICB7Ci0gICAgLyogY2hpbGQgbGlzdGVucyAqLwotICAgIFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKLSAgICBUaHJpZnRUcmFuc3BvcnQgKmNsaWVudCA9IE5VTEw7CisgICAgeworICAgICAgLyogY2hpbGQgbGlzdGVucyAqLworICAgICAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICAgICAgVGhyaWZ0VHJhbnNwb3J0ICpjbGllbnQgPSBOVUxMOwogCi0gICAgVGhyaWZ0U2VydmVyU29ja2V0ICp0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULAotICAgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOworICAgICAgVGhyaWZ0U2VydmVyU29ja2V0ICp0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULAorCQkJCQkJICAicG9ydCIsIHBvcnQsIE5VTEwpOwogCi0gICAgdHJhbnNwb3J0ID0gVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlQgKHRzb2NrZXQpOwotICAgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2xpc3RlbiAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICAgIHRyYW5zcG9ydCA9IFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUICh0c29ja2V0KTsKKyAgICAgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2xpc3RlbiAodHJhbnNwb3J0LCBOVUxMKTsKIAotICAgIC8qIHdyYXAgdGhlIGNsaWVudCBpbiBhIEJ1ZmZlcmVkVHJhbnNwb3J0ICovCi0gICAgY2xpZW50ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQsICJ0cmFuc3BvcnQiLAotICAgICAgICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKHRyYW5zcG9ydCwgTlVMTCksCi0gICAgICAgICJyX2J1Zl9zaXplIiwgNSwgTlVMTCk7Ci0gICAgYXNzZXJ0IChjbGllbnQgIT0gTlVMTCk7CisgICAgICAvKiB3cmFwIHRoZSBjbGllbnQgaW4gYSBCdWZmZXJlZFRyYW5zcG9ydCAqLworICAgICAgY2xpZW50ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQsICJ0cmFuc3BvcnQiLAorCQkJICAgICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKHRyYW5zcG9ydCwgTlVMTCksCisJCQkgICAgICJyX2J1Zl9zaXplIiwgNSwgTlVMTCk7CisgICAgICBnX2Fzc2VydCAoY2xpZW50ICE9IE5VTEwpOwogCi0gICAgLyoganVzdCBjbG9zZSBzb2NrZXQgKi8KLSAgICB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2Nsb3NlIChjbGllbnQsIE5VTEwpOwotICAgIGdfb2JqZWN0X3VucmVmIChjbGllbnQpOwotICAgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKLSAgICBleGl0ICgwKTsKLSAgfSBlbHNlIHsKLSAgICAvKiBwYXJlbnQgY29ubmVjdHMsIHdhaXQgYSBiaXQgZm9yIHRoZSBzb2NrZXQgdG8gYmUgY3JlYXRlZCAqLwotICAgIHNsZWVwICgxKTsKKyAgICAgIC8qIGp1c3QgY2xvc2Ugc29ja2V0ICovCisgICAgICB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2Nsb3NlIChjbGllbnQsIE5VTEwpOworICAgICAgZ19vYmplY3RfdW5yZWYgKGNsaWVudCk7CisgICAgICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisgICAgICBleGl0ICgwKTsKKyAgICB9IGVsc2UgeworCS8qIHBhcmVudCBjb25uZWN0cywgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkICovCisJc2xlZXAgKDEpOwogCi0gICAgdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOwotICAgIHRyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyYW5zcG9ydCIsIFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndfYnVmX3NpemUiLCA0LCBOVUxMKTsKKwl0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QiLAorCQkJCSJwb3J0IiwgcG9ydCwgTlVMTCk7CisJdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQsCisJCQkJICAidHJhbnNwb3J0IiwgVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCksCisJCQkJICAid19idWZfc2l6ZSIsIDQsIE5VTEwpOwogCiAKLSAgICBhc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKSA9PSBUUlVFKTsKLSAgICBhc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfaXNfb3BlbiAodHJhbnNwb3J0KSk7CisJZ19hc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKSA9PSBUUlVFKTsKKwlnX2Fzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpKTsKIAotICAgIC8qIHJlY29nbml6ZSBkaXNjb25uZWN0aW9uICovCi0gICAgc2xlZXAoMSk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMTAsIE5VTEwpID09IFRSVUUpOwotICAgIGFzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEwLCBOVUxMKSA9PSBGQUxTRSk7CisJLyogcmVjb2duaXplIGRpc2Nvbm5lY3Rpb24gKi8KKwlzbGVlcCgxKTsKKwlnX2Fzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEwLCBOVUxMKSA9PSBUUlVFKTsKKwlnX2Fzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEwLCBOVUxMKSA9PSBGQUxTRSk7CiAKLSAgICAvKiB3cml0ZSBhbmQgb3ZlcmZsb3cgYnVmZmVyICovCi0gICAgYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMTAsIE5VTEwpID09IEZBTFNFKTsKKwkvKiB3cml0ZSBhbmQgb3ZlcmZsb3cgYnVmZmVyICovCisJZ19hc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxMCwgTlVMTCkgPT0gRkFMU0UpOwogCi0gICAgLyogd3JpdGUgMSBhbmQgZmx1c2ggKi8KLSAgICBhc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxLCBOVUxMKSA9PSBUUlVFKTsKLSAgICBhc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCkgPT0gRkFMU0UpOworCS8qIHdyaXRlIDEgYW5kIGZsdXNoICovCisJZ19hc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxLCBOVUxMKSA9PSBUUlVFKTsKKwlnX2Fzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKSA9PSBGQUxTRSk7CiAKLSAgICB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOworCXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CiAKLSAgICBnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKLSAgICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisJZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7CisJZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOwogCi0gICAgYXNzZXJ0ICggd2FpdCAoJnN0YXR1cykgPT0gcGlkICk7Ci0gICAgYXNzZXJ0ICggc3RhdHVzID09IDAgKTsKLSAgfQorCWdfYXNzZXJ0ICggd2FpdCAoJnN0YXR1cykgPT0gcGlkICk7CisJZ19hc3NlcnQgKCBzdGF0dXMgPT0gMCApOworICAgIH0KIH0KIAogaW50CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3Rlc3QvdGVzdGNvbXBhY3Rwcm90b2NvbC5jIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3Rjb21wYWN0cHJvdG9jb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lNWFkNDkxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3Rjb21wYWN0cHJvdG9jb2wuYwpAQCAtMCwwICsxLDEyOTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyogRGlzYWJsZSBzdHJpbmctZnVuY3Rpb24gb3B0aW1pemF0aW9ucyB3aGVuIGdsaWJjIGlzIHVzZWQsIGFzIHRoZXNlIHByb2R1Y2UKKyAgIGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IHN0cmluZyBsZW5ndGggd2hlbiBhIHN0cmluZyBmdW5jdGlvbiBpcyB1c2VkIGluc2lkZQorICAgYSBjYWxsIHRvIGdfYXNzZXJ0ICgpICovCisjaWYgIWRlZmluZWQoX19BUFBMRV9fKSAmJiAhZGVmaW5lZChfX0ZyZWVCU0RfXykgJiYgXAorICAgICFkZWZpbmVkKF9fT3BlbkJTRF9fKSAmJiAhZGVmaW5lZChfX05ldEJTRF9fKQorI2luY2x1ZGUgPGZlYXR1cmVzLmg+CisjZW5kaWYKKworI2lmZGVmIF9fR0xJQkNfXworI2RlZmluZSBfX05PX1NUUklOR19JTkxJTkVTIDEKKyNlbmRpZgorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0Lmg+CisKKyNkZWZpbmUgVEVTVF9CT09MIFRSVUUKKyNkZWZpbmUgVEVTVF9CWVRFIDEyMworI2RlZmluZSBURVNUX0kxNiAxMjM0NQorI2RlZmluZSBURVNUX0kzMiAxMjM0NTY3ODkwCisjZGVmaW5lIFRFU1RfSTY0IDEyMzQ1Njc4OTAxMjM0NQorI2RlZmluZSBURVNUX05JMTYgKC0xMjM0NSkKKyNkZWZpbmUgVEVTVF9OSTMyICgtMTIzNDU2Nzg5MCkKKyNkZWZpbmUgVEVTVF9OSTY0ICgtMTIzNDU2Nzg5MDEyMzQ1KQorI2RlZmluZSBURVNUX0RPVUJMRSAxMjM0NTY3ODkwLjEyMworI2RlZmluZSBURVNUX1NUUklORyAidGhpcyBpcyBhIHRlc3Qgc3RyaW5nIDEyMzQ1Njc4OTAhQCMkJV4mKigpIgorI2RlZmluZSBURVNUX1BPUlQgNTExOTkKKworc3RhdGljIGludCB0cmFuc3BvcnRfcmVhZF9jb3VudCA9IDA7CitzdGF0aWMgaW50IHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMDsKK3N0YXRpYyBpbnQgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAtMTsKK2dpbnQzMgorbXlfdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgaWYgKHRyYW5zcG9ydF9yZWFkX2NvdW50ICE9IHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0CisgICAgICAmJiB0cmFuc3BvcnRfcmVhZF9lcnJvciA9PSAwKQorICB7CisgICAgdHJhbnNwb3J0X3JlYWRfY291bnQrKzsKKyAgICByZXR1cm4gdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbCAodHJhbnNwb3J0LCBidWYsIGxlbiwgZXJyb3IpOworICB9CisgIHJldHVybiAtMTsKK30KKworc3RhdGljIGludCB0cmFuc3BvcnRfd3JpdGVfY291bnQgPSAwOworc3RhdGljIGludCB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAwOworc3RhdGljIGludCB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAtMTsKK2dib29sZWFuCitteV90aHJpZnRfdHJhbnNwb3J0X3dyaXRlIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgY29uc3QgZ3BvaW50ZXIgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQoreworICBpZiAodHJhbnNwb3J0X3dyaXRlX2NvdW50ICE9IHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdAorICAgICAgJiYgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID09IDApCisgIHsKKyAgICB0cmFuc3BvcnRfd3JpdGVfY291bnQrKzsKKyAgICByZXR1cm4gdGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIGxlbiwgZXJyb3IpOworICB9CisgIHJldHVybiBGQUxTRTsKK30KKworI2RlZmluZSB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsIG15X3RocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwKKyNkZWZpbmUgdGhyaWZ0X3RyYW5zcG9ydF93cml0ZSBteV90aHJpZnRfdHJhbnNwb3J0X3dyaXRlCisjaW5jbHVkZSAiLi4vc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wuYyIKKyN1bmRlZiB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsCisjdW5kZWYgdGhyaWZ0X3RyYW5zcG9ydF93cml0ZQorCitzdGF0aWMgdm9pZCB0aHJpZnRfc2VydmVyX3ByaW1pdGl2ZXMgKGNvbnN0IGludCBwb3J0KTsKK3N0YXRpYyB2b2lkIHRocmlmdF9zZXJ2ZXJfY29tcGxleF90eXBlcyAoY29uc3QgaW50IHBvcnQpOworc3RhdGljIHZvaWQgdGhyaWZ0X3NlcnZlcl9tYW55X2ZyYW1lcyAoY29uc3QgaW50IHBvcnQpOworCitzdGF0aWMgdm9pZAordGVzdF9jcmVhdGVfYW5kX2Rlc3Ryb3kgKHZvaWQpCit7CisgIEdPYmplY3QgKm9iamVjdCA9IE5VTEw7CisKKyAgLyogY3JlYXRlIGFuIG9iamVjdCBhbmQgdGhlbiBkZXN0cm95IGl0ICovCisgIG9iamVjdCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTCwgTlVMTCk7CisgIGdfYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CisgIGdfb2JqZWN0X3VucmVmIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9pbml0aWFsaXplICh2b2lkKQoreworICBUaHJpZnRTb2NrZXQgKnRzb2NrZXQgPSBOVUxMOworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKnByb3RvY29sID0gTlVMTDsKKyAgVGhyaWZ0U29ja2V0ICp0ZW1wID0gTlVMTDsKKworICAvKiBjcmVhdGUgYSBUaHJpZnRUcmFuc3BvcnQgKi8KKyAgdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCA1MTE4OCwgTlVMTCk7CisgIGdfYXNzZXJ0ICh0c29ja2V0ICE9IE5VTEwpOworICAvKiBjcmVhdGUgYSBUaHJpZnRDb21wYWN0UHJvdG9jb2wgdXNpbmcgdGhlIFRyYW5zcG9ydCAqLworICBwcm90b2NvbCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTCwgInRyYW5zcG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0c29ja2V0LCBOVUxMKTsKKyAgZ19hc3NlcnQgKHByb3RvY29sICE9IE5VTEwpOworICAvKiBmZXRjaCB0aGUgcHJvcGVydGllcyAqLworICBnX29iamVjdF9nZXQgKEdfT0JKRUNUIChwcm90b2NvbCksICJ0cmFuc3BvcnQiLCAmdGVtcCwgTlVMTCk7CisgIGdfb2JqZWN0X3VucmVmICh0ZW1wKTsKKworICAvKiBjbGVhbiB1cCBtZW1vcnkgKi8KKyAgZ19vYmplY3RfdW5yZWYgKHByb3RvY29sKTsKKyAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9yZWFkX2FuZF93cml0ZV9wcmltaXRpdmVzICh2b2lkKQoreworICBpbnQgc3RhdHVzOworICBwaWRfdCBwaWQ7CisgIFRocmlmdFNvY2tldCAqdHNvY2tldCA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICp0YyA9IE5VTEw7CisgIFRocmlmdFByb3RvY29sICpwcm90b2NvbCA9IE5VTEw7CisgIGdwb2ludGVyIGJpbmFyeSA9IChncG9pbnRlciAqKSBURVNUX1NUUklORzsKKyAgZ3VpbnQzMiBsZW4gPSBzdHJsZW4gKFRFU1RfU1RSSU5HKTsKKyAgaW50IHBvcnQgPSBURVNUX1BPUlQ7CisKKyAgLyogZm9yayBhIHNlcnZlciBmcm9tIHRoZSBjbGllbnQgKi8KKyAgcGlkID0gZm9yayAoKTsKKyAgZ19hc3NlcnQgKHBpZCA+PSAwKTsKKworICBpZiAocGlkID09IDApCisgIHsKKyAgICAvKiBjaGlsZCBsaXN0ZW5zICovCisgICAgdGhyaWZ0X3NlcnZlcl9wcmltaXRpdmVzIChwb3J0KTsKKyAgICBleGl0ICgwKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBwYXJlbnQuICB3YWl0IGEgYml0IGZvciB0aGUgc29ja2V0IHRvIGJlIGNyZWF0ZWQuICovCisgICAgc2xlZXAgKDEpOworCisgICAgLyogY3JlYXRlIGEgVGhyaWZ0U29ja2V0ICovCisgICAgdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOworICAgIHRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpOworICAgIHRocmlmdF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpKTsKKworICAgIC8qIGNyZWF0ZSBhIFRocmlmdENvbXBhY3RUcmFuc3BvcnQgKi8KKyAgICB0YyA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTCwgInRyYW5zcG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgIHRzb2NrZXQsIE5VTEwpOworICAgIHByb3RvY29sID0gVEhSSUZUX1BST1RPQ09MICh0Yyk7CisgICAgZ19hc3NlcnQgKHByb3RvY29sICE9IE5VTEwpOworCisgICAgLyogd3JpdGUgYSBidW5jaCBvZiBwcmltaXRpdmVzICovCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2Jvb2wgKHByb3RvY29sLCBURVNUX0JPT0wsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCBURVNUX0JZVEUsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kxNiAocHJvdG9jb2wsIFRFU1RfSTE2LCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCBURVNUX0kzMiwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTY0IChwcm90b2NvbCwgVEVTVF9JNjQsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kxNiAocHJvdG9jb2wsIFRFU1RfTkkxNiwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgVEVTVF9OSTMyLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pNjQgKHByb3RvY29sLCBURVNUX05JNjQsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kxNiAocHJvdG9jb2wsIDIsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIDIsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2k2NCAocHJvdG9jb2wsIDIsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kxNiAocHJvdG9jb2wsIC0yLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCAtMiwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTY0IChwcm90b2NvbCwgLTIsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2RvdWJsZSAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVTVF9ET1VCTEUsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3N0cmluZyAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVTVF9TVFJJTkcsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3N0cmluZyAocHJvdG9jb2wsICIiLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCBiaW5hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCBOVUxMLCAwLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCBiaW5hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBOVUxMKSA+IDApOworCisgICAgLyogdGVzdCB3cml0ZSBlcnJvcnMgKi8KKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAxOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgVEVTVF9CWVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA9PSAtMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kxNiAocHJvdG9jb2wsIFRFU1RfSTE2LCBOVUxMKSA9PSAtMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIFRFU1RfSTMyLCBOVUxMKSA9PSAtMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2k2NCAocHJvdG9jb2wsIFRFU1RfSTY0LCBOVUxMKSA9PSAtMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kxNiAocHJvdG9jb2wsIFRFU1RfTkkxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPT0gLTEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCBURVNUX05JMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IC0xKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTY0IChwcm90b2NvbCwgVEVTVF9OSTY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA9PSAtMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2RvdWJsZSAocHJvdG9jb2wsIFRFU1RfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IC0xKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgYmluYXJ5LCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPT0gLTEpOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDA7CisKKyAgICAvKiB0ZXN0IGJpbmFyeSBwYXJ0aWFsIGZhaWx1cmUgKi8KKyAgICB0cmFuc3BvcnRfd3JpdGVfY291bnQgPSAwOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IDE7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIGJpbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIE5VTEwpID09IC0xKTsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAtMTsKKworICAgIC8qIGNsZWFuIHVwICovCisgICAgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisgICAgZ19vYmplY3RfdW5yZWYgKHByb3RvY29sKTsKKyAgICBnX2Fzc2VydCAod2FpdCAoJnN0YXR1cykgPT0gcGlkKTsKKyAgICBnX2Fzc2VydCAoc3RhdHVzID09IDApOworICB9Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3JlYWRfYW5kX3dyaXRlX2NvbXBsZXhfdHlwZXMgKHZvaWQpCit7CisgIGludCBzdGF0dXM7CisgIHBpZF90IHBpZDsKKyAgVGhyaWZ0U29ja2V0ICp0c29ja2V0ID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKnRjID0gTlVMTDsKKyAgVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sID0gTlVMTDsKKyAgaW50IHBvcnQgPSBURVNUX1BPUlQ7CisKKyAgLyogZm9yayBhIHNlcnZlciBmcm9tIHRoZSBjbGllbnQgKi8KKyAgcGlkID0gZm9yayAoKTsKKyAgZ19hc3NlcnQgKHBpZCA+PSAwKTsKKworICBpZiAocGlkID09IDApCisgIHsKKyAgICAvKiBjaGlsZCBsaXN0ZW5zICovCisgICAgdGhyaWZ0X3NlcnZlcl9jb21wbGV4X3R5cGVzIChwb3J0KTsKKyAgICBleGl0ICgwKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBwYXJlbnQuICB3YWl0IGEgYml0IGZvciB0aGUgc29ja2V0IHRvIGJlIGNyZWF0ZWQuICovCisgICAgc2xlZXAgKDEpOworCisgICAgLyogY3JlYXRlIGEgVGhyaWZ0U29ja2V0ICovCisgICAgdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOworICAgIHRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpOworICAgIHRocmlmdF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpKTsKKworICAgIC8qIGNyZWF0ZSBhIFRocmlmdENvbXBhY3RUcmFuc3BvcnQgKi8KKyAgICB0YyA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTCwgInRyYW5zcG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgIHRzb2NrZXQsIE5VTEwpOworICAgIHByb3RvY29sID0gVEhSSUZUX1BST1RPQ09MICh0Yyk7CisgICAgZ19hc3NlcnQgKHByb3RvY29sICE9IE5VTEwpOworCisgICAgLyogdGVzdCBzdHJ1Y3R1cmVzICovCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9iZWdpbiAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKworICAgIC8qIHRlc3QgZmllbGQgc3RhdGUgdy5yLnQuIGRlbHRhcyAqLworCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLCAxLCBOVUxMKSA9PSAxKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYsIE5VTEwpID09IDEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNywgTlVMTCkgPT0gMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1LCBOVUxMKSA+IDEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwgTlVMTCkgPT0gMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ2LCBOVUxMKSA+IDEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NywgTlVMTCkgPT0gMSk7CisKKyAgICAvKiB0ZXN0IGZpZWxkcyAqLworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA+IDEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKworICAgIC8qIHRlc3QgZmllbGQgc3RhdGUgdy5yLnQuIHN0cnVjdHMgKi8KKworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA+IDEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYsIE5VTEwpID09IDEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfYmVnaW4gKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpID09IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNywgTlVMTCkgPiAxKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2JlZ2luIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTgsIE5VTEwpID4gMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOSwgTlVMTCkgPT0gMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTgsIE5VTEwpID09IDEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjUsIE5VTEwpID09IDEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3LCBOVUxMKSA9PSAxKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisKKyAgICAvKiB0ZXN0IGZpZWxkIHN0YXRlIHcuci50LiBib29scyAqLworCisgICAgLyogZGVsdGFzICovCisgICAgLyogbm9uLWJvb2wgZmllbGQgLT4gYm9vbCBmaWVsZCAtPiBub24tYm9vbCBmaWVsZCAqLworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOCwgTlVMTCkgPT0gMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwgVF9CT09MLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5LCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYm9vbCAocHJvdG9jb2wsIFRFU1RfQk9PTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IDEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAsIE5VTEwpID09IDEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgICAvKiBib29sIC0+IGJvb2wgZmllbGQgLT4gYm9vbCAqLworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ib29sIChwcm90b2NvbCwgVEVTVF9CT09MLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwgVF9CT09MLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYm9vbCAocHJvdG9jb2wsIFRFU1RfQk9PTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IDEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYm9vbCAocHJvdG9jb2wsIFRFU1RfQk9PTCwgTlVMTCkgPiAwKTsKKworICAgIC8qIG5vIGRlbHRhcyAqLworICAgIC8qIG5vbi1ib29sIGZpZWxkIC0+IGJvb2wgZmllbGQgLT4gbm9uLWJvb2wgZmllbGQgKi8KKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPiAxKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLCBUX0JPT0wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYm9vbCAocHJvdG9jb2wsIFRFU1RfQk9PTCwgTlVMTCkgPiAxKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID4gMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworICAgIC8qIGJvb2wgLT4gYm9vbCBmaWVsZCAtPiBib29sICovCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2Jvb2wgKHByb3RvY29sLCBURVNUX0JPT0wsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLCBUX0JPT0wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYm9vbCAocHJvdG9jb2wsIFRFU1RfQk9PTCwgTlVMTCkgPiAxKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2Jvb2wgKHByb3RvY29sLCBURVNUX0JPT0wsIE5VTEwpID4gMCk7CisKKyAgICAvKiB0ZXN0IHdyaXRlIGVycm9yICovCisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPT0gLTEpOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDA7CisKKyAgICAvKiB0ZXN0IDJuZCB3cml0ZSBlcnJvciAqLworICAgIHRyYW5zcG9ydF93cml0ZV9jb3VudCA9IDA7CisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gMTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPT0gLTEpOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IC0xOworCisgICAgLyogdGVzdCAybmQgcmVhZCBmYWlsdXJlIG9uIGEgZmllbGQgKi8KKyAgICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgVF9ET1VCTEUsIE5VTEwpOworCisgICAgLyogdGVzdCB3cml0ZV9maWVsZF9zdG9wICovCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX3N0b3AgKHByb3RvY29sLCBOVUxMKSA+IDApOworCisgICAgLyogd3JpdGUgYSBtYXAgKi8KKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbWFwX2JlZ2luIChwcm90b2NvbCwgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9tYXBfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisKKyAgICAvKiB0ZXN0IDFzdCByZWFkIGZhaWx1cmUgb24gbWFwLS0tbm90aGluZyB0byBkbyBvbiBvdXIgc2lkZSAqLworCisgICAgLyogdGVzdCAybmQgcmVhZCBmYWlsdXJlIG9uIGEgbWFwICovCisgICAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIFRfRE9VQkxFLCBOVUxMKTsKKworICAgIC8qIHRlc3QgMXN0IHdyaXRlIGZhaWx1cmUgb24gYSBtYXAgKi8KKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAxOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9tYXBfYmVnaW4gKHByb3RvY29sLCBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID09IC0xKTsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAwOworCisgICAgLyogdGVzdCAybmQgd3JpdGUgZmFpbHVyZSBvbiBhIG1hcCAqLworICAgIHRyYW5zcG9ydF93cml0ZV9jb3VudCA9IDA7CisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gMTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbWFwX2JlZ2luIChwcm90b2NvbCwgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA9PSAtMSk7CisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gLTE7CisKKyAgICAvKiB0ZXN0IG5lZ2F0aXZlIG1hcCBzaXplICovCisgICAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfdmFyaW50MzIgKHRjLCAtMTAsIE5VTEwpOworICAgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCBUX0RPVUJMRSwgTlVMTCk7CisKKyAgICAvKiB0ZXN0IGxpc3Qgb3BlcmF0aW9ucyAqLworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9saXN0X2JlZ2luIChwcm90b2NvbCwgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1LCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9saXN0X2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworCisgICAgLyogdGVzdCAxc3QgcmVhZCBmYWlsdXJlIG9uIGEgc21hbGwgbGlzdC0tLW5vdGhpbmcgdG8gZG8gb24gb3VyIGVuZCAqLworCisgICAgLyogdGVzdCAxc3QgcmVhZCBmYWlsdXJlIG9uIGEgYmlnIGxpc3QtLS1ub3RoaW5nIHRvIGRvIG9uIG91ciBlbmQgKi8KKworICAgIC8qIHRlc3QgMm5kIHJlYWQgZmFpbHVyZSBvbiBhIGJpZyBsaXN0ICovCisgICAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIChnaW50OCkgMHhmMCwgTlVMTCk7CisKKyAgICAvKiB0ZXN0IG5lZ2F0aXZlIGxpc3Qgc2l6ZSAqLworICAgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCAoZ2ludDgpIDB4ZjAsIE5VTEwpOworICAgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3ZhcmludDMyICh0YywgLTEwLCBOVUxMKTsKKworICAgIC8qIHRlc3QgZmlyc3Qgd3JpdGUgZXJyb3Igb24gYSBzbWFsbCBsaXN0ICovCisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbGlzdF9iZWdpbiAocHJvdG9jb2wsIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNCwgTlVMTCkgPT0gLTEpOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDA7CisKKyAgICAvKiB0ZXN0IGZpcnN0IHdyaXRlIGVycm9yIG9uIGEgYmlnIGxpc3QgKi8KKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAxOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9saXN0X2JlZ2luIChwcm90b2NvbCwgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1LCBOVUxMKSA9PSAtMSk7CisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMDsKKworICAgIC8qIHRlc3QgMm5kIHdyaXRlIGVycm9yIG9uIGEgYmlnIGxpc3QgKi8KKyAgICB0cmFuc3BvcnRfd3JpdGVfY291bnQgPSAwOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IDE7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2xpc3RfYmVnaW4gKHByb3RvY29sLCBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTUsIE5VTEwpID09IC0xKTsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAtMTsKKworICAgIC8qIHRlc3Qgc2V0IG9wZXJhdGlvbiBzKi8KKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc2V0X2JlZ2luIChwcm90b2NvbCwgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc2V0X2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworCisgICAgLyogaW52YWxpZCBwcm90b2NvbCAqLworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgMCwgTlVMTCkgPiAwKTsKKworICAgIC8qIGludmFsaWQgdmVyc2lvbiAqLworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgKGdpbnQ4KSAweDgydSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCAwLCBOVUxMKSA+IDApOworCisgICAgLyogc2VuZCBhIHZhbGlkIG1lc3NhZ2UgKi8KKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIChnaW50OCkgMHg4MnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgMHgwMXUsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfdmFyaW50MzIgKHRjLCAxLCBOVUxMKTsKKyAgICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zdHJpbmcgKHByb3RvY29sLCAidGVzdCIsIE5VTEwpOworCisgICAgLyogYnJva2VuIDJuZCByZWFkICovCisgICAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIChnaW50OCkgMHg4MnUsIE5VTEwpOworCisgICAgLyogc2VuZCBhIGJyb2tlbiAzcmQgcmVhZCAqLworICAgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCAoZ2ludDgpIDB4ODJ1LCBOVUxMKTsKKyAgICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgMHgwMXUsIE5VTEwpOworCisgICAgLyogc2VuZCBhIGJyb2tlbiA0dGggcmVhZCAqLworICAgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCAoZ2ludDgpIDB4ODJ1LCBOVUxMKTsKKyAgICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgMHgwMXUsIE5VTEwpOworICAgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3ZhcmludDMyICh0YywgMSwgTlVMTCk7CisKKyAgICAvKiBzZW5kIGEgdmFsaWQgbWVzc2FnZSAqLworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0NBTEwsIDEsIE5VTEwpID4gMCk7CisKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKworICAgIC8qIHNlbmQgYnJva2VuIHdyaXRlcyAqLworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDE7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfQ0FMTCwgMSwgTlVMTCkgPT0gLTEpOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDA7CisKKyAgICB0cmFuc3BvcnRfd3JpdGVfY291bnQgPSAwOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IDE7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfQ0FMTCwgMSwgTlVMTCkgPT0gLTEpOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IC0xOworCisgICAgdHJhbnNwb3J0X3dyaXRlX2NvdW50ID0gMDsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAyOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0NBTEwsIDEsIE5VTEwpID09IC0xKTsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAtMTsKKworICAgIHRyYW5zcG9ydF93cml0ZV9jb3VudCA9IDA7CisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gMzsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9DQUxMLCAxLCBOVUxMKSA9PSAtMSk7CisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gLTE7CisKKyAgICAvKiBjbGVhbiB1cCAqLworICAgIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworICAgIGdfb2JqZWN0X3VucmVmIChwcm90b2NvbCk7CisgICAgZ19hc3NlcnQgKHdhaXQgKCZzdGF0dXMpID09IHBpZCk7CisgICAgZ19hc3NlcnQgKHN0YXR1cyA9PSAwKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZAordGVzdF9yZWFkX2FuZF93cml0ZV9tYW55X2ZyYW1lcyAodm9pZCkKK3sKKyAgaW50IHN0YXR1czsKKyAgcGlkX3QgcGlkOworICBUaHJpZnRTb2NrZXQgKnRzb2NrZXQgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CisgIFRocmlmdEZyYW1lZFRyYW5zcG9ydCAqZnQgPSBOVUxMOworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKnRjID0gTlVMTDsKKyAgVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sID0gTlVMTDsKKyAgZ3BvaW50ZXIgYmluYXJ5ID0gKGdwb2ludGVyICopIFRFU1RfU1RSSU5HOworICBjb25zdCBndWludDMyIGxlbiA9IHN0cmxlbiAoVEVTVF9TVFJJTkcpOworICBpbnQgcG9ydCA9IFRFU1RfUE9SVDsKKworICAvKiBmb3JrIGEgc2VydmVyIGZyb20gdGhlIGNsaWVudCAqLworICBwaWQgPSBmb3JrICgpOworICBnX2Fzc2VydCAocGlkID49IDApOworCisgIGlmIChwaWQgPT0gMCkKKyAgeworICAgIC8qIGNoaWxkIGxpc3RlbnMgKi8KKyAgICB0aHJpZnRfc2VydmVyX21hbnlfZnJhbWVzIChwb3J0KTsKKyAgICBleGl0ICgwKTsKKyAgfSBlbHNlIHsKKyAgICAvKiBwYXJlbnQuICB3YWl0IGEgYml0IGZvciB0aGUgc29ja2V0IHRvIGJlIGNyZWF0ZWQuICovCisgICAgc2xlZXAgKDEpOworCisgICAgLyogY3JlYXRlIGEgVGhyaWZ0U29ja2V0ICovCisgICAgdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0c29ja2V0ICE9IE5VTEwpOworICAgIHRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpOworCisgICAgLyogd3JhcCBpbiBhIGZyYW1lZCB0cmFuc3BvcnQgKi8KKyAgICBmdCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCwgInRyYW5zcG9ydCIsIHRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIndfYnVmX3NpemUiLCAxLCBOVUxMKTsKKyAgICBnX2Fzc2VydCAoZnQgIT0gTlVMTCk7CisgICAgdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAoZnQpOworCisgICAgdGhyaWZ0X3RyYW5zcG9ydF9vcGVuICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW4gKHRyYW5zcG9ydCkpOworCisgICAgLyogY3JlYXRlIGEgY29tcGFjdCBwcm90b2NvbCAqLworICAgIHRjID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MLCAidHJhbnNwb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LCBOVUxMKTsKKyAgICBwcm90b2NvbCA9IFRIUklGVF9QUk9UT0NPTCAodGMpOworICAgIGdfYXNzZXJ0IChwcm90b2NvbCAhPSBOVUxMKTsKKworICAgIC8qIHdyaXRlIGEgYnVuY2ggb2YgcHJpbWl0aXZlcyAqLworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ib29sIChwcm90b2NvbCwgVEVTVF9CT09MLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgVEVTVF9CWVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMTYgKHByb3RvY29sLCBURVNUX0kxNiwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCBURVNUX0kzMiwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pNjQgKHByb3RvY29sLCBURVNUX0k2NCwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMTYgKHByb3RvY29sLCBURVNUX05JMTYsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgVEVTVF9OSTMyLCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2k2NCAocHJvdG9jb2wsIFRFU1RfTkk2NCwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMTYgKHByb3RvY29sLCAyLCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIDIsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTY0IChwcm90b2NvbCwgMiwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMTYgKHByb3RvY29sLCAtMiwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCAtMiwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pNjQgKHByb3RvY29sLCAtMiwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9kb3VibGUgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFU1RfRE9VQkxFLCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3N0cmluZyAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVTVF9TVFJJTkcsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc3RyaW5nIChwcm90b2NvbCwgIiIsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgYmluYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIGJpbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKworICAgIC8qIGNsZWFuIHVwICovCisgICAgdGhyaWZ0X3RyYW5zcG9ydF93cml0ZV9lbmQgKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX29iamVjdF91bnJlZiAoZnQpOworICAgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKKyAgICBnX29iamVjdF91bnJlZiAodGMpOworICAgIGdfYXNzZXJ0ICh3YWl0ICgmc3RhdHVzKSA9PSBwaWQpOworICAgIGdfYXNzZXJ0IChzdGF0dXMgPT0gMCk7CisgIH0KK30KKworCitzdGF0aWMgdm9pZAordGhyaWZ0X3NlcnZlcl9wcmltaXRpdmVzIChjb25zdCBpbnQgcG9ydCkKK3sKKyAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQgKmNsaWVudCA9IE5VTEw7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqdGMgPSBOVUxMOworICBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wgPSBOVUxMOworICBnYm9vbGVhbiB2YWx1ZV9ib29sZWFuID0gRkFMU0U7CisgIGdpbnQ4IHZhbHVlX2J5dGUgPSAwLAorICAgIHppZ3phZ19wMTYgPSAwLCB6aWd6YWdfcDMyID0gMCwgemlnemFnX3A2NCA9IDAsCisgICAgemlnemFnX24xNiA9IDAsIHppZ3phZ19uMzIgPSAwLCB6aWd6YWdfbjY0ID0gMDsKKyAgZ2ludDE2IHZhbHVlXzE2ID0gMDsKKyAgZ2ludDMyIHZhbHVlXzMyID0gMDsKKyAgZ2ludDY0IHZhbHVlXzY0ID0gMDsKKyAgZ2ludDE2IHZhbHVlX24xNiA9IDA7CisgIGdpbnQzMiB2YWx1ZV9uMzIgPSAwOworICBnaW50NjQgdmFsdWVfbjY0ID0gMDsKKyAgZ2RvdWJsZSB2YWx1ZV9kb3VibGUgPSAwOworICBnY2hhciAqc3RyaW5nID0gTlVMTDsKKyAgZ2NoYXIgKmVtcHR5X3N0cmluZyA9IE5VTEw7CisgIGdwb2ludGVyIGJpbmFyeSA9IE5VTEw7CisgIGd1aW50MzIgbGVuID0gMDsKKyAgdm9pZCAqY29tcGFyYXRvciA9ICh2b2lkICopIFRFU1RfU1RSSU5HOworCisgIFRocmlmdFNlcnZlclNvY2tldCAqdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOworICB0cmFuc3BvcnQgPSBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVCAodHNvY2tldCk7CisgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2xpc3RlbiAodHJhbnNwb3J0LCBOVUxMKTsKKyAgY2xpZW50ID0gdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0ICh0cmFuc3BvcnQsIE5VTEwpOworICBnX2Fzc2VydCAoY2xpZW50ICE9IE5VTEwpOworCisgIHRjID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MLCAidHJhbnNwb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgICBjbGllbnQsIE5VTEwpOworICBwcm90b2NvbCA9IFRIUklGVF9QUk9UT0NPTCAodGMpOworCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2Jvb2wgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfYm9vbGVhbiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ2YWx1ZV9ieXRlLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pMTYgKHByb3RvY29sLCAmdmFsdWVfMTYsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICZ2YWx1ZV8zMiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTY0IChwcm90b2NvbCwgJnZhbHVlXzY0LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pMTYgKHByb3RvY29sLCAmdmFsdWVfbjE2LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmdmFsdWVfbjMyLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pNjQgKHByb3RvY29sLCAmdmFsdWVfbjY0LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnppZ3phZ19wMTYsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmemlnemFnX3AzMiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ6aWd6YWdfcDY0LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnppZ3phZ19uMTYsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmemlnemFnX24zMiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ6aWd6YWdfbjY0LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9kb3VibGUgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9kb3VibGUsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3N0cmluZyAocHJvdG9jb2wsICZzdHJpbmcsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3N0cmluZyAocHJvdG9jb2wsICZlbXB0eV9zdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2JpbmFyeSAocHJvdG9jb2wsICZiaW5hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbiwgTlVMTCkgPiAwKTsKKworICBnX2Fzc2VydCAodmFsdWVfYm9vbGVhbiA9PSBURVNUX0JPT0wpOworICBnX2Fzc2VydCAodmFsdWVfYnl0ZSA9PSBURVNUX0JZVEUpOworICBnX2Fzc2VydCAodmFsdWVfMTYgPT0gVEVTVF9JMTYpOworICBnX2Fzc2VydCAodmFsdWVfMzIgPT0gVEVTVF9JMzIpOworICBnX2Fzc2VydCAodmFsdWVfNjQgPT0gVEVTVF9JNjQpOworICBnX2Fzc2VydCAodmFsdWVfbjE2ID09IFRFU1RfTkkxNik7CisgIGdfYXNzZXJ0ICh2YWx1ZV9uMzIgPT0gVEVTVF9OSTMyKTsKKyAgZ19hc3NlcnQgKHZhbHVlX242NCA9PSBURVNUX05JNjQpOworICBnX2Fzc2VydCAoemlnemFnX3AxNiA9PSA0KTsKKyAgZ19hc3NlcnQgKHppZ3phZ19wMzIgPT0gNCk7CisgIGdfYXNzZXJ0ICh6aWd6YWdfcDY0ID09IDQpOworICBnX2Fzc2VydCAoemlnemFnX24xNiA9PSAzKTsKKyAgZ19hc3NlcnQgKHppZ3phZ19uMzIgPT0gMyk7CisgIGdfYXNzZXJ0ICh6aWd6YWdfbjY0ID09IDMpOworICBnX2Fzc2VydCAodmFsdWVfZG91YmxlID09IFRFU1RfRE9VQkxFKTsKKyAgZ19hc3NlcnQgKHN0cmNtcCAoVEVTVF9TVFJJTkcsIHN0cmluZykgPT0gMCk7CisgIGdfYXNzZXJ0IChzdHJjbXAgKCIiLCBlbXB0eV9zdHJpbmcpID09IDApOworICBnX2Fzc2VydCAobWVtY21wIChjb21wYXJhdG9yLCBiaW5hcnksIGxlbikgPT0gMCk7CisKKyAgZ19mcmVlIChzdHJpbmcpOworICBnX2ZyZWUgKGVtcHR5X3N0cmluZyk7CisgIGdfZnJlZSAoYmluYXJ5KTsKKworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKHByb3RvY29sLCAmYmluYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAoYmluYXJ5ID09IE5VTEwpOworICBnX2Fzc2VydCAobGVuID09IDApOworICBnX2ZyZWUgKGJpbmFyeSk7CisKKyAgdHJhbnNwb3J0X3JlYWRfY291bnQgPSAwOworICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IDA7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2JpbmFyeSAocHJvdG9jb2wsICZiaW5hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbiwgTlVMTCkgPT0gLTEpOworICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IC0xOworCisgIHRyYW5zcG9ydF9yZWFkX2NvdW50ID0gMDsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAxOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKHByb3RvY29sLCAmYmluYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4sIE5VTEwpID09IC0xKTsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAtMTsKKworICB0cmFuc3BvcnRfcmVhZF9lcnJvciA9IDE7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2Jvb2wgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfYm9vbGVhbiwgTlVMTCkgPT0gLTEpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2J5dGUsIE5VTEwpID09IC0xKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTE2IChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfMTYsIE5VTEwpID09IC0xKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJnZhbHVlXzMyLCBOVUxMKSA9PSAtMSk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2k2NCAocHJvdG9jb2wsICZ2YWx1ZV82NCwgTlVMTCkgPT0gLTEpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pMTYgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9uMTYsIE5VTEwpID09IC0xKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJnZhbHVlX24zMiwgTlVMTCkgPT0gLTEpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pNjQgKHByb3RvY29sLCAmdmFsdWVfbjY0LCBOVUxMKSA9PSAtMSk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2RvdWJsZSAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2RvdWJsZSwgTlVMTCkgPT0gLTEpOworICB0cmFuc3BvcnRfcmVhZF9lcnJvciA9IDA7CisKKyAgLyogdGVzdCBwYXJ0aWFsIHdyaXRlIGZhaWx1cmUgKi8KKyAgdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJnZhbHVlXzMyLCBOVUxMKTsKKworICB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kIChjbGllbnQsIE5VTEwpOworICB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlIChjbGllbnQsIE5VTEwpOworCisgIGdfb2JqZWN0X3VucmVmICh0Yyk7CisgIGdfb2JqZWN0X3VucmVmIChjbGllbnQpOworICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfc2VydmVyX2NvbXBsZXhfdHlwZXMgKGNvbnN0IGludCBwb3J0KQoreworICBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCAqY2xpZW50ID0gTlVMTDsKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICp0YyA9IE5VTEw7CisgIFRocmlmdFByb3RvY29sICpwcm90b2NvbCA9IE5VTEw7CisgIGdjaGFyICpzdHJ1Y3RfbmFtZSA9IE5VTEw7CisgIGdjaGFyICpmaWVsZF9uYW1lID0gTlVMTDsKKyAgZ2NoYXIgKm1lc3NhZ2VfbmFtZSA9IE5VTEw7CisgIFRocmlmdFR5cGUgZWxlbWVudF90eXBlLCBrZXlfdHlwZSwgdmFsdWVfdHlwZSwgZmllbGRfdHlwZTsKKyAgVGhyaWZ0TWVzc2FnZVR5cGUgbWVzc2FnZV90eXBlOworICBnYm9vbGVhbiB2YWx1ZV9ib29sZWFuID0gISBURVNUX0JPT0w7CisgIGdpbnQ4IHZhbHVlID0gMDsKKyAgZ2ludDE2IGZpZWxkX2lkID0gMDsKKyAgZ3VpbnQzMiBzaXplID0gMDsKKyAgZ2ludDMyIHNlcWlkID0gMDsKKyAgZ2ludDggdmVyc2lvbl9hbmRfdHlwZSA9IDA7CisgIGdpbnQ4IHByb3RvY29sX2lkID0gMDsKKworICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKKyAgdHJhbnNwb3J0ID0gVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlQgKHRzb2NrZXQpOworICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKHRyYW5zcG9ydCwgTlVMTCk7CisgIGNsaWVudCA9IHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgZ19hc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKKworICB0YyA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTCwgInRyYW5zcG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LCBOVUxMKTsKKyAgcHJvdG9jb2wgPSBUSFJJRlRfUFJPVE9DT0wgKHRjKTsKKworICAvKiB0ZXN0IHN0cnVjdCBvcGVyYXRpb25zICovCisKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfYmVnaW4gKHByb3RvY29sLCAmc3RydWN0X25hbWUsIE5VTEwpOworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9lbmQgKHByb3RvY29sLCBOVUxMKTsKKworICAvKiB0ZXN0IGZpZWxkIHN0YXRlIHcuci50LiBkZWx0YXMgKi8KKworICBmaWVsZF9pZCA9IDA7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA9PSAxKTsKKyAgZ19hc3NlcnQgKGZpZWxkX2lkID09IDEpOworICBmaWVsZF9pZCA9IDA7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA9PSAxKTsKKyAgZ19hc3NlcnQgKGZpZWxkX2lkID09IDE2KTsKKyAgZmllbGRfaWQgPSAwOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPT0gMSk7CisgIGdfYXNzZXJ0IChmaWVsZF9pZCA9PSAxNyk7CisgIGZpZWxkX2lkID0gMDsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID4gMSk7CisgIGdfYXNzZXJ0IChmaWVsZF9pZCA9PSAxNSk7CisgIGZpZWxkX2lkID0gMDsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID09IDEpOworICBnX2Fzc2VydCAoZmllbGRfaWQgPT0gMzApOworICBmaWVsZF9pZCA9IDA7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA+IDEpOworICBnX2Fzc2VydCAoZmllbGRfaWQgPT0gNDYpOworICBmaWVsZF9pZCA9IDA7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA9PSAxKTsKKyAgZ19hc3NlcnQgKGZpZWxkX2lkID09IDQ3KTsKKyAgZmllbGRfaWQgPSAwOworCisgIC8qIHRlc3QgZmllbGQgb3BlcmF0aW9ucyAqLworCisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKTsKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKTsKKworICAvKiB0ZXN0IGZpZWxkIHN0YXRlIHcuci50LiBzdHJ1Y3RzICovCisKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID4gMSk7CisgIGdfYXNzZXJ0IChmaWVsZF9pZCA9PSAxKTsKKyAgZmllbGRfaWQgPSAwOworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPT0gMSk7CisgIGdfYXNzZXJ0IChmaWVsZF9pZCA9PSAxNik7CisgIGZpZWxkX2lkID0gMDsKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKTsKKworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfYmVnaW4gKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RydWN0X25hbWUsIE5VTEwpID09IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPiAxKTsKKyAgZ19hc3NlcnQgKGZpZWxkX2lkID09IDE3KTsKKyAgZmllbGRfaWQgPSAwOworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpOworCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9iZWdpbiAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJ1Y3RfbmFtZSwgTlVMTCkgPT0gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA+IDEpOworICBnX2Fzc2VydCAoZmllbGRfaWQgPT0gMTgpOworICBmaWVsZF9pZCA9IDA7CisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA9PSAxKTsKKyAgZ19hc3NlcnQgKGZpZWxkX2lkID09IDE5KTsKKyAgZmllbGRfaWQgPSAwOworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID09IDEpOworICBnX2Fzc2VydCAoZmllbGRfaWQgPT0gMTgpOworICBmaWVsZF9pZCA9IDA7CisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA9PSAxKTsKKyAgZ19hc3NlcnQgKGZpZWxkX2lkID09IDI1KTsKKyAgZmllbGRfaWQgPSAwOworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID09IDEpOworICBnX2Fzc2VydCAoZmllbGRfaWQgPT0gMTcpOworICBmaWVsZF9pZCA9IDA7CisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCk7CisKKyAgLyogdGVzdCBmaWVsZCBzdGF0ZSB3LnIudC4gYm9vbHMgKi8KKworICAvKiBkZWx0YXMgKi8KKyAgLyogbm9uLWJvb2wgZmllbGQgLT4gYm9vbCBmaWVsZCAtPiBub24tYm9vbCBmaWVsZCAqLworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPT0gMSk7CisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA9PSAxKTsKKyAgZ19hc3NlcnQgKGZpZWxkX3R5cGUgPT0gVF9CT09MKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYm9vbCAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9ib29sZWFuLCBOVUxMKSA9PSAwKTsKKyAgZ19hc3NlcnQgKHZhbHVlX2Jvb2xlYW4gPT0gVEVTVF9CT09MKTsKKyAgdmFsdWVfYm9vbGVhbiA9ICEgVEVTVF9CT09MOworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPT0gMSk7CisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCk7CisgIC8qIGJvb2wgLT4gYm9vbCBmaWVsZCAtPiBib29sICovCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2Jvb2wgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfYm9vbGVhbiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHZhbHVlX2Jvb2xlYW4gPT0gVEVTVF9CT09MKTsKKyAgdmFsdWVfYm9vbGVhbiA9ICEgVEVTVF9CT09MOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPT0gMSk7CisgIGdfYXNzZXJ0IChmaWVsZF90eXBlID09IFRfQk9PTCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2Jvb2wgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfYm9vbGVhbiwgTlVMTCkgPT0gMCk7CisgIGdfYXNzZXJ0ICh2YWx1ZV9ib29sZWFuID09IFRFU1RfQk9PTCk7CisgIHZhbHVlX2Jvb2xlYW4gPSAhIFRFU1RfQk9PTDsKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYm9vbCAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9ib29sZWFuLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodmFsdWVfYm9vbGVhbiA9PSBURVNUX0JPT0wpOworICB2YWx1ZV9ib29sZWFuID0gISBURVNUX0JPT0w7CisKKyAgLyogbm8gZGVsdGFzICovCisgIC8qIG5vbi1ib29sIGZpZWxkIC0+IGJvb2wgZmllbGQgLT4gbm9uLWJvb2wgZmllbGQgKi8KKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID4gMSk7CisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA+IDEpOworICBnX2Fzc2VydCAoZmllbGRfdHlwZSA9PSBUX0JPT0wpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ib29sIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2Jvb2xlYW4sIE5VTEwpID09IDApOworICBnX2Fzc2VydCAodmFsdWVfYm9vbGVhbiA9PSBURVNUX0JPT0wpOworICB2YWx1ZV9ib29sZWFuID0gISBURVNUX0JPT0w7CisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA+IDEpOworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpOworICAvKiBib29sIC0+IGJvb2wgZmllbGQgLT4gYm9vbCAqLworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ib29sIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2Jvb2xlYW4sIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh2YWx1ZV9ib29sZWFuID09IFRFU1RfQk9PTCk7CisgIHZhbHVlX2Jvb2xlYW4gPSAhIFRFU1RfQk9PTDsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID4gMSk7CisgIGdfYXNzZXJ0IChmaWVsZF90eXBlID09IFRfQk9PTCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2Jvb2wgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfYm9vbGVhbiwgTlVMTCkgPT0gMCk7CisgIGdfYXNzZXJ0ICh2YWx1ZV9ib29sZWFuID09IFRFU1RfQk9PTCk7CisgIHZhbHVlX2Jvb2xlYW4gPSAhIFRFU1RfQk9PTDsKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYm9vbCAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9ib29sZWFuLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodmFsdWVfYm9vbGVhbiA9PSBURVNUX0JPT0wpOworICB2YWx1ZV9ib29sZWFuID0gISBURVNUX0JPT0w7CisKKyAgLyogdGVzdCBmaXJzdCByZWFkIGVycm9yIG9uIGEgZmllbGQgKi8KKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPSAxOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfbmFtZSwgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID09IC0xKTsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPSAwOworCisgIC8qIHRlc3QgMm5kIHdyaXRlIGZhaWx1cmUgKi8KKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnZhbHVlLCBOVUxMKTsKKworICAvKiB0ZXN0IDJuZCByZWFkIGZhaWx1cmUgb24gYSBmaWVsZCAqLworICB0cmFuc3BvcnRfcmVhZF9jb3VudCA9IDA7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gMTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX25hbWUsICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA9PSAtMSk7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gLTE7CisKKyAgLyogdGVzdCBmaWVsZCBzdG9wICovCisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKTsKKworICAvKiB0ZXN0IG1hcCBvcGVyYXRpb25zICovCisKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tYXBfYmVnaW4gKHByb3RvY29sLCAma2V5X3R5cGUsICZ2YWx1ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwgTlVMTCk7CisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbWFwX2VuZCAocHJvdG9jb2wsIE5VTEwpOworCisgIC8qIHRlc3QgMXN0IHJlYWQgZmFpbHVyZSBvbiBhIG1hcCAqLworICB0cmFuc3BvcnRfcmVhZF9jb3VudCA9IDA7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gMDsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbWFwX2JlZ2luIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5X3R5cGUsICZ2YWx1ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLCBOVUxMKSA9PSAtMSk7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gLTE7CisKKyAgLyogdGVzdCAybmQgcmVhZCBmYWlsdXJlIG9uIGEgbWFwICovCisgIHRyYW5zcG9ydF9yZWFkX2NvdW50ID0gMDsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAxOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tYXBfYmVnaW4gKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlfdHlwZSwgJnZhbHVlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsIE5VTEwpID09IC0xKTsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAtMTsKKworICAvKiB0ZXN0IDFzdCB3cml0ZSBmYWlsdXJlIG9uIG1hcC0tLW5vdGhpbmcgdG8gZG8gb24gb3VyIHNpZGUgKi8KKworICAvKiB0ZXN0IDJuZCB3cml0ZSBmYWlsdXJlICovCisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ2YWx1ZSwgTlVMTCk7CisKKyAgLyogdGVzdCBuZWdhdGl2ZSBtYXAgc2l6ZSAqLworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tYXBfYmVnaW4gKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlfdHlwZSwgJnZhbHVlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsIE5VTEwpID09IC0xKTsKKworICAvKiB0ZXN0IGxpc3Qgb3BlcmF0aW9ucyAqLworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2xpc3RfYmVnaW4gKHByb3RvY29sLCAmZWxlbWVudF90eXBlLCAmc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9saXN0X2VuZCAocHJvdG9jb2wsIE5VTEwpOworCisgIC8qIHRlc3Qgc21hbGwgbGlzdCAxc3QgcmVhZCBmYWlsdXJlICovCisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbGlzdF9iZWdpbiAocHJvdG9jb2wsICZlbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLCBOVUxMKSA9PSAtMSk7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMDsKKworICAvKiB0ZXN0IGJpZyBsaXN0IDFzdCByZWFkIGZhaWx1cmUgKi8KKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPSAxOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9saXN0X2JlZ2luIChwcm90b2NvbCwgJmVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsIE5VTEwpID09IC0xKTsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPSAwOworCisgIC8qIHRlc3QgYmlnIGxpc3QgMm5kIHJlYWQgZmFpbHVyZSAqLworICB0cmFuc3BvcnRfcmVhZF9jb3VudCA9IDA7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gMTsKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9saXN0X2JlZ2luIChwcm90b2NvbCwgJmVsZW1lbnRfdHlwZSwgJnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gLTE7CisKKyAgLyogdGVzdCBuZWdhdGl2ZSBsaXN0IHNpemUgZmFpbHVyZSAqLworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2xpc3RfYmVnaW4gKHByb3RvY29sLCAmZWxlbWVudF90eXBlLCAmc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAvKiB0ZXN0IHNtYWxsIGxpc3QgMXN0IHdyaXRlIGZhaWx1cmUtLS1ub3RoaW5nIHRvIGRvIG9uIG91ciBlbmQgKi8KKworICAvKiB0ZXN0IGJpZyBsaXN0IDFzdCB3cml0ZSBmYWlsdXJlLS0tbm90aGluZyB0byBkbyBvbiBvdXIgZW5kICovCisKKyAgLyogdGVzdCBiaWcgbGlzdCAybmQgd3JpdGUgZmFpbHVyZSAqLworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmdmFsdWUsIE5VTEwpOworCisgIC8qIHRlc3Qgc2V0IG9wZXJhdGlvbnMgKi8KKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zZXRfYmVnaW4gKHByb3RvY29sLCAmZWxlbWVudF90eXBlLCAmc2l6ZSwgTlVMTCk7CisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc2V0X2VuZCAocHJvdG9jb2wsIE5VTEwpOworCisgIC8qIGJyb2tlbiByZWFkICovCisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlX3R5cGUsICZzZXFpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPT0gLTEpOworICB0cmFuc3BvcnRfcmVhZF9lcnJvciA9IDA7CisKKyAgLyogaW52YWxpZCBwcm90b2NvbCAqLworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lc3NhZ2VfdHlwZSwgJnNlcWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA9PSAtMSk7CisKKyAgLyogaW52YWxpZCB2ZXJzaW9uICovCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZV90eXBlLCAmc2VxaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IC0xKTsKKworICAvKiByZWFkIGEgdmFsaWQgbWVzc2FnZSAqLworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lc3NhZ2VfdHlwZSwgJnNlcWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA+IDApOworICBnX2ZyZWUgKG1lc3NhZ2VfbmFtZSk7CisKKyAgLyogYnJva2VuIDJuZCByZWFkIG9uIGEgbWVzc2FnZSAqLworICB0cmFuc3BvcnRfcmVhZF9jb3VudCA9IDA7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gMTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlX3R5cGUsICZzZXFpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPT0gLTEpOworICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IC0xOworCisgIC8qIGJyb2tlbiAzcmQgcmVhZCBvbiBhIG1lc3NhZ2UgKi8KKyAgdHJhbnNwb3J0X3JlYWRfY291bnQgPSAwOworICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IDI7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZV90eXBlLCAmc2VxaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IC0xKTsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAtMTsKKworICAvKiBicm9rZW4gNHRoIHJlYWQgb24gYSBtZXNzYWdlICovCisgIHRyYW5zcG9ydF9yZWFkX2NvdW50ID0gMDsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAzOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lc3NhZ2VfdHlwZSwgJnNlcWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA9PSAtMSk7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gLTE7CisKKyAgLyogcmVhZCBhIHZhbGlkIG1lc3NhZ2UgKi8KKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlX3R5cGUsICZzZXFpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPiAwKTsKKyAgZ19mcmVlIChtZXNzYWdlX25hbWUpOworCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisKKyAgLyogaGFuZGxlIDJuZCB3cml0ZSBmYWlsdXJlIG9uIGEgbWVzc2FnZSAqLworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmcHJvdG9jb2xfaWQsIE5VTEwpOworCisgIC8qIGhhbmRsZSAzcmQgd3JpdGUgZmFpbHVyZSBvbiBhIG1lc3NhZ2UgKi8KKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnByb3RvY29sX2lkLCBOVUxMKTsKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnZlcnNpb25fYW5kX3R5cGUsIE5VTEwpOworCisgIC8qIGhhbmRsZSA0dGggd3JpdGUgZmFpbHVyZSBvbiBhIG1lc3NhZ2UgKi8KKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnByb3RvY29sX2lkLCBOVUxMKTsKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnZlcnNpb25fYW5kX3R5cGUsIE5VTEwpOworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3ZhcmludDMyICh0YywgJnNlcWlkLCBOVUxMKTsKKworICBnX29iamVjdF91bnJlZiAoY2xpZW50KTsKKyAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X3NlcnZlcl9tYW55X2ZyYW1lcyAoY29uc3QgaW50IHBvcnQpCit7CisgIFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICpjbGllbnQgPSBOVUxMOworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKnRjcCA9IE5VTEw7CisgIFRocmlmdFByb3RvY29sICpwcm90b2NvbCA9IE5VTEw7CisgIFRocmlmdFNlcnZlclNvY2tldCAqdHNvY2tldCA9IE5VTEw7CisgIGdib29sZWFuIHZhbHVlX2Jvb2xlYW4gPSBGQUxTRTsKKyAgZ2ludDggdmFsdWVfYnl0ZSA9IDAsCisgICAgemlnemFnX3AxNiA9IDAsIHppZ3phZ19wMzIgPSAwLCB6aWd6YWdfcDY0ID0gMCwKKyAgICB6aWd6YWdfbjE2ID0gMCwgemlnemFnX24zMiA9IDAsIHppZ3phZ19uNjQgPSAwOworICBnaW50MTYgdmFsdWVfMTYgPSAwOworICBnaW50MzIgdmFsdWVfMzIgPSAwOworICBnaW50NjQgdmFsdWVfNjQgPSAwOworICBnaW50MTYgdmFsdWVfbjE2ID0gMDsKKyAgZ2ludDMyIHZhbHVlX24zMiA9IDA7CisgIGdpbnQ2NCB2YWx1ZV9uNjQgPSAwOworICBnZG91YmxlIHZhbHVlX2RvdWJsZSA9IDA7CisgIGdjaGFyICpzdHJpbmcgPSBOVUxMOworICBnY2hhciAqZW1wdHlfc3RyaW5nID0gTlVMTDsKKyAgZ3BvaW50ZXIgYmluYXJ5ID0gTlVMTDsKKyAgZ3VpbnQzMiBsZW4gPSAwOworICB2b2lkICpjb21wYXJhdG9yID0gKHZvaWQgKikgVEVTVF9TVFJJTkc7CisKKyAgdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCwgInBvcnQiLCBwb3J0LCBOVUxMKTsKKyAgdHJhbnNwb3J0ID0gVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlQgKHRzb2NrZXQpOworICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKHRyYW5zcG9ydCwgTlVMTCk7CisKKyAgLyogd3JhcCB0aGUgY2xpZW50IGluIGEgZnJhbWVkIHRyYW5zcG9ydCAqLworICBjbGllbnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQsICJ0cmFuc3BvcnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAodHJhbnNwb3J0LCBOVUxMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAicl9idWZfc2l6ZSIsIDEsIE5VTEwpOworICBnX2Fzc2VydCAoY2xpZW50ICE9IE5VTEwpOworCisgIHRjcCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTCwgInRyYW5zcG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LCBOVUxMKTsKKyAgcHJvdG9jb2wgPSBUSFJJRlRfUFJPVE9DT0wgKHRjcCk7CisKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYm9vbCAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9ib29sZWFuLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnZhbHVlX2J5dGUsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2kxNiAocHJvdG9jb2wsICZ2YWx1ZV8xNiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJnZhbHVlXzMyLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pNjQgKHByb3RvY29sLCAmdmFsdWVfNjQsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2kxNiAocHJvdG9jb2wsICZ2YWx1ZV9uMTYsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICZ2YWx1ZV9uMzIsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2k2NCAocHJvdG9jb2wsICZ2YWx1ZV9uNjQsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmemlnemFnX3AxNiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ6aWd6YWdfcDMyLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnppZ3phZ19wNjQsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmemlnemFnX24xNiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ6aWd6YWdfbjMyLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnppZ3phZ19uNjQsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2RvdWJsZSAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2RvdWJsZSwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc3RyaW5nIChwcm90b2NvbCwgJnN0cmluZywgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc3RyaW5nIChwcm90b2NvbCwgJmVtcHR5X3N0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYmluYXJ5IChwcm90b2NvbCwgJmJpbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuLCBOVUxMKSA+IDApOworCisgIGdfYXNzZXJ0ICh2YWx1ZV9ib29sZWFuID09IFRFU1RfQk9PTCk7CisgIGdfYXNzZXJ0ICh2YWx1ZV9ieXRlID09IFRFU1RfQllURSk7CisgIGdfYXNzZXJ0ICh2YWx1ZV8xNiA9PSBURVNUX0kxNik7CisgIGdfYXNzZXJ0ICh2YWx1ZV8zMiA9PSBURVNUX0kzMik7CisgIGdfYXNzZXJ0ICh2YWx1ZV82NCA9PSBURVNUX0k2NCk7CisgIGdfYXNzZXJ0ICh2YWx1ZV9uMTYgPT0gVEVTVF9OSTE2KTsKKyAgZ19hc3NlcnQgKHZhbHVlX24zMiA9PSBURVNUX05JMzIpOworICBnX2Fzc2VydCAodmFsdWVfbjY0ID09IFRFU1RfTkk2NCk7CisgIGdfYXNzZXJ0ICh6aWd6YWdfcDE2ID09IDQpOworICBnX2Fzc2VydCAoemlnemFnX3AzMiA9PSA0KTsKKyAgZ19hc3NlcnQgKHppZ3phZ19wNjQgPT0gNCk7CisgIGdfYXNzZXJ0ICh6aWd6YWdfbjE2ID09IDMpOworICBnX2Fzc2VydCAoemlnemFnX24zMiA9PSAzKTsKKyAgZ19hc3NlcnQgKHppZ3phZ19uNjQgPT0gMyk7CisgIGdfYXNzZXJ0ICh2YWx1ZV9kb3VibGUgPT0gVEVTVF9ET1VCTEUpOworICBnX2Fzc2VydCAoc3RyY21wIChURVNUX1NUUklORywgc3RyaW5nKSA9PSAwKTsKKyAgZ19hc3NlcnQgKHN0cmNtcCAoIiIsIGVtcHR5X3N0cmluZykgPT0gMCk7CisgIGdfYXNzZXJ0IChtZW1jbXAgKGNvbXBhcmF0b3IsIGJpbmFyeSwgbGVuKSA9PSAwKTsKKworICBnX2ZyZWUgKHN0cmluZyk7CisgIGdfZnJlZSAoZW1wdHlfc3RyaW5nKTsKKyAgZ19mcmVlIChiaW5hcnkpOworCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2JpbmFyeSAocHJvdG9jb2wsICZiaW5hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4sIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0IChiaW5hcnkgPT0gTlVMTCk7CisgIGdfYXNzZXJ0IChsZW4gPT0gMCk7CisgIGdfZnJlZSAoYmluYXJ5KTsKKworICB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kIChjbGllbnQsIE5VTEwpOworICB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlIChjbGllbnQsIE5VTEwpOworCisgIGdfb2JqZWN0X3VucmVmICh0Y3ApOworICBnX29iamVjdF91bnJlZiAoY2xpZW50KTsKKyAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworfQorCitpbnQKK21haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisjaWYgKCFHTElCX0NIRUNLX1ZFUlNJT04gKDIsIDM2LCAwKSkKKyAgZ190eXBlX2luaXQgKCk7CisjZW5kaWYKKworICBnX3Rlc3RfaW5pdCAoJmFyZ2MsICZhcmd2LCBOVUxMKTsKKworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdGNvbXBhY3Rwcm90b2NvbC9DcmVhdGVBbmREZXN0cm95IiwKKyAgICAgICAgICAgICAgICAgICB0ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveSk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0Y29tcGFjdHByb3RvY29sL0luaXRpYWxpemUiLCB0ZXN0X2luaXRpYWxpemUpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdGNvbXBhY3Rwcm90b2NvbC9SZWFkQW5kV3JpdGVQcmltaXRpdmVzIiwKKyAgICAgICAgICAgICAgICAgICB0ZXN0X3JlYWRfYW5kX3dyaXRlX3ByaW1pdGl2ZXMpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdGNvbXBhY3Rwcm90b2NvbC9SZWFkQW5kV3JpdGVDb21wbGV4VHlwZXMiLAorICAgICAgICAgICAgICAgICAgIHRlc3RfcmVhZF9hbmRfd3JpdGVfY29tcGxleF90eXBlcyk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0Y29tcGFjdHByb3RvY29sL1JlYWRBbmRXcml0ZU1hbnlGcmFtZXMiLAorICAgICAgICAgICAgICAgICAgIHRlc3RfcmVhZF9hbmRfd3JpdGVfbWFueV9mcmFtZXMpOworCisgIHJldHVybiBnX3Rlc3RfcnVuICgpOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3Rjb250YWluZXJ0ZXN0LmMgYi9saWIvY19nbGliL3Rlc3QvdGVzdGNvbnRhaW5lcnRlc3QuYwppbmRleCA4NTIyNTRiLi41ZmM1MWQ1IDEwMDY0NAotLS0gYS9saWIvY19nbGliL3Rlc3QvdGVzdGNvbnRhaW5lcnRlc3QuYworKysgYi9saWIvY19nbGliL3Rlc3QvdGVzdGNvbnRhaW5lcnRlc3QuYwpAQCAtNTA3LDE4ICs1MDcsMTcgQEAKIAogICAgIC8qIE1ha2Ugc3VyZSB0aGUgc2VydmVyIHN0b3BwZWQgb25seSBiZWNhdXNlIGl0IHdhcyBpbnRlcnJ1cHRlZCAoYnkgdGhlCiAgICAgICAgY2hpbGQgcHJvY2VzcyB0ZXJtaW5hdGluZykgKi8KLSAgICBnX2Fzc2VydCAoZ19lcnJvcl9tYXRjaGVzIChlcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUl9BQ0NFUFQpKTsKKyAgICBnX2Fzc2VydCghZXJyb3IgfHwgZ19lcnJvcl9tYXRjaGVzKGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUl9BQ0NFUFQpKTsKIAogICAgIC8qIEZyZWUgb3VyIHJlc291cmNlcyAqLwotICAgIGdfb2JqZWN0X3VucmVmIChzZXJ2ZXIpOwotICAgIGdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnRfZmFjdG9yeSk7Ci0gICAgZ19vYmplY3RfdW5yZWYgKHByb3RvY29sX2ZhY3RvcnkpOwotICAgIGdfb2JqZWN0X3VucmVmIChzZXJ2ZXJfdHJhbnNwb3J0KTsKLQotICAgIGdfb2JqZWN0X3VucmVmIChwcm9jZXNzb3IpOwotICAgIGdfb2JqZWN0X3VucmVmIChoYW5kbGVyKTsKKyAgICBnX2NsZWFyX29iamVjdCAoJnNlcnZlcik7CisgICAgZ19jbGVhcl9vYmplY3QgKCZwcm90b2NvbF9mYWN0b3J5KTsKKyAgICBnX2NsZWFyX29iamVjdCAoJnRyYW5zcG9ydF9mYWN0b3J5KTsKKyAgICBnX2NsZWFyX29iamVjdCAoJnNlcnZlcl90cmFuc3BvcnQpOworICAgIGdfY2xlYXJfb2JqZWN0ICgmcHJvY2Vzc29yKTsKKyAgICBnX2NsZWFyX29iamVjdCAoJmhhbmRsZXIpOwogCiAgICAgLyogV2FpdCBmb3IgdGhlIGNoaWxkIHByb2Nlc3MgdG8gY29tcGxldGUgYW5kIHJldHVybiBpdHMgZXhpdCBzdGF0dXMgKi8KICAgICBnX2Fzc2VydCAod2FpdCAoJnN0YXR1cykgPT0gcGlkKTsKQEAgLTUyNyw0ICs1MjYsNCBAQAogCiAgICAgcmV0dXJuIGV4aXRfc3RhdHVzOwogICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3RkZWJ1Z3Byb3RvLmMgYi9saWIvY19nbGliL3Rlc3QvdGVzdGRlYnVncHJvdG8uYwppbmRleCA3MDNkZmYwLi4xMDlhNDhiIDEwMDY0NAotLS0gYS9saWIvY19nbGliL3Rlc3QvdGVzdGRlYnVncHJvdG8uYworKysgYi9saWIvY19nbGliL3Rlc3QvdGVzdGRlYnVncHJvdG8uYwpAQCAtMTcsNyArMTcsNiBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPG1hdGguaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgpAQCAtMTQ2LDcgKzE0NSw3IEBACiAKICAgZ19hc3NlcnRfY21waW50IChhX2JpdGUsICAgID09LCAweDdmKTsKICAgZ19hc3NlcnRfY21waW50IChpbnRlZ2VyMTYsID09LCAweDdmZmYpOwotICBnX2Fzc2VydF9jbXBpbnQgKGludGVnZXI2NCwgPT0sIDEwMDAwMDAwMDAwKTsKKyAgZ19hc3NlcnRfY21waW50IChpbnRlZ2VyNjQsID09LCBHX0dJTlQ2NF9DT05TVEFOVCAoMTAwMDAwMDAwMDApKTsKIAogICBnX2Fzc2VydCAoYnl0ZV9saXN0ICE9IE5VTEwpOwogICBnX2Fzc2VydF9jbXBpbnQgKGJ5dGVfbGlzdC0+bGVuLCA9PSwgMyk7CkBAIC0xNzksOCArMTc4LDExIEBACiAgIHN0YXRpYyBjb25zdCBnaW50MTYgaW5pdGlhbF9pMTZfbGlzdFs1XSA9IHsgNDE4MSwgNjc2NSwgMTA5NDYsIDE3NzExLCAyODY1NyB9OwogICBzdGF0aWMgY29uc3QgZ2ludDY0IGluaXRpYWxfaTY0X2xpc3RbNV0gPQogICAgIHsKLSAgICAgIDExMDAwODc3NzgzNjYxMDE5MzEsIDE3Nzk5Nzk0MTYwMDQ3MTQxODksIDI4ODAwNjcxOTQzNzA4MTYxMjAsCi0gICAgICA0NjYwMDQ2NjEwMzc1NTMwMzA5LCA3NTQwMTEzODA0NzQ2MzQ2NDI5CisgICAgICBHX0dJTlQ2NF9DT05TVEFOVCAoMTEwMDA4Nzc3ODM2NjEwMTkzMSksCisgICAgICBHX0dJTlQ2NF9DT05TVEFOVCAoMTc3OTk3OTQxNjAwNDcxNDE4OSksCisgICAgICBHX0dJTlQ2NF9DT05TVEFOVCAoMjg4MDA2NzE5NDM3MDgxNjEyMCksCisgICAgICBHX0dJTlQ2NF9DT05TVEFOVCAoNDY2MDA0NjYxMDM3NTUzMDMwOSksCisgICAgICBHX0dJTlQ2NF9DT05TVEFOVCAoNzU0MDExMzgwNDc0NjM0NjQyOSkKICAgICB9OwogICBzdGF0aWMgY29uc3QgZ3VpbnQ4IGluaXRpYWxfYmFzZTY0WzhdID0KICAgICB7CkBAIC0yMTYsMjIgKzIxOCwyMyBAQAogICBnX2FycmF5X2FwcGVuZF92YWxzIChpNjRfbGlzdCwgaW5pdGlhbF9pNjRfbGlzdCwgNSk7CiAKICAgLyogQWxsIG9mIE9uZU9mRWFjaCdzIHByb3BlcnRpZXMgY2FuIGJlIHNldCBhdCBjb25zdHJ1Y3Rpb24uLi4gKi8KLSAgb25lX29mX2VhY2ggPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX09ORV9PRl9FQUNILAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImltX3RydWUiLCAgICAgICAgICBUUlVFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImltX2ZhbHNlIiwgICAgICAgICBGQUxTRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhX2JpdGUiLCAgICAgICAgICAgMHg1MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnRlZ2VyMTYiLCAgICAgICAgMHg3ZTU3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludGVnZXIzMiIsICAgICAgICAweGRlYWRiZWVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludGVnZXI2NCIsICAgICAgICAweGZhMTVlZmFjYWRlMTViYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZG91YmxlX3ByZWNpc2lvbiIsIE1fUEksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic29tZV9jaGFyYWN0ZXJzIiwgICJEZWJ1ZyBUSElTISIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiem9tZ191bmljb2RlIiwgICAgICJceGQ3XG5cYVx0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aGF0X3dobyIsICAgICAgICAgVFJVRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNlNjQiLCAgICAgICAgICAgYmFzZTY0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ5dGVfbGlzdCIsICAgICAgICBieXRlX2xpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaTE2X2xpc3QiLCAgICAgICAgIGkxNl9saXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImk2NF9saXN0IiwgICAgICAgICBpNjRfbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICBvbmVfb2ZfZWFjaCA9CisgICAgZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9PTkVfT0ZfRUFDSCwKKyAgICAgICAgICAgICAgICAgICJpbV90cnVlIiwgICAgICAgICAgVFJVRSwKKyAgICAgICAgICAgICAgICAgICJpbV9mYWxzZSIsICAgICAgICAgRkFMU0UsCisgICAgICAgICAgICAgICAgICAiYV9iaXRlIiwgICAgICAgICAgIDB4NTAsCisgICAgICAgICAgICAgICAgICAiaW50ZWdlcjE2IiwgICAgICAgIDB4N2U1NywKKyAgICAgICAgICAgICAgICAgICJpbnRlZ2VyMzIiLCAgICAgICAgMHhkZWFkYmVlZiwKKyAgICAgICAgICAgICAgICAgICJpbnRlZ2VyNjQiLCAgICAgICAgR19HSU5UNjRfQ09OU1RBTlQgKDB4ZmExNWVmYWNhZGUxNWJhZCksCisgICAgICAgICAgICAgICAgICAiZG91YmxlX3ByZWNpc2lvbiIsIE1fUEksCisgICAgICAgICAgICAgICAgICAic29tZV9jaGFyYWN0ZXJzIiwgICJEZWJ1ZyBUSElTISIsCisgICAgICAgICAgICAgICAgICAiem9tZ191bmljb2RlIiwgICAgICJceGQ3XG5cYVx0IiwKKyAgICAgICAgICAgICAgICAgICJ3aGF0X3dobyIsICAgICAgICAgVFJVRSwKKyAgICAgICAgICAgICAgICAgICJiYXNlNjQiLCAgICAgICAgICAgYmFzZTY0LAorICAgICAgICAgICAgICAgICAgImJ5dGVfbGlzdCIsICAgICAgICBieXRlX2xpc3QsCisgICAgICAgICAgICAgICAgICAiaTE2X2xpc3QiLCAgICAgICAgIGkxNl9saXN0LAorICAgICAgICAgICAgICAgICAgImk2NF9saXN0IiwgICAgICAgICBpNjRfbGlzdCwKKyAgICAgICAgICAgICAgICAgIE5VTEwpOwogICBnX2Fzc2VydCAob25lX29mX2VhY2ggIT0gTlVMTCk7CiAKICAgZ19hcnJheV91bnJlZiAoaTY0X2xpc3QpOwpAQCAtMjY3LDcgKzI3MCw3IEBACiAgIGdfYXNzZXJ0X2NtcGhleCAoYV9iaXRlLCAgICA9PSwgMHg1MCk7CiAgIGdfYXNzZXJ0X2NtcGhleCAoaW50ZWdlcjE2LCA9PSwgMHg3ZTU3KTsKICAgZ19hc3NlcnRfY21waGV4IChpbnRlZ2VyMzIsID09LCAoZ2ludDMyKTB4ZGVhZGJlZWYpOwotICBnX2Fzc2VydF9jbXBoZXggKGludGVnZXI2NCwgPT0sIDB4ZmExNWVmYWNhZGUxNWJhZCk7CisgIGdfYXNzZXJ0X2NtcGhleCAoaW50ZWdlcjY0LCA9PSwgR19HSU5UNjRfQ09OU1RBTlQgKDB4ZmExNWVmYWNhZGUxNWJhZCkpOwogCiAgIGdfYXNzZXJ0X2NtcGZsb2F0IChkb3VibGVfcHJlY2lzaW9uLCA9PSwgTV9QSSk7CiAKQEAgLTgzNCwxMSArODM3LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwogCiAgIC8qIFRUZXN0SW5oZXJpdGVkQ2xpZW50IGluaGVyaXRzIGZyb20gVFRlc3RTcnZDbGllbnQgKi8KLSAgYXNzZXJ0IChnX3R5cGVfaXNfYSAoVF9URVNUX1RZUEVfSU5IRVJJVEVEX0NMSUVOVCwKKyAgZ19hc3NlcnQgKGdfdHlwZV9pc19hIChUX1RFU1RfVFlQRV9JTkhFUklURURfQ0xJRU5ULAogICAgICAgICAgICAgICAgICAgICAgICBUX1RFU1RfVFlQRV9TUlZfQ0xJRU5UKSk7CiAKICAgLyogVFRlc3RJbmhlcml0ZWRDbGllbnQgaW1wbGVtZW50cyBUVGVzdFNydkNsaWVudCdzIGludGVyZmFjZSAqLwotICBhc3NlcnQgKGdfdHlwZV9pc19hIChUX1RFU1RfVFlQRV9JTkhFUklURURfQ0xJRU5ULAorICBnX2Fzc2VydCAoZ190eXBlX2lzX2EgKFRfVEVTVF9UWVBFX0lOSEVSSVRFRF9DTElFTlQsCiAgICAgICAgICAgICAgICAgICAgICAgIFRfVEVTVF9UWVBFX1NSVl9JRikpOwogCiAgIC8qIFRUZXN0SW5oZXJpdGVkQ2xpZW50J3MgaW5oZXJpdGVkIHByb3BlcnRpZXMgY2FuIGJlIHNldCBhbmQgcmV0cmlldmVkICovCkBAIC04NTIsOCArODU1LDggQEAKICAgICAgICAgICAgICAgICAib3V0cHV0X3Byb3RvY29sIiwgJm91dHB1dF9wcm90b2NvbCwKICAgICAgICAgICAgICAgICBOVUxMKTsKIAotICBhc3NlcnQgKGlucHV0X3Byb3RvY29sID09IEdfT0JKRUNUKHByb3RvY29sKSk7Ci0gIGFzc2VydCAob3V0cHV0X3Byb3RvY29sID09IEdfT0JKRUNUKHByb3RvY29sKSk7CisgIGdfYXNzZXJ0IChpbnB1dF9wcm90b2NvbCA9PSBHX09CSkVDVChwcm90b2NvbCkpOworICBnX2Fzc2VydCAob3V0cHV0X3Byb3RvY29sID09IEdfT0JKRUNUKHByb3RvY29sKSk7CiAKICAgZ19vYmplY3RfdW5yZWYgKG91dHB1dF9wcm90b2NvbCk7CiAgIGdfb2JqZWN0X3VucmVmIChpbnB1dF9wcm90b2NvbCk7CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3Rlc3QvdGVzdGZkdHJhbnNwb3J0LmMgYi9saWIvY19nbGliL3Rlc3QvdGVzdGZkdHJhbnNwb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWVhODliZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0ZmR0cmFuc3BvcnQuYwpAQCAtMCwwICsxLDE4NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxnbGliLmg+CisjaW5jbHVkZSA8Z2xpYi9nc3RkaW8uaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZmRfdHJhbnNwb3J0Lmg+CisKK3N0YXRpYyBjb25zdCBnY2hhciBURVNUX0RBVEFbMTJdID0gImFiY2RlMDEyMzQhIjsKKworc3RhdGljIHZvaWQKK3Rlc3RfY3JlYXRlX2FuZF9kZXN0cm95ICh2b2lkKQoreworICBHT2JqZWN0ICpvYmplY3Q7CisgIG9iamVjdCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfRkRfVFJBTlNQT1JULCAiZmQiLCAtMSwgTlVMTCk7CisgIGdfYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CisgIGdfb2JqZWN0X3VucmVmIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9vcGVuX2FuZF9jbG9zZSAodm9pZCkKK3sKKyAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQ7CisgIFRocmlmdFRyYW5zcG9ydENsYXNzICprbGFzczsKKyAgR0Vycm9yICplcnJvcjsKKyAgZ2ludCBmZDsKKyAgZ2NoYXIgKmZpbGVuYW1lOworCisgIGVycm9yID0gTlVMTDsKKyAgZmlsZW5hbWUgPSBOVUxMOworCisgIGZkID0gZ19maWxlX29wZW5fdG1wIChOVUxMLCAmZmlsZW5hbWUsICZlcnJvcik7CisgIGdfYXNzZXJ0IChmZCA+PSAwKTsKKworICB0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUIChnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0ZEX1RSQU5TUE9SVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmQiLCBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSk7CisgIGtsYXNzID0gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCk7CisKKyAgLyogb3BlbiBpcyBuby1vcCAqLworICBnX2Fzc2VydCAoa2xhc3MtPmlzX29wZW4gKHRyYW5zcG9ydCkpOworICBnX2Fzc2VydCAoa2xhc3MtPnBlZWsgKHRyYW5zcG9ydCwgJmVycm9yKSk7CisgIGdfYXNzZXJ0IChrbGFzcy0+b3BlbiAodHJhbnNwb3J0LCAmZXJyb3IpKTsKKyAgZ19hc3NlcnQgKGtsYXNzLT5pc19vcGVuICh0cmFuc3BvcnQpKTsKKyAgZ19hc3NlcnQgKGtsYXNzLT5wZWVrICh0cmFuc3BvcnQsICZlcnJvcikpOworCisgIGdfYXNzZXJ0IChrbGFzcy0+Y2xvc2UgKHRyYW5zcG9ydCwgJmVycm9yKSk7CisgIGdfYXNzZXJ0ICghIGtsYXNzLT5vcGVuICh0cmFuc3BvcnQsICZlcnJvcikpOworICBnX2Fzc2VydCAoISBrbGFzcy0+aXNfb3BlbiAodHJhbnNwb3J0KSk7CisgIGdfYXNzZXJ0ICghIGtsYXNzLT5wZWVrICh0cmFuc3BvcnQsICZlcnJvcikpOworCisgIC8qIGFscmVhZHkgY2xvc2VkICovCisgIGdfYXNzZXJ0IChjbG9zZSAoZmQpICE9IDApOworICBnX2Fzc2VydCAoZXJybm8gPT0gRUJBREYpOworCisgIGdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOworCisgIGdfcmVtb3ZlIChmaWxlbmFtZSk7CisgIGdfZnJlZSAoZmlsZW5hbWUpOworCisgIC8qIHRlc3QgYmFkIGZkICovCisgIHRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfRkRfVFJBTlNQT1JULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmZCIsIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKTsKKyAga2xhc3MgPSBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodHJhbnNwb3J0KTsKKworICBnX2Fzc2VydCAoISBrbGFzcy0+aXNfb3BlbiAodHJhbnNwb3J0KSk7CisgIGVycm9yID0gTlVMTDsKKyAgZ19hc3NlcnQgKCEga2xhc3MtPnBlZWsgKHRyYW5zcG9ydCwgJmVycm9yKSk7CisgIGVycm9yID0gTlVMTDsKKyAgZ19hc3NlcnQgKCEga2xhc3MtPm9wZW4gKHRyYW5zcG9ydCwgJmVycm9yKSk7CisgIGVycm9yID0gTlVMTDsKKyAgZ19hc3NlcnQgKCEga2xhc3MtPmNsb3NlICh0cmFuc3BvcnQsICZlcnJvcikpOworCisgIGdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9yZWFkX2FuZF93cml0ZSAodm9pZCkKK3sKKyAgZ2NoYXIgb3V0X2J1Zls4XTsKKyAgZ2NoYXIgKmI7CisgIGdpbnQgd2FudCwgZ290OworICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydDsKKyAgVGhyaWZ0VHJhbnNwb3J0Q2xhc3MgKmtsYXNzOworICBHRXJyb3IgKmVycm9yOworICBnaW50IGZkOworICBnY2hhciAqZmlsZW5hbWU7CisKKyAgZXJyb3IgPSBOVUxMOworICBmaWxlbmFtZSA9IE5VTEw7CisKKyAgZmQgPSBnX2ZpbGVfb3Blbl90bXAgKE5VTEwsICZmaWxlbmFtZSwgJmVycm9yKTsKKyAgZ19hc3NlcnQgKGZkID49IDApOworCisgIC8qIHdyaXRlICovCisgIHRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfRkRfVFJBTlNQT1JULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmZCIsIGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKTsKKyAga2xhc3MgPSBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodHJhbnNwb3J0KTsKKyAgZ19hc3NlcnQgKGtsYXNzLT5pc19vcGVuICh0cmFuc3BvcnQpKTsKKyAgZ19hc3NlcnQgKGtsYXNzLT53cml0ZSAodHJhbnNwb3J0LCAoZ3BvaW50ZXIpIFRFU1RfREFUQSwgMTEsICZlcnJvcikpOworICBnX2Fzc2VydCAoa2xhc3MtPmZsdXNoICh0cmFuc3BvcnQsICZlcnJvcikpOworICBnX2Fzc2VydCAoa2xhc3MtPmNsb3NlICh0cmFuc3BvcnQsICZlcnJvcikpOworICBnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKKworICAvKiByZWFkICovCisgIGZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFksIFNfSVJVU1IgfCBTX0lXVVNSKTsKKyAgZ19hc3NlcnQgKGZkID49IDApOworCisgIHRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfRkRfVFJBTlNQT1JULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmZCIsIGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKTsKKyAga2xhc3MgPSBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodHJhbnNwb3J0KTsKKworICBtZW1zZXQob3V0X2J1ZiwgMCwgOCk7CisgIGIgPSBvdXRfYnVmOworICB3YW50ID0gNzsKKyAgd2hpbGUgKHdhbnQgPiAwKSB7CisgICAgZ290ID0ga2xhc3MtPnJlYWQgKHRyYW5zcG9ydCwgKGdwb2ludGVyKSBiLCB3YW50LCAmZXJyb3IpOworICAgIGdfYXNzZXJ0IChnb3QgPiAwICYmIGdvdCA8PSB3YW50KTsKKyAgICBiICs9IGdvdDsKKyAgICB3YW50IC09IGdvdDsKKyAgfQorICBnX2Fzc2VydCAobWVtY21wIChvdXRfYnVmLCBURVNUX0RBVEEsIDcpID09IDApOworCisgIG1lbXNldChvdXRfYnVmLCAwLCA4KTsKKyAgYiA9IG91dF9idWY7CisgIHdhbnQgPSA0OworICB3aGlsZSAod2FudCA+IDApIHsKKyAgICBnb3QgPSBrbGFzcy0+cmVhZCAodHJhbnNwb3J0LCAoZ3BvaW50ZXIpIGIsIHdhbnQsICZlcnJvcik7CisgICAgZ19hc3NlcnQgKGdvdCA+IDAgJiYgZ290IDw9IHdhbnQpOworICAgIGIgKz0gZ290OworICAgIHdhbnQgLT0gZ290OworICB9CisgIGdfYXNzZXJ0IChtZW1jbXAgKG91dF9idWYsIFRFU1RfREFUQSArIDcsIDQpID09IDApOworCisgIGdfYXNzZXJ0IChrbGFzcy0+Y2xvc2UgKHRyYW5zcG9ydCwgJmVycm9yKSk7CisgIGdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOworCisgIC8qIGNsZWFuIHVwICovCisKKyAgZ19yZW1vdmUgKGZpbGVuYW1lKTsKKyAgZ19mcmVlIChmaWxlbmFtZSk7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyNpZiAoIUdMSUJfQ0hFQ0tfVkVSU0lPTiAoMiwgMzYsIDApKQorICBnX3R5cGVfaW5pdCAoKTsKKyNlbmRpZgorCisgIGdfdGVzdF9pbml0ICgmYXJnYywgJmFyZ3YsIE5VTEwpOworCisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0ZmR0cmFuc3BvcnQvQ3JlYXRlQW5kRGVzdHJveSIsIHRlc3RfY3JlYXRlX2FuZF9kZXN0cm95KTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RmZHRyYW5zcG9ydC9PcGVuQW5kQ2xvc2UiLCB0ZXN0X29wZW5fYW5kX2Nsb3NlKTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RmZHRyYW5zcG9ydC9SZWFkQW5kV3JpdGUiLCB0ZXN0X3JlYWRfYW5kX3dyaXRlKTsKKworICByZXR1cm4gZ190ZXN0X3J1biAoKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0ZnJhbWVkdHJhbnNwb3J0LmMgYi9saWIvY19nbGliL3Rlc3QvdGVzdGZyYW1lZHRyYW5zcG9ydC5jCmluZGV4IGQ1MGZmMjMuLjAwOGU2MWUgMTAwNzU1Ci0tLSBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0ZnJhbWVkdHJhbnNwb3J0LmMKKysrIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RmcmFtZWR0cmFuc3BvcnQuYwpAQCAtMTcsNyArMTcsNiBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPG5ldGRiLmg+CiAjaW5jbHVkZSA8c3lzL3dhaXQuaD4KIApAQCAtMzEsNiArMzAsNyBAQAogI2luY2x1ZGUgIi4uL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5jIgogCiBzdGF0aWMgdm9pZCB0aHJpZnRfc2VydmVyIChjb25zdCBpbnQgcG9ydCk7CitzdGF0aWMgdm9pZCB0aHJpZnRfc29ja2V0X3NlcnZlcl9vcGVuIChjb25zdCBpbnQgcG9ydCwgaW50IHRpbWVzKTsKIAogLyogdGVzdCBvYmplY3QgY3JlYXRpb24gYW5kIGRlc3RydWN0aW9uICovCiBzdGF0aWMgdm9pZApAQCAtNDIsMTAgKzQyLDEwIEBACiAKICAgR09iamVjdCAqb2JqZWN0ID0gTlVMTDsKICAgb2JqZWN0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JULCBOVUxMKTsKLSAgYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CisgIGdfYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CiAgIGdfb2JqZWN0X2dldCAoR19PQkpFQ1QgKG9iamVjdCksICJ0cmFuc3BvcnQiLCAmdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICJyX2J1Zl9zaXplIiwgJnJfYnVmX3NpemUsCi0gICAgICAgICAgICAgICAgIndfYnVmX3NpemUiLCAmd19idWZfc2l6ZSwgTlVMTCk7CisJCSJyX2J1Zl9zaXplIiwgJnJfYnVmX3NpemUsCisJCSJ3X2J1Zl9zaXplIiwgJndfYnVmX3NpemUsIE5VTEwpOwogICBnX29iamVjdF91bnJlZiAob2JqZWN0KTsKIH0KIApAQCAtNTUsMzUgKzU1LDUzIEBACiAgIFRocmlmdFNvY2tldCAqdHNvY2tldCA9IE5VTEw7CiAgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKICAgR0Vycm9yICplcnIgPSBOVUxMOworICBwaWRfdCBwaWQ7CisgIGludCBwb3J0ID0gNTExOTk7CisgIGludCBzdGF0dXM7CiAKLSAgLyogY3JlYXRlIGEgVGhyaWZ0U29ja2V0ICovCi0gIHRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgNTExODgsIE5VTEwpOyAKKyAgcGlkID0gZm9yayAoKTsKKyAgZ19hc3NlcnQgKCBwaWQgPj0gMCApOwogCi0gIC8qIGNyZWF0ZSBhIEJ1ZmZlcmVkVHJhbnNwb3J0IHdyYXBwZXIgb2YgdGhlIFNvY2tldCAqLwotICB0cmFuc3BvcnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyYW5zcG9ydCIsIFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpLCBOVUxMKTsKKyAgaWYgKCBwaWQgPT0gMCApCisgICAgeworICAgICAgLyogY2hpbGQgbGlzdGVucyAqLworICAgICAgdGhyaWZ0X3NvY2tldF9zZXJ2ZXJfb3BlbiAocG9ydCwxKTsKKyAgICAgIGV4aXQgKDApOworICAgIH0gZWxzZSB7CisJLyogcGFyZW50IGNvbm5lY3RzLCB3YWl0IGEgYml0IGZvciB0aGUgc29ja2V0IHRvIGJlIGNyZWF0ZWQgKi8KKwlzbGVlcCAoMSk7CisJLyogY3JlYXRlIGEgVGhyaWZ0U29ja2V0ICovCisJdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKKwkJCQkicG9ydCIsIHBvcnQsIE5VTEwpOwogCi0gIC8qIHRoaXMgc2hvdWxkbid0IHdvcmsgKi8KLSAgYXNzZXJ0ICh0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9vcGVuICh0cmFuc3BvcnQsIE5VTEwpID09IEZBTFNFKTsKLSAgYXNzZXJ0ICh0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpID09IFRSVUUpOwotICBhc3NlcnQgKHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpID09IFRSVUUpOwotICBnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKLSAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworCS8qIGNyZWF0ZSBhIEJ1ZmZlcmVkVHJhbnNwb3J0IHdyYXBwZXIgb2YgdGhlIFNvY2tldCAqLworCXRyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCwKKwkJCQkgICJ0cmFuc3BvcnQiLCBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KSwgTlVMTCk7CiAKLSAgLyogdHJ5IGFuZCB1bmRlcmx5aW5nIHNvY2tldCBmYWlsdXJlICovCi0gIHRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdC5icm9rZW4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKwkvKiB0aGlzIHNob3VsZG4ndCB3b3JrICovCisJZ19hc3NlcnQgKHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCkgPT0gVFJVRSk7CisJZ19hc3NlcnQgKHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2lzX29wZW4gKHRyYW5zcG9ydCkgPT0gVFJVRSk7CisJZ19hc3NlcnQgKHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpID09IFRSVUUpOworCWdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOworCWdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKIAotICAvKiBjcmVhdGUgYSBCdWZmZXJlZFRyYW5zcG9ydCB3cmFwcGVyIG9mIHRoZSBTb2NrZXQgKi8KLSAgdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc3BvcnQiLCBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KSwgTlVMTCk7CisJLyogdHJ5IGFuZCB1bmRlcmx5aW5nIHNvY2tldCBmYWlsdXJlICovCisJdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0LmJyb2tlbiIsCisJCQkJTlVMTCk7CiAKLSAgYXNzZXJ0ICh0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9vcGVuICh0cmFuc3BvcnQsICZlcnIpID09IEZBTFNFKTsKLSAgZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7Ci0gIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKLSAgZ19lcnJvcl9mcmVlIChlcnIpOwotICBlcnIgPSBOVUxMOworCS8qIGNyZWF0ZSBhIEJ1ZmZlcmVkVHJhbnNwb3J0IHdyYXBwZXIgb2YgdGhlIFNvY2tldCAqLworCXRyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCwKKwkJCQkgICJ0cmFuc3BvcnQiLCBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KSwgTlVMTCk7CisKKwlnX2Fzc2VydCAodGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCAmZXJyKSA9PSBGQUxTRSk7CisJZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7CisJZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworCWdfZXJyb3JfZnJlZSAoZXJyKTsKKwllcnIgPSBOVUxMOworCisJZ19hc3NlcnQgKCB3YWl0ICgmc3RhdHVzKSA9PSBwaWQgKTsKKwlnX2Fzc2VydCAoIHN0YXR1cyA9PSAwICk7CisgICAgfQogfQogCiBzdGF0aWMgdm9pZApAQCAtOTcsNDkgKzExNSw0OSBAQAogICBndWNoYXIgYnVmWzEwXSA9IFRFU1RfREFUQTsgLyogYSBidWZmZXIgKi8KIAogICBwaWQgPSBmb3JrICgpOwotICBhc3NlcnQgKCBwaWQgPj0gMCApOworICBnX2Fzc2VydCAoIHBpZCA+PSAwICk7CiAKICAgaWYgKCBwaWQgPT0gMCApCi0gIHsKLSAgICAvKiBjaGlsZCBsaXN0ZW5zICovCi0gICAgdGhyaWZ0X3NlcnZlciAocG9ydCk7Ci0gICAgZXhpdCAoMCk7Ci0gIH0gZWxzZSB7Ci0gICAgLyogcGFyZW50IGNvbm5lY3RzLCB3YWl0IGEgYml0IGZvciB0aGUgc29ja2V0IHRvIGJlIGNyZWF0ZWQgKi8KLSAgICBzbGVlcCAoMSk7CisgICAgeworICAgICAgLyogY2hpbGQgbGlzdGVucyAqLworICAgICAgdGhyaWZ0X3NlcnZlciAocG9ydCk7CisgICAgICBleGl0ICgwKTsKKyAgICB9IGVsc2UgeworCS8qIHBhcmVudCBjb25uZWN0cywgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkICovCisJc2xlZXAgKDEpOwogCi0gICAgdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOwotICAgIHRyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc3BvcnQiLCBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3X2J1Zl9zaXplIiwgNCwgTlVMTCk7CisJdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKKwkJCQkicG9ydCIsIHBvcnQsIE5VTEwpOworCXRyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCwKKwkJCQkgICJ0cmFuc3BvcnQiLCBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KSwKKwkJCQkgICJ3X2J1Zl9zaXplIiwgNCwgTlVMTCk7CiAKLSAgICBhc3NlcnQgKHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCkgPT0gVFJVRSk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpKTsKKwlnX2Fzc2VydCAodGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKSA9PSBUUlVFKTsKKwlnX2Fzc2VydCAodGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfaXNfb3BlbiAodHJhbnNwb3J0KSk7CiAKLSAgICAvKiB3cml0ZSAxMCBieXRlcyAqLwotICAgIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMTAsIE5VTEwpOwotICAgIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworCS8qIHdyaXRlIDEwIGJ5dGVzICovCisJdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxMCwgTlVMTCk7CisJdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CiAKLSAgICB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEsIE5VTEwpOwotICAgIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworCXRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMSwgTlVMTCk7CisJdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CiAKLSAgICB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEwLCBOVUxMKTsKLSAgICB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKwl0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEwLCBOVUxMKTsKKwl0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKIAotICAgIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMTAsIE5VTEwpOwotICAgIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworCXRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMTAsIE5VTEwpOworCXRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOwogCi0gICAgdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfd3JpdGVfZW5kICh0cmFuc3BvcnQsIE5VTEwpOwotICAgIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOwotICAgIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOworCXRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3dyaXRlX2VuZCAodHJhbnNwb3J0LCBOVUxMKTsKKwl0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKwl0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKIAotICAgIGdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOwotICAgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKKwlnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKKwlnX29iamVjdF91bnJlZiAodHNvY2tldCk7CiAKLSAgICBhc3NlcnQgKCB3YWl0ICgmc3RhdHVzKSA9PSBwaWQgKTsKLSAgICBhc3NlcnQgKCBzdGF0dXMgPT0gMCApOwotICB9CisJZ19hc3NlcnQgKCB3YWl0ICgmc3RhdHVzKSA9PSBwaWQgKTsKKwlnX2Fzc2VydCAoIHN0YXR1cyA9PSAwICk7CisgICAgfQogfQogCiAvKiB0ZXN0IHJlYWRpbmcgZnJvbSB0aGUgdHJhbnNwb3J0IGFmdGVyIHRoZSBwZWVyIGhhcyB1bmV4cGVjdGVkbHkKQEAgLTE1Niw3NiArMTc0LDk3IEBACiAgIGdfYXNzZXJ0IChwaWQgPj0gMCk7CiAKICAgaWYgKHBpZCA9PSAwKQotICB7Ci0gICAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICpzZXJ2ZXJfdHJhbnNwb3J0ID0gTlVMTDsKLSAgICBUaHJpZnRUcmFuc3BvcnQgKmNsaWVudF90cmFuc3BvcnQgPSBOVUxMOworICAgIHsKKyAgICAgIFRocmlmdFNlcnZlclRyYW5zcG9ydCAqc2VydmVyX3RyYW5zcG9ydCA9IE5VTEw7CisgICAgICBUaHJpZnRUcmFuc3BvcnQgKmNsaWVudF90cmFuc3BvcnQgPSBOVUxMOwogCi0gICAgLyogY2hpbGQgbGlzdGVucyAqLwotICAgIHNlcnZlcl90cmFuc3BvcnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCBwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICAgIGdfYXNzZXJ0IChzZXJ2ZXJfdHJhbnNwb3J0ICE9IE5VTEwpOworICAgICAgLyogY2hpbGQgbGlzdGVucyAqLworICAgICAgc2VydmVyX3RyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCwKKwkJCQkgICAgICAgInBvcnQiLCBwb3J0LAorCQkJCSAgICAgICBOVUxMKTsKKyAgICAgIGdfYXNzZXJ0IChzZXJ2ZXJfdHJhbnNwb3J0ICE9IE5VTEwpOwogCi0gICAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfbGlzdGVuIChzZXJ2ZXJfdHJhbnNwb3J0LCAmZXJyKTsKLSAgICBnX2Fzc2VydCAoZXJyID09IE5VTEwpOworICAgICAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfbGlzdGVuIChzZXJ2ZXJfdHJhbnNwb3J0LCAmZXJyKTsKKyAgICAgIGdfYXNzZXJ0IChlcnIgPT0gTlVMTCk7CiAKLSAgICAvKiB3cmFwIHRoZSBjbGllbnQgdHJhbnNwb3J0IGluIGEgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0ICovCi0gICAgY2xpZW50X3RyYW5zcG9ydCA9IGdfb2JqZWN0X25ldwotICAgICAgKFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQsCi0gICAgICAgInRyYW5zcG9ydCIsICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKHNlcnZlcl90cmFuc3BvcnQsICZlcnIpLAotICAgICAgICJyX2J1Zl9zaXplIiwgMCwKLSAgICAgICBOVUxMKTsKLSAgICBnX2Fzc2VydCAoZXJyID09IE5VTEwpOwotICAgIGdfYXNzZXJ0IChjbGllbnRfdHJhbnNwb3J0ICE9IE5VTEwpOworICAgICAgLyogd3JhcCB0aGUgY2xpZW50IHRyYW5zcG9ydCBpbiBhIFRocmlmdEZyYW1lZFRyYW5zcG9ydCAqLworICAgICAgY2xpZW50X3RyYW5zcG9ydCA9IGdfb2JqZWN0X25ldworCSAgKFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQsCisJICAgInRyYW5zcG9ydCIsICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKHNlcnZlcl90cmFuc3BvcnQsICZlcnIpLAorCSAgICJyX2J1Zl9zaXplIiwgMCwKKwkgICBOVUxMKTsKKyAgICAgIGdfYXNzZXJ0IChlcnIgPT0gTlVMTCk7CisgICAgICBnX2Fzc2VydCAoY2xpZW50X3RyYW5zcG9ydCAhPSBOVUxMKTsKIAotICAgIC8qIGNsb3NlIHRoZSBjb25uZWN0aW9uIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBjbGllbnQgY29ubmVjdHMgKi8KLSAgICB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlIChjbGllbnRfdHJhbnNwb3J0LCBOVUxMKTsKKyAgICAgIC8qIGNsb3NlIHRoZSBjb25uZWN0aW9uIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBjbGllbnQgY29ubmVjdHMgKi8KKyAgICAgIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKGNsaWVudF90cmFuc3BvcnQsIE5VTEwpOwogCi0gICAgZ19vYmplY3RfdW5yZWYgKGNsaWVudF90cmFuc3BvcnQpOwotICAgIGdfb2JqZWN0X3VucmVmIChzZXJ2ZXJfdHJhbnNwb3J0KTsKKyAgICAgIGdfb2JqZWN0X3VucmVmIChjbGllbnRfdHJhbnNwb3J0KTsKKyAgICAgIGdfb2JqZWN0X3VucmVmIChzZXJ2ZXJfdHJhbnNwb3J0KTsKIAotICAgIGV4aXQgKDApOwotICB9IGVsc2UgewotICAgIFRocmlmdFNvY2tldCAqdHNvY2tldCA9IE5VTEw7Ci0gICAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOwotICAgIGd1Y2hhciBidWZbMTBdOyAvKiBhIGJ1ZmZlciAqLworICAgICAgZXhpdCAoMCk7CisgICAgfSBlbHNlIHsKKwlUaHJpZnRTb2NrZXQgKnRzb2NrZXQgPSBOVUxMOworCVRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKwlndWNoYXIgYnVmWzEwXTsgLyogYSBidWZmZXIgKi8KIAotICAgIC8qIHBhcmVudCBjb25uZWN0cywgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkICovCi0gICAgc2xlZXAgKDEpOworCS8qIHBhcmVudCBjb25uZWN0cywgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkICovCisJc2xlZXAgKDEpOwogCi0gICAgdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJob3N0bmFtZSIsICJsb2NhbGhvc3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgICAgIHBvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gICAgdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyYW5zcG9ydCIsICBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3X2J1Zl9zaXplIiwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCXRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwKKwkJCQkiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKKwkJCQkicG9ydCIsICAgICBwb3J0LAorCQkJCU5VTEwpOworCXRyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCwKKwkJCQkgICJ0cmFuc3BvcnQiLCAgVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCksCisJCQkJICAid19idWZfc2l6ZSIsIDAsCisJCQkJICBOVUxMKTsKIAotICAgIGdfYXNzZXJ0ICh0aHJpZnRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCkgPT0gVFJVRSk7Ci0gICAgZ19hc3NlcnQgKHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAodHJhbnNwb3J0KSk7CisJZ19hc3NlcnQgKHRocmlmdF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKSA9PSBUUlVFKTsKKwlnX2Fzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpKTsKIAotICAgIC8qIGF0dGVtcHRpbmcgdG8gcmVhZCBmcm9tIHRoZSB0cmFuc3BvcnQgYWZ0ZXIgdGhlIHBlZXIgaGFzIGNsb3NlZAorCS8qIGF0dGVtcHRpbmcgdG8gcmVhZCBmcm9tIHRoZSB0cmFuc3BvcnQgYWZ0ZXIgdGhlIHBlZXIgaGFzIGNsb3NlZAogICAgICAgIHRoZSBjb25uZWN0aW9uIGZhaWxzIGdyYWNlZnVsbHkgd2l0aG91dCBnZW5lcmF0aW5nIGEgY3JpdGljYWwKICAgICAgICB3YXJuaW5nIG9yIHNlZ21lbnRhdGlvbiBmYXVsdCAqLwotICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZCAodHJhbnNwb3J0LCBidWYsIDEwLCAmZXJyKTsKLSAgICBnX2Fzc2VydCAoZXJyICE9IE5VTEwpOworCXRocmlmdF90cmFuc3BvcnRfcmVhZCAodHJhbnNwb3J0LCBidWYsIDEwLCAmZXJyKTsKKwlnX2Fzc2VydCAoZXJyICE9IE5VTEwpOwogCi0gICAgZ19lcnJvcl9mcmVlIChlcnIpOwotICAgIGVyciA9IE5VTEw7CisJZ19lcnJvcl9mcmVlIChlcnIpOworCWVyciA9IE5VTEw7CiAKLSAgICB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kICh0cmFuc3BvcnQsICZlcnIpOwotICAgIGdfYXNzZXJ0IChlcnIgPT0gTlVMTCk7CisJdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZCAodHJhbnNwb3J0LCAmZXJyKTsKKwlnX2Fzc2VydCAoZXJyID09IE5VTEwpOwogCi0gICAgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAodHJhbnNwb3J0LCAmZXJyKTsKLSAgICBnX2Fzc2VydCAoZXJyID09IE5VTEwpOworCXRocmlmdF90cmFuc3BvcnRfY2xvc2UgKHRyYW5zcG9ydCwgJmVycik7CisJZ19hc3NlcnQgKGVyciA9PSBOVUxMKTsKIAotICAgIGdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOwotICAgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKKwlnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKKwlnX29iamVjdF91bnJlZiAodHNvY2tldCk7CiAKLSAgICBnX2Fzc2VydCAod2FpdCAoJnN0YXR1cykgPT0gcGlkKTsKLSAgICBnX2Fzc2VydCAoc3RhdHVzID09IDApOworCWdfYXNzZXJ0ICh3YWl0ICgmc3RhdHVzKSA9PSBwaWQpOworCWdfYXNzZXJ0IChzdGF0dXMgPT0gMCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X3NvY2tldF9zZXJ2ZXJfb3BlbiAoY29uc3QgaW50IHBvcnQsIGludCB0aW1lcykKK3sKKyAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQgKmNsaWVudCA9IE5VTEw7CisgIGludCBpOworCisgIFRocmlmdFNlcnZlclNvY2tldCAqdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCwKKwkJCQkJICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKKworICB0cmFuc3BvcnQgPSBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVCAodHNvY2tldCk7CisgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2xpc3RlbiAodHJhbnNwb3J0LCBOVUxMKTsKKyAgZm9yKGk9MDtpPHRpbWVzO2krKyl7CisgICAgICBjbGllbnQgPSB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgICBnX2Fzc2VydCAoY2xpZW50ICE9IE5VTEwpOworICAgICAgdGhyaWZ0X3NvY2tldF9jbG9zZSAoY2xpZW50LCBOVUxMKTsKKyAgICAgIGdfb2JqZWN0X3VucmVmIChjbGllbnQpOwogICB9CisgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTIzOCwyMSArMjc3LDIxIEBACiAgIGd1Y2hhciBtYXRjaFsxMF0gPSBURVNUX0RBVEE7CiAKICAgVGhyaWZ0U2VydmVyU29ja2V0ICp0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgcG9ydCwgTlVMTCk7CisJCQkJCSAgICAgICJwb3J0IiwgcG9ydCwgTlVMTCk7CiAKICAgdHJhbnNwb3J0ID0gVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlQgKHRzb2NrZXQpOwogICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKHRyYW5zcG9ydCwgTlVMTCk7CiAKICAgLyogd3JhcCB0aGUgY2xpZW50IGluIGEgQnVmZmVyZWRUcmFuc3BvcnQgKi8KICAgY2xpZW50ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JULCAidHJhbnNwb3J0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKHRyYW5zcG9ydCwgTlVMTCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgInJfYnVmX3NpemUiLCA1LCBOVUxMKTsKLSAgYXNzZXJ0IChjbGllbnQgIT0gTlVMTCk7CisJCQkgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0ICh0cmFuc3BvcnQsIE5VTEwpLAorCQkJICJyX2J1Zl9zaXplIiwgNSwgTlVMTCk7CisgIGdfYXNzZXJ0IChjbGllbnQgIT0gTlVMTCk7CiAKICAgLyogcmVhZCAxMCBieXRlcyAqLwogICBieXRlcyA9IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3JlYWQgKGNsaWVudCwgYnVmLCAxMCwgTlVMTCk7Ci0gIGFzc2VydCAoYnl0ZXMgPT0gMTApOyAvKiBtYWtlIHN1cmUgd2UndmUgcmVhZCAxMCBieXRlcyAqLwotICBhc3NlcnQgKCBtZW1jbXAgKGJ1ZiwgbWF0Y2gsIDEwKSA9PSAwICk7IC8qIG1ha2Ugc3VyZSB3aGF0IHdlIGdvdCBtYXRjaGVzICovCisgIGdfYXNzZXJ0IChieXRlcyA9PSAxMCk7IC8qIG1ha2Ugc3VyZSB3ZSd2ZSByZWFkIDEwIGJ5dGVzICovCisgIGdfYXNzZXJ0ICggbWVtY21wIChidWYsIG1hdGNoLCAxMCkgPT0gMCApOyAvKiBtYWtlIHN1cmUgd2hhdCB3ZSBnb3QgbWF0Y2hlcyAqLwogCiAgIGJ5dGVzID0gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfcmVhZCAoY2xpZW50LCBidWYsIDYsIE5VTEwpOwogICBieXRlcyA9IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3JlYWQgKGNsaWVudCwgYnVmLCA1LCBOVUxMKTsKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0bWVtb3J5YnVmZmVyLmMgYi9saWIvY19nbGliL3Rlc3QvdGVzdG1lbW9yeWJ1ZmZlci5jCmluZGV4IDVjNzUyNzMuLjlmYjY4YjkgMTAwNzU1Ci0tLSBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0bWVtb3J5YnVmZmVyLmMKKysrIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RtZW1vcnlidWZmZXIuYwpAQCAtMTcsNyArMTcsNiBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPG5ldGRiLmg+CiAKICNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CkBAIC0yNSw3NCArMjQsMjAwIEBACiAjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuaD4KICNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5oPgogCi0jZGVmaW5lIFRFU1RfREFUQSB7ICdhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZicsICdnJywgJ2gnLCAnaScsICdqJyB9CitzdGF0aWMgY29uc3QgZ2NoYXIgVEVTVF9EQVRBWzExXSA9ICJhYmNkZWZnaGlqIjsKIAogI2luY2x1ZGUgIi4uL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfbWVtb3J5X2J1ZmZlci5jIgogCiAvKiB0ZXN0IG9iamVjdCBjcmVhdGlvbiBhbmQgZGVzdHJ1Y3Rpb24gKi8KIHN0YXRpYyB2b2lkCi10ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveSh2b2lkKQordGVzdF9jcmVhdGVfYW5kX2Rlc3Ryb3kgKHZvaWQpCiB7CiAgIEdPYmplY3QgKm9iamVjdCA9IE5VTEw7Ci0gIG9iamVjdCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfTUVNT1JZX0JVRkZFUiwgTlVMTCk7Ci0gIGFzc2VydCAob2JqZWN0ICE9IE5VTEwpOworICBvYmplY3QgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgImJ1Zl9zaXplIiwgMTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIGdfYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CiAgIGdfb2JqZWN0X3VucmVmIChvYmplY3QpOwogfQogCiBzdGF0aWMgdm9pZAotdGVzdF9vcGVuX2FuZF9jbG9zZSh2b2lkKQordGVzdF9jcmVhdGVfYW5kX2Rlc3Ryb3lfbGFyZ2UgKHZvaWQpCit7CisgIEdPYmplY3QgKm9iamVjdCA9IE5VTEw7CisgIG9iamVjdCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfTUVNT1JZX0JVRkZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiYnVmX3NpemUiLCAxMCAqIDEwMjQgKiAxMDI0LAorICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICBnX2Fzc2VydCAob2JqZWN0ICE9IE5VTEwpOworICBnX29iamVjdF91bnJlZiAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfY3JlYXRlX2FuZF9kZXN0cm95X2RlZmF1bHQgKHZvaWQpCit7CisgIEdPYmplY3QgKm9iamVjdCA9IE5VTEw7CisgIG9iamVjdCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfTUVNT1JZX0JVRkZFUiwgTlVMTCk7CisgIGdfYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CisgIGdfb2JqZWN0X3VucmVmIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9jcmVhdGVfYW5kX2Rlc3Ryb3lfZXh0ZXJuYWwgKHZvaWQpCit7CisgIEdPYmplY3QgKm9iamVjdCA9IE5VTEw7CisgIEdCeXRlQXJyYXkgKmJ1ZiA9IGdfYnl0ZV9hcnJheV9uZXcgKCk7CisgIGdfYXNzZXJ0IChidWYgIT0gTlVMTCk7CisgIG9iamVjdCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfTUVNT1JZX0JVRkZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiYnVmIiwgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICBnX2Fzc2VydCAob2JqZWN0ICE9IE5VTEwpOworICBnX29iamVjdF91bnJlZiAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfY3JlYXRlX2FuZF9kZXN0cm95X3Vub3duZWQgKHZvaWQpCit7CisgIEdPYmplY3QgKm9iamVjdCA9IE5VTEw7CisgIEdWYWx1ZSB2YWwgPSBHX1ZBTFVFX0lOSVQ7CisgIEdCeXRlQXJyYXkgKmJ1ZjsKKworICBvYmplY3QgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIm93bmVyIiwgRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIGdfYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CisKKyAgZ192YWx1ZV9pbml0ICgmdmFsLCBHX1RZUEVfUE9JTlRFUik7CisgIGdfb2JqZWN0X2dldF9wcm9wZXJ0eSAob2JqZWN0LCAiYnVmIiwgJnZhbCk7CisgIGJ1ZiA9IChHQnl0ZUFycmF5KikgZ192YWx1ZV9nZXRfcG9pbnRlciAoJnZhbCk7CisgIGdfYXNzZXJ0IChidWYgIT0gTlVMTCk7CisKKyAgZ19ieXRlX2FycmF5X3VucmVmIChidWYpOworICBnX3ZhbHVlX3Vuc2V0ICgmdmFsKTsKKyAgZ19vYmplY3RfdW5yZWYgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X29wZW5fYW5kX2Nsb3NlICh2b2lkKQogewogICBUaHJpZnRNZW1vcnlCdWZmZXIgKnRidWZmZXIgPSBOVUxMOwogCiAgIC8qIGNyZWF0ZSBhIFRocmlmdE1lbW9yeUJ1ZmZlciAqLwogICB0YnVmZmVyID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSLCBOVUxMKTsKIAotICAvKiB0aGlzIHNob3VsZG4ndCB3b3JrICovCi0gIGFzc2VydCAodGhyaWZ0X21lbW9yeV9idWZmZXJfb3BlbiAoVEhSSUZUX1RSQU5TUE9SVCAodGJ1ZmZlciksIE5VTEwpID09IFRSVUUpOwotICBhc3NlcnQgKHRocmlmdF9tZW1vcnlfYnVmZmVyX2lzX29wZW4gKFRIUklGVF9UUkFOU1BPUlQgKHRidWZmZXIpKSA9PSBUUlVFKTsKLSAgYXNzZXJ0ICh0aHJpZnRfbWVtb3J5X2J1ZmZlcl9jbG9zZSAoVEhSSUZUX1RSQU5TUE9SVCAodGJ1ZmZlciksIE5VTEwpID09IFRSVUUpOworICAvKiBuby1vcHMgKi8KKyAgZ19hc3NlcnQgKHRocmlmdF9tZW1vcnlfYnVmZmVyX29wZW4gKFRIUklGVF9UUkFOU1BPUlQgKHRidWZmZXIpLCBOVUxMKSA9PSBUUlVFKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9tZW1vcnlfYnVmZmVyX2lzX29wZW4gKFRIUklGVF9UUkFOU1BPUlQgKHRidWZmZXIpKSA9PSBUUlVFKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9tZW1vcnlfYnVmZmVyX2Nsb3NlIChUSFJJRlRfVFJBTlNQT1JUICh0YnVmZmVyKSwgTlVMTCkgPT0gVFJVRSk7CisKICAgZ19vYmplY3RfdW5yZWYgKHRidWZmZXIpOwogfQogCiBzdGF0aWMgdm9pZAotdGVzdF9yZWFkX2FuZF93cml0ZSh2b2lkKQordGVzdF9yZWFkX2FuZF93cml0ZSAodm9pZCkKIHsKICAgVGhyaWZ0TWVtb3J5QnVmZmVyICp0YnVmZmVyID0gTlVMTDsKLSAgZ3VjaGFyIGJ1ZlsxMF0gPSBURVNUX0RBVEE7Ci0gIGd1Y2hhciByZWFkWzEwXTsKKyAgZ2ludCBnb3QsIHdhbnQ7CisgIGdjaGFyIHJlYWRbMTBdOworICBnY2hhciAqYjsKICAgR0Vycm9yICplcnJvciA9IE5VTEw7CiAKICAgdGJ1ZmZlciA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfTUVNT1JZX0JVRkZFUiwgImJ1Zl9zaXplIiwgNSwgTlVMTCk7Ci0gIGFzc2VydCAodGhyaWZ0X21lbW9yeV9idWZmZXJfd3JpdGUgKFRIUklGVF9UUkFOU1BPUlQgKHRidWZmZXIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3BvaW50ZXIpIGJ1ZiwKKyAgZ19hc3NlcnQgKHRocmlmdF9tZW1vcnlfYnVmZmVyX3dyaXRlIChUSFJJRlRfVFJBTlNQT1JUICh0YnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdwb2ludGVyKSBURVNUX0RBVEEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwLCAmZXJyb3IpID09IEZBTFNFKTsKLSAgYXNzZXJ0IChlcnJvciAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKGVycm9yICE9IE5VTEwpOwogICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKICAgZXJyb3IgPSBOVUxMOwogICBnX29iamVjdF91bnJlZiAodGJ1ZmZlcik7CiAKICAgdGJ1ZmZlciA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfTUVNT1JZX0JVRkZFUiwgImJ1Zl9zaXplIiwgMTUsIE5VTEwpOwotICBhc3NlcnQgKHRocmlmdF9tZW1vcnlfYnVmZmVyX3dyaXRlIChUSFJJRlRfVFJBTlNQT1JUICh0YnVmZmVyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdwb2ludGVyKSBidWYsIDEwLCAmZXJyb3IpID09IFRSVUUpOwotICBhc3NlcnQgKGVycm9yID09IE5VTEwpOworICBnX2Fzc2VydCAodGhyaWZ0X21lbW9yeV9idWZmZXJfd3JpdGUgKFRIUklGVF9UUkFOU1BPUlQgKHRidWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3BvaW50ZXIpIFRFU1RfREFUQSwgMTAsICZlcnJvcikgPT0gVFJVRSk7CisgIGdfYXNzZXJ0IChlcnJvciA9PSBOVUxMKTsKIAotICBhc3NlcnQgKHRocmlmdF9tZW1vcnlfYnVmZmVyX3JlYWQgKFRIUklGVF9UUkFOU1BPUlQgKHRidWZmZXIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWFkLCAxMCwgJmVycm9yKSA+IDApOwotICBhc3NlcnQgKGVycm9yID09IE5VTEwpOworICBtZW1zZXQocmVhZCwgMCwgMTApOworICBiID0gcmVhZDsKKyAgd2FudCA9IDEwOworICB3aGlsZSAod2FudCA+IDApIHsKKyAgICBnb3QgPSB0aHJpZnRfbWVtb3J5X2J1ZmZlcl9yZWFkIChUSFJJRlRfVFJBTlNQT1JUICh0YnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3BvaW50ZXIpIGIsIHdhbnQsICZlcnJvcik7CisgICAgZ19hc3NlcnQgKGdvdCA+IDAgJiYgZ290IDw9IHdhbnQpOworICAgIGdfYXNzZXJ0IChlcnJvciA9PSBOVUxMKTsKKyAgICBiICs9IGdvdDsKKyAgICB3YW50IC09IGdvdDsKKyAgfQorICBnX2Fzc2VydCAobWVtY21wIChyZWFkLCBURVNUX0RBVEEsIDEwKSA9PSAwKTsKKyAgZ19vYmplY3RfdW5yZWYgKHRidWZmZXIpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9yZWFkX2FuZF93cml0ZV9kZWZhdWx0ICh2b2lkKQoreworICBUaHJpZnRNZW1vcnlCdWZmZXIgKnRidWZmZXIgPSBOVUxMOworICBnaW50IGdvdCwgd2FudCwgaTsKKyAgZ2NoYXIgcmVhZFsxMF07CisgIGdjaGFyICpiOworICBHRXJyb3IgKmVycm9yID0gTlVMTDsKKworICB0YnVmZmVyID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSLCBOVUxMKTsKKyAgZm9yIChpID0gMDsgaSA8IDEwMDsgKytpKSB7CisgICAgZ19hc3NlcnQgKHRocmlmdF9tZW1vcnlfYnVmZmVyX3dyaXRlIChUSFJJRlRfVFJBTlNQT1JUICh0YnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3BvaW50ZXIpIFRFU1RfREFUQSwgMTAsICZlcnJvcikgPT0gVFJVRSk7CisgICAgZ19hc3NlcnQgKGVycm9yID09IE5VTEwpOworICB9CisKKyAgZm9yIChpID0gMDsgaSA8IDEwMDsgKytpKSB7CisgICAgbWVtc2V0KHJlYWQsIDAsIDEwKTsKKyAgICBiID0gcmVhZDsKKyAgICB3YW50ID0gMTA7CisgICAgd2hpbGUgKHdhbnQgPiAwKSB7CisgICAgICBnb3QgPSB0aHJpZnRfbWVtb3J5X2J1ZmZlcl9yZWFkIChUSFJJRlRfVFJBTlNQT1JUICh0YnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChncG9pbnRlcikgYiwgd2FudCwgJmVycm9yKTsKKyAgICAgIGdfYXNzZXJ0IChnb3QgPiAwICYmIGdvdCA8PSB3YW50KTsKKyAgICAgIGdfYXNzZXJ0IChlcnJvciA9PSBOVUxMKTsKKyAgICAgIGIgKz0gZ290OworICAgICAgd2FudCAtPSBnb3Q7CisgICAgfQorICAgIGdfYXNzZXJ0IChtZW1jbXAgKHJlYWQsIFRFU1RfREFUQSwgMTApID09IDApOworICB9CisgIGdfb2JqZWN0X3VucmVmICh0YnVmZmVyKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfcmVhZF9hbmRfd3JpdGVfZXh0ZXJuYWwgKHZvaWQpCit7CisgIFRocmlmdE1lbW9yeUJ1ZmZlciAqdGJ1ZmZlciA9IE5VTEw7CisgIGdjaGFyICpiOworICBHRXJyb3IgKmVycm9yID0gTlVMTDsKKyAgR0J5dGVBcnJheSAqYnVmID0gZ19ieXRlX2FycmF5X25ldyAoKTsKKyAgZ19hc3NlcnQgKGJ1ZiAhPSBOVUxMKTsKKworICB0YnVmZmVyID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSLCAiYnVmIiwgYnVmLCBOVUxMKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9tZW1vcnlfYnVmZmVyX3dyaXRlIChUSFJJRlRfVFJBTlNQT1JUICh0YnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdwb2ludGVyKSBURVNUX0RBVEEsIDEwLCAmZXJyb3IpID09IFRSVUUpOworICBnX2Fzc2VydCAoZXJyb3IgPT0gTlVMTCk7CisKKyAgZ19hc3NlcnQgKG1lbWNtcCAoYnVmLT5kYXRhLCBURVNUX0RBVEEsIDEwKSA9PSAwKTsKKyAgZ19vYmplY3RfdW5yZWYgKHRidWZmZXIpOwogfQogCiBpbnQKIG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKIHsKICNpZiAoIUdMSUJfQ0hFQ0tfVkVSU0lPTiAoMiwgMzYsIDApKQotICBnX3R5cGVfaW5pdCgpOworICBnX3R5cGVfaW5pdCAoKTsKICNlbmRpZgogCiAgIGdfdGVzdF9pbml0ICgmYXJnYywgJmFyZ3YsIE5VTEwpOwogCiAgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0bWVtb3J5YnVmZmVyL0NyZWF0ZUFuZERlc3Ryb3kiLCB0ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveSk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0bWVtb3J5YnVmZmVyL0NyZWF0ZUFuZERlc3Ryb3lMYXJnZSIsIHRlc3RfY3JlYXRlX2FuZF9kZXN0cm95X2xhcmdlKTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RtZW1vcnlidWZmZXIvQ3JlYXRlQW5kRGVzdHJveVVubGltaXRlZCIsIHRlc3RfY3JlYXRlX2FuZF9kZXN0cm95X2RlZmF1bHQpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdG1lbW9yeWJ1ZmZlci9DcmVhdGVBbmREZXN0cm95RXh0ZXJuYWwiLCB0ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveV9leHRlcm5hbCk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0bWVtb3J5YnVmZmVyL0NyZWF0ZUFuZERlc3Ryb3lVbm93bmVkIiwgdGVzdF9jcmVhdGVfYW5kX2Rlc3Ryb3lfdW5vd25lZCk7CiAgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0bWVtb3J5YnVmZmVyL09wZW5BbmRDbG9zZSIsIHRlc3Rfb3Blbl9hbmRfY2xvc2UpOwogICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdG1lbW9yeWJ1ZmZlci9SZWFkQW5kV3JpdGUiLCB0ZXN0X3JlYWRfYW5kX3dyaXRlKTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RtZW1vcnlidWZmZXIvUmVhZEFuZFdyaXRlVW5saW1pdGVkIiwgdGVzdF9yZWFkX2FuZF93cml0ZV9kZWZhdWx0KTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RtZW1vcnlidWZmZXIvUmVhZEFuZFdyaXRlRXh0ZXJuYWwiLCB0ZXN0X3JlYWRfYW5kX3dyaXRlX2V4dGVybmFsKTsKIAogICByZXR1cm4gZ190ZXN0X3J1biAoKTsKIH0KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0b3B0aW9uYWxyZXF1aXJlZC5jIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RvcHRpb25hbHJlcXVpcmVkLmMKaW5kZXggYWUwYzNkMi4uNjM2YzM2ZCAxMDA3NTUKLS0tIGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3RvcHRpb25hbHJlcXVpcmVkLmMKKysrIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RvcHRpb25hbHJlcXVpcmVkLmMKQEAgLTE3LDcgKzE3LDYgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxnbGliLmg+CiAKICNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdF9zdHJ1Y3QuaD4KQEAgLTc2LDE4ICs3NSwxOCBAQAogCiAgIC8qIHdyaXRlLXRvLXJlYWQgd2l0aCBvcHRpb25hbCBmaWVsZHMgKi8KICAgczEtPmltX29wdGlvbmFsID0gMTA7Ci0gIGFzc2VydCAoczEtPl9faXNzZXRfaW1fZGVmYXVsdCA9PSBGQUxTRSk7Ci0gIGFzc2VydCAoczEtPl9faXNzZXRfaW1fb3B0aW9uYWwgPT0gRkFMU0UpOyAgCisgIGdfYXNzZXJ0IChzMS0+X19pc3NldF9pbV9kZWZhdWx0ID09IEZBTFNFKTsKKyAgZ19hc3NlcnQgKHMxLT5fX2lzc2V0X2ltX29wdGlvbmFsID09IEZBTFNFKTsgIAogICB3cml0ZV90b19yZWFkIChUSFJJRlRfU1RSVUNUIChzMSksIFRIUklGVF9TVFJVQ1QgKHMyKSwgTlVMTCwgTlVMTCk7Ci0gIGFzc2VydCAoczItPl9faXNzZXRfaW1fZGVmYXVsdCA9IFRSVUUpOwotICBhc3NlcnQgKHMyLT5fX2lzc2V0X2ltX29wdGlvbmFsID09IEZBTFNFKTsKLSAgYXNzZXJ0IChzMi0+aW1fb3B0aW9uYWwgPT0gMCk7CisgIGdfYXNzZXJ0IChzMi0+X19pc3NldF9pbV9kZWZhdWx0ID09IFRSVUUpOworICBnX2Fzc2VydCAoczItPl9faXNzZXRfaW1fb3B0aW9uYWwgPT0gRkFMU0UpOworICBnX2Fzc2VydCAoczItPmltX29wdGlvbmFsID09IDApOwogCiAgIHMxLT5fX2lzc2V0X2ltX29wdGlvbmFsID0gVFJVRTsKICAgd3JpdGVfdG9fcmVhZCAoVEhSSUZUX1NUUlVDVCAoczEpLCBUSFJJRlRfU1RSVUNUIChzMyksIE5VTEwsIE5VTEwpOwotICBhc3NlcnQgKHMzLT5fX2lzc2V0X2ltX2RlZmF1bHQgPT0gVFJVRSk7Ci0gIGFzc2VydCAoczMtPl9faXNzZXRfaW1fb3B0aW9uYWwgPT0gVFJVRSk7Ci0gIGFzc2VydCAoczMtPmltX29wdGlvbmFsID09IDEwKTsKKyAgZ19hc3NlcnQgKHMzLT5fX2lzc2V0X2ltX2RlZmF1bHQgPT0gVFJVRSk7CisgIGdfYXNzZXJ0IChzMy0+X19pc3NldF9pbV9vcHRpb25hbCA9PSBUUlVFKTsKKyAgZ19hc3NlcnQgKHMzLT5pbV9vcHRpb25hbCA9PSAxMCk7CiAKICAgZ19vYmplY3RfdW5yZWYgKHMxKTsKICAgZ19vYmplY3RfdW5yZWYgKHMyKTsKQEAgLTEwOSwxMCArMTA4LDEwIEBACiAgIHdyaXRlX3RvX3JlYWQgKFRIUklGVF9TVFJVQ1QgKHQyKSwgVEhSSUZUX1NUUlVDVCAodDEpLCBOVUxMLCBOVUxMKTsKICAgd3JpdGVfdG9fcmVhZCAoVEhSSUZUX1NUUlVDVCAodDEpLCBUSFJJRlRfU1RSVUNUICh0MiksIE5VTEwsIE5VTEwpOwogCi0gIGFzc2VydCAodDEtPl9faXNzZXRfaW1fZGVmYXVsdCA9PSBGQUxTRSk7Ci0gIGFzc2VydCAodDItPl9faXNzZXRfaW1fb3B0aW9uYWwgPT0gVFJVRSk7Ci0gIGFzc2VydCAodDEtPmltX2RlZmF1bHQgPT0gdDItPmltX29wdGlvbmFsKTsKLSAgYXNzZXJ0ICh0MS0+aW1fZGVmYXVsdCA9PSAwKTsKKyAgZ19hc3NlcnQgKHQxLT5fX2lzc2V0X2ltX2RlZmF1bHQgPT0gRkFMU0UpOworICBnX2Fzc2VydCAodDItPl9faXNzZXRfaW1fb3B0aW9uYWwgPT0gVFJVRSk7CisgIGdfYXNzZXJ0ICh0MS0+aW1fZGVmYXVsdCA9PSB0Mi0+aW1fb3B0aW9uYWwpOworICBnX2Fzc2VydCAodDEtPmltX2RlZmF1bHQgPT0gMCk7CiAKICAgZ19vYmplY3RfdW5yZWYgKHQxKTsKICAgZ19vYmplY3RfdW5yZWYgKHQyKTsKQEAgLTEzMyw3ICsxMzIsNyBAQAogICB3cml0ZV90b19yZWFkIChUSFJJRlRfU1RSVUNUICh0MSksIFRIUklGVF9TVFJVQ1QgKHQzKSwgTlVMTCwgTlVMTCk7CiAgIHdyaXRlX3RvX3JlYWQgKFRIUklGVF9TVFJVQ1QgKHQzKSwgVEhSSUZUX1NUUlVDVCAodDEpLCBOVUxMLCBOVUxMKTsKIAotICBhc3NlcnQgKHQxLT5fX2lzc2V0X2ltX2RlZmF1bHQgPT0gVFJVRSk7CisgIGdfYXNzZXJ0ICh0MS0+X19pc3NldF9pbV9kZWZhdWx0ID09IFRSVUUpOwogCiAgIGdfb2JqZWN0X3VucmVmICh0MSk7CiAgIGdfb2JqZWN0X3VucmVmICh0Myk7CkBAIC0xNzYsMTcgKzE3NSwzNyBAQAogCiAgIC8qIHRocm93cyBwcm90b2NvbCBleGNlcHRpb24gKi8KICAgd3JpdGVfdG9fcmVhZCAoVEhSSUZUX1NUUlVDVCAodDIpLCBUSFJJRlRfU1RSVUNUICh0MyksIE5VTEwsICZyZWFkX2Vycm9yKTsKLSAgYXNzZXJ0IChyZWFkX2Vycm9yICE9IE5VTEwpOworICBnX2Fzc2VydCAocmVhZF9lcnJvciAhPSBOVUxMKTsKICAgZ19lcnJvcl9mcmVlIChyZWFkX2Vycm9yKTsKIAogICB3cml0ZV90b19yZWFkIChUSFJJRlRfU1RSVUNUICh0MyksIFRIUklGVF9TVFJVQ1QgKHQyKSwgTlVMTCwgTlVMTCk7CiAKLSAgYXNzZXJ0ICh0Mi0+X19pc3NldF9pbV9vcHRpb25hbCk7CisgIGdfYXNzZXJ0ICh0Mi0+X19pc3NldF9pbV9vcHRpb25hbCk7CiAKICAgZ19vYmplY3RfdW5yZWYgKHQyKTsKICAgZ19vYmplY3RfdW5yZWYgKHQzKTsKIH0KIAorc3RhdGljIHZvaWQKK3Rlc3Rfbm9uX3NldF9iaW5hcnkgKHZvaWQpCit7CisgIFRUZXN0QmluYXJpZXMgKmIxID0gTlVMTDsKKyAgVFRlc3RCaW5hcmllcyAqYjIgPSBOVUxMOworICBHRXJyb3IgKmVycm9yID0gTlVMTDsKKworICBiMSA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfQklOQVJJRVMsIE5VTEwpOworICBiMiA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfQklOQVJJRVMsIE5VTEwpOworCisgIHdyaXRlX3RvX3JlYWQgKFRIUklGVF9TVFJVQ1QgKGIxKSwgVEhSSUZUX1NUUlVDVCAoYjIpLCBOVUxMLCAmZXJyb3IpOworICBnX2Fzc2VydCghZXJyb3IpOworICB3cml0ZV90b19yZWFkIChUSFJJRlRfU1RSVUNUIChiMiksIFRIUklGVF9TVFJVQ1QgKGIxKSwgTlVMTCwgJmVycm9yKTsKKyAgZ19hc3NlcnQoIWVycm9yKTsKKyAgLyogT0suIE5vIHNlZ2ZhdWx0ICovCisKKyAgZ19vYmplY3RfdW5yZWYgKGIxKTsKKyAgZ19vYmplY3RfdW5yZWYgKGIyKTsKK30KKwogaW50CiBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7CkBAIC0yMDIsNiArMjIxLDcgQEAKICAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RvcHRpb25hbHJlcXVpcmVkL1RyaWNreTIiLCB0ZXN0X3RyaWNreTIpOwogICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdG9wdGlvbmFscmVxdWlyZWQvVHJpY2t5MyIsIHRlc3RfdHJpY2t5Myk7CiAgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0b3B0aW9uYWxyZXF1aXJlZC9Ucmlja3k0IiwgdGVzdF90cmlja3k0KTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RvcHRpb25hbHJlcXVpcmVkL0JpbmFyeSIsIHRlc3Rfbm9uX3NldF9iaW5hcnkpOwogCiAgIHJldHVybiBnX3Rlc3RfcnVuICgpOwogfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3RzZXJpYWxpemF0aW9uLmMgYi9saWIvY19nbGliL3Rlc3QvdGVzdHNlcmlhbGl6YXRpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2Q0MTFkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RzZXJpYWxpemF0aW9uLmMKQEAgLTAsMCArMSw5NSBAQAorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X21lbW9yeV9idWZmZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSAiZ2VuLWNfZ2xpYi90X3Rlc3RfZGVidWdfcHJvdG9fdGVzdF90eXBlcy5oIgorI2luY2x1ZGUgImdlbi1jX2dsaWIvdF90ZXN0X2VudW1fdGVzdF90eXBlcy5oIgorCitzdGF0aWMgdm9pZCBlbnVtX2NvbnN0YW50c19yZWFkX3dyaXRlKCkgeworICBHRXJyb3IqIGVycm9yID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0KiB0cmFuc3BvcnQKKyAgICAgID0gVEhSSUZUX1RSQU5TUE9SVChnX29iamVjdF9uZXcoVEhSSUZUX1RZUEVfTUVNT1JZX0JVRkZFUiwgImJ1Zl9zaXplIiwgMTAyNCwgTlVMTCkpOworICBUaHJpZnRQcm90b2NvbCogcHJvdG9jb2wKKyAgICAgID0gVEhSSUZUX1BST1RPQ09MKGdfb2JqZWN0X25ldyhUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wsICJ0cmFuc3BvcnQiLCB0cmFuc3BvcnQsIE5VTEwpKTsKKyAgVFRlc3RFbnVtVGVzdFN0cnVjdCogc3JjID0gVF9URVNUX0VOVU1fVEVTVDsKKyAgVFRlc3RFbnVtVGVzdFN0cnVjdCogZHN0ID0gZ19vYmplY3RfbmV3KFRfVEVTVF9UWVBFX0VOVU1fVEVTVF9TVFJVQ1QsIE5VTEwpOworICBUVGVzdEVudW1UZXN0U3RydWN0Q2xhc3MqIGNscyA9IFRfVEVTVF9FTlVNX1RFU1RfU1RSVUNUX0dFVF9DTEFTUyhzcmMpOworICBpbnQgd3JpdGVfbGVuOworICBpbnQgcmVhZF9sZW47CisKKyAgd3JpdGVfbGVuID0gVEhSSUZUX1NUUlVDVF9DTEFTUyhjbHMpLT53cml0ZShUSFJJRlRfU1RSVUNUKHNyYyksIHByb3RvY29sLCAmZXJyb3IpOworICBnX2Fzc2VydCghZXJyb3IpOworICBnX2Fzc2VydCh3cml0ZV9sZW4gPiAwKTsKKworICByZWFkX2xlbiA9IFRIUklGVF9TVFJVQ1RfQ0xBU1MoY2xzKS0+cmVhZChUSFJJRlRfU1RSVUNUKGRzdCksIHByb3RvY29sLCAmZXJyb3IpOworICBnX2Fzc2VydCghZXJyb3IpOworICBnX2Fzc2VydF9jbXBpbnQod3JpdGVfbGVuLCA9PSwgcmVhZF9sZW4pOworCisgIGdfb2JqZWN0X3VucmVmKGRzdCk7CisgIGdfb2JqZWN0X3VucmVmKHByb3RvY29sKTsKKyAgZ19vYmplY3RfdW5yZWYodHJhbnNwb3J0KTsKK30KKworc3RhdGljIHZvaWQgc3RydWN0X2NvbnN0YW50c19yZWFkX3dyaXRlKCkgeworICBHRXJyb3IqIGVycm9yID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0KiB0cmFuc3BvcnQKKyAgICAgID0gVEhSSUZUX1RSQU5TUE9SVChnX29iamVjdF9uZXcoVEhSSUZUX1RZUEVfTUVNT1JZX0JVRkZFUiwgImJ1Zl9zaXplIiwgNDA5NiwgTlVMTCkpOworICBUaHJpZnRQcm90b2NvbCogcHJvdG9jb2wKKyAgICAgID0gVEhSSUZUX1BST1RPQ09MKGdfb2JqZWN0X25ldyhUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wsICJ0cmFuc3BvcnQiLCB0cmFuc3BvcnQsIE5VTEwpKTsKKyAgVFRlc3RDb21wYWN0UHJvdG9UZXN0U3RydWN0KiBzcmMgPSBUX1RFU1RfQ09NUEFDVF9URVNUOworICBUVGVzdENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QqIGRzdCA9IGdfb2JqZWN0X25ldyhUX1RFU1RfVFlQRV9DT01QQUNUX1BST1RPX1RFU1RfU1RSVUNULCBOVUxMKTsKKyAgVFRlc3RDb21wYWN0UHJvdG9UZXN0U3RydWN0Q2xhc3MqIGNscyA9IFRfVEVTVF9DT01QQUNUX1BST1RPX1RFU1RfU1RSVUNUX0dFVF9DTEFTUyhzcmMpOworICBpbnQgd3JpdGVfbGVuOworICBpbnQgcmVhZF9sZW47CisKKyAgd3JpdGVfbGVuID0gVEhSSUZUX1NUUlVDVF9DTEFTUyhjbHMpLT53cml0ZShUSFJJRlRfU1RSVUNUKHNyYyksIHByb3RvY29sLCAmZXJyb3IpOworICBnX2Fzc2VydCghZXJyb3IpOworICBnX2Fzc2VydCh3cml0ZV9sZW4gPiAwKTsKKworICByZWFkX2xlbiA9IFRIUklGVF9TVFJVQ1RfQ0xBU1MoY2xzKS0+cmVhZChUSFJJRlRfU1RSVUNUKGRzdCksIHByb3RvY29sLCAmZXJyb3IpOworICBnX2Fzc2VydCghZXJyb3IpOworICBnX2Fzc2VydF9jbXBpbnQod3JpdGVfbGVuLCA9PSwgcmVhZF9sZW4pOworCisgIGdfb2JqZWN0X3VucmVmKGRzdCk7CisgIGdfb2JqZWN0X3VucmVmKHByb3RvY29sKTsKKyAgZ19vYmplY3RfdW5yZWYodHJhbnNwb3J0KTsKK30KKworc3RhdGljIHZvaWQgc3RydWN0X3JlYWRfd3JpdGVfbGVuZ3RoX3Nob3VsZF9lcXVhbCgpIHsKKyAgR0Vycm9yKiBlcnJvciA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCogdHJhbnNwb3J0CisgICAgICA9IFRIUklGVF9UUkFOU1BPUlQoZ19vYmplY3RfbmV3KFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIsICJidWZfc2l6ZSIsIDIwNDgsIE5VTEwpKTsKKyAgVGhyaWZ0UHJvdG9jb2wqIHByb3RvY29sCisgICAgICA9IFRIUklGVF9QUk9UT0NPTChnX29iamVjdF9uZXcoVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MLCAidHJhbnNwb3J0IiwgdHJhbnNwb3J0LCBOVUxMKSk7CisgIFRUZXN0Qm9uayogc3JjID0gZ19vYmplY3RfbmV3KFRfVEVTVF9UWVBFX0JPTkssIE5VTEwpOworICBUVGVzdEJvbmsqIGRzdCA9IGdfb2JqZWN0X25ldyhUX1RFU1RfVFlQRV9CT05LLCBOVUxMKTsKKyAgVFRlc3RCb25rQ2xhc3MqIGNscyA9IFRfVEVTVF9CT05LX0dFVF9DTEFTUyhzcmMpOworICBpbnQgd3JpdGVfbGVuOworICBpbnQgcmVhZF9sZW47CisKKyAgd3JpdGVfbGVuID0gVEhSSUZUX1NUUlVDVF9DTEFTUyhjbHMpLT53cml0ZShUSFJJRlRfU1RSVUNUKHNyYyksIHByb3RvY29sLCAmZXJyb3IpOworICBnX2Fzc2VydCghZXJyb3IpOworICBnX2Fzc2VydCh3cml0ZV9sZW4gPiAwKTsKKworICByZWFkX2xlbiA9IFRIUklGVF9TVFJVQ1RfQ0xBU1MoY2xzKS0+cmVhZChUSFJJRlRfU1RSVUNUKGRzdCksIHByb3RvY29sLCAmZXJyb3IpOworICBnX2Fzc2VydCghZXJyb3IpOworICBnX2Fzc2VydF9jbXBpbnQod3JpdGVfbGVuLCA9PSwgcmVhZF9sZW4pOworCisgIGdfb2JqZWN0X3VucmVmKGRzdCk7CisgIGdfb2JqZWN0X3VucmVmKHNyYyk7CisgIGdfb2JqZWN0X3VucmVmKHByb3RvY29sKTsKKyAgZ19vYmplY3RfdW5yZWYodHJhbnNwb3J0KTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworI2lmICghR0xJQl9DSEVDS19WRVJTSU9OKDIsIDM2LCAwKSkKKyAgZ190eXBlX2luaXQoKTsKKyNlbmRpZgorICBnX3Rlc3RfaW5pdCgmYXJnYywgJmFyZ3YsIE5VTEwpOworCisgIGdfdGVzdF9hZGRfZnVuYygiL3Rlc3RzZXJpYWxpemF0aW9uL1N0cnVjdFJlYWRXcml0ZUxlbmd0aFNob3VsZEVxdWFsIiwKKyAgICAgICAgICAgICAgICAgIHN0cnVjdF9yZWFkX3dyaXRlX2xlbmd0aF9zaG91bGRfZXF1YWwpOworICBnX3Rlc3RfYWRkX2Z1bmMoIi90ZXN0c2VyaWFsaXphdGlvbi9TdHJ1Y3RDb25zdGFudHMiLCBzdHJ1Y3RfY29uc3RhbnRzX3JlYWRfd3JpdGUpOworICBnX3Rlc3RfYWRkX2Z1bmMoIi90ZXN0c2VyaWFsaXphdGlvbi9FbnVtQ29uc3RhbnRzIiwgZW51bV9jb25zdGFudHNfcmVhZF93cml0ZSk7CisgIHJldHVybiBnX3Rlc3RfcnVuKCk7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3Rlc3QvdGVzdHNpbXBsZXNlcnZlci5jIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RzaW1wbGVzZXJ2ZXIuYwppbmRleCAzYWYyZWViLi4zYzZmMmU4IDEwMDc1NQotLS0gYS9saWIvY19nbGliL3Rlc3QvdGVzdHNpbXBsZXNlcnZlci5jCisrKyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0c2ltcGxlc2VydmVyLmMKQEAgLTE3LDcgKzE3LDYgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxnbGliLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CkBAIC04OSw3ICs4OCw3IEBACiAKICAgLyogcnVuIHRoZSBzZXJ2ZXIgaW4gYSBjaGlsZCBwcm9jZXNzICovCiAgIHBpZCA9IGZvcmsgKCk7Ci0gIGFzc2VydCAocGlkID49IDApOworICBnX2Fzc2VydCAocGlkID49IDApOwogCiAgIGlmIChwaWQgPT0gMCkKICAgewpAQCAtMTAzLDggKzEwMiw4IEBACiAgICAgZ19vYmplY3RfdW5yZWYgKHNzKTsKICAgICBnX29iamVjdF91bnJlZiAodHNzKTsKICAgICBnX29iamVjdF91bnJlZiAocCk7Ci0gICAgYXNzZXJ0ICh3YWl0ICgmc3RhdHVzKSA9PSBwaWQpOwotICAgIGFzc2VydCAoc3RhdHVzID09IFNJR0lOVCk7CisgICAgZ19hc3NlcnQgKHdhaXQgKCZzdGF0dXMpID09IHBpZCk7CisgICAgZ19hc3NlcnQgKHN0YXR1cyA9PSBTSUdJTlQpOwogICB9CiB9CiAKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0c3RydWN0LmMgYi9saWIvY19nbGliL3Rlc3QvdGVzdHN0cnVjdC5jCmluZGV4IDVkNGJhZjMuLmQxMjBjYmMgMTAwNzU1Ci0tLSBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0c3RydWN0LmMKKysrIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RzdHJ1Y3QuYwpAQCAtMTcsNyArMTcsNiBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CiAKICNpbmNsdWRlICIuLi9zcmMvdGhyaWZ0L2NfZ2xpYi90aHJpZnRfc3RydWN0LmMiCkBAIC04OSw3ICs4OCw3IEBACiAgIFRocmlmdFRlc3RTdHJ1Y3QgKnQgPSBOVUxMOwogCiAgIHQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1RFU1RfU1RSVUNULCBOVUxMKTsKLSAgYXNzZXJ0ICggVEhSSUZUX0lTX1NUUlVDVCAodCkpOworICBnX2Fzc2VydCAoIFRIUklGVF9JU19TVFJVQ1QgKHQpKTsKICAgdGhyaWZ0X3N0cnVjdF9yZWFkIChUSFJJRlRfU1RSVUNUICh0KSwgTlVMTCwgTlVMTCk7CiAgIHRocmlmdF9zdHJ1Y3Rfd3JpdGUgKFRIUklGVF9TVFJVQ1QgKHQpLCBOVUxMLCBOVUxMKTsKICAgdGhyaWZ0X3Rlc3Rfc3RydWN0X3JlYWQgKFRIUklGVF9TVFJVQ1QgKHQpLCBOVUxMLCBOVUxMKTsKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0dGhyaWZ0dGVzdC5jIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3R0aHJpZnR0ZXN0LmMKaW5kZXggNWYwZjZlMy4uMjNhOTM0ZCAxMDA3NTUKLS0tIGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3R0aHJpZnR0ZXN0LmMKKysrIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3R0aHJpZnR0ZXN0LmMKQEAgLTEsOSArMSwxMiBAQAotI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPG5ldGRiLmg+CiAKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgogI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuaD4KIAorI2luY2x1ZGUgInRfdGVzdF90aHJpZnRfdGVzdF90eXBlcy5oIgorI2luY2x1ZGUgInRocmlmdF90ZXN0X2hhbmRsZXIuaCIKKwogc3RhdGljIGNvbnN0IGNoYXIgVEVTVF9BRERSRVNTW10gPSAibG9jYWxob3N0IjsKIHN0YXRpYyBjb25zdCBpbnQgVEVTVF9QT1JUID0gNjQ0NDQ7CiAKQEAgLTE2LDYgKzE5LDgzIEBACiAgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKIH0KIAorc3RhdGljIHZvaWQKK3NldF9pbmRpY2F0b3IgKGdwb2ludGVyIGRhdGEsIEdPYmplY3QgKndoZXJlX3RoZV9vYmplY3Rfd2FzKSB7CisgIFRIUklGVF9VTlVTRURfVkFSKHdoZXJlX3RoZV9vYmplY3Rfd2FzKTsKKworICAqKGdib29sZWFuICopIGRhdGEgPSBUUlVFOworfQorCitzdGF0aWMgdm9pZAordGVzdF90aHJpZnRfaGFuZGxlciAodm9pZCkKK3sKKyAgR0Vycm9yICplcnJvcjsKKyAgR0hhc2hUYWJsZSAqX3JldHVybjsKKyAgVFRlc3RJbnNhbml0eSAqYXJndW1lbnQ7CisgIGdib29sZWFuIGluZGljYXRvcjsKKworICBUVGVzdFh0cnVjdCAgKnh0cnVjdCwgICp4dHJ1Y3QyOworICBUVGVzdE51bWJlcnogbnVtYmVyejsKKyAgVFRlc3ROdW1iZXJ6IG51bWJlcnoyOworICBUVGVzdFVzZXJJZCB1c2VyX2lkLCAqdXNlcl9pZF9wdHIsICp1c2VyX2lkX3B0cjI7CisgIEdIYXNoVGFibGUgKnVzZXJfbWFwOworICBHUHRyQXJyYXkgKnh0cnVjdHM7CisKKyAgZXJyb3IgPSBOVUxMOworICBpbmRpY2F0b3IgPSBGQUxTRTsKKworICB1c2VyX21hcCA9IE5VTEw7CisgIHh0cnVjdHMgPSBOVUxMOworCisgIGFyZ3VtZW50ID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9JTlNBTklUWSwgTlVMTCk7CisgIGdfb2JqZWN0X2dldCAoYXJndW1lbnQsCisgICAgICAgICAgICAgICAgInVzZXJNYXAiLCAmdXNlcl9tYXAsCisgICAgICAgICAgICAgICAgInh0cnVjdHMiLCAmeHRydWN0cywKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICBudW1iZXJ6ID0gVF9URVNUX05VTUJFUlpfRklWRTsKKyAgbnVtYmVyejIgPSBUX1RFU1RfTlVNQkVSWl9FSUdIVDsKKyAgdXNlcl9pZF9wdHIgPSBnX21hbGxvYyAoc2l6ZW9mICp1c2VyX2lkX3B0cik7CisgICp1c2VyX2lkX3B0ciA9IDU7CisgIHVzZXJfaWRfcHRyMiA9IGdfbWFsbG9jIChzaXplb2YgKnVzZXJfaWRfcHRyKTsKKyAgKnVzZXJfaWRfcHRyMiA9IDg7CisgIGdfaGFzaF90YWJsZV9pbnNlcnQgKHVzZXJfbWFwLCAoZ3BvaW50ZXIpbnVtYmVyeiwgdXNlcl9pZF9wdHIpOworICBnX2hhc2hfdGFibGVfaW5zZXJ0ICh1c2VyX21hcCwgKGdwb2ludGVyKW51bWJlcnoyLCB1c2VyX2lkX3B0cjIpOworICBnX2hhc2hfdGFibGVfdW5yZWYgKHVzZXJfbWFwKTsKKworICB4dHJ1Y3QgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1hUUlVDVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAic3RyaW5nX3RoaW5nIiwgIkhlbGxvMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgImJ5dGVfdGhpbmciLCAgIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgImkzMl90aGluZyIsICAgIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgImk2NF90aGluZyIsICAgIDJMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgeHRydWN0MiA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfWFRSVUNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyaW5nX3RoaW5nIiwgIkdvb2RieWU0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImJ5dGVfdGhpbmciLCAgIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJpMzJfdGhpbmciLCAgICA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAiaTY0X3RoaW5nIiwgICAgNExMLAorICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgZ19wdHJfYXJyYXlfYWRkICh4dHJ1Y3RzLCB4dHJ1Y3QyKTsKKyAgZ19wdHJfYXJyYXlfYWRkICh4dHJ1Y3RzLCB4dHJ1Y3QpOworICBnX3B0cl9hcnJheV91bnJlZiAoeHRydWN0cyk7CisKKyAgX3JldHVybiA9IGdfaGFzaF90YWJsZV9uZXdfZnVsbCAoZ19pbnQ2NF9oYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnX2ludDY0X2VxdWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnX2ZyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChHRGVzdHJveU5vdGlmeSlnX2hhc2hfdGFibGVfdW5yZWYpOworCisgIGdfb2JqZWN0X3dlYWtfcmVmIChHX09CSkVDVCAoYXJndW1lbnQpLCBzZXRfaW5kaWNhdG9yLCAoZ3BvaW50ZXIpICZpbmRpY2F0b3IpOworCisgIGdfYXNzZXJ0ICh0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfaW5zYW5pdHkgKE5VTEwsICZfcmV0dXJuLCBhcmd1bWVudCwgJmVycm9yKSk7CisgIGdfYXNzZXJ0ICghIGluZGljYXRvcik7CisKKyAgZ19oYXNoX3RhYmxlX3VucmVmIChfcmV0dXJuKTsKKyAgZ19hc3NlcnQgKCEgaW5kaWNhdG9yKTsKKworICBnX29iamVjdF91bnJlZiAoYXJndW1lbnQpOworICBnX2Fzc2VydCAoaW5kaWNhdG9yKTsKK30KKwogaW50CiBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7CkBAIC0yNiw2ICsxMDYsNyBAQAogICBnX3Rlc3RfaW5pdCAoJmFyZ2MsICZhcmd2LCBOVUxMKTsKIAogICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdHRocmlmdC9TZXJ2ZXIiLCB0ZXN0X3RocmlmdF9zZXJ2ZXIpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdHRocmlmdC9IYW5kbGVyIiwgdGVzdF90aHJpZnRfaGFuZGxlcik7CiAKICAgcmV0dXJuIGdfdGVzdF9ydW4gKCk7CiB9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3Rlc3QvdGVzdHRocmlmdHRlc3RjbGllbnQuY3BwIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3R0aHJpZnR0ZXN0Y2xpZW50LmNwcAppbmRleCBlNjE4ZmU5Li4xOTEwYzhhIDEwMDc1NQotLS0gYS9saWIvY19nbGliL3Rlc3QvdGVzdHRocmlmdHRlc3RjbGllbnQuY3BwCisrKyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0dGhyaWZ0dGVzdGNsaWVudC5jcHAKQEAgLTE3LDcgKzE3LDcgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8qIHRlc3QgYSBDIGNsaWVudCB3aXRoIGEgQysrIHNlcnZlciAqLworLyogdGVzdCBhIEMgY2xpZW50IHdpdGggYSBDKysgc2VydmVyICAodGhhdCBtYWtlcyBzZW5zZS4uLikgKi8KIAogI2luY2x1ZGUgPHNpZ25hbC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgpAQCAtMjUsMjMgKzI1LDM0IEBACiAjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgogI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9URGVidWdQcm90b2NvbC5oPgogI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5oPgorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaD4KICNpbmNsdWRlICJUaHJpZnRUZXN0LmgiCiAjaW5jbHVkZSAiVGhyaWZ0VGVzdF90eXBlcy5oIgogCiAjaW5jbHVkZSA8aW9zdHJlYW0+Ci0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci11c2luZyBuYW1lc3BhY2UgYm9vc3Q7CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgogCiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI7Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKIAogdXNpbmcgbmFtZXNwYWNlIHRocmlmdDo6dGVzdDsKIAordXNpbmcgc3RkOjpjb3V0OwordXNpbmcgc3RkOjplbmRsOwordXNpbmcgc3RkOjpmaXhlZDsKK3VzaW5nIHN0ZDo6bWFrZV9wYWlyOwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6OnNldDsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjp2ZWN0b3I7CisKICNkZWZpbmUgVEVTVF9QT1JUIDk5ODAKIAogLy8gRXh0cmEgZnVuY3Rpb25zIHJlcXVpcmVkIGZvciBUaHJpZnRUZXN0X3R5cGVzIHRvIHdvcmsKQEAgLTU5LDEyOCArNzAsMTMwIEBACiAgIFRlc3RIYW5kbGVyKCkge30KIAogICB2b2lkIHRlc3RWb2lkKCkgewotICAgIHByaW50ZigiW0MgLT4gQysrXSB0ZXN0Vm9pZCgpXG4iKTsKKyAgICBjb3V0IDw8ICJbQyAtPiBDKytdIHRlc3RWb2lkKCkiIDw8IGVuZGw7CiAgIH0KIAogICB2b2lkIHRlc3RTdHJpbmcoc3RyaW5nJiBvdXQsIGNvbnN0IHN0cmluZyAmdGhpbmcpIHsKLSAgICBwcmludGYoIltDIC0+IEMrK10gdGVzdFN0cmluZyhcIiVzXCIpXG4iLCB0aGluZy5jX3N0cigpKTsKKyAgICBjb3V0IDw8ICJbQyAtPiBDKytdIHRlc3RTdHJpbmcoXCIiIDw8IHRoaW5nIDw8ICJcIikiIDw8IGVuZGw7CiAgICAgb3V0ID0gdGhpbmc7CiAgIH0KIAogICBib29sIHRlc3RCb29sKGNvbnN0IGJvb2wgdGhpbmcpIHsKLSAgICBwcmludGYoIltDIC0+IEMrK10gdGVzdEJvb2woJXMpXG4iLCB0aGluZyA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgIGNvdXQgPDwgIltDIC0+IEMrK10gdGVzdEJvb2woIiA8PCAodGhpbmcgPyAidHJ1ZSIgOiAiZmFsc2UiKSA8PCAiKSIgPDwgZW5kbDsKICAgICByZXR1cm4gdGhpbmc7CiAgIH0KICAgaW50OF90IHRlc3RCeXRlKGNvbnN0IGludDhfdCB0aGluZykgewotICAgIHByaW50ZigiW0MgLT4gQysrXSB0ZXN0Qnl0ZSglZClcbiIsIChpbnQpdGhpbmcpOworICAgIGNvdXQgPDwgIltDIC0+IEMrK10gdGVzdEJ5dGUoIiA8PCAoaW50KXRoaW5nIDw8ICIpIiA8PCBlbmRsOwogICAgIHJldHVybiB0aGluZzsKICAgfQogICBpbnQzMl90IHRlc3RJMzIoY29uc3QgaW50MzJfdCB0aGluZykgewotICAgIHByaW50ZigiW0MgLT4gQysrXSB0ZXN0STMyKCVkKVxuIiwgdGhpbmcpOworICAgIGNvdXQgPDwgIltDIC0+IEMrK10gdGVzdEkzMigiIDw8IHRoaW5nIDw8ICIpIiA8PCBlbmRsOwogICAgIHJldHVybiB0aGluZzsKICAgfQogCiAgIGludDY0X3QgdGVzdEk2NChjb25zdCBpbnQ2NF90IHRoaW5nKSB7Ci0gICAgcHJpbnRmKCJbQyAtPiBDKytdIHRlc3RJNjQoJWxkKVxuIiwgdGhpbmcpOworICAgIGNvdXQgPDwgIltDIC0+IEMrK10gdGVzdEk2NCgiIDw8IHRoaW5nIDw8ICIpIiA8PCBlbmRsOwogICAgIHJldHVybiB0aGluZzsKICAgfQogCiAgIGRvdWJsZSB0ZXN0RG91YmxlKGNvbnN0IGRvdWJsZSB0aGluZykgewotICAgIHByaW50ZigiW0MgLT4gQysrXSB0ZXN0RG91YmxlKCVsZilcbiIsIHRoaW5nKTsKKyAgICBjb3V0LnByZWNpc2lvbig2KTsKKyAgICBjb3V0IDw8ICJbQyAtPiBDKytdIHRlc3REb3VibGUoIiA8PCBmaXhlZCA8PCB0aGluZyA8PCAiKSIgPDwgZW5kbDsKICAgICByZXR1cm4gdGhpbmc7CiAgIH0KIAogICB2b2lkIHRlc3RCaW5hcnkoc3RyaW5nJiBvdXQsIGNvbnN0IHN0cmluZyAmdGhpbmcpIHsKLSAgICBwcmludGYoIltDIC0+IEMrK10gdGVzdEJpbmFyeShcIiVzXCIpXG4iLCB0aGluZy5jX3N0cigpKTsKKyAgICBjb3V0IDw8ICJbQyAtPiBDKytdIHRlc3RCaW5hcnkoXCIiIDw8IHRoaW5nIDw8ICJcIikiIDw8IGVuZGw7CiAgICAgb3V0ID0gdGhpbmc7CiAgIH0KIAogICB2b2lkIHRlc3RTdHJ1Y3QoWHRydWN0JiBvdXQsIGNvbnN0IFh0cnVjdCAmdGhpbmcpIHsKLSAgICBwcmludGYoIltDIC0+IEMrK10gdGVzdFN0cnVjdCh7XCIlc1wiLCAlZCwgJWQsICVsZH0pXG4iLCB0aGluZy5zdHJpbmdfdGhpbmcuY19zdHIoKSwgKGludCl0aGluZy5ieXRlX3RoaW5nLCB0aGluZy5pMzJfdGhpbmcsIHRoaW5nLmk2NF90aGluZyk7CisgICAgY291dCA8PCAiW0MgLT4gQysrXSB0ZXN0U3RydWN0KHtcIiIgPDwgdGhpbmcuc3RyaW5nX3RoaW5nIDw8ICJcIiwgIiA8PCAoaW50KXRoaW5nLmJ5dGVfdGhpbmcgPDwgIiwgIiA8PCB0aGluZy5pMzJfdGhpbmcgPDwgIiwgIiA8PCB0aGluZy5pNjRfdGhpbmcgPDwgIn0pIiA8PCBlbmRsOwogICAgIG91dCA9IHRoaW5nOwogICB9CiAKICAgdm9pZCB0ZXN0TmVzdChYdHJ1Y3QyJiBvdXQsIGNvbnN0IFh0cnVjdDImIG5lc3QpIHsKICAgICBjb25zdCBYdHJ1Y3QgJnRoaW5nID0gbmVzdC5zdHJ1Y3RfdGhpbmc7Ci0gICAgcHJpbnRmKCJbQyAtPiBDKytdIHRlc3ROZXN0KHslZCwge1wiJXNcIiwgJWQsICVkLCAlbGR9LCAlZH0pXG4iLCAoaW50KW5lc3QuYnl0ZV90aGluZywgdGhpbmcuc3RyaW5nX3RoaW5nLmNfc3RyKCksIChpbnQpdGhpbmcuYnl0ZV90aGluZywgdGhpbmcuaTMyX3RoaW5nLCB0aGluZy5pNjRfdGhpbmcsIG5lc3QuaTMyX3RoaW5nKTsKKyAgICBjb3V0IDw8ICJbQyAtPiBDKytdIHRlc3ROZXN0KHsiIDw8IChpbnQpbmVzdC5ieXRlX3RoaW5nIDw8ICIsIHtcIiIgPDwgdGhpbmcuc3RyaW5nX3RoaW5nIDw8ICJcIiwgIiA8PCAoaW50KXRoaW5nLmJ5dGVfdGhpbmcgPDwgIiwgIiA8PCB0aGluZy5pMzJfdGhpbmcgPDwgIiwgIiA8PCB0aGluZy5pNjRfdGhpbmcgPDwgIn0sICIgPDwgbmVzdC5pMzJfdGhpbmcgPDwgIn0pIiA8PCBlbmRsOwogICAgIG91dCA9IG5lc3Q7CiAgIH0KIAogICB2b2lkIHRlc3RNYXAobWFwPGludDMyX3QsIGludDMyX3Q+ICZvdXQsIGNvbnN0IG1hcDxpbnQzMl90LCBpbnQzMl90PiAmdGhpbmcpIHsKLSAgICBwcmludGYoIltDIC0+IEMrK10gdGVzdE1hcCh7Iik7CisgICAgY291dCA8PCAiW0MgLT4gQysrXSB0ZXN0TWFwKHsiOwogICAgIG1hcDxpbnQzMl90LCBpbnQzMl90Pjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwogICAgIGJvb2wgZmlyc3QgPSB0cnVlOwogICAgIGZvciAobV9pdGVyID0gdGhpbmcuYmVnaW4oKTsgbV9pdGVyICE9IHRoaW5nLmVuZCgpOyArK21faXRlcikgewogICAgICAgaWYgKGZpcnN0KSB7CiAgICAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICAgICB9IGVsc2UgewotICAgICAgICBwcmludGYoIiwgIik7CisgICAgICAgIGNvdXQgPDwgIiwgIjsKICAgICAgIH0KLSAgICAgIHByaW50ZigiJWQgPT4gJWQiLCBtX2l0ZXItPmZpcnN0LCBtX2l0ZXItPnNlY29uZCk7CisgICAgICBjb3V0IDw8IG1faXRlci0+Zmlyc3QgPDwgIiA9PiAiIDw8IG1faXRlci0+c2Vjb25kOwogICAgIH0KLSAgICBwcmludGYoIn0pXG4iKTsKKyAgICBjb3V0IDw8ICJ9KSIgPDwgZW5kbDsKICAgICBvdXQgPSB0aGluZzsKICAgfQogCiAgIHZvaWQgdGVzdFN0cmluZ01hcChtYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiAmb3V0LCBjb25zdCBtYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiAmdGhpbmcpIHsKLSAgICBwcmludGYoIltDIC0+IEMrK10gdGVzdFN0cmluZ01hcCh7Iik7CisgICAgY291dCA8PCAiW0MgLT4gQysrXSB0ZXN0U3RyaW5nTWFwKHsiOwogICAgIG1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CiAgICAgYm9vbCBmaXJzdCA9IHRydWU7CiAgICAgZm9yIChtX2l0ZXIgPSB0aGluZy5iZWdpbigpOyBtX2l0ZXIgIT0gdGhpbmcuZW5kKCk7ICsrbV9pdGVyKSB7CiAgICAgICBpZiAoZmlyc3QpIHsKICAgICAgICAgZmlyc3QgPSBmYWxzZTsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHByaW50ZigiLCAiKTsKKyAgICAgICAgY291dCA8PCAiLCAiOwogICAgICAgfQotICAgICAgcHJpbnRmKCJcIiVzXCIgPT4gXCIlc1wiIiwgKG1faXRlci0+Zmlyc3QpLmNfc3RyKCksIChtX2l0ZXItPnNlY29uZCkuY19zdHIoKSk7CisgICAgICBjb3V0IDw8ICJcIiIgPDwgbV9pdGVyLT5maXJzdCA8PCAiXCIgPT4gXCIiIDw8IG1faXRlci0+c2Vjb25kIDw8ICJcIiI7CiAgICAgfQotICAgIHByaW50ZigifSlcbiIpOworICAgIGNvdXQgPDwgIn0pIiA8PCBlbmRsOwogICAgIG91dCA9IHRoaW5nOwogICB9CiAKIAogICB2b2lkIHRlc3RTZXQoc2V0PGludDMyX3Q+ICZvdXQsIGNvbnN0IHNldDxpbnQzMl90PiAmdGhpbmcpIHsKLSAgICBwcmludGYoIltDIC0+IEMrK10gdGVzdFNldCh7Iik7CisgICAgY291dCA8PCAiW0MgLT4gQysrXSB0ZXN0U2V0KHsiOwogICAgIHNldDxpbnQzMl90Pjo6Y29uc3RfaXRlcmF0b3Igc19pdGVyOwogICAgIGJvb2wgZmlyc3QgPSB0cnVlOwogICAgIGZvciAoc19pdGVyID0gdGhpbmcuYmVnaW4oKTsgc19pdGVyICE9IHRoaW5nLmVuZCgpOyArK3NfaXRlcikgewogICAgICAgaWYgKGZpcnN0KSB7CiAgICAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICAgICB9IGVsc2UgewotICAgICAgICBwcmludGYoIiwgIik7CisgICAgICAgIGNvdXQgPDwgIiwgIjsKICAgICAgIH0KLSAgICAgIHByaW50ZigiJWQiLCAqc19pdGVyKTsKKyAgICAgIGNvdXQgPDwgKnNfaXRlcjsKICAgICB9Ci0gICAgcHJpbnRmKCJ9KVxuIik7CisgICAgY291dCA8PCAifSkiIDw8IGVuZGw7CiAgICAgb3V0ID0gdGhpbmc7CiAgIH0KIAogICB2b2lkIHRlc3RMaXN0KHZlY3RvcjxpbnQzMl90PiAmb3V0LCBjb25zdCB2ZWN0b3I8aW50MzJfdD4gJnRoaW5nKSB7Ci0gICAgcHJpbnRmKCJbQyAtPiBDKytdIHRlc3RMaXN0KHsiKTsKKyAgICBjb3V0IDw8ICJbQyAtPiBDKytdIHRlc3RMaXN0KHsiOwogICAgIHZlY3RvcjxpbnQzMl90Pjo6Y29uc3RfaXRlcmF0b3IgbF9pdGVyOwogICAgIGJvb2wgZmlyc3QgPSB0cnVlOwogICAgIGZvciAobF9pdGVyID0gdGhpbmcuYmVnaW4oKTsgbF9pdGVyICE9IHRoaW5nLmVuZCgpOyArK2xfaXRlcikgewogICAgICAgaWYgKGZpcnN0KSB7CiAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgeyAgICAgICAgcHJpbnRmKCIsICIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY291dCA8PCAiLCAiOwogICAgICAgfQotICAgICAgcHJpbnRmKCIlZCIsICpsX2l0ZXIpOworICAgICAgY291dCA8PCAqbF9pdGVyOwogICAgIH0KLSAgICBwcmludGYoIn0pXG4iKTsKKyAgICBjb3V0IDw8ICJ9KSIgPDwgZW5kbDsKICAgICBvdXQgPSB0aGluZzsKICAgfQogCiAgIE51bWJlcno6OnR5cGUgdGVzdEVudW0oY29uc3QgTnVtYmVyejo6dHlwZSB0aGluZykgewotICAgIHByaW50ZigiW0MgLT4gQysrXSB0ZXN0RW51bSglZClcbiIsIHRoaW5nKTsKKyAgICBjb3V0IDw8ICJbQyAtPiBDKytdIHRlc3RFbnVtKCIgPDwgdGhpbmcgPDwgIikiIDw8IGVuZGw7CiAgICAgcmV0dXJuIHRoaW5nOwogICB9CiAKICAgVXNlcklkIHRlc3RUeXBlZGVmKGNvbnN0IFVzZXJJZCB0aGluZykgewotICAgIHByaW50ZigiW0MgLT4gQysrXSB0ZXN0VHlwZWRlZiglbGQpXG4iLCB0aGluZyk7CisgICAgY291dCA8PCAiW0MgLT4gQysrXSB0ZXN0VHlwZWRlZigiIDw8IHRoaW5nIDw8ICIpIiA8PCBlbmRsOwogICAgIHJldHVybiB0aGluZzsgIH0KIAogICB2b2lkIHRlc3RNYXBNYXAobWFwPGludDMyX3QsIG1hcDxpbnQzMl90LGludDMyX3Q+ID4gJm1hcG1hcCwgY29uc3QgaW50MzJfdCBoZWxsbykgewotICAgIHByaW50ZigiW0MgLT4gQysrXSB0ZXN0TWFwTWFwKCVkKVxuIiwgaGVsbG8pOworICAgIGNvdXQgPDwgIltDIC0+IEMrK10gdGVzdE1hcE1hcCgiIDw8IGhlbGxvIDw8ICIpIiA8PCBlbmRsOwogCiAgICAgbWFwPGludDMyX3QsaW50MzJfdD4gcG9zOwogICAgIG1hcDxpbnQzMl90LGludDMyX3Q+IG5lZzsKQEAgLTE5Nyw3ICsyMTAsNyBAQAogICB2b2lkIHRlc3RJbnNhbml0eShtYXA8VXNlcklkLCBtYXA8TnVtYmVyejo6dHlwZSxJbnNhbml0eT4gPiAmaW5zYW5lLCBjb25zdCBJbnNhbml0eSAmYXJndW1lbnQpIHsKICAgICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFIChhcmd1bWVudCk7CiAKLSAgICBwcmludGYoIltDIC0+IEMrK10gdGVzdEluc2FuaXR5KClcbiIpOworICAgIGNvdXQgPDwgIltDIC0+IEMrK10gdGVzdEluc2FuaXR5KCkiIDw8IGVuZGw7CiAKICAgICBYdHJ1Y3QgaGVsbG87CiAgICAgaGVsbG8uc3RyaW5nX3RoaW5nID0gIkhlbGxvMiI7CkBAIC0yMzAsMzcgKzI0MywzNiBAQAogICAgIGluc2FuZS5pbnNlcnQobWFrZV9wYWlyKDEsIGZpcnN0X21hcCkpOwogICAgIGluc2FuZS5pbnNlcnQobWFrZV9wYWlyKDIsIHNlY29uZF9tYXApKTsKIAotICAgIHByaW50ZigicmV0dXJuIik7Ci0gICAgcHJpbnRmKCIgPSB7Iik7CisgICAgY291dCA8PCAicmV0dXJuID0geyI7CiAgICAgbWFwPFVzZXJJZCwgbWFwPE51bWJlcno6OnR5cGUsSW5zYW5pdHk+ID46OmNvbnN0X2l0ZXJhdG9yIGlfaXRlcjsKICAgICBmb3IgKGlfaXRlciA9IGluc2FuZS5iZWdpbigpOyBpX2l0ZXIgIT0gaW5zYW5lLmVuZCgpOyArK2lfaXRlcikgewotICAgICAgcHJpbnRmKCIlbGQgPT4geyIsIGlfaXRlci0+Zmlyc3QpOworICAgICAgY291dCA8PCBpX2l0ZXItPmZpcnN0IDw8ICIgPT4geyI7CiAgICAgICBtYXA8TnVtYmVyejo6dHlwZSxJbnNhbml0eT46OmNvbnN0X2l0ZXJhdG9yIGkyX2l0ZXI7CiAgICAgICBmb3IgKGkyX2l0ZXIgPSBpX2l0ZXItPnNlY29uZC5iZWdpbigpOwogICAgICAgICAgICBpMl9pdGVyICE9IGlfaXRlci0+c2Vjb25kLmVuZCgpOwogICAgICAgICAgICArK2kyX2l0ZXIpIHsKLSAgICAgICAgcHJpbnRmKCIlZCA9PiB7IiwgaTJfaXRlci0+Zmlyc3QpOworICAgICAgICBjb3V0IDw8IGkyX2l0ZXItPmZpcnN0IDw8ICIgPT4geyI7CiAgICAgICAgIG1hcDxOdW1iZXJ6Ojp0eXBlLCBVc2VySWQ+IHVzZXJNYXAgPSBpMl9pdGVyLT5zZWNvbmQudXNlck1hcDsKICAgICAgICAgbWFwPE51bWJlcno6OnR5cGUsIFVzZXJJZD46OmNvbnN0X2l0ZXJhdG9yIHVtOwotICAgICAgICBwcmludGYoInsiKTsKKyAgICAgICAgY291dCA8PCAieyI7CiAgICAgICAgIGZvciAodW0gPSB1c2VyTWFwLmJlZ2luKCk7IHVtICE9IHVzZXJNYXAuZW5kKCk7ICsrdW0pIHsKLSAgICAgICAgICBwcmludGYoIiVkID0+ICVsZCwgIiwgdW0tPmZpcnN0LCB1bS0+c2Vjb25kKTsKKyAgICAgICAgICBjb3V0IDw8IHVtLT5maXJzdCA8PCAiID0+ICIgPDwgdW0tPnNlY29uZCA8PCAiLCAiOwogICAgICAgICB9Ci0gICAgICAgIHByaW50ZigifSwgIik7CisgICAgICAgIGNvdXQgPDwgIn0sICI7CiAKICAgICAgICAgdmVjdG9yPFh0cnVjdD4geHRydWN0cyA9IGkyX2l0ZXItPnNlY29uZC54dHJ1Y3RzOwogICAgICAgICB2ZWN0b3I8WHRydWN0Pjo6Y29uc3RfaXRlcmF0b3IgeDsKLSAgICAgICAgcHJpbnRmKCJ7Iik7CisgICAgICAgIGNvdXQgPDwgInsiOwogICAgICAgICBmb3IgKHggPSB4dHJ1Y3RzLmJlZ2luKCk7IHggIT0geHRydWN0cy5lbmQoKTsgKyt4KSB7Ci0gICAgICAgICAgcHJpbnRmKCJ7XCIlc1wiLCAlZCwgJWQsICVsZH0sICIsIHgtPnN0cmluZ190aGluZy5jX3N0cigpLCAoaW50KXgtPmJ5dGVfdGhpbmcsIHgtPmkzMl90aGluZywgeC0+aTY0X3RoaW5nKTsKKyAgICAgICAgICBjb3V0IDw8ICJ7XCIiIDw8IHgtPnN0cmluZ190aGluZyA8PCAiXCIsICIgPDwgKGludCl4LT5ieXRlX3RoaW5nIDw8ICIsICIgPDwgeC0+aTMyX3RoaW5nIDw8ICIsICIgPDwgeC0+aTY0X3RoaW5nIDw8ICJ9LCAiOwogICAgICAgICB9Ci0gICAgICAgIHByaW50ZigifSIpOworICAgICAgICBjb3V0IDw8ICJ9IjsKIAotICAgICAgICBwcmludGYoIn0sICIpOworICAgICAgICBjb3V0IDw8ICJ9LCAiOwogICAgICAgfQotICAgICAgcHJpbnRmKCJ9LCAiKTsKKyAgICAgIGNvdXQgPDwgIn0sICI7CiAgICAgfQotICAgIHByaW50ZigifVxuIik7CisgICAgY291dCA8PCAifSIgPDwgZW5kbDsKIAogCiAgIH0KQEAgLTI3MCw3ICsyODIsNyBAQAogICAgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUgKGFyZzQpOwogICAgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUgKGFyZzUpOwogCi0gICAgcHJpbnRmKCJbQyAtPiBDKytdIHRlc3RNdWx0aSgpXG4iKTsKKyAgICBjb3V0IDw8ICJbQyAtPiBDKytdIHRlc3RNdWx0aSgpIiA8PCBlbmRsOwogCiAgICAgaGVsbG8uc3RyaW5nX3RoaW5nID0gIkhlbGxvMiI7CiAgICAgaGVsbG8uYnl0ZV90aGluZyA9IGFyZzA7CkBAIC0yODEsNyArMjkzLDcgQEAKICAgdm9pZCB0ZXN0RXhjZXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nICZhcmcpCiAgICAgdGhyb3coWGNlcHRpb24sIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKQogICB7Ci0gICAgcHJpbnRmKCJbQyAtPiBDKytdIHRlc3RFeGNlcHRpb24oJXMpXG4iLCBhcmcuY19zdHIoKSk7CisgICAgY291dCA8PCAiW0MgLT4gQysrXSB0ZXN0RXhjZXB0aW9uKCIgPDwgYXJnIDw8ICIpIiA8PCBlbmRsOwogICAgIGlmIChhcmcuY29tcGFyZSgiWGNlcHRpb24iKSA9PSAwKSB7CiAgICAgICBYY2VwdGlvbiBlOwogICAgICAgZS5lcnJvckNvZGUgPSAxMDAxOwpAQCAtMjk5LDcgKzMxMSw3IEBACiAKICAgdm9pZCB0ZXN0TXVsdGlFeGNlcHRpb24oWHRydWN0ICZyZXN1bHQsIGNvbnN0IHN0ZDo6c3RyaW5nICZhcmcwLCBjb25zdCBzdGQ6OnN0cmluZyAmYXJnMSkgdGhyb3coWGNlcHRpb24sIFhjZXB0aW9uMikgewogCi0gICAgcHJpbnRmKCJbQyAtPiBDKytdIHRlc3RNdWx0aUV4Y2VwdGlvbiglcywgJXMpXG4iLCBhcmcwLmNfc3RyKCksIGFyZzEuY19zdHIoKSk7CisgICAgY291dCA8PCAiW0MgLT4gQysrXSB0ZXN0TXVsdGlFeGNlcHRpb24oIiA8PCBhcmcwIDw8ICIsICIgPDwgYXJnMSA8PCAiKSIgPDwgZW5kbDsKIAogICAgIGlmIChhcmcwLmNvbXBhcmUoIlhjZXB0aW9uIikgPT0gMCkgewogICAgICAgWGNlcHRpb24gZTsKQEAgLTMxOCw5ICszMzAsOSBAQAogICB9CiAKICAgdm9pZCB0ZXN0T25ld2F5KGludCBzbGVlcEZvcikgewotICAgIHByaW50ZigidGVzdE9uZXdheSglZCk6IFNsZWVwaW5nLi4uXG4iLCBzbGVlcEZvcik7CisgICAgY291dCA8PCAidGVzdE9uZXdheSgiIDw8IHNsZWVwRm9yIDw8ICIpOiBTbGVlcGluZy4uLiIgPDwgZW5kbDsKICAgICBzbGVlcChzbGVlcEZvcik7Ci0gICAgcHJpbnRmKCJ0ZXN0T25ld2F5KCVkKTogZG9uZSBzbGVlcGluZyFcbiIsIHNsZWVwRm9yKTsKKyAgICBjb3V0IDw8ICJ0ZXN0T25ld2F5KCIgPDwgc2xlZXBGb3IgPDwgIik6IGRvbmUgc2xlZXBpbmchIiA8PCBlbmRsOwogICB9CiB9OwogCkBAIC0zNDYsNyArMzU4LDcgQEAKICAgZ2NoYXIgKnN0cmluZyA9IE5VTEw7CiAgIGdpbnQ4IGJ5dGUgPSAwOwogICBnaW50MTYgaTE2ID0gMDsKLSAgZ2ludDMyIGkzMiA9IDAsIGFub3RoZXJfaTMyID0gNTY3ODk7IAorICBnaW50MzIgaTMyID0gMCwgYW5vdGhlcl9pMzIgPSA1Njc4OTsKICAgZ2ludDY0IGk2NCA9IDA7CiAgIGRvdWJsZSBkYmwgPSAwLjA7CiAgIFRUZXN0WHRydWN0ICp4dHJ1Y3RfaW4sICp4dHJ1Y3Rfb3V0OwpAQCAtMzU1LDcgKzM2Nyw3IEBACiAgIEdIYXNoVGFibGUgKnNldF9pbiA9IE5VTEwsICpzZXRfb3V0ID0gTlVMTDsKICAgR0FycmF5ICpsaXN0X2luID0gTlVMTCwgKmxpc3Rfb3V0ID0gTlVMTDsKICAgVFRlc3ROdW1iZXJ6IGVudW1faW4sIGVudW1fb3V0OwotICBUVGVzdFVzZXJJZCB1c2VyX2lkX2luLCB1c2VyX2lkX291dDsgCisgIFRUZXN0VXNlcklkIHVzZXJfaWRfaW4sIHVzZXJfaWRfb3V0OwogICBHSGFzaFRhYmxlICppbnNhbml0eV9pbiA9IE5VTEw7CiAgIFRUZXN0WHRydWN0ICp4dHJ1Y3QxLCAqeHRydWN0MjsKICAgVFRlc3RJbnNhbml0eSAqaW5zYW5pdHlfb3V0ID0gTlVMTDsKQEAgLTM3MCw3ICszODIsNyBAQAogI2VuZGlmCiAKICAgLy8gY3JlYXRlIGEgQyBjbGllbnQKLSAgdHNvY2tldCA9IChUaHJpZnRTb2NrZXQgKikgZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsIAorICB0c29ja2V0ID0gKFRocmlmdFNvY2tldCAqKSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgVEVTVF9QT1JULCBOVUxMKTsKICAgcHJvdG9jb2wgPSAoVGhyaWZ0QmluYXJ5UHJvdG9jb2wgKikgZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wsCkBAIC02MDYsMTEgKzYxOCwxMSBAQAogCiAgIGlmIChwaWQgPT0gMCkgLyogY2hpbGQgKi8KICAgewotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeShuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKTsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUZXN0SGFuZGxlcj4gdGVzdEhhbmRsZXIobmV3IFRlc3RIYW5kbGVyKCkpOwotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRocmlmdFRlc3RQcm9jZXNzb3I+IHRlc3RQcm9jZXNzb3IobmV3IFRocmlmdFRlc3RQcm9jZXNzb3IodGVzdEhhbmRsZXIpKTsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyU29ja2V0PiBzZXJ2ZXJTb2NrZXQobmV3IFRTZXJ2ZXJTb2NrZXQoVEVTVF9QT1JUKSk7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3RvcnkobmV3IFRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeShuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VGVzdEhhbmRsZXI+IHRlc3RIYW5kbGVyKG5ldyBUZXN0SGFuZGxlcigpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VGhyaWZ0VGVzdFByb2Nlc3Nvcj4gdGVzdFByb2Nlc3NvcihuZXcgVGhyaWZ0VGVzdFByb2Nlc3Nvcih0ZXN0SGFuZGxlcikpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyU29ja2V0PiBzZXJ2ZXJTb2NrZXQobmV3IFRTZXJ2ZXJTb2NrZXQoVEVTVF9QT1JUKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkpOwogICAgIFRTaW1wbGVTZXJ2ZXIgc2ltcGxlU2VydmVyKHRlc3RQcm9jZXNzb3IsIHNlcnZlclNvY2tldCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KTsKICAgICBzaWduYWwgKFNJR0FMUk0sIGJhaWxvdXQpOwogICAgIGFsYXJtICg2MCk7CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3Rlc3QvdGVzdHRyYW5zcG9ydHNvY2tldC5jIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3R0cmFuc3BvcnRzb2NrZXQuYwppbmRleCBkOTE1MDdmLi44OWM2MWI5IDEwMDc1NQotLS0gYS9saWIvY19nbGliL3Rlc3QvdGVzdHRyYW5zcG9ydHNvY2tldC5jCisrKyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0dHJhbnNwb3J0c29ja2V0LmMKQEAgLTE3LDcgKzE3LDYgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxuZXRkYi5oPgogI2luY2x1ZGUgPHN5cy93YWl0Lmg+CiAKQEAgLTM0LDkgKzMzLDkgQEAKIG15X3NvY2tldChpbnQgZG9tYWluLCBpbnQgdHlwZSwgaW50IHByb3RvY29sKQogewogICBpZiAoc29ja2V0X2Vycm9yID09IDApCi0gIHsKLSAgICByZXR1cm4gc29ja2V0IChkb21haW4sIHR5cGUsIHByb3RvY29sKTsKLSAgfQorICAgIHsKKyAgICAgIHJldHVybiBzb2NrZXQgKGRvbWFpbiwgdHlwZSwgcHJvdG9jb2wpOworICAgIH0KICAgcmV0dXJuIC0xOwogfQogCkBAIC00NSw5ICs0NCw5IEBACiBteV9yZWN2KGludCBzb2NrZXQsIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCwgaW50IGZsYWdzKQogewogICBpZiAocmVjdl9lcnJvciA9PSAwKQotICB7Ci0gICAgcmV0dXJuIHJlY3YgKHNvY2tldCwgYnVmZmVyLCBsZW5ndGgsIGZsYWdzKTsKLSAgfQorICAgIHsKKyAgICAgIHJldHVybiByZWN2IChzb2NrZXQsIGJ1ZmZlciwgbGVuZ3RoLCBmbGFncyk7CisgICAgfQogICByZXR1cm4gLTE7CiB9CiAKQEAgLTU2LDkgKzU1LDkgQEAKIG15X3NlbmQoaW50IHNvY2tldCwgY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoLCBpbnQgZmxhZ3MpCiB7CiAgIGlmIChzZW5kX2Vycm9yID09IDApCi0gIHsKLSAgICByZXR1cm4gc2VuZCAoc29ja2V0LCBidWZmZXIsIGxlbmd0aCwgZmxhZ3MpOwotICB9CisgICAgeworICAgICAgcmV0dXJuIHNlbmQgKHNvY2tldCwgYnVmZmVyLCBsZW5ndGgsIGZsYWdzKTsKKyAgICB9CiAgIHJldHVybiAtMTsKIH0KIApAQCAtNzEsNyArNzAsNyBAQAogI3VuZGVmIHNlbmQKIAogc3RhdGljIHZvaWQgdGhyaWZ0X3NvY2tldF9zZXJ2ZXIgKGNvbnN0IGludCBwb3J0KTsKLQorc3RhdGljIHZvaWQgdGhyaWZ0X3NvY2tldF9zZXJ2ZXJfb3BlbiAoY29uc3QgaW50IHBvcnQsIGludCB0aW1lcyk7CiAvKiB0ZXN0IG9iamVjdCBjcmVhdGlvbiBhbmQgZGVzdHJ1Y3Rpb24gKi8KIHN0YXRpYyB2b2lkCiB0ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveSh2b2lkKQpAQCAtODEsNyArODAsNyBAQAogCiAgIEdPYmplY3QgKm9iamVjdCA9IE5VTEw7CiAgIG9iamVjdCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCBOVUxMKTsKLSAgYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CisgIGdfYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CiAgIGdfb2JqZWN0X2dldCAoR19PQkpFQ1Qob2JqZWN0KSwgImhvc3RuYW1lIiwgJmhvc3RuYW1lLCAicG9ydCIsICZwb3J0LCBOVUxMKTsKICAgZ19mcmVlIChob3N0bmFtZSk7CiAKQEAgLTk0LDgyICs5MywxMDAgQEAKICAgVGhyaWZ0U29ja2V0ICp0c29ja2V0ID0gTlVMTDsKICAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOwogICBHRXJyb3IgKmVyciA9IE5VTEw7CisgIGludCBwb3J0ID0gNTExOTk7CisgIHBpZF90IHBpZDsKKyAgaW50IHN0YXR1czsKIAotICAvKiBvcGVuIGEgY29ubmVjdGlvbiBhbmQgY2xvc2UgaXQgKi8KLSAgdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCA1MTE4OCwgTlVMTCk7IAotICB0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KTsKLSAgdGhyaWZ0X3NvY2tldF9vcGVuICh0cmFuc3BvcnQsIE5VTEwpOwotICBhc3NlcnQgKHRocmlmdF9zb2NrZXRfaXNfb3BlbiAodHJhbnNwb3J0KSA9PSBUUlVFKTsKLSAgdGhyaWZ0X3NvY2tldF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKLSAgYXNzZXJ0ICh0aHJpZnRfc29ja2V0X2lzX29wZW4gKHRyYW5zcG9ydCkgPT0gRkFMU0UpOworICBwaWQgPSBmb3JrICgpOworICBnX2Fzc2VydCAoIHBpZCA+PSAwICk7CiAKLSAgLyogdGVzdCBjbG9zZSBmYWlsdXJlICovCi0gIHRzb2NrZXQtPnNkID0gLTE7Ci0gIHRocmlmdF9zb2NrZXRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7Ci0gIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKKyAgaWYgKCBwaWQgPT0gMCApCisgICAgeworICAgICAgLyogY2hpbGQgbGlzdGVucyAqLworICAgICAgdGhyaWZ0X3NvY2tldF9zZXJ2ZXJfb3BlbiAocG9ydCwgMSk7CisgICAgICBleGl0ICgwKTsKKyAgICB9IGVsc2UgeworCS8qIHBhcmVudCBjb25uZWN0cywgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkICovCisJc2xlZXAgKDEpOwogCi0gIC8qIHRyeSBhIGhvc3RuYW1lIGxvb2t1cCBmYWlsdXJlICovCi0gIHRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdC5icm9rZW4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCk7Ci0gIGFzc2VydCAodGhyaWZ0X3NvY2tldF9vcGVuICh0cmFuc3BvcnQsICZlcnIpID09IEZBTFNFKTsKLSAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOwotICBnX2Vycm9yX2ZyZWUgKGVycik7Ci0gIGVyciA9IE5VTEw7CisJLyogb3BlbiBhIGNvbm5lY3Rpb24gYW5kIGNsb3NlIGl0ICovCisJdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKKwkJCQkicG9ydCIsIHBvcnQsIE5VTEwpOworCXRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpOworCXRocmlmdF9zb2NrZXRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKTsKKwlnX2Fzc2VydCAodGhyaWZ0X3NvY2tldF9pc19vcGVuICh0cmFuc3BvcnQpID09IFRSVUUpOworCXRocmlmdF9zb2NrZXRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CisJZ19hc3NlcnQgKHRocmlmdF9zb2NrZXRfaXNfb3BlbiAodHJhbnNwb3J0KSA9PSBGQUxTRSk7CiAKLSAgLyogdHJ5IGFuIGVycm9yIGNhbGwgdG8gc29ja2V0KCkgKi8KLSAgdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwgTlVMTCk7Ci0gIHRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpOwotICBzb2NrZXRfZXJyb3IgPSAxOwotICBhc3NlcnQgKHRocmlmdF9zb2NrZXRfb3BlbiAodHJhbnNwb3J0LCAmZXJyKSA9PSBGQUxTRSk7Ci0gIHNvY2tldF9lcnJvciA9IDA7Ci0gIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKLSAgZ19lcnJvcl9mcmVlIChlcnIpOworCS8qIHRlc3QgY2xvc2UgZmFpbHVyZSAqLworCXRzb2NrZXQtPnNkID0gLTE7CisJdGhyaWZ0X3NvY2tldF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKKwlnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisKKwkvKiB0cnkgYSBob3N0bmFtZSBsb29rdXAgZmFpbHVyZSAqLworCXRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdC5icm9rZW4iLAorCQkJCU5VTEwpOworCXRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpOworCWdfYXNzZXJ0ICh0aHJpZnRfc29ja2V0X29wZW4gKHRyYW5zcG9ydCwgJmVycikgPT0gRkFMU0UpOworCWdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKKwlnX2Vycm9yX2ZyZWUgKGVycik7CisJZXJyID0gTlVMTDsKKworCS8qIHRyeSBhbiBlcnJvciBjYWxsIHRvIHNvY2tldCgpICovCisJdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwgTlVMTCk7CisJdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCk7CisJc29ja2V0X2Vycm9yID0gMTsKKwlnX2Fzc2VydCAodGhyaWZ0X3NvY2tldF9vcGVuICh0cmFuc3BvcnQsICZlcnIpID09IEZBTFNFKTsKKwlzb2NrZXRfZXJyb3IgPSAwOworCWdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKKwlnX2Vycm9yX2ZyZWUgKGVycik7CisJZ19hc3NlcnQgKCB3YWl0ICgmc3RhdHVzKSA9PSBwaWQgKTsKKwlnX2Fzc2VydCAoIHN0YXR1cyA9PSAwICk7CisgICAgfQogfQogCiBzdGF0aWMgdm9pZAogdGVzdF9yZWFkX2FuZF93cml0ZSh2b2lkKQogewotICBpbnQgc3RhdHVzOwotICBwaWRfdCBwaWQ7CiAgIFRocmlmdFNvY2tldCAqdHNvY2tldCA9IE5VTEw7CiAgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgcGlkX3QgcGlkOwogICBpbnQgcG9ydCA9IDUxMTk5OworICBpbnQgc3RhdHVzOwogICBndWNoYXIgYnVmWzEwXSA9IFRFU1RfREFUQTsgLyogYSBidWZmZXIgKi8KIAogICBwaWQgPSBmb3JrICgpOwotICBhc3NlcnQgKCBwaWQgPj0gMCApOworICBnX2Fzc2VydCAoIHBpZCA+PSAwICk7CiAKICAgaWYgKCBwaWQgPT0gMCApCi0gIHsKLSAgICAvKiBjaGlsZCBsaXN0ZW5zICovCi0gICAgdGhyaWZ0X3NvY2tldF9zZXJ2ZXIgKHBvcnQpOwotICAgIGV4aXQgKDApOwotICB9IGVsc2UgewotICAgIC8qIHBhcmVudCBjb25uZWN0cywgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkICovCi0gICAgc2xlZXAgKDEpOworICAgIHsKKyAgICAgIC8qIGNoaWxkIGxpc3RlbnMgKi8KKyAgICAgIHRocmlmdF9zb2NrZXRfc2VydmVyIChwb3J0KTsKKyAgICAgIGV4aXQgKDApOworICAgIH0gZWxzZSB7CisJLyogcGFyZW50IGNvbm5lY3RzLCB3YWl0IGEgYml0IGZvciB0aGUgc29ja2V0IHRvIGJlIGNyZWF0ZWQgKi8KKwlzbGVlcCAoMSk7CiAKLSAgICB0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgcG9ydCwgTlVMTCk7Ci0gICAgdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfc29ja2V0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCkgPT0gVFJVRSk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfc29ja2V0X2lzX29wZW4gKHRyYW5zcG9ydCkpOwotICAgIHRocmlmdF9zb2NrZXRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxMCwgTlVMTCk7CisJdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKKwkJCQkicG9ydCIsIHBvcnQsIE5VTEwpOworCXRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpOworCWdfYXNzZXJ0ICh0aHJpZnRfc29ja2V0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCkgPT0gVFJVRSk7CisJZ19hc3NlcnQgKHRocmlmdF9zb2NrZXRfaXNfb3BlbiAodHJhbnNwb3J0KSk7CisJdGhyaWZ0X3NvY2tldF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEwLCBOVUxMKTsKIAotICAgIC8qIHdyaXRlIGZhaWwgKi8KLSAgICBzZW5kX2Vycm9yID0gMTsKLSAgICB0aHJpZnRfc29ja2V0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMSwgTlVMTCk7Ci0gICAgc2VuZF9lcnJvciA9IDA7CisJLyogd3JpdGUgZmFpbCAqLworCXNlbmRfZXJyb3IgPSAxOworCXRocmlmdF9zb2NrZXRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxLCBOVUxMKTsKKwlzZW5kX2Vycm9yID0gMDsKIAotICAgIHRocmlmdF9zb2NrZXRfd3JpdGVfZW5kICh0cmFuc3BvcnQsIE5VTEwpOwotICAgIHRocmlmdF9zb2NrZXRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7Ci0gICAgdGhyaWZ0X3NvY2tldF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKLSAgICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisJdGhyaWZ0X3NvY2tldF93cml0ZV9lbmQgKHRyYW5zcG9ydCwgTlVMTCk7CisJdGhyaWZ0X3NvY2tldF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKwl0aHJpZnRfc29ja2V0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOworCWdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKIAotICAgIGFzc2VydCAoIHdhaXQgKCZzdGF0dXMpID09IHBpZCApOwotICAgIGFzc2VydCAoIHN0YXR1cyA9PSAwICk7Ci0gIH0KKwlnX2Fzc2VydCAoIHdhaXQgKCZzdGF0dXMpID09IHBpZCApOworCWdfYXNzZXJ0ICggc3RhdHVzID09IDAgKTsKKyAgICB9CiB9CiAKIC8qIHRlc3QgVGhyaWZ0U29ja2V0J3MgcGVlaygpIGltcGxlbWVudGF0aW9uICovCkBAIC0xODQsOSArMjAxLDkgQEAKICAgR0Vycm9yICplcnJvciA9IE5VTEw7CiAKICAgY2xpZW50X3RyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCAgICAgcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisJCQkJICAgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCisJCQkJICAgInBvcnQiLCAgICAgcG9ydCwKKwkJCQkgICBOVUxMKTsKIAogICAvKiB0aHJpZnRfdHJhbnNwb3J0X3BlZWsgcmV0dXJucyBGQUxTRSB3aGVuIHRoZSBzb2NrZXQgaXMgY2xvc2VkICovCiAgIGdfYXNzZXJ0ICh0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW4gKGNsaWVudF90cmFuc3BvcnQpID09IEZBTFNFKTsKQEAgLTE5Nyw4MSArMjE0LDEwMiBAQAogICBnX2Fzc2VydCAocGlkID49IDApOwogCiAgIGlmIChwaWQgPT0gMCkKLSAgewotICAgIFRocmlmdFNlcnZlclRyYW5zcG9ydCAqc2VydmVyX3RyYW5zcG9ydCA9IE5VTEw7CisgICAgeworICAgICAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICpzZXJ2ZXJfdHJhbnNwb3J0ID0gTlVMTDsKIAotICAgIGdfb2JqZWN0X3VucmVmIChjbGllbnRfdHJhbnNwb3J0KTsKKyAgICAgIGdfb2JqZWN0X3VucmVmIChjbGllbnRfdHJhbnNwb3J0KTsKIAotICAgIC8qIGNoaWxkIGxpc3RlbnMgKi8KLSAgICBzZXJ2ZXJfdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgICBnX2Fzc2VydCAoc2VydmVyX3RyYW5zcG9ydCAhPSBOVUxMKTsKKyAgICAgIC8qIGNoaWxkIGxpc3RlbnMgKi8KKyAgICAgIHNlcnZlcl90cmFuc3BvcnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsCisJCQkJICAgICAgICJwb3J0IiwgcG9ydCwKKwkJCQkgICAgICAgTlVMTCk7CisgICAgICBnX2Fzc2VydCAoc2VydmVyX3RyYW5zcG9ydCAhPSBOVUxMKTsKIAotICAgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2xpc3RlbiAoc2VydmVyX3RyYW5zcG9ydCwgJmVycm9yKTsKLSAgICBnX2Fzc2VydCAoZXJyb3IgPT0gTlVMTCk7CisgICAgICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKHNlcnZlcl90cmFuc3BvcnQsICZlcnJvcik7CisgICAgICBnX2Fzc2VydCAoZXJyb3IgPT0gTlVMTCk7CiAKLSAgICBjbGllbnRfdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3Ci0gICAgICAoVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JULAotICAgICAgICJ0cmFuc3BvcnQiLCAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0IChzZXJ2ZXJfdHJhbnNwb3J0LCAmZXJyb3IpLAotICAgICAgICJyX2J1Zl9zaXplIiwgMCwKLSAgICAgICAid19idWZfc2l6ZSIsIHNpemVvZiBkYXRhLAotICAgICAgIE5VTEwpOwotICAgIGdfYXNzZXJ0IChlcnJvciA9PSBOVUxMKTsKLSAgICBnX2Fzc2VydCAoY2xpZW50X3RyYW5zcG9ydCAhPSBOVUxMKTsKKyAgICAgIGNsaWVudF90cmFuc3BvcnQgPSBnX29iamVjdF9uZXcKKwkgIChUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQsCisJICAgInRyYW5zcG9ydCIsICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKHNlcnZlcl90cmFuc3BvcnQsICZlcnJvciksCisJICAgInJfYnVmX3NpemUiLCAwLAorCSAgICJ3X2J1Zl9zaXplIiwgc2l6ZW9mIGRhdGEsCisJICAgTlVMTCk7CisgICAgICBnX2Fzc2VydCAoZXJyb3IgPT0gTlVMTCk7CisgICAgICBnX2Fzc2VydCAoY2xpZW50X3RyYW5zcG9ydCAhPSBOVUxMKTsKIAotICAgIC8qIHdyaXRlIGV4YWN0bHkgb25lIGNoYXJhY3RlciB0byB0aGUgY2xpZW50ICovCi0gICAgZ19hc3NlcnQgKHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKGNsaWVudF90cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSA9PSBUUlVFKTsKKyAgICAgIC8qIHdyaXRlIGV4YWN0bHkgb25lIGNoYXJhY3RlciB0byB0aGUgY2xpZW50ICovCisgICAgICBnX2Fzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAoY2xpZW50X3RyYW5zcG9ydCwKKwkJCQkJJmRhdGEsCisJCQkJCXNpemVvZiBkYXRhLAorCQkJCQkmZXJyb3IpID09IFRSVUUpOwogCi0gICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAoY2xpZW50X3RyYW5zcG9ydCwgJmVycm9yKTsKLSAgICB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlX2VuZCAoY2xpZW50X3RyYW5zcG9ydCwgJmVycm9yKTsKLSAgICB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlIChjbGllbnRfdHJhbnNwb3J0LCAmZXJyb3IpOworICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAoY2xpZW50X3RyYW5zcG9ydCwgJmVycm9yKTsKKyAgICAgIHRocmlmdF90cmFuc3BvcnRfd3JpdGVfZW5kIChjbGllbnRfdHJhbnNwb3J0LCAmZXJyb3IpOworICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAoY2xpZW50X3RyYW5zcG9ydCwgJmVycm9yKTsKIAotICAgIGdfb2JqZWN0X3VucmVmIChjbGllbnRfdHJhbnNwb3J0KTsKLSAgICBnX29iamVjdF91bnJlZiAoc2VydmVyX3RyYW5zcG9ydCk7CisgICAgICBnX29iamVjdF91bnJlZiAoY2xpZW50X3RyYW5zcG9ydCk7CisgICAgICBnX29iamVjdF91bnJlZiAoc2VydmVyX3RyYW5zcG9ydCk7CiAKLSAgICBleGl0ICgwKTsKLSAgfQorICAgICAgZXhpdCAoMCk7CisgICAgfQogICBlbHNlIHsKLSAgICAvKiBwYXJlbnQgY29ubmVjdHMsIHdhaXQgYSBiaXQgZm9yIHRoZSBzb2NrZXQgdG8gYmUgY3JlYXRlZCAqLwotICAgIHNsZWVwICgxKTsKKyAgICAgIC8qIHBhcmVudCBjb25uZWN0cywgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkICovCisgICAgICBzbGVlcCAoMSk7CiAKLSAgICAvKiBjb25uZWN0IHRvIHRoZSBjaGlsZCAqLwotICAgIHRocmlmdF90cmFuc3BvcnRfb3BlbiAoY2xpZW50X3RyYW5zcG9ydCwgJmVycm9yKTsKLSAgICBnX2Fzc2VydCAoZXJyb3IgPT0gTlVMTCk7Ci0gICAgZ19hc3NlcnQgKHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAoY2xpZW50X3RyYW5zcG9ydCkgPT0gVFJVRSk7CisgICAgICAvKiBjb25uZWN0IHRvIHRoZSBjaGlsZCAqLworICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9vcGVuIChjbGllbnRfdHJhbnNwb3J0LCAmZXJyb3IpOworICAgICAgZ19hc3NlcnQgKGVycm9yID09IE5VTEwpOworICAgICAgZ19hc3NlcnQgKHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAoY2xpZW50X3RyYW5zcG9ydCkgPT0gVFJVRSk7CiAKLSAgICAvKiB0aHJpZnRfdHJhbnNwb3J0X3BlZWsgcmV0dXJucyBUUlVFIHdoZW4gdGhlIHNvY2tldCBpcyBvcGVuIGFuZCB0aGVyZSBpcworICAgICAgLyogdGhyaWZ0X3RyYW5zcG9ydF9wZWVrIHJldHVybnMgVFJVRSB3aGVuIHRoZSBzb2NrZXQgaXMgb3BlbiBhbmQgdGhlcmUgaXMKICAgICAgICBkYXRhIGF2YWlsYWJsZSB0byBiZSByZWFkICovCi0gICAgZ19hc3NlcnQgKHRocmlmdF90cmFuc3BvcnRfcGVlayAoY2xpZW50X3RyYW5zcG9ydCwgJmVycm9yKSA9PSBUUlVFKTsKLSAgICBnX2Fzc2VydCAoZXJyb3IgPT0gTlVMTCk7CisgICAgICBnX2Fzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9wZWVrIChjbGllbnRfdHJhbnNwb3J0LCAmZXJyb3IpID09IFRSVUUpOworICAgICAgZ19hc3NlcnQgKGVycm9yID09IE5VTEwpOwogCi0gICAgLyogcmVhZCBleGFjdGx5IG9uZSBjaGFyYWN0ZXIgZnJvbSB0aGUgc2VydmVyICovCi0gICAgZ19hc3NlcnRfY21waW50ICh0aHJpZnRfdHJhbnNwb3J0X3JlYWQgKGNsaWVudF90cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKSwgPT0sIHNpemVvZiBkYXRhKTsKKyAgICAgIC8qIHJlYWQgZXhhY3RseSBvbmUgY2hhcmFjdGVyIGZyb20gdGhlIHNlcnZlciAqLworICAgICAgZ19hc3NlcnRfY21waW50ICh0aHJpZnRfdHJhbnNwb3J0X3JlYWQgKGNsaWVudF90cmFuc3BvcnQsCisJCQkJCSAgICAgICZkYXRhLAorCQkJCQkgICAgICBzaXplb2YgZGF0YSwKKwkJCQkJICAgICAgJmVycm9yKSwgPT0sIHNpemVvZiBkYXRhKTsKIAotICAgIC8qIHRocmlmdF90cmFuc3BvcnRfcGVlayByZXR1cm5zIEZBTFNFIHdoZW4gdGhlIHNvY2tldCBpcyBvcGVuIGJ1dCB0aGVyZSBpcworICAgICAgLyogdGhyaWZ0X3RyYW5zcG9ydF9wZWVrIHJldHVybnMgRkFMU0Ugd2hlbiB0aGUgc29ja2V0IGlzIG9wZW4gYnV0IHRoZXJlIGlzCiAgICAgICAgbm8gKG1vcmUpIGRhdGEgYXZhaWxhYmxlIHRvIGJlIHJlYWQgKi8KLSAgICBnX2Fzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuIChjbGllbnRfdHJhbnNwb3J0KSA9PSBUUlVFKTsKLSAgICBnX2Fzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9wZWVrIChjbGllbnRfdHJhbnNwb3J0LCAmZXJyb3IpID09IEZBTFNFKTsKLSAgICBnX2Fzc2VydCAoZXJyb3IgPT0gTlVMTCk7CisgICAgICBnX2Fzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuIChjbGllbnRfdHJhbnNwb3J0KSA9PSBUUlVFKTsKKyAgICAgIGdfYXNzZXJ0ICh0aHJpZnRfdHJhbnNwb3J0X3BlZWsgKGNsaWVudF90cmFuc3BvcnQsICZlcnJvcikgPT0gRkFMU0UpOworICAgICAgZ19hc3NlcnQgKGVycm9yID09IE5VTEwpOwogCi0gICAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZCAoY2xpZW50X3RyYW5zcG9ydCwgJmVycm9yKTsKLSAgICB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlIChjbGllbnRfdHJhbnNwb3J0LCAmZXJyb3IpOworICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZCAoY2xpZW50X3RyYW5zcG9ydCwgJmVycm9yKTsKKyAgICAgIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKGNsaWVudF90cmFuc3BvcnQsICZlcnJvcik7CiAKLSAgICBnX29iamVjdF91bnJlZiAoY2xpZW50X3RyYW5zcG9ydCk7CisgICAgICBnX29iamVjdF91bnJlZiAoY2xpZW50X3RyYW5zcG9ydCk7CiAKLSAgICBnX2Fzc2VydCAod2FpdCAoJnN0YXR1cykgPT0gcGlkKTsKLSAgICBnX2Fzc2VydCAoc3RhdHVzID09IDApOworICAgICAgZ19hc3NlcnQgKHdhaXQgKCZzdGF0dXMpID09IHBpZCk7CisgICAgICBnX2Fzc2VydCAoc3RhdHVzID09IDApOwogICB9CiB9CiAKIHN0YXRpYyB2b2lkCit0aHJpZnRfc29ja2V0X3NlcnZlcl9vcGVuIChjb25zdCBpbnQgcG9ydCwgaW50IHRpbWVzKQoreworICBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCAqY2xpZW50ID0gTlVMTDsKKyAgaW50IGk7CisgIFRocmlmdFNlcnZlclNvY2tldCAqdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCwKKwkJCQkJICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKKworICB0cmFuc3BvcnQgPSBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVCAodHNvY2tldCk7CisgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2xpc3RlbiAodHJhbnNwb3J0LCBOVUxMKTsKKyAgZm9yKGk9MDtpPHRpbWVzO2krKyl7CisgICAgICBjbGllbnQgPSB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgICBnX2Fzc2VydCAoY2xpZW50ICE9IE5VTEwpOworICAgICAgdGhyaWZ0X3NvY2tldF9jbG9zZSAoY2xpZW50LCBOVUxMKTsKKyAgICAgIGdfb2JqZWN0X3VucmVmIChjbGllbnQpOworICB9CisgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKK30KKworCitzdGF0aWMgdm9pZAogdGhyaWZ0X3NvY2tldF9zZXJ2ZXIgKGNvbnN0IGludCBwb3J0KQogewogICBpbnQgYnl0ZXMgPSAwOwpAQCAtMjgxLDE3ICszMTksMTcgQEAKICAgZ3VjaGFyIG1hdGNoWzEwXSA9IFRFU1RfREFUQTsKIAogICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKKwkJCQkJICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKIAogICB0cmFuc3BvcnQgPSBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVCAodHNvY2tldCk7CiAgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2xpc3RlbiAodHJhbnNwb3J0LCBOVUxMKTsKICAgY2xpZW50ID0gdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0ICh0cmFuc3BvcnQsIE5VTEwpOwotICBhc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKIAogICAvKiByZWFkIDEwIGJ5dGVzICovCiAgIGJ5dGVzID0gdGhyaWZ0X3NvY2tldF9yZWFkIChjbGllbnQsIGJ1ZiwgMTAsIE5VTEwpOwotICBhc3NlcnQgKGJ5dGVzID09IDEwKTsgLyogbWFrZSBzdXJlIHdlJ3ZlIHJlYWQgMTAgYnl0ZXMgKi8KLSAgYXNzZXJ0ICggbWVtY21wKGJ1ZiwgbWF0Y2gsIDEwKSA9PSAwICk7IC8qIG1ha2Ugc3VyZSB3aGF0IHdlIGdvdCBtYXRjaGVzICovCisgIGdfYXNzZXJ0IChieXRlcyA9PSAxMCk7IC8qIG1ha2Ugc3VyZSB3ZSd2ZSByZWFkIDEwIGJ5dGVzICovCisgIGdfYXNzZXJ0ICggbWVtY21wKGJ1ZiwgbWF0Y2gsIDEwKSA9PSAwICk7IC8qIG1ha2Ugc3VyZSB3aGF0IHdlIGdvdCBtYXRjaGVzICovCiAKICAgLyogZmFpbGVkIHJlYWQgKi8KICAgcmVjdl9lcnJvciA9IDE7CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3Rlc3QvdGVzdHRyYW5zcG9ydHNzbHNvY2tldC5jIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3R0cmFuc3BvcnRzc2xzb2NrZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzI2NDRkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3R0cmFuc3BvcnRzc2xzb2NrZXQuYwpAQCAtMCwwICsxLDU0MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2RlZmluZSBfUE9TSVhfQ19TT1VSQ0UgMjAwMTEyTCAvKiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zNzU0MTk4NS9zdG9yYWdlLXNpemUtb2YtYWRkcmluZm8taXNudC1rbm93biAqLworCisKKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NzbF9zb2NrZXQuaD4KKworLyogI2RlZmluZSBURVNUX0RBVEEgeyAnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnLCAnZycsICdoJywgJ2knLCAnaicgfSAqLworI2RlZmluZSBURVNUX0RBVEEgeyAiR0VUIC8gSFRUUC8xLjFcblxuIiB9CisKKworLyogc3Vic3RpdHV0ZWQgZnVuY3Rpb25zIHRvIHRlc3QgZmFpbHVyZXMgb2Ygc3lzdGVtIGFuZCBsaWJyYXJ5IGNhbGxzICovCitzdGF0aWMgaW50IHNvY2tldF9lcnJvciA9IDA7CitpbnQKK215X3NvY2tldChpbnQgZG9tYWluLCBpbnQgdHlwZSwgaW50IHByb3RvY29sKQoreworICBpZiAoc29ja2V0X2Vycm9yID09IDApCisgICAgeworICAgICAgcmV0dXJuIHNvY2tldCAoZG9tYWluLCB0eXBlLCBwcm90b2NvbCk7CisgICAgfQorICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgcmVjdl9lcnJvciA9IDA7Citzc2l6ZV90CitteV9yZWN2KGludCBzb2NrZXQsIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCwgaW50IGZsYWdzKQoreworICBpZiAocmVjdl9lcnJvciA9PSAwKQorICAgIHsKKyAgICAgIHJldHVybiByZWN2IChzb2NrZXQsIGJ1ZmZlciwgbGVuZ3RoLCBmbGFncyk7CisgICAgfQorICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgc2VuZF9lcnJvciA9IDA7Citzc2l6ZV90CitteV9zZW5kKGludCBzb2NrZXQsIGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCwgaW50IGZsYWdzKQoreworICBpZiAoc2VuZF9lcnJvciA9PSAwKQorICAgIHsKKyAgICAgIHJldHVybiBzZW5kIChzb2NrZXQsIGJ1ZmZlciwgbGVuZ3RoLCBmbGFncyk7CisgICAgfQorICByZXR1cm4gLTE7Cit9CisKKyNkZWZpbmUgc29ja2V0IG15X3NvY2tldAorI2RlZmluZSByZWN2IG15X3JlY3YKKyNkZWZpbmUgc2VuZCBteV9zZW5kCisjaW5jbHVkZSAiLi4vc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zc2xfc29ja2V0LmMiCisjdW5kZWYgc29ja2V0CisjdW5kZWYgcmVjdgorI3VuZGVmIHNlbmQKKworc3RhdGljIHZvaWQgdGhyaWZ0X3NvY2tldF9zZXJ2ZXIgKGNvbnN0IGludCBwb3J0KTsKKworLyogdGVzdCBvYmplY3QgY3JlYXRpb24gYW5kIGRlc3RydWN0aW9uICovCitzdGF0aWMgdm9pZAordGVzdF9zc2xfY3JlYXRlX2FuZF9kZXN0cm95KHZvaWQpCit7CisgIGdjaGFyICpob3N0bmFtZSA9IE5VTEw7CisgIGd1aW50IHBvcnQgPSAwOworCisgIEdPYmplY3QgKm9iamVjdCA9IE5VTEw7CisgIG9iamVjdCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU1NMX1NPQ0tFVCwgTlVMTCk7CisgIGdfYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CisgIGdfb2JqZWN0X2dldCAoR19PQkpFQ1Qob2JqZWN0KSwgImhvc3RuYW1lIiwgJmhvc3RuYW1lLCAicG9ydCIsICZwb3J0LCBOVUxMKTsKKyAgZ19mcmVlIChob3N0bmFtZSk7CisgIGdfb2JqZWN0X3VucmVmIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9zc2xfY3JlYXRlX2FuZF9zZXRfcHJvcGVydGllcyh2b2lkKQoreworICBnY2hhciAqaG9zdG5hbWUgPSBOVUxMOworICBndWludCBwb3J0ID0gMDsKKyAgU1NMX0NUWCogc3NsX2N0eD0gTlVMTDsKKyAgR0Vycm9yICplcnJvcj1OVUxMOworCisgIEdPYmplY3QgKm9iamVjdCA9IE5VTEw7CisgIG9iamVjdCA9IHRocmlmdF9zc2xfc29ja2V0X25ldyhTU0xUTFMsICZlcnJvcik7CisgIGdfb2JqZWN0X2dldCAoR19PQkpFQ1Qob2JqZWN0KSwgImhvc3RuYW1lIiwgJmhvc3RuYW1lLCAicG9ydCIsICZwb3J0LCAic3NsX2NvbnRleHQiLCAmc3NsX2N0eCwgTlVMTCk7CisgIGdfYXNzZXJ0IChzc2xfY3R4IT1OVUxMKTsKKworICBnX2ZyZWUgKGhvc3RuYW1lKTsKKyAgZ19vYmplY3RfdW5yZWYgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3NzbF9vcGVuX2FuZF9jbG9zZV9ub25fc3NsX3NlcnZlcih2b2lkKQoreworICBUaHJpZnRTU0xTb2NrZXQgKnRTU0xTb2NrZXQgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CisgIEdFcnJvciAqZXJyb3I9TlVMTDsKKyAgcGlkX3QgcGlkOworICBpbnQgbm9uX3NzbF9wb3J0ID0gNTExOTg7CisgIGNoYXIgZXJyb3Jtc2dbMjU1XTsKKworCisgIHBpZCA9IGZvcmsgKCk7CisgIGdfYXNzZXJ0ICggcGlkID49IDAgKTsKKworICBpZiAoIHBpZCA9PSAwICkKKyAgICB7CisgICAgICAvKiBjaGlsZCBsaXN0ZW5zICovCisgICAgICAvKiBUaGlzIGlzIGEgbm9uIFNTTCBzZXJ2ZXIgKi8KKyAgICAgIHRocmlmdF9zb2NrZXRfc2VydmVyIChub25fc3NsX3BvcnQpOworICAgICAgZXhpdCAoMCk7CisgICAgfSBlbHNlIHsKKwkvKiBwYXJlbnQgY29ubmVjdHMsIHdhaXQgYSBiaXQgZm9yIHRoZSBzb2NrZXQgdG8gYmUgY3JlYXRlZCAqLworCXNsZWVwICgxKTsKKworCS8qIG9wZW4gYSBjb25uZWN0aW9uIGFuZCBjbG9zZSBpdCAqLworCXRTU0xTb2NrZXQgPSB0aHJpZnRfc3NsX3NvY2tldF9uZXdfd2l0aF9ob3N0KFNTTFRMUywgImxvY2FsaG9zdCIsIG5vbl9zc2xfcG9ydCwgJmVycm9yKTsKKworCXRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRTU0xTb2NrZXQpOworCWdfYXNzZXJ0ICh0aHJpZnRfc3NsX3NvY2tldF9vcGVuICh0cmFuc3BvcnQsICZlcnJvcikgPT0gRkFMU0UpOworCWdfYXNzZXJ0X2NtcHN0cihlcnJvci0+bWVzc2FnZSwgPT0gLCJFcnJvciB3aGlsZSBjb25uZWN0L2JpbmQ6IDY4IC0+IENvbm5lY3Rpb24gcmVzZXQgYnkgcGVlciIpOworCWdfY2xlYXJfZXJyb3IgKCZlcnJvcik7CisJZ19hc3NlcnQgKHRocmlmdF9zc2xfc29ja2V0X2lzX29wZW4gKHRyYW5zcG9ydCkgPT0gRkFMU0UpOworCXRocmlmdF9zc2xfc29ja2V0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOworCWdfYXNzZXJ0ICh0aHJpZnRfc3NsX3NvY2tldF9pc19vcGVuICh0cmFuc3BvcnQpID09IEZBTFNFKTsKKworCS8qIHRlc3QgY2xvc2UgZmFpbHVyZSAqLworCVRIUklGVF9TT0NLRVQodFNTTFNvY2tldCktPnNkID0gLTE7CisJdGhyaWZ0X3NzbF9zb2NrZXRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CisJZ19vYmplY3RfdW5yZWYgKHRTU0xTb2NrZXQpOworCisJLyogdHJ5IGEgaG9zdG5hbWUgbG9va3VwIGZhaWx1cmUgKi8KKwl0U1NMU29ja2V0ID0gdGhyaWZ0X3NzbF9zb2NrZXRfbmV3X3dpdGhfaG9zdChTU0xUTFMsICJsb2NhbGhvc3QuYnJva2VuIiwgbm9uX3NzbF9wb3J0LCAmZXJyb3IpOworCXRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRTU0xTb2NrZXQpOworCWdfYXNzZXJ0ICh0aHJpZnRfc3NsX3NvY2tldF9vcGVuICh0cmFuc3BvcnQsICZlcnJvcikgPT0gRkFMU0UpOworCXNucHJpbnRmKGVycm9ybXNnLCAyNTUsICJob3N0IGxvb2t1cCBmYWlsZWQgZm9yIGxvY2FsaG9zdC5icm9rZW46JWQgLSBVbmtub3duIGhvc3QiLCBub25fc3NsX3BvcnQpOworCWdfYXNzZXJ0X2NtcHN0cihlcnJvci0+bWVzc2FnZSwgPT0sIGVycm9ybXNnKTsKKwlnX2NsZWFyX2Vycm9yICgmZXJyb3IpOworCWdfb2JqZWN0X3VucmVmICh0U1NMU29ja2V0KTsKKwllcnJvciA9IE5VTEw7CisKKwkJLyogdHJ5IGFuIGVycm9yIGNhbGwgdG8gc29ja2V0KCkgKi8KKwkvKgorCQl0U1NMU29ja2V0ID0gdGhyaWZ0X3NzbF9zb2NrZXRfbmV3X3dpdGhfaG9zdChTU0xUTFMsICJsb2NhbGhvc3QiLCBwb3J0LCAmZXJyb3IpOworCQl0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUICh0U1NMU29ja2V0KTsKKwkJc29ja2V0X2Vycm9yID0gMTsKKwkJYXNzZXJ0ICh0aHJpZnRfc3NsX3NvY2tldF9vcGVuICh0cmFuc3BvcnQsICZlcnJvcikgPT0gRkFMU0UpOworCQlzb2NrZXRfZXJyb3IgPSAwOworCQlnX29iamVjdF91bnJlZiAodFNTTFNvY2tldCk7CisJCWdfZXJyb3JfZnJlZSAoZXJyb3IpOworCSAqLworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3Rlc3Rfc3NsX3dyaXRlX2ludmFsaWRfc29ja2V0KHZvaWQpCit7CisgIFRocmlmdFNTTFNvY2tldCAqdFNTTFNvY2tldCA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgR0Vycm9yICplcnJvcj1OVUxMOworICBjaGFyIGJ1ZmZlcltdID0gInRoaXMgbXVzdCBub3QgYnJlYWsiOworCisgIC8qIG9wZW4gYSBjb25uZWN0aW9uIGFuZCBjbG9zZSBpdCAqLworICB0U1NMU29ja2V0ID0gdGhyaWZ0X3NzbF9zb2NrZXRfbmV3X3dpdGhfaG9zdChTU0xUTFMsICJsb2NhbGhvc3QiLCA1MTE4OCsxLCAmZXJyb3IpOworCisgIHRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRTU0xTb2NrZXQpOworICBnX2Fzc2VydCAodGhyaWZ0X3NzbF9zb2NrZXRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKSA9PSBGQUxTRSk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfc3NsX3NvY2tldF9pc19vcGVuICh0cmFuc3BvcnQpID09IEZBTFNFKTsKKworICAvKiBGSVhNRSBUaGlzIG11c3QgYmUgdGVzdGVkIGJ1dCBzaW5jZSB0aGUgYXNzZXJ0aW9uIGluc2lkZSB0aHJpZnRfc3NsX3NvY2tldF93cml0ZSBicmVha3MgdGhlIHRlc3QgdW5pdAorICAgaXQncyBkaXNhYmxlZC4gVGhleSBpZGVhIGlzIHRvIGRpc2FibGUgdHJhcC9jb3JlZHVtcCBkdXJpbmcgdGhpcyB0ZXN0CisgIGdfYXNzZXJ0ICh0aHJpZnRfc3NsX3NvY2tldF93cml0ZSh0cmFuc3BvcnQsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICZlcnJvcikgPT0gRkFMU0UpOworICBnX21lc3NhZ2UgKCJ3cml0ZV9mYWlsZWRfd2l0aF9lcnJvcjogJXMiLAorCSAgICAgZXJyb3IgIT0gTlVMTCA/IGVycm9yLT5tZXNzYWdlIDogIk5vIik7CisgIGdfY2xlYXJfZXJyb3IgKCZlcnJvcik7CisgICovCisgIHRocmlmdF9zc2xfc29ja2V0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOworICBnX2Fzc2VydCAodGhyaWZ0X3NzbF9zb2NrZXRfaXNfb3BlbiAodHJhbnNwb3J0KSA9PSBGQUxTRSk7CisKKyAgLyogdGVzdCBjbG9zZSBmYWlsdXJlICovCisgIFRIUklGVF9TT0NLRVQodFNTTFNvY2tldCktPnNkID0gLTE7CisgIHRocmlmdF9zc2xfc29ja2V0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOworICBnX29iamVjdF91bnJlZiAodFNTTFNvY2tldCk7Cit9CisKKworCisvKioKKyAqIFByaW50IHRoZSBjb21tb24gbmFtZSBvZiBjZXJ0aWZpY2F0ZQorICovCit1bnNpZ25lZCBjaGFyICogZ2V0X2NuX25hbWUoWDUwOV9OQU1FKiBjb25zdCBuYW1lKQoreworICBpbnQgaWR4ID0gLTE7CisgIHVuc2lnbmVkIGNoYXIgKnV0ZjggPSBOVUxMOworCisgIGRvCisgICAgeworICAgICAgaWYoIW5hbWUpIGJyZWFrOyAvKiBmYWlsZWQgKi8KKworICAgICAgaWR4ID0gWDUwOV9OQU1FX2dldF9pbmRleF9ieV9OSUQobmFtZSwgTklEX2NvbW1vbk5hbWUsIC0xKTsKKyAgICAgIGlmKCEoaWR4ID4gLTEpKSAgYnJlYWs7IC8qIGZhaWxlZCAqLworCisgICAgICBYNTA5X05BTUVfRU5UUlkqIGVudHJ5ID0gWDUwOV9OQU1FX2dldF9lbnRyeShuYW1lLCBpZHgpOworICAgICAgaWYoIWVudHJ5KSBicmVhazsgLyogZmFpbGVkICovCisKKyAgICAgIEFTTjFfU1RSSU5HKiBkYXRhID0gWDUwOV9OQU1FX0VOVFJZX2dldF9kYXRhKGVudHJ5KTsKKyAgICAgIGlmKCFkYXRhKSBicmVhazsgLyogZmFpbGVkICovCisKKyAgICAgIGludCBsZW5ndGggPSBBU04xX1NUUklOR190b19VVEY4KCZ1dGY4LCBkYXRhKTsKKyAgICAgIGlmKCF1dGY4IHx8ICEobGVuZ3RoID4gMCkpICBicmVhazsgLyogZmFpbGVkICovCisKKyAgICB9IHdoaWxlICgwKTsKKyAgcmV0dXJuIHV0Zjg7Cit9CisKKy8qCisgKiBIYW5kbGUgSVBWNCBhbmQgSVBWNiBhZGRyCisgKi8KK3ZvaWQgKmdldF9pbl9hZGRyKHN0cnVjdCBzb2NrYWRkciAqc2EpCit7CisgIGlmIChzYS0+c2FfZmFtaWx5ID09IEFGX0lORVQpCisgICAgcmV0dXJuICYoKChzdHJ1Y3Qgc29ja2FkZHJfaW4qKXNhKS0+c2luX2FkZHIpOworICByZXR1cm4gJigoKHN0cnVjdCBzb2NrYWRkcl9pbjYqKXNhKS0+c2luNl9hZGRyKTsKK30KKworaW50IHZlcmlmeV9pcChjaGFyICogaG9zdG5hbWUsIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICphZGRyKQoreworICBzdHJ1Y3QgYWRkcmluZm8gKmFkZHJfaW5mbywqcDsKKyAgc3RydWN0IGFkZHJpbmZvIGhpbnRzOworICBpbnQgcmVzOworICBpbnQgcmV0dmFsID0gMDsKKworCisgIG1lbXNldCgmaGludHMsIDAsIHNpemVvZiAoc3RydWN0IGFkZHJpbmZvKSk7CisgIGhpbnRzLmFpX2ZhbWlseSA9IEFGX1VOU1BFQzsgLyogdXNlIEFGX0lORVQ2IHRvIGZvcmNlIElQdjYgKi8KKyAgaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKKworCisgIGlmICggKHJlcyA9IGdldGFkZHJpbmZvKGhvc3RuYW1lLCBOVUxMLCAmaGludHMsICZhZGRyX2luZm8pICkgIT0gMCkKKyAgICB7CisgICAgICAvKiBnZXQgdGhlIGhvc3QgaW5mbyAqLworICAgICAgZ19lcnJvcigiQ2Fubm90IGdldCB0aGUgaG9zdCBhZGRyZXNzIik7CisgICAgICByZXR1cm4gcmV0dmFsOworICAgIH0KKyAgLyogbG9vcCB0aHJvdWdoIGFsbCB0aGUgcmVzdWx0cyBhbmQgY29ubmVjdCB0byB0aGUgZmlyc3Qgd2UgY2FuICovCisgIGNoYXIgZG5zaG9zdFtJTkVUNl9BRERSU1RSTEVOXTsgLyogYmlnZ2VyIGFkZHIgc3VwcG9ydGVkIElQVjYgKi8KKyAgY2hhciBzb2NrZXRfaXBbSU5FVDZfQUREUlNUUkxFTl07CisgIGlmKGluZXRfbnRvcChhZGRyLT5zc19mYW1pbHksIGdldF9pbl9hZGRyKGFkZHIpLCBzb2NrZXRfaXAsIElORVQ2X0FERFJTVFJMRU4pPT1zb2NrZXRfaXApeworICAgICAgZ19kZWJ1ZygiV2UgYXJlIGNvbm5lY3RlZCB0byBob3N0ICVzIGNoZWNraW5nIGFnYWluc3QgY2VydGlmaWNhdGUuLi4iLCBzb2NrZXRfaXApOworICAgICAgaW50IHNpemVpcCA9IHNvY2tldF9pcCE9TlVMTCA/IHN0cmxlbihzb2NrZXRfaXApIDogMDsKKyAgICAgIGZvcihwID0gYWRkcl9pbmZvOyBwICE9IE5VTEw7IHAgPSBwLT5haV9uZXh0KSB7CisJICBpZihpbmV0X250b3AocC0+YWlfZmFtaWx5LCBnZXRfaW5fYWRkcigoc3RydWN0IHNvY2thZGRyICopcC0+YWlfYWRkciksIGRuc2hvc3QsIElORVQ2X0FERFJTVFJMRU4pPT1kbnNob3N0KXsKKwkgICAgICBpZihkbnNob3N0IT1OVUxMKXsKKwkJICBnX2luZm8oIkROUyBhZGRyZXNzIFslaSAtPiAlc10iLCBwLT5haV9hZGRyLCBkbnNob3N0KTsKKwkJICBpZighc3RybmNtcChkbnNob3N0LCBzb2NrZXRfaXAsIHNpemVpcCkpeworCQkgICAgICByZXR2YWw9MTsKKwkJICAgICAgYnJlYWs7IC8qIGlmIHdlIGdldCBoZXJlLCB3ZSBtdXN0IGhhdmUgY29ubmVjdGVkIHN1Y2Nlc3NmdWxseSAqLworCQkgIH0KKwkgICAgICB9CisJICB9CisgICAgICB9CisgIH0KKworICBpZihhZGRyX2luZm8pCisgICAgZnJlZWFkZHJpbmZvKGFkZHJfaW5mbyk7CisKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQKK3JlYWRfZnJvbV9maWxlKGNoYXIgKmJ1ZmZlciwgbG9uZyBzaXplLCBjb25zdCBjaGFyICpmaWxlX25hbWUpCit7CisgIGNoYXIgY2g7CisgIGxvbmcgaW5kZXg9MDsKKyAgRklMRSAqZnA7CisKKyAgZnAgPSBmb3BlbihmaWxlX25hbWUsInIiKTsgLyogcmVhZCBtb2RlICovCisKKyAgaWYoIGZwID09IE5VTEwgKQorICAgIHsKKyAgICAgIHBlcnJvcigiRXJyb3Igd2hpbGUgb3BlbmluZyB0aGUgZmlsZS5cbiIpOworICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgIH0KKworICBwcmludGYoIlRoZSBjb250ZW50cyBvZiAlcyBmaWxlIGFyZSA6XG4iLCBmaWxlX25hbWUpOworCisgIHdoaWxlKGluZGV4PHNpemUgJiYgKCBjaCA9IGZnZXRjKGZwKSApICE9IEVPRiApeworICAgICAgYnVmZmVyW2luZGV4KytdID0gY2g7CisgIH0KKworICBmY2xvc2UoZnApOworfQorCisjZGVmaW5lIElTU1VFUl9DTl9QSU5OSU5HICJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iCisjZGVmaW5lIFNVQkpFQ1RfQ05fUElOTklORyAibG9jYWxob3N0IgorI2RlZmluZSBDRVJUX1NFUklBTF9OVU1CRVIgIjEiCisKK2dib29sZWFuIHZlcmlmeV9jZXJ0aWZpY2F0ZV9zbihYNTA5ICpjZXJ0LCBjb25zdCB1bnNpZ25lZCBjaGFyICpzZXJpYWxfbnVtYmVyKQoreworICBnYm9vbGVhbiByZXR2YWwgPSBGQUxTRTsKKworICBBU04xX0lOVEVHRVIgKnNlcmlhbCA9IFg1MDlfZ2V0X3NlcmlhbE51bWJlcihjZXJ0KTsKKworICBCSUdOVU0gKmJuID0gQVNOMV9JTlRFR0VSX3RvX0JOKHNlcmlhbCwgTlVMTCk7CisgIGlmICghYm4pIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAidW5hYmxlIHRvIGNvbnZlcnQgQVNOMUlOVEVHRVIgdG8gQk5cbiIpOworICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgfQorICBjaGFyICp0bXAgPSBCTl9ibjJkZWMoYm4pOworICBpZiAoIXRtcCkgeworICAgICAgZ193YXJuaW5nKHN0ZGVyciwgInVuYWJsZSB0byBjb252ZXJ0IEJOIHRvIGRlY2ltYWwgc3RyaW5nLlxuIik7CisgICAgICBCTl9mcmVlKGJuKTsKKyAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgIH0KKyAgLyoKKyAgICBpZiAoc3RybGVuKHRtcCkgPj0gbGVuKSB7CisgICAgICBnX3dhcm4oc3RkZXJyLCAiYnVmZmVyIGxlbmd0aCBzaG9ydGVyIHRoYW4gc2VyaWFsIG51bWJlclxuIik7CisgICAgICBCTl9mcmVlKGJuKTsKKyAgICAgIE9QRU5TU0xfZnJlZSh0bXApOworICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisgICovCisgIGlmKCFzdHJuY21wKHNlcmlhbF9udW1iZXIsIHRtcCwgc3RybGVuKHNlcmlhbF9udW1iZXIpKSl7CisgICAgICByZXR2YWw9VFJVRTsKKyAgfWVsc2V7CisgICAgICBnX3dhcm5pbmcoIlNlcmlhbCBudW1iZXIgaXMgbm90IHZhbGlkIik7CisgIH0KKworICBCTl9mcmVlKGJuKTsKKyAgT1BFTlNTTF9mcmVlKHRtcCk7CisgIHJldHVybiByZXR2YWw7Cit9CisKK2dib29sZWFuIG15X2FjY2Vzc19tYW5hZ2VyKFRocmlmdFRyYW5zcG9ydCAqIHRyYW5zcG9ydCwgWDUwOSAqY2VydCwgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKmFkZHIsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRTU0xTb2NrZXQgKnNzbFNvY2tldCA9IFRIUklGVF9TU0xfU09DS0VUICh0cmFuc3BvcnQpOworCisgIGdfaW5mbygiUHJvY2Vzc2luZyBhY2Nlc3MgdG8gdGhlIHNlcnZlciIpOworICBYNTA5X05BTUUqIGluYW1lID0gY2VydCA/IFg1MDlfZ2V0X2lzc3Vlcl9uYW1lKGNlcnQpIDogTlVMTDsKKyAgWDUwOV9OQU1FKiBzbmFtZSA9IGNlcnQgPyBYNTA5X2dldF9zdWJqZWN0X25hbWUoY2VydCkgOiBOVUxMOworCisgIC8qIElzc3VlciBpcyB0aGUgYXV0aG9yaXR5IHdlIHRydXN0IHRoYXQgd2FycmFudHMgbm90aGluZyB1c2VmdWwgKi8KKyAgY29uc3QgdW5zaWduZWQgY2hhciAqIGlzc3VlciA9IGdldF9jbl9uYW1lKGluYW1lKTsKKyAgaWYoaXNzdWVyKXsKKyAgICAgIGdib29sZWFuIHZhbGlkID0gVFJVRTsKKyAgICAgIGdfaW5mbygiSXNzdWVyIChjbikgJXMiLCBpc3N1ZXIpOworCisgICAgICAvKiBJc3N1ZXIgcGlubmluZyAqLworICAgICAgaWYoc3RybmNtcChJU1NVRVJfQ05fUElOTklORywgaXNzdWVyLCBzdHJsZW4oSVNTVUVSX0NOX1BJTk5JTkcpKSl7CisJICBnX3dhcm5pbmcoIlRoZSBJc3N1ZXIgb2YgdGhlIGNlcnRpZmljYXRlIGlzIG5vdCB2YWxpZCIpOworCSAgdmFsaWQ9RkFMU0U7CisgICAgICB9CisgICAgICBPUEVOU1NMX2ZyZWUoaXNzdWVyKTsKKyAgICAgIGlmKCF2YWxpZCkKKwlyZXR1cm4gdmFsaWQ7CisgIH0KKworCisgIC8qIFN1YmplY3QgaXMgd2hvIHRoZSBjZXJ0aWZpY2F0ZSBpcyBpc3N1ZWQgdG8gYnkgdGhlIGF1dGhvcml0eSAgKi8KKyAgY29uc3QgdW5zaWduZWQgY2hhciAqIHN1YmplY3QgPSBnZXRfY25fbmFtZShzbmFtZSk7CisgIGlmKHN1YmplY3QpeworICAgICAgZ19pbmZvKCJTdWJqZWN0IChjbikgJXMiLCBzdWJqZWN0KTsKKyAgICAgIGdib29sZWFuIHZhbGlkID0gVFJVRTsKKworICAgICAgLyogU3ViamVjdCBwaW5uaW5nICovCisgICAgICBpZihzdHJuY21wKFNVQkpFQ1RfQ05fUElOTklORywgc3ViamVjdCwgc3RybGVuKFNVQkpFQ1RfQ05fUElOTklORykpKXsKKwkgIGdfd2FybmluZygiVGhlIHN1YmplY3Qgb2YgdGhlIGNlcnRpZmljYXRlIGlzIG5vdCB2YWxpZCIpOworCSAgdmFsaWQ9RkFMU0U7CisgICAgICB9CisKKyAgICAgIGlmKCF2YWxpZCkKKwlyZXR1cm4gdmFsaWQ7CisKKyAgICAgIC8qIEhvc3QgcGlubmluZyAgICAgICAqLworICAgICAgaWYodmVyaWZ5X2lwKHN1YmplY3QsIGFkZHIpKXsKKwkgIGdfaW5mbygiVmVyaWZpZWQgc3ViamVjdCIpOworICAgICAgfWVsc2V7CisJICBnX2luZm8oIkNhbm5vdCB2ZXJpZnkgc3ViamVjdCIpOworCSAgdmFsaWQ9RkFMU0U7CisgICAgICB9CisgICAgICBPUEVOU1NMX2ZyZWUoc3ViamVjdCk7CisKKyAgICAgIGlmKCF2YWxpZCkKKwlyZXR1cm4gdmFsaWQ7CisgIH0KKworICBpZighdmVyaWZ5X2NlcnRpZmljYXRlX3NuKGNlcnQsIENFUlRfU0VSSUFMX05VTUJFUikpeworICAgICAgcmV0dXJuIEZBTFNFOworICB9ZWxzZXsKKyAgICAgIGdfaW5mbygiVmVyaWZpZWQgc2VyaWFsIG51bWJlciIpOworICB9CisKKyAgcmV0dXJuIFRSVUU7CisKK30KKworCisKKworI2lmZGVmIEJVSUxEX1NFUlZFUgorc3RhdGljIHZvaWQKK3Rlc3Rfc3NsX2F1dGhvcml6YXRpb25fbWFuYWdlcih2b2lkKQoreworICBpbnQgc3RhdHVzPTA7CisgIHBpZF90IHBpZDsKKyAgVGhyaWZ0U1NMU29ja2V0ICp0U1NMc29ja2V0ID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICAvKiAgaW50IHBvcnQgPSA1MTE5OTsgKi8KKyAgaW50IHBvcnQgPSA0NDM7CisgIEdFcnJvciAqZXJyb3I9TlVMTDsKKworICBndWNoYXIgYnVmWzE3XSA9IFRFU1RfREFUQTsgLyogYSBidWZmZXIgKi8KKworLyoKKyAgcGlkID0gZm9yayAoKTsKKyAgICBnX2Fzc2VydCAoIHBpZCA+PSAwICk7CisKKyAgICBpZiAoIHBpZCA9PSAwICkKKyAgICB7CisgICAgICB0aHJpZnRfc3NsX3NvY2tldF9zZXJ2ZXIgKHBvcnQpOworICAgICAgZXhpdCAoMCk7CisgICAgfSBlbHNlIHsKKwkqLworICAvKiBwYXJlbnQgY29ubmVjdHMsIHdhaXQgYSBiaXQgZm9yIHRoZSBzb2NrZXQgdG8gYmUgY3JlYXRlZCAqLworICBzbGVlcCAoMSk7CisKKyAgLyogVGVzdCBhZ2FpbnN0IGxldmVsMiBvd25jbG91ZCBjZXJ0aWZpY2F0ZSAqLworICB0U1NMc29ja2V0ID0gdGhyaWZ0X3NzbF9zb2NrZXRfbmV3X3dpdGhfaG9zdChTU0xUTFMsICJsb2NhbGhvc3QiLCBwb3J0LCAmZXJyb3IpOworICB0aHJpZnRfc3NsX3NvY2tldF9zZXRfbWFuYWdlcih0U1NMc29ja2V0LCBteV9hY2Nlc3NfbWFuYWdlcik7ICAgICAgICAgICAvKiBJbnN0YWxsIHBpbm5pbmcgbWFuYWdlciAqLworICAvKiB0aHJpZnRfc3NsX2xvYWRfY2VydF9mcm9tX2ZpbGUodFNTTHNvY2tldCwgIi4vb3duY2xvdWQubGV2ZWwyY3JtLnBlbSIpOyAqLworICB1bnNpZ25lZCBjaGFyIGNlcnRfYnVmZmVyWzY1NTM0XTsKKyAgcmVhZF9mcm9tX2ZpbGUoY2VydF9idWZmZXIsIDY1NTM0LCAiLi4vLi4va2V5cy9jbGllbnQucGVtIik7CisgIGlmKCF0aHJpZnRfc3NsX2xvYWRfY2VydF9mcm9tX2J1ZmZlcih0U1NMc29ja2V0LCBjZXJ0X2J1ZmZlcikpeworICAgICAgZ193YXJuaW5nKCJDZXJ0aWZpY2F0ZXMgY2Fubm90IGJlIGxvYWRlZCEiKTsKKyAgfQorCisgIHRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRTU0xzb2NrZXQpOworICBnX2Fzc2VydCAodGhyaWZ0X3NzbF9zb2NrZXRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKSA9PSBUUlVFKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9zc2xfc29ja2V0X2lzX29wZW4gKHRyYW5zcG9ydCkpOworCisgIHRocmlmdF9zc2xfc29ja2V0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMTcsIE5VTEwpOworCisgIC8qIHdyaXRlIGZhaWwgKi8KKyAgc2VuZF9lcnJvciA9IDE7CisgIC8qCisgICAgICB0aHJpZnRfc3NsX3NvY2tldF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEsIE5VTEwpOworICAgICBzZW5kX2Vycm9yID0gMDsKKyAgICAgIHRocmlmdF9zc2xfc29ja2V0X3dyaXRlX2VuZCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICAgIHRocmlmdF9zc2xfc29ja2V0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgICAgKi8KKyAgdGhyaWZ0X3NzbF9zb2NrZXRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CisgIGdfb2JqZWN0X3VucmVmICh0U1NMc29ja2V0KTsKKworICAvKiAgICBnX2Fzc2VydCAoIHdhaXQgKCZzdGF0dXMpID09IHBpZCApOyAqLworICBnX2Fzc2VydCAoIHN0YXR1cyA9PSAwICk7CisgIC8qICB9ICovCit9CisjZW5kaWYKKworCitzdGF0aWMgdm9pZAordGhyaWZ0X3NvY2tldF9zZXJ2ZXIgKGNvbnN0IGludCBwb3J0KQoreworICBpbnQgYnl0ZXMgPSAwOworICBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCAqY2xpZW50ID0gTlVMTDsKKyAgZ3VjaGFyIGJ1ZlsxMF07IC8qIGEgYnVmZmVyICovCisgIGd1Y2hhciBtYXRjaFsxMF0gPSBURVNUX0RBVEE7CisKKyAgVGhyaWZ0U2VydmVyU29ja2V0ICp0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULAorCQkJCQkgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOworCisgIHRyYW5zcG9ydCA9IFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUICh0c29ja2V0KTsKKyAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfbGlzdGVuICh0cmFuc3BvcnQsIE5VTEwpOworICBjbGllbnQgPSB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKHRyYW5zcG9ydCwgTlVMTCk7CisgIGdfYXNzZXJ0IChjbGllbnQgIT0gTlVMTCk7CisKKyAgLyogcmVhZCAxMCBieXRlcyAqLworICBieXRlcyA9IHRocmlmdF9zc2xfc29ja2V0X3JlYWQgKGNsaWVudCwgYnVmLCAxMCwgTlVMTCk7CisgIGdfYXNzZXJ0IChieXRlcyA9PSAxMCk7IC8qIG1ha2Ugc3VyZSB3ZSd2ZSByZWFkIDEwIGJ5dGVzICovCisgIGdfYXNzZXJ0ICggbWVtY21wKGJ1ZiwgbWF0Y2gsIDEwKSA9PSAwICk7IC8qIG1ha2Ugc3VyZSB3aGF0IHdlIGdvdCBtYXRjaGVzICovCisKKyAgLyogZmFpbGVkIHJlYWQgKi8KKyAgcmVjdl9lcnJvciA9IDE7CisgIHRocmlmdF9zc2xfc29ja2V0X3JlYWQgKGNsaWVudCwgYnVmLCAxLCBOVUxMKTsKKyAgcmVjdl9lcnJvciA9IDA7CisKKyAgdGhyaWZ0X3NzbF9zb2NrZXRfcmVhZF9lbmQgKGNsaWVudCwgTlVMTCk7CisgIHRocmlmdF9zc2xfc29ja2V0X2Nsb3NlIChjbGllbnQsIE5VTEwpOworICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisgIGdfb2JqZWN0X3VucmVmIChjbGllbnQpOworfQorCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgaW50IHJldHZhbDsKKyNpZiAoIUdMSUJfQ0hFQ0tfVkVSU0lPTiAoMiwgMzYsIDApKQorICBnX3R5cGVfaW5pdCgpOworI2VuZGlmCisKKyAgZ190ZXN0X2luaXQgKCZhcmdjLCAmYXJndiwgTlVMTCk7CisKKyAgdGhyaWZ0X3NzbF9zb2NrZXRfaW5pdGlhbGl6ZV9vcGVuc3NsKCk7CisKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3R0cmFuc3BvcnRzc2xzb2NrZXQvQ3JlYXRlQW5kRGVzdHJveSIsIHRlc3Rfc3NsX2NyZWF0ZV9hbmRfZGVzdHJveSk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0dHJhbnNwb3J0c3Nsc29ja2V0L0NyZWF0ZUFuZFNldFByb3BlcnRpZXMiLCB0ZXN0X3NzbF9jcmVhdGVfYW5kX3NldF9wcm9wZXJ0aWVzKTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3R0cmFuc3BvcnRzc2xzb2NrZXQvT3BlbkFuZENsb3NlTm9uU1NMU2VydmVyIiwgdGVzdF9zc2xfb3Blbl9hbmRfY2xvc2Vfbm9uX3NzbF9zZXJ2ZXIpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdHRyYW5zcG9ydHNzbHNvY2tldC9PcGVuQW5kV3JpdGVJbnZhbGlkU29ja2V0IiwgdGVzdF9zc2xfd3JpdGVfaW52YWxpZF9zb2NrZXQpOworCisKKworCisgIHJldHZhbCA9IGdfdGVzdF9ydW4gKCk7CisKKyAgdGhyaWZ0X3NzbF9zb2NrZXRfZmluYWxpemVfb3BlbnNzbCgpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKZGlmZiAtLWdpdCBhL2xpYi9jbC9NYWtlZmlsZS5hbSBiL2xpYi9jbC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGIzODg2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NsL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNDAgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitUSFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAorCithbGwtbG9jYWw6CisJYmFzaCBlbnN1cmUtZXh0ZXJuYWxzLnNoCisKK3J1bi10ZXN0czogdGVzdC9tYWtlLXRlc3QtYmluYXJ5Lmxpc3AKKwkkKFNCQ0wpIC0tc2NyaXB0IHRlc3QvbWFrZS10ZXN0LWJpbmFyeS5saXNwCisKK2NoZWNrLWxvY2FsOiBydW4tdGVzdHMKKwkuL3J1bi10ZXN0cworCitjbGVhbi1sb2NhbDoKKwkkKFJNKSBydW4tdGVzdHMgcXVpY2tsaXNwLmxpc3AgYmFja3BvcnQtdXBkYXRlLnppcAorCSQoUk0pIC1yZiBsaWIgZXh0ZXJuYWxzIHF1aWNrbGlzcAorCitFWFRSQV9ESVNUID0gXAorCVJFQURNRS5tZCBcCisJUkVBRE1FUyBcCisJbG9hZC1sb2NhbGx5Lmxpc3AgXAorCXRlc3QgXAorCWVuc3VyZS1leHRlcm5hbHMuc2gKZGlmZiAtLWdpdCBhL2xpYi9jbC9SRUFETUUubWQgYi9saWIvY2wvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNmVhZmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY2wvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMjUzIEBACitUaHJpZnQgQ29tbW9uIExpc3AgTGlicmFyeQorCitMaWNlbnNlCis9PT09PT09CisKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorCisKKworVXNpbmcgVGhyaWZ0IHdpdGggQ29tbW9uIExpc3AKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworIFRocmlmdCBpcyBhIHByb3RvY29sIGFuZCBsaWJyYXJ5IGZvciBsYW5ndWFnZS1pbmRlcGVuZGVudCBjb21tdW5pY2F0aW9uIGJldHdlZW4gY29vcGVyYXRpbmcKKyBwcm9jZXNzZXMuIFRoZSBjb21tdW5pY2F0aW9uIHRha2VzIHRoZSBmb3JtIG9mIHJlcXVlc3QgYW5kIHJlc3BvbnNlIG1lc3NhZ2VzLCBvZiB3aGljaCB0aGUgZm9ybXMKKyBhcmUgc3BlY2lmaWVkIGluIGFkdmFuY2UgdGhyb3VmaCBhIHNoYXJlZCBpbnRlcmZhY2UgZGVmaW5pdGlvbi4gQSBUaHJpZnQgZGVmaW5pdGlvbiBmaWxlIGlzIHRyYW5zbGF0ZWQKKyBpbnRvIExpc3Agc291cmNlIGZpbGVzLCB3aGljaCBjb21wcmlzZSBzZXZlcmFsIGRlZmluaXRpb25zOgorCisgICogVGhyZWUgcGFja2FnZXMsIG9uZSBmb3IgdGhlIG5hbWVzcGFjZSBvZiB0aGUgaW1wbGVtZW50YXRpb24gb3BlcmF0b3JzLCBhbmQgb25lIGVhY2ggZm9yIHJlcXVlc3QgYW5kCisgIHJlc3BvbnNlIG9wZXJhdG9ycy4KKyAgKiBWYXJpb3VzIHR5cGUgZGVmaW5pdGlvbnMgYXMgaW1wbGVtZW50YXRpb25zIGZvciBUaHJpZnQgdHlwZWRlZiBhbmQgZW51bSBkZWZpbml0aW9ucy4KKyAgKiBERUYtU1RSVUNUIGFuZCBERUYtRVhDRVBUSU9OIGZvcm1zIGZvciBUaHJpZnQgc3RydWN0IGFuZCBleGNlcHRpb24gZGVmaW5pdGlvbnMuCisgICogREVGLVNFUlZJQ0UgZm9ybXMgZm9yIHRocmlmdCBzZXJ2aWNlIGRlZmluaXRpb25zLgorCisgRWFjaCBzZXJ2aWNlIGRlZmluaXRpb24gZXhwYW5kcyBpbiBhIGNvbGxlY3Rpb24gb2YgZ2VuZXJpYyBmdW5jdGlvbiBkZWZpbml0aW9ucy4gRm9yIGVhY2ggYG9wYAorIGluIHRoZSBzZXJ2aWNlIGRlZmluaXRpb24sIHR3byBmdW5jdGlvbnMgYXJlIGRlZmluZWQKKworICAqIGBvcGAtcmVxdWVzdCBpcyBkZWZpbmVkIGZvciB1c2UgYnkgYSBjbGllbnQuIEl0IGFjY2VwdHMgYW4gYWRkaXRpb25hbCBpbml0aWFsIGBwcm90b2NvbGAgYXJndW1lbnQsCisgICAgdG8gYWN0IGFzIHRoZSBjbGllbnQgcHJveHkgZm9yIHRoZSBvcGVyYXRpb24gYW5kIG1lZGlhdGUgdGhlIGludGVyYWN0aW9uIHdpdGggYSByZW1vdGUgcHJvY2VzcworICAgIHRocm91Z2ggYSBUaHJpZnQtZW5jb2RlZCB0cmFuc3BvcnQgc3RyZWFtLgorICAqIGBvcGAtcmVzcG9uc2UgaXMgZGVmaW5lZCBmb3IgdXNlIGJ5IGEgc2VydmVyLiBJdCBhY2NlcHRzIGEgc2luZ2xlIGBwcm90b2NvbGAgYXJndW1lbnQuIEEgc2VydmVyCisgICAgdXNlcyBpdCB0byBkZWNvZGUgdGhlIHJlcXVlc3QgbWVzc2FnZSwgaW52b2tlIHRoZSBiYXNlIGBvcGAgZnVuY3Rpb24gd2l0aCB0aGUgbWVzc2FnZSBhcmd1bWVudHMsCisgICAgZW5jb2RlIGFuZCBzZW5kIHRoZSB0aGUgcmVzdWx0IGFzIGEgcmVzcG9uc2UsIGFuZCBoYW5kbGVzIGV4Y2VwdGlvbnMuCisKKyBUaGUgY2xpZW50IGludGVyZmFjZSBpcyBvbmUgb3BlcmF0b3IKKworICAqIGB3aXRoLWNsaWVudCAodmFyaWFibGUgbG9jYXRpb24pIC4gYm9keWAgOiBjcmVhdGVzIGEgY29ubmVjdGlvbiBpbiBhIGR5bmFtaWMgY29udGV4dCBhbmQgY2xvc2VzIGl0CisgICAgdXBvbiBleGl0LiBUaGUgdmFyaWFibGUgaXMgYm91bmQgdG8gYSBjbGllbnQgcHJveHkgc3RyZWFtL3Byb3RvY29sIGluc3RhbmNlLCB3aGljaCB3cmFwcyB0aGUKKyAgICBiYXNlIGkvbyBzdHJlYW0gLSBzb2NrZXQsIGZpbGUsIGV0Yywgd2l0aCBhbiBvcGVyYXRvcnMgd2hpY2ggaW1wbGVtZW50IHRoZSBUaHJpZnQgcHJvdG9jb2wKKyAgICBhbmQgdHJhbnNwb3J0IG1lY2hhbmlzbXMuCisKKyBUaGUgc2VydmVyIGludGVyZmFjZSBjb21iaW5lcyBzZXJ2ZXIgYW5kIHNlcnZpY2Ugb2JqZWN0cworCisgICogYHNlcnZlIChsb2NhdGlvbiBzZXJ2aWNlKWAgOiBhY2NlcHRzIGNvbm5lY3Rpb25zIG9uIHRoZSBkZXNpZ25hdGVkIHBvcnQgYW5kIHJlc3BvbmRzIHRvCisgICAgcmVxdWVzdHMgb2YgdGhlIHNlcnZpY2UncyBvcGVyYXRpb25zLgorCisKK0J1aWxkaW5nIAorLS0tLS0tLS0KKworVGhlIFRocmlmdCBDb21tb24gTGlzcCBsaWJyYXJ5IGlzIHBhY2thZ2VkIGFzIHRoZSBBU0RGW1sxXV0gc3lzdGVtIGB0aHJpZnRgLgorSXQgZGVwZW5kcyBvbiB0aGUgc3lzdGVtcworCisqIHB1cmlbWzJdXSA6IGZvciB0aGUgdGhyaWZ0IHVyaSBjbGFzcworKiBjbG9zZXItbW9wW1szXV0gOiBmb3IgY2xhc3MgbWV0YWRhdGEKKyogdHJpdmlhbC11dGYtOFtbNF1dIDogZm9yIHN0cmluZyBjb2RlY3MKKyogdXNvY2tldFtbNV1dIDogZm9yIHRoZSBzb2NrZXQgdHJhbnNwb3J0CisqIGllZWUtZmxvYXRzW1s2XV0gOiBmb3IgY29udmVyc2lvbiBiZXR3ZWVuIGludHMgYW5kIGZsb2F0cworKiB0cml2aWFsLWdyYXktc3RyZWFtc1tbN11dIDogYW4gYWJzdHJhY3Rpb24gbGF5ZXIgZm9yIGdyYXkgc3RyZWFtcworKiBhbGV4YW5kcmlhW1s4XV0gOiBoYW5keSB1dGlsaXRpZXMKKworVGhlIGRlcGVuZGVuY2llcyBhcmUgYnVuZGxlZCBmb3IgbG9jYWwgYnVpbGRzIG9mIHRlc3RzIGFuZCB0dXRvcmlhbCBiaW5hcmllcyAtIAoraXQgaXMgcG9zc2libGUgdG8gdXNlIHRob3NlIGJ1bmRsZXMgdG8gbG9hZCB0aGUgbGlicmFyeSwgdG9vLgorCitJbiBvcmRlciB0byBidWlsZCBpdCwgcmVnaXN0ZXIgdGhvc2Ugc3lzdGVtcyB3aXRoIEFTREYgYW5kIGV2YWx1YXRlOgorCisgICAgKGFzZGY6bG9hZC1zeXN0ZW0gOnRocmlmdCkKKworVGhpcyB3aWxsIGNvbXBpbGUgYW5kIGxvYWQgdGhlIExpc3AgY29tcGlsZXIgZm9yIFRocmlmdCBkZWZpbml0aW9uIGZpbGVzLCB0aGUKK3RyYW5zcG9ydCBhbmQgcHJvdG9jb2wgaW1wbGVtZW50YXRpb25zLCBhbmQgdGhlIGNsaWVudCBhbmQgc2VydmVyIGludGVyZmFjZQorZnVuY3Rpb25zLiBJbiBvcmRlciB0byB1c2UgVGhyaWZ0IGluIGFuIGFwcGxpY2F0aW9uLCBvbmUgbXVzdCBhbHNvIGF1dGhvciBhbmQvb3IKK2xvYWQgdGhlIGludGVyZmFjZSBkZWZpbml0aW9ucyBmb3IgdGhlIHJlbW90ZSBzZXJ2aWNlLltbOV1dIElmIG9uZSBpcyBpbXBsZW1lbnRpbmcgYSBzZXJ2aWNlLAorb25lIG11c3QgYWxzbyBkZWZpbmUgdGhlIGFjdHVhbCBmdW5jdGlvbnMgdG8gd2hpY2ggVGhyaWZ0IGlzIHRvIGFjdCBhcyB0aGUgcHJveHkKK2ludGVyZmFjZS4gVGhlIHJlbWFpbmRlciBvZiB0aGlzIGRvY3VtZW50IGZvbGxvd3MgdGhlIFRocmlmdCB0dXRvcmlhbCB0byBpbGx1c3RyYXRlIGhvdwordG8gcGVyZm9ybSB0aGUgc3RlcHMKKworICAqIGltcGxlbWVudCB0aGUgc2VydmljZQorICAqIHRyYW5zbGF0ZSB0aGUgVGhyaWZ0IElETAorICAqIGxvYWQgdGhlIExpc3Agc2VydmljZSBpbnRlcmZhY2VzCisgICogcnVuIGEgc2VydmVyIGZvciB0aGUgc2VydmljZQorICAqIHVzZSBhIGNsaWVudCB0byBhY2Nlc3MgdGhlIHNlcnZpY2UgcmVtb3RlbHkKKworTm90ZSB0aGF0LCBpZiBvbmUgaXMgdG8gaW1wbGVtZW50IGEgbmV3IHNlcnZpY2UsIG9uZSB3aWxsIGFsc28gbmVlZCB0byBhdXRob3IgdGhlCitJREwgZmlsZXMsIGFzIHRoZXJlIGlzIG5vIGZhY2lsaXR5IHRvIGdlbmVyYXRlIHRoZW0gZnJvbSBhIHNlcnZpY2UgaW1wbGVtZW50YXRpb24uCisKKworSW1wbGVtZW50IHRoZSBTZXJ2aWNlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIHR1dG9yaWFsIGNvbXByaXNlcyBzZXJ2ZXJhbCBmdW5jdGlvbnM6IGBhZGRgLCBgcGluZ2AsIGB6aXBgLCBhbmQgYGNhbGN1bGF0ZWAuCitFYWNoIHRyYW5zbGF0ZWQgSURMIGZpbGUgZ2VuZXJhdGVzIHRocmVlIHBhY2thZ2VzIGZvciBldmVyeSBzZXJ2aWNlLiBJbiB0aGUgY2FzZSBvZgordGhlIHR1dG9yaWFsIGZpbGUsIHRoZSByZWxldmFudCBwYWNrYWdlcyBhcmU6CisKKyAgKiB0dXRvcmlhbC5jYWxjdWxhdG9yCisgICogdHV0b3JpYWwuY2FsY3VsYXRvci1pbXBsZW1lbnRhdGlvbgorICAqIHR1dG9yaWFsLmNhbGN1bGF0b3ItcmVzcG9uc2UKKyAgCitUaGlzIGlzIHRvIHNlcGFyYXRlIHRoZSByZXF1ZXN0IChnZW5lcmF0ZWQpLCByZXNwb25zZSAoZ2VuZXJhdGVkKSBhbmQgaW1wbGVtZW50YXRpb24KKyhtZWFudCB0byBiZSBpbXBsZW1lbnRlZCBieSB0aGUgcHJvZ3JhbW1lcikgZnVuY3Rpb25zIGZvciBkZWZpbmVkIFRocmlmdCBtZXRob2RzLgorCitJdCBpcyBzdWdnZXN0ZWQgdG8gd29yayBpbiB0aGUgYHR1dG9yaWFsLWltcGxlbWVudGF0aW9uYCBwYWNrYWdlIHdoaWxlIGltcGxlbWVudGluZwordGhlIHNlcnZpY2VzIC0gaXQgaW1wb3J0cyB0aGUgYGNvbW1vbi1saXNwYCBwYWNrYWdlLCB3aGlsZSB0aGUgc2VydmljZS1zcGVjaWZpYyBvbmVzCitkb24ndCAodG8gYXZvaWQgY29uZmxpY3RzIGJldHdlZW4gVGhyaWZ0IG1ldGhvZCBuYW1lcyBhbmQgZnVuY3Rpb24gbmFtZXMgaW4gYGNvbW1vbi1saXNwYCkuCisKKyAgICA7OyBkZWZpbmUgdGhlIGJhc2Ugb3BlcmF0aW9ucworICAgIAorICAgIChpbi1wYWNrYWdlIDp0dXRvcmlhbC1pbXBsZW1lbnRhdGlvbikKKyAgICAKKyAgICAoZGVmdW4gdHV0b3JpYWwuY2FsY3VsYXRvci1pbXBsZW1lbnRhdGlvbjphZGQgKG51bTEgbnVtMikKKyAgICAgIChmb3JtYXQgdCAifiZBc2tlZCB0byBhZGQgfkEgYW5kIH5BLiIgbnVtMSBudW0yKQorICAgICAgKCsgbnVtMSBudW0yKSkKKyAgICAKKyAgICAoZGVmdW4gdHV0b3JpYWwuY2FsY3VsYXRvci1pbXBsZW1lbnRhdGlvbjpwaW5nICgpCisgICAgICAocHJpbnQgOnBpbmcpKQorICAgIAorICAgIChkZWZ1biB0dXRvcmlhbC5jYWxjdWxhdG9yLWltcGxlbWVudGF0aW9uOnppcCAoKQorICAgICAgKHByaW50IDp6aXApKQorICAgIAorICAgIChkZWZ1biB0dXRvcmlhbC5jYWxjdWxhdG9yLWltcGxlbWVudGF0aW9uOmNhbGN1bGF0ZSAobG9naWQgdGFzaykKKyAgICAgIChjYWxjdWxhdGUtb3AgKHdvcmstb3AgdGFzaykgKHdvcmstbnVtMSB0YXNrKSAod29yay1udW0yIHRhc2spKSkKKyAgICAKKyAgICAoZGVmZ2VuZXJpYyBjYWxjdWxhdGUtb3AgKG9wIGFyZzEgYXJnMikKKyAgICAgICg6bWV0aG9kIDphcm91bmQgKG9wIGFyZzEgYXJnMikKKyAgICAgICAgKGxldCAoKHJlc3VsdCAoY2FsbC1uZXh0LW1ldGhvZCkpKQorICAgICAgICAgIChmb3JtYXQgdCAifiZBc2tlZCB0byBjYWxjdWxhdGU6IH5kIG9uICB+QSBhbmQgfkEgPSB+ZC4iIG9wIGFyZzEgYXJnMiByZXN1bHQpCisgICAgICAgICAgcmVzdWx0KSkKKyAgICAKKyAgICAgICg6bWV0aG9kICgob3AgKGVxbCBvcGVyYXRpb24uYWRkKSkgYXJnMSBhcmcyKQorICAgICAgICAoKyBhcmcxIGFyZzIpKQorICAgICAgKDptZXRob2QgKChvcCAoZXFsIG9wZXJhdGlvbi5zdWJ0cmFjdCkpIGFyZzEgYXJnMikKKyAgICAgICAgKC0gYXJnMSBhcmcyKSkKKyAgICAgICg6bWV0aG9kICgob3AgKGVxbCBvcGVyYXRpb24ubXVsdGlwbHkpKSBhcmcxIGFyZzIpCisgICAgICAgICgqIGFyZzEgYXJnMikpCisgICAgICAoOm1ldGhvZCAoKG9wIChlcWwgb3BlcmF0aW9uLmRpdmlkZSkpIGFyZzEgYXJnMikKKyAgICAgICAgKC8gYXJnMSBhcmcyKSkpCisgICAgCisgICAgKGRlZnVuIHppcCAoKSAocHJpbnQgJ3ppcCkpCisKKworVHJhbnNsYXRlIHRoZSBUaHJpZnQgSURMCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSURMIGZpbGVzIGVtcGxveSB0aGUgZmlsZSBleHRlbnNpb24gYHRocmlmdGAuIEluIHRoaXMgY2FzZSwgdGhlcmUgYXJlIHR3byBmaWxlcyB0byB0cmFuc2xhdGUKKyAgKiBgdHV0b3JpYWwudGhyaWZ0YAorICAqIGBzaGFyZWQudGhyaWZ0YAorQXMgdGhlIGZvcm1lciBpbmNsdWRlcyB0aGUgbGF0dGVyLCBvbmUgdXNlcyBpdCB0byBnZW5lcmF0ZSB0aGUgaW50ZXJmYWNlczoKKworICAgICRUSFJJRlQvYmluL3RocmlmdCAtciAtLWdlbiBjbCAkVEhSSUZUL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdAorICAgIAorYC1yYCBzdGFuZHMgZm9yIHJlY3Vyc2lvbiwgd2hpbGUgYC0tZ2VuYCBsZXRzIG9uZSBjaG9vc2UgdGhlIGxhbmd1YWdlIHRvIHRyYW5zbGF0ZSB0by4KKworCitMb2FkIHRoZSBMaXNwIHRyYW5zbGF0ZWQgc2VydmljZSBpbnRlcmZhY2VzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSB0cmFuc2xhdG9yIGdlbmVyYXRlcyB0aHJlZSBmaWxlcyBmb3IgZWFjaCBJREwgZmlsZS4gRm9yIGV4YW1wbGUgYHR1dG9yaWFsLXR5cGVzLmxpc3BgLAorYHR1dG9yaWFsLXZhcnMubGlzcGAgYW5kIGFuIGAuYXNkYCBmaWxlIHRoYXQgY2FuIGJlIHVzZWQgdG8gbG9hZCB0aGVtIGJvdGggYW5kIHB1bGwgaW4KK290aGVyIGluY2x1ZGVzIChsaWtlIGBzaGFyZWRgIHdpdGhpbiB0aGUgdHV0b3JpYWwpIGFzIGRlcGVuZGVuY2llcy4KKworCitSdW4gYSBTZXJ2ZXIgZm9yIHRoZSBTZXJ2aWNlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBhY3R1YWwgc2VydmljZSBuYW1lLCBhcyBzcGVjaWZpZWQgaW4gdGhlIGBkZWYtc2VydmljZWAgZm9ybSBpbiBgdHV0b3JpYWwubGlzcGAsIGlzIGBjYWxjdWxhdG9yYC4gCitFYWNoIHNlcnZpY2UgZGVmaW5pdGlvbiBkZWZpbmVzIGEgZ2xvYmFsIHZhcmlhYmxlIHdpdGggdGhlIHNlcnZpY2UgbmFtZSBhbmQgYmluZHMgaXQgdG8gYQorc2VydmljZSBpbnN0YW5jZSB3aGNoIGRlc2NyaWJlcyB0aGUgb3BlcmF0aW9ucy4KKworSW4gb3JkZXIgdG8gc3RhcnQgYSBzZXJ2aWNlLCBzcGVjaWZ5IGEgbG9jYXRpb24gYW5kIHRoZSBzZXJ2aWNlIGluc3RhbmNlLiAKKworICAgIChpbi1wYWNrYWdlIDp0dXRvcmlhbCkKKyAgICAoc2VydmUgI3UidGhyaWZ0Oi8vMTI3LjAuMC4xOjkwOTEiIGNhbGN1bGF0b3IpCisKKworVXNlIGEgQ2xpZW50IHRvIEFjY2VzcyB0aGUgU2VydmljZSBSZW1vdGVseQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK1tpbiBzb21lIG90aGVyIHByb2Nlc3NdIHJ1biB0aGUgY2xpZW50CisKKyAgICAoaW4tcGFja2FnZSA6Y2wtdXNlcikKKworICAgIChtYWNyb2xldCAoKHNob3cgKGZvcm0pCisgICAgICAgICAgICAgICAgIGAoZm9ybWF0ICp0cmFjZS1vdXRwdXQqICJ+JX5zID0+fnsgfnN+fSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJyxmb3JtCisgICAgICAgICAgICAgICAgICAgICAgICAgIChtdWx0aXBsZS12YWx1ZS1saXN0IChpZ25vcmUtZXJyb3JzICxmb3JtKSkpKSkKKyAgICAgICh3aXRoLWNsaWVudCAocHJvdG9jb2wgI3UidGhyaWZ0Oi8vMTI3LjAuMC4xOjkwOTEiKQorICAgICAgICAoc2hvdyAodHV0b3JpYWwuY2FsY3VsYXRvcjpwaW5nIHByb3RvY29sKSkKKyAgICAgICAgKHNob3cgKHR1dG9yaWFsLmNhbGN1bGF0b3I6YWRkIHByb3RvY29sIDEgMikpCisgICAgICAgIChzaG93ICh0dXRvcmlhbC5jYWxjdWxhdG9yOmFkZCBwcm90b2NvbCAxIDQpKQorICAgIAorICAgICAgICAobGV0ICgodGFzayAobWFrZS1pbnN0YW5jZSAndHV0b3JpYWw6d29yaworICAgICAgICAgICAgICAgICAgICAgIDpvcCBvcGVyYXRpb24uc3VidHJhY3QgOm51bTEgMTUgOm51bTIgMTApKSkKKyAgICAgICAgICAoc2hvdyAodHV0b3JpYWwuY2FsY3VsYXRvcjpjYWxjdWxhdGUgcHJvdG9jb2wgMSB0YXNrKSkKKyAgICAgICAgCisgICAgICAgICAgKHNldGYgKHR1dG9yaWFsOndvcmstb3AgdGFzaykgb3BlcmF0aW9uLmRpdmlkZQorICAgICAgICAgICAgICAgICh0dXRvcmlhbDp3b3JrLW51bTEgdGFzaykgMQorICAgICAgICAgICAgICAgICh0dXRvcmlhbDp3b3JrLW51bTIgdGFzaykgMCkKKyAgICAgICAgICAoc2hvdyAodHV0b3JpYWwuY2FsY3VsYXRvcjpjYWxjdWxhdGUgcHJvdG9jb2wgMSB0YXNrKSkpCisgICAgICAgIAorICAgICAgICAoc2hvdyAoc2hhcmVkLnNoYXJlZC1zZXJ2aWNlOmdldC1zdHJ1Y3QgcHJvdG9jb2wgMSkpCisgICAgCisgICAgICAgIChzaG93ICh6aXAgcHJvdG9jb2wpKSkpCisKK0lzc3VlcworLS0tLS0tCisKKyMjIyBvcHRpb25hbCBmaWVsZHMgCisgV2hlcmUgdGhlIElETCBkZWNsYXJlcyBhIGZpZWxkIG9wdGlvbnMsIHRoZSBkZWYtc3RydWN0IGZvcm0gaW5jbHVkZXMgbm8KKyBpbml0Zm9ybSBmb3IgdGhlIHNsb3QgYW5kIHRoZSBlbmNvZGluZyBvcGVyYXRvciBza2lwcyBhbiB1bmJvdW5kIHNsb3QuIFRoaXMgbGVhdmUgc29tZSBhbWJpZ3VpdHkKKyB3aXRoIGJvb2wgZmllbGRzLgorCisjIyMgaW5zdGFudGlhdGlvbiBwcm90b2NvbCA6Cisgc3RydWN0IGNsYXNzZXMgYXJlIHN0YW5kYXJkIGNsYXNzZXMgYW5kIGV4Y2VwdGlvbiBjbGFzc2VzIGFyZQorIHdoYXRldmVyIHRoZSBpbXBsZW1lbnRhdGlvbiBwcmVzY3JpYmVzLiBkZWNvZGVycyBhcHBseSBtYWtlLXN0cnVjdCB0byBhbiBpbml0YXJncyBsaXN0LgorIHBhcnRpY3VsYXJseSBhdCB0aGUgc2VydmljZSBlbmQsIHRoZXJlIGFyZSBhZHZhbnRhZ2VzIHRvIHJlc291cmNpbmcgc3RydWN0cyBhbmQgZGVjb2RpbmcKKyB3aXRoIGRpcmVjdCBzaWRlLWVmZmVjdHMgb24gc2xvdC12YWx1ZXMKKworIyMjIG1hcHM6CisgTWFwcyBhcmUgbm93IHJlcHJlc2VudGVkIGFzIGhhc2ggdGFibGVzLiBBcyBkYXRhIHRocm91Z2ggdGhlIGNhbGwvcmVwbHkgaW50ZXJmYWNlIGlzIGFsbCBzdGF0aWNhbGx5CisgdHlwZWQsIGl0IGlzIG5vdCBuZWNlc3NhcnkgZm9yIHRoZSBvYmplY3RzIHRvIHRoZW1zZWx2ZXMgaW5kaWNhdGUgdGhlIGNvZGluZyBmb3JtLiBBc3NvY2lhdGlvbiBsaXN0cworIHdvdWxkIGJlIHN1ZmZpY2llbnQuIEFzIHRoZSBrZXkgdHlwZSBpcyBhcmJpdHJhcnksIHByb3BlcnR5IGxpc3RzIG9mZmVyIG5vIGFkZGl0aW9uYWwgY29udmVuaWVuY2U6CisgYXMgYGdldGZgIG9wZXJhdGVzIHdpdGggYGVxYCBhIG5ldyBhY2Nlc3MgaW50ZXJmYWNlIHdvdWxkIGJlIG5lY2Vzc2FyeSBhbmQgdGhleSB3b3VsZCBub3QgYmUKKyBhdmFpbGFibGUgZm9yIGZ1bmN0aW9uIGFwcGxpY2F0aW9uLgorCisKKyBbMV06IHd3dy5jb21tb24tbGlzcC5uZXQvYXNkZgorIFsyXTogaHR0cDovL2dpdGh1Yi5jb20vbGlzcC9jb20uYjkucHVyaS5wcGNyZQorIFszXTogd3d3LmNvbW1vbi1saXNwLm5ldC9jbG9zZXItbW9wCisgWzRdOiB0cml2aWFsLXV0Zi04CisgWzVdOiBodHRwczovL2dpdGh1Yi5jb20vdXNvY2tldC91c29ja2V0CisgWzZdOiBodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9pZWVlLWZsb2F0cworIFs3XTogaHR0cHM6Ly9naXRodWIuY29tL3RyaXZpYWwtZ3JheS1zdHJlYW1zL3RyaXZpYWwtZ3JheS1zdHJlYW1zCisgWzhdOiBodHRwczovL2dpdGxhYi5jb21tb24tbGlzcC5uZXQvYWxleGFuZHJpYS9hbGV4YW5kcmlhCisgWzldOiBodHRwOi8vd2lraS5hcGFjaGUub3JnL3RocmlmdC9UaHJpZnRHZW5lcmF0aW9uCisKKyogdXNvY2tldFtbNV1dIDogZm9yIHRoZSBzb2NrZXQgdHJhbnNwb3J0CisqIGllZWUtZmxvYXRzW1s2XV0gOiBmb3IgY29udmVyc2lvbiBiZXR3ZWVuIGludHMgYW5kIGZsb2F0cworKiB0cml2aWFsLWdyYXktc3RyZWFtc1tbN11dIDogYW4gYWJzdHJhY3Rpb24gbGF5ZXIgZm9yIGdyYXkgc3RyZWFtcworKiBhbGV4YW5kcmlhW1s4XV0gOiBoYW5keSB1dGlsaXRpZXMKZGlmZiAtLWdpdCBhL2xpYi9jbC9SRUFETUVTL3JlYWRtZS1jYXNzYW5kcmEubGlzcCBiL2xpYi9jbC9SRUFETUVTL3JlYWRtZS1jYXNzYW5kcmEubGlzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Mjc0NGVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NsL1JFQURNRVMvcmVhZG1lLWNhc3NhbmRyYS5saXNwCkBAIC0wLDAgKzEsNjQgQEAKKyhpbi1wYWNrYWdlIDpjbC11c2VyKQorCisjKyhvciBjY2wgc2JjbCkgL2RldmVsb3BtZW50L3NvdXJjZS9saWJyYXJ5LworKGxvYWQgImJ1aWxkLWluaXQubGlzcCIpCisKKzs7OyAhIGZpcnN0LCBzZWxlY3QgdGhlIGFwaSB2ZXJzaW9uIGluIHRoZSBjYXNzYW5kcmEgc3lzdGVtIGRlZmluaXRpb24KKzs7OyBhcyBvbmx5IG9uZSBzaG91bGQgYmUgbG9hZGVkIGF0IGEgdGltZS4KKyhhc2RmOmxvYWQtc3lzdGVtIDpkZS5zZXRmLmNhc3NhbmRyYSkKKworKGluLXBhY2thZ2UgOmRlLnNldGYuY2Fzc2FuZHJhKQorCisoZGVmcGFyYW1ldGVyICpjLWxvY2F0aW9uKgorICA7OyByZW1vdGUKKyAgOzsgI3UidGhyaWZ0Oi8vZWMyLTE3NC0xMjktNjYtMTQ4LmNvbXB1dGUtMS5hbWF6b25hd3MuY29tOjkxNjAiCisgIDs7IGxvY2FsCisgICN1InRocmlmdDovLzEyNy4wLjAuMTo5MTYwIgorICAiQSBjYXNzYW5kcmEgc2VydmljZSBsb2NhdGlvbiAtIGVpdGhlciB0aGUgbG9jYWwgb25lIG9yIGEgcmVtb3RlIHNlcnZpY2UgCisgLSBhbHdheXMgYSAndGhyaWZ0JyB1cmkuIikKKworKGRlZnBhcmFtZXRlciAqYyogKHRocmlmdDpjbGllbnQgKmMtbG9jYXRpb24qKSkKKworCisoY2Fzc2FuZHJhOmRlc2NyaWJlLWtleXNwYWNlcyAqYyopCis7OyA9PiAoIktleXNwYWNlMSIgInN5c3RlbSIpCisKKyhjYXNzYW5kcmE6ZGVzY3JpYmUtY2x1c3Rlci1uYW1lICpjKikKKzs7ID0+IlRlc3QgQ2x1c3RlciIKKworKGNhc3NhbmRyYTpkZXNjcmliZS12ZXJzaW9uICpjKikKKzs7ID0+ICIyLjEuMCIKKworKGxvb3AgZm9yIHNwYWNlIGluIChjYXNzYW5kcmE6ZGVzY3JpYmUta2V5c3BhY2VzICpjKikKKyAgICAgIGNvbGxlY3QgKGxvb3AgZm9yIGtleSBiZWluZyBlYWNoIGhhc2gta2V5IG9mIChjYXNzYW5kcmE6ZGVzY3JpYmUta2V5c3BhY2UgKmMqIHNwYWNlKQorICAgICAgICAgICAgICAgICAgICB1c2luZyAoaGFzaC12YWx1ZSB2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgY29sbGVjdCAoY29ucyBrZXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9vcCBmb3Iga2V5IGJlaW5nIGVhY2ggaGFzaC1rZXkgb2YgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyAoaGFzaC12YWx1ZSB2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0IChjb25zIGtleSB2YWx1ZSkpKSkpCisKKworKGNsb3NlICpjKikKKworKGRlZnVuIGRlc2NyaWJlLWNhc3NhbmRyYSAobG9jYXRpb24gJm9wdGlvbmFsIChzdHJlYW0gKnN0YW5kYXJkLW91dHB1dCopKQorICAiUHJpbnQgdGhlIGZpcnN0LW9yZGVyIHN0b3JlIG1ldGFkYXRhIGZvciBhIGNhc3NhbmRyYSBMT0NBVElPTi4iCisKKyAgKHRocmlmdDp3aXRoLWNsaWVudCAoY2Fzc2FuZHJhIGxvY2F0aW9uKQorICAgIChsZXQqICgoa2V5c3BhY2UtbmFtZXMgKGNhc3NhbmRyYTpkZXNjcmliZS1rZXlzcGFjZXMgY2Fzc2FuZHJhKSkKKyAgICAgICAgICAgKGNsdXN0ZXIgKGNhc3NhbmRyYTpkZXNjcmliZS1jbHVzdGVyLW5hbWUgY2Fzc2FuZHJhKSkKKyAgICAgICAgICAgKHZlcnNpb24gKGNhc3NhbmRyYTpkZXNjcmliZS12ZXJzaW9uIGNhc3NhbmRyYSkpCisgICAgICAgICAgIChrZXlzcGFjZS1kZXNjcmlwdGlvbnMgKGxvb3AgZm9yIHNwYWNlIGluIGtleXNwYWNlLW5hbWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdCAoY29ucyBzcGFjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvb3AgZm9yIGtleSBiZWluZyBlYWNoIGhhc2gta2V5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiAoY2Fzc2FuZHJhOmRlc2NyaWJlLWtleXNwYWNlIGNhc3NhbmRyYSBzcGFjZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIChoYXNoLXZhbHVlIHZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdCAoY29ucyBrZXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvb3AgZm9yIGtleSBiZWluZyBlYWNoIGhhc2gta2V5IG9mIHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIChoYXNoLXZhbHVlIHZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0IChjb25zIGtleSB2YWx1ZSkpKSkpKSkpCisgICAgICAoZm9ybWF0IHN0cmVhbSAifiZjb25uZWN0aW9uIHRvIDogfmEiIGNhc3NhbmRyYSkKKyAgICAgIChmb3JtYXQgc3RyZWFtICJ+JnZlcnNpb24gOiB+YSIgdmVyc2lvbikKKyAgICAgIChmb3JtYXQgc3RyZWFtICJ+JmNsdXN0ZXIgOiB+YSIgY2x1c3RlcikKKyAgICAgIChmb3JtYXQgc3RyZWFtICJ+JmtleXNwYWNlc357fnt+JX4lc3BhY2U6IH5hfkB7fiUgIH57fmEgOn5Ae34yMHR+Ond+Xn4lfn1+fX59fn1+fSIga2V5c3BhY2UtZGVzY3JpcHRpb25zKSkpKQorCis7OzsgKGRlc2NyaWJlLWNhc3NhbmRyYSAqYy1sb2NhdGlvbiopCmRpZmYgLS1naXQgYS9saWIvY2wvZW5zdXJlLWV4dGVybmFscy5zaCBiL2xpYi9jbC9lbnN1cmUtZXh0ZXJuYWxzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA0OTVmMDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY2wvZW5zdXJlLWV4dGVybmFscy5zaApAQCAtMCwwICsxLDE2IEBACisjIS9iaW4vYmFzaAorCitzZXQgLWUKKworaWYgW1sgISAtZSBxdWlja2xpc3AubGlzcCBdXTsgdGhlbiBjdXJsIC1PIGh0dHBzOi8vYmV0YS5xdWlja2xpc3Aub3JnL3F1aWNrbGlzcC5saXNwOyBmaQorc2JjbCAtLWxvYWQgcXVpY2tsaXNwLmxpc3AgXAorICAgICAtLWV2YWwgIihpZ25vcmUtZXJyb3JzIChxdWlja2xpc3AtcXVpY2tzdGFydDppbnN0YWxsIDpwYXRoIFwicXVpY2tsaXNwL1wiKSkiIFwKKyAgICAgLS1ldmFsICIobG9hZCBcInF1aWNrbGlzcC9zZXR1cC5saXNwXCIpIiBcCisgICAgIC0tZXZhbCAiKHF1aWNrbGlzcDpidW5kbGUtc3lzdGVtcyAnKCM6cHVyaSAjOnVzb2NrZXQgIzpjbG9zZXItbW9wICM6dHJpdmlhbC11dGYtOCAjOmllZWUtZmxvYXRzICM6dHJpdmlhbC1ncmF5LXN0cmVhbXMgIzphbGV4YW5kcmlhICM6Ym9yZGVhdXgtdGhyZWFkcyAjOmNsLXBwY3JlICM6Zmlhc2NvICM6bmV0LmRpZGllcnZlcm5hLmNsb24pIDp0byBcImV4dGVybmFscy9cIikiIFwKKyAgICAgLS1ldmFsICIocXVpdCkiIFwKKyAgICAgLS1uby11c2VyaW5pdAoraWYgW1sgISAtZSBiYWNrcG9ydC11cGRhdGUuemlwIF1dOyB0aGVuCisgICAgY3VybCAtTyAtTCBodHRwczovL2dpdGh1Yi5jb20vVHVydGxlV2FyZVBML2RlLnNldGYudGhyaWZ0L2FyY2hpdmUvYmFja3BvcnQtdXBkYXRlLnppcDsKK2ZpCitta2RpciAtcCBsaWIKK3VuemlwIC11IGJhY2twb3J0LXVwZGF0ZS56aXAgLWQgbGliCmRpZmYgLS1naXQgYS9saWIvY2wvbG9hZC1sb2NhbGx5Lmxpc3AgYi9saWIvY2wvbG9hZC1sb2NhbGx5Lmxpc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEyYzcwNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jbC9sb2FkLWxvY2FsbHkubGlzcApAQCAtMCwwICsxLDIzIEBACisoaW4tcGFja2FnZSAjOmNsLXVzZXIpCisKKzs7OzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7Ozs7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzs7OzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Ozs7Cis7Ozs7ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzs7OzsKKzs7OzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOzs7OyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOzs7OyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzs7OzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOzs7OyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworOzs7OyBKdXN0IGEgc2NyaXB0IGZvciBsb2FkaW5nIHRoZSBsaWJyYXJ5IGl0c2VsZiwgdXNpbmcgYnVuZGxlZCBkZXBlbmRlbmNpZXMuCis7Ozs7IFRoaXMgaXMgaGVyZSBmb3Igd2hlbiB3ZSB3YW50IHRvIGJ1aWxkIHRoZSBzZWxmLXRlc3QgYW5kIGNyb3NzLXRlc3QKKzs7OzsgYmluYXJpZXMuCisKKyhyZXF1aXJlICJhc2RmIikKKworKGxvYWQgKG1lcmdlLXBhdGhuYW1lcyAiZXh0ZXJuYWxzL2J1bmRsZS5saXNwIiAqbG9hZC10cnVlbmFtZSopKQorKGFzZGY6bG9hZC1hc2QgKG1lcmdlLXBhdGhuYW1lcyAibGliL2RlLnNldGYudGhyaWZ0LWJhY2twb3J0LXVwZGF0ZS90aHJpZnQuYXNkIiAqbG9hZC10cnVlbmFtZSopKQorKGFzZGY6bG9hZC1zeXN0ZW0gOnRocmlmdCkKZGlmZiAtLWdpdCBhL2xpYi9jbC90ZXN0L21ha2UtdGVzdC1iaW5hcnkubGlzcCBiL2xpYi9jbC90ZXN0L21ha2UtdGVzdC1iaW5hcnkubGlzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTdhNThjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NsL3Rlc3QvbWFrZS10ZXN0LWJpbmFyeS5saXNwCkBAIC0wLDAgKzEsMzEgQEAKKzs7OzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7Ozs7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzs7OzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Ozs7Cis7Ozs7ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzs7OzsKKzs7OzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOzs7OyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOzs7OyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzs7OzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOzs7OyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworOzs7OyBUaGlzIGZpbGUgaXMgdXNlZCB0byBidWlsZCB0aGUgYmluYXJ5IHRoYXQgcnVucyBhbGwgc2VsZi10ZXN0cy4gVGhlCis7Ozs7IGJpbmFyeSBpcyB0aGVuIG1lYW50IHRvIGJlIGhvb2tlZCB1cCB0byBUaHJpZnQncyBgbWFrZSBjaGVja2AgZmFjaWxpdHksCis7Ozs7IGJ1dCBjYW4gZWFzaWx5IGJlIHJ1biBvbiBpdHMgb3duIGFzIHdlbGwuCisKKyhpbi1wYWNrYWdlICM6Y2wtdXNlcikKKworKHJlcXVpcmUgImFzZGYiKQorKGxvYWQgKG1lcmdlLXBhdGhuYW1lcyAiLi4vbG9hZC1sb2NhbGx5Lmxpc3AiICpsb2FkLXRydWVuYW1lKikpCisoYXNkZjpsb2FkLWFzZCAobWVyZ2UtcGF0aG5hbWVzICIuLi9saWIvZGUuc2V0Zi50aHJpZnQtYmFja3BvcnQtdXBkYXRlL3Rlc3QvdGhyaWZ0LXRlc3QuYXNkIiAqbG9hZC10cnVlbmFtZSopKQorKGFzZGY6bG9hZC1zeXN0ZW0gOnRocmlmdC10ZXN0KQorKGFzZGY6bG9hZC1zeXN0ZW0gOm5ldC5kaWRpZXJ2ZXJuYS5jbG9uKQorCisobmV0LmRpZGllcnZlcm5hLmNsb246bmlja25hbWUtcGFja2FnZSkKKworKGRlZnVuIG1haW4gKCkKKyAgKGxldCAoKHJlc3VsdCAoaWYgKGZpYXNjbzpydW4tdGVzdHMgJ3RocmlmdC10ZXN0KSAwIC0xKSkpCisgICAgKGNsb246ZXhpdCByZXN1bHQpKSkKKworKGNsb246ZHVtcCAicnVuLXRlc3RzIiBtYWluKQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9UQXBwbGljYXRpb25FcnJvci5oIGIvbGliL2NvY29hL3NyYy9UQXBwbGljYXRpb25FcnJvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3OTg4MWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL1RBcHBsaWNhdGlvbkVycm9yLmgKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW1wb3J0ICJUUHJvdG9jb2wuaCIKKworZXh0ZXJuIE5TU3RyaW5nICpUQXBwbGljYXRpb25FcnJvckRvbWFpbjsKKwordHlwZWRlZiBOU19FTlVNIChpbnQsIFRBcHBsaWNhdGlvbkVycm9yKSB7CisgIFRBcHBsaWNhdGlvbkVycm9yVW5rbm93biAgICAgICAgICAgICAgICA9IDAsCisgIFRBcHBsaWNhdGlvbkVycm9yVW5rbm93bk1ldGhvZCAgICAgICAgICA9IDEsCisgIFRBcHBsaWNhdGlvbkVycm9ySW52YWxpZE1lc3NhZ2VUeXBlICAgICA9IDIsCisgIFRBcHBsaWNhdGlvbkVycm9yV3JvbmdNZXRob2ROYW1lICAgICAgICA9IDMsCisgIFRBcHBsaWNhdGlvbkVycm9yQmFkU2VxdWVuY2VJZCAgICAgICAgICA9IDQsCisgIFRBcHBsaWNhdGlvbkVycm9yTWlzc2luZ1Jlc3VsdCAgICAgICAgICA9IDUsCisgIFRBcHBsaWNhdGlvbkVycm9ySW50ZXJuYWxFcnJvciAgICAgICAgICA9IDYsCisgIFRBcHBsaWNhdGlvbkVycm9yUHJvdG9jb2xFcnJvciAgICAgICAgICA9IDcsCisgIFRBcHBsaWNhdGlvbkVycm9ySW52YWxpZFRyYW5zZm9ybSAgICAgICA9IDgsCisgIFRBcHBsaWNhdGlvbkVycm9ySW52YWxpZFByb3RvY29sICAgICAgICA9IDksCisgIFRBcHBsaWNhdGlvbkVycm9yVW5zdXBwb3J0ZWRDbGllbnRUeXBlICA9IDEwLAorfTsKKworCitleHRlcm4gTlNTdHJpbmcgKlRBcHBsaWNhdGlvbkVycm9yTmFtZUtleTsKK2V4dGVybiBOU1N0cmluZyAqVEFwcGxpY2F0aW9uRXJyb3JSZWFzb25LZXk7CitleHRlcm4gTlNTdHJpbmcgKlRBcHBsaWNhdGlvbkVycm9yTWV0aG9kS2V5OworCisKK0BpbnRlcmZhY2UgTlNFcnJvciAoVEFwcGxpY2F0aW9uRXJyb3IpCisKK0Bwcm9wZXJ0eSAocmVhZG9ubHksIGNvcHkpIE5TU3RyaW5nICpuYW1lOworQHByb3BlcnR5IChyZWFkb25seSwgY29weSkgTlNTdHJpbmcgKnJlYXNvbjsKKworKyhpbnN0YW5jZXR5cGUpIGVycm9yV2l0aFR5cGU6KFRBcHBsaWNhdGlvbkVycm9yKXR5cGUgcmVhc29uOihOU1N0cmluZyAqKXJlYXNvbjsKKworKyhpbnN0YW5jZXR5cGUpIHJlYWQ6KGlkPFRQcm90b2NvbD4pcHJvdG9jb2w7CisKKy0oQk9PTCkgd3JpdGU6KGlkPFRQcm90b2NvbD4pb3V0UHJvdG9jb2wgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOworCitAZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL1RBcHBsaWNhdGlvbkVycm9yLm0gYi9saWIvY29jb2Evc3JjL1RBcHBsaWNhdGlvbkVycm9yLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgwYmMwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvVEFwcGxpY2F0aW9uRXJyb3IubQpAQCAtMCwwICsxLDIzMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW1wb3J0ICJUQXBwbGljYXRpb25FcnJvci5oIgorI2ltcG9ydCAiVFByb3RvY29sVXRpbC5oIgorCisKK05TU3RyaW5nICpUQXBwbGljYXRpb25FcnJvckRvbWFpbiA9IEAiVEFwcGxpY2F0aW9uRXJyb3JEb21haW4iOworCisKK05TU3RyaW5nICpUQXBwbGljYXRpb25FcnJvck5hbWVLZXkgPSBAIm5hbWUiOworTlNTdHJpbmcgKlRBcHBsaWNhdGlvbkVycm9yUmVhc29uS2V5ID0gQCJyZWFzb24iOworTlNTdHJpbmcgKlRBcHBsaWNhdGlvbkVycm9yTWV0aG9kS2V5ID0gQCJtZXRob2QiOworCisKK0BpbXBsZW1lbnRhdGlvbiBOU0Vycm9yIChUQXBwbGljYXRpb25FcnJvcikKKworLShOU1N0cmluZyAqKSByZWFzb24KK3sKKyAgcmV0dXJuIHNlbGYudXNlckluZm9bVEFwcGxpY2F0aW9uRXJyb3JSZWFzb25LZXldOworfQorCistKE5TU3RyaW5nICopIG5hbWUKK3sKKyAgcmV0dXJuIHNlbGYudXNlckluZm9bVEFwcGxpY2F0aW9uRXJyb3JOYW1lS2V5XTsKK30KKworKyhpbnN0YW5jZXR5cGUpIGVycm9yV2l0aFR5cGU6KFRBcHBsaWNhdGlvbkVycm9yKXR5cGUgcmVhc29uOihOU1N0cmluZyAqKXJlYXNvbgoreworICBOU1N0cmluZyAqbmFtZTsKKyAgc3dpdGNoICh0eXBlKSB7CisgIGNhc2UgVEFwcGxpY2F0aW9uRXJyb3JVbmtub3duTWV0aG9kOgorICAgIG5hbWUgPSBAIlVua25vd24gTWV0aG9kIjsKKyAgICBicmVhazsKKworICBjYXNlIFRBcHBsaWNhdGlvbkVycm9ySW52YWxpZE1lc3NhZ2VUeXBlOgorICAgIG5hbWUgPSBAIkludmFsaWQgTWVzc2FnZSBUeXBlIjsKKyAgICBicmVhazsKKworICBjYXNlIFRBcHBsaWNhdGlvbkVycm9yV3JvbmdNZXRob2ROYW1lOgorICAgIG5hbWUgPSBAIldyb25nIE1ldGhvZCBOYW1lIjsKKyAgICBicmVhazsKKworICBjYXNlIFRBcHBsaWNhdGlvbkVycm9yQmFkU2VxdWVuY2VJZDoKKyAgICBuYW1lID0gQCJCYWQgU2VxdWVuY2UgSUQiOworICAgIGJyZWFrOworCisgIGNhc2UgVEFwcGxpY2F0aW9uRXJyb3JNaXNzaW5nUmVzdWx0OgorICAgIG5hbWUgPSBAIk1pc3NpbmcgUmVzdWx0IjsKKyAgICBicmVhazsKKworICBjYXNlIFRBcHBsaWNhdGlvbkVycm9ySW50ZXJuYWxFcnJvcjoKKyAgICBuYW1lID0gQCJJbnRlcm5hbCBFcnJvciI7CisgICAgYnJlYWs7CisKKyAgY2FzZSBUQXBwbGljYXRpb25FcnJvclByb3RvY29sRXJyb3I6CisgICAgbmFtZSA9IEAiUHJvdG9jb2wgRXJyb3IiOworICAgIGJyZWFrOworCisgIGNhc2UgVEFwcGxpY2F0aW9uRXJyb3JJbnZhbGlkVHJhbnNmb3JtOgorICAgIG5hbWUgPSBAIkludmFsaWQgVHJhbnNmb3JtIjsKKyAgICBicmVhazsKKworICBjYXNlIFRBcHBsaWNhdGlvbkVycm9ySW52YWxpZFByb3RvY29sOgorICAgIG5hbWUgPSBAIkludmFsaWQgUHJvdG9jb2wiOworICAgIGJyZWFrOworCisgIGNhc2UgVEFwcGxpY2F0aW9uRXJyb3JVbnN1cHBvcnRlZENsaWVudFR5cGU6CisgICAgbmFtZSA9IEAiVW5zdXBwb3J0ZWQgQ2xpZW50IFR5cGUiOworICAgIGJyZWFrOworCisgIGRlZmF1bHQ6CisgICAgbmFtZSA9IEAiVW5rbm93biI7CisgICAgYnJlYWs7CisgIH0KKworICBOU0RpY3Rpb25hcnkgKnVzZXJJbmZvOworICBpZiAocmVhc29uKSB7CisgICAgdXNlckluZm8gPSBAe1RBcHBsaWNhdGlvbkVycm9yTmFtZUtleTpuYW1lLAorICAgICAgICAgICAgICAgICBUQXBwbGljYXRpb25FcnJvclJlYXNvbktleTpyZWFzb259OworICB9CisgIGVsc2UgeworICAgIHVzZXJJbmZvID0gQHtUQXBwbGljYXRpb25FcnJvck5hbWVLZXk6bmFtZX07CisgIH0KKworICByZXR1cm4gW05TRXJyb3IgZXJyb3JXaXRoRG9tYWluOlRBcHBsaWNhdGlvbkVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6dHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOnVzZXJJbmZvXTsKK30KKworCisrKGluc3RhbmNldHlwZSkgcmVhZDooaWQ8VFByb3RvY29sPilwcm90b2NvbAoreworICBOU1N0cmluZyAqcmVhc29uID0gbmlsOworICBTSW50MzIgdHlwZSA9IFRBcHBsaWNhdGlvbkVycm9yVW5rbm93bjsKKyAgU0ludDMyIGZpZWxkVHlwZTsKKyAgU0ludDMyIGZpZWxkSUQ7CisKKyAgTlNFcnJvciAqZXJyb3I7CisgIGlmICghW3Byb3RvY29sIHJlYWRTdHJ1Y3RCZWdpblJldHVybmluZ05hbWU6TlVMTCBlcnJvcjomZXJyb3JdKSB7CisgICAgcmV0dXJuIGVycm9yOworICB9CisKKyAgd2hpbGUgKHRydWUpIHsKKworICAgIGlmICghW3Byb3RvY29sIHJlYWRGaWVsZEJlZ2luUmV0dXJuaW5nTmFtZTpOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiZmaWVsZFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6JmZpZWxkSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6JmVycm9yXSkKKyAgICB7CisgICAgICByZXR1cm4gZXJyb3I7CisgICAgfQorCisgICAgaWYgKGZpZWxkVHlwZSA9PSBUVHlwZVNUT1ApIHsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIHN3aXRjaCAoZmllbGRJRCkgeworICAgIGNhc2UgMToKKyAgICAgIGlmIChmaWVsZFR5cGUgPT0gVFR5cGVTVFJJTkcpIHsKKyAgICAgICAgaWYgKCFbcHJvdG9jb2wgcmVhZFN0cmluZzomcmVhc29uIGVycm9yOiZlcnJvcl0pIHsKKyAgICAgICAgICByZXR1cm4gZXJyb3I7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBpZiAoIVtUUHJvdG9jb2xVdGlsIHNraXBUeXBlOmZpZWxkVHlwZSBvblByb3RvY29sOnByb3RvY29sIGVycm9yOiZlcnJvcl0pIHsKKyAgICAgICAgICByZXR1cm4gZXJyb3I7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSAyOgorICAgICAgaWYgKGZpZWxkVHlwZSA9PSBUVHlwZUkzMikgeworICAgICAgICBpZiAoIVtwcm90b2NvbCByZWFkSTMyOiZ0eXBlIGVycm9yOiZlcnJvcl0pIHsKKyAgICAgICAgICByZXR1cm4gZXJyb3I7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBpZiAoIVtUUHJvdG9jb2xVdGlsIHNraXBUeXBlOmZpZWxkVHlwZSBvblByb3RvY29sOnByb3RvY29sIGVycm9yOiZlcnJvcl0pIHsKKyAgICAgICAgICByZXR1cm4gZXJyb3I7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIGlmICghW1RQcm90b2NvbFV0aWwgc2tpcFR5cGU6ZmllbGRUeXBlIG9uUHJvdG9jb2w6cHJvdG9jb2wgZXJyb3I6JmVycm9yXSkgeworICAgICAgICByZXR1cm4gZXJyb3I7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKCFbcHJvdG9jb2wgcmVhZEZpZWxkRW5kOiZlcnJvcl0pIHsKKyAgICAgIHJldHVybiBlcnJvcjsKKyAgICB9CisKKyAgfQorCisgIGlmICghW3Byb3RvY29sIHJlYWRTdHJ1Y3RFbmQ6JmVycm9yXSkgeworICAgIHJldHVybiBlcnJvcjsKKyAgfQorCisgIHJldHVybiBbTlNFcnJvciBlcnJvcldpdGhUeXBlOnR5cGUgcmVhc29uOnJlYXNvbl07Cit9CisKKworLShCT09MKSB3cml0ZTooaWQ8VFByb3RvY29sPilwcm90b2NvbCBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgaWYgKCFbcHJvdG9jb2wgd3JpdGVTdHJ1Y3RCZWdpbldpdGhOYW1lOkAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIiBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBpZiAoc2VsZi5sb2NhbGl6ZWREZXNjcmlwdGlvbiAhPSBuaWwpIHsKKyAgICBpZiAoIVtwcm90b2NvbCB3cml0ZUZpZWxkQmVnaW5XaXRoTmFtZTpAIm1lc3NhZ2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6VFR5cGVTVFJJTkcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDoxIGVycm9yOmVycm9yXSkKKyAgICB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorCisgICAgaWYgKCFbcHJvdG9jb2wgd3JpdGVTdHJpbmc6c2VsZi5sb2NhbGl6ZWREZXNjcmlwdGlvbiBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisKKyAgICBpZiAoIVtwcm90b2NvbCB3cml0ZUZpZWxkRW5kOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgfQorCisgIGlmICghW3Byb3RvY29sIHdyaXRlRmllbGRCZWdpbldpdGhOYW1lOkAidHlwZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6VFR5cGVJMzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6MgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjplcnJvcl0pCisgIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBpZiAoIVtwcm90b2NvbCB3cml0ZUkzMjooU0ludDMyKXNlbGYuY29kZSBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBpZiAoIVtwcm90b2NvbCB3cml0ZUZpZWxkRW5kOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIGlmICghW3Byb3RvY29sIHdyaXRlRmllbGRTdG9wOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIGlmICghW3Byb3RvY29sIHdyaXRlU3RydWN0RW5kOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIHJldHVybiBZRVM7Cit9CisKK0BlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmggYi9saWIvY29jb2Evc3JjL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjAyN2Q2Li4wMDAwMDAwCi0tLSBhL2xpYi9jb2NvYS9zcmMvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbXBvcnQgIlRFeGNlcHRpb24uaCIKLSNpbXBvcnQgIlRQcm90b2NvbC5oIgotCi1lbnVtIHsKLSAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uX1VOS05PV04gPSAwLAotICBUQXBwbGljYXRpb25FeGNlcHRpb25fVU5LTk9XTl9NRVRIT0QgPSAxLAotICBUQXBwbGljYXRpb25FeGNlcHRpb25fSU5WQUxJRF9NRVNTQUdFX1RZUEUgPSAyLAotICBUQXBwbGljYXRpb25FeGNlcHRpb25fV1JPTkdfTUVUSE9EX05BTUUgPSAzLAotICBUQXBwbGljYXRpb25FeGNlcHRpb25fQkFEX1NFUVVFTkNFX0lEID0gNCwKLSAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uX01JU1NJTkdfUkVTVUxUID0gNSwKLSAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uX0lOVEVSTkFMX0VSUk9SID0gNiwKLSAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uX1BST1RPQ09MX0VSUk9SID0gNywKLSAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uX0lOVkFMSURfVFJBTlNGT1JNID0gOCwKLSAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uX0lOVkFMSURfUFJPVE9DT0wgPSA5LAotICBUQXBwbGljYXRpb25FeGNlcHRpb25fVU5TVVBQT1JURURfQ0xJRU5UX1RZUEUgPSAxMAotfTsKLQotLy8gRklYTUUKLUBpbnRlcmZhY2UgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIDogVEV4Y2VwdGlvbiB7Ci0gIGludCBtVHlwZTsKLX0KLQotKyAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uICopIHJlYWQ6IChpZCA8VFByb3RvY29sPikgcHJvdG9jb2w7Ci0KLS0gKHZvaWQpIHdyaXRlOiAoaWQgPFRQcm90b2NvbD4pIHByb3RvY29sOwotCi0rIChUQXBwbGljYXRpb25FeGNlcHRpb24gKikgZXhjZXB0aW9uV2l0aFR5cGU6IChpbnQpIHR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjogKE5TU3RyaW5nICopIG1lc3NhZ2U7Ci0KLUBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLm0gYi9saWIvY29jb2Evc3JjL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzRkZmM1Li4wMDAwMDAwCi0tLSBhL2xpYi9jb2NvYS9zcmMvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLm0KKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW1wb3J0ICJUQXBwbGljYXRpb25FeGNlcHRpb24uaCIKLSNpbXBvcnQgIlRQcm90b2NvbFV0aWwuaCIKLSNpbXBvcnQgIlRPYmplY3RpdmUtQy5oIgotCi1AaW1wbGVtZW50YXRpb24gVEFwcGxpY2F0aW9uRXhjZXB0aW9uCi0KLS0gKGlkKSBpbml0V2l0aFR5cGU6IChpbnQpIHR5cGUKLSAgICAgICAgICAgICByZWFzb246IChOU1N0cmluZyAqKSByZWFzb24KLXsKLSAgbVR5cGUgPSB0eXBlOwotCi0gIE5TU3RyaW5nICogbmFtZTsKLSAgc3dpdGNoICh0eXBlKSB7Ci0gIGNhc2UgVEFwcGxpY2F0aW9uRXhjZXB0aW9uX1VOS05PV05fTUVUSE9EOgotICAgIG5hbWUgPSBAIlVua25vd24gbWV0aG9kIjsKLSAgICBicmVhazsKLSAgY2FzZSBUQXBwbGljYXRpb25FeGNlcHRpb25fSU5WQUxJRF9NRVNTQUdFX1RZUEU6Ci0gICAgbmFtZSA9IEAiSW52YWxpZCBtZXNzYWdlIHR5cGUiOwotICAgIGJyZWFrOwotICBjYXNlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9XUk9OR19NRVRIT0RfTkFNRToKLSAgICBuYW1lID0gQCJXcm9uZyBtZXRob2QgbmFtZSI7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgVEFwcGxpY2F0aW9uRXhjZXB0aW9uX0JBRF9TRVFVRU5DRV9JRDoKLSAgICBuYW1lID0gQCJCYWQgc2VxdWVuY2UgSUQiOwotICAgIGJyZWFrOwotICBjYXNlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9NSVNTSU5HX1JFU1VMVDoKLSAgICBuYW1lID0gQCJNaXNzaW5nIHJlc3VsdCI7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgVEFwcGxpY2F0aW9uRXhjZXB0aW9uX0lOVEVSTkFMX0VSUk9SOgotICAgIG5hbWUgPSBAIkludGVybmFsIGVycm9yIjsKLSAgICBicmVhazsKLSAgY2FzZSBUQXBwbGljYXRpb25FeGNlcHRpb25fUFJPVE9DT0xfRVJST1I6Ci0gICAgbmFtZSA9IEAiUHJvdG9jb2wgZXJyb3IiOwotICAgIGJyZWFrOwotICBjYXNlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9JTlZBTElEX1RSQU5TRk9STToKLSAgICBuYW1lID0gQCJJbnZhbGlkIHRyYW5zZm9ybSI7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgVEFwcGxpY2F0aW9uRXhjZXB0aW9uX0lOVkFMSURfUFJPVE9DT0w6Ci0gICAgbmFtZSA9IEAiSW52YWxpZCBwcm90b2NvbCI7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgVEFwcGxpY2F0aW9uRXhjZXB0aW9uX1VOU1VQUE9SVEVEX0NMSUVOVF9UWVBFOgotICAgIG5hbWUgPSBAIlVuc3VwcG9ydGVkIGNsaWVudCB0eXBlIjsKLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBuYW1lID0gQCJVbmtub3duIjsKLSAgICBicmVhazsKLSAgfQotCi0gIHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhOYW1lOiBuYW1lIHJlYXNvbjogcmVhc29uIHVzZXJJbmZvOiBuaWxdOwotICByZXR1cm4gc2VsZjsKLX0KLQotCi0rIChUQXBwbGljYXRpb25FeGNlcHRpb24gKikgcmVhZDogKGlkIDxUUHJvdG9jb2w+KSBwcm90b2NvbAotewotICBOU1N0cmluZyAqIHJlYXNvbiA9IG5pbDsKLSAgaW50IHR5cGUgPSBUQXBwbGljYXRpb25FeGNlcHRpb25fVU5LTk9XTjsKLSAgaW50IGZpZWxkVHlwZTsKLSAgaW50IGZpZWxkSUQ7Ci0KLSAgW3Byb3RvY29sIHJlYWRTdHJ1Y3RCZWdpblJldHVybmluZ05hbWU6IE5VTExdOwotCi0gIHdoaWxlICh0cnVlKSB7Ci0gICAgW3Byb3RvY29sIHJlYWRGaWVsZEJlZ2luUmV0dXJuaW5nTmFtZTogTlVMTAotICAgICAgICAgICAgICB0eXBlOiAmZmllbGRUeXBlCi0gICAgICAgICAgICAgIGZpZWxkSUQ6ICZmaWVsZElEXTsKLSAgICBpZiAoZmllbGRUeXBlID09IFRUeXBlX1NUT1ApIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBzd2l0Y2ggKGZpZWxkSUQpIHsKLSAgICBjYXNlIDE6Ci0gICAgICBpZiAoZmllbGRUeXBlID09IFRUeXBlX1NUUklORykgewotICAgICAgICByZWFzb24gPSBbcHJvdG9jb2wgcmVhZFN0cmluZ107Ci0gICAgICB9IGVsc2UgewotICAgICAgICBbVFByb3RvY29sVXRpbCBza2lwVHlwZTogZmllbGRUeXBlIG9uUHJvdG9jb2w6IHByb3RvY29sXTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIGlmIChmaWVsZFR5cGUgPT0gVFR5cGVfSTMyKSB7Ci0gICAgICAgIHR5cGUgPSBbcHJvdG9jb2wgcmVhZEkzMl07Ci0gICAgICB9IGVsc2UgewotICAgICAgICBbVFByb3RvY29sVXRpbCBza2lwVHlwZTogZmllbGRUeXBlIG9uUHJvdG9jb2w6IHByb3RvY29sXTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBbVFByb3RvY29sVXRpbCBza2lwVHlwZTogZmllbGRUeXBlIG9uUHJvdG9jb2w6IHByb3RvY29sXTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBbcHJvdG9jb2wgcmVhZEZpZWxkRW5kXTsKLSAgfQotICBbcHJvdG9jb2wgcmVhZFN0cnVjdEVuZF07Ci0KLSAgcmV0dXJuIFtUQXBwbGljYXRpb25FeGNlcHRpb24gZXhjZXB0aW9uV2l0aFR5cGU6IHR5cGUgcmVhc29uOiByZWFzb25dOwotfQotCi0KLS0gKHZvaWQpIHdyaXRlOiAoaWQgPFRQcm90b2NvbD4pIHByb3RvY29sCi17Ci0gIFtwcm90b2NvbCB3cml0ZVN0cnVjdEJlZ2luV2l0aE5hbWU6IEAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIl07Ci0KLSAgaWYgKFtzZWxmIHJlYXNvbl0gIT0gbmlsKSB7Ci0gICAgW3Byb3RvY29sIHdyaXRlRmllbGRCZWdpbldpdGhOYW1lOiBAIm1lc3NhZ2UiCi0gICAgICAgICAgICAgICAgIHR5cGU6IFRUeXBlX1NUUklORwotICAgICAgICAgICAgICAgICBmaWVsZElEOiAxXTsKLSAgICBbcHJvdG9jb2wgd3JpdGVTdHJpbmc6IFtzZWxmIHJlYXNvbl1dOwotICAgIFtwcm90b2NvbCB3cml0ZUZpZWxkRW5kXTsKLSAgfQotCi0gIFtwcm90b2NvbCB3cml0ZUZpZWxkQmVnaW5XaXRoTmFtZTogQCJ0eXBlIgotICAgICAgICAgICAgICAgdHlwZTogVFR5cGVfSTMyCi0gICAgICAgICAgICAgICBmaWVsZElEOiAyXTsKLSAgW3Byb3RvY29sIHdyaXRlSTMyOiBtVHlwZV07Ci0gIFtwcm90b2NvbCB3cml0ZUZpZWxkRW5kXTsKLQotICBbcHJvdG9jb2wgd3JpdGVGaWVsZFN0b3BdOwotICBbcHJvdG9jb2wgd3JpdGVTdHJ1Y3RFbmRdOwotfQotCi0KLSsgKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiAqKSBleGNlcHRpb25XaXRoVHlwZTogKGludCkgdHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IChOU1N0cmluZyAqKSByZWFzb24KLXsKLSAgcmV0dXJuIFtbW1RBcHBsaWNhdGlvbkV4Y2VwdGlvbiBhbGxvY10gaW5pdFdpdGhUeXBlOiB0eXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjogcmVhc29uXSBhdXRvcmVsZWFzZV9zdHViXTsKLX0KLQotQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9UQmFzZUNsaWVudC5oIGIvbGliL2NvY29hL3NyYy9UQmFzZUNsaWVudC5oCmluZGV4IDEyOTQ0YjEuLjBmNzNhYTAgMTAwNjQ0Ci0tLSBhL2xpYi9jb2NvYS9zcmMvVEJhc2VDbGllbnQuaAorKysgYi9saWIvY29jb2Evc3JjL1RCYXNlQ2xpZW50LmgKQEAgLTE4LDEzICsxOCwxMCBAQAogICovCiAKICNpbXBvcnQgIlRQcm90b2NvbC5oIgotI2ltcG9ydCAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmgiCisjaW1wb3J0ICJUQXBwbGljYXRpb25FcnJvci5oIgogCi1AaW50ZXJmYWNlIFRCYXNlQ2xpZW50IDogTlNPYmplY3QgewotICAgIGlkIDxUUHJvdG9jb2w+IGluUHJvdG9jb2w7Ci0gICAgaWQgPFRQcm90b2NvbD4gb3V0UHJvdG9jb2w7Ci19CitAaW50ZXJmYWNlIFRCYXNlQ2xpZW50IDogTlNPYmplY3QKIAotLSAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uICopY2hlY2tJbmNvbWluZ01lc3NhZ2VFeGNlcHRpb247CistKE5TRXJyb3IgKikgY2hlY2tJbmNvbWluZ01lc3NhZ2VFeGNlcHRpb246KGlkPFRQcm90b2NvbD4pcHJvdG9jb2w7CiAKIEBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVEJhc2VDbGllbnQubSBiL2xpYi9jb2NvYS9zcmMvVEJhc2VDbGllbnQubQppbmRleCBkMTVmOWQzLi4yNDljYWUwIDEwMDY0NAotLS0gYS9saWIvY29jb2Evc3JjL1RCYXNlQ2xpZW50Lm0KKysrIGIvbGliL2NvY29hL3NyYy9UQmFzZUNsaWVudC5tCkBAIC0xOCwyOSArMTgsMzQgQEAKICAqLwogCiAjaW1wb3J0ICJUQmFzZUNsaWVudC5oIgotI2ltcG9ydCAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmgiCi0jaW1wb3J0ICJUT2JqZWN0aXZlLUMuaCIKKyNpbXBvcnQgIlRBcHBsaWNhdGlvbkVycm9yLmgiCisKKworQGludGVyZmFjZSBUQmFzZUNsaWVudCAoKQorQGVuZAorCiAKIEBpbXBsZW1lbnRhdGlvbiBUQmFzZUNsaWVudAogCi0tICh2b2lkKSBkZWFsbG9jCistKE5TRXJyb3IgKikgY2hlY2tJbmNvbWluZ01lc3NhZ2VFeGNlcHRpb246KGlkPFRQcm90b2NvbD4paW5Qcm90b2NvbAogewotICAgIFtpblByb3RvY29sIHJlbGVhc2Vfc3R1Yl07Ci0gICAgW291dFByb3RvY29sIHJlbGVhc2Vfc3R1Yl07Ci0gICAgW3N1cGVyIGRlYWxsb2Nfc3R1Yl07Ci19CisgIE5TRXJyb3IgKnRocmlmdEVycm9yOwogCi0tIChUQXBwbGljYXRpb25FeGNlcHRpb24gKiljaGVja0luY29taW5nTWVzc2FnZUV4Y2VwdGlvbgotewotICAgIGludCBtc2dUeXBlID0gMDsKLSAgICBbaW5Qcm90b2NvbCByZWFkTWVzc2FnZUJlZ2luUmV0dXJuaW5nTmFtZTogbmlsIHR5cGU6ICZtc2dUeXBlIHNlcXVlbmNlSUQ6IE5VTExdOwotICAgIGlmIChtc2dUeXBlID09IFRNZXNzYWdlVHlwZV9FWENFUFRJT04pIHsKLSAgICAgICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uICogeCA9IFtUQXBwbGljYXRpb25FeGNlcHRpb24gcmVhZDogaW5Qcm90b2NvbF07Ci0gICAgICAgIFtpblByb3RvY29sIHJlYWRNZXNzYWdlRW5kXTsKLSAgICAgICAgcmV0dXJuIHg7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBuaWw7CisgIFNJbnQzMiBtc2dUeXBlID0gMDsKKyAgaWYgKCFbaW5Qcm90b2NvbCByZWFkTWVzc2FnZUJlZ2luUmV0dXJuaW5nTmFtZTpuaWwgdHlwZTombXNnVHlwZSBzZXF1ZW5jZUlEOk5VTEwgZXJyb3I6JnRocmlmdEVycm9yXSkgeworICAgIHJldHVybiB0aHJpZnRFcnJvcjsKKyAgfQorCisgIGlmIChtc2dUeXBlID09IFRNZXNzYWdlVHlwZUVYQ0VQVElPTikgeworCisgICAgdGhyaWZ0RXJyb3IgPSBbTlNFcnJvciByZWFkOmluUHJvdG9jb2xdOworCisgICAgW2luUHJvdG9jb2wgcmVhZE1lc3NhZ2VFbmQ6TlVMTF07CisKKyAgICByZXR1cm4gdGhyaWZ0RXJyb3I7CisgIH0KKworICByZXR1cm4gbmlsOwogfQogCiBAZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL1RCaW5hcnkuc3dpZnQgYi9saWIvY29jb2Evc3JjL1RCaW5hcnkuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhhMzY2MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvVEJpbmFyeS5zd2lmdApAQCAtMCwwICsxLDEyMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgRm91bmRhdGlvbgorCisKK3B1YmxpYyBzdHJ1Y3QgVEJpbmFyeSA6IFRTZXJpYWxpemFibGUgeworICAKKyAgcHVibGljIHN0YXRpYyB2YXIgdGhyaWZ0VHlwZSA6IFRUeXBlIHsgcmV0dXJuIC5TVFJJTkcgfQorICAKKyAgcHJpdmF0ZSB2YXIgc3RvcmFnZSA6IE5TRGF0YQorICAKKyAgcHVibGljIGluaXQoKSB7CisgICAgc2VsZi5zdG9yYWdlID0gTlNEYXRhKCkKKyAgfQorICAKKyAgcHVibGljIGluaXQoY29udGVudHNPZkZpbGUgZmlsZTogU3RyaW5nLCBvcHRpb25zOiBOU0RhdGFSZWFkaW5nT3B0aW9ucyA9IFtdKSB0aHJvd3MgeworICAgIHNlbGYuc3RvcmFnZSA9IHRyeSBOU0RhdGEoY29udGVudHNPZkZpbGU6IGZpbGUsIG9wdGlvbnM6IG9wdGlvbnMpCisgIH0KKyAgCisgIHB1YmxpYyBpbml0KGNvbnRlbnRzT2ZVUkwgVVJMOiBOU1VSTCwgb3B0aW9uczogTlNEYXRhUmVhZGluZ09wdGlvbnMgPSBbXSkgdGhyb3dzIHsKKyAgICBzZWxmLnN0b3JhZ2UgPSB0cnkgTlNEYXRhKGNvbnRlbnRzT2ZVUkw6IFVSTCwgb3B0aW9uczogb3B0aW9ucykKKyAgfQorICAKKyAgcHVibGljIGluaXQ/KGJhc2U2NEVuY29kZWREYXRhIGJhc2U2NERhdGE6IE5TRGF0YSwgb3B0aW9uczogTlNEYXRhQmFzZTY0RGVjb2RpbmdPcHRpb25zID0gW10pIHsKKyAgICBndWFyZCBsZXQgc3RvcmFnZSA9IE5TRGF0YShiYXNlNjRFbmNvZGVkRGF0YTogYmFzZTY0RGF0YSwgb3B0aW9uczogb3B0aW9ucykgZWxzZSB7CisgICAgICByZXR1cm4gbmlsCisgICAgfQorICAgIHNlbGYuc3RvcmFnZSA9IHN0b3JhZ2UKKyAgfQorICAKKyAgcHVibGljIGluaXQoZGF0YTogTlNEYXRhKSB7CisgICAgc2VsZi5zdG9yYWdlID0gZGF0YQorICB9CisgIAorICBwdWJsaWMgdmFyIGxlbmd0aCA6IEludCB7CisgICAgcmV0dXJuIHN0b3JhZ2UubGVuZ3RoCisgIH0KKyAgCisgIHB1YmxpYyB2YXIgaGFzaFZhbHVlIDogSW50IHsKKyAgICByZXR1cm4gc3RvcmFnZS5oYXNoVmFsdWUKKyAgfQorICAKKyAgcHVibGljIHZhciBieXRlcyA6IFVuc2FmZVBvaW50ZXI8Vm9pZD4geworICAgIHJldHVybiBzdG9yYWdlLmJ5dGVzCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGdldEJ5dGVzKGJ1ZmZlcjogVW5zYWZlTXV0YWJsZVBvaW50ZXI8Vm9pZD4sIGxlbmd0aDogSW50KSB7CisgICAgc3RvcmFnZS5nZXRCeXRlcyhidWZmZXIsIGxlbmd0aDogbGVuZ3RoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyBnZXRCeXRlcyhidWZmZXI6IFVuc2FmZU11dGFibGVQb2ludGVyPFZvaWQ+LCByYW5nZTogUmFuZ2U8SW50PikgeworICAgIHN0b3JhZ2UuZ2V0Qnl0ZXMoYnVmZmVyLCByYW5nZTogTlNSYW5nZShyYW5nZSkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHN1YkJpbmFyeVdpdGhSYW5nZShyYW5nZTogUmFuZ2U8SW50PikgLT4gVEJpbmFyeSB7CisgICAgcmV0dXJuIFRCaW5hcnkoZGF0YTogc3RvcmFnZS5zdWJkYXRhV2l0aFJhbmdlKE5TUmFuZ2UocmFuZ2UpKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVUb0ZpbGUocGF0aDogU3RyaW5nLCBvcHRpb25zOiBOU0RhdGFXcml0aW5nT3B0aW9ucyA9IFtdKSB0aHJvd3MgeworICAgIHRyeSBzdG9yYWdlLndyaXRlVG9GaWxlKHBhdGgsIG9wdGlvbnM6IG9wdGlvbnMpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlVG9VUkwodXJsOiBOU1VSTCwgb3B0aW9uczogTlNEYXRhV3JpdGluZ09wdGlvbnMgPSBbXSkgdGhyb3dzIHsKKyAgICB0cnkgc3RvcmFnZS53cml0ZVRvVVJMKHVybCwgb3B0aW9uczogb3B0aW9ucykKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmFuZ2VPZkRhdGEoZGF0YVRvRmluZCBkYXRhOiBOU0RhdGEsIG9wdGlvbnM6IE5TRGF0YVNlYXJjaE9wdGlvbnMsIHJhbmdlOiBSYW5nZTxJbnQ+KSAtPiBSYW5nZTxJbnQ+PyB7CisgICAgcmV0dXJuIHN0b3JhZ2UucmFuZ2VPZkRhdGEoZGF0YSwgb3B0aW9uczogb3B0aW9ucywgcmFuZ2U6IE5TUmFuZ2UocmFuZ2UpKS50b1JhbmdlKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgZW51bWVyYXRlQnl0ZVJhbmdlc1VzaW5nQmxvY2soYmxvY2s6IChVbnNhZmVQb2ludGVyPFZvaWQ+LCBSYW5nZTxJbnQ+LCBpbm91dCBCb29sKSAtPiBWb2lkKSB7CisgICAgc3RvcmFnZS5lbnVtZXJhdGVCeXRlUmFuZ2VzVXNpbmdCbG9jayB7IGJ5dGVzLCByYW5nZSwgc3RvcCBpbgorICAgICAgdmFyIHN0b3BUbXAgPSBCb29sKHN0b3AubWVtb3J5KQorICAgICAgYmxvY2soYnl0ZXMsIHJhbmdlLnRvUmFuZ2UoKSEsICZzdG9wVG1wKQorICAgICAgc3RvcC5tZW1vcnkgPSBPYmpDQm9vbChzdG9wVG1wKQorICAgIH0KKyAgfQorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWRWYWx1ZUZyb21Qcm90b2NvbChwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gVEJpbmFyeSB7CisgICAgdmFyIGRhdGEgOiBOU0RhdGE/CisgICAgdHJ5IHByb3RvLnJlYWRCaW5hcnkoJmRhdGEpCisgICAgcmV0dXJuIFRCaW5hcnkoZGF0YTogZGF0YSEpCisgIH0KKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyB3cml0ZVZhbHVlKHZhbHVlOiBUQmluYXJ5LCB0b1Byb3RvY29sIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHByb3RvLndyaXRlQmluYXJ5KHZhbHVlLnN0b3JhZ2UpCisgIH0KKyAgCit9CisKK2V4dGVuc2lvbiBUQmluYXJ5IDogQ3VzdG9tU3RyaW5nQ29udmVydGlibGUsIEN1c3RvbURlYnVnU3RyaW5nQ29udmVydGlibGUgeworICAKKyAgcHVibGljIHZhciBkZXNjcmlwdGlvbiA6IFN0cmluZyB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZGVzY3JpcHRpb24KKyAgfQorICAKKyAgcHVibGljIHZhciBkZWJ1Z0Rlc2NyaXB0aW9uIDogU3RyaW5nIHsKKyAgICByZXR1cm4gc3RvcmFnZS5kZWJ1Z0Rlc2NyaXB0aW9uCisgIH0KKyAgCit9CisKK3B1YmxpYyBmdW5jID09KGxoczogVEJpbmFyeSwgcmhzOiBUQmluYXJ5KSAtPiBCb29sIHsKKyAgcmV0dXJuIGxocy5zdG9yYWdlID09IHJocy5zdG9yYWdlCit9CmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL1RFbnVtLnN3aWZ0IGIvbGliL2NvY29hL3NyYy9URW51bS5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjJhNTNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy9URW51bS5zd2lmdApAQCAtMCwwICsxLDMxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBGb3VuZGF0aW9uCisKKworcHVibGljIHByb3RvY29sIFRFbnVtIDogVFNlcmlhbGl6YWJsZSB7CisgIAorfQorCitwdWJsaWMgZXh0ZW5zaW9uIFRFbnVtIHsKKyAgCisgIHB1YmxpYyBzdGF0aWMgdmFyIHRocmlmdFR5cGUgOiBUVHlwZSB7IHJldHVybiBUVHlwZS5JMzIgfQorICAKK30KZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVEVycm9yLmggYi9saWIvY29jb2Evc3JjL1RFcnJvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiYjcyYzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL1RFcnJvci5oCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+CisKKworZXh0ZXJuIE5TU3RyaW5nICpURXJyb3JEb21haW47CmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL1RFcnJvci5tIGIvbGliL2NvY29hL3NyYy9URXJyb3IubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjdmOTJkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy9URXJyb3IubQpAQCAtMCwwICsxLDIzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgIlRFcnJvci5oIgorCisKK05TU3RyaW5nICpURXJyb3JEb21haW4gPSBAIlRFcnJvckRvbWFpbiI7CmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL1RFeGNlcHRpb24uaCBiL2xpYi9jb2NvYS9zcmMvVEV4Y2VwdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTZmNGZhLi4wMDAwMDAwCi0tLSBhL2xpYi9jb2NvYS9zcmMvVEV4Y2VwdGlvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KLQotQGludGVyZmFjZSBURXhjZXB0aW9uIDogTlNFeGNlcHRpb24gewotfQotCi0rIChpZCkgZXhjZXB0aW9uV2l0aE5hbWU6IChOU1N0cmluZyAqKSBuYW1lOwotCi0rIChpZCkgZXhjZXB0aW9uV2l0aE5hbWU6IChOU1N0cmluZyAqKSBuYW1lCi0gICAgICAgICAgICAgICAgICByZWFzb246IChOU1N0cmluZyAqKSByZWFzb247Ci0KLSsgKGlkKSBleGNlcHRpb25XaXRoTmFtZTogKE5TU3RyaW5nICopIG5hbWUKLSAgICAgICAgICAgICAgICAgIHJlYXNvbjogKE5TU3RyaW5nICopIHJlYXNvbgotICAgICAgICAgICAgICAgICAgIGVycm9yOiAoTlNFcnJvciAqKSBlcnJvcjsKLQotQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9URXhjZXB0aW9uLm0gYi9saWIvY29jb2Evc3JjL1RFeGNlcHRpb24ubQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE2MGUzYi4uMDAwMDAwMAotLS0gYS9saWIvY29jb2Evc3JjL1RFeGNlcHRpb24ubQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2ltcG9ydCAiVEV4Y2VwdGlvbi5oIgotI2ltcG9ydCAiVE9iamVjdGl2ZS1DLmgiCi0KLUBpbXBsZW1lbnRhdGlvbiBURXhjZXB0aW9uCi0KLSsgKGlkKSBleGNlcHRpb25XaXRoTmFtZTogKE5TU3RyaW5nICopIG5hbWUKLXsKLSAgcmV0dXJuIFtzZWxmIGV4Y2VwdGlvbldpdGhOYW1lOiBuYW1lIHJlYXNvbjogQCJ1bmtub3duIiBlcnJvcjogbmlsXTsKLX0KLQotCi0rIChpZCkgZXhjZXB0aW9uV2l0aE5hbWU6IChOU1N0cmluZyAqKSBuYW1lCi0gICAgICAgICAgICAgICAgICByZWFzb246IChOU1N0cmluZyAqKSByZWFzb24KLXsKLSAgcmV0dXJuIFtzZWxmIGV4Y2VwdGlvbldpdGhOYW1lOiBuYW1lIHJlYXNvbjogcmVhc29uIGVycm9yOiBuaWxdOwotfQotCi0KLSsgKGlkKSBleGNlcHRpb25XaXRoTmFtZTogKE5TU3RyaW5nICopIG5hbWUKLSAgICAgICAgICAgICAgICAgIHJlYXNvbjogKE5TU3RyaW5nICopIHJlYXNvbgotICAgICAgICAgICAgICAgICAgIGVycm9yOiAoTlNFcnJvciAqKSBlcnJvcgotewotICBOU0RpY3Rpb25hcnkgKiB1c2VySW5mbyA9IG5pbDsKLSAgaWYgKGVycm9yICE9IG5pbCkgewotICAgIHVzZXJJbmZvID0gW05TRGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aE9iamVjdDogZXJyb3IgZm9yS2V5OiBAImVycm9yIl07Ci0gIH0KLQotICByZXR1cm4gW3N1cGVyIGV4Y2VwdGlvbldpdGhOYW1lOiBuYW1lCi0gICAgICAgICAgICAgICAgcmVhc29uOiByZWFzb24KLSAgICAgICAgICAgICAgICB1c2VySW5mbzogdXNlckluZm9dOwotfQotCi0KLS0gKE5TU3RyaW5nICopIGRlc2NyaXB0aW9uCi17Ci0gIE5TTXV0YWJsZVN0cmluZyAqIHJlc3VsdCA9IFtOU011dGFibGVTdHJpbmcgc3RyaW5nV2l0aFN0cmluZzogW3NlbGYgbmFtZV1dOwotICBbcmVzdWx0IGFwcGVuZEZvcm1hdDogQCI6ICVAIiwgW3NlbGYgcmVhc29uXV07Ci0gIGlmIChbc2VsZiB1c2VySW5mb10gIT0gbmlsKSB7Ci0gICAgW3Jlc3VsdCBhcHBlbmRGb3JtYXQ6IEAiXG4gIHVzZXJJbmZvID0gJUAiLCBbc2VsZiB1c2VySW5mb11dOwotICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi1AZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL1RMaXN0LnN3aWZ0IGIvbGliL2NvY29hL3NyYy9UTGlzdC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDViZDgxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy9UTGlzdC5zd2lmdApAQCAtMCwwICsxLDE0OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgRm91bmRhdGlvbgorCisKKworcHVibGljIHN0cnVjdCBUTGlzdDxFbGVtZW50IDogVFNlcmlhbGl6YWJsZT4gOiBNdXRhYmxlQ29sbGVjdGlvblR5cGUsIEhhc2hhYmxlLCBBcnJheUxpdGVyYWxDb252ZXJ0aWJsZSwgVFNlcmlhbGl6YWJsZSB7CisgIAorICBwdWJsaWMgc3RhdGljIHZhciB0aHJpZnRUeXBlIDogVFR5cGUgeyByZXR1cm4gLkxJU1QgfQorICAKKyAgdHlwZWFsaWFzIFN0b3JhZ2UgPSBBcnJheTxFbGVtZW50PgorCisgIHB1YmxpYyB0eXBlYWxpYXMgSW5kZXggPSBTdG9yYWdlLkluZGV4CisgIAorICBwcml2YXRlIHZhciBzdG9yYWdlID0gU3RvcmFnZSgpCisgIAorICBwdWJsaWMgdmFyIHN0YXJ0SW5kZXggOiBJbmRleCB7CisgICAgcmV0dXJuIHN0b3JhZ2Uuc3RhcnRJbmRleAorICB9CisgIAorICBwdWJsaWMgdmFyIGVuZEluZGV4IDogSW5kZXggeworICAgIHJldHVybiBzdG9yYWdlLmVuZEluZGV4CisgIH0KKworICBwdWJsaWMgc3Vic2NyaXB0IChwb3NpdGlvbjogSW5kZXgpIC0+IEVsZW1lbnQgeworICAgIGdldCB7CisgICAgICByZXR1cm4gc3RvcmFnZVtwb3NpdGlvbl0KKyAgICB9CisgICAgc2V0IHsKKyAgICAgIHN0b3JhZ2VbcG9zaXRpb25dID0gbmV3VmFsdWUKKyAgICB9CisgIH0KKyAgCisgIHB1YmxpYyB2YXIgaGFzaFZhbHVlIDogSW50IHsKKyAgICBsZXQgcHJpbWUgPSAzMQorICAgIHZhciByZXN1bHQgPSAxCisgICAgZm9yIGVsZW1lbnQgaW4gc3RvcmFnZSB7CisgICAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArIGVsZW1lbnQuaGFzaFZhbHVlCisgICAgfQorICAgIHJldHVybiByZXN1bHQKKyAgfQorICAKKyAgcHVibGljIGluaXQoYXJyYXlMaXRlcmFsIGVsZW1lbnRzOiBFbGVtZW50Li4uKSB7CisgICAgc2VsZi5zdG9yYWdlID0gU3RvcmFnZShzdG9yYWdlKQorICB9CisgIAorICBwdWJsaWMgaW5pdCgpIHsKKyAgICBzZWxmLnN0b3JhZ2UgPSBTdG9yYWdlKCkKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgYXBwZW5kKG5ld0VsZW1lbnQ6IEVsZW1lbnQpIHsKKyAgICBzZWxmLnN0b3JhZ2UuYXBwZW5kKG5ld0VsZW1lbnQpCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIGFwcGVuZENvbnRlbnRzT2Y8QyA6IENvbGxlY3Rpb25UeXBlIHdoZXJlIEMuR2VuZXJhdG9yLkVsZW1lbnQgPT0gRWxlbWVudD4obmV3c3RvcmFnZTogQykgeworICAgIHNlbGYuc3RvcmFnZS5hcHBlbmRDb250ZW50c09mKG5ld3N0b3JhZ2UpCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIGluc2VydChuZXdFbGVtZW50OiBFbGVtZW50LCBhdEluZGV4IGluZGV4OiBJbnQpIHsKKyAgICBzZWxmLnN0b3JhZ2UuaW5zZXJ0KG5ld0VsZW1lbnQsIGF0SW5kZXg6IGluZGV4KQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyBpbnNlcnRDb250ZW50c09mPEMgOiBDb2xsZWN0aW9uVHlwZSB3aGVyZSBDLkdlbmVyYXRvci5FbGVtZW50ID09IEVsZW1lbnQ+KG5ld0VsZW1lbnRzOiBDLCBhdCBpbmRleDogSW50KSB7CisgICAgc2VsZi5zdG9yYWdlLmluc2VydENvbnRlbnRzT2YobmV3RWxlbWVudHMsIGF0OiBpbmRleCkKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgcmVtb3ZlQWxsKGtlZXBDYXBhY2l0eSBrZWVwQ2FwYWNpdHk6IEJvb2wgPSB0cnVlKSB7CisgICAgc2VsZi5zdG9yYWdlLnJlbW92ZUFsbChrZWVwQ2FwYWNpdHk6IGtlZXBDYXBhY2l0eSkKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgcmVtb3ZlQXRJbmRleChpbmRleDogSW5kZXgpIHsKKyAgICBzZWxmLnN0b3JhZ2UucmVtb3ZlQXRJbmRleChpbmRleCkKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgcmVtb3ZlRmlyc3QobjogSW50ID0gMCkgeworICAgIHNlbGYuc3RvcmFnZS5yZW1vdmVGaXJzdChuKQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyByZW1vdmVMYXN0KCkgLT4gRWxlbWVudCB7CisgICAgcmV0dXJuIHNlbGYuc3RvcmFnZS5yZW1vdmVMYXN0KCkKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgcmVtb3ZlUmFuZ2Uoc3ViUmFuZ2U6IFJhbmdlPEluZGV4PikgeworICAgIHNlbGYuc3RvcmFnZS5yZW1vdmVSYW5nZShzdWJSYW5nZSkKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgcmVzZXJ2ZUNhcGFjaXR5KG1pbmltdW1DYXBhY2l0eTogSW50KSB7CisgICAgc2VsZi5zdG9yYWdlLnJlc2VydmVDYXBhY2l0eShtaW5pbXVtQ2FwYWNpdHkpCisgIH0KKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkVmFsdWVGcm9tUHJvdG9jb2wocHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IFRMaXN0IHsKKyAgICBsZXQgKGVsZW1lbnRUeXBlLCBzaXplKSA9IHRyeSBwcm90by5yZWFkTGlzdEJlZ2luKCkKKyAgICBpZiBlbGVtZW50VHlwZSAhPSBFbGVtZW50LnRocmlmdFR5cGUgeworICAgICAgdGhyb3cgTlNFcnJvcigKKyAgICAgICAgZG9tYWluOiBUUHJvdG9jb2xFcnJvckRvbWFpbiwKKyAgICAgICAgY29kZTogSW50KFRQcm90b2NvbEVycm9yLkludmFsaWREYXRhLnJhd1ZhbHVlKSwKKyAgICAgICAgdXNlckluZm86IFtUUHJvdG9jb2xFcnJvckV4dGVuZGVkRXJyb3JLZXk6IE5TTnVtYmVyKGludDogVFByb3RvY29sRXh0ZW5kZWRFcnJvci5VbmV4cGVjdGVkVHlwZS5yYXdWYWx1ZSldKQorICAgIH0KKyAgICB2YXIgbGlzdCA9IFRMaXN0KCkKKyAgICBmb3IgXyBpbiAwLi48c2l6ZSB7CisgICAgICBsZXQgZWxlbWVudCA9IHRyeSBFbGVtZW50LnJlYWRWYWx1ZUZyb21Qcm90b2NvbChwcm90bykKKyAgICAgIGxpc3Quc3RvcmFnZS5hcHBlbmQoZWxlbWVudCkKKyAgICB9CisgICAgdHJ5IHByb3RvLnJlYWRMaXN0RW5kKCkKKyAgICByZXR1cm4gbGlzdAorICB9CisgIAorICBwdWJsaWMgc3RhdGljIGZ1bmMgd3JpdGVWYWx1ZSh2YWx1ZTogVExpc3QsIHRvUHJvdG9jb2wgcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGVMaXN0QmVnaW5XaXRoRWxlbWVudFR5cGUoRWxlbWVudC50aHJpZnRUeXBlLCBzaXplOiB2YWx1ZS5jb3VudCkKKyAgICBmb3IgZWxlbWVudCBpbiB2YWx1ZS5zdG9yYWdlIHsKKyAgICAgIHRyeSBFbGVtZW50LndyaXRlVmFsdWUoZWxlbWVudCwgdG9Qcm90b2NvbDogcHJvdG8pCisgICAgfQorICAgIHRyeSBwcm90by53cml0ZUxpc3RFbmQoKQorICB9Cit9CisKK2V4dGVuc2lvbiBUTGlzdCA6IEN1c3RvbVN0cmluZ0NvbnZlcnRpYmxlLCBDdXN0b21EZWJ1Z1N0cmluZ0NvbnZlcnRpYmxlIHsKKyAgCisgIHB1YmxpYyB2YXIgZGVzY3JpcHRpb24gOiBTdHJpbmcgeworICAgIHJldHVybiBzdG9yYWdlLmRlc2NyaXB0aW9uCisgIH0KKyAgCisgIHB1YmxpYyB2YXIgZGVidWdEZXNjcmlwdGlvbiA6IFN0cmluZyB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZGVidWdEZXNjcmlwdGlvbgorICB9CisgIAorfQorCitwdWJsaWMgZnVuYyA9PTxFbGVtZW50PihsaHM6IFRMaXN0PEVsZW1lbnQ+LCByaHM6IFRMaXN0PEVsZW1lbnQ+KSAtPiBCb29sIHsKKyAgcmV0dXJuIGxocy5zdG9yYWdlID09IHJocy5zdG9yYWdlCit9CmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL1RNYXAuc3dpZnQgYi9saWIvY29jb2Evc3JjL1RNYXAuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk2ZTc0NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvVE1hcC5zd2lmdApAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgRm91bmRhdGlvbgorCisKK3B1YmxpYyBzdHJ1Y3QgVE1hcDxLZXkgOiBUU2VyaWFsaXphYmxlLCBWYWx1ZSA6IFRTZXJpYWxpemFibGU+IDogQ29sbGVjdGlvblR5cGUsIERpY3Rpb25hcnlMaXRlcmFsQ29udmVydGlibGUsIFRTZXJpYWxpemFibGUgeworICAKKyAgcHVibGljIHN0YXRpYyB2YXIgdGhyaWZ0VHlwZSA6IFRUeXBlIHsgcmV0dXJuIC5NQVAgfQorCisgIHR5cGVhbGlhcyBTdG9yYWdlID0gRGljdGlvbmFyeTxLZXksIFZhbHVlPgorCisgIHB1YmxpYyB0eXBlYWxpYXMgSW5kZXggPSBTdG9yYWdlLkluZGV4CisKKyAgcHVibGljIHR5cGVhbGlhcyBFbGVtZW50ID0gU3RvcmFnZS5FbGVtZW50CisgIAorICBwcml2YXRlIHZhciBzdG9yYWdlIDogU3RvcmFnZQorCisgIHB1YmxpYyB2YXIgc3RhcnRJbmRleCA6IEluZGV4IHsKKyAgICByZXR1cm4gc3RvcmFnZS5zdGFydEluZGV4CisgIH0KKyAgCisgIHB1YmxpYyB2YXIgZW5kSW5kZXg6IEluZGV4IHsKKyAgICByZXR1cm4gc3RvcmFnZS5lbmRJbmRleAorICB9CisKKyAgcHVibGljIHZhciBrZXlzOiBMYXp5TWFwQ29sbGVjdGlvbjxbS2V5IDogVmFsdWVdLCBLZXk+IHsKKyAgICByZXR1cm4gc3RvcmFnZS5rZXlzCisgIH0KKyAgCisgIHB1YmxpYyB2YXIgdmFsdWVzOiBMYXp5TWFwQ29sbGVjdGlvbjxbS2V5IDogVmFsdWVdLCBWYWx1ZT4geworICAgIHJldHVybiBzdG9yYWdlLnZhbHVlcworICB9CisgIAorICBwdWJsaWMgaW5pdCgpIHsKKyAgICBzdG9yYWdlID0gU3RvcmFnZSgpCisgIH0KKyAgCisgIHB1YmxpYyBpbml0KGRpY3Rpb25hcnlMaXRlcmFsIGVsZW1lbnRzOiAoS2V5LCBWYWx1ZSkuLi4pIHsKKyAgICBzdG9yYWdlID0gU3RvcmFnZSgpCisgICAgZm9yIChrZXksIHZhbHVlKSBpbiBlbGVtZW50cyB7CisgICAgICBzdG9yYWdlW2tleV0gPSB2YWx1ZQorICAgIH0KKyAgfQorICAKKyAgcHVibGljIGluaXQobWluaW11bUNhcGFjaXR5OiBJbnQpIHsKKyAgICBzdG9yYWdlID0gU3RvcmFnZShtaW5pbXVtQ2FwYWNpdHk6IG1pbmltdW1DYXBhY2l0eSkKKyAgfQorICAKKyAgcHVibGljIHN1YnNjcmlwdCAocG9zaXRpb246IEluZGV4KSAtPiBFbGVtZW50IHsKKyAgICBnZXQgeworICAgICAgcmV0dXJuIHN0b3JhZ2VbcG9zaXRpb25dCisgICAgfQorICB9CisgIAorICBwdWJsaWMgZnVuYyBpbmRleEZvcktleShrZXk6IEtleSkgLT4gSW5kZXg/IHsKKyAgICByZXR1cm4gc3RvcmFnZS5pbmRleEZvcktleShrZXkpCisgIH0KKyAgCisgIHB1YmxpYyBzdWJzY3JpcHQgKGtleTogS2V5KSAtPiBWYWx1ZT8geworICAgIGdldCB7CisgICAgICByZXR1cm4gc3RvcmFnZVtrZXldCisgICAgfQorICAgIHNldCB7CisgICAgICBzdG9yYWdlW2tleV0gPSBuZXdWYWx1ZQorICAgIH0KKyAgfQorCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIHVwZGF0ZVZhbHVlKHZhbHVlOiBWYWx1ZSwgZm9yS2V5IGtleTogS2V5KSAtPiBWYWx1ZT8geworICAgIHJldHVybiB1cGRhdGVWYWx1ZSh2YWx1ZSwgZm9yS2V5OiBrZXkpCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIHJlbW92ZUF0SW5kZXgoaW5kZXg6IERpY3Rpb25hcnlJbmRleDxLZXksIFZhbHVlPikgLT4gKEtleSwgVmFsdWUpIHsKKyAgICByZXR1cm4gcmVtb3ZlQXRJbmRleChpbmRleCkKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgcmVtb3ZlVmFsdWVGb3JLZXkoa2V5OiBLZXkpIC0+IFZhbHVlPyB7CisgICAgcmV0dXJuIHN0b3JhZ2UucmVtb3ZlVmFsdWVGb3JLZXkoa2V5KQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyByZW1vdmVBbGwoa2VlcENhcGFjaXR5IGtlZXBDYXBhY2l0eTogQm9vbCA9IGZhbHNlKSB7CisgICAgc3RvcmFnZS5yZW1vdmVBbGwoa2VlcENhcGFjaXR5OiBrZWVwQ2FwYWNpdHkpCisgIH0KKworICBwdWJsaWMgdmFyIGhhc2hWYWx1ZSA6IEludCB7CisgICAgbGV0IHByaW1lID0gMzEKKyAgICB2YXIgcmVzdWx0ID0gMQorICAgIGZvciAoa2V5LCB2YWx1ZSkgaW4gc3RvcmFnZSB7CisgICAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArIGtleS5oYXNoVmFsdWUKKyAgICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgdmFsdWUuaGFzaFZhbHVlCisgICAgfQorICAgIHJldHVybiByZXN1bHQKKyAgfQorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWRWYWx1ZUZyb21Qcm90b2NvbChwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gVE1hcCB7CisgICAgbGV0IChrZXlUeXBlLCB2YWx1ZVR5cGUsIHNpemUpID0gdHJ5IHByb3RvLnJlYWRNYXBCZWdpbigpCisgICAgaWYga2V5VHlwZSAhPSBLZXkudGhyaWZ0VHlwZSB8fCB2YWx1ZVR5cGUgIT0gVmFsdWUudGhyaWZ0VHlwZSB7CisgICAgICB0aHJvdyBOU0Vycm9yKAorICAgICAgICBkb21haW46IFRQcm90b2NvbEVycm9yRG9tYWluLAorICAgICAgICBjb2RlOiBJbnQoVFByb3RvY29sRXJyb3IuSW52YWxpZERhdGEucmF3VmFsdWUpLAorICAgICAgICB1c2VySW5mbzogW1RQcm90b2NvbEVycm9yRXh0ZW5kZWRFcnJvcktleTogTlNOdW1iZXIoaW50OiBUUHJvdG9jb2xFeHRlbmRlZEVycm9yLlVuZXhwZWN0ZWRUeXBlLnJhd1ZhbHVlKV0pCisgICAgfQorICAgIHZhciBtYXAgPSBUTWFwKCkKKyAgICBmb3IgXyBpbiAwLi48c2l6ZSB7CisgICAgICBsZXQga2V5ID0gdHJ5IEtleS5yZWFkVmFsdWVGcm9tUHJvdG9jb2wocHJvdG8pCisgICAgICBsZXQgdmFsdWUgPSB0cnkgVmFsdWUucmVhZFZhbHVlRnJvbVByb3RvY29sKHByb3RvKQorICAgICAgbWFwLnN0b3JhZ2Vba2V5XSA9IHZhbHVlCisgICAgfQorICAgIHRyeSBwcm90by5yZWFkTWFwRW5kKCkKKyAgICByZXR1cm4gbWFwCisgIH0KKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyB3cml0ZVZhbHVlKHZhbHVlOiBUTWFwLCB0b1Byb3RvY29sIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHByb3RvLndyaXRlTWFwQmVnaW5XaXRoS2V5VHlwZShLZXkudGhyaWZ0VHlwZSwgdmFsdWVUeXBlOiBWYWx1ZS50aHJpZnRUeXBlLCBzaXplOiB2YWx1ZS5jb3VudCkKKyAgICBmb3IgKGtleSwgdmFsdWUpIGluIHZhbHVlLnN0b3JhZ2UgeworICAgICAgdHJ5IEtleS53cml0ZVZhbHVlKGtleSwgdG9Qcm90b2NvbDogcHJvdG8pCisgICAgICB0cnkgVmFsdWUud3JpdGVWYWx1ZSh2YWx1ZSwgdG9Qcm90b2NvbDogcHJvdG8pCisgICAgfQorICAgIHRyeSBwcm90by53cml0ZU1hcEVuZCgpCisgIH0KKyAgCit9CisKKworZXh0ZW5zaW9uIFRNYXAgOiBDdXN0b21TdHJpbmdDb252ZXJ0aWJsZSwgQ3VzdG9tRGVidWdTdHJpbmdDb252ZXJ0aWJsZSB7CisgIAorICBwdWJsaWMgdmFyIGRlc2NyaXB0aW9uIDogU3RyaW5nIHsKKyAgICByZXR1cm4gc3RvcmFnZS5kZXNjcmlwdGlvbgorICB9CisgIAorICBwdWJsaWMgdmFyIGRlYnVnRGVzY3JpcHRpb24gOiBTdHJpbmcgeworICAgIHJldHVybiBzdG9yYWdlLmRlYnVnRGVzY3JpcHRpb24KKyAgfQorICAKK30KKworcHVibGljIGZ1bmMgPT08S2V5LCBWYWx1ZT4obGhzOiBUTWFwPEtleSxWYWx1ZT4sIHJoczogVE1hcDxLZXksIFZhbHVlPikgLT4gQm9vbCB7CisgIGlmIGxocy5jb3VudCAhPSByaHMuY291bnQgeworICAgIHJldHVybiBmYWxzZQorICB9CisgIHJldHVybiBsaHMuc3RvcmFnZSA9PSByaHMuc3RvcmFnZQorfQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9UT2JqZWN0aXZlLUMuaCBiL2xpYi9jb2NvYS9zcmMvVE9iamVjdGl2ZS1DLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMDgzMWQuLjAwMDAwMDAKLS0tIGEvbGliL2NvY29hL3NyYy9UT2JqZWN0aXZlLUMuaAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIFRPYmplY3RpdmUtQy5oIGlzIGZvciBzdXBwb3J0aW5nIGNvZXhpc3RlbmNlIG9mIGJvdGggdGhlIEFSQyAoQXV0b21hdGljIAotICogUmVmZXJlbmNlIENvdW50aW5nKSBtb2RlIGFuZCB0aGUgTm9uLUFSQyBtb2RlIG9mIE9iamVjdGl2ZS1DIAotICogaW4gdGhlIHNhbWUgc291cmNlIGNvZGUuCi0gKgotICogICAgICAgICAgICAgICAgICAyMDExLzExLzE0ICBISVJBTk8gU2F0b3NoaSAoQUlTVCwgSmFwYW4pCi0gKgotICogQmVmb3JlOgotICoKLSAqICAgIHZhciA9IFthT2JqZWN0IHJldGFpbl07Ci0gKiAgICBbYU9iamVjdCByZWxlYXNlXTsKLSAqICAgIFthT2JqZWN0IGF1dG9yZWxlYXNlXTsKLSAqICAgIFtzdXBlciBkZWFsbG9jXTsKLSAqICAgIENGRnVuY3Rpb24ob2JqKTsKLSAqCi0gKiBBUkMgYW5kIE5vbi1BUkMgY29tcGF0aWJsZToKLSAqCi0gKiAgICAjaW1wb3J0ICJUT2JqZWN0aXZlLUMuaCIKLSAqICAgIHZhciA9IFthT2JqZWN0IHJldGFpbl9zdHViXTsKLSAqICAgIFthT2JqZWN0IHJlbGVhc2Vfc3R1Yl07Ci0gKiAgICBbYU9iamVjdCBhdXRvcmVsZWFzZV9zdHViXTsKLSAqICAgIFtzdXBlciBkZWFsbG9jX3N0dWJdOwotICogICAgQ0ZGdW5jdGlvbihicmlkZ2Vfc3R1YiBvYmopOwotICoKLSAqICAgIERvbid0IHVzZSByZXRhaW5fc3R1YiBmb3IgQHByb3BlcnR5KHJldGFpbikuCi0gKiAgICBVc2UgTlNBdXRvcmVsZWFzZVBvb2wgbGlrZSB0aGlzOgotICogICAgICAgICNpZiBfX2hhc19mZWF0dXJlKG9iamNfYXJjKQotICogICAgICAgICAgQGF1dG9yZWxlYXNlcG9vbCB7Ci0gKiAgICAgICAgICAgICAgLy8gY29kZSAKLSAqICAgICAgICAgIH0KLSAqICAgICAgICAjZWxzZQotICogICAgICAgICAgTlNBdXRvUmVsZWFzZVBvb2wgKnBvb2wgPSBbW05TQXV0b1JlbGVhc2VQb29sIGFsbG9jXSBpbml0Li4uCi0gKiAgICAgICAgICAvLyBjb2RlCi0gKiAgICAgICAgICBbcG9vbCByZWxlYXNlXTsKLSAqICAgICAgICAjZW5kaWYKLSAqLwotCi0KLSNpZiAhZGVmaW5lZChyZXRhaW5fc3R1YikKLSNpZiBfX2hhc19mZWF0dXJlKG9iamNfYXJjKQotI2RlZmluZSByZXRhaW5fc3R1YiBzZWxmCi0jZGVmaW5lIGF1dG9yZWxlYXNlX3N0dWIgc2VsZgotI2RlZmluZSByZWxlYXNlX3N0dWIgc2VsZgotI2RlZmluZSBkZWFsbG9jX3N0dWIgc2VsZgotI2RlZmluZSBicmlkZ2Vfc3R1YiBfX2JyaWRnZQotI2Vsc2UKLSNkZWZpbmUgcmV0YWluX3N0dWIgcmV0YWluCi0jZGVmaW5lIGF1dG9yZWxlYXNlX3N0dWIgYXV0b3JlbGVhc2UKLSNkZWZpbmUgcmVsZWFzZV9zdHViIHJlbGVhc2UKLSNkZWZpbmUgZGVhbGxvY19zdHViIGRlYWxsb2MKLSNkZWZpbmUgYnJpZGdlX3N0dWIKLSNlbmRpZgotI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL1RQcm9jZXNzb3IuaCBiL2xpYi9jb2NvYS9zcmMvVFByb2Nlc3Nvci5oCmluZGV4IDk4MGJlOTQuLjIwYzcyZTIgMTAwNjQ0Ci0tLSBhL2xpYi9jb2NvYS9zcmMvVFByb2Nlc3Nvci5oCisrKyBiL2xpYi9jb2NvYS9zcmMvVFByb2Nlc3Nvci5oCkBAIC0yMCwxMCArMjAsMTYgQEAKICNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgogI2ltcG9ydCAiVFByb3RvY29sLmgiCiAKK05TX0FTU1VNRV9OT05OVUxMX0JFR0lOCisKIAogQHByb3RvY29sIFRQcm9jZXNzb3IgPE5TT2JqZWN0PgogCi0tIChCT09MKSBwcm9jZXNzT25JbnB1dFByb3RvY29sOiAoaWQgPFRQcm90b2NvbD4pIGluUHJvdG9jb2wKLSAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2w6IChpZCA8VFByb3RvY29sPikgb3V0UHJvdG9jb2w7CistKEJPT0wpIHByb2Nlc3NPbklucHV0UHJvdG9jb2w6KGlkIDxUUHJvdG9jb2w+KWluUHJvdG9jb2wKKyAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbDooaWQgPFRQcm90b2NvbD4pb3V0UHJvdG9jb2wKKyAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqKillcnJvcjsKIAogQGVuZAorCisKK05TX0FTU1VNRV9OT05OVUxMX0VORApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9UUHJvY2Vzc29yRmFjdG9yeS5oIGIvbGliL2NvY29hL3NyYy9UUHJvY2Vzc29yRmFjdG9yeS5oCmluZGV4IDI5ZDEyYjMuLjg1MDIwYTUgMTAwNjQ0Ci0tLSBhL2xpYi9jb2NvYS9zcmMvVFByb2Nlc3NvckZhY3RvcnkuaAorKysgYi9saWIvY29jb2Evc3JjL1RQcm9jZXNzb3JGYWN0b3J5LmgKQEAgLTIwLDggKzIwLDE0IEBACiAjaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KICNpbXBvcnQgIlRQcm9jZXNzb3IuaCIKIAorTlNfQVNTVU1FX05PTk5VTExfQkVHSU4KKworCiBAcHJvdG9jb2wgVFByb2Nlc3NvckZhY3RvcnkgPE5TT2JqZWN0PgogCi0tIChpZDxUUHJvY2Vzc29yPikgcHJvY2Vzc29yRm9yVHJhbnNwb3J0OiAoaWQ8VFRyYW5zcG9ydD4pIHRyYW5zcG9ydDsKKy0oaWQ8VFByb2Nlc3Nvcj4pIHByb2Nlc3NvckZvclRyYW5zcG9ydDooaWQ8VFRyYW5zcG9ydD4pdHJhbnNwb3J0OwogCiBAZW5kCisKKworTlNfQVNTVU1FX05PTk5VTExfRU5ECmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL1RQcm90b2NvbC5zd2lmdCBiL2xpYi9jb2NvYS9zcmMvVFByb3RvY29sLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NzU4NDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL1RQcm90b2NvbC5zd2lmdApAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgRm91bmRhdGlvbgorCisKK3B1YmxpYyBleHRlbnNpb24gVFByb3RvY29sIHsKKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRNZXNzYWdlQmVnaW4oKSB0aHJvd3MgLT4gKFN0cmluZywgVE1lc3NhZ2VUeXBlLCBJbnQpIHsKKyAgICAKKyAgICB2YXIgbmFtZSA6IE5TU3RyaW5nPworICAgIHZhciB0eXBlIDogSW50MzIgPSAtMQorICAgIHZhciBzZXF1ZW5jZUlEIDogSW50MzIgPSAtMQorICAgIAorICAgIHRyeSByZWFkTWVzc2FnZUJlZ2luUmV0dXJuaW5nTmFtZSgmbmFtZSwgdHlwZTogJnR5cGUsIHNlcXVlbmNlSUQ6ICZzZXF1ZW5jZUlEKQorICAgIAorICAgIHJldHVybiAobmFtZSBhcyBTdHJpbmchLCBUTWVzc2FnZVR5cGUocmF3VmFsdWU6IHR5cGUpISwgSW50KHNlcXVlbmNlSUQpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lKG5hbWU6IFN0cmluZywgdHlwZTogVE1lc3NhZ2VUeXBlLCBzZXF1ZW5jZUlEOiBJbnQpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlTWVzc2FnZUJlZ2luV2l0aE5hbWUobmFtZSwgdHlwZTogdHlwZS5yYXdWYWx1ZSwgc2VxdWVuY2VJRDogSW50MzIoc2VxdWVuY2VJRCkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRTdHJ1Y3RCZWdpbigpIHRocm93cyAtPiAoU3RyaW5nPykgeworICAgIAorICAgIHZhciBuYW1lIDogTlNTdHJpbmc/ID0gbmlsCisgICAgCisgICAgdHJ5IHJlYWRTdHJ1Y3RCZWdpblJldHVybmluZ05hbWUoJm5hbWUpCisgICAgCisgICAgcmV0dXJuIChuYW1lIGFzIFN0cmluZz8pCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRGaWVsZEJlZ2luKCkgdGhyb3dzIC0+IChTdHJpbmc/LCBUVHlwZSwgSW50KSB7CisgICAgCisgICAgdmFyIG5hbWUgOiBOU1N0cmluZz8gPSBuaWwKKyAgICB2YXIgdHlwZSA6IEludDMyID0gLTEKKyAgICB2YXIgZmllbGRJRCA6IEludDMyID0gLTEKKyAgICAKKyAgICB0cnkgcmVhZEZpZWxkQmVnaW5SZXR1cm5pbmdOYW1lKCZuYW1lLCB0eXBlOiAmdHlwZSwgZmllbGRJRDogJmZpZWxkSUQpCisgICAgCisgICAgcmV0dXJuIChuYW1lIGFzIFN0cmluZz8sIFRUeXBlKHJhd1ZhbHVlOiB0eXBlKSEsIEludChmaWVsZElEKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVGaWVsZEJlZ2luV2l0aE5hbWUobmFtZTogU3RyaW5nLCB0eXBlOiBUVHlwZSwgZmllbGRJRDogSW50KSB0aHJvd3MgeworICAgIHRyeSB3cml0ZUZpZWxkQmVnaW5XaXRoTmFtZShuYW1lLCB0eXBlOiB0eXBlLnJhd1ZhbHVlLCBmaWVsZElEOiBJbnQzMihmaWVsZElEKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZE1hcEJlZ2luKCkgdGhyb3dzIC0+IChUVHlwZSwgVFR5cGUsIEludDMyKSB7CisgICAgCisgICAgdmFyIGtleVR5cGUgOiBJbnQzMiA9IC0xCisgICAgdmFyIHZhbHVlVHlwZSA6IEludDMyID0gLTEKKyAgICB2YXIgc2l6ZSA6IEludDMyID0gMAorICAgIAorICAgIHRyeSByZWFkTWFwQmVnaW5SZXR1cm5pbmdLZXlUeXBlKCZrZXlUeXBlLCB2YWx1ZVR5cGU6ICZ2YWx1ZVR5cGUsIHNpemU6ICZzaXplKQorICAgIAorICAgIHJldHVybiAoVFR5cGUocmF3VmFsdWU6IGtleVR5cGUpISwgVFR5cGUocmF3VmFsdWU6IHZhbHVlVHlwZSkhLCBzaXplKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZU1hcEJlZ2luV2l0aEtleVR5cGUoa2V5VHlwZTogVFR5cGUsIHZhbHVlVHlwZTogVFR5cGUsIHNpemU6IEludCkgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGVNYXBCZWdpbldpdGhLZXlUeXBlKGtleVR5cGUucmF3VmFsdWUsIHZhbHVlVHlwZTogdmFsdWVUeXBlLnJhd1ZhbHVlLCBzaXplOiBJbnQzMihzaXplKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZFNldEJlZ2luKCkgdGhyb3dzIC0+IChUVHlwZSwgSW50MzIpIHsKKyAgICAKKyAgICB2YXIgZWxlbWVudFR5cGUgOiBJbnQzMiA9IC0xCisgICAgdmFyIHNpemUgOiBJbnQzMiA9IDAKKyAgICAKKyAgICB0cnkgcmVhZFNldEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGUoJmVsZW1lbnRUeXBlLCBzaXplOiAmc2l6ZSkKKyAgICAKKyAgICByZXR1cm4gKFRUeXBlKHJhd1ZhbHVlOiBlbGVtZW50VHlwZSkhLCBzaXplKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZVNldEJlZ2luV2l0aEVsZW1lbnRUeXBlKGVsZW1lbnRUeXBlOiBUVHlwZSwgc2l6ZTogSW50KSB0aHJvd3MgeworICAgIHRyeSB3cml0ZVNldEJlZ2luV2l0aEVsZW1lbnRUeXBlKGVsZW1lbnRUeXBlLnJhd1ZhbHVlLCBzaXplOiBJbnQzMihzaXplKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZExpc3RCZWdpbigpIHRocm93cyAtPiAoVFR5cGUsIEludDMyKSB7CisgICAgCisgICAgdmFyIGVsZW1lbnRUeXBlIDogSW50MzIgPSAtMQorICAgIHZhciBzaXplIDogSW50MzIgPSAwCisgICAgCisgICAgdHJ5IHJlYWRMaXN0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZSgmZWxlbWVudFR5cGUsIHNpemU6ICZzaXplKQorICAgIAorICAgIHJldHVybiAoVFR5cGUocmF3VmFsdWU6IGVsZW1lbnRUeXBlKSEsIHNpemUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlTGlzdEJlZ2luV2l0aEVsZW1lbnRUeXBlKGVsZW1lbnRUeXBlOiBUVHlwZSwgc2l6ZTogSW50KSB0aHJvd3MgeworICAgIHRyeSB3cml0ZUxpc3RCZWdpbldpdGhFbGVtZW50VHlwZShlbGVtZW50VHlwZS5yYXdWYWx1ZSwgc2l6ZTogSW50MzIoc2l6ZSkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlRmllbGRWYWx1ZTxUOiBUU2VyaWFsaXphYmxlPih2YWx1ZTogVCwgbmFtZTogU3RyaW5nLCB0eXBlOiBUVHlwZSwgaWQ6IEludDMyKSB0aHJvd3MgeworICAgIHRyeSB3cml0ZUZpZWxkQmVnaW5XaXRoTmFtZShuYW1lLCB0eXBlOiB0eXBlLnJhd1ZhbHVlLCBmaWVsZElEOiBpZCkKKyAgICB0cnkgd3JpdGVWYWx1ZSh2YWx1ZSkKKyAgICB0cnkgd3JpdGVGaWVsZEVuZCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRWYWx1ZTxUOiBUU2VyaWFsaXphYmxlPigpIHRocm93cyAtPiBUIHsKKyAgICByZXR1cm4gdHJ5IFQucmVhZFZhbHVlRnJvbVByb3RvY29sKHNlbGYpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlVmFsdWU8VDogVFNlcmlhbGl6YWJsZT4odmFsdWU6IFQpIHRocm93cyB7CisgICAgdHJ5IFQud3JpdGVWYWx1ZSh2YWx1ZSwgdG9Qcm90b2NvbDogc2VsZikKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZFJlc3VsdE1lc3NhZ2VCZWdpbigpIHRocm93cyB7CisgICAgCisgICAgbGV0IChfLCB0eXBlLCBfKSA9IHRyeSByZWFkTWVzc2FnZUJlZ2luKCk7CisgICAgCisgICAgaWYgdHlwZSA9PSAuRVhDRVBUSU9OIHsKKyAgICAgIGxldCB4ID0gdHJ5IHJlYWRFeGNlcHRpb24oKQorICAgICAgdGhyb3cgeAorICAgIH0KKyAgICAKKyAgICByZXR1cm4KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgdmFsaWRhdGVWYWx1ZSh2YWx1ZTogQW55PywgbmFtZWQgbmFtZTogU3RyaW5nKSB0aHJvd3MgeworICAgIAorICAgIGlmIHZhbHVlID09IG5pbCB7CisgICAgICB0aHJvdyBOU0Vycm9yKAorICAgICAgICBkb21haW46IFRQcm90b2NvbEVycm9yRG9tYWluLAorICAgICAgICBjb2RlOiBJbnQoVFByb3RvY29sRXJyb3IuVW5rbm93bi5yYXdWYWx1ZSksCisgICAgICAgIHVzZXJJbmZvOiBbVFByb3RvY29sRXJyb3JGaWVsZE5hbWVLZXk6IG5hbWVdKQorICAgIH0KKyAgICAKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZEV4Y2VwdGlvbigpIHRocm93cyAtPiBFcnJvclR5cGUgeworICAgIAorICAgIHZhciByZWFzb24gOiBTdHJpbmc/CisgICAgdmFyIHR5cGUgPSBUQXBwbGljYXRpb25FcnJvci5Vbmtub3duCisgICAgCisgICAgdHJ5IHJlYWRTdHJ1Y3RCZWdpbigpCisgICAgCisgICAgZmllbGRzOiB3aGlsZSAodHJ1ZSkgeworICAgICAgCisgICAgICBsZXQgKF8sIGZpZWxkVHlwZSwgZmllbGRJRCkgPSB0cnkgcmVhZEZpZWxkQmVnaW4oKQorICAgICAgCisgICAgICBzd2l0Y2ggKGZpZWxkSUQsIGZpZWxkVHlwZSkgeworICAgICAgY2FzZSAoXywgLlNUT1ApOgorICAgICAgICBicmVhayBmaWVsZHMKKyAgICAgICAgCisgICAgICBjYXNlICgxLCAuU1RSSU5HKToKKyAgICAgICAgcmVhc29uID0gdHJ5IHJlYWRWYWx1ZSgpIGFzIFN0cmluZworICAgICAgICAKKyAgICAgIGNhc2UgKDIsIC5JMzIpOgorICAgICAgICBsZXQgdHlwZVZhbCA9IHRyeSByZWFkVmFsdWUoKSBhcyBJbnQzMgorICAgICAgICBpZiBsZXQgdG1wID0gVEFwcGxpY2F0aW9uRXJyb3IocmF3VmFsdWU6IHR5cGVWYWwpIHsKKyAgICAgICAgICB0eXBlID0gdG1wCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICBjYXNlIGxldCAoXywgdW5rbm93blR5cGUpOgorICAgICAgICB0cnkgc2tpcFR5cGUodW5rbm93blR5cGUpCisgICAgICB9CisgICAgICAKKyAgICAgIHRyeSByZWFkRmllbGRFbmQoKQorICAgIH0KKyAgICAKKyAgICB0cnkgcmVhZFN0cnVjdEVuZCgpCisgICAgCisgICAgcmV0dXJuIE5TRXJyb3IodHlwZTp0eXBlLCByZWFzb246cmVhc29uID8/ICIiKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZUV4Y2VwdGlvbkZvck1lc3NhZ2VOYW1lKG5hbWU6IFN0cmluZywgc2VxdWVuY2VJRDogSW50LCBleDogTlNFcnJvcikgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGVNZXNzYWdlQmVnaW5XaXRoTmFtZShuYW1lLCB0eXBlOiAuRVhDRVBUSU9OLCBzZXF1ZW5jZUlEOiBzZXF1ZW5jZUlEKQorICAgIHRyeSBleC53cml0ZShzZWxmKQorICAgIHRyeSB3cml0ZU1lc3NhZ2VFbmQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyBza2lwVHlwZSh0eXBlOiBUVHlwZSkgdGhyb3dzIHsKKyAgICB0cnkgVFByb3RvY29sVXRpbC5za2lwVHlwZSh0eXBlLnJhd1ZhbHVlLCBvblByb3RvY29sOiBzZWxmKQorICB9CisgIAorfQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9UU2VyaWFsaXphYmxlLnN3aWZ0IGIvbGliL2NvY29hL3NyYy9UU2VyaWFsaXphYmxlLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZGZkNDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL1RTZXJpYWxpemFibGUuc3dpZnQKQEAgLTAsMCArMSwxNzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW1wb3J0IEZvdW5kYXRpb24KKworCitwdWJsaWMgcHJvdG9jb2wgVFNlcmlhbGl6YWJsZSA6IEhhc2hhYmxlIHsKKyAgCisgIHN0YXRpYyB2YXIgdGhyaWZ0VHlwZSA6IFRUeXBlIHsgZ2V0IH0KKyAgCisgIGluaXQoKQorICAKKyAgc3RhdGljIGZ1bmMgcmVhZFZhbHVlRnJvbVByb3RvY29sKHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiBTZWxmCisgIAorICBzdGF0aWMgZnVuYyB3cml0ZVZhbHVlKHZhbHVlOiBTZWxmLCB0b1Byb3RvY29sIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cworICAKK30KKworCisKK2luZml4IG9wZXJhdG9yID89PSB7fQorCitwdWJsaWMgZnVuYyA/PT08VDogVFNlcmlhbGl6YWJsZT4obGhzOiBUPywgcmhzOiBUPykgLT4gQm9vbCB7CisgIGlmIGxldCBsID0gbGhzLCByID0gcmhzIHsKKyAgICByZXR1cm4gbCA9PSByCisgIH0KKyAgcmV0dXJuIGxocyA9PSByaHMKK30KKworcHVibGljIGZ1bmMgPz09PFQ6IFRTZXJpYWxpemFibGU+KGxoczogVCwgcmhzOiBUKSAtPiBCb29sIHsKKyAgcmV0dXJuIGxocyA9PSByaHMKK30KKworCisKK2V4dGVuc2lvbiBCb29sIDogVFNlcmlhbGl6YWJsZSB7CisgIAorICBwdWJsaWMgc3RhdGljIGxldCB0aHJpZnRUeXBlID0gVFR5cGUuQk9PTAorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWRWYWx1ZUZyb21Qcm90b2NvbChwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gQm9vbCB7CisgICAgdmFyIHZhbHVlIDogT2JqQ0Jvb2wgPSBmYWxzZQorICAgIHRyeSBwcm90by5yZWFkQm9vbCgmdmFsdWUpCisgICAgcmV0dXJuIHZhbHVlLmJvb2xWYWx1ZQorICB9CisgIAorICBwdWJsaWMgc3RhdGljIGZ1bmMgd3JpdGVWYWx1ZSh2YWx1ZTogQm9vbCwgdG9Qcm90b2NvbCBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZUJvb2wodmFsdWUpCisgIH0KKyAgCit9CisKK2V4dGVuc2lvbiBJbnQ4IDogVFNlcmlhbGl6YWJsZSB7CisgIAorICBwdWJsaWMgc3RhdGljIGxldCB0aHJpZnRUeXBlID0gVFR5cGUuQllURQorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWRWYWx1ZUZyb21Qcm90b2NvbChwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gSW50OCB7CisgICAgdmFyIHZhbHVlID0gVUludDgoKQorICAgIHRyeSBwcm90by5yZWFkQnl0ZSgmdmFsdWUpCisgICAgcmV0dXJuIEludDgodmFsdWUpCisgIH0KKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyB3cml0ZVZhbHVlKHZhbHVlOiBJbnQ4LCB0b1Byb3RvY29sIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHByb3RvLndyaXRlQnl0ZShVSW50OCh2YWx1ZSkpCisgIH0KKyAgCit9CisKK2V4dGVuc2lvbiBJbnQxNiA6IFRTZXJpYWxpemFibGUgeworICAKKyAgcHVibGljIHN0YXRpYyBsZXQgdGhyaWZ0VHlwZSA9IFRUeXBlLkkxNgorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWRWYWx1ZUZyb21Qcm90b2NvbChwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gSW50MTYgeworICAgIHZhciB2YWx1ZSA9IEludDE2KCkKKyAgICB0cnkgcHJvdG8ucmVhZEkxNigmdmFsdWUpCisgICAgcmV0dXJuIHZhbHVlCisgIH0KKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyB3cml0ZVZhbHVlKHZhbHVlOiBJbnQxNiwgdG9Qcm90b2NvbCBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZUkxNih2YWx1ZSkKKyAgfQorICAKK30KKworZXh0ZW5zaW9uIEludCA6IFRTZXJpYWxpemFibGUgeworICAKKyAgcHVibGljIHN0YXRpYyBsZXQgdGhyaWZ0VHlwZSA9IFRUeXBlLkkzMgorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWRWYWx1ZUZyb21Qcm90b2NvbChwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gSW50IHsKKyAgICB2YXIgdmFsdWUgPSBJbnQzMigpCisgICAgdHJ5IHByb3RvLnJlYWRJMzIoJnZhbHVlKQorICAgIHJldHVybiBJbnQodmFsdWUpCisgIH0KKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyB3cml0ZVZhbHVlKHZhbHVlOiBJbnQsIHRvUHJvdG9jb2wgcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGVJMzIoSW50MzIodmFsdWUpKQorICB9CisgIAorfQorCitleHRlbnNpb24gSW50MzIgOiBUU2VyaWFsaXphYmxlIHsKKyAgCisgIHB1YmxpYyBzdGF0aWMgbGV0IHRocmlmdFR5cGUgPSBUVHlwZS5JMzIKKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkVmFsdWVGcm9tUHJvdG9jb2wocHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IEludDMyIHsKKyAgICB2YXIgdmFsdWUgPSBJbnQzMigpCisgICAgdHJ5IHByb3RvLnJlYWRJMzIoJnZhbHVlKQorICAgIHJldHVybiB2YWx1ZQorICB9CisgIAorICBwdWJsaWMgc3RhdGljIGZ1bmMgd3JpdGVWYWx1ZSh2YWx1ZTogSW50MzIsIHRvUHJvdG9jb2wgcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGVJMzIodmFsdWUpCisgIH0KKyAgCit9CisKK2V4dGVuc2lvbiBJbnQ2NCA6IFRTZXJpYWxpemFibGUgeworICAKKyAgcHVibGljIHN0YXRpYyBsZXQgdGhyaWZ0VHlwZSA9IFRUeXBlLkk2NAorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWRWYWx1ZUZyb21Qcm90b2NvbChwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gSW50NjQgeworICAgIHZhciB2YWx1ZSA9IEludDY0KCkKKyAgICB0cnkgcHJvdG8ucmVhZEk2NCgmdmFsdWUpCisgICAgcmV0dXJuIHZhbHVlCisgIH0KKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyB3cml0ZVZhbHVlKHZhbHVlOiBJbnQ2NCwgdG9Qcm90b2NvbCBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZUk2NCh2YWx1ZSkKKyAgfQorICAKK30KKworZXh0ZW5zaW9uIERvdWJsZSA6IFRTZXJpYWxpemFibGUgeworICAKKyAgcHVibGljIHN0YXRpYyBsZXQgdGhyaWZ0VHlwZSA9IFRUeXBlLkRPVUJMRQorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWRWYWx1ZUZyb21Qcm90b2NvbChwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gRG91YmxlIHsKKyAgICB2YXIgdmFsdWUgPSBEb3VibGUoKQorICAgIHRyeSBwcm90by5yZWFkRG91YmxlKCZ2YWx1ZSkKKyAgICByZXR1cm4gdmFsdWUKKyAgfQorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHdyaXRlVmFsdWUodmFsdWU6IERvdWJsZSwgdG9Qcm90b2NvbCBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZURvdWJsZSh2YWx1ZSkKKyAgfQorICAKK30KKworZXh0ZW5zaW9uIFN0cmluZyA6IFRTZXJpYWxpemFibGUgeworICAKKyAgcHVibGljIHN0YXRpYyBsZXQgdGhyaWZ0VHlwZSA9IFRUeXBlLlNUUklORworICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWRWYWx1ZUZyb21Qcm90b2NvbChwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gU3RyaW5nIHsKKyAgICB2YXIgdmFsdWUgOiBOU1N0cmluZz8KKyAgICB0cnkgcHJvdG8ucmVhZFN0cmluZygmdmFsdWUpCisgICAgcmV0dXJuIHZhbHVlIGFzISBTdHJpbmcKKyAgfQorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHdyaXRlVmFsdWUodmFsdWU6IFN0cmluZywgdG9Qcm90b2NvbCBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZVN0cmluZyh2YWx1ZSkKKyAgfQorICAKK30KZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVFNldC5zd2lmdCBiL2xpYi9jb2NvYS9zcmMvVFNldC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTgzM2U1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy9UU2V0LnN3aWZ0CkBAIC0wLDAgKzEsMTYxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBGb3VuZGF0aW9uCisKKworcHVibGljIHN0cnVjdCBUU2V0PEVsZW1lbnQgOiBUU2VyaWFsaXphYmxlPiA6IENvbGxlY3Rpb25UeXBlLCBBcnJheUxpdGVyYWxDb252ZXJ0aWJsZSwgVFNlcmlhbGl6YWJsZSB7CisgIAorICBwdWJsaWMgc3RhdGljIHZhciB0aHJpZnRUeXBlIDogVFR5cGUgeyByZXR1cm4gLlNFVCB9CisgIAorICBwdWJsaWMgdHlwZWFsaWFzIEluZGV4ID0gU3RvcmFnZS5JbmRleAorICAKKyAgdHlwZWFsaWFzIFN0b3JhZ2UgPSBTZXQ8RWxlbWVudD4KKyAgCisgIHByaXZhdGUgdmFyIHN0b3JhZ2UgOiBTdG9yYWdlCisgIAorICBwdWJsaWMgaW5pdCgpIHsKKyAgICBzdG9yYWdlID0gU3RvcmFnZSgpCisgIH0KKyAgCisgIHB1YmxpYyBpbml0KGFycmF5TGl0ZXJhbCBlbGVtZW50czogRWxlbWVudC4uLikgeworICAgIHN0b3JhZ2UgPSBTdG9yYWdlKGVsZW1lbnRzKQorICB9CisgIAorICBwdWJsaWMgaW5pdDxTIDogU2VxdWVuY2VUeXBlIHdoZXJlIFMuR2VuZXJhdG9yLkVsZW1lbnQgPT0gRWxlbWVudD4oXyBzZXF1ZW5jZTogUykgeworICAgIHN0b3JhZ2UgPSBTdG9yYWdlKHNlcXVlbmNlKSAgICAKKyAgfQorICAKKyAgcHVibGljIHZhciBzdGFydEluZGV4IDogSW5kZXggeyByZXR1cm4gc3RvcmFnZS5zdGFydEluZGV4IH0KKyAgCisgIHB1YmxpYyB2YXIgZW5kSW5kZXggOiBJbmRleCB7IHJldHVybiBzdG9yYWdlLmVuZEluZGV4IH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIGluc2VydChtZW1iZXI6IEVsZW1lbnQpIHsKKyAgICByZXR1cm4gc3RvcmFnZS5pbnNlcnQobWVtYmVyKQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyByZW1vdmUoZWxlbWVudDogRWxlbWVudCkgLT4gRWxlbWVudD8geworICAgIHJldHVybiBzdG9yYWdlLnJlbW92ZShlbGVtZW50KQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyByZW1vdmVBbGwoa2VlcENhcGFjaXR5IGtlZXBDYXBhY2l0eTogQm9vbCA9IGZhbHNlKSB7CisgICAgcmV0dXJuIHN0b3JhZ2UucmVtb3ZlQWxsKGtlZXBDYXBhY2l0eToga2VlcENhcGFjaXR5KQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyByZW1vdmVBdEluZGV4KGluZGV4OiBTZXRJbmRleDxFbGVtZW50PikgLT4gRWxlbWVudCB7CisgICAgcmV0dXJuIHN0b3JhZ2UucmVtb3ZlQXRJbmRleChpbmRleCkKKyAgfQorICAKKyAgcHVibGljIHN1YnNjcmlwdCAocG9zaXRpb246IFNldEluZGV4PEVsZW1lbnQ+KSAtPiBFbGVtZW50IHsKKyAgICByZXR1cm4gc3RvcmFnZVtwb3NpdGlvbl0KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgdW5pb24ob3RoZXI6IFRTZXQpIC0+IFRTZXQgeworICAgIHJldHVybiBUU2V0KHN0b3JhZ2UudW5pb24ob3RoZXIpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyBpbnRlcnNlY3Qob3RoZXI6IFRTZXQpIC0+IFRTZXQgeworICAgIHJldHVybiBUU2V0KHN0b3JhZ2UuaW50ZXJzZWN0KG90aGVyKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgZXhjbHVzaXZlT3Iob3RoZXI6IFRTZXQpIC0+IFRTZXQgeworICAgIHJldHVybiBUU2V0KHN0b3JhZ2UuZXhjbHVzaXZlT3Iob3RoZXIpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyBzdWJ0cmFjdChvdGhlcjogVFNldCkgLT4gVFNldCB7CisgICAgcmV0dXJuIFRTZXQoc3RvcmFnZS5zdWJ0cmFjdChvdGhlcikpCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIGludGVyc2VjdEluUGxhY2Uob3RoZXI6IFRTZXQpIHsKKyAgICBzdG9yYWdlLmludGVyc2VjdEluUGxhY2Uob3RoZXIpCisgIH0KKworICBwdWJsaWMgbXV0YXRpbmcgZnVuYyBleGNsdXNpdmVPckluUGxhY2Uob3RoZXI6IFRTZXQpIHsKKyAgICBzdG9yYWdlLmV4Y2x1c2l2ZU9ySW5QbGFjZShvdGhlcikKKyAgfQorCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIHN1YnRyYWN0SW5QbGFjZShvdGhlcjogVFNldCkgeworICAgIHN0b3JhZ2Uuc3VidHJhY3RJblBsYWNlKG90aGVyKQorICB9ICAKKworICBwdWJsaWMgZnVuYyBpc1N1YnNldE9mKG90aGVyOiBUU2V0KSAtPiBCb29sIHsKKyAgICByZXR1cm4gc3RvcmFnZS5pc1N1YnNldE9mKG90aGVyKQorICB9CisKKyAgcHVibGljIGZ1bmMgaXNEaXNqb2ludFdpdGgob3RoZXI6IFRTZXQpIC0+IEJvb2wgeworICAgIHJldHVybiBzdG9yYWdlLmlzRGlzam9pbnRXaXRoKG90aGVyKQorICB9CisgIAorICBwdWJsaWMgZnVuYyBpc1N1cGVyc2V0T2Yob3RoZXI6IFRTZXQpIC0+IEJvb2wgeworICAgIHJldHVybiBzdG9yYWdlLmlzU3VwZXJzZXRPZihvdGhlcikKKyAgfQorCisgIHB1YmxpYyB2YXIgaXNFbXB0eTogQm9vbCB7IHJldHVybiBzdG9yYWdlLmlzRW1wdHkgfQorCisgIHB1YmxpYyB2YXIgaGFzaFZhbHVlIDogSW50IHsKKyAgICBsZXQgcHJpbWUgPSAzMQorICAgIHZhciByZXN1bHQgPSAxCisgICAgZm9yIGVsZW1lbnQgaW4gc3RvcmFnZSB7CisgICAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArIGVsZW1lbnQuaGFzaFZhbHVlCisgICAgfQorICAgIHJldHVybiByZXN1bHQKKyAgfQorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWRWYWx1ZUZyb21Qcm90b2NvbChwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gVFNldCB7CisgICAgbGV0IChlbGVtZW50VHlwZSwgc2l6ZSkgPSB0cnkgcHJvdG8ucmVhZFNldEJlZ2luKCkKKyAgICBpZiBlbGVtZW50VHlwZSAhPSBFbGVtZW50LnRocmlmdFR5cGUgeworICAgICAgdGhyb3cgTlNFcnJvcigKKyAgICAgICAgZG9tYWluOiBUUHJvdG9jb2xFcnJvckRvbWFpbiwKKyAgICAgICAgY29kZTogSW50KFRQcm90b2NvbEVycm9yLkludmFsaWREYXRhLnJhd1ZhbHVlKSwKKyAgICAgICAgdXNlckluZm86IFtUUHJvdG9jb2xFcnJvckV4dGVuZGVkRXJyb3JLZXk6IE5TTnVtYmVyKGludDogZWxlbWVudFR5cGUucmF3VmFsdWUpXSkKKyAgICB9CisgICAgdmFyIHNldCA9IFRTZXQoKQorICAgIGZvciBfIGluIDAuLjxzaXplIHsKKyAgICAgIGxldCBlbGVtZW50ID0gdHJ5IEVsZW1lbnQucmVhZFZhbHVlRnJvbVByb3RvY29sKHByb3RvKQorICAgICAgc2V0LnN0b3JhZ2UuaW5zZXJ0KGVsZW1lbnQpCisgICAgfQorICAgIHRyeSBwcm90by5yZWFkU2V0RW5kKCkKKyAgICByZXR1cm4gc2V0CisgIH0KKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyB3cml0ZVZhbHVlKHZhbHVlOiBUU2V0LCB0b1Byb3RvY29sIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHByb3RvLndyaXRlU2V0QmVnaW5XaXRoRWxlbWVudFR5cGUoRWxlbWVudC50aHJpZnRUeXBlLCBzaXplOiB2YWx1ZS5jb3VudCkKKyAgICBmb3IgZWxlbWVudCBpbiB2YWx1ZS5zdG9yYWdlIHsKKyAgICAgIHRyeSBFbGVtZW50LndyaXRlVmFsdWUoZWxlbWVudCwgdG9Qcm90b2NvbDogcHJvdG8pCisgICAgfQorICAgIHRyeSBwcm90by53cml0ZVNldEVuZCgpCisgIH0KKyAgCit9CisKK2V4dGVuc2lvbiBUU2V0IDogQ3VzdG9tU3RyaW5nQ29udmVydGlibGUsIEN1c3RvbURlYnVnU3RyaW5nQ29udmVydGlibGUgeworICAKKyAgcHVibGljIHZhciBkZXNjcmlwdGlvbiA6IFN0cmluZyB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZGVzY3JpcHRpb24KKyAgfQorICAKKyAgcHVibGljIHZhciBkZWJ1Z0Rlc2NyaXB0aW9uIDogU3RyaW5nIHsKKyAgICByZXR1cm4gc3RvcmFnZS5kZWJ1Z0Rlc2NyaXB0aW9uCisgIH0KKyAgCit9CisKK3B1YmxpYyBmdW5jID09PEVsZW1lbnQ+KGxoczogVFNldDxFbGVtZW50PiwgcmhzOiBUU2V0PEVsZW1lbnQ+KSAtPiBCb29sIHsKKyAgcmV0dXJuIGxocy5zdG9yYWdlID09IHJocy5zdG9yYWdlCit9CmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL1RTaGFyZWRQcm9jZXNzb3JGYWN0b3J5LmggYi9saWIvY29jb2Evc3JjL1RTaGFyZWRQcm9jZXNzb3JGYWN0b3J5LmgKaW5kZXggY2Y0YTQ2Mi4uYzc1ZmFkMSAxMDA2NDQKLS0tIGEvbGliL2NvY29hL3NyYy9UU2hhcmVkUHJvY2Vzc29yRmFjdG9yeS5oCisrKyBiL2xpYi9jb2NvYS9zcmMvVFNoYXJlZFByb2Nlc3NvckZhY3RvcnkuaApAQCAtMjAsOCArMjAsOSBAQAogI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+CiAjaW1wb3J0ICJUUHJvY2Vzc29yRmFjdG9yeS5oIgogCi1AaW50ZXJmYWNlIFRTaGFyZWRQcm9jZXNzb3JGYWN0b3J5IDogTlNPYmplY3QgPFRQcm9jZXNzb3JGYWN0b3J5PiB7Ci0gIGlkPFRQcm9jZXNzb3I+IG1TaGFyZWRQcm9jZXNzb3I7Ci19Ci0tIChpZCkgaW5pdFdpdGhTaGFyZWRQcm9jZXNzb3I6IChpZDxUUHJvY2Vzc29yPikgc2hhcmVkUHJvY2Vzc29yOworCitAaW50ZXJmYWNlIFRTaGFyZWRQcm9jZXNzb3JGYWN0b3J5IDogTlNPYmplY3QgPFRQcm9jZXNzb3JGYWN0b3J5PgorCistKGlkKSBpbml0V2l0aFNoYXJlZFByb2Nlc3NvcjooaWQ8VFByb2Nlc3Nvcj4pc2hhcmVkUHJvY2Vzc29yOworCiBAZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL1RTaGFyZWRQcm9jZXNzb3JGYWN0b3J5Lm0gYi9saWIvY29jb2Evc3JjL1RTaGFyZWRQcm9jZXNzb3JGYWN0b3J5Lm0KaW5kZXggYTAwMDdjMC4uM2Q1NWY0NyAxMDA2NDQKLS0tIGEvbGliL2NvY29hL3NyYy9UU2hhcmVkUHJvY2Vzc29yRmFjdG9yeS5tCisrKyBiL2xpYi9jb2NvYS9zcmMvVFNoYXJlZFByb2Nlc3NvckZhY3RvcnkubQpAQCAtMTksMzQgKzE5LDMxIEBACiAKIAogI2ltcG9ydCAiVFNoYXJlZFByb2Nlc3NvckZhY3RvcnkuaCIKLSNpbXBvcnQgIlRPYmplY3RpdmUtQy5oIgorCisKK0BpbnRlcmZhY2UgVFNoYXJlZFByb2Nlc3NvckZhY3RvcnkgKCkKKworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBpZDxUUHJvY2Vzc29yPiBzaGFyZWRQcm9jZXNzb3I7CisKK0BlbmQKIAogCiBAaW1wbGVtZW50YXRpb24gVFNoYXJlZFByb2Nlc3NvckZhY3RvcnkKIAogCi0tIChpZCkgaW5pdFdpdGhTaGFyZWRQcm9jZXNzb3I6IChpZDxUUHJvY2Vzc29yPikgc2hhcmVkUHJvY2Vzc29yCistKGlkKSBpbml0V2l0aFNoYXJlZFByb2Nlc3NvcjooaWQ8VFByb2Nlc3Nvcj4pc2hhcmVkUHJvY2Vzc29yCiB7CiAgIHNlbGYgPSBbc3VwZXIgaW5pdF07Ci0gIGlmICghc2VsZikgewotICAgIHJldHVybiBuaWw7CisgIGlmIChzZWxmKSB7CisgICAgX3NoYXJlZFByb2Nlc3NvciA9IHNoYXJlZFByb2Nlc3NvcjsKICAgfQotICAKLSAgbVNoYXJlZFByb2Nlc3NvciA9IFtzaGFyZWRQcm9jZXNzb3IgcmV0YWluX3N0dWJdOworCiAgIHJldHVybiBzZWxmOwogfQogCi0KLS0gKHZvaWQpIGRlYWxsb2MKKy0oaWQ8VFByb2Nlc3Nvcj4pIHByb2Nlc3NvckZvclRyYW5zcG9ydDooaWQ8VFRyYW5zcG9ydD4pdHJhbnNwb3J0CiB7Ci0gIFttU2hhcmVkUHJvY2Vzc29yIHJlbGVhc2Vfc3R1Yl07Ci0gIFtzdXBlciBkZWFsbG9jX3N0dWJdOwotfQotCi0KLS0gKGlkPFRQcm9jZXNzb3I+KSBwcm9jZXNzb3JGb3JUcmFuc3BvcnQ6IChpZDxUVHJhbnNwb3J0PikgdHJhbnNwb3J0Ci17Ci0gIHJldHVybiBbW21TaGFyZWRQcm9jZXNzb3IgcmV0YWluX3N0dWJdIGF1dG9yZWxlYXNlX3N0dWJdOworICByZXR1cm4gX3NoYXJlZFByb2Nlc3NvcjsKIH0KIAogQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9UU3RydWN0LnN3aWZ0IGIvbGliL2NvY29hL3NyYy9UU3RydWN0LnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlYTcyZTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL1RTdHJ1Y3Quc3dpZnQKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgRm91bmRhdGlvbgorCisKK3B1YmxpYyBwcm90b2NvbCBUU3RydWN0IDogVFNlcmlhbGl6YWJsZSB7Cit9CisKKworcHVibGljIGV4dGVuc2lvbiBUU3RydWN0IHsKKyAgCisgIHB1YmxpYyBzdGF0aWMgdmFyIHRocmlmdFR5cGUgOiBUVHlwZSB7IHJldHVybiBUVHlwZS5TVFJVQ1QgfQorICAKK30KZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVGhyaWZ0LmggYi9saWIvY29jb2Evc3JjL1RocmlmdC5oCmluZGV4IDljZWRiNjYuLmQwMTgyNmQgMTAwNjQ0Ci0tLSBhL2xpYi9jb2NvYS9zcmMvVGhyaWZ0LmgKKysrIGIvbGliL2NvY29hL3NyYy9UaHJpZnQuaApAQCAtMTcsNCArMTcsNCBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2RlZmluZSBUaHJpZnRWZXJzaW9uIEAiMC45LjMiCisjZGVmaW5lIFRocmlmdFZlcnNpb24gQCIxLjAuMCIKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVEJhc2UuaCBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVEJhc2UuaAppbmRleCAzMzAzN2VmLi45OTM1ZDUwIDEwMDY0NAotLS0gYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RCYXNlLmgKKysrIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UQmFzZS5oCkBAIC0yNiwxNiArMjYsMjEgQEAKIC8qKgogICogRGUtc2VyaWFsaXplIG9iamVjdCBmcm9tIHRoZSBnaXZlbiBpbnB1dCBwcm90b2NvbAogICoKLSAqIEBwYXJhbSBpbnB1dCBwcm90b2NvbCB1c2VkIGZvciByZWFkaW5nIAorICogQHBhcmFtIGluUHJvdG9jb2wgcHJvdG9jb2wgdXNlZCBmb3IgcmVhZGluZwogICovCi0tICh2b2lkKSByZWFkOiAoaWQgPFRQcm90b2NvbD4pIGluUHJvdG9jb2w7CistKEJPT0wpIHJlYWQ6KGlkIDxUUHJvdG9jb2w+KWluUHJvdG9jb2wgZXJyb3I6KE5TRXJyb3IgKiopZXJyb3I7CiAKIC8qKgogICogU2VyaWFsaXplIG9iamVjdCB0byB0aGUgZ2l2ZW4gcHJvdG9jb2wKICAqCi0gKiBAcGFyYW0gYnVmIG91dHB1dCBwcm90b2NvbCB1c2VkIGZvciB3cml0aW5nCisgKiBAcGFyYW0gb3V0UHJvdG9jb2wgb3V0cHV0IHByb3RvY29sIHVzZWQgZm9yIHdyaXRpbmcKICAqLwotLSAodm9pZCkgd3JpdGU6IChpZCA8VFByb3RvY29sPikgb3V0UHJvdG9jb2w7CistKEJPT0wpIHdyaXRlOihpZCA8VFByb3RvY29sPilvdXRQcm90b2NvbCBlcnJvcjooTlNFcnJvciAqKillcnJvcjsKKworCisvKioKKyAqIFZhbGlkYXRlIHJlcXVpcmVkIGZpZWxkcworICovCistKEJPT0wpIHZhbGlkYXRlOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKilfX3RocmlmdEVycm9yOwogCiBAZW5kCi0KZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmggYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oCmluZGV4IDlhNzM3MzAuLmJiOTBmYWQgMTAwNjQ0Ci0tLSBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmgKKysrIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaApAQCAtMjEsMzEgKzIxLDI5IEBACiAjaW1wb3J0ICJUVHJhbnNwb3J0LmgiCiAjaW1wb3J0ICJUUHJvdG9jb2xGYWN0b3J5LmgiCiAKK05TX0FTU1VNRV9OT05OVUxMX0JFR0lOCiAKLUBpbnRlcmZhY2UgVEJpbmFyeVByb3RvY29sIDogTlNPYmplY3QgPFRQcm90b2NvbD4gewotICBpZCA8VFRyYW5zcG9ydD4gbVRyYW5zcG9ydDsKLSAgQk9PTCBtU3RyaWN0UmVhZDsKLSAgQk9PTCBtU3RyaWN0V3JpdGU7Ci0gIGludDMyX3QgbU1lc3NhZ2VTaXplTGltaXQ7Ci19CiAKLS0gKGlkKSBpbml0V2l0aFRyYW5zcG9ydDogKGlkIDxUVHJhbnNwb3J0PikgdHJhbnNwb3J0OworQGludGVyZmFjZSBUQmluYXJ5UHJvdG9jb2wgOiBOU09iamVjdCA8VFByb3RvY29sPgogCi0tIChpZCkgaW5pdFdpdGhUcmFuc3BvcnQ6IChpZCA8VFRyYW5zcG9ydD4pIHRyYW5zcG9ydAotICAgICAgICAgICAgICBzdHJpY3RSZWFkOiAoQk9PTCkgc3RyaWN0UmVhZAotICAgICAgICAgICAgIHN0cmljdFdyaXRlOiAoQk9PTCkgc3RyaWN0V3JpdGU7CitAcHJvcGVydHkgKGFzc2lnbiwgbm9uYXRvbWljKSBVSW50MzIgbWVzc2FnZVNpemVMaW1pdDsKIAotLSAoaW50MzJfdCkgbWVzc2FnZVNpemVMaW1pdDsKLS0gKHZvaWQpIHNldE1lc3NhZ2VTaXplTGltaXQ6IChpbnQzMl90KSBzaXplTGltaXQ7CistKGlkKSBpbml0V2l0aFRyYW5zcG9ydDooaWQgPFRUcmFuc3BvcnQ+KXRyYW5zcG9ydDsKKworLShpZCkgaW5pdFdpdGhUcmFuc3BvcnQ6KGlkIDxUVHJhbnNwb3J0Pil0cmFuc3BvcnQKKyAgICAgICAgICAgICBzdHJpY3RSZWFkOihCT09MKXN0cmljdFJlYWQKKyAgICAgICAgICAgIHN0cmljdFdyaXRlOihCT09MKXN0cmljdFdyaXRlOworCitAZW5kOworCisKK0BpbnRlcmZhY2UgVEJpbmFyeVByb3RvY29sRmFjdG9yeSA6IE5TT2JqZWN0IDxUUHJvdG9jb2xGYWN0b3J5PgorCisrKFRCaW5hcnlQcm90b2NvbEZhY3RvcnkgKikgc2hhcmVkRmFjdG9yeTsKKworLShUQmluYXJ5UHJvdG9jb2wgKikgbmV3UHJvdG9jb2xPblRyYW5zcG9ydDooaWQgPFRUcmFuc3BvcnQ+KXRyYW5zcG9ydDsKIAogQGVuZAogCiAKLUBpbnRlcmZhY2UgVEJpbmFyeVByb3RvY29sRmFjdG9yeSA6IE5TT2JqZWN0IDxUUHJvdG9jb2xGYWN0b3J5PiB7Ci19Ci0KLSsgKFRCaW5hcnlQcm90b2NvbEZhY3RvcnkgKikgc2hhcmVkRmFjdG9yeTsKLQotLSAoVEJpbmFyeVByb3RvY29sICopIG5ld1Byb3RvY29sT25UcmFuc3BvcnQ6IChpZCA8VFRyYW5zcG9ydD4pIHRyYW5zcG9ydDsKLQotQGVuZAorTlNfQVNTVU1FX05PTk5VTExfRU5EClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wubSBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLm0KaW5kZXggODQ3YzcyMy4uMWY5ZTU3YSAxMDA2NDQKLS0tIGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wubQorKysgYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5tCkBAIC0xOCw2MyArMTgsMjAgQEAKICAqLwogCiAjaW1wb3J0ICJUQmluYXJ5UHJvdG9jb2wuaCIKLSNpbXBvcnQgIlRQcm90b2NvbEV4Y2VwdGlvbi5oIgotI2ltcG9ydCAiVE9iamVjdGl2ZS1DLmgiCisjaW1wb3J0ICJUUHJvdG9jb2xFcnJvci5oIgogCi0vKiBJbiB0aGUgbW9kZXJuIHByb3RvY29sLCB2ZXJzaW9uIGlzIHN0b3JlZCBpbiB0aGUgaGlnaCBoYWxmIG9mIGFuIGludDMyLgotICogVGhlIGxvdyBoYWxmIGNvbnRhaW5zIHR5cGUgaW5mby4gKi8KLXN0YXRpYyBjb25zdCB1aW50MTZfdCBWRVJTSU9OXzEgPSAweDgwMDE7CiAKLU5TX0lOTElORSBzaXplX3QKLUNoZWNrZWRDYXN0SW50MzJUb1NpemVUKGludDMyX3Qgc2l6ZSkKLXsKLSAgaWYgKHNpemUgPCAwKSB7Ci0gICAgTlNTdHJpbmcgKnJlYXNvbiA9IFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OgotICAgICAgICAgICAgICAgICAgICAgICAgQCIlczogcmVmdXNpbmcgdG8gcmVhZCBkYXRhIHdpdGggbmVnYXRpdmUgc2l6ZTogJSJQUklkMzIsCi0gICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgc2l6ZV07Ci0gICAgQHRocm93IFtUUHJvdG9jb2xFeGNlcHRpb24KLSAgICAgICAgICAgIGV4Y2VwdGlvbldpdGhOYW1lOiBAIlRQcm90b2NvbEV4Y2VwdGlvbiIKLSAgICAgICAgICAgIHJlYXNvbjogcmVhc29uXTsKLSAgfQotICBzaXplX3QgY2hlY2tlZFNpemUgPSAoc2l6ZV90KXNpemU7Ci0gIHJldHVybiBjaGVja2VkU2l6ZTsKLX0KK3N0YXRpYyBTSW50MzIgVkVSU0lPTl8xID0gMHg4MDAxMDAwMDsKK3N0YXRpYyBTSW50MzIgVkVSU0lPTl9NQVNLID0gMHhmZmZmMDAwMDsKIAotTlNfSU5MSU5FIGludDMyX3QKLUNoZWNrZWRDYXN0U2l6ZVRUb0ludDMyKHNpemVfdCBzaXplKQotewotICBpZiAoc2l6ZSA+IElOVDMyX01BWCkgewotICAgIE5TU3RyaW5nICpyZWFzb24gPSBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIEAiJXM6IGRhdGEgc2l6ZSBleGNlZWRzIHZhbHVlcyByZXByZXNlbnRhYmxlIGJ5IGEgMzItYml0IHNpZ25lZCBpbnRlZ2VyOiAlenUiLAotICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHNpemVdOwotICAgIEB0aHJvdyBbVFByb3RvY29sRXhjZXB0aW9uCi0gICAgICAgICAgICBleGNlcHRpb25XaXRoTmFtZTogQCJUUHJvdG9jb2xFeGNlcHRpb24iCi0gICAgICAgICAgICByZWFzb246IHJlYXNvbl07Ci0gIH0KLSAgaW50MzJfdCBjaGVja2VkU2l6ZSA9IChpbnQzMl90KXNpemU7Ci0gIHJldHVybiBjaGVja2VkU2l6ZTsKLX0KIAotTlNfSU5MSU5FIHVpbnQ4X3QKLUNoZWNrZWRDYXN0SW50VG9VSW50OChpbnQgc2l6ZSkKLXsKLSAgaWYgKHNpemUgPiBVSU5UOF9NQVgpIHsKLSAgICBOU1N0cmluZyAqcmVhc29uID0gW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBAIiVzOiBkYXRhIHNpemUgZXhjZWVkcyB2YWx1ZXMgcmVwcmVzZW50YWJsZSBieSBhIDgtYml0IHVuc2lnbmVkIGludGVnZXI6ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBzaXplXTsKLSAgICBAdGhyb3cgW1RQcm90b2NvbEV4Y2VwdGlvbgotICAgICAgICAgICAgZXhjZXB0aW9uV2l0aE5hbWU6IEAiVFByb3RvY29sRXhjZXB0aW9uIgotICAgICAgICAgICAgcmVhc29uOiByZWFzb25dOwotICB9Ci0gIHVpbnQ4X3QgY2hlY2tlZFNpemUgPSAodWludDhfdClzaXplOwotICByZXR1cm4gY2hlY2tlZFNpemU7Ci19CitzdGF0aWMgVEJpbmFyeVByb3RvY29sRmFjdG9yeSAqZ1NoYXJlZEZhY3RvcnkgPSBuaWw7CiAKLXN0YXRpYyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5ICogZ1NoYXJlZEZhY3RvcnkgPSBuaWw7CiAKIEBpbXBsZW1lbnRhdGlvbiBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5CiAKLSsgKFRCaW5hcnlQcm90b2NvbEZhY3RvcnkgKikgc2hhcmVkRmFjdG9yeSB7CisrKFRCaW5hcnlQcm90b2NvbEZhY3RvcnkgKikgc2hhcmVkRmFjdG9yeQorewogICBpZiAoZ1NoYXJlZEZhY3RvcnkgPT0gbmlsKSB7CiAgICAgZ1NoYXJlZEZhY3RvcnkgPSBbW1RCaW5hcnlQcm90b2NvbEZhY3RvcnkgYWxsb2NdIGluaXRdOwogICB9CkBAIC04MiwzNjMgKzM5LDU1MyBAQAogICByZXR1cm4gZ1NoYXJlZEZhY3Rvcnk7CiB9CiAKLS0gKFRCaW5hcnlQcm90b2NvbCAqKSBuZXdQcm90b2NvbE9uVHJhbnNwb3J0OiAoaWQgPFRUcmFuc3BvcnQ+KSB0cmFuc3BvcnQgewotICByZXR1cm4gW1tUQmluYXJ5UHJvdG9jb2wgYWxsb2NdIGluaXRXaXRoVHJhbnNwb3J0OiB0cmFuc3BvcnRdOworLShOU1N0cmluZyAqKSBwcm90b2NvbE5hbWUKK3sKKyAgcmV0dXJuIEAiYmluYXJ5IjsKK30KKworLShUQmluYXJ5UHJvdG9jb2wgKikgbmV3UHJvdG9jb2xPblRyYW5zcG9ydDooaWQgPFRUcmFuc3BvcnQ+KXRyYW5zcG9ydAoreworICByZXR1cm4gW1tUQmluYXJ5UHJvdG9jb2wgYWxsb2NdIGluaXRXaXRoVHJhbnNwb3J0OnRyYW5zcG9ydF07CiB9CiAKIEBlbmQKIAogCitAaW50ZXJmYWNlIFRCaW5hcnlQcm90b2NvbCAoKQorCitAcHJvcGVydHkoc3Ryb25nLCBub25hdG9taWMpIGlkIDxUVHJhbnNwb3J0PiB0cmFuc3BvcnQ7CisKK0Bwcm9wZXJ0eShhc3NpZ24sIG5vbmF0b21pYykgQk9PTCBzdHJpY3RSZWFkOworQHByb3BlcnR5KGFzc2lnbiwgbm9uYXRvbWljKSBCT09MIHN0cmljdFdyaXRlOworCitAcHJvcGVydHkoc3Ryb25nLCBub25hdG9taWMpIE5TU3RyaW5nICpjdXJyZW50TWVzc2FnZU5hbWU7CitAcHJvcGVydHkoc3Ryb25nLCBub25hdG9taWMpIE5TU3RyaW5nICpjdXJyZW50RmllbGROYW1lOworCitAZW5kCisKIAogQGltcGxlbWVudGF0aW9uIFRCaW5hcnlQcm90b2NvbAogCi0tIChpZCkgaW5pdFdpdGhUcmFuc3BvcnQ6IChpZCA8VFRyYW5zcG9ydD4pIHRyYW5zcG9ydAorLShpZCkgaW5pdFdpdGhUcmFuc3BvcnQ6KGlkIDxUVHJhbnNwb3J0PilhVHJhbnNwb3J0CiB7Ci0gIHJldHVybiBbc2VsZiBpbml0V2l0aFRyYW5zcG9ydDogdHJhbnNwb3J0IHN0cmljdFJlYWQ6IE5PIHN0cmljdFdyaXRlOiBZRVNdOworICByZXR1cm4gW3NlbGYgaW5pdFdpdGhUcmFuc3BvcnQ6YVRyYW5zcG9ydCBzdHJpY3RSZWFkOk5PIHN0cmljdFdyaXRlOllFU107CiB9CiAKLS0gKGlkKSBpbml0V2l0aFRyYW5zcG9ydDogKGlkIDxUVHJhbnNwb3J0PikgdHJhbnNwb3J0Ci0gICAgICAgICAgICAgIHN0cmljdFJlYWQ6IChCT09MKSBzdHJpY3RSZWFkCi0gICAgICAgICAgICAgc3RyaWN0V3JpdGU6IChCT09MKSBzdHJpY3RXcml0ZQorLShpZCkgaW5pdFdpdGhUcmFuc3BvcnQ6KGlkIDxUVHJhbnNwb3J0Pil0cmFuc3BvcnQKKyAgICAgICAgICAgICBzdHJpY3RSZWFkOihCT09MKXN0cmljdFJlYWQKKyAgICAgICAgICAgIHN0cmljdFdyaXRlOihCT09MKXN0cmljdFdyaXRlCiB7CiAgIHNlbGYgPSBbc3VwZXIgaW5pdF07Ci0gIG1UcmFuc3BvcnQgPSBbdHJhbnNwb3J0IHJldGFpbl9zdHViXTsKLSAgbVN0cmljdFJlYWQgPSBzdHJpY3RSZWFkOwotICBtU3RyaWN0V3JpdGUgPSBzdHJpY3RXcml0ZTsKKyAgaWYgKHNlbGYpIHsKKyAgICBfdHJhbnNwb3J0ID0gdHJhbnNwb3J0OworICAgIF9zdHJpY3RSZWFkID0gc3RyaWN0UmVhZDsKKyAgICBfc3RyaWN0V3JpdGUgPSBzdHJpY3RXcml0ZTsKKyAgfQogICByZXR1cm4gc2VsZjsKIH0KIAotCi0tIChpbnQzMl90KSBtZXNzYWdlU2l6ZUxpbWl0CistKGlkIDxUVHJhbnNwb3J0PikgdHJhbnNwb3J0CiB7Ci0gIHJldHVybiBtTWVzc2FnZVNpemVMaW1pdDsKKyAgcmV0dXJuIF90cmFuc3BvcnQ7CiB9CiAKLQotLSAodm9pZCkgc2V0TWVzc2FnZVNpemVMaW1pdDogKGludDMyX3QpIHNpemVMaW1pdAorLShOU1N0cmluZyAqKSByZWFkU3RyaW5nQm9keTooaW50KXNpemUgZXJyb3I6KE5TRXJyb3IgKiopZXJyb3IKIHsKLSAgbU1lc3NhZ2VTaXplTGltaXQgPSBzaXplTGltaXQ7Ci19Ci0KLQotLSAodm9pZCkgZGVhbGxvYwotewotICBbbVRyYW5zcG9ydCByZWxlYXNlX3N0dWJdOwotICBbc3VwZXIgZGVhbGxvY19zdHViXTsKLX0KLQotCi0tIChpZCA8VFRyYW5zcG9ydD4pIHRyYW5zcG9ydAotewotICByZXR1cm4gbVRyYW5zcG9ydDsKLX0KLQotCi0tIChOU1N0cmluZyAqKSByZWFkU3RyaW5nQm9keTogKGludCkgcmF3U2l6ZQotewotICBzaXplX3Qgc2l6ZSA9IENoZWNrZWRDYXN0SW50MzJUb1NpemVUKHJhd1NpemUpOwotICBjaGFyICogYnVmZmVyID0gbWFsbG9jKHNpemUrMSk7Ci0gIGlmICghYnVmZmVyKSB7Ci0gICAgQHRocm93IFtUUHJvdG9jb2xFeGNlcHRpb24gZXhjZXB0aW9uV2l0aE5hbWU6IEAiVFByb3RvY29sRXhjZXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDogQCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGluICVzLCBzaXplOiAlenUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19QUkVUVFlfRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVdXTs7CisgIE5TTXV0YWJsZURhdGEgKmRhdGEgPSBbTlNNdXRhYmxlRGF0YSBkYXRhV2l0aExlbmd0aDpzaXplXTsKKyAgaWYgKCFkYXRhKSB7CisgICAgUFJPVE9DT0xfRVJST1IobmlsLCBVbmtub3duLCBAIlVuYWJsZSB0byBhbGxvY2F0ZSAlZCBieXRlcyIsIHNpemUpOwogICB9Ci0gIFttVHJhbnNwb3J0IHJlYWRBbGw6ICh1aW50OF90ICopIGJ1ZmZlciBvZmZzZXQ6IDAgbGVuZ3RoOiBzaXplXTsKLSAgYnVmZmVyW3NpemVdID0gMDsKLSAgTlNTdHJpbmcgKiByZXN1bHQgPSBbTlNTdHJpbmcgc3RyaW5nV2l0aFVURjhTdHJpbmc6IGJ1ZmZlcl07Ci0gIGZyZWUoYnVmZmVyKTsKLSAgcmV0dXJuIHJlc3VsdDsKKworICBpZiAoIVtfdHJhbnNwb3J0IHJlYWRBbGw6ZGF0YS5tdXRhYmxlQnl0ZXMgb2Zmc2V0OjAgbGVuZ3RoOnNpemUgZXJyb3I6ZXJyb3JdKSB7CisgICAgUFJPVE9DT0xfVFJBTlNQT1JUX0VSUk9SKG5pbCwgZXJyb3IsIEAiVHJhbnNwb3J0IHJlYWQgZmFpbGVkIik7CisgIH0KKworICByZXR1cm4gW1tOU1N0cmluZyBhbGxvY10gaW5pdFdpdGhEYXRhOmRhdGEgZW5jb2Rpbmc6TlNVVEY4U3RyaW5nRW5jb2RpbmddOwogfQogCiAKLS0gKHZvaWQpIHJlYWRNZXNzYWdlQmVnaW5SZXR1cm5pbmdOYW1lOiAoTlNTdHJpbmcgKiopIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAoaW50ICopIHR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOiAoaW50ICopIHNlcXVlbmNlSUQKKy0oQk9PTCkgcmVhZE1lc3NhZ2VCZWdpblJldHVybmluZ05hbWU6KE5TU3RyaW5nICoqKW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6KFNJbnQzMiAqKXR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6KFNJbnQzMiAqKXNlcXVlbmNlSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIGludDMyX3Qgc2l6ZSA9IFtzZWxmIHJlYWRJMzJdOworICBTSW50MzIgc2l6ZTsKKyAgaWYgKCFbc2VsZiByZWFkSTMyOiZzaXplIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorICA7CisKICAgaWYgKHNpemUgPCAwKSB7Ci0gICAgLyogVmVyc2lvbiAodW5zaWduZWQpIGlzIHN0b3JlZCBpbiB0aGUgaGlnaCBoYWxmd29yZC4gKi8KLSAgICB1aW50MTZfdCB2ZXJzaW9uID0gKHNpemUgPj4gMTYpICYgMHhGRkZGOworICAgIGludCB2ZXJzaW9uID0gc2l6ZSAmIFZFUlNJT05fTUFTSzsKICAgICBpZiAodmVyc2lvbiAhPSBWRVJTSU9OXzEpIHsKLSAgICAgIE5TU3RyaW5nICpyZWFzb24gPSBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQCIlczogRXhwZWN0ZWQgdmVyc2lvbiAlIlBSSXUxNiIsIGluc3RlYWQgZm91bmQ6ICUiUFJJdTE2LAotICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgVkVSU0lPTl8xLCB2ZXJzaW9uXTsKLSAgICAgIEB0aHJvdyBbVFByb3RvY29sRXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhOYW1lOiBAIlRQcm90b2NvbEV4Y2VwdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjogcmVhc29uXTsKKyAgICAgIFBST1RPQ09MX0VSUk9SKE5PLCBCYWRWZXJzaW9uLCBAIkJhZCBtZXNzYWdlIHZlcnNpb24iKTsKICAgICB9CiAgICAgaWYgKHR5cGUgIT0gTlVMTCkgewogICAgICAgKnR5cGUgPSBzaXplICYgMHgwMEZGOwogICAgIH0KLSAgICBOU1N0cmluZyAqIG1lc3NhZ2VOYW1lID0gW3NlbGYgcmVhZFN0cmluZ107CisgICAgTlNTdHJpbmcgKm1lc3NhZ2VOYW1lOworICAgIGlmICghW3NlbGYgcmVhZFN0cmluZzombWVzc2FnZU5hbWUgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorICAgIGlmIChuYW1lICE9IG5pbCkgeworICAgICAgKm5hbWUgPSBtZXNzYWdlTmFtZTsKKyAgICB9CisgIH0KKyAgZWxzZSB7CisKKyAgICBpZiAoX3N0cmljdFJlYWQpIHsKKyAgICAgIFBST1RPQ09MX0VSUk9SKE5PLCBJbnZhbGlkRGF0YSwgQCJNaXNzaW5nIG1lc3NhZ2UgdmVyc2lvbiwgb2xkIGNsaWVudD8iKTsKKyAgICB9CisKKyAgICBpZiAoX21lc3NhZ2VTaXplTGltaXQgPiAwICYmIHNpemUgPiBfbWVzc2FnZVNpemVMaW1pdCkgeworICAgICAgUFJPVE9DT0xfRVJST1IoTk8sIFNpemVMaW1pdCwgQCJNZXNzYWdlIGV4Y2VlZWRzIHNpemUgbGltaXQgb2YgJWQiLCAoaW50KXNpemUpOworICAgIH0KKworICAgIE5TU3RyaW5nICptZXNzYWdlTmFtZSA9IFtzZWxmIHJlYWRTdHJpbmdCb2R5OnNpemUgZXJyb3I6ZXJyb3JdOworICAgIGlmICghbWVzc2FnZU5hbWUpIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisKICAgICBpZiAobmFtZSAhPSBOVUxMKSB7CiAgICAgICAqbmFtZSA9IG1lc3NhZ2VOYW1lOwogICAgIH0KLSAgICBpbnQgc2VxSUQgPSBbc2VsZiByZWFkSTMyXTsKLSAgICBpZiAoc2VxdWVuY2VJRCAhPSBOVUxMKSB7Ci0gICAgICAqc2VxdWVuY2VJRCA9IHNlcUlEOworCisgICAgVUludDggbWVzc2FnZVR5cGU7CisgICAgaWYgKCFbc2VsZiByZWFkQnl0ZTombWVzc2FnZVR5cGUgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CiAgICAgfQotICB9IGVsc2UgewotICAgIGlmIChtU3RyaWN0UmVhZCkgewotICAgICAgQHRocm93IFtUUHJvdG9jb2xFeGNlcHRpb24gZXhjZXB0aW9uV2l0aE5hbWU6IEAiVFByb3RvY29sRXhjZXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBAIk1pc3NpbmcgdmVyc2lvbiBpbiByZWFkTWVzc2FnZUJlZ2luLCBvbGQgY2xpZW50PyJdOwotICAgIH0KLSAgICBpZiAoW3NlbGYgbWVzc2FnZVNpemVMaW1pdF0gPiAwICYmIHNpemUgPiBbc2VsZiBtZXNzYWdlU2l6ZUxpbWl0XSkgewotICAgICAgQHRocm93IFtUUHJvdG9jb2xFeGNlcHRpb24gZXhjZXB0aW9uV2l0aE5hbWU6IEAiVFByb3RvY29sRXhjZXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OiBAIk1lc3NhZ2UgdG9vIGJpZy4gIFNpemUgbGltaXQgaXM6ICVkIE1lc3NhZ2Ugc2l6ZSBpczogJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWVzc2FnZVNpemVMaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV1dOwotICAgIH0KLSAgICBOU1N0cmluZyAqIG1lc3NhZ2VOYW1lID0gW3NlbGYgcmVhZFN0cmluZ0JvZHk6IHNpemVdOwotICAgIGlmIChuYW1lICE9IE5VTEwpIHsKLSAgICAgICpuYW1lID0gbWVzc2FnZU5hbWU7Ci0gICAgfQotICAgIGludCBtZXNzYWdlVHlwZSA9IFtzZWxmIHJlYWRCeXRlXTsKKwogICAgIGlmICh0eXBlICE9IE5VTEwpIHsKICAgICAgICp0eXBlID0gbWVzc2FnZVR5cGU7CiAgICAgfQotICAgIGludCBzZXFJRCA9IFtzZWxmIHJlYWRJMzJdOwotICAgIGlmIChzZXF1ZW5jZUlEICE9IE5VTEwpIHsKLSAgICAgICpzZXF1ZW5jZUlEID0gc2VxSUQ7Ci0gICAgfQogICB9CisKKyAgU0ludDMyIHNlcUlEOworICBpZiAoIVtzZWxmIHJlYWRJMzI6JnNlcUlEIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorICBpZiAoc2VxdWVuY2VJRCAhPSBOVUxMKSB7CisgICAgKnNlcXVlbmNlSUQgPSBzZXFJRDsKKyAgfQorCisgIHJldHVybiBZRVM7CiB9CiAKIAotLSAodm9pZCkgcmVhZE1lc3NhZ2VFbmQge30KLQotCi0tICh2b2lkKSByZWFkU3RydWN0QmVnaW5SZXR1cm5pbmdOYW1lOiAoTlNTdHJpbmcgKiopIG5hbWUKKy0oQk9PTCkgcmVhZE1lc3NhZ2VFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIGlmIChuYW1lICE9IE5VTEwpIHsKLSAgICAqbmFtZSA9IG5pbDsKLSAgfQorICByZXR1cm4gWUVTOwogfQogCiAKLS0gKHZvaWQpIHJlYWRTdHJ1Y3RFbmQge30KLQotCi0tICh2b2lkKSByZWFkRmllbGRCZWdpblJldHVybmluZ05hbWU6IChOU1N0cmluZyAqKikgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAoaW50ICopIGZpZWxkVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOiAoaW50ICopIGZpZWxkSUQKKy0oQk9PTCkgcmVhZFN0cnVjdEJlZ2luUmV0dXJuaW5nTmFtZTooTlNTdHJpbmcgKl9fYXV0b3JlbGVhc2luZyAqKW5hbWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIGlmIChuYW1lICE9IE5VTEwpIHsKKyAgcmV0dXJuIFlFUzsKK30KKworCistKEJPT0wpIHJlYWRTdHJ1Y3RFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBZRVM7Cit9CisKKworLShCT09MKSByZWFkRmllbGRCZWdpblJldHVybmluZ05hbWU6KE5TU3RyaW5nICpfX2F1dG9yZWxlYXNpbmcgKiluYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTooU0ludDMyICopZmllbGRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDooU0ludDMyICopZmllbGRJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIGlmIChuYW1lICE9IG5pbCkgewogICAgICpuYW1lID0gbmlsOwogICB9Ci0gIGludCBmdCA9IFtzZWxmIHJlYWRCeXRlXTsKKworICBVSW50OCBmdDsKKyAgaWYgKCFbc2VsZiByZWFkQnl0ZTomZnQgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CiAgIGlmIChmaWVsZFR5cGUgIT0gTlVMTCkgewogICAgICpmaWVsZFR5cGUgPSBmdDsKICAgfQotICBpZiAoZnQgIT0gVFR5cGVfU1RPUCkgewotICAgIGludCBmaWQgPSBbc2VsZiByZWFkSTE2XTsKKyAgaWYgKGZ0ICE9IFRUeXBlU1RPUCkgeworICAgIFNJbnQxNiBmaWQ7CisgICAgaWYgKCFbc2VsZiByZWFkSTE2OiZmaWQgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQogICAgIGlmIChmaWVsZElEICE9IE5VTEwpIHsKICAgICAgICpmaWVsZElEID0gZmlkOwogICAgIH0KICAgfQorICByZXR1cm4gWUVTOwogfQogCiAKLS0gKHZvaWQpIHJlYWRGaWVsZEVuZCB7fQotCi0KLS0gKGludDMyX3QpIHJlYWRJMzIKKy0oQk9PTCkgcmVhZEZpZWxkRW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICB1aW50OF90IGkzMnJkWzRdOwotICBbbVRyYW5zcG9ydCByZWFkQWxsOiBpMzJyZCBvZmZzZXQ6IDAgbGVuZ3RoOiA0XTsKLSAgcmV0dXJuCisgIHJldHVybiBZRVM7Cit9CisKKworLShCT09MKSByZWFkU3RyaW5nOihOU1N0cmluZyAqX19hdXRvcmVsZWFzaW5nICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFNJbnQzMiBzaXplOworICBpZiAoIVtzZWxmIHJlYWRJMzI6JnNpemUgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgTlNTdHJpbmcgKnN0cmluZyA9IFtzZWxmIHJlYWRTdHJpbmdCb2R5OnNpemUgZXJyb3I6ZXJyb3JdOworICBpZiAoIXN0cmluZykgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgICp2YWx1ZSA9IHN0cmluZzsKKworICByZXR1cm4gWUVTOworfQorCisKKy0oQk9PTCkgcmVhZEJvb2w6KEJPT0wgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDggYnl0ZTsKKyAgaWYgKCFbc2VsZiByZWFkQnl0ZTomYnl0ZSBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICAqdmFsdWUgPSBieXRlID09IDE7CisKKyAgcmV0dXJuIFlFUzsKK30KKworCistKEJPT0wpIHJlYWRCeXRlOihVSW50OCAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50OCBidWZmWzFdOworICBpZiAoIVtfdHJhbnNwb3J0IHJlYWRBbGw6YnVmZiBvZmZzZXQ6MCBsZW5ndGg6MSBlcnJvcjplcnJvcl0pIHsKKyAgICBQUk9UT0NPTF9UUkFOU1BPUlRfRVJST1IoTk8sIGVycm9yLCBAIlRyYW5zcG9ydCByZWFkIGZhaWxlZCIpOworICB9CisKKyAgKnZhbHVlID0gYnVmZlswXTsKKworICByZXR1cm4gWUVTOworfQorCisKKy0oQk9PTCkgcmVhZEkxNjooU0ludDE2ICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQ4IGJ1ZmZbMl07CisgIGlmICghW190cmFuc3BvcnQgcmVhZEFsbDpidWZmIG9mZnNldDowIGxlbmd0aDoyIGVycm9yOmVycm9yXSkgeworICAgIFBST1RPQ09MX1RSQU5TUE9SVF9FUlJPUihOTywgZXJyb3IsIEAiVHJhbnNwb3J0IHJlYWQgZmFpbGVkIik7CisgIH0KKworICAqdmFsdWUgPQorICAgICgoU0ludDE2KShidWZmWzBdICYgMHhmZikgPDwgOCkgfAorICAgICgoU0ludDE2KShidWZmWzFdICYgMHhmZikpOworCisgIHJldHVybiBZRVM7Cit9CisKKworLShCT09MKSByZWFkSTMyOihTSW50MzIgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDggaTMycmRbNF07CisgIGlmICghW190cmFuc3BvcnQgcmVhZEFsbDppMzJyZCBvZmZzZXQ6MCBsZW5ndGg6NCBlcnJvcjplcnJvcl0pIHsKKyAgICBQUk9UT0NPTF9UUkFOU1BPUlRfRVJST1IoTk8sIGVycm9yLCBAIlRyYW5zcG9ydCByZWFkIGZhaWxlZCIpOworICB9CisKKyAgKnZhbHVlID0KICAgICAoKGkzMnJkWzBdICYgMHhmZikgPDwgMjQpIHwKICAgICAoKGkzMnJkWzFdICYgMHhmZikgPDwgMTYpIHwKICAgICAoKGkzMnJkWzJdICYgMHhmZikgPDwgIDgpIHwKICAgICAoKGkzMnJkWzNdICYgMHhmZikpOworCisgIHJldHVybiBZRVM7CiB9CiAKIAotLSAoTlNTdHJpbmcgKikgcmVhZFN0cmluZworLShCT09MKSByZWFkSTY0OihTSW50NjQgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgaW50MzJfdCBzaXplID0gW3NlbGYgcmVhZEkzMl07Ci0gIHJldHVybiBbc2VsZiByZWFkU3RyaW5nQm9keTogc2l6ZV07CisgIFVJbnQ4IGJ1ZmZbOF07CisgIGlmICghW190cmFuc3BvcnQgcmVhZEFsbDpidWZmIG9mZnNldDowIGxlbmd0aDo4IGVycm9yOmVycm9yXSkgeworICAgIFBST1RPQ09MX1RSQU5TUE9SVF9FUlJPUihOTywgZXJyb3IsIEAiVHJhbnNwb3J0IHJlYWQgZmFpbGVkIik7CisgIH0KKworICAqdmFsdWUgPQorICAgICgoU0ludDY0KShidWZmWzBdICYgMHhmZikgPDwgNTYpIHwKKyAgICAoKFNJbnQ2NCkoYnVmZlsxXSAmIDB4ZmYpIDw8IDQ4KSB8CisgICAgKChTSW50NjQpKGJ1ZmZbMl0gJiAweGZmKSA8PCA0MCkgfAorICAgICgoU0ludDY0KShidWZmWzNdICYgMHhmZikgPDwgMzIpIHwKKyAgICAoKFNJbnQ2NCkoYnVmZls0XSAmIDB4ZmYpIDw8IDI0KSB8CisgICAgKChTSW50NjQpKGJ1ZmZbNV0gJiAweGZmKSA8PCAxNikgfAorICAgICgoU0ludDY0KShidWZmWzZdICYgMHhmZikgPDwgIDgpIHwKKyAgICAoKFNJbnQ2NCkoYnVmZls3XSAmIDB4ZmYpKTsKKworICByZXR1cm4gWUVTOwogfQogCiAKLS0gKEJPT0wpIHJlYWRCb29sCi17Ci0gIHJldHVybiBbc2VsZiByZWFkQnl0ZV0gPT0gMTsKLX0KLQotLSAodWludDhfdCkgcmVhZEJ5dGUKLXsKLSAgdWludDhfdCBteUJ5dGU7Ci0gIFttVHJhbnNwb3J0IHJlYWRBbGw6ICZteUJ5dGUgb2Zmc2V0OiAwIGxlbmd0aDogMV07Ci0gIHJldHVybiBteUJ5dGU7Ci19Ci0KLS0gKHNob3J0KSByZWFkSTE2Ci17Ci0gIHVpbnQ4X3QgYnVmZlsyXTsKLSAgW21UcmFuc3BvcnQgcmVhZEFsbDogYnVmZiBvZmZzZXQ6IDAgbGVuZ3RoOiAyXTsKLSAgcmV0dXJuIChzaG9ydCkKLSAgICAoKChidWZmWzBdICYgMHhmZikgPDwgOCkgfAotICAgICAoKGJ1ZmZbMV0gJiAweGZmKSkpOwotfQotCi0tIChpbnQ2NF90KSByZWFkSTY0Ci17Ci0gIHVpbnQ4X3QgaTY0cmRbOF07Ci0gIFttVHJhbnNwb3J0IHJlYWRBbGw6IGk2NHJkIG9mZnNldDogMCBsZW5ndGg6IDhdOwotICByZXR1cm4KLSAgICAoKGludDY0X3QpKGk2NHJkWzBdICYgMHhmZikgPDwgNTYpIHwKLSAgICAoKGludDY0X3QpKGk2NHJkWzFdICYgMHhmZikgPDwgNDgpIHwKLSAgICAoKGludDY0X3QpKGk2NHJkWzJdICYgMHhmZikgPDwgNDApIHwKLSAgICAoKGludDY0X3QpKGk2NHJkWzNdICYgMHhmZikgPDwgMzIpIHwKLSAgICAoKGludDY0X3QpKGk2NHJkWzRdICYgMHhmZikgPDwgMjQpIHwKLSAgICAoKGludDY0X3QpKGk2NHJkWzVdICYgMHhmZikgPDwgMTYpIHwKLSAgICAoKGludDY0X3QpKGk2NHJkWzZdICYgMHhmZikgPDwgIDgpIHwKLSAgICAoKGludDY0X3QpKGk2NHJkWzddICYgMHhmZikpOwotfQotCi0tIChkb3VibGUpIHJlYWREb3VibGUKKy0oQk9PTCkgcmVhZERvdWJsZTooZG91YmxlICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7CiAgIC8vIEZJWE1FIC0gd2lsbCB0aGlzIGdldCB1cyBpbnRvIHRyb3VibGUgb24gUG93ZXJQQz8KLSAgaW50NjRfdCBpZWVlNzU0ID0gW3NlbGYgcmVhZEk2NF07Ci0gIHJldHVybiAqKChkb3VibGUgKikgJmllZWU3NTQpOworICByZXR1cm4gW3NlbGYgcmVhZEk2NDooU0ludDY0ICopdmFsdWUgZXJyb3I6ZXJyb3JdOwogfQogCiAKLS0gKE5TRGF0YSAqKSByZWFkQmluYXJ5CistKEJPT0wpIHJlYWRCaW5hcnk6KE5TRGF0YSAqX19hdXRvcmVsZWFzaW5nICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIGludDMyX3Qgc2l6ZSA9IFtzZWxmIHJlYWRJMzJdOwotICBzaXplX3QgYmluYXJ5U2l6ZSA9IENoZWNrZWRDYXN0SW50MzJUb1NpemVUKHNpemUpOwotICB1aW50OF90ICogYnVmZiA9IG1hbGxvYyhiaW5hcnlTaXplKTsKLSAgaWYgKGJ1ZmYgPT0gTlVMTCkgewotICAgIEB0aHJvdyBbVFByb3RvY29sRXhjZXB0aW9uCi0gICAgICAgICAgICAgZXhjZXB0aW9uV2l0aE5hbWU6IEAiVFByb3RvY29sRXhjZXB0aW9uIgotICAgICAgICAgICAgIHJlYXNvbjogW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6IEAiT3V0IG9mIG1lbW9yeS4gIFVuYWJsZSB0byBhbGxvY2F0ZSAlZCBieXRlcyB0cnlpbmcgdG8gcmVhZCBiaW5hcnkgZGF0YS4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVdXTsKKyAgU0ludDMyIHNpemU7CisgIGlmICghW3NlbGYgcmVhZEkzMjomc2l6ZSBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CiAgIH0KLSAgW21UcmFuc3BvcnQgcmVhZEFsbDogYnVmZiBvZmZzZXQ6IDAgbGVuZ3RoOiBiaW5hcnlTaXplXTsKLSAgcmV0dXJuIFtOU0RhdGEgZGF0YVdpdGhCeXRlc05vQ29weTogYnVmZiBsZW5ndGg6IGJpbmFyeVNpemVdOworCisgIE5TTXV0YWJsZURhdGEgKmRhdGEgPSBbTlNNdXRhYmxlRGF0YSBkYXRhV2l0aExlbmd0aDpzaXplXTsKKyAgaWYgKCFkYXRhKSB7CisgICAgUFJPVE9DT0xfRVJST1IoTk8sIFVua25vd24sIEAiVW5hYmxlIHRvIGFsbG9jYXRlICVkIGJ5dGVzIiwgKGludClzaXplKTsKKyAgfQorCisgIGlmICghW190cmFuc3BvcnQgcmVhZEFsbDpkYXRhLm11dGFibGVCeXRlcyBvZmZzZXQ6MCBsZW5ndGg6c2l6ZSBlcnJvcjplcnJvcl0pIHsKKyAgICBQUk9UT0NPTF9UUkFOU1BPUlRfRVJST1IoTk8sIGVycm9yLCBAIlRyYW5zcG9ydCByZWFkIGZhaWxlZCIpOworICB9CisKKyAgKnZhbHVlID0gZGF0YTsKKworICByZXR1cm4gWUVTOwogfQogCiAKLS0gKHZvaWQpIHJlYWRNYXBCZWdpblJldHVybmluZ0tleVR5cGU6IChpbnQgKikga2V5VHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlVHlwZTogKGludCAqKSB2YWx1ZVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IChpbnQgKikgc2l6ZQorLShCT09MKSByZWFkTWFwQmVnaW5SZXR1cm5pbmdLZXlUeXBlOihTSW50MzIgKilrZXlUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVR5cGU6KFNJbnQzMiAqKXZhbHVlVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOihTSW50MzIgKilzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIGludCBrdCA9IFtzZWxmIHJlYWRCeXRlXTsKLSAgaW50IHZ0ID0gW3NlbGYgcmVhZEJ5dGVdOwotICBpbnQgcyA9IFtzZWxmIHJlYWRJMzJdOworICBVSW50OCBrdDsKKyAgaWYgKCFbc2VsZiByZWFkQnl0ZToma3QgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgVUludDggdnQ7CisgIGlmICghW3NlbGYgcmVhZEJ5dGU6JnZ0IGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIFNJbnQzMiBzOworICBpZiAoIVtzZWxmIHJlYWRJMzI6JnMgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKICAgaWYgKGtleVR5cGUgIT0gTlVMTCkgewogICAgICprZXlUeXBlID0ga3Q7CiAgIH0KKwogICBpZiAodmFsdWVUeXBlICE9IE5VTEwpIHsKICAgICAqdmFsdWVUeXBlID0gdnQ7CiAgIH0KKwogICBpZiAoc2l6ZSAhPSBOVUxMKSB7CiAgICAgKnNpemUgPSBzOwogICB9CisKKyAgcmV0dXJuIFlFUzsKIH0KIAotLSAodm9pZCkgcmVhZE1hcEVuZCB7fQogCi0KLS0gKHZvaWQpIHJlYWRTZXRCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOiAoaW50ICopIGVsZW1lbnRUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogKGludCAqKSBzaXplCistKEJPT0wpIHJlYWRNYXBFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIGludCBldCA9IFtzZWxmIHJlYWRCeXRlXTsKLSAgaW50IHMgPSBbc2VsZiByZWFkSTMyXTsKKyAgcmV0dXJuIFlFUzsKK30KKworCistKEJPT0wpIHJlYWRTZXRCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOihTSW50MzIgKillbGVtZW50VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTooU0ludDMyICopc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDggZXQ7CisgIGlmICghW3NlbGYgcmVhZEJ5dGU6JmV0IGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIFNJbnQzMiBzOworICBpZiAoIVtzZWxmIHJlYWRJMzI6JnMgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKICAgaWYgKGVsZW1lbnRUeXBlICE9IE5VTEwpIHsKICAgICAqZWxlbWVudFR5cGUgPSBldDsKICAgfQorCiAgIGlmIChzaXplICE9IE5VTEwpIHsKICAgICAqc2l6ZSA9IHM7CiAgIH0KKworICByZXR1cm4gWUVTOwogfQogCiAKLS0gKHZvaWQpIHJlYWRTZXRFbmQge30KLQotCi0tICh2b2lkKSByZWFkTGlzdEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6IChpbnQgKikgZWxlbWVudFR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogKGludCAqKSBzaXplCistKEJPT0wpIHJlYWRTZXRFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIGludCBldCA9IFtzZWxmIHJlYWRCeXRlXTsKLSAgaW50IHMgPSBbc2VsZiByZWFkSTMyXTsKKyAgcmV0dXJuIFlFUzsKK30KKworCistKEJPT0wpIHJlYWRMaXN0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZTooU0ludDMyICopZWxlbWVudFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOihTSW50MzIgKilzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDggZXQ7CisgIGlmICghW3NlbGYgcmVhZEJ5dGU6JmV0IGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIFNJbnQzMiBzOworICBpZiAoIVtzZWxmIHJlYWRJMzI6JnMgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKICAgaWYgKGVsZW1lbnRUeXBlICE9IE5VTEwpIHsKICAgICAqZWxlbWVudFR5cGUgPSBldDsKICAgfQorCiAgIGlmIChzaXplICE9IE5VTEwpIHsKICAgICAqc2l6ZSA9IHM7CiAgIH0KKworICByZXR1cm4gWUVTOwogfQogCiAKLS0gKHZvaWQpIHJlYWRMaXN0RW5kIHt9Ci0KLQotLSAodm9pZCkgd3JpdGVCeXRlOiAodWludDhfdCkgdmFsdWUKKy0oQk9PTCkgcmVhZExpc3RFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIFttVHJhbnNwb3J0IHdyaXRlOiAmdmFsdWUgb2Zmc2V0OiAwIGxlbmd0aDogMV07CisgIHJldHVybiBZRVM7CiB9CiAKIAotLSAodm9pZCkgd3JpdGVNZXNzYWdlQmVnaW5XaXRoTmFtZTogKE5TU3RyaW5nICopIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IChpbnQpIG1lc3NhZ2VUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOiAoaW50KSBzZXF1ZW5jZUlECisKKy0oQk9PTCkgd3JpdGVNZXNzYWdlQmVnaW5XaXRoTmFtZTooTlNTdHJpbmcgKiluYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6KFNJbnQzMiltZXNzYWdlVHlwZQorICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOihTSW50MzIpc2VxdWVuY2VJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICBpZiAobVN0cmljdFdyaXRlKSB7Ci0gICAgaW50IHZlcnNpb24gPSAoVkVSU0lPTl8xIDw8IDE2KSB8IG1lc3NhZ2VUeXBlOwotICAgIFtzZWxmIHdyaXRlSTMyOiB2ZXJzaW9uXTsKLSAgICBbc2VsZiB3cml0ZVN0cmluZzogbmFtZV07Ci0gICAgW3NlbGYgd3JpdGVJMzI6IHNlcXVlbmNlSURdOwotICB9IGVsc2UgewotICAgIFtzZWxmIHdyaXRlU3RyaW5nOiBuYW1lXTsKLSAgICBbc2VsZiB3cml0ZUJ5dGU6IENoZWNrZWRDYXN0SW50VG9VSW50OChtZXNzYWdlVHlwZSldOwotICAgIFtzZWxmIHdyaXRlSTMyOiBzZXF1ZW5jZUlEXTsKKyAgaWYgKF9zdHJpY3RXcml0ZSkgeworCisgICAgaW50IHZlcnNpb24gPSBWRVJTSU9OXzEgfCBtZXNzYWdlVHlwZTsKKworICAgIGlmICghW3NlbGYgd3JpdGVJMzI6dmVyc2lvbiBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisKKyAgICBpZiAoIVtzZWxmIHdyaXRlU3RyaW5nOm5hbWUgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorCisgICAgaWYgKCFbc2VsZiB3cml0ZUkzMjpzZXF1ZW5jZUlEIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KICAgfQorICBlbHNlIHsKKworICAgIGlmICghW3NlbGYgd3JpdGVTdHJpbmc6bmFtZSBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisKKyAgICBpZiAoIVtzZWxmIHdyaXRlQnl0ZTptZXNzYWdlVHlwZSBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisKKyAgICBpZiAoIVtzZWxmIHdyaXRlSTMyOnNlcXVlbmNlSUQgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorICB9CisKKyAgX2N1cnJlbnRNZXNzYWdlTmFtZSA9IG5hbWU7CisKKyAgcmV0dXJuIFlFUzsKIH0KIAogCi0tICh2b2lkKSB3cml0ZU1lc3NhZ2VFbmQge30KLQotCi0tICh2b2lkKSB3cml0ZVN0cnVjdEJlZ2luV2l0aE5hbWU6IChOU1N0cmluZyAqKSBuYW1lIHt9Ci0KLQotLSAodm9pZCkgd3JpdGVTdHJ1Y3RFbmQge30KLQotCi0tICh2b2lkKSB3cml0ZUZpZWxkQmVnaW5XaXRoTmFtZTogKE5TU3RyaW5nICopIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAoaW50KSBmaWVsZFR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOiAoaW50KSBmaWVsZElECistKEJPT0wpIHdyaXRlTWVzc2FnZUVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgW3NlbGYgd3JpdGVCeXRlOiBDaGVja2VkQ2FzdEludFRvVUludDgoZmllbGRUeXBlKV07Ci0gIFtzZWxmIHdyaXRlSTE2OiBDaGVja2VkQ2FzdEludFRvVUludDgoZmllbGRJRCldOworICBfY3VycmVudE1lc3NhZ2VOYW1lID0gbmlsOworICByZXR1cm4gWUVTOwogfQogCiAKLS0gKHZvaWQpIHdyaXRlSTMyOiAoaW50MzJfdCkgdmFsdWUKKy0oQk9PTCkgd3JpdGVTdHJ1Y3RCZWdpbldpdGhOYW1lOihOU1N0cmluZyAqKW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICB1aW50OF90IGJ1ZmZbNF07CisgIHJldHVybiBZRVM7Cit9CisKKworLShCT09MKSB3cml0ZVN0cnVjdEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFlFUzsKK30KKworCistKEJPT0wpIHdyaXRlRmllbGRCZWdpbldpdGhOYW1lOihOU1N0cmluZyAqKW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6KFNJbnQzMilmaWVsZFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6KFNJbnQzMilmaWVsZElECisgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBpZiAoIVtzZWxmIHdyaXRlQnl0ZTpmaWVsZFR5cGUgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgaWYgKCFbc2VsZiB3cml0ZUkxNjpmaWVsZElEIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIHJldHVybiBZRVM7Cit9CisKKworLShCT09MKSB3cml0ZUJvb2w6KEJPT0wpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbc2VsZiB3cml0ZUJ5dGU6KHZhbHVlID8gMSA6IDApIGVycm9yOmVycm9yXTsKK30KKworCistKEJPT0wpIHdyaXRlQnl0ZTooVUludDgpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIGlmICghW190cmFuc3BvcnQgd3JpdGU6JnZhbHVlIG9mZnNldDowIGxlbmd0aDoxIGVycm9yOmVycm9yXSkgeworICAgIFBST1RPQ09MX1RSQU5TUE9SVF9FUlJPUihOTywgZXJyb3IsIEAiVHJhbnNwb3J0IHdyaXRlIGZhaWxlZCIpOworICB9CisgIHJldHVybiBZRVM7Cit9CisKKworLShCT09MKSB3cml0ZUkxNjooc2hvcnQpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQ4IGJ1ZmZbMl07CisgIGJ1ZmZbMF0gPSAweGZmICYgKHZhbHVlID4+IDgpOworICBidWZmWzFdID0gMHhmZiAmIHZhbHVlOworCisgIGlmICghW190cmFuc3BvcnQgd3JpdGU6YnVmZiBvZmZzZXQ6MCBsZW5ndGg6MiBlcnJvcjplcnJvcl0pIHsKKyAgICBQUk9UT0NPTF9UUkFOU1BPUlRfRVJST1IoTk8sIGVycm9yLCBAIlRyYW5zcG9ydCB3cml0ZSBmYWlsZWQiKTsKKyAgfQorCisgIHJldHVybiBZRVM7Cit9CisKKworLShCT09MKSB3cml0ZUkzMjooU0ludDMyKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50OCBidWZmWzRdOwogICBidWZmWzBdID0gMHhGRiAmICh2YWx1ZSA+PiAyNCk7CiAgIGJ1ZmZbMV0gPSAweEZGICYgKHZhbHVlID4+IDE2KTsKICAgYnVmZlsyXSA9IDB4RkYgJiAodmFsdWUgPj4gOCk7CiAgIGJ1ZmZbM10gPSAweEZGICYgdmFsdWU7Ci0gIFttVHJhbnNwb3J0IHdyaXRlOiBidWZmIG9mZnNldDogMCBsZW5ndGg6IDRdOwotfQogCi0tICh2b2lkKSB3cml0ZUkxNjogKHNob3J0KSB2YWx1ZQotewotICB1aW50OF90IGJ1ZmZbMl07Ci0gIGJ1ZmZbMF0gPSAweGZmICYgKHZhbHVlID4+IDgpOwotICBidWZmWzFdID0gMHhmZiAmIHZhbHVlOwotICBbbVRyYW5zcG9ydCB3cml0ZTogYnVmZiBvZmZzZXQ6IDAgbGVuZ3RoOiAyXTsKKyAgaWYgKCFbX3RyYW5zcG9ydCB3cml0ZTpidWZmIG9mZnNldDowIGxlbmd0aDo0IGVycm9yOmVycm9yXSkgeworICAgIFBST1RPQ09MX1RSQU5TUE9SVF9FUlJPUihOTywgZXJyb3IsIEAiVHJhbnNwb3J0IHdyaXRlIGZhaWxlZCIpOworICB9CisKKyAgcmV0dXJuIFlFUzsKIH0KIAogCi0tICh2b2lkKSB3cml0ZUk2NDogKGludDY0X3QpIHZhbHVlCistKEJPT0wpIHdyaXRlSTY0OihTSW50NjQpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIHVpbnQ4X3QgYnVmZls4XTsKKyAgVUludDggYnVmZls4XTsKICAgYnVmZlswXSA9IDB4RkYgJiAodmFsdWUgPj4gNTYpOwogICBidWZmWzFdID0gMHhGRiAmICh2YWx1ZSA+PiA0OCk7CiAgIGJ1ZmZbMl0gPSAweEZGICYgKHZhbHVlID4+IDQwKTsKQEAgLTQ0Nyw4NCArNTk0LDE0NyBAQAogICBidWZmWzVdID0gMHhGRiAmICh2YWx1ZSA+PiAxNik7CiAgIGJ1ZmZbNl0gPSAweEZGICYgKHZhbHVlID4+IDgpOwogICBidWZmWzddID0gMHhGRiAmIHZhbHVlOwotICBbbVRyYW5zcG9ydCB3cml0ZTogYnVmZiBvZmZzZXQ6IDAgbGVuZ3RoOiA4XTsKKworICBpZiAoIVtfdHJhbnNwb3J0IHdyaXRlOmJ1ZmYgb2Zmc2V0OjAgbGVuZ3RoOjggZXJyb3I6ZXJyb3JdKSB7CisgICAgUFJPVE9DT0xfVFJBTlNQT1JUX0VSUk9SKE5PLCBlcnJvciwgQCJUcmFuc3BvcnQgd3JpdGUgZmFpbGVkIik7CisgIH0KKworICByZXR1cm4gWUVTOwogfQogCi0tICh2b2lkKSB3cml0ZURvdWJsZTogKGRvdWJsZSkgdmFsdWUKKworLShCT09MKSB3cml0ZURvdWJsZTooZG91YmxlKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICAvLyBzcGl0IG91dCBJRUVFIDc1NCBiaXRzIC0gRklYTUUgLSB3aWxsIHRoaXMgZ2V0IHVzIGluIHRyb3VibGUgb24KLSAgLy8gUG93ZXJQQz8KLSAgW3NlbGYgd3JpdGVJNjQ6ICooKGludDY0X3QgKikgJnZhbHVlKV07CisgIC8vIEZJWE1FIC0gd2lsbCB0aGlzIGdldCB1cyBpbiB0cm91YmxlIG9uIFBvd2VyUEM/CisgIGlmICghW3NlbGYgd3JpdGVJNjQ6KihTSW50NjQgKikmdmFsdWUgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgcmV0dXJuIFlFUzsKIH0KIAogCi0tICh2b2lkKSB3cml0ZVN0cmluZzogKE5TU3RyaW5nICopIHZhbHVlCistKEJPT0wpIHdyaXRlU3RyaW5nOihOU1N0cmluZyAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewogICBpZiAodmFsdWUgIT0gbmlsKSB7Ci0gICAgY29uc3QgY2hhciAqIHV0ZjhCeXRlcyA9IFt2YWx1ZSBVVEY4U3RyaW5nXTsKLSAgICBzaXplX3QgbGVuZ3RoID0gc3RybGVuKHV0ZjhCeXRlcyk7Ci0gICAgaW50MzJfdCBzaXplID0gQ2hlY2tlZENhc3RTaXplVFRvSW50MzIobGVuZ3RoKTsKLSAgICBbc2VsZiB3cml0ZUkzMjogc2l6ZV07Ci0gICAgW21UcmFuc3BvcnQgd3JpdGU6ICh1aW50OF90ICopIHV0ZjhCeXRlcyBvZmZzZXQ6IDAgbGVuZ3RoOiBsZW5ndGhdOwotICB9IGVsc2UgeworCisgICAgY29uc3QgY2hhciAqdXRmOEJ5dGVzID0gW3ZhbHVlIFVURjhTdHJpbmddOworCisgICAgU0ludDMyIGxlbmd0aCA9IChTSW50MzIpc3RybGVuKHV0ZjhCeXRlcyk7CisgICAgaWYgKCFbc2VsZiB3cml0ZUkzMjpsZW5ndGggZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorCisgICAgaWYgKCFbX3RyYW5zcG9ydCB3cml0ZTooVUludDggKil1dGY4Qnl0ZXMgb2Zmc2V0OjAgbGVuZ3RoOihpbnQpbGVuZ3RoIGVycm9yOmVycm9yXSkgeworICAgICAgUFJPVE9DT0xfVFJBTlNQT1JUX0VSUk9SKE5PLCBlcnJvciwgQCJUcmFuc3BvcnQgd3JpdGUgZmFpbGVkIik7CisgICAgfQorCisgIH0KKyAgZWxzZSB7CisKICAgICAvLyBpbnN0ZWFkIG9mIGNyYXNoaW5nIHdoZW4gd2UgZ2V0IG51bGwsIGxldCdzIHdyaXRlIG91dCBhIHplcm8KICAgICAvLyBsZW5ndGggc3RyaW5nCi0gICAgW3NlbGYgd3JpdGVJMzI6IDBdOworICAgIGlmICghW3NlbGYgd3JpdGVJMzI6MCBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisKICAgfQorCisgIHJldHVybiBZRVM7CiB9CiAKIAotLSAodm9pZCkgd3JpdGVCaW5hcnk6IChOU0RhdGEgKikgZGF0YQorLShCT09MKSB3cml0ZUJpbmFyeTooTlNEYXRhICopZGF0YSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgaW50MzJfdCBzaXplID0gQ2hlY2tlZENhc3RTaXplVFRvSW50MzIoW2RhdGEgbGVuZ3RoXSk7Ci0gIFtzZWxmIHdyaXRlSTMyOiBzaXplXTsKLSAgW21UcmFuc3BvcnQgd3JpdGU6IFtkYXRhIGJ5dGVzXSBvZmZzZXQ6IDAgbGVuZ3RoOiBbZGF0YSBsZW5ndGhdXTsKLX0KKyAgaWYgKCFbc2VsZiB3cml0ZUkzMjooU0ludDMyKWRhdGEubGVuZ3RoIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQogCi0tICh2b2lkKSB3cml0ZUZpZWxkU3RvcAotewotICBbc2VsZiB3cml0ZUJ5dGU6IFRUeXBlX1NUT1BdOworICBpZiAoIVtfdHJhbnNwb3J0IHdyaXRlOmRhdGEuYnl0ZXMgb2Zmc2V0OjAgbGVuZ3RoOihVSW50MzIpZGF0YS5sZW5ndGggZXJyb3I6ZXJyb3JdKSB7CisgICAgUFJPVE9DT0xfVFJBTlNQT1JUX0VSUk9SKE5PLCBlcnJvciwgQCJUcmFuc3BvcnQgd3JpdGUgZmFpbGVkIik7CisgIH0KKworICByZXR1cm4gWUVTOwogfQogCiAKLS0gKHZvaWQpIHdyaXRlRmllbGRFbmQge30KLQotCi0tICh2b2lkKSB3cml0ZU1hcEJlZ2luV2l0aEtleVR5cGU6IChpbnQpIGtleVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlVHlwZTogKGludCkgdmFsdWVUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IChpbnQpIHNpemUKKy0oQk9PTCkgd3JpdGVGaWVsZFN0b3A6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIFtzZWxmIHdyaXRlQnl0ZTogQ2hlY2tlZENhc3RJbnRUb1VJbnQ4KGtleVR5cGUpXTsKLSAgW3NlbGYgd3JpdGVCeXRlOiBDaGVja2VkQ2FzdEludFRvVUludDgodmFsdWVUeXBlKV07Ci0gIFtzZWxmIHdyaXRlSTMyOiBzaXplXTsKKyAgaWYgKCFbc2VsZiB3cml0ZUJ5dGU6VFR5cGVTVE9QIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIHJldHVybiBZRVM7CiB9CiAKLS0gKHZvaWQpIHdyaXRlTWFwRW5kIHt9CiAKLQotLSAodm9pZCkgd3JpdGVTZXRCZWdpbldpdGhFbGVtZW50VHlwZTogKGludCkgZWxlbWVudFR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IChpbnQpIHNpemUKKy0oQk9PTCkgd3JpdGVGaWVsZEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgW3NlbGYgd3JpdGVCeXRlOiBDaGVja2VkQ2FzdEludFRvVUludDgoZWxlbWVudFR5cGUpXTsKLSAgW3NlbGYgd3JpdGVJMzI6IHNpemVdOworICByZXR1cm4gWUVTOwogfQogCi0tICh2b2lkKSB3cml0ZVNldEVuZCB7fQogCi0KLS0gKHZvaWQpIHdyaXRlTGlzdEJlZ2luV2l0aEVsZW1lbnRUeXBlOiAoaW50KSBlbGVtZW50VHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IChpbnQpIHNpemUKKy0oQk9PTCkgd3JpdGVNYXBCZWdpbldpdGhLZXlUeXBlOihTSW50MzIpa2V5VHlwZQorICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVR5cGU6KFNJbnQzMil2YWx1ZVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOihTSW50MzIpc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIFtzZWxmIHdyaXRlQnl0ZTogQ2hlY2tlZENhc3RJbnRUb1VJbnQ4KGVsZW1lbnRUeXBlKV07Ci0gIFtzZWxmIHdyaXRlSTMyOiBzaXplXTsKKyAgaWYgKCFbc2VsZiB3cml0ZUJ5dGU6a2V5VHlwZSBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKyAgaWYgKCFbc2VsZiB3cml0ZUJ5dGU6dmFsdWVUeXBlIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorICBpZiAoIVtzZWxmIHdyaXRlSTMyOihpbnQpc2l6ZSBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKyAgcmV0dXJuIFlFUzsKIH0KIAotLSAodm9pZCkgd3JpdGVMaXN0RW5kIHt9CiAKLQotLSAodm9pZCkgd3JpdGVCb29sOiAoQk9PTCkgdmFsdWUKKy0oQk9PTCkgd3JpdGVNYXBFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIFtzZWxmIHdyaXRlQnl0ZTogKHZhbHVlID8gMSA6IDApXTsKKyAgcmV0dXJuIFlFUzsKK30KKworCistKEJPT0wpIHdyaXRlU2V0QmVnaW5XaXRoRWxlbWVudFR5cGU6KFNJbnQzMillbGVtZW50VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOihTSW50MzIpc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBpZiAoIVtzZWxmIHdyaXRlQnl0ZTplbGVtZW50VHlwZSBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKyAgaWYgKCFbc2VsZiB3cml0ZUkzMjpzaXplIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorICByZXR1cm4gWUVTOworfQorCisKKy0oQk9PTCkgd3JpdGVTZXRFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBZRVM7Cit9CisKKworLShCT09MKSB3cml0ZUxpc3RCZWdpbldpdGhFbGVtZW50VHlwZTooU0ludDMyKWVsZW1lbnRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOihTSW50MzIpc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgaWYgKCFbc2VsZiB3cml0ZUJ5dGU6ZWxlbWVudFR5cGUgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisgIGlmICghW3NlbGYgd3JpdGVJMzI6c2l6ZSBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKyAgcmV0dXJuIFlFUzsKK30KKworCistKEJPT0wpIHdyaXRlTGlzdEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFlFUzsKIH0KIAogQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmggYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuaAppbmRleCAzYzkxOTVjLi4zZjZhY2NjIDEwMDY0NAotLS0gYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuaAorKysgYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuaApAQCAtMjEsMTYgKzIxLDIyIEBACiAjaW1wb3J0ICJUVHJhbnNwb3J0LmgiCiAjaW1wb3J0ICJUUHJvdG9jb2xGYWN0b3J5LmgiCiAKK05TX0FTU1VNRV9OT05OVUxMX0JFR0lOCisKKwogQGludGVyZmFjZSBUQ29tcGFjdFByb3RvY29sIDogTlNPYmplY3QgPFRQcm90b2NvbD4KIAotLSAoaWQpIGluaXRXaXRoVHJhbnNwb3J0OiAoaWQgPFRUcmFuc3BvcnQ+KSB0cmFuc3BvcnQ7CistKGlkKSBpbml0V2l0aFRyYW5zcG9ydDooaWQgPFRUcmFuc3BvcnQ+KXRyYW5zcG9ydDsKIAogQGVuZAogCiBAaW50ZXJmYWNlIFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5IDogTlNPYmplY3QgPFRQcm90b2NvbEZhY3Rvcnk+CiAKLSsgKFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5ICopIHNoYXJlZEZhY3Rvcnk7CisrKFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5ICopIHNoYXJlZEZhY3Rvcnk7CiAKLS0gKFRDb21wYWN0UHJvdG9jb2wgKikgbmV3UHJvdG9jb2xPblRyYW5zcG9ydDogKGlkIDxUVHJhbnNwb3J0PikgdHJhbnNwb3J0OworLShUQ29tcGFjdFByb3RvY29sICopIG5ld1Byb3RvY29sT25UcmFuc3BvcnQ6KGlkIDxUVHJhbnNwb3J0Pil0cmFuc3BvcnQ7CiAKIEBlbmQKKworCitOU19BU1NVTUVfTk9OTlVMTF9FTkQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wubSBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5tCmluZGV4IDQ1YjBlZjMuLjliMGViYjIgMTAwNjQ0Ci0tLSBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5tCisrKyBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5tCkBAIC0xOCwxNCArMTgsMTMgQEAKICAqLwogCiAjaW1wb3J0ICJUQ29tcGFjdFByb3RvY29sLmgiCi0jaW1wb3J0ICJUT2JqZWN0aXZlLUMuaCIKLSNpbXBvcnQgIlRQcm90b2NvbEV4Y2VwdGlvbi5oIgorI2ltcG9ydCAiVFByb3RvY29sRXJyb3IuaCIKIAotc3RhdGljIGNvbnN0IHVpbnQ4X3QgQ09NUEFDVF9QUk9UT0NPTF9JRCA9IDB4ODI7Ci1zdGF0aWMgY29uc3QgdWludDhfdCBDT01QQUNUX1ZFUlNJT04gPSAxOwotc3RhdGljIGNvbnN0IHVpbnQ4X3QgQ09NUEFDVF9WRVJTSU9OX01BU0sgPSAweDFGOyAvLyAwMDAxIDExMTEKLXN0YXRpYyBjb25zdCB1aW50OF90IENPTVBBQ1RfVFlQRV9NQVNLID0gMHhFMDsgLy8gMTExMCAwMDAwCi1zdGF0aWMgY29uc3QgdWludDhfdCBDT01QQUNUX1RZUEVfQklUUyA9IDB4MDc7IC8vIDAwMDAgMDExMQorc3RhdGljIGNvbnN0IFVJbnQ4IENPTVBBQ1RfUFJPVE9DT0xfSUQgPSAweDgyOworc3RhdGljIGNvbnN0IFVJbnQ4IENPTVBBQ1RfVkVSU0lPTiA9IDE7CitzdGF0aWMgY29uc3QgVUludDggQ09NUEFDVF9WRVJTSU9OX01BU0sgPSAweDFGOyAvLyAwMDAxIDExMTEKK3N0YXRpYyBjb25zdCBVSW50OCBDT01QQUNUX1RZUEVfTUFTSyA9IDB4RTA7IC8vIDExMTAgMDAwMAorc3RhdGljIGNvbnN0IFVJbnQ4IENPTVBBQ1RfVFlQRV9CSVRTID0gMHgwNzsgLy8gMDAwMCAwMTExCiBzdGF0aWMgY29uc3QgaW50IENPTVBBQ1RfVFlQRV9TSElGVF9BTU9VTlQgPSA1OwogCiBlbnVtIHsKQEAgLTQ2LDMyMiArNDUsNDQyIEBACiAKIEBpbXBsZW1lbnRhdGlvbiBUQ29tcGFjdFByb3RvY29sRmFjdG9yeQogCi0rIChUQ29tcGFjdFByb3RvY29sRmFjdG9yeSAqKSBzaGFyZWRGYWN0b3J5CisrKFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5ICopIHNoYXJlZEZhY3RvcnkKIHsKLSAgc3RhdGljIFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5ICogZ1NoYXJlZEZhY3RvcnkgPSBuaWw7CisgIHN0YXRpYyBUQ29tcGFjdFByb3RvY29sRmFjdG9yeSAqZ1NoYXJlZEZhY3RvcnkgPSBuaWw7CiAgIGlmIChnU2hhcmVkRmFjdG9yeSA9PSBuaWwpIHsKICAgICBnU2hhcmVkRmFjdG9yeSA9IFtbVENvbXBhY3RQcm90b2NvbEZhY3RvcnkgYWxsb2NdIGluaXRdOwogICB9Ci0gIAorCiAgIHJldHVybiBnU2hhcmVkRmFjdG9yeTsKIH0KIAotLSAoVENvbXBhY3RQcm90b2NvbCAqKSBuZXdQcm90b2NvbE9uVHJhbnNwb3J0OiAoaWQgPFRUcmFuc3BvcnQ+KSB0cmFuc3BvcnQKKy0oTlNTdHJpbmcgKikgcHJvdG9jb2xOYW1lCiB7Ci0gIHJldHVybiBbW1RDb21wYWN0UHJvdG9jb2wgYWxsb2NdIGluaXRXaXRoVHJhbnNwb3J0OiB0cmFuc3BvcnRdOworICByZXR1cm4gQCJjb21wYWN0IjsKK30KKworLShUQ29tcGFjdFByb3RvY29sICopIG5ld1Byb3RvY29sT25UcmFuc3BvcnQ6KGlkIDxUVHJhbnNwb3J0Pil0cmFuc3BvcnQKK3sKKyAgcmV0dXJuIFtbVENvbXBhY3RQcm90b2NvbCBhbGxvY10gaW5pdFdpdGhUcmFuc3BvcnQ6dHJhbnNwb3J0XTsKIH0KIAogQGVuZAogCi1AaW1wbGVtZW50YXRpb24gVENvbXBhY3RQcm90b2NvbCB7Ci0gIE5TTXV0YWJsZUFycmF5ICogbGFzdEZpZWxkOwotICBzaG9ydCBsYXN0RmllbGRJZDsKLSAgaWQgPFRUcmFuc3BvcnQ+IG1UcmFuc3BvcnQ7Ci0gIAotICBOU1N0cmluZyAqIGJvb2xGaWVsZE5hbWU7Ci0gIE5TTnVtYmVyICogYm9vbEZpZWxkVHlwZTsKLSAgTlNOdW1iZXIgKiBib29sRmllbGRJZDsKLSAgTlNOdW1iZXIgKiBib29sZWFuVmFsdWU7Ci19CiAKLS0gKGlkKSBpbml0CitAaW50ZXJmYWNlIFRDb21wYWN0UHJvdG9jb2wgKCkKKworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBpZCA8VFRyYW5zcG9ydD4gdHJhbnNwb3J0OworCitAcHJvcGVydHkoc3Ryb25nLCBub25hdG9taWMpIE5TTXV0YWJsZUFycmF5ICpsYXN0RmllbGQ7CitAcHJvcGVydHkoYXNzaWduLCBub25hdG9taWMpIHNob3J0IGxhc3RGaWVsZElkOworCitAcHJvcGVydHkoc3Ryb25nLCBub25hdG9taWMpIE5TU3RyaW5nICpib29sRmllbGROYW1lOworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBOU051bWJlciAqYm9vbEZpZWxkVHlwZTsKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgTlNOdW1iZXIgKmJvb2xGaWVsZElkOworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBOU051bWJlciAqYm9vbGVhblZhbHVlOworCitAcHJvcGVydHkoc3Ryb25nLCBub25hdG9taWMpIE5TU3RyaW5nICpjdXJyZW50TWVzc2FnZU5hbWU7CisKK0BlbmQKKworCitAaW1wbGVtZW50YXRpb24gVENvbXBhY3RQcm90b2NvbAorCistKGlkKSBpbml0CiB7CiAgIHNlbGYgPSBbc3VwZXIgaW5pdF07Ci0gIAorCiAgIGlmIChzZWxmICE9IG5pbCkgewotICAgIGxhc3RGaWVsZCA9IFtbTlNNdXRhYmxlQXJyYXkgYWxsb2NdIGluaXRdOworICAgIF9sYXN0RmllbGQgPSBbW05TTXV0YWJsZUFycmF5IGFsbG9jXSBpbml0XTsKICAgfQotICAKKwogICByZXR1cm4gc2VsZjsKIH0KIAotLSAoaWQpIGluaXRXaXRoVHJhbnNwb3J0OiAoaWQgPFRUcmFuc3BvcnQ+KSB0cmFuc3BvcnQKKy0oaWQpIGluaXRXaXRoVHJhbnNwb3J0OihpZCA8VFRyYW5zcG9ydD4pYVRyYW5zcG9ydAogewogICBzZWxmID0gW3NlbGYgaW5pdF07Ci0gIAorCiAgIGlmIChzZWxmICE9IG5pbCkgewotICAgIG1UcmFuc3BvcnQgPSBbdHJhbnNwb3J0IHJldGFpbl9zdHViXTsKKyAgICBfdHJhbnNwb3J0ID0gYVRyYW5zcG9ydDsKICAgfQotICAKKwogICByZXR1cm4gc2VsZjsKIH0KIAotLSAodm9pZCkgZGVhbGxvYworLShpZCA8VFRyYW5zcG9ydD4pIHRyYW5zcG9ydAogewotICBbbGFzdEZpZWxkIHJlbGVhc2Vfc3R1Yl07Ci0gIFttVHJhbnNwb3J0IHJlbGVhc2Vfc3R1Yl07Ci0gIFtib29sRmllbGROYW1lIHJlbGVhc2Vfc3R1Yl07Ci0gIFtib29sRmllbGRUeXBlIHJlbGVhc2Vfc3R1Yl07Ci0gIFtib29sRmllbGRJZCByZWxlYXNlX3N0dWJdOwotICBbYm9vbGVhblZhbHVlIHJlbGVhc2Vfc3R1Yl07Ci0gIAotICBbc3VwZXIgZGVhbGxvY19zdHViXTsKKyAgcmV0dXJuIF90cmFuc3BvcnQ7CiB9CiAKLS0gKGlkIDxUVHJhbnNwb3J0PikgdHJhbnNwb3J0CistKEJPT0wpIHdyaXRlQnl0ZURpcmVjdDooVUludDgpbiBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgcmV0dXJuIG1UcmFuc3BvcnQ7CisgIGlmICghW190cmFuc3BvcnQgd3JpdGU6KFVJbnQ4ICopJm4gb2Zmc2V0OjAgbGVuZ3RoOjEgZXJyb3I6ZXJyb3JdKSB7CisgICAgUFJPVE9DT0xfVFJBTlNQT1JUX0VSUk9SKE5PLCBlcnJvciwgQCJUcmFuc3BvcnQgd3JpdGUgZmFpbGVkIik7CisgIH0KKyAgcmV0dXJuIFlFUzsKIH0KIAotLSAodm9pZCkgd3JpdGVCeXRlRGlyZWN0OiAoaW50OF90KSBuCistKEJPT0wpIHdyaXRlVmFyaW50MzI6KFVJbnQzMiluIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICBbbVRyYW5zcG9ydCB3cml0ZTogKHVpbnQ4X3QgKikmbiBvZmZzZXQ6IDAgbGVuZ3RoOiAxXTsKLX0KKyAgVUludDggaTMyYnVmWzVdID0gezB9OworICBVSW50MzIgaWR4ID0gMDsKIAotLSAodm9pZCl3cml0ZVZhcmludDMyOiAodWludDMyX3QpIG4KLXsKLSAgdWludDhfdCBpMzJidWZbNV0gPSB7MH07Ci0gIHVpbnQzMl90IGlkeCA9IDA7Ci0gIAogICB3aGlsZSAodHJ1ZSkgewogICAgIGlmICgobiAmIH4weDdGKSA9PSAwKSB7Ci0gICAgICBpMzJidWZbaWR4KytdID0gKHVpbnQ4X3QpbjsKKyAgICAgIGkzMmJ1ZltpZHgrK10gPSAoVUludDgpbjsKICAgICAgIGJyZWFrOwotICAgIH0gZWxzZSB7Ci0gICAgICBpMzJidWZbaWR4KytdID0gKHVpbnQ4X3QpKChuICYgMHg3RikgfCAweDgwKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBpMzJidWZbaWR4KytdID0gKFVJbnQ4KSgobiAmIDB4N0YpIHwgMHg4MCk7CiAgICAgICBuID4+PSA3OwogICAgIH0KICAgfQotICAKLSAgW21UcmFuc3BvcnQgd3JpdGU6IGkzMmJ1ZiBvZmZzZXQ6IDAgbGVuZ3RoOiBpZHhdOworCisgIGlmICghW190cmFuc3BvcnQgd3JpdGU6aTMyYnVmIG9mZnNldDowIGxlbmd0aDppZHggZXJyb3I6ZXJyb3JdKSB7CisgICAgUFJPVE9DT0xfVFJBTlNQT1JUX0VSUk9SKE5PLCBlcnJvciwgQCJUcmFuc3BvcnQgd3JpdGUgZmFpbGVkIik7CisgIH0KKworICByZXR1cm4gWUVTOwogfQogCi0tICh2b2lkKSB3cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lOiAoTlNTdHJpbmcgKikgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogKGludCkgbWVzc2FnZVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6IChpbnQpIHNlcXVlbmNlSUQKKy0oQk9PTCkgd3JpdGVNZXNzYWdlQmVnaW5XaXRoTmFtZTooTlNTdHJpbmcgKiluYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6KFNJbnQzMiltZXNzYWdlVHlwZQorICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOihTSW50MzIpc2VxdWVuY2VJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICBbc2VsZiB3cml0ZUJ5dGVEaXJlY3Q6IENPTVBBQ1RfUFJPVE9DT0xfSURdOwotICBbc2VsZiB3cml0ZUJ5dGVEaXJlY3Q6ICh1aW50OF90KSgoQ09NUEFDVF9WRVJTSU9OICYgQ09NUEFDVF9WRVJTSU9OX01BU0spIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoKHVpbnQzMl90KW1lc3NhZ2VUeXBlKSA8PCBDT01QQUNUX1RZUEVfU0hJRlRfQU1PVU5UKSAmIENPTVBBQ1RfVFlQRV9NQVNLKSldOwotICBbc2VsZiB3cml0ZVZhcmludDMyOiAodWludDMyX3Qpc2VxdWVuY2VJRF07Ci0gIFtzZWxmIHdyaXRlU3RyaW5nOiBuYW1lXTsKKyAgaWYgKCFbc2VsZiB3cml0ZUJ5dGVEaXJlY3Q6Q09NUEFDVF9QUk9UT0NPTF9JRCBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKyAgaWYgKCFbc2VsZiB3cml0ZUJ5dGVEaXJlY3Q6KFVJbnQ4KSgoQ09NUEFDVF9WRVJTSU9OICYgQ09NUEFDVF9WRVJTSU9OX01BU0spIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCgoVUludDMyKW1lc3NhZ2VUeXBlKSA8PCBDT01QQUNUX1RZUEVfU0hJRlRfQU1PVU5UKSAmIENPTVBBQ1RfVFlQRV9NQVNLKSkgZXJyb3I6ZXJyb3JdKQorICB7CisgICAgcmV0dXJuIE5POworICB9CisgIGlmICghW3NlbGYgd3JpdGVWYXJpbnQzMjooVUludDMyKXNlcXVlbmNlSUQgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisgIGlmICghW3NlbGYgd3JpdGVTdHJpbmc6bmFtZSBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBfY3VycmVudE1lc3NhZ2VOYW1lID0gbmFtZTsKKworICByZXR1cm4gWUVTOwogfQogCi0tICh2b2lkKSB3cml0ZVN0cnVjdEJlZ2luV2l0aE5hbWU6IChOU1N0cmluZyAqKSBuYW1lCistKEJPT0wpIHdyaXRlU3RydWN0QmVnaW5XaXRoTmFtZTooTlNTdHJpbmcgKiluYW1lIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICBbbGFzdEZpZWxkIGFkZE9iamVjdDogW05TTnVtYmVyIG51bWJlcldpdGhTaG9ydDogbGFzdEZpZWxkSWRdXTsKLSAgbGFzdEZpZWxkSWQgPSAwOworICBbX2xhc3RGaWVsZCBhZGRPYmplY3Q6QChfbGFzdEZpZWxkSWQpXTsKKyAgX2xhc3RGaWVsZElkID0gMDsKKyAgcmV0dXJuIFlFUzsKIH0KIAotLSAodm9pZCkgd3JpdGVTdHJ1Y3RFbmQKKy0oQk9PTCkgd3JpdGVTdHJ1Y3RFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIGxhc3RGaWVsZElkID0gW1tsYXN0RmllbGQgbGFzdE9iamVjdF0gc2hvcnRWYWx1ZV07Ci0gIFtsYXN0RmllbGQgcmVtb3ZlTGFzdE9iamVjdF07CisgIF9sYXN0RmllbGRJZCA9IFtfbGFzdEZpZWxkLmxhc3RPYmplY3Qgc2hvcnRWYWx1ZV07CisgIFtfbGFzdEZpZWxkIHJlbW92ZUxhc3RPYmplY3RdOworICByZXR1cm4gWUVTOwogfQogCi0tICh2b2lkKSB3cml0ZUZpZWxkQmVnaW5XaXRoTmFtZTogKE5TU3RyaW5nICopIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAoaW50KSBmaWVsZFR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOiAoaW50KSBmaWVsZElECistKEJPT0wpIHdyaXRlRmllbGRCZWdpbldpdGhOYW1lOihOU1N0cmluZyAqKW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6KFNJbnQzMilmaWVsZFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6KFNJbnQzMilmaWVsZElECisgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICBpZiAoZmllbGRUeXBlID09IFRUeXBlX0JPT0wpIHsKLSAgICBib29sRmllbGROYW1lID0gW25hbWUgY29weV07Ci0gICAgYm9vbEZpZWxkVHlwZSA9IFtbTlNOdW1iZXIgbnVtYmVyV2l0aEludDogZmllbGRUeXBlXSByZXRhaW5fc3R1Yl07Ci0gICAgYm9vbEZpZWxkSWQgPSBbW05TTnVtYmVyIG51bWJlcldpdGhJbnQ6IGZpZWxkSURdIHJldGFpbl9zdHViXTsKLSAgfSBlbHNlIHsKLSAgICBbc2VsZiB3cml0ZUZpZWxkQmVnaW5JbnRlcm5hbFdpdGhOYW1lOiBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogZmllbGRUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDogZmllbGRJRAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlT3ZlcnJpZGU6IDB4RkZdOworICBpZiAoZmllbGRUeXBlID09IFRUeXBlQk9PTCkgeworICAgIF9ib29sRmllbGROYW1lID0gW25hbWUgY29weV07CisgICAgX2Jvb2xGaWVsZFR5cGUgPSBAKGZpZWxkVHlwZSk7CisgICAgX2Jvb2xGaWVsZElkID0gQChmaWVsZElEKTsKKyAgICByZXR1cm4gWUVTOworICB9CisgIGVsc2UgeworICAgIHJldHVybiBbc2VsZiB3cml0ZUZpZWxkQmVnaW5JbnRlcm5hbFdpdGhOYW1lOm5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTpmaWVsZFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDpmaWVsZElECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlT3ZlcnJpZGU6MHhGRgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOmVycm9yXTsKICAgfQogfQogCi0tICh2b2lkKSB3cml0ZUZpZWxkQmVnaW5JbnRlcm5hbFdpdGhOYW1lOiAoTlNTdHJpbmcgKikgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogKGludCkgZmllbGRUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOiAoaW50KSBmaWVsZElECi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZU92ZXJyaWRlOiAodWludDhfdCkgdHlwZU92ZXJyaWRlCistKEJPT0wpIHdyaXRlRmllbGRCZWdpbkludGVybmFsV2l0aE5hbWU6KE5TU3RyaW5nICopbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOihTSW50MzIpZmllbGRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6KFNJbnQzMilmaWVsZElECisgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlT3ZlcnJpZGU6KFVJbnQ4KXR5cGVPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICB1aW50OF90IHR5cGVUb1dyaXRlID0gdHlwZU92ZXJyaWRlID09IDB4RkYgPyBbc2VsZiBjb21wYWN0VHlwZUZvclRUeXBlOiBmaWVsZFR5cGVdIDogdHlwZU92ZXJyaWRlOwotICAKKyAgVUludDggdHlwZVRvV3JpdGUgPSB0eXBlT3ZlcnJpZGUgPT0gMHhGRiA/IFtzZWxmIGNvbXBhY3RUeXBlRm9yVFR5cGU6ZmllbGRUeXBlXSA6IHR5cGVPdmVycmlkZTsKKwogICAvLyBjaGVjayBpZiB3ZSBjYW4gdXNlIGRlbHRhIGVuY29kaW5nIGZvciB0aGUgZmllbGQgaWQKLSAgaWYgKGZpZWxkSUQgPiBsYXN0RmllbGRJZCAmJiBmaWVsZElEIC0gbGFzdEZpZWxkSWQgPD0gMTUpIHsKKyAgaWYgKGZpZWxkSUQgPiBfbGFzdEZpZWxkSWQgJiYgZmllbGRJRCAtIF9sYXN0RmllbGRJZCA8PSAxNSkgewogICAgIC8vIFdyaXRlIHRoZW0gdG9nZXRoZXIKLSAgICBbc2VsZiB3cml0ZUJ5dGVEaXJlY3Q6IChmaWVsZElEIC0gbGFzdEZpZWxkSWQpIDw8IDQgfCB0eXBlVG9Xcml0ZV07Ci0gIH0gZWxzZSB7Ci0gICAgLy8gV3JpdGUgdGhlbSBzZXBhcmF0ZQotICAgIFtzZWxmIHdyaXRlQnl0ZURpcmVjdDogdHlwZVRvV3JpdGVdOwotICAgIFtzZWxmIHdyaXRlSTE2OiBmaWVsZElEXTsKKyAgICBpZiAoIVtzZWxmIHdyaXRlQnl0ZURpcmVjdDooZmllbGRJRCAtIF9sYXN0RmllbGRJZCkgPDwgNCB8IHR5cGVUb1dyaXRlIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KICAgfQotICAKLSAgbGFzdEZpZWxkSWQgPSBmaWVsZElEOworICBlbHNlIHsKKyAgICAvLyBXcml0ZSB0aGVtIHNlcGFyYXRlCisgICAgaWYgKCFbc2VsZiB3cml0ZUJ5dGVEaXJlY3Q6dHlwZVRvV3JpdGUgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorICAgIGlmICghW3NlbGYgd3JpdGVJMTY6ZmllbGRJRCBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgIH0KKworICBfbGFzdEZpZWxkSWQgPSBmaWVsZElEOworCisgIHJldHVybiBZRVM7CiB9CiAKLS0gKHZvaWQpIHdyaXRlRmllbGRTdG9wCistKEJPT0wpIHdyaXRlRmllbGRTdG9wOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICBbc2VsZiB3cml0ZUJ5dGVEaXJlY3Q6IFRDVHlwZV9TVE9QXTsKKyAgcmV0dXJuIFtzZWxmIHdyaXRlQnl0ZURpcmVjdDpUQ1R5cGVfU1RPUCBlcnJvcjplcnJvcl07CiB9CiAKLS0gKHZvaWQpIHdyaXRlTWFwQmVnaW5XaXRoS2V5VHlwZTogKGludCkga2V5VHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVUeXBlOiAoaW50KSB2YWx1ZVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogKGludCkgc2l6ZQorLShCT09MKSB3cml0ZU1hcEJlZ2luV2l0aEtleVR5cGU6KFNJbnQzMilrZXlUeXBlCisgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlVHlwZTooU0ludDMyKXZhbHVlVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMilzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKICAgaWYgKHNpemUgPT0gMCkgewotICAgIFtzZWxmIHdyaXRlQnl0ZURpcmVjdDogMF07Ci0gIH0gZWxzZSB7Ci0gICAgW3NlbGYgd3JpdGVWYXJpbnQzMjogKHVpbnQzMl90KXNpemVdOwotICAgIFtzZWxmIHdyaXRlQnl0ZURpcmVjdDogW3NlbGYgY29tcGFjdFR5cGVGb3JUVHlwZToga2V5VHlwZV0gPDwgNCB8IFtzZWxmIGNvbXBhY3RUeXBlRm9yVFR5cGU6IHZhbHVlVHlwZV1dOworICAgIGlmICghW3NlbGYgd3JpdGVCeXRlRGlyZWN0OjAgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQogICB9CisgIGVsc2UgeworICAgIGlmICghW3NlbGYgd3JpdGVWYXJpbnQzMjooVUludDMyKXNpemUgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorICAgIGlmICghW3NlbGYgd3JpdGVCeXRlRGlyZWN0OltzZWxmIGNvbXBhY3RUeXBlRm9yVFR5cGU6a2V5VHlwZV0gPDwgNCB8IFtzZWxmIGNvbXBhY3RUeXBlRm9yVFR5cGU6dmFsdWVUeXBlXSBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFlFUzsKIH0KIAotLSAodm9pZCkgd3JpdGVMaXN0QmVnaW5XaXRoRWxlbWVudFR5cGU6IChpbnQpIGVsZW1lbnRUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogKGludCkgc2l6ZQorLShCT09MKSB3cml0ZUxpc3RCZWdpbldpdGhFbGVtZW50VHlwZTooU0ludDMyKWVsZW1lbnRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOihTSW50MzIpc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgW3NlbGYgd3JpdGVDb2xsZWN0aW9uQmVnaW5XaXRoRWxlbWVudFR5cGU6IGVsZW1lbnRUeXBlIHNpemU6IHNpemVdOworICByZXR1cm4gW3NlbGYgd3JpdGVDb2xsZWN0aW9uQmVnaW5XaXRoRWxlbWVudFR5cGU6ZWxlbWVudFR5cGUgc2l6ZTpzaXplIGVycm9yOmVycm9yXTsKIH0KIAotLSAodm9pZCkgd3JpdGVTZXRCZWdpbldpdGhFbGVtZW50VHlwZTogKGludCkgZWxlbWVudFR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IChpbnQpIHNpemUKKy0oQk9PTCkgd3JpdGVTZXRCZWdpbldpdGhFbGVtZW50VHlwZTooU0ludDMyKWVsZW1lbnRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMilzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIFtzZWxmIHdyaXRlQ29sbGVjdGlvbkJlZ2luV2l0aEVsZW1lbnRUeXBlOiBlbGVtZW50VHlwZSBzaXplOiBzaXplXTsKKyAgcmV0dXJuIFtzZWxmIHdyaXRlQ29sbGVjdGlvbkJlZ2luV2l0aEVsZW1lbnRUeXBlOmVsZW1lbnRUeXBlIHNpemU6c2l6ZSBlcnJvcjplcnJvcl07CiB9CiAKLS0gKHZvaWQpIHdyaXRlQm9vbDogKEJPT0wpIGIKKy0oQk9PTCkgd3JpdGVCb29sOihCT09MKWIgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIGlmIChib29sRmllbGRJZCAhPSBuaWwgJiYgYm9vbEZpZWxkTmFtZSAhPSBuaWwgJiYgYm9vbEZpZWxkVHlwZSAhPSBuaWwpIHsKKyAgQk9PTCByZXN1bHQ7CisgIGlmIChfYm9vbEZpZWxkSWQgIT0gbmlsICYmIF9ib29sRmllbGROYW1lICE9IG5pbCAmJiBfYm9vbEZpZWxkVHlwZSAhPSBuaWwpIHsKICAgICAvLyB3ZSBoYXZlbid0IHdyaXR0ZW4gdGhlIGZpZWxkIGhlYWRlciB5ZXQKLSAgICBbc2VsZiB3cml0ZUZpZWxkQmVnaW5JbnRlcm5hbFdpdGhOYW1lOiBib29sRmllbGROYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogW2Jvb2xGaWVsZFR5cGUgaW50VmFsdWVdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDogW2Jvb2xGaWVsZElkIGludFZhbHVlXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlT3ZlcnJpZGU6IGIgPyBUQ1R5cGVfQk9PTEVBTl9UUlVFIDogVENUeXBlX0JPT0xFQU5fRkFMU0VdOwotICAgIAotICAgIFtib29sRmllbGRJZCByZWxlYXNlX3N0dWJdOwotICAgIFtib29sRmllbGROYW1lIHJlbGVhc2Vfc3R1Yl07Ci0gICAgW2Jvb2xGaWVsZFR5cGUgcmVsZWFzZV9zdHViXTsKLSAgICAKLSAgICBib29sRmllbGRJZCA9IG5pbDsKLSAgICBib29sRmllbGROYW1lID0gbmlsOwotICAgIGJvb2xGaWVsZFR5cGUgPSBuaWw7Ci0gIH0gZWxzZSB7CisgICAgcmVzdWx0ID0gW3NlbGYgd3JpdGVGaWVsZEJlZ2luSW50ZXJuYWxXaXRoTmFtZTpfYm9vbEZpZWxkTmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6X2Jvb2xGaWVsZFR5cGUuaW50VmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOl9ib29sRmllbGRJZC5pbnRWYWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlT3ZlcnJpZGU6YiA/IFRDVHlwZV9CT09MRUFOX1RSVUUgOiBUQ1R5cGVfQk9PTEVBTl9GQUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6ZXJyb3JdOworICAgIF9ib29sRmllbGRJZCA9IG5pbDsKKyAgICBfYm9vbEZpZWxkTmFtZSA9IG5pbDsKKyAgICBfYm9vbEZpZWxkVHlwZSA9IG5pbDsKKyAgfQorICBlbHNlIHsKICAgICAvLyB3ZSdyZSBub3QgcGFydCBvZiBhIGZpZWxkLCBzbyBqdXN0IFdyaXRlIHRoZSB2YWx1ZS4KLSAgICBbc2VsZiB3cml0ZUJ5dGVEaXJlY3Q6IGIgPyBUQ1R5cGVfQk9PTEVBTl9UUlVFIDogVENUeXBlX0JPT0xFQU5fRkFMU0VdOworICAgIHJlc3VsdCA9IFtzZWxmIHdyaXRlQnl0ZURpcmVjdDpiID8gVENUeXBlX0JPT0xFQU5fVFJVRSA6IFRDVHlwZV9CT09MRUFOX0ZBTFNFIGVycm9yOmVycm9yXTsKICAgfQorICByZXR1cm4gcmVzdWx0OwogfQogCi0tICh2b2lkKSB3cml0ZUJ5dGU6ICh1aW50OF90KSB2YWx1ZQorLShCT09MKSB3cml0ZUJ5dGU6KFVJbnQ4KXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICBbc2VsZiB3cml0ZUJ5dGVEaXJlY3Q6IHZhbHVlXTsKKyAgcmV0dXJuIFtzZWxmIHdyaXRlQnl0ZURpcmVjdDp2YWx1ZSBlcnJvcjplcnJvcl07CiB9CiAKLS0gKHZvaWQpIHdyaXRlSTE2OiAoaW50MTZfdCkgdmFsdWUKKy0oQk9PTCkgd3JpdGVJMTY6KFNJbnQxNil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgW3NlbGYgd3JpdGVWYXJpbnQzMjogW3NlbGYgaTMyVG9aaWdaYWc6IHZhbHVlXV07CisgIHJldHVybiBbc2VsZiB3cml0ZVZhcmludDMyOltzZWxmIGkzMlRvWmlnWmFnOnZhbHVlXSBlcnJvcjplcnJvcl07CiB9CiAKLS0gKHZvaWQpIHdyaXRlSTMyOiAoaW50MzJfdCkgdmFsdWUKKy0oQk9PTCkgd3JpdGVJMzI6KFNJbnQzMil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgW3NlbGYgd3JpdGVWYXJpbnQzMjogW3NlbGYgaTMyVG9aaWdaYWc6IHZhbHVlXV07CisgIHJldHVybiBbc2VsZiB3cml0ZVZhcmludDMyOltzZWxmIGkzMlRvWmlnWmFnOnZhbHVlXSBlcnJvcjplcnJvcl07CiB9CiAKLS0gKHZvaWQpIHdyaXRlSTY0OiAoaW50NjRfdCkgdmFsdWUKKy0oQk9PTCkgd3JpdGVJNjQ6KFNJbnQ2NCl2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgW3NlbGYgd3JpdGVWYXJpbnQ2NDogW3NlbGYgaTY0VG9aaWdaYWc6IHZhbHVlXV07CisgIHJldHVybiBbc2VsZiB3cml0ZVZhcmludDY0OltzZWxmIGk2NFRvWmlnWmFnOnZhbHVlXSBlcnJvcjplcnJvcl07CiB9CiAKLS0gKHZvaWQpIHdyaXRlRG91YmxlOiAoZG91YmxlKSB2YWx1ZQorLShCT09MKSB3cml0ZURvdWJsZTooZG91YmxlKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICAvL1NhZmUgYml0LWNhc3RpbmcgZG91YmxlLT51aW50NjQKLSAgCi0gIHVpbnQ2NF90IGJpdHMgPSAwOworICAvLyBTYWZlIGJpdC1jYXN0aW5nIGRvdWJsZS0+dWludDY0CisKKyAgVUludDY0IGJpdHMgPSAwOwogICBtZW1jcHkoJmJpdHMsICZ2YWx1ZSwgOCk7Ci0gIAorCiAgIGJpdHMgPSBPU1N3YXBIb3N0VG9MaXR0bGVJbnQ2NChiaXRzKTsKLSAgCi0gIFttVHJhbnNwb3J0IHdyaXRlOiAodWludDhfdCAqKSZiaXRzIG9mZnNldDogMCBsZW5ndGg6IDhdOwotfQogCi0tICh2b2lkKSB3cml0ZVN0cmluZzogKE5TU3RyaW5nICopIHZhbHVlCi17Ci0gIFtzZWxmIHdyaXRlQmluYXJ5OiBbdmFsdWUgZGF0YVVzaW5nRW5jb2Rpbmc6IE5TVVRGOFN0cmluZ0VuY29kaW5nXV07Ci19Ci0KLS0gKHZvaWQpIHdyaXRlQmluYXJ5OiAoTlNEYXRhICopIGRhdGEKLXsKLSAgW3NlbGYgd3JpdGVWYXJpbnQzMjogKHVpbnQzMl90KWRhdGEubGVuZ3RoXTsKLSAgW21UcmFuc3BvcnQgd3JpdGU6IGRhdGEuYnl0ZXMgb2Zmc2V0OiAwIGxlbmd0aDogZGF0YS5sZW5ndGhdOwotfQotCi0tICh2b2lkKSB3cml0ZU1lc3NhZ2VFbmQge30KLS0gKHZvaWQpIHdyaXRlTWFwRW5kIHt9Ci0tICh2b2lkKSB3cml0ZUxpc3RFbmQge30KLS0gKHZvaWQpIHdyaXRlU2V0RW5kIHt9Ci0tICh2b2lkKSB3cml0ZUZpZWxkRW5kIHt9Ci0KLS0gKHZvaWQpIHdyaXRlQ29sbGVjdGlvbkJlZ2luV2l0aEVsZW1lbnRUeXBlOiAoaW50KSBlbGVtZW50VHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IChpbnQpIHNpemUKLXsKLSAgaWYgKHNpemUgPD0gMTQpIHsKLSAgICBbc2VsZiB3cml0ZUJ5dGVEaXJlY3Q6IHNpemUgPDwgNCB8IFtzZWxmIGNvbXBhY3RUeXBlRm9yVFR5cGU6IGVsZW1lbnRUeXBlXV07Ci0gIH0gZWxzZSB7Ci0gICAgW3NlbGYgd3JpdGVCeXRlRGlyZWN0OiAweGYwIHwgW3NlbGYgY29tcGFjdFR5cGVGb3JUVHlwZTogZWxlbWVudFR5cGVdXTsKLSAgICBbc2VsZiB3cml0ZVZhcmludDMyOiAodWludDMyX3Qpc2l6ZV07CisgIGlmICghW190cmFuc3BvcnQgd3JpdGU6KFVJbnQ4ICopJmJpdHMgb2Zmc2V0OjAgbGVuZ3RoOjggZXJyb3I6ZXJyb3JdKSB7CisgICAgUFJPVE9DT0xfVFJBTlNQT1JUX0VSUk9SKE5PLCBlcnJvciwgQCJUcmFuc3BvcnQgd3JpdGUgZmFpbGVkIik7CiAgIH0KKworICByZXR1cm4gWUVTOwogfQogCi0tICh2b2lkKSB3cml0ZVZhcmludDY0OiAodWludDY0X3QpIG4KKy0oQk9PTCkgd3JpdGVTdHJpbmc6KE5TU3RyaW5nICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIHVpbnQ4X3QgdmFyaW50NjRvdXRbMTBdID0gezB9OworICByZXR1cm4gW3NlbGYgd3JpdGVCaW5hcnk6W3ZhbHVlIGRhdGFVc2luZ0VuY29kaW5nOk5TVVRGOFN0cmluZ0VuY29kaW5nXSBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgd3JpdGVCaW5hcnk6KE5TRGF0YSAqKWRhdGEgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIGlmICghW3NlbGYgd3JpdGVWYXJpbnQzMjooVUludDMyKWRhdGEubGVuZ3RoIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorICBpZiAoIVtfdHJhbnNwb3J0IHdyaXRlOmRhdGEuYnl0ZXMgb2Zmc2V0OjAgbGVuZ3RoOihVSW50MzIpZGF0YS5sZW5ndGggZXJyb3I6ZXJyb3JdKSB7CisgICAgUFJPVE9DT0xfVFJBTlNQT1JUX0VSUk9SKE5PLCBlcnJvciwgQCJUcmFuc3BvcnQgd3JpdGUgZmFpbGVkIik7CisgIH0KKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSB3cml0ZU1lc3NhZ2VFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIF9jdXJyZW50TWVzc2FnZU5hbWUgPSBuaWw7CisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgd3JpdGVNYXBFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgd3JpdGVMaXN0RW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHdyaXRlU2V0RW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHdyaXRlRmllbGRFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgd3JpdGVDb2xsZWN0aW9uQmVnaW5XaXRoRWxlbWVudFR5cGU6KFNJbnQzMillbGVtZW50VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTooU0ludDMyKXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQ4IGN0eXBlRWxlbWVudCA9IFtzZWxmIGNvbXBhY3RUeXBlRm9yVFR5cGU6ZWxlbWVudFR5cGVdOworCisgIGlmIChzaXplIDw9IDE0KSB7CisgICAgaWYgKCFbc2VsZiB3cml0ZUJ5dGVEaXJlY3Q6c2l6ZSA8PCA0IHwgY3R5cGVFbGVtZW50IGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgfQorICBlbHNlIHsKKyAgICBpZiAoIVtzZWxmIHdyaXRlQnl0ZURpcmVjdDoweGYwIHwgY3R5cGVFbGVtZW50IGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgICBpZiAoIVtzZWxmIHdyaXRlVmFyaW50MzI6KFVJbnQzMilzaXplIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgfQorICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHdyaXRlVmFyaW50NjQ6KFVJbnQ2NCluIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50OCB2YXJpbnQ2NG91dFsxMF0gPSB7MH07CiAgIGludCBpZHggPSAwOwotICAKKwogICB3aGlsZSAodHJ1ZSkgewogICAgIGlmICgobiAmIH4weDdGTCkgPT0gMCkgewotICAgICAgdmFyaW50NjRvdXRbaWR4KytdID0gKHVpbnQ4X3QpbjsKKyAgICAgIHZhcmludDY0b3V0W2lkeCsrXSA9IChVSW50OCluOwogICAgICAgYnJlYWs7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHZhcmludDY0b3V0W2lkeCsrXSA9ICh1aW50OF90KSgobiAmIDB4N0YpIHwgMHg4MCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgdmFyaW50NjRvdXRbaWR4KytdID0gKFVJbnQ4KSgobiAmIDB4N0YpIHwgMHg4MCk7CiAgICAgICBuID4+PSA3OwogICAgIH0KICAgfQotICAKLSAgW21UcmFuc3BvcnQgd3JpdGU6IHZhcmludDY0b3V0IG9mZnNldDogMCBsZW5ndGg6IGlkeF07CisKKyAgaWYgKCFbX3RyYW5zcG9ydCB3cml0ZTp2YXJpbnQ2NG91dCBvZmZzZXQ6MCBsZW5ndGg6aWR4IGVycm9yOmVycm9yXSkgeworICAgIFBST1RPQ09MX1RSQU5TUE9SVF9FUlJPUihOTywgZXJyb3IsIEAiVHJhbnNwb3J0IHdyaXRlIGZhaWxlZCIpOworICB9CisKKyAgcmV0dXJuIFlFUzsKIH0KIAotLSAodWludDMyX3QpIGkzMlRvWmlnWmFnOiAoaW50MzJfdCkgbgorLShVSW50MzIpIGkzMlRvWmlnWmFnOihTSW50MzIpbgogewogICAvKgotICAgWmlnWmFnIGVuY29kaW5nIG1hcHMgc2lnbmVkIGludGVnZXJzIHRvIHVuc2lnbmVkIGludGVnZXJzIHNvIHRoYXQKLSAgIG51bWJlcnMgd2l0aCBhIHNtYWxsIGFic29sdXRlIHZhbHVlIChmb3IgaW5zdGFuY2UsIC0xKSBoYXZlCi0gICBhIHNtYWxsIHZhcmludCBlbmNvZGVkIHZhbHVlIHRvby4gSXQgZG9lcyB0aGlzIGluIGEgd2F5IHRoYXQKLSAgICJ6aWctemFncyIgYmFjayBhbmQgZm9ydGggdGhyb3VnaCB0aGUgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIGludGVnZXJzLAotICAgc28gdGhhdCAtMSBpcyBlbmNvZGVkIGFzIDEsIDEgaXMgZW5jb2RlZCBhcyAyLCAtMiBpcyBlbmNvZGVkIGFzIDMsIGFuZCBzbyBvbgorICAgICBaaWdaYWcgZW5jb2RpbmcgbWFwcyBzaWduZWQgaW50ZWdlcnMgdG8gdW5zaWduZWQgaW50ZWdlcnMgc28gdGhhdAorICAgICBudW1iZXJzIHdpdGggYSBzbWFsbCBhYnNvbHV0ZSB2YWx1ZSAoZm9yIGluc3RhbmNlLCAtMSkgaGF2ZQorICAgICBhIHNtYWxsIHZhcmludCBlbmNvZGVkIHZhbHVlIHRvby4gSXQgZG9lcyB0aGlzIGluIGEgd2F5IHRoYXQKKyAgICAgInppZy16YWdzIiBiYWNrIGFuZCBmb3J0aCB0aHJvdWdoIHRoZSBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgaW50ZWdlcnMsCisgICAgIHNvIHRoYXQgLTEgaXMgZW5jb2RlZCBhcyAxLCAxIGlzIGVuY29kZWQgYXMgMiwgLTIgaXMgZW5jb2RlZCBhcyAzLCBhbmQgc28KKyAgICAgICAgIG9uCiAgICAqLwotICByZXR1cm4gKHVpbnQzMl90KShuIDw8IDEpIF4gKHVpbnQzMl90KShuID4+IDMxKTsKKyAgcmV0dXJuIChVSW50MzIpKG4gPDwgMSkgXiAoVUludDMyKShuID4+IDMxKTsKIH0KIAotLSAodWludDY0X3QpIGk2NFRvWmlnWmFnOiAoaW50NjRfdCkgbgorLShVSW50NjQpIGk2NFRvWmlnWmFnOihTSW50NjQpbgogewotICByZXR1cm4gKHVpbnQ2NF90KShuIDw8IDEpIF4gKHVpbnQ2NF90KShuID4+IDYzKTsKKyAgcmV0dXJuIChVSW50NjQpKG4gPDwgMSkgXiAoVUludDY0KShuID4+IDYzKTsKIH0KIAotLSAodm9pZCkgcmVhZE1lc3NhZ2VCZWdpblJldHVybmluZ05hbWU6IChOU1N0cmluZyAqKikgcG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAoaW50ICopIHB0eXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDogKGludCAqKSBwc2VxdWVuY2VJRAorLShCT09MKSByZWFkTWVzc2FnZUJlZ2luUmV0dXJuaW5nTmFtZTooTlNTdHJpbmcgKiopcG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6KFNJbnQzMiAqKXB0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOihTSW50MzIgKilwc2VxdWVuY2VJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgdWludDhfdCBwcm90b2NvbElkID0gW3NlbGYgcmVhZEJ5dGVdOworICBVSW50OCBwcm90b2NvbElkOworICBpZiAoIVtzZWxmIHJlYWRCeXRlOiZwcm90b2NvbElkIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCiAgIGlmIChwcm90b2NvbElkICE9IENPTVBBQ1RfUFJPVE9DT0xfSUQpIHsKLSAgICBAdGhyb3cgW1RQcm90b2NvbEV4Y2VwdGlvbiBleGNlcHRpb25XaXRoTmFtZTogQCJUUHJvdG9jb2xFeGNlcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OiBAIkV4cGVjdGVkIHByb3RvY29sIGlkICVYIGJ1dCBnb3QgJVgiLCBDT01QQUNUX1BST1RPQ09MX0lELCBwcm90b2NvbElkXV07CisgICAgaWYgKGVycm9yKSB7CisgICAgICAqZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFByb3RvY29sRXJyb3JEb21haW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTpUUHJvdG9jb2xFcnJvclVua25vd24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzpAe1RQcm90b2NvbEVycm9yRXh0ZW5kZWRFcnJvcktleTogQChUUHJvdG9jb2xFeHRlbmRlZEVycm9yTWlzbWF0Y2hlZFByb3RvY29sKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEVycm9yRXhwZWN0ZWRJZEtleTogQChDT01QQUNUX1BST1RPQ09MX0lEKX1dOworICAgIH0KKyAgICByZXR1cm4gTk87CiAgIH0KLSAgCi0gIHVpbnQ4X3QgdmVyc2lvbkFuZFR5cGUgPSBbc2VsZiByZWFkQnl0ZV07Ci0gIHVpbnQ4X3QgdmVyc2lvbiA9IHZlcnNpb25BbmRUeXBlICYgQ09NUEFDVF9WRVJTSU9OX01BU0s7CisKKyAgVUludDggdmVyc2lvbkFuZFR5cGU7CisgIGlmICghW3NlbGYgcmVhZEJ5dGU6JnZlcnNpb25BbmRUeXBlIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIFVJbnQ4IHZlcnNpb24gPSB2ZXJzaW9uQW5kVHlwZSAmIENPTVBBQ1RfVkVSU0lPTl9NQVNLOwogICBpZiAodmVyc2lvbiAhPSBDT01QQUNUX1ZFUlNJT04pIHsKLSAgICBAdGhyb3cgW1RQcm90b2NvbEV4Y2VwdGlvbiBleGNlcHRpb25XaXRoTmFtZTogQCJUUHJvdG9jb2xFeGNlcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OiBAIkV4cGVjdGVkIHZlcnNpb24gJWQgYnV0IGdvdCAlZCIsIENPTVBBQ1RfVkVSU0lPTiwgdmVyc2lvbl1dOworICAgIGlmIChlcnJvcikgeworICAgICAgKmVycm9yID0gW05TRXJyb3IgZXJyb3JXaXRoRG9tYWluOlRQcm90b2NvbEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFByb3RvY29sRXJyb3JCYWRWZXJzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86QHtUUHJvdG9jb2xFcnJvckV4cGVjdGVkVmVyc2lvbktleTogQChDT01QQUNUX1ZFUlNJT04pfV07CisgICAgfQorICAgIHJldHVybiBOTzsKICAgfQotICAKKwogICBpbnQgdHlwZSA9ICh2ZXJzaW9uQW5kVHlwZSA+PiBDT01QQUNUX1RZUEVfU0hJRlRfQU1PVU5UKSAmIENPTVBBQ1RfVFlQRV9CSVRTOwotICBpbnQgc2VxdWVuY2VJRCA9IChpbnQpW3NlbGYgcmVhZFZhcmludDMyXTsKLSAgTlNTdHJpbmcqIG5hbWUgPSBbc2VsZiByZWFkU3RyaW5nXTsKLSAgCisgIFVJbnQzMiBzZXF1ZW5jZUlEOworICBpZiAoIVtzZWxmIHJlYWRWYXJpbnQzMjomc2VxdWVuY2VJRCBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKyAgTlNTdHJpbmcgKm5hbWU7CisgIGlmICghW3NlbGYgcmVhZFN0cmluZzombmFtZSBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKwogICBpZiAocHR5cGUgIT0gTlVMTCkgewogICAgICpwdHlwZSA9IHR5cGU7CiAgIH0KQEAgLTM3MSw1OSArNDkwLDc0IEBACiAgIGlmIChwbmFtZSAhPSBOVUxMKSB7CiAgICAgKnBuYW1lID0gbmFtZTsKICAgfQorICByZXR1cm4gWUVTOwogfQogCi0tICh2b2lkKSByZWFkU3RydWN0QmVnaW5SZXR1cm5pbmdOYW1lOiAoTlNTdHJpbmcgKiopIHBuYW1lCistKEJPT0wpIHJlYWRTdHJ1Y3RCZWdpblJldHVybmluZ05hbWU6KE5TU3RyaW5nICoqKXBuYW1lIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICBbbGFzdEZpZWxkIGFkZE9iamVjdDogW05TTnVtYmVyIG51bWJlcldpdGhTaG9ydDogbGFzdEZpZWxkSWRdXTsKLSAgbGFzdEZpZWxkSWQgPSAwOwotICAKKyAgW19sYXN0RmllbGQgYWRkT2JqZWN0OkAoX2xhc3RGaWVsZElkKV07CisgIF9sYXN0RmllbGRJZCA9IDA7CisKICAgaWYgKHBuYW1lICE9IE5VTEwpIHsKICAgICAqcG5hbWUgPSBAIiI7CiAgIH0KKworICByZXR1cm4gWUVTOwogfQogCi0tICh2b2lkKSByZWFkU3RydWN0RW5kCistKEJPT0wpIHJlYWRTdHJ1Y3RFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIGxhc3RGaWVsZElkID0gW1tsYXN0RmllbGQgbGFzdE9iamVjdF0gc2hvcnRWYWx1ZV07Ci0gIFtsYXN0RmllbGQgcmVtb3ZlTGFzdE9iamVjdF07CisgIF9sYXN0RmllbGRJZCA9IFtfbGFzdEZpZWxkLmxhc3RPYmplY3Qgc2hvcnRWYWx1ZV07CisgIFtfbGFzdEZpZWxkIHJlbW92ZUxhc3RPYmplY3RdOworICByZXR1cm4gWUVTOwogfQogCi0tICh2b2lkKSByZWFkRmllbGRCZWdpblJldHVybmluZ05hbWU6IChOU1N0cmluZyAqKikgcG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogKGludCAqKSBwZmllbGRUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6IChpbnQgKikgcGZpZWxkSUQKKy0oQk9PTCkgcmVhZEZpZWxkQmVnaW5SZXR1cm5pbmdOYW1lOihOU1N0cmluZyAqKilwbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6KFNJbnQzMiAqKXBmaWVsZFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOihTSW50MzIgKilwZmllbGRJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIHVpbnQ4X3QgYnl0ZSA9IFtzZWxmIHJlYWRCeXRlXTsKLSAgdWludDhfdCB0eXBlID0gYnl0ZSAmIDB4MGY7Ci0gIAorICBVSW50OCBieXRlOworICBpZiAoIVtzZWxmIHJlYWRCeXRlOiZieXRlIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIFVJbnQ4IHR5cGUgPSBieXRlICYgMHgwZjsKKwogICAvLyBpZiBpdCdzIGEgc3RvcCwgdGhlbiB3ZSBjYW4gcmV0dXJuIGltbWVkaWF0ZWx5LCBhcyB0aGUgc3RydWN0IGlzIG92ZXIuCiAgIGlmICh0eXBlID09IFRDVHlwZV9TVE9QKSB7CiAgICAgaWYgKHBuYW1lICE9IE5VTEwpIHsKICAgICAgICpwbmFtZSA9IEAiIjsKICAgICB9CiAgICAgaWYgKHBmaWVsZFR5cGUgIT0gTlVMTCkgewotICAgICAgKnBmaWVsZFR5cGUgPSBUVHlwZV9TVE9QOworICAgICAgKnBmaWVsZFR5cGUgPSBUVHlwZVNUT1A7CiAgICAgfQogICAgIGlmIChwZmllbGRJRCAhPSBOVUxMKSB7CiAgICAgICAqcGZpZWxkSUQgPSAwOwogICAgIH0KLSAgICByZXR1cm47CisgICAgcmV0dXJuIFlFUzsKICAgfQotICAKKwogICBzaG9ydCBmaWVsZElkID0gMDsKLSAgCisKICAgLy8gbWFzayBvZmYgdGhlIDQgTVNCIG9mIHRoZSB0eXBlIGhlYWRlci4gaXQgY291bGQgY29udGFpbiBhIGZpZWxkIGlkIGRlbHRhLgogICBzaG9ydCBtb2RpZmllciA9IChieXRlICYgMHhmMCkgPj4gNDsKICAgaWYgKG1vZGlmaWVyID09IDApIHsKICAgICAvLyBub3QgYSBkZWx0YS4gbG9vayBhaGVhZCBmb3IgdGhlIHppZ3phZyB2YXJpbnQgZmllbGQgaWQuCi0gICAgZmllbGRJZCA9IFtzZWxmIHJlYWRJMTZdOwotICB9IGVsc2UgewotICAgIC8vIGhhcyBhIGRlbHRhLiBhZGQgdGhlIGRlbHRhIHRvIHRoZSBsYXN0IFJlYWQgZmllbGQgaWQuCi0gICAgZmllbGRJZCA9IGxhc3RGaWVsZElkICsgbW9kaWZpZXI7CisgICAgaWYgKCFbc2VsZiByZWFkSTE2OiZmaWVsZElkIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KICAgfQotICAKLSAgaW50IGZpZWxkVHlwZSA9IFtzZWxmIHR0eXBlRm9yQ29tcGFjdFR5cGU6IHR5cGVdOwotICAKKyAgZWxzZSB7CisgICAgLy8gaGFzIGEgZGVsdGEuIGFkZCB0aGUgZGVsdGEgdG8gdGhlIGxhc3QgUmVhZCBmaWVsZCBpZC4KKyAgICBmaWVsZElkID0gX2xhc3RGaWVsZElkICsgbW9kaWZpZXI7CisgIH0KKworICBVSW50OCBmaWVsZFR5cGU7CisgIGlmICghW3NlbGYgdHR5cGU6JmZpZWxkVHlwZSBmb3JDb21wYWN0VHlwZTp0eXBlIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCiAgIGlmIChwbmFtZSAhPSBOVUxMKSB7CiAgICAgKnBuYW1lID0gQCIiOwogICB9CkBAIC00MzMsMzEgKzU2Nyw0NyBAQAogICBpZiAocGZpZWxkSUQgIT0gTlVMTCkgewogICAgICpwZmllbGRJRCA9IGZpZWxkSWQ7CiAgIH0KLSAgCisKICAgLy8gaWYgdGhpcyBoYXBwZW5zIHRvIGJlIGEgYm9vbGVhbiBmaWVsZCwgdGhlIHZhbHVlIGlzIGVuY29kZWQgaW4gdGhlIHR5cGUKICAgaWYgKHR5cGUgPT0gVENUeXBlX0JPT0xFQU5fVFJVRSB8fAotICAgICAgdHlwZSA9PSBUQ1R5cGVfQk9PTEVBTl9GQUxTRSkgeworICAgICAgdHlwZSA9PSBUQ1R5cGVfQk9PTEVBTl9GQUxTRSkKKyAgewogICAgIC8vIHNhdmUgdGhlIGJvb2xlYW4gdmFsdWUgaW4gYSBzcGVjaWFsIGluc3RhbmNlIHZhcmlhYmxlLgotICAgIGJvb2xlYW5WYWx1ZSA9IFtbTlNOdW1iZXIgbnVtYmVyV2l0aEJvb2w6IHR5cGUgPT0gVENUeXBlX0JPT0xFQU5fVFJVRV0gcmV0YWluX3N0dWJdOworICAgIF9ib29sZWFuVmFsdWUgPSBbTlNOdW1iZXIgbnVtYmVyV2l0aEJvb2w6dHlwZSA9PSBUQ1R5cGVfQk9PTEVBTl9UUlVFXTsKICAgfQotICAKKwogICAvLyBwdXNoIHRoZSBuZXcgZmllbGQgb250byB0aGUgZmllbGQgc3RhY2sgc28gd2UgY2FuIGtlZXAgdGhlIGRlbHRhcyBnb2luZy4KLSAgbGFzdEZpZWxkSWQgPSBmaWVsZElkOworICBfbGFzdEZpZWxkSWQgPSBmaWVsZElkOworCisgIHJldHVybiBZRVM7CiB9CiAKLS0gKHZvaWQpIHJlYWRNYXBCZWdpblJldHVybmluZ0tleVR5cGU6IChpbnQgKikgcGtleVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVR5cGU6IChpbnQgKikgcHZhbHVlVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogKGludCAqKSBwc2l6ZQorLShCT09MKSByZWFkTWFwQmVnaW5SZXR1cm5pbmdLZXlUeXBlOihTSW50MzIgKilwa2V5VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVUeXBlOihTSW50MzIgKilwdmFsdWVUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMiAqKXBzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIHVpbnQ4X3Qga2V5QW5kVmFsdWVUeXBlID0gMDsKLSAgaW50IHNpemUgPSAoaW50KVtzZWxmIHJlYWRWYXJpbnQzMl07Ci0gIGlmIChzaXplICE9IDApIHsKLSAgICBrZXlBbmRWYWx1ZVR5cGUgPSBbc2VsZiByZWFkQnl0ZV07CisgIFVJbnQ4IGtleUFuZFZhbHVlVHlwZSA9IDA7CisgIFVJbnQzMiBzaXplOworICBpZiAoIVtzZWxmIHJlYWRWYXJpbnQzMjomc2l6ZSBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CiAgIH0KLSAgCi0gIGludCBrZXlUeXBlID0gW3NlbGYgdHR5cGVGb3JDb21wYWN0VHlwZToga2V5QW5kVmFsdWVUeXBlID4+IDRdOwotICBpbnQgdmFsdWVUeXBlID0gW3NlbGYgdHR5cGVGb3JDb21wYWN0VHlwZToga2V5QW5kVmFsdWVUeXBlICYgMHhmXTsKLSAgCisgIGlmIChzaXplICE9IDApIHsKKyAgICBpZiAoIVtzZWxmIHJlYWRCeXRlOiZrZXlBbmRWYWx1ZVR5cGUgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorICB9CisKKyAgVUludDgga2V5VHlwZTsKKyAgaWYgKCFbc2VsZiB0dHlwZToma2V5VHlwZSBmb3JDb21wYWN0VHlwZTprZXlBbmRWYWx1ZVR5cGUgPj4gNCBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBVSW50OCB2YWx1ZVR5cGU7CisgIGlmICghW3NlbGYgdHR5cGU6JnZhbHVlVHlwZSBmb3JDb21wYWN0VHlwZTprZXlBbmRWYWx1ZVR5cGUgJiAweGYgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKICAgaWYgKHBrZXlUeXBlICE9IE5VTEwpIHsKICAgICAqcGtleVR5cGUgPSBrZXlUeXBlOwogICB9CkBAIC00NjcsMjIwICs2MTcsMzY2IEBACiAgIGlmIChwc2l6ZSAhPSBOVUxMKSB7CiAgICAgKnBzaXplID0gc2l6ZTsKICAgfQorCisgIHJldHVybiBZRVM7CiB9CiAKLS0gKHZvaWQpIHJlYWRMaXN0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZTogKGludCAqKSBwZWxlbWVudFR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogKGludCAqKSBwc2l6ZQorLShCT09MKSByZWFkTGlzdEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6KFNJbnQzMiAqKXBlbGVtZW50VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMiAqKXBzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgdWludDhfdCBzaXplX2FuZF90eXBlID0gW3NlbGYgcmVhZEJ5dGVdOwotICBpbnQgc2l6ZSA9IChzaXplX2FuZF90eXBlID4+IDQpICYgMHgwZjsKLSAgaWYgKHNpemUgPT0gMTUpIHsKLSAgICBzaXplID0gKGludClbc2VsZiByZWFkVmFyaW50MzJdOworICBVSW50OCBzaXplQW5kVHlwZTsKKyAgaWYgKCFbc2VsZiByZWFkQnl0ZTomc2l6ZUFuZFR5cGUgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POwogICB9Ci0gIAotICBpbnQgZWxlbWVudFR5cGUgPSBbc2VsZiB0dHlwZUZvckNvbXBhY3RUeXBlOiBzaXplX2FuZF90eXBlICYgMHgwZl07Ci0gIAorCisgIFVJbnQzMiBzaXplID0gKHNpemVBbmRUeXBlID4+IDQpICYgMHgwZjsKKyAgaWYgKHNpemUgPT0gMTUpIHsKKyAgICBpZiAoIVtzZWxmIHJlYWRWYXJpbnQzMjomc2l6ZSBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgIH0KKworICBVSW50OCBlbGVtZW50VHlwZTsKKyAgaWYgKCFbc2VsZiB0dHlwZTomZWxlbWVudFR5cGUgZm9yQ29tcGFjdFR5cGU6c2l6ZUFuZFR5cGUgJiAweDBmIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCiAgIGlmIChwZWxlbWVudFR5cGUgIT0gTlVMTCkgewogICAgICpwZWxlbWVudFR5cGUgPSBlbGVtZW50VHlwZTsKICAgfQogICBpZiAocHNpemUgIT0gTlVMTCkgewogICAgICpwc2l6ZSA9IHNpemU7CiAgIH0KKworICByZXR1cm4gWUVTOwogfQogCi0tICh2b2lkKSByZWFkU2V0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZTogKGludCAqKSBwZWxlbWVudFR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiAoaW50ICopIHBzaXplCistKEJPT0wpIHJlYWRTZXRCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOihTSW50MzIgKilwZWxlbWVudFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMiAqKXBzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICBbc2VsZiByZWFkTGlzdEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6IHBlbGVtZW50VHlwZSBzaXplOiBwc2l6ZV07CisgIHJldHVybiBbc2VsZiByZWFkTGlzdEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6cGVsZW1lbnRUeXBlIHNpemU6cHNpemUgZXJyb3I6ZXJyb3JdOwogfQogCi0tIChCT09MKSByZWFkQm9vbAorLShCT09MKSByZWFkQm9vbDooQk9PTCAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICBpZiAoYm9vbGVhblZhbHVlICE9IG5pbCkgewotICAgIEJPT0wgcmVzdWx0ID0gW2Jvb2xlYW5WYWx1ZSBib29sVmFsdWVdOwotICAgIFtib29sZWFuVmFsdWUgcmVsZWFzZV9zdHViXTsKLSAgICBib29sZWFuVmFsdWUgPSBuaWw7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gW3NlbGYgcmVhZEJ5dGVdID09IFRDVHlwZV9CT09MRUFOX1RSVUU7CisgIGlmIChfYm9vbGVhblZhbHVlICE9IG5pbCkgeworCisgICAgQk9PTCByZXN1bHQgPSBfYm9vbGVhblZhbHVlLmJvb2xWYWx1ZTsKKyAgICBfYm9vbGVhblZhbHVlID0gbmlsOworCisgICAgKnZhbHVlID0gcmVzdWx0OwogICB9CisgIGVsc2UgeworCisgICAgVUludDggcmVzdWx0OworICAgIGlmICghW3NlbGYgcmVhZEJ5dGU6JnJlc3VsdCBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisKKyAgICAqdmFsdWUgPSByZXN1bHQgPT0gVENUeXBlX0JPT0xFQU5fVFJVRTsKKyAgfQorCisgIHJldHVybiBZRVM7CiB9CiAKLS0gKHVpbnQ4X3QpIHJlYWRCeXRlCistKEJPT0wpIHJlYWRCeXRlOihVSW50OCAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICB1aW50OF90IGJ1ZiA9IDA7Ci0gIFttVHJhbnNwb3J0IHJlYWRBbGw6ICZidWYgb2Zmc2V0OiAwIGxlbmd0aDogMV07Ci0gIHJldHVybiBidWY7CisgIGlmICghW190cmFuc3BvcnQgcmVhZEFsbDp2YWx1ZSBvZmZzZXQ6MCBsZW5ndGg6MSBlcnJvcjplcnJvcl0pIHsKKyAgICBQUk9UT0NPTF9UUkFOU1BPUlRfRVJST1IoTk8sIGVycm9yLCBAIlRyYW5zcG9ydCByZWFkIGZhaWxlZCIpOworICB9CisgIHJldHVybiBZRVM7CiB9CiAKLS0gKGludDE2X3QpIHJlYWRJMTYKKy0oQk9PTCkgcmVhZEkxNjooU0ludDE2ICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIHJldHVybiAoaW50MTZfdClbc2VsZiB6aWdaYWdUb2kzMjogW3NlbGYgcmVhZFZhcmludDMyXV07CisgIFVJbnQzMiB2OworICBpZiAoIVtzZWxmIHJlYWRWYXJpbnQzMjomdiBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBpZiAodmFsdWUpIHsKKyAgICAqdmFsdWUgPSAoU0ludDE2KVtzZWxmIHppZ1phZ1RvaTMyOnZdOworICB9CisKKyAgcmV0dXJuIFlFUzsKIH0KIAotLSAoaW50MzJfdCkgcmVhZEkzMgorLShCT09MKSByZWFkSTMyOihTSW50MzIgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgcmV0dXJuIFtzZWxmIHppZ1phZ1RvaTMyOiBbc2VsZiByZWFkVmFyaW50MzJdXTsKKyAgVUludDMyIHY7CisgIGlmICghW3NlbGYgcmVhZFZhcmludDMyOiZ2IGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIGlmICh2YWx1ZSkgeworICAgICp2YWx1ZSA9IFtzZWxmIHppZ1phZ1RvaTMyOnZdOworICB9CisKKyAgcmV0dXJuIFlFUzsKIH0KIAotLSAoaW50NjRfdCkgcmVhZEk2NAorLShCT09MKSByZWFkSTY0OihTSW50NjQgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgcmV0dXJuIFtzZWxmIHppZ1phZ1RvaTY0OiBbc2VsZiByZWFkVmFyaW50NjRdXTsKKyAgVUludDY0IHY7CisgIGlmICghW3NlbGYgcmVhZFZhcmludDY0OiZ2IGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIGlmICh2YWx1ZSkgeworICAgICp2YWx1ZSA9IFtzZWxmIHppZ1phZ1RvaTY0OnZdOworICB9CisKKyAgcmV0dXJuIFlFUzsKIH0KIAotLSAoZG91YmxlKSByZWFkRG91YmxlCistKEJPT0wpIHJlYWREb3VibGU6KGRvdWJsZSAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICB1aW50NjRfdCBiaXRzID0gMDsKLSAgW21UcmFuc3BvcnQgcmVhZEFsbDogKHVpbnQ4X3QgKikmYml0cyBvZmZzZXQ6IDAgbGVuZ3RoOiA4XTsKKyAgVUludDY0IGJpdHM7CisgIGlmICghW190cmFuc3BvcnQgcmVhZEFsbDooVUludDggKikmYml0cyBvZmZzZXQ6MCBsZW5ndGg6OCBlcnJvcjplcnJvcl0pIHsKKyAgICBQUk9UT0NPTF9UUkFOU1BPUlRfRVJST1IoTk8sIGVycm9yLCBAIlRyYW5zcG9ydCByZWFkIGZhaWxlZCIpOworICB9CisKICAgYml0cyA9IE9TU3dhcExpdHRsZVRvSG9zdEludDY0KGJpdHMpOwotICAKLSAgZG91YmxlIHJlc3VsdCA9IDA7Ci0gIG1lbWNweSgmcmVzdWx0LCAmYml0cywgOCk7Ci0gIAotICByZXR1cm4gcmVzdWx0OwotfQogCi0tIChOU1N0cmluZyAqKSByZWFkU3RyaW5nCi17Ci0gIGludCBsZW5ndGggPSAoaW50KVtzZWxmIHJlYWRWYXJpbnQzMl07Ci0gIGlmIChsZW5ndGggPT0gMCkgewotICAgIHJldHVybiBAIiI7CisgIGlmICh2YWx1ZSkgeworICAgIG1lbWNweSh2YWx1ZSwgJmJpdHMsIHNpemVvZihiaXRzKSk7CiAgIH0KLSAgCi0gIHJldHVybiBbW1tOU1N0cmluZyBhbGxvY10gaW5pdFdpdGhEYXRhOiBbc2VsZiByZWFkQmluYXJ5OiBsZW5ndGhdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nOiBOU1VURjhTdHJpbmdFbmNvZGluZ10gYXV0b3JlbGVhc2Vfc3R1Yl07CisKKyAgcmV0dXJuIFlFUzsKIH0KIAotLSAoTlNEYXRhICopIHJlYWRCaW5hcnkKKy0oQk9PTCkgcmVhZFN0cmluZzooTlNTdHJpbmcgKl9fYXV0b3JlbGVhc2luZyAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICByZXR1cm4gW3NlbGYgcmVhZEJpbmFyeTogKGludClbc2VsZiByZWFkVmFyaW50MzJdXTsKLX0KLQotLSAoTlNEYXRhICopIHJlYWRCaW5hcnk6IChpbnQpIGxlbmd0aAotewotICBpZiAobGVuZ3RoID09IDApIHsKLSAgICByZXR1cm4gW05TRGF0YSBkYXRhXTsKKyAgVUludDMyIGxlbmd0aDsKKyAgaWYgKCFbc2VsZiByZWFkVmFyaW50MzI6Jmxlbmd0aCBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CiAgIH0KLSAgCi0gIE5TTXV0YWJsZURhdGEqIGJ1ZiA9IFtOU011dGFibGVEYXRhIGRhdGFXaXRoTGVuZ3RoOiBsZW5ndGhdOwotICBbbVRyYW5zcG9ydCByZWFkQWxsOiBidWYubXV0YWJsZUJ5dGVzIG9mZnNldDogMCBsZW5ndGg6IGxlbmd0aF07Ci0gIHJldHVybiBidWY7CisKKyAgTlNTdHJpbmcgKnJlc3VsdDsKKworICBpZiAobGVuZ3RoICE9IDApIHsKKworICAgIE5TRGF0YSAqZGF0YTsKKyAgICBpZiAoIVtzZWxmIHJlYWRCaW5hcnlPZkxlbmd0aDpsZW5ndGggZGF0YTomZGF0YSBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisKKyAgICByZXN1bHQgPSBbW05TU3RyaW5nIGFsbG9jXSBpbml0V2l0aERhdGE6ZGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZzpOU1VURjhTdHJpbmdFbmNvZGluZ107CisgIH0KKyAgZWxzZSB7CisgICAgcmVzdWx0ID0gQCIiOworICB9CisKKyAgaWYgKHZhbHVlKSB7CisgICAgKnZhbHVlID0gcmVzdWx0OworICB9CisKKyAgcmV0dXJuIFlFUzsKIH0KIAotLSAodm9pZCkgcmVhZE1lc3NhZ2VFbmQge30KLS0gKHZvaWQpIHJlYWRGaWVsZEVuZCB7fQotLSAodm9pZCkgcmVhZE1hcEVuZCB7fQotLSAodm9pZCkgcmVhZExpc3RFbmQge30KLS0gKHZvaWQpIHJlYWRTZXRFbmQge30KLQotLSAodWludDMyX3QpIHJlYWRWYXJpbnQzMgorLShCT09MKSByZWFkQmluYXJ5OihOU0RhdGEgKl9fYXV0b3JlbGVhc2luZyAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICB1aW50MzJfdCByZXN1bHQgPSAwOworICBVSW50MzIgbGVuZ3RoOworICBpZiAoIVtzZWxmIHJlYWRWYXJpbnQzMjombGVuZ3RoIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIHJldHVybiBbc2VsZiByZWFkQmluYXJ5T2ZMZW5ndGg6bGVuZ3RoIGRhdGE6dmFsdWUgZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHJlYWRCaW5hcnlPZkxlbmd0aDooVUludDMyKWxlbmd0aCBkYXRhOihOU0RhdGEgKl9fYXV0b3JlbGVhc2luZyAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBOU0RhdGEgKnJlc3VsdDsKKworICBpZiAobGVuZ3RoICE9IDApIHsKKworICAgIE5TTXV0YWJsZURhdGEgKmJ1ZiA9IFtOU011dGFibGVEYXRhIGRhdGFXaXRoTGVuZ3RoOmxlbmd0aF07CisgICAgaWYgKCFbX3RyYW5zcG9ydCByZWFkQWxsOmJ1Zi5tdXRhYmxlQnl0ZXMgb2Zmc2V0OjAgbGVuZ3RoOmxlbmd0aCBlcnJvcjplcnJvcl0pIHsKKyAgICAgIFBST1RPQ09MX1RSQU5TUE9SVF9FUlJPUihOTywgZXJyb3IsIEAiVHJhbnNwb3J0IHJlYWQgZmFpbGVkIik7CisgICAgfQorCisgICAgcmVzdWx0ID0gYnVmOworICB9CisgIGVsc2UgeworCisgICAgcmVzdWx0ID0gW05TRGF0YSBkYXRhXTsKKworICB9CisKKyAgaWYgKHZhbHVlKSB7CisgICAgKnZhbHVlID0gcmVzdWx0OworICB9CisKKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSByZWFkTWVzc2FnZUVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFlFUzsKK30KKy0oQk9PTCkgcmVhZEZpZWxkRW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gWUVTOworfQorLShCT09MKSByZWFkTWFwRW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gWUVTOworfQorLShCT09MKSByZWFkTGlzdEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFlFUzsKK30KKy0oQk9PTCkgcmVhZFNldEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSByZWFkVmFyaW50MzI6KFVJbnQzMiAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50MzIgcmVzdWx0ID0gMDsKICAgaW50IHNoaWZ0ID0gMDsKLSAgCisKICAgd2hpbGUgKHRydWUpIHsKLSAgICB1aW50OF90IGJ5dGUgPSBbc2VsZiByZWFkQnl0ZV07Ci0gICAgcmVzdWx0IHw9ICh1aW50MzJfdCkoYnl0ZSAmIDB4N2YpIDw8IHNoaWZ0OworCisgICAgVUludDggYnl0ZTsKKyAgICBpZiAoIVtzZWxmIHJlYWRCeXRlOiZieXRlIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKworICAgIHJlc3VsdCB8PSAoVUludDMyKShieXRlICYgMHg3ZikgPDwgc2hpZnQ7CiAgICAgaWYgKCEoYnl0ZSAmIDB4ODApKSB7CiAgICAgICBicmVhazsKICAgICB9Ci0gICAgCisKICAgICBzaGlmdCArPSA3OwogICB9Ci0gIHJldHVybiByZXN1bHQ7CisKKyAgaWYgKHZhbHVlKSB7CisgICAgKnZhbHVlID0gcmVzdWx0OworICB9CisKKyAgcmV0dXJuIFlFUzsKIH0KIAotLSAodWludDY0X3QpIHJlYWRWYXJpbnQ2NAorLShCT09MKSByZWFkVmFyaW50NjQ6KFVJbnQ2NCAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewogICBpbnQgc2hpZnQgPSAwOwotICB1aW50NjRfdCByZXN1bHQgPSAwOwotICAKKyAgVUludDY0IHJlc3VsdCA9IDA7CisKICAgd2hpbGUgKHRydWUpIHsKLSAgICB1aW50OF90IGJ5dGUgPSBbc2VsZiByZWFkQnl0ZV07Ci0gICAgcmVzdWx0IHw9ICh1aW50NjRfdCkoYnl0ZSAmIDB4N2YpIDw8IHNoaWZ0OworCisgICAgVUludDggYnl0ZTsKKyAgICBpZiAoIVtzZWxmIHJlYWRCeXRlOiZieXRlIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKworICAgIHJlc3VsdCB8PSAoVUludDY0KShieXRlICYgMHg3ZikgPDwgc2hpZnQ7CiAgICAgaWYgKCEoYnl0ZSAmIDB4ODApKSB7CiAgICAgICBicmVhazsKICAgICB9Ci0gICAgCisKICAgICBzaGlmdCArPSA3OwogICB9Ci0gIAotICByZXR1cm4gcmVzdWx0OworCisgIGlmICh2YWx1ZSkgeworICAgICp2YWx1ZSA9IHJlc3VsdDsKKyAgfQorCisgIHJldHVybiBZRVM7CiB9CiAKLS0gKGludDMyX3QpIHppZ1phZ1RvaTMyOiAodWludDMyX3QpIG4KKy0oU0ludDMyKSB6aWdaYWdUb2kzMjooVUludDMyKW4KIHsKLSAgcmV0dXJuIChpbnQzMl90KShuID4+IDEpIF4gKC0oaW50MzJfdCkobiAmIDEpKTsKKyAgcmV0dXJuIChTSW50MzIpKG4gPj4gMSkgXiAoLShTSW50MzIpKG4gJiAxKSk7CiB9CiAKLS0gKGludDY0X3QpIHppZ1phZ1RvaTY0OiAodWludDY0X3QpIG4KKy0oU0ludDY0KSB6aWdaYWdUb2k2NDooVUludDY0KW4KIHsKLSAgcmV0dXJuIChpbnQ2NF90KShuID4+IDEpIF4gKC0oaW50NjRfdCkobiAmIDEpKTsKKyAgcmV0dXJuIChTSW50NjQpKG4gPj4gMSkgXiAoLShTSW50NjQpKG4gJiAxKSk7CiB9CiAKLS0gKHVpbnQ4X3QpIHR0eXBlRm9yQ29tcGFjdFR5cGU6ICh1aW50OF90KSB0eXBlCistKEJPT0wpIHR0eXBlOihVSW50OCAqKXR0eXBlIGZvckNvbXBhY3RUeXBlOihVSW50OCljdHlwZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgc3dpdGNoICh0eXBlICYgMHgwZikgewotICAgIGNhc2UgVENUeXBlX1NUT1A6Ci0gICAgICByZXR1cm4gVFR5cGVfU1RPUDsKLSAgICAgIAotICAgIGNhc2UgVENUeXBlX0JPT0xFQU5fRkFMU0U6Ci0gICAgY2FzZSBUQ1R5cGVfQk9PTEVBTl9UUlVFOgotICAgICAgcmV0dXJuIFRUeXBlX0JPT0w7Ci0gICAgICAKLSAgICBjYXNlIFRDVHlwZV9CWVRFOgotICAgICAgcmV0dXJuIFRUeXBlX0JZVEU7Ci0gICAgICAKLSAgICBjYXNlIFRDVHlwZV9JMTY6Ci0gICAgICByZXR1cm4gVFR5cGVfSTE2OwotICAgICAgCi0gICAgY2FzZSBUQ1R5cGVfSTMyOgotICAgICAgcmV0dXJuIFRUeXBlX0kzMjsKLSAgICAgIAotICAgIGNhc2UgVENUeXBlX0k2NDoKLSAgICAgIHJldHVybiBUVHlwZV9JNjQ7Ci0gICAgICAKLSAgICBjYXNlIFRDVHlwZV9ET1VCTEU6Ci0gICAgICByZXR1cm4gVFR5cGVfRE9VQkxFOwotICAgICAgCi0gICAgY2FzZSBUQ1R5cGVfQklOQVJZOgotICAgICAgcmV0dXJuIFRUeXBlX1NUUklORzsKLSAgICAgIAotICAgIGNhc2UgVENUeXBlX0xJU1Q6Ci0gICAgICByZXR1cm4gVFR5cGVfTElTVDsKLSAgICAgIAotICAgIGNhc2UgVENUeXBlX1NFVDoKLSAgICAgIHJldHVybiBUVHlwZV9TRVQ7Ci0gICAgICAKLSAgICBjYXNlIFRDVHlwZV9NQVA6Ci0gICAgICByZXR1cm4gVFR5cGVfTUFQOwotICAgICAgCi0gICAgY2FzZSBUQ1R5cGVfU1RSVUNUOgotICAgICAgcmV0dXJuIFRUeXBlX1NUUlVDVDsKLSAgICAgIAotICAgIGRlZmF1bHQ6Ci0gICAgICBAdGhyb3cgW1RQcm90b2NvbEV4Y2VwdGlvbiBleGNlcHRpb25XaXRoTmFtZTogQCJUUHJvdG9jb2xFeGNlcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjogW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6IEAiRG9uJ3Qga25vdyB3aGF0IHR5cGU6ICVkIiwgKHVpbnQ4X3QpKHR5cGUgJiAweDBGKV1dOworICBzd2l0Y2ggKGN0eXBlICYgMHgwZikgeworICBjYXNlIFRDVHlwZV9TVE9QOgorICAgICp0dHlwZSA9IFRUeXBlU1RPUDsKKyAgICByZXR1cm4gWUVTOworCisgIGNhc2UgVENUeXBlX0JPT0xFQU5fRkFMU0U6CisgIGNhc2UgVENUeXBlX0JPT0xFQU5fVFJVRToKKyAgICAqdHR5cGUgPSBUVHlwZUJPT0w7CisgICAgcmV0dXJuIFlFUzsKKworICBjYXNlIFRDVHlwZV9CWVRFOgorICAgICp0dHlwZSA9IFRUeXBlQllURTsKKyAgICByZXR1cm4gWUVTOworCisgIGNhc2UgVENUeXBlX0kxNjoKKyAgICAqdHR5cGUgPSBUVHlwZUkxNjsKKyAgICByZXR1cm4gWUVTOworCisgIGNhc2UgVENUeXBlX0kzMjoKKyAgICAqdHR5cGUgPSBUVHlwZUkzMjsKKyAgICByZXR1cm4gWUVTOworCisgIGNhc2UgVENUeXBlX0k2NDoKKyAgICAqdHR5cGUgPSBUVHlwZUk2NDsKKyAgICByZXR1cm4gWUVTOworCisgIGNhc2UgVENUeXBlX0RPVUJMRToKKyAgICAqdHR5cGUgPSBUVHlwZURPVUJMRTsKKyAgICByZXR1cm4gWUVTOworCisgIGNhc2UgVENUeXBlX0JJTkFSWToKKyAgICAqdHR5cGUgPSBUVHlwZVNUUklORzsKKyAgICByZXR1cm4gWUVTOworCisgIGNhc2UgVENUeXBlX0xJU1Q6CisgICAgKnR0eXBlID0gVFR5cGVMSVNUOworICAgIHJldHVybiBZRVM7CisKKyAgY2FzZSBUQ1R5cGVfU0VUOgorICAgICp0dHlwZSA9IFRUeXBlU0VUOworICAgIHJldHVybiBZRVM7CisKKyAgY2FzZSBUQ1R5cGVfTUFQOgorICAgICp0dHlwZSA9IFRUeXBlTUFQOworICAgIHJldHVybiBZRVM7CisKKyAgY2FzZSBUQ1R5cGVfU1RSVUNUOgorICAgICp0dHlwZSA9IFRUeXBlU1RSVUNUOworICAgIHJldHVybiBZRVM7CisKKyAgZGVmYXVsdDoKKyAgICBpZiAoZXJyb3IpIHsKKyAgICAgICplcnJvciA9IFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjpUUHJvdG9jb2xFcnJvckRvbWFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOlRQcm90b2NvbEVycm9yVW5rbm93bgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOkB7VFByb3RvY29sRXJyb3JUeXBlS2V5OiBAKChVSW50OCkoY3R5cGUgJiAweDBGKSl9XTsKKyAgICB9CisgICAgcmV0dXJuIE5POwogICB9CiB9CiAKLS0gKHVpbnQ4X3QpIGNvbXBhY3RUeXBlRm9yVFR5cGU6ICh1aW50OF90KSB0dHlwZQorLShVSW50OCkgY29tcGFjdFR5cGVGb3JUVHlwZTooVUludDgpdHR5cGUKIHsKLSAgc3RhdGljIHVpbnQ4X3QgdHR5cGVUb0NvbXBhY3RUeXBlW10gPSB7Ci0gICAgW1RUeXBlX1NUT1BdID0gVENUeXBlX1NUT1AsCi0gICAgW1RUeXBlX0JPT0xdID0gVENUeXBlX0JPT0xFQU5fRkFMU0UsCi0gICAgW1RUeXBlX0JZVEVdID0gVENUeXBlX0JZVEUsCi0gICAgW1RUeXBlX0RPVUJMRV0gPSBUQ1R5cGVfRE9VQkxFLAotICAgIFtUVHlwZV9JMTZdID0gVENUeXBlX0kxNiwKLSAgICBbVFR5cGVfSTMyXSA9IFRDVHlwZV9JMzIsCi0gICAgW1RUeXBlX0k2NF0gPSBUQ1R5cGVfSTY0LAotICAgIFtUVHlwZV9TVFJJTkddID0gVENUeXBlX0JJTkFSWSwKLSAgICBbVFR5cGVfU1RSVUNUXSA9IFRDVHlwZV9TVFJVQ1QsCi0gICAgW1RUeXBlX01BUF0gPSBUQ1R5cGVfTUFQLAotICAgIFtUVHlwZV9TRVRdID0gVENUeXBlX1NFVCwKLSAgICBbVFR5cGVfTElTVF0gPSBUQ1R5cGVfTElTVAorICBzdGF0aWMgVUludDggdHR5cGVUb0NvbXBhY3RUeXBlW10gPSB7CisgICAgW1RUeXBlU1RPUF0gPSBUQ1R5cGVfU1RPUCwKKyAgICBbVFR5cGVCT09MXSA9IFRDVHlwZV9CT09MRUFOX0ZBTFNFLAorICAgIFtUVHlwZUJZVEVdID0gVENUeXBlX0JZVEUsCisgICAgW1RUeXBlRE9VQkxFXSA9IFRDVHlwZV9ET1VCTEUsCisgICAgW1RUeXBlSTE2XSA9IFRDVHlwZV9JMTYsCisgICAgW1RUeXBlSTMyXSA9IFRDVHlwZV9JMzIsCisgICAgW1RUeXBlSTY0XSA9IFRDVHlwZV9JNjQsCisgICAgW1RUeXBlU1RSSU5HXSA9IFRDVHlwZV9CSU5BUlksCisgICAgW1RUeXBlU1RSVUNUXSA9IFRDVHlwZV9TVFJVQ1QsCisgICAgW1RUeXBlTUFQXSA9IFRDVHlwZV9NQVAsCisgICAgW1RUeXBlU0VUXSA9IFRDVHlwZV9TRVQsCisgICAgW1RUeXBlTElTVF0gPSBUQ1R5cGVfTElTVAogICB9OwotICAKKwogICByZXR1cm4gdHR5cGVUb0NvbXBhY3RUeXBlW3R0eXBlXTsKIH0KIApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5oIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5oCmluZGV4IGYyOTg0NTkuLmI4Y2UzNjEgMTAwNjQ0Ci0tLSBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuaAorKysgYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmgKQEAgLTIxLDEzICsyMSwxOCBAQAogCiAjaW1wb3J0ICJUUHJvdG9jb2xEZWNvcmF0b3IuaCIKIAotRk9VTkRBVElPTl9FWFBPUlQgTlNTdHJpbmcgKmNvbnN0IE1VTFRJUExFWEVEX1NFUlZJQ0VfU0VQRVJBVE9SOworTlNfQVNTVU1FX05PTk5VTExfQkVHSU4KIAotQGludGVyZmFjZSBUTXVsdGlwbGV4ZWRQcm90b2NvbCA6IFRQcm90b2NvbERlY29yYXRvciB7Ci0gICAgTlNTdHJpbmcgKiBtU2VydmljZU5hbWU7Ci19CiAKLS0gKGlkKSBpbml0V2l0aFByb3RvY29sOiAoaWQgPFRQcm90b2NvbD4pIHByb3RvY29sCi0gICAgICAgICAgICBzZXJ2aWNlTmFtZTogKE5TU3RyaW5nICopIG5hbWU7CitleHRlcm4gTlNTdHJpbmcgKlRNdWx0aXBsZXhlZFByb3RvY29sU2VwZXJhdG9yOworCisKK0BpbnRlcmZhY2UgVE11bHRpcGxleGVkUHJvdG9jb2wgOiBUUHJvdG9jb2xEZWNvcmF0b3IKKworLShpZCkgaW5pdFdpdGhQcm90b2NvbDooaWQgPFRQcm90b2NvbD4pcHJvdG9jb2wKKyAgICAgICAgICAgc2VydmljZU5hbWU6KE5TU3RyaW5nICopbmFtZTsKIAogQGVuZAorCisKK05TX0FTU1VNRV9OT05OVUxMX0VORApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wubSBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wubQppbmRleCA0OTA5NWUzLi41ODM4YzU3IDEwMDY0NAotLS0gYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLm0KKysrIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5tCkBAIC0yMCw0OCArMjAsNDcgQEAKICNpbXBvcnQgIlRNdWx0aXBsZXhlZFByb3RvY29sLmgiCiAKICNpbXBvcnQgIlRQcm90b2NvbC5oIgotI2ltcG9ydCAiVE9iamVjdGl2ZS1DLmgiCiAKLU5TU3RyaW5nICpjb25zdCBNVUxUSVBMRVhFRF9TRVJWSUNFX1NFUEVSQVRPUiA9IEAiOiI7CitOU1N0cmluZyAqVE11bHRpcGxleGVkUHJvdG9jb2xTZXBlcmF0b3IgPSBAIjoiOworCisKK0BpbnRlcmZhY2UgVE11bHRpcGxleGVkUHJvdG9jb2wgKCkKKworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBOU1N0cmluZyAqc2VydmljZU5hbWU7CisKK0BlbmQKKwogCiBAaW1wbGVtZW50YXRpb24gVE11bHRpcGxleGVkUHJvdG9jb2wKIAotLSAoaWQpIGluaXRXaXRoUHJvdG9jb2w6IChpZCA8VFByb3RvY29sPikgcHJvdG9jb2wKLSAgICAgICAgICAgIHNlcnZpY2VOYW1lOiAoTlNTdHJpbmcgKikgbmFtZQorLShpZCkgaW5pdFdpdGhQcm90b2NvbDooaWQgPFRQcm90b2NvbD4pcHJvdG9jb2wKKyAgICAgICAgICAgc2VydmljZU5hbWU6KE5TU3RyaW5nICopbmFtZQogewotICAgIHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhQcm90b2NvbDpwcm90b2NvbF07Ci0KLSAgICBpZiAoc2VsZikgewotICAgICAgICBtU2VydmljZU5hbWUgPSBbbmFtZSByZXRhaW5fc3R1Yl07Ci0gICAgfQotICAgIHJldHVybiBzZWxmOworICBzZWxmID0gW3N1cGVyIGluaXRXaXRoUHJvdG9jb2w6cHJvdG9jb2xdOworICBpZiAoc2VsZikgeworICAgIF9zZXJ2aWNlTmFtZSA9IG5hbWU7CisgIH0KKyAgcmV0dXJuIHNlbGY7CiB9CiAKLS0gKHZvaWQpIHdyaXRlTWVzc2FnZUJlZ2luV2l0aE5hbWU6IChOU1N0cmluZyAqKSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAoaW50KSBtZXNzYWdlVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDogKGludCkgc2VxdWVuY2VJRAorLShCT09MKSB3cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lOihOU1N0cmluZyAqKW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTooU0ludDMyKW1lc3NhZ2VUeXBlCisgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6KFNJbnQzMilzZXF1ZW5jZUlECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gICAgc3dpdGNoIChtZXNzYWdlVHlwZSkgewotICAgICAgICBjYXNlIFRNZXNzYWdlVHlwZV9DQUxMOgotICAgICAgICBjYXNlIFRNZXNzYWdlVHlwZV9PTkVXQVk6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTlNNdXRhYmxlU3RyaW5nICogc2VydmljZUZ1bmN0aW9uID0gW1tOU011dGFibGVTdHJpbmcgYWxsb2NdIGluaXRXaXRoU3RyaW5nOm1TZXJ2aWNlTmFtZV07Ci0gICAgICAgICAgICAgICAgW3NlcnZpY2VGdW5jdGlvbiBhcHBlbmRTdHJpbmc6TVVMVElQTEVYRURfU0VSVklDRV9TRVBFUkFUT1JdOwotICAgICAgICAgICAgICAgIFtzZXJ2aWNlRnVuY3Rpb24gYXBwZW5kU3RyaW5nOm5hbWVdOwotICAgICAgICAgICAgICAgIFtzdXBlciB3cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lOnNlcnZpY2VGdW5jdGlvbiB0eXBlOm1lc3NhZ2VUeXBlIHNlcXVlbmNlSUQ6c2VxdWVuY2VJRF07Ci0gICAgICAgICAgICAgICAgW3NlcnZpY2VGdW5jdGlvbiByZWxlYXNlX3N0dWJdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBbc3VwZXIgd3JpdGVNZXNzYWdlQmVnaW5XaXRoTmFtZTpuYW1lIHR5cGU6bWVzc2FnZVR5cGUgc2VxdWVuY2VJRDpzZXF1ZW5jZUlEXTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLX0KKyAgc3dpdGNoIChtZXNzYWdlVHlwZSkgeworICBjYXNlIFRNZXNzYWdlVHlwZUNBTEw6CisgIGNhc2UgVE1lc3NhZ2VUeXBlT05FV0FZOiB7CisgICAgTlNNdXRhYmxlU3RyaW5nICpzZXJ2aWNlRnVuY3Rpb24gPSBbW05TTXV0YWJsZVN0cmluZyBhbGxvY10gaW5pdFdpdGhTdHJpbmc6X3NlcnZpY2VOYW1lXTsKKyAgICBbc2VydmljZUZ1bmN0aW9uIGFwcGVuZFN0cmluZzpUTXVsdGlwbGV4ZWRQcm90b2NvbFNlcGVyYXRvcl07CisgICAgW3NlcnZpY2VGdW5jdGlvbiBhcHBlbmRTdHJpbmc6bmFtZV07CisgICAgcmV0dXJuIFtzdXBlciB3cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lOnNlcnZpY2VGdW5jdGlvbiB0eXBlOm1lc3NhZ2VUeXBlIHNlcXVlbmNlSUQ6c2VxdWVuY2VJRCBlcnJvcjplcnJvcl07CisgIH0KKyAgYnJlYWs7CiAKLS0gKHZvaWQpIGRlYWxsb2MKLXsKLSAgICBbbVNlcnZpY2VOYW1lIHJlbGVhc2Vfc3R1Yl07Ci0gICAgW3N1cGVyIGRlYWxsb2Nfc3R1Yl07CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIFtzdXBlciB3cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lOm5hbWUgdHlwZTptZXNzYWdlVHlwZSBzZXF1ZW5jZUlEOnNlcXVlbmNlSUQgZXJyb3I6ZXJyb3JdOworICB9CiB9CiAKIEBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sLmggYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbC5oCmluZGV4IDI4MTIzOWQuLjg0MTA1OWYgMTAwNjQ0Ci0tLSBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sLmgKKysrIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2wuaApAQCAtMjIsMTI3ICsyMiwxNDMgQEAKICNpbXBvcnQgIlRUcmFuc3BvcnQuaCIKIAogCi1lbnVtIHsKLSAgVE1lc3NhZ2VUeXBlX0NBTEwgPSAxLAotICBUTWVzc2FnZVR5cGVfUkVQTFkgPSAyLAotICBUTWVzc2FnZVR5cGVfRVhDRVBUSU9OID0gMywKLSAgVE1lc3NhZ2VUeXBlX09ORVdBWSA9IDQKK05TX0FTU1VNRV9OT05OVUxMX0JFR0lOCisKKwordHlwZWRlZiBOU19FTlVNIChpbnQsIFRNZXNzYWdlVHlwZSkgeworICBUTWVzc2FnZVR5cGVDQUxMID0gMSwKKyAgVE1lc3NhZ2VUeXBlUkVQTFkgPSAyLAorICBUTWVzc2FnZVR5cGVFWENFUFRJT04gPSAzLAorICBUTWVzc2FnZVR5cGVPTkVXQVkgPSA0CiB9OwogCi1lbnVtIHsKLSAgVFR5cGVfU1RPUCAgID0gMCwKLSAgVFR5cGVfVk9JRCAgID0gMSwKLSAgVFR5cGVfQk9PTCAgID0gMiwKLSAgVFR5cGVfQllURSAgID0gMywKLSAgVFR5cGVfRE9VQkxFID0gNCwKLSAgVFR5cGVfSTE2ICAgID0gNiwKLSAgVFR5cGVfSTMyICAgID0gOCwKLSAgVFR5cGVfSTY0ICAgID0gMTAsCi0gIFRUeXBlX1NUUklORyA9IDExLAotICBUVHlwZV9TVFJVQ1QgPSAxMiwKLSAgVFR5cGVfTUFQICAgID0gMTMsCi0gIFRUeXBlX1NFVCAgICA9IDE0LAotICBUVHlwZV9MSVNUICAgPSAxNQordHlwZWRlZiBOU19FTlVNIChpbnQsIFRUeXBlKSB7CisgIFRUeXBlU1RPUCAgID0gMCwKKyAgVFR5cGVWT0lEICAgPSAxLAorICBUVHlwZUJPT0wgICA9IDIsCisgIFRUeXBlQllURSAgID0gMywKKyAgVFR5cGVET1VCTEUgPSA0LAorICBUVHlwZUkxNiAgICA9IDYsCisgIFRUeXBlSTMyICAgID0gOCwKKyAgVFR5cGVJNjQgICAgPSAxMCwKKyAgVFR5cGVTVFJJTkcgPSAxMSwKKyAgVFR5cGVTVFJVQ1QgPSAxMiwKKyAgVFR5cGVNQVAgICAgPSAxMywKKyAgVFR5cGVTRVQgICAgPSAxNCwKKyAgVFR5cGVMSVNUICAgPSAxNQogfTsKIAogCiBAcHJvdG9jb2wgVFByb3RvY29sIDxOU09iamVjdD4KIAotLSAoaWQgPFRUcmFuc3BvcnQ+KSB0cmFuc3BvcnQ7CistKGlkIDxUVHJhbnNwb3J0PikgdHJhbnNwb3J0OwogCi0tICh2b2lkKSByZWFkTWVzc2FnZUJlZ2luUmV0dXJuaW5nTmFtZTogKE5TU3RyaW5nICoqKSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogKGludCAqKSB0eXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDogKGludCAqKSBzZXF1ZW5jZUlEOwotLSAodm9pZCkgcmVhZE1lc3NhZ2VFbmQ7CistKEJPT0wpIHJlYWRNZXNzYWdlQmVnaW5SZXR1cm5pbmdOYW1lOihOU1N0cmluZyAqX19udWxsYWJsZSBfX2F1dG9yZWxlYXNpbmcgKl9fbnVsbGFibGUpbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZToobnVsbGFibGUgU0ludDMyICopdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDoobnVsbGFibGUgU0ludDMyICopc2VxdWVuY2VJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CistKEJPT0wpIHJlYWRNZXNzYWdlRW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAotLSAodm9pZCkgcmVhZFN0cnVjdEJlZ2luUmV0dXJuaW5nTmFtZTogKE5TU3RyaW5nICoqKSBuYW1lOwotLSAodm9pZCkgcmVhZFN0cnVjdEVuZDsKKy0oQk9PTCkgcmVhZFN0cnVjdEJlZ2luUmV0dXJuaW5nTmFtZTooTlNTdHJpbmcgKl9fbnVsbGFibGUgX19hdXRvcmVsZWFzaW5nICpfX251bGxhYmxlKW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CistKEJPT0wpIHJlYWRTdHJ1Y3RFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tICh2b2lkKSByZWFkRmllbGRCZWdpblJldHVybmluZ05hbWU6IChOU1N0cmluZyAqKikgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAoaW50ICopIGZpZWxkVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOiAoaW50ICopIGZpZWxkSUQ7Ci0tICh2b2lkKSByZWFkRmllbGRFbmQ7CistKEJPT0wpIHJlYWRGaWVsZEJlZ2luUmV0dXJuaW5nTmFtZTooTlNTdHJpbmcgKl9fbnVsbGFibGUgX19hdXRvcmVsZWFzaW5nICpfX251bGxhYmxlKW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOihTSW50MzIgKilmaWVsZFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOihudWxsYWJsZSBTSW50MzIgKilmaWVsZElECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CistKEJPT0wpIHJlYWRGaWVsZEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKLS0gKE5TU3RyaW5nICopIHJlYWRTdHJpbmc7CistKEJPT0wpIHJlYWRTdHJpbmc6KE5TU3RyaW5nICpfX25vbm51bGwgX19hdXRvcmVsZWFzaW5nICpfX25vbm51bGwpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKiopZXJyb3I7CiAKLS0gKEJPT0wpIHJlYWRCb29sOworLShCT09MKSByZWFkQm9vbDooQk9PTCAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAotLSAodW5zaWduZWQgY2hhcikgcmVhZEJ5dGU7CistKEJPT0wpIHJlYWRCeXRlOihVSW50OCAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAotLSAoc2hvcnQpIHJlYWRJMTY7CistKEJPT0wpIHJlYWRJMTY6KFNJbnQxNiAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAotLSAoaW50MzJfdCkgcmVhZEkzMjsKKy0oQk9PTCkgcmVhZEkzMjooU0ludDMyICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tIChpbnQ2NF90KSByZWFkSTY0OworLShCT09MKSByZWFkSTY0OihTSW50NjQgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKLS0gKGRvdWJsZSkgcmVhZERvdWJsZTsKKy0oQk9PTCkgcmVhZERvdWJsZTooZG91YmxlICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tIChOU0RhdGEgKikgcmVhZEJpbmFyeTsKKy0oQk9PTCkgcmVhZEJpbmFyeTooTlNEYXRhICpfX25vbm51bGwgX19hdXRvcmVsZWFzaW5nICpfX25vbm51bGwpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKiopZXJyb3I7CiAKLS0gKHZvaWQpIHJlYWRNYXBCZWdpblJldHVybmluZ0tleVR5cGU6IChpbnQgKikga2V5VHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlVHlwZTogKGludCAqKSB2YWx1ZVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IChpbnQgKikgc2l6ZTsKLS0gKHZvaWQpIHJlYWRNYXBFbmQ7CistKEJPT0wpIHJlYWRNYXBCZWdpblJldHVybmluZ0tleVR5cGU6KG51bGxhYmxlIFNJbnQzMiAqKWtleVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlVHlwZToobnVsbGFibGUgU0ludDMyICopdmFsdWVUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMiAqKXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CistKEJPT0wpIHJlYWRNYXBFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCiAKLS0gKHZvaWQpIHJlYWRTZXRCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOiAoaW50ICopIGVsZW1lbnRUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogKGludCAqKSBzaXplOwotLSAodm9pZCkgcmVhZFNldEVuZDsKKy0oQk9PTCkgcmVhZFNldEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6KG51bGxhYmxlIFNJbnQzMiAqKWVsZW1lbnRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOihTSW50MzIgKilzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKKy0oQk9PTCkgcmVhZFNldEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKIAotLSAodm9pZCkgcmVhZExpc3RCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOiAoaW50ICopIGVsZW1lbnRUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IChpbnQgKikgc2l6ZTsKLS0gKHZvaWQpIHJlYWRMaXN0RW5kOworLShCT09MKSByZWFkTGlzdEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6KG51bGxhYmxlIFNJbnQzMiAqKWVsZW1lbnRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTooU0ludDMyICopc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOworLShCT09MKSByZWFkTGlzdEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKIAotLSAodm9pZCkgd3JpdGVNZXNzYWdlQmVnaW5XaXRoTmFtZTogKE5TU3RyaW5nICopIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IChpbnQpIG1lc3NhZ2VUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOiAoaW50KSBzZXF1ZW5jZUlEOwotLSAodm9pZCkgd3JpdGVNZXNzYWdlRW5kOworLShCT09MKSB3cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lOihOU1N0cmluZyAqKW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTooU0ludDMyKW1lc3NhZ2VUeXBlCisgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6KFNJbnQzMilzZXF1ZW5jZUlECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOworLShCT09MKSB3cml0ZU1lc3NhZ2VFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tICh2b2lkKSB3cml0ZVN0cnVjdEJlZ2luV2l0aE5hbWU6IChOU1N0cmluZyAqKSBuYW1lOwotLSAodm9pZCkgd3JpdGVTdHJ1Y3RFbmQ7CistKEJPT0wpIHdyaXRlU3RydWN0QmVnaW5XaXRoTmFtZTooTlNTdHJpbmcgKiluYW1lIGVycm9yOihOU0Vycm9yICoqKWVycm9yOworLShCT09MKSB3cml0ZVN0cnVjdEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKLS0gKHZvaWQpIHdyaXRlRmllbGRCZWdpbldpdGhOYW1lOiAoTlNTdHJpbmcgKikgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IChpbnQpIGZpZWxkVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6IChpbnQpIGZpZWxkSUQ7CistKEJPT0wpIHdyaXRlRmllbGRCZWdpbldpdGhOYW1lOihOU1N0cmluZyAqKW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6KFNJbnQzMilmaWVsZFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6KFNJbnQzMilmaWVsZElECisgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAotLSAodm9pZCkgd3JpdGVJMzI6IChpbnQzMl90KSB2YWx1ZTsKKy0oQk9PTCkgd3JpdGVJMzI6KFNJbnQzMil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKLS0gKHZvaWQpIHdyaXRlSTY0OiAoaW50NjRfdCkgdmFsdWU7CistKEJPT0wpIHdyaXRlSTY0OihTSW50NjQpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tICh2b2lkKSB3cml0ZUkxNjogKHNob3J0KSB2YWx1ZTsKKy0oQk9PTCkgd3JpdGVJMTY6KHNob3J0KXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAotLSAodm9pZCkgd3JpdGVCeXRlOiAodWludDhfdCkgdmFsdWU7CistKEJPT0wpIHdyaXRlQnl0ZTooVUludDgpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tICh2b2lkKSB3cml0ZVN0cmluZzogKE5TU3RyaW5nICopIHZhbHVlOworLShCT09MKSB3cml0ZVN0cmluZzooTlNTdHJpbmcgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKLS0gKHZvaWQpIHdyaXRlRG91YmxlOiAoZG91YmxlKSB2YWx1ZTsKKy0oQk9PTCkgd3JpdGVEb3VibGU6KGRvdWJsZSl2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKLS0gKHZvaWQpIHdyaXRlQm9vbDogKEJPT0wpIHZhbHVlOworLShCT09MKSB3cml0ZUJvb2w6KEJPT0wpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tICh2b2lkKSB3cml0ZUJpbmFyeTogKE5TRGF0YSAqKSBkYXRhOworLShCT09MKSB3cml0ZUJpbmFyeTooTlNEYXRhICopZGF0YSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKLS0gKHZvaWQpIHdyaXRlRmllbGRTdG9wOworLShCT09MKSB3cml0ZUZpZWxkU3RvcDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKLS0gKHZvaWQpIHdyaXRlRmllbGRFbmQ7CistKEJPT0wpIHdyaXRlRmllbGRFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tICh2b2lkKSB3cml0ZU1hcEJlZ2luV2l0aEtleVR5cGU6IChpbnQpIGtleVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlVHlwZTogKGludCkgdmFsdWVUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IChpbnQpIHNpemU7Ci0tICh2b2lkKSB3cml0ZU1hcEVuZDsKKy0oQk9PTCkgd3JpdGVNYXBCZWdpbldpdGhLZXlUeXBlOihTSW50MzIpa2V5VHlwZQorICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVR5cGU6KFNJbnQzMil2YWx1ZVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOihTSW50MzIpc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOworLShCT09MKSB3cml0ZU1hcEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKIAotLSAodm9pZCkgd3JpdGVTZXRCZWdpbldpdGhFbGVtZW50VHlwZTogKGludCkgZWxlbWVudFR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IChpbnQpIHNpemU7Ci0tICh2b2lkKSB3cml0ZVNldEVuZDsKKy0oQk9PTCkgd3JpdGVTZXRCZWdpbldpdGhFbGVtZW50VHlwZTooU0ludDMyKWVsZW1lbnRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMilzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOworLShCT09MKSB3cml0ZVNldEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKIAotLSAodm9pZCkgd3JpdGVMaXN0QmVnaW5XaXRoRWxlbWVudFR5cGU6IChpbnQpIGVsZW1lbnRUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogKGludCkgc2l6ZTsKKy0oQk9PTCkgd3JpdGVMaXN0QmVnaW5XaXRoRWxlbWVudFR5cGU6KFNJbnQzMillbGVtZW50VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTooU0ludDMyKXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tICh2b2lkKSB3cml0ZUxpc3RFbmQ7CistKEJPT0wpIHdyaXRlTGlzdEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKIAogQGVuZAogCisKK05TX0FTU1VNRV9OT05OVUxMX0VORApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IuaCBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLmgKaW5kZXggODI5YmVkNi4uMzY5YjZhMiAxMDA2NDQKLS0tIGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IuaAorKysgYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5oCkBAIC0yMSwxMCArMjEsMTQgQEAKIAogI2ltcG9ydCAiVFByb3RvY29sLmgiCiAKLUBpbnRlcmZhY2UgVFByb3RvY29sRGVjb3JhdG9yIDogTlNPYmplY3QgPFRQcm90b2NvbD4gewotICAgIGlkPFRQcm90b2NvbD4gbUNvbmNyZXRlUHJvdG9jb2w7Ci19CitOU19BU1NVTUVfTk9OTlVMTF9CRUdJTgogCi0tIChpZCkgaW5pdFdpdGhQcm90b2NvbDogKGlkIDxUUHJvdG9jb2w+KSBwcm90b2NvbDsKKworQGludGVyZmFjZSBUUHJvdG9jb2xEZWNvcmF0b3IgOiBOU09iamVjdCA8VFByb3RvY29sPgorCistKGlkKSBpbml0V2l0aFByb3RvY29sOihpZCA8VFByb3RvY29sPilwcm90b2NvbDsKIAogQGVuZAorCisKK05TX0FTU1VNRV9OT05OVUxMX0VORApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLm0gYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5tCmluZGV4IGU1YWNiNmMuLjIxOGY5MDAgMTAwNjQ0Ci0tLSBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLm0KKysrIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IubQpAQCAtMTgsMjU3ICsxOCwyNzggQEAKICAqLwogCiAjaW1wb3J0ICJUUHJvdG9jb2xEZWNvcmF0b3IuaCIKLSNpbXBvcnQgIlRPYmplY3RpdmUtQy5oIgorCisKK0BpbnRlcmZhY2UgVFByb3RvY29sRGVjb3JhdG9yICgpCisKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgaWQ8VFByb3RvY29sPiBjb25jcmV0ZVByb3RvY29sOworCitAZW5kCisKIAogQGltcGxlbWVudGF0aW9uIFRQcm90b2NvbERlY29yYXRvcgogCi0tIChpZCkgaW5pdFdpdGhQcm90b2NvbDogKGlkIDxUUHJvdG9jb2w+KSBwcm90b2NvbAorLShpZCkgaW5pdFdpdGhQcm90b2NvbDooaWQgPFRQcm90b2NvbD4pcHJvdG9jb2wKIHsKLSAgICBzZWxmID0gW3N1cGVyIGluaXRdOwotICAgIGlmIChzZWxmKSB7Ci0gICAgICAgIG1Db25jcmV0ZVByb3RvY29sID0gW3Byb3RvY29sIHJldGFpbl9zdHViXTsKLSAgICB9Ci0gICAgcmV0dXJuIHNlbGY7CisgIHNlbGYgPSBbc3VwZXIgaW5pdF07CisgIGlmIChzZWxmKSB7CisgICAgX2NvbmNyZXRlUHJvdG9jb2wgPSBwcm90b2NvbDsKKyAgfQorICByZXR1cm4gc2VsZjsKIH0KIAotLSAoaWQgPFRUcmFuc3BvcnQ+KSB0cmFuc3BvcnQKKy0oaWQgPFRUcmFuc3BvcnQ+KSB0cmFuc3BvcnQKIHsKLSAgICByZXR1cm4gW21Db25jcmV0ZVByb3RvY29sIHRyYW5zcG9ydF07CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgdHJhbnNwb3J0XTsKIH0KIAotLSAodm9pZCkgcmVhZE1lc3NhZ2VCZWdpblJldHVybmluZ05hbWU6IChOU1N0cmluZyAqKikgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IChpbnQgKikgdHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6IChpbnQgKikgc2VxdWVuY2VJRAorLShCT09MKSByZWFkTWVzc2FnZUJlZ2luUmV0dXJuaW5nTmFtZTooTlNTdHJpbmcgKiopbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTooU0ludDMyICopdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDooU0ludDMyICopc2VxdWVuY2VJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgICBbbUNvbmNyZXRlUHJvdG9jb2wgcmVhZE1lc3NhZ2VCZWdpblJldHVybmluZ05hbWU6bmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTp0eXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOnNlcXVlbmNlSURdOworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHJlYWRNZXNzYWdlQmVnaW5SZXR1cm5pbmdOYW1lOm5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTp0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6c2VxdWVuY2VJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOmVycm9yXTsKIH0KIAotLSAodm9pZCkgcmVhZE1lc3NhZ2VFbmQKKy0oQk9PTCkgcmVhZE1lc3NhZ2VFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gICAgW21Db25jcmV0ZVByb3RvY29sIHJlYWRNZXNzYWdlRW5kXTsKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCByZWFkTWVzc2FnZUVuZDplcnJvcl07CiB9CiAKLS0gKHZvaWQpIHJlYWRTdHJ1Y3RCZWdpblJldHVybmluZ05hbWU6IChOU1N0cmluZyAqKikgbmFtZQorLShCT09MKSByZWFkU3RydWN0QmVnaW5SZXR1cm5pbmdOYW1lOihOU1N0cmluZyAqKiluYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gICAgW21Db25jcmV0ZVByb3RvY29sIHJlYWRTdHJ1Y3RCZWdpblJldHVybmluZ05hbWU6bmFtZV07CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgcmVhZFN0cnVjdEJlZ2luUmV0dXJuaW5nTmFtZTpuYW1lIGVycm9yOmVycm9yXTsKIH0KIAotLSAodm9pZCkgcmVhZFN0cnVjdEVuZAorLShCT09MKSByZWFkU3RydWN0RW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICAgIFttQ29uY3JldGVQcm90b2NvbCByZWFkU3RydWN0RW5kXTsKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCByZWFkU3RydWN0RW5kOmVycm9yXTsKIH0KIAotLSAodm9pZCkgcmVhZEZpZWxkQmVnaW5SZXR1cm5pbmdOYW1lOiAoTlNTdHJpbmcgKiopIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogKGludCAqKSBmaWVsZFR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDogKGludCAqKSBmaWVsZElECistKEJPT0wpIHJlYWRGaWVsZEJlZ2luUmV0dXJuaW5nTmFtZTooTlNTdHJpbmcgKiopbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6KFNJbnQzMiAqKWZpZWxkVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6KFNJbnQzMiAqKWZpZWxkSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICAgIFttQ29uY3JldGVQcm90b2NvbCByZWFkRmllbGRCZWdpblJldHVybmluZ05hbWU6bmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ZmllbGRUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDpmaWVsZElEXTsKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCByZWFkRmllbGRCZWdpblJldHVybmluZ05hbWU6bmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTpmaWVsZFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6ZmllbGRJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjplcnJvcl07CiB9Ci0tICh2b2lkKSByZWFkRmllbGRFbmQKKy0oQk9PTCkgcmVhZEZpZWxkRW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICAgIFttQ29uY3JldGVQcm90b2NvbCByZWFkRmllbGRFbmRdOworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHJlYWRGaWVsZEVuZDplcnJvcl07CiB9CiAKLS0gKE5TU3RyaW5nICopIHJlYWRTdHJpbmcKKy0oQk9PTCkgcmVhZFN0cmluZzooTlNTdHJpbmcgKl9fYXV0b3JlbGVhc2luZyAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICAgIHJldHVybiBbbUNvbmNyZXRlUHJvdG9jb2wgcmVhZFN0cmluZ107CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgcmVhZFN0cmluZzp2YWx1ZSBlcnJvcjplcnJvcl07CiB9CiAKLS0gKEJPT0wpIHJlYWRCb29sCistKEJPT0wpIHJlYWRCb29sOihCT09MICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gICAgcmV0dXJuIFttQ29uY3JldGVQcm90b2NvbCByZWFkQm9vbF07CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgcmVhZEJvb2w6dmFsdWUgZXJyb3I6ZXJyb3JdOwogfQogCi0tICh1bnNpZ25lZCBjaGFyKSByZWFkQnl0ZQorLShCT09MKSByZWFkQnl0ZTooVUludDggKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgICByZXR1cm4gW21Db25jcmV0ZVByb3RvY29sIHJlYWRCeXRlXTsKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCByZWFkQnl0ZTp2YWx1ZSBlcnJvcjplcnJvcl07CiB9CiAKLS0gKHNob3J0KSByZWFkSTE2CistKEJPT0wpIHJlYWRJMTY6KFNJbnQxNiAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICAgIHJldHVybiBbbUNvbmNyZXRlUHJvdG9jb2wgcmVhZEkxNl07CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgcmVhZEkxNjp2YWx1ZSBlcnJvcjplcnJvcl07CiB9CiAKLS0gKGludDMyX3QpIHJlYWRJMzIKKy0oQk9PTCkgcmVhZEkzMjooU0ludDMyICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gICAgcmV0dXJuIFttQ29uY3JldGVQcm90b2NvbCByZWFkSTMyXTsKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCByZWFkSTMyOnZhbHVlIGVycm9yOmVycm9yXTsKIH0KIAotLSAoaW50NjRfdCkgcmVhZEk2NAorLShCT09MKSByZWFkSTY0OihTSW50NjQgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgICByZXR1cm4gW21Db25jcmV0ZVByb3RvY29sIHJlYWRJNjRdOworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHJlYWRJNjQ6dmFsdWUgZXJyb3I6ZXJyb3JdOwogfQogCi0tIChkb3VibGUpIHJlYWREb3VibGUKKy0oQk9PTCkgcmVhZERvdWJsZTooZG91YmxlICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gICAgcmV0dXJuIFttQ29uY3JldGVQcm90b2NvbCByZWFkRG91YmxlXTsKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCByZWFkRG91YmxlOnZhbHVlIGVycm9yOmVycm9yXTsKIH0KIAotLSAoTlNEYXRhICopIHJlYWRCaW5hcnkKKy0oQk9PTCkgcmVhZEJpbmFyeTooTlNEYXRhICpfX2F1dG9yZWxlYXNpbmcgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgICByZXR1cm4gW21Db25jcmV0ZVByb3RvY29sIHJlYWRCaW5hcnldOworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHJlYWRCaW5hcnk6dmFsdWUgZXJyb3I6ZXJyb3JdOwogfQogCi0tICh2b2lkKSByZWFkTWFwQmVnaW5SZXR1cm5pbmdLZXlUeXBlOiAoaW50ICopIGtleVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVR5cGU6IChpbnQgKikgdmFsdWVUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiAoaW50ICopIHNpemUKKy0oQk9PTCkgcmVhZE1hcEJlZ2luUmV0dXJuaW5nS2V5VHlwZTooU0ludDMyICopa2V5VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVUeXBlOihTSW50MzIgKil2YWx1ZVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTooU0ludDMyICopc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICAgIFttQ29uY3JldGVQcm90b2NvbCByZWFkTWFwQmVnaW5SZXR1cm5pbmdLZXlUeXBlOmtleVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlVHlwZTp2YWx1ZVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTpzaXplXTsKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCByZWFkTWFwQmVnaW5SZXR1cm5pbmdLZXlUeXBlOmtleVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVUeXBlOnZhbHVlVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6c2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6ZXJyb3JdOwogfQotLSAodm9pZCkgcmVhZE1hcEVuZAorLShCT09MKSByZWFkTWFwRW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICAgIFttQ29uY3JldGVQcm90b2NvbCByZWFkTWFwRW5kXTsKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCByZWFkTWFwRW5kOmVycm9yXTsKIH0KIAogCi0tICh2b2lkKSByZWFkU2V0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZTogKGludCAqKSBlbGVtZW50VHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IChpbnQgKikgc2l6ZQorLShCT09MKSByZWFkU2V0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZTooU0ludDMyICopZWxlbWVudFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMiAqKXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gICAgW21Db25jcmV0ZVByb3RvY29sIHJlYWRTZXRCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOmVsZW1lbnRUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOnNpemVdOworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHJlYWRTZXRCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOmVsZW1lbnRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6c2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOmVycm9yXTsKIH0KLS0gKHZvaWQpIHJlYWRTZXRFbmQKKy0oQk9PTCkgcmVhZFNldEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgICBbbUNvbmNyZXRlUHJvdG9jb2wgcmVhZFNldEVuZF07CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgcmVhZFNldEVuZDplcnJvcl07CiB9CiAKLS0gKHZvaWQpIHJlYWRMaXN0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZTogKGludCAqKSBlbGVtZW50VHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiAoaW50ICopIHNpemUKKy0oQk9PTCkgcmVhZExpc3RCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOihTSW50MzIgKillbGVtZW50VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMiAqKXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICAgIFttQ29uY3JldGVQcm90b2NvbCByZWFkTGlzdEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6ZWxlbWVudFR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOnNpemVdOworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHJlYWRMaXN0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZTplbGVtZW50VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTpzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOmVycm9yXTsKIH0KLS0gKHZvaWQpIHJlYWRMaXN0RW5kCistKEJPT0wpIHJlYWRMaXN0RW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICAgIFttQ29uY3JldGVQcm90b2NvbCByZWFkTGlzdEVuZF07CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgcmVhZExpc3RFbmQ6ZXJyb3JdOwogfQogCi0tICh2b2lkKSB3cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lOiAoTlNTdHJpbmcgKikgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogKGludCkgbWVzc2FnZVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6IChpbnQpIHNlcXVlbmNlSUQKKy0oQk9PTCkgd3JpdGVNZXNzYWdlQmVnaW5XaXRoTmFtZTooTlNTdHJpbmcgKiluYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6KFNJbnQzMiltZXNzYWdlVHlwZQorICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOihTSW50MzIpc2VxdWVuY2VJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICAgIFttQ29uY3JldGVQcm90b2NvbCB3cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lOm5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTptZXNzYWdlVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOnNlcXVlbmNlSURdOworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHdyaXRlTWVzc2FnZUJlZ2luV2l0aE5hbWU6bmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6bWVzc2FnZVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOnNlcXVlbmNlSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOmVycm9yXTsKIH0KLS0gKHZvaWQpIHdyaXRlTWVzc2FnZUVuZAorLShCT09MKSB3cml0ZU1lc3NhZ2VFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gICAgW21Db25jcmV0ZVByb3RvY29sIHdyaXRlTWVzc2FnZUVuZF07CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgd3JpdGVNZXNzYWdlRW5kOmVycm9yXTsKIH0KIAotLSAodm9pZCkgd3JpdGVTdHJ1Y3RCZWdpbldpdGhOYW1lOiAoTlNTdHJpbmcgKikgbmFtZQorLShCT09MKSB3cml0ZVN0cnVjdEJlZ2luV2l0aE5hbWU6KE5TU3RyaW5nICopbmFtZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgICBbbUNvbmNyZXRlUHJvdG9jb2wgd3JpdGVTdHJ1Y3RCZWdpbldpdGhOYW1lOm5hbWVdOworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHdyaXRlU3RydWN0QmVnaW5XaXRoTmFtZTpuYW1lIGVycm9yOmVycm9yXTsKIH0KLS0gKHZvaWQpIHdyaXRlU3RydWN0RW5kCistKEJPT0wpIHdyaXRlU3RydWN0RW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICAgIFttQ29uY3JldGVQcm90b2NvbCB3cml0ZVN0cnVjdEVuZF07CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgd3JpdGVTdHJ1Y3RFbmQ6ZXJyb3JdOwogfQogCi0tICh2b2lkKSB3cml0ZUZpZWxkQmVnaW5XaXRoTmFtZTogKE5TU3RyaW5nICopIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAoaW50KSBmaWVsZFR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOiAoaW50KSBmaWVsZElECistKEJPT0wpIHdyaXRlRmllbGRCZWdpbldpdGhOYW1lOihOU1N0cmluZyAqKW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6KFNJbnQzMilmaWVsZFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6KFNJbnQzMilmaWVsZElECisgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICAgIFttQ29uY3JldGVQcm90b2NvbCB3cml0ZUZpZWxkQmVnaW5XaXRoTmFtZTpuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOmZpZWxkVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDpmaWVsZElEXTsKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCB3cml0ZUZpZWxkQmVnaW5XaXRoTmFtZTpuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ZmllbGRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6ZmllbGRJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOmVycm9yXTsKIH0KIAotLSAodm9pZCkgd3JpdGVJMzI6IChpbnQzMl90KSB2YWx1ZQorLShCT09MKSB3cml0ZUkzMjooU0ludDMyKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICAgIFttQ29uY3JldGVQcm90b2NvbCB3cml0ZUkzMjp2YWx1ZV07CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgd3JpdGVJMzI6dmFsdWUgZXJyb3I6ZXJyb3JdOwogfQogCi0tICh2b2lkKSB3cml0ZUk2NDogKGludDY0X3QpIHZhbHVlCistKEJPT0wpIHdyaXRlSTY0OihTSW50NjQpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gICAgW21Db25jcmV0ZVByb3RvY29sIHdyaXRlSTY0OnZhbHVlXTsKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCB3cml0ZUk2NDp2YWx1ZSBlcnJvcjplcnJvcl07CiB9CiAKLS0gKHZvaWQpIHdyaXRlSTE2OiAoc2hvcnQpIHZhbHVlCistKEJPT0wpIHdyaXRlSTE2OihTSW50MTYpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gICAgW21Db25jcmV0ZVByb3RvY29sIHdyaXRlSTE2OnZhbHVlXTsKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCB3cml0ZUkxNjp2YWx1ZSBlcnJvcjplcnJvcl07CiB9CiAKLS0gKHZvaWQpIHdyaXRlQnl0ZTogKHVpbnQ4X3QpIHZhbHVlCistKEJPT0wpIHdyaXRlQnl0ZTooVUludDgpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gICAgW21Db25jcmV0ZVByb3RvY29sIHdyaXRlQnl0ZTp2YWx1ZV07CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgd3JpdGVCeXRlOnZhbHVlIGVycm9yOmVycm9yXTsKIH0KIAotLSAodm9pZCkgd3JpdGVTdHJpbmc6IChOU1N0cmluZyAqKSB2YWx1ZQorLShCT09MKSB3cml0ZVN0cmluZzooTlNTdHJpbmcgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgICBbbUNvbmNyZXRlUHJvdG9jb2wgd3JpdGVTdHJpbmc6dmFsdWVdOworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHdyaXRlU3RyaW5nOnZhbHVlIGVycm9yOmVycm9yXTsKIH0KIAotLSAodm9pZCkgd3JpdGVEb3VibGU6IChkb3VibGUpIHZhbHVlCistKEJPT0wpIHdyaXRlRG91YmxlOihkb3VibGUpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gICAgW21Db25jcmV0ZVByb3RvY29sIHdyaXRlRG91YmxlOnZhbHVlXTsKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCB3cml0ZURvdWJsZTp2YWx1ZSBlcnJvcjplcnJvcl07CiB9CiAKLS0gKHZvaWQpIHdyaXRlQm9vbDogKEJPT0wpIHZhbHVlCistKEJPT0wpIHdyaXRlQm9vbDooQk9PTCl2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgICBbbUNvbmNyZXRlUHJvdG9jb2wgd3JpdGVCb29sOnZhbHVlXTsKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCB3cml0ZUJvb2w6dmFsdWUgZXJyb3I6ZXJyb3JdOwogfQogCi0tICh2b2lkKSB3cml0ZUJpbmFyeTogKE5TRGF0YSAqKSBkYXRhCistKEJPT0wpIHdyaXRlQmluYXJ5OihOU0RhdGEgKilkYXRhIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICAgIFttQ29uY3JldGVQcm90b2NvbCB3cml0ZUJpbmFyeTpkYXRhXTsKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCB3cml0ZUJpbmFyeTpkYXRhIGVycm9yOmVycm9yXTsKIH0KIAotLSAodm9pZCkgd3JpdGVGaWVsZFN0b3AKKy0oQk9PTCkgd3JpdGVGaWVsZFN0b3A6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gICAgW21Db25jcmV0ZVByb3RvY29sIHdyaXRlRmllbGRTdG9wXTsKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCB3cml0ZUZpZWxkU3RvcDplcnJvcl07CiB9CiAKLS0gKHZvaWQpIHdyaXRlRmllbGRFbmQKKy0oQk9PTCkgd3JpdGVGaWVsZEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgICBbbUNvbmNyZXRlUHJvdG9jb2wgd3JpdGVGaWVsZEVuZF07CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgd3JpdGVGaWVsZEVuZDplcnJvcl07CiB9CiAKLS0gKHZvaWQpIHdyaXRlTWFwQmVnaW5XaXRoS2V5VHlwZTogKGludCkga2V5VHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVUeXBlOiAoaW50KSB2YWx1ZVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogKGludCkgc2l6ZQorLShCT09MKSB3cml0ZU1hcEJlZ2luV2l0aEtleVR5cGU6KFNJbnQzMilrZXlUeXBlCisgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlVHlwZTooU0ludDMyKXZhbHVlVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMilzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgICBbbUNvbmNyZXRlUHJvdG9jb2wgd3JpdGVNYXBCZWdpbldpdGhLZXlUeXBlOmtleVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVUeXBlOnZhbHVlVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6c2l6ZV07Ci19Ci0tICh2b2lkKSB3cml0ZU1hcEVuZAotewotICAgIFttQ29uY3JldGVQcm90b2NvbCB3cml0ZU1hcEVuZF07CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgd3JpdGVNYXBCZWdpbldpdGhLZXlUeXBlOmtleVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVR5cGU6dmFsdWVUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOnNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6ZXJyb3JdOwogfQogCi0tICh2b2lkKSB3cml0ZVNldEJlZ2luV2l0aEVsZW1lbnRUeXBlOiAoaW50KSBlbGVtZW50VHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogKGludCkgc2l6ZQorLShCT09MKSB3cml0ZU1hcEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgICBbbUNvbmNyZXRlUHJvdG9jb2wgd3JpdGVTZXRCZWdpbldpdGhFbGVtZW50VHlwZTplbGVtZW50VHlwZSBzaXplOnNpemVdOworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHdyaXRlTWFwRW5kOmVycm9yXTsKIH0KIAotLSAodm9pZCkgd3JpdGVTZXRFbmQKKy0oQk9PTCkgd3JpdGVTZXRCZWdpbldpdGhFbGVtZW50VHlwZTooU0ludDMyKWVsZW1lbnRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMilzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gICAgW21Db25jcmV0ZVByb3RvY29sIHdyaXRlU2V0RW5kXTsKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCB3cml0ZVNldEJlZ2luV2l0aEVsZW1lbnRUeXBlOmVsZW1lbnRUeXBlIHNpemU6c2l6ZSBlcnJvcjplcnJvcl07CiB9CiAKLS0gKHZvaWQpIHdyaXRlTGlzdEJlZ2luV2l0aEVsZW1lbnRUeXBlOiAoaW50KSBlbGVtZW50VHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IChpbnQpIHNpemUKKy0oQk9PTCkgd3JpdGVTZXRFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gICAgW21Db25jcmV0ZVByb3RvY29sIHdyaXRlTGlzdEJlZ2luV2l0aEVsZW1lbnRUeXBlOmVsZW1lbnRUeXBlIHNpemU6c2l6ZV07CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgd3JpdGVTZXRFbmQ6ZXJyb3JdOwogfQogCi0tICh2b2lkKSB3cml0ZUxpc3RFbmQKKy0oQk9PTCkgd3JpdGVMaXN0QmVnaW5XaXRoRWxlbWVudFR5cGU6KFNJbnQzMillbGVtZW50VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTooU0ludDMyKXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gICAgW21Db25jcmV0ZVByb3RvY29sIHdyaXRlTGlzdEVuZF07CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgd3JpdGVMaXN0QmVnaW5XaXRoRWxlbWVudFR5cGU6ZWxlbWVudFR5cGUgc2l6ZTpzaXplIGVycm9yOmVycm9yXTsKIH0KIAotLSAodm9pZCkgZGVhbGxvYworLShCT09MKSB3cml0ZUxpc3RFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gICAgW21Db25jcmV0ZVByb3RvY29sIHJlbGVhc2Vfc3R1Yl07Ci0gICAgW3N1cGVyIGRlYWxsb2Nfc3R1Yl07CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgd3JpdGVMaXN0RW5kOmVycm9yXTsKIH0KIAogQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xFcnJvci5oIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xFcnJvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMGJjNDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbEVycm9yLmgKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW1wb3J0ICJURXJyb3IuaCIKKworCitleHRlcm4gTlNTdHJpbmcgKlRQcm90b2NvbEVycm9yRG9tYWluOworCit0eXBlZGVmIE5TX0VOVU0gKGludCwgVFByb3RvY29sRXJyb3IpIHsKKyAgVFByb3RvY29sRXJyb3JVbmtub3duICAgICAgICAgICAgICAgICAgID0gMCwKKyAgVFByb3RvY29sRXJyb3JJbnZhbGlkRGF0YSAgICAgICAgICAgICAgID0gMSwKKyAgVFByb3RvY29sRXJyb3JOZWdhdGl2ZVNpemUgICAgICAgICAgICAgID0gMiwKKyAgVFByb3RvY29sRXJyb3JTaXplTGltaXQgICAgICAgICAgICAgICAgID0gMywKKyAgVFByb3RvY29sRXJyb3JCYWRWZXJzaW9uICAgICAgICAgICAgICAgID0gNCwKKyAgVFByb3RvY29sRXJyb3JOb3RJbXBsZW1lbnRlZCAgICAgICAgICAgID0gNSwKKyAgVFByb3RvY29sRXJyb3JEZXB0aExpbWl0ICAgICAgICAgICAgICAgID0gNiwKK307CisKKwordHlwZWRlZiBOU19FTlVNKGludCwgVFByb3RvY29sRXh0ZW5kZWRFcnJvcikgeworICBUUHJvdG9jb2xFeHRlbmRlZEVycm9yTWlzc2luZ1JlcXVpcmVkRmllbGQgID0gMTAwMSwKKyAgVFByb3RvY29sRXh0ZW5kZWRFcnJvclVuZXhwZWN0ZWRUeXBlICAgICAgICA9IDEwMDIsCisgIFRQcm90b2NvbEV4dGVuZGVkRXJyb3JNaXNtYXRjaGVkUHJvdG9jb2wgICAgPSAxMDAzLAorfTsKKworZXh0ZXJuIE5TU3RyaW5nICpUUHJvdG9jb2xFcnJvckV4dGVuZGVkRXJyb3JLZXk7CitleHRlcm4gTlNTdHJpbmcgKlRQcm90b2NvbEVycm9yRmllbGROYW1lS2V5OworZXh0ZXJuIE5TU3RyaW5nICpUUHJvdG9jb2xFcnJvckV4cGVjdGVkSWRLZXk7CitleHRlcm4gTlNTdHJpbmcgKlRQcm90b2NvbEVycm9yRXhwZWN0ZWRWZXJzaW9uS2V5OworZXh0ZXJuIE5TU3RyaW5nICpUUHJvdG9jb2xFcnJvclR5cGVLZXk7CitleHRlcm4gTlNTdHJpbmcgKlRQcm90b2NvbEVycm9yU291cmNlTGluZUtleTsKK2V4dGVybiBOU1N0cmluZyAqVFByb3RvY29sRXJyb3JTb3VyY2VGaWxlS2V5OworZXh0ZXJuIE5TU3RyaW5nICpUUHJvdG9jb2xFcnJvclNvdXJjZU1ldGhvZEtleTsKK2V4dGVybiBOU1N0cmluZyAqVFByb3RvY29sRXJyb3JNZXNzYWdlTmFtZUtleTsKKworCisjZGVmaW5lIFBST1RPQ09MX0VSUk9SKHJldCwgZXJyLCAuLi4pIFwKKyAgaWYgKGVycm9yKSB7ICBcCisgICAgKmVycm9yID0gW05TRXJyb3IgZXJyb3JXaXRoRG9tYWluOlRQcm90b2NvbEVycm9yRG9tYWluIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFByb3RvY29sRXJyb3IgIyMgZXJyIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86QHtOU0xvY2FsaXplZERlc2NyaXB0aW9uS2V5OiBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpfX1ZBX0FSR1NfX10sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIlNvdXJjZUZpbGUiOiBbTlNTdHJpbmcgc3RyaW5nV2l0aFVURjhTdHJpbmc6X19GSUxFX19dLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCJTb3VyY2VMaW5lIjogQChfX0xJTkVfXyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIlNvdXJjZUZ1bmN0aW9uIjogW05TU3RyaW5nIHN0cmluZ1dpdGhVVEY4U3RyaW5nOl9fUFJFVFRZX0ZVTkNUSU9OX19dLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCJNZXNzYWdlIjogc2VsZi5jdXJyZW50TWVzc2FnZU5hbWUgPyBzZWxmLmN1cnJlbnRNZXNzYWdlTmFtZSA6IEAiIn1dOyBcCisgIH0gXAorICByZXR1cm4gcmV0CisKKyNkZWZpbmUgUFJPVE9DT0xfVFJBTlNQT1JUX0VSUk9SKHJldCwgZXJyb3JQdHIsIC4uLikgXAorICBpZiAoZXJyb3JQdHIpIHsgXAorICAgICplcnJvciA9IFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjpUUHJvdG9jb2xFcnJvckRvbWFpbiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOlRQcm90b2NvbEVycm9yVW5rbm93biBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOkB7TlNMb2NhbGl6ZWREZXNjcmlwdGlvbktleTogW1tOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0Ol9fVkFfQVJHU19fXSBzdHJpbmdCeUFwcGVuZGluZ0Zvcm1hdDpAIjogJUAiLCBbKCplcnJvclB0cikgbG9jYWxpemVkRGVzY3JpcHRpb25dXSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEVycm9yU291cmNlRmlsZUtleTogW05TU3RyaW5nIHN0cmluZ1dpdGhVVEY4U3RyaW5nOl9fRklMRV9fXSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEVycm9yU291cmNlTGluZUtleTogQChfX0xJTkVfXyksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xFcnJvclNvdXJjZU1ldGhvZEtleTogW05TU3RyaW5nIHN0cmluZ1dpdGhVVEY4U3RyaW5nOl9fUFJFVFRZX0ZVTkNUSU9OX19dLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRXJyb3JNZXNzYWdlTmFtZUtleTogc2VsZi5jdXJyZW50TWVzc2FnZU5hbWUgPyBzZWxmLmN1cnJlbnRNZXNzYWdlTmFtZSA6IEAiIiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TVW5kZXJseWluZ0Vycm9yS2V5OiAqZXJyb3JQdHJ9XTsgXAorICB9IFwKKyAgcmV0dXJuIHJldApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xFcnJvci5tIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xFcnJvci5tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MzY3M2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbEVycm9yLm0KQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW1wb3J0ICJUUHJvdG9jb2xFcnJvci5oIgorCisKK05TU3RyaW5nICpUUHJvdG9jb2xFcnJvckRvbWFpbiA9IEAiVFByb3RvY29sRXJyb3JEb21haW4iOworCitOU1N0cmluZyAqVFByb3RvY29sRXJyb3JFeHRlbmRlZEVycm9yS2V5ID0gQCJleHRlbmRlZEVycm9yIjsKK05TU3RyaW5nICpUUHJvdG9jb2xFcnJvckZpZWxkTmFtZUtleSA9IEAiZmllbGQiOworTlNTdHJpbmcgKlRQcm90b2NvbEVycm9yRXhwZWN0ZWRJZEtleSA9IEAiZXhwZWN0ZWRJZCI7CitOU1N0cmluZyAqVFByb3RvY29sRXJyb3JFeHBlY3RlZFZlcnNpb25LZXkgPSBAImV4cGVjdGVkVmVyc2lvbiI7CitOU1N0cmluZyAqVFByb3RvY29sRXJyb3JUeXBlS2V5ID0gQCJ0eXBlIjsKK05TU3RyaW5nICpUUHJvdG9jb2xFcnJvclNvdXJjZUxpbmVLZXkgPSBAInNvdXJjZUxpbmUiOworTlNTdHJpbmcgKlRQcm90b2NvbEVycm9yU291cmNlRmlsZUtleSA9IEAic291cmNlRmlsZSI7CitOU1N0cmluZyAqVFByb3RvY29sRXJyb3JTb3VyY2VNZXRob2RLZXkgPSBAInNvdXJjZU1ldGhvZCI7CitOU1N0cmluZyAqVFByb3RvY29sRXJyb3JNZXNzYWdlTmFtZUtleSA9IEAibWVzc2FnZU5hbWUiOwpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uaCBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMzU0ZmMuLjAwMDAwMDAKLS0tIGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2ltcG9ydCAiVEV4Y2VwdGlvbi5oIgotCi1AaW50ZXJmYWNlIFRQcm90b2NvbEV4Y2VwdGlvbiA6IFRFeGNlcHRpb24gewotfQotCi1AZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5tIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24ubQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgxNDg3YS4uMDAwMDAwMAotLS0gYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5tCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW1wb3J0ICJUUHJvdG9jb2xFeGNlcHRpb24uaCIKLQotQGltcGxlbWVudGF0aW9uIFRQcm90b2NvbEV4Y2VwdGlvbgotQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xGYWN0b3J5LmggYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbEZhY3RvcnkuaAppbmRleCBmMjAwYTZkLi5hMDIyYTdmIDEwMDY0NAotLS0gYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbEZhY3RvcnkuaAorKysgYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbEZhY3RvcnkuaApAQCAtMjEsOSArMjEsMTYgQEAKICNpbXBvcnQgIlRQcm90b2NvbC5oIgogI2ltcG9ydCAiVFRyYW5zcG9ydC5oIgogCitOU19BU1NVTUVfTk9OTlVMTF9CRUdJTgorCiAKIEBwcm90b2NvbCBUUHJvdG9jb2xGYWN0b3J5IDxOU09iamVjdD4KIAotLSAoaWQgPFRQcm90b2NvbD4pIG5ld1Byb3RvY29sT25UcmFuc3BvcnQ6IChpZCA8VFRyYW5zcG9ydD4pIHRyYW5zcG9ydDsKK0Bwcm9wZXJ0eSAocmVhZG9ubHksIG5vbmF0b21pYykgTlNTdHJpbmcgKnByb3RvY29sTmFtZTsKKworLShpZDxUUHJvdG9jb2w+KSBuZXdQcm90b2NvbE9uVHJhbnNwb3J0OihpZDxUVHJhbnNwb3J0Pil0cmFuc3BvcnQ7CiAKIEBlbmQKKworCitOU19BU1NVTUVfTk9OTlVMTF9FTkQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sVXRpbC5oIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xVdGlsLmgKaW5kZXggNzU3NzQ4YS4uODI1MTBjZiAxMDA2NDQKLS0tIGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xVdGlsLmgKKysrIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xVdGlsLmgKQEAgLTIwLDEwICsyMCwxNCBAQAogI2ltcG9ydCAiVFByb3RvY29sLmgiCiAjaW1wb3J0ICJUVHJhbnNwb3J0LmgiCiAKLUBpbnRlcmZhY2UgVFByb3RvY29sVXRpbCA6IE5TT2JqZWN0IHsKK05TX0FTU1VNRV9OT05OVUxMX0JFR0lOCiAKLX0KIAotKyAodm9pZCkgc2tpcFR5cGU6IChpbnQpIHR5cGUgb25Qcm90b2NvbDogKGlkIDxUUHJvdG9jb2w+KSBwcm90b2NvbDsKK0BpbnRlcmZhY2UgVFByb3RvY29sVXRpbCA6IE5TT2JqZWN0CiAKLUBlbmQKKysoQk9PTCkgc2tpcFR5cGU6KGludCl0eXBlIG9uUHJvdG9jb2w6KGlkIDxUUHJvdG9jb2w+KXByb3RvY29sIGVycm9yOihOU0Vycm9yICoqKWVycm9yOworCitAZW5kOworCisKK05TX0FTU1VNRV9OT05OVUxMX0VORApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sVXRpbC5tIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xVdGlsLm0KaW5kZXggMTNkNzA5NS4uYzBkNjVhYyAxMDA2NDQKLS0tIGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xVdGlsLm0KKysrIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xVdGlsLm0KQEAgLTIxLDg0ICsyMSwxNTEgQEAKIAogQGltcGxlbWVudGF0aW9uIFRQcm90b2NvbFV0aWwKIAotKyAodm9pZCkgc2tpcFR5cGU6IChpbnQpIHR5cGUgb25Qcm90b2NvbDogKGlkIDxUUHJvdG9jb2w+KSBwcm90b2NvbAorKyhCT09MKSBza2lwVHlwZTooaW50KXR5cGUgb25Qcm90b2NvbDooaWQgPFRQcm90b2NvbD4pcHJvdG9jb2wgZXJyb3I6KE5TRXJyb3IgKiopZXJyb3IKIHsKICAgc3dpdGNoICh0eXBlKSB7Ci0gIGNhc2UgVFR5cGVfQk9PTDoKLSAgICBbcHJvdG9jb2wgcmVhZEJvb2xdOwotICAgIGJyZWFrOwotICBjYXNlIFRUeXBlX0JZVEU6Ci0gICAgW3Byb3RvY29sIHJlYWRCeXRlXTsKLSAgICBicmVhazsKLSAgY2FzZSBUVHlwZV9JMTY6Ci0gICAgW3Byb3RvY29sIHJlYWRJMTZdOwotICAgIGJyZWFrOwotICBjYXNlIFRUeXBlX0kzMjoKLSAgICBbcHJvdG9jb2wgcmVhZEkzMl07Ci0gICAgYnJlYWs7Ci0gIGNhc2UgVFR5cGVfSTY0OgotICAgIFtwcm90b2NvbCByZWFkSTY0XTsKLSAgICBicmVhazsKLSAgY2FzZSBUVHlwZV9ET1VCTEU6Ci0gICAgW3Byb3RvY29sIHJlYWREb3VibGVdOwotICAgIGJyZWFrOwotICBjYXNlIFRUeXBlX1NUUklORzoKLSAgICBbcHJvdG9jb2wgcmVhZFN0cmluZ107Ci0gICAgYnJlYWs7Ci0gIGNhc2UgVFR5cGVfU1RSVUNUOgotICAgIFtwcm90b2NvbCByZWFkU3RydWN0QmVnaW5SZXR1cm5pbmdOYW1lOiBOVUxMXTsKKyAgY2FzZSBUVHlwZUJPT0w6IHsKKyAgICBCT09MIHZhbDsKKyAgICBpZiAoIVtwcm90b2NvbCByZWFkQm9vbDomdmFsIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgfQorICBicmVhazsKKworICBjYXNlIFRUeXBlQllURTogeworICAgIFVJbnQ4IHZhbDsKKyAgICBpZiAoIVtwcm90b2NvbCByZWFkQnl0ZTomdmFsIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgfQorICBicmVhazsKKworICBjYXNlIFRUeXBlSTE2OiB7CisgICAgU0ludDE2IHZhbDsKKyAgICBpZiAoIVtwcm90b2NvbCByZWFkSTE2OiZ2YWwgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorICB9CisgIGJyZWFrOworCisgIGNhc2UgVFR5cGVJMzI6IHsKKyAgICBTSW50MzIgdmFsOworICAgIGlmICghW3Byb3RvY29sIHJlYWRJMzI6JnZhbCBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgIH0KKyAgYnJlYWs7CisKKyAgY2FzZSBUVHlwZUk2NDogeworICAgIFNJbnQ2NCB2YWw7CisgICAgaWYgKCFbcHJvdG9jb2wgcmVhZEk2NDomdmFsIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgfQorICBicmVhazsKKworICBjYXNlIFRUeXBlRE9VQkxFOiB7CisgICAgZG91YmxlIHZhbDsKKyAgICBpZiAoIVtwcm90b2NvbCByZWFkRG91YmxlOiZ2YWwgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorICB9CisgIGJyZWFrOworCisgIGNhc2UgVFR5cGVTVFJJTkc6IHsKKyAgICBOU1N0cmluZyAqdmFsOworICAgIGlmICghW3Byb3RvY29sIHJlYWRTdHJpbmc6JnZhbCBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgIH0KKyAgYnJlYWs7CisKKyAgY2FzZSBUVHlwZVNUUlVDVDogeworICAgIGlmICghW3Byb3RvY29sIHJlYWRTdHJ1Y3RCZWdpblJldHVybmluZ05hbWU6TlVMTCBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CiAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIGludCBmaWVsZFR5cGU7Ci0gICAgICBbcHJvdG9jb2wgcmVhZEZpZWxkQmVnaW5SZXR1cm5pbmdOYW1lOiBuaWwgdHlwZTogJmZpZWxkVHlwZSBmaWVsZElEOiBuaWxdOwotICAgICAgaWYgKGZpZWxkVHlwZSA9PSBUVHlwZV9TVE9QKSB7CisgICAgICBTSW50MzIgZmllbGRUeXBlOworICAgICAgaWYgKCFbcHJvdG9jb2wgcmVhZEZpZWxkQmVnaW5SZXR1cm5pbmdOYW1lOm5pbCB0eXBlOiZmaWVsZFR5cGUgZmllbGRJRDpuaWwgZXJyb3I6ZXJyb3JdKSB7CisgICAgICAgIHJldHVybiBOTzsKKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZFR5cGUgPT0gVFR5cGVTVE9QKSB7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQotICAgICAgW1RQcm90b2NvbFV0aWwgc2tpcFR5cGU6IGZpZWxkVHlwZSBvblByb3RvY29sOiBwcm90b2NvbF07Ci0gICAgICBbcHJvdG9jb2wgcmVhZEZpZWxkRW5kXTsKKyAgICAgIGlmICghW3NlbGYgc2tpcFR5cGU6ZmllbGRUeXBlIG9uUHJvdG9jb2w6cHJvdG9jb2wgZXJyb3I6ZXJyb3JdKSB7CisgICAgICAgIHJldHVybiBOTzsKKyAgICAgIH0KKyAgICAgIGlmICghW3Byb3RvY29sIHJlYWRGaWVsZEVuZDplcnJvcl0pIHsKKyAgICAgICAgcmV0dXJuIE5POworICAgICAgfQogICAgIH0KLSAgICBbcHJvdG9jb2wgcmVhZFN0cnVjdEVuZF07Ci0gICAgYnJlYWs7Ci0gIGNhc2UgVFR5cGVfTUFQOgotICB7Ci0gICAgaW50IGtleVR5cGU7Ci0gICAgaW50IHZhbHVlVHlwZTsKLSAgICBpbnQgc2l6ZTsKLSAgICBbcHJvdG9jb2wgcmVhZE1hcEJlZ2luUmV0dXJuaW5nS2V5VHlwZTogJmtleVR5cGUgdmFsdWVUeXBlOiAmdmFsdWVUeXBlIHNpemU6ICZzaXplXTsKKyAgICBpZiAoIVtwcm90b2NvbCByZWFkU3RydWN0RW5kOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgfQorICBicmVhazsKKworICBjYXNlIFRUeXBlTUFQOiB7CisgICAgU0ludDMyIGtleVR5cGU7CisgICAgU0ludDMyIHZhbHVlVHlwZTsKKyAgICBTSW50MzIgc2l6ZTsKKyAgICBpZiAoIVtwcm90b2NvbCByZWFkTWFwQmVnaW5SZXR1cm5pbmdLZXlUeXBlOiZrZXlUeXBlIHZhbHVlVHlwZTomdmFsdWVUeXBlIHNpemU6JnNpemUgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQogICAgIGludCBpOwogICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgIFtUUHJvdG9jb2xVdGlsIHNraXBUeXBlOiBrZXlUeXBlIG9uUHJvdG9jb2w6IHByb3RvY29sXTsKLSAgICAgIFtUUHJvdG9jb2xVdGlsIHNraXBUeXBlOiB2YWx1ZVR5cGUgb25Qcm90b2NvbDogcHJvdG9jb2xdOwotICAgIH0KLSAgICBbcHJvdG9jb2wgcmVhZE1hcEVuZF07Ci0gIH0KLSAgICBicmVhazsKLSAgICBjYXNlIFRUeXBlX1NFVDoKLSAgICB7Ci0gICAgICBpbnQgZWxlbVR5cGU7Ci0gICAgICBpbnQgc2l6ZTsKLSAgICAgIFtwcm90b2NvbCByZWFkU2V0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZTogJmVsZW1UeXBlIHNpemU6ICZzaXplXTsKLSAgICAgIGludCBpOwotICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICBbVFByb3RvY29sVXRpbCBza2lwVHlwZTogZWxlbVR5cGUgb25Qcm90b2NvbDogcHJvdG9jb2xdOworICAgICAgaWYgKCFbVFByb3RvY29sVXRpbCBza2lwVHlwZTprZXlUeXBlIG9uUHJvdG9jb2w6cHJvdG9jb2wgZXJyb3I6ZXJyb3JdKSB7CisgICAgICAgIHJldHVybiBOTzsKICAgICAgIH0KLSAgICAgIFtwcm90b2NvbCByZWFkU2V0RW5kXTsKLSAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRUeXBlX0xJU1Q6Ci0gICAgewotICAgICAgaW50IGVsZW1UeXBlOwotICAgICAgaW50IHNpemU7Ci0gICAgICBbcHJvdG9jb2wgcmVhZExpc3RCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOiAmZWxlbVR5cGUgc2l6ZTogJnNpemVdOwotICAgICAgaW50IGk7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgIFtUUHJvdG9jb2xVdGlsIHNraXBUeXBlOiBlbGVtVHlwZSBvblByb3RvY29sOiBwcm90b2NvbF07CisgICAgICBpZiAoIVtUUHJvdG9jb2xVdGlsIHNraXBUeXBlOnZhbHVlVHlwZSBvblByb3RvY29sOnByb3RvY29sIGVycm9yOmVycm9yXSkgeworICAgICAgICByZXR1cm4gTk87CiAgICAgICB9Ci0gICAgICBbcHJvdG9jb2wgcmVhZExpc3RFbmRdOwogICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm47CisgICAgaWYgKCFbcHJvdG9jb2wgcmVhZE1hcEVuZDplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CiAgIH0KKyAgYnJlYWs7CisKKyAgY2FzZSBUVHlwZVNFVDogeworICAgIFNJbnQzMiBlbGVtVHlwZTsKKyAgICBTSW50MzIgc2l6ZTsKKyAgICBpZiAoIVtwcm90b2NvbCByZWFkU2V0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZTomZWxlbVR5cGUgc2l6ZTomc2l6ZSBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgaWYgKCFbVFByb3RvY29sVXRpbCBza2lwVHlwZTplbGVtVHlwZSBvblByb3RvY29sOnByb3RvY29sIGVycm9yOmVycm9yXSkgeworICAgICAgICByZXR1cm4gTk87CisgICAgICB9CisgICAgfQorICAgIGlmICghW3Byb3RvY29sIHJlYWRTZXRFbmQ6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorICB9CisgIGJyZWFrOworCisgIGNhc2UgVFR5cGVMSVNUOiB7CisgICAgU0ludDMyIGVsZW1UeXBlOworICAgIFNJbnQzMiBzaXplOworICAgIGlmICghW3Byb3RvY29sIHJlYWRMaXN0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZTomZWxlbVR5cGUgc2l6ZTomc2l6ZSBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgaWYgKCFbVFByb3RvY29sVXRpbCBza2lwVHlwZTplbGVtVHlwZSBvblByb3RvY29sOnByb3RvY29sIGVycm9yOmVycm9yXSkgeworICAgICAgICByZXR1cm4gTk87CisgICAgICB9CisgICAgfQorICAgIGlmICghW3Byb3RvY29sIHJlYWRMaXN0RW5kOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgfQorICBicmVhazsKKworICB9CisKKyAgcmV0dXJuIFlFUzsKIH0KIAogQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9zZXJ2ZXIvVFNvY2tldFNlcnZlci5oIGIvbGliL2NvY29hL3NyYy9zZXJ2ZXIvVFNvY2tldFNlcnZlci5oCmluZGV4IGM4ZmY5ZjAuLjk1YjBkM2MgMTAwNjQ0Ci0tLSBhL2xpYi9jb2NvYS9zcmMvc2VydmVyL1RTb2NrZXRTZXJ2ZXIuaAorKysgYi9saWIvY29jb2Evc3JjL3NlcnZlci9UU29ja2V0U2VydmVyLmgKQEAgLTI3LDIzICsyNywyNSBAQAogI2ltcG9ydCA8Q0ZOZXR3b3JrL0NGTmV0d29yay5oPgogI2VuZGlmCiAKLWV4dGVybiBOU1N0cmluZyAqIGNvbnN0IGtUU29ja2V0U2VydmVyX0NsaWVudENvbm5lY3Rpb25GaW5pc2hlZEZvclByb2Nlc3Nvck5vdGlmaWNhdGlvbjsKLWV4dGVybiBOU1N0cmluZyAqIGNvbnN0IGtUU29ja2V0U2VydmVyX1Byb2Nlc3NvcktleTsKLWV4dGVybiBOU1N0cmluZyAqIGNvbnN0IGtUU29ja2VyU2VydmVyX1RyYW5zcG9ydEtleTsKK05TX0FTU1VNRV9OT05OVUxMX0JFR0lOCiAKIAotQGludGVyZmFjZSBUU29ja2V0U2VydmVyIDogTlNPYmplY3QgewotICBOU0ZpbGVIYW5kbGUgKiBtU29ja2V0RmlsZUhhbmRsZTsKLSAgaWQgPFRQcm90b2NvbEZhY3Rvcnk+IG1JbnB1dFByb3RvY29sRmFjdG9yeTsKLSAgaWQgPFRQcm90b2NvbEZhY3Rvcnk+IG1PdXRwdXRQcm90b2NvbEZhY3Rvcnk7Ci0gIGlkIDxUUHJvY2Vzc29yRmFjdG9yeT4gbVByb2Nlc3NvckZhY3Rvcnk7Ci19CitleHRlcm4gTlNTdHJpbmcgKmNvbnN0IFRTb2NrZXRTZXJ2ZXJDbGllbnRDb25uZWN0aW9uRmluaXNoZWQ7CitleHRlcm4gTlNTdHJpbmcgKmNvbnN0IFRTb2NrZXRTZXJ2ZXJQcm9jZXNzb3JLZXk7CitleHRlcm4gTlNTdHJpbmcgKmNvbnN0IFRTb2NrZXJTZXJ2ZXJUcmFuc3BvcnRLZXk7CiAKLS0gKGlkKSBpbml0V2l0aFBvcnQ6IChpbnQpIHBvcnQKLSAgICBwcm90b2NvbEZhY3Rvcnk6IChpZCA8VFByb3RvY29sRmFjdG9yeT4pIHByb3RvY29sRmFjdG9yeQotICAgcHJvY2Vzc29yRmFjdG9yeTogKGlkIDxUUHJvY2Vzc29yRmFjdG9yeT4pIHByb2Nlc3NvckZhY3Rvcnk7CisKK0BpbnRlcmZhY2UgVFNvY2tldFNlcnZlciA6IE5TT2JqZWN0CisKKy0oaW5zdGFuY2V0eXBlKSBpbml0V2l0aFBvcnQ6KGludClwb3J0CisgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5OihpZCA8VFByb3RvY29sRmFjdG9yeT4pcHJvdG9jb2xGYWN0b3J5CisgICAgICAgICAgICBwcm9jZXNzb3JGYWN0b3J5OihpZCA8VFByb2Nlc3NvckZhY3Rvcnk+KXByb2Nlc3NvckZhY3Rvcnk7CisKKy0gKGluc3RhbmNldHlwZSkgaW5pdFdpdGhQYXRoOiAoTlNTdHJpbmcgKikgcGF0aAorICAgICAgICAgICAgICBwcm90b2NvbEZhY3Rvcnk6IChpZCA8VFByb3RvY29sRmFjdG9yeT4pIHByb3RvY29sRmFjdG9yeQorICAgICAgICAgICAgIHByb2Nlc3NvckZhY3Rvcnk6IChpZCA8VFByb2Nlc3NvckZhY3Rvcnk+KSBwcm9jZXNzb3JGYWN0b3J5OwogCiBAZW5kCiAKIAotCitOU19BU1NVTUVfTk9OTlVMTF9FTkQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvc2VydmVyL1RTb2NrZXRTZXJ2ZXIubSBiL2xpYi9jb2NvYS9zcmMvc2VydmVyL1RTb2NrZXRTZXJ2ZXIubQppbmRleCAwN2JjODI5Li4wOWI2MDNjIDEwMDY0NAotLS0gYS9saWIvY29jb2Evc3JjL3NlcnZlci9UU29ja2V0U2VydmVyLm0KKysrIGIvbGliL2NvY29hL3NyYy9zZXJ2ZXIvVFNvY2tldFNlcnZlci5tCkBAIC0yMSwzOCArMjEsOTIgQEAKICNpbXBvcnQgIlRTb2NrZXRTZXJ2ZXIuaCIKICNpbXBvcnQgIlROU0ZpbGVIYW5kbGVUcmFuc3BvcnQuaCIKICNpbXBvcnQgIlRQcm90b2NvbC5oIgotI2ltcG9ydCAiVFRyYW5zcG9ydEV4Y2VwdGlvbi5oIgotI2ltcG9ydCAiVE9iamVjdGl2ZS1DLmgiCisjaW1wb3J0ICJUVHJhbnNwb3J0RXJyb3IuaCIKKwogI2ltcG9ydCA8c3lzL3NvY2tldC5oPgogI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxzeXMvdW4uaD4KIAogCitOU1N0cmluZyAqY29uc3QgVFNvY2tldFNlcnZlckNsaWVudENvbm5lY3Rpb25GaW5pc2hlZCA9IEAiVFNvY2tldFNlcnZlckNsaWVudENvbm5lY3Rpb25GaW5pc2hlZCI7CitOU1N0cmluZyAqY29uc3QgVFNvY2tldFNlcnZlclByb2Nlc3NvcktleSA9IEAiVFNvY2tldFNlcnZlclByb2Nlc3NvciI7CitOU1N0cmluZyAqY29uc3QgVFNvY2tlclNlcnZlclRyYW5zcG9ydEtleSA9IEAiVFNvY2tlclNlcnZlclRyYW5zcG9ydCI7CiAKLU5TU3RyaW5nICogY29uc3Qga1RTb2NrZXRTZXJ2ZXJfQ2xpZW50Q29ubmVjdGlvbkZpbmlzaGVkRm9yUHJvY2Vzc29yTm90aWZpY2F0aW9uID0gQCJUU29ja2V0U2VydmVyX0NsaWVudENvbm5lY3Rpb25GaW5pc2hlZEZvclByb2Nlc3Nvck5vdGlmaWNhdGlvbiI7Ci1OU1N0cmluZyAqIGNvbnN0IGtUU29ja2V0U2VydmVyX1Byb2Nlc3NvcktleSA9IEAiVFNvY2tldFNlcnZlcl9Qcm9jZXNzb3IiOwotTlNTdHJpbmcgKiBjb25zdCBrVFNvY2tlclNlcnZlcl9UcmFuc3BvcnRLZXkgPSBAIlRTb2NrZXJTZXJ2ZXJfVHJhbnNwb3J0IjsKKworQGludGVyZmFjZSBUU29ja2V0U2VydmVyICgpCisKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgaWQ8VFByb3RvY29sRmFjdG9yeT4gaW5wdXRQcm90b2NvbEZhY3Rvcnk7CitAcHJvcGVydHkoc3Ryb25nLCBub25hdG9taWMpIGlkPFRQcm90b2NvbEZhY3Rvcnk+IG91dHB1dFByb3RvY29sRmFjdG9yeTsKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgaWQ8VFByb2Nlc3NvckZhY3Rvcnk+IHByb2Nlc3NvckZhY3Rvcnk7CitAcHJvcGVydHkoc3Ryb25nLCBub25hdG9taWMpIE5TRmlsZUhhbmRsZSAqc29ja2V0RmlsZUhhbmRsZTsKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgZGlzcGF0Y2hfcXVldWVfdCBwcm9jZXNzaW5nUXVldWU7CitAcHJvcGVydHkoc3Ryb25nLCBub25hdG9taWMpIE5TU3RyaW5nICpkb21haW5Tb2NrZXRQYXRoOworCitAZW5kCiAKIAogQGltcGxlbWVudGF0aW9uIFRTb2NrZXRTZXJ2ZXIKIAorLShpbnN0YW5jZXR5cGUpIGluaXRXaXRoU29ja2V0OihDRlNvY2tldFJlZilzb2NrZXQKKyAgICAgICAgICAgICBwcm90b2NvbEZhY3Rvcnk6KGlkIDxUUHJvdG9jb2xGYWN0b3J5Pilwcm90b2NvbEZhY3RvcnkKKyAgICAgICAgICAgIHByb2Nlc3NvckZhY3Rvcnk6KGlkIDxUUHJvY2Vzc29yRmFjdG9yeT4pcHJvY2Vzc29yRmFjdG9yeTsKK3sKKyAgc2VsZiA9IFtzdXBlciBpbml0XTsKKworICBfaW5wdXRQcm90b2NvbEZhY3RvcnkgPSBwcm90b2NvbEZhY3Rvcnk7CisgIF9vdXRwdXRQcm90b2NvbEZhY3RvcnkgPSBwcm90b2NvbEZhY3Rvcnk7CisgIF9wcm9jZXNzb3JGYWN0b3J5ID0gcHJvY2Vzc29yRmFjdG9yeTsKKworICBkaXNwYXRjaF9xdWV1ZV9hdHRyX3QgcHJvY2Vzc2luZ1F1ZXVlQXR0ciA9CisgICAgZGlzcGF0Y2hfcXVldWVfYXR0cl9tYWtlX3dpdGhfcW9zX2NsYXNzKERJU1BBVENIX1FVRVVFX0NPTkNVUlJFTlQsIFFPU19DTEFTU19CQUNLR1JPVU5ELCAwKTsKKworICBfcHJvY2Vzc2luZ1F1ZXVlID0gZGlzcGF0Y2hfcXVldWVfY3JlYXRlKCJUU29ja2V0U2VydmVyLnByb2Nlc3NpbmciLCBwcm9jZXNzaW5nUXVldWVBdHRyKTsKKworICAvLyBjcmVhdGUgYSBzb2NrZXQuCisgIGludCBmZCA9IENGU29ja2V0R2V0TmF0aXZlKHNvY2tldCk7CisKKyAgLy8gd3JhcCBpdCBpbiBhIGZpbGUgaGFuZGxlIHNvIHdlIGNhbiBnZXQgbWVzc2FnZXMgZnJvbSBpdAorICBfc29ja2V0RmlsZUhhbmRsZSA9IFtbTlNGaWxlSGFuZGxlIGFsbG9jXSBpbml0V2l0aEZpbGVEZXNjcmlwdG9yOmZkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VPbkRlYWxsb2M6WUVTXTsKKworICAvLyB0aHJvdyBhd2F5IG91ciBzb2NrZXQKKyAgQ0ZTb2NrZXRJbnZhbGlkYXRlKHNvY2tldCk7CisgIENGUmVsZWFzZShzb2NrZXQpOworCisgIC8vIHJlZ2lzdGVyIGZvciBub3RpZmljYXRpb25zIG9mIGFjY2VwdGVkIGluY29taW5nIGNvbm5lY3Rpb25zCisgIFtbTlNOb3RpZmljYXRpb25DZW50ZXIgZGVmYXVsdENlbnRlcl0gYWRkT2JzZXJ2ZXI6c2VsZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOkBzZWxlY3Rvcihjb25uZWN0aW9uQWNjZXB0ZWQ6KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOk5TRmlsZUhhbmRsZUNvbm5lY3Rpb25BY2NlcHRlZE5vdGlmaWNhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0Ol9zb2NrZXRGaWxlSGFuZGxlXTsKKworICAvLyB0ZWxsIHNvY2tldCB0byBsaXN0ZW4KKyAgW19zb2NrZXRGaWxlSGFuZGxlIGFjY2VwdENvbm5lY3Rpb25JbkJhY2tncm91bmRBbmROb3RpZnldOworCisgIHJldHVybiBzZWxmOworfQorCiAtIChpZCkgaW5pdFdpdGhQb3J0OiAoaW50KSBwb3J0CiAgICAgcHJvdG9jb2xGYWN0b3J5OiAoaWQgPFRQcm90b2NvbEZhY3Rvcnk+KSBwcm90b2NvbEZhY3RvcnkKICAgIHByb2Nlc3NvckZhY3Rvcnk6IChpZCA8VFByb2Nlc3NvckZhY3Rvcnk+KSBwcm9jZXNzb3JGYWN0b3J5CiB7Ci0gIHNlbGYgPSBbc3VwZXIgaW5pdF07CisgIENGU29ja2V0UmVmIHNvY2tldCA9IFtbc2VsZiBjbGFzc10gY3JlYXRlU29ja2V0V2l0aFBvcnQ6cG9ydF07CisgIGlmIChzb2NrZXQgPT0gTlVMTCkgeworICAgIHJldHVybiBuaWw7CisgIH0KIAotICBtSW5wdXRQcm90b2NvbEZhY3RvcnkgPSBbcHJvdG9jb2xGYWN0b3J5IHJldGFpbl9zdHViXTsKLSAgbU91dHB1dFByb3RvY29sRmFjdG9yeSA9IFtwcm90b2NvbEZhY3RvcnkgcmV0YWluX3N0dWJdOwotICBtUHJvY2Vzc29yRmFjdG9yeSA9IFtwcm9jZXNzb3JGYWN0b3J5IHJldGFpbl9zdHViXTsKKyAgaWYgKHNlbGYgPSBbc2VsZiBpbml0V2l0aFNvY2tldDpzb2NrZXQgcHJvdG9jb2xGYWN0b3J5OnByb3RvY29sRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5OnByb2Nlc3NvckZhY3RvcnldKSB7CisgICAgTlNMb2coQCJUU29ja2V0U2VydmVyOiBMaXN0ZW5pbmcgb24gVENQIHBvcnQgJWQiLCBwb3J0KTsKKyAgfQorICByZXR1cm4gc2VsZjsKK30KIAotICAvLyBjcmVhdGUgYSBzb2NrZXQuCi0gIGludCBmZCA9IC0xOworCisrKENGU29ja2V0UmVmKSBjcmVhdGVTb2NrZXRXaXRoUG9ydDooaW50KXBvcnQKK3sKICAgQ0ZTb2NrZXRSZWYgc29ja2V0ID0gQ0ZTb2NrZXRDcmVhdGUoa0NGQWxsb2NhdG9yRGVmYXVsdCwgUEZfSU5FVCwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQLCAwLCBOVUxMLCBOVUxMKTsKICAgaWYgKHNvY2tldCkgewotICAgIENGT3B0aW9uRmxhZ3MgZmxhZ3NUb0NsZWFyID0ga0NGU29ja2V0Q2xvc2VPbkludmFsaWRhdGU7Ci0gICAgQ0ZTb2NrZXRTZXRTb2NrZXRGbGFncyhzb2NrZXQsICBDRlNvY2tldEdldFNvY2tldEZsYWdzKHNvY2tldCkgJiB+ZmxhZ3NUb0NsZWFyKTsKLQotICAgIGZkID0gQ0ZTb2NrZXRHZXROYXRpdmUoc29ja2V0KTsKKyAgICBDRlNvY2tldFNldFNvY2tldEZsYWdzKHNvY2tldCwgQ0ZTb2NrZXRHZXRTb2NrZXRGbGFncyhzb2NrZXQpICYgfmtDRlNvY2tldENsb3NlT25JbnZhbGlkYXRlKTsKKyAgICBpbnQgZmQgPSBDRlNvY2tldEdldE5hdGl2ZShzb2NrZXQpOwogICAgIGludCB5ZXMgPSAxOwogICAgIHNldHNvY2tvcHQoZmQsIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwgKHZvaWQgKikmeWVzLCBzaXplb2YoeWVzKSk7CiAKQEAgLTYzLDEzNSArMTE3LDEyMyBAQAogICAgIGFkZHIuc2luX3BvcnQgPSBodG9ucyhwb3J0KTsKICAgICBhZGRyLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKElOQUREUl9BTlkpOwogICAgIE5TRGF0YSAqYWRkcmVzcyA9IFtOU0RhdGEgZGF0YVdpdGhCeXRlczomYWRkciBsZW5ndGg6c2l6ZW9mKGFkZHIpXTsKLSAgICBpZiAoQ0ZTb2NrZXRTZXRBZGRyZXNzKHNvY2tldCwgKGJyaWRnZV9zdHViIENGRGF0YVJlZilhZGRyZXNzKSAhPSBrQ0ZTb2NrZXRTdWNjZXNzKSB7CisgICAgaWYgKENGU29ja2V0U2V0QWRkcmVzcyhzb2NrZXQsIChfX2JyaWRnZSBDRkRhdGFSZWYpYWRkcmVzcykgIT0ga0NGU29ja2V0U3VjY2VzcykgewogICAgICAgQ0ZTb2NrZXRJbnZhbGlkYXRlKHNvY2tldCk7CiAgICAgICBDRlJlbGVhc2Uoc29ja2V0KTsKLSAgICAgIE5TTG9nKEAiKioqIENvdWxkIG5vdCBiaW5kIHRvIGFkZHJlc3MiKTsKLSAgICAgIHJldHVybiBuaWw7CisgICAgICBOU0xvZyhAIlRTb2NrZXRTZXJ2ZXI6IENvdWxkIG5vdCBiaW5kIHRvIGFkZHJlc3MiKTsKKyAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgfSBlbHNlIHsKLSAgICBOU0xvZyhAIioqKiBObyBzZXJ2ZXIgc29ja2V0Iik7CisKKyAgICByZXR1cm4gc29ja2V0OworICB9CisgIGVsc2UgeworICAgIE5TTG9nKEAiVFNvY2tldFNlcnZlcjogTm8gc2VydmVyIHNvY2tldCIpOworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKKy0gKGlkKSBpbml0V2l0aFBhdGg6IChOU1N0cmluZyAqKSBwYXRoCisgICAgcHJvdG9jb2xGYWN0b3J5OiAoaWQgPFRQcm90b2NvbEZhY3Rvcnk+KSBwcm90b2NvbEZhY3RvcnkKKyAgIHByb2Nlc3NvckZhY3Rvcnk6IChpZCA8VFByb2Nlc3NvckZhY3Rvcnk+KSBwcm9jZXNzb3JGYWN0b3J5Cit7CisgIF9kb21haW5Tb2NrZXRQYXRoID0gcGF0aDsKKyAgQ0ZTb2NrZXRSZWYgc29ja2V0ID0gW1tzZWxmIGNsYXNzXSBjcmVhdGVTb2NrZXRXaXRoUGF0aDpwYXRoXTsKKyAgaWYgKHNvY2tldCA9PSBOVUxMKSB7CiAgICAgcmV0dXJuIG5pbDsKICAgfQotICAKLSAgLy8gd3JhcCBpdCBpbiBhIGZpbGUgaGFuZGxlIHNvIHdlIGNhbiBnZXQgbWVzc2FnZXMgZnJvbSBpdAotICBtU29ja2V0RmlsZUhhbmRsZSA9IFtbTlNGaWxlSGFuZGxlIGFsbG9jXSBpbml0V2l0aEZpbGVEZXNjcmlwdG9yOiBmZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlT25EZWFsbG9jOiBZRVNdOwotICAKLSAgLy8gdGhyb3cgYXdheSBvdXIgc29ja2V0Ci0gIENGU29ja2V0SW52YWxpZGF0ZShzb2NrZXQpOwotICBDRlJlbGVhc2Uoc29ja2V0KTsKLSAgCi0gICAgLy8gcmVnaXN0ZXIgZm9yIG5vdGlmaWNhdGlvbnMgb2YgYWNjZXB0ZWQgaW5jb21pbmcgY29ubmVjdGlvbnMKLSAgW1tOU05vdGlmaWNhdGlvbkNlbnRlciBkZWZhdWx0Q2VudGVyXSBhZGRPYnNlcnZlcjogc2VsZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOiBAc2VsZWN0b3IoY29ubmVjdGlvbkFjY2VwdGVkOikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogTlNGaWxlSGFuZGxlQ29ubmVjdGlvbkFjY2VwdGVkTm90aWZpY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Q6IG1Tb2NrZXRGaWxlSGFuZGxlXTsKLSAgCi0gIC8vIHRlbGwgc29ja2V0IHRvIGxpc3RlbgotICBbbVNvY2tldEZpbGVIYW5kbGUgYWNjZXB0Q29ubmVjdGlvbkluQmFja2dyb3VuZEFuZE5vdGlmeV07Ci0gIAotICBOU0xvZyhAIkxpc3RlbmluZyBvbiBUQ1AgcG9ydCAlZCIsIHBvcnQpOwotICAKKworICBpZiAoc2VsZiA9IFtzZWxmIGluaXRXaXRoU29ja2V0OnNvY2tldCBwcm90b2NvbEZhY3Rvcnk6cHJvdG9jb2xGYWN0b3J5IHByb2Nlc3NvckZhY3Rvcnk6cHJvY2Vzc29yRmFjdG9yeV0pIHsKKyAgICBOU0xvZyhAIlRTb2NrZXRTZXJ2ZXI6IExpc3RlbmluZyBvbiBwYXRoICVAIiwgcGF0aCk7CisgIH0KICAgcmV0dXJuIHNlbGY7CiB9CiAKLQotLSAodm9pZCkgZGVhbGxvYyB7Ci0gIFtbTlNOb3RpZmljYXRpb25DZW50ZXIgZGVmYXVsdENlbnRlcl0gcmVtb3ZlT2JzZXJ2ZXI6c2VsZl07Ci0gIFttSW5wdXRQcm90b2NvbEZhY3RvcnkgcmVsZWFzZV9zdHViXTsKLSAgW21PdXRwdXRQcm90b2NvbEZhY3RvcnkgcmVsZWFzZV9zdHViXTsKLSAgW21Qcm9jZXNzb3JGYWN0b3J5IHJlbGVhc2Vfc3R1Yl07Ci0gIFttU29ja2V0RmlsZUhhbmRsZSByZWxlYXNlX3N0dWJdOwotICBbc3VwZXIgZGVhbGxvY19zdHViXTsKLX0KLQotCi0tICh2b2lkKSBjb25uZWN0aW9uQWNjZXB0ZWQ6IChOU05vdGlmaWNhdGlvbiAqKSBhTm90aWZpY2F0aW9uCisrIChDRlNvY2tldFJlZikgY3JlYXRlU29ja2V0V2l0aFBhdGg6IChOU1N0cmluZyAqKSBwYXRoCiB7Ci0gIE5TRmlsZUhhbmRsZSAqIHNvY2tldCA9IFtbYU5vdGlmaWNhdGlvbiB1c2VySW5mb10gb2JqZWN0Rm9yS2V5OiBOU0ZpbGVIYW5kbGVOb3RpZmljYXRpb25GaWxlSGFuZGxlSXRlbV07CisgIENGU29ja2V0UmVmIHNvY2tldCA9IENGU29ja2V0Q3JlYXRlKGtDRkFsbG9jYXRvckRlZmF1bHQsIFBGX0xPQ0FMLCBTT0NLX1NUUkVBTSwgSVBQUk9UT19JUCwgMCwgTlVMTCwgTlVMTCk7CisgIGlmIChzb2NrZXQpIHsKKyAgICBDRlNvY2tldFNldFNvY2tldEZsYWdzKHNvY2tldCwgIENGU29ja2V0R2V0U29ja2V0RmxhZ3Moc29ja2V0KSAmIH5rQ0ZTb2NrZXRDbG9zZU9uSW52YWxpZGF0ZSk7CisgICAgaW50IGZkID0gQ0ZTb2NrZXRHZXROYXRpdmUoc29ja2V0KTsKKyAgICBpbnQgeWVzID0gMTsKKyAgICBzZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICh2b2lkICopJnllcywgc2l6ZW9mKHllcykpOwogCi0gIC8vIG5vdyB0aGF0IHdlIGhhdmUgYSBjbGllbnQgY29ubmVjdGVkLCBzcGluIG9mZiBhIHRocmVhZCB0byBoYW5kbGUgYWN0aXZpdHkKLSAgW05TVGhyZWFkIGRldGFjaE5ld1RocmVhZFNlbGVjdG9yOiBAc2VsZWN0b3IoaGFuZGxlQ2xpZW50Q29ubmVjdGlvbjopCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0b1RhcmdldDogc2VsZgotICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhPYmplY3Q6IHNvY2tldF07Ci0KLSAgW1thTm90aWZpY2F0aW9uIG9iamVjdF0gYWNjZXB0Q29ubmVjdGlvbkluQmFja2dyb3VuZEFuZE5vdGlmeV07Ci19Ci0KLQotLSAodm9pZCkgaGFuZGxlQ2xpZW50Q29ubmVjdGlvbjogKE5TRmlsZUhhbmRsZSAqKSBjbGllbnRTb2NrZXQKLXsKLSNpZiBfX2hhc19mZWF0dXJlKG9iamNfYXJjKQotICAgIEBhdXRvcmVsZWFzZXBvb2wgewotICAgICAgICBUTlNGaWxlSGFuZGxlVHJhbnNwb3J0ICogdHJhbnNwb3J0ID0gW1tUTlNGaWxlSGFuZGxlVHJhbnNwb3J0IGFsbG9jXSBpbml0V2l0aEZpbGVIYW5kbGU6IGNsaWVudFNvY2tldF07Ci0gICAgICAgIGlkPFRQcm9jZXNzb3I+IHByb2Nlc3NvciA9IFttUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGb3JUcmFuc3BvcnQ6IHRyYW5zcG9ydF07Ci0gICAgICAgIAotICAgICAgICBpZCA8VFByb3RvY29sPiBpblByb3RvY29sID0gW21JbnB1dFByb3RvY29sRmFjdG9yeSBuZXdQcm90b2NvbE9uVHJhbnNwb3J0OiB0cmFuc3BvcnRdOwotICAgICAgICBpZCA8VFByb3RvY29sPiBvdXRQcm90b2NvbCA9IFttT3V0cHV0UHJvdG9jb2xGYWN0b3J5IG5ld1Byb3RvY29sT25UcmFuc3BvcnQ6IHRyYW5zcG9ydF07Ci0gICAgICAgIAotICAgICAgICBAdHJ5IHsKLSAgICAgICAgICAgIEJPT0wgcmVzdWx0ID0gTk87Ci0gICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgQGF1dG9yZWxlYXNlcG9vbCB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFtwcm9jZXNzb3IgcHJvY2Vzc09uSW5wdXRQcm90b2NvbDogaW5Qcm90b2NvbCBvdXRwdXRQcm90b2NvbDogb3V0UHJvdG9jb2xdOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gd2hpbGUgKHJlc3VsdCk7Ci0gICAgICAgIH0KLSAgICAgICAgQGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uICogdGUpIHsKLSAgICAgICAgICAgICh2b2lkKXRlOwotICAgICAgICAgICAgLy9OU0xvZyhAIkNhdWdodCB0cmFuc3BvcnQgZXhjZXB0aW9uLCBhYmFuZG9uaW5nIGNsaWVudCBjb25uZWN0aW9uOiAlQCIsIHRlKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgTlNOb3RpZmljYXRpb24gKiBuID0gW05TTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbldpdGhOYW1lOiBrVFNvY2tldFNlcnZlcl9DbGllbnRDb25uZWN0aW9uRmluaXNoZWRGb3JQcm9jZXNzb3JOb3RpZmljYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0OiBzZWxmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzogW05TRGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aE9iamVjdHNBbmRLZXlzOiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVFNvY2tldFNlcnZlcl9Qcm9jZXNzb3JLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1RTb2NrZXJTZXJ2ZXJfVHJhbnNwb3J0S2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaWxdXTsKLSAgICAgICAgW1tOU05vdGlmaWNhdGlvbkNlbnRlciBkZWZhdWx0Q2VudGVyXSBwZXJmb3JtU2VsZWN0b3JPbk1haW5UaHJlYWQ6IEBzZWxlY3Rvcihwb3N0Tm90aWZpY2F0aW9uOikgd2l0aE9iamVjdDogbiB3YWl0VW50aWxEb25lOiBZRVNdOwotICAgICAgICAKKyAgICBzaXplX3QgbnVsbFRlcm1pbmF0ZWRQYXRoTGVuZ3RoID0gcGF0aC5sZW5ndGggKyAxOworICAgIHN0cnVjdCBzb2NrYWRkcl91biBhZGRyOworICAgIGlmIChudWxsVGVybWluYXRlZFBhdGhMZW5ndGg+IHNpemVvZihhZGRyLnN1bl9wYXRoKSkgeworICAgICAgTlNMb2coQCJUU29ja2V0U2VydmVyOiBVbmFibGUgdG8gY3JlYXRlIHNvY2tldCBhdCBwYXRoICVALiBQYXRoIGlzIHRvbyBsb25nLiIsIHBhdGgpOworICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotI2Vsc2UKLSAgTlNBdXRvcmVsZWFzZVBvb2wgKiBwb29sID0gW1tOU0F1dG9yZWxlYXNlUG9vbCBhbGxvY10gaW5pdF07Ci0gIAotICBUTlNGaWxlSGFuZGxlVHJhbnNwb3J0ICogdHJhbnNwb3J0ID0gW1tUTlNGaWxlSGFuZGxlVHJhbnNwb3J0IGFsbG9jXSBpbml0V2l0aEZpbGVIYW5kbGU6IGNsaWVudFNvY2tldF07Ci0gIGlkPFRQcm9jZXNzb3I+IHByb2Nlc3NvciA9IFttUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGb3JUcmFuc3BvcnQ6IHRyYW5zcG9ydF07Ci0gIAotICBpZCA8VFByb3RvY29sPiBpblByb3RvY29sID0gW1ttSW5wdXRQcm90b2NvbEZhY3RvcnkgbmV3UHJvdG9jb2xPblRyYW5zcG9ydDogdHJhbnNwb3J0XSBhdXRvcmVsZWFzZV07Ci0gIGlkIDxUUHJvdG9jb2w+IG91dFByb3RvY29sID0gW1ttT3V0cHV0UHJvdG9jb2xGYWN0b3J5IG5ld1Byb3RvY29sT25UcmFuc3BvcnQ6IHRyYW5zcG9ydF0gYXV0b3JlbGVhc2VdOwogCi0gIEB0cnkgewotICAgIEJPT0wgcmVzdWx0ID0gTk87Ci0gICAgZG8gewotICAgICAgTlNBdXRvcmVsZWFzZVBvb2wgKiBteVBvb2wgPSBbW05TQXV0b3JlbGVhc2VQb29sIGFsbG9jXSBpbml0XTsKLSAgICAgIHJlc3VsdCA9IFtwcm9jZXNzb3IgcHJvY2Vzc09uSW5wdXRQcm90b2NvbDogaW5Qcm90b2NvbCBvdXRwdXRQcm90b2NvbDogb3V0UHJvdG9jb2xdOwotICAgICAgW215UG9vbCByZWxlYXNlXTsKLSAgICB9IHdoaWxlIChyZXN1bHQpOwotICB9Ci0gIEBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiAqIHRlKSB7Ci0gICAgLy9OU0xvZyhAIkNhdWdodCB0cmFuc3BvcnQgZXhjZXB0aW9uLCBhYmFuZG9uaW5nIGNsaWVudCBjb25uZWN0aW9uOiAlQCIsIHRlKTsKLSAgfQorICAgIGFkZHIuc3VuX2ZhbWlseSA9IEFGX0xPQ0FMOworICAgIG1lbWNweShhZGRyLnN1bl9wYXRoLCBwYXRoLlVURjhTdHJpbmcsIG51bGxUZXJtaW5hdGVkUGF0aExlbmd0aCk7CisgICAgYWRkci5zdW5fbGVuID0gU1VOX0xFTigmYWRkcik7CiAKLSAgTlNOb3RpZmljYXRpb24gKiBuID0gW05TTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbldpdGhOYW1lOiBrVFNvY2tldFNlcnZlcl9DbGllbnRDb25uZWN0aW9uRmluaXNoZWRGb3JQcm9jZXNzb3JOb3RpZmljYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0OiBzZWxmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzogW05TRGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aE9iamVjdHNBbmRLZXlzOiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVFNvY2tldFNlcnZlcl9Qcm9jZXNzb3JLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1RTb2NrZXJTZXJ2ZXJfVHJhbnNwb3J0S2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaWxdXTsKLSAgW1tOU05vdGlmaWNhdGlvbkNlbnRlciBkZWZhdWx0Q2VudGVyXSBwZXJmb3JtU2VsZWN0b3JPbk1haW5UaHJlYWQ6IEBzZWxlY3Rvcihwb3N0Tm90aWZpY2F0aW9uOikgd2l0aE9iamVjdDogbiB3YWl0VW50aWxEb25lOiBZRVNdOwotICAKLSAgW3Bvb2wgcmVsZWFzZV07Ci0jZW5kaWYKKyAgICBOU0RhdGEgKmFkZHJlc3MgPSBbTlNEYXRhIGRhdGFXaXRoQnl0ZXM6JmFkZHIgbGVuZ3RoOnNpemVvZihhZGRyKV07CisgICAgaWYgKENGU29ja2V0U2V0QWRkcmVzcyhzb2NrZXQsIChfX2JyaWRnZSBDRkRhdGFSZWYpYWRkcmVzcykgIT0ga0NGU29ja2V0U3VjY2VzcykgeworICAgICAgQ0ZTb2NrZXRJbnZhbGlkYXRlKHNvY2tldCk7CisgICAgICBDRlJlbGVhc2Uoc29ja2V0KTsKKyAgICAgIE5TTG9nKEAiVFNvY2tldFNlcnZlcjogQ291bGQgbm90IGJpbmQgdG8gYWRkcmVzcyIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIHNvY2tldDsKKyAgfSBlbHNlIHsKKyAgICBOU0xvZyhAIlRTb2NrZXRTZXJ2ZXI6IE5vIHNlcnZlciBzb2NrZXQiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCistKHZvaWQpIGRlYWxsb2MKK3sKKyAgW1tOU05vdGlmaWNhdGlvbkNlbnRlciBkZWZhdWx0Q2VudGVyXSByZW1vdmVPYnNlcnZlcjpzZWxmXTsKKworICBpZiAoX2RvbWFpblNvY2tldFBhdGggIT0gbmlsKSB7CisgICAgdW5saW5rKF9kb21haW5Tb2NrZXRQYXRoLlVURjhTdHJpbmcpOworICB9CiB9CiAKIAorLSh2b2lkKSBjb25uZWN0aW9uQWNjZXB0ZWQ6KE5TTm90aWZpY2F0aW9uICopbm90aWZpY2F0aW9uCit7CisgIE5TRmlsZUhhbmRsZSAqc29ja2V0ID0gW25vdGlmaWNhdGlvbi51c2VySW5mbyBvYmplY3RGb3JLZXk6TlNGaWxlSGFuZGxlTm90aWZpY2F0aW9uRmlsZUhhbmRsZUl0ZW1dOworCisgIC8vIE5vdyB0aGF0IHdlIGhhdmUgYSBjbGllbnQgY29ubmVjdGVkLCBoYW5kbGUgcmVxdWVzdCBvbiBxdWV1ZQorICBkaXNwYXRjaF9hc3luYyhfcHJvY2Vzc2luZ1F1ZXVlLCBeeworCisgICAgW3NlbGYgaGFuZGxlQ2xpZW50Q29ubmVjdGlvbjpzb2NrZXRdOworCisgIH0pOworCisgIC8vIENvbnRpbnVlIGFjY2VwdGluZyBjb25uZWN0aW9ucworICBbX3NvY2tldEZpbGVIYW5kbGUgYWNjZXB0Q29ubmVjdGlvbkluQmFja2dyb3VuZEFuZE5vdGlmeV07Cit9CisKKworLSh2b2lkKSBoYW5kbGVDbGllbnRDb25uZWN0aW9uOihOU0ZpbGVIYW5kbGUgKiljbGllbnRTb2NrZXQKK3sKKyAgQGF1dG9yZWxlYXNlcG9vbCB7CisKKyAgICBUTlNGaWxlSGFuZGxlVHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBbW1ROU0ZpbGVIYW5kbGVUcmFuc3BvcnQgYWxsb2NdIGluaXRXaXRoRmlsZUhhbmRsZTpjbGllbnRTb2NrZXRdOworICAgIGlkPFRQcm9jZXNzb3I+IHByb2Nlc3NvciA9IFtfcHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGb3JUcmFuc3BvcnQ6dHJhbnNwb3J0XTsKKworICAgIGlkIDxUUHJvdG9jb2w+IGluUHJvdG9jb2wgPSBbX2lucHV0UHJvdG9jb2xGYWN0b3J5IG5ld1Byb3RvY29sT25UcmFuc3BvcnQ6dHJhbnNwb3J0XTsKKyAgICBpZCA8VFByb3RvY29sPiBvdXRQcm90b2NvbCA9IFtfb3V0cHV0UHJvdG9jb2xGYWN0b3J5IG5ld1Byb3RvY29sT25UcmFuc3BvcnQ6dHJhbnNwb3J0XTsKKworICAgIE5TRXJyb3IgKmVycm9yOworICAgIGlmICghW3Byb2Nlc3NvciBwcm9jZXNzT25JbnB1dFByb3RvY29sOmluUHJvdG9jb2wgb3V0cHV0UHJvdG9jb2w6b3V0UHJvdG9jb2wgZXJyb3I6JmVycm9yXSkgeworICAgICAgLy8gSGFuZGxlIGVycm9yCisgICAgICBOU0xvZyhAIkVycm9yIHByb2Nlc3NpbmcgcmVxdWVzdDogJUAiLCBlcnJvcik7CisgICAgfQorCisgICAgZGlzcGF0Y2hfYXN5bmMoZGlzcGF0Y2hfZ2V0X21haW5fcXVldWUoKSwgXnsKKworICAgICAgW05TTm90aWZpY2F0aW9uQ2VudGVyLmRlZmF1bHRDZW50ZXIgcG9zdE5vdGlmaWNhdGlvbk5hbWU6VFNvY2tldFNlcnZlckNsaWVudENvbm5lY3Rpb25GaW5pc2hlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Q6c2VsZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86QHtUU29ja2V0U2VydmVyUHJvY2Vzc29yS2V5OiBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRTb2NrZXJTZXJ2ZXJUcmFuc3BvcnRLZXk6IHRyYW5zcG9ydH1dOworICAgIH0pOworCisgIH0KK30KIAogQGVuZAotCi0KLQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEFzeW5jVHJhbnNwb3J0LmggYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UQXN5bmNUcmFuc3BvcnQuaAppbmRleCBmNzViNzAxLi5iYWI0ZmJkIDEwMDY0NAotLS0gYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UQXN5bmNUcmFuc3BvcnQuaAorKysgYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UQXN5bmNUcmFuc3BvcnQuaApAQCAtMTgsMTIgKzE4LDI5IEBACiAgKi8KIAogI2ltcG9ydCAiVFRyYW5zcG9ydC5oIgotI2ltcG9ydCAiVEV4Y2VwdGlvbi5oIgogCi10eXBlZGVmIHZvaWQoXlRBc3luY0ZhaWx1cmVCbG9jaykoVEV4Y2VwdGlvbiAqKTsKK05TX0FTU1VNRV9OT05OVUxMX0JFR0lOCisKKworQHByb3RvY29sIFRBc3luY1RyYW5zcG9ydDsKKworCitAcHJvdG9jb2wgVEFzeW5jVHJhbnNwb3J0RmFjdG9yeSA8TlNPYmplY3Q+CisKKy0oaWQ8VEFzeW5jVHJhbnNwb3J0PikgbmV3VHJhbnNwb3J0OworCitAZW5kCisKKwordHlwZWRlZiB2b2lkICheVEFzeW5jQ29tcGxldGlvbkJsb2NrKSgpOwordHlwZWRlZiB2b2lkICheVEFzeW5jRmFpbHVyZUJsb2NrKShOU0Vycm9yICogX19ub25udWxsKTsKKwogCiBAcHJvdG9jb2wgVEFzeW5jVHJhbnNwb3J0IDxUVHJhbnNwb3J0PgogCi0tICh2b2lkKSBmbHVzaDooZGlzcGF0Y2hfYmxvY2tfdClmbHVzaGVkIGZhaWx1cmU6KFRBc3luY0ZhaWx1cmVCbG9jaylmYWlsdXJlOworLSh2b2lkKSBmbHVzaFdpdGhDb21wbGV0aW9uOihUQXN5bmNDb21wbGV0aW9uQmxvY2spY29tcGxldGVkIGZhaWx1cmU6KFRBc3luY0ZhaWx1cmVCbG9jaylmYWlsdXJlOwogCiBAZW5kCisKKworTlNfQVNTVU1FX05PTk5VTExfRU5EClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5oIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5oCmluZGV4IGZjMzg4NzcuLmVhNjhhYzQgMTAwNjQ0Ci0tLSBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQuaAorKysgYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LmgKQEAgLTIwLDEwICsyMCwxNCBAQAogI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+CiAjaW1wb3J0ICJUVHJhbnNwb3J0LmgiCiAKLUBpbnRlcmZhY2UgVEZyYW1lZFRyYW5zcG9ydCA6IE5TT2JqZWN0IDxUVHJhbnNwb3J0PiB7Ci0gICAgaWQgPFRUcmFuc3BvcnQ+IG1UcmFuc3BvcnQ7Ci19CitOU19BU1NVTUVfTk9OTlVMTF9CRUdJTgogCi0tIChpZCkgaW5pdFdpdGhUcmFuc3BvcnQ6IChpZCA8VFRyYW5zcG9ydD4pIHRyYW5zcG9ydDsKKworQGludGVyZmFjZSBURnJhbWVkVHJhbnNwb3J0IDogTlNPYmplY3QgPFRUcmFuc3BvcnQ+CisKKy0oaWQpIGluaXRXaXRoVHJhbnNwb3J0OihpZCA8VFRyYW5zcG9ydD4pdHJhbnNwb3J0OwogCiBAZW5kCisKKworTlNfQVNTVU1FX05PTk5VTExfRU5ECmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0Lm0gYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0Lm0KaW5kZXggMjE0ODgwNi4uNGRiNjVjNCAxMDA2NDQKLS0tIGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5tCisrKyBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQubQpAQCAtMTgsMTI2ICsxOCwxNjMgQEAKICAqLwogCiAjaW1wb3J0ICJURnJhbWVkVHJhbnNwb3J0LmgiCi0jaW1wb3J0ICJUVHJhbnNwb3J0RXhjZXB0aW9uLmgiCi0jaW1wb3J0ICJUT2JqZWN0aXZlLUMuaCIKKyNpbXBvcnQgIlRUcmFuc3BvcnRFcnJvci5oIgogCiAjZGVmaW5lIEhFQURFUl9TSVpFIDQKICNkZWZpbmUgSU5JVF9GUkFNRV9TSVpFIDEwMjQKIAotQGltcGxlbWVudGF0aW9uIFRGcmFtZWRUcmFuc3BvcnQgewotICAgIE5TTXV0YWJsZURhdGEqIHdyaXRlQnVmZmVyOwotICAgIE5TTXV0YWJsZURhdGEqIHJlYWRCdWZmZXI7Ci0gICAgTlNVSW50ZWdlciByZWFkT2Zmc2V0OwotICAgIHVpbnQ4X3QgZHVtbXlfaGVhZGVyW0hFQURFUl9TSVpFXTsKKworQGludGVyZmFjZSBURnJhbWVkVHJhbnNwb3J0ICgpCisKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgaWQ8VFRyYW5zcG9ydD4gdHJhbnNwb3J0OworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBOU011dGFibGVEYXRhICp3cml0ZUJ1ZmZlcjsKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgTlNNdXRhYmxlRGF0YSAqcmVhZEJ1ZmZlcjsKK0Bwcm9wZXJ0eShhc3NpZ24sIG5vbmF0b21pYykgTlNVSW50ZWdlciByZWFkT2Zmc2V0OworCitAZW5kCisKKworQGltcGxlbWVudGF0aW9uIFRGcmFtZWRUcmFuc3BvcnQKKworLShpZCkgaW5pdFdpdGhUcmFuc3BvcnQ6KGlkIDxUVHJhbnNwb3J0PilhVHJhbnNwb3J0Cit7CisgIGlmICgoc2VsZiA9IFtzZWxmIGluaXRdKSkgeworICAgIF90cmFuc3BvcnQgPSBhVHJhbnNwb3J0OworICAgIF9yZWFkQnVmZmVyID0gbmlsOworICAgIF9yZWFkT2Zmc2V0ID0gMDsKKyAgICBfd3JpdGVCdWZmZXIgPSBbTlNNdXRhYmxlRGF0YSBkYXRhV2l0aExlbmd0aDpIRUFERVJfU0laRV07CisgIH0KKyAgcmV0dXJuIHNlbGY7CiB9CiAKLS0gKGlkKSBpbml0V2l0aFRyYW5zcG9ydDooaWQgPFRUcmFuc3BvcnQ+KXRyYW5zcG9ydAorLShCT09MKSBmbHVzaDooTlNFcnJvciAqKillcnJvcgogewotICAgIG1UcmFuc3BvcnQgPSBbdHJhbnNwb3J0IHJldGFpbl9zdHViXTsKLSAgICByZWFkQnVmZmVyID0gbmlsOwotICAgIHJlYWRPZmZzZXQgPSAwOwotICAgIHdyaXRlQnVmZmVyID0gW1tOU011dGFibGVEYXRhIGFsbG9jXSBpbml0V2l0aENhcGFjaXR5OklOSVRfRlJBTUVfU0laRV07Ci0gICAgW3dyaXRlQnVmZmVyIGFwcGVuZEJ5dGVzOmR1bW15X2hlYWRlciBsZW5ndGg6SEVBREVSX1NJWkVdOwotICAgIHJldHVybiBzZWxmOworICBpbnQgbGVuID0gKGludClbX3dyaXRlQnVmZmVyIGxlbmd0aF07CisgIGludCBkYXRhX2xlbiA9IGxlbiAtIEhFQURFUl9TSVpFOworICBpZiAoZGF0YV9sZW4gPCAwKSB7CisgICAgaWYgKGVycm9yKSB7CisgICAgICAqZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFRyYW5zcG9ydEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFRyYW5zcG9ydEVycm9yVW5rbm93bgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOkB7fV07CisgICAgfQorICAgIHJldHVybiBOTzsKKyAgfQorCisgIFVJbnQ4IGkzMnJkW0hFQURFUl9TSVpFXTsKKyAgaTMycmRbMF0gPSAoVUludDgpKDB4ZmYgJiAoZGF0YV9sZW4gPj4gMjQpKTsKKyAgaTMycmRbMV0gPSAoVUludDgpKDB4ZmYgJiAoZGF0YV9sZW4gPj4gMTYpKTsKKyAgaTMycmRbMl0gPSAoVUludDgpKDB4ZmYgJiAoZGF0YV9sZW4gPj4gOCkpOworICBpMzJyZFszXSA9IChVSW50OCkoMHhmZiAmIChkYXRhX2xlbikpOworCisgIC8vIHNob3VsZCB3ZSBtYWtlIGEgY29weSBvZiB0aGUgd3JpdGVCdWZmZXIgaW5zdGVhZD8gQmV0dGVyIGZvciB0aHJlYWRlZAorICAvLyAgb3BlcmF0aW9ucyEKKyAgW193cml0ZUJ1ZmZlciByZXBsYWNlQnl0ZXNJblJhbmdlOk5TTWFrZVJhbmdlKDAsIEhFQURFUl9TSVpFKQorICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoQnl0ZXM6aTMycmQgbGVuZ3RoOkhFQURFUl9TSVpFXTsKKworICBpZiAoIVtfdHJhbnNwb3J0IHdyaXRlOl93cml0ZUJ1ZmZlci5tdXRhYmxlQnl0ZXMgb2Zmc2V0OjAgbGVuZ3RoOmxlbiBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBpZiAoIVtfdHJhbnNwb3J0IGZsdXNoOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIF93cml0ZUJ1ZmZlci5sZW5ndGggPSBIRUFERVJfU0laRTsKKworICByZXR1cm4gWUVTOwogfQogCi0tICh2b2lkKSBkZWFsbG9jCistKEJPT0wpIHdyaXRlOihjb25zdCBVSW50OCAqKWRhdGEgb2Zmc2V0OihVSW50MzIpb2Zmc2V0IGxlbmd0aDooVUludDMyKWxlbmd0aCBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgICBbbVRyYW5zcG9ydCByZWxlYXNlX3N0dWJdOwotICAgIFt3cml0ZUJ1ZmZlciByZWxlYXNlX3N0dWJdOwotICAgIGlmIChyZWFkQnVmZmVyICE9IG5pbCkKLSAgICAgICAgW3JlYWRCdWZmZXIgcmVsZWFzZV9zdHViXTsKLSAgICBbc3VwZXIgZGVhbGxvY19zdHViXTsKKyAgW193cml0ZUJ1ZmZlciBhcHBlbmRCeXRlczpkYXRhK29mZnNldCBsZW5ndGg6bGVuZ3RoXTsKKworICByZXR1cm4gWUVTOwogfQogCi0tICh2b2lkKWZsdXNoCistKEJPT0wpIHJlYWRBbGw6KFVJbnQ4ICopb3V0QnVmZmVyIG9mZnNldDooVUludDMyKW91dEJ1ZmZlck9mZnNldCBsZW5ndGg6KFVJbnQzMilsZW5ndGggZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gICAgc2l6ZV90IGhlYWRlckFuZERhdGFMZW5ndGggPSBbd3JpdGVCdWZmZXIgbGVuZ3RoXTsKLSAgICBpZiAoaGVhZGVyQW5kRGF0YUxlbmd0aCA8IEhFQURFUl9TSVpFKSB7Ci0gICAgICAgIEB0aHJvdyBbVFRyYW5zcG9ydEV4Y2VwdGlvbiBleGNlcHRpb25XaXRoUmVhc29uOkAiRnJhbWVkIHRyYW5zcG9ydCBidWZmZXIgaGFzIG5vIGhlYWRlciJdOworICBVSW50MzIgZ290ID0gW3NlbGYgcmVhZEF2YWlsOm91dEJ1ZmZlciBvZmZzZXQ6b3V0QnVmZmVyT2Zmc2V0IG1heExlbmd0aDpsZW5ndGggZXJyb3I6ZXJyb3JdOworICBpZiAoZ290ICE9IGxlbmd0aCkgeworCisgICAgLy8gUmVwb3J0IHVuZGVyZmxvdyBvbmx5IGlmIHJlYWRBdmFpbCBkaWRuJ3QgcmVwb3J0IGVycm9yIGFscmVhZHkKKyAgICBpZiAoZXJyb3IgJiYgISplcnJvcikgeworICAgICAgKmVycm9yID0gW05TRXJyb3IgZXJyb3JXaXRoRG9tYWluOlRUcmFuc3BvcnRFcnJvckRvbWFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOlRUcmFuc3BvcnRFcnJvckVuZE9mRmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOm5pbF07CiAgICAgfQogCi0gICAgc2l6ZV90IGRhdGFMZW5ndGggPSBoZWFkZXJBbmREYXRhTGVuZ3RoIC0gSEVBREVSX1NJWkU7Ci0gICAgdWludDhfdCBpMzJyZFtIRUFERVJfU0laRV07Ci0gICAgaTMycmRbMF0gPSAodWludDhfdCkoMHhmZiAmIChkYXRhTGVuZ3RoID4+IDI0KSk7Ci0gICAgaTMycmRbMV0gPSAodWludDhfdCkoMHhmZiAmIChkYXRhTGVuZ3RoID4+IDE2KSk7Ci0gICAgaTMycmRbMl0gPSAodWludDhfdCkoMHhmZiAmIChkYXRhTGVuZ3RoID4+IDgpKTsKLSAgICBpMzJyZFszXSA9ICh1aW50OF90KSgweGZmICYgKGRhdGFMZW5ndGgpKTsKKyAgICByZXR1cm4gTk87CisgIH0KIAotICAgIC8vIHNob3VsZCB3ZSBtYWtlIGEgY29weSBvZiB0aGUgd3JpdGVCdWZmZXIgaW5zdGVhZD8gQmV0dGVyIGZvciB0aHJlYWRlZCBvcGVyYXRpb25zIQotICAgIFt3cml0ZUJ1ZmZlciByZXBsYWNlQnl0ZXNJblJhbmdlOk5TTWFrZVJhbmdlKDAsIEhFQURFUl9TSVpFKSB3aXRoQnl0ZXM6aTMycmQgbGVuZ3RoOkhFQURFUl9TSVpFXTsKLSAgICBbbVRyYW5zcG9ydCB3cml0ZTpbd3JpdGVCdWZmZXIgbXV0YWJsZUJ5dGVzXSBvZmZzZXQ6MCBsZW5ndGg6aGVhZGVyQW5kRGF0YUxlbmd0aF07Ci0gICAgW21UcmFuc3BvcnQgZmx1c2hdOwotCi0gICAgLy8gcmV1c2Ugb2xkIG1lbW9yeSBidWZmZXIKLSAgICBbd3JpdGVCdWZmZXIgc2V0TGVuZ3RoOjBdOwotICAgIFt3cml0ZUJ1ZmZlciBhcHBlbmRCeXRlczpkdW1teV9oZWFkZXIgbGVuZ3RoOkhFQURFUl9TSVpFXTsKKyAgcmV0dXJuIFlFUzsKIH0KIAotLSAodm9pZCkgd3JpdGU6IChjb25zdCB1aW50OF90ICopIGRhdGEgb2Zmc2V0OiAoc2l6ZV90KSBvZmZzZXQgbGVuZ3RoOiAoc2l6ZV90KSBsZW5ndGgKKy0oVUludDMyKSByZWFkQXZhaWw6KFVJbnQ4ICopb3V0QnVmZmVyIG9mZnNldDooVUludDMyKW91dEJ1ZmZlck9mZnNldCBtYXhMZW5ndGg6KFVJbnQzMilsZW5ndGggZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gICAgW3dyaXRlQnVmZmVyIGFwcGVuZEJ5dGVzOmRhdGErb2Zmc2V0IGxlbmd0aDpsZW5ndGhdOworICBVSW50MzIgZ290ID0gMDsKKyAgd2hpbGUgKGdvdCA8IGxlbmd0aCkgeworCisgICAgTlNVSW50ZWdlciBhdmFpbCA9IF9yZWFkQnVmZmVyLmxlbmd0aCAtIF9yZWFkT2Zmc2V0OworICAgIGlmIChhdmFpbCA9PSAwKSB7CisgICAgICBpZiAoIVtzZWxmIHJlYWRGcmFtZTplcnJvcl0pIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICBhdmFpbCA9IF9yZWFkQnVmZmVyLmxlbmd0aDsKKyAgICB9CisKKyAgICBOU1JhbmdlIHJhbmdlOworICAgIHJhbmdlLmxvY2F0aW9uID0gX3JlYWRPZmZzZXQ7CisgICAgcmFuZ2UubGVuZ3RoID0gTUlOKGxlbmd0aCAtIGdvdCwgYXZhaWwpOworCisgICAgW19yZWFkQnVmZmVyIGdldEJ5dGVzOm91dEJ1ZmZlcitvdXRCdWZmZXJPZmZzZXQrZ290IHJhbmdlOnJhbmdlXTsKKyAgICBfcmVhZE9mZnNldCArPSByYW5nZS5sZW5ndGg7CisgICAgZ290ICs9IHJhbmdlLmxlbmd0aDsKKyAgfQorCisgIHJldHVybiBnb3Q7CiB9CiAKLS0gKHNpemVfdCkgcmVhZEFsbDogKHVpbnQ4X3QgKikgYnVmIG9mZnNldDogKHNpemVfdCkgb2Zmc2V0IGxlbmd0aDogKHNpemVfdCkgbGVuZ3RoCistKEJPT0wpIHJlYWRGcmFtZTooTlNFcnJvciAqKillcnJvcgogewotICAgIGlmIChyZWFkQnVmZmVyID09IG5pbCkgewotICAgICAgICBbc2VsZiByZWFkRnJhbWVdOwotICAgIH0KLSAgICAKLSAgICBpZiAocmVhZEJ1ZmZlciAhPSBuaWwpIHsKLSAgICAgICAgc2l6ZV90IGJ1ZmZlckxlbmd0aCA9IFtyZWFkQnVmZmVyIGxlbmd0aF07Ci0gICAgICAgIGlmIChidWZmZXJMZW5ndGggLSByZWFkT2Zmc2V0ID49IGxlbmd0aCkgewotICAgICAgICAgICAgW3JlYWRCdWZmZXIgZ2V0Qnl0ZXM6YnVmIHJhbmdlOk5TTWFrZVJhbmdlKHJlYWRPZmZzZXQsbGVuZ3RoKV07IC8vIGNvcHkgZGF0YQotICAgICAgICAgICAgcmVhZE9mZnNldCArPSBsZW5ndGg7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyB2b2lkIHRoZSBwcmV2aW91cyByZWFkQnVmZmVyIGRhdGEgYW5kIHJlcXVlc3QgYSBuZXcgZnJhbWUKLSAgICAgICAgICAgIFtzZWxmIHJlYWRGcmFtZV07Ci0gICAgICAgICAgICBbcmVhZEJ1ZmZlciBnZXRCeXRlczpidWYgcmFuZ2U6TlNNYWtlUmFuZ2UoMCxsZW5ndGgpXTsgLy8gY29weSBkYXRhCi0gICAgICAgICAgICByZWFkT2Zmc2V0ID0gbGVuZ3RoOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBsZW5ndGg7Ci19CisgIFVJbnQ4IGkzMnJkW0hFQURFUl9TSVpFXTsKKyAgaWYgKCFbX3RyYW5zcG9ydCByZWFkQWxsOmkzMnJkIG9mZnNldDowIGxlbmd0aDpIRUFERVJfU0laRSBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KIAotLSAodm9pZClyZWFkRnJhbWUKLXsKLSAgICB1aW50OF90IGkzMnJkW0hFQURFUl9TSVpFXTsKLSAgICBbbVRyYW5zcG9ydCByZWFkQWxsOiBpMzJyZCBvZmZzZXQ6IDAgbGVuZ3RoOiBIRUFERVJfU0laRV07Ci0gICAgaW50MzJfdCBoZWFkZXJWYWx1ZSA9Ci0gICAgICAgICgoaTMycmRbMF0gJiAweGZmKSA8PCAyNCkgfAotICAgICAgICAoKGkzMnJkWzFdICYgMHhmZikgPDwgMTYpIHwKLSAgICAgICAgKChpMzJyZFsyXSAmIDB4ZmYpIDw8ICA4KSB8Ci0gICAgICAgICgoaTMycmRbM10gJiAweGZmKSk7Ci0gICAgaWYgKGhlYWRlclZhbHVlIDwgMCkgewotICAgICAgICBOU1N0cmluZyAqcmVhc29uID0gW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQCJGcmFtZSBoZWFkZXIgcmVwb3J0cyBuZWdhdGl2ZSBmcmFtZSBzaXplOiAlIlBSSWQzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJWYWx1ZV07Ci0gICAgICAgIEB0aHJvdyBbVFRyYW5zcG9ydEV4Y2VwdGlvbiBleGNlcHRpb25XaXRoUmVhc29uOnJlYXNvbl07CisgIFNJbnQzMiBzaXplID0KKyAgICAoKGkzMnJkWzBdICYgMHhmZikgPDwgMjQpIHwKKyAgICAoKGkzMnJkWzFdICYgMHhmZikgPDwgMTYpIHwKKyAgICAoKGkzMnJkWzJdICYgMHhmZikgPDwgIDgpIHwKKyAgICAoKGkzMnJkWzNdICYgMHhmZikpOworCisgIGlmIChfcmVhZEJ1ZmZlciA9PSBuaWwpIHsKKworICAgIF9yZWFkQnVmZmVyID0gW05TTXV0YWJsZURhdGEgZGF0YVdpdGhMZW5ndGg6c2l6ZV07CisKKyAgfQorICBlbHNlIHsKKworICAgIFNJbnQzMiBsZW4gPSAoU0ludDMyKV9yZWFkQnVmZmVyLmxlbmd0aDsKKyAgICBpZiAobGVuID49IHNpemUpIHsKKworICAgICAgX3JlYWRCdWZmZXIubGVuZ3RoID0gc2l6ZTsKKworICAgIH0KKyAgICBlbHNlIHsKKworICAgICAgLy8gaW5jcmVhc2UgbGVuZ3RoIG9mIGRhdGEgYnVmZmVyCisgICAgICBbX3JlYWRCdWZmZXIgaW5jcmVhc2VMZW5ndGhCeTpzaXplLWxlbl07CisKICAgICB9CiAKLSAgICAvKiBDYXN0IHNob3VsZCBiZSBzYWZlOgotICAgICAqIEhhdmUgdmVyaWZpZWQgaGVhZGVyVmFsdWUgbm9uLW5lZ2F0aXZlIGFuZCBvZiBsZXNzZXIgb3IgZXF1YWwgYml0d2lkdGggdG8gc2l6ZV90LiAqLwotICAgIHNpemVfdCBmcmFtZVNpemUgPSAoc2l6ZV90KWhlYWRlclZhbHVlOwotICAgIFtzZWxmIGVuc3VyZVJlYWRCdWZmZXJIYXNMZW5ndGg6ZnJhbWVTaXplXTsKKyAgfQogCi0gICAgW21UcmFuc3BvcnQgcmVhZEFsbDpbcmVhZEJ1ZmZlciBtdXRhYmxlQnl0ZXNdIG9mZnNldDowIGxlbmd0aDpmcmFtZVNpemVdOwotfQorICAvLyBjb3B5IGludG8gaW50ZXJuYWwgbWVtb3J5IGJ1ZmZlcgorICBpZiAoIVtfdHJhbnNwb3J0IHJlYWRBbGw6X3JlYWRCdWZmZXIubXV0YWJsZUJ5dGVzIG9mZnNldDowIGxlbmd0aDpzaXplIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQogCi0tICh2b2lkKWVuc3VyZVJlYWRCdWZmZXJIYXNMZW5ndGg6KHNpemVfdClsZW5ndGgKLXsKLSAgICBpZiAocmVhZEJ1ZmZlciA9PSBuaWwpIHsKLSAgICAgICAgcmVhZEJ1ZmZlciA9IFtbTlNNdXRhYmxlRGF0YSBhbGxvY10gaW5pdFdpdGhMZW5ndGg6bGVuZ3RoXTsKLSAgICB9IGVsc2UgewotICAgICAgICBzaXplX3QgY3VycmVudExlbmd0aCA9IFtyZWFkQnVmZmVyIGxlbmd0aF07Ci0gICAgICAgIEJPT0wgaXNUb29Mb25nID0gKGN1cnJlbnRMZW5ndGggPj0gbGVuZ3RoKTsKLSAgICAgICAgaWYgKGlzVG9vTG9uZykgewotICAgICAgICAgICAgW3JlYWRCdWZmZXIgc2V0TGVuZ3RoOmxlbmd0aF07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzaXplX3QgbGVuZ3RoVG9BZGQgPSBsZW5ndGggLSBjdXJyZW50TGVuZ3RoOwotICAgICAgICAgICAgW3JlYWRCdWZmZXIgaW5jcmVhc2VMZW5ndGhCeTpsZW5ndGhUb0FkZF07Ci0gICAgICAgIH0KLSAgICB9CisgIHJldHVybiBZRVM7CiB9CiAKIEBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RIVFRQQ2xpZW50LmggYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9USFRUUENsaWVudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODkzNWZiLi4wMDAwMDAwCi0tLSBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RIVFRQQ2xpZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgotI2ltcG9ydCAiVFRyYW5zcG9ydC5oIgotCi1AaW50ZXJmYWNlIFRIVFRQQ2xpZW50IDogTlNPYmplY3QgPFRUcmFuc3BvcnQ+IHsKLSAgTlNVUkwgKiBtVVJMOwotICBOU011dGFibGVVUkxSZXF1ZXN0ICogbVJlcXVlc3Q7Ci0gIE5TTXV0YWJsZURhdGEgKiBtUmVxdWVzdERhdGE7Ci0gIE5TRGF0YSAqIG1SZXNwb25zZURhdGE7Ci0gIHNpemVfdCBtUmVzcG9uc2VEYXRhT2Zmc2V0OwotICBOU1N0cmluZyAqIG1Vc2VyQWdlbnQ7Ci0gIGludCBtVGltZW91dDsKLX0KLQotLSAoaWQpIGluaXRXaXRoVVJMOiAoTlNVUkwgKikgYVVSTDsKLQotLSAoaWQpIGluaXRXaXRoVVJMOiAoTlNVUkwgKikgYVVSTAotICAgICAgICAgdXNlckFnZW50OiAoTlNTdHJpbmcgKikgdXNlckFnZW50Ci0gICAgICAgICAgIHRpbWVvdXQ6IChpbnQpIHRpbWVvdXQ7Ci0KLS0gKHZvaWQpIHNldFVSTDogKE5TVVJMICopIGFVUkw7Ci0KLUBlbmQKLQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEhUVFBDbGllbnQubSBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RIVFRQQ2xpZW50Lm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2OTkyN2MuLjAwMDAwMDAKLS0tIGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEhUVFBDbGllbnQubQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbXBvcnQgIlRIVFRQQ2xpZW50LmgiCi0jaW1wb3J0ICJUVHJhbnNwb3J0RXhjZXB0aW9uLmgiCi0jaW1wb3J0ICJUT2JqZWN0aXZlLUMuaCIKLQotQGltcGxlbWVudGF0aW9uIFRIVFRQQ2xpZW50Ci0KLQotLSAodm9pZCkgc2V0dXBSZXF1ZXN0Ci17Ci0gIGlmIChtUmVxdWVzdCAhPSBuaWwpIHsKLSAgICBbbVJlcXVlc3QgcmVsZWFzZV9zdHViXTsKLSAgfQotCi0gIC8vIHNldCB1cCBvdXIgcmVxdWVzdCBvYmplY3QgdGhhdCB3ZSdsbCB1c2UgZm9yIGVhY2ggcmVxdWVzdAotICBtUmVxdWVzdCA9IFtbTlNNdXRhYmxlVVJMUmVxdWVzdCBhbGxvY10gaW5pdFdpdGhVUkw6IG1VUkxdOwotICBbbVJlcXVlc3Qgc2V0SFRUUE1ldGhvZDogQCJQT1NUIl07Ci0gIFttUmVxdWVzdCBzZXRWYWx1ZTogQCJhcHBsaWNhdGlvbi94LXRocmlmdCIgZm9ySFRUUEhlYWRlckZpZWxkOiBAIkNvbnRlbnQtVHlwZSJdOwotICBbbVJlcXVlc3Qgc2V0VmFsdWU6IEAiYXBwbGljYXRpb24veC10aHJpZnQiIGZvckhUVFBIZWFkZXJGaWVsZDogQCJBY2NlcHQiXTsKLQotICBOU1N0cmluZyAqIHVzZXJBZ2VudCA9IG1Vc2VyQWdlbnQ7Ci0gIGlmICghdXNlckFnZW50KSB7Ci0gICAgdXNlckFnZW50ID0gQCJDb2NvYS9USFRUUENsaWVudCI7Ci0gIH0KLSAgW21SZXF1ZXN0IHNldFZhbHVlOiB1c2VyQWdlbnQgZm9ySFRUUEhlYWRlckZpZWxkOiBAIlVzZXItQWdlbnQiXTsKLQotICBbbVJlcXVlc3Qgc2V0Q2FjaGVQb2xpY3k6IE5TVVJMUmVxdWVzdFJlbG9hZElnbm9yaW5nQ2FjaGVEYXRhXTsKLSAgaWYgKG1UaW1lb3V0KSB7Ci0gICAgW21SZXF1ZXN0IHNldFRpbWVvdXRJbnRlcnZhbDogbVRpbWVvdXRdOwotICB9Ci19Ci0KLQotLSAoaWQpIGluaXRXaXRoVVJMOiAoTlNVUkwgKikgYVVSTAotewotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhVUkw6IGFVUkwKLSAgICAgICAgICAgICAgICAgdXNlckFnZW50OiBuaWwKLSAgICAgICAgICAgICAgICAgICB0aW1lb3V0OiAwXTsKLX0KLQotCi0tIChpZCkgaW5pdFdpdGhVUkw6IChOU1VSTCAqKSBhVVJMCi0gICAgICAgICB1c2VyQWdlbnQ6IChOU1N0cmluZyAqKSB1c2VyQWdlbnQKLSAgICAgICAgICAgdGltZW91dDogKGludCkgdGltZW91dAotewotICBzZWxmID0gW3N1cGVyIGluaXRdOwotICBpZiAoIXNlbGYpIHsKLSAgICByZXR1cm4gbmlsOwotICB9Ci0KLSAgbVRpbWVvdXQgPSB0aW1lb3V0OwotICBpZiAodXNlckFnZW50KSB7Ci0gICAgbVVzZXJBZ2VudCA9IFt1c2VyQWdlbnQgcmV0YWluX3N0dWJdOwotICB9Ci0gIG1VUkwgPSBbYVVSTCByZXRhaW5fc3R1Yl07Ci0KLSAgW3NlbGYgc2V0dXBSZXF1ZXN0XTsKLQotICAvLyBjcmVhdGUgb3VyIHJlcXVlc3QgZGF0YSBidWZmZXIKLSAgbVJlcXVlc3REYXRhID0gW1tOU011dGFibGVEYXRhIGFsbG9jXSBpbml0V2l0aENhcGFjaXR5OiAxMDI0XTsKLQotICByZXR1cm4gc2VsZjsKLX0KLQotCi0tICh2b2lkKSBzZXRVUkw6IChOU1VSTCAqKSBhVVJMCi17Ci0gIFthVVJMIHJldGFpbl9zdHViXTsKLSAgW21VUkwgcmVsZWFzZV9zdHViXTsKLSAgbVVSTCA9IGFVUkw7Ci0KLSAgW3NlbGYgc2V0dXBSZXF1ZXN0XTsKLX0KLQotCi0tICh2b2lkKSBkZWFsbG9jCi17Ci0gIFttVVJMIHJlbGVhc2Vfc3R1Yl07Ci0gIFttVXNlckFnZW50IHJlbGVhc2Vfc3R1Yl07Ci0gIFttUmVxdWVzdCByZWxlYXNlX3N0dWJdOwotICBbbVJlcXVlc3REYXRhIHJlbGVhc2Vfc3R1Yl07Ci0gIFttUmVzcG9uc2VEYXRhIHJlbGVhc2Vfc3R1Yl07Ci0gIFtzdXBlciBkZWFsbG9jX3N0dWJdOwotfQotCi0KLS0gKHNpemVfdCkgcmVhZEFsbDogKHVpbnQ4X3QgKikgYnVmIG9mZnNldDogKHNpemVfdCkgb2Zmc2V0IGxlbmd0aDogKHNpemVfdCkgbGVuZ3RoCi17Ci0gIE5TUmFuZ2UgcjsKLSAgci5sb2NhdGlvbiA9IG1SZXNwb25zZURhdGFPZmZzZXQ7Ci0gIHIubGVuZ3RoID0gbGVuZ3RoOwotCi0gIFttUmVzcG9uc2VEYXRhIGdldEJ5dGVzOiBidWYrb2Zmc2V0IHJhbmdlOiByXTsKLSAgbVJlc3BvbnNlRGF0YU9mZnNldCArPSBsZW5ndGg7Ci0KLSAgcmV0dXJuIGxlbmd0aDsKLX0KLQotCi0tICh2b2lkKSB3cml0ZTogKGNvbnN0IHVpbnQ4X3QgKikgZGF0YSBvZmZzZXQ6IChzaXplX3QpIG9mZnNldCBsZW5ndGg6IChzaXplX3QpIGxlbmd0aAotewotICBbbVJlcXVlc3REYXRhIGFwcGVuZEJ5dGVzOiBkYXRhK29mZnNldCBsZW5ndGg6IGxlbmd0aF07Ci19Ci0KLQotLSAodm9pZCkgZmx1c2gKLXsKLSAgW21SZXF1ZXN0IHNldEhUVFBCb2R5OiBtUmVxdWVzdERhdGFdOyAvLyBub3Qgc3VyZSBpZiBpdCBjb3BpZXMgdGhlIGRhdGEKLQotICAvLyBtYWtlIHRoZSBIVFRQIHJlcXVlc3QKLSAgTlNVUkxSZXNwb25zZSAqIHJlc3BvbnNlOwotICBOU0Vycm9yICogZXJyb3I7Ci0gIE5TRGF0YSAqIHJlc3BvbnNlRGF0YSA9Ci0gICAgW05TVVJMQ29ubmVjdGlvbiBzZW5kU3luY2hyb25vdXNSZXF1ZXN0OiBtUmVxdWVzdCByZXR1cm5pbmdSZXNwb25zZTogJnJlc3BvbnNlIGVycm9yOiAmZXJyb3JdOwotCi0gIFttUmVxdWVzdERhdGEgc2V0TGVuZ3RoOiAwXTsKLQotICBpZiAocmVzcG9uc2VEYXRhID09IG5pbCkgewotICAgIEB0aHJvdyBbVFRyYW5zcG9ydEV4Y2VwdGlvbiBleGNlcHRpb25XaXRoTmFtZTogQCJUVHJhbnNwb3J0RXhjZXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IEAiQ291bGQgbm90IG1ha2UgSFRUUCByZXF1ZXN0IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3JdOwotICB9Ci0gIGlmICghW3Jlc3BvbnNlIGlzS2luZE9mQ2xhc3M6IFtOU0hUVFBVUkxSZXNwb25zZSBjbGFzc11dKSB7Ci0gICAgQHRocm93IFtUVHJhbnNwb3J0RXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhOYW1lOiBAIlRUcmFuc3BvcnRFeGNlcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDogQCJVbmV4cGVjdGVkIE5TVVJMUmVzcG9uc2UgdHlwZTogJUAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TU3RyaW5nRnJvbUNsYXNzKFtyZXNwb25zZSBjbGFzc10pXV07Ci0gIH0KLQotICBOU0hUVFBVUkxSZXNwb25zZSAqIGh0dHBSZXNwb25zZSA9IChOU0hUVFBVUkxSZXNwb25zZSAqKSByZXNwb25zZTsKLSAgaWYgKFtodHRwUmVzcG9uc2Ugc3RhdHVzQ29kZV0gIT0gMjAwKSB7Ci0gICAgQHRocm93IFtUVHJhbnNwb3J0RXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhOYW1lOiBAIlRUcmFuc3BvcnRFeGNlcHRpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDogQCJCYWQgcmVzcG9uc2UgZnJvbSBIVFRQIHNlcnZlcjogJWxkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZylbaHR0cFJlc3BvbnNlIHN0YXR1c0NvZGVdXV07Ci0gIH0KLQotICAvLyBwaGV3IQotICBbbVJlc3BvbnNlRGF0YSByZWxlYXNlX3N0dWJdOwotICBtUmVzcG9uc2VEYXRhID0gW3Jlc3BvbnNlRGF0YSByZXRhaW5fc3R1Yl07Ci0gIG1SZXNwb25zZURhdGFPZmZzZXQgPSAwOwotfQotCi0KLUBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RIVFRQU2Vzc2lvblRyYW5zcG9ydC5oIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEhUVFBTZXNzaW9uVHJhbnNwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAzNDk5YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RIVFRQU2Vzc2lvblRyYW5zcG9ydC5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+CisjaW1wb3J0ICJUQXN5bmNUcmFuc3BvcnQuaCIKKworTlNfQVNTVU1FX05PTk5VTExfQkVHSU4KKworCit0eXBlZGVmIE5TRXJyb3IgKl9fbnVsbGFibGUgKF5USFRUUFNlc3Npb25UcmFuc3BvcnRSZXNwb25zZVZhbGlkYXRlQmxvY2spIChOU0hUVFBVUkxSZXNwb25zZSAqcmVzcG9uc2UsIE5TRGF0YSAqcmVzcG9uc2VEYXRhKTsKKworCitAaW50ZXJmYWNlIFRIVFRQU2Vzc2lvblRyYW5zcG9ydEZhY3RvcnkgOiBOU09iamVjdDxUQXN5bmNUcmFuc3BvcnRGYWN0b3J5PgorCitAcHJvcGVydHkgKHN0cm9uZywgbm9uYXRvbWljKSBUSFRUUFNlc3Npb25UcmFuc3BvcnRSZXNwb25zZVZhbGlkYXRlQmxvY2sgcmVzcG9uc2VWYWxpZGF0ZTsKKworKyh2b2lkKSBzZXR1cERlZmF1bHRzRm9yU2Vzc2lvbkNvbmZpZ3VyYXRpb246KE5TVVJMU2Vzc2lvbkNvbmZpZ3VyYXRpb24gKiljb25maWcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoUHJvdG9jb2xOYW1lOihOU1N0cmluZyAqKXByb3RvY29sTmFtZTsKKworLShpZCkgaW5pdFdpdGhTZXNzaW9uOihOU1VSTFNlc3Npb24gKilzZXNzaW9uCisgICAgICAgICAgICAgICAgICBVUkw6KE5TVVJMICopYVVSTDsKKworQGVuZAorCisKK0BpbnRlcmZhY2UgVEhUVFBTZXNzaW9uVHJhbnNwb3J0IDogTlNPYmplY3QgPFRBc3luY1RyYW5zcG9ydD4KKworQGVuZAorCisKK05TX0FTU1VNRV9OT05OVUxMX0VORApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEhUVFBTZXNzaW9uVHJhbnNwb3J0Lm0gYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9USFRUUFNlc3Npb25UcmFuc3BvcnQubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTBiN2ZjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEhUVFBTZXNzaW9uVHJhbnNwb3J0Lm0KQEAgLTAsMCArMSwyNjggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCAiVEhUVFBTZXNzaW9uVHJhbnNwb3J0LmgiCisjaW1wb3J0ICJUVHJhbnNwb3J0RXJyb3IuaCIKKworCitAaW50ZXJmYWNlIFRIVFRQU2Vzc2lvblRyYW5zcG9ydEZhY3RvcnkgKCkKKworQHByb3BlcnR5IChzdHJvbmcsIG5vbmF0b21pYykgTlNVUkxTZXNzaW9uICpzZXNzaW9uOworQHByb3BlcnR5IChzdHJvbmcsIG5vbmF0b21pYykgTlNVUkwgKnVybDsKKworQGVuZAorCisKK0BpbnRlcmZhY2UgVEhUVFBTZXNzaW9uVHJhbnNwb3J0ICgpCisKK0Bwcm9wZXJ0eSAoc3Ryb25nLCBub25hdG9taWMpIFRIVFRQU2Vzc2lvblRyYW5zcG9ydEZhY3RvcnkgKmZhY3Rvcnk7CitAcHJvcGVydHkgKHN0cm9uZywgbm9uYXRvbWljKSBOU011dGFibGVEYXRhICpyZXF1ZXN0RGF0YTsKK0Bwcm9wZXJ0eSAoc3Ryb25nLCBub25hdG9taWMpIE5TRGF0YSAqcmVzcG9uc2VEYXRhOworQHByb3BlcnR5IChhc3NpZ24sIG5vbmF0b21pYykgTlNVSW50ZWdlciByZXNwb25zZURhdGFPZmZzZXQ7CisKKy0oaW5zdGFuY2V0eXBlKSBpbml0V2l0aEZhY3Rvcnk6KFRIVFRQU2Vzc2lvblRyYW5zcG9ydEZhY3RvcnkgKilmYWN0b3J5OworCitAZW5kCisKKworQGltcGxlbWVudGF0aW9uIFRIVFRQU2Vzc2lvblRyYW5zcG9ydEZhY3RvcnkKKworKyh2b2lkKSBzZXR1cERlZmF1bHRzRm9yU2Vzc2lvbkNvbmZpZ3VyYXRpb246KE5TVVJMU2Vzc2lvbkNvbmZpZ3VyYXRpb24gKiljb25maWcgd2l0aFByb3RvY29sTmFtZTooTlNTdHJpbmcgKilwcm90b2NvbE5hbWUKK3sKKyAgTlNTdHJpbmcgKnRocmlmdENvbnRlbnRUeXBlID0gQCJhcHBsaWNhdGlvbi94LXRocmlmdCI7CisgIGlmIChwcm90b2NvbE5hbWUubGVuZ3RoKSB7CisgICAgdGhyaWZ0Q29udGVudFR5cGUgPSBbdGhyaWZ0Q29udGVudFR5cGUgc3RyaW5nQnlBcHBlbmRpbmdGb3JtYXQ6QCI7IHA9JUAiLCBwcm90b2NvbE5hbWVdOworICB9CisKKyAgY29uZmlnLnJlcXVlc3RDYWNoZVBvbGljeSA9IE5TVVJMUmVxdWVzdFJlbG9hZElnbm9yaW5nQ2FjaGVEYXRhOworICBjb25maWcuSFRUUFNob3VsZFVzZVBpcGVsaW5pbmcgPSBZRVM7CisgIGNvbmZpZy5IVFRQU2hvdWxkU2V0Q29va2llcyA9IE5POworICBjb25maWcuVVJMQ2FjaGUgPSBuaWw7CisgIGNvbmZpZy5IVFRQQWRkaXRpb25hbEhlYWRlcnMgPSBAe0AiQ29udGVudC1UeXBlIjp0aHJpZnRDb250ZW50VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCJBY2NlcHQiOnRocmlmdENvbnRlbnRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIlVzZXItQWdlbnQiOkAiVGhyaWZ0L0NvY29hIChTZXNzaW9uKSJ9OworfQorCisKKy0oaWQpIGluaXRXaXRoU2Vzc2lvbjooTlNVUkxTZXNzaW9uICopc2Vzc2lvbiBVUkw6KE5TVVJMICopdXJsCit7CisgIHNlbGYgPSBbc3VwZXIgaW5pdF07CisgIGlmIChzZWxmKSB7CisgICAgX3Nlc3Npb24gPSBzZXNzaW9uOworICAgIF91cmwgPSB1cmw7CisgIH0KKworICByZXR1cm4gc2VsZjsKK30KKworLShpZDxUQXN5bmNUcmFuc3BvcnQ+KSBuZXdUcmFuc3BvcnQKK3sKKyAgcmV0dXJuIFtbVEhUVFBTZXNzaW9uVHJhbnNwb3J0IGFsbG9jXSBpbml0V2l0aEZhY3Rvcnk6c2VsZl07Cit9CisKKy0oTlNVUkxTZXNzaW9uRGF0YVRhc2sgKikgdGFza1dpdGhSZXF1ZXN0OihOU1VSTFJlcXVlc3QgKilyZXF1ZXN0CisgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uSGFuZGxlcjoodm9pZCAoXikoTlNEYXRhICpkYXRhLCBOU1VSTFJlc3BvbnNlICpyZXNwb25zZSwgTlNFcnJvciAqZXJyb3IpKWNvbXBsZXRpb25IYW5kbGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgTlNVUkxTZXNzaW9uRGF0YVRhc2sgKm5ld1Rhc2sgPSBbX3Nlc3Npb24gZGF0YVRhc2tXaXRoUmVxdWVzdDpyZXF1ZXN0IGNvbXBsZXRpb25IYW5kbGVyOmNvbXBsZXRpb25IYW5kbGVyXTsKKyAgaWYgKCFuZXdUYXNrKSB7CisgICAgaWYgKGVycm9yKSB7CisgICAgICAqZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFRyYW5zcG9ydEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFRyYW5zcG9ydEVycm9yVW5rbm93bgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOkB7TlNMb2NhbGl6ZWREZXNjcmlwdGlvbktleTpAIkZhaWxlZCB0byBjcmVhdGUgc2Vzc2lvbiBkYXRhIHRhc2sifV07CisgICAgfQorICAgIHJldHVybiBuaWw7CisgIH0KKworICByZXR1cm4gbmV3VGFzazsKK30KKworLShOU0Vycm9yICopIHZhbGlkYXRlUmVzcG9uc2U6KE5TSFRUUFVSTFJlc3BvbnNlICopcmVzcG9uc2UgZGF0YTooTlNEYXRhICopZGF0YQoreworICBpZiAoX3Jlc3BvbnNlVmFsaWRhdGUpIHsKKyAgICByZXR1cm4gX3Jlc3BvbnNlVmFsaWRhdGUocmVzcG9uc2UsIGRhdGEpOworICB9CisgIHJldHVybiBuaWw7Cit9CisKK0BlbmQKKworCisKK0BpbXBsZW1lbnRhdGlvbiBUSFRUUFNlc3Npb25UcmFuc3BvcnQKKworLShpbnN0YW5jZXR5cGUpIGluaXRXaXRoRmFjdG9yeTooVEhUVFBTZXNzaW9uVHJhbnNwb3J0RmFjdG9yeSAqKWZhY3RvcnkKK3sKKyAgc2VsZiA9IFtzdXBlciBpbml0XTsKKyAgaWYgKHNlbGYpIHsKKyAgICBfZmFjdG9yeSA9IGZhY3Rvcnk7CisgIH0KKyAgcmV0dXJuIHNlbGY7Cit9CisKKy0oQk9PTCkgcmVhZEFsbDooVUludDggKilvdXRCdWZmZXIgb2Zmc2V0OihVSW50MzIpb3V0QnVmZmVyT2Zmc2V0IGxlbmd0aDooVUludDMyKWxlbmd0aCBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDMyIGdvdCA9IFtzZWxmIHJlYWRBdmFpbDpvdXRCdWZmZXIgb2Zmc2V0Om91dEJ1ZmZlck9mZnNldCBtYXhMZW5ndGg6bGVuZ3RoIGVycm9yOmVycm9yXTsKKyAgaWYgKGdvdCAhPSBsZW5ndGgpIHsKKworICAgIC8vIFJlcG9ydCB1bmRlcmZsb3cgb25seSBpZiByZWFkQXZhaWwgZGlkbid0IHJlcG9ydCBlcnJvciBhbHJlYWR5CisgICAgaWYgKGVycm9yICYmICEqZXJyb3IpIHsKKyAgICAgICplcnJvciA9IFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjpUVHJhbnNwb3J0RXJyb3JEb21haW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTpUVHJhbnNwb3J0RXJyb3JFbmRPZkZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzpuaWxdOworICAgIH0KKworICAgIHJldHVybiBOTzsKKyAgfQorCisgIHJldHVybiBZRVM7Cit9CisKKy0oVUludDMyKSByZWFkQXZhaWw6KFVJbnQ4ICopb3V0QnVmZmVyIG9mZnNldDooVUludDMyKW91dEJ1ZmZlck9mZnNldCBtYXhMZW5ndGg6KFVJbnQzMiltYXhMZW5ndGggZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIE5TVUludGVnZXIgYXZhaWwgPSBfcmVzcG9uc2VEYXRhLmxlbmd0aCAtIF9yZXNwb25zZURhdGFPZmZzZXQ7CisKKyAgTlNSYW5nZSByYW5nZTsKKyAgcmFuZ2UubG9jYXRpb24gPSBfcmVzcG9uc2VEYXRhT2Zmc2V0OworICByYW5nZS5sZW5ndGggPSBNSU4obWF4TGVuZ3RoLCBhdmFpbCk7CisKKyAgW19yZXNwb25zZURhdGEgZ2V0Qnl0ZXM6b3V0QnVmZmVyK291dEJ1ZmZlck9mZnNldCByYW5nZTpyYW5nZV07CisgIF9yZXNwb25zZURhdGFPZmZzZXQgKz0gcmFuZ2UubGVuZ3RoOworCisgIHJldHVybiAoVUludDMyKXJhbmdlLmxlbmd0aDsKK30KKworLShCT09MKSB3cml0ZTooY29uc3QgVUludDggKilkYXRhIG9mZnNldDooVUludDMyKW9mZnNldCBsZW5ndGg6KFVJbnQzMilsZW5ndGggZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIGlmICghX3JlcXVlc3REYXRhKSB7CisgICAgX3JlcXVlc3REYXRhID0gW05TTXV0YWJsZURhdGEgZGF0YVdpdGhDYXBhY2l0eToyNTZdOworICB9CisKKyAgW19yZXF1ZXN0RGF0YSBhcHBlbmRCeXRlczpkYXRhK29mZnNldCBsZW5ndGg6bGVuZ3RoXTsKKworICByZXR1cm4gWUVTOworfQorCistKHZvaWQpIGZsdXNoV2l0aENvbXBsZXRpb246KFRBc3luY0NvbXBsZXRpb25CbG9jayljb21wbGV0ZWQgZmFpbHVyZTooVEFzeW5jRmFpbHVyZUJsb2NrKWZhaWx1cmUKK3sKKyAgTlNFcnJvciAqZXJyb3I7CisKKyAgTlNNdXRhYmxlVVJMUmVxdWVzdCAqcmVxdWVzdCA9IFtbTlNNdXRhYmxlVVJMUmVxdWVzdCBhbGxvY10gaW5pdFdpdGhVUkw6X2ZhY3RvcnkudXJsXTsKKyAgcmVxdWVzdC5IVFRQTWV0aG9kID0gQCJQT1NUIjsKKyAgcmVxdWVzdC5IVFRQQm9keSA9IF9yZXF1ZXN0RGF0YTsKKworICBfcmVxdWVzdERhdGEgPSBuaWw7CisKKyAgTlNVUkxTZXNzaW9uRGF0YVRhc2sgKnRhc2sgPSBbX2ZhY3RvcnkgdGFza1dpdGhSZXF1ZXN0OnJlcXVlc3QgY29tcGxldGlvbkhhbmRsZXI6XihOU0RhdGEgKmRhdGEsIE5TVVJMUmVzcG9uc2UgKnJlc3BvbnNlLCBOU0Vycm9yICplcnJvcikgeworCisgICAgLy8gQ2hlY2sgcmVzcG9uc2UgdHlwZQorICAgIGlmICghZXJyb3IgJiYgIVtyZXNwb25zZSBpc0tpbmRPZkNsYXNzOk5TSFRUUFVSTFJlc3BvbnNlLmNsYXNzXSkgeworCisgICAgICBlcnJvciA9IFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjpUVHJhbnNwb3J0RXJyb3JEb21haW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTpUVHJhbnNwb3J0RXJyb3JVbmtub3duCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86QHtUVHJhbnNwb3J0RXJyb3JIdHRwRXJyb3JLZXk6IEAoVEh0dHBUcmFuc3BvcnRFcnJvckludmFsaWRSZXNwb25zZSl9XTsKKworICAgIH0KKworICAgIC8vIENoZWNrIHN0YXR1cyBjb2RlCisgICAgTlNIVFRQVVJMUmVzcG9uc2UgKmh0dHBSZXNwb25zZSA9IChpZClyZXNwb25zZTsKKyAgICBpZiAoIWVycm9yICYmIGh0dHBSZXNwb25zZS5zdGF0dXNDb2RlICE9IDIwMCkgeworCisgICAgICBUSHR0cFRyYW5zcG9ydEVycm9yIGNvZGU7CisgICAgICBpZiAoaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGUgPT0gNDAxKSB7CisgICAgICAgIGNvZGUgPSBUSHR0cFRyYW5zcG9ydEVycm9yQXV0aGVudGljYXRpb247CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgY29kZSA9IFRIdHRwVHJhbnNwb3J0RXJyb3JJbnZhbGlkU3RhdHVzOworICAgICAgfQorCisgICAgICBlcnJvciA9IFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjpUVHJhbnNwb3J0RXJyb3JEb21haW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOlRUcmFuc3BvcnRFcnJvclVua25vd24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOkB7VFRyYW5zcG9ydEVycm9ySHR0cEVycm9yS2V5OiBAKGNvZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAInN0YXR1c0NvZGUiOkAoaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGUpfV07CisgICAgfQorCisgICAgLy8gQWxsb3cgZmFjdG9yeSB0byBjaGVjaworICAgIGlmICghZXJyb3IpIHsKKyAgICAgIGVycm9yID0gW19mYWN0b3J5IHZhbGlkYXRlUmVzcG9uc2U6aHR0cFJlc3BvbnNlIGRhdGE6ZGF0YV07CisgICAgfQorCisgICAgX3Jlc3BvbnNlRGF0YU9mZnNldCA9IDA7CisKKyAgICBpZiAoZXJyb3IpIHsKKworICAgICAgX3Jlc3BvbnNlRGF0YSA9IG5pbDsKKworICAgICAgZmFpbHVyZShlcnJvcik7CisKKyAgICB9CisgICAgZWxzZSB7CisKKyAgICAgIGlmIChkYXRhID09IG5pbCkgeworICAgICAgICBkYXRhID0gW05TRGF0YSBkYXRhXTsKKyAgICAgIH0KKworICAgICAgX3Jlc3BvbnNlRGF0YSA9IGRhdGE7CisKKyAgICAgIGNvbXBsZXRlZChzZWxmKTsKKyAgICB9CisKKyAgfSBlcnJvcjomZXJyb3JdOworCisgIGlmICghdGFzaykgeworICAgIGZhaWx1cmUoZXJyb3IpOworICAgIHJldHVybjsKKyAgfQorCisgIFt0YXNrIHJlc3VtZV07Cit9CisKKy0oQk9PTCkgZmx1c2g6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIGRpc3BhdGNoX3NlbWFwaG9yZV90IGNvbXBsZXRlZCA9IGRpc3BhdGNoX3NlbWFwaG9yZV9jcmVhdGUoMCk7CisKKyAgX19ibG9jayBCT09MIHJlc3VsdDsKKyAgX19ibG9jayBOU0Vycm9yICppbnRlcm5hbEVycm9yOworCisgIFtzZWxmIGZsdXNoV2l0aENvbXBsZXRpb246XihpZCA8IFRBc3luY1RyYW5zcG9ydCA+IHRyYW5zcG9ydCkgeworCisgICAgcmVzdWx0ID0gWUVTOworCisgICAgZGlzcGF0Y2hfc2VtYXBob3JlX3NpZ25hbChjb21wbGV0ZWQpOworCisgIH0gZmFpbHVyZTpeKE5TRXJyb3IgKmVycm9yKSB7CisKKyAgICBpbnRlcm5hbEVycm9yID0gZXJyb3I7CisKKyAgICByZXN1bHQgPSBOTzsKKworICAgIGRpc3BhdGNoX3NlbWFwaG9yZV9zaWduYWwoY29tcGxldGVkKTsKKworICB9XTsKKworICBkaXNwYXRjaF9zZW1hcGhvcmVfd2FpdChjb21wbGV0ZWQsIERJU1BBVENIX1RJTUVfRk9SRVZFUik7CisKKyAgaWYgKGVycm9yKSB7CisgICAgKmVycm9yID0gaW50ZXJuYWxFcnJvcjsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKK0BlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RIVFRQVHJhbnNwb3J0LmggYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9USFRUUFRyYW5zcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMzVkYWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9USFRUUFRyYW5zcG9ydC5oCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+CisjaW1wb3J0ICJUVHJhbnNwb3J0LmgiCisKK05TX0FTU1VNRV9OT05OVUxMX0JFR0lOCisKKworQGludGVyZmFjZSBUSFRUUFRyYW5zcG9ydCA6IE5TT2JqZWN0IDxUVHJhbnNwb3J0PgorCistKGlkKSBpbml0V2l0aFVSTDooTlNVUkwgKilhVVJMOworCistKGlkKSBpbml0V2l0aFVSTDooTlNVUkwgKilhVVJMCisgICAgICAgIHVzZXJBZ2VudDoobnVsbGFibGUgTlNTdHJpbmcgKil1c2VyQWdlbnQKKyAgICAgICAgICB0aW1lb3V0OihpbnQpdGltZW91dDsKKworLSh2b2lkKSBzZXRVUkw6KE5TVVJMICopYVVSTDsKKworQGVuZAorCisKK05TX0FTU1VNRV9OT05OVUxMX0VORApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEhUVFBUcmFuc3BvcnQubSBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RIVFRQVHJhbnNwb3J0Lm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQwNDZjNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RIVFRQVHJhbnNwb3J0Lm0KQEAgLTAsMCArMSwxODIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCAiVEhUVFBUcmFuc3BvcnQuaCIKKyNpbXBvcnQgIlRUcmFuc3BvcnRFcnJvci5oIgorCisKK0BpbnRlcmZhY2UgVEhUVFBUcmFuc3BvcnQgKCkKKworQHByb3BlcnR5IChzdHJvbmcsIG5vbmF0b21pYykgTlNVUkwgKnVybDsKK0Bwcm9wZXJ0eSAoc3Ryb25nLCBub25hdG9taWMpIE5TTXV0YWJsZVVSTFJlcXVlc3QgKnJlcXVlc3Q7CitAcHJvcGVydHkgKHN0cm9uZywgbm9uYXRvbWljKSBOU011dGFibGVEYXRhICpyZXF1ZXN0RGF0YTsKK0Bwcm9wZXJ0eSAoc3Ryb25nLCBub25hdG9taWMpIE5TRGF0YSAqcmVzcG9uc2VEYXRhOworQHByb3BlcnR5IChhc3NpZ24sIG5vbmF0b21pYykgTlNVSW50ZWdlciByZXNwb25zZURhdGFPZmZzZXQ7CitAcHJvcGVydHkgKHN0cm9uZywgbm9uYXRvbWljKSBOU1N0cmluZyAqdXNlckFnZW50OworQHByb3BlcnR5IChhc3NpZ24sIG5vbmF0b21pYykgTlNUaW1lSW50ZXJ2YWwgdGltZW91dDsKKworQGVuZAorCisKK0BpbXBsZW1lbnRhdGlvbiBUSFRUUFRyYW5zcG9ydAorCistKHZvaWQpIHNldHVwUmVxdWVzdAoreworICAvLyBzZXQgdXAgb3VyIHJlcXVlc3Qgb2JqZWN0IHRoYXQgd2UnbGwgdXNlIGZvciBlYWNoIHJlcXVlc3QKKyAgX3JlcXVlc3QgPSBbW05TTXV0YWJsZVVSTFJlcXVlc3QgYWxsb2NdIGluaXRXaXRoVVJMOl91cmxdOworICBbX3JlcXVlc3Qgc2V0SFRUUE1ldGhvZDpAIlBPU1QiXTsKKyAgW19yZXF1ZXN0IHNldFZhbHVlOkAiYXBwbGljYXRpb24veC10aHJpZnQiIGZvckhUVFBIZWFkZXJGaWVsZDpAIkNvbnRlbnQtVHlwZSJdOworICBbX3JlcXVlc3Qgc2V0VmFsdWU6QCJhcHBsaWNhdGlvbi94LXRocmlmdCIgZm9ySFRUUEhlYWRlckZpZWxkOkAiQWNjZXB0Il07CisKKyAgTlNTdHJpbmcgKnVzZXJBZ2VudCA9IF91c2VyQWdlbnQ7CisgIGlmICghdXNlckFnZW50KSB7CisgICAgdXNlckFnZW50ID0gQCJUaHJpZnQvQ29jb2EiOworICB9CisgIFtfcmVxdWVzdCBzZXRWYWx1ZTp1c2VyQWdlbnQgZm9ySFRUUEhlYWRlckZpZWxkOkAiVXNlci1BZ2VudCJdOworCisgIFtfcmVxdWVzdCBzZXRDYWNoZVBvbGljeTpOU1VSTFJlcXVlc3RSZWxvYWRJZ25vcmluZ0NhY2hlRGF0YV07CisgIGlmIChfdGltZW91dCkgeworICAgIFtfcmVxdWVzdCBzZXRUaW1lb3V0SW50ZXJ2YWw6X3RpbWVvdXRdOworICB9Cit9CisKKworLShpZCkgaW5pdFdpdGhVUkw6KE5TVVJMICopYVVSTAoreworICByZXR1cm4gW3NlbGYgaW5pdFdpdGhVUkw6YVVSTAorICAgICAgICAgICAgICAgICB1c2VyQWdlbnQ6bmlsCisgICAgICAgICAgICAgICAgICAgdGltZW91dDowXTsKK30KKworCistKGlkKSBpbml0V2l0aFVSTDooTlNVUkwgKilhVVJMCisgICAgICAgIHVzZXJBZ2VudDooTlNTdHJpbmcgKilhVXNlckFnZW50CisgICAgICAgICAgdGltZW91dDooaW50KWFUaW1lb3V0Cit7CisgIHNlbGYgPSBbc3VwZXIgaW5pdF07CisgIGlmICghc2VsZikgeworICAgIHJldHVybiBuaWw7CisgIH0KKworICBfdGltZW91dCA9IGFUaW1lb3V0OworICBfdXNlckFnZW50ID0gYVVzZXJBZ2VudDsKKyAgX3VybCA9IGFVUkw7CisKKyAgW3NlbGYgc2V0dXBSZXF1ZXN0XTsKKworICAvLyBjcmVhdGUgb3VyIHJlcXVlc3QgZGF0YSBidWZmZXIKKyAgX3JlcXVlc3REYXRhID0gW1tOU011dGFibGVEYXRhIGFsbG9jXSBpbml0V2l0aENhcGFjaXR5OjEwMjRdOworCisgIHJldHVybiBzZWxmOworfQorCistKHZvaWQpIHNldFVSTDooTlNVUkwgKilhVVJMCit7CisgIF91cmwgPSBhVVJMOworCisgIFtzZWxmIHNldHVwUmVxdWVzdF07Cit9CisKKy0oQk9PTCkgcmVhZEFsbDooVUludDggKilvdXRCdWZmZXIgb2Zmc2V0OihVSW50MzIpb3V0QnVmZmVyT2Zmc2V0IGxlbmd0aDooVUludDMyKWxlbmd0aCBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDMyIGdvdCA9IFtzZWxmIHJlYWRBdmFpbDpvdXRCdWZmZXIgb2Zmc2V0Om91dEJ1ZmZlck9mZnNldCBtYXhMZW5ndGg6bGVuZ3RoIGVycm9yOmVycm9yXTsKKyAgaWYgKGdvdCAhPSBsZW5ndGgpIHsKKworICAgIC8vIFJlcG9ydCB1bmRlcmZsb3cgb25seSBpZiByZWFkQXZhaWwgZGlkbid0IHJlcG9ydCBlcnJvciBhbHJlYWR5CisgICAgaWYgKGVycm9yICYmICEqZXJyb3IpIHsKKyAgICAgICplcnJvciA9IFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjpUVHJhbnNwb3J0RXJyb3JEb21haW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTpUVHJhbnNwb3J0RXJyb3JFbmRPZkZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzpuaWxdOworICAgIH0KKworICAgIHJldHVybiBOTzsKKyAgfQorCisgIHJldHVybiBZRVM7Cit9CisKKy0oVUludDMyKSByZWFkQXZhaWw6KFVJbnQ4ICopb3V0QnVmZmVyIG9mZnNldDooVUludDMyKW91dEJ1ZmZlck9mZnNldCBtYXhMZW5ndGg6KFVJbnQzMiltYXhMZW5ndGggZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIE5TVUludGVnZXIgYXZhaWwgPSBfcmVzcG9uc2VEYXRhLmxlbmd0aCAtIF9yZXNwb25zZURhdGFPZmZzZXQ7CisKKyAgTlNSYW5nZSByYW5nZTsKKyAgcmFuZ2UubG9jYXRpb24gPSBfcmVzcG9uc2VEYXRhT2Zmc2V0OworICByYW5nZS5sZW5ndGggPSBNSU4obWF4TGVuZ3RoLCBhdmFpbCk7CisKKyAgW19yZXNwb25zZURhdGEgZ2V0Qnl0ZXM6b3V0QnVmZmVyK291dEJ1ZmZlck9mZnNldCByYW5nZTpyYW5nZV07CisgIF9yZXNwb25zZURhdGFPZmZzZXQgKz0gcmFuZ2UubGVuZ3RoOworCisgIHJldHVybiAoVUludDMyKXJhbmdlLmxlbmd0aDsKK30KKworLShCT09MKSB3cml0ZTooY29uc3QgVUludDggKilkYXRhIG9mZnNldDooVUludDMyKW9mZnNldCBsZW5ndGg6KFVJbnQzMilsZW5ndGggZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFtfcmVxdWVzdERhdGEgYXBwZW5kQnl0ZXM6ZGF0YStvZmZzZXQgbGVuZ3RoOmxlbmd0aF07CisKKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSBmbHVzaDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgW19yZXF1ZXN0IHNldEhUVFBCb2R5Ol9yZXF1ZXN0RGF0YV07CisKKyAgX3Jlc3BvbnNlRGF0YU9mZnNldCA9IDA7CisKKyAgLy8gbWFrZSB0aGUgSFRUUCByZXF1ZXN0CisgIE5TVVJMUmVzcG9uc2UgKnJlc3BvbnNlOworICBfcmVzcG9uc2VEYXRhID0gW05TVVJMQ29ubmVjdGlvbiBzZW5kU3luY2hyb25vdXNSZXF1ZXN0Ol9yZXF1ZXN0IHJldHVybmluZ1Jlc3BvbnNlOiZyZXNwb25zZSBlcnJvcjplcnJvcl07CisgIGlmICghX3Jlc3BvbnNlRGF0YSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIFtfcmVxdWVzdERhdGEgc2V0TGVuZ3RoOjBdOworCisgIGlmICghW3Jlc3BvbnNlIGlzS2luZE9mQ2xhc3M6TlNIVFRQVVJMUmVzcG9uc2UuY2xhc3NdKSB7CisgICAgaWYgKGVycm9yKSB7CisgICAgICAqZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFRyYW5zcG9ydEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFRyYW5zcG9ydEVycm9yVW5rbm93bgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOkB7VFRyYW5zcG9ydEVycm9ySHR0cEVycm9yS2V5OiBAKFRIdHRwVHJhbnNwb3J0RXJyb3JJbnZhbGlkUmVzcG9uc2UpfV07CisgICAgfQorICAgIHJldHVybiBOTzsKKyAgfQorCisgIE5TSFRUUFVSTFJlc3BvbnNlICpodHRwUmVzcG9uc2UgPSAoTlNIVFRQVVJMUmVzcG9uc2UgKilyZXNwb25zZTsKKyAgaWYgKFtodHRwUmVzcG9uc2Ugc3RhdHVzQ29kZV0gIT0gMjAwKSB7CisgICAgaWYgKGVycm9yKSB7CisKKyAgICAgIFRIdHRwVHJhbnNwb3J0RXJyb3IgY29kZTsKKyAgICAgIGlmIChodHRwUmVzcG9uc2Uuc3RhdHVzQ29kZSA9PSA0MDEpIHsKKyAgICAgICAgY29kZSA9IFRIdHRwVHJhbnNwb3J0RXJyb3JBdXRoZW50aWNhdGlvbjsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBjb2RlID0gVEh0dHBUcmFuc3BvcnRFcnJvckludmFsaWRTdGF0dXM7CisgICAgICB9CisKKyAgICAgICplcnJvciA9IFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjpUVHJhbnNwb3J0RXJyb3JEb21haW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTpUVHJhbnNwb3J0RXJyb3JVbmtub3duCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86QHtUVHJhbnNwb3J0RXJyb3JIdHRwRXJyb3JLZXk6IEAoY29kZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAInN0YXR1c0NvZGUiOkAoaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGUpfV07CisgICAgfQorICAgIHJldHVybiBOTzsKKyAgfQorCisgIHJldHVybiBZRVM7Cit9CisKK0BlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIuaCBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIuaAppbmRleCBmYTRkMzcxLi42MjQ5ZDMyIDEwMDY0NAotLS0gYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLmgKKysrIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5oCkBAIC0yMCwxMCArMjAsMTggQEAKICNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgogI2ltcG9ydCAiVFRyYW5zcG9ydC5oIgogCi1AaW50ZXJmYWNlIFRNZW1vcnlCdWZmZXIgOiBOU09iamVjdCA8VFRyYW5zcG9ydD4gewotCU5TTXV0YWJsZURhdGEgKm1CdWZmZXI7Ci0JTlNVSW50ZWdlciBtT2Zmc2V0OwotfQotLSAoaWQpaW5pdFdpdGhEYXRhOihOU0RhdGEgKilkYXRhOwotLSAoTlNEYXRhICopZ2V0QnVmZmVyOworTlNfQVNTVU1FX05PTk5VTExfQkVHSU4KKworCitAaW50ZXJmYWNlIFRNZW1vcnlCdWZmZXIgOiBOU09iamVjdCA8VFRyYW5zcG9ydD4KKworLShOU0RhdGEgKikgYnVmZmVyOworCistKGlkKSBpbml0V2l0aERhdGE6KE5TRGF0YSAqKWRhdGE7CisKKy0oaWQpIGluaXRXaXRoRGF0YU5vQ29weTooTlNNdXRhYmxlRGF0YSAqKWRhdGE7CisKIEBlbmQKKworCitOU19BU1NVTUVfTk9OTlVMTF9FTkQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIubSBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIubQppbmRleCA0NTEzYWI4Li5lYzE5Y2M4IDEwMDY0NAotLS0gYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLm0KKysrIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5tCkBAIC0xOCw1NyArMTgsMTA0IEBACiAgKi8KIAogI2ltcG9ydCAiVE1lbW9yeUJ1ZmZlci5oIgotI2ltcG9ydCAiVFRyYW5zcG9ydEV4Y2VwdGlvbi5oIgotI2ltcG9ydCAiVE9iamVjdGl2ZS1DLmgiCisjaW1wb3J0ICJUVHJhbnNwb3J0RXJyb3IuaCIKKwogCiAjZGVmaW5lIEdBUkJBR0VfQlVGRkVSX1NJWkUgNDA5NiAvLyA0S2lCCiAKKworQGludGVyZmFjZSBUTWVtb3J5QnVmZmVyICgpCisKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgTlNNdXRhYmxlRGF0YSAqYnVmZmVyOworQHByb3BlcnR5KGFzc2lnbiwgbm9uYXRvbWljKSBVSW50MzIgYnVmZmVyT2Zmc2V0OworCitAZW5kCisKKwogQGltcGxlbWVudGF0aW9uIFRNZW1vcnlCdWZmZXIKLS0gKGlkKWluaXQgewotCWlmICgoc2VsZiA9IFtzdXBlciBpbml0XSkpIHsKLQkJbUJ1ZmZlciA9IFtbTlNNdXRhYmxlRGF0YSBhbGxvY10gaW5pdF07Ci0JCW1PZmZzZXQgPSAwOwotCX0KLQlyZXR1cm4gc2VsZjsKLX0KIAotLSAoaWQpaW5pdFdpdGhEYXRhOihOU0RhdGEgKilkYXRhIHsKLQlpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdF0pKSB7Ci0JCW1CdWZmZXIgPSBbZGF0YSBtdXRhYmxlQ29weV07Ci0JCW1PZmZzZXQgPSAwOwotCX0KLQlyZXR1cm4gc2VsZjsKLX0KLQotLSAoc2l6ZV90KSByZWFkQWxsOiAodWludDhfdCAqKSBidWYgb2Zmc2V0OiAoc2l6ZV90KSBvZmZzZXQgbGVuZ3RoOiAoc2l6ZV90KSBsZW5ndGgKKy0oaWQpIGluaXQKIHsKLQlpZiAoW21CdWZmZXIgbGVuZ3RoXSAtIG1PZmZzZXQgPCBsZW5ndGgpIHsKLQkJQHRocm93IFtUVHJhbnNwb3J0RXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhSZWFzb246QCJOb3QgZW5vdWdoIGJ5dGVzIHJlbWFpbiBpbiBidWZmZXIiXTsKLQl9Ci0JW21CdWZmZXIgZ2V0Qnl0ZXM6YnVmIHJhbmdlOk5TTWFrZVJhbmdlKG1PZmZzZXQsIGxlbmd0aCldOwotCW1PZmZzZXQgKz0gbGVuZ3RoOwotCWlmIChtT2Zmc2V0ID49IEdBUkJBR0VfQlVGRkVSX1NJWkUpIHsKLQkJW21CdWZmZXIgcmVwbGFjZUJ5dGVzSW5SYW5nZTpOU01ha2VSYW5nZSgwLCBtT2Zmc2V0KSB3aXRoQnl0ZXM6TlVMTCBsZW5ndGg6MF07Ci0JCW1PZmZzZXQgPSAwOwotCX0KLQlyZXR1cm4gbGVuZ3RoOworICBpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdF0pKSB7CisgICAgX2J1ZmZlciA9IFtOU011dGFibGVEYXRhIG5ld107CisgICAgX2J1ZmZlck9mZnNldCA9IDA7CisgIH0KKyAgcmV0dXJuIHNlbGY7CiB9CiAKLS0gKHZvaWQpIHdyaXRlOiAoY29uc3QgdWludDhfdCAqKSBkYXRhIG9mZnNldDogKHNpemVfdCkgb2Zmc2V0IGxlbmd0aDogKHNpemVfdCkgbGVuZ3RoCistKGlkKSBpbml0V2l0aERhdGE6KE5TRGF0YSAqKWRhdGEKIHsKLQlbbUJ1ZmZlciBhcHBlbmRCeXRlczpkYXRhK29mZnNldCBsZW5ndGg6bGVuZ3RoXTsKKyAgaWYgKHNlbGYgPSBbc3VwZXIgaW5pdF0pIHsKKyAgICBfYnVmZmVyID0gW2RhdGEgbXV0YWJsZUNvcHldOworICAgIF9idWZmZXJPZmZzZXQgPSAwOworICB9CisgIHJldHVybiBzZWxmOwogfQogCi0tICh2b2lkKWZsdXNoIHsKLQkvLyBub29wCistKGlkKSBpbml0V2l0aERhdGFOb0NvcHk6KE5TTXV0YWJsZURhdGEgKilkYXRhCit7CisgIGlmIChzZWxmID0gW3N1cGVyIGluaXRdKSB7CisgICAgX2J1ZmZlciA9IGRhdGE7CisgICAgX2J1ZmZlck9mZnNldCA9IDA7CisgIH0KKyAgcmV0dXJuIHNlbGY7CiB9CiAKLS0gKE5TRGF0YSAqKWdldEJ1ZmZlciB7Ci0JcmV0dXJuIFtbbUJ1ZmZlciBjb3B5XSBhdXRvcmVsZWFzZV9zdHViXTsKKy0oQk9PTCkgcmVhZEFsbDooVUludDggKilvdXRCdWZmZXIgb2Zmc2V0OihVSW50MzIpb3V0QnVmZmVyT2Zmc2V0IGxlbmd0aDooVUludDMyKWxlbmd0aCBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDMyIGdvdCA9IFtzZWxmIHJlYWRBdmFpbDpvdXRCdWZmZXIgb2Zmc2V0Om91dEJ1ZmZlck9mZnNldCBtYXhMZW5ndGg6bGVuZ3RoIGVycm9yOmVycm9yXTsKKyAgaWYgKGdvdCAhPSBsZW5ndGgpIHsKKworICAgIC8vIFJlcG9ydCB1bmRlcmZsb3cgb25seSBpZiByZWFkQXZhaWwgZGlkbid0IHJlcG9ydCBlcnJvciBhbHJlYWR5CisgICAgaWYgKGVycm9yICYmICEqZXJyb3IpIHsKKyAgICAgICplcnJvciA9IFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjpUVHJhbnNwb3J0RXJyb3JEb21haW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTpUVHJhbnNwb3J0RXJyb3JFbmRPZkZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzpuaWxdOworICAgIH0KKworICAgIHJldHVybiBOTzsKKyAgfQorCisgIHJldHVybiBZRVM7CiB9CiAKLS0gKHZvaWQpZGVhbGxvYyB7Ci0JW21CdWZmZXIgcmVsZWFzZV9zdHViXTsKLQlbc3VwZXIgZGVhbGxvY19zdHViXTsKKy0oVUludDMyKSByZWFkQXZhaWw6KFVJbnQ4ICopb3V0QnVmZmVyIG9mZnNldDooVUludDMyKW91dEJ1ZmZlck9mZnNldCBtYXhMZW5ndGg6KFVJbnQzMiltYXhMZW5ndGggZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQzMiBhdmFpbCA9IChVSW50MzIpX2J1ZmZlci5sZW5ndGggLSBfYnVmZmVyT2Zmc2V0OworICBpZiAoYXZhaWwgPT0gMCkgeworICAgIHJldHVybiAwOworICB9CisKKyAgTlNSYW5nZSByYW5nZTsKKyAgcmFuZ2UubG9jYXRpb24gPSBfYnVmZmVyT2Zmc2V0OworICByYW5nZS5sZW5ndGggPSBNSU4obWF4TGVuZ3RoLCBhdmFpbCk7CisKKyAgW19idWZmZXIgZ2V0Qnl0ZXM6b3V0QnVmZmVyICsgb3V0QnVmZmVyT2Zmc2V0IHJhbmdlOnJhbmdlXTsKKyAgX2J1ZmZlck9mZnNldCArPSByYW5nZS5sZW5ndGg7CisKKyAgaWYgKF9idWZmZXJPZmZzZXQgPj0gR0FSQkFHRV9CVUZGRVJfU0laRSkgeworICAgIFtfYnVmZmVyIHJlcGxhY2VCeXRlc0luUmFuZ2U6TlNNYWtlUmFuZ2UoMCwgX2J1ZmZlck9mZnNldCkgd2l0aEJ5dGVzOk5VTEwgbGVuZ3RoOjBdOworICAgIF9idWZmZXJPZmZzZXQgPSAwOworICB9CisKKyAgcmV0dXJuIChVSW50MzIpcmFuZ2UubGVuZ3RoOwogfQorCistKEJPT0wpIHdyaXRlOihjb25zdCBVSW50OCAqKWluQnVmZmVyIG9mZnNldDooVUludDMyKWluQnVmZmVyT2Zmc2V0IGxlbmd0aDooVUludDMyKWxlbmd0aCBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgW19idWZmZXIgYXBwZW5kQnl0ZXM6aW5CdWZmZXIgKyBpbkJ1ZmZlck9mZnNldCBsZW5ndGg6bGVuZ3RoXTsKKworICByZXR1cm4gWUVTOworfQorCistKE5TRGF0YSAqKSBidWZmZXIKK3sKKyAgcmV0dXJuIF9idWZmZXI7Cit9CisKKy0oQk9PTCkgZmx1c2g6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBZRVM7Cit9CisKIEBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1ROU0ZpbGVIYW5kbGVUcmFuc3BvcnQuaCBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1ROU0ZpbGVIYW5kbGVUcmFuc3BvcnQuaAppbmRleCBiYTJhMjA5Li5kYjZlZGYzIDEwMDY0NAotLS0gYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTlNGaWxlSGFuZGxlVHJhbnNwb3J0LmgKKysrIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE5TRmlsZUhhbmRsZVRyYW5zcG9ydC5oCkBAIC0yMSwxNSArMjEsMTggQEAKICNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgogI2ltcG9ydCAiVFRyYW5zcG9ydC5oIgogCi1AaW50ZXJmYWNlIFROU0ZpbGVIYW5kbGVUcmFuc3BvcnQgOiBOU09iamVjdCA8VFRyYW5zcG9ydD4gewotICBOU0ZpbGVIYW5kbGUgKiBtSW5wdXRGaWxlSGFuZGxlOwotICBOU0ZpbGVIYW5kbGUgKiBtT3V0cHV0RmlsZUhhbmRsZTsKLX0KK05TX0FTU1VNRV9OT05OVUxMX0JFR0lOCiAKLS0gKGlkKSBpbml0V2l0aEZpbGVIYW5kbGU6IChOU0ZpbGVIYW5kbGUgKikgZmlsZUhhbmRsZTsKIAotLSAoaWQpIGluaXRXaXRoSW5wdXRGaWxlSGFuZGxlOiAoTlNGaWxlSGFuZGxlICopIGlucHV0RmlsZUhhbmRsZQotICAgICAgICAgICAgICBvdXRwdXRGaWxlSGFuZGxlOiAoTlNGaWxlSGFuZGxlICopIG91dHB1dEZpbGVIYW5kbGU7CitAaW50ZXJmYWNlIFROU0ZpbGVIYW5kbGVUcmFuc3BvcnQgOiBOU09iamVjdCA8VFRyYW5zcG9ydD4KKworLShpZCkgaW5pdFdpdGhGaWxlSGFuZGxlOihOU0ZpbGVIYW5kbGUgKilmaWxlSGFuZGxlOworCistKGlkKSBpbml0V2l0aElucHV0RmlsZUhhbmRsZTooTlNGaWxlSGFuZGxlICopaW5wdXRGaWxlSGFuZGxlCisgICAgICAgICAgICAgb3V0cHV0RmlsZUhhbmRsZTooTlNGaWxlSGFuZGxlICopb3V0cHV0RmlsZUhhbmRsZTsKIAogCiBAZW5kCisKKworTlNfQVNTVU1FX05PTk5VTExfRU5ECmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTlNGaWxlSGFuZGxlVHJhbnNwb3J0Lm0gYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTlNGaWxlSGFuZGxlVHJhbnNwb3J0Lm0KaW5kZXggYzJiMThjYS4uYzkwN2Y4NyAxMDA2NDQKLS0tIGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE5TRmlsZUhhbmRsZVRyYW5zcG9ydC5tCisrKyBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1ROU0ZpbGVIYW5kbGVUcmFuc3BvcnQubQpAQCAtMTksNzUgKzE5LDEwMCBAQAogCiAKICNpbXBvcnQgIlROU0ZpbGVIYW5kbGVUcmFuc3BvcnQuaCIKLSNpbXBvcnQgIlRUcmFuc3BvcnRFeGNlcHRpb24uaCIKLSNpbXBvcnQgIlRPYmplY3RpdmUtQy5oIgorI2ltcG9ydCAiVFRyYW5zcG9ydEVycm9yLmgiCisKKworQGludGVyZmFjZSBUTlNGaWxlSGFuZGxlVHJhbnNwb3J0ICgpCisKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgTlNGaWxlSGFuZGxlICppbnB1dEZpbGVIYW5kbGU7CitAcHJvcGVydHkoc3Ryb25nLCBub25hdG9taWMpIE5TRmlsZUhhbmRsZSAqb3V0cHV0RmlsZUhhbmRsZTsKKworQGVuZAogCiAKIEBpbXBsZW1lbnRhdGlvbiBUTlNGaWxlSGFuZGxlVHJhbnNwb3J0CiAKLS0gKGlkKSBpbml0V2l0aEZpbGVIYW5kbGU6IChOU0ZpbGVIYW5kbGUgKikgZmlsZUhhbmRsZQorLShpZCkgaW5pdFdpdGhGaWxlSGFuZGxlOihOU0ZpbGVIYW5kbGUgKilmaWxlSGFuZGxlCiB7Ci0gIHJldHVybiBbc2VsZiBpbml0V2l0aElucHV0RmlsZUhhbmRsZTogZmlsZUhhbmRsZQotICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEZpbGVIYW5kbGU6IGZpbGVIYW5kbGVdOworICByZXR1cm4gW3NlbGYgaW5pdFdpdGhJbnB1dEZpbGVIYW5kbGU6ZmlsZUhhbmRsZQorICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEZpbGVIYW5kbGU6ZmlsZUhhbmRsZV07CiB9CiAKIAotLSAoaWQpIGluaXRXaXRoSW5wdXRGaWxlSGFuZGxlOiAoTlNGaWxlSGFuZGxlICopIGlucHV0RmlsZUhhbmRsZQotICAgICAgICAgICAgICBvdXRwdXRGaWxlSGFuZGxlOiAoTlNGaWxlSGFuZGxlICopIG91dHB1dEZpbGVIYW5kbGUKKy0oaWQpIGluaXRXaXRoSW5wdXRGaWxlSGFuZGxlOihOU0ZpbGVIYW5kbGUgKilhSW5wdXRGaWxlSGFuZGxlCisgICAgICAgICAgICAgb3V0cHV0RmlsZUhhbmRsZTooTlNGaWxlSGFuZGxlICopYU91dHB1dEZpbGVIYW5kbGUKIHsKICAgc2VsZiA9IFtzdXBlciBpbml0XTsKLQotICBtSW5wdXRGaWxlSGFuZGxlID0gW2lucHV0RmlsZUhhbmRsZSByZXRhaW5fc3R1Yl07Ci0gIG1PdXRwdXRGaWxlSGFuZGxlID0gW291dHB1dEZpbGVIYW5kbGUgcmV0YWluX3N0dWJdOwotCisgIGlmIChzZWxmKSB7CisgICAgX2lucHV0RmlsZUhhbmRsZSA9IGFJbnB1dEZpbGVIYW5kbGU7CisgICAgX291dHB1dEZpbGVIYW5kbGUgPSBhT3V0cHV0RmlsZUhhbmRsZTsKKyAgfQogICByZXR1cm4gc2VsZjsKIH0KIAogCi0tICh2b2lkKSBkZWFsbG9jIHsKLSAgW21JbnB1dEZpbGVIYW5kbGUgcmVsZWFzZV9zdHViXTsKLSAgW21PdXRwdXRGaWxlSGFuZGxlIHJlbGVhc2Vfc3R1Yl07Ci0gIFtzdXBlciBkZWFsbG9jX3N0dWJdOwotfQotCi0KLS0gKHNpemVfdCkgcmVhZEFsbDogKHVpbnQ4X3QgKikgYnVmIG9mZnNldDogKHNpemVfdCkgb2Zmc2V0IGxlbmd0aDogKHNpemVfdCkgbGVuZ3RoCistKEJPT0wpIHJlYWRBbGw6KFVJbnQ4ICopYnVmIG9mZnNldDooVUludDMyKW9mZiBsZW5ndGg6KFVJbnQzMilsZW4gZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIHNpemVfdCB0b3RhbEJ5dGVzUmVhZCA9IDA7Ci0gIHdoaWxlICh0b3RhbEJ5dGVzUmVhZCA8IGxlbmd0aCkgewotICAgIE5TRGF0YSAqIGRhdGEgPSBbbUlucHV0RmlsZUhhbmRsZSByZWFkRGF0YU9mTGVuZ3RoOiBsZW5ndGgtdG90YWxCeXRlc1JlYWRdOwotICAgIGlmIChbZGF0YSBsZW5ndGhdID09IDApIHsKLSAgICAgIEB0aHJvdyBbVFRyYW5zcG9ydEV4Y2VwdGlvbiBleGNlcHRpb25XaXRoTmFtZTogQCJUVHJhbnNwb3J0RXhjZXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjogQCJDYW5ub3QgcmVhZC4gTm8gbW9yZSBkYXRhLiJdOworICBVSW50MzIgZ290ID0gMDsKKyAgd2hpbGUgKGdvdCA8IGxlbikgeworCisgICAgTlNEYXRhICpkID0gW19pbnB1dEZpbGVIYW5kbGUgcmVhZERhdGFPZkxlbmd0aDpsZW4tZ290XTsKKyAgICBpZiAoZC5sZW5ndGggPT0gMCkgeworICAgICAgaWYgKGVycm9yKSB7CisgICAgICAgICplcnJvciA9IFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjpUVHJhbnNwb3J0RXJyb3JEb21haW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOlRUcmFuc3BvcnRFcnJvckVuZE9mRmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86bmlsXTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBOTzsKICAgICB9Ci0gICAgW2RhdGEgZ2V0Qnl0ZXM6IGJ1Zit0b3RhbEJ5dGVzUmVhZF07Ci0gICAgdG90YWxCeXRlc1JlYWQgKz0gW2RhdGEgbGVuZ3RoXTsKKworICAgIFtkIGdldEJ5dGVzOmJ1Zitnb3QgbGVuZ3RoOmQubGVuZ3RoXTsKKyAgICBnb3QgKz0gZC5sZW5ndGg7CiAgIH0KLSAgcmV0dXJuIHRvdGFsQnl0ZXNSZWFkOworICByZXR1cm4gWUVTOwogfQogCiAKLS0gKHZvaWQpIHdyaXRlOiAoY29uc3QgdWludDhfdCAqKSBkYXRhIG9mZnNldDogKHNpemVfdCkgb2Zmc2V0IGxlbmd0aDogKHNpemVfdCkgbGVuZ3RoCistKFVJbnQzMikgcmVhZEF2YWlsOihVSW50OCAqKWJ1ZiBvZmZzZXQ6KFVJbnQzMilvZmYgbWF4TGVuZ3RoOihVSW50MzIpbGVuIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICBjb25zdCB2b2lkICpwb3MgPSBkYXRhICsgb2Zmc2V0OwotICBOU0RhdGEgKiBkYXRhT2JqZWN0ID0gW1tOU0RhdGEgYWxsb2NdIGluaXRXaXRoQnl0ZXNOb0NvcHk6ICh2b2lkICopcG9zCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aDogbGVuZ3RoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVXaGVuRG9uZTogTk9dOworICBVSW50MzIgZ290ID0gMDsKKyAgd2hpbGUgKGdvdCA8IGxlbikgeworCisgICAgTlNEYXRhICpkID0gW19pbnB1dEZpbGVIYW5kbGUgcmVhZERhdGFPZkxlbmd0aDpsZW4tZ290XTsKKyAgICBpZiAoZC5sZW5ndGggPT0gMCkgeworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgW2QgZ2V0Qnl0ZXM6YnVmK2dvdCBsZW5ndGg6ZC5sZW5ndGhdOworICAgIGdvdCArPSBkLmxlbmd0aDsKKyAgfQorICByZXR1cm4gZ290OworfQorCisKKy0oQk9PTCkgd3JpdGU6KGNvbnN0IFVJbnQ4ICopZGF0YSBvZmZzZXQ6KFVJbnQzMilvZmZzZXQgbGVuZ3RoOihVSW50MzIpbGVuZ3RoIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICB2b2lkICpwb3MgPSAodm9pZCAqKWRhdGEgKyBvZmZzZXQ7CiAKICAgQHRyeSB7Ci0gICAgW21PdXRwdXRGaWxlSGFuZGxlIHdyaXRlRGF0YTogZGF0YU9iamVjdF07Ci0gIH0gQGNhdGNoIChOU0V4Y2VwdGlvbiAqIGUpIHsKLSAgICBAdGhyb3cgW1RUcmFuc3BvcnRFeGNlcHRpb24gZXhjZXB0aW9uV2l0aE5hbWU6IEAiVFRyYW5zcG9ydEV4Y2VwdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OiBAIiVzOiBVbmFibGUgdG8gd3JpdGUgZGF0YTogJUAiLCBfX1BSRVRUWV9GVU5DVElPTl9fLCBlXV07CisgICAgW19vdXRwdXRGaWxlSGFuZGxlIHdyaXRlRGF0YTpbTlNEYXRhIGRhdGFXaXRoQnl0ZXNOb0NvcHk6cG9zIGxlbmd0aDpsZW5ndGggZnJlZVdoZW5Eb25lOk5PXV07CisgIH0KKyAgQGNhdGNoIChOU0V4Y2VwdGlvbiAqZSkgeworICAgIGlmIChlcnJvcikgeworICAgICAgKmVycm9yID0gW05TRXJyb3IgZXJyb3JXaXRoRG9tYWluOlRUcmFuc3BvcnRFcnJvckRvbWFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOlRUcmFuc3BvcnRFcnJvck5vdE9wZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzpAe31dOworICAgIH0KKyAgICByZXR1cm4gTk87CiAgIH0KIAotICBbZGF0YU9iamVjdCByZWxlYXNlX3N0dWJdOworICByZXR1cm4gWUVTOwogfQogCiAKLS0gKHZvaWQpIGZsdXNoCistKEJPT0wpIGZsdXNoOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotCisgIHJldHVybiBZRVM7CiB9CiAKIEBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1ROU1N0cmVhbVRyYW5zcG9ydC5oIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE5TU3RyZWFtVHJhbnNwb3J0LmgKaW5kZXggODAxMWZiOS4uNTRjNDg4NCAxMDA2NDQKLS0tIGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE5TU3RyZWFtVHJhbnNwb3J0LmgKKysrIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE5TU3RyZWFtVHJhbnNwb3J0LmgKQEAgLTIwLDIxICsyMCwyNCBAQAogI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+CiAjaW1wb3J0ICJUVHJhbnNwb3J0LmgiCiAKLUBpbnRlcmZhY2UgVE5TU3RyZWFtVHJhbnNwb3J0IDogTlNPYmplY3QgPFRUcmFuc3BvcnQ+IHsKK05TX0FTU1VNRV9OT05OVUxMX0JFR0lOCiAKLX0KIAotQHByb3BlcnR5IChub25hdG9taWMsIHN0cm9uZykgTlNJbnB1dFN0cmVhbSAqIG1JbnB1dDsKLUBwcm9wZXJ0eSAobm9uYXRvbWljLCBzdHJvbmcpIE5TT3V0cHV0U3RyZWFtICogbU91dHB1dDsKK0BpbnRlcmZhY2UgVE5TU3RyZWFtVHJhbnNwb3J0IDogTlNPYmplY3QgPFRUcmFuc3BvcnQ+CiAKLS0gKGlkKSBpbml0V2l0aElucHV0U3RyZWFtOiAoTlNJbnB1dFN0cmVhbSAqKSBpbnB1dAotICAgICAgICAgICAgICBvdXRwdXRTdHJlYW06IChOU091dHB1dFN0cmVhbSAqKSBvdXRwdXQ7CitAcHJvcGVydHkgKHN0cm9uZywgbm9uYXRvbWljKSBOU0lucHV0U3RyZWFtICppbnB1dDsKK0Bwcm9wZXJ0eSAoc3Ryb25nLCBub25hdG9taWMpIE5TT3V0cHV0U3RyZWFtICpvdXRwdXQ7CiAKLS0gKGlkKSBpbml0V2l0aElucHV0U3RyZWFtOiAoTlNJbnB1dFN0cmVhbSAqKSBpbnB1dDsKKy0oaWQpIGluaXRXaXRoSW5wdXRTdHJlYW06KG51bGxhYmxlIE5TSW5wdXRTdHJlYW0gKilpbnB1dAorICAgICAgICAgICAgIG91dHB1dFN0cmVhbToobnVsbGFibGUgTlNPdXRwdXRTdHJlYW0gKilvdXRwdXQ7CiAKLS0gKGlkKSBpbml0V2l0aE91dHB1dFN0cmVhbTogKE5TT3V0cHV0U3RyZWFtICopIG91dHB1dDsKKy0oaWQpIGluaXRXaXRoSW5wdXRTdHJlYW06KE5TSW5wdXRTdHJlYW0gKilpbnB1dDsKKworLShpZCkgaW5pdFdpdGhPdXRwdXRTdHJlYW06KE5TT3V0cHV0U3RyZWFtICopb3V0cHV0OworCistKHZvaWQpIGNsb3NlOwogCiBAZW5kCiAKIAotCitOU19BU1NVTUVfTk9OTlVMTF9FTkQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1ROU1N0cmVhbVRyYW5zcG9ydC5tIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE5TU3RyZWFtVHJhbnNwb3J0Lm0KaW5kZXggN2FjMWNkYy4uMThjNDFkMyAxMDA2NDQKLS0tIGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE5TU3RyZWFtVHJhbnNwb3J0Lm0KKysrIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE5TU3RyZWFtVHJhbnNwb3J0Lm0KQEAgLTE4LDc5ICsxOCwxMzYgQEAKICAqLwogCiAjaW1wb3J0ICJUTlNTdHJlYW1UcmFuc3BvcnQuaCIKLSNpbXBvcnQgIlRUcmFuc3BvcnRFeGNlcHRpb24uaCIKLSNpbXBvcnQgIlRPYmplY3RpdmUtQy5oIgorI2ltcG9ydCAiVFRyYW5zcG9ydEVycm9yLmgiCisKKworQGludGVyZmFjZSBUTlNTdHJlYW1UcmFuc3BvcnQgKCkKK0BlbmQKIAogCiBAaW1wbGVtZW50YXRpb24gVE5TU3RyZWFtVHJhbnNwb3J0CiAKLS0gKGlkKSBpbml0V2l0aElucHV0U3RyZWFtOiAoTlNJbnB1dFN0cmVhbSAqKSBpbnB1dAotICAgICAgICAgICAgICBvdXRwdXRTdHJlYW06IChOU091dHB1dFN0cmVhbSAqKSBvdXRwdXQKKy0oaWQpIGluaXRXaXRoSW5wdXRTdHJlYW06KE5TSW5wdXRTdHJlYW0gKilpbnB1dAorICAgICAgICAgICAgIG91dHB1dFN0cmVhbTooTlNPdXRwdXRTdHJlYW0gKilvdXRwdXQKIHsKICAgc2VsZiA9IFtzdXBlciBpbml0XTsKLSAgc2VsZi5tSW5wdXQgPSBbaW5wdXQgcmV0YWluX3N0dWJdOwotICBzZWxmLm1PdXRwdXQgPSBbb3V0cHV0IHJldGFpbl9zdHViXTsKKyAgaWYgKHNlbGYpIHsKKyAgICBfaW5wdXQgPSBpbnB1dDsKKyAgICBfb3V0cHV0ID0gb3V0cHV0OworICB9CiAgIHJldHVybiBzZWxmOwogfQogCi0tIChpZCkgaW5pdFdpdGhJbnB1dFN0cmVhbTogKE5TSW5wdXRTdHJlYW0gKikgaW5wdXQKKy0oaWQpIGluaXRXaXRoSW5wdXRTdHJlYW06KE5TSW5wdXRTdHJlYW0gKilpbnB1dAogewotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhJbnB1dFN0cmVhbTogaW5wdXQgb3V0cHV0U3RyZWFtOiBuaWxdOworICByZXR1cm4gW3NlbGYgaW5pdFdpdGhJbnB1dFN0cmVhbTppbnB1dCBvdXRwdXRTdHJlYW06bmlsXTsKIH0KIAotLSAoaWQpIGluaXRXaXRoT3V0cHV0U3RyZWFtOiAoTlNPdXRwdXRTdHJlYW0gKikgb3V0cHV0CistKGlkKSBpbml0V2l0aE91dHB1dFN0cmVhbTooTlNPdXRwdXRTdHJlYW0gKilvdXRwdXQKIHsKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoSW5wdXRTdHJlYW06IG5pbCBvdXRwdXRTdHJlYW06IG91dHB1dF07CisgIHJldHVybiBbc2VsZiBpbml0V2l0aElucHV0U3RyZWFtOm5pbCBvdXRwdXRTdHJlYW06b3V0cHV0XTsKIH0KIAotLSAodm9pZCkgZGVhbGxvYworLSh2b2lkKSBkZWFsbG9jCiB7Ci0gIFtzZWxmLm1JbnB1dCByZWxlYXNlX3N0dWJdOwotICBbc2VsZi5tT3V0cHV0IHJlbGVhc2Vfc3R1Yl07Ci0gIFtzdXBlciBkZWFsbG9jX3N0dWJdOworICBbc2VsZiBjbG9zZV07CiB9CiAKLQotLSAoc2l6ZV90KSByZWFkQWxsOiAodWludDhfdCAqKSBidWYgb2Zmc2V0OiAoc2l6ZV90KSBvZmZzZXQgbGVuZ3RoOiAoc2l6ZV90KSBsZW5ndGgKKy0oQk9PTCkgcmVhZEFsbDooVUludDggKilidWYgb2Zmc2V0OihVSW50MzIpb2ZmIGxlbmd0aDooVUludDMyKWxlbiBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgc2l6ZV90IHRvdGFsQnl0ZXNSZWFkID0gMDsKLSAgc3NpemVfdCBieXRlc1JlYWQgPSAwOwotICB3aGlsZSAodG90YWxCeXRlc1JlYWQgPCBsZW5ndGgpIHsKLSAgICBieXRlc1JlYWQgPSBbc2VsZi5tSW5wdXQgcmVhZDogYnVmK29mZnNldCt0b3RhbEJ5dGVzUmVhZCBtYXhMZW5ndGg6IGxlbmd0aC10b3RhbEJ5dGVzUmVhZF07CisgIFVJbnQzMiBnb3QgPSAwOworICB3aGlsZSAoZ290IDwgbGVuKSB7CiAKLSAgICBCT09MIGVuY291bnRlcmVkRXJyb3JPckVPRiA9IChieXRlc1JlYWQgPD0gMCk7Ci0gICAgaWYgKGVuY291bnRlcmVkRXJyb3JPckVPRikgewotICAgICAgQHRocm93IFtUVHJhbnNwb3J0RXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhSZWFzb246IEAiQ2Fubm90IHJlYWQuIFJlbW90ZSBzaWRlIGhhcyBjbG9zZWQuIl07Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLyogYnl0ZXNSZWFkIGlzIGd1YXJhbnRlZWQgdG8gYmUgcG9zaXRpdmUgYW5kIHdpdGhpbiB0aGUgcmFuZ2UgcmVwcmVzZW50YWJsZSBieSBzaXplX3QuICovCi0gICAgICAgIHRvdGFsQnl0ZXNSZWFkICs9IChzaXplX3QpYnl0ZXNSZWFkOworICAgIFVJbnQzMiByZWFkID0gKFVJbnQzMilbX2lucHV0IHJlYWQ6YnVmK29mZitnb3QgbWF4TGVuZ3RoOmxlbi1nb3RdOworICAgIGlmIChyZWFkIDw9IDApIHsKKyAgICAgIGlmIChlcnJvcikgeworICAgICAgICAqZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFRyYW5zcG9ydEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTpUVHJhbnNwb3J0RXJyb3JOb3RPcGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzpAe31dOworICAgICAgfQorICAgICAgcmV0dXJuIE5POwogICAgIH0KKworICAgIGdvdCArPSByZWFkOwogICB9Ci0gIHJldHVybiB0b3RhbEJ5dGVzUmVhZDsKKworICByZXR1cm4gWUVTOwogfQogCiAKLS0gKHZvaWQpIHdyaXRlOiAoY29uc3QgdWludDhfdCAqKSBkYXRhIG9mZnNldDogKHNpemVfdCkgb2Zmc2V0IGxlbmd0aDogKHNpemVfdCkgbGVuZ3RoCistKFVJbnQzMikgcmVhZEF2YWlsOihVSW50OCAqKWJ1ZiBvZmZzZXQ6KFVJbnQzMilvZmYgbWF4TGVuZ3RoOihVSW50MzIpbGVuIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICBzaXplX3QgdG90YWxCeXRlc1dyaXR0ZW4gPSAwOwotICBzc2l6ZV90IGJ5dGVzV3JpdHRlbiA9IDA7Ci0gIHdoaWxlICh0b3RhbEJ5dGVzV3JpdHRlbiA8IGxlbmd0aCkgewotICAgIGJ5dGVzV3JpdHRlbiA9IFtzZWxmLm1PdXRwdXQgd3JpdGU6IGRhdGErb2Zmc2V0K3RvdGFsQnl0ZXNXcml0dGVuIG1heExlbmd0aDogbGVuZ3RoLXRvdGFsQnl0ZXNXcml0dGVuXTsKLSAgICBpZiAoYnl0ZXNXcml0dGVuIDwgMCkgewotICAgICAgQHRocm93IFtUVHJhbnNwb3J0RXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhSZWFzb246IEAiRXJyb3Igd3JpdGluZyB0byB0cmFuc3BvcnQgb3V0cHV0IHN0cmVhbS4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogW3NlbGYubU91dHB1dCBzdHJlYW1FcnJvcl1dOwotICAgIH0gZWxzZSBpZiAoYnl0ZXNXcml0dGVuID09IDApIHsKLSAgICAgIEB0aHJvdyBbVFRyYW5zcG9ydEV4Y2VwdGlvbiBleGNlcHRpb25XaXRoUmVhc29uOiBAIkVuZCBvZiBvdXRwdXQgc3RyZWFtLiJdOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIGJ5dGVzV3JpdHRlbiBpcyBndWFyYW50ZWVkIHRvIGJlIHBvc2l0aXZlIGFuZCB3aXRoaW4gdGhlIHJhbmdlIHJlcHJlc2VudGFibGUgYnkgc2l6ZV90LiAqLwotICAgICAgICB0b3RhbEJ5dGVzV3JpdHRlbiArPSAoc2l6ZV90KWJ5dGVzV3JpdHRlbjsKKyAgVUludDMyIGdvdCA9IDA7CisgIHdoaWxlIChnb3QgPCBsZW4pIHsKKworICAgIFVJbnQzMiByZWFkID0gKFVJbnQzMilbX2lucHV0IHJlYWQ6YnVmK29mZitnb3QgbWF4TGVuZ3RoOmxlbi1nb3RdOworICAgIGlmIChyZWFkIDw9IDApIHsKKyAgICAgIGJyZWFrOwogICAgIH0KKworICAgIGdvdCArPSByZWFkOwogICB9CisKKyAgcmV0dXJuIGdvdDsKIH0KIAotLSAodm9pZCkgZmx1c2gKKworLShCT09MKSB3cml0ZTooY29uc3QgVUludDggKilkYXRhIG9mZnNldDooVUludDMyKW9mZnNldCBsZW5ndGg6KFVJbnQzMilsZW5ndGggZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIC8vIG5vIGZsdXNoIGZvciB5b3UhCisgIFVJbnQzMiBnb3QgPSAwOworICBOU0ludGVnZXIgdG90YWwgPSAwOworICB3aGlsZSAoZ290IDwgbGVuZ3RoKSB7CisKKyAgICB0b3RhbCA9IFtfb3V0cHV0IHdyaXRlOmRhdGErb2Zmc2V0K2dvdCBtYXhMZW5ndGg6bGVuZ3RoLWdvdF07CisgICAgaWYgKHRvdGFsID09IC0xKSB7CisgICAgICBpZiAoZXJyb3IpIHsKKyAgICAgICAgKmVycm9yID0gW05TRXJyb3IgZXJyb3JXaXRoRG9tYWluOlRUcmFuc3BvcnRFcnJvckRvbWFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFRyYW5zcG9ydEVycm9yTm90T3BlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86QHt9XTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgICAgZWxzZSBpZiAodG90YWwgPT0gMCkgeworICAgICAgaWYgKGVycm9yKSB7CisgICAgICAgICplcnJvciA9IFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjpUVHJhbnNwb3J0RXJyb3JEb21haW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOlRUcmFuc3BvcnRFcnJvckVuZE9mRmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86QHt9XTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisKKyAgICBnb3QgKz0gdG90YWw7CisgIH0KKworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIGZsdXNoOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gWUVTOworfQorCistKHZvaWQpIGNsb3NlCit7CisgIE5TSW5wdXRTdHJlYW0gKmlucHV0ID0gc2VsZi5pbnB1dDsKKyAgaWYgKGlucHV0KSB7CisgICAgLy8gQ2xvc2UgYW5kIHJlc2V0IGlucHV0c3RyZWFtCisgICAgQ0ZSZWFkU3RyZWFtU2V0UHJvcGVydHkoKF9fYnJpZGdlIENGUmVhZFN0cmVhbVJlZikoaW5wdXQpLCBrQ0ZTdHJlYW1Qcm9wZXJ0eVNob3VsZENsb3NlTmF0aXZlU29ja2V0LCBrQ0ZCb29sZWFuVHJ1ZSk7CisgICAgW2lucHV0IHNldERlbGVnYXRlOm5pbF07CisgICAgW2lucHV0IGNsb3NlXTsKKyAgICBbaW5wdXQgcmVtb3ZlRnJvbVJ1bkxvb3A6W05TUnVuTG9vcCBjdXJyZW50UnVuTG9vcF0gZm9yTW9kZTpOU0RlZmF1bHRSdW5Mb29wTW9kZV07CisgICAgaW5wdXQgPSBuaWw7CisgIH0KKworICBOU091dHB1dFN0cmVhbSAqb3V0cHV0ID0gc2VsZi5vdXRwdXQ7CisgIGlmIChvdXRwdXQpIHsKKyAgICAvLyBDbG9zZSBhbmQgcmVzZXQgb3V0cHV0c3RyZWFtCisgICAgQ0ZXcml0ZVN0cmVhbVNldFByb3BlcnR5KChfX2JyaWRnZSBDRldyaXRlU3RyZWFtUmVmKShvdXRwdXQpLCBrQ0ZTdHJlYW1Qcm9wZXJ0eVNob3VsZENsb3NlTmF0aXZlU29ja2V0LCBrQ0ZCb29sZWFuVHJ1ZSk7CisgICAgW291dHB1dCBzZXREZWxlZ2F0ZTpuaWxdOworICAgIFtvdXRwdXQgY2xvc2VdOworICAgIFtvdXRwdXQgcmVtb3ZlRnJvbVJ1bkxvb3A6W05TUnVuTG9vcCBjdXJyZW50UnVuTG9vcF0gZm9yTW9kZTpOU0RlZmF1bHRSdW5Mb29wTW9kZV07CisgICAgb3V0cHV0ID0gbmlsOworICB9CiB9CiAKIEBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXRDbGllbnQuaCBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXRDbGllbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRkZTEyNC4uMDAwMDAwMAotLS0gYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0Q2xpZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgotI2ltcG9ydCAiVE5TU3RyZWFtVHJhbnNwb3J0LmgiCi0KLUBpbnRlcmZhY2UgVFNTTFNvY2tldENsaWVudCA6IFROU1N0cmVhbVRyYW5zcG9ydAotI2lmIFRBUkdFVF9PU19JUEhPTkUgfHwgKE1BQ19PU19YX1ZFUlNJT05fTUFYX0FMTE9XRUQgPj0gTUFDX09TX1hfVkVSU0lPTl8xMF82KQotPE5TU3RyZWFtRGVsZWdhdGU+Ci0jZW5kaWYKLXsKLSAgICBOU0lucHV0U3RyZWFtICppbnB1dFN0cmVhbTsKLSAgICBOU091dHB1dFN0cmVhbSAqb3V0cHV0U3RyZWFtOwotQHByaXZhdGUKLSAgICBOU1N0cmluZyAqc3NsSG9zdG5hbWU7Ci0gICAgaW50IHNkOwotfQotCi0tIChpZCkgaW5pdFdpdGhIb3N0bmFtZTogKE5TU3RyaW5nICopIGhvc3RuYW1lCi0gICAgICAgICAgICAgICAgICAgcG9ydDogKGludCkgcG9ydDsKLQotLSAoQk9PTCkgaXNPcGVuOwotCi1AZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0Q2xpZW50Lm0gYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0Q2xpZW50Lm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4YzU1ZDYuLjAwMDAwMDAKLS0tIGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNTTFNvY2tldENsaWVudC5tCisrKyAvZGV2L251bGwKQEAgLTEsMjYxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgotI2ltcG9ydCA8Q29yZUZvdW5kYXRpb24vQ29yZUZvdW5kYXRpb24uaD4KLSNpbXBvcnQgIlRTU0xTb2NrZXRDbGllbnQuaCIKLSNpbXBvcnQgIlRTU0xTb2NrZXRFeGNlcHRpb24uaCIKLSNpbXBvcnQgIlRPYmplY3RpdmUtQy5oIgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0jaW5jbHVkZSA8bmV0ZGIuaD4KLQotI2lmICFUQVJHRVRfT1NfSVBIT05FCi0jaW1wb3J0IDxDb3JlU2VydmljZXMvQ29yZVNlcnZpY2VzLmg+Ci0jZWxzZQotI2ltcG9ydCA8Q0ZOZXR3b3JrL0NGTmV0d29yay5oPgotI2VuZGlmCi0KLUBpbXBsZW1lbnRhdGlvbiBUU1NMU29ja2V0Q2xpZW50Ci0KLS0gKGlkKSBpbml0V2l0aEhvc3RuYW1lOiAoTlNTdHJpbmcgKikgaG9zdG5hbWUKLSAgICAgICAgICAgICAgICAgICBwb3J0OiAoaW50KSBwb3J0Ci17Ci0gICAgc3NsSG9zdG5hbWUgPSBob3N0bmFtZTsKLQlDRlJlYWRTdHJlYW1SZWYgcmVhZFN0cmVhbSA9IE5VTEw7Ci0JQ0ZXcml0ZVN0cmVhbVJlZiB3cml0ZVN0cmVhbSA9IE5VTEw7Ci0gICAgCi0gICAgCi0gICAgLyogY3JlYXRlIGEgc29ja2V0IHN0cnVjdHVyZSAqLwotICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBwaW47Ci0gICAgc3RydWN0IGhvc3RlbnQgKmhwID0gTlVMTDsKLSAgICBmb3IoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotICAgICAgICAKLQotICAgICAgICAKLSAgICAgICAgaWYgKChocCA9IGdldGhvc3RieW5hbWUoW2hvc3RuYW1lIFVURjhTdHJpbmddKSkgPT0gTlVMTCkgeyAKLSAgICAgICAgICAgIE5TTG9nKEAiZmFpbGVkIHRvIHJlc29sdmUgaG9zdG5hbWUgJUAiLCBob3N0bmFtZSk7Ci0gICAgICAgICAgICBoZXJyb3IoInJlc29sdiIpOwotICAgICAgICAgICAgaWYoaSA9PSA5KSB7Ci0gICAgICAgICAgICAgICAgQHRocm93IFtUU1NMU29ja2V0RXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhSZWFzb246IEAiZmFpbGVkIHRvIHJlc29sdmUgaG9zdG5hbWUiXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFtOU1RocmVhZCBzbGVlcEZvclRpbWVJbnRlcnZhbDowLjJdOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBtZW1zZXQgKCZwaW4sIDAsIHNpemVvZihwaW4pKTsKLSAgICBwaW4uc2luX2ZhbWlseSA9IEFGX0lORVQ7Ci0gICAgbWVtY3B5KCZwaW4uc2luX2FkZHIsIGhwLT5oX2FkZHIsIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpOwotICAgIHBpbi5zaW5fcG9ydCA9IGh0b25zIChwb3J0KTsKLSAgICAKLSAgICAvKiBjcmVhdGUgdGhlIHNvY2tldCAqLwotICAgIGlmICgoc2QgPSBzb2NrZXQgKEFGX0lORVQsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1RDUCkpID09IC0xKQotICAgIHsKLSAgICAgICAgTlNMb2coQCJmYWlsZWQgdG8gY3JlYXRlIHNvY2tldCBmb3IgaG9zdCAlQDolZCIsIGhvc3RuYW1lLCBwb3J0KTsKLSAgICAgICAgQHRocm93IFtUU1NMU29ja2V0RXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhSZWFzb246IEAiZmFpbGVkIHRvIGNyZWF0ZSBzb2NrZXQiXTsKLSAgICB9Ci0gICAgCi0gICAgLyogb3BlbiBhIGNvbm5lY3Rpb24gKi8KLSAgICBpZiAoY29ubmVjdCAoc2QsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnBpbiwgc2l6ZW9mKHBpbikpID09IC0xKQotICAgIHsKLSAgICAgICAgTlNMb2coQCJmYWlsZWQgdG8gY3JlYXRlIGNvbmVuY3QgdG8gaG9zdCAlQDolZCIsIGhvc3RuYW1lLCBwb3J0KTsKLSAgICAgICAgQHRocm93IFtUU1NMU29ja2V0RXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhSZWFzb246IEAiZmFpbGVkIHRvIGNvbm5lY3QiXTsKLSAgICB9Ci0gICAgQ0ZTdHJlYW1DcmVhdGVQYWlyV2l0aFNvY2tldChrQ0ZBbGxvY2F0b3JEZWZhdWx0LCBzZCwgJnJlYWRTdHJlYW0sICZ3cml0ZVN0cmVhbSk7Ci0gICAgCi0gICAgQ0ZSZWFkU3RyZWFtU2V0UHJvcGVydHkocmVhZFN0cmVhbSwga0NGU3RyZWFtUHJvcGVydHlTaG91bGRDbG9zZU5hdGl2ZVNvY2tldCwga0NGQm9vbGVhblRydWUpOwotICAgIENGV3JpdGVTdHJlYW1TZXRQcm9wZXJ0eSh3cml0ZVN0cmVhbSwga0NGU3RyZWFtUHJvcGVydHlTaG91bGRDbG9zZU5hdGl2ZVNvY2tldCwga0NGQm9vbGVhblRydWUpOwotICAgIAotCWlmIChyZWFkU3RyZWFtICYmIHdyaXRlU3RyZWFtKSB7Ci0gICAgICAgIENGUmVhZFN0cmVhbVNldFByb3BlcnR5KHJlYWRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDRlN0cmVhbVByb3BlcnR5U29ja2V0U2VjdXJpdHlMZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NGU3RyZWFtU29ja2V0U2VjdXJpdHlMZXZlbFRMU3YxKTsKLSAgICAgICAgCi0gICAgICAgIE5TRGljdGlvbmFyeSAqc2V0dGluZ3MgPQotICAgICAgICBbTlNEaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoT2JqZWN0c0FuZEtleXM6Ci0gICAgICAgICAoaWQpa0NGQm9vbGVhblRydWUsIChpZClrQ0ZTdHJlYW1TU0xWYWxpZGF0ZXNDZXJ0aWZpY2F0ZUNoYWluLAotICAgICAgICAgbmlsXTsKLSAgICAgICAgCi0gICAgICAgIENGUmVhZFN0cmVhbVNldFByb3BlcnR5KChDRlJlYWRTdHJlYW1SZWYpcmVhZFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NGU3RyZWFtUHJvcGVydHlTU0xTZXR0aW5ncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENGVHlwZVJlZilzZXR0aW5ncyk7Ci0gICAgICAgIENGV3JpdGVTdHJlYW1TZXRQcm9wZXJ0eSgoQ0ZXcml0ZVN0cmVhbVJlZil3cml0ZVN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDRlN0cmVhbVByb3BlcnR5U1NMU2V0dGluZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0ZUeXBlUmVmKXNldHRpbmdzKTsKLSAgICAgICAgCi0JCWlucHV0U3RyZWFtID0gKGJyaWRnZV9zdHViIE5TSW5wdXRTdHJlYW0gKilyZWFkU3RyZWFtOwotCQlbaW5wdXRTdHJlYW0gcmV0YWluX3N0dWJdOwotCQlbaW5wdXRTdHJlYW0gc2V0RGVsZWdhdGU6c2VsZl07Ci0gICAJCVtpbnB1dFN0cmVhbSBzY2hlZHVsZUluUnVuTG9vcDpbTlNSdW5Mb29wIG1haW5SdW5Mb29wXSBmb3JNb2RlOk5TRGVmYXVsdFJ1bkxvb3BNb2RlXTsKLQkJW2lucHV0U3RyZWFtIG9wZW5dOwotCQkKLQkJb3V0cHV0U3RyZWFtID0gKGJyaWRnZV9zdHViIE5TT3V0cHV0U3RyZWFtICopd3JpdGVTdHJlYW07Ci0JCVtvdXRwdXRTdHJlYW0gcmV0YWluX3N0dWJdOwotCQlbb3V0cHV0U3RyZWFtIHNldERlbGVnYXRlOnNlbGZdOwotICAgICAgICBbb3V0cHV0U3RyZWFtIHNjaGVkdWxlSW5SdW5Mb29wOltOU1J1bkxvb3AgbWFpblJ1bkxvb3BdIGZvck1vZGU6TlNEZWZhdWx0UnVuTG9vcE1vZGVdOwotCQlbb3V0cHV0U3RyZWFtIG9wZW5dOwotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIENGUmVsZWFzZShyZWFkU3RyZWFtKTsKLSAgICAgICAgQ0ZSZWxlYXNlKHdyaXRlU3RyZWFtKTsKLQl9Ci0gICAgCi0gICAgCi0JCi0Jc2VsZiA9IFtzdXBlciBpbml0V2l0aElucHV0U3RyZWFtOiBpbnB1dFN0cmVhbSBvdXRwdXRTdHJlYW06IG91dHB1dFN0cmVhbV07Ci0gICAgCi0JcmV0dXJuIHNlbGY7Ci19Ci0KLSNwcmFnbWEgbWFyayAtCi0jcHJhZ21hIG1hcmsgTlNTdHJlYW1EZWxlZ2F0ZQotLSAodm9pZClzdHJlYW06KE5TU3RyZWFtICopYVN0cmVhbQotICAgIGhhbmRsZUV2ZW50OihOU1N0cmVhbUV2ZW50KWV2ZW50Q29kZSB7Ci0gICAgc3dpdGNoIChldmVudENvZGUpIHsKLSAgICAgICAgY2FzZSBOU1N0cmVhbUV2ZW50Tm9uZToKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE5TU3RyZWFtRXZlbnRIYXNCeXRlc0F2YWlsYWJsZToKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE5TU3RyZWFtRXZlbnRPcGVuQ29tcGxldGVkOgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTlNTdHJlYW1FdmVudEhhc1NwYWNlQXZhaWxhYmxlOgotICAgICAgICB7Ci0gICAgICAgICAgICBTZWNQb2xpY3lSZWYgcG9saWN5ID0gU2VjUG9saWN5Q3JlYXRlU1NMKE5PLCAoX19icmlkZ2UgQ0ZTdHJpbmdSZWYpKHNzbEhvc3RuYW1lKSk7Ci0gICAgICAgICAgICBTZWNUcnVzdFJlZiB0cnVzdCA9IE5VTEw7Ci0gICAgICAgICAgICBDRkFycmF5UmVmIHN0cmVhbUNlcnRpZmljYXRlc1JlZiA9Ci0gICAgICAgICAgICBDRkJyaWRnaW5nUmV0YWluKChfX2JyaWRnZSBpZCkoKF9fYnJpZGdlIENGQXJyYXlSZWYpKFthU3RyZWFtIHByb3BlcnR5Rm9yS2V5OihOU1N0cmluZyAqKSBrQ0ZTdHJlYW1Qcm9wZXJ0eVNTTFBlZXJDZXJ0aWZpY2F0ZXNdKSkpOwotICAgICAgICAgICAgU2VjVHJ1c3RDcmVhdGVXaXRoQ2VydGlmaWNhdGVzKENGQnJpZGdpbmdSZXRhaW4oKF9fYnJpZGdlIGlkKShzdHJlYW1DZXJ0aWZpY2F0ZXNSZWYpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2xpY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRydXN0KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU2VjVHJ1c3RSZXN1bHRUeXBlIHRydXN0UmVzdWx0VHlwZSA9IGtTZWNUcnVzdFJlc3VsdEludmFsaWQ7Ci0gICAgICAgICAgICBTZWNUcnVzdEV2YWx1YXRlKHRydXN0LCAmdHJ1c3RSZXN1bHRUeXBlKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgQk9PTCBwcm9jZWVkID0gTk87Ci0gICAgICAgICAgICBzd2l0Y2ggKHRydXN0UmVzdWx0VHlwZSkgewotICAgICAgICAgICAgICAgIGNhc2Uga1NlY1RydXN0UmVzdWx0UHJvY2VlZDoKLSAgICAgICAgICAgICAgICAgICAgcHJvY2VlZCA9IFlFUzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBrU2VjVHJ1c3RSZXN1bHRVbnNwZWNpZmllZDoKLSAgICAgICAgICAgICAgICAgICAgTlNMb2coQCJUcnVzdGVkIGJ5IE9TIik7Ci0gICAgICAgICAgICAgICAgICAgIHByb2NlZWQgPSBZRVM7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2Uga1NlY1RydXN0UmVzdWx0UmVjb3ZlcmFibGVUcnVzdEZhaWx1cmU6Ci0gICAgICAgICAgICAgICAgICAgIHByb2NlZWQgPSByZWNvdmVyRnJvbVRydXN0RmFpbHVyZSh0cnVzdCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2Uga1NlY1RydXN0UmVzdWx0RGVueToKLSAgICAgICAgICAgICAgICAgICAgTlNMb2coQCJEZW55Iik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2Uga1NlY1RydXN0UmVzdWx0RmF0YWxUcnVzdEZhaWx1cmU6Ci0gICAgICAgICAgICAgICAgICAgIE5TTG9nKEAiRmF0YWxUcnVzdEZhaWx1cmUiKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBrU2VjVHJ1c3RSZXN1bHRPdGhlckVycm9yOgotICAgICAgICAgICAgICAgICAgICBOU0xvZyhAIk90aGVyRXJyb3IiKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBrU2VjVHJ1c3RSZXN1bHRJbnZhbGlkOgotICAgICAgICAgICAgICAgICAgICBOU0xvZyhAIkludmFsaWQiKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgTlNMb2coQCJEZWZhdWx0Iik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAodHJ1c3QpIHsKLSAgICAgICAgICAgICAgICBDRlJlbGVhc2UodHJ1c3QpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBvbGljeSkgewotICAgICAgICAgICAgICAgIENGUmVsZWFzZShwb2xpY3kpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFwcm9jZWVkKSB7Ci0gICAgICAgICAgICAgICAgTlNMb2coQCJDYW5ub3QgdHJ1c3QgY2VydGlmaWNhdGUuIFRydXN0UmVzdWx0VHlwZTogJXUiLCB0cnVzdFJlc3VsdFR5cGUpOwotICAgICAgICAgICAgICAgIFthU3RyZWFtIGNsb3NlXTsKLSAgICAgICAgICAgICAgICBAdGhyb3cgW1RTU0xTb2NrZXRFeGNlcHRpb24gZXhjZXB0aW9uV2l0aFJlYXNvbjogQCJDYW5ub3QgdHJ1c3QgY2VydGlmaWNhdGUiXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTlNTdHJlYW1FdmVudEVycm9yT2NjdXJyZWQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE5TRXJyb3IgKnRoZUVycm9yID0gW2FTdHJlYW0gc3RyZWFtRXJyb3JdOwotICAgICAgICAgICAgTlNMb2coQCJFcnJvciBvY2N1cnJlZCBvcGVuaW5nIHN0cmVhbTogJUAiLCB0aGVFcnJvcik7Ci0vLyAgICAgICAgICAgIEB0aHJvdyBbVFNTTFNvY2tldEV4Y2VwdGlvbiBleGNlcHRpb25XaXRoUmVhc29uOiBAIkVycm9yIG9jY3VycmVkIG9wZW5pbmcgc3RyZWFtIiBlcnJvcjogdGhlRXJyb3JdOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBOU1N0cmVhbUV2ZW50RW5kRW5jb3VudGVyZWQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLWJvb2wgcmVjb3ZlckZyb21UcnVzdEZhaWx1cmUoU2VjVHJ1c3RSZWYgbXlUcnVzdCkKLXsKLSAgICAKLSAgICBTZWNUcnVzdFJlc3VsdFR5cGUgdHJ1c3RSZXN1bHQ7Ci0gICAgT1NTdGF0dXMgc3RhdHVzID0gU2VjVHJ1c3RFdmFsdWF0ZShteVRydXN0LCAmdHJ1c3RSZXN1bHQpOwotICAgIAotICAgIENGQWJzb2x1dGVUaW1lIHRydXN0VGltZSxjdXJyZW50VGltZSx0aW1lSW5jcmVtZW50LG5ld1RpbWU7Ci0gICAgQ0ZEYXRlUmVmIG5ld0RhdGU7Ci0gICAgaWYgKHRydXN0UmVzdWx0ID09IGtTZWNUcnVzdFJlc3VsdFJlY292ZXJhYmxlVHJ1c3RGYWlsdXJlKSB7Ci0gICAgICAgIHRydXN0VGltZSA9IFNlY1RydXN0R2V0VmVyaWZ5VGltZShteVRydXN0KTsKLSAgICAgICAgdGltZUluY3JlbWVudCA9IDMxNTM2MDAwOwotICAgICAgICBjdXJyZW50VGltZSA9IENGQWJzb2x1dGVUaW1lR2V0Q3VycmVudCgpOwotICAgICAgICBuZXdUaW1lID0gY3VycmVudFRpbWUgLSB0aW1lSW5jcmVtZW50OwotICAgICAgICBpZiAodHJ1c3RUaW1lIC0gbmV3VGltZSl7Ci0gICAgICAgICAgICBuZXdEYXRlID0gQ0ZEYXRlQ3JlYXRlKE5VTEwsIG5ld1RpbWUpOwotICAgICAgICAgICAgU2VjVHJ1c3RTZXRWZXJpZnlEYXRlKG15VHJ1c3QsIG5ld0RhdGUpOwotICAgICAgICAgICAgc3RhdHVzID0gU2VjVHJ1c3RFdmFsdWF0ZShteVRydXN0LCAmdHJ1c3RSZXN1bHQpOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmICh0cnVzdFJlc3VsdCAhPSBrU2VjVHJ1c3RSZXN1bHRQcm9jZWVkKSB7Ci0gICAgICAgIE5TTG9nKEAiQ2VydGlmaWNhdGUgdHJ1c3QgZmFpbHVyZSIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi0tICh2b2lkKWNsb3NlCi17Ci0gICAgaWYoc2VsZi5tSW5wdXQpIHsKLSAgICAgICAgLy9DbG9zZSBhbmQgcmVzZXQgaW5wdXRzdHJlYW0KLSAgICAgICAgQ0ZSZWFkU3RyZWFtU2V0UHJvcGVydHkoKF9fYnJpZGdlIENGUmVhZFN0cmVhbVJlZikoc2VsZi5tSW5wdXQpLCBrQ0ZTdHJlYW1Qcm9wZXJ0eVNob3VsZENsb3NlTmF0aXZlU29ja2V0LCBrQ0ZCb29sZWFuVHJ1ZSk7Ci0gICAgICAgIFtzZWxmLm1JbnB1dCBzZXREZWxlZ2F0ZTpuaWxdOwotICAgICAgICBbc2VsZi5tSW5wdXQgY2xvc2VdOwotICAgICAgICBbc2VsZi5tSW5wdXQgcmVtb3ZlRnJvbVJ1bkxvb3A6W05TUnVuTG9vcCBjdXJyZW50UnVuTG9vcF0gZm9yTW9kZTpOU0RlZmF1bHRSdW5Mb29wTW9kZV07Ci0gICAgICAgIHNlbGYubUlucHV0ID0gbmlsOwotICAgIH0KLSAgICAKLSAgICBpZihzZWxmLm1PdXRwdXQpIHsKLSAgICAgICAgLy9DbG9zZSBhbmQgcmVzZXQgb3V0cHV0c3RyZWFtCi0gICAgICAgIENGUmVhZFN0cmVhbVNldFByb3BlcnR5KChfX2JyaWRnZSBDRlJlYWRTdHJlYW1SZWYpKHNlbGYubU91dHB1dCksIGtDRlN0cmVhbVByb3BlcnR5U2hvdWxkQ2xvc2VOYXRpdmVTb2NrZXQsIGtDRkJvb2xlYW5UcnVlKTsKLSAgICAgICAgW3NlbGYubU91dHB1dCBzZXREZWxlZ2F0ZTpuaWxdOwotICAgICAgICBbc2VsZi5tT3V0cHV0IGNsb3NlXTsKLSAgICAgICAgW3NlbGYubU91dHB1dCByZW1vdmVGcm9tUnVuTG9vcDpbTlNSdW5Mb29wIGN1cnJlbnRSdW5Mb29wXSBmb3JNb2RlOk5TRGVmYXVsdFJ1bkxvb3BNb2RlXTsKLSAgICAgICAgc2VsZi5tT3V0cHV0ID0gbmlsOwotICAgIH0KLX0KLQotLSAoQk9PTCkgaXNPcGVuCi17Ci0gICAgaWYoc2QgPiAwKQotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBGQUxTRTsKLX0KLQotQGVuZAotCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0RXhjZXB0aW9uLmggYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0RXhjZXB0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyOTBiMDUuLjAwMDAwMDAKLS0tIGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNTTFNvY2tldEV4Y2VwdGlvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW1wb3J0ICJUVHJhbnNwb3J0RXhjZXB0aW9uLmgiCi0KLUBpbnRlcmZhY2UgVFNTTFNvY2tldEV4Y2VwdGlvbiA6IFRUcmFuc3BvcnRFeGNlcHRpb24KLQotKyAoaWQpIGV4Y2VwdGlvbldpdGhSZWFzb246IChOU1N0cmluZyAqKSByZWFzb24KLSAgICAgICAgICAgICAgICAgICAgIGVycm9yOiAoTlNFcnJvciAqKSBlcnJvcjsKLQotKyAoaWQpIGV4Y2VwdGlvbldpdGhSZWFzb246IChOU1N0cmluZyAqKSByZWFzb247Ci0KLUBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXRFeGNlcHRpb24ubSBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXRFeGNlcHRpb24ubQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTllYWRmNS4uMDAwMDAwMAotLS0gYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0RXhjZXB0aW9uLm0KKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbXBvcnQgIlRTU0xTb2NrZXRFeGNlcHRpb24uaCIKLQotQGltcGxlbWVudGF0aW9uIFRTU0xTb2NrZXRFeGNlcHRpb24KLQotKyAoaWQpIGV4Y2VwdGlvbldpdGhSZWFzb246IChOU1N0cmluZyAqKSByZWFzb24KLSAgICAgICAgICAgICAgICAgICAgIGVycm9yOiAoTlNFcnJvciAqKSBlcnJvcgotewotICAgIE5TRGljdGlvbmFyeSAqIHVzZXJJbmZvID0gbmlsOwotICAgIGlmIChlcnJvciAhPSBuaWwpIHsKLSAgICAgICAgdXNlckluZm8gPSBbTlNEaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoT2JqZWN0OiBlcnJvciBmb3JLZXk6IEAiZXJyb3IiXTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIFtzdXBlciBleGNlcHRpb25XaXRoTmFtZTogQCJUU1NMU29ja2V0RXhjZXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IHJlYXNvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86IHVzZXJJbmZvXTsKLX0KLQotKyAoaWQpIGV4Y2VwdGlvbldpdGhSZWFzb246IChOU1N0cmluZyAqKSByZWFzb24KLXsKLSAgICByZXR1cm4gW3NlbGYgZXhjZXB0aW9uV2l0aFJlYXNvbjogcmVhc29uIGVycm9yOiBuaWxdOwotfQotCi1AZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0VHJhbnNwb3J0LmggYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0VHJhbnNwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYwNmM0YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXRUcmFuc3BvcnQuaApAQCAtMCwwICsxLDM3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgorI2ltcG9ydCAiVE5TU3RyZWFtVHJhbnNwb3J0LmgiCisKK05TX0FTU1VNRV9OT05OVUxMX0JFR0lOCisKKworQGludGVyZmFjZSBUU1NMU29ja2V0VHJhbnNwb3J0IDogVE5TU3RyZWFtVHJhbnNwb3J0IDxOU1N0cmVhbURlbGVnYXRlPgorCistKGlkKSBpbml0V2l0aEhvc3RuYW1lOihOU1N0cmluZyAqKWhvc3RuYW1lCisgICAgICAgICAgICAgICAgICBwb3J0OihpbnQpcG9ydAorICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqKillcnJvcjsKKworLShCT09MKSBpc09wZW47CisKK0BlbmQKKworCitOU19BU1NVTUVfTk9OTlVMTF9FTkQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXRUcmFuc3BvcnQubSBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXRUcmFuc3BvcnQubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjEyMTRmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNTTFNvY2tldFRyYW5zcG9ydC5tCkBAIC0wLDAgKzEsMzA0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KKyNpbXBvcnQgPENvcmVGb3VuZGF0aW9uL0NvcmVGb3VuZGF0aW9uLmg+CisjaW1wb3J0ICJUU1NMU29ja2V0VHJhbnNwb3J0LmgiCisjaW1wb3J0ICJUU1NMU29ja2V0VHJhbnNwb3J0RXJyb3IuaCIKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisKKyNpZiAhVEFSR0VUX09TX0lQSE9ORQorI2ltcG9ydCA8Q29yZVNlcnZpY2VzL0NvcmVTZXJ2aWNlcy5oPgorI2Vsc2UKKyNpbXBvcnQgPENGTmV0d29yay9DRk5ldHdvcmsuaD4KKyNlbmRpZgorCitAaW50ZXJmYWNlIFRTU0xTb2NrZXRUcmFuc3BvcnQgKCkKKworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBOU1N0cmluZyAqc3NsSG9zdG5hbWU7CitAcHJvcGVydHkoYXNzaWduLCBub25hdG9taWMpIGludCBzZDsKKworQGVuZAorCisKK0BpbXBsZW1lbnRhdGlvbiBUU1NMU29ja2V0VHJhbnNwb3J0CisKKy0oaWQpIGluaXRXaXRoSG9zdG5hbWU6KE5TU3RyaW5nICopaG9zdG5hbWUKKyAgICAgICAgICAgICAgICAgIHBvcnQ6KGludClwb3J0CisgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICoqKWVycm9yCit7CisgIF9zc2xIb3N0bmFtZSA9IGhvc3RuYW1lOworICBDRlJlYWRTdHJlYW1SZWYgcmVhZFN0cmVhbSA9IE5VTEw7CisgIENGV3JpdGVTdHJlYW1SZWYgd3JpdGVTdHJlYW0gPSBOVUxMOworCisKKyAgLyogY3JlYXRlIGEgc29ja2V0IHN0cnVjdHVyZSAqLworICBzdHJ1Y3Qgc29ja2FkZHJfaW4gcGluOworICBzdHJ1Y3QgaG9zdGVudCAqaHAgPSBOVUxMOworICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKKworCisKKyAgICBpZiAoKGhwID0gZ2V0aG9zdGJ5bmFtZShbaG9zdG5hbWUgVVRGOFN0cmluZ10pKSA9PSBOVUxMKSB7CisgICAgICBOU0xvZyhAImZhaWxlZCB0byByZXNvbHZlIGhvc3RuYW1lICVAIiwgaG9zdG5hbWUpOworICAgICAgaGVycm9yKCJyZXNvbHYiKTsKKyAgICAgIGlmIChpID09IDkpIHsKKyAgICAgICAgaWYgKGVycm9yKSB7CisgICAgICAgICAgKmVycm9yID0gW05TRXJyb3IgZXJyb3JXaXRoRG9tYWluOlRTU0xTb2NrZXRUcmFuc3BvcnRFcnJvckRvbWFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTpUU1NMU29ja2V0VHJhbnNwb3J0RXJyb3JIb3N0YW5hbWVSZXNvbHV0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOm5pbF07CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5pbDsKKyAgICAgIH0KKyAgICAgIFtOU1RocmVhZCBzbGVlcEZvclRpbWVJbnRlcnZhbDowLjJdOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIG1lbXNldCgmcGluLCAwLCBzaXplb2YocGluKSk7CisgIHBpbi5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgbWVtY3B5KCZwaW4uc2luX2FkZHIsIGhwLT5oX2FkZHIsIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpOworICBwaW4uc2luX3BvcnQgPSBodG9ucyhwb3J0KTsKKworICAvKiBjcmVhdGUgdGhlIHNvY2tldCAqLworICBpZiAoKF9zZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1ApKSA9PSAtMSkgeworICAgIE5TTG9nKEAiZmFpbGVkIHRvIGNyZWF0ZSBzb2NrZXQgZm9yIGhvc3QgJUA6JWQiLCBob3N0bmFtZSwgcG9ydCk7CisgICAgaWYgKGVycm9yKSB7CisgICAgICAqZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFNTTFNvY2tldFRyYW5zcG9ydEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFNTTFNvY2tldFRyYW5zcG9ydEVycm9yU29ja2V0Q3JlYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86bmlsXTsKKyAgICB9CisgICAgcmV0dXJuIG5pbDsKKyAgfQorCisgIC8qIG9wZW4gYSBjb25uZWN0aW9uICovCisgIGlmIChjb25uZWN0KF9zZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZwaW4sIHNpemVvZihwaW4pKSA9PSAtMSkgeworICAgIE5TTG9nKEAiZmFpbGVkIHRvIGNyZWF0ZSBjb25lbmN0IHRvIGhvc3QgJUA6JWQiLCBob3N0bmFtZSwgcG9ydCk7CisgICAgaWYgKGVycm9yKSB7CisgICAgICAqZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFNTTFNvY2tldFRyYW5zcG9ydEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFNTTFNvY2tldFRyYW5zcG9ydEVycm9yQ29ubmVjdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOm5pbF07CisgICAgfQorICAgIHJldHVybiBuaWw7CisgIH0KKyAgQ0ZTdHJlYW1DcmVhdGVQYWlyV2l0aFNvY2tldChrQ0ZBbGxvY2F0b3JEZWZhdWx0LCBfc2QsICZyZWFkU3RyZWFtLCAmd3JpdGVTdHJlYW0pOworCisgIENGUmVhZFN0cmVhbVNldFByb3BlcnR5KHJlYWRTdHJlYW0sIGtDRlN0cmVhbVByb3BlcnR5U2hvdWxkQ2xvc2VOYXRpdmVTb2NrZXQsIGtDRkJvb2xlYW5UcnVlKTsKKyAgQ0ZXcml0ZVN0cmVhbVNldFByb3BlcnR5KHdyaXRlU3RyZWFtLCBrQ0ZTdHJlYW1Qcm9wZXJ0eVNob3VsZENsb3NlTmF0aXZlU29ja2V0LCBrQ0ZCb29sZWFuVHJ1ZSk7CisKKyAgTlNJbnB1dFN0cmVhbSAqaW5wdXRTdHJlYW07CisgIE5TT3V0cHV0U3RyZWFtICpvdXRwdXRTdHJlYW07CisKKyAgaWYgKHJlYWRTdHJlYW0gJiYgd3JpdGVTdHJlYW0pIHsKKworICAgIENGUmVhZFN0cmVhbVNldFByb3BlcnR5KHJlYWRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NGU3RyZWFtUHJvcGVydHlTb2NrZXRTZWN1cml0eUxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDRlN0cmVhbVNvY2tldFNlY3VyaXR5TGV2ZWxUTFN2MSk7CisKKyAgICBOU0RpY3Rpb25hcnkgKnNldHRpbmdzID0gQHsoX19icmlkZ2UgTlNTdHJpbmcgKilrQ0ZTdHJlYW1TU0xWYWxpZGF0ZXNDZXJ0aWZpY2F0ZUNoYWluOiBAWUVTfTsKKworICAgIENGUmVhZFN0cmVhbVNldFByb3BlcnR5KChDRlJlYWRTdHJlYW1SZWYpcmVhZFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ0ZTdHJlYW1Qcm9wZXJ0eVNTTFNldHRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDRlR5cGVSZWYpc2V0dGluZ3MpOworCisgICAgQ0ZXcml0ZVN0cmVhbVNldFByb3BlcnR5KChDRldyaXRlU3RyZWFtUmVmKXdyaXRlU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ0ZTdHJlYW1Qcm9wZXJ0eVNTTFNldHRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0ZUeXBlUmVmKXNldHRpbmdzKTsKKworICAgIGlucHV0U3RyZWFtID0gKF9fYnJpZGdlIE5TSW5wdXRTdHJlYW0gKilyZWFkU3RyZWFtOworICAgIFtpbnB1dFN0cmVhbSBzZXREZWxlZ2F0ZTpzZWxmXTsKKyAgICBbaW5wdXRTdHJlYW0gc2NoZWR1bGVJblJ1bkxvb3A6W05TUnVuTG9vcCBjdXJyZW50UnVuTG9vcF0gZm9yTW9kZTpOU0RlZmF1bHRSdW5Mb29wTW9kZV07CisgICAgW2lucHV0U3RyZWFtIG9wZW5dOworCisgICAgb3V0cHV0U3RyZWFtID0gKF9fYnJpZGdlIE5TT3V0cHV0U3RyZWFtICopd3JpdGVTdHJlYW07CisgICAgW291dHB1dFN0cmVhbSBzZXREZWxlZ2F0ZTpzZWxmXTsKKyAgICBbb3V0cHV0U3RyZWFtIHNjaGVkdWxlSW5SdW5Mb29wOltOU1J1bkxvb3AgY3VycmVudFJ1bkxvb3BdIGZvck1vZGU6TlNEZWZhdWx0UnVuTG9vcE1vZGVdOworICAgIFtvdXRwdXRTdHJlYW0gb3Blbl07CisKKyAgICBDRlJlbGVhc2UocmVhZFN0cmVhbSk7CisgICAgQ0ZSZWxlYXNlKHdyaXRlU3RyZWFtKTsKKyAgfQorCisgIHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhJbnB1dFN0cmVhbTppbnB1dFN0cmVhbSBvdXRwdXRTdHJlYW06b3V0cHV0U3RyZWFtXTsKKworICByZXR1cm4gc2VsZjsKK30KKworLSh2b2lkKSBkZWFsbG9jCit7CisgIFtzZWxmIGNsb3NlXTsKK30KKworI3ByYWdtYSBtYXJrIC0KKyNwcmFnbWEgbWFyayBOU1N0cmVhbURlbGVnYXRlCisKKy0odm9pZCkgc3RyZWFtOihOU1N0cmVhbSAqKWFTdHJlYW0KKyAgIGhhbmRsZUV2ZW50OihOU1N0cmVhbUV2ZW50KWV2ZW50Q29kZQoreworICBzd2l0Y2ggKGV2ZW50Q29kZSkgeworICBjYXNlIE5TU3RyZWFtRXZlbnROb25lOgorICAgIGJyZWFrOworCisgIGNhc2UgTlNTdHJlYW1FdmVudEhhc0J5dGVzQXZhaWxhYmxlOgorICAgIGJyZWFrOworCisgIGNhc2UgTlNTdHJlYW1FdmVudE9wZW5Db21wbGV0ZWQ6CisgICAgYnJlYWs7CisKKyAgY2FzZSBOU1N0cmVhbUV2ZW50SGFzU3BhY2VBdmFpbGFibGU6IHsKKworICAgIEJPT0wgcHJvY2VlZCA9IE5POworICAgIFNlY1RydXN0UmVzdWx0VHlwZSB0cnVzdFJlc3VsdCA9IGtTZWNUcnVzdFJlc3VsdEludmFsaWQ7CisgICAgQ0ZNdXRhYmxlQXJyYXlSZWYgbmV3UG9saWNpZXMgPSBOVUxMOworCisgICAgZG8geworCisgICAgICBTZWNUcnVzdFJlZiB0cnVzdCA9IChfX2JyaWRnZSBTZWNUcnVzdFJlZilbYVN0cmVhbSBwcm9wZXJ0eUZvcktleTooTlNTdHJpbmcgKilrQ0ZTdHJlYW1Qcm9wZXJ0eVNTTFBlZXJUcnVzdF07CisKKyAgICAgIC8vIEFkZCBuZXcgcG9saWN5IHRvIGN1cnJlbnQgbGlzdCBvZiBwb2xpY2llcworICAgICAgU2VjUG9saWN5UmVmIHBvbGljeSA9IFNlY1BvbGljeUNyZWF0ZVNTTChOTywgKF9fYnJpZGdlIENGU3RyaW5nUmVmKShfc3NsSG9zdG5hbWUpKTsKKyAgICAgIGlmICghcG9saWN5KSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBDRkFycmF5UmVmIHBvbGljaWVzOworICAgICAgaWYgKFNlY1RydXN0Q29weVBvbGljaWVzKHRydXN0LCAmcG9saWNpZXMpICE9IGVyclNlY1N1Y2Nlc3MpIHsKKyAgICAgICAgQ0ZSZWxlYXNlKHBvbGljeSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBuZXdQb2xpY2llcyA9IENGQXJyYXlDcmVhdGVNdXRhYmxlQ29weShOVUxMLCAwLCBwb2xpY2llcyk7CisgICAgICBDRkFycmF5QXBwZW5kVmFsdWUobmV3UG9saWNpZXMsIHBvbGljeSk7CisKKyAgICAgIENGUmVsZWFzZShwb2xpY2llcyk7CisgICAgICBDRlJlbGVhc2UocG9saWN5KTsKKworICAgICAgLy8gVXBkYXRlIHRydXN0IHBvbGljaWVzCisgICAgICBpZiAoU2VjVHJ1c3RTZXRQb2xpY2llcyh0cnVzdCwgbmV3UG9saWNpZXMpICE9IGVyclNlY1N1Y2Nlc3MpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8vIEV2YWx1YXRlIHRoZSB0cnVzdCBjaGFpbgorICAgICAgaWYgKFNlY1RydXN0RXZhbHVhdGUodHJ1c3QsICZ0cnVzdFJlc3VsdCkgIT0gZXJyU2VjU3VjY2VzcykgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgc3dpdGNoICh0cnVzdFJlc3VsdCkgeworICAgICAgY2FzZSBrU2VjVHJ1c3RSZXN1bHRQcm9jZWVkOgorICAgICAgICAvLyBOU0xvZyhAIlRydXN0ZWQgYnkgVVNFUiIpOworICAgICAgICBwcm9jZWVkID0gWUVTOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBrU2VjVHJ1c3RSZXN1bHRVbnNwZWNpZmllZDoKKyAgICAgICAgLy8gTlNMb2coQCJUcnVzdGVkIGJ5IE9TIik7CisgICAgICAgIHByb2NlZWQgPSBZRVM7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIGtTZWNUcnVzdFJlc3VsdFJlY292ZXJhYmxlVHJ1c3RGYWlsdXJlOgorICAgICAgICBwcm9jZWVkID0gcmVjb3ZlckZyb21UcnVzdEZhaWx1cmUodHJ1c3QsIHRydXN0UmVzdWx0KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2Uga1NlY1RydXN0UmVzdWx0RGVueToKKyAgICAgICAgLy8gTlNMb2coQCJEZW55Iik7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIGtTZWNUcnVzdFJlc3VsdEZhdGFsVHJ1c3RGYWlsdXJlOgorICAgICAgICAvLyBOU0xvZyhAIkZhdGFsVHJ1c3RGYWlsdXJlIik7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIGtTZWNUcnVzdFJlc3VsdE90aGVyRXJyb3I6CisgICAgICAgIC8vIE5TTG9nKEAiT3RoZXJFcnJvciIpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBrU2VjVHJ1c3RSZXN1bHRJbnZhbGlkOgorICAgICAgICAvLyBOU0xvZyhAIkludmFsaWQiKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIC8vIE5TTG9nKEAiRGVmYXVsdCIpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgIH0KKyAgICB3aGlsZSAoTk8pOworCisgICAgaWYgKCFwcm9jZWVkKSB7CisgICAgICBOU0xvZyhAIlRTU0xTb2NrZXRUcmFuc3BvcnQ6IENhbm5vdCB0cnVzdCBjZXJ0aWZpY2F0ZS4gUmVzdWx0OiAldSIsIHRydXN0UmVzdWx0KTsKKyAgICAgIFthU3RyZWFtIGNsb3NlXTsKKyAgICB9CisKKyAgICBpZiAobmV3UG9saWNpZXMpIHsKKyAgICAgIENGUmVsZWFzZShuZXdQb2xpY2llcyk7CisgICAgfQorCisgIH0KKyAgYnJlYWs7CisKKyAgY2FzZSBOU1N0cmVhbUV2ZW50RXJyb3JPY2N1cnJlZDogeworICAgIE5TTG9nKEAiVFNTTFNvY2tldFRyYW5zcG9ydDogRXJyb3Igb2NjdXJyZWQgb3BlbmluZyBzdHJlYW06ICVAIiwgW2FTdHJlYW0gc3RyZWFtRXJyb3JdKTsKKyAgICBicmVhazsKKyAgfQorCisgIGNhc2UgTlNTdHJlYW1FdmVudEVuZEVuY291bnRlcmVkOgorICAgIGJyZWFrOworICB9Cit9CisKK0JPT0wgcmVjb3ZlckZyb21UcnVzdEZhaWx1cmUoU2VjVHJ1c3RSZWYgbXlUcnVzdCwgU2VjVHJ1c3RSZXN1bHRUeXBlIGxhc3RUcnVzdFJlc3VsdCkKK3sKKyAgQ0ZBYnNvbHV0ZVRpbWUgdHJ1c3RUaW1lID0gU2VjVHJ1c3RHZXRWZXJpZnlUaW1lKG15VHJ1c3QpOworICBDRkFic29sdXRlVGltZSBjdXJyZW50VGltZSA9IENGQWJzb2x1dGVUaW1lR2V0Q3VycmVudCgpOworCisgIENGQWJzb2x1dGVUaW1lIHRpbWVJbmNyZW1lbnQgPSAzMTUzNjAwMDsKKyAgQ0ZBYnNvbHV0ZVRpbWUgbmV3VGltZSA9IGN1cnJlbnRUaW1lIC0gdGltZUluY3JlbWVudDsKKworICBpZiAodHJ1c3RUaW1lIC0gbmV3VGltZSkgeworCisgICAgQ0ZEYXRlUmVmIG5ld0RhdGUgPSBDRkRhdGVDcmVhdGUoTlVMTCwgbmV3VGltZSk7CisgICAgU2VjVHJ1c3RTZXRWZXJpZnlEYXRlKG15VHJ1c3QsIG5ld0RhdGUpOworICAgIENGUmVsZWFzZShuZXdEYXRlKTsKKworICAgIGlmIChTZWNUcnVzdEV2YWx1YXRlKG15VHJ1c3QsICZsYXN0VHJ1c3RSZXN1bHQpICE9IGVyclNlY1N1Y2Nlc3MpIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisKKyAgfQorCisgIGlmIChsYXN0VHJ1c3RSZXN1bHQgPT0ga1NlY1RydXN0UmVzdWx0UHJvY2VlZCB8fCBsYXN0VHJ1c3RSZXN1bHQgPT0ga1NlY1RydXN0UmVzdWx0VW5zcGVjaWZpZWQpIHsKKyAgICByZXR1cm4gWUVTOworICB9CisKKyAgTlNMb2coQCJUU1NMU29ja2V0VHJhbnNwb3J0OiBVbmFibGUgdG8gcmVjb3ZlciBjZXJ0aWZpY2F0ZSB0cnVzdCBmYWlsdXJlIik7CisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgaXNPcGVuCit7CisgIGlmIChfc2QgPiAwKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgZWxzZSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK0BlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXRUcmFuc3BvcnRFcnJvci5oIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNTTFNvY2tldFRyYW5zcG9ydEVycm9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE3ZjM5ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXRUcmFuc3BvcnRFcnJvci5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCAiVFRyYW5zcG9ydEVycm9yLmgiCisKKworZXh0ZXJuIE5TU3RyaW5nICpUU1NMU29ja2V0VHJhbnNwb3J0RXJyb3JEb21haW47CisKKwordHlwZWRlZiBOU19FTlVNIChpbnQsIFRTU0xTb2NrZXRUcmFuc3BvcnRFcnJvcikgeworICBUU1NMU29ja2V0VHJhbnNwb3J0RXJyb3JIb3N0YW5hbWVSZXNvbHV0aW9uICA9IC0xMDAwMCwKKyAgVFNTTFNvY2tldFRyYW5zcG9ydEVycm9yU29ja2V0Q3JlYXRlICAgICAgICAgPSAtMTAwMDEsCisgIFRTU0xTb2NrZXRUcmFuc3BvcnRFcnJvckNvbm5lY3QgICAgICAgICAgICAgID0gLTEwMDAyLAorfTsKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXRUcmFuc3BvcnRFcnJvci5tIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNTTFNvY2tldFRyYW5zcG9ydEVycm9yLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNmOTQxYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXRUcmFuc3BvcnRFcnJvci5tCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCAiVFNTTFNvY2tldFRyYW5zcG9ydEVycm9yLmgiCisKKworTlNTdHJpbmcgKlRTU0xTb2NrZXRUcmFuc3BvcnRFcnJvckRvbWFpbiA9IEAiVFNTTFNvY2tldFRyYW5zcG9ydEVycm9yRG9tYWluIjsKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTb2NrZXRDbGllbnQuaCBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTb2NrZXRDbGllbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFhMDI0Ny4uMDAwMDAwMAotLS0gYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU29ja2V0Q2xpZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgotI2ltcG9ydCAiVE5TU3RyZWFtVHJhbnNwb3J0LmgiCi0KLUBpbnRlcmZhY2UgVFNvY2tldENsaWVudCA6IFROU1N0cmVhbVRyYW5zcG9ydCAKLSNpZiBUQVJHRVRfT1NfSVBIT05FIHx8IChNQUNfT1NfWF9WRVJTSU9OX01BWF9BTExPV0VEID49IE1BQ19PU19YX1ZFUlNJT05fMTBfNikKLTxOU1N0cmVhbURlbGVnYXRlPgotI2VuZGlmCi17Ci19Ci0KLS0gKGlkKSBpbml0V2l0aEhvc3RuYW1lOiAoTlNTdHJpbmcgKikgaG9zdG5hbWUKLSAgICAgICAgICAgICAgICAgICBwb3J0OiAoVUludDMyKSBwb3J0OwotCi1AZW5kCi0KLQotCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU29ja2V0Q2xpZW50Lm0gYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU29ja2V0Q2xpZW50Lm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwYmFjNzQuLjAwMDAwMDAKLS0tIGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNvY2tldENsaWVudC5tCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI2ltcG9ydCAiVFNvY2tldENsaWVudC5oIgotI2ltcG9ydCAiVE9iamVjdGl2ZS1DLmgiCi0KLSNpZiAhVEFSR0VUX09TX0lQSE9ORQotI2ltcG9ydCA8Q29yZVNlcnZpY2VzL0NvcmVTZXJ2aWNlcy5oPgotI2Vsc2UKLSNpbXBvcnQgPENGTmV0d29yay9DRk5ldHdvcmsuaD4KLSNlbmRpZgotCi1AaW50ZXJmYWNlIFRTb2NrZXRDbGllbnQgKCkKLXsKLSAgICBOU0lucHV0U3RyZWFtICogaW5wdXRTdHJlYW07Ci0JTlNPdXRwdXRTdHJlYW0gKiBvdXRwdXRTdHJlYW07Ci19Ci1AZW5kCi0KLUBpbXBsZW1lbnRhdGlvbiBUU29ja2V0Q2xpZW50Ci0KLS0gKGlkKSBpbml0V2l0aEhvc3RuYW1lOiAoTlNTdHJpbmcgKikgaG9zdG5hbWUKLSAgICAgICAgICAgICAgICAgICBwb3J0OiAoVUludDMyKSBwb3J0Ci17Ci0JaW5wdXRTdHJlYW0gPSBOVUxMOwotCW91dHB1dFN0cmVhbSA9IE5VTEw7Ci0JQ0ZSZWFkU3RyZWFtUmVmIHJlYWRTdHJlYW0gPSBOVUxMOwotCUNGV3JpdGVTdHJlYW1SZWYgd3JpdGVTdHJlYW0gPSBOVUxMOwotCUNGU3RyZWFtQ3JlYXRlUGFpcldpdGhTb2NrZXRUb0hvc3Qoa0NGQWxsb2NhdG9yRGVmYXVsdCwgKGJyaWRnZV9zdHViIENGU3RyaW5nUmVmKWhvc3RuYW1lLCBwb3J0LCAmcmVhZFN0cmVhbSwgJndyaXRlU3RyZWFtKTsKLQlpZiAocmVhZFN0cmVhbSAmJiB3cml0ZVN0cmVhbSkgewotCQlDRlJlYWRTdHJlYW1TZXRQcm9wZXJ0eShyZWFkU3RyZWFtLCBrQ0ZTdHJlYW1Qcm9wZXJ0eVNob3VsZENsb3NlTmF0aXZlU29ja2V0LCBrQ0ZCb29sZWFuVHJ1ZSk7Ci0JCUNGV3JpdGVTdHJlYW1TZXRQcm9wZXJ0eSh3cml0ZVN0cmVhbSwga0NGU3RyZWFtUHJvcGVydHlTaG91bGRDbG9zZU5hdGl2ZVNvY2tldCwga0NGQm9vbGVhblRydWUpOwotCQkKLQkJaW5wdXRTdHJlYW0gPSAoYnJpZGdlX3N0dWIgTlNJbnB1dFN0cmVhbSAqKXJlYWRTdHJlYW07Ci0JCVtpbnB1dFN0cmVhbSByZXRhaW5fc3R1Yl07Ci0JCVtpbnB1dFN0cmVhbSBzZXREZWxlZ2F0ZTpzZWxmXTsKLQkJW2lucHV0U3RyZWFtIHNjaGVkdWxlSW5SdW5Mb29wOltOU1J1bkxvb3AgY3VycmVudFJ1bkxvb3BdIGZvck1vZGU6TlNEZWZhdWx0UnVuTG9vcE1vZGVdOwotCQlbaW5wdXRTdHJlYW0gb3Blbl07Ci0JCQotCQlvdXRwdXRTdHJlYW0gPSAoYnJpZGdlX3N0dWIgTlNPdXRwdXRTdHJlYW0gKil3cml0ZVN0cmVhbTsKLQkJW291dHB1dFN0cmVhbSByZXRhaW5fc3R1Yl07Ci0JCVtvdXRwdXRTdHJlYW0gc2V0RGVsZWdhdGU6c2VsZl07Ci0JCVtvdXRwdXRTdHJlYW0gc2NoZWR1bGVJblJ1bkxvb3A6W05TUnVuTG9vcCBjdXJyZW50UnVuTG9vcF0gZm9yTW9kZTpOU0RlZmF1bHRSdW5Mb29wTW9kZV07Ci0JCVtvdXRwdXRTdHJlYW0gb3Blbl07Ci0gICAgICAgIENGUmVsZWFzZShyZWFkU3RyZWFtKTsKLSAgICAgICAgQ0ZSZWxlYXNlKHdyaXRlU3RyZWFtKTsKLQl9Ci0JCi0Jc2VsZiA9IFtzdXBlciBpbml0V2l0aElucHV0U3RyZWFtOiBpbnB1dFN0cmVhbSBvdXRwdXRTdHJlYW06IG91dHB1dFN0cmVhbV07Ci0JCi0JcmV0dXJuIHNlbGY7Ci19Ci0KLS0odm9pZClkZWFsbG9jCi17Ci0gICAgW2lucHV0U3RyZWFtIGNsb3NlXTsKLSAgICBbaW5wdXRTdHJlYW0gcmVtb3ZlRnJvbVJ1bkxvb3A6W05TUnVuTG9vcCBjdXJyZW50UnVuTG9vcF0gZm9yTW9kZTpOU0RlZmF1bHRSdW5Mb29wTW9kZV07Ci0gICAgW2lucHV0U3RyZWFtIHNldERlbGVnYXRlOm5pbF07Ci0gICAgW2lucHV0U3RyZWFtIHJlbGVhc2Vfc3R1Yl07Ci0gICAgCi0gICAgW291dHB1dFN0cmVhbSBjbG9zZV07Ci0gICAgW291dHB1dFN0cmVhbSByZW1vdmVGcm9tUnVuTG9vcDpbTlNSdW5Mb29wIGN1cnJlbnRSdW5Mb29wXSBmb3JNb2RlOk5TRGVmYXVsdFJ1bkxvb3BNb2RlXTsKLSAgICBbb3V0cHV0U3RyZWFtIHNldERlbGVnYXRlOm5pbF07Ci0gICAgW291dHB1dFN0cmVhbSByZWxlYXNlX3N0dWJdOwotICAgIFtzdXBlciBkZWFsbG9jX3N0dWJdOwotfQotCi0KLUBlbmQKLQotCi0KZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTb2NrZXRUcmFuc3BvcnQuaCBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTb2NrZXRUcmFuc3BvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2I5MWEyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNvY2tldFRyYW5zcG9ydC5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+CisjaW1wb3J0ICJUTlNTdHJlYW1UcmFuc3BvcnQuaCIKKworTlNfQVNTVU1FX05PTk5VTExfQkVHSU4KKworCitAaW50ZXJmYWNlIFRTb2NrZXRUcmFuc3BvcnQgOiBUTlNTdHJlYW1UcmFuc3BvcnQKKworLShpZCkgaW5pdFdpdGhIb3N0bmFtZTooTlNTdHJpbmcgKilob3N0bmFtZQorICAgICAgICAgICAgICAgICAgcG9ydDooaW50KXBvcnQ7CisKKy0oaWQpIGluaXRXaXRoUGF0aDooTlNTdHJpbmcgKilwYXRoOworCitAZW5kCisKKworTlNfQVNTVU1FX05PTk5VTExfRU5ECmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU29ja2V0VHJhbnNwb3J0Lm0gYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU29ja2V0VHJhbnNwb3J0Lm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM1OGFiYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTb2NrZXRUcmFuc3BvcnQubQpAQCAtMCwwICsxLDEzMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2ltcG9ydCAiVFNvY2tldFRyYW5zcG9ydC5oIgorCisjaWYgIVRBUkdFVF9PU19JUEhPTkUKKyNpbXBvcnQgPENvcmVTZXJ2aWNlcy9Db3JlU2VydmljZXMuaD4KKyNlbHNlCisjaW1wb3J0IDxDRk5ldHdvcmsvQ0ZOZXR3b3JrLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8c3lzL3VuLmg+CisKK0BpbnRlcmZhY2UgVFNvY2tldFRyYW5zcG9ydCAoKSA8TlNTdHJlYW1EZWxlZ2F0ZT4KK0BlbmQKKworCitAaW1wbGVtZW50YXRpb24gVFNvY2tldFRyYW5zcG9ydAorCistIChpZCkgaW5pdFdpdGhSZWFkU3RyZWFtOiAoQ0ZSZWFkU3RyZWFtUmVmKSByZWFkU3RyZWFtIHdyaXRlU3RyZWFtOiAoQ0ZXcml0ZVN0cmVhbVJlZikgd3JpdGVTdHJlYW0KK3sKKyAgTlNJbnB1dFN0cmVhbSAqaW5wdXRTdHJlYW0gPSBuaWw7CisgIE5TT3V0cHV0U3RyZWFtICpvdXRwdXRTdHJlYW0gPSBuaWw7CisKKyAgaWYgKHJlYWRTdHJlYW0gJiYgd3JpdGVTdHJlYW0pIHsKKworICAgIENGUmVhZFN0cmVhbVNldFByb3BlcnR5KHJlYWRTdHJlYW0sIGtDRlN0cmVhbVByb3BlcnR5U2hvdWxkQ2xvc2VOYXRpdmVTb2NrZXQsIGtDRkJvb2xlYW5UcnVlKTsKKyAgICBDRldyaXRlU3RyZWFtU2V0UHJvcGVydHkod3JpdGVTdHJlYW0sIGtDRlN0cmVhbVByb3BlcnR5U2hvdWxkQ2xvc2VOYXRpdmVTb2NrZXQsIGtDRkJvb2xlYW5UcnVlKTsKKworICAgIGlucHV0U3RyZWFtID0gKF9fYnJpZGdlIE5TSW5wdXRTdHJlYW0gKilyZWFkU3RyZWFtOworICAgIFtpbnB1dFN0cmVhbSBzZXREZWxlZ2F0ZTpzZWxmXTsKKyAgICBbaW5wdXRTdHJlYW0gc2NoZWR1bGVJblJ1bkxvb3A6TlNSdW5Mb29wLmN1cnJlbnRSdW5Mb29wIGZvck1vZGU6TlNEZWZhdWx0UnVuTG9vcE1vZGVdOworICAgIFtpbnB1dFN0cmVhbSBvcGVuXTsKKworICAgIG91dHB1dFN0cmVhbSA9IChfX2JyaWRnZSBOU091dHB1dFN0cmVhbSAqKXdyaXRlU3RyZWFtOworICAgIFtvdXRwdXRTdHJlYW0gc2V0RGVsZWdhdGU6c2VsZl07CisgICAgW291dHB1dFN0cmVhbSBzY2hlZHVsZUluUnVuTG9vcDpOU1J1bkxvb3AuY3VycmVudFJ1bkxvb3AgZm9yTW9kZTpOU0RlZmF1bHRSdW5Mb29wTW9kZV07CisgICAgW291dHB1dFN0cmVhbSBvcGVuXTsKKyAgfQorICBlbHNlIHsKKworICAgIGlmIChyZWFkU3RyZWFtKSB7CisgICAgICBDRlJlbGVhc2UocmVhZFN0cmVhbSk7CisgICAgfQorCisgICAgaWYgKHdyaXRlU3RyZWFtKSB7CisgICAgICBDRlJlbGVhc2Uod3JpdGVTdHJlYW0pOworICAgIH0KKworICAgIHJldHVybiBuaWw7CisgIH0KKworICByZXR1cm4gW3N1cGVyIGluaXRXaXRoSW5wdXRTdHJlYW06aW5wdXRTdHJlYW0gb3V0cHV0U3RyZWFtOm91dHB1dFN0cmVhbV07Cit9CisKKy0gKGlkKSBpbml0V2l0aEhvc3RuYW1lOiAoTlNTdHJpbmcgKikgaG9zdG5hbWUKKyAgICAgICAgICAgICAgICAgICBwb3J0OiAoaW50KSBwb3J0Cit7CisgIENGUmVhZFN0cmVhbVJlZiByZWFkU3RyZWFtID0gTlVMTDsKKyAgQ0ZXcml0ZVN0cmVhbVJlZiB3cml0ZVN0cmVhbSA9IE5VTEw7CisgIENGU3RyZWFtQ3JlYXRlUGFpcldpdGhTb2NrZXRUb0hvc3Qoa0NGQWxsb2NhdG9yRGVmYXVsdCwgKF9fYnJpZGdlIENGU3RyaW5nUmVmKWhvc3RuYW1lLCBwb3J0LCAmcmVhZFN0cmVhbSwgJndyaXRlU3RyZWFtKTsKKyAgcmV0dXJuIFtzZWxmIGluaXRXaXRoUmVhZFN0cmVhbTpyZWFkU3RyZWFtIHdyaXRlU3RyZWFtOndyaXRlU3RyZWFtXTsKK30KKworLSAoaWQpIGluaXRXaXRoUGF0aDogKE5TU3RyaW5nICopIHBhdGgKK3sKKyAgQ0ZTb2NrZXROYXRpdmVIYW5kbGUgc29ja2ZkID0gc29ja2V0KEFGX0xPQ0FMLCBTT0NLX1NUUkVBTSwgSVBQUk9UT19JUCk7CisgIGludCB5ZXMgPSAxOworICBpZiAoc2V0c29ja29wdChzb2NrZmQsIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwgJnllcywgc2l6ZW9mKHllcykpIDwgMCkKKyAgeworICAgIE5TTG9nKEAiVFNvY2tldFRyYW5zcG9ydDogVW5hYmxlIHRvIHNldCBSRVVTRUFERFIgcHJvcGVydHkgb2Ygc29ja2V0LiIpOworICAgIHJldHVybiBuaWw7CisgIH0KKworICBOU0RhdGEgKnNlcnZlckFkZHJlc3MgPSBbW3NlbGYgY2xhc3NdIGNyZWF0ZUFkZHJlc3NXaXRoUGF0aDpwYXRoXTsKKworICBDRlJlYWRTdHJlYW1SZWYgcmVhZFN0cmVhbSA9IE5VTEw7CisgIENGV3JpdGVTdHJlYW1SZWYgd3JpdGVTdHJlYW0gPSBOVUxMOworICBDRlN0cmVhbUNyZWF0ZVBhaXJXaXRoU29ja2V0KGtDRkFsbG9jYXRvckRlZmF1bHQsIHNvY2tmZCwgJnJlYWRTdHJlYW0sICZ3cml0ZVN0cmVhbSk7CisgIGlmICghcmVhZFN0cmVhbSB8fCAhd3JpdGVTdHJlYW0pCisgIHsKKyAgICBOU0xvZyhAIlRTb2NrZXRUcmFuc3BvcnQ6IFVuYWJsZSB0byBjcmVhdGUgcmVhZC93cml0ZSBzdHJlYW0gcGFpciBmb3Igc29ja2V0LiIpOworICAgIHJldHVybiBuaWw7CisgIH0KKworICBpZiAoY29ubmVjdChzb2NrZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKilzZXJ2ZXJBZGRyZXNzLmJ5dGVzLCAoc29ja2xlbl90KSBzZXJ2ZXJBZGRyZXNzLmxlbmd0aCkgPCAwKQorICB7CisgICAgTlNMb2coQCJUU29ja2V0VHJhbnNwb3J0OiBDb25uZWN0IGVycm9yOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICByZXR1cm4gbmlsOworICB9CisKKyAgcmV0dXJuIFtzZWxmIGluaXRXaXRoUmVhZFN0cmVhbTpyZWFkU3RyZWFtIHdyaXRlU3RyZWFtOndyaXRlU3RyZWFtXTsKK30KKworKyAoTlNEYXRhICopIGNyZWF0ZUFkZHJlc3NXaXRoUGF0aDogKE5TU3RyaW5nICopcGF0aAoreworICBzdHJ1Y3Qgc29ja2FkZHJfdW4gc2VydmFkZHI7CisKKyAgc2l6ZV90IG51bGxUZXJtaW5hdGVkUGF0aExlbmd0aCA9IHBhdGgubGVuZ3RoICsgMTsKKyAgaWYgKG51bGxUZXJtaW5hdGVkUGF0aExlbmd0aD4gc2l6ZW9mKHNlcnZhZGRyLnN1bl9wYXRoKSkgeworICAgIE5TTG9nKEAiVFNvY2tldFRyYW5zcG9ydDogVW5hYmxlIHRvIGNyZWF0ZSBzb2NrZXQgYXQgcGF0aCAlQC4gUGF0aCBpcyB0b28gbG9uZy4iLCBwYXRoKTsKKyAgICByZXR1cm4gbmlsOworICB9CisKKyAgYnplcm8oJnNlcnZhZGRyLHNpemVvZihzZXJ2YWRkcikpOworICBzZXJ2YWRkci5zdW5fZmFtaWx5ID0gQUZfTE9DQUw7CisgIG1lbWNweShzZXJ2YWRkci5zdW5fcGF0aCwgcGF0aC5VVEY4U3RyaW5nLCBudWxsVGVybWluYXRlZFBhdGhMZW5ndGgpOworICBzZXJ2YWRkci5zdW5fbGVuID0gU1VOX0xFTigmc2VydmFkZHIpOworCisgIHJldHVybiBbTlNEYXRhIGRhdGFXaXRoQnl0ZXM6JnNlcnZhZGRyIGxlbmd0aDpzaXplb2Yoc2VydmFkZHIpXTsKK30KKworCitAZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0LmggYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0LmgKaW5kZXggODNhYWQ5ZS4uNTU4Y2Y2MCAxMDA2NDQKLS0tIGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydC5oCisrKyBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaApAQCAtMTcsMjAgKzE3LDMyIEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KKworCitOU19BU1NVTUVfTk9OTlVMTF9CRUdJTgorCisKIEBwcm90b2NvbCBUVHJhbnNwb3J0IDxOU09iamVjdD4KIAotICAvKioKLSAgICogR3VhcmFudGVlcyB0aGF0IGFsbCBvZiBsZW4gYnl0ZXMgYXJlIHJlYWQKLSAgICoKLSAgICogQHBhcmFtIGJ1ZiBCdWZmZXIgdG8gcmVhZCBpbnRvCi0gICAqIEBwYXJhbSBvZmZzZXQgSW5kZXggaW4gYnVmZmVyIHRvIHN0YXJ0IHN0b3JpbmcgYnl0ZXMgYXQKLSAgICogQHBhcmFtIGxlbmd0aCBNYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byByZWFkCi0gICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSByZWFkLCB3aGljaCBtdXN0IGJlIGVxdWFsIHRvIGxlbgotICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgdGhlcmUgd2FzIGFuIGVycm9yIHJlYWRpbmcgZGF0YQotICAgKi8KLS0gKHNpemVfdCkgcmVhZEFsbDogKHVpbnQ4X3QgKikgYnVmIG9mZnNldDogKHNpemVfdCkgb2Zmc2V0IGxlbmd0aDogKHNpemVfdCkgbGVuZ3RoOworLyoqCisgKiBHdWFyYW50ZWVzIHRoYXQgYWxsIG9mIGxlbiBieXRlcyBhcmUgcmVhZAorICoKKyAqIEBwYXJhbSBidWYgQnVmZmVyIHRvIHJlYWQgaW50bworICogQHBhcmFtIG9mZiBJbmRleCBpbiBidWZmZXIgdG8gc3RhcnQgc3RvcmluZyBieXRlcyBhdAorICogQHBhcmFtIGxlbiBNYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byByZWFkCisgKiBAcmV0dXJuIFlFUyBpZiBzdWNjZWVkZWQsIE5PIGlmIGZhaWxlZAorICogQHRocm93cyBUVHJhbnNwb3J0RXJyb3IgaWYgdGhlcmUgd2FzIGFuIGVycm9yIHJlYWRpbmcgZGF0YQorICovCistKEJPT0wpIHJlYWRBbGw6KFVJbnQ4ICopYnVmIG9mZnNldDooVUludDMyKW9mZiBsZW5ndGg6KFVJbnQzMilsZW4gZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tICh2b2lkKSB3cml0ZTogKGNvbnN0IHVpbnQ4X3QgKikgZGF0YSBvZmZzZXQ6IChzaXplX3QpIG9mZnNldCBsZW5ndGg6IChzaXplX3QpIGxlbmd0aDsKKy0oVUludDMyKSByZWFkQXZhaWw6KFVJbnQ4ICopYnVmIG9mZnNldDooVUludDMyKW9mZiBtYXhMZW5ndGg6KFVJbnQzMiltYXhMZW4gZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tICh2b2lkKSBmbHVzaDsKKy0oQk9PTCkgd3JpdGU6KGNvbnN0IFVJbnQ4ICopZGF0YSBvZmZzZXQ6KFVJbnQzMilvZmZzZXQgbGVuZ3RoOihVSW50MzIpbGVuZ3RoIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKKworLShCT09MKSBmbHVzaDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CisKIEBlbmQKKworCitOU19BU1NVTUVfTk9OTlVMTF9FTkQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnRFcnJvci5oIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydEVycm9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhjOWYwNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnRFcnJvci5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCAiVEVycm9yLmgiCisKKworZXh0ZXJuIE5TU3RyaW5nICpUVHJhbnNwb3J0RXJyb3JEb21haW47CisKKwordHlwZWRlZiBOU19FTlVNIChpbnQsIFRUcmFuc3BvcnRFcnJvcikgeworICBUVHJhbnNwb3J0RXJyb3JVbmtub3duICAgICAgICA9IDAsCisgIFRUcmFuc3BvcnRFcnJvck5vdE9wZW4gICAgICAgID0gMSwKKyAgVFRyYW5zcG9ydEVycm9yQWxyZWFkeU9wZW4gICAgPSAyLAorICBUVHJhbnNwb3J0RXJyb3JUaW1lZE91dCAgICAgICA9IDMsCisgIFRUcmFuc3BvcnRFcnJvckVuZE9mRmlsZSAgICAgID0gNCwKK307CisKKworZXh0ZXJuIE5TU3RyaW5nICpUVHJhbnNwb3J0RXJyb3JFeHRlbmRlZEVycm9yS2V5OworZXh0ZXJuIE5TU3RyaW5nICpUVHJhbnNwb3J0RXJyb3JIdHRwRXJyb3JLZXk7CisKKwordHlwZWRlZiBOU19FTlVNKGludCwgVEh0dHBUcmFuc3BvcnRFcnJvcikgeworICBUSHR0cFRyYW5zcG9ydEVycm9ySW52YWxpZFJlc3BvbnNlICA9IDEwMDEsCisgIFRIdHRwVHJhbnNwb3J0RXJyb3JJbnZhbGlkU3RhdHVzICAgID0gMTAwMiwKKyAgVEh0dHBUcmFuc3BvcnRFcnJvckF1dGhlbnRpY2F0aW9uICAgPSAxMDAzLAorfTsKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnRFcnJvci5tIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydEVycm9yLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFhZjA3NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnRFcnJvci5tCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCAiVFRyYW5zcG9ydEVycm9yLmgiCisKKworTlNTdHJpbmcgKlRUcmFuc3BvcnRFcnJvckRvbWFpbiA9IEAiVFRyYW5zcG9ydEVycm9yRG9tYWluIjsKKworCitOU1N0cmluZyAqVFRyYW5zcG9ydEVycm9yRXh0ZW5kZWRFcnJvcktleSA9IEAiZXh0ZW5kZWRFcnJvciI7CitOU1N0cmluZyAqVFRyYW5zcG9ydEVycm9ySHR0cEVycm9yS2V5ID0gQCJodHRwRXJyb3IiOwpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzQ5ZmUyLi4wMDAwMDAwCi0tLSBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2ltcG9ydCAiVEV4Y2VwdGlvbi5oIgotCi1AaW50ZXJmYWNlIFRUcmFuc3BvcnRFeGNlcHRpb24gOiBURXhjZXB0aW9uIHsKLX0KLQotKyAoaWQpIGV4Y2VwdGlvbldpdGhSZWFzb246IChOU1N0cmluZyAqKSByZWFzb24KLSAgICAgICAgICAgICAgICAgICAgIGVycm9yOiAoTlNFcnJvciAqKSBlcnJvcjsKLQotKyAoaWQpIGV4Y2VwdGlvbldpdGhSZWFzb246IChOU1N0cmluZyAqKSByZWFzb247Ci0KLUBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24ubSBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24ubQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNjZGZiZC4uMDAwMDAwMAotLS0gYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLm0KKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbXBvcnQgIlRUcmFuc3BvcnRFeGNlcHRpb24uaCIKLSNpbXBvcnQgIlRPYmplY3RpdmUtQy5oIgotCi1AaW1wbGVtZW50YXRpb24gVFRyYW5zcG9ydEV4Y2VwdGlvbgotCi0rIChpZCkgZXhjZXB0aW9uV2l0aFJlYXNvbjogKE5TU3RyaW5nICopIHJlYXNvbgotICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IChOU0Vycm9yICopIGVycm9yCi17Ci0gIE5TRGljdGlvbmFyeSAqIHVzZXJJbmZvID0gbmlsOwotICBpZiAoZXJyb3IgIT0gbmlsKSB7Ci0gICAgdXNlckluZm8gPSBbTlNEaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoT2JqZWN0OiBlcnJvciBmb3JLZXk6IEAiZXJyb3IiXTsKLSAgfQotCi0gIHJldHVybiBbc3VwZXIgZXhjZXB0aW9uV2l0aE5hbWU6IEAiVFRyYW5zcG9ydEV4Y2VwdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjogcmVhc29uCi0gICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86IHVzZXJJbmZvXTsKLX0KLQotCi0rIChpZCkgZXhjZXB0aW9uV2l0aFJlYXNvbjogKE5TU3RyaW5nICopIHJlYXNvbgotewotICByZXR1cm4gW3NlbGYgZXhjZXB0aW9uV2l0aFJlYXNvbjogcmVhc29uIGVycm9yOiBuaWxdOwotfQotCi1AZW5kCmRpZmYgLS1naXQgYS9saWIvY3BwL0NNYWtlTGlzdHMudHh0IGIvbGliL2NwcC9DTWFrZUxpc3RzLnR4dAppbmRleCA0YzdjYWViLi45ZWE4MmMzIDEwMDc1NQotLS0gYS9saWIvY3BwL0NNYWtlTGlzdHMudHh0CisrKyBiL2xpYi9jcHAvQ01ha2VMaXN0cy50eHQKQEAgLTE3LDEzICsxNyw2IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi0jIEZpbmQgcmVxdWlyZWQgcGFja2FnZXMKLWlmKFdJVEhfQk9PU1RUSFJFQURTKQotICBmaW5kX3BhY2thZ2UoQm9vc3QgMS41My4wIFJFUVVJUkVEIENPTVBPTkVOVFMgc3lzdGVtIHRocmVhZCkKLWVsc2UoKQotICBmaW5kX3BhY2thZ2UoQm9vc3QgMS41My4wIFJFUVVJUkVEKQotZW5kaWYoKQotCiBpbmNsdWRlX2RpcmVjdG9yaWVzKFNZU1RFTSAiJHtCb29zdF9JTkNMVURFX0RJUlN9IikKIGluY2x1ZGVfZGlyZWN0b3JpZXMoc3JjKQogCkBAIC0zNSw2ICsyOCw3IEBACiAgICBzcmMvdGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jcHAKICAgIHNyYy90aHJpZnQvVE91dHB1dC5jcHAKICAgIHNyYy90aHJpZnQvYXN5bmMvVEFzeW5jQ2hhbm5lbC5jcHAKKyAgIHNyYy90aHJpZnQvYXN5bmMvVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IuY3BwCiAgICBzcmMvdGhyaWZ0L2FzeW5jL1RDb25jdXJyZW50Q2xpZW50U3luY0luZm8uaAogICAgc3JjL3RocmlmdC9hc3luYy9UQ29uY3VycmVudENsaWVudFN5bmNJbmZvLmNwcAogICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmNwcApAQCAtNjQsNyArNTgsNyBAQAogICAgc3JjL3RocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmNwcAogKQogCi0jIFRoaXMgZmlsZXMgZG9uJ3Qgd29yayBvbiBXaW5kb3dzIENFIGFzIHRoZXJlIGlzIG5vIHBpcGUgc3VwcG9ydAorIyBUaGVzZSBmaWxlcyBkb24ndCB3b3JrIG9uIFdpbmRvd3MgQ0UgYXMgdGhlcmUgaXMgbm8gcGlwZSBzdXBwb3J0CiAjIFRPRE86IFRoZXNlIGZpbGVzIHdvbid0IHdvcmsgd2l0aCBVTklDT0RFIHN1cHBvcnQgb24gd2luZG93cy4gSWYgZml4ZWQgdGhpcyBjYW4gYmUgcmUtYWRkZWQuCiBpZiAoTk9UIFdJTkNFKQogICAgIGxpc3QoQVBQRU5EIHRocmlmdGNwcF9TT1VSQ0VTCkBAIC0xMDksMTUgKzEwMywxMiBAQAogZW5kaWYoKQogCiAjIFdJVEhfKlRIUkVBRFMgc2VsZWN0cyB3aGljaCB0aHJlYWRpbmcgbGlicmFyeSB0byB1c2UKLWlmKFdJVEhfQk9PU1RUSFJFQURTKQotICAgIHNldCggdGhyaWZ0Y3BwX3RocmVhZHNfU09VUkNFUwotICAgICAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L0Jvb3N0VGhyZWFkRmFjdG9yeS5jcHAKLSAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Cb29zdE1vbml0b3IuY3BwCi0gICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvQm9vc3RNdXRleC5jcHAKLSAgICApCi0gICAgbGlzdChBUFBFTkQgU1lTTElCUyAiJHtCb29zdF9MSUJSQVJJRVN9IikKLWVsc2VpZihVTklYIEFORCBOT1QgV0lUSF9TVERUSFJFQURTKQotICAgIGxpc3QoQVBQRU5EIFNZU0xJQlMgcHRocmVhZCkKK2lmKFVOSVggQU5EIE5PVCBXSVRIX1NURFRIUkVBRFMpCisgICAgaWYoQU5EUk9JRCkKKyAgICAgICAgc2V0KENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9IC1wdGhyZWFkIikKKyAgICBlbHNlKCkKKyAgICAgICAgbGlzdChBUFBFTkQgU1lTTElCUyBwdGhyZWFkKQorICAgIGVuZGlmKCkKICAgICBzZXQoIHRocmlmdGNwcF90aHJlYWRzX1NPVVJDRVMKICAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuY3BwCiAgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguY3BwCkBAIC0xMjUsOCArMTE2LDExIEBACiAgICAgKQogZWxzZSgpCiAgICAgaWYoVU5JWCkKLSAgICAgICAgIyBuZWVkIHB0aHJlYWQgZm9yIG11bHRpLXRocmVhZCBzdXBwb3J0Ci0gICAgICAgIGxpc3QoQVBQRU5EIFNZU0xJQlMgcHRocmVhZCkKKyAgICAgICAgaWYoQU5EUk9JRCkKKyAgICAgICAgICAgIHNldChDTUFLRV9DWFhfRkxBR1MgIiR7Q01BS0VfQ1hYX0ZMQUdTfSAtcHRocmVhZCIpCisgICAgICAgIGVsc2UoKQorICAgICAgICAgICAgbGlzdChBUFBFTkQgU1lTTElCUyBwdGhyZWFkKQorICAgICAgICBlbmRpZigpCiAgICAgZW5kaWYoKQogICAgIHNldCggdGhyaWZ0Y3BwX3RocmVhZHNfU09VUkNFUwogICAgICAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1N0ZFRocmVhZEZhY3RvcnkuY3BwCkBAIC0xMzgsNyArMTMyLDggQEAKICMgVGhyaWZ0IG5vbiBibG9ja2luZyBzZXJ2ZXIKIHNldCggdGhyaWZ0Y3BwbmJfU09VUkNFUwogICAgIHNyYy90aHJpZnQvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5jcHAKLSAgICBzcmMvdGhyaWZ0L2FzeW5jL1RBc3luY1Byb3RvY29sUHJvY2Vzc29yLmNwcAorICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclNvY2tldC5jcHAKKyAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQuY3BwCiAgICAgc3JjL3RocmlmdC9hc3luYy9URXZodHRwU2VydmVyLmNwcAogICAgIHNyYy90aHJpZnQvYXN5bmMvVEV2aHR0cENsaWVudENoYW5uZWwuY3BwCiApCkBAIC0xNDYsNiArMTQxLDEwIEBACiAjIFRocmlmdCB6bGliIHNlcnZlcgogc2V0KCB0aHJpZnRjcHB6X1NPVVJDRVMKICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5jcHAKKyAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RIZWFkZXJQcm90b2NvbC5jcHAKKyAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9USGVhZGVyVHJhbnNwb3J0LmNwcAorICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVEhlYWRlclByb3RvY29sLmNwcAorICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RIZWFkZXJUcmFuc3BvcnQuY3BwCiApCiAKICMgVGhyaWZ0IFF0NCBzZXJ2ZXIKQEAgLTE1OCw3ICsxNTcsMTEgQEAKIGluY2x1ZGUoVGhyaWZ0TWFjcm9zKQogCiBBRERfTElCUkFSWV9USFJJRlQodGhyaWZ0ICR7dGhyaWZ0Y3BwX1NPVVJDRVN9ICR7dGhyaWZ0Y3BwX3RocmVhZHNfU09VUkNFU30pCi1UQVJHRVRfTElOS19MSUJSQVJJRVNfVEhSSUZUKHRocmlmdCAke1NZU0xJQlN9KQoraWYoV0lOMzIpCisgICAgVEFSR0VUX0xJTktfTElCUkFSSUVTX1RIUklGVCh0aHJpZnQgJHtTWVNMSUJTfSB3czJfMzIpCitlbHNlKCkKKyAgICBUQVJHRVRfTElOS19MSUJSQVJJRVNfVEhSSUZUKHRocmlmdCAke1NZU0xJQlN9KQorZW5kaWYoKQogCiBpZihXSVRIX0xJQkVWRU5UKQogICAgIGZpbmRfcGFja2FnZShMaWJldmVudCBSRVFVSVJFRCkgICMgTGliZXZlbnQgY29tZXMgd2l0aCBDTWFrZSBzdXBwb3J0IGZvcm0gdXBzdHJlYW0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvTWFrZWZpbGUuYW0gYi9saWIvY3BwL01ha2VmaWxlLmFtCmluZGV4IDQ3NDJlZTAuLjg1YmI5YWIgMTAwNzU1Ci0tLSBhL2xpYi9jcHAvTWFrZWZpbGUuYW0KKysrIGIvbGliL2NwcC9NYWtlZmlsZS5hbQpAQCAtMjgsMTQgKzI4LDE5IEBACiBTVUJESVJTID0gLgogCiBpZiBXSVRIX1RFU1RTCisjIFRoaXMgZmlsZSBpcyBuZWVkZWQgYnkgY29tcGlsZXIgd2l0aCBwbHVnaW4sIHdoaWxlIHRlc3QvTWFrZWZpbGUuYW0gbmVlZHMgY29tcGlsZXIKKyMgU28gdGVzdCBkaXJlY3RvcnkgaXMgZGlyZWN0bHkgcGlja2VkIGJ5IHRvcCBsZXZlbCBNYWtlZmlsZS5hbSBmb3IgcGx1Z2luIGJ1aWxkCitpZiAhV0lUSF9QTFVHSU4KIFNVQkRJUlMgKz0gdGVzdAogZW5kaWYKK2VuZGlmCiAKIHBrZ2NvbmZpZ2RpciA9ICQobGliZGlyKS9wa2djb25maWcKIAogbGliX0xUTElCUkFSSUVTID0gbGlidGhyaWZ0LmxhCiBwa2djb25maWdfREFUQSA9IHRocmlmdC5wYwotbGlidGhyaWZ0X2xhX0xERkxBR1MgPSAtcmVsZWFzZSAkKFZFUlNJT04pICQoQk9PU1RfTERGTEFHUykgJChPUEVOU1NMX0xERkxBR1MpCitsaWJ0aHJpZnRfbGFfTERGTEFHUyA9IC1yZWxlYXNlICQoVkVSU0lPTikKK2xpYnRocmlmdF9sYV9MSUJBREQgPSAkKEJPT1NUX0xERkxBR1MpICQoT1BFTlNTTF9MREZMQUdTKSAkKE9QRU5TU0xfTElCUykKIAogIyMgV2Ugb25seSBidWlsZCB0aGUgZXh0cmEgbGlicmFyaWVzIGlmIHdlIGhhdmUgdGhlIGRlcGVuZGVuY2llcywKICMjIGJ1dCB3ZSBpbnN0YWxsIGFsbCBvZiB0aGUgaGVhZGVycyB1bmNvbmRpdGlvbmFsbHkuCkBAIC01Nyw4ICs2Miw3IEBACiBlbmRpZgogCiBBTV9DWFhGTEFHUyA9IC1XYWxsIC1XZXh0cmEgLXBlZGFudGljCi1BTV9DUFBGTEFHUyA9ICQoQk9PU1RfQ1BQRkxBR1MpICQoT1BFTlNTTF9JTkNMVURFUykgLUkkKHNyY2Rpcikvc3JjIC1EX19TVERDX0xJTUlUX01BQ1JPUwotQU1fTERGTEFHUyA9ICQoQk9PU1RfTERGTEFHUykgJChPUEVOU1NMX0xERkxBR1MpCitBTV9DUFBGTEFHUyA9ICQoQk9PU1RfQ1BQRkxBR1MpICQoT1BFTlNTTF9JTkNMVURFUykgLUkkKHNyY2Rpcikvc3JjIC1EX19TVERDX0ZPUk1BVF9NQUNST1MgLURfX1NURENfTElNSVRfTUFDUk9TCiAKICMgRGVmaW5lIHRoZSBzb3VyY2UgZmlsZXMgZm9yIHRoZSBtb2R1bGUKIApAQCAtNjYsNiArNzAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L1RPdXRwdXQuY3BwIFwKICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9WaXJ0dWFsUHJvZmlsaW5nLmNwcCBcCiAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvYXN5bmMvVEFzeW5jQ2hhbm5lbC5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2FzeW5jL1RBc3luY1Byb3RvY29sUHJvY2Vzc29yLmNwcCBcCiAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvYXN5bmMvVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mby5jcHAgXAogICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuY3BwIFwKICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaW1lck1hbmFnZXIuY3BwIFwKQEAgLTkwLDYgKzk1LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldFBvb2wuY3BwIFwKICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5jcHAgXAogICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMU2VydmVyU29ja2V0LmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclNvY2tldC5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQuY3BwIFwKICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmNwcCBcCiAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmNwcCBcCiAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvc2VydmVyL1RDb25uZWN0ZWRDbGllbnQuY3BwIFwKQEAgLTk5LDIyICsxMDYsMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuY3BwIFwKICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmNwcAogCi1pZiBXSVRIX0JPT1NUVEhSRUFEUwotbGlidGhyaWZ0X2xhX1NPVVJDRVMgKz0gc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Cb29zdFRocmVhZEZhY3RvcnkuY3BwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvQm9vc3RNb25pdG9yLmNwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L0Jvb3N0TXV0ZXguY3BwCi1lbHNlCiBsaWJ0aHJpZnRfbGFfU09VUkNFUyArPSBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4LmNwcCBcCiAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuY3BwIFwKICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5LmNwcAotZW5kaWYKIAogbGlidGhyaWZ0bmJfbGFfU09VUkNFUyA9IHNyYy90aHJpZnQvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5jcHAgXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvYXN5bmMvVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IuY3BwIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2FzeW5jL1RFdmh0dHBTZXJ2ZXIuY3BwIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2FzeW5jL1RFdmh0dHBDbGllbnRDaGFubmVsLmNwcAogCi1saWJ0aHJpZnR6X2xhX1NPVVJDRVMgPSBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5jcHAKK2xpYnRocmlmdHpfbGFfU09VUkNFUyA9IHNyYy90aHJpZnQvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0LmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9USGVhZGVyVHJhbnNwb3J0LmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RIZWFkZXJQcm90b2NvbC5jcHAKKwogCiBsaWJ0aHJpZnRxdF9sYV9NT0MgPSBzcmMvdGhyaWZ0L3F0L21vY19UUVRjcFNlcnZlci5jcHAKIG5vZGlzdF9saWJ0aHJpZnRxdF9sYV9TT1VSQ0VTID0gJChsaWJ0aHJpZnRxdF9sYV9NT0MpCkBAIC0xNDEsNyArMTQ0LDcgQEAKIGxpYnRocmlmdHF0X2xhX0NYWEZMQUdTICA9ICQoQU1fQ1hYRkxBR1MpCiBsaWJ0aHJpZnRxdDVfbGFfQ1hYRkxBR1MgID0gJChBTV9DWFhGTEFHUykKIGxpYnRocmlmdG5iX2xhX0xERkxBR1MgID0gLXJlbGVhc2UgJChWRVJTSU9OKSAkKEJPT1NUX0xERkxBR1MpCi1saWJ0aHJpZnR6X2xhX0xERkxBR1MgICA9IC1yZWxlYXNlICQoVkVSU0lPTikgJChCT09TVF9MREZMQUdTKQorbGlidGhyaWZ0el9sYV9MREZMQUdTICAgPSAtcmVsZWFzZSAkKFZFUlNJT04pICQoQk9PU1RfTERGTEFHUykgJChaTElCX0xJQlMpCiBsaWJ0aHJpZnRxdF9sYV9MREZMQUdTICAgPSAtcmVsZWFzZSAkKFZFUlNJT04pICQoQk9PU1RfTERGTEFHUykgJChRVF9MSUJTKQogbGlidGhyaWZ0cXQ1X2xhX0xERkxBR1MgICA9IC1yZWxlYXNlICQoVkVSU0lPTikgJChCT09TVF9MREZMQUdTKSAkKFFUNV9MSUJTKQogCkBAIC0xNTUsMTIgKzE1OCwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvVFByb2Nlc3Nvci5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L1RMb2dnaW5nLmggXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY3h4ZnVuY3Rpb25hbC5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L1RUb1N0cmluZy5oCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9UVG9TdHJpbmcuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9UQmFzZS5oCiAKIGluY2x1ZGVfY29uY3VycmVuY3lkaXIgPSAkKGluY2x1ZGVfdGhyaWZ0ZGlyKS9jb25jdXJyZW5jeQogaW5jbHVkZV9jb25jdXJyZW5jeV9IRUFERVJTID0gXAotICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvQm9vc3RUaHJlYWRGYWN0b3J5LmggXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvRXhjZXB0aW9uLmggXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmggXApAQCAtMTgzLDExICsxODUsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLnRjYyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wcm90b2NvbC9URGVidWdQcm90b2NvbC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RIZWFkZXJQcm90b2NvbC5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RCYXNlNjRVdGlscy5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbFRhcC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbFR5cGVzLmggXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmggXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVFZpcnR1YWxQcm90b2NvbC5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oCkBAIC0xOTcsMTAgKzIwMSwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1BsYXRmb3JtU29ja2V0LmggXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RGRFRyYW5zcG9ydC5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9USGVhZGVyVHJhbnNwb3J0LmggXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RTaW1wbGVGaWxlVHJhbnNwb3J0LmggXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNlcnZlclNvY2tldC5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0LmggXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwVHJhbnNwb3J0LmggXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmggXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwU2VydmVyLmggXApAQCAtMjQ5LDggKzI1Nyw2IEBACiAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3F0L1RRSU9EZXZpY2VUcmFuc3BvcnQuaCBcCiAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3F0L1RRVGNwU2VydmVyLmgKIAotVEhSSUZUID0gJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKLQogV0lORE9XU19ESVNUID0gXAogICAgICAgICAgICAgIHNyYy90aHJpZnQvd2luZG93cyBcCiAgICAgICAgICAgICAgdGhyaWZ0LnNsbiBcCmRpZmYgLS1naXQgYS9saWIvY3BwL1JFQURNRS5tZCBiL2xpYi9jcHAvUkVBRE1FLm1kCmluZGV4IDJiZWUyZWMuLmU3NDRhNmEgMTAwNzU1Ci0tLSBhL2xpYi9jcHAvUkVBRE1FLm1kCisrKyBiL2xpYi9jcHAvUkVBRE1FLm1kCkBAIC0xOSw3ICsxOSw2IEBACiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiB1bmRlciB0aGUgTGljZW5zZS4KIAotCiAjIFVzaW5nIFRocmlmdCB3aXRoIEMrKwogCiBUaGUgVGhyaWZ0IEMrKyBsaWJyYXJpZXMgYXJlIGJ1aWx0IHVzaW5nIHRoZSBHTlUgdG9vbHMuIEZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zCkBAIC01NSwxNSArNTQsMjIgQEAKIAogIyMgRGVwZW5kZW5jaWVzCiAKLWJvb3N0IHNoYXJlZCBwb2ludGVycwotaHR0cDovL3d3dy5ib29zdC5vcmcvbGlicy9zbWFydF9wdHIvc21hcnRfcHRyLmh0bQorSWYgeW91ciBDKysgZW52aXJvbm1lbnQgaW1wbGVtZW50cyBDKysxMSBvciBsYXRlciwgdGhyaWZ0IHdpbGwgYXV0b21hdGljYWxseSB1c2UKK3N0ZDo6c2hhcmVkX3B0ci4gIE90aGVyd2lzZSB5b3Ugd2lsbCBuZWVkIHRoZSBib29zdCBsaWJyYXJ5IHRvIHByb3ZpZGUgYSBzaGFyZWRfcHRyCitpbXBsZW1lbnRhdGlvbiBmb3IgQysrIGVudmlyb25tZW50cyBwcmUtQysrMTEuICBJZiB5b3UgYXJlIGxpbmtpbmcgYWdhaW5zdCBjb2RlCit0aGF0IGV4cGVjdHMgdG8gYmUgdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHIsIHlvdSBjYW4gZGVmaW5lIHRoZSBwcmVwcm9jZXNzb3IKK3ZhcmlhYmxlIEZPUkNFX0JPT1NUX1NNQVJUX1BUUiBmb3IgeW91ciBidWlsZCBvZiB0aHJpZnQgdG8gbWFrZSBpdCB1c2UgYm9vc3QgaW5zdGVhZAorb2Ygc3RkIGZvciBhIG51bWJlciBvZiBtZW1vcnkgcmVsYXRlZCBjbGFzc2VzLiAgU2VlIHRocmlmdC9zdGRjeHguaCBmb3IgbW9yZS4KIAogbGliZXZlbnQgKGZvciBsaWJ0aHJpZnRuYiBvbmx5KQogaHR0cDovL21vbmtleS5vcmcvfnByb3Zvcy9saWJldmVudC8KIAogIyBVc2luZyBUaHJpZnQgd2l0aCBDKysgb24gV2luZG93cwogCi1Zb3UgbmVlZCB0byBkZWZpbmUgYW4gZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciAzcmQgcGFydHkgY29tcG9uZW50cyBzZXBhcmF0ZWx5OgorQm90aCB0aGUgYXV0b2NvbmYgYW5kIGNtYWtlIGJ1aWxkIHN5c3RlbXMgYXJlIGFibGUgdG8gYXV0b21hdGljYWxseSBkZXRlY3QgbWFueQorc3lzdGVtIGNvbmZpZ3VyYXRpb25zIHdpdGhvdXQgdGhlIG5lZWQgdG8gc3BlY2lmeSBsaWJyYXJ5IGxvY2F0aW9ucywgaG93ZXZlciBpZgoreW91IHJ1biBpbnRvIHByb2JsZW1zIG9yIHdhbnQgdG8gcmVkaXJlY3QgdGhyaWZ0IHRvIGJ1aWxkIGFuZCBsaW5rIGFnYWluc3QgeW91cgorb3duIHByb3ZpZGVkIHRoaXJkIHBhcnR5IGxpYnJhcmllczoKIAogQk9PU1RfUk9PVCA6IEZvciBib29zdCwgZS5nLiBEOlxib29zdF8xXzU1XzAKIE9QRU5TU0xfUk9PVF9ESVIgOiBGb3IgT3BlblNTTCwgZS5nLiBEOlxPcGVuU1NMLVdpbjMyCkBAIC03NCwxMyArODAsNyBAQAogCiBTZWUgLzNyZHBhcnR5LnVzZXIgZm9yIG1vcmUgZGV0YWlscy4KIAotVGhyaWZ0IGlzIGRpdmlkZWQgaW50byB0d28gbGlicmFyaWVzLgotCi0qIGxpYnRocmlmdCAtIFRoZSBjb3JlIFRocmlmdCBsaWJyYXJ5IGNvbnRhaW5zIGFsbCB0aGUgY29yZSBUaHJpZnQgY29kZS4gSXQgcmVxdWlyZXMKLSAgYm9vc3Qgc2hhcmVkIHBvaW50ZXJzLCBwdGhyZWFkcywgYW5kIGxpYnJ0LgotCi0qIGxpYnRocmlmdG5iIC0gVGhpcyBsaWJyYXJ5IGNvbnRhaW5zIHRoZSBUaHJpZnQgbm9uYmxvY2tpbmcgc2VydmVyLCB3aGljaCB1c2VzIGxpYmV2ZW50LgotICBUbyBsaW5rIHRoaXMgbGlicmFyeSB5b3Ugd2lsbCBhbHNvIG5lZWQgdG8gbGluayBsaWJldmVudC4KK1RoZSBzYW1lIGxpbmtpbmcgZ3VpZGVsaW5lcyBkZXNjcmliZWQgYWJvdmUgZm9yIGxpYnRocmlmdG5iIGFwcGx5IHRvIHdpbmRvd3MgYXMgd2VsbC4KIAogIyMgTGlua2luZyBBZ2FpbnN0IFRocmlmdAogCkBAIC05Myw4ICs5Myw3IEBACiAKICMjIERlcGVuZGVuY2llcwogCi1ib29zdCBzaGFyZWQgcG9pbnRlcnMKLWh0dHA6Ly93d3cuYm9vc3Qub3JnL2xpYnMvc21hcnRfcHRyL3NtYXJ0X3B0ci5odG0KK1RoZSBzYW1lIGRlcGVuZGVuY2llcyBmb3Igc2hhcmVkX3B0ciBhcyBkZXNjcmliZWQgYWJvdmUgYXBwbHkgdG8gd2luZG93cyBhcyB3ZWxsLgogCiBib29zdCB0aHJlYWQKIGh0dHA6Ly93d3cuYm9vc3Qub3JnL2RvYy9saWJzL3JlbGVhc2UvZG9jL2h0bWwvdGhyZWFkLmh0bWwKQEAgLTI3MiwzICsyNzEsMjYgQEAKIAogVGhlIFBSTkcgc2VlZCBpcyBrZXkgdG8gdGhlIGFwcGxpY2F0aW9uIHNlY3VyaXR5LiBUaGlzIG1ldGhvZCBzaG91bGQgYmUKIG92ZXJyaWRkZW4gaWYgaXQncyBub3Qgc3Ryb25nIGVub3VnaCBmb3IgeW91LgorCisjIEJyZWFraW5nIENoYW5nZXMKKworIyMgMC4xMS4wCisKK09sZGVyIHZlcnNpb25zIG9mIHRocmlmdCBkZXBlbmRlZCBvbiB0aGUgPGJvb3N0L3NtYXJ0X3B0ci5ocHA+IGNsYXNzZXMgd2hpY2gKK3dlcmUgdXNlZCBpbiB0aHJpZnQgaGVhZGVycyB0byBkZWZpbmUgaW50ZXJmYWNlcy4gIFRocmlmdCBub3cgZGV0ZWN0cyBDKysxMQorYXQgYnVpbGQgdGltZSBhbmQgd2lsbCBwcmVmZXIgdG8gdXNlIDxtZW1vcnk+IGNsYXNzZXMgZnJvbSBDKysxMSBpbnN0ZWFkLgorWW91IGNhbiBmb3JjZSB0aGUgbGlicmFyeSB0byBidWlsZCB3aXRoIGJvb3N0IG1lbW9yeSBjbGFzc2VzIGJ5IGRlZmluaW5nIHRoZQorcHJlcHJvY2Vzc29yIG1hY3JvIGBGT1JDRV9CT09TVF9TTUFSVF9QVFJgLiAgKFRIUklGVC0yMjIxKQorCitJbiB0aGUgcHRocmVhZCBtdXRleCBpbXBsZW1lbnRhdGlvbiwgdGhlIGNvbnRlbnRpb24gcHJvZmlsaW5nIGNvZGUgd2FzIGVuYWJsZWQKK2J5IGRlZmF1bHQgaW4gYWxsIGJ1aWxkcy4gIFRoaXMgY2hhbmdlZCB0byBiZSBkaXNhYmxlZCBieSBkZWZhdWx0LiAgKFRIUklGVC00MTUxKQorCitJbiBvbGRlciByZWxlYXNlcywgaWYgYSBUU1NMU29ja2V0RmFjdG9yeSdzIGxpZmV0aW1lIHdhcyBub3QgYXQgbGVhc3QgYXMgbG9uZworYXMgdGhlIFRTU0xTb2NrZXRzIGl0IGNyZWF0ZWQsIHdlIHNpbGVudGx5IHJldmVydGVkIG9wZW5zc2wgdG8gdW5zYWZlIG11bHRpdGhyZWFkIGJlaGF2aW9yCithbmQgc28gdGhlIHJlc3VsdHMgd2VyZSB1bmRlZmluZWQuICBDaGFuZ2VzIHdlcmUgbWFkZSBpbiAwLjExLjAgdGhhdCBjYXVzZSBlaXRoZXIgYW4KK2Fzc2VydGlvbiBvciBhIGNvcmUgaW5zdGVhZCBvZiB1bmRlZmluZWQgYmVoYXZpb3IuICBUaGUgbGlmZXRpbWUgb2YgYSBUU1NMU29ja2V0RmFjdG9yeQorKm11c3QqIGJlIGxvbmdlciB0aGFuIGFueSBUU1NMU29ja2V0IHRoYXQgaXQgY3JlYXRlcywgb3RoZXJ3aXNlIG9wZW5zc2wgd2lsbCBiZSBjbGVhbmVkCit1cCB0b28gZWFybHkuICBJZiB0aGUgc3RhdGljIGJvb2xlYW4gaXMgc2V0IHRvIGRpc2FibGUgb3BlbnNzbCBpbml0aWFsaXphdGlvbiBhbmQKK2NsZWFudXAgYW5kIGxlYXZlIGl0IHVwIHRvIHRoZSBjb25zdW1pbmcgYXBwbGljYXRpb24sIHRoaXMgcmVxdWlyZW1lbnQgaXMgbm90IG5lZWRlZC4KKyhUSFJJRlQtNDE2NCkKKwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9saWJ0aHJpZnQudmN4cHJvaiBiL2xpYi9jcHAvbGlidGhyaWZ0LnZjeHByb2oKaW5kZXggYjRmMWM1MC4uZDEwOTdlYyAxMDA2NDQKLS0tIGEvbGliL2NwcC9saWJ0aHJpZnQudmN4cHJvagorKysgYi9saWIvY3BwL2xpYnRocmlmdC52Y3hwcm9qCkBAIC0xLDQgKzEsNCBAQAot77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+CiA8UHJvamVjdCBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIFRvb2xzVmVyc2lvbj0iNC4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KICAgPEl0ZW1Hcm91cCBMYWJlbD0iUHJvamVjdENvbmZpZ3VyYXRpb25zIj4KICAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWctbXR8V2luMzIiPgpAQCAtMzYsNiArMzYsNyBAQAogICA8L0l0ZW1Hcm91cD4KICAgPEl0ZW1Hcm91cD4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXN5bmNcVEFzeW5jQ2hhbm5lbC5jcHAiLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXN5bmNcVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mby5jcHAiLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcY29uY3VycmVuY3lcQm9vc3RNb25pdG9yLmNwcCIgLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcY29uY3VycmVuY3lcQm9vc3RNdXRleC5jcHAiIC8+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGNvbmN1cnJlbmN5XEJvb3N0VGhyZWFkRmFjdG9yeS5jcHAiIC8+CkBAIC00NywxMiArNDgsMTYgQEAKICAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVEJhc2U2NFV0aWxzLmNwcCIgLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVERlYnVnUHJvdG9jb2wuY3BwIi8+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHByb3RvY29sXFRKU09OUHJvdG9jb2wuY3BwIi8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHByb3RvY29sXFRQcm90b2NvbC5jcHAiLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVE11bHRpcGxleGVkUHJvdG9jb2wuY3BwIi8+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHNlcnZlclxUU2ltcGxlU2VydmVyLmNwcCIvPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxzZXJ2ZXJcVFRocmVhZFBvb2xTZXJ2ZXIuY3BwIi8+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHNlcnZlclxUVGhyZWFkZWRTZXJ2ZXIuY3BwIi8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHNlcnZlclxUQ29ubmVjdGVkQ2xpZW50LmNwcCIvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxzZXJ2ZXJcVE5vbmJsb2NraW5nU2VydmVyLmNwcCIvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxzZXJ2ZXJcVFNlcnZlckZyYW1ld29yay5jcHAiLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNwcCIvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxUaHJpZnQuY3BwIi8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XFRPdXRwdXQuY3BwIi8+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUQnVmZmVyVHJhbnNwb3J0cy5jcHAiLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRGRFRyYW5zcG9ydC5jcHAiIC8+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUSHR0cENsaWVudC5jcHAiIC8+CkBAIC03NSw2ICs4MCw3IEBACiAgIDwvSXRlbUdyb3VwPgogICA8SXRlbUdyb3VwPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxhc3luY1xUQXN5bmNDaGFubmVsLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGFzeW5jXFRDb25jdXJyZW50Q2xpZW50U3luY0luZm8uaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcY29uY3VycmVuY3lcQm9vc3RUaHJlYWRGYWN0b3J5LmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGNvbmN1cnJlbmN5XFN0ZFRocmVhZEZhY3RvcnkuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcY29uY3VycmVuY3lcRXhjZXB0aW9uLmgiIC8+CkBAIC05Myw2ICs5OSw3IEBACiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHNlcnZlclxUVGhyZWFkZWRTZXJ2ZXIuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XFRocmlmdC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxUT3V0cHV0LmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XFRQcm9jZXNzb3IuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRCdWZmZXJUcmFuc3BvcnRzLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxURkRUcmFuc3BvcnQuaCIgLz4KZGlmZiAtLWdpdCBhL2xpYi9jcHAvbGlidGhyaWZ0LnZjeHByb2ouZmlsdGVycyBiL2xpYi9jcHAvbGlidGhyaWZ0LnZjeHByb2ouZmlsdGVycwppbmRleCBlYzIxODg2Li41ZjY0Zjc4IDEwMDY0NAotLS0gYS9saWIvY3BwL2xpYnRocmlmdC52Y3hwcm9qLmZpbHRlcnMKKysrIGIvbGliL2NwcC9saWJ0aHJpZnQudmN4cHJvai5maWx0ZXJzCkBAIC00LDcgKzQsNyBAQAogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVEJ1ZmZlclRyYW5zcG9ydHMuY3BwIj4KICAgICAgIDxGaWx0ZXI+dHJhbnNwb3J0PC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XFRocmlmdC5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XFRPdXRwdXQuY3BwIiAvPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxUQXBwbGljYXRpb25FeGNlcHRpb24uY3BwIiAvPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXFN0ZEFmeC5jcHAiPgogICAgICAgPEZpbHRlcj53aW5kb3dzPC9GaWx0ZXI+CkBAIC03Miw2ICs3Miw5IEBACiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGFzeW5jXFRBc3luY0NoYW5uZWwuY3BwIj4KICAgICAgIDxGaWx0ZXI+YXN5bmM8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXN5bmNcVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mby5jcHAiPgorICAgICAgPEZpbHRlcj5hc3luYzwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm9jZXNzb3JcUGVla1Byb2Nlc3Nvci5jcHAiPgogICAgICAgPEZpbHRlcj5wcm9jZXNzb3I8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KQEAgLTE3MCw2ICsxNzMsOSBAQAogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxhc3luY1xUQXN5bmNDaGFubmVsLmgiPgogICAgICAgPEZpbHRlcj5hc3luYzwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxhc3luY1xUQ29uY3VycmVudENsaWVudFN5bmNJbmZvLmgiPgorICAgICAgPEZpbHRlcj5hc3luYzwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm9jZXNzb3JcUGVla1Byb2Nlc3Nvci5oIj4KICAgICAgIDxGaWx0ZXI+cHJvY2Vzc29yPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+CmRpZmYgLS1naXQgYS9saWIvY3BwL2xpYnRocmlmdG5iLnZjeHByb2ogYi9saWIvY3BwL2xpYnRocmlmdG5iLnZjeHByb2oKaW5kZXggMjU5YmIyMC4uOWE2ZmZlNiAxMDA3NTUKLS0tIGEvbGliL2NwcC9saWJ0aHJpZnRuYi52Y3hwcm9qCisrKyBiL2xpYi9jcHAvbGlidGhyaWZ0bmIudmN4cHJvagpAQCAtMzUsMTYgKzM1LDIxIEBACiAgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KICAgPC9JdGVtR3JvdXA+CiAgIDxJdGVtR3JvdXA+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGFzeW5jXFRBc3luY1Byb3RvY29sUHJvY2Vzc29yLmNwcCIvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxhc3luY1xURXZodHRwQ2xpZW50Q2hhbm5lbC5jcHAiLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXN5bmNcVEV2aHR0cFNlcnZlci5jcHAiLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcc2VydmVyXFROb25ibG9ja2luZ1NlcnZlci5jcHAiLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXN5bmNcVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IuY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxhc3luY1xURXZodHRwQ2xpZW50Q2hhbm5lbC5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGFzeW5jXFRFdmh0dHBTZXJ2ZXIuY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxzZXJ2ZXJcVE5vbmJsb2NraW5nU2VydmVyLmNwcCIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFROb25ibG9ja2luZ1NlcnZlclNvY2tldC5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQuY3BwIiAvPgogICA8L0l0ZW1Hcm91cD4KICAgPEl0ZW1Hcm91cD4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXN5bmNcVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXN5bmNcVEV2aHR0cENsaWVudENoYW5uZWwuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXN5bmNcVEV2aHR0cFNlcnZlci5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxzZXJ2ZXJcVE5vbmJsb2NraW5nU2VydmVyLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0LmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcY29uZmlnLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcZm9yY2VfaW5jLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcVGFyZ2V0VmVyc2lvbi5oIiAvPgpAQCAtMjkwLDQgKzI5NSw0IEBACiAgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnRhcmdldHMiIC8+CiAgIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uVGFyZ2V0cyI+CiAgIDwvSW1wb3J0R3JvdXA+Ci08L1Byb2plY3Q+Cis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9saWJ0aHJpZnRuYi52Y3hwcm9qLmZpbHRlcnMgYi9saWIvY3BwL2xpYnRocmlmdG5iLnZjeHByb2ouZmlsdGVycwppbmRleCA1MjQ1NTQ0Li44NTcwM2RkIDEwMDY0NAotLS0gYS9saWIvY3BwL2xpYnRocmlmdG5iLnZjeHByb2ouZmlsdGVycworKysgYi9saWIvY3BwL2xpYnRocmlmdG5iLnZjeHByb2ouZmlsdGVycwpAQCAtMTAsNiArMTAsOSBAQAogICAgIDxGaWx0ZXIgSW5jbHVkZT0id2luZG93cyI+CiAgICAgICA8VW5pcXVlSWRlbnRpZmllcj57NjBmYzllNWUtMDg2Ni00YWJhLTg2NjItNDM5YmI0YTQ2MWQzfTwvVW5pcXVlSWRlbnRpZmllcj4KICAgICA8L0ZpbHRlcj4KKyAgICA8RmlsdGVyIEluY2x1ZGU9InRyYW5zcG9ydCI+CisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57MjNmZTJmZGUtYTdjOS00M2VjLWE0MDktN2Y1M2RmNWVlZTY0fTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICA8L0ZpbHRlcj4KICAgPC9JdGVtR3JvdXA+CiAgIDxJdGVtR3JvdXA+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHNlcnZlclxUTm9uYmxvY2tpbmdTZXJ2ZXIuY3BwIj4KQEAgLTI3LDYgKzMwLDEyIEBACiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcU3RkQWZ4LmNwcCI+CiAgICAgICA8RmlsdGVyPndpbmRvd3M8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFROb25ibG9ja2luZ1NlcnZlclNvY2tldC5jcHAiPgorICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldC5jcHAiPgorICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KICAgPC9JdGVtR3JvdXA+CiAgIDxJdGVtR3JvdXA+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHNlcnZlclxUTm9uYmxvY2tpbmdTZXJ2ZXIuaCI+CkBAIC01Myw1ICs2MiwxNCBAQAogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXGZvcmNlX2luYy5oIj4KICAgICAgIDxGaWx0ZXI+d2luZG93czwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVE5vbmJsb2NraW5nU2VydmVyU29ja2V0LmgiPgorICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydC5oIj4KKyAgICAgIDxGaWx0ZXI+dHJhbnNwb3J0PC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQuaCI+CisgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgogICA8L0l0ZW1Hcm91cD4KLTwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmggYi9saWIvY3BwL3NyYy90aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmgKaW5kZXggMGRlNTM5MS4uNjA2MThmYiAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9UQXBwbGljYXRpb25FeGNlcHRpb24uaApAQCAtNTcsNyArNTcsNyBAQAogICBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZSB0eXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkKICAgICA6IFRFeGNlcHRpb24obWVzc2FnZSksIHR5cGVfKHR5cGUpIHt9CiAKLSAgdmlydHVhbCB+VEFwcGxpY2F0aW9uRXhjZXB0aW9uKCkgdGhyb3coKSB7fQorICB2aXJ0dWFsIH5UQXBwbGljYXRpb25FeGNlcHRpb24oKSBub2V4Y2VwdCB7fQogCiAgIC8qKgogICAgKiBSZXR1cm5zIGFuIGVycm9yIGNvZGUgdGhhdCBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHlwZSBvZiBlcnJvcgpAQCAtNjUsOSArNjUsOSBAQAogICAgKgogICAgKiBAcmV0dXJuIEVycm9yIGNvZGUKICAgICovCi0gIFRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUgZ2V0VHlwZSgpIHsgcmV0dXJuIHR5cGVfOyB9CisgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUgZ2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIHR5cGVfOyB9CiAKLSAgdmlydHVhbCBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3QgdGhyb3coKSB7CisgIHZpcnR1YWwgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IG5vZXhjZXB0IHsKICAgICBpZiAobWVzc2FnZV8uZW1wdHkoKSkgewogICAgICAgc3dpdGNoICh0eXBlXykgewogICAgICAgY2FzZSBVTktOT1dOOgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L1RCYXNlLmggYi9saWIvY3BwL3NyYy90aHJpZnQvVEJhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjc0YmNkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1RCYXNlLmgKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVEJBU0VfSF8KKyNkZWZpbmUgX1RIUklGVF9UQkFTRV9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvVGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworCitjbGFzcyBUQmFzZSB7CitwdWJsaWM6CisgIHZpcnR1YWwgflRCYXNlKCl7fTsKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkKHByb3RvY29sOjpUUHJvdG9jb2wqIGlwcm90KSA9IDA7CisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGUocHJvdG9jb2w6OlRQcm90b2NvbCogb3Byb3QpIGNvbnN0ID0gMDsKK307Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0CisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVEJBU0VfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9URGlzcGF0Y2hQcm9jZXNzb3IuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9URGlzcGF0Y2hQcm9jZXNzb3IuaAppbmRleCBmZDFkY2U3Li4yOGQzNDdkIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvVERpc3BhdGNoUHJvY2Vzc29yLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1REaXNwYXRjaFByb2Nlc3Nvci5oCkBAIC0zMyw4ICszMyw4IEBACiB0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPgogY2xhc3MgVERpc3BhdGNoUHJvY2Vzc29yVCA6IHB1YmxpYyBUUHJvY2Vzc29yIHsKIHB1YmxpYzoKLSAgdmlydHVhbCBib29sIHByb2Nlc3MoYm9vc3Q6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW4sCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dCwKKyAgdmlydHVhbCBib29sIHByb2Nlc3Moc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGluLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0LAogICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjb25uZWN0aW9uQ29udGV4dCkgewogICAgIHByb3RvY29sOjpUUHJvdG9jb2wqIGluUmF3ID0gaW4uZ2V0KCk7CiAgICAgcHJvdG9jb2w6OlRQcm90b2NvbCogb3V0UmF3ID0gb3V0LmdldCgpOwpAQCAtMTA1LDggKzEwNSw4IEBACiAgKi8KIGNsYXNzIFREaXNwYXRjaFByb2Nlc3NvciA6IHB1YmxpYyBUUHJvY2Vzc29yIHsKIHB1YmxpYzoKLSAgdmlydHVhbCBib29sIHByb2Nlc3MoYm9vc3Q6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW4sCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dCwKKyAgdmlydHVhbCBib29sIHByb2Nlc3Moc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGluLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0LAogICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjb25uZWN0aW9uQ29udGV4dCkgewogICAgIHN0ZDo6c3RyaW5nIGZuYW1lOwogICAgIHByb3RvY29sOjpUTWVzc2FnZVR5cGUgbXR5cGU7CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvVE91dHB1dC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvVE91dHB1dC5jcHAKaW5kZXggNTczOWQwZi4uYWUzYTllMiAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L1RPdXRwdXQuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9UT3V0cHV0LmNwcApAQCAtMTgsOSArMTgsOSBAQAogICovCiAKICNpbmNsdWRlIDx0aHJpZnQvVGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L1RUb1N0cmluZy5oPgogI2luY2x1ZGUgPGNzdHJpbmc+CiAjaW5jbHVkZSA8Y3N0ZGxpYj4KLSNpbmNsdWRlIDxib29zdC9sZXhpY2FsX2Nhc3QuaHBwPgogI2luY2x1ZGUgPHN0ZGFyZy5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAKQEAgLTk0LDEzICs5NCwxMyBAQAogfQogCiB2b2lkIFRPdXRwdXQ6OnBlcnJvcihjb25zdCBjaGFyKiBtZXNzYWdlLCBpbnQgZXJybm9fY29weSkgewotICBzdGQ6OnN0cmluZyBvdXQgPSBtZXNzYWdlICsgc3RyZXJyb3JfcyhlcnJub19jb3B5KTsKKyAgc3RkOjpzdHJpbmcgb3V0ID0gbWVzc2FnZSArIHN0ZDo6c3RyaW5nKCI6ICIpICsgc3RyZXJyb3JfcyhlcnJub19jb3B5KTsKICAgZl8ob3V0LmNfc3RyKCkpOwogfQogCiBzdGQ6OnN0cmluZyBUT3V0cHV0OjpzdHJlcnJvcl9zKGludCBlcnJub19jb3B5KSB7CiAjaWZuZGVmIEhBVkVfU1RSRVJST1JfUgotICByZXR1cm4gImVycm5vID0gIiArIGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RkOjpzdHJpbmc+KGVycm5vX2NvcHkpOworICByZXR1cm4gImVycm5vID0gIiArIHRvX3N0cmluZyhlcnJub19jb3B5KTsKICNlbHNlIC8vIEhBVkVfU1RSRVJST1JfUgogCiAgIGNoYXIgYl9lcnJidWZbMTAyNF0gPSB7J1wwJ307CkBAIC0xMTIsNyArMTEyLDcgQEAKICAgaWYgKHJ2ID09IC0xKSB7CiAgICAgLy8gc3RyZXJyb3JfciBmYWlsZWQuICBvbWd3dGZiYnEuCiAgICAgcmV0dXJuICJYU0ktY29tcGxpYW50IHN0cmVycm9yX3IoKSBmYWlsZWQgd2l0aCBlcnJubyA9ICIKLSAgICAgICAgICAgKyBib29zdDo6bGV4aWNhbF9jYXN0PHN0ZDo6c3RyaW5nPihlcnJub19jb3B5KTsKKyAgICAgICAgICAgKyB0b19zdHJpbmcoZXJybm9fY29weSk7CiAgIH0KICNlbmRpZgogICAvLyBDYW4gYW55b25lIHByb3ZlIHRoYXQgZXhwbGljaXQgY2FzdCBpcyBwcm9iYWJseSBub3QgbmVjZXNzYXJ5CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvVFByb2Nlc3Nvci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1RQcm9jZXNzb3IuaAppbmRleCBkOGY4NmM0Li42YTQ2NDY2IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvVFByb2Nlc3Nvci5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9UUHJvY2Vzc29yLmgKQEAgLTIyLDcgKzIyLDYgQEAKIAogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmg+Ci0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+CiAKIG5hbWVzcGFjZSBhcGFjaGUgewogbmFtZXNwYWNlIHRocmlmdCB7CkBAIC0xNDIsMjggKzE0MSwyOCBAQAogcHVibGljOgogICB2aXJ0dWFsIH5UUHJvY2Vzc29yKCkge30KIAotICB2aXJ0dWFsIGJvb2wgcHJvY2Vzcyhib29zdDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0LAorICB2aXJ0dWFsIGJvb2wgcHJvY2VzcyhzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW4sCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNvbm5lY3Rpb25Db250ZXh0KSA9IDA7CiAKLSAgYm9vbCBwcm9jZXNzKGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBpbywgdm9pZCogY29ubmVjdGlvbkNvbnRleHQpIHsKKyAgYm9vbCBwcm9jZXNzKHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gaW8sIHZvaWQqIGNvbm5lY3Rpb25Db250ZXh0KSB7CiAgICAgcmV0dXJuIHByb2Nlc3MoaW8sIGlvLCBjb25uZWN0aW9uQ29udGV4dCk7CiAgIH0KIAotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRXZlbnRIYW5kbGVyPiBnZXRFdmVudEhhbmRsZXIoKSB7IHJldHVybiBldmVudEhhbmRsZXJfOyB9CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRXZlbnRIYW5kbGVyPiBnZXRFdmVudEhhbmRsZXIoKSBjb25zdCB7IHJldHVybiBldmVudEhhbmRsZXJfOyB9CiAKLSAgdm9pZCBzZXRFdmVudEhhbmRsZXIoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckV2ZW50SGFuZGxlcj4gZXZlbnRIYW5kbGVyKSB7CisgIHZvaWQgc2V0RXZlbnRIYW5kbGVyKHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRXZlbnRIYW5kbGVyPiBldmVudEhhbmRsZXIpIHsKICAgICBldmVudEhhbmRsZXJfID0gZXZlbnRIYW5kbGVyOwogICB9CiAKIHByb3RlY3RlZDoKICAgVFByb2Nlc3NvcigpIHt9CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckV2ZW50SGFuZGxlcj4gZXZlbnRIYW5kbGVyXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JFdmVudEhhbmRsZXI+IGV2ZW50SGFuZGxlcl87CiB9OwogCiAvKioKLSAqIFRoaXMgaXMgYSBoZWxwZXIgY2xhc3MgdG8gYWxsb3cgYm9vc3Q6OnNoYXJlZF9wdHIgdG8gYmUgdXNlZCB3aXRoIGhhbmRsZXIKKyAqIFRoaXMgaXMgYSBoZWxwZXIgY2xhc3MgdG8gYWxsb3cgc3RkOjpzaGFyZWRfcHRyIHRvIGJlIHVzZWQgd2l0aCBoYW5kbGVyCiAgKiBwb2ludGVycyByZXR1cm5lZCBieSB0aGUgZ2VuZXJhdGVkIGhhbmRsZXIgZmFjdG9yaWVzLgogICoKICAqIFRoZSBoYW5kbGVyIGZhY3RvcnkgY2xhc3NlcyBnZW5lcmF0ZWQgYnkgdGhlIHRocmlmdCBjb21waWxlciByZXR1cm4gcmF3CkBAIC0xNzcsNyArMTc2LDcgQEAKIHRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyRmFjdG9yeV8+CiBjbGFzcyBSZWxlYXNlSGFuZGxlciB7CiBwdWJsaWM6Ci0gIFJlbGVhc2VIYW5kbGVyKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPEhhbmRsZXJGYWN0b3J5Xz4mIGhhbmRsZXJGYWN0b3J5KQorICBSZWxlYXNlSGFuZGxlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SGFuZGxlckZhY3RvcnlfPiYgaGFuZGxlckZhY3RvcnkpCiAgICAgOiBoYW5kbGVyRmFjdG9yeV8oaGFuZGxlckZhY3RvcnkpIHt9CiAKICAgdm9pZCBvcGVyYXRvcigpKHR5cGVuYW1lIEhhbmRsZXJGYWN0b3J5Xzo6SGFuZGxlciogaGFuZGxlcikgewpAQCAtMTg3LDE4ICsxODYsMTggQEAKICAgfQogCiBwcml2YXRlOgotICBib29zdDo6c2hhcmVkX3B0cjxIYW5kbGVyRmFjdG9yeV8+IGhhbmRsZXJGYWN0b3J5XzsKKyAgc3RkOjpzaGFyZWRfcHRyPEhhbmRsZXJGYWN0b3J5Xz4gaGFuZGxlckZhY3RvcnlfOwogfTsKIAogc3RydWN0IFRDb25uZWN0aW9uSW5mbyB7CiAgIC8vIFRoZSBpbnB1dCBhbmQgb3V0cHV0IHByb3RvY29scwotICBib29zdDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbnB1dDsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0cHV0OworICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW5wdXQ7CisgIHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBvdXRwdXQ7CiAgIC8vIFRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCB1c2VkIGZvciB0aGUgY29ubmVjdGlvbgogICAvLyBUaGlzIGlzIHRoZSB0cmFuc3BvcnQgdGhhdCB3YXMgcmV0dXJuZWQgYnkgVFNlcnZlclRyYW5zcG9ydDo6YWNjZXB0KCksCiAgIC8vIGFuZCBpdCBtYXkgYmUgZGlmZmVyZW50IHRoYW4gdGhlIHRyYW5zcG9ydCBwb2ludGVkIHRvIGJ5IHRoZSBpbnB1dCBhbmQKICAgLy8gb3V0cHV0IHByb3RvY29scy4KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8dHJhbnNwb3J0OjpUVHJhbnNwb3J0PiB0cmFuc3BvcnQ7CisgIHN0ZDo6c2hhcmVkX3B0cjx0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ+IHRyYW5zcG9ydDsKIH07CiAKIGNsYXNzIFRQcm9jZXNzb3JGYWN0b3J5IHsKQEAgLTIxMiwxNyArMjExLDE3IEBACiAgICAqIGFjY2VwdGVkIG9uLiAgVGhpcyBnZW5lcmFsbHkgbWVhbnMgdGhhdCB0aGlzIGNhbGwgZG9lcyBub3QgbmVlZCB0byBiZQogICAgKiB0aHJlYWQgc2FmZSwgYXMgaXQgd2lsbCBhbHdheXMgYmUgaW52b2tlZCBmcm9tIGEgc2luZ2xlIHRocmVhZC4KICAgICovCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gZ2V0UHJvY2Vzc29yKGNvbnN0IFRDb25uZWN0aW9uSW5mbyYgY29ubkluZm8pID0gMDsKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gZ2V0UHJvY2Vzc29yKGNvbnN0IFRDb25uZWN0aW9uSW5mbyYgY29ubkluZm8pID0gMDsKIH07CiAKIGNsYXNzIFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5IDogcHVibGljIFRQcm9jZXNzb3JGYWN0b3J5IHsKIHB1YmxpYzoKLSAgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yKSA6IHByb2Nlc3Nvcl8ocHJvY2Vzc29yKSB7fQorICBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yKSA6IHByb2Nlc3Nvcl8ocHJvY2Vzc29yKSB7fQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IGdldFByb2Nlc3Nvcihjb25zdCBUQ29ubmVjdGlvbkluZm8mKSB7IHJldHVybiBwcm9jZXNzb3JfOyB9CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBnZXRQcm9jZXNzb3IoY29uc3QgVENvbm5lY3Rpb25JbmZvJikgeyByZXR1cm4gcHJvY2Vzc29yXzsgfQogCiBwcml2YXRlOgotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3JfOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yXzsKIH07CiB9CiB9IC8vIGFwYWNoZTo6dGhyaWZ0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvVFRvU3RyaW5nLmggYi9saWIvY3BwL3NyYy90aHJpZnQvVFRvU3RyaW5nLmgKaW5kZXggNTAyMzg2OS4uMjU3ODBmOSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L1RUb1N0cmluZy5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9UVG9TdHJpbmcuaApAQCAtMjAsMjAgKzIwLDQ1IEBACiAjaWZuZGVmIF9USFJJRlRfVE9TVFJJTkdfSF8KICNkZWZpbmUgX1RIUklGVF9UT1NUUklOR19IXyAxCiAKLSNpbmNsdWRlIDxib29zdC9sZXhpY2FsX2Nhc3QuaHBwPgotCi0jaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgPGxpbWl0cz4KICNpbmNsdWRlIDxtYXA+CiAjaW5jbHVkZSA8c2V0PgotI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAKIG5hbWVzcGFjZSBhcGFjaGUgewogbmFtZXNwYWNlIHRocmlmdCB7CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgogc3RkOjpzdHJpbmcgdG9fc3RyaW5nKGNvbnN0IFQmIHQpIHsKLSAgcmV0dXJuIGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RkOjpzdHJpbmc+KHQpOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gbzsKKyAgbyA8PCB0OworICByZXR1cm4gby5zdHIoKTsKK30KKworLy8gVE9ETzogcmVwbGFjZSB0aGUgY29tcHV0YXRpb25zIGJlbG93IHdpdGggc3RkOjpudW1lcmljX2xpbWl0czo6bWF4X2RpZ2l0czEwIG9uY2UgQysrMTEKKy8vIGlzIGVuYWJsZWQuCitpbmxpbmUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKGNvbnN0IGZsb2F0JiB0KSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvOworICBvLnByZWNpc2lvbihzdGF0aWNfY2FzdDxzdGQ6OnN0cmVhbXNpemU+KHN0ZDo6Y2VpbChzdGF0aWNfY2FzdDxkb3VibGU+KHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjpkaWdpdHMgKiBzdGQ6OmxvZzEwKDIuMGYpICsgMSkpKSk7CisgIG8gPDwgdDsKKyAgcmV0dXJuIG8uc3RyKCk7Cit9CisKK2lubGluZSBzdGQ6OnN0cmluZyB0b19zdHJpbmcoY29uc3QgZG91YmxlJiB0KSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvOworICBvLnByZWNpc2lvbihzdGF0aWNfY2FzdDxzdGQ6OnN0cmVhbXNpemU+KHN0ZDo6Y2VpbChzdGF0aWNfY2FzdDxkb3VibGU+KHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6ZGlnaXRzICogc3RkOjpsb2cxMCgyLjBmKSArIDEpKSkpOworICBvIDw8IHQ7CisgIHJldHVybiBvLnN0cigpOworfQorCitpbmxpbmUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKGNvbnN0IGxvbmcgZG91YmxlJiB0KSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvOworICBvLnByZWNpc2lvbihzdGF0aWNfY2FzdDxzdGQ6OnN0cmVhbXNpemU+KHN0ZDo6Y2VpbChzdGF0aWNfY2FzdDxkb3VibGU+KHN0ZDo6bnVtZXJpY19saW1pdHM8bG9uZyBkb3VibGU+OjpkaWdpdHMgKiBzdGQ6OmxvZzEwKDIuMGYpICsgMSkpKSk7CisgIG8gPDwgdDsKKyAgcmV0dXJuIG8uc3RyKCk7CiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L1RocmlmdC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1RocmlmdC5oCmluZGV4IGU4ZTcwZWIuLjYzMjI3NDIgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9UaHJpZnQuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvVGhyaWZ0LmgKQEAgLTQyLDkgKzQyLDYgQEAKICNpbmNsdWRlIDxleGNlcHRpb24+CiAjaW5jbHVkZSA8dHlwZWluZm8+CiAKLSNpbmNsdWRlIDxib29zdC91dGlsaXR5L2VuYWJsZV9pZi5ocHA+Ci0jaW5jbHVkZSA8Ym9vc3QvdHlwZV90cmFpdHMvaXNfY29udmVydGlibGUuaHBwPgotCiAjaW5jbHVkZSA8dGhyaWZ0L1RMb2dnaW5nLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L1RPdXRwdXQuaD4KIApAQCAtODIsOSArNzksOSBAQAogCiAgIFRFeGNlcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIDogbWVzc2FnZV8obWVzc2FnZSkge30KIAotICB2aXJ0dWFsIH5URXhjZXB0aW9uKCkgdGhyb3coKSB7fQorICB2aXJ0dWFsIH5URXhjZXB0aW9uKCkgbm9leGNlcHQge30KIAotICB2aXJ0dWFsIGNvbnN0IGNoYXIqIHdoYXQoKSBjb25zdCB0aHJvdygpIHsKKyAgdmlydHVhbCBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3Qgbm9leGNlcHQgewogICAgIGlmIChtZXNzYWdlXy5lbXB0eSgpKSB7CiAgICAgICByZXR1cm4gIkRlZmF1bHQgVEV4Y2VwdGlvbi4iOwogICAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jQnVmZmVyUHJvY2Vzc29yLmggYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jQnVmZmVyUHJvY2Vzc29yLmgKaW5kZXggM2M5NTdhNi4uOWM5NmIxNCAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY0J1ZmZlclByb2Nlc3Nvci5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNCdWZmZXJQcm9jZXNzb3IuaApAQCAtMjAsOSArMjAsNyBAQAogI2lmbmRlZiBfVEhSSUZUX1RBU1lOQ19CVUZGRVJfUFJPQ0VTU09SX0hfCiAjZGVmaW5lIF9USFJJRlRfVEFTWU5DX0JVRkZFUl9QUk9DRVNTT1JfSF8gMQogCi0jaW5jbHVkZSA8dGhyaWZ0L2N4eGZ1bmN0aW9uYWwuaD4KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLQorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CiAKIG5hbWVzcGFjZSBhcGFjaGUgewpAQCAtMzYsOSArMzQsOSBAQAogICAvLyBmb3JjZWZ1bGx5IGNsb3NlIHRoZSBjb25uZWN0aW9uIChpZiBhcHBsaWNhYmxlKS4KICAgLy8gImluIiBhbmQgIm91dCIgc2hvdWxkIGJlIFRNZW1vcnlCdWZmZXIgb3Igc2ltaWxhciwKICAgLy8gbm90IGEgd3JhcHBlciBhcm91bmQgYSBzb2NrZXQuCi0gIHZpcnR1YWwgdm9pZCBwcm9jZXNzKGFwYWNoZTo6dGhyaWZ0OjpzdGRjeHg6OmZ1bmN0aW9uPHZvaWQoYm9vbCBoZWFsdGh5KT4gX3JldHVybiwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VEJ1ZmZlckJhc2U+IGlidWYsCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRCdWZmZXJCYXNlPiBvYnVmKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBwcm9jZXNzKHN0ZDo6ZnVuY3Rpb248dm9pZChib29sIGhlYWx0aHkpPiBfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8dHJhbnNwb3J0OjpUQnVmZmVyQmFzZT4gaWJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHRyYW5zcG9ydDo6VEJ1ZmZlckJhc2U+IG9idWYpID0gMDsKICAgdmlydHVhbCB+VEFzeW5jQnVmZmVyUHJvY2Vzc29yKCkge30KIH07CiB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jQ2hhbm5lbC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jQ2hhbm5lbC5jcHAKaW5kZXggNDcxNmFmMi4uMDFiOTExMyAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY0NoYW5uZWwuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNDaGFubmVsLmNwcApAQCAtMTgsNyArMTgsNiBAQAogICovCiAKICNpbmNsdWRlIDx0aHJpZnQvYXN5bmMvVEFzeW5jQ2hhbm5lbC5oPgotI2luY2x1ZGUgPHRocmlmdC9jeHhmdW5jdGlvbmFsLmg+CiAKIG5hbWVzcGFjZSBhcGFjaGUgewogbmFtZXNwYWNlIHRocmlmdCB7CkBAIC0yNyw4ICsyNiw4IEBACiB2b2lkIFRBc3luY0NoYW5uZWw6OnNlbmRBbmRSZWN2TWVzc2FnZShjb25zdCBWb2lkQ2FsbGJhY2smIGNvYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRNZW1vcnlCdWZmZXIqIHNlbmRCdWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTWVtb3J5QnVmZmVyKiByZWN2QnVmKSB7Ci0gIGFwYWNoZTo6dGhyaWZ0OjpzdGRjeHg6OmZ1bmN0aW9uPHZvaWQoKT4gc2VuZF9kb25lCi0gICAgICA9IGFwYWNoZTo6dGhyaWZ0OjpzdGRjeHg6OmJpbmQoJlRBc3luY0NoYW5uZWw6OnJlY3ZNZXNzYWdlLCB0aGlzLCBjb2IsIHJlY3ZCdWYpOworICBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gc2VuZF9kb25lCisgICAgICA9IHN0ZDo6YmluZCgmVEFzeW5jQ2hhbm5lbDo6cmVjdk1lc3NhZ2UsIHRoaXMsIGNvYiwgcmVjdkJ1Zik7CiAKICAgc2VuZE1lc3NhZ2Uoc2VuZF9kb25lLCBzZW5kQnVmKTsKIH0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNDaGFubmVsLmggYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jQ2hhbm5lbC5oCmluZGV4IGViM2NlMmEuLmQ3YWNlOTYgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNDaGFubmVsLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY0NoYW5uZWwuaApAQCAtMjAsNyArMjAsOCBAQAogI2lmbmRlZiBfVEhSSUZUX0FTWU5DX1RBU1lOQ0NIQU5ORUxfSF8KICNkZWZpbmUgX1RIUklGVF9BU1lOQ19UQVNZTkNDSEFOTkVMX0hfIDEKIAotI2luY2x1ZGUgPHRocmlmdC9jeHhmdW5jdGlvbmFsLmg+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8dGhyaWZ0L1RocmlmdC5oPgogCiBuYW1lc3BhY2UgYXBhY2hlIHsKQEAgLTM4LDcgKzM5LDcgQEAKIAogY2xhc3MgVEFzeW5jQ2hhbm5lbCB7CiBwdWJsaWM6Ci0gIHR5cGVkZWYgYXBhY2hlOjp0aHJpZnQ6OnN0ZGN4eDo6ZnVuY3Rpb248dm9pZCgpPiBWb2lkQ2FsbGJhY2s7CisgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjx2b2lkKCk+IFZvaWRDYWxsYmFjazsKIAogICB2aXJ0dWFsIH5UQXN5bmNDaGFubmVsKCkge30KIApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY0Rpc3BhdGNoUHJvY2Vzc29yLmggYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jRGlzcGF0Y2hQcm9jZXNzb3IuaAppbmRleCBlNzljNTdkLi41OWRiNTk3IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jRGlzcGF0Y2hQcm9jZXNzb3IuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jRGlzcGF0Y2hQcm9jZXNzb3IuaApAQCAtMzQsOSArMzQsOSBAQAogdGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4KIGNsYXNzIFRBc3luY0Rpc3BhdGNoUHJvY2Vzc29yVCA6IHB1YmxpYyBUQXN5bmNQcm9jZXNzb3IgewogcHVibGljOgotICB2aXJ0dWFsIHZvaWQgcHJvY2VzcyhhcGFjaGU6OnRocmlmdDo6c3RkY3h4OjpmdW5jdGlvbjx2b2lkKGJvb2wgc3VjY2Vzcyk+IF9yZXR1cm4sCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGluLAotICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBvdXQpIHsKKyAgdmlydHVhbCB2b2lkIHByb2Nlc3Moc3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgc3VjY2Vzcyk+IF9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dCkgewogICAgIHByb3RvY29sOjpUUHJvdG9jb2wqIGluUmF3ID0gaW4uZ2V0KCk7CiAgICAgcHJvdG9jb2w6OlRQcm90b2NvbCogb3V0UmF3ID0gb3V0LmdldCgpOwogCkBAIC03MCw3ICs3MCw3IEBACiAgICAgcmV0dXJuIHRoaXMtPmRpc3BhdGNoQ2FsbChfcmV0dXJuLCBpblJhdywgb3V0UmF3LCBmbmFtZSwgc2VxaWQpOwogICB9CiAKLSAgdm9pZCBwcm9jZXNzRmFzdChhcGFjaGU6OnRocmlmdDo6c3RkY3h4OjpmdW5jdGlvbjx2b2lkKGJvb2wgc3VjY2Vzcyk+IF9yZXR1cm4sCisgIHZvaWQgcHJvY2Vzc0Zhc3Qoc3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgc3VjY2Vzcyk+IF9yZXR1cm4sCiAgICAgICAgICAgICAgICAgICAgUHJvdG9jb2xfKiBpbiwKICAgICAgICAgICAgICAgICAgICBQcm90b2NvbF8qIG91dCkgewogICAgIHN0ZDo6c3RyaW5nIGZuYW1lOwpAQCAtODcsMTMgKzg3LDEzIEBACiAgICAgcmV0dXJuIHRoaXMtPmRpc3BhdGNoQ2FsbFRlbXBsYXRlZChfcmV0dXJuLCBpbiwgb3V0LCBmbmFtZSwgc2VxaWQpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIGRpc3BhdGNoQ2FsbChhcGFjaGU6OnRocmlmdDo6c3RkY3h4OjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiBfcmV0dXJuLAorICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2hDYWxsKHN0ZDo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gX3JldHVybiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzZXFpZCkgPSAwOwogCi0gIHZpcnR1YWwgdm9pZCBkaXNwYXRjaENhbGxUZW1wbGF0ZWQoYXBhY2hlOjp0aHJpZnQ6OnN0ZGN4eDo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gX3JldHVybiwKKyAgdmlydHVhbCB2b2lkIGRpc3BhdGNoQ2FsbFRlbXBsYXRlZChzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+IF9yZXR1cm4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG9jb2xfKiBpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90b2NvbF8qIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZm5hbWUsCkBAIC0xMDYsOSArMTA2LDkgQEAKICAqLwogY2xhc3MgVEFzeW5jRGlzcGF0Y2hQcm9jZXNzb3IgOiBwdWJsaWMgVEFzeW5jUHJvY2Vzc29yIHsKIHB1YmxpYzoKLSAgdmlydHVhbCB2b2lkIHByb2Nlc3MoYXBhY2hlOjp0aHJpZnQ6OnN0ZGN4eDo6ZnVuY3Rpb248dm9pZChib29sIHN1Y2Nlc3MpPiBfcmV0dXJuLAotICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0KSB7CisgIHZpcnR1YWwgdm9pZCBwcm9jZXNzKHN0ZDo6ZnVuY3Rpb248dm9pZChib29sIHN1Y2Nlc3MpPiBfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW4sCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBvdXQpIHsKICAgICBwcm90b2NvbDo6VFByb3RvY29sKiBpblJhdyA9IGluLmdldCgpOwogICAgIHByb3RvY29sOjpUUHJvdG9jb2wqIG91dFJhdyA9IG91dC5nZXQoKTsKIApAQCAtMTMxLDcgKzEzMSw3IEBACiAgICAgcmV0dXJuIGRpc3BhdGNoQ2FsbChfcmV0dXJuLCBpblJhdywgb3V0UmF3LCBmbmFtZSwgc2VxaWQpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIGRpc3BhdGNoQ2FsbChhcGFjaGU6OnRocmlmdDo6c3RkY3h4OjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiBfcmV0dXJuLAorICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2hDYWxsKHN0ZDo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gX3JldHVybiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZm5hbWUsCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jUHJvY2Vzc29yLmggYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jUHJvY2Vzc29yLmgKaW5kZXggMDMzZjdkOS4uZmRiOTc2ZCAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY1Byb2Nlc3Nvci5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNQcm9jZXNzb3IuaApAQCAtMjAsOSArMjAsOCBAQAogI2lmbmRlZiBfVEhSSUZUX1RBU1lOQ1BST0NFU1NPUl9IXwogI2RlZmluZSBfVEhSSUZUX1RBU1lOQ1BST0NFU1NPUl9IXyAxCiAKLSNpbmNsdWRlIDx0aHJpZnQvY3h4ZnVuY3Rpb25hbC5oPgotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgogI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8dGhyaWZ0L1RQcm9jZXNzb3IuaD4KIAogbmFtZXNwYWNlIGFwYWNoZSB7CkBAIC0zNCwzOCArMzMsMjkgQEAKICAqIHRoZSBjYWxsIHRvIHByb2Nlc3MgcmV0dXJucy4gIEluc3RlYWQsIGl0IGNhbGxzIGEgY29iIHRvIHNpZ25hbCBjb21wbGV0aW9uLgogICovCiAKLWNsYXNzIFRFdmVudFNlcnZlcjsgLy8gZm9yd2FyZCBkZWNsYXJhdGlvbgotCiBjbGFzcyBUQXN5bmNQcm9jZXNzb3IgewogcHVibGljOgogICB2aXJ0dWFsIH5UQXN5bmNQcm9jZXNzb3IoKSB7fQogCi0gIHZpcnR1YWwgdm9pZCBwcm9jZXNzKGFwYWNoZTo6dGhyaWZ0OjpzdGRjeHg6OmZ1bmN0aW9uPHZvaWQoYm9vbCBzdWNjZXNzKT4gX3JldHVybiwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW4sCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dCkgPSAwOworICB2aXJ0dWFsIHZvaWQgcHJvY2VzcyhzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBzdWNjZXNzKT4gX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGluLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0KSA9IDA7CiAKLSAgdm9pZCBwcm9jZXNzKGFwYWNoZTo6dGhyaWZ0OjpzdGRjeHg6OmZ1bmN0aW9uPHZvaWQoYm9vbCBzdWNjZXNzKT4gX3JldHVybiwKLSAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBpbykgeworICB2b2lkIHByb2Nlc3Moc3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgc3VjY2Vzcyk+IF9yZXR1cm4sCisgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW8pIHsKICAgICByZXR1cm4gcHJvY2VzcyhfcmV0dXJuLCBpbywgaW8pOwogICB9CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckV2ZW50SGFuZGxlcj4gZ2V0RXZlbnRIYW5kbGVyKCkgeyByZXR1cm4gZXZlbnRIYW5kbGVyXzsgfQorICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckV2ZW50SGFuZGxlcj4gZ2V0RXZlbnRIYW5kbGVyKCkgY29uc3QgeyByZXR1cm4gZXZlbnRIYW5kbGVyXzsgfQogCi0gIHZvaWQgc2V0RXZlbnRIYW5kbGVyKGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JFdmVudEhhbmRsZXI+IGV2ZW50SGFuZGxlcikgeworICB2b2lkIHNldEV2ZW50SGFuZGxlcihzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckV2ZW50SGFuZGxlcj4gZXZlbnRIYW5kbGVyKSB7CiAgICAgZXZlbnRIYW5kbGVyXyA9IGV2ZW50SGFuZGxlcjsKICAgfQogCi0gIGNvbnN0IFRFdmVudFNlcnZlciogZ2V0QXN5bmNTZXJ2ZXIoKSB7IHJldHVybiBhc3luY1NlcnZlcl87IH0KLQogcHJvdGVjdGVkOgogICBUQXN5bmNQcm9jZXNzb3IoKSB7fQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JFdmVudEhhbmRsZXI+IGV2ZW50SGFuZGxlcl87Ci0gIGNvbnN0IFRFdmVudFNlcnZlciogYXN5bmNTZXJ2ZXJfOwotCi1wcml2YXRlOgotICBmcmllbmQgY2xhc3MgVEV2ZW50U2VydmVyOwotICB2b2lkIHNldEFzeW5jU2VydmVyKGNvbnN0IFRFdmVudFNlcnZlciogc2VydmVyKSB7IGFzeW5jU2VydmVyXyA9IHNlcnZlcjsgfQorICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckV2ZW50SGFuZGxlcj4gZXZlbnRIYW5kbGVyXzsKIH07CiAKIGNsYXNzIFRBc3luY1Byb2Nlc3NvckZhY3RvcnkgewpAQCAtNzksMTYgKzY5LDE1IEBACiAgICAqIGFjY2VwdGVkIG9uLiAgVGhpcyBnZW5lcmFsbHkgbWVhbnMgdGhhdCB0aGlzIGNhbGwgZG9lcyBub3QgbmVlZCB0byBiZQogICAgKiB0aHJlYWQgc2FmZSwgYXMgaXQgd2lsbCBhbHdheXMgYmUgaW52b2tlZCBmcm9tIGEgc2luZ2xlIHRocmVhZC4KICAgICovCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VEFzeW5jUHJvY2Vzc29yPiBnZXRQcm9jZXNzb3IoY29uc3QgVENvbm5lY3Rpb25JbmZvJiBjb25uSW5mbykgPSAwOworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUQXN5bmNQcm9jZXNzb3I+IGdldFByb2Nlc3Nvcihjb25zdCBUQ29ubmVjdGlvbkluZm8mIGNvbm5JbmZvKSA9IDA7CiB9OwogfQogfQogfSAvLyBhcGFjaGU6OnRocmlmdDo6YXN5bmMKIAotLy8gWFhYIEknbSBsYXp5IGZvciBub3cKIG5hbWVzcGFjZSBhcGFjaGUgewogbmFtZXNwYWNlIHRocmlmdCB7Ci11c2luZyBhcGFjaGU6OnRocmlmdDo6YXN5bmM6OlRBc3luY1Byb2Nlc3NvcjsKKyAgdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmFzeW5jOjpUQXN5bmNQcm9jZXNzb3I7CiB9CiB9CiAKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNQcm90b2NvbFByb2Nlc3Nvci5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IuY3BwCmluZGV4IDVhNGYzNDcuLmNiNTIwMWIgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNQcm90b2NvbFByb2Nlc3Nvci5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY1Byb3RvY29sUHJvY2Vzc29yLmNwcApAQCAtMjYsMjMgKzI2LDIzIEBACiBuYW1lc3BhY2UgdGhyaWZ0IHsKIG5hbWVzcGFjZSBhc3luYyB7CiAKLXZvaWQgVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3I6OnByb2Nlc3MoYXBhY2hlOjp0aHJpZnQ6OnN0ZGN4eDo6ZnVuY3Rpb248dm9pZChib29sIGhlYWx0aHkpPiBfcmV0dXJuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUQnVmZmVyQmFzZT4gaWJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VEJ1ZmZlckJhc2U+IG9idWYpIHsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBpcHJvdChwZmFjdF8tPmdldFByb3RvY29sKGlidWYpKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBvcHJvdChwZmFjdF8tPmdldFByb3RvY29sKG9idWYpKTsKK3ZvaWQgVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3I6OnByb2Nlc3Moc3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgaGVhbHRoeSk+IF9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUQnVmZmVyQmFzZT4gaWJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRCdWZmZXJCYXNlPiBvYnVmKSB7CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlwcm90KHBmYWN0Xy0+Z2V0UHJvdG9jb2woaWJ1ZikpOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBvcHJvdChwZmFjdF8tPmdldFByb3RvY29sKG9idWYpKTsKICAgcmV0dXJuIHVuZGVybHlpbmdfCi0gICAgICAtPnByb2Nlc3MoYXBhY2hlOjp0aHJpZnQ6OnN0ZGN4eDo6YmluZCgmVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3I6OmZpbmlzaCwKKyAgICAgIC0+cHJvY2VzcyhzdGQ6OmJpbmQoJlRBc3luY1Byb3RvY29sUHJvY2Vzc29yOjpmaW5pc2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmV0dXJuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Byb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6c3RkY3h4OjpwbGFjZWhvbGRlcnM6Ol8xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSksCiAgICAgICAgICAgICAgICAgaXByb3QsCiAgICAgICAgICAgICAgICAgb3Byb3QpOwogfQogCiAvKiBzdGF0aWMgKi8gdm9pZCBUQXN5bmNQcm90b2NvbFByb2Nlc3Nvcjo6ZmluaXNoKAotICAgIGFwYWNoZTo6dGhyaWZ0OjpzdGRjeHg6OmZ1bmN0aW9uPHZvaWQoYm9vbCBoZWFsdGh5KT4gX3JldHVybiwKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IG9wcm90LAorICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChib29sIGhlYWx0aHkpPiBfcmV0dXJuLAorICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IG9wcm90LAogICAgIGJvb2wgaGVhbHRoeSkgewogICAodm9pZClvcHJvdDsKICAgLy8gVGhpcyBpcyBhIHN0dWIgZnVuY3Rpb24gdG8gaG9sZCBhIHJlZmVyZW5jZSB0byBvcHJvdC4KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNQcm90b2NvbFByb2Nlc3Nvci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY1Byb3RvY29sUHJvY2Vzc29yLmgKaW5kZXggM2YyYjM5NC4uODA1MmNmMyAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY1Byb3RvY29sUHJvY2Vzc29yLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY1Byb3RvY29sUHJvY2Vzc29yLmgKQEAgLTMwLDIzICszMCwyMyBAQAogCiBjbGFzcyBUQXN5bmNQcm90b2NvbFByb2Nlc3NvciA6IHB1YmxpYyBUQXN5bmNCdWZmZXJQcm9jZXNzb3IgewogcHVibGljOgotICBUQXN5bmNQcm90b2NvbFByb2Nlc3Nvcihib29zdDo6c2hhcmVkX3B0cjxUQXN5bmNQcm9jZXNzb3I+IHVuZGVybHlpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4gcGZhY3QpCisgIFRBc3luY1Byb3RvY29sUHJvY2Vzc29yKHN0ZDo6c2hhcmVkX3B0cjxUQXN5bmNQcm9jZXNzb3I+IHVuZGVybHlpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+IHBmYWN0KQogICAgIDogdW5kZXJseWluZ18odW5kZXJseWluZyksIHBmYWN0XyhwZmFjdCkge30KIAotICB2aXJ0dWFsIHZvaWQgcHJvY2VzcyhhcGFjaGU6OnRocmlmdDo6c3RkY3h4OjpmdW5jdGlvbjx2b2lkKGJvb2wgaGVhbHRoeSk+IF9yZXR1cm4sCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRCdWZmZXJCYXNlPiBpYnVmLAotICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUQnVmZmVyQmFzZT4gb2J1Zik7CisgIHZpcnR1YWwgdm9pZCBwcm9jZXNzKHN0ZDo6ZnVuY3Rpb248dm9pZChib29sIGhlYWx0aHkpPiBfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VEJ1ZmZlckJhc2U+IGlidWYsCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUQnVmZmVyQmFzZT4gb2J1Zik7CiAKICAgdmlydHVhbCB+VEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IoKSB7fQogCiBwcml2YXRlOgotICBzdGF0aWMgdm9pZCBmaW5pc2goYXBhY2hlOjp0aHJpZnQ6OnN0ZGN4eDo6ZnVuY3Rpb248dm9pZChib29sIGhlYWx0aHkpPiBfcmV0dXJuLAotICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IG9wcm90LAorICBzdGF0aWMgdm9pZCBmaW5pc2goc3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgaGVhbHRoeSk+IF9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IG9wcm90LAogICAgICAgICAgICAgICAgICAgICAgYm9vbCBoZWFsdGh5KTsKIAotICBib29zdDo6c2hhcmVkX3B0cjxUQXN5bmNQcm9jZXNzb3I+IHVuZGVybHlpbmdfOwotICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+IHBmYWN0XzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRBc3luY1Byb2Nlc3Nvcj4gdW5kZXJseWluZ187CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+IHBmYWN0XzsKIH07CiB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mby5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RDb25jdXJyZW50Q2xpZW50U3luY0luZm8uaAppbmRleCA4OTk3YTIzLi4wYmM1ZWI1IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mby5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQ29uY3VycmVudENsaWVudFN5bmNJbmZvLmgKQEAgLTIyLDgxICsyMiw4MCBAQAogI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaD4KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguaD4KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oPgotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDx2ZWN0b3I+CiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPG1hcD4KIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgYXN5bmMgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBhc3luYyB7CiAKIGNsYXNzIFRDb25jdXJyZW50Q2xpZW50U3luY0luZm87CiAKLWNsYXNzIFRDb25jdXJyZW50U2VuZFNlbnRyeQoteworY2xhc3MgVENvbmN1cnJlbnRTZW5kU2VudHJ5IHsKIHB1YmxpYzoKLSAgZXhwbGljaXQgVENvbmN1cnJlbnRTZW5kU2VudHJ5KFRDb25jdXJyZW50Q2xpZW50U3luY0luZm8gKnN5bmMpOworICBleHBsaWNpdCBUQ29uY3VycmVudFNlbmRTZW50cnkoVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbyogc3luYyk7CiAgIH5UQ29uY3VycmVudFNlbmRTZW50cnkoKTsKIAogICB2b2lkIGNvbW1pdCgpOworCiBwcml2YXRlOgotICBUQ29uY3VycmVudENsaWVudFN5bmNJbmZvICZzeW5jXzsKKyAgVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbyYgc3luY187CiAgIGJvb2wgY29tbWl0dGVkXzsKIH07CiAKLWNsYXNzIFRDb25jdXJyZW50UmVjdlNlbnRyeQoteworY2xhc3MgVENvbmN1cnJlbnRSZWN2U2VudHJ5IHsKIHB1YmxpYzoKLSAgVENvbmN1cnJlbnRSZWN2U2VudHJ5KFRDb25jdXJyZW50Q2xpZW50U3luY0luZm8gKnN5bmMsIGludDMyX3Qgc2VxaWQpOworICBUQ29uY3VycmVudFJlY3ZTZW50cnkoVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbyogc3luYywgaW50MzJfdCBzZXFpZCk7CiAgIH5UQ29uY3VycmVudFJlY3ZTZW50cnkoKTsKIAogICB2b2lkIGNvbW1pdCgpOworCiBwcml2YXRlOgotICBUQ29uY3VycmVudENsaWVudFN5bmNJbmZvICZzeW5jXzsKKyAgVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbyYgc3luY187CiAgIGludDMyX3Qgc2VxaWRfOwogICBib29sIGNvbW1pdHRlZF87CiB9OwogCi1jbGFzcyBUQ29uY3VycmVudENsaWVudFN5bmNJbmZvCi17Ci1wcml2YXRlOiAvL3R5cGVkZWZzCi0gIHR5cGVkZWYgYm9vc3Q6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNb25pdG9yPiBNb25pdG9yUHRyOworY2xhc3MgVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbyB7Citwcml2YXRlOiAvLyB0eXBlZGVmcworICB0eXBlZGVmIHN0ZDo6c2hhcmVkX3B0cjwgOjphcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Ok1vbml0b3I+IE1vbml0b3JQdHI7CiAgIHR5cGVkZWYgc3RkOjptYXA8aW50MzJfdCwgTW9uaXRvclB0cj4gTW9uaXRvck1hcDsKKwogcHVibGljOgogICBUQ29uY3VycmVudENsaWVudFN5bmNJbmZvKCk7CiAKICAgaW50MzJfdCBnZW5lcmF0ZVNlcUlkKCk7CiAKLSAgYm9vbCBnZXRQZW5kaW5nKAotICAgIHN0ZDo6c3RyaW5nICZmbmFtZSwKLSAgICA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VE1lc3NhZ2VUeXBlICZtdHlwZSwKLSAgICBpbnQzMl90ICZyc2VxaWQpOyAvKiByZXF1aXJlcyByZWFkTXV0ZXhfICovCisgIGJvb2wgZ2V0UGVuZGluZyhzdGQ6OnN0cmluZyYgZm5hbWUsCisgICAgICAgICAgICAgICAgICA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VE1lc3NhZ2VUeXBlJiBtdHlwZSwKKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIHJzZXFpZCk7IC8qIHJlcXVpcmVzIHJlYWRNdXRleF8gKi8KIAotICB2b2lkIHVwZGF0ZVBlbmRpbmcoCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcgJmZuYW1lLAotICAgIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUTWVzc2FnZVR5cGUgbXR5cGUsCi0gICAgaW50MzJfdCByc2VxaWQpOyAvKiByZXF1aXJlcyByZWFkTXV0ZXhfICovCisgIHZvaWQgdXBkYXRlUGVuZGluZyhjb25zdCBzdGQ6OnN0cmluZyYgZm5hbWUsCisgICAgICAgICAgICAgICAgICAgICA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VE1lc3NhZ2VUeXBlIG10eXBlLAorICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByc2VxaWQpOyAvKiByZXF1aXJlcyByZWFkTXV0ZXhfICovCiAKICAgdm9pZCB3YWl0Rm9yV29yayhpbnQzMl90IHNlcWlkKTsgLyogcmVxdWlyZXMgcmVhZE11dGV4XyAqLwogCi0gIDo6YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNdXRleCAmZ2V0UmVhZE11dGV4KCkge3JldHVybiByZWFkTXV0ZXhfO30KLSAgOjphcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Ok11dGV4ICZnZXRXcml0ZU11dGV4KCkge3JldHVybiB3cml0ZU11dGV4Xzt9CisgIDo6YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNdXRleCYgZ2V0UmVhZE11dGV4KCkgeyByZXR1cm4gcmVhZE11dGV4XzsgfQorICA6OmFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6TXV0ZXgmIGdldFdyaXRlTXV0ZXgoKSB7IHJldHVybiB3cml0ZU11dGV4XzsgfQogCi1wcml2YXRlOiAvL2NvbnN0YW50cwotICBlbnVtIHtNT05JVE9SX0NBQ0hFX1NJWkUgPSAxMH07Ci1wcml2YXRlOiAvL2Z1bmN0aW9ucworcHJpdmF0ZTogLy8gY29uc3RhbnRzCisgIGVudW0geyBNT05JVE9SX0NBQ0hFX1NJWkUgPSAxMCB9OworCitwcml2YXRlOiAvLyBmdW5jdGlvbnMKICAgTW9uaXRvclB0ciBuZXdNb25pdG9yXygKLSAgICBjb25zdCA6OmFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6R3VhcmQgJnNlcWlkR3VhcmQpOyAvKiByZXF1aXJlcyBzZXFpZE11dGV4XyAqLwotICB2b2lkIGRlbGV0ZU1vbml0b3JfKAotICAgIGNvbnN0IDo6YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpHdWFyZCAmc2VxaWRHdWFyZCwKLSAgICBNb25pdG9yUHRyICZtKTsgLypub2V4Y2VwdCovIC8qIHJlcXVpcmVzIHNlcWlkTXV0ZXhfICovCisgICAgICBjb25zdCA6OmFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6R3VhcmQmIHNlcWlkR3VhcmQpOyAvKiByZXF1aXJlcyBzZXFpZE11dGV4XyAqLworICB2b2lkIGRlbGV0ZU1vbml0b3JfKGNvbnN0IDo6YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpHdWFyZCYgc2VxaWRHdWFyZCwgTW9uaXRvclB0ciYgbSk7CisgICAgICAvKm5vZXhjZXB0Ki8gLyogcmVxdWlyZXMgc2VxaWRNdXRleF8gKi8KICAgdm9pZCB3YWtldXBBbnlvbmVfKAotICAgIGNvbnN0IDo6YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpHdWFyZCAmc2VxaWRHdWFyZCk7IC8qIHJlcXVpcmVzIHNlcWlkTXV0ZXhfICovCi0gIHZvaWQgbWFya0JhZF8oCi0gICAgY29uc3QgOjphcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Okd1YXJkICZzZXFpZEd1YXJkKTsgLyogcmVxdWlyZXMgc2VxaWRNdXRleF8gKi8KKyAgICAgIGNvbnN0IDo6YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpHdWFyZCYgc2VxaWRHdWFyZCk7ICAgICAgICAgICAvKiByZXF1aXJlcyBzZXFpZE11dGV4XyAqLworICB2b2lkIG1hcmtCYWRfKGNvbnN0IDo6YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpHdWFyZCYgc2VxaWRHdWFyZCk7IC8qIHJlcXVpcmVzIHNlcWlkTXV0ZXhfICovCiAgIHZvaWQgdGhyb3dCYWRTZXFJZF8oKTsKICAgdm9pZCB0aHJvd0RlYWRDb25uZWN0aW9uXygpOwotcHJpdmF0ZTogLy9kYXRhIG1lbWJlcnMKIAorcHJpdmF0ZTogLy8gZGF0YSBtZW1iZXJzCiAgIHZvbGF0aWxlIGJvb2wgc3RvcF87CiAKICAgOjphcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Ok11dGV4IHNlcWlkTXV0ZXhfOwpAQCAtMTE3LDExICsxMTYsMTEgQEAKICAgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRNZXNzYWdlVHlwZSBtdHlwZVBlbmRpbmdfOwogICAvLyBlbmQgcmVhZE11dGV4XyBwcm90ZWN0ZWQgbWVtYmVycwogCi0KICAgZnJpZW5kIGNsYXNzIFRDb25jdXJyZW50U2VuZFNlbnRyeTsKICAgZnJpZW5kIGNsYXNzIFRDb25jdXJyZW50UmVjdlNlbnRyeTsKIH07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6YXN5bmMKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmFzeW5jCiAKICNlbmRpZiAvLyBfVEhSSUZUX1RDT05DVVJSRU5UQ0xJRU5UU1lOQ0lORk9fSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9URXZodHRwQ2xpZW50Q2hhbm5lbC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEV2aHR0cENsaWVudENoYW5uZWwuY3BwCmluZGV4IDEyNzliYzYuLjZhZjgxMDQgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9URXZodHRwQ2xpZW50Q2hhbm5lbC5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RFdmh0dHBDbGllbnRDaGFubmVsLmNwcApAQCAtMzgsMTMgKzM4LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZXZlbnRfYmFzZSogZWIpCi0gIDogaG9zdF8oaG9zdCksIHBhdGhfKHBhdGgpLCByZWN2QnVmXyhOVUxMKSwgY29ubl8oTlVMTCkgewotICBjb25uXyA9IGV2aHR0cF9jb25uZWN0aW9uX25ldyhhZGRyZXNzLCBwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZXZlbnRfYmFzZSogZWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGV2ZG5zX2Jhc2UqIGRuc2Jhc2UpCisKKyAgOiBob3N0Xyhob3N0KSwgcGF0aF8ocGF0aCksIGNvbm5fKE5VTEwpIHsKKyAgY29ubl8gPSBldmh0dHBfY29ubmVjdGlvbl9iYXNlX25ldyhlYiwgZG5zYmFzZSwgYWRkcmVzcywgcG9ydCk7CiAgIGlmIChjb25uXyA9PSBOVUxMKSB7CiAgICAgdGhyb3cgVEV4Y2VwdGlvbigiZXZodHRwX2Nvbm5lY3Rpb25fbmV3IGZhaWxlZCIpOwogICB9Ci0gIGV2aHR0cF9jb25uZWN0aW9uX3NldF9iYXNlKGNvbm5fLCBlYik7CiB9CiAKIFRFdmh0dHBDbGllbnRDaGFubmVsOjp+VEV2aHR0cENsaWVudENoYW5uZWwoKSB7CkBAIC01Niw5ICs1Nyw2IEBACiB2b2lkIFRFdmh0dHBDbGllbnRDaGFubmVsOjpzZW5kQW5kUmVjdk1lc3NhZ2UoY29uc3QgVm9pZENhbGxiYWNrJiBjb2IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlciogc2VuZEJ1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyKiByZWN2QnVmKSB7Ci0gIGNvYl8gPSBjb2I7Ci0gIHJlY3ZCdWZfID0gcmVjdkJ1ZjsKLQogICBzdHJ1Y3QgZXZodHRwX3JlcXVlc3QqIHJlcSA9IGV2aHR0cF9yZXF1ZXN0X25ldyhyZXNwb25zZSwgdGhpcyk7CiAgIGlmIChyZXEgPT0gTlVMTCkgewogICAgIHRocm93IFRFeGNlcHRpb24oImV2aHR0cF9yZXF1ZXN0X25ldyBmYWlsZWQiKTsKQEAgLTg4LDYgKzg2LDggQEAKICAgaWYgKHJ2ICE9IDApIHsKICAgICB0aHJvdyBURXhjZXB0aW9uKCJldmh0dHBfbWFrZV9yZXF1ZXN0IGZhaWxlZCIpOwogICB9CisKKyAgY29tcGxldGlvblF1ZXVlXy5wdXNoKENvbXBsZXRpb24oY29iLCByZWN2QnVmKSk7CiB9CiAKIHZvaWQgVEV2aHR0cENsaWVudENoYW5uZWw6OnNlbmRNZXNzYWdlKGNvbnN0IFZvaWRDYWxsYmFjayYgY29iLApAQCAtMTA3LDkgKzEwNywxMiBAQAogfQogCiB2b2lkIFRFdmh0dHBDbGllbnRDaGFubmVsOjpmaW5pc2goc3RydWN0IGV2aHR0cF9yZXF1ZXN0KiByZXEpIHsKKyAgYXNzZXJ0KCFjb21wbGV0aW9uUXVldWVfLmVtcHR5KCkpOworICBDb21wbGV0aW9uIGNvbXBsZXRpb24gPSBjb21wbGV0aW9uUXVldWVfLmZyb250KCk7CisgIGNvbXBsZXRpb25RdWV1ZV8ucG9wKCk7CiAgIGlmIChyZXEgPT0gTlVMTCkgewogICAgIHRyeSB7Ci0gICAgICBjb2JfKCk7CisgICAgICBjb21wbGV0aW9uLmZpcnN0KCk7CiAgICAgfSBjYXRjaCAoY29uc3QgVFRyYW5zcG9ydEV4Y2VwdGlvbiYgZSkgewogICAgICAgaWYgKGUuZ2V0VHlwZSgpID09IFRUcmFuc3BvcnRFeGNlcHRpb246OkVORF9PRl9GSUxFKQogICAgICAgICB0aHJvdyBURXhjZXB0aW9uKCJjb25uZWN0IGZhaWxlZCIpOwpAQCAtMTE5LDcgKzEyMiw3IEBACiAgICAgcmV0dXJuOwogICB9IGVsc2UgaWYgKHJlcS0+cmVzcG9uc2VfY29kZSAhPSAyMDApIHsKICAgICB0cnkgewotICAgICAgY29iXygpOworICAgICAgY29tcGxldGlvbi5maXJzdCgpOwogICAgIH0gY2F0Y2ggKGNvbnN0IFRUcmFuc3BvcnRFeGNlcHRpb24mIGUpIHsKICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOwogICAgICAgc3MgPDwgInNlcnZlciByZXR1cm5lZCBjb2RlICIgPDwgcmVxLT5yZXNwb25zZV9jb2RlOwpAQCAtMTMyLDkgKzEzNSw5IEBACiAgICAgfQogICAgIHJldHVybjsKICAgfQotICByZWN2QnVmXy0+cmVzZXRCdWZmZXIoRVZCVUZGRVJfREFUQShyZXEtPmlucHV0X2J1ZmZlciksCisgIGNvbXBsZXRpb24uc2Vjb25kLT5yZXNldEJ1ZmZlcihFVkJVRkZFUl9EQVRBKHJlcS0+aW5wdXRfYnVmZmVyKSwKICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihFVkJVRkZFUl9MRU5HVEgocmVxLT5pbnB1dF9idWZmZXIpKSk7Ci0gIGNvYl8oKTsKKyAgY29tcGxldGlvbi5maXJzdCgpOwogICByZXR1cm47CiB9CiAKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9URXZodHRwQ2xpZW50Q2hhbm5lbC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RFdmh0dHBDbGllbnRDaGFubmVsLmgKaW5kZXggNzJlZDQwZi4uYTMyMWY0MSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RFdmh0dHBDbGllbnRDaGFubmVsLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RFdmh0dHBDbGllbnRDaGFubmVsLmgKQEAgLTIwLDExICsyMCwxNCBAQAogI2lmbmRlZiBfVEhSSUZUX1RFVkhUVFBfQ0xJRU5UX0NIQU5ORUxfSF8KICNkZWZpbmUgX1RIUklGVF9URVZIVFRQX0NMSUVOVF9DSEFOTkVMX0hfIDEKIAorI2luY2x1ZGUgPHF1ZXVlPgogI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDx0aHJpZnQvYXN5bmMvVEFzeW5jQ2hhbm5lbC5oPgogCiBzdHJ1Y3QgZXZlbnRfYmFzZTsKK3N0cnVjdCBldmRuc19iYXNlOwogc3RydWN0IGV2aHR0cF9jb25uZWN0aW9uOwogc3RydWN0IGV2aHR0cF9yZXF1ZXN0OwogCkBAIC00OCw3ICs1MSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGV2ZW50X2Jhc2UqIGViKTsKKyAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGV2ZW50X2Jhc2UqIGViLAorICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZXZkbnNfYmFzZSAqZG5zYmFzZSA9IDApOwogICB+VEV2aHR0cENsaWVudENoYW5uZWwoKTsKIAogICB2aXJ0dWFsIHZvaWQgc2VuZEFuZFJlY3ZNZXNzYWdlKGNvbnN0IFZvaWRDYWxsYmFjayYgY29iLApAQCAtNzIsOCArNzYsOSBAQAogCiAgIHN0ZDo6c3RyaW5nIGhvc3RfOwogICBzdGQ6OnN0cmluZyBwYXRoXzsKLSAgVm9pZENhbGxiYWNrIGNvYl87Ci0gIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIqIHJlY3ZCdWZfOworICB0eXBlZGVmIHN0ZDo6cGFpcjxWb2lkQ2FsbGJhY2ssIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIqPiBDb21wbGV0aW9uOworICB0eXBlZGVmIHN0ZDo6cXVldWU8Q29tcGxldGlvbj4gQ29tcGxldGlvblF1ZXVlOworICBDb21wbGV0aW9uUXVldWUgY29tcGxldGlvblF1ZXVlXzsKICAgc3RydWN0IGV2aHR0cF9jb25uZWN0aW9uKiBjb25uXzsKIH07CiB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEV2aHR0cFNlcnZlci5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEV2aHR0cFNlcnZlci5jcHAKaW5kZXggNTdkMGQ2MS4uYmRjMzI2NiAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RFdmh0dHBTZXJ2ZXIuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9URXZodHRwU2VydmVyLmNwcApAQCAtMjAsMTAgKzIwLDEwIEBACiAjaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RFdmh0dHBTZXJ2ZXIuaD4KICNpbmNsdWRlIDx0aHJpZnQvYXN5bmMvVEFzeW5jQnVmZmVyUHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxldmh0dHAuaD4KICNpbmNsdWRlIDxldmVudDIvYnVmZmVyLmg+CiAjaW5jbHVkZSA8ZXZlbnQyL2J1ZmZlcl9jb21wYXQuaD4KLQogI2luY2x1ZGUgPGlvc3RyZWFtPgogCiAjaWZuZGVmIEhUVFBfSU5URVJOQUwgLy8gbGliZXZlbnQgPCAyCkBAIC0zMSw2ICszMSw3IEBACiAjZW5kaWYKIAogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcjsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKIAogbmFtZXNwYWNlIGFwYWNoZSB7CiBuYW1lc3BhY2UgdGhyaWZ0IHsKQEAgLTM4LDE3ICszOSwxNyBAQAogCiBzdHJ1Y3QgVEV2aHR0cFNlcnZlcjo6UmVxdWVzdENvbnRleHQgewogICBzdHJ1Y3QgZXZodHRwX3JlcXVlc3QqIHJlcTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcj4gaWJ1ZjsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcj4gb2J1ZjsKKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI+IGlidWY7CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyPiBvYnVmOwogCiAgIFJlcXVlc3RDb250ZXh0KHN0cnVjdCBldmh0dHBfcmVxdWVzdCogcmVxKTsKIH07CiAKLVRFdmh0dHBTZXJ2ZXI6OlRFdmh0dHBTZXJ2ZXIoYm9vc3Q6OnNoYXJlZF9wdHI8VEFzeW5jQnVmZmVyUHJvY2Vzc29yPiBwcm9jZXNzb3IpCitURXZodHRwU2VydmVyOjpURXZodHRwU2VydmVyKHN0ZDo6c2hhcmVkX3B0cjxUQXN5bmNCdWZmZXJQcm9jZXNzb3I+IHByb2Nlc3NvcikKICAgOiBwcm9jZXNzb3JfKHByb2Nlc3NvciksIGViXyhOVUxMKSwgZWhfKE5VTEwpIHsKIH0KIAotVEV2aHR0cFNlcnZlcjo6VEV2aHR0cFNlcnZlcihib29zdDo6c2hhcmVkX3B0cjxUQXN5bmNCdWZmZXJQcm9jZXNzb3I+IHByb2Nlc3NvciwgaW50IHBvcnQpCitURXZodHRwU2VydmVyOjpURXZodHRwU2VydmVyKHN0ZDo6c2hhcmVkX3B0cjxUQXN5bmNCdWZmZXJQcm9jZXNzb3I+IHByb2Nlc3NvciwgaW50IHBvcnQpCiAgIDogcHJvY2Vzc29yXyhwcm9jZXNzb3IpLCBlYl8oTlVMTCksIGVoXyhOVUxMKSB7CiAgIC8vIENyZWF0ZSBldmVudF9iYXNlIGFuZCBldmh0dHAuCiAgIGViXyA9IGV2ZW50X2Jhc2VfbmV3KCk7CkBAIC0xMDgsMTcgKzEwOSwxNyBAQAogCiB2b2lkIFRFdmh0dHBTZXJ2ZXI6OnByb2Nlc3Moc3RydWN0IGV2aHR0cF9yZXF1ZXN0KiByZXEpIHsKICAgUmVxdWVzdENvbnRleHQqIGN0eCA9IG5ldyBSZXF1ZXN0Q29udGV4dChyZXEpOwotICByZXR1cm4gcHJvY2Vzc29yXy0+cHJvY2VzcyhhcGFjaGU6OnRocmlmdDo6c3RkY3h4OjpiaW5kKCZURXZodHRwU2VydmVyOjpjb21wbGV0ZSwKKyAgcmV0dXJuIHByb2Nlc3Nvcl8tPnByb2Nlc3Moc3RkOjpiaW5kKCZURXZodHRwU2VydmVyOjpjb21wbGV0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6c3RkY3h4OjpwbGFjZWhvbGRlcnM6Ol8xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPmlidWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+b2J1Zik7CiB9CiAKIHZvaWQgVEV2aHR0cFNlcnZlcjo6Y29tcGxldGUoUmVxdWVzdENvbnRleHQqIGN0eCwgYm9vbCBzdWNjZXNzKSB7CiAgICh2b2lkKXN1Y2Nlc3M7Ci0gIHN0ZDo6YXV0b19wdHI8UmVxdWVzdENvbnRleHQ+IHB0cihjdHgpOworICBzdGQ6OnVuaXF1ZV9wdHI8UmVxdWVzdENvbnRleHQ+IHB0cihjdHgpOwogCiAgIGludCBjb2RlID0gc3VjY2VzcyA/IDIwMCA6IDQwMDsKICAgY29uc3QgY2hhciogcmVhc29uID0gc3VjY2VzcyA/ICJPSyIgOiAiQmFkIFJlcXVlc3QiOwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RFdmh0dHBTZXJ2ZXIuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9URXZodHRwU2VydmVyLmgKaW5kZXggODliZjMzNy4uYzViZjNiNiAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RFdmh0dHBTZXJ2ZXIuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEV2aHR0cFNlcnZlci5oCkBAIC0yMCw3ICsyMCw3IEBACiAjaWZuZGVmIF9USFJJRlRfVEVWSFRUUF9TRVJWRVJfSF8KICNkZWZpbmUgX1RIUklGVF9URVZIVFRQX1NFUlZFUl9IXyAxCiAKLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAKIHN0cnVjdCBldmVudF9iYXNlOwogc3RydWN0IGV2aHR0cDsKQEAgLTQxLDE0ICs0MSwxNCBAQAogICAgKiBhZGRyZXNzIG9mIHRoZSBzZXJ2ZXIgYXMgdGhlIGV4dHJhIGFyZy4KICAgICogRG8gbm90IGNhbGwgInNlcnZlIiBvbiB0aGlzIHNlcnZlci4KICAgICovCi0gIFRFdmh0dHBTZXJ2ZXIoYm9vc3Q6OnNoYXJlZF9wdHI8VEFzeW5jQnVmZmVyUHJvY2Vzc29yPiBwcm9jZXNzb3IpOworICBURXZodHRwU2VydmVyKHN0ZDo6c2hhcmVkX3B0cjxUQXN5bmNCdWZmZXJQcm9jZXNzb3I+IHByb2Nlc3Nvcik7CiAKICAgLyoqCiAgICAqIENyZWF0ZSBhIFRFdmh0dHBTZXJ2ZXIgd2l0aCBhbiBlbWJlZGRlZCBldmVudF9iYXNlIGFuZCBldmh0dHAsCiAgICAqIGxpc3RlbmluZyBvbiBwb3J0IGFuZCByZXNwb25kaW5nIG9uIHRoZSBlbmRwb2ludCAiLyIuCiAgICAqIENhbGwgInNlcnZlIiBvbiB0aGlzIHNlcnZlciB0byBzZXJ2ZSBmb3JldmVyLgogICAgKi8KLSAgVEV2aHR0cFNlcnZlcihib29zdDo6c2hhcmVkX3B0cjxUQXN5bmNCdWZmZXJQcm9jZXNzb3I+IHByb2Nlc3NvciwgaW50IHBvcnQpOworICBURXZodHRwU2VydmVyKHN0ZDo6c2hhcmVkX3B0cjxUQXN5bmNCdWZmZXJQcm9jZXNzb3I+IHByb2Nlc3NvciwgaW50IHBvcnQpOwogCiAgIH5URXZodHRwU2VydmVyKCk7CiAKQEAgLTYzLDcgKzYzLDcgQEAKICAgdm9pZCBwcm9jZXNzKHN0cnVjdCBldmh0dHBfcmVxdWVzdCogcmVxKTsKICAgdm9pZCBjb21wbGV0ZShSZXF1ZXN0Q29udGV4dCogY3R4LCBib29sIHN1Y2Nlc3MpOwogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRBc3luY0J1ZmZlclByb2Nlc3Nvcj4gcHJvY2Vzc29yXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRBc3luY0J1ZmZlclByb2Nlc3Nvcj4gcHJvY2Vzc29yXzsKICAgc3RydWN0IGV2ZW50X2Jhc2UqIGViXzsKICAgc3RydWN0IGV2aHR0cCogZWhfOwogfTsKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Cb29zdE1vbml0b3IuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L0Jvb3N0TW9uaXRvci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMjRkODIuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L0Jvb3N0TW9uaXRvci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KLQotI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L0V4Y2VwdGlvbi5oPgotI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9VdGlsLmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9QbGF0Zm9ybVNvY2tldC5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotCi0jaW5jbHVkZSA8Ym9vc3Qvc2NvcGVkX3B0ci5ocHA+Ci0jaW5jbHVkZSA8Ym9vc3QvdGhyZWFkLmhwcD4KLSNpbmNsdWRlIDxib29zdC9kYXRlX3RpbWUvcG9zaXhfdGltZS9wb3NpeF90aW1lLmhwcD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7Ci1uYW1lc3BhY2UgdGhyaWZ0IHsKLW5hbWVzcGFjZSBjb25jdXJyZW5jeSB7Ci0KLS8qKgotICogTW9uaXRvciBpbXBsZW1lbnRhdGlvbiB1c2luZyB0aGUgYm9vc3QgdGhyZWFkIGxpYnJhcnkKLSAqCi0gKiBAdmVyc2lvbiAkSWQ6JAotICovCi1jbGFzcyBNb25pdG9yOjpJbXBsIDogcHVibGljIGJvb3N0Ojpjb25kaXRpb25fdmFyaWFibGVfYW55IHsKLQotcHVibGljOgotICBJbXBsKCkgOiBvd25lZE11dGV4XyhuZXcgTXV0ZXgoKSksIG11dGV4XyhOVUxMKSB7IGluaXQob3duZWRNdXRleF8uZ2V0KCkpOyB9Ci0KLSAgSW1wbChNdXRleCogbXV0ZXgpIDogbXV0ZXhfKE5VTEwpIHsgaW5pdChtdXRleCk7IH0KLQotICBJbXBsKE1vbml0b3IqIG1vbml0b3IpIDogbXV0ZXhfKE5VTEwpIHsgaW5pdCgmKG1vbml0b3ItPm11dGV4KCkpKTsgfQotCi0gIE11dGV4JiBtdXRleCgpIHsgcmV0dXJuICptdXRleF87IH0KLSAgdm9pZCBsb2NrKCkgeyBtdXRleCgpLmxvY2soKTsgfQotICB2b2lkIHVubG9jaygpIHsgbXV0ZXgoKS51bmxvY2soKTsgfQotCi0gIC8qKgotICAgKiBFeGNlcHRpb24tdGhyb3dpbmcgdmVyc2lvbiBvZiB3YWl0Rm9yVGltZVJlbGF0aXZlKCksIGNhbGxlZCBzaW1wbHkKLSAgICogd2FpdChpbnQ2NCkgZm9yIGhpc3RvcmljYWwgcmVhc29ucy4gIFRpbWVvdXQgaXMgaW4gbWlsbGlzZWNvbmRzLgotICAgKgotICAgKiBJZiB0aGUgY29uZGl0aW9uIG9jY3VycywgIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBjbGVhbmx5OyBvbiB0aW1lb3V0IG9yCi0gICAqIGVycm9yIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uCi0gICAqLwotICB2b2lkIHdhaXQoaW50NjRfdCB0aW1lb3V0X21zKSB7Ci0gICAgaW50IHJlc3VsdCA9IHdhaXRGb3JUaW1lUmVsYXRpdmUodGltZW91dF9tcyk7Ci0gICAgaWYgKHJlc3VsdCA9PSBUSFJJRlRfRVRJTUVET1VUKSB7Ci0gICAgICB0aHJvdyBUaW1lZE91dEV4Y2VwdGlvbigpOwotICAgIH0gZWxzZSBpZiAocmVzdWx0ICE9IDApIHsKLSAgICAgIHRocm93IFRFeGNlcHRpb24oIk1vbml0b3I6OndhaXQoKSBmYWlsZWQiKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogV2FpdHMgdW50aWwgdGhlIHNwZWNpZmllZCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgdGhlIGNvbmRpdGlvbiB0bwotICAgKiBvY2N1ciwgb3Igd2FpdHMgZm9yZXZlciBpZiB0aW1lb3V0X21zID09IDAuCi0gICAqCi0gICAqIFJldHVybnMgMCBpZiBjb25kaXRpb24gb2NjdXJzLCBUSFJJRlRfRVRJTUVET1VUIG9uIHRpbWVvdXQsIG9yIGFuIGVycm9yIGNvZGUuCi0gICAqLwotICBpbnQgd2FpdEZvclRpbWVSZWxhdGl2ZShpbnQ2NF90IHRpbWVvdXRfbXMpIHsKLSAgICBpZiAodGltZW91dF9tcyA9PSAwTEwpIHsKLSAgICAgIHJldHVybiB3YWl0Rm9yZXZlcigpOwotICAgIH0KLQotICAgIGFzc2VydChtdXRleF8pOwotICAgIGJvb3N0Ojp0aW1lZF9tdXRleCogbXV0ZXhJbXBsCi0gICAgICAgID0gcmVpbnRlcnByZXRfY2FzdDxib29zdDo6dGltZWRfbXV0ZXgqPihtdXRleF8tPmdldFVuZGVybHlpbmdJbXBsKCkpOwotICAgIGFzc2VydChtdXRleEltcGwpOwotCi0gICAgYm9vc3Q6OnRpbWVkX211dGV4OjpzY29wZWRfbG9jayBsb2NrKCptdXRleEltcGwsIGJvb3N0OjphZG9wdF9sb2NrKTsKLSAgICBpbnQgcmVzCi0gICAgICAgID0gdGltZWRfd2FpdChsb2NrLCBib29zdDo6Z2V0X3N5c3RlbV90aW1lKCkgKyBib29zdDo6cG9zaXhfdGltZTo6bWlsbGlzZWNvbmRzKHRpbWVvdXRfbXMpKQotICAgICAgICAgICAgICA/IDAKLSAgICAgICAgICAgICAgOiBUSFJJRlRfRVRJTUVET1VUOwotICAgIGxvY2sucmVsZWFzZSgpOwotICAgIHJldHVybiByZXM7Ci0gIH0KLQotICAvKioKLSAgICogV2FpdHMgdW50aWwgdGhlIGFic29sdXRlIHRpbWUgc3BlY2lmaWVkIHVzaW5nIHN0cnVjdCBUSFJJRlRfVElNRVNQRUMuCi0gICAqIFJldHVybnMgMCBpZiBjb25kaXRpb24gb2NjdXJzLCBUSFJJRlRfRVRJTUVET1VUIG9uIHRpbWVvdXQsIG9yIGFuIGVycm9yIGNvZGUuCi0gICAqLwotICBpbnQgd2FpdEZvclRpbWUoY29uc3QgVEhSSUZUX1RJTUVTUEVDKiBhYnN0aW1lKSB7Ci0gICAgc3RydWN0IHRpbWV2YWwgdGVtcDsKLSAgICB0ZW1wLnR2X3NlYyA9IHN0YXRpY19jYXN0PGxvbmc+KGFic3RpbWUtPnR2X3NlYyk7Ci0gICAgdGVtcC50dl91c2VjID0gc3RhdGljX2Nhc3Q8bG9uZz4oYWJzdGltZS0+dHZfbnNlYykgLyAxMDAwOwotICAgIHJldHVybiB3YWl0Rm9yVGltZSgmdGVtcCk7Ci0gIH0KLQotICAvKioKLSAgICogV2FpdHMgdW50aWwgdGhlIGFic29sdXRlIHRpbWUgc3BlY2lmaWVkIHVzaW5nIHN0cnVjdCB0aW1ldmFsLgotICAgKiBSZXR1cm5zIDAgaWYgY29uZGl0aW9uIG9jY3VycywgVEhSSUZUX0VUSU1FRE9VVCBvbiB0aW1lb3V0LCBvciBhbiBlcnJvciBjb2RlLgotICAgKi8KLSAgaW50IHdhaXRGb3JUaW1lKGNvbnN0IHN0cnVjdCB0aW1ldmFsKiBhYnN0aW1lKSB7Ci0gICAgYXNzZXJ0KG11dGV4Xyk7Ci0gICAgYm9vc3Q6OnRpbWVkX211dGV4KiBtdXRleEltcGwgPSBzdGF0aWNfY2FzdDxib29zdDo6dGltZWRfbXV0ZXgqPihtdXRleF8tPmdldFVuZGVybHlpbmdJbXBsKCkpOwotICAgIGFzc2VydChtdXRleEltcGwpOwotCi0gICAgc3RydWN0IHRpbWV2YWwgY3VycmVudHRpbWU7Ci0gICAgVXRpbDo6dG9UaW1ldmFsKGN1cnJlbnR0aW1lLCBVdGlsOjpjdXJyZW50VGltZSgpKTsKLQotICAgIGxvbmcgdHZfc2VjID0gc3RhdGljX2Nhc3Q8bG9uZz4oYWJzdGltZS0+dHZfc2VjIC0gY3VycmVudHRpbWUudHZfc2VjKTsKLSAgICBsb25nIHR2X3VzZWMgPSBzdGF0aWNfY2FzdDxsb25nPihhYnN0aW1lLT50dl91c2VjIC0gY3VycmVudHRpbWUudHZfdXNlYyk7Ci0gICAgaWYgKHR2X3NlYyA8IDApCi0gICAgICB0dl9zZWMgPSAwOwotICAgIGlmICh0dl91c2VjIDwgMCkKLSAgICAgIHR2X3VzZWMgPSAwOwotCi0gICAgYm9vc3Q6OnRpbWVkX211dGV4OjpzY29wZWRfbG9jayBsb2NrKCptdXRleEltcGwsIGJvb3N0OjphZG9wdF9sb2NrKTsKLSAgICBpbnQgcmVzID0gdGltZWRfd2FpdChsb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpnZXRfc3lzdGVtX3RpbWUoKSArIGJvb3N0Ojpwb3NpeF90aW1lOjpzZWNvbmRzKHR2X3NlYykKLSAgICAgICAgICAgICAgICAgICAgICAgICArIGJvb3N0Ojpwb3NpeF90aW1lOjptaWNyb3NlY29uZHModHZfdXNlYykpCi0gICAgICAgICAgICAgICAgICA/IDAKLSAgICAgICAgICAgICAgICAgIDogVEhSSUZUX0VUSU1FRE9VVDsKLSAgICBsb2NrLnJlbGVhc2UoKTsKLSAgICByZXR1cm4gcmVzOwotICB9Ci0KLSAgLyoqCi0gICAqIFdhaXRzIGZvcmV2ZXIgdW50aWwgdGhlIGNvbmRpdGlvbiBvY2N1cnMuCi0gICAqIFJldHVybnMgMCBpZiBjb25kaXRpb24gb2NjdXJzLCBvciBhbiBlcnJvciBjb2RlIG90aGVyd2lzZS4KLSAgICovCi0gIGludCB3YWl0Rm9yZXZlcigpIHsKLSAgICBhc3NlcnQobXV0ZXhfKTsKLSAgICBib29zdDo6dGltZWRfbXV0ZXgqIG11dGV4SW1wbAotICAgICAgICA9IHJlaW50ZXJwcmV0X2Nhc3Q8Ym9vc3Q6OnRpbWVkX211dGV4Kj4obXV0ZXhfLT5nZXRVbmRlcmx5aW5nSW1wbCgpKTsKLSAgICBhc3NlcnQobXV0ZXhJbXBsKTsKLQotICAgIGJvb3N0Ojp0aW1lZF9tdXRleDo6c2NvcGVkX2xvY2sgbG9jaygqbXV0ZXhJbXBsLCBib29zdDo6YWRvcHRfbG9jayk7Ci0gICAgKChib29zdDo6Y29uZGl0aW9uX3ZhcmlhYmxlX2FueSopdGhpcyktPndhaXQobG9jayk7Ci0gICAgbG9jay5yZWxlYXNlKCk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICB2b2lkIG5vdGlmeSgpIHsgbm90aWZ5X29uZSgpOyB9Ci0KLSAgdm9pZCBub3RpZnlBbGwoKSB7IG5vdGlmeV9hbGwoKTsgfQotCi1wcml2YXRlOgotICB2b2lkIGluaXQoTXV0ZXgqIG11dGV4KSB7IG11dGV4XyA9IG11dGV4OyB9Ci0KLSAgYm9vc3Q6OnNjb3BlZF9wdHI8TXV0ZXg+IG93bmVkTXV0ZXhfOwotICBNdXRleCogbXV0ZXhfOwotfTsKLQotTW9uaXRvcjo6TW9uaXRvcigpIDogaW1wbF8obmV3IE1vbml0b3I6OkltcGwoKSkgewotfQotTW9uaXRvcjo6TW9uaXRvcihNdXRleCogbXV0ZXgpIDogaW1wbF8obmV3IE1vbml0b3I6OkltcGwobXV0ZXgpKSB7Ci19Ci1Nb25pdG9yOjpNb25pdG9yKE1vbml0b3IqIG1vbml0b3IpIDogaW1wbF8obmV3IE1vbml0b3I6OkltcGwobW9uaXRvcikpIHsKLX0KLQotTW9uaXRvcjo6fk1vbml0b3IoKSB7Ci0gIGRlbGV0ZSBpbXBsXzsKLX0KLQotTXV0ZXgmIE1vbml0b3I6Om11dGV4KCkgY29uc3QgewotICByZXR1cm4gY29uc3RfY2FzdDxNb25pdG9yOjpJbXBsKj4oaW1wbF8pLT5tdXRleCgpOwotfQotCi12b2lkIE1vbml0b3I6OmxvY2soKSBjb25zdCB7Ci0gIGNvbnN0X2Nhc3Q8TW9uaXRvcjo6SW1wbCo+KGltcGxfKS0+bG9jaygpOwotfQotCi12b2lkIE1vbml0b3I6OnVubG9jaygpIGNvbnN0IHsKLSAgY29uc3RfY2FzdDxNb25pdG9yOjpJbXBsKj4oaW1wbF8pLT51bmxvY2soKTsKLX0KLQotdm9pZCBNb25pdG9yOjp3YWl0KGludDY0X3QgdGltZW91dCkgY29uc3QgewotICBjb25zdF9jYXN0PE1vbml0b3I6OkltcGwqPihpbXBsXyktPndhaXQodGltZW91dCk7Ci19Ci0KLWludCBNb25pdG9yOjp3YWl0Rm9yVGltZShjb25zdCBUSFJJRlRfVElNRVNQRUMqIGFic3RpbWUpIGNvbnN0IHsKLSAgcmV0dXJuIGNvbnN0X2Nhc3Q8TW9uaXRvcjo6SW1wbCo+KGltcGxfKS0+d2FpdEZvclRpbWUoYWJzdGltZSk7Ci19Ci0KLWludCBNb25pdG9yOjp3YWl0Rm9yVGltZShjb25zdCB0aW1ldmFsKiBhYnN0aW1lKSBjb25zdCB7Ci0gIHJldHVybiBjb25zdF9jYXN0PE1vbml0b3I6OkltcGwqPihpbXBsXyktPndhaXRGb3JUaW1lKGFic3RpbWUpOwotfQotCi1pbnQgTW9uaXRvcjo6d2FpdEZvclRpbWVSZWxhdGl2ZShpbnQ2NF90IHRpbWVvdXRfbXMpIGNvbnN0IHsKLSAgcmV0dXJuIGNvbnN0X2Nhc3Q8TW9uaXRvcjo6SW1wbCo+KGltcGxfKS0+d2FpdEZvclRpbWVSZWxhdGl2ZSh0aW1lb3V0X21zKTsKLX0KLQotaW50IE1vbml0b3I6OndhaXRGb3JldmVyKCkgY29uc3QgewotICByZXR1cm4gY29uc3RfY2FzdDxNb25pdG9yOjpJbXBsKj4oaW1wbF8pLT53YWl0Rm9yZXZlcigpOwotfQotCi12b2lkIE1vbml0b3I6Om5vdGlmeSgpIGNvbnN0IHsKLSAgY29uc3RfY2FzdDxNb25pdG9yOjpJbXBsKj4oaW1wbF8pLT5ub3RpZnkoKTsKLX0KLQotdm9pZCBNb25pdG9yOjpub3RpZnlBbGwoKSBjb25zdCB7Ci0gIGNvbnN0X2Nhc3Q8TW9uaXRvcjo6SW1wbCo+KGltcGxfKS0+bm90aWZ5QWxsKCk7Ci19Ci19Ci19Ci19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L0Jvb3N0TXV0ZXguY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L0Jvb3N0TXV0ZXguY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2NhZGFiLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Cb29zdE11dGV4LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+Ci0KLSNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguaD4KLSNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVXRpbC5oPgotI2luY2x1ZGUgPHRocmlmdC9UaHJpZnQuaD4KLQotI2luY2x1ZGUgPGNhc3NlcnQ+Ci0jaW5jbHVkZSA8Ym9vc3QvdGhyZWFkLmhwcD4KLSNpbmNsdWRlIDxib29zdC90aHJlYWQvbXV0ZXguaHBwPgotI2luY2x1ZGUgPGJvb3N0L2RhdGVfdGltZS9wb3NpeF90aW1lL3Bvc2l4X3RpbWUuaHBwPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsKLW5hbWVzcGFjZSB0aHJpZnQgewotbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiBNdXRleCBjbGFzcyB1c2luZyBib29zdCBpbnRlcnByb2Nlc3MgbXV0ZXgKLSAqCi0gKiBAdmVyc2lvbiAkSWQ6JAotICovCi1jbGFzcyBNdXRleDo6aW1wbCA6IHB1YmxpYyBib29zdDo6dGltZWRfbXV0ZXgge307Ci0KLU11dGV4OjpNdXRleChJbml0aWFsaXplciBpbml0KSA6IGltcGxfKG5ldyBNdXRleDo6aW1wbCgpKSB7Ci0gIFRIUklGVF9VTlVTRURfVkFSSUFCTEUoaW5pdCk7Ci19Ci0KLXZvaWQqIE11dGV4OjpnZXRVbmRlcmx5aW5nSW1wbCgpIGNvbnN0IHsKLSAgcmV0dXJuIGltcGxfLmdldCgpOwotfQotCi12b2lkIE11dGV4Ojpsb2NrKCkgY29uc3QgewotICBpbXBsXy0+bG9jaygpOwotfQotCi1ib29sIE11dGV4Ojp0cnlsb2NrKCkgY29uc3QgewotICByZXR1cm4gaW1wbF8tPnRyeV9sb2NrKCk7Ci19Ci0KLWJvb2wgTXV0ZXg6OnRpbWVkbG9jayhpbnQ2NF90IG1zKSBjb25zdCB7Ci0gIHJldHVybiBpbXBsXy0+dGltZWRfbG9jayhib29zdDo6Z2V0X3N5c3RlbV90aW1lKCkgKyBib29zdDo6cG9zaXhfdGltZTo6bWlsbGlzZWNvbmRzKG1zKSk7Ci19Ci0KLXZvaWQgTXV0ZXg6OnVubG9jaygpIGNvbnN0IHsKLSAgaW1wbF8tPnVubG9jaygpOwotfQotCi12b2lkIE11dGV4OjpERUZBVUxUX0lOSVRJQUxJWkVSKHZvaWQqIGFyZykgewotICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKGFyZyk7Ci19Ci19Ci19Ci19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L0Jvb3N0VGhyZWFkRmFjdG9yeS5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvQm9vc3RUaHJlYWRGYWN0b3J5LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZjYjZkNi4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvQm9vc3RUaHJlYWRGYWN0b3J5LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgotCi0jaWYgVVNFX0JPT1NUX1RIUkVBRAotCi0jaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L0Jvb3N0VGhyZWFkRmFjdG9yeS5oPgotI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9FeGNlcHRpb24uaD4KLQotI2luY2x1ZGUgPGNhc3NlcnQ+Ci0KLSNpbmNsdWRlIDxib29zdC93ZWFrX3B0ci5ocHA+Ci0jaW5jbHVkZSA8Ym9vc3QvdGhyZWFkLmhwcD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7Ci1uYW1lc3BhY2UgdGhyaWZ0IHsKLW5hbWVzcGFjZSBjb25jdXJyZW5jeSB7Ci0KLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwotdXNpbmcgYm9vc3Q6OndlYWtfcHRyOwotCi0vKioKLSAqIFRoZSBib29zdCB0aHJlYWQgY2xhc3MuCi0gKgotICogQHZlcnNpb24gJElkOiQKLSAqLwotY2xhc3MgQm9vc3RUaHJlYWQgOiBwdWJsaWMgVGhyZWFkIHsKLXB1YmxpYzoKLSAgZW51bSBTVEFURSB7IHVuaW5pdGlhbGl6ZWQsIHN0YXJ0aW5nLCBzdGFydGVkLCBzdG9wcGluZywgc3RvcHBlZCB9OwotCi0gIHN0YXRpYyB2b2lkKiB0aHJlYWRNYWluKHZvaWQqIGFyZyk7Ci0KLXByaXZhdGU6Ci0gIHN0ZDo6YXV0b19wdHI8Ym9vc3Q6OnRocmVhZD4gdGhyZWFkXzsKLSAgU1RBVEUgc3RhdGVfOwotICB3ZWFrX3B0cjxCb29zdFRocmVhZD4gc2VsZl87Ci0gIGJvb2wgZGV0YWNoZWRfOwotCi1wdWJsaWM6Ci0gIEJvb3N0VGhyZWFkKGJvb2wgZGV0YWNoZWQsIHNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKQotICAgIDogc3RhdGVfKHVuaW5pdGlhbGl6ZWQpLCBkZXRhY2hlZF8oZGV0YWNoZWQpIHsKLSAgICB0aGlzLT5UaHJlYWQ6OnJ1bm5hYmxlKHJ1bm5hYmxlKTsKLSAgfQotCi0gIH5Cb29zdFRocmVhZCgpIHsKLSAgICBpZiAoIWRldGFjaGVkXykgewotICAgICAgdHJ5IHsKLSAgICAgICAgam9pbigpOwotICAgICAgfSBjYXRjaCAoLi4uKSB7Ci0gICAgICAgIC8vIFdlJ3JlIHJlYWxseSBob3NlZC4KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICB2b2lkIHN0YXJ0KCkgewotICAgIGlmIChzdGF0ZV8gIT0gdW5pbml0aWFsaXplZCkgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIENyZWF0ZSByZWZlcmVuY2UKLSAgICBzaGFyZWRfcHRyPEJvb3N0VGhyZWFkPiogc2VsZlJlZiA9IG5ldyBzaGFyZWRfcHRyPEJvb3N0VGhyZWFkPigpOwotICAgICpzZWxmUmVmID0gc2VsZl8ubG9jaygpOwotCi0gICAgc3RhdGVfID0gc3RhcnRpbmc7Ci0KLSAgICB0aHJlYWRfCi0gICAgICAgID0gc3RkOjphdXRvX3B0cjxib29zdDo6dGhyZWFkPihuZXcgYm9vc3Q6OnRocmVhZChib29zdDo6YmluZCh0aHJlYWRNYWluLCAodm9pZCopc2VsZlJlZikpKTsKLQotICAgIGlmIChkZXRhY2hlZF8pCi0gICAgICB0aHJlYWRfLT5kZXRhY2goKTsKLSAgfQotCi0gIHZvaWQgam9pbigpIHsKLSAgICBpZiAoIWRldGFjaGVkXyAmJiBzdGF0ZV8gIT0gdW5pbml0aWFsaXplZCkgewotICAgICAgdGhyZWFkXy0+am9pbigpOwotICAgIH0KLSAgfQotCi0gIFRocmVhZDo6aWRfdCBnZXRJZCgpIHsgcmV0dXJuIHRocmVhZF8uZ2V0KCkgPyB0aHJlYWRfLT5nZXRfaWQoKSA6IGJvb3N0Ojp0aHJlYWQ6OmlkKCk7IH0KLQotICBzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSgpIGNvbnN0IHsgcmV0dXJuIFRocmVhZDo6cnVubmFibGUoKTsgfQotCi0gIHZvaWQgcnVubmFibGUoc2hhcmVkX3B0cjxSdW5uYWJsZT4gdmFsdWUpIHsgVGhyZWFkOjpydW5uYWJsZSh2YWx1ZSk7IH0KLQotICB2b2lkIHdlYWtSZWYoc2hhcmVkX3B0cjxCb29zdFRocmVhZD4gc2VsZikgewotICAgIGFzc2VydChzZWxmLmdldCgpID09IHRoaXMpOwotICAgIHNlbGZfID0gd2Vha19wdHI8Qm9vc3RUaHJlYWQ+KHNlbGYpOwotICB9Ci19OwotCi12b2lkKiBCb29zdFRocmVhZDo6dGhyZWFkTWFpbih2b2lkKiBhcmcpIHsKLSAgc2hhcmVkX3B0cjxCb29zdFRocmVhZD4gdGhyZWFkID0gKihzaGFyZWRfcHRyPEJvb3N0VGhyZWFkPiopYXJnOwotICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxzaGFyZWRfcHRyPEJvb3N0VGhyZWFkPio+KGFyZyk7Ci0KLSAgaWYgKCF0aHJlYWQpIHsKLSAgICByZXR1cm4gKHZvaWQqKTA7Ci0gIH0KLQotICBpZiAodGhyZWFkLT5zdGF0ZV8gIT0gc3RhcnRpbmcpIHsKLSAgICByZXR1cm4gKHZvaWQqKTA7Ci0gIH0KLQotICB0aHJlYWQtPnN0YXRlXyA9IHN0YXJ0ZWQ7Ci0gIHRocmVhZC0+cnVubmFibGUoKS0+cnVuKCk7Ci0KLSAgaWYgKHRocmVhZC0+c3RhdGVfICE9IHN0b3BwaW5nICYmIHRocmVhZC0+c3RhdGVfICE9IHN0b3BwZWQpIHsKLSAgICB0aHJlYWQtPnN0YXRlXyA9IHN0b3BwaW5nOwotICB9Ci0gIHJldHVybiAodm9pZCopMDsKLX0KLQotLyoqCi0gKiBQT1NJWCBUaHJlYWQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbgotICovCi1jbGFzcyBCb29zdFRocmVhZEZhY3Rvcnk6OkltcGwgewotCi1wcml2YXRlOgotICBib29sIGRldGFjaGVkXzsKLQotcHVibGljOgotICBJbXBsKGJvb2wgZGV0YWNoZWQpIDogZGV0YWNoZWRfKGRldGFjaGVkKSB7fQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IFBPU0lYIHRocmVhZCB0byBydW4gdGhlIHJ1bm5hYmxlIG9iamVjdAotICAgKgotICAgKiBAcGFyYW0gcnVubmFibGUgQSBydW5uYWJsZSBvYmplY3QKLSAgICovCi0gIHNoYXJlZF9wdHI8VGhyZWFkPiBuZXdUaHJlYWQoc2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpIGNvbnN0IHsKLSAgICBzaGFyZWRfcHRyPEJvb3N0VGhyZWFkPiByZXN1bHQgPSBzaGFyZWRfcHRyPEJvb3N0VGhyZWFkPihuZXcgQm9vc3RUaHJlYWQoZGV0YWNoZWRfLCBydW5uYWJsZSkpOwotICAgIHJlc3VsdC0+d2Vha1JlZihyZXN1bHQpOwotICAgIHJ1bm5hYmxlLT50aHJlYWQocmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgYm9vbCBpc0RldGFjaGVkKCkgY29uc3QgeyByZXR1cm4gZGV0YWNoZWRfOyB9Ci0KLSAgdm9pZCBzZXREZXRhY2hlZChib29sIHZhbHVlKSB7IGRldGFjaGVkXyA9IHZhbHVlOyB9Ci0KLSAgVGhyZWFkOjppZF90IGdldEN1cnJlbnRUaHJlYWRJZCgpIGNvbnN0IHsgcmV0dXJuIGJvb3N0Ojp0aGlzX3RocmVhZDo6Z2V0X2lkKCk7IH0KLX07Ci0KLUJvb3N0VGhyZWFkRmFjdG9yeTo6Qm9vc3RUaHJlYWRGYWN0b3J5KGJvb2wgZGV0YWNoZWQpCi0gIDogaW1wbF8obmV3IEJvb3N0VGhyZWFkRmFjdG9yeTo6SW1wbChkZXRhY2hlZCkpIHsKLX0KLQotc2hhcmVkX3B0cjxUaHJlYWQ+IEJvb3N0VGhyZWFkRmFjdG9yeTo6bmV3VGhyZWFkKHNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKSBjb25zdCB7Ci0gIHJldHVybiBpbXBsXy0+bmV3VGhyZWFkKHJ1bm5hYmxlKTsKLX0KLQotYm9vbCBCb29zdFRocmVhZEZhY3Rvcnk6OmlzRGV0YWNoZWQoKSBjb25zdCB7Ci0gIHJldHVybiBpbXBsXy0+aXNEZXRhY2hlZCgpOwotfQotCi12b2lkIEJvb3N0VGhyZWFkRmFjdG9yeTo6c2V0RGV0YWNoZWQoYm9vbCB2YWx1ZSkgewotICBpbXBsXy0+c2V0RGV0YWNoZWQodmFsdWUpOwotfQotCi1UaHJlYWQ6OmlkX3QgQm9vc3RUaHJlYWRGYWN0b3J5OjpnZXRDdXJyZW50VGhyZWFkSWQoKSBjb25zdCB7Ci0gIHJldHVybiBpbXBsXy0+Z2V0Q3VycmVudFRocmVhZElkKCk7Ci19Ci19Ci19Ci19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQotCi0jZW5kaWYgLy8gVVNFX0JPT1NUX1RIUkVBRApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L0Jvb3N0VGhyZWFkRmFjdG9yeS5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L0Jvb3N0VGhyZWFkRmFjdG9yeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmQxYTU2Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Cb29zdFRocmVhZEZhY3RvcnkuaAorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX0JPT1NUVEhSRUFERkFDVE9SWV9IXwotI2RlZmluZSBfVEhSSUZUX0NPTkNVUlJFTkNZX0JPT1NUVEhSRUFERkFDVE9SWV9IXyAxCi0KLSNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkLmg+Ci0KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7Ci1uYW1lc3BhY2UgdGhyaWZ0IHsKLW5hbWVzcGFjZSBjb25jdXJyZW5jeSB7Ci0KLS8qKgotICogQSB0aHJlYWQgZmFjdG9yeSB0byBjcmVhdGUgcG9zaXggdGhyZWFkcwotICoKLSAqIEB2ZXJzaW9uICRJZDokCi0gKi8KLWNsYXNzIEJvb3N0VGhyZWFkRmFjdG9yeSA6IHB1YmxpYyBUaHJlYWRGYWN0b3J5IHsKLQotcHVibGljOgotICAvKioKLSAgICogQm9vc3QgdGhyZWFkIGZhY3RvcnkuICBBbGwgdGhyZWFkcyBjcmVhdGVkIGJ5IGEgZmFjdG9yeSBhcmUgcmVmZXJlbmNlLWNvdW50ZWQKLSAgICogdmlhIGJvb3N0OjpzaGFyZWRfcHRyIGFuZCBib29zdDo6d2Vha19wdHIuICBUaGUgZmFjdG9yeSBndWFyYW50ZWVzIHRoYXQgdGhyZWFkcyBhbmQKLSAgICogdGhlIFJ1bm5hYmxlIHRhc2tzIHRoZXkgaG9zdCB3aWxsIGJlIHByb3Blcmx5IGNsZWFuZWQgdXAgb25jZSB0aGUgbGFzdCBzdHJvbmcgcmVmZXJlbmNlCi0gICAqIHRvIGJvdGggaXMgZ2l2ZW4gdXAuCi0gICAqCi0gICAqIFRocmVhZHMgYXJlIGNyZWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGJvb3N0IHBvbGljeSwgcHJpb3JpdHksIHN0YWNrLXNpemUuIEEgZGV0YWNoYWJsZSB0aHJlYWQKLSAgICogaXMgbm90IGpvaW5hYmxlLgotICAgKgotICAgKiBCeSBkZWZhdWx0IHRocmVhZHMgYXJlIG5vdCBqb2luYWJsZS4KLSAgICovCi0KLSAgQm9vc3RUaHJlYWRGYWN0b3J5KGJvb2wgZGV0YWNoZWQgPSB0cnVlKTsKLQotICAvLyBGcm9tIFRocmVhZEZhY3Rvcnk7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZD4gbmV3VGhyZWFkKGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSkgY29uc3Q7Ci0KLSAgLy8gRnJvbSBUaHJlYWRGYWN0b3J5OwotICBUaHJlYWQ6OmlkX3QgZ2V0Q3VycmVudFRocmVhZElkKCkgY29uc3Q7Ci0KLSAgLyoqCi0gICAqIFNldHMgZGV0YWNoZWQgbW9kZSBvZiB0aHJlYWRzCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgc2V0RGV0YWNoZWQoYm9vbCBkZXRhY2hlZCk7Ci0KLSAgLyoqCi0gICAqIEdldHMgY3VycmVudCBkZXRhY2hlZCBtb2RlCi0gICAqLwotICB2aXJ0dWFsIGJvb2wgaXNEZXRhY2hlZCgpIGNvbnN0OwotCi1wcml2YXRlOgotICBjbGFzcyBJbXBsOwotICBib29zdDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsXzsKLX07Ci19Ci19Ci19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX0JPT1NUVEhSRUFERkFDVE9SWV9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L0Z1bmN0aW9uUnVubmVyLmggYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvRnVuY3Rpb25SdW5uZXIuaAppbmRleCBiNzc2Nzk0Li44YWQxNzZlIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvRnVuY3Rpb25SdW5uZXIuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvRnVuY3Rpb25SdW5uZXIuaApAQCAtMjAsOCArMjAsOCBAQAogI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX0ZVTkNUSU9OX1JVTk5FUl9ICiAjZGVmaW5lIF9USFJJRlRfQ09OQ1VSUkVOQ1lfRlVOQ1RJT05fUlVOTkVSX0ggMQogCi0jaW5jbHVkZSA8dGhyaWZ0L2N4eGZ1bmN0aW9uYWwuaD4KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkLmg+CisjaW5jbHVkZSA8bWVtb3J5PgogCiBuYW1lc3BhY2UgYXBhY2hlIHsKIG5hbWVzcGFjZSB0aHJpZnQgewpAQCAtNDQsNyArNDQsNyBAQAogICogIEEqIGEgPSBuZXcgQSgpOwogICogIC8vIFRvIGNyZWF0ZSBhIHRocmVhZCB0aGF0IGV4ZWN1dGVzIGEuZm9vKCkgZXZlcnkgMTAwIG1pbGxpc2Vjb25kczoKICAqICBmYWN0b3J5LT5uZXdUaHJlYWQoRnVuY3Rpb25SdW5uZXI6OmNyZWF0ZSgKLSAqICAgIGFwYWNoZTo6dGhyaWZ0OjpzdGRjeHg6OmJpbmQoJkE6OmZvbywgYSksIDEwMCkpLT5zdGFydCgpOworICogICAgc3RkOjpiaW5kKCZBOjpmb28sIGEpLCAxMDApKS0+c3RhcnQoKTsKICAqCiAgKi8KIApAQCAtNTMsMjAgKzUzLDIwIEBACiAgIC8vIFRoaXMgaXMgdGhlIHR5cGUgb2YgY2FsbGJhY2sgJ3B0aHJlYWRfY3JlYXRlKCknIGV4cGVjdHMuCiAgIHR5cGVkZWYgdm9pZCogKCpQdGhyZWFkRnVuY1B0cikodm9pZCogYXJnKTsKICAgLy8gVGhpcyBhIGZ1bGx5LWdlbmVyaWMgdm9pZCh2b2lkKSBjYWxsYmFjayBmb3IgY3VzdG9tIGJpbmRpbmdzLgotICB0eXBlZGVmIGFwYWNoZTo6dGhyaWZ0OjpzdGRjeHg6OmZ1bmN0aW9uPHZvaWQoKT4gVm9pZEZ1bmM7CisgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjx2b2lkKCk+IFZvaWRGdW5jOwogCi0gIHR5cGVkZWYgYXBhY2hlOjp0aHJpZnQ6OnN0ZGN4eDo6ZnVuY3Rpb248Ym9vbCgpPiBCb29sRnVuYzsKKyAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPGJvb2woKT4gQm9vbEZ1bmM7CiAKICAgLyoqCiAgICAqIFN5bnRhY3RpYyBzdWdhciB0byBtYWtlIGl0IGVhc2llciB0byBjcmVhdGUgbmV3IEZ1bmN0aW9uUnVubmVyCiAgICAqIG9iamVjdHMgd3JhcHBlZCBpbiBzaGFyZWRfcHRyLgogICAgKi8KLSAgc3RhdGljIGJvb3N0OjpzaGFyZWRfcHRyPEZ1bmN0aW9uUnVubmVyPiBjcmVhdGUoY29uc3QgVm9pZEZ1bmMmIGNvYikgewotICAgIHJldHVybiBib29zdDo6c2hhcmVkX3B0cjxGdW5jdGlvblJ1bm5lcj4obmV3IEZ1bmN0aW9uUnVubmVyKGNvYikpOworICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPEZ1bmN0aW9uUnVubmVyPiBjcmVhdGUoY29uc3QgVm9pZEZ1bmMmIGNvYikgeworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8RnVuY3Rpb25SdW5uZXI+KG5ldyBGdW5jdGlvblJ1bm5lcihjb2IpKTsKICAgfQogCi0gIHN0YXRpYyBib29zdDo6c2hhcmVkX3B0cjxGdW5jdGlvblJ1bm5lcj4gY3JlYXRlKFB0aHJlYWRGdW5jUHRyIGZ1bmMsIHZvaWQqIGFyZykgewotICAgIHJldHVybiBib29zdDo6c2hhcmVkX3B0cjxGdW5jdGlvblJ1bm5lcj4obmV3IEZ1bmN0aW9uUnVubmVyKGZ1bmMsIGFyZykpOworICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPEZ1bmN0aW9uUnVubmVyPiBjcmVhdGUoUHRocmVhZEZ1bmNQdHIgZnVuYywgdm9pZCogYXJnKSB7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxGdW5jdGlvblJ1bm5lcj4obmV3IEZ1bmN0aW9uUnVubmVyKGZ1bmMsIGFyZykpOwogICB9CiAKIHByaXZhdGU6CkBAIC04MSwxMiArODEsMTIgQEAKICAgICogZXhlY3V0ZSB0aGUgZ2l2ZW4gY2FsbGJhY2suICBOb3RlIHRoYXQgdGhlICd2b2lkKicgcmV0dXJuIHZhbHVlIGlzIGlnbm9yZWQuCiAgICAqLwogICBGdW5jdGlvblJ1bm5lcihQdGhyZWFkRnVuY1B0ciBmdW5jLCB2b2lkKiBhcmcpCi0gICAgOiBmdW5jXyhhcGFjaGU6OnRocmlmdDo6c3RkY3h4OjpiaW5kKHB0aHJlYWRfZnVuY193cmFwcGVyLCBmdW5jLCBhcmcpKSB7fQorICAgIDogZnVuY18oc3RkOjpiaW5kKHB0aHJlYWRfZnVuY193cmFwcGVyLCBmdW5jLCBhcmcpKSwgaW50ZXJ2YWxNc18oLTEpIHt9CiAKICAgLyoqCiAgICAqIEdpdmVuIGEgZ2VuZXJpYyBjYWxsYmFjaywgdGhpcyBGdW5jdGlvblJ1bm5lciB3aWxsIGV4ZWN1dGUgaXQuCiAgICAqLwotICBGdW5jdGlvblJ1bm5lcihjb25zdCBWb2lkRnVuYyYgY29iKSA6IGZ1bmNfKGNvYikge30KKyAgRnVuY3Rpb25SdW5uZXIoY29uc3QgVm9pZEZ1bmMmIGNvYikgOiBmdW5jXyhjb2IpLCBpbnRlcnZhbE1zXygtMSkge30KIAogICAvKioKICAgICogR2l2ZW4gYSBib29sIGZvbyguLi4pIHR5cGUgY2FsbGJhY2ssIEZ1bmN0aW9uUnVubmVyIHdpbGwgZXhlY3V0ZQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuY3BwCmluZGV4IDVlNzEzYzAuLjk1NzBjYzYgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5jcHAKQEAgLTE3LDEyICsxNywxMyBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CisKICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oPgogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9FeGNlcHRpb24uaD4KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVXRpbC5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaD4KLQotI2luY2x1ZGUgPGJvb3N0L3Njb3BlZF9wdHIuaHBwPgorI2luY2x1ZGUgPG1lbW9yeT4KIAogI2luY2x1ZGUgPGFzc2VydC5oPgogCkBAIC0zMiw5ICszMywxMSBAQAogCiBuYW1lc3BhY2UgYXBhY2hlIHsKIG5hbWVzcGFjZSB0aHJpZnQgewotbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKIAotdXNpbmcgYm9vc3Q6OnNjb3BlZF9wdHI7Cit1c2luZyBzdGQ6OnVuaXF1ZV9wdHI7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CisKK25hbWVzcGFjZSBjb25jdXJyZW5jeSB7CiAKIC8qKgogICogTW9uaXRvciBpbXBsZW1lbnRhdGlvbiB1c2luZyB0aGUgUE9TSVggcHRocmVhZCBsaWJyYXJ5CkBAIC0xNjAsNyArMTYzLDcgQEAKICAgICB9CiAgIH0KIAotICBzY29wZWRfcHRyPE11dGV4PiBvd25lZE11dGV4XzsKKyAgdW5pcXVlX3B0cjxNdXRleD4gb3duZWRNdXRleF87CiAgIE11dGV4KiBtdXRleF87CiAKICAgbXV0YWJsZSBwdGhyZWFkX2NvbmRfdCBwdGhyZWFkX2NvbmRfOwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmgKaW5kZXggNTQ3MmY4NS4uMjM5OWE5OCAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oCkBAIC0yMCw2ICsyMCwxMCBAQAogI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX01PTklUT1JfSF8KICNkZWZpbmUgX1RIUklGVF9DT05DVVJSRU5DWV9NT05JVE9SX0hfIDEKIAorI2lmZGVmIEhBVkVfU1lTX1RJTUVfSAorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjZW5kaWYKKwogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9FeGNlcHRpb24uaD4KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguaD4KIApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9NdXRleC5jcHAKaW5kZXggZDk5MjFhYS4uYTUyNjQ2MSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4LmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguY3BwCkBAIC0xNywzMSArMTcsMzcgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKy8vIG5lZWRlZCB0byB0ZXN0IGZvciBwdGhyZWFkIGltcGxlbWVudGF0aW9uIGNhcGFiaWxpdGllczoKKyNkZWZpbmUgX19VU0VfR05VCisKICNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgogCiAjaW5jbHVkZSA8dGhyaWZ0L1RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9FeGNlcHRpb24uaD4KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguaD4KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVXRpbC5oPgogCiAjaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaWZkZWYgSEFWRV9QVEhSRUFEX0gKKyNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0jZW5kaWYKICNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KIAotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7CisjaW5jbHVkZSA8Ym9vc3QvZm9ybWF0LmhwcD4KIAogbmFtZXNwYWNlIGFwYWNoZSB7CiBuYW1lc3BhY2UgdGhyaWZ0IHsKIG5hbWVzcGFjZSBjb25jdXJyZW5jeSB7CiAKLSNpZm5kZWYgVEhSSUZUX05PX0NPTlRFTlRJT05fUFJPRklMSU5HCisvLyBFbmFibGUgdGhpcyB0byB0dXJuIG9uIG11dGV4IGNvbnRlbnRpb24gcHJvZmlsaW5nIHN1cHBvcnQKKy8vICNkZWZpbmUgVEhSSUZUX1BUSFJFQURfTVVURVhfQ09OVEVOVElPTl9QUk9GSUxJTkcKIAotc3RhdGljIHNpZ19hdG9taWNfdCBtdXRleFByb2ZpbGluZ1NhbXBsZVJhdGUgPSAwOworI2lmZGVmIFRIUklGVF9QVEhSRUFEX01VVEVYX0NPTlRFTlRJT05fUFJPRklMSU5HCisKK3N0YXRpYyBpbnQzMl90IG11dGV4UHJvZmlsaW5nQ291bnRlciA9IDA7CitzdGF0aWMgaW50MzJfdCBtdXRleFByb2ZpbGluZ1NhbXBsZVJhdGUgPSAwOwogc3RhdGljIE11dGV4V2FpdENhbGxiYWNrIG11dGV4UHJvZmlsaW5nQ2FsbGJhY2sgPSAwOwogCi12b2xhdGlsZSBzdGF0aWMgc2lnX2F0b21pY190IG11dGV4UHJvZmlsaW5nQ291bnRlciA9IDA7Ci0KIHZvaWQgZW5hYmxlTXV0ZXhQcm9maWxpbmcoaW50MzJfdCBwcm9maWxpbmdTYW1wbGVSYXRlLCBNdXRleFdhaXRDYWxsYmFjayBjYWxsYmFjaykgewogICBtdXRleFByb2ZpbGluZ1NhbXBsZVJhdGUgPSBwcm9maWxpbmdTYW1wbGVSYXRlOwogICBtdXRleFByb2ZpbGluZ0NhbGxiYWNrID0gY2FsbGJhY2s7CkBAIC0xMDYsMTcgKzExMiwyNSBAQAogI2RlZmluZSBQUk9GSUxFX01VVEVYX0xPQ0tFRCgpCiAjZGVmaW5lIFBST0ZJTEVfTVVURVhfU1RBUlRfVU5MT0NLKCkKICNkZWZpbmUgUFJPRklMRV9NVVRFWF9VTkxPQ0tFRCgpCi0jZW5kaWYgLy8gVEhSSUZUX05PX0NPTlRFTlRJT05fUFJPRklMSU5HCisjZW5kaWYgLy8gVEhSSUZUX1BUSFJFQURfTVVURVhfQ09OVEVOVElPTl9QUk9GSUxJTkcKKworI2RlZmluZSBFSU5UUl9MT09QKF9DQUxMKSAgICAgICAgICBpbnQgcmV0OyBkbyB7IHJldCA9IF9DQUxMOyB9IHdoaWxlIChyZXQgPT0gRUlOVFIpCisjZGVmaW5lIEFCT1JUX09ORkFJTChfQ0FMTCkgICAgICB7IEVJTlRSX0xPT1AoX0NBTEwpOyBpZiAocmV0KSB7IGFib3J0KCk7IH0gfQorI2RlZmluZSBUSFJPV19TUkUoX0NBTExTVFIsIFJFVCkgeyB0aHJvdyBTeXN0ZW1SZXNvdXJjZUV4Y2VwdGlvbihib29zdDo6c3RyKGJvb3N0Ojpmb3JtYXQoIiUxJSByZXR1cm5lZCAlMiUgKCUzJSkiKSAlIF9DQUxMU1RSICUgUkVUICUgOjpzdHJlcnJvcihSRVQpKSk7IH0KKyNkZWZpbmUgVEhST1dfU1JFX09ORkFJTChfQ0FMTCkgIHsgRUlOVFJfTE9PUChfQ0FMTCk7IGlmIChyZXQpIHsgVEhST1dfU1JFKCNfQ0FMTCwgcmV0KTsgfSB9CisjZGVmaW5lIFRIUk9XX1NSRV9UUllGQUlMKF9DQUxMKSB7IEVJTlRSX0xPT1AoX0NBTEwpOyBpZiAocmV0ID09IDApIHsgcmV0dXJuIHRydWU7IH0gZWxzZSBpZiAocmV0ID09IEVCVVNZKSB7IHJldHVybiBmYWxzZTsgfSBUSFJPV19TUkUoI19DQUxMLCByZXQpOyB9CiAKIC8qKgogICogSW1wbGVtZW50YXRpb24gb2YgTXV0ZXggY2xhc3MgdXNpbmcgUE9TSVggbXV0ZXgKICAqCisgKiBUaHJvd3MgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpTeXN0ZW1SZXNvdXJjZUV4Y2VwdGlvbiBvbiBlcnJvci4KKyAqCiAgKiBAdmVyc2lvbiAkSWQ6JAogICovCiBjbGFzcyBNdXRleDo6aW1wbCB7CiBwdWJsaWM6CiAgIGltcGwoSW5pdGlhbGl6ZXIgaW5pdCkgOiBpbml0aWFsaXplZF8oZmFsc2UpIHsKLSNpZm5kZWYgVEhSSUZUX05PX0NPTlRFTlRJT05fUFJPRklMSU5HCisjaWZkZWYgVEhSSUZUX1BUSFJFQURfTVVURVhfQ09OVEVOVElPTl9QUk9GSUxJTkcKICAgICBwcm9maWxlVGltZV8gPSAwOwogI2VuZGlmCiAgICAgaW5pdCgmcHRocmVhZF9tdXRleF8pOwpAQCAtMTI2LDE5ICsxNDAsMTkgQEAKICAgfmltcGwoKSB7CiAgICAgaWYgKGluaXRpYWxpemVkXykgewogICAgICAgaW5pdGlhbGl6ZWRfID0gZmFsc2U7Ci0gICAgICBpbnQgcmV0ID0gcHRocmVhZF9tdXRleF9kZXN0cm95KCZwdGhyZWFkX211dGV4Xyk7Ci0gICAgICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKHJldCk7Ci0gICAgICBhc3NlcnQocmV0ID09IDApOworICAgICAgQUJPUlRfT05GQUlMKHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmcHRocmVhZF9tdXRleF8pKTsKICAgICB9CiAgIH0KIAogICB2b2lkIGxvY2soKSBjb25zdCB7CiAgICAgUFJPRklMRV9NVVRFWF9TVEFSVF9MT0NLKCk7Ci0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZwdGhyZWFkX211dGV4Xyk7CisgICAgVEhST1dfU1JFX09ORkFJTChwdGhyZWFkX211dGV4X2xvY2soJnB0aHJlYWRfbXV0ZXhfKSk7CiAgICAgUFJPRklMRV9NVVRFWF9MT0NLRUQoKTsKICAgfQogCi0gIGJvb2wgdHJ5bG9jaygpIGNvbnN0IHsgcmV0dXJuICgwID09IHB0aHJlYWRfbXV0ZXhfdHJ5bG9jaygmcHRocmVhZF9tdXRleF8pKTsgfQorICBib29sIHRyeWxvY2soKSBjb25zdCB7CisgICAgVEhST1dfU1JFX1RSWUZBSUwocHRocmVhZF9tdXRleF90cnlsb2NrKCZwdGhyZWFkX211dGV4XykpOworICB9CiAKICAgYm9vbCB0aW1lZGxvY2soaW50NjRfdCBtaWxsaXNlY29uZHMpIGNvbnN0IHsKICNpZiBkZWZpbmVkKF9QT1NJWF9USU1FT1VUUykgJiYgX1BPU0lYX1RJTUVPVVRTID49IDIwMDExMkwKQEAgLTE0NiwxNCArMTYwLDE2IEBACiAKICAgICBzdHJ1Y3QgVEhSSUZUX1RJTUVTUEVDIHRzOwogICAgIFV0aWw6OnRvVGltZXNwZWModHMsIG1pbGxpc2Vjb25kcyArIFV0aWw6OmN1cnJlbnRUaW1lKCkpOwotICAgIGludCByZXQgPSBwdGhyZWFkX211dGV4X3RpbWVkbG9jaygmcHRocmVhZF9tdXRleF8sICZ0cyk7CisgICAgRUlOVFJfTE9PUChwdGhyZWFkX211dGV4X3RpbWVkbG9jaygmcHRocmVhZF9tdXRleF8sICZ0cykpOwogICAgIGlmIChyZXQgPT0gMCkgewogICAgICAgUFJPRklMRV9NVVRFWF9MT0NLRUQoKTsKICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAocmV0ID09IEVUSU1FRE9VVCkgeworICAgICAgUFJPRklMRV9NVVRFWF9OT1RfTE9DS0VEKCk7CisgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgUFJPRklMRV9NVVRFWF9OT1RfTE9DS0VEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIFRIUk9XX1NSRSgicHRocmVhZF9tdXRleF90aW1lZGxvY2soJnB0aHJlYWRfbXV0ZXhfLCAmdHMpIiwgcmV0KTsKICNlbHNlCiAgICAgLyogT3RoZXJ3aXNlIGZvbGxvdyBzb2x1dGlvbiB1c2VkIGJ5IE1vbm8gZm9yIEFuZHJvaWQgKi8KICAgICBzdHJ1Y3QgVEhSSUZUX1RJTUVTUEVDIHNsZWVweXRpbWUsIG5vdywgdG87CkBAIC0xNzgsNyArMTk0LDcgQEAKIAogICB2b2lkIHVubG9jaygpIGNvbnN0IHsKICAgICBQUk9GSUxFX01VVEVYX1NUQVJUX1VOTE9DSygpOwotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZwdGhyZWFkX211dGV4Xyk7CisgICAgVEhST1dfU1JFX09ORkFJTChwdGhyZWFkX211dGV4X3VubG9jaygmcHRocmVhZF9tdXRleF8pKTsKICAgICBQUk9GSUxFX01VVEVYX1VOTE9DS0VEKCk7CiAgIH0KIApAQCAtMTg3LDcgKzIwMyw3IEBACiBwcml2YXRlOgogICBtdXRhYmxlIHB0aHJlYWRfbXV0ZXhfdCBwdGhyZWFkX211dGV4XzsKICAgbXV0YWJsZSBib29sIGluaXRpYWxpemVkXzsKLSNpZm5kZWYgVEhSSUZUX05PX0NPTlRFTlRJT05fUFJPRklMSU5HCisjaWZkZWYgVEhSSUZUX1BUSFJFQURfTVVURVhfQ09OVEVOVElPTl9QUk9GSUxJTkcKICAgbXV0YWJsZSBpbnQ2NF90IHByb2ZpbGVUaW1lXzsKICNlbmRpZgogfTsKQEAgLTIxNywyOCArMjMzLDE2IEBACiAKIHZvaWQgTXV0ZXg6OkRFRkFVTFRfSU5JVElBTElaRVIodm9pZCogYXJnKSB7CiAgIHB0aHJlYWRfbXV0ZXhfdCogcHRocmVhZF9tdXRleCA9IChwdGhyZWFkX211dGV4X3QqKWFyZzsKLSAgaW50IHJldCA9IHB0aHJlYWRfbXV0ZXhfaW5pdChwdGhyZWFkX211dGV4LCBOVUxMKTsKLSAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShyZXQpOwotICBhc3NlcnQocmV0ID09IDApOworICBUSFJPV19TUkVfT05GQUlMKHB0aHJlYWRfbXV0ZXhfaW5pdChwdGhyZWFkX211dGV4LCBOVUxMKSk7CiB9CiAKLSNpZiBkZWZpbmVkKFBUSFJFQURfQURBUFRJVkVfTVVURVhfSU5JVElBTElaRVJfTlApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB8fCBkZWZpbmVkKFBUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVRJQUxJWkVSX05QKQorI2lmIGRlZmluZWQoUFRIUkVBRF9BREFQVElWRV9NVVRFWF9JTklUSUFMSVpFUl9OUCkgfHwgZGVmaW5lZChQVEhSRUFEX0VSUk9SQ0hFQ0tfTVVURVhfSU5JVElBTElaRVJfTlApIHx8IGRlZmluZWQoUFRIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVElBTElaRVJfTlApCiBzdGF0aWMgdm9pZCBpbml0X3dpdGhfa2luZChwdGhyZWFkX211dGV4X3QqIG11dGV4LCBpbnQga2luZCkgewogICBwdGhyZWFkX211dGV4YXR0cl90IG11dGV4YXR0cjsKLSAgaW50IHJldCA9IHB0aHJlYWRfbXV0ZXhhdHRyX2luaXQoJm11dGV4YXR0cik7Ci0gIGFzc2VydChyZXQgPT0gMCk7Ci0KLSAgLy8gQXBwYXJlbnRseSwgdGhpcyBjYW4gZmFpbC4gIFNob3VsZCB3ZSByZWFsbHkgYmUgYWJvcnRpbmc/Ci0gIHJldCA9IHB0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUoJm11dGV4YXR0ciwga2luZCk7Ci0gIGFzc2VydChyZXQgPT0gMCk7Ci0KLSAgcmV0ID0gcHRocmVhZF9tdXRleF9pbml0KG11dGV4LCAmbXV0ZXhhdHRyKTsKLSAgYXNzZXJ0KHJldCA9PSAwKTsKLQotICByZXQgPSBwdGhyZWFkX211dGV4YXR0cl9kZXN0cm95KCZtdXRleGF0dHIpOwotICBhc3NlcnQocmV0ID09IDApOwotICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKHJldCk7CisgIFRIUk9XX1NSRV9PTkZBSUwocHRocmVhZF9tdXRleGF0dHJfaW5pdCgmbXV0ZXhhdHRyKSk7CisgIFRIUk9XX1NSRV9PTkZBSUwocHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZSgmbXV0ZXhhdHRyLCBraW5kKSk7CisgIFRIUk9XX1NSRV9PTkZBSUwocHRocmVhZF9tdXRleF9pbml0KG11dGV4LCAmbXV0ZXhhdHRyKSk7CisgIFRIUk9XX1NSRV9PTkZBSUwocHRocmVhZF9tdXRleGF0dHJfZGVzdHJveSgmbXV0ZXhhdHRyKSk7CiB9CiAjZW5kaWYKIApAQCAtMjU2LDYgKzI2MCwxMiBAQAogfQogI2VuZGlmCiAKKyNpZmRlZiBQVEhSRUFEX0VSUk9SQ0hFQ0tfTVVURVhfSU5JVElBTElaRVJfTlAKK3ZvaWQgTXV0ZXg6OkVSUk9SQ0hFQ0tfSU5JVElBTElaRVIodm9pZCogYXJnKSB7CisgIGluaXRfd2l0aF9raW5kKChwdGhyZWFkX211dGV4X3QqKWFyZywgUFRIUkVBRF9NVVRFWF9FUlJPUkNIRUNLKTsKK30KKyNlbmRpZgorCiAjaWZkZWYgUFRIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVElBTElaRVJfTlAKIHZvaWQgTXV0ZXg6OlJFQ1VSU0lWRV9JTklUSUFMSVpFUih2b2lkKiBhcmcpIHsKICAgaW5pdF93aXRoX2tpbmQoKHB0aHJlYWRfbXV0ZXhfdCopYXJnLCBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRV9OUCk7CkBAIC0yNzAsNTAgKzI4MCw0NiBAQAogY2xhc3MgUmVhZFdyaXRlTXV0ZXg6OmltcGwgewogcHVibGljOgogICBpbXBsKCkgOiBpbml0aWFsaXplZF8oZmFsc2UpIHsKLSNpZm5kZWYgVEhSSUZUX05PX0NPTlRFTlRJT05fUFJPRklMSU5HCisjaWZkZWYgVEhSSUZUX1BUSFJFQURfTVVURVhfQ09OVEVOVElPTl9QUk9GSUxJTkcKICAgICBwcm9maWxlVGltZV8gPSAwOwogI2VuZGlmCi0gICAgaW50IHJldCA9IHB0aHJlYWRfcndsb2NrX2luaXQoJnJ3X2xvY2tfLCBOVUxMKTsKLSAgICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKHJldCk7Ci0gICAgYXNzZXJ0KHJldCA9PSAwKTsKKyAgICBUSFJPV19TUkVfT05GQUlMKHB0aHJlYWRfcndsb2NrX2luaXQoJnJ3X2xvY2tfLCBOVUxMKSk7CiAgICAgaW5pdGlhbGl6ZWRfID0gdHJ1ZTsKICAgfQogCiAgIH5pbXBsKCkgewogICAgIGlmIChpbml0aWFsaXplZF8pIHsKICAgICAgIGluaXRpYWxpemVkXyA9IGZhbHNlOwotICAgICAgaW50IHJldCA9IHB0aHJlYWRfcndsb2NrX2Rlc3Ryb3koJnJ3X2xvY2tfKTsKLSAgICAgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUocmV0KTsKLSAgICAgIGFzc2VydChyZXQgPT0gMCk7CisgICAgICBBQk9SVF9PTkZBSUwocHRocmVhZF9yd2xvY2tfZGVzdHJveSgmcndfbG9ja18pKTsKICAgICB9CiAgIH0KIAogICB2b2lkIGFjcXVpcmVSZWFkKCkgY29uc3QgewogICAgIFBST0ZJTEVfTVVURVhfU1RBUlRfTE9DSygpOwotICAgIHB0aHJlYWRfcndsb2NrX3JkbG9jaygmcndfbG9ja18pOworICAgIFRIUk9XX1NSRV9PTkZBSUwocHRocmVhZF9yd2xvY2tfcmRsb2NrKCZyd19sb2NrXykpOwogICAgIFBST0ZJTEVfTVVURVhfTk9UX0xPQ0tFRCgpOyAvLyBub3QgZXhjbHVzaXZlLCBzbyB1c2Ugbm90LWxvY2tlZCBwYXRoCiAgIH0KIAogICB2b2lkIGFjcXVpcmVXcml0ZSgpIGNvbnN0IHsKICAgICBQUk9GSUxFX01VVEVYX1NUQVJUX0xPQ0soKTsKLSAgICBwdGhyZWFkX3J3bG9ja193cmxvY2soJnJ3X2xvY2tfKTsKKyAgICBUSFJPV19TUkVfT05GQUlMKHB0aHJlYWRfcndsb2NrX3dybG9jaygmcndfbG9ja18pKTsKICAgICBQUk9GSUxFX01VVEVYX0xPQ0tFRCgpOwogICB9CiAKLSAgYm9vbCBhdHRlbXB0UmVhZCgpIGNvbnN0IHsgcmV0dXJuICFwdGhyZWFkX3J3bG9ja190cnlyZGxvY2soJnJ3X2xvY2tfKTsgfQorICBib29sIGF0dGVtcHRSZWFkKCkgY29uc3QgeyBUSFJPV19TUkVfVFJZRkFJTChwdGhyZWFkX3J3bG9ja190cnlyZGxvY2soJnJ3X2xvY2tfKSk7IH0KIAotICBib29sIGF0dGVtcHRXcml0ZSgpIGNvbnN0IHsgcmV0dXJuICFwdGhyZWFkX3J3bG9ja190cnl3cmxvY2soJnJ3X2xvY2tfKTsgfQorICBib29sIGF0dGVtcHRXcml0ZSgpIGNvbnN0IHsgVEhST1dfU1JFX1RSWUZBSUwocHRocmVhZF9yd2xvY2tfdHJ5d3Jsb2NrKCZyd19sb2NrXykpOyB9CiAKICAgdm9pZCByZWxlYXNlKCkgY29uc3QgewogICAgIFBST0ZJTEVfTVVURVhfU1RBUlRfVU5MT0NLKCk7Ci0gICAgcHRocmVhZF9yd2xvY2tfdW5sb2NrKCZyd19sb2NrXyk7CisgICAgVEhST1dfU1JFX09ORkFJTChwdGhyZWFkX3J3bG9ja191bmxvY2soJnJ3X2xvY2tfKSk7CiAgICAgUFJPRklMRV9NVVRFWF9VTkxPQ0tFRCgpOwogICB9CiAKIHByaXZhdGU6CiAgIG11dGFibGUgcHRocmVhZF9yd2xvY2tfdCByd19sb2NrXzsKICAgbXV0YWJsZSBib29sIGluaXRpYWxpemVkXzsKLSNpZm5kZWYgVEhSSUZUX05PX0NPTlRFTlRJT05fUFJPRklMSU5HCisjaWZkZWYgVEhSSUZUX1BUSFJFQURfTVVURVhfQ09OVEVOVElPTl9QUk9GSUxJTkcKICAgbXV0YWJsZSBpbnQ2NF90IHByb2ZpbGVUaW1lXzsKICNlbmRpZgogfTsKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9NdXRleC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4LmgKaW5kZXggNmY4OTJkYy4uYTFmNTM5NiAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4LmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4LmgKQEAgLTIwLDcgKzIwLDcgQEAKICNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9NVVRFWF9IXwogI2RlZmluZSBfVEhSSUZUX0NPTkNVUlJFTkNZX01VVEVYX0hfIDEKIAotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxib29zdC9ub25jb3B5YWJsZS5ocHA+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKQEAgLTU0LDYgKzU0LDExIEBACiAjZW5kaWYKIAogLyoqCisgKiBOT1RFOiBBbGwgbXV0ZXggaW1wbGVtZW50YXRpb25zIHRocm93IGFuIGV4Y2VwdGlvbiBvbiBmYWlsdXJlLiAgU2VlIGVhY2gKKyAqICAgICAgIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIHRvIHVuZGVyc3RhbmQgdGhlIGV4Y2VwdGlvbiB0eXBlKHMpIHVzZWQuCisgKi8KKworLyoqCiAgKiBBIHNpbXBsZSBtdXRleCBjbGFzcwogICoKICAqIEB2ZXJzaW9uICRJZDokCkBAIC02NCw2ICs2OSw3IEBACiAKICAgTXV0ZXgoSW5pdGlhbGl6ZXIgaW5pdCA9IERFRkFVTFRfSU5JVElBTElaRVIpOwogICB2aXJ0dWFsIH5NdXRleCgpIHt9CisKICAgdmlydHVhbCB2b2lkIGxvY2soKSBjb25zdDsKICAgdmlydHVhbCBib29sIHRyeWxvY2soKSBjb25zdDsKICAgdmlydHVhbCBib29sIHRpbWVkbG9jayhpbnQ2NF90IG1pbGxpc2Vjb25kcykgY29uc3Q7CkBAIC03MSwxMyArNzcsMTYgQEAKIAogICB2b2lkKiBnZXRVbmRlcmx5aW5nSW1wbCgpIGNvbnN0OwogCi0gIHN0YXRpYyB2b2lkIERFRkFVTFRfSU5JVElBTElaRVIodm9pZCopOworICAvLyBJZiB5b3UgYXR0ZW1wdCB0byB1c2Ugb25lIG9mIHRoZXNlIGFuZCBpdCBmYWlscyB0byBsaW5rLCBpdCBtZWFucworICAvLyB5b3VyIHZlcnNpb24gb2YgcHRocmVhZHMgZG9lcyBub3Qgc3VwcG9ydCBpdCAtIHRyeSBhbm90aGVyIG9uZS4KICAgc3RhdGljIHZvaWQgQURBUFRJVkVfSU5JVElBTElaRVIodm9pZCopOworICBzdGF0aWMgdm9pZCBERUZBVUxUX0lOSVRJQUxJWkVSKHZvaWQqKTsKKyAgc3RhdGljIHZvaWQgRVJST1JDSEVDS19JTklUSUFMSVpFUih2b2lkKik7CiAgIHN0YXRpYyB2b2lkIFJFQ1VSU0lWRV9JTklUSUFMSVpFUih2b2lkKik7CiAKIHByaXZhdGU6CiAgIGNsYXNzIGltcGw7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPGltcGw+IGltcGxfOworICBzdGQ6OnNoYXJlZF9wdHI8aW1wbD4gaW1wbF87CiB9OwogCiBjbGFzcyBSZWFkV3JpdGVNdXRleCB7CkBAIC05OCw3ICsxMDcsNyBAQAogCiBwcml2YXRlOgogICBjbGFzcyBpbXBsOwotICBib29zdDo6c2hhcmVkX3B0cjxpbXBsPiBpbXBsXzsKKyAgc3RkOjpzaGFyZWRfcHRyPGltcGw+IGltcGxfOwogfTsKIAogLyoqCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvUGxhdGZvcm1UaHJlYWRGYWN0b3J5LmggYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvUGxhdGZvcm1UaHJlYWRGYWN0b3J5LmgKaW5kZXggNTQ1YjU3Mi4uOTliNDQwMyAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1BsYXRmb3JtVGhyZWFkRmFjdG9yeS5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9QbGF0Zm9ybVRocmVhZEZhY3RvcnkuaApAQCAtMjIsOSArMjIsNyBAQAogCiAvLyBjbGFuZy1mb3JtYXQgb2ZmCiAjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KLSNpZiBVU0VfQk9PU1RfVEhSRUFECi0jICBpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvQm9vc3RUaHJlYWRGYWN0b3J5Lmg+Ci0jZWxpZiBVU0VfU1REX1RIUkVBRAorI2lmIFVTRV9TVERfVEhSRUFECiAjICBpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvU3RkVGhyZWFkRmFjdG9yeS5oPgogI2Vsc2UKICMgIGluY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuaD4KQEAgLTM2LDkgKzM0LDcgQEAKIG5hbWVzcGFjZSBjb25jdXJyZW5jeSB7CiAKIC8vIGNsYW5nLWZvcm1hdCBvZmYKLSNpZiBVU0VfQk9PU1RfVEhSRUFECi0gIHR5cGVkZWYgQm9vc3RUaHJlYWRGYWN0b3J5IFBsYXRmb3JtVGhyZWFkRmFjdG9yeTsKLSNlbGlmIFVTRV9TVERfVEhSRUFECisjaWYgVVNFX1NURF9USFJFQUQKICAgdHlwZWRlZiBTdGRUaHJlYWRGYWN0b3J5IFBsYXRmb3JtVGhyZWFkRmFjdG9yeTsKICNlbHNlCiAgIHR5cGVkZWYgUG9zaXhUaHJlYWRGYWN0b3J5IFBsYXRmb3JtVGhyZWFkRmFjdG9yeTsKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1Bvc2l4VGhyZWFkRmFjdG9yeS5jcHAKaW5kZXggNDdjNTAzNC4uNWM1OTI2OSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1Bvc2l4VGhyZWFkRmFjdG9yeS5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1Bvc2l4VGhyZWFkRmFjdG9yeS5jcHAKQEAgLTE5LDggKzE5LDkgQEAKIAogI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CiAKLSNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L0V4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1Bvc2l4VGhyZWFkRmFjdG9yeS5oPgogCiAjaWYgR09PR0xFX1BFUkZUT09MU19SRUdJU1RFUl9USFJFQUQKICNpbmNsdWRlIDxnb29nbGUvcHJvZmlsZXIuaD4KQEAgLTMxLDE1ICszMiwxMiBAQAogCiAjaW5jbHVkZSA8aW9zdHJlYW0+CiAKLSNpbmNsdWRlIDxib29zdC93ZWFrX3B0ci5ocHA+CisjaW5jbHVkZSA8bWVtb3J5PgogCiBuYW1lc3BhY2UgYXBhY2hlIHsKIG5hbWVzcGFjZSB0aHJpZnQgewogbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKIAotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Ci11c2luZyBib29zdDo6d2Vha19wdHI7Ci0KIC8qKgogICogVGhlIFBPU0lYIHRocmVhZCBjbGFzcy4KICAqCkBAIC01NSwxMSArNTMsMTIgQEAKIAogcHJpdmF0ZToKICAgcHRocmVhZF90IHB0aHJlYWRfOwotICBTVEFURSBzdGF0ZV87CisgIE1vbml0b3IgbW9uaXRvcl87CQkvLyBndWFyZCB0byBwcm90ZWN0IHN0YXRlXyBhbmQgYWxzbyBub3RpZmljYXRpb24KKyAgU1RBVEUgc3RhdGVfOyAgICAgICAgIC8vIHRvIHByb3RlY3QgcHJvcGVyIHRocmVhZCBzdGFydCBiZWhhdmlvcgogICBpbnQgcG9saWN5XzsKICAgaW50IHByaW9yaXR5XzsKICAgaW50IHN0YWNrU2l6ZV87Ci0gIHdlYWtfcHRyPFB0aHJlYWRUaHJlYWQ+IHNlbGZfOworICBzdGQ6OndlYWtfcHRyPFB0aHJlYWRUaHJlYWQ+IHNlbGZfOwogICBib29sIGRldGFjaGVkXzsKIAogcHVibGljOgpAQCAtNjcsMTMgKzY2LDEyIEBACiAgICAgICAgICAgICAgICAgaW50IHByaW9yaXR5LAogICAgICAgICAgICAgICAgIGludCBzdGFja1NpemUsCiAgICAgICAgICAgICAgICAgYm9vbCBkZXRhY2hlZCwKLSAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSkKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKQogICAgIDoKIAogI2lmbmRlZiBfV0lOMzIKICAgICAgIHB0aHJlYWRfKDApLAogI2VuZGlmIC8vIF9XSU4zMgotCiAgICAgICBzdGF0ZV8odW5pbml0aWFsaXplZCksCiAgICAgICBwb2xpY3lfKHBvbGljeSksCiAgICAgICBwcmlvcml0eV8ocHJpb3JpdHkpLApAQCAtOTYsOCArOTQsMjYgQEAKICAgICB9CiAgIH0KIAorICBTVEFURSBnZXRTdGF0ZSgpIGNvbnN0CisgIHsKKyAgICBTeW5jaHJvbml6ZWQgc3luYyhtb25pdG9yXyk7CisgICAgcmV0dXJuIHN0YXRlXzsKKyAgfQorCisgIHZvaWQgc2V0U3RhdGUoU1RBVEUgbmV3U3RhdGUpCisgIHsKKyAgICBTeW5jaHJvbml6ZWQgc3luYyhtb25pdG9yXyk7CisgICAgc3RhdGVfID0gbmV3U3RhdGU7CisKKyAgICAvLyB1bmJsb2NrIHN0YXJ0KCkgd2l0aCB0aGUga25vd2xlZGdlIHRoYXQgdGhlIHRocmVhZCBoYXMgYWN0dWFsbHkKKyAgICAvLyBzdGFydGVkIHJ1bm5pbmcsIHdoaWNoIGF2b2lkcyBhIHJhY2UgaW4gZGV0YWNoZWQgdGhyZWFkcy4KKyAgICBpZiAobmV3U3RhdGUgPT0gc3RhcnRlZCkgeworCSAgbW9uaXRvcl8ubm90aWZ5KCk7CisgICAgfQorICB9CisKICAgdm9pZCBzdGFydCgpIHsKLSAgICBpZiAoc3RhdGVfICE9IHVuaW5pdGlhbGl6ZWQpIHsKKyAgICBpZiAoZ2V0U3RhdGUoKSAhPSB1bmluaXRpYWxpemVkKSB7CiAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC0xMjQsOSArMTQwLDExIEBACiAgICAgcG9saWN5XyA9IFBvc2l4VGhyZWFkRmFjdG9yeTo6T1RIRVI7CiAjZW5kaWYKIAorI2lmIF9QT1NJWF9USFJFQURfUFJJT1JJVFlfU0NIRURVTElORyA+IDAKICAgICBpZiAocHRocmVhZF9hdHRyX3NldHNjaGVkcG9saWN5KCZ0aHJlYWRfYXR0ciwgcG9saWN5XykgIT0gMCkgewogICAgICAgdGhyb3cgU3lzdGVtUmVzb3VyY2VFeGNlcHRpb24oInB0aHJlYWRfYXR0cl9zZXRzY2hlZHBvbGljeSBmYWlsZWQiKTsKICAgICB9CisjZW5kaWYKIAogICAgIHN0cnVjdCBzY2hlZF9wYXJhbSBzY2hlZF9wYXJhbTsKICAgICBzY2hlZF9wYXJhbS5zY2hlZF9wcmlvcml0eSA9IHByaW9yaXR5XzsKQEAgLTEzNywxOCArMTU1LDI3IEBACiAgICAgfQogCiAgICAgLy8gQ3JlYXRlIHJlZmVyZW5jZQotICAgIHNoYXJlZF9wdHI8UHRocmVhZFRocmVhZD4qIHNlbGZSZWYgPSBuZXcgc2hhcmVkX3B0cjxQdGhyZWFkVGhyZWFkPigpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxQdGhyZWFkVGhyZWFkPiogc2VsZlJlZiA9IG5ldyBzdGQ6OnNoYXJlZF9wdHI8UHRocmVhZFRocmVhZD4oKTsKICAgICAqc2VsZlJlZiA9IHNlbGZfLmxvY2soKTsKIAotICAgIHN0YXRlXyA9IHN0YXJ0aW5nOworICAgIHNldFN0YXRlKHN0YXJ0aW5nKTsKIAorCVN5bmNocm9uaXplZCBzeW5jKG1vbml0b3JfKTsKKwkKICAgICBpZiAocHRocmVhZF9jcmVhdGUoJnB0aHJlYWRfLCAmdGhyZWFkX2F0dHIsIHRocmVhZE1haW4sICh2b2lkKilzZWxmUmVmKSAhPSAwKSB7CiAgICAgICB0aHJvdyBTeXN0ZW1SZXNvdXJjZUV4Y2VwdGlvbigicHRocmVhZF9jcmVhdGUgZmFpbGVkIik7CiAgICAgfQorICAgIAorICAgIC8vIFRoZSBjYWxsZXIgbWF5IG5vdCBjaG9vc2UgdG8gZ3VhcmFudGVlIHRoZSBzY29wZSBvZiB0aGUgUnVubmFibGUKKyAgICAvLyBiZWluZyB1c2VkIGluIHRoZSB0aHJlYWQsIHNvIHdlIG11c3QgYWN0dWFsbHkgd2FpdCB1bnRpbCB0aGUgdGhyZWFkCisgICAgLy8gc3RhcnRzIGJlZm9yZSB3ZSByZXR1cm4uICBJZiB3ZSBkbyBub3Qgd2FpdCwgaXQgd291bGQgYmUgcG9zc2libGUKKyAgICAvLyBmb3IgdGhlIGNhbGxlciB0byBzdGFydCBkZXN0cnVjdGluZyB0aGUgUnVubmFibGUgYW5kIHRoZSBUaHJlYWQsCisgICAgLy8gYW5kIHdlIHdvdWxkIGVuZCB1cCBpbiBhIHJhY2UuICBUaGlzIHdhcyBpZGVudGlmaWVkIHdpdGggdmFsZ3JpbmQuCisgICAgbW9uaXRvcl8ud2FpdCgpOwogICB9CiAKICAgdm9pZCBqb2luKCkgewotICAgIGlmICghZGV0YWNoZWRfICYmIHN0YXRlXyAhPSB1bmluaXRpYWxpemVkKSB7CisgICAgaWYgKCFkZXRhY2hlZF8gJiYgZ2V0U3RhdGUoKSAhPSB1bmluaXRpYWxpemVkKSB7CiAgICAgICB2b2lkKiBpZ25vcmU7CiAgICAgICAvKiBYWFgKICAgICAgICAgIElmIGpvaW4gZmFpbHMgaXQgaXMgbW9zdCBsaWtlbHkgZHVlIHRvIHRoZSBmYWN0CkBAIC0xNjIsOCArMTg5LDYgQEAKICAgICAgIGlmIChyZXMgIT0gMCkgewogICAgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJQdGhyZWFkVGhyZWFkOjpqb2luKCk6IGZhaWwgd2l0aCBjb2RlICVkIiwgcmVzKTsKICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiUHRocmVhZFRocmVhZDo6am9pbigpOiBkZXRhY2hlZCB0aHJlYWQiKTsKICAgICB9CiAgIH0KIApAQCAtMTc2LDE4NSArMjAxLDEzNSBAQAogI2VuZGlmIC8vIF9XSU4zMgogICB9CiAKLSAgc2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUoKSBjb25zdCB7IHJldHVybiBUaHJlYWQ6OnJ1bm5hYmxlKCk7IH0KKyAgc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSgpIGNvbnN0IHsgcmV0dXJuIFRocmVhZDo6cnVubmFibGUoKTsgfQogCi0gIHZvaWQgcnVubmFibGUoc2hhcmVkX3B0cjxSdW5uYWJsZT4gdmFsdWUpIHsgVGhyZWFkOjpydW5uYWJsZSh2YWx1ZSk7IH0KKyAgdm9pZCBydW5uYWJsZShzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHZhbHVlKSB7IFRocmVhZDo6cnVubmFibGUodmFsdWUpOyB9CiAKLSAgdm9pZCB3ZWFrUmVmKHNoYXJlZF9wdHI8UHRocmVhZFRocmVhZD4gc2VsZikgeworICB2b2lkIHdlYWtSZWYoc3RkOjpzaGFyZWRfcHRyPFB0aHJlYWRUaHJlYWQ+IHNlbGYpIHsKICAgICBhc3NlcnQoc2VsZi5nZXQoKSA9PSB0aGlzKTsKLSAgICBzZWxmXyA9IHdlYWtfcHRyPFB0aHJlYWRUaHJlYWQ+KHNlbGYpOworICAgIHNlbGZfID0gc3RkOjp3ZWFrX3B0cjxQdGhyZWFkVGhyZWFkPihzZWxmKTsKICAgfQogfTsKIAogdm9pZCogUHRocmVhZFRocmVhZDo6dGhyZWFkTWFpbih2b2lkKiBhcmcpIHsKLSAgc2hhcmVkX3B0cjxQdGhyZWFkVGhyZWFkPiB0aHJlYWQgPSAqKHNoYXJlZF9wdHI8UHRocmVhZFRocmVhZD4qKWFyZzsKLSAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8c2hhcmVkX3B0cjxQdGhyZWFkVGhyZWFkPio+KGFyZyk7Ci0KLSAgaWYgKHRocmVhZCA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuICh2b2lkKikwOwotICB9Ci0KLSAgaWYgKHRocmVhZC0+c3RhdGVfICE9IHN0YXJ0aW5nKSB7Ci0gICAgcmV0dXJuICh2b2lkKikwOwotICB9CisgIHN0ZDo6c2hhcmVkX3B0cjxQdGhyZWFkVGhyZWFkPiB0aHJlYWQgPSAqKHN0ZDo6c2hhcmVkX3B0cjxQdGhyZWFkVGhyZWFkPiopYXJnOworICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxzdGQ6OnNoYXJlZF9wdHI8UHRocmVhZFRocmVhZD4qPihhcmcpOwogCiAjaWYgR09PR0xFX1BFUkZUT09MU19SRUdJU1RFUl9USFJFQUQKICAgUHJvZmlsZXJSZWdpc3RlclRocmVhZCgpOwogI2VuZGlmCiAKLSAgdGhyZWFkLT5zdGF0ZV8gPSBzdGFydGVkOworICB0aHJlYWQtPnNldFN0YXRlKHN0YXJ0ZWQpOworCiAgIHRocmVhZC0+cnVubmFibGUoKS0+cnVuKCk7Ci0gIGlmICh0aHJlYWQtPnN0YXRlXyAhPSBzdG9wcGluZyAmJiB0aHJlYWQtPnN0YXRlXyAhPSBzdG9wcGVkKSB7Ci0gICAgdGhyZWFkLT5zdGF0ZV8gPSBzdG9wcGluZzsKKworICBTVEFURSBfcyA9IHRocmVhZC0+Z2V0U3RhdGUoKTsKKyAgaWYgKF9zICE9IHN0b3BwaW5nICYmIF9zICE9IHN0b3BwZWQpIHsKKyAgICB0aHJlYWQtPnNldFN0YXRlKHN0b3BwaW5nKTsKICAgfQogCiAgIHJldHVybiAodm9pZCopMDsKIH0KIAogLyoqCi0gKiBQT1NJWCBUaHJlYWQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbgorICogQ29udmVydHMgZ2VuZXJpYyBwb3NpeCB0aHJlYWQgc2NoZWR1bGUgcG9saWN5IGVudW1zIGludG8gcHRocmVhZAorICogQVBJIHZhbHVlcy4KICAqLwotY2xhc3MgUG9zaXhUaHJlYWRGYWN0b3J5OjpJbXBsIHsKLQotcHJpdmF0ZToKLSAgUE9MSUNZIHBvbGljeV87Ci0gIFBSSU9SSVRZIHByaW9yaXR5XzsKLSAgaW50IHN0YWNrU2l6ZV87Ci0gIGJvb2wgZGV0YWNoZWRfOwotCi0gIC8qKgotICAgKiBDb252ZXJ0cyBnZW5lcmljIHBvc2l4IHRocmVhZCBzY2hlZHVsZSBwb2xpY3kgZW51bXMgaW50byBwdGhyZWFkCi0gICAqIEFQSSB2YWx1ZXMuCi0gICAqLwotICBzdGF0aWMgaW50IHRvUHRocmVhZFBvbGljeShQT0xJQ1kgcG9saWN5KSB7Ci0gICAgc3dpdGNoIChwb2xpY3kpIHsKLSAgICBjYXNlIE9USEVSOgotICAgICAgcmV0dXJuIFNDSEVEX09USEVSOwotICAgIGNhc2UgRklGTzoKLSAgICAgIHJldHVybiBTQ0hFRF9GSUZPOwotICAgIGNhc2UgUk9VTkRfUk9CSU46Ci0gICAgICByZXR1cm4gU0NIRURfUlI7Ci0gICAgfQorc3RhdGljIGludCB0b1B0aHJlYWRQb2xpY3koUG9zaXhUaHJlYWRGYWN0b3J5OjpQT0xJQ1kgcG9saWN5KSB7CisgIHN3aXRjaCAocG9saWN5KSB7CisgIGNhc2UgUG9zaXhUaHJlYWRGYWN0b3J5OjpPVEhFUjoKICAgICByZXR1cm4gU0NIRURfT1RIRVI7CisgIGNhc2UgUG9zaXhUaHJlYWRGYWN0b3J5OjpGSUZPOgorICAgIHJldHVybiBTQ0hFRF9GSUZPOworICBjYXNlIFBvc2l4VGhyZWFkRmFjdG9yeTo6Uk9VTkRfUk9CSU46CisgICAgcmV0dXJuIFNDSEVEX1JSOwogICB9CisgIHJldHVybiBTQ0hFRF9PVEhFUjsKK30KIAotICAvKioKLSAgICogQ29udmVydHMgcmVsYXRpdmUgdGhyZWFkIHByaW9yaXRpZXMgdG8gYWJzb2x1dGUgdmFsdWUgYmFzZWQgb24gcG9zaXgKLSAgICogdGhyZWFkIHNjaGVkdWxlciBwb2xpY3kKLSAgICoKLSAgICogIFRoZSBpZGVhIGlzIHNpbXBseSB0byBkaXZpZGUgdXAgdGhlIHByaW9yaXR5IHJhbmdlIGZvciB0aGUgZ2l2ZW4gcG9saWN5Ci0gICAqIGludG8gdGhlIGNvcnJlcHNvbmRpbmcgcmVsYXRpdmUgcHJpb3JpdHkgbGV2ZWwgKGxvd2VzdC4uaGlnaGVzdCkgYW5kCi0gICAqIHRoZW4gcHJvLXJhdGUgYWNjb3JkaW5nbHkuCi0gICAqLwotICBzdGF0aWMgaW50IHRvUHRocmVhZFByaW9yaXR5KFBPTElDWSBwb2xpY3ksIFBSSU9SSVRZIHByaW9yaXR5KSB7Ci0gICAgaW50IHB0aHJlYWRfcG9saWN5ID0gdG9QdGhyZWFkUG9saWN5KHBvbGljeSk7Ci0gICAgaW50IG1pbl9wcmlvcml0eSA9IDA7Ci0gICAgaW50IG1heF9wcmlvcml0eSA9IDA7CisvKioKKyAqIENvbnZlcnRzIHJlbGF0aXZlIHRocmVhZCBwcmlvcml0aWVzIHRvIGFic29sdXRlIHZhbHVlIGJhc2VkIG9uIHBvc2l4CisgKiB0aHJlYWQgc2NoZWR1bGVyIHBvbGljeQorICoKKyAqICBUaGUgaWRlYSBpcyBzaW1wbHkgdG8gZGl2aWRlIHVwIHRoZSBwcmlvcml0eSByYW5nZSBmb3IgdGhlIGdpdmVuIHBvbGljeQorICogaW50byB0aGUgY29ycmVwc29uZGluZyByZWxhdGl2ZSBwcmlvcml0eSBsZXZlbCAobG93ZXN0Li5oaWdoZXN0KSBhbmQKKyAqIHRoZW4gcHJvLXJhdGUgYWNjb3JkaW5nbHkuCisgKi8KK3N0YXRpYyBpbnQgdG9QdGhyZWFkUHJpb3JpdHkoUG9zaXhUaHJlYWRGYWN0b3J5OjpQT0xJQ1kgcG9saWN5LCBQb3NpeFRocmVhZEZhY3Rvcnk6OlBSSU9SSVRZIHByaW9yaXR5KSB7CisgIGludCBwdGhyZWFkX3BvbGljeSA9IHRvUHRocmVhZFBvbGljeShwb2xpY3kpOworICBpbnQgbWluX3ByaW9yaXR5ID0gMDsKKyAgaW50IG1heF9wcmlvcml0eSA9IDA7CiAjaWZkZWYgSEFWRV9TQ0hFRF9HRVRfUFJJT1JJVFlfTUlOCi0gICAgbWluX3ByaW9yaXR5ID0gc2NoZWRfZ2V0X3ByaW9yaXR5X21pbihwdGhyZWFkX3BvbGljeSk7CisgIG1pbl9wcmlvcml0eSA9IHNjaGVkX2dldF9wcmlvcml0eV9taW4ocHRocmVhZF9wb2xpY3kpOwogI2VuZGlmCiAjaWZkZWYgSEFWRV9TQ0hFRF9HRVRfUFJJT1JJVFlfTUFYCi0gICAgbWF4X3ByaW9yaXR5ID0gc2NoZWRfZ2V0X3ByaW9yaXR5X21heChwdGhyZWFkX3BvbGljeSk7CisgIG1heF9wcmlvcml0eSA9IHNjaGVkX2dldF9wcmlvcml0eV9tYXgocHRocmVhZF9wb2xpY3kpOwogI2VuZGlmCi0gICAgaW50IHF1YW50YSA9IChISUdIRVNUIC0gTE9XRVNUKSArIDE7Ci0gICAgZmxvYXQgc3RlcHNwZXJxdWFudGEgPSAoZmxvYXQpKG1heF9wcmlvcml0eSAtIG1pbl9wcmlvcml0eSkgLyBxdWFudGE7CisgIGludCBxdWFudGEgPSAoUG9zaXhUaHJlYWRGYWN0b3J5OjpISUdIRVNUIC0gUG9zaXhUaHJlYWRGYWN0b3J5OjpMT1dFU1QpICsgMTsKKyAgZmxvYXQgc3RlcHNwZXJxdWFudGEgPSAoZmxvYXQpKG1heF9wcmlvcml0eSAtIG1pbl9wcmlvcml0eSkgLyBxdWFudGE7CiAKLSAgICBpZiAocHJpb3JpdHkgPD0gSElHSEVTVCkgewotICAgICAgcmV0dXJuIChpbnQpKG1pbl9wcmlvcml0eSArIHN0ZXBzcGVycXVhbnRhICogcHJpb3JpdHkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUgZm9yIHByaW9yaXR5IGluY3JlbWVudHMuCi0gICAgICBhc3NlcnQoZmFsc2UpOwotICAgICAgcmV0dXJuIChpbnQpKG1pbl9wcmlvcml0eSArIHN0ZXBzcGVycXVhbnRhICogTk9STUFMKTsKLSAgICB9CisgIGlmIChwcmlvcml0eSA8PSBQb3NpeFRocmVhZEZhY3Rvcnk6OkhJR0hFU1QpIHsKKyAgICByZXR1cm4gKGludCkobWluX3ByaW9yaXR5ICsgc3RlcHNwZXJxdWFudGEgKiBwcmlvcml0eSk7CisgIH0gZWxzZSB7CisgICAgLy8gc2hvdWxkIG5ldmVyIGdldCBoZXJlIGZvciBwcmlvcml0eSBpbmNyZW1lbnRzLgorICAgIGFzc2VydChmYWxzZSk7CisgICAgcmV0dXJuIChpbnQpKG1pbl9wcmlvcml0eSArIHN0ZXBzcGVycXVhbnRhICogUG9zaXhUaHJlYWRGYWN0b3J5OjpOT1JNQUwpOwogICB9Ci0KLXB1YmxpYzoKLSAgSW1wbChQT0xJQ1kgcG9saWN5LCBQUklPUklUWSBwcmlvcml0eSwgaW50IHN0YWNrU2l6ZSwgYm9vbCBkZXRhY2hlZCkKLSAgICA6IHBvbGljeV8ocG9saWN5KSwgcHJpb3JpdHlfKHByaW9yaXR5KSwgc3RhY2tTaXplXyhzdGFja1NpemUpLCBkZXRhY2hlZF8oZGV0YWNoZWQpIHt9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgUE9TSVggdGhyZWFkIHRvIHJ1biB0aGUgcnVubmFibGUgb2JqZWN0Ci0gICAqCi0gICAqIEBwYXJhbSBydW5uYWJsZSBBIHJ1bm5hYmxlIG9iamVjdAotICAgKi8KLSAgc2hhcmVkX3B0cjxUaHJlYWQ+IG5ld1RocmVhZChzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSkgY29uc3QgewotICAgIHNoYXJlZF9wdHI8UHRocmVhZFRocmVhZD4gcmVzdWx0Ci0gICAgICAgID0gc2hhcmVkX3B0cjxQdGhyZWFkVGhyZWFkPihuZXcgUHRocmVhZFRocmVhZCh0b1B0aHJlYWRQb2xpY3kocG9saWN5XyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b1B0aHJlYWRQcmlvcml0eShwb2xpY3lfLCBwcmlvcml0eV8pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2tTaXplXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFjaGVkXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bm5hYmxlKSk7Ci0gICAgcmVzdWx0LT53ZWFrUmVmKHJlc3VsdCk7Ci0gICAgcnVubmFibGUtPnRocmVhZChyZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBpbnQgZ2V0U3RhY2tTaXplKCkgY29uc3QgeyByZXR1cm4gc3RhY2tTaXplXzsgfQotCi0gIHZvaWQgc2V0U3RhY2tTaXplKGludCB2YWx1ZSkgeyBzdGFja1NpemVfID0gdmFsdWU7IH0KLQotICBQUklPUklUWSBnZXRQcmlvcml0eSgpIGNvbnN0IHsgcmV0dXJuIHByaW9yaXR5XzsgfQotCi0gIC8qKgotICAgKiBTZXRzIHByaW9yaXR5LgotICAgKgotICAgKiAgWFhYCi0gICAqICBOZWVkIHRvIGhhbmRsZSBpbmNyZW1lbnRhbCBwcmlvcml0aWVzIHByb3Blcmx5LgotICAgKi8KLSAgdm9pZCBzZXRQcmlvcml0eShQUklPUklUWSB2YWx1ZSkgeyBwcmlvcml0eV8gPSB2YWx1ZTsgfQotCi0gIGJvb2wgaXNEZXRhY2hlZCgpIGNvbnN0IHsgcmV0dXJuIGRldGFjaGVkXzsgfQotCi0gIHZvaWQgc2V0RGV0YWNoZWQoYm9vbCB2YWx1ZSkgeyBkZXRhY2hlZF8gPSB2YWx1ZTsgfQotCi0gIFRocmVhZDo6aWRfdCBnZXRDdXJyZW50VGhyZWFkSWQoKSBjb25zdCB7Ci0KLSNpZm5kZWYgX1dJTjMyCi0gICAgcmV0dXJuIChUaHJlYWQ6OmlkX3QpcHRocmVhZF9zZWxmKCk7Ci0jZWxzZQotICAgIHJldHVybiAoVGhyZWFkOjppZF90KXB0aHJlYWRfc2VsZigpLnA7Ci0jZW5kaWYgLy8gX1dJTjMyCi0gIH0KLX07Cit9CiAKIFBvc2l4VGhyZWFkRmFjdG9yeTo6UG9zaXhUaHJlYWRGYWN0b3J5KFBPTElDWSBwb2xpY3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUklPUklUWSBwcmlvcml0eSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFja1NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRldGFjaGVkKQotICA6IGltcGxfKG5ldyBQb3NpeFRocmVhZEZhY3Rvcnk6OkltcGwocG9saWN5LCBwcmlvcml0eSwgc3RhY2tTaXplLCBkZXRhY2hlZCkpIHsKKyAgOiBUaHJlYWRGYWN0b3J5KGRldGFjaGVkKSwKKyAgICBwb2xpY3lfKHBvbGljeSksCisgICAgcHJpb3JpdHlfKHByaW9yaXR5KSwKKyAgICBzdGFja1NpemVfKHN0YWNrU2l6ZSkgewogfQogCi1zaGFyZWRfcHRyPFRocmVhZD4gUG9zaXhUaHJlYWRGYWN0b3J5OjpuZXdUaHJlYWQoc2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpIGNvbnN0IHsKLSAgcmV0dXJuIGltcGxfLT5uZXdUaHJlYWQocnVubmFibGUpOworUG9zaXhUaHJlYWRGYWN0b3J5OjpQb3NpeFRocmVhZEZhY3RvcnkoYm9vbCBkZXRhY2hlZCkKKyAgOiBUaHJlYWRGYWN0b3J5KGRldGFjaGVkKSwKKyAgICBwb2xpY3lfKFJPVU5EX1JPQklOKSwKKyAgICBwcmlvcml0eV8oTk9STUFMKSwKKyAgICBzdGFja1NpemVfKDEpIHsKK30KKworc3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gUG9zaXhUaHJlYWRGYWN0b3J5OjpuZXdUaHJlYWQoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSkgY29uc3QgeworICBzdGQ6OnNoYXJlZF9wdHI8UHRocmVhZFRocmVhZD4gcmVzdWx0CisgICAgICA9IHN0ZDo6c2hhcmVkX3B0cjxQdGhyZWFkVGhyZWFkPihuZXcgUHRocmVhZFRocmVhZCh0b1B0aHJlYWRQb2xpY3kocG9saWN5XyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9QdGhyZWFkUHJpb3JpdHkocG9saWN5XywgcHJpb3JpdHlfKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja1NpemVfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRGV0YWNoZWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5uYWJsZSkpOworICByZXN1bHQtPndlYWtSZWYocmVzdWx0KTsKKyAgcnVubmFibGUtPnRocmVhZChyZXN1bHQpOworICByZXR1cm4gcmVzdWx0OwogfQogCiBpbnQgUG9zaXhUaHJlYWRGYWN0b3J5OjpnZXRTdGFja1NpemUoKSBjb25zdCB7Ci0gIHJldHVybiBpbXBsXy0+Z2V0U3RhY2tTaXplKCk7CisgIHJldHVybiBzdGFja1NpemVfOwogfQogCiB2b2lkIFBvc2l4VGhyZWFkRmFjdG9yeTo6c2V0U3RhY2tTaXplKGludCB2YWx1ZSkgewotICBpbXBsXy0+c2V0U3RhY2tTaXplKHZhbHVlKTsKKyAgc3RhY2tTaXplXyA9IHZhbHVlOwogfQogCiBQb3NpeFRocmVhZEZhY3Rvcnk6OlBSSU9SSVRZIFBvc2l4VGhyZWFkRmFjdG9yeTo6Z2V0UHJpb3JpdHkoKSBjb25zdCB7Ci0gIHJldHVybiBpbXBsXy0+Z2V0UHJpb3JpdHkoKTsKKyAgcmV0dXJuIHByaW9yaXR5XzsKIH0KIAotdm9pZCBQb3NpeFRocmVhZEZhY3Rvcnk6OnNldFByaW9yaXR5KFBvc2l4VGhyZWFkRmFjdG9yeTo6UFJJT1JJVFkgdmFsdWUpIHsKLSAgaW1wbF8tPnNldFByaW9yaXR5KHZhbHVlKTsKLX0KLQotYm9vbCBQb3NpeFRocmVhZEZhY3Rvcnk6OmlzRGV0YWNoZWQoKSBjb25zdCB7Ci0gIHJldHVybiBpbXBsXy0+aXNEZXRhY2hlZCgpOwotfQotCi12b2lkIFBvc2l4VGhyZWFkRmFjdG9yeTo6c2V0RGV0YWNoZWQoYm9vbCB2YWx1ZSkgewotICBpbXBsXy0+c2V0RGV0YWNoZWQodmFsdWUpOwordm9pZCBQb3NpeFRocmVhZEZhY3Rvcnk6OnNldFByaW9yaXR5KFBSSU9SSVRZIHZhbHVlKSB7CisgIHByaW9yaXR5XyA9IHZhbHVlOwogfQogCiBUaHJlYWQ6OmlkX3QgUG9zaXhUaHJlYWRGYWN0b3J5OjpnZXRDdXJyZW50VGhyZWFkSWQoKSBjb25zdCB7Ci0gIHJldHVybiBpbXBsXy0+Z2V0Q3VycmVudFRocmVhZElkKCk7CisjaWZuZGVmIF9XSU4zMgorICByZXR1cm4gKFRocmVhZDo6aWRfdClwdGhyZWFkX3NlbGYoKTsKKyNlbHNlCisgIHJldHVybiAoVGhyZWFkOjppZF90KXB0aHJlYWRfc2VsZigpLnA7CisjZW5kaWYgLy8gX1dJTjMyCiB9CisKIH0KIH0KIH0gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5LmggYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5LmgKaW5kZXggYjI2ZDI5Ni4uY2IzYjE3YyAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1Bvc2l4VGhyZWFkRmFjdG9yeS5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuaApAQCAtMjIsNyArMjIsNyBAQAogCiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZC5oPgogCi0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+CisjaW5jbHVkZSA8bWVtb3J5PgogCiBuYW1lc3BhY2UgYXBhY2hlIHsKIG5hbWVzcGFjZSB0aHJpZnQgewpAQCAtNjMsOSArNjMsOSBAQAogCiAgIC8qKgogICAgKiBQb3NpeCB0aHJlYWQgKHB0aHJlYWQpIGZhY3RvcnkuICBBbGwgdGhyZWFkcyBjcmVhdGVkIGJ5IGEgZmFjdG9yeSBhcmUgcmVmZXJlbmNlLWNvdW50ZWQKLSAgICogdmlhIGJvb3N0OjpzaGFyZWRfcHRyIGFuZCBib29zdDo6d2Vha19wdHIuICBUaGUgZmFjdG9yeSBndWFyYW50ZWVzIHRoYXQgdGhyZWFkcyBhbmQKLSAgICogdGhlIFJ1bm5hYmxlIHRhc2tzIHRoZXkgaG9zdCB3aWxsIGJlIHByb3Blcmx5IGNsZWFuZWQgdXAgb25jZSB0aGUgbGFzdCBzdHJvbmcgcmVmZXJlbmNlCi0gICAqIHRvIGJvdGggaXMgZ2l2ZW4gdXAuCisgICAqIHZpYSBzdGQ6OnNoYXJlZF9wdHIuICBUaGUgZmFjdG9yeSBndWFyYW50ZWVzIHRoYXQgdGhyZWFkcyBhbmQgdGhlIFJ1bm5hYmxlIHRhc2tzIAorICAgKiB0aGV5IGhvc3Qgd2lsbCBiZSBwcm9wZXJseSBjbGVhbmVkIHVwIG9uY2UgdGhlIGxhc3Qgc3Ryb25nIHJlZmVyZW5jZSB0byBib3RoIGlzCisgICAqIGdpdmVuIHVwLgogICAgKgogICAgKiBUaHJlYWRzIGFyZSBjcmVhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBwb2xpY3ksIHByaW9yaXR5LCBzdGFjay1zaXplIGFuZCBkZXRhY2hhYmxlLW1vZGUKICAgICogZGV0YWNoZWQgbWVhbnMgdGhlIHRocmVhZCBpcyBmcmVlLXJ1bm5pbmcgYW5kIHdpbGwgcmVsZWFzZSBhbGwgc3lzdGVtIHJlc291cmNlcyB0aGUKQEAgLTc0LDI3ICs3NCwzNCBAQAogICAgKgogICAgKiBCeSBkZWZhdWx0IHRocmVhZHMgYXJlIG5vdCBqb2luYWJsZS4KICAgICovCi0KICAgUG9zaXhUaHJlYWRGYWN0b3J5KFBPTElDWSBwb2xpY3kgPSBST1VORF9ST0JJTiwKICAgICAgICAgICAgICAgICAgICAgIFBSSU9SSVRZIHByaW9yaXR5ID0gTk9STUFMLAogICAgICAgICAgICAgICAgICAgICAgaW50IHN0YWNrU2l6ZSA9IDEsCiAgICAgICAgICAgICAgICAgICAgICBib29sIGRldGFjaGVkID0gdHJ1ZSk7CiAKKyAgLyoqCisgICAqIFByb3ZpZGUgYSBjb25zdHJ1Y3RvciBjb21wYXRpYmxlIHdpdGggdGhlIG90aGVyIGZhY3RvcmllcworICAgKiBUaGUgZGVmYXVsdCBwb2xpY3kgaXMgUE9MSUNZOjpST1VORF9ST0JJTi4KKyAgICogVGhlIGRlZmF1bHQgcHJpb3JpdHkgaXMgUFJJT1JJVFk6Ok5PUk1BTC4KKyAgICogVGhlIGRlZmF1bHQgc3RhY2tTaXplIGlzIDEuCisgICAqLworICBQb3NpeFRocmVhZEZhY3RvcnkoYm9vbCBkZXRhY2hlZCk7CisKICAgLy8gRnJvbSBUaHJlYWRGYWN0b3J5OwotICBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWQ+IG5ld1RocmVhZChib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpIGNvbnN0OworICBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPiBuZXdUaHJlYWQoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSkgY29uc3Q7CiAKICAgLy8gRnJvbSBUaHJlYWRGYWN0b3J5OwogICBUaHJlYWQ6OmlkX3QgZ2V0Q3VycmVudFRocmVhZElkKCkgY29uc3Q7CiAKICAgLyoqCi0gICAqIEdldHMgc3RhY2sgc2l6ZSBmb3IgY3JlYXRlZCB0aHJlYWRzCisgICAqIEdldHMgc3RhY2sgc2l6ZSBmb3IgbmV3bHkgY3JlYXRlZCB0aHJlYWRzCiAgICAqCiAgICAqIEByZXR1cm4gaW50IHNpemUgaW4gbWVnYWJ5dGVzCiAgICAqLwogICB2aXJ0dWFsIGludCBnZXRTdGFja1NpemUoKSBjb25zdDsKIAogICAvKioKLSAgICogU2V0cyBzdGFjayBzaXplIGZvciBjcmVhdGVkIHRocmVhZHMKKyAgICogU2V0cyBzdGFjayBzaXplIGZvciBuZXdseSBjcmVhdGVkIHRocmVhZHMKICAgICoKICAgICogQHBhcmFtIHZhbHVlIHNpemUgaW4gbWVnYWJ5dGVzCiAgICAqLwpAQCAtMTEwLDE5ICsxMTcsMTAgQEAKICAgICovCiAgIHZpcnR1YWwgdm9pZCBzZXRQcmlvcml0eShQUklPUklUWSBwcmlvcml0eSk7CiAKLSAgLyoqCi0gICAqIFNldHMgZGV0YWNoZWQgbW9kZSBvZiB0aHJlYWRzCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgc2V0RGV0YWNoZWQoYm9vbCBkZXRhY2hlZCk7Ci0KLSAgLyoqCi0gICAqIEdldHMgY3VycmVudCBkZXRhY2hlZCBtb2RlCi0gICAqLwotICB2aXJ0dWFsIGJvb2wgaXNEZXRhY2hlZCgpIGNvbnN0OwotCiBwcml2YXRlOgotICBjbGFzcyBJbXBsOwotICBib29zdDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsXzsKKyAgUE9MSUNZIHBvbGljeV87CisgIFBSSU9SSVRZIHByaW9yaXR5XzsKKyAgaW50IHN0YWNrU2l6ZV87CiB9OwogfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1N0ZE11dGV4LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TdGRNdXRleC5jcHAKaW5kZXggNjk2NzhhMi4uZTBmNzlmYSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1N0ZE11dGV4LmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvU3RkTXV0ZXguY3BwCkBAIC0zMywxMSArMzMsMTQgQEAKIC8qKgogICogSW1wbGVtZW50YXRpb24gb2YgTXV0ZXggY2xhc3MgdXNpbmcgQysrMTEgc3RkOjp0aW1lZF9tdXRleAogICoKKyAqIE1ldGhvZHMgdGhyb3cgc3RkOjpzeXN0ZW1fZXJyb3Igb24gZXJyb3IuCisgKgogICogQHZlcnNpb24gJElkOiQKICAqLwogY2xhc3MgTXV0ZXg6OmltcGwgOiBwdWJsaWMgc3RkOjp0aW1lZF9tdXRleCB7fTsKIAogTXV0ZXg6Ok11dGV4KEluaXRpYWxpemVyIGluaXQpIDogaW1wbF8obmV3IE11dGV4OjppbXBsKCkpIHsKKyAgKCh2b2lkKWluaXQpOwogfQogCiB2b2lkKiBNdXRleDo6Z2V0VW5kZXJseWluZ0ltcGwoKSBjb25zdCB7CkBAIC02MSw2ICs2NCw3IEBACiB9CiAKIHZvaWQgTXV0ZXg6OkRFRkFVTFRfSU5JVElBTElaRVIodm9pZCogYXJnKSB7CisgICgodm9pZClhcmcpOwogfQogfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1N0ZFRocmVhZEZhY3RvcnkuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1N0ZFRocmVhZEZhY3RvcnkuY3BwCmluZGV4IGQ1N2U3ZWMuLmM4ODVmM2EgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TdGRUaHJlYWRGYWN0b3J5LmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvU3RkVGhyZWFkRmFjdG9yeS5jcHAKQEAgLTIxLDEzICsyMSwxMiBAQAogCiAjaWYgVVNFX1NURF9USFJFQUQKIAotI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9TdGRUaHJlYWRGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L0V4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1N0ZFRocmVhZEZhY3RvcnkuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAKICNpbmNsdWRlIDxjYXNzZXJ0PgotCi0jaW5jbHVkZSA8Ym9vc3QvZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMuaHBwPgotI2luY2x1ZGUgPGJvb3N0L3dlYWtfcHRyLmhwcD4KICNpbmNsdWRlIDx0aHJlYWQ+CiAKIG5hbWVzcGFjZSBhcGFjaGUgewpAQCAtNDMsMjUgKzQyLDI2IEBACiAgKgogICogQHZlcnNpb24gJElkOiQKICAqLwotY2xhc3MgU3RkVGhyZWFkIDogcHVibGljIFRocmVhZCwgcHVibGljIGJvb3N0OjplbmFibGVfc2hhcmVkX2Zyb21fdGhpczxTdGRUaHJlYWQ+IHsKK2NsYXNzIFN0ZFRocmVhZCA6IHB1YmxpYyBUaHJlYWQsIHB1YmxpYyBzdGQ6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPFN0ZFRocmVhZD4gewogcHVibGljOgogICBlbnVtIFNUQVRFIHsgdW5pbml0aWFsaXplZCwgc3RhcnRpbmcsIHN0YXJ0ZWQsIHN0b3BwaW5nLCBzdG9wcGVkIH07CiAKLSAgc3RhdGljIHZvaWQgdGhyZWFkTWFpbihib29zdDo6c2hhcmVkX3B0cjxTdGRUaHJlYWQ+IHRocmVhZCk7CisgIHN0YXRpYyB2b2lkIHRocmVhZE1haW4oc3RkOjpzaGFyZWRfcHRyPFN0ZFRocmVhZD4gdGhyZWFkKTsKIAogcHJpdmF0ZToKICAgc3RkOjp1bmlxdWVfcHRyPHN0ZDo6dGhyZWFkPiB0aHJlYWRfOworICBNb25pdG9yIG1vbml0b3JfOwogICBTVEFURSBzdGF0ZV87CiAgIGJvb2wgZGV0YWNoZWRfOwogCiBwdWJsaWM6Ci0gIFN0ZFRocmVhZChib29sIGRldGFjaGVkLCBib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpCisgIFN0ZFRocmVhZChib29sIGRldGFjaGVkLCBzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKQogICAgIDogc3RhdGVfKHVuaW5pdGlhbGl6ZWQpLCBkZXRhY2hlZF8oZGV0YWNoZWQpIHsKICAgICB0aGlzLT5UaHJlYWQ6OnJ1bm5hYmxlKHJ1bm5hYmxlKTsKICAgfQogCiAgIH5TdGRUaHJlYWQoKSB7Ci0gICAgaWYgKCFkZXRhY2hlZF8pIHsKKyAgICBpZiAoIWRldGFjaGVkXyAmJiB0aHJlYWRfLT5qb2luYWJsZSgpKSB7CiAgICAgICB0cnkgewogICAgICAgICBqb2luKCk7CiAgICAgICB9IGNhdGNoICguLi4pIHsKQEAgLTcwLDE4ICs3MCw0MiBAQAogICAgIH0KICAgfQogCisgIFNUQVRFIGdldFN0YXRlKCkgY29uc3QKKyAgeworICAgIFN5bmNocm9uaXplZCBzeW5jKG1vbml0b3JfKTsKKyAgICByZXR1cm4gc3RhdGVfOworICB9CisKKyAgdm9pZCBzZXRTdGF0ZShTVEFURSBuZXdTdGF0ZSkKKyAgeworICAgIFN5bmNocm9uaXplZCBzeW5jKG1vbml0b3JfKTsKKyAgICBzdGF0ZV8gPSBuZXdTdGF0ZTsKKworICAgIC8vIHVuYmxvY2sgc3RhcnQoKSB3aXRoIHRoZSBrbm93bGVkZ2UgdGhhdCB0aGUgdGhyZWFkIGhhcyBhY3R1YWxseQorICAgIC8vIHN0YXJ0ZWQgcnVubmluZywgd2hpY2ggYXZvaWRzIGEgcmFjZSBpbiBkZXRhY2hlZCB0aHJlYWRzLgorICAgIGlmIChuZXdTdGF0ZSA9PSBzdGFydGVkKSB7CisJICBtb25pdG9yXy5ub3RpZnkoKTsKKyAgICB9CisgIH0KKwogICB2b2lkIHN0YXJ0KCkgewotICAgIGlmIChzdGF0ZV8gIT0gdW5pbml0aWFsaXplZCkgeworICAgIGlmIChnZXRTdGF0ZSgpICE9IHVuaW5pdGlhbGl6ZWQpIHsKICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBib29zdDo6c2hhcmVkX3B0cjxTdGRUaHJlYWQ+IHNlbGZSZWYgPSBzaGFyZWRfZnJvbV90aGlzKCk7Ci0gICAgc3RhdGVfID0gc3RhcnRpbmc7CisgICAgc3RkOjpzaGFyZWRfcHRyPFN0ZFRocmVhZD4gc2VsZlJlZiA9IHNoYXJlZF9mcm9tX3RoaXMoKTsKKyAgICBzZXRTdGF0ZShzdGFydGluZyk7CiAKKyAgICBTeW5jaHJvbml6ZWQgc3luYyhtb25pdG9yXyk7CiAgICAgdGhyZWFkXyA9IHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnRocmVhZD4obmV3IHN0ZDo6dGhyZWFkKHRocmVhZE1haW4sIHNlbGZSZWYpKTsKIAogICAgIGlmIChkZXRhY2hlZF8pCiAgICAgICB0aHJlYWRfLT5kZXRhY2goKTsKKyAgICAKKyAgICAvLyBXYWl0IGZvciB0aGUgdGhyZWFkIHRvIHN0YXJ0IGFuZCBnZXQgZmFyIGVub3VnaCB0byBncmFiIGV2ZXJ5dGhpbmcKKyAgICAvLyB0aGF0IGl0IG5lZWRzIGZyb20gdGhlIGNhbGxpbmcgY29udGV4dCwgdGh1cyBhYnNvbHZpbmcgdGhlIGNhbGxlcgorICAgIC8vIGZyb20gYmVpbmcgcmVxdWlyZWQgdG8gaG9sZCBvbiB0byBydW5uYWJsZSBpbmRlZmluaXRlbHkuCisgICAgbW9uaXRvcl8ud2FpdCgpOwogICB9CiAKICAgdm9pZCBqb2luKCkgewpAQCAtOTIsNzcgKzExNiwzNSBAQAogCiAgIFRocmVhZDo6aWRfdCBnZXRJZCgpIHsgcmV0dXJuIHRocmVhZF8uZ2V0KCkgPyB0aHJlYWRfLT5nZXRfaWQoKSA6IHN0ZDo6dGhyZWFkOjppZCgpOyB9CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKCkgY29uc3QgeyByZXR1cm4gVGhyZWFkOjpydW5uYWJsZSgpOyB9CisgIHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUoKSBjb25zdCB7IHJldHVybiBUaHJlYWQ6OnJ1bm5hYmxlKCk7IH0KIAotICB2b2lkIHJ1bm5hYmxlKGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB2YWx1ZSkgeyBUaHJlYWQ6OnJ1bm5hYmxlKHZhbHVlKTsgfQorICB2b2lkIHJ1bm5hYmxlKHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdmFsdWUpIHsgVGhyZWFkOjpydW5uYWJsZSh2YWx1ZSk7IH0KIH07CiAKLXZvaWQgU3RkVGhyZWFkOjp0aHJlYWRNYWluKGJvb3N0OjpzaGFyZWRfcHRyPFN0ZFRocmVhZD4gdGhyZWFkKSB7Ci0gIGlmICh0aHJlYWQgPT0gTlVMTCkgewotICAgIHJldHVybjsKLSAgfQordm9pZCBTdGRUaHJlYWQ6OnRocmVhZE1haW4oc3RkOjpzaGFyZWRfcHRyPFN0ZFRocmVhZD4gdGhyZWFkKSB7CisjaWYgR09PR0xFX1BFUkZUT09MU19SRUdJU1RFUl9USFJFQUQKKyAgUHJvZmlsZXJSZWdpc3RlclRocmVhZCgpOworI2VuZGlmCiAKLSAgaWYgKHRocmVhZC0+c3RhdGVfICE9IHN0YXJ0aW5nKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdGhyZWFkLT5zdGF0ZV8gPSBzdGFydGVkOworICB0aHJlYWQtPnNldFN0YXRlKHN0YXJ0ZWQpOwogICB0aHJlYWQtPnJ1bm5hYmxlKCktPnJ1bigpOwogCi0gIGlmICh0aHJlYWQtPnN0YXRlXyAhPSBzdG9wcGluZyAmJiB0aHJlYWQtPnN0YXRlXyAhPSBzdG9wcGVkKSB7Ci0gICAgdGhyZWFkLT5zdGF0ZV8gPSBzdG9wcGluZzsKKyAgaWYgKHRocmVhZC0+Z2V0U3RhdGUoKSAhPSBzdG9wcGluZyAmJiB0aHJlYWQtPmdldFN0YXRlKCkgIT0gc3RvcHBlZCkgeworICAgIHRocmVhZC0+c2V0U3RhdGUoc3RvcHBpbmcpOwogICB9Ci0KLSAgcmV0dXJuOwogfQogCi0vKioKLSAqIHN0ZDo6dGhyZWFkIGZhY3RvcnkgaW1wbGVtZW50YXRpb24KLSAqLwotY2xhc3MgU3RkVGhyZWFkRmFjdG9yeTo6SW1wbCB7Ci0KLXByaXZhdGU6Ci0gIGJvb2wgZGV0YWNoZWRfOwotCi1wdWJsaWM6Ci0gIEltcGwoYm9vbCBkZXRhY2hlZCkgOiBkZXRhY2hlZF8oZGV0YWNoZWQpIHt9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgc3RkOjp0aHJlYWQgdG8gcnVuIHRoZSBydW5uYWJsZSBvYmplY3QKLSAgICoKLSAgICogQHBhcmFtIHJ1bm5hYmxlIEEgcnVubmFibGUgb2JqZWN0Ci0gICAqLwotICBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWQ+IG5ld1RocmVhZChib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpIGNvbnN0IHsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxTdGRUaHJlYWQ+IHJlc3VsdAotICAgICAgICA9IGJvb3N0OjpzaGFyZWRfcHRyPFN0ZFRocmVhZD4obmV3IFN0ZFRocmVhZChkZXRhY2hlZF8sIHJ1bm5hYmxlKSk7Ci0gICAgcnVubmFibGUtPnRocmVhZChyZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBib29sIGlzRGV0YWNoZWQoKSBjb25zdCB7IHJldHVybiBkZXRhY2hlZF87IH0KLQotICB2b2lkIHNldERldGFjaGVkKGJvb2wgdmFsdWUpIHsgZGV0YWNoZWRfID0gdmFsdWU7IH0KLQotICBUaHJlYWQ6OmlkX3QgZ2V0Q3VycmVudFRocmVhZElkKCkgY29uc3QgeyByZXR1cm4gc3RkOjp0aGlzX3RocmVhZDo6Z2V0X2lkKCk7IH0KLX07Ci0KLVN0ZFRocmVhZEZhY3Rvcnk6OlN0ZFRocmVhZEZhY3RvcnkoYm9vbCBkZXRhY2hlZCkgOiBpbXBsXyhuZXcgU3RkVGhyZWFkRmFjdG9yeTo6SW1wbChkZXRhY2hlZCkpIHsKK1N0ZFRocmVhZEZhY3Rvcnk6OlN0ZFRocmVhZEZhY3RvcnkoYm9vbCBkZXRhY2hlZCkgOiBUaHJlYWRGYWN0b3J5KGRldGFjaGVkKSB7CiB9CiAKLWJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZD4gU3RkVGhyZWFkRmFjdG9yeTo6bmV3VGhyZWFkKGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSkgY29uc3QgewotICByZXR1cm4gaW1wbF8tPm5ld1RocmVhZChydW5uYWJsZSk7Ci19Ci0KLWJvb2wgU3RkVGhyZWFkRmFjdG9yeTo6aXNEZXRhY2hlZCgpIGNvbnN0IHsKLSAgcmV0dXJuIGltcGxfLT5pc0RldGFjaGVkKCk7Ci19Ci0KLXZvaWQgU3RkVGhyZWFkRmFjdG9yeTo6c2V0RGV0YWNoZWQoYm9vbCB2YWx1ZSkgewotICBpbXBsXy0+c2V0RGV0YWNoZWQodmFsdWUpOworc3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gU3RkVGhyZWFkRmFjdG9yeTo6bmV3VGhyZWFkKHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpIGNvbnN0IHsKKyAgc3RkOjpzaGFyZWRfcHRyPFN0ZFRocmVhZD4gcmVzdWx0ID0gc3RkOjpzaGFyZWRfcHRyPFN0ZFRocmVhZD4obmV3IFN0ZFRocmVhZChpc0RldGFjaGVkKCksIHJ1bm5hYmxlKSk7CisgIHJ1bm5hYmxlLT50aHJlYWQocmVzdWx0KTsKKyAgcmV0dXJuIHJlc3VsdDsKIH0KIAogVGhyZWFkOjppZF90IFN0ZFRocmVhZEZhY3Rvcnk6OmdldEN1cnJlbnRUaHJlYWRJZCgpIGNvbnN0IHsKLSAgcmV0dXJuIGltcGxfLT5nZXRDdXJyZW50VGhyZWFkSWQoKTsKKyAgcmV0dXJuIHN0ZDo6dGhpc190aHJlYWQ6OmdldF9pZCgpOwogfQogfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1N0ZFRocmVhZEZhY3RvcnkuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TdGRUaHJlYWRGYWN0b3J5LmgKaW5kZXggZmI4NmJiZi4uZTc0MDQ2YiAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1N0ZFRocmVhZEZhY3RvcnkuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvU3RkVGhyZWFkRmFjdG9yeS5oCkBAIC0yMiw3ICsyMiw3IEBACiAKICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkLmg+CiAKLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAKIG5hbWVzcGFjZSBhcGFjaGUgewogbmFtZXNwYWNlIHRocmlmdCB7CkBAIC0zOCw4ICszOCw4IEBACiBwdWJsaWM6CiAgIC8qKgogICAgKiBTdGQgdGhyZWFkIGZhY3RvcnkuICBBbGwgdGhyZWFkcyBjcmVhdGVkIGJ5IGEgZmFjdG9yeSBhcmUgcmVmZXJlbmNlLWNvdW50ZWQKLSAgICogdmlhIGJvb3N0OjpzaGFyZWRfcHRyIGFuZCBib29zdDo6d2Vha19wdHIuICBUaGUgZmFjdG9yeSBndWFyYW50ZWVzIHRoYXQgdGhyZWFkcyBhbmQKLSAgICogdGhlIFJ1bm5hYmxlIHRhc2tzIHRoZXkgaG9zdCB3aWxsIGJlIHByb3Blcmx5IGNsZWFuZWQgdXAgb25jZSB0aGUgbGFzdCBzdHJvbmcgcmVmZXJlbmNlCisgICAqIHZpYSBzdGQ6OnNoYXJlZF9wdHIuICBUaGUgZmFjdG9yeSBndWFyYW50ZWVzIHRoYXQgdGhyZWFkcyBhbmQgdGhlIFJ1bm5hYmxlIHRhc2tzCisgICAqIHRoZXkgaG9zdCB3aWxsIGJlIHByb3Blcmx5IGNsZWFuZWQgdXAgb25jZSB0aGUgbGFzdCBzdHJvbmcgcmVmZXJlbmNlCiAgICAqIHRvIGJvdGggaXMgZ2l2ZW4gdXAuCiAgICAqCiAgICAqIEJ5IGRlZmF1bHQgdGhyZWFkcyBhcmUgbm90IGpvaW5hYmxlLgpAQCAtNDgsMjUgKzQ4LDEyIEBACiAgIFN0ZFRocmVhZEZhY3RvcnkoYm9vbCBkZXRhY2hlZCA9IHRydWUpOwogCiAgIC8vIEZyb20gVGhyZWFkRmFjdG9yeTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkPiBuZXdUaHJlYWQoYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKSBjb25zdDsKKyAgc3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gbmV3VGhyZWFkKHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpIGNvbnN0OwogCiAgIC8vIEZyb20gVGhyZWFkRmFjdG9yeTsKICAgVGhyZWFkOjppZF90IGdldEN1cnJlbnRUaHJlYWRJZCgpIGNvbnN0OwotCi0gIC8qKgotICAgKiBTZXRzIGRldGFjaGVkIG1vZGUgb2YgdGhyZWFkcwotICAgKi8KLSAgdmlydHVhbCB2b2lkIHNldERldGFjaGVkKGJvb2wgZGV0YWNoZWQpOwotCi0gIC8qKgotICAgKiBHZXRzIGN1cnJlbnQgZGV0YWNoZWQgbW9kZQotICAgKi8KLSAgdmlydHVhbCBib29sIGlzRGV0YWNoZWQoKSBjb25zdDsKLQotcHJpdmF0ZToKLSAgY2xhc3MgSW1wbDsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbF87CiB9OworCiB9CiB9CiB9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZC5oCmluZGV4IGY1ZWIzYTguLmIyZWE0ZTIgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaHJlYWQuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkLmgKQEAgLTIxLDE0ICsyMSwxMSBAQAogI2RlZmluZSBfVEhSSUZUX0NPTkNVUlJFTkNZX1RIUkVBRF9IXyAxCiAKICNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLSNpbmNsdWRlIDxib29zdC93ZWFrX3B0ci5ocHA+CisjaW5jbHVkZSA8bWVtb3J5PgogCiAjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KIAotI2lmIFVTRV9CT09TVF9USFJFQUQKLSNpbmNsdWRlIDxib29zdC90aHJlYWQuaHBwPgotI2VsaWYgVVNFX1NURF9USFJFQUQKKyNpZiBVU0VfU1REX1RIUkVBRAogI2luY2x1ZGUgPHRocmVhZD4KICNlbHNlCiAjaWZkZWYgSEFWRV9QVEhSRUFEX0gKQEAgLTU3LDE2ICs1NCwxNiBAQAogICAgKiBHZXRzIHRoZSB0aHJlYWQgb2JqZWN0IHRoYXQgaXMgaG9zdGluZyB0aGlzIHJ1bm5hYmxlIG9iamVjdCAgLSBjYW4gcmV0dXJuCiAgICAqIGFuIGVtcHR5IGJvb3N0OjpzaGFyZWQgcG9pbnRlciBpZiBubyByZWZlcmVuY2VzIHJlbWFpbiBvbiB0aGF0IHRocmVhZCBvYmplY3QKICAgICovCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkPiB0aHJlYWQoKSB7IHJldHVybiB0aHJlYWRfLmxvY2soKTsgfQorICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+IHRocmVhZCgpIHsgcmV0dXJuIHRocmVhZF8ubG9jaygpOyB9CiAKICAgLyoqCiAgICAqIFNldHMgdGhlIHRocmVhZCB0aGF0IGlzIGV4ZWN1dGluZyB0aGlzIG9iamVjdC4gIFRoaXMgaXMgb25seSBtZWFudCBmb3IKICAgICogdXNlIGJ5IGNvbmNyZXRlIGltcGxlbWVudGF0aW9ucyBvZiBUaHJlYWQuCiAgICAqLwotICB2aXJ0dWFsIHZvaWQgdGhyZWFkKGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZD4gdmFsdWUpIHsgdGhyZWFkXyA9IHZhbHVlOyB9CisgIHZpcnR1YWwgdm9pZCB0aHJlYWQoc3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gdmFsdWUpIHsgdGhyZWFkXyA9IHZhbHVlOyB9CiAKIHByaXZhdGU6Ci0gIGJvb3N0Ojp3ZWFrX3B0cjxUaHJlYWQ+IHRocmVhZF87CisgIHN0ZDo6d2Vha19wdHI8VGhyZWFkPiB0aHJlYWRfOwogfTsKIAogLyoqCkBAIC04MSwxMiArNzgsNyBAQAogY2xhc3MgVGhyZWFkIHsKIAogcHVibGljOgotI2lmIFVTRV9CT09TVF9USFJFQUQKLSAgdHlwZWRlZiBib29zdDo6dGhyZWFkOjppZCBpZF90OwotCi0gIHN0YXRpYyBpbmxpbmUgYm9vbCBpc19jdXJyZW50KGlkX3QgdCkgeyByZXR1cm4gdCA9PSBib29zdDo6dGhpc190aHJlYWQ6OmdldF9pZCgpOyB9Ci0gIHN0YXRpYyBpbmxpbmUgaWRfdCBnZXRfY3VycmVudCgpIHsgcmV0dXJuIGJvb3N0Ojp0aGlzX3RocmVhZDo6Z2V0X2lkKCk7IH0KLSNlbGlmIFVTRV9TVERfVEhSRUFECisjaWYgVVNFX1NURF9USFJFQUQKICAgdHlwZWRlZiBzdGQ6OnRocmVhZDo6aWQgaWRfdDsKIAogICBzdGF0aWMgaW5saW5lIGJvb2wgaXNfY3VycmVudChpZF90IHQpIHsgcmV0dXJuIHQgPT0gc3RkOjp0aGlzX3RocmVhZDo6Z2V0X2lkKCk7IH0KQEAgLTEwOCw4ICsxMDAsOSBAQAogICB2aXJ0dWFsIHZvaWQgc3RhcnQoKSA9IDA7CiAKICAgLyoqCi0gICAqIEpvaW4gdGhpcyB0aHJlYWQuIEN1cnJlbnQgdGhyZWFkIGJsb2NrcyB1bnRpbCB0aGlzIHRhcmdldCB0aHJlYWQKLSAgICogY29tcGxldGVzLgorICAgKiBKb2luIHRoaXMgdGhyZWFkLiBJZiB0aGlzIHRocmVhZCBpcyBqb2luYWJsZSwgdGhlIGNhbGxpbmcgdGhyZWFkIGJsb2NrcworICAgKiB1bnRpbCB0aGlzIHRocmVhZCBjb21wbGV0ZXMuICBJZiB0aGUgdGFyZ2V0IHRocmVhZCBpcyBub3Qgam9pbmFibGUsIHRoZW4KKyAgICogbm90aGluZyBoYXBwZW5zLgogICAgKi8KICAgdmlydHVhbCB2b2lkIGpvaW4oKSA9IDA7CiAKQEAgLTEyMSwxMyArMTE0LDEzIEBACiAgIC8qKgogICAgKiBHZXRzIHRoZSBydW5uYWJsZSBvYmplY3QgdGhpcyB0aHJlYWQgaXMgaG9zdGluZwogICAgKi8KLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUoKSBjb25zdCB7IHJldHVybiBfcnVubmFibGU7IH0KKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKCkgY29uc3QgeyByZXR1cm4gX3J1bm5hYmxlOyB9CiAKIHByb3RlY3RlZDoKLSAgdmlydHVhbCB2b2lkIHJ1bm5hYmxlKGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB2YWx1ZSkgeyBfcnVubmFibGUgPSB2YWx1ZTsgfQorICB2aXJ0dWFsIHZvaWQgcnVubmFibGUoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB2YWx1ZSkgeyBfcnVubmFibGUgPSB2YWx1ZTsgfQogCiBwcml2YXRlOgotICBib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gX3J1bm5hYmxlOworICBzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IF9ydW5uYWJsZTsKIH07CiAKIC8qKgpAQCAtMTM1LDE4ICsxMjgsNDEgQEAKICAqIG9iamVjdCBmb3IgZXhlY3V0aW9uCiAgKi8KIGNsYXNzIFRocmVhZEZhY3RvcnkgeworcHJvdGVjdGVkOgorICBUaHJlYWRGYWN0b3J5KGJvb2wgZGV0YWNoZWQpIDogZGV0YWNoZWRfKGRldGFjaGVkKSB7IH0KIAogcHVibGljOgotICB2aXJ0dWFsIH5UaHJlYWRGYWN0b3J5KCkge30KLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWQ+IG5ld1RocmVhZChib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB+VGhyZWFkRmFjdG9yeSgpIHsgfQogCi0gIC8qKiBHZXRzIHRoZSBjdXJyZW50IHRocmVhZCBpZCBvciB1bmtub3duX3RocmVhZF9pZCBpZiB0aGUgY3VycmVudCB0aHJlYWQgaXMgbm90IGEgdGhyaWZ0IHRocmVhZAorICAvKioKKyAgICogR2V0cyBjdXJyZW50IGRldGFjaGVkIG1vZGUKICAgICovCisgIGJvb2wgaXNEZXRhY2hlZCgpIGNvbnN0IHsgcmV0dXJuIGRldGFjaGVkXzsgfQogCisgIC8qKgorICAgKiBTZXRzIHRoZSBkZXRhY2hlZCBkaXNwb3NpdGlvbiBvZiBuZXdseSBjcmVhdGVkIHRocmVhZHMuCisgICAqLworICB2b2lkIHNldERldGFjaGVkKGJvb2wgZGV0YWNoZWQpIHsgZGV0YWNoZWRfID0gZGV0YWNoZWQ7IH0KKworICAvKioKKyAgICogQ3JlYXRlIGEgbmV3IHRocmVhZC4KKyAgICovCisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gbmV3VGhyZWFkKHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpIGNvbnN0ID0gMDsKKworICAvKioKKyAgICogR2V0cyB0aGUgY3VycmVudCB0aHJlYWQgaWQgb3IgdW5rbm93bl90aHJlYWRfaWQgaWYgdGhlIGN1cnJlbnQgdGhyZWFkIGlzIG5vdCBhIHRocmlmdCB0aHJlYWQKKyAgICovCisgIHZpcnR1YWwgVGhyZWFkOjppZF90IGdldEN1cnJlbnRUaHJlYWRJZCgpIGNvbnN0ID0gMDsKKworICAvKioKKyAgICogRm9yIGNvZGUgcmVhZGFiaWxpdHkgZGVmaW5lIHRoZSB1bmtub3duL3VuZGVmaW5lZCB0aHJlYWQgaWQKKyAgICovCiAgIHN0YXRpYyBjb25zdCBUaHJlYWQ6OmlkX3QgdW5rbm93bl90aHJlYWRfaWQ7CiAKLSAgdmlydHVhbCBUaHJlYWQ6OmlkX3QgZ2V0Q3VycmVudFRocmVhZElkKCkgY29uc3QgPSAwOworcHJpdmF0ZToKKyAgYm9vbCBkZXRhY2hlZF87CiB9OworCiB9CiB9CiB9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuY3BwCmluZGV4IGEyYjQ0ZDQuLjU4MDI1ZjkgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5jcHAKQEAgLTI0LDIyICsyNCwxOCBAQAogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1V0aWwuaD4KIAotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgorI2luY2x1ZGUgPG1lbW9yeT4KIAotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHF1ZXVlPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKyNpbmNsdWRlIDxkZXF1ZT4KICNpbmNsdWRlIDxzZXQ+CiAKLSNpZiBkZWZpbmVkKERFQlVHKQotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2VuZGlmIC8vIGRlZmluZWQoREVCVUcpCi0KIG5hbWVzcGFjZSBhcGFjaGUgewogbmFtZXNwYWNlIHRocmlmdCB7CiBuYW1lc3BhY2UgY29uY3VycmVuY3kgewogCi11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKLXVzaW5nIGJvb3N0OjpkeW5hbWljX3BvaW50ZXJfY2FzdDsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKK3VzaW5nIHN0ZDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q7CiAKIC8qKgogICogVGhyZWFkTWFuYWdlciBjbGFzcwpAQCAtNDksNiArNDUsOSBAQAogICogaXQgbWFpbnRhaW5zIHN0YXRpc3RpY3Mgb24gbnVtYmVyIG9mIGlkbGUgdGhyZWFkcywgbnVtYmVyIG9mIGFjdGl2ZSB0aHJlYWRzLAogICogdGFzayBiYWNrbG9nLCBhbmQgYXZlcmFnZSB3YWl0IGFuZCBzZXJ2aWNlIHRpbWVzLgogICoKKyAqIFRoZXJlIGFyZSB0aHJlZSBkaWZmZXJlbnQgbW9uaXRvcnMgdXNlZCBmb3Igc2lnbmFsaW5nIGRpZmZlcmVudCBjb25kaXRpb25zCisgKiBob3dldmVyIHRoZXkgYWxsIHNoYXJlIHRoZSBzYW1lIG11dGV4Xy4KKyAqCiAgKiBAdmVyc2lvbiAkSWQ6JAogICovCiBjbGFzcyBUaHJlYWRNYW5hZ2VyOjpJbXBsIDogcHVibGljIFRocmVhZE1hbmFnZXIgewpAQCAtNjIsMjUgKzYxLDI2IEBACiAgICAgICBleHBpcmVkQ291bnRfKDApLAogICAgICAgc3RhdGVfKFRocmVhZE1hbmFnZXI6OlVOSU5JVElBTElaRUQpLAogICAgICAgbW9uaXRvcl8oJm11dGV4XyksCi0gICAgICBtYXhNb25pdG9yXygmbXV0ZXhfKSB7fQorICAgICAgbWF4TW9uaXRvcl8oJm11dGV4XyksCisgICAgICB3b3JrZXJNb25pdG9yXygmbXV0ZXhfKSB7fQogCiAgIH5JbXBsKCkgeyBzdG9wKCk7IH0KIAogICB2b2lkIHN0YXJ0KCk7Ci0KLSAgdm9pZCBzdG9wKCkgeyBzdG9wSW1wbChmYWxzZSk7IH0KLQotICB2b2lkIGpvaW4oKSB7IHN0b3BJbXBsKHRydWUpOyB9CisgIHZvaWQgc3RvcCgpOwogCiAgIFRocmVhZE1hbmFnZXI6OlNUQVRFIHN0YXRlKCkgY29uc3QgeyByZXR1cm4gc3RhdGVfOyB9CiAKICAgc2hhcmVkX3B0cjxUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5KCkgY29uc3QgewotICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKKyAgICBHdWFyZCBnKG11dGV4Xyk7CiAgICAgcmV0dXJuIHRocmVhZEZhY3RvcnlfOwogICB9CiAKICAgdm9pZCB0aHJlYWRGYWN0b3J5KHNoYXJlZF9wdHI8VGhyZWFkRmFjdG9yeT4gdmFsdWUpIHsKLSAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7CisgICAgR3VhcmQgZyhtdXRleF8pOworICAgIGlmICh0aHJlYWRGYWN0b3J5XyAmJiB0aHJlYWRGYWN0b3J5Xy0+aXNEZXRhY2hlZCgpICE9IHZhbHVlLT5pc0RldGFjaGVkKCkpIHsKKyAgICAgIHRocm93IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigpOworICAgIH0KICAgICB0aHJlYWRGYWN0b3J5XyA9IHZhbHVlOwogICB9CiAKQEAgLTkxLDUxICs5MSw2NSBAQAogICBzaXplX3QgaWRsZVdvcmtlckNvdW50KCkgY29uc3QgeyByZXR1cm4gaWRsZUNvdW50XzsgfQogCiAgIHNpemVfdCB3b3JrZXJDb3VudCgpIGNvbnN0IHsKLSAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7CisgICAgR3VhcmQgZyhtdXRleF8pOwogICAgIHJldHVybiB3b3JrZXJDb3VudF87CiAgIH0KIAogICBzaXplX3QgcGVuZGluZ1Rhc2tDb3VudCgpIGNvbnN0IHsKLSAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7CisgICAgR3VhcmQgZyhtdXRleF8pOwogICAgIHJldHVybiB0YXNrc18uc2l6ZSgpOwogICB9CiAKICAgc2l6ZV90IHRvdGFsVGFza0NvdW50KCkgY29uc3QgewotICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKKyAgICBHdWFyZCBnKG11dGV4Xyk7CiAgICAgcmV0dXJuIHRhc2tzXy5zaXplKCkgKyB3b3JrZXJDb3VudF8gLSBpZGxlQ291bnRfOwogICB9CiAKICAgc2l6ZV90IHBlbmRpbmdUYXNrQ291bnRNYXgoKSBjb25zdCB7Ci0gICAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOworICAgIEd1YXJkIGcobXV0ZXhfKTsKICAgICByZXR1cm4gcGVuZGluZ1Rhc2tDb3VudE1heF87CiAgIH0KIAogICBzaXplX3QgZXhwaXJlZFRhc2tDb3VudCgpIHsKLSAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7Ci0gICAgc2l6ZV90IHJlc3VsdCA9IGV4cGlyZWRDb3VudF87Ci0gICAgZXhwaXJlZENvdW50XyA9IDA7Ci0gICAgcmV0dXJuIHJlc3VsdDsKKyAgICBHdWFyZCBnKG11dGV4Xyk7CisgICAgcmV0dXJuIGV4cGlyZWRDb3VudF87CiAgIH0KIAogICB2b2lkIHBlbmRpbmdUYXNrQ291bnRNYXgoY29uc3Qgc2l6ZV90IHZhbHVlKSB7Ci0gICAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOworICAgIEd1YXJkIGcobXV0ZXhfKTsKICAgICBwZW5kaW5nVGFza0NvdW50TWF4XyA9IHZhbHVlOwogICB9CiAKLSAgYm9vbCBjYW5TbGVlcCgpOwotCiAgIHZvaWQgYWRkKHNoYXJlZF9wdHI8UnVubmFibGU+IHZhbHVlLCBpbnQ2NF90IHRpbWVvdXQsIGludDY0X3QgZXhwaXJhdGlvbik7CiAKICAgdm9pZCByZW1vdmUoc2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzayk7CiAKICAgc2hhcmVkX3B0cjxSdW5uYWJsZT4gcmVtb3ZlTmV4dFBlbmRpbmcoKTsKIAotICB2b2lkIHJlbW92ZUV4cGlyZWRUYXNrcygpOworICB2b2lkIHJlbW92ZUV4cGlyZWRUYXNrcygpIHsKKyAgICByZW1vdmVFeHBpcmVkKGZhbHNlKTsKKyAgfQogCiAgIHZvaWQgc2V0RXhwaXJlQ2FsbGJhY2soRXhwaXJlQ2FsbGJhY2sgZXhwaXJlQ2FsbGJhY2spOwogCiBwcml2YXRlOgotICB2b2lkIHN0b3BJbXBsKGJvb2wgam9pbik7CisgIC8qKgorICAgKiBSZW1vdmUgb25lIG9yIG1vcmUgZXhwaXJlZCB0YXNrcy4KKyAgICogXHBhcmFtW2luXSAganVzdE9uZSAgaWYgdHJ1ZSwgdHJ5IHRvIHJlbW92ZSBqdXN0IG9uZSB0YXNrIGFuZCByZXR1cm4KKyAgICovCisgIHZvaWQgcmVtb3ZlRXhwaXJlZChib29sIGp1c3RPbmUpOworCisgIC8qKgorICAgKiBccmV0dXJucyB3aGV0aGVyIGl0IGlzIGFjY2VwdGFibGUgdG8gYmxvY2ssIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCB0aHJlYWQgaWQKKyAgICovCisgIGJvb2wgY2FuU2xlZXAoKSBjb25zdDsKKworICAvKioKKyAgICogTG93ZXJzIHRoZSBtYXhpbXVtIHdvcmtlciBjb3VudCBhbmQgYmxvY2tzIHVudGlsIGVub3VnaCB3b3JrZXIgdGhyZWFkcyBjb21wbGV0ZQorICAgKiB0byBnZXQgdG8gdGhlIG5ldyBtYXhpbXVtIHdvcmtlciBsaW1pdC4gIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGFjcXVpcmluZworICAgKiBhIGxvY2sgb24gdGhlIGNsYXNzIG11dGV4Xy4KKyAgICovCisgIHZvaWQgcmVtb3ZlV29ya2Vyc1VuZGVyTG9jayhzaXplX3QgdmFsdWUpOwogCiAgIHNpemVfdCB3b3JrZXJDb3VudF87CiAgIHNpemVfdCB3b3JrZXJNYXhDb3VudF87CkBAIC0xNDgsMTEgKzE2MiwxMiBAQAogICBzaGFyZWRfcHRyPFRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnlfOwogCiAgIGZyaWVuZCBjbGFzcyBUaHJlYWRNYW5hZ2VyOjpUYXNrOwotICBzdGQ6OnF1ZXVlPHNoYXJlZF9wdHI8VGFzaz4gPiB0YXNrc187CisgIHR5cGVkZWYgc3RkOjpkZXF1ZTxzaGFyZWRfcHRyPFRhc2s+ID4gVGFza1F1ZXVlOworICBUYXNrUXVldWUgdGFza3NfOwogICBNdXRleCBtdXRleF87CiAgIE1vbml0b3IgbW9uaXRvcl87CiAgIE1vbml0b3IgbWF4TW9uaXRvcl87Ci0gIE1vbml0b3Igd29ya2VyTW9uaXRvcl87CisgIE1vbml0b3Igd29ya2VyTW9uaXRvcl87ICAgICAgIC8vIHVzZWQgdG8gc3luY2hyb25pemUgY2hhbmdlcyBpbiB3b3JrZXIgY291bnQKIAogICBmcmllbmQgY2xhc3MgVGhyZWFkTWFuYWdlcjo6V29ya2VyOwogICBzdGQ6OnNldDxzaGFyZWRfcHRyPFRocmVhZD4gPiB3b3JrZXJzXzsKQEAgLTE2Myw3ICsxNzgsNyBAQAogY2xhc3MgVGhyZWFkTWFuYWdlcjo6VGFzayA6IHB1YmxpYyBSdW5uYWJsZSB7CiAKIHB1YmxpYzoKLSAgZW51bSBTVEFURSB7IFdBSVRJTkcsIEVYRUNVVElORywgQ0FOQ0VMTEVELCBDT01QTEVURSB9OworICBlbnVtIFNUQVRFIHsgV0FJVElORywgRVhFQ1VUSU5HLCBUSU1FRE9VVCwgQ09NUExFVEUgfTsKIAogICBUYXNrKHNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlLCBpbnQ2NF90IGV4cGlyYXRpb24gPSAwTEwpCiAgICAgOiBydW5uYWJsZV8ocnVubmFibGUpLApAQCAtMTk0LDcgKzIwOSw3IEBACiAgIGVudW0gU1RBVEUgeyBVTklOSVRJQUxJWkVELCBTVEFSVElORywgU1RBUlRFRCwgU1RPUFBJTkcsIFNUT1BQRUQgfTsKIAogcHVibGljOgotICBXb3JrZXIoVGhyZWFkTWFuYWdlcjo6SW1wbCogbWFuYWdlcikgOiBtYW5hZ2VyXyhtYW5hZ2VyKSwgc3RhdGVfKFVOSU5JVElBTElaRUQpLCBpZGxlXyhmYWxzZSkge30KKyAgV29ya2VyKFRocmVhZE1hbmFnZXI6OkltcGwqIG1hbmFnZXIpIDogbWFuYWdlcl8obWFuYWdlciksIHN0YXRlXyhVTklOSVRJQUxJWkVEKSB7fQogCiAgIH5Xb3JrZXIoKSB7fQogCkBAIC0yMTIsODIgKzIyNyw4MiBAQAogICAgKiBleGVjdXRlLgogICAgKi8KICAgdm9pZCBydW4oKSB7Ci0gICAgYm9vbCBhY3RpdmUgPSBmYWxzZTsKLSAgICBib29sIG5vdGlmeU1hbmFnZXIgPSBmYWxzZTsKKyAgICBHdWFyZCBnKG1hbmFnZXJfLT5tdXRleF8pOworCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaGFzIHRocmVlIHBhcnRzOyBvbmUgaXMgdG8gY2hlY2sgZm9yIGFuZCBhY2NvdW50IGZvcgorICAgICAqIGFkbWl0dGluZyBhIHRhc2sgd2hpY2ggaGFwcGVucyB1bmRlciBhIGxvY2suICBUaGVuIHRoZSBsb2NrIGlzIHJlbGVhc2VkCisgICAgICogYW5kIHRoZSB0YXNrIGl0c2VsZiBpcyBleGVjdXRlZC4gIEZpbmFsbHkgd2UgZG8gc29tZSBhY2NvdW50aW5nCisgICAgICogdW5kZXIgbG9jayBhZ2FpbiB3aGVuIHRoZSB0YXNrIGNvbXBsZXRlcy4KKyAgICAgKi8KKworICAgIC8qKgorICAgICAqIEFkbWl0dGluZworICAgICAqLwogCiAgICAgLyoqCiAgICAgICogSW5jcmVtZW50IHdvcmtlciBzZW1hcGhvcmUgYW5kIG5vdGlmeSBtYW5hZ2VyIGlmIHdvcmtlciBjb3VudCByZWFjaGVkCiAgICAgICogZGVzaXJlZCBtYXgKLSAgICAgKgotICAgICAqIE5vdGU6IFdlIGhhdmUgdG8gcmVsZWFzZSB0aGUgbW9uaXRvciBhbmQgYWNxdWlyZSB0aGUgd29ya2VyTW9uaXRvcgotICAgICAqIHNpbmNlIHRoYXQgaXMgd2hhdCB0aGUgbWFuYWdlciBibG9ja3Mgb24gZm9yIHdvcmtlciBhZGQvcmVtb3ZlCiAgICAgICovCi0gICAgewotICAgICAgU3luY2hyb25pemVkIHMobWFuYWdlcl8tPm1vbml0b3JfKTsKLSAgICAgIGFjdGl2ZSA9IG1hbmFnZXJfLT53b3JrZXJDb3VudF8gPCBtYW5hZ2VyXy0+d29ya2VyTWF4Q291bnRfOwotICAgICAgaWYgKGFjdGl2ZSkgewotICAgICAgICBtYW5hZ2VyXy0+d29ya2VyQ291bnRfKys7Ci0gICAgICAgIG5vdGlmeU1hbmFnZXIgPSBtYW5hZ2VyXy0+d29ya2VyQ291bnRfID09IG1hbmFnZXJfLT53b3JrZXJNYXhDb3VudF87CisgICAgYm9vbCBhY3RpdmUgPSBtYW5hZ2VyXy0+d29ya2VyQ291bnRfIDwgbWFuYWdlcl8tPndvcmtlck1heENvdW50XzsKKyAgICBpZiAoYWN0aXZlKSB7CisgICAgICBpZiAoKyttYW5hZ2VyXy0+d29ya2VyQ291bnRfID09IG1hbmFnZXJfLT53b3JrZXJNYXhDb3VudF8pIHsKKyAgICAgICAgbWFuYWdlcl8tPndvcmtlck1vbml0b3JfLm5vdGlmeSgpOwogICAgICAgfQogICAgIH0KIAotICAgIGlmIChub3RpZnlNYW5hZ2VyKSB7Ci0gICAgICBTeW5jaHJvbml6ZWQgcyhtYW5hZ2VyXy0+d29ya2VyTW9uaXRvcl8pOwotICAgICAgbWFuYWdlcl8tPndvcmtlck1vbml0b3JfLm5vdGlmeSgpOwotICAgICAgbm90aWZ5TWFuYWdlciA9IGZhbHNlOwotICAgIH0KLQogICAgIHdoaWxlIChhY3RpdmUpIHsKKyAgICAgIC8qKgorICAgICAgICAqIFdoaWxlIGhvbGRpbmcgbWFuYWdlciBtb25pdG9yIGJsb2NrIGZvciBub24tZW1wdHkgdGFzayBxdWV1ZSAoQWxzbworICAgICAgICAqIGNoZWNrIHRoYXQgdGhlIHRocmVhZCBoYXNuJ3QgYmVlbiByZXF1ZXN0ZWQgdG8gc3RvcCkuIE9uY2UgdGhlIHF1ZXVlCisgICAgICAgICogaXMgbm9uLWVtcHR5LCBkZXF1ZXVlIGEgdGFzaywgcmVsZWFzZSBtb25pdG9yLCBhbmQgZXhlY3V0ZS4gSWYgdGhlCisgICAgICAgICogd29ya2VyIG1heCBjb3VudCBoYXMgYmVlbiBkZWNyZW1lbnRlZCBzdWNoIHRoYXQgd2UgZXhjZWVkIGl0LCBtYXJrCisgICAgICAgICogb3Vyc2VsZiBpbmFjdGl2ZSwgZGVjcmVtZW50IHRoZSB3b3JrZXIgY291bnQgYW5kIG5vdGlmeSB0aGUgbWFuYWdlcgorICAgICAgICAqICh0ZWNobmljYWxseSB3ZSdyZSBub3RpZnlpbmcgdGhlIG5leHQgYmxvY2tlZCB0aHJlYWQgYnV0IGV2ZW50dWFsbHkKKyAgICAgICAgKiB0aGUgbWFuYWdlciB3aWxsIHNlZSBpdC4KKyAgICAgICAgKi8KKyAgICAgIGFjdGl2ZSA9IGlzQWN0aXZlKCk7CisKKyAgICAgIHdoaWxlIChhY3RpdmUgJiYgbWFuYWdlcl8tPnRhc2tzXy5lbXB0eSgpKSB7CisgICAgICAgIG1hbmFnZXJfLT5pZGxlQ291bnRfKys7CisgICAgICAgIG1hbmFnZXJfLT5tb25pdG9yXy53YWl0KCk7CisgICAgICAgIGFjdGl2ZSA9IGlzQWN0aXZlKCk7CisgICAgICAgIG1hbmFnZXJfLT5pZGxlQ291bnRfLS07CisgICAgICB9CisKICAgICAgIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcjo6VGFzaz4gdGFzazsKIAotICAgICAgLyoqCi0gICAgICAgKiBXaGlsZSBob2xkaW5nIG1hbmFnZXIgbW9uaXRvciBibG9jayBmb3Igbm9uLWVtcHR5IHRhc2sgcXVldWUgKEFsc28KLSAgICAgICAqIGNoZWNrIHRoYXQgdGhlIHRocmVhZCBoYXNuJ3QgYmVlbiByZXF1ZXN0ZWQgdG8gc3RvcCkuIE9uY2UgdGhlIHF1ZXVlCi0gICAgICAgKiBpcyBub24tZW1wdHksIGRlcXVldWUgYSB0YXNrLCByZWxlYXNlIG1vbml0b3IsIGFuZCBleGVjdXRlLiBJZiB0aGUKLSAgICAgICAqIHdvcmtlciBtYXggY291bnQgaGFzIGJlZW4gZGVjcmVtZW50ZWQgc3VjaCB0aGF0IHdlIGV4Y2VlZCBpdCwgbWFyawotICAgICAgICogb3Vyc2VsZiBpbmFjdGl2ZSwgZGVjcmVtZW50IHRoZSB3b3JrZXIgY291bnQgYW5kIG5vdGlmeSB0aGUgbWFuYWdlcgotICAgICAgICogKHRlY2huaWNhbGx5IHdlJ3JlIG5vdGlmeWluZyB0aGUgbmV4dCBibG9ja2VkIHRocmVhZCBidXQgZXZlbnR1YWxseQotICAgICAgICogdGhlIG1hbmFnZXIgd2lsbCBzZWUgaXQuCi0gICAgICAgKi8KLSAgICAgIHsKLSAgICAgICAgR3VhcmQgZyhtYW5hZ2VyXy0+bXV0ZXhfKTsKLSAgICAgICAgYWN0aXZlID0gaXNBY3RpdmUoKTsKLQotICAgICAgICB3aGlsZSAoYWN0aXZlICYmIG1hbmFnZXJfLT50YXNrc18uZW1wdHkoKSkgewotICAgICAgICAgIG1hbmFnZXJfLT5pZGxlQ291bnRfKys7Ci0gICAgICAgICAgaWRsZV8gPSB0cnVlOwotICAgICAgICAgIG1hbmFnZXJfLT5tb25pdG9yXy53YWl0KCk7Ci0gICAgICAgICAgYWN0aXZlID0gaXNBY3RpdmUoKTsKLSAgICAgICAgICBpZGxlXyA9IGZhbHNlOwotICAgICAgICAgIG1hbmFnZXJfLT5pZGxlQ291bnRfLS07CisgICAgICBpZiAoYWN0aXZlKSB7CisgICAgICAgIGlmICghbWFuYWdlcl8tPnRhc2tzXy5lbXB0eSgpKSB7CisgICAgICAgICAgdGFzayA9IG1hbmFnZXJfLT50YXNrc18uZnJvbnQoKTsKKyAgICAgICAgICBtYW5hZ2VyXy0+dGFza3NfLnBvcF9mcm9udCgpOworICAgICAgICAgIGlmICh0YXNrLT5zdGF0ZV8gPT0gVGhyZWFkTWFuYWdlcjo6VGFzazo6V0FJVElORykgeworICAgICAgICAgICAgLy8gSWYgdGhlIHN0YXRlIGlzIGNoYW5nZWQgdG8gYW55dGhpbmcgb3RoZXIgdGhhbiBFWEVDVVRJTkcgb3IgVElNRURPVVQgaGVyZQorICAgICAgICAgICAgLy8gdGhlbiB0aGUgZXhlY3V0aW9uIGxvb3AgbmVlZHMgdG8gYmUgY2hhbmdlZCBiZWxvdy4KKyAgICAgICAgICAgIHRhc2stPnN0YXRlXyA9CisgICAgICAgICAgICAgICAgKHRhc2stPmdldEV4cGlyZVRpbWUoKSAmJiB0YXNrLT5nZXRFeHBpcmVUaW1lKCkgPCBVdGlsOjpjdXJyZW50VGltZSgpKSA/CisgICAgICAgICAgICAgICAgICAgIFRocmVhZE1hbmFnZXI6OlRhc2s6OlRJTUVET1VUIDoKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkTWFuYWdlcjo6VGFzazo6RVhFQ1VUSU5HOworICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGlmIChhY3RpdmUpIHsKLSAgICAgICAgICBtYW5hZ2VyXy0+cmVtb3ZlRXhwaXJlZFRhc2tzKCk7Ci0KLSAgICAgICAgICBpZiAoIW1hbmFnZXJfLT50YXNrc18uZW1wdHkoKSkgewotICAgICAgICAgICAgdGFzayA9IG1hbmFnZXJfLT50YXNrc18uZnJvbnQoKTsKLSAgICAgICAgICAgIG1hbmFnZXJfLT50YXNrc18ucG9wKCk7Ci0gICAgICAgICAgICBpZiAodGFzay0+c3RhdGVfID09IFRocmVhZE1hbmFnZXI6OlRhc2s6OldBSVRJTkcpIHsKLSAgICAgICAgICAgICAgdGFzay0+c3RhdGVfID0gVGhyZWFkTWFuYWdlcjo6VGFzazo6RVhFQ1VUSU5HOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICAgIC8qIElmIHdlIGhhdmUgYSBwZW5kaW5nIHRhc2sgbWF4IGFuZCB3ZSBqdXN0IGRyb3BwZWQgYmVsb3cgaXQsIHdha2V1cCBhbnkKLSAgICAgICAgICAgICB0aHJlYWQgdGhhdCBtaWdodCBiZSBibG9ja2VkIG9uIGFkZC4gKi8KLSAgICAgICAgICBpZiAobWFuYWdlcl8tPnBlbmRpbmdUYXNrQ291bnRNYXhfICE9IDAKLSAgICAgICAgICAgICAgICAgICYmIG1hbmFnZXJfLT50YXNrc18uc2l6ZSgpIDw9IG1hbmFnZXJfLT5wZW5kaW5nVGFza0NvdW50TWF4XyAtIDEpIHsKLSAgICAgICAgICAgICAgbWFuYWdlcl8tPm1heE1vbml0b3JfLm5vdGlmeSgpOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZGxlXyA9IHRydWU7Ci0gICAgICAgICAgbWFuYWdlcl8tPndvcmtlckNvdW50Xy0tOwotICAgICAgICAgIG5vdGlmeU1hbmFnZXIgPSAobWFuYWdlcl8tPndvcmtlckNvdW50XyA9PSBtYW5hZ2VyXy0+d29ya2VyTWF4Q291bnRfKTsKKyAgICAgICAgLyogSWYgd2UgaGF2ZSBhIHBlbmRpbmcgdGFzayBtYXggYW5kIHdlIGp1c3QgZHJvcHBlZCBiZWxvdyBpdCwgd2FrZXVwIGFueQorICAgICAgICAgICAgdGhyZWFkIHRoYXQgbWlnaHQgYmUgYmxvY2tlZCBvbiBhZGQuICovCisgICAgICAgIGlmIChtYW5hZ2VyXy0+cGVuZGluZ1Rhc2tDb3VudE1heF8gIT0gMAorICAgICAgICAgICAgJiYgbWFuYWdlcl8tPnRhc2tzXy5zaXplKCkgPD0gbWFuYWdlcl8tPnBlbmRpbmdUYXNrQ291bnRNYXhfIC0gMSkgeworICAgICAgICAgIG1hbmFnZXJfLT5tYXhNb25pdG9yXy5ub3RpZnkoKTsKICAgICAgICAgfQogICAgICAgfQogCisgICAgICAvKioKKyAgICAgICAqIEV4ZWN1dGlvbiAtIG5vdCBob2xkaW5nIGEgbG9jaworICAgICAgICovCiAgICAgICBpZiAodGFzaykgewogICAgICAgICBpZiAodGFzay0+c3RhdGVfID09IFRocmVhZE1hbmFnZXI6OlRhc2s6OkVYRUNVVElORykgeworCisgICAgICAgICAgLy8gUmVsZWFzZSB0aGUgbG9jayBzbyB3ZSBjYW4gcnVuIHRoZSB0YXNrIHdpdGhvdXQgYmxvY2tpbmcgdGhlIHRocmVhZCBtYW5hZ2VyCisgICAgICAgICAgbWFuYWdlcl8tPm11dGV4Xy51bmxvY2soKTsKKwogICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICB0YXNrLT5ydW4oKTsKICAgICAgICAgICB9IGNhdGNoIChjb25zdCBzdGQ6OmV4Y2VwdGlvbiYgZSkgewpAQCAtMjk1LDI2ICszMTAsMzEgQEAKICAgICAgICAgICB9IGNhdGNoICguLi4pIHsKICAgICAgICAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIltFUlJPUl0gdGFzay0+cnVuKCkgcmFpc2VkIGFuIHVua25vd24gZXhjZXB0aW9uIik7CiAgICAgICAgICAgfQorCisgICAgICAgICAgLy8gUmUtYWNxdWlyZSB0aGUgbG9jayB0byBwcm9jZWVkIGluIHRoZSB0aHJlYWQgbWFuYWdlcgorICAgICAgICAgIG1hbmFnZXJfLT5tdXRleF8ubG9jaygpOworCisgICAgICAgIH0gZWxzZSBpZiAobWFuYWdlcl8tPmV4cGlyZUNhbGxiYWNrXykgeworICAgICAgICAgIC8vIFRoZSBvbmx5IG90aGVyIHN0YXRlIHRoZSB0YXNrIGNvdWxkIGhhdmUgYmVlbiBpbiBpcyBUSU1FRE9VVCAoc2VlIGFib3ZlKQorICAgICAgICAgIG1hbmFnZXJfLT5leHBpcmVDYWxsYmFja18odGFzay0+Z2V0UnVubmFibGUoKSk7CisgICAgICAgICAgbWFuYWdlcl8tPmV4cGlyZWRDb3VudF8rKzsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KIAotICAgIHsKLSAgICAgIFN5bmNocm9uaXplZCBzKG1hbmFnZXJfLT53b3JrZXJNb25pdG9yXyk7Ci0gICAgICBtYW5hZ2VyXy0+ZGVhZFdvcmtlcnNfLmluc2VydCh0aGlzLT50aHJlYWQoKSk7Ci0gICAgICBpZiAobm90aWZ5TWFuYWdlcikgewotICAgICAgICBtYW5hZ2VyXy0+d29ya2VyTW9uaXRvcl8ubm90aWZ5KCk7Ci0gICAgICB9CisgICAgLyoqCisgICAgICogRmluYWwgYWNjb3VudGluZyBmb3IgdGhlIHdvcmtlciB0aHJlYWQgdGhhdCBpcyBkb25lIHdvcmtpbmcKKyAgICAgKi8KKyAgICBtYW5hZ2VyXy0+ZGVhZFdvcmtlcnNfLmluc2VydCh0aGlzLT50aHJlYWQoKSk7CisgICAgaWYgKC0tbWFuYWdlcl8tPndvcmtlckNvdW50XyA9PSBtYW5hZ2VyXy0+d29ya2VyTWF4Q291bnRfKSB7CisgICAgICBtYW5hZ2VyXy0+d29ya2VyTW9uaXRvcl8ubm90aWZ5KCk7CiAgICAgfQotCi0gICAgcmV0dXJuOwogICB9CiAKIHByaXZhdGU6CiAgIFRocmVhZE1hbmFnZXI6OkltcGwqIG1hbmFnZXJfOwogICBmcmllbmQgY2xhc3MgVGhyZWFkTWFuYWdlcjo6SW1wbDsKICAgU1RBVEUgc3RhdGVfOwotICBib29sIGlkbGVfOwogfTsKIAogdm9pZCBUaHJlYWRNYW5hZ2VyOjpJbXBsOjphZGRXb3JrZXIoc2l6ZV90IHZhbHVlKSB7CkBAIC0zMjUsMTEgKzM0NSw5IEBACiAgICAgbmV3VGhyZWFkcy5pbnNlcnQodGhyZWFkRmFjdG9yeV8tPm5ld1RocmVhZCh3b3JrZXIpKTsKICAgfQogCi0gIHsKLSAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7Ci0gICAgd29ya2VyTWF4Q291bnRfICs9IHZhbHVlOwotICAgIHdvcmtlcnNfLmluc2VydChuZXdUaHJlYWRzLmJlZ2luKCksIG5ld1RocmVhZHMuZW5kKCkpOwotICB9CisgIEd1YXJkIGcobXV0ZXhfKTsKKyAgd29ya2VyTWF4Q291bnRfICs9IHZhbHVlOworICB3b3JrZXJzXy5pbnNlcnQobmV3VGhyZWFkcy5iZWdpbigpLCBuZXdUaHJlYWRzLmVuZCgpKTsKIAogICBmb3IgKHN0ZDo6c2V0PHNoYXJlZF9wdHI8VGhyZWFkPiA+OjppdGVyYXRvciBpeCA9IG5ld1RocmVhZHMuYmVnaW4oKTsgaXggIT0gbmV3VGhyZWFkcy5lbmQoKTsKICAgICAgICArK2l4KSB7CkBAIC0zNDAsMTAzICszNTgsOTIgQEAKICAgICBpZE1hcF8uaW5zZXJ0KHN0ZDo6cGFpcjxjb25zdCBUaHJlYWQ6OmlkX3QsIHNoYXJlZF9wdHI8VGhyZWFkPiA+KCgqaXgpLT5nZXRJZCgpLCAqaXgpKTsKICAgfQogCi0gIHsKLSAgICBTeW5jaHJvbml6ZWQgcyh3b3JrZXJNb25pdG9yXyk7Ci0gICAgd2hpbGUgKHdvcmtlckNvdW50XyAhPSB3b3JrZXJNYXhDb3VudF8pIHsKLSAgICAgIHdvcmtlck1vbml0b3JfLndhaXQoKTsKLSAgICB9CisgIHdoaWxlICh3b3JrZXJDb3VudF8gIT0gd29ya2VyTWF4Q291bnRfKSB7CisgICAgd29ya2VyTW9uaXRvcl8ud2FpdCgpOwogICB9CiB9CiAKIHZvaWQgVGhyZWFkTWFuYWdlcjo6SW1wbDo6c3RhcnQoKSB7Ci0KKyAgR3VhcmQgZyhtdXRleF8pOwogICBpZiAoc3RhdGVfID09IFRocmVhZE1hbmFnZXI6OlNUT1BQRUQpIHsKICAgICByZXR1cm47CiAgIH0KIAotICB7Ci0gICAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOwotICAgIGlmIChzdGF0ZV8gPT0gVGhyZWFkTWFuYWdlcjo6VU5JTklUSUFMSVpFRCkgewotICAgICAgaWYgKCF0aHJlYWRGYWN0b3J5XykgewotICAgICAgICB0aHJvdyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICAgIHN0YXRlXyA9IFRocmVhZE1hbmFnZXI6OlNUQVJURUQ7Ci0gICAgICBtb25pdG9yXy5ub3RpZnlBbGwoKTsKKyAgaWYgKHN0YXRlXyA9PSBUaHJlYWRNYW5hZ2VyOjpVTklOSVRJQUxJWkVEKSB7CisgICAgaWYgKCF0aHJlYWRGYWN0b3J5XykgeworICAgICAgdGhyb3cgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCk7CiAgICAgfQorICAgIHN0YXRlXyA9IFRocmVhZE1hbmFnZXI6OlNUQVJURUQ7CisgICAgbW9uaXRvcl8ubm90aWZ5QWxsKCk7CisgIH0KIAotICAgIHdoaWxlIChzdGF0ZV8gPT0gU1RBUlRJTkcpIHsKLSAgICAgIG1vbml0b3JfLndhaXQoKTsKLSAgICB9CisgIHdoaWxlIChzdGF0ZV8gPT0gU1RBUlRJTkcpIHsKKyAgICBtb25pdG9yXy53YWl0KCk7CiAgIH0KIH0KIAotdm9pZCBUaHJlYWRNYW5hZ2VyOjpJbXBsOjpzdG9wSW1wbChib29sIGpvaW4pIHsKK3ZvaWQgVGhyZWFkTWFuYWdlcjo6SW1wbDo6c3RvcCgpIHsKKyAgR3VhcmQgZyhtdXRleF8pOwogICBib29sIGRvU3RvcCA9IGZhbHNlOwotICBpZiAoc3RhdGVfID09IFRocmVhZE1hbmFnZXI6OlNUT1BQRUQpIHsKLSAgICByZXR1cm47Ci0gIH0KIAotICB7Ci0gICAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOwotICAgIGlmIChzdGF0ZV8gIT0gVGhyZWFkTWFuYWdlcjo6U1RPUFBJTkcgJiYgc3RhdGVfICE9IFRocmVhZE1hbmFnZXI6OkpPSU5JTkcKLSAgICAgICAgJiYgc3RhdGVfICE9IFRocmVhZE1hbmFnZXI6OlNUT1BQRUQpIHsKLSAgICAgIGRvU3RvcCA9IHRydWU7Ci0gICAgICBzdGF0ZV8gPSBqb2luID8gVGhyZWFkTWFuYWdlcjo6Sk9JTklORyA6IFRocmVhZE1hbmFnZXI6OlNUT1BQSU5HOwotICAgIH0KKyAgaWYgKHN0YXRlXyAhPSBUaHJlYWRNYW5hZ2VyOjpTVE9QUElORyAmJiBzdGF0ZV8gIT0gVGhyZWFkTWFuYWdlcjo6Sk9JTklORworICAgICAgJiYgc3RhdGVfICE9IFRocmVhZE1hbmFnZXI6OlNUT1BQRUQpIHsKKyAgICBkb1N0b3AgPSB0cnVlOworICAgIHN0YXRlXyA9IFRocmVhZE1hbmFnZXI6OkpPSU5JTkc7CiAgIH0KIAogICBpZiAoZG9TdG9wKSB7Ci0gICAgcmVtb3ZlV29ya2VyKHdvcmtlckNvdW50Xyk7CisgICAgcmVtb3ZlV29ya2Vyc1VuZGVyTG9jayh3b3JrZXJDb3VudF8pOwogICB9CiAKLSAgLy8gWFhYCi0gIC8vIHNob3VsZCBiZSBhYmxlIHRvIGJsb2NrIGhlcmUgZm9yIHRyYW5zaXRpb24gdG8gU1RPUFBFRCBzaW5jZSB3ZSdyZSBubwotICAvLyB1c2luZyBzaGFyZWRfcHRycwotCi0gIHsKLSAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7Ci0gICAgc3RhdGVfID0gVGhyZWFkTWFuYWdlcjo6U1RPUFBFRDsKLSAgfQorICBzdGF0ZV8gPSBUaHJlYWRNYW5hZ2VyOjpTVE9QUEVEOwogfQogCiB2b2lkIFRocmVhZE1hbmFnZXI6OkltcGw6OnJlbW92ZVdvcmtlcihzaXplX3QgdmFsdWUpIHsKLSAgc3RkOjpzZXQ8c2hhcmVkX3B0cjxUaHJlYWQ+ID4gcmVtb3ZlZFRocmVhZHM7Ci0gIHsKLSAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7Ci0gICAgaWYgKHZhbHVlID4gd29ya2VyTWF4Q291bnRfKSB7Ci0gICAgICB0aHJvdyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICB3b3JrZXJNYXhDb3VudF8gLT0gdmFsdWU7Ci0KLSAgICBpZiAoaWRsZUNvdW50XyA8IHZhbHVlKSB7Ci0gICAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgaWRsZUNvdW50XzsgaXgrKykgewotICAgICAgICBtb25pdG9yXy5ub3RpZnkoKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgbW9uaXRvcl8ubm90aWZ5QWxsKCk7Ci0gICAgfQotICB9Ci0KLSAgewotICAgIFN5bmNocm9uaXplZCBzKHdvcmtlck1vbml0b3JfKTsKLQotICAgIHdoaWxlICh3b3JrZXJDb3VudF8gIT0gd29ya2VyTWF4Q291bnRfKSB7Ci0gICAgICB3b3JrZXJNb25pdG9yXy53YWl0KCk7Ci0gICAgfQotCi0gICAgZm9yIChzdGQ6OnNldDxzaGFyZWRfcHRyPFRocmVhZD4gPjo6aXRlcmF0b3IgaXggPSBkZWFkV29ya2Vyc18uYmVnaW4oKTsKLSAgICAgICAgIGl4ICE9IGRlYWRXb3JrZXJzXy5lbmQoKTsKLSAgICAgICAgICsraXgpIHsKLSAgICAgIGlkTWFwXy5lcmFzZSgoKml4KS0+Z2V0SWQoKSk7Ci0gICAgICB3b3JrZXJzXy5lcmFzZSgqaXgpOwotICAgIH0KLQotICAgIGRlYWRXb3JrZXJzXy5jbGVhcigpOwotICB9CisgIEd1YXJkIGcobXV0ZXhfKTsKKyAgcmVtb3ZlV29ya2Vyc1VuZGVyTG9jayh2YWx1ZSk7CiB9CiAKLWJvb2wgVGhyZWFkTWFuYWdlcjo6SW1wbDo6Y2FuU2xlZXAoKSB7Cit2b2lkIFRocmVhZE1hbmFnZXI6OkltcGw6OnJlbW92ZVdvcmtlcnNVbmRlckxvY2soc2l6ZV90IHZhbHVlKSB7CisgIGlmICh2YWx1ZSA+IHdvcmtlck1heENvdW50XykgeworICAgIHRocm93IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigpOworICB9CisKKyAgd29ya2VyTWF4Q291bnRfIC09IHZhbHVlOworCisgIGlmIChpZGxlQ291bnRfID4gdmFsdWUpIHsKKyAgICAvLyBUaGVyZSBhcmUgbW9yZSBpZGxlIHdvcmtlcnMgdGhhbiB3ZSBuZWVkIHRvIHJlbW92ZSwKKyAgICAvLyBzbyBub3RpZnkgZW5vdWdoIG9mIHRoZW0gc28gdGhleSBjYW4gdGVybWluYXRlLgorICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCB2YWx1ZTsgaXgrKykgeworICAgICAgbW9uaXRvcl8ubm90aWZ5KCk7CisgICAgfQorICB9IGVsc2UgeworICAgIC8vIFRoZXJlIGFyZSBhcyBtYW55IG9yIGxlc3MgaWRsZSB3b3JrZXJzIHRoYW4gd2UgbmVlZCB0byByZW1vdmUsCisgICAgLy8gc28ganVzdCBub3RpZnkgdGhlbSBhbGwgc28gdGhleSBjYW4gdGVybWluYXRlLgorICAgIG1vbml0b3JfLm5vdGlmeUFsbCgpOworICB9CisKKyAgd2hpbGUgKHdvcmtlckNvdW50XyAhPSB3b3JrZXJNYXhDb3VudF8pIHsKKyAgICB3b3JrZXJNb25pdG9yXy53YWl0KCk7CisgIH0KKworICBmb3IgKHN0ZDo6c2V0PHNoYXJlZF9wdHI8VGhyZWFkPiA+OjppdGVyYXRvciBpeCA9IGRlYWRXb3JrZXJzXy5iZWdpbigpOworICAgICAgIGl4ICE9IGRlYWRXb3JrZXJzXy5lbmQoKTsKKyAgICAgICArK2l4KSB7CisKKyAgICAvLyB3aGVuIHVzZWQgd2l0aCBhIGpvaW5hYmxlIHRocmVhZCBmYWN0b3J5LCB3ZSBqb2luIHRoZSB0aHJlYWRzIGFzIHdlIHJlbW92ZSB0aGVtCisgICAgaWYgKCF0aHJlYWRGYWN0b3J5Xy0+aXNEZXRhY2hlZCgpKSB7CisgICAgICAoKml4KS0+am9pbigpOworICAgIH0KKworICAgIGlkTWFwXy5lcmFzZSgoKml4KS0+Z2V0SWQoKSk7CisgICAgd29ya2Vyc18uZXJhc2UoKml4KTsKKyAgfQorCisgIGRlYWRXb3JrZXJzXy5jbGVhcigpOworfQorCitib29sIFRocmVhZE1hbmFnZXI6OkltcGw6OmNhblNsZWVwKCkgY29uc3QgewogICBjb25zdCBUaHJlYWQ6OmlkX3QgaWQgPSB0aHJlYWRGYWN0b3J5Xy0+Z2V0Q3VycmVudFRocmVhZElkKCk7CiAgIHJldHVybiBpZE1hcF8uZmluZChpZCkgPT0gaWRNYXBfLmVuZCgpOwogfQpAQCAtNDU0LDcgKzQ2MSwxMSBAQAogICAgICAgICAibm90IHN0YXJ0ZWQiKTsKICAgfQogCi0gIHJlbW92ZUV4cGlyZWRUYXNrcygpOworICAvLyBpZiB3ZSdyZSBhdCBhIGxpbWl0LCByZW1vdmUgYW4gZXhwaXJlZCB0YXNrIHRvIHNlZSBpZiB0aGUgbGltaXQgY2xlYXJzCisgIGlmIChwZW5kaW5nVGFza0NvdW50TWF4XyA+IDAgJiYgKHRhc2tzXy5zaXplKCkgPj0gcGVuZGluZ1Rhc2tDb3VudE1heF8pKSB7CisgICAgcmVtb3ZlRXhwaXJlZCh0cnVlKTsKKyAgfQorCiAgIGlmIChwZW5kaW5nVGFza0NvdW50TWF4XyA+IDAgJiYgKHRhc2tzXy5zaXplKCkgPj0gcGVuZGluZ1Rhc2tDb3VudE1heF8pKSB7CiAgICAgaWYgKGNhblNsZWVwKCkgJiYgdGltZW91dCA+PSAwKSB7CiAgICAgICB3aGlsZSAocGVuZGluZ1Rhc2tDb3VudE1heF8gPiAwICYmIHRhc2tzXy5zaXplKCkgPj0gcGVuZGluZ1Rhc2tDb3VudE1heF8pIHsKQEAgLTQ2Niw3ICs0NzcsNyBAQAogICAgIH0KICAgfQogCi0gIHRhc2tzXy5wdXNoKHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcjo6VGFzaz4obmV3IFRocmVhZE1hbmFnZXI6OlRhc2sodmFsdWUsIGV4cGlyYXRpb24pKSk7CisgIHRhc2tzXy5wdXNoX2JhY2soc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyOjpUYXNrPihuZXcgVGhyZWFkTWFuYWdlcjo6VGFzayh2YWx1ZSwgZXhwaXJhdGlvbikpKTsKIAogICAvLyBJZiBpZGxlIHRocmVhZCBpcyBhdmFpbGFibGUgbm90aWZ5IGl0LCBvdGhlcndpc2UgYWxsIHdvcmtlciB0aHJlYWRzIGFyZQogICAvLyBydW5uaW5nIGFuZCB3aWxsIGdldCBhcm91bmQgdG8gdGhpcyB0YXNrIGluIHRpbWUuCkBAIC00NzYsMTYgKzQ4NywyNCBAQAogfQogCiB2b2lkIFRocmVhZE1hbmFnZXI6OkltcGw6OnJlbW92ZShzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrKSB7Ci0gICh2b2lkKXRhc2s7Ci0gIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKKyAgR3VhcmQgZyhtdXRleF8pOwogICBpZiAoc3RhdGVfICE9IFRocmVhZE1hbmFnZXI6OlNUQVJURUQpIHsKICAgICB0aHJvdyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCiAgICAgICAgICJUaHJlYWRNYW5hZ2VyOjpJbXBsOjpyZW1vdmUgVGhyZWFkTWFuYWdlciBub3QgIgogICAgICAgICAic3RhcnRlZCIpOwogICB9CisKKyAgZm9yIChUYXNrUXVldWU6Oml0ZXJhdG9yIGl0ID0gdGFza3NfLmJlZ2luKCk7IGl0ICE9IHRhc2tzXy5lbmQoKTsgKytpdCkKKyAgeworICAgIGlmICgoKml0KS0+Z2V0UnVubmFibGUoKSA9PSB0YXNrKQorICAgIHsKKyAgICAgIHRhc2tzXy5lcmFzZShpdCk7CisgICAgICByZXR1cm47CisgICAgfQorICB9CiB9CiAKLWJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiBUaHJlYWRNYW5hZ2VyOjpJbXBsOjpyZW1vdmVOZXh0UGVuZGluZygpIHsKK3N0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gVGhyZWFkTWFuYWdlcjo6SW1wbDo6cmVtb3ZlTmV4dFBlbmRpbmcoKSB7CiAgIEd1YXJkIGcobXV0ZXhfKTsKICAgaWYgKHN0YXRlXyAhPSBUaHJlYWRNYW5hZ2VyOjpTVEFSVEVEKSB7CiAgICAgdGhyb3cgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKApAQCAtNDk0LDM5ICs1MTMsNDQgQEAKICAgfQogCiAgIGlmICh0YXNrc18uZW1wdHkoKSkgewotICAgIHJldHVybiBib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4oKTsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPigpOwogICB9CiAKICAgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyOjpUYXNrPiB0YXNrID0gdGFza3NfLmZyb250KCk7Ci0gIHRhc2tzXy5wb3AoKTsKKyAgdGFza3NfLnBvcF9mcm9udCgpOwogCiAgIHJldHVybiB0YXNrLT5nZXRSdW5uYWJsZSgpOwogfQogCi12b2lkIFRocmVhZE1hbmFnZXI6OkltcGw6OnJlbW92ZUV4cGlyZWRUYXNrcygpIHsKLSAgaW50NjRfdCBub3cgPSAwTEw7IC8vIHdlIHdvbid0IGFzayBmb3IgdGhlIHRpbWUgdW50aWxlIHdlIG5lZWQgaXQKK3ZvaWQgVGhyZWFkTWFuYWdlcjo6SW1wbDo6cmVtb3ZlRXhwaXJlZChib29sIGp1c3RPbmUpIHsKKyAgLy8gdGhpcyBpcyBhbHdheXMgY2FsbGVkIHVuZGVyIGEgbG9jaworICBpbnQ2NF90IG5vdyA9IDBMTDsKIAotICAvLyBub3RlIHRoYXQgdGhpcyBsb29wIGJyZWFrcyBhdCB0aGUgZmlyc3Qgbm9uLWV4cGlyaW5nIHRhc2sKLSAgd2hpbGUgKCF0YXNrc18uZW1wdHkoKSkgewotICAgIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcjo6VGFzaz4gdGFzayA9IHRhc2tzXy5mcm9udCgpOwotICAgIGlmICh0YXNrLT5nZXRFeHBpcmVUaW1lKCkgPT0gMExMKSB7Ci0gICAgICBicmVhazsKLSAgICB9CisgIGZvciAoVGFza1F1ZXVlOjppdGVyYXRvciBpdCA9IHRhc2tzXy5iZWdpbigpOyBpdCAhPSB0YXNrc18uZW5kKCk7ICkKKyAgewogICAgIGlmIChub3cgPT0gMExMKSB7CiAgICAgICBub3cgPSBVdGlsOjpjdXJyZW50VGltZSgpOwogICAgIH0KLSAgICBpZiAodGFzay0+Z2V0RXhwaXJlVGltZSgpID4gbm93KSB7Ci0gICAgICBicmVhazsKKworICAgIGlmICgoKml0KS0+Z2V0RXhwaXJlVGltZSgpID4gMExMICYmICgqaXQpLT5nZXRFeHBpcmVUaW1lKCkgPCBub3cpIHsKKyAgICAgIGlmIChleHBpcmVDYWxsYmFja18pIHsKKyAgICAgICAgZXhwaXJlQ2FsbGJhY2tfKCgqaXQpLT5nZXRSdW5uYWJsZSgpKTsKKyAgICAgIH0KKyAgICAgIGl0ID0gdGFza3NfLmVyYXNlKGl0KTsKKyAgICAgICsrZXhwaXJlZENvdW50XzsKKyAgICAgIGlmIChqdXN0T25lKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KICAgICB9Ci0gICAgaWYgKGV4cGlyZUNhbGxiYWNrXykgewotICAgICAgZXhwaXJlQ2FsbGJhY2tfKHRhc2stPmdldFJ1bm5hYmxlKCkpOworICAgIGVsc2UKKyAgICB7CisgICAgICArK2l0OwogICAgIH0KLSAgICB0YXNrc18ucG9wKCk7Ci0gICAgZXhwaXJlZENvdW50XysrOwogICB9CiB9CiAKIHZvaWQgVGhyZWFkTWFuYWdlcjo6SW1wbDo6c2V0RXhwaXJlQ2FsbGJhY2soRXhwaXJlQ2FsbGJhY2sgZXhwaXJlQ2FsbGJhY2spIHsKKyAgR3VhcmQgZyhtdXRleF8pOwogICBleHBpcmVDYWxsYmFja18gPSBleHBpcmVDYWxsYmFjazsKIH0KIApAQCAtNTQ1LDcgKzU2OSw2IEBACiBwcml2YXRlOgogICBjb25zdCBzaXplX3Qgd29ya2VyQ291bnRfOwogICBjb25zdCBzaXplX3QgcGVuZGluZ1Rhc2tDb3VudE1heF87Ci0gIE1vbml0b3IgbW9uaXRvcl87CiB9OwogCiBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IFRocmVhZE1hbmFnZXI6Om5ld1RocmVhZE1hbmFnZXIoKSB7CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuaAppbmRleCAyMTEyODQ1Li40NzBmYzBhIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmgKQEAgLTIwLDggKzIwLDggQEAKICNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9USFJFQURNQU5BR0VSX0hfCiAjZGVmaW5lIF9USFJJRlRfQ09OQ1VSUkVOQ1lfVEhSRUFETUFOQUdFUl9IXyAxCiAKLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLSNpbmNsdWRlIDx0aHJpZnQvY3h4ZnVuY3Rpb25hbC5oPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWQuaD4KIApAQCAtNTksNyArNTksNyBAQAogICBUaHJlYWRNYW5hZ2VyKCkge30KIAogcHVibGljOgotICB0eXBlZGVmIGFwYWNoZTo6dGhyaWZ0OjpzdGRjeHg6OmZ1bmN0aW9uPHZvaWQoYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+KT4gRXhwaXJlQ2FsbGJhY2s7CisgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4pPiBFeHBpcmVDYWxsYmFjazsKIAogICB2aXJ0dWFsIH5UaHJlYWRNYW5hZ2VyKCkge30KIApAQCAtNzEsMzAgKzcxLDQ1IEBACiAKICAgLyoqCiAgICAqIFN0b3BzIHRoZSB0aHJlYWQgbWFuYWdlci4gQWJvcnRzIGFsbCByZW1haW5pbmcgdW5wcm9jZXNzZWQgdGFzaywgc2h1dHMKLSAgICogZG93biBhbGwgY3JlYXRlZCB3b3JrZXIgdGhyZWFkcywgYW5kIHJlYWxlYXNlcyBhbGwgYWxsb2NhdGVkIHJlc291cmNlcy4KKyAgICogZG93biBhbGwgY3JlYXRlZCB3b3JrZXIgdGhyZWFkcywgYW5kIHJlbGVhc2VzIGFsbCBhbGxvY2F0ZWQgcmVzb3VyY2VzLgogICAgKiBUaGlzIG1ldGhvZCBibG9ja3MgZm9yIGFsbCB3b3JrZXIgdGhyZWFkcyB0byBjb21wbGV0ZSwgdGh1cyBpdCBjYW4KICAgICogcG90ZW50aWFsbHkgYmxvY2sgZm9yZXZlciBpZiBhIHdvcmtlciB0aHJlYWQgaXMgcnVubmluZyBhIHRhc2sgdGhhdAogICAgKiB3b24ndCB0ZXJtaW5hdGUuCisgICAqCisgICAqIFdvcmtlciB0aHJlYWRzIHdpbGwgYmUgam9pbmVkIGRlcGVuZGluZyBvbiB0aGUgdGhyZWFkRmFjdG9yeSdzIGRldGFjaGVkCisgICAqIGRpc3Bvc2l0aW9uLgogICAgKi8KICAgdmlydHVhbCB2b2lkIHN0b3AoKSA9IDA7CiAKLSAgLyoqCi0gICAqIEpvaW5zIHRoZSB0aHJlYWQgbWFuYWdlci4gVGhpcyBpcyB0aGUgc2FtZSBhcyBzdG9wLCBleGNlcHQgdGhhdCBpdCB3aWxsCi0gICAqIGJsb2NrIHVudGlsIGFsbCB0aGUgd29ya2VycyBoYXZlIGZpbmlzaGVkIHRoZWlyIHdvcmsuIEF0IHRoYXQgcG9pbnQKLSAgICogdGhlIFRocmVhZE1hbmFnZXIgd2lsbCB0cmFuc2l0aW9uIGludG8gdGhlIFNUT1BQRUQgc3RhdGUuCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgam9pbigpID0gMDsKLQogICBlbnVtIFNUQVRFIHsgVU5JTklUSUFMSVpFRCwgU1RBUlRJTkcsIFNUQVJURUQsIEpPSU5JTkcsIFNUT1BQSU5HLCBTVE9QUEVEIH07CiAKICAgdmlydHVhbCBTVEFURSBzdGF0ZSgpIGNvbnN0ID0gMDsKIAotICB2aXJ0dWFsIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkoKSBjb25zdCA9IDA7CisgIC8qKgorICAgKiBccmV0dXJucyB0aGUgY3VycmVudCB0aHJlYWQgZmFjdG9yeQorICAgKi8KKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeSgpIGNvbnN0ID0gMDsKIAotICB2aXJ0dWFsIHZvaWQgdGhyZWFkRmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRGYWN0b3J5PiB2YWx1ZSkgPSAwOworICAvKioKKyAgICogU2V0IHRoZSB0aHJlYWQgZmFjdG9yeS4KKyAgICogXHRocm93cyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIG5ldyB0aHJlYWQgZmFjdG9yeSBoYXMgYSBkaWZmZXJlbnQKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWNoZWQgZGlzcG9zaXRpb24gdGhhbiB0aGUgb25lIHJlcGxhY2luZyBpdAorICAgKi8KKyAgdmlydHVhbCB2b2lkIHRocmVhZEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRocmVhZEZhY3Rvcnk+IHZhbHVlKSA9IDA7CiAKKyAgLyoqCisgICAqIEFkZHMgd29ya2VyIHRocmVhZChzKS4KKyAgICovCiAgIHZpcnR1YWwgdm9pZCBhZGRXb3JrZXIoc2l6ZV90IHZhbHVlID0gMSkgPSAwOwogCisgIC8qKgorICAgKiBSZW1vdmVzIHdvcmtlciB0aHJlYWQocykuCisgICAqIFRocmVhZHMgYXJlIGpvaW5lZCBpZiB0aGUgdGhyZWFkIGZhY3RvcnkgZGV0YWNoZWQgZGlzcG9zaXRpb24gYWxsb3dzIGl0LgorICAgKiBCbG9ja3MgdW50aWwgdGhlIG51bWJlciBvZiB3b3JrZXIgdGhyZWFkcyByZWFjaGVzIHRoZSBuZXcgbGltaXQuCisgICAqIFxwYXJhbVtpbl0gIHZhbHVlICB0aGUgbnVtYmVyIHRvIHJlbW92ZQorICAgKiBcdGhyb3dzIEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Ygd29ya2VycworICAgKi8KICAgdmlydHVhbCB2b2lkIHJlbW92ZVdvcmtlcihzaXplX3QgdmFsdWUgPSAxKSA9IDA7CiAKICAgLyoqCkBAIC0xMjMsNyArMTM4LDggQEAKICAgdmlydHVhbCBzaXplX3QgcGVuZGluZ1Rhc2tDb3VudE1heCgpIGNvbnN0ID0gMDsKIAogICAvKioKLSAgICogR2V0cyB0aGUgbnVtYmVyIG9mIHRhc2tzIHdoaWNoIGhhdmUgYmVlbiBleHBpcmVkIHdpdGhvdXQgYmVpbmcgcnVuLgorICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgdGFza3Mgd2hpY2ggaGF2ZSBiZWVuIGV4cGlyZWQgd2l0aG91dCBiZWluZyBydW4KKyAgICogc2luY2Ugc3RhcnQoKSB3YXMgY2FsbGVkLgogICAgKi8KICAgdmlydHVhbCBzaXplX3QgZXhwaXJlZFRhc2tDb3VudCgpID0gMDsKIApAQCAtMTQ2LDIxICsxNjIsMjEgQEAKICAgICoKICAgICogQHRocm93cyBUb29NYW55UGVuZGluZ1Rhc2tzRXhjZXB0aW9uIFBlbmRpbmcgdGFzayBjb3VudCBleGNlZWRzIG1heCBwZW5kaW5nIHRhc2sgY291bnQKICAgICovCi0gIHZpcnR1YWwgdm9pZCBhZGQoYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2ssCisgIHZpcnR1YWwgdm9pZCBhZGQoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrLAogICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZW91dCA9IDBMTCwKICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGV4cGlyYXRpb24gPSAwTEwpID0gMDsKIAogICAvKioKICAgICogUmVtb3ZlcyBhIHBlbmRpbmcgdGFzawogICAgKi8KLSAgdmlydHVhbCB2b2lkIHJlbW92ZShib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzaykgPSAwOworICB2aXJ0dWFsIHZvaWQgcmVtb3ZlKHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzaykgPSAwOwogCiAgIC8qKgogICAgKiBSZW1vdmUgdGhlIG5leHQgcGVuZGluZyB0YXNrIHdoaWNoIHdvdWxkIGJlIHJ1bi4KICAgICoKICAgICogQHJldHVybiB0aGUgdGFzayByZW1vdmVkLgogICAgKi8KLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcmVtb3ZlTmV4dFBlbmRpbmcoKSA9IDA7CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiByZW1vdmVOZXh0UGVuZGluZygpID0gMDsKIAogICAvKioKICAgICogUmVtb3ZlIHRhc2tzIGZyb20gZnJvbnQgb2YgdGFzayBxdWV1ZSB0aGF0IGhhdmUgZXhwaXJlZC4KQEAgLTE3NSwxNCArMTkxLDE0IEBACiAgICAqLwogICB2aXJ0dWFsIHZvaWQgc2V0RXhwaXJlQ2FsbGJhY2soRXhwaXJlQ2FsbGJhY2sgZXhwaXJlQ2FsbGJhY2spID0gMDsKIAotICBzdGF0aWMgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gbmV3VGhyZWFkTWFuYWdlcigpOworICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IG5ld1RocmVhZE1hbmFnZXIoKTsKIAogICAvKioKICAgICogQ3JlYXRlcyBhIHNpbXBsZSB0aHJlYWQgbWFuYWdlciB0aGUgdXNlcyBjb3VudCBudW1iZXIgb2Ygd29ya2VyIHRocmVhZHMgYW5kIGhhcwogICAgKiBhIHBlbmRpbmdUYXNrQ291bnRNYXggbWF4aW11bSBwZW5kaW5nIHRhc2tzLiBUaGUgZGVmYXVsdCwgMCwgc3BlY2lmaWVkIG5vIGxpbWl0CiAgICAqIG9uIHBlbmRpbmcgdGFza3MKICAgICovCi0gIHN0YXRpYyBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiBuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKHNpemVfdCBjb3VudCA9IDQsCisgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gbmV3U2ltcGxlVGhyZWFkTWFuYWdlcihzaXplX3QgY291bnQgPSA0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcGVuZGluZ1Rhc2tDb3VudE1heCA9IDApOwogCiAgIGNsYXNzIFRhc2s7CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVGltZXJNYW5hZ2VyLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaW1lck1hbmFnZXIuY3BwCmluZGV4IDEyMmQyNmUuLjYxYTM0ZmYgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaW1lck1hbmFnZXIuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaW1lck1hbmFnZXIuY3BwCkBAIC0yOSw3ICsyOSw4IEBACiBuYW1lc3BhY2UgdGhyaWZ0IHsKIG5hbWVzcGFjZSBjb25jdXJyZW5jeSB7CiAKLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwordXNpbmcgc3RkOjp3ZWFrX3B0cjsKIAogLyoqCiAgKiBUaW1lck1hbmFnZXIgY2xhc3MKQEAgLTUyLDYgKzUzLDEwIEBACiAgICAgfQogICB9CiAKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHNoYXJlZF9wdHI8UnVubmFibGU+ICYgcnVubmFibGUpIGNvbnN0IHsgcmV0dXJuIHJ1bm5hYmxlXyA9PSBydW5uYWJsZTsgfQorCisgIHRhc2tfaXRlcmF0b3IgaXRfOworCiBwcml2YXRlOgogICBzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZV87CiAgIGZyaWVuZCBjbGFzcyBUaW1lck1hbmFnZXI6OkRpc3BhdGNoZXI7CkBAIC0xMDYsNiArMTExLDcgQEAKICAgICAgICAgICBmb3IgKHRhc2tfaXRlcmF0b3IgaXggPSBtYW5hZ2VyXy0+dGFza01hcF8uYmVnaW4oKTsgaXggIT0gZXhwaXJlZFRhc2tFbmQ7IGl4KyspIHsKICAgICAgICAgICAgIHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyOjpUYXNrPiB0YXNrID0gaXgtPnNlY29uZDsKICAgICAgICAgICAgIGV4cGlyZWRUYXNrcy5pbnNlcnQodGFzayk7CisgICAgICAgICAgICB0YXNrLT5pdF8gPSBtYW5hZ2VyXy0+dGFza01hcF8uZW5kKCk7CiAgICAgICAgICAgICBpZiAodGFzay0+c3RhdGVfID09IFRpbWVyTWFuYWdlcjo6VGFzazo6V0FJVElORykgewogICAgICAgICAgICAgICB0YXNrLT5zdGF0ZV8gPSBUaW1lck1hbmFnZXI6OlRhc2s6OkVYRUNVVElORzsKICAgICAgICAgICAgIH0KQEAgLTE2Miw4ICsxNjgsNyBAQAogICAgIHRyeSB7CiAgICAgICBzdG9wKCk7CiAgICAgfSBjYXRjaCAoLi4uKSB7Ci0gICAgICB0aHJvdzsKLSAgICAgIC8vIHVob2gKKyAgICAgIC8vIFdlJ3JlIHJlYWxseSBob3NlZC4KICAgICB9CiAgIH0KIH0KQEAgLTIzNCw3ICsyMzksNyBAQAogICByZXR1cm4gdGFza0NvdW50XzsKIH0KIAotdm9pZCBUaW1lck1hbmFnZXI6OmFkZChzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrLCBpbnQ2NF90IHRpbWVvdXQpIHsKK1RpbWVyTWFuYWdlcjo6VGltZXIgVGltZXJNYW5hZ2VyOjphZGQoc2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzaywgaW50NjRfdCB0aW1lb3V0KSB7CiAgIGludDY0X3Qgbm93ID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKICAgdGltZW91dCArPSBub3c7CiAKQEAgLTI0OSw5ICsyNTQsOSBAQAogICAgIC8vIGJlY2F1c2UgdGhlIG5ldyB0YXNrIG1pZ2h0IGluc2VydCBhdCB0aGUgZnJvbnQuCiAgICAgYm9vbCBub3RpZnlSZXF1aXJlZCA9ICh0YXNrQ291bnRfID09IDApID8gdHJ1ZSA6IHRpbWVvdXQgPCB0YXNrTWFwXy5iZWdpbigpLT5maXJzdDsKIAorICAgIHNoYXJlZF9wdHI8VGFzaz4gdGltZXIobmV3IFRhc2sodGFzaykpOwogICAgIHRhc2tDb3VudF8rKzsKLSAgICB0YXNrTWFwXy5pbnNlcnQoCi0gICAgICAgIHN0ZDo6cGFpcjxpbnQ2NF90LCBzaGFyZWRfcHRyPFRhc2s+ID4odGltZW91dCwgc2hhcmVkX3B0cjxUYXNrPihuZXcgVGFzayh0YXNrKSkpKTsKKyAgICB0aW1lci0+aXRfID0gdGFza01hcF8uaW5zZXJ0KHN0ZDo6cGFpcjxpbnQ2NF90LCBzaGFyZWRfcHRyPFRhc2s+ID4odGltZW91dCwgdGltZXIpKTsKIAogICAgIC8vIElmIHRoZSB0YXNrIG1hcCB3YXMgZW1wdHksIG9yIGlmIHdlIGhhdmUgYW4gZXhwaXJhdGlvbiB0aGF0IGlzIGVhcmxpZXIKICAgICAvLyB0aGFuIGFueSBwcmV2aW91c2x5IHNlZW4sIGtpY2sgdGhlIGRpc3BhdGNoZXIgc28gaXQgY2FuIHVwZGF0ZSBpdHMKQEAgLTI1OSwxMCArMjY0LDEzIEBACiAgICAgaWYgKG5vdGlmeVJlcXVpcmVkKSB7CiAgICAgICBtb25pdG9yXy5ub3RpZnkoKTsKICAgICB9CisKKyAgICByZXR1cm4gdGltZXI7CiAgIH0KIH0KIAotdm9pZCBUaW1lck1hbmFnZXI6OmFkZChzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrLCBjb25zdCBzdHJ1Y3QgVEhSSUZUX1RJTUVTUEVDJiB2YWx1ZSkgeworVGltZXJNYW5hZ2VyOjpUaW1lciBUaW1lck1hbmFnZXI6OmFkZChzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrLAorICAgIGNvbnN0IHN0cnVjdCBUSFJJRlRfVElNRVNQRUMmIHZhbHVlKSB7CiAKICAgaW50NjRfdCBleHBpcmF0aW9uOwogICBVdGlsOjp0b01pbGxpc2Vjb25kcyhleHBpcmF0aW9uLCB2YWx1ZSk7CkBAIC0yNzMsMTAgKzI4MSwxMSBAQAogICAgIHRocm93IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigpOwogICB9CiAKLSAgYWRkKHRhc2ssIGV4cGlyYXRpb24gLSBub3cpOworICByZXR1cm4gYWRkKHRhc2ssIGV4cGlyYXRpb24gLSBub3cpOwogfQogCi12b2lkIFRpbWVyTWFuYWdlcjo6YWRkKHNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2ssIGNvbnN0IHN0cnVjdCB0aW1ldmFsJiB2YWx1ZSkgeworVGltZXJNYW5hZ2VyOjpUaW1lciBUaW1lck1hbmFnZXI6OmFkZChzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrLAorICAgIGNvbnN0IHN0cnVjdCB0aW1ldmFsJiB2YWx1ZSkgewogCiAgIGludDY0X3QgZXhwaXJhdGlvbjsKICAgVXRpbDo6dG9NaWxsaXNlY29uZHMoZXhwaXJhdGlvbiwgdmFsdWUpOwpAQCAtMjg3LDE1ICsyOTYsNDcgQEAKICAgICB0aHJvdyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oKTsKICAgfQogCi0gIGFkZCh0YXNrLCBleHBpcmF0aW9uIC0gbm93KTsKKyAgcmV0dXJuIGFkZCh0YXNrLCBleHBpcmF0aW9uIC0gbm93KTsKIH0KIAogdm9pZCBUaW1lck1hbmFnZXI6OnJlbW92ZShzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrKSB7Ci0gICh2b2lkKXRhc2s7CiAgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKICAgaWYgKHN0YXRlXyAhPSBUaW1lck1hbmFnZXI6OlNUQVJURUQpIHsKICAgICB0aHJvdyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKICAgfQorICBib29sIGZvdW5kID0gZmFsc2U7CisgIGZvciAodGFza19pdGVyYXRvciBpeCA9IHRhc2tNYXBfLmJlZ2luKCk7IGl4ICE9IHRhc2tNYXBfLmVuZCgpOykgeworICAgIGlmICgqaXgtPnNlY29uZCA9PSB0YXNrKSB7CisgICAgICBmb3VuZCA9IHRydWU7CisgICAgICB0YXNrQ291bnRfLS07CisgICAgICB0YXNrTWFwXy5lcmFzZShpeCsrKTsKKyAgICB9IGVsc2UgeworICAgICAgKytpeDsKKyAgICB9CisgIH0KKyAgaWYgKCFmb3VuZCkgeworICAgIHRocm93IE5vU3VjaFRhc2tFeGNlcHRpb24oKTsKKyAgfQorfQorCit2b2lkIFRpbWVyTWFuYWdlcjo6cmVtb3ZlKFRpbWVyIGhhbmRsZSkgeworICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7CisgIGlmIChzdGF0ZV8gIT0gVGltZXJNYW5hZ2VyOjpTVEFSVEVEKSB7CisgICAgdGhyb3cgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgIH0KKworICBzaGFyZWRfcHRyPFRhc2s+IHRhc2sgPSBoYW5kbGUubG9jaygpOworICBpZiAoIXRhc2spIHsKKyAgICB0aHJvdyBOb1N1Y2hUYXNrRXhjZXB0aW9uKCk7CisgIH0KKworICBpZiAodGFzay0+aXRfID09IHRhc2tNYXBfLmVuZCgpKSB7CisgICAgLy8gVGFzayBpcyBiZWluZyBleGVjdXRlZAorICAgIHRocm93IFVuY2FuY2VsbGFibGVUYXNrRXhjZXB0aW9uKCk7CisgIH0KKworICB0YXNrTWFwXy5lcmFzZSh0YXNrLT5pdF8pOworICB0YXNrQ291bnRfLS07CiB9CiAKIFRpbWVyTWFuYWdlcjo6U1RBVEUgVGltZXJNYW5hZ2VyOjpzdGF0ZSgpIGNvbnN0IHsKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaW1lck1hbmFnZXIuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaW1lck1hbmFnZXIuaAppbmRleCAzOTQ2ODI3Li5iYTc5MjI2IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVGltZXJNYW5hZ2VyLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlci5oCkBAIC0yNCw3ICsyNCw3IEBACiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuaD4KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkLmg+CiAKLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8bWFwPgogI2luY2x1ZGUgPHRpbWUuaD4KIApAQCAtNDIsMTMgKzQyLDE2IEBACiBjbGFzcyBUaW1lck1hbmFnZXIgewogCiBwdWJsaWM6CisgIGNsYXNzIFRhc2s7CisgIHR5cGVkZWYgc3RkOjp3ZWFrX3B0cjxUYXNrPiBUaW1lcjsKKwogICBUaW1lck1hbmFnZXIoKTsKIAogICB2aXJ0dWFsIH5UaW1lck1hbmFnZXIoKTsKIAotICB2aXJ0dWFsIGJvb3N0OjpzaGFyZWRfcHRyPGNvbnN0IFRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkoKSBjb25zdDsKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgVGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeSgpIGNvbnN0OwogCi0gIHZpcnR1YWwgdm9pZCB0aHJlYWRGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPGNvbnN0IFRocmVhZEZhY3Rvcnk+IHZhbHVlKTsKKyAgdmlydHVhbCB2b2lkIHRocmVhZEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFRocmVhZEZhY3Rvcnk+IHZhbHVlKTsKIAogICAvKioKICAgICogU3RhcnRzIHRoZSB0aW1lciBtYW5hZ2VyIHNlcnZpY2UKQEAgLTY5LDI4ICs3MiwzMyBAQAogICAgKgogICAgKiBAcGFyYW0gdGFzayBUaGUgdGFzayB0byBleGVjdXRlCiAgICAqIEBwYXJhbSB0aW1lb3V0IFRpbWUgaW4gbWlsbGlzZWNvbmRzIHRvIGRlbGF5IGJlZm9yZSBleGVjdXRpbmcgdGFzaworICAgKiBAcmV0dXJuIEhhbmRsZSBvZiB0aGUgdGltZXIsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHJlbW92ZSB0aGUgdGltZXIuCiAgICAqLwotICB2aXJ0dWFsIHZvaWQgYWRkKGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrLCBpbnQ2NF90IHRpbWVvdXQpOworICB2aXJ0dWFsIFRpbWVyIGFkZChzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2ssIGludDY0X3QgdGltZW91dCk7CiAKICAgLyoqCiAgICAqIEFkZHMgYSB0YXNrIHRvIGJlIGV4ZWN1dGVkIGF0IHNvbWUgdGltZSBpbiB0aGUgZnV0dXJlIGJ5IGEgd29ya2VyIHRocmVhZC4KICAgICoKICAgICogQHBhcmFtIHRhc2sgVGhlIHRhc2sgdG8gZXhlY3V0ZQogICAgKiBAcGFyYW0gdGltZW91dCBBYnNvbHV0ZSB0aW1lIGluIHRoZSBmdXR1cmUgdG8gZXhlY3V0ZSB0YXNrLgorICAgKiBAcmV0dXJuIEhhbmRsZSBvZiB0aGUgdGltZXIsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHJlbW92ZSB0aGUgdGltZXIuCiAgICAqLwotICB2aXJ0dWFsIHZvaWQgYWRkKGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrLCBjb25zdCBzdHJ1Y3QgVEhSSUZUX1RJTUVTUEVDJiB0aW1lb3V0KTsKKyAgdmlydHVhbCBUaW1lciBhZGQoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrLCBjb25zdCBzdHJ1Y3QgVEhSSUZUX1RJTUVTUEVDJiB0aW1lb3V0KTsKIAogICAvKioKICAgICogQWRkcyBhIHRhc2sgdG8gYmUgZXhlY3V0ZWQgYXQgc29tZSB0aW1lIGluIHRoZSBmdXR1cmUgYnkgYSB3b3JrZXIgdGhyZWFkLgogICAgKgogICAgKiBAcGFyYW0gdGFzayBUaGUgdGFzayB0byBleGVjdXRlCiAgICAqIEBwYXJhbSB0aW1lb3V0IEFic29sdXRlIHRpbWUgaW4gdGhlIGZ1dHVyZSB0byBleGVjdXRlIHRhc2suCisgICAqIEByZXR1cm4gSGFuZGxlIG9mIHRoZSB0aW1lciwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gcmVtb3ZlIHRoZSB0aW1lci4KICAgICovCi0gIHZpcnR1YWwgdm9pZCBhZGQoYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2ssIGNvbnN0IHN0cnVjdCB0aW1ldmFsJiB0aW1lb3V0KTsKKyAgdmlydHVhbCBUaW1lciBhZGQoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrLCBjb25zdCBzdHJ1Y3QgdGltZXZhbCYgdGltZW91dCk7CiAKICAgLyoqCiAgICAqIFJlbW92ZXMgYSBwZW5kaW5nIHRhc2sKICAgICoKKyAgICogQHBhcmFtIHRhc2sgVGhlIHRhc2sgdG8gcmVtb3ZlLiBBbGwgdGltZXJzIHdoaWNoIGV4ZWN1dGUgdGhpcyB0YXNrIHdpbGwKKyAgICogYmUgcmVtb3ZlZC4KICAgICogQHRocm93cyBOb1N1Y2hUYXNrRXhjZXB0aW9uIFNwZWNpZmllZCB0YXNrIGRvZXNuJ3QgZXhpc3QuIEl0IHdhcyBlaXRoZXIKICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZCBhbHJlYWR5IG9yIHRoaXMgY2FsbCB3YXMgbWFkZSBmb3IgYQogICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFzayB0aGF0IHdhcyBuZXZlciBhZGRlZCB0byB0aGlzIHRpbWVyCkBAIC05OCwyNSArMTA2LDM4IEBACiAgICAqIEB0aHJvd3MgVW5jYW5jZWxsYWJsZVRhc2tFeGNlcHRpb24gU3BlY2lmaWVkIHRhc2sgaXMgYWxyZWFkeSBiZWluZwogICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVkIG9yIGhhcyBjb21wbGV0ZWQgZXhlY3V0aW9uLgogICAgKi8KLSAgdmlydHVhbCB2b2lkIHJlbW92ZShib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzayk7CisgIHZpcnR1YWwgdm9pZCByZW1vdmUoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrKTsKKworICAvKioKKyAgICogUmVtb3ZlcyBhIHNpbmdsZSBwZW5kaW5nIHRhc2sKKyAgICoKKyAgICogQHBhcmFtIHRpbWVyIFRoZSB0aW1lciB0byByZW1vdmUuIFRoZSB0aW1lciBpcyByZXR1cm5lZCB3aGVuIGNhbGxpbmcgdGhlCisgICAqIGFkZCgpIG1ldGhvZC4KKyAgICogQHRocm93cyBOb1N1Y2hUYXNrRXhjZXB0aW9uIFNwZWNpZmllZCB0YXNrIGRvZXNuJ3QgZXhpc3QuIEl0IHdhcyBlaXRoZXIKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZCBhbHJlYWR5IG9yIHRoaXMgY2FsbCB3YXMgbWFkZSBmb3IgYQorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFzayB0aGF0IHdhcyBuZXZlciBhZGRlZCB0byB0aGlzIHRpbWVyCisgICAqCisgICAqIEB0aHJvd3MgVW5jYW5jZWxsYWJsZVRhc2tFeGNlcHRpb24gU3BlY2lmaWVkIHRhc2sgaXMgYWxyZWFkeSBiZWluZworICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVkIG9yIGhhcyBjb21wbGV0ZWQgZXhlY3V0aW9uLgorICAgKi8KKyAgdmlydHVhbCB2b2lkIHJlbW92ZShUaW1lciB0aW1lcik7CiAKICAgZW51bSBTVEFURSB7IFVOSU5JVElBTElaRUQsIFNUQVJUSU5HLCBTVEFSVEVELCBTVE9QUElORywgU1RPUFBFRCB9OwogCiAgIHZpcnR1YWwgU1RBVEUgc3RhdGUoKSBjb25zdDsKIAogcHJpdmF0ZToKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8Y29uc3QgVGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeV87Ci0gIGNsYXNzIFRhc2s7CisgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5XzsKICAgZnJpZW5kIGNsYXNzIFRhc2s7Ci0gIHN0ZDo6bXVsdGltYXA8aW50NjRfdCwgYm9vc3Q6OnNoYXJlZF9wdHI8VGFzaz4gPiB0YXNrTWFwXzsKKyAgc3RkOjptdWx0aW1hcDxpbnQ2NF90LCBzdGQ6OnNoYXJlZF9wdHI8VGFzaz4gPiB0YXNrTWFwXzsKICAgc2l6ZV90IHRhc2tDb3VudF87CiAgIE1vbml0b3IgbW9uaXRvcl87CiAgIFNUQVRFIHN0YXRlXzsKICAgY2xhc3MgRGlzcGF0Y2hlcjsKICAgZnJpZW5kIGNsYXNzIERpc3BhdGNoZXI7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPERpc3BhdGNoZXI+IGRpc3BhdGNoZXJfOwotICBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWQ+IGRpc3BhdGNoZXJUaHJlYWRfOwotICB0eXBlZGVmIHN0ZDo6bXVsdGltYXA8aW50NjRfdCwgYm9vc3Q6OnNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyOjpUYXNrPiA+OjppdGVyYXRvciB0YXNrX2l0ZXJhdG9yOworICBzdGQ6OnNoYXJlZF9wdHI8RGlzcGF0Y2hlcj4gZGlzcGF0Y2hlcl87CisgIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+IGRpc3BhdGNoZXJUaHJlYWRfOworICB0eXBlZGVmIHN0ZDo6bXVsdGltYXA8aW50NjRfdCwgc3RkOjpzaGFyZWRfcHRyPFRpbWVyTWFuYWdlcjo6VGFzaz4gPjo6aXRlcmF0b3IgdGFza19pdGVyYXRvcjsKICAgdHlwZWRlZiBzdGQ6OnBhaXI8dGFza19pdGVyYXRvciwgdGFza19pdGVyYXRvcj4gdGFza19yYW5nZTsKIH07CiB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVXRpbC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1V0aWwuaAppbmRleCBiYTA3MGI2Li4xYTkxNTk5IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVXRpbC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9VdGlsLmgKQEAgLTk4LDcgKzk4LDcgQEAKICAgICogQ29udmVydHMgc3RydWN0IHRpbWV2YWwgdG8gYXJiaXRyYXJ5LXNpemVkIHRpY2tzIHNpbmNlIGVwb2NoCiAgICAqLwogICBzdGF0aWMgdm9pZCB0b1RpY2tzKGludDY0X3QmIHJlc3VsdCwgY29uc3Qgc3RydWN0IHRpbWV2YWwmIHZhbHVlLCBpbnQ2NF90IHRpY2tzUGVyU2VjKSB7Ci0gICAgcmV0dXJuIHRvVGlja3MocmVzdWx0LCB2YWx1ZS50dl9zZWMsIHZhbHVlLnR2X3VzZWMsIFVTX1BFUl9TLCB0aWNrc1BlclNlYyk7CisgICAgcmV0dXJuIHRvVGlja3MocmVzdWx0LCAodW5zaWduZWQgbG9uZyl2YWx1ZS50dl9zZWMsICh1bnNpZ25lZCBsb25nKXZhbHVlLnR2X3VzZWMsIFVTX1BFUl9TLCB0aWNrc1BlclNlYyk7CiAgIH0KIAogICAvKioKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9jeHhmdW5jdGlvbmFsLmggYi9saWIvY3BwL3NyYy90aHJpZnQvY3h4ZnVuY3Rpb25hbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWRhYWMzLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9jeHhmdW5jdGlvbmFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfQ1hYRlVOQ1RJT05BTF9IXwotI2RlZmluZSBfVEhSSUZUX0NYWEZVTkNUSU9OQUxfSF8gMQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLS8qKgotICogTG9hZHMgPGZ1bmN0aW9uYWw+IGZyb20gdGhlICdyaWdodCcgbG9jYXRpb24sIGRlcGVuZGluZwotICogb24gY29tcGlsZXIgYW5kIHdoZXRoZXIgb3Igbm90IGl0J3MgdXNpbmcgQysrMDMgd2l0aCBUUjEKLSAqIG9yIEMrKzExLgotICovCi0KLS8qCi0gKiBNU1ZDIDEwIGFuZCAxMSBoYXZlIHRoZSA8ZnVuY3Rpb25hbD4gc3R1ZmYgYXQgPGZ1bmN0aW9uYWw+LgotICogSW4gTVNWQyAxMCBhbGwgb2YgdGhlIGltcGxlbWVudGF0aW9ucyBsaXZlIGluIHN0ZDo6dHIxLgotICogSW4gTVNWQyAxMSBhbGwgb2YgdGhlIGltcGxlbWVudGF0aW9ucyBsaXZlIGluIHN0ZCwgd2l0aCBhbGlhc2VzCi0gKiAgaW4gc3RkOjp0cjEgdG8gcG9pbnQgdG8gdGhlIG9uZXMgaW4gc3RkLgotICovCi0jaWZkZWYgX1dJTjMyCi0gICNkZWZpbmUgX1RIUklGVF9VU0lOR19NSUNST1NPRlRfU1RETElCIDEKLSNlbmRpZgotCi0jaWZkZWYgX19jbGFuZ19fCi0gIC8qIENsYW5nIGhhcyB0d28gb3B0aW9ucywgZGVwZW5kaW5nIG9uIHN0YW5kYXJkIGxpYnJhcnk6Ci0gICAqIC0gbm8gLXN0ZGxpYiBvciAtc3RkbGliPWxpYnN0ZGMrKyBzZXQ7IHVzZXMgR05VIGxpYnN0ZGMrKy4KLSAgICogICAgPHRyMS9mdW5jdGlvbmFsPgotICAgKiAtIC1zdGRsaWI9bGliYysrOyB1c2VzIExMVk0gbGliYysrLgotICAgKiAgICA8ZnVuY3Rpb25hbD4sIG5vICdzdGQ6OnRyMScuCi0gICAqCi0gICAqIFRoZSBjb21waWxlciBpdHNlbGYgZG9lc24ndCBkZWZpbmUgYW55dGhpbmcgZGlmZmVyZW50bHkKLSAgICogZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiAtc3RkbGliLCBidXQgdGhlIGxpYnJhcnkgaGVhZGVycwotICAgKiB3aWxsIHNldCBkaWZmZXJlbnQgcHJlcHJvY2Vzc29yIG9wdGlvbnMuIEluIG9yZGVyIHRvIGNoZWNrLAotICAgKiB0aG91Z2gsIHdlIGhhdmUgdG8gcHVsbCBpbiBzb21lIGxpYnJhcnkgaGVhZGVyLgotICAgKi8KLSAgI2luY2x1ZGUgPHV0aWxpdHk+Ci0KLSAgLyogV2l0aCBMTFZNIGxpYmMrKywgdXRpbGl0eSBwdWxscyBpbiBfX2NvbmZpZywgd2hpY2ggc2V0cwotICAgICBfTElCQ1BQX1ZFUlNJT04uICovCi0gICNpZiBkZWZpbmVkKF9MSUJDUFBfVkVSU0lPTikKLSAgICAjZGVmaW5lIF9USFJJRlRfVVNJTkdfQ0xBTkdfTElCQ1hYIDEKLQotICAvKiBXaXRoIEdOVSBsaWJzdGRjKyssIHV0aWxpdHkgcHVsbHMgaW4gYml0cy9jKytjb25maWcuaCwKLSAgICAgd2hpY2ggc2V0cyBfX0dMSUJDWFhfXy4gKi8KLSAgI2VsaWYgZGVmaW5lZChfX0dMSUJDWFhfXykKLSAgICAjZGVmaW5lIF9USFJJRlRfVVNJTkdfR05VX0xJQlNURENYWCAxCi0KLSAgLyogTm8gaWRlYS4gKi8KLSAgI2Vsc2UKLSAgICAjZXJyb3IgVW5hYmxlIHRvIGRldGVjdCB3aGljaCBDKysgc3RhbmRhcmQgbGlicmFyeSBpcyBpbiB1c2UuCi0gICNlbmRpZgotI2VsaWYgX19HTlVDX18KLSAgI2RlZmluZSBfVEhSSUZUX1VTSU5HX0dOVV9MSUJTVERDWFggMQotI2VuZGlmCi0KLSNpZiBfVEhSSUZUX1VTSU5HX01JQ1JPU09GVF9TVERMSUIKLSAgI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0KLSAgbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2Ugc3RkY3h4IHsKLSAgICB1c2luZyA6OnN0ZDo6dHIxOjpmdW5jdGlvbjsKLSAgICB1c2luZyA6OnN0ZDo6dHIxOjpiaW5kOwotCi0gICAgbmFtZXNwYWNlIHBsYWNlaG9sZGVycyB7Ci0gICAgICB1c2luZyA6OnN0ZDo6dHIxOjpwbGFjZWhvbGRlcnM6Ol8xOwotICAgICAgdXNpbmcgOjpzdGQ6OnRyMTo6cGxhY2Vob2xkZXJzOjpfMjsKLSAgICAgIHVzaW5nIDo6c3RkOjp0cjE6OnBsYWNlaG9sZGVyczo6XzM7Ci0gICAgICB1c2luZyA6OnN0ZDo6dHIxOjpwbGFjZWhvbGRlcnM6Ol80OwotICAgICAgdXNpbmcgOjpzdGQ6OnRyMTo6cGxhY2Vob2xkZXJzOjpfNTsKLSAgICAgIHVzaW5nIDo6c3RkOjp0cjE6OnBsYWNlaG9sZGVyczo6XzY7Ci0gICAgfSAvLyBhcGFjaGU6OnRocmlmdDo6c3RkY3h4OjpwbGFjZWhvbGRlcnMKLSAgfX19IC8vIGFwYWNoZTo6dGhyaWZ0OjpzdGRjeHgKLQotI2VsaWYgX1RIUklGVF9VU0lOR19DTEFOR19MSUJDWFgKLSAgI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0KLSAgbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2Ugc3RkY3h4IHsKLSAgICB1c2luZyA6OnN0ZDo6ZnVuY3Rpb247Ci0gICAgdXNpbmcgOjpzdGQ6OmJpbmQ7Ci0KLSAgICBuYW1lc3BhY2UgcGxhY2Vob2xkZXJzIHsKLSAgICAgIHVzaW5nIDo6c3RkOjpwbGFjZWhvbGRlcnM6Ol8xOwotICAgICAgdXNpbmcgOjpzdGQ6OnBsYWNlaG9sZGVyczo6XzI7Ci0gICAgICB1c2luZyA6OnN0ZDo6cGxhY2Vob2xkZXJzOjpfMzsKLSAgICAgIHVzaW5nIDo6c3RkOjpwbGFjZWhvbGRlcnM6Ol80OwotICAgICAgdXNpbmcgOjpzdGQ6OnBsYWNlaG9sZGVyczo6XzU7Ci0gICAgICB1c2luZyA6OnN0ZDo6cGxhY2Vob2xkZXJzOjpfNjsKLSAgICB9IC8vIGFwYWNoZTo6dGhyaWZ0OjpzdGRjeHg6OnBsYWNlaG9sZGVycwotICB9fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnN0ZGN4eAotCi0jZWxpZiBfVEhSSUZUX1VTSU5HX0dOVV9MSUJTVERDWFgKLSAgI2luY2x1ZGUgPHRyMS9mdW5jdGlvbmFsPgotCi0gIG5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHN0ZGN4eCB7Ci0gICAgdXNpbmcgOjpzdGQ6OnRyMTo6ZnVuY3Rpb247Ci0gICAgdXNpbmcgOjpzdGQ6OnRyMTo6YmluZDsKLQotICAgIG5hbWVzcGFjZSBwbGFjZWhvbGRlcnMgewotICAgICAgdXNpbmcgOjpzdGQ6OnRyMTo6cGxhY2Vob2xkZXJzOjpfMTsKLSAgICAgIHVzaW5nIDo6c3RkOjp0cjE6OnBsYWNlaG9sZGVyczo6XzI7Ci0gICAgICB1c2luZyA6OnN0ZDo6dHIxOjpwbGFjZWhvbGRlcnM6Ol8zOwotICAgICAgdXNpbmcgOjpzdGQ6OnRyMTo6cGxhY2Vob2xkZXJzOjpfNDsKLSAgICAgIHVzaW5nIDo6c3RkOjp0cjE6OnBsYWNlaG9sZGVyczo6XzU7Ci0gICAgICB1c2luZyA6OnN0ZDo6dHIxOjpwbGFjZWhvbGRlcnM6Ol82OwotICAgIH0gLy8gYXBhY2hlOjp0aHJpZnQ6OnN0ZGN4eDo6cGxhY2Vob2xkZXJzCi0gIH19fSAvLyBhcGFjaGU6OnRocmlmdDo6c3RkY3h4Ci0jZW5kaWYKLQotICAvLyBBbGlhcyBmb3IgdGhyaWZ0IGMrKyBjb21wYXRpYmlsaXR5IG5hbWVzcGFjZQotICBuYW1lc3BhY2UgdGN4eCA9IGFwYWNoZTo6dGhyaWZ0OjpzdGRjeHg7Ci0KLSNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfQ1hYRlVOQ1RJT05BTF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb2Nlc3Nvci9QZWVrUHJvY2Vzc29yLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm9jZXNzb3IvUGVla1Byb2Nlc3Nvci5jcHAKaW5kZXggOGM5YTQ2My4uMDdmNmJhNSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb2Nlc3Nvci9QZWVrUHJvY2Vzc29yLmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvY2Vzc29yL1BlZWtQcm9jZXNzb3IuY3BwCkBAIC0zNCwyNiArMzQsMjYgQEAKIFBlZWtQcm9jZXNzb3I6On5QZWVrUHJvY2Vzc29yKCkgewogfQogCi12b2lkIFBlZWtQcm9jZXNzb3I6OmluaXRpYWxpemUoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gYWN0dWFsUHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUGlwZWRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5KSB7Cit2b2lkIFBlZWtQcm9jZXNzb3I6OmluaXRpYWxpemUoc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IGFjdHVhbFByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUGlwZWRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5KSB7CiAgIGFjdHVhbFByb2Nlc3Nvcl8gPSBhY3R1YWxQcm9jZXNzb3I7CiAgIHBpcGVkUHJvdG9jb2xfID0gcHJvdG9jb2xGYWN0b3J5LT5nZXRQcm90b2NvbCh0YXJnZXRUcmFuc3BvcnRfKTsKICAgdHJhbnNwb3J0RmFjdG9yeV8gPSB0cmFuc3BvcnRGYWN0b3J5OwogICB0cmFuc3BvcnRGYWN0b3J5Xy0+aW5pdGlhbGl6ZVRhcmdldFRyYW5zcG9ydCh0YXJnZXRUcmFuc3BvcnRfKTsKIH0KIAotYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gUGVla1Byb2Nlc3Nvcjo6Z2V0UGlwZWRUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gaW4pIHsKK3N0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBQZWVrUHJvY2Vzc29yOjpnZXRQaXBlZFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gaW4pIHsKICAgcmV0dXJuIHRyYW5zcG9ydEZhY3RvcnlfLT5nZXRUcmFuc3BvcnQoaW4pOwogfQogCi12b2lkIFBlZWtQcm9jZXNzb3I6OnNldFRhcmdldFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0YXJnZXRUcmFuc3BvcnQpIHsKK3ZvaWQgUGVla1Byb2Nlc3Nvcjo6c2V0VGFyZ2V0VHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0YXJnZXRUcmFuc3BvcnQpIHsKICAgdGFyZ2V0VHJhbnNwb3J0XyA9IHRhcmdldFRyYW5zcG9ydDsKLSAgaWYgKGJvb3N0OjpkeW5hbWljX3BvaW50ZXJfY2FzdDxUTWVtb3J5QnVmZmVyPih0YXJnZXRUcmFuc3BvcnRfKSkgewotICAgIG1lbW9yeUJ1ZmZlcl8gPSBib29zdDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VE1lbW9yeUJ1ZmZlcj4odGFyZ2V0VHJhbnNwb3J0KTsKLSAgfSBlbHNlIGlmIChib29zdDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VFBpcGVkVHJhbnNwb3J0Pih0YXJnZXRUcmFuc3BvcnRfKSkgewotICAgIG1lbW9yeUJ1ZmZlcl8gPSBib29zdDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VE1lbW9yeUJ1ZmZlcj4oCi0gICAgICAgIGJvb3N0OjpkeW5hbWljX3BvaW50ZXJfY2FzdDxUUGlwZWRUcmFuc3BvcnQ+KHRhcmdldFRyYW5zcG9ydF8pLT5nZXRUYXJnZXRUcmFuc3BvcnQoKSk7CisgIGlmIChzdGQ6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFRNZW1vcnlCdWZmZXI+KHRhcmdldFRyYW5zcG9ydF8pKSB7CisgICAgbWVtb3J5QnVmZmVyXyA9IHN0ZDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VE1lbW9yeUJ1ZmZlcj4odGFyZ2V0VHJhbnNwb3J0KTsKKyAgfSBlbHNlIGlmIChzdGQ6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFRQaXBlZFRyYW5zcG9ydD4odGFyZ2V0VHJhbnNwb3J0XykpIHsKKyAgICBtZW1vcnlCdWZmZXJfID0gc3RkOjpkeW5hbWljX3BvaW50ZXJfY2FzdDxUTWVtb3J5QnVmZmVyPigKKyAgICAgICAgc3RkOjpkeW5hbWljX3BvaW50ZXJfY2FzdDxUUGlwZWRUcmFuc3BvcnQ+KHRhcmdldFRyYW5zcG9ydF8pLT5nZXRUYXJnZXRUcmFuc3BvcnQoKSk7CiAgIH0KIAogICBpZiAoIW1lbW9yeUJ1ZmZlcl8pIHsKQEAgLTYyLDggKzYyLDggQEAKICAgfQogfQogCi1ib29sIFBlZWtQcm9jZXNzb3I6OnByb2Nlc3MoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dCwKK2Jvb2wgUGVla1Byb2Nlc3Nvcjo6cHJvY2VzcyhzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY29ubmVjdGlvbkNvbnRleHQpIHsKIAogICBzdGQ6OnN0cmluZyBmbmFtZTsKQEAgLTEyMCw3ICsxMjAsNyBAQAogICAodm9pZClzaXplOwogfQogCi12b2lkIFBlZWtQcm9jZXNzb3I6OnBlZWsoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBpbiwgVFR5cGUgZnR5cGUsIGludDE2X3QgZmlkKSB7Cit2b2lkIFBlZWtQcm9jZXNzb3I6OnBlZWsoc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW4sIFRUeXBlIGZ0eXBlLCBpbnQxNl90IGZpZCkgewogICAodm9pZClmaWQ7CiAgIGluLT5za2lwKGZ0eXBlKTsKIH0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm9jZXNzb3IvUGVla1Byb2Nlc3Nvci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb2Nlc3Nvci9QZWVrUHJvY2Vzc29yLmgKaW5kZXggMjFjNTk5OS4uZWZhYzJiOSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb2Nlc3Nvci9QZWVrUHJvY2Vzc29yLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb2Nlc3Nvci9QZWVrUHJvY2Vzc29yLmgKQEAgLTI1LDcgKzI1LDcgQEAKICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAKIG5hbWVzcGFjZSBhcGFjaGUgewogbmFtZXNwYWNlIHRocmlmdCB7CkBAIC00NywzNCArNDcsMzQgQEAKICAgLy8gICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSAtIHRoaXMgVFBpcGVkVHJhbnNwb3J0RmFjdG9yeSBpcyB1c2VkIHRvIHdyYXAgdGhlIHNvdXJjZSB0cmFuc3BvcnQKICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpYSBhIGNhbGwgdG8gZ2V0UGlwZWRUcmFuc3BvcnQKICAgdm9pZCBpbml0aWFsaXplKAotICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I+IGFjdHVhbFByb2Nlc3NvciwKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5LAotICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFBpcGVkVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeSk7CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I+IGFjdHVhbFByb2Nlc3NvciwKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeSwKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUUGlwZWRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5KTsKIAotICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0PiBnZXRQaXBlZFRyYW5zcG9ydCgKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ+IGluKTsKKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ+IGdldFBpcGVkVHJhbnNwb3J0KAorICAgICAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ+IGluKTsKIAotICB2b2lkIHNldFRhcmdldFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0PiB0YXJnZXRUcmFuc3BvcnQpOworICB2b2lkIHNldFRhcmdldFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydD4gdGFyZ2V0VHJhbnNwb3J0KTsKIAotICB2aXJ0dWFsIGJvb2wgcHJvY2Vzcyhib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gaW4sCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBvdXQsCisgIHZpcnR1YWwgYm9vbCBwcm9jZXNzKHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gaW4sCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0LAogICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjb25uZWN0aW9uQ29udGV4dCk7CiAKICAgLy8gVGhlIGZvbGxvd2luZyB0aHJlZSBmdW5jdGlvbnMgY2FuIGJlIG92ZXJsb2FkZWQgYnkgY2hpbGQgY2xhc3NlcyB0bwogICAvLyBhY2hpZXZlIGRlc2lyZWQgcGVla2luZyBiZWhhdmlvcgogICB2aXJ0dWFsIHZvaWQgcGVla05hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIGZuYW1lKTsKICAgdmlydHVhbCB2b2lkIHBlZWtCdWZmZXIodWludDhfdCogYnVmZmVyLCB1aW50MzJfdCBzaXplKTsKLSAgdmlydHVhbCB2b2lkIHBlZWsoYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IGluLAorICB2aXJ0dWFsIHZvaWQgcGVlayhzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IGluLAogICAgICAgICAgICAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlIGZ0eXBlLAogICAgICAgICAgICAgICAgICAgICBpbnQxNl90IGZpZCk7CiAgIHZpcnR1YWwgdm9pZCBwZWVrRW5kKCk7CiAKIHByaXZhdGU6Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yPiBhY3R1YWxQcm9jZXNzb3JfOwotICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcGlwZWRQcm90b2NvbF87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRQaXBlZFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3RvcnlfOwotICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyPiBtZW1vcnlCdWZmZXJfOwotICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0PiB0YXJnZXRUcmFuc3BvcnRfOworICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I+IGFjdHVhbFByb2Nlc3Nvcl87CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcGlwZWRQcm90b2NvbF87CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUUGlwZWRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5XzsKKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI+IG1lbW9yeUJ1ZmZlcl87CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0PiB0YXJnZXRUcmFuc3BvcnRfOwogfTsKIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm9jZXNzb3IvU3RhdHNQcm9jZXNzb3IuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm9jZXNzb3IvU3RhdHNQcm9jZXNzb3IuaAppbmRleCBlOGNhMDY3Li5lOThlZmI4IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvY2Vzc29yL1N0YXRzUHJvY2Vzc29yLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb2Nlc3Nvci9TdGF0c1Byb2Nlc3Nvci5oCkBAIC0yMCw3ICsyMCw3IEBACiAjaWZuZGVmIFNUQVRTUFJPQ0VTU09SX0gKICNkZWZpbmUgU1RBVFNQUk9DRVNTT1JfSAogCi0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+CisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5oPgogI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaD4KICNpbmNsdWRlIDxUUHJvY2Vzc29yLmg+CkBAIC0zOCw4ICszOCw4IEBACiAgIFN0YXRzUHJvY2Vzc29yKGJvb2wgcHJpbnQsIGJvb2wgZnJlcXVlbmN5KSA6IHByaW50XyhwcmludCksIGZyZXF1ZW5jeV8oZnJlcXVlbmN5KSB7fQogICB2aXJ0dWFsIH5TdGF0c1Byb2Nlc3Nvcigpe307CiAKLSAgdmlydHVhbCBib29sIHByb2Nlc3MoYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHBpcHJvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHBvcHJvdCwKKyAgdmlydHVhbCBib29sIHByb2Nlc3Moc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwaXByb3QsCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcG9wcm90LAogICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBzZXJ2ZXJDb250ZXh0KSB7CiAKICAgICBwaXByb3RfID0gcGlwcm90OwpAQCAtMjI5LDcgKzIyOSw3IEBACiAgICAgfQogICB9CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHBpcHJvdF87CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcGlwcm90XzsKICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludDY0X3Q+IGZyZXF1ZW5jeV9tYXBfOwogCiAgIGJvb2wgcHJpbnRfOwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb2Nlc3Nvci9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm9jZXNzb3IvVE11bHRpcGxleGVkUHJvY2Vzc29yLmgKaW5kZXggMGVmNzI2MS4uMmFhN2Y3NSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb2Nlc3Nvci9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvY2Vzc29yL1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5oCkBAIC0yNyw4ICsyNyw2IEBACiAKIG5hbWVzcGFjZSBhcGFjaGUgewogbmFtZXNwYWNlIHRocmlmdCB7Ci11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKLQogbmFtZXNwYWNlIHByb3RvY29sIHsKIAogLyoqCkBAIC0zOCw3ICszNiw3IEBACiAgKi8KIGNsYXNzIFN0b3JlZE1lc3NhZ2VQcm90b2NvbCA6IHB1YmxpYyBUUHJvdG9jb2xEZWNvcmF0b3IgewogcHVibGljOgotICBTdG9yZWRNZXNzYWdlUHJvdG9jb2woc2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBfcHJvdG9jb2wsCisgIFN0b3JlZE1lc3NhZ2VQcm90b2NvbChzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gX3Byb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIF9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE1lc3NhZ2VUeXBlIF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBfc2VxaWQpCkBAIC02NywxOSArNjUsMTkgQEAKICAqIHByb2Nlc3NvcnMgd2l0aCBpdCwgYXMgc2hvd24gaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlOjwvcD4KICAqCiAgKiA8YmxvY2txdW90ZT48Y29kZT4KLSAqICAgICBzaGFyZWRfcHRyPFRNdWx0aXBsZXhlZFByb2Nlc3Nvcj4gcHJvY2Vzc29yKG5ldyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IoKSk7CisgKiAgICAgc3RkOjpzaGFyZWRfcHRyPFRNdWx0aXBsZXhlZFByb2Nlc3Nvcj4gcHJvY2Vzc29yKG5ldyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IoKSk7CiAgKgogICogICAgIHByb2Nlc3Nvci0+cmVnaXN0ZXJQcm9jZXNzb3IoCiAgKiAgICAgICAgICJDYWxjdWxhdG9yIiwKLSAqICAgICAgICAgc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiggbmV3IENhbGN1bGF0b3JQcm9jZXNzb3IoCi0gKiAgICAgICAgICAgICBzaGFyZWRfcHRyPENhbGN1bGF0b3JIYW5kbGVyPiggbmV3IENhbGN1bGF0b3JIYW5kbGVyKCkpKSkpOworICogICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4oIG5ldyBDYWxjdWxhdG9yUHJvY2Vzc29yKAorICogICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENhbGN1bGF0b3JIYW5kbGVyPiggbmV3IENhbGN1bGF0b3JIYW5kbGVyKCkpKSkpOwogICoKICAqICAgICBwcm9jZXNzb3ItPnJlZ2lzdGVyUHJvY2Vzc29yKAogICogICAgICAgICAiV2VhdGhlclJlcG9ydCIsCi0gKiAgICAgICAgIHNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4oIG5ldyBXZWF0aGVyUmVwb3J0UHJvY2Vzc29yKAotICogICAgICAgICAgICAgc2hhcmVkX3B0cjxXZWF0aGVyUmVwb3J0SGFuZGxlcj4oIG5ldyBXZWF0aGVyUmVwb3J0SGFuZGxlcigpKSkpKTsKKyAqICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+KCBuZXcgV2VhdGhlclJlcG9ydFByb2Nlc3NvcigKKyAqICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxXZWF0aGVyUmVwb3J0SGFuZGxlcj4oIG5ldyBXZWF0aGVyUmVwb3J0SGFuZGxlcigpKSkpKTsKICAqCi0gKiAgICAgc2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiB0cmFuc3BvcnQobmV3IFRTZXJ2ZXJTb2NrZXQoOTA5MCkpOworICogICAgIHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiB0cmFuc3BvcnQobmV3IFRTZXJ2ZXJTb2NrZXQoOTA5MCkpOwogICogICAgIFRTaW1wbGVTZXJ2ZXIgc2VydmVyKHByb2Nlc3NvciwgdHJhbnNwb3J0KTsKICAqCiAgKiAgICAgc2VydmVyLnNlcnZlKCk7CkBAIC04Nyw3ICs4NSw3IEBACiAgKi8KIGNsYXNzIFRNdWx0aXBsZXhlZFByb2Nlc3NvciA6IHB1YmxpYyBUUHJvY2Vzc29yIHsKIHB1YmxpYzoKLSAgdHlwZWRlZiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiA+IHNlcnZpY2VzX3Q7CisgIHR5cGVkZWYgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiA+IHNlcnZpY2VzX3Q7CiAKICAgLyoqCiAgICAgKiAnUmVnaXN0ZXInIGEgc2VydmljZSB3aXRoIHRoaXMgPGNvZGU+VE11bHRpcGxleGVkUHJvY2Vzc29yPC9jb2RlPi4gIFRoaXMKQEAgLTEwMCwxMSArOTgsNDEgQEAKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIGFzICJoYW5kbGVycyIsIGUuZy4gV2VhdGhlclJlcG9ydEhhbmRsZXIsCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRpbmcgV2VhdGhlclJlcG9ydElmIGludGVyZmFjZS4KICAgICAqLwotICB2b2lkIHJlZ2lzdGVyUHJvY2Vzc29yKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXJ2aWNlTmFtZSwgc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IpIHsKKyAgdm9pZCByZWdpc3RlclByb2Nlc3Nvcihjb25zdCBzdGQ6OnN0cmluZyYgc2VydmljZU5hbWUsIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IpIHsKICAgICBzZXJ2aWNlc1tzZXJ2aWNlTmFtZV0gPSBwcm9jZXNzb3I7CiAgIH0KIAogICAvKioKKyAgICogUmVnaXN0ZXIgYSBzZXJ2aWNlIHRvIGJlIGNhbGxlZCB0byBwcm9jZXNzIHF1ZXJpZXMgd2l0aG91dCBzZXJ2aWNlIG5hbWUKKyAgICogXHBhcmFtIFtpbl0gcHJvY2Vzc29yICAgSW1wbGVtZW50YXRpb24gb2YgYSBzZXJ2aWNlLgorICAgKi8KKyAgdm9pZCByZWdpc3RlckRlZmF1bHQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IpIHsKKyAgICBkZWZhdWx0UHJvY2Vzc29yID0gcHJvY2Vzc29yOworICB9CisKKyAgLyoqCisgICAqIENoZXcgdXAgaW52YWxpZCBpbnB1dCBhbmQgcmV0dXJuIGFuIGV4Y2VwdGlvbiB0byB0aHJvdy4KKyAgICovCisgIFRFeGNlcHRpb24gcHJvdG9jb2xfZXJyb3Ioc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2VxaWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtc2cpIGNvbnN0IHsKKyAgICBpbi0+c2tpcCg6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVFJVQ1QpOworICAgIGluLT5yZWFkTWVzc2FnZUVuZCgpOworICAgIGluLT5nZXRUcmFuc3BvcnQoKS0+cmVhZEVuZCgpOworICAgIDo6YXBhY2hlOjp0aHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbgorICAgICAgeCg6OmFwYWNoZTo6dGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb246OlBST1RPQ09MX0VSUk9SLAorICAgICAgICAiVE11bHRpcGxleGVkUHJvY2Vzc29yOiAiICsgbXNnKTsKKyAgICBvdXQtPndyaXRlTWVzc2FnZUJlZ2luKG5hbWUsIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0VYQ0VQVElPTiwgc2VxaWQpOworICAgIHgud3JpdGUob3V0LmdldCgpKTsKKyAgICBvdXQtPndyaXRlTWVzc2FnZUVuZCgpOworICAgIG91dC0+Z2V0VHJhbnNwb3J0KCktPndyaXRlRW5kKCk7CisgICAgb3V0LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsKKyAgICByZXR1cm4gVEV4Y2VwdGlvbihtc2cpOworfQorICAgCisgIC8qKgogICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIDxjb2RlPnByb2Nlc3M8L2NvZGU+IHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgc3RlcHM6CiAgICAqCiAgICAqIDxvbD4KQEAgLTExOSw4ICsxNDcsOCBAQAogICAgKiB0aGUgc2VydmljZSBuYW1lIHdhcyBub3QgZm91bmQgaW4gdGhlIG1lc3NhZ2UsIG9yIGlmIHRoZSBzZXJ2aWNlCiAgICAqIG5hbWUgd2FzIG5vdCBmb3VuZCBpbiB0aGUgc2VydmljZSBtYXAuCiAgICAqLwotICBib29sIHByb2Nlc3Moc2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbiwKLSAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0LAorICBib29sIHByb2Nlc3Moc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGluLAorICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dCwKICAgICAgICAgICAgICAgIHZvaWQqIGNvbm5lY3Rpb25Db250ZXh0KSB7CiAgICAgc3RkOjpzdHJpbmcgbmFtZTsKICAgICBwcm90b2NvbDo6VE1lc3NhZ2VUeXBlIHR5cGU7CkBAIC0xMzMsMjIgKzE2MSwxMCBAQAogCiAgICAgaWYgKHR5cGUgIT0gcHJvdG9jb2w6OlRfQ0FMTCAmJiB0eXBlICE9IHByb3RvY29sOjpUX09ORVdBWSkgewogICAgICAgLy8gVW5leHBlY3RlZCBtZXNzYWdlIHR5cGUuCi0gICAgICBpbi0+c2tpcCg6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVFJVQ1QpOwotICAgICAgaW4tPnJlYWRNZXNzYWdlRW5kKCk7Ci0gICAgICBpbi0+Z2V0VHJhbnNwb3J0KCktPnJlYWRFbmQoKTsKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG1zZygiVE11bHRpcGxleGVkUHJvY2Vzc29yOiBVbmV4cGVjdGVkIG1lc3NhZ2UgdHlwZSIpOwotICAgICAgOjphcGFjaGU6OnRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uCi0gICAgICAgICAgeCg6OmFwYWNoZTo6dGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb246OlBST1RPQ09MX0VSUk9SLCBtc2cpOwotICAgICAgb3V0LT53cml0ZU1lc3NhZ2VCZWdpbihuYW1lLCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9FWENFUFRJT04sIHNlcWlkKTsKLSAgICAgIHgud3JpdGUob3V0LmdldCgpKTsKLSAgICAgIG91dC0+d3JpdGVNZXNzYWdlRW5kKCk7Ci0gICAgICBvdXQtPmdldFRyYW5zcG9ydCgpLT53cml0ZUVuZCgpOwotICAgICAgb3V0LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsKLSAgICAgIHRocm93IFRFeGNlcHRpb24obXNnKTsKKyAgICAgIHRocm93IHByb3RvY29sX2Vycm9yKGluLCBvdXQsIG5hbWUsIHNlcWlkLCAiVW5leHBlY3RlZCBtZXNzYWdlIHR5cGUiKTsKICAgICB9CiAKICAgICAvLyBFeHRyYWN0IHRoZSBzZXJ2aWNlIG5hbWUKLQogICAgIGJvb3N0Ojp0b2tlbml6ZXI8Ym9vc3Q6OmNoYXJfc2VwYXJhdG9yPGNoYXI+ID4gdG9rKG5hbWUsIGJvb3N0OjpjaGFyX3NlcGFyYXRvcjxjaGFyPigiOiIpKTsKIAogICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB0b2tlbnM7CkBAIC0xNjEsMzkgKzE3Nyw0NiBAQAogICAgICAgc2VydmljZXNfdDo6aXRlcmF0b3IgaXQgPSBzZXJ2aWNlcy5maW5kKHRva2Vuc1swXSk7CiAKICAgICAgIGlmIChpdCAhPSBzZXJ2aWNlcy5lbmQoKSkgewotICAgICAgICBzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciA9IGl0LT5zZWNvbmQ7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IgPSBpdC0+c2Vjb25kOwogICAgICAgICAvLyBMZXQgdGhlIHByb2Nlc3NvciByZWdpc3RlcmVkIGZvciB0aGlzIHNlcnZpY2UgbmFtZQogICAgICAgICAvLyBwcm9jZXNzIHRoZSBtZXNzYWdlLgogICAgICAgICByZXR1cm4gcHJvY2Vzc29yCi0gICAgICAgICAgICAtPnByb2Nlc3Moc2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPigKKyAgICAgICAgICAgIC0+cHJvY2VzcyhzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBwcm90b2NvbDo6U3RvcmVkTWVzc2FnZVByb3RvY29sKGluLCB0b2tlbnNbMV0sIHR5cGUsIHNlcWlkKSksCiAgICAgICAgICAgICAgICAgICAgICAgb3V0LAogICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25Db250ZXh0KTsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIFVua25vd24gc2VydmljZS4KLSAgICAgICAgaW4tPnNraXAoOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RSVUNUKTsKLSAgICAgICAgaW4tPnJlYWRNZXNzYWdlRW5kKCk7Ci0gICAgICAgIGluLT5nZXRUcmFuc3BvcnQoKS0+cmVhZEVuZCgpOwotCi0gICAgICAgIHN0ZDo6c3RyaW5nIG1zZygiVE11bHRpcGxleGVkUHJvY2Vzc29yOiBVbmtub3duIHNlcnZpY2U6ICIpOwotICAgICAgICBtc2cgKz0gdG9rZW5zWzBdOwotICAgICAgICA6OmFwYWNoZTo6dGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb24KLSAgICAgICAgICAgIHgoOjphcGFjaGU6OnRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpQUk9UT0NPTF9FUlJPUiwgbXNnKTsKLSAgICAgICAgb3V0LT53cml0ZU1lc3NhZ2VCZWdpbihuYW1lLCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9FWENFUFRJT04sIHNlcWlkKTsKLSAgICAgICAgeC53cml0ZShvdXQuZ2V0KCkpOwotICAgICAgICBvdXQtPndyaXRlTWVzc2FnZUVuZCgpOwotICAgICAgICBvdXQtPmdldFRyYW5zcG9ydCgpLT53cml0ZUVuZCgpOwotICAgICAgICBvdXQtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOwotICAgICAgICBtc2cgKz0gIi4gRGlkIHlvdSBmb3JnZXQgdG8gY2FsbCByZWdpc3RlclByb2Nlc3NvcigpPyI7Ci0gICAgICAgIHRocm93IFRFeGNlcHRpb24obXNnKTsKKyAgICAgICAgdGhyb3cgcHJvdG9jb2xfZXJyb3IoaW4sIG91dCwgbmFtZSwgc2VxaWQsIAorICAgICAgICAgICAgIlVua25vd24gc2VydmljZTogIiArIHRva2Vuc1swXSArCisJCQkJIi4gRGlkIHlvdSBmb3JnZXQgdG8gY2FsbCByZWdpc3RlclByb2Nlc3NvcigpPyIpOwogICAgICAgfQorICAgIH0gZWxzZSBpZiAodG9rZW5zLnNpemUoKSA9PSAxKSB7CisJICBpZiAoZGVmYXVsdFByb2Nlc3NvcikgeworICAgICAgICAvLyBub24tbXVsdGlwbGV4ZWQgY2xpZW50IGZvcndhcmRzIHRvIGRlZmF1bHQgcHJvY2Vzc29yCisgICAgICAgIHJldHVybiBkZWZhdWx0UHJvY2Vzc29yICAgICAgICAgICAgCisgICAgICAgICAgICAtPnByb2Nlc3Moc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+KAorICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgcHJvdG9jb2w6OlN0b3JlZE1lc3NhZ2VQcm90b2NvbChpbiwgdG9rZW5zWzBdLCB0eXBlLCBzZXFpZCkpLAorICAgICAgICAgICAgICAgICAgICAgIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uQ29udGV4dCk7CisJICB9IGVsc2UgeworCQl0aHJvdyBwcm90b2NvbF9lcnJvcihpbiwgb3V0LCBuYW1lLCBzZXFpZCwKKwkJCSJOb24tbXVsdGlwbGV4ZWQgY2xpZW50IHJlcXVlc3QgZHJvcHBlZC4gIgorCQkJIkRpZCB5b3UgZm9yZ2V0IHRvIGNhbGwgZGVmYXVsdFByb2Nlc3NvcigpPyIpOworCSAgfQorICAgIH0gZWxzZSB7CisJCXRocm93IHByb3RvY29sX2Vycm9yKGluLCBvdXQsIG5hbWUsIHNlcWlkLAorCQkgICAgIldyb25nIG51bWJlciBvZiB0b2tlbnMuIik7CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKICAgfQogCiBwcml2YXRlOgogICAvKiogTWFwIG9mIHNlcnZpY2UgcHJvY2Vzc29yIG9iamVjdHMsIGluZGV4ZWQgYnkgc2VydmljZSBuYW1lcy4gKi8KICAgc2VydmljZXNfdCBzZXJ2aWNlczsKKyAgCisgIC8vISBJZiBhIG5vbi1tdWx0aSBjbGllbnQgcmVxdWVzdHMgc29tZXRoaW5nLCBpdCBnb2VzIHRvIHRoZQorICAvLyEgZGVmYXVsdCBwcm9jZXNzb3IgKGlmIG9uZSBpcyBkZWZpbmVkKSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBkZWZhdWx0UHJvY2Vzc29yOwogfTsKIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQmFzZTY0VXRpbHMuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RCYXNlNjRVdGlscy5jcHAKaW5kZXggYmViNzZlYi4uNzQ3NGY1YSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RCYXNlNjRVdGlscy5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RCYXNlNjRVdGlscy5jcHAKQEAgLTE5LDggKzE5LDYgQEAKIAogI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmFzZTY0VXRpbHMuaD4KIAotI2luY2x1ZGUgPGJvb3N0L3N0YXRpY19hc3NlcnQuaHBwPgotCiB1c2luZyBzdGQ6OnN0cmluZzsKIAogbmFtZXNwYWNlIGFwYWNoZSB7CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmggYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmgKaW5kZXggZTA2NTBjZi4uOTA2Nzc1OCAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaApAQCAtMjMsNyArMjMsNyBAQAogI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaD4KICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFZpcnR1YWxQcm90b2NvbC5oPgogCi0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+CisjaW5jbHVkZSA8bWVtb3J5PgogCiBuYW1lc3BhY2UgYXBhY2hlIHsKIG5hbWVzcGFjZSB0aHJpZnQgewpAQCAtMzYsMTMgKzM2LDEyIEBACiAgKi8KIHRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfID0gVE5ldHdvcmtCaWdFbmRpYW4+CiBjbGFzcyBUQmluYXJ5UHJvdG9jb2xUIDogcHVibGljIFRWaXJ0dWFsUHJvdG9jb2w8VEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPiA+IHsKLXByb3RlY3RlZDoKK3B1YmxpYzoKICAgc3RhdGljIGNvbnN0IGludDMyX3QgVkVSU0lPTl9NQVNLID0gKChpbnQzMl90KTB4ZmZmZjAwMDApOwogICBzdGF0aWMgY29uc3QgaW50MzJfdCBWRVJTSU9OXzEgPSAoKGludDMyX3QpMHg4MDAxMDAwMCk7CiAgIC8vIFZFUlNJT05fMiAoMHg4MDAyMDAwMCkgd2FzIHRha2VuIGJ5IFREZW5zZVByb3RvY29sICh3aGljaCBoYXMgc2luY2UgYmVlbiByZW1vdmVkKQogCi1wdWJsaWM6Ci0gIFRCaW5hcnlQcm90b2NvbFQoYm9vc3Q6OnNoYXJlZF9wdHI8VHJhbnNwb3J0Xz4gdHJhbnMpCisgIFRCaW5hcnlQcm90b2NvbFQoc3RkOjpzaGFyZWRfcHRyPFRyYW5zcG9ydF8+IHRyYW5zKQogICAgIDogVFZpcnR1YWxQcm90b2NvbDxUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+ID4odHJhbnMpLAogICAgICAgdHJhbnNfKHRyYW5zLmdldCgpKSwKICAgICAgIHN0cmluZ19saW1pdF8oMCksCkBAIC01MCw3ICs0OSw3IEBACiAgICAgICBzdHJpY3RfcmVhZF8oZmFsc2UpLAogICAgICAgc3RyaWN0X3dyaXRlXyh0cnVlKSB7fQogCi0gIFRCaW5hcnlQcm90b2NvbFQoYm9vc3Q6OnNoYXJlZF9wdHI8VHJhbnNwb3J0Xz4gdHJhbnMsCisgIFRCaW5hcnlQcm90b2NvbFQoc3RkOjpzaGFyZWRfcHRyPFRyYW5zcG9ydF8+IHRyYW5zLAogICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RyaW5nX2xpbWl0LAogICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29udGFpbmVyX2xpbWl0LAogICAgICAgICAgICAgICAgICAgIGJvb2wgc3RyaWN0X3JlYWQsCkBAIC0yMTMsMjYgKzIxMiwyNCBAQAogICAgIHN0cmljdF93cml0ZV8gPSBzdHJpY3Rfd3JpdGU7CiAgIH0KIAotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGdldFByb3RvY29sKGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSB7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VHJhbnNwb3J0Xz4gc3BlY2lmaWNfdHJhbnMgPSBib29zdDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VHJhbnNwb3J0Xz4odHJhbnMpOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBnZXRQcm90b2NvbChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VHJhbnNwb3J0Xz4gc3BlY2lmaWNfdHJhbnMgPSBzdGQ6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFRyYW5zcG9ydF8+KHRyYW5zKTsKICAgICBUUHJvdG9jb2wqIHByb3Q7CiAgICAgaWYgKHNwZWNpZmljX3RyYW5zKSB7Ci0gICAgICBwcm90ID0gbmV3IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz4oCi0gICAgICAgIHNwZWNpZmljX3RyYW5zLAotICAgICAgICBzdHJpbmdfbGltaXRfLAotICAgICAgICBjb250YWluZXJfbGltaXRfLAotICAgICAgICBzdHJpY3RfcmVhZF8sCi0gICAgICAgIHN0cmljdF93cml0ZV8pOworICAgICAgcHJvdCA9IG5ldyBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+KHNwZWNpZmljX3RyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19saW1pdF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyX2xpbWl0XywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpY3RfcmVhZF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWN0X3dyaXRlXyk7CiAgICAgfSBlbHNlIHsKLSAgICAgIHByb3QgPSBuZXcgVEJpbmFyeVByb3RvY29sVDxUVHJhbnNwb3J0LCBCeXRlT3JkZXJfPigKLSAgICAgICAgdHJhbnMsCi0gICAgICAgIHN0cmluZ19saW1pdF8sCi0gICAgICAgIGNvbnRhaW5lcl9saW1pdF8sCi0gICAgICAgIHN0cmljdF9yZWFkXywKLSAgICAgICAgc3RyaWN0X3dyaXRlXyk7CisgICAgICBwcm90ID0gbmV3IFRCaW5hcnlQcm90b2NvbFQ8VFRyYW5zcG9ydCwgQnl0ZU9yZGVyXz4odHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX2xpbWl0XywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJfbGltaXRfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmljdF9yZWFkXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpY3Rfd3JpdGVfKTsKICAgICB9CiAKLSAgICByZXR1cm4gYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPihwcm90KTsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4ocHJvdCk7CiAgIH0KIAogcHJpdmF0ZToKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wudGNjIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC50Y2MKaW5kZXggYWUzNTBkZi4uZmU3Mzk5MiAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC50Y2MKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC50Y2MKQEAgLTMwLDggKzMwLDggQEAKIAogdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+CiB1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+Ojp3cml0ZU1lc3NhZ2VCZWdpbihjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRNZXNzYWdlVHlwZSBtZXNzYWdlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc2VxaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRNZXNzYWdlVHlwZSBtZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc2VxaWQpIHsKICAgaWYgKHRoaXMtPnN0cmljdF93cml0ZV8pIHsKICAgICBpbnQzMl90IHZlcnNpb24gPSAoVkVSU0lPTl8xKSB8ICgoaW50MzJfdCltZXNzYWdlVHlwZSk7CiAgICAgdWludDMyX3Qgd3NpemUgPSAwOwpAQCAtNjYsOCArNjYsOCBAQAogCiB0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KIHVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OndyaXRlRmllbGRCZWdpbihjb25zdCBjaGFyKiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IGZpZWxkSWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSBmaWVsZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBmaWVsZElkKSB7CiAgICh2b2lkKW5hbWU7CiAgIHVpbnQzMl90IHdzaXplID0gMDsKICAgd3NpemUgKz0gd3JpdGVCeXRlKChpbnQ4X3QpZmllbGRUeXBlKTsKQEAgLTg3LDggKzg3LDggQEAKIAogdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+CiB1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+Ojp3cml0ZU1hcEJlZ2luKGNvbnN0IFRUeXBlIGtleVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIHZhbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgdmFsVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSkgewogICB1aW50MzJfdCB3c2l6ZSA9IDA7CiAgIHdzaXplICs9IHdyaXRlQnl0ZSgoaW50OF90KWtleVR5cGUpOwogICB3c2l6ZSArPSB3cml0ZUJ5dGUoKGludDhfdCl2YWxUeXBlKTsKQEAgLTEwMiw3ICsxMDIsOCBAQAogfQogCiB0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OndyaXRlTGlzdEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKSB7Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+Ojp3cml0ZUxpc3RCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKICAgdWludDMyX3Qgd3NpemUgPSAwOwogICB3c2l6ZSArPSB3cml0ZUJ5dGUoKGludDhfdCllbGVtVHlwZSk7CiAgIHdzaXplICs9IHdyaXRlSTMyKChpbnQzMl90KXNpemUpOwpAQCAtMTE1LDcgKzExNiw4IEBACiB9CiAKIHRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgotdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6d3JpdGVTZXRCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSkgewordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6d3JpdGVTZXRCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSkgewogICB1aW50MzJfdCB3c2l6ZSA9IDA7CiAgIHdzaXplICs9IHdyaXRlQnl0ZSgoaW50OF90KWVsZW1UeXBlKTsKICAgd3NpemUgKz0gd3JpdGVJMzIoKGludDMyX3Qpc2l6ZSk7CkBAIC0xNjMsOCArMTY1LDggQEAKIAogdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+CiB1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+Ojp3cml0ZURvdWJsZShjb25zdCBkb3VibGUgZHViKSB7Ci0gIEJPT1NUX1NUQVRJQ19BU1NFUlQoc2l6ZW9mKGRvdWJsZSkgPT0gc2l6ZW9mKHVpbnQ2NF90KSk7Ci0gIEJPT1NUX1NUQVRJQ19BU1NFUlQoc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+Ojppc19pZWM1NTkpOworICBzdGF0aWNfYXNzZXJ0KHNpemVvZihkb3VibGUpID09IHNpemVvZih1aW50NjRfdCksICJzaXplb2YoZG91YmxlKSA9PSBzaXplb2YodWludDY0X3QpIik7CisgIHN0YXRpY19hc3NlcnQoc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+Ojppc19pZWM1NTksICJzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmlzX2llYzU1OSIpOwogCiAgIHVpbnQ2NF90IGJpdHMgPSBiaXR3aXNlX2Nhc3Q8dWludDY0X3Q+KGR1Yik7CiAgIGJpdHMgPSBCeXRlT3JkZXJfOjp0b1dpcmU2NChiaXRzKTsKQEAgLTE5Niw4ICsxOTgsOCBAQAogCiB0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KIHVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OnJlYWRNZXNzYWdlQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRNZXNzYWdlVHlwZSYgbWVzc2FnZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIHNlcWlkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRNZXNzYWdlVHlwZSYgbWVzc2FnZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIHNlcWlkKSB7CiAgIHVpbnQzMl90IHJlc3VsdCA9IDA7CiAgIGludDMyX3Qgc3o7CiAgIHJlc3VsdCArPSByZWFkSTMyKHN6KTsKQEAgLTI0NSw4ICsyNDcsOCBAQAogCiB0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KIHVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OnJlYWRGaWVsZEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIGZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QmIGZpZWxkSWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlJiBmaWVsZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90JiBmaWVsZElkKSB7CiAgICh2b2lkKW5hbWU7CiAgIHVpbnQzMl90IHJlc3VsdCA9IDA7CiAgIGludDhfdCB0eXBlOwpAQCAtMjY3LDggKzI2OSw4IEBACiAKIHRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgogdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6cmVhZE1hcEJlZ2luKFRUeXBlJiBrZXlUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlJiB2YWxUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIHZhbFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpIHsKICAgaW50OF90IGssIHY7CiAgIHVpbnQzMl90IHJlc3VsdCA9IDA7CiAgIGludDMyX3Qgc2l6ZWk7CkBAIC0zODYsOCArMzg4LDggQEAKIAogdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+CiB1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+OjpyZWFkRG91YmxlKGRvdWJsZSYgZHViKSB7Ci0gIEJPT1NUX1NUQVRJQ19BU1NFUlQoc2l6ZW9mKGRvdWJsZSkgPT0gc2l6ZW9mKHVpbnQ2NF90KSk7Ci0gIEJPT1NUX1NUQVRJQ19BU1NFUlQoc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+Ojppc19pZWM1NTkpOworICBzdGF0aWNfYXNzZXJ0KHNpemVvZihkb3VibGUpID09IHNpemVvZih1aW50NjRfdCksICJzaXplb2YoZG91YmxlKSA9PSBzaXplb2YodWludDY0X3QpIik7CisgIHN0YXRpY19hc3NlcnQoc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+Ojppc19pZWM1NTksICJzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmlzX2llYzU1OSIpOwogCiAgIHVuaW9uIGJ5dGVzIHsKICAgICB1aW50OF90IGJbOF07CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuaAppbmRleCA1YjdhZGUyLi41Y2ZiNDdkIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmgKQEAgLTIzLDcgKzIzLDcgQEAKICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFZpcnR1YWxQcm90b2NvbC5oPgogCiAjaW5jbHVkZSA8c3RhY2s+Ci0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+CisjaW5jbHVkZSA8bWVtb3J5PgogCiBuYW1lc3BhY2UgYXBhY2hlIHsKIG5hbWVzcGFjZSB0aHJpZnQgewpAQCAtMzQsMTEgKzM0LDEyIEBACiAgKi8KIHRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgogY2xhc3MgVENvbXBhY3RQcm90b2NvbFQgOiBwdWJsaWMgVFZpcnR1YWxQcm90b2NvbDxUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPiA+IHsKLQotcHJvdGVjdGVkOgorcHVibGljOgogICBzdGF0aWMgY29uc3QgaW50OF90IFBST1RPQ09MX0lEID0gKGludDhfdCkweDgydTsKICAgc3RhdGljIGNvbnN0IGludDhfdCBWRVJTSU9OX04gPSAxOwogICBzdGF0aWMgY29uc3QgaW50OF90IFZFUlNJT05fTUFTSyA9IDB4MWY7ICAgICAgIC8vIDAwMDEgMTExMQorCitwcm90ZWN0ZWQ6CiAgIHN0YXRpYyBjb25zdCBpbnQ4X3QgVFlQRV9NQVNLID0gKGludDhfdCkweEUwdTsgLy8gMTExMCAwMDAwCiAgIHN0YXRpYyBjb25zdCBpbnQ4X3QgVFlQRV9CSVRTID0gMHgwNzsgICAgICAgICAgLy8gMDAwMCAwMTExCiAgIHN0YXRpYyBjb25zdCBpbnQzMl90IFRZUEVfU0hJRlRfQU1PVU5UID0gNTsKQEAgLTczLDcgKzc0LDcgQEAKICAgaW50MTZfdCBsYXN0RmllbGRJZF87CiAKIHB1YmxpYzoKLSAgVENvbXBhY3RQcm90b2NvbFQoYm9vc3Q6OnNoYXJlZF9wdHI8VHJhbnNwb3J0Xz4gdHJhbnMpCisgIFRDb21wYWN0UHJvdG9jb2xUKHN0ZDo6c2hhcmVkX3B0cjxUcmFuc3BvcnRfPiB0cmFucykKICAgICA6IFRWaXJ0dWFsUHJvdG9jb2w8VENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz4gPih0cmFucyksCiAgICAgICB0cmFuc18odHJhbnMuZ2V0KCkpLAogICAgICAgbGFzdEZpZWxkSWRfKDApLApAQCAtODUsNyArODYsNyBAQAogICAgIGJvb2xWYWx1ZV8uaGFzQm9vbFZhbHVlID0gZmFsc2U7CiAgIH0KIAotICBUQ29tcGFjdFByb3RvY29sVChib29zdDo6c2hhcmVkX3B0cjxUcmFuc3BvcnRfPiB0cmFucywKKyAgVENvbXBhY3RQcm90b2NvbFQoc3RkOjpzaGFyZWRfcHRyPFRyYW5zcG9ydF8+IHRyYW5zLAogICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0cmluZ19saW1pdCwKICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb250YWluZXJfbGltaXQpCiAgICAgOiBUVmlydHVhbFByb3RvY29sPFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+ID4odHJhbnMpLApAQCAtMjM4LDggKzIzOSw4IEBACiAKICAgdm9pZCBzZXRDb250YWluZXJTaXplTGltaXQoaW50MzJfdCBjb250YWluZXJfbGltaXQpIHsgY29udGFpbmVyX2xpbWl0XyA9IGNvbnRhaW5lcl9saW1pdDsgfQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gZ2V0UHJvdG9jb2woYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUcmFuc3BvcnRfPiBzcGVjaWZpY190cmFucyA9IGJvb3N0OjpkeW5hbWljX3BvaW50ZXJfY2FzdDxUcmFuc3BvcnRfPih0cmFucyk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGdldFByb3RvY29sKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxUcmFuc3BvcnRfPiBzcGVjaWZpY190cmFucyA9IHN0ZDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VHJhbnNwb3J0Xz4odHJhbnMpOwogICAgIFRQcm90b2NvbCogcHJvdDsKICAgICBpZiAoc3BlY2lmaWNfdHJhbnMpIHsKICAgICAgIHByb3QgPSBuZXcgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz4oc3BlY2lmaWNfdHJhbnMsIHN0cmluZ19saW1pdF8sIGNvbnRhaW5lcl9saW1pdF8pOwpAQCAtMjQ3LDcgKzI0OCw3IEBACiAgICAgICBwcm90ID0gbmV3IFRDb21wYWN0UHJvdG9jb2wodHJhbnMsIHN0cmluZ19saW1pdF8sIGNvbnRhaW5lcl9saW1pdF8pOwogICAgIH0KIAotICAgIHJldHVybiBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+KHByb3QpOworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPihwcm90KTsKICAgfQogCiBwcml2YXRlOgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wudGNjIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wudGNjCmluZGV4IDRkNjYwZTguLjhlZmVjNmUgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLnRjYworKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC50Y2MKQEAgLTIxLDYgKzIxLDggQEAKIAogI2luY2x1ZGUgPGxpbWl0cz4KIAorI2luY2x1ZGUgInRocmlmdC9jb25maWcuaCIKKwogLyoKICAqIFRDb21wYWN0UHJvdG9jb2w6OmkqVG9aaWd6YWcgZGVwZW5kIG9uIHRoZSBmYWN0IHRoYXQgdGhlIHJpZ2h0IHNoaWZ0CiAgKiBvcGVyYXRvciBvbiBhIHNpZ25lZCBpbnRlZ2VyIGlzIGFuIGFyaXRobWV0aWMgKHNpZ24tZXh0ZW5kaW5nKSBzaGlmdC4KQEAgLTI1MSw4ICsyNTMsOCBAQAogICovCiB0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KIHVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZURvdWJsZShjb25zdCBkb3VibGUgZHViKSB7Ci0gIEJPT1NUX1NUQVRJQ19BU1NFUlQoc2l6ZW9mKGRvdWJsZSkgPT0gc2l6ZW9mKHVpbnQ2NF90KSk7Ci0gIEJPT1NUX1NUQVRJQ19BU1NFUlQoc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+Ojppc19pZWM1NTkpOworICBzdGF0aWNfYXNzZXJ0KHNpemVvZihkb3VibGUpID09IHNpemVvZih1aW50NjRfdCksICJzaXplb2YoZG91YmxlKSA9PSBzaXplb2YodWludDY0X3QpIik7CisgIHN0YXRpY19hc3NlcnQoc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+Ojppc19pZWM1NTksICJzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmlzX2llYzU1OSIpOwogCiAgIHVpbnQ2NF90IGJpdHMgPSBiaXR3aXNlX2Nhc3Q8dWludDY0X3Q+KGR1Yik7CiAgIGJpdHMgPSBUSFJJRlRfaHRvbGVsbChiaXRzKTsKQEAgLTM4NSw3ICszODcsNyBAQAogICovCiB0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KIHVpbnQ2NF90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjppNjRUb1ppZ3phZyhjb25zdCBpbnQ2NF90IGwpIHsKLSAgcmV0dXJuIChsIDw8IDEpIF4gKGwgPj4gNjMpOworICByZXR1cm4gKHN0YXRpY19jYXN0PHVpbnQ2NF90PihsKSA8PCAxKSBeIChsID4+IDYzKTsKIH0KIAogLyoqCkBAIC0zOTQsNyArMzk2LDcgQEAKICAqLwogdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+CiB1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6aTMyVG9aaWd6YWcoY29uc3QgaW50MzJfdCBuKSB7Ci0gIHJldHVybiAobiA8PCAxKSBeIChuID4+IDMxKTsKKyAgcmV0dXJuIChzdGF0aWNfY2FzdDx1aW50MzJfdD4obikgPDwgMSkgXiAobiA+PiAzMSk7CiB9CiAKIC8qKgpAQCAtNjUxLDggKzY1Myw4IEBACiAgKi8KIHRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgogdWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWREb3VibGUoZG91YmxlJiBkdWIpIHsKLSAgQk9PU1RfU1RBVElDX0FTU0VSVChzaXplb2YoZG91YmxlKSA9PSBzaXplb2YodWludDY0X3QpKTsKLSAgQk9PU1RfU1RBVElDX0FTU0VSVChzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmlzX2llYzU1OSk7CisgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKGRvdWJsZSkgPT0gc2l6ZW9mKHVpbnQ2NF90KSwgInNpemVvZihkb3VibGUpID09IHNpemVvZih1aW50NjRfdCkiKTsKKyAgc3RhdGljX2Fzc2VydChzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmlzX2llYzU1OSwgInN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aXNfaWVjNTU5Iik7CiAKICAgdW5pb24gewogICAgIHVpbnQ2NF90IGJpdHM7CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmNwcAppbmRleCA0Njg3ZTgyLi4wZTZkNGEyIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9URGVidWdQcm90b2NvbC5jcHAKQEAgLTE5LDEyICsxOSwxMSBAQAogCiAjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmg+CiAKKyNpbmNsdWRlIDx0aHJpZnQvVFRvU3RyaW5nLmg+CiAjaW5jbHVkZSA8Y2Fzc2VydD4KICNpbmNsdWRlIDxjY3R5cGU+CiAjaW5jbHVkZSA8Y3N0ZGlvPgogI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KLSNpbmNsdWRlIDxib29zdC9zdGF0aWNfYXNzZXJ0LmhwcD4KLSNpbmNsdWRlIDxib29zdC9sZXhpY2FsX2Nhc3QuaHBwPgogCiB1c2luZyBzdGQ6OnN0cmluZzsKIApAQCAtMTI5LDcgKzEyOCw3IEBACiAgIGNhc2UgTUFQX1ZBTFVFOgogICAgIHJldHVybiB3cml0ZVBsYWluKCIgLT4gIik7CiAgIGNhc2UgTElTVDoKLSAgICBzaXplID0gd3JpdGVJbmRlbnRlZCgiWyIgKyBib29zdDo6bGV4aWNhbF9jYXN0PHN0cmluZz4obGlzdF9pZHhfLmJhY2soKSkgKyAiXSA9ICIpOworICAgIHNpemUgPSB3cml0ZUluZGVudGVkKCJbIiArIHRvX3N0cmluZyhsaXN0X2lkeF8uYmFjaygpKSArICJdID0gIik7CiAgICAgbGlzdF9pZHhfLmJhY2soKSsrOwogICAgIHJldHVybiBzaXplOwogICBkZWZhdWx0OgpAQCAtMjIzLDcgKzIyMiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBmaWVsZElkKSB7CiAgIC8vIHNwcmludGYoaWRfc3RyLCAiJTAyZCIsIGZpZWxkSWQpOwotICBzdHJpbmcgaWRfc3RyID0gYm9vc3Q6OmxleGljYWxfY2FzdDxzdHJpbmc+KGZpZWxkSWQpOworICBzdHJpbmcgaWRfc3RyID0gdG9fc3RyaW5nKGZpZWxkSWQpOwogICBpZiAoaWRfc3RyLmxlbmd0aCgpID09IDEpCiAgICAgaWRfc3RyID0gJzAnICsgaWRfc3RyOwogCkBAIC0yNDgsNyArMjQ3LDcgQEAKICAgYnNpemUgKz0gc3RhcnRJdGVtKCk7CiAgIGJzaXplICs9IHdyaXRlUGxhaW4oCiAgICAgICAibWFwPCIgKyBmaWVsZFR5cGVOYW1lKGtleVR5cGUpICsgIiwiICsgZmllbGRUeXBlTmFtZSh2YWxUeXBlKSArICI+IgotICAgICAgIlsiICsgYm9vc3Q6OmxleGljYWxfY2FzdDxzdHJpbmc+KHNpemUpICsgIl0ge1xuIik7CisgICAgICAiWyIgKyB0b19zdHJpbmcoc2l6ZSkgKyAiXSB7XG4iKTsKICAgaW5kZW50VXAoKTsKICAgd3JpdGVfc3RhdGVfLnB1c2hfYmFjayhNQVBfS0VZKTsKICAgcmV0dXJuIGJzaXplOwpAQCAtMjY5LDcgKzI2OCw3IEBACiAgIGJzaXplICs9IHN0YXJ0SXRlbSgpOwogICBic2l6ZSArPSB3cml0ZVBsYWluKAogICAgICAgImxpc3Q8IiArIGZpZWxkVHlwZU5hbWUoZWxlbVR5cGUpICsgIj4iCi0gICAgICAiWyIgKyBib29zdDo6bGV4aWNhbF9jYXN0PHN0cmluZz4oc2l6ZSkgKyAiXSB7XG4iKTsKKyAgICAgICJbIiArIHRvX3N0cmluZyhzaXplKSArICJdIHtcbiIpOwogICBpbmRlbnRVcCgpOwogICB3cml0ZV9zdGF0ZV8ucHVzaF9iYWNrKExJU1QpOwogICBsaXN0X2lkeF8ucHVzaF9iYWNrKDApOwpAQCAtMjkyLDcgKzI5MSw3IEBACiAgIGJzaXplICs9IHN0YXJ0SXRlbSgpOwogICBic2l6ZSArPSB3cml0ZVBsYWluKAogICAgICAgInNldDwiICsgZmllbGRUeXBlTmFtZShlbGVtVHlwZSkgKyAiPiIKLSAgICAgICJbIiArIGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RyaW5nPihzaXplKSArICJdIHtcbiIpOworICAgICAgIlsiICsgdG9fc3RyaW5nKHNpemUpICsgIl0ge1xuIik7CiAgIGluZGVudFVwKCk7CiAgIHdyaXRlX3N0YXRlXy5wdXNoX2JhY2soU0VUKTsKICAgcmV0dXJuIGJzaXplOwpAQCAtMzE2LDE5ICszMTUsMTkgQEAKIH0KIAogdWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlSTE2KGNvbnN0IGludDE2X3QgaTE2KSB7Ci0gIHJldHVybiB3cml0ZUl0ZW0oYm9vc3Q6OmxleGljYWxfY2FzdDxzdHJpbmc+KGkxNikpOworICByZXR1cm4gd3JpdGVJdGVtKHRvX3N0cmluZyhpMTYpKTsKIH0KIAogdWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlSTMyKGNvbnN0IGludDMyX3QgaTMyKSB7Ci0gIHJldHVybiB3cml0ZUl0ZW0oYm9vc3Q6OmxleGljYWxfY2FzdDxzdHJpbmc+KGkzMikpOworICByZXR1cm4gd3JpdGVJdGVtKHRvX3N0cmluZyhpMzIpKTsKIH0KIAogdWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlSTY0KGNvbnN0IGludDY0X3QgaTY0KSB7Ci0gIHJldHVybiB3cml0ZUl0ZW0oYm9vc3Q6OmxleGljYWxfY2FzdDxzdHJpbmc+KGk2NCkpOworICByZXR1cm4gd3JpdGVJdGVtKHRvX3N0cmluZyhpNjQpKTsKIH0KIAogdWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlRG91YmxlKGNvbnN0IGRvdWJsZSBkdWIpIHsKLSAgcmV0dXJuIHdyaXRlSXRlbShib29zdDo6bGV4aWNhbF9jYXN0PHN0cmluZz4oZHViKSk7CisgIHJldHVybiB3cml0ZUl0ZW0odG9fc3RyaW5nKGR1YikpOwogfQogCiB1aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVTdHJpbmcoY29uc3Qgc3RyaW5nJiBzdHIpIHsKQEAgLTMzNyw3ICszMzYsNyBAQAogICBzdHJpbmcgdG9fc2hvdyA9IHN0cjsKICAgaWYgKHRvX3Nob3cubGVuZ3RoKCkgPiAoc3RyaW5nOjpzaXplX3R5cGUpc3RyaW5nX2xpbWl0XykgewogICAgIHRvX3Nob3cgPSBzdHIuc3Vic3RyKDAsIHN0cmluZ19wcmVmaXhfc2l6ZV8pOwotICAgIHRvX3Nob3cgKz0gIlsuLi5dKCIgKyBib29zdDo6bGV4aWNhbF9jYXN0PHN0cmluZz4oc3RyLmxlbmd0aCgpKSArICIpIjsKKyAgICB0b19zaG93ICs9ICJbLi4uXSgiICsgdG9fc3RyaW5nKHN0ci5sZW5ndGgoKSkgKyAiKSI7CiAgIH0KIAogICBzdHJpbmcgb3V0cHV0ID0gIlwiIjsKQEAgLTM0Nyw3ICszNDYsOSBAQAogICAgICAgb3V0cHV0ICs9ICJcXFxcIjsKICAgICB9IGVsc2UgaWYgKCppdCA9PSAnIicpIHsKICAgICAgIG91dHB1dCArPSAiXFxcIiI7Ci0gICAgfSBlbHNlIGlmIChzdGQ6OmlzcHJpbnQoKml0KSkgeworICAgICAgLy8gcGFzc2luZyBjaGFyYWN0ZXJzIDwwIHRvIHN0ZDo6aXNwcmludCBjYXVzZXMgYXNzZXJ0cy4gaXNwcmludCB0YWtlcyBhbgorICAgICAgLy8gaW50LCBzbyB3ZSBuZWVkIHRvIGJlIGNhcmVmdWwgb2Ygc2lnbiBleHRlbnNpb24KKyAgICB9IGVsc2UgaWYgKHN0ZDo6aXNwcmludCgodW5zaWduZWQgY2hhcikqaXQpKSB7CiAgICAgICBvdXRwdXQgKz0gKml0OwogICAgIH0gZWxzZSB7CiAgICAgICBzd2l0Y2ggKCppdCkgewpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmggYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuaAppbmRleCBjYzkzMjMwLi5jMDc5NjI0IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuaApAQCAtMjIsNyArMjIsNyBAQAogCiAjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RWaXJ0dWFsUHJvdG9jb2wuaD4KIAotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgorI2luY2x1ZGUgPG1lbW9yeT4KIAogbmFtZXNwYWNlIGFwYWNoZSB7CiBuYW1lc3BhY2UgdGhyaWZ0IHsKQEAgLTUxLDcgKzUxLDcgQEAKICAgZW51bSB3cml0ZV9zdGF0ZV90IHsgVU5JTklULCBTVFJVQ1QsIExJU1QsIFNFVCwgTUFQX0tFWSwgTUFQX1ZBTFVFIH07CiAKIHB1YmxpYzoKLSAgVERlYnVnUHJvdG9jb2woYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpCisgIFREZWJ1Z1Byb3RvY29sKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucykKICAgICA6IFRWaXJ0dWFsUHJvdG9jb2w8VERlYnVnUHJvdG9jb2w+KHRyYW5zKSwKICAgICAgIHRyYW5zXyh0cmFucy5nZXQoKSksCiAgICAgICBzdHJpbmdfbGltaXRfKERFRkFVTFRfU1RSSU5HX0xJTUlUKSwKQEAgLTE0MSw4ICsxNDEsOCBAQAogICBURGVidWdQcm90b2NvbEZhY3RvcnkoKSB7fQogICB2aXJ0dWFsIH5URGVidWdQcm90b2NvbEZhY3RvcnkoKSB7fQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gZ2V0UHJvdG9jb2woYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKLSAgICByZXR1cm4gYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPihuZXcgVERlYnVnUHJvdG9jb2wodHJhbnMpKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gZ2V0UHJvdG9jb2woc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSB7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+KG5ldyBURGVidWdQcm90b2NvbCh0cmFucykpOwogICB9CiB9OwogfQpAQCAtMTYwLDcgKzE2MCw3IEBACiAgIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwogICB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwogICBUTWVtb3J5QnVmZmVyKiBidWZmZXIgPSBuZXcgVE1lbW9yeUJ1ZmZlcjsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMoYnVmZmVyKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKGJ1ZmZlcik7CiAgIFREZWJ1Z1Byb3RvY29sIHByb3RvY29sKHRyYW5zKTsKIAogICB0cy53cml0ZSgmcHJvdG9jb2wpOwpAQCAtMTc4LDcgKzE3OCw3IEBACiAgIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwogICB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwogICBUTWVtb3J5QnVmZmVyKiBidWZmZXIgPSBuZXcgVE1lbW9yeUJ1ZmZlcjsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMoYnVmZmVyKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKGJ1ZmZlcik7CiAgIFREZWJ1Z1Byb3RvY29sIHByb3RvY29sKHRyYW5zKTsKIAogICAvLyBJIGFtIGdyb3NzIQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RIZWFkZXJQcm90b2NvbC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEhlYWRlclByb3RvY29sLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjQyZTMwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RIZWFkZXJQcm90b2NvbC5jcHAKQEAgLTAsMCArMSwyNTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgVEhSSUZUX1BST1RPQ09MX1RIRUFERVJQUk9UT0NPTF9DUFBfCisjZGVmaW5lIFRIUklGVF9QUk9UT0NPTF9USEVBREVSUFJPVE9DT0xfQ1BQXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEhlYWRlclByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oPgorCisjaW5jbHVkZSA8bGltaXRzPgorCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHByb3RvY29sIHsKKwordm9pZCBUSGVhZGVyUHJvdG9jb2w6OnJlc2V0UHJvdG9jb2woKSB7CisgIGlmIChwcm90b18gJiYgcHJvdG9JZF8gPT0gdHJhbnNfLT5nZXRQcm90b2NvbElkKCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBwcm90b0lkXyA9IHRyYW5zXy0+Z2V0UHJvdG9jb2xJZCgpOworCisgIHN3aXRjaCAocHJvdG9JZF8pIHsKKyAgY2FzZSBUX0JJTkFSWV9QUk9UT0NPTDoKKyAgICBwcm90b18gPSBzdGQ6Om1ha2Vfc2hhcmVkPFRCaW5hcnlQcm90b2NvbFQ8VEhlYWRlclRyYW5zcG9ydD4gPih0cmFuc18pOworICAgIGJyZWFrOworCisgIGNhc2UgVF9DT01QQUNUX1BST1RPQ09MOgorICAgIHByb3RvXyA9IHN0ZDo6bWFrZV9zaGFyZWQ8VENvbXBhY3RQcm90b2NvbFQ8VEhlYWRlclRyYW5zcG9ydD4gPih0cmFuc18pOworICAgIGJyZWFrOworCisgIGRlZmF1bHQ6CisgICAgdGhyb3cgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6SU5WQUxJRF9QUk9UT0NPTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVua25vd24gcHJvdG9jb2wgcmVxdWVzdGVkIik7CisgIH0KK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjp3cml0ZU1lc3NhZ2VCZWdpbihjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE1lc3NhZ2VUeXBlIG1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IHNlcUlkKSB7CisgIHJlc2V0UHJvdG9jb2woKTsgLy8gUmVzZXQgaW4gY2FzZSB3ZSBjaGFuZ2VkIHByb3RvY29scworICB0cmFuc18tPnNldFNlcXVlbmNlTnVtYmVyKHNlcUlkKTsKKyAgcmV0dXJuIHByb3RvXy0+d3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgbWVzc2FnZVR5cGUsIHNlcUlkKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjp3cml0ZU1lc3NhZ2VFbmQoKSB7CisgIHJldHVybiBwcm90b18tPndyaXRlTWVzc2FnZUVuZCgpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OndyaXRlU3RydWN0QmVnaW4oY29uc3QgY2hhciogbmFtZSkgeworICByZXR1cm4gcHJvdG9fLT53cml0ZVN0cnVjdEJlZ2luKG5hbWUpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OndyaXRlU3RydWN0RW5kKCkgeworICByZXR1cm4gcHJvdG9fLT53cml0ZVN0cnVjdEVuZCgpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OndyaXRlRmllbGRCZWdpbihjb25zdCBjaGFyKiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgZmllbGRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBmaWVsZElkKSB7CisgIHJldHVybiBwcm90b18tPndyaXRlRmllbGRCZWdpbihuYW1lLCBmaWVsZFR5cGUsIGZpZWxkSWQpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OndyaXRlRmllbGRFbmQoKSB7CisgIHJldHVybiBwcm90b18tPndyaXRlRmllbGRFbmQoKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjp3cml0ZUZpZWxkU3RvcCgpIHsKKyAgcmV0dXJuIHByb3RvXy0+d3JpdGVGaWVsZFN0b3AoKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjp3cml0ZU1hcEJlZ2luKGNvbnN0IFRUeXBlIGtleVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgdmFsVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7CisgIHJldHVybiBwcm90b18tPndyaXRlTWFwQmVnaW4oa2V5VHlwZSwgdmFsVHlwZSwgc2l6ZSk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6d3JpdGVNYXBFbmQoKSB7CisgIHJldHVybiBwcm90b18tPndyaXRlTWFwRW5kKCk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6d3JpdGVMaXN0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKKyAgcmV0dXJuIHByb3RvXy0+d3JpdGVMaXN0QmVnaW4oZWxlbVR5cGUsIHNpemUpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OndyaXRlTGlzdEVuZCgpIHsKKyAgcmV0dXJuIHByb3RvXy0+d3JpdGVMaXN0RW5kKCk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6d3JpdGVTZXRCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSkgeworICByZXR1cm4gcHJvdG9fLT53cml0ZVNldEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjp3cml0ZVNldEVuZCgpIHsKKyAgcmV0dXJuIHByb3RvXy0+d3JpdGVTZXRFbmQoKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjp3cml0ZUJvb2woY29uc3QgYm9vbCB2YWx1ZSkgeworICByZXR1cm4gcHJvdG9fLT53cml0ZUJvb2wodmFsdWUpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OndyaXRlQnl0ZShjb25zdCBpbnQ4X3QgYnl0ZSkgeworICByZXR1cm4gcHJvdG9fLT53cml0ZUJ5dGUoYnl0ZSk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6d3JpdGVJMTYoY29uc3QgaW50MTZfdCBpMTYpIHsKKyAgcmV0dXJuIHByb3RvXy0+d3JpdGVJMTYoaTE2KTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjp3cml0ZUkzMihjb25zdCBpbnQzMl90IGkzMikgeworICByZXR1cm4gcHJvdG9fLT53cml0ZUkzMihpMzIpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OndyaXRlSTY0KGNvbnN0IGludDY0X3QgaTY0KSB7CisgIHJldHVybiBwcm90b18tPndyaXRlSTY0KGk2NCk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6d3JpdGVEb3VibGUoY29uc3QgZG91YmxlIGR1YikgeworICByZXR1cm4gcHJvdG9fLT53cml0ZURvdWJsZShkdWIpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OndyaXRlU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgcmV0dXJuIHByb3RvXy0+d3JpdGVTdHJpbmcoc3RyKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjp3cml0ZUJpbmFyeShjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7CisgIHJldHVybiBwcm90b18tPndyaXRlQmluYXJ5KHN0cik7Cit9CisKKy8qKgorICogUmVhZGluZyBmdW5jdGlvbnMKKyAqLworCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OnJlYWRNZXNzYWdlQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE1lc3NhZ2VUeXBlJiBtZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBzZXFJZCkgeworICAvLyBSZWFkIHRoZSBuZXh0IGZyYW1lLCBhbmQgY2hhbmdlIHByb3RvY29scyBpZiBuZWVkZWQKKyAgdHJ5IHsKKyAgICB0cmFuc18tPnJlc2V0UHJvdG9jb2woKTsKKyAgICByZXNldFByb3RvY29sKCk7CisgIH0gY2F0Y2ggKGNvbnN0IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiYgZXgpIHsKKyAgICB3cml0ZU1lc3NhZ2VCZWdpbigiIiwgVF9FWENFUFRJT04sIDApOworICAgIGV4LndyaXRlKChUUHJvdG9jb2wqKXRoaXMpOworICAgIHdyaXRlTWVzc2FnZUVuZCgpOworICAgIHRyYW5zXy0+Zmx1c2goKTsKKworICAgIC8vIFRoZSBmcmFtaW5nIGlzIHN0aWxsIGdvb2QsIGJ1dCB3ZSBkb24ndCBrbm93IGFib3V0IHRoaXMgcHJvdG9jb2wuCisgICAgLy8gSW4gdGhlIGZ1dHVyZSwgdGhpcyBjb3VsZCBiZSBtYWRlIGEgY2xpZW50LXNpZGUgb25seSBlcnJvciBpZgorICAgIC8vIGNvbm5lY3Rpb24gcG9vbGluZyBpcyB1c2VkLgorICAgIHRocm93IGV4OworICB9CisgIHJldHVybiBwcm90b18tPnJlYWRNZXNzYWdlQmVnaW4obmFtZSwgbWVzc2FnZVR5cGUsIHNlcUlkKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjpyZWFkTWVzc2FnZUVuZCgpIHsKKyAgcmV0dXJuIHByb3RvXy0+cmVhZE1lc3NhZ2VFbmQoKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjpyZWFkU3RydWN0QmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUpIHsKKyAgcmV0dXJuIHByb3RvXy0+cmVhZFN0cnVjdEJlZ2luKG5hbWUpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OnJlYWRTdHJ1Y3RFbmQoKSB7CisgIHJldHVybiBwcm90b18tPnJlYWRTdHJ1Y3RFbmQoKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjpyZWFkRmllbGRCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwgVFR5cGUmIGZpZWxkVHlwZSwgaW50MTZfdCYgZmllbGRJZCkgeworICByZXR1cm4gcHJvdG9fLT5yZWFkRmllbGRCZWdpbihuYW1lLCBmaWVsZFR5cGUsIGZpZWxkSWQpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OnJlYWRGaWVsZEVuZCgpIHsKKyAgcmV0dXJuIHByb3RvXy0+cmVhZEZpZWxkRW5kKCk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6cmVhZE1hcEJlZ2luKFRUeXBlJiBrZXlUeXBlLCBUVHlwZSYgdmFsVHlwZSwgdWludDMyX3QmIHNpemUpIHsKKyAgcmV0dXJuIHByb3RvXy0+cmVhZE1hcEJlZ2luKGtleVR5cGUsIHZhbFR5cGUsIHNpemUpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OnJlYWRNYXBFbmQoKSB7CisgIHJldHVybiBwcm90b18tPnJlYWRNYXBFbmQoKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjpyZWFkTGlzdEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwgdWludDMyX3QmIHNpemUpIHsKKyAgcmV0dXJuIHByb3RvXy0+cmVhZExpc3RCZWdpbihlbGVtVHlwZSwgc2l6ZSk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6cmVhZExpc3RFbmQoKSB7CisgIHJldHVybiBwcm90b18tPnJlYWRMaXN0RW5kKCk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6cmVhZFNldEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwgdWludDMyX3QmIHNpemUpIHsKKyAgcmV0dXJuIHByb3RvXy0+cmVhZFNldEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjpyZWFkU2V0RW5kKCkgeworICByZXR1cm4gcHJvdG9fLT5yZWFkU2V0RW5kKCk7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6cmVhZEJvb2woYm9vbCYgdmFsdWUpIHsKKyAgcmV0dXJuIHByb3RvXy0+cmVhZEJvb2wodmFsdWUpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OnJlYWRCeXRlKGludDhfdCYgYnl0ZSkgeworICByZXR1cm4gcHJvdG9fLT5yZWFkQnl0ZShieXRlKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjpyZWFkSTE2KGludDE2X3QmIGkxNikgeworICByZXR1cm4gcHJvdG9fLT5yZWFkSTE2KGkxNik7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJQcm90b2NvbDo6cmVhZEkzMihpbnQzMl90JiBpMzIpIHsKKyAgcmV0dXJuIHByb3RvXy0+cmVhZEkzMihpMzIpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OnJlYWRJNjQoaW50NjRfdCYgaTY0KSB7CisgIHJldHVybiBwcm90b18tPnJlYWRJNjQoaTY0KTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjpyZWFkRG91YmxlKGRvdWJsZSYgZHViKSB7CisgIHJldHVybiBwcm90b18tPnJlYWREb3VibGUoZHViKTsKK30KKwordWludDMyX3QgVEhlYWRlclByb3RvY29sOjpyZWFkU3RyaW5nKHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgcmV0dXJuIHByb3RvXy0+cmVhZFN0cmluZyhzdHIpOworfQorCit1aW50MzJfdCBUSGVhZGVyUHJvdG9jb2w6OnJlYWRCaW5hcnkoc3RkOjpzdHJpbmcmIGJpbmFyeSkgeworICByZXR1cm4gcHJvdG9fLT5yZWFkQmluYXJ5KGJpbmFyeSk7Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbAorCisjZW5kaWYgLy8gI2lmbmRlZiBUSFJJRlRfUFJPVE9DT0xfVEhFQURFUlBST1RPQ09MX0NQUF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9USGVhZGVyUHJvdG9jb2wuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9USGVhZGVyUHJvdG9jb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWUyYjY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RIZWFkZXJQcm90b2NvbC5oCkBAIC0wLDAgKzEsMjEwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVEhSSUZUX1BST1RPQ09MX1RIRUFERVJQUk9UT0NPTF9IXworI2RlZmluZSBUSFJJRlRfUFJPVE9DT0xfVEhFQURFUlBST1RPQ09MX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVHlwZXMuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFZpcnR1YWxQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEhlYWRlclRyYW5zcG9ydC5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorCit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUSGVhZGVyVHJhbnNwb3J0OworCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHByb3RvY29sIHsKKworLyoqCisgKiBUaGUgaGVhZGVyIHByb3RvY29sIGZvciB0aHJpZnQuIFJlYWRzIHVuZnJhbWVkLCBmcmFtZWQsIGhlYWRlciBmb3JtYXQsCisgKiBhbmQgaHR0cAorICoKKyAqLworY2xhc3MgVEhlYWRlclByb3RvY29sIDogcHVibGljIFRWaXJ0dWFsUHJvdG9jb2w8VEhlYWRlclByb3RvY29sPiB7Citwcm90ZWN0ZWQ6CitwdWJsaWM6CisgIHZvaWQgcmVzZXRQcm90b2NvbCgpOworCisgIGV4cGxpY2l0IFRIZWFkZXJQcm90b2NvbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4mIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgcHJvdG9JZCA9IFRfQ09NUEFDVF9QUk9UT0NPTCkKKyAgICA6IFRWaXJ0dWFsUHJvdG9jb2w8VEhlYWRlclByb3RvY29sPihzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRIZWFkZXJUcmFuc3BvcnQodHJhbnMpKSksCisgICAgICB0cmFuc18oc3RkOjpkeW5hbWljX3BvaW50ZXJfY2FzdDxUSGVhZGVyVHJhbnNwb3J0PihnZXRUcmFuc3BvcnQoKSkpLAorICAgICAgcHJvdG9JZF8ocHJvdG9JZCkgeworICAgIHRyYW5zXy0+c2V0UHJvdG9jb2xJZChwcm90b0lkKTsKKyAgICByZXNldFByb3RvY29sKCk7CisgIH0KKworICBUSGVhZGVyUHJvdG9jb2woY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+JiBpblRyYW5zLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+JiBvdXRUcmFucywKKyAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHByb3RvSWQgPSBUX0NPTVBBQ1RfUFJPVE9DT0wpCisgICAgOiBUVmlydHVhbFByb3RvY29sPFRIZWFkZXJQcm90b2NvbD4oCisgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUSGVhZGVyVHJhbnNwb3J0KGluVHJhbnMsIG91dFRyYW5zKSkpLAorICAgICAgdHJhbnNfKHN0ZDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VEhlYWRlclRyYW5zcG9ydD4oZ2V0VHJhbnNwb3J0KCkpKSwKKyAgICAgIHByb3RvSWRfKHByb3RvSWQpIHsKKyAgICB0cmFuc18tPnNldFByb3RvY29sSWQocHJvdG9JZCk7CisgICAgcmVzZXRQcm90b2NvbCgpOworICB9CisKKyAgflRIZWFkZXJQcm90b2NvbCgpIHt9CisKKyAgLyoqCisgICAqIEZ1bmN0aW9ucyB0byB3b3JrIHdpdGggaGVhZGVycyBieSBjYWxsaW5nIGludG8gVEhlYWRlclRyYW5zcG9ydAorICAgKi8KKyAgdm9pZCBzZXRQcm90b2NvbElkKHVpbnQxNl90IHByb3RvSWQpIHsKKyAgICB0cmFuc18tPnNldFByb3RvY29sSWQocHJvdG9JZCk7CisgICAgcmVzZXRQcm90b2NvbCgpOworICB9CisKKyAgdHlwZWRlZiBUSGVhZGVyVHJhbnNwb3J0OjpTdHJpbmdUb1N0cmluZ01hcCBTdHJpbmdUb1N0cmluZ01hcDsKKworICAvLyB0aGVzZSB3b3JrIHdpdGggd3JpdGUgaGVhZGVycworICB2b2lkIHNldEhlYWRlcihjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICB0cmFuc18tPnNldEhlYWRlcihrZXksIHZhbHVlKTsKKyAgfQorCisgIHZvaWQgY2xlYXJIZWFkZXJzKCkgeyB0cmFuc18tPmNsZWFySGVhZGVycygpOyB9CisKKyAgU3RyaW5nVG9TdHJpbmdNYXAmIGdldFdyaXRlSGVhZGVycygpIHsgcmV0dXJuIHRyYW5zXy0+Z2V0V3JpdGVIZWFkZXJzKCk7IH0KKworICAvLyB0aGVzZSB3b3JrIHdpdGggcmVhZCBoZWFkZXJzCisgIGNvbnN0IFN0cmluZ1RvU3RyaW5nTWFwJiBnZXRIZWFkZXJzKCkgY29uc3QgeyByZXR1cm4gdHJhbnNfLT5nZXRIZWFkZXJzKCk7IH0KKworICAvKioKKyAgICogV3JpdGluZyBmdW5jdGlvbnMuCisgICAqLworCisgIC8qb2wqLyB1aW50MzJfdCB3cml0ZU1lc3NhZ2VCZWdpbihjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRNZXNzYWdlVHlwZSBtZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc2VxSWQpOworCisgIC8qb2wqLyB1aW50MzJfdCB3cml0ZU1lc3NhZ2VFbmQoKTsKKworICB1aW50MzJfdCB3cml0ZVN0cnVjdEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUpOworCisgIHVpbnQzMl90IHdyaXRlU3RydWN0RW5kKCk7CisKKyAgdWludDMyX3Qgd3JpdGVGaWVsZEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwgY29uc3QgaW50MTZfdCBmaWVsZElkKTsKKworICB1aW50MzJfdCB3cml0ZUZpZWxkRW5kKCk7CisKKyAgdWludDMyX3Qgd3JpdGVGaWVsZFN0b3AoKTsKKworICB1aW50MzJfdCB3cml0ZU1hcEJlZ2luKGNvbnN0IFRUeXBlIGtleVR5cGUsIGNvbnN0IFRUeXBlIHZhbFR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpOworCisgIHVpbnQzMl90IHdyaXRlTWFwRW5kKCk7CisKKyAgdWludDMyX3Qgd3JpdGVMaXN0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpOworCisgIHVpbnQzMl90IHdyaXRlTGlzdEVuZCgpOworCisgIHVpbnQzMl90IHdyaXRlU2V0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpOworCisgIHVpbnQzMl90IHdyaXRlU2V0RW5kKCk7CisKKyAgdWludDMyX3Qgd3JpdGVCb29sKGNvbnN0IGJvb2wgdmFsdWUpOworCisgIHVpbnQzMl90IHdyaXRlQnl0ZShjb25zdCBpbnQ4X3QgYnl0ZSk7CisKKyAgdWludDMyX3Qgd3JpdGVJMTYoY29uc3QgaW50MTZfdCBpMTYpOworCisgIHVpbnQzMl90IHdyaXRlSTMyKGNvbnN0IGludDMyX3QgaTMyKTsKKworICB1aW50MzJfdCB3cml0ZUk2NChjb25zdCBpbnQ2NF90IGk2NCk7CisKKyAgdWludDMyX3Qgd3JpdGVEb3VibGUoY29uc3QgZG91YmxlIGR1Yik7CisKKyAgdWludDMyX3Qgd3JpdGVTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cik7CisKKyAgdWludDMyX3Qgd3JpdGVCaW5hcnkoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cik7CisKKyAgLyoqCisgICAqIFJlYWRpbmcgZnVuY3Rpb25zCisgICAqLworCisgIC8qb2wqLyB1aW50MzJfdCByZWFkTWVzc2FnZUJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLCBUTWVzc2FnZVR5cGUmIG1lc3NhZ2VUeXBlLCBpbnQzMl90JiBzZXFJZCk7CisKKyAgLypvbCovIHVpbnQzMl90IHJlYWRNZXNzYWdlRW5kKCk7CisKKyAgdWludDMyX3QgcmVhZFN0cnVjdEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lKTsKKworICB1aW50MzJfdCByZWFkU3RydWN0RW5kKCk7CisKKyAgdWludDMyX3QgcmVhZEZpZWxkQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsIFRUeXBlJiBmaWVsZFR5cGUsIGludDE2X3QmIGZpZWxkSWQpOworCisgIHVpbnQzMl90IHJlYWRGaWVsZEVuZCgpOworCisgIHVpbnQzMl90IHJlYWRNYXBCZWdpbihUVHlwZSYga2V5VHlwZSwgVFR5cGUmIHZhbFR5cGUsIHVpbnQzMl90JiBzaXplKTsKKworICB1aW50MzJfdCByZWFkTWFwRW5kKCk7CisKKyAgdWludDMyX3QgcmVhZExpc3RCZWdpbihUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKTsKKworICB1aW50MzJfdCByZWFkTGlzdEVuZCgpOworCisgIHVpbnQzMl90IHJlYWRTZXRCZWdpbihUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKTsKKworICB1aW50MzJfdCByZWFkU2V0RW5kKCk7CisKKyAgdWludDMyX3QgcmVhZEJvb2woYm9vbCYgdmFsdWUpOworICAvLyBQcm92aWRlIHRoZSBkZWZhdWx0IHJlYWRCb29sKCkgaW1wbGVtZW50YXRpb24gZm9yIHN0ZDo6dmVjdG9yPGJvb2w+CisgIHVzaW5nIFRWaXJ0dWFsUHJvdG9jb2w8VEhlYWRlclByb3RvY29sPjo6cmVhZEJvb2w7CisKKyAgdWludDMyX3QgcmVhZEJ5dGUoaW50OF90JiBieXRlKTsKKworICB1aW50MzJfdCByZWFkSTE2KGludDE2X3QmIGkxNik7CisKKyAgdWludDMyX3QgcmVhZEkzMihpbnQzMl90JiBpMzIpOworCisgIHVpbnQzMl90IHJlYWRJNjQoaW50NjRfdCYgaTY0KTsKKworICB1aW50MzJfdCByZWFkRG91YmxlKGRvdWJsZSYgZHViKTsKKworICB1aW50MzJfdCByZWFkU3RyaW5nKHN0ZDo6c3RyaW5nJiBzdHIpOworCisgIHVpbnQzMl90IHJlYWRCaW5hcnkoc3RkOjpzdHJpbmcmIGJpbmFyeSk7CisKK3Byb3RlY3RlZDoKKyAgc3RkOjpzaGFyZWRfcHRyPFRIZWFkZXJUcmFuc3BvcnQ+IHRyYW5zXzsKKworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90b187CisgIHVpbnQzMl90IHByb3RvSWRfOworfTsKKworY2xhc3MgVEhlYWRlclByb3RvY29sRmFjdG9yeSA6IHB1YmxpYyBUUHJvdG9jb2xGYWN0b3J5IHsKK3B1YmxpYzoKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBnZXRQcm90b2NvbChzdGQ6OnNoYXJlZF9wdHI8dHJhbnNwb3J0OjpUVHJhbnNwb3J0PiB0cmFucykgeworICAgIFRIZWFkZXJQcm90b2NvbCogaGVhZGVyUHJvdG9jb2wKKyAgICAgICAgPSBuZXcgVEhlYWRlclByb3RvY29sKHRyYW5zLCB0cmFucywgVF9CSU5BUllfUFJPVE9DT0wpOworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPihoZWFkZXJQcm90b2NvbCk7CisgIH0KKworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGdldFByb3RvY29sKAorICAgICAgc3RkOjpzaGFyZWRfcHRyPHRyYW5zcG9ydDo6VFRyYW5zcG9ydD4gaW5UcmFucywKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjx0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ+IG91dFRyYW5zKSB7CisgICAgVEhlYWRlclByb3RvY29sKiBoZWFkZXJQcm90b2NvbCA9IG5ldyBUSGVhZGVyUHJvdG9jb2woaW5UcmFucywgb3V0VHJhbnMsIFRfQklOQVJZX1BST1RPQ09MKTsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4oaGVhZGVyUHJvdG9jb2wpOworICB9Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKKworI2VuZGlmIC8vICNpZm5kZWYgVEhSSUZUX1BST1RPQ09MX1RIRUFERVJQUk9UT0NPTF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuY3BwCmluZGV4IGU0MDc3YmMuLjQ1NzZmYTEgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5jcHAKQEAgLTE5LDE2ICsxOSwxOSBAQAogCiAjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuaD4KIAorI2luY2x1ZGUgPGJvb3N0L2xvY2FsZS5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvbWF0aC9zcGVjaWFsX2Z1bmN0aW9ucy9mcGNsYXNzaWZ5LmhwcD4KKyNpbmNsdWRlIDxib29zdC9tYXRoL3NwZWNpYWxfZnVuY3Rpb25zL3NpZ24uaHBwPgorCisjaW5jbHVkZSA8Y21hdGg+CiAjaW5jbHVkZSA8bGltaXRzPgogI2luY2x1ZGUgPGxvY2FsZT4KICNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPGNtYXRoPgotCi0jaW5jbHVkZSA8Ym9vc3QvbWF0aC9zcGVjaWFsX2Z1bmN0aW9ucy9mcGNsYXNzaWZ5LmhwcD4KLSNpbmNsdWRlIDxib29zdC9sZXhpY2FsX2Nhc3QuaHBwPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KIAogI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmFzZTY0VXRpbHMuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaD4KKyNpbmNsdWRlIDx0aHJpZnQvVFRvU3RyaW5nLmg+CiAKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwogCkBAIC00MiwxMiArNDUsMTAgQEAKIHN0YXRpYyBjb25zdCB1aW50OF90IGtKU09OT2JqZWN0RW5kID0gJ30nOwogc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0pTT05BcnJheVN0YXJ0ID0gJ1snOwogc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0pTT05BcnJheUVuZCA9ICddJzsKLXN0YXRpYyBjb25zdCB1aW50OF90IGtKU09OTmV3bGluZSA9ICdcbic7CiBzdGF0aWMgY29uc3QgdWludDhfdCBrSlNPTlBhaXJTZXBhcmF0b3IgPSAnOic7CiBzdGF0aWMgY29uc3QgdWludDhfdCBrSlNPTkVsZW1TZXBhcmF0b3IgPSAnLCc7CiBzdGF0aWMgY29uc3QgdWludDhfdCBrSlNPTkJhY2tzbGFzaCA9ICdcXCc7CiBzdGF0aWMgY29uc3QgdWludDhfdCBrSlNPTlN0cmluZ0RlbGltaXRlciA9ICciJzsKLXN0YXRpYyBjb25zdCB1aW50OF90IGtKU09OWmVyb0NoYXIgPSAnMCc7CiBzdGF0aWMgY29uc3QgdWludDhfdCBrSlNPTkVzY2FwZUNoYXIgPSAndSc7CiAKIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrSlNPTkVzY2FwZVByZWZpeCgiXFx1MDAiKTsKQEAgLTI4NSw2ICsyODYsMTYgQEAKICAgcmV0dXJuIGZhbHNlOwogfQogCisvLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgY29kZSB1bml0IGlzIGhpZ2ggc3Vycm9nYXRlCitzdGF0aWMgYm9vbCBpc0hpZ2hTdXJyb2dhdGUodWludDE2X3QgdmFsKSB7CisgIHJldHVybiB2YWwgPj0gMHhEODAwICYmIHZhbCA8PSAweERCRkY7Cit9CisKKy8vIFJldHVybiB0cnVlIGlmIHRoZSBjb2RlIHVuaXQgaXMgbG93IHN1cnJvZ2F0ZQorc3RhdGljIGJvb2wgaXNMb3dTdXJyb2dhdGUodWludDE2X3QgdmFsKSB7CisgIHJldHVybiB2YWwgPj0gMHhEQzAwICYmIHZhbCA8PSAweERGRkY7Cit9CisKIC8qKgogICogQ2xhc3MgdG8gc2VydmUgYXMgYmFzZSBKU09OIGNvbnRleHQgYW5kIGFzIGJhc2UgY2xhc3MgZm9yIG90aGVyIGNvbnRleHQKICAqIGltcGxlbWVudGF0aW9ucwpAQCAtMzg2LDcgKzM5Nyw3IEBACiAgIGJvb2wgZmlyc3RfOwogfTsKIAotVEpTT05Qcm90b2NvbDo6VEpTT05Qcm90b2NvbChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBwdHJhbnMpCitUSlNPTlByb3RvY29sOjpUSlNPTlByb3RvY29sKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBwdHJhbnMpCiAgIDogVFZpcnR1YWxQcm90b2NvbDxUSlNPTlByb3RvY29sPihwdHJhbnMpLAogICAgIHRyYW5zXyhwdHJhbnMuZ2V0KCkpLAogICAgIGNvbnRleHRfKG5ldyBUSlNPTkNvbnRleHQoKSksCkBAIC0zOTYsNyArNDA3LDcgQEAKIFRKU09OUHJvdG9jb2w6On5USlNPTlByb3RvY29sKCkgewogfQogCi12b2lkIFRKU09OUHJvdG9jb2w6OnB1c2hDb250ZXh0KGJvb3N0OjpzaGFyZWRfcHRyPFRKU09OQ29udGV4dD4gYykgewordm9pZCBUSlNPTlByb3RvY29sOjpwdXNoQ29udGV4dChzdGQ6OnNoYXJlZF9wdHI8VEpTT05Db250ZXh0PiBjKSB7CiAgIGNvbnRleHRzXy5wdXNoKGNvbnRleHRfKTsKICAgY29udGV4dF8gPSBjOwogfQpAQCAtNDkyLDcgKzUwMyw3IEBACiB0ZW1wbGF0ZSA8dHlwZW5hbWUgTnVtYmVyVHlwZT4KIHVpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlSlNPTkludGVnZXIoTnVtYmVyVHlwZSBudW0pIHsKICAgdWludDMyX3QgcmVzdWx0ID0gY29udGV4dF8tPndyaXRlKCp0cmFuc18pOwotICBzdGQ6OnN0cmluZyB2YWwoYm9vc3Q6OmxleGljYWxfY2FzdDxzdGQ6OnN0cmluZz4obnVtKSk7CisgIHN0ZDo6c3RyaW5nIHZhbCh0b19zdHJpbmcobnVtKSk7CiAgIGJvb2wgZXNjYXBlTnVtID0gY29udGV4dF8tPmVzY2FwZU51bSgpOwogICBpZiAoZXNjYXBlTnVtKSB7CiAgICAgdHJhbnNfLT53cml0ZSgma0pTT05TdHJpbmdEZWxpbWl0ZXIsIDEpOwpAQCAtNTEzLDcgKzUyNCw4IEBACiBzdGQ6OnN0cmluZyBkb3VibGVUb1N0cmluZyhkb3VibGUgZCkgewogICBzdGQ6Om9zdHJpbmdzdHJlYW0gc3RyOwogICBzdHIuaW1idWUoc3RkOjpsb2NhbGU6OmNsYXNzaWMoKSk7Ci0gIHN0ci5wcmVjaXNpb24oc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjpkaWdpdHMxMCArIDEpOworICBjb25zdCBzdGQ6OnN0cmVhbXNpemUgbWF4X2RpZ2l0czEwID0gMiArIHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6ZGlnaXRzMTA7CisgIHN0ci5wcmVjaXNpb24obWF4X2RpZ2l0czEwKTsKICAgc3RyIDw8IGQ7CiAgIHJldHVybiBzdHIuc3RyKCk7CiB9CkBAIC01NjMsNyArNTc1LDcgQEAKIHVpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlSlNPTk9iamVjdFN0YXJ0KCkgewogICB1aW50MzJfdCByZXN1bHQgPSBjb250ZXh0Xy0+d3JpdGUoKnRyYW5zXyk7CiAgIHRyYW5zXy0+d3JpdGUoJmtKU09OT2JqZWN0U3RhcnQsIDEpOwotICBwdXNoQ29udGV4dChib29zdDo6c2hhcmVkX3B0cjxUSlNPTkNvbnRleHQ+KG5ldyBKU09OUGFpckNvbnRleHQoKSkpOworICBwdXNoQ29udGV4dChzdGQ6OnNoYXJlZF9wdHI8VEpTT05Db250ZXh0PihuZXcgSlNPTlBhaXJDb250ZXh0KCkpKTsKICAgcmV0dXJuIHJlc3VsdCArIDE7CiB9CiAKQEAgLTU3Niw3ICs1ODgsNyBAQAogdWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVKU09OQXJyYXlTdGFydCgpIHsKICAgdWludDMyX3QgcmVzdWx0ID0gY29udGV4dF8tPndyaXRlKCp0cmFuc18pOwogICB0cmFuc18tPndyaXRlKCZrSlNPTkFycmF5U3RhcnQsIDEpOwotICBwdXNoQ29udGV4dChib29zdDo6c2hhcmVkX3B0cjxUSlNPTkNvbnRleHQ+KG5ldyBKU09OTGlzdENvbnRleHQoKSkpOworICBwdXNoQ29udGV4dChzdGQ6OnNoYXJlZF9wdHI8VEpTT05Db250ZXh0PihuZXcgSlNPTkxpc3RDb250ZXh0KCkpKTsKICAgcmV0dXJuIHJlc3VsdCArIDE7CiB9CiAKQEAgLTY0MCw3ICs2NTIsOSBAQAogfQogCiB1aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZU1hcEVuZCgpIHsKLSAgcmV0dXJuIHdyaXRlSlNPTk9iamVjdEVuZCgpICsgd3JpdGVKU09OQXJyYXlFbmQoKTsKKyAgdWludDMyX3QgcmVzdWx0ID0gd3JpdGVKU09OT2JqZWN0RW5kKCk7CisgIHJlc3VsdCArPSB3cml0ZUpTT05BcnJheUVuZCgpOworICByZXR1cm4gcmVzdWx0OwogfQogCiB1aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUxpc3RCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSkgewpAQCAtNjcwLDcgKzY4NCw3IEBACiB9CiAKIHVpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlQnl0ZShjb25zdCBpbnQ4X3QgYnl0ZSkgewotICAvLyB3cml0ZUJ5dGUoKSBtdXN0IGJlIGhhbmRsZWQgc3BlY2lhbGx5IGJlY2F1c2UgYm9vc3Q6OmxleGljYWwgY2FzdCBzZWVzCisgIC8vIHdyaXRlQnl0ZSgpIG11c3QgYmUgaGFuZGxlZCBzcGVjaWFsbHkgYmVjYXVzZSB0b19zdHJpbmcgc2VlcwogICAvLyBpbnQ4X3QgYXMgYSB0ZXh0IHR5cGUgaW5zdGVhZCBvZiBhbiBpbnRlZ2VyIHR5cGUKICAgcmV0dXJuIHdyaXRlSlNPTkludGVnZXIoKGludDE2X3QpYnl0ZSk7CiB9CkBAIC03MDksMTQgKzcyMywxNyBAQAogfQogCiAvLyBEZWNvZGVzIHRoZSBmb3VyIGhleCBwYXJ0cyBvZiBhIEpTT04gZXNjYXBlZCBzdHJpbmcgY2hhcmFjdGVyIGFuZCByZXR1cm5zCi0vLyB0aGUgY2hhcmFjdGVyIHZpYSBvdXQuIFRoZSBmaXJzdCB0d28gY2hhcmFjdGVycyBtdXN0IGJlICIwMCIuCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkSlNPTkVzY2FwZUNoYXIodWludDhfdCogb3V0KSB7Ci0gIHVpbnQ4X3QgYlsyXTsKLSAgcmVhZEpTT05TeW50YXhDaGFyKGtKU09OWmVyb0NoYXIpOwotICByZWFkSlNPTlN5bnRheENoYXIoa0pTT05aZXJvQ2hhcik7CisvLyB0aGUgVVRGLTE2IGNvZGUgdW5pdCB2aWEgb3V0LgordWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEpTT05Fc2NhcGVDaGFyKHVpbnQxNl90KiBvdXQpIHsKKyAgdWludDhfdCBiWzRdOwogICBiWzBdID0gcmVhZGVyXy5yZWFkKCk7CiAgIGJbMV0gPSByZWFkZXJfLnJlYWQoKTsKLSAgKm91dCA9IChoZXhWYWwoYlswXSkgPDwgNCkgKyBoZXhWYWwoYlsxXSk7CisgIGJbMl0gPSByZWFkZXJfLnJlYWQoKTsKKyAgYlszXSA9IHJlYWRlcl8ucmVhZCgpOworCisgICpvdXQgPSAoaGV4VmFsKGJbMF0pIDw8IDEyKQorICAgICsgKGhleFZhbChiWzFdKSA8PCA4KSArIChoZXhWYWwoYlsyXSkgPDwgNCkgKyBoZXhWYWwoYlszXSk7CisKICAgcmV0dXJuIDQ7CiB9CiAKQEAgLTcyNCw2ICs3NDEsNyBAQAogdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEpTT05TdHJpbmcoc3RkOjpzdHJpbmcmIHN0ciwgYm9vbCBza2lwQ29udGV4dCkgewogICB1aW50MzJfdCByZXN1bHQgPSAoc2tpcENvbnRleHQgPyAwIDogY29udGV4dF8tPnJlYWQocmVhZGVyXykpOwogICByZXN1bHQgKz0gcmVhZEpTT05TeW50YXhDaGFyKGtKU09OU3RyaW5nRGVsaW1pdGVyKTsKKyAgc3RkOjp2ZWN0b3I8dWludDE2X3Q+IGNvZGV1bml0czsKICAgdWludDhfdCBjaDsKICAgc3RyLmNsZWFyKCk7CiAgIHdoaWxlICh0cnVlKSB7CkBAIC03MzYsMTAgKzc1NCwyNSBAQAogICAgICAgY2ggPSByZWFkZXJfLnJlYWQoKTsKICAgICAgICsrcmVzdWx0OwogICAgICAgaWYgKGNoID09IGtKU09ORXNjYXBlQ2hhcikgewotICAgICAgICByZXN1bHQgKz0gcmVhZEpTT05Fc2NhcGVDaGFyKCZjaCk7CisgICAgICAgIHVpbnQxNl90IGNwOworICAgICAgICByZXN1bHQgKz0gcmVhZEpTT05Fc2NhcGVDaGFyKCZjcCk7CisgICAgICAgIGlmIChpc0hpZ2hTdXJyb2dhdGUoY3ApKSB7CisgICAgICAgICAgY29kZXVuaXRzLnB1c2hfYmFjayhjcCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKGlzTG93U3Vycm9nYXRlKGNwKQorICAgICAgICAgICAgICAgJiYgY29kZXVuaXRzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWlzc2luZyBVVEYtMTYgaGlnaCBzdXJyb2dhdGUgcGFpci4iKTsKKyAgICAgICAgICB9CisgICAgICAgICAgY29kZXVuaXRzLnB1c2hfYmFjayhjcCk7CisgICAgICAgICAgY29kZXVuaXRzLnB1c2hfYmFjaygwKTsKKyAgICAgICAgICBzdHIgKz0gYm9vc3Q6OmxvY2FsZTo6Y29udjo6dXRmX3RvX3V0ZjxjaGFyPihjb2RldW5pdHMuZGF0YSgpKTsKKyAgICAgICAgICBjb2RldW5pdHMuY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICBjb250aW51ZTsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIHNpemVfdCBwb3MgPSBrRXNjYXBlQ2hhcnMuZmluZChjaCk7Ci0gICAgICAgIGlmIChwb3MgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgaWYgKHBvcyA9PSBrRXNjYXBlQ2hhcnMubnBvcykgewogICAgICAgICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGNvbnRyb2wgY2hhciwgZ290ICciICsgc3RkOjpzdHJpbmcoKGNvbnN0IGNoYXIqKSZjaCwgMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiJy4iKTsKQEAgLTc0Nyw4ICs3ODAsMTcgQEAKICAgICAgICAgY2ggPSBrRXNjYXBlQ2hhclZhbHNbcG9zXTsKICAgICAgIH0KICAgICB9CisgICAgaWYgKCFjb2RldW5pdHMuZW1wdHkoKSkgeworICAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNaXNzaW5nIFVURi0xNiBsb3cgc3Vycm9nYXRlIHBhaXIuIik7CisgICAgfQogICAgIHN0ciArPSBjaDsKICAgfQorCisgIGlmICghY29kZXVuaXRzLmVtcHR5KCkpIHsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNaXNzaW5nIFVURi0xNiBsb3cgc3Vycm9nYXRlIHBhaXIuIik7CisgIH0KICAgcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtNzYxLDYgKzgwMywxMyBAQAogICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpOwogICB1aW50MzJfdCBsZW4gPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4odG1wLmxlbmd0aCgpKTsKICAgc3RyLmNsZWFyKCk7CisgIC8vIElnbm9yZSBwYWRkaW5nCisgIGlmIChsZW4gPj0gMikgIHsKKyAgICB1aW50MzJfdCBib3VuZCA9IGxlbiAtIDI7CisgICAgZm9yICh1aW50MzJfdCBpID0gbGVuIC0gMTsgaSA+PSBib3VuZCAmJiBiW2ldID09ICc9JzsgLS1pKSB7CisgICAgICAtLWxlbjsKKyAgICB9CisgIH0KICAgd2hpbGUgKGxlbiA+PSA0KSB7CiAgICAgYmFzZTY0X2RlY29kZShiLCA0KTsKICAgICBzdHIuYXBwZW5kKChjb25zdCBjaGFyKiliLCAzKTsKQEAgLTc5Myw2ICs4NDIsMTkgQEAKICAgcmV0dXJuIHJlc3VsdDsKIH0KIAorbmFtZXNwYWNlIHsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorVCBmcm9tU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzKSB7CisgIFQgdDsKKyAgc3RkOjppc3RyaW5nc3RyZWFtIHN0cihzKTsKKyAgc3RyLmltYnVlKHN0ZDo6bG9jYWxlOjpjbGFzc2ljKCkpOworICBzdHIgPj4gdDsKKyAgaWYgKHN0ci5iYWQoKSB8fCAhc3RyLmVvZigpKQorICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcihzKTsKKyAgcmV0dXJuIHQ7Cit9Cit9CisKIC8vIFJlYWRzIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyBhbmQgYXNzZW1ibGVzIHRoZW0gaW50byBhIG51bWJlciwKIC8vIHJldHVybmluZyB0aGVtIHZpYSBudW0KIHRlbXBsYXRlIDx0eXBlbmFtZSBOdW1iZXJUeXBlPgpAQCAtODA0LDEwICs4NjYsMTAgQEAKICAgc3RkOjpzdHJpbmcgc3RyOwogICByZXN1bHQgKz0gcmVhZEpTT05OdW1lcmljQ2hhcnMoc3RyKTsKICAgdHJ5IHsKLSAgICBudW0gPSBib29zdDo6bGV4aWNhbF9jYXN0PE51bWJlclR5cGU+KHN0cik7Ci0gIH0gY2F0Y2ggKGJvb3N0OjpiYWRfbGV4aWNhbF9jYXN0IGUpIHsKKyAgICBudW0gPSBmcm9tU3RyaW5nPE51bWJlclR5cGU+KHN0cik7CisgIH0gY2F0Y2ggKGNvbnN0IHN0ZDo6cnVudGltZV9lcnJvciYpIHsKICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgbnVtZXJpYyB2YWx1ZTsgZ290IFwiIiArIHN0ciArICJcIiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgbnVtZXJpYyB2YWx1ZTsgZ290IFwiIiArIHN0ciArICJcIiIpOwogICB9CiAgIGlmIChjb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKICAgICByZXN1bHQgKz0gcmVhZEpTT05TeW50YXhDaGFyKGtKU09OU3RyaW5nRGVsaW1pdGVyKTsKQEAgLTgxNSwxOCArODc3LDYgQEAKICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotbmFtZXNwYWNlIHsKLWRvdWJsZSBzdHJpbmdUb0RvdWJsZShjb25zdCBzdGQ6OnN0cmluZyYgcykgewotICBkb3VibGUgZDsKLSAgc3RkOjppc3RyaW5nc3RyZWFtIHN0cihzKTsKLSAgc3RyLmltYnVlKHN0ZDo6bG9jYWxlOjpjbGFzc2ljKCkpOwotICBzdHIgPj4gZDsKLSAgaWYgKHN0ci5iYWQoKSB8fCAhc3RyLmVvZigpKQotICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcihzKTsKLSAgcmV0dXJuIGQ7Ci19Ci19Ci0KIC8vIFJlYWRzIGEgSlNPTiBudW1iZXIgb3Igc3RyaW5nIGFuZCBpbnRlcnByZXRzIGl0IGFzIGEgZG91YmxlLgogdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEpTT05Eb3VibGUoZG91YmxlJiBudW0pIHsKICAgdWludDMyX3QgcmVzdWx0ID0gY29udGV4dF8tPnJlYWQocmVhZGVyXyk7CkBAIC04NDcsOCArODk3LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTnVtZXJpYyBkYXRhIHVuZXhwZWN0ZWRseSBxdW90ZWQiKTsKICAgICAgIH0KICAgICAgIHRyeSB7Ci0gICAgICAgIG51bSA9IHN0cmluZ1RvRG91YmxlKHN0cik7Ci0gICAgICB9IGNhdGNoIChzdGQ6OnJ1bnRpbWVfZXJyb3IgZSkgeworICAgICAgICBudW0gPSBmcm9tU3RyaW5nPGRvdWJsZT4oc3RyKTsKKyAgICAgIH0gY2F0Y2ggKHN0ZDo6cnVudGltZV9lcnJvciYgZSkgewogICAgICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIG51bWVyaWMgdmFsdWU7IGdvdCBcIiIgKyBzdHIgKyAiXCIiKTsKICAgICAgIH0KQEAgLTg2MCw4ICs5MTAsOCBAQAogICAgIH0KICAgICByZXN1bHQgKz0gcmVhZEpTT05OdW1lcmljQ2hhcnMoc3RyKTsKICAgICB0cnkgewotICAgICAgbnVtID0gc3RyaW5nVG9Eb3VibGUoc3RyKTsKLSAgICB9IGNhdGNoIChzdGQ6OnJ1bnRpbWVfZXJyb3IgZSkgeworICAgICAgbnVtID0gZnJvbVN0cmluZzxkb3VibGU+KHN0cik7CisgICAgfSBjYXRjaCAoc3RkOjpydW50aW1lX2Vycm9yJiBlKSB7CiAgICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBudW1lcmljIHZhbHVlOyBnb3QgXCIiICsgc3RyICsgIlwiIik7CiAgICAgfQpAQCAtODcyLDcgKzkyMiw3IEBACiB1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkSlNPTk9iamVjdFN0YXJ0KCkgewogICB1aW50MzJfdCByZXN1bHQgPSBjb250ZXh0Xy0+cmVhZChyZWFkZXJfKTsKICAgcmVzdWx0ICs9IHJlYWRKU09OU3ludGF4Q2hhcihrSlNPTk9iamVjdFN0YXJ0KTsKLSAgcHVzaENvbnRleHQoYm9vc3Q6OnNoYXJlZF9wdHI8VEpTT05Db250ZXh0PihuZXcgSlNPTlBhaXJDb250ZXh0KCkpKTsKKyAgcHVzaENvbnRleHQoc3RkOjpzaGFyZWRfcHRyPFRKU09OQ29udGV4dD4obmV3IEpTT05QYWlyQ29udGV4dCgpKSk7CiAgIHJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTg4NSw3ICs5MzUsNyBAQAogdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEpTT05BcnJheVN0YXJ0KCkgewogICB1aW50MzJfdCByZXN1bHQgPSBjb250ZXh0Xy0+cmVhZChyZWFkZXJfKTsKICAgcmVzdWx0ICs9IHJlYWRKU09OU3ludGF4Q2hhcihrSlNPTkFycmF5U3RhcnQpOwotICBwdXNoQ29udGV4dChib29zdDo6c2hhcmVkX3B0cjxUSlNPTkNvbnRleHQ+KG5ldyBKU09OTGlzdENvbnRleHQoKSkpOworICBwdXNoQ29udGV4dChzdGQ6OnNoYXJlZF9wdHI8VEpTT05Db250ZXh0PihuZXcgSlNPTkxpc3RDb250ZXh0KCkpKTsKICAgcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtOTY5LDcgKzEwMTksOSBAQAogfQogCiB1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkTWFwRW5kKCkgewotICByZXR1cm4gcmVhZEpTT05PYmplY3RFbmQoKSArIHJlYWRKU09OQXJyYXlFbmQoKTsKKyAgdWludDMyX3QgcmVzdWx0ID0gcmVhZEpTT05PYmplY3RFbmQoKTsKKyAgcmVzdWx0ICs9IHJlYWRKU09OQXJyYXlFbmQoKTsKKyAgcmV0dXJuIHJlc3VsdDsKIH0KIAogdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZExpc3RCZWdpbihUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKSB7CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuaAppbmRleCAzYzdiOWQ3Li45YzJmODcyIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmgKQEAgLTUzLDYgKzUzLDEwIEBACiAgKiAgICBUaGUgcmVhZEJpbmFyeSgpIG1ldGhvZCBpcyB3cml0dGVuIHN1Y2ggdGhhdCBpdCB3aWxsIHByb3Blcmx5IHNraXAgaWYKICAqICAgIGNhbGxlZCBvbiBhIFRocmlmdCBzdHJpbmcgKGFsdGhvdWdoIGl0IHdpbGwgZGVjb2RlIGdhcmJhZ2UgZGF0YSkuCiAgKgorICogICAgTk9URTogQmFzZTY0IHBhZGRpbmcgaXMgb3B0aW9uYWwgZm9yIFRocmlmdCBiaW5hcnkgdmFsdWUgZW5jb2RpbmcuIFNvCisgKiAgICB0aGUgcmVhZEJpbmFyeSgpIG1ldGhvZCBuZWVkcyB0byBkZWNvZGUgYm90aCBpbnB1dCBzdHJpbmdzIHdpdGggcGFkZGluZworICogICAgYW5kIHRob3NlIHdpdGhvdXQgb25lLgorICoKICAqIDUuIFRocmlmdCBzdHJ1Y3RzIGFyZSByZXByZXNlbnRlZCBhcyBKU09OIG9iamVjdHMsIHdpdGggdGhlIGZpZWxkIElEIGFzIHRoZQogICogICAga2V5LCBhbmQgdGhlIGZpZWxkIHZhbHVlIHJlcHJlc2VudGVkIGFzIGEgSlNPTiBvYmplY3Qgd2l0aCBhIHNpbmdsZQogICogICAga2V5LXZhbHVlIHBhaXIuIFRoZSBrZXkgaXMgYSBzaG9ydCBzdHJpbmcgaWRlbnRpZmllciBmb3IgdGhhdCB0eXBlLApAQCAtODMsMjAgKzg3LDIxIEBACiAgKiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBpcyB0byBtYXRjaCBhcyBjbG9zZWx5IGFzIHBvc3NpYmxlIHRoZSBiZWhhdmlvcgogICogb2YgSmF2YSdzIERvdWJsZS50b1N0cmluZygpLCB3aGljaCBoYXMgbm8gcHJlY2lzaW9uIGxvc3MuICBJbXBsZW1lbnRvcnMgaW4KICAqIG90aGVyIGxhbmd1YWdlcyBzaG91bGQgc3RyaXZlIHRvIGFjaGlldmUgdGhhdCB3aGVyZSBwb3NzaWJsZS4gSSBoYXZlIG5vdAotICogeWV0IHZlcmlmaWVkIHdoZXRoZXIgYm9vc3Q6bGV4aWNhbF9jYXN0LCB3aGljaCBpcyBkb2luZyB0aGF0IHdvcmsgZm9yIG1lIGluCi0gKiBDKyssIGxvc2VzIGFueSBwcmVjaXNpb24sIGJ1dCBJIGFtIGxlYXZpbmcgdGhpcyBhcyBhIGZ1dHVyZSBpbXByb3ZlbWVudC4gSQotICogbWF5IHRyeSB0byBwcm92aWRlIGEgQyBjb21wb25lbnQgZm9yIHRoaXMsIHNvIHRoYXQgb3RoZXIgbGFuZ3VhZ2VzIGNvdWxkCi0gKiBiaW5kIHRvIHRoZSBzYW1lIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gZm9yIG1heGltdW0gY29uc2lzdGVuY3kuCisgKiB5ZXQgdmVyaWZpZWQgd2hldGhlciBzdGQ6OmlzdHJpbmdzdHJlYW06Om9wZXJhdG9yPj4sIHdoaWNoIGlzIGRvaW5nIHRoYXQKKyAqIHdvcmsgZm9yIG1lIGluIEMrKywgbG9zZXMgYW55IHByZWNpc2lvbiwgYnV0IEkgYW0gbGVhdmluZyB0aGlzIGFzIGEgZnV0dXJlCisgKiBpbXByb3ZlbWVudC4gSSBtYXkgdHJ5IHRvIHByb3ZpZGUgYSBDIGNvbXBvbmVudCBmb3IgdGhpcywgc28gdGhhdCBvdGhlcgorICogbGFuZ3VhZ2VzIGNvdWxkIGJpbmQgdG8gdGhlIHNhbWUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbiBmb3IgbWF4aW11bQorICogY29uc2lzdGVuY3kuCiAgKgogICovCiBjbGFzcyBUSlNPTlByb3RvY29sIDogcHVibGljIFRWaXJ0dWFsUHJvdG9jb2w8VEpTT05Qcm90b2NvbD4gewogcHVibGljOgotICBUSlNPTlByb3RvY29sKGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHB0cmFucyk7CisgIFRKU09OUHJvdG9jb2woc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHB0cmFucyk7CiAKICAgflRKU09OUHJvdG9jb2woKTsKIAogcHJpdmF0ZToKLSAgdm9pZCBwdXNoQ29udGV4dChib29zdDo6c2hhcmVkX3B0cjxUSlNPTkNvbnRleHQ+IGMpOworICB2b2lkIHB1c2hDb250ZXh0KHN0ZDo6c2hhcmVkX3B0cjxUSlNPTkNvbnRleHQ+IGMpOwogCiAgIHZvaWQgcG9wQ29udGV4dCgpOwogCkBAIC0xMjMsNyArMTI4LDcgQEAKIAogICB1aW50MzJfdCByZWFkSlNPTlN5bnRheENoYXIodWludDhfdCBjaCk7CiAKLSAgdWludDMyX3QgcmVhZEpTT05Fc2NhcGVDaGFyKHVpbnQ4X3QqIG91dCk7CisgIHVpbnQzMl90IHJlYWRKU09ORXNjYXBlQ2hhcih1aW50MTZfdCogb3V0KTsKIAogICB1aW50MzJfdCByZWFkSlNPTlN0cmluZyhzdGQ6OnN0cmluZyYgc3RyLCBib29sIHNraXBDb250ZXh0ID0gZmFsc2UpOwogCkBAIC0yNzEsOCArMjc2LDggQEAKIHByaXZhdGU6CiAgIFRUcmFuc3BvcnQqIHRyYW5zXzsKIAotICBzdGQ6OnN0YWNrPGJvb3N0OjpzaGFyZWRfcHRyPFRKU09OQ29udGV4dD4gPiBjb250ZXh0c187Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRKU09OQ29udGV4dD4gY29udGV4dF87CisgIHN0ZDo6c3RhY2s8c3RkOjpzaGFyZWRfcHRyPFRKU09OQ29udGV4dD4gPiBjb250ZXh0c187CisgIHN0ZDo6c2hhcmVkX3B0cjxUSlNPTkNvbnRleHQ+IGNvbnRleHRfOwogICBMb29rYWhlYWRSZWFkZXIgcmVhZGVyXzsKIH07CiAKQEAgLTI4NSw4ICsyOTAsOCBAQAogCiAgIHZpcnR1YWwgflRKU09OUHJvdG9jb2xGYWN0b3J5KCkge30KIAotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGdldFByb3RvY29sKGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSB7Ci0gICAgcmV0dXJuIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4obmV3IFRKU09OUHJvdG9jb2wodHJhbnMpKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gZ2V0UHJvdG9jb2woc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSB7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+KG5ldyBUSlNPTlByb3RvY29sKHRyYW5zKSk7CiAgIH0KIH07CiB9CkBAIC0zMDQsNyArMzA5LDcgQEAKICAgdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7CiAgIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7CiAgIFRNZW1vcnlCdWZmZXIqIGJ1ZmZlciA9IG5ldyBUTWVtb3J5QnVmZmVyOwotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucyhidWZmZXIpOworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMoYnVmZmVyKTsKICAgVEpTT05Qcm90b2NvbCBwcm90b2NvbCh0cmFucyk7CiAKICAgdHMud3JpdGUoJnByb3RvY29sKTsKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmgKaW5kZXggMDI0NGZiZS4uOTRiZDgyZSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmgKQEAgLTI1LDcgKzI1LDcgQEAKIG5hbWVzcGFjZSBhcGFjaGUgewogbmFtZXNwYWNlIHRocmlmdCB7CiBuYW1lc3BhY2UgcHJvdG9jb2wgewotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CiAKIC8qKgogICogPGNvZGU+VE11bHRpcGxleGVkUHJvdG9jb2w8L2NvZGU+IGlzIGEgcHJvdG9jb2wtaW5kZXBlbmRlbnQgY29uY3JldGUgZGVjb3JhdG9yCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmggYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmgKaW5kZXggMGRiMjIxNi4uYmJjNjgxNiAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaApAQCAtMjAsMTEgKzIwLDE1IEBACiAjaWZuZGVmIF9USFJJRlRfUFJPVE9DT0xfVFBST1RPQ09MX0hfCiAjZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfVFBST1RPQ09MX0hfIDEKIAorI2lmZGVmIF9XSU4zMgorLy8gTmVlZCB0byBjb21lIGJlZm9yZSBhbnkgV2luZG93cy5oIGluY2x1ZGVzCisjaW5jbHVkZSA8V2luc29jazIuaD4KKyNlbmRpZgorCiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5oPgogCi0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+Ci0jaW5jbHVkZSA8Ym9vc3Qvc3RhdGljX2Fzc2VydC5ocHA+CisjaW5jbHVkZSA8bWVtb3J5PgogCiAjaWZkZWYgSEFWRV9ORVRJTkVUX0lOX0gKICNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CkBAIC00Myw3ICs0Nyw3IEBACiAvLyBodHRwOi8vY2VsbHBlcmZvcm1hbmNlLmJleW9uZDNkLmNvbS9hcnRpY2xlcy8yMDA2LzA2L3VuZGVyc3RhbmRpbmctc3RyaWN0LWFsaWFzaW5nLmh0bWwKIHRlbXBsYXRlIDx0eXBlbmFtZSBUbywgdHlwZW5hbWUgRnJvbT4KIHN0YXRpYyBpbmxpbmUgVG8gYml0d2lzZV9jYXN0KEZyb20gZnJvbSkgewotICBCT09TVF9TVEFUSUNfQVNTRVJUKHNpemVvZihGcm9tKSA9PSBzaXplb2YoVG8pKTsKKyAgc3RhdGljX2Fzc2VydChzaXplb2YoRnJvbSkgPT0gc2l6ZW9mKFRvKSwgInNpemVvZihGcm9tKSA9PSBzaXplb2YoVG8pIik7CiAKICAgLy8gQkFEISEhICBUaGVzZSBhcmUgYWxsIGJyb2tlbiB3aXRoIC1PMi4KICAgLy9yZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VG8qPigmZnJvbSk7ICAvLyBCQUQhISEKQEAgLTU0NSwxMiArNTQ5LDEyIEBACiAgIH0KICAgdmlydHVhbCB1aW50MzJfdCBza2lwX3ZpcnQoVFR5cGUgdHlwZSk7CiAKLSAgaW5saW5lIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRyYW5zcG9ydCgpIHsgcmV0dXJuIHB0cmFuc187IH0KKyAgaW5saW5lIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRUcmFuc3BvcnQoKSB7IHJldHVybiBwdHJhbnNfOyB9CiAKICAgLy8gVE9ETzogcmVtb3ZlIHRoZXNlIHR3byBjYWxscywgdGhleSBhcmUgZm9yIGJhY2t3YXJkcwogICAvLyBjb21wYXRpYmlsaXR5Ci0gIGlubGluZSBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRJbnB1dFRyYW5zcG9ydCgpIHsgcmV0dXJuIHB0cmFuc187IH0KLSAgaW5saW5lIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldE91dHB1dFRyYW5zcG9ydCgpIHsgcmV0dXJuIHB0cmFuc187IH0KKyAgaW5saW5lIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRJbnB1dFRyYW5zcG9ydCgpIHsgcmV0dXJuIHB0cmFuc187IH0KKyAgaW5saW5lIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRPdXRwdXRUcmFuc3BvcnQoKSB7IHJldHVybiBwdHJhbnNfOyB9CiAKICAgLy8gaW5wdXQgYW5kIG91dHB1dCByZWN1cnNpb24gZGVwdGggYXJlIGtlcHQgc2VwYXJhdGUgc28gdGhhdCBvbmUgcHJvdG9jb2wKICAgLy8gY2FuIGJlIHVzZWQgY29uY3VycmVudGx5IGZvciBib3RoIGlucHV0IGFuZCBvdXRwdXQuCkBAIC01NzIsMTEgKzU3NiwxMSBAQAogICB2b2lkIHNldFJlY3VyaXNpb25MaW1pdCh1aW50MzJfdCBkZXB0aCkge3JlY3Vyc2lvbl9saW1pdF8gPSBkZXB0aDt9CiAKIHByb3RlY3RlZDoKLSAgVFByb3RvY29sKGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHB0cmFucykKKyAgVFByb3RvY29sKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBwdHJhbnMpCiAgICAgOiBwdHJhbnNfKHB0cmFucyksIGlucHV0X3JlY3Vyc2lvbl9kZXB0aF8oMCksIG91dHB1dF9yZWN1cnNpb25fZGVwdGhfKDApLCByZWN1cnNpb25fbGltaXRfKERFRkFVTFRfUkVDVVJTSU9OX0xJTUlUKQogICB7fQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHB0cmFuc187CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBwdHJhbnNfOwogCiBwcml2YXRlOgogICBUUHJvdG9jb2woKSB7fQpAQCAtNTk0LDcgKzU5OCwxMiBAQAogCiAgIHZpcnR1YWwgflRQcm90b2NvbEZhY3RvcnkoKTsKIAotICB2aXJ0dWFsIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gZ2V0UHJvdG9jb2woYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpID0gMDsKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBnZXRQcm90b2NvbChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpID0gMDsKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBnZXRQcm90b2NvbChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gaW5UcmFucywKKyAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBvdXRUcmFucykgeworICAgICh2b2lkKW91dFRyYW5zOworICAgIHJldHVybiBnZXRQcm90b2NvbChpblRyYW5zKTsKKyAgfQogfTsKIAogLyoqCkBAIC02NjIsNyArNjcxLDcgQEAKICAgICByZXR1cm4gcHJvdC5yZWFkQm9vbChib29sdik7CiAgIH0KICAgY2FzZSBUX0JZVEU6IHsKLSAgICBpbnQ4X3QgYnl0ZXY7CisgICAgaW50OF90IGJ5dGV2ID0gMDsKICAgICByZXR1cm4gcHJvdC5yZWFkQnl0ZShieXRldik7CiAgIH0KICAgY2FzZSBUX0kxNjogewpAQCAtNzQzLDYgKzc1Miw4IEBACiAgIGNhc2UgVF9VVEY4OgogICBjYXNlIFRfVVRGMTY6CiAgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsKICAgfQogICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IuaAppbmRleCA0NDZhODFmLi43NDNhMGY0IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5oCkBAIC0yMSwxMiArMjEsMTIgQEAKICNkZWZpbmUgVEhSSUZUX1RQUk9UT0NPTERFQ09SQVRPUl9IXyAxCiAKICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmg+Ci0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+CisjaW5jbHVkZSA8bWVtb3J5PgogCiBuYW1lc3BhY2UgYXBhY2hlIHsKIG5hbWVzcGFjZSB0aHJpZnQgewogbmFtZXNwYWNlIHByb3RvY29sIHsKLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwogCiAvKioKICAqIDxjb2RlPlRQcm90b2NvbERlY29yYXRvcjwvY29kZT4gZm9yd2FyZHMgYWxsIHJlcXVlc3RzIHRvIGFuIGVuY2xvc2VkCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmggYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmgKaW5kZXggMThhOGVkMC4uMTAxNzhlMSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uaApAQCAtNTksNyArNTksNyBAQAogICBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uVHlwZSB0eXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkKICAgICA6IGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKG1lc3NhZ2UpLCB0eXBlXyh0eXBlKSB7fQogCi0gIHZpcnR1YWwgflRQcm90b2NvbEV4Y2VwdGlvbigpIHRocm93KCkge30KKyAgdmlydHVhbCB+VFByb3RvY29sRXhjZXB0aW9uKCkgbm9leGNlcHQge30KIAogICAvKioKICAgICogUmV0dXJucyBhbiBlcnJvciBjb2RlIHRoYXQgcHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHR5cGUgb2YgZXJyb3IKQEAgLTY3LDkgKzY3LDkgQEAKICAgICoKICAgICogQHJldHVybiBFcnJvciBjb2RlCiAgICAqLwotICBUUHJvdG9jb2xFeGNlcHRpb25UeXBlIGdldFR5cGUoKSB7IHJldHVybiB0eXBlXzsgfQorICBUUHJvdG9jb2xFeGNlcHRpb25UeXBlIGdldFR5cGUoKSBjb25zdCB7IHJldHVybiB0eXBlXzsgfQogCi0gIHZpcnR1YWwgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IHRocm93KCkgeworICB2aXJ0dWFsIGNvbnN0IGNoYXIqIHdoYXQoKSBjb25zdCBub2V4Y2VwdCB7CiAgICAgaWYgKG1lc3NhZ2VfLmVtcHR5KCkpIHsKICAgICAgIHN3aXRjaCAodHlwZV8pIHsKICAgICAgIGNhc2UgVU5LTk9XTjoKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xUYXAuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xUYXAuaAppbmRleCAzZTU2MzkzLi5kMDAwYmE2IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVGFwLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbFRhcC5oCkBAIC0zNiw3ICszNiw3IEBACiAgKi8KIGNsYXNzIFRQcm90b2NvbFRhcCA6IHB1YmxpYyBUVmlydHVhbFByb3RvY29sPFRQcm90b2NvbFRhcD4gewogcHVibGljOgotICBUUHJvdG9jb2xUYXAoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBzb3VyY2UsIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gc2luaykKKyAgVFByb3RvY29sVGFwKHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHNvdXJjZSwgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gc2luaykKICAgICA6IFRWaXJ0dWFsUHJvdG9jb2w8VFByb3RvY29sVGFwPihzb3VyY2UtPmdldFRyYW5zcG9ydCgpKSwgc291cmNlXyhzb3VyY2UpLCBzaW5rXyhzaW5rKSB7fQogCiAgIHVpbnQzMl90IHJlYWRNZXNzYWdlQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsIFRNZXNzYWdlVHlwZSYgbWVzc2FnZVR5cGUsIGludDMyX3QmIHNlcWlkKSB7CkBAIC0xNjcsOCArMTY3LDggQEAKICAgfQogCiBwcml2YXRlOgotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHNvdXJjZV87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gc2lua187CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHNvdXJjZV87CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHNpbmtfOwogfTsKIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xUeXBlcy5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbFR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg5OGIyNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xUeXBlcy5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUSFJJRlRfUFJPVE9DT0xfVFBST1RPQ09MVFlQRVNfSF8KKyNkZWZpbmUgVEhSSUZUX1BST1RPQ09MX1RQUk9UT0NPTFRZUEVTX0hfIDEKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwcm90b2NvbCB7CisKK2VudW0gUFJPVE9DT0xfVFlQRVMgeworICBUX0JJTkFSWV9QUk9UT0NPTCA9IDAsCisgIFRfSlNPTl9QUk9UT0NPTCA9IDEsCisgIFRfQ09NUEFDVF9QUk9UT0NPTCA9IDIsCit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKKworI2VuZGlmIC8vICNkZWZpbmUgX1RIUklGVF9QUk9UT0NPTF9UUFJPVE9DT0xUWVBFU19IXyAxCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFZpcnR1YWxQcm90b2NvbC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RWaXJ0dWFsUHJvdG9jb2wuaAppbmRleCA4MzFjM2EyLi40ZWVhNTc5IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFZpcnR1YWxQcm90b2NvbC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UVmlydHVhbFByb3RvY29sLmgKQEAgLTMwMSw3ICszMDEsNyBAQAogICB1aW50MzJfdCBza2lwKFRUeXBlIHR5cGUpIHsgcmV0dXJuIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpza2lwKCp0aGlzLCB0eXBlKTsgfQogCiBwcm90ZWN0ZWQ6Ci0gIFRQcm90b2NvbERlZmF1bHRzKGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHB0cmFucykgOiBUUHJvdG9jb2wocHRyYW5zKSB7fQorICBUUHJvdG9jb2xEZWZhdWx0cyhzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gcHRyYW5zKSA6IFRQcm90b2NvbChwdHJhbnMpIHt9CiB9OwogCiAvKioKQEAgLTUwNCw3ICs1MDQsNyBAQAogICB1c2luZyBTdXBlcl86OnJlYWRCb29sOyAvLyBzbyB3ZSBkb24ndCBoaWRlIHJlYWRCb29sKGJvb2wmKQogCiBwcm90ZWN0ZWQ6Ci0gIFRWaXJ0dWFsUHJvdG9jb2woYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gcHRyYW5zKSA6IFN1cGVyXyhwdHJhbnMpIHt9CisgIFRWaXJ0dWFsUHJvdG9jb2woc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHB0cmFucykgOiBTdXBlcl8ocHRyYW5zKSB7fQogfTsKIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9DTWFrZUxpc3RzLnR4dCBiL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9DTWFrZUxpc3RzLnR4dAppbmRleCBjNjU3OTM4Li4wNGE5YTMxIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvcXQvQ01ha2VMaXN0cy50eHQKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3F0L0NNYWtlTGlzdHMudHh0CkBAIC0yNSwzICsyNSw0IEBACiBmaW5kX3BhY2thZ2UoUXQ1IFJFUVVJUkVEIENPTVBPTkVOVFMgQ29yZSBOZXR3b3JrKQogQUREX0xJQlJBUllfVEhSSUZUKHRocmlmdHF0NSAke3RocmlmdGNwcHF0NV9TT1VSQ0VTfSkKIFRBUkdFVF9MSU5LX0xJQlJBUklFU19USFJJRlQodGhyaWZ0cXQ1IFF0NTo6Q29yZSBRdDU6Ok5ldHdvcmspCitUQVJHRVRfTElOS19MSUJSQVJJRVNfVEhSSUZUX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkodGhyaWZ0cXQ1IHRocmlmdCkKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9UUUlPRGV2aWNlVHJhbnNwb3J0LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9UUUlPRGV2aWNlVHJhbnNwb3J0LmNwcAppbmRleCA2ODZmMjQyLi5mNzdjOTkzIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvcXQvVFFJT0RldmljZVRyYW5zcG9ydC5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3F0L1RRSU9EZXZpY2VUcmFuc3BvcnQuY3BwCkBAIC0yMywxMSArMjMsMTMgQEAKICNpbmNsdWRlIDxRSU9EZXZpY2U+CiAKICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+Ci0KLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOworI2luY2x1ZGUgPG1lbW9yeT4KIAogbmFtZXNwYWNlIGFwYWNoZSB7CiBuYW1lc3BhY2UgdGhyaWZ0IHsKKwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOworCiBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKIAogVFFJT0RldmljZVRyYW5zcG9ydDo6VFFJT0RldmljZVRyYW5zcG9ydChzaGFyZWRfcHRyPFFJT0RldmljZT4gZGV2KSA6IGRldl8oZGV2KSB7CkBAIC04OSw3ICs5MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVhZCgpOiB1bmRlcmx5aW5nIFFJT0RldmljZSBpcyBub3Qgb3BlbiIpOwogICB9CiAKLSAgYWN0dWFsU2l6ZSA9ICh1aW50MzJfdClzdGQ6Om1pbigocWludDY0KWxlbiwgZGV2Xy0+Ynl0ZXNBdmFpbGFibGUoKSk7CisgIGFjdHVhbFNpemUgPSAodWludDMyX3QpKHN0ZDo6bWluKSgocWludDY0KWxlbiwgZGV2Xy0+Ynl0ZXNBdmFpbGFibGUoKSk7CiAgIHJlYWRTaXplID0gZGV2Xy0+cmVhZChyZWludGVycHJldF9jYXN0PGNoYXIqPihidWYpLCBhY3R1YWxTaXplKTsKIAogICBpZiAocmVhZFNpemUgPCAwKSB7CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcXQvVFFJT0RldmljZVRyYW5zcG9ydC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3F0L1RRSU9EZXZpY2VUcmFuc3BvcnQuaAppbmRleCA4MDkxZDMyLi45MWNlOGQ1IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvcXQvVFFJT0RldmljZVRyYW5zcG9ydC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9UUUlPRGV2aWNlVHJhbnNwb3J0LmgKQEAgLTIwLDcgKzIwLDcgQEAKICNpZm5kZWYgX1RIUklGVF9BU1lOQ19UUUlPREVWSUNFX1RSQU5TUE9SVF9IXwogI2RlZmluZSBfVEhSSUZUX0FTWU5DX1RRSU9ERVZJQ0VfVFJBTlNQT1JUX0hfIDEKIAotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgorI2luY2x1ZGUgPG1lbW9yeT4KIAogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFZpcnR1YWxUcmFuc3BvcnQuaD4KIApAQCAtMzYsNyArMzYsNyBAQAogY2xhc3MgVFFJT0RldmljZVRyYW5zcG9ydAogICAgIDogcHVibGljIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRWaXJ0dWFsVHJhbnNwb3J0PFRRSU9EZXZpY2VUcmFuc3BvcnQ+IHsKIHB1YmxpYzoKLSAgZXhwbGljaXQgVFFJT0RldmljZVRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxRSU9EZXZpY2U+IGRldik7CisgIGV4cGxpY2l0IFRRSU9EZXZpY2VUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFFJT0RldmljZT4gZGV2KTsKICAgdmlydHVhbCB+VFFJT0RldmljZVRyYW5zcG9ydCgpOwogCiAgIHZvaWQgb3BlbigpOwpAQCAtNTksNyArNTksNyBAQAogICBUUUlPRGV2aWNlVHJhbnNwb3J0KGNvbnN0IFRRSU9EZXZpY2VUcmFuc3BvcnQmKTsKICAgVFFJT0RldmljZVRyYW5zcG9ydCYgb3BlcmF0b3I9KGNvbnN0IFRRSU9EZXZpY2VUcmFuc3BvcnQmKTsKIAotICBib29zdDo6c2hhcmVkX3B0cjxRSU9EZXZpY2U+IGRldl87CisgIHN0ZDo6c2hhcmVkX3B0cjxRSU9EZXZpY2U+IGRldl87CiB9OwogfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3F0L1RRVGNwU2VydmVyLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9UUVRjcFNlcnZlci5jcHAKaW5kZXggYTMyMTFkZi4uOTlhYWQwNyAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3F0L1RRVGNwU2VydmVyLmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcXQvVFFUY3BTZXJ2ZXIuY3BwCkBAIC0xNywyNCArMTcsMjcgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPG1lbW9yeT4KKwogI2luY2x1ZGUgPHRocmlmdC9xdC9UUVRjcFNlcnZlci5oPgogI2luY2x1ZGUgPHRocmlmdC9xdC9UUUlPRGV2aWNlVHJhbnNwb3J0Lmg+CiAKKyNpbmNsdWRlIDxRTWV0YVR5cGU+CiAjaW5jbHVkZSA8UVRjcFNvY2tldD4KIAotI2luY2x1ZGUgPHRocmlmdC9jeHhmdW5jdGlvbmFsLmg+Ci0KICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RBc3luY1Byb2Nlc3Nvci5oPgogCi11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5OwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydDsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb247CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUUUlPRGV2aWNlVHJhbnNwb3J0OwotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnN0ZGN4eDo6ZnVuY3Rpb247Ci11c2luZyBhcGFjaGU6OnRocmlmdDo6c3RkY3h4OjpiaW5kOwordXNpbmcgc3RkOjpiaW5kOwordXNpbmcgc3RkOjpmdW5jdGlvbjsKK3VzaW5nIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMTsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKIAogUVRfVVNFX05BTUVTUEFDRQogCkBAIC02MCw2ICs2Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwZmFjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICBRT2JqZWN0KiBwYXJlbnQpCiAgIDogUU9iamVjdChwYXJlbnQpLCBzZXJ2ZXJfKHNlcnZlciksIHByb2Nlc3Nvcl8ocHJvY2Vzc29yKSwgcGZhY3RfKHBmYWN0KSB7CisgIHFSZWdpc3Rlck1ldGFUeXBlPFFUY3BTb2NrZXQqPigiUVRjcFNvY2tldCoiKTsKICAgY29ubmVjdChzZXJ2ZXIuZ2V0KCksIFNJR05BTChuZXdDb25uZWN0aW9uKCkpLCBTTE9UKHByb2Nlc3NJbmNvbWluZygpKSk7CiB9CiAKQEAgLTkxLDggKzk1LDcgQEAKIAogICAgIGNvbm5lY3QoY29ubmVjdGlvbi5nZXQoKSwgU0lHTkFMKHJlYWR5UmVhZCgpKSwgU0xPVChiZWdpbkRlY29kZSgpKSk7CiAKLSAgICAvLyBuZWVkIHRvIHVzZSBRdWV1ZWRDb25uZWN0aW9uIHNpbmNlIHdlIHdpbGwgYmUgZGVsZXRpbmcgdGhlIHNvY2tldCBpbiB0aGUgc2xvdAotICAgIGNvbm5lY3QoY29ubmVjdGlvbi5nZXQoKSwgU0lHTkFMKGRpc2Nvbm5lY3RlZCgpKSwgU0xPVChzb2NrZXRDbG9zZWQoKSksIFF0OjpRdWV1ZWRDb25uZWN0aW9uKTsKKyAgICBjb25uZWN0KGNvbm5lY3Rpb24uZ2V0KCksIFNJR05BTChkaXNjb25uZWN0ZWQoKSksIFNMT1Qoc29ja2V0Q2xvc2VkKCkpKTsKICAgfQogfQogCkBAIC0xMDksMzQgKzExMiwzOSBAQAogCiAgIHRyeSB7CiAgICAgcHJvY2Vzc29yXwotICAgICAgICAtPnByb2Nlc3MoYmluZCgmVFFUY3BTZXJ2ZXI6OmZpbmlzaCwgdGhpcywgY3R4LCBhcGFjaGU6OnRocmlmdDo6c3RkY3h4OjpwbGFjZWhvbGRlcnM6Ol8xKSwKKyAgICAgICAgLT5wcm9jZXNzKGJpbmQoJlRRVGNwU2VydmVyOjpmaW5pc2gsIHRoaXMsIGN0eCwgXzEpLAogICAgICAgICAgICAgICAgICAgY3R4LT5pcHJvdF8sCiAgICAgICAgICAgICAgICAgICBjdHgtPm9wcm90Xyk7CiAgIH0gY2F0Y2ggKGNvbnN0IFRUcmFuc3BvcnRFeGNlcHRpb24mIGV4KSB7CiAgICAgcVdhcm5pbmcoIltUUVRjcFNlcnZlcl0gVFRyYW5zcG9ydEV4Y2VwdGlvbiBkdXJpbmcgcHJvY2Vzc2luZzogJyVzJyIsIGV4LndoYXQoKSk7Ci0gICAgY3R4TWFwXy5lcmFzZShjb25uZWN0aW9uKTsKKyAgICBzY2hlZHVsZURlbGV0ZUNvbm5lY3Rpb25Db250ZXh0KGNvbm5lY3Rpb24pOwogICB9IGNhdGNoICguLi4pIHsKICAgICBxV2FybmluZygiW1RRVGNwU2VydmVyXSBVbmtub3duIHByb2Nlc3NvciBleGNlcHRpb24iKTsKLSAgICBjdHhNYXBfLmVyYXNlKGNvbm5lY3Rpb24pOworICAgIHNjaGVkdWxlRGVsZXRlQ29ubmVjdGlvbkNvbnRleHQoY29ubmVjdGlvbik7CiAgIH0KIH0KIAogdm9pZCBUUVRjcFNlcnZlcjo6c29ja2V0Q2xvc2VkKCkgewogICBRVGNwU29ja2V0KiBjb25uZWN0aW9uKHFvYmplY3RfY2FzdDxRVGNwU29ja2V0Kj4oc2VuZGVyKCkpKTsKICAgUV9BU1NFUlQoY29ubmVjdGlvbik7CisgIHNjaGVkdWxlRGVsZXRlQ29ubmVjdGlvbkNvbnRleHQoY29ubmVjdGlvbik7Cit9CiAKLSAgaWYgKGN0eE1hcF8uZmluZChjb25uZWN0aW9uKSA9PSBjdHhNYXBfLmVuZCgpKSB7Ci0gICAgcVdhcm5pbmcoIltUUVRjcFNlcnZlcl0gVW5rbm93biBRVGNwU29ja2V0IGNsb3NlZCIpOwotICAgIHJldHVybjsKK3ZvaWQgVFFUY3BTZXJ2ZXI6OmRlbGV0ZUNvbm5lY3Rpb25Db250ZXh0KFFUY3BTb2NrZXQqIGNvbm5lY3Rpb24pIHsKKyAgY29uc3QgQ29ubmVjdGlvbkNvbnRleHRNYXA6OnNpemVfdHlwZSBkZWxldGVkID0gY3R4TWFwXy5lcmFzZShjb25uZWN0aW9uKTsKKyAgaWYgKDAgPT0gZGVsZXRlZCkgeworICAgICAgcVdhcm5pbmcoIltUUVRjcFNlcnZlcl0gVW5rbm93biBRVGNwU29ja2V0Iik7CiAgIH0KK30KIAotICBjdHhNYXBfLmVyYXNlKGNvbm5lY3Rpb24pOwordm9pZCBUUVRjcFNlcnZlcjo6c2NoZWR1bGVEZWxldGVDb25uZWN0aW9uQ29udGV4dChRVGNwU29ja2V0KiBjb25uZWN0aW9uKSB7CisgIFFNZXRhT2JqZWN0OjppbnZva2VNZXRob2QodGhpcywgImRlbGV0ZUNvbm5lY3Rpb25Db250ZXh0IiwgUXQ6OlF1ZXVlZENvbm5lY3Rpb24sIFFfQVJHKFFUY3BTb2NrZXQqLCBjb25uZWN0aW9uKSk7CiB9CiAKIHZvaWQgVFFUY3BTZXJ2ZXI6OmZpbmlzaChzaGFyZWRfcHRyPENvbm5lY3Rpb25Db250ZXh0PiBjdHgsIGJvb2wgaGVhbHRoeSkgewogICBpZiAoIWhlYWx0aHkpIHsKICAgICBxV2FybmluZygiW1RRVGNwU2VydmVyXSBQcm9jZXNzb3IgZmFpbGVkIHRvIHByb2Nlc3MgZGF0YSBzdWNjZXNzZnVsbHkiKTsKLSAgICBjdHhNYXBfLmVyYXNlKGN0eC0+Y29ubmVjdGlvbl8uZ2V0KCkpOworICAgIGRlbGV0ZUNvbm5lY3Rpb25Db250ZXh0KGN0eC0+Y29ubmVjdGlvbl8uZ2V0KCkpOwogICB9CiB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcXQvVFFUY3BTZXJ2ZXIuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9UUVRjcFNlcnZlci5oCmluZGV4IDM0MDNmMWUuLjhlM2ZlM2EgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9UUVRjcFNlcnZlci5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9UUVRjcFNlcnZlci5oCkBAIC0yMyw3ICsyMyw3IEBACiAjaW5jbHVkZSA8UU9iamVjdD4KICNpbmNsdWRlIDxRVGNwU2VydmVyPgogCi0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+CisjaW5jbHVkZSA8bWVtb3J5PgogCiBuYW1lc3BhY2UgYXBhY2hlIHsKIG5hbWVzcGFjZSB0aHJpZnQgewpAQCAtNDcsMzAgKzQ3LDMyIEBACiBjbGFzcyBUUVRjcFNlcnZlciA6IHB1YmxpYyBRT2JqZWN0IHsKICAgUV9PQkpFQ1QKIHB1YmxpYzoKLSAgVFFUY3BTZXJ2ZXIoYm9vc3Q6OnNoYXJlZF9wdHI8UVRjcFNlcnZlcj4gc2VydmVyLAotICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUQXN5bmNQcm9jZXNzb3I+IHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgIFFUX1BSRVBFTkRfTkFNRVNQQUNFKFFPYmplY3QpKiBwYXJlbnQgPSBOVUxMKTsKKyAgVFFUY3BTZXJ2ZXIoc3RkOjpzaGFyZWRfcHRyPFFUY3BTZXJ2ZXI+IHNlcnZlciwKKyAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRBc3luY1Byb2Nlc3Nvcj4gcHJvY2Vzc29yLAorICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgIFFPYmplY3QqIHBhcmVudCA9IE5VTEwpOwogICB2aXJ0dWFsIH5UUVRjcFNlcnZlcigpOwogCiBwcml2YXRlIFFfU0xPVFM6CiAgIHZvaWQgcHJvY2Vzc0luY29taW5nKCk7CiAgIHZvaWQgYmVnaW5EZWNvZGUoKTsKICAgdm9pZCBzb2NrZXRDbG9zZWQoKTsKKyAgdm9pZCBkZWxldGVDb25uZWN0aW9uQ29udGV4dChRVGNwU29ja2V0KiBjb25uZWN0aW9uKTsKIAogcHJpdmF0ZToKLSAgVFFUY3BTZXJ2ZXIoY29uc3QgVFFUY3BTZXJ2ZXImKTsKLSAgVFFUY3BTZXJ2ZXImIG9wZXJhdG9yPShjb25zdCBUUVRjcFNlcnZlciYpOworICBRX0RJU0FCTEVfQ09QWShUUVRjcFNlcnZlcikKIAogICBzdHJ1Y3QgQ29ubmVjdGlvbkNvbnRleHQ7CiAKLSAgdm9pZCBmaW5pc2goYm9vc3Q6OnNoYXJlZF9wdHI8Q29ubmVjdGlvbkNvbnRleHQ+IGN0eCwgYm9vbCBoZWFsdGh5KTsKKyAgdm9pZCBzY2hlZHVsZURlbGV0ZUNvbm5lY3Rpb25Db250ZXh0KFFUY3BTb2NrZXQqIGNvbm5lY3Rpb24pOworICB2b2lkIGZpbmlzaChzdGQ6OnNoYXJlZF9wdHI8Q29ubmVjdGlvbkNvbnRleHQ+IGN0eCwgYm9vbCBoZWFsdGh5KTsKIAotICBib29zdDo6c2hhcmVkX3B0cjxRVGNwU2VydmVyPiBzZXJ2ZXJfOwotICBib29zdDo6c2hhcmVkX3B0cjxUQXN5bmNQcm9jZXNzb3I+IHByb2Nlc3Nvcl87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4gcGZhY3RfOworICBzdGQ6OnNoYXJlZF9wdHI8UVRjcFNlcnZlcj4gc2VydmVyXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRBc3luY1Byb2Nlc3Nvcj4gcHJvY2Vzc29yXzsKKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4gcGZhY3RfOwogCi0gIHN0ZDo6bWFwPFFUX1BSRVBFTkRfTkFNRVNQQUNFKFFUY3BTb2NrZXQpKiwgYm9vc3Q6OnNoYXJlZF9wdHI8Q29ubmVjdGlvbkNvbnRleHQ+ID4gY3R4TWFwXzsKKyAgdHlwZWRlZiBzdGQ6Om1hcDxRVGNwU29ja2V0Kiwgc3RkOjpzaGFyZWRfcHRyPENvbm5lY3Rpb25Db250ZXh0PiA+IENvbm5lY3Rpb25Db250ZXh0TWFwOworICBDb25uZWN0aW9uQ29udGV4dE1hcCBjdHhNYXBfOwogfTsKIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVENvbm5lY3RlZENsaWVudC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RDb25uZWN0ZWRDbGllbnQuY3BwCmluZGV4IGMyNDhlNjMuLmFjZGFhNzcgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVENvbm5lY3RlZENsaWVudC5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UQ29ubmVjdGVkQ2xpZW50LmNwcApAQCAtMjgsNyArMjgsNyBAQAogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjo6VFNlcnZlckV2ZW50SGFuZGxlcjsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOwotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CiB1c2luZyBzdGQ6OnN0cmluZzsKIAogVENvbm5lY3RlZENsaWVudDo6VENvbm5lY3RlZENsaWVudChjb25zdCBzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCkBAIC02NCwyOSArNjQsMjggQEAKICAgICAgIH0KICAgICB9IGNhdGNoIChjb25zdCBUVHJhbnNwb3J0RXhjZXB0aW9uJiB0dHgpIHsKICAgICAgIHN3aXRjaCAodHR4LmdldFR5cGUoKSkgewotICAgICAgY2FzZSBUVHJhbnNwb3J0RXhjZXB0aW9uOjpUSU1FRF9PVVQ6Ci0gICAgICAgIC8vIFJlY2VpdmUgdGltZW91dCAtIGNvbnRpbnVlIHByb2Nlc3NpbmcuCi0gICAgICAgIGNvbnRpbnVlOworICAgICAgICBjYXNlIFRUcmFuc3BvcnRFeGNlcHRpb246OkVORF9PRl9GSUxFOgorICAgICAgICBjYXNlIFRUcmFuc3BvcnRFeGNlcHRpb246OklOVEVSUlVQVEVEOgorICAgICAgICBjYXNlIFRUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVDoKKyAgICAgICAgICAvLyBDbGllbnQgZGlzY29ubmVjdGVkIG9yIHdhcyBpbnRlcnJ1cHRlZCBvciBkaWQgbm90IHJlc3BvbmQgd2l0aGluIHRoZSByZWNlaXZlIHRpbWVvdXQuCisgICAgICAgICAgLy8gTm8gbG9nZ2luZyBuZWVkZWQuICBEb25lLgorICAgICAgICAgIGRvbmUgPSB0cnVlOworICAgICAgICAgIGJyZWFrOwogCi0gICAgICBjYXNlIFRUcmFuc3BvcnRFeGNlcHRpb246OkVORF9PRl9GSUxFOgotICAgICAgY2FzZSBUVHJhbnNwb3J0RXhjZXB0aW9uOjpJTlRFUlJVUFRFRDoKLSAgICAgICAgLy8gQ2xpZW50IGRpc2Nvbm5lY3RlZCBvciB3YXMgaW50ZXJydXB0ZWQuICBObyBsb2dnaW5nIG5lZWRlZC4gIERvbmUuCi0gICAgICAgIGRvbmUgPSB0cnVlOwotICAgICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDogewotICAgICAgICAvLyBBbGwgb3RoZXIgdHJhbnNwb3J0IGV4Y2VwdGlvbnMgYXJlIGxvZ2dlZC4KLSAgICAgICAgLy8gU3RhdGUgb2YgY29ubmVjdGlvbiBpcyB1bmtub3duLiAgRG9uZS4KLSAgICAgICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVENvbm5lY3RlZENsaWVudCBkaWVkOiAiKSArIHR0eC53aGF0KCk7Ci0gICAgICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7Ci0gICAgICAgIGRvbmUgPSB0cnVlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KKyAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgIC8vIEFsbCBvdGhlciB0cmFuc3BvcnQgZXhjZXB0aW9ucyBhcmUgbG9nZ2VkLgorICAgICAgICAgIC8vIFN0YXRlIG9mIGNvbm5lY3Rpb24gaXMgdW5rbm93bi4gIERvbmUuCisgICAgICAgICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVENvbm5lY3RlZENsaWVudCBkaWVkOiAiKSArIHR0eC53aGF0KCk7CisgICAgICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKKyAgICAgICAgICBkb25lID0gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogICAgICAgfQogICAgIH0gY2F0Y2ggKGNvbnN0IFRFeGNlcHRpb24mIHRleCkgewogICAgICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVENvbm5lY3RlZENsaWVudCBwcm9jZXNzaW5nIGV4Y2VwdGlvbjogIikgKyB0ZXgud2hhdCgpOwogICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICAgIC8vIENvbnRpbnVlIHByb2Nlc3NpbmcKKyAgICAgIC8vIERpc2Nvbm5lY3QgZnJvbSBjbGllbnQsIGJlY2F1c2Ugd2UgY291bGQgbm90IHByb2Nlc3MgdGhlIG1lc3NhZ2UuCisgICAgICBkb25lID0gdHJ1ZTsKICAgICB9CiAgIH0KIApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UQ29ubmVjdGVkQ2xpZW50LmggYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RDb25uZWN0ZWRDbGllbnQuaAppbmRleCAzZWEwNjVlLi4xOWU3MGMxIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RDb25uZWN0ZWRDbGllbnQuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RDb25uZWN0ZWRDbGllbnQuaApAQCAtMjAsNyArMjAsNyBAQAogI2lmbmRlZiBfVEhSSUZUX1NFUlZFUl9UQ09OTkVDVEVEQ0xJRU5UX0hfCiAjZGVmaW5lIF9USFJJRlRfU0VSVkVSX1RDT05ORUNURURDTElFTlRfSF8gMQogCi0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+CisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHRocmlmdC9UUHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oPgogI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFNlcnZlci5oPgpAQCAtNDksMTEgKzQ5LDExIEBACiAgICAqIEBwYXJhbVtpbl0gY2xpZW50ICAgICAgICAgdGhlIFRUcmFuc3BvcnQgcmVwcmVzZW50aW5nIHRoZSBjbGllbnQKICAgICovCiAgIFRDb25uZWN0ZWRDbGllbnQoCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiYgaW5wdXRQcm90b2NvbCwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiYgb3V0cHV0UHJvdG9jb2wsCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6c2VydmVyOjpUU2VydmVyRXZlbnRIYW5kbGVyPiYgZXZlbnRIYW5kbGVyLAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydD4mIGNsaWVudCk7CisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+JiBpbnB1dFByb3RvY29sLAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiYgb3V0cHV0UHJvdG9jb2wsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjo6VFNlcnZlckV2ZW50SGFuZGxlcj4mIGV2ZW50SGFuZGxlciwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0PiYgY2xpZW50KTsKIAogICAvKioKICAgICogRGVzdHJ1Y3Rvci4KQEAgLTkyLDExICs5MiwxMSBAQAogICB2aXJ0dWFsIHZvaWQgY2xlYW51cCgpOwogCiBwcml2YXRlOgotICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3Nvcj4gcHJvY2Vzc29yXzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IGlucHV0UHJvdG9jb2xfOwotICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0cHV0UHJvdG9jb2xfOwotICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6c2VydmVyOjpUU2VydmVyRXZlbnRIYW5kbGVyPiBldmVudEhhbmRsZXJfOwotICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0PiBjbGllbnRfOworICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I+IHByb2Nlc3Nvcl87CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gaW5wdXRQcm90b2NvbF87CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0cHV0UHJvdG9jb2xfOworICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjo6VFNlcnZlckV2ZW50SGFuZGxlcj4gZXZlbnRIYW5kbGVyXzsKKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ+IGNsaWVudF87CiAKICAgLyoqCiAgICAqIENvbnRleHQgYWNxdWlyZWQgZnJvbSB0aGUgZXZlbnRIYW5kbGVyXyBpZiBvbmUgZXhpc3RzLgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuY3BwCmluZGV4IGQxZTllZGUuLmYxNmZjZTcgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5jcHAKQEAgLTE3LDggKzE3LDYgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNkZWZpbmUgX19TVERDX0ZPUk1BVF9NQUNST1MKLQogI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CiAKICNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5oPgpAQCAtMjcsOSArMjUsMTQgQEAKICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvUGxhdGZvcm1UaHJlYWRGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9QbGF0Zm9ybVNvY2tldC5oPgogCisjaW5jbHVkZSA8YWxnb3JpdGhtPgogI2luY2x1ZGUgPGlvc3RyZWFtPgogCi0jaWZkZWYgSEFWRV9TWVNfU0VMRUNUX0gKKyNpZmRlZiBIQVZFX1BPTExfSAorI2luY2x1ZGUgPHBvbGwuaD4KKyNlbGlmIEhBVkVfU1lTX1BPTExfSAorI2luY2x1ZGUgPHN5cy9wb2xsLmg+CisjZWxpZiBIQVZFX1NZU19TRUxFQ1RfSAogI2luY2x1ZGUgPHN5cy9zZWxlY3QuaD4KICNlbmRpZgogCkBAIC02NCw5ICs2NywxMiBAQAogI2RlZmluZSBBRl9MT0NBTCBBRl9VTklYCiAjZW5kaWYKIAotI2lmICFkZWZpbmVkKFBSSXUzMikKLSNkZWZpbmUgUFJJdTMyICJJMzJ1IgotI2RlZmluZSBQUkl1NjQgIkk2NHUiCisjaWZkZWYgSEFWRV9JTlRUWVBFU19ICisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TVERJTlRfSAorI2luY2x1ZGUgPHN0ZGludC5oPgogI2VuZGlmCiAKIG5hbWVzcGFjZSBhcGFjaGUgewpAQCAtNzYsMTAgKzgyLDkgQEAKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7Ci11c2luZyBuYW1lc3BhY2Ugc3RkOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNvY2tldDsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb247Ci11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKIAogLy8vIFRocmVlIHN0YXRlcyBmb3Igc29ja2V0czogcmVjdiBmcmFtZSBzaXplLCByZWN2IGRhdGEsIGFuZCBzZW5kIG1vZGUKIGVudW0gVFNvY2tldFN0YXRlIHsgU09DS0VUX1JFQ1ZfRlJBTUlORywgU09DS0VUX1JFQ1YsIFNPQ0tFVF9TRU5EIH07CkBAIC0xMTQsMTAgKzExOSwxMCBAQAogICBUTm9uYmxvY2tpbmdTZXJ2ZXIqIHNlcnZlcl87CiAKICAgLy8vIFRQcm9jZXNzb3IKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3Nvcl87CiAKICAgLy8vIE9iamVjdCB3cmFwcGluZyBuZXR3b3JrIHNvY2tldAotICBib29zdDo6c2hhcmVkX3B0cjxUU29ja2V0PiB0U29ja2V0XzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHRTb2NrZXRfOwogCiAgIC8vLyBMaWJldmVudCBvYmplY3QKICAgc3RydWN0IGV2ZW50IGV2ZW50XzsKQEAgLTE1OSwyMyArMTY0LDIzIEBACiAgIGludDMyX3QgY2FsbHNGb3JSZXNpemVfOwogCiAgIC8vLyBUcmFuc3BvcnQgdG8gcmVhZCBmcm9tCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGlucHV0VHJhbnNwb3J0XzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGlucHV0VHJhbnNwb3J0XzsKIAogICAvLy8gVHJhbnNwb3J0IHRoYXQgcHJvY2Vzc29yIHdyaXRlcyB0bwotICBib29zdDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBvdXRwdXRUcmFuc3BvcnRfOworICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gb3V0cHV0VHJhbnNwb3J0XzsKIAogICAvLy8gZXh0cmEgdHJhbnNwb3J0IGdlbmVyYXRlZCBieSB0cmFuc3BvcnQgZmFjdG9yeSAoZS5nLiBCdWZmZXJlZFJvdXRlclRyYW5zcG9ydCkKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZmFjdG9yeUlucHV0VHJhbnNwb3J0XzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZmFjdG9yeU91dHB1dFRyYW5zcG9ydF87CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBmYWN0b3J5SW5wdXRUcmFuc3BvcnRfOworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZmFjdG9yeU91dHB1dFRyYW5zcG9ydF87CiAKICAgLy8vIFByb3RvY29sIGRlY29kZXIKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dFByb3RvY29sXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXRQcm90b2NvbF87CiAKICAgLy8vIFByb3RvY29sIGVuY29kZXIKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXRQcm90b2NvbF87CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dFByb3RvY29sXzsKIAogICAvLy8gU2VydmVyIGV2ZW50IGhhbmRsZXIsIGlmIGFueQotICBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyRXZlbnRIYW5kbGVyPiBzZXJ2ZXJFdmVudEhhbmRsZXJfOworICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlckV2ZW50SGFuZGxlcj4gc2VydmVyRXZlbnRIYW5kbGVyXzsKIAogICAvLy8gVGhyaWZ0IGNhbGwgY29udGV4dCwgaWYgYW55CiAgIHZvaWQqIGNvbm5lY3Rpb25Db250ZXh0XzsKQEAgLTIwOCwxMCArMjEzLDggQEAKICAgY2xhc3MgVGFzazsKIAogICAvLy8gQ29uc3RydWN0b3IKLSAgVENvbm5lY3Rpb24oVEhSSUZUX1NPQ0tFVCBzb2NrZXQsCi0gICAgICAgICAgICAgIFROb25ibG9ja2luZ0lPVGhyZWFkKiBpb1RocmVhZCwKLSAgICAgICAgICAgICAgY29uc3Qgc29ja2FkZHIqIGFkZHIsCi0gICAgICAgICAgICAgIHNvY2tsZW5fdCBhZGRyTGVuKSB7CisgIFRDb25uZWN0aW9uKHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBzb2NrZXQsCisgICAgICAgICAgICAgIFROb25ibG9ja2luZ0lPVGhyZWFkKiBpb1RocmVhZCkgewogICAgIHJlYWRCdWZmZXJfID0gTlVMTDsKICAgICByZWFkQnVmZmVyU2l6ZV8gPSAwOwogCkBAIC0yMjMsOCArMjI2LDEwIEBACiAgICAgaW5wdXRUcmFuc3BvcnRfLnJlc2V0KG5ldyBUTWVtb3J5QnVmZmVyKHJlYWRCdWZmZXJfLCByZWFkQnVmZmVyU2l6ZV8pKTsKICAgICBvdXRwdXRUcmFuc3BvcnRfLnJlc2V0KAogICAgICAgICBuZXcgVE1lbW9yeUJ1ZmZlcihzdGF0aWNfY2FzdDx1aW50MzJfdD4oc2VydmVyXy0+Z2V0V3JpdGVCdWZmZXJEZWZhdWx0U2l6ZSgpKSkpOwotICAgIHRTb2NrZXRfLnJlc2V0KG5ldyBUU29ja2V0KCkpOwotICAgIGluaXQoc29ja2V0LCBpb1RocmVhZCwgYWRkciwgYWRkckxlbik7CisKKyAgICB0U29ja2V0XyA9ICBzb2NrZXQ7CisKKyAgICBpbml0KGlvVGhyZWFkKTsKICAgfQogCiAgIH5UQ29ubmVjdGlvbigpIHsgc3RkOjpmcmVlKHJlYWRCdWZmZXJfKTsgfQpAQCAtMjQxLDEwICsyNDYsMTAgQEAKICAgdm9pZCBjaGVja0lkbGVCdWZmZXJNZW1MaW1pdChzaXplX3QgcmVhZExpbWl0LCBzaXplX3Qgd3JpdGVMaW1pdCk7CiAKICAgLy8vIEluaXRpYWxpemUKLSAgdm9pZCBpbml0KFRIUklGVF9TT0NLRVQgc29ja2V0LAotICAgICAgICAgICAgVE5vbmJsb2NraW5nSU9UaHJlYWQqIGlvVGhyZWFkLAotICAgICAgICAgICAgY29uc3Qgc29ja2FkZHIqIGFkZHIsCi0gICAgICAgICAgICBzb2NrbGVuX3QgYWRkckxlbik7CisgIHZvaWQgaW5pdChUTm9uYmxvY2tpbmdJT1RocmVhZCogaW9UaHJlYWQpOworCisgIC8vLyBzZXQgc29ja2V0IGZvciBjb25uZWN0aW9uCisgIHZvaWQgc2V0U29ja2V0KHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBzb2NrZXQpOwogCiAgIC8qKgogICAgKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBhcHBsaWNhdGlvbiB0cmFuc2l0aW9ucyBmcm9tIG9uZSBzdGF0ZSBpbnRvCkBAIC0yODcsNiArMjkyLDcgQEAKICAgdm9pZCBmb3JjZUNsb3NlKCkgewogICAgIGFwcFN0YXRlXyA9IEFQUF9DTE9TRV9DT05ORUNUSU9OOwogICAgIGlmICghbm90aWZ5SU9UaHJlYWQoKSkgeworICAgICAgc2VydmVyXy0+ZGVjcmVtZW50QWN0aXZlUHJvY2Vzc29ycygpOwogICAgICAgY2xvc2UoKTsKICAgICAgIHRocm93IFRFeGNlcHRpb24oIlRDb25uZWN0aW9uOjpmb3JjZUNsb3NlOiBmYWlsZWQgd3JpdGUgb24gbm90aWZ5IHBpcGUiKTsKICAgICB9CkBAIC0yOTksMTAgKzMwNSwxMCBAQAogICBUQXBwU3RhdGUgZ2V0U3RhdGUoKSBjb25zdCB7IHJldHVybiBhcHBTdGF0ZV87IH0KIAogICAvLy8gcmV0dXJuIHRoZSBUU29ja2V0IHRyYW5zcG9ydCB3cmFwcGluZyB0aGlzIG5ldHdvcmsgY29ubmVjdGlvbgotICBib29zdDo6c2hhcmVkX3B0cjxUU29ja2V0PiBnZXRUU29ja2V0KCkgY29uc3QgeyByZXR1cm4gdFNvY2tldF87IH0KKyAgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IGdldFRTb2NrZXQoKSBjb25zdCB7IHJldHVybiB0U29ja2V0XzsgfQogCiAgIC8vLyByZXR1cm4gdGhlIHNlcnZlciBldmVudCBoYW5kbGVyIGlmIGFueQotICBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyRXZlbnRIYW5kbGVyPiBnZXRTZXJ2ZXJFdmVudEhhbmRsZXIoKSB7IHJldHVybiBzZXJ2ZXJFdmVudEhhbmRsZXJfOyB9CisgIHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyRXZlbnRIYW5kbGVyPiBnZXRTZXJ2ZXJFdmVudEhhbmRsZXIoKSB7IHJldHVybiBzZXJ2ZXJFdmVudEhhbmRsZXJfOyB9CiAKICAgLy8vIHJldHVybiB0aGUgVGhyaWZ0IGNvbm5lY3Rpb24gY29udGV4dCBpZiBhbnkKICAgdm9pZCogZ2V0Q29ubmVjdGlvbkNvbnRleHQoKSB7IHJldHVybiBjb25uZWN0aW9uQ29udGV4dF87IH0KQEAgLTMxMCw5ICszMTYsOSBAQAogCiBjbGFzcyBUTm9uYmxvY2tpbmdTZXJ2ZXI6OlRDb25uZWN0aW9uOjpUYXNrIDogcHVibGljIFJ1bm5hYmxlIHsKIHB1YmxpYzoKLSAgVGFzayhib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCi0gICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dCwKLSAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dCwKKyAgVGFzayhzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yLAorICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0LAorICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dCwKICAgICAgICBUQ29ubmVjdGlvbiogY29ubmVjdGlvbikKICAgICA6IHByb2Nlc3Nvcl8ocHJvY2Vzc29yKSwKICAgICAgIGlucHV0XyhpbnB1dCksCkBAIC0zMzQsNyArMzQwLDcgQEAKICAgICAgIH0KICAgICB9IGNhdGNoIChjb25zdCBUVHJhbnNwb3J0RXhjZXB0aW9uJiB0dHgpIHsKICAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlROb25ibG9ja2luZ1NlcnZlcjogY2xpZW50IGRpZWQ6ICVzIiwgdHR4LndoYXQoKSk7Ci0gICAgfSBjYXRjaCAoY29uc3QgYmFkX2FsbG9jJikgeworICAgIH0gY2F0Y2ggKGNvbnN0IHN0ZDo6YmFkX2FsbG9jJikgewogICAgICAgR2xvYmFsT3V0cHV0KCJUTm9uYmxvY2tpbmdTZXJ2ZXI6IGNhdWdodCBiYWRfYWxsb2MgZXhjZXB0aW9uLiIpOwogICAgICAgZXhpdCgxKTsKICAgICB9IGNhdGNoIChjb25zdCBzdGQ6OmV4Y2VwdGlvbiYgeCkgewpAQCAtMzQ4LDYgKzM1NCw3IEBACiAgICAgLy8gU2lnbmFsIGNvbXBsZXRpb24gYmFjayB0byB0aGUgbGliZXZlbnQgdGhyZWFkIHZpYSBhIHBpcGUKICAgICBpZiAoIWNvbm5lY3Rpb25fLT5ub3RpZnlJT1RocmVhZCgpKSB7CiAgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6IGZhaWxlZCB0byBub3RpZnlJT1RocmVhZCwgY2xvc2luZy4iKTsKKyAgICAgIGNvbm5lY3Rpb25fLT5zZXJ2ZXJfLT5kZWNyZW1lbnRBY3RpdmVQcm9jZXNzb3JzKCk7CiAgICAgICBjb25uZWN0aW9uXy0+Y2xvc2UoKTsKICAgICAgIHRocm93IFRFeGNlcHRpb24oIlROb25ibG9ja2luZ1NlcnZlcjo6VGFzazo6cnVuOiBmYWlsZWQgd3JpdGUgb24gbm90aWZ5IHBpcGUiKTsKICAgICB9CkBAIC0zNTYsMjEgKzM2MywxNSBAQAogICBUQ29ubmVjdGlvbiogZ2V0VENvbm5lY3Rpb24oKSB7IHJldHVybiBjb25uZWN0aW9uXzsgfQogCiBwcml2YXRlOgotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3JfOwotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0XzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXRfOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXRfOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXRfOwogICBUQ29ubmVjdGlvbiogY29ubmVjdGlvbl87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJFdmVudEhhbmRsZXI+IHNlcnZlckV2ZW50SGFuZGxlcl87CisgIHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyRXZlbnRIYW5kbGVyPiBzZXJ2ZXJFdmVudEhhbmRsZXJfOwogICB2b2lkKiBjb25uZWN0aW9uQ29udGV4dF87CiB9OwogCi12b2lkIFROb25ibG9ja2luZ1NlcnZlcjo6VENvbm5lY3Rpb246OmluaXQoVEhSSUZUX1NPQ0tFVCBzb2NrZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE5vbmJsb2NraW5nSU9UaHJlYWQqIGlvVGhyZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvY2thZGRyKiBhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tsZW5fdCBhZGRyTGVuKSB7Ci0gIHRTb2NrZXRfLT5zZXRTb2NrZXRGRChzb2NrZXQpOwotICB0U29ja2V0Xy0+c2V0Q2FjaGVkQWRkcmVzcyhhZGRyLCBhZGRyTGVuKTsKLQordm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXI6OlRDb25uZWN0aW9uOjppbml0KFROb25ibG9ja2luZ0lPVGhyZWFkKiBpb1RocmVhZCkgewogICBpb1RocmVhZF8gPSBpb1RocmVhZDsKICAgc2VydmVyXyA9IGlvVGhyZWFkLT5nZXRTZXJ2ZXIoKTsKICAgYXBwU3RhdGVfID0gQVBQX0lOSVQ7CkBAIC0zOTIsOCArMzkzLDE0IEBACiAgIGZhY3RvcnlPdXRwdXRUcmFuc3BvcnRfID0gc2VydmVyXy0+Z2V0T3V0cHV0VHJhbnNwb3J0RmFjdG9yeSgpLT5nZXRUcmFuc3BvcnQob3V0cHV0VHJhbnNwb3J0Xyk7CiAKICAgLy8gQ3JlYXRlIHByb3RvY29sCi0gIGlucHV0UHJvdG9jb2xfID0gc2VydmVyXy0+Z2V0SW5wdXRQcm90b2NvbEZhY3RvcnkoKS0+Z2V0UHJvdG9jb2woZmFjdG9yeUlucHV0VHJhbnNwb3J0Xyk7Ci0gIG91dHB1dFByb3RvY29sXyA9IHNlcnZlcl8tPmdldE91dHB1dFByb3RvY29sRmFjdG9yeSgpLT5nZXRQcm90b2NvbChmYWN0b3J5T3V0cHV0VHJhbnNwb3J0Xyk7CisgIGlmIChzZXJ2ZXJfLT5nZXRIZWFkZXJUcmFuc3BvcnQoKSkgeworICAgIGlucHV0UHJvdG9jb2xfID0gc2VydmVyXy0+Z2V0SW5wdXRQcm90b2NvbEZhY3RvcnkoKS0+Z2V0UHJvdG9jb2woZmFjdG9yeUlucHV0VHJhbnNwb3J0XywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvcnlPdXRwdXRUcmFuc3BvcnRfKTsKKyAgICBvdXRwdXRQcm90b2NvbF8gPSBpbnB1dFByb3RvY29sXzsKKyAgfSBlbHNlIHsKKyAgICBpbnB1dFByb3RvY29sXyA9IHNlcnZlcl8tPmdldElucHV0UHJvdG9jb2xGYWN0b3J5KCktPmdldFByb3RvY29sKGZhY3RvcnlJbnB1dFRyYW5zcG9ydF8pOworICAgIG91dHB1dFByb3RvY29sXyA9IHNlcnZlcl8tPmdldE91dHB1dFByb3RvY29sRmFjdG9yeSgpLT5nZXRQcm90b2NvbChmYWN0b3J5T3V0cHV0VHJhbnNwb3J0Xyk7CisgIH0KIAogICAvLyBTZXQgdXAgZm9yIGFueSBzZXJ2ZXIgZXZlbnQgaGFuZGxlcgogICBzZXJ2ZXJFdmVudEhhbmRsZXJfID0gc2VydmVyXy0+Z2V0RXZlbnRIYW5kbGVyKCk7CkBAIC00MDcsNiArNDE0LDEwIEBACiAgIHByb2Nlc3Nvcl8gPSBzZXJ2ZXJfLT5nZXRQcm9jZXNzb3IoaW5wdXRQcm90b2NvbF8sIG91dHB1dFByb3RvY29sXywgdFNvY2tldF8pOwogfQogCit2b2lkIFROb25ibG9ja2luZ1NlcnZlcjo6VENvbm5lY3Rpb246OnNldFNvY2tldChzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gc29ja2V0KSB7CisgIHRTb2NrZXRfID0gc29ja2V0OworfQorCiB2b2lkIFROb25ibG9ja2luZ1NlcnZlcjo6VENvbm5lY3Rpb246OndvcmtTb2NrZXQoKSB7CiAgIGludCBnb3QgPSAwLCBsZWZ0ID0gMCwgc2VudCA9IDA7CiAgIHVpbnQzMl90IGZldGNoID0gMDsKQEAgLTQzMiwxMCArNDQzLDE0IEBACiAgICAgICB9CiAgICAgICByZWFkQnVmZmVyUG9zXyArPSBmZXRjaDsKICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiB0ZSkgewotICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiVENvbm5lY3Rpb246OndvcmtTb2NrZXQoKTogJXMiLCB0ZS53aGF0KCkpOwotICAgICAgY2xvc2UoKTsKKyAgICAgIC8vSW4gTm9uYmxvY2tpbmcgU1NMU29ja2V0IHNvbWUgb3BlcmF0aW9ucyBuZWVkIHRvIGJlIHJldHJpZWQgYWdhaW4uCisgICAgICAvL0N1cnJlbnQgYXBwcm9hY2ggaXMgcGFyc2luZyBleGNlcHRpb24gbWVzc2FnZSwgYnV0IGEgYmV0dGVyIHNvbHV0aW9uIG5lZWRzIHRvIGJlIGludmVzdGlnYXRlZC4KKyAgICAgIGlmKCFzdHJzdHIodGUud2hhdCgpLCAicmV0cnkiKSkgeworICAgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUQ29ubmVjdGlvbjo6d29ya1NvY2tldCgpOiAlcyIsIHRlLndoYXQoKSk7CisgICAgICAgIGNsb3NlKCk7CiAKLSAgICAgIHJldHVybjsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQogICAgIH0KIAogICAgIGlmIChyZWFkQnVmZmVyUG9zXyA8IHNpemVvZihmcmFtaW5nLnNpemUpKSB7CkBAIC00NjEsNiArNDc2LDE4IEBACiAgICAgfQogICAgIC8vIHNpemUga25vd247IG5vdyBnZXQgdGhlIHJlc3Qgb2YgdGhlIGZyYW1lCiAgICAgdHJhbnNpdGlvbigpOworCisgICAgLy8gSWYgdGhlIHNvY2tldCBoYXMgbW9yZSBkYXRhIHRoYW4gdGhlIGZyYW1lIGhlYWRlciwgY29udGludWUgdG8gd29yayBvbiBpdC4gVGhpcyBpcyBub3Qgc3RyaWN0bHkgbmVjZXNzYXJ5IGZvcgorICAgIC8vIHJlZ3VsYXIgc29ja2V0cywgYmVjYXVzZSBpZiB0aGVyZSBpcyBtb3JlIGRhdGEsIGxpYmV2ZW50IHdpbGwgZmlyZSB0aGUgZXZlbnQgaGFuZGxlciByZWdpc3RlcmVkIGZvciByZWFkCisgICAgLy8gcmVhZGluZXNzLCB3aGljaCB3aWxsIGluIHR1cm4gY2FsbCB3b3JrU29ja2V0KCkuIEhvd2V2ZXIsIHNvbWUgc29ja2V0IHR5cGVzIChzdWNoIGFzIFRTU0xTb2NrZXQpIG1heSBoYXZlIHRoZQorICAgIC8vIGRhdGEgc2l0dGluZyBpbiB0aGVpciBpbnRlcm5hbCBidWZmZXJzIGFuZCBmcm9tIGxpYmV2ZW50J3MgcGVyc3BlY3RpdmUsIHRoZXJlIGlzIG5vIGZ1cnRoZXIgZGF0YSBhdmFpbGFibGUuIEluCisgICAgLy8gdGhhdCBjYXNlLCBub3QgaGF2aW5nIHRoaXMgd29ya1NvY2tldCgpIGNhbGwgaGVyZSB3b3VsZCByZXN1bHQgaW4gYSBoYW5nIGFzIHdlIHdpbGwgbmV2ZXIgZ2V0IHRvIHdvcmsgdGhlIHNvY2tldCwKKyAgICAvLyBkZXNwaXRlIGhhdmluZyBtb3JlIGRhdGEuCisgICAgaWYgKHRTb2NrZXRfLT5oYXNQZW5kaW5nRGF0YVRvUmVhZCgpKQorICAgIHsKKyAgICAgICAgd29ya1NvY2tldCgpOworICAgIH0KKwogICAgIHJldHVybjsKIAogICBjYXNlIFNPQ0tFVF9SRUNWOgpAQCAtNDcyLDggKzQ5OSwxMiBAQAogICAgICAgZmV0Y2ggPSByZWFkV2FudF8gLSByZWFkQnVmZmVyUG9zXzsKICAgICAgIGdvdCA9IHRTb2NrZXRfLT5yZWFkKHJlYWRCdWZmZXJfICsgcmVhZEJ1ZmZlclBvc18sIGZldGNoKTsKICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiB0ZSkgewotICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiVENvbm5lY3Rpb246OndvcmtTb2NrZXQoKTogJXMiLCB0ZS53aGF0KCkpOwotICAgICAgY2xvc2UoKTsKKyAgICAgIC8vSW4gTm9uYmxvY2tpbmcgU1NMU29ja2V0IHNvbWUgb3BlcmF0aW9ucyBuZWVkIHRvIGJlIHJldHJpZWQgYWdhaW4uCisgICAgICAvL0N1cnJlbnQgYXBwcm9hY2ggaXMgcGFyc2luZyBleGNlcHRpb24gbWVzc2FnZSwgYnV0IGEgYmV0dGVyIHNvbHV0aW9uIG5lZWRzIHRvIGJlIGludmVzdGlnYXRlZC4KKyAgICAgIGlmKCFzdHJzdHIodGUud2hhdCgpLCAicmV0cnkiKSkgeworICAgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUQ29ubmVjdGlvbjo6d29ya1NvY2tldCgpOiAlcyIsIHRlLndoYXQoKSk7CisgICAgICAgIGNsb3NlKCk7CisgICAgICB9CiAKICAgICAgIHJldHVybjsKICAgICB9CkBAIC01MDMsNyArNTM0LDcgQEAKIAogICAgIC8vIElmIHRoZXJlIGlzIG5vIGRhdGEgdG8gc2VuZCwgdGhlbiBsZXQgdXMgbW92ZSBvbgogICAgIGlmICh3cml0ZUJ1ZmZlclBvc18gPT0gd3JpdGVCdWZmZXJTaXplXykgewotICAgICAgR2xvYmFsT3V0cHV0KCJXQVJOSU5HOiBTZW5kIHN0YXRlIHdpdGggbm8gZGF0YSB0byBzZW5kXG4iKTsKKyAgICAgIEdsb2JhbE91dHB1dCgiV0FSTklORzogU2VuZCBzdGF0ZSB3aXRoIG5vIGRhdGEgdG8gc2VuZCIpOwogICAgICAgdHJhbnNpdGlvbigpOwogICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTUzNSw2ICs1NjYsMTMgQEAKICAgfQogfQogCitib29sIFROb25ibG9ja2luZ1NlcnZlcjo6Z2V0SGVhZGVyVHJhbnNwb3J0KCkgeworICAvLyBDdXJyZW50bHkgaWYgdGhlcmUgaXMgbm8gb3V0cHV0IHByb3RvY29sIGZhY3RvcnksCisgIC8vIHdlIGFzc3VtZSBoZWFkZXIgdHJhbnNwb3J0ICh3aXRob3V0IGhhdmluZyB0byBjcmVhdGUKKyAgLy8gYSBuZXcgdHJhbnNwb3J0IGFuZCBjaGVjaykKKyAgcmV0dXJuIGdldE91dHB1dFByb3RvY29sRmFjdG9yeSgpID09IE5VTEw7Cit9CisKIC8qKgogICogVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgYXBwbGljYXRpb24gdHJhbnNpdGlvbnMgZnJvbSBvbmUgc3RhdGUgaW50bwogICogYW5vdGhlci4gVGhpcyBtZWFucyB0aGF0IGl0IGhhcyBmaW5pc2hlZCB3cml0aW5nIHRoZSBkYXRhIHRoYXQgaXQgbmVlZGVkCkBAIC01NTEsMTIgKzU4OSwyMCBAQAogICBjYXNlIEFQUF9SRUFEX1JFUVVFU1Q6CiAgICAgLy8gV2UgYXJlIGRvbmUgcmVhZGluZyB0aGUgcmVxdWVzdCwgcGFja2FnZSB0aGUgcmVhZCBidWZmZXIgaW50byB0cmFuc3BvcnQKICAgICAvLyBhbmQgZ2V0IGJhY2sgc29tZSBkYXRhIGZyb20gdGhlIGRpc3BhdGNoIGZ1bmN0aW9uCi0gICAgaW5wdXRUcmFuc3BvcnRfLT5yZXNldEJ1ZmZlcihyZWFkQnVmZmVyXywgcmVhZEJ1ZmZlclBvc18pOwotICAgIG91dHB1dFRyYW5zcG9ydF8tPnJlc2V0QnVmZmVyKCk7Ci0gICAgLy8gUHJlcGVuZCBmb3VyIGJ5dGVzIG9mIGJsYW5rIHNwYWNlIHRvIHRoZSBidWZmZXIgc28gd2UgY2FuCi0gICAgLy8gd3JpdGUgdGhlIGZyYW1lIHNpemUgdGhlcmUgbGF0ZXIuCi0gICAgb3V0cHV0VHJhbnNwb3J0Xy0+Z2V0V3JpdGVQdHIoNCk7Ci0gICAgb3V0cHV0VHJhbnNwb3J0Xy0+d3JvdGVCeXRlcyg0KTsKKyAgICBpZiAoc2VydmVyXy0+Z2V0SGVhZGVyVHJhbnNwb3J0KCkpIHsKKyAgICAgIGlucHV0VHJhbnNwb3J0Xy0+cmVzZXRCdWZmZXIocmVhZEJ1ZmZlcl8sIHJlYWRCdWZmZXJQb3NfKTsKKyAgICAgIG91dHB1dFRyYW5zcG9ydF8tPnJlc2V0QnVmZmVyKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFdlIHNhdmVkIHJvb20gZm9yIHRoZSBmcmFtaW5nIHNpemUgaW4gY2FzZSBoZWFkZXIgdHJhbnNwb3J0IG5lZWRlZCBpdCwKKyAgICAgIC8vIGJ1dCBqdXN0IHNraXAgaXQgZm9yIHRoZSBub24taGVhZGVyIGNhc2UKKyAgICAgIGlucHV0VHJhbnNwb3J0Xy0+cmVzZXRCdWZmZXIocmVhZEJ1ZmZlcl8gKyA0LCByZWFkQnVmZmVyUG9zXyAtIDQpOworICAgICAgb3V0cHV0VHJhbnNwb3J0Xy0+cmVzZXRCdWZmZXIoKTsKKworICAgICAgLy8gUHJlcGVuZCBmb3VyIGJ5dGVzIG9mIGJsYW5rIHNwYWNlIHRvIHRoZSBidWZmZXIgc28gd2UgY2FuCisgICAgICAvLyB3cml0ZSB0aGUgZnJhbWUgc2l6ZSB0aGVyZSBsYXRlci4KKyAgICAgIG91dHB1dFRyYW5zcG9ydF8tPmdldFdyaXRlUHRyKDQpOworICAgICAgb3V0cHV0VHJhbnNwb3J0Xy0+d3JvdGVCeXRlcyg0KTsKKyAgICB9CiAKICAgICBzZXJ2ZXJfLT5pbmNyZW1lbnRBY3RpdmVQcm9jZXNzb3JzKCk7CiAKQEAgLTU2NCwyNiArNjEwLDI5IEBACiAgICAgICAvLyBXZSBhcmUgc2V0dGluZyB1cCBhIFRhc2sgdG8gZG8gdGhpcyB3b3JrIGFuZCB3ZSB3aWxsIHdhaXQgb24gaXQKIAogICAgICAgLy8gQ3JlYXRlIHRhc2sgYW5kIGRpc3BhdGNoIHRvIHRoZSB0aHJlYWQgbWFuYWdlcgotICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2sgPSBib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4oCisgICAgICBzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2sgPSBzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+KAogICAgICAgICAgIG5ldyBUYXNrKHByb2Nlc3Nvcl8sIGlucHV0UHJvdG9jb2xfLCBvdXRwdXRQcm90b2NvbF8sIHRoaXMpKTsKICAgICAgIC8vIFRoZSBhcHBsaWNhdGlvbiBpcyBub3cgd2FpdGluZyBvbiB0aGUgdGFzayB0byBmaW5pc2gKICAgICAgIGFwcFN0YXRlXyA9IEFQUF9XQUlUX1RBU0s7CiAKKyAgICAgIC8vIFNldCB0aGlzIGNvbm5lY3Rpb24gaWRsZSBzbyB0aGF0IGxpYmV2ZW50IGRvZXNuJ3QgcHJvY2VzcyBtb3JlCisgICAgICAvLyBkYXRhIG9uIGl0IHdoaWxlIHdlJ3JlIHN0aWxsIHdhaXRpbmcgZm9yIHRoZSB0aHJlYWRtYW5hZ2VyIHRvCisgICAgICAvLyBmaW5pc2ggdGhpcyB0YXNrCisgICAgICBzZXRJZGxlKCk7CisKICAgICAgIHRyeSB7CiAgICAgICAgIHNlcnZlcl8tPmFkZFRhc2sodGFzayk7CiAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24mIGlzZSkgewogICAgICAgICAvLyBUaGUgVGhyZWFkTWFuYWdlciBpcyBub3QgcmVhZHkgdG8gaGFuZGxlIGFueSBtb3JlIHRhc2tzIChpdCdzIHByb2JhYmx5IHNodXR0aW5nIGRvd24pLgogICAgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb246IFNlcnZlcjo6cHJvY2VzcygpICVzIiwgaXNlLndoYXQoKSk7CisgICAgICAgIHNlcnZlcl8tPmRlY3JlbWVudEFjdGl2ZVByb2Nlc3NvcnMoKTsKICAgICAgICAgY2xvc2UoKTsKICAgICAgIH0gY2F0Y2ggKFRpbWVkT3V0RXhjZXB0aW9uJiB0bykgewogICAgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJbRVJST1JdIFRpbWVkT3V0RXhjZXB0aW9uOiBTZXJ2ZXI6OnByb2Nlc3MoKSAlcyIsIHRvLndoYXQoKSk7CisgICAgICAgIHNlcnZlcl8tPmRlY3JlbWVudEFjdGl2ZVByb2Nlc3NvcnMoKTsKICAgICAgICAgY2xvc2UoKTsKICAgICAgIH0KIAotICAgICAgLy8gU2V0IHRoaXMgY29ubmVjdGlvbiBpZGxlIHNvIHRoYXQgbGliZXZlbnQgZG9lc24ndCBwcm9jZXNzIG1vcmUKLSAgICAgIC8vIGRhdGEgb24gaXQgd2hpbGUgd2UncmUgc3RpbGwgd2FpdGluZyBmb3IgdGhlIHRocmVhZG1hbmFnZXIgdG8KLSAgICAgIC8vIGZpbmlzaCB0aGlzIHRhc2sKLSAgICAgIHNldElkbGUoKTsKICAgICAgIHJldHVybjsKICAgICB9IGVsc2UgewogICAgICAgdHJ5IHsKQEAgLTYxNCw2ICs2NjMsNyBAQAogICAgICAgICByZXR1cm47CiAgICAgICB9CiAgICAgfQorICAgIC8vIGZhbGx0aHJvdWdoCiAKICAgLy8gSW50ZW50aW9uYWxseSBmYWxsIHRocm91Z2ggaGVyZSwgdGhlIGNhbGwgdG8gcHJvY2VzcyBoYXMgd3JpdHRlbiBpbnRvCiAgIC8vIHRoZSB3cml0ZUJ1ZmZlcl8KQEAgLTY0NCw5ICs2OTQsNiBAQAogICAgICAgYXBwU3RhdGVfID0gQVBQX1NFTkRfUkVTVUxUOwogICAgICAgc2V0V3JpdGUoKTsKIAotICAgICAgLy8gVHJ5IHRvIHdvcmsgdGhlIHNvY2tldCBpbW1lZGlhdGVseQotICAgICAgLy8gd29ya1NvY2tldCgpOwotCiAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC02NjUsNiArNzEyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlcl8tPmdldElkbGVXcml0ZUJ1ZmZlckxpbWl0KCkpOwogICAgICAgY2FsbHNGb3JSZXNpemVfID0gMDsKICAgICB9CisgICAgLy8gZmFsbHRocm91Z2gKIAogICAvLyBOLkIuOiBXZSBhbHNvIGludGVudGlvbmFsbHkgZmFsbCB0aHJvdWdoIGhlcmUgaW50byB0aGUgSU5JVCBzdGF0ZSEKIApAQCAtNjg1LDEyICs3MzMsMTEgQEAKICAgICAvLyBSZWdpc3RlciByZWFkIGV2ZW50CiAgICAgc2V0UmVhZCgpOwogCi0gICAgLy8gVHJ5IHRvIHdvcmsgdGhlIHNvY2tldCByaWdodCBhd2F5Ci0gICAgLy8gd29ya1NvY2tldCgpOwotCiAgICAgcmV0dXJuOwogCiAgIGNhc2UgQVBQX1JFQURfRlJBTUVfU0laRToKKyAgICByZWFkV2FudF8gKz0gNDsKKwogICAgIC8vIFdlIGp1c3QgcmVhZCB0aGUgcmVxdWVzdCBsZW5ndGgKICAgICAvLyBEb3VibGUgdGhlIGJ1ZmZlciBzaXplIHVudGlsIGl0IGlzIGJpZyBlbm91Z2gKICAgICBpZiAocmVhZFdhbnRfID4gcmVhZEJ1ZmZlclNpemVfKSB7CkBAIC03MTEsMTUgKzc1OCwxMyBAQAogICAgICAgcmVhZEJ1ZmZlclNpemVfID0gbmV3U2l6ZTsKICAgICB9CiAKLSAgICByZWFkQnVmZmVyUG9zXyA9IDA7CisgICAgcmVhZEJ1ZmZlclBvc18gPSA0OworICAgICooKHVpbnQzMl90KilyZWFkQnVmZmVyXykgPSBodG9ubChyZWFkV2FudF8gLSA0KTsKIAogICAgIC8vIE1vdmUgaW50byByZWFkIHJlcXVlc3Qgc3RhdGUKICAgICBzb2NrZXRTdGF0ZV8gPSBTT0NLRVRfUkVDVjsKICAgICBhcHBTdGF0ZV8gPSBBUFBfUkVBRF9SRVFVRVNUOwogCi0gICAgLy8gV29yayB0aGUgc29ja2V0IHJpZ2h0IGF3YXkKLSAgICAvLyB3b3JrU29ja2V0KCk7Ci0KICAgICByZXR1cm47CiAKICAgY2FzZSBBUFBfQ0xPU0VfQ09OTkVDVElPTjoKQEAgLTc0MCwxMSArNzg1LDkgQEAKICAgfQogCiAgIC8vIERlbGV0ZSBhIHByZXZpb3VzbHkgZXhpc3RpbmcgZXZlbnQKLSAgaWYgKGV2ZW50RmxhZ3NfICE9IDApIHsKLSAgICBpZiAoZXZlbnRfZGVsKCZldmVudF8pID09IC0xKSB7Ci0gICAgICBHbG9iYWxPdXRwdXQoIlRDb25uZWN0aW9uOjpzZXRGbGFncyBldmVudF9kZWwiKTsKLSAgICAgIHJldHVybjsKLSAgICB9CisgIGlmIChldmVudEZsYWdzXyAmJiBldmVudF9kZWwoJmV2ZW50XykgPT0gLTEpIHsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUQ29ubmVjdGlvbjo6c2V0RmxhZ3MoKSBldmVudF9kZWwiLCBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUik7CisgICAgcmV0dXJuOwogICB9CiAKICAgLy8gVXBkYXRlIGluIG1lbW9yeSBzdHJ1Y3R1cmUKQEAgLTc4Nyw3ICs4MzAsNyBAQAogCiAgIC8vIEFkZCB0aGUgZXZlbnQKICAgaWYgKGV2ZW50X2FkZCgmZXZlbnRfLCAwKSA9PSAtMSkgewotICAgIEdsb2JhbE91dHB1dCgiVENvbm5lY3Rpb246OnNldEZsYWdzKCk6IGNvdWxkIG5vdCBldmVudF9hZGQiKTsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUQ29ubmVjdGlvbjo6c2V0RmxhZ3MoKTogY291bGQgbm90IGV2ZW50X2FkZCIsIFRIUklGVF9HRVRfU09DS0VUX0VSUk9SKTsKICAgfQogfQogCkBAIC03OTUsMTAgKzgzOCw3IEBACiAgKiBDbG9zZXMgYSBjb25uZWN0aW9uCiAgKi8KIHZvaWQgVE5vbmJsb2NraW5nU2VydmVyOjpUQ29ubmVjdGlvbjo6Y2xvc2UoKSB7Ci0gIC8vIERlbGV0ZSB0aGUgcmVnaXN0ZXJlZCBsaWJldmVudAotICBpZiAoZXZlbnRfZGVsKCZldmVudF8pID09IC0xKSB7Ci0gICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVENvbm5lY3Rpb246OmNsb3NlKCkgZXZlbnRfZGVsIiwgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IpOwotICB9CisgIHNldElkbGUoKTsKIAogICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyXykgewogICAgIHNlcnZlckV2ZW50SGFuZGxlcl8tPmRlbGV0ZUNvbnRleHQoY29ubmVjdGlvbkNvbnRleHRfLCBpbnB1dFByb3RvY29sXywgb3V0cHV0UHJvdG9jb2xfKTsKQEAgLTg0OCw5ICs4ODgsOSBAQAogICAvLyBvYmplY3RzIGFuZCB0aGUgVGhyZWFkIG9iamVjdHMgaGF2ZSBzaGFyZWRfcHRycyB0byB0aGUgVE5vbmJsb2NraW5nSU9UaHJlYWQKICAgLy8gb2JqZWN0cyAoYXMgcnVubmFibGUpIHNvIHRoZXNlIG9iamVjdHMgd2lsbCBuZXZlciBkZWFsbG9jYXRlIHdpdGhvdXQgaGVscC4KICAgd2hpbGUgKCFpb1RocmVhZHNfLmVtcHR5KCkpIHsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUTm9uYmxvY2tpbmdJT1RocmVhZD4gaW90ID0gaW9UaHJlYWRzXy5iYWNrKCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFROb25ibG9ja2luZ0lPVGhyZWFkPiBpb3QgPSBpb1RocmVhZHNfLmJhY2soKTsKICAgICBpb1RocmVhZHNfLnBvcF9iYWNrKCk7Ci0gICAgaW90LT5zZXRUaHJlYWQoYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkPigpKTsKKyAgICBpb3QtPnNldFRocmVhZChzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPigpKTsKICAgfQogfQogCkBAIC04NTgsOSArODk4LDcgQEAKICAqIENyZWF0ZXMgYSBuZXcgY29ubmVjdGlvbiBlaXRoZXIgYnkgcmV1c2luZyBhbiBvYmplY3Qgb2ZmIHRoZSBzdGFjayBvcgogICogYnkgYWxsb2NhdGluZyBhIG5ldyBvbmUgZW50aXJlbHkKICAqLwotVE5vbmJsb2NraW5nU2VydmVyOjpUQ29ubmVjdGlvbiogVE5vbmJsb2NraW5nU2VydmVyOjpjcmVhdGVDb25uZWN0aW9uKFRIUklGVF9TT0NLRVQgc29ja2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvY2thZGRyKiBhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tsZW5fdCBhZGRyTGVuKSB7CitUTm9uYmxvY2tpbmdTZXJ2ZXI6OlRDb25uZWN0aW9uKiBUTm9uYmxvY2tpbmdTZXJ2ZXI6OmNyZWF0ZUNvbm5lY3Rpb24oc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHNvY2tldCkgewogICAvLyBDaGVjayB0aGUgc3RhY2sKICAgR3VhcmQgZyhjb25uTXV0ZXhfKTsKIApAQCAtODc0LDEyICs5MTIsMTMgQEAKICAgLy8gQ2hlY2sgdGhlIGNvbm5lY3Rpb24gc3RhY2sgdG8gc2VlIGlmIHdlIGNhbiByZS11c2UKICAgVENvbm5lY3Rpb24qIHJlc3VsdCA9IE5VTEw7CiAgIGlmIChjb25uZWN0aW9uU3RhY2tfLmVtcHR5KCkpIHsKLSAgICByZXN1bHQgPSBuZXcgVENvbm5lY3Rpb24oc29ja2V0LCBpb1RocmVhZCwgYWRkciwgYWRkckxlbik7CisgICAgcmVzdWx0ID0gbmV3IFRDb25uZWN0aW9uKHNvY2tldCwgaW9UaHJlYWQpOwogICAgICsrbnVtVENvbm5lY3Rpb25zXzsKICAgfSBlbHNlIHsKICAgICByZXN1bHQgPSBjb25uZWN0aW9uU3RhY2tfLnRvcCgpOwogICAgIGNvbm5lY3Rpb25TdGFja18ucG9wKCk7Ci0gICAgcmVzdWx0LT5pbml0KHNvY2tldCwgaW9UaHJlYWQsIGFkZHIsIGFkZHJMZW4pOworICAgIHJlc3VsdC0+c2V0U29ja2V0KHNvY2tldCk7CisgICAgcmVzdWx0LT5pbml0KGlvVGhyZWFkKTsKICAgfQogICBhY3RpdmVDb25uZWN0aW9uc18ucHVzaF9iYWNrKHJlc3VsdCk7CiAgIHJldHVybiByZXN1bHQ7CkBAIC05MTQsNTMgKzk1MywzNSBAQAogICAvLyBNYWtlIHN1cmUgdGhhdCBsaWJldmVudCBkaWRuJ3QgbWVzcyB1cCB0aGUgc29ja2V0IGhhbmRsZXMKICAgYXNzZXJ0KGZkID09IHNlcnZlclNvY2tldF8pOwogCi0gIC8vIFNlcnZlciBzb2NrZXQgYWNjZXB0ZWQgYSBuZXcgY29ubmVjdGlvbgotICBzb2NrbGVuX3QgYWRkckxlbjsKLSAgc29ja2FkZHJfc3RvcmFnZSBhZGRyU3RvcmFnZTsKLSAgc29ja2FkZHIqIGFkZHJwID0gKHNvY2thZGRyKikmYWRkclN0b3JhZ2U7Ci0gIGFkZHJMZW4gPSBzaXplb2YoYWRkclN0b3JhZ2UpOwotCiAgIC8vIEdvaW5nIHRvIGFjY2VwdCBhIG5ldyBjbGllbnQgc29ja2V0Ci0gIFRIUklGVF9TT0NLRVQgY2xpZW50U29ja2V0OworICBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gY2xpZW50U29ja2V0OwogCi0gIC8vIEFjY2VwdCBhcyBtYW55IG5ldyBjbGllbnRzIGFzIHBvc3NpYmxlLCBldmVuIHRob3VnaCBsaWJldmVudCBzaWduYWxlZCBvbmx5Ci0gIC8vIG9uZSwgdGhpcyBoZWxwcyB1cyB0byBhdm9pZCBoYXZpbmcgdG8gZ28gYmFjayBpbnRvIHRoZSBsaWJldmVudCBlbmdpbmUgc28KLSAgLy8gbWFueSB0aW1lcwotICB3aGlsZSAoKGNsaWVudFNvY2tldCA9IDo6YWNjZXB0KGZkLCBhZGRycCwgJmFkZHJMZW4pKSAhPSAtMSkgeworICBjbGllbnRTb2NrZXQgPSBzZXJ2ZXJUcmFuc3BvcnRfLT5hY2NlcHQoKTsKKyAgaWYgKGNsaWVudFNvY2tldCkgewogICAgIC8vIElmIHdlJ3JlIG92ZXJsb2FkZWQsIHRha2UgYWN0aW9uIGhlcmUKICAgICBpZiAob3ZlcmxvYWRBY3Rpb25fICE9IFRfT1ZFUkxPQURfTk9fQUNUSU9OICYmIHNlcnZlck92ZXJsb2FkZWQoKSkgewogICAgICAgR3VhcmQgZyhjb25uTXV0ZXhfKTsKICAgICAgIG5Db25uZWN0aW9uc0Ryb3BwZWRfKys7CiAgICAgICBuVG90YWxDb25uZWN0aW9uc0Ryb3BwZWRfKys7CiAgICAgICBpZiAob3ZlcmxvYWRBY3Rpb25fID09IFRfT1ZFUkxPQURfQ0xPU0VfT05fQUNDRVBUKSB7Ci0gICAgICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKGNsaWVudFNvY2tldCk7CisgICAgICAgIGNsaWVudFNvY2tldC0+Y2xvc2UoKTsKICAgICAgICAgcmV0dXJuOwogICAgICAgfSBlbHNlIGlmIChvdmVybG9hZEFjdGlvbl8gPT0gVF9PVkVSTE9BRF9EUkFJTl9UQVNLX1FVRVVFKSB7CiAgICAgICAgIGlmICghZHJhaW5QZW5kaW5nVGFzaygpKSB7CiAgICAgICAgICAgLy8gTm90aGluZyBsZWZ0IHRvIGRpc2NhcmQsIHNvIHdlIGRyb3AgY29ubmVjdGlvbiBpbnN0ZWFkLgotICAgICAgICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKGNsaWVudFNvY2tldCk7CisgICAgICAgICAgY2xpZW50U29ja2V0LT5jbG9zZSgpOwogICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KIAotICAgIC8vIEV4cGxpY2l0bHkgc2V0IHRoaXMgc29ja2V0IHRvIE5PTkJMT0NLIG1vZGUKLSAgICBpbnQgZmxhZ3M7Ci0gICAgaWYgKChmbGFncyA9IFRIUklGVF9GQ05UTChjbGllbnRTb2NrZXQsIFRIUklGVF9GX0dFVEZMLCAwKSkgPCAwCi0gICAgICAgIHx8IFRIUklGVF9GQ05UTChjbGllbnRTb2NrZXQsIFRIUklGVF9GX1NFVEZMLCBmbGFncyB8IFRIUklGVF9PX05PTkJMT0NLKSA8IDApIHsKLSAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoInRocmlmdFNlcnZlckV2ZW50SGFuZGxlcjogc2V0IFRIUklGVF9PX05PTkJMT0NLIChUSFJJRlRfRkNOVEwpICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9HRVRfU09DS0VUX0VSUk9SKTsKLSAgICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKGNsaWVudFNvY2tldCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCiAgICAgLy8gQ3JlYXRlIGEgbmV3IFRDb25uZWN0aW9uIGZvciB0aGlzIGNsaWVudCBzb2NrZXQuCi0gICAgVENvbm5lY3Rpb24qIGNsaWVudENvbm5lY3Rpb24gPSBjcmVhdGVDb25uZWN0aW9uKGNsaWVudFNvY2tldCwgYWRkcnAsIGFkZHJMZW4pOworICAgIFRDb25uZWN0aW9uKiBjbGllbnRDb25uZWN0aW9uID0gY3JlYXRlQ29ubmVjdGlvbihjbGllbnRTb2NrZXQpOwogCiAgICAgLy8gRmFpbCBmYXN0IGlmIHdlIGNvdWxkIG5vdCBjcmVhdGUgYSBUQ29ubmVjdGlvbiBvYmplY3QKICAgICBpZiAoY2xpZW50Q29ubmVjdGlvbiA9PSBOVUxMKSB7CiAgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJ0aHJpZnRTZXJ2ZXJFdmVudEhhbmRsZXI6IGZhaWxlZCBUQ29ubmVjdGlvbiBmYWN0b3J5Iik7Ci0gICAgICA6OlRIUklGVF9DTE9TRVNPQ0tFVChjbGllbnRTb2NrZXQpOworICAgICAgY2xpZW50U29ja2V0LT5jbG9zZSgpOwogICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtOTgxLDE4ICsxMDAyLDkgQEAKICAgICB9IGVsc2UgewogICAgICAgaWYgKCFjbGllbnRDb25uZWN0aW9uLT5ub3RpZnlJT1RocmVhZCgpKSB7CiAgICAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIltFUlJPUl0gbm90aWZ5SU9UaHJlYWQgZmFpbGVkIG9uIGZyZXNoIGNvbm5lY3Rpb24sIGNsb3NpbmciLCBlcnJubyk7Ci0gICAgICAgIHJldHVybkNvbm5lY3Rpb24oY2xpZW50Q29ubmVjdGlvbik7CisgICAgICAgIGNsaWVudENvbm5lY3Rpb24tPmNsb3NlKCk7CiAgICAgICB9CiAgICAgfQotCi0gICAgLy8gYWRkckxlbiBpcyB3cml0dGVuIGJ5IHRoZSBhY2NlcHQoKSBjYWxsLCBzbyBuZWVkcyB0byBiZSBzZXQgYmVmb3JlIHRoZSBuZXh0IGNhbGwuCi0gICAgYWRkckxlbiA9IHNpemVvZihhZGRyU3RvcmFnZSk7Ci0gIH0KLQotICAvLyBEb25lIGxvb3BpbmcgYWNjZXB0LCBub3cgd2UgaGF2ZSB0byBtYWtlIHN1cmUgdGhlIGVycm9yIGlzIGR1ZSB0bwotICAvLyBibG9ja2luZy4gQW55IG90aGVyIGVycm9yIGlzIGEgcHJvYmxlbQotICBpZiAoVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IgIT0gVEhSSUZUX0VBR0FJTiAmJiBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUiAhPSBUSFJJRlRfRVdPVUxEQkxPQ0spIHsKLSAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJ0aHJpZnRTZXJ2ZXJFdmVudEhhbmRsZXI6IGFjY2VwdCgpICIsIFRIUklGVF9HRVRfU09DS0VUX0VSUk9SKTsKICAgfQogfQogCkBAIC0xMDAwLDEyOCArMTAxMiwxOCBAQAogICogQ3JlYXRlcyBhIHNvY2tldCB0byBsaXN0ZW4gb24gYW5kIGJpbmRzIGl0IHRvIHRoZSBsb2NhbCBwb3J0LgogICovCiB2b2lkIFROb25ibG9ja2luZ1NlcnZlcjo6Y3JlYXRlQW5kTGlzdGVuT25Tb2NrZXQoKSB7Ci0gIFRIUklGVF9TT0NLRVQgczsKLQotICBzdHJ1Y3QgYWRkcmluZm8gaGludHMsICpyZXMsICpyZXMwOwotICBpbnQgZXJyb3I7Ci0KLSAgY2hhciBwb3J0W3NpemVvZigiNjU1MzYiKSArIDFdOwotICBtZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKLSAgaGludHMuYWlfZmFtaWx5ID0gUEZfVU5TUEVDOwotICBoaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOwotICBoaW50cy5haV9mbGFncyA9IEFJX1BBU1NJVkUgfCBBSV9BRERSQ09ORklHOwotICBzcHJpbnRmKHBvcnQsICIlZCIsIHBvcnRfKTsKLQotICAvLyBXaWxkY2FyZCBhZGRyZXNzCi0gIGVycm9yID0gZ2V0YWRkcmluZm8oTlVMTCwgcG9ydCwgJmhpbnRzLCAmcmVzMCk7Ci0gIGlmIChlcnJvcikgewotICAgIHRocm93IFRFeGNlcHRpb24oIlROb25ibG9ja2luZ1NlcnZlcjo6c2VydmUoKSBnZXRhZGRyaW5mbyAiCi0gICAgICAgICAgICAgICAgICAgICArIHN0cmluZyhUSFJJRlRfR0FJX1NUUkVSUk9SKGVycm9yKSkpOwotICB9Ci0KLSAgLy8gUGljayB0aGUgaXB2NiBhZGRyZXNzIGZpcnN0IHNpbmNlIGlwdjQgYWRkcmVzc2VzIGNhbiBiZSBtYXBwZWQKLSAgLy8gaW50byBpcHY2IHNwYWNlLgotICBmb3IgKHJlcyA9IHJlczA7IHJlczsgcmVzID0gcmVzLT5haV9uZXh0KSB7Ci0gICAgaWYgKHJlcy0+YWlfZmFtaWx5ID09IEFGX0lORVQ2IHx8IHJlcy0+YWlfbmV4dCA9PSBOVUxMKQotICAgICAgYnJlYWs7Ci0gIH0KLQotICAvLyBDcmVhdGUgdGhlIHNlcnZlciBzb2NrZXQKLSAgcyA9IHNvY2tldChyZXMtPmFpX2ZhbWlseSwgcmVzLT5haV9zb2NrdHlwZSwgcmVzLT5haV9wcm90b2NvbCk7Ci0gIGlmIChzID09IC0xKSB7Ci0gICAgZnJlZWFkZHJpbmZvKHJlczApOwotICAgIHRocm93IFRFeGNlcHRpb24oIlROb25ibG9ja2luZ1NlcnZlcjo6c2VydmUoKSBzb2NrZXQoKSAtMSIpOwotICB9Ci0KLSNpZmRlZiBJUFY2X1Y2T05MWQotICBpZiAocmVzLT5haV9mYW1pbHkgPT0gQUZfSU5FVDYpIHsKLSAgICBpbnQgemVybyA9IDA7Ci0gICAgaWYgKC0xID09IHNldHNvY2tvcHQocywgSVBQUk9UT19JUFY2LCBJUFY2X1Y2T05MWSwgY29uc3RfY2FzdF9zb2Nrb3B0KCZ6ZXJvKSwgc2l6ZW9mKHplcm8pKSkgewotICAgICAgR2xvYmFsT3V0cHV0KCJUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBJUFY2X1Y2T05MWSIpOwotICAgIH0KLSAgfQotI2VuZGlmIC8vICNpZmRlZiBJUFY2X1Y2T05MWQotCi0gIGludCBvbmUgPSAxOwotCi0gIC8vIFNldCBUSFJJRlRfTk9fU09DS0VUX0NBQ0hJTkcgdG8gYXZvaWQgMk1TTCBkZWxheSBvbiBzZXJ2ZXIgcmVzdGFydAotICBzZXRzb2Nrb3B0KHMsIFNPTF9TT0NLRVQsIFRIUklGVF9OT19TT0NLRVRfQ0FDSElORywgY29uc3RfY2FzdF9zb2Nrb3B0KCZvbmUpLCBzaXplb2Yob25lKSk7Ci0KLSAgaWYgKDo6YmluZChzLCByZXMtPmFpX2FkZHIsIHN0YXRpY19jYXN0PGludD4ocmVzLT5haV9hZGRybGVuKSkgPT0gLTEpIHsKLSAgICA6OlRIUklGVF9DTE9TRVNPQ0tFVChzKTsKLSAgICBmcmVlYWRkcmluZm8ocmVzMCk7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUTm9uYmxvY2tpbmdTZXJ2ZXI6OnNlcnZlKCkgYmluZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUik7Ci0gIH0KLQotICAvLyBEb25lIHdpdGggdGhlIGFkZHIgaW5mbwotICBmcmVlYWRkcmluZm8ocmVzMCk7Ci0KLSAgLy8gU2V0IHVwIHRoaXMgZmlsZSBkZXNjcmlwdG9yIGZvciBsaXN0ZW5pbmcKLSAgbGlzdGVuU29ja2V0KHMpOworICBzZXJ2ZXJUcmFuc3BvcnRfLT5saXN0ZW4oKTsKKyAgc2VydmVyU29ja2V0XyA9IHNlcnZlclRyYW5zcG9ydF8tPmdldFNvY2tldEZEKCk7CiB9CiAKLS8qKgotICogVGFrZXMgYSBzb2NrZXQgY3JlYXRlZCBieSBsaXN0ZW5Tb2NrZXQoKSBhbmQgc2V0cyB2YXJpb3VzIG9wdGlvbnMgb24gaXQKLSAqIHRvIHByZXBhcmUgZm9yIHVzZSBpbiB0aGUgc2VydmVyLgotICovCi12b2lkIFROb25ibG9ja2luZ1NlcnZlcjo6bGlzdGVuU29ja2V0KFRIUklGVF9TT0NLRVQgcykgewotICAvLyBTZXQgc29ja2V0IHRvIG5vbmJsb2NraW5nIG1vZGUKLSAgaW50IGZsYWdzOwotICBpZiAoKGZsYWdzID0gVEhSSUZUX0ZDTlRMKHMsIFRIUklGVF9GX0dFVEZMLCAwKSkgPCAwCi0gICAgICB8fCBUSFJJRlRfRkNOVEwocywgVEhSSUZUX0ZfU0VURkwsIGZsYWdzIHwgVEhSSUZUX09fTk9OQkxPQ0spIDwgMCkgewotICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKHMpOwotICAgIHRocm93IFRFeGNlcHRpb24oIlROb25ibG9ja2luZ1NlcnZlcjo6c2VydmUoKSBUSFJJRlRfT19OT05CTE9DSyIpOwotICB9CiAKLSAgaW50IG9uZSA9IDE7Ci0gIHN0cnVjdCBsaW5nZXIgbGluZyA9IHswLCAwfTsKLQotICAvLyBLZWVwYWxpdmUgdG8gZW5zdXJlIGZ1bGwgcmVzdWx0IGZsdXNoaW5nCi0gIHNldHNvY2tvcHQocywgU09MX1NPQ0tFVCwgU09fS0VFUEFMSVZFLCBjb25zdF9jYXN0X3NvY2tvcHQoJm9uZSksIHNpemVvZihvbmUpKTsKLQotICAvLyBUdXJuIGxpbmdlciBvZmYgdG8gYXZvaWQgaHVuZyBzb2NrZXRzCi0gIHNldHNvY2tvcHQocywgU09MX1NPQ0tFVCwgU09fTElOR0VSLCBjb25zdF9jYXN0X3NvY2tvcHQoJmxpbmcpLCBzaXplb2YobGluZykpOwotCi0vLyBTZXQgVENQIG5vZGVsYXkgaWYgYXZhaWxhYmxlLCBNQUMgT1MgWCBIYWNrCi0vLyBTZWUgaHR0cDovL2xpc3RzLmRhbmdhLmNvbS9waXBlcm1haWwvbWVtY2FjaGVkLzIwMDUtTWFyY2gvMDAxMjQwLmh0bWwKLSNpZm5kZWYgVENQX05PUFVTSAotICBzZXRzb2Nrb3B0KHMsIElQUFJPVE9fVENQLCBUQ1BfTk9ERUxBWSwgY29uc3RfY2FzdF9zb2Nrb3B0KCZvbmUpLCBzaXplb2Yob25lKSk7Ci0jZW5kaWYKLQotI2lmZGVmIFRDUF9MT1dfTUlOX1JUTwotICBpZiAoVFNvY2tldDo6Z2V0VXNlTG93TWluUnRvKCkpIHsKLSAgICBzZXRzb2Nrb3B0KHMsIElQUFJPVE9fVENQLCBUQ1BfTE9XX01JTl9SVE8sIGNvbnN0X2Nhc3Rfc29ja29wdCgmb25lKSwgc2l6ZW9mKG9uZSkpOwotICB9Ci0jZW5kaWYKLQotICBpZiAobGlzdGVuKHMsIExJU1RFTl9CQUNLTE9HKSA9PSAtMSkgewotICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKHMpOwotICAgIHRocm93IFRFeGNlcHRpb24oIlROb25ibG9ja2luZ1NlcnZlcjo6c2VydmUoKSBsaXN0ZW4iKTsKLSAgfQotCi0gIC8vIENvb2wsIHRoaXMgc29ja2V0IGlzIGdvb2QgdG8gZ28sIHNldCBpdCBhcyB0aGUgc2VydmVyU29ja2V0XwotICBzZXJ2ZXJTb2NrZXRfID0gczsKLQotICBpZiAoIXBvcnRfKSB7Ci0gICAgc29ja2FkZHJfaW4gYWRkcjsKLSAgICBzb2NrbGVuX3Qgc2l6ZSA9IHNpemVvZihhZGRyKTsKLSAgICBpZiAoIWdldHNvY2tuYW1lKHNlcnZlclNvY2tldF8sIHJlaW50ZXJwcmV0X2Nhc3Q8c29ja2FkZHIqPigmYWRkciksICZzaXplKSkgewotICAgICAgbGlzdGVuUG9ydF8gPSBudG9ocyhhZGRyLnNpbl9wb3J0KTsKLSAgICB9IGVsc2UgewotICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE5vbmJsb2NraW5nOiBmYWlsZWQgdG8gZ2V0IGxpc3RlbiBwb3J0OiAiLCBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUik7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgVE5vbmJsb2NraW5nU2VydmVyOjpzZXRUaHJlYWRNYW5hZ2VyKGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIpIHsKK3ZvaWQgVE5vbmJsb2NraW5nU2VydmVyOjpzZXRUaHJlYWRNYW5hZ2VyKHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyKSB7CiAgIHRocmVhZE1hbmFnZXJfID0gdGhyZWFkTWFuYWdlcjsKICAgaWYgKHRocmVhZE1hbmFnZXIpIHsKICAgICB0aHJlYWRNYW5hZ2VyLT5zZXRFeHBpcmVDYWxsYmFjaygKLSAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnN0ZGN4eDo6YmluZCgmVE5vbmJsb2NraW5nU2VydmVyOjpleHBpcmVDbG9zZSwKKyAgICAgICAgc3RkOjpiaW5kKCZUTm9uYmxvY2tpbmdTZXJ2ZXI6OmV4cGlyZUNsb3NlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnN0ZGN4eDo6cGxhY2Vob2xkZXJzOjpfMSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSkpOwogICAgIHRocmVhZFBvb2xQcm9jZXNzaW5nXyA9IHRydWU7CiAgIH0gZWxzZSB7CiAgICAgdGhyZWFkUG9vbFByb2Nlc3NpbmdfID0gZmFsc2U7CkBAIC0xMTUzLDcgKzEwNTUsNyBAQAogCiBib29sIFROb25ibG9ja2luZ1NlcnZlcjo6ZHJhaW5QZW5kaW5nVGFzaygpIHsKICAgaWYgKHRocmVhZE1hbmFnZXJfKSB7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2sgPSB0aHJlYWRNYW5hZ2VyXy0+cmVtb3ZlTmV4dFBlbmRpbmcoKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2sgPSB0aHJlYWRNYW5hZ2VyXy0+cmVtb3ZlTmV4dFBlbmRpbmcoKTsKICAgICBpZiAodGFzaykgewogICAgICAgVENvbm5lY3Rpb24qIGNvbm5lY3Rpb24gPSBzdGF0aWNfY2FzdDxUQ29ubmVjdGlvbjo6VGFzayo+KHRhc2suZ2V0KCkpLT5nZXRUQ29ubmVjdGlvbigpOwogICAgICAgYXNzZXJ0KGNvbm5lY3Rpb24gJiYgY29ubmVjdGlvbi0+Z2V0U2VydmVyKCkgJiYgY29ubmVjdGlvbi0+Z2V0U3RhdGUoKSA9PSBBUFBfV0FJVF9UQVNLKTsKQEAgLTExNjQsMTYgKzEwNjYsMTMgQEAKICAgcmV0dXJuIGZhbHNlOwogfQogCi12b2lkIFROb25ibG9ja2luZ1NlcnZlcjo6ZXhwaXJlQ2xvc2UoYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2spIHsKK3ZvaWQgVE5vbmJsb2NraW5nU2VydmVyOjpleHBpcmVDbG9zZShzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2spIHsKICAgVENvbm5lY3Rpb24qIGNvbm5lY3Rpb24gPSBzdGF0aWNfY2FzdDxUQ29ubmVjdGlvbjo6VGFzayo+KHRhc2suZ2V0KCkpLT5nZXRUQ29ubmVjdGlvbigpOwogICBhc3NlcnQoY29ubmVjdGlvbiAmJiBjb25uZWN0aW9uLT5nZXRTZXJ2ZXIoKSAmJiBjb25uZWN0aW9uLT5nZXRTdGF0ZSgpID09IEFQUF9XQUlUX1RBU0spOwogICBjb25uZWN0aW9uLT5mb3JjZUNsb3NlKCk7CiB9CiAKIHZvaWQgVE5vbmJsb2NraW5nU2VydmVyOjpzdG9wKCkgewotICBpZiAoIXBvcnRfKSB7Ci0gICAgbGlzdGVuUG9ydF8gPSAwOwotICB9CiAgIC8vIEJyZWFrcyB0aGUgZXZlbnQgbG9vcCBpbiBhbGwgdGhyZWFkcyBzbyB0aGF0IHRoZXkgZW5kIEFTQVAuCiAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBpb1RocmVhZHNfLnNpemUoKTsgKytpKSB7CiAgICAgaW9UaHJlYWRzX1tpXS0+c3RvcCgpOwpAQCAtMTIxNCwxNCArMTExMywxMyBAQAogICBhc3NlcnQoaW9UaHJlYWRzXy5zaXplKCkgPT0gbnVtSU9UaHJlYWRzXyk7CiAgIGFzc2VydChpb1RocmVhZHNfLnNpemUoKSA+IDApOwogCi0gIEdsb2JhbE91dHB1dC5wcmludGYoIlROb25ibG9ja2luZ1NlcnZlcjogU2VydmluZyBvbiBwb3J0ICVkLCAlZCBpbyB0aHJlYWRzLiIsCi0gICAgICAgICAgICAgICAgICAgICAgbGlzdGVuUG9ydF8sCisgIEdsb2JhbE91dHB1dC5wcmludGYoIlROb25ibG9ja2luZ1NlcnZlcjogU2VydmluZyB3aXRoICVkIGlvIHRocmVhZHMuIiwKICAgICAgICAgICAgICAgICAgICAgICBpb1RocmVhZHNfLnNpemUoKSk7CiAKICAgLy8gTGF1bmNoIGFsbCB0aGUgc2Vjb25kYXJ5IElPIHRocmVhZHMgaW4gc2VwYXJhdGUgdGhyZWFkcwogICBpZiAoaW9UaHJlYWRzXy5zaXplKCkgPiAxKSB7CiAgICAgaW9UaHJlYWRGYWN0b3J5Xy5yZXNldChuZXcgUGxhdGZvcm1UaHJlYWRGYWN0b3J5KAotI2lmICFVU0VfQk9PU1RfVEhSRUFEICYmICFVU0VfU1REX1RIUkVBRAorI2lmICFVU0VfU1REX1RIUkVBRAogICAgICAgICBQbGF0Zm9ybVRocmVhZEZhY3Rvcnk6Ok9USEVSLCAgLy8gc2NoZWR1bGVyCiAgICAgICAgIFBsYXRmb3JtVGhyZWFkRmFjdG9yeTo6Tk9STUFMLCAvLyBwcmlvcml0eQogICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhY2sgc2l6ZSAoTUIpCkBAIC0xMjg2LDcgKzExODQsNyBAQAogICAgIG93bkV2ZW50QmFzZV8gPSBmYWxzZTsKICAgfQogCi0gIGlmIChsaXN0ZW5Tb2NrZXRfID49IDApIHsKKyAgaWYgKGxpc3RlblNvY2tldF8gIT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CiAgICAgaWYgKDAgIT0gOjpUSFJJRlRfQ0xPU0VTT0NLRVQobGlzdGVuU29ja2V0XykpIHsKICAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ0lPVGhyZWFkIGxpc3RlblNvY2tldF8gY2xvc2UoKTogIiwgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IpOwogICAgIH0KQEAgLTEzNTIsNyArMTI1MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBldmVudF9iYXNlX2dldF9tZXRob2QoZXZlbnRCYXNlXykpOwogICB9CiAKLSAgaWYgKGxpc3RlblNvY2tldF8gPj0gMCkgeworICBpZiAobGlzdGVuU29ja2V0XyAhPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKICAgICAvLyBSZWdpc3RlciB0aGUgc2VydmVyIGV2ZW50CiAgICAgZXZlbnRfc2V0KCZzZXJ2ZXJFdmVudF8sCiAgICAgICAgICAgICAgIGxpc3RlblNvY2tldF8sCkBAIC0xMzk3LDE3ICsxMjk1LDUxIEBACiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKLSAgZmRfc2V0IHdmZHMsIGVmZHM7CiAgIGludCByZXQgPSAtMTsKLSAgaW50IGtTaXplID0gc2l6ZW9mKGNvbm4pOwotICBjb25zdCBjaGFyKiBwb3MgPSAoY29uc3QgY2hhciopY29uc3RfY2FzdF9zb2Nrb3B0KCZjb25uKTsKKyAgbG9uZyBrU2l6ZSA9IHNpemVvZihjb25uKTsKKyAgY29uc3QgY2hhciAqIHBvcyA9IChjb25zdCBjaGFyICopY29uc3RfY2FzdF9zb2Nrb3B0KCZjb25uKTsKKworI2lmIGRlZmluZWQoSEFWRV9QT0xMX0gpIHx8IGRlZmluZWQoSEFWRV9TWVNfUE9MTF9IKQorICBzdHJ1Y3QgcG9sbGZkIHBmZCA9IHtmZCwgUE9MTE9VVCwgMH07CisKKyAgd2hpbGUgKGtTaXplID4gMCkgeworICAgIHBmZC5yZXZlbnRzID0gMDsKKyAgICByZXQgPSBwb2xsKCZwZmQsIDEsIC0xKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSBpZiAocmV0ID09IDApIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGlmIChwZmQucmV2ZW50cyAmIFBPTExIVVAgfHwgcGZkLnJldmVudHMgJiBQT0xMRVJSKSB7CisgICAgICA6OlRIUklGVF9DTE9TRVNPQ0tFVChmZCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKHBmZC5yZXZlbnRzICYgUE9MTE9VVCkgeworICAgICAgcmV0ID0gc2VuZChmZCwgcG9zLCBrU2l6ZSwgMCk7CisgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBpZiAoZXJybm8gPT0gRUFHQUlOKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICA6OlRIUklGVF9DTE9TRVNPQ0tFVChmZCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAga1NpemUgLT0gcmV0OworICAgICAgcG9zICs9IHJldDsKKyAgICB9CisgIH0KKyNlbHNlCisgIGZkX3NldCB3ZmRzLCBlZmRzOwogCiAgIHdoaWxlIChrU2l6ZSA+IDApIHsKICAgICBGRF9aRVJPKCZ3ZmRzKTsKICAgICBGRF9aRVJPKCZlZmRzKTsKICAgICBGRF9TRVQoZmQsICZ3ZmRzKTsKICAgICBGRF9TRVQoZmQsICZlZmRzKTsKLSAgICByZXQgPSBzZWxlY3QoZmQgKyAxLCBOVUxMLCAmd2ZkcywgJmVmZHMsIE5VTEwpOworICAgIHJldCA9IHNlbGVjdChzdGF0aWNfY2FzdDxpbnQ+KGZkICsgMSksIE5VTEwsICZ3ZmRzLCAmZWZkcywgTlVMTCk7CiAgICAgaWYgKHJldCA8IDApIHsKICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9IGVsc2UgaWYgKHJldCA9PSAwKSB7CkBAIC0xNDM0LDYgKzEzNjYsNyBAQAogICAgICAgcG9zICs9IHJldDsKICAgICB9CiAgIH0KKyNlbmRpZgogCiAgIHJldHVybiB0cnVlOwogfQpAQCAtMTQ1MSw2ICsxMzg0LDcgQEAKICAgICBpZiAobkJ5dGVzID09IGtTaXplKSB7CiAgICAgICBpZiAoY29ubmVjdGlvbiA9PSBOVUxMKSB7CiAgICAgICAgIC8vIHRoaXMgaXMgdGhlIGNvbW1hbmQgdG8gc3RvcCBvdXIgdGhyZWFkLCBleGl0IHRoZSBoYW5kbGVyIQorICAgICAgICBpb1RocmVhZC0+YnJlYWtMb29wKGZhbHNlKTsKICAgICAgICAgcmV0dXJuOwogICAgICAgfQogICAgICAgY29ubmVjdGlvbi0+dHJhbnNpdGlvbigpOwpAQCAtMTQ2MSw2ICsxMzk1LDcgQEAKICAgICAgIHJldHVybjsKICAgICB9IGVsc2UgaWYgKG5CeXRlcyA9PSAwKSB7CiAgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJub3RpZnlIYW5kbGVyOiBOb3RpZnkgc29ja2V0IGNsb3NlZCEiKTsKKyAgICAgIGlvVGhyZWFkLT5icmVha0xvb3AoZmFsc2UpOwogICAgICAgLy8gZXhpdCB0aGUgbG9vcAogICAgICAgYnJlYWs7CiAgICAgfSBlbHNlIHsgLy8gbkJ5dGVzIDwgMApAQCAtMTQ4NSwxOSArMTQyMCwxNSBAQAogICAgIDo6YWJvcnQoKTsKICAgfQogCi0gIC8vIHNldHMgYSBmbGFnIHNvIHRoYXQgdGhlIGxvb3AgZXhpdHMgb24gdGhlIG5leHQgZXZlbnQKLSAgZXZlbnRfYmFzZV9sb29wYnJlYWsoZXZlbnRCYXNlXyk7Ci0KLSAgLy8gZXZlbnRfYmFzZV9sb29wYnJlYWsoKSBvbmx5IGNhdXNlcyB0aGUgbG9vcCB0byBleGl0IHRoZSBuZXh0IHRpbWUKLSAgLy8gaXQgd2FrZXMgdXAuICBXZSBuZWVkIHRvIGZvcmNlIGl0IHRvIHdha2UgdXAsIGluIGNhc2UgdGhlcmUgYXJlCi0gIC8vIG5vIHJlYWwgZXZlbnRzIGl0IG5lZWRzIHRvIHByb2Nlc3MuCi0gIC8vCiAgIC8vIElmIHdlJ3JlIHJ1bm5pbmcgaW4gdGhlIHNhbWUgdGhyZWFkLCB3ZSBjYW4ndCB1c2UgdGhlIG5vdGlmeSgwKQogICAvLyBtZWNoYW5pc20gdG8gc3RvcCB0aGUgdGhyZWFkLCBidXQgaGFwcGlseSBpZiB3ZSdyZSBydW5uaW5nIGluIHRoZQogICAvLyBzYW1lIHRocmVhZCwgdGhpcyBtZWFucyB0aGUgdGhyZWFkIGNhbid0IGJlIGJsb2NraW5nIGluIHRoZSBldmVudAogICAvLyBsb29wIGVpdGhlci4KICAgaWYgKCFUaHJlYWQ6OmlzX2N1cnJlbnQodGhyZWFkSWRfKSkgewogICAgIG5vdGlmeShOVUxMKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBjYXVzZSB0aGUgbG9vcCB0byBzdG9wIEFTQVAgLSBldmVuIGlmIGl0IGhhcyB0aGluZ3MgdG8gZG8gaW4gaXQKKyAgICBldmVudF9iYXNlX2xvb3BicmVhayhldmVudEJhc2VfKTsKICAgfQogfQogCkBAIC0xNTMxLDMxICsxNDYyLDMzIEBACiB9CiAKIHZvaWQgVE5vbmJsb2NraW5nSU9UaHJlYWQ6OnJ1bigpIHsKLSAgaWYgKGV2ZW50QmFzZV8gPT0gTlVMTCkKKyAgaWYgKGV2ZW50QmFzZV8gPT0gTlVMTCkgewogICAgIHJlZ2lzdGVyRXZlbnRzKCk7Ci0KLSAgR2xvYmFsT3V0cHV0LnByaW50ZigiVE5vbmJsb2NraW5nU2VydmVyOiBJTyB0aHJlYWQgIyVkIGVudGVyaW5nIGxvb3AuLi4iLCBudW1iZXJfKTsKLQorICB9CiAgIGlmICh1c2VIaWdoUHJpb3JpdHlfKSB7CiAgICAgc2V0Q3VycmVudFRocmVhZEhpZ2hQcmlvcml0eSh0cnVlKTsKICAgfQogCi0gIC8vIFJ1biBsaWJldmVudCBlbmdpbmUsIG5ldmVyIHJldHVybnMsIGludm9rZXMgY2FsbHMgdG8gZXZlbnRIYW5kbGVyCi0gIGV2ZW50X2Jhc2VfbG9vcChldmVudEJhc2VfLCAwKTsKKyAgaWYgKGV2ZW50QmFzZV8gIT0gTlVMTCkKKyAgeworICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlROb25ibG9ja2luZ1NlcnZlcjogSU8gdGhyZWFkICMlZCBlbnRlcmluZyBsb29wLi4uIiwgbnVtYmVyXyk7CisgICAgLy8gUnVuIGxpYmV2ZW50IGVuZ2luZSwgbmV2ZXIgcmV0dXJucywgaW52b2tlcyBjYWxscyB0byBldmVudEhhbmRsZXIKKyAgICBldmVudF9iYXNlX2xvb3AoZXZlbnRCYXNlXywgMCk7CiAKLSAgaWYgKHVzZUhpZ2hQcmlvcml0eV8pIHsKLSAgICBzZXRDdXJyZW50VGhyZWFkSGlnaFByaW9yaXR5KGZhbHNlKTsKKyAgICBpZiAodXNlSGlnaFByaW9yaXR5XykgeworICAgICAgc2V0Q3VycmVudFRocmVhZEhpZ2hQcmlvcml0eShmYWxzZSk7CisgICAgfQorCisgICAgLy8gY2xlYW5zIHVwIG91ciByZWdpc3RlcmVkIGV2ZW50cworICAgIGNsZWFudXBFdmVudHMoKTsKICAgfQogCi0gIC8vIGNsZWFucyB1cCBvdXIgcmVnaXN0ZXJlZCBldmVudHMKLSAgY2xlYW51cEV2ZW50cygpOwotCiAgIEdsb2JhbE91dHB1dC5wcmludGYoIlROb25ibG9ja2luZ1NlcnZlcjogSU8gdGhyZWFkICMlZCBydW4oKSBkb25lISIsIG51bWJlcl8pOwogfQogCiB2b2lkIFROb25ibG9ja2luZ0lPVGhyZWFkOjpjbGVhbnVwRXZlbnRzKCkgewogICAvLyBzdG9wIHRoZSBsaXN0ZW4gc29ja2V0LCBpZiBhbnkKLSAgaWYgKGxpc3RlblNvY2tldF8gPj0gMCkgeworICBpZiAobGlzdGVuU29ja2V0XyAhPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKICAgICBpZiAoZXZlbnRfZGVsKCZzZXJ2ZXJFdmVudF8pID09IC0xKSB7CiAgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUTm9uYmxvY2tpbmdJT1RocmVhZDo6c3RvcCgpIGV2ZW50X2RlbDogIiwgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IpOwogICAgIH0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmggYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5oCmluZGV4IDRmYjgzZjEuLmU3OWMyNGYgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuaApAQCAtMjEsMTAgKzIxLDEyIEBACiAjZGVmaW5lIF9USFJJRlRfU0VSVkVSX1ROT05CTE9DS0lOR1NFUlZFUl9IXyAxCiAKICNpbmNsdWRlIDx0aHJpZnQvVGhyaWZ0Lmg+CisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFNlcnZlci5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQuaD4KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oPgogI2luY2x1ZGUgPGNsaW1pdHM+CiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZC5oPgpAQCAtNDcsNiArNDksNyBAQAogCiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNvY2tldDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydDsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpSdW5uYWJsZTsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkTWFuYWdlcjsKQEAgLTk2LDEwICs5OSw2IEBACiAgKiBvcGVyYXRlcyBhIHNldCBvZiBJTyB0aHJlYWRzIChieSBkZWZhdWx0IG9ubHkgb25lKS4gSXQgYXNzdW1lcyB0aGF0CiAgKiBhbGwgaW5jb21pbmcgcmVxdWVzdHMgYXJlIGZyYW1lZCB3aXRoIGEgNCBieXRlIGxlbmd0aCBpbmRpY2F0b3IgYW5kCiAgKiB3cml0ZXMgb3V0IHJlc3BvbnNlcyB1c2luZyB0aGUgc2FtZSBmcmFtaW5nLgotICoKLSAqIEl0IGRvZXMgbm90IHVzZSB0aGUgVFNlcnZlclRyYW5zcG9ydCBmcmFtZXdvcmssIGJ1dCByYXRoZXIgaGFzIHNvY2tldAotICogb3BlcmF0aW9ucyBoYXJkY29kZWQgZm9yIHVzZSB3aXRoIHNlbGVjdC4KLSAqCiAgKi8KIAogLy8vIE92ZXJsb2FkIGNvbmRpdGlvbiBhY3Rpb25zLgpAQCAtMTU3LDI2ICsxNTYsMjAgQEAKICAgLy8vIFNlcnZlciBzb2NrZXQgZmlsZSBkZXNjcmlwdG9yCiAgIFRIUklGVF9TT0NLRVQgc2VydmVyU29ja2V0XzsKIAotICAvLy8gUG9ydCBzZXJ2ZXIgcnVucyBvbi4gWmVybyB3aGVuIGxldHRpbmcgT1MgZGVjaWRlIGFjdHVhbCBwb3J0Ci0gIGludCBwb3J0XzsKLQotICAvLy8gUG9ydCBzZXJ2ZXIgYWN0dWFsbHkgcnVucyBvbgotICBpbnQgbGlzdGVuUG9ydF87Ci0KICAgLy8vIFRoZSBvcHRpb25hbCB1c2VyLXByb3ZpZGVkIGV2ZW50LWJhc2UgKGZvciBzaW5nbGUtdGhyZWFkIHNlcnZlcnMpCiAgIGV2ZW50X2Jhc2UqIHVzZXJFdmVudEJhc2VfOwogCiAgIC8vLyBGb3IgcHJvY2Vzc2luZyB2aWEgdGhyZWFkIHBvb2wsIG1heSBiZSBOVUxMCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXJfOworICBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlcl87CiAKICAgLy8vIElzIHRocmVhZCBwb29sIHByb2Nlc3Npbmc/CiAgIGJvb2wgdGhyZWFkUG9vbFByb2Nlc3NpbmdfOwogCiAgIC8vIEZhY3RvcnkgdG8gY3JlYXRlIHRoZSBJTyB0aHJlYWRzCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4gaW9UaHJlYWRGYWN0b3J5XzsKKyAgc3RkOjpzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4gaW9UaHJlYWRGYWN0b3J5XzsKIAogICAvLyBWZWN0b3Igb2YgSU9UaHJlYWQgb2JqZWN0cyB0aGF0IHdpbGwgaGFuZGxlIG91ciBJTwotICBzdGQ6OnZlY3Rvcjxib29zdDo6c2hhcmVkX3B0cjxUTm9uYmxvY2tpbmdJT1RocmVhZD4gPiBpb1RocmVhZHNfOworICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8VE5vbmJsb2NraW5nSU9UaHJlYWQ+ID4gaW9UaHJlYWRzXzsKIAogICAvLyBJbmRleCBvZiBuZXh0IElPIFRocmVhZCB0byBiZSB1c2VkIChmb3Igcm91bmQtcm9iaW4pCiAgIHVpbnQzMl90IG5leHRJT1RocmVhZF87CkBAIC0yNjksMjMgKzI2MiwyNCBAQAogICAgKi8KICAgc3RkOjp2ZWN0b3I8VENvbm5lY3Rpb24qPiBhY3RpdmVDb25uZWN0aW9uc187CiAKKyAgLyoKKyAgKi8KKyAgc3RkOjpzaGFyZWRfcHRyPFROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydD4gc2VydmVyVHJhbnNwb3J0XzsKKwogICAvKioKICAgICogQ2FsbGVkIHdoZW4gc2VydmVyIHNvY2tldCBoYWQgc29tZXRoaW5nIGhhcHBlbi4gIFdlIGFjY2VwdCBhbGwgd2FpdGluZwogICAgKiBjbGllbnQgY29ubmVjdGlvbnMgb24gbGlzdGVuIHNvY2tldCBmZCBhbmQgYXNzaWduIFRDb25uZWN0aW9uIG9iamVjdHMKICAgICogdG8gaGFuZGxlIHRob3NlIHJlcXVlc3RzLgogICAgKgotICAgKiBAcGFyYW0gZmQgdGhlIGxpc3RlbiBzb2NrZXQuCiAgICAqIEBwYXJhbSB3aGljaCB0aGUgZXZlbnQgZmxhZyB0aGF0IHRyaWdnZXJlZCB0aGUgaGFuZGxlci4KICAgICovCiAgIHZvaWQgaGFuZGxlRXZlbnQoVEhSSUZUX1NPQ0tFVCBmZCwgc2hvcnQgd2hpY2gpOwogCi0gIHZvaWQgaW5pdChpbnQgcG9ydCkgeworICB2b2lkIGluaXQoKSB7CiAgICAgc2VydmVyU29ja2V0XyA9IFRIUklGVF9JTlZBTElEX1NPQ0tFVDsKICAgICBudW1JT1RocmVhZHNfID0gREVGQVVMVF9JT19USFJFQURTOwogICAgIG5leHRJT1RocmVhZF8gPSAwOwogICAgIHVzZUhpZ2hQcmlvcml0eUlPVGhyZWFkc18gPSBmYWxzZTsKLSAgICBwb3J0XyA9IHBvcnQ7Ci0gICAgbGlzdGVuUG9ydF8gPSBwb3J0OwogICAgIHVzZXJFdmVudEJhc2VfID0gTlVMTDsKICAgICB0aHJlYWRQb29sUHJvY2Vzc2luZ18gPSBmYWxzZTsKICAgICBudW1UQ29ubmVjdGlvbnNfID0gMDsKQEAgLTMwNyw1NSArMzAxLDU1IEBACiAgIH0KIAogcHVibGljOgotICBUTm9uYmxvY2tpbmdTZXJ2ZXIoY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LCBpbnQgcG9ydCkKLSAgICA6IFRTZXJ2ZXIocHJvY2Vzc29yRmFjdG9yeSkgewotICAgIGluaXQocG9ydCk7CisgIFROb25ibG9ja2luZ1NlcnZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCkKKyAgICA6IFRTZXJ2ZXIocHJvY2Vzc29yRmFjdG9yeSksIHNlcnZlclRyYW5zcG9ydF8oc2VydmVyVHJhbnNwb3J0KSB7CisgICAgaW5pdCgpOwogICB9CiAKLSAgVE5vbmJsb2NraW5nU2VydmVyKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsIGludCBwb3J0KQotICAgIDogVFNlcnZlcihwcm9jZXNzb3IpIHsKLSAgICBpbml0KHBvcnQpOworICBUTm9uYmxvY2tpbmdTZXJ2ZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0KQorICAgIDogVFNlcnZlcihwcm9jZXNzb3IpLCBzZXJ2ZXJUcmFuc3BvcnRfKHNlcnZlclRyYW5zcG9ydCkgeworICAgIGluaXQoKTsKICAgfQogCi0gIFROb25ibG9ja2luZ1NlcnZlcihjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgaW50IHBvcnQsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiYgdGhyZWFkTWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAgPSBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPigpKQotICAgIDogVFNlcnZlcihwcm9jZXNzb3JGYWN0b3J5KSB7CiAKLSAgICBpbml0KHBvcnQpOworICBUTm9uYmxvY2tpbmdTZXJ2ZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiYgdGhyZWFkTWFuYWdlcgorICAgICAgICAgICAgICAgICAgICAgPSBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4oKSkKKyAgICA6IFRTZXJ2ZXIocHJvY2Vzc29yRmFjdG9yeSksIHNlcnZlclRyYW5zcG9ydF8oc2VydmVyVHJhbnNwb3J0KSB7CisgICAgaW5pdCgpOwogCiAgICAgc2V0SW5wdXRQcm90b2NvbEZhY3RvcnkocHJvdG9jb2xGYWN0b3J5KTsKICAgICBzZXRPdXRwdXRQcm90b2NvbEZhY3RvcnkocHJvdG9jb2xGYWN0b3J5KTsKICAgICBzZXRUaHJlYWRNYW5hZ2VyKHRocmVhZE1hbmFnZXIpOwogICB9CiAKLSAgVE5vbmJsb2NraW5nU2VydmVyKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgaW50IHBvcnQsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiYgdGhyZWFkTWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAgPSBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPigpKQotICAgIDogVFNlcnZlcihwcm9jZXNzb3IpIHsKLQotICAgIGluaXQocG9ydCk7CisgIFROb25ibG9ja2luZ1NlcnZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiYgdGhyZWFkTWFuYWdlcgorICAgICAgICAgICAgICAgICAgICAgPSBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4oKSkKKyAgICA6IFRTZXJ2ZXIocHJvY2Vzc29yKSwgc2VydmVyVHJhbnNwb3J0XyhzZXJ2ZXJUcmFuc3BvcnQpIHsKKyAgICBpbml0KCk7CiAKICAgICBzZXRJbnB1dFByb3RvY29sRmFjdG9yeShwcm90b2NvbEZhY3RvcnkpOwogICAgIHNldE91dHB1dFByb3RvY29sRmFjdG9yeShwcm90b2NvbEZhY3RvcnkpOwogICAgIHNldFRocmVhZE1hbmFnZXIodGhyZWFkTWFuYWdlcik7CiAgIH0KIAotICBUTm9uYmxvY2tpbmdTZXJ2ZXIoY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgaW50IHBvcnQsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiYgdGhyZWFkTWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAgPSBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPigpKQotICAgIDogVFNlcnZlcihwcm9jZXNzb3JGYWN0b3J5KSB7Ci0KLSAgICBpbml0KHBvcnQpOworICBUTm9uYmxvY2tpbmdTZXJ2ZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+JiB0aHJlYWRNYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICA9IHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPigpKQorICAgIDogVFNlcnZlcihwcm9jZXNzb3JGYWN0b3J5KSwgc2VydmVyVHJhbnNwb3J0XyhzZXJ2ZXJUcmFuc3BvcnQpIHsKKyAgICBpbml0KCk7CiAKICAgICBzZXRJbnB1dFRyYW5zcG9ydEZhY3RvcnkoaW5wdXRUcmFuc3BvcnRGYWN0b3J5KTsKICAgICBzZXRPdXRwdXRUcmFuc3BvcnRGYWN0b3J5KG91dHB1dFRyYW5zcG9ydEZhY3RvcnkpOwpAQCAtMzY0LDE3ICszNTgsMTYgQEAKICAgICBzZXRUaHJlYWRNYW5hZ2VyKHRocmVhZE1hbmFnZXIpOwogICB9CiAKLSAgVE5vbmJsb2NraW5nU2VydmVyKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICBpbnQgcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+JiB0aHJlYWRNYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgICA9IGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+KCkpCi0gICAgOiBUU2VydmVyKHByb2Nlc3NvcikgewotCi0gICAgaW5pdChwb3J0KTsKKyAgVE5vbmJsb2NraW5nU2VydmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4mIHRocmVhZE1hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgID0gc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+KCkpCisgICAgOiBUU2VydmVyKHByb2Nlc3NvciksIHNlcnZlclRyYW5zcG9ydF8oc2VydmVyVHJhbnNwb3J0KSB7CisgICAgaW5pdCgpOwogCiAgICAgc2V0SW5wdXRUcmFuc3BvcnRGYWN0b3J5KGlucHV0VHJhbnNwb3J0RmFjdG9yeSk7CiAgICAgc2V0T3V0cHV0VHJhbnNwb3J0RmFjdG9yeShvdXRwdXRUcmFuc3BvcnRGYWN0b3J5KTsKQEAgLTM4NSwxMSArMzc4LDExIEBACiAKICAgflROb25ibG9ja2luZ1NlcnZlcigpOwogCi0gIHZvaWQgc2V0VGhyZWFkTWFuYWdlcihib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyKTsKKyAgdm9pZCBzZXRUaHJlYWRNYW5hZ2VyKHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyKTsKIAotICBpbnQgZ2V0TGlzdGVuUG9ydCgpIHsgcmV0dXJuIGxpc3RlblBvcnRfOyB9CisgIGludCBnZXRMaXN0ZW5Qb3J0KCkgeyByZXR1cm4gc2VydmVyVHJhbnNwb3J0Xy0+Z2V0TGlzdGVuUG9ydCgpOyB9CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gZ2V0VGhyZWFkTWFuYWdlcigpIHsgcmV0dXJuIHRocmVhZE1hbmFnZXJfOyB9CisgIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiBnZXRUaHJlYWRNYW5hZ2VyKCkgeyByZXR1cm4gdGhyZWFkTWFuYWdlcl87IH0KIAogICAvKioKICAgICogU2V0cyB0aGUgbnVtYmVyIG9mIElPIHRocmVhZHMgdXNlZCBieSB0aGlzIHNlcnZlci4gQ2FuIG9ubHkgYmUgdXNlZCBiZWZvcmUKQEAgLTQyOCw3ICs0MjEsNyBAQAogCiAgIGJvb2wgaXNUaHJlYWRQb29sUHJvY2Vzc2luZygpIGNvbnN0IHsgcmV0dXJuIHRocmVhZFBvb2xQcm9jZXNzaW5nXzsgfQogCi0gIHZvaWQgYWRkVGFzayhib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzaykgeworICB2b2lkIGFkZFRhc2soc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrKSB7CiAgICAgdGhyZWFkTWFuYWdlcl8tPmFkZCh0YXNrLCAwTEwsIHRhc2tFeHBpcmVUaW1lXyk7CiAgIH0KIApAQCAtNjg5LDE0ICs2ODIsNiBAQAogICB2b2lkIGNyZWF0ZUFuZExpc3Rlbk9uU29ja2V0KCk7CiAKICAgLyoqCi0gICAqIFRha2VzIGEgc29ja2V0IGNyZWF0ZWQgYnkgY3JlYXRlQW5kTGlzdGVuT25Tb2NrZXQoKSBhbmQgc2V0cyB2YXJpb3VzCi0gICAqIG9wdGlvbnMgb24gaXQgdG8gcHJlcGFyZSBmb3IgdXNlIGluIHRoZSBzZXJ2ZXIuCi0gICAqCi0gICAqIEBwYXJhbSBmZCBkZXNjcmlwdG9yIG9mIHNvY2tldCB0byBiZSBpbml0aWFsaXplZC8KLSAgICovCi0gIHZvaWQgbGlzdGVuU29ja2V0KFRIUklGVF9TT0NLRVQgZmQpOwotCi0gIC8qKgogICAgKiBSZWdpc3RlciB0aGUgb3B0aW9uYWwgdXNlci1wcm92aWRlZCBldmVudC1iYXNlIChmb3Igc2luZ2xlLXRocmVhZCBzZXJ2ZXJzKQogICAgKgogICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZCB3aGVuIHRoZSBzZXJ2ZXIgaXMgcnVubmluZyBpbiBhIHNpbmdsZS10aHJlYWQKQEAgLTcxMiw2ICs2OTcsMTEgQEAKICAgICovCiAgIGV2ZW50X2Jhc2UqIGdldFVzZXJFdmVudEJhc2UoKSBjb25zdCB7IHJldHVybiB1c2VyRXZlbnRCYXNlXzsgfQogCisgIC8qKiBTb21lIHRyYW5zcG9ydHMsIGxpa2UgVEhlYWRlclRyYW5zcG9ydCwgcmVxdWlyZSBwYXNzaW5nIHRocm91Z2gKKyAgICogdGhlIGZyYW1pbmcgc2l6ZSBpbnN0ZWFkIG9mIHN0cmlwcGluZyBpdC4KKyAgICovCisgIGJvb2wgZ2V0SGVhZGVyVHJhbnNwb3J0KCk7CisKIHByaXZhdGU6CiAgIC8qKgogICAgKiBDYWxsYmFjayBmdW5jdGlvbiB0aGF0IHRoZSB0aHJlYWRtYW5hZ2VyIGNhbGxzIHdoZW4gYSB0YXNrIHJlYWNoZXMKQEAgLTcxOSw3ICs3MDksNyBAQAogICAgKgogICAgKiBAcGFyYW0gdGFzayB0aGUgcnVubmFibGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBleHBpcmVkIHRhc2suCiAgICAqLwotICB2b2lkIGV4cGlyZUNsb3NlKGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrKTsKKyAgdm9pZCBleHBpcmVDbG9zZShzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2spOwogCiAgIC8qKgogICAgKiBSZXR1cm4gYW4gaW5pdGlhbGl6ZWQgY29ubmVjdGlvbiBvYmplY3QuICBDcmVhdGVzIG9yIHJlY292ZXJzIGZyb20KQEAgLTczMSw3ICs3MjEsNyBAQAogICAgKiBAcGFyYW0gYWRkckxlbiB0aGUgbGVuZ3RoIG9mIGFkZHIKICAgICogQHJldHVybiBwb2ludGVyIHRvIGluaXRpYWxpemVkIFRDb25uZWN0aW9uIG9iamVjdC4KICAgICovCi0gIFRDb25uZWN0aW9uKiBjcmVhdGVDb25uZWN0aW9uKFRIUklGVF9TT0NLRVQgc29ja2V0LCBjb25zdCBzb2NrYWRkciogYWRkciwgc29ja2xlbl90IGFkZHJMZW4pOworICBUQ29ubmVjdGlvbiogY3JlYXRlQ29ubmVjdGlvbihzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gc29ja2V0KTsKIAogICAvKioKICAgICogUmV0dXJucyBhIGNvbm5lY3Rpb24gdG8gcG9vbCBvciBkZWxldGlvbi4gIElmIHRoZSBjb25uZWN0aW9uIHBvb2wKQEAgLTc3NSwxMCArNzY1LDEwIEBACiAgIGV2dXRpbF9zb2NrZXRfdCBnZXROb3RpZmljYXRpb25SZWN2RkQoKSBjb25zdCB7IHJldHVybiBub3RpZmljYXRpb25QaXBlRkRzX1swXTsgfQogCiAgIC8vIFJldHVybnMgdGhlIGFjdHVhbCB0aHJlYWQgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIElPIHRocmVhZC4KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkPiBnZXRUaHJlYWQoKSBjb25zdCB7IHJldHVybiB0aHJlYWRfOyB9CisgIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+IGdldFRocmVhZCgpIGNvbnN0IHsgcmV0dXJuIHRocmVhZF87IH0KIAogICAvLyBTZXRzIHRoZSBhY3R1YWwgdGhyZWFkIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBJTyB0aHJlYWQuCi0gIHZvaWQgc2V0VGhyZWFkKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZD4mIHQpIHsgdGhyZWFkXyA9IHQ7IH0KKyAgdm9pZCBzZXRUaHJlYWQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRocmVhZD4mIHQpIHsgdGhyZWFkXyA9IHQ7IH0KIAogICAvLyBVc2VkIGJ5IFRDb25uZWN0aW9uIG9iamVjdHMgdG8gaW5kaWNhdGUgcHJvY2Vzc2luZyBoYXMgZmluaXNoZWQuCiAgIGJvb2wgbm90aWZ5KFROb25ibG9ja2luZ1NlcnZlcjo6VENvbm5lY3Rpb24qIGNvbm4pOwpAQCAtODYzLDcgKzg1Myw3IEBACiAgIGV2dXRpbF9zb2NrZXRfdCBub3RpZmljYXRpb25QaXBlRkRzX1syXTsKIAogICAvLy8gQWN0dWFsIElPIFRocmVhZAotICBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWQ+IHRocmVhZF87CisgIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+IHRocmVhZF87CiB9OwogfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UU2VydmVyLmggYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTZXJ2ZXIuaAppbmRleCA0N2UwZDQwLi4zYzZkODE4IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTZXJ2ZXIuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTZXJ2ZXIuaApAQCAtMjUsNyArMjUsNyBAQAogI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkLmg+CiAKLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAKIG5hbWVzcGFjZSBhcGFjaGUgewogbmFtZXNwYWNlIHRocmlmdCB7CkBAIC01OCw4ICs1OCw4IEBACiAgIC8qKgogICAgKiBDYWxsZWQgd2hlbiBhIG5ldyBjbGllbnQgaGFzIGNvbm5lY3RlZCBhbmQgaXMgYWJvdXQgdG8gYmVpbmcgcHJvY2Vzc2luZy4KICAgICovCi0gIHZpcnR1YWwgdm9pZCogY3JlYXRlQ29udGV4dChib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXQpIHsKKyAgdmlydHVhbCB2b2lkKiBjcmVhdGVDb250ZXh0KHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0KSB7CiAgICAgKHZvaWQpaW5wdXQ7CiAgICAgKHZvaWQpb3V0cHV0OwogICAgIHJldHVybiBOVUxMOwpAQCAtNzAsOCArNzAsOCBAQAogICAgKiBjb250ZXh0LgogICAgKi8KICAgdmlydHVhbCB2b2lkIGRlbGV0ZUNvbnRleHQodm9pZCogc2VydmVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dCkgewogICAgICh2b2lkKXNlcnZlckNvbnRleHQ7CiAgICAgKHZvaWQpaW5wdXQ7CiAgICAgKHZvaWQpb3V0cHV0OwpAQCAtODAsNyArODAsNyBAQAogICAvKioKICAgICogQ2FsbGVkIHdoZW4gYSBjbGllbnQgaXMgYWJvdXQgdG8gY2FsbCB0aGUgcHJvY2Vzc29yLgogICAgKi8KLSAgdmlydHVhbCB2b2lkIHByb2Nlc3NDb250ZXh0KHZvaWQqIHNlcnZlckNvbnRleHQsIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCkgeworICB2aXJ0dWFsIHZvaWQgcHJvY2Vzc0NvbnRleHQodm9pZCogc2VydmVyQ29udGV4dCwgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCkgewogICAgICh2b2lkKXNlcnZlckNvbnRleHQ7CiAgICAgKHZvaWQpdHJhbnNwb3J0OwogICB9CkBAIC0xMDcsNjIgKzEwNyw2MiBAQAogICAvLyBBbGxvd3MgcnVubmluZyB0aGUgc2VydmVyIGFzIGEgUnVubmFibGUgdGhyZWFkCiAgIHZpcnR1YWwgdm9pZCBydW4oKSB7IHNlcnZlKCk7IH0KIAotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4gZ2V0UHJvY2Vzc29yRmFjdG9yeSgpIHsgcmV0dXJuIHByb2Nlc3NvckZhY3RvcnlfOyB9CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4gZ2V0UHJvY2Vzc29yRmFjdG9yeSgpIHsgcmV0dXJuIHByb2Nlc3NvckZhY3RvcnlfOyB9CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4gZ2V0U2VydmVyVHJhbnNwb3J0KCkgeyByZXR1cm4gc2VydmVyVHJhbnNwb3J0XzsgfQorICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4gZ2V0U2VydmVyVHJhbnNwb3J0KCkgeyByZXR1cm4gc2VydmVyVHJhbnNwb3J0XzsgfQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiBnZXRJbnB1dFRyYW5zcG9ydEZhY3RvcnkoKSB7IHJldHVybiBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfOyB9CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gZ2V0SW5wdXRUcmFuc3BvcnRGYWN0b3J5KCkgeyByZXR1cm4gaW5wdXRUcmFuc3BvcnRGYWN0b3J5XzsgfQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiBnZXRPdXRwdXRUcmFuc3BvcnRGYWN0b3J5KCkgeworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IGdldE91dHB1dFRyYW5zcG9ydEZhY3RvcnkoKSB7CiAgICAgcmV0dXJuIG91dHB1dFRyYW5zcG9ydEZhY3RvcnlfOwogICB9CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gZ2V0SW5wdXRQcm90b2NvbEZhY3RvcnkoKSB7IHJldHVybiBpbnB1dFByb3RvY29sRmFjdG9yeV87IH0KKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IGdldElucHV0UHJvdG9jb2xGYWN0b3J5KCkgeyByZXR1cm4gaW5wdXRQcm90b2NvbEZhY3RvcnlfOyB9CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gZ2V0T3V0cHV0UHJvdG9jb2xGYWN0b3J5KCkgeyByZXR1cm4gb3V0cHV0UHJvdG9jb2xGYWN0b3J5XzsgfQorICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gZ2V0T3V0cHV0UHJvdG9jb2xGYWN0b3J5KCkgeyByZXR1cm4gb3V0cHV0UHJvdG9jb2xGYWN0b3J5XzsgfQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJFdmVudEhhbmRsZXI+IGdldEV2ZW50SGFuZGxlcigpIHsgcmV0dXJuIGV2ZW50SGFuZGxlcl87IH0KKyAgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJFdmVudEhhbmRsZXI+IGdldEV2ZW50SGFuZGxlcigpIHsgcmV0dXJuIGV2ZW50SGFuZGxlcl87IH0KIAogcHJvdGVjdGVkOgotICBUU2VydmVyKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSkKKyAgVFNlcnZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5KQogICAgIDogcHJvY2Vzc29yRmFjdG9yeV8ocHJvY2Vzc29yRmFjdG9yeSkgewotICAgIHNldElucHV0VHJhbnNwb3J0RmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRUcmFuc3BvcnRGYWN0b3J5KCkpKTsKLSAgICBzZXRPdXRwdXRUcmFuc3BvcnRGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSkpOwotICAgIHNldElucHV0UHJvdG9jb2xGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpKTsKLSAgICBzZXRPdXRwdXRQcm90b2NvbEZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4obmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkpOworICAgIHNldElucHV0VHJhbnNwb3J0RmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpKSk7CisgICAgc2V0T3V0cHV0VHJhbnNwb3J0RmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpKSk7CisgICAgc2V0SW5wdXRQcm90b2NvbEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpKTsKKyAgICBzZXRPdXRwdXRQcm90b2NvbEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpKTsKICAgfQogCi0gIFRTZXJ2ZXIoY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvcikKKyAgVFNlcnZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvcikKICAgICA6IHByb2Nlc3NvckZhY3RvcnlfKG5ldyBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpKSB7Ci0gICAgc2V0SW5wdXRUcmFuc3BvcnRGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSkpOwotICAgIHNldE91dHB1dFRyYW5zcG9ydEZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpKSk7Ci0gICAgc2V0SW5wdXRQcm90b2NvbEZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4obmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkpOwotICAgIHNldE91dHB1dFByb3RvY29sRmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PihuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKSk7CisgICAgc2V0SW5wdXRUcmFuc3BvcnRGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRUcmFuc3BvcnRGYWN0b3J5KCkpKTsKKyAgICBzZXRPdXRwdXRUcmFuc3BvcnRGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRUcmFuc3BvcnRGYWN0b3J5KCkpKTsKKyAgICBzZXRJbnB1dFByb3RvY29sRmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4obmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkpOworICAgIHNldE91dHB1dFByb3RvY29sRmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4obmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkpOwogICB9CiAKLSAgVFNlcnZlcihjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCi0gICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCkKKyAgVFNlcnZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0KQogICAgIDogcHJvY2Vzc29yRmFjdG9yeV8ocHJvY2Vzc29yRmFjdG9yeSksIHNlcnZlclRyYW5zcG9ydF8oc2VydmVyVHJhbnNwb3J0KSB7Ci0gICAgc2V0SW5wdXRUcmFuc3BvcnRGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSkpOwotICAgIHNldE91dHB1dFRyYW5zcG9ydEZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpKSk7Ci0gICAgc2V0SW5wdXRQcm90b2NvbEZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4obmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkpOwotICAgIHNldE91dHB1dFByb3RvY29sRmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PihuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKSk7CisgICAgc2V0SW5wdXRUcmFuc3BvcnRGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRUcmFuc3BvcnRGYWN0b3J5KCkpKTsKKyAgICBzZXRPdXRwdXRUcmFuc3BvcnRGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRUcmFuc3BvcnRGYWN0b3J5KCkpKTsKKyAgICBzZXRJbnB1dFByb3RvY29sRmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4obmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkpOworICAgIHNldE91dHB1dFByb3RvY29sRmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4obmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkpOwogICB9CiAKLSAgVFNlcnZlcihjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAotICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQpCisgIFRTZXJ2ZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQpCiAgICAgOiBwcm9jZXNzb3JGYWN0b3J5XyhuZXcgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSksCiAgICAgICBzZXJ2ZXJUcmFuc3BvcnRfKHNlcnZlclRyYW5zcG9ydCkgewotICAgIHNldElucHV0VHJhbnNwb3J0RmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRUcmFuc3BvcnRGYWN0b3J5KCkpKTsKLSAgICBzZXRPdXRwdXRUcmFuc3BvcnRGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSkpOwotICAgIHNldElucHV0UHJvdG9jb2xGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpKTsKLSAgICBzZXRPdXRwdXRQcm90b2NvbEZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4obmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkpOworICAgIHNldElucHV0VHJhbnNwb3J0RmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpKSk7CisgICAgc2V0T3V0cHV0VHJhbnNwb3J0RmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpKSk7CisgICAgc2V0SW5wdXRQcm90b2NvbEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpKTsKKyAgICBzZXRPdXRwdXRQcm90b2NvbEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpKTsKICAgfQogCi0gIFRTZXJ2ZXIoY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAotICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpCisgIFRTZXJ2ZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5KQogICAgIDogcHJvY2Vzc29yRmFjdG9yeV8ocHJvY2Vzc29yRmFjdG9yeSksCiAgICAgICBzZXJ2ZXJUcmFuc3BvcnRfKHNlcnZlclRyYW5zcG9ydCksCiAgICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfKHRyYW5zcG9ydEZhY3RvcnkpLApAQCAtMTcwLDEwICsxNzAsMTAgQEAKICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5Xyhwcm90b2NvbEZhY3RvcnkpLAogICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5Xyhwcm90b2NvbEZhY3RvcnkpIHt9CiAKLSAgVFNlcnZlcihjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAotICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpCisgIFRTZXJ2ZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSkKICAgICA6IHByb2Nlc3NvckZhY3RvcnlfKG5ldyBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpKSwKICAgICAgIHNlcnZlclRyYW5zcG9ydF8oc2VydmVyVHJhbnNwb3J0KSwKICAgICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeV8odHJhbnNwb3J0RmFjdG9yeSksCkBAIC0xODEsMTIgKzE4MSwxMiBAQAogICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnlfKHByb3RvY29sRmFjdG9yeSksCiAgICAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnlfKHByb3RvY29sRmFjdG9yeSkge30KIAotICBUU2VydmVyKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKLSAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSkKKyAgVFNlcnZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnkpCiAgICAgOiBwcm9jZXNzb3JGYWN0b3J5Xyhwcm9jZXNzb3JGYWN0b3J5KSwKICAgICAgIHNlcnZlclRyYW5zcG9ydF8oc2VydmVyVHJhbnNwb3J0KSwKICAgICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeV8oaW5wdXRUcmFuc3BvcnRGYWN0b3J5KSwKQEAgLTE5NCwxMiArMTk0LDEyIEBACiAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeV8oaW5wdXRQcm90b2NvbEZhY3RvcnkpLAogICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5XyhvdXRwdXRQcm90b2NvbEZhY3RvcnkpIHt9CiAKLSAgVFNlcnZlcihjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAotICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KQorICBUU2VydmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnkpCiAgICAgOiBwcm9jZXNzb3JGYWN0b3J5XyhuZXcgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSksCiAgICAgICBzZXJ2ZXJUcmFuc3BvcnRfKHNlcnZlclRyYW5zcG9ydCksCiAgICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfKGlucHV0VHJhbnNwb3J0RmFjdG9yeSksCkBAIC0yMTQsOSArMjE0LDkgQEAKICAgICogY2FsbCkuICBUaGlzIGFsbG93cyB0aGUgVFByb2Nlc3NvckZhY3RvcnkgdG8gcmV0dXJuIGEgZGlmZmVyZW50IHByb2Nlc3NvcgogICAgKiBmb3IgZWFjaCBjb25uZWN0aW9uIGlmIGl0IGRlc2lyZXMuCiAgICAqLwotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBnZXRQcm9jZXNzb3IoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dFByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXRQcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCkgeworICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gZ2V0UHJvY2Vzc29yKHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0UHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXRQcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQpIHsKICAgICBUQ29ubmVjdGlvbkluZm8gY29ubkluZm87CiAgICAgY29ubkluZm8uaW5wdXQgPSBpbnB1dFByb3RvY29sOwogICAgIGNvbm5JbmZvLm91dHB1dCA9IG91dHB1dFByb3RvY29sOwpAQCAtMjI1LDM1ICsyMjUsMzUgQEAKICAgfQogCiAgIC8vIENsYXNzIHZhcmlhYmxlcwotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4gcHJvY2Vzc29yRmFjdG9yeV87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+IHNlcnZlclRyYW5zcG9ydF87CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4gcHJvY2Vzc29yRmFjdG9yeV87CisgIHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiBzZXJ2ZXJUcmFuc3BvcnRfOwogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfOwotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV87CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gaW5wdXRUcmFuc3BvcnRGYWN0b3J5XzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5XzsKIAotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBpbnB1dFByb3RvY29sRmFjdG9yeV87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IG91dHB1dFByb3RvY29sRmFjdG9yeV87CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBpbnB1dFByb3RvY29sRmFjdG9yeV87CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBvdXRwdXRQcm90b2NvbEZhY3RvcnlfOwogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJFdmVudEhhbmRsZXI+IGV2ZW50SGFuZGxlcl87CisgIHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyRXZlbnRIYW5kbGVyPiBldmVudEhhbmRsZXJfOwogCiBwdWJsaWM6Ci0gIHZvaWQgc2V0SW5wdXRUcmFuc3BvcnRGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiBpbnB1dFRyYW5zcG9ydEZhY3RvcnkpIHsKKyAgdm9pZCBzZXRJbnB1dFRyYW5zcG9ydEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiBpbnB1dFRyYW5zcG9ydEZhY3RvcnkpIHsKICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5OwogICB9CiAKLSAgdm9pZCBzZXRPdXRwdXRUcmFuc3BvcnRGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5KSB7CisgIHZvaWQgc2V0T3V0cHV0VHJhbnNwb3J0RmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IG91dHB1dFRyYW5zcG9ydEZhY3RvcnkpIHsKICAgICBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5XyA9IG91dHB1dFRyYW5zcG9ydEZhY3Rvcnk7CiAgIH0KIAotICB2b2lkIHNldElucHV0UHJvdG9jb2xGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IGlucHV0UHJvdG9jb2xGYWN0b3J5KSB7CisgIHZvaWQgc2V0SW5wdXRQcm90b2NvbEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IGlucHV0UHJvdG9jb2xGYWN0b3J5KSB7CiAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnlfID0gaW5wdXRQcm90b2NvbEZhY3Rvcnk7CiAgIH0KIAotICB2b2lkIHNldE91dHB1dFByb3RvY29sRmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBvdXRwdXRQcm90b2NvbEZhY3RvcnkpIHsKKyAgdm9pZCBzZXRPdXRwdXRQcm90b2NvbEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IG91dHB1dFByb3RvY29sRmFjdG9yeSkgewogICAgIG91dHB1dFByb3RvY29sRmFjdG9yeV8gPSBvdXRwdXRQcm90b2NvbEZhY3Rvcnk7CiAgIH0KIAotICB2b2lkIHNldFNlcnZlckV2ZW50SGFuZGxlcihib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyRXZlbnRIYW5kbGVyPiBldmVudEhhbmRsZXIpIHsKKyAgdm9pZCBzZXRTZXJ2ZXJFdmVudEhhbmRsZXIoc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJFdmVudEhhbmRsZXI+IGV2ZW50SGFuZGxlcikgewogICAgIGV2ZW50SGFuZGxlcl8gPSBldmVudEhhbmRsZXI7CiAgIH0KIH07CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTZXJ2ZXJGcmFtZXdvcmsuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UU2VydmVyRnJhbWV3b3JrLmNwcAppbmRleCBlODQzOTIxLi5jYmVhYTI0IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTZXJ2ZXJGcmFtZXdvcmsuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNlcnZlckZyYW1ld29yay5jcHAKQEAgLTE3LDcgKzE3LDcgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDxib29zdC9iaW5kLmhwcD4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CiAjaW5jbHVkZSA8c3RkZXhjZXB0PgogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFNlcnZlckZyYW1ld29yay5oPgpAQCAtMjcsMTQgKzI3LDE0IEBACiBuYW1lc3BhY2Ugc2VydmVyIHsKIAogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpTeW5jaHJvbml6ZWQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeTsKK3VzaW5nIHN0ZDo6YmluZDsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0OwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5OwotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w7Ci11c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk7Ci11c2luZyBib29zdDo6YmluZDsKLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwogdXNpbmcgc3RkOjpzdHJpbmc7CiAKIFRTZXJ2ZXJGcmFtZXdvcms6OlRTZXJ2ZXJGcmFtZXdvcmsoY29uc3Qgc2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCkBAIC0xNDcsOCArMTQ3LDEzIEBACiAKICAgICAgIGlucHV0VHJhbnNwb3J0ID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5Xy0+Z2V0VHJhbnNwb3J0KGNsaWVudCk7CiAgICAgICBvdXRwdXRUcmFuc3BvcnQgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5Xy0+Z2V0VHJhbnNwb3J0KGNsaWVudCk7Ci0gICAgICBpbnB1dFByb3RvY29sID0gaW5wdXRQcm90b2NvbEZhY3RvcnlfLT5nZXRQcm90b2NvbChpbnB1dFRyYW5zcG9ydCk7Ci0gICAgICBvdXRwdXRQcm90b2NvbCA9IG91dHB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKG91dHB1dFRyYW5zcG9ydCk7CisgICAgICBpZiAoIW91dHB1dFByb3RvY29sRmFjdG9yeV8pIHsKKyAgICAgICAgaW5wdXRQcm90b2NvbCA9IGlucHV0UHJvdG9jb2xGYWN0b3J5Xy0+Z2V0UHJvdG9jb2woaW5wdXRUcmFuc3BvcnQsIG91dHB1dFRyYW5zcG9ydCk7CisgICAgICAgIG91dHB1dFByb3RvY29sID0gaW5wdXRQcm90b2NvbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlucHV0UHJvdG9jb2wgPSBpbnB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKGlucHV0VHJhbnNwb3J0KTsKKyAgICAgICAgb3V0cHV0UHJvdG9jb2wgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnlfLT5nZXRQcm90b2NvbChvdXRwdXRUcmFuc3BvcnQpOworICAgICAgfQogCiAgICAgICBuZXdseUNvbm5lY3RlZENsaWVudChzaGFyZWRfcHRyPFRDb25uZWN0ZWRDbGllbnQ+KAogICAgICAgICAgIG5ldyBUQ29ubmVjdGVkQ2xpZW50KGdldFByb2Nlc3NvcihpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCwgY2xpZW50KSwKQEAgLTE1Niw3ICsxNjEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50SGFuZGxlcl8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50KSwKLSAgICAgICAgICBiaW5kKCZUU2VydmVyRnJhbWV3b3JrOjpkaXNwb3NlQ29ubmVjdGVkQ2xpZW50LCB0aGlzLCBfMSkpKTsKKyAgICAgICAgICBiaW5kKCZUU2VydmVyRnJhbWV3b3JrOjpkaXNwb3NlQ29ubmVjdGVkQ2xpZW50LCB0aGlzLCBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpKSk7CiAKICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiB0dHgpIHsKICAgICAgIHJlbGVhc2VPbmVEZXNjcmlwdG9yKCJpbnB1dFRyYW5zcG9ydCIsIGlucHV0VHJhbnNwb3J0KTsKQEAgLTIwOSwzMCArMjE0LDMyIEBACiB9CiAKIHZvaWQgVFNlcnZlckZyYW1ld29yazo6c3RvcCgpIHsKLSAgc2VydmVyVHJhbnNwb3J0Xy0+aW50ZXJydXB0KCk7CisgIC8vIE9yZGVyIGlzIGltcG9ydGFudCBiZWNhdXNlIHNlcnZlKCkgcmVsZWFzZXMgc2VydmVyVHJhbnNwb3J0XyB3aGVuIGl0IGlzCisgIC8vIGludGVycnVwdGVkLCB3aGljaCBjbG9zZXMgdGhlIHNvY2tldCB0aGF0IGludGVycnVwdENoaWxkcmVuIHVzZXMuCiAgIHNlcnZlclRyYW5zcG9ydF8tPmludGVycnVwdENoaWxkcmVuKCk7CisgIHNlcnZlclRyYW5zcG9ydF8tPmludGVycnVwdCgpOwogfQogCi12b2lkIFRTZXJ2ZXJGcmFtZXdvcms6Om5ld2x5Q29ubmVjdGVkQ2xpZW50KGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRDb25uZWN0ZWRDbGllbnQ+JiBwQ2xpZW50KSB7Ci0gIG9uQ2xpZW50Q29ubmVjdGVkKHBDbGllbnQpOwordm9pZCBUU2VydmVyRnJhbWV3b3JrOjpuZXdseUNvbm5lY3RlZENsaWVudChjb25zdCBzaGFyZWRfcHRyPFRDb25uZWN0ZWRDbGllbnQ+JiBwQ2xpZW50KSB7CisgIHsKKyAgICBTeW5jaHJvbml6ZWQgc3luYyhtb25fKTsKKyAgICArK2NsaWVudHNfOworICAgIGh3bV8gPSAoc3RkOjptYXgpKGh3bV8sIGNsaWVudHNfKTsKKyAgfQogCi0gIC8vIENvdW50IGEgY29uY3VycmVudCBjbGllbnQgYWRkZWQuCi0gIFN5bmNocm9uaXplZCBzeW5jKG1vbl8pOwotICArK2NsaWVudHNfOwotICBod21fID0gc3RkOjptYXgoaHdtXywgY2xpZW50c18pOworICBvbkNsaWVudENvbm5lY3RlZChwQ2xpZW50KTsKIH0KIAogdm9pZCBUU2VydmVyRnJhbWV3b3JrOjpkaXNwb3NlQ29ubmVjdGVkQ2xpZW50KFRDb25uZWN0ZWRDbGllbnQqIHBDbGllbnQpIHsKLSAgewotICAgIC8vIENvdW50IGEgY29uY3VycmVudCBjbGllbnQgcmVtb3ZlZC4KLSAgICBTeW5jaHJvbml6ZWQgc3luYyhtb25fKTsKLSAgICBpZiAobGltaXRfIC0gLS1jbGllbnRzXyA+IDApIHsKLSAgICAgIG1vbl8ubm90aWZ5KCk7Ci0gICAgfQotICB9CiAgIG9uQ2xpZW50RGlzY29ubmVjdGVkKHBDbGllbnQpOwogICBkZWxldGUgcENsaWVudDsKKworICBTeW5jaHJvbml6ZWQgc3luYyhtb25fKTsKKyAgaWYgKGxpbWl0XyAtIC0tY2xpZW50c18gPiAwKSB7CisgICAgbW9uXy5ub3RpZnkoKTsKKyAgfQogfQorCiB9CiB9CiB9IC8vIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXIKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNlcnZlckZyYW1ld29yay5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UU2VydmVyRnJhbWV3b3JrLmgKaW5kZXggYTIyNjg4YS4uZWFhY2NlNSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UU2VydmVyRnJhbWV3b3JrLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UU2VydmVyRnJhbWV3b3JrLmgKQEAgLTIwLDcgKzIwLDcgQEAKICNpZm5kZWYgX1RIUklGVF9TRVJWRVJfVFNFUlZFUkZSQU1FV09SS19IXwogI2RlZmluZSBfVEhSSUZUX1NFUlZFUl9UU0VSVkVSRlJBTUVXT1JLX0hfIDEKIAotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDx0aHJpZnQvVFByb2Nlc3Nvci5oPgogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+CkBAIC00OCwzMiArNDgsMzIgQEAKIGNsYXNzIFRTZXJ2ZXJGcmFtZXdvcmsgOiBwdWJsaWMgVFNlcnZlciB7CiBwdWJsaWM6CiAgIFRTZXJ2ZXJGcmFtZXdvcmsoCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSk7CisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpOwogCiAgIFRTZXJ2ZXJGcmFtZXdvcmsoCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpOworICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSk7CiAKICAgVFNlcnZlckZyYW1ld29yaygKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSk7CisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnkpOwogCiAgIFRTZXJ2ZXJGcmFtZXdvcmsoCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KTsKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnkpOwogCiAgIHZpcnR1YWwgflRTZXJ2ZXJGcmFtZXdvcmsoKTsKIApAQCAtMTIzLDIwICsxMjMsMjEgQEAKIAogcHJvdGVjdGVkOgogICAvKioKLSAgICogQSBjbGllbnQgaGFzIGNvbm5lY3RlZC4gIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyByZXNwb25zaWJsZSBmb3Igc3RvcmluZwotICAgKiBhbmQgcHJvY2Vzc2luZyB0aGUgY2xpZW50LiAgVGhpcyBpcyBjYWxsZWQgZHVyaW5nIHRoZSBzZXJ2ZSgpIHRocmVhZCwKKyAgICogQSBjbGllbnQgaGFzIGNvbm5lY3RlZC4gIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgdGhlCisgICAqIGxpZmV0aW1lIG9mIHRoZSBjbGllbnQgb2JqZWN0LiAgVGhpcyBpcyBjYWxsZWQgZHVyaW5nIHRoZSBzZXJ2ZSgpIHRocmVhZCwKICAgICogdGhlcmVmb3JlIGEgZmFpbHVyZSB0byByZXR1cm4gcXVpY2tseSB3aWxsIHJlc3VsdCBpbiBuZXcgY2xpZW50IGNvbm5lY3Rpb24KICAgICogZGVsYXlzLgogICAgKgogICAgKiBccGFyYW1baW5dICBwQ2xpZW50ICB0aGUgbmV3bHkgY29ubmVjdGVkIGNsaWVudAogICAgKi8KLSAgdmlydHVhbCB2b2lkIG9uQ2xpZW50Q29ubmVjdGVkKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRDb25uZWN0ZWRDbGllbnQ+JiBwQ2xpZW50KSA9IDA7CisgIHZpcnR1YWwgdm9pZCBvbkNsaWVudENvbm5lY3RlZChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VENvbm5lY3RlZENsaWVudD4mIHBDbGllbnQpID0gMDsKIAogICAvKioKICAgICogQSBjbGllbnQgaGFzIGRpc2Nvbm5lY3RlZC4KLSAgICogVGhlIHNlcnZlciBubyBsb25nZXIgdHJhY2tzIHRoZSBjbGllbnQuCi0gICAqIFRoZSBjbGllbnQgVFRyYW5zcG9ydCBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZC4KLSAgICogVGhlIGltcGxlbWVudGF0aW9uIG11c3Qgbm90IGRlbGV0ZSB0aGUgcG9pbnRlci4KKyAgICogV2hlbiBjYWxsZWQ6CisgICAqICAgVGhlIHNlcnZlciBubyBsb25nZXIgdHJhY2tzIHRoZSBjbGllbnQuCisgICAqICAgVGhlIGNsaWVudCBUVHJhbnNwb3J0IGhhcyBhbHJlYWR5IGJlZW4gY2xvc2VkLgorICAgKiAgIFRoZSBpbXBsZW1lbnRhdGlvbiBtdXN0IG5vdCBkZWxldGUgdGhlIHBvaW50ZXIuCiAgICAqCiAgICAqIFxwYXJhbVtpbl0gIHBDbGllbnQgIHRoZSBkaXNjb25uZWN0ZWQgY2xpZW50CiAgICAqLwpAQCAtMTQ4LDcgKzE0OSw3IEBACiAgICAqIGNsaWVudCByYXRlIGxpbWl0aW5nIGFmdGVyIG9uQ2xpZW50Q29ubmVjdGVkIHJldHVybnMgYnkgYmxvY2tpbmcgdGhlCiAgICAqIHNlcnZlKCkgdGhyZWFkIGlmIHRoZSBsaW1pdCBoYXMgYmVlbiByZWFjaGVkLgogICAgKi8KLSAgdm9pZCBuZXdseUNvbm5lY3RlZENsaWVudChjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUQ29ubmVjdGVkQ2xpZW50PiYgcENsaWVudCk7CisgIHZvaWQgbmV3bHlDb25uZWN0ZWRDbGllbnQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRDb25uZWN0ZWRDbGllbnQ+JiBwQ2xpZW50KTsKIAogICAvKioKICAgICogU21hcnQgcG9pbnRlciBjbGllbnQgZGVsZXRpb24uCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmNwcAppbmRleCAyZjY5ZmY0Li43MTYyMzRkIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5jcHAKQEAgLTI5LDcgKzI5LDcgQEAKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk7Ci11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKIHVzaW5nIHN0ZDo6c3RyaW5nOwogCiBUU2ltcGxlU2VydmVyOjpUU2ltcGxlU2VydmVyKGNvbnN0IHNoYXJlZF9wdHI8VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmggYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuaAppbmRleCAzOTFmYmVjLi40NTQ5MjI1IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuaApAQCAtMzQsMzcgKzM0LDM3IEBACiBjbGFzcyBUU2ltcGxlU2VydmVyIDogcHVibGljIFRTZXJ2ZXJGcmFtZXdvcmsgewogcHVibGljOgogICBUU2ltcGxlU2VydmVyKAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpOworICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5KTsKIAogICBUU2ltcGxlU2VydmVyKAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5KTsKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpOwogCiAgIFRTaW1wbGVTZXJ2ZXIoCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnkpOworICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KTsKIAogICBUU2ltcGxlU2VydmVyKAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSk7CisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KTsKIAogICB2aXJ0dWFsIH5UU2ltcGxlU2VydmVyKCk7CiAKIHByb3RlY3RlZDoKLSAgdmlydHVhbCB2b2lkIG9uQ2xpZW50Q29ubmVjdGVkKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRDb25uZWN0ZWRDbGllbnQ+JiBwQ2xpZW50KSAvKiBvdmVycmlkZSAqLzsKKyAgdmlydHVhbCB2b2lkIG9uQ2xpZW50Q29ubmVjdGVkKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUQ29ubmVjdGVkQ2xpZW50PiYgcENsaWVudCkgLyogb3ZlcnJpZGUgKi87CiAgIHZpcnR1YWwgdm9pZCBvbkNsaWVudERpc2Nvbm5lY3RlZChUQ29ubmVjdGVkQ2xpZW50KiBwQ2xpZW50KSAvKiBvdmVycmlkZSAqLzsKIAogcHJpdmF0ZToKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5jcHAKaW5kZXggZWZkN2MyMy4uZWUzNDVhOSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5jcHAKQEAgLTMwLDcgKzMwLDcgQEAKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk7Ci11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKIHVzaW5nIHN0ZDo6c3RyaW5nOwogCiBUVGhyZWFkUG9vbFNlcnZlcjo6VFRocmVhZFBvb2xTZXJ2ZXIoY29uc3Qgc2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCkBAIC02OSw3ICs2OSw2IEBACiAgICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwKICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeSksCiAgICAgdGhyZWFkTWFuYWdlcl8odGhyZWFkTWFuYWdlciksCi0gICAgc3RvcF8oZmFsc2UpLAogICAgIHRpbWVvdXRfKDApLAogICAgIHRhc2tFeHBpcmF0aW9uXygwKSB7CiB9CkBAIC04OCw3ICs4Nyw2IEBACiAgICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwKICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeSksCiAgICAgdGhyZWFkTWFuYWdlcl8odGhyZWFkTWFuYWdlciksCi0gICAgc3RvcF8oZmFsc2UpLAogICAgIHRpbWVvdXRfKDApLAogICAgIHRhc2tFeHBpcmF0aW9uXygwKSB7CiB9CkBAIC05OCw3ICs5Niw3IEBACiAKIHZvaWQgVFRocmVhZFBvb2xTZXJ2ZXI6OnNlcnZlKCkgewogICBUU2VydmVyRnJhbWV3b3JrOjpzZXJ2ZSgpOwotICB0aHJlYWRNYW5hZ2VyXy0+am9pbigpOworICB0aHJlYWRNYW5hZ2VyXy0+c3RvcCgpOwogfQogCiBpbnQ2NF90IFRUaHJlYWRQb29sU2VydmVyOjpnZXRUaW1lb3V0KCkgY29uc3QgewpAQCAtMTE3LDE3ICsxMTUsMTggQEAKICAgdGFza0V4cGlyYXRpb25fID0gdmFsdWU7CiB9CiAKLWJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkTWFuYWdlcj4gVFRocmVhZFBvb2xTZXJ2ZXI6OmdldFRocmVhZE1hbmFnZXIoKQotICAgIGNvbnN0IHsKK3N0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZE1hbmFnZXI+CitUVGhyZWFkUG9vbFNlcnZlcjo6Z2V0VGhyZWFkTWFuYWdlcigpIGNvbnN0IHsKICAgcmV0dXJuIHRocmVhZE1hbmFnZXJfOwogfQogCiB2b2lkIFRUaHJlYWRQb29sU2VydmVyOjpvbkNsaWVudENvbm5lY3RlZChjb25zdCBzaGFyZWRfcHRyPFRDb25uZWN0ZWRDbGllbnQ+JiBwQ2xpZW50KSB7Ci0gIHRocmVhZE1hbmFnZXJfLT5hZGQocENsaWVudCwgdGltZW91dF8sIHRhc2tFeHBpcmF0aW9uXyk7CisgIHRocmVhZE1hbmFnZXJfLT5hZGQocENsaWVudCwgZ2V0VGltZW91dCgpLCBnZXRUYXNrRXhwaXJhdGlvbigpKTsKIH0KIAogdm9pZCBUVGhyZWFkUG9vbFNlcnZlcjo6b25DbGllbnREaXNjb25uZWN0ZWQoVENvbm5lY3RlZENsaWVudCopIHsKIH0KKwogfQogfQogfSAvLyBhcGFjaGU6OnRocmlmdDo6c2VydmVyCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmggYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmgKaW5kZXggMTg5ZDdlOS4uMTIxOTk4YyAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuaApAQCAtMjAsNiArMjAsNyBAQAogI2lmbmRlZiBfVEhSSUZUX1NFUlZFUl9UVEhSRUFEUE9PTFNFUlZFUl9IXwogI2RlZmluZSBfVEhSSUZUX1NFUlZFUl9UVEhSRUFEUE9PTFNFUlZFUl9IXyAxCiAKKyNpbmNsdWRlIDxhdG9taWM+CiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuaD4KICNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RTZXJ2ZXJGcmFtZXdvcmsuaD4KIApAQCAtMzMsMzkgKzM0LDM5IEBACiBjbGFzcyBUVGhyZWFkUG9vbFNlcnZlciA6IHB1YmxpYyBUU2VydmVyRnJhbWV3b3JrIHsKIHB1YmxpYzoKICAgVFRocmVhZFBvb2xTZXJ2ZXIoCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkTWFuYWdlcj4mIHRocmVhZE1hbmFnZXIKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZE1hbmFnZXI+JiB0aHJlYWRNYW5hZ2VyCiAgICAgICA9IGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcigpKTsKIAogICBUVGhyZWFkUG9vbFNlcnZlcigKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkTWFuYWdlcj4mIHRocmVhZE1hbmFnZXIKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRNYW5hZ2VyPiYgdGhyZWFkTWFuYWdlcgogICAgICAgPSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIoKSk7CiAKICAgVFRocmVhZFBvb2xTZXJ2ZXIoCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZE1hbmFnZXI+JiB0aHJlYWRNYW5hZ2VyCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRNYW5hZ2VyPiYgdGhyZWFkTWFuYWdlcgogICAgICAgPSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIoKSk7CiAKICAgVFRocmVhZFBvb2xTZXJ2ZXIoCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRNYW5hZ2VyPiYgdGhyZWFkTWFuYWdlcgorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZE1hbmFnZXI+JiB0aHJlYWRNYW5hZ2VyCiAgICAgICA9IGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcigpKTsKIAogICB2aXJ0dWFsIH5UVGhyZWFkUG9vbFNlcnZlcigpOwpAQCAtODIsMjAgKzgzLDE3IEBACiAgIHZpcnR1YWwgaW50NjRfdCBnZXRUYXNrRXhwaXJhdGlvbigpIGNvbnN0OwogICB2aXJ0dWFsIHZvaWQgc2V0VGFza0V4cGlyYXRpb24oaW50NjRfdCB2YWx1ZSk7CiAKLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZE1hbmFnZXI+IGdldFRocmVhZE1hbmFnZXIoKSBjb25zdDsKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRNYW5hZ2VyPiBnZXRUaHJlYWRNYW5hZ2VyKCkgY29uc3Q7CiAKIHByb3RlY3RlZDoKLSAgdmlydHVhbCB2b2lkIG9uQ2xpZW50Q29ubmVjdGVkKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRDb25uZWN0ZWRDbGllbnQ+JiBwQ2xpZW50KSAvKiBvdmVycmlkZSAqLzsKKyAgdmlydHVhbCB2b2lkIG9uQ2xpZW50Q29ubmVjdGVkKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUQ29ubmVjdGVkQ2xpZW50PiYgcENsaWVudCkgLyogb3ZlcnJpZGUgKi87CiAgIHZpcnR1YWwgdm9pZCBvbkNsaWVudERpc2Nvbm5lY3RlZChUQ29ubmVjdGVkQ2xpZW50KiBwQ2xpZW50KSAvKiBvdmVycmlkZSAqLzsKIAotICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXJfOwotCi0gIHZvbGF0aWxlIGJvb2wgc3RvcF87Ci0KLSAgdm9sYXRpbGUgaW50NjRfdCB0aW1lb3V0XzsKLQotICB2b2xhdGlsZSBpbnQ2NF90IHRhc2tFeHBpcmF0aW9uXzsKKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlcl87CisgIHN0ZDo6YXRvbWljPGludDY0X3Q+IHRpbWVvdXRfOworICBzdGQ6OmF0b21pYzxpbnQ2NF90PiB0YXNrRXhwaXJhdGlvbl87CiB9OworCiB9CiB9CiB9IC8vIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXIKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmNwcAppbmRleCA5MmY1Y2Y4Li4yMjY0ZGY3IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuY3BwCkBAIC0xNyw2ICsxNyw4IEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvUGxhdGZvcm1UaHJlYWRGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuaD4KIApAQCAtMjQsMTcgKzI2LDE4IEBACiBuYW1lc3BhY2UgdGhyaWZ0IHsKIG5hbWVzcGFjZSBzZXJ2ZXIgewogCit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlJ1bm5hYmxlOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpTeW5jaHJvbml6ZWQ7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZDsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeTsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5OwordXNpbmcgc3RkOjptYWtlX3NoYXJlZDsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0OwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5OwotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Ci11c2luZyBzdGQ6OnN0cmluZzsKIAogVFRocmVhZGVkU2VydmVyOjpUVGhyZWFkZWRTZXJ2ZXIoY29uc3Qgc2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCkBAIC05MiwyOSArOTUsNTkgQEAKIHZvaWQgVFRocmVhZGVkU2VydmVyOjpzZXJ2ZSgpIHsKICAgVFNlcnZlckZyYW1ld29yazo6c2VydmUoKTsKIAotICAvLyBEcmFpbiBhbGwgY2xpZW50cyAtIG5vIG1vcmUgd2lsbCBhcnJpdmUKLSAgdHJ5IHsKLSAgICBTeW5jaHJvbml6ZWQgcyhjbGllbnRzTW9uaXRvcl8pOwotICAgIHdoaWxlIChnZXRDb25jdXJyZW50Q2xpZW50Q291bnQoKSA+IDApIHsKLSAgICAgIGNsaWVudHNNb25pdG9yXy53YWl0KCk7Ci0gICAgfQotICB9IGNhdGNoIChURXhjZXB0aW9uJiB0eCkgewotICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRUaHJlYWRlZFNlcnZlcjogRXhjZXB0aW9uIGpvaW5pbmcgd29ya2VyczogIikgKyB0eC53aGF0KCk7Ci0gICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKKyAgLy8gRW5zdXJlIHBvc3QtY29uZGl0aW9uIG9mIG5vIGFjdGl2ZSBjbGllbnRzCisgIFN5bmNocm9uaXplZCBzKGNsaWVudE1vbml0b3JfKTsKKyAgd2hpbGUgKCFhY3RpdmVDbGllbnRNYXBfLmVtcHR5KCkpIHsKKyAgICBjbGllbnRNb25pdG9yXy53YWl0KCk7CisgIH0KKworICBkcmFpbkRlYWRDbGllbnRzKCk7Cit9CisKK3ZvaWQgVFRocmVhZGVkU2VydmVyOjpkcmFpbkRlYWRDbGllbnRzKCkgeworICAvLyB3ZSdyZSBpbiBhIG1vbml0b3IgaGVyZQorICB3aGlsZSAoIWRlYWRDbGllbnRNYXBfLmVtcHR5KCkpIHsKKyAgICBDbGllbnRNYXA6Oml0ZXJhdG9yIGl0ID0gZGVhZENsaWVudE1hcF8uYmVnaW4oKTsKKyAgICBpdC0+c2Vjb25kLT5qb2luKCk7CisgICAgZGVhZENsaWVudE1hcF8uZXJhc2UoaXQpOwogICB9CiB9CiAKIHZvaWQgVFRocmVhZGVkU2VydmVyOjpvbkNsaWVudENvbm5lY3RlZChjb25zdCBzaGFyZWRfcHRyPFRDb25uZWN0ZWRDbGllbnQ+JiBwQ2xpZW50KSB7Ci0gIHRocmVhZEZhY3RvcnlfLT5uZXdUaHJlYWQocENsaWVudCktPnN0YXJ0KCk7CisgIFN5bmNocm9uaXplZCBzeW5jKGNsaWVudE1vbml0b3JfKTsKKyAgc2hhcmVkX3B0cjxUQ29ubmVjdGVkQ2xpZW50UnVubmVyPiBwUnVubmFibGUgPSBtYWtlX3NoYXJlZDxUQ29ubmVjdGVkQ2xpZW50UnVubmVyPihwQ2xpZW50KTsKKyAgc2hhcmVkX3B0cjxUaHJlYWQ+IHBUaHJlYWQgPSB0aHJlYWRGYWN0b3J5Xy0+bmV3VGhyZWFkKHBSdW5uYWJsZSk7CisgIHBSdW5uYWJsZS0+dGhyZWFkKHBUaHJlYWQpOworICBhY3RpdmVDbGllbnRNYXBfLmluc2VydChDbGllbnRNYXA6OnZhbHVlX3R5cGUocENsaWVudC5nZXQoKSwgcFRocmVhZCkpOworICBwVGhyZWFkLT5zdGFydCgpOwogfQogCiB2b2lkIFRUaHJlYWRlZFNlcnZlcjo6b25DbGllbnREaXNjb25uZWN0ZWQoVENvbm5lY3RlZENsaWVudCogcENsaWVudCkgewotICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKHBDbGllbnQpOwotICBTeW5jaHJvbml6ZWQgcyhjbGllbnRzTW9uaXRvcl8pOwotICBpZiAoZ2V0Q29uY3VycmVudENsaWVudENvdW50KCkgPT0gMCkgewotICAgIGNsaWVudHNNb25pdG9yXy5ub3RpZnkoKTsKKyAgU3luY2hyb25pemVkIHN5bmMoY2xpZW50TW9uaXRvcl8pOworICBkcmFpbkRlYWRDbGllbnRzKCk7IC8vIHVzZSB0aGUgb3V0Z29pbmcgdGhyZWFkIHRvIGRvIHNvbWUgbWFpbnRlbmFuY2Ugb24gb3VyIGRlYWQgY2xpZW50IGJhY2tsb2cKKyAgQ2xpZW50TWFwOjppdGVyYXRvciBpdCA9IGFjdGl2ZUNsaWVudE1hcF8uZmluZChwQ2xpZW50KTsKKyAgaWYgKGl0ICE9IGFjdGl2ZUNsaWVudE1hcF8uZW5kKCkpIHsKKyAgICBDbGllbnRNYXA6Oml0ZXJhdG9yIGVuZCA9IGl0OworICAgIGRlYWRDbGllbnRNYXBfLmluc2VydChpdCwgKytlbmQpOworICAgIGFjdGl2ZUNsaWVudE1hcF8uZXJhc2UoaXQpOworICB9CisgIGlmIChhY3RpdmVDbGllbnRNYXBfLmVtcHR5KCkpIHsKKyAgICBjbGllbnRNb25pdG9yXy5ub3RpZnkoKTsKICAgfQogfQorCitUVGhyZWFkZWRTZXJ2ZXI6OlRDb25uZWN0ZWRDbGllbnRSdW5uZXI6OlRDb25uZWN0ZWRDbGllbnRSdW5uZXIoY29uc3Qgc2hhcmVkX3B0cjxUQ29ubmVjdGVkQ2xpZW50PiYgcENsaWVudCkKKyAgOiBwQ2xpZW50XyhwQ2xpZW50KSB7Cit9CisKK1RUaHJlYWRlZFNlcnZlcjo6VENvbm5lY3RlZENsaWVudFJ1bm5lcjo6flRDb25uZWN0ZWRDbGllbnRSdW5uZXIoKSB7Cit9CisKK3ZvaWQgVFRocmVhZGVkU2VydmVyOjpUQ29ubmVjdGVkQ2xpZW50UnVubmVyOjpydW4oKSAvKiBvdmVycmlkZSAqLyB7CisgIHBDbGllbnRfLT5ydW4oKTsgIC8vIFJ1biB0aGUgY2xpZW50CisgIHBDbGllbnRfLnJlc2V0KCk7IC8vIFRoZSBjbGllbnQgaXMgZG9uZSAtIHJlbGVhc2UgaXQgaGVyZSByYXRoZXIgdGhhbiBpbiB0aGUgZGVzdHJ1Y3RvciBmb3Igc2FmZXR5Cit9CisKIH0KIH0KIH0gLy8gYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmgKaW5kZXggY2RhY2ZkNy4uYzVjY2QwMyAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5oCkBAIC0yMCw2ICsyMCw3IEBACiAjaWZuZGVmIF9USFJJRlRfU0VSVkVSX1RUSFJFQURFRFNFUlZFUl9IXwogI2RlZmluZSBfVEhSSUZUX1NFUlZFUl9UVEhSRUFERURTRVJWRVJfSF8gMQogCisjaW5jbHVkZSA8bWFwPgogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1BsYXRmb3JtVGhyZWFkRmFjdG9yeS5oPgogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWQuaD4KQEAgLTMwLDQ5ICszMSw1MSBAQAogbmFtZXNwYWNlIHNlcnZlciB7CiAKIC8qKgotICogTWFuYWdlIGNsaWVudHMgdXNpbmcgYSB0aHJlYWQgcG9vbC4KKyAqIE1hbmFnZSBjbGllbnRzIHVzaW5nIHRocmVhZHMgLSB0aHJlYWRzIGFyZSBjcmVhdGVkIG9uZSBmb3IgZWFjaCBjbGllbnQgYW5kIGFyZQorICogcmVsZWFzZWQgd2hlbiB0aGUgY2xpZW50IGRpc2Nvbm5lY3RzLiAgVGhpcyBzZXJ2ZXIgaXMgdXNlZCB0byBtYWtlIGEgZHluYW1pY2FsbHkKKyAqIHNjYWxhYmxlIHNlcnZlciB1cCB0byB0aGUgY29uY3VycmVudCBjb25uZWN0aW9uIGxpbWl0LgogICovCiBjbGFzcyBUVGhyZWFkZWRTZXJ2ZXIgOiBwdWJsaWMgVFNlcnZlckZyYW1ld29yayB7CiBwdWJsaWM6CiAgIFRUaHJlYWRlZFNlcnZlcigKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5PiYgdGhyZWFkRmFjdG9yeQotICAgICAgPSBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk+KAotICAgICAgICAgIG5ldyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlBsYXRmb3JtVGhyZWFkRmFjdG9yeSkpOworICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeT4mIHRocmVhZEZhY3RvcnkKKyAgICAgID0gc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeT4oCisgICAgICAgICAgbmV3IGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UGxhdGZvcm1UaHJlYWRGYWN0b3J5KGZhbHNlKSkpOwogCiAgIFRUaHJlYWRlZFNlcnZlcigKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeT4mIHRocmVhZEZhY3RvcnkKLSAgICAgID0gYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5PigKLSAgICAgICAgICBuZXcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpQbGF0Zm9ybVRocmVhZEZhY3RvcnkpKTsKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5PiYgdGhyZWFkRmFjdG9yeQorICAgICAgPSBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5PigKKyAgICAgICAgICBuZXcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpQbGF0Zm9ybVRocmVhZEZhY3RvcnkoZmFsc2UpKSk7CiAKICAgVFRocmVhZGVkU2VydmVyKAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5PiYgdGhyZWFkRmFjdG9yeQotICAgICAgPSBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk+KAotICAgICAgICAgIG5ldyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlBsYXRmb3JtVGhyZWFkRmFjdG9yeSkpOworICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeT4mIHRocmVhZEZhY3RvcnkKKyAgICAgID0gc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeT4oCisgICAgICAgICAgbmV3IGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UGxhdGZvcm1UaHJlYWRGYWN0b3J5KGZhbHNlKSkpOwogCiAgIFRUaHJlYWRlZFNlcnZlcigKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk+JiB0aHJlYWRGYWN0b3J5Ci0gICAgICA9IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeT4oCi0gICAgICAgICAgbmV3IGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UGxhdGZvcm1UaHJlYWRGYWN0b3J5KSk7CisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeT4mIHRocmVhZEZhY3RvcnkKKyAgICAgID0gc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeT4oCisgICAgICAgICAgbmV3IGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UGxhdGZvcm1UaHJlYWRGYWN0b3J5KGZhbHNlKSkpOwogCiAgIHZpcnR1YWwgflRUaHJlYWRlZFNlcnZlcigpOwogCkBAIC04MywxMiArODYsNTYgQEAKICAgdmlydHVhbCB2b2lkIHNlcnZlKCk7CiAKIHByb3RlY3RlZDoKLSAgdmlydHVhbCB2b2lkIG9uQ2xpZW50Q29ubmVjdGVkKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRDb25uZWN0ZWRDbGllbnQ+JiBwQ2xpZW50KSAvKiBvdmVycmlkZSAqLzsKLSAgdmlydHVhbCB2b2lkIG9uQ2xpZW50RGlzY29ubmVjdGVkKFRDb25uZWN0ZWRDbGllbnQqIHBDbGllbnQpIC8qIG92ZXJyaWRlICovOworICAvKioKKyAgICogRHJhaW4gcmVjZW50bHkgY29ubmVjdGVkIGNsaWVudHMgYnkgam9pbmluZyB0aGVpciB0aHJlYWRzIC0gdGhpcyBpcyBkb25lIGxhemlseSBiZWNhdXNlCisgICAqIHdlIGNhbm5vdCBkbyBpdCBpbnNpZGUgdGhlIHRocmVhZCBjb250ZXh0IHRoYXQgaXMgZGlzY29ubmVjdGluZy4KKyAgICovCisgIHZpcnR1YWwgdm9pZCBkcmFpbkRlYWRDbGllbnRzKCk7CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5XzsKLSAgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNb25pdG9yIGNsaWVudHNNb25pdG9yXzsKKyAgLyoqCisgICAqIEltcGxlbWVudGF0aW9uIG9mIFRTZXJ2ZXJGcmFtZXdvcms6Om9uQ2xpZW50Q29ubmVjdGVkCisgICAqLworICB2aXJ0dWFsIHZvaWQgb25DbGllbnRDb25uZWN0ZWQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRDb25uZWN0ZWRDbGllbnQ+JiBwQ2xpZW50KSAvKiBvdmVycmlkZSAqLzsKKworICAvKioKKyAgICogSW1wbGVtZW50YXRpb24gb2YgVFNlcnZlckZyYW1ld29yazo6b25DbGllbnREaXNjb25uZWN0ZWQKKyAgICovCisgIHZpcnR1YWwgdm9pZCBvbkNsaWVudERpc2Nvbm5lY3RlZChUQ29ubmVjdGVkQ2xpZW50ICpwQ2xpZW50KSAvKiBvdmVycmlkZSAqLzsKKworICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5XzsKKworICAvKioKKyAgICogQSBoZWxwZXIgd3JhcHBlciB1c2VkIHRvIHdyYXAgdGhlIGNsaWVudCBpbiBzb21ldGhpbmcgd2UgY2FuIHVzZSB0byBtYWludGFpbgorICAgKiB0aGUgbGlmZXRpbWUgb2YgdGhlIGNvbm5lY3RlZCBjbGllbnQgd2l0aGluIGEgZGV0YWNoZWQgdGhyZWFkLiAgV2UgY2Fubm90IHNpbXBseQorICAgKiB0cmFjayB0aGUgdGhyZWFkcyBiZWNhdXNlIGEgc2hhcmVkX3B0cjxUaHJlYWQ+IGhhbmdzIG9uIHRvIHRoZSBSdW5uYWJsZSBpdCBpcworICAgKiBwYXNzZWQsIGFuZCBUU2VydmVyRnJhbWV3b3JrIHJlcXVpcmVzIHRoZSBydW5uYWJsZSAoVENvbm5lY3RlZENsaWVudCkgdG8gYmUKKyAgICogZGVzdHJveWVkIGluIG9yZGVyIHRvIHdvcmsgcHJvcGVybHkuCisgICAqLworICBjbGFzcyBUQ29ubmVjdGVkQ2xpZW50UnVubmVyIDogcHVibGljIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UnVubmFibGUKKyAgeworICBwdWJsaWM6CisgICAgVENvbm5lY3RlZENsaWVudFJ1bm5lcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VENvbm5lY3RlZENsaWVudD4mIHBDbGllbnQpOworICAgIHZpcnR1YWwgflRDb25uZWN0ZWRDbGllbnRSdW5uZXIoKTsKKyAgICB2b2lkIHJ1bigpIC8qIG92ZXJyaWRlICovOworICBwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxUQ29ubmVjdGVkQ2xpZW50PiBwQ2xpZW50XzsKKyAgfTsKKworICBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Ok1vbml0b3IgY2xpZW50TW9uaXRvcl87CisKKyAgdHlwZWRlZiBzdGQ6Om1hcDxUQ29ubmVjdGVkQ2xpZW50ICosIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZD4gPiBDbGllbnRNYXA7CisKKyAgLyoqCisgICAqIEEgbWFwIG9mIGFjdGl2ZSBjbGllbnRzCisgICAqLworICBDbGllbnRNYXAgYWN0aXZlQ2xpZW50TWFwXzsKKworICAvKioKKyAgICogQSBtYXAgb2YgY2xpZW50cyB0aGF0IGhhdmUgZGlzY29ubmVjdGVkIGJ1dCB0aGVpciB0aHJlYWRzIGhhdmUgbm90IGJlZW4gam9pbmVkCisgICAqLworICBDbGllbnRNYXAgZGVhZENsaWVudE1hcF87CiB9OworCiB9CiB9CiB9IC8vIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXIKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaAppbmRleCA5NmEzZGEzLi45NTkxMDU4IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1BsYXRmb3JtU29ja2V0LmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9QbGF0Zm9ybVNvY2tldC5oCkBAIC0yMyw2ICsyMyw3IEBACiAjICBkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfUExBVEZPUk1fU09DS0VUX0hfCiAKICNpZmRlZiBfV0lOMzIKKyMgIGluY2x1ZGUgPHdpbnNvY2syLmg+CiAjICBkZWZpbmUgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IgOjpXU0FHZXRMYXN0RXJyb3IoKQogIyAgZGVmaW5lIFRIUklGVF9FUlJOTyAoKl9lcnJubygpKQogIyAgZGVmaW5lIFRIUklGVF9FSU5QUk9HUkVTUyBXU0FFSU5QUk9HUkVTUwpAQCAtNTAsNiArNTEsOCBAQAogIyAgZGVmaW5lIFRIUklGVF9MU0VFSyBfbHNlZWsKICMgIGRlZmluZSBUSFJJRlRfV1JJVEUgX3dyaXRlCiAjICBkZWZpbmUgVEhSSUZUX1JFQUQgX3JlYWQKKyMgIGRlZmluZSBUSFJJRlRfSU9DVExfU09DS0VUIGlvY3Rsc29ja2V0CisjICBkZWZpbmUgVEhSSUZUX0lPQ1RMX1NPQ0tFVF9OVU1fQllURVNfVFlQRSB1X2xvbmcKICMgIGRlZmluZSBUSFJJRlRfRlNUQVQgX2ZzdGF0CiAjICBkZWZpbmUgVEhSSUZUX1NUQVQgX3N0YXQKICMgIGlmZGVmIF9XSU4zMl9XQ0UKQEAgLTU4LDcgKzYxLDExIEBACiAjICAgIGRlZmluZSBUSFJJRlRfR0FJX1NUUkVSUk9SIGdhaV9zdHJlcnJvckEKICMgIGVuZGlmCiAjICBkZWZpbmUgVEhSSUZUX1NTSVpFVCBwdHJkaWZmX3QKLSMgIGRlZmluZSBUSFJJRlRfU05QUklOVEYgX3NucHJpbnRmCisjICBpZiAoX01TQ19WRVIgPCAxOTAwKQorIyAgICBkZWZpbmUgVEhSSUZUX1NOUFJJTlRGIF9zbnByaW50ZgorIyAgZWxzZQorIyAgICBkZWZpbmUgVEhSSUZUX1NOUFJJTlRGIHNucHJpbnRmCisjICBlbmRpZgogIyAgZGVmaW5lIFRIUklGVF9TTEVFUF9TRUMgdGhyaWZ0X3NsZWVwCiAjICBkZWZpbmUgVEhSSUZUX1NMRUVQX1VTRUMgdGhyaWZ0X3VzbGVlcAogIyAgZGVmaW5lIFRIUklGVF9USU1FU1BFQyB0aHJpZnRfdGltZXNwZWMKQEAgLTc0LDYgKzgxLDkgQEAKICMgICAgZGVmaW5lIFRIUklGVF9QT0xMT1VUIFBPTExPVVQKICMgIGVuZGlmIC8vV0lOVkVSCiAjICBkZWZpbmUgVEhSSUZUX1NIVVRfUkRXUiBTRF9CT1RICisjICBpZiAhZGVmaW5lZChBSV9BRERSQ09ORklHKQorIyAgICBkZWZpbmUgQUlfQUREUkNPTkZJRyAweDAwMDAwNDAwCisjICBlbmRpZgogI2Vsc2UgLy9ub3QgX1dJTjMyCiAjICBpbmNsdWRlIDxlcnJuby5oPgogIyAgZGVmaW5lIFRIUklGVF9HRVRfU09DS0VUX0VSUk9SIGVycm5vCkBAIC0xMDMsNiArMTEzLDggQEAKICMgIGRlZmluZSBUSFJJRlRfTFNFRUsgbHNlZWsKICMgIGRlZmluZSBUSFJJRlRfV1JJVEUgd3JpdGUKICMgIGRlZmluZSBUSFJJRlRfUkVBRCByZWFkCisjICBkZWZpbmUgVEhSSUZUX0lPQ1RMX1NPQ0tFVCBpb2N0bAorIyAgZGVmaW5lIFRIUklGVF9JT0NUTF9TT0NLRVRfTlVNX0JZVEVTX1RZUEUgaW50CiAjICBkZWZpbmUgVEhSSUZUX1NUQVQgc3RhdAogIyAgZGVmaW5lIFRIUklGVF9GU1RBVCBmc3RhdAogIyAgZGVmaW5lIFRIUklGVF9HQUlfU1RSRVJST1IgZ2FpX3N0cmVycm9yCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuY3BwCmluZGV4IDcwMGJkZDUuLjlhYzJmODQgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuY3BwCkBAIC0zNjEsMTAgKzM2MSwxNCBAQAogICB9CiAKICAgLy8gR3JvdyB0aGUgYnVmZmVyIGFzIG5lY2Vzc2FyeS4KLSAgdWludDMyX3QgbmV3X3NpemUgPSBidWZmZXJTaXplXzsKKyAgdWludDY0X3QgbmV3X3NpemUgPSBidWZmZXJTaXplXzsKICAgd2hpbGUgKGxlbiA+IGF2YWlsKSB7CiAgICAgbmV3X3NpemUgPSBuZXdfc2l6ZSA+IDAgPyBuZXdfc2l6ZSAqIDIgOiAxOwotICAgIGF2YWlsID0gYXZhaWxhYmxlX3dyaXRlKCkgKyAobmV3X3NpemUgLSBidWZmZXJTaXplXyk7CisgICAgaWYgKG5ld19zaXplID4gbWF4QnVmZmVyU2l6ZV8pIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnRlcm5hbCBidWZmZXIgc2l6ZSBvdmVyZmxvdyIpOworICAgIH0KKyAgICBhdmFpbCA9IGF2YWlsYWJsZV93cml0ZSgpICsgKHN0YXRpY19jYXN0PHVpbnQzMl90PihuZXdfc2l6ZSkgLSBidWZmZXJTaXplXyk7CiAgIH0KIAogICAvLyBBbGxvY2F0ZSBpbnRvIGEgbmV3IHBvaW50ZXIgc28gd2UgZG9uJ3QgYm9yayBvdXJzIGlmIGl0IGZhaWxzLgpAQCAtMzc4LDcgKzM4Miw3IEBACiAgIHdCYXNlXyA9IG5ld19idWZmZXIgKyAod0Jhc2VfIC0gYnVmZmVyXyk7CiAgIHdCb3VuZF8gPSBuZXdfYnVmZmVyICsgbmV3X3NpemU7CiAgIGJ1ZmZlcl8gPSBuZXdfYnVmZmVyOwotICBidWZmZXJTaXplXyA9IG5ld19zaXplOworICBidWZmZXJTaXplXyA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihuZXdfc2l6ZSk7CiB9CiAKIHZvaWQgVE1lbW9yeUJ1ZmZlcjo6d3JpdGVTbG93KGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmgKaW5kZXggOThlOGE5ZS4uYzQyM2Y5YyAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaApAQCAtMTg2LDcgKzE4Niw3IEBACiAgIHN0YXRpYyBjb25zdCBpbnQgREVGQVVMVF9CVUZGRVJfU0laRSA9IDUxMjsKIAogICAvLy8gVXNlIGRlZmF1bHQgYnVmZmVyIHNpemVzLgotICBUQnVmZmVyZWRUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KQorICBUQnVmZmVyZWRUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCkKICAgICA6IHRyYW5zcG9ydF8odHJhbnNwb3J0KSwKICAgICAgIHJCdWZTaXplXyhERUZBVUxUX0JVRkZFUl9TSVpFKSwKICAgICAgIHdCdWZTaXplXyhERUZBVUxUX0JVRkZFUl9TSVpFKSwKQEAgLTE5Niw3ICsxOTYsNyBAQAogICB9CiAKICAgLy8vIFVzZSBzcGVjaWZpZWQgYnVmZmVyIHNpemVzLgotICBUQnVmZmVyZWRUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0LCB1aW50MzJfdCBzeikKKyAgVEJ1ZmZlcmVkVHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQsIHVpbnQzMl90IHN6KQogICAgIDogdHJhbnNwb3J0Xyh0cmFuc3BvcnQpLAogICAgICAgckJ1ZlNpemVfKHN6KSwKICAgICAgIHdCdWZTaXplXyhzeiksCkBAIC0yMDYsNyArMjA2LDcgQEAKICAgfQogCiAgIC8vLyBVc2Ugc3BlY2lmaWVkIHJlYWQgYW5kIHdyaXRlIGJ1ZmZlciBzaXplcy4KLSAgVEJ1ZmZlcmVkVHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCwgdWludDMyX3QgcnN6LCB1aW50MzJfdCB3c3opCisgIFRCdWZmZXJlZFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0LCB1aW50MzJfdCByc3osIHVpbnQzMl90IHdzeikKICAgICA6IHRyYW5zcG9ydF8odHJhbnNwb3J0KSwKICAgICAgIHJCdWZTaXplXyhyc3opLAogICAgICAgd0J1ZlNpemVfKHdzeiksCkBAIC0yNTUsNyArMjU1LDcgQEAKICAgICovCiAgIHZpcnR1YWwgY29uc3QgdWludDhfdCogYm9ycm93U2xvdyh1aW50OF90KiBidWYsIHVpbnQzMl90KiBsZW4pOwogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFVuZGVybHlpbmdUcmFuc3BvcnQoKSB7IHJldHVybiB0cmFuc3BvcnRfOyB9CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRVbmRlcmx5aW5nVHJhbnNwb3J0KCkgeyByZXR1cm4gdHJhbnNwb3J0XzsgfQogCiAgIC8qCiAgICAqIFRWaXJ0dWFsVHJhbnNwb3J0IHByb3ZpZGVzIGEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiByZWFkQWxsKCkuCkBAIC0yNzAsNyArMjcwLDcgQEAKICAgICAvLyBXcml0ZSBzaXplIG5ldmVyIGNoYW5nZXMuCiAgIH0KIAotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnRfOworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0XzsKIAogICB1aW50MzJfdCByQnVmU2l6ZV87CiAgIHVpbnQzMl90IHdCdWZTaXplXzsKQEAgLTI5MSw4ICsyOTEsOCBAQAogICAvKioKICAgICogV3JhcHMgdGhlIHRyYW5zcG9ydCBpbnRvIGEgYnVmZmVyZWQgb25lLgogICAgKi8KLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKLSAgICByZXR1cm4gYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRCdWZmZXJlZFRyYW5zcG9ydCh0cmFucykpOworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSB7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PihuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KHRyYW5zKSk7CiAgIH0KIH07CiAKQEAgLTMwOSw3ICszMDksMTcgQEAKICAgc3RhdGljIGNvbnN0IGludCBERUZBVUxUX01BWF9GUkFNRV9TSVpFID0gMjU2ICogMTAyNCAqIDEwMjQ7CiAKICAgLy8vIFVzZSBkZWZhdWx0IGJ1ZmZlciBzaXplcy4KLSAgVEZyYW1lZFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQpCisgIFRGcmFtZWRUcmFuc3BvcnQoKQorICAgIDogdHJhbnNwb3J0XygpLAorICAgICAgckJ1ZlNpemVfKDApLAorICAgICAgd0J1ZlNpemVfKERFRkFVTFRfQlVGRkVSX1NJWkUpLAorICAgICAgckJ1Zl8oKSwKKyAgICAgIHdCdWZfKG5ldyB1aW50OF90W3dCdWZTaXplX10pLAorICAgICAgYnVmUmVjbGFpbVRocmVzaF8oKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgpKCkpIHsKKyAgICBpbml0UG9pbnRlcnMoKTsKKyAgfQorCisgIFRGcmFtZWRUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCkKICAgICA6IHRyYW5zcG9ydF8odHJhbnNwb3J0KSwKICAgICAgIHJCdWZTaXplXygwKSwKICAgICAgIHdCdWZTaXplXyhERUZBVUxUX0JVRkZFUl9TSVpFKSwKQEAgLTMyMCw3ICszMzAsNyBAQAogICAgIGluaXRQb2ludGVycygpOwogICB9CiAKLSAgVEZyYW1lZFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQsCisgIFRGcmFtZWRUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCwKICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzeiwKICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBidWZSZWNsYWltVGhyZXNoID0gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgpKCkpCiAgICAgOiB0cmFuc3BvcnRfKHRyYW5zcG9ydCksCkBAIC0zNTYsMTMgKzM2NiwxMyBAQAogCiAgIGNvbnN0IHVpbnQ4X3QqIGJvcnJvd1Nsb3codWludDhfdCogYnVmLCB1aW50MzJfdCogbGVuKTsKIAotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRVbmRlcmx5aW5nVHJhbnNwb3J0KCkgeyByZXR1cm4gdHJhbnNwb3J0XzsgfQorICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VW5kZXJseWluZ1RyYW5zcG9ydCgpIHsgcmV0dXJuIHRyYW5zcG9ydF87IH0KIAogICAvKgogICAgKiBUVmlydHVhbFRyYW5zcG9ydCBwcm92aWRlcyBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgcmVhZEFsbCgpLgogICAgKiBXZSB3YW50IHRvIHVzZSB0aGUgVEJ1ZmZlckJhc2UgdmVyc2lvbiBpbnN0ZWFkLgogICAgKi8KLSAgdWludDMyX3QgcmVhZEFsbCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeyByZXR1cm4gVEJ1ZmZlckJhc2U6OnJlYWRBbGwoYnVmLCBsZW4pOyB9CisgIHVzaW5nIFRCdWZmZXJCYXNlOjpyZWFkQWxsOwogCiAgIC8qKgogICAgKiBSZXR1cm5zIHRoZSBvcmlnaW4gb2YgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0CkBAIC0zODYsNyArMzk2LDcgQEAKICAgICogUmV0dXJucyB0cnVlIGlmIGEgZnJhbWUgd2FzIHJlYWQgc3VjY2Vzc2Z1bGx5LCBvciBmYWxzZSBvbiBFT0YuCiAgICAqIChSYWlzZXMgYSBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIEVPRiBvY2N1cnMgYWZ0ZXIgYSBwYXJ0aWFsIGZyYW1lLikKICAgICovCi0gIGJvb2wgcmVhZEZyYW1lKCk7CisgIHZpcnR1YWwgYm9vbCByZWFkRnJhbWUoKTsKIAogICB2b2lkIGluaXRQb2ludGVycygpIHsKICAgICBzZXRSZWFkQnVmZmVyKE5VTEwsIDApOwpAQCAtMzk3LDcgKzQwNyw3IEBACiAgICAgdGhpcy0+d3JpdGUoKHVpbnQ4X3QqKSZwYWQsIHNpemVvZihwYWQpKTsKICAgfQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydF87CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnRfOwogCiAgIHVpbnQzMl90IHJCdWZTaXplXzsKICAgdWludDMyX3Qgd0J1ZlNpemVfOwpAQCAtNDIwLDggKzQzMCw4IEBACiAgIC8qKgogICAgKiBXcmFwcyB0aGUgdHJhbnNwb3J0IGludG8gYSBmcmFtZWQgb25lLgogICAgKi8KLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKLSAgICByZXR1cm4gYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRGcmFtZWRUcmFuc3BvcnQodHJhbnMpKTsKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucykgeworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRGcmFtZWRUcmFuc3BvcnQodHJhbnMpKTsKICAgfQogfTsKIApAQCAtNDM4LDExICs0NDgsMTQgQEAKIHByaXZhdGU6CiAgIC8vIENvbW1vbiBpbml0aWFsaXphdGlvbiBkb25lIGJ5IGFsbCBjb25zdHJ1Y3RvcnMuCiAgIHZvaWQgaW5pdENvbW1vbih1aW50OF90KiBidWYsIHVpbnQzMl90IHNpemUsIGJvb2wgb3duZXIsIHVpbnQzMl90IHdQb3MpIHsKKworICAgIG1heEJ1ZmZlclNpemVfID0gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgpKCk7CisKICAgICBpZiAoYnVmID09IE5VTEwgJiYgc2l6ZSAhPSAwKSB7CiAgICAgICBhc3NlcnQob3duZXIpOwogICAgICAgYnVmID0gKHVpbnQ4X3QqKXN0ZDo6bWFsbG9jKHNpemUpOwogICAgICAgaWYgKGJ1ZiA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93IHN0ZDo6YmFkX2FsbG9jKCk7CisJdGhyb3cgc3RkOjpiYWRfYWxsb2MoKTsKICAgICAgIH0KICAgICB9CiAKQEAgLTY2Myw2ICs2NzYsMjkgQEAKICAgICovCiAgIHVpbnQzMl90IHJlYWRBbGwodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsgcmV0dXJuIFRCdWZmZXJCYXNlOjpyZWFkQWxsKGJ1ZiwgbGVuKTsgfQogCisgIC8vISBcYnJpZWYgR2V0IHRoZSBjdXJyZW50IGJ1ZmZlciBzaXplCisgIC8vISBccmV0dXJucyB0aGUgY3VycmVudCBidWZmZXIgc2l6ZQorICB1aW50MzJfdCBnZXRCdWZmZXJTaXplKCkgY29uc3QgeworICAgIHJldHVybiBidWZmZXJTaXplXzsKKyAgfQorCisgIC8vISBcYnJpZWYgR2V0IHRoZSBjdXJyZW50IG1heGltdW0gYnVmZmVyIHNpemUKKyAgLy8hIFxyZXR1cm5zIHRoZSBjdXJyZW50IG1heGltdW0gYnVmZmVyIHNpemUKKyAgdWludDMyX3QgZ2V0TWF4QnVmZmVyU2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbWF4QnVmZmVyU2l6ZV87CisgIH0KKworICAvLyEgXGJyaWVmIENoYW5nZSB0aGUgbWF4aW11bSBidWZmZXIgc2l6ZQorICAvLyEgXHBhcmFtW2luXSAgbWF4U2l6ZSAgdGhlIG5ldyBtYXhpbXVtIGJ1ZmZlciBzaXplIGFsbG93ZWQgdG8gZ3JvdyB0bworICAvLyEgXHRocm93cyAgVFRyYW5zcG9ydEV4Y2VwdGlvbihCQURfQVJHUykgaWYgbWF4U2l6ZSBpcyBsZXNzIHRoYW4gdGhlIGN1cnJlbnQgYnVmZmVyIHNpemUKKyAgdm9pZCBzZXRNYXhCdWZmZXJTaXplKHVpbnQzMl90IG1heFNpemUpIHsKKyAgICBpZiAobWF4U2l6ZSA8IGJ1ZmZlclNpemVfKSB7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWF4aW11bSBidWZmZXIgc2l6ZSB3b3VsZCBiZSBsZXNzIHRoYW4gY3VycmVudCBidWZmZXIgc2l6ZSIpOworICAgIH0KKyAgICBtYXhCdWZmZXJTaXplXyA9IG1heFNpemU7CisgIH0KKwogcHJvdGVjdGVkOgogICB2b2lkIHN3YXAoVE1lbW9yeUJ1ZmZlciYgdGhhdCkgewogICAgIHVzaW5nIHN0ZDo6c3dhcDsKQEAgLTY5NSw2ICs3MzEsOSBAQAogICAvLyBBbGxvY2F0ZWQgYnVmZmVyIHNpemUKICAgdWludDMyX3QgYnVmZmVyU2l6ZV87CiAKKyAgLy8gTWF4aW11bSBhbGxvd2VkIHNpemUKKyAgdWludDMyX3QgbWF4QnVmZmVyU2l6ZV87CisKICAgLy8gSXMgdGhpcyBvYmplY3QgdGhlIG93bmVyIG9mIHRoZSBidWZmZXI/CiAgIGJvb2wgb3duZXJfOwogCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RGRFRyYW5zcG9ydC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RGRFRyYW5zcG9ydC5jcHAKaW5kZXggNGJjZTNhOC4uOTNkZDEwMCAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9URkRUcmFuc3BvcnQuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEZEVHJhbnNwb3J0LmNwcApAQCAtMzEsNyArMzEsNyBAQAogI2luY2x1ZGUgPGlvLmg+CiAjZW5kaWYKIAotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKK3VzaW5nIHN0ZDo6c3RyaW5nOwogCiBuYW1lc3BhY2UgYXBhY2hlIHsKIG5hbWVzcGFjZSB0aHJpZnQgewpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0LmNwcAppbmRleCA4NWU4OGI5Li5hZmI0NDExIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0LmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0LmNwcApAQCAtMjQsNiArMjQsOCBAQAogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaD4KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvRnVuY3Rpb25SdW5uZXIuaD4KIAorI2luY2x1ZGUgPGJvb3N0L3ZlcnNpb24uaHBwPgorCiAjaWZkZWYgSEFWRV9TWVNfVElNRV9ICiAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KICNlbHNlCkBAIC00MCw2ICs0Miw3IEBACiAjaW5jbHVkZSA8Y3N0cmluZz4KICNpbmNsdWRlIDxpb3N0cmVhbT4KICNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8bWVtb3J5PgogI2lmZGVmIEhBVkVfU1lTX1NUQVRfSAogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAjZW5kaWYKQEAgLTUyLDkgKzU1LDExIEBACiBuYW1lc3BhY2UgdGhyaWZ0IHsKIG5hbWVzcGFjZSB0cmFuc3BvcnQgewogCi11c2luZyBib29zdDo6c2NvcGVkX3B0cjsKLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKK3VzaW5nIHN0ZDo6Y2VycjsKK3VzaW5nIHN0ZDo6Y291dDsKK3VzaW5nIHN0ZDo6ZW5kbDsKK3VzaW5nIHN0ZDo6c3RyaW5nOwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7CiAKQEAgLTE5Miw2ICsxOTcsMTIgQEAKICAgZW5xdWV1ZUV2ZW50KGJ1ZiwgbGVuKTsKIH0KIAordGVtcGxhdGUgPGNsYXNzIF9UPgorc3RydWN0IHVuaXF1ZURlbGV0ZXIKK3sKKyAgdm9pZCBvcGVyYXRvcigpKF9UICpwdHIpIGNvbnN0IHsgZGVsZXRlIHB0cjsgfQorfTsKKwogdm9pZCBURmlsZVRyYW5zcG9ydDo6ZW5xdWV1ZUV2ZW50KGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgZXZlbnRMZW4pIHsKICAgLy8gY2FuJ3QgZW5xdWV1ZSBtb3JlIGV2ZW50cyBpZiBmaWxlIGlzIGdvaW5nIHRvIGNsb3NlCiAgIGlmIChjbG9zaW5nXykgewpAQCAtMjA5LDcgKzIyMCw3IEBACiAgICAgcmV0dXJuOwogICB9CiAKLSAgc3RkOjphdXRvX3B0cjxldmVudEluZm8+IHRvRW5xdWV1ZShuZXcgZXZlbnRJbmZvKCkpOworICBzdGQ6OnVuaXF1ZV9wdHI8ZXZlbnRJbmZvLCB1bmlxdWVEZWxldGVyPGV2ZW50SW5mbz4gPiB0b0VucXVldWUobmV3IGV2ZW50SW5mbygpKTsKICAgdG9FbnF1ZXVlLT5ldmVudEJ1ZmZfID0gbmV3IHVpbnQ4X3RbKHNpemVvZih1aW50OF90KSAqIGV2ZW50TGVuKSArIDRdOwogCiAgIC8vIGZpcnN0IDQgYnl0ZXMgaXMgdGhlIGV2ZW50IGxlbmd0aApAQCAtMzYzLDcgKzM3NCw3IEBACiAKICAgICAgICAgd2hpbGUgKGhhc0lPRXJyb3IpIHsKICAgICAgICAgICBUX0VSUk9SKAotICAgICAgICAgICAgICAiVEZpbGVUcmFuc3BvcnQ6IHdyaXRlciB0aHJlYWQgZ29pbmcgdG8gc2xlZXAgZm9yICVkIG1pY3Jvc2Vjb25kcyBkdWUgdG8gSU8gZXJyb3JzIiwKKyAgICAgICAgICAgICAgIlRGaWxlVHJhbnNwb3J0OiB3cml0ZXIgdGhyZWFkIGdvaW5nIHRvIHNsZWVwIGZvciAldSBtaWNyb3NlY29uZHMgZHVlIHRvIElPIGVycm9ycyIsCiAgICAgICAgICAgICAgIHdyaXRlclRocmVhZElPRXJyb3JTbGVlcFRpbWVfKTsKICAgICAgICAgICBUSFJJRlRfU0xFRVBfVVNFQyh3cml0ZXJUaHJlYWRJT0Vycm9yU2xlZXBUaW1lXyk7CiAgICAgICAgICAgaWYgKGNsb3NpbmdfKSB7CkBAIC02ODUsOCArNjk2LDggQEAKICAgICAgICAgICByZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRCdWZmUG9zXyA9IDA7CiAgICAgICAgIH0KICAgICAgICAgLy8gdGFrZSBlaXRoZXIgdGhlIGVudGlyZSBldmVudCBvciB0aGUgcmVtYWluaW5nIGJ5dGVzIGluIHRoZSBidWZmZXIKLSAgICAgICAgaW50IHJlY2xhaW1CdWZmZXIgPSBtaW4oKHVpbnQzMl90KShyZWFkU3RhdGVfLmJ1ZmZlckxlbl8gLSByZWFkU3RhdGVfLmJ1ZmZlclB0cl8pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRTaXplXyAtIHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudEJ1ZmZQb3NfKTsKKyAgICAgICAgaW50IHJlY2xhaW1CdWZmZXIgPSAoc3RkOjptaW4pKCh1aW50MzJfdCkocmVhZFN0YXRlXy5idWZmZXJMZW5fIC0gcmVhZFN0YXRlXy5idWZmZXJQdHJfKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudFNpemVfIC0gcmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50QnVmZlBvc18pOwogCiAgICAgICAgIC8vIGNvcHkgZGF0YSBmcm9tIHJlYWQgYnVmZmVyIGludG8gZXZlbnQgYnVmZmVyCiAgICAgICAgIG1lbWNweShyZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRCdWZmXyArIHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudEJ1ZmZQb3NfLApAQCAtODMyLDcgKzg0Myw3IEBACiAgICAgdWludDMyX3Qgb2xkUmVhZFRpbWVvdXQgPSBnZXRSZWFkVGltZW91dCgpOwogICAgIHNldFJlYWRUaW1lb3V0KE5PX1RBSUxfUkVBRF9USU1FT1VUKTsKICAgICAvLyBrZWVwIG9uIHJlYWRpbmcgdW50aSB0aGUgbGFzdCBldmVudCBhdCBwb2ludCBvZiBzZWVrQ2h1bmsgY2FsbAotICAgIGJvb3N0OjpzY29wZWRfcHRyPGV2ZW50SW5mbz4gZXZlbnQ7CisgICAgc2hhcmVkX3B0cjxldmVudEluZm8+IGV2ZW50OwogICAgIHdoaWxlICgob2Zmc2V0XyArIHJlYWRTdGF0ZV8uYnVmZmVyUHRyXykgPCBtaW5FbmRPZmZzZXQpIHsKICAgICAgIGV2ZW50LnJlc2V0KHJlYWRFdmVudCgpKTsKICAgICAgIGlmIChldmVudC5nZXQoKSA9PSBOVUxMKSB7CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0LmgKaW5kZXggYWNkN2JmOS4uNmNjN2JkMiAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuaApAQCAtMjQsMTIgKzI0LDEwIEBACiAjaW5jbHVkZSA8dGhyaWZ0L1RocmlmdC5oPgogI2luY2x1ZGUgPHRocmlmdC9UUHJvY2Vzc29yLmg+CiAKKyNpbmNsdWRlIDxhdG9taWM+CiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAKLSNpbmNsdWRlIDxib29zdC9zY29wZWRfcHRyLmhwcD4KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLQogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9NdXRleC5oPgogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1BsYXRmb3JtVGhyZWFkRmFjdG9yeS5oPgpAQCAtMzM5LDcgKzMzNyw3IEBACiAKICAgLy8gd3JpdGVyIHRocmVhZAogICBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlBsYXRmb3JtVGhyZWFkRmFjdG9yeSB0aHJlYWRGYWN0b3J5XzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWQ+IHdyaXRlclRocmVhZF87CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZD4gd3JpdGVyVGhyZWFkXzsKIAogICAvLyBidWZmZXJzIHRvIGhvbGQgZGF0YSBiZWZvcmUgaXQgaXMgZmx1c2hlZC4gRWFjaCBlbGVtZW50IG9mIHRoZSBidWZmZXIgc3RvcmVzIGEgbXNnIHRoYXQKICAgLy8gbmVlZHMgdG8gYmUgd3JpdHRlbiB0byB0aGUgZmlsZS4gIFRoZSBidWZmZXJzIGFyZSBzd2FwcGVkIGJ5IHRoZSB3cml0ZXIgdGhyZWFkLgpAQCAtMzQ4LDExICszNDYsMTEgQEAKIAogICAvLyBjb25kaXRpb25zIHVzZWQgdG8gYmxvY2sgd2hlbiB0aGUgYnVmZmVyIGlzIGZ1bGwgb3IgZW1wdHkKICAgTW9uaXRvciBub3RGdWxsXywgbm90RW1wdHlfOwotICB2b2xhdGlsZSBib29sIGNsb3NpbmdfOworICBzdGQ6OmF0b21pYzxib29sPiBjbG9zaW5nXzsKIAogICAvLyBUbyBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgdGhlIGJ1ZmZlciBoYXMgYmVlbiBmbHVzaGVkCiAgIE1vbml0b3IgZmx1c2hlZF87Ci0gIHZvbGF0aWxlIGJvb2wgZm9yY2VGbHVzaF87CisgIHN0ZDo6YXRvbWljPGJvb2w+IGZvcmNlRmx1c2hfOwogCiAgIC8vIE11dGV4IHRoYXQgaXMgZ3JhYmJlZCB3aGVuIGVucXVldWVpbmcgYW5kIHN3YXBwaW5nIHRoZSByZWFkL3dyaXRlIGJ1ZmZlcnMKICAgTXV0ZXggbXV0ZXhfOwpAQCAtMzkwLDE0ICszODgsMTQgQEAKICAgICogQHBhcmFtIHByb3RvY29sRmFjdG9yeSBwcm90b2NvbCBmYWN0b3J5CiAgICAqIEBwYXJhbSBpbnB1dFRyYW5zcG9ydCBmaWxlIHRyYW5zcG9ydAogICAgKi8KLSAgVEZpbGVQcm9jZXNzb3IoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBpbnB1dFRyYW5zcG9ydCk7CisgIFRGaWxlUHJvY2Vzc29yKHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gaW5wdXRUcmFuc3BvcnQpOwogCi0gIFRGaWxlUHJvY2Vzc29yKGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gaW5wdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IG91dHB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IGlucHV0VHJhbnNwb3J0KTsKKyAgVEZpbGVQcm9jZXNzb3Ioc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IGlucHV0VHJhbnNwb3J0KTsKIAogICAvKioKICAgICogQ29uc3RydWN0b3IKQEAgLTQwNywxMCArNDA1LDEwIEBACiAgICAqIEBwYXJhbSBpbnB1dFRyYW5zcG9ydCBpbnB1dCBmaWxlIHRyYW5zcG9ydAogICAgKiBAcGFyYW0gb3V0cHV0IG91dHB1dCB0cmFuc3BvcnQKICAgICovCi0gIFRGaWxlUHJvY2Vzc29yKGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gaW5wdXRUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IG91dHB1dFRyYW5zcG9ydCk7CisgIFRGaWxlUHJvY2Vzc29yKHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gaW5wdXRUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBvdXRwdXRUcmFuc3BvcnQpOwogCiAgIC8qKgogICAgKiBwcm9jZXNzZXMgZXZlbnRzIGZyb20gdGhlIGZpbGUKQEAgLTQyNywxNCArNDI1LDE1IEBACiAgIHZvaWQgcHJvY2Vzc0NodW5rKCk7CiAKIHByaXZhdGU6Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3Nvcl87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IGlucHV0UHJvdG9jb2xGYWN0b3J5XzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gb3V0cHV0UHJvdG9jb2xGYWN0b3J5XzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IGlucHV0VHJhbnNwb3J0XzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gb3V0cHV0VHJhbnNwb3J0XzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3Nvcl87CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBpbnB1dFByb3RvY29sRmFjdG9yeV87CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBvdXRwdXRQcm90b2NvbEZhY3RvcnlfOworICBzdGQ6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IGlucHV0VHJhbnNwb3J0XzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IG91dHB1dFRyYW5zcG9ydF87CiB9OwogfQogfQogfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CiAKICNlbmRpZiAvLyBfVEhSSUZUX1RSQU5TUE9SVF9URklMRVRSQU5TUE9SVF9IXworCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIZWFkZXJUcmFuc3BvcnQuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USGVhZGVyVHJhbnNwb3J0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTA4NGVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USGVhZGVyVHJhbnNwb3J0LmNwcApAQCAtMCwwICsxLDYxMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9USGVhZGVyVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xUeXBlcy5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5oPgorCisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHpsaWIuaD4KKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworCit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CisKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUQmluYXJ5UHJvdG9jb2w7CisKK3VpbnQzMl90IFRIZWFkZXJUcmFuc3BvcnQ6OnJlYWRTbG93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgIGlmIChjbGllbnRUeXBlID09IFRIUklGVF9VTkZSQU1FRF9CSU5BUlkgfHwgY2xpZW50VHlwZSA9PSBUSFJJRlRfVU5GUkFNRURfQ09NUEFDVCkgeworICAgIHJldHVybiB0cmFuc3BvcnRfLT5yZWFkKGJ1ZiwgbGVuKTsKKyAgfQorCisgIHJldHVybiBURnJhbWVkVHJhbnNwb3J0OjpyZWFkU2xvdyhidWYsIGxlbik7Cit9CisKK3VpbnQxNl90IFRIZWFkZXJUcmFuc3BvcnQ6OmdldFByb3RvY29sSWQoKSBjb25zdCB7CisgIGlmIChjbGllbnRUeXBlID09IFRIUklGVF9IRUFERVJfQ0xJRU5UX1RZUEUpIHsKKyAgICByZXR1cm4gcHJvdG9JZDsKKyAgfSBlbHNlIGlmIChjbGllbnRUeXBlID09IFRIUklGVF9VTkZSQU1FRF9DT01QQUNUIHx8IGNsaWVudFR5cGUgPT0gVEhSSUZUX0ZSQU1FRF9DT01QQUNUKSB7CisgICAgcmV0dXJuIFRfQ09NUEFDVF9QUk9UT0NPTDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gVF9CSU5BUllfUFJPVE9DT0w7IC8vIEFzc3VtZSBvdGhlciB0cmFuc3BvcnRzIHVzZSBUQmluYXJ5CisgIH0KK30KKwordm9pZCBUSGVhZGVyVHJhbnNwb3J0OjplbnN1cmVSZWFkQnVmZmVyKHVpbnQzMl90IHN6KSB7CisgIGlmIChzeiA+IHJCdWZTaXplXykgeworICAgIHJCdWZfLnJlc2V0KG5ldyB1aW50OF90W3N6XSk7CisgICAgckJ1ZlNpemVfID0gc3o7CisgIH0KK30KKworYm9vbCBUSGVhZGVyVHJhbnNwb3J0OjpyZWFkRnJhbWUoKSB7CisgIC8vIHN6TiBpcyBuZXR3b3JrIGJ5dGUgb3JkZXIgb2Ygc3oKKyAgdWludDMyX3Qgc3pOOworICB1aW50MzJfdCBzejsKKworICAvLyBSZWFkIHRoZSBzaXplIG9mIHRoZSBuZXh0IGZyYW1lLgorICAvLyBXZSBjYW4ndCB1c2UgcmVhZEFsbCgmc3osIHNpemVvZihzeikpLCBzaW5jZSB0aGF0IGFsd2F5cyB0aHJvd3MgYW4KKyAgLy8gZXhjZXB0aW9uIG9uIEVPRi4gIFdlIHdhbnQgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIG9ubHkgaWYgRU9GIG9jY3VycyBhZnRlcgorICAvLyBwYXJ0aWFsIHNpemUgZGF0YS4KKyAgdWludDMyX3Qgc2l6ZUJ5dGVzUmVhZCA9IDA7CisgIHdoaWxlIChzaXplQnl0ZXNSZWFkIDwgc2l6ZW9mKHN6TikpIHsKKyAgICB1aW50OF90KiBzenAgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPigmc3pOKSArIHNpemVCeXRlc1JlYWQ7CisgICAgdWludDMyX3QgYnl0ZXNSZWFkID0gdHJhbnNwb3J0Xy0+cmVhZChzenAsIHNpemVvZihzek4pIC0gc2l6ZUJ5dGVzUmVhZCk7CisgICAgaWYgKGJ5dGVzUmVhZCA9PSAwKSB7CisgICAgICBpZiAoc2l6ZUJ5dGVzUmVhZCA9PSAwKSB7CisgICAgICAgIC8vIEVPRiBiZWZvcmUgYW55IGRhdGEgd2FzIHJlYWQuCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEVPRiBhZnRlciBhIHBhcnRpYWwgZnJhbWUgaGVhZGVyLiAgUmFpc2UgYW4gZXhjZXB0aW9uLgorICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkVORF9PRl9GSUxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBtb3JlIGRhdGEgdG8gcmVhZCBhZnRlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcnRpYWwgZnJhbWUgaGVhZGVyLiIpOworICAgICAgfQorICAgIH0KKyAgICBzaXplQnl0ZXNSZWFkICs9IGJ5dGVzUmVhZDsKKyAgfQorCisgIHN6ID0gbnRvaGwoc3pOKTsKKworICBlbnN1cmVSZWFkQnVmZmVyKDQpOworCisgIGlmICgoc3ogJiBUQmluYXJ5UHJvdG9jb2w6OlZFUlNJT05fTUFTSykgPT0gKHVpbnQzMl90KVRCaW5hcnlQcm90b2NvbDo6VkVSU0lPTl8xKSB7CisgICAgLy8gdW5mcmFtZWQKKyAgICBjbGllbnRUeXBlID0gVEhSSUZUX1VORlJBTUVEX0JJTkFSWTsKKyAgICBtZW1jcHkockJ1Zl8uZ2V0KCksICZzek4sIHNpemVvZihzek4pKTsKKyAgICBzZXRSZWFkQnVmZmVyKHJCdWZfLmdldCgpLCA0KTsKKyAgfSBlbHNlIGlmIChzdGF0aWNfY2FzdDxpbnQ4X3Q+KHN6ID4+IDI0KSA9PSBUQ29tcGFjdFByb3RvY29sOjpQUk9UT0NPTF9JRAorICAgICAgICAgICAgICYmIChzdGF0aWNfY2FzdDxpbnQ4X3Q+KHN6ID4+IDE2KSAmIFRDb21wYWN0UHJvdG9jb2w6OlZFUlNJT05fTUFTSykKKyAgICAgICAgICAgICAgICAgICAgPT0gVENvbXBhY3RQcm90b2NvbDo6VkVSU0lPTl9OKSB7CisgICAgY2xpZW50VHlwZSA9IFRIUklGVF9VTkZSQU1FRF9DT01QQUNUOworICAgIG1lbWNweShyQnVmXy5nZXQoKSwgJnN6Tiwgc2l6ZW9mKHN6TikpOworICAgIHNldFJlYWRCdWZmZXIockJ1Zl8uZ2V0KCksIDQpOworICB9IGVsc2UgeworICAgIC8vIENvdWxkIGJlIGhlYWRlciBmb3JtYXQgb3IgZnJhbWVkLiBDaGVjayBuZXh0IHVpbnQzMgorICAgIHVpbnQzMl90IG1hZ2ljX247CisgICAgdWludDMyX3QgbWFnaWM7CisKKyAgICBpZiAoc3ogPiBNQVhfRlJBTUVfU0laRSkgeworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpDT1JSVVBURURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlYWRlciB0cmFuc3BvcnQgZnJhbWUgaXMgdG9vIGxhcmdlIik7CisgICAgfQorCisgICAgZW5zdXJlUmVhZEJ1ZmZlcihzeik7CisKKyAgICAvLyBXZSBjYW4gdXNlIHJlYWRBbGwgaGVyZSwgYmVjYXVzZSBpdCB3b3VsZCBiZSBhbiBpbnZhbGlkIGZyYW1lIG90aGVyd2lzZQorICAgIHRyYW5zcG9ydF8tPnJlYWRBbGwocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oJm1hZ2ljX24pLCBzaXplb2YobWFnaWNfbikpOworICAgIG1lbWNweShyQnVmXy5nZXQoKSwgJm1hZ2ljX24sIHNpemVvZihtYWdpY19uKSk7CisgICAgbWFnaWMgPSBudG9obChtYWdpY19uKTsKKworICAgIGlmICgobWFnaWMgJiBUQmluYXJ5UHJvdG9jb2w6OlZFUlNJT05fTUFTSykgPT0gKHVpbnQzMl90KVRCaW5hcnlQcm90b2NvbDo6VkVSU0lPTl8xKSB7CisgICAgICAvLyBmcmFtZWQKKyAgICAgIGNsaWVudFR5cGUgPSBUSFJJRlRfRlJBTUVEX0JJTkFSWTsKKyAgICAgIHRyYW5zcG9ydF8tPnJlYWRBbGwockJ1Zl8uZ2V0KCkgKyA0LCBzeiAtIDQpOworICAgICAgc2V0UmVhZEJ1ZmZlcihyQnVmXy5nZXQoKSwgc3opOworICAgIH0gZWxzZSBpZiAoc3RhdGljX2Nhc3Q8aW50OF90PihtYWdpYyA+PiAyNCkgPT0gVENvbXBhY3RQcm90b2NvbDo6UFJPVE9DT0xfSUQKKyAgICAgICAgICAgICAgICYmIChzdGF0aWNfY2FzdDxpbnQ4X3Q+KG1hZ2ljID4+IDE2KSAmIFRDb21wYWN0UHJvdG9jb2w6OlZFUlNJT05fTUFTSykKKyAgICAgICAgICAgICAgICAgICAgICA9PSBUQ29tcGFjdFByb3RvY29sOjpWRVJTSU9OX04pIHsKKyAgICAgIGNsaWVudFR5cGUgPSBUSFJJRlRfRlJBTUVEX0NPTVBBQ1Q7CisgICAgICB0cmFuc3BvcnRfLT5yZWFkQWxsKHJCdWZfLmdldCgpICsgNCwgc3ogLSA0KTsKKyAgICAgIHNldFJlYWRCdWZmZXIockJ1Zl8uZ2V0KCksIHN6KTsKKyAgICB9IGVsc2UgaWYgKEhFQURFUl9NQUdJQyA9PSAobWFnaWMgJiBIRUFERVJfTUFTSykpIHsKKyAgICAgIGlmIChzeiA8IDEwKSB7CisgICAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Q09SUlVQVEVEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlYWRlciB0cmFuc3BvcnQgZnJhbWUgaXMgdG9vIHNtYWxsIik7CisgICAgICB9CisKKyAgICAgIHRyYW5zcG9ydF8tPnJlYWRBbGwockJ1Zl8uZ2V0KCkgKyA0LCBzeiAtIDQpOworCisgICAgICAvLyBoZWFkZXIgZm9ybWF0CisgICAgICBjbGllbnRUeXBlID0gVEhSSUZUX0hFQURFUl9DTElFTlRfVFlQRTsKKyAgICAgIC8vIGZsYWdzCisgICAgICBmbGFncyA9IG1hZ2ljICYgRkxBR1NfTUFTSzsKKyAgICAgIC8vIHNlcUlkCisgICAgICB1aW50MzJfdCBzZXFJZF9uOworICAgICAgbWVtY3B5KCZzZXFJZF9uLCByQnVmXy5nZXQoKSArIDQsIHNpemVvZihzZXFJZF9uKSk7CisgICAgICBzZXFJZCA9IG50b2hsKHNlcUlkX24pOworICAgICAgLy8gaGVhZGVyIHNpemUKKyAgICAgIHVpbnQxNl90IGhlYWRlclNpemVfbjsKKyAgICAgIG1lbWNweSgmaGVhZGVyU2l6ZV9uLCByQnVmXy5nZXQoKSArIDgsIHNpemVvZihoZWFkZXJTaXplX24pKTsKKyAgICAgIHVpbnQxNl90IGhlYWRlclNpemUgPSBudG9ocyhoZWFkZXJTaXplX24pOworICAgICAgc2V0UmVhZEJ1ZmZlcihyQnVmXy5nZXQoKSwgc3opOworICAgICAgcmVhZEhlYWRlckZvcm1hdChoZWFkZXJTaXplLCBzeik7CisgICAgfSBlbHNlIHsKKyAgICAgIGNsaWVudFR5cGUgPSBUSFJJRlRfVU5LTk9XTl9DTElFTlRfVFlQRTsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZGV0ZWN0IGNsaWVudCB0cmFuc3BvcnQgdHlwZSIpOworICAgIH0KKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvKioKKyAqIFJlYWRzIGEgc3RyaW5nIGZyb20gcHRyLCB0YWtpbmcgY2FyZSBub3QgdG8gcmVhY2ggaGVhZGVyQm91bmRhcnkKKyAqIEFkdmFuY2VzIHB0ciBvbiBzdWNjZXNzCisgKgorICogQHBhcmFtICAgc3RyICAgICAgICAgICAgIG91dHB1dCBzdHJpbmcKKyAqIEB0aHJvd3MgIENPUlJVUFRFRF9EQVRBICBpZiBzaXplIG9mIHN0cmluZyBleGNlZWRzIGJvdW5kYXJ5CisgKi8KK3ZvaWQgVEhlYWRlclRyYW5zcG9ydDo6cmVhZFN0cmluZyh1aW50OF90KiYgcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG91dCAqLyBzdHJpbmcmIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNvbnN0KiBoZWFkZXJCb3VuZGFyeSkgeworICBpbnQzMl90IHN0ckxlbjsKKworICB1aW50MzJfdCBieXRlcyA9IHJlYWRWYXJpbnQzMihwdHIsICZzdHJMZW4sIGhlYWRlckJvdW5kYXJ5KTsKKyAgaWYgKHN0ckxlbiA+IGhlYWRlckJvdW5kYXJ5IC0gcHRyKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpDT1JSVVBURURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmZvIGhlYWRlciBsZW5ndGggZXhjZWVkcyBoZWFkZXIgc2l6ZSIpOworICB9CisgIHB0ciArPSBieXRlczsKKyAgc3RyLmFzc2lnbihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihwdHIpLCBzdHJMZW4pOworICBwdHIgKz0gc3RyTGVuOworfQorCit2b2lkIFRIZWFkZXJUcmFuc3BvcnQ6OnJlYWRIZWFkZXJGb3JtYXQodWludDE2X3QgaGVhZGVyU2l6ZSwgdWludDMyX3Qgc3opIHsKKyAgcmVhZFRyYW5zXy5jbGVhcigpOyAgIC8vIENsZWFyIG91dCBhbnkgcHJldmlvdXMgdHJhbnNmb3Jtcy4KKyAgcmVhZEhlYWRlcnNfLmNsZWFyKCk7IC8vIENsZWFyIG91dCBhbnkgcHJldmlvdXMgaGVhZGVycy4KKworICAvLyBza2lwIG92ZXIgYWxyZWFkeSBwcm9jZXNzZWQgbWFnaWMoNCksIHNlcUlkKDQpLCBoZWFkZXJTaXplKDIpCisgIHVpbnQ4X3QqIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KHJCdWZfLmdldCgpICsgMTApOworCisgIC8vIENhdGNoIGludGVnZXIgb3ZlcmZsb3csIGNoZWNrIGZvciByZWFzb25hYmxlIGhlYWRlciBzaXplCisgIGlmIChoZWFkZXJTaXplID49IDE2Mzg0KSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpDT1JSVVBURURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWFkZXIgc2l6ZSBpcyB1bnJlYXNvbmFibGUiKTsKKyAgfQorICBoZWFkZXJTaXplICo9IDQ7CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGhlYWRlckJvdW5kYXJ5ID0gcHRyICsgaGVhZGVyU2l6ZTsKKyAgaWYgKGhlYWRlclNpemUgPiBzeikgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Q09SUlVQVEVEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVhZGVyIHNpemUgaXMgbGFyZ2VyIHRoYW4gZnJhbWUiKTsKKyAgfQorICB1aW50OF90KiBkYXRhID0gcHRyICsgaGVhZGVyU2l6ZTsKKyAgcHRyICs9IHJlYWRWYXJpbnQxNihwdHIsICZwcm90b0lkLCBoZWFkZXJCb3VuZGFyeSk7CisgIGludDE2X3QgbnVtVHJhbnNmb3JtczsKKyAgcHRyICs9IHJlYWRWYXJpbnQxNihwdHIsICZudW1UcmFuc2Zvcm1zLCBoZWFkZXJCb3VuZGFyeSk7CisKKyAgLy8gRm9yIG5vdyBhbGwgdHJhbnNmb3JtcyBjb25zaXN0IG9mIG9ubHkgdGhlIElELCBub3QgZGF0YS4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1UcmFuc2Zvcm1zOyBpKyspIHsKKyAgICBpbnQzMl90IHRyYW5zSWQ7CisgICAgcHRyICs9IHJlYWRWYXJpbnQzMihwdHIsICZ0cmFuc0lkLCBoZWFkZXJCb3VuZGFyeSk7CisKKyAgICByZWFkVHJhbnNfLnB1c2hfYmFjayh0cmFuc0lkKTsKKyAgfQorCisgIC8vIEluZm8gaGVhZGVycworICB3aGlsZSAocHRyIDwgaGVhZGVyQm91bmRhcnkpIHsKKyAgICBpbnQzMl90IGluZm9JZDsKKyAgICBwdHIgKz0gcmVhZFZhcmludDMyKHB0ciwgJmluZm9JZCwgaGVhZGVyQm91bmRhcnkpOworCisgICAgaWYgKGluZm9JZCA9PSAwKSB7CisgICAgICAvLyBoZWFkZXIgcGFkZGluZworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChpbmZvSWQgPj0gaW5mb0lkVHlwZTo6RU5EKSB7CisgICAgICAvLyBjYW5ub3QgaGFuZGxlIGluZm9JZAorICAgICAgYnJlYWs7CisgICAgfQorICAgIHN3aXRjaCAoaW5mb0lkKSB7CisgICAgY2FzZSBpbmZvSWRUeXBlOjpLRVlWQUxVRToKKyAgICAgIC8vIFByb2Nlc3Mga2V5LXZhbHVlIGhlYWRlcnMKKyAgICAgIHVpbnQzMl90IG51bUtWSGVhZGVyczsKKyAgICAgIHB0ciArPSByZWFkVmFyaW50MzIocHRyLCAoaW50MzJfdCopJm51bUtWSGVhZGVycywgaGVhZGVyQm91bmRhcnkpOworICAgICAgLy8gY29udGludWUgdW50aWwgd2UgcmVhY2ggKHBhZGRlZCkgZW5kIG9mIHBhY2tldAorICAgICAgd2hpbGUgKG51bUtWSGVhZGVycy0tICYmIHB0ciA8IGhlYWRlckJvdW5kYXJ5KSB7CisgICAgICAgIC8vIGZvcm1hdDoga2V5OyB2YWx1ZQorICAgICAgICAvLyBib3RoOiBsZW5ndGggKHZhcmludDMyKTsgdmFsdWUgKHN0cmluZykKKyAgICAgICAgc3RyaW5nIGtleSwgdmFsdWU7CisgICAgICAgIHJlYWRTdHJpbmcocHRyLCBrZXksIGhlYWRlckJvdW5kYXJ5KTsKKyAgICAgICAgLy8gdmFsdWUKKyAgICAgICAgcmVhZFN0cmluZyhwdHIsIHZhbHVlLCBoZWFkZXJCb3VuZGFyeSk7CisgICAgICAgIC8vIHNhdmUgdG8gaGVhZGVycworICAgICAgICByZWFkSGVhZGVyc19ba2V5XSA9IHZhbHVlOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgLy8gVW50cmFuc2Zvcm0gdGhlIGRhdGEgc2VjdGlvbi4gIHJCdWYgd2lsbCBjb250YWluIHJlc3VsdC4KKyAgdW50cmFuc2Zvcm0oZGF0YSwgc2FmZV9udW1lcmljX2Nhc3Q8dWludDMyX3Q+KHN0YXRpY19jYXN0PHB0cmRpZmZfdD4oc3opIC0gKGRhdGEgLSByQnVmXy5nZXQoKSkpKTsKK30KKwordm9pZCBUSGVhZGVyVHJhbnNwb3J0Ojp1bnRyYW5zZm9ybSh1aW50OF90KiBwdHIsIHVpbnQzMl90IHN6KSB7CisgIC8vIFVwZGF0ZSB0aGUgdHJhbnNmb3JtIGJ1ZmZlciBzaXplIGlmIG5lZWRlZAorICByZXNpemVUcmFuc2Zvcm1CdWZmZXIoKTsKKworICBmb3IgKHZlY3Rvcjx1aW50MTZfdD46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gcmVhZFRyYW5zXy5iZWdpbigpOyBpdCAhPSByZWFkVHJhbnNfLmVuZCgpOyArK2l0KSB7CisgICAgY29uc3QgdWludDE2X3QgdHJhbnNJZCA9ICppdDsKKworICAgIGlmICh0cmFuc0lkID09IFpMSUJfVFJBTlNGT1JNKSB7CisgICAgICB6X3N0cmVhbSBzdHJlYW07CisgICAgICBpbnQgZXJyOworCisgICAgICBzdHJlYW0ubmV4dF9pbiA9IHB0cjsKKyAgICAgIHN0cmVhbS5hdmFpbF9pbiA9IHN6OworCisgICAgICAvLyBTZXR0aW5nIHRoZXNlIHRvIDAgbWVhbnMgdXNlIHRoZSBkZWZhdWx0IGZyZWUvYWxsb2MgZnVuY3Rpb25zCisgICAgICBzdHJlYW0uemFsbG9jID0gKGFsbG9jX2Z1bmMpMDsKKyAgICAgIHN0cmVhbS56ZnJlZSA9IChmcmVlX2Z1bmMpMDsKKyAgICAgIHN0cmVhbS5vcGFxdWUgPSAodm9pZHBmKTA7CisgICAgICBlcnIgPSBpbmZsYXRlSW5pdCgmc3RyZWFtKTsKKyAgICAgIGlmIChlcnIgIT0gWl9PSykgeworICAgICAgICB0aHJvdyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpNSVNTSU5HX1JFU1VMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciB3aGlsZSB6bGliIGRlZmxhdGVJbml0Iik7CisgICAgICB9CisgICAgICBzdHJlYW0ubmV4dF9vdXQgPSB0QnVmXy5nZXQoKTsKKyAgICAgIHN0cmVhbS5hdmFpbF9vdXQgPSB0QnVmU2l6ZV87CisgICAgICBlcnIgPSBpbmZsYXRlKCZzdHJlYW0sIFpfRklOSVNIKTsKKyAgICAgIGlmIChlcnIgIT0gWl9TVFJFQU1fRU5EIHx8IHN0cmVhbS5hdmFpbF9vdXQgPT0gMCkgeworICAgICAgICB0aHJvdyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpNSVNTSU5HX1JFU1VMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciB3aGlsZSB6bGliIGRlZmxhdGUiKTsKKyAgICAgIH0KKyAgICAgIHN6ID0gc3RyZWFtLnRvdGFsX291dDsKKworICAgICAgZXJyID0gaW5mbGF0ZUVuZCgmc3RyZWFtKTsKKyAgICAgIGlmIChlcnIgIT0gWl9PSykgeworICAgICAgICB0aHJvdyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpNSVNTSU5HX1JFU1VMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciB3aGlsZSB6bGliIGRlZmxhdGVFbmQiKTsKKyAgICAgIH0KKworICAgICAgbWVtY3B5KHB0ciwgdEJ1Zl8uZ2V0KCksIHN6KTsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6TUlTU0lOR19SRVNVTFQsICJVbmtub3duIHRyYW5zZm9ybSIpOworICAgIH0KKyAgfQorCisgIHNldFJlYWRCdWZmZXIocHRyLCBzeik7Cit9CisKKy8qKgorICogV2UgbWF5IGhhdmUgdXBkYXRlZCB0aGUgd0J1ZiBzaXplLCB1cGRhdGUgdGhlIHRCdWYgc2l6ZSB0byBtYXRjaC4KKyAqIFNob3VsZCBiZSBjYWxsZWQgaW4gdHJhbnNmb3JtLgorICoKKyAqIFRoZSBidWZmZXIgc2hvdWxkIGJlIHNsaWdodGx5IGxhcmdlciB0aGFuIHdyaXRlIGJ1ZmZlciBzaXplIGR1ZSB0bworICogY29tcHJlc3Npb24gdHJhbnNmb3JtcyAodGhhdCBtYXkgc2xpZ2h0bHkgZ3JvdyBvbiBzbWFsbCBmcmFtZSBzaXplcykKKyAqLwordm9pZCBUSGVhZGVyVHJhbnNwb3J0OjpyZXNpemVUcmFuc2Zvcm1CdWZmZXIodWludDMyX3QgYWRkaXRpb25hbFNpemUpIHsKKyAgaWYgKHRCdWZTaXplXyA8IHdCdWZTaXplXyArIERFRkFVTFRfQlVGRkVSX1NJWkUpIHsKKyAgICB1aW50MzJfdCBuZXdfc2l6ZSA9IHdCdWZTaXplXyArIERFRkFVTFRfQlVGRkVSX1NJWkUgKyBhZGRpdGlvbmFsU2l6ZTsKKyAgICB1aW50OF90KiBuZXdfYnVmID0gbmV3IHVpbnQ4X3RbbmV3X3NpemVdOworICAgIHRCdWZfLnJlc2V0KG5ld19idWYpOworICAgIHRCdWZTaXplXyA9IG5ld19zaXplOworICB9Cit9CisKK3ZvaWQgVEhlYWRlclRyYW5zcG9ydDo6dHJhbnNmb3JtKHVpbnQ4X3QqIHB0ciwgdWludDMyX3Qgc3opIHsKKyAgLy8gVXBkYXRlIHRoZSB0cmFuc2Zvcm0gYnVmZmVyIHNpemUgaWYgbmVlZGVkCisgIHJlc2l6ZVRyYW5zZm9ybUJ1ZmZlcigpOworCisgIGZvciAodmVjdG9yPHVpbnQxNl90Pjo6Y29uc3RfaXRlcmF0b3IgaXQgPSB3cml0ZVRyYW5zXy5iZWdpbigpOyBpdCAhPSB3cml0ZVRyYW5zXy5lbmQoKTsgKytpdCkgeworICAgIGNvbnN0IHVpbnQxNl90IHRyYW5zSWQgPSAqaXQ7CisKKyAgICBpZiAodHJhbnNJZCA9PSBaTElCX1RSQU5TRk9STSkgeworICAgICAgel9zdHJlYW0gc3RyZWFtOworICAgICAgaW50IGVycjsKKworICAgICAgc3RyZWFtLm5leHRfaW4gPSBwdHI7CisgICAgICBzdHJlYW0uYXZhaWxfaW4gPSBzejsKKworICAgICAgc3RyZWFtLnphbGxvYyA9IChhbGxvY19mdW5jKTA7CisgICAgICBzdHJlYW0uemZyZWUgPSAoZnJlZV9mdW5jKTA7CisgICAgICBzdHJlYW0ub3BhcXVlID0gKHZvaWRwZikwOworICAgICAgZXJyID0gZGVmbGF0ZUluaXQoJnN0cmVhbSwgWl9ERUZBVUxUX0NPTVBSRVNTSU9OKTsKKyAgICAgIGlmIChlcnIgIT0gWl9PSykgeworICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkNPUlJVUFRFRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciB3aGlsZSB6bGliIGRlZmxhdGVJbml0Iik7CisgICAgICB9CisgICAgICB1aW50MzJfdCB0YnVmX3NpemUgPSAwOworICAgICAgd2hpbGUgKGVyciA9PSBaX09LKSB7CisgICAgICAgIHJlc2l6ZVRyYW5zZm9ybUJ1ZmZlcih0YnVmX3NpemUpOworCisgICAgICAgIHN0cmVhbS5uZXh0X291dCA9IHRCdWZfLmdldCgpOworICAgICAgICBzdHJlYW0uYXZhaWxfb3V0ID0gdEJ1ZlNpemVfOworICAgICAgICBlcnIgPSBkZWZsYXRlKCZzdHJlYW0sIFpfRklOSVNIKTsKKyAgICAgICAgdGJ1Zl9zaXplICs9IERFRkFVTFRfQlVGRkVSX1NJWkU7CisgICAgICB9CisgICAgICBzeiA9IHN0cmVhbS50b3RhbF9vdXQ7CisKKyAgICAgIGVyciA9IGRlZmxhdGVFbmQoJnN0cmVhbSk7CisgICAgICBpZiAoZXJyICE9IFpfT0spIHsKKyAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpDT1JSVVBURURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3Igd2hpbGUgemxpYiBkZWZsYXRlRW5kIik7CisgICAgICB9CisKKyAgICAgIG1lbWNweShwdHIsIHRCdWZfLmdldCgpLCBzeik7CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Q09SUlVQVEVEX0RBVEEsICJVbmtub3duIHRyYW5zZm9ybSIpOworICAgIH0KKyAgfQorCisgIHdCYXNlXyA9IHdCdWZfLmdldCgpICsgc3o7Cit9CisKK3ZvaWQgVEhlYWRlclRyYW5zcG9ydDo6cmVzZXRQcm90b2NvbCgpIHsKKyAgLy8gU2V0IHRvIGFueXRoaW5nIGV4Y2VwdCBIVFRQIHR5cGUgc28gd2UgZG9uJ3QgZmx1c2ggYWdhaW4KKyAgY2xpZW50VHlwZSA9IFRIUklGVF9IRUFERVJfQ0xJRU5UX1RZUEU7CisKKyAgLy8gUmVhZCB0aGUgaGVhZGVyIGFuZCBkZWNpZGUgd2hpY2ggcHJvdG9jb2wgdG8gZ28gd2l0aAorICByZWFkRnJhbWUoKTsKK30KKwordWludDMyX3QgVEhlYWRlclRyYW5zcG9ydDo6Z2V0V3JpdGVCeXRlcygpIHsKKyAgcmV0dXJuIHNhZmVfbnVtZXJpY19jYXN0PHVpbnQzMl90Pih3QmFzZV8gLSB3QnVmXy5nZXQoKSk7Cit9CisKKy8qKgorICogV3JpdGVzIGEgc3RyaW5nIHRvIGEgYnl0ZSBidWZmZXIsIGFzIHNpemUgKHZhcmludDMyKSArIHN0cmluZyAobm9uLW51bGwKKyAqIHRlcm1pbmF0ZWQpCisgKiBBdXRvbWF0aWNhbGx5IGFkdmFuY2VzIHB0ciB0byBhZnRlciB0aGUgd3JpdHRlbiBwb3J0aW9uCisgKi8KK3ZvaWQgVEhlYWRlclRyYW5zcG9ydDo6d3JpdGVTdHJpbmcodWludDhfdComIHB0ciwgY29uc3Qgc3RyaW5nJiBzdHIpIHsKKyAgaW50MzJfdCBzdHJMZW4gPSBzYWZlX251bWVyaWNfY2FzdDxpbnQzMl90PihzdHIubGVuZ3RoKCkpOworICBwdHIgKz0gd3JpdGVWYXJpbnQzMihzdHJMZW4sIHB0cik7CisgIG1lbWNweShwdHIsIHN0ci5jX3N0cigpLCBzdHJMZW4pOyAvLyBubyBuZWVkIHRvIHdyaXRlIFwwCisgIHB0ciArPSBzdHJMZW47Cit9CisKK3ZvaWQgVEhlYWRlclRyYW5zcG9ydDo6c2V0SGVhZGVyKGNvbnN0IHN0cmluZyYga2V5LCBjb25zdCBzdHJpbmcmIHZhbHVlKSB7CisgIHdyaXRlSGVhZGVyc19ba2V5XSA9IHZhbHVlOworfQorCit1aW50MzJfdCBUSGVhZGVyVHJhbnNwb3J0OjpnZXRNYXhXcml0ZUhlYWRlcnNTaXplKCkgY29uc3QgeworICBzaXplX3QgbWF4V3JpdGVIZWFkZXJzU2l6ZSA9IDA7CisgIFRIZWFkZXJUcmFuc3BvcnQ6OlN0cmluZ1RvU3RyaW5nTWFwOjpjb25zdF9pdGVyYXRvciBpdDsKKyAgZm9yIChpdCA9IHdyaXRlSGVhZGVyc18uYmVnaW4oKTsgaXQgIT0gd3JpdGVIZWFkZXJzXy5lbmQoKTsgKytpdCkgeworICAgIC8vIGFkZCBzaXplcyBvZiBrZXkgYW5kIHZhbHVlIHRvIG1heFdyaXRlSGVhZGVyc1NpemUKKyAgICAvLyAyIHZhcmludHMzMiArIHRoZSBzdHJpbmdzIHRoZW1zZWx2ZXMKKyAgICBtYXhXcml0ZUhlYWRlcnNTaXplICs9IDUgKyA1ICsgKGl0LT5maXJzdCkubGVuZ3RoKCkgKyAoaXQtPnNlY29uZCkubGVuZ3RoKCk7CisgIH0KKyAgcmV0dXJuIHNhZmVfbnVtZXJpY19jYXN0PHVpbnQzMl90PihtYXhXcml0ZUhlYWRlcnNTaXplKTsKK30KKwordm9pZCBUSGVhZGVyVHJhbnNwb3J0OjpjbGVhckhlYWRlcnMoKSB7CisgIHdyaXRlSGVhZGVyc18uY2xlYXIoKTsKK30KKwordm9pZCBUSGVhZGVyVHJhbnNwb3J0OjpmbHVzaCgpIHsKKyAgLy8gV3JpdGUgb3V0IGFueSBkYXRhIHdhaXRpbmcgaW4gdGhlIHdyaXRlIGJ1ZmZlci4KKyAgdWludDMyX3QgaGF2ZUJ5dGVzID0gZ2V0V3JpdGVCeXRlcygpOworCisgIGlmIChjbGllbnRUeXBlID09IFRIUklGVF9IRUFERVJfQ0xJRU5UX1RZUEUpIHsKKyAgICB0cmFuc2Zvcm0od0J1Zl8uZ2V0KCksIGhhdmVCeXRlcyk7CisgICAgaGF2ZUJ5dGVzID0gZ2V0V3JpdGVCeXRlcygpOyAvLyB0cmFuc2Zvcm0gbWF5IGhhdmUgY2hhbmdlZCB0aGUgc2l6ZQorICB9CisKKyAgLy8gTm90ZSB0aGF0IHdlIHJlc2V0IHdCYXNlXyBwcmlvciB0byB0aGUgdW5kZXJseWluZyB3cml0ZQorICAvLyB0byBlbnN1cmUgd2UncmUgaW4gYSBzYW5lIHN0YXRlIChpLmUuIGludGVybmFsIGJ1ZmZlciBjbGVhbmVkKQorICAvLyBpZiB0aGUgdW5kZXJseWluZyB3cml0ZSB0aHJvd3MgdXAgYW4gZXhjZXB0aW9uCisgIHdCYXNlXyA9IHdCdWZfLmdldCgpOworCisgIGlmIChoYXZlQnl0ZXMgPiBNQVhfRlJBTUVfU0laRSkgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Q09SUlVQVEVEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXR0ZW1wdGluZyB0byBzZW5kIGZyYW1lIHRoYXQgaXMgdG9vIGxhcmdlIik7CisgIH0KKworICBpZiAoY2xpZW50VHlwZSA9PSBUSFJJRlRfSEVBREVSX0NMSUVOVF9UWVBFKSB7CisgICAgLy8gaGVhZGVyIHNpemUgd2lsbCBuZWVkIHRvIGJlIHVwZGF0ZWQgYXQgdGhlIGVuZCBiZWNhdXNlIG9mIHZhcmludHMuCisgICAgLy8gTWFrZSBpdCBiaWcgZW5vdWdoIGhlcmUgZm9yIG1heCB2YXJpbnQgc2l6ZSwgcGx1cyA0IGZvciBwYWRkaW5nLgorICAgIHVpbnQzMl90IGhlYWRlclNpemUgPSAoMiArIGdldE51bVRyYW5zZm9ybXMoKSkgKiBUSFJJRlRfTUFYX1ZBUklOVDMyX0JZVEVTICsgNDsKKyAgICAvLyBhZGQgYXBwcm94aW1hdGUgc2l6ZSBvZiBpbmZvIGhlYWRlcnMKKyAgICBoZWFkZXJTaXplICs9IGdldE1heFdyaXRlSGVhZGVyc1NpemUoKTsKKworICAgIC8vIFBrdCBzaXplCisgICAgdWludDMyX3QgbWF4U3pIYm8gPSBoZWFkZXJTaXplICsgaGF2ZUJ5dGVzIC8vIHRocmlmdCBoZWFkZXIgKyBwYXlsb2FkCisgICAgICAgICAgICAgICAgICAgICAgICArIDEwOyAgICAgICAgICAgICAgICAgIC8vIGNvbW1vbiBoZWFkZXIgc2VjdGlvbgorICAgIHVpbnQ4X3QqIHBrdCA9IHRCdWZfLmdldCgpOworICAgIHVpbnQ4X3QqIGhlYWRlclN0YXJ0OworICAgIHVpbnQ4X3QqIGhlYWRlclNpemVQdHI7CisgICAgdWludDhfdCogcGt0U3RhcnQgPSBwa3Q7CisKKyAgICBpZiAobWF4U3pIYm8gPiB0QnVmU2l6ZV8pIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Q09SUlVQVEVEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBdHRlbXB0aW5nIHRvIGhlYWRlciBmcmFtZSB0aGF0IGlzIHRvbyBsYXJnZSIpOworICAgIH0KKworICAgIHVpbnQzMl90IHN6SGJvOworICAgIHVpbnQzMl90IHN6TmJvOworICAgIHVpbnQxNl90IGhlYWRlclNpemVOOworCisgICAgLy8gRml4dXAgc3pIYm8gbGF0ZXIKKyAgICBwa3QgKz0gc2l6ZW9mKHN6TmJvKTsKKyAgICB1aW50MTZfdCBoZWFkZXJOID0gaHRvbnMoSEVBREVSX01BR0lDID4+IDE2KTsKKyAgICBtZW1jcHkocGt0LCAmaGVhZGVyTiwgc2l6ZW9mKGhlYWRlck4pKTsKKyAgICBwa3QgKz0gc2l6ZW9mKGhlYWRlck4pOworICAgIHVpbnQxNl90IGZsYWdzTiA9IGh0b25zKGZsYWdzKTsKKyAgICBtZW1jcHkocGt0LCAmZmxhZ3NOLCBzaXplb2YoZmxhZ3NOKSk7CisgICAgcGt0ICs9IHNpemVvZihmbGFnc04pOworICAgIHVpbnQzMl90IHNlcUlkTiA9IGh0b25sKHNlcUlkKTsKKyAgICBtZW1jcHkocGt0LCAmc2VxSWROLCBzaXplb2Yoc2VxSWROKSk7CisgICAgcGt0ICs9IHNpemVvZihzZXFJZE4pOworICAgIGhlYWRlclNpemVQdHIgPSBwa3Q7CisgICAgLy8gRml4dXAgaGVhZGVyU2l6ZU4gbGF0ZXIKKyAgICBwa3QgKz0gc2l6ZW9mKGhlYWRlclNpemVOKTsKKyAgICBoZWFkZXJTdGFydCA9IHBrdDsKKworICAgIHBrdCArPSB3cml0ZVZhcmludDMyKHByb3RvSWQsIHBrdCk7CisgICAgcGt0ICs9IHdyaXRlVmFyaW50MzIoZ2V0TnVtVHJhbnNmb3JtcygpLCBwa3QpOworCisgICAgLy8gRm9yIG5vdywgZWFjaCB0cmFuc2Zvcm0gaXMgb25seSB0aGUgSUQsIG5vIGZvbGxvd2luZyBkYXRhLgorICAgIGZvciAodmVjdG9yPHVpbnQxNl90Pjo6Y29uc3RfaXRlcmF0b3IgaXQgPSB3cml0ZVRyYW5zXy5iZWdpbigpOyBpdCAhPSB3cml0ZVRyYW5zXy5lbmQoKTsgKytpdCkgeworICAgICAgcGt0ICs9IHdyaXRlVmFyaW50MzIoKml0LCBwa3QpOworICAgIH0KKworICAgIC8vIHdyaXRlIGluZm8gaGVhZGVycworCisgICAgLy8gZm9yIG5vdyBvbmx5IHdyaXRlIGt2LWhlYWRlcnMKKyAgICBpbnQzMl90IGhlYWRlckNvdW50ID0gc2FmZV9udW1lcmljX2Nhc3Q8aW50MzJfdD4od3JpdGVIZWFkZXJzXy5zaXplKCkpOworICAgIGlmIChoZWFkZXJDb3VudCA+IDApIHsKKyAgICAgIHBrdCArPSB3cml0ZVZhcmludDMyKGluZm9JZFR5cGU6OktFWVZBTFVFLCBwa3QpOworICAgICAgLy8gV3JpdGUga2V5LXZhbHVlIGhlYWRlcnMgY291bnQKKyAgICAgIHBrdCArPSB3cml0ZVZhcmludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KGhlYWRlckNvdW50KSwgcGt0KTsKKyAgICAgIC8vIFdyaXRlIGluZm8gaGVhZGVycworICAgICAgbWFwPHN0cmluZywgc3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXQ7CisgICAgICBmb3IgKGl0ID0gd3JpdGVIZWFkZXJzXy5iZWdpbigpOyBpdCAhPSB3cml0ZUhlYWRlcnNfLmVuZCgpOyArK2l0KSB7CisgICAgICAgIHdyaXRlU3RyaW5nKHBrdCwgaXQtPmZpcnN0KTsgIC8vIGtleQorICAgICAgICB3cml0ZVN0cmluZyhwa3QsIGl0LT5zZWNvbmQpOyAvLyB2YWx1ZQorICAgICAgfQorICAgICAgd3JpdGVIZWFkZXJzXy5jbGVhcigpOworICAgIH0KKworICAgIC8vIEZpeHVwcyBhZnRlciB2YXJpbnQgc2l6ZSBjYWxjdWxhdGlvbnMKKyAgICBoZWFkZXJTaXplID0gc2FmZV9udW1lcmljX2Nhc3Q8dWludDMyX3Q+KHBrdCAtIGhlYWRlclN0YXJ0KTsKKyAgICB1aW50OF90IHBhZGRpbmcgPSA0IC0gKGhlYWRlclNpemUgJSA0KTsKKyAgICBoZWFkZXJTaXplICs9IHBhZGRpbmc7CisKKyAgICAvLyBQYWQgb3V0IHBrdCB3aXRoIDB4MDAKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhZGRpbmc7IGkrKykgeworICAgICAgKihwa3QrKykgPSAweDAwOworICAgIH0KKworICAgIC8vIFBrdCBzaXplCisgICAgcHRyZGlmZl90IHN6SGJwID0gKGhlYWRlclN0YXJ0IC0gcGt0U3RhcnQgLSA0KTsKKyAgICBpZiAoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHN6SGJwKSA+IHN0YXRpY19jYXN0PHVpbnQ2NF90Pigoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD4oKS5tYXgpKCkpIC0gKGhlYWRlclNpemUgKyBoYXZlQnl0ZXMpKSB7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkNPUlJVUFRFRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVhZGVyIHNlY3Rpb24gc2l6ZSBpcyB1bnJlYXNvbmFibGUiKTsKKyAgICB9CisgICAgc3pIYm8gPSBoZWFkZXJTaXplICsgaGF2ZUJ5dGVzICAgICAgICAgIC8vIHRocmlmdCBoZWFkZXIgKyBwYXlsb2FkCisgICAgICAgICAgICArIHN0YXRpY19jYXN0PHVpbnQzMl90PihzekhicCk7IC8vIGNvbW1vbiBoZWFkZXIgc2VjdGlvbgorICAgIGhlYWRlclNpemVOID0gaHRvbnMoaGVhZGVyU2l6ZSAvIDQpOworICAgIG1lbWNweShoZWFkZXJTaXplUHRyLCAmaGVhZGVyU2l6ZU4sIHNpemVvZihoZWFkZXJTaXplTikpOworCisgICAgLy8gU2V0IGZyYW1pbmcgc2l6ZS4KKyAgICBzek5ibyA9IGh0b25sKHN6SGJvKTsKKyAgICBtZW1jcHkocGt0U3RhcnQsICZzek5ibywgc2l6ZW9mKHN6TmJvKSk7CisKKyAgICBvdXRUcmFuc3BvcnRfLT53cml0ZShwa3RTdGFydCwgc3pIYm8gLSBoYXZlQnl0ZXMgKyA0KTsKKyAgICBvdXRUcmFuc3BvcnRfLT53cml0ZSh3QnVmXy5nZXQoKSwgaGF2ZUJ5dGVzKTsKKyAgfSBlbHNlIGlmIChjbGllbnRUeXBlID09IFRIUklGVF9GUkFNRURfQklOQVJZIHx8IGNsaWVudFR5cGUgPT0gVEhSSUZUX0ZSQU1FRF9DT01QQUNUKSB7CisgICAgdWludDMyX3Qgc3pIYm8gPSAodWludDMyX3QpaGF2ZUJ5dGVzOworICAgIHVpbnQzMl90IHN6TmJvID0gaHRvbmwoc3pIYm8pOworCisgICAgb3V0VHJhbnNwb3J0Xy0+d3JpdGUocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oJnN6TmJvKSwgNCk7CisgICAgb3V0VHJhbnNwb3J0Xy0+d3JpdGUod0J1Zl8uZ2V0KCksIGhhdmVCeXRlcyk7CisgIH0gZWxzZSBpZiAoY2xpZW50VHlwZSA9PSBUSFJJRlRfVU5GUkFNRURfQklOQVJZIHx8IGNsaWVudFR5cGUgPT0gVEhSSUZUX1VORlJBTUVEX0NPTVBBQ1QpIHsKKyAgICBvdXRUcmFuc3BvcnRfLT53cml0ZSh3QnVmXy5nZXQoKSwgaGF2ZUJ5dGVzKTsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTLCAiVW5rbm93biBjbGllbnQgdHlwZSIpOworICB9CisKKyAgLy8gRmx1c2ggdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LgorICBvdXRUcmFuc3BvcnRfLT5mbHVzaCgpOworfQorCisvKioKKyAqIFJlYWQgYW4gaTE2IGZyb20gdGhlIHdpcmUgYXMgYSB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorICogaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gcmVhZCB1cCB0byAzIGJ5dGVzLgorICovCit1aW50MzJfdCBUSGVhZGVyVHJhbnNwb3J0OjpyZWFkVmFyaW50MTYodWludDhfdCBjb25zdCogcHRyLCBpbnQxNl90KiBpMTYsIHVpbnQ4X3QgY29uc3QqIGJvdW5kYXJ5KSB7CisgIGludDMyX3QgdmFsOworICB1aW50MzJfdCByc2l6ZSA9IHJlYWRWYXJpbnQzMihwdHIsICZ2YWwsIGJvdW5kYXJ5KTsKKyAgKmkxNiA9IChpbnQxNl90KXZhbDsKKyAgcmV0dXJuIHJzaXplOworfQorCisvKioKKyAqIFJlYWQgYW4gaTMyIGZyb20gdGhlIHdpcmUgYXMgYSB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorICogaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gcmVhZCB1cCB0byA1IGJ5dGVzLgorICovCit1aW50MzJfdCBUSGVhZGVyVHJhbnNwb3J0OjpyZWFkVmFyaW50MzIodWludDhfdCBjb25zdCogcHRyLCBpbnQzMl90KiBpMzIsIHVpbnQ4X3QgY29uc3QqIGJvdW5kYXJ5KSB7CisKKyAgdWludDMyX3QgcnNpemUgPSAwOworICB1aW50MzJfdCB2YWwgPSAwOworICBpbnQgc2hpZnQgPSAwOworCisgIHdoaWxlICh0cnVlKSB7CisgICAgaWYgKHB0ciA9PSBib3VuZGFyeSkgeworICAgICAgdGhyb3cgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6SU5WQUxJRF9NRVNTQUdFX1RZUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRyeWluZyB0byByZWFkIHBhc3QgaGVhZGVyIGJvdW5kYXJ5Iik7CisgICAgfQorICAgIHVpbnQ4X3QgYnl0ZSA9ICoocHRyKyspOworICAgIHJzaXplKys7CisgICAgdmFsIHw9ICh1aW50NjRfdCkoYnl0ZSAmIDB4N2YpIDw8IHNoaWZ0OworICAgIHNoaWZ0ICs9IDc7CisgICAgaWYgKCEoYnl0ZSAmIDB4ODApKSB7CisgICAgICAqaTMyID0gdmFsOworICAgICAgcmV0dXJuIHJzaXplOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIFdyaXRlIGFuIGkzMiBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTUgYnl0ZXMgb24gdGhlIHdpcmUuCisgKi8KK3VpbnQzMl90IFRIZWFkZXJUcmFuc3BvcnQ6OndyaXRlVmFyaW50MzIoaW50MzJfdCBuLCB1aW50OF90KiBwa3QpIHsKKyAgdWludDhfdCBidWZbNV07CisgIHVpbnQzMl90IHdzaXplID0gMDsKKworICB3aGlsZSAodHJ1ZSkgeworICAgIGlmICgobiAmIH4weDdGKSA9PSAwKSB7CisgICAgICBidWZbd3NpemUrK10gPSAoaW50OF90KW47CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgeworICAgICAgYnVmW3dzaXplKytdID0gKGludDhfdCkoKG4gJiAweDdGKSB8IDB4ODApOworICAgICAgbiA+Pj0gNzsKKyAgICB9CisgIH0KKworICAvLyBDYWxsZXIgd2lsbCBhZHZhbmNlIHBrdC4KKyAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHdzaXplOyBpKyspIHsKKyAgICBwa3RbaV0gPSBidWZbaV07CisgIH0KKworICByZXR1cm4gd3NpemU7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJUcmFuc3BvcnQ6OndyaXRlVmFyaW50MTYoaW50MTZfdCBuLCB1aW50OF90KiBwa3QpIHsKKyAgcmV0dXJuIHdyaXRlVmFyaW50MzIobiwgcGt0KTsKK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USGVhZGVyVHJhbnNwb3J0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIZWFkZXJUcmFuc3BvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmM1N2U2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USGVhZGVyVHJhbnNwb3J0LmgKQEAgLTAsMCArMSwyNzUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUSFJJRlRfVFJBTlNQT1JUX1RIRUFERVJUUkFOU1BPUlRfSF8KKyNkZWZpbmUgVEhSSUZUX1RSQU5TUE9SVF9USEVBREVSVFJBTlNQT1JUX0hfIDEKKworI2luY2x1ZGUgPGJpdHNldD4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8bWFwPgorCisjaWZkZWYgSEFWRV9TVERJTlRfSAorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VsaWYgSEFWRV9JTlRUWVBFU19ICisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Ym9vc3Qvc2NvcGVkX2FycmF5LmhwcD4KKworI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xUeXBlcy5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RWaXJ0dWFsVHJhbnNwb3J0Lmg+CisKK2VudW0gQ0xJRU5UX1RZUEUgeworICBUSFJJRlRfSEVBREVSX0NMSUVOVF9UWVBFID0gMCwKKyAgVEhSSUZUX0ZSQU1FRF9CSU5BUlkgPSAxLAorICBUSFJJRlRfVU5GUkFNRURfQklOQVJZID0gMiwKKyAgVEhSSUZUX0ZSQU1FRF9DT01QQUNUID0gMywKKyAgVEhSSUZUX1VORlJBTUVEX0NPTVBBQ1QgPSA0LAorICBUSFJJRlRfVU5LTk9XTl9DTElFTlRfVFlQRSA9IDUsCit9OworCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9DT01QQUNUX1BST1RPQ09MOworCisvKioKKyAqIEhlYWRlciB0cmFuc3BvcnQuIEFsbCB3cml0ZXMgZ28gaW50byBhbiBpbi1tZW1vcnkgYnVmZmVyIHVudGlsIGZsdXNoIGlzCisgKiBjYWxsZWQsIGF0IHdoaWNoIHBvaW50IHRoZSB0cmFuc3BvcnQgd3JpdGVzIHRoZSBsZW5ndGggb2YgdGhlIGVudGlyZQorICogYmluYXJ5IGNodW5rIGZvbGxvd2VkIGJ5IHRoZSBkYXRhIHBheWxvYWQuIFRoaXMgYWxsb3dzIHRoZSByZWNlaXZlciBvbiB0aGUKKyAqIG90aGVyIGVuZCB0byBhbHdheXMgZG8gZml4ZWQtbGVuZ3RoIHJlYWRzLgorICoKKyAqIFN1YmNsYXNzIFRGcmFtZWRUcmFuc3BvcnQgYmVjYXVzZSBtb3N0IG9mIHRoZSByZWFkL3dyaXRlIG1ldGhvZHMgYXJlIHNpbWlsYXIKKyAqIGFuZCBuZWVkIHNpbWlsYXIgYnVmZmVycy4gIE1ham9yIGNoYW5nZXMgYXJlIHJlYWRGcmFtZSAmIGZsdXNoLgorICoKKyAqIEhlYWRlciBUcmFuc3BvcnQgKm11c3QqIGJlIHRoZSBzYW1lIHRyYW5zcG9ydCBmb3IgYm90aCBpbnB1dCBhbmQKKyAqIG91dHB1dCB3aGVuIHVzZWQgb24gdGhlIHNlcnZlciBzaWRlIC0gY2xpZW50IHJlc3BvbnNlcyBzaG91bGQgYmUKKyAqIHRoZSBzYW1lIHByb3RvY29sIGFzIHRob3NlIGluIHRoZSByZXF1ZXN0LgorICovCitjbGFzcyBUSGVhZGVyVHJhbnNwb3J0IDogcHVibGljIFRWaXJ0dWFsVHJhbnNwb3J0PFRIZWFkZXJUcmFuc3BvcnQsIFRGcmFtZWRUcmFuc3BvcnQ+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IGludCBERUZBVUxUX0JVRkZFUl9TSVpFID0gNTEydTsKKyAgc3RhdGljIGNvbnN0IGludCBUSFJJRlRfTUFYX1ZBUklOVDMyX0JZVEVTID0gNTsKKworICAvLy8gVXNlIGRlZmF1bHQgYnVmZmVyIHNpemVzLgorICBleHBsaWNpdCBUSGVhZGVyVHJhbnNwb3J0KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiYgdHJhbnNwb3J0KQorICAgIDogVFZpcnR1YWxUcmFuc3BvcnQodHJhbnNwb3J0KSwKKyAgICAgIG91dFRyYW5zcG9ydF8odHJhbnNwb3J0KSwKKyAgICAgIHByb3RvSWQoVF9DT01QQUNUX1BST1RPQ09MKSwKKyAgICAgIGNsaWVudFR5cGUoVEhSSUZUX0hFQURFUl9DTElFTlRfVFlQRSksCisgICAgICBzZXFJZCgwKSwKKyAgICAgIGZsYWdzKDApLAorICAgICAgdEJ1ZlNpemVfKDApLAorICAgICAgdEJ1Zl8oTlVMTCkgeworICAgIGlmICghdHJhbnNwb3J0XykgdGhyb3cgc3RkOjppbnZhbGlkX2FyZ3VtZW50KCJ0cmFuc3BvcnQgaXMgZW1wdHkiKTsKKyAgICBpbml0QnVmZmVycygpOworICB9CisKKyAgVEhlYWRlclRyYW5zcG9ydChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gaW5UcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IG91dFRyYW5zcG9ydCkKKyAgICA6IFRWaXJ0dWFsVHJhbnNwb3J0KGluVHJhbnNwb3J0KSwKKyAgICAgIG91dFRyYW5zcG9ydF8ob3V0VHJhbnNwb3J0KSwKKyAgICAgIHByb3RvSWQoVF9DT01QQUNUX1BST1RPQ09MKSwKKyAgICAgIGNsaWVudFR5cGUoVEhSSUZUX0hFQURFUl9DTElFTlRfVFlQRSksCisgICAgICBzZXFJZCgwKSwKKyAgICAgIGZsYWdzKDApLAorICAgICAgdEJ1ZlNpemVfKDApLAorICAgICAgdEJ1Zl8oTlVMTCkgeworICAgIGlmICghdHJhbnNwb3J0XykgdGhyb3cgc3RkOjppbnZhbGlkX2FyZ3VtZW50KCJpblRyYW5zcG9ydCBpcyBlbXB0eSIpOworICAgIGlmICghb3V0VHJhbnNwb3J0XykgdGhyb3cgc3RkOjppbnZhbGlkX2FyZ3VtZW50KCJvdXRUcmFuc3BvcnQgaXMgZW1wdHkiKTsKKyAgICBpbml0QnVmZmVycygpOworICB9CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkU2xvdyh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisgIHZpcnR1YWwgdm9pZCBmbHVzaCgpOworCisgIHZvaWQgcmVzaXplVHJhbnNmb3JtQnVmZmVyKHVpbnQzMl90IGFkZGl0aW9uYWxTaXplID0gMCk7CisKKyAgdWludDE2X3QgZ2V0UHJvdG9jb2xJZCgpIGNvbnN0OworICB2b2lkIHNldFByb3RvY29sSWQodWludDE2X3QgcHJvdG9JZCkgeyB0aGlzLT5wcm90b0lkID0gcHJvdG9JZDsgfQorCisgIHZvaWQgcmVzZXRQcm90b2NvbCgpOworCisgIC8qKgorICAgKiBXZSBrbm93IHdlIGdvdCBhIHBhY2tldCBpbiBoZWFkZXIgZm9ybWF0IGhlcmUsIHRyeSB0byBwYXJzZSB0aGUgaGVhZGVyCisgICAqCisgICAqIEBwYXJhbSBoZWFkZXJTaXplIHNpemUgb2YgdGhlIGhlYWRlciBwb3J0aW9uCisgICAqIEBwYXJhbSBzeiBTaXplIG9mIHRoZSB3aG9sZSBtZXNzYWdlLCBpbmNsdWRpbmcgaGVhZGVyCisgICAqLworICB2b2lkIHJlYWRIZWFkZXJGb3JtYXQodWludDE2X3QgaGVhZGVyU2l6ZSwgdWludDMyX3Qgc3opOworCisgIC8qKgorICAgKiBVbnRyYW5zZm9ybSB0aGUgZGF0YSBiYXNlZCBvbiB0aGUgcmVjZWl2ZWQgaGVhZGVyIGZsYWdzCisgICAqIE9uIGNvbmNsdXNpb24gb2YgZnVuY3Rpb24sIHNldFJlYWRCdWZmZXIgaXMgY2FsbGVkIHdpdGggdGhlCisgICAqIHVudHJhbnNmb3JtZWQgZGF0YS4KKyAgICoKKyAgICogQHBhcmFtIHB0ciBwdHIgdG8gZGF0YQorICAgKiBAcGFyYW0gc2l6ZSBvZiBkYXRhCisgICAqLworICB2b2lkIHVudHJhbnNmb3JtKHVpbnQ4X3QqIHB0ciwgdWludDMyX3Qgc3opOworCisgIC8qKgorICAgKiBUcmFuc2Zvcm0gdGhlIGRhdGEgYmFzZWQgb24gb3VyIHdyaXRlIHRyYW5zZm9ybSBmbGFncworICAgKiBBdCBjb25jbHVzaW9uIG9mIGZ1bmN0aW9uIHRoZSB3cml0ZSBidWZmZXIgaXMgc2V0IHRvIHRoZQorICAgKiB0cmFuc2Zvcm1lZCBkYXRhLgorICAgKgorICAgKiBAcGFyYW0gcHRyIFB0ciB0byBkYXRhIHRvIHRyYW5zZm9ybQorICAgKiBAcGFyYW0gc3ogU2l6ZSBvZiBkYXRhIGJ1ZmZlcgorICAgKi8KKyAgdm9pZCB0cmFuc2Zvcm0odWludDhfdCogcHRyLCB1aW50MzJfdCBzeik7CisKKyAgdWludDE2X3QgZ2V0TnVtVHJhbnNmb3JtcygpIGNvbnN0IHsKKyAgICByZXR1cm4gc2FmZV9udW1lcmljX2Nhc3Q8dWludDE2X3Q+KHdyaXRlVHJhbnNfLnNpemUoKSk7CisgIH0KKworICB2b2lkIHNldFRyYW5zZm9ybSh1aW50MTZfdCB0cmFuc0lkKSB7IHdyaXRlVHJhbnNfLnB1c2hfYmFjayh0cmFuc0lkKTsgfQorCisgIC8vIEluZm8gaGVhZGVycworCisgIHR5cGVkZWYgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBTdHJpbmdUb1N0cmluZ01hcDsKKworICAvLyB0aGVzZSB3b3JrIHdpdGggd3JpdGUgaGVhZGVycworICB2b2lkIHNldEhlYWRlcihjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpOworCisgIHZvaWQgY2xlYXJIZWFkZXJzKCk7CisKKyAgU3RyaW5nVG9TdHJpbmdNYXAmIGdldFdyaXRlSGVhZGVycygpIHsgcmV0dXJuIHdyaXRlSGVhZGVyc187IH0KKworICAvLyB0aGVzZSB3b3JrIHdpdGggcmVhZCBoZWFkZXJzCisgIGNvbnN0IFN0cmluZ1RvU3RyaW5nTWFwJiBnZXRIZWFkZXJzKCkgY29uc3QgeyByZXR1cm4gcmVhZEhlYWRlcnNfOyB9CisKKyAgLy8gYWNjZXNzb3JzIGZvciBzZXFJZAorICBpbnQzMl90IGdldFNlcXVlbmNlTnVtYmVyKCkgY29uc3QgeyByZXR1cm4gc2VxSWQ7IH0KKyAgdm9pZCBzZXRTZXF1ZW5jZU51bWJlcihpbnQzMl90IHNlcUlkKSB7IHRoaXMtPnNlcUlkID0gc2VxSWQ7IH0KKworICBlbnVtIFRSQU5TRk9STVMgeworICAgIFpMSUJfVFJBTlNGT1JNID0gMHgwMSwKKyAgfTsKKworcHJvdGVjdGVkOgorICAvKioKKyAgICogUmVhZHMgYSBmcmFtZSBvZiBpbnB1dCBmcm9tIHRoZSB1bmRlcmx5aW5nIHN0cmVhbS4KKyAgICoKKyAgICogUmV0dXJucyB0cnVlIGlmIGEgZnJhbWUgd2FzIHJlYWQgc3VjY2Vzc2Z1bGx5LCBvciBmYWxzZSBvbiBFT0YuCisgICAqIChSYWlzZXMgYSBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIEVPRiBvY2N1cnMgYWZ0ZXIgYSBwYXJ0aWFsIGZyYW1lLikKKyAgICovCisgIHZpcnR1YWwgYm9vbCByZWFkRnJhbWUoKTsKKworICB2b2lkIGVuc3VyZVJlYWRCdWZmZXIodWludDMyX3Qgc3opOworICB1aW50MzJfdCBnZXRXcml0ZUJ5dGVzKCk7CisKKyAgdm9pZCBpbml0QnVmZmVycygpIHsKKyAgICBzZXRSZWFkQnVmZmVyKE5VTEwsIDApOworICAgIHNldFdyaXRlQnVmZmVyKHdCdWZfLmdldCgpLCB3QnVmU2l6ZV8pOworICB9CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IG91dFRyYW5zcG9ydF87CisKKyAgLy8gMCBhbmQgMTZ0aCBiaXRzIG11c3QgYmUgMCB0byBkaWZmZXJlbnRpYXRlIGZyb20gZnJhbWVkICYgdW5mcmFtZWQKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IEhFQURFUl9NQUdJQyA9IDB4MEZGRjAwMDA7CisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBIRUFERVJfTUFTSyA9IDB4RkZGRjAwMDA7CisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBGTEFHU19NQVNLID0gMHgwMDAwRkZGRjsKKworICBzdGF0aWMgY29uc3QgdWludDMyX3QgTUFYX0ZSQU1FX1NJWkUgPSAweDNGRkZGRkZGOworCisgIGludDE2X3QgcHJvdG9JZDsKKyAgdWludDE2X3QgY2xpZW50VHlwZTsKKyAgdWludDMyX3Qgc2VxSWQ7CisgIHVpbnQxNl90IGZsYWdzOworCisgIHN0ZDo6dmVjdG9yPHVpbnQxNl90PiByZWFkVHJhbnNfOworICBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4gd3JpdGVUcmFuc187CisKKyAgLy8gTWFwIHRvIHVzZSBmb3IgaGVhZGVycworICBTdHJpbmdUb1N0cmluZ01hcCByZWFkSGVhZGVyc187CisgIFN0cmluZ1RvU3RyaW5nTWFwIHdyaXRlSGVhZGVyc187CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd3JpdGUgay92IGhlYWRlcnMgY2FuIHRha2UKKyAgICovCisgIHVpbnQzMl90IGdldE1heFdyaXRlSGVhZGVyc1NpemUoKSBjb25zdDsKKworICBzdHJ1Y3QgaW5mb0lkVHlwZSB7CisgICAgZW51bSBpZFR5cGUgeworICAgICAgLy8gc3RhcnQgYXQgMSB0byBhdm9pZCBjb25mdXNpbmcgaGVhZGVyIHBhZGRpbmcgZm9yIGFuIGluZm9JZAorICAgICAgS0VZVkFMVUUgPSAxLAorICAgICAgRU5EIC8vIHNpZ25hbCB0aGUgZW5kIG9mIGluZm9JZHMgd2UgY2FuIGhhbmRsZQorICAgIH07CisgIH07CisKKyAgLy8gQnVmZmVycyB0byB1c2UgZm9yIHRyYW5zZm9ybSBwcm9jZXNzaW5nCisgIHVpbnQzMl90IHRCdWZTaXplXzsKKyAgYm9vc3Q6OnNjb3BlZF9hcnJheTx1aW50OF90PiB0QnVmXzsKKworICB2b2lkIHJlYWRTdHJpbmcodWludDhfdComIHB0ciwgLyogb3V0ICovIHN0ZDo6c3RyaW5nJiBzdHIsIHVpbnQ4X3QgY29uc3QqIGhlYWRlckJvdW5kYXJ5KTsKKworICB2b2lkIHdyaXRlU3RyaW5nKHVpbnQ4X3QqJiBwdHIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOworCisgIC8vIFZhcmludCB1dGlscworICAvKioKKyAgICogUmVhZCBhbiBpMTYgZnJvbSB0aGUgd2lyZSBhcyBhIHZhcmludC4gVGhlIE1TQiBvZiBlYWNoIGJ5dGUgaXMgc2V0CisgICAqIGlmIHRoZXJlIGlzIGFub3RoZXIgYnl0ZSB0byBmb2xsb3cuIFRoaXMgY2FuIHJlYWQgdXAgdG8gMyBieXRlcy4KKyAgICovCisgIHVpbnQzMl90IHJlYWRWYXJpbnQxNih1aW50OF90IGNvbnN0KiBwdHIsIGludDE2X3QqIGkxNiwgdWludDhfdCBjb25zdCogYm91bmRhcnkpOworCisgIC8qKgorICAgKiBSZWFkIGFuIGkzMiBmcm9tIHRoZSB3aXJlIGFzIGEgdmFyaW50LiBUaGUgTVNCIG9mIGVhY2ggYnl0ZSBpcyBzZXQKKyAgICogaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gcmVhZCB1cCB0byA1IGJ5dGVzLgorICAgKi8KKyAgdWludDMyX3QgcmVhZFZhcmludDMyKHVpbnQ4X3QgY29uc3QqIHB0ciwgaW50MzJfdCogaTMyLCB1aW50OF90IGNvbnN0KiBib3VuZGFyeSk7CisKKyAgLyoqCisgICAqIFdyaXRlIGFuIGkzMiBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTUgYnl0ZXMgb24gdGhlIHdpcmUuCisgICAqLworICB1aW50MzJfdCB3cml0ZVZhcmludDMyKGludDMyX3QgbiwgdWludDhfdCogcGt0KTsKKworICAvKioKKyAgICogV3JpdGUgYW4gaTE2IGFzIGEgdmFyaW50LiBSZXN1bHRzIGluIDEtMyBieXRlcyBvbiB0aGUgd2lyZS4KKyAgICovCisgIHVpbnQzMl90IHdyaXRlVmFyaW50MTYoaW50MTZfdCBuLCB1aW50OF90KiBwa3QpOworfTsKKworLyoqCisgKiBXcmFwcyBhIHRyYW5zcG9ydCBpbnRvIGEgaGVhZGVyIG9uZS4KKyAqCisgKi8KK2NsYXNzIFRIZWFkZXJUcmFuc3BvcnRGYWN0b3J5IDogcHVibGljIFRUcmFuc3BvcnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgVEhlYWRlclRyYW5zcG9ydEZhY3RvcnkoKSB7fQorCisgIHZpcnR1YWwgflRIZWFkZXJUcmFuc3BvcnRGYWN0b3J5KCkge30KKworICAvKioKKyAgICogV3JhcHMgdGhlIHRyYW5zcG9ydCBpbnRvIGEgaGVhZGVyIG9uZS4KKyAgICovCisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUSGVhZGVyVHJhbnNwb3J0KHRyYW5zKSk7CisgIH0KK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKKworI2VuZGlmIC8vICNpZm5kZWYgVEhSSUZUX1RSQU5TUE9SVF9USEVBREVSVFJBTlNQT1JUX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuY3BwCmluZGV4IGM2MTA2MzYuLmQxNTIxOTcgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuY3BwCkBAIC0yMiwyMyArMjIsMjQgQEAKICNpbmNsdWRlIDxzc3RyZWFtPgogI2luY2x1ZGUgPGJvb3N0L2FsZ29yaXRobS9zdHJpbmcuaHBwPgogCisjaW5jbHVkZSA8dGhyaWZ0L2NvbmZpZy5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KIAordXNpbmcgc3RkOjpzdHJpbmc7CisKIG5hbWVzcGFjZSBhcGFjaGUgewogbmFtZXNwYWNlIHRocmlmdCB7CiBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKIAotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotVEh0dHBDbGllbnQ6OlRIdHRwQ2xpZW50KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCwKK1RIdHRwQ2xpZW50OjpUSHR0cENsaWVudChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0LAogICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGhvc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcGF0aCkKICAgOiBUSHR0cFRyYW5zcG9ydCh0cmFuc3BvcnQpLCBob3N0Xyhob3N0KSwgcGF0aF8ocGF0aCkgewogfQogCiBUSHR0cENsaWVudDo6VEh0dHBDbGllbnQoc3RyaW5nIGhvc3QsIGludCBwb3J0LCBzdHJpbmcgcGF0aCkKLSAgOiBUSHR0cFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PihuZXcgVFNvY2tldChob3N0LCBwb3J0KSkpLAorICA6IFRIdHRwVHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PihuZXcgVFNvY2tldChob3N0LCBwb3J0KSkpLAogICAgIGhvc3RfKGhvc3QpLAogICAgIHBhdGhfKHBhdGgpIHsKIH0KQEAgLTEwMiw3ICsxMDMsNyBAQAogICBzdGQ6Om9zdHJpbmdzdHJlYW0gaDsKICAgaCA8PCAiUE9TVCAiIDw8IHBhdGhfIDw8ICIgSFRUUC8xLjEiIDw8IENSTEYgPDwgIkhvc3Q6ICIgPDwgaG9zdF8gPDwgQ1JMRgogICAgIDw8ICJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtdGhyaWZ0IiA8PCBDUkxGIDw8ICJDb250ZW50LUxlbmd0aDogIiA8PCBsZW4gPDwgQ1JMRgotICAgIDw8ICJBY2NlcHQ6IGFwcGxpY2F0aW9uL3gtdGhyaWZ0IiA8PCBDUkxGIDw8ICJVc2VyLUFnZW50OiBUaHJpZnQvIiA8PCBWRVJTSU9OCisgICAgPDwgIkFjY2VwdDogYXBwbGljYXRpb24veC10aHJpZnQiIDw8IENSTEYgPDwgIlVzZXItQWdlbnQ6IFRocmlmdC8iIDw8IFBBQ0tBR0VfVkVSU0lPTgogICAgIDw8ICIgKEMrKy9USHR0cENsaWVudCkiIDw8IENSTEYgPDwgQ1JMRjsKICAgc3RyaW5nIGhlYWRlciA9IGguc3RyKCk7CiAKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuaAppbmRleCA2NGU3MzMyLi5mNGZiMTJhIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cENsaWVudC5oCkBAIC0yOCw3ICsyOCw3IEBACiAKIGNsYXNzIFRIdHRwQ2xpZW50IDogcHVibGljIFRIdHRwVHJhbnNwb3J0IHsKIHB1YmxpYzoKLSAgVEh0dHBDbGllbnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0LCBzdGQ6OnN0cmluZyBob3N0LCBzdGQ6OnN0cmluZyBwYXRoID0gIiIpOworICBUSHR0cENsaWVudChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0LCBzdGQ6OnN0cmluZyBob3N0LCBzdGQ6OnN0cmluZyBwYXRoID0gIiIpOwogCiAgIFRIdHRwQ2xpZW50KHN0ZDo6c3RyaW5nIGhvc3QsIGludCBwb3J0LCBzdGQ6OnN0cmluZyBwYXRoID0gIiIpOwogCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwU2VydmVyLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBTZXJ2ZXIuY3BwCmluZGV4IGEyMGQ2MTIuLjk2YjI0ODAgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBTZXJ2ZXIuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBTZXJ2ZXIuY3BwCkBAIC0yMSwyOCArMjEsMzEgQEAKICNpbmNsdWRlIDxzc3RyZWFtPgogI2luY2x1ZGUgPGlvc3RyZWFtPgogCisjaW5jbHVkZSA8dGhyaWZ0L2NvbmZpZy5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEh0dHBTZXJ2ZXIuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KLSNpZmRlZiBfTVNDX1ZFUgotI2luY2x1ZGUgPFNobHdhcGkuaD4KKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKQorICAjaW5jbHVkZSA8U2hsd2FwaS5oPgogI2VuZGlmCiAKK3VzaW5nIHN0ZDo6c3RyaW5nOworCiBuYW1lc3BhY2UgYXBhY2hlIHsKIG5hbWVzcGFjZSB0aHJpZnQgewogbmFtZXNwYWNlIHRyYW5zcG9ydCB7CiAKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLVRIdHRwU2VydmVyOjpUSHR0cFNlcnZlcihib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQpIDogVEh0dHBUcmFuc3BvcnQodHJhbnNwb3J0KSB7CitUSHR0cFNlcnZlcjo6VEh0dHBTZXJ2ZXIoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCkgOiBUSHR0cFRyYW5zcG9ydCh0cmFuc3BvcnQpIHsKIH0KIAogVEh0dHBTZXJ2ZXI6On5USHR0cFNlcnZlcigpIHsKIH0KIAotI2lmZGVmIF9NU0NfVkVSCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX01JTkdXMzJfXykKKyAgI2RlZmluZSBUSFJJRlRfR01USU1FKFRNLCBUSU1FKSAgICAgICAgICAgICBnbXRpbWVfcygmVE0sICZUSU1FKQogICAjZGVmaW5lIFRIUklGVF9zdHJuY2FzZWNtcChzdHIxLCBzdHIyLCBsZW4pIF9zdHJuaWNtcChzdHIxLCBzdHIyLCBsZW4pCiAgICNkZWZpbmUgVEhSSUZUX3N0cmNhc2VzdHIoaGF5c3RhY2ssIG5lZWRsZSkgU3RyU3RySUEoaGF5c3RhY2ssIG5lZWRsZSkKICNlbHNlCisgICNkZWZpbmUgVEhSSUZUX0dNVElNRShUTSwgVElNRSkgICAgICAgICAgICAgZ210aW1lX3IoJlRJTUUsICZUTSkKICAgI2RlZmluZSBUSFJJRlRfc3RybmNhc2VjbXAoc3RyMSwgc3RyMiwgbGVuKSBzdHJuY2FzZWNtcChzdHIxLCBzdHIyLCBsZW4pCiAgICNkZWZpbmUgVEhSSUZUX3N0cmNhc2VzdHIoaGF5c3RhY2ssIG5lZWRsZSkgc3RyY2FzZXN0cihoYXlzdGFjaywgbmVlZGxlKQogI2VuZGlmCkBAIC0xMjQsNyArMTI3LDcgQEAKICAgLy8gQ29uc3RydWN0IHRoZSBIVFRQIGhlYWRlcgogICBzdGQ6Om9zdHJpbmdzdHJlYW0gaDsKICAgaCA8PCAiSFRUUC8xLjEgMjAwIE9LIiA8PCBDUkxGIDw8ICJEYXRlOiAiIDw8IGdldFRpbWVSRkMxMTIzKCkgPDwgQ1JMRiA8PCAiU2VydmVyOiBUaHJpZnQvIgotICAgIDw8IFZFUlNJT04gPDwgQ1JMRiA8PCAiQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luOiAqIiA8PCBDUkxGCisgICAgPDwgUEFDS0FHRV9WRVJTSU9OIDw8IENSTEYgPDwgIkFjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbjogKiIgPDwgQ1JMRgogICAgIDw8ICJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtdGhyaWZ0IiA8PCBDUkxGIDw8ICJDb250ZW50LUxlbmd0aDogIiA8PCBsZW4gPDwgQ1JMRgogICAgIDw8ICJDb25uZWN0aW9uOiBLZWVwLUFsaXZlIiA8PCBDUkxGIDw8IENSTEY7CiAgIHN0cmluZyBoZWFkZXIgPSBoLnN0cigpOwpAQCAtMTQ1LDE4ICsxNDgsMjAgQEAKICAgc3RhdGljIGNvbnN0IGNoYXIqIE1vbnRoc1tdCiAgICAgICA9IHsiSmFuIiwgIkZlYiIsICJNYXIiLCAiQXByIiwgIk1heSIsICJKdW4iLCAiSnVsIiwgIkF1ZyIsICJTZXAiLCAiT2N0IiwgIk5vdiIsICJEZWMifTsKICAgY2hhciBidWZmWzEyOF07CisKICAgdGltZV90IHQgPSB0aW1lKE5VTEwpOwotICB0bSogYnJva2VuX3QgPSBnbXRpbWUoJnQpOworICBzdHJ1Y3QgdG0gdG1iOworICBUSFJJRlRfR01USU1FKHRtYiwgdCk7CiAKICAgc3ByaW50ZihidWZmLAogICAgICAgICAgICIlcywgJWQgJXMgJWQgJWQ6JWQ6JWQgR01UIiwKLSAgICAgICAgICBEYXlzW2Jyb2tlbl90LT50bV93ZGF5XSwKLSAgICAgICAgICBicm9rZW5fdC0+dG1fbWRheSwKLSAgICAgICAgICBNb250aHNbYnJva2VuX3QtPnRtX21vbl0sCi0gICAgICAgICAgYnJva2VuX3QtPnRtX3llYXIgKyAxOTAwLAotICAgICAgICAgIGJyb2tlbl90LT50bV9ob3VyLAotICAgICAgICAgIGJyb2tlbl90LT50bV9taW4sCi0gICAgICAgICAgYnJva2VuX3QtPnRtX3NlYyk7CisgICAgICAgICAgRGF5c1t0bWIudG1fd2RheV0sCisgICAgICAgICAgdG1iLnRtX21kYXksCisgICAgICAgICAgTW9udGhzW3RtYi50bV9tb25dLAorICAgICAgICAgIHRtYi50bV95ZWFyICsgMTkwMCwKKyAgICAgICAgICB0bWIudG1faG91ciwKKyAgICAgICAgICB0bWIudG1fbWluLAorICAgICAgICAgIHRtYi50bV9zZWMpOwogICByZXR1cm4gc3RkOjpzdHJpbmcoYnVmZik7CiB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwU2VydmVyLmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwU2VydmVyLmgKaW5kZXggYTdhYjk0NC4uYzM4NjA2ZiAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cFNlcnZlci5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBTZXJ2ZXIuaApAQCAtMjgsNyArMjgsNyBAQAogCiBjbGFzcyBUSHR0cFNlcnZlciA6IHB1YmxpYyBUSHR0cFRyYW5zcG9ydCB7CiBwdWJsaWM6Ci0gIFRIdHRwU2VydmVyKGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCk7CisgIFRIdHRwU2VydmVyKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQpOwogCiAgIHZpcnR1YWwgflRIdHRwU2VydmVyKCk7CiAKQEAgLTUzLDggKzUzLDggQEAKICAgLyoqCiAgICAqIFdyYXBzIHRoZSB0cmFuc3BvcnQgaW50byBhIGJ1ZmZlcmVkIG9uZS4KICAgICovCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSB7Ci0gICAgcmV0dXJuIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUSHR0cFNlcnZlcih0cmFucykpOworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSB7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PihuZXcgVEh0dHBTZXJ2ZXIodHJhbnMpKTsKICAgfQogfTsKIH0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBUcmFuc3BvcnQuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cFRyYW5zcG9ydC5jcHAKaW5kZXggYTQ2NmZmNi4uNmNjYzAzNCAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cFRyYW5zcG9ydC5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cFRyYW5zcG9ydC5jcHAKQEAgLTIxLDE3ICsyMSwxNyBAQAogCiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9USHR0cFRyYW5zcG9ydC5oPgogCit1c2luZyBzdGQ6OnN0cmluZzsKKwogbmFtZXNwYWNlIGFwYWNoZSB7CiBuYW1lc3BhY2UgdGhyaWZ0IHsKIG5hbWVzcGFjZSB0cmFuc3BvcnQgewogCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCiAvLyBZZWFoLCB5ZWFoLCBoYWNreSB0byBwdXQgdGhlc2UgaGVyZSwgSSBrbm93LgogY29uc3QgY2hhciogVEh0dHBUcmFuc3BvcnQ6OkNSTEYgPSAiXHJcbiI7CiBjb25zdCBpbnQgVEh0dHBUcmFuc3BvcnQ6OkNSTEZfTEVOID0gMjsKIAotVEh0dHBUcmFuc3BvcnQ6OlRIdHRwVHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCkKK1RIdHRwVHJhbnNwb3J0OjpUSHR0cFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KQogICA6IHRyYW5zcG9ydF8odHJhbnNwb3J0KSwKICAgICBvcmlnaW5fKCIiKSwKICAgICByZWFkSGVhZGVyc18odHJ1ZSksCkBAIC04NCw4ICs4NCwxMCBAQAogdWludDMyX3QgVEh0dHBUcmFuc3BvcnQ6OnJlYWRNb3JlRGF0YSgpIHsKICAgdWludDMyX3Qgc2l6ZTsKIAotICAvLyBHZXQgbW9yZSBkYXRhIQotICByZWZpbGwoKTsKKyAgaWYgKGh0dHBQb3NfID09IGh0dHBCdWZMZW5fKSB7CisgICAgLy8gR2V0IG1vcmUgZGF0YSEKKyAgICByZWZpbGwoKTsKKyAgfQogCiAgIGlmIChyZWFkSGVhZGVyc18pIHsKICAgICByZWFkSGVhZGVycygpOwpAQCAtMjAwLDEwICsyMDIsMTEgQEAKICAgdWludDMyX3QgYXZhaWwgPSBodHRwQnVmU2l6ZV8gLSBodHRwQnVmTGVuXzsKICAgaWYgKGF2YWlsIDw9IChodHRwQnVmU2l6ZV8gLyA0KSkgewogICAgIGh0dHBCdWZTaXplXyAqPSAyOwotICAgIGh0dHBCdWZfID0gKGNoYXIqKXN0ZDo6cmVhbGxvYyhodHRwQnVmXywgaHR0cEJ1ZlNpemVfICsgMSk7Ci0gICAgaWYgKGh0dHBCdWZfID09IE5VTEwpIHsKKyAgICBjaGFyKiB0bXBCdWYgPSAoY2hhciopc3RkOjpyZWFsbG9jKGh0dHBCdWZfLCBodHRwQnVmU2l6ZV8gKyAxKTsKKyAgICBpZiAodG1wQnVmID09IE5VTEwpIHsKICAgICAgIHRocm93IHN0ZDo6YmFkX2FsbG9jKCk7CiAgICAgfQorICAgIGh0dHBCdWZfID0gdG1wQnVmOwogICB9CiAKICAgLy8gUmVhZCBtb3JlIGRhdGEKQEAgLTIxMiw3ICsyMTUsNyBAQAogICBodHRwQnVmX1todHRwQnVmTGVuX10gPSAnXDAnOwogCiAgIGlmIChnb3QgPT0gMCkgewotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNvdWxkIG5vdCByZWZpbGwgYnVmZmVyIik7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpFTkRfT0ZfRklMRSwgIkNvdWxkIG5vdCByZWZpbGwgYnVmZmVyIik7CiAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cFRyYW5zcG9ydC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cFRyYW5zcG9ydC5oCmluZGV4IGE5ZjU2NGMuLmU0NmFiN2YgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBUcmFuc3BvcnQuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwVHJhbnNwb3J0LmgKQEAgLTM2LDcgKzM2LDcgQEAKICAqLwogY2xhc3MgVEh0dHBUcmFuc3BvcnQgOiBwdWJsaWMgVFZpcnR1YWxUcmFuc3BvcnQ8VEh0dHBUcmFuc3BvcnQ+IHsKIHB1YmxpYzoKLSAgVEh0dHBUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KTsKKyAgVEh0dHBUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCk7CiAKICAgdmlydHVhbCB+VEh0dHBUcmFuc3BvcnQoKTsKIApAQCAtNTksNyArNTksNyBAQAogICB2aXJ0dWFsIGNvbnN0IHN0ZDo6c3RyaW5nIGdldE9yaWdpbigpOwogCiBwcm90ZWN0ZWQ6Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydF87CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnRfOwogICBzdGQ6OnN0cmluZyBvcmlnaW5fOwogCiAgIFRNZW1vcnlCdWZmZXIgd3JpdGVCdWZmZXJfOwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkZWM1ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldC5jcHAKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTU0xTb2NrZXQuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCisvKioKKyAqIE5vbmJsb2NraW5nIFNTTCBzZXJ2ZXIgc29ja2V0IGltcGxlbWVudGF0aW9uLgorICovCitUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQ6OlROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldChpbnQgcG9ydCwgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5KQorICA6IFROb25ibG9ja2luZ1NlcnZlclNvY2tldChwb3J0KSwgZmFjdG9yeV8oZmFjdG9yeSkgeworICBmYWN0b3J5Xy0+c2VydmVyKHRydWUpOworfQorCitUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQ6OlROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldChjb25zdCBzdGQ6OnN0cmluZyYgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeSkKKyAgOiBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQoYWRkcmVzcywgcG9ydCksIGZhY3RvcnlfKGZhY3RvcnkpIHsKKyAgZmFjdG9yeV8tPnNlcnZlcih0cnVlKTsKK30KKworVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0OjpUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQoaW50IHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZW5kVGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlY3ZUaW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnkpCisgIDogVE5vbmJsb2NraW5nU2VydmVyU29ja2V0KHBvcnQsIHNlbmRUaW1lb3V0LCByZWN2VGltZW91dCksIGZhY3RvcnlfKGZhY3RvcnkpIHsKKyAgZmFjdG9yeV8tPnNlcnZlcih0cnVlKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IFROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldDo6Y3JlYXRlU29ja2V0KFRIUklGVF9TT0NLRVQgY2xpZW50KSB7CisgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiB0U1NMU29ja2V0OworICB0U1NMU29ja2V0ID0gZmFjdG9yeV8tPmNyZWF0ZVNvY2tldChjbGllbnQpOworICB0U1NMU29ja2V0LT5zZXRMaWJldmVudFNhZmUoKTsKKyAgcmV0dXJuIHRTU0xTb2NrZXQ7Cit9Cit9Cit9Cit9CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTVjNDA1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQuaApAQCAtMCwwICsxLDc2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVE5PTkJMT0NLSU5HU1NMU0VSVkVSU09DS0VUX0hfCisjZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1ROT05CTE9DS0lOR1NTTFNFUlZFUlNPQ0tFVF9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclNvY2tldC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKK2NsYXNzIFRTU0xTb2NrZXRGYWN0b3J5OworCisvKioKKyAqIE5vbmJsb2NraW5nIFNlcnZlciBzb2NrZXQgdGhhdCBhY2NlcHRzIFNTTCBjb25uZWN0aW9ucy4KKyAqLworY2xhc3MgVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0IDogcHVibGljIFROb25ibG9ja2luZ1NlcnZlclNvY2tldCB7CitwdWJsaWM6CisgIC8qKgorICAgKiBDb25zdHJ1Y3Rvci4gIEJpbmRzIHRvIGFsbCBpbnRlcmZhY2VzLgorICAgKgorICAgKiBAcGFyYW0gcG9ydCAgICBMaXN0ZW5pbmcgcG9ydAorICAgKiBAcGFyYW0gZmFjdG9yeSBTU0wgc29ja2V0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24KKyAgICovCisgIFROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldChpbnQgcG9ydCwgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5KTsKKworICAvKioKKyAgICogQ29uc3RydWN0b3IuICBCaW5kcyB0byB0aGUgc3BlY2lmaWVkIGFkZHJlc3MuCisgICAqCisgICAqIEBwYXJhbSBhZGRyZXNzIEFkZHJlc3MgdG8gYmluZCB0bworICAgKiBAcGFyYW0gcG9ydCAgICBMaXN0ZW5pbmcgcG9ydAorICAgKiBAcGFyYW0gZmFjdG9yeSBTU0wgc29ja2V0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24KKyAgICovCisgIFROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldChjb25zdCBzdGQ6OnN0cmluZyYgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICBpbnQgcG9ydCwKKyAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnkpOworCisgIC8qKgorICAgKiBDb25zdHJ1Y3Rvci4gIEJpbmRzIHRvIGFsbCBpbnRlcmZhY2VzLgorICAgKgorICAgKiBAcGFyYW0gcG9ydCAgICAgICAgTGlzdGVuaW5nIHBvcnQKKyAgICogQHBhcmFtIHNlbmRUaW1lb3V0IFNvY2tldCBzZW5kIHRpbWVvdXQKKyAgICogQHBhcmFtIHJlY3ZUaW1lb3V0IFNvY2tldCByZWNlaXZlIHRpbWVvdXQKKyAgICogQHBhcmFtIGZhY3RvcnkgICAgIFNTTCBzb2NrZXQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbgorICAgKi8KKyAgVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0KGludCBwb3J0LAorICAgICAgICAgICAgICAgICAgIGludCBzZW5kVGltZW91dCwKKyAgICAgICAgICAgICAgICAgICBpbnQgcmVjdlRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5KTsKKworcHJvdGVjdGVkOgorICBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gY3JlYXRlU29ja2V0KFRIUklGVF9TT0NLRVQgc29ja2V0KTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5XzsKK307Cit9Cit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMzRjY2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclNvY2tldC5jcHAKQEAgLTAsMCArMSw1NDggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CisKKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZmRlZiBIQVZFX1NZU19TT0NLRVRfSAorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX1VOX0gKKyNpbmNsdWRlIDxzeXMvdW4uaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX1BPTExfSAorI2luY2x1ZGUgPHN5cy9wb2xsLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX05FVElORVRfSU5fSAorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L3RjcC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9ORVREQl9ICisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaD4KKworI2lmbmRlZiBBRl9MT0NBTAorI2RlZmluZSBBRl9MT0NBTCBBRl9VTklYCisjZW5kaWYKKworI2lmbmRlZiBTT0NLT1BUX0NBU1RfVAorI2lmbmRlZiBfV0lOMzIKKyNkZWZpbmUgU09DS09QVF9DQVNUX1Qgdm9pZAorI2Vsc2UKKyNkZWZpbmUgU09DS09QVF9DQVNUX1QgY2hhcgorI2VuZGlmIC8vIF9XSU4zMgorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBUPgoraW5saW5lIGNvbnN0IFNPQ0tPUFRfQ0FTVF9UKiBjb25zdF9jYXN0X3NvY2tvcHQoY29uc3QgVCogdikgeworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTT0NLT1BUX0NBU1RfVCo+KHYpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2lubGluZSBTT0NLT1BUX0NBU1RfVCogY2FzdF9zb2Nrb3B0KFQqIHYpIHsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8U09DS09QVF9DQVNUX1QqPih2KTsKK30KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKKworVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQoaW50IHBvcnQpCisgIDogcG9ydF8ocG9ydCksCisgICAgbGlzdGVuUG9ydF8ocG9ydCksCisgICAgc2VydmVyU29ja2V0XyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpLAorICAgIGFjY2VwdEJhY2tsb2dfKERFRkFVTFRfQkFDS0xPRyksCisgICAgc2VuZFRpbWVvdXRfKDApLAorICAgIHJlY3ZUaW1lb3V0XygwKSwKKyAgICByZXRyeUxpbWl0XygwKSwKKyAgICByZXRyeURlbGF5XygwKSwKKyAgICB0Y3BTZW5kQnVmZmVyXygwKSwKKyAgICB0Y3BSZWN2QnVmZmVyXygwKSwKKyAgICBrZWVwQWxpdmVfKGZhbHNlKSwKKyAgICBsaXN0ZW5pbmdfKGZhbHNlKSB7Cit9CisKK1ROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6VE5vbmJsb2NraW5nU2VydmVyU29ja2V0KGludCBwb3J0LCBpbnQgc2VuZFRpbWVvdXQsIGludCByZWN2VGltZW91dCkKKyAgOiBwb3J0Xyhwb3J0KSwKKyAgICBsaXN0ZW5Qb3J0Xyhwb3J0KSwKKyAgICBzZXJ2ZXJTb2NrZXRfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCksCisgICAgYWNjZXB0QmFja2xvZ18oREVGQVVMVF9CQUNLTE9HKSwKKyAgICBzZW5kVGltZW91dF8oc2VuZFRpbWVvdXQpLAorICAgIHJlY3ZUaW1lb3V0XyhyZWN2VGltZW91dCksCisgICAgcmV0cnlMaW1pdF8oMCksCisgICAgcmV0cnlEZWxheV8oMCksCisgICAgdGNwU2VuZEJ1ZmZlcl8oMCksCisgICAgdGNwUmVjdkJ1ZmZlcl8oMCksCisgICAga2VlcEFsaXZlXyhmYWxzZSksCisgICAgbGlzdGVuaW5nXyhmYWxzZSkgeworfQorCitUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OlROb25ibG9ja2luZ1NlcnZlclNvY2tldChjb25zdCBzdHJpbmcmIGFkZHJlc3MsIGludCBwb3J0KQorICA6IHBvcnRfKHBvcnQpLAorICAgIGxpc3RlblBvcnRfKHBvcnQpLAorICAgIGFkZHJlc3NfKGFkZHJlc3MpLAorICAgIHNlcnZlclNvY2tldF8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKKyAgICBhY2NlcHRCYWNrbG9nXyhERUZBVUxUX0JBQ0tMT0cpLAorICAgIHNlbmRUaW1lb3V0XygwKSwKKyAgICByZWN2VGltZW91dF8oMCksCisgICAgcmV0cnlMaW1pdF8oMCksCisgICAgcmV0cnlEZWxheV8oMCksCisgICAgdGNwU2VuZEJ1ZmZlcl8oMCksCisgICAgdGNwUmVjdkJ1ZmZlcl8oMCksCisgICAga2VlcEFsaXZlXyhmYWxzZSksCisgICAgbGlzdGVuaW5nXyhmYWxzZSkgeworfQorCitUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OlROb25ibG9ja2luZ1NlcnZlclNvY2tldChjb25zdCBzdHJpbmcmIHBhdGgpCisgIDogcG9ydF8oMCksCisgICAgbGlzdGVuUG9ydF8oMCksCisgICAgcGF0aF8ocGF0aCksCisgICAgc2VydmVyU29ja2V0XyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpLAorICAgIGFjY2VwdEJhY2tsb2dfKERFRkFVTFRfQkFDS0xPRyksCisgICAgc2VuZFRpbWVvdXRfKDApLAorICAgIHJlY3ZUaW1lb3V0XygwKSwKKyAgICByZXRyeUxpbWl0XygwKSwKKyAgICByZXRyeURlbGF5XygwKSwKKyAgICB0Y3BTZW5kQnVmZmVyXygwKSwKKyAgICB0Y3BSZWN2QnVmZmVyXygwKSwKKyAgICBrZWVwQWxpdmVfKGZhbHNlKSwKKyAgICBsaXN0ZW5pbmdfKGZhbHNlKSB7Cit9CisKK1ROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6flROb25ibG9ja2luZ1NlcnZlclNvY2tldCgpIHsKKyAgY2xvc2UoKTsKK30KKwordm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OnNldFNlbmRUaW1lb3V0KGludCBzZW5kVGltZW91dCkgeworICBzZW5kVGltZW91dF8gPSBzZW5kVGltZW91dDsKK30KKwordm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OnNldFJlY3ZUaW1lb3V0KGludCByZWN2VGltZW91dCkgeworICByZWN2VGltZW91dF8gPSByZWN2VGltZW91dDsKK30KKwordm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OnNldEFjY2VwdEJhY2tsb2coaW50IGFjY0JhY2tsb2cpIHsKKyAgYWNjZXB0QmFja2xvZ18gPSBhY2NCYWNrbG9nOworfQorCit2b2lkIFROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6c2V0UmV0cnlMaW1pdChpbnQgcmV0cnlMaW1pdCkgeworICByZXRyeUxpbWl0XyA9IHJldHJ5TGltaXQ7Cit9CisKK3ZvaWQgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpzZXRSZXRyeURlbGF5KGludCByZXRyeURlbGF5KSB7CisgIHJldHJ5RGVsYXlfID0gcmV0cnlEZWxheTsKK30KKwordm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OnNldFRjcFNlbmRCdWZmZXIoaW50IHRjcFNlbmRCdWZmZXIpIHsKKyAgdGNwU2VuZEJ1ZmZlcl8gPSB0Y3BTZW5kQnVmZmVyOworfQorCit2b2lkIFROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6c2V0VGNwUmVjdkJ1ZmZlcihpbnQgdGNwUmVjdkJ1ZmZlcikgeworICB0Y3BSZWN2QnVmZmVyXyA9IHRjcFJlY3ZCdWZmZXI7Cit9CisKK3ZvaWQgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpsaXN0ZW4oKSB7CisgIGxpc3RlbmluZ18gPSB0cnVlOworI2lmZGVmIF9XSU4zMgorICBUV2luc29ja1NpbmdsZXRvbjo6Y3JlYXRlKCk7CisjZW5kaWYgLy8gX1dJTjMyCisgIAorICAvLyBWYWxpZGF0ZSBwb3J0IG51bWJlcgorICBpZiAocG9ydF8gPCAwIHx8IHBvcnRfID4gMHhGRkZGKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywgIlNwZWNpZmllZCBwb3J0IGlzIGludmFsaWQiKTsKKyAgfQorCisgIGNvbnN0IHN0cnVjdCBhZGRyaW5mbyAqcmVzOworICBpbnQgZXJyb3I7CisgIGNoYXIgcG9ydFtzaXplb2YoIjY1NTM1IildOworICBUSFJJRlRfU05QUklOVEYocG9ydCwgc2l6ZW9mKHBvcnQpLCAiJWQiLCBwb3J0Xyk7CisKKyAgc3RydWN0IGFkZHJpbmZvIGhpbnRzOworICBzdGQ6Om1lbXNldCgmaGludHMsIDAsIHNpemVvZihoaW50cykpOworICBoaW50cy5haV9mYW1pbHkgPSBQRl9VTlNQRUM7CisgIGhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07CisgIGhpbnRzLmFpX2ZsYWdzID0gQUlfUEFTU0lWRSB8IEFJX0FERFJDT05GSUc7CisKKyAgLy8gSWYgYWRkcmVzcyBpcyBub3Qgc3BlY2lmaWVkIHVzZSB3aWxkY2FyZCBhZGRyZXNzIChOVUxMKQorICBUR2V0QWRkckluZm9XcmFwcGVyIGluZm8oYWRkcmVzc18uZW1wdHkoKSA/IE5VTEwgOiAmYWRkcmVzc19bMF0sIHBvcnQsICZoaW50cyk7CisKKyAgZXJyb3IgPSBpbmZvLmluaXQoKTsKKyAgaWYgKGVycm9yKSB7CisgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiZ2V0YWRkcmluZm8gJWQ6ICVzIiwgZXJyb3IsIFRIUklGVF9HQUlfU1RSRVJST1IoZXJyb3IpKTsKKyAgICBjbG9zZSgpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHJlc29sdmUgaG9zdCBmb3Igc2VydmVyIHNvY2tldC4iKTsKKyAgfQorCisgIC8vIFBpY2sgdGhlIGlwdjYgYWRkcmVzcyBmaXJzdCBzaW5jZSBpcHY0IGFkZHJlc3NlcyBjYW4gYmUgbWFwcGVkCisgIC8vIGludG8gaXB2NiBzcGFjZS4KKyAgZm9yIChyZXMgPSBpbmZvLnJlcygpOyByZXM7IHJlcyA9IHJlcy0+YWlfbmV4dCkgeworICAgIGlmIChyZXMtPmFpX2ZhbWlseSA9PSBBRl9JTkVUNiB8fCByZXMtPmFpX25leHQgPT0gTlVMTCkKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKCFwYXRoXy5lbXB0eSgpKSB7CisgICAgc2VydmVyU29ja2V0XyA9IHNvY2tldChQRl9VTklYLCBTT0NLX1NUUkVBTSwgSVBQUk9UT19JUCk7CisgIH0gZWxzZSBpZiAocmVzICE9IE5VTEwpIHsKKyAgICBzZXJ2ZXJTb2NrZXRfID0gc29ja2V0KHJlcy0+YWlfZmFtaWx5LCByZXMtPmFpX3NvY2t0eXBlLCByZXMtPmFpX3Byb3RvY29sKTsKKyAgfQorCisgIGlmIChzZXJ2ZXJTb2NrZXRfID09IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBzb2NrZXQoKSAiLCBlcnJub19jb3B5KTsKKyAgICBjbG9zZSgpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGNyZWF0ZSBzZXJ2ZXIgc29ja2V0LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgfQorCisgIC8vIFNldCBUSFJJRlRfTk9fU09DS0VUX0NBQ0hJTkcgdG8gcHJldmVudCAyTVNMIGRlbGF5IG9uIGFjY2VwdAorICBpbnQgb25lID0gMTsKKyAgaWYgKC0xID09IHNldHNvY2tvcHQoc2VydmVyU29ja2V0XywKKyAgICAgICAgICAgICAgICAgICAgICAgU09MX1NPQ0tFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX05PX1NPQ0tFVF9DQUNISU5HLAorICAgICAgICAgICAgICAgICAgICAgICBjYXN0X3NvY2tvcHQoJm9uZSksCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvbmUpKSkgeworLy8gaWdub3JlIGVycm9ycyBjb21pbmcgb3V0IG9mIHRoaXMgc2V0c29ja29wdCBvbiBXaW5kb3dzLiAgVGhpcyBpcyBiZWNhdXNlCisvLyBTT19FWENMVVNJVkVBRERSVVNFIHJlcXVpcmVzIGFkbWluIHByaXZpbGVnZXMgb24gV2luWFAsIGJ1dCB3ZSBkb24ndAorLy8gd2FudCB0byBmb3JjZSBzZXJ2ZXJzIHRvIGJlIGFuIGFkbWluLgorI2lmbmRlZiBfV0lOMzIKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6bGlzdGVuKCkgc2V0c29ja29wdCgpIFRIUklGVF9OT19TT0NLRVRfQ0FDSElORyAiLAorICAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fY29weSk7CisgICAgY2xvc2UoKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBzZXQgVEhSSUZUX05PX1NPQ0tFVF9DQUNISU5HIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOworI2VuZGlmCisgIH0KKworICAvLyBTZXQgVENQIGJ1ZmZlciBzaXplcworICBpZiAodGNwU2VuZEJ1ZmZlcl8gPiAwKSB7CisgICAgaWYgKC0xID09IHNldHNvY2tvcHQoc2VydmVyU29ja2V0XywKKyAgICAgICAgICAgICAgICAgICAgICAgICBTT0xfU09DS0VULAorICAgICAgICAgICAgICAgICAgICAgICAgIFNPX1NOREJVRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X3NvY2tvcHQoJnRjcFNlbmRCdWZmZXJfKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodGNwU2VuZEJ1ZmZlcl8pKSkgeworICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6bGlzdGVuKCkgc2V0c29ja29wdCgpIFNPX1NOREJVRiAiLCBlcnJub19jb3B5KTsKKyAgICAgIGNsb3NlKCk7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHNldCBTT19TTkRCVUYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgICB9CisgIH0KKworICBpZiAodGNwUmVjdkJ1ZmZlcl8gPiAwKSB7CisgICAgaWYgKC0xID09IHNldHNvY2tvcHQoc2VydmVyU29ja2V0XywKKyAgICAgICAgICAgICAgICAgICAgICAgICBTT0xfU09DS0VULAorICAgICAgICAgICAgICAgICAgICAgICAgIFNPX1JDVkJVRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X3NvY2tvcHQoJnRjcFJlY3ZCdWZmZXJfKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodGNwUmVjdkJ1ZmZlcl8pKSkgeworICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6bGlzdGVuKCkgc2V0c29ja29wdCgpIFNPX1JDVkJVRiAiLCBlcnJub19jb3B5KTsKKyAgICAgIGNsb3NlKCk7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHNldCBTT19SQ1ZCVUYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgICB9CisgIH0KKworI2lmZGVmIElQVjZfVjZPTkxZCisgIGlmIChyZXMtPmFpX2ZhbWlseSA9PSBBRl9JTkVUNiAmJiBwYXRoXy5lbXB0eSgpKSB7CisgICAgaW50IHplcm8gPSAwOworICAgIGlmICgtMSA9PSBzZXRzb2Nrb3B0KHNlcnZlclNvY2tldF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgSVBQUk9UT19JUFY2LAorICAgICAgICAgICAgICAgICAgICAgICAgIElQVjZfVjZPTkxZLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3Rfc29ja29wdCgmemVybyksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHplcm8pKSkgeworICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBJUFY2X1Y2T05MWSAiLCBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUik7CisgICAgfQorICB9CisjZW5kaWYgLy8gI2lmZGVmIElQVjZfVjZPTkxZCisKKyAgLy8gVHVybiBsaW5nZXIgb2ZmLCBkb24ndCB3YW50IHRvIGJsb2NrIG9uIGNhbGxzIHRvIGNsb3NlCisgIHN0cnVjdCBsaW5nZXIgbGluZyA9IHswLCAwfTsKKyAgaWYgKC0xID09IHNldHNvY2tvcHQoc2VydmVyU29ja2V0XywgU09MX1NPQ0tFVCwgU09fTElOR0VSLCBjYXN0X3NvY2tvcHQoJmxpbmcpLCBzaXplb2YobGluZykpKSB7CisgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHNldHNvY2tvcHQoKSBTT19MSU5HRVIgIiwgZXJybm9fY29weSk7CisgICAgY2xvc2UoKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQ291bGQgbm90IHNldCBTT19MSU5HRVIiLCBlcnJub19jb3B5KTsKKyAgfQorCisgIC8vIEtlZXBhbGl2ZSB0byBlbnN1cmUgZnVsbCByZXN1bHQgZmx1c2hpbmcKKyAgaWYgKC0xID09IHNldHNvY2tvcHQoc2VydmVyU29ja2V0XywgU09MX1NPQ0tFVCwgU09fS0VFUEFMSVZFLCBjb25zdF9jYXN0X3NvY2tvcHQoJm9uZSksIHNpemVvZihvbmUpKSkgeworICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBzZXRzb2Nrb3B0KCkgU09fS0VFUEFMSVZFICIsIGVycm5vX2NvcHkpOworICAgIGNsb3NlKCk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICJDb3VsZCBub3Qgc2V0IFRDUF9OT0RFTEFZIiwKKyAgICAgIGVycm5vX2NvcHkpOworICB9CisKKyAgLy8gU2V0IFRDUCBub2RlbGF5IGlmIGF2YWlsYWJsZSwgTUFDIE9TIFggSGFjaworICAvLyBTZWUgaHR0cDovL2xpc3RzLmRhbmdhLmNvbS9waXBlcm1haWwvbWVtY2FjaGVkLzIwMDUtTWFyY2gvMDAxMjQwLmh0bWwKKyNpZm5kZWYgVENQX05PUFVTSAorICAvLyBVbml4IFNvY2tldHMgZG8gbm90IG5lZWQgdGhhdAorICBpZiAocGF0aF8uZW1wdHkoKSkgeworICAgIC8vIFRDUCBOb2RlbGF5LCBzcGVlZCBvdmVyIGJhbmR3aWR0aAorICAgIGlmICgtMQorICAgICAgICA9PSBzZXRzb2Nrb3B0KHNlcnZlclNvY2tldF8sIElQUFJPVE9fVENQLCBUQ1BfTk9ERUxBWSwgY2FzdF9zb2Nrb3B0KCZvbmUpLCBzaXplb2Yob25lKSkpIHsKKyAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHNldHNvY2tvcHQoKSBUQ1BfTk9ERUxBWSAiLCBlcnJub19jb3B5KTsKKyAgICAgIGNsb3NlKCk7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHNldCBUQ1BfTk9ERUxBWSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOworICAgIH0KKyAgfQorI2VuZGlmCisKKyAgLy8gU2V0IE5PTkJMT0NLIG9uIHRoZSBhY2NlcHQgc29ja2V0CisgIGludCBmbGFncyA9IFRIUklGVF9GQ05UTChzZXJ2ZXJTb2NrZXRfLCBUSFJJRlRfRl9HRVRGTCwgMCk7CisgIGlmIChmbGFncyA9PSAtMSkgeworICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBUSFJJRlRfRkNOVEwoKSBUSFJJRlRfRl9HRVRGTCAiLCBlcnJub19jb3B5KTsKKyAgICBjbG9zZSgpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEhSSUZUX0ZDTlRMKCkgVEhSSUZUX0ZfR0VURkwgZmFpbGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOworICB9CisKKyAgaWYgKC0xID09IFRIUklGVF9GQ05UTChzZXJ2ZXJTb2NrZXRfLCBUSFJJRlRfRl9TRVRGTCwgZmxhZ3MgfCBUSFJJRlRfT19OT05CTE9DSykpIHsKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6bGlzdGVuKCkgVEhSSUZUX0ZDTlRMKCkgVEhSSUZUX09fTk9OQkxPQ0sgIiwgZXJybm9fY29weSk7CisgICAgY2xvc2UoKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRIUklGVF9GQ05UTCgpIFRIUklGVF9GX1NFVEZMIFRIUklGVF9PX05PTkJMT0NLIGZhaWxlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgfQorCisjaWZkZWYgVENQX0xPV19NSU5fUlRPCisgIGlmIChUU29ja2V0OjpnZXRVc2VMb3dNaW5SdG8oKSkgeworICAgIGlmICgtMSA9PSBzZXRzb2Nrb3B0KHMsIElQUFJPVE9fVENQLCBUQ1BfTE9XX01JTl9SVE8sIGNvbnN0X2Nhc3Rfc29ja29wdCgmb25lKSwgc2l6ZW9mKG9uZSkpKSB7CisgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBzZXRzb2Nrb3B0KCkgVENQX0xPV19NSU5fUlRPICIsIGVycm5vX2NvcHkpOworICAgICAgY2xvc2UoKTsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICJDb3VsZCBub3Qgc2V0IFRDUF9OT0RFTEFZIiwKKyAgICAgICAgZXJybm9fY29weSk7CisgICAgfQorICB9CisjZW5kaWYKKworICAvLyBwcmVwYXJlIHRoZSBwb3J0IGluZm9ybWF0aW9uCisgIC8vIHdlIG1heSB3YW50IHRvIHRyeSB0byBiaW5kIG1vcmUgdGhhbiBvbmNlLCBzaW5jZSBUSFJJRlRfTk9fU09DS0VUX0NBQ0hJTkcgZG9lc24ndAorICAvLyBhbHdheXMgc2VlbSB0byB3b3JrLiBUaGUgY2xpZW50IGNhbiBjb25maWd1cmUgdGhlIHJldHJ5IHZhcmlhYmxlcy4KKyAgaW50IHJldHJpZXMgPSAwOworICBpbnQgZXJybm9fY29weSA9IDA7CisKKyAgaWYgKCFwYXRoXy5lbXB0eSgpKSB7CisKKyNpZm5kZWYgX1dJTjMyCisKKyAgICAvLyBVbml4IERvbWFpbiBTb2NrZXQKKyAgICBzaXplX3QgbGVuID0gcGF0aF8uc2l6ZSgpICsgMTsKKyAgICBpZiAobGVuID4gc2l6ZW9mKCgoc29ja2FkZHJfdW4qKU5VTEwpLT5zdW5fcGF0aCkpIHsKKyAgICAgIGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6Omxpc3RlbigpIFVuaXggRG9tYWluIHNvY2tldCBwYXRoIHRvbyBsb25nIiwgZXJybm9fY29weSk7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5peCBEb21haW4gc29ja2V0IHBhdGggdG9vIGxvbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgICB9CisKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfdW4gYWRkcmVzczsKKyAgICBhZGRyZXNzLnN1bl9mYW1pbHkgPSBBRl9VTklYOworICAgIG1lbWNweShhZGRyZXNzLnN1bl9wYXRoLCBwYXRoXy5jX3N0cigpLCBsZW4pOworCisgICAgc29ja2xlbl90IHN0cnVjdGxlbiA9IHN0YXRpY19jYXN0PHNvY2tsZW5fdD4oc2l6ZW9mKGFkZHJlc3MpKTsKKworICAgIGlmICghYWRkcmVzcy5zdW5fcGF0aFswXSkgeyAvLyBhYnN0cmFjdCBuYW1lc3BhY2Ugc29ja2V0CisjaWZkZWYgX19saW51eF9fCisgICAgICAvLyBzdW5fcGF0aCBpcyBub3QgbnVsbC10ZXJtaW5hdGVkIGluIHRoaXMgY2FzZSBhbmQgc3RydWN0bGVuIGRldGVybWluZXMgaXRzIGxlbmd0aAorICAgICAgc3RydWN0bGVuIC09IHNpemVvZihhZGRyZXNzLnN1bl9wYXRoKSAtIGxlbjsKKyNlbHNlCisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpvcGVuKCkgQWJzdHJhY3QgTmFtZXNwYWNlIERvbWFpbiBzb2NrZXRzIG9ubHkgc3VwcG9ydGVkIG9uIGxpbnV4OiAiLCAtOTkpOworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBBYnN0cmFjdCBOYW1lc3BhY2UgRG9tYWluIHNvY2tldCBwYXRoIG5vdCBzdXBwb3J0ZWQiKTsKKyNlbmRpZgorICAgIH0KKworICAgIGRvIHsKKyAgICAgIGlmICgwID09IDo6YmluZChzZXJ2ZXJTb2NrZXRfLCAoc3RydWN0IHNvY2thZGRyKikmYWRkcmVzcywgc3RydWN0bGVuKSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgIC8vIHVzZSBzaG9ydCBjaXJjdWl0IGV2YWx1YXRpb24gaGVyZSB0byBvbmx5IHNsZWVwIGlmIHdlIG5lZWQgdG8KKyAgICB9IHdoaWxlICgocmV0cmllcysrIDwgcmV0cnlMaW1pdF8pICYmIChUSFJJRlRfU0xFRVBfU0VDKHJldHJ5RGVsYXlfKSA9PSAwKSk7CisjZWxzZQorICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6Om9wZW4oKSBVbml4IERvbWFpbiBzb2NrZXQgcGF0aCBub3Qgc3VwcG9ydGVkIG9uIHdpbmRvd3MiLCAtOTkpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFVuaXggRG9tYWluIHNvY2tldCBwYXRoIG5vdCBzdXBwb3J0ZWQiKTsKKyNlbmRpZgorICB9IGVsc2UgeworICAgIGRvIHsKKyAgICAgIGlmICgwID09IDo6YmluZChzZXJ2ZXJTb2NrZXRfLCByZXMtPmFpX2FkZHIsIHN0YXRpY19jYXN0PGludD4ocmVzLT5haV9hZGRybGVuKSkpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICAvLyB1c2Ugc2hvcnQgY2lyY3VpdCBldmFsdWF0aW9uIGhlcmUgdG8gb25seSBzbGVlcCBpZiB3ZSBuZWVkIHRvCisgICAgfSB3aGlsZSAoKHJldHJpZXMrKyA8IHJldHJ5TGltaXRfKSAmJiAoVEhSSUZUX1NMRUVQX1NFQyhyZXRyeURlbGF5XykgPT0gMCkpOworCisgICAgLy8gcmV0cmlldmUgYmluZCBpbmZvCisgICAgaWYgKHBvcnRfID09IDAgJiYgcmV0cmllcyA8PSByZXRyeUxpbWl0XykgeworICAgICAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2Ugc2E7CisgICAgICBzb2NrbGVuX3QgbGVuID0gc2l6ZW9mKHNhKTsKKyAgICAgIHN0ZDo6bWVtc2V0KCZzYSwgMCwgbGVuKTsKKyAgICAgIGlmICg6OmdldHNvY2tuYW1lKHNlcnZlclNvY2tldF8sIHJlaW50ZXJwcmV0X2Nhc3Q8c3RydWN0IHNvY2thZGRyKj4oJnNhKSwgJmxlbikgPCAwKSB7CisgICAgICAgIGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpnZXRQb3J0KCkgZ2V0c29ja25hbWUoKSAiLCBlcnJub19jb3B5KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzYS5zc19mYW1pbHkgPT0gQUZfSU5FVDYpIHsKKyAgICAgICAgICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW42KiBzaW4gPSByZWludGVycHJldF9jYXN0PGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbjYqPigmc2EpOworICAgICAgICAgIGxpc3RlblBvcnRfID0gbnRvaHMoc2luLT5zaW42X3BvcnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiogc2luID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4qPigmc2EpOworICAgICAgICAgIGxpc3RlblBvcnRfID0gbnRvaHMoc2luLT5zaW5fcG9ydCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyB0aHJvdyBhbiBlcnJvciBpZiB3ZSBmYWlsZWQgdG8gYmluZCBwcm9wZXJseQorICBpZiAocmV0cmllcyA+IHJldHJ5TGltaXRfKSB7CisgICAgY2hhciBlcnJidWZbMTAyNF07CisgICAgaWYgKCFwYXRoXy5lbXB0eSgpKSB7CisgICAgICBUSFJJRlRfU05QUklOVEYoZXJyYnVmLCBzaXplb2YoZXJyYnVmKSwgIlROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6bGlzdGVuKCkgUEFUSCAlcyIsIHBhdGhfLmNfc3RyKCkpOworICAgIH0gZWxzZSB7CisgICAgICBUSFJJRlRfU05QUklOVEYoZXJyYnVmLCBzaXplb2YoZXJyYnVmKSwgIlROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6bGlzdGVuKCkgQklORCAlZCIsIHBvcnRfKTsKKyAgICB9CisgICAgR2xvYmFsT3V0cHV0KGVycmJ1Zik7CisgICAgY2xvc2UoKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBiaW5kIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOworICB9CisKKyAgaWYgKGxpc3RlbkNhbGxiYWNrXykKKyAgICBsaXN0ZW5DYWxsYmFja18oc2VydmVyU29ja2V0Xyk7CisKKyAgLy8gQ2FsbCBsaXN0ZW4KKyAgaWYgKC0xID09IDo6bGlzdGVuKHNlcnZlclNvY2tldF8sIGFjY2VwdEJhY2tsb2dfKSkgeworICAgIGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIGxpc3RlbigpICIsIGVycm5vX2NvcHkpOworICAgIGNsb3NlKCk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkNvdWxkIG5vdCBsaXN0ZW4iLCBlcnJub19jb3B5KTsKKyAgfQorCisgIC8vIFRoZSBzb2NrZXQgaXMgbm93IGxpc3RlbmluZyEKK30KKworaW50IFROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6Z2V0UG9ydCgpIHsKKyAgcmV0dXJuIHBvcnRfOworfQorCitpbnQgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpnZXRMaXN0ZW5Qb3J0KCkgeworICByZXR1cm4gbGlzdGVuUG9ydF87Cit9CisKK3NoYXJlZF9wdHI8VFNvY2tldD4gVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjphY2NlcHRJbXBsKCkgeworICBpZiAoc2VydmVyU29ja2V0XyA9PSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiVE5vbmJsb2NraW5nU2VydmVyU29ja2V0IG5vdCBsaXN0ZW5pbmciKTsKKyAgfQorICAKKyAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgY2xpZW50QWRkcmVzczsKKyAgaW50IHNpemUgPSBzaXplb2YoY2xpZW50QWRkcmVzcyk7CisgIFRIUklGVF9TT0NLRVQgY2xpZW50U29ja2V0CisgICAgICA9IDo6YWNjZXB0KHNlcnZlclNvY2tldF8sIChzdHJ1Y3Qgc29ja2FkZHIqKSZjbGllbnRBZGRyZXNzLCAoc29ja2xlbl90Kikmc2l6ZSk7CisKKyAgaWYgKGNsaWVudFNvY2tldCA9PSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6YWNjZXB0SW1wbCgpIDo6YWNjZXB0KCkgIiwgZXJybm9fY29weSk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAiYWNjZXB0KCkiLCBlcnJub19jb3B5KTsKKyAgfQorCisgIC8vIEV4cGxpY2l0bHkgc2V0IHRoaXMgc29ja2V0IHRvIE5PTkJMT0NLIG1vZGUKKyAgaW50IGZsYWdzID0gVEhSSUZUX0ZDTlRMKGNsaWVudFNvY2tldCwgVEhSSUZUX0ZfR0VURkwsIDApOworICBpZiAoZmxhZ3MgPT0gLTEpIHsKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKGNsaWVudFNvY2tldCk7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjphY2NlcHRJbXBsKCkgVEhSSUZUX0ZDTlRMKCkgVEhSSUZUX0ZfR0VURkwgIiwgZXJybm9fY29weSk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRIUklGVF9GQ05UTChUSFJJRlRfRl9HRVRGTCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fY29weSk7CisgIH0KKworICBpZiAoLTEgPT0gVEhSSUZUX0ZDTlRMKGNsaWVudFNvY2tldCwgVEhSSUZUX0ZfU0VURkwsIGZsYWdzIHwgVEhSSUZUX09fTk9OQkxPQ0spKSB7CisgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICA6OlRIUklGVF9DTE9TRVNPQ0tFVChjbGllbnRTb2NrZXQpOworICAgIEdsb2JhbE91dHB1dAorICAgICAgICAucGVycm9yKCJUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OmFjY2VwdEltcGwoKSBUSFJJRlRfRkNOVEwoKSBUSFJJRlRfRl9TRVRGTCB+VEhSSUZUX09fTk9OQkxPQ0sgIiwKKyAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEhSSUZUX0ZDTlRMKFRIUklGVF9GX1NFVEZMKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgfQorCisgIHNoYXJlZF9wdHI8VFNvY2tldD4gY2xpZW50ID0gY3JlYXRlU29ja2V0KGNsaWVudFNvY2tldCk7CisgIGlmIChzZW5kVGltZW91dF8gPiAwKSB7CisgICAgY2xpZW50LT5zZXRTZW5kVGltZW91dChzZW5kVGltZW91dF8pOworICB9CisgIGlmIChyZWN2VGltZW91dF8gPiAwKSB7CisgICAgY2xpZW50LT5zZXRSZWN2VGltZW91dChyZWN2VGltZW91dF8pOworICB9CisgIGlmIChrZWVwQWxpdmVfKSB7CisgICAgY2xpZW50LT5zZXRLZWVwQWxpdmUoa2VlcEFsaXZlXyk7CisgIH0KKyAgY2xpZW50LT5zZXRDYWNoZWRBZGRyZXNzKChzb2NrYWRkciopJmNsaWVudEFkZHJlc3MsIHNpemUpOworCisgIGlmIChhY2NlcHRDYWxsYmFja18pCisgICAgYWNjZXB0Q2FsbGJhY2tfKGNsaWVudFNvY2tldCk7CisKKyAgcmV0dXJuIGNsaWVudDsKK30KKworc2hhcmVkX3B0cjxUU29ja2V0PiBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OmNyZWF0ZVNvY2tldChUSFJJRlRfU09DS0VUIGNsaWVudFNvY2tldCkgeworICByZXR1cm4gc2hhcmVkX3B0cjxUU29ja2V0PihuZXcgVFNvY2tldChjbGllbnRTb2NrZXQpKTsKK30KKwordm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OmNsb3NlKCkgeworICBpZiAoc2VydmVyU29ja2V0XyAhPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKKyAgICBzaHV0ZG93bihzZXJ2ZXJTb2NrZXRfLCBUSFJJRlRfU0hVVF9SRFdSKTsKKyAgICA6OlRIUklGVF9DTE9TRVNPQ0tFVChzZXJ2ZXJTb2NrZXRfKTsKKyAgfQorICBzZXJ2ZXJTb2NrZXRfID0gVEhSSUZUX0lOVkFMSURfU09DS0VUOworICBsaXN0ZW5pbmdfID0gZmFsc2U7Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyU29ja2V0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclNvY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ODZmZjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclNvY2tldC5oCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVE5PTkJMT0NLSU5HU0VSVkVSU09DS0VUX0hfCisjZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1ROT05CTE9DS0lOR1NFUlZFUlNPQ0tFVF9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCitjbGFzcyBUU29ja2V0OworCisvKioKKyAqIE5vbmJsb2NraW5nIFNlcnZlciBzb2NrZXQgaW1wbGVtZW50YXRpb24gb2YgVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0LiBXcmFwcGVyIGFyb3VuZCBhIHVuaXgKKyAqIHNvY2tldCBsaXN0ZW4gYW5kIGFjY2VwdCBjYWxscy4KKyAqCisgKi8KK2NsYXNzIFROb25ibG9ja2luZ1NlcnZlclNvY2tldCA6IHB1YmxpYyBUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQgeworcHVibGljOgorICB0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248dm9pZChUSFJJRlRfU09DS0VUIGZkKT4gc29ja2V0X2Z1bmNfdDsKKworICBjb25zdCBzdGF0aWMgaW50IERFRkFVTFRfQkFDS0xPRyA9IDEwMjQ7CisKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yLgorICAgKgorICAgKiBAcGFyYW0gcG9ydCAgICBQb3J0IG51bWJlciB0byBiaW5kIHRvCisgICAqLworICBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQoaW50IHBvcnQpOworCisgIC8qKgorICAgKiBDb25zdHJ1Y3Rvci4KKyAgICoKKyAgICogQHBhcmFtIHBvcnQgICAgICAgIFBvcnQgbnVtYmVyIHRvIGJpbmQgdG8KKyAgICogQHBhcmFtIHNlbmRUaW1lb3V0IFNvY2tldCBzZW5kIHRpbWVvdXQKKyAgICogQHBhcmFtIHJlY3ZUaW1lb3V0IFNvY2tldCByZWNlaXZlIHRpbWVvdXQKKyAgICovCisgIFROb25ibG9ja2luZ1NlcnZlclNvY2tldChpbnQgcG9ydCwgaW50IHNlbmRUaW1lb3V0LCBpbnQgcmVjdlRpbWVvdXQpOworCisgIC8qKgorICAgKiBDb25zdHJ1Y3Rvci4KKyAgICoKKyAgICogQHBhcmFtIGFkZHJlc3MgQWRkcmVzcyB0byBiaW5kIHRvCisgICAqIEBwYXJhbSBwb3J0ICAgIFBvcnQgbnVtYmVyIHRvIGJpbmQgdG8KKyAgICovCisgIFROb25ibG9ja2luZ1NlcnZlclNvY2tldChjb25zdCBzdGQ6OnN0cmluZyYgYWRkcmVzcywgaW50IHBvcnQpOworCisgIC8qKgorICAgKiBDb25zdHJ1Y3RvciB1c2VkIGZvciB1bml4IHNvY2tldHMuCisgICAqCisgICAqIEBwYXJhbSBwYXRoIFBhdGhuYW1lIGZvciB1bml4IHNvY2tldC4KKyAgICovCisgIFROb25ibG9ja2luZ1NlcnZlclNvY2tldChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCk7CisKKyAgdmlydHVhbCB+VE5vbmJsb2NraW5nU2VydmVyU29ja2V0KCk7CisKKyAgdm9pZCBzZXRTZW5kVGltZW91dChpbnQgc2VuZFRpbWVvdXQpOworICB2b2lkIHNldFJlY3ZUaW1lb3V0KGludCByZWN2VGltZW91dCk7CisKKyAgdm9pZCBzZXRBY2NlcHRCYWNrbG9nKGludCBhY2NCYWNrbG9nKTsKKworICB2b2lkIHNldFJldHJ5TGltaXQoaW50IHJldHJ5TGltaXQpOworICB2b2lkIHNldFJldHJ5RGVsYXkoaW50IHJldHJ5RGVsYXkpOworCisgIHZvaWQgc2V0S2VlcEFsaXZlKGJvb2wga2VlcEFsaXZlKSB7IGtlZXBBbGl2ZV8gPSBrZWVwQWxpdmU7IH0KKworICB2b2lkIHNldFRjcFNlbmRCdWZmZXIoaW50IHRjcFNlbmRCdWZmZXIpOworICB2b2lkIHNldFRjcFJlY3ZCdWZmZXIoaW50IHRjcFJlY3ZCdWZmZXIpOworCisgIC8vIGxpc3RlbkNhbGxiYWNrIGdldHMgY2FsbGVkIGp1c3QgYmVmb3JlIGxpc3RlbiwgYW5kIGFmdGVyIGFsbCBUaHJpZnQKKyAgLy8gc2V0c29ja29wdCBjYWxscyBoYXZlIGJlZW4gbWFkZS4gIElmIHlvdSBoYXZlIGN1c3RvbSBzZXRzb2Nrb3B0CisgIC8vIHRoaW5ncyB0aGF0IG5lZWQgdG8gaGFwcGVuIG9uIHRoZSBsaXN0ZW5pbmcgc29ja2V0LCB0aGlzIGlzIHRoZSBwbGFjZSB0byBkbyBpdC4KKyAgdm9pZCBzZXRMaXN0ZW5DYWxsYmFjayhjb25zdCBzb2NrZXRfZnVuY190JiBsaXN0ZW5DYWxsYmFjaykgeyBsaXN0ZW5DYWxsYmFja18gPSBsaXN0ZW5DYWxsYmFjazsgfQorCisgIC8vIGFjY2VwdENhbGxiYWNrIGdldHMgY2FsbGVkIGFmdGVyIGVhY2ggYWNjZXB0IGNhbGwsIG9uIHRoZSBuZXdseSBjcmVhdGVkIHNvY2tldC4KKyAgLy8gSXQgaXMgY2FsbGVkIGFmdGVyIGFsbCBUaHJpZnQgc2V0c29ja29wdCBjYWxscyBoYXZlIGJlZW4gbWFkZS4gIElmIHlvdSBoYXZlCisgIC8vIGN1c3RvbSBzZXRzb2Nrb3B0IHRoaW5ncyB0aGF0IG5lZWQgdG8gaGFwcGVuIG9uIHRoZSBhY2NlcHRlZAorICAvLyBzb2NrZXQsIHRoaXMgaXMgdGhlIHBsYWNlIHRvIGRvIGl0LgorICB2b2lkIHNldEFjY2VwdENhbGxiYWNrKGNvbnN0IHNvY2tldF9mdW5jX3QmIGFjY2VwdENhbGxiYWNrKSB7IGFjY2VwdENhbGxiYWNrXyA9IGFjY2VwdENhbGxiYWNrOyB9CisKKyAgVEhSSUZUX1NPQ0tFVCBnZXRTb2NrZXRGRCgpIHsgcmV0dXJuIHNlcnZlclNvY2tldF87IH0KKworICBpbnQgZ2V0UG9ydCgpOworICAKKyAgaW50IGdldExpc3RlblBvcnQoKTsKKworICB2b2lkIGxpc3RlbigpOworICB2b2lkIGNsb3NlKCk7CisKK3Byb3RlY3RlZDoKKyAgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IGFjY2VwdEltcGwoKTsKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gY3JlYXRlU29ja2V0KFRIUklGVF9TT0NLRVQgY2xpZW50KTsKKworcHJpdmF0ZToKKyAgaW50IHBvcnRfOworICBpbnQgbGlzdGVuUG9ydF87CisgIHN0ZDo6c3RyaW5nIGFkZHJlc3NfOworICBzdGQ6OnN0cmluZyBwYXRoXzsKKyAgVEhSSUZUX1NPQ0tFVCBzZXJ2ZXJTb2NrZXRfOworICBpbnQgYWNjZXB0QmFja2xvZ187CisgIGludCBzZW5kVGltZW91dF87CisgIGludCByZWN2VGltZW91dF87CisgIGludCByZXRyeUxpbWl0XzsKKyAgaW50IHJldHJ5RGVsYXlfOworICBpbnQgdGNwU2VuZEJ1ZmZlcl87CisgIGludCB0Y3BSZWN2QnVmZmVyXzsKKyAgYm9vbCBrZWVwQWxpdmVfOworICBib29sIGxpc3RlbmluZ187CisKKyAgc29ja2V0X2Z1bmNfdCBsaXN0ZW5DYWxsYmFja187CisgIHNvY2tldF9mdW5jX3QgYWNjZXB0Q2FsbGJhY2tfOworfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UTk9OQkxPQ0tJTkdTRVJWRVJTT0NLRVRfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNDJlMTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydC5oCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVE5PTkJMT0NLSU5HU0VSVkVSVFJBTlNQT1JUX0hfCisjZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1ROT05CTE9DS0lOR1NFUlZFUlRSQU5TUE9SVF9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCisvKioKKyAqIFNlcnZlciB0cmFuc3BvcnQgZnJhbWV3b3JrLiBBIHNlcnZlciBuZWVkcyB0byBoYXZlIHNvbWUgZmFjaWxpdHkgZm9yCisgKiBjcmVhdGluZyBiYXNlIHRyYW5zcG9ydHMgdG8gcmVhZC93cml0ZSBmcm9tLiAgVGhlIHNlcnZlciBpcyBleHBlY3RlZAorICogdG8ga2VlcCB0cmFjayBvZiBUVHJhbnNwb3J0IGNoaWxkcmVuIHRoYXQgaXQgY3JlYXRlcyBmb3IgcHVycG9zZXMgb2YKKyAqIGNvbnRyb2xsaW5nIHRoZWlyIGxpZmV0aW1lLgorICovCitjbGFzcyBUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQgeworcHVibGljOgorICB2aXJ0dWFsIH5UTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQoKSB7fQorCisgIC8qKgorICAgKiBTdGFydHMgdGhlIHNlcnZlciB0cmFuc3BvcnQgbGlzdGVuaW5nIGZvciBuZXcgY29ubmVjdGlvbnMuIFByaW9yIHRvIHRoaXMKKyAgICogY2FsbCBtb3N0IHRyYW5zcG9ydHMgd2lsbCBub3QgcmV0dXJuIGFueXRoaW5nIHdoZW4gYWNjZXB0IGlzIGNhbGxlZC4KKyAgICoKKyAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIHdlIHdlcmUgdW5hYmxlIHRvIGxpc3RlbgorICAgKi8KKyAgdmlydHVhbCB2b2lkIGxpc3RlbigpIHt9CisKKyAgLyoqCisgICAqIEdldHMgYSBuZXcgZHluYW1pY2FsbHkgYWxsb2NhdGVkIHRyYW5zcG9ydCBvYmplY3QgYW5kIHBhc3NlcyBpdCB0byB0aGUKKyAgICogY2FsbGVyLiBOb3RlIHRoYXQgaXQgaXMgdGhlIGV4cGxpY2l0IGR1dHkgb2YgdGhlIGNhbGxlciB0byBmcmVlIHRoZQorICAgKiBhbGxvY2F0ZWQgb2JqZWN0LiBUaGUgcmV0dXJuZWQgVFRyYW5zcG9ydCBvYmplY3QgbXVzdCBhbHdheXMgYmUgaW4gdGhlCisgICAqIG9wZW5lZCBzdGF0ZS4gTlVMTCBzaG91bGQgbmV2ZXIgYmUgcmV0dXJuZWQsIGluc3RlYWQgYW4gRXhjZXB0aW9uIHNob3VsZAorICAgKiBhbHdheXMgYmUgdGhyb3duLgorICAgKgorICAgKiBAcmV0dXJuIEEgbmV3IFRUcmFuc3BvcnQgb2JqZWN0CisgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvcgorICAgKi8KKyAgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IGFjY2VwdCgpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gcmVzdWx0ID0gYWNjZXB0SW1wbCgpOworICAgIGlmICghcmVzdWx0KSB7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJhY2NlcHQoKSBtYXkgbm90IHJldHVybiBOVUxMIik7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICAvKioKKyAgKiBVdGlsaXR5IG1ldGhvZAorICAqIAorICAqIEByZXR1cm4gc2VydmVyIHNvY2tldCBmaWxlIGRlc2NyaXB0b3IgCisgICogQHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJzCisgICovCisKKyAgdmlydHVhbCBUSFJJRlRfU09DS0VUIGdldFNvY2tldEZEKCkgPSAwOworCisgIHZpcnR1YWwgaW50IGdldFBvcnQoKSA9IDA7CisKKyAgdmlydHVhbCBpbnQgZ2V0TGlzdGVuUG9ydCgpID0gMDsKKworICAvKioKKyAgICogQ2xvc2VzIHRoaXMgdHJhbnNwb3J0IHN1Y2ggdGhhdCBmdXR1cmUgY2FsbHMgdG8gYWNjZXB0IHdpbGwgZG8gbm90aGluZy4KKyAgICovCisgIHZpcnR1YWwgdm9pZCBjbG9zZSgpID0gMDsKKworcHJvdGVjdGVkOgorICBUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQoKSB7fQorCisgIC8qKgorICAgKiBTdWJjbGFzc2VzIHNob3VsZCBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbiBmb3IgYWNjZXB0LgorICAgKgorICAgKiBAcmV0dXJuIEEgbmV3bHkgYWxsb2NhdGVkIFRUcmFuc3BvcnQgb2JqZWN0CisgICAqIEB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3VycworICAgKi8KKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gYWNjZXB0SW1wbCgpID0gMDsKKworfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UTk9OQkxPQ0tJTkdTRVJWRVJUUkFOU1BPUlRfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGUuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UUGlwZS5jcHAKaW5kZXggYjFlMWI3Mi4uOGE4NDQ1NyAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UUGlwZS5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UUGlwZS5jcHAKQEAgLTI4LDggKzI4LDYgQEAKIG5hbWVzcGFjZSB0aHJpZnQgewogbmFtZXNwYWNlIHRyYW5zcG9ydCB7CiAKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KIC8qKgogKiBUUGlwZSBpbXBsZW1lbnRhdGlvbi4KICovCkBAIC00NSw3ICs0Myw3IEBACiBjbGFzcyBUUGlwZUltcGwgOiBib29zdDo6bm9uY29weWFibGUgewogcHVibGljOgogICBUUGlwZUltcGwoKSB7fQotICB2aXJ0dWFsIH5UUGlwZUltcGwoKSA9IDAge30KKyAgdmlydHVhbCB+VFBpcGVJbXBsKCkge30KICAgdmlydHVhbCB1aW50MzJfdCByZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSA9IDA7CiAgIHZpcnR1YWwgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgPSAwOwogICB2aXJ0dWFsIEhBTkRMRSBnZXRQaXBlSGFuZGxlKCkgPSAwOyAvLyBkb3VibGVzIGFzIHRoZSByZWFkIGhhbmRsZSBmb3IgYW5vbiBwaXBlCkBAIC0xNjAsNyArMTU4LDggQEAKICAgICBlbmRfdW5yZWFkX2lkeF8gPSBlbmRBc3luY1JlYWQoKTsKICAgfQogCi0gIHVpbnQzMl90IGJ5dGVzX3RvX2NvcHkgPSAoc3RkOjptaW4pKGxlbiwgZW5kX3VucmVhZF9pZHhfIC0gYmVnaW5fdW5yZWFkX2lkeF8pOworICB1aW50MzJfdCBfX2lkeHNpemUgPSBlbmRfdW5yZWFkX2lkeF8gLSBiZWdpbl91bnJlYWRfaWR4XzsKKyAgdWludDMyX3QgYnl0ZXNfdG9fY29weSA9IChsZW4gPCBfX2lkeHNpemUpID8gbGVuIDogX19pZHhzaXplOwogICBtZW1jcHkoYnVmLCAmYnVmZmVyX1tiZWdpbl91bnJlYWRfaWR4X10sIGJ5dGVzX3RvX2NvcHkpOwogICBiZWdpbl91bnJlYWRfaWR4XyArPSBieXRlc190b19jb3B5OwogICBpZiAoYmVnaW5fdW5yZWFkX2lkeF8gIT0gZW5kX3VucmVhZF9pZHhfKSB7CkBAIC0zNDEsMTIgKzM0MCwxMiBAQAogLy8gQWNjZXNzb3JzCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1zdHJpbmcgVFBpcGU6OmdldFBpcGVuYW1lKCkgeworc3RkOjpzdHJpbmcgVFBpcGU6OmdldFBpcGVuYW1lKCkgewogICByZXR1cm4gcGlwZW5hbWVfOwogfQogCiB2b2lkIFRQaXBlOjpzZXRQaXBlbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgcGlwZW5hbWUpIHsKLSAgaWYgKHBpcGVuYW1lLmZpbmQoIlxcXFwiKSA9PSAtMSkKKyAgaWYgKHBpcGVuYW1lLmZpbmQoIlxcXFwiKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykKICAgICBwaXBlbmFtZV8gPSAiXFxcXC5cXHBpcGVcXCIgKyBwaXBlbmFtZTsKICAgZWxzZQogICAgIHBpcGVuYW1lXyA9IHBpcGVuYW1lOwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UUGlwZS5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UUGlwZS5oCmluZGV4IGZkYjE3ZWUuLmFhMTRmOTUgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGUuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RQaXBlLmgKQEAgLTUxLDggKzUxLDggQEAKICAgLy8gQ29uc3RydWN0cyBhIG5ldyBwaXBlIG9iamVjdC4KICAgVFBpcGUoKTsKICAgLy8gTmFtZWQgcGlwZSBjb25zdHJ1Y3RvcnMgLQotICBleHBsaWNpdCBUUGlwZShIQU5ETEUgUGlwZSk7IC8vIEhBTkRMRSBpcyBhIHZvaWQqCi0gIGV4cGxpY2l0IFRQaXBlKFRBdXRvSGFuZGxlICZQaXBlKTsgLy8gdGhpcyBjdG9yIHdpbGwgY2xlYXIgb3V0IC8gbW92ZSBmcm9tIFBpcGUKKyAgZXhwbGljaXQgVFBpcGUoSEFORExFIFBpcGUpOyAgICAgICAvLyBIQU5ETEUgaXMgYSB2b2lkKgorICBleHBsaWNpdCBUUGlwZShUQXV0b0hhbmRsZSYgUGlwZSk7IC8vIHRoaXMgY3RvciB3aWxsIGNsZWFyIG91dCAvIG1vdmUgZnJvbSBQaXBlCiAgIC8vIG5lZWQgYSBjb25zdCBjaGFyICogb3ZlcmxvYWQgc28gc3RyaW5nIGxpdGVyYWxzIGRvbid0IGdvIHRvIHRoZSBIQU5ETEUgb3ZlcmxvYWQKICAgZXhwbGljaXQgVFBpcGUoY29uc3QgY2hhciogcGlwZW5hbWUpOwogICBleHBsaWNpdCBUUGlwZShjb25zdCBzdGQ6OnN0cmluZyYgcGlwZW5hbWUpOwpAQCAtOTUsNyArOTUsNyBAQAogICBIQU5ETEUgZ2V0TmF0aXZlV2FpdEhhbmRsZSgpOwogCiBwcml2YXRlOgotICBib29zdDo6c2hhcmVkX3B0cjxUUGlwZUltcGw+IGltcGxfOworICBzdGQ6OnNoYXJlZF9wdHI8VFBpcGVJbXBsPiBpbXBsXzsKIAogICBzdGQ6OnN0cmluZyBwaXBlbmFtZV87CiAKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGVTZXJ2ZXIuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UUGlwZVNlcnZlci5jcHAKaW5kZXggYmFhMjYwMy4uNTVjMzU4MCAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UUGlwZVNlcnZlci5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UUGlwZVNlcnZlci5jcHAKQEAgLTIyLDcgKzIyLDYgQEAKIAogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFBpcGUuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RQaXBlU2VydmVyLmg+Ci0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+CiAjaW5jbHVkZSA8Ym9vc3Qvbm9uY29weWFibGUuaHBwPgogCiAjaWZkZWYgX1dJTjMyCkBAIC0zNywxNSArMzYsMTQgQEAKIAogI2lmZGVmIF9XSU4zMgogCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CiAKIGNsYXNzIFRQaXBlU2VydmVySW1wbCA6IGJvb3N0Ojpub25jb3B5YWJsZSB7CiBwdWJsaWM6CiAgIFRQaXBlU2VydmVySW1wbCgpIHt9Ci0gIHZpcnR1YWwgflRQaXBlU2VydmVySW1wbCgpID0gMCB7fQorICB2aXJ0dWFsIH5UUGlwZVNlcnZlckltcGwoKSB7fQogICB2aXJ0dWFsIHZvaWQgaW50ZXJydXB0KCkgPSAwOwotICB2aXJ0dWFsIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdEltcGwoKSA9IDA7CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdEltcGwoKSA9IDA7CiAKICAgdmlydHVhbCBIQU5ETEUgZ2V0UGlwZUhhbmRsZSgpID0gMDsKICAgdmlydHVhbCBIQU5ETEUgZ2V0V3J0UGlwZUhhbmRsZSgpID0gMDsKQEAgLTc2LDcgKzc0LDcgQEAKIAogICB2aXJ0dWFsIHZvaWQgaW50ZXJydXB0KCkge30gLy8gbm90IGN1cnJlbnRseSBpbXBsZW1lbnRlZAogCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0SW1wbCgpOworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHRJbXBsKCk7CiAKICAgdmlydHVhbCBIQU5ETEUgZ2V0UGlwZUhhbmRsZSgpIHsgcmV0dXJuIFBpcGVSXy5oOyB9CiAgIHZpcnR1YWwgSEFORExFIGdldFdydFBpcGVIYW5kbGUoKSB7IHJldHVybiBQaXBlV18uaDsgfQpAQCAtMTE4LDcgKzExNiw3IEBACiAgICAgfQogICB9CiAKLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHRJbXBsKCk7CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdEltcGwoKTsKIAogICB2aXJ0dWFsIEhBTkRMRSBnZXRQaXBlSGFuZGxlKCkgeyByZXR1cm4gUGlwZV8uaDsgfQogICB2aXJ0dWFsIEhBTkRMRSBnZXRXcnRQaXBlSGFuZGxlKCkgeyByZXR1cm4gSU5WQUxJRF9IQU5ETEVfVkFMVUU7IH0KQEAgLTE0Miw3ICsxNDAsNyBAQAogCiAgIFRDcml0aWNhbFNlY3Rpb24gcGlwZV9wcm90ZWN0XzsKICAgLy8gb25seSByZWFkIG9yIHdyaXRlIHRoZXNlIHZhcmlhYmxlcyB1bmRlcm5lYXRoIGEgbG9ja2VkIHBpcGVfcHJvdGVjdF8KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFBpcGU+IGNhY2hlZF9jbGllbnRfOworICBzdGQ6OnNoYXJlZF9wdHI8VFBpcGU+IGNhY2hlZF9jbGllbnRfOwogICBUQXV0b0hhbmRsZSBQaXBlXzsKIH07CiAKQEAgLTI5Nyw2ICsyOTUsMTAgQEAKICAgLy8gaWYgd2UgZ290IGhlcmUsIHRoZW4gd2UgYXJlIGluIGFuIGVycm9yIC8gc2h1dGRvd24gY2FzZQogICBEV09SRCBnbGUgPSBHZXRMYXN0RXJyb3IoKTsgLy8gc2F2ZSBlcnJvciBiZWZvcmUgZG9pbmcgY2xlYW51cAogICBHbG9iYWxPdXRwdXQucGVycm9yKCJUUGlwZVNlcnZlciBDb25uZWN0TmFtZWRQaXBlIEdMRT0iLCBnbGUpOworICBpZihnbGUgPT0gRVJST1JfT1BFUkFUSU9OX0FCT1JURUQpIHsKKyAgICBUQXV0b0NyaXQgbG9jayhwaXBlX3Byb3RlY3RfKTsgICAgCS8vIE5lZWRlZCB0byBpbnN1cmUgY29uY3VycmVudCB0aHJlYWQgdG8gYmUgb3V0IG9mIGludGVycnVwdC4KKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OklOVEVSUlVQVEVELCAiVFBpcGVTZXJ2ZXI6IHNlcnZlciBpbnRlcnVwdGVkIik7CisgIH0KICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIlRQaXBlU2VydmVyOiBjbGllbnQgY29ubmVjdGlvbiBmYWlsZWQiKTsKIH0KIApAQCAtMzUxLDEyICszNTMsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgLy8gY2xpZW50IHRpbWUtb3V0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhKSk7ICAgICAgICAgICAgICAgIC8vIHNlY3VyaXR5IGF0dHJpYnV0ZXMKIAorICBEV09SRCBsYXN0RXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgTG9jYWxGcmVlKHNkKTsKKyAgTG9jYWxGcmVlKGFjbCk7CisgIEZyZWVTaWQoZXZlcnlvbmVfc2lkKTsKKwogICBpZiAoaFBpcGUuaCA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgewogICAgIFBpcGVfLnJlc2V0KCk7Ci0gICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFBpcGVTZXJ2ZXI6OlRDcmVhdGVOYW1lZFBpcGUoKSBHTEU9IiwgR2V0TGFzdEVycm9yKCkpOworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRQaXBlU2VydmVyOjpUQ3JlYXRlTmFtZWRQaXBlKCkgR0xFPSIsIGxhc3RFcnJvcik7CiAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUQ3JlYXRlTmFtZWRQaXBlKCkgZmFpbGVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldExhc3RFcnJvcigpKTsKKyAgICAgICAgICAgICAgICBsYXN0RXJyb3IpOwogICAgIHJldHVybiBmYWxzZTsKICAgfQogCkBAIC0zOTksMTIgKzQwNiwxMiBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIEFjY2Vzc29ycwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXN0cmluZyBUUGlwZVNlcnZlcjo6Z2V0UGlwZW5hbWUoKSB7CitzdGQ6OnN0cmluZyBUUGlwZVNlcnZlcjo6Z2V0UGlwZW5hbWUoKSB7CiAgIHJldHVybiBwaXBlbmFtZV87CiB9CiAKIHZvaWQgVFBpcGVTZXJ2ZXI6OnNldFBpcGVuYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBwaXBlbmFtZSkgewotICBpZiAocGlwZW5hbWUuZmluZCgiXFxcXCIpID09IC0xKQorICBpZiAocGlwZW5hbWUuZmluZCgiXFxcXCIpID09IHN0ZDo6c3RyaW5nOjpucG9zKQogICAgIHBpcGVuYW1lXyA9ICJcXFxcLlxccGlwZVxcIiArIHBpcGVuYW1lOwogICBlbHNlCiAgICAgcGlwZW5hbWVfID0gcGlwZW5hbWU7CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RQaXBlU2VydmVyLmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RQaXBlU2VydmVyLmgKaW5kZXggNDA1NzkzZS4uYzliMTNlNSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UUGlwZVNlcnZlci5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGVTZXJ2ZXIuaApAQCAtMjAsOCArMjAsOCBAQAogI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UU0VSVkVSV0lOUElQRVNfSF8KICNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVFNFUlZFUldJTlBJUEVTX0hfIDEKIAorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuaD4KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KICNpZm5kZWYgX1dJTjMyCiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0Lmg+CiAjZW5kaWYKQEAgLTgyLDEwICs4MiwxMCBAQAogICBIQU5ETEUgZ2V0TmF0aXZlV2FpdEhhbmRsZSgpOwogCiBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0SW1wbCgpOworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHRJbXBsKCk7CiAKIHByaXZhdGU6Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQaXBlU2VydmVySW1wbD4gaW1wbF87CisgIHN0ZDo6c2hhcmVkX3B0cjxUUGlwZVNlcnZlckltcGw+IGltcGxfOwogCiAgIHN0ZDo6c3RyaW5nIHBpcGVuYW1lXzsKICAgdWludDMyX3QgYnVmc2l6ZV87CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTU0xTZXJ2ZXJTb2NrZXQuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMU2VydmVyU29ja2V0LmNwcAppbmRleCA3ZTE0ODRkLi4zNDYwNWMwIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTU0xTZXJ2ZXJTb2NrZXQuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNlcnZlclNvY2tldC5jcHAKQEAgLTI3LDE0ICsyNywxNCBAQAogLyoqCiAgKiBTU0wgc2VydmVyIHNvY2tldCBpbXBsZW1lbnRhdGlvbi4KICAqLwotVFNTTFNlcnZlclNvY2tldDo6VFNTTFNlcnZlclNvY2tldChpbnQgcG9ydCwgYm9vc3Q6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnkpCitUU1NMU2VydmVyU29ja2V0OjpUU1NMU2VydmVyU29ja2V0KGludCBwb3J0LCBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnkpCiAgIDogVFNlcnZlclNvY2tldChwb3J0KSwgZmFjdG9yeV8oZmFjdG9yeSkgewogICBmYWN0b3J5Xy0+c2VydmVyKHRydWUpOwogfQogCiBUU1NMU2VydmVyU29ja2V0OjpUU1NMU2VydmVyU29ja2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBhZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeSkKICAgOiBUU2VydmVyU29ja2V0KGFkZHJlc3MsIHBvcnQpLCBmYWN0b3J5XyhmYWN0b3J5KSB7CiAgIGZhY3RvcnlfLT5zZXJ2ZXIodHJ1ZSk7CiB9CkBAIC00MiwxMyArNDIsMTggQEAKIFRTU0xTZXJ2ZXJTb2NrZXQ6OlRTU0xTZXJ2ZXJTb2NrZXQoaW50IHBvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZW5kVGltZW91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlY3ZUaW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5KQogICA6IFRTZXJ2ZXJTb2NrZXQocG9ydCwgc2VuZFRpbWVvdXQsIHJlY3ZUaW1lb3V0KSwgZmFjdG9yeV8oZmFjdG9yeSkgewogICBmYWN0b3J5Xy0+c2VydmVyKHRydWUpOwogfQogCi1ib29zdDo6c2hhcmVkX3B0cjxUU29ja2V0PiBUU1NMU2VydmVyU29ja2V0OjpjcmVhdGVTb2NrZXQoVEhSSUZUX1NPQ0tFVCBjbGllbnQpIHsKLSAgcmV0dXJuIGZhY3RvcnlfLT5jcmVhdGVTb2NrZXQoY2xpZW50KTsKK3N0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBUU1NMU2VydmVyU29ja2V0OjpjcmVhdGVTb2NrZXQoVEhSSUZUX1NPQ0tFVCBjbGllbnQpIHsKKyAgaWYgKGludGVycnVwdGFibGVDaGlsZHJlbl8pIHsKKyAgICAgIHJldHVybiBmYWN0b3J5Xy0+Y3JlYXRlU29ja2V0KGNsaWVudCwgcENoaWxkSW50ZXJydXB0U29ja1JlYWRlcl8pOworCisgIH0gZWxzZSB7CisgICAgICByZXR1cm4gZmFjdG9yeV8tPmNyZWF0ZVNvY2tldChjbGllbnQpOworICB9CiB9CiB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTU0xTZXJ2ZXJTb2NrZXQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNlcnZlclNvY2tldC5oCmluZGV4IGRmZGJkZTguLjhiNzVkZTggMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNlcnZlclNvY2tldC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNlcnZlclNvY2tldC5oCkBAIC0yMCw3ICsyMCw2IEBACiAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RTU0xTRVJWRVJTT0NLRVRfSF8KICNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVFNTTFNFUlZFUlNPQ0tFVF9IXyAxCiAKLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaD4KIAogbmFtZXNwYWNlIGFwYWNoZSB7CkBAIC00MCw3ICszOSw3IEBACiAgICAqIEBwYXJhbSBwb3J0ICAgIExpc3RlbmluZyBwb3J0CiAgICAqIEBwYXJhbSBmYWN0b3J5IFNTTCBzb2NrZXQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbgogICAgKi8KLSAgVFNTTFNlcnZlclNvY2tldChpbnQgcG9ydCwgYm9vc3Q6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnkpOworICBUU1NMU2VydmVyU29ja2V0KGludCBwb3J0LCBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnkpOwogCiAgIC8qKgogICAgKiBDb25zdHJ1Y3Rvci4gIEJpbmRzIHRvIHRoZSBzcGVjaWZpZWQgYWRkcmVzcy4KQEAgLTUxLDcgKzUwLDcgQEAKICAgICovCiAgIFRTU0xTZXJ2ZXJTb2NrZXQoY29uc3Qgc3RkOjpzdHJpbmcmIGFkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgaW50IHBvcnQsCi0gICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnkpOworICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeSk7CiAKICAgLyoqCiAgICAqIENvbnN0cnVjdG9yLiAgQmluZHMgdG8gYWxsIGludGVyZmFjZXMuCkBAIC02NCwxMSArNjMsMTEgQEAKICAgVFNTTFNlcnZlclNvY2tldChpbnQgcG9ydCwKICAgICAgICAgICAgICAgICAgICBpbnQgc2VuZFRpbWVvdXQsCiAgICAgICAgICAgICAgICAgICAgaW50IHJlY3ZUaW1lb3V0LAotICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5KTsKKyAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnkpOwogCiBwcm90ZWN0ZWQ6Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTb2NrZXQ+IGNyZWF0ZVNvY2tldChUSFJJRlRfU09DS0VUIHNvY2tldCk7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5XzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IGNyZWF0ZVNvY2tldChUSFJJRlRfU09DS0VUIHNvY2tldCk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeV87CiB9OwogfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMU29ja2V0LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNvY2tldC5jcHAKaW5kZXggOThjNTMyNi4uNzE4ZTliMSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMU29ja2V0LmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTU0xTb2NrZXQuY3BwCkBAIC0yMSw2ICsyMSw3IEBACiAKICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxjc3RyaW5nPgogI2lmZGVmIEhBVkVfQVJQQV9JTkVUX0gKICNpbmNsdWRlIDxhcnBhL2luZXQuaD4KICNlbmRpZgpAQCAtMjgsOCArMjksMjEgQEAKICNpZmRlZiBIQVZFX1NZU19TT0NLRVRfSAogI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KICNlbmRpZgotI2luY2x1ZGUgPGJvb3N0L2xleGljYWxfY2FzdC5ocHA+CisjaWZkZWYgSEFWRV9TWVNfUE9MTF9ICisjaW5jbHVkZSA8c3lzL3BvbGwuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfRkNOVExfSAorI2luY2x1ZGUgPGZjbnRsLmg+CisjZW5kaWYKKworI2RlZmluZSBPUEVOU1NMX1ZFUlNJT05fTk9fVEhSRUFEX0lEX0JFRk9SRSAgICAweDEwMDAwMDAwTAorI2RlZmluZSBPUEVOU1NMX0VOR0lORV9DTEVBTlVQX1JFUVVJUkVEX0JFRk9SRSAweDEwMTAwMDAwTAorCiAjaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX2FycmF5LmhwcD4KKyNpbmNsdWRlIDxvcGVuc3NsL29wZW5zc2x2Lmg+CisjaWYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPCBPUEVOU1NMX0VOR0lORV9DTEVBTlVQX1JFUVVJUkVEX0JFRk9SRSkKKyNpbmNsdWRlIDxvcGVuc3NsL2VuZ2luZS5oPgorI2VuZGlmCiAjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KICNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KICNpbmNsdWRlIDxvcGVuc3NsL3NzbC5oPgpAQCAtMzcsMTEgKzUxLDEwIEBACiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU1NMU29ja2V0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9QbGF0Zm9ybVNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC9UVG9TdHJpbmcuaD4KIAotI2RlZmluZSBPUEVOU1NMX1ZFUlNJT05fTk9fVEhSRUFEX0lEIDB4MTAwMDAwMDBMCi0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OwordXNpbmcgc3RkOjpzdHJpbmc7CiAKIHN0cnVjdCBDUllQVE9fZHlubG9ja192YWx1ZSB7CiAgIE11dGV4IG11dGV4OwpAQCAtNTgsMTUgKzcxLDIyIEBACiAKIHN0YXRpYyB2b2lkIGNhbGxiYWNrTG9ja2luZyhpbnQgbW9kZSwgaW50IG4sIGNvbnN0IGNoYXIqLCBpbnQpIHsKICAgaWYgKG1vZGUgJiBDUllQVE9fTE9DSykgeworICAgIC8vIGFzc2VydGlvbiBvZiAocHggIT0gMCkgaGVyZSB0eXBpY2FsbHkgbWVhbnMgdGhhdCBhIFRTU0xTb2NrZXQncyBsaWZldGltZQorICAgIC8vIGV4Y2VlZGVkIHRoZSBsaWZldGltZSBvZiB0aGUgVFNTTFNvY2tldEZhY3RvcnkgdGhhdCBjcmVhdGVkIGl0LCBhbmQgdGhlCisgICAgLy8gVFNTTFNvY2tldEZhY3RvcnkgYWxyZWFkeSByYW4gY2xlYW51cE9wZW5TU0woKSwgd2hpY2ggZGVsZXRlZCAibXV0ZXhlcyIuCiAgICAgbXV0ZXhlc1tuXS5sb2NrKCk7CiAgIH0gZWxzZSB7CiAgICAgbXV0ZXhlc1tuXS51bmxvY2soKTsKICAgfQogfQogCi0jaWYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPCBPUEVOU1NMX1ZFUlNJT05fTk9fVEhSRUFEX0lEKQorI2lmIChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSIDwgT1BFTlNTTF9WRVJTSU9OX05PX1RIUkVBRF9JRF9CRUZPUkUpCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBjYWxsYmFja1RocmVhZElEKCkgeworI2lmZGVmIF9XSU4zMgorICByZXR1cm4gKHVuc2lnbmVkIGxvbmcpR2V0Q3VycmVudFRocmVhZElkKCk7CisjZWxzZQogICByZXR1cm4gKHVuc2lnbmVkIGxvbmcpcHRocmVhZF9zZWxmKCk7CisjZW5kaWYKIH0KICNlbmRpZgogCkBAIC05NSwxNyArMTE1LDIyIEBACiAgIG9wZW5TU0xJbml0aWFsaXplZCA9IHRydWU7CiAgIFNTTF9saWJyYXJ5X2luaXQoKTsKICAgU1NMX2xvYWRfZXJyb3Jfc3RyaW5ncygpOworICBFUlJfbG9hZF9jcnlwdG9fc3RyaW5ncygpOworCiAgIC8vIHN0YXRpYyBsb2NraW5nCisgIC8vIG5ld2VyIHZlcnNpb25zIG9mIE9wZW5TU0wgY2hhbmdlZCBDUllQVE9fbnVtX2xvY2tzIC0gc2VlIFRIUklGVC0zODc4CisjaWZkZWYgQ1JZUFRPX251bV9sb2NrcworICBtdXRleGVzID0gYm9vc3Q6OnNoYXJlZF9hcnJheTxNdXRleD4obmV3IE11dGV4W0NSWVBUT19udW1fbG9ja3MoKV0pOworI2Vsc2UKICAgbXV0ZXhlcyA9IGJvb3N0OjpzaGFyZWRfYXJyYXk8TXV0ZXg+KG5ldyBNdXRleFsgOjpDUllQVE9fbnVtX2xvY2tzKCldKTsKLSAgaWYgKG11dGV4ZXMgPT0gTlVMTCkgewotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6SU5URVJOQUxfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5pdGlhbGl6ZU9wZW5TU0woKSBmYWlsZWQsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvdXQgb2YgbWVtb3J5IHdoaWxlIGNyZWF0aW5nIG11dGV4IGFycmF5Iik7Ci0gIH0KLSNpZiAoT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA8IE9QRU5TU0xfVkVSU0lPTl9OT19USFJFQURfSUQpCisjZW5kaWYKKworI2lmIChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSIDwgT1BFTlNTTF9WRVJTSU9OX05PX1RIUkVBRF9JRF9CRUZPUkUpCiAgIENSWVBUT19zZXRfaWRfY2FsbGJhY2soY2FsbGJhY2tUaHJlYWRJRCk7CiAjZW5kaWYKKwogICBDUllQVE9fc2V0X2xvY2tpbmdfY2FsbGJhY2soY2FsbGJhY2tMb2NraW5nKTsKKwogICAvLyBkeW5hbWljIGxvY2tpbmcKICAgQ1JZUFRPX3NldF9keW5sb2NrX2NyZWF0ZV9jYWxsYmFjayhkeW5fY3JlYXRlKTsKICAgQ1JZUFRPX3NldF9keW5sb2NrX2xvY2tfY2FsbGJhY2soZHluX2xvY2spOwpAQCAtMTE3LDIxICsxNDIsMjIgQEAKICAgICByZXR1cm47CiAgIH0KICAgb3BlblNTTEluaXRpYWxpemVkID0gZmFsc2U7Ci0jaWYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPCBPUEVOU1NMX1ZFUlNJT05fTk9fVEhSRUFEX0lEKQotICBDUllQVE9fc2V0X2lkX2NhbGxiYWNrKE5VTEwpOworCisgIC8vIGh0dHBzOi8vd2lraS5vcGVuc3NsLm9yZy9pbmRleC5waHAvTGlicmFyeV9Jbml0aWFsaXphdGlvbiNDbGVhbnVwCisgIC8vIHdlIHB1cnBvc2VmdWxseSBkbyBOT1QgY2FsbCBGSVBTX21vZGVfc2V0KDApIGFuZCBsZWF2ZSBpdCB1cCB0byB0aGUgZW5jbG9zaW5nIGFwcGxpY2F0aW9uIHRvIG1hbmFnZSBGSVBTIGVudGlyZWx5CisjaWYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPCBPUEVOU1NMX0VOR0lORV9DTEVBTlVQX1JFUVVJUkVEX0JFRk9SRSkKKyAgRU5HSU5FX2NsZWFudXAoKTsgICAgICAgICAgICAgLy8gaHR0cHM6Ly93d3cub3BlbnNzbC5vcmcvZG9jcy9tYW4xLjEuMC9jcnlwdG8vRU5HSU5FX2NsZWFudXAuaHRtbCAtIGNsZWFudXAgY2FsbCBpcyBuZWVkZWQgYmVmb3JlIDEuMS4wCiAjZW5kaWYKLSAgQ1JZUFRPX3NldF9sb2NraW5nX2NhbGxiYWNrKE5VTEwpOwotICBDUllQVE9fc2V0X2R5bmxvY2tfY3JlYXRlX2NhbGxiYWNrKE5VTEwpOwotICBDUllQVE9fc2V0X2R5bmxvY2tfbG9ja19jYWxsYmFjayhOVUxMKTsKLSAgQ1JZUFRPX3NldF9keW5sb2NrX2Rlc3Ryb3lfY2FsbGJhY2soTlVMTCk7Ci0gIEVSUl9mcmVlX3N0cmluZ3MoKTsKKyAgQ09ORl9tb2R1bGVzX3VubG9hZCgxKTsKICAgRVZQX2NsZWFudXAoKTsKICAgQ1JZUFRPX2NsZWFudXBfYWxsX2V4X2RhdGEoKTsKICAgRVJSX3JlbW92ZV9zdGF0ZSgwKTsKKyAgRVJSX2ZyZWVfc3RyaW5ncygpOworCiAgIG11dGV4ZXMucmVzZXQoKTsKIH0KIAotc3RhdGljIHZvaWQgYnVpbGRFcnJvcnMoc3RyaW5nJiBtZXNzYWdlLCBpbnQgZXJyb3IgPSAwKTsKK3N0YXRpYyB2b2lkIGJ1aWxkRXJyb3JzKHN0cmluZyYgbWVzc2FnZSwgaW50IGVycm5vX2NvcHkgPSAwLCBpbnQgc3NsZXJybm8gPSAwKTsKIHN0YXRpYyBib29sIG1hdGNoTmFtZShjb25zdCBjaGFyKiBob3N0LCBjb25zdCBjaGFyKiBwYXR0ZXJuLCBpbnQgc2l6ZSk7CiBzdGF0aWMgY2hhciB1cHBlcmNhc2UoY2hhciBjKTsKIApAQCAtMTM5LDggKzE2NSwxMCBAQAogU1NMQ29udGV4dDo6U1NMQ29udGV4dChjb25zdCBTU0xQcm90b2NvbCYgcHJvdG9jb2wpIHsKICAgaWYgKHByb3RvY29sID09IFNTTFRMUykgewogICAgIGN0eF8gPSBTU0xfQ1RYX25ldyhTU0x2MjNfbWV0aG9kKCkpOworI2lmbmRlZiBPUEVOU1NMX05PX1NTTDMKICAgfSBlbHNlIGlmIChwcm90b2NvbCA9PSBTU0x2MykgewogICAgIGN0eF8gPSBTU0xfQ1RYX25ldyhTU0x2M19tZXRob2QoKSk7CisjZW5kaWYKICAgfSBlbHNlIGlmIChwcm90b2NvbCA9PSBUTFN2MV8wKSB7CiAgICAgY3R4XyA9IFNTTF9DVFhfbmV3KFRMU3YxX21ldGhvZCgpKTsKICAgfSBlbHNlIGlmIChwcm90b2NvbCA9PSBUTFN2MV8xKSB7CkBAIC0xODUsMjIgKzIxMyw1OSBAQAogfQogCiAvLyBUU1NMU29ja2V0IGltcGxlbWVudGF0aW9uCi1UU1NMU29ja2V0OjpUU1NMU29ja2V0KGJvb3N0OjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eCkKK1RTU0xTb2NrZXQ6OlRTU0xTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eCkKICAgOiBUU29ja2V0KCksIHNlcnZlcl8oZmFsc2UpLCBzc2xfKE5VTEwpLCBjdHhfKGN0eCkgeworICBpbml0KCk7CiB9CiAKLVRTU0xTb2NrZXQ6OlRTU0xTb2NrZXQoYm9vc3Q6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4LCBUSFJJRlRfU09DS0VUIHNvY2tldCkKK1RTU0xTb2NrZXQ6OlRTU0xTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eCwgc3RkOjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyKQorICAgICAgICA6IFRTb2NrZXQoKSwgc2VydmVyXyhmYWxzZSksIHNzbF8oTlVMTCksIGN0eF8oY3R4KSB7CisgIGluaXQoKTsKKyAgaW50ZXJydXB0TGlzdGVuZXJfID0gaW50ZXJydXB0TGlzdGVuZXI7Cit9CisKK1RTU0xTb2NrZXQ6OlRTU0xTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eCwgVEhSSUZUX1NPQ0tFVCBzb2NrZXQpCiAgIDogVFNvY2tldChzb2NrZXQpLCBzZXJ2ZXJfKGZhbHNlKSwgc3NsXyhOVUxMKSwgY3R4XyhjdHgpIHsKKyAgaW5pdCgpOwogfQogCi1UU1NMU29ja2V0OjpUU1NMU29ja2V0KGJvb3N0OjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eCwgc3RyaW5nIGhvc3QsIGludCBwb3J0KQorVFNTTFNvY2tldDo6VFNTTFNvY2tldChzdGQ6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4LCBUSFJJRlRfU09DS0VUIHNvY2tldCwgc3RkOjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyKQorICAgICAgICA6IFRTb2NrZXQoc29ja2V0LCBpbnRlcnJ1cHRMaXN0ZW5lciksIHNlcnZlcl8oZmFsc2UpLCBzc2xfKE5VTEwpLCBjdHhfKGN0eCkgeworICBpbml0KCk7Cit9CisKK1RTU0xTb2NrZXQ6OlRTU0xTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eCwgc3RyaW5nIGhvc3QsIGludCBwb3J0KQogICA6IFRTb2NrZXQoaG9zdCwgcG9ydCksIHNlcnZlcl8oZmFsc2UpLCBzc2xfKE5VTEwpLCBjdHhfKGN0eCkgeworICBpbml0KCk7Cit9CisKK1RTU0xTb2NrZXQ6OlRTU0xTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eCwgc3RyaW5nIGhvc3QsIGludCBwb3J0LCBzdGQ6OnNoYXJlZF9wdHI8VEhSSUZUX1NPQ0tFVD4gaW50ZXJydXB0TGlzdGVuZXIpCisgICAgICAgIDogVFNvY2tldChob3N0LCBwb3J0KSwgc2VydmVyXyhmYWxzZSksIHNzbF8oTlVMTCksIGN0eF8oY3R4KSB7CisgIGluaXQoKTsKKyAgaW50ZXJydXB0TGlzdGVuZXJfID0gaW50ZXJydXB0TGlzdGVuZXI7CiB9CiAKIFRTU0xTb2NrZXQ6On5UU1NMU29ja2V0KCkgewogICBjbG9zZSgpOwogfQogCitib29sIFRTU0xTb2NrZXQ6Omhhc1BlbmRpbmdEYXRhVG9SZWFkKCkgeworICBpZiAoIWlzT3BlbigpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGluaXRpYWxpemVIYW5kc2hha2UoKTsKKyAgaWYgKCFjaGVja0hhbmRzaGFrZSgpKQorICAgIHRocm93IFRTU0xFeGNlcHRpb24oIlRTU0xTb2NrZXQ6Omhhc1BlbmRpbmdEYXRhVG9SZWFkOiBIYW5kc2hha2UgaXMgbm90IGNvbXBsZXRlZCIpOworICAvLyBkYXRhIG1heSBiZSBhdmFpbGFibGUgaW4gU1NMIGJ1ZmZlcnMgKG5vdGU6IFNTTF9wZW5kaW5nIGRvZXMgbm90IGhhdmUgYSBmYWlsdXJlIG1vZGUpCisgIHJldHVybiBTU0xfcGVuZGluZyhzc2xfKSA+IDAgfHwgVFNvY2tldDo6aGFzUGVuZGluZ0RhdGFUb1JlYWQoKTsKK30KKwordm9pZCBUU1NMU29ja2V0Ojppbml0KCkgeworICBoYW5kc2hha2VDb21wbGV0ZWRfID0gZmFsc2U7CisgIHJlYWRSZXRyeUNvdW50XyA9IDA7CisgIGV2ZW50U2FmZV8gPSBmYWxzZTsKK30KKwogYm9vbCBUU1NMU29ja2V0Ojppc09wZW4oKSB7CiAgIGlmIChzc2xfID09IE5VTEwgfHwgIVRTb2NrZXQ6OmlzT3BlbigpKSB7CiAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMjE1LDIzICsyODAsNDYgQEAKICAgcmV0dXJuIHRydWU7CiB9CiAKKy8qCisgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBub3QgbGliZXZlbnQgc2FmZS4KKyovCiBib29sIFRTU0xTb2NrZXQ6OnBlZWsoKSB7CiAgIGlmICghaXNPcGVuKCkpIHsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KLSAgY2hlY2tIYW5kc2hha2UoKTsKKyAgaW5pdGlhbGl6ZUhhbmRzaGFrZSgpOworICBpZiAoIWNoZWNrSGFuZHNoYWtlKCkpCisgICAgdGhyb3cgVFNTTEV4Y2VwdGlvbigiU1NMX3BlZWs6IEhhbmRzaGFrZSBpcyBub3QgY29tcGxldGVkIik7CiAgIGludCByYzsKICAgdWludDhfdCBieXRlOwotICByYyA9IFNTTF9wZWVrKHNzbF8sICZieXRlLCAxKTsKLSAgaWYgKHJjIDwgMCkgewotICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7Ci0gICAgc3RyaW5nIGVycm9yczsKLSAgICBidWlsZEVycm9ycyhlcnJvcnMsIGVycm5vX2NvcHkpOwotICAgIHRocm93IFRTU0xFeGNlcHRpb24oIlNTTF9wZWVrOiAiICsgZXJyb3JzKTsKLSAgfQotICBpZiAocmMgPT0gMCkgewotICAgIEVSUl9jbGVhcl9lcnJvcigpOwotICB9CisgIGRvIHsKKyAgICByYyA9IFNTTF9wZWVrKHNzbF8sICZieXRlLCAxKTsKKyAgICBpZiAocmMgPCAwKSB7CisKKyAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICBpbnQgZXJyb3IgPSBTU0xfZ2V0X2Vycm9yKHNzbF8sIHJjKTsKKyAgICAgIHN3aXRjaCAoZXJyb3IpIHsKKyAgICAgICAgY2FzZSBTU0xfRVJST1JfU1lTQ0FMTDoKKyAgICAgICAgICBpZiAoKGVycm5vX2NvcHkgIT0gVEhSSUZUX0VJTlRSKQorICAgICAgICAgICAgICAmJiAoZXJybm9fY29weSAhPSBUSFJJRlRfRUFHQUlOKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAvLyBmYWxsdGhyb3VnaAorICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1JFQUQ6CisgICAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfV1JJVEU6CisgICAgICAgICAgLy8gaW4gdGhlIGNhc2Ugb2YgU1NMX0VSUk9SX1NZU0NBTEwgd2Ugd2FudCB0byB3YWl0IGZvciBhbiByZWFkIGV2ZW50IGFnYWluCisgICAgICAgICAgd2FpdEZvckV2ZW50KGVycm9yICE9IFNTTF9FUlJPUl9XQU5UX1dSSVRFKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgZGVmYXVsdDo7Ly8gZG8gbm90aGluZworICAgICAgfQorICAgICAgc3RyaW5nIGVycm9yczsKKyAgICAgIGJ1aWxkRXJyb3JzKGVycm9ycywgZXJybm9fY29weSwgZXJyb3IpOworICAgICAgdGhyb3cgVFNTTEV4Y2VwdGlvbigiU1NMX3BlZWs6ICIgKyBlcnJvcnMpOworICAgIH0gZWxzZSBpZiAocmMgPT0gMCkgeworICAgICAgRVJSX2NsZWFyX2Vycm9yKCk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0gd2hpbGUgKHRydWUpOwogICByZXR1cm4gKHJjID4gMCk7CiB9CiAKQEAgLTI0Miw2NCArMzMwLDIzNCBAQAogICBUU29ja2V0OjpvcGVuKCk7CiB9CiAKKy8qCisgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBub3QgbGliZXZlbnQgc2FmZS4KKyovCiB2b2lkIFRTU0xTb2NrZXQ6OmNsb3NlKCkgewogICBpZiAoc3NsXyAhPSBOVUxMKSB7Ci0gICAgaW50IHJjID0gU1NMX3NodXRkb3duKHNzbF8pOwotICAgIGlmIChyYyA8IDApIHsKLSAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7Ci0gICAgICBzdHJpbmcgZXJyb3JzOwotICAgICAgYnVpbGRFcnJvcnMoZXJyb3JzLCBlcnJub19jb3B5KTsKLSAgICAgIEdsb2JhbE91dHB1dCgoIlNTTF9zaHV0ZG93bjogIiArIGVycm9ycykuY19zdHIoKSk7CisgICAgdHJ5IHsKKyAgICAgIGludCByYzsKKyAgICAgIGludCBlcnJub19jb3B5ID0gMDsKKyAgICAgIGludCBlcnJvciA9IDA7CisKKyAgICAgIGRvIHsKKyAgICAgICAgcmMgPSBTU0xfc2h1dGRvd24oc3NsXyk7CisgICAgICAgIGlmIChyYyA8PSAwKSB7CisgICAgICAgICAgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgICAgIGVycm9yID0gU1NMX2dldF9lcnJvcihzc2xfLCByYyk7CisgICAgICAgICAgc3dpdGNoIChlcnJvcikgeworICAgICAgICAgICAgY2FzZSBTU0xfRVJST1JfU1lTQ0FMTDoKKyAgICAgICAgICAgICAgaWYgKChlcnJub19jb3B5ICE9IFRIUklGVF9FSU5UUikKKyAgICAgICAgICAgICAgICAgICYmIChlcnJub19jb3B5ICE9IFRIUklGVF9FQUdBSU4pKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGZhbGx0aHJvdWdoCisgICAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1JFQUQ6CisgICAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1dSSVRFOgorICAgICAgICAgICAgICAvLyBpbiB0aGUgY2FzZSBvZiBTU0xfRVJST1JfU1lTQ0FMTCB3ZSB3YW50IHRvIHdhaXQgZm9yIGFuIHdyaXRlL3JlYWQgZXZlbnQgYWdhaW4KKyAgICAgICAgICAgICAgd2FpdEZvckV2ZW50KGVycm9yID09IFNTTF9FUlJPUl9XQU5UX1JFQUQpOworICAgICAgICAgICAgICByYyA9IDI7CisgICAgICAgICAgICBkZWZhdWx0OjsvLyBkbyBub3RoaW5nCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IHdoaWxlIChyYyA9PSAyKTsKKworICAgICAgaWYgKHJjIDwgMCkgeworICAgICAgICBzdHJpbmcgZXJyb3JzOworICAgICAgICBidWlsZEVycm9ycyhlcnJvcnMsIGVycm5vX2NvcHksIGVycm9yKTsKKyAgICAgICAgR2xvYmFsT3V0cHV0KCgiU1NMX3NodXRkb3duOiAiICsgZXJyb3JzKS5jX3N0cigpKTsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiB0ZSkgeworICAgICAgLy8gRG9uJ3QgZW1pdCBhbiBleGNlcHRpb24gYmVjYXVzZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlCisgICAgICAvLyBkZXN0cnVjdG9yLiBUaGVyZSdzIGFsc28gbm90IG11Y2ggdGhhdCBhIHVzZXIgY2FuIGRvIHRvIHJlY292ZXIsIHNvCisgICAgICAvLyBqdXN0IGNsZWFuIHVwIGFzIG11Y2ggYXMgcG9zc2libGUgd2l0aG91dCB0aHJvd2luZywgc2ltaWxhciB0byB0aGUgcmMKKyAgICAgIC8vIDwgMCBjYXNlIGFib3ZlLgorICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiU1NMX3NodXRkb3duOiAlcyIsIHRlLndoYXQoKSk7CiAgICAgfQogICAgIFNTTF9mcmVlKHNzbF8pOwogICAgIHNzbF8gPSBOVUxMOworICAgIGhhbmRzaGFrZUNvbXBsZXRlZF8gPSBmYWxzZTsKICAgICBFUlJfcmVtb3ZlX3N0YXRlKDApOwogICB9CiAgIFRTb2NrZXQ6OmNsb3NlKCk7CiB9CiAKKy8qCisgKiBSZXR1cm5zIG51bWJlciBvZiBieXRlcyByZWFkIGluIFNTTCBTb2NrZXQuCisgKiBJZiBldmVudFNhZmUgaXMgc2V0LCBhbmQgaXQgbWF5IHJldHVybnMgMCBieXRlcyB0aGVuIHJlYWQgbWV0aG9kCisgKiBuZWVkcyB0byBiZSBjYWxsZWQgYWdhaW4gdW50aWwgaXQgaXMgc3VjY2Vzc2Z1bGwgb3IgaXQgdGhyb3dzCisgKiBleGNlcHRpb24gaW5jYXNlIG9mIGZhaWx1cmUuCisqLwogdWludDMyX3QgVFNTTFNvY2tldDo6cmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICBjaGVja0hhbmRzaGFrZSgpOworICBpbml0aWFsaXplSGFuZHNoYWtlKCk7CisgIGlmICghY2hlY2tIYW5kc2hha2UoKSkKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJyZXRyeSBhZ2FpbiIpOwogICBpbnQzMl90IGJ5dGVzID0gMDsKLSAgZm9yIChpbnQzMl90IHJldHJpZXMgPSAwOyByZXRyaWVzIDwgbWF4UmVjdlJldHJpZXNfOyByZXRyaWVzKyspIHsKKyAgd2hpbGUgKHJlYWRSZXRyeUNvdW50XyA8IG1heFJlY3ZSZXRyaWVzXykgewogICAgIGJ5dGVzID0gU1NMX3JlYWQoc3NsXywgYnVmLCBsZW4pOwotICAgIGlmIChieXRlcyA+PSAwKQorICAgIGludDMyX3QgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIGludDMyX3QgZXJyb3IgPSBTU0xfZ2V0X2Vycm9yKHNzbF8sIGJ5dGVzKTsKKyAgICByZWFkUmV0cnlDb3VudF8rKzsKKyAgICBpZiAoZXJyb3IgPT0gU1NMX0VSUk9SX05PTkUpIHsKKyAgICAgIHJlYWRSZXRyeUNvdW50XyA9IDA7CiAgICAgICBicmVhazsKLSAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOwotICAgIGlmIChTU0xfZ2V0X2Vycm9yKHNzbF8sIGJ5dGVzKSA9PSBTU0xfRVJST1JfU1lTQ0FMTCkgewotICAgICAgaWYgKEVSUl9nZXRfZXJyb3IoKSA9PSAwICYmIGVycm5vX2NvcHkgPT0gVEhSSUZUX0VJTlRSKSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQorICAgIH0KKyAgICB1bnNpZ25lZCBpbnQgd2FpdEV2ZW50UmV0dXJuOworICAgIGJvb2wgYnJlYWtvdXQgPSBmYWxzZTsKKyAgICBzd2l0Y2ggKGVycm9yKSB7CisgICAgICBjYXNlIFNTTF9FUlJPUl9aRVJPX1JFVFVSTjoKKyAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpFTkRfT0ZfRklMRSwgImNsaWVudCBkaXNjb25uZWN0ZWQiKTsKKworICAgICAgY2FzZSBTU0xfRVJST1JfU1lTQ0FMTDoKKyAgICAgICAgaWYgKGVycm5vX2NvcHkgPT0gMCAmJiBFUlJfcGVla19lcnJvcigpID09IDApIHsKKyAgICAgICAgICBicmVha291dCA9IHRydWU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChlcnJub19jb3B5ICE9IFRIUklGVF9FSU5UUikKKyAgICAgICAgICAgICYmIChlcnJub19jb3B5ICE9IFRIUklGVF9FQUdBSU4pKSB7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChyZWFkUmV0cnlDb3VudF8gPj0gbWF4UmVjdlJldHJpZXNfKSB7CisgICAgICAgICAgLy8gVEhSSUZUX0VJTlRSIG5lZWRzIHRvIGJlIGhhbmRsZWQgbWFudWFsbHkgYW5kIHdlIGNhbiB0b2xlcmF0ZQorICAgICAgICAgIC8vIGEgY2VydGFpbiBudW1iZXIKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgLy8gZmFsbHRocm91Z2gKKworICAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9SRUFEOgorICAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9XUklURToKKyAgICAgICAgaWYgKGlzTGliZXZlbnRTYWZlKCkpIHsKKyAgICAgICAgICBpZiAocmVhZFJldHJ5Q291bnRfIDwgbWF4UmVjdlJldHJpZXNfKSB7CisgICAgICAgICAgICAvLyBUSFJJRlRfRUlOVFIgbmVlZHMgdG8gYmUgaGFuZGxlZCBtYW51YWxseSBhbmQgd2UgY2FuIHRvbGVyYXRlCisgICAgICAgICAgICAvLyBhIGNlcnRhaW4gbnVtYmVyCisgICAgICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJyZXRyeSBhZ2FpbiIpOworICAgICAgICAgIH0KKyAgICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OklOVEVSTkFMX0VSUk9SLCAidG9vIG11Y2ggcmVjdiByZXRyaWVzIik7CisgICAgICAgIH0KKyAgICAgICAgLy8gaW4gdGhlIGNhc2Ugb2YgU1NMX0VSUk9SX1NZU0NBTEwgd2Ugd2FudCB0byB3YWl0IGZvciBhbiByZWFkIGV2ZW50IGFnYWluCisgICAgICAgIGVsc2UgaWYgKCh3YWl0RXZlbnRSZXR1cm4gPSB3YWl0Rm9yRXZlbnQoZXJyb3IgIT0gU1NMX0VSUk9SX1dBTlRfV1JJVEUpKSA9PSBUU1NMX0VJTlRSICkgeworICAgICAgICAgIC8vIHJlcGVhdCBvcGVyYXRpb24KKyAgICAgICAgICBpZiAocmVhZFJldHJ5Q291bnRfIDwgbWF4UmVjdlJldHJpZXNfKSB7CisgICAgICAgICAgICAvLyBUSFJJRlRfRUlOVFIgbmVlZHMgdG8gYmUgaGFuZGxlZCBtYW51YWxseSBhbmQgd2UgY2FuIHRvbGVyYXRlCisgICAgICAgICAgICAvLyBhIGNlcnRhaW4gbnVtYmVyCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpJTlRFUk5BTF9FUlJPUiwgInRvbyBtdWNoIHJlY3YgcmV0cmllcyIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHdhaXRFdmVudFJldHVybiA9PSBUU1NMX0RBVEEpIHsKKyAgICAgICAgICAgIC8vIGluIGNhc2Ugb2YgU1NMIGFuZCBodWdlIHRocmlmdCBwYWNrZXRzLCB0aGVyZSBtYXkgYmUgYSBudW1iZXIgb2YKKyAgICAgICAgICAgIC8vIHNvY2tldCBvcGVyYXRpb25zLCBiZWZvcmUgYW55IGRhdGEgYmVjb21lcyBhdmFpbGFibGUgYnkgU1NMX3JlYWQoKS4KKyAgICAgICAgICAgIC8vIFRoZXJlZm9yZSB0aGUgbnVtYmVyIG9mIHJldHJpZXMgc2hvdWxkIG5vdCBiZSBpbmNyZWFzZWQgYW5kCisgICAgICAgICAgICAvLyB0aGUgb3BlcmF0aW9uIHNob3VsZCBiZSByZXBlYXRlZC4KKyAgICAgICAgICAgIHJlYWRSZXRyeUNvdW50Xy0tOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpJTlRFUk5BTF9FUlJPUiwgInVua293biB3YWl0Rm9yRXZlbnQgcmV0dXJuIHZhbHVlIik7CisgICAgICBkZWZhdWx0OjsvLyBkbyBub3RoaW5nCisgICAgfQorICAgIGlmIChicmVha291dCkgeworICAgICAgYnJlYWs7CiAgICAgfQogICAgIHN0cmluZyBlcnJvcnM7Ci0gICAgYnVpbGRFcnJvcnMoZXJyb3JzLCBlcnJub19jb3B5KTsKKyAgICBidWlsZEVycm9ycyhlcnJvcnMsIGVycm5vX2NvcHksIGVycm9yKTsKICAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJTU0xfcmVhZDogIiArIGVycm9ycyk7CiAgIH0KICAgcmV0dXJuIGJ5dGVzOwogfQogCiB2b2lkIFRTU0xTb2NrZXQ6OndyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gIGNoZWNrSGFuZHNoYWtlKCk7CisgIGluaXRpYWxpemVIYW5kc2hha2UoKTsKKyAgaWYgKCFjaGVja0hhbmRzaGFrZSgpKQorICAgIHJldHVybjsKICAgLy8gbG9vcCBpbiBjYXNlIFNTTF9NT0RFX0VOQUJMRV9QQVJUSUFMX1dSSVRFIGlzIHNldCBpbiBTU0xfQ1RYLgogICB1aW50MzJfdCB3cml0dGVuID0gMDsKICAgd2hpbGUgKHdyaXR0ZW4gPCBsZW4pIHsKKyAgICBFUlJfY2xlYXJfZXJyb3IoKTsKICAgICBpbnQzMl90IGJ5dGVzID0gU1NMX3dyaXRlKHNzbF8sICZidWZbd3JpdHRlbl0sIGxlbiAtIHdyaXR0ZW4pOwogICAgIGlmIChieXRlcyA8PSAwKSB7CiAgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgaW50IGVycm9yID0gU1NMX2dldF9lcnJvcihzc2xfLCBieXRlcyk7CisgICAgICBzd2l0Y2ggKGVycm9yKSB7CisgICAgICAgIGNhc2UgU1NMX0VSUk9SX1NZU0NBTEw6CisgICAgICAgICAgaWYgKChlcnJub19jb3B5ICE9IFRIUklGVF9FSU5UUikKKyAgICAgICAgICAgICAgJiYgKGVycm5vX2NvcHkgIT0gVEhSSUZUX0VBR0FJTikpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgLy8gZmFsbHRocm91Z2ggICAgICAgIAorICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1JFQUQ6CisgICAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfV1JJVEU6CisgICAgICAgICAgaWYgKGlzTGliZXZlbnRTYWZlKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvLyBpbiB0aGUgY2FzZSBvZiBTU0xfRVJST1JfU1lTQ0FMTCB3ZSB3YW50IHRvIHdhaXQgZm9yIGFuIHdyaXRlIGV2ZW50IGFnYWluCisgICAgICAgICAgICB3YWl0Rm9yRXZlbnQoZXJyb3IgPT0gU1NMX0VSUk9SX1dBTlRfUkVBRCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6Oy8vIGRvIG5vdGhpbmcKKyAgICAgIH0KICAgICAgIHN0cmluZyBlcnJvcnM7Ci0gICAgICBidWlsZEVycm9ycyhlcnJvcnMsIGVycm5vX2NvcHkpOworICAgICAgYnVpbGRFcnJvcnMoZXJyb3JzLCBlcnJub19jb3B5LCBlcnJvcik7CiAgICAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJTU0xfd3JpdGU6ICIgKyBlcnJvcnMpOwogICAgIH0KICAgICB3cml0dGVuICs9IGJ5dGVzOwogICB9CiB9CiAKKy8qCisgKiBSZXR1cm5zIG51bWJlciBvZiBieXRlcyB3cml0dGVuIGluIFNTTCBTb2NrZXQuCisgKiBJZiBldmVudFNhZmUgaXMgc2V0LCBhbmQgaXQgbWF5IHJldHVybnMgMCBieXRlcyB0aGVuIHdyaXRlIG1ldGhvZAorICogbmVlZHMgdG8gYmUgY2FsbGVkIGFnYWluIHVudGlsIGl0IGlzIHN1Y2Nlc3NmdWxsIG9yIGl0IHRocm93cworICogZXhjZXB0aW9uIGluY2FzZSBvZiBmYWlsdXJlLgorKi8KK3VpbnQzMl90IFRTU0xTb2NrZXQ6OndyaXRlX3BhcnRpYWwoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgaW5pdGlhbGl6ZUhhbmRzaGFrZSgpOworICBpZiAoIWNoZWNrSGFuZHNoYWtlKCkpCisgICAgcmV0dXJuIDA7CisgIC8vIGxvb3AgaW4gY2FzZSBTU0xfTU9ERV9FTkFCTEVfUEFSVElBTF9XUklURSBpcyBzZXQgaW4gU1NMX0NUWC4KKyAgdWludDMyX3Qgd3JpdHRlbiA9IDA7CisgIHdoaWxlICh3cml0dGVuIDwgbGVuKSB7CisgICAgRVJSX2NsZWFyX2Vycm9yKCk7CisgICAgaW50MzJfdCBieXRlcyA9IFNTTF93cml0ZShzc2xfLCAmYnVmW3dyaXR0ZW5dLCBsZW4gLSB3cml0dGVuKTsKKyAgICBpZiAoYnl0ZXMgPD0gMCkgeworICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgIGludCBlcnJvciA9IFNTTF9nZXRfZXJyb3Ioc3NsXywgYnl0ZXMpOworICAgICAgc3dpdGNoIChlcnJvcikgeworICAgICAgICBjYXNlIFNTTF9FUlJPUl9TWVNDQUxMOgorICAgICAgICAgIGlmICgoZXJybm9fY29weSAhPSBUSFJJRlRfRUlOVFIpCisgICAgICAgICAgICAgICYmIChlcnJub19jb3B5ICE9IFRIUklGVF9FQUdBSU4pKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIC8vIGZhbGx0aHJvdWdoCisgICAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfUkVBRDoKKyAgICAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9XUklURToKKyAgICAgICAgICBpZiAoaXNMaWJldmVudFNhZmUoKSkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLy8gaW4gdGhlIGNhc2Ugb2YgU1NMX0VSUk9SX1NZU0NBTEwgd2Ugd2FudCB0byB3YWl0IGZvciBhbiB3cml0ZSBldmVudCBhZ2FpbgorICAgICAgICAgICAgd2FpdEZvckV2ZW50KGVycm9yID09IFNTTF9FUlJPUl9XQU5UX1JFQUQpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICBkZWZhdWx0OjsvLyBkbyBub3RoaW5nCisgICAgICB9CisgICAgICBzdHJpbmcgZXJyb3JzOworICAgICAgYnVpbGRFcnJvcnMoZXJyb3JzLCBlcnJub19jb3B5LCBlcnJvcik7CisgICAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJTU0xfd3JpdGU6ICIgKyBlcnJvcnMpOworICAgIH0KKyAgICB3cml0dGVuICs9IGJ5dGVzOworICB9CisgIHJldHVybiB3cml0dGVuOworfQorCiB2b2lkIFRTU0xTb2NrZXQ6OmZsdXNoKCkgewogICAvLyBEb24ndCB0aHJvdyBleGNlcHRpb24gaWYgbm90IG9wZW4uIFRocmlmdCBzZXJ2ZXJzIGNsb3NlIHNvY2tldCB0d2ljZS4KICAgaWYgKHNzbF8gPT0gTlVMTCkgewogICAgIHJldHVybjsKICAgfQotICBjaGVja0hhbmRzaGFrZSgpOworICBpbml0aWFsaXplSGFuZHNoYWtlKCk7CisgIGlmICghY2hlY2tIYW5kc2hha2UoKSkKKyAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJCSU9fZmx1c2g6IEhhbmRzaGFrZSBpcyBub3QgY29tcGxldGVkIik7CiAgIEJJTyogYmlvID0gU1NMX2dldF93YmlvKHNzbF8pOwogICBpZiAoYmlvID09IE5VTEwpIHsKICAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJTU0xfZ2V0X3diaW8gcmV0dXJucyBOVUxMIik7CkBAIC0zMTIsMjkgKzU3MCwxMTAgQEAKICAgfQogfQogCi12b2lkIFRTU0xTb2NrZXQ6OmNoZWNrSGFuZHNoYWtlKCkgewotICBpZiAoIVRTb2NrZXQ6OmlzT3BlbigpKSB7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTik7Ci0gIH0KLSAgaWYgKHNzbF8gIT0gTlVMTCkgewordm9pZCBUU1NMU29ja2V0Ojppbml0aWFsaXplSGFuZHNoYWtlUGFyYW1zKCkgeworICAvLyBzZXQgdW5kZXJseWluZyBzb2NrZXQgdG8gbm9uLWJsb2NraW5nCisgIGludCBmbGFnczsKKyAgaWYgKChmbGFncyA9IFRIUklGVF9GQ05UTChzb2NrZXRfLCBUSFJJRlRfRl9HRVRGTCwgMCkpIDwgMAorICAgICAgfHwgVEhSSUZUX0ZDTlRMKHNvY2tldF8sIFRIUklGVF9GX1NFVEZMLCBmbGFncyB8IFRIUklGVF9PX05PTkJMT0NLKSA8IDApIHsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJ0aHJpZnRTZXJ2ZXJFdmVudEhhbmRsZXI6IHNldCBUSFJJRlRfT19OT05CTE9DSyAoVEhSSUZUX0ZDTlRMKSAiLAorICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IpOworICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKHNvY2tldF8pOwogICAgIHJldHVybjsKICAgfQogICBzc2xfID0gY3R4Xy0+Y3JlYXRlU1NMKCk7CisKICAgU1NMX3NldF9mZChzc2xfLCBzdGF0aWNfY2FzdDxpbnQ+KHNvY2tldF8pKTsKK30KKworYm9vbCBUU1NMU29ja2V0OjpjaGVja0hhbmRzaGFrZSgpIHsKKyAgcmV0dXJuIGhhbmRzaGFrZUNvbXBsZXRlZF87Cit9CisKK3ZvaWQgVFNTTFNvY2tldDo6aW5pdGlhbGl6ZUhhbmRzaGFrZSgpIHsKKyAgaWYgKCFUU29ja2V0Ojppc09wZW4oKSkgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pOworICB9CisgIGlmIChjaGVja0hhbmRzaGFrZSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHNzbF8gPT0gTlVMTCkgeworICAgIGluaXRpYWxpemVIYW5kc2hha2VQYXJhbXMoKTsKKyAgfQorCiAgIGludCByYzsKKyAgaW50IGVycm5vX2NvcHkgPSAwOworICBpbnQgZXJyb3IgPSAwOwogICBpZiAoc2VydmVyKCkpIHsKLSAgICByYyA9IFNTTF9hY2NlcHQoc3NsXyk7CisgICAgZG8geworICAgICAgcmMgPSBTU0xfYWNjZXB0KHNzbF8pOworICAgICAgaWYgKHJjIDw9IDApIHsKKyAgICAgICAgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgICBlcnJvciA9IFNTTF9nZXRfZXJyb3Ioc3NsXywgcmMpOworICAgICAgICBzd2l0Y2ggKGVycm9yKSB7CisgICAgICAgICAgY2FzZSBTU0xfRVJST1JfU1lTQ0FMTDoKKyAgICAgICAgICAgIGlmICgoZXJybm9fY29weSAhPSBUSFJJRlRfRUlOVFIpCisgICAgICAgICAgICAgICAgJiYgKGVycm5vX2NvcHkgIT0gVEhSSUZUX0VBR0FJTikpIHsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgLy8gZmFsbHRocm91Z2gKKyAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1JFQUQ6CisgICAgICAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9XUklURToKKyAgICAgICAgICAgIGlmIChpc0xpYmV2ZW50U2FmZSgpKSB7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAvLyByZXBlYXQgb3BlcmF0aW9uCisgICAgICAgICAgICAgIC8vIGluIHRoZSBjYXNlIG9mIFNTTF9FUlJPUl9TWVNDQUxMIHdlIHdhbnQgdG8gd2FpdCBmb3IgYW4gd3JpdGUvcmVhZCBldmVudCBhZ2FpbgorICAgICAgICAgICAgICB3YWl0Rm9yRXZlbnQoZXJyb3IgPT0gU1NMX0VSUk9SX1dBTlRfUkVBRCk7CisgICAgICAgICAgICAgIHJjID0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBkZWZhdWx0OjsvLyBkbyBub3RoaW5nCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IHdoaWxlIChyYyA9PSAyKTsKICAgfSBlbHNlIHsKLSAgICByYyA9IFNTTF9jb25uZWN0KHNzbF8pOworICAgIC8vIE9wZW5TU0wgPCAwLjkuOGYgZG9lcyBub3QgaGF2ZSBTU0xfc2V0X3Rsc2V4dF9ob3N0X25hbWUoKQorICAgICNpZiBkZWZpbmVkKFNTTF9zZXRfdGxzZXh0X2hvc3RfbmFtZSkKKyAgICAgIC8vIHNldCB0aGUgU05JIGhvc3RuYW1lCisgICAgICBTU0xfc2V0X3Rsc2V4dF9ob3N0X25hbWUoc3NsXywgZ2V0SG9zdCgpLmNfc3RyKCkpOworICAgICNlbmRpZgorICAgIGRvIHsKKyAgICAgIHJjID0gU1NMX2Nvbm5lY3Qoc3NsXyk7CisgICAgICBpZiAocmMgPD0gMCkgeworICAgICAgICBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICAgIGVycm9yID0gU1NMX2dldF9lcnJvcihzc2xfLCByYyk7CisgICAgICAgIHN3aXRjaCAoZXJyb3IpIHsKKyAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9TWVNDQUxMOgorICAgICAgICAgICAgaWYgKChlcnJub19jb3B5ICE9IFRIUklGVF9FSU5UUikKKyAgICAgICAgICAgICAgICAmJiAoZXJybm9fY29weSAhPSBUSFJJRlRfRUFHQUlOKSkgeworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAvLyBmYWxsdGhyb3VnaAorICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfUkVBRDoKKyAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1dSSVRFOgorICAgICAgICAgICAgaWYgKGlzTGliZXZlbnRTYWZlKCkpIHsKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgIC8vIHJlcGVhdCBvcGVyYXRpb24KKyAgICAgICAgICAgICAgLy8gaW4gdGhlIGNhc2Ugb2YgU1NMX0VSUk9SX1NZU0NBTEwgd2Ugd2FudCB0byB3YWl0IGZvciBhbiB3cml0ZS9yZWFkIGV2ZW50IGFnYWluCisgICAgICAgICAgICAgIHdhaXRGb3JFdmVudChlcnJvciA9PSBTU0xfRVJST1JfV0FOVF9SRUFEKTsKKyAgICAgICAgICAgICAgcmMgPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgIGRlZmF1bHQ6Oy8vIGRvIG5vdGhpbmcKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gd2hpbGUgKHJjID09IDIpOwogICB9CiAgIGlmIChyYyA8PSAwKSB7Ci0gICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKICAgICBzdHJpbmcgZm5hbWUoc2VydmVyKCkgPyAiU1NMX2FjY2VwdCIgOiAiU1NMX2Nvbm5lY3QiKTsKICAgICBzdHJpbmcgZXJyb3JzOwotICAgIGJ1aWxkRXJyb3JzKGVycm9ycywgZXJybm9fY29weSk7CisgICAgYnVpbGRFcnJvcnMoZXJyb3JzLCBlcnJub19jb3B5LCBlcnJvcik7CiAgICAgdGhyb3cgVFNTTEV4Y2VwdGlvbihmbmFtZSArICI6ICIgKyBlcnJvcnMpOwogICB9CiAgIGF1dGhvcml6ZSgpOworICBoYW5kc2hha2VDb21wbGV0ZWRfID0gdHJ1ZTsKIH0KIAogdm9pZCBUU1NMU29ja2V0OjphdXRob3JpemUoKSB7CkBAIC00NDMsNiArNzgyLDY3IEBACiAgIH0KIH0KIAorLyoKKyAqIE5vdGU6IFRoaXMgbWV0aG9kIGlzIG5vdCBsaWJldmVudCBzYWZlLgorKi8KK3Vuc2lnbmVkIGludCBUU1NMU29ja2V0Ojp3YWl0Rm9yRXZlbnQoYm9vbCB3YW50UmVhZCkgeworICBpbnQgZmRTb2NrZXQ7CisgIEJJTyogYmlvOworCisgIGlmICh3YW50UmVhZCkgeworICAgIGJpbyA9IFNTTF9nZXRfcmJpbyhzc2xfKTsKKyAgfSBlbHNlIHsKKyAgICBiaW8gPSBTU0xfZ2V0X3diaW8oc3NsXyk7CisgIH0KKworICBpZiAoYmlvID09IE5VTEwpIHsKKyAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJTU0xfZ2V0Xz9iaW8gcmV0dXJuZWQgTlVMTCIpOworICB9CisKKyAgaWYgKEJJT19nZXRfZmQoYmlvLCAmZmRTb2NrZXQpIDw9IDApIHsKKyAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJCSU9fZ2V0X2ZkIGZhaWxlZCIpOworICB9CisKKyAgc3RydWN0IFRIUklGVF9QT0xMRkQgZmRzWzJdOworICBtZW1zZXQoZmRzLCAwLCBzaXplb2YoZmRzKSk7CisgIGZkc1swXS5mZCA9IGZkU29ja2V0OworICAvLyB1c2UgUE9MTElOIGFsc28gb24gd3JpdGUgb3BlcmF0aW9ucyB0b28sIHRoaXMgaXMgbmVlZGVkIGZvciBvcGVyYXRpb25zCisgIC8vIHdoaWNoIHJlcXVpcmVzIHJlYWQgYW5kIHdyaXRlIG9uIHRoZSBzb2NrZXQuCisgIGZkc1swXS5ldmVudHMgPSB3YW50UmVhZCA/IFRIUklGVF9QT0xMSU4gOiBUSFJJRlRfUE9MTElOIHwgVEhSSUZUX1BPTExPVVQ7CisKKyAgaWYgKGludGVycnVwdExpc3RlbmVyXykgeworICAgIGZkc1sxXS5mZCA9ICooaW50ZXJydXB0TGlzdGVuZXJfLmdldCgpKTsKKyAgICBmZHNbMV0uZXZlbnRzID0gVEhSSUZUX1BPTExJTjsKKyAgfQorCisgIGludCB0aW1lb3V0ID0gLTE7CisgIGlmICh3YW50UmVhZCAmJiByZWN2VGltZW91dF8pIHsKKyAgICB0aW1lb3V0ID0gcmVjdlRpbWVvdXRfOworICB9CisgIGlmICghd2FudFJlYWQgJiYgc2VuZFRpbWVvdXRfKSB7CisgICAgdGltZW91dCA9IHNlbmRUaW1lb3V0XzsKKyAgfQorCisgIGludCByZXQgPSBUSFJJRlRfUE9MTChmZHMsIGludGVycnVwdExpc3RlbmVyXyA/IDIgOiAxLCB0aW1lb3V0KTsKKworICBpZiAocmV0IDwgMCkgeworICAgIC8vIGVycm9yIGNhc2VzCisgICAgaWYgKFRIUklGVF9HRVRfU09DS0VUX0VSUk9SID09IFRIUklGVF9FSU5UUikgeworICAgICAgcmV0dXJuIFRTU0xfRUlOVFI7IC8vIHJlcGVhdCBvcGVyYXRpb24KKyAgICB9CisgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU1NMU29ja2V0OjpyZWFkIFRIUklGVF9QT0xMKCkgIiwgZXJybm9fY29weSk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAiVW5rbm93biIsIGVycm5vX2NvcHkpOworICB9IGVsc2UgaWYgKHJldCA+IDApeworICAgIGlmIChmZHNbMV0ucmV2ZW50cyAmIFRIUklGVF9QT0xMSU4pIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6SU5URVJSVVBURUQsICJJbnRlcnJ1cHRlZCIpOworICAgIH0KKyAgICByZXR1cm4gVFNTTF9EQVRBOworICB9IGVsc2UgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VULCAiVEhSSUZUX1BPTEwgKHRpbWVkIG91dCkiKTsKKyAgfQorfQorCiAvLyBUU1NMU29ja2V0RmFjdG9yeSBpbXBsZW1lbnRhdGlvbgogdWludDY0X3QgVFNTTFNvY2tldEZhY3Rvcnk6OmNvdW50XyA9IDA7CiBNdXRleCBUU1NMU29ja2V0RmFjdG9yeTo6bXV0ZXhfOwpAQCAtNDU3LDcgKzg1Nyw3IEBACiAgICAgcmFuZG9taXplKCk7CiAgIH0KICAgY291bnRfKys7Ci0gIGN0eF8gPSBib29zdDo6c2hhcmVkX3B0cjxTU0xDb250ZXh0PihuZXcgU1NMQ29udGV4dChwcm90b2NvbCkpOworICBjdHhfID0gc3RkOjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+KG5ldyBTU0xDb250ZXh0KHByb3RvY29sKSk7CiB9CiAKIFRTU0xTb2NrZXRGYWN0b3J5Ojp+VFNTTFNvY2tldEZhY3RvcnkoKSB7CkBAIC00NjksMjggKzg2OSw0NyBAQAogICB9CiB9CiAKLWJvb3N0OjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IFRTU0xTb2NrZXRGYWN0b3J5OjpjcmVhdGVTb2NrZXQoKSB7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IHNzbChuZXcgVFNTTFNvY2tldChjdHhfKSk7CitzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gVFNTTFNvY2tldEZhY3Rvcnk6OmNyZWF0ZVNvY2tldCgpIHsKKyAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IHNzbChuZXcgVFNTTFNvY2tldChjdHhfKSk7CiAgIHNldHVwKHNzbCk7CiAgIHJldHVybiBzc2w7CiB9CiAKLWJvb3N0OjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IFRTU0xTb2NrZXRGYWN0b3J5OjpjcmVhdGVTb2NrZXQoVEhSSUZUX1NPQ0tFVCBzb2NrZXQpIHsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gc3NsKG5ldyBUU1NMU29ja2V0KGN0eF8sIHNvY2tldCkpOworc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IFRTU0xTb2NrZXRGYWN0b3J5OjpjcmVhdGVTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyKSB7CisgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBzc2wobmV3IFRTU0xTb2NrZXQoY3R4XywgaW50ZXJydXB0TGlzdGVuZXIpKTsKICAgc2V0dXAoc3NsKTsKICAgcmV0dXJuIHNzbDsKIH0KIAotYm9vc3Q6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gVFNTTFNvY2tldEZhY3Rvcnk6OmNyZWF0ZVNvY2tldChjb25zdCBzdHJpbmcmIGhvc3QsIGludCBwb3J0KSB7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IHNzbChuZXcgVFNTTFNvY2tldChjdHhfLCBob3N0LCBwb3J0KSk7CitzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gVFNTTFNvY2tldEZhY3Rvcnk6OmNyZWF0ZVNvY2tldChUSFJJRlRfU09DS0VUIHNvY2tldCkgeworICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gc3NsKG5ldyBUU1NMU29ja2V0KGN0eF8sIHNvY2tldCkpOwogICBzZXR1cChzc2wpOwogICByZXR1cm4gc3NsOwogfQogCi12b2lkIFRTU0xTb2NrZXRGYWN0b3J5OjpzZXR1cChib29zdDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBzc2wpIHsKK3N0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBUU1NMU29ja2V0RmFjdG9yeTo6Y3JlYXRlU29ja2V0KFRIUklGVF9TT0NLRVQgc29ja2V0LCBzdGQ6OnNoYXJlZF9wdHI8VEhSSUZUX1NPQ0tFVD4gaW50ZXJydXB0TGlzdGVuZXIpIHsKKyAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IHNzbChuZXcgVFNTTFNvY2tldChjdHhfLCBzb2NrZXQsIGludGVycnVwdExpc3RlbmVyKSk7CisgIHNldHVwKHNzbCk7CisgIHJldHVybiBzc2w7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBUU1NMU29ja2V0RmFjdG9yeTo6Y3JlYXRlU29ja2V0KGNvbnN0IHN0cmluZyYgaG9zdCwgaW50IHBvcnQpIHsKKyAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IHNzbChuZXcgVFNTTFNvY2tldChjdHhfLCBob3N0LCBwb3J0KSk7CisgIHNldHVwKHNzbCk7CisgIHJldHVybiBzc2w7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBUU1NMU29ja2V0RmFjdG9yeTo6Y3JlYXRlU29ja2V0KGNvbnN0IHN0cmluZyYgaG9zdCwgaW50IHBvcnQsIHN0ZDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBpbnRlcnJ1cHRMaXN0ZW5lcikgeworICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gc3NsKG5ldyBUU1NMU29ja2V0KGN0eF8sIGhvc3QsIHBvcnQsIGludGVycnVwdExpc3RlbmVyKSk7CisgIHNldHVwKHNzbCk7CisgIHJldHVybiBzc2w7Cit9CisKKwordm9pZCBUU1NMU29ja2V0RmFjdG9yeTo6c2V0dXAoc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IHNzbCkgewogICBzc2wtPnNlcnZlcihzZXJ2ZXIoKSk7CiAgIGlmIChhY2Nlc3NfID09IE5VTEwgJiYgIXNlcnZlcigpKSB7Ci0gICAgYWNjZXNzXyA9IGJvb3N0OjpzaGFyZWRfcHRyPEFjY2Vzc01hbmFnZXI+KG5ldyBEZWZhdWx0Q2xpZW50QWNjZXNzTWFuYWdlcik7CisgICAgYWNjZXNzXyA9IHN0ZDo6c2hhcmVkX3B0cjxBY2Nlc3NNYW5hZ2VyPihuZXcgRGVmYXVsdENsaWVudEFjY2Vzc01hbmFnZXIpOwogICB9CiAgIGlmIChhY2Nlc3NfICE9IE5VTEwpIHsKICAgICBzc2wtPmFjY2VzcyhhY2Nlc3NfKTsKQEAgLTU1MSwxMiArOTcwLDEyIEBACiAgIH0KIH0KIAotdm9pZCBUU1NMU29ja2V0RmFjdG9yeTo6bG9hZFRydXN0ZWRDZXJ0aWZpY2F0ZXMoY29uc3QgY2hhciogcGF0aCkgewordm9pZCBUU1NMU29ja2V0RmFjdG9yeTo6bG9hZFRydXN0ZWRDZXJ0aWZpY2F0ZXMoY29uc3QgY2hhciogcGF0aCwgY29uc3QgY2hhciogY2FwYXRoKSB7CiAgIGlmIChwYXRoID09IE5VTEwpIHsKICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvYWRUcnVzdGVkQ2VydGlmaWNhdGVzOiA8cGF0aD4gaXMgTlVMTCIpOwogICB9Ci0gIGlmIChTU0xfQ1RYX2xvYWRfdmVyaWZ5X2xvY2F0aW9ucyhjdHhfLT5nZXQoKSwgcGF0aCwgTlVMTCkgPT0gMCkgeworICBpZiAoU1NMX0NUWF9sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoY3R4Xy0+Z2V0KCksIHBhdGgsIGNhcGF0aCkgPT0gMCkgewogICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CiAgICAgc3RyaW5nIGVycm9yczsKICAgICBidWlsZEVycm9ycyhlcnJvcnMsIGVycm5vX2NvcHkpOwpAQCAtNTg3LDcgKzEwMDYsNyBAQAogfQogCiAvLyBleHRyYWN0IGVycm9yIG1lc3NhZ2VzIGZyb20gZXJyb3IgcXVldWUKLXZvaWQgYnVpbGRFcnJvcnMoc3RyaW5nJiBlcnJvcnMsIGludCBlcnJub19jb3B5KSB7Cit2b2lkIGJ1aWxkRXJyb3JzKHN0cmluZyYgZXJyb3JzLCBpbnQgZXJybm9fY29weSwgaW50IHNzbGVycm5vKSB7CiAgIHVuc2lnbmVkIGxvbmcgZXJyb3JDb2RlOwogICBjaGFyIG1lc3NhZ2VbMjU2XTsKIApAQCAtNjA5LDIxICsxMDI4LDMyIEBACiAgICAgfQogICB9CiAgIGlmIChlcnJvcnMuZW1wdHkoKSkgewotICAgIGVycm9ycyA9ICJlcnJvciBjb2RlOiAiICsgYm9vc3Q6OmxleGljYWxfY2FzdDxzdHJpbmc+KGVycm5vX2NvcHkpOworICAgIGVycm9ycyA9ICJlcnJvciBjb2RlOiAiICsgdG9fc3RyaW5nKGVycm5vX2NvcHkpOworICB9CisgIGlmIChzc2xlcnJubykgeworICAgIGVycm9ycyArPSAiIChTU0xfZXJyb3JfY29kZSA9ICIgKyB0b19zdHJpbmcoc3NsZXJybm8pICsgIikiOworICAgIGlmIChzc2xlcnJubyA9PSBTU0xfRVJST1JfU1lTQ0FMTCkgeworICAgICAgY2hhciBidWZbNDA5Nl07CisgICAgICBpbnQgZXJyOworICAgICAgd2hpbGUgKChlcnIgPSBFUlJfZ2V0X2Vycm9yKCkpICE9IDApIHsKKyAgICAgICAgZXJyb3JzICs9ICIgIjsKKyAgICAgICAgZXJyb3JzICs9IEVSUl9lcnJvcl9zdHJpbmcoZXJyLCBidWYpOworICAgICAgfQorICAgIH0KICAgfQogfQogCiAvKioKICAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgQWNjZXNzTWFuYWdlcgogICovCi1EZWNpc2lvbiBEZWZhdWx0Q2xpZW50QWNjZXNzTWFuYWdlcjo6dmVyaWZ5KGNvbnN0IHNvY2thZGRyX3N0b3JhZ2UmIHNhKSB0aHJvdygpIHsKK0RlY2lzaW9uIERlZmF1bHRDbGllbnRBY2Nlc3NNYW5hZ2VyOjp2ZXJpZnkoY29uc3Qgc29ja2FkZHJfc3RvcmFnZSYgc2EpIG5vZXhjZXB0IHsKICAgKHZvaWQpc2E7CiAgIHJldHVybiBTS0lQOwogfQogCiBEZWNpc2lvbiBEZWZhdWx0Q2xpZW50QWNjZXNzTWFuYWdlcjo6dmVyaWZ5KGNvbnN0IHN0cmluZyYgaG9zdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUpIHRocm93KCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSkgbm9leGNlcHQgewogICBpZiAoaG9zdC5lbXB0eSgpIHx8IG5hbWUgPT0gTlVMTCB8fCBzaXplIDw9IDApIHsKICAgICByZXR1cm4gU0tJUDsKICAgfQpAQCAtNjMyLDcgKzEwNjIsNyBAQAogCiBEZWNpc2lvbiBEZWZhdWx0Q2xpZW50QWNjZXNzTWFuYWdlcjo6dmVyaWZ5KGNvbnN0IHNvY2thZGRyX3N0b3JhZ2UmIHNhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSkgdGhyb3coKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplKSBub2V4Y2VwdCB7CiAgIGJvb2wgbWF0Y2ggPSBmYWxzZTsKICAgaWYgKHNhLnNzX2ZhbWlseSA9PSBBRl9JTkVUICYmIHNpemUgPT0gc2l6ZW9mKGluX2FkZHIpKSB7CiAgICAgbWF0Y2ggPSAobWVtY21wKCYoKHNvY2thZGRyX2luKikmc2EpLT5zaW5fYWRkciwgZGF0YSwgc2l6ZSkgPT0gMCk7CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTU0xTb2NrZXQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNvY2tldC5oCmluZGV4IDAyZDQxNGIuLjVhODdkMWUgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNvY2tldC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNvY2tldC5oCkBAIC0yMCwxMiArMjAsMTMgQEAKICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFNTTFNPQ0tFVF9IXwogI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9UU1NMU09DS0VUX0hfIDEKIAotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLSNpbmNsdWRlIDxvcGVuc3NsL3NzbC5oPgotI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9NdXRleC5oPgorLy8gUHV0IHRoaXMgZmlyc3QgdG8gYXZvaWQgV0lOMzIgYnVpbGQgZmFpbHVyZQogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgogCisjaW5jbHVkZSA8b3BlbnNzbC9zc2wuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4Lmg+CisKIG5hbWVzcGFjZSBhcGFjaGUgewogbmFtZXNwYWNlIHRocmlmdCB7CiBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKQEAgLTQzLDYgKzQ0LDkgQEAKICAgTEFURVNUICA9IFRMU3YxXzIKIH07CiAKKyNkZWZpbmUgVFNTTF9FSU5UUiAwCisjZGVmaW5lIFRTU0xfREFUQSAxCisKIC8qKgogICogSW5pdGlhbGl6ZSBPcGVuU1NMIGxpYnJhcnkuICBUaGlzIGZ1bmN0aW9uLCBvciBzb21lIG90aGVyCiAgKiBlcXVpdmFsZW50IGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgT3BlblNTTCwgbXVzdCBiZSBjYWxsZWQgYmVmb3JlCkBAIC03Myw4ICs3NywxMCBAQAogICBib29sIHBlZWsoKTsKICAgdm9pZCBvcGVuKCk7CiAgIHZvaWQgY2xvc2UoKTsKKyAgYm9vbCBoYXNQZW5kaW5nRGF0YVRvUmVhZCgpOwogICB1aW50MzJfdCByZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKICAgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisgIHVpbnQzMl90IHdyaXRlX3BhcnRpYWwoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOwogICB2b2lkIGZsdXNoKCk7CiAgIC8qKgogICAqIFNldCB3aGV0aGVyIHRvIHVzZSBjbGllbnQgb3Igc2VydmVyIHNpZGUgU1NMIGhhbmRzaGFrZSBwcm90b2NvbC4KQEAgLTkxLDI2ICs5Nyw1MSBAQAogICAgKgogICAgKiBAcGFyYW0gbWFuYWdlciAgSW5zdGFuY2Ugb2YgQWNjZXNzTWFuYWdlcgogICAgKi8KLSAgdmlydHVhbCB2b2lkIGFjY2Vzcyhib29zdDo6c2hhcmVkX3B0cjxBY2Nlc3NNYW5hZ2VyPiBtYW5hZ2VyKSB7IGFjY2Vzc18gPSBtYW5hZ2VyOyB9CisgIHZpcnR1YWwgdm9pZCBhY2Nlc3Moc3RkOjpzaGFyZWRfcHRyPEFjY2Vzc01hbmFnZXI+IG1hbmFnZXIpIHsgYWNjZXNzXyA9IG1hbmFnZXI7IH0KKyAgLyoqCisgICAqIFNldCBldmVudFNhZmUgZmxhZyBpZiBsaWJldmVudCBpcyB1c2VkLgorICAgKi8KKyAgdm9pZCBzZXRMaWJldmVudFNhZmUoKSB7IGV2ZW50U2FmZV8gPSB0cnVlOyB9CisgIC8qKgorICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgU1NMIFNvY2tldCBpcyBsaWJldmVudCBzYWZlIG9yIG5vdC4KKyAgICovCisgIGJvb2wgaXNMaWJldmVudFNhZmUoKSBjb25zdCB7IHJldHVybiBldmVudFNhZmVfOyB9CiAKIHByb3RlY3RlZDoKICAgLyoqCiAgICAqIENvbnN0cnVjdG9yLgogICAgKi8KLSAgVFNTTFNvY2tldChib29zdDo6c2hhcmVkX3B0cjxTU0xDb250ZXh0PiBjdHgpOworICBUU1NMU29ja2V0KHN0ZDo6c2hhcmVkX3B0cjxTU0xDb250ZXh0PiBjdHgpOworICAvKioKKyAgICogQ29uc3RydWN0b3Igd2l0aCBhbiBpbnRlcnJ1cHQgc2lnbmFsLgorICAgKi8KKyAgVFNTTFNvY2tldChzdGQ6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4LCBzdGQ6OnNoYXJlZF9wdHI8VEhSSUZUX1NPQ0tFVD4gaW50ZXJydXB0TGlzdGVuZXIpOwogICAvKioKICAgICogQ29uc3RydWN0b3IsIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiBUU1NMU29ja2V0IGdpdmVuIGFuIGV4aXN0aW5nIHNvY2tldC4KICAgICoKICAgICogQHBhcmFtIHNvY2tldCBBbiBleGlzdGluZyBzb2NrZXQKICAgICovCi0gIFRTU0xTb2NrZXQoYm9vc3Q6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4LCBUSFJJRlRfU09DS0VUIHNvY2tldCk7CisgIFRTU0xTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eCwgVEhSSUZUX1NPQ0tFVCBzb2NrZXQpOwogICAvKioKKyAgICogQ29uc3RydWN0b3IsIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiBUU1NMU29ja2V0IGdpdmVuIGFuIGV4aXN0aW5nIHNvY2tldCB0aGF0IGNhbiBiZSBpbnRlcnJ1cHRlZC4KKyAgICoKKyAgICogQHBhcmFtIHNvY2tldCBBbiBleGlzdGluZyBzb2NrZXQKKyAgICovCisgIFRTU0xTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eCwgVEhSSUZUX1NPQ0tFVCBzb2NrZXQsIHN0ZDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBpbnRlcnJ1cHRMaXN0ZW5lcik7CisgICAvKioKICAgICogQ29uc3RydWN0b3IuCiAgICAqCiAgICAqIEBwYXJhbSBob3N0ICBSZW1vdGUgaG9zdCBuYW1lCiAgICAqIEBwYXJhbSBwb3J0ICBSZW1vdGUgcG9ydCBudW1iZXIKICAgICovCi0gIFRTU0xTb2NrZXQoYm9vc3Q6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4LCBzdGQ6OnN0cmluZyBob3N0LCBpbnQgcG9ydCk7CisgIFRTU0xTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eCwgc3RkOjpzdHJpbmcgaG9zdCwgaW50IHBvcnQpOworICAgIC8qKgorICAqIENvbnN0cnVjdG9yIHdpdGggYW4gaW50ZXJydXB0IHNpZ25hbC4KKyAgKgorICAqIEBwYXJhbSBob3N0ICBSZW1vdGUgaG9zdCBuYW1lCisgICogQHBhcmFtIHBvcnQgIFJlbW90ZSBwb3J0IG51bWJlcgorICAqLworICAgIFRTU0xTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eCwgc3RkOjpzdHJpbmcgaG9zdCwgaW50IHBvcnQsIHN0ZDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBpbnRlcnJ1cHRMaXN0ZW5lcik7CiAgIC8qKgogICAgKiBBdXRob3JpemUgcGVlciBhY2Nlc3MgYWZ0ZXIgU1NMIGhhbmRzaGFrZSBjb21wbGV0ZXMuCiAgICAqLwpAQCAtMTE4LDE3ICsxNDksNTUgQEAKICAgLyoqCiAgICAqIEluaXRpYXRlIFNTTCBoYW5kc2hha2UgaWYgbm90IGFscmVhZHkgaW5pdGlhdGVkLgogICAgKi8KLSAgdm9pZCBjaGVja0hhbmRzaGFrZSgpOworICB2b2lkIGluaXRpYWxpemVIYW5kc2hha2UoKTsKKyAgLyoqCisgICAqIEluaXRpYXRlIFNTTCBoYW5kc2hha2UgcGFyYW1zLgorICAgKi8KKyAgdm9pZCBpbml0aWFsaXplSGFuZHNoYWtlUGFyYW1zKCk7CisgIC8qKgorICAgKiBDaGVjayBpZiAgU1NMIGhhbmRzaGFrZSBpcyBjb21wbGV0ZWQgb3Igbm90LgorICAgKi8KKyAgYm9vbCBjaGVja0hhbmRzaGFrZSgpOworICAvKioKKyAgICogV2FpdHMgZm9yIGFuIHNvY2tldCBvciBzaHV0ZG93biBldmVudC4KKyAgICoKKyAgICogQHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb246OklOVEVSUlVQVEVEIGlmIGludGVycnVwdGVkIGlzIHNpZ25hbGVkLgorICAgKgorICAgKiBAcmV0dXJuIFRTU0xfRUlOVFIgaWYgRUlOVFIgaGFwcGVuZWQgb24gdGhlIHVuZGVybHlpbmcgc29ja2V0CisgICAqICAgICAgICAgVFNTTF9EQVRBICBpZiBkYXRhIGlzIGF2YWlsYWJsZSBvbiB0aGUgc29ja2V0LgorICAgKi8KKyAgdW5zaWduZWQgaW50IHdhaXRGb3JFdmVudChib29sIHdhbnRSZWFkKTsKIAogICBib29sIHNlcnZlcl87CiAgIFNTTCogc3NsXzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4XzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8QWNjZXNzTWFuYWdlcj4gYWNjZXNzXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eF87CisgIHN0ZDo6c2hhcmVkX3B0cjxBY2Nlc3NNYW5hZ2VyPiBhY2Nlc3NfOwogICBmcmllbmQgY2xhc3MgVFNTTFNvY2tldEZhY3Rvcnk7CisKK3ByaXZhdGU6CisgIGJvb2wgaGFuZHNoYWtlQ29tcGxldGVkXzsKKyAgaW50IHJlYWRSZXRyeUNvdW50XzsKKyAgYm9vbCBldmVudFNhZmVfOworCisgIHZvaWQgaW5pdCgpOwogfTsKIAogLyoqCiAgKiBTU0wgc29ja2V0IGZhY3RvcnkuIFNTTCBzb2NrZXRzIHNob3VsZCBiZSBjcmVhdGVkIHZpYSBTU0wgZmFjdG9yeS4KKyAqIFRoZSBmYWN0b3J5IHdpbGwgYXV0b21hdGljYWxseSBpbml0aWFsaXplIGFuZCBjbGVhbnVwIG9wZW5zc2wgYXMgbG9uZyBhcworICogdGhlcmUgaXMgYSBUU1NMU29ja2V0RmFjdG9yeSBpbnN0YW50aWF0ZWQsIGFuZCBhcyBsb25nIGFzIHRoZSBzdGF0aWMKKyAqIGJvb2xlYW4gbWFudWFsT3BlblNTTEluaXRpYWxpemF0aW9uXyBpcyBzZXQgdG8gZmFsc2UsIHRoZSBkZWZhdWx0LgorICoKKyAqIElmIHlvdSB3b3VsZCBsaWtlIHRvIGluaXRpYWxpemUgYW5kIGNsZWFudXAgb3BlbnNzbCB5b3Vyc2VsZiwgc2V0CisgKiBtYW51YWxPcGVuU1NMSW5pdGlhbGl6YXRpb25fIHRvIHRydWUgYW5kIFRTU0xTb2NrZXRGYWN0b3J5IHdpbGwgbm8KKyAqIGxvbmdlciBiZSByZXNwb25zaWJsZSBmb3Igb3BlbnNzbCBpbml0aWFsaXphdGlvbiBhbmQgdGVhcmRvd24uCisgKgorICogSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjb2RlIHVzaW5nIFRTU0xTb2NrZXRGYWN0b3J5IHRvCisgKiBlbnN1cmUgdGhhdCB0aGUgZmFjdG9yeSBsaWZldGltZSBleGNlZWRzIHRoZSBsaWZldGltZSBvZiBhbnkgc29ja2V0cworICogaXQgbWlnaHQgY3JlYXRlLiAgSWYgdGhpcyBpcyBub3QgZ3VhcmFudGVlZCwgYSBzb2NrZXQgbWF5IGNhbGwgaW50bworICogb3BlbnNzbCBhZnRlciB0aGUgc29ja2V0IGZhY3RvcnkgaGFzIGNsZWFuZWQgdXAgb3BlbnNzbCEgIFRoaXMKKyAqIGd1YXJhbnRlZSBpcyB1bm5lY2Vzc2FyeSBpZiBtYW51YWxPcGVuU1NMSW5pdGlhbGl6YXRpb25fIGlzIHRydWUsCisgKiBob3dldmVyLCBzaW5jZSBpdCB3b3VsZCBiZSB1cCB0byB0aGUgY29uc3VtaW5nIGFwcGxpY2F0aW9uIGluc3RlYWQuCiAgKi8KIGNsYXNzIFRTU0xTb2NrZXRGYWN0b3J5IHsKIHB1YmxpYzoKQEAgLTE0MiwyMCArMjExLDM3IEBACiAgIC8qKgogICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgVFNTTFNvY2tldCB3aXRoIGEgZnJlc2ggbmV3IHNvY2tldC4KICAgICovCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gY3JlYXRlU29ja2V0KCk7CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IGNyZWF0ZVNvY2tldCgpOworICAvKioKKyAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIFRTU0xTb2NrZXQgd2l0aCBhIGZyZXNoIG5ldyBzb2NrZXQsIHdoaWNoIGlzIGludGVycnVwdGFibGUuCisgICAqLworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBjcmVhdGVTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyKTsKICAgLyoqCiAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBUU1NMU29ja2V0IHdpdGggdGhlIGdpdmVuIHNvY2tldC4KICAgICoKICAgICogQHBhcmFtIHNvY2tldCBBbiBleGlzdGluZyBzb2NrZXQuCiAgICAqLwotICB2aXJ0dWFsIGJvb3N0OjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IGNyZWF0ZVNvY2tldChUSFJJRlRfU09DS0VUIHNvY2tldCk7CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IGNyZWF0ZVNvY2tldChUSFJJRlRfU09DS0VUIHNvY2tldCk7CisgIC8qKgorICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgVFNTTFNvY2tldCB3aXRoIHRoZSBnaXZlbiBzb2NrZXQgd2hpY2ggaXMgaW50ZXJydXB0YWJsZS4KKyAgICoKKyAgICogQHBhcmFtIHNvY2tldCBBbiBleGlzdGluZyBzb2NrZXQuCisgICAqLworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBjcmVhdGVTb2NrZXQoVEhSSUZUX1NPQ0tFVCBzb2NrZXQsIHN0ZDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBpbnRlcnJ1cHRMaXN0ZW5lcik7CiAgIC8qKgogICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBUU1NMU29ja2V0LgogICAqCiAgICogQHBhcmFtIGhvc3QgIFJlbW90ZSBob3N0IHRvIGJlIGNvbm5lY3RlZCB0bwogICAqIEBwYXJhbSBwb3J0ICBSZW1vdGUgcG9ydCB0byBiZSBjb25uZWN0ZWQgdG8KICAgKi8KLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBjcmVhdGVTb2NrZXQoY29uc3Qgc3RkOjpzdHJpbmcmIGhvc3QsIGludCBwb3J0KTsKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gY3JlYXRlU29ja2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBob3N0LCBpbnQgcG9ydCk7CisgIC8qKgorICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBUU1NMU29ja2V0LgorICAqCisgICogQHBhcmFtIGhvc3QgIFJlbW90ZSBob3N0IHRvIGJlIGNvbm5lY3RlZCB0bworICAqIEBwYXJhbSBwb3J0ICBSZW1vdGUgcG9ydCB0byBiZSBjb25uZWN0ZWQgdG8KKyAgKi8KKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gY3JlYXRlU29ja2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBob3N0LCBpbnQgcG9ydCwgc3RkOjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyKTsKICAgLyoqCiAgICAqIFNldCBjaXBoZXJzIHRvIGJlIHVzZWQgaW4gU1NMIGhhbmRzaGFrZSBwcm9jZXNzLgogICAgKgpAQCAtMTg3LDcgKzI3Myw3IEBACiAgICAqCiAgICAqIEBwYXJhbSBwYXRoIFBhdGggdG8gdHJ1c3RlZCBjZXJ0aWZpY2F0ZSBmaWxlCiAgICAqLwotICB2aXJ0dWFsIHZvaWQgbG9hZFRydXN0ZWRDZXJ0aWZpY2F0ZXMoY29uc3QgY2hhciogcGF0aCk7CisgIHZpcnR1YWwgdm9pZCBsb2FkVHJ1c3RlZENlcnRpZmljYXRlcyhjb25zdCBjaGFyKiBwYXRoLCBjb25zdCBjaGFyKiBjYXBhdGggPSBOVUxMKTsKICAgLyoqCiAgICAqIERlZmF1bHQgcmFuZG9taXplIG1ldGhvZC4KICAgICovCkBAIC0yMTMsMTMgKzI5OSwxMyBAQAogICAgKgogICAgKiBAcGFyYW0gbWFuYWdlciAgVGhlIEFjY2Vzc01hbmFnZXIgaW5zdGFuY2UKICAgICovCi0gIHZpcnR1YWwgdm9pZCBhY2Nlc3MoYm9vc3Q6OnNoYXJlZF9wdHI8QWNjZXNzTWFuYWdlcj4gbWFuYWdlcikgeyBhY2Nlc3NfID0gbWFuYWdlcjsgfQorICB2aXJ0dWFsIHZvaWQgYWNjZXNzKHN0ZDo6c2hhcmVkX3B0cjxBY2Nlc3NNYW5hZ2VyPiBtYW5hZ2VyKSB7IGFjY2Vzc18gPSBtYW5hZ2VyOyB9CiAgIHN0YXRpYyB2b2lkIHNldE1hbnVhbE9wZW5TU0xJbml0aWFsaXphdGlvbihib29sIG1hbnVhbE9wZW5TU0xJbml0aWFsaXphdGlvbikgewogICAgIG1hbnVhbE9wZW5TU0xJbml0aWFsaXphdGlvbl8gPSBtYW51YWxPcGVuU1NMSW5pdGlhbGl6YXRpb247CiAgIH0KIAogcHJvdGVjdGVkOgotICBib29zdDo6c2hhcmVkX3B0cjxTU0xDb250ZXh0PiBjdHhfOworICBzdGQ6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4XzsKIAogICAvKioKICAgICogT3ZlcnJpZGUgdGhpcyBtZXRob2QgZm9yIGN1c3RvbSBwYXNzd29yZCBjYWxsYmFjay4gSXQgbWF5IGJlIGNhbGxlZApAQCAtMjMyLDExICszMTgsMTEgQEAKIAogcHJpdmF0ZToKICAgYm9vbCBzZXJ2ZXJfOwotICBib29zdDo6c2hhcmVkX3B0cjxBY2Nlc3NNYW5hZ2VyPiBhY2Nlc3NfOworICBzdGQ6OnNoYXJlZF9wdHI8QWNjZXNzTWFuYWdlcj4gYWNjZXNzXzsKICAgc3RhdGljIGNvbmN1cnJlbmN5OjpNdXRleCBtdXRleF87CiAgIHN0YXRpYyB1aW50NjRfdCBjb3VudF87CiAgIHN0YXRpYyBib29sIG1hbnVhbE9wZW5TU0xJbml0aWFsaXphdGlvbl87Ci0gIHZvaWQgc2V0dXAoYm9vc3Q6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gc3NsKTsKKyAgdm9pZCBzZXR1cChzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gc3NsKTsKICAgc3RhdGljIGludCBwYXNzd29yZENhbGxiYWNrKGNoYXIqIHBhc3N3b3JkLCBpbnQgc2l6ZSwgaW50LCB2b2lkKiBkYXRhKTsKIH07CiAKQEAgLTI0OCw3ICszMzQsNyBAQAogICBUU1NMRXhjZXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKQogICAgIDogVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpJTlRFUk5BTF9FUlJPUiwgbWVzc2FnZSkge30KIAotICB2aXJ0dWFsIGNvbnN0IGNoYXIqIHdoYXQoKSBjb25zdCB0aHJvdygpIHsKKyAgdmlydHVhbCBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3Qgbm9leGNlcHQgewogICAgIGlmIChtZXNzYWdlXy5lbXB0eSgpKSB7CiAgICAgICByZXR1cm4gIlRTU0xFeGNlcHRpb24iOwogICAgIH0gZWxzZSB7CkBAIC0yOTksNyArMzg1LDcgQEAKICAgICogQHBhcmFtICBzYSBQZWVyIElQIGFkZHJlc3MKICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBwZWVyIGlzIHRydXN0ZWQsIGZhbHNlIG90aGVyd2lzZQogICAgKi8KLSAgdmlydHVhbCBEZWNpc2lvbiB2ZXJpZnkoY29uc3Qgc29ja2FkZHJfc3RvcmFnZSYgLyogc2EgKi8pIHRocm93KCkgeyByZXR1cm4gREVOWTsgfQorICB2aXJ0dWFsIERlY2lzaW9uIHZlcmlmeShjb25zdCBzb2NrYWRkcl9zdG9yYWdlJiAvKiBzYSAqLykgbm9leGNlcHQgeyByZXR1cm4gREVOWTsgfQogICAvKioKICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHBlZXIgc2hvdWxkIGJlIGdyYW50ZWQgYWNjZXNzIG9yIG5vdC4gSXQncyBjYWxsZWQKICAgICogZXZlcnkgdGltZSBhIEROUyBzdWJqZWN0QWx0TmFtZS9jb21tb24gbmFtZSBpcyBleHRyYWN0ZWQgZnJvbSBwZWVyJ3MKQEAgLTMxNSw3ICs0MDEsNyBAQAogICAgKi8KICAgdmlydHVhbCBEZWNpc2lvbiB2ZXJpZnkoY29uc3Qgc3RkOjpzdHJpbmcmIC8qIGhvc3QgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIC8qIG5hbWUgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiBzaXplICovKSB0aHJvdygpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qIHNpemUgKi8pIG5vZXhjZXB0IHsKICAgICByZXR1cm4gREVOWTsKICAgfQogICAvKioKQEAgLTMyOSw3ICs0MTUsNyBAQAogICAgKi8KICAgdmlydHVhbCBEZWNpc2lvbiB2ZXJpZnkoY29uc3Qgc29ja2FkZHJfc3RvcmFnZSYgLyogc2EgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIC8qIGRhdGEgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiBzaXplICovKSB0aHJvdygpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qIHNpemUgKi8pIG5vZXhjZXB0IHsKICAgICByZXR1cm4gREVOWTsKICAgfQogfTsKQEAgLTMzOSw5ICs0MjUsOSBAQAogY2xhc3MgRGVmYXVsdENsaWVudEFjY2Vzc01hbmFnZXIgOiBwdWJsaWMgQWNjZXNzTWFuYWdlciB7CiBwdWJsaWM6CiAgIC8vIEFjY2Vzc01hbmFnZXIgaW50ZXJmYWNlCi0gIERlY2lzaW9uIHZlcmlmeShjb25zdCBzb2NrYWRkcl9zdG9yYWdlJiBzYSkgdGhyb3coKTsKLSAgRGVjaXNpb24gdmVyaWZ5KGNvbnN0IHN0ZDo6c3RyaW5nJiBob3N0LCBjb25zdCBjaGFyKiBuYW1lLCBpbnQgc2l6ZSkgdGhyb3coKTsKLSAgRGVjaXNpb24gdmVyaWZ5KGNvbnN0IHNvY2thZGRyX3N0b3JhZ2UmIHNhLCBjb25zdCBjaGFyKiBkYXRhLCBpbnQgc2l6ZSkgdGhyb3coKTsKKyAgRGVjaXNpb24gdmVyaWZ5KGNvbnN0IHNvY2thZGRyX3N0b3JhZ2UmIHNhKSBub2V4Y2VwdDsKKyAgRGVjaXNpb24gdmVyaWZ5KGNvbnN0IHN0ZDo6c3RyaW5nJiBob3N0LCBjb25zdCBjaGFyKiBuYW1lLCBpbnQgc2l6ZSkgbm9leGNlcHQ7CisgIERlY2lzaW9uIHZlcmlmeShjb25zdCBzb2NrYWRkcl9zdG9yYWdlJiBzYSwgY29uc3QgY2hhciogZGF0YSwgaW50IHNpemUpIG5vZXhjZXB0OwogfTsKIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuY3BwCmluZGV4IGRhYTE1MjQuLjExOGI5OTMgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmNwcApAQCAtNDYsNyArNDYsNiBAQAogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaD4KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KIAogI2lmbmRlZiBBRl9MT0NBTAogI2RlZmluZSBBRl9MT0NBTCBBRl9VTklYCkBAIC03NSwxNSArNzQsMzcgQEAKICAgZGVsZXRlIHNzb2NrOwogfQogCit1c2luZyBzdGQ6OnN0cmluZzsKKwogbmFtZXNwYWNlIGFwYWNoZSB7CiBuYW1lc3BhY2UgdGhyaWZ0IHsKIG5hbWVzcGFjZSB0cmFuc3BvcnQgewogCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CisKK1RHZXRBZGRySW5mb1dyYXBwZXI6OlRHZXRBZGRySW5mb1dyYXBwZXIoY29uc3QgY2hhciogbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGFkZHJpbmZvKiBoaW50cykKKyAgOiBub2RlXyhub2RlKSwgc2VydmljZV8oc2VydmljZSksIGhpbnRzXyhoaW50cyksIHJlc18oTlVMTCkge30KKworVEdldEFkZHJJbmZvV3JhcHBlcjo6flRHZXRBZGRySW5mb1dyYXBwZXIoKSB7CisgIGlmICh0aGlzLT5yZXNfICE9IE5VTEwpCisgICAgZnJlZWFkZHJpbmZvKHRoaXMtPnJlc18pOworfQorCitpbnQgVEdldEFkZHJJbmZvV3JhcHBlcjo6aW5pdCgpIHsKKyAgaWYgKHRoaXMtPnJlc18gPT0gTlVMTCkKKyAgICByZXR1cm4gZ2V0YWRkcmluZm8odGhpcy0+bm9kZV8sIHRoaXMtPnNlcnZpY2VfLCB0aGlzLT5oaW50c18sICYodGhpcy0+cmVzXykpOworICByZXR1cm4gMDsKK30KKworY29uc3Qgc3RydWN0IGFkZHJpbmZvKiBUR2V0QWRkckluZm9XcmFwcGVyOjpyZXMoKSB7CisgIHJldHVybiB0aGlzLT5yZXNfOworfQogCiBUU2VydmVyU29ja2V0OjpUU2VydmVyU29ja2V0KGludCBwb3J0KQotICA6IHBvcnRfKHBvcnQpLAorICA6IGludGVycnVwdGFibGVDaGlsZHJlbl8odHJ1ZSksCisgICAgcG9ydF8ocG9ydCksCiAgICAgc2VydmVyU29ja2V0XyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpLAogICAgIGFjY2VwdEJhY2tsb2dfKERFRkFVTFRfQkFDS0xPRyksCiAgICAgc2VuZFRpbWVvdXRfKDApLApAQCAtOTQsNyArMTE1LDYgQEAKICAgICB0Y3BTZW5kQnVmZmVyXygwKSwKICAgICB0Y3BSZWN2QnVmZmVyXygwKSwKICAgICBrZWVwQWxpdmVfKGZhbHNlKSwKLSAgICBpbnRlcnJ1cHRhYmxlQ2hpbGRyZW5fKHRydWUpLAogICAgIGxpc3RlbmluZ18oZmFsc2UpLAogICAgIGludGVycnVwdFNvY2tXcml0ZXJfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCksCiAgICAgaW50ZXJydXB0U29ja1JlYWRlcl8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKQEAgLTEwMiw3ICsxMjIsOCBAQAogfQogCiBUU2VydmVyU29ja2V0OjpUU2VydmVyU29ja2V0KGludCBwb3J0LCBpbnQgc2VuZFRpbWVvdXQsIGludCByZWN2VGltZW91dCkKLSAgOiBwb3J0Xyhwb3J0KSwKKyAgOiBpbnRlcnJ1cHRhYmxlQ2hpbGRyZW5fKHRydWUpLAorICAgIHBvcnRfKHBvcnQpLAogICAgIHNlcnZlclNvY2tldF8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKICAgICBhY2NlcHRCYWNrbG9nXyhERUZBVUxUX0JBQ0tMT0cpLAogICAgIHNlbmRUaW1lb3V0XyhzZW5kVGltZW91dCksCkBAIC0xMTMsNyArMTM0LDYgQEAKICAgICB0Y3BTZW5kQnVmZmVyXygwKSwKICAgICB0Y3BSZWN2QnVmZmVyXygwKSwKICAgICBrZWVwQWxpdmVfKGZhbHNlKSwKLSAgICBpbnRlcnJ1cHRhYmxlQ2hpbGRyZW5fKHRydWUpLAogICAgIGxpc3RlbmluZ18oZmFsc2UpLAogICAgIGludGVycnVwdFNvY2tXcml0ZXJfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCksCiAgICAgaW50ZXJydXB0U29ja1JlYWRlcl8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKQEAgLTEyMSw3ICsxNDEsOCBAQAogfQogCiBUU2VydmVyU29ja2V0OjpUU2VydmVyU29ja2V0KGNvbnN0IHN0cmluZyYgYWRkcmVzcywgaW50IHBvcnQpCi0gIDogcG9ydF8ocG9ydCksCisgIDogaW50ZXJydXB0YWJsZUNoaWxkcmVuXyh0cnVlKSwKKyAgICBwb3J0Xyhwb3J0KSwKICAgICBhZGRyZXNzXyhhZGRyZXNzKSwKICAgICBzZXJ2ZXJTb2NrZXRfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCksCiAgICAgYWNjZXB0QmFja2xvZ18oREVGQVVMVF9CQUNLTE9HKSwKQEAgLTEzMyw3ICsxNTQsNiBAQAogICAgIHRjcFNlbmRCdWZmZXJfKDApLAogICAgIHRjcFJlY3ZCdWZmZXJfKDApLAogICAgIGtlZXBBbGl2ZV8oZmFsc2UpLAotICAgIGludGVycnVwdGFibGVDaGlsZHJlbl8odHJ1ZSksCiAgICAgbGlzdGVuaW5nXyhmYWxzZSksCiAgICAgaW50ZXJydXB0U29ja1dyaXRlcl8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKICAgICBpbnRlcnJ1cHRTb2NrUmVhZGVyXyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpLApAQCAtMTQxLDcgKzE2MSw4IEBACiB9CiAKIFRTZXJ2ZXJTb2NrZXQ6OlRTZXJ2ZXJTb2NrZXQoY29uc3Qgc3RyaW5nJiBwYXRoKQotICA6IHBvcnRfKDApLAorICA6IGludGVycnVwdGFibGVDaGlsZHJlbl8odHJ1ZSksCisgICAgcG9ydF8oMCksCiAgICAgcGF0aF8ocGF0aCksCiAgICAgc2VydmVyU29ja2V0XyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpLAogICAgIGFjY2VwdEJhY2tsb2dfKERFRkFVTFRfQkFDS0xPRyksCkBAIC0xNTMsNyArMTc0LDYgQEAKICAgICB0Y3BTZW5kQnVmZmVyXygwKSwKICAgICB0Y3BSZWN2QnVmZmVyXygwKSwKICAgICBrZWVwQWxpdmVfKGZhbHNlKSwKLSAgICBpbnRlcnJ1cHRhYmxlQ2hpbGRyZW5fKHRydWUpLAogICAgIGxpc3RlbmluZ18oZmFsc2UpLAogICAgIGludGVycnVwdFNvY2tXcml0ZXJfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCksCiAgICAgaW50ZXJydXB0U29ja1JlYWRlcl8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKQEAgLTIyOCw3ICsyNDgsNyBAQAogICB9IGVsc2UgewogICAgIGNoaWxkSW50ZXJydXB0U29ja1dyaXRlcl8gPSBzdlsxXTsKICAgICBwQ2hpbGRJbnRlcnJ1cHRTb2NrUmVhZGVyXwotICAgICAgICA9IGJvb3N0OjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+KG5ldyBUSFJJRlRfU09DS0VUKHN2WzBdKSwgZGVzdHJveWVyX29mX2ZpbmVfc29ja2V0cyk7CisgICAgICAgID0gc3RkOjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+KG5ldyBUSFJJRlRfU09DS0VUKHN2WzBdKSwgZGVzdHJveWVyX29mX2ZpbmVfc29ja2V0cyk7CiAgIH0KIAogICAvLyBWYWxpZGF0ZSBwb3J0IG51bWJlcgpAQCAtMjM2LDE3ICsyNTYsMjEgQEAKICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTLCAiU3BlY2lmaWVkIHBvcnQgaXMgaW52YWxpZCIpOwogICB9CiAKLSAgc3RydWN0IGFkZHJpbmZvIGhpbnRzLCAqcmVzLCAqcmVzMDsKKyAgY29uc3Qgc3RydWN0IGFkZHJpbmZvICpyZXM7CiAgIGludCBlcnJvcjsKICAgY2hhciBwb3J0W3NpemVvZigiNjU1MzUiKV07CisgIFRIUklGVF9TTlBSSU5URihwb3J0LCBzaXplb2YocG9ydCksICIlZCIsIHBvcnRfKTsKKworICBzdHJ1Y3QgYWRkcmluZm8gaGludHM7CiAgIHN0ZDo6bWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7CiAgIGhpbnRzLmFpX2ZhbWlseSA9IFBGX1VOU1BFQzsKICAgaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKICAgaGludHMuYWlfZmxhZ3MgPSBBSV9QQVNTSVZFIHwgQUlfQUREUkNPTkZJRzsKLSAgc3ByaW50Zihwb3J0LCAiJWQiLCBwb3J0Xyk7CiAKICAgLy8gSWYgYWRkcmVzcyBpcyBub3Qgc3BlY2lmaWVkIHVzZSB3aWxkY2FyZCBhZGRyZXNzIChOVUxMKQotICBlcnJvciA9IGdldGFkZHJpbmZvKGFkZHJlc3NfLmVtcHR5KCkgPyBOVUxMIDogJmFkZHJlc3NfWzBdLCBwb3J0LCAmaGludHMsICZyZXMwKTsKKyAgVEdldEFkZHJJbmZvV3JhcHBlciBpbmZvKGFkZHJlc3NfLmVtcHR5KCkgPyBOVUxMIDogJmFkZHJlc3NfWzBdLCBwb3J0LCAmaGludHMpOworCisgIGVycm9yID0gaW5mby5pbml0KCk7CiAgIGlmIChlcnJvcikgewogICAgIEdsb2JhbE91dHB1dC5wcmludGYoImdldGFkZHJpbmZvICVkOiAlcyIsIGVycm9yLCBUSFJJRlRfR0FJX1NUUkVSUk9SKGVycm9yKSk7CiAgICAgY2xvc2UoKTsKQEAgLTI1NiwxNCArMjgwLDE0IEBACiAKICAgLy8gUGljayB0aGUgaXB2NiBhZGRyZXNzIGZpcnN0IHNpbmNlIGlwdjQgYWRkcmVzc2VzIGNhbiBiZSBtYXBwZWQKICAgLy8gaW50byBpcHY2IHNwYWNlLgotICBmb3IgKHJlcyA9IHJlczA7IHJlczsgcmVzID0gcmVzLT5haV9uZXh0KSB7CisgIGZvciAocmVzID0gaW5mby5yZXMoKTsgcmVzOyByZXMgPSByZXMtPmFpX25leHQpIHsKICAgICBpZiAocmVzLT5haV9mYW1pbHkgPT0gQUZfSU5FVDYgfHwgcmVzLT5haV9uZXh0ID09IE5VTEwpCiAgICAgICBicmVhazsKICAgfQogCiAgIGlmICghcGF0aF8uZW1wdHkoKSkgewogICAgIHNlcnZlclNvY2tldF8gPSBzb2NrZXQoUEZfVU5JWCwgU09DS19TVFJFQU0sIElQUFJPVE9fSVApOwotICB9IGVsc2UgeworICB9IGVsc2UgaWYgKHJlcyAhPSBOVUxMKSB7CiAgICAgc2VydmVyU29ja2V0XyA9IHNvY2tldChyZXMtPmFpX2ZhbWlseSwgcmVzLT5haV9zb2NrdHlwZSwgcmVzLT5haV9wcm90b2NvbCk7CiAgIH0KIApAQCAtNDAyLDYgKzQyNiw3IEBACiAgIC8vIHdlIG1heSB3YW50IHRvIHRyeSB0byBiaW5kIG1vcmUgdGhhbiBvbmNlLCBzaW5jZSBUSFJJRlRfTk9fU09DS0VUX0NBQ0hJTkcgZG9lc24ndAogICAvLyBhbHdheXMgc2VlbSB0byB3b3JrLiBUaGUgY2xpZW50IGNhbiBjb25maWd1cmUgdGhlIHJldHJ5IHZhcmlhYmxlcy4KICAgaW50IHJldHJpZXMgPSAwOworICBpbnQgZXJybm9fY29weSA9IDA7CiAKICAgaWYgKCFwYXRoXy5lbXB0eSgpKSB7CiAKQEAgLTQxMCw3ICs0MzUsNyBAQAogICAgIC8vIFVuaXggRG9tYWluIFNvY2tldAogICAgIHNpemVfdCBsZW4gPSBwYXRoXy5zaXplKCkgKyAxOwogICAgIGlmIChsZW4gPiBzaXplb2YoKChzb2NrYWRkcl91biopTlVMTCktPnN1bl9wYXRoKSkgewotICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgIGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKICAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6Omxpc3RlbigpIFVuaXggRG9tYWluIHNvY2tldCBwYXRoIHRvbyBsb25nIiwgZXJybm9fY29weSk7CiAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5peCBEb21haW4gc29ja2V0IHBhdGggdG9vIGxvbmciLApAQCAtNDIwLDEyICs0NDUsMjUgQEAKICAgICBzdHJ1Y3Qgc29ja2FkZHJfdW4gYWRkcmVzczsKICAgICBhZGRyZXNzLnN1bl9mYW1pbHkgPSBBRl9VTklYOwogICAgIG1lbWNweShhZGRyZXNzLnN1bl9wYXRoLCBwYXRoXy5jX3N0cigpLCBsZW4pOworCiAgICAgc29ja2xlbl90IHN0cnVjdGxlbiA9IHN0YXRpY19jYXN0PHNvY2tsZW5fdD4oc2l6ZW9mKGFkZHJlc3MpKTsKIAorICAgIGlmICghYWRkcmVzcy5zdW5fcGF0aFswXSkgeyAvLyBhYnN0cmFjdCBuYW1lc3BhY2Ugc29ja2V0CisjaWZkZWYgX19saW51eF9fCisgICAgICAvLyBzdW5fcGF0aCBpcyBub3QgbnVsbC10ZXJtaW5hdGVkIGluIHRoaXMgY2FzZSBhbmQgc3RydWN0bGVuIGRldGVybWluZXMgaXRzIGxlbmd0aAorICAgICAgc3RydWN0bGVuIC09IHNpemVvZihhZGRyZXNzLnN1bl9wYXRoKSAtIGxlbjsKKyNlbHNlCisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpvcGVuKCkgQWJzdHJhY3QgTmFtZXNwYWNlIERvbWFpbiBzb2NrZXRzIG9ubHkgc3VwcG9ydGVkIG9uIGxpbnV4OiAiLCAtOTkpOworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBBYnN0cmFjdCBOYW1lc3BhY2UgRG9tYWluIHNvY2tldCBwYXRoIG5vdCBzdXBwb3J0ZWQiKTsKKyNlbmRpZgorICAgIH0KKwogICAgIGRvIHsKICAgICAgIGlmICgwID09IDo6YmluZChzZXJ2ZXJTb2NrZXRfLCAoc3RydWN0IHNvY2thZGRyKikmYWRkcmVzcywgc3RydWN0bGVuKSkgewogICAgICAgICBicmVhazsKICAgICAgIH0KKyAgICAgIGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKICAgICAgIC8vIHVzZSBzaG9ydCBjaXJjdWl0IGV2YWx1YXRpb24gaGVyZSB0byBvbmx5IHNsZWVwIGlmIHdlIG5lZWQgdG8KICAgICB9IHdoaWxlICgocmV0cmllcysrIDwgcmV0cnlMaW1pdF8pICYmIChUSFJJRlRfU0xFRVBfU0VDKHJldHJ5RGVsYXlfKSA9PSAwKSk7CiAjZWxzZQpAQCAtNDM4LDIyICs0NzYsMjAgQEAKICAgICAgIGlmICgwID09IDo6YmluZChzZXJ2ZXJTb2NrZXRfLCByZXMtPmFpX2FkZHIsIHN0YXRpY19jYXN0PGludD4ocmVzLT5haV9hZGRybGVuKSkpIHsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CisgICAgICBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CiAgICAgICAvLyB1c2Ugc2hvcnQgY2lyY3VpdCBldmFsdWF0aW9uIGhlcmUgdG8gb25seSBzbGVlcCBpZiB3ZSBuZWVkIHRvCiAgICAgfSB3aGlsZSAoKHJldHJpZXMrKyA8IHJldHJ5TGltaXRfKSAmJiAoVEhSSUZUX1NMRUVQX1NFQyhyZXRyeURlbGF5XykgPT0gMCkpOwogCi0gICAgLy8gZnJlZSBhZGRyaW5mbwotICAgIGZyZWVhZGRyaW5mbyhyZXMwKTsKLQogICAgIC8vIHJldHJpZXZlIGJpbmQgaW5mbwogICAgIGlmIChwb3J0XyA9PSAwICYmIHJldHJpZXMgPD0gcmV0cnlMaW1pdF8pIHsKLSAgICAgIHN0cnVjdCBzb2NrYWRkciBzYTsKKyAgICAgIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHNhOwogICAgICAgc29ja2xlbl90IGxlbiA9IHNpemVvZihzYSk7CiAgICAgICBzdGQ6Om1lbXNldCgmc2EsIDAsIGxlbik7Ci0gICAgICBpZiAoOjpnZXRzb2NrbmFtZShzZXJ2ZXJTb2NrZXRfLCAmc2EsICZsZW4pIDwgMCkgewotICAgICAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOworICAgICAgaWYgKDo6Z2V0c29ja25hbWUoc2VydmVyU29ja2V0XywgcmVpbnRlcnByZXRfY2FzdDxzdHJ1Y3Qgc29ja2FkZHIqPigmc2EpLCAmbGVuKSA8IDApIHsKKyAgICAgICAgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOwogICAgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjpnZXRQb3J0KCkgZ2V0c29ja25hbWUoKSAiLCBlcnJub19jb3B5KTsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChzYS5zYV9mYW1pbHkgPT0gQUZfSU5FVDYpIHsKKyAgICAgICAgaWYgKHNhLnNzX2ZhbWlseSA9PSBBRl9JTkVUNikgewogICAgICAgICAgIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbjYqIHNpbiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc3RydWN0IHNvY2thZGRyX2luNio+KCZzYSk7CiAgICAgICAgICAgcG9ydF8gPSBudG9ocyhzaW4tPnNpbjZfcG9ydCk7CiAgICAgICAgIH0gZWxzZSB7CkBAIC00NjgsMTUgKzUwNCwxNSBAQAogICBpZiAocmV0cmllcyA+IHJldHJ5TGltaXRfKSB7CiAgICAgY2hhciBlcnJidWZbMTAyNF07CiAgICAgaWYgKCFwYXRoXy5lbXB0eSgpKSB7Ci0gICAgICBzcHJpbnRmKGVycmJ1ZiwgIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIFBBVEggJXMiLCBwYXRoXy5jX3N0cigpKTsKKyAgICAgIFRIUklGVF9TTlBSSU5URihlcnJidWYsIHNpemVvZihlcnJidWYpLCAiVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgUEFUSCAlcyIsIHBhdGhfLmNfc3RyKCkpOwogICAgIH0gZWxzZSB7Ci0gICAgICBzcHJpbnRmKGVycmJ1ZiwgIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIEJJTkQgJWQiLCBwb3J0Xyk7CisgICAgICBUSFJJRlRfU05QUklOVEYoZXJyYnVmLCBzaXplb2YoZXJyYnVmKSwgIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIEJJTkQgJWQiLCBwb3J0Xyk7CiAgICAgfQogICAgIEdsb2JhbE91dHB1dChlcnJidWYpOwogICAgIGNsb3NlKCk7CiAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgYmluZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKICAgfQogCiAgIGlmIChsaXN0ZW5DYWxsYmFja18pCkBAIC00ODQsNyArNTIwLDcgQEAKIAogICAvLyBDYWxsIGxpc3RlbgogICBpZiAoLTEgPT0gOjpsaXN0ZW4oc2VydmVyU29ja2V0XywgYWNjZXB0QmFja2xvZ18pKSB7Ci0gICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CiAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgbGlzdGVuKCkgIiwgZXJybm9fY29weSk7CiAgICAgY2xvc2UoKTsKICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQ291bGQgbm90IGxpc3RlbiIsIGVycm5vX2NvcHkpOwpAQCAtNTU3LDcgKzU5Myw3IEBACiAgIFRIUklGVF9TT0NLRVQgY2xpZW50U29ja2V0CiAgICAgICA9IDo6YWNjZXB0KHNlcnZlclNvY2tldF8sIChzdHJ1Y3Qgc29ja2FkZHIqKSZjbGllbnRBZGRyZXNzLCAoc29ja2xlbl90Kikmc2l6ZSk7CiAKLSAgaWYgKGNsaWVudFNvY2tldCA9PSAtMSkgeworICBpZiAoY2xpZW50U29ja2V0ID09IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgewogICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CiAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6YWNjZXB0SW1wbCgpIDo6YWNjZXB0KCkgIiwgZXJybm9fY29weSk7CiAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAiYWNjZXB0KCkiLCBlcnJub19jb3B5KTsKQEAgLTYyMSwxNCArNjU3LDIxIEBACiB9CiAKIHZvaWQgVFNlcnZlclNvY2tldDo6aW50ZXJydXB0KCkgewotICBub3RpZnkoaW50ZXJydXB0U29ja1dyaXRlcl8pOworICBjb25jdXJyZW5jeTo6R3VhcmQgZyhyd011dGV4Xyk7CisgIGlmIChpbnRlcnJ1cHRTb2NrV3JpdGVyXyAhPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKKyAgICBub3RpZnkoaW50ZXJydXB0U29ja1dyaXRlcl8pOworICB9CiB9CiAKIHZvaWQgVFNlcnZlclNvY2tldDo6aW50ZXJydXB0Q2hpbGRyZW4oKSB7Ci0gIG5vdGlmeShjaGlsZEludGVycnVwdFNvY2tXcml0ZXJfKTsKKyAgY29uY3VycmVuY3k6Okd1YXJkIGcocndNdXRleF8pOworICBpZiAoY2hpbGRJbnRlcnJ1cHRTb2NrV3JpdGVyXyAhPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKKyAgICBub3RpZnkoY2hpbGRJbnRlcnJ1cHRTb2NrV3JpdGVyXyk7CisgIH0KIH0KIAogdm9pZCBUU2VydmVyU29ja2V0OjpjbG9zZSgpIHsKKyAgY29uY3VycmVuY3k6Okd1YXJkIGcocndNdXRleF8pOwogICBpZiAoc2VydmVyU29ja2V0XyAhPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKICAgICBzaHV0ZG93bihzZXJ2ZXJTb2NrZXRfLCBUSFJJRlRfU0hVVF9SRFdSKTsKICAgICA6OlRIUklGVF9DTE9TRVNPQ0tFVChzZXJ2ZXJTb2NrZXRfKTsKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmgKaW5kZXggNThlNGFmZC4uYjIzZDJjMSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmgKQEAgLTIwLDEwICsyMCwxNyBAQAogI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UU0VSVkVSU09DS0VUX0hfCiAjZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RTRVJWRVJTT0NLRVRfSF8gMQogCi0jaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9QbGF0Zm9ybVNvY2tldC5oPgotI2luY2x1ZGUgPHRocmlmdC9jeHhmdW5jdGlvbmFsLmg+Ci0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0Lmg+CisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZmRlZiBIQVZFX1NZU19TT0NLRVRfSAorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfTkVUREJfSAorI2luY2x1ZGUgPG5ldGRiLmg+CisjZW5kaWYKIAogbmFtZXNwYWNlIGFwYWNoZSB7CiBuYW1lc3BhY2UgdGhyaWZ0IHsKQEAgLTMxLDYgKzM4LDIyIEBACiAKIGNsYXNzIFRTb2NrZXQ7CiAKK2NsYXNzIFRHZXRBZGRySW5mb1dyYXBwZXIgeworcHVibGljOgorICBUR2V0QWRkckluZm9XcmFwcGVyKGNvbnN0IGNoYXIqIG5vZGUsIGNvbnN0IGNoYXIqIHNlcnZpY2UsIGNvbnN0IHN0cnVjdCBhZGRyaW5mbyogaGludHMpOworCisgIHZpcnR1YWwgflRHZXRBZGRySW5mb1dyYXBwZXIoKTsKKworICBpbnQgaW5pdCgpOworICBjb25zdCBzdHJ1Y3QgYWRkcmluZm8qIHJlcygpOworCitwcml2YXRlOgorICBjb25zdCBjaGFyKiBub2RlXzsKKyAgY29uc3QgY2hhciogc2VydmljZV87CisgIGNvbnN0IHN0cnVjdCBhZGRyaW5mbyogaGludHNfOworICBzdHJ1Y3QgYWRkcmluZm8qIHJlc187Cit9OworCiAvKioKICAqIFNlcnZlciBzb2NrZXQgaW1wbGVtZW50YXRpb24gb2YgVFNlcnZlclRyYW5zcG9ydC4gV3JhcHBlciBhcm91bmQgYSB1bml4CiAgKiBzb2NrZXQgbGlzdGVuIGFuZCBhY2NlcHQgY2FsbHMuCkBAIC0zOCw3ICs2MSw3IEBACiAgKi8KIGNsYXNzIFRTZXJ2ZXJTb2NrZXQgOiBwdWJsaWMgVFNlcnZlclRyYW5zcG9ydCB7CiBwdWJsaWM6Ci0gIHR5cGVkZWYgYXBhY2hlOjp0aHJpZnQ6OnN0ZGN4eDo6ZnVuY3Rpb248dm9pZChUSFJJRlRfU09DS0VUIGZkKT4gc29ja2V0X2Z1bmNfdDsKKyAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPHZvaWQoVEhSSUZUX1NPQ0tFVCBmZCk+IHNvY2tldF9mdW5jX3Q7CiAKICAgY29uc3Qgc3RhdGljIGludCBERUZBVUxUX0JBQ0tMT0cgPSAxMDI0OwogCkBAIC0xMTMsNiArMTM2LDggQEAKICAgLy8gXHRocm93cyBzdGQ6OmxvZ2ljX2Vycm9yIGlmIGxpc3RlbigpIGhhcyBiZWVuIGNhbGxlZAogICB2b2lkIHNldEludGVycnVwdGFibGVDaGlsZHJlbihib29sIGVuYWJsZSk7CiAKKyAgVEhSSUZUX1NPQ0tFVCBnZXRTb2NrZXRGRCgpIHsgcmV0dXJuIHNlcnZlclNvY2tldF87IH0KKwogICBpbnQgZ2V0UG9ydCgpOwogCiAgIHZvaWQgbGlzdGVuKCk7CkBAIC0xMjEsOCArMTQ2LDEwIEBACiAgIHZvaWQgY2xvc2UoKTsKIAogcHJvdGVjdGVkOgotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHRJbXBsKCk7Ci0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VFNvY2tldD4gY3JlYXRlU29ja2V0KFRIUklGVF9TT0NLRVQgY2xpZW50KTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdEltcGwoKTsKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gY3JlYXRlU29ja2V0KFRIUklGVF9TT0NLRVQgY2xpZW50KTsKKyAgYm9vbCBpbnRlcnJ1cHRhYmxlQ2hpbGRyZW5fOworICBzdGQ6OnNoYXJlZF9wdHI8VEhSSUZUX1NPQ0tFVD4gcENoaWxkSW50ZXJydXB0U29ja1JlYWRlcl87IC8vIGlmIGludGVycnVwdGFibGVDaGlsZHJlbl8gdGhpcyBpcyBzaGFyZWQgd2l0aCBjaGlsZCBUU29ja2V0cwogCiBwcml2YXRlOgogICB2b2lkIG5vdGlmeShUSFJJRlRfU09DS0VUIG5vdGlmeVNvY2spOwpAQCAtMTQwLDEzICsxNjcsMTIgQEAKICAgaW50IHRjcFNlbmRCdWZmZXJfOwogICBpbnQgdGNwUmVjdkJ1ZmZlcl87CiAgIGJvb2wga2VlcEFsaXZlXzsKLSAgYm9vbCBpbnRlcnJ1cHRhYmxlQ2hpbGRyZW5fOwogICBib29sIGxpc3RlbmluZ187CiAKKyAgY29uY3VycmVuY3k6Ok11dGV4IHJ3TXV0ZXhfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRocmVhZC1zYWZlIGludGVycnVwdAogICBUSFJJRlRfU09DS0VUIGludGVycnVwdFNvY2tXcml0ZXJfOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgbm90aWZpZWQgb24gaW50ZXJydXB0KCkKICAgVEhSSUZUX1NPQ0tFVCBpbnRlcnJ1cHRTb2NrUmVhZGVyXzsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHVzZWQgaW4gc2VsZWN0L3BvbGwgd2l0aCBzZXJ2ZXJTb2NrZXRfIGZvciBpbnRlcnJ1cHRhYmlsaXR5CiAgIFRIUklGVF9TT0NLRVQgY2hpbGRJbnRlcnJ1cHRTb2NrV3JpdGVyXzsgICAgICAgICAgICAgICAgICAgICAvLyBpcyBub3RpZmllZCBvbiBpbnRlcnJ1cHRDaGlsZHJlbigpCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IHBDaGlsZEludGVycnVwdFNvY2tSZWFkZXJfOyAvLyBpZiBpbnRlcnJ1cHRhYmxlQ2hpbGRyZW5fIHRoaXMgaXMgc2hhcmVkIHdpdGggY2hpbGQgVFNvY2tldHMKIAogICBzb2NrZXRfZnVuY190IGxpc3RlbkNhbGxiYWNrXzsKICAgc29ja2V0X2Z1bmNfdCBhY2NlcHRDYWxsYmFja187CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5oCmluZGV4IGNkMWQzZGEuLmRiNzYzMmEgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5oCkBAIC0yMiw3ICsyMiw2IEBACiAKICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaD4KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KIAogbmFtZXNwYWNlIGFwYWNoZSB7CiBuYW1lc3BhY2UgdGhyaWZ0IHsKQEAgLTU2LDggKzU1LDggQEAKICAgICogQHJldHVybiBBIG5ldyBUVHJhbnNwb3J0IG9iamVjdAogICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3IKICAgICovCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdCgpIHsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiByZXN1bHQgPSBhY2NlcHRJbXBsKCk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHQoKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHJlc3VsdCA9IGFjY2VwdEltcGwoKTsKICAgICBpZiAoIXJlc3VsdCkgewogICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbigiYWNjZXB0KCkgbWF5IG5vdCByZXR1cm4gTlVMTCIpOwogICAgIH0KQEAgLTgzLDYgKzgyLDE1IEBACiAgIHZpcnR1YWwgdm9pZCBpbnRlcnJ1cHRDaGlsZHJlbigpIHt9CiAKICAgLyoqCisgICogVXRpbGl0eSBtZXRob2QKKyAgKgorICAqIEByZXR1cm4gc2VydmVyIHNvY2tldCBmaWxlIGRlc2NyaXB0b3IKKyAgKiBAdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cnMKKyAgKi8KKworICB2aXJ0dWFsIFRIUklGVF9TT0NLRVQgZ2V0U29ja2V0RkQoKSB7IHJldHVybiAtMTsgfQorCisgIC8qKgogICAgKiBDbG9zZXMgdGhpcyB0cmFuc3BvcnQgc3VjaCB0aGF0IGZ1dHVyZSBjYWxscyB0byBhY2NlcHQgd2lsbCBkbyBub3RoaW5nLgogICAgKi8KICAgdmlydHVhbCB2b2lkIGNsb3NlKCkgPSAwOwpAQCAtOTYsNyArMTA0LDcgQEAKICAgICogQHJldHVybiBBIG5ld2x5IGFsbG9jYXRlZCBUVHJhbnNwb3J0IG9iamVjdAogICAgKiBAdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cnMKICAgICovCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0SW1wbCgpID0gMDsKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0SW1wbCgpID0gMDsKIH07CiB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTaG9ydFJlYWRUcmFuc3BvcnQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNob3J0UmVhZFRyYW5zcG9ydC5oCmluZGV4IGYyZWNhZTEuLjExODI1MmQgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNob3J0UmVhZFRyYW5zcG9ydC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNob3J0UmVhZFRyYW5zcG9ydC5oCkBAIC0zOCw3ICszOCw3IEBACiAgKi8KIGNsYXNzIFRTaG9ydFJlYWRUcmFuc3BvcnQgOiBwdWJsaWMgVFZpcnR1YWxUcmFuc3BvcnQ8VFNob3J0UmVhZFRyYW5zcG9ydD4gewogcHVibGljOgotICBUU2hvcnRSZWFkVHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCwgZG91YmxlIGZ1bGxfcHJvYikKKyAgVFNob3J0UmVhZFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0LCBkb3VibGUgZnVsbF9wcm9iKQogICAgIDogdHJhbnNwb3J0Xyh0cmFuc3BvcnQpLCBmdWxsUHJvYl8oZnVsbF9wcm9iKSB7fQogCiAgIGJvb2wgaXNPcGVuKCkgeyByZXR1cm4gdHJhbnNwb3J0Xy0+aXNPcGVuKCk7IH0KQEAgLTY4LDEwICs2OCwxMCBAQAogCiAgIHZvaWQgY29uc3VtZSh1aW50MzJfdCBsZW4pIHsgcmV0dXJuIHRyYW5zcG9ydF8tPmNvbnN1bWUobGVuKTsgfQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFVuZGVybHlpbmdUcmFuc3BvcnQoKSB7IHJldHVybiB0cmFuc3BvcnRfOyB9CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRVbmRlcmx5aW5nVHJhbnNwb3J0KCkgeyByZXR1cm4gdHJhbnNwb3J0XzsgfQogCiBwcm90ZWN0ZWQ6Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydF87CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnRfOwogICBkb3VibGUgZnVsbFByb2JfOwogfTsKIH0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuY3BwCmluZGV4IGQzMzZiYjQuLmM2YzJiZmEgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldC5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0LmNwcApAQCAtMjEsNiArMjEsOSBAQAogCiAjaW5jbHVkZSA8Y3N0cmluZz4KICNpbmNsdWRlIDxzc3RyZWFtPgorI2lmZGVmIEhBVkVfU1lTX0lPQ1RMX0gKKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNlbmRpZgogI2lmZGVmIEhBVkVfU1lTX1NPQ0tFVF9ICiAjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgogI2VuZGlmCkBAIC02MywxMiArNjYsMTIgQEAKICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8U09DS09QVF9DQVNUX1QqPih2KTsKIH0KIAordXNpbmcgc3RkOjpzdHJpbmc7CisKIG5hbWVzcGFjZSBhcGFjaGUgewogbmFtZXNwYWNlIHRocmlmdCB7CiBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKIAotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQogLyoqCiAgKiBUU29ja2V0IGltcGxlbWVudGF0aW9uLgogICoKQEAgLTc3LDggKzgwLDggQEAKIFRTb2NrZXQ6OlRTb2NrZXQoY29uc3Qgc3RyaW5nJiBob3N0LCBpbnQgcG9ydCkKICAgOiBob3N0Xyhob3N0KSwKICAgICBwb3J0Xyhwb3J0KSwKLSAgICBwYXRoXygiIiksCiAgICAgc29ja2V0XyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpLAorICAgIHBlZXJQb3J0XygwKSwKICAgICBjb25uVGltZW91dF8oMCksCiAgICAgc2VuZFRpbWVvdXRfKDApLAogICAgIHJlY3ZUaW1lb3V0XygwKSwKQEAgLTkwLDEwICs5MywxMCBAQAogfQogCiBUU29ja2V0OjpUU29ja2V0KGNvbnN0IHN0cmluZyYgcGF0aCkKLSAgOiBob3N0XygiIiksCi0gICAgcG9ydF8oMCksCisgIDogcG9ydF8oMCksCiAgICAgcGF0aF8ocGF0aCksCiAgICAgc29ja2V0XyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpLAorICAgIHBlZXJQb3J0XygwKSwKICAgICBjb25uVGltZW91dF8oMCksCiAgICAgc2VuZFRpbWVvdXRfKDApLAogICAgIHJlY3ZUaW1lb3V0XygwKSwKQEAgLTEwNiwxMCArMTA5LDkgQEAKIH0KIAogVFNvY2tldDo6VFNvY2tldCgpCi0gIDogaG9zdF8oIiIpLAotICAgIHBvcnRfKDApLAotICAgIHBhdGhfKCIiKSwKKyAgOiBwb3J0XygwKSwKICAgICBzb2NrZXRfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCksCisgICAgcGVlclBvcnRfKDApLAogICAgIGNvbm5UaW1lb3V0XygwKSwKICAgICBzZW5kVGltZW91dF8oMCksCiAgICAgcmVjdlRpbWVvdXRfKDApLApAQCAtMTIyLDEwICsxMjQsOSBAQAogfQogCiBUU29ja2V0OjpUU29ja2V0KFRIUklGVF9TT0NLRVQgc29ja2V0KQotICA6IGhvc3RfKCIiKSwKLSAgICBwb3J0XygwKSwKLSAgICBwYXRoXygiIiksCisgIDogcG9ydF8oMCksCiAgICAgc29ja2V0Xyhzb2NrZXQpLAorICAgIHBlZXJQb3J0XygwKSwKICAgICBjb25uVGltZW91dF8oMCksCiAgICAgc2VuZFRpbWVvdXRfKDApLAogICAgIHJlY3ZUaW1lb3V0XygwKSwKQEAgLTE0MywxMSArMTQ0LDEwIEBACiAjZW5kaWYKIH0KIAotVFNvY2tldDo6VFNvY2tldChUSFJJRlRfU09DS0VUIHNvY2tldCwgYm9vc3Q6OnNoYXJlZF9wdHI8VEhSSUZUX1NPQ0tFVD4gaW50ZXJydXB0TGlzdGVuZXIpCi0gIDogaG9zdF8oIiIpLAotICAgIHBvcnRfKDApLAotICAgIHBhdGhfKCIiKSwKK1RTb2NrZXQ6OlRTb2NrZXQoVEhSSUZUX1NPQ0tFVCBzb2NrZXQsIHN0ZDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBpbnRlcnJ1cHRMaXN0ZW5lcikKKyAgOiBwb3J0XygwKSwKICAgICBzb2NrZXRfKHNvY2tldCksCisgICAgcGVlclBvcnRfKDApLAogICAgIGludGVycnVwdExpc3RlbmVyXyhpbnRlcnJ1cHRMaXN0ZW5lciksCiAgICAgY29ublRpbWVvdXRfKDApLAogICAgIHNlbmRUaW1lb3V0XygwKSwKQEAgLTE3MCw2ICsxNzAsMjYgQEAKICAgY2xvc2UoKTsKIH0KIAorYm9vbCBUU29ja2V0OjpoYXNQZW5kaW5nRGF0YVRvUmVhZCgpIHsKKyAgaWYgKCFpc09wZW4oKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGludDMyX3QgcmV0cmllcyA9IDA7CisgIFRIUklGVF9JT0NUTF9TT0NLRVRfTlVNX0JZVEVTX1RZUEUgbnVtQnl0ZXNBdmFpbGFibGU7Cit0cnlfYWdhaW46CisgIGludCByID0gVEhSSUZUX0lPQ1RMX1NPQ0tFVChzb2NrZXRfLCBGSU9OUkVBRCwgJm51bUJ5dGVzQXZhaWxhYmxlKTsKKyAgaWYgKHIgPT0gLTEpIHsKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIGlmIChlcnJub19jb3B5ID09IFRIUklGVF9FSU5UUiAmJiAocmV0cmllcysrIDwgbWF4UmVjdlJldHJpZXNfKSkgeworICAgICAgZ290byB0cnlfYWdhaW47CisgICAgfQorICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6Omhhc1BlbmRpbmdEYXRhVG9SZWFkKCkgVEhSSUZUX0lPQ1RMX1NPQ0tFVCgpICIgKyBnZXRTb2NrZXRJbmZvKCksIGVycm5vX2NvcHkpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwgIlVua25vd24iLCBlcnJub19jb3B5KTsKKyAgfQorICByZXR1cm4gbnVtQnl0ZXNBdmFpbGFibGUgPiAwOworfQorCiBib29sIFRTb2NrZXQ6OmlzT3BlbigpIHsKICAgcmV0dXJuIChzb2NrZXRfICE9IFRIUklGVF9JTlZBTElEX1NPQ0tFVCk7CiB9CkBAIC0yMjAsNyArMjQwLDYgQEAKICAgICAgKiB0aGUgb3RoZXIgc2lkZQogICAgICAqLwogICAgIGlmIChlcnJub19jb3B5ID09IFRIUklGVF9FQ09OTlJFU0VUKSB7Ci0gICAgICBjbG9zZSgpOwogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICNlbmRpZgpAQCAtMzE0LDcgKzMzMywyMCBAQAogICAgIHN0cnVjdCBzb2NrYWRkcl91biBhZGRyZXNzOwogICAgIGFkZHJlc3Muc3VuX2ZhbWlseSA9IEFGX1VOSVg7CiAgICAgbWVtY3B5KGFkZHJlc3Muc3VuX3BhdGgsIHBhdGhfLmNfc3RyKCksIGxlbik7CisKICAgICBzb2NrbGVuX3Qgc3RydWN0bGVuID0gc3RhdGljX2Nhc3Q8c29ja2xlbl90PihzaXplb2YoYWRkcmVzcykpOworCisgICAgaWYgKCFhZGRyZXNzLnN1bl9wYXRoWzBdKSB7IC8vIGFic3RyYWN0IG5hbWVzcGFjZSBzb2NrZXQKKyNpZmRlZiBfX2xpbnV4X18KKyAgICAgIC8vIHN1bl9wYXRoIGlzIG5vdCBudWxsLXRlcm1pbmF0ZWQgaW4gdGhpcyBjYXNlIGFuZCBzdHJ1Y3RsZW4gZGV0ZXJtaW5lcyBpdHMgbGVuZ3RoCisgICAgICBzdHJ1Y3RsZW4gLT0gc2l6ZW9mKGFkZHJlc3Muc3VuX3BhdGgpIC0gbGVuOworI2Vsc2UKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6Om9wZW4oKSBBYnN0cmFjdCBOYW1lc3BhY2UgRG9tYWluIHNvY2tldHMgb25seSBzdXBwb3J0ZWQgb24gbGludXg6ICIsIC05OSk7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIEFic3RyYWN0IE5hbWVzcGFjZSBEb21haW4gc29ja2V0IHBhdGggbm90IHN1cHBvcnRlZCIpOworI2VuZGlmCisgICAgfQorCiAgICAgcmV0ID0gY29ubmVjdChzb2NrZXRfLCAoc3RydWN0IHNvY2thZGRyKikmYWRkcmVzcywgc3RydWN0bGVuKTsKICNlbHNlCiAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6b3BlbigpIFVuaXggRG9tYWluIHNvY2tldCBwYXRoIG5vdCBzdXBwb3J0ZWQgb24gd2luZG93cyIsIC05OSk7CkBAIC0zNzYsNyArNDA4LDExIEBACiAKIGRvbmU6CiAgIC8vIFNldCBzb2NrZXQgYmFjayB0byBub3JtYWwgbW9kZSAoYmxvY2tpbmcpCi0gIFRIUklGVF9GQ05UTChzb2NrZXRfLCBUSFJJRlRfRl9TRVRGTCwgZmxhZ3MpOworICBpZiAoLTEgPT0gVEhSSUZUX0ZDTlRMKHNvY2tldF8sIFRIUklGVF9GX1NFVEZMLCBmbGFncykpIHsKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6Om9wZW4oKSBUSFJJRlRfRkNOVEwgIiArIGdldFNvY2tldEluZm8oKSwgZXJybm9fY29weSk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIlRIUklGVF9GQ05UTCgpIGZhaWxlZCIsIGVycm5vX2NvcHkpOworICB9CiAKICAgaWYgKHBhdGhfLmVtcHR5KCkpIHsKICAgICBzZXRDYWNoZWRBZGRyZXNzKHJlcy0+YWlfYWRkciwgc3RhdGljX2Nhc3Q8c29ja2xlbl90PihyZXMtPmFpX2FkZHJsZW4pKTsKQEAgLTY0Myw3ICs2NzksNiBAQAogCiAgICAgaWYgKGVycm5vX2NvcHkgPT0gVEhSSUZUX0VQSVBFIHx8IGVycm5vX2NvcHkgPT0gVEhSSUZUX0VDT05OUkVTRVQKICAgICAgICAgfHwgZXJybm9fY29weSA9PSBUSFJJRlRfRU5PVENPTk4pIHsKLSAgICAgIGNsb3NlKCk7CiAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAid3JpdGUoKSBzZW5kKCkiLCBlcnJub19jb3B5KTsKICAgICB9CiAKQEAgLTY4Myw3ICs3MTgsNyBAQAogI2lmbmRlZiBfV0lOMzIKICAgc3RydWN0IGxpbmdlciBsID0geyhsaW5nZXJPbl8gPyAxIDogMCksIGxpbmdlclZhbF99OwogI2Vsc2UKLSAgc3RydWN0IGxpbmdlciBsID0geyhsaW5nZXJPbl8gPyAxIDogMCksIHN0YXRpY19jYXN0PHVfc2hvcnQ+KGxpbmdlclZhbF8pfTsKKyAgc3RydWN0IGxpbmdlciBsID0ge3N0YXRpY19jYXN0PHVfc2hvcnQ+KGxpbmdlck9uXyA/IDEgOiAwKSwgc3RhdGljX2Nhc3Q8dV9zaG9ydD4obGluZ2VyVmFsXyl9OwogI2VuZGlmCiAKICAgaW50IHJldCA9IHNldHNvY2tvcHQoc29ja2V0XywgU09MX1NPQ0tFVCwgU09fTElOR0VSLCBjYXN0X3NvY2tvcHQoJmwpLCBzaXplb2YobCkpOwpAQCAtNzUzLDcgKzc4OCw3IEBACiB2b2lkIFRTb2NrZXQ6OnNldEtlZXBBbGl2ZShib29sIGtlZXBBbGl2ZSkgewogICBrZWVwQWxpdmVfID0ga2VlcEFsaXZlOwogCi0gIGlmIChzb2NrZXRfID09IC0xKSB7CisgIGlmIChzb2NrZXRfID09IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgewogICAgIHJldHVybjsKICAgfQogCkBAIC03NzQsMTEgKzgwOSwxNSBAQAogCiBzdHJpbmcgVFNvY2tldDo6Z2V0U29ja2V0SW5mbygpIHsKICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKLSAgaWYgKGhvc3RfLmVtcHR5KCkgfHwgcG9ydF8gPT0gMCkgewotICAgIG9zcyA8PCAiPEhvc3Q6ICIgPDwgZ2V0UGVlckFkZHJlc3MoKTsKLSAgICBvc3MgPDwgIiBQb3J0OiAiIDw8IGdldFBlZXJQb3J0KCkgPDwgIj4iOworICBpZiAocGF0aF8uZW1wdHkoKSkgeworICAgIGlmIChob3N0Xy5lbXB0eSgpIHx8IHBvcnRfID09IDApIHsKKyAgICAgIG9zcyA8PCAiPEhvc3Q6ICIgPDwgZ2V0UGVlckFkZHJlc3MoKTsKKyAgICAgIG9zcyA8PCAiIFBvcnQ6ICIgPDwgZ2V0UGVlclBvcnQoKSA8PCAiPiI7CisgICAgfSBlbHNlIHsKKyAgICAgIG9zcyA8PCAiPEhvc3Q6ICIgPDwgaG9zdF8gPDwgIiBQb3J0OiAiIDw8IHBvcnRfIDw8ICI+IjsKKyAgICB9CiAgIH0gZWxzZSB7Ci0gICAgb3NzIDw8ICI8SG9zdDogIiA8PCBob3N0XyA8PCAiIFBvcnQ6ICIgPDwgcG9ydF8gPDwgIj4iOworICAgIG9zcyA8PCAiPFBhdGg6ICIgPDwgcGF0aF8gPDwgIj4iOwogICB9CiAgIHJldHVybiBvc3Muc3RyKCk7CiB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oCmluZGV4IDlmMDA3NGQuLjQwMzBkNDYgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oCkBAIC04NCw3ICs4NCw5IEBACiAgIHZpcnR1YWwgYm9vbCBpc09wZW4oKTsKIAogICAvKioKLSAgICogQ2FsbHMgc2VsZWN0IG9uIHRoZSBzb2NrZXQgdG8gc2VlIGlmIHRoZXJlIGlzIG1vcmUgZGF0YSBhdmFpbGFibGUuCisgICAqIENoZWNrcyB3aGV0aGVyIHRoZXJlIGlzIG1vcmUgZGF0YSBhdmFpbGFibGUgaW4gdGhlIHNvY2tldCB0byByZWFkLgorICAgKgorICAgKiBUaGlzIGNhbGwgYmxvY2tzIHVudGlsIGF0IGxlYXN0IG9uZSBieXRlIGlzIGF2YWlsYWJsZSBvciB0aGUgc29ja2V0IGlzIGNsb3NlZC4KICAgICovCiAgIHZpcnR1YWwgYm9vbCBwZWVrKCk7CiAKQEAgLTEwMSw2ICsxMDMsMTcgQEAKICAgdmlydHVhbCB2b2lkIGNsb3NlKCk7CiAKICAgLyoqCisgICAqIERldGVybWluZXMgd2hldGhlciB0aGVyZSBpcyBwZW5kaW5nIGRhdGEgdG8gcmVhZCBvciBub3QuCisgICAqCisgICAqIFRoaXMgY2FsbCBkb2VzIG5vdCBibG9jay4KKyAgICogXHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIG9mIHR5cGVzOgorICAgKiAgICAgICAgICAgTk9UX09QRU4gbWVhbnMgdGhlIHNvY2tldCBoYXMgYmVlbiBjbG9zZWQKKyAgICogICAgICAgICAgIFVOS05PV04gbWVhbnMgc29tZXRoaW5nIHVuZXhwZWN0ZWQgaGFwcGVuZWQKKyAgICogXHJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBwZW5kaW5nIGRhdGEgdG8gcmVhZCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAqLworICB2aXJ0dWFsIGJvb2wgaGFzUGVuZGluZ0RhdGFUb1JlYWQoKTsKKworICAvKioKICAgICogUmVhZHMgZnJvbSB0aGUgdW5kZXJseWluZyBzb2NrZXQuCiAgICAqIFxyZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCBvciAwIGluZGljYXRlcyBFT0YKICAgICogXHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIG9mIHR5cGVzOgpAQCAtMTIwLDcgKzEzMyw3IEBACiAgIC8qKgogICAgKiBXcml0ZXMgdG8gdGhlIHVuZGVybHlpbmcgc29ja2V0LiAgRG9lcyBzaW5nbGUgc2VuZCgpIGFuZCByZXR1cm5zIHJlc3VsdC4KICAgICovCi0gIHVpbnQzMl90IHdyaXRlX3BhcnRpYWwoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlX3BhcnRpYWwoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOwogCiAgIC8qKgogICAgKiBHZXQgdGhlIGhvc3QgdGhhdCB0aGUgc29ja2V0IGlzIGNvbm5lY3RlZCB0bwpAQCAtMjU3LDcgKzI3MCw3IEBACiAgICAqIENvbnN0cnVjdG9yIHRvIGNyZWF0ZSBzb2NrZXQgZnJvbSBmaWxlIGRlc2NyaXB0b3IgdGhhdAogICAgKiBjYW4gYmUgaW50ZXJydXB0ZWQgc2FmZWx5LgogICAgKi8KLSAgVFNvY2tldChUSFJJRlRfU09DS0VUIHNvY2tldCwgYm9vc3Q6OnNoYXJlZF9wdHI8VEhSSUZUX1NPQ0tFVD4gaW50ZXJydXB0TGlzdGVuZXIpOworICBUU29ja2V0KFRIUklGVF9TT0NLRVQgc29ja2V0LCBzdGQ6OnNoYXJlZF9wdHI8VEhSSUZUX1NPQ0tFVD4gaW50ZXJydXB0TGlzdGVuZXIpOwogCiAgIC8qKgogICAgKiBTZXQgYSBjYWNoZSBvZiB0aGUgcGVlciBhZGRyZXNzICh1c2VkIHdoZW4gdHJpdmlhbGx5IGF2YWlsYWJsZTogZS5nLgpAQCAtMjcyLDE1ICsyODUsNiBAQAogICAvKiogSG9zdCB0byBjb25uZWN0IHRvICovCiAgIHN0ZDo6c3RyaW5nIGhvc3RfOwogCi0gIC8qKiBQZWVyIGhvc3RuYW1lICovCi0gIHN0ZDo6c3RyaW5nIHBlZXJIb3N0XzsKLQotICAvKiogUGVlciBhZGRyZXNzICovCi0gIHN0ZDo6c3RyaW5nIHBlZXJBZGRyZXNzXzsKLQotICAvKiogUGVlciBwb3J0ICovCi0gIGludCBwZWVyUG9ydF87Ci0KICAgLyoqIFBvcnQgbnVtYmVyIHRvIGNvbm5lY3Qgb24gKi8KICAgaW50IHBvcnRfOwogCkBAIC0yOTAsMTEgKzI5NCwyMCBAQAogICAvKiogVW5kZXJseWluZyBzb2NrZXQgaGFuZGxlICovCiAgIFRIUklGVF9TT0NLRVQgc29ja2V0XzsKIAorICAvKiogUGVlciBob3N0bmFtZSAqLworICBzdGQ6OnN0cmluZyBwZWVySG9zdF87CisKKyAgLyoqIFBlZXIgYWRkcmVzcyAqLworICBzdGQ6OnN0cmluZyBwZWVyQWRkcmVzc187CisKKyAgLyoqIFBlZXIgcG9ydCAqLworICBpbnQgcGVlclBvcnRfOworCiAgIC8qKgogICAgKiBBIHNoYXJlZCBzb2NrZXQgcG9pbnRlciB0aGF0IHdpbGwgaW50ZXJydXB0IGEgYmxvY2tpbmcgcmVhZCBpZiBkYXRhCiAgICAqIGJlY29tZXMgYXZhaWxhYmxlIG9uIGl0CiAgICAqLwotICBib29zdDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBpbnRlcnJ1cHRMaXN0ZW5lcl87CisgIHN0ZDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBpbnRlcnJ1cHRMaXN0ZW5lcl87CiAKICAgLyoqIENvbm5lY3QgdGltZW91dCBpbiBtcyAqLwogICBpbnQgY29ublRpbWVvdXRfOwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0UG9vbC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXRQb29sLmNwcAppbmRleCBjY2FiMjU4Li41NDc3YmJiIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXRQb29sLmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXRQb29sLmNwcApAQCAtMjEsMTYgKzIxLDIxIEBACiAKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAjaW5jbHVkZSA8aW9zdHJlYW0+CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxNzAzTAorI2luY2x1ZGUgPHJhbmRvbT4KKyNlbmRpZgogCiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0UG9vbC5oPgogCit1c2luZyBzdGQ6OnBhaXI7Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCiBuYW1lc3BhY2UgYXBhY2hlIHsKIG5hbWVzcGFjZSB0aHJpZnQgewogbmFtZXNwYWNlIHRyYW5zcG9ydCB7CiAKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwogCiAvKioKICAqIFRTb2NrZXRQb29sU2VydmVyIGltcGxlbWVudGF0aW9uCkBAIC0xODYsNyArMTkxLDEzIEBACiAgIH0KIAogICBpZiAocmFuZG9taXplXyAmJiBudW1TZXJ2ZXJzID4gMSkgewotICAgIHJhbmRvbV9zaHVmZmxlKHNlcnZlcnNfLmJlZ2luKCksIHNlcnZlcnNfLmVuZCgpKTsKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDE3MDNMCisgICAgc3RkOjpyYW5kb21fZGV2aWNlIHJuZzsKKyAgICBzdGQ6Om10MTk5MzcgdXJuZyhybmcoKSk7CisgICAgc3RkOjpzaHVmZmxlKHNlcnZlcnNfLmJlZ2luKCksIHNlcnZlcnNfLmVuZCgpLCB1cm5nKTsKKyNlbHNlCisgICAgc3RkOjpyYW5kb21fc2h1ZmZsZShzZXJ2ZXJzXy5iZWdpbigpLCBzZXJ2ZXJzXy5lbmQoKSk7CisjZW5kaWYKICAgfQogCiAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU2VydmVyczsgKytpKSB7CkBAIC0yMTUsNyArMjI2LDcgQEAKICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbnVtUmV0cmllc187ICsraikgewogICAgICAgICB0cnkgewogICAgICAgICAgIFRTb2NrZXQ6Om9wZW4oKTsKLSAgICAgICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0gY2F0Y2ggKGNvbnN0IFRFeGNlcHRpb24gJmUpIHsKICAgICAgICAgICBzdHJpbmcgZXJyU3RyID0gIlRTb2NrZXRQb29sOjpvcGVuIGZhaWxlZCAiICsgZ2V0U29ja2V0SW5mbygpICsgIjogIiArIGUud2hhdCgpOwogICAgICAgICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7CiAgICAgICAgICAgc29ja2V0XyA9IFRIUklGVF9JTlZBTElEX1NPQ0tFVDsKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldFBvb2wuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldFBvb2wuaAppbmRleCA3OGYwZWJmLi4xOGYxMDFjIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXRQb29sLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0UG9vbC5oCkBAIC05Miw3ICs5Miw3IEBACiAgICAqCiAgICAqIEBwYXJhbSBzZXJ2ZXJzIGxpc3Qgb2YgVFNvY2tldFBvb2xTZXJ2ZXJzCiAgICAqLwotICBUU29ja2V0UG9vbChjb25zdCBzdGQ6OnZlY3Rvcjxib29zdDo6c2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gPiYgc2VydmVycyk7CisgIFRTb2NrZXRQb29sKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gPiYgc2VydmVycyk7CiAKICAgLyoqCiAgICAqIFNvY2tldCBwb29sIGNvbnN0cnVjdG9yCkBAIC0xMTUsMTcgKzExNSwxNyBAQAogICAvKioKICAgICogQWRkIGEgc2VydmVyIHRvIHRoZSBwb29sCiAgICAqLwotICB2b2lkIGFkZFNlcnZlcihib29zdDo6c2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4mIHNlcnZlcik7CisgIHZvaWQgYWRkU2VydmVyKHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4mIHNlcnZlcik7CiAKICAgLyoqCiAgICAqIFNldCBsaXN0IG9mIHNlcnZlcnMgaW4gdGhpcyBwb29sCiAgICAqLwotICB2b2lkIHNldFNlcnZlcnMoY29uc3Qgc3RkOjp2ZWN0b3I8Ym9vc3Q6OnNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+ID4mIHNlcnZlcnMpOworICB2b2lkIHNldFNlcnZlcnMoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiA+JiBzZXJ2ZXJzKTsKIAogICAvKioKICAgICogR2V0IGxpc3Qgb2Ygc2VydmVycyBpbiB0aGlzIHBvb2wKICAgICovCi0gIHZvaWQgZ2V0U2VydmVycyhzdGQ6OnZlY3Rvcjxib29zdDo6c2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gPiYgc2VydmVycyk7CisgIHZvaWQgZ2V0U2VydmVycyhzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+ID4mIHNlcnZlcnMpOwogCiAgIC8qKgogICAgKiBTZXRzIGhvdyBtYW55IHRpbWVzIHRvIGtlZXAgcmV0cnlpbmcgYSBob3N0IGluIHRoZSBjb25uZWN0IGZ1bmN0aW9uLgpAQCAtMTYzLDEzICsxNjMsMTMgQEAKICAgdm9pZCBjbG9zZSgpOwogCiBwcm90ZWN0ZWQ6Ci0gIHZvaWQgc2V0Q3VycmVudFNlcnZlcihjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4mIHNlcnZlcik7CisgIHZvaWQgc2V0Q3VycmVudFNlcnZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+JiBzZXJ2ZXIpOwogCiAgIC8qKiBMaXN0IG9mIHNlcnZlcnMgdG8gY29ubmVjdCB0byAqLwotICBzdGQ6OnZlY3Rvcjxib29zdDo6c2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gPiBzZXJ2ZXJzXzsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiA+IHNlcnZlcnNfOwogCiAgIC8qKiBDdXJyZW50IHNlcnZlciAqLwotICBib29zdDo6c2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gY3VycmVudFNlcnZlcl87CisgIHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gY3VycmVudFNlcnZlcl87CiAKICAgLyoqIEhvdyBtYW55IHRpbWVzIHRvIHJldHJ5IGVhY2ggaG9zdCBpbiBjb25uZWN0ICovCiAgIGludCBudW1SZXRyaWVzXzsKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0LmgKaW5kZXggZDA2YjBmOC4uZDg0NDIzOSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0LmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0LmgKQEAgLTIxLDggKzIxLDggQEAKICNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVFRSQU5TUE9SVF9IXyAxCiAKICNpbmNsdWRlIDx0aHJpZnQvVGhyaWZ0Lmg+Ci0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmg+CisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHN0cmluZz4KIAogbmFtZXNwYWNlIGFwYWNoZSB7CkBAIC0yNjAsNyArMjYwLDcgQEAKICAgLyoqCiAgICAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLCBqdXN0IHJldHVybnMgdGhlIHRyYW5zcG9ydCBnaXZlbi4KICAgICovCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSB7CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKICAgICByZXR1cm4gdHJhbnM7CiAgIH0KIH07CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmNwcAppbmRleCA2MTJlN2I3Li5hNTI3MzE3IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5jcHAKQEAgLTE4LDE5ICsxOCwxNyBAQAogICovCiAKICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaD4KLSNpbmNsdWRlIDxib29zdC9sZXhpY2FsX2Nhc3QuaHBwPgogI2luY2x1ZGUgPGNzdHJpbmc+CiAKICNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgogCiB1c2luZyBzdGQ6OnN0cmluZzsKLXVzaW5nIGJvb3N0OjpsZXhpY2FsX2Nhc3Q7CiAKIG5hbWVzcGFjZSBhcGFjaGUgewogbmFtZXNwYWNlIHRocmlmdCB7CiBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKIAotY29uc3QgY2hhciogVFRyYW5zcG9ydEV4Y2VwdGlvbjo6d2hhdCgpIGNvbnN0IHRocm93KCkgeworY29uc3QgY2hhciogVFRyYW5zcG9ydEV4Y2VwdGlvbjo6d2hhdCgpIGNvbnN0IG5vZXhjZXB0IHsKICAgaWYgKG1lc3NhZ2VfLmVtcHR5KCkpIHsKICAgICBzd2l0Y2ggKHR5cGVfKSB7CiAgICAgY2FzZSBVTktOT1dOOgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaAppbmRleCA4M2U4NzZhLi5mYjVmMDBjIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaApAQCAtMjAsNiArMjAsNyBAQAogI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UVFJBTlNQT1JURVhDRVBUSU9OX0hfCiAjZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RUUkFOU1BPUlRFWENFUFRJT05fSF8gMQogCisjaW5jbHVkZSA8Ym9vc3QvbnVtZXJpYy9jb252ZXJzaW9uL2Nhc3QuaHBwPgogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx0aHJpZnQvVGhyaWZ0Lmg+CiAKQEAgLTY0LDcgKzY1LDcgQEAKICAgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uVHlwZSB0eXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSwgaW50IGVycm5vX2NvcHkpCiAgICAgOiBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbihtZXNzYWdlICsgIjogIiArIFRPdXRwdXQ6OnN0cmVycm9yX3MoZXJybm9fY29weSkpLCB0eXBlXyh0eXBlKSB7fQogCi0gIHZpcnR1YWwgflRUcmFuc3BvcnRFeGNlcHRpb24oKSB0aHJvdygpIHt9CisgIHZpcnR1YWwgflRUcmFuc3BvcnRFeGNlcHRpb24oKSBub2V4Y2VwdCB7fQogCiAgIC8qKgogICAgKiBSZXR1cm5zIGFuIGVycm9yIGNvZGUgdGhhdCBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHlwZSBvZiBlcnJvcgpAQCAtNzIsOSArNzMsOSBAQAogICAgKgogICAgKiBAcmV0dXJuIEVycm9yIGNvZGUKICAgICovCi0gIFRUcmFuc3BvcnRFeGNlcHRpb25UeXBlIGdldFR5cGUoKSBjb25zdCB0aHJvdygpIHsgcmV0dXJuIHR5cGVfOyB9CisgIFRUcmFuc3BvcnRFeGNlcHRpb25UeXBlIGdldFR5cGUoKSBjb25zdCBub2V4Y2VwdCB7IHJldHVybiB0eXBlXzsgfQogCi0gIHZpcnR1YWwgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IHRocm93KCk7CisgIHZpcnR1YWwgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IG5vZXhjZXB0OwogCiBwcm90ZWN0ZWQ6CiAgIC8qKiBKdXN0IGxpa2Ugc3RyZXJyb3JfciBidXQgcmV0dXJucyBhIEMrKyBzdHJpbmcgb2JqZWN0LiAqLwpAQCAtODMsNiArODQsMjEgQEAKICAgLyoqIEVycm9yIGNvZGUgKi8KICAgVFRyYW5zcG9ydEV4Y2VwdGlvblR5cGUgdHlwZV87CiB9OworCisvKioKKyAqIExlZ2FjeSBjb2RlIGluIHRyYW5zcG9ydCBpbXBsZW1lbnRhdGlvbnMgaGF2ZSBvdmVyZmxvdyBpc3N1ZXMKKyAqIHRoYXQgbmVlZCB0byBiZSBlbmZvcmNlZC4KKyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFRvLCB0eXBlbmFtZSBGcm9tPiBUbyBzYWZlX251bWVyaWNfY2FzdChGcm9tIGkpIHsKKyAgdHJ5IHsKKyAgICByZXR1cm4gYm9vc3Q6Om51bWVyaWNfY2FzdDxUbz4oaSk7CisgIH0KKyAgY2F0Y2ggKGNvbnN0IHN0ZDo6YmFkX2Nhc3QmIGJjKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpDT1JSVVBURURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjLndoYXQoKSk7CisgIH0KK30KKwogfQogfQogfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5jcHAKaW5kZXggMGYyNGM5NS4uNmY0N2M3OSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmNwcApAQCAtNDEsNyArNDEsMTEgQEAKICAgICAvLyBEb3VibGUgdGhlIHNpemUgb2YgdGhlIHVuZGVybHlpbmcgYnVmZmVyIGlmIGl0IGlzIGZ1bGwKICAgICBpZiAockxlbl8gPT0gckJ1ZlNpemVfKSB7CiAgICAgICByQnVmU2l6ZV8gKj0gMjsKLSAgICAgIHJCdWZfID0gKHVpbnQ4X3QqKXN0ZDo6cmVhbGxvYyhyQnVmXywgc2l6ZW9mKHVpbnQ4X3QpICogckJ1ZlNpemVfKTsKKyAgICAgIHVpbnQ4X3QgKnRtcEJ1ZiA9ICh1aW50OF90KilzdGQ6OnJlYWxsb2MockJ1Zl8sIHNpemVvZih1aW50OF90KSAqIHJCdWZTaXplXyk7CisgICAgICBpZiAodG1wQnVmID09IE5VTEwpIHsKKyAgICAgICB0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOworICAgICAgfQorICAgICAgckJ1Zl8gPSB0bXBCdWY7CiAgICAgfQogCiAgICAgLy8gdHJ5IHRvIGZpbGwgdXAgdGhlIGJ1ZmZlcgpAQCAtNzMsNyArNzcsMTIgQEAKICAgICB3aGlsZSAoKGxlbiArIHdMZW5fKSA+PSBuZXdCdWZTaXplKSB7CiAgICAgICBuZXdCdWZTaXplICo9IDI7CiAgICAgfQotICAgIHdCdWZfID0gKHVpbnQ4X3QqKXN0ZDo6cmVhbGxvYyh3QnVmXywgc2l6ZW9mKHVpbnQ4X3QpICogbmV3QnVmU2l6ZSk7CisgICAgdWludDhfdCAqdG1wQnVmPSAodWludDhfdCopc3RkOjpyZWFsbG9jKHdCdWZfLCBzaXplb2YodWludDhfdCkgKiBuZXdCdWZTaXplKTsKKyAgICBpZiAodG1wQnVmID09IE5VTEwpIHsKKyAgICAgIHRocm93IHN0ZDo6YmFkX2FsbG9jKCk7CisgICAgfQorICAgIHdCdWZfID0gdG1wQnVmOworCiAgICAgd0J1ZlNpemVfID0gbmV3QnVmU2l6ZTsKICAgfQogCkBAIC05NCw4ICsxMDMsOCBAQAogfQogCiBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0OjpUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0KAotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBzcmNUcmFucywKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBkc3RUcmFucykKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IHNyY1RyYW5zLAorICAgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBkc3RUcmFucykKICAgOiBUUGlwZWRUcmFuc3BvcnQoc3JjVHJhbnMsIGRzdFRyYW5zKSwgc3JjVHJhbnNfKHNyY1RyYW5zKSB7CiB9CiAKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5oCmluZGV4IGMyMjE4MzYuLjRjODJkZDMgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaApAQCAtNjMsNyArNjMsNyBAQAogICovCiBjbGFzcyBUUGlwZWRUcmFuc3BvcnQgOiB2aXJ0dWFsIHB1YmxpYyBUVHJhbnNwb3J0IHsKIHB1YmxpYzoKLSAgVFBpcGVkVHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHNyY1RyYW5zLCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBkc3RUcmFucykKKyAgVFBpcGVkVHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBzcmNUcmFucywgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGRzdFRyYW5zKQogICAgIDogc3JjVHJhbnNfKHNyY1RyYW5zKSwKICAgICAgIGRzdFRyYW5zXyhkc3RUcmFucyksCiAgICAgICByQnVmU2l6ZV8oNTEyKSwKQEAgLTg2LDggKzg2LDggQEAKICAgICB9CiAgIH0KIAotICBUUGlwZWRUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gc3JjVHJhbnMsCi0gICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBkc3RUcmFucywKKyAgVFBpcGVkVHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBzcmNUcmFucywKKyAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBkc3RUcmFucywKICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN6KQogICAgIDogc3JjVHJhbnNfKHNyY1RyYW5zKSwKICAgICAgIGRzdFRyYW5zXyhkc3RUcmFucyksCkBAIC0xMTksNyArMTE5LDExIEBACiAgICAgICAvLyBEb3VibGUgdGhlIHNpemUgb2YgdGhlIHVuZGVybHlpbmcgYnVmZmVyIGlmIGl0IGlzIGZ1bGwKICAgICAgIGlmIChyTGVuXyA9PSByQnVmU2l6ZV8pIHsKICAgICAgICAgckJ1ZlNpemVfICo9IDI7Ci0gICAgICAgIHJCdWZfID0gKHVpbnQ4X3QqKXN0ZDo6cmVhbGxvYyhyQnVmXywgc2l6ZW9mKHVpbnQ4X3QpICogckJ1ZlNpemVfKTsKKyAgICAgICAgdWludDhfdCAqIHRtcEJ1ZiA9ICh1aW50OF90KilzdGQ6OnJlYWxsb2MockJ1Zl8sIHNpemVvZih1aW50OF90KSAqIHJCdWZTaXplXyk7CisJaWYgKHRtcEJ1ZiA9PSBOVUxMKSB7CisJICB0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOworCX0KKwlyQnVmXyA9IHRtcEJ1ZjsKICAgICAgIH0KIAogICAgICAgLy8gdHJ5IHRvIGZpbGwgdXAgdGhlIGJ1ZmZlcgpAQCAtMTcwLDcgKzE3NCw3IEBACiAKICAgdm9pZCBmbHVzaCgpOwogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRhcmdldFRyYW5zcG9ydCgpIHsgcmV0dXJuIGRzdFRyYW5zXzsgfQorICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VGFyZ2V0VHJhbnNwb3J0KCkgeyByZXR1cm4gZHN0VHJhbnNfOyB9CiAKICAgLyoKICAgICogT3ZlcnJpZGUgVFRyYW5zcG9ydCAqX3ZpcnQoKSBmdW5jdGlvbnMgdG8gaW52b2tlIG91ciBpbXBsZW1lbnRhdGlvbnMuCkBAIC0xODEsOCArMTg1LDggQEAKICAgdmlydHVhbCB2b2lkIHdyaXRlX3ZpcnQoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsgdGhpcy0+d3JpdGUoYnVmLCBsZW4pOyB9CiAKIHByb3RlY3RlZDoKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gc3JjVHJhbnNfOwotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBkc3RUcmFuc187CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBzcmNUcmFuc187CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBkc3RUcmFuc187CiAKICAgdWludDhfdCogckJ1Zl87CiAgIHVpbnQzMl90IHJCdWZTaXplXzsKQEAgLTIwNCw3ICsyMDgsNyBAQAogY2xhc3MgVFBpcGVkVHJhbnNwb3J0RmFjdG9yeSA6IHB1YmxpYyBUVHJhbnNwb3J0RmFjdG9yeSB7CiBwdWJsaWM6CiAgIFRQaXBlZFRyYW5zcG9ydEZhY3RvcnkoKSB7fQotICBUUGlwZWRUcmFuc3BvcnRGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGRzdFRyYW5zKSB7CisgIFRQaXBlZFRyYW5zcG9ydEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGRzdFRyYW5zKSB7CiAgICAgaW5pdGlhbGl6ZVRhcmdldFRyYW5zcG9ydChkc3RUcmFucyk7CiAgIH0KICAgdmlydHVhbCB+VFBpcGVkVHJhbnNwb3J0RmFjdG9yeSgpIHt9CkBAIC0yMTIsMTEgKzIxNiwxMSBAQAogICAvKioKICAgICogV3JhcHMgdGhlIGJhc2UgdHJhbnNwb3J0IGludG8gYSBwaXBlZCB0cmFuc3BvcnQuCiAgICAqLwotICB2aXJ0dWFsIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBzcmNUcmFucykgewotICAgIHJldHVybiBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PihuZXcgVFBpcGVkVHJhbnNwb3J0KHNyY1RyYW5zLCBkc3RUcmFuc18pKTsKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBzcmNUcmFucykgeworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRQaXBlZFRyYW5zcG9ydChzcmNUcmFucywgZHN0VHJhbnNfKSk7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgaW5pdGlhbGl6ZVRhcmdldFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBkc3RUcmFucykgeworICB2aXJ0dWFsIHZvaWQgaW5pdGlhbGl6ZVRhcmdldFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZHN0VHJhbnMpIHsKICAgICBpZiAoZHN0VHJhbnNfLmdldCgpID09IE5VTEwpIHsKICAgICAgIGRzdFRyYW5zXyA9IGRzdFRyYW5zOwogICAgIH0gZWxzZSB7CkBAIC0yMjUsNyArMjI5LDcgQEAKICAgfQogCiBwcm90ZWN0ZWQ6Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGRzdFRyYW5zXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGRzdFRyYW5zXzsKIH07CiAKIC8qKgpAQCAtMjM2LDggKzI0MCw4IEBACiAgKi8KIGNsYXNzIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQgOiBwdWJsaWMgVFBpcGVkVHJhbnNwb3J0LCBwdWJsaWMgVEZpbGVSZWFkZXJUcmFuc3BvcnQgewogcHVibGljOgotICBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBzcmNUcmFucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBkc3RUcmFucyk7CisgIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBzcmNUcmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZHN0VHJhbnMpOwogCiAgIH5UUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0KCk7CiAKQEAgLTI3Myw3ICsyNzcsNyBAQAogcHJvdGVjdGVkOgogICAvLyBzaG91bGRuJ3QgYmUgdXNlZAogICBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0KCk7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBzcmNUcmFuc187CisgIHN0ZDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gc3JjVHJhbnNfOwogfTsKIAogLyoqCkBAIC0yODMsMjMgKzI4NywyMyBAQAogY2xhc3MgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydEZhY3RvcnkgOiBwdWJsaWMgVFBpcGVkVHJhbnNwb3J0RmFjdG9yeSB7CiBwdWJsaWM6CiAgIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnRGYWN0b3J5KCkge30KLSAgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydEZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZHN0VHJhbnMpCisgIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnRGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBkc3RUcmFucykKICAgICA6IFRQaXBlZFRyYW5zcG9ydEZhY3RvcnkoZHN0VHJhbnMpIHt9CiAgIHZpcnR1YWwgflRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnRGYWN0b3J5KCkge30KIAotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gc3JjVHJhbnMpIHsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gcEZpbGVSZWFkZXJUcmFuc3BvcnQKLSAgICAgICAgPSBib29zdDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+KHNyY1RyYW5zKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gc3JjVHJhbnMpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IHBGaWxlUmVhZGVyVHJhbnNwb3J0CisgICAgICAgID0gc3RkOjpkeW5hbWljX3BvaW50ZXJfY2FzdDxURmlsZVJlYWRlclRyYW5zcG9ydD4oc3JjVHJhbnMpOwogICAgIGlmIChwRmlsZVJlYWRlclRyYW5zcG9ydC5nZXQoKSAhPSBOVUxMKSB7CiAgICAgICByZXR1cm4gZ2V0RmlsZVJlYWRlclRyYW5zcG9ydChwRmlsZVJlYWRlclRyYW5zcG9ydCk7CiAgICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PigpOworICAgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PigpOwogICAgIH0KICAgfQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBnZXRGaWxlUmVhZGVyVHJhbnNwb3J0KAotICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IHNyY1RyYW5zKSB7Ci0gICAgcmV0dXJuIGJvb3N0OjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PigKKyAgc3RkOjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBnZXRGaWxlUmVhZGVyVHJhbnNwb3J0KAorICAgICAgc3RkOjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBzcmNUcmFucykgeworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+KAogICAgICAgICBuZXcgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydChzcmNUcmFucywgZHN0VHJhbnNfKSk7CiAgIH0KIH07CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuY3BwCmluZGV4IGZiNWNjNWQuLmU0MjZkYzMgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuY3BwCkBAIC0yNTUsNiArMjU1LDE1IEBACiAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywgImZsdXNoKCkgY2FsbGVkIGFmdGVyIGZpbmlzaCgpIik7CiAgIH0KIAorICBmbHVzaFRvWmxpYih1d2J1Zl8sIHV3cG9zXywgWl9CTE9DSyk7CisgIHV3cG9zXyA9IDA7CisKKyAgaWYod3N0cmVhbV8tPmF2YWlsX291dCA8IDYpeworICAgIHRyYW5zcG9ydF8tPndyaXRlKGN3YnVmXywgY3didWZfc2l6ZV8gLSB3c3RyZWFtXy0+YXZhaWxfb3V0KTsKKyAgICB3c3RyZWFtXy0+bmV4dF9vdXQgPSBjd2J1Zl87CisgICAgd3N0cmVhbV8tPmF2YWlsX291dCA9IGN3YnVmX3NpemVfOworICB9CisKICAgZmx1c2hUb1RyYW5zcG9ydChaX0ZVTExfRkxVU0gpOwogfQogCkBAIC0yODUsNyArMjk0LDcgQEAKICAgd3N0cmVhbV8tPmF2YWlsX2luID0gbGVuOwogCiAgIHdoaWxlICh0cnVlKSB7Ci0gICAgaWYgKGZsdXNoID09IFpfTk9fRkxVU0ggJiYgd3N0cmVhbV8tPmF2YWlsX2luID09IDApIHsKKyAgICBpZiAoKGZsdXNoID09IFpfTk9fRkxVU0ggfHwgZmx1c2ggPT0gWl9CTE9DSykgJiYgd3N0cmVhbV8tPmF2YWlsX2luID09IDApIHsKICAgICAgIGJyZWFrOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5oCmluZGV4IDFlN2I1ZWMuLmI0NWVjNDMgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0LmgKQEAgLTIwLDkgKzIwLDkgQEAKICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFpMSUJUUkFOU1BPUlRfSF8KICNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVFpMSUJUUkFOU1BPUlRfSF8gMQogCi0jaW5jbHVkZSA8Ym9vc3QvbGV4aWNhbF9jYXN0LmhwcD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RWaXJ0dWFsVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L1RUb1N0cmluZy5oPgogI2luY2x1ZGUgPHpsaWIuaD4KIAogc3RydWN0IHpfc3RyZWFtX3M7CkBAIC0zOCw3ICszOCw3IEBACiAgICAgICB6bGliX3N0YXR1c18oc3RhdHVzKSwKICAgICAgIHpsaWJfbXNnXyhtc2cgPT0gTlVMTCA/ICIobnVsbCkiIDogbXNnKSB7fQogCi0gIHZpcnR1YWwgflRabGliVHJhbnNwb3J0RXhjZXB0aW9uKCkgdGhyb3coKSB7fQorICB2aXJ0dWFsIH5UWmxpYlRyYW5zcG9ydEV4Y2VwdGlvbigpIG5vZXhjZXB0IHt9CiAKICAgaW50IGdldFpsaWJTdGF0dXMoKSB7IHJldHVybiB6bGliX3N0YXR1c187IH0KICAgc3RkOjpzdHJpbmcgZ2V0WmxpYk1lc3NhZ2UoKSB7IHJldHVybiB6bGliX21zZ187IH0KQEAgLTUxLDcgKzUxLDcgQEAKICAgICAgIHJ2ICs9ICIobm8gbWVzc2FnZSkiOwogICAgIH0KICAgICBydiArPSAiIChzdGF0dXMgPSAiOwotICAgIHJ2ICs9IGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RkOjpzdHJpbmc+KHN0YXR1cyk7CisgICAgcnYgKz0gdG9fc3RyaW5nKHN0YXR1cyk7CiAgICAgcnYgKz0gIikiOwogICAgIHJldHVybiBydjsKICAgfQpAQCAtNzgsNyArNzgsNyBAQAogICAgKiBAcGFyYW0gY3didWZfc2l6ZSAgIENvbXByZXNzZWQgYnVmZmVyIHNpemUgZm9yIHdyaXRpbmcuCiAgICAqIEBwYXJhbSBjb21wX2xldmVsICAgQ29tcHJlc3Npb24gbGV2ZWwgKDA9bm9uZVtmYXN0XSwgNj1kZWZhdWx0LCA5PW1heFtzbG93XSkuCiAgICAqLwotICBUWmxpYlRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQsCisgIFRabGliVHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQsCiAgICAgICAgICAgICAgICAgIGludCB1cmJ1Zl9zaXplID0gREVGQVVMVF9VUkJVRl9TSVpFLAogICAgICAgICAgICAgICAgICBpbnQgY3JidWZfc2l6ZSA9IERFRkFVTFRfQ1JCVUZfU0laRSwKICAgICAgICAgICAgICAgICAgaW50IHV3YnVmX3NpemUgPSBERUZBVUxUX1VXQlVGX1NJWkUsCkBAIC0xMDUsNyArMTA1LDcgQEAKICAgICAgIGludCBtaW5pbXVtID0gTUlOX0RJUkVDVF9ERUZMQVRFX1NJWkU7CiAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVFpMaWJUcmFuc3BvcnQ6IHVuY29tcHJlc3NlZCB3cml0ZSBidWZmZXIgbXVzdCBiZSBhdCBsZWFzdCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBib29zdDo6bGV4aWNhbF9jYXN0PHN0ZDo6c3RyaW5nPihtaW5pbXVtKSArICIuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdG9fc3RyaW5nKG1pbmltdW0pICsgIi4iKTsKICAgICB9CiAKICAgICB0cnkgewpAQCAtMTgwLDYgKzE4MCw4IEBACiAgIHN0YXRpYyBjb25zdCBpbnQgREVGQVVMVF9VV0JVRl9TSVpFID0gMTI4OwogICBzdGF0aWMgY29uc3QgaW50IERFRkFVTFRfQ1dCVUZfU0laRSA9IDEwMjQ7CiAKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFVuZGVybHlpbmdUcmFuc3BvcnQoKSBjb25zdCB7IHJldHVybiB0cmFuc3BvcnRfOyB9CisKIHByb3RlY3RlZDoKICAgaW5saW5lIHZvaWQgY2hlY2tabGliUnYoaW50IHN0YXR1cywgY29uc3QgY2hhciogbXNnKTsKICAgaW5saW5lIHZvaWQgY2hlY2tabGliUnZOb3Rocm93KGludCBzdGF0dXMsIGNvbnN0IGNoYXIqIG1zZyk7CkBAIC0xOTMsNyArMTk1LDcgQEAKICAgLy8gTGFyZ2VyIChvciBlcXVhbCkgd3JpdGVzIGFyZSBkdW1wZWQgc3RyYWlnaHQgdG8gemxpYi4KICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IE1JTl9ESVJFQ1RfREVGTEFURV9TSVpFID0gMzI7CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0XzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydF87CiAKICAgaW50IHVycG9zXzsKICAgaW50IHV3cG9zXzsKQEAgLTIyOSw4ICsyMzEsOCBAQAogCiAgIHZpcnR1YWwgflRabGliVHJhbnNwb3J0RmFjdG9yeSgpIHt9CiAKLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKLSAgICByZXR1cm4gYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRabGliVHJhbnNwb3J0KHRyYW5zKSk7CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUWmxpYlRyYW5zcG9ydCh0cmFucykpOwogICB9CiB9OwogfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvR2V0VGltZU9mRGF5LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL0dldFRpbWVPZkRheS5jcHAKaW5kZXggNjU0ZDAwNS4uODIwODI4ZiAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvR2V0VGltZU9mRGF5LmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9HZXRUaW1lT2ZEYXkuY3BwCkBAIC0yMSw3ICsyMSw5IEBACiAjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KIAogLy8gd2luMzIKLSNpbmNsdWRlIDx0aW1lLmg+CisjaWYgZGVmaW5lZChfX01JTkdXMzJfXykKKyAgI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjZW5kaWYKIAogI2lmIGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX01TQ19FWFRFTlNJT05TKQogI2RlZmluZSBERUxUQV9FUE9DSF9JTl9NSUNST1NFQ1MgMTE2NDQ0NzM2MDAwMDAwMDBVaTY0CkBAIC0yOSwxMSArMzEsMTggQEAKICNkZWZpbmUgREVMVEFfRVBPQ0hfSU5fTUlDUk9TRUNTIDExNjQ0NDczNjAwMDAwMDAwVUxMCiAjZW5kaWYKIAorI2lmICFkZWZpbmVkKF9fTUlOR1czMl9fKQogc3RydWN0IHRpbWV6b25lIHsKICAgaW50IHR6X21pbnV0ZXN3ZXN0OyAvKiBtaW51dGVzIFcgb2YgR3JlZW53aWNoICovCiAgIGludCB0el9kc3R0aW1lOyAgICAgLyogdHlwZSBvZiBkc3QgY29ycmVjdGlvbiAqLwogfTsKKyNlbmRpZgogCisjaWYgZGVmaW5lZChfX01JTkdXMzJfXykKK2ludCB0aHJpZnRfZ2V0dGltZW9mZGF5KHN0cnVjdCB0aW1ldmFsKiB0diwgc3RydWN0IHRpbWV6b25lKiB0eikgeworICByZXR1cm4gZ2V0dGltZW9mZGF5KHR2LHR6KTsKK30KKyNlbHNlCiBpbnQgdGhyaWZ0X2dldHRpbWVvZmRheShzdHJ1Y3QgdGltZXZhbCogdHYsIHN0cnVjdCB0aW1lem9uZSogdHopIHsKICAgRklMRVRJTUUgZnQ7CiAgIHVuc2lnbmVkIF9faW50NjQgdG1wcmVzKDApOwpAQCAtNzksNiArODgsNyBAQAogCiAgIHJldHVybiAwOwogfQorI2VuZGlmCiAKIGludCB0aHJpZnRfc2xlZXAodW5zaWduZWQgaW50IHNlY29uZHMpIHsKICAgOjpTbGVlcChzZWNvbmRzICogMTAwMCk7CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9HZXRUaW1lT2ZEYXkuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL0dldFRpbWVPZkRheS5oCmluZGV4IDZlOTBiYTEuLjc2MmFjNWUgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL0dldFRpbWVPZkRheS5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL0dldFRpbWVPZkRheS5oCkBAIC0yOSw2ICsyOSw3IEBACiAjZW5kaWYKIAogI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CisjaW5jbHVkZSA8dGltZS5oPgogCiBzdHJ1Y3QgdGhyaWZ0X3RpbWVzcGVjIHsKICAgaW50NjRfdCB0dl9zZWM7CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9PdmVybGFwcGVkU3VibWlzc2lvblRocmVhZC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQuaAppbmRleCA1NjY4NGJiLi5kZDBjNWM5IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9PdmVybGFwcGVkU3VibWlzc2lvblRocmVhZC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL092ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkLmgKQEAgLTYzLDcgKzYzLDcgQEAKIG5hbWVzcGFjZSB0aHJpZnQgewogbmFtZXNwYWNlIHRyYW5zcG9ydCB7CiAKLURFQ0xTUEVDX0FMSUdOKE1FTU9SWV9BTExPQ0FUSU9OX0FMSUdOTUVOVCkgc3RydWN0IFRPdmVybGFwcGVkV29ya0l0ZW0gOiBwdWJsaWMgU0xJU1RfRU5UUlkgeworc3RydWN0IERFQ0xTUEVDX0FMSUdOKE1FTU9SWV9BTExPQ0FUSU9OX0FMSUdOTUVOVCkgVE92ZXJsYXBwZWRXb3JrSXRlbSA6IHB1YmxpYyBTTElTVF9FTlRSWSB7CiAgIFRPdmVybGFwcGVkV29ya0l0ZW0oKTsKIAogICBlbnVtIGFjdGlvbl90IHsKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL1RXaW5zb2NrU2luZ2xldG9uLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL1RXaW5zb2NrU2luZ2xldG9uLmNwcAppbmRleCAyZTBjY2Y1Li5kMjY4M2IwIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9UV2luc29ja1NpbmdsZXRvbi5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvVFdpbnNvY2tTaW5nbGV0b24uY3BwCkBAIC0yOCwxMyArMjgsNyBAQAogbmFtZXNwYWNlIHRyYW5zcG9ydCB7CiAKIFRXaW5zb2NrU2luZ2xldG9uOjppbnN0YW5jZV9wdHIgVFdpbnNvY2tTaW5nbGV0b246Omluc3RhbmNlX3B0cl8oTlVMTCk7Ci0jaWYgVVNFX0JPT1NUX1RIUkVBRAotYm9vc3Q6Om9uY2VfZmxhZyBUV2luc29ja1NpbmdsZXRvbjo6ZmxhZ3NfID0gQk9PU1RfT05DRV9JTklUOwotI2VsaWYgVVNFX1NURF9USFJFQUQKIHN0ZDo6b25jZV9mbGFnIFRXaW5zb2NrU2luZ2xldG9uOjpmbGFnc187Ci0jZWxzZQotI2Vycm9yIEZvciB3aW5kb3dzIHlvdSBtdXN0IGNob29zZSBVU0VfQk9PU1RfVEhSRUFEIG9yIFVTRV9TVERfVEhSRUFECi0jZW5kaWYKIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFRXaW5zb2NrU2luZ2xldG9uOjpUV2luc29ja1NpbmdsZXRvbih2b2lkKSB7CkBAIC01NSwxMSArNDksNyBAQAogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogdm9pZCBUV2luc29ja1NpbmdsZXRvbjo6Y3JlYXRlKHZvaWQpIHsKLSNpZiBVU0VfQk9PU1RfVEhSRUFECi0gIGJvb3N0OjpjYWxsX29uY2UoaW5pdCwgZmxhZ3NfKTsKLSNlbGlmIFVTRV9TVERfVEhSRUFECiAgIHN0ZDo6Y2FsbF9vbmNlKGZsYWdzXywgaW5pdCk7Ci0jZW5kaWYKIH0KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL1RXaW5zb2NrU2luZ2xldG9uLmggYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9UV2luc29ja1NpbmdsZXRvbi5oCmluZGV4IGRjMWI1MmYuLmEzMDgwNmIgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL1RXaW5zb2NrU2luZ2xldG9uLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvVFdpbnNvY2tTaW5nbGV0b24uaApAQCAtMzIsMTUgKzMyLDEwIEBACiAKIC8vIGJvb3N0CiAjaW5jbHVkZSA8Ym9vc3Qvbm9uY29weWFibGUuaHBwPgotI2luY2x1ZGUgPGJvb3N0L3Njb3BlZF9wdHIuaHBwPgogCi0jaWYgVVNFX0JPT1NUX1RIUkVBRAotI2luY2x1ZGUgPGJvb3N0L3RocmVhZC9vbmNlLmhwcD4KLSNlbGlmIFVTRV9TVERfVEhSRUFECisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPG11dGV4PgotI2Vsc2UKLSNlcnJvciBGb3Igd2luZG93cyB5b3UgbXVzdCBjaG9vc2UgVVNFX0JPT1NUX1RIUkVBRCBvciBVU0VfU1REX1RIUkVBRAotI2VuZGlmCisKIAogbmFtZXNwYWNlIGFwYWNoZSB7CiBuYW1lc3BhY2UgdGhyaWZ0IHsKQEAgLTUzLDcgKzQ4LDcgQEAKIGNsYXNzIFRXaW5zb2NrU2luZ2xldG9uIDogcHJpdmF0ZSBib29zdDo6bm9uY29weWFibGUgewogCiBwdWJsaWM6Ci0gIHR5cGVkZWYgYm9vc3Q6OnNjb3BlZF9wdHI8VFdpbnNvY2tTaW5nbGV0b24+IGluc3RhbmNlX3B0cjsKKyAgdHlwZWRlZiBzdGQ6OnNoYXJlZF9wdHI8VFdpbnNvY2tTaW5nbGV0b24+IGluc3RhbmNlX3B0cjsKIAogcHJpdmF0ZToKICAgVFdpbnNvY2tTaW5nbGV0b24odm9pZCk7CkBAIC02OSwxMyArNjQsNyBAQAogCiBwcml2YXRlOgogICBzdGF0aWMgaW5zdGFuY2VfcHRyIGluc3RhbmNlX3B0cl87Ci0jaWYgVVNFX0JPT1NUX1RIUkVBRAotICBzdGF0aWMgYm9vc3Q6Om9uY2VfZmxhZyBmbGFnc187Ci0jZWxpZiBVU0VfU1REX1RIUkVBRAogICBzdGF0aWMgc3RkOjpvbmNlX2ZsYWcgZmxhZ3NfOwotI2Vsc2UKLSNlcnJvciBOZWVkIGEgbm9uLUJvb3N0IG5vbi1DKysxMSB3YXkgdG8gdHJhY2sgc2luZ2xlIGluaXRpYWxpemF0aW9uIGhlcmUuCi0jZW5kaWYKIH07CiB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9XaW5GY250bC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9XaW5GY250bC5jcHAKaW5kZXggYzhiODVmMy4uYzkwN2U5MiAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvV2luRmNudGwuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL1dpbkZjbnRsLmNwcApAQCAtNjcsNyArNjcsOCBAQAogICB0aW1ldmFsIHRpbWVfb3V0OwogICB0aW1ldmFsKiB0aW1lX291dF9wdHIgPSBOVUxMOwogICBpZiAodGltZW91dCA+PSAwKSB7Ci0gICAgdGltZXZhbCB0aW1lX291dCA9IHt0aW1lb3V0IC8gMTAwMCwgKHRpbWVvdXQgJSAxMDAwKSAqIDEwMDB9OworICAgIHRpbWVfb3V0LnR2X3NlYyA9IHRpbWVvdXQgLyAxMDAwOworICAgIHRpbWVfb3V0LnR2X3VzZWMgPSAodGltZW91dCAlIDEwMDApICogMTAwMDsKICAgICB0aW1lX291dF9wdHIgPSAmdGltZV9vdXQ7CiAgIH0gZWxzZSB7IC8vIHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzCiAgICAgKHZvaWQpdGltZV9vdXQ7CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9jb25maWcuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL2NvbmZpZy5oCmluZGV4IDU4MGQ2ODAuLmE1ZjQ0NTcgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL2NvbmZpZy5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL2NvbmZpZy5oCkBAIC0yNSwxNSArMjUsMjAgQEAKICNlbmRpZiAvLyBfTVNDX1ZFUgogCiAjaWZuZGVmIF9XSU4zMgotI2Vycm9yIFRoaXMgaXMgYSBNU1ZDIGhlYWRlciBvbmx5LgorI2Vycm9yICJUaGlzIGlzIGEgV2luZG93cyBoZWFkZXIgb25seSIKICNlbmRpZgogCi0vLyB1c2Ugc3RkOjp0aHJlYWQgaW4gTVNWQzExICgyMDEyKSBvciBuZXdlcgotI2lmIF9NU0NfVkVSID49IDE3MDAKKy8vIHVzZSBzdGQ6OnRocmVhZCBpbiBNU1ZDMTEgKDIwMTIpIG9yIG5ld2VyIGFuZCBpbiBNaW5HVworI2lmIChfTVNDX1ZFUiA+PSAxNzAwKSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKQogI2RlZmluZSBVU0VfU1REX1RIUkVBRCAxCi0vLyBvdGhlcndpc2UgdXNlIGJvb3N0IHRocmVhZHMKLSNlbHNlCi0jZGVmaW5lIFVTRV9CT09TVF9USFJFQUQgMQorI2VuZGlmCisKKy8vIFNvbWV0aGluZyB0aGF0IGRlZmluZXMgUFJJZDY0IGlzIHJlcXVpcmVkIHRvIGJ1aWxkCisjZGVmaW5lIEhBVkVfSU5UVFlQRVNfSCAxCisKKy8vIFZTMjAxMCBvciBsYXRlciBoYXMgc3RkaW50LmggYXMgZG9lcyBNaW5HVworI2lmIChfTVNDX1ZFUiA+PSAxNjAwKSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKQorI2RlZmluZSBIQVZFX1NURElOVF9IIDEKICNlbmRpZgogCiAjaWZuZGVmIFRBUkdFVF9XSU5fWFAKQEAgLTU4LDEyICs2MywxNCBAQAogI2RlZmluZSBTSUdORURfUklHSFRfU0hJRlRfSVMgMQogI2VuZGlmCiAKKyNpZm5kZWYgX19NSU5HVzMyX18KICNwcmFnbWEgd2FybmluZyhkaXNhYmxlIDogNDk5NikgLy8gRGVwcmVjYXRlZCBwb3NpeCBuYW1lLgorI2VuZGlmCiAKLSNkZWZpbmUgVkVSU0lPTiAiMC45LjMiCiAjZGVmaW5lIEhBVkVfR0VUVElNRU9GREFZIDEKICNkZWZpbmUgSEFWRV9TWVNfU1RBVF9IIDEKIAorLy8gTXVzdCBiZSB1c2luZyBWUzIwMTAgb3IgbGF0ZXIsIG9yIGJvb3N0LCBzbyB0aGF0IEM5OSB0eXBlcyBhcmUgZGVmaW5lZCBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZQogI2lmZGVmIEhBVkVfU1RESU5UX0gKICNpbmNsdWRlIDxzdGRpbnQuaD4KICNlbHNlCkBAIC04OSwxMSArOTYsMTQgQEAKIC8vIHdpbmRvd3MKICNpbmNsdWRlIDxXaW5zb2NrMi5oPgogI2luY2x1ZGUgPHdzMnRjcGlwLmg+Ci0jaWZkZWYgX1dJTjMyX1dDRQotI3ByYWdtYSBjb21tZW50KGxpYiwgIldzMi5saWIiKQotI2Vsc2UKLSNwcmFnbWEgY29tbWVudChsaWIsICJXczJfMzIubGliIikKLSNwcmFnbWEgY29tbWVudChsaWIsICJhZHZhcGkzMi5saWIiKSAvLyBGb3Igc2VjdXJpdHkgQVBJcyBpbiBUUGlwZVNlcnZlcgotI3ByYWdtYSBjb21tZW50KGxpYiwgIlNobHdhcGkubGliIikgLy8gRm9yIFN0clN0cklBIGluIFRQaXBlU2VydmVyCi0jZW5kaWYKKyNpZm5kZWYgX19NSU5HVzMyX18KKyAgI2lmZGVmIF9XSU4zMl9XQ0UKKyAgI3ByYWdtYSBjb21tZW50KGxpYiwgIldzMi5saWIiKQorICAjZWxzZQorICAjcHJhZ21hIGNvbW1lbnQobGliLCAiV3MyXzMyLmxpYiIpCisgICNwcmFnbWEgY29tbWVudChsaWIsICJhZHZhcGkzMi5saWIiKSAvLyBGb3Igc2VjdXJpdHkgQVBJcyBpbiBUUGlwZVNlcnZlcgorICAjcHJhZ21hIGNvbW1lbnQobGliLCAiU2hsd2FwaS5saWIiKSAgLy8gRm9yIFN0clN0cklBIGluIFRQaXBlU2VydmVyCisgICNlbmRpZgorI2VuZGlmIC8vIF9fTUlOR1czMl9fCisKICNlbmRpZiAvLyBfVEhSSUZUX1dJTkRPV1NfQ09ORklHX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvQWxsUHJvdG9jb2xUZXN0cy50Y2MgYi9saWIvY3BwL3Rlc3QvQWxsUHJvdG9jb2xUZXN0cy50Y2MKaW5kZXggOGM4ZWFhOC4uYTdlYWIwNyAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L0FsbFByb3RvY29sVGVzdHMudGNjCisrKyBiL2xpYi9jcHAvdGVzdC9BbGxQcm90b2NvbFRlc3RzLnRjYwpAQCAtMjgsNyArMjgsNyBAQAogCiAjaW5jbHVkZSAiR2VuZXJpY0hlbHBlcnMuaCIKIAotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7CkBAIC0xOTAsMTQgKzE5MCwxNCBAQAogCiAgICAgdGVzdE5ha2VkPFRQcm90bywgaW50NjRfdD4oMCk7CiAgICAgZm9yIChpbnQ2NF90IGkgPSAwOyBpIDwgNjI7IGkrKykgewotICAgICAgdGVzdE5ha2VkPFRQcm90bywgaW50NjRfdD4oMUwgPDwgaSk7Ci0gICAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQ2NF90PigtKDFMIDw8IGkpKTsKKyAgICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDY0X3Q+KDFMTCA8PCBpKTsKKyAgICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDY0X3Q+KC0oMUxMIDw8IGkpKTsKICAgICB9CiAKICAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0k2NCwgaW50NjRfdD4oMCk7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2MjsgaSsrKSB7Ci0gICAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0k2NCwgaW50NjRfdD4oMUwgPDwgaSk7Ci0gICAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0k2NCwgaW50NjRfdD4oLSgxTCA8PCBpKSk7CisgICAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0k2NCwgaW50NjRfdD4oMUxMIDw8IGkpOworICAgICAgdGVzdEZpZWxkPFRQcm90bywgVF9JNjQsIGludDY0X3Q+KC0oMUxMIDw8IGkpKTsKICAgICB9CiAKICAgICB0ZXN0TmFrZWQ8VFByb3RvLCBkb3VibGU+KDEyMy40NTYpOwpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L0Fubm90YXRpb25UZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9Bbm5vdGF0aW9uVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUxODg0MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9Bbm5vdGF0aW9uVGVzdC5jcHAKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2RlZmluZSBCT09TVF9URVNUX01PRFVMRSBBbm5vdGF0aW9uVGVzdAorI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KKyNpbmNsdWRlICJnZW4tY3BwL0Fubm90YXRpb25UZXN0X3R5cGVzLmgiCisjaW5jbHVkZSA8b3N0cmVhbT4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCisvLyBOb3JtYWxseSB0aHJpZnQgZ2VuZXJhdGVzIG9zdHJlYW0gb3BlcmF0b3JzLCBob3dldmVyCisvLyB3aXRoIHRoZSBhbm5vdGF0aW9uICJjcHAuY3VzdG9tb3N0cmVhbSIgb25lIGNhbiB0ZWxsIHRoZQorLy8gY29tcGlsZXIgdGhleSBhcmUgZ29pbmcgdG8gcHJvdmlkZSB0aGVpciBvd24sIGFuZCBub3QKKy8vIGVtaXQgb3BlcmF0b3IgPDwgb3IgcHJpbnRUbygpLgorCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3Qgb3N0cl9jdXN0b20mIG9zYykKK3sKKyAgb3MgPDwgInsgYmFyID0gIiA8PCBvc2MuYmFyIDw8ICI7IH0iOworICByZXR1cm4gb3M7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURShCT09TVF9URVNUX01PRFVMRSkKKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9jcHBfY29tcGlsZXJfZ2VuZXJhdGVkX29zdHJlYW1fb3BlcmF0b3IpCit7CisgIG9zdHJfZGVmYXVsdCBkZWY7CisgIGRlZi5fX3NldF9iYXIoMTApOworCisgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzZDsKKyAgc3NkIDw8IGRlZjsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoc3NkLnN0cigpLCAib3N0cl9kZWZhdWx0KGJhcj0xMCkiKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9jcHBfY3VzdG9tb3N0cmVhbV91c2VzX2NvbnN1bWluZ19hcHBsaWNhdGlvbl9kZWZpbml0aW9uKQoreworICBvc3RyX2N1c3RvbSBjdXM7CisgIGN1cy5fX3NldF9iYXIoMTApOworCisgIHN0ZDo6c3RyaW5nc3RyZWFtIGNzZDsKKyAgY3NkIDw8IGN1czsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY3NkLnN0cigpLCAieyBiYXIgPSAxMDsgfSIpOworfQorCisvKioKKyAqIERpc2FibGVkOyBzZWUgVEhSSUZULTE1NjcgLSBub3Qgc3VyZSB3aGF0IGl0IGlzIHN1cHBvc2VkIHRvIGRvCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2NwcF90eXBlKSB7CisgIC8vIENoZWNrIHRoYXQgdGhlICJjcHAudHlwZSIgYW5ub3RhdGlvbiBjaGFuZ2VzICJzdHJ1Y3QgZm9vIiB0byAiRGVuc2VGb28iCisgIC8vIFRoaXMgd29uJ3QgY29tcGlsZSBpZiB0aGUgYW5ub3RhdGlvbiBpcyBtaXNoYW5kbGVkCisgIERlbnNlRm9vIGZvbzsKKyAgZm9vLl9fc2V0X2Jhcig1KTsKK30KKyAqLworCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9CYXNlNjRUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9CYXNlNjRUZXN0LmNwcAppbmRleCBlOWU4NmRkLi43Njg2ZTRlIDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvQmFzZTY0VGVzdC5jcHAKKysrIGIvbGliL2NwcC90ZXN0L0Jhc2U2NFRlc3QuY3BwCkBAIC0zNyw2ICszNywxMCBAQAogfQogCiB2b2lkIGNoZWNrRW5jb2RpbmcodWludDhfdCogZGF0YSwgaW50IGxlbikgeworI2lmZGVmIE5ERUJVRworICAoKHZvaWQpZGF0YSk7CisjZW5kaWYKKwogICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgQk9PU1RfQVNTRVJUKGlzYWxudW0oZGF0YVtpXSkgfHwgZGF0YVtpXSA9PSAnLycgfHwgZGF0YVtpXSA9PSAnKycpOwogICB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvQmVuY2htYXJrLmNwcCBiL2xpYi9jcHAvdGVzdC9CZW5jaG1hcmsuY3BwCmluZGV4IDY5ZTY0MTQuLjVmZjc3YWEgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9CZW5jaG1hcmsuY3BwCisrKyBiL2xpYi9jcHAvdGVzdC9CZW5jaG1hcmsuY3BwCkBAIC0yMyw4ICsyMyw5IEBACiAjaW5jbHVkZSA8aW9zdHJlYW0+CiAjZGVmaW5lIF9VU0VfTUFUSF9ERUZJTkVTCiAjaW5jbHVkZSA8bWF0aC5oPgotI2luY2x1ZGUgInRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSAidGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oIgorI2luY2x1ZGUgInRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaCIKICNpbmNsdWRlICJnZW4tY3BwL0RlYnVnUHJvdG9UZXN0X3R5cGVzLmgiCiAKICNpZmRlZiBIQVZFX1NZU19USU1FX0gKQEAgLTQ4LDExICs0OSwxMSBAQAogfTsKIAogaW50IG1haW4oKSB7Ci0gIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAgIHVzaW5nIG5hbWVzcGFjZSB0aHJpZnQ6OnRlc3Q6OmRlYnVnOwogICB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKICAgdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKLSAgdXNpbmcgbmFtZXNwYWNlIGJvb3N0OworICB1c2luZyBzdGQ6OmNvdXQ7CisgIHVzaW5nIHN0ZDo6ZW5kbDsKIAogICBPbmVPZkVhY2ggb29lOwogICBvb2UuaW1fdHJ1ZSA9IHRydWU7CkBAIC02Nyw3ICs2OCw3IEBACiAgIG9vZS5iYXNlNjQgPSAiXDFcMlwzXDI1NSI7CiAKICAgaW50IG51bSA9IDEwMDAwMDsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmKG5ldyBUTWVtb3J5QnVmZmVyKG51bSoxMDAwKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWYobmV3IFRNZW1vcnlCdWZmZXIobnVtKjEwMDApKTsKIAogICB1aW50OF90KiBkYXRhID0gTlVMTDsKICAgdWludDMyX3QgZGF0YXNpemUgPSAwOwpAQCAtODgsNyArODksNyBAQAogICBidWYtPmdldEJ1ZmZlcigmZGF0YSwgJmRhdGFzaXplKTsKIAogICB7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmMihuZXcgVE1lbW9yeUJ1ZmZlcihkYXRhLCBkYXRhc2l6ZSkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWYyKG5ldyBUTWVtb3J5QnVmZmVyKGRhdGEsIGRhdGFzaXplKSk7CiAgICAgVEJpbmFyeVByb3RvY29sVDxUTWVtb3J5QnVmZmVyPiBwcm90KGJ1ZjIpOwogICAgIE9uZU9mRWFjaCBvb2UyOwogICAgIGRvdWJsZSBlbGFwc2VkID0gMC4wOwpAQCAtMTE2LDcgKzExNyw3IEBACiAKICAgewogICAgIE9uZU9mRWFjaCBvb2UyOwotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZjIobmV3IFRNZW1vcnlCdWZmZXIoZGF0YSwgZGF0YXNpemUpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmMihuZXcgVE1lbW9yeUJ1ZmZlcihkYXRhLCBkYXRhc2l6ZSkpOwogICAgIFRCaW5hcnlQcm90b2NvbFQ8VE1lbW9yeUJ1ZmZlciwgVE5ldHdvcmtMaXR0bGVFbmRpYW4+IHByb3QoYnVmMik7CiAgICAgZG91YmxlIGVsYXBzZWQgPSAwLjA7CiAgICAgVGltZXIgdGltZXI7CkBAIC0xNDIsNyArMTQzLDcgQEAKICAgfQogCiAgIHsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWYyKG5ldyBUTWVtb3J5QnVmZmVyKGRhdGEsIGRhdGFzaXplKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZjIobmV3IFRNZW1vcnlCdWZmZXIoZGF0YSwgZGF0YXNpemUpKTsKICAgICBUQmluYXJ5UHJvdG9jb2xUPFRNZW1vcnlCdWZmZXI+IHByb3QoYnVmMik7CiAgICAgT25lT2ZFYWNoIG9vZTI7CiAgICAgZG91YmxlIGVsYXBzZWQgPSAwLjA7CkBAIC0xODEsNyArMTgyLDcgQEAKICAgYnVmLT5nZXRCdWZmZXIoJmRhdGEsICZkYXRhc2l6ZSk7CiAKICAgewotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZjIobmV3IFRNZW1vcnlCdWZmZXIoZGF0YSwgZGF0YXNpemUpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmMihuZXcgVE1lbW9yeUJ1ZmZlcihkYXRhLCBkYXRhc2l6ZSkpOwogICAgIFRCaW5hcnlQcm90b2NvbFQ8VE1lbW9yeUJ1ZmZlcj4gcHJvdChidWYyKTsKICAgICBMaXN0RG91YmxlUGVyZiBsaXN0RG91YmxlUGVyZjI7CiAgICAgZG91YmxlIGVsYXBzZWQgPSAwLjA7CkBAIC0yMDUsNyArMjA2LDcgQEAKIAogICB7CiAgICAgTGlzdERvdWJsZVBlcmYgbGlzdERvdWJsZVBlcmYyOwotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZjIobmV3IFRNZW1vcnlCdWZmZXIoZGF0YSwgZGF0YXNpemUpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmMihuZXcgVE1lbW9yeUJ1ZmZlcihkYXRhLCBkYXRhc2l6ZSkpOwogICAgIFRCaW5hcnlQcm90b2NvbFQ8VE1lbW9yeUJ1ZmZlciwgVE5ldHdvcmtMaXR0bGVFbmRpYW4+IHByb3QoYnVmMik7CiAgICAgZG91YmxlIGVsYXBzZWQgPSAwLjA7CiAgICAgVGltZXIgdGltZXI7CkBAIC0yMjcsNyArMjI4LDcgQEAKICAgfQogCiAgIHsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWYyKG5ldyBUTWVtb3J5QnVmZmVyKGRhdGEsIGRhdGFzaXplKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZjIobmV3IFRNZW1vcnlCdWZmZXIoZGF0YSwgZGF0YXNpemUpKTsKICAgICBUQmluYXJ5UHJvdG9jb2xUPFRNZW1vcnlCdWZmZXI+IHByb3QoYnVmMik7CiAgICAgTGlzdERvdWJsZVBlcmYgbGlzdERvdWJsZVBlcmYyOwogICAgIGRvdWJsZSBlbGFwc2VkID0gMC4wOwpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L0NNYWtlTGlzdHMudHh0IGIvbGliL2NwcC90ZXN0L0NNYWtlTGlzdHMudHh0CmluZGV4IDVkZTlmYzQuLjgyZDQ3YTYgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9DTWFrZUxpc3RzLnR4dAorKysgYi9saWIvY3BwL3Rlc3QvQ01ha2VMaXN0cy50eHQKQEAgLTE3LDE2ICsxNywxOSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotIyBGaW5kIHJlcXVpcmVkIHBhY2thZ2VzCi1zZXQoQm9vc3RfVVNFX1NUQVRJQ19MSUJTIE9OKSAjIEZvcmNlIHRoZSB1c2Ugb2Ygc3RhdGljIGJvb3N0IHRlc3QgZnJhbWV3b3JrCi1maW5kX3BhY2thZ2UoQm9vc3QgMS41My4wIFJFUVVJUkVEIENPTVBPTkVOVFMgY2hyb25vIGZpbGVzeXN0ZW0gc3lzdGVtIHRocmVhZCB1bml0X3Rlc3RfZnJhbWV3b3JrKQogaW5jbHVkZV9kaXJlY3RvcmllcyhTWVNURU0gIiR7Qm9vc3RfSU5DTFVERV9ESVJTfSIpCiAKLSNNYWtlIHN1cmUgZ2VuLWNwcCBmaWxlcyBjYW4gYmUgaW5jbHVkZWQKK2lmIChXSVRIX0RZTl9MSU5LX1RFU1QpCisgICAgYWRkX2RlZmluaXRpb25zKCAtREJPT1NUX1RFU1RfRFlOX0xJTksgKQorZW5kaWYoKQorCisjIE1ha2Ugc3VyZSBnZW4tY3BwIGZpbGVzIGNhbiBiZSBpbmNsdWRlZAogaW5jbHVkZV9kaXJlY3RvcmllcygiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9IikKIAogIyBDcmVhdGUgdGhlIHRocmlmdCBDKysgdGVzdCBsaWJyYXJ5CiBzZXQodGVzdGdlbmNwcF9TT1VSQ0VTCisgICAgZ2VuLWNwcC9Bbm5vdGF0aW9uVGVzdF90eXBlcy5jcHAKKyAgICBnZW4tY3BwL0Fubm90YXRpb25UZXN0X3R5cGVzLmgKICAgICBnZW4tY3BwL0RlYnVnUHJvdG9UZXN0X3R5cGVzLmNwcAogICAgIGdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuaAogICAgIGdlbi1jcHAvRW51bVRlc3RfdHlwZXMuY3BwCkBAIC0zNyw2ICs0MCwxMCBAQAogICAgIGdlbi1jcHAvUmVjdXJzaXZlX3R5cGVzLmgKICAgICBnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuY3BwCiAgICAgZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmgKKyAgICBnZW4tY3BwL09uZVdheVRlc3RfdHlwZXMuY3BwCisgICAgZ2VuLWNwcC9PbmVXYXlUZXN0X3R5cGVzLmgKKyAgICBnZW4tY3BwL09uZVdheVNlcnZpY2UuY3BwCisgICAgZ2VuLWNwcC9PbmVXYXlTZXJ2aWNlLmgKICAgICBnZW4tY3BwL1R5cGVkZWZUZXN0X3R5cGVzLmNwcAogICAgIGdlbi1jcHAvVHlwZWRlZlRlc3RfdHlwZXMuaAogICAgIFRocmlmdFRlc3RfZXh0cmFzLmNwcApAQCAtNTcsMTQgKzY0LDE1IEBACiApCiBhZGRfbGlicmFyeSh0ZXN0Z2VuY3BwX2NvYiBTVEFUSUMgJHt0ZXN0Z2VuY3BwX2NvYl9TT1VSQ0VTfSkKIAotCiBhZGRfZXhlY3V0YWJsZShCZW5jaG1hcmsgQmVuY2htYXJrLmNwcCkKIHRhcmdldF9saW5rX2xpYnJhcmllcyhCZW5jaG1hcmsgdGVzdGdlbmNwcCkKIExJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShCZW5jaG1hcmsgdGhyaWZ0KQogYWRkX3Rlc3QoTkFNRSBCZW5jaG1hcmsgQ09NTUFORCBCZW5jaG1hcmspCit0YXJnZXRfbGlua19saWJyYXJpZXMoQmVuY2htYXJrIHRlc3RnZW5jcHApCiAKIHNldChVbml0VGVzdF9TT1VSQ0VTCiAgICAgVW5pdFRlc3RNYWluLmNwcAorICAgIE9uZVdheUhUVFBUZXN0LmNwcAogICAgIFRNZW1vcnlCdWZmZXJUZXN0LmNwcAogICAgIFRCdWZmZXJCYXNlVGVzdC5jcHAKICAgICBCYXNlNjRUZXN0LmNwcApAQCAtNzQsOCArODIsOSBAQAogICAgIFRTZXJ2ZXJUcmFuc3BvcnRUZXN0LmNwcAogKQogCi1pZihOT1QgV0lUSF9CT09TVFRIUkVBRFMgQU5EIE5PVCBXSVRIX1NURFRIUkVBRFMgQU5EIE5PVCBNU1ZDKQotICAgIGxpc3QoQVBQRU5EIFVuaXRUZXN0X1NPVVJDRVMgUldNdXRleFN0YXJ2ZVRlc3QuY3BwKQoraWYoTk9UIFdJVEhfU1REVEhSRUFEUyBBTkQgTk9UIE1TVkMgQU5EIE5PVCBNSU5HVykKKyAgICBsaXN0KEFQUEVORCBVbml0VGVzdF9TT1VSQ0VTIGNvbmN1cnJlbmN5L011dGV4VGVzdC5jcHApCisgICAgbGlzdChBUFBFTkQgVW5pdFRlc3RfU09VUkNFUyBjb25jdXJyZW5jeS9SV011dGV4U3RhcnZlVGVzdC5jcHApCiBlbmRpZigpCiAKIGFkZF9leGVjdXRhYmxlKFVuaXRUZXN0cyAke1VuaXRUZXN0X1NPVVJDRVN9KQpAQCAtODksNyArOTgsMTAgQEAKIGVuZGlmICggTVNWQyApCiAKIAotc2V0KCBUSW50ZXJydXB0VGVzdF9TT1VSQ0VTIFRTb2NrZXRJbnRlcnJ1cHRUZXN0LmNwcCApCitzZXQoIFRJbnRlcnJ1cHRUZXN0X1NPVVJDRVMKKyAgICAgVFNvY2tldEludGVycnVwdFRlc3QuY3BwCisgICAgIFRTU0xTb2NrZXRJbnRlcnJ1cHRUZXN0LmNwcAorKQogaWYgKFdJTjMyKQogICAgIGxpc3QoQVBQRU5EIFRJbnRlcnJ1cHRUZXN0X1NPVVJDRVMKICAgICAgICAgVFBpcGVJbnRlcnJ1cHRUZXN0LmNwcApAQCAtMTAxLDEwICsxMTMsMTAgQEAKICAgICAke0Jvb3N0X0xJQlJBUklFU30KICkKIExJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUSW50ZXJydXB0VGVzdCB0aHJpZnQpCi1pZiAoTk9UIE1TVkMgQU5EIE5PVCAke0NNQUtFX1NZU1RFTV9OQU1FfSBNQVRDSEVTICJEYXJ3aW4iKQoraWYgKE5PVCBNU1ZDIEFORCBOT1QgJHtDTUFLRV9TWVNURU1fTkFNRX0gTUFUQ0hFUyAiRGFyd2luIiBBTkQgTk9UIE1JTkdXKQogdGFyZ2V0X2xpbmtfbGlicmFyaWVzKFRJbnRlcnJ1cHRUZXN0IC1scnQpCiBlbmRpZiAoKQotYWRkX3Rlc3QoTkFNRSBUSW50ZXJydXB0VGVzdCBDT01NQU5EIFRJbnRlcnJ1cHRUZXN0KQorYWRkX3Rlc3QoTkFNRSBUSW50ZXJydXB0VGVzdCBDT01NQU5EIFRJbnRlcnJ1cHRUZXN0IC0tICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vLi4vLi4vLi4vdGVzdC9rZXlzIikKIAogYWRkX2V4ZWN1dGFibGUoVFNlcnZlckludGVncmF0aW9uVGVzdCBUU2VydmVySW50ZWdyYXRpb25UZXN0LmNwcCkKIHRhcmdldF9saW5rX2xpYnJhcmllcyhUU2VydmVySW50ZWdyYXRpb25UZXN0CkBAIC0xMTIsMTIgKzEyNCwxMyBAQAogICAgICR7Qm9vc3RfTElCUkFSSUVTfQogKQogTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3QgdGhyaWZ0KQotaWYgKE5PVCBNU1ZDIEFORCBOT1QgJHtDTUFLRV9TWVNURU1fTkFNRX0gTUFUQ0hFUyAiRGFyd2luIikKK2lmIChOT1QgTVNWQyBBTkQgTk9UICR7Q01BS0VfU1lTVEVNX05BTUV9IE1BVENIRVMgIkRhcndpbiIgQU5EIE5PVCBNSU5HVykKIHRhcmdldF9saW5rX2xpYnJhcmllcyhUU2VydmVySW50ZWdyYXRpb25UZXN0IC1scnQpCiBlbmRpZiAoKQogYWRkX3Rlc3QoTkFNRSBUU2VydmVySW50ZWdyYXRpb25UZXN0IENPTU1BTkQgVFNlcnZlckludGVncmF0aW9uVGVzdCkKIAogaWYoV0lUSF9aTElCKQoraW5jbHVkZV9kaXJlY3RvcmllcyhTWVNURU0gIiR7WkxJQl9JTkNMVURFX0RJUlN9IikKIGFkZF9leGVjdXRhYmxlKFRyYW5zcG9ydFRlc3QgVHJhbnNwb3J0VGVzdC5jcHApCiB0YXJnZXRfbGlua19saWJyYXJpZXMoVHJhbnNwb3J0VGVzdAogICAgIHRlc3RnZW5jcHAKQEAgLTEzOSw2ICsxNTIsMTMgQEAKIGFkZF90ZXN0KE5BTUUgWmxpYlRlc3QgQ09NTUFORCBabGliVGVzdCkKIGVuZGlmKFdJVEhfWkxJQikKIAorYWRkX2V4ZWN1dGFibGUoQW5ub3RhdGlvblRlc3QgQW5ub3RhdGlvblRlc3QuY3BwKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKEFubm90YXRpb25UZXN0CisgICAgdGVzdGdlbmNwcAorICAgICR7Qm9vc3RfTElCUkFSSUVTfQorKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKEFubm90YXRpb25UZXN0IHRocmlmdCkKK2FkZF90ZXN0KE5BTUUgQW5ub3RhdGlvblRlc3QgQ09NTUFORCBBbm5vdGF0aW9uVGVzdCkKIAogYWRkX2V4ZWN1dGFibGUoRW51bVRlc3QgRW51bVRlc3QuY3BwKQogdGFyZ2V0X2xpbmtfbGlicmFyaWVzKEVudW1UZXN0CkBAIC0yNDksNiArMjY5LDcgQEAKIGFkZF9leGVjdXRhYmxlKGxpbmtfdGVzdCAke2xpbmtfdGVzdF9TT1VSQ0VTfSkKIHRhcmdldF9saW5rX2xpYnJhcmllcyhsaW5rX3Rlc3QgdGVzdGdlbmNwcF9jb2IpCiBMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkobGlua190ZXN0IHRocmlmdCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhsaW5rX3Rlc3QgdGVzdGdlbmNwcCkKIGFkZF90ZXN0KE5BTUUgbGlua190ZXN0IENPTU1BTkQgbGlua190ZXN0KQogCiBpZihXSVRIX0xJQkVWRU5UKQpAQCAtMjgwLDcgKzMwMSwyMSBAQAogTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFROb25ibG9ja2luZ1NlcnZlclRlc3QgdGhyaWZ0KQogTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFROb25ibG9ja2luZ1NlcnZlclRlc3QgdGhyaWZ0bmIpCiBhZGRfdGVzdChOQU1FIFROb25ibG9ja2luZ1NlcnZlclRlc3QgQ09NTUFORCBUTm9uYmxvY2tpbmdTZXJ2ZXJUZXN0KQotZW5kaWYoKQorCitpZihPUEVOU1NMX0ZPVU5EIEFORCBXSVRIX09QRU5TU0wpCisgIHNldChUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0X1NPVVJDRVMgVE5vbmJsb2NraW5nU1NMU2VydmVyVGVzdC5jcHApCisgIGFkZF9leGVjdXRhYmxlKFROb25ibG9ja2luZ1NTTFNlcnZlclRlc3QgJHtUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0X1NPVVJDRVN9KQorICBpbmNsdWRlX2RpcmVjdG9yaWVzKCR7TElCRVZFTlRfSU5DTFVERV9ESVJTfSkKKyAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKFROb25ibG9ja2luZ1NTTFNlcnZlclRlc3QKKyAgICB0ZXN0Z2VuY3BwX2NvYgorICAgICR7TElCRVZFTlRfTElCUkFSSUVTfQorICAgICR7Qm9vc3RfTElCUkFSSUVTfQorICApCisgIExJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0IHRocmlmdCkKKyAgTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFROb25ibG9ja2luZ1NTTFNlcnZlclRlc3QgdGhyaWZ0bmIpCisgIGFkZF90ZXN0KE5BTUUgVE5vbmJsb2NraW5nU1NMU2VydmVyVGVzdCBDT01NQU5EIFROb25ibG9ja2luZ1NTTFNlcnZlclRlc3QgLS0gIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS8uLi8uLi8uLi90ZXN0L2tleXMiKQorZW5kaWYoT1BFTlNTTF9GT1VORCBBTkQgV0lUSF9PUEVOU1NMKQorZW5kaWYoV0lUSF9MSUJFVkVOVCkKIAogaWYoT1BFTlNTTF9GT1VORCBBTkQgV0lUSF9PUEVOU1NMKQogYWRkX2V4ZWN1dGFibGUoT3BlblNTTE1hbnVhbEluaXRUZXN0IE9wZW5TU0xNYW51YWxJbml0VGVzdC5jcHApCkBAIC0yOTcsMTAgKzMzMiwxMCBAQAogICAgICR7Qm9vc3RfTElCUkFSSUVTfQogKQogTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFNlY3VyaXR5VGVzdCB0aHJpZnQpCi1pZiAoTk9UIE1TVkMgQU5EIE5PVCAke0NNQUtFX1NZU1RFTV9OQU1FfSBNQVRDSEVTICJEYXJ3aW4iKQoraWYgKE5PVCBNU1ZDIEFORCBOT1QgJHtDTUFLRV9TWVNURU1fTkFNRX0gTUFUQ0hFUyAiRGFyd2luIiBBTkQgTk9UIE1JTkdXKQogdGFyZ2V0X2xpbmtfbGlicmFyaWVzKFNlY3VyaXR5VGVzdCAtbHJ0KQogZW5kaWYgKCkKLWFkZF90ZXN0KE5BTUUgU2VjdXJpdHlUZXN0IENPTU1BTkQgU2VjdXJpdHlUZXN0ICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vLi4vLi4vLi4vdGVzdC9rZXlzIikKK2FkZF90ZXN0KE5BTUUgU2VjdXJpdHlUZXN0IENPTU1BTkQgU2VjdXJpdHlUZXN0IC0tICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vLi4vLi4vLi4vdGVzdC9rZXlzIikKIAogZW5kaWYoKQogCkBAIC0zMjQsMzUgKzM1OSw0NyBAQAogIyBDb21tb24gdGhyaWZ0IGNvZGUgZ2VuZXJhdGlvbiBydWxlcwogIwogCithZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUIGdlbi1jcHAvQW5ub3RhdGlvblRlc3RfY29uc3RhbnRzLmNwcAorICAgICAgICAgICAgICAgICAgICAgICAgICBnZW4tY3BwL0Fubm90YXRpb25UZXN0X2NvbnN0YW50cy5oCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbi1jcHAvQW5ub3RhdGlvblRlc3RfdHlwZXMuY3BwCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbi1jcHAvQW5ub3RhdGlvblRlc3RfdHlwZXMuaAorICAgICAgICAgICAgICAgICAgICAgICAgICBnZW4tY3BwL2Zvb19zZXJ2aWNlLmNwcAorICAgICAgICAgICAgICAgICAgICAgICAgICBnZW4tY3BwL2Zvb19zZXJ2aWNlLmgKKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBjcHAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvQW5ub3RhdGlvblRlc3QudGhyaWZ0CispCiAKLWFkZF9jdXN0b21fY29tbWFuZChPVVRQVVQgZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5jcHAgZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5oIGdlbi1jcHAvRW1wdHlTZXJ2aWNlLmNwcCAgZ2VuLWNwcC9FbXB0eVNlcnZpY2UuaAotICAgIENPTU1BTkQgdGhyaWZ0LWNvbXBpbGVyIC0tZ2VuIGNwcCAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQKK2FkZF9jdXN0b21fY29tbWFuZChPVVRQVVQgZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5jcHAgZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5oIGdlbi1jcHAvRW1wdHlTZXJ2aWNlLmNwcCBnZW4tY3BwL0VtcHR5U2VydmljZS5oCisgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gY3BwICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L0RlYnVnUHJvdG9UZXN0LnRocmlmdAogKQogCiBhZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUIGdlbi1jcHAvRW51bVRlc3RfdHlwZXMuY3BwIGdlbi1jcHAvRW51bVRlc3RfdHlwZXMuaAotICAgIENPTU1BTkQgdGhyaWZ0LWNvbXBpbGVyIC0tZ2VuIGNwcCAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9FbnVtVGVzdC50aHJpZnQKKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBjcHAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvRW51bVRlc3QudGhyaWZ0CiApCiAKIGFkZF9jdXN0b21fY29tbWFuZChPVVRQVVQgZ2VuLWNwcC9UeXBlZGVmVGVzdF90eXBlcy5jcHAgZ2VuLWNwcC9UeXBlZGVmVGVzdF90eXBlcy5oCi0gICAgQ09NTUFORCB0aHJpZnQtY29tcGlsZXIgLS1nZW4gY3BwICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L1R5cGVkZWZUZXN0LnRocmlmdAorICAgIENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGNwcCAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9UeXBlZGVmVGVzdC50aHJpZnQKICkKIAogYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVCBnZW4tY3BwL09wdGlvbmFsUmVxdWlyZWRUZXN0X3R5cGVzLmNwcCBnZW4tY3BwL09wdGlvbmFsUmVxdWlyZWRUZXN0X3R5cGVzLmgKLSAgICBDT01NQU5EIHRocmlmdC1jb21waWxlciAtLWdlbiBjcHAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvT3B0aW9uYWxSZXF1aXJlZFRlc3QudGhyaWZ0CisgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gY3BwICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L09wdGlvbmFsUmVxdWlyZWRUZXN0LnRocmlmdAogKQogCiBhZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUIGdlbi1jcHAvUmVjdXJzaXZlX3R5cGVzLmNwcCBnZW4tY3BwL1JlY3Vyc2l2ZV90eXBlcy5oCi0gICAgQ09NTUFORCB0aHJpZnQtY29tcGlsZXIgLS1nZW4gY3BwICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L1JlY3Vyc2l2ZS50aHJpZnQKKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBjcHAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvUmVjdXJzaXZlLnRocmlmdAogKQogCiBhZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUIGdlbi1jcHAvU2VydmljZS5jcHAgZ2VuLWNwcC9TdHJlc3NUZXN0X3R5cGVzLmNwcAotICAgIENPTU1BTkQgdGhyaWZ0LWNvbXBpbGVyIC0tZ2VuIGNwcCAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9TdHJlc3NUZXN0LnRocmlmdAorICAgIENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGNwcCAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9TdHJlc3NUZXN0LnRocmlmdAogKQogCiBhZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUIGdlbi1jcHAvU2Vjb25kU2VydmljZS5jcHAgZ2VuLWNwcC9UaHJpZnRUZXN0X2NvbnN0YW50cy5jcHAgZ2VuLWNwcC9UaHJpZnRUZXN0LmNwcCBnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuY3BwIGdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5oCi0gICAgQ09NTUFORCB0aHJpZnQtY29tcGlsZXIgLS1nZW4gY3BwICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CisgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gY3BwICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CispCisKK2FkZF9jdXN0b21fY29tbWFuZChPVVRQVVQgZ2VuLWNwcC9PbmVXYXlTZXJ2aWNlLmNwcCBnZW4tY3BwL09uZVdheVRlc3RfY29uc3RhbnRzLmNwcCBnZW4tY3BwL09uZVdheVRlc3RfdHlwZXMuaCBnZW4tY3BwL09uZVdheVNlcnZpY2UuaCBnZW4tY3BwL09uZVdheVRlc3RfY29uc3RhbnRzLmggZ2VuLWNwcC9PbmVXYXlUZXN0X3R5cGVzLmNwcAorICAgIENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGNwcCAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vT25lV2F5VGVzdC50aHJpZnQKICkKIAogYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVCBnZW4tY3BwL0NoaWxkU2VydmljZS5jcHAgZ2VuLWNwcC9DaGlsZFNlcnZpY2UuaCBnZW4tY3BwL1BhcmVudFNlcnZpY2UuY3BwIGdlbi1jcHAvUGFyZW50U2VydmljZS5oIGdlbi1jcHAvcHJvY190eXBlcy5jcHAgZ2VuLWNwcC9wcm9jX3R5cGVzLmgKLSAgICBDT01NQU5EIHRocmlmdC1jb21waWxlciAtLWdlbiBjcHA6dGVtcGxhdGVzLGNvYl9zdHlsZSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vcHJvY2Vzc29yL3Byb2MudGhyaWZ0CisgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gY3BwOnRlbXBsYXRlcyxjb2Jfc3R5bGUgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3Byb2Nlc3Nvci9wcm9jLnRocmlmdAogKQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L0RlYnVnUHJvdG9UZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9EZWJ1Z1Byb3RvVGVzdC5jcHAKaW5kZXggNjA3NzQ0Yi4uMDYwZjM1NCAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L0RlYnVnUHJvdG9UZXN0LmNwcAorKysgYi9saWIvY3BwL3Rlc3QvRGVidWdQcm90b1Rlc3QuY3BwCkBAIC0yMSwxMyArMjEsMTQgQEAKICNpbmNsdWRlIDxjbWF0aD4KICNpbmNsdWRlICJnZW4tY3BwL0RlYnVnUHJvdG9UZXN0X3R5cGVzLmgiCiAjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmg+CisjaW5jbHVkZSA8bWVtb3J5PgogCiAjZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIERlYnVnUHJvdG9UZXN0CiAjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgogCiB1c2luZyBuYW1lc3BhY2UgdGhyaWZ0Ojp0ZXN0OjpkZWJ1ZzsKIAotc3RhdGljIHN0ZDo6YXV0b19wdHI8T25lT2ZFYWNoPiBvb2U7CitzdGF0aWMgOjpzdGQ6OnNoYXJlZF9wdHI8T25lT2ZFYWNoPiBvb2U7CiAKIHZvaWQgdGVzdENhc2VTZXR1cF8xKCkgewogICBvb2UucmVzZXQobmV3IE9uZU9mRWFjaCk7CkBAIC04MCw3ICs4MSw3IEBACiAgICAgIkV4cGVjdGVkOlxuIiA8PCBleHBlY3RlZF9yZXN1bHQgPDwgIlxuR290dGVuOlxuIiA8PCByZXN1bHQpOwogfQogCi1zdGF0aWMgc3RkOjphdXRvX3B0cjxOZXN0aW5nPiBuOworc3RhdGljIDo6c3RkOjpzaGFyZWRfcHRyPE5lc3Rpbmc+IG47CiAKIHZvaWQgdGVzdENhc2VTZXR1cF8yKCkgewogICB0ZXN0Q2FzZVNldHVwXzEoKTsKQEAgLTE0OCw3ICsxNDksNyBAQAogICAgICJFeHBlY3RlZDpcbiIgPDwgZXhwZWN0ZWRfcmVzdWx0IDw8ICJcbkdvdHRlbjpcbiIgPDwgcmVzdWx0KTsKIH0KIAotc3RhdGljIHN0ZDo6YXV0b19wdHI8SG9seU1vbGV5PiBobTsKK3N0YXRpYyA6OnN0ZDo6c2hhcmVkX3B0cjxIb2x5TW9sZXk+IGhtOwogCiB2b2lkIHRlc3RDYXNlU2V0dXBfMygpIHsKICAgdGVzdENhc2VTZXR1cF8yKCk7CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvRW51bVRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L0VudW1UZXN0LmNwcAppbmRleCAwZTM0YjE2Li5jOTM1YmM0IDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvRW51bVRlc3QuY3BwCisrKyBiL2xpYi9jcHAvdGVzdC9FbnVtVGVzdC5jcHAKQEAgLTIwLDkgKzIwLDE1IEBACiAjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgogI2luY2x1ZGUgImdlbi1jcHAvRW51bVRlc3RfdHlwZXMuaCIKIAorc3RkOjpvc3RyZWFtJiBvcGVyYXRvciA8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBNeUVudW1XaXRoQ3VzdG9tT3N0cmVhbTo6dHlwZSYgdmFsKQoreworICBvcyA8PCAieyIgPDwgKGludCl2YWwgPDwgIjpDVVNUT00hIiA8PCAifSI7CisgIHJldHVybiBvczsKK30KKwogQk9PU1RfQVVUT19URVNUX1NVSVRFKEVudW1UZXN0KQogCi1CT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2VudW0pIHsKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfZW51bV92YWx1ZSkgewogICAvLyBDaGVjayB0aGF0IGFsbCB0aGUgZW51bSB2YWx1ZXMgbWF0Y2ggd2hhdCB3ZSBleHBlY3QKICAgQk9PU1RfQ0hFQ0tfRVFVQUwoTXlFbnVtMTo6TUUxXzAsIDApOwogICBCT09TVF9DSEVDS19FUVVBTChNeUVudW0xOjpNRTFfMSwgMSk7CkBAIC00Nyw5ICs1MywzNCBAQAogICBCT09TVF9DSEVDS19FUVVBTChNeUVudW00OjpNRTRfQSwgMHg3ZmZmZmZmZCk7CiAgIEJPT1NUX0NIRUNLX0VRVUFMKE15RW51bTQ6Ok1FNF9CLCAweDdmZmZmZmZlKTsKICAgQk9PU1RfQ0hFQ0tfRVFVQUwoTXlFbnVtNDo6TUU0X0MsIDB4N2ZmZmZmZmYpOworCisgIEJPT1NUX0NIRUNLX0VRVUFMKE15RW51bTU6OmUxLCAwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoTXlFbnVtNTo6ZTIsIDQyKTsKIH0KIAotQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9lbnVtX2NvbnN0YW50KSB7Cit0ZW1wbGF0ZSA8Y2xhc3MgX1Q+CitzdGQ6OnN0cmluZyBFbnVtVG9TdHJpbmcoX1QgZSkKK3sKKyAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgIHNzIDw8IGU7CisgIHJldHVybiBzcy5zdHIoKTsKK30KKworCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2VudW1fb3N0cmVhbSkKK3sKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoRW51bVRvU3RyaW5nKE15RW51bTE6Ok1FMV8wKSwgIk1FMV8wIik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKEVudW1Ub1N0cmluZyhNeUVudW01OjplMiksICJlMiIpOworICBCT09TVF9DSEVDS19FUVVBTChFbnVtVG9TdHJpbmcoTXlFbnVtMzo6TUUzX04xKSwgIk1FM19OMSIpOworICBCT09TVF9DSEVDS19FUVVBTChFbnVtVG9TdHJpbmcoTXlFbnVtV2l0aEN1c3RvbU9zdHJlYW06OkN1c3RvTTIpLCAiezI6Q1VTVE9NIX0iKTsKKworICAvLyBzb21lIGludmFsaWQgb3IgdW5rbm93biB2YWx1ZQorICBNeUVudW01Ojp0eXBlIHV1dCA9IChNeUVudW01Ojp0eXBlKTQ0OworICBCT09TVF9DSEVDS19FUVVBTChFbnVtVG9TdHJpbmcodXV0KSwgIjQ0Iik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfZW51bV9jb25zdGFudCkKK3sKICAgTXlTdHJ1Y3QgbXM7CiAgIEJPT1NUX0NIRUNLX0VRVUFMKG1zLm1lMl8yLCAyKTsKICAgQk9PU1RfQ0hFQ0tfRVFVQUwobXMubWUzX24yLCAtMik7CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvR2VuZXJpY0hlbHBlcnMuaCBiL2xpYi9jcHAvdGVzdC9HZW5lcmljSGVscGVycy5oCmluZGV4IGMxNzU1NjEuLmJjZWY5ZjIgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9HZW5lcmljSGVscGVycy5oCisrKyBiL2xpYi9jcHAvdGVzdC9HZW5lcmljSGVscGVycy5oCkBAIC0yMCwxMyArMjAsMTAgQEAKICNpZm5kZWYgX1RIUklGVF9URVNUX0dFTkVSSUNIRUxQRVJTX0hfCiAjZGVmaW5lIF9USFJJRlRfVEVTVF9HRU5FUklDSEVMUEVSU19IXyAxCiAKLSNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8dGhyaWZ0L1RocmlmdC5oPgogCi11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7Ci0KIC8qIENsYXNzTmFtZSBIZWxwZXIgZm9yIGNsZWFuZXIgZXhjZXB0aW9ucyAqLwogY2xhc3MgQ2xhc3NOYW1lcyB7CiBwdWJsaWM6CkBAIC02Niw0MyArNjMsNDMgQEAKIHB1YmxpYzoKICAgLyogV3JpdGUgZnVuY3Rpb25zICovCiAKLSAgc3RhdGljIHVpbnQzMl90IHdyaXRlKHNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90bywgY29uc3QgaW50OF90JiB2YWwpIHsKKyAgc3RhdGljIHVpbnQzMl90IHdyaXRlKHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcHJvdG8sIGNvbnN0IGludDhfdCYgdmFsKSB7CiAgICAgcmV0dXJuIHByb3RvLT53cml0ZUJ5dGUodmFsKTsKICAgfQogCi0gIHN0YXRpYyB1aW50MzJfdCB3cml0ZShzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG8sIGNvbnN0IGludDE2X3QmIHZhbCkgeworICBzdGF0aWMgdWludDMyX3Qgd3JpdGUoc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwcm90bywgY29uc3QgaW50MTZfdCYgdmFsKSB7CiAgICAgcmV0dXJuIHByb3RvLT53cml0ZUkxNih2YWwpOwogICB9CiAKLSAgc3RhdGljIHVpbnQzMl90IHdyaXRlKHNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90bywgY29uc3QgaW50MzJfdCYgdmFsKSB7CisgIHN0YXRpYyB1aW50MzJfdCB3cml0ZShzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHByb3RvLCBjb25zdCBpbnQzMl90JiB2YWwpIHsKICAgICByZXR1cm4gcHJvdG8tPndyaXRlSTMyKHZhbCk7CiAgIH0KIAotICBzdGF0aWMgdWludDMyX3Qgd3JpdGUoc2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvLCBjb25zdCBkb3VibGUmIHZhbCkgeworICBzdGF0aWMgdWludDMyX3Qgd3JpdGUoc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwcm90bywgY29uc3QgZG91YmxlJiB2YWwpIHsKICAgICByZXR1cm4gcHJvdG8tPndyaXRlRG91YmxlKHZhbCk7CiAgIH0KIAotICBzdGF0aWMgdWludDMyX3Qgd3JpdGUoc2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvLCBjb25zdCBpbnQ2NF90JiB2YWwpIHsKKyAgc3RhdGljIHVpbnQzMl90IHdyaXRlKHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcHJvdG8sIGNvbnN0IGludDY0X3QmIHZhbCkgewogICAgIHJldHVybiBwcm90by0+d3JpdGVJNjQodmFsKTsKICAgfQogCi0gIHN0YXRpYyB1aW50MzJfdCB3cml0ZShzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG8sIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWwpIHsKKyAgc3RhdGljIHVpbnQzMl90IHdyaXRlKHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcHJvdG8sIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWwpIHsKICAgICByZXR1cm4gcHJvdG8tPndyaXRlU3RyaW5nKHZhbCk7CiAgIH0KIAogICAvKiBSZWFkIGZ1bmN0aW9ucyAqLwogCi0gIHN0YXRpYyB1aW50MzJfdCByZWFkKHNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90bywgaW50OF90JiB2YWwpIHsgcmV0dXJuIHByb3RvLT5yZWFkQnl0ZSh2YWwpOyB9CisgIHN0YXRpYyB1aW50MzJfdCByZWFkKHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcHJvdG8sIGludDhfdCYgdmFsKSB7IHJldHVybiBwcm90by0+cmVhZEJ5dGUodmFsKTsgfQogCi0gIHN0YXRpYyB1aW50MzJfdCByZWFkKHNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90bywgaW50MTZfdCYgdmFsKSB7IHJldHVybiBwcm90by0+cmVhZEkxNih2YWwpOyB9CisgIHN0YXRpYyB1aW50MzJfdCByZWFkKHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcHJvdG8sIGludDE2X3QmIHZhbCkgeyByZXR1cm4gcHJvdG8tPnJlYWRJMTYodmFsKTsgfQogCi0gIHN0YXRpYyB1aW50MzJfdCByZWFkKHNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90bywgaW50MzJfdCYgdmFsKSB7IHJldHVybiBwcm90by0+cmVhZEkzMih2YWwpOyB9CisgIHN0YXRpYyB1aW50MzJfdCByZWFkKHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcHJvdG8sIGludDMyX3QmIHZhbCkgeyByZXR1cm4gcHJvdG8tPnJlYWRJMzIodmFsKTsgfQogCi0gIHN0YXRpYyB1aW50MzJfdCByZWFkKHNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90bywgaW50NjRfdCYgdmFsKSB7IHJldHVybiBwcm90by0+cmVhZEk2NCh2YWwpOyB9CisgIHN0YXRpYyB1aW50MzJfdCByZWFkKHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcHJvdG8sIGludDY0X3QmIHZhbCkgeyByZXR1cm4gcHJvdG8tPnJlYWRJNjQodmFsKTsgfQogCi0gIHN0YXRpYyB1aW50MzJfdCByZWFkKHNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90bywgZG91YmxlJiB2YWwpIHsgcmV0dXJuIHByb3RvLT5yZWFkRG91YmxlKHZhbCk7IH0KKyAgc3RhdGljIHVpbnQzMl90IHJlYWQoc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwcm90bywgZG91YmxlJiB2YWwpIHsgcmV0dXJuIHByb3RvLT5yZWFkRG91YmxlKHZhbCk7IH0KIAotICBzdGF0aWMgdWludDMyX3QgcmVhZChzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG8sIHN0ZDo6c3RyaW5nJiB2YWwpIHsKKyAgc3RhdGljIHVpbnQzMl90IHJlYWQoc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwcm90bywgc3RkOjpzdHJpbmcmIHZhbCkgewogICAgIHJldHVybiBwcm90by0+cmVhZFN0cmluZyh2YWwpOwogICB9CiB9OwpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L0pTT05Qcm90b1Rlc3QuY3BwIGIvbGliL2NwcC90ZXN0L0pTT05Qcm90b1Rlc3QuY3BwCmluZGV4IGYwM2IyY2EuLmMyYWQ3M2UgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9KU09OUHJvdG9UZXN0LmNwcAorKysgYi9saWIvY3BwL3Rlc3QvSlNPTlByb3RvVGVzdC5jcHAKQEAgLTE5LDE4ICsxOSwyMiBAQAogCiAjZGVmaW5lIF9VU0VfTUFUSF9ERUZJTkVTCiAjaW5jbHVkZSA8Y21hdGg+Ci0jaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgorI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8c3N0cmVhbT4KICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CiAjaW5jbHVkZSAiZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5oIgogCiAjZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIEpTT05Qcm90b1Rlc3QKICNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CiAKIHVzaW5nIG5hbWVzcGFjZSB0aHJpZnQ6OnRlc3Q6OmRlYnVnOwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcjsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VEpTT05Qcm90b2NvbDsKIAotc3RhdGljIHN0ZDo6YXV0b19wdHI8T25lT2ZFYWNoPiBvb2U7CitzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPE9uZU9mRWFjaD4gb29lOwogCiB2b2lkIHRlc3RDYXNlU2V0dXBfMSgpIHsKICAgb29lLnJlc2V0KG5ldyBPbmVPZkVhY2gpOwpAQCAtNTIsNyArNTYsNyBAQAogICBjb25zdCBzdGQ6OnN0cmluZyBleHBlY3RlZF9yZXN1bHQoCiAgICJ7XCIxXCI6e1widGZcIjoxfSxcIjJcIjp7XCJ0ZlwiOjB9LFwiM1wiOntcImk4XCI6MTI3fSxcIjRcIjp7XCJpMTZcIjoyNzAwMH0sIgogICAiXCI1XCI6e1wiaTMyXCI6MTY3NzcyMTZ9LFwiNlwiOntcImk2NFwiOjYwMDAwMDAwMDB9LFwiN1wiOntcImRibFwiOjMuMTQxNTkyNiIKLSAgIjUzNTg5NzkzfSxcIjhcIjp7XCJzdHJcIjpcIkpTT04gVEhJUyEgXFxcIlxcdTAwMDFcIn0sXCI5XCI6e1wic3RyXCI6XCJceGQ3XFwiCisgICI1MzU4OTc5MzF9LFwiOFwiOntcInN0clwiOlwiSlNPTiBUSElTISBcXFwiXFx1MDAwMVwifSxcIjlcIjp7XCJzdHJcIjpcIlx4ZDdcXCIKICAgIm5cXHUwMDA3XFx0XCJ9LFwiMTBcIjp7XCJ0ZlwiOjB9LFwiMTFcIjp7XCJzdHJcIjpcIkFRSURyUVwifSxcIjEyXCI6e1wibHN0XCIiCiAgICI6W1wiaThcIiwzLDEsMiwzXX0sXCIxM1wiOntcImxzdFwiOltcImkxNlwiLDMsMSwyLDNdfSxcIjE0XCI6e1wibHN0XCI6W1wiaTY0IgogICAiXCIsMywxLDIsM119fSIpOwpAQCAtNjMsNyArNjcsNyBAQAogICAgICJFeHBlY3RlZDpcbiIgPDwgZXhwZWN0ZWRfcmVzdWx0IDw8ICJcbkdvdHRlbjpcbiIgPDwgcmVzdWx0KTsKIH0KIAotc3RhdGljIHN0ZDo6YXV0b19wdHI8TmVzdGluZz4gbjsKK3N0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8TmVzdGluZz4gbjsKIAogdm9pZCB0ZXN0Q2FzZVNldHVwXzIoKSB7CiAgIHRlc3RDYXNlU2V0dXBfMSgpOwpAQCAtOTEsNyArOTUsNyBAQAogICAgICJ7XCIxXCI6e1wicmVjXCI6e1wiMVwiOntcImkzMlwiOjMxMzM3fSxcIjJcIjp7XCJzdHJcIjpcIkkgYW0gYSBib25rLi4uIHhvciIKICAgICAiIVwifX19LFwiMlwiOntcInJlY1wiOntcIjFcIjp7XCJ0ZlwiOjF9LFwiMlwiOntcInRmXCI6MH0sXCIzXCI6e1wiaThcIjoxMjciCiAgICAgIn0sXCI0XCI6e1wiaTE2XCI6MTZ9LFwiNVwiOntcImkzMlwiOjMyfSxcIjZcIjp7XCJpNjRcIjo2NH0sXCI3XCI6e1wiZGJsXCI6IgotICAgICIxLjYxODAzMzk4ODc0OTg5NX0sXCI4XCI6e1wic3RyXCI6XCI6UiAobWUgZ29pbmcgXFxcInJycnJcXFwiKVwifSxcIjlcIjp7IgorICAgICIxLjYxODAzMzk4ODc0OTg5NDl9LFwiOFwiOntcInN0clwiOlwiOlIgKG1lIGdvaW5nIFxcXCJycnJyXFxcIilcIn0sXCI5XCI6eyIKICAgICAiXCJzdHJcIjpcItOA4oWuzp0g0J3Ov+KFv9C+yaHQs9Cwz4HihI4gzpF0dM6x4oW9zrrHg+KAvFwifSxcIjEwXCI6e1widGZcIjowfSxcIjExXCI6e1wic3RyXCI6XCIiCiAgICAgIkFRSURyUVwifSxcIjEyXCI6e1wibHN0XCI6W1wiaThcIiwzLDEsMiwzXX0sXCIxM1wiOntcImxzdFwiOltcImkxNlwiLDMsMSwyIgogICAgICIsM119LFwiMTRcIjp7XCJsc3RcIjpbXCJpNjRcIiwzLDEsMiwzXX19fX0iCkBAIC0xMDMsNyArMTA3LDcgQEAKICAgICAiRXhwZWN0ZWQ6XG4iIDw8IGV4cGVjdGVkX3Jlc3VsdCA8PCAiXG5Hb3R0ZW46XG4iIDw8IHJlc3VsdCk7CiB9CiAKLXN0YXRpYyBzdGQ6OmF1dG9fcHRyPEhvbHlNb2xleT4gaG07CitzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPEhvbHlNb2xleT4gaG07CiAKIHZvaWQgdGVzdENhc2VTZXR1cF8zKCkgewogICB0ZXN0Q2FzZVNldHVwXzIoKTsKQEAgLTE1NSwxMiArMTU5LDEyIEBACiAgIGNvbnN0IHN0ZDo6c3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCgKICAgIntcIjFcIjp7XCJsc3RcIjpbXCJyZWNcIiwyLHtcIjFcIjp7XCJ0ZlwiOjF9LFwiMlwiOntcInRmXCI6MH0sXCIzXCI6e1wiaThcIjoiCiAgICIzNH0sXCI0XCI6e1wiaTE2XCI6MjcwMDB9LFwiNVwiOntcImkzMlwiOjE2Nzc3MjE2fSxcIjZcIjp7XCJpNjRcIjo2MDAwMDAwMDAwIgotICAifSxcIjdcIjp7XCJkYmxcIjozLjE0MTU5MjY1MzU4OTc5M30sXCI4XCI6e1wic3RyXCI6XCJKU09OIFRISVMhIFxcXCJcXHUwMDAxIgorICAifSxcIjdcIjp7XCJkYmxcIjozLjE0MTU5MjY1MzU4OTc5MzF9LFwiOFwiOntcInN0clwiOlwiSlNPTiBUSElTISBcXFwiXFx1MDAwMSIKICAgIlwifSxcIjlcIjp7XCJzdHJcIjpcIlx4ZDdcXG5cXHUwMDA3XFx0XCJ9LFwiMTBcIjp7XCJ0ZlwiOjB9LFwiMTFcIjp7XCJzdHJcIjoiCiAgICJcIkFRSURyUVwifSxcIjEyXCI6e1wibHN0XCI6W1wiaThcIiwzLDEsMiwzXX0sXCIxM1wiOntcImxzdFwiOltcImkxNlwiLDMsMSwyIgogICAiLDNdfSxcIjE0XCI6e1wibHN0XCI6W1wiaTY0XCIsMywxLDIsM119fSx7XCIxXCI6e1widGZcIjoxfSxcIjJcIjp7XCJ0ZlwiOjB9LCIKICAgIlwiM1wiOntcImk4XCI6NTF9LFwiNFwiOntcImkxNlwiOjE2fSxcIjVcIjp7XCJpMzJcIjozMn0sXCI2XCI6e1wiaTY0XCI6NjR9LCIKLSAgIlwiN1wiOntcImRibFwiOjEuNjE4MDMzOTg4NzQ5ODk1fSxcIjhcIjp7XCJzdHJcIjpcIjpSIChtZSBnb2luZyBcXFwicnJyclxcXCIiCisgICJcIjdcIjp7XCJkYmxcIjoxLjYxODAzMzk4ODc0OTg5NDl9LFwiOFwiOntcInN0clwiOlwiOlIgKG1lIGdvaW5nIFxcXCJycnJyXFxcIiIKICAgIilcIn0sXCI5XCI6e1wic3RyXCI6XCLTgOKFrs6dINCdzr/ihb/Qvsmh0LPQsM+B4oSOIM6RdHTOseKFvc66x4PigLxcIn0sXCIxMFwiOntcInRmXCI6MH0sXCIxMVwiOnsiCiAgICJcInN0clwiOlwiQVFJRHJRXCJ9LFwiMTJcIjp7XCJsc3RcIjpbXCJpOFwiLDMsMSwyLDNdfSxcIjEzXCI6e1wibHN0XCI6W1wiaTE2IgogICAiXCIsMywxLDIsM119LFwiMTRcIjp7XCJsc3RcIjpbXCJpNjRcIiwzLDEsMiwzXX19XX0sXCIyXCI6e1wic2V0XCI6W1wibHN0XCIsMyIKQEAgLTE4MSw4ICsxODUsOCBAQAogQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9qc29uX3Byb3RvXzQpIHsKICAgdGVzdENhc2VTZXR1cF8xKCk7CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmZmVyKG5ldyBUTWVtb3J5QnVmZmVyKCkpOwotICBib29zdDo6c2hhcmVkX3B0cjxUSlNPTlByb3RvY29sPiBwcm90byhuZXcgVEpTT05Qcm90b2NvbChidWZmZXIpKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZmZlcihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRKU09OUHJvdG9jb2w+IHByb3RvKG5ldyBUSlNPTlByb3RvY29sKGJ1ZmZlcikpOwogCiAgIG9vZS0+d3JpdGUocHJvdG8uZ2V0KCkpOwogICBPbmVPZkVhY2ggb29lMjsKQEAgLTE5NCw4ICsxOTgsOCBAQAogQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9qc29uX3Byb3RvXzUpIHsKICAgdGVzdENhc2VTZXR1cF8zKCk7CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmZmVyKG5ldyBUTWVtb3J5QnVmZmVyKCkpOwotICBib29zdDo6c2hhcmVkX3B0cjxUSlNPTlByb3RvY29sPiBwcm90byhuZXcgVEpTT05Qcm90b2NvbChidWZmZXIpKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZmZlcihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRKU09OUHJvdG9jb2w+IHByb3RvKG5ldyBUSlNPTlByb3RvY29sKGJ1ZmZlcikpOwogCiAgIGhtLT53cml0ZShwcm90by5nZXQoKSk7CiAgIEhvbHlNb2xleSBobTI7CkBAIC0yMjEsNyArMjI1LDcgQEAKIAogICBjb25zdCBzdGQ6OnN0cmluZyBleHBlY3RlZF9yZXN1bHQoCiAgICJ7XCIxXCI6e1wiZGJsXCI6XCJOYU5cIn0sXCIyXCI6e1wiZGJsXCI6XCJJbmZpbml0eVwifSxcIjNcIjp7XCJkYmxcIjpcIi1JbmZpIgotICAibml0eVwifSxcIjRcIjp7XCJkYmxcIjozLjMzMzMzMzMzMzMzMzMzM30sXCI1XCI6e1wiZGJsXCI6OS45OTk5OTk5OTk5OTk5OTllKyIKKyAgIm5pdHlcIn0sXCI0XCI6e1wiZGJsXCI6My4zMzMzMzMzMzMzMzMzMzM1fSxcIjVcIjp7XCJkYmxcIjo5Ljk5OTk5OTk5OTk5OTk5OTRlKyIKICAgIjMwNH0sXCI2XCI6e1wiZGJsXCI6MWUtMzA1fSxcIjdcIjp7XCJkYmxcIjowfSxcIjhcIjp7XCJkYmxcIjotMH19IgogICApOwogCkBAIC0yMzIsOCArMjM2LDggQEAKIH0KIAogQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9qc29uX3Byb3RvXzcpIHsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmZmVyKG5ldyBUTWVtb3J5QnVmZmVyKCkpOwotICBib29zdDo6c2hhcmVkX3B0cjxUSlNPTlByb3RvY29sPiBwcm90byhuZXcgVEpTT05Qcm90b2NvbChidWZmZXIpKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZmZlcihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRKU09OUHJvdG9jb2w+IHByb3RvKG5ldyBUSlNPTlByb3RvY29sKGJ1ZmZlcikpOwogCiAgIEJhc2U2NCBiYXNlOwogICBiYXNlLmEgPSAxMjM7CkBAIC0yNTUsMTcgKzI1OSw4NSBAQAogICBjb25zdCBjaGFyKiBqc29uX3N0cmluZyA9CiAgICJ7XCIxXCI6e1widGZcIjoxfSxcIjJcIjp7XCJ0ZlwiOjB9LFwiM1wiOntcImk4XCI6MTI3fSxcIjRcIjp7XCJpMTZcIjoyNzAwMH0sIgogICAiXCI1XCI6e1wiaTMyXCI6MTYuNzcyMTZ9LFwiNlwiOntcImk2NFwiOjYwMDAwMDAwMDB9LFwiN1wiOntcImRibFwiOjMuMTQxNTkyNiIKLSAgIjUzNTg5NzkzfSxcIjhcIjp7XCJzdHJcIjpcIkpTT04gVEhJUyEgXFxcIlxcdTAwMDFcIn0sXCI5XCI6e1wic3RyXCI6XCJceGQ3XFwiCisgICI1MzU4OTc5MzF9LFwiOFwiOntcInN0clwiOlwiSlNPTiBUSElTISBcXFwiXFx1MDAwMVwifSxcIjlcIjp7XCJzdHJcIjpcIlx4ZDdcXCIKICAgIm5cXHUwMDA3XFx0XCJ9LFwiMTBcIjp7XCJ0ZlwiOjB9LFwiMTFcIjp7XCJzdHJcIjpcIkFRSURyUVwifSxcIjEyXCI6e1wibHN0XCIiCiAgICI6W1wiaThcIiwzLDEsMiwzXX0sXCIxM1wiOntcImxzdFwiOltcImkxNlwiLDMsMSwyLDNdfSxcIjE0XCI6e1wibHN0XCI6W1wiaTY0IgogICAiXCIsMywxLDIsM119fSI7CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmZmVyKG5ldyBUTWVtb3J5QnVmZmVyKAotICAgICh1aW50OF90KikoanNvbl9zdHJpbmcpLCBzdHJsZW4oanNvbl9zdHJpbmcpKnNpemVvZihjaGFyKSkpOwotICBib29zdDo6c2hhcmVkX3B0cjxUSlNPTlByb3RvY29sPiBwcm90byhuZXcgVEpTT05Qcm90b2NvbChidWZmZXIpKTsKKyAgY29uc3Qgc3RkOjpzaXplX3QgYnVmU2l6ID0gc3RybGVuKGpzb25fc3RyaW5nKSAqIHNpemVvZihjaGFyKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZmZlcihuZXcgVE1lbW9yeUJ1ZmZlcigKKyAgICAodWludDhfdCopKGpzb25fc3RyaW5nKSwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGJ1ZlNpeikpKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRKU09OUHJvdG9jb2w+IHByb3RvKG5ldyBUSlNPTlByb3RvY29sKGJ1ZmZlcikpOwogCiAgIE9uZU9mRWFjaCBvb2UyOwogCiAgIEJPT1NUX0NIRUNLX1RIUk9XKG9vZTIucmVhZChwcm90by5nZXQoKSksCiAgICAgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xFeGNlcHRpb24pOwogfQorCitzdGF0aWMgc3RkOjpzdHJpbmcgdG9IZXhTZXF1ZW5jZShjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7CisgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICBzcyA8PCBzdGQ6OmhleCA8PCBzdGQ6OnNldGZpbGwoJzAnKTsKKyAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IHN0ci5zaXplKCk7IGkrKykgeworICAgIHNzIDw8ICJcXHgiIDw8IGludCh1aW50OF90KHN0cltpXSkpOworICB9CisgIHJldHVybiBzcy5zdHIoKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9qc29uX3VuaWNvZGVfZXNjYXBlZCkgeworICBjb25zdCBjaGFyIGpzb25fc3RyaW5nW10gPQorICAie1wiMVwiOntcInRmXCI6MX0sXCIyXCI6e1widGZcIjowfSxcIjNcIjp7XCJpOFwiOjEyN30sXCI0XCI6e1wiaTE2XCI6MjcwMDB9LCIKKyAgIlwiNVwiOntcImkzMlwiOjE2fSxcIjZcIjp7XCJpNjRcIjo2MDAwMDAwMDAwfSxcIjdcIjp7XCJkYmxcIjozLjE0MTU5MjYiCisgICI1MzU4OTc5MzF9LFwiOFwiOntcInN0clwiOlwiSlNPTiBUSElTIVwifSxcIjlcIjp7XCJzdHJcIjpcIlxcdTBlMDEgXFx1ZDgzNVxcdWRkM2VcIn0sIgorICAiXCIxMFwiOntcInRmXCI6MH0sXCIxMVwiOntcInN0clwiOlwiMDAwMDAwXCJ9LFwiMTJcIjp7XCJsc3RcIiIKKyAgIjpbXCJpOFwiLDMsMSwyLDNdfSxcIjEzXCI6e1wibHN0XCI6W1wiaTE2XCIsMywxLDIsM119LFwiMTRcIjp7XCJsc3RcIjpbXCJpNjQiCisgICJcIiwzLDEsMiwzXX19IjsKKyAgY29uc3QgY2hhciogZXhwZWN0ZWRfem9tZ191bmljb2RlID0gIlx4ZTBceGI4XHg4MSBceGYwXHg5ZFx4OTRceGJlIjsKKworICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmZmVyKG5ldyBUTWVtb3J5QnVmZmVyKAorICAgICh1aW50OF90KikoanNvbl9zdHJpbmcpLCBzaXplb2YoanNvbl9zdHJpbmcpKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUSlNPTlByb3RvY29sPiBwcm90byhuZXcgVEpTT05Qcm90b2NvbChidWZmZXIpKTsKKworICBPbmVPZkVhY2ggb29lMjsKKyAgb29lMi5yZWFkKHByb3RvLmdldCgpKTsKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRSghb29lMi56b21nX3VuaWNvZGUuY29tcGFyZShleHBlY3RlZF96b21nX3VuaWNvZGUpLAorICAgICJFeHBlY3RlZDpcbiIgPDwgdG9IZXhTZXF1ZW5jZShleHBlY3RlZF96b21nX3VuaWNvZGUpIDw8ICJcbkdvdHRlbjpcbiIKKyAgICAgICAgICAgICAgICAgIDw8IHRvSGV4U2VxdWVuY2Uob29lMi56b21nX3VuaWNvZGUpKTsKKworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2pzb25fdW5pY29kZV9lc2NhcGVkX21pc3NpbmdfbG93X3N1cnJvZ2F0ZSkgeworICBjb25zdCBjaGFyIGpzb25fc3RyaW5nW10gPQorICAie1wiMVwiOntcInRmXCI6MX0sXCIyXCI6e1widGZcIjowfSxcIjNcIjp7XCJpOFwiOjEyN30sXCI0XCI6e1wiaTE2XCI6MjcwMDB9LCIKKyAgIlwiNVwiOntcImkzMlwiOjE2fSxcIjZcIjp7XCJpNjRcIjo2MDAwMDAwMDAwfSxcIjdcIjp7XCJkYmxcIjozLjE0MTU5MjYiCisgICI1MzU4OTc5MzF9LFwiOFwiOntcInN0clwiOlwiSlNPTiBUSElTIVwifSxcIjlcIjp7XCJzdHJcIjpcIlxcdWQ4MzVcIn0sIgorICAiXCIxMFwiOntcInRmXCI6MH0sXCIxMVwiOntcInN0clwiOlwiMDAwMDAwXCJ9LFwiMTJcIjp7XCJsc3RcIiIKKyAgIjpbXCJpOFwiLDMsMSwyLDNdfSxcIjEzXCI6e1wibHN0XCI6W1wiaTE2XCIsMywxLDIsM119LFwiMTRcIjp7XCJsc3RcIjpbXCJpNjQiCisgICJcIiwzLDEsMiwzXX19IjsKKworICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmZmVyKG5ldyBUTWVtb3J5QnVmZmVyKAorICAgICh1aW50OF90KikoanNvbl9zdHJpbmcpLCBzaXplb2YoanNvbl9zdHJpbmcpKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUSlNPTlByb3RvY29sPiBwcm90byhuZXcgVEpTT05Qcm90b2NvbChidWZmZXIpKTsKKworICBPbmVPZkVhY2ggb29lMjsKKyAgQk9PU1RfQ0hFQ0tfVEhST1cob29lMi5yZWFkKHByb3RvLmdldCgpKSwKKyAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEV4Y2VwdGlvbik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfanNvbl91bmljb2RlX2VzY2FwZWRfbWlzc2luZ19oaV9zdXJyb2dhdGUpIHsKKyAgY29uc3QgY2hhciBqc29uX3N0cmluZ1tdID0KKyAgIntcIjFcIjp7XCJ0ZlwiOjF9LFwiMlwiOntcInRmXCI6MH0sXCIzXCI6e1wiaThcIjoxMjd9LFwiNFwiOntcImkxNlwiOjI3MDAwfSwiCisgICJcIjVcIjp7XCJpMzJcIjoxNn0sXCI2XCI6e1wiaTY0XCI6NjAwMDAwMDAwMH0sXCI3XCI6e1wiZGJsXCI6My4xNDE1OTI2IgorICAiNTM1ODk3OTMxfSxcIjhcIjp7XCJzdHJcIjpcIkpTT04gVEhJUyFcIn0sXCI5XCI6e1wic3RyXCI6XCJcXHVkZDNlXCJ9LCIKKyAgIlwiMTBcIjp7XCJ0ZlwiOjB9LFwiMTFcIjp7XCJzdHJcIjpcIjAwMDAwMFwifSxcIjEyXCI6e1wibHN0XCIiCisgICI6W1wiaThcIiwzLDEsMiwzXX0sXCIxM1wiOntcImxzdFwiOltcImkxNlwiLDMsMSwyLDNdfSxcIjE0XCI6e1wibHN0XCI6W1wiaTY0IgorICAiXCIsMywxLDIsM119fSI7CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZmZlcihuZXcgVE1lbW9yeUJ1ZmZlcigKKyAgICAodWludDhfdCopKGpzb25fc3RyaW5nKSwgc2l6ZW9mKGpzb25fc3RyaW5nKSkpOworICBzdGQ6OnNoYXJlZF9wdHI8VEpTT05Qcm90b2NvbD4gcHJvdG8obmV3IFRKU09OUHJvdG9jb2woYnVmZmVyKSk7CisKKyAgT25lT2ZFYWNoIG9vZTI7CisgIEJPT1NUX0NIRUNLX1RIUk9XKG9vZTIucmVhZChwcm90by5nZXQoKSksCisgICAgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xFeGNlcHRpb24pOworfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L01ha2VmaWxlLmFtIGIvbGliL2NwcC90ZXN0L01ha2VmaWxlLmFtCmluZGV4IDQ0Yjk0YTcuLmQ2NDVhNjUgMTAwNzU1Ci0tLSBhL2xpYi9jcHAvdGVzdC9NYWtlZmlsZS5hbQorKysgYi9saWIvY3BwL3Rlc3QvTWFrZWZpbGUuYW0KQEAgLTE4LDcgKzE4LDggQEAKICMKIEFVVE9NQUtFX09QVElPTlMgPSBzdWJkaXItb2JqZWN0cyBzZXJpYWwtdGVzdHMKIAotQlVJTFRfU09VUkNFUyA9IGdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuaCBcCitCVUlMVF9TT1VSQ0VTID0gZ2VuLWNwcC9Bbm5vdGF0aW9uVGVzdF90eXBlcy5oIFwKKyAgICAgICAgICAgICAgICBnZW4tY3BwL0RlYnVnUHJvdG9UZXN0X3R5cGVzLmggXAogICAgICAgICAgICAgICAgIGdlbi1jcHAvRW51bVRlc3RfdHlwZXMuaCBcCiAgICAgICAgICAgICAgICAgZ2VuLWNwcC9PcHRpb25hbFJlcXVpcmVkVGVzdF90eXBlcy5oIFwKICAgICAgICAgICAgICAgICBnZW4tY3BwL1JlY3Vyc2l2ZV90eXBlcy5oIFwKQEAgLTI3LDEyICsyOCwxOSBAQAogICAgICAgICAgICAgICAgIGdlbi1jcHAvQ2hpbGRTZXJ2aWNlLmggXAogICAgICAgICAgICAgICAgIGdlbi1jcHAvRW1wdHlTZXJ2aWNlLmggXAogICAgICAgICAgICAgICAgIGdlbi1jcHAvUGFyZW50U2VydmljZS5oIFwKKwkJZ2VuLWNwcC9PbmVXYXlUZXN0X3R5cGVzLmggXAorCQlnZW4tY3BwL09uZVdheVNlcnZpY2UuaCBcCisJCWdlbi1jcHAvT25lV2F5VGVzdF9jb25zdGFudHMuaCBcCiAgICAgICAgICAgICAgICAgZ2VuLWNwcC9wcm9jX3R5cGVzLmgKIAogbm9pbnN0X0xUTElCUkFSSUVTID0gbGlidGVzdGdlbmNwcC5sYSBsaWJwcm9jZXNzb3J0ZXN0LmxhCiBub2Rpc3RfbGlidGVzdGdlbmNwcF9sYV9TT1VSQ0VTID0gXAorCWdlbi1jcHAvQW5ub3RhdGlvblRlc3RfdHlwZXMuY3BwIFwKKwlnZW4tY3BwL0Fubm90YXRpb25UZXN0X3R5cGVzLmggXAogCWdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuY3BwIFwKIAlnZW4tY3BwL0RlYnVnUHJvdG9UZXN0X3R5cGVzLmggXAorCWdlbi1jcHAvRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuY3BwIFwKKwlnZW4tY3BwL0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLmggXAogCWdlbi1jcHAvRW51bVRlc3RfdHlwZXMuY3BwIFwKIAlnZW4tY3BwL0VudW1UZXN0X3R5cGVzLmggXAogCWdlbi1jcHAvT3B0aW9uYWxSZXF1aXJlZFRlc3RfdHlwZXMuY3BwIFwKQEAgLTQ1LDYgKzUzLDEyIEBACiAJZ2VuLWNwcC9UaHJpZnRUZXN0X2NvbnN0YW50cy5oIFwKIAlnZW4tY3BwL1R5cGVkZWZUZXN0X3R5cGVzLmNwcCBcCiAJZ2VuLWNwcC9UeXBlZGVmVGVzdF90eXBlcy5oIFwKKwlnZW4tY3BwL09uZVdheVNlcnZpY2UuY3BwIFwKKwlnZW4tY3BwL09uZVdheVRlc3RfY29uc3RhbnRzLmNwcCBcCisJZ2VuLWNwcC9PbmVXYXlUZXN0X3R5cGVzLmggXAorCWdlbi1jcHAvT25lV2F5U2VydmljZS5oIFwKKwlnZW4tY3BwL09uZVdheVRlc3RfY29uc3RhbnRzLmggXAorCWdlbi1jcHAvT25lV2F5VGVzdF90eXBlcy5jcHAgXAogCVRocmlmdFRlc3RfZXh0cmFzLmNwcCBcCiAJRGVidWdQcm90b1Rlc3RfZXh0cmFzLmNwcAogCkBAIC04OSwyNSArMTAzLDI5IEBACiAJVEZpbGVUcmFuc3BvcnRUZXN0IFwKIAlsaW5rX3Rlc3QgXAogCU9wZW5TU0xNYW51YWxJbml0VGVzdCBcCi0JRW51bVRlc3QKKwlFbnVtVGVzdCBcCisJUmVuZGVyZWREb3VibGVDb25zdGFudHNUZXN0IFwKKyAgICAgICAgQW5ub3RhdGlvblRlc3QKIAogaWYgQU1YX0hBVkVfTElCRVZFTlQKIG5vaW5zdF9QUk9HUkFNUyArPSBcCiAJcHJvY2Vzc29yX3Rlc3QKIGNoZWNrX1BST0dSQU1TICs9IFwKLQlUTm9uYmxvY2tpbmdTZXJ2ZXJUZXN0CisJVE5vbmJsb2NraW5nU2VydmVyVGVzdCBcCisJVE5vbmJsb2NraW5nU1NMU2VydmVyVGVzdAogZW5kaWYKIAogVEVTVFNfRU5WSVJPTk1FTlQ9IFwKIAlCT09TVF9URVNUX0xPR19TSU5LPXRlc3RzLnhtbCBcCiAJQk9PU1RfVEVTVF9MT0dfTEVWRUw9dGVzdF9zdWl0ZSBcCi0JQk9PU1RfVEVTVF9MT0dfRk9STUFUPXhtbAorCUJPT1NUX1RFU1RfTE9HX0ZPUk1BVD1YTUwKIAogVEVTVFMgPSBcCiAJJChjaGVja19QUk9HUkFNUykKIAogVW5pdFRlc3RzX1NPVVJDRVMgPSBcCiAJVW5pdFRlc3RNYWluLmNwcCBcCisJT25lV2F5SFRUUFRlc3QuY3BwIFwKIAlUTWVtb3J5QnVmZmVyVGVzdC5jcHAgXAogCVRCdWZmZXJCYXNlVGVzdC5jcHAgXAogCUJhc2U2NFRlc3QuY3BwIFwKQEAgLTExNSwyNCArMTMzLDI2IEBACiAJVHlwZWRlZlRlc3QuY3BwIFwKIAlUU2VydmVyU29ja2V0VGVzdC5jcHAgXAogCVRTZXJ2ZXJUcmFuc3BvcnRUZXN0LmNwcCBcCi0JVGVzdFBvcnRGaXh0dXJlLmggXAogCVRUcmFuc3BvcnRDaGVja1Rocm93LmgKIAotaWYgIVdJVEhfQk9PU1RUSFJFQURTCiBVbml0VGVzdHNfU09VUkNFUyArPSBcCi0gICAgUldNdXRleFN0YXJ2ZVRlc3QuY3BwCi1lbmRpZgorICBjb25jdXJyZW5jeS9NdXRleFRlc3QuY3BwIFwKKyAgY29uY3VycmVuY3kvUldNdXRleFN0YXJ2ZVRlc3QuY3BwCiAKIFVuaXRUZXN0c19MREFERCA9IFwKICAgbGlidGVzdGdlbmNwcC5sYSBcCi0gICQoQk9PU1RfVEVTVF9MREFERCkKKyAgJChCT09TVF9URVNUX0xEQUREKSBcCisgICQoQk9PU1RfU1lTVEVNX0xEQUREKSBcCisgICQoQk9PU1RfVEhSRUFEX0xEQUREKQogCiBUSW50ZXJydXB0VGVzdF9TT1VSQ0VTID0gXAotCVRTb2NrZXRJbnRlcnJ1cHRUZXN0LmNwcAorCVRTb2NrZXRJbnRlcnJ1cHRUZXN0LmNwcCBcCisJVFNTTFNvY2tldEludGVycnVwdFRlc3QuY3BwCiAKIFRJbnRlcnJ1cHRUZXN0X0xEQUREID0gXAogICBsaWJ0ZXN0Z2VuY3BwLmxhIFwKICAgJChCT09TVF9URVNUX0xEQUREKSBcCisgICQoQk9PU1RfRklMRVNZU1RFTV9MREFERCkgXAogICAkKEJPT1NUX0NIUk9OT19MREFERCkgXAogICAkKEJPT1NUX1NZU1RFTV9MREFERCkgXAogICAkKEJPT1NUX1RIUkVBRF9MREFERCkKQEAgLTE3NywxMiArMTk3LDIzIEBACiAgIC1segogCiBFbnVtVGVzdF9TT1VSQ0VTID0gXAotICBFbnVtVGVzdC5jcHAKKwlFbnVtVGVzdC5jcHAKIAogRW51bVRlc3RfTERBREQgPSBcCiAgIGxpYnRlc3RnZW5jcHAubGEgXAogICAkKEJPT1NUX1RFU1RfTERBREQpCiAKK1JlbmRlcmVkRG91YmxlQ29uc3RhbnRzVGVzdF9TT1VSQ0VTID0gUmVuZGVyZWREb3VibGVDb25zdGFudHNUZXN0LmNwcAorCitSZW5kZXJlZERvdWJsZUNvbnN0YW50c1Rlc3RfTERBREQgPSBsaWJ0ZXN0Z2VuY3BwLmxhICQoQk9PU1RfVEVTVF9MREFERCkKKworQW5ub3RhdGlvblRlc3RfU09VUkNFUyA9IFwKKwlBbm5vdGF0aW9uVGVzdC5jcHAKKworQW5ub3RhdGlvblRlc3RfTERBREQgPSBcCisgIGxpYnRlc3RnZW5jcHAubGEgXAorICAkKEJPT1NUX1RFU1RfTERBREQpCisKIFRGaWxlVHJhbnNwb3J0VGVzdF9TT1VSQ0VTID0gXAogCVRGaWxlVHJhbnNwb3J0VGVzdC5jcHAKIApAQCAtMjU5LDYgKzI5MCwyMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoQk9PU1RfVEVTVF9MREFERCkgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoQk9PU1RfTERGTEFHUykgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoTElCRVZFTlRfTElCUykKKyMKKyMgVE5vbmJsb2NraW5nU1NMU2VydmVyVGVzdAorIworVE5vbmJsb2NraW5nU1NMU2VydmVyVGVzdF9TT1VSQ0VTID0gVE5vbmJsb2NraW5nU1NMU2VydmVyVGVzdC5jcHAKKworVE5vbmJsb2NraW5nU1NMU2VydmVyVGVzdF9MREFERCA9IGxpYnByb2Nlc3NvcnRlc3QubGEgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdC5sYSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0bmIubGEgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoQk9PU1RfVEVTVF9MREFERCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoQk9PU1RfTERGTEFHUykgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoQk9PU1RfRklMRVNZU1RFTV9MREFERCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoQk9PU1RfQ0hST05PX0xEQUREKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChCT09TVF9TWVNURU1fTERBREQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKEJPT1NUX1RIUkVBRF9MREFERCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoTElCRVZFTlRfTElCUykKIAogIwogIyBPcHRpb25hbFJlcXVpcmVkVGVzdApAQCAtMzI0LDE2ICszNzAsMjQgQEAKIAogT3BlblNTTE1hbnVhbEluaXRUZXN0X0xEQUREID0gXAogCSQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdC5sYSBcCi0JJChCT09TVF9URVNUX0xEQUREKQorCSQoQk9PU1RfVEVTVF9MREFERCkgXAorCSQoT1BFTlNTTF9MREZMQUdTKSBcCisJJChPUEVOU1NMX0xJQlMpCiAKICMKICMgQ29tbW9uIHRocmlmdCBjb2RlIGdlbmVyYXRpb24gcnVsZXMKICMKLVRIUklGVCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0CisKK2dlbi1jcHAvQW5ub3RhdGlvblRlc3RfY29uc3RhbnRzLmNwcCBnZW4tY3BwL0Fubm90YXRpb25UZXN0X2NvbnN0YW50cy5oIGdlbi1jcHAvQW5ub3RhdGlvblRlc3RfdHlwZXMuY3BwIGdlbi1jcHAvQW5ub3RhdGlvblRlc3RfdHlwZXMuaDogJCh0b3Bfc3JjZGlyKS90ZXN0L0Fubm90YXRpb25UZXN0LnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBjcHAgJDwKIAogZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5jcHAgZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5oIGdlbi1jcHAvRW1wdHlTZXJ2aWNlLmNwcCBnZW4tY3BwL0VtcHR5U2VydmljZS5oOiAkKHRvcF9zcmNkaXIpL3Rlc3QvRGVidWdQcm90b1Rlc3QudGhyaWZ0CiAJJChUSFJJRlQpIC0tZ2VuIGNwcCAkPAogCitnZW4tY3BwL0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLmNwcCBnZW4tY3BwL0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLmg6ICQodG9wX3NyY2RpcikvdGVzdC9Eb3VibGVDb25zdGFudHNUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBjcHAgJDwKKworCiBnZW4tY3BwL0VudW1UZXN0X3R5cGVzLmNwcCBnZW4tY3BwL0VudW1UZXN0X3R5cGVzLmg6ICQodG9wX3NyY2RpcikvdGVzdC9FbnVtVGVzdC50aHJpZnQKIAkkKFRIUklGVCkgLS1nZW4gY3BwICQ8CiAKQEAgLTM1MiwxNSArNDA2LDE4IEBACiBnZW4tY3BwL1NlY29uZFNlcnZpY2UuY3BwIGdlbi1jcHAvVGhyaWZ0VGVzdF9jb25zdGFudHMuY3BwIGdlbi1jcHAvVGhyaWZ0VGVzdC5jcHAgZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmNwcCBnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuaDogJCh0b3Bfc3JjZGlyKS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CiAJJChUSFJJRlQpIC0tZ2VuIGNwcCAkPAogCitnZW4tY3BwL09uZVdheVNlcnZpY2UuY3BwIGdlbi1jcHAvT25lV2F5VGVzdF9jb25zdGFudHMuY3BwIGdlbi1jcHAvT25lV2F5VGVzdF90eXBlcy5oIGdlbi1jcHAvT25lV2F5U2VydmljZS5oIGdlbi1jcHAvT25lV2F5VGVzdF9jb25zdGFudHMuaCBnZW4tY3BwL09uZVdheVRlc3RfdHlwZXMuY3BwOiBPbmVXYXlUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBjcHAgJDwKKwogZ2VuLWNwcC9DaGlsZFNlcnZpY2UuY3BwIGdlbi1jcHAvQ2hpbGRTZXJ2aWNlLmggZ2VuLWNwcC9QYXJlbnRTZXJ2aWNlLmNwcCBnZW4tY3BwL1BhcmVudFNlcnZpY2UuaCBnZW4tY3BwL3Byb2NfdHlwZXMuY3BwIGdlbi1jcHAvcHJvY190eXBlcy5oOiBwcm9jZXNzb3IvcHJvYy50aHJpZnQKIAkkKFRIUklGVCkgLS1nZW4gY3BwOnRlbXBsYXRlcyxjb2Jfc3R5bGUgJDwKIAotQU1fQ1BQRkxBR1MgPSAkKEJPT1NUX0NQUEZMQUdTKSAtSSQodG9wX3NyY2RpcikvbGliL2NwcC9zcmMgLURfX1NURENfTElNSVRfTUFDUk9TCitBTV9DUFBGTEFHUyA9ICQoQk9PU1RfQ1BQRkxBR1MpIC1JJCh0b3Bfc3JjZGlyKS9saWIvY3BwL3NyYyAtRF9fU1REQ19GT1JNQVRfTUFDUk9TIC1EX19TVERDX0xJTUlUX01BQ1JPUyAtSS4KIEFNX0xERkxBR1MgPSAkKEJPT1NUX0xERkxBR1MpCiBBTV9DWFhGTEFHUyA9IC1XYWxsIC1XZXh0cmEgLXBlZGFudGljCiAKIGNsZWFuLWxvY2FsOgotCSQoUk0pIC1yIGdlbi1jcHAKKwkkKFJNKSBnZW4tY3BwLyoKIAogRVhUUkFfRElTVCA9IFwKIAljb25jdXJyZW5jeSBcCkBAIC0zNjgsNCArNDI1LDUgQEAKIAlxdCBcCiAJQ01ha2VMaXN0cy50eHQgXAogCURlYnVnUHJvdG9UZXN0X2V4dHJhcy5jcHAgXAotCVRocmlmdFRlc3RfZXh0cmFzLmNwcAorCVRocmlmdFRlc3RfZXh0cmFzLmNwcCBcCisJT25lV2F5VGVzdC50aHJpZnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9PbmVXYXlIVFRQVGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvT25lV2F5SFRUUFRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZmExNjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvT25lV2F5SFRUUFRlc3QuY3BwCkBAIC0wLDAgKzEsMjQyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxib29zdC90ZXN0L2F1dG9fdW5pdF90ZXN0LmhwcD4KKyNpbmNsdWRlIDxib29zdC90aHJlYWQuaHBwPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGNsaW1pdHM+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RIdHRwU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9USHR0cENsaWVudC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CisjaW5jbHVkZSAiZ2VuLWNwcC9PbmVXYXlTZXJ2aWNlLmgiCisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURShPbmVXYXlIVFRQVGVzdCkKKwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRCaW5hcnlQcm90b2NvbDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VEJpbmFyeVByb3RvY29sRmFjdG9yeTsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VEpTT05Qcm90b2NvbDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VEpTT05Qcm90b2NvbEZhY3Rvcnk7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6c2VydmVyOjpUVGhyZWFkZWRTZXJ2ZXI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6c2VydmVyOjpUU2VydmVyRXZlbnRIYW5kbGVyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRIdHRwU2VydmVyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VEh0dHBTZXJ2ZXJUcmFuc3BvcnRGYWN0b3J5OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VEh0dHBDbGllbnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUQnVmZmVyZWRUcmFuc3BvcnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJTb2NrZXQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU29ja2V0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKK3VzaW5nIHN0ZDo6Y291dDsKK3VzaW5nIHN0ZDo6Y2VycjsKK3VzaW5nIHN0ZDo6ZW5kbDsKK3VzaW5nIHN0ZDo6c3RyaW5nOworbmFtZXNwYWNlIHV0ZiA9IGJvb3N0Ojp1bml0X3Rlc3Q7CisKKy8vIERlZmluZSB0aGlzIGVudiB2YXIgdG8gZW5hYmxlIHNvbWUgbG9nZ2luZyAoaW4gY2FzZSB5b3UgbmVlZCB0byBkZWJ1ZykKKyN1bmRlZiBFTkFCTEVfU1RERVJSX0xPR0dJTkcKKworY2xhc3MgT25lV2F5U2VydmljZUhhbmRsZXIgOiBwdWJsaWMgb25ld2F5dGVzdDo6T25lV2F5U2VydmljZUlmIHsKK3B1YmxpYzoKKyAgT25lV2F5U2VydmljZUhhbmRsZXIoKSB7fQorCisgIHZvaWQgcm91bmRUcmlwUlBDKCkgb3ZlcnJpZGUgeworI2lmZGVmIEVOQUJMRV9TVERFUlJfTE9HR0lORworICAgIGNlcnIgPDwgInJvdW5kVHJpcFJQQygpIiA8PCBlbmRsOworI2VuZGlmCisgIH0KKyAgdm9pZCBvbmVXYXlSUEMoKSB7CisjaWZkZWYgRU5BQkxFX1NUREVSUl9MT0dHSU5HCisgICAgY2VyciA8PCAib25lV2F5UlBDKCkiIDw8IHN0ZDo6ZW5kbCA7CisjZW5kaWYKKyB9Cit9OworCitjbGFzcyBPbmVXYXlTZXJ2aWNlQ2xvbmVGYWN0b3J5IDogdmlydHVhbCBwdWJsaWMgb25ld2F5dGVzdDo6T25lV2F5U2VydmljZUlmRmFjdG9yeSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5PbmVXYXlTZXJ2aWNlQ2xvbmVGYWN0b3J5KCkge30KKyAgdmlydHVhbCBvbmV3YXl0ZXN0OjpPbmVXYXlTZXJ2aWNlSWYqIGdldEhhbmRsZXIoY29uc3QgOjphcGFjaGU6OnRocmlmdDo6VENvbm5lY3Rpb25JbmZvJiBjb25uSW5mbykKKyAgeworICAgICh2b2lkKWNvbm5JbmZvIDsKKyAgICByZXR1cm4gbmV3IE9uZVdheVNlcnZpY2VIYW5kbGVyOworICB9CisgIHZpcnR1YWwgdm9pZCByZWxlYXNlSGFuZGxlciggb25ld2F5dGVzdDo6T25lV2F5U2VydmljZUlmKiBoYW5kbGVyKSB7CisgICAgZGVsZXRlIGhhbmRsZXI7CisgIH0KK307CisKK2NsYXNzIFJQQzBUaHJlYWRDbGFzcyB7CitwdWJsaWM6CisgIFJQQzBUaHJlYWRDbGFzcyhUVGhyZWFkZWRTZXJ2ZXImIHNlcnZlcikgOiBzZXJ2ZXJfKHNlcnZlcikgeyB9IC8vIENvbnN0cnVjdG9yCit+UlBDMFRocmVhZENsYXNzKCkgeyB9IC8vIERlc3RydWN0b3IKKwordm9pZCBSdW4oKSB7CisgIHNlcnZlcl8uc2VydmUoKSA7Cit9CisgVFRocmVhZGVkU2VydmVyJiBzZXJ2ZXJfIDsKK30gOworCit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Ok1vbml0b3I7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Ok11dGV4OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpTeW5jaHJvbml6ZWQ7CisKKy8vIGNvcGllZCBmcm9tIEludGVncmF0aW9uVGVzdAorY2xhc3MgVFNlcnZlclJlYWR5RXZlbnRIYW5kbGVyIDogcHVibGljIFRTZXJ2ZXJFdmVudEhhbmRsZXIsIHB1YmxpYyBNb25pdG9yIHsKK3B1YmxpYzoKKyAgVFNlcnZlclJlYWR5RXZlbnRIYW5kbGVyKCkgOiBpc0xpc3RlbmluZ18oZmFsc2UpLCBhY2NlcHRlZF8oMCkge30KKyAgdmlydHVhbCB+VFNlcnZlclJlYWR5RXZlbnRIYW5kbGVyKCkge30KKyAgdmlydHVhbCB2b2lkIHByZVNlcnZlKCkgeworICAgIFN5bmNocm9uaXplZCBzeW5jKCp0aGlzKTsKKyAgICBpc0xpc3RlbmluZ18gPSB0cnVlOworICAgIG5vdGlmeSgpOworICB9CisgIHZpcnR1YWwgdm9pZCogY3JlYXRlQ29udGV4dChzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0KSB7CisgICAgU3luY2hyb25pemVkIHN5bmMoKnRoaXMpOworICAgICsrYWNjZXB0ZWRfOworICAgIG5vdGlmeSgpOworCisgICAgKHZvaWQpaW5wdXQ7CisgICAgKHZvaWQpb3V0cHV0OworICAgIHJldHVybiBOVUxMOworICB9CisgIGJvb2wgaXNMaXN0ZW5pbmcoKSBjb25zdCB7IHJldHVybiBpc0xpc3RlbmluZ187IH0KKyAgdWludDY0X3QgYWNjZXB0ZWRDb3VudCgpIGNvbnN0IHsgcmV0dXJuIGFjY2VwdGVkXzsgfQorCitwcml2YXRlOgorICBib29sIGlzTGlzdGVuaW5nXzsKKyAgdWludDY0X3QgYWNjZXB0ZWRfOworfTsKKworY2xhc3MgVEJsb2NrYWJsZUJ1ZmZlcmVkVHJhbnNwb3J0IDogcHVibGljIFRCdWZmZXJlZFRyYW5zcG9ydCB7CisgcHVibGljOgorICBUQmxvY2thYmxlQnVmZmVyZWRUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCkKKyAgICA6IFRCdWZmZXJlZFRyYW5zcG9ydCh0cmFuc3BvcnQsIDEwMjQwKSwKKyAgICBibG9ja2VkXyhmYWxzZSkgeworICB9CisKKyAgdWludDMyX3Qgd3JpdGVfYnVmZmVyX2xlbmd0aCgpIHsKKyAgICB1aW50MzJfdCBoYXZlX2J5dGVzID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHdCYXNlXyAtIHdCdWZfLmdldCgpKTsKKyAgICByZXR1cm4gaGF2ZV9ieXRlcyA7CisgIH0KKworICB2b2lkIGJsb2NrKCkgeworICAgIGJsb2NrZWRfID0gdHJ1ZSA7CisjaWZkZWYgRU5BQkxFX1NUREVSUl9MT0dHSU5HCisgICAgY2VyciA8PCAiYmxvY2sgZmx1c2hpbmdcbiIgOworI2VuZGlmCisgfQorICB2b2lkIHVuYmxvY2soKSB7CisgICAgYmxvY2tlZF8gPSBmYWxzZSA7CisjaWZkZWYgRU5BQkxFX1NUREVSUl9MT0dHSU5HCisgICAgY2VyciA8PCAidW5ibG9jayBmbHVzaGluZywgYnVmZmVyIGlzXG48PCIgPDwgc3RkOjpzdHJpbmcoKGNoYXIgKil3QnVmXy5nZXQoKSwgd3JpdGVfYnVmZmVyX2xlbmd0aCgpKSA8PCAiPj5cbiIgOworI2VuZGlmCisgfQorCisgIHZvaWQgZmx1c2goKSBvdmVycmlkZSB7CisgICAgaWYgKGJsb2NrZWRfKSB7CisjaWZkZWYgRU5BQkxFX1NUREVSUl9MT0dHSU5HCisgICAgICBjZXJyIDw8ICJmbHVzaCB3YXMgYmxvY2tlZFxuIiA7CisjZW5kaWYKKyAgICAgIHJldHVybiA7CisgICAgfQorICAgIFRCdWZmZXJlZFRyYW5zcG9ydDo6Zmx1c2goKSA7CisgIH0KKworICBib29sIGJsb2NrZWRfIDsKK30gOworCitCT09TVF9BVVRPX1RFU1RfQ0FTRSggSlNPTl9CdWZmZXJlZEhUVFAgKQoreworICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4gc3MgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRTZXJ2ZXJTb2NrZXQ+KDApIDsKKyAgVFRocmVhZGVkU2VydmVyIHNlcnZlcigKKyAgICBzdGQ6Om1ha2Vfc2hhcmVkPG9uZXdheXRlc3Q6Ok9uZVdheVNlcnZpY2VQcm9jZXNzb3JGYWN0b3J5PihzdGQ6Om1ha2Vfc2hhcmVkPE9uZVdheVNlcnZpY2VDbG9uZUZhY3Rvcnk+KCkpLAorICAgIHNzLCAvL3BvcnQKKyAgICBzdGQ6Om1ha2Vfc2hhcmVkPFRIdHRwU2VydmVyVHJhbnNwb3J0RmFjdG9yeT4oKSwKKyAgICBzdGQ6Om1ha2Vfc2hhcmVkPFRKU09OUHJvdG9jb2xGYWN0b3J5PigpKTsKKworICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclJlYWR5RXZlbnRIYW5kbGVyPiBwRXZlbnRIYW5kbGVyKG5ldyBUU2VydmVyUmVhZHlFdmVudEhhbmRsZXIpIDsKKyAgc2VydmVyLnNldFNlcnZlckV2ZW50SGFuZGxlcihwRXZlbnRIYW5kbGVyKTsKKworI2lmZGVmIEVOQUJMRV9TVERFUlJfTE9HR0lORworICBjZXJyIDw8ICJTdGFydGluZyB0aGUgc2VydmVyLi4uXG4iOworI2VuZGlmCisgIFJQQzBUaHJlYWRDbGFzcyB0KHNlcnZlcikgOworICBib29zdDo6dGhyZWFkIHRocmVhZCgmUlBDMFRocmVhZENsYXNzOjpSdW4sICZ0KTsKKworICB7CisgICAgU3luY2hyb25pemVkIHN5bmMoKihwRXZlbnRIYW5kbGVyLmdldCgpKSk7CisgICAgd2hpbGUgKCFwRXZlbnRIYW5kbGVyLT5pc0xpc3RlbmluZygpKSB7CisgICAgICBwRXZlbnRIYW5kbGVyLT53YWl0KCk7CisgICAgfQorICB9CisKKyAgaW50IHBvcnQgPSBzcy0+Z2V0UG9ydCgpIDsKKyNpZmRlZiBFTkFCTEVfU1RERVJSX0xPR0dJTkcKKyAgY2VyciA8PCAicG9ydCAiIDw8IHBvcnQgPDwgZW5kbCA7CisjZW5kaWYKKworICB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHNvY2tldChuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgcG9ydCkpOworICAgIHNvY2tldC0+c2V0UmVjdlRpbWVvdXQoMTAwMDApIDsgLy8gMTAwMG1zZWMgc2hvdWxkIGJlIGVub3VnaAorICAgIHN0ZDo6c2hhcmVkX3B0cjxUQmxvY2thYmxlQnVmZmVyZWRUcmFuc3BvcnQ+IGJsb2NrYWJsZV90cmFuc3BvcnQobmV3IFRCbG9ja2FibGVCdWZmZXJlZFRyYW5zcG9ydChzb2NrZXQpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KG5ldyBUSHR0cENsaWVudChibG9ja2FibGVfdHJhbnNwb3J0LCAibG9jYWxob3N0IiwgIi9zZXJ2aWNlIikpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvY29sKG5ldyBUSlNPTlByb3RvY29sKHRyYW5zcG9ydCkpOworICAgIG9uZXdheXRlc3Q6Ok9uZVdheVNlcnZpY2VDbGllbnQgY2xpZW50KHByb3RvY29sKTsKKworCisgICAgdHJhbnNwb3J0LT5vcGVuKCk7CisgICAgY2xpZW50LnJvdW5kVHJpcFJQQygpOworICAgIGJsb2NrYWJsZV90cmFuc3BvcnQtPmJsb2NrKCkgOworICAgIHVpbnQzMl90IHNpemUwID0gYmxvY2thYmxlX3RyYW5zcG9ydC0+d3JpdGVfYnVmZmVyX2xlbmd0aCgpIDsKKyAgICBjbGllbnQuc2VuZF9vbmVXYXlSUEMoKSA7CisgICAgdWludDMyX3Qgc2l6ZTEgPSBibG9ja2FibGVfdHJhbnNwb3J0LT53cml0ZV9idWZmZXJfbGVuZ3RoKCkgOworICAgIGNsaWVudC5zZW5kX29uZVdheVJQQygpIDsKKyAgICB1aW50MzJfdCBzaXplMiA9IGJsb2NrYWJsZV90cmFuc3BvcnQtPndyaXRlX2J1ZmZlcl9sZW5ndGgoKSA7CisgICAgQk9PU1RfQ0hFQ0soKHNpemUxIC0gc2l6ZTApID09IChzaXplMiAtIHNpemUxKSkgOworICAgIGJsb2NrYWJsZV90cmFuc3BvcnQtPnVuYmxvY2soKSA7CisgICAgY2xpZW50LnNlbmRfcm91bmRUcmlwUlBDKCkgOworICAgIGJsb2NrYWJsZV90cmFuc3BvcnQtPmZsdXNoKCkgOworICAgIHRyeSB7CisgICAgICBjbGllbnQucmVjdl9yb3VuZFRyaXBSUEMoKSA7CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiBlKSB7CisgICAgICBCT09TVF9FUlJPUiggIndlIHNob3VsZCBub3QgZ2V0IGEgdHJhbnNwb3J0IGV4Y2VwdGlvbiAtLSB0aGlzIG1lYW5zIHdlIGZhaWxlZDogIiArIHN0ZDo6c3RyaW5nKGUud2hhdCgpKSApIDsKKyAgICB9CisgICAgdHJhbnNwb3J0LT5jbG9zZSgpOworICB9CisgIHNlcnZlci5zdG9wKCk7CisgIHRocmVhZC5qb2luKCkgOworI2lmZGVmIEVOQUJMRV9TVERFUlJfTE9HR0lORworICBjZXJyIDw8ICJmaW5pc2hlZC5cbiI7CisjZW5kaWYKK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvT25lV2F5VGVzdC50aHJpZnQgYi9saWIvY3BwL3Rlc3QvT25lV2F5VGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI3ZTlmZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9PbmVXYXlUZXN0LnRocmlmdApAQCAtMCwwICsxLDQ2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCituYW1lc3BhY2UgY19nbGliIE9uZVdheVRlc3QKK25hbWVzcGFjZSBqYXZhIG9uZXdheXRlc3QKK25hbWVzcGFjZSBjcHAgb25ld2F5dGVzdAorbmFtZXNwYWNlIHJiIE9uZXdheXRlc3QKK25hbWVzcGFjZSBwZXJsIE9uZVdheVRlc3QKK25hbWVzcGFjZSBjc2hhcnAgT25ld2F5dGVzdAorbmFtZXNwYWNlIGpzIE9uZVdheVRlc3QKK25hbWVzcGFjZSBzdCBPbmVXYXlUZXN0CituYW1lc3BhY2UgcHkgT25lV2F5VGVzdAorbmFtZXNwYWNlIHB5LnR3aXN0ZWQgT25lV2F5VGVzdAorbmFtZXNwYWNlIGdvIG9uZXdheXRlc3QKK25hbWVzcGFjZSBwaHAgT25lV2F5VGVzdAorbmFtZXNwYWNlIGRlbHBoaSBPbmV3YXl0ZXN0CituYW1lc3BhY2UgY29jb2EgT25lV2F5VGVzdAorbmFtZXNwYWNlIGx1YSBPbmVXYXlUZXN0CituYW1lc3BhY2UgeHNkIHRlc3QgKHVyaSA9ICdodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvbnMvT25lV2F5VGVzdCcpCituYW1lc3BhY2UgbmV0Y29yZSBUaHJpZnRBc3luYy5PbmVXYXlUZXN0CisKKy8vIGEgbWluaW1hbCBUaHJpZnQgc2VydmljZSwgZm9yIHVzZSBpbiBPbmVXYXlIVFRQVHRlc3QuY3BwCitzZXJ2aWNlIE9uZVdheVNlcnZpY2UgeworICB2b2lkIHJvdW5kVHJpcFJQQygpLAorICBvbmV3YXkgdm9pZCBvbmVXYXlSUEMoKQorfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L09wZW5TU0xNYW51YWxJbml0VGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvT3BlblNTTE1hbnVhbEluaXRUZXN0LmNwcAppbmRleCA2YWZkN2NlLi5hMzBiMzAzIDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvT3BlblNTTE1hbnVhbEluaXRUZXN0LmNwcAorKysgYi9saWIvY3BwL3Rlc3QvT3BlblNTTE1hbnVhbEluaXRUZXN0LmNwcApAQCAtMjgsNyArMjgsNiBAQAogI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU1NMU29ja2V0Lmg+CiAKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKIAogdm9pZCBtYWtlX2lzb2xhdGVkX3NzbHNvY2tldGZhY3RvcnkoKSB7CkBAIC02Nyw2ICs2NiwyMCBAQAogICBvcGVuc3NsX2NsZWFudXAoKTsKIH0KIAorI2lmZGVmIEJPT1NUX1RFU1RfRFlOX0xJTksKK2Jvb2wgaW5pdF91bml0X3Rlc3Rfc3VpdGUoKSB7CisgIGJvb3N0Ojp1bml0X3Rlc3Q6OnRlc3Rfc3VpdGUqIHN1aXRlID0gJmJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazo6bWFzdGVyX3Rlc3Rfc3VpdGUoKTsKKyAgc3VpdGUtPnBfbmFtZS52YWx1ZSA9ICJPcGVuU1NMTWFudWFsSW5pdCI7CisKKyAgc3VpdGUtPmFkZChCT09TVF9URVNUX0NBU0UodGVzdF9vcGVuc3NsX2F2YWlsYWJpbGl0eSkpOworCisgIHJldHVybiB0cnVlOworfQorIAoraW50IG1haW4oIGludCBhcmdjLCBjaGFyKiBhcmd2W10gKSB7CisgIHJldHVybiA6OmJvb3N0Ojp1bml0X3Rlc3Q6OnVuaXRfdGVzdF9tYWluKCZpbml0X3VuaXRfdGVzdF9zdWl0ZSxhcmdjLGFyZ3YpOworfQorI2Vsc2UKIGJvb3N0Ojp1bml0X3Rlc3Q6OnRlc3Rfc3VpdGUqIGluaXRfdW5pdF90ZXN0X3N1aXRlKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKICAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShhcmdjKTsKICAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShhcmd2KTsKQEAgLTc3LDMgKzkwLDQgQEAKIAogICByZXR1cm4gTlVMTDsKIH0KKyNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9PcHRpb25hbFJlcXVpcmVkVGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvT3B0aW9uYWxSZXF1aXJlZFRlc3QuY3BwCmluZGV4IGIwZTVlZjcuLjRjNDM1NDYgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9PcHRpb25hbFJlcXVpcmVkVGVzdC5jcHAKKysrIGIvbGliL2NwcC90ZXN0L09wdGlvbmFsUmVxdWlyZWRUZXN0LmNwcApAQCAtNDAsNyArNDAsNyBAQAogdm9pZCB0cnl3cml0ZShjb25zdCBTdHJ1Y3QmIHMsIGJvb2wgc2hvdWxkX3dvcmspIHsKICAgYm9vbCB3b3JrZWQ7CiAgIHRyeSB7Ci0gICAgVEJpbmFyeVByb3RvY29sIHByb3RvY29sKGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUTWVtb3J5QnVmZmVyKSk7CisgICAgVEJpbmFyeVByb3RvY29sIHByb3RvY29sKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PihuZXcgVE1lbW9yeUJ1ZmZlcikpOwogICAgIHMud3JpdGUoJnByb3RvY29sKTsKICAgICB3b3JrZWQgPSB0cnVlOwogICB9IGNhdGNoIChUUHJvdG9jb2xFeGNlcHRpb24gJiBleCkgewpAQCAtNTIsNyArNTIsNyBAQAogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RydWN0MSwgdHlwZW5hbWUgU3RydWN0Mj4KIHZvaWQgd3JpdGVfdG9fcmVhZChjb25zdCBTdHJ1Y3QxJiB3LCBTdHJ1Y3QyJiByKSB7Ci0gIFRCaW5hcnlQcm90b2NvbCBwcm90b2NvbChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PihuZXcgVE1lbW9yeUJ1ZmZlcikpOworICBUQmluYXJ5UHJvdG9jb2wgcHJvdG9jb2woc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUTWVtb3J5QnVmZmVyKSk7CiAgIHcud3JpdGUoJnByb3RvY29sKTsKICAgci5yZWFkKCZwcm90b2NvbCk7CiB9CkBAIC0zMDMsNyArMzAzLDcgQEAKICAgbzEuaW1fYmlnLnB1c2hfYmFjayhteW1hcCk7CiAgIEJPT1NUX0NIRUNLKG8xID09IG8yKTsKIAotICBUQmluYXJ5UHJvdG9jb2wgcHJvdG9jb2woYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRNZW1vcnlCdWZmZXIpKTsKKyAgVEJpbmFyeVByb3RvY29sIHByb3RvY29sKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PihuZXcgVE1lbW9yeUJ1ZmZlcikpOwogICBvMS53cml0ZSgmcHJvdG9jb2wpOwogCiAgIG8xLmltX2JpZy5wdXNoX2JhY2sobXltYXApOwpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1JXTXV0ZXhTdGFydmVUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9SV011dGV4U3RhcnZlVGVzdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyYzE1MzEuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC90ZXN0L1JXTXV0ZXhTdGFydmVUZXN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgotI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KLQotI2luY2x1ZGUgInRocmlmdC9jb25jdXJyZW5jeS9NdXRleC5oIgotI2luY2x1ZGUgInRocmlmdC9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuaCIKLQotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Ci11c2luZyBib29zdDo6dW5pdF90ZXN0Ojp0ZXN0X3N1aXRlOwotdXNpbmcgYm9vc3Q6OnVuaXRfdGVzdDo6ZnJhbWV3b3JrOjptYXN0ZXJfdGVzdF9zdWl0ZTsKLQotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTsKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLWNsYXNzIExvY2tlciA6IHB1YmxpYyBSdW5uYWJsZSB7Ci1wcm90ZWN0ZWQ6Ci0gIExvY2tlcihib29zdDo6c2hhcmVkX3B0cjxSZWFkV3JpdGVNdXRleD4gcndsb2NrLCBib29sIHdyaXRlcikKLSAgICA6IHJ3bG9ja18ocndsb2NrKSwgd3JpdGVyXyh3cml0ZXIpLCBzdGFydGVkXyhmYWxzZSksIGdvdExvY2tfKGZhbHNlKSwgc2lnbmFsZWRfKGZhbHNlKSB7fQotCi1wdWJsaWM6Ci0gIHZpcnR1YWwgdm9pZCBydW4oKSB7Ci0gICAgc3RhcnRlZF8gPSB0cnVlOwotICAgIGlmICh3cml0ZXJfKSB7Ci0gICAgICByd2xvY2tfLT5hY3F1aXJlV3JpdGUoKTsKLSAgICB9IGVsc2UgewotICAgICAgcndsb2NrXy0+YWNxdWlyZVJlYWQoKTsKLSAgICB9Ci0gICAgZ290TG9ja18gPSB0cnVlOwotICAgIHdoaWxlICghc2lnbmFsZWRfKSB7Ci0gICAgICB1c2xlZXAoNTAwMCk7Ci0gICAgfQotICAgIHJ3bG9ja18tPnJlbGVhc2UoKTsKLSAgfQotCi0gIGJvb2wgc3RhcnRlZCgpIGNvbnN0IHsgcmV0dXJuIHN0YXJ0ZWRfOyB9Ci0gIGJvb2wgZ290TG9jaygpIGNvbnN0IHsgcmV0dXJuIGdvdExvY2tfOyB9Ci0gIHZvaWQgc2lnbmFsKCkgeyBzaWduYWxlZF8gPSB0cnVlOyB9Ci0KLXByb3RlY3RlZDoKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8UmVhZFdyaXRlTXV0ZXg+IHJ3bG9ja187Ci0gIGJvb2wgd3JpdGVyXzsKLSAgdm9sYXRpbGUgYm9vbCBzdGFydGVkXzsKLSAgdm9sYXRpbGUgYm9vbCBnb3RMb2NrXzsKLSAgdm9sYXRpbGUgYm9vbCBzaWduYWxlZF87Ci19OwotCi1jbGFzcyBSZWFkZXIgOiBwdWJsaWMgTG9ja2VyIHsKLXB1YmxpYzoKLSAgUmVhZGVyKGJvb3N0OjpzaGFyZWRfcHRyPFJlYWRXcml0ZU11dGV4PiByd2xvY2spIDogTG9ja2VyKHJ3bG9jaywgZmFsc2UpIHt9Ci19OwotCi1jbGFzcyBXcml0ZXIgOiBwdWJsaWMgTG9ja2VyIHsKLXB1YmxpYzoKLSAgV3JpdGVyKGJvb3N0OjpzaGFyZWRfcHRyPFJlYWRXcml0ZU11dGV4PiByd2xvY2spIDogTG9ja2VyKHJ3bG9jaywgdHJ1ZSkge30KLX07Ci0KLXZvaWQgdGVzdF9zdGFydmUoUG9zaXhUaHJlYWRGYWN0b3J5OjpQT0xJQ1kgcG9saWN5KSB7Ci0gIC8vIHRoZSBtYW4gcGFnZXMgZm9yIHB0aHJlYWRfd3Jsb2NrX3JkbG9jayBzdWdnZXN0IHRoYXQgYW55IE9TIGd1YXJhbnRlZSBhYm91dAotICAvLyB3cml0ZXIgc3RhcnZhdGlvbiBtYXkgYmUgaW5mbHVlbmNlZCBieSB0aGUgc2NoZWR1bGluZyBwb2xpY3ksIHNvIGxldCdzIHRyeQotICAvLyBhbGwgMyBwb2xpY2llcyB0byBzZWUgaWYgYW55IG9mIHRoZW0gd29yay4KLSAgUG9zaXhUaHJlYWRGYWN0b3J5IGZhY3RvcnkocG9saWN5KTsKLSAgZmFjdG9yeS5zZXREZXRhY2hlZChmYWxzZSk7Ci0KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8UmVhZFdyaXRlTXV0ZXg+IHJ3bG9jayhuZXcgTm9TdGFydmVSZWFkV3JpdGVNdXRleCgpKTsKLQotICBib29zdDo6c2hhcmVkX3B0cjxSZWFkZXI+IHJlYWRlcjEobmV3IFJlYWRlcihyd2xvY2spKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8UmVhZGVyPiByZWFkZXIyKG5ldyBSZWFkZXIocndsb2NrKSk7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFdyaXRlcj4gd3JpdGVyKG5ldyBXcml0ZXIocndsb2NrKSk7Ci0KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkPiB0cmVhZGVyMSA9IGZhY3RvcnkubmV3VGhyZWFkKHJlYWRlcjEpOwotICBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWQ+IHRyZWFkZXIyID0gZmFjdG9yeS5uZXdUaHJlYWQocmVhZGVyMik7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZD4gdHdyaXRlciA9IGZhY3RvcnkubmV3VGhyZWFkKHdyaXRlcik7Ci0KLSAgLy8gbGF1bmNoIGEgcmVhZGVyIGFuZCBtYWtlIHN1cmUgaGUgaGFzIHRoZSBsb2NrCi0gIHRyZWFkZXIxLT5zdGFydCgpOwotICB3aGlsZSAoIXJlYWRlcjEtPmdvdExvY2soKSkgewotICAgIHVzbGVlcCgyMDAwKTsKLSAgfQotCi0gIC8vIGxhdW5jaCBhIHdyaXRlciBhbmQgbWFrZSBzdXJlIGhlJ3MgYmxvY2tlZCBvbiB0aGUgbG9jawotICB0d3JpdGVyLT5zdGFydCgpOwotICB3aGlsZSAoIXdyaXRlci0+c3RhcnRlZCgpKSB7Ci0gICAgdXNsZWVwKDIwMDApOwotICB9Ci0gIC8vIHRyaWNreSBwYXJ0Li4uIHdlIGNhbiBuZXZlciBiZSAxMDAlIHN1cmUgdGhhdCB0aGUgd3JpdGVyIGlzIGFjdHVhbGx5Ci0gIC8vIGJsb2NrZWQgb24gdGhlIGxvY2ssIGJ1dCB3ZSBjYW4gcHJldHR5IHJlYXNvbmFibHkgc3VyZSBiZWNhdXNlIHdlIGtub3cKLSAgLy8gaGUganVzdCBleGVjdXRlZCB0aGUgbGluZSBpbW1lZGlhdGVseSBiZWZvcmUgZ2V0dGluZyB0aGUgbG9jaywgYW5kCi0gIC8vIHdlJ2xsIHdhaXQgYSBmdWxsIHNlY29uZCBmb3IgaGltIHRvIGdldCBvbiBpdC4KLSAgc2xlZXAoMSk7Ci0KLSAgLy8gbGF1bmNoIGEgc2Vjb25kIHJlYWRlci4uLiBpZiB0aGUgUldNdXRleCBndWFyYW50ZWVzIHRoYXQgd3JpdGVycyB3b24ndAotICAvLyBzdGFydmUsIHRoaXMgcmVhZGVyIHNob3VsZCBub3QgYmUgYWJsZSB0byBhY3F1aXJlIHRoZSBsb2NrIHVudGlsIHRoZSB3cml0ZXIKLSAgLy8gaGFzIGFjcXVpcmVkIGFuZCByZWxlYXNlZCBpdC4KLSAgdHJlYWRlcjItPnN0YXJ0KCk7Ci0gIHdoaWxlICghcmVhZGVyMi0+c3RhcnRlZCgpKSB7Ci0gICAgdXNsZWVwKDIwMDApOwotICB9Ci0gIC8vIGFnYWluLi4uIGNhbid0IGJlIDEwMCUgc3VyZSB0aGUgcmVhZGVyIGlzIHdhaXRpbmcgb24gKG9yIGhhcykgdGhlIGxvY2sKLSAgLy8gYnV0IHdlIGNhbiBiZSBjbG9zZS4KLSAgc2xlZXAoMSk7Ci0KLSAgLy8gdGVsbCByZWFkZXIgMSB0byBsZXQgZ28gb2YgdGhlIGxvY2sKLSAgcmVhZGVyMS0+c2lnbmFsKCk7Ci0KLSAgLy8gd2FpdCBmb3Igc29tZW9uZSB0byBnZXQgdGhlIGxvY2sKLSAgd2hpbGUgKCFyZWFkZXIyLT5nb3RMb2NrKCkgJiYgIXdyaXRlci0+Z290TG9jaygpKSB7Ci0gICAgdXNsZWVwKDIwMDApOwotICB9Ci0KLSAgLy8gdGhlIHRlc3Qgc3VjY2VlZGVkIGlmIHRoZSBXUklURVIgZ290IHRoZSBsb2NrLgotICBib29sIHN1Y2Nlc3MgPSB3cml0ZXItPmdvdExvY2soKTsKLQotICAvLyB0ZWxsIGV2ZXJ5b25lIHdlJ3JlIGRvbmUgYW5kIHdhaXQgZm9yIHRoZW0gdG8gZmluaXNoCi0gIHJlYWRlcjItPnNpZ25hbCgpOwotICB3cml0ZXItPnNpZ25hbCgpOwotICB0cmVhZGVyMS0+am9pbigpOwotICB0cmVhZGVyMi0+am9pbigpOwotICB0d3JpdGVyLT5qb2luKCk7Ci0KLSAgLy8gbWFrZSBzdXJlIGl0IHdvcmtlZC4KLSAgQk9PU1RfQ0hFQ0tfTUVTU0FHRShzdWNjZXNzLCAid3JpdGVyIGlzIHN0YXJ2aW5nIik7Ci19Ci0KLUJPT1NUX0FVVE9fVEVTVF9TVUlURShSV011dGV4U3RhcnZlVGVzdCkKLQotQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9zdGFydmVfb3RoZXIpIHsKLSAgdGVzdF9zdGFydmUoUG9zaXhUaHJlYWRGYWN0b3J5OjpPVEhFUik7Ci19Ci0KLUJPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfc3RhcnZlX3JyKSB7Ci0gIHRlc3Rfc3RhcnZlKFBvc2l4VGhyZWFkRmFjdG9yeTo6Uk9VTkRfUk9CSU4pOwotfQotCi1CT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X3N0YXJ2ZV9maWZvKSB7Ci0gIHRlc3Rfc3RhcnZlKFBvc2l4VGhyZWFkRmFjdG9yeTo6RklGTyk7Ci19Ci0KLUJPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1JlY3Vyc2l2ZVRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L1JlY3Vyc2l2ZVRlc3QuY3BwCmluZGV4IGUzZTNmNTAuLjE1ZjIzNGMgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9SZWN1cnNpdmVUZXN0LmNwcAorKysgYi9saWIvY3BwL3Rlc3QvUmVjdXJzaXZlVGVzdC5jcHAKQEAgLTIyLDIwICsyMiwyMSBAQAogICovCiAKICNpbmNsdWRlICJnZW4tY3BwL1JlY3Vyc2l2ZV90eXBlcy5oIgotI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KIAogI2RlZmluZSBCT09TVF9URVNUX01PRFVMRSBSZWN1cnNpdmVUZXN0CiAjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgogCiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUQmluYXJ5UHJvdG9jb2w7Ci11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKIAogQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9yZWN1cnNpdmVfMSkgewogICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKICAgc2hhcmVkX3B0cjxUQmluYXJ5UHJvdG9jb2w+IHByb3QobmV3IFRCaW5hcnlQcm90b2NvbChidWYpKTsKLSAgCisKICAgUmVjVHJlZSB0cmVlOwogICBSZWNUcmVlIGNoaWxkOwogICB0cmVlLmNoaWxkcmVuLnB1c2hfYmFjayhjaGlsZCk7CkBAIC01MCw5ICs1MSw5IEBACiBCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X3JlY3Vyc2l2ZV8yKSB7CiAgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmKG5ldyBUTWVtb3J5QnVmZmVyKCkpOwogICBzaGFyZWRfcHRyPFRCaW5hcnlQcm90b2NvbD4gcHJvdChuZXcgVEJpbmFyeVByb3RvY29sKGJ1ZikpOwotICAKKwogICBSZWNMaXN0IGw7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFJlY0xpc3Q+IGwyKG5ldyBSZWNMaXN0KTsKKyAgc2hhcmVkX3B0cjxSZWNMaXN0PiBsMihuZXcgUmVjTGlzdCk7CiAgIGwubmV4dGl0ZW0gPSBsMjsKIAogICBsLndyaXRlKHByb3QuZ2V0KCkpOwpAQCAtNjgsNyArNjksNyBAQAogICBzaGFyZWRfcHRyPFRCaW5hcnlQcm90b2NvbD4gcHJvdChuZXcgVEJpbmFyeVByb3RvY29sKGJ1ZikpOwogCiAgIENvUmVjIGM7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPENvUmVjMj4gcihuZXcgQ29SZWMyKTsKKyAgc2hhcmVkX3B0cjxDb1JlYzI+IHIobmV3IENvUmVjMik7CiAgIGMub3RoZXIgPSByOwogCiAgIGMud3JpdGUocHJvdC5nZXQoKSk7CkBAIC04Miw3ICs4Myw3IEBACiAgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmKG5ldyBUTWVtb3J5QnVmZmVyKCkpOwogICBzaGFyZWRfcHRyPFRCaW5hcnlQcm90b2NvbD4gcHJvdChuZXcgVEJpbmFyeVByb3RvY29sKGJ1ZikpOwogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFJlY0xpc3Q+IGRlcHRoTGltaXQobmV3IFJlY0xpc3QpOworICBzaGFyZWRfcHRyPFJlY0xpc3Q+IGRlcHRoTGltaXQobmV3IFJlY0xpc3QpOwogICBkZXB0aExpbWl0LT5uZXh0aXRlbSA9IGRlcHRoTGltaXQ7CiAgIEJPT1NUX0NIRUNLX1RIUk9XKGRlcHRoTGltaXQtPndyaXRlKHByb3QuZ2V0KCkpLAogICAgIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRXhjZXB0aW9uKTsKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9SZW5kZXJlZERvdWJsZUNvbnN0YW50c1Rlc3QuY3BwIGIvbGliL2NwcC90ZXN0L1JlbmRlcmVkRG91YmxlQ29uc3RhbnRzVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNhMDQyYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9SZW5kZXJlZERvdWJsZUNvbnN0YW50c1Rlc3QuY3BwCkBAIC0wLDAgKzEsMTIyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjZGVmaW5lIEVQU0lMT04gMC4wMDAwMDAxCisjaW5jbHVkZSA8dHlwZWluZGV4PgorI2luY2x1ZGUgPHR5cGVpbmZvPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImdlbi1jcHAvRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuaCIKK3VzaW5nIG5hbWVzcGFjZSB0aHJpZnQ6OnRlc3Q7CisKKyNkZWZpbmUgQk9PU1RfVEVTVF9NT0RVTEUgUmVuZGVyZWREb3VibGVDb25zdGFudHNUZXN0CisjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgorCitCT09TVF9BVVRPX1RFU1RfU1VJVEUoUmVuZGVyZWREb3VibGVDb25zdGFudHNUZXN0KQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X3JlbmRlcmVkX2RvdWJsZV9jb25zdGFudHMpIHsKKyAgICBjb25zdCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVCA9IDEuMDsKKyAgICBjb25zdCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVCA9IC0xMDAuMDsKKyAgICBjb25zdCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5UID0gOTIyMzM3MjAzNjg1NDc3NTgwNy4wOworICAgIGNvbnN0IGRvdWJsZSBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UID0gLTkyMjMzNzIwMzY4NTQ3NzU4MDcuMDsKKyAgICBjb25zdCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFMgPSAzLjE0MTU5MjY1MzU5OworICAgIGNvbnN0IGRvdWJsZSBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEUgPSAxMDAwMDAwLjE7CisgICAgY29uc3QgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRSA9IC0xMDAwMDAwLjE7CisgICAgY29uc3QgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEUgPSAxLjdlKzMwODsKKyAgICBjb25zdCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFID0gOTIyMzM3MjAzNjg1NDc3NTgxNi40MzsKKyAgICBjb25zdCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRSA9IC0xLjdlKzMwODsKKyAgICBjb25zdCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSA9IC05MjIzMzcyMDM2ODU0Nzc1ODE2LjQzOworICAgIEJPT1NUX0NIRUNLX0NMT1NFKAorICAgICAgICBnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlRfVEVTVCwKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVCwgRVBTSUxPTik7CisgICAgQk9PU1RfQ0hFQ0tfQ0xPU0UoCisgICAgICAgIGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVF9URVNULAorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5ULCBFUFNJTE9OKTsKKyAgICBCT09TVF9DSEVDS19DTE9TRSgKKyAgICAgICAgZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlRfVEVTVCwKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5ULCBFUFNJTE9OKTsKKyAgICBCT09TVF9DSEVDS19DTE9TRSgKKyAgICAgICAgZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UX1RFU1QsCisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlQsIEVQU0lMT04pOworICAgIEJPT1NUX0NIRUNLX0NMT1NFKAorICAgICAgICBnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTX1RFU1QsCisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTLCBFUFNJTE9OKTsKKyAgICBCT09TVF9DSEVDS19DTE9TRSgKKyAgICAgICAgZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCwKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFLCBFUFNJTE9OKTsKKyAgICBCT09TVF9DSEVDS19DTE9TRSgKKyAgICAgICAgZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCwKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFLCBFUFNJTE9OKTsKKyAgICBCT09TVF9DSEVDS19DTE9TRSgKKyAgICAgICAgZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFX1RFU1QsCisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEUsIEVQU0lMT04pOworICAgIEJPT1NUX0NIRUNLX0NMT1NFKAorICAgICAgICBnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNULAorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEUsIEVQU0lMT04pOworICAgIEJPT1NUX0NIRUNLX0NMT1NFKAorICAgICAgICBnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEVfVEVTVCwKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRSwgRVBTSUxPTik7CisgICAgQk9PU1RfQ0hFQ0tfQ0xPU0UoCisgICAgICAgIGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNULAorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFLCBFUFNJTE9OKTsKKyAgICBCT09TVF9DSEVDSygKKyAgICAgICAgdHlwZWlkKGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVF9URVNUKS5oYXNoX2NvZGUoKSA9PQorICAgICAgICB0eXBlaWQoRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVCkuaGFzaF9jb2RlKCkpOworICAgIEJPT1NUX0NIRUNLKAorICAgICAgICB0eXBlaWQoZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5UX1RFU1QpLmhhc2hfY29kZSgpID09CisgICAgICAgIHR5cGVpZChFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5UKS5oYXNoX2NvZGUoKSk7CisgICAgQk9PU1RfQ0hFQ0soCisgICAgICAgIHR5cGVpZChnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVF9URVNUKS5oYXNoX2NvZGUoKSA9PQorICAgICAgICB0eXBlaWQoRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5UKS5oYXNoX2NvZGUoKSk7CisgICAgQk9PU1RfQ0hFQ0soCisgICAgICAgIHR5cGVpZChnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlRfVEVTVCkuaGFzaF9jb2RlKCkgPT0KKyAgICAgICAgdHlwZWlkKEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlQpLmhhc2hfY29kZSgpKTsKKyAgICBCT09TVF9DSEVDSygKKyAgICAgICAgdHlwZWlkKGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFNfVEVTVCkuaGFzaF9jb2RlKCkgPT0KKyAgICAgICAgdHlwZWlkKEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTKS5oYXNoX2NvZGUoKSk7CisgICAgQk9PU1RfQ0hFQ0soCisgICAgICAgIHR5cGVpZChnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRV9URVNUKS5oYXNoX2NvZGUoKSA9PQorICAgICAgICB0eXBlaWQoRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFKS5oYXNoX2NvZGUoKSk7CisgICAgQk9PU1RfQ0hFQ0soCisgICAgICAgIHR5cGVpZChnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUKS5oYXNoX2NvZGUoKSA9PQorICAgICAgICB0eXBlaWQoRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFKS5oYXNoX2NvZGUoKSk7CisgICAgQk9PU1RfQ0hFQ0soCisgICAgICAgIHR5cGVpZChnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEVfVEVTVCkuaGFzaF9jb2RlKCkgPT0KKyAgICAgICAgdHlwZWlkKEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEUpLmhhc2hfY29kZSgpKTsKKyAgICBCT09TVF9DSEVDSygKKyAgICAgICAgdHlwZWlkKGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpLmhhc2hfY29kZSgpID09CisgICAgICAgIHR5cGVpZChFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEUpLmhhc2hfY29kZSgpKTsKKyAgICBCT09TVF9DSEVDSygKKyAgICAgICAgdHlwZWlkKGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRV9URVNUKS5oYXNoX2NvZGUoKSA9PQorICAgICAgICB0eXBlaWQoRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRSkuaGFzaF9jb2RlKCkpOworICAgIEJPT1NUX0NIRUNLKAorICAgICAgICB0eXBlaWQoZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpCisgICAgICAgICAgICAuaGFzaF9jb2RlKCkgPT0KKyAgICAgICAgdHlwZWlkKEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEUpLmhhc2hfY29kZSgpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9yZW5kZXJlZF9kb3VibGVfbGlzdCkgeworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGRvdWJsZT4gRVhQRUNURURfRE9VQkxFX0xJU1R7MS4wLC0xMDAuMCwxMDAuMCw5MjIzMzcyMDM2ODU0Nzc1ODA3LjAsLTkyMjMzNzIwMzY4NTQ3NzU4MDcuMCwKKyAgICAgICAgMy4xNDE1OTI2NTM1OSwxMDAwMDAwLjEsLTEwMDAwMDAuMSwxLjdlKzMwOCwtMS43ZSszMDgsOTIyMzM3MjAzNjg1NDc3NTgxNi40MywtOTIyMzM3MjAzNjg1NDc3NTgxNi40M307CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfTElTVF9URVNULnNpemUoKSwgRVhQRUNURURfRE9VQkxFX0xJU1Quc2l6ZSgpKTsKKyAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IEVYUEVDVEVEX0RPVUJMRV9MSVNULnNpemUoKTsgKytpKSB7CisgICAgICAgIEJPT1NUX0NIRUNLX0NMT1NFKGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0xJU1RfVEVTVFtpXSwgRVhQRUNURURfRE9VQkxFX0xJU1RbaV0sIEVQU0lMT04pOworICAgIH0KK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvU2VjdXJpdHlUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9TZWN1cml0eVRlc3QuY3BwCmluZGV4IDIxM2VmZDQuLjk4MmE0ZjMgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9TZWN1cml0eVRlc3QuY3BwCisrKyBiL2xpYi9jcHAvdGVzdC9TZWN1cml0eVRlc3QuY3BwCkBAIC0xOSwxOSArMTksMTYgQEAKIAogI2RlZmluZSBCT09TVF9URVNUX01PRFVMRSBTZWN1cml0eVRlc3QKICNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+Ci0jaW5jbHVkZSA8Ym9vc3QvYmluZC5ocHA+CiAjaW5jbHVkZSA8Ym9vc3QvZmlsZXN5c3RlbS5ocHA+CiAjaW5jbHVkZSA8Ym9vc3QvZm9yZWFjaC5ocHA+CiAjaW5jbHVkZSA8Ym9vc3QvZm9ybWF0LmhwcD4KLSNpbmNsdWRlIDxib29zdC9tYWtlX3NoYXJlZC5ocHA+Ci0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+CiAjaW5jbHVkZSA8Ym9vc3QvdGhyZWFkLmhwcD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU1NMU2VydmVyU29ja2V0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU1NMU29ja2V0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+Ci0jaW5jbHVkZSAiVGVzdFBvcnRGaXh0dXJlLmgiCiAjaW5jbHVkZSA8dmVjdG9yPgotI2lmZGVmIGxpbnV4CisjaWZkZWYgX19saW51eF9fCiAjaW5jbHVkZSA8c2lnbmFsLmg+CiAjZW5kaWYKIApAQCAtNDMsNiArNDAsOSBAQAogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5OwogCit1c2luZyBzdGQ6OmJpbmQ7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CisKIGJvb3N0OjpmaWxlc3lzdGVtOjpwYXRoIGtleURpcjsKIGJvb3N0OjpmaWxlc3lzdGVtOjpwYXRoIGNlcnRGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSkKIHsKQEAgLTU1LDM2ICs1NSwzNiBAQAogICAgIEdsb2JhbEZpeHR1cmUoKQogICAgIHsKICAgICAgICAgdXNpbmcgbmFtZXNwYWNlIGJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXN0ZXJfdGVzdF9zdWl0ZSgpLmFyZ2M7ICsraSkKLQkJewotCQkJQk9PU1RfVEVTVF9NRVNTQUdFKGJvb3N0Ojpmb3JtYXQoImFyZ3ZbJTElXSA9IFwiJTIlXCIiKSAlIGkgJSBtYXN0ZXJfdGVzdF9zdWl0ZSgpLmFyZ3ZbaV0pOwotCQl9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXN0ZXJfdGVzdF9zdWl0ZSgpLmFyZ2M7ICsraSkKKyAgICB7CisgICAgICBCT09TVF9URVNUX01FU1NBR0UoYm9vc3Q6OmZvcm1hdCgiYXJndlslMSVdID0gXCIlMiVcIiIpICUgaSAlIG1hc3Rlcl90ZXN0X3N1aXRlKCkuYXJndltpXSk7CisgICAgfQogCi0gICAgI2lmZGVmIGxpbnV4Ci0JCS8vIE9wZW5TU0wgY2FsbHMgc2VuZCgpIHdpdGhvdXQgTVNHX05PU0lHUElQRSBzbyB3cml0aW5nIHRvIGEgc29ja2V0IHRoYXQgaGFzCi0JCS8vIGRpc2Nvbm5lY3RlZCBjYW4gY2F1c2UgYSBTSUdQSVBFIHNpZ25hbC4uLgotCQlzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7CisgICAgI2lmZGVmIF9fbGludXhfXworICAgIC8vIE9wZW5TU0wgY2FsbHMgc2VuZCgpIHdpdGhvdXQgTVNHX05PU0lHUElQRSBzbyB3cml0aW5nIHRvIGEgc29ja2V0IHRoYXQgaGFzCisgICAgLy8gZGlzY29ubmVjdGVkIGNhbiBjYXVzZSBhIFNJR1BJUEUgc2lnbmFsLi4uCisgICAgc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOwogICAgICNlbmRpZgogCi0JCVRTU0xTb2NrZXRGYWN0b3J5OjpzZXRNYW51YWxPcGVuU1NMSW5pdGlhbGl6YXRpb24odHJ1ZSk7Ci0JCWFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OmluaXRpYWxpemVPcGVuU1NMKCk7CisgICAgVFNTTFNvY2tldEZhY3Rvcnk6OnNldE1hbnVhbE9wZW5TU0xJbml0aWFsaXphdGlvbih0cnVlKTsKKyAgICBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0Ojppbml0aWFsaXplT3BlblNTTCgpOwogCi0JCWtleURpciA9IGJvb3N0OjpmaWxlc3lzdGVtOjpjdXJyZW50X3BhdGgoKS5wYXJlbnRfcGF0aCgpLnBhcmVudF9wYXRoKCkucGFyZW50X3BhdGgoKSAvICJ0ZXN0IiAvICJrZXlzIjsKLQkJaWYgKCFib29zdDo6ZmlsZXN5c3RlbTo6ZXhpc3RzKGNlcnRGaWxlKCJzZXJ2ZXIuY3J0IikpKQotCQl7Ci0JCQlrZXlEaXIgPSBib29zdDo6ZmlsZXN5c3RlbTo6cGF0aChtYXN0ZXJfdGVzdF9zdWl0ZSgpLmFyZ3ZbbWFzdGVyX3Rlc3Rfc3VpdGUoKS5hcmdjIC0gMV0pOwotCQkJaWYgKCFib29zdDo6ZmlsZXN5c3RlbTo6ZXhpc3RzKGNlcnRGaWxlKCJzZXJ2ZXIuY3J0IikpKQotCQkJewotCQkJCXRocm93IHN0ZDo6aW52YWxpZF9hcmd1bWVudCgiVGhlIGxhc3QgYXJndW1lbnQgdG8gdGhpcyB0ZXN0IG11c3QgYmUgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSB0ZXN0IGNlcnRpZmljYXRlKHMpLiIpOwotCQkJfQotCQl9CisgICAga2V5RGlyID0gYm9vc3Q6OmZpbGVzeXN0ZW06OmN1cnJlbnRfcGF0aCgpLnBhcmVudF9wYXRoKCkucGFyZW50X3BhdGgoKS5wYXJlbnRfcGF0aCgpIC8gInRlc3QiIC8gImtleXMiOworICAgIGlmICghYm9vc3Q6OmZpbGVzeXN0ZW06OmV4aXN0cyhjZXJ0RmlsZSgic2VydmVyLmNydCIpKSkKKyAgICB7CisgICAgICBrZXlEaXIgPSBib29zdDo6ZmlsZXN5c3RlbTo6cGF0aChtYXN0ZXJfdGVzdF9zdWl0ZSgpLmFyZ3ZbbWFzdGVyX3Rlc3Rfc3VpdGUoKS5hcmdjIC0gMV0pOworICAgICAgaWYgKCFib29zdDo6ZmlsZXN5c3RlbTo6ZXhpc3RzKGNlcnRGaWxlKCJzZXJ2ZXIuY3J0IikpKQorICAgICAgeworICAgICAgICB0aHJvdyBzdGQ6OmludmFsaWRfYXJndW1lbnQoIlRoZSBsYXN0IGFyZ3VtZW50IHRvIHRoaXMgdGVzdCBtdXN0IGJlIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgdGVzdCBjZXJ0aWZpY2F0ZShzKS4iKTsKKyAgICAgIH0KKyAgICB9CiAgICAgfQogCiAgICAgdmlydHVhbCB+R2xvYmFsRml4dHVyZSgpCiAgICAgewotCQlhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpjbGVhbnVwT3BlblNTTCgpOwotI2lmZGVmIGxpbnV4Ci0JCXNpZ25hbChTSUdQSVBFLCBTSUdfREZMKTsKKyAgICBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpjbGVhbnVwT3BlblNTTCgpOworI2lmZGVmIF9fbGludXhfXworICAgIHNpZ25hbChTSUdQSVBFLCBTSUdfREZMKTsKICNlbmRpZgogICAgIH0KIH07CkBAIC05NSw3ICs5NSw3IEBACiBCT09TVF9HTE9CQUxfRklYVFVSRShHbG9iYWxGaXh0dXJlKQogI2VuZGlmCiAKLXN0cnVjdCBTZWN1cml0eUZpeHR1cmUgOiBwdWJsaWMgVGVzdFBvcnRGaXh0dXJlCitzdHJ1Y3QgU2VjdXJpdHlGaXh0dXJlCiB7CiAgICAgdm9pZCBzZXJ2ZXIoYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6U1NMUHJvdG9jb2wgcHJvdG9jb2wpCiAgICAgewpAQCAtMTAzLDIwICsxMDMsMjEgQEAKICAgICAgICAgewogICAgICAgICAgICAgYm9vc3Q6Om11dGV4OjpzY29wZWRfbG9jayBsb2NrKG1NdXRleCk7CiAKLSAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBwU2VydmVyU29ja2V0RmFjdG9yeTsKLSAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRTU0xTZXJ2ZXJTb2NrZXQ+IHBTZXJ2ZXJTb2NrZXQ7CisgICAgICAgICAgICBzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBwU2VydmVyU29ja2V0RmFjdG9yeTsKKyAgICAgICAgICAgIHNoYXJlZF9wdHI8VFNTTFNlcnZlclNvY2tldD4gcFNlcnZlclNvY2tldDsKIAogICAgICAgICAgICAgcFNlcnZlclNvY2tldEZhY3RvcnkucmVzZXQobmV3IFRTU0xTb2NrZXRGYWN0b3J5KHN0YXRpY19jYXN0PGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlNTTFByb3RvY29sPihwcm90b2NvbCkpKTsKICAgICAgICAgICAgIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5LT5jaXBoZXJzKCJBTEw6IUFESDohTE9XOiFFWFA6IU1ENTpAU1RSRU5HVEgiKTsKLSAgICAgICAgICAgIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5LT5sb2FkQ2VydGlmaWNhdGUoY2VydEZpbGUoInNlcnZlci5jcnQiKS5uYXRpdmUoKS5jX3N0cigpKTsKLSAgICAgICAgICAgIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5LT5sb2FkUHJpdmF0ZUtleShjZXJ0RmlsZSgic2VydmVyLmtleSIpLm5hdGl2ZSgpLmNfc3RyKCkpOworICAgICAgICAgICAgcFNlcnZlclNvY2tldEZhY3RvcnktPmxvYWRDZXJ0aWZpY2F0ZShjZXJ0RmlsZSgic2VydmVyLmNydCIpLnN0cmluZygpLmNfc3RyKCkpOworICAgICAgICAgICAgcFNlcnZlclNvY2tldEZhY3RvcnktPmxvYWRQcml2YXRlS2V5KGNlcnRGaWxlKCJzZXJ2ZXIua2V5Iikuc3RyaW5nKCkuY19zdHIoKSk7CiAgICAgICAgICAgICBwU2VydmVyU29ja2V0RmFjdG9yeS0+c2VydmVyKHRydWUpOwotICAgICAgICAgICAgcFNlcnZlclNvY2tldC5yZXNldChuZXcgVFNTTFNlcnZlclNvY2tldCgibG9jYWxob3N0IiwgbV9zZXJ2ZXJQb3J0LCBwU2VydmVyU29ja2V0RmFjdG9yeSkpOwotICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gY29ubmVjdGVkQ2xpZW50OworICAgICAgICAgICAgcFNlcnZlclNvY2tldC5yZXNldChuZXcgVFNTTFNlcnZlclNvY2tldCgibG9jYWxob3N0IiwgMCwgcFNlcnZlclNvY2tldEZhY3RvcnkpKTsKKyAgICAgICAgICAgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gY29ubmVjdGVkQ2xpZW50OwogCiAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBwU2VydmVyU29ja2V0LT5saXN0ZW4oKTsKKyAgICAgICAgICAgICAgICBtUG9ydCA9IHBTZXJ2ZXJTb2NrZXQtPmdldFBvcnQoKTsKICAgICAgICAgICAgICAgICBtQ1Zhci5ub3RpZnlfb25lKCk7CiAgICAgICAgICAgICAgICAgbG9jay51bmxvY2soKTsKIApAQCAtMTUzLDE3ICsxNTQsMTcgQEAKICAgICB7CiAgICAgICAgIHRyeQogICAgICAgICB7Ci0gICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gcENsaWVudFNvY2tldEZhY3Rvcnk7Ci0gICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBwQ2xpZW50U29ja2V0OworICAgICAgICAgICAgc2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gcENsaWVudFNvY2tldEZhY3Rvcnk7CisgICAgICAgICAgICBzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IHBDbGllbnRTb2NrZXQ7CiAKICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHBDbGllbnRTb2NrZXRGYWN0b3J5LnJlc2V0KG5ldyBUU1NMU29ja2V0RmFjdG9yeShzdGF0aWNfY2FzdDxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpTU0xQcm90b2NvbD4ocHJvdG9jb2wpKSk7CiAgICAgICAgICAgICAgICAgcENsaWVudFNvY2tldEZhY3RvcnktPmF1dGhlbnRpY2F0ZSh0cnVlKTsKLSAgICAgICAgICAgICAgICBwQ2xpZW50U29ja2V0RmFjdG9yeS0+bG9hZENlcnRpZmljYXRlKGNlcnRGaWxlKCJjbGllbnQuY3J0IikubmF0aXZlKCkuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgcENsaWVudFNvY2tldEZhY3RvcnktPmxvYWRQcml2YXRlS2V5KGNlcnRGaWxlKCJjbGllbnQua2V5IikubmF0aXZlKCkuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgcENsaWVudFNvY2tldEZhY3RvcnktPmxvYWRUcnVzdGVkQ2VydGlmaWNhdGVzKGNlcnRGaWxlKCJDQS5wZW0iKS5uYXRpdmUoKS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICBwQ2xpZW50U29ja2V0ID0gcENsaWVudFNvY2tldEZhY3RvcnktPmNyZWF0ZVNvY2tldCgibG9jYWxob3N0IiwgbV9zZXJ2ZXJQb3J0KTsKKyAgICAgICAgICAgICAgICBwQ2xpZW50U29ja2V0RmFjdG9yeS0+bG9hZENlcnRpZmljYXRlKGNlcnRGaWxlKCJjbGllbnQuY3J0Iikuc3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgcENsaWVudFNvY2tldEZhY3RvcnktPmxvYWRQcml2YXRlS2V5KGNlcnRGaWxlKCJjbGllbnQua2V5Iikuc3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgcENsaWVudFNvY2tldEZhY3RvcnktPmxvYWRUcnVzdGVkQ2VydGlmaWNhdGVzKGNlcnRGaWxlKCJDQS5wZW0iKS5zdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBwQ2xpZW50U29ja2V0ID0gcENsaWVudFNvY2tldEZhY3RvcnktPmNyZWF0ZVNvY2tldCgibG9jYWxob3N0IiwgbVBvcnQpOwogICAgICAgICAgICAgICAgIHBDbGllbnRTb2NrZXQtPm9wZW4oKTsKIAogICAgICAgICAgICAgICAgIHVpbnQ4X3QgYnVmWzNdOwpAQCAtMjA3LDYgKzIwOCw3IEBACiAKICAgICBib29zdDo6bXV0ZXggbU11dGV4OwogICAgIGJvb3N0Ojpjb25kaXRpb25fdmFyaWFibGUgbUNWYXI7CisgICAgaW50IG1Qb3J0OwogICAgIGJvb2wgbUNvbm5lY3RlZDsKIH07CiAKQEAgLTIzOSwxNyArMjQxLDI2IEBACiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KIAorI2lmZGVmIE9QRU5TU0xfTk9fU1NMMworICAgICAgICAgICAgICAgIGlmIChzaSA9PSAyIHx8IGNpID09IDIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIGFsbCBTU0x2MyBjYXNlcyAtIHByb3RvY29sIG5vdCBzdXBwb3J0ZWQKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmCisKICAgICAgICAgICAgICAgICBib29zdDo6bXV0ZXg6OnNjb3BlZF9sb2NrIGxvY2sobU11dGV4KTsKIAogICAgICAgICAgICAgICAgIEJPT1NUX1RFU1RfTUVTU0FHRShib29zdDo6Zm9ybWF0KCJURVNUOiBTZXJ2ZXIgPSAlMSUsIENsaWVudCA9ICUyJSIpCiAgICAgICAgICAgICAgICAgICAgICUgcHJvdG9jb2wyc3RyKHNpKSAlIHByb3RvY29sMnN0cihjaSkpOwogCiAgICAgICAgICAgICAgICAgbUNvbm5lY3RlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIC8vIHRocmVhZF9ncm91cCBtYW5hZ2VzIHRoZSB0aHJlYWQgbGlmZXRpbWUgLSBpZ25vcmUgdGhlIHJldHVybiB2YWx1ZSBvZiBjcmVhdGVfdGhyZWFkCiAgICAgICAgICAgICAgICAgYm9vc3Q6OnRocmVhZF9ncm91cCB0aHJlYWRzOwotICAgICAgICAgICAgICAgIHRocmVhZHMuY3JlYXRlX3RocmVhZChib29zdDo6YmluZCgmU2VjdXJpdHlGaXh0dXJlOjpzZXJ2ZXIsIHRoaXMsIHN0YXRpY19jYXN0PGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlNTTFByb3RvY29sPihzaSkpKTsKKyAgICAgICAgICAgICAgICAodm9pZCl0aHJlYWRzLmNyZWF0ZV90aHJlYWQoYmluZCgmU2VjdXJpdHlGaXh0dXJlOjpzZXJ2ZXIsIHRoaXMsIHN0YXRpY19jYXN0PGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlNTTFByb3RvY29sPihzaSkpKTsKICAgICAgICAgICAgICAgICBtQ1Zhci53YWl0KGxvY2spOyAgICAgICAgICAgLy8gd2FpdCBmb3IgbGlzdGVuKCkgdG8gc3VjY2VlZAogICAgICAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7Ci0gICAgICAgICAgICAgICAgdGhyZWFkcy5jcmVhdGVfdGhyZWFkKGJvb3N0OjpiaW5kKCZTZWN1cml0eUZpeHR1cmU6OmNsaWVudCwgdGhpcywgc3RhdGljX2Nhc3Q8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6U1NMUHJvdG9jb2w+KGNpKSkpOworICAgICAgICAgICAgICAgICh2b2lkKXRocmVhZHMuY3JlYXRlX3RocmVhZChiaW5kKCZTZWN1cml0eUZpeHR1cmU6OmNsaWVudCwgdGhpcywgc3RhdGljX2Nhc3Q8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6U1NMUHJvdG9jb2w+KGNpKSkpOwogICAgICAgICAgICAgICAgIHRocmVhZHMuam9pbl9hbGwoKTsKIAogICAgICAgICAgICAgICAgIEJPT1NUX0NIRUNLX01FU1NBR0UobUNvbm5lY3RlZCA9PSBtYXRyaXhbY2ldW3NpXSwKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9TcGVjaWFsaXphdGlvblRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L1NwZWNpYWxpemF0aW9uVGVzdC5jcHAKaW5kZXggZTg1MWJhYy4uMDA4ODM3ZCAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L1NwZWNpYWxpemF0aW9uVGVzdC5jcHAKKysrIGIvbGliL2NwcC90ZXN0L1NwZWNpYWxpemF0aW9uVGVzdC5jcHAKQEAgLTgyLDggKzgyLDggQEAKICAgc3RhZ2UyLmJhY2soKS5tZXNzYWdlID0gIm5ldmVybW9yZSI7CiAgIGhtLmJvbmtzWyJwb2UiXSA9IHN0YWdlMjsKIAotICBib29zdDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoKSk7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG8obmV3IE15UHJvdG9jb2woYnVmZmVyKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvKG5ldyBNeVByb3RvY29sKGJ1ZmZlcikpOwogCiAgIG9vZS53cml0ZShwcm90by5nZXQoKSk7CiAgIE9uZU9mRWFjaCBvb2UyOwpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1RCdWZmZXJCYXNlVGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvVEJ1ZmZlckJhc2VUZXN0LmNwcAppbmRleCA1ZDBiZjQ1Li40MzAzMDJjIDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvVEJ1ZmZlckJhc2VUZXN0LmNwcAorKysgYi9saWIvY3BwL3Rlc3QvVEJ1ZmZlckJhc2VUZXN0LmNwcApAQCAtMjEsMTMgKzIxLDE0IEBACiAjaW5jbHVkZSA8Ym9vc3QvdGVzdC9hdXRvX3VuaXRfdGVzdC5ocHA+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNob3J0UmVhZFRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPG1lbW9yeT4KIAotdXNpbmcgc3RkOjpzdHJpbmc7Ci11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUQnVmZmVyZWRUcmFuc3BvcnQ7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpURnJhbWVkVHJhbnNwb3J0OwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6dGVzdDo6VFNob3J0UmVhZFRyYW5zcG9ydDsKK3VzaW5nIHN0ZDo6c3RyaW5nOwogCiAvLyBTaGFtZWxlc3NseSBjb3BpZWQgZnJvbSBabGliVHJhbnNwb3J0LiAgVE9ETzogcmVmYWN0b3IuCiB1bnNpZ25lZCBpbnQgZGlzdFtdWzUwMDBdID0gewpAQCAtNTY2LDcgKzU2Nyw3IEBACiAgICAgICBmb3IgKGludCBkMSA9IDA7IGQxIDwgMzsgZDErKykgewogICAgICAgICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZmZlcihuZXcgVE1lbW9yeUJ1ZmZlcigxNikpOwogICAgICAgICBURnJhbWVkVHJhbnNwb3J0IHRyYW5zKGJ1ZmZlciwgc2l6ZSk7Ci0gICAgICAgIHVpbnQ4X3QgZGF0YV9vdXRbMTw8MTVdOworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhX291dCgxPDwxNywgMCk7CiAgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gZmx1c2hfc2l6ZXM7CiAKICAgICAgICAgaW50IHdyaXRlX29mZnNldCA9IDA7CkBAIC02MDQsNyArNjA1LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIEJPT1NUX0NIRUNLX0VRVUFMKCh1bnNpZ25lZCBpbnQpcmVhZF9vZmZzZXQsIHNpemVvZihkYXRhKSk7Ci0gICAgICAgIEJPT1NUX0NIRUNLKCFtZW1jbXAoZGF0YSwgZGF0YV9vdXQsIHNpemVvZihkYXRhKSkpOworICAgICAgICBCT09TVF9DSEVDSyghbWVtY21wKGRhdGEsICZkYXRhX291dFswXSwgc2l6ZW9mKGRhdGEpKSk7CiAgICAgICB9CiAgICAgfQogICB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvVEZpbGVUcmFuc3BvcnRUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9URmlsZVRyYW5zcG9ydFRlc3QuY3BwCmluZGV4IDI5NGM5YTYuLmQwYzI2YjMgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9URmlsZVRyYW5zcG9ydFRlc3QuY3BwCisrKyBiL2xpYi9jcHAvdGVzdC9URmlsZVRyYW5zcG9ydFRlc3QuY3BwCkBAIC0zMCw2ICszMCwxNCBAQAogCiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5oPgogCisjaWZkZWYgX19NSU5HVzMyX18KKyAgI2luY2x1ZGUgPGlvLmg+CisgICNpbmNsdWRlIDx1bmlzdGQuaD4KKyAgI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorICAjaW5jbHVkZSA8ZmNudGwuaD4KKyAgI2luY2x1ZGUgPHN5c1xzdGF0Lmg+CisjZW5kaWYKKwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNDUsMjAgKzUzLDYgQEAKICAqIEhlbHBlciBjb2RlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLS8vIFByb3ZpZGUgQk9PU1RfV0FSTl9MVCgpIGFuZCBCT09TVF9XQVJOX0dUKCksIGluIGNhc2Ugd2UncmUgY29tcGlsZWQKLS8vIHdpdGggYW4gb2xkZXIgdmVyc2lvbiBvZiBib29zdAotI2lmbmRlZiBCT09TVF9XQVJOX0xUCi0jZGVmaW5lIEJPT1NUX1dBUk5fQ01QKGEsIGIsIG9wLCBjaGVja19mbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNoZWNrX2ZuKChhKW9wKGIpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICJjaGVjayAiIEJPT1NUX1NUUklOR0laRShhKSAiICIgQk9PU1RfU1RSSU5HSVpFKG9wKSAiICIgQk9PU1RfU1RSSU5HSVpFKCAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICBiKSAiIGZhaWxlZDogIiBCT09TVF9TVFJJTkdJWkUoYSkgIj0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIDw8IChhKSA8PCAiICIgQk9PU1RfU1RSSU5HSVpFKGIpICI9IiA8PCAoYikpCi0KLSNkZWZpbmUgQk9PU1RfV0FSTl9MVChhLCBiKSBCT09TVF9XQVJOX0NNUChhLCBiLCA8LCBCT09TVF9XQVJOX01FU1NBR0UpCi0jZGVmaW5lIEJPT1NUX1dBUk5fR1QoYSwgYikgQk9PU1RfV0FSTl9DTVAoYSwgYiwgPiwgQk9PU1RfV0FSTl9NRVNTQUdFKQotI2RlZmluZSBCT09TVF9XQVJOX0xUKGEsIGIpIEJPT1NUX1dBUk5fQ01QKGEsIGIsIDwsIEJPT1NUX1dBUk5fTUVTU0FHRSkKLSNlbmRpZiAvLyBCT09TVF9XQVJOX0xUCi0KIC8qKgogICogQ2xhc3MgdG8gcmVjb3JkIGNhbGxzIHRvIGZzeW5jCiAgKi8KQEAgLTc1LDcgKzY5LDcgQEAKICAgdm9pZCBmc3luYyhpbnQgZmQpIHsKICAgICAodm9pZClmZDsKICAgICBGc3luY0NhbGwgY2FsbDsKLSAgICBnZXR0aW1lb2ZkYXkoJmNhbGwudGltZSwgTlVMTCk7CisgICAgVEhSSUZUX0dFVFRJTUVPRkRBWSgmY2FsbC50aW1lLCBOVUxMKTsKICAgICBjYWxsc18ucHVzaF9iYWNrKGNhbGwpOwogICB9CiAKQEAgLTkxLDYgKzg1LDIwIEBACiBjbGFzcyBUZW1wRmlsZSB7CiBwdWJsaWM6CiAgIFRlbXBGaWxlKGNvbnN0IGNoYXIqIGRpcmVjdG9yeSwgY29uc3QgY2hhciogcHJlZml4KSB7CisgICNpZmRlZiBfX01JTkdXMzJfXworICAgICgodm9pZClkaXJlY3RvcnkpOworICAgIHNpemVfdCBwYXRoX2xlbiA9IHN0cmxlbihwcmVmaXgpICsgODsKKyAgICBwYXRoXyA9IG5ldyBjaGFyW3BhdGhfbGVuXTsKKyAgICBzbnByaW50ZihwYXRoXywgcGF0aF9sZW4sICIlc1hYWFhYWCIsIHByZWZpeCk7CisgICAgaWYgKF9ta3RlbXBfcyhwYXRoXyxwYXRoX2xlbikgPT0gMCkgeworICAgICAgZmRfID0gb3BlbihwYXRoXyxPX0NSRUFUIHwgT19SRFdSIHwgT19CSU5BUlksU19JUkVBRCB8IFNfSVdSSVRFKTsKKyAgICAgIGlmIChmZF8gPCAwKSB7CisgICAgICAgIHRocm93IGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKCJfbWt0ZW1wX3MoKSBmYWlsZWQiKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24oIl9ta3RlbXBfcygpIGZhaWxlZCIpOworICAgIH0KKyAgI2Vsc2UKICAgICBzaXplX3QgcGF0aF9sZW4gPSBzdHJsZW4oZGlyZWN0b3J5KSArIHN0cmxlbihwcmVmaXgpICsgODsKICAgICBwYXRoXyA9IG5ldyBjaGFyW3BhdGhfbGVuXTsKICAgICBzbnByaW50ZihwYXRoXywgcGF0aF9sZW4sICIlcy8lc1hYWFhYWCIsIGRpcmVjdG9yeSwgcHJlZml4KTsKQEAgLTk5LDYgKzEwNyw3IEBACiAgICAgaWYgKGZkXyA8IDApIHsKICAgICAgIHRocm93IGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKCJta3N0ZW1wKCkgZmFpbGVkIik7CiAgICAgfQorICAjZW5kaWYKICAgfQogCiAgIH5UZW1wRmlsZSgpIHsKQEAgLTE2Nyw3ICsxNzYsNyBAQAogCiAgIHVuc2lnbmVkIGludCBudW1fb3ZlciA9IDA7CiAgIGZvciAodW5zaWduZWQgaW50IG4gPSAwOyBuIDwgTlVNX0lURVJBVElPTlM7ICsrbikgewotICAgIGZ0cnVuY2F0ZShmLmdldEZEKCksIDApOworICAgIEJPT1NUX0NIRUNLX0VRVUFMKDAsIGZ0cnVuY2F0ZShmLmdldEZEKCksIDApKTsKIAogICAgIFRGaWxlVHJhbnNwb3J0KiB0cmFuc3BvcnQgPSBuZXcgVEZpbGVUcmFuc3BvcnQoZi5nZXRQYXRoKCkpOwogCkBAIC0xODYsMTYgKzE5NSwxNiBAQAogICAgIHN0cnVjdCB0aW1ldmFsIHN0YXJ0OwogICAgIHN0cnVjdCB0aW1ldmFsIGVuZDsKIAotICAgIGdldHRpbWVvZmRheSgmc3RhcnQsIE5VTEwpOworICAgIFRIUklGVF9HRVRUSU1FT0ZEQVkoJnN0YXJ0LCBOVUxMKTsKICAgICBkZWxldGUgdHJhbnNwb3J0OwotICAgIGdldHRpbWVvZmRheSgmZW5kLCBOVUxMKTsKKyAgICBUSFJJRlRfR0VUVElNRU9GREFZKCZlbmQsIE5VTEwpOwogCiAgICAgaW50IGRlbHRhID0gdGltZV9kaWZmKCZzdGFydCwgJmVuZCk7CiAKICAgICAvLyBJZiBhbnkgYXR0ZW1wdCB0YWtlcyBtb3JlIHRoYW4gNTAwbXMsIHRyZWF0IHRoYXQgYXMgYSBmYWlsdXJlLgogICAgIC8vIFRyZWF0IHRoaXMgYXMgYSBmYXRhbCBmYWlsdXJlLCBzbyB3ZSdsbCByZXR1cm4gbm93IGluc3RlYWQgb2YKICAgICAvLyBsb29waW5nIG92ZXIgYSB2ZXJ5IHNsb3cgb3BlcmF0aW9uLgotICAgIEJPT1NUX1dBUk5fTFQoZGVsdGEsIDUwMDAwMCk7CisgICAgQk9PU1RfV0FSTiggZGVsdGEgPCA1MDAwMDAgKTsKIAogICAgIC8vIE5vcm1hbGx5LCBpdCB0YWtlcyBsZXNzIHRoYW4gMTAwbXMgb24gbXkgZGV2IGJveC4KICAgICAvLyBIb3dldmVyLCBpZiB0aGUgYm94IGlzIGhlYXZpbHkgbG9hZGVkLCBzb21lIG9mIHRoZSB0ZXN0IHJ1bnMKQEAgLTI3Myw3ICsyODIsNyBAQAogICBmb3IgKEZzeW5jTG9nOjpDYWxsTGlzdDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBjYWxscy0+YmVnaW4oKTsgaXQgIT0gY2FsbHMtPmVuZCgpOyArK2l0KSB7CiAgICAgaWYgKHByZXZfdGltZSkgewogICAgICAgaW50IGRlbHRhID0gdGltZV9kaWZmKHByZXZfdGltZSwgJml0LT50aW1lKTsKLSAgICAgIEJPT1NUX1dBUk5fTFQoZGVsdGEsIG1heF9hbGxvd2VkX2RlbHRhKTsKKyAgICAgIEJPT1NUX1dBUk4oIGRlbHRhIDwgbWF4X2FsbG93ZWRfZGVsdGEgKTsKICAgICB9CiAgICAgcHJldl90aW1lID0gJml0LT50aW1lOwogICB9CkBAIC0zMDksMTMgKzMxOCwxMyBAQAogICB0cmFuc3BvcnQud3JpdGUoYnVmLCAxKTsKIAogICBzdHJ1Y3QgdGltZXZhbCBzdGFydDsKLSAgZ2V0dGltZW9mZGF5KCZzdGFydCwgTlVMTCk7CisgIFRIUklGVF9HRVRUSU1FT0ZEQVkoJnN0YXJ0LCBOVUxMKTsKIAogICBmb3IgKHVuc2lnbmVkIGludCBuID0gMDsgbiA8IDEwOyArK24pIHsKICAgICB0cmFuc3BvcnQuZmx1c2goKTsKIAogICAgIHN0cnVjdCB0aW1ldmFsIG5vdzsKLSAgICBnZXR0aW1lb2ZkYXkoJm5vdywgTlVMTCk7CisgICAgVEhSSUZUX0dFVFRJTUVPRkRBWSgmbm93LCBOVUxMKTsKIAogICAgIC8vIEZhaWwgaWYgYXQgYW55IHBvaW50IHdlJ3ZlIGJlZW4gcnVubmluZyBmb3IgbG9uZ2VyIHRoYW4gaGFsZiBhIHNlY29uZC4KICAgICAvLyAoV2l0aCB0aGUgYnVnZ3kgY29kZSwgVEZpbGVUcmFuc3BvcnQgdXNlZCB0byB0YWtlIDMgc2Vjb25kcyBwZXIgZmx1c2goKSkKQEAgLTMyMyw3ICszMzIsNyBAQAogICAgIC8vIFVzZSBhIGZhdGFsIGZhaWwgc28gd2UgYnJlYWsgb3V0IGVhcmx5LCByYXRoZXIgdGhhbiBjb250aW51aW5nIHRvIG1ha2UKICAgICAvLyBtYW55IG1vcmUgc2xvdyBmbHVzaCgpIGNhbGxzLgogICAgIGludCBkZWx0YSA9IHRpbWVfZGlmZigmc3RhcnQsICZub3cpOwotICAgIEJPT1NUX1dBUk5fTFQoZGVsdGEsIDIwMDAwMDApOworICAgIEJPT1NUX1dBUk4oIGRlbHRhIDwgMjAwMDAwMCApOwogICB9CiB9CiAKQEAgLTM2Nyw2ICszNzYsMjQgQEAKICAgfQogfQogCisjaWZkZWYgQk9PU1RfVEVTVF9EWU5fTElOSworc3RhdGljIGludCBteUFyZ2MgPSAwOworc3RhdGljIGNoYXIgKipteUFyZ3YgPSBOVUxMOworCitib29sIGluaXRfdW5pdF90ZXN0X3N1aXRlKCkgeworICBib29zdDo6dW5pdF90ZXN0OjpmcmFtZXdvcms6Om1hc3Rlcl90ZXN0X3N1aXRlKCkucF9uYW1lLnZhbHVlID0gIlRGaWxlVHJhbnNwb3J0VGVzdCI7CisKKyAgLy8gUGFyc2UgYXJndW1lbnRzCisgIHBhcnNlX2FyZ3MobXlBcmdjLG15QXJndik7CisgIHJldHVybiB0cnVlOworfQorCitpbnQgbWFpbiggaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSApIHsKKyAgbXlBcmdjID0gYXJnYzsKKyAgbXlBcmd2ID0gYXJndjsKKyAgcmV0dXJuIDo6Ym9vc3Q6OnVuaXRfdGVzdDo6dW5pdF90ZXN0X21haW4oJmluaXRfdW5pdF90ZXN0X3N1aXRlLGFyZ2MsYXJndik7Cit9CisjZWxzZQogYm9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9zdWl0ZSogaW5pdF91bml0X3Rlc3Rfc3VpdGUoaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgewogICBib29zdDo6dW5pdF90ZXN0OjpmcmFtZXdvcms6Om1hc3Rlcl90ZXN0X3N1aXRlKCkucF9uYW1lLnZhbHVlID0gIlRGaWxlVHJhbnNwb3J0VGVzdCI7CiAKQEAgLTM3NCwzICs0MDEsNCBAQAogICBwYXJzZV9hcmdzKGFyZ2MsIGFyZ3YpOwogICByZXR1cm4gTlVMTDsKIH0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1RNZW1vcnlCdWZmZXJUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9UTWVtb3J5QnVmZmVyVGVzdC5jcHAKaW5kZXggODQxMDNlMy4uOTIwNjg3MiAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L1RNZW1vcnlCdWZmZXJUZXN0LmNwcAorKysgYi9saWIvY3BwL3Rlc3QvVE1lbW9yeUJ1ZmZlclRlc3QuY3BwCkBAIC0yMSw4ICsyMSw5IEBACiAjaW5jbHVkZSA8aW9zdHJlYW0+CiAjaW5jbHVkZSA8Y2xpbWl0cz4KICNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgogI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgogI2luY2x1ZGUgImdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5oIgogCiBCT09TVF9BVVRPX1RFU1RfU1VJVEUoVE1lbW9yeUJ1ZmZlclRlc3QpCkBAIC0zMCw3ICszMSw3IEBACiB1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRCaW5hcnlQcm90b2NvbDsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOwotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CiB1c2luZyBzdGQ6OmNvdXQ7CiB1c2luZyBzdGQ6OmVuZGw7CiB1c2luZyBzdGQ6OnN0cmluZzsKQEAgLTc5LDE5ICs4MCwxMSBAQAogICBCT09TVF9DSEVDSyhhID09IGEyKTsKIH0KIAotQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9jb3B5KSB7CitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X3JlYWRBcHBlbmRUb1N0cmluZykgewogICBzdHJpbmcqIHN0cjEgPSBuZXcgc3RyaW5nKCJhYmNkMTIzNCIpOwotICBjb25zdCBjaGFyKiBkYXRhMSA9IHN0cjEtPmRhdGEoKTsKICAgVE1lbW9yeUJ1ZmZlciBidWYoKHVpbnQ4X3QqKXN0cjEtPmRhdGEoKSwKICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHN0cjEtPmxlbmd0aCgpKSwKICAgICAgICAgICAgICAgICAgICAgVE1lbW9yeUJ1ZmZlcjo6Q09QWSk7Ci0gIGRlbGV0ZSBzdHIxOwotICBzdHJpbmcqIHN0cjIgPSBuZXcgc3RyaW5nKCJwbHNyZXVzZSIpOwotICBib29sIG9ial9yZXVzZSA9IChzdHIxID09IHN0cjIpOwotICBib29sIGRhdF9yZXVzZSA9IChkYXRhMSA9PSBzdHIyLT5kYXRhKCkpOwotICBCT09TVF9URVNUX01FU1NBR0UoIk9iamVjdCByZXVzZTogIiA8PCBvYmpfcmV1c2UgPDwgIiAgIERhdGEgcmV1c2U6ICIgPDwgZGF0X3JldXNlCi0gICAgICAgICAgICAgICAgPDwgKChvYmpfcmV1c2UgJiYgZGF0X3JldXNlKSA/ICIgICBZQVkhIiA6ICIiKSk7Ci0gIGRlbGV0ZSBzdHIyOwogCiAgIHN0cmluZyBzdHIzID0gInd4eXoiLCBzdHI0ID0gIjY3ODkiOwogICBidWYucmVhZEFwcGVuZFRvU3RyaW5nKHN0cjMsIDQpOwpAQCAtMTE2LDQgKzEwOSw1MiBAQAogICBCT09TVF9DSEVDS19OT19USFJPVyhidWYyLndyaXRlKChjb25zdCB1aW50OF90KikiYmFyIiwgMykpOwogfQogCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2RlZmF1bHRfbWF4aW11bV9idWZmZXJfc2l6ZSkKK3sKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgpKCksIFRNZW1vcnlCdWZmZXIoKS5nZXRNYXhCdWZmZXJTaXplKCkpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2RlZmF1bHRfYnVmZmVyX3NpemUpCit7CisgIEJPT1NUX0NIRUNLX0VRVUFMKDEwMjQsIFRNZW1vcnlCdWZmZXIoKS5nZXRCdWZmZXJTaXplKCkpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2Vycm9yX3NldF9tYXhfYnVmZmVyX3NpemVfdG9vX3NtYWxsKQoreworICBUTWVtb3J5QnVmZmVyIGJ1ZjsKKyAgQk9PU1RfQ0hFQ0tfVEhST1coYnVmLnNldE1heEJ1ZmZlclNpemUoYnVmLmdldEJ1ZmZlclNpemUoKSAtIDEpLCBUVHJhbnNwb3J0RXhjZXB0aW9uKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9tYXhpbXVtX2J1ZmZlcl9zaXplKQoreworICBUTWVtb3J5QnVmZmVyIGJ1ZjsKKyAgYnVmLnNldE1heEJ1ZmZlclNpemUoODE5Mik7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNtYWxsX2J1ZmYoMSk7CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCA4MTkyOyArK2kpCisgIHsKKyAgICBidWYud3JpdGUoJnNtYWxsX2J1ZmZbMF0sIDEpOworICB9CisKKyAgQk9PU1RfQ0hFQ0tfVEhST1coYnVmLndyaXRlKCZzbWFsbF9idWZmWzBdLCAxKSwgVFRyYW5zcG9ydEV4Y2VwdGlvbik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfbWVtb3J5X2J1ZmZlcl90b19nZXRfc2l6ZW9mX29iamVjdHMpCit7CisgIC8vIFRoaXMgaXMgYSBkZW1vbnN0cmF0aW9uIG9mIGhvdyB0byB1c2UgVE1lbW9yeUJ1ZmZlciB0byBkZXRlcm1pbmUKKyAgLy8gdGhlIHNlcmlhbGl6ZWQgc2l6ZSBvZiBhIHRocmlmdCBvYmplY3QgaW4gdGhlIEJpbmFyeSBwcm90b2NvbC4KKyAgLy8gU2VlIFRIUklGVC0zNDgwCisKKyAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBtZW1CdWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoKSk7CisgIHNoYXJlZF9wdHI8VEJpbmFyeVByb3RvY29sPiBiaW5hcnlQcm90Y29sKG5ldyBUQmluYXJ5UHJvdG9jb2wobWVtQnVmZmVyKSk7CisKKyAgdGhyaWZ0Ojp0ZXN0OjpYdHJ1Y3Qgb2JqZWN0OworICBvYmplY3QuaTMyX3RoaW5nID0gMTA7CisgIG9iamVjdC5pNjRfdGhpbmcgPSAzMDsKKyAgb2JqZWN0LnN0cmluZ190aGluZyA9ICJ3aG8ncyB5b3VyIGRhZGR5PyI7CisKKyAgdWludDMyX3Qgc2l6ZSA9IG9iamVjdC53cml0ZShiaW5hcnlQcm90Y29sLmdldCgpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoNDcsIHNpemUpOworfQorCiBCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9UTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9UTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzAzODBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L1ROb25ibG9ja2luZ1NTTFNlcnZlclRlc3QuY3BwCkBAIC0wLDAgKzEsMjkxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgQk9PU1RfVEVTVF9NT0RVTEUgVE5vbmJsb2NraW5nU1NMU2VydmVyVGVzdAorI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KKyNpbmNsdWRlIDxib29zdC9maWxlc3lzdGVtLmhwcD4KKyNpbmNsdWRlIDxib29zdC9mb3JtYXQuaHBwPgorCisjaW5jbHVkZSAidGhyaWZ0L3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuaCIKKyNpbmNsdWRlICJ0aHJpZnQvdHJhbnNwb3J0L1RTU0xTb2NrZXQuaCIKKyNpbmNsdWRlICJ0aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldC5oIgorCisjaW5jbHVkZSAiZ2VuLWNwcC9QYXJlbnRTZXJ2aWNlLmgiCisKKyNpbmNsdWRlIDxldmVudC5oPgorCit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Okd1YXJkOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNb25pdG9yOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNdXRleDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI6OlRTZXJ2ZXJFdmVudEhhbmRsZXI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU1NMU29ja2V0RmFjdG9yeTsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTU0xTb2NrZXQ7CisKK3N0cnVjdCBIYW5kbGVyIDogcHVibGljIHRlc3Q6OlBhcmVudFNlcnZpY2VJZiB7CisgIHZvaWQgYWRkU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzKSB7IHN0cmluZ3NfLnB1c2hfYmFjayhzKTsgfQorICB2b2lkIGdldFN0cmluZ3Moc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBfcmV0dXJuKSB7IF9yZXR1cm4gPSBzdHJpbmdzXzsgfQorICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc3RyaW5nc187CisKKyAgLy8gZHVtbXkgb3ZlcnJpZGVzIG5vdCB1c2VkIGluIHRoaXMgdGVzdAorICBpbnQzMl90IGluY3JlbWVudEdlbmVyYXRpb24oKSB7IHJldHVybiAwOyB9CisgIGludDMyX3QgZ2V0R2VuZXJhdGlvbigpIHsgcmV0dXJuIDA7IH0KKyAgdm9pZCBnZXREYXRhV2FpdChzdGQ6OnN0cmluZyYsIGNvbnN0IGludDMyX3QpIHt9CisgIHZvaWQgb25ld2F5V2FpdCgpIHt9CisgIHZvaWQgZXhjZXB0aW9uV2FpdChjb25zdCBzdGQ6OnN0cmluZyYpIHt9CisgIHZvaWQgdW5leHBlY3RlZEV4Y2VwdGlvbldhaXQoY29uc3Qgc3RkOjpzdHJpbmcmKSB7fQorfTsKKworYm9vc3Q6OmZpbGVzeXN0ZW06OnBhdGgga2V5RGlyOworYm9vc3Q6OmZpbGVzeXN0ZW06OnBhdGggY2VydEZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lKQoreworICByZXR1cm4ga2V5RGlyIC8gZmlsZW5hbWU7Cit9CisKK3N0cnVjdCBHbG9iYWxGaXh0dXJlU1NMCit7CisgICAgR2xvYmFsRml4dHVyZVNTTCgpCisgICAgeworICAgICAgdXNpbmcgbmFtZXNwYWNlIGJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFzdGVyX3Rlc3Rfc3VpdGUoKS5hcmdjOyArK2kpCisgICAgICB7CisgICAgICAgIEJPT1NUX1RFU1RfTUVTU0FHRShib29zdDo6Zm9ybWF0KCJhcmd2WyUxJV0gPSBcIiUyJVwiIikgJSBpICUgbWFzdGVyX3Rlc3Rfc3VpdGUoKS5hcmd2W2ldKTsKKyAgICAgIH0KKworI2lmZGVmIF9fbGludXhfXworICAgICAgLy8gT3BlblNTTCBjYWxscyBzZW5kKCkgd2l0aG91dCBNU0dfTk9TSUdQSVBFIHNvIHdyaXRpbmcgdG8gYSBzb2NrZXQgdGhhdCBoYXMKKyAgICAgIC8vIGRpc2Nvbm5lY3RlZCBjYW4gY2F1c2UgYSBTSUdQSVBFIHNpZ25hbC4uLgorICAgICAgc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOworI2VuZGlmCisKKyAgICAgIFRTU0xTb2NrZXRGYWN0b3J5OjpzZXRNYW51YWxPcGVuU1NMSW5pdGlhbGl6YXRpb24odHJ1ZSk7CisgICAgICBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0Ojppbml0aWFsaXplT3BlblNTTCgpOworCisgICAgICBrZXlEaXIgPSBib29zdDo6ZmlsZXN5c3RlbTo6Y3VycmVudF9wYXRoKCkucGFyZW50X3BhdGgoKS5wYXJlbnRfcGF0aCgpLnBhcmVudF9wYXRoKCkgLyAidGVzdCIgLyAia2V5cyI7CisgICAgICBpZiAoIWJvb3N0OjpmaWxlc3lzdGVtOjpleGlzdHMoY2VydEZpbGUoInNlcnZlci5jcnQiKSkpCisgICAgICB7CisgICAgICAgIGtleURpciA9IGJvb3N0OjpmaWxlc3lzdGVtOjpwYXRoKG1hc3Rlcl90ZXN0X3N1aXRlKCkuYXJndlttYXN0ZXJfdGVzdF9zdWl0ZSgpLmFyZ2MgLSAxXSk7CisgICAgICAgIGlmICghYm9vc3Q6OmZpbGVzeXN0ZW06OmV4aXN0cyhjZXJ0RmlsZSgic2VydmVyLmNydCIpKSkKKyAgICAgICAgeworICAgICAgICAgIHRocm93IHN0ZDo6aW52YWxpZF9hcmd1bWVudCgiVGhlIGxhc3QgYXJndW1lbnQgdG8gdGhpcyB0ZXN0IG11c3QgYmUgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSB0ZXN0IGNlcnRpZmljYXRlKHMpLiIpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgdmlydHVhbCB+R2xvYmFsRml4dHVyZVNTTCgpCisgICAgeworICAgICAgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6Y2xlYW51cE9wZW5TU0woKTsKKyNpZmRlZiBfX2xpbnV4X18KKyAgICAgIHNpZ25hbChTSUdQSVBFLCBTSUdfREZMKTsKKyNlbmRpZgorICAgIH0KK307CisKKyNpZiAoQk9PU1RfVkVSU0lPTiA+PSAxMDU5MDApCitCT09TVF9HTE9CQUxfRklYVFVSRShHbG9iYWxGaXh0dXJlU1NMKTsKKyNlbHNlCitCT09TVF9HTE9CQUxfRklYVFVSRShHbG9iYWxGaXh0dXJlU1NMKQorI2VuZGlmCisKK3N0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gY3JlYXRlU2VydmVyU29ja2V0RmFjdG9yeSgpIHsKKyAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBwU2VydmVyU29ja2V0RmFjdG9yeTsKKworICBwU2VydmVyU29ja2V0RmFjdG9yeS5yZXNldChuZXcgVFNTTFNvY2tldEZhY3RvcnkoKSk7CisgIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5LT5jaXBoZXJzKCJBTEw6IUFESDohTE9XOiFFWFA6IU1ENTpAU1RSRU5HVEgiKTsKKyAgcFNlcnZlclNvY2tldEZhY3RvcnktPmxvYWRDZXJ0aWZpY2F0ZShjZXJ0RmlsZSgic2VydmVyLmNydCIpLnN0cmluZygpLmNfc3RyKCkpOworICBwU2VydmVyU29ja2V0RmFjdG9yeS0+bG9hZFByaXZhdGVLZXkoY2VydEZpbGUoInNlcnZlci5rZXkiKS5zdHJpbmcoKS5jX3N0cigpKTsKKyAgcFNlcnZlclNvY2tldEZhY3RvcnktPnNlcnZlcih0cnVlKTsKKyAgcmV0dXJuIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5OworfQorCitzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGNyZWF0ZUNsaWVudFNvY2tldEZhY3RvcnkoKSB7CisgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gcENsaWVudFNvY2tldEZhY3Rvcnk7CisKKyAgcENsaWVudFNvY2tldEZhY3RvcnkucmVzZXQobmV3IFRTU0xTb2NrZXRGYWN0b3J5KCkpOworICBwQ2xpZW50U29ja2V0RmFjdG9yeS0+YXV0aGVudGljYXRlKHRydWUpOworICBwQ2xpZW50U29ja2V0RmFjdG9yeS0+bG9hZENlcnRpZmljYXRlKGNlcnRGaWxlKCJjbGllbnQuY3J0Iikuc3RyaW5nKCkuY19zdHIoKSk7CisgIHBDbGllbnRTb2NrZXRGYWN0b3J5LT5sb2FkUHJpdmF0ZUtleShjZXJ0RmlsZSgiY2xpZW50LmtleSIpLnN0cmluZygpLmNfc3RyKCkpOworICBwQ2xpZW50U29ja2V0RmFjdG9yeS0+bG9hZFRydXN0ZWRDZXJ0aWZpY2F0ZXMoY2VydEZpbGUoIkNBLnBlbSIpLnN0cmluZygpLmNfc3RyKCkpOworICByZXR1cm4gcENsaWVudFNvY2tldEZhY3Rvcnk7Cit9CisKK2NsYXNzIEZpeHR1cmUgeworcHJpdmF0ZToKKyAgc3RydWN0IExpc3RlbkV2ZW50SGFuZGxlciA6IHB1YmxpYyBUU2VydmVyRXZlbnRIYW5kbGVyIHsKKyAgICBwdWJsaWM6CisgICAgICBMaXN0ZW5FdmVudEhhbmRsZXIoTXV0ZXgqIG11dGV4KSA6IGxpc3Rlbk1vbml0b3JfKG11dGV4KSwgcmVhZHlfKGZhbHNlKSB7fQorCisgICAgICB2b2lkIHByZVNlcnZlKCkgLyogb3ZlcnJpZGUgKi8geworICAgICAgICBHdWFyZCBnKGxpc3Rlbk1vbml0b3JfLm11dGV4KCkpOworICAgICAgICByZWFkeV8gPSB0cnVlOworICAgICAgICBsaXN0ZW5Nb25pdG9yXy5ub3RpZnkoKTsKKyAgICAgIH0KKworICAgICAgTW9uaXRvciBsaXN0ZW5Nb25pdG9yXzsKKyAgICAgIGJvb2wgcmVhZHlfOworICB9OworCisgIHN0cnVjdCBSdW5uZXIgOiBwdWJsaWMgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpSdW5uYWJsZSB7CisgICAgaW50IHBvcnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPGV2ZW50X2Jhc2U+IHVzZXJFdmVudEJhc2U7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8c2VydmVyOjpUTm9uYmxvY2tpbmdTZXJ2ZXI+IHNlcnZlcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8TGlzdGVuRXZlbnRIYW5kbGVyPiBsaXN0ZW5IYW5kbGVyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gcFNlcnZlclNvY2tldEZhY3Rvcnk7CisgICAgc3RkOjpzaGFyZWRfcHRyPHRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0PiBzb2NrZXQ7CisgICAgTXV0ZXggbXV0ZXhfOworCisgICAgUnVubmVyKCkgeworICAgICAgbGlzdGVuSGFuZGxlci5yZXNldChuZXcgTGlzdGVuRXZlbnRIYW5kbGVyKCZtdXRleF8pKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgcnVuKCkgeworICAgICAgLy8gV2hlbiBiaW5kaW5nIHRvIGV4cGxpY2l0IHBvcnQsIGFsbG93IHJldHJ5aW5nIHRvIHdvcmthcm91bmQgYmluZCBmYWlsdXJlcyBvbiBwb3J0cyBpbiB1c2UKKyAgICAgIGludCByZXRyeUNvdW50ID0gcG9ydCA/IDEwIDogMDsKKyAgICAgIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5ID0gY3JlYXRlU2VydmVyU29ja2V0RmFjdG9yeSgpOyAgCisgICAgICBzdGFydFNlcnZlcihyZXRyeUNvdW50KTsKKyAgICB9CisKKyAgICB2b2lkIHJlYWR5QmFycmllcigpIHsKKyAgICAgIC8vIGJsb2NrIHVudGlsIHNlcnZlciBpcyBsaXN0ZW5pbmcgYW5kIHJlYWR5IHRvIGFjY2VwdCBjb25uZWN0aW9ucworICAgICAgR3VhcmQgZyhtdXRleF8pOworICAgICAgd2hpbGUgKCFsaXN0ZW5IYW5kbGVyLT5yZWFkeV8pIHsKKyAgICAgICAgbGlzdGVuSGFuZGxlci0+bGlzdGVuTW9uaXRvcl8ud2FpdCgpOworICAgICAgfQorICAgIH0KKyAgcHJpdmF0ZToKKyAgICB2b2lkIHN0YXJ0U2VydmVyKGludCByZXRyeV9jb3VudCkgeworICAgICAgdHJ5IHsKKyAgICAgICAgc29ja2V0LnJlc2V0KG5ldyB0cmFuc3BvcnQ6OlROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldChwb3J0LCBwU2VydmVyU29ja2V0RmFjdG9yeSkpOworICAgICAgICBzZXJ2ZXIucmVzZXQobmV3IHNlcnZlcjo6VE5vbmJsb2NraW5nU2VydmVyKHByb2Nlc3Nvciwgc29ja2V0KSk7CisJICAgICAgc2VydmVyLT5zZXRTZXJ2ZXJFdmVudEhhbmRsZXIobGlzdGVuSGFuZGxlcik7CisgICAgICAgIHNlcnZlci0+c2V0TnVtSU9UaHJlYWRzKDEpOworICAgICAgICBpZiAodXNlckV2ZW50QmFzZSkgeworICAgICAgICAgIHNlcnZlci0+cmVnaXN0ZXJFdmVudHModXNlckV2ZW50QmFzZS5nZXQoKSk7CisgICAgICAgIH0KKyAgICAgICAgc2VydmVyLT5zZXJ2ZSgpOworICAgICAgfSBjYXRjaCAoY29uc3QgdHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uJikgeworICAgICAgICBpZiAocmV0cnlfY291bnQgPiAwKSB7CisgICAgICAgICAgKytwb3J0OworICAgICAgICAgIHN0YXJ0U2VydmVyKHJldHJ5X2NvdW50IC0gMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGhyb3c7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH07CisKKyAgc3RydWN0IEV2ZW50RGVsZXRlciB7CisgICAgdm9pZCBvcGVyYXRvcigpKGV2ZW50X2Jhc2UqIHApIHsgZXZlbnRfYmFzZV9mcmVlKHApOyB9CisgIH07CisKK3Byb3RlY3RlZDoKKyAgRml4dHVyZSgpIDogcHJvY2Vzc29yKG5ldyB0ZXN0OjpQYXJlbnRTZXJ2aWNlUHJvY2Vzc29yKHN0ZDo6bWFrZV9zaGFyZWQ8SGFuZGxlcj4oKSkpIHt9CisKKyAgfkZpeHR1cmUoKSB7CisgICAgaWYgKHNlcnZlcikgeworICAgICAgc2VydmVyLT5zdG9wKCk7CisgICAgfQorICAgIGlmICh0aHJlYWQpIHsKKyAgICAgIHRocmVhZC0+am9pbigpOworICAgIH0KKyAgfQorCisgIHZvaWQgc2V0RXZlbnRCYXNlKGV2ZW50X2Jhc2UqIHVzZXJfZXZlbnRfYmFzZSkgeworICAgIHVzZXJFdmVudEJhc2VfLnJlc2V0KHVzZXJfZXZlbnRfYmFzZSwgRXZlbnREZWxldGVyKCkpOworICB9CisKKyAgaW50IHN0YXJ0U2VydmVyKGludCBwb3J0KSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFJ1bm5lcj4gcnVubmVyKG5ldyBSdW5uZXIpOworICAgIHJ1bm5lci0+cG9ydCA9IHBvcnQ7CisgICAgcnVubmVyLT5wcm9jZXNzb3IgPSBwcm9jZXNzb3I7CisgICAgcnVubmVyLT51c2VyRXZlbnRCYXNlID0gdXNlckV2ZW50QmFzZV87CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5KAorICAgICAgICBuZXcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpQbGF0Zm9ybVRocmVhZEZhY3RvcnkoCisjaWYgIVVTRV9TVERfVEhSRUFECisgICAgICAgICAgICBjb25jdXJyZW5jeTo6UGxhdGZvcm1UaHJlYWRGYWN0b3J5OjpPVEhFUiwgY29uY3VycmVuY3k6OlBsYXRmb3JtVGhyZWFkRmFjdG9yeTo6Tk9STUFMLAorICAgICAgICAgICAgMSwKKyNlbmRpZgorICAgICAgICAgICAgZmFsc2UpKTsKKyAgICB0aHJlYWQgPSB0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQocnVubmVyKTsKKyAgICB0aHJlYWQtPnN0YXJ0KCk7CisgICAgcnVubmVyLT5yZWFkeUJhcnJpZXIoKTsKKworICAgIHNlcnZlciA9IHJ1bm5lci0+c2VydmVyOworICAgIHJldHVybiBydW5uZXItPnBvcnQ7CisgIH0KKworICBib29sIGNhbkNvbW11bmljYXRlKGludCBzZXJ2ZXJQb3J0KSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBwQ2xpZW50U29ja2V0RmFjdG9yeSA9IGNyZWF0ZUNsaWVudFNvY2tldEZhY3RvcnkoKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gc29ja2V0ID0gcENsaWVudFNvY2tldEZhY3RvcnktPmNyZWF0ZVNvY2tldCgibG9jYWxob3N0Iiwgc2VydmVyUG9ydCk7CisgICAgc29ja2V0LT5vcGVuKCk7CisgICAgdGVzdDo6UGFyZW50U2VydmljZUNsaWVudCBjbGllbnQoc3RkOjptYWtlX3NoYXJlZDxwcm90b2NvbDo6VEJpbmFyeVByb3RvY29sPigKKyAgICAgICAgc3RkOjptYWtlX3NoYXJlZDx0cmFuc3BvcnQ6OlRGcmFtZWRUcmFuc3BvcnQ+KHNvY2tldCkpKTsKKyAgICBjbGllbnQuYWRkU3RyaW5nKCJmb28iKTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc3RyaW5nczsKKyAgICBjbGllbnQuZ2V0U3RyaW5ncyhzdHJpbmdzKTsKKyAgICByZXR1cm4gc3RyaW5ncy5zaXplKCkgPT0gMSAmJiAhKHN0cmluZ3NbMF0uY29tcGFyZSgiZm9vIikpOworICB9CisKK3ByaXZhdGU6CisgIHN0ZDo6c2hhcmVkX3B0cjxldmVudF9iYXNlPiB1c2VyRXZlbnRCYXNlXzsKKyAgc3RkOjpzaGFyZWRfcHRyPHRlc3Q6OlBhcmVudFNlcnZpY2VQcm9jZXNzb3I+IHByb2Nlc3NvcjsKK3Byb3RlY3RlZDoKKyAgc3RkOjpzaGFyZWRfcHRyPHNlcnZlcjo6VE5vbmJsb2NraW5nU2VydmVyPiBzZXJ2ZXI7Citwcml2YXRlOgorICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWQ+IHRocmVhZDsKKworfTsKKworQk9PU1RfQVVUT19URVNUX1NVSVRFKFROb25ibG9ja2luZ1NTTFNlcnZlclRlc3QpCisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKGdldF9zcGVjaWZpZWRfcG9ydCwgRml4dHVyZSkgeworICBpbnQgc3BlY2lmaWVkX3BvcnQgPSBzdGFydFNlcnZlcigxMjM0NSk7CisgIEJPT1NUX1JFUVVJUkVfR0Uoc3BlY2lmaWVkX3BvcnQsIDEyMzQ1KTsKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTChzZXJ2ZXItPmdldExpc3RlblBvcnQoKSwgc3BlY2lmaWVkX3BvcnQpOworICBCT09TVF9DSEVDSyhjYW5Db21tdW5pY2F0ZShzcGVjaWZpZWRfcG9ydCkpOworCisgIHNlcnZlci0+c3RvcCgpOworfQorCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRShnZXRfYXNzaWduZWRfcG9ydCwgRml4dHVyZSkgeworICBpbnQgc3BlY2lmaWVkX3BvcnQgPSBzdGFydFNlcnZlcigwKTsKKyAgQk9PU1RfUkVRVUlSRV9FUVVBTChzcGVjaWZpZWRfcG9ydCwgMCk7CisgIGludCBhc3NpZ25lZF9wb3J0ID0gc2VydmVyLT5nZXRMaXN0ZW5Qb3J0KCk7CisgIEJPT1NUX1JFUVVJUkVfTkUoYXNzaWduZWRfcG9ydCwgMCk7CisgIEJPT1NUX0NIRUNLKGNhbkNvbW11bmljYXRlKGFzc2lnbmVkX3BvcnQpKTsKKworICBzZXJ2ZXItPnN0b3AoKTsKK30KKworQk9PU1RfRklYVFVSRV9URVNUX0NBU0UocHJvdmlkZV9ldmVudF9iYXNlLCBGaXh0dXJlKSB7CisgIGV2ZW50X2Jhc2UqIGViID0gZXZlbnRfYmFzZV9uZXcoKTsKKyAgc2V0RXZlbnRCYXNlKGViKTsKKyAgc3RhcnRTZXJ2ZXIoMCk7CisKKyAgLy8gYXNzZXJ0IHRoYXQgdGhlIHNlcnZlciB3b3JrcworICBCT09TVF9DSEVDSyhjYW5Db21tdW5pY2F0ZShzZXJ2ZXItPmdldExpc3RlblBvcnQoKSkpOworI2lmIExJQkVWRU5UX1ZFUlNJT05fTlVNQkVSID4gMHgwMjAxMDQwMAorICAvLyBhbHNvIGFzc2VydCB0aGF0IHRoZSBldmVudF9iYXNlIGlzIGFjdHVhbGx5IHVzZWQgd2hlbiBpdCdzIGVhc3kKKyAgQk9PU1RfQ0hFQ0tfR1QoZXZlbnRfYmFzZV9nZXRfbnVtX2V2ZW50cyhlYiwgRVZFTlRfQkFTRV9DT1VOVF9BRERFRCksIDApOworI2VuZGlmCit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1ROb25ibG9ja2luZ1NlcnZlclRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L1ROb25ibG9ja2luZ1NlcnZlclRlc3QuY3BwCmluZGV4IDhmNGVmNmUuLmYwYmIyODMgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9UTm9uYmxvY2tpbmdTZXJ2ZXJUZXN0LmNwcAorKysgYi9saWIvY3BwL3Rlc3QvVE5vbmJsb2NraW5nU2VydmVyVGVzdC5jcHAKQEAgLTE5LDE1ICsxOSwyOCBAQAogCiAjZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIFROb25ibG9ja2luZ1NlcnZlclRlc3QKICNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+Ci0jaW5jbHVkZSA8Ym9vc3Qvc21hcnRfcHRyLmhwcD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAKKyNpbmNsdWRlICJ0aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oIgogI2luY2x1ZGUgInRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWQuaCIKICNpbmNsdWRlICJ0aHJpZnQvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5oIgorI2luY2x1ZGUgInRocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyU29ja2V0LmgiCiAKICNpbmNsdWRlICJnZW4tY3BwL1BhcmVudFNlcnZpY2UuaCIKIAogI2luY2x1ZGUgPGV2ZW50Lmg+CiAKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6R3VhcmQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Ok1vbml0b3I7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Ok11dGV4OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpQbGF0Zm9ybVRocmVhZEZhY3Rvcnk7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlJ1bm5hYmxlOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6c2VydmVyOjpUU2VydmVyRXZlbnRIYW5kbGVyOwordXNpbmcgc3RkOjptYWtlX3NoYXJlZDsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKKwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwogCiBzdHJ1Y3QgSGFuZGxlciA6IHB1YmxpYyB0ZXN0OjpQYXJlbnRTZXJ2aWNlSWYgewpAQCAtNDYsMTUgKzU5LDYzIEBACiAKIGNsYXNzIEZpeHR1cmUgewogcHJpdmF0ZToKLSAgc3RydWN0IFJ1bm5lciA6IHB1YmxpYyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlJ1bm5hYmxlIHsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxzZXJ2ZXI6OlROb25ibG9ja2luZ1NlcnZlcj4gc2VydmVyOwotICAgIGJvb2wgZXJyb3I7CisgIHN0cnVjdCBMaXN0ZW5FdmVudEhhbmRsZXIgOiBwdWJsaWMgVFNlcnZlckV2ZW50SGFuZGxlciB7CisgICAgcHVibGljOgorICAgICAgTGlzdGVuRXZlbnRIYW5kbGVyKE11dGV4KiBtdXRleCkgOiBsaXN0ZW5Nb25pdG9yXyhtdXRleCksIHJlYWR5XyhmYWxzZSkge30KKworICAgICAgdm9pZCBwcmVTZXJ2ZSgpIC8qIG92ZXJyaWRlICovIHsKKyAgICAgICAgR3VhcmQgZyhsaXN0ZW5Nb25pdG9yXy5tdXRleCgpKTsKKyAgICAgICAgcmVhZHlfID0gdHJ1ZTsKKyAgICAgICAgbGlzdGVuTW9uaXRvcl8ubm90aWZ5KCk7CisgICAgICB9CisKKyAgICAgIE1vbml0b3IgbGlzdGVuTW9uaXRvcl87CisgICAgICBib29sIHJlYWR5XzsKKyAgfTsKKworICBzdHJ1Y3QgUnVubmVyIDogcHVibGljIFJ1bm5hYmxlIHsKKyAgICBpbnQgcG9ydDsKKyAgICBzaGFyZWRfcHRyPGV2ZW50X2Jhc2U+IHVzZXJFdmVudEJhc2U7CisgICAgc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3I7CisgICAgc2hhcmVkX3B0cjxzZXJ2ZXI6OlROb25ibG9ja2luZ1NlcnZlcj4gc2VydmVyOworICAgIHNoYXJlZF9wdHI8TGlzdGVuRXZlbnRIYW5kbGVyPiBsaXN0ZW5IYW5kbGVyOworICAgIHNoYXJlZF9wdHI8dHJhbnNwb3J0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ+IHNvY2tldDsKKyAgICBNdXRleCBtdXRleF87CisKKyAgICBSdW5uZXIoKSB7CisgICAgICBsaXN0ZW5IYW5kbGVyLnJlc2V0KG5ldyBMaXN0ZW5FdmVudEhhbmRsZXIoJm11dGV4XykpOworICAgIH0KKwogICAgIHZpcnR1YWwgdm9pZCBydW4oKSB7Ci0gICAgICBlcnJvciA9IGZhbHNlOworICAgICAgLy8gV2hlbiBiaW5kaW5nIHRvIGV4cGxpY2l0IHBvcnQsIGFsbG93IHJldHJ5aW5nIHRvIHdvcmthcm91bmQgYmluZCBmYWlsdXJlcyBvbiBwb3J0cyBpbiB1c2UKKyAgICAgIGludCByZXRyeUNvdW50ID0gcG9ydCA/IDEwIDogMDsKKyAgICAgIHN0YXJ0U2VydmVyKHJldHJ5Q291bnQpOworICAgIH0KKworICAgIHZvaWQgcmVhZHlCYXJyaWVyKCkgeworICAgICAgLy8gYmxvY2sgdW50aWwgc2VydmVyIGlzIGxpc3RlbmluZyBhbmQgcmVhZHkgdG8gYWNjZXB0IGNvbm5lY3Rpb25zCisgICAgICBHdWFyZCBnKG11dGV4Xyk7CisgICAgICB3aGlsZSAoIWxpc3RlbkhhbmRsZXItPnJlYWR5XykgeworICAgICAgICBsaXN0ZW5IYW5kbGVyLT5saXN0ZW5Nb25pdG9yXy53YWl0KCk7CisgICAgICB9CisgICAgfQorICBwcml2YXRlOgorICAgIHZvaWQgc3RhcnRTZXJ2ZXIoaW50IHJldHJ5X2NvdW50KSB7CiAgICAgICB0cnkgeworICAgICAgICBzb2NrZXQucmVzZXQobmV3IHRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU2VydmVyU29ja2V0KHBvcnQpKTsKKyAgICAgICAgc2VydmVyLnJlc2V0KG5ldyBzZXJ2ZXI6OlROb25ibG9ja2luZ1NlcnZlcihwcm9jZXNzb3IsIHNvY2tldCkpOworICAgICAgICBzZXJ2ZXItPnNldFNlcnZlckV2ZW50SGFuZGxlcihsaXN0ZW5IYW5kbGVyKTsKKyAgICAgICAgaWYgKHVzZXJFdmVudEJhc2UpIHsKKyAgICAgICAgICBzZXJ2ZXItPnJlZ2lzdGVyRXZlbnRzKHVzZXJFdmVudEJhc2UuZ2V0KCkpOworICAgICAgICB9CiAgICAgICAgIHNlcnZlci0+c2VydmUoKTsKLSAgICAgIH0gY2F0Y2ggKGNvbnN0IFRFeGNlcHRpb24mKSB7Ci0gICAgICAgIGVycm9yID0gdHJ1ZTsKKyAgICAgIH0gY2F0Y2ggKGNvbnN0IHRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbiYpIHsKKyAgICAgICAgaWYgKHJldHJ5X2NvdW50ID4gMCkgeworICAgICAgICAgICsrcG9ydDsKKyAgICAgICAgICBzdGFydFNlcnZlcihyZXRyeV9jb3VudCAtIDEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRocm93OworICAgICAgICB9CiAgICAgICB9CiAgICAgfQogICB9OwpAQCAtNjQsNyArMTI1LDcgQEAKICAgfTsKIAogcHJvdGVjdGVkOgotICBGaXh0dXJlKCkgOiBwcm9jZXNzb3IobmV3IHRlc3Q6OlBhcmVudFNlcnZpY2VQcm9jZXNzb3IoYm9vc3Q6Om1ha2Vfc2hhcmVkPEhhbmRsZXI+KCkpKSB7fQorICBGaXh0dXJlKCkgOiBwcm9jZXNzb3IobmV3IHRlc3Q6OlBhcmVudFNlcnZpY2VQcm9jZXNzb3IobWFrZV9zaGFyZWQ8SGFuZGxlcj4oKSkpIHt9CiAKICAgfkZpeHR1cmUoKSB7CiAgICAgaWYgKHNlcnZlcikgewpAQCAtODAsNDUgKzE0MSwzMSBAQAogICB9CiAKICAgaW50IHN0YXJ0U2VydmVyKGludCBwb3J0KSB7Ci0gICAgYm9vc3Q6OnNjb3BlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5KAotICAgICAgbmV3IGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UGxhdGZvcm1UaHJlYWRGYWN0b3J5KAotI2lmICFVU0VfQk9PU1RfVEhSRUFEICYmICFVU0VfU1REX1RIUkVBRAotICAgICAgICAgICAgY29uY3VycmVuY3k6OlBsYXRmb3JtVGhyZWFkRmFjdG9yeTo6T1RIRVIsCi0gICAgICAgICAgICBjb25jdXJyZW5jeTo6UGxhdGZvcm1UaHJlYWRGYWN0b3J5OjpOT1JNQUwsCisgICAgc2hhcmVkX3B0cjxSdW5uZXI+IHJ1bm5lcihuZXcgUnVubmVyKTsKKyAgICBydW5uZXItPnBvcnQgPSBwb3J0OworICAgIHJ1bm5lci0+cHJvY2Vzc29yID0gcHJvY2Vzc29yOworICAgIHJ1bm5lci0+dXNlckV2ZW50QmFzZSA9IHVzZXJFdmVudEJhc2VfOworCisgICAgc2hhcmVkX3B0cjxUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5KAorICAgICAgICBuZXcgUGxhdGZvcm1UaHJlYWRGYWN0b3J5KAorI2lmICFVU0VfU1REX1RIUkVBRAorICAgICAgICAgICAgUGxhdGZvcm1UaHJlYWRGYWN0b3J5OjpPVEhFUiwgUGxhdGZvcm1UaHJlYWRGYWN0b3J5OjpOT1JNQUwsCiAgICAgICAgICAgICAxLAogI2VuZGlmCi0gICAgICAgICAgICB0cnVlKSk7CisgICAgICAgICAgICBmYWxzZSkpOworICAgIHRocmVhZCA9IHRocmVhZEZhY3RvcnktPm5ld1RocmVhZChydW5uZXIpOworICAgIHRocmVhZC0+c3RhcnQoKTsKKyAgICBydW5uZXItPnJlYWR5QmFycmllcigpOwogCi0gICAgaW50IHJldHJ5X2NvdW50ID0gcG9ydCA/IDEwIDogMDsKLSAgICBmb3IgKGludCBwID0gcG9ydDsgcCA8PSBwb3J0ICsgcmV0cnlfY291bnQ7IHArKykgewotICAgICAgc2VydmVyLnJlc2V0KG5ldyBzZXJ2ZXI6OlROb25ibG9ja2luZ1NlcnZlcihwcm9jZXNzb3IsIHApKTsKLSAgICAgIGlmICh1c2VyRXZlbnRCYXNlXykgewotICAgICAgICB0cnkgewotICAgICAgICAgIHNlcnZlci0+cmVnaXN0ZXJFdmVudHModXNlckV2ZW50QmFzZV8uZ2V0KCkpOwotICAgICAgICB9IGNhdGNoIChjb25zdCBURXhjZXB0aW9uJikgewotICAgICAgICAgIC8vIHJldHJ5IHdpdGggbmV4dCBwb3J0Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5lcj4gcnVubmVyKG5ldyBSdW5uZXIpOwotICAgICAgcnVubmVyLT5zZXJ2ZXIgPSBzZXJ2ZXI7Ci0gICAgICB0aHJlYWQgPSB0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQocnVubmVyKTsKLSAgICAgIHRocmVhZC0+c3RhcnQoKTsKLSAgICAgIC8vIHdhaXQgNTBtcyBmb3IgdGhlIHNlcnZlciB0byBiZWdpbiBsaXN0ZW5pbmcKLSAgICAgIFRIUklGVF9TTEVFUF9VU0VDKDUwMDAwKTsKLSAgICAgIGlmICghcnVubmVyLT5lcnJvcikgewotICAgICAgICByZXR1cm4gcDsKLSAgICAgIH0KLSAgICB9Ci0gICAgdGhyb3cgdHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uKHRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gc3RhcnQgc2VydmVyLiIpOworICAgIHNlcnZlciA9IHJ1bm5lci0+c2VydmVyOworICAgIHJldHVybiBydW5uZXItPnBvcnQ7CiAgIH0KIAogICBib29sIGNhbkNvbW11bmljYXRlKGludCBzZXJ2ZXJQb3J0KSB7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8dHJhbnNwb3J0OjpUU29ja2V0PiBzb2NrZXQobmV3IHRyYW5zcG9ydDo6VFNvY2tldCgibG9jYWxob3N0Iiwgc2VydmVyUG9ydCkpOworICAgIHNoYXJlZF9wdHI8dHJhbnNwb3J0OjpUU29ja2V0PiBzb2NrZXQobmV3IHRyYW5zcG9ydDo6VFNvY2tldCgibG9jYWxob3N0Iiwgc2VydmVyUG9ydCkpOwogICAgIHNvY2tldC0+b3BlbigpOwotICAgIHRlc3Q6OlBhcmVudFNlcnZpY2VDbGllbnQgY2xpZW50KGJvb3N0OjptYWtlX3NoYXJlZDxwcm90b2NvbDo6VEJpbmFyeVByb3RvY29sPigKLSAgICAgICAgYm9vc3Q6Om1ha2Vfc2hhcmVkPHRyYW5zcG9ydDo6VEZyYW1lZFRyYW5zcG9ydD4oc29ja2V0KSkpOworICAgIHRlc3Q6OlBhcmVudFNlcnZpY2VDbGllbnQgY2xpZW50KG1ha2Vfc2hhcmVkPHByb3RvY29sOjpUQmluYXJ5UHJvdG9jb2w+KAorICAgICAgICBtYWtlX3NoYXJlZDx0cmFuc3BvcnQ6OlRGcmFtZWRUcmFuc3BvcnQ+KHNvY2tldCkpKTsKICAgICBjbGllbnQuYWRkU3RyaW5nKCJmb28iKTsKICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc3RyaW5nczsKICAgICBjbGllbnQuZ2V0U3RyaW5ncyhzdHJpbmdzKTsKQEAgLTEyNiwxMiArMTczLDEzIEBACiAgIH0KIAogcHJpdmF0ZToKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8ZXZlbnRfYmFzZT4gdXNlckV2ZW50QmFzZV87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPHRlc3Q6OlBhcmVudFNlcnZpY2VQcm9jZXNzb3I+IHByb2Nlc3NvcjsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWQ+IHRocmVhZDsKLQorICBzaGFyZWRfcHRyPGV2ZW50X2Jhc2U+IHVzZXJFdmVudEJhc2VfOworICBzaGFyZWRfcHRyPHRlc3Q6OlBhcmVudFNlcnZpY2VQcm9jZXNzb3I+IHByb2Nlc3NvcjsKIHByb3RlY3RlZDoKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8c2VydmVyOjpUTm9uYmxvY2tpbmdTZXJ2ZXI+IHNlcnZlcjsKKyAgc2hhcmVkX3B0cjxzZXJ2ZXI6OlROb25ibG9ja2luZ1NlcnZlcj4gc2VydmVyOworcHJpdmF0ZToKKyAgc2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZD4gdGhyZWFkOworCiB9OwogCiBCT09TVF9BVVRPX1RFU1RfU1VJVEUoVE5vbmJsb2NraW5nU2VydmVyVGVzdCkKQEAgLTE0Myw3ICsxOTEsNiBAQAogICBCT09TVF9DSEVDSyhjYW5Db21tdW5pY2F0ZShzcGVjaWZpZWRfcG9ydCkpOwogCiAgIHNlcnZlci0+c3RvcCgpOwotICBCT09TVF9DSEVDS19FUVVBTChzZXJ2ZXItPmdldExpc3RlblBvcnQoKSwgc3BlY2lmaWVkX3BvcnQpOwogfQogCiBCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRShnZXRfYXNzaWduZWRfcG9ydCwgRml4dHVyZSkgewpAQCAtMTU0LDcgKzIwMSw2IEBACiAgIEJPT1NUX0NIRUNLKGNhbkNvbW11bmljYXRlKGFzc2lnbmVkX3BvcnQpKTsKIAogICBzZXJ2ZXItPnN0b3AoKTsKLSAgQk9PU1RfQ0hFQ0tfRVFVQUwoc2VydmVyLT5nZXRMaXN0ZW5Qb3J0KCksIDApOwogfQogCiBCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRShwcm92aWRlX2V2ZW50X2Jhc2UsIEZpeHR1cmUpIHsKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9UUGlwZUludGVycnVwdFRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L1RQaXBlSW50ZXJydXB0VGVzdC5jcHAKaW5kZXggZTJmMjQ4OS4uMjQyM2Y1NiAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L1RQaXBlSW50ZXJydXB0VGVzdC5jcHAKKysrIGIvbGliL2NwcC90ZXN0L1RQaXBlSW50ZXJydXB0VGVzdC5jcHAKQEAgLTIyLDE3ICsyMiwxOCBAQAogI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdGVzdF90b29scy5ocHA+CiAjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3Rfc3VpdGUuaHBwPgogCi0jaW5jbHVkZSA8Ym9vc3QvYmluZC5ocHA+CiAjaW5jbHVkZSA8Ym9vc3QvY2hyb25vL2R1cmF0aW9uLmhwcD4KICNpbmNsdWRlIDxib29zdC9kYXRlX3RpbWUvcG9zaXhfdGltZS9wb3NpeF90aW1lX2R1cmF0aW9uLmhwcD4KICNpbmNsdWRlIDxib29zdC90aHJlYWQvdGhyZWFkLmhwcD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RQaXBlLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UUGlwZVNlcnZlci5oPgorI2luY2x1ZGUgPG1lbW9yeT4KIAogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFBpcGVTZXJ2ZXI7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUUGlwZTsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwogCiBCT09TVF9BVVRPX1RFU1RfU1VJVEUoVFBpcGVJbnRlcnJ1cHRUZXN0KQogCkBAIC01MSw3ICs1Miw3IEBACiAgIHsKICAgICBmb3IgKDs7KQogICAgIHsKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRlbXAgPSBwaXBlLT5hY2NlcHQoKTsKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0ZW1wID0gcGlwZS0+YWNjZXB0KCk7CiAgICAgfQogICB9CiAgIGNhdGNoICguLi4pIHsvKmp1c3Qgd2FudCB0byBtYWtlIHN1cmUgbm90aGluZyBjcmFzaGVzKi8gfQpAQCAtNjMsMTQgKzY0LDE0IEBACiB9CiAKIEJPT1NUX0FVVE9fVEVTVF9DQVNFKHN0cmVzc19waXBlX2FjY2VwdF9pbnRlcnJ1cHRpb24pIHsKLSAgaW50IGludGVycnVwdEl0ZXJzID0gMTAwOworICBpbnQgaW50ZXJydXB0SXRlcnMgPSAxMDsKIAogICBmb3IgKGludCBpID0gMDsgaSA8IGludGVycnVwdEl0ZXJzOyArK2kpCiAgIHsKICAgICBUUGlwZVNlcnZlciBwaXBlU2VydmVyKCJUUGlwZUludGVycnVwdFRlc3QiKTsKICAgICBwaXBlU2VydmVyLmxpc3RlbigpOwotICAgIGJvb3N0Ojp0aHJlYWQgYWNjZXB0VGhyZWFkKGJvb3N0OjpiaW5kKGFjY2VwdFdvcmtlciwgJnBpcGVTZXJ2ZXIpKTsKLSAgICBib29zdDo6dGhyZWFkIGludGVycnVwdFRocmVhZChib29zdDo6YmluZChpbnRlcnJ1cHRXb3JrZXIsICZwaXBlU2VydmVyKSk7CisgICAgYm9vc3Q6OnRocmVhZCBhY2NlcHRUaHJlYWQoc3RkOjpiaW5kKGFjY2VwdFdvcmtlciwgJnBpcGVTZXJ2ZXIpKTsKKyAgICBib29zdDo6dGhyZWFkIGludGVycnVwdFRocmVhZChzdGQ6OmJpbmQoaW50ZXJydXB0V29ya2VyLCAmcGlwZVNlcnZlcikpOwogICAgIHRyeQogICAgIHsKICAgICAgIGZvciAoOzspCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvVFBpcGVkVHJhbnNwb3J0VGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvVFBpcGVkVHJhbnNwb3J0VGVzdC5jcHAKaW5kZXggMzIyMWZiOS4uZjMwOTFhNCAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L1RQaXBlZFRyYW5zcG9ydFRlc3QuY3BwCisrKyBiL2xpYi9jcHAvdGVzdC9UUGlwZWRUcmFuc3BvcnRUZXN0LmNwcApAQCAtMTgsNiArMTgsNyBAQAogICovCiAKICNpbmNsdWRlIDx0aHJpZnQvVGhyaWZ0Lmg+CisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgogCkBAIC0yNywxMSArMjgsMTIgQEAKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb247CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUUGlwZWRUcmFuc3BvcnQ7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyOwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwogCiBCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X3JlYWRfd3JpdGUpIHsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gdW5kZXJseWluZyhuZXcgVE1lbW9yeUJ1ZmZlcik7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IHBpcGUobmV3IFRNZW1vcnlCdWZmZXIpOwotICBib29zdDo6c2hhcmVkX3B0cjxUUGlwZWRUcmFuc3BvcnQ+IHRyYW5zKG5ldyBUUGlwZWRUcmFuc3BvcnQodW5kZXJseWluZywgcGlwZSkpOworICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gdW5kZXJseWluZyhuZXcgVE1lbW9yeUJ1ZmZlcik7CisgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBwaXBlKG5ldyBUTWVtb3J5QnVmZmVyKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQaXBlZFRyYW5zcG9ydD4gdHJhbnMobmV3IFRQaXBlZFRyYW5zcG9ydCh1bmRlcmx5aW5nLCBwaXBlKSk7CiAKICAgdWludDhfdCBidWZmZXJbNF07CiAKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9UU1NMU29ja2V0SW50ZXJydXB0VGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvVFNTTFNvY2tldEludGVycnVwdFRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZjY4NmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvVFNTTFNvY2tldEludGVycnVwdFRlc3QuY3BwCkBAIC0wLDAgKzEsMjgyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxib29zdC90ZXN0L2F1dG9fdW5pdF90ZXN0LmhwcD4KKyNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdF9zdWl0ZS5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvY2hyb25vL2R1cmF0aW9uLmhwcD4KKyNpbmNsdWRlIDxib29zdC9kYXRlX3RpbWUvcG9zaXhfdGltZS9wb3NpeF90aW1lX2R1cmF0aW9uLmhwcD4KKyNpbmNsdWRlIDxib29zdC90aHJlYWQvdGhyZWFkLmhwcD4KKyNpbmNsdWRlIDxib29zdC9maWxlc3lzdGVtLmhwcD4KKyNpbmNsdWRlIDxib29zdC9mb3JtYXQuaHBwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTU0xTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTU0xTZXJ2ZXJTb2NrZXQuaD4KKyNpZmRlZiBfX2xpbnV4X18KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNlbmRpZgorCit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU1NMU2VydmVyU29ja2V0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNTTFNvY2tldDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNTTFNvY2tldEZhY3Rvcnk7CisKK3VzaW5nIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKKworQk9PU1RfQVVUT19URVNUX1NVSVRFKFRTU0xTb2NrZXRJbnRlcnJ1cHRUZXN0KQorCitib29zdDo6ZmlsZXN5c3RlbTo6cGF0aCBrZXlEaXI7Citib29zdDo6ZmlsZXN5c3RlbTo6cGF0aCBjZXJ0RmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUpCit7CisgIHJldHVybiBrZXlEaXIgLyBmaWxlbmFtZTsKK30KK2Jvb3N0OjptdXRleCBnTXV0ZXg7CisKK3N0cnVjdCBHbG9iYWxGaXh0dXJlU1NMCit7CisgICAgR2xvYmFsRml4dHVyZVNTTCgpCisgICAgeworICAgICAgdXNpbmcgbmFtZXNwYWNlIGJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFzdGVyX3Rlc3Rfc3VpdGUoKS5hcmdjOyArK2kpCisgICAgICB7CisgICAgICAgIEJPT1NUX1RFU1RfTUVTU0FHRShib29zdDo6Zm9ybWF0KCJhcmd2WyUxJV0gPSBcIiUyJVwiIikgJSBpICUgbWFzdGVyX3Rlc3Rfc3VpdGUoKS5hcmd2W2ldKTsKKyAgICAgIH0KKworI2lmZGVmIF9fbGludXhfXworICAgICAgLy8gT3BlblNTTCBjYWxscyBzZW5kKCkgd2l0aG91dCBNU0dfTk9TSUdQSVBFIHNvIHdyaXRpbmcgdG8gYSBzb2NrZXQgdGhhdCBoYXMKKyAgICAgIC8vIGRpc2Nvbm5lY3RlZCBjYW4gY2F1c2UgYSBTSUdQSVBFIHNpZ25hbC4uLgorICAgICAgc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOworI2VuZGlmCisKKyAgICAgIFRTU0xTb2NrZXRGYWN0b3J5OjpzZXRNYW51YWxPcGVuU1NMSW5pdGlhbGl6YXRpb24odHJ1ZSk7CisgICAgICBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0Ojppbml0aWFsaXplT3BlblNTTCgpOworCisgICAgICBrZXlEaXIgPSBib29zdDo6ZmlsZXN5c3RlbTo6Y3VycmVudF9wYXRoKCkucGFyZW50X3BhdGgoKS5wYXJlbnRfcGF0aCgpLnBhcmVudF9wYXRoKCkgLyAidGVzdCIgLyAia2V5cyI7CisgICAgICBpZiAoIWJvb3N0OjpmaWxlc3lzdGVtOjpleGlzdHMoY2VydEZpbGUoInNlcnZlci5jcnQiKSkpCisgICAgICB7CisgICAgICAgIGtleURpciA9IGJvb3N0OjpmaWxlc3lzdGVtOjpwYXRoKG1hc3Rlcl90ZXN0X3N1aXRlKCkuYXJndlttYXN0ZXJfdGVzdF9zdWl0ZSgpLmFyZ2MgLSAxXSk7CisgICAgICAgIGlmICghYm9vc3Q6OmZpbGVzeXN0ZW06OmV4aXN0cyhjZXJ0RmlsZSgic2VydmVyLmNydCIpKSkKKyAgICAgICAgeworICAgICAgICAgIHRocm93IHN0ZDo6aW52YWxpZF9hcmd1bWVudCgiVGhlIGxhc3QgYXJndW1lbnQgdG8gdGhpcyB0ZXN0IG11c3QgYmUgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSB0ZXN0IGNlcnRpZmljYXRlKHMpLiIpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgdmlydHVhbCB+R2xvYmFsRml4dHVyZVNTTCgpCisgICAgeworICAgICAgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6Y2xlYW51cE9wZW5TU0woKTsKKyNpZmRlZiBfX2xpbnV4X18KKyAgICAgIHNpZ25hbChTSUdQSVBFLCBTSUdfREZMKTsKKyNlbmRpZgorICAgIH0KK307CisKKyNpZiAoQk9PU1RfVkVSU0lPTiA+PSAxMDU5MDApCitCT09TVF9HTE9CQUxfRklYVFVSRShHbG9iYWxGaXh0dXJlU1NMKTsKKyNlbHNlCitCT09TVF9HTE9CQUxfRklYVFVSRShHbG9iYWxGaXh0dXJlU1NMKQorI2VuZGlmCisKK3ZvaWQgcmVhZGVyV29ya2VyKHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHQsIHVpbnQzMl90IGV4cGVjdGVkUmVzdWx0KSB7CisgIHVpbnQ4X3QgYnVmWzRdOworICB0cnkgeworICAgIHR0LT5yZWFkKGJ1ZiwgMSk7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoZXhwZWN0ZWRSZXN1bHQsIHR0LT5yZWFkKGJ1ZiwgNCkpOworICB9IGNhdGNoIChjb25zdCBUVHJhbnNwb3J0RXhjZXB0aW9uJiB0eCkgeworICAgIEJPT1NUX0NIRUNLX0VRVUFMKFRUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCwgdHguZ2V0VHlwZSgpKTsKKyAgfQorfQorCit2b2lkIHJlYWRlcldvcmtlck11c3RUaHJvdyhzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHR0KSB7CisgIHRyeSB7CisgICAgdWludDhfdCBidWZbNDAwXTsKKyAgICB0dC0+cmVhZChidWYsIDEpOworICAgIHR0LT5yZWFkKGJ1ZiwgNDAwKTsKKyAgICBCT09TVF9FUlJPUigic2hvdWxkIG5vdCBoYXZlIGdvdHRlbiBoZXJlIik7CisgIH0gY2F0Y2ggKGNvbnN0IFRUcmFuc3BvcnRFeGNlcHRpb24mIHR4KSB7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoVFRyYW5zcG9ydEV4Y2VwdGlvbjo6SU5URVJSVVBURUQsIHR4LmdldFR5cGUoKSk7CisgIH0KK30KKworc2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gY3JlYXRlU2VydmVyU29ja2V0RmFjdG9yeSgpIHsKKyAgc2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gcFNlcnZlclNvY2tldEZhY3Rvcnk7CisKKyAgcFNlcnZlclNvY2tldEZhY3RvcnkucmVzZXQobmV3IFRTU0xTb2NrZXRGYWN0b3J5KCkpOworICBwU2VydmVyU29ja2V0RmFjdG9yeS0+Y2lwaGVycygiQUxMOiFBREg6IUxPVzohRVhQOiFNRDU6QFNUUkVOR1RIIik7CisgIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5LT5sb2FkQ2VydGlmaWNhdGUoY2VydEZpbGUoInNlcnZlci5jcnQiKS5zdHJpbmcoKS5jX3N0cigpKTsKKyAgcFNlcnZlclNvY2tldEZhY3RvcnktPmxvYWRQcml2YXRlS2V5KGNlcnRGaWxlKCJzZXJ2ZXIua2V5Iikuc3RyaW5nKCkuY19zdHIoKSk7CisgIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5LT5zZXJ2ZXIodHJ1ZSk7CisgIHJldHVybiBwU2VydmVyU29ja2V0RmFjdG9yeTsKK30KKworc2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gY3JlYXRlQ2xpZW50U29ja2V0RmFjdG9yeSgpIHsKKyAgc2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gcENsaWVudFNvY2tldEZhY3Rvcnk7CisKKyAgcENsaWVudFNvY2tldEZhY3RvcnkucmVzZXQobmV3IFRTU0xTb2NrZXRGYWN0b3J5KCkpOworICBwQ2xpZW50U29ja2V0RmFjdG9yeS0+YXV0aGVudGljYXRlKHRydWUpOworICBwQ2xpZW50U29ja2V0RmFjdG9yeS0+bG9hZENlcnRpZmljYXRlKGNlcnRGaWxlKCJjbGllbnQuY3J0Iikuc3RyaW5nKCkuY19zdHIoKSk7CisgIHBDbGllbnRTb2NrZXRGYWN0b3J5LT5sb2FkUHJpdmF0ZUtleShjZXJ0RmlsZSgiY2xpZW50LmtleSIpLnN0cmluZygpLmNfc3RyKCkpOworICBwQ2xpZW50U29ja2V0RmFjdG9yeS0+bG9hZFRydXN0ZWRDZXJ0aWZpY2F0ZXMoY2VydEZpbGUoIkNBLnBlbSIpLnN0cmluZygpLmNfc3RyKCkpOworICByZXR1cm4gcENsaWVudFNvY2tldEZhY3Rvcnk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfc3NsX2ludGVycnVwdGFibGVfY2hpbGRfcmVhZF93aGlsZV9oYW5kc2hha2luZykgeworICBzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBwU2VydmVyU29ja2V0RmFjdG9yeSA9IGNyZWF0ZVNlcnZlclNvY2tldEZhY3RvcnkoKTsKKyAgVFNTTFNlcnZlclNvY2tldCBzb2NrMSgibG9jYWxob3N0IiwgMCwgcFNlcnZlclNvY2tldEZhY3RvcnkpOworICBzb2NrMS5saXN0ZW4oKTsKKyAgaW50IHBvcnQgPSBzb2NrMS5nZXRQb3J0KCk7CisgIHNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IHBDbGllbnRTb2NrZXRGYWN0b3J5ID0gY3JlYXRlQ2xpZW50U29ja2V0RmFjdG9yeSgpOworICBzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IGNsaWVudFNvY2sgPSBwQ2xpZW50U29ja2V0RmFjdG9yeS0+Y3JlYXRlU29ja2V0KCJsb2NhbGhvc3QiLCBwb3J0KTsKKyAgY2xpZW50U29jay0+b3BlbigpOworICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdGVkID0gc29jazEuYWNjZXB0KCk7CisgIGJvb3N0Ojp0aHJlYWQgcmVhZFRocmVhZChzdGQ6OmJpbmQocmVhZGVyV29ya2VyTXVzdFRocm93LCBhY2NlcHRlZCkpOworICBib29zdDo6dGhpc190aHJlYWQ6OnNsZWVwKGJvb3N0Ojpwb3NpeF90aW1lOjptaWxsaXNlY29uZHMoNTApKTsKKyAgLy8gcmVhZFRocmVhZCBpcyBwcmFjdGljYWxseSBndWFyYW50ZWVkIHRvIGJlIGJsb2NraW5nIG5vdworICBzb2NrMS5pbnRlcnJ1cHRDaGlsZHJlbigpOworICBCT09TVF9DSEVDS19NRVNTQUdFKHJlYWRUaHJlYWQudHJ5X2pvaW5fZm9yKGJvb3N0OjpjaHJvbm86Om1pbGxpc2Vjb25kcygyMCkpLAorICAic2VydmVyIHNvY2tldCBpbnRlcnJ1cHRDaGlsZHJlbiBkaWQgbm90IGludGVycnVwdCBjaGlsZCByZWFkIik7CisgIGNsaWVudFNvY2stPmNsb3NlKCk7CisgIGFjY2VwdGVkLT5jbG9zZSgpOworICBzb2NrMS5jbG9zZSgpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X3NzbF9pbnRlcnJ1cHRhYmxlX2NoaWxkX3JlYWQpIHsKKyAgc2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gcFNlcnZlclNvY2tldEZhY3RvcnkgPSBjcmVhdGVTZXJ2ZXJTb2NrZXRGYWN0b3J5KCk7CisgIFRTU0xTZXJ2ZXJTb2NrZXQgc29jazEoImxvY2FsaG9zdCIsIDAsIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5KTsKKyAgc29jazEubGlzdGVuKCk7CisgIGludCBwb3J0ID0gc29jazEuZ2V0UG9ydCgpOworICBzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBwQ2xpZW50U29ja2V0RmFjdG9yeSA9IGNyZWF0ZUNsaWVudFNvY2tldEZhY3RvcnkoKTsKKyAgc2hhcmVkX3B0cjxUU1NMU29ja2V0PiBjbGllbnRTb2NrID0gcENsaWVudFNvY2tldEZhY3RvcnktPmNyZWF0ZVNvY2tldCgibG9jYWxob3N0IiwgcG9ydCk7CisgIGNsaWVudFNvY2stPm9wZW4oKTsKKyAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHRlZCA9IHNvY2sxLmFjY2VwdCgpOworICBib29zdDo6dGhyZWFkIHJlYWRUaHJlYWQoc3RkOjpiaW5kKHJlYWRlcldvcmtlck11c3RUaHJvdywgYWNjZXB0ZWQpKTsKKyAgY2xpZW50U29jay0+d3JpdGUoKGNvbnN0IHVpbnQ4X3QqKSIwIiwgMSk7CisgIGJvb3N0Ojp0aGlzX3RocmVhZDo6c2xlZXAoYm9vc3Q6OnBvc2l4X3RpbWU6Om1pbGxpc2Vjb25kcyg1MCkpOworICAvLyByZWFkVGhyZWFkIGlzIHByYWN0aWNhbGx5IGd1YXJhbnRlZWQgdG8gYmUgYmxvY2tpbmcgbm93CisgIHNvY2sxLmludGVycnVwdENoaWxkcmVuKCk7CisgIEJPT1NUX0NIRUNLX01FU1NBR0UocmVhZFRocmVhZC50cnlfam9pbl9mb3IoYm9vc3Q6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDIwKSksCisgICAgICAgICAgICAgICAgICAgICAgInNlcnZlciBzb2NrZXQgaW50ZXJydXB0Q2hpbGRyZW4gZGlkIG5vdCBpbnRlcnJ1cHQgY2hpbGQgcmVhZCIpOworICBhY2NlcHRlZC0+Y2xvc2UoKTsKKyAgY2xpZW50U29jay0+Y2xvc2UoKTsKKyAgc29jazEuY2xvc2UoKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9zc2xfbm9uX2ludGVycnVwdGFibGVfY2hpbGRfcmVhZCkgeworICBzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBwU2VydmVyU29ja2V0RmFjdG9yeSA9IGNyZWF0ZVNlcnZlclNvY2tldEZhY3RvcnkoKTsKKyAgVFNTTFNlcnZlclNvY2tldCBzb2NrMSgibG9jYWxob3N0IiwgMCwgcFNlcnZlclNvY2tldEZhY3RvcnkpOworICBzb2NrMS5zZXRJbnRlcnJ1cHRhYmxlQ2hpbGRyZW4oZmFsc2UpOyAvLyByZXR1cm5zIHRvIHByZS1USFJJRlQtMjQ0MSBiZWhhdmlvcgorICBzb2NrMS5saXN0ZW4oKTsKKyAgaW50IHBvcnQgPSBzb2NrMS5nZXRQb3J0KCk7CisgIHNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IHBDbGllbnRTb2NrZXRGYWN0b3J5ID0gY3JlYXRlQ2xpZW50U29ja2V0RmFjdG9yeSgpOworICBzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IGNsaWVudFNvY2sgPSBwQ2xpZW50U29ja2V0RmFjdG9yeS0+Y3JlYXRlU29ja2V0KCJsb2NhbGhvc3QiLCBwb3J0KTsKKyAgY2xpZW50U29jay0+b3BlbigpOworICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdGVkID0gc29jazEuYWNjZXB0KCk7CisgIHN0YXRpY19wb2ludGVyX2Nhc3Q8VFNTTFNvY2tldD4oYWNjZXB0ZWQpLT5zZXRSZWN2VGltZW91dCgxMDAwKTsKKyAgYm9vc3Q6OnRocmVhZCByZWFkVGhyZWFkKHN0ZDo6YmluZChyZWFkZXJXb3JrZXIsIGFjY2VwdGVkLCAwKSk7CisgIGNsaWVudFNvY2stPndyaXRlKChjb25zdCB1aW50OF90KikiMCIsIDEpOworICBib29zdDo6dGhpc190aHJlYWQ6OnNsZWVwKGJvb3N0Ojpwb3NpeF90aW1lOjptaWxsaXNlY29uZHMoNTApKTsKKyAgLy8gcmVhZFRocmVhZCBpcyBwcmFjdGljYWxseSBndWFyYW50ZWVkIHRvIGJlIGJsb2NraW5nIGhlcmUKKyAgc29jazEuaW50ZXJydXB0Q2hpbGRyZW4oKTsKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRSghcmVhZFRocmVhZC50cnlfam9pbl9mb3IoYm9vc3Q6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDIwMCkpLAorICAgICAgICAgICAgICAgICAgICAgICJzZXJ2ZXIgc29ja2V0IGludGVycnVwdENoaWxkcmVuIGludGVycnVwdGVkIGNoaWxkIHJlYWQiKTsKKworICAvLyB3YWl0IGZvciByZWNlaXZlIHRpbWVvdXQgdG8ga2ljayBpbgorICByZWFkVGhyZWFkLmpvaW4oKTsKKyAgYWNjZXB0ZWQtPmNsb3NlKCk7CisgIGNsaWVudFNvY2stPmNsb3NlKCk7CisgIHNvY2sxLmNsb3NlKCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfc3NsX2Nhbm5vdF9jaGFuZ2VfYWZ0ZXJfbGlzdGVuKSB7CisgIHNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IHBTZXJ2ZXJTb2NrZXRGYWN0b3J5ID0gY3JlYXRlU2VydmVyU29ja2V0RmFjdG9yeSgpOworICBUU1NMU2VydmVyU29ja2V0IHNvY2sxKCJsb2NhbGhvc3QiLCAwLCBwU2VydmVyU29ja2V0RmFjdG9yeSk7CisgIHNvY2sxLmxpc3RlbigpOworICBCT09TVF9DSEVDS19USFJPVyhzb2NrMS5zZXRJbnRlcnJ1cHRhYmxlQ2hpbGRyZW4oZmFsc2UpLCBzdGQ6OmxvZ2ljX2Vycm9yKTsKKyAgc29jazEuY2xvc2UoKTsKK30KKwordm9pZCBwZWVrZXJXb3JrZXIoc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0dCwgYm9vbCBleHBlY3RlZFJlc3VsdCkgeworICB1aW50OF90IGJ1Zls0MDBdOworICB0cnkgeworICAgIHR0LT5yZWFkKGJ1ZiwgMSk7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoZXhwZWN0ZWRSZXN1bHQsIHR0LT5wZWVrKCkpOworICB9IGNhdGNoIChjb25zdCBUVHJhbnNwb3J0RXhjZXB0aW9uJiB0eCkgeworICAgIEJPT1NUX0NIRUNLX0VRVUFMKFRUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCwgdHguZ2V0VHlwZSgpKTsKKyAgfQorfQorCit2b2lkIHBlZWtlcldvcmtlckludGVycnVwdChzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHR0KSB7CisgIHVpbnQ4X3QgYnVmWzQwMF07CisgIHRyeSB7CisgICAgdHQtPnJlYWQoYnVmLCAxKTsKKyAgICB0dC0+cGVlaygpOworICB9IGNhdGNoIChjb25zdCBUVHJhbnNwb3J0RXhjZXB0aW9uJiB0eCkgeworICAgIEJPT1NUX0NIRUNLX0VRVUFMKFRUcmFuc3BvcnRFeGNlcHRpb246OklOVEVSUlVQVEVELCB0eC5nZXRUeXBlKCkpOworICB9Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfc3NsX2ludGVycnVwdGFibGVfY2hpbGRfcGVlaykgeworICBzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBwU2VydmVyU29ja2V0RmFjdG9yeSA9IGNyZWF0ZVNlcnZlclNvY2tldEZhY3RvcnkoKTsKKyAgVFNTTFNlcnZlclNvY2tldCBzb2NrMSgibG9jYWxob3N0IiwgMCwgcFNlcnZlclNvY2tldEZhY3RvcnkpOworICBzb2NrMS5saXN0ZW4oKTsKKyAgaW50IHBvcnQgPSBzb2NrMS5nZXRQb3J0KCk7CisgIHNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IHBDbGllbnRTb2NrZXRGYWN0b3J5ID0gY3JlYXRlQ2xpZW50U29ja2V0RmFjdG9yeSgpOworICBzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IGNsaWVudFNvY2sgPSBwQ2xpZW50U29ja2V0RmFjdG9yeS0+Y3JlYXRlU29ja2V0KCJsb2NhbGhvc3QiLCBwb3J0KTsKKyAgY2xpZW50U29jay0+b3BlbigpOworICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdGVkID0gc29jazEuYWNjZXB0KCk7CisgIGJvb3N0Ojp0aHJlYWQgcGVla1RocmVhZChzdGQ6OmJpbmQocGVla2VyV29ya2VySW50ZXJydXB0LCBhY2NlcHRlZCkpOworICBjbGllbnRTb2NrLT53cml0ZSgoY29uc3QgdWludDhfdCopIjAiLCAxKTsKKyAgYm9vc3Q6OnRoaXNfdGhyZWFkOjpzbGVlcChib29zdDo6cG9zaXhfdGltZTo6bWlsbGlzZWNvbmRzKDUwKSk7CisgIC8vIHBlZWtUaHJlYWQgaXMgcHJhY3RpY2FsbHkgZ3VhcmFudGVlZCB0byBiZSBibG9ja2luZyBub3cKKyAgc29jazEuaW50ZXJydXB0Q2hpbGRyZW4oKTsKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRShwZWVrVGhyZWFkLnRyeV9qb2luX2Zvcihib29zdDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMjAwKSksCisgICAgICAgICAgICAgICAgICAgICAgInNlcnZlciBzb2NrZXQgaW50ZXJydXB0Q2hpbGRyZW4gZGlkIG5vdCBpbnRlcnJ1cHQgY2hpbGQgcGVlayIpOworICBhY2NlcHRlZC0+Y2xvc2UoKTsKKyAgY2xpZW50U29jay0+Y2xvc2UoKTsKKyAgc29jazEuY2xvc2UoKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9zc2xfbm9uX2ludGVycnVwdGFibGVfY2hpbGRfcGVlaykgeworICBzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBwU2VydmVyU29ja2V0RmFjdG9yeSA9IGNyZWF0ZVNlcnZlclNvY2tldEZhY3RvcnkoKTsKKyAgVFNTTFNlcnZlclNvY2tldCBzb2NrMSgibG9jYWxob3N0IiwgMCwgcFNlcnZlclNvY2tldEZhY3RvcnkpOworICBzb2NrMS5zZXRJbnRlcnJ1cHRhYmxlQ2hpbGRyZW4oZmFsc2UpOyAvLyByZXR1cm5zIHRvIHByZS1USFJJRlQtMjQ0MSBiZWhhdmlvcgorICBzb2NrMS5saXN0ZW4oKTsKKyAgaW50IHBvcnQgPSBzb2NrMS5nZXRQb3J0KCk7CisgIHNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IHBDbGllbnRTb2NrZXRGYWN0b3J5ID0gY3JlYXRlQ2xpZW50U29ja2V0RmFjdG9yeSgpOworICBzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IGNsaWVudFNvY2sgPSBwQ2xpZW50U29ja2V0RmFjdG9yeS0+Y3JlYXRlU29ja2V0KCJsb2NhbGhvc3QiLCBwb3J0KTsKKyAgY2xpZW50U29jay0+b3BlbigpOworICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdGVkID0gc29jazEuYWNjZXB0KCk7CisgIHN0YXRpY19wb2ludGVyX2Nhc3Q8VFNTTFNvY2tldD4oYWNjZXB0ZWQpLT5zZXRSZWN2VGltZW91dCgxMDAwKTsKKyAgYm9vc3Q6OnRocmVhZCBwZWVrVGhyZWFkKHN0ZDo6YmluZChwZWVrZXJXb3JrZXIsIGFjY2VwdGVkLCBmYWxzZSkpOworICBjbGllbnRTb2NrLT53cml0ZSgoY29uc3QgdWludDhfdCopIjAiLCAxKTsKKyAgYm9vc3Q6OnRoaXNfdGhyZWFkOjpzbGVlcChib29zdDo6cG9zaXhfdGltZTo6bWlsbGlzZWNvbmRzKDUwKSk7CisgIC8vIHBlZWtUaHJlYWQgaXMgcHJhY3RpY2FsbHkgZ3VhcmFudGVlZCB0byBiZSBibG9ja2luZyBub3cKKyAgc29jazEuaW50ZXJydXB0Q2hpbGRyZW4oKTsKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRSghcGVla1RocmVhZC50cnlfam9pbl9mb3IoYm9vc3Q6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDIwMCkpLAorICAgICAgICAgICAgICAgICAgICAgICJzZXJ2ZXIgc29ja2V0IGludGVycnVwdENoaWxkcmVuIGludGVycnVwdGVkIGNoaWxkIHBlZWsiKTsKKworICAvLyB3YWl0IGZvciB0aGUgcmVjZWl2ZSB0aW1lb3V0IHRvIGtpY2sgaW4KKyAgcGVla1RocmVhZC5qb2luKCk7CisgIGFjY2VwdGVkLT5jbG9zZSgpOworICBjbGllbnRTb2NrLT5jbG9zZSgpOworICBzb2NrMS5jbG9zZSgpOworfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9UU2VydmVySW50ZWdyYXRpb25UZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9UU2VydmVySW50ZWdyYXRpb25UZXN0LmNwcAppbmRleCBmNTMwNzcxLi43OTc2YzhiIDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvVFNlcnZlckludGVncmF0aW9uVGVzdC5jcHAKKysrIGIvbGliL2NwcC90ZXN0L1RTZXJ2ZXJJbnRlZ3JhdGlvblRlc3QuY3BwCkBAIC0xOCwyMiArMTgsMjIgQEAKICAqLwogCiAjZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIFRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3QKKyNpbmNsdWRlIDxhdG9taWM+CiAjaW5jbHVkZSA8Ym9vc3QvdGVzdC9hdXRvX3VuaXRfdGVzdC5ocHA+Ci0jaW5jbHVkZSA8Ym9vc3QvYmluZC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvZGF0ZV90aW1lL3Bvc2l4X3RpbWUvcHRpbWUuaHBwPgogI2luY2x1ZGUgPGJvb3N0L2ZvcmVhY2guaHBwPgogI2luY2x1ZGUgPGJvb3N0L2Zvcm1hdC5ocHA+Ci0jaW5jbHVkZSA8Ym9vc3QvbWFrZV9zaGFyZWQuaHBwPgotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgogI2luY2x1ZGUgPGJvb3N0L3RocmVhZC5ocHA+CiAjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5oPgogI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmg+CisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4KICNpbmNsdWRlICJnZW4tY3BwL1BhcmVudFNlcnZpY2UuaCIKLSNpbmNsdWRlICJUZXN0UG9ydEZpeHR1cmUuaCIKKyNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dmVjdG9yPgogCiB1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Okd1YXJkOwpAQCAtNTUsNiArNTUsOSBAQAogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjo6VFNpbXBsZVNlcnZlcjsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI6OlRUaHJlYWRQb29sU2VydmVyOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjo6VFRocmVhZGVkU2VydmVyOwordXNpbmcgc3RkOjpkeW5hbWljX3BvaW50ZXJfY2FzdDsKK3VzaW5nIHN0ZDo6bWFrZV9zaGFyZWQ7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dGVzdDo6UGFyZW50U2VydmljZUNsaWVudDsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0ZXN0OjpQYXJlbnRTZXJ2aWNlSWY7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dGVzdDo6UGFyZW50U2VydmljZUlmRmFjdG9yeTsKQEAgLTc3LDggKzgwLDggQEAKICAgICBpc0xpc3RlbmluZ18gPSB0cnVlOwogICAgIG5vdGlmeSgpOwogICB9Ci0gIHZpcnR1YWwgdm9pZCogY3JlYXRlQ29udGV4dChib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXQpIHsKKyAgdmlydHVhbCB2b2lkKiBjcmVhdGVDb250ZXh0KHNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXQpIHsKICAgICBTeW5jaHJvbml6ZWQgc3luYygqdGhpcyk7CiAgICAgKythY2NlcHRlZF87CiAgICAgbm90aWZ5KCk7CkBAIC0xNDUsMzAgKzE0OCwzNiBAQAogfQogCiB0ZW1wbGF0ZSA8Y2xhc3MgVFNlcnZlclR5cGU+Ci1jbGFzcyBUU2VydmVySW50ZWdyYXRpb25UZXN0Rml4dHVyZSA6IHB1YmxpYyBUZXN0UG9ydEZpeHR1cmUgeworY2xhc3MgVFNlcnZlckludGVncmF0aW9uVGVzdEZpeHR1cmUgewogcHVibGljOgotICBUU2VydmVySW50ZWdyYXRpb25UZXN0Rml4dHVyZShjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4mIF9wcm9jZXNzb3JGYWN0b3J5KQorICBUU2VydmVySW50ZWdyYXRpb25UZXN0Rml4dHVyZShjb25zdCBzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiYgX3Byb2Nlc3NvckZhY3RvcnkpCiAgICAgOiBwU2VydmVyKG5ldyBUU2VydmVyVHlwZShfcHJvY2Vzc29yRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUU2VydmVyU29ja2V0KCJsb2NhbGhvc3QiLCBtX3NlcnZlclBvcnQpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFRyYW5zcG9ydEZhY3RvcnkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4obmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkpKSksCi0gICAgICBwRXZlbnRIYW5kbGVyKGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJSZWFkeUV2ZW50SGFuZGxlcj4obmV3IFRTZXJ2ZXJSZWFkeUV2ZW50SGFuZGxlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRTZXJ2ZXJTb2NrZXQoImxvY2FsaG9zdCIsIDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUVHJhbnNwb3J0RmFjdG9yeSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KSkpLAorICAgICAgcEV2ZW50SGFuZGxlcihzaGFyZWRfcHRyPFRTZXJ2ZXJSZWFkeUV2ZW50SGFuZGxlcj4obmV3IFRTZXJ2ZXJSZWFkeUV2ZW50SGFuZGxlcikpLAorICAgIGJTdHJlc3NEb25lKGZhbHNlKSwKKyAgICBiU3RyZXNzQ29ubmVjdGlvbkNvdW50KDApLAorICAgIGJTdHJlc3NSZXF1ZXN0Q291bnQoMCkgewogICAgIHBTZXJ2ZXItPnNldFNlcnZlckV2ZW50SGFuZGxlcihwRXZlbnRIYW5kbGVyKTsKICAgfQogCi0gIFRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3RGaXh0dXJlKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBfcHJvY2Vzc29yKQorICBUU2VydmVySW50ZWdyYXRpb25UZXN0Rml4dHVyZShjb25zdCBzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBfcHJvY2Vzc29yKQogICAgIDogcFNlcnZlcigKICAgICAgICAgICBuZXcgVFNlcnZlclR5cGUoX3Byb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4obmV3IFRTZXJ2ZXJTb2NrZXQoImxvY2FsaG9zdCIsIDApKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUVHJhbnNwb3J0RmFjdG9yeSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KSkpLAotICAgICAgcEV2ZW50SGFuZGxlcihib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyUmVhZHlFdmVudEhhbmRsZXI+KG5ldyBUU2VydmVyUmVhZHlFdmVudEhhbmRsZXIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4obmV3IFRTZXJ2ZXJTb2NrZXQoImxvY2FsaG9zdCIsIDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRUcmFuc3BvcnRGYWN0b3J5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PihuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSkpKSwKKyAgICAgIHBFdmVudEhhbmRsZXIoc2hhcmVkX3B0cjxUU2VydmVyUmVhZHlFdmVudEhhbmRsZXI+KG5ldyBUU2VydmVyUmVhZHlFdmVudEhhbmRsZXIpKSwKKyAgICAgIGJTdHJlc3NEb25lKGZhbHNlKSwKKyAgICBiU3RyZXNzQ29ubmVjdGlvbkNvdW50KDApLAorICAgIGJTdHJlc3NSZXF1ZXN0Q291bnQoMCkgewogICAgIHBTZXJ2ZXItPnNldFNlcnZlckV2ZW50SGFuZGxlcihwRXZlbnRIYW5kbGVyKTsKICAgfQogCiAgIHZvaWQgc3RhcnRTZXJ2ZXIoKSB7Ci0gICAgcFNlcnZlclRocmVhZC5yZXNldChuZXcgYm9vc3Q6OnRocmVhZChib29zdDo6YmluZCgmVFNlcnZlclR5cGU6OnNlcnZlLCBwU2VydmVyLmdldCgpKSkpOworICAgIHBTZXJ2ZXJUaHJlYWQucmVzZXQobmV3IGJvb3N0Ojp0aHJlYWQoc3RkOjpiaW5kKCZUU2VydmVyVHlwZTo6c2VydmUsIHBTZXJ2ZXIuZ2V0KCkpKSk7CiAKICAgICAvLyBibG9jayB1bnRpbCBsaXN0ZW4oKSBjb21wbGV0ZXMgc28gY2xpZW50cyB3aWxsIGJlIGFibGUgdG8gY29ubmVjdAogICAgIFN5bmNocm9uaXplZCBzeW5jKCoocEV2ZW50SGFuZGxlci5nZXQoKSkpOwpAQCAtMTc2LDcgKzE4NSw3IEBACiAgICAgICBwRXZlbnRIYW5kbGVyLT53YWl0KCk7CiAgICAgfQogCi0gICAgQk9PU1RfVEVTVF9NRVNTQUdFKCJzZXJ2ZXIgaXMgbGlzdGVuaW5nIik7CisgICAgQk9PU1RfVEVTVF9NRVNTQUdFKCIgIHNlcnZlciBpcyBsaXN0ZW5pbmciKTsKICAgfQogCiAgIHZvaWQgYmxvY2tVbnRpbEFjY2VwdGVkKHVpbnQ2NF90IG51bUFjY2VwdGVkKSB7CkBAIC0xODUsNjIgKzE5NCwxMzYgQEAKICAgICAgIHBFdmVudEhhbmRsZXItPndhaXQoKTsKICAgICB9CiAKLSAgICBCT09TVF9URVNUX01FU1NBR0UoYm9vc3Q6OmZvcm1hdCgic2VydmVyIGhhcyBhY2NlcHRlZCAlMSUiKSAlIG51bUFjY2VwdGVkKTsKKyAgICBCT09TVF9URVNUX01FU1NBR0UoYm9vc3Q6OmZvcm1hdCgiICBzZXJ2ZXIgaGFzIGFjY2VwdGVkICUxJSIpICUgbnVtQWNjZXB0ZWQpOwogICB9CiAKICAgdm9pZCBzdG9wU2VydmVyKCkgewogICAgIGlmIChwU2VydmVyVGhyZWFkKSB7CiAgICAgICBwU2VydmVyLT5zdG9wKCk7Ci0gICAgICBCT09TVF9URVNUX01FU1NBR0UoInNlcnZlciBzdG9wIGNvbXBsZXRlZCIpOworICAgICAgQk9PU1RfVEVTVF9NRVNTQUdFKCIgIHNlcnZlciBzdG9wIGNvbXBsZXRlZCIpOwogCiAgICAgICBwU2VydmVyVGhyZWFkLT5qb2luKCk7Ci0gICAgICBCT09TVF9URVNUX01FU1NBR0UoInNlcnZlciB0aHJlYWQgam9pbmVkIik7CisgICAgICBCT09TVF9URVNUX01FU1NBR0UoIiAgc2VydmVyIHRocmVhZCBqb2luZWQiKTsKICAgICAgIHBTZXJ2ZXJUaHJlYWQucmVzZXQoKTsKICAgICB9CiAgIH0KIAogICB+VFNlcnZlckludGVncmF0aW9uVGVzdEZpeHR1cmUoKSB7IHN0b3BTZXJ2ZXIoKTsgfQogCi0gIGludCBnZXRTZXJ2ZXJQb3J0KCkgewotICAgIFRTZXJ2ZXJTb2NrZXQqIHBTb2NrID0gZHluYW1pY19jYXN0PFRTZXJ2ZXJTb2NrZXQqPihwU2VydmVyLT5nZXRTZXJ2ZXJUcmFuc3BvcnQoKS5nZXQoKSk7Ci0gICAgcmV0dXJuIHBTb2NrLT5nZXRQb3J0KCk7CisgIC8qKgorICAgKiBQZXJmb3JtcyBhIGJhc2VsaW5lIHRlc3Qgd2hlcmUgc29tZSBjbGllbnRzIGFyZSBvcGVuZWQgYW5kIGlzc3VlIGEgc2luZ2xlIG9wZXJhdGlvbgorICAgKiBhbmQgdGhlbiBkaXNjb25uZWN0IGF0IGRpZmZlcmVudCBpbnRlcnZhbHMuCisgICAqIFxwYXJhbVtpbl0gIG51bVRvTWFrZSAgdGhlIG51bWJlciBvZiBjb25jdXJyZW50IGNsaWVudHMKKyAgICogXHBhcmFtW2luXSAgZXhwZWN0ZWRIV00gIHRoZSBoaWdoIHdhdGVyIG1hcmsgd2UgZXhwZWN0IG9mIGNvbmN1cnJlbmN5CisgICAqIFxwYXJhbVtpbl0gIHB1cnBvc2UgIGEgZGVzY3JpcHRpb24gb2YgdGhlIHRlc3QgZm9yIGxvZ2dpbmcgcHVycG9zZXMKKyAgICovCisgIHZvaWQgYmFzZWxpbmUoaW50NjRfdCBudW1Ub01ha2UsIGludDY0X3QgZXhwZWN0ZWRIV00sIGNvbnN0IHN0ZDo6c3RyaW5nJiBwdXJwb3NlKSB7CisgICAgQk9PU1RfVEVTVF9NRVNTQUdFKGJvb3N0Ojpmb3JtYXQoIlRlc3RpbmcgJTElOiAlMiUgd2l0aCAlMyUgY2xpZW50cywgZXhwZWN0ICU0JSBIV00iKQorICAgICAgICAgICAgJSB0eXBlaWQoVFNlcnZlclR5cGUpLm5hbWUoKSAlIHB1cnBvc2UgJSBudW1Ub01ha2UgJSBleHBlY3RlZEhXTSk7CisKKyAgICBzdGFydFNlcnZlcigpOworCisgICAgc3RkOjp2ZWN0b3I8c2hhcmVkX3B0cjxUU29ja2V0PiA+IGhvbGRTb2NrZXRzOworICAgIHN0ZDo6dmVjdG9yPHNoYXJlZF9wdHI8Ym9vc3Q6OnRocmVhZD4gPiBob2xkVGhyZWFkczsKKworICAgIGZvciAoaW50NjRfdCBpID0gMDsgaSA8IG51bVRvTWFrZTsgKytpKSB7CisgICAgICBzaGFyZWRfcHRyPFRTb2NrZXQ+IHBDbGllbnRTb2NrKG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCBnZXRTZXJ2ZXJQb3J0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b1NvY2tldENsb3Nlcik7CisgICAgICBob2xkU29ja2V0cy5wdXNoX2JhY2socENsaWVudFNvY2spOworICAgICAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IHBDbGllbnRQcm90b2NvbChuZXcgVEJpbmFyeVByb3RvY29sKHBDbGllbnRTb2NrKSk7CisgICAgICBQYXJlbnRTZXJ2aWNlQ2xpZW50IGNsaWVudChwQ2xpZW50UHJvdG9jb2wpOworICAgICAgcENsaWVudFNvY2stPm9wZW4oKTsKKyAgICAgIGNsaWVudC5pbmNyZW1lbnRHZW5lcmF0aW9uKCk7CisgICAgICBob2xkVGhyZWFkcy5wdXNoX2JhY2soc2hhcmVkX3B0cjxib29zdDo6dGhyZWFkPigKKyAgICAgICAgICBuZXcgYm9vc3Q6OnRocmVhZChzdGQ6OmJpbmQoJlRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3RGaXh0dXJlOjpkZWxheUNsb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaWVudFNvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlsbGlzZWNvbmRzKDEwICogbnVtVG9NYWtlKSkpKSk7CisgICAgfQorCisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoZXhwZWN0ZWRIV00sIHBTZXJ2ZXItPmdldENvbmN1cnJlbnRDbGllbnRDb3VudEhXTSgpKTsKKworICAgIEJPT1NUX0ZPUkVBQ0ggKHNoYXJlZF9wdHI8Ym9vc3Q6OnRocmVhZD4gcFRocmVhZCwgaG9sZFRocmVhZHMpIHsgcFRocmVhZC0+am9pbigpOyB9CisgICAgaG9sZFRocmVhZHMuY2xlYXIoKTsKKyAgICBob2xkU29ja2V0cy5jbGVhcigpOworCisgICAgc3RvcFNlcnZlcigpOwogICB9CiAKLSAgdm9pZCBkZWxheUNsb3NlKGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRvQ2xvc2UsIGJvb3N0Ojpwb3NpeF90aW1lOjp0aW1lX2R1cmF0aW9uIGFmdGVyKSB7CisgIC8qKgorICAgKiBIZWxwZXIgbWV0aG9kIHVzZWQgdG8gY2xvc2UgYSBjb25uZWN0aW9uIGFmdGVyIGEgZGVsYXkuCisgICAqIFxwYXJhbVtpbl0gIHRvQ2xvc2UgIHRoZSBjb25uZWN0aW9uIHRvIGNsb3NlCisgICAqIFxwYXJhbVtpbl0gIGFmdGVyICB0aGUgZGVsYXkgdG8gaW1wb3NlCisgICAqLworICB2b2lkIGRlbGF5Q2xvc2Uoc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0b0Nsb3NlLCBib29zdDo6cG9zaXhfdGltZTo6dGltZV9kdXJhdGlvbiBhZnRlcikgewogICAgIGJvb3N0Ojp0aGlzX3RocmVhZDo6c2xlZXAoYWZ0ZXIpOwogICAgIHRvQ2xvc2UtPmNsb3NlKCk7CiAgIH0KIAotICB2b2lkIGJhc2VsaW5lKGludDY0X3QgbnVtVG9NYWtlLCBpbnQ2NF90IGV4cGVjdGVkSFdNKSB7Ci0gICAgc3RhcnRTZXJ2ZXIoKTsKLSAgICBzdGQ6OnZlY3Rvcjxib29zdDo6c2hhcmVkX3B0cjxUU29ja2V0PiA+IGhvbGRTb2NrZXRzOwotICAgIHN0ZDo6dmVjdG9yPGJvb3N0OjpzaGFyZWRfcHRyPGJvb3N0Ojp0aHJlYWQ+ID4gaG9sZFRocmVhZHM7Ci0KLSAgICBmb3IgKGludDY0X3QgaSA9IDA7IGkgPCBudW1Ub01ha2U7ICsraSkgewotICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNvY2tldD4gcENsaWVudFNvY2sobmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIGdldFNlcnZlclBvcnQoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvU29ja2V0Q2xvc2VyKTsKLSAgICAgIGhvbGRTb2NrZXRzLnB1c2hfYmFjayhwQ2xpZW50U29jayk7Ci0gICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHBDbGllbnRQcm90b2NvbChuZXcgVEJpbmFyeVByb3RvY29sKHBDbGllbnRTb2NrKSk7Ci0gICAgICBQYXJlbnRTZXJ2aWNlQ2xpZW50IGNsaWVudChwQ2xpZW50UHJvdG9jb2wpOwotICAgICAgcENsaWVudFNvY2stPm9wZW4oKTsKLSAgICAgIGNsaWVudC5pbmNyZW1lbnRHZW5lcmF0aW9uKCk7Ci0gICAgICBob2xkVGhyZWFkcy5wdXNoX2JhY2soYm9vc3Q6OnNoYXJlZF9wdHI8Ym9vc3Q6OnRocmVhZD4oCi0gICAgICAgICAgbmV3IGJvb3N0Ojp0aHJlYWQoYm9vc3Q6OmJpbmQoJlRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3RGaXh0dXJlOjpkZWxheUNsb3NlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaWVudFNvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlsbGlzZWNvbmRzKDEwMCAqIG51bVRvTWFrZSkpKSkpOwotICAgIH0KLQotICAgIEJPT1NUX0NIRUNLX0VRVUFMKGV4cGVjdGVkSFdNLCBwU2VydmVyLT5nZXRDb25jdXJyZW50Q2xpZW50Q291bnRIV00oKSk7Ci0gICAgc3RvcFNlcnZlcigpOwotICAgIEJPT1NUX0ZPUkVBQ0ggKGJvb3N0OjpzaGFyZWRfcHRyPGJvb3N0Ojp0aHJlYWQ+IHBUaHJlYWQsIGhvbGRUaHJlYWRzKSB7IHBUaHJlYWQtPmpvaW4oKTsgfQotICAgIGhvbGRUaHJlYWRzLmNsZWFyKCk7Ci0gICAgaG9sZFNvY2tldHMuY2xlYXIoKTsKKyAgLyoqCisgICAqIFxyZXR1cm5zICB0aGUgc2VydmVyIHBvcnQgbnVtYmVyCisgICAqLworICBpbnQgZ2V0U2VydmVyUG9ydCgpIHsKKyAgICBUU2VydmVyU29ja2V0KiBwU29jayA9IGR5bmFtaWNfY2FzdDxUU2VydmVyU29ja2V0Kj4ocFNlcnZlci0+Z2V0U2VydmVyVHJhbnNwb3J0KCkuZ2V0KCkpOworICAgIGlmICghcFNvY2spIHsgdGhyb3cgc3RkOjpsb2dpY19lcnJvcigiaG93IGNvbWU/Iik7IH0KKyAgICByZXR1cm4gcFNvY2stPmdldFBvcnQoKTsKICAgfQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJUeXBlPiBwU2VydmVyOwotICBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyUmVhZHlFdmVudEhhbmRsZXI+IHBFdmVudEhhbmRsZXI7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPGJvb3N0Ojp0aHJlYWQ+IHBTZXJ2ZXJUaHJlYWQ7CisgIC8qKgorICAgKiBQZXJmb3JtcyBhIHN0cmVzcyB0ZXN0IGJ5IHNwYXduaW5nIHRocmVhZHMgdGhhdCBjb25uZWN0LCBkbyBhIG51bWJlciBvZiBvcGVyYXRpb25zCisgICAqIGFuZCBkaXNjb25uZWN0LCB0aGVuIGEgcmFuZG9tIGRlbGF5LCB0aGVuIGRvIGl0IG92ZXIgYWdhaW4uICBUaGlzIGlzIGRvbmUgZm9yIGEgZml4ZWQKKyAgICogcGVyaW9kIG9mIHRpbWUgdG8gdGVzdCBmb3IgY29uY3VycmVuY3kgY29ycmVjdG5lc3MuCisgICAqIFxwYXJhbVtpbl0gIG51bVRvTWFrZSAgdGhlIG51bWJlciBvZiBjb25jdXJyZW50IGNsaWVudHMKKyAgICovCisgIHZvaWQgc3RyZXNzKGludDY0X3QgbnVtVG9NYWtlLCBjb25zdCBib29zdDo6cG9zaXhfdGltZTo6dGltZV9kdXJhdGlvbiYgZHVyYXRpb24pIHsKKyAgICBCT09TVF9URVNUX01FU1NBR0UoYm9vc3Q6OmZvcm1hdCgiU3RyZXNzIHRlc3RpbmcgJTElIHdpdGggJTIlIGNsaWVudHMgZm9yICUzJSBzZWNvbmRzIikKKyAgICAgICAgJSB0eXBlaWQoVFNlcnZlclR5cGUpLm5hbWUoKSAlIG51bVRvTWFrZSAlIGR1cmF0aW9uLnRvdGFsX3NlY29uZHMoKSk7CisKKyAgICBzdGFydFNlcnZlcigpOworCisgICAgc3RkOjp2ZWN0b3I8c2hhcmVkX3B0cjxib29zdDo6dGhyZWFkPiA+IGhvbGRUaHJlYWRzOworICAgIGZvciAoaW50NjRfdCBpID0gMDsgaSA8IG51bVRvTWFrZTsgKytpKSB7CisgICAgICBob2xkVGhyZWFkcy5wdXNoX2JhY2soc2hhcmVkX3B0cjxib29zdDo6dGhyZWFkPigKKyAgICAgICAgbmV3IGJvb3N0Ojp0aHJlYWQoc3RkOjpiaW5kKCZUU2VydmVySW50ZWdyYXRpb25UZXN0Rml4dHVyZTo6c3RyZXNzb3IsIHRoaXMpKSkpOworICAgIH0KKworICAgIGJvb3N0Ojp0aGlzX3RocmVhZDo6c2xlZXAoZHVyYXRpb24pOworICAgIGJTdHJlc3NEb25lID0gdHJ1ZTsKKworICAgIEJPT1NUX1RFU1RfTUVTU0FHRShib29zdDo6Zm9ybWF0KCIgIHNlcnZpY2VkICUxJSBjb25uZWN0aW9ucyAoSFdNICUyJSkgdG90YWxpbmcgJTMlIHJlcXVlc3RzIikKKyAgICAgICAgJSBiU3RyZXNzQ29ubmVjdGlvbkNvdW50ICUgcFNlcnZlci0+Z2V0Q29uY3VycmVudENsaWVudENvdW50SFdNKCkgJSBiU3RyZXNzUmVxdWVzdENvdW50KTsKKworICAgIEJPT1NUX0ZPUkVBQ0ggKHNoYXJlZF9wdHI8Ym9vc3Q6OnRocmVhZD4gcFRocmVhZCwgaG9sZFRocmVhZHMpIHsgcFRocmVhZC0+am9pbigpOyB9CisgICAgaG9sZFRocmVhZHMuY2xlYXIoKTsKKworICAgIEJPT1NUX0NIRUNLKGJTdHJlc3NSZXF1ZXN0Q291bnQgPiAwKTsKKworICAgIHN0b3BTZXJ2ZXIoKTsKKyAgfQorCisgIC8qKgorICAgKiBIZWxwZXIgbWV0aG9kIHRvIHN0cmVzcyB0aGUgc3lzdGVtCisgICAqLworICB2b2lkIHN0cmVzc29yKCkgeworICB3aGlsZSAoIWJTdHJlc3NEb25lKSB7CisgICAgICBzaGFyZWRfcHRyPFRTb2NrZXQ+IHBTb2NrZXQobmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIGdldFNlcnZlclBvcnQoKSksIGF1dG9Tb2NrZXRDbG9zZXIpOworICAgICAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IHBQcm90b2NvbChuZXcgVEJpbmFyeVByb3RvY29sKHBTb2NrZXQpKTsKKyAgICAgIFBhcmVudFNlcnZpY2VDbGllbnQgY2xpZW50KHBQcm90b2NvbCk7CisgICAgICBwU29ja2V0LT5vcGVuKCk7CisgICAgICBiU3RyZXNzQ29ubmVjdGlvbkNvdW50LmZldGNoX2FkZCgxLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmFuZCgpICUgMTAwMDsgKytpKSB7CisgICAgICBjbGllbnQuaW5jcmVtZW50R2VuZXJhdGlvbigpOworICAgICAgICBiU3RyZXNzUmVxdWVzdENvdW50LmZldGNoX2FkZCgxLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBzaGFyZWRfcHRyPFRTZXJ2ZXJUeXBlPiBwU2VydmVyOworICBzaGFyZWRfcHRyPFRTZXJ2ZXJSZWFkeUV2ZW50SGFuZGxlcj4gcEV2ZW50SGFuZGxlcjsKKyAgc2hhcmVkX3B0cjxib29zdDo6dGhyZWFkPiBwU2VydmVyVGhyZWFkOworICBzdGQ6OmF0b21pYzxib29sPiBiU3RyZXNzRG9uZTsKKyAgc3RkOjphdG9taWM8aW50NjRfdD4gYlN0cmVzc0Nvbm5lY3Rpb25Db3VudDsKKyAgc3RkOjphdG9taWM8aW50NjRfdD4gYlN0cmVzc1JlcXVlc3RDb3VudDsKIH07CiAKIHRlbXBsYXRlIDxjbGFzcyBUU2VydmVyVHlwZT4KQEAgLTI0OCw5ICszMzEsOSBAQAogICAgIDogcHVibGljIFRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3RGaXh0dXJlPFRTZXJ2ZXJUeXBlPiB7CiBwdWJsaWM6CiAgIFRTZXJ2ZXJJbnRlZ3JhdGlvblByb2Nlc3NvckZhY3RvcnlUZXN0Rml4dHVyZSgpCi0gICAgOiBUU2VydmVySW50ZWdyYXRpb25UZXN0Rml4dHVyZTxUU2VydmVyVHlwZT4oYm9vc3Q6Om1ha2Vfc2hhcmVkPFBhcmVudFNlcnZpY2VQcm9jZXNzb3JGYWN0b3J5PigKLSAgICAgICAgICBib29zdDo6bWFrZV9zaGFyZWQ8UGFyZW50U2VydmljZUlmU2luZ2xldG9uRmFjdG9yeT4oCi0gICAgICAgICAgICAgIGJvb3N0OjptYWtlX3NoYXJlZDxQYXJlbnRIYW5kbGVyPigpKSkpIHt9CisgICAgOiBUU2VydmVySW50ZWdyYXRpb25UZXN0Rml4dHVyZTxUU2VydmVyVHlwZT4obWFrZV9zaGFyZWQ8UGFyZW50U2VydmljZVByb2Nlc3NvckZhY3Rvcnk+KAorICAgICAgICAgIG1ha2Vfc2hhcmVkPFBhcmVudFNlcnZpY2VJZlNpbmdsZXRvbkZhY3Rvcnk+KAorICAgICAgICAgICAgICBtYWtlX3NoYXJlZDxQYXJlbnRIYW5kbGVyPigpKSkpIHt9CiB9OwogCiB0ZW1wbGF0ZSA8Y2xhc3MgVFNlcnZlclR5cGU+CkBAIC0yNTgsMzkgKzM0MSw0NCBAQAogcHVibGljOgogICBUU2VydmVySW50ZWdyYXRpb25Qcm9jZXNzb3JUZXN0Rml4dHVyZSgpCiAgICAgOiBUU2VydmVySW50ZWdyYXRpb25UZXN0Rml4dHVyZTxUU2VydmVyVHlwZT4oCi0gICAgICAgICAgYm9vc3Q6Om1ha2Vfc2hhcmVkPFBhcmVudFNlcnZpY2VQcm9jZXNzb3I+KGJvb3N0OjptYWtlX3NoYXJlZDxQYXJlbnRIYW5kbGVyPigpKSkge30KKyAgICAgICAgICBtYWtlX3NoYXJlZDxQYXJlbnRTZXJ2aWNlUHJvY2Vzc29yPihtYWtlX3NoYXJlZDxQYXJlbnRIYW5kbGVyPigpKSkge30KIH07CiAKIEJPT1NUX0FVVE9fVEVTVF9TVUlURShjb25zdHJ1Y3RvcnMpCiAKIEJPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKHRlc3Rfc2ltcGxlX2ZhY3RvcnksCiAgICAgICAgICAgICAgICAgICAgICAgICBUU2VydmVySW50ZWdyYXRpb25Qcm9jZXNzb3JGYWN0b3J5VGVzdEZpeHR1cmU8VFNpbXBsZVNlcnZlcj4pIHsKLSAgYmFzZWxpbmUoMywgMSk7CisgIGJhc2VsaW5lKDMsIDEsICJmYWN0b3J5Iik7CiB9CiAKIEJPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKHRlc3Rfc2ltcGxlLCBUU2VydmVySW50ZWdyYXRpb25Qcm9jZXNzb3JUZXN0Rml4dHVyZTxUU2ltcGxlU2VydmVyPikgewotICBiYXNlbGluZSgzLCAxKTsKKyAgYmFzZWxpbmUoMywgMSwgInByb2Nlc3NvciIpOwogfQogCiBCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRSh0ZXN0X3RocmVhZGVkX2ZhY3RvcnksCiAgICAgICAgICAgICAgICAgICAgICAgICBUU2VydmVySW50ZWdyYXRpb25Qcm9jZXNzb3JGYWN0b3J5VGVzdEZpeHR1cmU8VFRocmVhZGVkU2VydmVyPikgewotICBiYXNlbGluZSgxMCwgMTApOworICBiYXNlbGluZSgxMCwgMTAsICJmYWN0b3J5Iik7CiB9CiAKIEJPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKHRlc3RfdGhyZWFkZWQsIFRTZXJ2ZXJJbnRlZ3JhdGlvblByb2Nlc3NvclRlc3RGaXh0dXJlPFRUaHJlYWRlZFNlcnZlcj4pIHsKLSAgYmFzZWxpbmUoMTAsIDEwKTsKKyAgYmFzZWxpbmUoMTAsIDEwLCAicHJvY2Vzc29yIik7CiB9CiAKIEJPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKHRlc3RfdGhyZWFkZWRfYm91bmQsCiAgICAgICAgICAgICAgICAgICAgICAgICBUU2VydmVySW50ZWdyYXRpb25Qcm9jZXNzb3JUZXN0Rml4dHVyZTxUVGhyZWFkZWRTZXJ2ZXI+KSB7CiAgIHBTZXJ2ZXItPnNldENvbmN1cnJlbnRDbGllbnRMaW1pdCg0KTsKLSAgYmFzZWxpbmUoMTAsIDQpOworICBiYXNlbGluZSgxMCwgNCwgImxpbWl0IGJ5IHNlcnZlciBmcmFtZXdvcmsiKTsKK30KKworQk9PU1RfRklYVFVSRV9URVNUX0NBU0UodGVzdF90aHJlYWRlZF9zdHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICBUU2VydmVySW50ZWdyYXRpb25Qcm9jZXNzb3JGYWN0b3J5VGVzdEZpeHR1cmU8VFRocmVhZGVkU2VydmVyPikgeworICBzdHJlc3MoMTAsIGJvb3N0Ojpwb3NpeF90aW1lOjpzZWNvbmRzKDMpKTsKIH0KIAogQk9PU1RfRklYVFVSRV9URVNUX0NBU0UodGVzdF90aHJlYWRwb29sX2ZhY3RvcnksCiAgICAgICAgICAgICAgICAgICAgICAgICBUU2VydmVySW50ZWdyYXRpb25Qcm9jZXNzb3JGYWN0b3J5VGVzdEZpeHR1cmU8VFRocmVhZFBvb2xTZXJ2ZXI+KSB7CiAgIHBTZXJ2ZXItPmdldFRocmVhZE1hbmFnZXIoKS0+dGhyZWFkRmFjdG9yeSgKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeT4oCisgICAgICBzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeT4oCiAgICAgICAgICAgbmV3IGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UGxhdGZvcm1UaHJlYWRGYWN0b3J5KSk7CiAgIHBTZXJ2ZXItPmdldFRocmVhZE1hbmFnZXIoKS0+c3RhcnQoKTsKIApAQCAtMjk5LDEzICszODcsMTMgQEAKICAgLy8gYXMgYWNjZXB0KCkgd2lsbCBiZSBjYWxsZWQgdG8gZ3JhYiBhIDV0aCBjbGllbnQgc29ja2V0LCBpbiB0aGlzIGNhc2UKICAgLy8gYW5kIHRoZW4gdGhlIHRocmVhZCBmYWN0b3J5IHdpbGwgYmxvY2sgYWRkaW5nIHRoZSB0aHJlYWQgdG8gbWFuYWdlCiAgIC8vIHRoYXQgY2xpZW50LgotICBiYXNlbGluZSgxMCwgNSk7CisgIGJhc2VsaW5lKDEwLCA1LCAibGltaXQgYnkgdGhyZWFkIG1hbmFnZXIiKTsKIH0KIAogQk9PU1RfRklYVFVSRV9URVNUX0NBU0UodGVzdF90aHJlYWRwb29sLAogICAgICAgICAgICAgICAgICAgICAgICAgVFNlcnZlckludGVncmF0aW9uUHJvY2Vzc29yVGVzdEZpeHR1cmU8VFRocmVhZFBvb2xTZXJ2ZXI+KSB7CiAgIHBTZXJ2ZXItPmdldFRocmVhZE1hbmFnZXIoKS0+dGhyZWFkRmFjdG9yeSgKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeT4oCisgICAgICBzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeT4oCiAgICAgICAgICAgbmV3IGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UGxhdGZvcm1UaHJlYWRGYWN0b3J5KSk7CiAgIHBTZXJ2ZXItPmdldFRocmVhZE1hbmFnZXIoKS0+c3RhcnQoKTsKIApAQCAtMzE0LDE4ICs0MDIsMjggQEAKICAgLy8gYXMgYWNjZXB0KCkgd2lsbCBiZSBjYWxsZWQgdG8gZ3JhYiBhIDV0aCBjbGllbnQgc29ja2V0LCBpbiB0aGlzIGNhc2UKICAgLy8gYW5kIHRoZW4gdGhlIHRocmVhZCBmYWN0b3J5IHdpbGwgYmxvY2sgYWRkaW5nIHRoZSB0aHJlYWQgdG8gbWFuYWdlCiAgIC8vIHRoYXQgY2xpZW50LgotICBiYXNlbGluZSgxMCwgNSk7CisgIGJhc2VsaW5lKDEwLCA1LCAibGltaXQgYnkgdGhyZWFkIG1hbmFnZXIiKTsKIH0KIAogQk9PU1RfRklYVFVSRV9URVNUX0NBU0UodGVzdF90aHJlYWRwb29sX2JvdW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgVFNlcnZlckludGVncmF0aW9uUHJvY2Vzc29yVGVzdEZpeHR1cmU8VFRocmVhZFBvb2xTZXJ2ZXI+KSB7CiAgIHBTZXJ2ZXItPmdldFRocmVhZE1hbmFnZXIoKS0+dGhyZWFkRmFjdG9yeSgKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeT4oCisgICAgICBzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeT4oCiAgICAgICAgICAgbmV3IGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UGxhdGZvcm1UaHJlYWRGYWN0b3J5KSk7CiAgIHBTZXJ2ZXItPmdldFRocmVhZE1hbmFnZXIoKS0+c3RhcnQoKTsKICAgcFNlcnZlci0+c2V0Q29uY3VycmVudENsaWVudExpbWl0KDQpOwogCi0gIGJhc2VsaW5lKDEwLCA0KTsKKyAgYmFzZWxpbmUoMTAsIDQsICJzZXJ2ZXIgZnJhbWV3b3JrIGNvbm5lY3Rpb24gbGltaXQiKTsKK30KKworQk9PU1RfRklYVFVSRV9URVNUX0NBU0UodGVzdF90aHJlYWRwb29sX3N0cmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJJbnRlZ3JhdGlvblByb2Nlc3NvclRlc3RGaXh0dXJlPFRUaHJlYWRQb29sU2VydmVyPikgeworICBwU2VydmVyLT5nZXRUaHJlYWRNYW5hZ2VyKCktPnRocmVhZEZhY3RvcnkoCisgICAgICBzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeT4oCisgICAgICAgICAgbmV3IGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UGxhdGZvcm1UaHJlYWRGYWN0b3J5KSk7CisgIHBTZXJ2ZXItPmdldFRocmVhZE1hbmFnZXIoKS0+c3RhcnQoKTsKKworICBzdHJlc3MoMTAsIGJvb3N0Ojpwb3NpeF90aW1lOjpzZWNvbmRzKDMpKTsKIH0KIAogQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCkBAIC0zMzUsMTQgKzQzMywxNSBAQAogCiBCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X3N0b3Bfd2l0aF9pbnRlcnJ1cHRhYmxlX2NsaWVudHNfY29ubmVjdGVkKSB7CiAgIC8vIFRoaXMgdGVzdHMgVEhSSUZULTI0NDEgbmV3IGJlaGF2aW9yOiBzdG9wcGluZyB0aGUgc2VydmVyIGRpc2Nvbm5lY3RzIGNsaWVudHMKKyAgQk9PU1RfVEVTVF9NRVNTQUdFKCJUZXN0aW5nIHN0b3Agd2l0aCBpbnRlcnJ1cHRhYmxlIGNsaWVudHMiKTsKIAogICBzdGFydFNlcnZlcigpOwogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHBDbGllbnRTb2NrMShuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgZ2V0U2VydmVyUG9ydCgpKSwKKyAgc2hhcmVkX3B0cjxUU29ja2V0PiBwQ2xpZW50U29jazEobmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIGdldFNlcnZlclBvcnQoKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvU29ja2V0Q2xvc2VyKTsKICAgcENsaWVudFNvY2sxLT5vcGVuKCk7CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNvY2tldD4gcENsaWVudFNvY2syKG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCBnZXRTZXJ2ZXJQb3J0KCkpLAorICBzaGFyZWRfcHRyPFRTb2NrZXQ+IHBDbGllbnRTb2NrMihuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgZ2V0U2VydmVyUG9ydCgpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9Tb2NrZXRDbG9zZXIpOwogICBwQ2xpZW50U29jazItPm9wZW4oKTsKIApAQCAtMzYyLDY0ICs0NjEsNjcgQEAKIEJPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfc3RvcF93aXRoX3VuaW50ZXJydXB0YWJsZV9jbGllbnRzX2Nvbm5lY3RlZCkgewogICAvLyBUaGlzIHRlc3RzIHByZS1USFJJRlQtMjQ0MSBiZWhhdmlvcjogc3RvcHBpbmcgdGhlIHNlcnZlciBibG9ja3MgdW50aWwgY2xpZW50cwogICAvLyBkaXNjb25uZWN0LgorICAgIEJPT1NUX1RFU1RfTUVTU0FHRSgiVGVzdGluZyBzdG9wIHdpdGggdW5pbnRlcnJ1cHRhYmxlIGNsaWVudHMiKTsKIAotICBib29zdDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VFNlcnZlclNvY2tldD4ocFNlcnZlci0+Z2V0U2VydmVyVHJhbnNwb3J0KCkpCisgIGR5bmFtaWNfcG9pbnRlcl9jYXN0PFRTZXJ2ZXJTb2NrZXQ+KHBTZXJ2ZXItPmdldFNlcnZlclRyYW5zcG9ydCgpKQogICAgICAgLT5zZXRJbnRlcnJ1cHRhYmxlQ2hpbGRyZW4oZmFsc2UpOyAvLyByZXR1cm5zIHRvIHByZS1USFJJRlQtMjQ0MSBiZWhhdmlvcgogCiAgIHN0YXJ0U2VydmVyKCk7CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNvY2tldD4gcENsaWVudFNvY2sxKG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCBnZXRTZXJ2ZXJQb3J0KCkpLAorICBzaGFyZWRfcHRyPFRTb2NrZXQ+IHBDbGllbnRTb2NrMShuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgZ2V0U2VydmVyUG9ydCgpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9Tb2NrZXRDbG9zZXIpOwogICBwQ2xpZW50U29jazEtPm9wZW4oKTsKIAotICBib29zdDo6c2hhcmVkX3B0cjxUU29ja2V0PiBwQ2xpZW50U29jazIobmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIGdldFNlcnZlclBvcnQoKSksCisgIHNoYXJlZF9wdHI8VFNvY2tldD4gcENsaWVudFNvY2syKG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCBnZXRTZXJ2ZXJQb3J0KCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b1NvY2tldENsb3Nlcik7CiAgIHBDbGllbnRTb2NrMi0+b3BlbigpOwogCiAgIC8vIEVuc3VyZSB0aGV5IGhhdmUgYmVlbiBhY2NlcHRlZAogICBibG9ja1VudGlsQWNjZXB0ZWQoMik7CiAKLSAgYm9vc3Q6OnRocmVhZCB0MShib29zdDo6YmluZCgmVFNlcnZlckludGVncmF0aW9uVGVzdEZpeHR1cmU6OmRlbGF5Q2xvc2UsCisgIGJvb3N0Ojp0aHJlYWQgdDEoc3RkOjpiaW5kKCZUU2VydmVySW50ZWdyYXRpb25UZXN0Rml4dHVyZTo6ZGVsYXlDbG9zZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGllbnRTb2NrMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaWxsaXNlY29uZHMoMjUwKSkpOwotICBib29zdDo6dGhyZWFkIHQyKGJvb3N0OjpiaW5kKCZUU2VydmVySW50ZWdyYXRpb25UZXN0Rml4dHVyZTo6ZGVsYXlDbG9zZSwKKyAgYm9vc3Q6OnRocmVhZCB0MihzdGQ6OmJpbmQoJlRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3RGaXh0dXJlOjpkZWxheUNsb3NlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaWVudFNvY2syLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbGxpc2Vjb25kcygyNTApKSk7CiAKICAgLy8gT25jZSB0aGUgY2xpZW50cyBkaXNjb25uZWN0IHRoZSBzZXJ2ZXIgd2lsbCBzdG9wCiAgIHN0b3BTZXJ2ZXIoKTsKKyAgQk9PU1RfQ0hFQ0socFNlcnZlci0+Z2V0Q29uY3VycmVudENsaWVudENvdW50SFdNKCkgPiAwKTsKICAgdDEuam9pbigpOwogICB0Mi5qb2luKCk7CiB9CiAKIEJPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfY29uY3VycmVudF9jbGllbnRfbGltaXQpIHsKICAgc3RhcnRTZXJ2ZXIoKTsKKyAgQk9PU1RfVEVTVF9NRVNTQUdFKCJUZXN0aW5nIHRoZSBjb25jdXJyZW50IGNsaWVudCBsaW1pdCIpOwogCiAgIEJPT1NUX0NIRUNLX0VRVUFMKElOVDY0X01BWCwgcFNlcnZlci0+Z2V0Q29uY3VycmVudENsaWVudExpbWl0KCkpOwogICBwU2VydmVyLT5zZXRDb25jdXJyZW50Q2xpZW50TGltaXQoMik7CiAgIEJPT1NUX0NIRUNLX0VRVUFMKDAsIHBTZXJ2ZXItPmdldENvbmN1cnJlbnRDbGllbnRDb3VudCgpKTsKICAgQk9PU1RfQ0hFQ0tfRVFVQUwoMiwgcFNlcnZlci0+Z2V0Q29uY3VycmVudENsaWVudExpbWl0KCkpOwogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHBDbGllbnRTb2NrMShuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgZ2V0U2VydmVyUG9ydCgpKSwKKyAgc2hhcmVkX3B0cjxUU29ja2V0PiBwQ2xpZW50U29jazEobmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIGdldFNlcnZlclBvcnQoKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvU29ja2V0Q2xvc2VyKTsKICAgcENsaWVudFNvY2sxLT5vcGVuKCk7CiAgIGJsb2NrVW50aWxBY2NlcHRlZCgxKTsKICAgQk9PU1RfQ0hFQ0tfRVFVQUwoMSwgcFNlcnZlci0+Z2V0Q29uY3VycmVudENsaWVudENvdW50KCkpOwogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHBDbGllbnRTb2NrMihuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgZ2V0U2VydmVyUG9ydCgpKSwKKyAgc2hhcmVkX3B0cjxUU29ja2V0PiBwQ2xpZW50U29jazIobmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIGdldFNlcnZlclBvcnQoKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvU29ja2V0Q2xvc2VyKTsKICAgcENsaWVudFNvY2syLT5vcGVuKCk7CiAgIGJsb2NrVW50aWxBY2NlcHRlZCgyKTsKICAgQk9PU1RfQ0hFQ0tfRVFVQUwoMiwgcFNlcnZlci0+Z2V0Q29uY3VycmVudENsaWVudENvdW50KCkpOwogCiAgIC8vIGEgdGhpcmQgY2xpZW50IGNhbm5vdCBjb25uZWN0IHVudGlsIG9uZSBvZiB0aGUgb3RoZXIgdHdvIGNsb3NlcwotICBib29zdDo6dGhyZWFkIHQyKGJvb3N0OjpiaW5kKCZUU2VydmVySW50ZWdyYXRpb25UZXN0Rml4dHVyZTo6ZGVsYXlDbG9zZSwKKyAgYm9vc3Q6OnRocmVhZCB0MihzdGQ6OmJpbmQoJlRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3RGaXh0dXJlOjpkZWxheUNsb3NlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaWVudFNvY2syLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbGxpc2Vjb25kcygyNTApKSk7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHBDbGllbnRTb2NrMyhuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgZ2V0U2VydmVyUG9ydCgpKSwKKyAgc2hhcmVkX3B0cjxUU29ja2V0PiBwQ2xpZW50U29jazMobmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIGdldFNlcnZlclBvcnQoKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvU29ja2V0Q2xvc2VyKTsKICAgcENsaWVudFNvY2syLT5vcGVuKCk7CiAgIGJsb2NrVW50aWxBY2NlcHRlZCgyKTsKQEAgLTQyNyw2ICs1MjksNyBAQAogICBCT09TVF9DSEVDS19FUVVBTCgyLCBwU2VydmVyLT5nZXRDb25jdXJyZW50Q2xpZW50Q291bnRIV00oKSk7CiAKICAgc3RvcFNlcnZlcigpOworICBCT09TVF9DSEVDSyhwU2VydmVyLT5nZXRDb25jdXJyZW50Q2xpZW50Q291bnRIV00oKSA+IDApOwogICB0Mi5qb2luKCk7CiB9CiAKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9UU2VydmVyU29ja2V0VGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvVFNlcnZlclNvY2tldFRlc3QuY3BwCmluZGV4IGFlODdiYTguLmJlYzZkNDcgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9UU2VydmVyU29ja2V0VGVzdC5jcHAKKysrIGIvbGliL2NwcC90ZXN0L1RTZXJ2ZXJTb2NrZXRUZXN0LmNwcApAQCAtMjAsNyArMjAsNyBAQAogI2luY2x1ZGUgPGJvb3N0L3Rlc3QvYXV0b191bml0X3Rlc3QuaHBwPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oPgotI2luY2x1ZGUgIlRlc3RQb3J0Rml4dHVyZS5oIgorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlICJUVHJhbnNwb3J0Q2hlY2tUaHJvdy5oIgogI2luY2x1ZGUgPGlvc3RyZWFtPgogCkBAIC0yOCwyMCArMjgsMjIgQEAKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTb2NrZXQ7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0OwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKIAotQk9PU1RfRklYVFVSRV9URVNUX1NVSVRFKFRTZXJ2ZXJTb2NrZXRUZXN0LCBUZXN0UG9ydEZpeHR1cmUpCitCT09TVF9BVVRPX1RFU1RfU1VJVEUoVFNlcnZlclNvY2tldFRlc3QpCiAKIEJPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfYmluZF90b19hZGRyZXNzKSB7Ci0gIFRTZXJ2ZXJTb2NrZXQgc29jazEoImxvY2FsaG9zdCIsIG1fc2VydmVyUG9ydCk7CisgIFRTZXJ2ZXJTb2NrZXQgc29jazEoImxvY2FsaG9zdCIsIDApOwogICBzb2NrMS5saXN0ZW4oKTsKLSAgVFNvY2tldCBjbGllbnRTb2NrKCJsb2NhbGhvc3QiLCBtX3NlcnZlclBvcnQpOworICBpbnQgcG9ydCA9IHNvY2sxLmdldFBvcnQoKTsKKyAgVFNvY2tldCBjbGllbnRTb2NrKCJsb2NhbGhvc3QiLCBwb3J0KTsKICAgY2xpZW50U29jay5vcGVuKCk7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdGVkID0gc29jazEuYWNjZXB0KCk7CisgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0ZWQgPSBzb2NrMS5hY2NlcHQoKTsKICAgYWNjZXB0ZWQtPmNsb3NlKCk7CiAgIHNvY2sxLmNsb3NlKCk7CiAKICAgc3RkOjpjb3V0IDw8ICJBbiBlcnJvciBtZXNzYWdlIGZyb20gZ2V0YWRkcmluZm8gb24gdGhlIGNvbnNvbGUgaXMgZXhwZWN0ZWQ6IiA8PCBzdGQ6OmVuZGw7Ci0gIFRTZXJ2ZXJTb2NrZXQgc29jazIoIjI1Ny4yNTguMjU5LjI2MCIsIG1fc2VydmVyUG9ydCk7CisgIFRTZXJ2ZXJTb2NrZXQgc29jazIoIjI1Ny4yNTguMjU5LjI2MCIsIDApOwogICBCT09TVF9DSEVDS19USFJPVyhzb2NrMi5saXN0ZW4oKSwgVFRyYW5zcG9ydEV4Y2VwdGlvbik7CiAgIHNvY2syLmNsb3NlKCk7CiB9CkBAIC01NSw3ICs1Nyw3IEBACiB9CiAKIEJPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfY2xvc2VfYmVmb3JlX2xpc3RlbikgewotICBUU2VydmVyU29ja2V0IHNvY2sxKCJsb2NhbGhvc3QiLCBtX3NlcnZlclBvcnQpOworICBUU2VydmVyU29ja2V0IHNvY2sxKCJsb2NhbGhvc3QiLCAwKTsKICAgc29jazEuY2xvc2UoKTsKIH0KIApkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1RTZXJ2ZXJUcmFuc3BvcnRUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9UU2VydmVyVHJhbnNwb3J0VGVzdC5jcHAKaW5kZXggMjA0NzMzNy4uNTM5YmQyOCAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L1RTZXJ2ZXJUcmFuc3BvcnRUZXN0LmNwcAorKysgYi9saWIvY3BwL3Rlc3QvVFNlcnZlclRyYW5zcG9ydFRlc3QuY3BwCkBAIC0yMCwxMSArMjAsMTIgQEAKICNpbmNsdWRlIDxib29zdC90ZXN0L2F1dG9fdW5pdF90ZXN0LmhwcD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuaD4KLSNpbmNsdWRlICJUZXN0UG9ydEZpeHR1cmUuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CiAKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0OwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKIAogQk9PU1RfQVVUT19URVNUX1NVSVRFKFRTZXJ2ZXJUcmFuc3BvcnRUZXN0KQogCkBAIC0zNyw5ICszOCw5IEBACiAgIGJvb2wgdmFsaWRfOwogCiBwcm90ZWN0ZWQ6Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdEltcGwoKSB7Ci0gICAgcmV0dXJuIHZhbGlkXyA/IGJvb3N0OjpzaGFyZWRfcHRyPFRlc3RUVHJhbnNwb3J0PihuZXcgVGVzdFRUcmFuc3BvcnQpCi0gICAgICAgICAgICAgICAgICA6IGJvb3N0OjpzaGFyZWRfcHRyPFRlc3RUVHJhbnNwb3J0PigpOworICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdEltcGwoKSB7CisgICAgcmV0dXJuIHZhbGlkXyA/IHNoYXJlZF9wdHI8VGVzdFRUcmFuc3BvcnQ+KG5ldyBUZXN0VFRyYW5zcG9ydCkKKyAgICAgICAgICAgICAgICAgIDogc2hhcmVkX3B0cjxUZXN0VFRyYW5zcG9ydD4oKTsKICAgfQogfTsKIApkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1RTb2NrZXRJbnRlcnJ1cHRUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9UU29ja2V0SW50ZXJydXB0VGVzdC5jcHAKaW5kZXggMDJkYTNlZS4uMzY2MjQyZiAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L1RTb2NrZXRJbnRlcnJ1cHRUZXN0LmNwcAorKysgYi9saWIvY3BwL3Rlc3QvVFNvY2tldEludGVycnVwdFRlc3QuY3BwCkBAIC0yMCwyNyArMjAsMjcgQEAKICNkZWZpbmUgQk9PU1RfVEVTVF9NT0RVTEUgVFNvY2tldEludGVycnVwdFRlc3QKICNpbmNsdWRlIDxib29zdC90ZXN0L2F1dG9fdW5pdF90ZXN0LmhwcD4KIAotI2luY2x1ZGUgPGJvb3N0L2JpbmQuaHBwPgogI2luY2x1ZGUgPGJvb3N0L2Nocm9uby9kdXJhdGlvbi5ocHA+CiAjaW5jbHVkZSA8Ym9vc3QvZGF0ZV90aW1lL3Bvc2l4X3RpbWUvcG9zaXhfdGltZV9kdXJhdGlvbi5ocHA+CiAjaW5jbHVkZSA8Ym9vc3QvdGhyZWFkL3RocmVhZC5ocHA+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0Lmg+Ci0jaW5jbHVkZSAiVGVzdFBvcnRGaXh0dXJlLmgiCisjaW5jbHVkZSA8bWVtb3J5PgogCiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyU29ja2V0OwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNvY2tldDsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwogCi1CT09TVF9GSVhUVVJFX1RFU1RfU1VJVEUoVFNvY2tldEludGVycnVwdFRlc3QsIFRlc3RQb3J0Rml4dHVyZSkKK0JPT1NUX0FVVE9fVEVTVF9TVUlURShUU29ja2V0SW50ZXJydXB0VGVzdCkKIAotdm9pZCByZWFkZXJXb3JrZXIoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHQsIHVpbnQzMl90IGV4cGVjdGVkUmVzdWx0KSB7Cit2b2lkIHJlYWRlcldvcmtlcihzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHQsIHVpbnQzMl90IGV4cGVjdGVkUmVzdWx0KSB7CiAgIHVpbnQ4X3QgYnVmWzRdOwogICBCT09TVF9DSEVDS19FUVVBTChleHBlY3RlZFJlc3VsdCwgdHQtPnJlYWQoYnVmLCA0KSk7CiB9CiAKLXZvaWQgcmVhZGVyV29ya2VyTXVzdFRocm93KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHR0KSB7Cit2b2lkIHJlYWRlcldvcmtlck11c3RUaHJvdyhzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHQpIHsKICAgdHJ5IHsKICAgICB1aW50OF90IGJ1Zls0XTsKICAgICB0dC0+cmVhZChidWYsIDQpOwpAQCAtNTEsMTIgKzUxLDEzIEBACiB9CiAKIEJPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfaW50ZXJydXB0YWJsZV9jaGlsZF9yZWFkKSB7Ci0gIFRTZXJ2ZXJTb2NrZXQgc29jazEoImxvY2FsaG9zdCIsIG1fc2VydmVyUG9ydCk7CisgIFRTZXJ2ZXJTb2NrZXQgc29jazEoImxvY2FsaG9zdCIsIDApOwogICBzb2NrMS5saXN0ZW4oKTsKLSAgVFNvY2tldCBjbGllbnRTb2NrKCJsb2NhbGhvc3QiLCBtX3NlcnZlclBvcnQpOworICBpbnQgcG9ydCA9IHNvY2sxLmdldFBvcnQoKTsKKyAgVFNvY2tldCBjbGllbnRTb2NrKCJsb2NhbGhvc3QiLCBwb3J0KTsKICAgY2xpZW50U29jay5vcGVuKCk7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdGVkID0gc29jazEuYWNjZXB0KCk7Ci0gIGJvb3N0Ojp0aHJlYWQgcmVhZFRocmVhZChib29zdDo6YmluZChyZWFkZXJXb3JrZXJNdXN0VGhyb3csIGFjY2VwdGVkKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHRlZCA9IHNvY2sxLmFjY2VwdCgpOworICBib29zdDo6dGhyZWFkIHJlYWRUaHJlYWQoc3RkOjpiaW5kKHJlYWRlcldvcmtlck11c3RUaHJvdywgYWNjZXB0ZWQpKTsKICAgYm9vc3Q6OnRoaXNfdGhyZWFkOjpzbGVlcChib29zdDo6cG9zaXhfdGltZTo6bWlsbGlzZWNvbmRzKDUwKSk7CiAgIC8vIHJlYWRUaHJlYWQgaXMgcHJhY3RpY2FsbHkgZ3VhcmFudGVlZCB0byBiZSBibG9ja2luZyBub3cKICAgc29jazEuaW50ZXJydXB0Q2hpbGRyZW4oKTsKQEAgLTY4LDEzICs2OSwxNCBAQAogfQogCiBCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X25vbl9pbnRlcnJ1cHRhYmxlX2NoaWxkX3JlYWQpIHsKLSAgVFNlcnZlclNvY2tldCBzb2NrMSgibG9jYWxob3N0IiwgbV9zZXJ2ZXJQb3J0KTsKKyAgVFNlcnZlclNvY2tldCBzb2NrMSgibG9jYWxob3N0IiwgMCk7CiAgIHNvY2sxLnNldEludGVycnVwdGFibGVDaGlsZHJlbihmYWxzZSk7IC8vIHJldHVybnMgdG8gcHJlLVRIUklGVC0yNDQxIGJlaGF2aW9yCiAgIHNvY2sxLmxpc3RlbigpOwotICBUU29ja2V0IGNsaWVudFNvY2soImxvY2FsaG9zdCIsIG1fc2VydmVyUG9ydCk7CisgIGludCBwb3J0ID0gc29jazEuZ2V0UG9ydCgpOworICBUU29ja2V0IGNsaWVudFNvY2soImxvY2FsaG9zdCIsIHBvcnQpOwogICBjbGllbnRTb2NrLm9wZW4oKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0ZWQgPSBzb2NrMS5hY2NlcHQoKTsKLSAgYm9vc3Q6OnRocmVhZCByZWFkVGhyZWFkKGJvb3N0OjpiaW5kKHJlYWRlcldvcmtlciwgYWNjZXB0ZWQsIDApKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdGVkID0gc29jazEuYWNjZXB0KCk7CisgIGJvb3N0Ojp0aHJlYWQgcmVhZFRocmVhZChzdGQ6OmJpbmQocmVhZGVyV29ya2VyLCBhY2NlcHRlZCwgMCkpOwogICBib29zdDo6dGhpc190aHJlYWQ6OnNsZWVwKGJvb3N0Ojpwb3NpeF90aW1lOjptaWxsaXNlY29uZHMoNTApKTsKICAgLy8gcmVhZFRocmVhZCBpcyBwcmFjdGljYWxseSBndWFyYW50ZWVkIHRvIGJlIGJsb2NraW5nIGhlcmUKICAgc29jazEuaW50ZXJydXB0Q2hpbGRyZW4oKTsKQEAgLTg5LDI0ICs5MSwyNSBAQAogfQogCiBCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2Nhbm5vdF9jaGFuZ2VfYWZ0ZXJfbGlzdGVuKSB7Ci0gIFRTZXJ2ZXJTb2NrZXQgc29jazEoImxvY2FsaG9zdCIsIG1fc2VydmVyUG9ydCk7CisgIFRTZXJ2ZXJTb2NrZXQgc29jazEoImxvY2FsaG9zdCIsIDApOwogICBzb2NrMS5saXN0ZW4oKTsKICAgQk9PU1RfQ0hFQ0tfVEhST1coc29jazEuc2V0SW50ZXJydXB0YWJsZUNoaWxkcmVuKGZhbHNlKSwgc3RkOjpsb2dpY19lcnJvcik7CiAgIHNvY2sxLmNsb3NlKCk7CiB9CiAKLXZvaWQgcGVla2VyV29ya2VyKGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHR0LCBib29sIGV4cGVjdGVkUmVzdWx0KSB7Cit2b2lkIHBlZWtlcldvcmtlcihzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHQsIGJvb2wgZXhwZWN0ZWRSZXN1bHQpIHsKICAgQk9PU1RfQ0hFQ0tfRVFVQUwoZXhwZWN0ZWRSZXN1bHQsIHR0LT5wZWVrKCkpOwogfQogCiBCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2ludGVycnVwdGFibGVfY2hpbGRfcGVlaykgewotICBUU2VydmVyU29ja2V0IHNvY2sxKCJsb2NhbGhvc3QiLCBtX3NlcnZlclBvcnQpOworICBUU2VydmVyU29ja2V0IHNvY2sxKCJsb2NhbGhvc3QiLCAwKTsKICAgc29jazEubGlzdGVuKCk7Ci0gIFRTb2NrZXQgY2xpZW50U29jaygibG9jYWxob3N0IiwgbV9zZXJ2ZXJQb3J0KTsKKyAgaW50IHBvcnQgPSBzb2NrMS5nZXRQb3J0KCk7CisgIFRTb2NrZXQgY2xpZW50U29jaygibG9jYWxob3N0IiwgcG9ydCk7CiAgIGNsaWVudFNvY2sub3BlbigpOwotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHRlZCA9IHNvY2sxLmFjY2VwdCgpOworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0ZWQgPSBzb2NrMS5hY2NlcHQoKTsKICAgLy8gcGVlaygpIHdpbGwgcmV0dXJuIGZhbHNlIGlmIGNoaWxkIGlzIGludGVycnVwdGVkCi0gIGJvb3N0Ojp0aHJlYWQgcGVla1RocmVhZChib29zdDo6YmluZChwZWVrZXJXb3JrZXIsIGFjY2VwdGVkLCBmYWxzZSkpOworICBib29zdDo6dGhyZWFkIHBlZWtUaHJlYWQoc3RkOjpiaW5kKHBlZWtlcldvcmtlciwgYWNjZXB0ZWQsIGZhbHNlKSk7CiAgIGJvb3N0Ojp0aGlzX3RocmVhZDo6c2xlZXAoYm9vc3Q6OnBvc2l4X3RpbWU6Om1pbGxpc2Vjb25kcyg1MCkpOwogICAvLyBwZWVrVGhyZWFkIGlzIHByYWN0aWNhbGx5IGd1YXJhbnRlZWQgdG8gYmUgYmxvY2tpbmcgbm93CiAgIHNvY2sxLmludGVycnVwdENoaWxkcmVuKCk7CkBAIC0xMTgsMTQgKzEyMSwxNSBAQAogfQogCiBCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X25vbl9pbnRlcnJ1cHRhYmxlX2NoaWxkX3BlZWspIHsKLSAgVFNlcnZlclNvY2tldCBzb2NrMSgibG9jYWxob3N0IiwgbV9zZXJ2ZXJQb3J0KTsKKyAgVFNlcnZlclNvY2tldCBzb2NrMSgibG9jYWxob3N0IiwgMCk7CiAgIHNvY2sxLnNldEludGVycnVwdGFibGVDaGlsZHJlbihmYWxzZSk7IC8vIHJldHVybnMgdG8gcHJlLVRIUklGVC0yNDQxIGJlaGF2aW9yCiAgIHNvY2sxLmxpc3RlbigpOwotICBUU29ja2V0IGNsaWVudFNvY2soImxvY2FsaG9zdCIsIG1fc2VydmVyUG9ydCk7CisgIGludCBwb3J0ID0gc29jazEuZ2V0UG9ydCgpOworICBUU29ja2V0IGNsaWVudFNvY2soImxvY2FsaG9zdCIsIHBvcnQpOwogICBjbGllbnRTb2NrLm9wZW4oKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0ZWQgPSBzb2NrMS5hY2NlcHQoKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdGVkID0gc29jazEuYWNjZXB0KCk7CiAgIC8vIHBlZWsoKSB3aWxsIHJldHVybiBmYWxzZSB3aGVuIHJlbW90ZSBzaWRlIGlzIGNsb3NlZAotICBib29zdDo6dGhyZWFkIHBlZWtUaHJlYWQoYm9vc3Q6OmJpbmQocGVla2VyV29ya2VyLCBhY2NlcHRlZCwgZmFsc2UpKTsKKyAgYm9vc3Q6OnRocmVhZCBwZWVrVGhyZWFkKHN0ZDo6YmluZChwZWVrZXJXb3JrZXIsIGFjY2VwdGVkLCBmYWxzZSkpOwogICBib29zdDo6dGhpc190aHJlYWQ6OnNsZWVwKGJvb3N0Ojpwb3NpeF90aW1lOjptaWxsaXNlY29uZHMoNTApKTsKICAgLy8gcGVla1RocmVhZCBpcyBwcmFjdGljYWxseSBndWFyYW50ZWVkIHRvIGJlIGJsb2NraW5nIG5vdwogICBzb2NrMS5pbnRlcnJ1cHRDaGlsZHJlbigpOwpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1Rlc3RQb3J0Rml4dHVyZS5oIGIvbGliL2NwcC90ZXN0L1Rlc3RQb3J0Rml4dHVyZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWY0N2Q2Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvdGVzdC9UZXN0UG9ydEZpeHR1cmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxjc3RkbGliPgotCi1jbGFzcyBUZXN0UG9ydEZpeHR1cmUgewotcHVibGljOgotICBUZXN0UG9ydEZpeHR1cmUoKSB7Ci0gICAgY29uc3QgY2hhciogc3BFbnYgPSBzdGQ6OmdldGVudigiVEhSSUZUX1RFU1RfUE9SVCIpOwotICAgIG1fc2VydmVyUG9ydCA9IChzcEVudikgPyBhdG9pKHNwRW52KSA6IDkwOTA7Ci0gIH0KLQotcHJvdGVjdGVkOgotICBpbnQgbV9zZXJ2ZXJQb3J0OwotfTsKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9UcmFuc3BvcnRUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9UcmFuc3BvcnRUZXN0LmNwcAppbmRleCBjMDU2YTVkLi5jZTE5NTQ0IDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvVHJhbnNwb3J0VGVzdC5jcHAKKysrIGIvbGliL2NwcC90ZXN0L1RyYW5zcG9ydFRlc3QuY3BwCkBAIC0xNyw3ICsxNyw3IEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KIAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHRpbWUuaD4KQEAgLTI2LDcgKzI2LDYgQEAKICNlbmRpZgogI2luY2x1ZGUgPHNzdHJlYW0+CiAjaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDx0aHJpZnQvY3h4ZnVuY3Rpb25hbC5oPgogCiAjaW5jbHVkZSA8Ym9vc3QvbXBsL2xpc3QuaHBwPgogI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9hcnJheS5ocHA+CkBAIC00MywxMCArNDIsMTIgQEAKIAogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9GdW5jdGlvblJ1bm5lci5oPgogI2lmIF9XSU4zMgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFBpcGUuaD4KICNpbmNsdWRlIDx0aHJpZnQvd2luZG93cy9UV2luc29ja1NpbmdsZXRvbi5oPgogI2VuZGlmCiAKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwogCiBzdGF0aWMgYm9vc3Q6Om10MTk5Mzcgcm5nOwogCkBAIC0xMTIsNyArMTEzLDcgQEAKICAgc3RkOjpzdHJpbmcgZGVzY3JpYmUoKSBjb25zdCB7IHJldHVybiBnZW5lcmF0b3JfLT5kZXNjcmliZSgpOyB9CiAKIHByaXZhdGU6Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFNpemVHZW5lcmF0b3I+IGdlbmVyYXRvcl87CisgIHN0ZDo6c2hhcmVkX3B0cjxTaXplR2VuZXJhdG9yPiBnZW5lcmF0b3JfOwogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMzUsOCArMTM2LDggQEAKIAogICBDb3VwbGVkVHJhbnNwb3J0cygpIDogaW4oKSwgb3V0KCkge30KIAotICBib29zdDo6c2hhcmVkX3B0cjxUcmFuc3BvcnRfPiBpbjsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VHJhbnNwb3J0Xz4gb3V0OworICBzdGQ6OnNoYXJlZF9wdHI8VHJhbnNwb3J0Xz4gaW47CisgIHN0ZDo6c2hhcmVkX3B0cjxUcmFuc3BvcnRfPiBvdXQ7CiAKIHByaXZhdGU6CiAgIENvdXBsZWRUcmFuc3BvcnRzKGNvbnN0IENvdXBsZWRUcmFuc3BvcnRzJik7CkBAIC0xNTMsNyArMTU0LDcgQEAKICAgICBvdXQgPSBidWY7CiAgIH0KIAotICBib29zdDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWY7CisgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWY7CiB9OwogCiAvKioKQEAgLTIxOSw2ICsyMjAsMjIgQEAKICAgICBvdXQucmVzZXQobmV3IFRGRFRyYW5zcG9ydChwaXBlc1sxXSwgVEZEVHJhbnNwb3J0OjpDTE9TRV9PTl9ERVNUUk9ZKSk7CiAgIH0KIH07CisjZWxzZQorLyoqCisgKiBDb3VwbGVkIHBpcGUgdHJhbnNwb3J0cworICovCitjbGFzcyBDb3VwbGVkUGlwZVRyYW5zcG9ydHMgOiBwdWJsaWMgQ291cGxlZFRyYW5zcG9ydHM8VFBpcGU+IHsKK3B1YmxpYzoKKyAgSEFORExFIGhSZWFkOworICBIQU5ETEUgaFdyaXRlOworCisgIENvdXBsZWRQaXBlVHJhbnNwb3J0cygpIHsKKyAgICBCT09TVF9SRVFVSVJFKENyZWF0ZVBpcGUoJmhSZWFkLCAmaFdyaXRlLCBOVUxMLCAxMDQ4NTc2ICogMikpOworICAgIGluLnJlc2V0KG5ldyBUUGlwZShoUmVhZCwgaFdyaXRlKSk7CisgICAgaW4tPm9wZW4oKTsKKyAgICBvdXQgPSBpbjsKKyAgfQorfTsKICNlbmRpZgogCiAvKioKQEAgLTMyMywxMSArMzQwLDExIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0cnVjdCBUcmlnZ2VySW5mbyB7Ci0gIFRyaWdnZXJJbmZvKGludCBzZWNvbmRzLCBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiYgdHJhbnNwb3J0LCB1aW50MzJfdCB3cml0ZUxlbmd0aCkKKyAgVHJpZ2dlckluZm8oaW50IHNlY29uZHMsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiYgdHJhbnNwb3J0LCB1aW50MzJfdCB3cml0ZUxlbmd0aCkKICAgICA6IHRpbWVvdXRTZWNvbmRzKHNlY29uZHMpLCB0cmFuc3BvcnQodHJhbnNwb3J0KSwgd3JpdGVMZW5ndGgod3JpdGVMZW5ndGgpLCBuZXh0KE5VTEwpIHt9CiAKICAgaW50IHRpbWVvdXRTZWNvbmRzOwotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQ7CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQ7CiAgIHVpbnQzMl90IHdyaXRlTGVuZ3RoOwogICBUcmlnZ2VySW5mbyogbmV4dDsKIH07CkBAIC00MDIsNyArNDE5LDcgQEAKICAqIHRvIHRoZSBlbmQuKQogICovCiB2b2lkIGFkZF90cmlnZ2VyKHVuc2lnbmVkIGludCBzZWNvbmRzLAotICAgICAgICAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiYgdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4mIHRyYW5zcG9ydCwKICAgICAgICAgICAgICAgICAgdWludDMyX3Qgd3JpdGVfbGVuKSB7CiAgIFRyaWdnZXJJbmZvKiBpbmZvID0gbmV3IFRyaWdnZXJJbmZvKHNlY29uZHMsIHRyYW5zcG9ydCwgd3JpdGVfbGVuKTsKICAgewpAQCAtNDQyLDcgKzQ1OSw3IEBACiB9CiAKIHZvaWQgc2V0X3RyaWdnZXIodW5zaWduZWQgaW50IHNlY29uZHMsCi0gICAgICAgICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+JiB0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiYgdHJhbnNwb3J0LAogICAgICAgICAgICAgICAgICB1aW50MzJfdCB3cml0ZV9sZW4pIHsKICAgY2xlYXJfdHJpZ2dlcnMoKTsKICAgYWRkX3RyaWdnZXIoc2Vjb25kcywgdHJhbnNwb3J0LCB3cml0ZV9sZW4pOwpAQCAtODQwLDYgKzg1NywxOSBAQAogICAgIFRFU1RfUlcoQ291cGxlZEZEVHJhbnNwb3J0cywgMTAyNCAqIDE2LCAxLCAxLCByYW5kNGssIHJhbmQ0aywgZmRfbWF4X291dHN0YW5kaW5nKTsKIAogICAgIFRFU1RfQkxPQ0tJTkdfQkVIQVZJT1IoQ291cGxlZEZEVHJhbnNwb3J0cyk7CisjZWxzZQorICAgIC8vIFRQaXBlIHRlc3RzIChXSU4zMiBvbmx5KQorICAgIFRFU1RfUlcoQ291cGxlZFBpcGVUcmFuc3BvcnRzLCAxMDI0ICogMTAyNCwgMCwgMCk7CisgICAgVEVTVF9SVyhDb3VwbGVkUGlwZVRyYW5zcG9ydHMsIDEwMjQgKiAyNTYsIHJhbmQ0aywgcmFuZDRrKTsKKyAgICBURVNUX1JXKENvdXBsZWRQaXBlVHJhbnNwb3J0cywgMTAyNCAqIDI1NiwgMTY3LCAxNjMpOworICAgIFRFU1RfUlcoQ291cGxlZFBpcGVUcmFuc3BvcnRzLCAxMDI0ICogMTYsIDEsIDEpOworCisgICAgVEVTVF9SVyhDb3VwbGVkUGlwZVRyYW5zcG9ydHMsIDEwMjQgKiAyNTYsIDAsIDAsIHJhbmQ0aywgcmFuZDRrKTsKKyAgICBURVNUX1JXKENvdXBsZWRQaXBlVHJhbnNwb3J0cywgMTAyNCAqIDI1NiwgcmFuZDRrLCByYW5kNGssIHJhbmQ0aywgcmFuZDRrKTsKKyAgICBURVNUX1JXKENvdXBsZWRQaXBlVHJhbnNwb3J0cywgMTAyNCAqIDI1NiwgMTY3LCAxNjMsIHJhbmQ0aywgcmFuZDRrKTsKKyAgICBURVNUX1JXKENvdXBsZWRQaXBlVHJhbnNwb3J0cywgMTAyNCAqIDE2LCAxLCAxLCByYW5kNGssIHJhbmQ0ayk7CisKKyAgICBURVNUX0JMT0NLSU5HX0JFSEFWSU9SKENvdXBsZWRQaXBlVHJhbnNwb3J0cyk7CiAjZW5kaWYgLy9fV0lOMzIKIAogICAgIC8vIFRTb2NrZXQgdGVzdHMKQEAgLTk0NSwxMSArOTc1LDExIEBACiAgICAgICAgICA8PCByQ2h1bmtTaXplR2VuLmRlc2NyaWJlKCkgPDwgIiwgIiA8PCBtYXhPdXRzdGFuZGluZyA8PCAiKSI7CiAKICNpZiAoQk9PU1RfVkVSU0lPTiA+PSAxMDU5MDApCi0gICAgYm9vc3Q6OmZ1bmN0aW9uPHZvaWQgKCk+IHRlc3RfZnVuYworICAgIHN0ZDo6ZnVuY3Rpb248dm9pZCAoKT4gdGVzdF9mdW5jCiAjZWxzZQogICAgIGJvb3N0Ojp1bml0X3Rlc3Q6OmNhbGxiYWNrMDw+IHRlc3RfZnVuYwogI2VuZGlmCi0gICAgICAgID0gYXBhY2hlOjp0aHJpZnQ6OnN0ZGN4eDo6YmluZCh0ZXN0X3J3PENvdXBsZWRUcmFuc3BvcnRzPiwKKyAgICAgICAgPSBzdGQ6OmJpbmQodGVzdF9ydzxDb3VwbGVkVHJhbnNwb3J0cz4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3U2l6ZUdlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJTaXplR2VuLApAQCAtOTk1LDcgKzEwMjUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdHJ1Y3QgZ2xvYmFsX2ZpeHR1cmUgewotICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZD4gYWxhcm1UaHJlYWRfOworICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWQ+IGFsYXJtVGhyZWFkXzsKICAgZ2xvYmFsX2ZpeHR1cmUoKSB7CiAjaWYgX1dJTjMyCiAgICAgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFdpbnNvY2tTaW5nbGV0b246OmNyZWF0ZSgpOwpAQCAtMTAyNCw2ICsxMDU0LDI1IEBACiBCT09TVF9HTE9CQUxfRklYVFVSRShnbG9iYWxfZml4dHVyZSkKICNlbmRpZgogCisjaWZkZWYgQk9PU1RfVEVTVF9EWU5fTElOSworYm9vbCBpbml0X3VuaXRfdGVzdF9zdWl0ZSgpIHsKKyAgc3RydWN0IHRpbWV2YWwgdHY7CisgIFRIUklGVF9HRVRUSU1FT0ZEQVkoJnR2LCBOVUxMKTsKKyAgaW50IHNlZWQgPSB0di50dl9zZWMgXiB0di50dl91c2VjOworCisgIGluaXRyYW5kKHNlZWQpOworCisgIGJvb3N0Ojp1bml0X3Rlc3Q6OnRlc3Rfc3VpdGUqIHN1aXRlID0gJmJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazo6bWFzdGVyX3Rlc3Rfc3VpdGUoKTsKKyAgc3VpdGUtPnBfbmFtZS52YWx1ZSA9ICJUcmFuc3BvcnRUZXN0IjsKKyAgVHJhbnNwb3J0VGVzdEdlbiB0cmFuc3BvcnRfdGVzdF9nZW5lcmF0b3Ioc3VpdGUsIDEpOworICB0cmFuc3BvcnRfdGVzdF9nZW5lcmF0b3IuZ2VuZXJhdGUoKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2ludCBtYWluKCBpbnQgYXJnYywgY2hhciogYXJndltdICkgeworICByZXR1cm4gOjpib29zdDo6dW5pdF90ZXN0Ojp1bml0X3Rlc3RfbWFpbigmaW5pdF91bml0X3Rlc3Rfc3VpdGUsYXJnYyxhcmd2KTsKK30KKyNlbHNlCiBib29zdDo6dW5pdF90ZXN0Ojp0ZXN0X3N1aXRlKiBpbml0X3VuaXRfdGVzdF9zdWl0ZShpbnQgYXJnYywgY2hhciogYXJndltdKSB7CiAgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUoYXJnYyk7CiAgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUoYXJndik7CkBAIC0xMDM5LDMgKzEwODgsNCBAQAogICB0cmFuc3BvcnRfdGVzdF9nZW5lcmF0b3IuZ2VuZXJhdGUoKTsKICAgcmV0dXJuIE5VTEw7CiB9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9abGliVGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvWmxpYlRlc3QuY3BwCmluZGV4IGZhMjM3YTIuLmM4MjY4MTQgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9abGliVGVzdC5jcHAKKysrIGIvbGliL2NwcC90ZXN0L1psaWJUZXN0LmNwcApAQCAtMTcsMjIgKzE3LDI3IEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jZGVmaW5lIF9fU1REQ19GT1JNQVRfTUFDUk9TCi0KICNpZm5kZWYgX0dOVV9TT1VSQ0UKICNkZWZpbmUgX0dOVV9TT1VSQ0UgLy8gbmVlZGVkIGZvciBnZXRvcHRfbG9uZwogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPD0gMTcwMCkKKy8vIHBvbHlub21pYWwgYW5kIHN0ZDo6ZmlsbF90IHdhcm5pbmcgaGFwcGVucyBpbiBNU1ZDIDIwMTAsIDIwMTMsIG1heWJlIG90aGVycworLy8gaHR0cHM6Ly9zdm4uYm9vc3Qub3JnL3RyYWMvYm9vc3QvdGlja2V0LzExNDI2CisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0OTk2KQorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NURElOVF9ICiAjaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKICNpZmRlZiBIQVZFX0lOVFRZUEVTX0gKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2VuZGlmCiAjaW5jbHVkZSA8Y3N0ZGRlZj4KICNpbmNsdWRlIDxmc3RyZWFtPgogI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHRocmlmdC9jeHhmdW5jdGlvbmFsLmg+CisjaW5jbHVkZSA8bWVtb3J5PgogCi0jaW5jbHVkZSA8Ym9vc3QvZnVuY3Rpb24uaHBwPgogI2luY2x1ZGUgPGJvb3N0L3JhbmRvbS5ocHA+CiAjaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX2FycmF5LmhwcD4KICNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CkBAIC00MSw4ICs0Niw5IEBACiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuaD4KIAotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwordXNpbmcgc3RkOjpzdHJpbmc7CiAKIGJvb3N0OjptdDE5OTM3IHJuZzsKIApAQCAtMTQxLDggKzE0Nyw4IEBACiAgKi8KIAogdm9pZCB0ZXN0X3dyaXRlX3RoZW5fcmVhZChjb25zdCBib29zdDo6c2hhcmVkX2FycmF5PHVpbnQ4X3Q+IGJ1ZiwgdWludDMyX3QgYnVmX2xlbikgewotICBib29zdDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBtZW1idWYobmV3IFRNZW1vcnlCdWZmZXIoKSk7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRabGliVHJhbnNwb3J0PiB6bGliX3RyYW5zKG5ldyBUWmxpYlRyYW5zcG9ydChtZW1idWYpKTsKKyAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBtZW1idWYobmV3IFRNZW1vcnlCdWZmZXIoKSk7CisgIHNoYXJlZF9wdHI8VFpsaWJUcmFuc3BvcnQ+IHpsaWJfdHJhbnMobmV3IFRabGliVHJhbnNwb3J0KG1lbWJ1ZikpOwogICB6bGliX3RyYW5zLT53cml0ZShidWYuZ2V0KCksIGJ1Zl9sZW4pOwogICB6bGliX3RyYW5zLT5maW5pc2goKTsKIApAQCAtMTYwLDggKzE2Niw4IEBACiAgIC8vIGl0IGlzbid0IHRoZXJlLiAgVGhlIG9yaWdpbmFsIGltcGxlbWVudGF0aW9uIGNvbXBsYWluZWQgdGhhdAogICAvLyB0aGUgc3RyZWFtIHdhcyBub3QgY29tcGxldGUuICBJJ20gYWJvdXQgdG8gZ28gZml4IHRoYXQuCiAgIC8vIEl0IHdvcmtlZC4gIEF3ZXNvbWUuCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IG1lbWJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFpsaWJUcmFuc3BvcnQ+IHpsaWJfdHJhbnMobmV3IFRabGliVHJhbnNwb3J0KG1lbWJ1ZikpOworICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IG1lbWJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKKyAgc2hhcmVkX3B0cjxUWmxpYlRyYW5zcG9ydD4gemxpYl90cmFucyhuZXcgVFpsaWJUcmFuc3BvcnQobWVtYnVmKSk7CiAgIHpsaWJfdHJhbnMtPndyaXRlKGJ1Zi5nZXQoKSwgYnVmX2xlbik7CiAgIHpsaWJfdHJhbnMtPmZpbmlzaCgpOwogICBzdHJpbmcgdG1wX2J1ZjsKQEAgLTE4MCw4ICsxODYsOCBAQAogdm9pZCB0ZXN0X2luY29tcGxldGVfY2hlY2tzdW0oY29uc3QgYm9vc3Q6OnNoYXJlZF9hcnJheTx1aW50OF90PiBidWYsIHVpbnQzMl90IGJ1Zl9sZW4pIHsKICAgLy8gTWFrZSBzdXJlIHdlIHN0aWxsIGdldCB0aGF0ICJub3QgY29tcGxldGUiIGVycm9yIGlmCiAgIC8vIGl0IHJlYWxseSBpc24ndCBjb21wbGV0ZS4KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gbWVtYnVmKG5ldyBUTWVtb3J5QnVmZmVyKCkpOwotICBib29zdDo6c2hhcmVkX3B0cjxUWmxpYlRyYW5zcG9ydD4gemxpYl90cmFucyhuZXcgVFpsaWJUcmFuc3BvcnQobWVtYnVmKSk7CisgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gbWVtYnVmKG5ldyBUTWVtb3J5QnVmZmVyKCkpOworICBzaGFyZWRfcHRyPFRabGliVHJhbnNwb3J0PiB6bGliX3RyYW5zKG5ldyBUWmxpYlRyYW5zcG9ydChtZW1idWYpKTsKICAgemxpYl90cmFucy0+d3JpdGUoYnVmLmdldCgpLCBidWZfbGVuKTsKICAgemxpYl90cmFucy0+ZmluaXNoKCk7CiAgIHN0cmluZyB0bXBfYnVmOwpAQCAtMjA0LDExICsyMTAsMTEgQEAKIAogdm9pZCB0ZXN0X3JlYWRfd3JpdGVfbWl4KGNvbnN0IGJvb3N0OjpzaGFyZWRfYXJyYXk8dWludDhfdD4gYnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ1Zl9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8U2l6ZUdlbmVyYXRvcj4mIHdyaXRlX2dlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxTaXplR2VuZXJhdG9yPiYgcmVhZF9nZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFNpemVHZW5lcmF0b3I+JiB3cml0ZV9nZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxTaXplR2VuZXJhdG9yPiYgcmVhZF9nZW4pIHsKICAgLy8gVHJ5IGl0IHdpdGggYSBtaXggb2YgcmVhZC93cml0ZSBzaXplcy4KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gbWVtYnVmKG5ldyBUTWVtb3J5QnVmZmVyKCkpOwotICBib29zdDo6c2hhcmVkX3B0cjxUWmxpYlRyYW5zcG9ydD4gemxpYl90cmFucyhuZXcgVFpsaWJUcmFuc3BvcnQobWVtYnVmKSk7CisgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gbWVtYnVmKG5ldyBUTWVtb3J5QnVmZmVyKCkpOworICBzaGFyZWRfcHRyPFRabGliVHJhbnNwb3J0PiB6bGliX3RyYW5zKG5ldyBUWmxpYlRyYW5zcG9ydChtZW1idWYpKTsKICAgdW5zaWduZWQgaW50IHRvdDsKIAogICB0b3QgPSAwOwpAQCAtMjQzLDggKzI0OSw4IEBACiAKIHZvaWQgdGVzdF9pbnZhbGlkX2NoZWNrc3VtKGNvbnN0IGJvb3N0OjpzaGFyZWRfYXJyYXk8dWludDhfdD4gYnVmLCB1aW50MzJfdCBidWZfbGVuKSB7CiAgIC8vIFZlcmlmeSBjaGVja3N1bSBjaGVja2luZy4KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gbWVtYnVmKG5ldyBUTWVtb3J5QnVmZmVyKCkpOwotICBib29zdDo6c2hhcmVkX3B0cjxUWmxpYlRyYW5zcG9ydD4gemxpYl90cmFucyhuZXcgVFpsaWJUcmFuc3BvcnQobWVtYnVmKSk7CisgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gbWVtYnVmKG5ldyBUTWVtb3J5QnVmZmVyKCkpOworICBzaGFyZWRfcHRyPFRabGliVHJhbnNwb3J0PiB6bGliX3RyYW5zKG5ldyBUWmxpYlRyYW5zcG9ydChtZW1idWYpKTsKICAgemxpYl90cmFucy0+d3JpdGUoYnVmLmdldCgpLCBidWZfbGVuKTsKICAgemxpYl90cmFucy0+ZmluaXNoKCk7CiAgIHN0cmluZyB0bXBfYnVmOwpAQCAtMjgwLDggKzI4Niw4IEBACiAKIHZvaWQgdGVzdF93cml0ZV9hZnRlcl9mbHVzaChjb25zdCBib29zdDo6c2hhcmVkX2FycmF5PHVpbnQ4X3Q+IGJ1ZiwgdWludDMyX3QgYnVmX2xlbikgewogICAvLyB3cml0ZSBzb21lIGRhdGEKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gbWVtYnVmKG5ldyBUTWVtb3J5QnVmZmVyKCkpOwotICBib29zdDo6c2hhcmVkX3B0cjxUWmxpYlRyYW5zcG9ydD4gemxpYl90cmFucyhuZXcgVFpsaWJUcmFuc3BvcnQobWVtYnVmKSk7CisgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gbWVtYnVmKG5ldyBUTWVtb3J5QnVmZmVyKCkpOworICBzaGFyZWRfcHRyPFRabGliVHJhbnNwb3J0PiB6bGliX3RyYW5zKG5ldyBUWmxpYlRyYW5zcG9ydChtZW1idWYpKTsKICAgemxpYl90cmFucy0+d3JpdGUoYnVmLmdldCgpLCBidWZfbGVuKTsKIAogICAvLyBjYWxsIGZpbmlzaCgpCkBAIC0zMTYsNyArMzIyLDcgQEAKIHZvaWQgdGVzdF9ub193cml0ZSgpIHsKICAgLy8gVmVyaWZ5IHRoYXQgbm8gZGF0YSBpcyB3cml0dGVuIHRvIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCBpZiB3ZQogICAvLyBuZXZlciB3cml0ZSBkYXRhIHRvIHRoZSBUWmxpYlRyYW5zcG9ydC4KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gbWVtYnVmKG5ldyBUTWVtb3J5QnVmZmVyKCkpOworICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IG1lbWJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKICAgewogICAgIC8vIENyZWF0ZSBhIFRabGliVHJhbnNwb3J0IG9iamVjdCwgYW5kIGltbWVkaWF0ZWx5IGRlc3Ryb3kgaXQKICAgICAvLyB3aGVuIGl0IGdvZXMgb3V0IG9mIHNjb3BlLgpAQCAtMzI2LDYgKzMzMiwxMiBAQAogICBCT09TVF9DSEVDS19FUVVBTChtZW1idWYtPmF2YWlsYWJsZV9yZWFkKCksICh1aW50MzJfdCkwKTsKIH0KIAordm9pZCB0ZXN0X2dldF91bmRlcmx5aW5nX3RyYW5zcG9ydCgpIHsKKyAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBtZW1idWYobmV3IFRNZW1vcnlCdWZmZXIoKSk7CisgIHNoYXJlZF9wdHI8VFpsaWJUcmFuc3BvcnQ+IHpsaWJfdHJhbnMobmV3IFRabGliVHJhbnNwb3J0KG1lbWJ1ZikpOworICBCT09TVF9DSEVDS19FUVVBTChtZW1idWYuZ2V0KCksIHpsaWJfdHJhbnMtPmdldFVuZGVybHlpbmdUcmFuc3BvcnQoKS5nZXQoKSk7Cit9CisKIC8qCiAgKiBJbml0aWFsaXphdGlvbgogICovCkBAIC0zMzUsNyArMzQ3LDggQEAKICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICA6OnN0ZDo6b3N0cmluZ3N0cmVhbSBuYW1lX3NzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBuYW1lX3NzIDw8IG5hbWUgPDwgIi0iIDw8IEJPT1NUX1NUUklOR0laRShfRlVOQyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBib29zdDo6ZnVuY3Rpb248dm9pZCAoKT4gdGVzdF9mdW5jID0gOjphcGFjaGU6OnRocmlmdDo6c3RkY3h4OjpiaW5kKF9GVU5DLCAjI19fVkFfQVJHU19fKTsgICAgIFwKKyAgICA6OnN0ZDo6ZnVuY3Rpb248dm9pZCAoKT4gdGVzdF9mdW5jID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICA6OnN0ZDo6YmluZChfRlVOQywgIyNfX1ZBX0FSR1NfXyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgOjpib29zdDo6dW5pdF90ZXN0Ojp0ZXN0X2Nhc2UqIHRjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgID0gOjpib29zdDo6dW5pdF90ZXN0OjptYWtlX3Rlc3RfY2FzZSh0ZXN0X2Z1bmMsIG5hbWVfc3Muc3RyKCksIF9fRklMRV9fLCBfX0xJTkVfXyk7ICAgICAgICBcCiAgICAgKHN1aXRlKS0+YWRkKHRjKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0zNDYsNyArMzU5LDcgQEAKICAgICA6OnN0ZDo6b3N0cmluZ3N0cmVhbSBuYW1lX3NzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBuYW1lX3NzIDw8IG5hbWUgPDwgIi0iIDw8IEJPT1NUX1NUUklOR0laRShfRlVOQyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICA6OmJvb3N0Ojp1bml0X3Rlc3Q6OnRlc3RfY2FzZSogdGMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgPSA6OmJvb3N0Ojp1bml0X3Rlc3Q6Om1ha2VfdGVzdF9jYXNlKDo6YXBhY2hlOjp0aHJpZnQ6OnN0ZGN4eDo6YmluZChfRlVOQywgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgPSA6OmJvb3N0Ojp1bml0X3Rlc3Q6Om1ha2VfdGVzdF9jYXNlKDo6c3RkOjpiaW5kKF9GVU5DLCAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjX19WQV9BUkdTX18pLCAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZV9zcy5zdHIoKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIChzdWl0ZSktPmFkZCh0Yyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtMzYzLDggKzM3Niw4IEBACiAgIEFERF9URVNUX0NBU0Uoc3VpdGUsIG5hbWUsIHRlc3RfaW52YWxpZF9jaGVja3N1bSwgYnVmLCBidWZfbGVuKTsKICAgQUREX1RFU1RfQ0FTRShzdWl0ZSwgbmFtZSwgdGVzdF93cml0ZV9hZnRlcl9mbHVzaCwgYnVmLCBidWZfbGVuKTsKIAotICBib29zdDo6c2hhcmVkX3B0cjxTaXplR2VuZXJhdG9yPiBzaXplXzMyayhuZXcgQ29uc3RhbnRTaXplR2VuZXJhdG9yKDEgPDwgMTUpKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8U2l6ZUdlbmVyYXRvcj4gc2l6ZV9sb2dub3JtYWwobmV3IExvZ05vcm1hbFNpemVHZW5lcmF0b3IoMjAsIDMwKSk7CisgIHNoYXJlZF9wdHI8U2l6ZUdlbmVyYXRvcj4gc2l6ZV8zMmsobmV3IENvbnN0YW50U2l6ZUdlbmVyYXRvcigxIDw8IDE1KSk7CisgIHNoYXJlZF9wdHI8U2l6ZUdlbmVyYXRvcj4gc2l6ZV9sb2dub3JtYWwobmV3IExvZ05vcm1hbFNpemVHZW5lcmF0b3IoMjAsIDMwKSk7CiAgIEFERF9URVNUX0NBU0Uoc3VpdGUsIG5hbWUgPDwgIi1jb25zdGFudCIsIHRlc3RfcmVhZF93cml0ZV9taXgsIGJ1ZiwgYnVmX2xlbiwgc2l6ZV8zMmssIHNpemVfMzJrKTsKICAgQUREX1RFU1RfQ0FTRShzdWl0ZSwKICAgICAgICAgICAgICAgICBuYW1lIDw8ICItbG9nbm9ybWFsLXdyaXRlIiwKQEAgLTM5NCw4ICs0MDcsOCBAQAogICAvLyBCZWNhdXNlIHRoZSBTaXplR2VuZXJhdG9yIG1ha2VzIGEgY29weSBvZiB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IsCiAgIC8vIGJvdGggU2l6ZUdlbmVyYXRvcnMgc2hvdWxkIHJldHVybiB0aGUgZXhhY3Qgc2FtZSBzZXQgb2YgdmFsdWVzLCBzaW5jZSB0aGV5CiAgIC8vIGJvdGggc3RhcnQgd2l0aCByYW5kb20gbnVtYmVyIGdlbmVyYXRvcnMgaW4gdGhlIHNhbWUgc3RhdGUuCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFNpemVHZW5lcmF0b3I+IHdyaXRlX3NpemVfZ2VuKG5ldyBMb2dOb3JtYWxTaXplR2VuZXJhdG9yKDIwLCAzMCkpOwotICBib29zdDo6c2hhcmVkX3B0cjxTaXplR2VuZXJhdG9yPiByZWFkX3NpemVfZ2VuKG5ldyBMb2dOb3JtYWxTaXplR2VuZXJhdG9yKDIwLCAzMCkpOworICBzaGFyZWRfcHRyPFNpemVHZW5lcmF0b3I+IHdyaXRlX3NpemVfZ2VuKG5ldyBMb2dOb3JtYWxTaXplR2VuZXJhdG9yKDIwLCAzMCkpOworICBzaGFyZWRfcHRyPFNpemVHZW5lcmF0b3I+IHJlYWRfc2l6ZV9nZW4obmV3IExvZ05vcm1hbFNpemVHZW5lcmF0b3IoMjAsIDMwKSk7CiAgIEFERF9URVNUX0NBU0Uoc3VpdGUsCiAgICAgICAgICAgICAgICAgbmFtZSA8PCAiLWxvZ25vcm1hbC1zYW1lLWRpc3RyaWJ1dGlvbiIsCiAgICAgICAgICAgICAgICAgdGVzdF9yZWFkX3dyaXRlX21peCwKQEAgLTQxMiw2ICs0MjUsMzIgQEAKICAgZnByaW50ZihmLCAiICAtLWhlbHBcbiIpOwogfQogCisjaWZkZWYgQk9PU1RfVEVTVF9EWU5fTElOSworYm9vbCBpbml0X3VuaXRfdGVzdF9zdWl0ZSgpIHsKKyAgdWludDMyX3Qgc2VlZCA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pih0aW1lKE5VTEwpKTsKKyNpZmRlZiBIQVZFX0lOVFRZUEVTX0gKKyAgcHJpbnRmKCJzZWVkOiAlIiBQUkl1MzIgIlxuIiwgc2VlZCk7CisjZW5kaWYKKyAgcm5nLnNlZWQoc2VlZCk7CisKKyAgYm9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9zdWl0ZSogc3VpdGUgPSAmYm9vc3Q6OnVuaXRfdGVzdDo6ZnJhbWV3b3JrOjptYXN0ZXJfdGVzdF9zdWl0ZSgpOworICBzdWl0ZS0+cF9uYW1lLnZhbHVlID0gIlpsaWJUZXN0IjsKKworICB1aW50MzJfdCBidWZfbGVuID0gMTAyNCAqIDMyOworICBhZGRfdGVzdHMoc3VpdGUsIGdlbl91bmlmb3JtX2J1ZmZlcihidWZfbGVuLCAnYScpLCBidWZfbGVuLCAidW5pZm9ybSIpOworICBhZGRfdGVzdHMoc3VpdGUsIGdlbl9jb21wcmVzc2libGVfYnVmZmVyKGJ1Zl9sZW4pLCBidWZfbGVuLCAiY29tcHJlc3NpYmxlIik7CisgIGFkZF90ZXN0cyhzdWl0ZSwgZ2VuX3JhbmRvbV9idWZmZXIoYnVmX2xlbiksIGJ1Zl9sZW4sICJyYW5kb20iKTsKKworICBzdWl0ZS0+YWRkKEJPT1NUX1RFU1RfQ0FTRSh0ZXN0X25vX3dyaXRlKSk7CisgIHN1aXRlLT5hZGQoQk9PU1RfVEVTVF9DQVNFKHRlc3RfZ2V0X3VuZGVybHlpbmdfdHJhbnNwb3J0KSk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK2ludCBtYWluKCBpbnQgYXJnYywgY2hhciogYXJndltdICkgeworICByZXR1cm4gOjpib29zdDo6dW5pdF90ZXN0Ojp1bml0X3Rlc3RfbWFpbigmaW5pdF91bml0X3Rlc3Rfc3VpdGUsYXJnYyxhcmd2KTsKK30KKyNlbHNlCiBib29zdDo6dW5pdF90ZXN0Ojp0ZXN0X3N1aXRlKiBpbml0X3VuaXRfdGVzdF9zdWl0ZShpbnQgYXJnYywgY2hhciogYXJndltdKSB7CiAgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUoYXJnYyk7CiAgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUoYXJndik7CkBAIC00MzMsMyArNDcyLDQgQEAKIAogICByZXR1cm4gTlVMTDsKIH0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5L011dGV4VGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvTXV0ZXhUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODFlYzFhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5L011dGV4VGVzdC5jcHAKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gVGhpcyBpcyBsaW5rZWQgaW50byB0aGUgVW5pdFRlc3RzIHRlc3QgZXhlY3V0YWJsZQorCisjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgorCisjaW5jbHVkZSAidGhyaWZ0L2NvbmN1cnJlbmN5L0V4Y2VwdGlvbi5oIgorI2luY2x1ZGUgInRocmlmdC9jb25jdXJyZW5jeS9NdXRleC5oIgorCit1c2luZyBib29zdDo6dW5pdF90ZXN0Ojp0ZXN0X3N1aXRlOwordXNpbmcgYm9vc3Q6OnVuaXRfdGVzdDo6ZnJhbWV3b3JrOjptYXN0ZXJfdGVzdF9zdWl0ZTsKKwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTsKKworc3RydWN0IExGQVQKK3sKKyAgTEZBVCgpCisgICAgOiB1dXQoTXV0ZXg6OkVSUk9SQ0hFQ0tfSU5JVElBTElaRVIpCisgIHsKKyAgICBCT09TVF9DSEVDS19FUVVBTCgwLCBwdGhyZWFkX211dGV4X2luaXQoJm14LCAwKSk7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoMCwgcHRocmVhZF9jb25kX2luaXQoJmN2LCAwKSk7CisgIH0KKworICBNdXRleCB1dXQ7CisgIHB0aHJlYWRfbXV0ZXhfdCBteDsKKyAgcHRocmVhZF9jb25kX3QgY3Y7Cit9OworCisvLyBIZWxwZXIgZm9yIHRlc3RpbmcgbXV0ZXggYmVoYXZpb3Igd2hlbiBsb2NrZWQgYnkgYW5vdGhlciB0aHJlYWQKK3ZvaWQgKiBsb2NrRnJvbUFub3RoZXJUaHJlYWQodm9pZCAqcHRyKQoreworICBzdHJ1Y3QgTEZBVCAqbGZhdCA9IChMRkFUICopcHRyOworICBCT09TVF9DSEVDS19FUVVBTCAgICgwLCBwdGhyZWFkX211dGV4X2xvY2soJmxmYXQtPm14KSk7ICAgICAgICAgICAvLyBzeW5jaHJvbml6ZSB3aXRoIHRlc3RpbmcgdGhyZWFkCisgIEJPT1NUX0NIRUNLX05PX1RIUk9XKCBsZmF0LT51dXQubG9jaygpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwgICAoMCwgcHRocmVhZF9jb25kX3NpZ25hbCgmbGZhdC0+Y3YpKTsgICAgICAgICAgLy8gdGVsbCB0ZXN0aW5nIHRocmVhZCB3ZSBoYXZlIGxvY2tlZCB0aGUgbXV0ZXgKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwgICAoMCwgcHRocmVhZF9jb25kX3dhaXQoJmxmYXQtPmN2LCAmbGZhdC0+bXgpKTsgLy8gd2FpdCBmb3IgdGVzdGluZyB0aHJlYWQgdG8gc2lnbmFsIGNvbmRpdGlvbiB2YXJpYWJsZSB0ZWxsaW5nIHVzIHRvIHVubG9jaworICBCT09TVF9DSEVDS19OT19USFJPVyggbGZhdC0+dXV0LnVubG9jaygpKTsKKyAgcmV0dXJuIHB0cjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVzdGluZyB0aHJlYWQgc2hvdWxkIGpvaW4gdG8gZW5zdXJlIGNvbXBsZXRlbmVzcworfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEUoTXV0ZXhUZXN0KQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShoYXBweV9wYXRoKQoreworICBNdXRleCB1dXQoTXV0ZXg6OkVSUk9SQ0hFQ0tfSU5JVElBTElaRVIpOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkZWQgdG8gdGVzdCB1bmxvY2tpbmcgdHdpY2Ugd2l0aG91dCB1bmRlZmluZWQgYmVoYXZpb3IKKworICBCT09TVF9DSEVDS19OT19USFJPVyggdXV0LmxvY2soKSk7CisgIEJPT1NUX0NIRUNLX1RIUk9XICAgKCB1dXQubG9jaygpLCBTeXN0ZW1SZXNvdXJjZUV4Y2VwdGlvbik7ICAgICAgIC8vIEVERUFETEsgKHRoaXMgdGhyZWFkIG93bnMgaXQpCisgIEJPT1NUX0NIRUNLX05PX1RIUk9XKCB1dXQudW5sb2NrKCkpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShyZWN1cnNpdmVfaGFwcHlfcGF0aCkKK3sKKyAgTXV0ZXggdXV0KE11dGV4OjpSRUNVUlNJVkVfSU5JVElBTElaRVIpOworCisgIEJPT1NUX0NIRUNLX05PX1RIUk9XKCB1dXQubG9jaygpKTsKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1coIHV1dC5sb2NrKCkpOworICBCT09TVF9DSEVDS19OT19USFJPVyggdXV0LnVubG9jaygpKTsKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1coIHV1dC5sb2NrKCkpOworICBCT09TVF9DSEVDS19OT19USFJPVyggdXV0LmxvY2soKSk7CisgIEJPT1NUX0NIRUNLX05PX1RIUk9XKCB1dXQudW5sb2NrKCkpOworICBCT09TVF9DSEVDS19OT19USFJPVyggdXV0LmxvY2soKSk7CisgIEJPT1NUX0NIRUNLX05PX1RIUk9XKCB1dXQudW5sb2NrKCkpOworICBCT09TVF9DSEVDS19OT19USFJPVyggdXV0LnVubG9jaygpKTsKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1coIHV1dC51bmxvY2soKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRyeWxvY2spCit7CisgIE11dGV4IHV1dChNdXRleDo6QURBUFRJVkVfSU5JVElBTElaRVIpOyAgIC8vIGp1c3QgdXNpbmcgYW5vdGhlciBpbml0aWFsaXplciBmb3IgY292ZXJhZ2UKKworICBCT09TVF9DSEVDSyAgICAgICAgICggdXV0LnRyeWxvY2soKSk7CisgIEJPT1NUX0NIRUNLICAgICAgICAgKCF1dXQudHJ5bG9jaygpKTsKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1coIHV1dC51bmxvY2soKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRpbWVkbG9jaykKK3sKKyAgcHRocmVhZF90IHRoOworICBzdHJ1Y3QgTEZBVCBsZmF0OworCisgIEJPT1NUX0NIRUNLICAgICAgICAgKCBsZmF0LnV1dC50aW1lZGxvY2soMTAwKSk7CisgIEJPT1NUX0NIRUNLX1RIUk9XICAgKCBsZmF0LnV1dC50aW1lZGxvY2soMTAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbVJlc291cmNlRXhjZXB0aW9uKTsgICAgICAgICAgICAgICAgICAgLy8gRURFQURMSyAoY3VycmVudCB0aHJlYWQgb3ducyBtdXRleCAtIGxvZ2ljIGVycm9yKQorICBCT09TVF9DSEVDS19OT19USFJPVyggbGZhdC51dXQudW5sb2NrKCkpOworCisgIEJPT1NUX0NIRUNLX0VRVUFMICAgKDAsIHB0aHJlYWRfbXV0ZXhfbG9jaygmbGZhdC5teCkpOyAgICAgICAgICAgIC8vIHN5bmNocm9uaXplIHdpdGggaGVscGVyIHRocmVhZAorICBCT09TVF9DSEVDS19FUVVBTCAgICgwLCBwdGhyZWFkX2NyZWF0ZSgmdGgsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9ja0Zyb21Bbm90aGVyVGhyZWFkLCAmbGZhdCkpOyAgICAgICAgIC8vIGNyZWF0ZSBoZWxwZXIgdGhyZWFkCisgIEJPT1NUX0NIRUNLX0VRVUFMICAgKDAsIHB0aHJlYWRfY29uZF93YWl0KCZsZmF0LmN2LCAmbGZhdC5teCkpOyAgIC8vIHdhaXQgZm9yIGhlbHBlciB0aHJlYWQgdG8gbG9jayBtdXRleAorCisgIEJPT1NUX0NIRUNLICAgICAgICAgKCFsZmF0LnV1dC50aW1lZGxvY2soMTAwKSk7ICAgICAgICAgICAgICAgICAgIC8vIGZhbHNlOiBhbm90aGVyIHRocmVhZCBvd25zIHRoZSBsb2NrCisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwgICAoMCwgcHRocmVhZF9jb25kX3NpZ25hbCgmbGZhdC5jdikpOyAgICAgICAgICAgLy8gdGVsbCBoZWxwZXIgdGhyZWFkIHdlIGFyZSBkb25lCisgIEJPT1NUX0NIRUNLX0VRVUFMICAgKDAsIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZsZmF0Lm14KSk7ICAgICAgICAgIC8vIGxldCBoZWxwZXIgdGhyZWFkIGNsZWFuIHVwCisgIEJPT1NUX0NIRUNLX0VRVUFMICAgKDAsIHB0aHJlYWRfam9pbih0aCwgMCkpOyAgICAgICAgICAgICAgICAgICAgIC8vIHdhaXQgZm9yIHRlc3RpbmcgdGhyZWFkIHRvIHVubG9jayBhbmQgYmUgZG9uZQorfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh1bmRlcmx5aW5nKQoreworICBNdXRleCB1dXQ7CisKKyAgQk9PU1RfQ0hFQ0sgICAgICAgICAoIHV1dC5nZXRVbmRlcmx5aW5nSW1wbCgpKTsKK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvUldNdXRleFN0YXJ2ZVRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5L1JXTXV0ZXhTdGFydmVUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODVhMjMwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5L1JXTXV0ZXhTdGFydmVUZXN0LmNwcApAQCAtMCwwICsxLDE1NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBUaGlzIGlzIGxpbmtlZCBpbnRvIHRoZSBVbml0VGVzdHMgdGVzdCBleGVjdXRhYmxlCisKKyNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CisKKyNpbmNsdWRlICJ0aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguaCIKKyNpbmNsdWRlICJ0aHJpZnQvY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5LmgiCisjaW5jbHVkZSA8bWVtb3J5PgorCit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7Cit1c2luZyBib29zdDo6dW5pdF90ZXN0Ojp0ZXN0X3N1aXRlOwordXNpbmcgYm9vc3Q6OnVuaXRfdGVzdDo6ZnJhbWV3b3JrOjptYXN0ZXJfdGVzdF9zdWl0ZTsKKwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTsKKworY2xhc3MgTG9ja2VyIDogcHVibGljIFJ1bm5hYmxlIHsKK3Byb3RlY3RlZDoKKyAgTG9ja2VyKHNoYXJlZF9wdHI8UmVhZFdyaXRlTXV0ZXg+IHJ3bG9jaywgYm9vbCB3cml0ZXIpCisgICAgOiByd2xvY2tfKHJ3bG9jayksIHdyaXRlcl8od3JpdGVyKSwgc3RhcnRlZF8oZmFsc2UpLCBnb3RMb2NrXyhmYWxzZSksIHNpZ25hbGVkXyhmYWxzZSkge30KKworcHVibGljOgorICB2aXJ0dWFsIHZvaWQgcnVuKCkgeworICAgIHN0YXJ0ZWRfID0gdHJ1ZTsKKyAgICBpZiAod3JpdGVyXykgeworICAgICAgcndsb2NrXy0+YWNxdWlyZVdyaXRlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJ3bG9ja18tPmFjcXVpcmVSZWFkKCk7CisgICAgfQorICAgIGdvdExvY2tfID0gdHJ1ZTsKKyAgICB3aGlsZSAoIXNpZ25hbGVkXykgeworICAgICAgdXNsZWVwKDUwMDApOworICAgIH0KKyAgICByd2xvY2tfLT5yZWxlYXNlKCk7CisgIH0KKworICBib29sIHN0YXJ0ZWQoKSBjb25zdCB7IHJldHVybiBzdGFydGVkXzsgfQorICBib29sIGdvdExvY2soKSBjb25zdCB7IHJldHVybiBnb3RMb2NrXzsgfQorICB2b2lkIHNpZ25hbCgpIHsgc2lnbmFsZWRfID0gdHJ1ZTsgfQorCitwcm90ZWN0ZWQ6CisgIHNoYXJlZF9wdHI8UmVhZFdyaXRlTXV0ZXg+IHJ3bG9ja187CisgIGJvb2wgd3JpdGVyXzsKKyAgdm9sYXRpbGUgYm9vbCBzdGFydGVkXzsKKyAgdm9sYXRpbGUgYm9vbCBnb3RMb2NrXzsKKyAgdm9sYXRpbGUgYm9vbCBzaWduYWxlZF87Cit9OworCitjbGFzcyBSZWFkZXIgOiBwdWJsaWMgTG9ja2VyIHsKK3B1YmxpYzoKKyAgUmVhZGVyKHNoYXJlZF9wdHI8UmVhZFdyaXRlTXV0ZXg+IHJ3bG9jaykgOiBMb2NrZXIocndsb2NrLCBmYWxzZSkge30KK307CisKK2NsYXNzIFdyaXRlciA6IHB1YmxpYyBMb2NrZXIgeworcHVibGljOgorICBXcml0ZXIoc2hhcmVkX3B0cjxSZWFkV3JpdGVNdXRleD4gcndsb2NrKSA6IExvY2tlcihyd2xvY2ssIHRydWUpIHt9Cit9OworCit2b2lkIHRlc3Rfc3RhcnZlKFBvc2l4VGhyZWFkRmFjdG9yeTo6UE9MSUNZIHBvbGljeSkgeworICAvLyB0aGUgbWFuIHBhZ2VzIGZvciBwdGhyZWFkX3dybG9ja19yZGxvY2sgc3VnZ2VzdCB0aGF0IGFueSBPUyBndWFyYW50ZWUgYWJvdXQKKyAgLy8gd3JpdGVyIHN0YXJ2YXRpb24gbWF5IGJlIGluZmx1ZW5jZWQgYnkgdGhlIHNjaGVkdWxpbmcgcG9saWN5LCBzbyBsZXQncyB0cnkKKyAgLy8gYWxsIDMgcG9saWNpZXMgdG8gc2VlIGlmIGFueSBvZiB0aGVtIHdvcmsuCisgIFBvc2l4VGhyZWFkRmFjdG9yeSBmYWN0b3J5KHBvbGljeSk7CisgIGZhY3Rvcnkuc2V0RGV0YWNoZWQoZmFsc2UpOworCisgIHNoYXJlZF9wdHI8UmVhZFdyaXRlTXV0ZXg+IHJ3bG9jayhuZXcgTm9TdGFydmVSZWFkV3JpdGVNdXRleCgpKTsKKworICBzaGFyZWRfcHRyPFJlYWRlcj4gcmVhZGVyMShuZXcgUmVhZGVyKHJ3bG9jaykpOworICBzaGFyZWRfcHRyPFJlYWRlcj4gcmVhZGVyMihuZXcgUmVhZGVyKHJ3bG9jaykpOworICBzaGFyZWRfcHRyPFdyaXRlcj4gd3JpdGVyKG5ldyBXcml0ZXIocndsb2NrKSk7CisKKyAgc2hhcmVkX3B0cjxUaHJlYWQ+IHRyZWFkZXIxID0gZmFjdG9yeS5uZXdUaHJlYWQocmVhZGVyMSk7CisgIHNoYXJlZF9wdHI8VGhyZWFkPiB0cmVhZGVyMiA9IGZhY3RvcnkubmV3VGhyZWFkKHJlYWRlcjIpOworICBzaGFyZWRfcHRyPFRocmVhZD4gdHdyaXRlciA9IGZhY3RvcnkubmV3VGhyZWFkKHdyaXRlcik7CisKKyAgLy8gbGF1bmNoIGEgcmVhZGVyIGFuZCBtYWtlIHN1cmUgaGUgaGFzIHRoZSBsb2NrCisgIHRyZWFkZXIxLT5zdGFydCgpOworICB3aGlsZSAoIXJlYWRlcjEtPmdvdExvY2soKSkgeworICAgIHVzbGVlcCgyMDAwKTsKKyAgfQorCisgIC8vIGxhdW5jaCBhIHdyaXRlciBhbmQgbWFrZSBzdXJlIGhlJ3MgYmxvY2tlZCBvbiB0aGUgbG9jaworICB0d3JpdGVyLT5zdGFydCgpOworICB3aGlsZSAoIXdyaXRlci0+c3RhcnRlZCgpKSB7CisgICAgdXNsZWVwKDIwMDApOworICB9CisgIC8vIHRyaWNreSBwYXJ0Li4uIHdlIGNhbiBuZXZlciBiZSAxMDAlIHN1cmUgdGhhdCB0aGUgd3JpdGVyIGlzIGFjdHVhbGx5CisgIC8vIGJsb2NrZWQgb24gdGhlIGxvY2ssIGJ1dCB3ZSBjYW4gcHJldHR5IHJlYXNvbmFibHkgc3VyZSBiZWNhdXNlIHdlIGtub3cKKyAgLy8gaGUganVzdCBleGVjdXRlZCB0aGUgbGluZSBpbW1lZGlhdGVseSBiZWZvcmUgZ2V0dGluZyB0aGUgbG9jaywgYW5kCisgIC8vIHdlJ2xsIHdhaXQgYSBmdWxsIHNlY29uZCBmb3IgaGltIHRvIGdldCBvbiBpdC4KKyAgc2xlZXAoMSk7CisKKyAgLy8gbGF1bmNoIGEgc2Vjb25kIHJlYWRlci4uLiBpZiB0aGUgUldNdXRleCBndWFyYW50ZWVzIHRoYXQgd3JpdGVycyB3b24ndAorICAvLyBzdGFydmUsIHRoaXMgcmVhZGVyIHNob3VsZCBub3QgYmUgYWJsZSB0byBhY3F1aXJlIHRoZSBsb2NrIHVudGlsIHRoZSB3cml0ZXIKKyAgLy8gaGFzIGFjcXVpcmVkIGFuZCByZWxlYXNlZCBpdC4KKyAgdHJlYWRlcjItPnN0YXJ0KCk7CisgIHdoaWxlICghcmVhZGVyMi0+c3RhcnRlZCgpKSB7CisgICAgdXNsZWVwKDIwMDApOworICB9CisgIC8vIGFnYWluLi4uIGNhbid0IGJlIDEwMCUgc3VyZSB0aGUgcmVhZGVyIGlzIHdhaXRpbmcgb24gKG9yIGhhcykgdGhlIGxvY2sKKyAgLy8gYnV0IHdlIGNhbiBiZSBjbG9zZS4KKyAgc2xlZXAoMSk7CisKKyAgLy8gdGVsbCByZWFkZXIgMSB0byBsZXQgZ28gb2YgdGhlIGxvY2sKKyAgcmVhZGVyMS0+c2lnbmFsKCk7CisKKyAgLy8gd2FpdCBmb3Igc29tZW9uZSB0byBnZXQgdGhlIGxvY2sKKyAgd2hpbGUgKCFyZWFkZXIyLT5nb3RMb2NrKCkgJiYgIXdyaXRlci0+Z290TG9jaygpKSB7CisgICAgdXNsZWVwKDIwMDApOworICB9CisKKyAgLy8gdGhlIHRlc3Qgc3VjY2VlZGVkIGlmIHRoZSBXUklURVIgZ290IHRoZSBsb2NrLgorICBib29sIHN1Y2Nlc3MgPSB3cml0ZXItPmdvdExvY2soKTsKKworICAvLyB0ZWxsIGV2ZXJ5b25lIHdlJ3JlIGRvbmUgYW5kIHdhaXQgZm9yIHRoZW0gdG8gZmluaXNoCisgIHJlYWRlcjItPnNpZ25hbCgpOworICB3cml0ZXItPnNpZ25hbCgpOworICB0cmVhZGVyMS0+am9pbigpOworICB0cmVhZGVyMi0+am9pbigpOworICB0d3JpdGVyLT5qb2luKCk7CisKKyAgLy8gbWFrZSBzdXJlIGl0IHdvcmtlZC4KKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRShzdWNjZXNzLCAid3JpdGVyIGlzIHN0YXJ2aW5nIik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURShSV011dGV4U3RhcnZlVGVzdCkKKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9zdGFydmVfb3RoZXIpIHsKKyAgdGVzdF9zdGFydmUoUG9zaXhUaHJlYWRGYWN0b3J5OjpPVEhFUik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfc3RhcnZlX3JyKSB7CisgIHRlc3Rfc3RhcnZlKFBvc2l4VGhyZWFkRmFjdG9yeTo6Uk9VTkRfUk9CSU4pOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X3N0YXJ2ZV9maWZvKSB7CisgIHRlc3Rfc3RhcnZlKFBvc2l4VGhyZWFkRmFjdG9yeTo6RklGTyk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5L1Rlc3RzLmNwcCBiL2xpYi9jcHAvdGVzdC9jb25jdXJyZW5jeS9UZXN0cy5jcHAKaW5kZXggMGQ4MWQ3ZS4uZmMwYmE3ZiAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5L1Rlc3RzLmNwcAorKysgYi9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvVGVzdHMuY3BwCkBAIC0yNSw2ICsyNSwxMCBAQAogI2luY2x1ZGUgIlRpbWVyTWFuYWdlclRlc3RzLmgiCiAjaW5jbHVkZSAiVGhyZWFkTWFuYWdlclRlc3RzLmgiCiAKKy8vIFRoZSB0ZXN0IHdlaWdodCwgd2hlcmUgMTAgaXMgMTAgdGltZXMgbW9yZSB0aHJlYWRzIHRoYW4gYmFzZWxpbmUKKy8vIGFuZCB0aGUgYmFzZWxpbmUgaXMgb3B0aW1pemVkIGZvciBydW5uaW5nIGluIHZhbGdyaW5kCitzdGF0aWMgaW50IFdFSUdIVCA9IDEwOworCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKIAogICBzdGQ6OnN0cmluZyBhcmc7CkBAIC0zNyw2ICs0MSwxMSBAQAogICAgIGFyZ3NbaXggLSAxXSA9IHN0ZDo6c3RyaW5nKGFyZ3ZbaXhdKTsKICAgfQogCisgIGlmIChnZXRlbnYoIlZBTEdSSU5EIikgIT0gMCkgeworCSAgLy8gbG93ZXIgdGhlIHNjYWxlIG9mIGV2ZXJ5IHRlc3QKKwkgIFdFSUdIVCA9IDE7CisgIH0KKwogICBib29sIHJ1bkFsbCA9IGFyZ3NbMF0uY29tcGFyZSgiYWxsIikgPT0gMDsKIAogICBpZiAocnVuQWxsIHx8IGFyZ3NbMF0uY29tcGFyZSgidGhyZWFkLWZhY3RvcnkiKSA9PSAwKSB7CkBAIC00NSwyNSArNTQsMzggQEAKIAogICAgIHN0ZDo6Y291dCA8PCAiVGhyZWFkRmFjdG9yeSB0ZXN0cy4uLiIgPDwgc3RkOjplbmRsOwogCi0gICAgc2l6ZV90IGNvdW50ID0gMTAwMDsKLSAgICBzaXplX3QgZmxvb2RMb29wcyA9IDE7Ci0gICAgc2l6ZV90IGZsb29kQ291bnQgPSAxMDAwMDA7CisgICAgaW50IHJlYXBMb29wcyA9IDIgKiBXRUlHSFQ7CisgICAgaW50IHJlYXBDb3VudCA9IDEwMCAqIFdFSUdIVDsKKyAgICBzaXplX3QgZmxvb2RMb29wcyA9IDM7CisgICAgc2l6ZV90IGZsb29kQ291bnQgPSA1MDAgKiBXRUlHSFQ7CiAKLSAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaHJlYWRGYWN0b3J5IHJlYXAgTiB0aHJlYWRzIHRlc3Q6IE4gPSAiIDw8IGNvdW50IDw8IHN0ZDo6ZW5kbDsKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaHJlYWRGYWN0b3J5IHJlYXAgTiB0aHJlYWRzIHRlc3Q6IE4gPSAiIDw8IHJlYXBMb29wcyA8PCAieCIgPDwgcmVhcENvdW50IDw8IHN0ZDo6ZW5kbDsKIAotICAgIGFzc2VydCh0aHJlYWRGYWN0b3J5VGVzdHMucmVhcE5UaHJlYWRzKGNvdW50KSk7CisgICAgaWYgKCF0aHJlYWRGYWN0b3J5VGVzdHMucmVhcE5UaHJlYWRzKHJlYXBMb29wcywgcmVhcENvdW50KSkgeworICAgICAgc3RkOjpjZXJyIDw8ICJcdFx0dFRocmVhZEZhY3RvcnkgcmVhcCBOIHRocmVhZHMgRkFJTEVEIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gMTsKKyAgICB9CiAKLSAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaHJlYWRGYWN0b3J5IGZsb29kTiB0aHJlYWRzIHRlc3Q6IE4gPSAiIDw8IGZsb29kQ291bnQgPDwgc3RkOjplbmRsOworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFRocmVhZEZhY3RvcnkgZmxvb2QgTiB0aHJlYWRzIHRlc3Q6IE4gPSAiIDw8IGZsb29kTG9vcHMgPDwgIngiIDw8IGZsb29kQ291bnQgPDwgc3RkOjplbmRsOwogCi0gICAgYXNzZXJ0KHRocmVhZEZhY3RvcnlUZXN0cy5mbG9vZE5UZXN0KGZsb29kTG9vcHMsIGZsb29kQ291bnQpKTsKKyAgICBpZiAoIXRocmVhZEZhY3RvcnlUZXN0cy5mbG9vZE5UZXN0KGZsb29kTG9vcHMsIGZsb29kQ291bnQpKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHR0VGhyZWFkRmFjdG9yeSBmbG9vZCBOIHRocmVhZHMgRkFJTEVEIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gMTsKKyAgICB9CiAKICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaHJlYWRGYWN0b3J5IHN5bmNocm9ub3VzIHN0YXJ0IHRlc3QiIDw8IHN0ZDo6ZW5kbDsKIAotICAgIGFzc2VydCh0aHJlYWRGYWN0b3J5VGVzdHMuc3luY2hTdGFydFRlc3QoKSk7CisgICAgaWYgKCF0aHJlYWRGYWN0b3J5VGVzdHMuc3luY2hTdGFydFRlc3QoKSkgeworICAgICAgc3RkOjpjZXJyIDw8ICJcdFx0dFRocmVhZEZhY3Rvcnkgc3luY2hyb25vdXMgc3RhcnQgRkFJTEVEIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gMTsKKyAgICB9CiAKICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaHJlYWRGYWN0b3J5IG1vbml0b3IgdGltZW91dCB0ZXN0IiA8PCBzdGQ6OmVuZGw7CiAKLSAgICBhc3NlcnQodGhyZWFkRmFjdG9yeVRlc3RzLm1vbml0b3JUaW1lb3V0VGVzdCgpKTsKKyAgICBpZiAoIXRocmVhZEZhY3RvcnlUZXN0cy5tb25pdG9yVGltZW91dFRlc3QoKSkgeworICAgICAgc3RkOjpjZXJyIDw8ICJcdFx0dFRocmVhZEZhY3RvcnkgbW9uaXRvciB0aW1lb3V0IEZBSUxFRCIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIDE7CisgICAgfQogICB9CiAKICAgaWYgKHJ1bkFsbCB8fCBhcmdzWzBdLmNvbXBhcmUoInV0aWwiKSA9PSAwKSB7CkBAIC05Nyw3ICsxMTksMzggQEAKIAogICAgIFRpbWVyTWFuYWdlclRlc3RzIHRpbWVyTWFuYWdlclRlc3RzOwogCi0gICAgYXNzZXJ0KHRpbWVyTWFuYWdlclRlc3RzLnRlc3QwMCgpKTsKKyAgICBpZiAoIXRpbWVyTWFuYWdlclRlc3RzLnRlc3QwMCgpKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRUaW1lck1hbmFnZXIgdGVzdHMgRkFJTEVEIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaW1lck1hbmFnZXIgdGVzdDAxIiA8PCBzdGQ6OmVuZGw7CisKKyAgICBpZiAoIXRpbWVyTWFuYWdlclRlc3RzLnRlc3QwMSgpKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRUaW1lck1hbmFnZXIgdGVzdHMgRkFJTEVEIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaW1lck1hbmFnZXIgdGVzdDAyIiA8PCBzdGQ6OmVuZGw7CisKKyAgICBpZiAoIXRpbWVyTWFuYWdlclRlc3RzLnRlc3QwMigpKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRUaW1lck1hbmFnZXIgdGVzdHMgRkFJTEVEIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaW1lck1hbmFnZXIgdGVzdDAzIiA8PCBzdGQ6OmVuZGw7CisKKyAgICBpZiAoIXRpbWVyTWFuYWdlclRlc3RzLnRlc3QwMygpKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRUaW1lck1hbmFnZXIgdGVzdHMgRkFJTEVEIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaW1lck1hbmFnZXIgdGVzdDA0IiA8PCBzdGQ6OmVuZGw7CisKKyAgICBpZiAoIXRpbWVyTWFuYWdlclRlc3RzLnRlc3QwNCgpKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRUaW1lck1hbmFnZXIgdGVzdHMgRkFJTEVEIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gMTsKKyAgICB9CiAgIH0KIAogICBpZiAocnVuQWxsIHx8IGFyZ3NbMF0uY29tcGFyZSgidGhyZWFkLW1hbmFnZXIiKSA9PSAwKSB7CkBAIC0xMDUsMjQgKzE1OCwzNCBAQAogICAgIHN0ZDo6Y291dCA8PCAiVGhyZWFkTWFuYWdlciB0ZXN0cy4uLiIgPDwgc3RkOjplbmRsOwogCiAgICAgewotCi0gICAgICBzaXplX3Qgd29ya2VyQ291bnQgPSAxMDA7Ci0KLSAgICAgIHNpemVfdCB0YXNrQ291bnQgPSAxMDAwMDA7Ci0KKyAgICAgIHNpemVfdCB3b3JrZXJDb3VudCA9IDEwICogV0VJR0hUOworICAgICAgc2l6ZV90IHRhc2tDb3VudCA9IDUwMCAqIFdFSUdIVDsKICAgICAgIGludDY0X3QgZGVsYXkgPSAxMExMOwogCisgICAgICBUaHJlYWRNYW5hZ2VyVGVzdHMgdGhyZWFkTWFuYWdlclRlc3RzOworCisgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaHJlYWRNYW5hZ2VyIGFwaSB0ZXN0OiIgPDwgc3RkOjplbmRsOworCisgICAgICBpZiAoIXRocmVhZE1hbmFnZXJUZXN0cy5hcGlUZXN0KCkpIHsKKyAgICAgICAgc3RkOjpjZXJyIDw8ICJcdFx0VGhyZWFkTWFuYWdlciBhcGlUZXN0IEZBSUxFRCIgPDwgc3RkOjplbmRsOworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKwogICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0VGhyZWFkTWFuYWdlciBsb2FkIHRlc3Q6IHdvcmtlciBjb3VudDogIiA8PCB3b3JrZXJDb3VudAogICAgICAgICAgICAgICAgIDw8ICIgdGFzayBjb3VudDogIiA8PCB0YXNrQ291bnQgPDwgIiBkZWxheTogIiA8PCBkZWxheSA8PCBzdGQ6OmVuZGw7CiAKLSAgICAgIFRocmVhZE1hbmFnZXJUZXN0cyB0aHJlYWRNYW5hZ2VyVGVzdHM7Ci0KLSAgICAgIGFzc2VydCh0aHJlYWRNYW5hZ2VyVGVzdHMubG9hZFRlc3QodGFza0NvdW50LCBkZWxheSwgd29ya2VyQ291bnQpKTsKKyAgICAgIGlmICghdGhyZWFkTWFuYWdlclRlc3RzLmxvYWRUZXN0KHRhc2tDb3VudCwgZGVsYXksIHdvcmtlckNvdW50KSkgeworICAgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRUaHJlYWRNYW5hZ2VyIGxvYWRUZXN0IEZBSUxFRCIgPDwgc3RkOjplbmRsOworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KIAogICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0VGhyZWFkTWFuYWdlciBibG9jayB0ZXN0OiB3b3JrZXIgY291bnQ6ICIgPDwgd29ya2VyQ291bnQKICAgICAgICAgICAgICAgICA8PCAiIGRlbGF5OiAiIDw8IGRlbGF5IDw8IHN0ZDo6ZW5kbDsKIAotICAgICAgYXNzZXJ0KHRocmVhZE1hbmFnZXJUZXN0cy5ibG9ja1Rlc3QoZGVsYXksIHdvcmtlckNvdW50KSk7CisgICAgICBpZiAoIXRocmVhZE1hbmFnZXJUZXN0cy5ibG9ja1Rlc3QoZGVsYXksIHdvcmtlckNvdW50KSkgeworICAgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRUaHJlYWRNYW5hZ2VyIGJsb2NrVGVzdCBGQUlMRUQiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CiAgICAgfQogICB9CiAKQEAgLTEzNCwxMyArMTk3LDEzIEBACiAKICAgICAgIHNpemVfdCBtaW5Xb3JrZXJDb3VudCA9IDI7CiAKLSAgICAgIHNpemVfdCBtYXhXb3JrZXJDb3VudCA9IDUxMjsKKyAgICAgIHNpemVfdCBtYXhXb3JrZXJDb3VudCA9IDg7CiAKLSAgICAgIHNpemVfdCB0YXNrc1BlcldvcmtlciA9IDEwMDA7CisgICAgICBzaXplX3QgdGFza3NQZXJXb3JrZXIgPSAxMDAgKiBXRUlHSFQ7CiAKLSAgICAgIGludDY0X3QgZGVsYXkgPSAxMExMOworICAgICAgaW50NjRfdCBkZWxheSA9IDVMTDsKIAotICAgICAgZm9yIChzaXplX3Qgd29ya2VyQ291bnQgPSBtaW5Xb3JrZXJDb3VudDsgd29ya2VyQ291bnQgPCBtYXhXb3JrZXJDb3VudDsgd29ya2VyQ291bnQgKj0gMikgeworICAgICAgZm9yIChzaXplX3Qgd29ya2VyQ291bnQgPSBtaW5Xb3JrZXJDb3VudDsgd29ya2VyQ291bnQgPD0gbWF4V29ya2VyQ291bnQ7IHdvcmtlckNvdW50ICo9IDQpIHsKIAogICAgICAgICBzaXplX3QgdGFza0NvdW50ID0gd29ya2VyQ291bnQgKiB0YXNrc1BlcldvcmtlcjsKIApAQCAtMTQ5LDggKzIxMiwxNSBAQAogCiAgICAgICAgIFRocmVhZE1hbmFnZXJUZXN0cyB0aHJlYWRNYW5hZ2VyVGVzdHM7CiAKLSAgICAgICAgdGhyZWFkTWFuYWdlclRlc3RzLmxvYWRUZXN0KHRhc2tDb3VudCwgZGVsYXksIHdvcmtlckNvdW50KTsKKyAgICAgICAgaWYgKCF0aHJlYWRNYW5hZ2VyVGVzdHMubG9hZFRlc3QodGFza0NvdW50LCBkZWxheSwgd29ya2VyQ291bnQpKQorICAgICAgICB7CisgICAgICAgICAgc3RkOjpjZXJyIDw8ICJcdFx0VGhyZWFkTWFuYWdlciBsb2FkVGVzdCBGQUlMRUQiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQogICAgICAgfQogICAgIH0KICAgfQorCisgIHN0ZDo6Y291dCA8PCAiQUxMIFRFU1RTIFBBU1NFRCIgPDwgc3RkOjplbmRsOworICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9jb25jdXJyZW5jeS9UaHJlYWRGYWN0b3J5VGVzdHMuaCBiL2xpYi9jcHAvdGVzdC9jb25jdXJyZW5jeS9UaHJlYWRGYWN0b3J5VGVzdHMuaAppbmRleCA2MzVjOGEyLi5iYTk4NTAyIDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvVGhyZWFkRmFjdG9yeVRlc3RzLmgKKysrIGIvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5L1RocmVhZEZhY3RvcnlUZXN0cy5oCkBAIC0yMSwxOCArMjEsMTkgQEAKICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1BsYXRmb3JtVGhyZWFkRmFjdG9yeS5oPgogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1V0aWwuaD4KIAogI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAKIG5hbWVzcGFjZSBhcGFjaGUgewogbmFtZXNwYWNlIHRocmlmdCB7CiBuYW1lc3BhY2UgY29uY3VycmVuY3kgewogbmFtZXNwYWNlIHRlc3QgewogCi11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7CiAKIC8qKgpAQCAtNDMsMzYgKzQ0LDYgQEAKIGNsYXNzIFRocmVhZEZhY3RvcnlUZXN0cyB7CiAKIHB1YmxpYzoKLSAgc3RhdGljIGNvbnN0IGRvdWJsZSBURVNUX1RPTEVSQU5DRTsKLQotICBjbGFzcyBUYXNrIDogcHVibGljIFJ1bm5hYmxlIHsKLQotICBwdWJsaWM6Ci0gICAgVGFzaygpIHt9Ci0KLSAgICB2b2lkIHJ1bigpIHsgc3RkOjpjb3V0IDw8ICJcdFx0XHRIZWxsbyBXb3JsZCIgPDwgc3RkOjplbmRsOyB9Ci0gIH07Ci0KLSAgLyoqCi0gICAqIEhlbGxvIHdvcmxkIHRlc3QKLSAgICovCi0gIGJvb2wgaGVsbG9Xb3JsZFRlc3QoKSB7Ci0KLSAgICBQbGF0Zm9ybVRocmVhZEZhY3RvcnkgdGhyZWFkRmFjdG9yeSA9IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSgpOwotCi0gICAgc2hhcmVkX3B0cjxUYXNrPiB0YXNrID0gc2hhcmVkX3B0cjxUYXNrPihuZXcgVGhyZWFkRmFjdG9yeVRlc3RzOjpUYXNrKCkpOwotCi0gICAgc2hhcmVkX3B0cjxUaHJlYWQ+IHRocmVhZCA9IHRocmVhZEZhY3RvcnkubmV3VGhyZWFkKHRhc2spOwotCi0gICAgdGhyZWFkLT5zdGFydCgpOwotCi0gICAgdGhyZWFkLT5qb2luKCk7Ci0KLSAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFN1Y2Nlc3MhIiA8PCBzdGQ6OmVuZGw7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCiAgIC8qKgogICAgKiBSZWFwIE4gdGhyZWFkcwogICAgKi8KQEAgLTgzLDM5ICs1NCwzMyBAQAogCiAgICAgdm9pZCBydW4oKSB7CiAgICAgICBTeW5jaHJvbml6ZWQgcyhfbW9uaXRvcik7Ci0KLSAgICAgIF9jb3VudC0tOwotCi0gICAgICAvLyBzdGQ6OmNvdXQgPDwgIlx0XHRcdHRocmVhZCBjb3VudDogIiA8PCBfY291bnQgPDwgc3RkOjplbmRsOwotCi0gICAgICBpZiAoX2NvdW50ID09IDApIHsKKyAgICAgIAorICAgICAgaWYgKC0tX2NvdW50ID09IDApIHsKICAgICAgICAgX21vbml0b3Iubm90aWZ5KCk7CiAgICAgICB9CiAgICAgfQogCiAgICAgTW9uaXRvciYgX21vbml0b3I7Ci0KICAgICBpbnQmIF9jb3VudDsKICAgfTsKIAogICBib29sIHJlYXBOVGhyZWFkcyhpbnQgbG9vcCA9IDEsIGludCBjb3VudCA9IDEwKSB7CiAKICAgICBQbGF0Zm9ybVRocmVhZEZhY3RvcnkgdGhyZWFkRmFjdG9yeSA9IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSgpOwotCi0gICAgTW9uaXRvciogbW9uaXRvciA9IG5ldyBNb25pdG9yKCk7CisgICAgc2hhcmVkX3B0cjxNb25pdG9yPiBtb25pdG9yKG5ldyBNb25pdG9yKTsKIAogICAgIGZvciAoaW50IGxpeCA9IDA7IGxpeCA8IGxvb3A7IGxpeCsrKSB7CiAKLSAgICAgIGludCogYWN0aXZlQ291bnQgPSBuZXcgaW50KGNvdW50KTsKKyAgICAgIGludCBhY3RpdmVDb3VudCA9IDA7CiAKLSAgICAgIHN0ZDo6c2V0PHNoYXJlZF9wdHI8VGhyZWFkPiA+IHRocmVhZHM7Ci0KKyAgICAgIHN0ZDo6dmVjdG9yPHNoYXJlZF9wdHI8VGhyZWFkPiA+IHRocmVhZHM7CiAgICAgICBpbnQgdGl4OwogCiAgICAgICBmb3IgKHRpeCA9IDA7IHRpeCA8IGNvdW50OyB0aXgrKykgewogICAgICAgICB0cnkgewotICAgICAgICAgIHRocmVhZHMuaW5zZXJ0KAotICAgICAgICAgICAgICB0aHJlYWRGYWN0b3J5Lm5ld1RocmVhZChzaGFyZWRfcHRyPFJ1bm5hYmxlPihuZXcgUmVhcE5UYXNrKCptb25pdG9yLCAqYWN0aXZlQ291bnQpKSkpOworICAgICAgICAgICsrYWN0aXZlQ291bnQ7CisgICAgICAgICAgdGhyZWFkcy5wdXNoX2JhY2soCisgICAgICAgICAgICAgIHRocmVhZEZhY3RvcnkubmV3VGhyZWFkKHNoYXJlZF9wdHI8UnVubmFibGU+KG5ldyBSZWFwTlRhc2soKm1vbml0b3IsIGFjdGl2ZUNvdW50KSkpKTsKICAgICAgICAgfSBjYXRjaCAoU3lzdGVtUmVzb3VyY2VFeGNlcHRpb24mIGUpIHsKICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdGZhaWxlZCB0byBjcmVhdGUgIiA8PCBsaXgqIGNvdW50ICsgdGl4IDw8ICIgdGhyZWFkICIgPDwgZS53aGF0KCkKICAgICAgICAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOwpAQCAtMTI0LDcgKzg5LDcgQEAKICAgICAgIH0KIAogICAgICAgdGl4ID0gMDsKLSAgICAgIGZvciAoc3RkOjpzZXQ8c2hhcmVkX3B0cjxUaHJlYWQ+ID46OmNvbnN0X2l0ZXJhdG9yIHRocmVhZCA9IHRocmVhZHMuYmVnaW4oKTsKKyAgICAgIGZvciAoc3RkOjp2ZWN0b3I8c2hhcmVkX3B0cjxUaHJlYWQ+ID46OmNvbnN0X2l0ZXJhdG9yIHRocmVhZCA9IHRocmVhZHMuYmVnaW4oKTsKICAgICAgICAgICAgdGhyZWFkICE9IHRocmVhZHMuZW5kKCk7CiAgICAgICAgICAgIHRpeCsrLCArK3RocmVhZCkgewogCkBAIC0xMzksMTYgKzEwNCwxNSBAQAogCiAgICAgICB7CiAgICAgICAgIFN5bmNocm9uaXplZCBzKCptb25pdG9yKTsKLSAgICAgICAgd2hpbGUgKCphY3RpdmVDb3VudCA+IDApIHsKKyAgICAgICAgd2hpbGUgKGFjdGl2ZUNvdW50ID4gMCkgewogICAgICAgICAgIG1vbml0b3ItPndhaXQoMTAwMCk7CiAgICAgICAgIH0KICAgICAgIH0KLSAgICAgIGRlbGV0ZSBhY3RpdmVDb3VudDsKKyAgICAgIAogICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRyZWFwZWQgIiA8PCBsaXgqIGNvdW50IDw8ICIgdGhyZWFkcyIgPDwgc3RkOjplbmRsOwogICAgIH0KIAogICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0U3VjY2VzcyEiIDw8IHN0ZDo6ZW5kbDsKLQogICAgIHJldHVybiB0cnVlOwogICB9CiAKQEAgLTI0NCwxNSArMjA4LDIyIEBACiAgICAgcmV0dXJuIHRydWU7CiAgIH0KIAotICAvKiogU2VlIGhvdyBhY2N1cmF0ZSBtb25pdG9yIHRpbWVvdXQgaXMuICovCisgIC8qKgorICAgKiBUaGUgb25seSBndWFyYW50ZWUgYSBtb25pdG9yIHRpbWVvdXQgY2FuIGdpdmUgeW91IGlzIHRoYXQKKyAgICogaXQgd2lsbCB0YWtlICJhdCBsZWFzdCIgYXMgbG9uZyBhcyB0aGUgdGltZW91dCwgbm8gbGVzcy4KKyAgICogVGhlcmUgaXMgYWJzb2x1dGVseSBubyBndWFyYW50ZWUgYXJvdW5kIHJlZ2FpbmluZyBleGVjdXRpb24KKyAgICogbmVhciB0aGUgdGltZW91dC4gIE9uIGEgYnVzeSBzeXN0ZW0gKGxpa2UgaW5zaWRlIGEgdGhpcmQgcGFydHkKKyAgICogQ0kgZW52aXJvbm1lbnQpIGl0IGNvdWxkIHRha2UgcXVpdGUgYSBiaXQgbG9uZ2VyIHRoYW4gdGhlCisgICAqIHJlcXVlc3RlZCB0aW1lb3V0LCBhbmQgdGhhdCdzIG9rLgorICAgKi8KIAotICBib29sIG1vbml0b3JUaW1lb3V0VGVzdChzaXplX3QgY291bnQgPSAxMDAwLCBpbnQ2NF90IHRpbWVvdXQgPSAxMCkgeworICBib29sIG1vbml0b3JUaW1lb3V0VGVzdChpbnQ2NF90IGNvdW50ID0gMTAwMCwgaW50NjRfdCB0aW1lb3V0ID0gMikgewogCiAgICAgTW9uaXRvciBtb25pdG9yOwogCiAgICAgaW50NjRfdCBzdGFydFRpbWUgPSBVdGlsOjpjdXJyZW50VGltZSgpOwogCi0gICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IGNvdW50OyBpeCsrKSB7CisgICAgZm9yIChpbnQ2NF90IGl4ID0gMDsgaXggPCBjb3VudDsgaXgrKykgewogICAgICAgewogICAgICAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yKTsKICAgICAgICAgdHJ5IHsKQEAgLTI2NCwxOCArMjM1LDExIEBACiAKICAgICBpbnQ2NF90IGVuZFRpbWUgPSBVdGlsOjpjdXJyZW50VGltZSgpOwogCi0gICAgZG91YmxlIGVycm9yID0gKChlbmRUaW1lIC0gc3RhcnRUaW1lKSAtIChjb3VudCAqIHRpbWVvdXQpKSAvIChkb3VibGUpKGNvdW50ICogdGltZW91dCk7Ci0KLSAgICBpZiAoZXJyb3IgPCAwLjApIHsKLQotICAgICAgZXJyb3IgKj0gMS4wOwotICAgIH0KLQotICAgIGJvb2wgc3VjY2VzcyA9IGVycm9yIDwgVGhyZWFkRmFjdG9yeVRlc3RzOjpURVNUX1RPTEVSQU5DRTsKKyAgYm9vbCBzdWNjZXNzID0gKGVuZFRpbWUgLSBzdGFydFRpbWUpID49IChjb3VudCAqIHRpbWVvdXQpOwogCiAgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHQiIDw8IChzdWNjZXNzID8gIlN1Y2Nlc3MiIDogIkZhaWx1cmUiKQotICAgICAgICAgICAgICA8PCAiISBleHBlY3RlZCB0aW1lOiAiIDw8IGNvdW50ICogdGltZW91dAotICAgICAgICAgICAgICA8PCAibXMgZWxhcHNlZCB0aW1lOiAiIDw8IGVuZFRpbWUgLSBzdGFydFRpbWUgPDwgIm1zIGVycm9yJTogIiA8PCBlcnJvciAqIDEwMC4wCisgICAgICAgICAgICAgIDw8ICI6IG1pbmltdW0gcmVxdWlyZWQgdGltZSB0byBlbGFwc2UgIiA8PCBjb3VudCAqIHRpbWVvdXQKKyAgICAgICAgICAgICAgPDwgIm1zOyBhY3R1YWwgZWxhcHNlZCB0aW1lICIgPDwgZW5kVGltZSAtIHN0YXJ0VGltZSA8PCAibXMiCiAgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKIAogICAgIHJldHVybiBzdWNjZXNzOwpAQCAtMjgzLDIxICsyNDcsMjIgQEAKIAogICBjbGFzcyBGbG9vZFRhc2sgOiBwdWJsaWMgUnVubmFibGUgewogICBwdWJsaWM6Ci0gICAgRmxvb2RUYXNrKGNvbnN0IHNpemVfdCBpZCkgOiBfaWQoaWQpIHt9CisgICAgRmxvb2RUYXNrKGNvbnN0IHNpemVfdCBpZCwgTW9uaXRvciYgbW9uKSA6IF9pZChpZCksIF9tb24obW9uKSB7fQogICAgIH5GbG9vZFRhc2soKSB7Ci0gICAgICBpZiAoX2lkICUgMTAwMCA9PSAwKSB7CisgICAgICBpZiAoX2lkICUgMTAwMDAgPT0gMCkgeworCQlTeW5jaHJvbml6ZWQgc3luYyhfbW9uKTsKICAgICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0dGhyZWFkICIgPDwgX2lkIDw8ICIgZG9uZSIgPDwgc3RkOjplbmRsOwogICAgICAgfQogICAgIH0KIAogICAgIHZvaWQgcnVuKCkgewotICAgICAgaWYgKF9pZCAlIDEwMDAgPT0gMCkgeworICAgICAgaWYgKF9pZCAlIDEwMDAwID09IDApIHsKKwkJU3luY2hyb25pemVkIHN5bmMoX21vbik7CiAgICAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdHRocmVhZCAiIDw8IF9pZCA8PCAiIHN0YXJ0ZWQiIDw8IHN0ZDo6ZW5kbDsKICAgICAgIH0KLQotICAgICAgVEhSSUZUX1NMRUVQX1VTRUMoMSk7CiAgICAgfQogICAgIGNvbnN0IHNpemVfdCBfaWQ7CisgICAgTW9uaXRvciYgX21vbjsKICAgfTsKIAogICB2b2lkIGZvbyhQbGF0Zm9ybVRocmVhZEZhY3RvcnkqIHRmKSB7ICh2b2lkKXRmOyB9CkBAIC0zMDUsNyArMjcwLDggQEAKICAgYm9vbCBmbG9vZE5UZXN0KHNpemVfdCBsb29wID0gMSwgc2l6ZV90IGNvdW50ID0gMTAwMDAwKSB7CiAKICAgICBib29sIHN1Y2Nlc3MgPSBmYWxzZTsKLQorICAgIE1vbml0b3IgbW9uOworCQogICAgIGZvciAoc2l6ZV90IGxpeCA9IDA7IGxpeCA8IGxvb3A7IGxpeCsrKSB7CiAKICAgICAgIFBsYXRmb3JtVGhyZWFkRmFjdG9yeSB0aHJlYWRGYWN0b3J5ID0gUGxhdGZvcm1UaHJlYWRGYWN0b3J5KCk7CkBAIC0zMTUsMTQgKzI4MSwxMCBAQAogCiAgICAgICAgIHRyeSB7CiAKLSAgICAgICAgICBzaGFyZWRfcHRyPEZsb29kVGFzaz4gdGFzayhuZXcgRmxvb2RUYXNrKGxpeCAqIGNvdW50ICsgdGl4KSk7Ci0KKyAgICAgICAgICBzaGFyZWRfcHRyPEZsb29kVGFzaz4gdGFzayhuZXcgRmxvb2RUYXNrKGxpeCAqIGNvdW50ICsgdGl4LCBtb24pKTsKICAgICAgICAgICBzaGFyZWRfcHRyPFRocmVhZD4gdGhyZWFkID0gdGhyZWFkRmFjdG9yeS5uZXdUaHJlYWQodGFzayk7Ci0KICAgICAgICAgICB0aHJlYWQtPnN0YXJ0KCk7CiAKLSAgICAgICAgICBUSFJJRlRfU0xFRVBfVVNFQygxKTsKLQogICAgICAgICB9IGNhdGNoIChURXhjZXB0aW9uJiBlKSB7CiAKICAgICAgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdGZhaWxlZCB0byBzdGFydCAgIiA8PCBsaXgqIGNvdW50ICsgdGl4IDw8ICIgdGhyZWFkICIgPDwgZS53aGF0KCkKQEAgLTMzMiw4ICsyOTQsOCBAQAogICAgICAgICB9CiAgICAgICB9CiAKKyAgICAgIFN5bmNocm9uaXplZCBzeW5jKG1vbik7CiAgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdGZsb29kZWQgIiA8PCAobGl4ICsgMSkgKiBjb3VudCA8PCAiIHRocmVhZHMiIDw8IHN0ZDo6ZW5kbDsKLQogICAgICAgc3VjY2VzcyA9IHRydWU7CiAgICAgfQogCkBAIC0zNDEsNyArMzAzLDYgQEAKICAgfQogfTsKIAotY29uc3QgZG91YmxlIFRocmVhZEZhY3RvcnlUZXN0czo6VEVTVF9UT0xFUkFOQ0UgPSAuMjA7CiB9CiB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlclRlc3RzLmggYi9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlclRlc3RzLmgKaW5kZXggMDhlODE3OS4uZDZjMDkyZCAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXJUZXN0cy5oCisrKyBiL2xpYi9jcHAvdGVzdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyVGVzdHMuaApAQCAtMjQsOSArMjQsOSBAQAogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9VdGlsLmg+CiAKICNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxkZXF1ZT4KICNpbmNsdWRlIDxzZXQ+CiAjaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8c2V0PgogI2luY2x1ZGUgPHN0ZGludC5oPgogCiBuYW1lc3BhY2UgYXBhY2hlIHsKQEAgLTM2LDMyICszNiwzOSBAQAogCiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OwogCi1jbGFzcyBUaHJlYWRNYW5hZ2VyVGVzdHMgeworc3RhdGljIHN0ZDo6ZGVxdWU8c3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiA+IG1fZXhwaXJlZDsKK3N0YXRpYyB2b2lkIGV4cGlyZWROb3RpZmllcihzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKQoreworICBtX2V4cGlyZWQucHVzaF9iYWNrKHJ1bm5hYmxlKTsKK30KIAotICBzdGF0aWMgY29uc3QgZG91YmxlIFRFU1RfVE9MRVJBTkNFOworc3RhdGljIHZvaWQgc2xlZXBfKGludDY0X3QgbWlsbGlzZWMpIHsKKyAgTW9uaXRvciBfc2xlZXA7CisgIFN5bmNocm9uaXplZCBzKF9zbGVlcCk7CisKKyAgdHJ5IHsKKyAgICBfc2xlZXAud2FpdChtaWxsaXNlYyk7CisgIH0gY2F0Y2ggKFRpbWVkT3V0RXhjZXB0aW9uJikgeworICAgIDsKKyAgfSBjYXRjaCAoLi4uKSB7CisgICAgYXNzZXJ0KDApOworICB9Cit9CisKK2NsYXNzIFRocmVhZE1hbmFnZXJUZXN0cyB7CiAKIHB1YmxpYzoKICAgY2xhc3MgVGFzayA6IHB1YmxpYyBSdW5uYWJsZSB7CiAKICAgcHVibGljOgogICAgIFRhc2soTW9uaXRvciYgbW9uaXRvciwgc2l6ZV90JiBjb3VudCwgaW50NjRfdCB0aW1lb3V0KQotICAgICAgOiBfbW9uaXRvcihtb25pdG9yKSwgX2NvdW50KGNvdW50KSwgX3RpbWVvdXQodGltZW91dCksIF9kb25lKGZhbHNlKSB7fQorICAgICAgOiBfbW9uaXRvcihtb25pdG9yKSwgX2NvdW50KGNvdW50KSwgX3RpbWVvdXQodGltZW91dCksIF9zdGFydFRpbWUoMCksIF9lbmRUaW1lKDApLCBfZG9uZShmYWxzZSkge30KIAogICAgIHZvaWQgcnVuKCkgewogCiAgICAgICBfc3RhcnRUaW1lID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKIAotICAgICAgewotICAgICAgICBTeW5jaHJvbml6ZWQgcyhfc2xlZXApOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgX3NsZWVwLndhaXQoX3RpbWVvdXQpOwotICAgICAgICB9IGNhdGNoIChUaW1lZE91dEV4Y2VwdGlvbiYpIHsKLSAgICAgICAgICA7Ci0gICAgICAgIH0gY2F0Y2ggKC4uLikgewotICAgICAgICAgIGFzc2VydCgwKTsKLSAgICAgICAgfQotICAgICAgfQorICAgICAgc2xlZXBfKF90aW1lb3V0KTsKIAogICAgICAgX2VuZFRpbWUgPSBVdGlsOjpjdXJyZW50VGltZSgpOwogCkBAIC03Myw5ICs4MCw3IEBACiAgICAgICAgIC8vIHN0ZDo6Y291dCA8PCAiVGhyZWFkICIgPDwgX2NvdW50IDw8ICIgY29tcGxldGVkICIgPDwgc3RkOjplbmRsOwogCiAgICAgICAgIF9jb3VudC0tOwotCi0gICAgICAgIGlmIChfY291bnQgPT0gMCkgewotCisgICAgICAgIGlmIChfY291bnQgJSAxMDAwMCA9PSAwKSB7CiAgICAgICAgICAgX21vbml0b3Iubm90aWZ5KCk7CiAgICAgICAgIH0KICAgICAgIH0KQEAgLTEwNCw5ICsxMDksOSBAQAogICAgIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlciA9IFRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIod29ya2VyQ291bnQpOwogCiAgICAgc2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkKLSAgICAgICAgPSBzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4obmV3IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSgpKTsKKyAgICAgICAgPSBzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4obmV3IFBsYXRmb3JtVGhyZWFkRmFjdG9yeShmYWxzZSkpOwogCi0jaWYgIVVTRV9CT09TVF9USFJFQUQgJiYgIVVTRV9TVERfVEhSRUFECisjaWYgIVVTRV9TVERfVEhSRUFECiAgICAgdGhyZWFkRmFjdG9yeS0+c2V0UHJpb3JpdHkoUG9zaXhUaHJlYWRGYWN0b3J5OjpISUdIRVNUKTsKICNlbmRpZgogICAgIHRocmVhZE1hbmFnZXItPnRocmVhZEZhY3RvcnkodGhyZWFkRmFjdG9yeSk7CkBAIC0xMzAsMTEgKzEzNSwxMyBAQAogICAgICAgdGhyZWFkTWFuYWdlci0+YWRkKCppeCk7CiAgICAgfQogCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdGxvYWRlZCAiIDw8IGNvdW50IDw8ICIgdGFza3MgdG8gZXhlY3V0ZSIgPDwgc3RkOjplbmRsOworCiAgICAgewogICAgICAgU3luY2hyb25pemVkIHMobW9uaXRvcik7CiAKICAgICAgIHdoaWxlIChhY3RpdmVDb3VudCA+IDApIHsKLQorICAgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0YWN0aXZlQ291bnQgPSAiIDw8IGFjdGl2ZUNvdW50IDw8IHN0ZDo6ZW5kbDsKICAgICAgICAgbW9uaXRvci53YWl0KCk7CiAgICAgICB9CiAgICAgfQpAQCAtMTc5LDIzICsxODYsMTUgQEAKIAogICAgIGF2ZXJhZ2VUaW1lIC89IGNvdW50OwogCi0gICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRmaXJzdCBzdGFydDogIiA8PCBmaXJzdFRpbWUgPDwgIm1zIExhc3QgZW5kOiAiIDw8IGxhc3RUaW1lCi0gICAgICAgICAgICAgIDw8ICJtcyBtaW46ICIgPDwgbWluVGltZSA8PCAibXMgbWF4OiAiIDw8IG1heFRpbWUgPDwgIm1zIGF2ZXJhZ2U6ICIgPDwgYXZlcmFnZVRpbWUKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdGZpcnN0IHN0YXJ0OiAiIDw8IGZpcnN0VGltZSA8PCAiIExhc3QgZW5kOiAiIDw8IGxhc3RUaW1lCisgICAgICAgICAgICAgIDw8ICIgbWluOiAiIDw8IG1pblRpbWUgPDwgIm1zIG1heDogIiA8PCBtYXhUaW1lIDw8ICJtcyBhdmVyYWdlOiAiIDw8IGF2ZXJhZ2VUaW1lCiAgICAgICAgICAgICAgIDw8ICJtcyIgPDwgc3RkOjplbmRsOwogCi0gICAgZG91YmxlIGV4cGVjdGVkVGltZSA9IChkb3VibGUoY291bnQgKyAod29ya2VyQ291bnQgLSAxKSkgLyB3b3JrZXJDb3VudCkgKiB0aW1lb3V0OwotCi0gICAgZG91YmxlIGVycm9yID0gKCh0aW1lMDEgLSB0aW1lMDApIC0gZXhwZWN0ZWRUaW1lKSAvIGV4cGVjdGVkVGltZTsKLQotICAgIGlmIChlcnJvciA8IDApIHsKLSAgICAgIGVycm9yICo9IC0xLjA7Ci0gICAgfQotCi0gICAgYm9vbCBzdWNjZXNzID0gZXJyb3IgPCBURVNUX1RPTEVSQU5DRTsKKyAgICBib29sIHN1Y2Nlc3MgPSAodGltZTAxIC0gdGltZTAwKSA+PSAoKGludDY0X3QpY291bnQgKiB0aW1lb3V0KSAvIChpbnQ2NF90KXdvcmtlckNvdW50OwogCiAgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHQiIDw8IChzdWNjZXNzID8gIlN1Y2Nlc3MiIDogIkZhaWx1cmUiKQotICAgICAgICAgICAgICA8PCAiISBleHBlY3RlZCB0aW1lOiAiIDw8IGV4cGVjdGVkVGltZSA8PCAibXMgZWxhcHNlZCB0aW1lOiAiIDw8IHRpbWUwMSAtIHRpbWUwMAotICAgICAgICAgICAgICA8PCAibXMgZXJyb3IlOiAiIDw8IGVycm9yICogMTAwLjAgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICA8PCAiISBleHBlY3RlZCB0aW1lOiAiIDw8ICgoaW50NjRfdCljb3VudCAqIHRpbWVvdXQpIC8gKGludDY0X3Qpd29ya2VyQ291bnQgPDwgIm1zIGVsYXBzZWQgdGltZTogIiA8PCB0aW1lMDEgLSB0aW1lMDAKKyAgICAgICAgICAgICAgPDwgIm1zIiA8PCBzdGQ6OmVuZGw7CiAKICAgICByZXR1cm4gc3VjY2VzczsKICAgfQpAQCAtMjAzLDMwICsyMDIsMzYgQEAKICAgY2xhc3MgQmxvY2tUYXNrIDogcHVibGljIFJ1bm5hYmxlIHsKIAogICBwdWJsaWM6Ci0gICAgQmxvY2tUYXNrKE1vbml0b3ImIG1vbml0b3IsIE1vbml0b3ImIGJtb25pdG9yLCBzaXplX3QmIGNvdW50KQotICAgICAgOiBfbW9uaXRvcihtb25pdG9yKSwgX2Jtb25pdG9yKGJtb25pdG9yKSwgX2NvdW50KGNvdW50KSB7fQorICAgIEJsb2NrVGFzayhNb25pdG9yJiBlbnRyeU1vbml0b3IsIE1vbml0b3ImIGJsb2NrTW9uaXRvciwgYm9vbCYgYmxvY2tlZCwgTW9uaXRvciYgZG9uZU1vbml0b3IsIHNpemVfdCYgY291bnQpCisgICAgICA6IF9lbnRyeU1vbml0b3IoZW50cnlNb25pdG9yKSwgX2VudGVyZWQoZmFsc2UpLCBfYmxvY2tNb25pdG9yKGJsb2NrTW9uaXRvciksIF9ibG9ja2VkKGJsb2NrZWQpLCBfZG9uZU1vbml0b3IoZG9uZU1vbml0b3IpLCBfY291bnQoY291bnQpIHt9CiAKICAgICB2b2lkIHJ1bigpIHsKICAgICAgIHsKLSAgICAgICAgU3luY2hyb25pemVkIHMoX2Jtb25pdG9yKTsKLQotICAgICAgICBfYm1vbml0b3Iud2FpdCgpOworICAgICAgICBTeW5jaHJvbml6ZWQgcyhfZW50cnlNb25pdG9yKTsKKyAgICAgICAgX2VudGVyZWQgPSB0cnVlOworICAgICAgICBfZW50cnlNb25pdG9yLm5vdGlmeSgpOwogICAgICAgfQogCiAgICAgICB7Ci0gICAgICAgIFN5bmNocm9uaXplZCBzKF9tb25pdG9yKTsKKyAgICAgICAgU3luY2hyb25pemVkIHMoX2Jsb2NrTW9uaXRvcik7CisgICAgICAgIHdoaWxlIChfYmxvY2tlZCkgeworICAgICAgICAgIF9ibG9ja01vbml0b3Iud2FpdCgpOworICAgICAgICB9CisgICAgICB9CiAKLSAgICAgICAgX2NvdW50LS07Ci0KLSAgICAgICAgaWYgKF9jb3VudCA9PSAwKSB7Ci0KLSAgICAgICAgICBfbW9uaXRvci5ub3RpZnkoKTsKKyAgICAgIHsKKyAgICAgICAgU3luY2hyb25pemVkIHMoX2RvbmVNb25pdG9yKTsKKyAgICAgICAgaWYgKC0tX2NvdW50ID09IDApIHsKKyAgICAgICAgICBfZG9uZU1vbml0b3Iubm90aWZ5KCk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAKLSAgICBNb25pdG9yJiBfbW9uaXRvcjsKLSAgICBNb25pdG9yJiBfYm1vbml0b3I7CisgICAgTW9uaXRvciYgX2VudHJ5TW9uaXRvcjsKKyAgICBib29sIF9lbnRlcmVkOworICAgIE1vbml0b3ImIF9ibG9ja01vbml0b3I7CisgICAgYm9vbCYgX2Jsb2NrZWQ7CisgICAgTW9uaXRvciYgX2RvbmVNb25pdG9yOwogICAgIHNpemVfdCYgX2NvdW50OwogICB9OwogCkBAIC0yNDAsOCArMjQ1LDEwIEBACiAKICAgICB0cnkgewogCi0gICAgICBNb25pdG9yIGJtb25pdG9yOwotICAgICAgTW9uaXRvciBtb25pdG9yOworICAgICAgTW9uaXRvciBlbnRyeU1vbml0b3I7ICAgLy8gbm90IHVzZWQgYnkgdGhpcyB0ZXN0CisgICAgICBNb25pdG9yIGJsb2NrTW9uaXRvcjsKKyAgICAgIGJvb2wgYmxvY2tlZFtdID0ge3RydWUsIHRydWUsIHRydWV9OworICAgICAgTW9uaXRvciBkb25lTW9uaXRvcjsKIAogICAgICAgc2l6ZV90IHBlbmRpbmdUYXNrTWF4Q291bnQgPSB3b3JrZXJDb3VudDsKIApAQCAtMjUzLDI4ICsyNjAsMjkgQEAKICAgICAgIHNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5CiAgICAgICAgICAgPSBzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4obmV3IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSgpKTsKIAotI2lmICFVU0VfQk9PU1RfVEhSRUFEICYmICFVU0VfU1REX1RIUkVBRAorI2lmICFVU0VfU1REX1RIUkVBRAogICAgICAgdGhyZWFkRmFjdG9yeS0+c2V0UHJpb3JpdHkoUG9zaXhUaHJlYWRGYWN0b3J5OjpISUdIRVNUKTsKICNlbmRpZgogICAgICAgdGhyZWFkTWFuYWdlci0+dGhyZWFkRmFjdG9yeSh0aHJlYWRGYWN0b3J5KTsKIAogICAgICAgdGhyZWFkTWFuYWdlci0+c3RhcnQoKTsKIAotICAgICAgc3RkOjpzZXQ8c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyVGVzdHM6OkJsb2NrVGFzaz4gPiB0YXNrczsKKyAgICAgIHN0ZDo6dmVjdG9yPHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlclRlc3RzOjpCbG9ja1Rhc2s+ID4gdGFza3M7CisgICAgICB0YXNrcy5yZXNlcnZlKHdvcmtlckNvdW50ICsgcGVuZGluZ1Rhc2tNYXhDb3VudCk7CiAKICAgICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCB3b3JrZXJDb3VudDsgaXgrKykgewogCi0gICAgICAgIHRhc2tzLmluc2VydChzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXJUZXN0czo6QmxvY2tUYXNrPigKLSAgICAgICAgICAgIG5ldyBUaHJlYWRNYW5hZ2VyVGVzdHM6OkJsb2NrVGFzayhtb25pdG9yLCBibW9uaXRvciwgYWN0aXZlQ291bnRzWzBdKSkpOworICAgICAgICB0YXNrcy5wdXNoX2JhY2soc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyVGVzdHM6OkJsb2NrVGFzaz4oCisgICAgICAgICAgICBuZXcgVGhyZWFkTWFuYWdlclRlc3RzOjpCbG9ja1Rhc2soZW50cnlNb25pdG9yLCBibG9ja01vbml0b3IsIGJsb2NrZWRbMF0sIGRvbmVNb25pdG9yLCBhY3RpdmVDb3VudHNbMF0pKSk7CiAgICAgICB9CiAKICAgICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBwZW5kaW5nVGFza01heENvdW50OyBpeCsrKSB7CiAKLSAgICAgICAgdGFza3MuaW5zZXJ0KHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlclRlc3RzOjpCbG9ja1Rhc2s+KAotICAgICAgICAgICAgbmV3IFRocmVhZE1hbmFnZXJUZXN0czo6QmxvY2tUYXNrKG1vbml0b3IsIGJtb25pdG9yLCBhY3RpdmVDb3VudHNbMV0pKSk7CisgICAgICAgIHRhc2tzLnB1c2hfYmFjayhzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXJUZXN0czo6QmxvY2tUYXNrPigKKyAgICAgICAgICAgIG5ldyBUaHJlYWRNYW5hZ2VyVGVzdHM6OkJsb2NrVGFzayhlbnRyeU1vbml0b3IsIGJsb2NrTW9uaXRvciwgYmxvY2tlZFsxXSwgZG9uZU1vbml0b3IsIGFjdGl2ZUNvdW50c1sxXSkpKTsKICAgICAgIH0KIAotICAgICAgZm9yIChzdGQ6OnNldDxzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXJUZXN0czo6QmxvY2tUYXNrPiA+OjppdGVyYXRvciBpeCA9IHRhc2tzLmJlZ2luKCk7CisgICAgICBmb3IgKHN0ZDo6dmVjdG9yPHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlclRlc3RzOjpCbG9ja1Rhc2s+ID46Oml0ZXJhdG9yIGl4ID0gdGFza3MuYmVnaW4oKTsKICAgICAgICAgICAgaXggIT0gdGFza3MuZW5kKCk7CiAgICAgICAgICAgIGl4KyspIHsKICAgICAgICAgdGhyZWFkTWFuYWdlci0+YWRkKCppeCk7CkBAIC0yODUsNyArMjkzLDcgQEAKICAgICAgIH0KIAogICAgICAgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyVGVzdHM6OkJsb2NrVGFzaz4gZXh0cmFUYXNrKAotICAgICAgICAgIG5ldyBUaHJlYWRNYW5hZ2VyVGVzdHM6OkJsb2NrVGFzayhtb25pdG9yLCBibW9uaXRvciwgYWN0aXZlQ291bnRzWzJdKSk7CisgICAgICAgICAgbmV3IFRocmVhZE1hbmFnZXJUZXN0czo6QmxvY2tUYXNrKGVudHJ5TW9uaXRvciwgYmxvY2tNb25pdG9yLCBibG9ja2VkWzJdLCBkb25lTW9uaXRvciwgYWN0aXZlQ291bnRzWzJdKSk7CiAKICAgICAgIHRyeSB7CiAgICAgICAgIHRocmVhZE1hbmFnZXItPmFkZChleHRyYVRhc2ssIDEpOwpAQCAtMzA5LDE2ICszMTcsMTUgQEAKICAgICAgICAgICAgICAgICA8PCAiUGVuZGluZyB0YXNrcyAiIDw8IHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSA8PCBzdGQ6OmVuZGw7CiAKICAgICAgIHsKLSAgICAgICAgU3luY2hyb25pemVkIHMoYm1vbml0b3IpOwotCi0gICAgICAgIGJtb25pdG9yLm5vdGlmeUFsbCgpOworICAgICAgICBTeW5jaHJvbml6ZWQgcyhibG9ja01vbml0b3IpOworICAgICAgICBibG9ja2VkWzBdID0gZmFsc2U7CisgICAgICAgIGJsb2NrTW9uaXRvci5ub3RpZnlBbGwoKTsKICAgICAgIH0KIAogICAgICAgewotICAgICAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yKTsKLQorICAgICAgICBTeW5jaHJvbml6ZWQgcyhkb25lTW9uaXRvcik7CiAgICAgICAgIHdoaWxlIChhY3RpdmVDb3VudHNbMF0gIT0gMCkgewotICAgICAgICAgIG1vbml0b3Iud2FpdCgpOworICAgICAgICAgIGRvbmVNb25pdG9yLndhaXQoKTsKICAgICAgICAgfQogICAgICAgfQogCkBAIC0zNDEsMzcgKzM0OCwzNyBAQAogICAgICAgLy8gV2FrZSB1cCB0YXNrcyB0aGF0IHdlcmUgcGVuZGluZyBiZWZvcmUgYW5kIHdhaXQgZm9yIHRoZW0gdG8gY29tcGxldGUKIAogICAgICAgewotICAgICAgICBTeW5jaHJvbml6ZWQgcyhibW9uaXRvcik7Ci0KLSAgICAgICAgYm1vbml0b3Iubm90aWZ5QWxsKCk7CisgICAgICAgIFN5bmNocm9uaXplZCBzKGJsb2NrTW9uaXRvcik7CisgICAgICAgIGJsb2NrZWRbMV0gPSBmYWxzZTsKKyAgICAgICAgYmxvY2tNb25pdG9yLm5vdGlmeUFsbCgpOwogICAgICAgfQogCiAgICAgICB7Ci0gICAgICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3IpOwotCisgICAgICAgIFN5bmNocm9uaXplZCBzKGRvbmVNb25pdG9yKTsKICAgICAgICAgd2hpbGUgKGFjdGl2ZUNvdW50c1sxXSAhPSAwKSB7Ci0gICAgICAgICAgbW9uaXRvci53YWl0KCk7CisgICAgICAgICAgZG9uZU1vbml0b3Iud2FpdCgpOwogICAgICAgICB9CiAgICAgICB9CiAKICAgICAgIC8vIFdha2UgdXAgdGhlIGV4dHJhIHRhc2sgYW5kIHdhaXQgZm9yIGl0IHRvIGNvbXBsZXRlCiAKICAgICAgIHsKLSAgICAgICAgU3luY2hyb25pemVkIHMoYm1vbml0b3IpOwotCi0gICAgICAgIGJtb25pdG9yLm5vdGlmeUFsbCgpOworICAgICAgICBTeW5jaHJvbml6ZWQgcyhibG9ja01vbml0b3IpOworICAgICAgICBibG9ja2VkWzJdID0gZmFsc2U7CisgICAgICAgIGJsb2NrTW9uaXRvci5ub3RpZnlBbGwoKTsKICAgICAgIH0KIAogICAgICAgewotICAgICAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yKTsKLQorICAgICAgICBTeW5jaHJvbml6ZWQgcyhkb25lTW9uaXRvcik7CiAgICAgICAgIHdoaWxlIChhY3RpdmVDb3VudHNbMl0gIT0gMCkgewotICAgICAgICAgIG1vbml0b3Iud2FpdCgpOworICAgICAgICAgIGRvbmVNb25pdG9yLndhaXQoKTsKICAgICAgICAgfQogICAgICAgfQogCisgICAgICB0aHJlYWRNYW5hZ2VyLT5zdG9wKCk7CisKICAgICAgIGlmICghKHN1Y2Nlc3MgPSAodGhyZWFkTWFuYWdlci0+dG90YWxUYXNrQ291bnQoKSA9PSAwKSkpIHsKLSAgICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiVW5leHBlY3RlZCBwZW5kaW5nIHRhc2sgY291bnQiKTsKKyAgICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiVW5leHBlY3RlZCB0b3RhbCB0YXNrIGNvdW50Iik7CiAgICAgICB9CiAKICAgICB9IGNhdGNoIChURXhjZXB0aW9uJiBlKSB7CkBAIC0zODEsOSArMzg4LDI5NSBAQAogICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0IiA8PCAoc3VjY2VzcyA/ICJTdWNjZXNzIiA6ICJGYWlsdXJlIikgPDwgc3RkOjplbmRsOwogICAgIHJldHVybiBzdWNjZXNzOwogICB9CisKKworICBib29sIGFwaVRlc3QoKSB7CisKKyAgICAvLyBwcm92ZSBjdXJyZW50VGltZSBoYXMgbWlsbGlzZWNvbmRzIGdyYW51bGFyaXR5IHNpbmNlIG1hbnkgb3RoZXIgdGhpbmdzIGRlcGVuZCBvbiBpdAorICAgIGludDY0X3QgYSA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CisgICAgc2xlZXBfKDEwMCk7CisgICAgaW50NjRfdCBiID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKKyAgICBpZiAoYiAtIGEgPCA1MCB8fCBiIC0gYSA+IDE1MCkgeworICAgICAgc3RkOjpjZXJyIDw8ICJcdFx0XHRleHBlY3RlZCAxMDBtcyBnYXAsIGZvdW5kICIgPDwgKGItYSkgPDwgIm1zIGdhcCBpbnN0ZWFkLiIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworI2lmICFVU0VfU1REX1RIUkVBRAorICAgIC8vIHRlc3Qgb25jZSB3aXRoIGEgZGV0YWNoZWQgdGhyZWFkIGZhY3RvcnkgYW5kIG9uY2Ugd2l0aCBhIGpvaW5hYmxlIHRocmVhZCBmYWN0b3J5CisKKyAgICBzaGFyZWRfcHRyPFBvc2l4VGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeQorICAgICAgICA9IHNoYXJlZF9wdHI8UG9zaXhUaHJlYWRGYWN0b3J5PihuZXcgUG9zaXhUaHJlYWRGYWN0b3J5KGZhbHNlKSk7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdGFwaVRlc3Qgd2l0aCBqb2luYWJsZSB0aHJlYWQgZmFjdG9yeSIgPDwgc3RkOjplbmRsOworICAgIGlmICghYXBpVGVzdFdpdGhUaHJlYWRGYWN0b3J5KHRocmVhZEZhY3RvcnkpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdGhyZWFkRmFjdG9yeS5yZXNldChuZXcgUG9zaXhUaHJlYWRGYWN0b3J5KHRydWUpKTsKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdGFwaVRlc3Qgd2l0aCBkZXRhY2hlZCB0aHJlYWQgZmFjdG9yeSIgPDwgc3RkOjplbmRsOworICAgIHJldHVybiBhcGlUZXN0V2l0aFRocmVhZEZhY3RvcnkodGhyZWFkRmFjdG9yeSk7CisjZWxzZQorICAgIHJldHVybiBhcGlUZXN0V2l0aFRocmVhZEZhY3Rvcnkoc2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+KG5ldyBQbGF0Zm9ybVRocmVhZEZhY3RvcnkoKSkpOworI2VuZGlmCisKKyAgfQorCisgIGJvb2wgYXBpVGVzdFdpdGhUaHJlYWRGYWN0b3J5KHNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5KQorICB7CisgICAgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyID0gVGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcigxKTsKKyAgICB0aHJlYWRNYW5hZ2VyLT50aHJlYWRGYWN0b3J5KHRocmVhZEZhY3RvcnkpOworCisjaWYgIVVTRV9TVERfVEhSRUFECisgICAgdGhyZWFkRmFjdG9yeS0+c2V0UHJpb3JpdHkoUG9zaXhUaHJlYWRGYWN0b3J5OjpISUdIRVNUKTsKKworICAgIC8vIHZlcmlmeSB3ZSBjYW5ub3QgY2hhbmdlIHRoZSB0aHJlYWQgZmFjdG9yeSB0byBvbmUgd2l0aCB0aGUgb3Bwb3NpdGUgZGV0YWNoZWQgc2V0dGluZworICAgIHNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5MgorICAgICAgICA9IHNoYXJlZF9wdHI8UG9zaXhUaHJlYWRGYWN0b3J5PihuZXcgUGxhdGZvcm1UaHJlYWRGYWN0b3J5KAorICAgICAgICAgIFBvc2l4VGhyZWFkRmFjdG9yeTo6Uk9VTkRfUk9CSU4sCisgICAgICAgICAgUG9zaXhUaHJlYWRGYWN0b3J5OjpOT1JNQUwsCisgICAgICAgICAgMSwKKyAgICAgICAgICAhdGhyZWFkRmFjdG9yeS0+aXNEZXRhY2hlZCgpKSk7CisgICAgdHJ5IHsKKyAgICAgIHRocmVhZE1hbmFnZXItPnRocmVhZEZhY3RvcnkodGhyZWFkRmFjdG9yeTIpOworICAgICAgLy8gaWYgdGhlIGNhbGwgc3VjY2VlZGVkIHdlIGNoYW5nZWQgdGhlIHRocmVhZCBmYWN0b3J5IHRvIG9uZSB0aGF0IGhhZCB0aGUgb3Bwb3NpdGUgc2V0dGluZyBmb3IgImlzRGV0YWNoZWQoKSIuCisgICAgICAvLyB0aGlzIGlzIGJhZCwgYmVjYXVzZSB0aGUgdGhyZWFkIG1hbmFnZXIgY2hlY2tzIHdpdGggdGhlIHRocmVhZCBmYWN0b3J5IHRvIHNlZSBpZiBpdCBzaG91bGQgam9pbiB0aHJlYWRzCisgICAgICAvLyBhcyB0aGV5IGFyZSBsZWF2aW5nIC0gc28gdGhlIGRldGFjaGVkIHN0YXR1cyBvZiBuZXcgdGhyZWFkcyBjYW5ub3QgY2hhbmdlIHdoaWxlIHRoZXJlIGFyZSBleGlzdGluZyB0aHJlYWRzLgorICAgICAgc3RkOjpjZXJyIDw8ICJcdFx0XHRTaG91bGQgbm90IGJlIGFibGUgdG8gY2hhbmdlIHRocmVhZCBmYWN0b3J5IGRldGFjaGVkIGRpc3Bvc2l0aW9uIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGNhdGNoIChJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24mIGV4KSB7CisgICAgICAvKiBleHBlY3RlZCAqLworICAgIH0KKyNlbmRpZgorCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdHN0YXJ0aW5nLi4gIiA8PCBzdGQ6OmVuZGw7CisKKyAgICB0aHJlYWRNYW5hZ2VyLT5zdGFydCgpOworICAgIHRocmVhZE1hbmFnZXItPnNldEV4cGlyZUNhbGxiYWNrKGV4cGlyZWROb3RpZmllcik7IC8vIHN0ZDo6YmluZCgmVGhyZWFkTWFuYWdlclRlc3RzOjpleHBpcmVkTm90aWZpZXIsIHRoaXMpKTsKKworI2RlZmluZSBFWFBFQ1QoRlVOQywgQ09VTlQpIHsgc2l6ZV90IGMgPSBGVU5DOyBpZiAoYyAhPSBDT1VOVCkgeyBzdGQ6OmNlcnIgPDwgImV4cGVjdGVkICIgI0ZVTkMiIHRvIGJlICIgI0NPVU5UICIsIGJ1dCB3YXMgIiA8PCBjIDw8IHN0ZDo6ZW5kbDsgcmV0dXJuIGZhbHNlOyB9IH0KKworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT53b3JrZXJDb3VudCgpLCAxKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+aWRsZVdvcmtlckNvdW50KCksIDEpOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5wZW5kaW5nVGFza0NvdW50KCksIDApOworCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdGFkZCAybmQgd29ya2VyLi4gIiA8PCBzdGQ6OmVuZGw7CisKKyAgICB0aHJlYWRNYW5hZ2VyLT5hZGRXb3JrZXIoKTsKKworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT53b3JrZXJDb3VudCgpLCAyKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+aWRsZVdvcmtlckNvdW50KCksIDIpOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5wZW5kaW5nVGFza0NvdW50KCksIDApOworCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdHJlbW92ZSAybmQgd29ya2VyLi4gIiA8PCBzdGQ6OmVuZGw7CisKKyAgICB0aHJlYWRNYW5hZ2VyLT5yZW1vdmVXb3JrZXIoKTsKKworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT53b3JrZXJDb3VudCgpLCAxKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+aWRsZVdvcmtlckNvdW50KCksIDEpOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5wZW5kaW5nVGFza0NvdW50KCksIDApOworCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdHJlbW92ZSAxc3Qgd29ya2VyLi4gIiA8PCBzdGQ6OmVuZGw7CisKKyAgICB0aHJlYWRNYW5hZ2VyLT5yZW1vdmVXb3JrZXIoKTsKKworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT53b3JrZXJDb3VudCgpLCAwKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+aWRsZVdvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5wZW5kaW5nVGFza0NvdW50KCksIDApOworCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdGFkZCBibG9ja2luZyB0YXNrLi4gIiA8PCBzdGQ6OmVuZGw7CisKKyAgICAvLyBXZSdyZSBnb2luZyB0byB0aHJvdyBhIGJsb2NraW5nIHRhc2sgaW50byB0aGUgbWl4CisgICAgTW9uaXRvciBlbnRyeU1vbml0b3I7ICAgLy8gc2lnbmFsZWQgd2hlbiB0YXNrIGlzIHJ1bm5pbmcKKyAgICBNb25pdG9yIGJsb2NrTW9uaXRvcjsgICAvLyB0byBiZSBzaWduYWxlZCB0byB1bmJsb2NrIHRoZSB0YXNrCisgICAgYm9vbCBibG9ja2VkKHRydWUpOyAgICAgLy8gc2V0IHRvIGZhbHNlIGJlZm9yZSBub3RpZnlpbmcKKyAgICBNb25pdG9yIGRvbmVNb25pdG9yOyAgICAvLyBzaWduYWxlZCB3aGVuIGNvdW50IHJlYWNoZXMgemVybworICAgIHNpemVfdCBhY3RpdmVDb3VudCA9IDE7CisgICAgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyVGVzdHM6OkJsb2NrVGFzaz4gYmxvY2tpbmdUYXNrKAorICAgICAgbmV3IFRocmVhZE1hbmFnZXJUZXN0czo6QmxvY2tUYXNrKGVudHJ5TW9uaXRvciwgYmxvY2tNb25pdG9yLCBibG9ja2VkLCBkb25lTW9uaXRvciwgYWN0aXZlQ291bnQpKTsKKyAgICB0aHJlYWRNYW5hZ2VyLT5hZGQoYmxvY2tpbmdUYXNrKTsKKworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT53b3JrZXJDb3VudCgpLCAwKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+aWRsZVdvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5wZW5kaW5nVGFza0NvdW50KCksIDEpOworCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdGFkZCBvdGhlciB0YXNrLi4gIiA8PCBzdGQ6OmVuZGw7CisKKyAgICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXJUZXN0czo6VGFzaz4gb3RoZXJUYXNrKAorICAgICAgbmV3IFRocmVhZE1hbmFnZXJUZXN0czo6VGFzayhkb25lTW9uaXRvciwgYWN0aXZlQ291bnQsIDApKTsKKworICAgIHRocmVhZE1hbmFnZXItPmFkZChvdGhlclRhc2spOworCisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPndvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5pZGxlV29ya2VyQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSwgMik7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0cmVtb3ZlIGJsb2NraW5nIHRhc2sgc3BlY2lmaWNhbGx5Li4gIiA8PCBzdGQ6OmVuZGw7CisKKyAgICB0aHJlYWRNYW5hZ2VyLT5yZW1vdmUoYmxvY2tpbmdUYXNrKTsKKworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT53b3JrZXJDb3VudCgpLCAwKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+aWRsZVdvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5wZW5kaW5nVGFza0NvdW50KCksIDEpOworCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdHJlbW92ZSBuZXh0IHBlbmRpbmcgdGFzay4uIiA8PCBzdGQ6OmVuZGw7CisKKyAgICBzaGFyZWRfcHRyPFJ1bm5hYmxlPiBuZXh0VGFzayA9IHRocmVhZE1hbmFnZXItPnJlbW92ZU5leHRQZW5kaW5nKCk7CisgICAgaWYgKG5leHRUYXNrICE9IG90aGVyVGFzaykgeworICAgICAgc3RkOjpjZXJyIDw8ICJcdFx0XHRcdFx0ZXhwZWN0ZWQgcmVtb3ZlTmV4dFBlbmRpbmcgdG8gcmV0dXJuIG90aGVyVGFzayIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT53b3JrZXJDb3VudCgpLCAwKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+aWRsZVdvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5wZW5kaW5nVGFza0NvdW50KCksIDApOworCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdHJlbW92ZSBuZXh0IHBlbmRpbmcgdGFzayAobm9uZSBsZWZ0KS4uIiA8PCBzdGQ6OmVuZGw7CisKKyAgICBuZXh0VGFzayA9IHRocmVhZE1hbmFnZXItPnJlbW92ZU5leHRQZW5kaW5nKCk7CisgICAgaWYgKG5leHRUYXNrKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRcdFx0XHRleHBlY3RlZCByZW1vdmVOZXh0UGVuZGluZyB0byByZXR1cm4gYW4gZW1wdHkgUnVubmFibGUiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0YWRkIDIgZXhwaXJlZCB0YXNrcyBhbmQgMSBub3QuLiIgPDwgc3RkOjplbmRsOworCisgICAgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyVGVzdHM6OlRhc2s+IGV4cGlyZWRUYXNrKAorICAgICAgbmV3IFRocmVhZE1hbmFnZXJUZXN0czo6VGFzayhkb25lTW9uaXRvciwgYWN0aXZlQ291bnQsIDApKTsKKworICAgIHRocmVhZE1hbmFnZXItPmFkZChleHBpcmVkVGFzaywgMCwgMSk7CisgICAgdGhyZWFkTWFuYWdlci0+YWRkKGJsb2NraW5nVGFzayk7ICAgICAgIC8vIGFkZCBvbmUgdGhhdCBoYXNuJ3QgZXhwaXJlZCB0byBtYWtlIHN1cmUgaXQgZ2V0cyBza2lwcGVkCisgICAgdGhyZWFkTWFuYWdlci0+YWRkKGV4cGlyZWRUYXNrLCAwLCAxKTsgIC8vIGFkZCBhIHNlY29uZCBleHBpcmVkIHRvIGVuc3VyZSByZW1vdmVFeHBpcmVkVGFza3MgcmVtb3ZlcyBib3RoCisKKyAgICBzbGVlcF8oNTApOyAgLy8gbWFrZSBzdXJlIGVub3VnaCB0aW1lIGVsYXBzZXMgZm9yIGl0IHRvIGV4cGlyZSAtIHRoZSBzaG9ydGVzdCBleHBpcmF0aW9uIHRpbWUgaXMgMSBtaWxsaXNlY29uZAorCisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPndvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5pZGxlV29ya2VyQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSwgMyk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPmV4cGlyZWRUYXNrQ291bnQoKSwgMCk7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0cmVtb3ZlIGV4cGlyZWQgdGFza3MuLiIgPDwgc3RkOjplbmRsOworCisgICAgaWYgKCFtX2V4cGlyZWQuZW1wdHkoKSkgeworICAgICAgc3RkOjpjZXJyIDw8ICJcdFx0XHRcdFx0ZXhwZWN0ZWQgbV9leHBpcmVkIHRvIGJlIGVtcHR5IiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdGhyZWFkTWFuYWdlci0+cmVtb3ZlRXhwaXJlZFRhc2tzKCk7CisKKyAgICBpZiAobV9leHBpcmVkLnNpemUoKSAhPSAyKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRcdFx0XHRleHBlY3RlZCBtX2V4cGlyZWQgdG8gYmUgc2V0IiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKG1fZXhwaXJlZC5mcm9udCgpICE9IGV4cGlyZWRUYXNrKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRcdFx0XHRleHBlY3RlZCBtX2V4cGlyZWRbMF0gdG8gYmUgdGhlIGV4cGlyZWQgdGFzayIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBtX2V4cGlyZWQucG9wX2Zyb250KCk7CisKKyAgICBpZiAobV9leHBpcmVkLmZyb250KCkgIT0gZXhwaXJlZFRhc2spIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiXHRcdFx0XHRcdGV4cGVjdGVkIG1fZXhwaXJlZFsxXSB0byBiZSB0aGUgZXhwaXJlZCB0YXNrIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbV9leHBpcmVkLmNsZWFyKCk7CisKKyAgICB0aHJlYWRNYW5hZ2VyLT5yZW1vdmUoYmxvY2tpbmdUYXNrKTsKKworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT53b3JrZXJDb3VudCgpLCAwKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+aWRsZVdvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5wZW5kaW5nVGFza0NvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5leHBpcmVkVGFza0NvdW50KCksIDIpOworCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdGFkZCBleHBpcmVkIHRhc2sgKGFnYWluKS4uIiA8PCBzdGQ6OmVuZGw7CisKKyAgICB0aHJlYWRNYW5hZ2VyLT5hZGQoZXhwaXJlZFRhc2ssIDAsIDEpOyAgLy8gZXhwaXJlcyBpbiAxbXMKKyAgICBzbGVlcF8oNTApOyAgLy8gbWFrZSBzdXJlIGVub3VnaCB0aW1lIGVsYXBzZXMgZm9yIGl0IHRvIGV4cGlyZSAtIHRoZSBzaG9ydGVzdCBleHBpcmF0aW9uIHRpbWUgaXMgMW1zCisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0YWRkIHdvcmtlciB0byBjb25zdW1lIGV4cGlyZWQgdGFzay4uIiA8PCBzdGQ6OmVuZGw7CisKKyAgICB0aHJlYWRNYW5hZ2VyLT5hZGRXb3JrZXIoKTsKKyAgICBzbGVlcF8oMTAwKTsgIC8vIG1ha2Ugc3VyZSBpdCBoYXMgdGltZSB0byBzcGluIHVwIGFuZCBleHBpcmUgdGhlIHRhc2sKKworICAgIGlmIChtX2V4cGlyZWQuZW1wdHkoKSkgeworICAgICAgc3RkOjpjZXJyIDw8ICJcdFx0XHRcdFx0ZXhwZWN0ZWQgbV9leHBpcmVkIHRvIGJlIHNldCIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChtX2V4cGlyZWQuZnJvbnQoKSAhPSBleHBpcmVkVGFzaykgeworICAgICAgc3RkOjpjZXJyIDw8ICJcdFx0XHRcdFx0ZXhwZWN0ZWQgbV9leHBpcmVkIHRvIGJlIHRoZSBleHBpcmVkIHRhc2siIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtX2V4cGlyZWQuY2xlYXIoKTsKKworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT53b3JrZXJDb3VudCgpLCAxKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+aWRsZVdvcmtlckNvdW50KCksIDEpOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5wZW5kaW5nVGFza0NvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5leHBpcmVkVGFza0NvdW50KCksIDMpOworCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdHRyeSB0byByZW1vdmUgdG9vIG1hbnkgd29ya2VycyIgPDwgc3RkOjplbmRsOworICAgIHRyeSB7CisgICAgICB0aHJlYWRNYW5hZ2VyLT5yZW1vdmVXb3JrZXIoMik7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRcdFx0XHRleHBlY3RlZCBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGNhdGNoIChjb25zdCBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24mKSB7CisgICAgICAvKiBleHBlY3RlZCAqLworICAgIH0KKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0XHRyZW1vdmUgd29ya2VyLi4gIiA8PCBzdGQ6OmVuZGw7CisKKyAgICB0aHJlYWRNYW5hZ2VyLT5yZW1vdmVXb3JrZXIoKTsKKworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT53b3JrZXJDb3VudCgpLCAwKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+aWRsZVdvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5wZW5kaW5nVGFza0NvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5leHBpcmVkVGFza0NvdW50KCksIDMpOworCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdGFkZCBibG9ja2luZyB0YXNrLi4gIiA8PCBzdGQ6OmVuZGw7CisKKyAgICB0aHJlYWRNYW5hZ2VyLT5hZGQoYmxvY2tpbmdUYXNrKTsKKworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT53b3JrZXJDb3VudCgpLCAwKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+aWRsZVdvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5wZW5kaW5nVGFza0NvdW50KCksIDEpOworCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdGFkZCB3b3JrZXIuLiAiIDw8IHN0ZDo6ZW5kbDsKKworICAgIHRocmVhZE1hbmFnZXItPmFkZFdvcmtlcigpOworICAgIHsKKyAgICAgIFN5bmNocm9uaXplZCBzKGVudHJ5TW9uaXRvcik7CisgICAgICB3aGlsZSAoIWJsb2NraW5nVGFzay0+X2VudGVyZWQpIHsKKyAgICAgICAgZW50cnlNb25pdG9yLndhaXQoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+d29ya2VyQ291bnQoKSwgMSk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPmlkbGVXb3JrZXJDb3VudCgpLCAwKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+cGVuZGluZ1Rhc2tDb3VudCgpLCAwKTsKKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0XHR1bmJsb2NrIHRhc2sgYW5kIHJlbW92ZSB3b3JrZXIuLiAiIDw8IHN0ZDo6ZW5kbDsKKworICAgIHsKKyAgICAgIFN5bmNocm9uaXplZCBzKGJsb2NrTW9uaXRvcik7CisgICAgICBibG9ja2VkID0gZmFsc2U7CisgICAgICBibG9ja01vbml0b3Iubm90aWZ5QWxsKCk7CisgICAgfQorICAgIHRocmVhZE1hbmFnZXItPnJlbW92ZVdvcmtlcigpOworCisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPndvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5pZGxlV29ya2VyQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSwgMCk7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0Y2xlYW51cC4uICIgPDwgc3RkOjplbmRsOworCisgICAgYmxvY2tpbmdUYXNrLnJlc2V0KCk7CisgICAgdGhyZWFkTWFuYWdlci5yZXNldCgpOworICAgIHJldHVybiB0cnVlOworICB9CiB9OwogCi1jb25zdCBkb3VibGUgVGhyZWFkTWFuYWdlclRlc3RzOjpURVNUX1RPTEVSQU5DRSA9IC4yMDsKIH0KIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9jb25jdXJyZW5jeS9UaW1lck1hbmFnZXJUZXN0cy5oIGIvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlclRlc3RzLmgKaW5kZXggZjQ2MDBmYy4uMWM1MmM0NyAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlclRlc3RzLmgKKysrIGIvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlclRlc3RzLmgKQEAgLTM0LDE0ICszNCwxMyBAQAogCiBjbGFzcyBUaW1lck1hbmFnZXJUZXN0cyB7CiAKLSAgc3RhdGljIGNvbnN0IGRvdWJsZSBURVNUX1RPTEVSQU5DRTsKLQogcHVibGljOgogICBjbGFzcyBUYXNrIDogcHVibGljIFJ1bm5hYmxlIHsKICAgcHVibGljOgogICAgIFRhc2soTW9uaXRvciYgbW9uaXRvciwgaW50NjRfdCB0aW1lb3V0KQogICAgICAgOiBfdGltZW91dCh0aW1lb3V0KSwKICAgICAgICAgX3N0YXJ0VGltZShVdGlsOjpjdXJyZW50VGltZSgpKSwKKyAgICAgICAgX2VuZFRpbWUoMCksCiAgICAgICAgIF9tb25pdG9yKG1vbml0b3IpLAogICAgICAgICBfc3VjY2VzcyhmYWxzZSksCiAgICAgICAgIF9kb25lKGZhbHNlKSB7fQpAQCAtNTEsMjUgKzUwLDExIEBACiAgICAgdm9pZCBydW4oKSB7CiAKICAgICAgIF9lbmRUaW1lID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKLQotICAgICAgLy8gRmlndXJlIG91dCBlcnJvciBwZXJjZW50YWdlCi0KLSAgICAgIGludDY0X3QgZGVsdGEgPSBfZW5kVGltZSAtIF9zdGFydFRpbWU7Ci0KLSAgICAgIGRlbHRhID0gZGVsdGEgPiBfdGltZW91dCA/IGRlbHRhIC0gX3RpbWVvdXQgOiBfdGltZW91dCAtIGRlbHRhOwotCi0gICAgICBkb3VibGUgZXJyb3IgPSBkb3VibGUoZGVsdGEpIC8gX3RpbWVvdXQ7Ci0KLSAgICAgIGlmIChlcnJvciA8IFRFU1RfVE9MRVJBTkNFKSB7Ci0gICAgICAgIF9zdWNjZXNzID0gdHJ1ZTsKLSAgICAgIH0KLQotICAgICAgX2RvbmUgPSB0cnVlOwotCi0gICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrWyIgPDwgdGhpcyA8PCAiXSBkb25lIiA8PCBzdGQ6OmVuZGw7IC8vIGRlYnVnCisgICAgICBfc3VjY2VzcyA9IChfZW5kVGltZSAtIF9zdGFydFRpbWUpID49IF90aW1lb3V0OwogCiAgICAgICB7CiAgICAgICAgIFN5bmNocm9uaXplZCBzKF9tb25pdG9yKTsKKyAgICAgICAgX2RvbmUgPSB0cnVlOwogICAgICAgICBfbW9uaXRvci5ub3RpZnlBbGwoKTsKICAgICAgIH0KICAgICB9CkBAIC05NCwxNCArNzksMTMgQEAKICAgICAgICAgPSBzaGFyZWRfcHRyPFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrPihuZXcgVGltZXJNYW5hZ2VyVGVzdHM6OlRhc2soX21vbml0b3IsIDEwICogdGltZW91dCkpOwogCiAgICAgewotCiAgICAgICBUaW1lck1hbmFnZXIgdGltZXJNYW5hZ2VyOwotCiAgICAgICB0aW1lck1hbmFnZXIudGhyZWFkRmFjdG9yeShzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4obmV3IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSgpKSk7Ci0KICAgICAgIHRpbWVyTWFuYWdlci5zdGFydCgpOwotCi0gICAgICBhc3NlcnQodGltZXJNYW5hZ2VyLnN0YXRlKCkgPT0gVGltZXJNYW5hZ2VyOjpTVEFSVEVEKTsKKyAgICAgIGlmICh0aW1lck1hbmFnZXIuc3RhdGUoKSAhPSBUaW1lck1hbmFnZXI6OlNUQVJURUQpIHsKKyAgICAgICAgc3RkOjpjZXJyIDw8ICJ0aW1lck1hbmFnZXIgaXMgbm90IGluIHRoZSBTVEFSVEVEIHN0YXRlLCBidXQgc2hvdWxkIGJlIiA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KIAogICAgICAgLy8gRG9uJ3QgY3JlYXRlIHRhc2sgeWV0LCBiZWNhdXNlIGl0cyBjb25zdHJ1Y3RvciBzZXRzIHRoZSBleHBlY3RlZCBjb21wbGV0aW9uIHRpbWUsIGFuZCB3ZQogICAgICAgLy8gbmVlZCB0byBkZWxheSBiZXR3ZWVuIGluc2VydGluZyB0aGUgdHdvIHRhc2tzIGludG8gdGhlIHJ1biBxdWV1ZS4KQEAgLTEwOSwzNCArOTMsMTYxIEBACiAKICAgICAgIHsKICAgICAgICAgU3luY2hyb25pemVkIHMoX21vbml0b3IpOwotCiAgICAgICAgIHRpbWVyTWFuYWdlci5hZGQob3JwaGFuVGFzaywgMTAgKiB0aW1lb3V0KTsKIAotICAgICAgICB0cnkgewotICAgICAgICAgIC8vIFdhaXQgZm9yIDEgc2Vjb25kIGluIG9yZGVyIHRvIGdpdmUgdGltZXJNYW5hZ2VyIGEgY2hhbmNlIHRvIHN0YXJ0IHNsZWVwaW5nIGluIHJlc3BvbnNlCi0gICAgICAgICAgLy8gdG8gYWRkaW5nIG9ycGhhblRhc2suIFdlIG5lZWQgdG8gZG8gdGhpcyBzbyB3ZSBjYW4gdmVyaWZ5IHRoYXQgYWRkaW5nIHRoZSBzZWNvbmQgdGFzawotICAgICAgICAgIC8vIGtpY2tzIHRoZSBkaXNwYXRjaGVyIG91dCBvZiB0aGUgY3VycmVudCB3YWl0IGFuZCBzdGFydHMgdGhlIG5ldyAxIHNlY29uZCB3YWl0LgotICAgICAgICAgIF9tb25pdG9yLndhaXQoMTAwMCk7Ci0gICAgICAgICAgYXNzZXJ0KAotICAgICAgICAgICAgICAwID09ICJFUlJPUjogVGhpcyB3YWl0IHNob3VsZCB0aW1lIG91dC4gVGltZXJNYW5hZ2VyIGRpc3BhdGNoZXIgbWF5IGhhdmUgYSBwcm9ibGVtLiIpOwotICAgICAgICB9IGNhdGNoIChUaW1lZE91dEV4Y2VwdGlvbiYpIHsKLSAgICAgICAgfQorICAgICAgICBUSFJJRlRfU0xFRVBfVVNFQyh0aW1lb3V0ICogMTAwMCk7CiAKICAgICAgICAgdGFzay5yZXNldChuZXcgVGltZXJNYW5hZ2VyVGVzdHM6OlRhc2soX21vbml0b3IsIHRpbWVvdXQpKTsKLQogICAgICAgICB0aW1lck1hbmFnZXIuYWRkKHRhc2ssIHRpbWVvdXQpOwotCiAgICAgICAgIF9tb25pdG9yLndhaXQoKTsKICAgICAgIH0KIAotICAgICAgYXNzZXJ0KHRhc2stPl9kb25lKTsKKyAgICAgIGlmICghdGFzay0+X2RvbmUpIHsKKyAgICAgICAgc3RkOjpjZXJyIDw8ICJ0YXNrIGlzIG5vdCBkb25lLCBidXQgaXQgc2hvdWxkIGhhdmUgZXhlY3V0ZWQiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQogCiAgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdCIgPDwgKHRhc2stPl9zdWNjZXNzID8gIlN1Y2Nlc3MiIDogIkZhaWx1cmUiKSA8PCAiISIgPDwgc3RkOjplbmRsOwogICAgIH0KIAotICAgIC8vIHRpbWVyTWFuYWdlci5zdG9wKCk7IFRoaXMgaXMgd2hlcmUgaXQgaGFwcGVucyB2aWEgZGVzdHJ1Y3RvcgorICAgIGlmIChvcnBoYW5UYXNrLT5fZG9uZSkgeworICAgICAgc3RkOjpjZXJyIDw8ICJvcnBoYW4gdGFzayBpcyBkb25lLCBidXQgaXQgc2hvdWxkIG5vdCBoYXZlIGV4ZWN1dGVkIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQogCi0gICAgYXNzZXJ0KCFvcnBoYW5UYXNrLT5fZG9uZSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvKioKKyAgICogVGhpcyB0ZXN0IGNyZWF0ZXMgdHdvIHRhc2tzLCByZW1vdmVzIHRoZSBmaXJzdCBvbmUgdGhlbiB3YWl0cyBmb3IgdGhlIHNlY29uZCBvbmUuIEl0IHRoZW4KKyAgICogdmVyaWZpZXMgdGhhdCB0aGUgdGltZXIgbWFuYWdlciBwcm9wZXJseSBjbGVhbiB1cCBpdHNlbGYgYW5kIHRoZSByZW1haW5pbmcgb3JwaGFuZWQgdGltZW91dAorICAgKiB0YXNrIHdoZW4gdGhlIG1hbmFnZXIgZ29lcyBvdXQgb2Ygc2NvcGUgYW5kIGl0cyBkZXN0cnVjdG9yIGlzIGNhbGxlZC4KKyAgICovCisgIGJvb2wgdGVzdDAxKGludDY0X3QgdGltZW91dCA9IDEwMDBMTCkgeworICAgIFRpbWVyTWFuYWdlciB0aW1lck1hbmFnZXI7CisgICAgdGltZXJNYW5hZ2VyLnRocmVhZEZhY3Rvcnkoc2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+KG5ldyBQbGF0Zm9ybVRocmVhZEZhY3RvcnkoKSkpOworICAgIHRpbWVyTWFuYWdlci5zdGFydCgpOworICAgIGFzc2VydCh0aW1lck1hbmFnZXIuc3RhdGUoKSA9PSBUaW1lck1hbmFnZXI6OlNUQVJURUQpOworCisgICAgU3luY2hyb25pemVkIHMoX21vbml0b3IpOworCisgICAgLy8gU2V0dXAgdGhlIHR3byB0YXNrcworICAgIHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyVGVzdHM6OlRhc2s+IHRhc2tUb1JlbW92ZQorICAgICAgPSBzaGFyZWRfcHRyPFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrPihuZXcgVGltZXJNYW5hZ2VyVGVzdHM6OlRhc2soX21vbml0b3IsIHRpbWVvdXQgLyAyKSk7CisgICAgdGltZXJNYW5hZ2VyLmFkZCh0YXNrVG9SZW1vdmUsIHRhc2tUb1JlbW92ZS0+X3RpbWVvdXQpOworCisgICAgc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4gdGFzaworICAgICAgPSBzaGFyZWRfcHRyPFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrPihuZXcgVGltZXJNYW5hZ2VyVGVzdHM6OlRhc2soX21vbml0b3IsIHRpbWVvdXQpKTsKKyAgICB0aW1lck1hbmFnZXIuYWRkKHRhc2ssIHRhc2stPl90aW1lb3V0KTsKKworICAgIC8vIFJlbW92ZSBvbmUgdGFzayBhbmQgd2FpdCB1bnRpbCB0aGUgb3RoZXIgaGFzIGNvbXBsZXRlZAorICAgIHRpbWVyTWFuYWdlci5yZW1vdmUodGFza1RvUmVtb3ZlKTsKKyAgICBfbW9uaXRvci53YWl0KHRpbWVvdXQgKiAyKTsKKworICAgIGFzc2VydCghdGFza1RvUmVtb3ZlLT5fZG9uZSk7CisgICAgYXNzZXJ0KHRhc2stPl9kb25lKTsKKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLyoqCisgICAqIFRoaXMgdGVzdCBjcmVhdGVzIHR3byB0YXNrcyB3aXRoIHRoZSBzYW1lIGNhbGxiYWNrIGFuZCBhbm90aGVyIG9uZSwgdGhlbiByZW1vdmVzIHRoZSB0d28KKyAgICogZHVwbGljYXRlZCB0aGVuIHdhaXRzIGZvciB0aGUgbGFzdCBvbmUuIEl0IHRoZW4gdmVyaWZpZXMgdGhhdCB0aGUgdGltZXIgbWFuYWdlciBwcm9wZXJseQorICAgKiBjbGVhbiB1cCBpdHNlbGYgYW5kIHRoZSByZW1haW5pbmcgb3JwaGFuZWQgdGltZW91dCB0YXNrIHdoZW4gdGhlIG1hbmFnZXIgZ29lcyBvdXQgb2Ygc2NvcGUKKyAgICogYW5kIGl0cyBkZXN0cnVjdG9yIGlzIGNhbGxlZC4KKyAgICovCisgIGJvb2wgdGVzdDAyKGludDY0X3QgdGltZW91dCA9IDEwMDBMTCkgeworICAgIFRpbWVyTWFuYWdlciB0aW1lck1hbmFnZXI7CisgICAgdGltZXJNYW5hZ2VyLnRocmVhZEZhY3Rvcnkoc2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+KG5ldyBQbGF0Zm9ybVRocmVhZEZhY3RvcnkoKSkpOworICAgIHRpbWVyTWFuYWdlci5zdGFydCgpOworICAgIGFzc2VydCh0aW1lck1hbmFnZXIuc3RhdGUoKSA9PSBUaW1lck1hbmFnZXI6OlNUQVJURUQpOworCisgICAgU3luY2hyb25pemVkIHMoX21vbml0b3IpOworCisgICAgLy8gU2V0dXAgdGhlIG9uZSB0YXNrcyBhbmQgYWRkIGl0IHR3aWNlCisgICAgc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4gdGFza1RvUmVtb3ZlCisgICAgICA9IHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyVGVzdHM6OlRhc2s+KG5ldyBUaW1lck1hbmFnZXJUZXN0czo6VGFzayhfbW9uaXRvciwgdGltZW91dCAvIDMpKTsKKyAgICB0aW1lck1hbmFnZXIuYWRkKHRhc2tUb1JlbW92ZSwgdGFza1RvUmVtb3ZlLT5fdGltZW91dCk7CisgICAgdGltZXJNYW5hZ2VyLmFkZCh0YXNrVG9SZW1vdmUsIHRhc2tUb1JlbW92ZS0+X3RpbWVvdXQgKiAyKTsKKworICAgIHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyVGVzdHM6OlRhc2s+IHRhc2sKKyAgICAgID0gc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4obmV3IFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrKF9tb25pdG9yLCB0aW1lb3V0KSk7CisgICAgdGltZXJNYW5hZ2VyLmFkZCh0YXNrLCB0YXNrLT5fdGltZW91dCk7CisKKyAgICAvLyBSZW1vdmUgdGhlIGZpcnN0IHRhc2sgKGUuZy4gdHdvIHRpbWVycykgYW5kIHdhaXQgdW50aWwgdGhlIG90aGVyIGhhcyBjb21wbGV0ZWQKKyAgICB0aW1lck1hbmFnZXIucmVtb3ZlKHRhc2tUb1JlbW92ZSk7CisgICAgX21vbml0b3Iud2FpdCh0aW1lb3V0ICogMik7CisKKyAgICBhc3NlcnQoIXRhc2tUb1JlbW92ZS0+X2RvbmUpOworICAgIGFzc2VydCh0YXNrLT5fZG9uZSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8qKgorICAgKiBUaGlzIHRlc3QgY3JlYXRlcyB0d28gdGFza3MsIHJlbW92ZXMgdGhlIGZpcnN0IG9uZSB0aGVuIHdhaXRzIGZvciB0aGUgc2Vjb25kIG9uZS4gSXQgdGhlbgorICAgKiB2ZXJpZmllcyB0aGF0IHRoZSB0aW1lciBtYW5hZ2VyIHByb3Blcmx5IGNsZWFuIHVwIGl0c2VsZiBhbmQgdGhlIHJlbWFpbmluZyBvcnBoYW5lZCB0aW1lb3V0CisgICAqIHRhc2sgd2hlbiB0aGUgbWFuYWdlciBnb2VzIG91dCBvZiBzY29wZSBhbmQgaXRzIGRlc3RydWN0b3IgaXMgY2FsbGVkLgorICAgKi8KKyAgYm9vbCB0ZXN0MDMoaW50NjRfdCB0aW1lb3V0ID0gMTAwMExMKSB7CisgICAgVGltZXJNYW5hZ2VyIHRpbWVyTWFuYWdlcjsKKyAgICB0aW1lck1hbmFnZXIudGhyZWFkRmFjdG9yeShzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4obmV3IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSgpKSk7CisgICAgdGltZXJNYW5hZ2VyLnN0YXJ0KCk7CisgICAgYXNzZXJ0KHRpbWVyTWFuYWdlci5zdGF0ZSgpID09IFRpbWVyTWFuYWdlcjo6U1RBUlRFRCk7CisKKyAgICBTeW5jaHJvbml6ZWQgcyhfbW9uaXRvcik7CisKKyAgICAvLyBTZXR1cCB0aGUgdHdvIHRhc2tzCisgICAgc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4gdGFza1RvUmVtb3ZlCisgICAgICAgID0gc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4obmV3IFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrKF9tb25pdG9yLCB0aW1lb3V0IC8gMikpOworICAgIFRpbWVyTWFuYWdlcjo6VGltZXIgdGltZXIgPSB0aW1lck1hbmFnZXIuYWRkKHRhc2tUb1JlbW92ZSwgdGFza1RvUmVtb3ZlLT5fdGltZW91dCk7CisKKyAgICBzaGFyZWRfcHRyPFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrPiB0YXNrCisgICAgICA9IHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyVGVzdHM6OlRhc2s+KG5ldyBUaW1lck1hbmFnZXJUZXN0czo6VGFzayhfbW9uaXRvciwgdGltZW91dCkpOworICAgIHRpbWVyTWFuYWdlci5hZGQodGFzaywgdGFzay0+X3RpbWVvdXQpOworCisgICAgLy8gUmVtb3ZlIG9uZSB0YXNrIGFuZCB3YWl0IHVudGlsIHRoZSBvdGhlciBoYXMgY29tcGxldGVkCisgICAgdGltZXJNYW5hZ2VyLnJlbW92ZSh0aW1lcik7CisgICAgX21vbml0b3Iud2FpdCh0aW1lb3V0ICogMik7CisKKyAgICBhc3NlcnQoIXRhc2tUb1JlbW92ZS0+X2RvbmUpOworICAgIGFzc2VydCh0YXNrLT5fZG9uZSk7CisKKyAgICAvLyBWZXJpZnkgYmVoYXZpb3Igd2hlbiByZW1vdmluZyB0aGUgcmVtb3ZlZCB0YXNrCisgICAgdHJ5IHsKKyAgICAgIHRpbWVyTWFuYWdlci5yZW1vdmUodGltZXIpOworICAgICAgYXNzZXJ0KDAgPT0gIkVSUk9SOiBUaGlzIHJlbW92ZSBzaG91bGQgc2VuZCBhIE5vU3VjaFRhc2tFeGNlcHRpb24gZXhjZXB0aW9uLiIpOworICAgIH0gY2F0Y2ggKE5vU3VjaFRhc2tFeGNlcHRpb24mKSB7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvKioKKyAgICogVGhpcyB0ZXN0IGNyZWF0ZXMgb25lIHRhc2tzLCBhbmQgdHJpZXMgdG8gcmVtb3ZlIGl0IGFmdGVyIGl0IGhhcyBleHBpcmVkLgorICAgKi8KKyAgYm9vbCB0ZXN0MDQoaW50NjRfdCB0aW1lb3V0ID0gMTAwMExMKSB7CisgICAgVGltZXJNYW5hZ2VyIHRpbWVyTWFuYWdlcjsKKyAgICB0aW1lck1hbmFnZXIudGhyZWFkRmFjdG9yeShzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4obmV3IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSgpKSk7CisgICAgdGltZXJNYW5hZ2VyLnN0YXJ0KCk7CisgICAgYXNzZXJ0KHRpbWVyTWFuYWdlci5zdGF0ZSgpID09IFRpbWVyTWFuYWdlcjo6U1RBUlRFRCk7CisKKyAgICBTeW5jaHJvbml6ZWQgcyhfbW9uaXRvcik7CisKKyAgICAvLyBTZXR1cCB0aGUgdGFzaworICAgIHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyVGVzdHM6OlRhc2s+IHRhc2sKKyAgICAgID0gc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4obmV3IFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrKF9tb25pdG9yLCB0aW1lb3V0IC8gMTApKTsKKyAgICBUaW1lck1hbmFnZXI6OlRpbWVyIHRpbWVyID0gdGltZXJNYW5hZ2VyLmFkZCh0YXNrLCB0YXNrLT5fdGltZW91dCk7CisKKyAgICAvLyBXYWl0IHVudGlsIHRoZSB0YXNrIGhhcyBjb21wbGV0ZWQKKyAgICBfbW9uaXRvci53YWl0KHRpbWVvdXQpOworCisgICAgLy8gVmVyaWZ5IGJlaGF2aW9yIHdoZW4gcmVtb3ZpbmcgdGhlIGV4cGlyZWQgdGFzaworICAgIHRyeSB7CisgICAgICB0aW1lck1hbmFnZXIucmVtb3ZlKHRpbWVyKTsKKyAgICAgIGFzc2VydCgwID09ICJFUlJPUjogVGhpcyByZW1vdmUgc2hvdWxkIHNlbmQgYSBOb1N1Y2hUYXNrRXhjZXB0aW9uIGV4Y2VwdGlvbi4iKTsKKyAgICB9IGNhdGNoIChOb1N1Y2hUYXNrRXhjZXB0aW9uJikgeworICAgIH0KIAogICAgIHJldHVybiB0cnVlOwogICB9CkBAIC0xNDYsNyArMjU3LDYgQEAKICAgTW9uaXRvciBfbW9uaXRvcjsKIH07CiAKLWNvbnN0IGRvdWJsZSBUaW1lck1hbmFnZXJUZXN0czo6VEVTVF9UT0xFUkFOQ0UgPSAuMjA7CiB9CiB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL0V2ZW50TG9nLmNwcCBiL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvRXZlbnRMb2cuY3BwCmluZGV4IGQ0YjgzNzIuLmUzZGRiY2MgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvRXZlbnRMb2cuY3BwCisrKyBiL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvRXZlbnRMb2cuY3BwCkBAIC0xOSwyMiArMTksMjUgQEAKICNpbmNsdWRlICJFdmVudExvZy5oIgogCiAjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CiAKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OwogCiBuYW1lc3BhY2UgewogCisvLyBEZWZpbmUgZW52aXJvbm1lbnQgdmFyaWFibGUgREVCVUdfRVZFTlRMT0cgdG8gZW5hYmxlIGRlYnVnIGxvZ2dpbmcKKy8vIGV4OiAkIERFQlVHX0VWRU5UTE9HPTEgcHJvY2Vzc29yX3Rlc3QKK3N0YXRpYyBjb25zdCBjaGFyICogREVCVUdfRVZFTlRMT0cgPSBnZXRlbnYoIkRFQlVHX0VWRU5UTE9HIik7CisKIHZvaWQgZGVidWcoY29uc3QgY2hhciogZm10LCAuLi4pIHsKLSAgLy8gQ29tbWVudCBvdXQgdGhpcyByZXR1cm4gdG8gZW5hYmxlIGRlYnVnIGxvZ3MgZnJvbSB0aGUgdGVzdCBjb2RlLgotICByZXR1cm47CisgIGlmIChERUJVR19FVkVOVExPRykgeworICAgIHZhX2xpc3QgYXA7CisgICAgdmFfc3RhcnQoYXAsIGZtdCk7CisgICAgdmZwcmludGYoc3RkZXJyLCBmbXQsIGFwKTsKKyAgICB2YV9lbmQoYXApOwogCi0gIHZhX2xpc3QgYXA7Ci0gIHZhX3N0YXJ0KGFwLCBmbXQpOwotICB2ZnByaW50ZihzdGRlcnIsIGZtdCwgYXApOwotICB2YV9lbmQoYXApOwotCi0gIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisgIH0KIH0KIH0KIApAQCAtNzgsNyArODEsNyBAQAogdm9pZCBFdmVudExvZzo6YXBwZW5kKEV2ZW50VHlwZSB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvbm5lY3Rpb25JZCwKICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjYWxsSWQsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSB7CisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIHsKICAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOwogICBkZWJ1ZygiJWQgPC0tICV1LCAldSwgJXMgXCIlc1wiIiwgaWRfLCBjb25uZWN0aW9uSWQsIGNhbGxJZCwgdHlwZSwgbWVzc2FnZS5jX3N0cigpKTsKIApkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9IYW5kbGVycy5oIGIvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9IYW5kbGVycy5oCmluZGV4IDA0MWZkM2QuLjI5Nzg0ZDggMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvSGFuZGxlcnMuaAorKysgYi9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL0hhbmRsZXJzLmgKQEAgLTI5LDcgKzI5LDcgQEAKIAogY2xhc3MgUGFyZW50SGFuZGxlciA6IHZpcnR1YWwgcHVibGljIFBhcmVudFNlcnZpY2VJZiB7CiBwdWJsaWM6Ci0gIFBhcmVudEhhbmRsZXIoY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2cpCisgIFBhcmVudEhhbmRsZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nKQogICAgIDogdHJpZ2dlck1vbml0b3IoJm11dGV4XyksIGdlbmVyYXRpb25fKDApLCB3YWl0XyhmYWxzZSksIGxvZ18obG9nKSB7fQogCiAgIGludDMyX3QgaW5jcmVtZW50R2VuZXJhdGlvbigpIHsKQEAgLTEzNiw3ICsxMzYsNyBAQAogICBpbnQzMl90IGdlbmVyYXRpb25fOwogICBib29sIHdhaXRfOwogICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc3RyaW5nc187Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPEV2ZW50TG9nPiBsb2dfOworICBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+IGxvZ187CiB9OwogCiAjaWZkZWYgX1dJTjMyCkBAIC0xNDYsNyArMTQ2LDcgQEAKIAogY2xhc3MgQ2hpbGRIYW5kbGVyIDogcHVibGljIFBhcmVudEhhbmRsZXIsIHZpcnR1YWwgcHVibGljIENoaWxkU2VydmljZUlmIHsKIHB1YmxpYzoKLSAgQ2hpbGRIYW5kbGVyKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nKSA6IFBhcmVudEhhbmRsZXIobG9nKSwgdmFsdWVfKDApIHt9CisgIENoaWxkSGFuZGxlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2cpIDogUGFyZW50SGFuZGxlcihsb2cpLCB2YWx1ZV8oMCkge30KIAogICBpbnQzMl90IHNldFZhbHVlKGNvbnN0IGludDMyX3QgdmFsdWUpIHsKICAgICBjb25jdXJyZW5jeTo6R3VhcmQgZyhtdXRleF8pOwpAQCAtMTc0LDEzICsxNzQsMTMgQEAKIAogc3RydWN0IENvbm5Db250ZXh0IHsKIHB1YmxpYzoKLSAgQ29ubkNvbnRleHQoYm9vc3Q6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW4sCi0gICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dCwKKyAgQ29ubkNvbnRleHQoc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGluLAorICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0LAogICAgICAgICAgICAgICB1aW50MzJfdCBpZCkKICAgICA6IGlucHV0KGluKSwgb3V0cHV0KG91dCksIGlkKGlkKSB7fQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGlucHV0OwotICBib29zdDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBvdXRwdXQ7CisgIHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbnB1dDsKKyAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dHB1dDsKICAgdWludDMyX3QgaWQ7CiB9OwogCkBAIC0xOTYsMTIgKzE5NiwxMiBAQAogCiBjbGFzcyBTZXJ2ZXJFdmVudEhhbmRsZXIgOiBwdWJsaWMgc2VydmVyOjpUU2VydmVyRXZlbnRIYW5kbGVyIHsKIHB1YmxpYzoKLSAgU2VydmVyRXZlbnRIYW5kbGVyKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nKSA6IG5leHRJZF8oMSksIGxvZ18obG9nKSB7fQorICBTZXJ2ZXJFdmVudEhhbmRsZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nKSA6IG5leHRJZF8oMSksIGxvZ18obG9nKSB7fQogCiAgIHZpcnR1YWwgdm9pZCBwcmVTZXJ2ZSgpIHt9CiAKLSAgdmlydHVhbCB2b2lkKiBjcmVhdGVDb250ZXh0KGJvb3N0OjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0cHV0KSB7CisgIHZpcnR1YWwgdm9pZCogY3JlYXRlQ29udGV4dChzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0cHV0KSB7CiAgICAgQ29ubkNvbnRleHQqIGNvbnRleHQgPSBuZXcgQ29ubkNvbnRleHQoaW5wdXQsIG91dHB1dCwgbmV4dElkXyk7CiAgICAgKytuZXh0SWRfOwogICAgIGxvZ18tPmFwcGVuZChFdmVudExvZzo6RVRfQ09OTl9DUkVBVEVELCBjb250ZXh0LT5pZCwgMCk7CkBAIC0yMDksOCArMjA5LDggQEAKICAgfQogCiAgIHZpcnR1YWwgdm9pZCBkZWxldGVDb250ZXh0KHZvaWQqIHNlcnZlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBvdXRwdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0cHV0KSB7CiAgICAgQ29ubkNvbnRleHQqIGNvbnRleHQgPSByZWludGVycHJldF9jYXN0PENvbm5Db250ZXh0Kj4oc2VydmVyQ29udGV4dCk7CiAKICAgICBpZiAoaW5wdXQgIT0gY29udGV4dC0+aW5wdXQpIHsKQEAgLTIyNiw3ICsyMjYsNyBAQAogICB9CiAKICAgdmlydHVhbCB2b2lkIHByb2Nlc3NDb250ZXh0KHZvaWQqIHNlcnZlckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjx0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ+IHRyYW5zcG9ydCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHRyYW5zcG9ydDo6VFRyYW5zcG9ydD4gdHJhbnNwb3J0KSB7CiAvLyBUT0RPOiBXZSBjdXJyZW50bHkgZG9uJ3QgdGVzdCB0aGUgYmVoYXZpb3Igb2YgdGhlIHByb2Nlc3NDb250ZXh0KCkKIC8vIGNhbGxzLiAgVGhlIHZhcmlvdXMgc2VydmVyIGltcGxlbWVudGF0aW9ucyBjYWxsIHByb2Nlc3NDb250ZXh0KCkgYXQKIC8vIHNsaWdodGx5IGRpZmZlcmVudCB0aW1lcywgYW5kIGl0IGlzIHRvbyBhbm5veWluZyB0byB0cnkgYW5kIGFjY291bnQgZm9yCkBAIC0yNTEsMTIgKzI1MSwxMiBAQAogCiBwcm90ZWN0ZWQ6CiAgIHVpbnQzMl90IG5leHRJZF87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPEV2ZW50TG9nPiBsb2dfOworICBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+IGxvZ187CiB9OwogCiBjbGFzcyBQcm9jZXNzb3JFdmVudEhhbmRsZXIgOiBwdWJsaWMgVFByb2Nlc3NvckV2ZW50SGFuZGxlciB7CiBwdWJsaWM6Ci0gIFByb2Nlc3NvckV2ZW50SGFuZGxlcihjb25zdCBib29zdDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZykgOiBuZXh0SWRfKDEpLCBsb2dfKGxvZykge30KKyAgUHJvY2Vzc29yRXZlbnRIYW5kbGVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZykgOiBuZXh0SWRfKDEpLCBsb2dfKGxvZykge30KIAogICB2b2lkKiBnZXRDb250ZXh0KGNvbnN0IGNoYXIqIGZuTmFtZSwgdm9pZCogc2VydmVyQ29udGV4dCkgewogICAgIENvbm5Db250ZXh0KiBjb25uQ29udGV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q29ubkNvbnRleHQqPihzZXJ2ZXJDb250ZXh0KTsKQEAgLTMyOSw3ICszMjksNyBAQAogICB9CiAKICAgdWludDMyX3QgbmV4dElkXzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8RXZlbnRMb2c+IGxvZ187CisgIHN0ZDo6c2hhcmVkX3B0cjxFdmVudExvZz4gbG9nXzsKIH07CiB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL1Byb2Nlc3NvclRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9Qcm9jZXNzb3JUZXN0LmNwcAppbmRleCA1YWFhNTdlLi4zNmNlMDEzIDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL1Byb2Nlc3NvclRlc3QuY3BwCisrKyBiL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvUHJvY2Vzc29yVGVzdC5jcHAKQEAgLTMzLDIxICszMywyMSBAQAogI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuaD4KIAogI2luY2x1ZGUgIkV2ZW50TG9nLmgiCiAjaW5jbHVkZSAiU2VydmVyVGhyZWFkLmgiCiAjaW5jbHVkZSAiSGFuZGxlcnMuaCIKICNpbmNsdWRlICJnZW4tY3BwL0NoaWxkU2VydmljZS5oIgogCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotdXNpbmcgbmFtZXNwYWNlIGJvb3N0OwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjsKLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwotCiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRlc3Q7Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjp2ZWN0b3I7CiAKIC8qCiAgKiBUcmFpdHMgY2xhc3NlcyB0aGF0IGVuY2Fwc3VsYXRlIGhvdyB0byBjcmVhdGUgdmFyaW91cyB0eXBlcyBvZiBzZXJ2ZXJzLgpAQCAtNTcsMTMgKzU3LDEzIEBACiBwdWJsaWM6CiAgIHR5cGVkZWYgVFNpbXBsZVNlcnZlciBTZXJ2ZXJUeXBlOwogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTaW1wbGVTZXJ2ZXI+IGNyZWF0ZVNlcnZlcigKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgIHN0ZDo6c2hhcmVkX3B0cjxUU2ltcGxlU2VydmVyPiBjcmVhdGVTZXJ2ZXIoCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKICAgICAgIHVpbnQxNl90IHBvcnQsCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5KSB7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4gc29ja2V0KG5ldyBUU2VydmVyU29ja2V0KHBvcnQpKTsKLSAgICByZXR1cm4gYm9vc3Q6OnNoYXJlZF9wdHI8VFNpbXBsZVNlcnZlcj4oCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4gc29ja2V0KG5ldyBUU2VydmVyU29ja2V0KHBvcnQpKTsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFRTaW1wbGVTZXJ2ZXI+KAogICAgICAgICBuZXcgVFNpbXBsZVNlcnZlcihwcm9jZXNzb3IsIHNvY2tldCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KSk7CiAgIH0KIH07CkBAIC03MiwxMyArNzIsMTMgQEAKIHB1YmxpYzoKICAgdHlwZWRlZiBUVGhyZWFkZWRTZXJ2ZXIgU2VydmVyVHlwZTsKIAotICBib29zdDo6c2hhcmVkX3B0cjxUVGhyZWFkZWRTZXJ2ZXI+IGNyZWF0ZVNlcnZlcigKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgIHN0ZDo6c2hhcmVkX3B0cjxUVGhyZWFkZWRTZXJ2ZXI+IGNyZWF0ZVNlcnZlcigKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAogICAgICAgdWludDE2X3QgcG9ydCwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpIHsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyU29ja2V0PiBzb2NrZXQobmV3IFRTZXJ2ZXJTb2NrZXQocG9ydCkpOwotICAgIHJldHVybiBib29zdDo6c2hhcmVkX3B0cjxUVGhyZWFkZWRTZXJ2ZXI+KAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5KSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJTb2NrZXQ+IHNvY2tldChuZXcgVFNlcnZlclNvY2tldChwb3J0KSk7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxUVGhyZWFkZWRTZXJ2ZXI+KAogICAgICAgICBuZXcgVFRocmVhZGVkU2VydmVyKHByb2Nlc3Nvciwgc29ja2V0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpKTsKICAgfQogfTsKQEAgLTg3LDE5ICs4NywxOSBAQAogcHVibGljOgogICB0eXBlZGVmIFRUaHJlYWRQb29sU2VydmVyIFNlcnZlclR5cGU7CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRocmVhZFBvb2xTZXJ2ZXI+IGNyZWF0ZVNlcnZlcigKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgIHN0ZDo6c2hhcmVkX3B0cjxUVGhyZWFkUG9vbFNlcnZlcj4gY3JlYXRlU2VydmVyKAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCiAgICAgICB1aW50MTZfdCBwb3J0LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSkgewotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJTb2NrZXQ+IHNvY2tldChuZXcgVFNlcnZlclNvY2tldChwb3J0KSk7CisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4gc29ja2V0KG5ldyBUU2VydmVyU29ja2V0KHBvcnQpKTsKIAotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeShuZXcgUGxhdGZvcm1UaHJlYWRGYWN0b3J5KTsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyID0gVGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcig4KTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5KG5ldyBQbGF0Zm9ybVRocmVhZEZhY3RvcnkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyID0gVGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcig4KTsKICAgICB0aHJlYWRNYW5hZ2VyLT50aHJlYWRGYWN0b3J5KHRocmVhZEZhY3RvcnkpOwogICAgIHRocmVhZE1hbmFnZXItPnN0YXJ0KCk7CiAKLSAgICByZXR1cm4gYm9vc3Q6OnNoYXJlZF9wdHI8VFRocmVhZFBvb2xTZXJ2ZXI+KAorICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8VFRocmVhZFBvb2xTZXJ2ZXI+KAogICAgICAgICBuZXcgVFRocmVhZFBvb2xTZXJ2ZXIocHJvY2Vzc29yLCBzb2NrZXQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSwgdGhyZWFkTWFuYWdlcikpOwogICB9CiB9OwpAQCAtMTA4LDExICsxMDgsMTEgQEAKIHB1YmxpYzoKICAgdHlwZWRlZiBUTm9uYmxvY2tpbmdTZXJ2ZXIgU2VydmVyVHlwZTsKIAotICBib29zdDo6c2hhcmVkX3B0cjxUTm9uYmxvY2tpbmdTZXJ2ZXI+IGNyZWF0ZVNlcnZlcigKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgIHN0ZDo6c2hhcmVkX3B0cjxUTm9uYmxvY2tpbmdTZXJ2ZXI+IGNyZWF0ZVNlcnZlcigKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAogICAgICAgdWludDE2X3QgcG9ydCwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpIHsKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSkgewogICAgIC8vIFROb25ibG9ja2luZ1NlcnZlciBhdXRvbWF0aWNhbGx5IHVzZXMgVEZyYW1lZFRyYW5zcG9ydC4KICAgICAvLyBSYWlzZSBhbiBleGNlcHRpb24gaWYgdGhlIHN1cHBsaWVkIHRyYW5zcG9ydCBmYWN0b3J5IGlzIG5vdCBhCiAgICAgLy8gVEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkKQEAgLTEyMiwxMyArMTIyLDE0IEBACiAgICAgICB0aHJvdyBURXhjZXB0aW9uKCJUTm9uYmxvY2tpbmdTZXJ2ZXIgbXVzdCB1c2UgVEZyYW1lZFRyYW5zcG9ydCIpOwogICAgIH0KIAotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeShuZXcgUGxhdGZvcm1UaHJlYWRGYWN0b3J5KTsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyID0gVGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcig4KTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VE5vbmJsb2NraW5nU2VydmVyU29ja2V0PiBzb2NrZXQobmV3IFROb25ibG9ja2luZ1NlcnZlclNvY2tldChwb3J0KSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeShuZXcgUGxhdGZvcm1UaHJlYWRGYWN0b3J5KTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlciA9IFRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIoOCk7CiAgICAgdGhyZWFkTWFuYWdlci0+dGhyZWFkRmFjdG9yeSh0aHJlYWRGYWN0b3J5KTsKICAgICB0aHJlYWRNYW5hZ2VyLT5zdGFydCgpOwogCi0gICAgcmV0dXJuIGJvb3N0OjpzaGFyZWRfcHRyPFROb25ibG9ja2luZ1NlcnZlcj4oCi0gICAgICAgIG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXIocHJvY2Vzc29yLCBwcm90b2NvbEZhY3RvcnksIHBvcnQsIHRocmVhZE1hbmFnZXIpKTsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFROb25ibG9ja2luZ1NlcnZlcj4oCisgICAgICAgIG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXIocHJvY2Vzc29yLCBwcm90b2NvbEZhY3RvcnksIHNvY2tldCwgdGhyZWFkTWFuYWdlcikpOwogICB9CiB9OwogCkBAIC0xMzYsMTEgKzEzNywxMSBAQAogcHVibGljOgogICB0eXBlZGVmIFROb25ibG9ja2luZ1NlcnZlciBTZXJ2ZXJUeXBlOwogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFROb25ibG9ja2luZ1NlcnZlcj4gY3JlYXRlU2VydmVyKAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgc3RkOjpzaGFyZWRfcHRyPFROb25ibG9ja2luZ1NlcnZlcj4gY3JlYXRlU2VydmVyKAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCiAgICAgICB1aW50MTZfdCBwb3J0LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSkgeworICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5KSB7CiAgICAgLy8gVE5vbmJsb2NraW5nU2VydmVyIGF1dG9tYXRpY2FsbHkgdXNlcyBURnJhbWVkVHJhbnNwb3J0LgogICAgIC8vIFJhaXNlIGFuIGV4Y2VwdGlvbiBpZiB0aGUgc3VwcGxpZWQgdHJhbnNwb3J0IGZhY3RvcnkgaXMgbm90IGEKICAgICAvLyBURnJhbWVkVHJhbnNwb3J0RmFjdG9yeQpAQCAtMTUwLDEwICsxNTEsMTEgQEAKICAgICAgIHRocm93IFRFeGNlcHRpb24oIlROb25ibG9ja2luZ1NlcnZlciBtdXN0IHVzZSBURnJhbWVkVHJhbnNwb3J0Iik7CiAgICAgfQogCisgICAgc3RkOjpzaGFyZWRfcHRyPFROb25ibG9ja2luZ1NlcnZlclNvY2tldD4gc29ja2V0KG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQocG9ydCkpOwogICAgIC8vIFVzZSBhIE5VTEwgVGhyZWFkTWFuYWdlcgotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXI7Ci0gICAgcmV0dXJuIGJvb3N0OjpzaGFyZWRfcHRyPFROb25ibG9ja2luZ1NlcnZlcj4oCi0gICAgICAgIG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXIocHJvY2Vzc29yLCBwcm90b2NvbEZhY3RvcnksIHBvcnQsIHRocmVhZE1hbmFnZXIpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlcjsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFROb25ibG9ja2luZ1NlcnZlcj4oCisgICAgICAgIG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXIocHJvY2Vzc29yLCBwcm90b2NvbEZhY3RvcnksIHNvY2tldCwgdGhyZWFkTWFuYWdlcikpOwogICB9CiB9OwogCkBAIC0yNDIsNDggKzI0NCw0OCBAQAogICAgIHByb2Nlc3Nvcl8tPnNldEV2ZW50SGFuZGxlcihwcm9jZXNzb3JFdmVudEhhbmRsZXJfKTsKICAgfQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXI+IGNyZWF0ZVNlcnZlcih1aW50MTZfdCBwb3J0KSB7CisgIHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyPiBjcmVhdGVTZXJ2ZXIodWludDE2X3QgcG9ydCkgewogICAgIFNlcnZlclRyYWl0c18gc2VydmVyVHJhaXRzOwogICAgIHJldHVybiBzZXJ2ZXJUcmFpdHMuY3JlYXRlU2VydmVyKHByb2Nlc3Nvcl8sIHBvcnQsIHRyYW5zcG9ydEZhY3RvcnlfLCBwcm90b2NvbEZhY3RvcnlfKTsKICAgfQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJFdmVudEhhbmRsZXI+IGdldFNlcnZlckV2ZW50SGFuZGxlcigpIHsgcmV0dXJuIHNlcnZlckV2ZW50SGFuZGxlcl87IH0KKyAgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJFdmVudEhhbmRsZXI+IGdldFNlcnZlckV2ZW50SGFuZGxlcigpIHsgcmV0dXJuIHNlcnZlckV2ZW50SGFuZGxlcl87IH0KIAogICB2b2lkIGJpbmRTdWNjZXNzZnVsKHVpbnQxNl90IHBvcnQpIHsgcG9ydF8gPSBwb3J0OyB9CiAKICAgdWludDE2X3QgZ2V0UG9ydCgpIGNvbnN0IHsgcmV0dXJuIHBvcnRfOyB9CiAKLSAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBnZXRMb2coKSBjb25zdCB7IHJldHVybiBsb2dfOyB9CisgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGdldExvZygpIGNvbnN0IHsgcmV0dXJuIGxvZ187IH0KIAotICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxIYW5kbGVyPiYgZ2V0SGFuZGxlcigpIGNvbnN0IHsgcmV0dXJuIGhhbmRsZXJfOyB9CisgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxIYW5kbGVyPiYgZ2V0SGFuZGxlcigpIGNvbnN0IHsgcmV0dXJuIGhhbmRsZXJfOyB9CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8Q2xpZW50PiBjcmVhdGVDbGllbnQoKSB7CisgIHN0ZDo6c2hhcmVkX3B0cjxDbGllbnQ+IGNyZWF0ZUNsaWVudCgpIHsKICAgICB0eXBlZGVmIHR5cGVuYW1lIFNlcnZpY2VUcmFpdHNfOjpQcm90b2NvbCBQcm90b2NvbDsKIAotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHNvY2tldChuZXcgVFNvY2tldCgiMTI3LjAuMC4xIiwgcG9ydF8pKTsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUcmFuc3BvcnRfPiB0cmFuc3BvcnQobmV3IFRyYW5zcG9ydF8oc29ja2V0KSk7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8UHJvdG9jb2w+IHByb3RvY29sKG5ldyBQcm90b2NvbCh0cmFuc3BvcnQpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gc29ja2V0KG5ldyBUU29ja2V0KCIxMjcuMC4wLjEiLCBwb3J0XykpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUcmFuc3BvcnRfPiB0cmFuc3BvcnQobmV3IFRyYW5zcG9ydF8oc29ja2V0KSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFByb3RvY29sPiBwcm90b2NvbChuZXcgUHJvdG9jb2wodHJhbnNwb3J0KSk7CiAgICAgdHJhbnNwb3J0LT5vcGVuKCk7CiAKLSAgICBib29zdDo6c2hhcmVkX3B0cjxDbGllbnQ+IGNsaWVudChuZXcgQ2xpZW50KHByb3RvY29sKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPENsaWVudD4gY2xpZW50KG5ldyBDbGllbnQocHJvdG9jb2wpKTsKICAgICByZXR1cm4gY2xpZW50OwogICB9CiAKIHByaXZhdGU6CiAgIHVpbnQxNl90IHBvcnRfOwotICBib29zdDo6c2hhcmVkX3B0cjxFdmVudExvZz4gbG9nXzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8SGFuZGxlcj4gaGFuZGxlcl87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFByb2Nlc3Nvcj4gcHJvY2Vzc29yXzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3RvcnlfOwotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnlfOwotICBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyRXZlbnRIYW5kbGVyPiBzZXJ2ZXJFdmVudEhhbmRsZXJfOwotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRXZlbnRIYW5kbGVyPiBwcm9jZXNzb3JFdmVudEhhbmRsZXJfOworICBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+IGxvZ187CisgIHN0ZDo6c2hhcmVkX3B0cjxIYW5kbGVyPiBoYW5kbGVyXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFByb2Nlc3Nvcj4gcHJvY2Vzc29yXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5XzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeV87CisgIHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyRXZlbnRIYW5kbGVyPiBzZXJ2ZXJFdmVudEhhbmRsZXJfOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckV2ZW50SGFuZGxlcj4gcHJvY2Vzc29yRXZlbnRIYW5kbGVyXzsKIH07CiAKIC8qKgogICogQ2hlY2sgdGhhdCB0aGVyZSBhcmUgbm8gbW9yZSBldmVudHMgaW4gdGhlIGxvZwogICovCi12b2lkIGNoZWNrTm9FdmVudHMoY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2cpIHsKK3ZvaWQgY2hlY2tOb0V2ZW50cyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2cpIHsKICAgLy8gV2FpdCBmb3IgYW4gZXZlbnQgd2l0aCBhIHZlcnkgc2hvcnQgdGltZW91dCBwZXJpb2QuICBXZSBkb24ndCBleHBlY3QKICAgLy8gYW55dGhpbmcgdG8gYmUgcHJlc2VudCwgc28gd2Ugd2lsbCBub3JtYWxseSB3YWl0IGZvciB0aGUgZnVsbCB0aW1lb3V0LgogICAvLyBPbiB0aGUgb3RoZXIgaGFuZCwgYSBub24temVybyB0aW1lb3V0IGlzIG5pY2Ugc2luY2UgaXQgZG9lcyBnaXZlIGEgc2hvcnQKQEAgLTI5Nyw5ICsyOTksOSBAQAogICoKICAqIFJldHVybnMgdGhlIGNvbm5lY3Rpb24gSUQgYWxsb2NhdGVkIGJ5IHRoZSBzZXJ2ZXIuCiAgKi8KLXVpbnQzMl90IGNoZWNrTmV3Q29ubkV2ZW50cyhjb25zdCBib29zdDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZykgewordWludDMyX3QgY2hlY2tOZXdDb25uRXZlbnRzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZykgewogICAvLyBDaGVjayBmb3IgYW4gRVRfQ09OTl9DUkVBVEVEIGV2ZW50Ci0gIEV2ZW50IGV2ZW50ID0gbG9nLT53YWl0Rm9yRXZlbnQoKTsKKyAgRXZlbnQgZXZlbnQgPSBsb2ctPndhaXRGb3JFdmVudCgyNTAwKTsKICAgQk9PU1RfQ0hFQ0tfRVFVQUwoRXZlbnRMb2c6OkVUX0NPTk5fQ1JFQVRFRCwgZXZlbnQudHlwZSk7CiAKICAgLy8gU29tZSBzZXJ2ZXJzIGNhbGwgdGhlIHByb2Nlc3NDb250ZXh0KCkgaG9vayBpbW1lZGlhdGVseS4KQEAgLTMxMiw3ICszMTQsNyBAQAogLyoqCiAgKiBDaGVjayBmb3IgdGhlIGV2ZW50cyB0aGF0IHNob3VsZCBiZSBsb2dnZWQgd2hlbiBhIGNvbm5lY3Rpb24gaXMgY2xvc2VkLgogICovCi12b2lkIGNoZWNrQ2xvc2VFdmVudHMoY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2csIHVpbnQzMl90IGNvbm5JZCkgewordm9pZCBjaGVja0Nsb3NlRXZlbnRzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZywgdWludDMyX3QgY29ubklkKSB7CiAgIC8vIENoZWNrIGZvciBhbiBFVF9DT05OX0RFU1RST1lFRCBldmVudAogICBFdmVudCBldmVudCA9IGxvZy0+d2FpdEZvckV2ZW50KCk7CiAgIEJPT1NUX0NIRUNLX0VRVUFMKEV2ZW50TG9nOjpFVF9DT05OX0RFU1RST1lFRCwgZXZlbnQudHlwZSk7CkBAIC0zMzAsNyArMzMyLDcgQEAKICAqCiAgKiBSZXR1cm5zIHRoZSBjYWxsIElEIGFsbG9jYXRlZCBieSB0aGUgc2VydmVyLgogICovCi11aW50MzJfdCBjaGVja0NhbGxIYW5kbGVyRXZlbnRzKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nLAordWludDMyX3QgY2hlY2tDYWxsSGFuZGxlckV2ZW50cyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvbm5JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRUeXBlIGNhbGxUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGNhbGxOYW1lKSB7CkBAIC0zNjcsNyArMzY5LDcgQEAKIC8qKgogICogQ2hlY2sgZm9yIHRoZSBldmVudHMgdGhhdCBzaG91bGQgYmUgYWZ0ZXIgYSBoYW5kbGVyIHJldHVybnMuCiAgKi8KLXZvaWQgY2hlY2tDYWxsUG9zdEhhbmRsZXJFdmVudHMoY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2csCit2b2lkIGNoZWNrQ2FsbFBvc3RIYW5kbGVyRXZlbnRzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29ubklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjYWxsSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgY2FsbE5hbWUpIHsKQEAgLTQwNyw3ICs0MDksNyBAQAogICoKICAqIFJldHVybnMgdGhlIGNhbGwgSUQgYWxsb2NhdGVkIGJ5IHRoZSBzZXJ2ZXIuCiAgKi8KLXVpbnQzMl90IGNoZWNrQ2FsbEV2ZW50cyhjb25zdCBib29zdDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZywKK3VpbnQzMl90IGNoZWNrQ2FsbEV2ZW50cyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29ubklkLAogICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50VHlwZSBjYWxsVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGNhbGxOYW1lKSB7CkBAIC00MjIsOCArNDI0LDggQEAKICAqLwogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RhdGVfPgotdm9pZCB0ZXN0UGFyZW50U2VydmljZShjb25zdCBib29zdDo6c2hhcmVkX3B0cjxTdGF0ZV8+JiBzdGF0ZSkgewotICBib29zdDo6c2hhcmVkX3B0cjx0eXBlbmFtZSBTdGF0ZV86OkNsaWVudD4gY2xpZW50ID0gc3RhdGUtPmNyZWF0ZUNsaWVudCgpOwordm9pZCB0ZXN0UGFyZW50U2VydmljZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8U3RhdGVfPiYgc3RhdGUpIHsKKyAgc3RkOjpzaGFyZWRfcHRyPHR5cGVuYW1lIFN0YXRlXzo6Q2xpZW50PiBjbGllbnQgPSBzdGF0ZS0+Y3JlYXRlQ2xpZW50KCk7CiAKICAgaW50MzJfdCBnZW4gPSBjbGllbnQtPmdldEdlbmVyYXRpb24oKTsKICAgaW50MzJfdCBuZXdHZW4gPSBjbGllbnQtPmluY3JlbWVudEdlbmVyYXRpb24oKTsKQEAgLTQ0NCw4ICs0NDYsOCBAQAogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RhdGVfPgotdm9pZCB0ZXN0Q2hpbGRTZXJ2aWNlKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFN0YXRlXz4mIHN0YXRlKSB7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPHR5cGVuYW1lIFN0YXRlXzo6Q2xpZW50PiBjbGllbnQgPSBzdGF0ZS0+Y3JlYXRlQ2xpZW50KCk7Cit2b2lkIHRlc3RDaGlsZFNlcnZpY2UoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFN0YXRlXz4mIHN0YXRlKSB7CisgIHN0ZDo6c2hhcmVkX3B0cjx0eXBlbmFtZSBTdGF0ZV86OkNsaWVudD4gY2xpZW50ID0gc3RhdGUtPmNyZWF0ZUNsaWVudCgpOwogCiAgIC8vIFRlc3QgY2FsbGluZyBzb21lIG9mIHRoZSBwYXJlbnQgbWV0aGlkcyB2aWEgdGhlIGEgY2hpbGQgY2xpZW50CiAgIGludDMyX3QgZ2VuID0gY2xpZW50LT5nZXRHZW5lcmF0aW9uKCk7CkBAIC00NjYsNyArNDY4LDcgQEAKICAgdHlwZWRlZiBTZXJ2aWNlU3RhdGU8U2VydmVyVHJhaXRzLCBQYXJlbnRTZXJ2aWNlVHJhaXRzPFRlbXBsYXRlVHJhaXRzPiA+IFN0YXRlOwogCiAgIC8vIFN0YXJ0IHRoZSBzZXJ2ZXIKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8U3RhdGU+IHN0YXRlKG5ldyBTdGF0ZSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxTdGF0ZT4gc3RhdGUobmV3IFN0YXRlKTsKICAgU2VydmVyVGhyZWFkIHNlcnZlclRocmVhZChzdGF0ZSwgdHJ1ZSk7CiAKICAgdGVzdFBhcmVudFNlcnZpY2Uoc3RhdGUpOwpAQCAtNDc3LDcgKzQ3OSw3IEBACiAgIHR5cGVkZWYgU2VydmljZVN0YXRlPFNlcnZlclRyYWl0cywgQ2hpbGRTZXJ2aWNlVHJhaXRzPFRlbXBsYXRlVHJhaXRzPiA+IFN0YXRlOwogCiAgIC8vIFN0YXJ0IHRoZSBzZXJ2ZXIKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8U3RhdGU+IHN0YXRlKG5ldyBTdGF0ZSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxTdGF0ZT4gc3RhdGUobmV3IFN0YXRlKTsKICAgU2VydmVyVGhyZWFkIHNlcnZlclRocmVhZChzdGF0ZSwgdHJ1ZSk7CiAKICAgdGVzdFBhcmVudFNlcnZpY2Uoc3RhdGUpOwpAQCAtNTAwLDEwICs1MDIsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgVEJ1ZmZlcmVkVHJhbnNwb3J0PiBTdGF0ZTsKIAogICAvLyBTdGFydCB0aGUgc2VydmVyCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFN0YXRlPiBzdGF0ZShuZXcgU3RhdGUpOworICBzdGQ6OnNoYXJlZF9wdHI8U3RhdGU+IHN0YXRlKG5ldyBTdGF0ZSk7CiAgIFNlcnZlclRocmVhZCBzZXJ2ZXJUaHJlYWQoc3RhdGUsIHRydWUpOwogCi0gIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nID0gc3RhdGUtPmdldExvZygpOworICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2cgPSBzdGF0ZS0+Z2V0TG9nKCk7CiAKICAgLy8gTWFrZSBzdXJlIHdlJ3JlIGF0IHRoZSBlbmQgb2YgdGhlIGxvZwogICBjaGVja05vRXZlbnRzKGxvZyk7CkBAIC01MTIsNyArNTE0LDcgQEAKIAogICAvLyBNYWtlIHN1cmUgY3JlYXRlQ29udGV4dCgpIGlzIGNhbGxlZCBhZnRlciBhIGNvbm5lY3Rpb24gaGFzIGJlZW4KICAgLy8gZXN0YWJsaXNoZWQuICBXZSBvcGVuIGEgcGxhaW4gc29ja2V0IGluc3RlYWQgb2YgY3JlYXRpbmcgYSBjbGllbnQuCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHNvY2tldChuZXcgVFNvY2tldCgiMTI3LjAuMC4xIiwgc3RhdGUtPmdldFBvcnQoKSkpOworICBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gc29ja2V0KG5ldyBUU29ja2V0KCIxMjcuMC4wLjEiLCBzdGF0ZS0+Z2V0UG9ydCgpKSk7CiAgIHNvY2tldC0+b3BlbigpOwogCiAgIC8vIE1ha2Ugc3VyZSB0aGUgcHJvcGVyIGV2ZW50cyBvY2N1cnJlZCBhZnRlciBhIG5ldyBjb25uZWN0aW9uCkBAIC01OTAsNyArNTkyLDcgQEAKICAgY2hlY2tOb0V2ZW50cyhsb2cpOwogCiAgIC8vIFJlYWQgdGhlIHJlc3BvbnNlIGhlYWRlcgotICBzdGQ6OnN0cmluZyByZXNwb25zZU5hbWU7CisgIHN0cmluZyByZXNwb25zZU5hbWU7CiAgIGludDMyX3QgcmVzcG9uc2VTZXFpZCA9IDA7CiAgIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VE1lc3NhZ2VUeXBlIHJlc3BvbnNlVHlwZTsKICAgcHJvdG9jb2wucmVhZE1lc3NhZ2VCZWdpbihyZXNwb25zZU5hbWUsIHJlc3BvbnNlVHlwZSwgcmVzcG9uc2VTZXFpZCk7CkBAIC02MzMsMTkgKzYzNSwxOSBAQAogICB0eXBlZGVmIFNlcnZpY2VTdGF0ZTxTZXJ2ZXJUcmFpdHMsIENoaWxkU2VydmljZVRyYWl0czxUZW1wbGF0ZVRyYWl0cz4gPiBTdGF0ZTsKIAogICAvLyBTdGFydCB0aGUgc2VydmVyCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFN0YXRlPiBzdGF0ZShuZXcgU3RhdGUpOworICBzdGQ6OnNoYXJlZF9wdHI8U3RhdGU+IHN0YXRlKG5ldyBTdGF0ZSk7CiAgIFNlcnZlclRocmVhZCBzZXJ2ZXJUaHJlYWQoc3RhdGUsIHRydWUpOwogCi0gIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nID0gc3RhdGUtPmdldExvZygpOworICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2cgPSBzdGF0ZS0+Z2V0TG9nKCk7CiAKICAgLy8gQ3JlYXRlIGEgY2xpZW50Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPHR5cGVuYW1lIFN0YXRlOjpDbGllbnQ+IGNsaWVudDEgPSBzdGF0ZS0+Y3JlYXRlQ2xpZW50KCk7CisgIHN0ZDo6c2hhcmVkX3B0cjx0eXBlbmFtZSBTdGF0ZTo6Q2xpZW50PiBjbGllbnQxID0gc3RhdGUtPmNyZWF0ZUNsaWVudCgpOwogCiAgIC8vIE1ha2Ugc3VyZSB0aGUgZXhwZWN0ZWQgZXZlbnRzIHdlcmUgbG9nZ2VkCiAgIHVpbnQzMl90IGNsaWVudDFJZCA9IGNoZWNrTmV3Q29ubkV2ZW50cyhsb2cpOwogCiAgIC8vIENyZWF0ZSBhIHNlY29uZCBjbGllbnQKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8dHlwZW5hbWUgU3RhdGU6OkNsaWVudD4gY2xpZW50MiA9IHN0YXRlLT5jcmVhdGVDbGllbnQoKTsKKyAgc3RkOjpzaGFyZWRfcHRyPHR5cGVuYW1lIFN0YXRlOjpDbGllbnQ+IGNsaWVudDIgPSBzdGF0ZS0+Y3JlYXRlQ2xpZW50KCk7CiAKICAgLy8gTWFrZSBzdXJlIHRoZSBleHBlY3RlZCBldmVudHMgd2VyZSBsb2dnZWQKICAgdWludDMyX3QgY2xpZW50MklkID0gY2hlY2tOZXdDb25uRXZlbnRzKGxvZyk7CkBAIC02ODEsMTMgKzY4MywxMyBAQAogICB0eXBlZGVmIFNlcnZpY2VTdGF0ZTxTZXJ2ZXJUcmFpdHMsIENoaWxkU2VydmljZVRyYWl0czxUZW1wbGF0ZVRyYWl0cz4gPiBTdGF0ZTsKIAogICAvLyBTdGFydCB0aGUgc2VydmVyCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFN0YXRlPiBzdGF0ZShuZXcgU3RhdGUpOworICBzdGQ6OnNoYXJlZF9wdHI8U3RhdGU+IHN0YXRlKG5ldyBTdGF0ZSk7CiAgIFNlcnZlclRocmVhZCBzZXJ2ZXJUaHJlYWQoc3RhdGUsIHRydWUpOwogCi0gIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nID0gc3RhdGUtPmdldExvZygpOworICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2cgPSBzdGF0ZS0+Z2V0TG9nKCk7CiAKICAgLy8gQ3JlYXRlIGEgY2xpZW50Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPHR5cGVuYW1lIFN0YXRlOjpDbGllbnQ+IGNsaWVudCA9IHN0YXRlLT5jcmVhdGVDbGllbnQoKTsKKyAgc3RkOjpzaGFyZWRfcHRyPHR5cGVuYW1lIFN0YXRlOjpDbGllbnQ+IGNsaWVudCA9IHN0YXRlLT5jcmVhdGVDbGllbnQoKTsKICAgdWludDMyX3QgY29ubklkID0gY2hlY2tOZXdDb25uRXZlbnRzKGxvZyk7CiAKICAgLy8gTWFrZSBhIG9uZXdheSBjYWxsCkBAIC03MzMsMTMgKzczNSwxMyBAQAogICB0eXBlZGVmIFNlcnZpY2VTdGF0ZTxTZXJ2ZXJUcmFpdHMsIENoaWxkU2VydmljZVRyYWl0czxUZW1wbGF0ZVRyYWl0cz4gPiBTdGF0ZTsKIAogICAvLyBTdGFydCB0aGUgc2VydmVyCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFN0YXRlPiBzdGF0ZShuZXcgU3RhdGUpOworICBzdGQ6OnNoYXJlZF9wdHI8U3RhdGU+IHN0YXRlKG5ldyBTdGF0ZSk7CiAgIFNlcnZlclRocmVhZCBzZXJ2ZXJUaHJlYWQoc3RhdGUsIHRydWUpOwogCi0gIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nID0gc3RhdGUtPmdldExvZygpOworICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2cgPSBzdGF0ZS0+Z2V0TG9nKCk7CiAKICAgLy8gQ3JlYXRlIGEgY2xpZW50Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPHR5cGVuYW1lIFN0YXRlOjpDbGllbnQ+IGNsaWVudCA9IHN0YXRlLT5jcmVhdGVDbGllbnQoKTsKKyAgc3RkOjpzaGFyZWRfcHRyPHR5cGVuYW1lIFN0YXRlOjpDbGllbnQ+IGNsaWVudCA9IHN0YXRlLT5jcmVhdGVDbGllbnQoKTsKICAgdWludDMyX3QgY29ubklkID0gY2hlY2tOZXdDb25uRXZlbnRzKGxvZyk7CiAKICAgLy8gU2VuZCB0aGUgZXhjZXB0aW9uV2FpdCgpIGNhbGwKQEAgLTc2Niw4ICs3NjgsOCBAQAogICB9IGNhdGNoIChjb25zdCBNeUVycm9yJiBlKSB7CiAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwobWVzc2FnZSwgZS5tZXNzYWdlKTsKICAgICAvLyBDaGVjayBpZiBzdGQ6OmV4Y2VwdGlvbjo6d2hhdCgpIGlzIGhhbmRsZWQgcHJvcGVybHkKLSAgICBzaXplX3QgbWVzc2FnZV9wb3MgPSBzdGQ6OnN0cmluZyhlLndoYXQoKSkuZmluZCgiVEV4Y2VwdGlvbiAtIHNlcnZpY2UgaGFzIHRocm93bjogTXlFcnJvciIpOwotICAgIEJPT1NUX0NIRUNLX05FKG1lc3NhZ2VfcG9zLCBzdGQ6OnN0cmluZzo6bnBvcyk7CisgICAgc2l6ZV90IG1lc3NhZ2VfcG9zID0gc3RyaW5nKGUud2hhdCgpKS5maW5kKCJURXhjZXB0aW9uIC0gc2VydmljZSBoYXMgdGhyb3duOiBNeUVycm9yIik7CisgICAgQk9PU1RfQ0hFQ0tfTkUobWVzc2FnZV9wb3MsIHN0cmluZzo6bnBvcyk7CiAgIH0KIAogICAvLyBOb3cgd2Ugc2hvdWxkIHNlZSB0aGUgZXZlbnRzIGZvciBhIG5vcm1hbCBjYWxsIGZpbmlzaApAQCAtNzg4LDEzICs3OTAsMTMgQEAKICAgdHlwZWRlZiBTZXJ2aWNlU3RhdGU8U2VydmVyVHJhaXRzLCBDaGlsZFNlcnZpY2VUcmFpdHM8VGVtcGxhdGVUcmFpdHM+ID4gU3RhdGU7CiAKICAgLy8gU3RhcnQgdGhlIHNlcnZlcgotICBib29zdDo6c2hhcmVkX3B0cjxTdGF0ZT4gc3RhdGUobmV3IFN0YXRlKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFN0YXRlPiBzdGF0ZShuZXcgU3RhdGUpOwogICBTZXJ2ZXJUaHJlYWQgc2VydmVyVGhyZWFkKHN0YXRlLCB0cnVlKTsKIAotICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZyA9IHN0YXRlLT5nZXRMb2coKTsKKyAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nID0gc3RhdGUtPmdldExvZygpOwogCiAgIC8vIENyZWF0ZSBhIGNsaWVudAotICBib29zdDo6c2hhcmVkX3B0cjx0eXBlbmFtZSBTdGF0ZTo6Q2xpZW50PiBjbGllbnQgPSBzdGF0ZS0+Y3JlYXRlQ2xpZW50KCk7CisgIHN0ZDo6c2hhcmVkX3B0cjx0eXBlbmFtZSBTdGF0ZTo6Q2xpZW50PiBjbGllbnQgPSBzdGF0ZS0+Y3JlYXRlQ2xpZW50KCk7CiAgIHVpbnQzMl90IGNvbm5JZCA9IGNoZWNrTmV3Q29ubkV2ZW50cyhsb2cpOwogCiAgIC8vIFNlbmQgdGhlIHVuZXhwZWN0ZWRFeGNlcHRpb25XYWl0KCkgY2FsbApAQCAtOTA4LDkgKzkxMCwyMCBAQAogCiAvLyBUT0RPOiBXZSBzaG91bGQgdGVzdCBURXZlbnRTZXJ2ZXIgaW4gdGhlIGZ1dHVyZS4KIC8vIEZvciBub3csIGl0IGlzIGtub3duIG5vdCB0byB3b3JrIGNvcnJlY3RseSB3aXRoIFRQcm9jZXNzb3JFdmVudEhhbmRsZXIuCi11bml0X3Rlc3Q6OnRlc3Rfc3VpdGUqIGluaXRfdW5pdF90ZXN0X3N1aXRlKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKKyNpZmRlZiBCT09TVF9URVNUX0RZTl9MSU5LCitib29sIGluaXRfdW5pdF90ZXN0X3N1aXRlKCkgeworICA6OmJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazo6bWFzdGVyX3Rlc3Rfc3VpdGUoKS5wX25hbWUudmFsdWUgPSAiUHJvY2Vzc29yVGVzdCI7CisgIHJldHVybiB0cnVlOworfQorCitpbnQgbWFpbiggaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSApIHsKKyAgcmV0dXJuIDo6Ym9vc3Q6OnVuaXRfdGVzdDo6dW5pdF90ZXN0X21haW4oJmluaXRfdW5pdF90ZXN0X3N1aXRlLGFyZ2MsYXJndik7Cit9CisjZWxzZQorOjpib29zdDo6dW5pdF90ZXN0Ojp0ZXN0X3N1aXRlKiBpbml0X3VuaXRfdGVzdF9zdWl0ZShpbnQgYXJnYywgY2hhciogYXJndltdKSB7CiAgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUoYXJnYyk7CiAgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUoYXJndik7Ci0gIHVuaXRfdGVzdDo6ZnJhbWV3b3JrOjptYXN0ZXJfdGVzdF9zdWl0ZSgpLnBfbmFtZS52YWx1ZSA9ICJQcm9jZXNzb3JUZXN0IjsKKyAgOjpib29zdDo6dW5pdF90ZXN0OjpmcmFtZXdvcms6Om1hc3Rlcl90ZXN0X3N1aXRlKCkucF9uYW1lLnZhbHVlID0gIlByb2Nlc3NvclRlc3QiOwogICByZXR1cm4gTlVMTDsKIH0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9TZXJ2ZXJUaHJlYWQuY3BwIGIvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9TZXJ2ZXJUaHJlYWQuY3BwCmluZGV4IGU5ZDQ2OGYuLjRkMWVjNGMgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvU2VydmVyVGhyZWFkLmNwcAorKysgYi9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL1NlcnZlclRocmVhZC5jcHAKQEAgLTM1LDYgKzM1LDggQEAKICAgYXNzZXJ0KCFydW5uaW5nXyk7CiAgIHJ1bm5pbmdfID0gdHJ1ZTsKIAorICBoZWxwZXJfLnJlc2V0KG5ldyBIZWxwZXIodGhpcykpOworCiAgIC8vIFN0YXJ0IHRoZSBvdGhlciB0aHJlYWQKICAgY29uY3VycmVuY3k6OlBsYXRmb3JtVGhyZWFkRmFjdG9yeSB0aHJlYWRGYWN0b3J5OwogICB0aHJlYWRGYWN0b3J5LnNldERldGFjaGVkKGZhbHNlKTsKQEAgLTEyOCw3ICsxMzAsNyBAQAogICBzZXJ2ZXJTdGF0ZV8tPmJpbmRTdWNjZXNzZnVsKHBvcnRfKTsKIAogICAvLyBTZXQgdGhlIHJlYWwgc2VydmVyIGV2ZW50IGhhbmRsZXIgKHJlcGxhY2luZyBvdXJzZWxmKQotICBib29zdDo6c2hhcmVkX3B0cjxzZXJ2ZXI6OlRTZXJ2ZXJFdmVudEhhbmRsZXI+IHNlcnZlckV2ZW50SGFuZGxlcgorICBzdGQ6OnNoYXJlZF9wdHI8c2VydmVyOjpUU2VydmVyRXZlbnRIYW5kbGVyPiBzZXJ2ZXJFdmVudEhhbmRsZXIKICAgICAgID0gc2VydmVyU3RhdGVfLT5nZXRTZXJ2ZXJFdmVudEhhbmRsZXIoKTsKICAgc2VydmVyXy0+c2V0U2VydmVyRXZlbnRIYW5kbGVyKHNlcnZlckV2ZW50SGFuZGxlcik7CiAKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvU2VydmVyVGhyZWFkLmggYi9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL1NlcnZlclRocmVhZC5oCmluZGV4IGVlZDM0NjkuLjYxZTMxYTMgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvU2VydmVyVGhyZWFkLmgKKysrIGIvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9TZXJ2ZXJUaHJlYWQuaApAQCAtNDMsNyArNDMsNyBAQAogICAgKiBJZiB0aGUgc2VydmVyIHJldHVybmVkIGZhaWxzIHRvIGJpbmQgdG8gdGhlIHNwZWNpZmllZCBwb3J0IHdoZW4gc2VydmUoKSBpcwogICAgKiBjYWxsZWQgb24gaXQsIGNyZWF0ZVNlcnZlcigpIG1heSBiZSBjYWxsZWQgYWdhaW4gb24gYSBkaWZmZXJlbnQgcG9ydC4KICAgICovCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8c2VydmVyOjpUU2VydmVyPiBjcmVhdGVTZXJ2ZXIodWludDE2X3QgcG9ydCkgPSAwOworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxzZXJ2ZXI6OlRTZXJ2ZXI+IGNyZWF0ZVNlcnZlcih1aW50MTZfdCBwb3J0KSA9IDA7CiAKICAgLyoqCiAgICAqIEdldCB0aGUgVFNlcnZlckV2ZW50SGFuZGxlciB0byBzZXQgb24gdGhlIHNlcnZlci4KQEAgLTUyLDggKzUyLDggQEAKICAgICogc3RhcnQgc2VydmluZyB0cmFmZmljLiAgSXQgaXMgaW52b2tlZCBmcm9tIHRoZSBzZXJ2ZXIgdGhyZWFkLCByYXRoZXIgdGhhbgogICAgKiB0aGUgbWFpbiB0aHJlYWQuCiAgICAqLwotICB2aXJ0dWFsIGJvb3N0OjpzaGFyZWRfcHRyPHNlcnZlcjo6VFNlcnZlckV2ZW50SGFuZGxlcj4gZ2V0U2VydmVyRXZlbnRIYW5kbGVyKCkgewotICAgIHJldHVybiBib29zdDo6c2hhcmVkX3B0cjxzZXJ2ZXI6OlRTZXJ2ZXJFdmVudEhhbmRsZXI+KCk7CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPHNlcnZlcjo6VFNlcnZlckV2ZW50SGFuZGxlcj4gZ2V0U2VydmVyRXZlbnRIYW5kbGVyKCkgeworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8c2VydmVyOjpUU2VydmVyRXZlbnRIYW5kbGVyPigpOwogICB9CiAKICAgLyoqCkBAIC03MCw5ICs3MCw4IEBACiAgKi8KIGNsYXNzIFNlcnZlclRocmVhZCB7CiBwdWJsaWM6Ci0gIFNlcnZlclRocmVhZChjb25zdCBib29zdDo6c2hhcmVkX3B0cjxTZXJ2ZXJTdGF0ZT4mIHN0YXRlLCBib29sIGF1dG9TdGFydCkKLSAgICA6IGhlbHBlcl8obmV3IEhlbHBlcih0aGlzKSksCi0gICAgICBwb3J0XygwKSwKKyAgU2VydmVyVGhyZWFkKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxTZXJ2ZXJTdGF0ZT4mIHN0YXRlLCBib29sIGF1dG9TdGFydCkKKyAgICA6IHBvcnRfKDApLAogICAgICAgcnVubmluZ18oZmFsc2UpLAogICAgICAgc2VydmluZ18oZmFsc2UpLAogICAgICAgZXJyb3JfKGZhbHNlKSwKQEAgLTExNyw3ICsxMTYsNyBAQAogICB2b2lkIHJ1bigpOwogICB2b2lkIHByZVNlcnZlKCk7CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8SGVscGVyPiBoZWxwZXJfOworICBzdGQ6OnNoYXJlZF9wdHI8SGVscGVyPiBoZWxwZXJfOwogCiAgIHVpbnQxNl90IHBvcnRfOwogICBib29sIHJ1bm5pbmdfOwpAQCAtMTI1LDkgKzEyNCw5IEBACiAgIGJvb2wgZXJyb3JfOwogICBjb25jdXJyZW5jeTo6TW9uaXRvciBzZXJ2ZXJNb25pdG9yXzsKIAotICBib29zdDo6c2hhcmVkX3B0cjxTZXJ2ZXJTdGF0ZT4gc2VydmVyU3RhdGVfOwotICBib29zdDo6c2hhcmVkX3B0cjxzZXJ2ZXI6OlRTZXJ2ZXI+IHNlcnZlcl87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPGNvbmN1cnJlbmN5OjpUaHJlYWQ+IHRocmVhZF87CisgIHN0ZDo6c2hhcmVkX3B0cjxTZXJ2ZXJTdGF0ZT4gc2VydmVyU3RhdGVfOworICBzdGQ6OnNoYXJlZF9wdHI8c2VydmVyOjpUU2VydmVyPiBzZXJ2ZXJfOworICBzdGQ6OnNoYXJlZF9wdHI8Y29uY3VycmVuY3k6OlRocmVhZD4gdGhyZWFkXzsKIH07CiB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvcXQvVFFUY3BTZXJ2ZXJUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9xdC9UUVRjcFNlcnZlclRlc3QuY3BwCmluZGV4IDc5YzBkZmMuLjU4ZDBjNmQgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9xdC9UUVRjcFNlcnZlclRlc3QuY3BwCisrKyBiL2xpYi9jcHAvdGVzdC9xdC9UUVRjcFNlcnZlclRlc3QuY3BwCkBAIC0xLDg1ICsxLDEwOSBAQAogI2RlZmluZSBCT09TVF9URVNUX01PRFVMRSBUUVRjcFNlcnZlclRlc3QKICNpbmNsdWRlIDxRVGVzdD4KLSNpbmNsdWRlIDxib29zdC9zbWFydF9wdHIuaHBwPgogI2luY2x1ZGUgPGlvc3RyZWFtPgogCiAjaW5jbHVkZSA8UVRjcFNlcnZlcj4KICNpbmNsdWRlIDxRVGNwU29ja2V0PgogI2luY2x1ZGUgPFFIb3N0QWRkcmVzcz4KKyNpbmNsdWRlIDxRVGhyZWFkPgogCi0jaW5jbHVkZSAidGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oIgotI2luY2x1ZGUgInRocmlmdC9hc3luYy9UQXN5bmNQcm9jZXNzb3IuaCIKLSNpbmNsdWRlICJ0aHJpZnQvcXQvVFFUY3BTZXJ2ZXIuaCIKLSNpbmNsdWRlICJ0aHJpZnQvcXQvVFFJT0RldmljZVRyYW5zcG9ydC5oIgorI2lmbmRlZiBRX01PQ19SVU4KKyAgI2luY2x1ZGUgInRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaCIKKyAgI2luY2x1ZGUgInRocmlmdC9hc3luYy9UQXN5bmNQcm9jZXNzb3IuaCIKKyAgI2luY2x1ZGUgInRocmlmdC9xdC9UUVRjcFNlcnZlci5oIgorICAjaW5jbHVkZSAidGhyaWZ0L3F0L1RRSU9EZXZpY2VUcmFuc3BvcnQuaCIKIAotI2luY2x1ZGUgImdlbi1jcHAvUGFyZW50U2VydmljZS5oIgorICAjaW5jbHVkZSAiZ2VuLWNwcC9QYXJlbnRTZXJ2aWNlLmgiCisjZW5kaWYKIAogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwogCiBzdHJ1Y3QgQXN5bmNIYW5kbGVyIDogcHVibGljIHRlc3Q6OlBhcmVudFNlcnZpY2VDb2JTdklmIHsKICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHN0cmluZ3M7Ci0gIHZpcnR1YWwgdm9pZCBhZGRTdHJpbmcodGN4eDo6ZnVuY3Rpb248dm9pZCgpPiBjb2IsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzKSB7CisgIHZpcnR1YWwgdm9pZCBhZGRTdHJpbmcoc3RkOjpmdW5jdGlvbjx2b2lkKCk+IGNvYiwgY29uc3Qgc3RkOjpzdHJpbmcmIHMpIHsKICAgICBzdHJpbmdzLnB1c2hfYmFjayhzKTsKICAgICBjb2IoKTsKICAgfQotICB2aXJ0dWFsIHZvaWQgZ2V0U3RyaW5ncyh0Y3h4OjpmdW5jdGlvbjx2b2lkKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjb25zdCYgX3JldHVybik+IGNvYikgeworICB2aXJ0dWFsIHZvaWQgZ2V0U3RyaW5ncyhzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNvbnN0JiBfcmV0dXJuKT4gY29iKSB7CiAgICAgY29iKHN0cmluZ3MpOwogICB9CiAKICAgLy8gT3ZlcnJpZGVzIG5vdCB1c2VkIGluIHRoaXMgdGVzdAotICB2aXJ0dWFsIHZvaWQgaW5jcmVtZW50R2VuZXJhdGlvbih0Y3h4OjpmdW5jdGlvbjx2b2lkKGludDMyX3QgY29uc3QmIF9yZXR1cm4pPiBjb2IpIHt9Ci0gIHZpcnR1YWwgdm9pZCBnZXRHZW5lcmF0aW9uKHRjeHg6OmZ1bmN0aW9uPHZvaWQoaW50MzJfdCBjb25zdCYgX3JldHVybik+IGNvYikge30KLSAgdmlydHVhbCB2b2lkIGdldERhdGFXYWl0KHRjeHg6OmZ1bmN0aW9uPHZvaWQoc3RkOjpzdHJpbmcgY29uc3QmIF9yZXR1cm4pPiBjb2IsCisgIHZpcnR1YWwgdm9pZCBpbmNyZW1lbnRHZW5lcmF0aW9uKHN0ZDo6ZnVuY3Rpb248dm9pZChpbnQzMl90IGNvbnN0JiBfcmV0dXJuKT4gY29iKSB7fQorICB2aXJ0dWFsIHZvaWQgZ2V0R2VuZXJhdGlvbihzdGQ6OmZ1bmN0aW9uPHZvaWQoaW50MzJfdCBjb25zdCYgX3JldHVybik+IGNvYikge30KKyAgdmlydHVhbCB2b2lkIGdldERhdGFXYWl0KHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6OnN0cmluZyBjb25zdCYgX3JldHVybik+IGNvYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgbGVuZ3RoKSB7fQotICB2aXJ0dWFsIHZvaWQgb25ld2F5V2FpdCh0Y3h4OjpmdW5jdGlvbjx2b2lkKCk+IGNvYikge30KKyAgdmlydHVhbCB2b2lkIG9uZXdheVdhaXQoc3RkOjpmdW5jdGlvbjx2b2lkKCk+IGNvYikge30KICAgdmlydHVhbCB2b2lkIGV4Y2VwdGlvbldhaXQoCi0gICAgICB0Y3h4OjpmdW5jdGlvbjx2b2lkKCk+IGNvYiwKLSAgICAgIHRjeHg6OmZ1bmN0aW9uPHZvaWQoOjphcGFjaGU6OnRocmlmdDo6VERlbGF5ZWRFeGNlcHRpb24qIF90aHJvdyk+IC8qIGV4bl9jb2IgKi8sCisgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gY29iLAorICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKDo6YXBhY2hlOjp0aHJpZnQ6OlREZWxheWVkRXhjZXB0aW9uKiBfdGhyb3cpPiAvKiBleG5fY29iICovLAogICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIHt9Ci0gIHZpcnR1YWwgdm9pZCB1bmV4cGVjdGVkRXhjZXB0aW9uV2FpdCh0Y3h4OjpmdW5jdGlvbjx2b2lkKCk+IGNvYiwgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIHt9CisgIHZpcnR1YWwgdm9pZCB1bmV4cGVjdGVkRXhjZXB0aW9uV2FpdChzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gY29iLCBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkge30KIH07CiAKIGNsYXNzIFRRVGNwU2VydmVyVGVzdCA6IHB1YmxpYyBRT2JqZWN0IHsKLSAgdm9pZCBpbml0KCkgewotICAgIC8vIHNldHVwIHNlcnZlcgotICAgIHNlcnZlclNvY2tldC5yZXNldChuZXcgUVRjcFNlcnZlcik7Ci0gICAgc2VydmVyLnJlc2V0KG5ldyBhc3luYzo6VFFUY3BTZXJ2ZXIoc2VydmVyU29ja2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjptYWtlX3NoYXJlZDx0ZXN0OjpQYXJlbnRTZXJ2aWNlQXN5bmNQcm9jZXNzb3I+KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6bWFrZV9zaGFyZWQ8QXN5bmNIYW5kbGVyPigpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6bWFrZV9zaGFyZWQ8cHJvdG9jb2w6OlRCaW5hcnlQcm90b2NvbEZhY3Rvcnk+KCkpKTsKLSAgICBRVkVSSUZZKHNlcnZlclNvY2tldC0+bGlzdGVuKFFIb3N0QWRkcmVzczo6TG9jYWxIb3N0KSk7Ci0gICAgaW50IHBvcnQgPSBzZXJ2ZXJTb2NrZXQtPnNlcnZlclBvcnQoKTsKLSAgICBRVkVSSUZZKHBvcnQgPiAwKTsKKyAgUV9PQkpFQ1QKIAotICAgIC8vIHNldHVwIGNsaWVudAotICAgIHNvY2tldC5yZXNldChuZXcgUVRjcFNvY2tldCk7Ci0gICAgY2xpZW50LnJlc2V0KG5ldyB0ZXN0OjpQYXJlbnRTZXJ2aWNlQ2xpZW50KGJvb3N0OjptYWtlX3NoYXJlZDxwcm90b2NvbDo6VEJpbmFyeVByb3RvY29sPigKLSAgICAgICAgYm9vc3Q6Om1ha2Vfc2hhcmVkPHRyYW5zcG9ydDo6VFFJT0RldmljZVRyYW5zcG9ydD4oc29ja2V0KSkpKTsKLSAgICBzb2NrZXQtPmNvbm5lY3RUb0hvc3QoUUhvc3RBZGRyZXNzOjpMb2NhbEhvc3QsIHBvcnQpOwotICAgIFFWRVJJRlkoc29ja2V0LT53YWl0Rm9yQ29ubmVjdGVkKCkpOwotICB9Citwcml2YXRlIHNsb3RzOgorICB2b2lkIGluaXRUZXN0Q2FzZSgpOworICB2b2lkIGNsZWFudXBUZXN0Q2FzZSgpOworICB2b2lkIHRlc3RfY29tbXVuaWNhdGUoKTsKIAotICB2b2lkIGNsZWFudXAoKSB7Ci0gICAgc29ja2V0LT5jbG9zZSgpOwotICAgIHNlcnZlclNvY2tldC0+Y2xvc2UoKTsKLSAgfQotCi0gIHZvaWQgdGVzdF9jb21tdW5pY2F0ZSgpIHsKLSAgICBjbGllbnQtPmFkZFN0cmluZygiZm9vIik7Ci0gICAgY2xpZW50LT5hZGRTdHJpbmcoImJhciIpOwotCi0gICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHJlcGx5OwotICAgIGNsaWVudC0+Z2V0U3RyaW5ncyhyZXBseSk7Ci0gICAgUUNPTVBBUkUocmVwbHlbMF0sICJmb28iKTsKLSAgICBRQ09NUEFSRShyZXBseVsxXSwgImZvbyIpOwotICB9Ci0KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8UVRjcFNlcnZlcj4gc2VydmVyU29ja2V0OwotICBib29zdDo6c2hhcmVkX3B0cjxhc3luYzo6VFFUY3BTZXJ2ZXI+IHNlcnZlcjsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8UVRjcFNvY2tldD4gc29ja2V0OwotICBib29zdDo6c2hhcmVkX3B0cjx0ZXN0OjpQYXJlbnRTZXJ2aWNlQ2xpZW50PiBjbGllbnQ7Citwcml2YXRlOgorICBzdGQ6OnNoYXJlZF9wdHI8UVRocmVhZD4gc2VydmVyVGhyZWFkOworICBzdGQ6OnNoYXJlZF9wdHI8YXN5bmM6OlRRVGNwU2VydmVyPiBzZXJ2ZXI7CisgIHN0ZDo6c2hhcmVkX3B0cjx0ZXN0OjpQYXJlbnRTZXJ2aWNlQ2xpZW50PiBjbGllbnQ7CiB9OwogCit2b2lkIFRRVGNwU2VydmVyVGVzdDo6aW5pdFRlc3RDYXNlKCkgeworICAvLyBzZXR1cCBzZXJ2ZXIKKyAgc3RkOjpzaGFyZWRfcHRyPFFUY3BTZXJ2ZXI+IHNlcnZlclNvY2tldCA9IHN0ZDo6bWFrZV9zaGFyZWQ8UVRjcFNlcnZlcj4oKTsKKyAgc2VydmVyLnJlc2V0KG5ldyBhc3luYzo6VFFUY3BTZXJ2ZXIoc2VydmVyU29ja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPHRlc3Q6OlBhcmVudFNlcnZpY2VBc3luY1Byb2Nlc3Nvcj4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QXN5bmNIYW5kbGVyPigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxwcm90b2NvbDo6VEJpbmFyeVByb3RvY29sRmFjdG9yeT4oKSkpOworICBRVkVSSUZZKHNlcnZlclNvY2tldC0+bGlzdGVuKFFIb3N0QWRkcmVzczo6TG9jYWxIb3N0KSk7CisgIGludCBwb3J0ID0gc2VydmVyU29ja2V0LT5zZXJ2ZXJQb3J0KCk7CisgIFFWRVJJRlkocG9ydCA+IDApOworCisgIC8vc2V0dXAgc2VydmVyIHRocmVhZCBhbmQgbW92ZSBzZXJ2ZXIgdG8gaXQKKyAgc2VydmVyVGhyZWFkLnJlc2V0KG5ldyBRVGhyZWFkKCkpOworICBzZXJ2ZXJTb2NrZXQtPm1vdmVUb1RocmVhZChzZXJ2ZXJUaHJlYWQuZ2V0KCkpOworICBzZXJ2ZXItPm1vdmVUb1RocmVhZChzZXJ2ZXJUaHJlYWQuZ2V0KCkpOworICBzZXJ2ZXJUaHJlYWQtPnN0YXJ0KCk7CisKKyAgLy8gc2V0dXAgY2xpZW50CisgIHN0ZDo6c2hhcmVkX3B0cjxRVGNwU29ja2V0PiBzb2NrZXQgPSBzdGQ6Om1ha2Vfc2hhcmVkPFFUY3BTb2NrZXQ+KCk7CisgIGNsaWVudC5yZXNldChuZXcgdGVzdDo6UGFyZW50U2VydmljZUNsaWVudChzdGQ6Om1ha2Vfc2hhcmVkPHByb3RvY29sOjpUQmluYXJ5UHJvdG9jb2w+KAorICAgICAgc3RkOjptYWtlX3NoYXJlZDx0cmFuc3BvcnQ6OlRRSU9EZXZpY2VUcmFuc3BvcnQ+KHNvY2tldCkpKSk7CisgIHNvY2tldC0+Y29ubmVjdFRvSG9zdChRSG9zdEFkZHJlc3M6OkxvY2FsSG9zdCwgcG9ydCk7CisgIFFWRVJJRlkoc29ja2V0LT53YWl0Rm9yQ29ubmVjdGVkKCkpOworfQorCit2b2lkIFRRVGNwU2VydmVyVGVzdDo6Y2xlYW51cFRlc3RDYXNlKCkgeworICAvL2ZpcnN0LCBzdG9wIHRoZSB0aHJlYWQgd2hpY2ggaG9sZHMgdGhlIHNlcnZlcgorICBzZXJ2ZXJUaHJlYWQtPnF1aXQoKTsKKyAgc2VydmVyVGhyZWFkLT53YWl0KCk7CisgIC8vIG5vdywgaXQgaXMgc2FmZSB0byBkZWxldGUgdGhlIHNlcnZlcgorICBzZXJ2ZXIucmVzZXQoKTsKKyAgLy8gZGVsZXRlIHRocmVhZCBub3cKKyAgc2VydmVyVGhyZWFkLnJlc2V0KCk7CisKKyAgLy8gY2xlYW51cCBjbGllbnQKKyAgY2xpZW50LnJlc2V0KCk7Cit9CisKK3ZvaWQgVFFUY3BTZXJ2ZXJUZXN0Ojp0ZXN0X2NvbW11bmljYXRlKCkgeworICBjbGllbnQtPmFkZFN0cmluZygiZm9vIik7CisgIGNsaWVudC0+YWRkU3RyaW5nKCJiYXIiKTsKKworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcmVwbHk7CisgIGNsaWVudC0+Z2V0U3RyaW5ncyhyZXBseSk7CisgIFFDT01QQVJFKFFTdHJpbmc6OmZyb21TdGRTdHJpbmcocmVwbHlbMF0pLCBRU3RyaW5nKCJmb28iKSk7CisgIFFDT01QQVJFKFFTdHJpbmc6OmZyb21TdGRTdHJpbmcocmVwbHlbMV0pLCBRU3RyaW5nKCJiYXIiKSk7Cit9CisKKwogI2lmIChRVF9WRVJTSU9OID49IFFUX1ZFUlNJT05fQ0hFQ0soNSwgMCwgMCkpCiBRVEVTVF9HVUlMRVNTX01BSU4oVFFUY3BTZXJ2ZXJUZXN0KTsKICNlbHNlCmRpZmYgLS1naXQgYS9saWIvY3BwL3RocmlmdC5zbG4gYi9saWIvY3BwL3RocmlmdC5zbG4KaW5kZXggODhkNzk2OC4uY2IwZjQ1NSAxMDA2NDQKLS0tIGEvbGliL2NwcC90aHJpZnQuc2xuCisrKyBiL2xpYi9jcHAvdGhyaWZ0LnNsbgpAQCAtNyw3ICs3LDcgQEAKIEVuZFByb2plY3QKIFByb2plY3QoInsyMTUwRTMzMy04RkRDLTQyQTMtOTQ3NC0xQTM5NTZENDZERTh9IikgPSAiZG9jIiwgImRvYyIsICJ7MDA2OTg0RTAtN0NDMS00N0UyLUFDRDItQTQwRkU0RDM4NjkzfSIKIAlQcm9qZWN0U2VjdGlvbihTb2x1dGlvbkl0ZW1zKSA9IHByZVByb2plY3QKLQkJUkVBRE1FX1dJTkRPV1MgPSBSRUFETUVfV0lORE9XUworCQlSRUFETUUubWQgPSBSRUFETUUubWQKIAlFbmRQcm9qZWN0U2VjdGlvbgogRW5kUHJvamVjdAogR2xvYmFsCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL01ha2VmaWxlLmFtIGIvbGliL2NzaGFycC9NYWtlZmlsZS5hbQppbmRleCA2MTE0MDVkLi41NmE4YjBmIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL01ha2VmaWxlLmFtCisrKyBiL2xpYi9jc2hhcnAvTWFrZWZpbGUuYW0KQEAgLTE3LDkgKzE3LDkgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLVNVQkRJUlMgPSAuIHRlc3QvVGhyaWZ0VGVzdAorU1VCRElSUyA9IC4gdGVzdC9NdWx0aXBsZXgKIAotVEhSSUZUQ09ERT0gXAorVEhSSUZUQ09ERSA9IFwKICAgICAgICAgICAgIHNyYy9Db2xsZWN0aW9ucy9USGFzaFNldC5jcyBcCiAgICAgICAgICAgICBzcmMvQ29sbGVjdGlvbnMvVENvbGxlY3Rpb25zLmNzIFwKICAgICAgICAgICAgIHNyYy9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBcCkBAIC01Miw2ICs1Miw3IEBACiAgICAgICAgICAgICBzcmMvVHJhbnNwb3J0L1RCdWZmZXJlZFRyYW5zcG9ydC5jcyBcCiAgICAgICAgICAgICBzcmMvVHJhbnNwb3J0L1RUcmFuc3BvcnQuY3MgXAogICAgICAgICAgICAgc3JjL1RyYW5zcG9ydC9UU29ja2V0LmNzIFwKKyAgICAgICAgICAgIHNyYy9UcmFuc3BvcnQvVFNvY2tldFZlcnNpb25pemVyLmNzIFwKICAgICAgICAgICAgIHNyYy9UcmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5jcyBcCiAgICAgICAgICAgICBzcmMvVHJhbnNwb3J0L1RTdHJlYW1UcmFuc3BvcnQuY3MgXAogICAgICAgICAgICAgc3JjL1RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LmNzIFwKQEAgLTY2LDQzICs2Nyw0OSBAQAogICAgICAgICAgICAgc3JjL1RyYW5zcG9ydC9UVExTU29ja2V0LmNzIFwKICAgICAgICAgICAgIHNyYy9UcmFuc3BvcnQvVFRMU1NlcnZlclNvY2tldC5jcyBcCiAgICAgICAgICAgICBzcmMvVFByb2Nlc3Nvci5jcyBcCisgICAgICAgICAgICBzcmMvVFByb2Nlc3NvckZhY3RvcnkuY3MgXAorICAgICAgICAgICAgc3JjL1RTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5LmNzIFwKKyAgICAgICAgICAgIHNyYy9UUHJvdG90eXBlUHJvY2Vzc29yRmFjdG9yeS5jcyBcCisgICAgICAgICAgICBzcmMvVENvbnRyb2xsaW5nSGFuZGxlci5jcyBcCiAgICAgICAgICAgICBzcmMvVEV4Y2VwdGlvbi5jcyBcCiAgICAgICAgICAgICBzcmMvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNzCiAKIGlmIE1PTk9fTUNTCi1DU0M9bWNzCitleHBvcnQgQ1NDID0gbWNzCiBlbHNlCi1DU0M9Z21jcworZXhwb3J0IENTQyA9IGdtY3MKIGVuZGlmCiAKIGlmIE5FVF8yXzAKLU1PTk9fREVGSU5FUz0vZDpORVRfMl8wCitleHBvcnQgQ1NDX0RFRklORVMgPSAtZDpORVRfMl8wCiBlbmRpZgogCi1hbGwtbG9jYWw6IFRocmlmdC5kbGwKK2FsbC1sb2NhbDogVGhyaWZ0LmRsbCBUaHJpZnQuNDUuZGxsCiAKIFRocmlmdC5kbGw6ICQoVEhSSUZUQ09ERSkKLQkkKENTQykgJChUSFJJRlRDT0RFKSAvb3V0OlRocmlmdC5kbGwgL3RhcmdldDpsaWJyYXJ5IC9yZWZlcmVuY2U6U3lzdGVtLldlYiAkKE1PTk9fREVGSU5FUykKKwkkKENTQykgJChDU0NfREVGSU5FUykgLW91dDokQCAtdGFyZ2V0OmxpYnJhcnkgLXJlZmVyZW5jZTpTeXN0ZW0uV2ViICQoVEhSSUZUQ09ERSkKKworVGhyaWZ0LjQ1LmRsbDogJChUSFJJRlRDT0RFKQorCSQoQ1NDKSAkKENTQ19ERUZJTkVTKSAtb3V0OiRAIC10YXJnZXQ6bGlicmFyeSAtcmVmZXJlbmNlOlN5c3RlbS5XZWIgJChUSFJJRlRDT0RFKQogCiBjbGVhbi1sb2NhbDoKLQkkKFJNKSBUaHJpZnQuZGxsCi0KLXByZWNyb3NzOgotCSQoTUFLRSkgLUMgdGVzdC9UaHJpZnRUZXN0IHByZWNyb3NzCi0KLSMgcnVuIGNzaGFycCB0ZXN0cz8KLSMgY2hlY2s6Ci0jIAljZCB0ZXN0L1RocmlmdFRlc3QgJiYgLi9tYWtldGVzdC5zaAotIyAJY2QgdGVzdC9NdWx0aXBsZXggJiYgLi9tYWtldGVzdC5zaAorCSQoUk0pIFRocmlmdC5kbGwgIFwKKwkkKFJNKSBUaHJpZnQuNDUuZGxsCiAKIEVYVFJBX0RJU1QgPSBcCi0gICAgICAgICAgICAgJChUSFJJRlRDT0RFKSBcCi0gICAgICAgICAgICAgVGhyaWZ0TVNCdWlsZFRhc2sgXAotICAgICAgICAgICAgIHNyYy9UaHJpZnQuY3Nwcm9qIFwKLSAgICAgICAgICAgICBzcmMvVGhyaWZ0LnNsbiBcCi0gICAgICAgICAgICAgc3JjL1RocmlmdC5XUDcuY3Nwcm9qIFwKLSAgICAgICAgICAgICBzcmMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uV1A3LmNzIFwKLSAgICAgICAgICAgICBzcmMvVHJhbnNwb3J0L1RTaWx2ZXJsaWdodFNvY2tldC5jcyBcCi0gICAgICAgICAgICAgdGVzdCBcCi0gICAgICAgICAgICAgY29kaW5nX3N0YW5kYXJkcy5tZCBcCi0gICAgICAgICAgICAgUkVBRE1FLm1kCisJJChUSFJJRlRDT0RFKSBcCisJVGhyaWZ0TVNCdWlsZFRhc2sgXAorCXNyYy9UaHJpZnQuY3Nwcm9qIFwKKwlzcmMvVGhyaWZ0LjQ1LmNzcHJvaiBcCisJc3JjL1RocmlmdC5zbG4gXAorCXNyYy9OZXQzNS9FeHRlbnNpb25zTmV0MzUuY3MgXAorCXNyYy9UcmFuc3BvcnQvVFNpbHZlcmxpZ2h0U29ja2V0LmNzIFwKKwlzcmMvVHJhbnNwb3J0L1RIdHRwVGFza0FzeW5jSGFuZGxlci5jcyBcCisJc3JjL1RBc3luY1Byb2Nlc3Nvci5jcyBcCisJdGVzdCBcCisJY29kaW5nX3N0YW5kYXJkcy5tZCBcCisJUkVBRE1FLm1kCisKK01BSU5UQUlORVJDTEVBTkZJTEVTID0gXAorCU1ha2VmaWxlIFwKKwlNYWtlZmlsZS5pbgpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9UaHJpZnRNU0J1aWxkVGFzay9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL2xpYi9jc2hhcnAvVGhyaWZ0TVNCdWlsZFRhc2svUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKaW5kZXggN2IwNzRmMC4uYzc0MWI3MiAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9UaHJpZnRNU0J1aWxkVGFzay9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcworKysgYi9saWIvY3NoYXJwL1RocmlmdE1TQnVpbGRUYXNrL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCkBAIC01Niw1ICs1Niw1IEBACiAvLyBZb3UgY2FuIHNwZWNpZnkgYWxsIHRoZSB2YWx1ZXMgb3IgeW91IGNhbiBkZWZhdWx0IHRoZSBCdWlsZCBhbmQgUmV2aXNpb24gTnVtYmVycwogLy8gYnkgdXNpbmcgdGhlICcqJyBhcyBzaG93biBiZWxvdzoKIC8vIFthc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuKiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjAuOS4zLioiKV0KLVthc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMC45LjMuKiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4wLioiKV0KK1thc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMS4wLjAuKiIpXQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9UaHJpZnRNU0J1aWxkVGFzay9UaHJpZnRNU0J1aWxkVGFzay5jc3Byb2ogYi9saWIvY3NoYXJwL1RocmlmdE1TQnVpbGRUYXNrL1RocmlmdE1TQnVpbGRUYXNrLmNzcHJvagppbmRleCBhZTg2MDgxLi5hMzE5ZGYyIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL1RocmlmdE1TQnVpbGRUYXNrL1RocmlmdE1TQnVpbGRUYXNrLmNzcHJvagorKysgYi9saWIvY3NoYXJwL1RocmlmdE1TQnVpbGRUYXNrL1RocmlmdE1TQnVpbGRUYXNrLmNzcHJvagpAQCAtNDUsNyArNDUsNyBAQAogICAgIDxVcGRhdGVSZXF1aXJlZD5mYWxzZTwvVXBkYXRlUmVxdWlyZWQ+CiAgICAgPE1hcEZpbGVFeHRlbnNpb25zPnRydWU8L01hcEZpbGVFeHRlbnNpb25zPgogICAgIDxBcHBsaWNhdGlvblJldmlzaW9uPjA8L0FwcGxpY2F0aW9uUmV2aXNpb24+Ci0gICAgPEFwcGxpY2F0aW9uVmVyc2lvbj4xLjAuMC4lMmE8L0FwcGxpY2F0aW9uVmVyc2lvbj4KKyAgICA8QXBwbGljYXRpb25WZXJzaW9uPjEuMC4wLjA8L0FwcGxpY2F0aW9uVmVyc2lvbj4KICAgICA8SXNXZWJCb290c3RyYXBwZXI+ZmFsc2U8L0lzV2ViQm9vdHN0cmFwcGVyPgogICAgIDxVc2VBcHBsaWNhdGlvblRydXN0PmZhbHNlPC9Vc2VBcHBsaWNhdGlvblRydXN0PgogICAgIDxCb290c3RyYXBwZXJFbmFibGVkPnRydWU8L0Jvb3RzdHJhcHBlckVuYWJsZWQ+CkBAIC0xMTUsNCArMTE1LDQgQEAKICAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4KICAgPC9UYXJnZXQ+CiAgIC0tPgotPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL0NvbGxlY3Rpb25zL1RDb2xsZWN0aW9ucy5jcyBiL2xpYi9jc2hhcnAvc3JjL0NvbGxlY3Rpb25zL1RDb2xsZWN0aW9ucy5jcwppbmRleCBmMGJiMWRlLi44NGFmYjZhIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9Db2xsZWN0aW9ucy9UQ29sbGVjdGlvbnMuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvQ29sbGVjdGlvbnMvVENvbGxlY3Rpb25zLmNzCkBAIC03OSw3ICs3OSw3IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGludCBoYXNoY29kZSA9IDA7Ci0gICAgICAgICAgICBmb3JlYWNoIChPYmplY3Qgb2JqIGluIGVudW1lcmFibGUpCisgICAgICAgICAgICBmb3JlYWNoIChvYmplY3Qgb2JqIGluIGVudW1lcmFibGUpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgSUVudW1lcmFibGUgZW51bTIgPSBvYmogYXMgSUVudW1lcmFibGU7CiAgICAgICAgICAgICAgICAgaW50IG9iakhhc2ggPSBlbnVtMiA9PSBudWxsID8gb2JqLkdldEhhc2hDb2RlICgpIDogR2V0SGFzaENvZGUgKGVudW0yKTsKQEAgLTkxLDQgKzkxLDQgQEAKICAgICAgICAgICAgIHJldHVybiBoYXNoY29kZTsKICAgICAgICAgfQogICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9OZXQzNS9FeHRlbnNpb25zTmV0MzUuY3MgYi9saWIvY3NoYXJwL3NyYy9OZXQzNS9FeHRlbnNpb25zTmV0MzUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNhNDIzMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvc3JjL05ldDM1L0V4dGVuc2lvbnNOZXQzNS5jcwpAQCAtMCwwICsxLDMxIEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7CisKKyNpZiAoIU5FVDQ1KQorbmFtZXNwYWNlIFRocmlmdAoreworICAgIHN0YXRpYyBjbGFzcyBTdHJlYW1FeHRlbnNpb25zTmV0MzUKKyAgICB7CisgICAgICAgIC8vIENvcHlUbygpIGhhcyBiZWVuIGFkZGVkIGluIDQuMAorICAgICAgICBwdWJsaWMgc3RhdGljIGxvbmcgQ29weVRvKHRoaXMgU3RyZWFtIHNvdXJjZSwgU3RyZWFtIHRhcmdldCkKKyAgICAgICAgeworICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzgxOTJdOyAgLy8gbXVsdGlwbGUgb2YgNDA5NgorICAgICAgICAgICAgbG9uZyBuVG90YWwgPSAwOworICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IG5SZWFkID0gc291cmNlLlJlYWQoYnVmZmVyLCAwLCBidWZmZXIuTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoblJlYWQgPD0gMCkgIC8vIGRvbmU/CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuVG90YWw7CisKKyAgICAgICAgICAgICAgICB0YXJnZXQuV3JpdGUoYnVmZmVyLCAwLCBuUmVhZCk7CisgICAgICAgICAgICAgICAgblRvdGFsICs9IG5SZWFkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCit9CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uV1A3LmNzIGIvbGliL2NzaGFycC9zcmMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uV1A3LmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjM3NTA2Li4wMDAwMDAwCi0tLSBhL2xpYi9jc2hhcnAvc3JjL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLldQNy5jcworKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLe+7vy8qKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXVzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwotdXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsKLXVzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKLQotLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZwotLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KLS8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KLVthc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiVGhyaWZ0LldQNyIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCJDIyBiaW5kaW5ncyBmb3IgdGhlIEFwYWNoZSBUaHJpZnQgUlBDIHN5c3RlbSIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIlRocmlmdCIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KLVthc3NlbWJseTogQXNzZW1ibHlDdWx0dXJlKCIiKV0KLS8vQFRPRE8gd2hlcmUgdG8gcHV0IExpY2Vuc2UgaW5mb3JtYXRpb24/Ci0KLS8vIFNldHRpbmcgQ29tVmlzaWJsZSB0byBmYWxzZSBtYWtlcyB0aGUgdHlwZXMgaW4gdGhpcyBhc3NlbWJseSBub3QgdmlzaWJsZQotLy8gdG8gQ09NIGNvbXBvbmVudHMuICBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgYSB0eXBlIGluIHRoaXMgYXNzZW1ibHkgZnJvbQotLy8gQ09NLCBzZXQgdGhlIENvbVZpc2libGUgYXR0cmlidXRlIHRvIHRydWUgb24gdGhhdCB0eXBlLgotW2Fzc2VtYmx5OiBDb21WaXNpYmxlKGZhbHNlKV0KLQotLy8gVGhlIGZvbGxvd2luZyBHVUlEIGlzIGZvciB0aGUgSUQgb2YgdGhlIHR5cGVsaWIgaWYgdGhpcyBwcm9qZWN0IGlzIGV4cG9zZWQgdG8gQ09NCi1bYXNzZW1ibHk6IEd1aWQoImEzNDNmODljLTU3ZGQtNGZhOC1hOWM2LTM1MzkxY2Q1ZjY1NSIpXQotCi0vLyBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciBhbiBhc3NlbWJseSBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIGZvdXIgdmFsdWVzOgotLy8KLS8vICAgICAgTWFqb3IgVmVyc2lvbgotLy8gICAgICBNaW5vciBWZXJzaW9uCi0vLyAgICAgIEJ1aWxkIE51bWJlcgotLy8gICAgICBSZXZpc2lvbgotLy8KLS8vIFlvdSBjYW4gc3BlY2lmeSBhbGwgdGhlIHZhbHVlcyBvciB5b3UgY2FuIGRlZmF1bHQgdGhlIEJ1aWxkIGFuZCBSZXZpc2lvbiBOdW1iZXJzCi0vLyBieSB1c2luZyB0aGUgJyonIGFzIHNob3duIGJlbG93OgotW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjAuOS4zLjAiKV0KLVthc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMC45LjMuMCIpXQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwppbmRleCAwOTAxMjZlLi43ZTg2NzgxIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcworKysgYi9saWIvY3NoYXJwL3NyYy9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtNTEsNSArNTEsNSBAQAogLy8KIC8vIFlvdSBjYW4gc3BlY2lmeSBhbGwgdGhlIHZhbHVlcyBvciB5b3UgY2FuIGRlZmF1bHQgdGhlIEJ1aWxkIGFuZCBSZXZpc2lvbiBOdW1iZXJzCiAvLyBieSB1c2luZyB0aGUgJyonIGFzIHNob3duIGJlbG93OgotW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjAuOS4zLjAiKV0KLVthc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMC45LjMuMCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4wLjAiKV0KK1thc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMS4wLjAuMCIpXQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEFic3RyYWN0QmFzZS5jcyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RBYnN0cmFjdEJhc2UuY3MKaW5kZXggYzBkNWFiZS4uZjVhNjFjZCAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEFic3RyYWN0QmFzZS5jcworKysgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UQWJzdHJhY3RCYXNlLmNzCkBAIC0yMSw5ICsyMSw5IEBACiB7CiAgICAgcHVibGljIGludGVyZmFjZSBUQWJzdHJhY3RCYXNlCiAgICAgewotICAgICAgICAvLy8KLSAgICAgICAgLy8vIFdyaXRlcyB0aGUgb2JqZWN0cyBvdXQgdG8gdGhlIHByb3RvY29sCi0gICAgICAgIC8vLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZXMgdGhlIG9iamVjdHMgb3V0IHRvIHRoZSBwcm90b2NvbC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgdm9pZCBXcml0ZShUUHJvdG9jb2wgdFByb3RvY29sKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UQmFzZS5jcyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RCYXNlLmNzCmluZGV4IDM1MGZmNDkuLjQxMWU0ZDkgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RCYXNlLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RCYXNlLmNzCkBAIC0yMSw5ICsyMSw5IEBACiB7CiAgICAgcHVibGljIGludGVyZmFjZSBUQmFzZSA6IFRBYnN0cmFjdEJhc2UKICAgICB7Ci0gICAgICAgIC8vLworICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgIC8vLyBSZWFkcyB0aGUgVE9iamVjdCBmcm9tIHRoZSBnaXZlbiBpbnB1dCBwcm90b2NvbC4KLSAgICAgICAgLy8vCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHZvaWQgUmVhZChUUHJvdG9jb2wgdFByb3RvY29sKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuY3MKaW5kZXggNGVjZWI4Ni4uYTRmYWE5NCAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5jcwpAQCAtMzYsMjkgKzM2LDI4IEBACiAgICAgICAgIHByb3RlY3RlZCBib29sIHN0cmljdFdyaXRlXyA9IHRydWU7CiAKICAgICAgICAgI3JlZ2lvbiBCaW5hcnlQcm90b2NvbCBGYWN0b3J5Ci0gICAgICAgICAvKioKLSAgICAgICAgICAqIEZhY3RvcnkKLSAgICAgICAgICAqLwotICAgICAgICAgIHB1YmxpYyBjbGFzcyBGYWN0b3J5IDogVFByb3RvY29sRmFjdG9yeSB7CiAKLSAgICAgICAgICAgICAgcHJvdGVjdGVkIGJvb2wgc3RyaWN0UmVhZF8gPSBmYWxzZTsKLSAgICAgICAgICAgICAgcHJvdGVjdGVkIGJvb2wgc3RyaWN0V3JpdGVfID0gdHJ1ZTsKKyAgICAgICAgcHVibGljIGNsYXNzIEZhY3RvcnkgOiBUUHJvdG9jb2xGYWN0b3J5CisgICAgICAgIHsKKyAgICAgICAgICAgIHByb3RlY3RlZCBib29sIHN0cmljdFJlYWRfID0gZmFsc2U7CisgICAgICAgICAgICBwcm90ZWN0ZWQgYm9vbCBzdHJpY3RXcml0ZV8gPSB0cnVlOwogCi0gICAgICAgICAgICAgIHB1YmxpYyBGYWN0b3J5KCkKLSAgICAgICAgICAgICAgICAgIDp0aGlzKGZhbHNlLCB0cnVlKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICBwdWJsaWMgRmFjdG9yeShib29sIHN0cmljdFJlYWQsIGJvb2wgc3RyaWN0V3JpdGUpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHN0cmljdFJlYWRfID0gc3RyaWN0UmVhZDsKLSAgICAgICAgICAgICAgICAgIHN0cmljdFdyaXRlXyA9IHN0cmljdFdyaXRlOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBUUHJvdG9jb2wgR2V0UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucykgewotICAgICAgICAgICAgICByZXR1cm4gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFucywgc3RyaWN0UmVhZF8sIHN0cmljdFdyaXRlXyk7CisgICAgICAgICAgICBwdWJsaWMgRmFjdG9yeSgpCisgICAgICAgICAgICAgICAgOiB0aGlzKGZhbHNlLCB0cnVlKQorICAgICAgICAgICAgewogICAgICAgICAgICAgfQotICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIEZhY3RvcnkoYm9vbCBzdHJpY3RSZWFkLCBib29sIHN0cmljdFdyaXRlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmljdFJlYWRfID0gc3RyaWN0UmVhZDsKKyAgICAgICAgICAgICAgICBzdHJpY3RXcml0ZV8gPSBzdHJpY3RXcml0ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRQcm90b2NvbCBHZXRQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zLCBzdHJpY3RSZWFkXywgc3RyaWN0V3JpdGVfKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCiAgICAgICAgICNlbmRyZWdpb24KIApAQCAtNjgsNyArNjcsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIFRCaW5hcnlQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zLCBib29sIHN0cmljdFJlYWQsIGJvb2wgc3RyaWN0V3JpdGUpCi0gICAgICAgICAgICA6YmFzZSh0cmFucykKKyAgICAgICAgICAgIDogYmFzZSh0cmFucykKICAgICAgICAgewogICAgICAgICAgICAgc3RyaWN0UmVhZF8gPSBzdHJpY3RSZWFkOwogICAgICAgICAgICAgc3RyaWN0V3JpdGVfID0gc3RyaWN0V3JpdGU7CkBAIC0zNDUsMTYgKzM0NCwxNyBAQAogICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgbG9uZyBSZWFkSTY0KCkKICAgICAgICAgewogICAgICAgICAgICAgUmVhZEFsbChpNjRpbiwgMCwgOCk7Ci0gICAgICAgICAgICB1bmNoZWNrZWQgewotICAgICAgICAgICAgICByZXR1cm4gKGxvbmcpKAotICAgICAgICAgICAgICAgICAgKChsb25nKShpNjRpblswXSAmIDB4ZmYpIDw8IDU2KSB8Ci0gICAgICAgICAgICAgICAgICAoKGxvbmcpKGk2NGluWzFdICYgMHhmZikgPDwgNDgpIHwKLSAgICAgICAgICAgICAgICAgICgobG9uZykoaTY0aW5bMl0gJiAweGZmKSA8PCA0MCkgfAotICAgICAgICAgICAgICAgICAgKChsb25nKShpNjRpblszXSAmIDB4ZmYpIDw8IDMyKSB8Ci0gICAgICAgICAgICAgICAgICAoKGxvbmcpKGk2NGluWzRdICYgMHhmZikgPDwgMjQpIHwKLSAgICAgICAgICAgICAgICAgICgobG9uZykoaTY0aW5bNV0gJiAweGZmKSA8PCAxNikgfAotICAgICAgICAgICAgICAgICAgKChsb25nKShpNjRpbls2XSAmIDB4ZmYpIDw8IDgpIHwKLSAgICAgICAgICAgICAgICAgICgobG9uZykoaTY0aW5bN10gJiAweGZmKSkpOworICAgICAgICAgICAgdW5jaGVja2VkCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChsb25nKSgKKyAgICAgICAgICAgICAgICAgICAgKChsb25nKShpNjRpblswXSAmIDB4ZmYpIDw8IDU2KSB8CisgICAgICAgICAgICAgICAgICAgICgobG9uZykoaTY0aW5bMV0gJiAweGZmKSA8PCA0OCkgfAorICAgICAgICAgICAgICAgICAgICAoKGxvbmcpKGk2NGluWzJdICYgMHhmZikgPDwgNDApIHwKKyAgICAgICAgICAgICAgICAgICAgKChsb25nKShpNjRpblszXSAmIDB4ZmYpIDw8IDMyKSB8CisgICAgICAgICAgICAgICAgICAgICgobG9uZykoaTY0aW5bNF0gJiAweGZmKSA8PCAyNCkgfAorICAgICAgICAgICAgICAgICAgICAoKGxvbmcpKGk2NGluWzVdICYgMHhmZikgPDwgMTYpIHwKKyAgICAgICAgICAgICAgICAgICAgKChsb25nKShpNjRpbls2XSAmIDB4ZmYpIDw8IDgpIHwKKyAgICAgICAgICAgICAgICAgICAgKChsb25nKShpNjRpbls3XSAmIDB4ZmYpKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMzc4LDcgKzM3OCw3IEBACiAgICAgICAgICAgICB0cmFucy5SZWFkQWxsKGJ1ZiwgMCwgc2l6ZSk7CiAgICAgICAgICAgICByZXR1cm4gYnVmOwogICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgIHN0cmluZyBSZWFkU3RyaW5nQm9keShpbnQgc2l6ZSkKKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgUmVhZFN0cmluZ0JvZHkoaW50IHNpemUpCiAgICAgICAgIHsKICAgICAgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtzaXplXTsKICAgICAgICAgICAgIHRyYW5zLlJlYWRBbGwoYnVmLCAwLCBzaXplKTsKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmNzCmluZGV4IDJiNGY2ZjEuLmZmNjczOTcgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5jcwpAQCAtNDQsOSArNDQsOSBAQAogICAgICAgICBwcml2YXRlIGNvbnN0IGJ5dGUgVFlQRV9CSVRTID0gMHgwNzsgLy8gMDAwMCAwMTExCiAgICAgICAgIHByaXZhdGUgY29uc3QgaW50IFRZUEVfU0hJRlRfQU1PVU5UID0gNTsKIAotICAgICAgICAvKioKLSAgICAgICAgICogQWxsIG9mIHRoZSBvbi13aXJlIHR5cGUgY29kZXMuCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBbGwgb2YgdGhlIG9uLXdpcmUgdHlwZSBjb2Rlcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVHlwZXMKICAgICAgICAgewogICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgU1RPUCA9IDB4MDA7CkBAIC02NCwzMiArNjQsMjkgQEAKICAgICAgICAgICAgIHB1YmxpYyBjb25zdCBieXRlIFNUUlVDVCA9IDB4MEM7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogVXNlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBsYXN0IGZpZWxkIGZvciB0aGUgY3VycmVudCBhbmQgcHJldmlvdXMgc3RydWN0cywKLSAgICAgICAgICogc28gd2UgY2FuIGRvIHRoZSBkZWx0YSBzdHVmZi4KLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFVzZWQgdG8ga2VlcCB0cmFjayBvZiB0aGUgbGFzdCBmaWVsZCBmb3IgdGhlIGN1cnJlbnQgYW5kIHByZXZpb3VzIHN0cnVjdHMsCisgICAgICAgIC8vLyBzbyB3ZSBjYW4gZG8gdGhlIGRlbHRhIHN0dWZmLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwcml2YXRlIFN0YWNrPHNob3J0PiBsYXN0RmllbGRfID0gbmV3IFN0YWNrPHNob3J0PigxNSk7CiAKICAgICAgICAgcHJpdmF0ZSBzaG9ydCBsYXN0RmllbGRJZF8gPSAwOwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBJZiB3ZSBlbmNvdW50ZXIgYSBib29sZWFuIGZpZWxkIGJlZ2luLCBzYXZlIHRoZSBURmllbGQgaGVyZSBzbyBpdCBjYW4KLSAgICAgICAgICogaGF2ZSB0aGUgdmFsdWUgaW5jb3Jwb3JhdGVkLgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSWYgd2UgZW5jb3VudGVyIGEgYm9vbGVhbiBmaWVsZCBiZWdpbiwgc2F2ZSB0aGUgVEZpZWxkIGhlcmUgc28gaXQgY2FuCisgICAgICAgIC8vLyBoYXZlIHRoZSB2YWx1ZSBpbmNvcnBvcmF0ZWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHByaXZhdGUgTnVsbGFibGU8VEZpZWxkPiBib29sZWFuRmllbGRfOwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBJZiB3ZSBSZWFkIGEgZmllbGQgaGVhZGVyLCBhbmQgaXQncyBhIGJvb2xlYW4gZmllbGQsIHNhdmUgdGhlIGJvb2xlYW4KLSAgICAgICAgICogdmFsdWUgaGVyZSBzbyB0aGF0IFJlYWRCb29sIGNhbiB1c2UgaXQuCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlICBOdWxsYWJsZTxCb29sZWFuPiBib29sVmFsdWVfOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJZiB3ZSBSZWFkIGEgZmllbGQgaGVhZGVyLCBhbmQgaXQncyBhIGJvb2xlYW4gZmllbGQsIHNhdmUgdGhlIGJvb2xlYW4KKyAgICAgICAgLy8vIHZhbHVlIGhlcmUgc28gdGhhdCBSZWFkQm9vbCBjYW4gdXNlIGl0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIE51bGxhYmxlPEJvb2xlYW4+IGJvb2xWYWx1ZV87CiAKIAogICAgICAgICAjcmVnaW9uIENvbXBhY3RQcm90b2NvbCBGYWN0b3J5CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBGYWN0b3J5Ci0gICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGNsYXNzIEZhY3RvcnkgOiBUUHJvdG9jb2xGYWN0b3J5CiAgICAgICAgIHsKICAgICAgICAgICAgIHB1YmxpYyBGYWN0b3J5KCkgeyB9CkBAIC0xMjcsMzEgKzEyNCwzMiBAQAogCiAgICAgICAgICNyZWdpb24gV3JpdGUgTWV0aG9kcwogCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFdyaXRlcyBhIGJ5dGUgd2l0aG91dCBhbnkgcG9zc2liaWxpdHkgb2YgYWxsIHRoYXQgZmllbGQgaGVhZGVyIG5vbnNlbnNlLgotICAgICAgICAgKiBVc2VkIGludGVybmFsbHkgYnkgb3RoZXIgd3JpdGluZyBtZXRob2RzIHRoYXQga25vdyB0aGV5IG5lZWQgdG8gV3JpdGUgYSBieXRlLgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGVzIGEgYnl0ZSB3aXRob3V0IGFueSBwb3NzaWJpbGl0eSBvZiBhbGwgdGhhdCBmaWVsZCBoZWFkZXIgbm9uc2Vuc2UuCisgICAgICAgIC8vLyBVc2VkIGludGVybmFsbHkgYnkgb3RoZXIgd3JpdGluZyBtZXRob2RzIHRoYXQga25vdyB0aGV5IG5lZWQgdG8gV3JpdGUgYSBieXRlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwcml2YXRlIGJ5dGVbXSBieXRlRGlyZWN0QnVmZmVyID0gbmV3IGJ5dGVbMV07CisKICAgICAgICAgcHJpdmF0ZSB2b2lkIFdyaXRlQnl0ZURpcmVjdChieXRlIGIpCiAgICAgICAgIHsKICAgICAgICAgICAgIGJ5dGVEaXJlY3RCdWZmZXJbMF0gPSBiOwogICAgICAgICAgICAgdHJhbnMuV3JpdGUoYnl0ZURpcmVjdEJ1ZmZlcik7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogV3JpdGVzIGEgYnl0ZSB3aXRob3V0IGFueSBwb3NzaWJpbGl0eSBvZiBhbGwgdGhhdCBmaWVsZCBoZWFkZXIgbm9uc2Vuc2UuCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZXMgYSBieXRlIHdpdGhvdXQgYW55IHBvc3NpYmlsaXR5IG9mIGFsbCB0aGF0IGZpZWxkIGhlYWRlciBub25zZW5zZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJpdmF0ZSB2b2lkIFdyaXRlQnl0ZURpcmVjdChpbnQgbikKICAgICAgICAgewogICAgICAgICAgICAgV3JpdGVCeXRlRGlyZWN0KChieXRlKW4pOwogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFdyaXRlIGFuIGkzMiBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTUgYnl0ZXMgb24gdGhlIHdpcmUuCi0gICAgICAgICAqIFRPRE86IG1ha2UgYSBwZXJtYW5lbnQgYnVmZmVyIGxpa2UgV3JpdGVWYXJpbnQ2ND8KLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlIGFuIGkzMiBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTUgYnl0ZXMgb24gdGhlIHdpcmUuCisgICAgICAgIC8vLyBUT0RPOiBtYWtlIGEgcGVybWFuZW50IGJ1ZmZlciBsaWtlIFdyaXRlVmFyaW50NjQ/CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIGJ5dGVbXSBpMzJidWYgPSBuZXcgYnl0ZVs1XTsKKwogICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVWYXJpbnQzMih1aW50IG4pCiAgICAgICAgIHsKICAgICAgICAgICAgIGludCBpZHggPSAwOwpAQCAtMTc0LDEwICsxNzIsMTAgQEAKICAgICAgICAgICAgIHRyYW5zLldyaXRlKGkzMmJ1ZiwgMCwgaWR4KTsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAqIFdyaXRlIGEgbWVzc2FnZSBoZWFkZXIgdG8gdGhlIHdpcmUuIENvbXBhY3QgUHJvdG9jb2wgbWVzc2FnZXMgY29udGFpbiB0aGUKLSAgICAgICAgKiBwcm90b2NvbCB2ZXJzaW9uIHNvIHdlIGNhbiBtaWdyYXRlIGZvcndhcmRzIGluIHRoZSBmdXR1cmUgaWYgbmVlZCBiZS4KLSAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYSBtZXNzYWdlIGhlYWRlciB0byB0aGUgd2lyZS4gQ29tcGFjdCBQcm90b2NvbCBtZXNzYWdlcyBjb250YWluIHRoZQorICAgICAgICAvLy8gcHJvdG9jb2wgdmVyc2lvbiBzbyB3ZSBjYW4gbWlncmF0ZSBmb3J3YXJkcyBpbiB0aGUgZnV0dXJlIGlmIG5lZWQgYmUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIG1lc3NhZ2UpCiAgICAgICAgIHsKICAgICAgICAgICAgIFdyaXRlQnl0ZURpcmVjdChQUk9UT0NPTF9JRCk7CkBAIC0xODYsMzMgKzE4NCwzMyBAQAogICAgICAgICAgICAgV3JpdGVTdHJpbmcobWVzc2FnZS5OYW1lKTsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBXcml0ZSBhIHN0cnVjdCBiZWdpbi4gVGhpcyBkb2Vzbid0IGFjdHVhbGx5IHB1dCBhbnl0aGluZyBvbiB0aGUgd2lyZS4gV2UKLSAgICAgICAgICogdXNlIGl0IGFzIGFuIG9wcG9ydHVuaXR5IHRvIHB1dCBzcGVjaWFsIHBsYWNlaG9sZGVyIG1hcmtlcnMgb24gdGhlIGZpZWxkCi0gICAgICAgICAqIHN0YWNrIHNvIHdlIGNhbiBnZXQgdGhlIGZpZWxkIGlkIGRlbHRhcyBjb3JyZWN0LgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYSBzdHJ1Y3QgYmVnaW4uIFRoaXMgZG9lc24ndCBhY3R1YWxseSBwdXQgYW55dGhpbmcgb24gdGhlIHdpcmUuIFdlCisgICAgICAgIC8vLyB1c2UgaXQgYXMgYW4gb3Bwb3J0dW5pdHkgdG8gcHV0IHNwZWNpYWwgcGxhY2Vob2xkZXIgbWFya2VycyBvbiB0aGUgZmllbGQKKyAgICAgICAgLy8vIHN0YWNrIHNvIHdlIGNhbiBnZXQgdGhlIGZpZWxkIGlkIGRlbHRhcyBjb3JyZWN0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVN0cnVjdEJlZ2luKFRTdHJ1Y3Qgc3RyY3QpCiAgICAgICAgIHsKICAgICAgICAgICAgIGxhc3RGaWVsZF8uUHVzaChsYXN0RmllbGRJZF8pOwogICAgICAgICAgICAgbGFzdEZpZWxkSWRfID0gMDsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBXcml0ZSBhIHN0cnVjdCBlbmQuIFRoaXMgZG9lc24ndCBhY3R1YWxseSBwdXQgYW55dGhpbmcgb24gdGhlIHdpcmUuIFdlIHVzZQotICAgICAgICAgKiB0aGlzIGFzIGFuIG9wcG9ydHVuaXR5IHRvIHBvcCB0aGUgbGFzdCBmaWVsZCBmcm9tIHRoZSBjdXJyZW50IHN0cnVjdCBvZmYKLSAgICAgICAgICogb2YgdGhlIGZpZWxkIHN0YWNrLgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYSBzdHJ1Y3QgZW5kLiBUaGlzIGRvZXNuJ3QgYWN0dWFsbHkgcHV0IGFueXRoaW5nIG9uIHRoZSB3aXJlLiBXZSB1c2UKKyAgICAgICAgLy8vIHRoaXMgYXMgYW4gb3Bwb3J0dW5pdHkgdG8gcG9wIHRoZSBsYXN0IGZpZWxkIGZyb20gdGhlIGN1cnJlbnQgc3RydWN0IG9mZgorICAgICAgICAvLy8gb2YgdGhlIGZpZWxkIHN0YWNrLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVN0cnVjdEVuZCgpCiAgICAgICAgIHsKICAgICAgICAgICAgIGxhc3RGaWVsZElkXyA9IGxhc3RGaWVsZF8uUG9wKCk7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogV3JpdGUgYSBmaWVsZCBoZWFkZXIgY29udGFpbmluZyB0aGUgZmllbGQgaWQgYW5kIGZpZWxkIHR5cGUuIElmIHRoZQotICAgICAgICAgKiBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGN1cnJlbnQgZmllbGQgaWQgYW5kIHRoZSBsYXN0IG9uZSBpcyBzbWFsbCAoPCAxNSksCi0gICAgICAgICAqIHRoZW4gdGhlIGZpZWxkIGlkIHdpbGwgYmUgZW5jb2RlZCBpbiB0aGUgNCBNU0IgYXMgYSBkZWx0YS4gT3RoZXJ3aXNlLCB0aGUKLSAgICAgICAgICogZmllbGQgaWQgd2lsbCBmb2xsb3cgdGhlIHR5cGUgaGVhZGVyIGFzIGEgemlnemFnIHZhcmludC4KLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlIGEgZmllbGQgaGVhZGVyIGNvbnRhaW5pbmcgdGhlIGZpZWxkIGlkIGFuZCBmaWVsZCB0eXBlLiBJZiB0aGUKKyAgICAgICAgLy8vIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgY3VycmVudCBmaWVsZCBpZCBhbmQgdGhlIGxhc3Qgb25lIGlzIHNtYWxsICgmbHQ7IDE1KSwKKyAgICAgICAgLy8vIHRoZW4gdGhlIGZpZWxkIGlkIHdpbGwgYmUgZW5jb2RlZCBpbiB0aGUgNCBNU0IgYXMgYSBkZWx0YS4gT3RoZXJ3aXNlLCB0aGUKKyAgICAgICAgLy8vIGZpZWxkIGlkIHdpbGwgZm9sbG93IHRoZSB0eXBlIGhlYWRlciBhcyBhIHppZ3phZyB2YXJpbnQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlRmllbGRCZWdpbihURmllbGQgZmllbGQpCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChmaWVsZC5UeXBlID09IFRUeXBlLkJvb2wpCkBAIC0yMjYsMTEgKzIyNCwxMSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSB3b3JraG9yc2Ugb2YgV3JpdGVGaWVsZEJlZ2luLiBJdCBoYXMgdGhlIG9wdGlvbiBvZiBkb2luZyBhCi0gICAgICAgICAqICd0eXBlIG92ZXJyaWRlJyBvZiB0aGUgdHlwZSBoZWFkZXIuIFRoaXMgaXMgdXNlZCBzcGVjaWZpY2FsbHkgaW4gdGhlCi0gICAgICAgICAqIGJvb2xlYW4gZmllbGQgY2FzZS4KLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSB3b3JraG9yc2Ugb2YgV3JpdGVGaWVsZEJlZ2luLiBJdCBoYXMgdGhlIG9wdGlvbiBvZiBkb2luZyBhCisgICAgICAgIC8vLyAndHlwZSBvdmVycmlkZScgb2YgdGhlIHR5cGUgaGVhZGVyLiBUaGlzIGlzIHVzZWQgc3BlY2lmaWNhbGx5IGluIHRoZQorICAgICAgICAvLy8gYm9vbGVhbiBmaWVsZCBjYXNlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwoVEZpZWxkIGZpZWxkLCBieXRlIHR5cGVPdmVycmlkZSkKICAgICAgICAgewogICAgICAgICAgICAgLy8gc2hvcnQgbGFzdEZpZWxkID0gbGFzdEZpZWxkXy5Qb3AoKTsKQEAgLTI1NSwxOCArMjUzLDE4IEBACiAgICAgICAgICAgICAvLyBsYXN0RmllbGRfLnB1c2goZmllbGQuaWQpOwogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFdyaXRlIHRoZSBTVE9QIHN5bWJvbCBzbyB3ZSBrbm93IHRoZXJlIGFyZSBubyBtb3JlIGZpZWxkcyBpbiB0aGlzIHN0cnVjdC4KLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlIHRoZSBTVE9QIHN5bWJvbCBzbyB3ZSBrbm93IHRoZXJlIGFyZSBubyBtb3JlIGZpZWxkcyBpbiB0aGlzIHN0cnVjdC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVGaWVsZFN0b3AoKQogICAgICAgICB7CiAgICAgICAgICAgICBXcml0ZUJ5dGVEaXJlY3QoVHlwZXMuU1RPUCk7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogV3JpdGUgYSBtYXAgaGVhZGVyLiBJZiB0aGUgbWFwIGlzIGVtcHR5LCBvbWl0IHRoZSBrZXkgYW5kIHZhbHVlIHR5cGUKLSAgICAgICAgICogaGVhZGVycywgYXMgd2UgZG9uJ3QgbmVlZCBhbnkgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0byBza2lwIGl0LgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYSBtYXAgaGVhZGVyLiBJZiB0aGUgbWFwIGlzIGVtcHR5LCBvbWl0IHRoZSBrZXkgYW5kIHZhbHVlIHR5cGUKKyAgICAgICAgLy8vIGhlYWRlcnMsIGFzIHdlIGRvbid0IG5lZWQgYW55IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdG8gc2tpcCBpdC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVNYXBCZWdpbihUTWFwIG1hcCkKICAgICAgICAgewogICAgICAgICAgICAgaWYgKG1hcC5Db3VudCA9PSAwKQpAQCAtMjgwLDI4ICsyNzgsMjggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBXcml0ZSBhIGxpc3QgaGVhZGVyLgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYSBsaXN0IGhlYWRlci4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVMaXN0QmVnaW4oVExpc3QgbGlzdCkKICAgICAgICAgewogICAgICAgICAgICAgV3JpdGVDb2xsZWN0aW9uQmVnaW4obGlzdC5FbGVtZW50VHlwZSwgbGlzdC5Db3VudCk7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogV3JpdGUgYSBzZXQgaGVhZGVyLgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYSBzZXQgaGVhZGVyLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVNldEJlZ2luKFRTZXQgc2V0KQogICAgICAgICB7CiAgICAgICAgICAgICBXcml0ZUNvbGxlY3Rpb25CZWdpbihzZXQuRWxlbWVudFR5cGUsIHNldC5Db3VudCk7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogV3JpdGUgYSBib29sZWFuIHZhbHVlLiBQb3RlbnRpYWxseSwgdGhpcyBjb3VsZCBiZSBhIGJvb2xlYW4gZmllbGQsIGluCi0gICAgICAgICAqIHdoaWNoIGNhc2UgdGhlIGZpZWxkIGhlYWRlciBpbmZvIGlzbid0IHdyaXR0ZW4geWV0LiBJZiBzbywgZGVjaWRlIHdoYXQgdGhlCi0gICAgICAgICAqIHJpZ2h0IHR5cGUgaGVhZGVyIGlzIGZvciB0aGUgdmFsdWUgYW5kIHRoZW4gV3JpdGUgdGhlIGZpZWxkIGhlYWRlci4KLSAgICAgICAgICogT3RoZXJ3aXNlLCBXcml0ZSBhIHNpbmdsZSBieXRlLgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYSBib29sZWFuIHZhbHVlLiBQb3RlbnRpYWxseSwgdGhpcyBjb3VsZCBiZSBhIGJvb2xlYW4gZmllbGQsIGluCisgICAgICAgIC8vLyB3aGljaCBjYXNlIHRoZSBmaWVsZCBoZWFkZXIgaW5mbyBpc24ndCB3cml0dGVuIHlldC4gSWYgc28sIGRlY2lkZSB3aGF0IHRoZQorICAgICAgICAvLy8gcmlnaHQgdHlwZSBoZWFkZXIgaXMgZm9yIHRoZSB2YWx1ZSBhbmQgdGhlbiBXcml0ZSB0aGUgZmllbGQgaGVhZGVyLgorICAgICAgICAvLy8gT3RoZXJ3aXNlLCBXcml0ZSBhIHNpbmdsZSBieXRlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUJvb2woQm9vbGVhbiBiKQogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoYm9vbGVhbkZpZWxkXyAhPSBudWxsKQpAQCAtMzE3LDQxICszMTUsNDEgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBXcml0ZSBhIGJ5dGUuIE5vdGhpbmcgdG8gc2VlIGhlcmUhCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZSBhIGJ5dGUuIE5vdGhpbmcgdG8gc2VlIGhlcmUhCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlQnl0ZShzYnl0ZSBiKQogICAgICAgICB7CiAgICAgICAgICAgICBXcml0ZUJ5dGVEaXJlY3QoKGJ5dGUpYik7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogV3JpdGUgYW4gSTE2IGFzIGEgemlnemFnIHZhcmludC4KLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlIGFuIEkxNiBhcyBhIHppZ3phZyB2YXJpbnQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlSTE2KHNob3J0IGkxNikKICAgICAgICAgewogICAgICAgICAgICAgV3JpdGVWYXJpbnQzMihpbnRUb1ppZ1phZyhpMTYpKTsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBXcml0ZSBhbiBpMzIgYXMgYSB6aWd6YWcgdmFyaW50LgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYW4gaTMyIGFzIGEgemlnemFnIHZhcmludC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVJMzIoaW50IGkzMikKICAgICAgICAgewogICAgICAgICAgICAgV3JpdGVWYXJpbnQzMihpbnRUb1ppZ1phZyhpMzIpKTsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBXcml0ZSBhbiBpNjQgYXMgYSB6aWd6YWcgdmFyaW50LgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYW4gaTY0IGFzIGEgemlnemFnIHZhcmludC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVJNjQobG9uZyBpNjQpCiAgICAgICAgIHsKICAgICAgICAgICAgIFdyaXRlVmFyaW50NjQobG9uZ1RvWmlnemFnKGk2NCkpOwogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFdyaXRlIGEgZG91YmxlIHRvIHRoZSB3aXJlIGFzIDggYnl0ZXMuCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZSBhIGRvdWJsZSB0byB0aGUgd2lyZSBhcyA4IGJ5dGVzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZURvdWJsZShkb3VibGUgZHViKQogICAgICAgICB7CiAgICAgICAgICAgICBieXRlW10gZGF0YSA9IG5ldyBieXRlW10geyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH07CkBAIC0zNTksMTggKzM1NywxOCBAQAogICAgICAgICAgICAgdHJhbnMuV3JpdGUoZGF0YSk7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogV3JpdGUgYSBzdHJpbmcgdG8gdGhlIHdpcmUgd2l0aCBhIHZhcmludCBzaXplIHByZWNlZGluZy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlU3RyaW5nKFN0cmluZyBzdHIpCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlIGEgc3RyaW5nIHRvIHRoZSB3aXJlIHdpdGggYSB2YXJpbnQgc2l6ZSBwcmVjZWRpbmcuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlU3RyaW5nKHN0cmluZyBzdHIpCiAgICAgICAgIHsKICAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IFVURjhFbmNvZGluZy5VVEY4LkdldEJ5dGVzKHN0cik7CiAgICAgICAgICAgICBXcml0ZUJpbmFyeShieXRlcywgMCwgYnl0ZXMuTGVuZ3RoKTsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBXcml0ZSBhIGJ5dGUgYXJyYXksIHVzaW5nIGEgdmFyaW50IGZvciB0aGUgc2l6ZS4KLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlIGEgYnl0ZSBhcnJheSwgdXNpbmcgYSB2YXJpbnQgZm9yIHRoZSBzaXplLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUJpbmFyeShieXRlW10gYmluKQogICAgICAgICB7CiAgICAgICAgICAgICBXcml0ZUJpbmFyeShiaW4sIDAsIGJpbi5MZW5ndGgpOwpAQCAtMzk3LDEwICszOTUsMTAgQEAKICAgICAgICAgLy8gSW50ZXJuYWwgd3JpdGluZyBtZXRob2RzCiAgICAgICAgIC8vCiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFic3RyYWN0IG1ldGhvZCBmb3Igd3JpdGluZyB0aGUgc3RhcnQgb2YgbGlzdHMgYW5kIHNldHMuIExpc3QgYW5kIHNldHMgb24KLSAgICAgICAgICogdGhlIHdpcmUgZGlmZmVyIG9ubHkgYnkgdGhlIHR5cGUgaW5kaWNhdG9yLgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQWJzdHJhY3QgbWV0aG9kIGZvciB3cml0aW5nIHRoZSBzdGFydCBvZiBsaXN0cyBhbmQgc2V0cy4gTGlzdCBhbmQgc2V0cyBvbgorICAgICAgICAvLy8gdGhlIHdpcmUgZGlmZmVyIG9ubHkgYnkgdGhlIHR5cGUgaW5kaWNhdG9yLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwcm90ZWN0ZWQgdm9pZCBXcml0ZUNvbGxlY3Rpb25CZWdpbihUVHlwZSBlbGVtVHlwZSwgaW50IHNpemUpCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChzaXplIDw9IDE0KQpAQCAtNDE0LDkgKzQxMiw5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogV3JpdGUgYW4gaTY0IGFzIGEgdmFyaW50LiBSZXN1bHRzIGluIDEtMTAgYnl0ZXMgb24gdGhlIHdpcmUuCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZSBhbiBpNjQgYXMgYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS0xMCBieXRlcyBvbiB0aGUgd2lyZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgYnl0ZVtdIHZhcmludDY0b3V0ID0gbmV3IGJ5dGVbMTBdOwogICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVWYXJpbnQ2NCh1bG9uZyBuKQogICAgICAgICB7CkBAIC00MzcsMjggKzQzNSwyOCBAQAogICAgICAgICAgICAgdHJhbnMuV3JpdGUodmFyaW50NjRvdXQsIDAsIGlkeCk7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogQ29udmVydCBsIGludG8gYSB6aWd6YWcgbG9uZy4gVGhpcyBhbGxvd3MgbmVnYXRpdmUgbnVtYmVycyB0byBiZQotICAgICAgICAgKiByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb252ZXJ0IGwgaW50byBhIHppZ3phZyBsb25nLiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlCisgICAgICAgIC8vLyByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHByaXZhdGUgdWxvbmcgbG9uZ1RvWmlnemFnKGxvbmcgbikKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuICh1bG9uZykobiA8PCAxKSBeICh1bG9uZykobiA+PiA2Myk7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogQ29udmVydCBuIGludG8gYSB6aWd6YWcgaW50LiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlCi0gICAgICAgICAqIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludC4KLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbnZlcnQgbiBpbnRvIGEgemlnemFnIGludC4gVGhpcyBhbGxvd3MgbmVnYXRpdmUgbnVtYmVycyB0byBiZQorICAgICAgICAvLy8gcmVwcmVzZW50ZWQgY29tcGFjdGx5IGFzIGEgdmFyaW50LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwcml2YXRlIHVpbnQgaW50VG9aaWdaYWcoaW50IG4pCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiAodWludCkobiA8PCAxKSBeICh1aW50KShuID4+IDMxKTsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb252ZXJ0IGEgbG9uZyBpbnRvIGxpdHRsZS1lbmRpYW4gYnl0ZXMgaW4gYnVmIHN0YXJ0aW5nIGF0IG9mZiBhbmQgZ29pbmcKLSAgICAgICAgICogdW50aWwgb2ZmKzcuCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb252ZXJ0IGEgbG9uZyBpbnRvIGxpdHRsZS1lbmRpYW4gYnl0ZXMgaW4gYnVmIHN0YXJ0aW5nIGF0IG9mZiBhbmQgZ29pbmcKKyAgICAgICAgLy8vIHVudGlsIG9mZis3LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwcml2YXRlIHZvaWQgZml4ZWRMb25nVG9CeXRlcyhsb25nIG4sIGJ5dGVbXSBidWYsIGludCBvZmYpCiAgICAgICAgIHsKICAgICAgICAgICAgIGJ1ZltvZmYgKyAwXSA9IChieXRlKShuICYgMHhmZik7CkBAIC00NzUsOSArNDczLDkgQEAKIAogICAgICAgICAjcmVnaW9uIFJlYWRNZXRob2RzCiAKLSAgICAgICAgLyoqCi0gICAqIFJlYWQgYSBtZXNzYWdlIGhlYWRlci4KLSAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgYSBtZXNzYWdlIGhlYWRlci4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHVibGljIG92ZXJyaWRlIFRNZXNzYWdlIFJlYWRNZXNzYWdlQmVnaW4oKQogICAgICAgICB7CiAgICAgICAgICAgICBieXRlIHByb3RvY29sSWQgPSAoYnl0ZSlSZWFkQnl0ZSgpOwpAQCAtNDkzLDE0ICs0OTEsMTQgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJ5dGUgdHlwZSA9IChieXRlKSgodmVyc2lvbkFuZFR5cGUgPj4gVFlQRV9TSElGVF9BTU9VTlQpICYgVFlQRV9CSVRTKTsKICAgICAgICAgICAgIGludCBzZXFpZCA9IChpbnQpUmVhZFZhcmludDMyKCk7Ci0gICAgICAgICAgICBTdHJpbmcgbWVzc2FnZU5hbWUgPSBSZWFkU3RyaW5nKCk7CisgICAgICAgICAgICBzdHJpbmcgbWVzc2FnZU5hbWUgPSBSZWFkU3RyaW5nKCk7CiAgICAgICAgICAgICByZXR1cm4gbmV3IFRNZXNzYWdlKG1lc3NhZ2VOYW1lLCAoVE1lc3NhZ2VUeXBlKXR5cGUsIHNlcWlkKTsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZWFkIGEgc3RydWN0IGJlZ2luLiBUaGVyZSdzIG5vdGhpbmcgb24gdGhlIHdpcmUgZm9yIHRoaXMsIGJ1dCBpdCBpcyBvdXIKLSAgICAgICAgICogb3Bwb3J0dW5pdHkgdG8gcHVzaCBhIG5ldyBzdHJ1Y3QgYmVnaW4gbWFya2VyIG9udG8gdGhlIGZpZWxkIHN0YWNrLgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCBhIHN0cnVjdCBiZWdpbi4gVGhlcmUncyBub3RoaW5nIG9uIHRoZSB3aXJlIGZvciB0aGlzLCBidXQgaXQgaXMgb3VyCisgICAgICAgIC8vLyBvcHBvcnR1bml0eSB0byBwdXNoIGEgbmV3IHN0cnVjdCBiZWdpbiBtYXJrZXIgb250byB0aGUgZmllbGQgc3RhY2suCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBUU3RydWN0IFJlYWRTdHJ1Y3RCZWdpbigpCiAgICAgICAgIHsKICAgICAgICAgICAgIGxhc3RGaWVsZF8uUHVzaChsYXN0RmllbGRJZF8pOwpAQCAtNTA4LDE5ICs1MDYsMTkgQEAKICAgICAgICAgICAgIHJldHVybiBBTk9OWU1PVVNfU1RSVUNUOwogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIERvZXNuJ3QgYWN0dWFsbHkgY29uc3VtZSBhbnkgd2lyZSBkYXRhLCBqdXN0IHJlbW92ZXMgdGhlIGxhc3QgZmllbGQgZm9yCi0gICAgICAgICAqIHRoaXMgc3RydWN0IGZyb20gdGhlIGZpZWxkIHN0YWNrLgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gRG9lc24ndCBhY3R1YWxseSBjb25zdW1lIGFueSB3aXJlIGRhdGEsIGp1c3QgcmVtb3ZlcyB0aGUgbGFzdCBmaWVsZCBmb3IKKyAgICAgICAgLy8vIHRoaXMgc3RydWN0IGZyb20gdGhlIGZpZWxkIHN0YWNrLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkU3RydWN0RW5kKCkKICAgICAgICAgewogICAgICAgICAgICAgLy8gY29uc3VtZSB0aGUgbGFzdCBmaWVsZCB3ZSBSZWFkIG9mZiB0aGUgd2lyZS4KICAgICAgICAgICAgIGxhc3RGaWVsZElkXyA9IGxhc3RGaWVsZF8uUG9wKCk7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogUmVhZCBhIGZpZWxkIGhlYWRlciBvZmYgdGhlIHdpcmUuCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkIGEgZmllbGQgaGVhZGVyIG9mZiB0aGUgd2lyZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHVibGljIG92ZXJyaWRlIFRGaWVsZCBSZWFkRmllbGRCZWdpbigpCiAgICAgICAgIHsKICAgICAgICAgICAgIGJ5dGUgdHlwZSA9IChieXRlKVJlYWRCeXRlKCk7CkBAIC01NjAsMTEgKzU1OCwxMSBAQAogICAgICAgICAgICAgcmV0dXJuIGZpZWxkOwogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlYWQgYSBtYXAgaGVhZGVyIG9mZiB0aGUgd2lyZS4gSWYgdGhlIHNpemUgaXMgemVybywgc2tpcCBSZWFkaW5nIHRoZSBrZXkKLSAgICAgICAgICogYW5kIHZhbHVlIHR5cGUuIFRoaXMgbWVhbnMgdGhhdCAwLWxlbmd0aCBtYXBzIHdpbGwgeWllbGQgVE1hcHMgd2l0aG91dCB0aGUKLSAgICAgICAgICogImNvcnJlY3QiIHR5cGVzLgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCBhIG1hcCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgc2l6ZSBpcyB6ZXJvLCBza2lwIFJlYWRpbmcgdGhlIGtleQorICAgICAgICAvLy8gYW5kIHZhbHVlIHR5cGUuIFRoaXMgbWVhbnMgdGhhdCAwLWxlbmd0aCBtYXBzIHdpbGwgeWllbGQgVE1hcHMgd2l0aG91dCB0aGUKKyAgICAgICAgLy8vICJjb3JyZWN0IiB0eXBlcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHVibGljIG92ZXJyaWRlIFRNYXAgUmVhZE1hcEJlZ2luKCkKICAgICAgICAgewogICAgICAgICAgICAgaW50IHNpemUgPSAoaW50KVJlYWRWYXJpbnQzMigpOwpAQCAtNTcyLDEyICs1NzAsMTIgQEAKICAgICAgICAgICAgIHJldHVybiBuZXcgVE1hcChnZXRUVHlwZSgoYnl0ZSkoa2V5QW5kVmFsdWVUeXBlID4+IDQpKSwgZ2V0VFR5cGUoKGJ5dGUpKGtleUFuZFZhbHVlVHlwZSAmIDB4ZikpLCBzaXplKTsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZWFkIGEgbGlzdCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgbGlzdCBzaXplIGlzIDAtMTQsIHRoZSBzaXplIHdpbGwKLSAgICAgICAgICogYmUgcGFja2VkIGludG8gdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIuIElmIGl0J3MgYSBsb25nZXIgbGlzdCwgdGhlIDQgTVNCCi0gICAgICAgICAqIG9mIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyIHdpbGwgYmUgMHhGLCBhbmQgYSB2YXJpbnQgd2lsbCBmb2xsb3cgd2l0aCB0aGUKLSAgICAgICAgICogdHJ1ZSBzaXplLgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCBhIGxpc3QgaGVhZGVyIG9mZiB0aGUgd2lyZS4gSWYgdGhlIGxpc3Qgc2l6ZSBpcyAwLTE0LCB0aGUgc2l6ZSB3aWxsCisgICAgICAgIC8vLyBiZSBwYWNrZWQgaW50byB0aGUgZWxlbWVudCB0eXBlIGhlYWRlci4gSWYgaXQncyBhIGxvbmdlciBsaXN0LCB0aGUgNCBNU0IKKyAgICAgICAgLy8vIG9mIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyIHdpbGwgYmUgMHhGLCBhbmQgYSB2YXJpbnQgd2lsbCBmb2xsb3cgd2l0aCB0aGUKKyAgICAgICAgLy8vIHRydWUgc2l6ZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHVibGljIG92ZXJyaWRlIFRMaXN0IFJlYWRMaXN0QmVnaW4oKQogICAgICAgICB7CiAgICAgICAgICAgICBieXRlIHNpemVfYW5kX3R5cGUgPSAoYnl0ZSlSZWFkQnl0ZSgpOwpAQCAtNTkwLDIyICs1ODgsMjIgQEAKICAgICAgICAgICAgIHJldHVybiBuZXcgVExpc3QodHlwZSwgc2l6ZSk7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogUmVhZCBhIHNldCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgc2V0IHNpemUgaXMgMC0xNCwgdGhlIHNpemUgd2lsbAotICAgICAgICAgKiBiZSBwYWNrZWQgaW50byB0aGUgZWxlbWVudCB0eXBlIGhlYWRlci4gSWYgaXQncyBhIGxvbmdlciBzZXQsIHRoZSA0IE1TQgotICAgICAgICAgKiBvZiB0aGUgZWxlbWVudCB0eXBlIGhlYWRlciB3aWxsIGJlIDB4RiwgYW5kIGEgdmFyaW50IHdpbGwgZm9sbG93IHdpdGggdGhlCi0gICAgICAgICAqIHRydWUgc2l6ZS4KLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgYSBzZXQgaGVhZGVyIG9mZiB0aGUgd2lyZS4gSWYgdGhlIHNldCBzaXplIGlzIDAtMTQsIHRoZSBzaXplIHdpbGwKKyAgICAgICAgLy8vIGJlIHBhY2tlZCBpbnRvIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyLiBJZiBpdCdzIGEgbG9uZ2VyIHNldCwgdGhlIDQgTVNCCisgICAgICAgIC8vLyBvZiB0aGUgZWxlbWVudCB0eXBlIGhlYWRlciB3aWxsIGJlIDB4RiwgYW5kIGEgdmFyaW50IHdpbGwgZm9sbG93IHdpdGggdGhlCisgICAgICAgIC8vLyB0cnVlIHNpemUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBUU2V0IFJlYWRTZXRCZWdpbigpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBuZXcgVFNldChSZWFkTGlzdEJlZ2luKCkpOwogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlYWQgYSBib29sZWFuIG9mZiB0aGUgd2lyZS4gSWYgdGhpcyBpcyBhIGJvb2xlYW4gZmllbGQsIHRoZSB2YWx1ZSBzaG91bGQKLSAgICAgICAgICogYWxyZWFkeSBoYXZlIGJlZW4gUmVhZCBkdXJpbmcgUmVhZEZpZWxkQmVnaW4sIHNvIHdlJ2xsIGp1c3QgY29uc3VtZSB0aGUKLSAgICAgICAgICogcHJlLXN0b3JlZCB2YWx1ZS4gT3RoZXJ3aXNlLCBSZWFkIGEgYnl0ZS4KLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgYSBib29sZWFuIG9mZiB0aGUgd2lyZS4gSWYgdGhpcyBpcyBhIGJvb2xlYW4gZmllbGQsIHRoZSB2YWx1ZSBzaG91bGQKKyAgICAgICAgLy8vIGFscmVhZHkgaGF2ZSBiZWVuIFJlYWQgZHVyaW5nIFJlYWRGaWVsZEJlZ2luLCBzbyB3ZSdsbCBqdXN0IGNvbnN1bWUgdGhlCisgICAgICAgIC8vLyBwcmUtc3RvcmVkIHZhbHVlLiBPdGhlcndpc2UsIFJlYWQgYSBieXRlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQm9vbGVhbiBSZWFkQm9vbCgpCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChib29sVmFsdWVfICE9IG51bGwpCkBAIC02MTgsNDIgKzYxNiw0MiBAQAogICAgICAgICB9CiAKICAgICAgICAgYnl0ZVtdIGJ5dGVSYXdCdWYgPSBuZXcgYnl0ZVsxXTsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlYWQgYSBzaW5nbGUgYnl0ZSBvZmYgdGhlIHdpcmUuIE5vdGhpbmcgaW50ZXJlc3RpbmcgaGVyZS4KLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgYSBzaW5nbGUgYnl0ZSBvZmYgdGhlIHdpcmUuIE5vdGhpbmcgaW50ZXJlc3RpbmcgaGVyZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHVibGljIG92ZXJyaWRlIHNieXRlIFJlYWRCeXRlKCkKICAgICAgICAgewogICAgICAgICAgICAgdHJhbnMuUmVhZEFsbChieXRlUmF3QnVmLCAwLCAxKTsKICAgICAgICAgICAgIHJldHVybiAoc2J5dGUpYnl0ZVJhd0J1ZlswXTsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZWFkIGFuIGkxNiBmcm9tIHRoZSB3aXJlIGFzIGEgemlnemFnIHZhcmludC4KLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgYW4gaTE2IGZyb20gdGhlIHdpcmUgYXMgYSB6aWd6YWcgdmFyaW50LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc2hvcnQgUmVhZEkxNigpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiAoc2hvcnQpemlnemFnVG9JbnQoUmVhZFZhcmludDMyKCkpOwogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlYWQgYW4gaTMyIGZyb20gdGhlIHdpcmUgYXMgYSB6aWd6YWcgdmFyaW50LgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCBhbiBpMzIgZnJvbSB0aGUgd2lyZSBhcyBhIHppZ3phZyB2YXJpbnQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgUmVhZEkzMigpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiB6aWd6YWdUb0ludChSZWFkVmFyaW50MzIoKSk7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogUmVhZCBhbiBpNjQgZnJvbSB0aGUgd2lyZSBhcyBhIHppZ3phZyB2YXJpbnQuCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkIGFuIGk2NCBmcm9tIHRoZSB3aXJlIGFzIGEgemlnemFnIHZhcmludC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHVibGljIG92ZXJyaWRlIGxvbmcgUmVhZEk2NCgpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiB6aWd6YWdUb0xvbmcoUmVhZFZhcmludDY0KCkpOwogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIE5vIG1hZ2ljIGhlcmUgLSBqdXN0IFJlYWQgYSBkb3VibGUgb2ZmIHRoZSB3aXJlLgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gTm8gbWFnaWMgaGVyZSAtIGp1c3QgUmVhZCBhIGRvdWJsZSBvZmYgdGhlIHdpcmUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBkb3VibGUgUmVhZERvdWJsZSgpCiAgICAgICAgIHsKICAgICAgICAgICAgIGJ5dGVbXSBsb25nQml0cyA9IG5ldyBieXRlWzhdOwpAQCAtNjYxLDEwICs2NTksMTAgQEAKICAgICAgICAgICAgIHJldHVybiBCaXRDb252ZXJ0ZXIuSW50NjRCaXRzVG9Eb3VibGUoYnl0ZXNUb0xvbmcobG9uZ0JpdHMpKTsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZWFkcyBhIGJ5dGVbXSAodmlhIFJlYWRCaW5hcnkpLCBhbmQgdGhlbiBVVEYtOCBkZWNvZGVzIGl0LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIFN0cmluZyBSZWFkU3RyaW5nKCkKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZHMgYSBieXRlW10gKHZpYSBSZWFkQmluYXJ5KSwgYW5kIHRoZW4gVVRGLTggZGVjb2RlcyBpdC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBSZWFkU3RyaW5nKCkKICAgICAgICAgewogICAgICAgICAgICAgaW50IGxlbmd0aCA9IChpbnQpUmVhZFZhcmludDMyKCk7CiAKQEAgLTY3Niw5ICs2NzQsOSBAQAogICAgICAgICAgICAgcmV0dXJuIEVuY29kaW5nLlVURjguR2V0U3RyaW5nKFJlYWRCaW5hcnkobGVuZ3RoKSk7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogUmVhZCBhIGJ5dGVbXSBmcm9tIHRoZSB3aXJlLgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCBhIGJ5dGVbXSBmcm9tIHRoZSB3aXJlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYnl0ZVtdIFJlYWRCaW5hcnkoKQogICAgICAgICB7CiAgICAgICAgICAgICBpbnQgbGVuZ3RoID0gKGludClSZWFkVmFyaW50MzIoKTsKQEAgLTY4OSw5ICs2ODcsOSBAQAogICAgICAgICAgICAgcmV0dXJuIGJ1ZjsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZWFkIGEgYnl0ZVtdIG9mIGEga25vd24gbGVuZ3RoIGZyb20gdGhlIHdpcmUuCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkIGEgYnl0ZVtdIG9mIGEga25vd24gbGVuZ3RoIGZyb20gdGhlIHdpcmUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHByaXZhdGUgYnl0ZVtdIFJlYWRCaW5hcnkoaW50IGxlbmd0aCkKICAgICAgICAgewogICAgICAgICAgICAgaWYgKGxlbmd0aCA9PSAwKSByZXR1cm4gbmV3IGJ5dGVbMF07CkBAIC03MTUsMTAgKzcxMywxMCBAQAogICAgICAgICAvLyBJbnRlcm5hbCBSZWFkaW5nIG1ldGhvZHMKICAgICAgICAgLy8KIAotICAgICAgICAvKioKLSAgICAgICAgICogUmVhZCBhbiBpMzIgZnJvbSB0aGUgd2lyZSBhcyBhIHZhcmludC4gVGhlIE1TQiBvZiBlYWNoIGJ5dGUgaXMgc2V0Ci0gICAgICAgICAqIGlmIHRoZXJlIGlzIGFub3RoZXIgYnl0ZSB0byBmb2xsb3cuIFRoaXMgY2FuIFJlYWQgdXAgdG8gNSBieXRlcy4KLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgYW4gaTMyIGZyb20gdGhlIHdpcmUgYXMgYSB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorICAgICAgICAvLy8gaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gUmVhZCB1cCB0byA1IGJ5dGVzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwcml2YXRlIHVpbnQgUmVhZFZhcmludDMyKCkKICAgICAgICAgewogICAgICAgICAgICAgdWludCByZXN1bHQgPSAwOwpAQCAtNzMzLDEwICs3MzEsMTAgQEAKICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogUmVhZCBhbiBpNjQgZnJvbSB0aGUgd2lyZSBhcyBhIHByb3BlciB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAotICAgICAgICAgKiBpZiB0aGVyZSBpcyBhbm90aGVyIGJ5dGUgdG8gZm9sbG93LiBUaGlzIGNhbiBSZWFkIHVwIHRvIDEwIGJ5dGVzLgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCBhbiBpNjQgZnJvbSB0aGUgd2lyZSBhcyBhIHByb3BlciB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorICAgICAgICAvLy8gaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gUmVhZCB1cCB0byAxMCBieXRlcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJpdmF0ZSB1bG9uZyBSZWFkVmFyaW50NjQoKQogICAgICAgICB7CiAgICAgICAgICAgICBpbnQgc2hpZnQgPSAwOwpAQCAtNzU4LDI3ICs3NTYsMjcgQEAKICAgICAgICAgLy8gZW5jb2RpbmcgaGVscGVycwogICAgICAgICAvLwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb252ZXJ0IGZyb20gemlnemFnIGludCB0byBpbnQuCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb252ZXJ0IGZyb20gemlnemFnIGludCB0byBpbnQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHByaXZhdGUgaW50IHppZ3phZ1RvSW50KHVpbnQgbikKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIChpbnQpKG4gPj4gMSkgXiAoLShpbnQpKG4gJiAxKSk7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogQ29udmVydCBmcm9tIHppZ3phZyBsb25nIHRvIGxvbmcuCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb252ZXJ0IGZyb20gemlnemFnIGxvbmcgdG8gbG9uZy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJpdmF0ZSBsb25nIHppZ3phZ1RvTG9uZyh1bG9uZyBuKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gKGxvbmcpKG4gPj4gMSkgXiAoLShsb25nKShuICYgMSkpOwogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIE5vdGUgdGhhdCBpdCdzIGltcG9ydGFudCB0aGF0IHRoZSBtYXNrIGJ5dGVzIGFyZSBsb25nIGxpdGVyYWxzLAotICAgICAgICAgKiBvdGhlcndpc2UgdGhleSdsbCBkZWZhdWx0IHRvIGludHMsIGFuZCB3aGVuIHlvdSBzaGlmdCBhbiBpbnQgbGVmdCA1NiBiaXRzLAotICAgICAgICAgKiB5b3UganVzdCBnZXQgYSBtZXNzZWQgdXAgaW50LgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gTm90ZSB0aGF0IGl0J3MgaW1wb3J0YW50IHRoYXQgdGhlIG1hc2sgYnl0ZXMgYXJlIGxvbmcgbGl0ZXJhbHMsCisgICAgICAgIC8vLyBvdGhlcndpc2UgdGhleSdsbCBkZWZhdWx0IHRvIGludHMsIGFuZCB3aGVuIHlvdSBzaGlmdCBhbiBpbnQgbGVmdCA1NiBiaXRzLAorICAgICAgICAvLy8geW91IGp1c3QgZ2V0IGEgbWVzc2VkIHVwIGludC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJpdmF0ZSBsb25nIGJ5dGVzVG9Mb25nKGJ5dGVbXSBieXRlcykKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuCkBAIC04MDIsMTAgKzgwMCwxMCBAQAogICAgICAgICAgICAgcmV0dXJuIGxvd2VyTmliYmxlID09IFR5cGVzLkJPT0xFQU5fVFJVRSB8fCBsb3dlck5pYmJsZSA9PSBUeXBlcy5CT09MRUFOX0ZBTFNFOwogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdpdmVuIGEgVENvbXBhY3RQcm90b2NvbC5UeXBlcyBjb25zdGFudCwgY29udmVydCBpdCB0byBpdHMgY29ycmVzcG9uZGluZwotICAgICAgICAgKiBUVHlwZSB2YWx1ZS4KLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEdpdmVuIGEgVENvbXBhY3RQcm90b2NvbC5UeXBlcyBjb25zdGFudCwgY29udmVydCBpdCB0byBpdHMgY29ycmVzcG9uZGluZworICAgICAgICAvLy8gVFR5cGUgdmFsdWUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHByaXZhdGUgVFR5cGUgZ2V0VFR5cGUoYnl0ZSB0eXBlKQogICAgICAgICB7CiAgICAgICAgICAgICBzd2l0Y2ggKChieXRlKSh0eXBlICYgMHgwZikpCkBAIC04NDAsOSArODM4LDkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHaXZlbiBhIFRUeXBlIHZhbHVlLCBmaW5kIHRoZSBhcHByb3ByaWF0ZSBUQ29tcGFjdFByb3RvY29sLlR5cGVzIGNvbnN0YW50LgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gR2l2ZW4gYSBUVHlwZSB2YWx1ZSwgZmluZCB0aGUgYXBwcm9wcmlhdGUgVENvbXBhY3RQcm90b2NvbC5UeXBlcyBjb25zdGFudC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJpdmF0ZSBieXRlIGdldENvbXBhY3RUeXBlKFRUeXBlIHR0eXBlKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gdHR5cGVUb0NvbXBhY3RUeXBlWyhpbnQpdHR5cGVdOwpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEpTT05Qcm90b2NvbC5jcyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RKU09OUHJvdG9jb2wuY3MKaW5kZXggMmU4ZDk5Zi4uOWRiZGVhOSAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEpTT05Qcm90b2NvbC5jcworKysgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9USlNPTlByb3RvY29sLmNzCkBAIC0yOSwxOCArMjksMTggQEAKIHsKICAgICAvLy8gPHN1bW1hcnk+CiAgICAgLy8vIEpTT04gcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gZm9yIHRocmlmdC4KLSAgICAvLy8KKyAgICAvLy8gPHBhcmEvPgogICAgIC8vLyBUaGlzIGlzIGEgZnVsbC1mZWF0dXJlZCBwcm90b2NvbCBzdXBwb3J0aW5nIFdyaXRlIGFuZCBSZWFkLgotICAgIC8vLworICAgIC8vLyA8cGFyYS8+CiAgICAgLy8vIFBsZWFzZSBzZWUgdGhlIEMrKyBjbGFzcyBoZWFkZXIgZm9yIGEgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlCiAgICAgLy8vIHByb3RvY29sJ3Mgd2lyZSBmb3JtYXQuCi0gICAgLy8vCisgICAgLy8vIDxwYXJhLz4KICAgICAvLy8gQWRhcHRlZCBmcm9tIHRoZSBKYXZhIHZlcnNpb24uCiAgICAgLy8vIDwvc3VtbWFyeT4KICAgICBwdWJsaWMgY2xhc3MgVEpTT05Qcm90b2NvbCA6IFRQcm90b2NvbAogICAgIHsKICAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRmFjdG9yeSBmb3IgSlNPTiBwcm90b2NvbCBvYmplY3RzCisgICAgICAgIC8vLyBGYWN0b3J5IGZvciBKU09OIHByb3RvY29sIG9iamVjdHMuCiAgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHB1YmxpYyBjbGFzcyBGYWN0b3J5IDogVFByb3RvY29sRmFjdG9yeQogICAgICAgICB7CkBAIC0xNzksMTEgKzE3OSwxMSBAQAogICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgfQogCi0gICAgICAgIC8vLzxzdW1tYXJ5PgorICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgIC8vLyBCYXNlIGNsYXNzIGZvciB0cmFja2luZyBKU09OIGNvbnRleHRzIHRoYXQgbWF5IHJlcXVpcmUKICAgICAgICAgLy8vIGluc2VydGluZy9SZWFkaW5nIGFkZGl0aW9uYWwgSlNPTiBzeW50YXggY2hhcmFjdGVycwogICAgICAgICAvLy8gVGhpcyBiYXNlIGNvbnRleHQgZG9lcyBub3RoaW5nLgotICAgICAgICAvLy88L3N1bW1hcnk+CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHByb3RlY3RlZCBjbGFzcyBKU09OQmFzZUNvbnRleHQKICAgICAgICAgewogICAgICAgICAgICAgcHJvdGVjdGVkIFRKU09OUHJvdG9jb2wgcHJvdG87CkBAIC0yMDAsMTAgKzIwMCwxMCBAQAogICAgICAgICAgICAgcHVibGljIHZpcnR1YWwgYm9vbCBFc2NhcGVOdW1iZXJzKCkgeyByZXR1cm4gZmFsc2U7IH0KICAgICAgICAgfQogCi0gICAgICAgIC8vLzxzdW1tYXJ5PgorICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgIC8vLyBDb250ZXh0IGZvciBKU09OIGxpc3RzLiBXaWxsIGluc2VydC9SZWFkIGNvbW1hcyBiZWZvcmUgZWFjaCBpdGVtIGV4Y2VwdAogICAgICAgICAvLy8gZm9yIHRoZSBmaXJzdCBvbmUKLSAgICAgICAgLy8vPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwcm90ZWN0ZWQgY2xhc3MgSlNPTkxpc3RDb250ZXh0IDogSlNPTkJhc2VDb250ZXh0CiAgICAgICAgIHsKICAgICAgICAgICAgIHB1YmxpYyBKU09OTGlzdENvbnRleHQoVEpTT05Qcm90b2NvbCBwcm90b2NvbCkKQEAgLTIzOSwxMiArMjM5LDEyIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICAvLy88c3VtbWFyeT4KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgICAvLy8gQ29udGV4dCBmb3IgSlNPTiByZWNvcmRzLiBXaWxsIGluc2VydC9SZWFkIGNvbG9ucyBiZWZvcmUgdGhlIHZhbHVlIHBvcnRpb24KICAgICAgICAgLy8vIG9mIGVhY2ggcmVjb3JkIHBhaXIsIGFuZCBjb21tYXMgYmVmb3JlIGVhY2gga2V5IGV4Y2VwdCB0aGUgZmlyc3QuIEluCiAgICAgICAgIC8vLyBhZGRpdGlvbiwgd2lsbCBpbmRpY2F0ZSB0aGF0IG51bWJlcnMgaW4gdGhlIGtleSBwb3NpdGlvbiBuZWVkIHRvIGJlCiAgICAgICAgIC8vLyBlc2NhcGVkIGluIHF1b3RlcyAoc2luY2UgSlNPTiBrZXlzIG11c3QgYmUgc3RyaW5ncykuCi0gICAgICAgIC8vLzwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJvdGVjdGVkIGNsYXNzIEpTT05QYWlyQ29udGV4dCA6IEpTT05CYXNlQ29udGV4dAogICAgICAgICB7CiAgICAgICAgICAgICBwdWJsaWMgSlNPTlBhaXJDb250ZXh0KFRKU09OUHJvdG9jb2wgcHJvdG8pCkBAIC0yOTAsOSArMjkwLDkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIC8vLzxzdW1tYXJ5PgorICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgIC8vLyBIb2xkcyB1cCB0byBvbmUgYnl0ZSBmcm9tIHRoZSB0cmFuc3BvcnQKLSAgICAgICAgLy8vPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwcm90ZWN0ZWQgY2xhc3MgTG9va2FoZWFkUmVhZGVyCiAgICAgICAgIHsKICAgICAgICAgICAgIHByb3RlY3RlZCBUSlNPTlByb3RvY29sIHByb3RvOwpAQCAtMzA1LDEwICszMDUsMTAgQEAKICAgICAgICAgICAgIHByaXZhdGUgYm9vbCBoYXNEYXRhOwogICAgICAgICAgICAgcHJpdmF0ZSBieXRlW10gZGF0YSA9IG5ldyBieXRlWzFdOwogCi0gICAgICAgICAgICAvLy88c3VtbWFyeT4KKyAgICAgICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAgICAgIC8vLyBSZXR1cm4gYW5kIGNvbnN1bWUgdGhlIG5leHQgYnl0ZSB0byBiZSBSZWFkLCBlaXRoZXIgdGFraW5nIGl0IGZyb20gdGhlCiAgICAgICAgICAgICAvLy8gZGF0YSBidWZmZXIgaWYgcHJlc2VudCBvciBnZXR0aW5nIGl0IGZyb20gdGhlIHRyYW5zcG9ydCBvdGhlcndpc2UuCi0gICAgICAgICAgICAvLy88L3N1bW1hcnk+CisgICAgICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICAgICAgcHVibGljIGJ5dGUgUmVhZCgpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYgKGhhc0RhdGEpCkBAIC0zMjIsMTAgKzMyMiwxMCBAQAogICAgICAgICAgICAgICAgIHJldHVybiBkYXRhWzBdOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvLy88c3VtbWFyeT4KKyAgICAgICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAgICAgIC8vLyBSZXR1cm4gdGhlIG5leHQgYnl0ZSB0byBiZSBSZWFkIHdpdGhvdXQgY29uc3VtaW5nLCBmaWxsaW5nIHRoZSBkYXRhCiAgICAgICAgICAgICAvLy8gYnVmZmVyIGlmIGl0IGhhcyBub3QgYmVlbiBmaWxsZWQgYWxSZWFkeS4KLSAgICAgICAgICAgIC8vLzwvc3VtbWFyeT4KKyAgICAgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgICAgICBwdWJsaWMgYnl0ZSBQZWVrKCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZiAoIWhhc0RhdGEpCkBAIC0zNDksMjYgKzM0OSwyNiBAQAogICAgICAgICAvLyBSZWFkZXIgdGhhdCBtYW5hZ2VzIGEgMS1ieXRlIGJ1ZmZlcgogICAgICAgICBwcm90ZWN0ZWQgTG9va2FoZWFkUmVhZGVyIHJlYWRlcjsKIAotICAgICAgICAvLy88c3VtbWFyeT4KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgICAvLy8gUHVzaCBhIG5ldyBKU09OIGNvbnRleHQgb250byB0aGUgc3RhY2suCi0gICAgICAgIC8vLzwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJvdGVjdGVkIHZvaWQgUHVzaENvbnRleHQoSlNPTkJhc2VDb250ZXh0IGMpCiAgICAgICAgIHsKICAgICAgICAgICAgIGNvbnRleHRTdGFjay5QdXNoKGNvbnRleHQpOwogICAgICAgICAgICAgY29udGV4dCA9IGM7CiAgICAgICAgIH0KIAotICAgICAgICAvLy88c3VtbWFyeT4KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgICAvLy8gUG9wIHRoZSBsYXN0IEpTT04gY29udGV4dCBvZmYgdGhlIHN0YWNrCi0gICAgICAgIC8vLzwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJvdGVjdGVkIHZvaWQgUG9wQ29udGV4dCgpCiAgICAgICAgIHsKICAgICAgICAgICAgIGNvbnRleHQgPSBjb250ZXh0U3RhY2suUG9wKCk7CiAgICAgICAgIH0KIAotICAgICAgICAvLy88c3VtbWFyeT4KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgICAvLy8gVEpTT05Qcm90b2NvbCBDb25zdHJ1Y3RvcgotICAgICAgICAvLy88L3N1bW1hcnk+CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHB1YmxpYyBUSlNPTlByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnMpCiAgICAgICAgICAgICA6IGJhc2UodHJhbnMpCiAgICAgICAgIHsKQEAgLTM3OSwxMSArMzc5LDExIEBACiAgICAgICAgIC8vIFRlbXBvcmFyeSBidWZmZXIgdXNlZCBieSBzZXZlcmFsIG1ldGhvZHMKICAgICAgICAgcHJpdmF0ZSBieXRlW10gdGVtcEJ1ZmZlciA9IG5ldyBieXRlWzRdOwogCi0gICAgICAgIC8vLzxzdW1tYXJ5PgorICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgIC8vLyBSZWFkIGEgYnl0ZSB0aGF0IG11c3QgbWF0Y2ggYlswXTsgb3RoZXJ3aXNlIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uCiAgICAgICAgIC8vLyBNYXJrZWQgcHJvdGVjdGVkIHRvIGF2b2lkIHN5bnRoZXRpYyBhY2Nlc3NvciBpbiBKU09OTGlzdENvbnRleHQuUmVhZAogICAgICAgICAvLy8gYW5kIEpTT05QYWlyQ29udGV4dC5SZWFkCi0gICAgICAgIC8vLzwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJvdGVjdGVkIHZvaWQgUmVhZEpTT05TeW50YXhDaGFyKGJ5dGVbXSBiKQogICAgICAgICB7CiAgICAgICAgICAgICBieXRlIGNoID0gcmVhZGVyLlJlYWQoKTsKQEAgLTM5NCwxMCArMzk0LDEwIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICAvLy88c3VtbWFyeT4KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgICAvLy8gQ29udmVydCBhIGJ5dGUgY29udGFpbmluZyBhIGhleCBjaGFyICgnMCctJzknIG9yICdhJy0nZicpIGludG8gaXRzCiAgICAgICAgIC8vLyBjb3JyZXNwb25kaW5nIGhleCB2YWx1ZQotICAgICAgICAvLy88L3N1bW1hcnk+CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGUgSGV4VmFsKGJ5dGUgY2gpCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmICgoY2ggPj0gJzAnKSAmJiAoY2ggPD0gJzknKSkKQEAgLTQxNiw5ICs0MTYsOSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgLy8vPHN1bW1hcnk+CisgICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAgLy8vIENvbnZlcnQgYSBieXRlIGNvbnRhaW5pbmcgYSBoZXggdmFsdWUgdG8gaXRzIGNvcnJlc3BvbmRpbmcgaGV4IGNoYXJhY3RlcgotICAgICAgICAvLy88L3N1bW1hcnk+CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGUgSGV4Q2hhcihieXRlIHZhbCkKICAgICAgICAgewogICAgICAgICAgICAgdmFsICY9IDB4MEY7CkBAIC00MzMsOSArNDMzLDkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIC8vLzxzdW1tYXJ5PgorICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgIC8vLyBXcml0ZSB0aGUgYnl0ZXMgaW4gYXJyYXkgYnVmIGFzIGEgSlNPTiBjaGFyYWN0ZXJzLCBlc2NhcGluZyBhcyBuZWVkZWQKLSAgICAgICAgLy8vPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVKU09OU3RyaW5nKGJ5dGVbXSBiKQogICAgICAgICB7CiAgICAgICAgICAgICBjb250ZXh0LldyaXRlKCk7CkBAIC00NzksMTQgKzQ3OSwxNCBAQAogICAgICAgICAgICAgdHJhbnMuV3JpdGUoUVVPVEUpOwogICAgICAgICB9CiAKLSAgICAgICAgLy8vPHN1bW1hcnk+CisgICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAgLy8vIFdyaXRlIG91dCBudW1iZXIgYXMgYSBKU09OIHZhbHVlLiBJZiB0aGUgY29udGV4dCBkaWN0YXRlcyBzbywgaXQgd2lsbCBiZQogICAgICAgICAvLy8gd3JhcHBlZCBpbiBxdW90ZXMgdG8gb3V0cHV0IGFzIGEgSlNPTiBzdHJpbmcuCi0gICAgICAgIC8vLzwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJpdmF0ZSB2b2lkIFdyaXRlSlNPTkludGVnZXIobG9uZyBudW0pCiAgICAgICAgIHsKICAgICAgICAgICAgIGNvbnRleHQuV3JpdGUoKTsKLSAgICAgICAgICAgIFN0cmluZyBzdHIgPSBudW0uVG9TdHJpbmcoKTsKKyAgICAgICAgICAgIHN0cmluZyBzdHIgPSBudW0uVG9TdHJpbmcoKTsKIAogICAgICAgICAgICAgYm9vbCBlc2NhcGVOdW0gPSBjb250ZXh0LkVzY2FwZU51bWJlcnMoKTsKICAgICAgICAgICAgIGlmIChlc2NhcGVOdW0pCkBAIC00OTgsMTQgKzQ5OCwxNCBAQAogICAgICAgICAgICAgICAgIHRyYW5zLldyaXRlKFFVT1RFKTsKICAgICAgICAgfQogCi0gICAgICAgIC8vLzxzdW1tYXJ5PgorICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgIC8vLyBXcml0ZSBvdXQgYSBkb3VibGUgYXMgYSBKU09OIHZhbHVlLiBJZiBpdCBpcyBOYU4gb3IgaW5maW5pdHkgb3IgaWYgdGhlCiAgICAgICAgIC8vLyBjb250ZXh0IGRpY3RhdGVzIGVzY2FwaW5nLCBXcml0ZSBvdXQgYXMgSlNPTiBzdHJpbmcuCi0gICAgICAgIC8vLzwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJpdmF0ZSB2b2lkIFdyaXRlSlNPTkRvdWJsZShkb3VibGUgbnVtKQogICAgICAgICB7CiAgICAgICAgICAgICBjb250ZXh0LldyaXRlKCk7Ci0gICAgICAgICAgICBTdHJpbmcgc3RyID0gbnVtLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOworICAgICAgICAgICAgc3RyaW5nIHN0ciA9IG51bS5Ub1N0cmluZygiRzE3IiwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CiAgICAgICAgICAgICBib29sIHNwZWNpYWwgPSBmYWxzZTsKIAogICAgICAgICAgICAgc3dpdGNoIChzdHJbMF0pCkBAIC01MzIsMTAgKzUzMiwxMCBAQAogICAgICAgICAgICAgaWYgKGVzY2FwZU51bSkKICAgICAgICAgICAgICAgICB0cmFucy5Xcml0ZShRVU9URSk7CiAgICAgICAgIH0KLSAgICAgICAgLy8vPHN1bW1hcnk+CisgICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAgLy8vIFdyaXRlIG91dCBjb250ZW50cyBvZiBieXRlIGFycmF5IGIgYXMgYSBKU09OIHN0cmluZyB3aXRoIGJhc2UtNjQgZW5jb2RlZAogICAgICAgICAvLy8gZGF0YQotICAgICAgICAvLy88L3N1bW1hcnk+CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHByaXZhdGUgdm9pZCBXcml0ZUpTT05CYXNlNjQoYnl0ZVtdIGIpCiAgICAgICAgIHsKICAgICAgICAgICAgIGNvbnRleHQuV3JpdGUoKTsKQEAgLTY5OCw3ICs2OTgsNyBAQAogICAgICAgICAgICAgV3JpdGVKU09ORG91YmxlKGR1Yik7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVN0cmluZyhTdHJpbmcgc3RyKQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVN0cmluZyhzdHJpbmcgc3RyKQogICAgICAgICB7CiAgICAgICAgICAgICBieXRlW10gYiA9IHV0ZjhFbmNvZGluZy5HZXRCeXRlcyhzdHIpOwogICAgICAgICAgICAgV3JpdGVKU09OU3RyaW5nKGIpOwpAQCAtNzEzLDEzICs3MTMsMTQgQEAKICAgICAgICAgICogUmVhZGluZyBtZXRob2RzLgogICAgICAgICAgKi8KIAotICAgICAgICAvLy88c3VtbWFyeT4KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgICAvLy8gUmVhZCBpbiBhIEpTT04gc3RyaW5nLCB1bmVzY2FwaW5nIGFzIGFwcHJvcHJpYXRlLi4gU2tpcCBSZWFkaW5nIGZyb20gdGhlCiAgICAgICAgIC8vLyBjb250ZXh0IGlmIHNraXBDb250ZXh0IGlzIHRydWUuCi0gICAgICAgIC8vLzwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJpdmF0ZSBieXRlW10gUmVhZEpTT05TdHJpbmcoYm9vbCBza2lwQ29udGV4dCkKICAgICAgICAgewogICAgICAgICAgICAgTWVtb3J5U3RyZWFtIGJ1ZmZlciA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKKyAgICAgICAgICAgIExpc3Q8Y2hhcj4gY29kZXVuaXRzID0gbmV3IExpc3Q8Y2hhcj4oKTsKIAogCiAgICAgICAgICAgICBpZiAoIXNraXBDb250ZXh0KQpAQCAtNzY0LDE1ICs3NjUsNDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSGV4VmFsKChieXRlKXRlbXBCdWZmZXJbMV0pIDw8IDgpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSGV4VmFsKChieXRlKXRlbXBCdWZmZXJbMl0pIDw8IDQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGV4VmFsKHRlbXBCdWZmZXJbM10pKTsKLSAgICAgICAgICAgICAgICB2YXIgdG1wID0gdXRmOEVuY29kaW5nLkdldEJ5dGVzKG5ldyBjaGFyW10geyAoY2hhcil3Y2ggfSk7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLldyaXRlKHRtcCwgMCwgdG1wLkxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKENoYXIuSXNIaWdoU3Vycm9nYXRlKChjaGFyKXdjaCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoY29kZXVuaXRzLkNvdW50ID4gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgbG93IHN1cnJvZ2F0ZSBjaGFyIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY29kZXVuaXRzLkFkZCgoY2hhcil3Y2gpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChDaGFyLklzTG93U3Vycm9nYXRlKChjaGFyKXdjaCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoY29kZXVuaXRzLkNvdW50ID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGhpZ2ggc3Vycm9nYXRlIGNoYXIiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjb2RldW5pdHMuQWRkKChjaGFyKXdjaCk7CisgICAgICAgICAgICAgICAgICAgIHZhciB0bXAgPSB1dGY4RW5jb2RpbmcuR2V0Qnl0ZXMoY29kZXVuaXRzLlRvQXJyYXkoKSk7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5Xcml0ZSh0bXAsIDAsIHRtcC5MZW5ndGgpOworICAgICAgICAgICAgICAgICAgICBjb2RldW5pdHMuQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHRtcCA9IHV0ZjhFbmNvZGluZy5HZXRCeXRlcyhuZXcgY2hhcltdIHsgKGNoYXIpd2NoIH0pOworICAgICAgICAgICAgICAgICAgICBidWZmZXIuV3JpdGUodG1wLCAwLCB0bXAuTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgaWYgKGNvZGV1bml0cy5Db3VudCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGxvdyBzdXJyb2dhdGUgY2hhciIpOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICByZXR1cm4gYnVmZmVyLlRvQXJyYXkoKTsKICAgICAgICAgfQogCi0gICAgICAgIC8vLzxzdW1tYXJ5PgorICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gYnl0ZSBjb3VsZCBiZSBhIHZhbGlkIHBhcnQgb2YgYSBKU09OIG51bWJlci4KLSAgICAgICAgLy8vPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwcml2YXRlIGJvb2wgSXNKU09OTnVtZXJpYyhieXRlIGIpCiAgICAgICAgIHsKICAgICAgICAgICAgIHN3aXRjaCAoYikKQEAgLTc5NywxMSArODMwLDExIEBACiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAotICAgICAgICAvLy88c3VtbWFyeT4KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgICAvLy8gUmVhZCBpbiBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgdGhhdCBhcmUgYWxsIHZhbGlkIGluIEpTT04gbnVtYmVycy4gRG9lcwogICAgICAgICAvLy8gbm90IGRvIGEgY29tcGxldGUgcmVnZXggY2hlY2sgdG8gdmFsaWRhdGUgdGhhdCB0aGlzIGlzIGFjdHVhbGx5IGEgbnVtYmVyLgotICAgICAgICAvLy8vPC9zdW1tYXJ5PgotICAgICAgICBwcml2YXRlIFN0cmluZyBSZWFkSlNPTk51bWVyaWNDaGFycygpCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgc3RyaW5nIFJlYWRKU09OTnVtZXJpY0NoYXJzKCkKICAgICAgICAgewogICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzdHJibGQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogICAgICAgICAgICAgd2hpbGUgKHRydWUpCkBAIC04MTYsOSArODQ5LDkgQEAKICAgICAgICAgICAgIHJldHVybiBzdHJibGQuVG9TdHJpbmcoKTsKICAgICAgICAgfQogCi0gICAgICAgIC8vLzxzdW1tYXJ5PgorICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgIC8vLyBSZWFkIGluIGEgSlNPTiBudW1iZXIuIElmIHRoZSBjb250ZXh0IGRpY3RhdGVzLCBSZWFkIGluIGVuY2xvc2luZyBxdW90ZXMuCi0gICAgICAgIC8vLzwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJpdmF0ZSBsb25nIFJlYWRKU09OSW50ZWdlcigpCiAgICAgICAgIHsKICAgICAgICAgICAgIGNvbnRleHQuUmVhZCgpOwpAQCAtODI2LDM2ICs4NTksMzcgQEAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBSZWFkSlNPTlN5bnRheENoYXIoUVVPVEUpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RyaW5nIHN0ciA9IFJlYWRKU09OTnVtZXJpY0NoYXJzKCk7CisKKyAgICAgICAgICAgIHN0cmluZyBzdHIgPSBSZWFkSlNPTk51bWVyaWNDaGFycygpOwogICAgICAgICAgICAgaWYgKGNvbnRleHQuRXNjYXBlTnVtYmVycygpKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIFJlYWRKU09OU3ludGF4Q2hhcihRVU9URSk7CiAgICAgICAgICAgICB9CisKICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHJldHVybiBJbnQ2NC5QYXJzZShzdHIpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEZvcm1hdEV4Y2VwdGlvbikKKyAgICAgICAgICAgIGNhdGNoIChGb3JtYXRFeGNlcHRpb24gZmV4KQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCYWQgZGF0YSBlbmNvdW50ZWQgaW4gbnVtZXJpYyBkYXRhIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFkIGRhdGEgZW5jb3VudGVkIGluIG51bWVyaWMgZGF0YSIsIGZleCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICAvLy88c3VtbWFyeT4KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgICAvLy8gUmVhZCBpbiBhIEpTT04gZG91YmxlIHZhbHVlLiBUaHJvdyBpZiB0aGUgdmFsdWUgaXMgbm90IHdyYXBwZWQgaW4gcXVvdGVzCiAgICAgICAgIC8vLyB3aGVuIGV4cGVjdGVkIG9yIGlmIHdyYXBwZWQgaW4gcXVvdGVzIHdoZW4gbm90IGV4cGVjdGVkLgotICAgICAgICAvLy88L3N1bW1hcnk+CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHByaXZhdGUgZG91YmxlIFJlYWRKU09ORG91YmxlKCkKICAgICAgICAgewogICAgICAgICAgICAgY29udGV4dC5SZWFkKCk7CiAgICAgICAgICAgICBpZiAocmVhZGVyLlBlZWsoKSA9PSBRVU9URVswXSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBieXRlW10gYXJyID0gUmVhZEpTT05TdHJpbmcodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgZG91YmxlIGR1YiA9IERvdWJsZS5QYXJzZSh1dGY4RW5jb2RpbmcuR2V0U3RyaW5nKGFyciwwLGFyci5MZW5ndGgpLCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKKyAgICAgICAgICAgICAgICBkb3VibGUgZHViID0gRG91YmxlLlBhcnNlKHV0ZjhFbmNvZGluZy5HZXRTdHJpbmcoYXJyLCAwLCBhcnIuTGVuZ3RoKSwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CiAKLSAgICAgICAgICAgICAgICBpZiAoIWNvbnRleHQuRXNjYXBlTnVtYmVycygpICYmICFEb3VibGUuSXNOYU4oZHViKSAmJgotICAgICAgICAgICAgICAgICAgICAhRG91YmxlLklzSW5maW5pdHkoZHViKSkKKyAgICAgICAgICAgICAgICBpZiAoIWNvbnRleHQuRXNjYXBlTnVtYmVycygpICYmICFEb3VibGUuSXNOYU4oZHViKSAmJiAhRG91YmxlLklzSW5maW5pdHkoZHViKSkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIC8vIFRocm93IGV4Y2VwdGlvbiAtLSB3ZSBzaG91bGQgbm90IGJlIGluIGEgc3RyaW5nIGluIHRoaXMgY2FzZQogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCkBAIC04NzQsMTcgKzkwOCwxNyBAQAogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERvdWJsZS5QYXJzZShSZWFkSlNPTk51bWVyaWNDaGFycygpLCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKEZvcm1hdEV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICBjYXRjaCAoRm9ybWF0RXhjZXB0aW9uIGZleCkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFkIGRhdGEgZW5jb3VudGVkIGluIG51bWVyaWMgZGF0YSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCYWQgZGF0YSBlbmNvdW50ZWQgaW4gbnVtZXJpYyBkYXRhIiwgZmV4KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICAvLzxzdW1tYXJ5PgorICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgIC8vLyBSZWFkIGluIGEgSlNPTiBzdHJpbmcgY29udGFpbmluZyBiYXNlLTY0IGVuY29kZWQgZGF0YSBhbmQgZGVjb2RlIGl0LgotICAgICAgICAvLy88L3N1bW1hcnk+CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHByaXZhdGUgYnl0ZVtdIFJlYWRKU09OQmFzZTY0KCkKICAgICAgICAgewogICAgICAgICAgICAgYnl0ZVtdIGIgPSBSZWFkSlNPTlN0cmluZyhmYWxzZSk7CkBAIC05NTYsNyArOTkwLDcgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgdmFyIGJ1ZiA9IFJlYWRKU09OU3RyaW5nKGZhbHNlKTsKLSAgICAgICAgICAgIG1lc3NhZ2UuTmFtZSA9IHV0ZjhFbmNvZGluZy5HZXRTdHJpbmcoYnVmLDAsYnVmLkxlbmd0aCk7CisgICAgICAgICAgICBtZXNzYWdlLk5hbWUgPSB1dGY4RW5jb2RpbmcuR2V0U3RyaW5nKGJ1ZiwgMCwgYnVmLkxlbmd0aCk7CiAgICAgICAgICAgICBtZXNzYWdlLlR5cGUgPSAoVE1lc3NhZ2VUeXBlKVJlYWRKU09OSW50ZWdlcigpOwogICAgICAgICAgICAgbWVzc2FnZS5TZXFJRCA9IChpbnQpUmVhZEpTT05JbnRlZ2VyKCk7CiAgICAgICAgICAgICByZXR1cm4gbWVzc2FnZTsKQEAgLTEwNzUsMTAgKzExMDksMTAgQEAKICAgICAgICAgICAgIHJldHVybiBSZWFkSlNPTkRvdWJsZSgpOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIFN0cmluZyBSZWFkU3RyaW5nKCkKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBSZWFkU3RyaW5nKCkKICAgICAgICAgewogICAgICAgICAgICAgdmFyIGJ1ZiA9IFJlYWRKU09OU3RyaW5nKGZhbHNlKTsKLSAgICAgICAgICAgIHJldHVybiB1dGY4RW5jb2RpbmcuR2V0U3RyaW5nKGJ1ZiwwLGJ1Zi5MZW5ndGgpOworICAgICAgICAgICAgcmV0dXJuIHV0ZjhFbmNvZGluZy5HZXRTdHJpbmcoYnVmLCAwLCBidWYuTGVuZ3RoKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBieXRlW10gUmVhZEJpbmFyeSgpCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuY3MKaW5kZXggMzVkMTM4Yy4uYWE5MWM1MiAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVE11bHRpcGxleGVkUHJvY2Vzc29yLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5jcwpAQCAtMjksNzQgKzI5LDc3IEBACiAKIG5hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wKIHsKLQotICAgIC8qKgotICAgICAqIFRNdWx0aXBsZXhlZFByb2Nlc3NvciBpcyBhIFRQcm9jZXNzb3IgYWxsb3dpbmcgYSBzaW5nbGUgVFNlcnZlciB0byBwcm92aWRlIG11bHRpcGxlIHNlcnZpY2VzLgotICAgICAqIFRvIGRvIHNvLCB5b3UgaW5zdGFudGlhdGUgdGhlIHByb2Nlc3NvciBhbmQgdGhlbiByZWdpc3RlciBhZGRpdGlvbmFsIHByb2Nlc3NvcnMgd2l0aCBpdCwKLSAgICAgKiBhcyBzaG93biBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6Ci0gICAgICoKLSAgICAgKiAgICAgVE11bHRpcGxleGVkUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IoKTsKLSAgICAgKgotICAgICAqICAgICBwcm9jZXNzb3IucmVnaXN0ZXJQcm9jZXNzb3IoCi0gICAgICogICAgICAgICAiQ2FsY3VsYXRvciIsCi0gICAgICogICAgICAgICBuZXcgQ2FsY3VsYXRvci5Qcm9jZXNzb3IobmV3IENhbGN1bGF0b3JIYW5kbGVyKCkpKTsKLSAgICAgKgotICAgICAqICAgICBwcm9jZXNzb3IucmVnaXN0ZXJQcm9jZXNzb3IoCi0gICAgICogICAgICAgICAiV2VhdGhlclJlcG9ydCIsCi0gICAgICogICAgICAgICBuZXcgV2VhdGhlclJlcG9ydC5Qcm9jZXNzb3IobmV3IFdlYXRoZXJSZXBvcnRIYW5kbGVyKCkpKTsKLSAgICAgKgotICAgICAqICAgICBUU2VydmVyVHJhbnNwb3J0IHQgPSBuZXcgVFNlcnZlclNvY2tldCg5MDkwKTsKLSAgICAgKiAgICAgVFNpbXBsZVNlcnZlciBzZXJ2ZXIgPSBuZXcgVFNpbXBsZVNlcnZlcihwcm9jZXNzb3IsIHQpOwotICAgICAqCi0gICAgICogICAgIHNlcnZlci5zZXJ2ZSgpOwotICAgICAqLworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gPHNlZSBjcmVmPSJUTXVsdGlwbGV4ZWRQcm9jZXNzb3IiLz4gaXMgYSA8c2VlIGNyZWY9IlRQcm9jZXNzb3IiLz4gYWxsb3dpbmcgYSBzaW5nbGUgPHNlZSBjcmVmPSJUaHJpZnQuU2VydmVyLlRTZXJ2ZXIiLz4KKyAgICAvLy8gdG8gcHJvdmlkZSBtdWx0aXBsZSBzZXJ2aWNlcy4KKyAgICAvLy8gPHBhcmEvPgorICAgIC8vLyBUbyBkbyBzbywgeW91IGluc3RhbnRpYXRlIHRoZSBwcm9jZXNzb3IgYW5kIHRoZW4gcmVnaXN0ZXIgYWRkaXRpb25hbCBwcm9jZXNzb3JzIHdpdGggaXQsCisgICAgLy8vIGFzIHNob3duIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZToKKyAgICAvLy8gPHBhcmEvPgorICAgIC8vLyA8Y29kZT4KKyAgICAvLy8gICAgIFRNdWx0aXBsZXhlZFByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgVE11bHRpcGxleGVkUHJvY2Vzc29yKCk7CisgICAgLy8vCisgICAgLy8vICAgICBwcm9jZXNzb3IucmVnaXN0ZXJQcm9jZXNzb3IoCisgICAgLy8vICAgICAgICAgIkNhbGN1bGF0b3IiLAorICAgIC8vLyAgICAgICAgIG5ldyBDYWxjdWxhdG9yLlByb2Nlc3NvcihuZXcgQ2FsY3VsYXRvckhhbmRsZXIoKSkpOworICAgIC8vLworICAgIC8vLyAgICAgcHJvY2Vzc29yLnJlZ2lzdGVyUHJvY2Vzc29yKAorICAgIC8vLyAgICAgICAgICJXZWF0aGVyUmVwb3J0IiwKKyAgICAvLy8gICAgICAgICBuZXcgV2VhdGhlclJlcG9ydC5Qcm9jZXNzb3IobmV3IFdlYXRoZXJSZXBvcnRIYW5kbGVyKCkpKTsKKyAgICAvLy8KKyAgICAvLy8gICAgIFRTZXJ2ZXJUcmFuc3BvcnQgdCA9IG5ldyBUU2VydmVyU29ja2V0KDkwOTApOworICAgIC8vLyAgICAgVFNpbXBsZVNlcnZlciBzZXJ2ZXIgPSBuZXcgVFNpbXBsZVNlcnZlcihwcm9jZXNzb3IsIHQpOworICAgIC8vLworICAgIC8vLyAgICAgc2VydmVyLnNlcnZlKCk7CisgICAgLy8vIDwvY29kZT4KKyAgICAvLy8gPC9zdW1tYXJ5PgogICAgIHB1YmxpYyBjbGFzcyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgOiBUUHJvY2Vzc29yCiAgICAgewotICAgICAgICBwcml2YXRlIERpY3Rpb25hcnk8U3RyaW5nLFRQcm9jZXNzb3I+IFNlcnZpY2VQcm9jZXNzb3JNYXAgPSBuZXcgRGljdGlvbmFyeTxTdHJpbmcsVFByb2Nlc3Nvcj4oKTsKKyAgICAgICAgcHJpdmF0ZSBEaWN0aW9uYXJ5PHN0cmluZywgVFByb2Nlc3Nvcj4gU2VydmljZVByb2Nlc3Nvck1hcCA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgVFByb2Nlc3Nvcj4oKTsKIAotICAgICAgICAvKioKLSAgICAgICAgICogJ1JlZ2lzdGVyJyBhIHNlcnZpY2Ugd2l0aCB0aGlzIFRNdWx0aXBsZXhlZFByb2Nlc3Nvci4gVGhpcyBhbGxvd3MgdXMgdG8gYnJva2VyCi0gICAgICAgICAqIHJlcXVlc3RzIHRvIGluZGl2aWR1YWwgc2VydmljZXMgYnkgdXNpbmcgdGhlIHNlcnZpY2UgbmFtZSB0byBzZWxlY3QgdGhlbSBhdCByZXF1ZXN0IHRpbWUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEFyZ3M6Ci0gICAgICAgICAqIC0gc2VydmljZU5hbWUgICAgTmFtZSBvZiBhIHNlcnZpY2UsIGhhcyB0byBiZSBpZGVudGljYWwgdG8gdGhlIG5hbWUKLSAgICAgICAgICogICAgICAgICAgICAgICAgICBkZWNsYXJlZCBpbiB0aGUgVGhyaWZ0IElETCwgZS5nLiAiV2VhdGhlclJlcG9ydCIuCi0gICAgICAgICAqIC0gcHJvY2Vzc29yICAgICAgSW1wbGVtZW50YXRpb24gb2YgYSBzZXJ2aWNlLCB1c3VhbGx5IHJlZmVycmVkIHRvIGFzICJoYW5kbGVycyIsCi0gICAgICAgICAqICAgICAgICAgICAgICAgICAgZS5nLiBXZWF0aGVyUmVwb3J0SGFuZGxlciBpbXBsZW1lbnRpbmcgV2VhdGhlclJlcG9ydC5JZmFjZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIFJlZ2lzdGVyUHJvY2Vzc29yKFN0cmluZyBzZXJ2aWNlTmFtZSwgVFByb2Nlc3NvciBwcm9jZXNzb3IpCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICdSZWdpc3RlcicgYSBzZXJ2aWNlIHdpdGggdGhpcyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IuIFRoaXMgYWxsb3dzIHVzIHRvIGJyb2tlcgorICAgICAgICAvLy8gcmVxdWVzdHMgdG8gaW5kaXZpZHVhbCBzZXJ2aWNlcyBieSB1c2luZyB0aGUgc2VydmljZSBuYW1lIHRvIHNlbGVjdCB0aGVtIGF0IHJlcXVlc3QgdGltZS4KKyAgICAgICAgLy8vCisgICAgICAgIC8vLyBBcmdzOgorICAgICAgICAvLy8gLSBzZXJ2aWNlTmFtZSAgICBOYW1lIG9mIGEgc2VydmljZSwgaGFzIHRvIGJlIGlkZW50aWNhbCB0byB0aGUgbmFtZQorICAgICAgICAvLy8gICAgICAgICAgICAgICAgICBkZWNsYXJlZCBpbiB0aGUgVGhyaWZ0IElETCwgZS5nLiAiV2VhdGhlclJlcG9ydCIuCisgICAgICAgIC8vLyAtIHByb2Nlc3NvciAgICAgIEltcGxlbWVudGF0aW9uIG9mIGEgc2VydmljZSwgdXN1YWxseSByZWZlcnJlZCB0byBhcyAiaGFuZGxlcnMiLAorICAgICAgICAvLy8gICAgICAgICAgICAgICAgICBlLmcuIFdlYXRoZXJSZXBvcnRIYW5kbGVyIGltcGxlbWVudGluZyBXZWF0aGVyUmVwb3J0LklmYWNlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgdm9pZCBSZWdpc3RlclByb2Nlc3NvcihzdHJpbmcgc2VydmljZU5hbWUsIFRQcm9jZXNzb3IgcHJvY2Vzc29yKQogICAgICAgICB7CiAgICAgICAgICAgICBTZXJ2aWNlUHJvY2Vzc29yTWFwLkFkZChzZXJ2aWNlTmFtZSwgcHJvY2Vzc29yKTsKICAgICAgICAgfQogCiAKLSAgICAgICAgcHJpdmF0ZSB2b2lkIEZhaWwoIFRQcm90b2NvbCBvcHJvdCwgVE1lc3NhZ2UgbWVzc2FnZSwgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUgZXh0eXBlLCBzdHJpbmcgZXR4dCkKKyAgICAgICAgcHJpdmF0ZSB2b2lkIEZhaWwoVFByb3RvY29sIG9wcm90LCBUTWVzc2FnZSBtZXNzYWdlLCBUQXBwbGljYXRpb25FeGNlcHRpb24uRXhjZXB0aW9uVHlwZSBleHR5cGUsIHN0cmluZyBldHh0KQogICAgICAgICB7Ci0gICAgICAgICAgICBUQXBwbGljYXRpb25FeGNlcHRpb24gYXBwZXggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKCBleHR5cGUsIGV0eHQpOworICAgICAgICAgICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGFwcGV4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihleHR5cGUsIGV0eHQpOwogCiAgICAgICAgICAgICBUTWVzc2FnZSBuZXdNZXNzYWdlID0gbmV3IFRNZXNzYWdlKG1lc3NhZ2UuTmFtZSwgVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbiwgbWVzc2FnZS5TZXFJRCk7CiAKICAgICAgICAgICAgIG9wcm90LldyaXRlTWVzc2FnZUJlZ2luKG5ld01lc3NhZ2UpOwotICAgICAgICAgICAgYXBwZXguV3JpdGUoIG9wcm90KTsKKyAgICAgICAgICAgIGFwcGV4LldyaXRlKG9wcm90KTsKICAgICAgICAgICAgIG9wcm90LldyaXRlTWVzc2FnZUVuZCgpOwogICAgICAgICAgICAgb3Byb3QuVHJhbnNwb3J0LkZsdXNoKCk7CiAgICAgICAgIH0KIAogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHByb2Nlc3MgcGVyZm9ybXMgdGhlIGZvbGxvd2luZyBzdGVwczoKLSAgICAgICAgICoKLSAgICAgICAgICogLSBSZWFkIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1lc3NhZ2UuCi0gICAgICAgICAqIC0gRXh0cmFjdCB0aGUgc2VydmljZSBuYW1lIGZyb20gdGhlIG1lc3NhZ2UuCi0gICAgICAgICAqIC0gVXNpbmcgdGhlIHNlcnZpY2UgbmFtZSB0byBsb2NhdGUgdGhlIGFwcHJvcHJpYXRlIHByb2Nlc3Nvci4KLSAgICAgICAgICogLSBEaXNwYXRjaCB0byB0aGUgcHJvY2Vzc29yLCB3aXRoIGEgZGVjb3JhdGVkIGluc3RhbmNlIG9mIFRQcm90b2NvbAotICAgICAgICAgKiAgICB0aGF0IGFsbG93cyByZWFkTWVzc2FnZUJlZ2luKCkgdG8gcmV0dXJuIHRoZSBvcmlnaW5hbCBUTWVzc2FnZS4KLSAgICAgICAgICoKLSAgICAgICAgICogVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZgotICAgICAgICAgKiAtIHRoZSBtZXNzYWdlIHR5cGUgaXMgbm90IENBTEwgb3IgT05FV0FZLAotICAgICAgICAgKiAtIHRoZSBzZXJ2aWNlIG5hbWUgd2FzIG5vdCBmb3VuZCBpbiB0aGUgbWVzc2FnZSwgb3IKLSAgICAgICAgICogLSB0aGUgc2VydmljZSBuYW1lIGhhcyBub3QgYmVlbiBSZWdpc3RlclByb2Nlc3NvcigpZWQuCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHByb2Nlc3MgcGVyZm9ybXMgdGhlIGZvbGxvd2luZyBzdGVwczoKKyAgICAgICAgLy8vCisgICAgICAgIC8vLyAtIFJlYWQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbWVzc2FnZS4KKyAgICAgICAgLy8vIC0gRXh0cmFjdCB0aGUgc2VydmljZSBuYW1lIGZyb20gdGhlIG1lc3NhZ2UuCisgICAgICAgIC8vLyAtIFVzaW5nIHRoZSBzZXJ2aWNlIG5hbWUgdG8gbG9jYXRlIHRoZSBhcHByb3ByaWF0ZSBwcm9jZXNzb3IuCisgICAgICAgIC8vLyAtIERpc3BhdGNoIHRvIHRoZSBwcm9jZXNzb3IsIHdpdGggYSBkZWNvcmF0ZWQgaW5zdGFuY2Ugb2YgVFByb3RvY29sCisgICAgICAgIC8vLyAgICB0aGF0IGFsbG93cyByZWFkTWVzc2FnZUJlZ2luKCkgdG8gcmV0dXJuIHRoZSBvcmlnaW5hbCBUTWVzc2FnZS4KKyAgICAgICAgLy8vIDxwYXJhLz4KKyAgICAgICAgLy8vIFRocm93cyBhbiBleGNlcHRpb24gaWYKKyAgICAgICAgLy8vIC0gdGhlIG1lc3NhZ2UgdHlwZSBpcyBub3QgQ0FMTCBvciBPTkVXQVksCisgICAgICAgIC8vLyAtIHRoZSBzZXJ2aWNlIG5hbWUgd2FzIG5vdCBmb3VuZCBpbiB0aGUgbWVzc2FnZSwgb3IKKyAgICAgICAgLy8vIC0gdGhlIHNlcnZpY2UgbmFtZSBoYXMgbm90IGJlZW4gUmVnaXN0ZXJQcm9jZXNzb3IoKWVkLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwdWJsaWMgYm9vbCBQcm9jZXNzKFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KQogICAgICAgICB7CiAgICAgICAgICAgICAvKiAgVXNlIHRoZSBhY3R1YWwgdW5kZXJseWluZyBwcm90b2NvbCAoZS5nLiBUQmluYXJ5UHJvdG9jb2wpIHRvIHJlYWQgdGhlCkBAIC0xNTUsMTcgKzE1OCwxNyBAQAogCiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogIE91ciBnb2FsIHdhcyB0byB3b3JrIHdpdGggYW55IHByb3RvY29sLiAgSW4gb3JkZXIgdG8gZG8gdGhhdCwgd2UgbmVlZGVkCi0gICAgICAgICAqICB0byBhbGxvdyB0aGVtIHRvIGNhbGwgcmVhZE1lc3NhZ2VCZWdpbigpIGFuZCBnZXQgYSBUTWVzc2FnZSBpbiBleGFjdGx5Ci0gICAgICAgICAqICB0aGUgc3RhbmRhcmQgZm9ybWF0LCB3aXRob3V0IHRoZSBzZXJ2aWNlIG5hbWUgcHJlcGVuZGVkIHRvIFRNZXNzYWdlLm5hbWUuCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgT3VyIGdvYWwgd2FzIHRvIHdvcmsgd2l0aCBhbnkgcHJvdG9jb2wuICBJbiBvcmRlciB0byBkbyB0aGF0LCB3ZSBuZWVkZWQKKyAgICAgICAgLy8vICB0byBhbGxvdyB0aGVtIHRvIGNhbGwgcmVhZE1lc3NhZ2VCZWdpbigpIGFuZCBnZXQgYSBUTWVzc2FnZSBpbiBleGFjdGx5CisgICAgICAgIC8vLyAgdGhlIHN0YW5kYXJkIGZvcm1hdCwgd2l0aG91dCB0aGUgc2VydmljZSBuYW1lIHByZXBlbmRlZCB0byBUTWVzc2FnZS5uYW1lLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwcml2YXRlIGNsYXNzIFN0b3JlZE1lc3NhZ2VQcm90b2NvbCA6IFRQcm90b2NvbERlY29yYXRvcgogICAgICAgICB7CiAgICAgICAgICAgICBUTWVzc2FnZSBNc2dCZWdpbjsKIAogICAgICAgICAgICAgcHVibGljIFN0b3JlZE1lc3NhZ2VQcm90b2NvbChUUHJvdG9jb2wgcHJvdG9jb2wsIFRNZXNzYWdlIG1lc3NhZ2VCZWdpbikKLSAgICAgICAgICAgICAgICA6YmFzZShwcm90b2NvbCkKKyAgICAgICAgICAgICAgICA6IGJhc2UocHJvdG9jb2wpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdGhpcy5Nc2dCZWdpbiA9IG1lc3NhZ2VCZWdpbjsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmNzIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuY3MKaW5kZXggMWUyYWY4My4uMWJkNDIwZiAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuY3MKQEAgLTI5LDYzICsyOSw2MiBAQAogbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbAogewogCi0gICAgLyoqCi0gICAgICogVE11bHRpcGxleGVkUHJvdG9jb2wgaXMgYSBwcm90b2NvbC1pbmRlcGVuZGVudCBjb25jcmV0ZSBkZWNvcmF0b3IgdGhhdCBhbGxvd3MgYSBUaHJpZnQKLSAgICAgKiBjbGllbnQgdG8gY29tbXVuaWNhdGUgd2l0aCBhIG11bHRpcGxleGluZyBUaHJpZnQgc2VydmVyLCBieSBwcmVwZW5kaW5nIHRoZSBzZXJ2aWNlIG5hbWUKLSAgICAgKiB0byB0aGUgZnVuY3Rpb24gbmFtZSBkdXJpbmcgZnVuY3Rpb24gY2FsbHMuCi0gICAgICoKLSAgICAgKiBOT1RFOiBUSElTIElTIE5PVCBUTyBCRSBVU0VEIEJZIFNFUlZFUlMuCi0gICAgICogT24gdGhlIHNlcnZlciwgdXNlIFRNdWx0aXBsZXhlZFByb2Nlc3NvciB0byBoYW5kbGUgcmVxdWVzdHMgZnJvbSBhIG11bHRpcGxleGluZyBjbGllbnQuCi0gICAgICoKLSAgICAgKiBUaGlzIGV4YW1wbGUgdXNlcyBhIHNpbmdsZSBzb2NrZXQgdHJhbnNwb3J0IHRvIGludm9rZSB0d28gc2VydmljZXM6Ci0gICAgICoKLSAgICAgKiAgICAgVFNvY2tldCB0cmFuc3BvcnQgPSBuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgOTA5MCk7Ci0gICAgICogICAgIHRyYW5zcG9ydC5vcGVuKCk7Ci0gICAgICoKLSAgICAgKiAgICAgVEJpbmFyeVByb3RvY29sIHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpOwotICAgICAqCi0gICAgICogICAgIFRNdWx0aXBsZXhlZFByb3RvY29sIG1wID0gbmV3IFRNdWx0aXBsZXhlZFByb3RvY29sKHByb3RvY29sLCAiQ2FsY3VsYXRvciIpOwotICAgICAqICAgICBDYWxjdWxhdG9yLkNsaWVudCBzZXJ2aWNlID0gbmV3IENhbGN1bGF0b3IuQ2xpZW50KG1wKTsKLSAgICAgKgotICAgICAqICAgICBUTXVsdGlwbGV4ZWRQcm90b2NvbCBtcDIgPSBuZXcgVE11bHRpcGxleGVkUHJvdG9jb2wocHJvdG9jb2wsICJXZWF0aGVyUmVwb3J0Iik7Ci0gICAgICogICAgIFdlYXRoZXJSZXBvcnQuQ2xpZW50IHNlcnZpY2UyID0gbmV3IFdlYXRoZXJSZXBvcnQuQ2xpZW50KG1wMik7Ci0gICAgICoKLSAgICAgKiAgICAgU3lzdGVtLm91dC5wcmludGxuKHNlcnZpY2UuYWRkKDIsMikpOwotICAgICAqICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc2VydmljZTIuZ2V0VGVtcGVyYXR1cmUoKSk7Ci0gICAgICoKLSAgICAgKi8KKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFRNdWx0aXBsZXhlZFByb3RvY29sIGlzIGEgcHJvdG9jb2wtaW5kZXBlbmRlbnQgY29uY3JldGUgZGVjb3JhdG9yIHRoYXQgYWxsb3dzIGEgVGhyaWZ0CisgICAgLy8vIGNsaWVudCB0byBjb21tdW5pY2F0ZSB3aXRoIGEgbXVsdGlwbGV4aW5nIFRocmlmdCBzZXJ2ZXIsIGJ5IHByZXBlbmRpbmcgdGhlIHNlcnZpY2UgbmFtZQorICAgIC8vLyB0byB0aGUgZnVuY3Rpb24gbmFtZSBkdXJpbmcgZnVuY3Rpb24gY2FsbHMuCisgICAgLy8vIDxwYXJhLz4KKyAgICAvLy8gTk9URTogVEhJUyBJUyBOT1QgVE8gQkUgVVNFRCBCWSBTRVJWRVJTLgorICAgIC8vLyBPbiB0aGUgc2VydmVyLCB1c2UgVE11bHRpcGxleGVkUHJvY2Vzc29yIHRvIGhhbmRsZSByZXF1ZXN0cyBmcm9tIGEgbXVsdGlwbGV4aW5nIGNsaWVudC4KKyAgICAvLy8gPHBhcmEvPgorICAgIC8vLyBUaGlzIGV4YW1wbGUgdXNlcyBhIHNpbmdsZSBzb2NrZXQgdHJhbnNwb3J0IHRvIGludm9rZSB0d28gc2VydmljZXM6CisgICAgLy8vIDxjb2RlPgorICAgIC8vLyAgICAgVFNvY2tldCB0cmFuc3BvcnQgPSBuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgOTA5MCk7CisgICAgLy8vICAgICB0cmFuc3BvcnQub3BlbigpOworICAgIC8vLworICAgIC8vLyAgICAgVEJpbmFyeVByb3RvY29sIHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpOworICAgIC8vLworICAgIC8vLyAgICAgVE11bHRpcGxleGVkUHJvdG9jb2wgbXAgPSBuZXcgVE11bHRpcGxleGVkUHJvdG9jb2wocHJvdG9jb2wsICJDYWxjdWxhdG9yIik7CisgICAgLy8vICAgICBDYWxjdWxhdG9yLkNsaWVudCBzZXJ2aWNlID0gbmV3IENhbGN1bGF0b3IuQ2xpZW50KG1wKTsKKyAgICAvLy8KKyAgICAvLy8gICAgIFRNdWx0aXBsZXhlZFByb3RvY29sIG1wMiA9IG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbChwcm90b2NvbCwgIldlYXRoZXJSZXBvcnQiKTsKKyAgICAvLy8gICAgIFdlYXRoZXJSZXBvcnQuQ2xpZW50IHNlcnZpY2UyID0gbmV3IFdlYXRoZXJSZXBvcnQuQ2xpZW50KG1wMik7CisgICAgLy8vCisgICAgLy8vICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc2VydmljZS5hZGQoMiwyKSk7CisgICAgLy8vICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc2VydmljZTIuZ2V0VGVtcGVyYXR1cmUoKSk7CisgICAgLy8vIDwvY29kZT4KKyAgICAvLy8gPC9zdW1tYXJ5PgogICAgIHB1YmxpYyBjbGFzcyBUTXVsdGlwbGV4ZWRQcm90b2NvbCA6IFRQcm90b2NvbERlY29yYXRvcgogICAgIHsKIAotICAgICAgICAvKiogVXNlZCB0byBkZWxpbWl0IHRoZSBzZXJ2aWNlIG5hbWUgZnJvbSB0aGUgZnVuY3Rpb24gbmFtZSAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTRVBBUkFUT1IgPSAiOiI7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFVzZWQgdG8gZGVsaW1pdCB0aGUgc2VydmljZSBuYW1lIGZyb20gdGhlIGZ1bmN0aW9uIG5hbWUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIFNFUEFSQVRPUiA9ICI6IjsKIAotICAgICAgICBwcml2YXRlIFN0cmluZyBTZXJ2aWNlTmFtZTsKKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgU2VydmljZU5hbWU7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFdyYXAgdGhlIHNwZWNpZmllZCBwcm90b2NvbCwgYWxsb3dpbmcgaXQgdG8gYmUgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIGEKLSAgICAgICAgICogbXVsdGlwbGV4aW5nIHNlcnZlci4gIFRoZSA8Y29kZT5zZXJ2aWNlTmFtZTwvY29kZT4gaXMgcmVxdWlyZWQgYXMgaXQgaXMKLSAgICAgICAgICogcHJlcGVuZGVkIHRvIHRoZSBtZXNzYWdlIGhlYWRlciBzbyB0aGF0IHRoZSBtdWx0aXBsZXhpbmcgc2VydmVyIGNhbiBicm9rZXIKLSAgICAgICAgICogdGhlIGZ1bmN0aW9uIGNhbGwgdG8gdGhlIHByb3BlciBzZXJ2aWNlLgotICAgICAgICAgKgotICAgICAgICAgKiBBcmdzOgotICAgICAgICAgKiAgcHJvdG9jb2wgICAgICAgIFlvdXIgY29tbXVuaWNhdGlvbiBwcm90b2NvbCBvZiBjaG9pY2UsIGUuZy4gVEJpbmFyeVByb3RvY29sCi0gICAgICAgICAqICBzZXJ2aWNlTmFtZSAgICAgVGhlIHNlcnZpY2UgbmFtZSBvZiB0aGUgc2VydmljZSBjb21tdW5pY2F0aW5nIHZpYSB0aGlzIHByb3RvY29sLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFRNdWx0aXBsZXhlZFByb3RvY29sKFRQcm90b2NvbCBwcm90b2NvbCwgU3RyaW5nIHNlcnZpY2VOYW1lKQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcmFwIHRoZSBzcGVjaWZpZWQgcHJvdG9jb2wsIGFsbG93aW5nIGl0IHRvIGJlIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCBhCisgICAgICAgIC8vLyBtdWx0aXBsZXhpbmcgc2VydmVyLiAgVGhlIDxwYXJhbXJlZiBuYW1lPSJzZXJ2aWNlTmFtZSIvPiBpcyByZXF1aXJlZCBhcyBpdCBpcworICAgICAgICAvLy8gcHJlcGVuZGVkIHRvIHRoZSBtZXNzYWdlIGhlYWRlciBzbyB0aGF0IHRoZSBtdWx0aXBsZXhpbmcgc2VydmVyIGNhbiBicm9rZXIKKyAgICAgICAgLy8vIHRoZSBmdW5jdGlvbiBjYWxsIHRvIHRoZSBwcm9wZXIgc2VydmljZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwcm90b2NvbCI+WW91ciBjb21tdW5pY2F0aW9uIHByb3RvY29sIG9mIGNob2ljZSwgZS5nLiA8c2VlIGNyZWY9IlRCaW5hcnlQcm90b2NvbCIvPi48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InNlcnZpY2VOYW1lIj5UaGUgc2VydmljZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIGNvbW11bmljYXRpbmcgdmlhIHRoaXMgcHJvdG9jb2wuPC9wYXJhbT4KKyAgICAgICAgcHVibGljIFRNdWx0aXBsZXhlZFByb3RvY29sKFRQcm90b2NvbCBwcm90b2NvbCwgc3RyaW5nIHNlcnZpY2VOYW1lKQogICAgICAgICAgICAgOiBiYXNlKHByb3RvY29sKQogICAgICAgICB7CiAgICAgICAgICAgICBTZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lOwogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFByZXBlbmRzIHRoZSBzZXJ2aWNlIG5hbWUgdG8gdGhlIGZ1bmN0aW9uIG5hbWUsIHNlcGFyYXRlZCBieSBUTXVsdGlwbGV4ZWRQcm90b2NvbC5TRVBBUkFUT1IuCi0gICAgICAgICAqIEFyZ3M6Ci0gICAgICAgICAqICAgdE1lc3NhZ2UgICAgIFRoZSBvcmlnaW5hbCBtZXNzYWdlLgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUHJlcGVuZHMgdGhlIHNlcnZpY2UgbmFtZSB0byB0aGUgZnVuY3Rpb24gbmFtZSwgc2VwYXJhdGVkIGJ5IFRNdWx0aXBsZXhlZFByb3RvY29sLlNFUEFSQVRPUi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ0TWVzc2FnZSI+VGhlIG9yaWdpbmFsIG1lc3NhZ2UuPC9wYXJhbT4KICAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UgdE1lc3NhZ2UpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaCh0TWVzc2FnZS5UeXBlKQorICAgICAgICAgICAgc3dpdGNoICh0TWVzc2FnZS5UeXBlKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGNhc2UgVE1lc3NhZ2VUeXBlLkNhbGw6CiAgICAgICAgICAgICAgICAgY2FzZSBUTWVzc2FnZVR5cGUuT25ld2F5OgpAQCAtMTAxLDUgKzEwMCw0IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbC5jcyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbC5jcwppbmRleCBiZjQ4MWFiLi5kZDdhNmUwIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2wuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sLmNzCkBAIC0xMDgsNyArMTA4LDggQEAKICAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVJMzIoaW50IGkzMik7CiAgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlSTY0KGxvbmcgaTY0KTsKICAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVEb3VibGUoZG91YmxlIGQpOwotICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFdyaXRlU3RyaW5nKHN0cmluZyBzKSB7CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgV3JpdGVTdHJpbmcoc3RyaW5nIHMpCisgICAgICAgIHsKICAgICAgICAgICAgIFdyaXRlQmluYXJ5KEVuY29kaW5nLlVURjguR2V0Qnl0ZXMocykpOwogICAgICAgICB9CiAgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlQmluYXJ5KGJ5dGVbXSBiKTsKQEAgLTEzMSw3ICsxMzIsOCBAQAogICAgICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IFJlYWRJMzIoKTsKICAgICAgICAgcHVibGljIGFic3RyYWN0IGxvbmcgUmVhZEk2NCgpOwogICAgICAgICBwdWJsaWMgYWJzdHJhY3QgZG91YmxlIFJlYWREb3VibGUoKTsKLSAgICAgICAgcHVibGljIHZpcnR1YWwgc3RyaW5nIFJlYWRTdHJpbmcoKSB7CisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHN0cmluZyBSZWFkU3RyaW5nKCkKKyAgICAgICAgewogICAgICAgICAgICAgdmFyIGJ1ZiA9IFJlYWRCaW5hcnkoKTsKICAgICAgICAgICAgIHJldHVybiBFbmNvZGluZy5VVEY4LkdldFN0cmluZyhidWYsIDAsIGJ1Zi5MZW5ndGgpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IuY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IuY3MKaW5kZXggN2JjMzRlZi4uODYwMDAwMiAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5jcwpAQCAtMjgsMjYgKzI4LDI1IEBACiAKIG5hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wKIHsKLQotICAgIC8qKgotICAgICAqIFRQcm90b2NvbERlY29yYXRvciBmb3J3YXJkcyBhbGwgcmVxdWVzdHMgdG8gYW4gZW5jbG9zZWQgVFByb3RvY29sIGluc3RhbmNlLAotICAgICAqIHByb3ZpZGluZyBhIHdheSB0byBhdXRob3IgY29uY2lzZSBjb25jcmV0ZSBkZWNvcmF0b3Igc3ViY2xhc3Nlcy4gIFdoaWxlIGl0IGhhcwotICAgICAqIG5vIGFic3RyYWN0IG1ldGhvZHMsIGl0IGlzIG1hcmtlZCBhYnN0cmFjdCBhcyBhIHJlbWluZGVyIHRoYXQgYnkgaXRzZWxmLAotICAgICAqIGl0IGRvZXMgbm90IG1vZGlmeSB0aGUgYmVoYXZpb3VyIG9mIHRoZSBlbmNsb3NlZCBUUHJvdG9jb2wuCi0gICAgICoKLSAgICAgKiBTZWUgcC4xNzUgb2YgRGVzaWduIFBhdHRlcm5zIChieSBHYW1tYSBldCBhbC4pCi0gICAgICogU2VlIFRNdWx0aXBsZXhlZFByb3RvY29sCi0gICAgICovCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyA8c2VlIGNyZWY9IlRQcm90b2NvbERlY29yYXRvciIvPiBmb3J3YXJkcyBhbGwgcmVxdWVzdHMgdG8gYW4gZW5jbG9zZWQgPHNlZSBjcmVmPSJUUHJvdG9jb2wiLz4gaW5zdGFuY2UsCisgICAgLy8vIHByb3ZpZGluZyBhIHdheSB0byBhdXRob3IgY29uY2lzZSBjb25jcmV0ZSBkZWNvcmF0b3Igc3ViY2xhc3Nlcy4gV2hpbGUgaXQgaGFzCisgICAgLy8vIG5vIGFic3RyYWN0IG1ldGhvZHMsIGl0IGlzIG1hcmtlZCBhYnN0cmFjdCBhcyBhIHJlbWluZGVyIHRoYXQgYnkgaXRzZWxmLAorICAgIC8vLyBpdCBkb2VzIG5vdCBtb2RpZnkgdGhlIGJlaGF2aW91ciBvZiB0aGUgZW5jbG9zZWQgPHNlZSBjcmVmPSJUUHJvdG9jb2wiLz4uCisgICAgLy8vIDxwYXJhLz4KKyAgICAvLy8gU2VlIHAuMTc1IG9mIERlc2lnbiBQYXR0ZXJucyAoYnkgR2FtbWEgZXQgYWwuKQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxzZWVhbHNvIGNyZWY9IlRNdWx0aXBsZXhlZFByb3RvY29sIi8+CiAgICAgcHVibGljIGFic3RyYWN0IGNsYXNzIFRQcm90b2NvbERlY29yYXRvciA6IFRQcm90b2NvbAogICAgIHsKICAgICAgICAgcHJpdmF0ZSBUUHJvdG9jb2wgV3JhcHBlZFByb3RvY29sOwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBFbmNsb3NlcyB0aGUgc3BlY2lmaWVkIHByb3RvY29sLgotICAgICAgICAgKiBAcGFyYW0gcHJvdG9jb2wgQWxsIG9wZXJhdGlvbnMgd2lsbCBiZSBmb3J3YXJkIHRvIHRoaXMgcHJvdG9jb2wuICBNdXN0IGJlIG5vbi1udWxsLgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gRW5jbG9zZXMgdGhlIHNwZWNpZmllZCBwcm90b2NvbC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwcm90b2NvbCI+QWxsIG9wZXJhdGlvbnMgd2lsbCBiZSBmb3J3YXJkIHRvIHRoaXMgcHJvdG9jb2wuICBNdXN0IGJlIG5vbi1udWxsLjwvcGFyYW0+CiAgICAgICAgIHB1YmxpYyBUUHJvdG9jb2xEZWNvcmF0b3IoVFByb3RvY29sIHByb3RvY29sKQotICAgICAgICAgICAgOiBiYXNlKCBwcm90b2NvbC5UcmFuc3BvcnQpCisgICAgICAgICAgICA6IGJhc2UocHJvdG9jb2wuVHJhbnNwb3J0KQogICAgICAgICB7CiAKICAgICAgICAgICAgIFdyYXBwZWRQcm90b2NvbCA9IHByb3RvY29sOwpAQCAtMTA0LDcgKzEwMyw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUxpc3RFbmQoKQoteworICAgICAgICB7CiAgICAgICAgICAgICBXcmFwcGVkUHJvdG9jb2wuV3JpdGVMaXN0RW5kKCk7CiAgICAgICAgIH0KIApAQCAtMTQ4LDcgKzE0Nyw3IEBACiAgICAgICAgICAgICBXcmFwcGVkUHJvdG9jb2wuV3JpdGVEb3VibGUodik7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVN0cmluZyhTdHJpbmcgcykKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVTdHJpbmcoc3RyaW5nIHMpCiAgICAgICAgIHsKICAgICAgICAgICAgIFdyYXBwZWRQcm90b2NvbC5Xcml0ZVN0cmluZyhzKTsKICAgICAgICAgfQpAQCAtMjQ4LDcgKzI0Nyw3IEBACiAgICAgICAgICAgICByZXR1cm4gV3JhcHBlZFByb3RvY29sLlJlYWREb3VibGUoKTsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBTdHJpbmcgUmVhZFN0cmluZygpCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgUmVhZFN0cmluZygpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBXcmFwcGVkUHJvdG9jb2wuUmVhZFN0cmluZygpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uY3MKaW5kZXggNzZjNzQ5ZC4uYzBmMDA3ZSAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5jcwpAQCAtNDgsMTQgKzQ4LDE0IEBACiAgICAgICAgICAgICB0eXBlXyA9IHR5cGU7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgVFByb3RvY29sRXhjZXB0aW9uKGludCB0eXBlLCBTdHJpbmcgbWVzc2FnZSkKLSAgICAgICAgICAgIDogYmFzZShtZXNzYWdlKQorICAgICAgICBwdWJsaWMgVFByb3RvY29sRXhjZXB0aW9uKGludCB0eXBlLCBzdHJpbmcgbWVzc2FnZSwgRXhjZXB0aW9uIGlubmVyID0gbnVsbCkKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlLCBpbm5lcikKICAgICAgICAgewogICAgICAgICAgICAgdHlwZV8gPSB0eXBlOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIFRQcm90b2NvbEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkKLSAgICAgICAgICAgIDogYmFzZShtZXNzYWdlKQorICAgICAgICBwdWJsaWMgVFByb3RvY29sRXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlLCBFeGNlcHRpb24gaW5uZXIgPSBudWxsKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UsIGlubmVyKQogICAgICAgICB7CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sVXRpbC5jcyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbFV0aWwuY3MKaW5kZXggMDkzMmE3Zi4uZDk5NWM2YyAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sVXRpbC5jcworKysgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2xVdGlsLmNzCkBAIC05NSw4ICs5NSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBwcm90LlJlYWRMaXN0RW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgIlVua25vd24gZGF0YSB0eXBlICIgKyB0eXBlLlRvU3RyaW5nKCJkIikpOwogICAgICAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgfQogICAgICAgICAgICAgZmluYWxseQogICAgICAgICAgICAgewpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvU2VydmVyL1RTZXJ2ZXIuY3MgYi9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFNlcnZlci5jcwppbmRleCBhMjYzMWE5Li4yYmMwNGYzIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFNlcnZlci5jcworKysgYi9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFNlcnZlci5jcwpAQCAtMjgsMTAwICsyOCwxMjggQEAKIAogbmFtZXNwYWNlIFRocmlmdC5TZXJ2ZXIKIHsKLSAgcHVibGljIGFic3RyYWN0IGNsYXNzIFRTZXJ2ZXIKLSAgewotICAgIC8vQXR0cmlidXRlcwotICAgIHByb3RlY3RlZCBUUHJvY2Vzc29yIHByb2Nlc3NvcjsKLSAgICBwcm90ZWN0ZWQgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQ7Ci0gICAgcHJvdGVjdGVkIFRUcmFuc3BvcnRGYWN0b3J5IGlucHV0VHJhbnNwb3J0RmFjdG9yeTsKLSAgICBwcm90ZWN0ZWQgVFRyYW5zcG9ydEZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeTsKLSAgICBwcm90ZWN0ZWQgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeTsKLSAgICBwcm90ZWN0ZWQgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3Rvcnk7Ci0gICAgcHJvdGVjdGVkIFRTZXJ2ZXJFdmVudEhhbmRsZXIgc2VydmVyRXZlbnRIYW5kbGVyID0gbnVsbDsKKyAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVFNlcnZlcgorICAgIHsKKyAgICAgICAgLy9BdHRyaWJ1dGVzCisgICAgICAgIHByb3RlY3RlZCBUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5OworICAgICAgICBwcm90ZWN0ZWQgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQ7CisgICAgICAgIHByb3RlY3RlZCBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3Rvcnk7CisgICAgICAgIHByb3RlY3RlZCBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5OworICAgICAgICBwcm90ZWN0ZWQgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeTsKKyAgICAgICAgcHJvdGVjdGVkIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5OworICAgICAgICBwcm90ZWN0ZWQgVFNlcnZlckV2ZW50SGFuZGxlciBzZXJ2ZXJFdmVudEhhbmRsZXIgPSBudWxsOwogCi0gICAgLy9NZXRob2RzCi0gICAgcHVibGljIHZvaWQgc2V0RXZlbnRIYW5kbGVyKFRTZXJ2ZXJFdmVudEhhbmRsZXIgc2VoKQotICAgIHsKLSAgICAgIHNlcnZlckV2ZW50SGFuZGxlciA9IHNlaDsKLSAgICB9Ci0gICAgcHVibGljIFRTZXJ2ZXJFdmVudEhhbmRsZXIgZ2V0RXZlbnRIYW5kbGVyKCkKLSAgICB7Ci0gICAgICByZXR1cm4gc2VydmVyRXZlbnRIYW5kbGVyOwotICAgIH0KKyAgICAgICAgLy9NZXRob2RzCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEV2ZW50SGFuZGxlcihUU2VydmVyRXZlbnRIYW5kbGVyIHNlaCkKKyAgICAgICAgeworICAgICAgICAgICAgc2VydmVyRXZlbnRIYW5kbGVyID0gc2VoOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBUU2VydmVyRXZlbnRIYW5kbGVyIGdldEV2ZW50SGFuZGxlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzZXJ2ZXJFdmVudEhhbmRsZXI7CisgICAgICAgIH0KIAotICAgIC8vTG9nIGRlbGVnYXRpb24KLSAgICBwdWJsaWMgZGVsZWdhdGUgdm9pZCBMb2dEZWxlZ2F0ZShzdHJpbmcgc3RyKTsKLSAgICBwcml2YXRlIExvZ0RlbGVnYXRlIF9sb2dEZWxlZ2F0ZTsKLSAgICBwcm90ZWN0ZWQgTG9nRGVsZWdhdGUgbG9nRGVsZWdhdGUKLSAgICB7Ci0gICAgICBnZXQgeyByZXR1cm4gX2xvZ0RlbGVnYXRlOyB9Ci0gICAgICBzZXQgeyBfbG9nRGVsZWdhdGUgPSAodmFsdWUgIT0gbnVsbCkgPyB2YWx1ZSA6IERlZmF1bHRMb2dEZWxlZ2F0ZTsgfQotICAgIH0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgRGVmYXVsdExvZ0RlbGVnYXRlKHN0cmluZyBzKQotICAgIHsKLSAgICAgIENvbnNvbGUuRXJyb3IuV3JpdGVMaW5lKHMpOwotICAgIH0KKyAgICAgICAgLy9Mb2cgZGVsZWdhdGlvbgorICAgICAgICBwdWJsaWMgZGVsZWdhdGUgdm9pZCBMb2dEZWxlZ2F0ZShzdHJpbmcgc3RyKTsKKyAgICAgICAgcHJpdmF0ZSBMb2dEZWxlZ2F0ZSBfbG9nRGVsZWdhdGU7CisgICAgICAgIHByb3RlY3RlZCBMb2dEZWxlZ2F0ZSBsb2dEZWxlZ2F0ZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gX2xvZ0RlbGVnYXRlOyB9CisgICAgICAgICAgICBzZXQgeyBfbG9nRGVsZWdhdGUgPSAodmFsdWUgIT0gbnVsbCkgPyB2YWx1ZSA6IERlZmF1bHRMb2dEZWxlZ2F0ZTsgfQorICAgICAgICB9CisgICAgICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBEZWZhdWx0TG9nRGVsZWdhdGUoc3RyaW5nIHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbnNvbGUuRXJyb3IuV3JpdGVMaW5lKHMpOworICAgICAgICB9CiAKLSAgICAvL0NvbnN0cnVjdGlvbgotICAgIHB1YmxpYyBUU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAotICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCkKLSAgICAgIDogdGhpcyhwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIERlZmF1bHRMb2dEZWxlZ2F0ZSkKLSAgICB7Ci0gICAgfQorICAgICAgICAvL0NvbnN0cnVjdGlvbgorICAgICAgICBwdWJsaWMgVFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0KQorICAgICAgICAgIDogdGhpcyhwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwKKyAgICAgICAgICAgICBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwKKyAgICAgICAgICAgICBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKKyAgICAgICAgICAgICBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKKyAgICAgICAgICAgICBEZWZhdWx0TG9nRGVsZWdhdGUpCisgICAgICAgIHsKKyAgICAgICAgfQogCi0gICAgcHVibGljIFRTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCisgICAgICAgIHB1YmxpYyBUU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgIExvZ0RlbGVnYXRlIGxvZ0RlbGVnYXRlKQorICAgICAgICAgIDogdGhpcyhwcm9jZXNzb3IsCisgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLAorICAgICAgICAgICAgIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLAorICAgICAgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAorICAgICAgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAorICAgICAgICAgICAgIGxvZ0RlbGVnYXRlKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSkKKyAgICAgICAgICA6IHRoaXMocHJvY2Vzc29yLAorICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCisgICAgICAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCisgICAgICAgICAgICAgRGVmYXVsdExvZ0RlbGVnYXRlKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5KQorICAgICAgICAgIDogdGhpcyhwcm9jZXNzb3IsCisgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgRGVmYXVsdExvZ0RlbGVnYXRlKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeSwKICAgICAgICAgICAgIExvZ0RlbGVnYXRlIGxvZ0RlbGVnYXRlKQotICAgICAgOiB0aGlzKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgRGVmYXVsdExvZ0RlbGVnYXRlKQotICAgIHsKLSAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMucHJvY2Vzc29yRmFjdG9yeSA9IG5ldyBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpOworICAgICAgICAgICAgdGhpcy5zZXJ2ZXJUcmFuc3BvcnQgPSBzZXJ2ZXJUcmFuc3BvcnQ7CisgICAgICAgICAgICB0aGlzLmlucHV0VHJhbnNwb3J0RmFjdG9yeSA9IGlucHV0VHJhbnNwb3J0RmFjdG9yeTsKKyAgICAgICAgICAgIHRoaXMub3V0cHV0VHJhbnNwb3J0RmFjdG9yeSA9IG91dHB1dFRyYW5zcG9ydEZhY3Rvcnk7CisgICAgICAgICAgICB0aGlzLmlucHV0UHJvdG9jb2xGYWN0b3J5ID0gaW5wdXRQcm90b2NvbEZhY3Rvcnk7CisgICAgICAgICAgICB0aGlzLm91dHB1dFByb3RvY29sRmFjdG9yeSA9IG91dHB1dFByb3RvY29sRmFjdG9yeTsKKyAgICAgICAgICAgIHRoaXMubG9nRGVsZWdhdGUgPSAobG9nRGVsZWdhdGUgIT0gbnVsbCkgPyBsb2dEZWxlZ2F0ZSA6IERlZmF1bHRMb2dEZWxlZ2F0ZTsKKyAgICAgICAgfQogCi0gICAgcHVibGljIFRTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5KQotICAgICAgOiB0aGlzKHByb2Nlc3NvciwKLSAgICAgICAgIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCi0gICAgICAgICBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKLSAgICAgICAgIERlZmF1bHRMb2dEZWxlZ2F0ZSkKLSAgICB7Ci0gICAgfQorICAgICAgICBwdWJsaWMgVFNlcnZlcihUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgTG9nRGVsZWdhdGUgbG9nRGVsZWdhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMucHJvY2Vzc29yRmFjdG9yeSA9IHByb2Nlc3NvckZhY3Rvcnk7CisgICAgICAgICAgICB0aGlzLnNlcnZlclRyYW5zcG9ydCA9IHNlcnZlclRyYW5zcG9ydDsKKyAgICAgICAgICAgIHRoaXMuaW5wdXRUcmFuc3BvcnRGYWN0b3J5ID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5OworICAgICAgICAgICAgdGhpcy5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5ID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeTsKKyAgICAgICAgICAgIHRoaXMuaW5wdXRQcm90b2NvbEZhY3RvcnkgPSBpbnB1dFByb3RvY29sRmFjdG9yeTsKKyAgICAgICAgICAgIHRoaXMub3V0cHV0UHJvdG9jb2xGYWN0b3J5ID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5OworICAgICAgICAgICAgdGhpcy5sb2dEZWxlZ2F0ZSA9IChsb2dEZWxlZ2F0ZSAhPSBudWxsKSA/IGxvZ0RlbGVnYXRlIDogRGVmYXVsdExvZ0RlbGVnYXRlOworICAgICAgICB9CiAKLSAgICBwdWJsaWMgVFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5KQotICAgICAgOiB0aGlzKHByb2Nlc3NvciwKLSAgICAgICAgIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICBEZWZhdWx0TG9nRGVsZWdhdGUpCi0gICAgeworICAgICAgICAvL0Fic3RyYWN0IEludGVyZmFjZQorICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBTZXJ2ZSgpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBTdG9wKCk7CiAgICAgfQotCi0gICAgcHVibGljIFRTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICBMb2dEZWxlZ2F0ZSBsb2dEZWxlZ2F0ZSkKLSAgICB7Ci0gICAgICB0aGlzLnByb2Nlc3NvciA9IHByb2Nlc3NvcjsKLSAgICAgIHRoaXMuc2VydmVyVHJhbnNwb3J0ID0gc2VydmVyVHJhbnNwb3J0OwotICAgICAgdGhpcy5pbnB1dFRyYW5zcG9ydEZhY3RvcnkgPSBpbnB1dFRyYW5zcG9ydEZhY3Rvcnk7Ci0gICAgICB0aGlzLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5OwotICAgICAgdGhpcy5pbnB1dFByb3RvY29sRmFjdG9yeSA9IGlucHV0UHJvdG9jb2xGYWN0b3J5OwotICAgICAgdGhpcy5vdXRwdXRQcm90b2NvbEZhY3RvcnkgPSBvdXRwdXRQcm90b2NvbEZhY3Rvcnk7Ci0gICAgICB0aGlzLmxvZ0RlbGVnYXRlID0gKGxvZ0RlbGVnYXRlICE9IG51bGwpID8gbG9nRGVsZWdhdGUgOiBEZWZhdWx0TG9nRGVsZWdhdGU7Ci0gICAgfQotCi0gICAgLy9BYnN0cmFjdCBJbnRlcmZhY2UKLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBTZXJ2ZSgpOwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFN0b3AoKTsKLSAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvU2VydmVyL1RTZXJ2ZXJFdmVudEhhbmRsZXIuY3MgYi9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFNlcnZlckV2ZW50SGFuZGxlci5jcwppbmRleCA4NDNiMTY2Li5lODFlZmM2IDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFNlcnZlckV2ZW50SGFuZGxlci5jcworKysgYi9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFNlcnZlckV2ZW50SGFuZGxlci5jcwpAQCAtMjUsMjYgKzI1LDI5IEBACiAKIG5hbWVzcGFjZSBUaHJpZnQuU2VydmVyCiB7Ci0gIC8vLyA8c3VtbWFyeT4KLSAgLy8vIEludGVyZmFjZSBpbXBsZW1lbnRlZCBieSBzZXJ2ZXIgdXNlcnMgdG8gaGFuZGxlIGV2ZW50cyBmcm9tIHRoZSBzZXJ2ZXIKLSAgLy8vIDwvc3VtbWFyeT4KLSAgcHVibGljIGludGVyZmFjZSBUU2VydmVyRXZlbnRIYW5kbGVyCi0gIHsKICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIENhbGxlZCBiZWZvcmUgdGhlIHNlcnZlciBiZWdpbnMgKi8KKyAgICAvLy8gSW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IHNlcnZlciB1c2VycyB0byBoYW5kbGUgZXZlbnRzIGZyb20gdGhlIHNlcnZlci4KICAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHZvaWQgcHJlU2VydmUoKTsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIENhbGxlZCB3aGVuIGEgbmV3IGNsaWVudCBoYXMgY29ubmVjdGVkIGFuZCBpcyBhYm91dCB0byBiZWluZyBwcm9jZXNzaW5nICovCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBPYmplY3QgY3JlYXRlQ29udGV4dChUaHJpZnQuUHJvdG9jb2wuVFByb3RvY29sIGlucHV0LCBUaHJpZnQuUHJvdG9jb2wuVFByb3RvY29sIG91dHB1dCk7Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBDYWxsZWQgd2hlbiBhIGNsaWVudCBoYXMgZmluaXNoZWQgcmVxdWVzdC1oYW5kbGluZyB0byBkZWxldGUgc2VydmVyIGNvbnRleHQgKi8KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHZvaWQgZGVsZXRlQ29udGV4dChPYmplY3Qgc2VydmVyQ29udGV4dCwgVGhyaWZ0LlByb3RvY29sLlRQcm90b2NvbCBpbnB1dCwgVGhyaWZ0LlByb3RvY29sLlRQcm90b2NvbCBvdXRwdXQpOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQ2FsbGVkIHdoZW4gYSBjbGllbnQgaXMgYWJvdXQgdG8gY2FsbCB0aGUgcHJvY2Vzc29yICovCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICB2b2lkIHByb2Nlc3NDb250ZXh0KE9iamVjdCBzZXJ2ZXJDb250ZXh0LCBUaHJpZnQuVHJhbnNwb3J0LlRUcmFuc3BvcnQgdHJhbnNwb3J0KTsKLSAgfTsKKyAgICBwdWJsaWMgaW50ZXJmYWNlIFRTZXJ2ZXJFdmVudEhhbmRsZXIKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENhbGxlZCBiZWZvcmUgdGhlIHNlcnZlciBiZWdpbnMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHZvaWQgcHJlU2VydmUoKTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDYWxsZWQgd2hlbiBhIG5ldyBjbGllbnQgaGFzIGNvbm5lY3RlZCBhbmQgaXMgYWJvdXQgdG8gYmVpbmcgcHJvY2Vzc2luZy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgb2JqZWN0IGNyZWF0ZUNvbnRleHQoVGhyaWZ0LlByb3RvY29sLlRQcm90b2NvbCBpbnB1dCwgVGhyaWZ0LlByb3RvY29sLlRQcm90b2NvbCBvdXRwdXQpOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENhbGxlZCB3aGVuIGEgY2xpZW50IGhhcyBmaW5pc2hlZCByZXF1ZXN0LWhhbmRsaW5nIHRvIGRlbGV0ZSBzZXJ2ZXIgY29udGV4dC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgdm9pZCBkZWxldGVDb250ZXh0KG9iamVjdCBzZXJ2ZXJDb250ZXh0LCBUaHJpZnQuUHJvdG9jb2wuVFByb3RvY29sIGlucHV0LCBUaHJpZnQuUHJvdG9jb2wuVFByb3RvY29sIG91dHB1dCk7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ2FsbGVkIHdoZW4gYSBjbGllbnQgaXMgYWJvdXQgdG8gY2FsbCB0aGUgcHJvY2Vzc29yLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICB2b2lkIHByb2Nlc3NDb250ZXh0KG9iamVjdCBzZXJ2ZXJDb250ZXh0LCBUaHJpZnQuVHJhbnNwb3J0LlRUcmFuc3BvcnQgdHJhbnNwb3J0KTsKKyAgICB9OwogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvU2VydmVyL1RTaW1wbGVTZXJ2ZXIuY3MgYi9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFNpbXBsZVNlcnZlci5jcwppbmRleCAyNjdiNDcwLi40ZTdlYTk2IDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFNpbXBsZVNlcnZlci5jcworKysgYi9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFNpbXBsZVNlcnZlci5jcwpAQCAtMjcsMTM4ICsyNywxNTQgQEAKIAogbmFtZXNwYWNlIFRocmlmdC5TZXJ2ZXIKIHsKLSAgLy8vIDxzdW1tYXJ5PgotICAvLy8gU2ltcGxlIHNpbmdsZS10aHJlYWRlZCBzZXJ2ZXIgZm9yIHRlc3RpbmcKLSAgLy8vIDwvc3VtbWFyeT4KLSAgcHVibGljIGNsYXNzIFRTaW1wbGVTZXJ2ZXIgOiBUU2VydmVyCi0gIHsKLSAgICBwcml2YXRlIGJvb2wgc3RvcCA9IGZhbHNlOwotCi0gICAgcHVibGljIFRTaW1wbGVTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0KQotICAgICAgOiBiYXNlKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgRGVmYXVsdExvZ0RlbGVnYXRlKQorICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gU2ltcGxlIHNpbmdsZS10aHJlYWRlZCBzZXJ2ZXIgZm9yIHRlc3RpbmcuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgVFNpbXBsZVNlcnZlciA6IFRTZXJ2ZXIKICAgICB7Ci0gICAgfQorICAgICAgICBwcml2YXRlIGJvb2wgc3RvcCA9IGZhbHNlOwogCi0gICAgcHVibGljIFRTaW1wbGVTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICBMb2dEZWxlZ2F0ZSBsb2dEZWwpCi0gICAgICA6IGJhc2UocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBsb2dEZWwpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyBUU2ltcGxlU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAotICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSkKLSAgICAgIDogYmFzZShwcm9jZXNzb3IsCi0gICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAotICAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCi0gICAgICAgICAgIERlZmF1bHRMb2dEZWxlZ2F0ZSkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIFRTaW1wbGVTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSkKLSAgICAgIDogYmFzZShwcm9jZXNzb3IsCi0gICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgIHByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgIHByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgIERlZmF1bHRMb2dEZWxlZ2F0ZSkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIHZvaWQgU2VydmUoKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQuTGlzdGVuKCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCi0gICAgICB7Ci0gICAgICAgIGxvZ0RlbGVnYXRlKHR0eC5Ub1N0cmluZygpKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICAvL0ZpcmUgdGhlIHByZVNlcnZlIHNlcnZlciBldmVudCB3aGVuIHNlcnZlciBpcyB1cCBidXQgYmVmb3JlIGFueSBjbGllbnQgY29ubmVjdGlvbnMKLSAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKLSAgICAgICAgc2VydmVyRXZlbnRIYW5kbGVyLnByZVNlcnZlKCk7Ci0KLSAgICAgIHdoaWxlICghc3RvcCkKLSAgICAgIHsKLSAgICAgICAgVFRyYW5zcG9ydCBjbGllbnQgPSBudWxsOwotICAgICAgICBUVHJhbnNwb3J0IGlucHV0VHJhbnNwb3J0ID0gbnVsbDsKLSAgICAgICAgVFRyYW5zcG9ydCBvdXRwdXRUcmFuc3BvcnQgPSBudWxsOwotICAgICAgICBUUHJvdG9jb2wgaW5wdXRQcm90b2NvbCA9IG51bGw7Ci0gICAgICAgIFRQcm90b2NvbCBvdXRwdXRQcm90b2NvbCA9IG51bGw7Ci0gICAgICAgIE9iamVjdCBjb25uZWN0aW9uQ29udGV4dCA9IG51bGw7Ci0gICAgICAgIHRyeQorICAgICAgICBwdWJsaWMgVFNpbXBsZVNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0KQorICAgICAgICAgIDogYmFzZShwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIERlZmF1bHRMb2dEZWxlZ2F0ZSkKICAgICAgICAgewotICAgICAgICAgIHVzaW5nIChjbGllbnQgPSBzZXJ2ZXJUcmFuc3BvcnQuQWNjZXB0KCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRTaW1wbGVTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgIExvZ0RlbGVnYXRlIGxvZ0RlbCkKKyAgICAgICAgICA6IGJhc2UocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBsb2dEZWwpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUU2ltcGxlU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5KQorICAgICAgICAgIDogYmFzZShwcm9jZXNzb3IsCisgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKKyAgICAgICAgICAgICBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKKyAgICAgICAgICAgICAgIERlZmF1bHRMb2dEZWxlZ2F0ZSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRTaW1wbGVTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCisgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSkKKyAgICAgICAgICAgIDogYmFzZShwcm9jZXNzb3IsCisgICAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgIERlZmF1bHRMb2dEZWxlZ2F0ZSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRTaW1wbGVTZXJ2ZXIoVFByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5KQorICAgICAgICAgIDogYmFzZShwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICBEZWZhdWx0TG9nRGVsZWdhdGUpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFNlcnZlKCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHVzaW5nIChpbnB1dFRyYW5zcG9ydCA9IGlucHV0VHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQoY2xpZW50KSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHVzaW5nIChvdXRwdXRUcmFuc3BvcnQgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2wgPSBpbnB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbChpbnB1dFRyYW5zcG9ydCk7Ci0gICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbCA9IG91dHB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbChvdXRwdXRUcmFuc3BvcnQpOwotCi0gICAgICAgICAgICAgICAgICAvL1JlY292ZXIgZXZlbnQgaGFuZGxlciAoaWYgYW55KSBhbmQgZmlyZSBjcmVhdGVDb250ZXh0IHNlcnZlciBldmVudCB3aGVuIGEgY2xpZW50IGNvbm5lY3RzCi0gICAgICAgICAgICAgICAgICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25Db250ZXh0ID0gc2VydmVyRXZlbnRIYW5kbGVyLmNyZWF0ZUNvbnRleHQoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpOwotCi0gICAgICAgICAgICAgICAgICAvL1Byb2Nlc3MgY2xpZW50IHJlcXVlc3RzIHVudGlsIGNsaWVudCBkaXNjb25uZWN0cwotICAgICAgICAgICAgICAgICAgd2hpbGUgKCFzdG9wKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWlucHV0VHJhbnNwb3J0LlBlZWsoKSkKLSAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAvL0ZpcmUgcHJvY2Vzc0NvbnRleHQgc2VydmVyIGV2ZW50Ci0gICAgICAgICAgICAgICAgICAgIC8vTi5CLiBUaGlzIGlzIHRoZSBwYXR0ZXJuIGltcGxlbWVudGVkIGluIEMrKyBhbmQgdGhlIGV2ZW50IGZpcmVzIHByb3Zpc2lvbmFsbHkuCi0gICAgICAgICAgICAgICAgICAgIC8vVGhhdCBpcyB0byBzYXkgaXQgbWF5IGJlIG1hbnkgbWludXRlcyBiZXR3ZWVuIHRoZSBldmVudCBmaXJpbmcgYW5kIHRoZSBjbGllbnQgcmVxdWVzdAotICAgICAgICAgICAgICAgICAgICAvL2FjdHVhbGx5IGFycml2aW5nIG9yIHRoZSBjbGllbnQgbWF5IGhhbmcgdXAgd2l0aG91dCBldmVyIG1ha2VpbmcgYSByZXF1ZXN0LgotICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgc2VydmVyRXZlbnRIYW5kbGVyLnByb2Nlc3NDb250ZXh0KGNvbm5lY3Rpb25Db250ZXh0LCBpbnB1dFRyYW5zcG9ydCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vUHJvY2VzcyBjbGllbnQgcmVxdWVzdCAoYmxvY2tzIHVudGlsIHRyYW5zcG9ydCBpcyByZWFkYWJsZSkKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFwcm9jZXNzb3IuUHJvY2VzcyhpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCkpCi0gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0Lkxpc3RlbigpOwogICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIXN0b3AgfHwgdHR4LlR5cGUgIT0gVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkludGVycnVwdGVkKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGxvZ0RlbGVnYXRlKHR0eC5Ub1N0cmluZygpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiB4KQotICAgICAgICB7Ci0gICAgICAgICAgLy9VbmV4cGVjdGVkCi0gICAgICAgICAgbG9nRGVsZWdhdGUoeC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dEZWxlZ2F0ZSh0dHguVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL0ZpcmUgdGhlIHByZVNlcnZlIHNlcnZlciBldmVudCB3aGVuIHNlcnZlciBpcyB1cCBidXQgYmVmb3JlIGFueSBjbGllbnQgY29ubmVjdGlvbnMKKyAgICAgICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXIucHJlU2VydmUoKTsKKworICAgICAgICAgICAgd2hpbGUgKCFzdG9wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRQcm9jZXNzb3IgcHJvY2Vzc29yID0gbnVsbDsKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0IGNsaWVudCA9IG51bGw7CisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydCBpbnB1dFRyYW5zcG9ydCA9IG51bGw7CisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydCBvdXRwdXRUcmFuc3BvcnQgPSBudWxsOworICAgICAgICAgICAgICAgIFRQcm90b2NvbCBpbnB1dFByb3RvY29sID0gbnVsbDsKKyAgICAgICAgICAgICAgICBUUHJvdG9jb2wgb3V0cHV0UHJvdG9jb2wgPSBudWxsOworICAgICAgICAgICAgICAgIG9iamVjdCBjb25uZWN0aW9uQ29udGV4dCA9IG51bGw7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1c2luZyAoY2xpZW50ID0gc2VydmVyVHJhbnNwb3J0LkFjY2VwdCgpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzb3IgPSBwcm9jZXNzb3JGYWN0b3J5LkdldFByb2Nlc3NvcihjbGllbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIChpbnB1dFRyYW5zcG9ydCA9IGlucHV0VHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQoY2xpZW50KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIChvdXRwdXRUcmFuc3BvcnQgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sID0gaW5wdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2woaW5wdXRUcmFuc3BvcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2wgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wob3V0cHV0VHJhbnNwb3J0KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9SZWNvdmVyIGV2ZW50IGhhbmRsZXIgKGlmIGFueSkgYW5kIGZpcmUgY3JlYXRlQ29udGV4dCBzZXJ2ZXIgZXZlbnQgd2hlbiBhIGNsaWVudCBjb25uZWN0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25Db250ZXh0ID0gc2VydmVyRXZlbnRIYW5kbGVyLmNyZWF0ZUNvbnRleHQoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1Byb2Nlc3MgY2xpZW50IHJlcXVlc3RzIHVudGlsIGNsaWVudCBkaXNjb25uZWN0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFzdG9wKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW5wdXRUcmFuc3BvcnQuUGVlaygpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vRmlyZSBwcm9jZXNzQ29udGV4dCBzZXJ2ZXIgZXZlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL04uQi4gVGhpcyBpcyB0aGUgcGF0dGVybiBpbXBsZW1lbnRlZCBpbiBDKysgYW5kIHRoZSBldmVudCBmaXJlcyBwcm92aXNpb25hbGx5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vVGhhdCBpcyB0byBzYXkgaXQgbWF5IGJlIG1hbnkgbWludXRlcyBiZXR3ZWVuIHRoZSBldmVudCBmaXJpbmcgYW5kIHRoZSBjbGllbnQgcmVxdWVzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vYWN0dWFsbHkgYXJyaXZpbmcgb3IgdGhlIGNsaWVudCBtYXkgaGFuZyB1cCB3aXRob3V0IGV2ZXIgbWFrZWluZyBhIHJlcXVlc3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXIucHJvY2Vzc0NvbnRleHQoY29ubmVjdGlvbkNvbnRleHQsIGlucHV0VHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1Byb2Nlc3MgY2xpZW50IHJlcXVlc3QgKGJsb2NrcyB1bnRpbCB0cmFuc3BvcnQgaXMgcmVhZGFibGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwcm9jZXNzb3IuUHJvY2VzcyhpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghc3RvcCB8fCB0dHguVHlwZSAhPSBUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW50ZXJydXB0ZWQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0RlbGVnYXRlKHR0eC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIHgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL1VuZXhwZWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgbG9nRGVsZWdhdGUoeC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvL0ZpcmUgZGVsZXRlQ29udGV4dCBzZXJ2ZXIgZXZlbnQgYWZ0ZXIgY2xpZW50IGRpc2Nvbm5lY3RzCisgICAgICAgICAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXIuZGVsZXRlQ29udGV4dChjb25uZWN0aW9uQ29udGV4dCwgaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgLy9GaXJlIGRlbGV0ZUNvbnRleHQgc2VydmVyIGV2ZW50IGFmdGVyIGNsaWVudCBkaXNjb25uZWN0cwotICAgICAgICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCi0gICAgICAgICAgc2VydmVyRXZlbnRIYW5kbGVyLmRlbGV0ZUNvbnRleHQoY29ubmVjdGlvbkNvbnRleHQsIGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKTsKLSAgICAgIH0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgU3RvcCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0b3AgPSB0cnVlOworICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0LkNsb3NlKCk7CisgICAgICAgIH0KICAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTdG9wKCkKLSAgICB7Ci0gICAgICBzdG9wID0gdHJ1ZTsKLSAgICAgIHNlcnZlclRyYW5zcG9ydC5DbG9zZSgpOwotICAgIH0KLSAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvU2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmNzIGIvbGliL2NzaGFycC9zcmMvU2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmNzCmluZGV4IDRjMjAxZTkuLmE0OTRjZTcgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5jcworKysgYi9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuY3MKQEAgLTI4LDE4NSArMjgsMjY4IEBACiAKIG5hbWVzcGFjZSBUaHJpZnQuU2VydmVyCiB7Ci0gIC8vLyA8c3VtbWFyeT4KLSAgLy8vIFNlcnZlciB0aGF0IHVzZXMgQyMgYnVpbHQtaW4gVGhyZWFkUG9vbCB0byBzcGF3biB0aHJlYWRzIHdoZW4gaGFuZGxpbmcgcmVxdWVzdHMKLSAgLy8vIDwvc3VtbWFyeT4KLSAgcHVibGljIGNsYXNzIFRUaHJlYWRQb29sU2VydmVyIDogVFNlcnZlcgotICB7Ci0gICAgcHJpdmF0ZSBjb25zdCBpbnQgREVGQVVMVF9NSU5fVEhSRUFEUyA9IDEwOwotICAgIHByaXZhdGUgY29uc3QgaW50IERFRkFVTFRfTUFYX1RIUkVBRFMgPSAxMDA7Ci0gICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sIHN0b3AgPSBmYWxzZTsKLQotICAgIHB1YmxpYyBUVGhyZWFkUG9vbFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQpCi0gICAgICA6IHRoaXMocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksCi0gICAgICAgICBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCi0gICAgICAgICBERUZBVUxUX01JTl9USFJFQURTLCBERUZBVUxUX01BWF9USFJFQURTLCBEZWZhdWx0TG9nRGVsZWdhdGUpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyBUVGhyZWFkUG9vbFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsIExvZ0RlbGVnYXRlIGxvZ0RlbGVnYXRlKQotICAgICAgOiB0aGlzKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLAotICAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAotICAgICAgICAgREVGQVVMVF9NSU5fVEhSRUFEUywgREVGQVVMVF9NQVhfVEhSRUFEUywgbG9nRGVsZWdhdGUpCi0gICAgewotICAgIH0KLQotCi0gICAgcHVibGljIFRUaHJlYWRQb29sU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnkpCi0gICAgICA6IHRoaXMocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LCB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnksCi0gICAgICAgICBERUZBVUxUX01JTl9USFJFQURTLCBERUZBVUxUX01BWF9USFJFQURTLCBEZWZhdWx0TG9nRGVsZWdhdGUpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyBUVGhyZWFkUG9vbFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgIGludCBtaW5UaHJlYWRQb29sVGhyZWFkcywgaW50IG1heFRocmVhZFBvb2xUaHJlYWRzLCBMb2dEZWxlZ2F0ZSBsb2dEZWwpCi0gICAgICA6IGJhc2UocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LCBsb2dEZWwpCi0gICAgewotICAgICAgbG9jayAodHlwZW9mKFRUaHJlYWRQb29sU2VydmVyKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKCFUaHJlYWRQb29sLlNldE1heFRocmVhZHMobWF4VGhyZWFkUG9vbFRocmVhZHMsIG1heFRocmVhZFBvb2xUaHJlYWRzKSkKLSAgICAgICAgewotICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkVycm9yOiBjb3VsZCBub3QgU2V0TWF4VGhyZWFkcyBpbiBUaHJlYWRQb29sIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFUaHJlYWRQb29sLlNldE1pblRocmVhZHMobWluVGhyZWFkUG9vbFRocmVhZHMsIG1pblRocmVhZFBvb2xUaHJlYWRzKSkKLSAgICAgICAgewotICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkVycm9yOiBjb3VsZCBub3QgU2V0TWluVGhyZWFkcyBpbiBUaHJlYWRQb29sIik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLQogICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gVXNlIG5ldyBUaHJlYWRQb29sIHRocmVhZCBmb3IgZWFjaCBuZXcgY2xpZW50IGNvbm5lY3Rpb24KKyAgICAvLy8gU2VydmVyIHRoYXQgdXNlcyBDIyBidWlsdC1pbiBUaHJlYWRQb29sIHRvIHNwYXduIHRocmVhZHMgd2hlbiBoYW5kbGluZyByZXF1ZXN0cy4KICAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFNlcnZlKCkKKyAgICBwdWJsaWMgY2xhc3MgVFRocmVhZFBvb2xTZXJ2ZXIgOiBUU2VydmVyCiAgICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIHNlcnZlclRyYW5zcG9ydC5MaXN0ZW4oKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkKLSAgICAgIHsKLSAgICAgICAgbG9nRGVsZWdhdGUoIkVycm9yLCBjb3VsZCBub3QgbGlzdGVuIG9uIFNlcnZlclRyYW5zcG9ydDogIiArIHR0eCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgREVGQVVMVF9NSU5fVEhSRUFEUyA9IC0xOyAgLy8gdXNlIC5ORVQgVGhyZWFkUG9vbCBkZWZhdWx0cworICAgICAgICBwcml2YXRlIGNvbnN0IGludCBERUZBVUxUX01BWF9USFJFQURTID0gLTE7ICAvLyB1c2UgLk5FVCBUaHJlYWRQb29sIGRlZmF1bHRzCisgICAgICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbCBzdG9wID0gZmFsc2U7CiAKLSAgICAgIC8vRmlyZSB0aGUgcHJlU2VydmUgc2VydmVyIGV2ZW50IHdoZW4gc2VydmVyIGlzIHVwIGJ1dCBiZWZvcmUgYW55IGNsaWVudCBjb25uZWN0aW9ucwotICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKQotICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXIucHJlU2VydmUoKTsKKyAgICAgICAgcHVibGljIHN0cnVjdCBDb25maWd1cmF0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgTWluV29ya2VyVGhyZWFkczsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgTWF4V29ya2VyVGhyZWFkczsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgTWluSU9UaHJlYWRzOworICAgICAgICAgICAgcHVibGljIGludCBNYXhJT1RocmVhZHM7CiAKLSAgICAgIHdoaWxlICghc3RvcCkKLSAgICAgIHsKLSAgICAgICAgaW50IGZhaWx1cmVDb3VudCA9IDA7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgVFRyYW5zcG9ydCBjbGllbnQgPSBzZXJ2ZXJUcmFuc3BvcnQuQWNjZXB0KCk7Ci0gICAgICAgICAgVGhyZWFkUG9vbC5RdWV1ZVVzZXJXb3JrSXRlbSh0aGlzLkV4ZWN1dGUsIGNsaWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCFzdG9wIHx8IHR0eC5UeXBlICE9IFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5JbnRlcnJ1cHRlZCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICArK2ZhaWx1cmVDb3VudDsKLSAgICAgICAgICAgIGxvZ0RlbGVnYXRlKHR0eC5Ub1N0cmluZygpKTsKLSAgICAgICAgICB9CisgICAgICAgICAgICBwdWJsaWMgQ29uZmlndXJhdGlvbihpbnQgbWluID0gREVGQVVMVF9NSU5fVEhSRUFEUywgaW50IG1heCA9IERFRkFVTFRfTUFYX1RIUkVBRFMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTWluV29ya2VyVGhyZWFkcyA9IG1pbjsKKyAgICAgICAgICAgICAgICBNYXhXb3JrZXJUaHJlYWRzID0gbWF4OworICAgICAgICAgICAgICAgIE1pbklPVGhyZWFkcyA9IG1pbjsKKyAgICAgICAgICAgICAgICBNYXhJT1RocmVhZHMgPSBtYXg7CisgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIHB1YmxpYyBDb25maWd1cmF0aW9uKGludCBtaW5Xb3JrLCBpbnQgbWF4V29yaywgaW50IG1pbklPLCBpbnQgbWF4SU8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTWluV29ya2VyVGhyZWFkcyA9IG1pbldvcms7CisgICAgICAgICAgICAgICAgTWF4V29ya2VyVGhyZWFkcyA9IG1heFdvcms7CisgICAgICAgICAgICAgICAgTWluSU9UaHJlYWRzID0gbWluSU87CisgICAgICAgICAgICAgICAgTWF4SU9UaHJlYWRzID0gbWF4SU87CisgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgIH0KIAotICAgICAgaWYgKHN0b3ApCi0gICAgICB7Ci0gICAgICAgIHRyeQorICAgICAgICBwdWJsaWMgVFRocmVhZFBvb2xTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0KQorICAgICAgICAgICAgOiB0aGlzKG5ldyBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpLCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLAorICAgICAgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKKyAgICAgICAgICAgICBuZXcgQ29uZmlndXJhdGlvbigpLCBEZWZhdWx0TG9nRGVsZWdhdGUpCiAgICAgICAgIHsKLSAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQuQ2xvc2UoKTsKICAgICAgICAgfQotICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCisKKyAgICAgICAgcHVibGljIFRUaHJlYWRQb29sU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLCBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwgTG9nRGVsZWdhdGUgbG9nRGVsZWdhdGUpCisgICAgICAgICAgICA6IHRoaXMobmV3IFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3NvciksIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksCisgICAgICAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAorICAgICAgICAgICAgIG5ldyBDb25maWd1cmF0aW9uKCksIGxvZ0RlbGVnYXRlKQogICAgICAgICB7Ci0gICAgICAgICAgbG9nRGVsZWdhdGUoIlRTZXJ2ZXJUcmFuc3BvcnQgZmFpbGVkIG9uIGNsb3NlOiAiICsgdHR4Lk1lc3NhZ2UpOwogICAgICAgICB9Ci0gICAgICAgIHN0b3AgPSBmYWxzZTsKLSAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFRocmVhZFBvb2xTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCisgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSkKKyAgICAgICAgICAgIDogdGhpcyhuZXcgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSwgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgbmV3IENvbmZpZ3VyYXRpb24oKSwgRGVmYXVsdExvZ0RlbGVnYXRlKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFRocmVhZFBvb2xTZXJ2ZXIoVFByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5KQorICAgICAgICAgICAgOiB0aGlzKHByb2Nlc3NvckZhY3RvcnksIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LCB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgIG5ldyBDb25maWd1cmF0aW9uKCksIERlZmF1bHRMb2dEZWxlZ2F0ZSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRUaHJlYWRQb29sU2VydmVyKFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBpbnQgbWluVGhyZWFkUG9vbFRocmVhZHMsIGludCBtYXhUaHJlYWRQb29sVGhyZWFkcywgTG9nRGVsZWdhdGUgbG9nRGVsKQorICAgICAgICAgICAgOiB0aGlzKHByb2Nlc3NvckZhY3RvcnksIHNlcnZlclRyYW5zcG9ydCwgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LCBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgbmV3IENvbmZpZ3VyYXRpb24obWluVGhyZWFkUG9vbFRocmVhZHMsIG1heFRocmVhZFBvb2xUaHJlYWRzKSwKKyAgICAgICAgICAgICBsb2dEZWwpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUVGhyZWFkUG9vbFNlcnZlcihUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbiB0aHJlYWRDb25maWcsCisgICAgICAgICAgICAgICAgICAgICBMb2dEZWxlZ2F0ZSBsb2dEZWwpCisgICAgICAgICAgICA6IGJhc2UocHJvY2Vzc29yRmFjdG9yeSwgc2VydmVyVHJhbnNwb3J0LCBpbnB1dFRyYW5zcG9ydEZhY3RvcnksIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LCBsb2dEZWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2sgKHR5cGVvZihUVGhyZWFkUG9vbFNlcnZlcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCh0aHJlYWRDb25maWcuTWF4V29ya2VyVGhyZWFkcyA+IDApIHx8ICh0aHJlYWRDb25maWcuTWF4SU9UaHJlYWRzID4gMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgd29yaywgY29tbTsKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkUG9vbC5HZXRNYXhUaHJlYWRzKG91dCB3b3JrLCBvdXQgY29tbSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0aHJlYWRDb25maWcuTWF4V29ya2VyVGhyZWFkcyA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICB3b3JrID0gdGhyZWFkQ29uZmlnLk1heFdvcmtlclRocmVhZHM7CisgICAgICAgICAgICAgICAgICAgIGlmICh0aHJlYWRDb25maWcuTWF4SU9UaHJlYWRzID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbW0gPSB0aHJlYWRDb25maWcuTWF4SU9UaHJlYWRzOworICAgICAgICAgICAgICAgICAgICBpZiAoIVRocmVhZFBvb2wuU2V0TWF4VGhyZWFkcyh3b3JrLCBjb21tKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkVycm9yOiBjb3VsZCBub3QgU2V0TWF4VGhyZWFkcyBpbiBUaHJlYWRQb29sIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCh0aHJlYWRDb25maWcuTWluV29ya2VyVGhyZWFkcyA+IDApIHx8ICh0aHJlYWRDb25maWcuTWluSU9UaHJlYWRzID4gMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgd29yaywgY29tbTsKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkUG9vbC5HZXRNaW5UaHJlYWRzKG91dCB3b3JrLCBvdXQgY29tbSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0aHJlYWRDb25maWcuTWluV29ya2VyVGhyZWFkcyA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICB3b3JrID0gdGhyZWFkQ29uZmlnLk1pbldvcmtlclRocmVhZHM7CisgICAgICAgICAgICAgICAgICAgIGlmICh0aHJlYWRDb25maWcuTWluSU9UaHJlYWRzID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbW0gPSB0aHJlYWRDb25maWcuTWluSU9UaHJlYWRzOworICAgICAgICAgICAgICAgICAgICBpZiAoIVRocmVhZFBvb2wuU2V0TWluVGhyZWFkcyh3b3JrLCBjb21tKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkVycm9yOiBjb3VsZCBub3QgU2V0TWluVGhyZWFkcyBpbiBUaHJlYWRQb29sIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBVc2UgbmV3IFRocmVhZFBvb2wgdGhyZWFkIGZvciBlYWNoIG5ldyBjbGllbnQgY29ubmVjdGlvbi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgU2VydmUoKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQuTGlzdGVuKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nRGVsZWdhdGUoIkVycm9yLCBjb3VsZCBub3QgbGlzdGVuIG9uIFNlcnZlclRyYW5zcG9ydDogIiArIHR0eCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL0ZpcmUgdGhlIHByZVNlcnZlIHNlcnZlciBldmVudCB3aGVuIHNlcnZlciBpcyB1cCBidXQgYmVmb3JlIGFueSBjbGllbnQgY29ubmVjdGlvbnMKKyAgICAgICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXIucHJlU2VydmUoKTsKKworICAgICAgICAgICAgd2hpbGUgKCFzdG9wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBmYWlsdXJlQ291bnQgPSAwOworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydCBjbGllbnQgPSBzZXJ2ZXJUcmFuc3BvcnQuQWNjZXB0KCk7CisgICAgICAgICAgICAgICAgICAgIFRocmVhZFBvb2wuUXVldWVVc2VyV29ya0l0ZW0odGhpcy5FeGVjdXRlLCBjbGllbnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXN0b3AgfHwgdHR4LlR5cGUgIT0gVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkludGVycnVwdGVkKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICArK2ZhaWx1cmVDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0RlbGVnYXRlKHR0eC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc3RvcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydC5DbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsb2dEZWxlZ2F0ZSgiVFNlcnZlclRyYW5zcG9ydCBmYWlsZWQgb24gY2xvc2U6ICIgKyB0dHguTWVzc2FnZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0b3AgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIExvb3BzIG9uIHByb2Nlc3NpbmcgYSBjbGllbnQgZm9yZXZlcgorICAgICAgICAvLy8gdGhyZWFkQ29udGV4dCB3aWxsIGJlIGEgVFRyYW5zcG9ydCBpbnN0YW5jZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InRocmVhZENvbnRleHQiPjwvcGFyYW0+CisgICAgICAgIHByaXZhdGUgdm9pZCBFeGVjdXRlKG9iamVjdCB0aHJlYWRDb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAoVFRyYW5zcG9ydCBjbGllbnQgPSAoVFRyYW5zcG9ydCl0aHJlYWRDb250ZXh0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRQcm9jZXNzb3IgcHJvY2Vzc29yID0gcHJvY2Vzc29yRmFjdG9yeS5HZXRQcm9jZXNzb3IoY2xpZW50LCB0aGlzKTsKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0IGlucHV0VHJhbnNwb3J0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0IG91dHB1dFRyYW5zcG9ydCA9IG51bGw7CisgICAgICAgICAgICAgICAgVFByb3RvY29sIGlucHV0UHJvdG9jb2wgPSBudWxsOworICAgICAgICAgICAgICAgIFRQcm90b2NvbCBvdXRwdXRQcm90b2NvbCA9IG51bGw7CisgICAgICAgICAgICAgICAgb2JqZWN0IGNvbm5lY3Rpb25Db250ZXh0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFRyYW5zcG9ydCA9IGlucHV0VHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQoY2xpZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFRyYW5zcG9ydCA9IG91dHB1dFRyYW5zcG9ydEZhY3RvcnkuR2V0VHJhbnNwb3J0KGNsaWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sID0gaW5wdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2woaW5wdXRUcmFuc3BvcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2wgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wob3V0cHV0VHJhbnNwb3J0KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy9SZWNvdmVyIGV2ZW50IGhhbmRsZXIgKGlmIGFueSkgYW5kIGZpcmUgY3JlYXRlQ29udGV4dCBzZXJ2ZXIgZXZlbnQgd2hlbiBhIGNsaWVudCBjb25uZWN0cworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25Db250ZXh0ID0gc2VydmVyRXZlbnRIYW5kbGVyLmNyZWF0ZUNvbnRleHQoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvL1Byb2Nlc3MgY2xpZW50IHJlcXVlc3RzIHVudGlsIGNsaWVudCBkaXNjb25uZWN0cworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFzdG9wKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW5wdXRUcmFuc3BvcnQuUGVlaygpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vRmlyZSBwcm9jZXNzQ29udGV4dCBzZXJ2ZXIgZXZlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL04uQi4gVGhpcyBpcyB0aGUgcGF0dGVybiBpbXBsZW1lbnRlZCBpbiBDKysgYW5kIHRoZSBldmVudCBmaXJlcyBwcm92aXNpb25hbGx5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vVGhhdCBpcyB0byBzYXkgaXQgbWF5IGJlIG1hbnkgbWludXRlcyBiZXR3ZWVuIHRoZSBldmVudCBmaXJpbmcgYW5kIHRoZSBjbGllbnQgcmVxdWVzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vYWN0dWFsbHkgYXJyaXZpbmcgb3IgdGhlIGNsaWVudCBtYXkgaGFuZyB1cCB3aXRob3V0IGV2ZXIgbWFrZWluZyBhIHJlcXVlc3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXIucHJvY2Vzc0NvbnRleHQoY29ubmVjdGlvbkNvbnRleHQsIGlucHV0VHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1Byb2Nlc3MgY2xpZW50IHJlcXVlc3QgKGJsb2NrcyB1bnRpbCB0cmFuc3BvcnQgaXMgcmVhZGFibGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwcm9jZXNzb3IuUHJvY2VzcyhpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL1VzdWFsbHkgYSBjbGllbnQgZGlzY29ubmVjdCwgZXhwZWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIHgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vVW5leHBlY3RlZAorICAgICAgICAgICAgICAgICAgICAgICAgbG9nRGVsZWdhdGUoIkVycm9yOiAiICsgeCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvL0ZpcmUgZGVsZXRlQ29udGV4dCBzZXJ2ZXIgZXZlbnQgYWZ0ZXIgY2xpZW50IGRpc2Nvbm5lY3RzCisgICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlckV2ZW50SGFuZGxlci5kZWxldGVDb250ZXh0KGNvbm5lY3Rpb25Db250ZXh0LCBpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCk7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy9DbG9zZSB0cmFuc3BvcnRzCisgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dFRyYW5zcG9ydCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRUcmFuc3BvcnQuQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dFRyYW5zcG9ydCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0VHJhbnNwb3J0LkNsb3NlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gZGlzcG9zYWJsZSBzdHVmZiBzaG91bGQgYmUgZGlzcG9zZWQKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0UHJvdG9jb2wgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2wuRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0UHJvdG9jb2wgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0VHJhbnNwb3J0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFRyYW5zcG9ydC5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXRUcmFuc3BvcnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFRyYW5zcG9ydC5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgU3RvcCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0b3AgPSB0cnVlOworICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0LkNsb3NlKCk7CisgICAgICAgIH0KICAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIExvb3BzIG9uIHByb2Nlc3NpbmcgYSBjbGllbnQgZm9yZXZlcgotICAgIC8vLyB0aHJlYWRDb250ZXh0IHdpbGwgYmUgYSBUVHJhbnNwb3J0IGluc3RhbmNlCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9InRocmVhZENvbnRleHQiPjwvcGFyYW0+Ci0gICAgcHJpdmF0ZSB2b2lkIEV4ZWN1dGUoT2JqZWN0IHRocmVhZENvbnRleHQpCi0gICAgewotICAgICAgVFRyYW5zcG9ydCBjbGllbnQgPSAoVFRyYW5zcG9ydCl0aHJlYWRDb250ZXh0OwotICAgICAgVFRyYW5zcG9ydCBpbnB1dFRyYW5zcG9ydCA9IG51bGw7Ci0gICAgICBUVHJhbnNwb3J0IG91dHB1dFRyYW5zcG9ydCA9IG51bGw7Ci0gICAgICBUUHJvdG9jb2wgaW5wdXRQcm90b2NvbCA9IG51bGw7Ci0gICAgICBUUHJvdG9jb2wgb3V0cHV0UHJvdG9jb2wgPSBudWxsOwotICAgICAgT2JqZWN0IGNvbm5lY3Rpb25Db250ZXh0ID0gbnVsbDsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBpbnB1dFRyYW5zcG9ydCA9IGlucHV0VHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQoY2xpZW50KTsKLSAgICAgICAgb3V0cHV0VHJhbnNwb3J0ID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQoY2xpZW50KTsKLSAgICAgICAgaW5wdXRQcm90b2NvbCA9IGlucHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKGlucHV0VHJhbnNwb3J0KTsKLSAgICAgICAgb3V0cHV0UHJvdG9jb2wgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wob3V0cHV0VHJhbnNwb3J0KTsKLQotICAgICAgICAvL1JlY292ZXIgZXZlbnQgaGFuZGxlciAoaWYgYW55KSBhbmQgZmlyZSBjcmVhdGVDb250ZXh0IHNlcnZlciBldmVudCB3aGVuIGEgY2xpZW50IGNvbm5lY3RzCi0gICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKLSAgICAgICAgICBjb25uZWN0aW9uQ29udGV4dCA9IHNlcnZlckV2ZW50SGFuZGxlci5jcmVhdGVDb250ZXh0KGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKTsKLQotICAgICAgICAvL1Byb2Nlc3MgY2xpZW50IHJlcXVlc3RzIHVudGlsIGNsaWVudCBkaXNjb25uZWN0cwotICAgICAgICB3aGlsZSAoIXN0b3ApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIWlucHV0VHJhbnNwb3J0LlBlZWsoKSkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgLy9GaXJlIHByb2Nlc3NDb250ZXh0IHNlcnZlciBldmVudAotICAgICAgICAgIC8vTi5CLiBUaGlzIGlzIHRoZSBwYXR0ZXJuIGltcGxlbWVudGVkIGluIEMrKyBhbmQgdGhlIGV2ZW50IGZpcmVzIHByb3Zpc2lvbmFsbHkuCi0gICAgICAgICAgLy9UaGF0IGlzIHRvIHNheSBpdCBtYXkgYmUgbWFueSBtaW51dGVzIGJldHdlZW4gdGhlIGV2ZW50IGZpcmluZyBhbmQgdGhlIGNsaWVudCByZXF1ZXN0Ci0gICAgICAgICAgLy9hY3R1YWxseSBhcnJpdmluZyBvciB0aGUgY2xpZW50IG1heSBoYW5nIHVwIHdpdGhvdXQgZXZlciBtYWtlaW5nIGEgcmVxdWVzdC4KLSAgICAgICAgICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCi0gICAgICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXIucHJvY2Vzc0NvbnRleHQoY29ubmVjdGlvbkNvbnRleHQsIGlucHV0VHJhbnNwb3J0KTsKLSAgICAgICAgICAvL1Byb2Nlc3MgY2xpZW50IHJlcXVlc3QgKGJsb2NrcyB1bnRpbCB0cmFuc3BvcnQgaXMgcmVhZGFibGUpCi0gICAgICAgICAgaWYgKCFwcm9jZXNzb3IuUHJvY2VzcyhpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCkpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24pCi0gICAgICB7Ci0gICAgICAgIC8vVXN1YWxseSBhIGNsaWVudCBkaXNjb25uZWN0LCBleHBlY3RlZAotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiB4KQotICAgICAgewotICAgICAgICAvL1VuZXhwZWN0ZWQKLSAgICAgICAgbG9nRGVsZWdhdGUoIkVycm9yOiAiICsgeCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vRmlyZSBkZWxldGVDb250ZXh0IHNlcnZlciBldmVudCBhZnRlciBjbGllbnQgZGlzY29ubmVjdHMKLSAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKLSAgICAgICAgc2VydmVyRXZlbnRIYW5kbGVyLmRlbGV0ZUNvbnRleHQoY29ubmVjdGlvbkNvbnRleHQsIGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKTsKLQotICAgICAgLy9DbG9zZSB0cmFuc3BvcnRzCi0gICAgICBpZiAoaW5wdXRUcmFuc3BvcnQgIT0gbnVsbCkKLSAgICAgICAgaW5wdXRUcmFuc3BvcnQuQ2xvc2UoKTsKLSAgICAgIGlmIChvdXRwdXRUcmFuc3BvcnQgIT0gbnVsbCkKLSAgICAgICAgb3V0cHV0VHJhbnNwb3J0LkNsb3NlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIHZvaWQgU3RvcCgpCi0gICAgewotICAgICAgc3RvcCA9IHRydWU7Ci0gICAgICBzZXJ2ZXJUcmFuc3BvcnQuQ2xvc2UoKTsKLSAgICB9Ci0gIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuY3MgYi9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmNzCmluZGV4IGY4ZWQ4ZTIuLmNjMDUxYTMgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvU2VydmVyL1RUaHJlYWRlZFNlcnZlci5jcwpAQCAtMjYsMjMyICsyNiwyNTcgQEAKIAogbmFtZXNwYWNlIFRocmlmdC5TZXJ2ZXIKIHsKLSAgLy8vIDxzdW1tYXJ5PgotICAvLy8gU2VydmVyIHRoYXQgdXNlcyBDIyB0aHJlYWRzIChhcyBvcHBvc2VkIHRvIHRoZSBUaHJlYWRQb29sKSB3aGVuIGhhbmRsaW5nIHJlcXVlc3RzCi0gIC8vLyA8L3N1bW1hcnk+Ci0gIHB1YmxpYyBjbGFzcyBUVGhyZWFkZWRTZXJ2ZXIgOiBUU2VydmVyCi0gIHsKLSAgICBwcml2YXRlIGNvbnN0IGludCBERUZBVUxUX01BWF9USFJFQURTID0gMTAwOwotICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbCBzdG9wID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBpbnQgbWF4VGhyZWFkczsKLQotICAgIHByaXZhdGUgUXVldWU8VFRyYW5zcG9ydD4gY2xpZW50UXVldWU7Ci0gICAgcHJpdmF0ZSBUSGFzaFNldDxUaHJlYWQ+IGNsaWVudFRocmVhZHM7Ci0gICAgcHJpdmF0ZSBvYmplY3QgY2xpZW50TG9jazsKLSAgICBwcml2YXRlIFRocmVhZCB3b3JrZXJUaHJlYWQ7Ci0KLSAgICBwdWJsaWMgaW50IENsaWVudFRocmVhZHNDb3VudCAgewotICAgICAgICBnZXQgeyByZXR1cm4gY2xpZW50VGhyZWFkcy5Db3VudDsgfQotICAgIH0KLQotICAgIHB1YmxpYyBUVGhyZWFkZWRTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0KQotICAgICAgOiB0aGlzKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLAotICAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAotICAgICAgICAgREVGQVVMVF9NQVhfVEhSRUFEUywgRGVmYXVsdExvZ0RlbGVnYXRlKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVFRocmVhZGVkU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLCBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwgTG9nRGVsZWdhdGUgbG9nRGVsZWdhdGUpCi0gICAgICA6IHRoaXMocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksCi0gICAgICAgICBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCi0gICAgICAgICBERUZBVUxUX01BWF9USFJFQURTLCBsb2dEZWxlZ2F0ZSkKLSAgICB7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgVFRocmVhZGVkU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnkpCi0gICAgICA6IHRoaXMocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LCB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnksCi0gICAgICAgICBERUZBVUxUX01BWF9USFJFQURTLCBEZWZhdWx0TG9nRGVsZWdhdGUpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyBUVGhyZWFkZWRTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICBpbnQgbWF4VGhyZWFkcywgTG9nRGVsZWdhdGUgbG9nRGVsKQotICAgICAgOiBiYXNlKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCBpbnB1dFRyYW5zcG9ydEZhY3RvcnksIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSwgbG9nRGVsKQotICAgIHsKLSAgICAgIHRoaXMubWF4VGhyZWFkcyA9IG1heFRocmVhZHM7Ci0gICAgICBjbGllbnRRdWV1ZSA9IG5ldyBRdWV1ZTxUVHJhbnNwb3J0PigpOwotICAgICAgY2xpZW50TG9jayA9IG5ldyBvYmplY3QoKTsKLSAgICAgIGNsaWVudFRocmVhZHMgPSBuZXcgVEhhc2hTZXQ8VGhyZWFkPigpOwotICAgIH0KLQogICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gVXNlIG5ldyBUaHJlYWQgZm9yIGVhY2ggbmV3IGNsaWVudCBjb25uZWN0aW9uLiBibG9jayB1bnRpbCBudW1Db25uZWN0aW9ucyA8IG1heFRocmVhZHMKKyAgICAvLy8gU2VydmVyIHRoYXQgdXNlcyBDIyB0aHJlYWRzIChhcyBvcHBvc2VkIHRvIHRoZSBUaHJlYWRQb29sKSB3aGVuIGhhbmRsaW5nIHJlcXVlc3RzLgogICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIG92ZXJyaWRlIHZvaWQgU2VydmUoKQorICAgIHB1YmxpYyBjbGFzcyBUVGhyZWFkZWRTZXJ2ZXIgOiBUU2VydmVyCiAgICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIC8vc3RhcnQgd29ya2VyIHRocmVhZAotICAgICAgICB3b3JrZXJUaHJlYWQgPSBuZXcgVGhyZWFkKG5ldyBUaHJlYWRTdGFydChFeGVjdXRlKSk7Ci0gICAgICAgIHdvcmtlclRocmVhZC5TdGFydCgpOwotICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQuTGlzdGVuKCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCi0gICAgICB7Ci0gICAgICAgIGxvZ0RlbGVnYXRlKCJFcnJvciwgY291bGQgbm90IGxpc3RlbiBvbiBTZXJ2ZXJUcmFuc3BvcnQ6ICIgKyB0dHgpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IERFRkFVTFRfTUFYX1RIUkVBRFMgPSAxMDA7CisgICAgICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbCBzdG9wID0gZmFsc2U7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IG1heFRocmVhZHM7CiAKLSAgICAgIC8vRmlyZSB0aGUgcHJlU2VydmUgc2VydmVyIGV2ZW50IHdoZW4gc2VydmVyIGlzIHVwIGJ1dCBiZWZvcmUgYW55IGNsaWVudCBjb25uZWN0aW9ucwotICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKQotICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXIucHJlU2VydmUoKTsKKyAgICAgICAgcHJpdmF0ZSBRdWV1ZTxUVHJhbnNwb3J0PiBjbGllbnRRdWV1ZTsKKyAgICAgICAgcHJpdmF0ZSBUSGFzaFNldDxUaHJlYWQ+IGNsaWVudFRocmVhZHM7CisgICAgICAgIHByaXZhdGUgb2JqZWN0IGNsaWVudExvY2s7CisgICAgICAgIHByaXZhdGUgVGhyZWFkIHdvcmtlclRocmVhZDsKIAotICAgICAgd2hpbGUgKCFzdG9wKQotICAgICAgewotICAgICAgICBpbnQgZmFpbHVyZUNvdW50ID0gMDsKLSAgICAgICAgdHJ5CisgICAgICAgIHB1YmxpYyBpbnQgQ2xpZW50VGhyZWFkc0NvdW50CiAgICAgICAgIHsKLSAgICAgICAgICBUVHJhbnNwb3J0IGNsaWVudCA9IHNlcnZlclRyYW5zcG9ydC5BY2NlcHQoKTsKLSAgICAgICAgICBsb2NrIChjbGllbnRMb2NrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNsaWVudFF1ZXVlLkVucXVldWUoY2xpZW50KTsKLSAgICAgICAgICAgIE1vbml0b3IuUHVsc2UoY2xpZW50TG9jayk7Ci0gICAgICAgICAgfQorICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGNsaWVudFRocmVhZHMuQ291bnQ7IH0KICAgICAgICAgfQotICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIXN0b3AgfHwgdHR4LlR5cGUgIT0gVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkludGVycnVwdGVkKQotICAgICAgICAgIHsKLSAgICAgICAgICAgICsrZmFpbHVyZUNvdW50OwotICAgICAgICAgICAgbG9nRGVsZWdhdGUodHR4LlRvU3RyaW5nKCkpOwotICAgICAgICAgIH0KIAorICAgICAgICBwdWJsaWMgVFRocmVhZGVkU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLCBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCkKKyAgICAgICAgICAgIDogdGhpcyhuZXcgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSwgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwKKyAgICAgICAgICAgICBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCisgICAgICAgICAgICAgREVGQVVMVF9NQVhfVEhSRUFEUywgRGVmYXVsdExvZ0RlbGVnYXRlKQorICAgICAgICB7CiAgICAgICAgIH0KLSAgICAgIH0KIAotICAgICAgaWYgKHN0b3ApCi0gICAgICB7Ci0gICAgICAgIHRyeQorICAgICAgICBwdWJsaWMgVFRocmVhZGVkU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLCBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwgTG9nRGVsZWdhdGUgbG9nRGVsZWdhdGUpCisgICAgICAgICAgICA6IHRoaXMobmV3IFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3NvciksIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksCisgICAgICAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAorICAgICAgICAgICAgIERFRkFVTFRfTUFYX1RIUkVBRFMsIGxvZ0RlbGVnYXRlKQogICAgICAgICB7Ci0gICAgICAgICAgc2VydmVyVHJhbnNwb3J0LkNsb3NlKCk7CiAgICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KQorCisKKyAgICAgICAgcHVibGljIFRUaHJlYWRlZFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5KQorICAgICAgICAgICAgOiB0aGlzKG5ldyBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpLCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICBwcm90b2NvbEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICBERUZBVUxUX01BWF9USFJFQURTLCBEZWZhdWx0TG9nRGVsZWdhdGUpCiAgICAgICAgIHsKLSAgICAgICAgICBsb2dEZWxlZ2F0ZSgiVFNlcnZlVHJhbnNwb3J0IGZhaWxlZCBvbiBjbG9zZTogIiArIHR0eC5NZXNzYWdlKTsKICAgICAgICAgfQotICAgICAgICBzdG9wID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBMb29wcyBvbiBwcm9jZXNzaW5nIGEgY2xpZW50IGZvcmV2ZXIKLSAgICAvLy8gdGhyZWFkQ29udGV4dCB3aWxsIGJlIGEgVFRyYW5zcG9ydCBpbnN0YW5jZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJ0aHJlYWRDb250ZXh0Ij48L3BhcmFtPgotICAgIHByaXZhdGUgdm9pZCBFeGVjdXRlKCkKLSAgICB7Ci0gICAgICB3aGlsZSAoIXN0b3ApCi0gICAgICB7Ci0gICAgICAgIFRUcmFuc3BvcnQgY2xpZW50OwotICAgICAgICBUaHJlYWQgdDsKLSAgICAgICAgbG9jayAoY2xpZW50TG9jaykKKyAgICAgICAgcHVibGljIFRUaHJlYWRlZFNlcnZlcihUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnkpCisgICAgICAgICAgICA6IHRoaXMocHJvY2Vzc29yRmFjdG9yeSwgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgREVGQVVMVF9NQVhfVEhSRUFEUywgRGVmYXVsdExvZ0RlbGVnYXRlKQogICAgICAgICB7Ci0gICAgICAgICAgLy9kb24ndCBkZXF1ZXVlIGlmIHRvbyBtYW55IGNvbm5lY3Rpb25zCi0gICAgICAgICAgd2hpbGUgKGNsaWVudFRocmVhZHMuQ291bnQgPj0gbWF4VGhyZWFkcykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBNb25pdG9yLldhaXQoY2xpZW50TG9jayk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgd2hpbGUgKGNsaWVudFF1ZXVlLkNvdW50ID09IDApCi0gICAgICAgICAgewotICAgICAgICAgICAgTW9uaXRvci5XYWl0KGNsaWVudExvY2spOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGNsaWVudCA9IGNsaWVudFF1ZXVlLkRlcXVldWUoKTsKLSAgICAgICAgICB0ID0gbmV3IFRocmVhZChuZXcgUGFyYW1ldGVyaXplZFRocmVhZFN0YXJ0KENsaWVudFdvcmtlcikpOwotICAgICAgICAgIGNsaWVudFRocmVhZHMuQWRkKHQpOwogICAgICAgICB9Ci0gICAgICAgIC8vc3RhcnQgcHJvY2Vzc2luZyByZXF1ZXN0cyBmcm9tIGNsaWVudCBvbiBuZXcgdGhyZWFkCi0gICAgICAgIHQuU3RhcnQoY2xpZW50KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgQ2xpZW50V29ya2VyKE9iamVjdCBjb250ZXh0KQotICAgIHsKLSAgICAgIFRUcmFuc3BvcnQgY2xpZW50ID0gKFRUcmFuc3BvcnQpY29udGV4dDsKLSAgICAgIFRUcmFuc3BvcnQgaW5wdXRUcmFuc3BvcnQgPSBudWxsOwotICAgICAgVFRyYW5zcG9ydCBvdXRwdXRUcmFuc3BvcnQgPSBudWxsOwotICAgICAgVFByb3RvY29sIGlucHV0UHJvdG9jb2wgPSBudWxsOwotICAgICAgVFByb3RvY29sIG91dHB1dFByb3RvY29sID0gbnVsbDsKLSAgICAgIE9iamVjdCBjb25uZWN0aW9uQ29udGV4dCA9IG51bGw7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgdXNpbmcgKGlucHV0VHJhbnNwb3J0ID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpKQorICAgICAgICBwdWJsaWMgVFRocmVhZGVkU2VydmVyKFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4VGhyZWFkcywgTG9nRGVsZWdhdGUgbG9nRGVsKQorICAgICAgICAgIDogYmFzZShwcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSwgbG9nRGVsKQogICAgICAgICB7Ci0gICAgICAgICAgdXNpbmcgKG91dHB1dFRyYW5zcG9ydCA9IG91dHB1dFRyYW5zcG9ydEZhY3RvcnkuR2V0VHJhbnNwb3J0KGNsaWVudCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgaW5wdXRQcm90b2NvbCA9IGlucHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKGlucHV0VHJhbnNwb3J0KTsKLSAgICAgICAgICAgIG91dHB1dFByb3RvY29sID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKG91dHB1dFRyYW5zcG9ydCk7CisgICAgICAgICAgICB0aGlzLm1heFRocmVhZHMgPSBtYXhUaHJlYWRzOworICAgICAgICAgICAgY2xpZW50UXVldWUgPSBuZXcgUXVldWU8VFRyYW5zcG9ydD4oKTsKKyAgICAgICAgICAgIGNsaWVudExvY2sgPSBuZXcgb2JqZWN0KCk7CisgICAgICAgICAgICBjbGllbnRUaHJlYWRzID0gbmV3IFRIYXNoU2V0PFRocmVhZD4oKTsKKyAgICAgICAgfQogCi0gICAgICAgICAgICAvL1JlY292ZXIgZXZlbnQgaGFuZGxlciAoaWYgYW55KSBhbmQgZmlyZSBjcmVhdGVDb250ZXh0IHNlcnZlciBldmVudCB3aGVuIGEgY2xpZW50IGNvbm5lY3RzCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFVzZSBuZXcgVGhyZWFkIGZvciBlYWNoIG5ldyBjbGllbnQgY29ubmVjdGlvbi4gYmxvY2sgdW50aWwgbnVtQ29ubmVjdGlvbnMgJmx0OyBtYXhUaHJlYWRzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTZXJ2ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vc3RhcnQgd29ya2VyIHRocmVhZAorICAgICAgICAgICAgICAgIHdvcmtlclRocmVhZCA9IG5ldyBUaHJlYWQobmV3IFRocmVhZFN0YXJ0KEV4ZWN1dGUpKTsKKyAgICAgICAgICAgICAgICB3b3JrZXJUaHJlYWQuU3RhcnQoKTsKKyAgICAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQuTGlzdGVuKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nRGVsZWdhdGUoIkVycm9yLCBjb3VsZCBub3QgbGlzdGVuIG9uIFNlcnZlclRyYW5zcG9ydDogIiArIHR0eCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL0ZpcmUgdGhlIHByZVNlcnZlIHNlcnZlciBldmVudCB3aGVuIHNlcnZlciBpcyB1cCBidXQgYmVmb3JlIGFueSBjbGllbnQgY29ubmVjdGlvbnMKICAgICAgICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgY29ubmVjdGlvbkNvbnRleHQgPSBzZXJ2ZXJFdmVudEhhbmRsZXIuY3JlYXRlQ29udGV4dChpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCk7CisgICAgICAgICAgICAgICAgc2VydmVyRXZlbnRIYW5kbGVyLnByZVNlcnZlKCk7CiAKLSAgICAgICAgICAgIC8vUHJvY2VzcyBjbGllbnQgcmVxdWVzdHMgdW50aWwgY2xpZW50IGRpc2Nvbm5lY3RzCiAgICAgICAgICAgICB3aGlsZSAoIXN0b3ApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmICghaW5wdXRUcmFuc3BvcnQuUGVlaygpKQotICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGludCBmYWlsdXJlQ291bnQgPSAwOworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydCBjbGllbnQgPSBzZXJ2ZXJUcmFuc3BvcnQuQWNjZXB0KCk7CisgICAgICAgICAgICAgICAgICAgIGxvY2sgKGNsaWVudExvY2spCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFF1ZXVlLkVucXVldWUoY2xpZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1vbml0b3IuUHVsc2UoY2xpZW50TG9jayk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzdG9wIHx8IHR0eC5UeXBlICE9IFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5JbnRlcnJ1cHRlZCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgKytmYWlsdXJlQ291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2dEZWxlZ2F0ZSh0dHguVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAvL0ZpcmUgcHJvY2Vzc0NvbnRleHQgc2VydmVyIGV2ZW50Ci0gICAgICAgICAgICAgIC8vTi5CLiBUaGlzIGlzIHRoZSBwYXR0ZXJuIGltcGxlbWVudGVkIGluIEMrKyBhbmQgdGhlIGV2ZW50IGZpcmVzIHByb3Zpc2lvbmFsbHkuCi0gICAgICAgICAgICAgIC8vVGhhdCBpcyB0byBzYXkgaXQgbWF5IGJlIG1hbnkgbWludXRlcyBiZXR3ZWVuIHRoZSBldmVudCBmaXJpbmcgYW5kIHRoZSBjbGllbnQgcmVxdWVzdAotICAgICAgICAgICAgICAvL2FjdHVhbGx5IGFycml2aW5nIG9yIHRoZSBjbGllbnQgbWF5IGhhbmcgdXAgd2l0aG91dCBldmVyIG1ha2VpbmcgYSByZXF1ZXN0LgotICAgICAgICAgICAgICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgc2VydmVyRXZlbnRIYW5kbGVyLnByb2Nlc3NDb250ZXh0KGNvbm5lY3Rpb25Db250ZXh0LCBpbnB1dFRyYW5zcG9ydCk7Ci0gICAgICAgICAgICAgIC8vUHJvY2VzcyBjbGllbnQgcmVxdWVzdCAoYmxvY2tzIHVudGlsIHRyYW5zcG9ydCBpcyByZWFkYWJsZSkKLSAgICAgICAgICAgICAgaWYgKCFwcm9jZXNzb3IuUHJvY2VzcyhpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCkpCi0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHN0b3ApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQuQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nRGVsZWdhdGUoIlRTZXJ2ZVRyYW5zcG9ydCBmYWlsZWQgb24gY2xvc2U6ICIgKyB0dHguTWVzc2FnZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0b3AgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24pCi0gICAgICB7Ci0gICAgICAgIC8vVXN1YWxseSBhIGNsaWVudCBkaXNjb25uZWN0LCBleHBlY3RlZAotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiB4KQotICAgICAgewotICAgICAgICAvL1VuZXhwZWN0ZWQKLSAgICAgICAgbG9nRGVsZWdhdGUoIkVycm9yOiAiICsgeCk7Ci0gICAgICB9CiAKLSAgICAgIC8vRmlyZSBkZWxldGVDb250ZXh0IHNlcnZlciBldmVudCBhZnRlciBjbGllbnQgZGlzY29ubmVjdHMKLSAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKLSAgICAgICAgc2VydmVyRXZlbnRIYW5kbGVyLmRlbGV0ZUNvbnRleHQoY29ubmVjdGlvbkNvbnRleHQsIGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKTsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gTG9vcHMgb24gcHJvY2Vzc2luZyBhIGNsaWVudCBmb3JldmVyCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgdm9pZCBFeGVjdXRlKCkKKyAgICAgICAgeworICAgICAgICAgICAgd2hpbGUgKCFzdG9wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQgY2xpZW50OworICAgICAgICAgICAgICAgIFRocmVhZCB0OworICAgICAgICAgICAgICAgIGxvY2sgKGNsaWVudExvY2spCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL2Rvbid0IGRlcXVldWUgaWYgdG9vIG1hbnkgY29ubmVjdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNsaWVudFRocmVhZHMuQ291bnQgPj0gbWF4VGhyZWFkcykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgTW9uaXRvci5XYWl0KGNsaWVudExvY2spOworICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgIGxvY2sgKGNsaWVudExvY2spCi0gICAgICB7Ci0gICAgICAgIGNsaWVudFRocmVhZHMuUmVtb3ZlKFRocmVhZC5DdXJyZW50VGhyZWFkKTsKLSAgICAgICAgTW9uaXRvci5QdWxzZShjbGllbnRMb2NrKTsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNsaWVudFF1ZXVlLkNvdW50ID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1vbml0b3IuV2FpdChjbGllbnRMb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNsaWVudCA9IGNsaWVudFF1ZXVlLkRlcXVldWUoKTsKKyAgICAgICAgICAgICAgICAgICAgdCA9IG5ldyBUaHJlYWQobmV3IFBhcmFtZXRlcml6ZWRUaHJlYWRTdGFydChDbGllbnRXb3JrZXIpKTsKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50VGhyZWFkcy5BZGQodCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vc3RhcnQgcHJvY2Vzc2luZyByZXF1ZXN0cyBmcm9tIGNsaWVudCBvbiBuZXcgdGhyZWFkCisgICAgICAgICAgICAgICAgdC5TdGFydChjbGllbnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIENsaWVudFdvcmtlcihvYmplY3QgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgdXNpbmcgKFRUcmFuc3BvcnQgY2xpZW50ID0gKFRUcmFuc3BvcnQpY29udGV4dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUUHJvY2Vzc29yIHByb2Nlc3NvciA9IHByb2Nlc3NvckZhY3RvcnkuR2V0UHJvY2Vzc29yKGNsaWVudCk7CisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydCBpbnB1dFRyYW5zcG9ydCA9IG51bGw7CisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydCBvdXRwdXRUcmFuc3BvcnQgPSBudWxsOworICAgICAgICAgICAgICAgIFRQcm90b2NvbCBpbnB1dFByb3RvY29sID0gbnVsbDsKKyAgICAgICAgICAgICAgICBUUHJvdG9jb2wgb3V0cHV0UHJvdG9jb2wgPSBudWxsOworICAgICAgICAgICAgICAgIG9iamVjdCBjb25uZWN0aW9uQ29udGV4dCA9IG51bGw7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRUcmFuc3BvcnQgPSBpbnB1dFRyYW5zcG9ydEZhY3RvcnkuR2V0VHJhbnNwb3J0KGNsaWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRUcmFuc3BvcnQgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbCA9IGlucHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKGlucHV0VHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKG91dHB1dFRyYW5zcG9ydCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vUmVjb3ZlciBldmVudCBoYW5kbGVyIChpZiBhbnkpIGFuZCBmaXJlIGNyZWF0ZUNvbnRleHQgc2VydmVyIGV2ZW50IHdoZW4gYSBjbGllbnQgY29ubmVjdHMKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uQ29udGV4dCA9IHNlcnZlckV2ZW50SGFuZGxlci5jcmVhdGVDb250ZXh0KGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy9Qcm9jZXNzIGNsaWVudCByZXF1ZXN0cyB1bnRpbCBjbGllbnQgZGlzY29ubmVjdHMKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICghc3RvcCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlucHV0VHJhbnNwb3J0LlBlZWsoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0ZpcmUgcHJvY2Vzc0NvbnRleHQgc2VydmVyIGV2ZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9OLkIuIFRoaXMgaXMgdGhlIHBhdHRlcm4gaW1wbGVtZW50ZWQgaW4gQysrIGFuZCB0aGUgZXZlbnQgZmlyZXMgcHJvdmlzaW9uYWxseS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1RoYXQgaXMgdG8gc2F5IGl0IG1heSBiZSBtYW55IG1pbnV0ZXMgYmV0d2VlbiB0aGUgZXZlbnQgZmlyaW5nIGFuZCB0aGUgY2xpZW50IHJlcXVlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2FjdHVhbGx5IGFycml2aW5nIG9yIHRoZSBjbGllbnQgbWF5IGhhbmcgdXAgd2l0aG91dCBldmVyIG1ha2VpbmcgYSByZXF1ZXN0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyRXZlbnRIYW5kbGVyLnByb2Nlc3NDb250ZXh0KGNvbm5lY3Rpb25Db250ZXh0LCBpbnB1dFRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9Qcm9jZXNzIGNsaWVudCByZXF1ZXN0IChibG9ja3MgdW50aWwgdHJhbnNwb3J0IGlzIHJlYWRhYmxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcHJvY2Vzc29yLlByb2Nlc3MoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9Vc3VhbGx5IGEgY2xpZW50IGRpc2Nvbm5lY3QsIGV4cGVjdGVkCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiB4KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL1VuZXhwZWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0RlbGVnYXRlKCJFcnJvcjogIiArIHgpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy9GaXJlIGRlbGV0ZUNvbnRleHQgc2VydmVyIGV2ZW50IGFmdGVyIGNsaWVudCBkaXNjb25uZWN0cworICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXIuZGVsZXRlQ29udGV4dChjb25uZWN0aW9uQ29udGV4dCwgaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpOworCisgICAgICAgICAgICAgICAgICAgIGxvY2sgKGNsaWVudExvY2spCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFRocmVhZHMuUmVtb3ZlKFRocmVhZC5DdXJyZW50VGhyZWFkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1vbml0b3IuUHVsc2UoY2xpZW50TG9jayk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmaW5hbGx5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL0Nsb3NlIHRyYW5zcG9ydHMKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0VHJhbnNwb3J0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFRyYW5zcG9ydC5DbG9zZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0VHJhbnNwb3J0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRUcmFuc3BvcnQuQ2xvc2UoKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBkaXNwb3NhYmxlIHN0dWZmIHNob3VsZCBiZSBkaXNwb3NlZAorICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXRQcm90b2NvbCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbC5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXRQcm90b2NvbCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2wuRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFN0b3AoKQorICAgICAgICB7CisgICAgICAgICAgICBzdG9wID0gdHJ1ZTsKKyAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydC5DbG9zZSgpOworICAgICAgICAgICAgLy9jbGVhbiB1cCBhbGwgdGhlIHRocmVhZHMgbXlzZWxmCisgICAgICAgICAgICB3b3JrZXJUaHJlYWQuQWJvcnQoKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKFRocmVhZCB0IGluIGNsaWVudFRocmVhZHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdC5BYm9ydCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIHZvaWQgU3RvcCgpCi0gICAgewotICAgICAgc3RvcCA9IHRydWU7Ci0gICAgICBzZXJ2ZXJUcmFuc3BvcnQuQ2xvc2UoKTsKLSAgICAgIC8vY2xlYW4gdXAgYWxsIHRoZSB0aHJlYWRzIG15c2VsZgotICAgICAgd29ya2VyVGhyZWFkLkFib3J0KCk7Ci0gICAgICBmb3JlYWNoIChUaHJlYWQgdCBpbiBjbGllbnRUaHJlYWRzKQotICAgICAgewotICAgICAgICB0LkFib3J0KCk7Ci0gICAgICB9Ci0gICAgfQotICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UQXBwbGljYXRpb25FeGNlcHRpb24uY3MgYi9saWIvY3NoYXJwL3NyYy9UQXBwbGljYXRpb25FeGNlcHRpb24uY3MKaW5kZXggNGMwZDNhMy4uOGRkN2FlNSAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jcwpAQCAtNDAsNyArNDAsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihFeGNlcHRpb25UeXBlIHR5cGUsIHN0cmluZyBtZXNzYWdlKQotICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UpCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSwgbnVsbCkgLy8gVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGlzIHNlcmlhbGl6YWJsZSwgYnV0IHdlIG5ldmVyIHNlcmlhbGl6ZSBJbm5lckV4Y2VwdGlvbgogICAgICAgICB7CiAgICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwogICAgICAgICB9CkBAIC0xMDMsNyArMTAzLDcgQEAKIAogICAgICAgICAgICAgb3Byb3QuV3JpdGVTdHJ1Y3RCZWdpbihzdHJ1Yyk7CiAKLSAgICAgICAgICAgIGlmICghU3RyaW5nLklzTnVsbE9yRW1wdHkoTWVzc2FnZSkpCisgICAgICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KE1lc3NhZ2UpKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGZpZWxkLk5hbWUgPSAibWVzc2FnZSI7CiAgICAgICAgICAgICAgICAgZmllbGQuVHlwZSA9IFRUeXBlLlN0cmluZzsKQEAgLTEzNyw1ICsxMzcsMTAgQEAKICAgICAgICAgICAgIEludmFsaWRQcm90b2NvbCwKICAgICAgICAgICAgIFVuc3VwcG9ydGVkQ2xpZW50VHlwZQogICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEV4Y2VwdGlvblR5cGUgVHlwZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gdHlwZTsgfQorICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVEFzeW5jUHJvY2Vzc29yLmNzIGIvbGliL2NzaGFycC9zcmMvVEFzeW5jUHJvY2Vzc29yLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNDMyMjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3NyYy9UQXN5bmNQcm9jZXNzb3IuY3MKQEAgLTAsMCArMSwzOCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbDsKKworbmFtZXNwYWNlIFRocmlmdAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gUHJvY2Vzc2VzIGEgbWVzc2FnZSBhc3luY2hyb25vdXNseS4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBpbnRlcmZhY2UgVEFzeW5jUHJvY2Vzc29yCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBQcm9jZXNzZXMgdGhlIG5leHQgcGFydCBvZiB0aGUgbWVzc2FnZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpcHJvdCI+VGhlIGlucHV0IHByb3RvY29sLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib3Byb3QiPlRoZSBvdXRwdXQgcHJvdG9jb2wuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxyZXR1cm5zPnRydWUgaWYgdGhlcmUncyBtb3JlIHRvIHByb2Nlc3MsIGZhbHNlIG90aGVyd2lzZS48L3JldHVybnM+CisgICAgICAgIFRhc2s8Ym9vbD4gUHJvY2Vzc0FzeW5jKFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UQ29udHJvbGxpbmdIYW5kbGVyLmNzIGIvbGliL2NzaGFycC9zcmMvVENvbnRyb2xsaW5nSGFuZGxlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjUyMDNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC9zcmMvVENvbnRyb2xsaW5nSGFuZGxlci5jcwpAQCAtMCwwICsxLDI5IEBACivvu78vKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFRocmlmdC5TZXJ2ZXI7CisKK25hbWVzcGFjZSBUaHJpZnQKK3sKKyAgICBwdWJsaWMgaW50ZXJmYWNlIFRDb250cm9sbGluZ0hhbmRsZXIKKyAgICB7CisgICAgICAgIFRTZXJ2ZXIgc2VydmVyIHsgZ2V0OyBzZXQ7IH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9URXhjZXB0aW9uLmNzIGIvbGliL2NzaGFycC9zcmMvVEV4Y2VwdGlvbi5jcwppbmRleCA2NTUwOWVjLi5hYTlhMjEwIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9URXhjZXB0aW9uLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RFeGNlcHRpb24uY3MKQEAgLTMxLDggKzMxLDggQEAKICAgICAgICAgewogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIFRFeGNlcHRpb24oIHN0cmluZyBtZXNzYWdlKQotICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UpCisgICAgICAgIHB1YmxpYyBURXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlLCBFeGNlcHRpb24gaW5uZXIpCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSwgaW5uZXIpCiAgICAgICAgIHsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UUHJvY2Vzc29yRmFjdG9yeS5jcyBiL2xpYi9jc2hhcnAvc3JjL1RQcm9jZXNzb3JGYWN0b3J5LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZjYzMWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3NyYy9UUHJvY2Vzc29yRmFjdG9yeS5jcwpAQCAtMCwwICsxLDMwIEBACivvu78vKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFRocmlmdC5TZXJ2ZXI7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0OworCituYW1lc3BhY2UgVGhyaWZ0Cit7CisgICAgcHVibGljIGludGVyZmFjZSBUUHJvY2Vzc29yRmFjdG9yeQorICAgIHsKKyAgICAgICAgVFByb2Nlc3NvciBHZXRQcm9jZXNzb3IoVFRyYW5zcG9ydCB0cmFucywgVFNlcnZlciBzZXJ2ZXIgPSBudWxsKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UUHJvdG90eXBlUHJvY2Vzc29yRmFjdG9yeS5jcyBiL2xpYi9jc2hhcnAvc3JjL1RQcm90b3R5cGVQcm9jZXNzb3JGYWN0b3J5LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNDcyNjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3NyYy9UUHJvdG90eXBlUHJvY2Vzc29yRmFjdG9yeS5jcwpAQCAtMCwwICsxLDU1IEBACivvu78vKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFRocmlmdC5TZXJ2ZXI7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0OworCituYW1lc3BhY2UgVGhyaWZ0Cit7CisgICAgcHVibGljIGNsYXNzIFRQcm90b3R5cGVQcm9jZXNzb3JGYWN0b3J5PFAsIEg+IDogVFByb2Nlc3NvckZhY3Rvcnkgd2hlcmUgUCA6IFRQcm9jZXNzb3IKKyAgICB7CisgICAgICAgIG9iamVjdFtdIGhhbmRsZXJBcmdzID0gbnVsbDsKKworICAgICAgICBwdWJsaWMgVFByb3RvdHlwZVByb2Nlc3NvckZhY3RvcnkoKQorICAgICAgICB7CisgICAgICAgICAgICBoYW5kbGVyQXJncyA9IG5ldyBvYmplY3RbMF07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFByb3RvdHlwZVByb2Nlc3NvckZhY3RvcnkocGFyYW1zIG9iamVjdFtdIGhhbmRsZXJBcmdzKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmhhbmRsZXJBcmdzID0gaGFuZGxlckFyZ3M7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFByb2Nlc3NvciBHZXRQcm9jZXNzb3IoVFRyYW5zcG9ydCB0cmFucywgVFNlcnZlciBzZXJ2ZXIgPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBIIGhhbmRsZXIgPSAoSClBY3RpdmF0b3IuQ3JlYXRlSW5zdGFuY2UodHlwZW9mKEgpLCBoYW5kbGVyQXJncyk7CisKKyAgICAgICAgICAgIFRDb250cm9sbGluZ0hhbmRsZXIgaGFuZGxlclNlcnZlclJlZiA9IGhhbmRsZXIgYXMgVENvbnRyb2xsaW5nSGFuZGxlcjsKKyAgICAgICAgICAgIGlmIChoYW5kbGVyU2VydmVyUmVmICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGFuZGxlclNlcnZlclJlZi5zZXJ2ZXIgPSBzZXJ2ZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQWN0aXZhdG9yLkNyZWF0ZUluc3RhbmNlKHR5cGVvZihQKSwgbmV3IG9iamVjdFtdIHsgaGFuZGxlciB9KSBhcyBUUHJvY2Vzc29yOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkuY3MgYi9saWIvY3NoYXJwL3NyYy9UU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDI4OTdiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC9zcmMvVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkuY3MKQEAgLTAsMCArMSw0MyBAQAor77u/LyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBUaHJpZnQuU2VydmVyOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKKworbmFtZXNwYWNlIFRocmlmdAoreworICAgIHB1YmxpYyBjbGFzcyBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeSA6IFRQcm9jZXNzb3JGYWN0b3J5CisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFRQcm9jZXNzb3IgcHJvY2Vzc29yXzsKKworICAgICAgICBwdWJsaWMgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkoVFByb2Nlc3NvciBwcm9jZXNzb3IpCisgICAgICAgIHsKKyAgICAgICAgICAgIHByb2Nlc3Nvcl8gPSBwcm9jZXNzb3I7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFByb2Nlc3NvciBHZXRQcm9jZXNzb3IoVFRyYW5zcG9ydCB0cmFucywgVFNlcnZlciBzZXJ2ZXIgPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcHJvY2Vzc29yXzsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RocmlmdC40NS5jc3Byb2ogYi9saWIvY3NoYXJwL3NyYy9UaHJpZnQuNDUuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMjhiMjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3NyYy9UaHJpZnQuNDUuY3Nwcm9qCkBAIC0wLDAgKzEsMTI5IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPgorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4KKyAgICA8UHJvamVjdEd1aWQ+e0VCQ0UzNURBLUNGNkEtNDJCQy1BMzU3LUE5QzA5QjUzNDI5OX08L1Byb2plY3RHdWlkPgorICAgIDxPdXRwdXRUeXBlPkxpYnJhcnk8L091dHB1dFR5cGU+CisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPgorICAgIDxSb290TmFtZXNwYWNlPlRocmlmdDwvUm9vdE5hbWVzcGFjZT4KKyAgICA8QXNzZW1ibHlOYW1lPlRocmlmdDQ1PC9Bc3NlbWJseU5hbWU+CisgICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djQuNTwvVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj4KKyAgICA8RmlsZUFsaWdubWVudD41MTI8L0ZpbGVBbGlnbm1lbnQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+CisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+CisgICAgPERlYnVnVHlwZT5wb3J0YWJsZTwvRGVidWdUeXBlPgorICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+CisgICAgPE91dHB1dFBhdGg+YmluXERlYnVnXDwvT3V0cHV0UGF0aD4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFO0RFQlVHO05FVDQ1PC9EZWZpbmVDb25zdGFudHM+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4KKyAgICA8RGVidWdUeXBlPnBvcnRhYmxlPC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxSZWxlYXNlXDwvT3V0cHV0UGF0aD4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFO05FVDQ1PC9EZWZpbmVDb25zdGFudHM+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5Db3JlIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldlYiIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwuTGlucSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5EYXRhLkRhdGFTZXRFeHRlbnNpb25zIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LkNTaGFycCIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5EYXRhIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbCIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29sbGVjdGlvbnNcVENvbGxlY3Rpb25zLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXFRIYXNoU2V0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRBYnN0cmFjdEJhc2UuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVEJhc2UuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVEJhc2U2NFV0aWxzLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRCaW5hcnlQcm90b2NvbC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUQ29tcGFjdFByb3RvY29sLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRGaWVsZC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUSlNPTlByb3RvY29sLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRMaXN0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRNYXAuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVE1lc3NhZ2UuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVE1lc3NhZ2VUeXBlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRNdWx0aXBsZXhlZFByb2Nlc3Nvci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUTXVsdGlwbGV4ZWRQcm90b2NvbC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUUHJvdG9jb2wuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVFByb3RvY29sRGVjb3JhdG9yLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRQcm90b2NvbEV4Y2VwdGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUUHJvdG9jb2xGYWN0b3J5LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRQcm90b2NvbFV0aWwuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVFNldC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUU3RydWN0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRUeXBlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcnZlclxUU2VydmVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcnZlclxUU2VydmVyRXZlbnRIYW5kbGVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcnZlclxUU2ltcGxlU2VydmVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcnZlclxUVGhyZWFkZWRTZXJ2ZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU2VydmVyXFRUaHJlYWRQb29sU2VydmVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUQXN5bmNQcm9jZXNzb3IuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVENvbnRyb2xsaW5nSGFuZGxlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJURXhjZXB0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRQcm9jZXNzb3IuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVFByb2Nlc3NvckZhY3RvcnkuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVFByb3RvdHlwZVByb2Nlc3NvckZhY3RvcnkuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRCdWZmZXJlZFRyYW5zcG9ydC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVEZyYW1lZFRyYW5zcG9ydC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVEh0dHBDbGllbnQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRIdHRwSGFuZGxlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVEh0dHBUYXNrQXN5bmNIYW5kbGVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUTWVtb3J5QnVmZmVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUTmFtZWRQaXBlQ2xpZW50VHJhbnNwb3J0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUU2VydmVyU29ja2V0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUU2VydmVyVHJhbnNwb3J0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUU2lsdmVybGlnaHRTb2NrZXQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRTb2NrZXQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRTb2NrZXRWZXJzaW9uaXplci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFN0cmVhbVRyYW5zcG9ydC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFRMU1NlcnZlclNvY2tldC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFRMU1NvY2tldC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFRyYW5zcG9ydC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFRyYW5zcG9ydEV4Y2VwdGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFRyYW5zcG9ydEZhY3RvcnkuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkuY3MiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxGb2xkZXIgSW5jbHVkZT0iU2VydmVyXENvbGxlY3Rpb25zXCIgLz4KKyAgICA8Rm9sZGVyIEluY2x1ZGU9IlNlcnZlclxQcm90b2NvbFwiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZFRvb2xzUGF0aClcTWljcm9zb2Z0LkNTaGFycC50YXJnZXRzIiAvPgorICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LiAKKyAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPgorICA8L1RhcmdldD4KKyAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4KKyAgPC9UYXJnZXQ+CisgIC0tPgorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RocmlmdC5XUDcuY3Nwcm9qIGIvbGliL2NzaGFycC9zcmMvVGhyaWZ0LldQNy5jc3Byb2oKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlNDk0MmYuLjAwMDAwMDAKLS0tIGEvbGliL2NzaGFycC9zcmMvVGhyaWZ0LldQNy5jc3Byb2oKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAot77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+Ci0gIDxQcm9wZXJ0eUdyb3VwPgotICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPgotICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4KLSAgICA8UHJvZHVjdFZlcnNpb24+MTAuMC4yMDUwNjwvUHJvZHVjdFZlcnNpb24+Ci0gICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPgotICAgIDxQcm9qZWN0R3VpZD57REY1OEJEQjAtMjQ1Ny00QTUyLTk5ODEtNjVBMEU4QjUwODMzfTwvUHJvamVjdEd1aWQ+Ci0gICAgPFByb2plY3RUeXBlR3VpZHM+e0MwODlDOEMwLTMwRTAtNEUyMi04MEMwLUNFMDkzRjExMUE0M307e2ZhZTA0ZWMwLTMwMWYtMTFkMy1iZjRiLTAwYzA0Zjc5ZWZiY308L1Byb2plY3RUeXBlR3VpZHM+Ci0gICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4KLSAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+Ci0gICAgPFJvb3ROYW1lc3BhY2U+VGhyaWZ0LldQNzwvUm9vdE5hbWVzcGFjZT4KLSAgICA8QXNzZW1ibHlOYW1lPlRocmlmdC5XUDc8L0Fzc2VtYmx5TmFtZT4KLSAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52NC4wPC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPgotICAgIDxTaWx2ZXJsaWdodFZlcnNpb24+JChUYXJnZXRGcmFtZXdvcmtWZXJzaW9uKTwvU2lsdmVybGlnaHRWZXJzaW9uPgotICAgIDxUYXJnZXRGcmFtZXdvcmtQcm9maWxlPldpbmRvd3NQaG9uZTcxPC9UYXJnZXRGcmFtZXdvcmtQcm9maWxlPgotICAgIDxUYXJnZXRGcmFtZXdvcmtJZGVudGlmaWVyPlNpbHZlcmxpZ2h0PC9UYXJnZXRGcmFtZXdvcmtJZGVudGlmaWVyPgotICAgIDxTaWx2ZXJsaWdodEFwcGxpY2F0aW9uPmZhbHNlPC9TaWx2ZXJsaWdodEFwcGxpY2F0aW9uPgotICAgIDxWYWxpZGF0ZVhhbWw+dHJ1ZTwvVmFsaWRhdGVYYW1sPgotICAgIDxUaHJvd0Vycm9yc0luVmFsaWRhdGlvbj50cnVlPC9UaHJvd0Vycm9yc0luVmFsaWRhdGlvbj4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4KLSAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4KLSAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4KLSAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPgotICAgIDxPdXRwdXRQYXRoPkJpblxEZWJ1ZzwvT3V0cHV0UGF0aD4KLSAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFO1NJTFZFUkxJR0hUO1dJTkRPV1NfUEhPTkU8L0RlZmluZUNvbnN0YW50cz4KLSAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+Ci0gICAgPE5vQ29uZmlnPnRydWU8L05vQ29uZmlnPgotICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgotICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+Ci0gICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+Ci0gICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPgotICAgIDxPdXRwdXRQYXRoPkJpblxSZWxlYXNlPC9PdXRwdXRQYXRoPgotICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U7U0lMVkVSTElHSFQ7V0lORE9XU19QSE9ORTwvRGVmaW5lQ29uc3RhbnRzPgotICAgIDxOb1N0ZExpYj50cnVlPC9Ob1N0ZExpYj4KLSAgICA8Tm9Db25maWc+dHJ1ZTwvTm9Db25maWc+Ci0gICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+Ci0gICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+Ci0gIDwvUHJvcGVydHlHcm91cD4KLSAgPEl0ZW1Hcm91cD4KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5QaG9uZSIgLz4KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5QaG9uZS5JbnRlcm9wIiAvPgotICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbiIgLz4KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5TZXJ2aWNlbW9kZWwuV2ViIiAvPgotICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldpbmRvd3MiIC8+Ci0gICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJzeXN0ZW0iIC8+Ci0gICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uQ29yZSIgLz4KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+Ci0gICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uTmV0IiAvPgotICA8L0l0ZW1Hcm91cD4KLSAgPEl0ZW1Hcm91cD4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xUQ29sbGVjdGlvbnMuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iQ29sbGVjdGlvbnNcVEhhc2hTZXQuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uV1A3LmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRBYnN0cmFjdEJhc2UuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVEJhc2UuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVEJhc2U2NFV0aWxzLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRCaW5hcnlQcm90b2NvbC5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxURmllbGQuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVEpTT05Qcm90b2NvbC5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUTGlzdC5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUTWFwLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRNZXNzYWdlLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRNZXNzYWdlVHlwZS5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUTXVsdGlwbGV4ZWRQcm9jZXNzb3IuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVE11bHRpcGxleGVkUHJvdG9jb2wuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVFByb3RvY29sLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRQcm90b2NvbERlY29yYXRvci5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUUHJvdG9jb2xFeGNlcHRpb24uY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVFByb3RvY29sRmFjdG9yeS5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUUHJvdG9jb2xVdGlsLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRTZXQuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVFN0cnVjdC5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUVHlwZS5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJURXhjZXB0aW9uLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJUUHJvY2Vzc29yLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxURnJhbWVkVHJhbnNwb3J0LmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUSHR0cENsaWVudC5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFNpbHZlcmxpZ2h0U29ja2V0LmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUU3RyZWFtVHJhbnNwb3J0LmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUVHJhbnNwb3J0LmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUVHJhbnNwb3J0RXhjZXB0aW9uLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUVHJhbnNwb3J0RmFjdG9yeS5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVE1lbW9yeUJ1ZmZlci5jcyIgLz4KLSAgPC9JdGVtR3JvdXA+Ci0gIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkRXh0ZW5zaW9uc1BhdGgpXE1pY3Jvc29mdFxTaWx2ZXJsaWdodCBmb3IgUGhvbmVcJChUYXJnZXRGcmFtZXdvcmtWZXJzaW9uKVxNaWNyb3NvZnQuU2lsdmVybGlnaHQuJChUYXJnZXRGcmFtZXdvcmtQcm9maWxlKS5PdmVycmlkZXMudGFyZ2V0cyIgLz4KLSAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRFeHRlbnNpb25zUGF0aClcTWljcm9zb2Z0XFNpbHZlcmxpZ2h0IGZvciBQaG9uZVwkKFRhcmdldEZyYW1ld29ya1ZlcnNpb24pXE1pY3Jvc29mdC5TaWx2ZXJsaWdodC5DU2hhcnAudGFyZ2V0cyIgLz4KLSAgPFByb2plY3RFeHRlbnNpb25zIC8+Ci0gIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuCi0gICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLgotICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4KLSAgPC9UYXJnZXQ+Ci0gIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+Ci0gIDwvVGFyZ2V0PgotICAtLT4KLTwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UaHJpZnQuY3Nwcm9qIGIvbGliL2NzaGFycC9zcmMvVGhyaWZ0LmNzcHJvagppbmRleCAxOTUwMDVhLi5iZjY1NTY5IDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9UaHJpZnQuY3Nwcm9qCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RocmlmdC5jc3Byb2oKQEAgLTQ1LDI2ICs0NSwyNyBAQAogICAgIDxVcGRhdGVSZXF1aXJlZD5mYWxzZTwvVXBkYXRlUmVxdWlyZWQ+CiAgICAgPE1hcEZpbGVFeHRlbnNpb25zPnRydWU8L01hcEZpbGVFeHRlbnNpb25zPgogICAgIDxBcHBsaWNhdGlvblJldmlzaW9uPjA8L0FwcGxpY2F0aW9uUmV2aXNpb24+Ci0gICAgPEFwcGxpY2F0aW9uVmVyc2lvbj4xLjAuMC4lMmE8L0FwcGxpY2F0aW9uVmVyc2lvbj4KKyAgICA8QXBwbGljYXRpb25WZXJzaW9uPjEuMC4wLjA8L0FwcGxpY2F0aW9uVmVyc2lvbj4KICAgICA8SXNXZWJCb290c3RyYXBwZXI+ZmFsc2U8L0lzV2ViQm9vdHN0cmFwcGVyPgogICAgIDxVc2VBcHBsaWNhdGlvblRydXN0PmZhbHNlPC9Vc2VBcHBsaWNhdGlvblRydXN0PgogICAgIDxCb290c3RyYXBwZXJFbmFibGVkPnRydWU8L0Jvb3RzdHJhcHBlckVuYWJsZWQ+CiAgIDwvUHJvcGVydHlHcm91cD4KICAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+CiAgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+Ci0gICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+CisgICAgPERlYnVnVHlwZT5wb3J0YWJsZTwvRGVidWdUeXBlPgogICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+CiAgICAgPE91dHB1dFBhdGg+YmluXERlYnVnXDwvT3V0cHV0UGF0aD4KLSAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFPC9EZWZpbmVDb25zdGFudHM+CisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTtERUJVRzwvRGVmaW5lQ29uc3RhbnRzPgogICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgogICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgogICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0PkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+CiAgIDwvUHJvcGVydHlHcm91cD4KICAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4KLSAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4KKyAgICA8RGVidWdUeXBlPnBvcnRhYmxlPC9EZWJ1Z1R5cGU+CiAgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPgogICAgIDxPdXRwdXRQYXRoPmJpblxSZWxlYXNlXDwvT3V0cHV0UGF0aD4KLSAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFPC9EZWZpbmVDb25zdGFudHM+CisgICAgPERlZmluZUNvbnN0YW50cz4KKyAgICA8L0RlZmluZUNvbnN0YW50cz4KICAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KICAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KICAgICA8Q29kZUFuYWx5c2lzUnVsZVNldD5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0PgpAQCAtNzksNiArODAsNyBAQAogICA8SXRlbUdyb3VwPgogICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXFRDb2xsZWN0aW9ucy5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xUSGFzaFNldC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJOZXQzNVxFeHRlbnNpb25zTmV0MzUuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVEFic3RyYWN0QmFzZS5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUQmFzZS5jcyIgLz4KQEAgLTEwMSwzMCArMTAzLDM1IEBACiAgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVFNldC5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUU3RydWN0LmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRUeXBlLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcnZlclxUVGhyZWFkZWRTZXJ2ZXIuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iU2VydmVyXFRTZXJ2ZXIuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iU2VydmVyXFRTZXJ2ZXJFdmVudEhhbmRsZXIuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iU2VydmVyXFRTaW1wbGVTZXJ2ZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU2VydmVyXFRUaHJlYWRlZFNlcnZlci5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJTZXJ2ZXJcVFRocmVhZFBvb2xTZXJ2ZXIuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iVEV4Y2VwdGlvbi5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJUQXBwbGljYXRpb25FeGNlcHRpb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVENvbnRyb2xsaW5nSGFuZGxlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJURXhjZXB0aW9uLmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlRQcm9jZXNzb3IuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVFByb2Nlc3NvckZhY3RvcnkuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVFByb3RvdHlwZVByb2Nlc3NvckZhY3RvcnkuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRCdWZmZXJlZFRyYW5zcG9ydC5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVEZyYW1lZFRyYW5zcG9ydC5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVEh0dHBDbGllbnQuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRIdHRwSGFuZGxlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVE1lbW9yeUJ1ZmZlci5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVE5hbWVkUGlwZUNsaWVudFRyYW5zcG9ydC5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydC5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFNlcnZlclNvY2tldC5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFNlcnZlclRyYW5zcG9ydC5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFNvY2tldC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFNvY2tldFZlcnNpb25pemVyLmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUU3RyZWFtVHJhbnNwb3J0LmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUVExTU2VydmVyU29ja2V0LmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUVExTU29ja2V0LmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUVHJhbnNwb3J0LmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUVHJhbnNwb3J0RXhjZXB0aW9uLmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUVHJhbnNwb3J0RmFjdG9yeS5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVE1lbW9yeUJ1ZmZlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeS5jcyIgLz4KICAgPC9JdGVtR3JvdXA+CiAgIDxJdGVtR3JvdXA+CiAgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5DbGllbnQuMy41Ij4KQEAgLTE0Nyw0ICsxNTQsNCBAQAogICA8UHJvamVjdEV4dGVuc2lvbnM+CiAgICAgPFZpc3VhbFN0dWRpbyBBbGxvd0V4aXN0aW5nRm9sZGVyPSJ0cnVlIiAvPgogICA8L1Byb2plY3RFeHRlbnNpb25zPgotPC9Qcm9qZWN0PgorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RocmlmdC5zbG4gYi9saWIvY3NoYXJwL3NyYy9UaHJpZnQuc2xuCmluZGV4IGRkODQzN2QuLmEyOWU0NjggMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1RocmlmdC5zbG4KKysrIGIvbGliL2NzaGFycC9zcmMvVGhyaWZ0LnNsbgpAQCAtNCwzNSArNCw0NCBAQAogUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJUaHJpZnQiLCAiVGhyaWZ0LmNzcHJvaiIsICJ7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfSIKIEVuZFByb2plY3QKIFByb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiVGhyaWZ0VGVzdCIsICIuLlx0ZXN0XFRocmlmdFRlc3RcVGhyaWZ0VGVzdC5jc3Byb2oiLCAiezQ4REQ3NTdGLUNBOTUtNERENy1CREE0LTU4REI2RjEwOEMyQ30iCi0gICAgUHJvamVjdFNlY3Rpb24oUHJvamVjdERlcGVuZGVuY2llcykgPSBwb3N0UHJvamVjdAotICAgICAgICB7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfSA9IHs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9Ci0gICAgRW5kUHJvamVjdFNlY3Rpb24KIEVuZFByb2plY3QKIFByb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiVGhyaWZ0TVNCdWlsZFRhc2siLCAiLi5cVGhyaWZ0TVNCdWlsZFRhc2tcVGhyaWZ0TVNCdWlsZFRhc2suY3Nwcm9qIiwgIntFQzBBMDIzMS02NkVBLTQ1OTMtQTc5Mi1DNkNBM0JCODY2OEV9IgogRW5kUHJvamVjdAorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJUaHJpZnQuNDUiLCAiVGhyaWZ0LjQ1LmNzcHJvaiIsICJ7RUJDRTM1REEtQ0Y2QS00MkJDLUEzNTctQTlDMDlCNTM0Mjk5fSIKK0VuZFByb2plY3QKK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiVGhyaWZ0TVZDVGVzdCIsICIuLlx0ZXN0XFRocmlmdE1WQ1Rlc3RcVGhyaWZ0TVZDVGVzdC5jc3Byb2oiLCAiezg5MUI0NDg3LUM3QkEtNDI3RS1CQkM4LTRDNTk2QzIyOUExMH0iCitFbmRQcm9qZWN0CiBHbG9iYWwKLSAgICBHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwcmVTb2x1dGlvbgotICAgICAgICBEZWJ1Z3xBbnkgQ1BVID0gRGVidWd8QW55IENQVQotICAgICAgICBSZWxlYXNlfEFueSBDUFUgPSBSZWxlYXNlfEFueSBDUFUKLSAgICBFbmRHbG9iYWxTZWN0aW9uCi0gICAgR2xvYmFsU2VjdGlvbihQcm9qZWN0Q29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwb3N0U29sdXRpb24KLSAgICAgICAgezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCi0gICAgICAgIHs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKLSAgICAgICAgezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQotICAgICAgICB7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQotICAgICAgICB7NDhERDc1N0YtQ0E5NS00REQ3LUJEQTQtNThEQjZGMTA4QzJDfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKLSAgICAgICAgezQ4REQ3NTdGLUNBOTUtNERENy1CREE0LTU4REI2RjEwOEMyQ30uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQotICAgICAgICB7NDhERDc1N0YtQ0E5NS00REQ3LUJEQTQtNThEQjZGMTA4QzJDfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCi0gICAgICAgIHs0OERENzU3Ri1DQTk1LTRERDctQkRBNC01OERCNkYxMDhDMkN9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCi0gICAgICAgIHtFQzBBMDIzMS02NkVBLTQ1OTMtQTc5Mi1DNkNBM0JCODY2OEV9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQotICAgICAgICB7RUMwQTAyMzEtNjZFQS00NTkzLUE3OTItQzZDQTNCQjg2NjhFfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCi0gICAgICAgIHtFQzBBMDIzMS02NkVBLTQ1OTMtQTc5Mi1DNkNBM0JCODY2OEV9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKLSAgICAgICAge0VDMEEwMjMxLTY2RUEtNDU5My1BNzkyLUM2Q0EzQkI4NjY4RX0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKLSAgICBFbmRHbG9iYWxTZWN0aW9uCi0gICAgR2xvYmFsU2VjdGlvbihNb25vRGV2ZWxvcFByb3BlcnRpZXMpID0gcHJlU29sdXRpb24KLSAgICAgICAgU3RhcnR1cEl0ZW0gPSBUaHJpZnQuY3Nwcm9qCi0gICAgRW5kR2xvYmFsU2VjdGlvbgotICAgIEdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uCi0gICAgICAgIEhpZGVTb2x1dGlvbk5vZGUgPSBGQUxTRQotICAgIEVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwcmVTb2x1dGlvbgorCQlEZWJ1Z3xBbnkgQ1BVID0gRGVidWd8QW55IENQVQorCQlSZWxlYXNlfEFueSBDUFUgPSBSZWxlYXNlfEFueSBDUFUKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihQcm9qZWN0Q29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwb3N0U29sdXRpb24KKwkJezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7NDhERDc1N0YtQ0E5NS00REQ3LUJEQTQtNThEQjZGMTA4QzJDfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezQ4REQ3NTdGLUNBOTUtNERENy1CREE0LTU4REI2RjEwOEMyQ30uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7NDhERDc1N0YtQ0E5NS00REQ3LUJEQTQtNThEQjZGMTA4QzJDfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs0OERENzU3Ri1DQTk1LTRERDctQkRBNC01OERCNkYxMDhDMkN9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtFQzBBMDIzMS02NkVBLTQ1OTMtQTc5Mi1DNkNBM0JCODY2OEV9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7RUMwQTAyMzEtNjZFQS00NTkzLUE3OTItQzZDQTNCQjg2NjhFfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtFQzBBMDIzMS02NkVBLTQ1OTMtQTc5Mi1DNkNBM0JCODY2OEV9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0VDMEEwMjMxLTY2RUEtNDU5My1BNzkyLUM2Q0EzQkI4NjY4RX0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0VCQ0UzNURBLUNGNkEtNDJCQy1BMzU3LUE5QzA5QjUzNDI5OX0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtFQkNFMzVEQS1DRjZBLTQyQkMtQTM1Ny1BOUMwOUI1MzQyOTl9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0VCQ0UzNURBLUNGNkEtNDJCQy1BMzU3LUE5QzA5QjUzNDI5OX0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7RUJDRTM1REEtQ0Y2QS00MkJDLUEzNTctQTlDMDlCNTM0Mjk5fS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7ODkxQjQ0ODctQzdCQS00MjdFLUJCQzgtNEM1OTZDMjI5QTEwfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezg5MUI0NDg3LUM3QkEtNDI3RS1CQkM4LTRDNTk2QzIyOUExMH0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7ODkxQjQ0ODctQzdCQS00MjdFLUJCQzgtNEM1OTZDMjI5QTEwfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs4OTFCNDQ4Ny1DN0JBLTQyN0UtQkJDOC00QzU5NkMyMjlBMTB9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uCisJCUhpZGVTb2x1dGlvbk5vZGUgPSBGQUxTRQorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKE1vbm9EZXZlbG9wUHJvcGVydGllcykgPSBwcmVTb2x1dGlvbgorCQkgICAgICAgIFN0YXJ0dXBJdGVtID0gVGhyaWZ0LmNzcHJvagorCUVuZEdsb2JhbFNlY3Rpb24KIEVuZEdsb2JhbApkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RCdWZmZXJlZFRyYW5zcG9ydC5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UQnVmZmVyZWRUcmFuc3BvcnQuY3MKaW5kZXggODliOWNhNy4uODg3MDk4OCAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RCdWZmZXJlZFRyYW5zcG9ydC5jcworKysgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVEJ1ZmZlcmVkVHJhbnNwb3J0LmNzCkBAIC0yMiwxMDUgKzIyLDE3MyBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydAogewotICBwdWJsaWMgY2xhc3MgVEJ1ZmZlcmVkVHJhbnNwb3J0IDogVFRyYW5zcG9ydCwgSURpc3Bvc2FibGUKKyAgICBwdWJsaWMgY2xhc3MgVEJ1ZmZlcmVkVHJhbnNwb3J0IDogVFRyYW5zcG9ydCwgSURpc3Bvc2FibGUKICAgICB7Ci0gICAgICAgIHByaXZhdGUgQnVmZmVyZWRTdHJlYW0gaW5wdXRCdWZmZXI7Ci0gICAgICAgIHByaXZhdGUgQnVmZmVyZWRTdHJlYW0gb3V0cHV0QnVmZmVyOwotICAgICAgICBwcml2YXRlIGludCBidWZTaXplOwotICAgICAgICBwcml2YXRlIFRTdHJlYW1UcmFuc3BvcnQgdHJhbnNwb3J0OworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGludCBidWZTaXplOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IE1lbW9yeVN0cmVhbSBpbnB1dEJ1ZmZlciA9IG5ldyBNZW1vcnlTdHJlYW0oMCk7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgTWVtb3J5U3RyZWFtIG91dHB1dEJ1ZmZlciA9IG5ldyBNZW1vcnlTdHJlYW0oMCk7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVFRyYW5zcG9ydCB0cmFuc3BvcnQ7CiAKLSAgICAgICAgcHVibGljIFRCdWZmZXJlZFRyYW5zcG9ydChUU3RyZWFtVHJhbnNwb3J0IHRyYW5zcG9ydCkKLSAgICAgICAgICAgIDp0aGlzKHRyYW5zcG9ydCwgMTAyNCkKKyAgICAgICAgcHVibGljIFRCdWZmZXJlZFRyYW5zcG9ydChUVHJhbnNwb3J0IHRyYW5zcG9ydCwgaW50IGJ1ZlNpemUgPSAxMDI0KQogICAgICAgICB7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBUQnVmZmVyZWRUcmFuc3BvcnQoVFN0cmVhbVRyYW5zcG9ydCB0cmFuc3BvcnQsIGludCBidWZTaXplKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmJ1ZlNpemUgPSBidWZTaXplOworICAgICAgICAgICAgaWYgKHRyYW5zcG9ydCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oInRyYW5zcG9ydCIpOworICAgICAgICAgICAgaWYgKGJ1ZlNpemUgPD0gMCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oImJ1ZlNpemUiLCAiQnVmZmVyIHNpemUgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlci4iKTsKICAgICAgICAgICAgIHRoaXMudHJhbnNwb3J0ID0gdHJhbnNwb3J0OwotICAgICAgICAgICAgSW5pdEJ1ZmZlcnMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBJbml0QnVmZmVycygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh0cmFuc3BvcnQuSW5wdXRTdHJlYW0gIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlciA9IG5ldyBCdWZmZXJlZFN0cmVhbSh0cmFuc3BvcnQuSW5wdXRTdHJlYW0sIGJ1ZlNpemUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHRyYW5zcG9ydC5PdXRwdXRTdHJlYW0gIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXIgPSBuZXcgQnVmZmVyZWRTdHJlYW0odHJhbnNwb3J0Lk91dHB1dFN0cmVhbSwgYnVmU2l6ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgQ2xvc2VCdWZmZXJzKCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGlucHV0QnVmZmVyICE9IG51bGwgJiYgaW5wdXRCdWZmZXIuQ2FuUmVhZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlci5DbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG91dHB1dEJ1ZmZlciAhPSBudWxsICYmIG91dHB1dEJ1ZmZlci5DYW5Xcml0ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXIuQ2xvc2UoKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRoaXMuYnVmU2l6ZSA9IGJ1ZlNpemU7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgVFRyYW5zcG9ydCBVbmRlcmx5aW5nVHJhbnNwb3J0CiAgICAgICAgIHsKLSAgICAgICAgICAgIGdldCB7IHJldHVybiB0cmFuc3BvcnQ7IH0KKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNwb3J0OworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNPcGVuCiAgICAgICAgIHsKLSAgICAgICAgICAgIGdldCB7IHJldHVybiB0cmFuc3BvcnQuSXNPcGVuOyB9CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBXZSBjYW4gbGVnaXRpbWF0ZWx5IHRocm93IGhlcmUgYnV0IGJlIG5pY2UgYSBiaXQuCisgICAgICAgICAgICAgICAgLy8gQ2hlY2tOb3REaXNwb3NlZCgpOworICAgICAgICAgICAgICAgIHJldHVybiAhX0lzRGlzcG9zZWQgJiYgdHJhbnNwb3J0LklzT3BlbjsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIE9wZW4oKQogICAgICAgICB7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CiAgICAgICAgICAgICB0cmFuc3BvcnQuT3BlbigpOwotICAgICAgICAgICAgSW5pdEJ1ZmZlcnMoKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKICAgICAgICAgewotICAgICAgICAgICAgQ2xvc2VCdWZmZXJzKCk7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CiAgICAgICAgICAgICB0cmFuc3BvcnQuQ2xvc2UoKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgUmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gaW5wdXRCdWZmZXIuUmVhZChidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKKyAgICAgICAgICAgIFZhbGlkYXRlQnVmZmVyQXJncyhidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgICAgIGlmICghSXNPcGVuKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuKTsKKworICAgICAgICAgICAgaWYgKGlucHV0QnVmZmVyLkNhcGFjaXR5IDwgYnVmU2l6ZSkKKyAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlci5DYXBhY2l0eSA9IGJ1ZlNpemU7CisKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBnb3QgPSBpbnB1dEJ1ZmZlci5SZWFkKGJ1Ziwgb2ZmLCBsZW4pOworICAgICAgICAgICAgICAgIGlmIChnb3QgPiAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ290OworCisgICAgICAgICAgICAgICAgaW5wdXRCdWZmZXIuU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsKKyAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlci5TZXRMZW5ndGgoaW5wdXRCdWZmZXIuQ2FwYWNpdHkpOworICAgICAgICAgICAgICAgIGludCBmaWxsZWQgPSB0cmFuc3BvcnQuUmVhZChpbnB1dEJ1ZmZlci5HZXRCdWZmZXIoKSwgMCwgKGludClpbnB1dEJ1ZmZlci5MZW5ndGgpOworICAgICAgICAgICAgICAgIGlucHV0QnVmZmVyLlNldExlbmd0aChmaWxsZWQpOworICAgICAgICAgICAgICAgIGlmIChmaWxsZWQgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZShieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQogICAgICAgICB7Ci0gICAgICAgICAgICBvdXRwdXRCdWZmZXIuV3JpdGUoYnVmLCBvZmYsIGxlbik7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisgICAgICAgICAgICBWYWxpZGF0ZUJ1ZmZlckFyZ3MoYnVmLCBvZmYsIGxlbik7CisgICAgICAgICAgICBpZiAoIUlzT3BlbikKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CisgICAgICAgICAgICAvLyBSZWxhdGl2ZSBvZmZzZXQgZnJvbSAib2ZmIiBhcmd1bWVudAorICAgICAgICAgICAgaW50IG9mZnNldCA9IDA7CisgICAgICAgICAgICBpZiAob3V0cHV0QnVmZmVyLkxlbmd0aCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGNhcGEgPSAoaW50KShvdXRwdXRCdWZmZXIuQ2FwYWNpdHkgLSBvdXRwdXRCdWZmZXIuTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpbnQgd3JpdGVTaXplID0gY2FwYSA8PSBsZW4gPyBjYXBhIDogbGVuOworICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlci5Xcml0ZShidWYsIG9mZiwgd3JpdGVTaXplKTsKKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gd3JpdGVTaXplOworICAgICAgICAgICAgICAgIGlmICh3cml0ZVNpemUgPT0gY2FwYSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5Xcml0ZShvdXRwdXRCdWZmZXIuR2V0QnVmZmVyKCksIDAsIChpbnQpb3V0cHV0QnVmZmVyLkxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlci5TZXRMZW5ndGgoMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUgKGxlbiAtIG9mZnNldCA+PSBidWZTaXplKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5Xcml0ZShidWYsIG9mZiArIG9mZnNldCwgYnVmU2l6ZSk7CisgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGJ1ZlNpemU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgcmVtYWluID0gbGVuIC0gb2Zmc2V0OworICAgICAgICAgICAgaWYgKHJlbWFpbiA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKG91dHB1dEJ1ZmZlci5DYXBhY2l0eSA8IGJ1ZlNpemUpCisgICAgICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlci5DYXBhY2l0eSA9IGJ1ZlNpemU7CisgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyLldyaXRlKGJ1Ziwgb2ZmICsgb2Zmc2V0LCByZW1haW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIEludGVybmFsRmx1c2goKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIUlzT3BlbikKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CisgICAgICAgICAgICBpZiAob3V0cHV0QnVmZmVyLkxlbmd0aCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJhbnNwb3J0LldyaXRlKG91dHB1dEJ1ZmZlci5HZXRCdWZmZXIoKSwgMCwgKGludClvdXRwdXRCdWZmZXIuTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXIuU2V0TGVuZ3RoKDApOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgRmx1c2goKQogICAgICAgICB7Ci0gICAgICAgICAgICBvdXRwdXRCdWZmZXIuRmx1c2goKTsKKyAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKKyAgICAgICAgICAgIEludGVybmFsRmx1c2goKTsKKworICAgICAgICAgICAgdHJhbnNwb3J0LkZsdXNoKCk7CiAgICAgICAgIH0KIAotICAgICNyZWdpb24gIiBJRGlzcG9zYWJsZSBTdXBwb3J0ICIKLSAgICBwcml2YXRlIGJvb2wgX0lzRGlzcG9zZWQ7Ci0KLSAgICAvLyBJRGlzcG9zYWJsZQotICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIERpc3Bvc2UoYm9vbCBkaXNwb3NpbmcpCi0gICAgewotICAgICAgaWYgKCFfSXNEaXNwb3NlZCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGRpc3Bvc2luZykKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIElBc3luY1Jlc3VsdCBCZWdpbkZsdXNoKEFzeW5jQ2FsbGJhY2sgY2FsbGJhY2ssIG9iamVjdCBzdGF0ZSkKICAgICAgICAgewotICAgICAgICAgIGlmIChpbnB1dEJ1ZmZlciAhPSBudWxsKQotICAgICAgICAgICAgaW5wdXRCdWZmZXIuRGlzcG9zZSgpOwotICAgICAgICAgIGlmIChvdXRwdXRCdWZmZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIG91dHB1dEJ1ZmZlci5EaXNwb3NlKCk7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisgICAgICAgICAgICBJbnRlcm5hbEZsdXNoKCk7CisKKyAgICAgICAgICAgIHJldHVybiB0cmFuc3BvcnQuQmVnaW5GbHVzaCggY2FsbGJhY2ssIHN0YXRlKTsKICAgICAgICAgfQotICAgICAgfQotICAgICAgX0lzRGlzcG9zZWQgPSB0cnVlOworCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEVuZEZsdXNoKElBc3luY1Jlc3VsdCBhc3luY1Jlc3VsdCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJhbnNwb3J0LkVuZEZsdXNoKCBhc3luY1Jlc3VsdCk7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgQ2hlY2tOb3REaXNwb3NlZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfSXNEaXNwb3NlZCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT2JqZWN0RGlzcG9zZWRFeGNlcHRpb24oIlRCdWZmZXJlZFRyYW5zcG9ydCIpOworICAgICAgICB9CisKKyAgICAgICAgI3JlZ2lvbiAiIElEaXNwb3NhYmxlIFN1cHBvcnQgIgorICAgICAgICBwcm90ZWN0ZWQgYm9vbCBfSXNEaXNwb3NlZCB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KKworICAgICAgICAvLyBJRGlzcG9zYWJsZQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIV9Jc0Rpc3Bvc2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkaXNwb3NpbmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXRCdWZmZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0QnVmZmVyLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dEJ1ZmZlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zcG9ydCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfSXNEaXNwb3NlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgI2VuZHJlZ2lvbgogICAgIH0KLSAgICAjZW5kcmVnaW9uCi0gIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LmNzIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQuY3MKaW5kZXggOGFmMjI3Zi4uYTc0NmEzMiAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQuY3MKQEAgLTIxLDE0ICsyMSwxNCBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydAogewotICBwdWJsaWMgY2xhc3MgVEZyYW1lZFRyYW5zcG9ydCA6IFRUcmFuc3BvcnQsIElEaXNwb3NhYmxlCisgICAgcHVibGljIGNsYXNzIFRGcmFtZWRUcmFuc3BvcnQgOiBUVHJhbnNwb3J0LCBJRGlzcG9zYWJsZQogICAgIHsKLSAgICAgICAgcHJvdGVjdGVkIFRUcmFuc3BvcnQgdHJhbnNwb3J0ID0gbnVsbDsKLSAgICAgICAgcHJvdGVjdGVkIE1lbW9yeVN0cmVhbSB3cml0ZUJ1ZmZlcjsKLSAgICAgICAgcHJvdGVjdGVkIE1lbW9yeVN0cmVhbSByZWFkQnVmZmVyID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBUVHJhbnNwb3J0IHRyYW5zcG9ydDsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBNZW1vcnlTdHJlYW0gd3JpdGVCdWZmZXIgPSBuZXcgTWVtb3J5U3RyZWFtKDEwMjQpOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IE1lbW9yeVN0cmVhbSByZWFkQnVmZmVyID0gbmV3IE1lbW9yeVN0cmVhbSgxMDI0KTsKIAotICAgICAgICBwcml2YXRlIGNvbnN0IGludCBoZWFkZXJfc2l6ZSA9IDQ7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBoZWFkZXJfZHVtbXkgPSBuZXcgYnl0ZVtoZWFkZXJfc2l6ZV07IC8vIHVzZWQgYXMgaGVhZGVyIHBsYWNlaG9sZGVyIHdoaWxlIGluaXRpbGl6aW5nIG5ldyB3cml0ZSBidWZmZXIKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgSGVhZGVyU2l6ZSA9IDQ7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYnl0ZVtdIGhlYWRlckJ1ZiA9IG5ldyBieXRlW0hlYWRlclNpemVdOwogCiAgICAgICAgIHB1YmxpYyBjbGFzcyBGYWN0b3J5IDogVFRyYW5zcG9ydEZhY3RvcnkKICAgICAgICAgewpAQCAtMzgsMTggKzM4LDE3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBwcm90ZWN0ZWQgVEZyYW1lZFRyYW5zcG9ydCgpCisgICAgICAgIHB1YmxpYyBURnJhbWVkVHJhbnNwb3J0KFRUcmFuc3BvcnQgdHJhbnNwb3J0KQogICAgICAgICB7Ci0gICAgICAgICAgICBJbml0V3JpdGVCdWZmZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBURnJhbWVkVHJhbnNwb3J0KFRUcmFuc3BvcnQgdHJhbnNwb3J0KSA6IHRoaXMoKQotICAgICAgICB7CisgICAgICAgICAgICBpZiAodHJhbnNwb3J0ID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigidHJhbnNwb3J0Iik7CiAgICAgICAgICAgICB0aGlzLnRyYW5zcG9ydCA9IHRyYW5zcG9ydDsKKyAgICAgICAgICAgIEluaXRXcml0ZUJ1ZmZlcigpOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgT3BlbigpCiAgICAgICAgIHsKKyAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKICAgICAgICAgICAgIHRyYW5zcG9ydC5PcGVuKCk7CiAgICAgICAgIH0KIApAQCAtNTcsMjQgKzU2LDI4IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGdldAogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc3BvcnQuSXNPcGVuOworICAgICAgICAgICAgICAgIC8vIFdlIGNhbiBsZWdpdGltYXRlbHkgdGhyb3cgaGVyZSBidXQgYmUgbmljZSBhIGJpdC4KKyAgICAgICAgICAgICAgICAvLyBDaGVja05vdERpc3Bvc2VkKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuICFfSXNEaXNwb3NlZCAmJiB0cmFuc3BvcnQuSXNPcGVuOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQogICAgICAgICB7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CiAgICAgICAgICAgICB0cmFuc3BvcnQuQ2xvc2UoKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgUmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQogICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocmVhZEJ1ZmZlciAhPSBudWxsKQorICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworICAgICAgICAgICAgVmFsaWRhdGVCdWZmZXJBcmdzKGJ1Ziwgb2ZmLCBsZW4pOworICAgICAgICAgICAgaWYgKCFJc09wZW4pCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4pOworICAgICAgICAgICAgaW50IGdvdCA9IHJlYWRCdWZmZXIuUmVhZChidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgICAgIGlmIChnb3QgPiAwKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBnb3QgPSByZWFkQnVmZmVyLlJlYWQoYnVmLCBvZmYsIGxlbik7Ci0gICAgICAgICAgICAgICAgaWYgKGdvdCA+IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ290OwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZ290OwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBSZWFkIGFub3RoZXIgZnJhbWUgb2YgZGF0YQpAQCAtODUsNDkgKzg4LDc1IEBACiAKICAgICAgICAgcHJpdmF0ZSB2b2lkIFJlYWRGcmFtZSgpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGJ5dGVbXSBpMzJyZCA9IG5ldyBieXRlW2hlYWRlcl9zaXplXTsKLSAgICAgICAgICAgIHRyYW5zcG9ydC5SZWFkQWxsKGkzMnJkLCAwLCBoZWFkZXJfc2l6ZSk7Ci0gICAgICAgICAgICBpbnQgc2l6ZSA9IERlY29kZUZyYW1lU2l6ZShpMzJyZCk7CisgICAgICAgICAgICB0cmFuc3BvcnQuUmVhZEFsbChoZWFkZXJCdWYsIDAsIEhlYWRlclNpemUpOworICAgICAgICAgICAgaW50IHNpemUgPSBEZWNvZGVGcmFtZVNpemUoaGVhZGVyQnVmKTsKIAotICAgICAgICAgICAgYnl0ZVtdIGJ1ZmYgPSBuZXcgYnl0ZVtzaXplXTsKKyAgICAgICAgICAgIHJlYWRCdWZmZXIuU2V0TGVuZ3RoKHNpemUpOworICAgICAgICAgICAgcmVhZEJ1ZmZlci5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOworICAgICAgICAgICAgYnl0ZVtdIGJ1ZmYgPSByZWFkQnVmZmVyLkdldEJ1ZmZlcigpOwogICAgICAgICAgICAgdHJhbnNwb3J0LlJlYWRBbGwoYnVmZiwgMCwgc2l6ZSk7Ci0gICAgICAgICAgICByZWFkQnVmZmVyID0gbmV3IE1lbW9yeVN0cmVhbShidWZmKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCiAgICAgICAgIHsKKyAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKKyAgICAgICAgICAgIFZhbGlkYXRlQnVmZmVyQXJncyhidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgICAgIGlmICghSXNPcGVuKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuKTsKKyAgICAgICAgICAgIGlmICh3cml0ZUJ1ZmZlci5MZW5ndGggKyAobG9uZylsZW4gPiAobG9uZylpbnQuTWF4VmFsdWUpCisgICAgICAgICAgICAgICAgRmx1c2goKTsKICAgICAgICAgICAgIHdyaXRlQnVmZmVyLldyaXRlKGJ1Ziwgb2ZmLCBsZW4pOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgRmx1c2goKQorICAgICAgICBwcml2YXRlIHZvaWQgSW50ZXJuYWxGbHVzaCgpCiAgICAgICAgIHsKKyAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKKyAgICAgICAgICAgIGlmICghSXNPcGVuKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuKTsKICAgICAgICAgICAgIGJ5dGVbXSBidWYgPSB3cml0ZUJ1ZmZlci5HZXRCdWZmZXIoKTsKICAgICAgICAgICAgIGludCBsZW4gPSAoaW50KXdyaXRlQnVmZmVyLkxlbmd0aDsKLSAgICAgICAgICAgIGludCBkYXRhX2xlbiA9IGxlbiAtIGhlYWRlcl9zaXplOwotICAgICAgICAgICAgaWYgKCBkYXRhX2xlbiA8IDAgKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTeXN0ZW0uSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbiAoKTsgLy8gbG9naWMgZXJyb3IgYWN0dWFsbHkKLQotICAgICAgICAgICAgSW5pdFdyaXRlQnVmZmVyKCk7CisgICAgICAgICAgICBpbnQgZGF0YV9sZW4gPSBsZW4gLSBIZWFkZXJTaXplOworICAgICAgICAgICAgaWYgKGRhdGFfbGVuIDwgMCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3lzdGVtLkludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oKTsgLy8gbG9naWMgZXJyb3IgYWN0dWFsbHkKIAogICAgICAgICAgICAgLy8gSW5qZWN0IG1lc3NhZ2UgaGVhZGVyIGludG8gdGhlIHJlc2VydmVkIGJ1ZmZlciBzcGFjZQotICAgICAgICAgICAgRW5jb2RlRnJhbWVTaXplKGRhdGFfbGVuLHJlZiBidWYpOworICAgICAgICAgICAgRW5jb2RlRnJhbWVTaXplKGRhdGFfbGVuLCBidWYpOwogCiAgICAgICAgICAgICAvLyBTZW5kIHRoZSBlbnRpcmUgbWVzc2FnZSBhdCBvbmNlCiAgICAgICAgICAgICB0cmFuc3BvcnQuV3JpdGUoYnVmLCAwLCBsZW4pOwogCisgICAgICAgICAgICBJbml0V3JpdGVCdWZmZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEZsdXNoKCkKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworICAgICAgICAgICAgSW50ZXJuYWxGbHVzaCgpOworCiAgICAgICAgICAgICB0cmFuc3BvcnQuRmx1c2goKTsKICAgICAgICAgfQogCi0gICAgICAgIHByaXZhdGUgdm9pZCBJbml0V3JpdGVCdWZmZXIgKCkKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIElBc3luY1Jlc3VsdCBCZWdpbkZsdXNoKEFzeW5jQ2FsbGJhY2sgY2FsbGJhY2ssIG9iamVjdCBzdGF0ZSkKICAgICAgICAgewotICAgICAgICAgICAgLy8gQ3JlYXRlIG5ldyBidWZmZXIgaW5zdGFuY2UKLSAgICAgICAgICAgIHdyaXRlQnVmZmVyID0gbmV3IE1lbW9yeVN0cmVhbSgxMDI0KTsKKyAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKKyAgICAgICAgICAgIEludGVybmFsRmx1c2goKTsKIAotICAgICAgICAgICAgLy8gUmVzZXJ2ZSBzcGFjZSBmb3IgbWVzc2FnZSBoZWFkZXIgdG8gYmUgcHV0IHJpZ2h0IGJlZm9yZSBzZW5kaW5nIGl0IG91dAotICAgICAgICAgICAgd3JpdGVCdWZmZXIuV3JpdGUgKCBoZWFkZXJfZHVtbXksIDAsIGhlYWRlcl9zaXplICk7CisgICAgICAgICAgICByZXR1cm4gdHJhbnNwb3J0LkJlZ2luRmx1c2goIGNhbGxiYWNrLCBzdGF0ZSk7CiAgICAgICAgIH0KIAotICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEVuY29kZUZyYW1lU2l6ZShpbnQgZnJhbWVTaXplLCByZWYgYnl0ZVtdIGJ1ZikKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgRW5kRmx1c2goSUFzeW5jUmVzdWx0IGFzeW5jUmVzdWx0KQorICAgICAgICB7CisgICAgICAgICAgICB0cmFuc3BvcnQuRW5kRmx1c2goIGFzeW5jUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBJbml0V3JpdGVCdWZmZXIoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBSZXNlcnZlIHNwYWNlIGZvciBtZXNzYWdlIGhlYWRlciB0byBiZSBwdXQgcmlnaHQgYmVmb3JlIHNlbmRpbmcgaXQgb3V0CisgICAgICAgICAgICB3cml0ZUJ1ZmZlci5TZXRMZW5ndGgoSGVhZGVyU2l6ZSk7CisgICAgICAgICAgICB3cml0ZUJ1ZmZlci5TZWVrKDAsIFNlZWtPcmlnaW4uRW5kKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgRW5jb2RlRnJhbWVTaXplKGludCBmcmFtZVNpemUsIGJ5dGVbXSBidWYpCiAgICAgICAgIHsKICAgICAgICAgICAgIGJ1ZlswXSA9IChieXRlKSgweGZmICYgKGZyYW1lU2l6ZSA+PiAyNCkpOwogICAgICAgICAgICAgYnVmWzFdID0gKGJ5dGUpKDB4ZmYgJiAoZnJhbWVTaXplID4+IDE2KSk7CkBAIC0xNDAsMTEgKzE2OSwxNyBAQAogICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgICAgKChidWZbMF0gJiAweGZmKSA8PCAyNCkgfAogICAgICAgICAgICAgICAgICgoYnVmWzFdICYgMHhmZikgPDwgMTYpIHwKLSAgICAgICAgICAgICAgICAoKGJ1ZlsyXSAmIDB4ZmYpIDw8ICA4KSB8CisgICAgICAgICAgICAgICAgKChidWZbMl0gJiAweGZmKSA8PCA4KSB8CiAgICAgICAgICAgICAgICAgKChidWZbM10gJiAweGZmKSk7CiAgICAgICAgIH0KIAogCisgICAgICAgIHByaXZhdGUgdm9pZCBDaGVja05vdERpc3Bvc2VkKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9Jc0Rpc3Bvc2VkKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBPYmplY3REaXNwb3NlZEV4Y2VwdGlvbigiVEZyYW1lZFRyYW5zcG9ydCIpOworICAgICAgICB9CisKICAgICAgICAgI3JlZ2lvbiAiIElEaXNwb3NhYmxlIFN1cHBvcnQgIgogICAgICAgICBwcml2YXRlIGJvb2wgX0lzRGlzcG9zZWQ7CiAKQEAgLTE1Nyw2ICsxOTIsMTAgQEAKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkQnVmZmVyICE9IG51bGwpCiAgICAgICAgICAgICAgICAgICAgICAgICByZWFkQnVmZmVyLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlQnVmZmVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUJ1ZmZlci5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc3BvcnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5EaXNwb3NlKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgX0lzRGlzcG9zZWQgPSB0cnVlOwpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RIdHRwQ2xpZW50LmNzIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RIdHRwQ2xpZW50LmNzCmluZGV4IGE1NmEzZTguLjY2N2ZjMjUgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9USHR0cENsaWVudC5jcworKysgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVEh0dHBDbGllbnQuY3MKQEAgLTI2LDEwICsyNiwxMCBAQAogdXNpbmcgU3lzdGVtLlRocmVhZGluZzsKIHVzaW5nIFN5c3RlbS5MaW5xOwogdXNpbmcgU3lzdGVtLlNlY3VyaXR5LkNyeXB0b2dyYXBoeS5YNTA5Q2VydGlmaWNhdGVzOwordXNpbmcgU3lzdGVtLklPLkNvbXByZXNzaW9uOwogCiBuYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydAogewotCiAgICAgcHVibGljIGNsYXNzIFRIdHRwQ2xpZW50IDogVFRyYW5zcG9ydCwgSURpc3Bvc2FibGUKICAgICB7CiAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVXJpIHVyaTsKQEAgLTQyLDcgKzQyLDcgQEAKIAogICAgICAgICBwcml2YXRlIGludCByZWFkVGltZW91dCA9IDMwMDAwOwogCi0gICAgICAgIHByaXZhdGUgSURpY3Rpb25hcnk8U3RyaW5nLCBTdHJpbmc+IGN1c3RvbUhlYWRlcnMgPSBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4oKTsKKyAgICAgICAgcHJpdmF0ZSBJRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4gY3VzdG9tSGVhZGVycyA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPigpOwogCiAjaWYgIVNJTFZFUkxJR0hUCiAgICAgICAgIHByaXZhdGUgSVdlYlByb3h5IHByb3h5ID0gV2ViUmVxdWVzdC5EZWZhdWx0V2ViUHJveHk7CkBAIC02Myw3ICs2Myw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIHNldAogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgY29ubmVjdFRpbWVvdXQgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICBjb25uZWN0VGltZW91dCA9IHZhbHVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTc1LDcgKzc1LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBJRGljdGlvbmFyeTxTdHJpbmcsIFN0cmluZz4gQ3VzdG9tSGVhZGVycworICAgICAgICBwdWJsaWMgSURpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+IEN1c3RvbUhlYWRlcnMKICAgICAgICAgewogICAgICAgICAgICAgZ2V0CiAgICAgICAgICAgICB7CkBAIC0xMzksNyArMTM5LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLlVua25vd24sIGlveC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuVW5rbm93biwgaW94LlRvU3RyaW5nKCksIGlveCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMTY2LDYgKzE2Niw3IEBACiAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBIdHRwV2ViUmVxdWVzdCBjb25uZWN0aW9uID0gQ3JlYXRlUmVxdWVzdCgpOworICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uSGVhZGVycy5BZGQoIkFjY2VwdC1FbmNvZGluZyIsICJnemlwLCBkZWZsYXRlIik7CiAKICAgICAgICAgICAgICAgICBieXRlW10gZGF0YSA9IG91dHB1dFN0cmVhbS5Ub0FycmF5KCk7CiAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5Db250ZW50TGVuZ3RoID0gZGF0YS5MZW5ndGg7CkBAIC0xODQsMjYgKzE4NSw2OSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvcHkgdGhlIHJlc3BvbnNlIHRvIGEgbWVtb3J5IHN0cmVhbSBzbyB0aGF0IHdlIGNhbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNsZWFubHkgY2xvc2UgdGhlIHJlc3BvbnNlIGFuZCByZXNwb25zZSBzdHJlYW0uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzgwOTZdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVs4MTkyXTsgIC8vIG11bHRpcGxlIG9mIDQwOTYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnl0ZXNSZWFkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgoYnl0ZXNSZWFkID0gcmVzcG9uc2VTdHJlYW0uUmVhZChidWZmZXIsIDAsIGJ1ZmZlci5MZW5ndGgpKSA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbS5Xcml0ZSAoYnVmZmVyLCAwLCBieXRlc1JlYWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbS5Xcml0ZShidWZmZXIsIDAsIGJ5dGVzUmVhZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtLlNlZWsoMCwgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbmNvZGluZ3MgPSByZXNwb25zZS5IZWFkZXJzLkdldFZhbHVlcygiQ29udGVudC1FbmNvZGluZyIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVuY29kaW5ncyAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBlbmNvZGluZyBpbiBlbmNvZGluZ3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGVuY29kaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJnemlwIjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNvbXByZXNzR1ppcHBlZChyZWYgaW5wdXRTdHJlYW0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiZGVmbGF0ZSI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjb21wcmVzc0RlZmxhdGVkKHJlZiBpbnB1dFN0cmVhbSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuVW5rbm93biwgaW94LlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Vbmtub3duLCBpb3guVG9TdHJpbmcoKSwgaW94KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhdGNoIChXZWJFeGNlcHRpb24gd3gpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLlVua25vd24sICJDb3VsZG4ndCBjb25uZWN0IHRvIHNlcnZlcjogIiArIHd4KTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuVW5rbm93biwgIkNvdWxkbid0IGNvbm5lY3QgdG8gc2VydmVyOiAiICsgd3gsIHd4KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBEZWNvbXByZXNzRGVmbGF0ZWQocmVmIFN0cmVhbSBpbnB1dFN0cmVhbSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHRtcCA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgZGVjb21wID0gbmV3IERlZmxhdGVTdHJlYW0oaW5wdXRTdHJlYW0sIENvbXByZXNzaW9uTW9kZS5EZWNvbXByZXNzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkZWNvbXAuQ29weVRvKHRtcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnB1dFN0cmVhbS5EaXNwb3NlKCk7CisgICAgICAgICAgICBpbnB1dFN0cmVhbSA9IHRtcDsKKyAgICAgICAgICAgIGlucHV0U3RyZWFtLlNlZWsoMCwgMCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgRGVjb21wcmVzc0daaXBwZWQocmVmIFN0cmVhbSBpbnB1dFN0cmVhbSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHRtcCA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgZGVjb21wID0gbmV3IEdaaXBTdHJlYW0oaW5wdXRTdHJlYW0sIENvbXByZXNzaW9uTW9kZS5EZWNvbXByZXNzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkZWNvbXAuQ29weVRvKHRtcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnB1dFN0cmVhbS5EaXNwb3NlKCk7CisgICAgICAgICAgICBpbnB1dFN0cmVhbSA9IHRtcDsKKyAgICAgICAgICAgIGlucHV0U3RyZWFtLlNlZWsoMCwgMCk7CisgICAgICAgIH0KICNlbmRpZgogICAgICAgICBwcml2YXRlIEh0dHBXZWJSZXF1ZXN0IENyZWF0ZVJlcXVlc3QoKQogICAgICAgICB7CkBAIC0yNzIsNyArMzE2LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oaW94LlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGlveC5Ub1N0cmluZygpLCBpb3gpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTI4MCw3ICszMjQsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgZmx1c2hBc3luY1Jlc3VsdCA9IChGbHVzaEFzeW5jUmVzdWx0KSBhc3luY1Jlc3VsdDsKKyAgICAgICAgICAgICAgICB2YXIgZmx1c2hBc3luY1Jlc3VsdCA9IChGbHVzaEFzeW5jUmVzdWx0KWFzeW5jUmVzdWx0OwogCiAgICAgICAgICAgICAgICAgaWYgKCFmbHVzaEFzeW5jUmVzdWx0LklzQ29tcGxldGVkKQogICAgICAgICAgICAgICAgIHsKQEAgLTI5Myw3ICszMzcsOCBAQAogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZmx1c2hBc3luY1Jlc3VsdC5Bc3luY0V4Y2VwdGlvbjsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGZpbmFsbHkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsbHkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCk7CiAgICAgICAgICAgICB9CkBAIC0zMTUsNyArMzYwLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZsdXNoQXN5bmNSZXN1bHQuQXN5bmNFeGNlcHRpb24gPSBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihleGNlcHRpb24uVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgZmx1c2hBc3luY1Jlc3VsdC5Bc3luY0V4Y2VwdGlvbiA9IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGV4Y2VwdGlvbi5Ub1N0cmluZygpLCBleGNlcHRpb24pOwogICAgICAgICAgICAgICAgIGZsdXNoQXN5bmNSZXN1bHQuVXBkYXRlU3RhdHVzVG9Db21wbGV0ZSgpOwogICAgICAgICAgICAgICAgIGZsdXNoQXN5bmNSZXN1bHQuTm90aWZ5Q2FsbGJhY2tXaGVuQXZhaWxhYmxlKCk7CiAgICAgICAgICAgICB9CkBAIC0zMzAsNyArMzc1LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZsdXNoQXN5bmNSZXN1bHQuQXN5bmNFeGNlcHRpb24gPSBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihleGNlcHRpb24uVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgZmx1c2hBc3luY1Jlc3VsdC5Bc3luY0V4Y2VwdGlvbiA9IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGV4Y2VwdGlvbi5Ub1N0cmluZygpLCBleGNlcHRpb24pOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZmx1c2hBc3luY1Jlc3VsdC5VcGRhdGVTdGF0dXNUb0NvbXBsZXRlKCk7CiAgICAgICAgICAgICBmbHVzaEFzeW5jUmVzdWx0Lk5vdGlmeUNhbGxiYWNrV2hlbkF2YWlsYWJsZSgpOwpAQCAtMzQyLDkgKzM4Nyw5IEBACiAgICAgICAgICAgICBwcml2YXRlIHZvbGF0aWxlIEJvb2xlYW4gX2lzQ29tcGxldGVkOwogICAgICAgICAgICAgcHJpdmF0ZSBNYW51YWxSZXNldEV2ZW50IF9ldnQ7CiAgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEFzeW5jQ2FsbGJhY2sgX2NiTWV0aG9kOwotICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBPYmplY3QgX3N0YXRlOworICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBvYmplY3QgX3N0YXRlOwogCi0gICAgICAgICAgICBwdWJsaWMgRmx1c2hBc3luY1Jlc3VsdChBc3luY0NhbGxiYWNrIGNiTWV0aG9kLCBPYmplY3Qgc3RhdGUpCisgICAgICAgICAgICBwdWJsaWMgRmx1c2hBc3luY1Jlc3VsdChBc3luY0NhbGxiYWNrIGNiTWV0aG9kLCBvYmplY3Qgc3RhdGUpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgX2NiTWV0aG9kID0gY2JNZXRob2Q7CiAgICAgICAgICAgICAgICAgX3N0YXRlID0gc3RhdGU7CkBAIC0zNzAsNyArNDE1LDcgQEAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBnZXQgeyByZXR1cm4gX2lzQ29tcGxldGVkOyB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IE9iamVjdCBfbG9ja2VyID0gbmV3IE9iamVjdCgpOworICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBvYmplY3QgX2xvY2tlciA9IG5ldyBvYmplY3QoKTsKICAgICAgICAgICAgIHByaXZhdGUgTWFudWFsUmVzZXRFdmVudCBHZXRFdnRIYW5kbGUoKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGxvY2sgKF9sb2NrZXIpCkBAIC00MDcsNyArNDUyLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0jcmVnaW9uICIgSURpc3Bvc2FibGUgU3VwcG9ydCAiCisgICAgICAgICNyZWdpb24gIiBJRGlzcG9zYWJsZSBTdXBwb3J0ICIKICAgICAgICAgcHJpdmF0ZSBib29sIF9Jc0Rpc3Bvc2VkOwogCiAgICAgICAgIC8vIElEaXNwb3NhYmxlCkBAIC00MjUsNiArNDcwLDYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIF9Jc0Rpc3Bvc2VkID0gdHJ1ZTsKICAgICAgICAgfQotI2VuZHJlZ2lvbgorICAgICAgICAjZW5kcmVnaW9uCiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RIdHRwVGFza0FzeW5jSGFuZGxlci5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9USHR0cFRhc2tBc3luY0hhbmRsZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ5MWYzMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9USHR0cFRhc2tBc3luY0hhbmRsZXIuY3MKQEAgLTAsMCArMSw5NyBAQAor77u/LyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBTeXN0ZW0uV2ViOwordXNpbmcgVGhyaWZ0LlByb3RvY29sOworCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydAoreworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gQW4gYXN5bmMgdGFzayBiYXNlZCBIVFRQIGhhbmRsZXIgZm9yIHByb2Nlc3NpbmcgdGhyaWZ0IHNlcnZpY2VzLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIFRIdHRwVGFza0FzeW5jSGFuZGxlciA6IEh0dHBUYXNrQXN5bmNIYW5kbGVyCisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFRBc3luY1Byb2Nlc3NvciBfcHJvY2Vzc29yOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFRQcm90b2NvbEZhY3RvcnkgX2lucHV0UHJvdG9jb2xGYWN0b3J5OworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFRQcm90b2NvbEZhY3RvcnkgX291dHB1dFByb3RvY29sRmFjdG9yeTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgPHNlZSBjcmVmPSJUSHR0cFRhc2tBc3luY0hhbmRsZXIiLz4gY2xhc3MKKyAgICAgICAgLy8vIHVzaW5nIHRoZSA8c2VlIGNyZWY9IlRCaW5hcnlQcm90b2NvbC5GYWN0b3J5Ii8+IGZvciBib3RoIGlucHV0IGFuZCBvdXRwdXQgc3RyZWFtcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwcm9jZXNzb3IiPlRoZSBhc3luYyBwcm9jZXNzb3IgaW1wbGVtZW50YXRpb24uPC9wYXJhbT4KKyAgICAgICAgcHVibGljIFRIdHRwVGFza0FzeW5jSGFuZGxlcihUQXN5bmNQcm9jZXNzb3IgcHJvY2Vzc29yKQorICAgICAgICAgICAgOiB0aGlzKHByb2Nlc3NvciwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCkpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSA8c2VlIGNyZWY9IlRIdHRwVGFza0FzeW5jSGFuZGxlciIvPiBjbGFzcworICAgICAgICAvLy8gdXNpbmcgPHBhcmFtcmVmIG5hbWU9InByb3RvY29sRmFjdG9yeSIvPiBmb3IgYm90aCBpbnB1dCBhbmQgb3V0cHV0IHN0cmVhbXMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icHJvY2Vzc29yIj5UaGUgYXN5bmMgcHJvY2Vzc29yIGltcGxlbWVudGF0aW9uLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icHJvdG9jb2xGYWN0b3J5Ij5UaGUgcHJvdG9jb2wgZmFjdG9yeS48L3BhcmFtPgorICAgICAgICBwdWJsaWMgVEh0dHBUYXNrQXN5bmNIYW5kbGVyKFRBc3luY1Byb2Nlc3NvciBwcm9jZXNzb3IsIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5KQorICAgICAgICAgICAgOiB0aGlzKHByb2Nlc3NvciwgcHJvdG9jb2xGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSA8c2VlIGNyZWY9IlRIdHRwVGFza0FzeW5jSGFuZGxlciIvPiBjbGFzcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwcm9jZXNzb3IiPlRoZSBhc3luYyBwcm9jZXNzb3IgaW1wbGVtZW50YXRpb24uPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpbnB1dFByb3RvY29sRmFjdG9yeSI+VGhlIGlucHV0IHByb3RvY29sIGZhY3RvcnkuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvdXRwdXRQcm90b2NvbEZhY3RvcnkiPlRoZSBvdXRwdXQgcHJvdG9jb2wgZmFjdG9yeS48L3BhcmFtPgorICAgICAgICBwdWJsaWMgVEh0dHBUYXNrQXN5bmNIYW5kbGVyKFRBc3luY1Byb2Nlc3NvciBwcm9jZXNzb3IsIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeSkKKyAgICAgICAgeworICAgICAgICAgICAgX3Byb2Nlc3NvciA9IHByb2Nlc3NvcjsKKyAgICAgICAgICAgIF9pbnB1dFByb3RvY29sRmFjdG9yeSA9IGlucHV0UHJvdG9jb2xGYWN0b3J5OworICAgICAgICAgICAgX291dHB1dFByb3RvY29sRmFjdG9yeSA9IG91dHB1dFByb3RvY29sRmFjdG9yeTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFByb2Nlc3NSZXF1ZXN0QXN5bmMoSHR0cENvbnRleHQgY29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHRyYW5zcG9ydCA9IG5ldyBUU3RyZWFtVHJhbnNwb3J0KGNvbnRleHQuUmVxdWVzdC5JbnB1dFN0cmVhbSwgY29udGV4dC5SZXNwb25zZS5PdXRwdXRTdHJlYW0pOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgaW5wdXQgPSBfaW5wdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICB2YXIgb3V0cHV0ID0gX291dHB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbCh0cmFuc3BvcnQpOworCisgICAgICAgICAgICAgICAgd2hpbGUgKGF3YWl0IF9wcm9jZXNzb3IuUHJvY2Vzc0FzeW5jKGlucHV0LCBvdXRwdXQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBDbGllbnQgZGllZCwganVzdCBtb3ZlIG9uCisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbGx5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJhbnNwb3J0LkNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLmNzCmluZGV4IGQ4ZmY5ZGMuLjMwM2QwODMgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLmNzCkBAIC0yMiw0NSArMjIsNTYgQEAKIHVzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwogdXNpbmcgVGhyaWZ0LlByb3RvY29sOwogCi1uYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydCB7Ci0gICAgcHVibGljIGNsYXNzIFRNZW1vcnlCdWZmZXIgOiBUVHJhbnNwb3J0IHsKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0Cit7CisgICAgcHVibGljIGNsYXNzIFRNZW1vcnlCdWZmZXIgOiBUVHJhbnNwb3J0CisgICAgewogCiAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgTWVtb3J5U3RyZWFtIGJ5dGVTdHJlYW07CiAKLSAgICAgICAgcHVibGljIFRNZW1vcnlCdWZmZXIoKSB7CisgICAgICAgIHB1YmxpYyBUTWVtb3J5QnVmZmVyKCkKKyAgICAgICAgewogICAgICAgICAgICAgYnl0ZVN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBUTWVtb3J5QnVmZmVyKGJ5dGVbXSBidWYpIHsKKyAgICAgICAgcHVibGljIFRNZW1vcnlCdWZmZXIoYnl0ZVtdIGJ1ZikKKyAgICAgICAgewogICAgICAgICAgICAgYnl0ZVN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oYnVmKTsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIE9wZW4oKSB7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIE9wZW4oKQorICAgICAgICB7CiAgICAgICAgICAgICAvKiogZG8gbm90aGluZyAqKi8KICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkgeworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCisgICAgICAgIHsKICAgICAgICAgICAgIC8qKiBkbyBub3RoaW5nICoqLwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBSZWFkKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBSZWFkKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCisgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBieXRlU3RyZWFtLlJlYWQoYnVmLCBvZmYsIGxlbik7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZShieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCisgICAgICAgIHsKICAgICAgICAgICAgIGJ5dGVTdHJlYW0uV3JpdGUoYnVmLCBvZmYsIGxlbik7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgYnl0ZVtdIEdldEJ1ZmZlcigpIHsKKyAgICAgICAgcHVibGljIGJ5dGVbXSBHZXRCdWZmZXIoKQorICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gYnl0ZVN0cmVhbS5Ub0FycmF5KCk7CiAgICAgICAgIH0KIAogCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbiB7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbgorICAgICAgICB7CiAgICAgICAgICAgICBnZXQgeyByZXR1cm4gdHJ1ZTsgfQogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHN0YXRpYyBieXRlW10gU2VyaWFsaXplKFRBYnN0cmFjdEJhc2UgcykgeworICAgICAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBTZXJpYWxpemUoVEFic3RyYWN0QmFzZSBzKQorICAgICAgICB7CiAgICAgICAgICAgICB2YXIgdCA9IG5ldyBUTWVtb3J5QnVmZmVyKCk7CiAgICAgICAgICAgICB2YXIgcCA9IG5ldyBUQmluYXJ5UHJvdG9jb2wodCk7CiAKQEAgLTY5LDI2ICs4MCwzMyBAQAogICAgICAgICAgICAgcmV0dXJuIHQuR2V0QnVmZmVyKCk7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgc3RhdGljIFQgRGVTZXJpYWxpemU8VD4oYnl0ZVtdIGJ1Zikgd2hlcmUgVCA6IFRBYnN0cmFjdEJhc2UgeworICAgICAgICBwdWJsaWMgc3RhdGljIFQgRGVTZXJpYWxpemU8VD4oYnl0ZVtdIGJ1Zikgd2hlcmUgVCA6IFRBYnN0cmFjdEJhc2UKKyAgICAgICAgewogICAgICAgICAgICAgdmFyIHRyYW5zID0gbmV3IFRNZW1vcnlCdWZmZXIoYnVmKTsKICAgICAgICAgICAgIHZhciBwID0gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFucyk7Ci0gICAgICAgICAgICBpZiAodHlwZW9mIChUQmFzZSkuSXNBc3NpZ25hYmxlRnJvbSh0eXBlb2YgKFQpKSkgewotICAgICAgICAgICAgICAgIHZhciBtZXRob2QgPSB0eXBlb2YgKFQpLkdldE1ldGhvZCgiUmVhZCIsIEJpbmRpbmdGbGFncy5JbnN0YW5jZSB8IEJpbmRpbmdGbGFncy5QdWJsaWMpOworICAgICAgICAgICAgaWYgKHR5cGVvZihUQmFzZSkuSXNBc3NpZ25hYmxlRnJvbSh0eXBlb2YoVCkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBtZXRob2QgPSB0eXBlb2YoVCkuR2V0TWV0aG9kKCJSZWFkIiwgQmluZGluZ0ZsYWdzLkluc3RhbmNlIHwgQmluZGluZ0ZsYWdzLlB1YmxpYyk7CiAgICAgICAgICAgICAgICAgdmFyIHQgPSBBY3RpdmF0b3IuQ3JlYXRlSW5zdGFuY2U8VD4oKTsKLSAgICAgICAgICAgICAgICBtZXRob2QuSW52b2tlKHQsIG5ldyBvYmplY3RbXSB7cH0pOworICAgICAgICAgICAgICAgIG1ldGhvZC5JbnZva2UodCwgbmV3IG9iamVjdFtdIHsgcCB9KTsKICAgICAgICAgICAgICAgICByZXR1cm4gdDsKLSAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgIHZhciBtZXRob2QgPSB0eXBlb2YgKFQpLkdldE1ldGhvZCgiUmVhZCIsIEJpbmRpbmdGbGFncy5TdGF0aWMgfCBCaW5kaW5nRmxhZ3MuUHVibGljKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gKFQpIG1ldGhvZC5JbnZva2UobnVsbCwgbmV3IG9iamVjdFtdIHtwfSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIG1ldGhvZCA9IHR5cGVvZihUKS5HZXRNZXRob2QoIlJlYWQiLCBCaW5kaW5nRmxhZ3MuU3RhdGljIHwgQmluZGluZ0ZsYWdzLlB1YmxpYyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChUKW1ldGhvZC5JbnZva2UobnVsbCwgbmV3IG9iamVjdFtdIHsgcCB9KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIHByaXZhdGUgYm9vbCBfSXNEaXNwb3NlZDsKIAogICAgICAgICAvLyBJRGlzcG9zYWJsZQotICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKSB7Ci0gICAgICAgICAgICBpZiAoIV9Jc0Rpc3Bvc2VkKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRpc3Bvc2luZykgeworICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIV9Jc0Rpc3Bvc2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkaXNwb3NpbmcpCisgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZVN0cmVhbSAhPSBudWxsKQogICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVN0cmVhbS5EaXNwb3NlKCk7CiAgICAgICAgICAgICAgICAgfQpAQCAtOTYsNCArMTE0LDQgQEAKICAgICAgICAgICAgIF9Jc0Rpc3Bvc2VkID0gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVE5hbWVkUGlwZUNsaWVudFRyYW5zcG9ydC5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UTmFtZWRQaXBlQ2xpZW50VHJhbnNwb3J0LmNzCmluZGV4IDlmYWE2ZTcuLjQ5YTUwYWEgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UTmFtZWRQaXBlQ2xpZW50VHJhbnNwb3J0LmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UTmFtZWRQaXBlQ2xpZW50VHJhbnNwb3J0LmNzCkBAIC0yMSw3ICsyMSw5IEBACiAgKiBkZXRhaWxzLgogICovCiAKK3VzaW5nIFN5c3RlbTsKIHVzaW5nIFN5c3RlbS5JTy5QaXBlczsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7CiAKIG5hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0CiB7CkBAIC0zMCwxNyArMzIsMjAgQEAKICAgICAgICAgcHJpdmF0ZSBOYW1lZFBpcGVDbGllbnRTdHJlYW0gY2xpZW50OwogICAgICAgICBwcml2YXRlIHN0cmluZyBTZXJ2ZXJOYW1lOwogICAgICAgICBwcml2YXRlIHN0cmluZyBQaXBlTmFtZTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgQ29ubmVjdFRpbWVvdXQ7CiAKLSAgICAgICAgcHVibGljIFROYW1lZFBpcGVDbGllbnRUcmFuc3BvcnQoc3RyaW5nIHBpcGUpCisgICAgICAgIHB1YmxpYyBUTmFtZWRQaXBlQ2xpZW50VHJhbnNwb3J0KHN0cmluZyBwaXBlLCBpbnQgdGltZW91dCA9IFRpbWVvdXQuSW5maW5pdGUpCiAgICAgICAgIHsKICAgICAgICAgICAgIFNlcnZlck5hbWUgPSAiLiI7CiAgICAgICAgICAgICBQaXBlTmFtZSA9IHBpcGU7CisgICAgICAgICAgICBDb25uZWN0VGltZW91dCA9IHRpbWVvdXQ7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgVE5hbWVkUGlwZUNsaWVudFRyYW5zcG9ydChzdHJpbmcgc2VydmVyLCBzdHJpbmcgcGlwZSkKKyAgICAgICAgcHVibGljIFROYW1lZFBpcGVDbGllbnRUcmFuc3BvcnQoc3RyaW5nIHNlcnZlciwgc3RyaW5nIHBpcGUsIGludCB0aW1lb3V0ID0gVGltZW91dC5JbmZpbml0ZSkKICAgICAgICAgewogICAgICAgICAgICAgU2VydmVyTmFtZSA9IChzZXJ2ZXIgIT0gIiIpID8gc2VydmVyIDogIi4iOwogICAgICAgICAgICAgUGlwZU5hbWUgPSBwaXBlOworICAgICAgICAgICAgQ29ubmVjdFRpbWVvdXQgPSB0aW1lb3V0OwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNPcGVuCkBAIC01NSw3ICs2MCw3IEBACiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkFscmVhZHlPcGVuKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNsaWVudCA9IG5ldyBOYW1lZFBpcGVDbGllbnRTdHJlYW0oU2VydmVyTmFtZSwgUGlwZU5hbWUsIFBpcGVEaXJlY3Rpb24uSW5PdXQsIFBpcGVPcHRpb25zLk5vbmUpOwotICAgICAgICAgICAgY2xpZW50LkNvbm5lY3QoKTsKKyAgICAgICAgICAgIGNsaWVudC5Db25uZWN0KENvbm5lY3RUaW1lb3V0KTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKQEAgLTg0LDcgKzg5LDE4IEBACiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4pOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBjbGllbnQuV3JpdGUoYnVmLCBvZmYsIGxlbik7CisgICAgICAgICAgICAvLyBpZiBuZWNlc3NhcnksIHNlbmQgdGhlIGRhdGEgaW4gY2h1bmtzCisgICAgICAgICAgICAvLyB0aGVyZSdzIGEgc3lzdGVtIGxpbWl0IGFyb3VuZCAweDEwMDAwIGJ5dGVzIHRoYXQgd2UgaGl0IG90aGVyd2lzZQorICAgICAgICAgICAgLy8gTVNETjogIlBpcGUgd3JpdGUgb3BlcmF0aW9ucyBhY3Jvc3MgYSBuZXR3b3JrIGFyZSBsaW1pdGVkIHRvIDY1LDUzNSBieXRlcyBwZXIgd3JpdGUuIEZvciBtb3JlIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBwaXBlcywgc2VlIHRoZSBSZW1hcmtzIHNlY3Rpb24uIgorICAgICAgICAgICAgdmFyIG5CeXRlcyA9IE1hdGguTWluKGxlbiwgMTUgKiA0MDk2KTsgIC8vIDE2IHdvdWxkIGV4Y2VlZCB0aGUgbGltaXQKKyAgICAgICAgICAgIHdoaWxlIChuQnl0ZXMgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNsaWVudC5Xcml0ZShidWYsIG9mZiwgbkJ5dGVzKTsKKworICAgICAgICAgICAgICAgIG9mZiArPSBuQnl0ZXM7CisgICAgICAgICAgICAgICAgbGVuIC09IG5CeXRlczsKKyAgICAgICAgICAgICAgICBuQnl0ZXMgPSBNYXRoLk1pbihsZW4sIG5CeXRlcyk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQpAQCAtOTIsNCArMTA4LDQgQEAKICAgICAgICAgICAgIGNsaWVudC5EaXNwb3NlKCk7CiAgICAgICAgIH0KICAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1ROYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnQuY3MgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydC5jcwppbmRleCBjMWU4NDAwLi4zMjIxNWNmIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydC5jcworKysgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydC5jcwpAQCAtMjIsOSArMjIsOSBAQAogICovCiAKIHVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgU3lzdGVtLklPLlBpcGVzOwogdXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5QcmluY2lwYWw7CiAKIG5hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0CiB7CkBAIC02OCwyMyArNjgsMzIgQEAKICAgICAgICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB2YXIgZGlyZWN0aW9uID0gUGlwZURpcmVjdGlvbi5Jbk91dDsKLSAgICAgICAgICAgICAgICB2YXIgbWF4Y29ubiA9IDI1NDsKKyAgICAgICAgICAgICAgICB2YXIgbWF4Y29ubiA9IE5hbWVkUGlwZVNlcnZlclN0cmVhbS5NYXhBbGxvd2VkU2VydmVySW5zdGFuY2VzOwogICAgICAgICAgICAgICAgIHZhciBtb2RlID0gUGlwZVRyYW5zbWlzc2lvbk1vZGUuQnl0ZTsKICAgICAgICAgICAgICAgICB2YXIgb3B0aW9ucyA9IGFzeW5jTW9kZSA/IFBpcGVPcHRpb25zLkFzeW5jaHJvbm91cyA6IFBpcGVPcHRpb25zLk5vbmU7Ci0gICAgICAgICAgICAgICAgdmFyIGluYnVmID0gNDA5NjsKLSAgICAgICAgICAgICAgICB2YXIgb3V0YnVmID0gNDA5NjsKLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBzZWN1cml0eQorICAgICAgICAgICAgICAgIGNvbnN0IGludCBJTkJVRl9TSVpFID0gNDA5NjsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgT1VUQlVGX1NJWkUgPSA0MDk2OworCisgICAgICAgICAgICAgICAgLy8gc2VjdXJpdHkKKyAgICAgICAgICAgICAgICB2YXIgc2VjdXJpdHkgPSBuZXcgUGlwZVNlY3VyaXR5KCk7CisgICAgICAgICAgICAgICAgc2VjdXJpdHkuQWRkQWNjZXNzUnVsZSgKKyAgICAgICAgICAgICAgICAgICAgbmV3IFBpcGVBY2Nlc3NSdWxlKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNlY3VyaXR5SWRlbnRpZmllcihXZWxsS25vd25TaWRUeXBlLldvcmxkU2lkLCBudWxsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFBpcGVBY2Nlc3NSaWdodHMuUmVhZCB8IFBpcGVBY2Nlc3NSaWdodHMuV3JpdGUgfCBQaXBlQWNjZXNzUmlnaHRzLlN5bmNocm9uaXplIHwgUGlwZUFjY2Vzc1JpZ2h0cy5DcmVhdGVOZXdJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5TZWN1cml0eS5BY2Nlc3NDb250cm9sLkFjY2Vzc0NvbnRyb2xUeXBlLkFsbG93CisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICApOwogCiAgICAgICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPSBuZXcgTmFtZWRQaXBlU2VydmVyU3RyZWFtKHBpcGVBZGRyZXNzLCBkaXJlY3Rpb24sIG1heGNvbm4sIG1vZGUsIG9wdGlvbnMsIGluYnVmLCBvdXRidWYpOworICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPSBuZXcgTmFtZWRQaXBlU2VydmVyU3RyZWFtKHBpcGVBZGRyZXNzLCBkaXJlY3Rpb24sIG1heGNvbm4sIG1vZGUsIG9wdGlvbnMsIElOQlVGX1NJWkUsIE9VVEJVRl9TSVpFLCBzZWN1cml0eSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNhdGNoIChOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbikgIC8vIE1vbm8gc3RpbGwgZG9lcyBub3Qgc3VwcG9ydCBhc3luYywgZmFsbGJhY2sgdG8gc3luYwogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGFzeW5jTW9kZSkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyAmPSAoflBpcGVPcHRpb25zLkFzeW5jaHJvbm91cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPSBuZXcgTmFtZWRQaXBlU2VydmVyU3RyZWFtKHBpcGVBZGRyZXNzLCBkaXJlY3Rpb24sIG1heGNvbm4sIG1vZGUsIG9wdGlvbnMsIGluYnVmLCBvdXRidWYpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtID0gbmV3IE5hbWVkUGlwZVNlcnZlclN0cmVhbShwaXBlQWRkcmVzcywgZGlyZWN0aW9uLCBtYXhjb25uLCBtb2RlLCBvcHRpb25zLCBJTkJVRl9TSVpFLCBPVVRCVUZfU0laRSwgc2VjdXJpdHkpOwogICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmNNb2RlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgZWxzZQpAQCAtMTIxLDcgKzEzMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlT3V0ZXIgPSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZU91dGVyID0gbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkludGVycnVwdGVkLCBlLk1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlT3V0ZXIgPSBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW50ZXJydXB0ZWQsIGUuTWVzc2FnZSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBldnQuU2V0KCk7CiAgICAgICAgICAgICAgICAgICAgIH0sIG51bGwpOwpAQCAtMTQ4LDcgKzE1Nyw3IEBACiAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgQ2xvc2UoKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgZS5NZXNzYWdlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgZS5NZXNzYWdlLCBlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0yMDUsNyArMjE0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtICE9IG51bGwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVPdXRlciA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlT3V0ZXIgPSBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW50ZXJydXB0ZWQsIGUuTWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVPdXRlciA9IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5JbnRlcnJ1cHRlZCwgZS5NZXNzYWdlLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGV2dC5TZXQoKTsKICAgICAgICAgICAgICAgICAgICAgfSwgbnVsbCk7CkBAIC0yMzAsNDAgKzIzOSw1MSBAQAogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKGFzeW5jTW9kZSkKKyAgICAgICAgICAgICAgICAvLyBpZiBuZWNlc3NhcnksIHNlbmQgdGhlIGRhdGEgaW4gY2h1bmtzCisgICAgICAgICAgICAgICAgLy8gdGhlcmUncyBhIHN5c3RlbSBsaW1pdCBhcm91bmQgMHgxMDAwMCBieXRlcyB0aGF0IHdlIGhpdCBvdGhlcndpc2UKKyAgICAgICAgICAgICAgICAvLyBNU0ROOiAiUGlwZSB3cml0ZSBvcGVyYXRpb25zIGFjcm9zcyBhIG5ldHdvcmsgYXJlIGxpbWl0ZWQgdG8gNjUsNTM1IGJ5dGVzIHBlciB3cml0ZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHBpcGVzLCBzZWUgdGhlIFJlbWFya3Mgc2VjdGlvbi4iCisgICAgICAgICAgICAgICAgdmFyIG5CeXRlcyA9IE1hdGguTWluKGxlbiwgMTUgKiA0MDk2KTsgIC8vIDE2IHdvdWxkIGV4Y2VlZCB0aGUgbGltaXQKKyAgICAgICAgICAgICAgICB3aGlsZSAobkJ5dGVzID4gMCkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEV4Y2VwdGlvbiBlT3V0ZXIgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB2YXIgZXZ0ID0gbmV3IE1hbnVhbFJlc2V0RXZlbnQoZmFsc2UpOwogCi0gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5CZWdpbldyaXRlKGJ1Ziwgb2ZmLCBsZW4sIGFzeW5jUmVzdWx0ID0+CisgICAgICAgICAgICAgICAgICAgIGlmIChhc3luY01vZGUpCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9uIGVPdXRlciA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXZ0ID0gbmV3IE1hbnVhbFJlc2V0RXZlbnQoZmFsc2UpOworCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uQmVnaW5Xcml0ZShidWYsIG9mZiwgbkJ5dGVzLCBhc3luY1Jlc3VsdCA9PgogICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLkVuZFdyaXRlKGFzeW5jUmVzdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVPdXRlciA9IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5JbnRlcnJ1cHRlZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlT3V0ZXIgPSBlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZU91dGVyID0gbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkludGVycnVwdGVkLCBlLk1lc3NhZ2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZXZ0LlNldCgpOwotICAgICAgICAgICAgICAgICAgICB9LCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5FbmRXcml0ZShhc3luY1Jlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVPdXRlciA9IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5JbnRlcnJ1cHRlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVPdXRlciA9IGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVPdXRlciA9IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5JbnRlcnJ1cHRlZCwgZS5NZXNzYWdlLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZ0LlNldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSwgbnVsbCk7CiAKLSAgICAgICAgICAgICAgICAgICAgZXZ0LldhaXRPbmUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV2dC5XYWl0T25lKCk7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVPdXRlciAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZU91dGVyOyAvLyByZXRocm93IGV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVPdXRlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVPdXRlcjsgLy8gcmV0aHJvdyBleGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5Xcml0ZShidWYsIG9mZiwgbkJ5dGVzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIG9mZiArPSBuQnl0ZXM7CisgICAgICAgICAgICAgICAgICAgIGxlbiAtPSBuQnl0ZXM7CisgICAgICAgICAgICAgICAgICAgIG5CeXRlcyA9IE1hdGguTWluKGxlbiwgbkJ5dGVzKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtLldyaXRlKGJ1Ziwgb2ZmLCBsZW4pOwotICAgICAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuY3MgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNlcnZlclNvY2tldC5jcwppbmRleCA4MmEzNjdjLi5kOGVjNjJhIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNlcnZlclNvY2tldC5jcworKysgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNlcnZlclNvY2tldC5jcwpAQCAtMjksNTYgKzI5LDU2IEBACiB7CiAgICAgcHVibGljIGNsYXNzIFRTZXJ2ZXJTb2NrZXQgOiBUU2VydmVyVHJhbnNwb3J0CiAgICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBVbmRlcmx5aW5nIHNlcnZlciB3aXRoIHNvY2tldAotICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBVbmRlcmx5aW5nIHNlcnZlciB3aXRoIHNvY2tldC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJpdmF0ZSBUY3BMaXN0ZW5lciBzZXJ2ZXIgPSBudWxsOwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBQb3J0IHRvIGxpc3RlbiBvbgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUG9ydCB0byBsaXN0ZW4gb24uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHByaXZhdGUgaW50IHBvcnQgPSAwOwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaW1lb3V0IGZvciBjbGllbnQgc29ja2V0cyBmcm9tIGFjY2VwdAotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGltZW91dCBmb3IgY2xpZW50IHNvY2tldHMgZnJvbSBhY2NlcHQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHByaXZhdGUgaW50IGNsaWVudFRpbWVvdXQgPSAwOwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBXaGV0aGVyIG9yIG5vdCB0byB3cmFwIG5ldyBUU29ja2V0IGNvbm5lY3Rpb25zIGluIGJ1ZmZlcnMKLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdoZXRoZXIgb3Igbm90IHRvIHdyYXAgbmV3IFRTb2NrZXQgY29ubmVjdGlvbnMgaW4gYnVmZmVycy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJpdmF0ZSBib29sIHVzZUJ1ZmZlcmVkU29ja2V0cyA9IGZhbHNlOwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGVzIGEgc2VydmVyIHNvY2tldCBmcm9tIHVuZGVybHlpbmcgc29ja2V0IG9iamVjdAotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ3JlYXRlcyBhIHNlcnZlciBzb2NrZXQgZnJvbSB1bmRlcmx5aW5nIHNvY2tldCBvYmplY3QuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHB1YmxpYyBUU2VydmVyU29ja2V0KFRjcExpc3RlbmVyIGxpc3RlbmVyKQotICAgICAgICAgICAgOnRoaXMobGlzdGVuZXIsIDApCisgICAgICAgICAgICA6IHRoaXMobGlzdGVuZXIsIDApCiAgICAgICAgIHsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGVzIGEgc2VydmVyIHNvY2tldCBmcm9tIHVuZGVybHlpbmcgc29ja2V0IG9iamVjdAotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ3JlYXRlcyBhIHNlcnZlciBzb2NrZXQgZnJvbSB1bmRlcmx5aW5nIHNvY2tldCBvYmplY3QuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHB1YmxpYyBUU2VydmVyU29ja2V0KFRjcExpc3RlbmVyIGxpc3RlbmVyLCBpbnQgY2xpZW50VGltZW91dCkKICAgICAgICAgewogICAgICAgICAgICAgdGhpcy5zZXJ2ZXIgPSBsaXN0ZW5lcjsKICAgICAgICAgICAgIHRoaXMuY2xpZW50VGltZW91dCA9IGNsaWVudFRpbWVvdXQ7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBqdXN0IGEgcG9ydCBsaXN0ZW5pbmcgc2VydmVyIHNvY2tldAotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ3JlYXRlcyBqdXN0IGEgcG9ydCBsaXN0ZW5pbmcgc2VydmVyIHNvY2tldC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHVibGljIFRTZXJ2ZXJTb2NrZXQoaW50IHBvcnQpCiAgICAgICAgICAgICA6IHRoaXMocG9ydCwgMCkKICAgICAgICAgewogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMganVzdCBhIHBvcnQgbGlzdGVuaW5nIHNlcnZlciBzb2NrZXQKLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENyZWF0ZXMganVzdCBhIHBvcnQgbGlzdGVuaW5nIHNlcnZlciBzb2NrZXQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHB1YmxpYyBUU2VydmVyU29ja2V0KGludCBwb3J0LCBpbnQgY2xpZW50VGltZW91dCkKLSAgICAgICAgICAgIDp0aGlzKHBvcnQsIGNsaWVudFRpbWVvdXQsIGZhbHNlKQorICAgICAgICAgICAgOiB0aGlzKHBvcnQsIGNsaWVudFRpbWVvdXQsIGZhbHNlKQogICAgICAgICB7CiAgICAgICAgIH0KIApAQCAtOTAsMTMgKzkwLDEzIEBACiAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAvLyBNYWtlIHNlcnZlciBzb2NrZXQKLSAgICAgICAgICAgICAgICBzZXJ2ZXIgPSBuZXcgVGNwTGlzdGVuZXIoU3lzdGVtLk5ldC5JUEFkZHJlc3MuQW55LCB0aGlzLnBvcnQpOwotICAgICAgICAgICAgICAgIHNlcnZlci5TZXJ2ZXIuTm9EZWxheSA9IHRydWU7CisgICAgICAgICAgICAgICAgdGhpcy5zZXJ2ZXIgPSBUU29ja2V0VmVyc2lvbml6ZXIuQ3JlYXRlVGNwTGlzdGVuZXIodGhpcy5wb3J0KTsKKyAgICAgICAgICAgICAgICB0aGlzLnNlcnZlci5TZXJ2ZXIuTm9EZWxheSA9IHRydWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBzZXJ2ZXIgPSBudWxsOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDb3VsZCBub3QgY3JlYXRlIFNlcnZlclNvY2tldCBvbiBwb3J0ICIgKyBwb3J0ICsgIi4iKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSBTZXJ2ZXJTb2NrZXQgb24gcG9ydCAiICsgdGhpcy5wb3J0ICsgIi4iLCBleCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMTExLDcgKzExMSw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNhdGNoIChTb2NrZXRFeGNlcHRpb24gc3gpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ291bGQgbm90IGFjY2VwdCBvbiBsaXN0ZW5pbmcgc29ja2V0OiAiICsgc3guTWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDb3VsZCBub3QgYWNjZXB0IG9uIGxpc3RlbmluZyBzb2NrZXQ6ICIgKyBzeC5NZXNzYWdlLCBzeCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xNTMsNyArMTUzLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oZXguVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oZXguVG9TdHJpbmcoKSwgZXgpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTE2Nyw3ICsxNjcsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIldBUk5JTkc6IENvdWxkIG5vdCBjbG9zZSBzZXJ2ZXIgc29ja2V0OiAiICsgZXgpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiV0FSTklORzogQ291bGQgbm90IGNsb3NlIHNlcnZlciBzb2NrZXQ6ICIgKyBleCwgZXgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBzZXJ2ZXIgPSBudWxsOwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuY3MgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5jcwppbmRleCAwNWQ3ZDBmLi5lNjM4ODBiIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5jcworKysgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5jcwpAQCAtMzQsMTAgKzM0LDExIEBACiAgICAgICAgIHB1YmxpYyBUVHJhbnNwb3J0IEFjY2VwdCgpCiAgICAgICAgIHsKICAgICAgICAgICAgIFRUcmFuc3BvcnQgdHJhbnNwb3J0ID0gQWNjZXB0SW1wbCgpOwotICAgICAgICAgICAgaWYgKHRyYW5zcG9ydCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJhY2NlcHQoKSBtYXkgbm90IHJldHVybiBOVUxMIik7CisgICAgICAgICAgICBpZiAodHJhbnNwb3J0ID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oImFjY2VwdCgpIG1heSBub3QgcmV0dXJuIE5VTEwiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiB0cmFuc3BvcnQ7Ci0gICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNpbHZlcmxpZ2h0U29ja2V0LmNzIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTaWx2ZXJsaWdodFNvY2tldC5jcwppbmRleCBjYmQzYmFhLi40MDQ2OWFiIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNpbHZlcmxpZ2h0U29ja2V0LmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU2lsdmVybGlnaHRTb2NrZXQuY3MKQEAgLTExMiw3ICsxMTIsNyBAQAogICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5BbHJlYWR5T3BlbiwgIlNvY2tldCBhbHJlYWR5IGNvbm5lY3RlZCIpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoU3RyaW5nLklzTnVsbE9yRW1wdHkoaG9zdCkpCisgICAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoaG9zdCkpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4sICJDYW5ub3Qgb3BlbiBudWxsIGhvc3QiKTsKICAgICAgICAgICAgIH0KQEAgLTI4Miw5ICsyODIsOSBAQAogICAgICAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBCb29sZWFuIF9pc0NvbXBsZXRlZDsKICAgICAgICAgICAgIHByaXZhdGUgTWFudWFsUmVzZXRFdmVudCBfZXZ0OwogICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBBc3luY0NhbGxiYWNrIF9jYk1ldGhvZDsKLSAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgT2JqZWN0IF9zdGF0ZTsKKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgb2JqZWN0IF9zdGF0ZTsKIAotICAgICAgICAgICAgcHVibGljIEZsdXNoQXN5bmNSZXN1bHQoQXN5bmNDYWxsYmFjayBjYk1ldGhvZCwgT2JqZWN0IHN0YXRlKQorICAgICAgICAgICAgcHVibGljIEZsdXNoQXN5bmNSZXN1bHQoQXN5bmNDYWxsYmFjayBjYk1ldGhvZCwgb2JqZWN0IHN0YXRlKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIF9jYk1ldGhvZCA9IGNiTWV0aG9kOwogICAgICAgICAgICAgICAgIF9zdGF0ZSA9IHN0YXRlOwpAQCAtMzE0LDcgKzMxNCw3IEBACiAgICAgICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9pc0NvbXBsZXRlZDsgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IE9iamVjdCBfbG9ja2VyID0gbmV3IE9iamVjdCgpOworICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBvYmplY3QgX2xvY2tlciA9IG5ldyBvYmplY3QoKTsKIAogICAgICAgICAgICAgcHJpdmF0ZSBNYW51YWxSZXNldEV2ZW50IEdldEV2dEhhbmRsZSgpCiAgICAgICAgICAgICB7CkBAIC0zNjIsNyArMzYyLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgICNyZWdpb24gIiBJRGlzcG9zYWJsZSBTdXBwb3J0ICIKKyNyZWdpb24gIiBJRGlzcG9zYWJsZSBTdXBwb3J0ICIKICAgICAgICAgcHJpdmF0ZSBib29sIF9Jc0Rpc3Bvc2VkOwogCiAgICAgICAgIC8vIElEaXNwb3NhYmxlCkBAIC0zODUsNyArMzg1LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIF9Jc0Rpc3Bvc2VkID0gdHJ1ZTsKICAgICAgICAgfQotICAgICAgICAjZW5kcmVnaW9uCisjZW5kcmVnaW9uCiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNvY2tldC5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU29ja2V0LmNzCmluZGV4IGNmMWE0NDAuLmQ4ZmEzMzUgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU29ja2V0LmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU29ja2V0LmNzCkBAIC02MCw5ICs2MCw5IEBACiAKICAgICAgICAgcHJpdmF0ZSB2b2lkIEluaXRTb2NrZXQoKQogICAgICAgICB7Ci0gICAgICAgICAgICBjbGllbnQgPSBuZXcgVGNwQ2xpZW50KCk7Ci0gICAgICAgICAgICBjbGllbnQuUmVjZWl2ZVRpbWVvdXQgPSBjbGllbnQuU2VuZFRpbWVvdXQgPSB0aW1lb3V0OwotICAgICAgICAgICAgY2xpZW50LkNsaWVudC5Ob0RlbGF5ID0gdHJ1ZTsKKyAgICAgICAgICAgIHRoaXMuY2xpZW50ID0gVFNvY2tldFZlcnNpb25pemVyLkNyZWF0ZVRjcENsaWVudCgpOworICAgICAgICAgICAgdGhpcy5jbGllbnQuUmVjZWl2ZVRpbWVvdXQgPSBjbGllbnQuU2VuZFRpbWVvdXQgPSB0aW1lb3V0OworICAgICAgICAgICAgdGhpcy5jbGllbnQuQ2xpZW50Lk5vRGVsYXkgPSB0cnVlOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIGludCBUaW1lb3V0CkBAIC0xMTcsNyArMTE3LDcgQEAKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuQWxyZWFkeU9wZW4sICJTb2NrZXQgYWxyZWFkeSBjb25uZWN0ZWQiKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKFN0cmluZy5Jc051bGxPckVtcHR5KGhvc3QpKQorICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KGhvc3QpKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAiQ2Fubm90IG9wZW4gbnVsbCBob3N0Iik7CiAgICAgICAgICAgICB9CkBAIC0xMzIsNyArMTMyLDcgQEAKICAgICAgICAgICAgICAgICBJbml0U29ja2V0KCk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmKCB0aW1lb3V0ID09IDApICAgICAgICAgICAgLy8gbm8gdGltZW91dCAtPiBpbmZpbml0ZQorICAgICAgICAgICAgaWYgKHRpbWVvdXQgPT0gMCkgICAgICAgICAgICAvLyBubyB0aW1lb3V0IC0+IGluZmluaXRlCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgY2xpZW50LkNvbm5lY3QoaG9zdCwgcG9ydCk7CiAgICAgICAgICAgICB9CkBAIC0xNDUsNyArMTQ1LDcgQEAKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGxvY2sgKGhscC5NdXRleCkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGhscC5DYWxsYmFja0RvbmUpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGxwLkNhbGxiYWNrRG9uZSkKICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3luY3Jlcy5Bc3luY1dhaXRIYW5kbGUuQ2xvc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQuQ2xvc2UoKTsKQEAgLTE3NCw3ICsxNzQsNyBAQAogCiAgICAgICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggaGxwLkNsaWVudC5DbGllbnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhscC5DbGllbnQuQ2xpZW50ICE9IG51bGwpCiAgICAgICAgICAgICAgICAgICAgICAgICBobHAuQ2xpZW50LkVuZENvbm5lY3QoYXN5bmNyZXMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKQpAQCAtMTg0LDE0ICsxODQsMTggQEAKIAogICAgICAgICAgICAgICAgIGlmIChobHAuRG9DbGVhbnVwKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jcmVzLkFzeW5jV2FpdEhhbmRsZS5DbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24pIHt9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikgeyB9CiAKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChobHAuQ2xpZW50IGlzIElEaXNwb3NhYmxlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSURpc3Bvc2FibGUpaGxwLkNsaWVudCkuRGlzcG9zZSgpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24pIHt9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikgeyB9CiAgICAgICAgICAgICAgICAgICAgIGhscC5DbGllbnQgPSBudWxsOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTIxOSwyMyArMjIzLDIzIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICNyZWdpb24gIiBJRGlzcG9zYWJsZSBTdXBwb3J0ICIKLSAgICBwcml2YXRlIGJvb2wgX0lzRGlzcG9zZWQ7CisgICAgICAgICNyZWdpb24gIiBJRGlzcG9zYWJsZSBTdXBwb3J0ICIKKyAgICAgICAgcHJpdmF0ZSBib29sIF9Jc0Rpc3Bvc2VkOwogCi0gICAgLy8gSURpc3Bvc2FibGUKLSAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQotICAgIHsKLSAgICAgIGlmICghX0lzRGlzcG9zZWQpCi0gICAgICB7Ci0gICAgICAgIGlmIChkaXNwb3NpbmcpCisgICAgICAgIC8vIElEaXNwb3NhYmxlCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIERpc3Bvc2UoYm9vbCBkaXNwb3NpbmcpCiAgICAgICAgIHsKLSAgICAgICAgICBpZiAoY2xpZW50ICE9IG51bGwpCi0gICAgICAgICAgICAoKElEaXNwb3NhYmxlKWNsaWVudCkuRGlzcG9zZSgpOwotICAgICAgICAgIGJhc2UuRGlzcG9zZShkaXNwb3NpbmcpOworICAgICAgICAgICAgaWYgKCFfSXNEaXNwb3NlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlzcG9zaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgKChJRGlzcG9zYWJsZSljbGllbnQpLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgYmFzZS5EaXNwb3NlKGRpc3Bvc2luZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX0lzRGlzcG9zZWQgPSB0cnVlOwogICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBfSXNEaXNwb3NlZCA9IHRydWU7CisgICAgICAgICNlbmRyZWdpb24KICAgICB9Ci0gICAgI2VuZHJlZ2lvbgotICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNvY2tldFZlcnNpb25pemVyLmNzIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTb2NrZXRWZXJzaW9uaXplci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjRjMGU0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTb2NrZXRWZXJzaW9uaXplci5jcwpAQCAtMCwwICsxLDc4IEBACivvu78vKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5OZXQuU29ja2V0czsKK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlRleHQ7CisjaWYgTkVUNDUKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CisjZW5kaWYKKworbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnQKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFByb3BlcnR5SW5mbyBmb3IgdGhlIER1YWxNb2RlIHByb3BlcnR5IG9mIHRoZSBTeXN0ZW0uTmV0LlNvY2tldHMuU29ja2V0IGNsYXNzLiBVc2VkIHRvIGRldGVybWluZSBpZiB0aGUgc29ja2V0cyBhcmUgY2FwYWJsZSBvZgorICAgIC8vLyBhdXRvbWF0aWMgSVB2NCBhbmQgSVB2NiBoYW5kbGluZy4gSWYgRHVhbE1vZGUgaXMgcHJlc2VudCB0aGUgc29ja2V0cyBhdXRvbWF0aWNhbGx5IGhhbmRsZSBJUHY0IGFuZCBJUHY2IGNvbm5lY3Rpb25zLgorICAgIC8vLyBJZiB0aGUgRHVhbE1vZGUgaXMgbm90IGF2YWlsYWJsZSB0aGUgc3lzdGVtIGNvbmZpZ3VyYXRpb24gZGV0ZXJtaW5lcyB3aGV0aGVyIElQdjQgb3IgSVB2NiBpcyB1c2VkLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgaW50ZXJuYWwgc3RhdGljIGNsYXNzIFRTb2NrZXRWZXJzaW9uaXplcgorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ3JlYXRlcyBhIFRjcENsaWVudCBhY2NvcmRpbmcgdG8gdGhlIGNhcGFiaWxpdGl0ZXMgb2YgdGhlIHVzZWQgZnJhbWV3b3JrCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIGludGVybmFsIHN0YXRpYyBUY3BDbGllbnQgQ3JlYXRlVGNwQ2xpZW50KCkKKyAgICAgICAgeworICAgICAgICAgICAgVGNwQ2xpZW50IGNsaWVudCA9IG51bGw7CisKKyNpZiBORVQ0NQorICAgICAgICAgICAgY2xpZW50ID0gbmV3IFRjcENsaWVudChBZGRyZXNzRmFtaWx5LkludGVyTmV0d29ya1Y2KTsKKyAgICAgICAgICAgIGNsaWVudC5DbGllbnQuRHVhbE1vZGUgPSB0cnVlOworI2Vsc2UKKyAgICAgICAgICAgIGNsaWVudCA9IG5ldyBUY3BDbGllbnQoQWRkcmVzc0ZhbWlseS5JbnRlck5ldHdvcmspOworI2VuZGlmCisKKyAgICAgICAgICAgIHJldHVybiBjbGllbnQ7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDcmVhdGVzIGEgVGNwTGlzdGVuZXIgYWNjb3JkaW5nIHRvIHRoZSBjYXBhYmlsaXRpdGVzIG9mIHRoZSB1c2VkIGZyYW1ld29yay4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIFRjcExpc3RlbmVyIENyZWF0ZVRjcExpc3RlbmVyKEludDMyIHBvcnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRjcExpc3RlbmVyIGxpc3RlbmVyID0gbnVsbDsKKworI2lmIE5FVDQ1CisgICAgICAgICAgICBsaXN0ZW5lciA9IG5ldyBUY3BMaXN0ZW5lcihTeXN0ZW0uTmV0LklQQWRkcmVzcy5JUHY2QW55LCBwb3J0KTsKKyAgICAgICAgICAgIGxpc3RlbmVyLlNlcnZlci5EdWFsTW9kZSA9IHRydWU7CisjZWxzZQorCisgICAgICAgICAgICBsaXN0ZW5lciA9IG5ldyBUY3BMaXN0ZW5lcihTeXN0ZW0uTmV0LklQQWRkcmVzcy5BbnksIHBvcnQpOworI2VuZGlmCisKKyAgICAgICAgICAgIHJldHVybiBsaXN0ZW5lcjsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU3RyZWFtVHJhbnNwb3J0LmNzIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTdHJlYW1UcmFuc3BvcnQuY3MKaW5kZXggNDY4NzQzYy4uMzA0NTk5ZiAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTdHJlYW1UcmFuc3BvcnQuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTdHJlYW1UcmFuc3BvcnQuY3MKQEAgLTEwNSwyNCArMTA1LDI0IEBACiAgICAgICAgIH0KIAogCi0gICAgI3JlZ2lvbiAiIElEaXNwb3NhYmxlIFN1cHBvcnQgIgotICAgIHByaXZhdGUgYm9vbCBfSXNEaXNwb3NlZDsKKyAgICAgICAgI3JlZ2lvbiAiIElEaXNwb3NhYmxlIFN1cHBvcnQgIgorICAgICAgICBwcml2YXRlIGJvb2wgX0lzRGlzcG9zZWQ7CiAKLSAgICAvLyBJRGlzcG9zYWJsZQotICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIERpc3Bvc2UoYm9vbCBkaXNwb3NpbmcpCi0gICAgewotICAgICAgaWYgKCFfSXNEaXNwb3NlZCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGRpc3Bvc2luZykKKyAgICAgICAgLy8gSURpc3Bvc2FibGUKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKICAgICAgICAgewotICAgICAgICAgIGlmIChJbnB1dFN0cmVhbSAhPSBudWxsKQotICAgICAgICAgICAgSW5wdXRTdHJlYW0uRGlzcG9zZSgpOwotICAgICAgICAgIGlmIChPdXRwdXRTdHJlYW0gIT0gbnVsbCkKLSAgICAgICAgICAgIE91dHB1dFN0cmVhbS5EaXNwb3NlKCk7CisgICAgICAgICAgICBpZiAoIV9Jc0Rpc3Bvc2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkaXNwb3NpbmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoSW5wdXRTdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKE91dHB1dFN0cmVhbSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfSXNEaXNwb3NlZCA9IHRydWU7CiAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIF9Jc0Rpc3Bvc2VkID0gdHJ1ZTsKKyAgICAgICAgI2VuZHJlZ2lvbgogICAgIH0KLSAgICAjZW5kcmVnaW9uCi0gIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVExTU2VydmVyU29ja2V0LmNzIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUTFNTZXJ2ZXJTb2NrZXQuY3MKaW5kZXggNjMxYTU5My4uNzE2YTk3YyAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUTFNTZXJ2ZXJTb2NrZXQuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUTFNTZXJ2ZXJTb2NrZXQuY3MKQEAgLTIwLDYgKzIwLDcgQEAKIHVzaW5nIFN5c3RlbTsKIHVzaW5nIFN5c3RlbS5OZXQuU2VjdXJpdHk7CiB1c2luZyBTeXN0ZW0uTmV0LlNvY2tldHM7Cit1c2luZyBTeXN0ZW0uU2VjdXJpdHkuQXV0aGVudGljYXRpb247CiB1c2luZyBTeXN0ZW0uU2VjdXJpdHkuQ3J5cHRvZ3JhcGh5Llg1MDlDZXJ0aWZpY2F0ZXM7CiAKIG5hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0CkBAIC00Miw3ICs0Myw3IEBACiAgICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAgLy8vIFRpbWVvdXQgZm9yIHRoZSBjcmVhdGVkIHNlcnZlciBzb2NrZXQKICAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHJpdmF0ZSBpbnQgY2xpZW50VGltZW91dCA9IDA7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IGNsaWVudFRpbWVvdXQ7CiAKICAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgICAvLy8gV2hldGhlciBvciBub3QgdG8gd3JhcCBuZXcgVFNvY2tldCBjb25uZWN0aW9ucyBpbiBidWZmZXJzCkBAIC02NSwxMiArNjYsMTcgQEAKICAgICAgICAgcHJpdmF0ZSBMb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrOwogCiAgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBTc2xQcm90b2NvbHMgdmFsdWUgdGhhdCByZXByZXNlbnRzIHRoZSBwcm90b2NvbCB1c2VkIGZvciBhdXRoZW50aWNhdGlvbi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBTc2xQcm90b2NvbHMgc3NsUHJvdG9jb2xzOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAgLy8vIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSA8c2VlIGNyZWY9IlRUTFNTZXJ2ZXJTb2NrZXQiIC8+IGNsYXNzLgogICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InBvcnQiPlRoZSBwb3J0IHdoZXJlIHRoZSBzZXJ2ZXIgcnVucy48L3BhcmFtPgogICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNlcnRpZmljYXRlIj5UaGUgY2VydGlmaWNhdGUgb2JqZWN0LjwvcGFyYW0+CiAgICAgICAgIHB1YmxpYyBUVExTU2VydmVyU29ja2V0KGludCBwb3J0LCBYNTA5Q2VydGlmaWNhdGUyIGNlcnRpZmljYXRlKQotICAgICAgICAgICAgOiB0aGlzKHBvcnQsICAwLCBjZXJ0aWZpY2F0ZSkKKyAgICAgICAgICAgIDogdGhpcyhwb3J0LCAwLCBjZXJ0aWZpY2F0ZSkKICAgICAgICAgewogICAgICAgICB9CiAKQEAgLTk0LDEzICsxMDAsMTYgQEAKICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjZXJ0aWZpY2F0ZSI+VGhlIGNlcnRpZmljYXRlIG9iamVjdC48L3BhcmFtPgogICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNsaWVudENlcnRWYWxpZGF0b3IiPlRoZSBjZXJ0aWZpY2F0ZSB2YWxpZGF0b3IuPC9wYXJhbT4KICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2siPlRoZSBjYWxsYmFjayB0byBzZWxlY3Qgd2hpY2ggY2VydGlmaWNhdGUgdG8gdXNlLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic3NsUHJvdG9jb2xzIj5UaGUgU3NsUHJvdG9jb2xzIHZhbHVlIHRoYXQgcmVwcmVzZW50cyB0aGUgcHJvdG9jb2wgdXNlZCBmb3IgYXV0aGVudGljYXRpb24uPC9wYXJhbT4KICAgICAgICAgcHVibGljIFRUTFNTZXJ2ZXJTb2NrZXQoCiAgICAgICAgICAgICBpbnQgcG9ydCwKICAgICAgICAgICAgIGludCBjbGllbnRUaW1lb3V0LAogICAgICAgICAgICAgYm9vbCB1c2VCdWZmZXJlZFNvY2tldHMsCiAgICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGUyIGNlcnRpZmljYXRlLAogICAgICAgICAgICAgUmVtb3RlQ2VydGlmaWNhdGVWYWxpZGF0aW9uQ2FsbGJhY2sgY2xpZW50Q2VydFZhbGlkYXRvciA9IG51bGwsCi0gICAgICAgICAgICBMb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrID0gbnVsbCkKKyAgICAgICAgICAgIExvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgPSBudWxsLAorICAgICAgICAgICAgLy8gVE9ETzogRW5hYmxlIFRsczExIGFuZCBUbHMxMiAoVExTIDEuMSBhbmQgMS4yKSBieSBkZWZhdWx0IG9uY2Ugd2Ugc3RhcnQgdXNpbmcgLk5FVCA0LjUrLgorICAgICAgICAgICAgU3NsUHJvdG9jb2xzIHNzbFByb3RvY29scyA9IFNzbFByb3RvY29scy5UbHMpCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmICghY2VydGlmaWNhdGUuSGFzUHJpdmF0ZUtleSkKICAgICAgICAgICAgIHsKQEAgLTEwOCwyMCArMTE3LDIyIEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHRoaXMucG9ydCA9IHBvcnQ7CisgICAgICAgICAgICB0aGlzLmNsaWVudFRpbWVvdXQgPSBjbGllbnRUaW1lb3V0OwogICAgICAgICAgICAgdGhpcy5zZXJ2ZXJDZXJ0aWZpY2F0ZSA9IGNlcnRpZmljYXRlOwogICAgICAgICAgICAgdGhpcy51c2VCdWZmZXJlZFNvY2tldHMgPSB1c2VCdWZmZXJlZFNvY2tldHM7CiAgICAgICAgICAgICB0aGlzLmNsaWVudENlcnRWYWxpZGF0b3IgPSBjbGllbnRDZXJ0VmFsaWRhdG9yOwogICAgICAgICAgICAgdGhpcy5sb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgPSBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2s7CisgICAgICAgICAgICB0aGlzLnNzbFByb3RvY29scyA9IHNzbFByb3RvY29sczsKICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBzZXJ2ZXIgc29ja2V0Ci0gICAgICAgICAgICAgICAgc2VydmVyID0gbmV3IFRjcExpc3RlbmVyKFN5c3RlbS5OZXQuSVBBZGRyZXNzLkFueSwgdGhpcy5wb3J0KTsKLSAgICAgICAgICAgICAgICBzZXJ2ZXIuU2VydmVyLk5vRGVsYXkgPSB0cnVlOworICAgICAgICAgICAgICAgIHRoaXMuc2VydmVyID0gVFNvY2tldFZlcnNpb25pemVyLkNyZWF0ZVRjcExpc3RlbmVyKHRoaXMucG9ydCk7CisgICAgICAgICAgICAgICAgdGhpcy5zZXJ2ZXIuU2VydmVyLk5vRGVsYXkgPSB0cnVlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikKKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgc2VydmVyID0gbnVsbDsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSBTZXJ2ZXJTb2NrZXQgb24gcG9ydCAiICsgcG9ydCArICIuIik7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNvdWxkIG5vdCBjcmVhdGUgU2VydmVyU29ja2V0IG9uIHBvcnQgIiArIHRoaXMucG9ydCArICIuIiwgZXgpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTEzOSw3ICsxNTAsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIHN4KQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNvdWxkIG5vdCBhY2NlcHQgb24gbGlzdGVuaW5nIHNvY2tldDogIiArIHN4Lk1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ291bGQgbm90IGFjY2VwdCBvbiBsaXN0ZW5pbmcgc29ja2V0OiAiICsgc3guTWVzc2FnZSwgc3gpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTY4LDggKzE3OSw4IEBACiAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VydmVyQ2VydGlmaWNhdGUsCiAgICAgICAgICAgICAgICAgICAgIHRydWUsCiAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xpZW50Q2VydFZhbGlkYXRvciwKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sKLSAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5zc2xQcm90b2NvbHMpOwogCiAgICAgICAgICAgICAgICAgc29ja2V0LnNldHVwVExTKCk7CiAKQEAgLTE4Niw3ICsxOTcsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihleC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihleC5Ub1N0cmluZygpLCBleCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMjAzLDcgKzIxNCw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiV0FSTklORzogQ291bGQgbm90IGNsb3NlIHNlcnZlciBzb2NrZXQ6ICIgKyBleCk7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJXQVJOSU5HOiBDb3VsZCBub3QgY2xvc2Ugc2VydmVyIHNvY2tldDogIiArIGV4LCBleCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHRoaXMuc2VydmVyID0gbnVsbDsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVExTU29ja2V0LmNzIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUTFNTb2NrZXQuY3MKaW5kZXggNTY1MjU1Ni4uZmQwMTljMyAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUTFNTb2NrZXQuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUTFNTb2NrZXQuY3MKQEAgLTMzLDQzICszMyw0MyBAQAogICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgIC8vLyBJbnRlcm5hbCBUQ1AgQ2xpZW50CiAgICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHByaXZhdGUgVGNwQ2xpZW50IGNsaWVudCA9IG51bGw7CisgICAgICAgIHByaXZhdGUgVGNwQ2xpZW50IGNsaWVudDsKIAogICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgIC8vLyBUaGUgaG9zdAogICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwcml2YXRlIHN0cmluZyBob3N0ID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgaG9zdDsKIAogICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgIC8vLyBUaGUgcG9ydAogICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwcml2YXRlIGludCBwb3J0ID0gMDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgcG9ydDsKIAogICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgIC8vLyBUaGUgdGltZW91dCBmb3IgdGhlIGNvbm5lY3Rpb24KICAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHJpdmF0ZSBpbnQgdGltZW91dCA9IDA7CisgICAgICAgIHByaXZhdGUgaW50IHRpbWVvdXQ7CiAKICAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgICAvLy8gSW50ZXJuYWwgU1NMIFN0cmVhbSBmb3IgSU8KICAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHJpdmF0ZSBTc2xTdHJlYW0gc2VjdXJlU3RyZWFtID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBTc2xTdHJlYW0gc2VjdXJlU3RyZWFtOwogCiAgICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAgLy8vIERlZmluZXMgd2hldGVyIG9yIG5vdCB0aGlzIHNvY2tldCBpcyBhIHNlcnZlciBzb2NrZXQ8YnIvPgogICAgICAgICAvLy8gVGhpcyBpcyB1c2VkIGZvciB0aGUgVExTLWF1dGhlbnRpY2F0aW9uCiAgICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHByaXZhdGUgYm9vbCBpc1NlcnZlciA9IGZhbHNlOworICAgICAgICBwcml2YXRlIGJvb2wgaXNTZXJ2ZXI7CiAKICAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgICAvLy8gVGhlIGNlcnRpZmljYXRlCiAgICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHByaXZhdGUgWDUwOUNlcnRpZmljYXRlIGNlcnRpZmljYXRlID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBYNTA5Q2VydGlmaWNhdGUgY2VydGlmaWNhdGU7CiAKICAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgICAvLy8gVXNlciBkZWZpbmVkIGNlcnRpZmljYXRlIHZhbGlkYXRvci4KICAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHJpdmF0ZSBSZW1vdGVDZXJ0aWZpY2F0ZVZhbGlkYXRpb25DYWxsYmFjayBjZXJ0VmFsaWRhdG9yID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBSZW1vdGVDZXJ0aWZpY2F0ZVZhbGlkYXRpb25DYWxsYmFjayBjZXJ0VmFsaWRhdG9yOwogCiAgICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAgLy8vIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgd2hpY2ggY2VydGlmaWNhdGUgdG8gdXNlLgpAQCAtNzcsNiArNzcsMTEgQEAKICAgICAgICAgcHJpdmF0ZSBMb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrOwogCiAgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBTc2xQcm90b2NvbHMgdmFsdWUgdGhhdCByZXByZXNlbnRzIHRoZSBwcm90b2NvbCB1c2VkIGZvciBhdXRoZW50aWNhdGlvbi5TU0wgcHJvdG9jb2xzIHRvIGJlIHVzZWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgU3NsUHJvdG9jb2xzIHNzbFByb3RvY29sczsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgIC8vLyBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgPHNlZSBjcmVmPSJUVExTU29ja2V0Ii8+IGNsYXNzLgogICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNsaWVudCI+QW4gYWxyZWFkeSBjcmVhdGVkIFRDUC1jbGllbnQ8L3BhcmFtPgpAQCAtODQsMTggKzg5LDI2IEBACiAgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaXNTZXJ2ZXIiPmlmIHNldCB0byA8Yz50cnVlPC9jPiBbaXMgc2VydmVyXS48L3BhcmFtPgogICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNlcnRWYWxpZGF0b3IiPlVzZXIgZGVmaW5lZCBjZXJ0IHZhbGlkYXRvci48L3BhcmFtPgogICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayI+VGhlIGNhbGxiYWNrIHRvIHNlbGVjdCB3aGljaCBjZXJ0aWZpY2F0ZSB0byB1c2UuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzc2xQcm90b2NvbHMiPlRoZSBTc2xQcm90b2NvbHMgdmFsdWUgdGhhdCByZXByZXNlbnRzIHRoZSBwcm90b2NvbCB1c2VkIGZvciBhdXRoZW50aWNhdGlvbi48L3BhcmFtPgogICAgICAgICBwdWJsaWMgVFRMU1NvY2tldCgKICAgICAgICAgICAgIFRjcENsaWVudCBjbGllbnQsCiAgICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGUgY2VydGlmaWNhdGUsCiAgICAgICAgICAgICBib29sIGlzU2VydmVyID0gZmFsc2UsCiAgICAgICAgICAgICBSZW1vdGVDZXJ0aWZpY2F0ZVZhbGlkYXRpb25DYWxsYmFjayBjZXJ0VmFsaWRhdG9yID0gbnVsbCwKLSAgICAgICAgICAgIExvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgPSBudWxsKQorICAgICAgICAgICAgTG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrIGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayA9IG51bGwsCisgICAgICAgICAgICAvLyBUT0RPOiBFbmFibGUgVGxzMTEgYW5kIFRsczEyIChUTFMgMS4xIGFuZCAxLjIpIGJ5IGRlZmF1bHQgb25jZSB3ZSBzdGFydCB1c2luZyAuTkVUIDQuNSsuCisgICAgICAgICAgICBTc2xQcm90b2NvbHMgc3NsUHJvdG9jb2xzID0gU3NsUHJvdG9jb2xzLlRscykKICAgICAgICAgewogICAgICAgICAgICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7CiAgICAgICAgICAgICB0aGlzLmNlcnRpZmljYXRlID0gY2VydGlmaWNhdGU7CiAgICAgICAgICAgICB0aGlzLmNlcnRWYWxpZGF0b3IgPSBjZXJ0VmFsaWRhdG9yOwogICAgICAgICAgICAgdGhpcy5sb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgPSBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2s7CisgICAgICAgICAgICB0aGlzLnNzbFByb3RvY29scyA9IHNzbFByb3RvY29sczsKICAgICAgICAgICAgIHRoaXMuaXNTZXJ2ZXIgPSBpc1NlcnZlcjsKKyAgICAgICAgICAgIGlmIChpc1NlcnZlciAmJiBjZXJ0aWZpY2F0ZSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiVFRMU1NvY2tldCBuZWVkcyBjZXJ0aWZpY2F0ZSB0byBiZSB1c2VkIGZvciBzZXJ2ZXIiLCAiY2VydGlmaWNhdGUiKTsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKElzT3BlbikKICAgICAgICAgICAgIHsKQEAgLTExMiwxMyArMTI1LDE1IEBACiAgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY2VydGlmaWNhdGVQYXRoIj5UaGUgY2VydGlmaWNhdGUgcGF0aC48L3BhcmFtPgogICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNlcnRWYWxpZGF0b3IiPlVzZXIgZGVmaW5lZCBjZXJ0IHZhbGlkYXRvci48L3BhcmFtPgogICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayI+VGhlIGNhbGxiYWNrIHRvIHNlbGVjdCB3aGljaCBjZXJ0aWZpY2F0ZSB0byB1c2UuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzc2xQcm90b2NvbHMiPlRoZSBTc2xQcm90b2NvbHMgdmFsdWUgdGhhdCByZXByZXNlbnRzIHRoZSBwcm90b2NvbCB1c2VkIGZvciBhdXRoZW50aWNhdGlvbi48L3BhcmFtPgogICAgICAgICBwdWJsaWMgVFRMU1NvY2tldCgKICAgICAgICAgICAgIHN0cmluZyBob3N0LAogICAgICAgICAgICAgaW50IHBvcnQsCiAgICAgICAgICAgICBzdHJpbmcgY2VydGlmaWNhdGVQYXRoLAogICAgICAgICAgICAgUmVtb3RlQ2VydGlmaWNhdGVWYWxpZGF0aW9uQ2FsbGJhY2sgY2VydFZhbGlkYXRvciA9IG51bGwsCi0gICAgICAgICAgICBMb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrID0gbnVsbCkKLSAgICAgICAgICAgIDogdGhpcyhob3N0LCBwb3J0LCAwLCBYNTA5Q2VydGlmaWNhdGUuQ3JlYXRlRnJvbUNlcnRGaWxlKGNlcnRpZmljYXRlUGF0aCksIGNlcnRWYWxpZGF0b3IsIGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjaykKKyAgICAgICAgICAgIExvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgPSBudWxsLAorICAgICAgICAgICAgU3NsUHJvdG9jb2xzIHNzbFByb3RvY29scyA9IFNzbFByb3RvY29scy5UbHMpCisgICAgICAgICAgICA6IHRoaXMoaG9zdCwgcG9ydCwgMCwgWDUwOUNlcnRpZmljYXRlLkNyZWF0ZUZyb21DZXJ0RmlsZShjZXJ0aWZpY2F0ZVBhdGgpLCBjZXJ0VmFsaWRhdG9yLCBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2ssIHNzbFByb3RvY29scykKICAgICAgICAgewogICAgICAgICB9CiAKQEAgLTEzMCwxMyArMTQ1LDE1IEBACiAgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY2VydGlmaWNhdGUiPlRoZSBjZXJ0aWZpY2F0ZS48L3BhcmFtPgogICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNlcnRWYWxpZGF0b3IiPlVzZXIgZGVmaW5lZCBjZXJ0IHZhbGlkYXRvci48L3BhcmFtPgogICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayI+VGhlIGNhbGxiYWNrIHRvIHNlbGVjdCB3aGljaCBjZXJ0aWZpY2F0ZSB0byB1c2UuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzc2xQcm90b2NvbHMiPlRoZSBTc2xQcm90b2NvbHMgdmFsdWUgdGhhdCByZXByZXNlbnRzIHRoZSBwcm90b2NvbCB1c2VkIGZvciBhdXRoZW50aWNhdGlvbi48L3BhcmFtPgogICAgICAgICBwdWJsaWMgVFRMU1NvY2tldCgKICAgICAgICAgICAgIHN0cmluZyBob3N0LAogICAgICAgICAgICAgaW50IHBvcnQsCi0gICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGUgY2VydGlmaWNhdGUsCisgICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGUgY2VydGlmaWNhdGUgPSBudWxsLAogICAgICAgICAgICAgUmVtb3RlQ2VydGlmaWNhdGVWYWxpZGF0aW9uQ2FsbGJhY2sgY2VydFZhbGlkYXRvciA9IG51bGwsCi0gICAgICAgICAgICBMb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrID0gbnVsbCkKLSAgICAgICAgICAgIDogdGhpcyhob3N0LCBwb3J0LCAwLCBjZXJ0aWZpY2F0ZSwgY2VydFZhbGlkYXRvciwgbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrKQorICAgICAgICAgICAgTG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrIGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayA9IG51bGwsCisgICAgICAgICAgICBTc2xQcm90b2NvbHMgc3NsUHJvdG9jb2xzID0gU3NsUHJvdG9jb2xzLlRscykKKyAgICAgICAgICAgIDogdGhpcyhob3N0LCBwb3J0LCAwLCBjZXJ0aWZpY2F0ZSwgY2VydFZhbGlkYXRvciwgbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrLCBzc2xQcm90b2NvbHMpCiAgICAgICAgIHsKICAgICAgICAgfQogCkBAIC0xNDksMTMgKzE2NiwxNSBAQAogICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNlcnRpZmljYXRlIj5UaGUgY2VydGlmaWNhdGUuPC9wYXJhbT4KICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjZXJ0VmFsaWRhdG9yIj5Vc2VyIGRlZmluZWQgY2VydCB2YWxpZGF0b3IuPC9wYXJhbT4KICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2siPlRoZSBjYWxsYmFjayB0byBzZWxlY3Qgd2hpY2ggY2VydGlmaWNhdGUgdG8gdXNlLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic3NsUHJvdG9jb2xzIj5UaGUgU3NsUHJvdG9jb2xzIHZhbHVlIHRoYXQgcmVwcmVzZW50cyB0aGUgcHJvdG9jb2wgdXNlZCBmb3IgYXV0aGVudGljYXRpb24uPC9wYXJhbT4KICAgICAgICAgcHVibGljIFRUTFNTb2NrZXQoCiAgICAgICAgICAgICBzdHJpbmcgaG9zdCwKICAgICAgICAgICAgIGludCBwb3J0LAogICAgICAgICAgICAgaW50IHRpbWVvdXQsCiAgICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGUgY2VydGlmaWNhdGUsCiAgICAgICAgICAgICBSZW1vdGVDZXJ0aWZpY2F0ZVZhbGlkYXRpb25DYWxsYmFjayBjZXJ0VmFsaWRhdG9yID0gbnVsbCwKLSAgICAgICAgICAgIExvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgPSBudWxsKQorICAgICAgICAgICAgTG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrIGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayA9IG51bGwsCisgICAgICAgICAgICBTc2xQcm90b2NvbHMgc3NsUHJvdG9jb2xzID0gU3NsUHJvdG9jb2xzLlRscykKICAgICAgICAgewogICAgICAgICAgICAgdGhpcy5ob3N0ID0gaG9zdDsKICAgICAgICAgICAgIHRoaXMucG9ydCA9IHBvcnQ7CkBAIC0xNjMsNiArMTgyLDcgQEAKICAgICAgICAgICAgIHRoaXMuY2VydGlmaWNhdGUgPSBjZXJ0aWZpY2F0ZTsKICAgICAgICAgICAgIHRoaXMuY2VydFZhbGlkYXRvciA9IGNlcnRWYWxpZGF0b3I7CiAgICAgICAgICAgICB0aGlzLmxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayA9IGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjazsKKyAgICAgICAgICAgIHRoaXMuc3NsUHJvdG9jb2xzID0gc3NsUHJvdG9jb2xzOwogCiAgICAgICAgICAgICBJbml0U29ja2V0KCk7CiAgICAgICAgIH0KQEAgLTE3Miw3ICsxOTIsNyBAQAogICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwcml2YXRlIHZvaWQgSW5pdFNvY2tldCgpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuY2xpZW50ID0gbmV3IFRjcENsaWVudCgpOworICAgICAgICAgICAgY2xpZW50ID0gVFNvY2tldFZlcnNpb25pemVyLkNyZWF0ZVRjcENsaWVudCgpOwogICAgICAgICAgICAgY2xpZW50LlJlY2VpdmVUaW1lb3V0ID0gY2xpZW50LlNlbmRUaW1lb3V0ID0gdGltZW91dDsKICAgICAgICAgICAgIGNsaWVudC5DbGllbnQuTm9EZWxheSA9IHRydWU7CiAgICAgICAgIH0KQEAgLTI0Myw3ICsyNjMsNyBAQAogICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InNlbmRlciI+VGhlIHNlbmRlci1vYmplY3QuPC9wYXJhbT4KICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjZXJ0aWZpY2F0ZSI+VGhlIHVzZWQgY2VydGlmaWNhdGUuPC9wYXJhbT4KICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjaGFpbiI+VGhlIGNlcnRpZmljYXRlIGNoYWluLjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic3NsUG9saWN5RXJyb3JzIj5BbiBlbnVtLCB3aGljaCBsaXN0cyBhbGwgdGhlIGVycm9ycyBmcm9tIHRoZSAuTkVUIGNlcnRpZmljYXRlIGNoZWNrLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic3NsVmFsaWRhdGlvbkVycm9ycyI+QW4gZW51bSwgd2hpY2ggbGlzdHMgYWxsIHRoZSBlcnJvcnMgZnJvbSB0aGUgLk5FVCBjZXJ0aWZpY2F0ZSBjaGVjay48L3BhcmFtPgogICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgogICAgICAgICBwcml2YXRlIGJvb2wgRGVmYXVsdENlcnRpZmljYXRlVmFsaWRhdG9yKG9iamVjdCBzZW5kZXIsIFg1MDlDZXJ0aWZpY2F0ZSBjZXJ0aWZpY2F0ZSwgWDUwOUNoYWluIGNoYWluLCBTc2xQb2xpY3lFcnJvcnMgc3NsVmFsaWRhdGlvbkVycm9ycykKICAgICAgICAgewpAQCAtMjYwLDcgKzI4MCw3IEBACiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkFscmVhZHlPcGVuLCAiU29ja2V0IGFscmVhZHkgY29ubmVjdGVkIik7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChTdHJpbmcuSXNOdWxsT3JFbXB0eShob3N0KSkKKyAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShob3N0KSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIkNhbm5vdCBvcGVuIG51bGwgaG9zdCIpOwogICAgICAgICAgICAgfQpAQCAtMjg2LDggKzMwNiw4IEBACiAgICAgICAgIHB1YmxpYyB2b2lkIHNldHVwVExTKCkKICAgICAgICAgewogICAgICAgICAgICAgUmVtb3RlQ2VydGlmaWNhdGVWYWxpZGF0aW9uQ2FsbGJhY2sgdmFsaWRhdG9yID0gdGhpcy5jZXJ0VmFsaWRhdG9yID8/IERlZmF1bHRDZXJ0aWZpY2F0ZVZhbGlkYXRvcjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYoIHRoaXMubG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrICE9IG51bGwpCisKKyAgICAgICAgICAgIGlmICh0aGlzLmxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayAhPSBudWxsKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHRoaXMuc2VjdXJlU3RyZWFtID0gbmV3IFNzbFN0cmVhbSgKICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGllbnQuR2V0U3RyZWFtKCksCkBAIC0zMDQsMTggKzMyNCwxOSBAQAogICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3IKICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgCisKICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmIChpc1NlcnZlcikKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIC8vIFNlcnZlciBhdXRoZW50aWNhdGlvbgotICAgICAgICAgICAgICAgICAgICB0aGlzLnNlY3VyZVN0cmVhbS5BdXRoZW50aWNhdGVBc1NlcnZlcih0aGlzLmNlcnRpZmljYXRlLCB0aGlzLmNlcnRWYWxpZGF0b3IgIT0gbnVsbCwgU3NsUHJvdG9jb2xzLlRscywgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VjdXJlU3RyZWFtLkF1dGhlbnRpY2F0ZUFzU2VydmVyKHRoaXMuY2VydGlmaWNhdGUsIHRoaXMuY2VydFZhbGlkYXRvciAhPSBudWxsLCBzc2xQcm90b2NvbHMsIHRydWUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAvLyBDbGllbnQgYXV0aGVudGljYXRpb24KLSAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWN1cmVTdHJlYW0uQXV0aGVudGljYXRlQXNDbGllbnQoaG9zdCwgbmV3IFg1MDlDZXJ0aWZpY2F0ZUNvbGxlY3Rpb24geyBjZXJ0aWZpY2F0ZSB9LCBTc2xQcm90b2NvbHMuVGxzLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgWDUwOUNlcnRpZmljYXRlQ29sbGVjdGlvbiBjZXJ0cyA9IGNlcnRpZmljYXRlICE9IG51bGwgPyBuZXcgWDUwOUNlcnRpZmljYXRlQ29sbGVjdGlvbiB7IGNlcnRpZmljYXRlIH0gOiBuZXcgWDUwOUNlcnRpZmljYXRlQ29sbGVjdGlvbigpOworICAgICAgICAgICAgICAgICAgICB0aGlzLnNlY3VyZVN0cmVhbS5BdXRoZW50aWNhdGVBc0NsaWVudChob3N0LCBjZXJ0cywgc3NsUHJvdG9jb2xzLCB0cnVlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUcmFuc3BvcnQuY3MgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRyYW5zcG9ydC5jcwppbmRleCAyODExMzk5Li41ZTRhYzIyIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRyYW5zcG9ydC5jcworKysgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRyYW5zcG9ydC5jcwpAQCAtMzQsNyArMzQsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgcHJpdmF0ZSBieXRlW10gX3BlZWtCdWZmZXIgPSBuZXcgYnl0ZVsxXTsKLSAgICAgICAgcHJpdmF0ZSBib29sIF9oYXNQZWVrQnl0ZSA9IGZhbHNlOworICAgICAgICBwcml2YXRlIGJvb2wgX2hhc1BlZWtCeXRlOwogCiAgICAgICAgIHB1YmxpYyBib29sIFBlZWsoKQogICAgICAgICB7CkBAIC01Myw5ICs1Myw5IEBACiAgICAgICAgICAgICAgICAgaWYgKGJ5dGVzID09IDApCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoKCBJT0V4Y2VwdGlvbikKKyAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbikKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIF9oYXNQZWVrQnl0ZSA9IHRydWU7CkBAIC02NiwxMCArNjYsMjMgQEAKIAogICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBDbG9zZSgpOwogCisgICAgICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBWYWxpZGF0ZUJ1ZmZlckFyZ3MoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGJ1ZiA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oImJ1ZiIpOworICAgICAgICAgICAgaWYgKG9mZiA8IDApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigiQnVmZmVyIG9mZnNldCBpcyBzbWFsbGVyIHRoYW4gemVyby4iKTsKKyAgICAgICAgICAgIGlmIChsZW4gPCAwKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oIkJ1ZmZlciBsZW5ndGggaXMgc21hbGxlciB0aGFuIHplcm8uIik7CisgICAgICAgICAgICBpZiAob2ZmICsgbGVuID4gYnVmLkxlbmd0aCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCJOb3QgZW5vdWdoIGRhdGEuIik7CisgICAgICAgIH0KKwogICAgICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IFJlYWQoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbik7CiAKICAgICAgICAgcHVibGljIGludCBSZWFkQWxsKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCiAgICAgICAgIHsKKyAgICAgICAgICAgIFZhbGlkYXRlQnVmZmVyQXJncyhidWYsIG9mZiwgbGVuKTsKICAgICAgICAgICAgIGludCBnb3QgPSAwOwogCiAgICAgICAgICAgICAvL0lmIHdlIHByZXZpb3VzbHkgcGVla2VkIGEgYnl0ZSwgd2UgbmVlZCB0byB1c2UgdGhhdCBmaXJzdC4KQEAgLTk1LDcgKzEwOCw3IEBACiAKICAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBXcml0ZShieXRlW10gYnVmKQogICAgICAgICB7Ci0gICAgICAgICAgICBXcml0ZSAoYnVmLCAwLCBidWYuTGVuZ3RoKTsKKyAgICAgICAgICAgIFdyaXRlKGJ1ZiwgMCwgYnVmLkxlbmd0aCk7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZShieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKTsKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmNzIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uY3MKaW5kZXggYWU5ODdkNS4uN2Y2Y2MxOCAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uY3MKKysrIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uY3MKQEAgLTQwLDE0ICs0MCwxNCBAQAogICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBUVHJhbnNwb3J0RXhjZXB0aW9uKEV4Y2VwdGlvblR5cGUgdHlwZSwgc3RyaW5nIG1lc3NhZ2UpCi0gICAgICAgICAgICA6IGJhc2UobWVzc2FnZSkKKyAgICAgICAgcHVibGljIFRUcmFuc3BvcnRFeGNlcHRpb24oRXhjZXB0aW9uVHlwZSB0eXBlLCBzdHJpbmcgbWVzc2FnZSwgRXhjZXB0aW9uIGlubmVyID0gbnVsbCkKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlLCBpbm5lcikKICAgICAgICAgewogICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBUVHJhbnNwb3J0RXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlKQotICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UpCisgICAgICAgIHB1YmxpYyBUVHJhbnNwb3J0RXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlLCBFeGNlcHRpb24gaW5uZXIgPSBudWxsKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UsIGlubmVyKQogICAgICAgICB7CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUcmFuc3BvcnRGYWN0b3J5LmNzIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUcmFuc3BvcnRGYWN0b3J5LmNzCmluZGV4IGZhMTAwMzMuLjQ3YTBjNjIgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0RmFjdG9yeS5jcworKysgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRyYW5zcG9ydEZhY3RvcnkuY3MKQEAgLTI2LDcgKzI2LDcgQEAKIG5hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0CiB7CiAgICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBGcm9tIE1hcmsgU2xlZSAmIEFkaXR5YSBBZ2Fyd2FsIG9mIEZhY2Vib29rOgorICAgIC8vLyBGcm9tIE1hcmsgU2xlZSAmYW1wOyBBZGl0eWEgQWdhcndhbCBvZiBGYWNlYm9vazoKICAgICAvLy8gRmFjdG9yeSBjbGFzcyB1c2VkIHRvIGNyZWF0ZSB3cmFwcGVkIGluc3RhbmNlIG9mIFRyYW5zcG9ydHMuCiAgICAgLy8vIFRoaXMgaXMgdXNlZCBwcmltYXJpbHkgaW4gc2VydmVycywgd2hpY2ggZ2V0IFRyYW5zcG9ydHMgZnJvbQogICAgIC8vLyBhIFNlcnZlclRyYW5zcG9ydCBhbmQgdGhlbiBtYXkgd2FudCB0byBtdXRhdGUgdGhlbSAoaS5lLiBjcmVhdGUKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9KU09OL1Byb2dyYW0uY3MgYi9saWIvY3NoYXJwL3Rlc3QvSlNPTi9Qcm9ncmFtLmNzCmluZGV4IDk4MjMyMjEuLmY2MTM4OGEgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvdGVzdC9KU09OL1Byb2dyYW0uY3MKKysrIGIvbGliL2NzaGFycC90ZXN0L0pTT04vUHJvZ3JhbS5jcwpAQCAtMzQsNiArMzQsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBUZXN0VGhyaWZ0MjM2NSgpOyAgLy8gSlNPTiBiaW5hcnkgZGVjb2RlcyB0b28gbXVjaCBkYXRhCiAgICAgICAgICAgICBUZXN0VGhyaWZ0MjMzNigpOyAgLy8gaGV4IGVuY29kaW5nIHVzaW5nIFx1WFhYWCB3aGVyZSAweFhYWFggPiAweEZGCisgICAgICAgICAgICBUZXN0VGhyaWZ0MzQwMygpOyAvLyBKU09OIGVzY2FwZWQgdW5pY29kZSBzdXJyb2dhdGUgcGFpciBzdXBwb3J0LgogICAgICAgICB9CiAKIApAQCAtNzgsNSArNzksMTcgQEAKICAgICAgICAgICAgIHZhciBwcm90ID0gbmV3IFRKU09OUHJvdG9jb2wodHJhbnMpOwogICAgICAgICAgICAgRGVidWcuQXNzZXJ0KHByb3QuUmVhZFN0cmluZygpID09IFJVU1NJQU5fVEVYVCwgInJlYWRpbmcgSlNPTiB3aXRoIGhleC1lbmNvZGVkIGNoYXJzID4gOCBiaXQiKTsKICAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBUZXN0VGhyaWZ0MzQwMygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyBHQ0xFRl9URVhUID0gIlx1ZDgzNFx1ZGQxZSI7CisgICAgICAgICAgICBjb25zdCBzdHJpbmcgR0NMRUZfSlNPTiA9ICJcIlxcdWQ4MzRcXHVkZDFlXCIiOworCisgICAgICAgICAgICAvLyBwYXJzZSBhbmQgY2hlY2sKKyAgICAgICAgICAgIHZhciBzdG0gPSBuZXcgTWVtb3J5U3RyZWFtKEVuY29kaW5nLlVURjguR2V0Qnl0ZXMoR0NMRUZfSlNPTikpOworICAgICAgICAgICAgdmFyIHRyYW5zID0gbmV3IFRTdHJlYW1UcmFuc3BvcnQoc3RtLCBudWxsKTsKKyAgICAgICAgICAgIHZhciBwcm90ID0gbmV3IFRKU09OUHJvdG9jb2wodHJhbnMpOworICAgICAgICAgICAgRGVidWcuQXNzZXJ0KHByb3QuUmVhZFN0cmluZygpID09IEdDTEVGX1RFWFQsICJyZWFkaW5nIEpTT04gd2l0aCBzdXJyb2dhdGUgcGFpciBoZXgtZW5jb2RlZCBjaGFycyIpOworICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L0pTT04vUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi9saWIvY3NoYXJwL3Rlc3QvSlNPTi9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwppbmRleCBmMGZhZjlhLi5mZGZmNGExIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3Rlc3QvSlNPTi9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcworKysgYi9saWIvY3NoYXJwL3Rlc3QvSlNPTi9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMjcsOSArMjcsOSBAQAogW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJKU09OVGVzdCIpXQogW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCIiKV0KIFthc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KLVthc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCIiKV0KLVthc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJKU09OVGVzdCIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiQ29weXJpZ2h0IMKpICAyMDE0IildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiVGhyaWZ0IildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KIFthc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQogW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoIiIpXQogCkBAIC01MSw1ICs1MSw1IEBACiAvLyBTaWUga8O2bm5lbiBhbGxlIFdlcnRlIGFuZ2ViZW4gb2RlciBkaWUgc3RhbmRhcmRtw6TDn2lnZW4gQnVpbGQtIHVuZCBSZXZpc2lvbnNudW1tZXJuCiAvLyDDvGJlcm5laG1lbiwgaW5kZW0gU2llICIqIiBlaW5nZWJlbjoKIC8vIFthc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuKiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjAuOS4zLjAiKV0KLVthc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMC45LjMuMCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4wLjAiKV0KK1thc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMS4wLjAuMCIpXQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9DbGllbnQvTXVsdGlwbGV4LlRlc3QuQ2xpZW50LmNzIGIvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9DbGllbnQvTXVsdGlwbGV4LlRlc3QuQ2xpZW50LmNzCmluZGV4IGNjZmUyMWQuLmM4MTBhMDggMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvQ2xpZW50L011bHRpcGxleC5UZXN0LkNsaWVudC5jcworKysgYi9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L0NsaWVudC9NdWx0aXBsZXguVGVzdC5DbGllbnQuY3MKQEAgLTI2LDE3ICsyNiwxNiBAQAogdXNpbmcgVGhyaWZ0OwogdXNpbmcgVGVzdC5NdWx0aXBsZXg7CiAKLQogbmFtZXNwYWNlIFRlc3QuTXVsdGlwbGV4LkNsaWVudAogewogICAgIHB1YmxpYyBjbGFzcyBUZXN0Q2xpZW50CiAgICAgewotICAgICAgICBwcml2YXRlIHZvaWQgUnVuKCkKKyAgICAgICAgc3RhdGljIHZvaWQgRXhlY3V0ZShpbnQgcG9ydCkKICAgICAgICAgewogICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydCB0cmFuczsKLSAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCA5MDkwKTsKKyAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCBwb3J0KTsKICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBURnJhbWVkVHJhbnNwb3J0KHRyYW5zKTsKICAgICAgICAgICAgICAgICB0cmFucy5PcGVuKCk7CiAKQEAgLTQ0LDQ0ICs0Myw0MCBAQAogCiAgICAgICAgICAgICAgICAgVE11bHRpcGxleGVkUHJvdG9jb2wgbXVsdGlwbGV4OwogCi0gICAgICAgICAgICAgICAgbXVsdGlwbGV4ID0gbmV3IFRNdWx0aXBsZXhlZFByb3RvY29sKCBQcm90b2NvbCwgQ29uc3RhbnRzLk5BTUVfQkVOQ0hNQVJLU0VSVklDRSk7Ci0gICAgICAgICAgICAgICAgQmVuY2htYXJrU2VydmljZS5JZmFjZSBiZW5jaCA9IG5ldyBCZW5jaG1hcmtTZXJ2aWNlLkNsaWVudCggbXVsdGlwbGV4KTsKKyAgICAgICAgICAgICAgICBtdWx0aXBsZXggPSBuZXcgVE11bHRpcGxleGVkUHJvdG9jb2woUHJvdG9jb2wsIENvbnN0YW50cy5OQU1FX0JFTkNITUFSS1NFUlZJQ0UpOworICAgICAgICAgICAgICAgIEJlbmNobWFya1NlcnZpY2UuSWZhY2UgYmVuY2ggPSBuZXcgQmVuY2htYXJrU2VydmljZS5DbGllbnQobXVsdGlwbGV4KTsKIAotICAgICAgICAgICAgICAgIG11bHRpcGxleCA9IG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbCggUHJvdG9jb2wsIENvbnN0YW50cy5OQU1FX0FHR1IpOwotICAgICAgICAgICAgICAgIEFnZ3IuSWZhY2UgYWdnciA9IG5ldyBBZ2dyLkNsaWVudCggbXVsdGlwbGV4KTsKKyAgICAgICAgICAgICAgICBtdWx0aXBsZXggPSBuZXcgVE11bHRpcGxleGVkUHJvdG9jb2woUHJvdG9jb2wsIENvbnN0YW50cy5OQU1FX0FHR1IpOworICAgICAgICAgICAgICAgIEFnZ3IuSWZhY2UgYWdnciA9IG5ldyBBZ2dyLkNsaWVudChtdWx0aXBsZXgpOwogCi0gICAgICAgICAgICAgICAgc2J5dGUgaTsKLSAgICAgICAgICAgICAgICBmb3IoIGkgPSAxOyAxMCA+PSBpOyArK2kpCisgICAgICAgICAgICAgICAgZm9yIChzYnl0ZSBpID0gMTsgMTAgPj0gaTsgKytpKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYWdnci5hZGRWYWx1ZSggYmVuY2guZmlib25hY2NpKGkpKTsKKyAgICAgICAgICAgICAgICAgICAgYWdnci5hZGRWYWx1ZShiZW5jaC5maWJvbmFjY2koaSkpOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGZvcmVhY2goIGludCBrIGluIGFnZ3IuZ2V0VmFsdWVzKCkpCisgICAgICAgICAgICAgICAgZm9yZWFjaCAoaW50IGsgaW4gYWdnci5nZXRWYWx1ZXMoKSkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoay5Ub1N0cmluZygpKyIgIik7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoay5Ub1N0cmluZygpICsgIiAiKTsKICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiIpOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0cmFucy5DbG9zZSgpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goIEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCBlLk1lc3NhZ2UpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGUuTWVzc2FnZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBFeGVjdXRlKCkKLSAgICAgICAgewotICAgICAgICAgICAgVGVzdENsaWVudCBjbGllbnQgPSBuZXcgVGVzdENsaWVudCgpOwotICAgICAgICAgICAgY2xpZW50LlJ1bigpOwotICAgICAgICB9Ci0KICAgICAgICAgc3RhdGljIHZvaWQgTWFpbihzdHJpbmdbXSBhcmdzKQogICAgICAgICB7Ci0gICAgICAgICAgICBFeGVjdXRlKCk7CisgICAgICAgICAgICBpbnQgcG9ydCA9IDkwOTA7CisgICAgICAgICAgICBpZiAoYXJncy5MZW5ndGggPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBvcnQgPSB1c2hvcnQuUGFyc2UoYXJnc1swXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBFeGVjdXRlKHBvcnQpOwogICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoImRvbmUuIik7Ci0gICAgICAgICAgICBDb25zb2xlLlJlYWRMaW5lKCk7CiAgICAgICAgIH0KLQogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9DbGllbnQvTXVsdGlwbGV4Q2xpZW50LmNzcHJvaiBiL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvQ2xpZW50L011bHRpcGxleENsaWVudC5jc3Byb2oKaW5kZXggNjIyMWUxNC4uMjFlMWNlMSAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9DbGllbnQvTXVsdGlwbGV4Q2xpZW50LmNzcHJvagorKysgYi9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L0NsaWVudC9NdWx0aXBsZXhDbGllbnQuY3Nwcm9qCkBAIC00Niw3ICs0Niw3IEBACiAgICAgPFVwZGF0ZVJlcXVpcmVkPmZhbHNlPC9VcGRhdGVSZXF1aXJlZD4KICAgICA8TWFwRmlsZUV4dGVuc2lvbnM+dHJ1ZTwvTWFwRmlsZUV4dGVuc2lvbnM+CiAgICAgPEFwcGxpY2F0aW9uUmV2aXNpb24+MDwvQXBwbGljYXRpb25SZXZpc2lvbj4KLSAgICA8QXBwbGljYXRpb25WZXJzaW9uPjEuMC4wLiUyYTwvQXBwbGljYXRpb25WZXJzaW9uPgorICAgIDxBcHBsaWNhdGlvblZlcnNpb24+MS4wLjAuMDwvQXBwbGljYXRpb25WZXJzaW9uPgogICAgIDxVc2VBcHBsaWNhdGlvblRydXN0PmZhbHNlPC9Vc2VBcHBsaWNhdGlvblRydXN0PgogICAgIDxCb290c3RyYXBwZXJFbmFibGVkPnRydWU8L0Jvb3RzdHJhcHBlckVuYWJsZWQ+CiAgIDwvUHJvcGVydHlHcm91cD4KQEAgLTE0NSw0ICsxNDUsNCBAQAogCiA8L1ByZUJ1aWxkRXZlbnQ+CiAgIDwvUHJvcGVydHlHcm91cD4KLTwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L0NsaWVudC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvQ2xpZW50L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCmluZGV4IDI2YzI3OTAuLmY2ODZkZWQgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvQ2xpZW50L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvQ2xpZW50L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCkBAIC0yNyw5ICsyNyw5IEBACiBbYXNzZW1ibHk6IEFzc2VtYmx5VGl0bGUoIk11bHRpcGxleENsaWVudCIpXQogW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCIiKV0KIFthc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KLVthc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCIiKV0KLVthc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJNdWx0aXBsZXhDbGllbnQiKV0KLVthc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIkNvcHlyaWdodCDCqSAyMDE1IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIlRocmlmdCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCiBbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KIFthc3NlbWJseTogQXNzZW1ibHlDdWx0dXJlKCIiKV0KIApAQCAtNTEsNSArNTEsNSBAQAogLy8gWW91IGNhbiBzcGVjaWZ5IGFsbCB0aGUgdmFsdWVzIG9yIHlvdSBjYW4gZGVmYXVsdCB0aGUgQnVpbGQgYW5kIFJldmlzaW9uIE51bWJlcnMKIC8vIGJ5IHVzaW5nIHRoZSAnKicgYXMgc2hvd24gYmVsb3c6CiAvLyBbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLioiKV0KLVthc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIwLjkuMy4wIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjAuOS4zLjAiKV0KK1thc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuMC4wIildCitbYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjEuMC4wLjAiKV0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvTWFrZWZpbGUuYW0gYi9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MjUzZDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNTIgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitHRU5FUkFURUQgPSBcCisJZ2VuLWNzaGFycC9BZ2dyLmNzIFwKKwlnZW4tY3NoYXJwL0JlbmNobWFya1NlcnZpY2UuY3MgXAorCWdlbi1jc2hhcnAvRXJyb3IuY3MKKworQlVJTFRfU09VUkNFUyA9ICQoR0VORVJBVEVEKQorCitUSFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAorCitnZW4tY3NoYXJwL0FnZ3IuY3M6ICQodG9wX3NyY2RpcikvY29udHJpYi9hc3luYy10ZXN0L2FnZ3IudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGNzaGFycCAkPAorCitnZW4tY3NoYXJwL0JlbmNobWFya1NlcnZpY2UuY3MgZ2VuLWNzaGFycC9FcnJvci5jczogJCh0b3Bfc3JjZGlyKS9saWIvcmIvYmVuY2htYXJrL0JlbmNobWFyay50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gY3NoYXJwICQ8CisKK1RocmlmdEltcGwuZGxsOiBNdWx0aXBsZXguVGVzdC5Db21tb24uY3MgJChHRU5FUkFURUQpIC4uLy4uL1RocmlmdC5kbGwKKwkkKENTQykgJChDU0NfREVGSU5FUykgLXQ6bGlicmFyeSAtb3V0Oi4vVGhyaWZ0SW1wbC5kbGwgLXJlZmVyZW5jZTouLi8uLi9UaHJpZnQuZGxsICQoR0VORVJBVEVEKSAkPAorCitNdWx0aXBsZXhDbGllbnQuZXhlOiBDbGllbnQvTXVsdGlwbGV4LlRlc3QuQ2xpZW50LmNzIFRocmlmdEltcGwuZGxsCisJJChDU0MpICQoQ1NDX0RFRklORVMpIC1vdXQ6JEAgLXJlZmVyZW5jZTouLi8uLi9UaHJpZnQuZGxsIC1yZWZlcmVuY2U6VGhyaWZ0SW1wbC5kbGwgJDwKKworTXVsdGlwbGV4U2VydmVyLmV4ZTogU2VydmVyL011bHRpcGxleC5UZXN0LlNlcnZlci5jcyBUaHJpZnRJbXBsLmRsbAorCSQoQ1NDKSAkKENTQ19ERUZJTkVTKSAtb3V0OiRAIC1yZWZlcmVuY2U6Li4vLi4vVGhyaWZ0LmRsbCAtcmVmZXJlbmNlOlRocmlmdEltcGwuZGxsICQ8CisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yZiBnZW4tY3NoYXJwICouZXhlICouZGxsCisKK1RFU1RQT1JUID0gOTUwMQorY2hlY2stbG9jYWw6IE11bHRpcGxleFNlcnZlci5leGUgTXVsdGlwbGV4Q2xpZW50LmV4ZQorCWVjaG8gJChURVNUUE9SVCkKKwlNT05PX1BBVEg9Li4vLi4vIHRpbWVvdXQgMTAgbW9ubyBNdWx0aXBsZXhTZXJ2ZXIuZXhlICQoVEVTVFBPUlQpICYKKwlzbGVlcCAxCisJTU9OT19QQVRIPS4uLy4uLyBtb25vIE11bHRpcGxleENsaWVudC5leGUgJChURVNUUE9SVCkKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvU2VydmVyL011bHRpcGxleC5UZXN0LlNlcnZlci5jcyBiL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvU2VydmVyL011bHRpcGxleC5UZXN0LlNlcnZlci5jcwppbmRleCA2MWMyZDdjLi45Nzg2MTg5IDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L1NlcnZlci9NdWx0aXBsZXguVGVzdC5TZXJ2ZXIuY3MKKysrIGIvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9TZXJ2ZXIvTXVsdGlwbGV4LlRlc3QuU2VydmVyLmNzCkBAIC0zMCwzMCArMzAsMTQgQEAKIHsKICAgICBwdWJsaWMgY2xhc3MgVGVzdFNlcnZlcgogICAgIHsKLSAgICAgICAgcHVibGljIGludGVyZmFjZSBJVGVzdEhhbmRsZXIKLSAgICAgICAgewotICAgICAgICAgICAgdm9pZCBTZXRTZXJ2ZXIoIFRTZXJ2ZXIgYVNlcnZlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgY2xhc3MgVGVzdEhhbmRsZXJJbXBsIDogSVRlc3RIYW5kbGVyCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByaXZhdGUgVFNlcnZlciBTZXJ2ZXI7Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIFNldFNlcnZlciggVFNlcnZlciBhU2VydmVyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNlcnZlciA9IGFTZXJ2ZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotCi0gICAgICAgIHByb3RlY3RlZCBjbGFzcyBCZW5jaG1hcmtTZXJ2aWNlSW1wbCA6IFRlc3RIYW5kbGVySW1wbCwgQmVuY2htYXJrU2VydmljZS5JZmFjZQorICAgICAgICBjbGFzcyBCZW5jaG1hcmtTZXJ2aWNlSW1wbCA6IEJlbmNobWFya1NlcnZpY2UuSWZhY2UKICAgICAgICAgewogICAgICAgICAgICAgcHVibGljIGludCBmaWJvbmFjY2koc2J5dGUgbikKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpbnQgcHJldiwgbmV4dCwgcmVzdWx0OwogICAgICAgICAgICAgICAgIHByZXYgICA9IDA7CiAgICAgICAgICAgICAgICAgcmVzdWx0ID0gMTsKLSAgICAgICAgICAgICAgICB3aGlsZSggbiA+IDApCisgICAgICAgICAgICAgICAgd2hpbGUgKG4gPiAwKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgbmV4dCAgID0gcmVzdWx0ICsgcHJldjsKICAgICAgICAgICAgICAgICAgICAgcHJldiAgID0gcmVzdWx0OwpAQCAtNjQsMTQgKzQ4LDEzIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotCi0gICAgICAgIHByb3RlY3RlZCBjbGFzcyBBZ2dyU2VydmljZUltcGwgOiBUZXN0SGFuZGxlckltcGwsICBBZ2dyLklmYWNlCisgICAgICAgIGNsYXNzIEFnZ3JTZXJ2aWNlSW1wbCA6IEFnZ3IuSWZhY2UKICAgICAgICAgewogICAgICAgICAgICAgTGlzdDxpbnQ+IHZhbHVlcyA9IG5ldyBMaXN0PGludD4oKTsKIAogICAgICAgICAgICAgcHVibGljIHZvaWQgYWRkVmFsdWUoaW50IHZhbHVlKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhbHVlcy5BZGQoIHZhbHVlKTsKKyAgICAgICAgICAgICAgICB2YWx1ZXMuQWRkKHZhbHVlKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcHVibGljIExpc3Q8aW50PiBnZXRWYWx1ZXMoKQpAQCAtODAsNTIgKzYzLDQ1IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgIHN0YXRpYyB2b2lkIEV4ZWN1dGUoKQotICAgICAgIHsKLSAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBwcm90b2NvbCBmYWN0b3J5LCBkZWZhdWx0IHRvIEJpbmFyeVByb3RvY29sCi0gICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IFByb3RvY29sRmFjdG9yeSA9IG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSh0cnVlLHRydWUpOwotICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJ0cmFucyAgICAgPSBuZXcgVFNlcnZlclNvY2tldCggOTA5MCwgMCwgZmFsc2UpOwotICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgVHJhbnNwb3J0RmFjdG9yeSA9IG5ldyBURnJhbWVkVHJhbnNwb3J0LkZhY3RvcnkoKTsKKyAgICAgICAgc3RhdGljIHZvaWQgRXhlY3V0ZShpbnQgcG9ydCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gY3JlYXRlIHByb3RvY29sIGZhY3RvcnksIGRlZmF1bHQgdG8gQmluYXJ5UHJvdG9jb2wKKyAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IFByb3RvY29sRmFjdG9yeSA9IG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSh0cnVlLHRydWUpOworICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVydHJhbnMgPSBuZXcgVFNlcnZlclNvY2tldChwb3J0LCAwLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgVHJhbnNwb3J0RmFjdG9yeSA9IG5ldyBURnJhbWVkVHJhbnNwb3J0LkZhY3RvcnkoKTsKIAotICAgICAgICAgICAgICAgQmVuY2htYXJrU2VydmljZS5JZmFjZSBiZW5jaEhhbmRsZXIgPSBuZXcgQmVuY2htYXJrU2VydmljZUltcGwoKTsKLSAgICAgICAgICAgICAgIFRQcm9jZXNzb3IgYmVuY2hQcm9jZXNzb3IgPSBuZXcgQmVuY2htYXJrU2VydmljZS5Qcm9jZXNzb3IoIGJlbmNoSGFuZGxlcik7CisgICAgICAgICAgICAgICAgQmVuY2htYXJrU2VydmljZS5JZmFjZSBiZW5jaEhhbmRsZXIgPSBuZXcgQmVuY2htYXJrU2VydmljZUltcGwoKTsKKyAgICAgICAgICAgICAgICBUUHJvY2Vzc29yIGJlbmNoUHJvY2Vzc29yID0gbmV3IEJlbmNobWFya1NlcnZpY2UuUHJvY2Vzc29yKGJlbmNoSGFuZGxlcik7CiAKLSAgICAgICAgICAgICAgIEFnZ3IuSWZhY2UgYWdnckhhbmRsZXIgPSBuZXcgQWdnclNlcnZpY2VJbXBsKCk7Ci0gICAgICAgICAgICAgICBUUHJvY2Vzc29yIGFnZ3JQcm9jZXNzb3IgPSBuZXcgQWdnci5Qcm9jZXNzb3IoIGFnZ3JIYW5kbGVyKTsKKyAgICAgICAgICAgICAgICBBZ2dyLklmYWNlIGFnZ3JIYW5kbGVyID0gbmV3IEFnZ3JTZXJ2aWNlSW1wbCgpOworICAgICAgICAgICAgICAgIFRQcm9jZXNzb3IgYWdnclByb2Nlc3NvciA9IG5ldyBBZ2dyLlByb2Nlc3NvcihhZ2dySGFuZGxlcik7CiAKLSAgICAgICAgICAgICAgIFRNdWx0aXBsZXhlZFByb2Nlc3NvciBtdWx0aXBsZXggPSBuZXcgVE11bHRpcGxleGVkUHJvY2Vzc29yKCk7Ci0gICAgICAgICAgICAgICBtdWx0aXBsZXguUmVnaXN0ZXJQcm9jZXNzb3IoQ29uc3RhbnRzLk5BTUVfQkVOQ0hNQVJLU0VSVklDRSwgYmVuY2hQcm9jZXNzb3IpOwotICAgICAgICAgICAgICAgbXVsdGlwbGV4LlJlZ2lzdGVyUHJvY2Vzc29yKENvbnN0YW50cy5OQU1FX0FHR1IsIGFnZ3JQcm9jZXNzb3IpOworICAgICAgICAgICAgICAgIFRNdWx0aXBsZXhlZFByb2Nlc3NvciBtdWx0aXBsZXggPSBuZXcgVE11bHRpcGxleGVkUHJvY2Vzc29yKCk7CisgICAgICAgICAgICAgICAgbXVsdGlwbGV4LlJlZ2lzdGVyUHJvY2Vzc29yKENvbnN0YW50cy5OQU1FX0JFTkNITUFSS1NFUlZJQ0UsIGJlbmNoUHJvY2Vzc29yKTsKKyAgICAgICAgICAgICAgICBtdWx0aXBsZXguUmVnaXN0ZXJQcm9jZXNzb3IoQ29uc3RhbnRzLk5BTUVfQUdHUiwgYWdnclByb2Nlc3Nvcik7CiAKLSAgICAgICAgICAgICAgIFRTZXJ2ZXIgU2VydmVyRW5naW5lID0gbmV3IFRTaW1wbGVTZXJ2ZXIoIG11bHRpcGxleCwgc2VydmVydHJhbnMsIFRyYW5zcG9ydEZhY3RvcnksIFByb3RvY29sRmFjdG9yeSk7CisgICAgICAgICAgICAgICAgVFNlcnZlciBTZXJ2ZXJFbmdpbmUgPSBuZXcgVFNpbXBsZVNlcnZlcihtdWx0aXBsZXgsIHNlcnZlcnRyYW5zLCBUcmFuc3BvcnRGYWN0b3J5LCBQcm90b2NvbEZhY3RvcnkpOwogCi0gICAgICAgICAgICAgICAoYmVuY2hIYW5kbGVyIGFzIElUZXN0SGFuZGxlcikuU2V0U2VydmVyKCBTZXJ2ZXJFbmdpbmUpOwotICAgICAgICAgICAgICAgKGFnZ3JIYW5kbGVyIGFzIElUZXN0SGFuZGxlcikuU2V0U2VydmVyKCBTZXJ2ZXJFbmdpbmUpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJTdGFydGluZyB0aGUgc2VydmVyIC4uLiIpOworICAgICAgICAgICAgICAgIFNlcnZlckVuZ2luZS5TZXJ2ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGUuTWVzc2FnZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlN0YXJ0aW5nIHRoZSBzZXJ2ZXIgLi4uIik7Ci0gICAgICAgICAgICAgICBTZXJ2ZXJFbmdpbmUuU2VydmUoKTsKLQotICAgICAgICAgICAgICAgKGJlbmNoSGFuZGxlciBhcyBJVGVzdEhhbmRsZXIpLlNldFNlcnZlcihudWxsKTsKLSAgICAgICAgICAgICAgIChhZ2dySGFuZGxlciBhcyBJVGVzdEhhbmRsZXIpLlNldFNlcnZlcihudWxsKTsKLQotICAgICAgICAgICB9Ci0gICAgICAgICAgIGNhdGNoKCBFeGNlcHRpb24gZSkKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIGUuTWVzc2FnZSk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoICJkb25lLiIpOwotICAgICAgIH0KLQotCi0gICAgICAgc3RhdGljIHZvaWQgTWFpbihzdHJpbmdbXSBhcmdzKQotICAgICAgIHsKLSAgICAgICAgICAgRXhlY3V0ZSgpOwotICAgICAgIH0KKyAgICAgICAgc3RhdGljIHZvaWQgTWFpbihzdHJpbmdbXSBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgcG9ydCA9IDkwOTA7CisgICAgICAgICAgICBpZiAoYXJncy5MZW5ndGggPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBvcnQgPSB1c2hvcnQuUGFyc2UoYXJnc1swXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBFeGVjdXRlKHBvcnQpOworICAgICAgICB9CiAgICAgfQotCi0KLQogfQogCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L1NlcnZlci9NdWx0aXBsZXhTZXJ2ZXIuY3Nwcm9qIGIvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9TZXJ2ZXIvTXVsdGlwbGV4U2VydmVyLmNzcHJvagppbmRleCBkYzFkMTIzLi5jNGE0Mzk0IDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L1NlcnZlci9NdWx0aXBsZXhTZXJ2ZXIuY3Nwcm9qCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvU2VydmVyL011bHRpcGxleFNlcnZlci5jc3Byb2oKQEAgLTQ2LDcgKzQ2LDcgQEAKICAgICA8VXBkYXRlUmVxdWlyZWQ+ZmFsc2U8L1VwZGF0ZVJlcXVpcmVkPgogICAgIDxNYXBGaWxlRXh0ZW5zaW9ucz50cnVlPC9NYXBGaWxlRXh0ZW5zaW9ucz4KICAgICA8QXBwbGljYXRpb25SZXZpc2lvbj4wPC9BcHBsaWNhdGlvblJldmlzaW9uPgotICAgIDxBcHBsaWNhdGlvblZlcnNpb24+MS4wLjAuJTJhPC9BcHBsaWNhdGlvblZlcnNpb24+CisgICAgPEFwcGxpY2F0aW9uVmVyc2lvbj4xLjAuMC4wPC9BcHBsaWNhdGlvblZlcnNpb24+CiAgICAgPFVzZUFwcGxpY2F0aW9uVHJ1c3Q+ZmFsc2U8L1VzZUFwcGxpY2F0aW9uVHJ1c3Q+CiAgICAgPEJvb3RzdHJhcHBlckVuYWJsZWQ+dHJ1ZTwvQm9vdHN0cmFwcGVyRW5hYmxlZD4KICAgPC9Qcm9wZXJ0eUdyb3VwPgpAQCAtMTQ1LDQgKzE0NSw0IEBACiAKIDwvUHJlQnVpbGRFdmVudD4KICAgPC9Qcm9wZXJ0eUdyb3VwPgotPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvU2VydmVyL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9TZXJ2ZXIvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKaW5kZXggM2E5NTgzOS4uNWQ0MDU0NiAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9TZXJ2ZXIvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKKysrIGIvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9TZXJ2ZXIvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKQEAgLTI3LDkgKzI3LDkgQEAKIFthc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiTXVsdGlwbGV4U2VydmVyIildCiBbYXNzZW1ibHk6IEFzc2VtYmx5RGVzY3JpcHRpb24oIiIpXQogW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIk11bHRpcGxleFNlcnZlciIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiQ29weXJpZ2h0IMKpIDIwMTUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiVGhyaWZ0IildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KIFthc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQogW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoIiIpXQogCkBAIC01MSw1ICs1MSw1IEBACiAvLyBZb3UgY2FuIHNwZWNpZnkgYWxsIHRoZSB2YWx1ZXMgb3IgeW91IGNhbiBkZWZhdWx0IHRoZSBCdWlsZCBhbmQgUmV2aXNpb24gTnVtYmVycwogLy8gYnkgdXNpbmcgdGhlICcqJyBhcyBzaG93biBiZWxvdzoKIC8vIFthc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuKiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjAuOS4zLjAiKV0KLVthc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMC45LjMuMCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4wLjAiKV0KK1thc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMS4wLjAuMCIpXQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9tYWtldGVzdC5zaCBiL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvbWFrZXRlc3Quc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFmMjllZTIuLjAwMDAwMDAKLS0tIGEvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9tYWtldGVzdC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMhL2Jpbi9zaAotCi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotLi4vLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtLWdlbiBjc2hhcnAgIC4uLy4uLy4uLy4uL2NvbnRyaWIvYXN5bmMtdGVzdC9hZ2dyLnRocmlmdAotLi4vLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtLWdlbiBjc2hhcnAgIC4uLy4uLy4uL3JiL2JlbmNobWFyay9CZW5jaG1hcmsudGhyaWZ0Ci1nbWNzIC90OmxpYnJhcnkgL291dDouL1RocmlmdEltcGwuZGxsIC9yZWN1cnNlOi4vZ2VuLWNzaGFycC8qIC9yZWZlcmVuY2U6Li4vLi4vVGhyaWZ0LmRsbCBNdWx0aXBsZXguVGVzdC5Db21tb24uY3MKLWdtY3MgIC9vdXQ6TXVsdGlwbGV4Q2xpZW50LmV4ZSAvcmVmZXJlbmNlOi4uLy4uL1RocmlmdC5kbGwgL3JlZmVyZW5jZTpUaHJpZnRJbXBsLmRsbCBDbGllbnQvTXVsdGlwbGV4LlRlc3QuQ2xpZW50LmNzCi1nbWNzICAvb3V0Ok11bHRpcGxleFNlcnZlci5leGUgL3JlZmVyZW5jZTouLi8uLi9UaHJpZnQuZGxsIC9yZWZlcmVuY2U6VGhyaWZ0SW1wbC5kbGwgU2VydmVyL011bHRpcGxleC5UZXN0LlNlcnZlci5jcwotCi0KLQotZXhwb3J0IE1PTk9fUEFUSD0uLi8uLi8KLQotdGltZW91dCAxMjAgLi9NdWx0aXBsZXhTZXJ2ZXIuZXhlICYKLXNsZWVwIDM7Ci0uL011bHRpcGxleENsaWVudC5leGUKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L0FwcF9TdGFydC9GaWx0ZXJDb25maWcuY3MgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9BcHBfU3RhcnQvRmlsdGVyQ29uZmlnLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1NTE4NGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9BcHBfU3RhcnQvRmlsdGVyQ29uZmlnLmNzCkBAIC0wLDAgKzEsMzEgQEAKK++7vy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbS5XZWIuTXZjOworCituYW1lc3BhY2UgVGhyaWZ0TVZDVGVzdAoreworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmlsdGVyQ29uZmlnCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgUmVnaXN0ZXJHbG9iYWxGaWx0ZXJzKEdsb2JhbEZpbHRlckNvbGxlY3Rpb24gZmlsdGVycykKKyAgICAgICAgeworICAgICAgICAgICAgZmlsdGVycy5BZGQobmV3IEhhbmRsZUVycm9yQXR0cmlidXRlKCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvQXBwX1N0YXJ0L1JvdXRlQ29uZmlnLmNzIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvQXBwX1N0YXJ0L1JvdXRlQ29uZmlnLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YjYwMjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9BcHBfU3RhcnQvUm91dGVDb25maWcuY3MKQEAgLTAsMCArMSwzOSBAQAor77u/LyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgU3lzdGVtLldlYi5NdmM7Cit1c2luZyBTeXN0ZW0uV2ViLlJvdXRpbmc7CisKK25hbWVzcGFjZSBUaHJpZnRNVkNUZXN0Cit7CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSb3V0ZUNvbmZpZworICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIFJlZ2lzdGVyUm91dGVzKFJvdXRlQ29sbGVjdGlvbiByb3V0ZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJvdXRlcy5JZ25vcmVSb3V0ZSgie3Jlc291cmNlfS50aHJpZnQiKTsKKyAgICAgICAgICAgIHJvdXRlcy5JZ25vcmVSb3V0ZSgie3Jlc291cmNlfS5heGQveypwYXRoSW5mb30iKTsKKworICAgICAgICAgICAgcm91dGVzLk1hcFJvdXRlKAorICAgICAgICAgICAgICAgIG5hbWU6ICJEZWZhdWx0IiwKKyAgICAgICAgICAgICAgICB1cmw6ICJ7Y29udHJvbGxlcn0ve2FjdGlvbn0ve2lkfSIsCisgICAgICAgICAgICAgICAgZGVmYXVsdHM6IG5ldyB7IGNvbnRyb2xsZXIgPSAiSG9tZSIsIGFjdGlvbiA9ICJJbmRleCIsIGlkID0gVXJsUGFyYW1ldGVyLk9wdGlvbmFsIH0KKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9Bc3luY0h0dHBIYW5kbGVyLmNzIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvQXN5bmNIdHRwSGFuZGxlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjI2MTg0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvQXN5bmNIdHRwSGFuZGxlci5jcwpAQCAtMCwwICsxLDMyIEBACivvu78vKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBUaHJpZnQuVHJhbnNwb3J0OworCituYW1lc3BhY2UgVGhyaWZ0TVZDVGVzdAoreworICAgIHB1YmxpYyBjbGFzcyBBc3luY0h0dHBIYW5kbGVyIDogVEh0dHBUYXNrQXN5bmNIYW5kbGVyCisgICAgeworICAgICAgICBwdWJsaWMgQXN5bmNIdHRwSGFuZGxlcigpCisgICAgICAgICAgICA6IGJhc2UoCisgICAgICAgICAgICAgICAgbmV3IFRocmlmdC5UZXN0LlNlY29uZFNlcnZpY2UuQXN5bmNQcm9jZXNzb3IobmV3IFNlY29uZFNlcnZpY2VJbXBsKCkpKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvQ29udHJvbGxlcnMvSG9tZUNvbnRyb2xsZXIuY3MgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9Db250cm9sbGVycy9Ib21lQ29udHJvbGxlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWExZWM0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvQ29udHJvbGxlcnMvSG9tZUNvbnRyb2xsZXIuY3MKQEAgLTAsMCArMSw3MCBAQAor77u/LyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIFN5c3RlbS5XZWIuTXZjOwordXNpbmcgVGhyaWZ0LlByb3RvY29sOwordXNpbmcgVGhyaWZ0LlRlc3Q7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0OworCituYW1lc3BhY2UgVGhyaWZ0TVZDVGVzdC5Db250cm9sbGVycworeworICAgIHB1YmxpYyBjbGFzcyBIb21lQ29udHJvbGxlciA6IENvbnRyb2xsZXIKKyAgICB7CisgICAgICAgIHB1YmxpYyBBY3Rpb25SZXN1bHQgSW5kZXgoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gVmlldygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2s8QWN0aW9uUmVzdWx0PiBUZXN0VGhyaWZ0QXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgYmFzZVVyaSA9IG5ldyBVcmkoc3RyaW5nLkZvcm1hdCgiezB9Oi8vezF9ezJ9IiwgUmVxdWVzdC5VcmwuU2NoZW1lLCBSZXF1ZXN0LlVybC5BdXRob3JpdHksCisgICAgICAgICAgICAgICAgVXJsLkNvbnRlbnQoIn4iKSkpOworCisgICAgICAgICAgICBTZWNvbmRTZXJ2aWNlLklBc3luYyBhc3luY1NlcnZpY2UgPQorICAgICAgICAgICAgICAgIG5ldyBTZWNvbmRTZXJ2aWNlLkNsaWVudChuZXcgVEJpbmFyeVByb3RvY29sKG5ldyBUSHR0cENsaWVudChuZXcgVXJpKGJhc2VVcmksICJBc3luYy50aHJpZnQiKSkpKTsKKworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGFzeW5jU2VydmljZS5zZWNvbmR0ZXN0U3RyaW5nQXN5bmMoIlRlc3RTdHJpbmciKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gInRlc3RTdHJpbmcoXCJUZXN0U3RyaW5nXCIpIikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJUaGUgd3JvbmcgcmVzdWx0IHdhcyByZXR1cm5lZCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gUmVkaXJlY3RUb0FjdGlvbigiSW5kZXgiKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBBY3Rpb25SZXN1bHQgVGVzdFRocmlmdFN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgYmFzZVVyaSA9IG5ldyBVcmkoc3RyaW5nLkZvcm1hdCgiezB9Oi8vezF9ezJ9IiwgUmVxdWVzdC5VcmwuU2NoZW1lLCBSZXF1ZXN0LlVybC5BdXRob3JpdHksCisgICAgICAgICAgICAgICAgVXJsLkNvbnRlbnQoIn4iKSkpOworCisgICAgICAgICAgICBTZWNvbmRTZXJ2aWNlLklTeW5jIHNlcnZpY2UgPQorICAgICAgICAgICAgICAgIG5ldyBTZWNvbmRTZXJ2aWNlLkNsaWVudChuZXcgVEJpbmFyeVByb3RvY29sKG5ldyBUSHR0cENsaWVudChuZXcgVXJpKGJhc2VVcmksICJTeW5jLnRocmlmdCIpKSkpOworCisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gc2VydmljZS5zZWNvbmR0ZXN0U3RyaW5nKCJUZXN0U3RyaW5nIik7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9ICJ0ZXN0U3RyaW5nKFwiVGVzdFN0cmluZ1wiKSIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVGhlIHdyb25nIHJlc3VsdCB3YXMgcmV0dXJuZWQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIFJlZGlyZWN0VG9BY3Rpb24oIkluZGV4Iik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9HbG9iYWwuYXNheCBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L0dsb2JhbC5hc2F4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYjY4OGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9HbG9iYWwuYXNheApAQCAtMCwwICsxLDE5IEBACivvu788JUAgQXBwbGljYXRpb24gQ29kZWJlaGluZD0iR2xvYmFsLmFzYXguY3MiIEluaGVyaXRzPSJUaHJpZnRNVkNUZXN0Lk12Y0FwcGxpY2F0aW9uIiBMYW5ndWFnZT0iQyMiICU+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9HbG9iYWwuYXNheC5jcyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L0dsb2JhbC5hc2F4LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NzMxZWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9HbG9iYWwuYXNheC5jcwpAQCAtMCwwICsxLDM0IEBACivvu78vKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW0uV2ViLk12YzsKK3VzaW5nIFN5c3RlbS5XZWIuUm91dGluZzsKKworbmFtZXNwYWNlIFRocmlmdE1WQ1Rlc3QKK3sKKyAgICBwdWJsaWMgY2xhc3MgTXZjQXBwbGljYXRpb24gOiBTeXN0ZW0uV2ViLkh0dHBBcHBsaWNhdGlvbgorICAgIHsKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgQXBwbGljYXRpb25fU3RhcnQoKQorICAgICAgICB7CisgICAgICAgICAgICBBcmVhUmVnaXN0cmF0aW9uLlJlZ2lzdGVyQWxsQXJlYXMoKTsKKyAgICAgICAgICAgIEZpbHRlckNvbmZpZy5SZWdpc3Rlckdsb2JhbEZpbHRlcnMoR2xvYmFsRmlsdGVycy5GaWx0ZXJzKTsKKyAgICAgICAgICAgIFJvdXRlQ29uZmlnLlJlZ2lzdGVyUm91dGVzKFJvdXRlVGFibGUuUm91dGVzKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZlODg5NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCkBAIC0wLDAgKzEsNTMgQEAKK++7vy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOworCisvLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nCisvLyBzZXQgb2YgYXR0cmlidXRlcy4gQ2hhbmdlIHRoZXNlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbW9kaWZ5IHRoZSBpbmZvcm1hdGlvbgorLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGFzc2VtYmx5LgorW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJUaHJpZnRNVkNUZXN0IildCitbYXNzZW1ibHk6IEFzc2VtYmx5RGVzY3JpcHRpb24oIkEgd2ViIHByb2plY3QgZm9yIHRlc3RpbmcgdGhlIHRocmlmdCBBU1AuTkVUIGZlYXR1cmVzLiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIlRocmlmdCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDdWx0dXJlKCIiKV0KKworLy8gU2V0dGluZyBDb21WaXNpYmxlIHRvIGZhbHNlIG1ha2VzIHRoZSB0eXBlcyBpbiB0aGlzIGFzc2VtYmx5IG5vdCB2aXNpYmxlCisvLyB0byBDT00gY29tcG9uZW50cy4gIElmIHlvdSBuZWVkIHRvIGFjY2VzcyBhIHR5cGUgaW4gdGhpcyBhc3NlbWJseSBmcm9tCisvLyBDT00sIHNldCB0aGUgQ29tVmlzaWJsZSBhdHRyaWJ1dGUgdG8gdHJ1ZSBvbiB0aGF0IHR5cGUuCitbYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQorCisvLyBUaGUgZm9sbG93aW5nIEdVSUQgaXMgZm9yIHRoZSBJRCBvZiB0aGUgdHlwZWxpYiBpZiB0aGlzIHByb2plY3QgaXMgZXhwb3NlZCB0byBDT00KK1thc3NlbWJseTogR3VpZCgiMzY2ZjliZDAtM2MwZS00OGFhLWIyY2EtNjFmZDRhOTNlNDI3IildCisKKy8vIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yIGFuIGFzc2VtYmx5IGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgZm91ciB2YWx1ZXM6CisvLworLy8gICAgICBNYWpvciBWZXJzaW9uCisvLyAgICAgIE1pbm9yIFZlcnNpb24KKy8vICAgICAgQnVpbGQgTnVtYmVyCisvLyAgICAgIFJldmlzaW9uCisvLworLy8gWW91IGNhbiBzcGVjaWZ5IGFsbCB0aGUgdmFsdWVzIG9yIHlvdSBjYW4gZGVmYXVsdCB0aGUgQnVpbGQgYW5kIFJldmlzaW9uIE51bWJlcnMKKy8vIGJ5IHVzaW5nIHRoZSAnKicgYXMgc2hvd24gYmVsb3c6CitbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLjAuMCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUZpbGVWZXJzaW9uKCIxLjAuMC4wIildCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9TZWNvbmRTZXJ2aWNlSW1wbC5jcyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1NlY29uZFNlcnZpY2VJbXBsLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZDMwMWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9TZWNvbmRTZXJ2aWNlSW1wbC5jcwpAQCAtMCwwICsxLDM3IEBACivvu78vKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgVGhyaWZ0LlRlc3Q7CisKK25hbWVzcGFjZSBUaHJpZnRNVkNUZXN0Cit7CisgICAgcHVibGljIGNsYXNzIFNlY29uZFNlcnZpY2VJbXBsIDogU2Vjb25kU2VydmljZS5JQXN5bmMsIFNlY29uZFNlcnZpY2UuSVN5bmMKKyAgICB7CisgICAgICAgIHB1YmxpYyBUYXNrPHN0cmluZz4gc2Vjb25kdGVzdFN0cmluZ0FzeW5jKHN0cmluZyB0aGluZykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdCh0aGluZyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RyaW5nIHNlY29uZHRlc3RTdHJpbmcoc3RyaW5nIHRoaW5nKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gInRlc3RTdHJpbmcoXCIiICsgdGhpbmcgKyAiXCIpIjsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1N5bmNIdHRwSGFuZGxlci5jcyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1N5bmNIdHRwSGFuZGxlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmUyNjYyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvU3luY0h0dHBIYW5kbGVyLmNzCkBAIC0wLDAgKzEsMzIgQEAKK++7vy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnQ7CisKK25hbWVzcGFjZSBUaHJpZnRNVkNUZXN0Cit7CisgICAgcHVibGljIGNsYXNzIFN5bmNIdHRwSGFuZGxlciA6IFRIdHRwSGFuZGxlcgorICAgIHsKKyAgICAgICAgcHVibGljIFN5bmNIdHRwSGFuZGxlcigpCisgICAgICAgICAgICA6IGJhc2UoCisgICAgICAgICAgICAgICAgbmV3IFRocmlmdC5UZXN0LlNlY29uZFNlcnZpY2UuUHJvY2Vzc29yKG5ldyBTZWNvbmRTZXJ2aWNlSW1wbCgpKSkKKyAgICAgICAgeworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1RocmlmdE1WQ1Rlc3QuY3Nwcm9qIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvVGhyaWZ0TVZDVGVzdC5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGViOTY5YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1RocmlmdE1WQ1Rlc3QuY3Nwcm9qCkBAIC0wLDAgKzEsMjAwIEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPFByb2plY3QgVG9vbHNWZXJzaW9uPSIxMi4wIiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZEV4dGVuc2lvbnNQYXRoKVwkKE1TQnVpbGRUb29sc1ZlcnNpb24pXE1pY3Jvc29mdC5Db21tb24ucHJvcHMiIENvbmRpdGlvbj0iRXhpc3RzKCckKE1TQnVpbGRFeHRlbnNpb25zUGF0aClcJChNU0J1aWxkVG9vbHNWZXJzaW9uKVxNaWNyb3NvZnQuQ29tbW9uLnByb3BzJykiIC8+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPgorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4KKyAgICA8UHJvZHVjdFZlcnNpb24+CisgICAgPC9Qcm9kdWN0VmVyc2lvbj4KKyAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+CisgICAgPFByb2plY3RHdWlkPns4OTFCNDQ4Ny1DN0JBLTQyN0UtQkJDOC00QzU5NkMyMjlBMTB9PC9Qcm9qZWN0R3VpZD4KKyAgICA8UHJvamVjdFR5cGVHdWlkcz57MzQ5YzU4NTEtNjVkZi0xMWRhLTkzODQtMDAwNjViODQ2ZjIxfTt7ZmFlMDRlYzAtMzAxZi0xMWQzLWJmNGItMDBjMDRmNzllZmJjfTwvUHJvamVjdFR5cGVHdWlkcz4KKyAgICA8T3V0cHV0VHlwZT5MaWJyYXJ5PC9PdXRwdXRUeXBlPgorICAgIDxBcHBEZXNpZ25lckZvbGRlcj5Qcm9wZXJ0aWVzPC9BcHBEZXNpZ25lckZvbGRlcj4KKyAgICA8Um9vdE5hbWVzcGFjZT5UaHJpZnRNVkNUZXN0PC9Sb290TmFtZXNwYWNlPgorICAgIDxBc3NlbWJseU5hbWU+VGhyaWZ0TVZDVGVzdDwvQXNzZW1ibHlOYW1lPgorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnY0LjU8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+CisgICAgPE12Y0J1aWxkVmlld3M+ZmFsc2U8L012Y0J1aWxkVmlld3M+CisgICAgPFVzZUlJU0V4cHJlc3M+dHJ1ZTwvVXNlSUlTRXhwcmVzcz4KKyAgICA8SUlTRXhwcmVzc1NTTFBvcnQgLz4KKyAgICA8SUlTRXhwcmVzc0Fub255bW91c0F1dGhlbnRpY2F0aW9uIC8+CisgICAgPElJU0V4cHJlc3NXaW5kb3dzQXV0aGVudGljYXRpb24gLz4KKyAgICA8SUlTRXhwcmVzc1VzZUNsYXNzaWNQaXBlbGluZU1vZGUgLz4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblw8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+CisgICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblw8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuQ1NoYXJwIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkRhdGEiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uRHJhd2luZyIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XZWIuRHluYW1pY0RhdGEiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uV2ViLkVudGl0eSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XZWIuQXBwbGljYXRpb25TZXJ2aWNlcyIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5Db21wb25lbnRNb2RlbC5EYXRhQW5ub3RhdGlvbnMiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uQ29yZSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5EYXRhLkRhdGFTZXRFeHRlbnNpb25zIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbC5MaW5xIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldlYiIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XZWIuRXh0ZW5zaW9ucyIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XZWIuQWJzdHJhY3Rpb25zIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldlYi5Sb3V0aW5nIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbCIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5Db25maWd1cmF0aW9uIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldlYi5TZXJ2aWNlcyIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5FbnRlcnByaXNlU2VydmljZXMiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuV2ViLkluZnJhc3RydWN0dXJlLCBWZXJzaW9uPTEuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFiZjM4NTZhZDM2NGUzNSwgcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPU1TSUwiPgorICAgICAgPFByaXZhdGU+VHJ1ZTwvUHJpdmF0ZT4KKyAgICAgIDxIaW50UGF0aD4uLlxwYWNrYWdlc1xNaWNyb3NvZnQuV2ViLkluZnJhc3RydWN0dXJlLjEuMC4wLjBcbGliXG5ldDQwXE1pY3Jvc29mdC5XZWIuSW5mcmFzdHJ1Y3R1cmUuZGxsPC9IaW50UGF0aD4KKyAgICA8L1JlZmVyZW5jZT4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5OZXQuSHR0cCI+CisgICAgPC9SZWZlcmVuY2U+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uTmV0Lkh0dHAuV2ViUmVxdWVzdCI+CisgICAgPC9SZWZlcmVuY2U+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uV2ViLkhlbHBlcnMsIFZlcnNpb249My4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1LCBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9TVNJTCI+CisgICAgICA8UHJpdmF0ZT5UcnVlPC9Qcml2YXRlPgorICAgICAgPEhpbnRQYXRoPi4uXHBhY2thZ2VzXE1pY3Jvc29mdC5Bc3BOZXQuV2ViUGFnZXMuMy4yLjNcbGliXG5ldDQ1XFN5c3RlbS5XZWIuSGVscGVycy5kbGw8L0hpbnRQYXRoPgorICAgIDwvUmVmZXJlbmNlPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldlYi5NdmMsIFZlcnNpb249NS4yLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1LCBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9TVNJTCI+CisgICAgICA8UHJpdmF0ZT5UcnVlPC9Qcml2YXRlPgorICAgICAgPEhpbnRQYXRoPi4uXHBhY2thZ2VzXE1pY3Jvc29mdC5Bc3BOZXQuTXZjLjUuMi4zXGxpYlxuZXQ0NVxTeXN0ZW0uV2ViLk12Yy5kbGw8L0hpbnRQYXRoPgorICAgIDwvUmVmZXJlbmNlPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldlYi5SYXpvciwgVmVyc2lvbj0zLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUsIHByb2Nlc3NvckFyY2hpdGVjdHVyZT1NU0lMIj4KKyAgICAgIDxQcml2YXRlPlRydWU8L1ByaXZhdGU+CisgICAgICA8SGludFBhdGg+Li5ccGFja2FnZXNcTWljcm9zb2Z0LkFzcE5ldC5SYXpvci4zLjIuM1xsaWJcbmV0NDVcU3lzdGVtLldlYi5SYXpvci5kbGw8L0hpbnRQYXRoPgorICAgIDwvUmVmZXJlbmNlPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldlYi5XZWJQYWdlcywgVmVyc2lvbj0zLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUsIHByb2Nlc3NvckFyY2hpdGVjdHVyZT1NU0lMIj4KKyAgICAgIDxQcml2YXRlPlRydWU8L1ByaXZhdGU+CisgICAgICA8SGludFBhdGg+Li5ccGFja2FnZXNcTWljcm9zb2Z0LkFzcE5ldC5XZWJQYWdlcy4zLjIuM1xsaWJcbmV0NDVcU3lzdGVtLldlYi5XZWJQYWdlcy5kbGw8L0hpbnRQYXRoPgorICAgIDwvUmVmZXJlbmNlPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldlYi5XZWJQYWdlcy5EZXBsb3ltZW50LCBWZXJzaW9uPTMuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFiZjM4NTZhZDM2NGUzNSwgcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPU1TSUwiPgorICAgICAgPFByaXZhdGU+VHJ1ZTwvUHJpdmF0ZT4KKyAgICAgIDxIaW50UGF0aD4uLlxwYWNrYWdlc1xNaWNyb3NvZnQuQXNwTmV0LldlYlBhZ2VzLjMuMi4zXGxpYlxuZXQ0NVxTeXN0ZW0uV2ViLldlYlBhZ2VzLkRlcGxveW1lbnQuZGxsPC9IaW50UGF0aD4KKyAgICA8L1JlZmVyZW5jZT4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XZWIuV2ViUGFnZXMuUmF6b3IsIFZlcnNpb249My4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1LCBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9TVNJTCI+CisgICAgICA8UHJpdmF0ZT5UcnVlPC9Qcml2YXRlPgorICAgICAgPEhpbnRQYXRoPi4uXHBhY2thZ2VzXE1pY3Jvc29mdC5Bc3BOZXQuV2ViUGFnZXMuMy4yLjNcbGliXG5ldDQ1XFN5c3RlbS5XZWIuV2ViUGFnZXMuUmF6b3IuZGxsPC9IaW50UGF0aD4KKyAgICA8L1JlZmVyZW5jZT4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlRocmlmdEltcGwiPgorICAgICAgPEhpbnRQYXRoPi5cVGhyaWZ0SW1wbC5kbGw8L0hpbnRQYXRoPgorICAgIDwvUmVmZXJlbmNlPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBcHBfU3RhcnRcRmlsdGVyQ29uZmlnLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkFwcF9TdGFydFxSb3V0ZUNvbmZpZy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTeW5jSHR0cEhhbmRsZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQXN5bmNIdHRwSGFuZGxlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb250cm9sbGVyc1xIb21lQ29udHJvbGxlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJHbG9iYWwuYXNheC5jcyI+CisgICAgICA8RGVwZW5kZW50VXBvbj5HbG9iYWwuYXNheDwvRGVwZW5kZW50VXBvbj4KKyAgICA8L0NvbXBpbGU+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU2Vjb25kU2VydmljZUltcGwuY3MiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDb250ZW50IEluY2x1ZGU9ImZhdmljb24uaWNvIiAvPgorICAgIDxDb250ZW50IEluY2x1ZGU9Ikdsb2JhbC5hc2F4IiAvPgorICAgIDxDb250ZW50IEluY2x1ZGU9IldlYi5jb25maWciIC8+CisgICAgPENvbnRlbnQgSW5jbHVkZT0iV2ViLkRlYnVnLmNvbmZpZyI+CisgICAgICA8RGVwZW5kZW50VXBvbj5XZWIuY29uZmlnPC9EZXBlbmRlbnRVcG9uPgorICAgIDwvQ29udGVudD4KKyAgICA8Q29udGVudCBJbmNsdWRlPSJXZWIuUmVsZWFzZS5jb25maWciPgorICAgICAgPERlcGVuZGVudFVwb24+V2ViLmNvbmZpZzwvRGVwZW5kZW50VXBvbj4KKyAgICA8L0NvbnRlbnQ+CisgICAgPENvbnRlbnQgSW5jbHVkZT0iVmlld3NcV2ViLmNvbmZpZyIgLz4KKyAgICA8Q29udGVudCBJbmNsdWRlPSJWaWV3c1xfVmlld1N0YXJ0LmNzaHRtbCIgLz4KKyAgICA8Q29udGVudCBJbmNsdWRlPSJWaWV3c1xTaGFyZWRcX0xheW91dC5jc2h0bWwiIC8+CisgICAgPENvbnRlbnQgSW5jbHVkZT0iVmlld3NcSG9tZVxJbmRleC5jc2h0bWwiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxGb2xkZXIgSW5jbHVkZT0iQXBwX0RhdGFcIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q29udGVudCBJbmNsdWRlPSJwYWNrYWdlcy5jb25maWciPgorICAgICAgPFN1YlR5cGU+RGVzaWduZXI8L1N1YlR5cGU+CisgICAgPC9Db250ZW50PgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlxzcmNcVGhyaWZ0LjQ1LmNzcHJvaiI+CisgICAgICA8UHJvamVjdD57ZWJjZTM1ZGEtY2Y2YS00MmJjLWEzNTctYTljMDliNTM0Mjk5fTwvUHJvamVjdD4KKyAgICAgIDxOYW1lPlRocmlmdC40NTwvTmFtZT4KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+CisgIDwvSXRlbUdyb3VwPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8VmlzdWFsU3R1ZGlvVmVyc2lvbiBDb25kaXRpb249IickKFZpc3VhbFN0dWRpb1ZlcnNpb24pJyA9PSAnJyI+MTAuMDwvVmlzdWFsU3R1ZGlvVmVyc2lvbj4KKyAgICA8VlNUb29sc1BhdGggQ29uZGl0aW9uPSInJChWU1Rvb2xzUGF0aCknID09ICcnIj4kKE1TQnVpbGRFeHRlbnNpb25zUGF0aDMyKVxNaWNyb3NvZnRcVmlzdWFsU3R1ZGlvXHYkKFZpc3VhbFN0dWRpb1ZlcnNpb24pPC9WU1Rvb2xzUGF0aD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZEJpblBhdGgpXE1pY3Jvc29mdC5DU2hhcnAudGFyZ2V0cyIgLz4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZTVG9vbHNQYXRoKVxXZWJBcHBsaWNhdGlvbnNcTWljcm9zb2Z0LldlYkFwcGxpY2F0aW9uLnRhcmdldHMiIENvbmRpdGlvbj0iJyQoVlNUb29sc1BhdGgpJyAhPSAnJyIgLz4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRFeHRlbnNpb25zUGF0aDMyKVxNaWNyb3NvZnRcVmlzdWFsU3R1ZGlvXHYxMC4wXFdlYkFwcGxpY2F0aW9uc1xNaWNyb3NvZnQuV2ViQXBwbGljYXRpb24udGFyZ2V0cyIgQ29uZGl0aW9uPSJmYWxzZSIgLz4KKyAgPFRhcmdldCBOYW1lPSJNdmNCdWlsZFZpZXdzIiBBZnRlclRhcmdldHM9IkFmdGVyQnVpbGQiIENvbmRpdGlvbj0iJyQoTXZjQnVpbGRWaWV3cyknPT0ndHJ1ZSciPgorICAgIDxBc3BOZXRDb21waWxlciBWaXJ0dWFsUGF0aD0idGVtcCIgUGh5c2ljYWxQYXRoPSIkKFdlYlByb2plY3RPdXRwdXREaXIpIiAvPgorICA8L1RhcmdldD4KKyAgPFByb2plY3RFeHRlbnNpb25zPgorICAgIDxWaXN1YWxTdHVkaW8+CisgICAgICA8Rmxhdm9yUHJvcGVydGllcyBHVUlEPSJ7MzQ5YzU4NTEtNjVkZi0xMWRhLTkzODQtMDAwNjViODQ2ZjIxfSI+CisgICAgICAgIDxXZWJQcm9qZWN0UHJvcGVydGllcz4KKyAgICAgICAgICA8VXNlSUlTPlRydWU8L1VzZUlJUz4KKyAgICAgICAgICA8QXV0b0Fzc2lnblBvcnQ+VHJ1ZTwvQXV0b0Fzc2lnblBvcnQ+CisgICAgICAgICAgPERldmVsb3BtZW50U2VydmVyUG9ydD41NzQ4MjwvRGV2ZWxvcG1lbnRTZXJ2ZXJQb3J0PgorICAgICAgICAgIDxEZXZlbG9wbWVudFNlcnZlclZQYXRoPi88L0RldmVsb3BtZW50U2VydmVyVlBhdGg+CisgICAgICAgICAgPElJU1VybD5odHRwOi8vbG9jYWxob3N0OjU3NDgyLzwvSUlTVXJsPgorICAgICAgICAgIDxOVExNQXV0aGVudGljYXRpb24+RmFsc2U8L05UTE1BdXRoZW50aWNhdGlvbj4KKyAgICAgICAgICA8VXNlQ3VzdG9tU2VydmVyPkZhbHNlPC9Vc2VDdXN0b21TZXJ2ZXI+CisgICAgICAgICAgPEN1c3RvbVNlcnZlclVybD4KKyAgICAgICAgICA8L0N1c3RvbVNlcnZlclVybD4KKyAgICAgICAgICA8U2F2ZVNlcnZlclNldHRpbmdzSW5Vc2VyRmlsZT5GYWxzZTwvU2F2ZVNlcnZlclNldHRpbmdzSW5Vc2VyRmlsZT4KKyAgICAgICAgPC9XZWJQcm9qZWN0UHJvcGVydGllcz4KKyAgICAgIDwvRmxhdm9yUHJvcGVydGllcz4KKyAgICA8L1Zpc3VhbFN0dWRpbz4KKyAgPC9Qcm9qZWN0RXh0ZW5zaW9ucz4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPFByZUJ1aWxkRXZlbnQ+cm1kaXIgL3MgL3EgIiQoUHJvamVjdERpcilnZW4tY3NoYXJwIgorZGVsIC9mIC9xICIkKFByb2plY3REaXIpVGhyaWZ0SW1wbC5kbGwiCitTRVQgT1VUUFVUX0RJUj0kKFByb2plY3REaXIpCitTRVQgVEhSSUZUX0ZJTEU9JChQcm9qZWN0RGlyKVwuLlwuLlwuLlwuLlx0ZXN0XFRocmlmdFRlc3QudGhyaWZ0Citmb3IgJTI1JTI1SSBpbiAoIiUyNU9VVFBVVF9ESVIlMjUiKSBkbyBzZXQgU0hPUlRfRElSPSUyNSUyNX5mc0kKK2ZvciAlMjUlMjVJIGluICgiJTI1VEhSSUZUX0ZJTEUlMjUiKSBkbyBzZXQgVEhSSUZUX1NIT1JUPSUyNSUyNX5mc0kKKyIkKFByb2plY3REaXIpXC4uXC4uXC4uXC4uXGNvbXBpbGVyXGNwcFxEZWJ1Z1x0aHJpZnQuZXhlIiAtLWdlbiBjc2hhcnA6YXN5bmM9dHJ1ZSAtbyAlMjVTSE9SVF9ESVIlMjUgJTI1VEhSSUZUX1NIT1JUJTI1CisiJChNU0J1aWxkVG9vbHNQYXRoKVxDc2MuZXhlIiAvdDpsaWJyYXJ5IC9vdXQ6IiQoUHJvamVjdERpcilUaHJpZnRJbXBsLmRsbCIgL3JlY3Vyc2U6IiQoUHJvamVjdERpcilnZW4tY3NoYXJwIlwqIC9yZWZlcmVuY2U6IiQoUHJvamVjdERpcikuLlwuLlxzcmNcYmluXERlYnVnXFRocmlmdDQ1LmRsbCI8L1ByZUJ1aWxkRXZlbnQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4KKyAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPgorICA8L1RhcmdldD4KKyAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4KKyAgPC9UYXJnZXQ+IC0tPgorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1ZpZXdzL0hvbWUvSW5kZXguY3NodG1sIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvVmlld3MvSG9tZS9JbmRleC5jc2h0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBjYTdkYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1ZpZXdzL0hvbWUvSW5kZXguY3NodG1sCkBAIC0wLDAgKzEsMjUgQEAKK++7v0AqCisgICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICAgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgICAgdW5kZXIgdGhlIExpY2Vuc2UuCisqQAorCitAeworICAgIFZpZXdCYWcuVGl0bGUgPSAiSG9tZSBQYWdlIjsKK30KKworPHA+QEh0bWwuQWN0aW9uTGluaygiVGVzdCBUaHJpZnQgQXN5bmMgU2VydmljZSIsICJUZXN0VGhyaWZ0QXN5bmMiKTwvcD4KKzxwPkBIdG1sLkFjdGlvbkxpbmsoIlRlc3QgVGhyaWZ0IFN5bmMgU2VydmljZSIsICJUZXN0VGhyaWZ0U3luYyIpPC9wPgpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvVmlld3MvU2hhcmVkL19MYXlvdXQuY3NodG1sIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvVmlld3MvU2hhcmVkL19MYXlvdXQuY3NodG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MWM5OWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9WaWV3cy9TaGFyZWQvX0xheW91dC5jc2h0bWwKQEAgLTAsMCArMSwzMCBAQAor77u/QCoKKyAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgICAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAgICB1bmRlciB0aGUgTGljZW5zZS4KKypACisKKzwhRE9DVFlQRSBodG1sPgorPGh0bWw+Cis8aGVhZD4KKyAgICA8bWV0YSBjaGFyc2V0PSJ1dGYtOCIgLz4KKyAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCI+CisgICAgPHRpdGxlPlRocmlmdCBBU1AuTkVUIFRlc3Q8L3RpdGxlPgorPC9oZWFkPgorPGJvZHk+CisgICAgQFJlbmRlckJvZHkoKQorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvVmlld3MvV2ViLmNvbmZpZyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1ZpZXdzL1dlYi5jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MyMTEzOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1ZpZXdzL1dlYi5jb25maWcKQEAgLTAsMCArMSw2MCBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29uZmlndXJhdGlvbj4KKyAgPGNvbmZpZ1NlY3Rpb25zPgorICAgIDxzZWN0aW9uR3JvdXAgbmFtZT0ic3lzdGVtLndlYi53ZWJQYWdlcy5yYXpvciIgdHlwZT0iU3lzdGVtLldlYi5XZWJQYWdlcy5SYXpvci5Db25maWd1cmF0aW9uLlJhem9yV2ViU2VjdGlvbkdyb3VwLCBTeXN0ZW0uV2ViLldlYlBhZ2VzLlJhem9yLCBWZXJzaW9uPTMuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFCRjM4NTZBRDM2NEUzNSI+CisgICAgICA8c2VjdGlvbiBuYW1lPSJob3N0IiB0eXBlPSJTeXN0ZW0uV2ViLldlYlBhZ2VzLlJhem9yLkNvbmZpZ3VyYXRpb24uSG9zdFNlY3Rpb24sIFN5c3RlbS5XZWIuV2ViUGFnZXMuUmF6b3IsIFZlcnNpb249My4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMUJGMzg1NkFEMzY0RTM1IiByZXF1aXJlUGVybWlzc2lvbj0iZmFsc2UiIC8+CisgICAgICA8c2VjdGlvbiBuYW1lPSJwYWdlcyIgdHlwZT0iU3lzdGVtLldlYi5XZWJQYWdlcy5SYXpvci5Db25maWd1cmF0aW9uLlJhem9yUGFnZXNTZWN0aW9uLCBTeXN0ZW0uV2ViLldlYlBhZ2VzLlJhem9yLCBWZXJzaW9uPTMuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFCRjM4NTZBRDM2NEUzNSIgcmVxdWlyZVBlcm1pc3Npb249ImZhbHNlIiAvPgorICAgIDwvc2VjdGlvbkdyb3VwPgorICA8L2NvbmZpZ1NlY3Rpb25zPgorCisgIDxzeXN0ZW0ud2ViLndlYlBhZ2VzLnJhem9yPgorICAgIDxob3N0IGZhY3RvcnlUeXBlPSJTeXN0ZW0uV2ViLk12Yy5NdmNXZWJSYXpvckhvc3RGYWN0b3J5LCBTeXN0ZW0uV2ViLk12YywgVmVyc2lvbj01LjIuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxQkYzODU2QUQzNjRFMzUiIC8+CisgICAgPHBhZ2VzIHBhZ2VCYXNlVHlwZT0iU3lzdGVtLldlYi5NdmMuV2ViVmlld1BhZ2UiPgorICAgICAgPG5hbWVzcGFjZXM+CisgICAgICAgIDxhZGQgbmFtZXNwYWNlPSJTeXN0ZW0uV2ViLk12YyIgLz4KKyAgICAgICAgPGFkZCBuYW1lc3BhY2U9IlN5c3RlbS5XZWIuTXZjLkFqYXgiIC8+CisgICAgICAgIDxhZGQgbmFtZXNwYWNlPSJTeXN0ZW0uV2ViLk12Yy5IdG1sIiAvPgorICAgICAgICA8YWRkIG5hbWVzcGFjZT0iU3lzdGVtLldlYi5PcHRpbWl6YXRpb24iLz4KKyAgICAgICAgPGFkZCBuYW1lc3BhY2U9IlN5c3RlbS5XZWIuUm91dGluZyIgLz4KKyAgICAgICAgPGFkZCBuYW1lc3BhY2U9IlRocmlmdE1WQ1Rlc3QiIC8+CisgICAgICA8L25hbWVzcGFjZXM+CisgICAgPC9wYWdlcz4KKyAgPC9zeXN0ZW0ud2ViLndlYlBhZ2VzLnJhem9yPgorCisgIDxhcHBTZXR0aW5ncz4KKyAgICA8YWRkIGtleT0id2VicGFnZXM6RW5hYmxlZCIgdmFsdWU9ImZhbHNlIiAvPgorICA8L2FwcFNldHRpbmdzPgorCisgIDxzeXN0ZW0ud2ViU2VydmVyPgorICAgIDxoYW5kbGVycz4KKyAgICAgIDxyZW1vdmUgbmFtZT0iQmxvY2tWaWV3SGFuZGxlciIvPgorICAgICAgPGFkZCBuYW1lPSJCbG9ja1ZpZXdIYW5kbGVyIiBwYXRoPSIqIiB2ZXJiPSIqIiBwcmVDb25kaXRpb249ImludGVncmF0ZWRNb2RlIiB0eXBlPSJTeXN0ZW0uV2ViLkh0dHBOb3RGb3VuZEhhbmRsZXIiIC8+CisgICAgPC9oYW5kbGVycz4KKyAgPC9zeXN0ZW0ud2ViU2VydmVyPgorCisgIDxzeXN0ZW0ud2ViPgorICAgIDxjb21waWxhdGlvbj4KKyAgICAgIDxhc3NlbWJsaWVzPgorICAgICAgICA8YWRkIGFzc2VtYmx5PSJTeXN0ZW0uV2ViLk12YywgVmVyc2lvbj01LjIuMy4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxQkYzODU2QUQzNjRFMzUiIC8+CisgICAgICA8L2Fzc2VtYmxpZXM+CisgICAgPC9jb21waWxhdGlvbj4KKyAgPC9zeXN0ZW0ud2ViPgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvVmlld3MvX1ZpZXdTdGFydC5jc2h0bWwgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9WaWV3cy9fVmlld1N0YXJ0LmNzaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2RlMmVlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvVmlld3MvX1ZpZXdTdGFydC5jc2h0bWwKQEAgLTAsMCArMSwyMiBAQAor77u/QCoKKyAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgICAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAgICB1bmRlciB0aGUgTGljZW5zZS4KKypACisKK0B7CisgICAgTGF5b3V0ID0gIn4vVmlld3MvU2hhcmVkL19MYXlvdXQuY3NodG1sIjsKK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1dlYi5EZWJ1Zy5jb25maWcgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9XZWIuRGVidWcuY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ZDU2ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9XZWIuRGVidWcuY29uZmlnCkBAIC0wLDAgKzEsNDUgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24geG1sbnM6eGR0PSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL1hNTC1Eb2N1bWVudC1UcmFuc2Zvcm0iPgorICA8IS0tCisgICAgSW4gdGhlIGV4YW1wbGUgYmVsb3csIHRoZSAiU2V0QXR0cmlidXRlcyIgdHJhbnNmb3JtIHdpbGwgY2hhbmdlIHRoZSB2YWx1ZSBvZgorICAgICJjb25uZWN0aW9uU3RyaW5nIiB0byB1c2UgIlJlbGVhc2VTUUxTZXJ2ZXIiIG9ubHkgd2hlbiB0aGUgIk1hdGNoIiBsb2NhdG9yCisgICAgZmluZHMgYW4gYXR0cmlidXRlICJuYW1lIiB0aGF0IGhhcyBhIHZhbHVlIG9mICJNeURCIi4KKworICAgIDxjb25uZWN0aW9uU3RyaW5ncz4KKyAgICAgIDxhZGQgbmFtZT0iTXlEQiIKKyAgICAgICAgY29ubmVjdGlvblN0cmluZz0iRGF0YSBTb3VyY2U9UmVsZWFzZVNRTFNlcnZlcjtJbml0aWFsIENhdGFsb2c9TXlSZWxlYXNlREI7SW50ZWdyYXRlZCBTZWN1cml0eT1UcnVlIgorICAgICAgICB4ZHQ6VHJhbnNmb3JtPSJTZXRBdHRyaWJ1dGVzIiB4ZHQ6TG9jYXRvcj0iTWF0Y2gobmFtZSkiLz4KKyAgICA8L2Nvbm5lY3Rpb25TdHJpbmdzPgorICAtLT4KKyAgPHN5c3RlbS53ZWI+CisgICAgPCEtLQorICAgICAgSW4gdGhlIGV4YW1wbGUgYmVsb3csIHRoZSAiUmVwbGFjZSIgdHJhbnNmb3JtIHdpbGwgcmVwbGFjZSB0aGUgZW50aXJlCisgICAgICA8Y3VzdG9tRXJyb3JzPiBzZWN0aW9uIG9mIHlvdXIgV2ViLmNvbmZpZyBmaWxlLgorICAgICAgTm90ZSB0aGF0IGJlY2F1c2UgdGhlcmUgaXMgb25seSBvbmUgY3VzdG9tRXJyb3JzIHNlY3Rpb24gdW5kZXIgdGhlCisgICAgICA8c3lzdGVtLndlYj4gbm9kZSwgdGhlcmUgaXMgbm8gbmVlZCB0byB1c2UgdGhlICJ4ZHQ6TG9jYXRvciIgYXR0cmlidXRlLgorCisgICAgICA8Y3VzdG9tRXJyb3JzIGRlZmF1bHRSZWRpcmVjdD0iR2VuZXJpY0Vycm9yLmh0bSIKKyAgICAgICAgbW9kZT0iUmVtb3RlT25seSIgeGR0OlRyYW5zZm9ybT0iUmVwbGFjZSI+CisgICAgICAgIDxlcnJvciBzdGF0dXNDb2RlPSI1MDAiIHJlZGlyZWN0PSJJbnRlcm5hbEVycm9yLmh0bSIvPgorICAgICAgPC9jdXN0b21FcnJvcnM+CisgICAgLS0+CisgIDwvc3lzdGVtLndlYj4KKzwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1dlYi5SZWxlYXNlLmNvbmZpZyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1dlYi5SZWxlYXNlLmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTdjMzQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvV2ViLlJlbGVhc2UuY29uZmlnCkBAIC0wLDAgKzEsNDYgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24geG1sbnM6eGR0PSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL1hNTC1Eb2N1bWVudC1UcmFuc2Zvcm0iPgorICA8IS0tCisgICAgSW4gdGhlIGV4YW1wbGUgYmVsb3csIHRoZSAiU2V0QXR0cmlidXRlcyIgdHJhbnNmb3JtIHdpbGwgY2hhbmdlIHRoZSB2YWx1ZSBvZgorICAgICJjb25uZWN0aW9uU3RyaW5nIiB0byB1c2UgIlJlbGVhc2VTUUxTZXJ2ZXIiIG9ubHkgd2hlbiB0aGUgIk1hdGNoIiBsb2NhdG9yCisgICAgZmluZHMgYW4gYXR0cmlidXRlICJuYW1lIiB0aGF0IGhhcyBhIHZhbHVlIG9mICJNeURCIi4KKworICAgIDxjb25uZWN0aW9uU3RyaW5ncz4KKyAgICAgIDxhZGQgbmFtZT0iTXlEQiIKKyAgICAgICAgY29ubmVjdGlvblN0cmluZz0iRGF0YSBTb3VyY2U9UmVsZWFzZVNRTFNlcnZlcjtJbml0aWFsIENhdGFsb2c9TXlSZWxlYXNlREI7SW50ZWdyYXRlZCBTZWN1cml0eT1UcnVlIgorICAgICAgICB4ZHQ6VHJhbnNmb3JtPSJTZXRBdHRyaWJ1dGVzIiB4ZHQ6TG9jYXRvcj0iTWF0Y2gobmFtZSkiLz4KKyAgICA8L2Nvbm5lY3Rpb25TdHJpbmdzPgorICAtLT4KKyAgPHN5c3RlbS53ZWI+CisgICAgPGNvbXBpbGF0aW9uIHhkdDpUcmFuc2Zvcm09IlJlbW92ZUF0dHJpYnV0ZXMoZGVidWcpIiAvPgorICAgIDwhLS0KKyAgICAgIEluIHRoZSBleGFtcGxlIGJlbG93LCB0aGUgIlJlcGxhY2UiIHRyYW5zZm9ybSB3aWxsIHJlcGxhY2UgdGhlIGVudGlyZQorICAgICAgPGN1c3RvbUVycm9ycz4gc2VjdGlvbiBvZiB5b3VyIFdlYi5jb25maWcgZmlsZS4KKyAgICAgIE5vdGUgdGhhdCBiZWNhdXNlIHRoZXJlIGlzIG9ubHkgb25lIGN1c3RvbUVycm9ycyBzZWN0aW9uIHVuZGVyIHRoZQorICAgICAgPHN5c3RlbS53ZWI+IG5vZGUsIHRoZXJlIGlzIG5vIG5lZWQgdG8gdXNlIHRoZSAieGR0OkxvY2F0b3IiIGF0dHJpYnV0ZS4KKworICAgICAgPGN1c3RvbUVycm9ycyBkZWZhdWx0UmVkaXJlY3Q9IkdlbmVyaWNFcnJvci5odG0iCisgICAgICAgIG1vZGU9IlJlbW90ZU9ubHkiIHhkdDpUcmFuc2Zvcm09IlJlcGxhY2UiPgorICAgICAgICA8ZXJyb3Igc3RhdHVzQ29kZT0iNTAwIiByZWRpcmVjdD0iSW50ZXJuYWxFcnJvci5odG0iLz4KKyAgICAgIDwvY3VzdG9tRXJyb3JzPgorICAgIC0tPgorICA8L3N5c3RlbS53ZWI+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9XZWIuY29uZmlnIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvV2ViLmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzU3ZDExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvV2ViLmNvbmZpZwpAQCAtMCwwICsxLDkyIEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorCis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0KKyAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbmZpZ3VyZSB5b3VyIEFTUC5ORVQgYXBwbGljYXRpb24sIHBsZWFzZSB2aXNpdAorICBodHRwOi8vZ28ubWljcm9zb2Z0LmNvbS9md2xpbmsvP0xpbmtJZD0zMDE4ODAKKyAgLS0+Cis8Y29uZmlndXJhdGlvbj4KKyAgPGFwcFNldHRpbmdzPgorICAgIDxhZGQga2V5PSJ3ZWJwYWdlczpWZXJzaW9uIiB2YWx1ZT0iMy4wLjAuMCIgLz4KKyAgICA8YWRkIGtleT0id2VicGFnZXM6RW5hYmxlZCIgdmFsdWU9ImZhbHNlIiAvPgorICAgIDxhZGQga2V5PSJDbGllbnRWYWxpZGF0aW9uRW5hYmxlZCIgdmFsdWU9InRydWUiIC8+CisgICAgPGFkZCBrZXk9IlVub2J0cnVzaXZlSmF2YVNjcmlwdEVuYWJsZWQiIHZhbHVlPSJ0cnVlIiAvPgorICAgIDxhZGQga2V5PSJvd2luOkF1dG9tYXRpY0FwcFN0YXJ0dXAiIHZhbHVlPSJmYWxzZSIgLz4KKyAgPC9hcHBTZXR0aW5ncz4KKyAgPHN5c3RlbS53ZWI+CisgICAgPGF1dGhlbnRpY2F0aW9uIG1vZGU9Ik5vbmUiIC8+CisgICAgPGNvbXBpbGF0aW9uIGRlYnVnPSJ0cnVlIiB0YXJnZXRGcmFtZXdvcms9IjQuNSIgLz4KKyAgICA8aHR0cFJ1bnRpbWUgdGFyZ2V0RnJhbWV3b3JrPSI0LjUiIC8+CisgIDwvc3lzdGVtLndlYj4KKyAgPHN5c3RlbS53ZWJTZXJ2ZXI+CisgICAgPG1vZHVsZXM+CisgICAgICA8cmVtb3ZlIG5hbWU9IkZvcm1zQXV0aGVudGljYXRpb24iIC8+CisgICAgPC9tb2R1bGVzPgorICAgIDxoYW5kbGVycz4KKyAgICAgIDxhZGQgbmFtZT0iQXN5bmNIdHRwSGFuZGxlciIgdmVyYj0iKiIgcGF0aD0iQXN5bmMudGhyaWZ0IiB0eXBlPSJUaHJpZnRNVkNUZXN0LkFzeW5jSHR0cEhhbmRsZXIsIFRocmlmdE1WQ1Rlc3QiIC8+CisgICAgICA8YWRkIG5hbWU9IlN5bmNIdHRwSGFuZGxlciIgdmVyYj0iKiIgcGF0aD0iU3luYy50aHJpZnQiIHR5cGU9IlRocmlmdE1WQ1Rlc3QuU3luY0h0dHBIYW5kbGVyLCBUaHJpZnRNVkNUZXN0IiAvPgorICAgIDwvaGFuZGxlcnM+CisgIDwvc3lzdGVtLndlYlNlcnZlcj4KKyAgPHJ1bnRpbWU+CisgICAgPGFzc2VtYmx5QmluZGluZyB4bWxucz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTphc20udjEiPgorICAgICAgPGRlcGVuZGVudEFzc2VtYmx5PgorICAgICAgICA8YXNzZW1ibHlJZGVudGl0eSBuYW1lPSJNaWNyb3NvZnQuT3dpbi5TZWN1cml0eSIgcHVibGljS2V5VG9rZW49IjMxYmYzODU2YWQzNjRlMzUiIC8+CisgICAgICAgIDxiaW5kaW5nUmVkaXJlY3Qgb2xkVmVyc2lvbj0iMC4wLjAuMC0zLjAuMS4wIiBuZXdWZXJzaW9uPSIzLjAuMS4wIiAvPgorICAgICAgPC9kZXBlbmRlbnRBc3NlbWJseT4KKyAgICAgIDxkZXBlbmRlbnRBc3NlbWJseT4KKyAgICAgICAgPGFzc2VtYmx5SWRlbnRpdHkgbmFtZT0iTWljcm9zb2Z0Lk93aW4uU2VjdXJpdHkuT0F1dGgiIHB1YmxpY0tleVRva2VuPSIzMWJmMzg1NmFkMzY0ZTM1IiAvPgorICAgICAgICA8YmluZGluZ1JlZGlyZWN0IG9sZFZlcnNpb249IjAuMC4wLjAtMy4wLjEuMCIgbmV3VmVyc2lvbj0iMy4wLjEuMCIgLz4KKyAgICAgIDwvZGVwZW5kZW50QXNzZW1ibHk+CisgICAgICA8ZGVwZW5kZW50QXNzZW1ibHk+CisgICAgICAgIDxhc3NlbWJseUlkZW50aXR5IG5hbWU9Ik1pY3Jvc29mdC5Pd2luLlNlY3VyaXR5LkNvb2tpZXMiIHB1YmxpY0tleVRva2VuPSIzMWJmMzg1NmFkMzY0ZTM1IiAvPgorICAgICAgICA8YmluZGluZ1JlZGlyZWN0IG9sZFZlcnNpb249IjAuMC4wLjAtMy4wLjEuMCIgbmV3VmVyc2lvbj0iMy4wLjEuMCIgLz4KKyAgICAgIDwvZGVwZW5kZW50QXNzZW1ibHk+CisgICAgICA8ZGVwZW5kZW50QXNzZW1ibHk+CisgICAgICAgIDxhc3NlbWJseUlkZW50aXR5IG5hbWU9Ik1pY3Jvc29mdC5Pd2luIiBwdWJsaWNLZXlUb2tlbj0iMzFiZjM4NTZhZDM2NGUzNSIgLz4KKyAgICAgICAgPGJpbmRpbmdSZWRpcmVjdCBvbGRWZXJzaW9uPSIwLjAuMC4wLTMuMC4xLjAiIG5ld1ZlcnNpb249IjMuMC4xLjAiIC8+CisgICAgICA8L2RlcGVuZGVudEFzc2VtYmx5PgorICAgICAgPGRlcGVuZGVudEFzc2VtYmx5PgorICAgICAgICA8YXNzZW1ibHlJZGVudGl0eSBuYW1lPSJOZXd0b25zb2Z0Lkpzb24iIGN1bHR1cmU9Im5ldXRyYWwiIHB1YmxpY0tleVRva2VuPSIzMGFkNGZlNmIyYTZhZWVkIiAvPgorICAgICAgICA8YmluZGluZ1JlZGlyZWN0IG9sZFZlcnNpb249IjAuMC4wLjAtNi4wLjAuMCIgbmV3VmVyc2lvbj0iNi4wLjAuMCIgLz4KKyAgICAgIDwvZGVwZW5kZW50QXNzZW1ibHk+CisgICAgICA8ZGVwZW5kZW50QXNzZW1ibHk+CisgICAgICAgIDxhc3NlbWJseUlkZW50aXR5IG5hbWU9IlN5c3RlbS5XZWIuT3B0aW1pemF0aW9uIiBwdWJsaWNLZXlUb2tlbj0iMzFiZjM4NTZhZDM2NGUzNSIgLz4KKyAgICAgICAgPGJpbmRpbmdSZWRpcmVjdCBvbGRWZXJzaW9uPSIxLjAuMC4wLTEuMS4wLjAiIG5ld1ZlcnNpb249IjEuMS4wLjAiIC8+CisgICAgICA8L2RlcGVuZGVudEFzc2VtYmx5PgorICAgICAgPGRlcGVuZGVudEFzc2VtYmx5PgorICAgICAgICA8YXNzZW1ibHlJZGVudGl0eSBuYW1lPSJXZWJHcmVhc2UiIHB1YmxpY0tleVRva2VuPSIzMWJmMzg1NmFkMzY0ZTM1IiAvPgorICAgICAgICA8YmluZGluZ1JlZGlyZWN0IG9sZFZlcnNpb249IjAuMC4wLjAtMS41LjIuMTQyMzQiIG5ld1ZlcnNpb249IjEuNS4yLjE0MjM0IiAvPgorICAgICAgPC9kZXBlbmRlbnRBc3NlbWJseT4KKyAgICAgIDxkZXBlbmRlbnRBc3NlbWJseT4KKyAgICAgICAgPGFzc2VtYmx5SWRlbnRpdHkgbmFtZT0iU3lzdGVtLldlYi5IZWxwZXJzIiBwdWJsaWNLZXlUb2tlbj0iMzFiZjM4NTZhZDM2NGUzNSIgLz4KKyAgICAgICAgPGJpbmRpbmdSZWRpcmVjdCBvbGRWZXJzaW9uPSIxLjAuMC4wLTMuMC4wLjAiIG5ld1ZlcnNpb249IjMuMC4wLjAiIC8+CisgICAgICA8L2RlcGVuZGVudEFzc2VtYmx5PgorICAgICAgPGRlcGVuZGVudEFzc2VtYmx5PgorICAgICAgICA8YXNzZW1ibHlJZGVudGl0eSBuYW1lPSJTeXN0ZW0uV2ViLk12YyIgcHVibGljS2V5VG9rZW49IjMxYmYzODU2YWQzNjRlMzUiIC8+CisgICAgICAgIDxiaW5kaW5nUmVkaXJlY3Qgb2xkVmVyc2lvbj0iMS4wLjAuMC01LjIuMy4wIiBuZXdWZXJzaW9uPSI1LjIuMy4wIiAvPgorICAgICAgPC9kZXBlbmRlbnRBc3NlbWJseT4KKyAgICAgIDxkZXBlbmRlbnRBc3NlbWJseT4KKyAgICAgICAgPGFzc2VtYmx5SWRlbnRpdHkgbmFtZT0iU3lzdGVtLldlYi5XZWJQYWdlcyIgcHVibGljS2V5VG9rZW49IjMxYmYzODU2YWQzNjRlMzUiIC8+CisgICAgICAgIDxiaW5kaW5nUmVkaXJlY3Qgb2xkVmVyc2lvbj0iMS4wLjAuMC0zLjAuMC4wIiBuZXdWZXJzaW9uPSIzLjAuMC4wIiAvPgorICAgICAgPC9kZXBlbmRlbnRBc3NlbWJseT4KKyAgICA8L2Fzc2VtYmx5QmluZGluZz4KKyAgPC9ydW50aW1lPgorPC9jb25maWd1cmF0aW9uPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L2Zhdmljb24uaWNvIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvZmF2aWNvbi5pY28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNhNzk5OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L2Zhdmljb24uaWNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L3BhY2thZ2VzLmNvbmZpZyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L3BhY2thZ2VzLmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGM4NDE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvcGFja2FnZXMuY29uZmlnCkBAIC0wLDAgKzEsMjUgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cGFja2FnZXM+CisgIDxwYWNrYWdlIGlkPSJNaWNyb3NvZnQuQXNwTmV0Lk12YyIgdmVyc2lvbj0iNS4yLjMiIHRhcmdldEZyYW1ld29yaz0ibmV0NDUiIC8+CisgIDxwYWNrYWdlIGlkPSJNaWNyb3NvZnQuQXNwTmV0LlJhem9yIiB2ZXJzaW9uPSIzLjIuMyIgdGFyZ2V0RnJhbWV3b3JrPSJuZXQ0NSIgLz4KKyAgPHBhY2thZ2UgaWQ9Ik1pY3Jvc29mdC5Bc3BOZXQuV2ViUGFnZXMiIHZlcnNpb249IjMuMi4zIiB0YXJnZXRGcmFtZXdvcms9Im5ldDQ1IiAvPgorICA8cGFja2FnZSBpZD0iTWljcm9zb2Z0LldlYi5JbmZyYXN0cnVjdHVyZSIgdmVyc2lvbj0iMS4wLjAuMCIgdGFyZ2V0RnJhbWV3b3JrPSJuZXQ0NSIgLz4KKzwvcGFja2FnZXM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L1RocmlmdFRlc3QvTWFrZWZpbGUuYW0gYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0VGVzdC9NYWtlZmlsZS5hbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzEyNWM5MC4uMDAwMDAwMAotLS0gYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0VGVzdC9NYWtlZmlsZS5hbQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1USFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAotaWYgTU9OT19NQ1MKLUNTQz1tY3MKLWVsc2UKLUNTQz1nbWNzCi1lbmRpZgotCi1zdHViczogJCh0b3Bfc3JjZGlyKS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0Ci0JJChUSFJJRlQpIC0tZ2VuIGNzaGFycCAtbyAuICQodG9wX3NyY2RpcikvdGVzdC9UaHJpZnRUZXN0LnRocmlmdAotCi1wcmVjcm9zczogVGVzdENsaWVudFNlcnZlci5leGUKLQotVGhyaWZ0SW1wbC5kbGw6IHN0dWJzCi0JJChDU0MpIC90OmxpYnJhcnkgL291dDouL1RocmlmdEltcGwuZGxsIC9yZWN1cnNlOi4vZ2VuLWNzaGFycC8qIC9yZWZlcmVuY2U6Li4vLi4vVGhyaWZ0LmRsbAotCi1UZXN0Q2xpZW50U2VydmVyLmV4ZTogVGVzdENsaWVudC5jcyBUZXN0U2VydmVyLmNzIFByb2dyYW0uY3MgVGhyaWZ0SW1wbC5kbGwKLQkkKENTQykgIC9vdXQ6VGVzdENsaWVudFNlcnZlci5leGUgL3JlZmVyZW5jZTouLi8uLi9UaHJpZnQuZGxsIC9yZWZlcmVuY2U6VGhyaWZ0SW1wbC5kbGwgVGVzdENsaWVudC5jcyBUZXN0U2VydmVyLmNzIFByb2dyYW0uY3MKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRUZXN0L1Byb2dyYW0uY3MgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0VGVzdC9Qcm9ncmFtLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTQyNDViLi4wMDAwMDAwCi0tLSBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRUZXN0L1Byb2dyYW0uY3MKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZQotLy8KLS8vIFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFIG9yIHZpc2l0IHRoZSBUaHJpZnQgc2l0ZSBhdDoKLS8vIGh0dHA6Ly9kZXZlbG9wZXJzLmZhY2Vib29rLmNvbS90aHJpZnQvCi0KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFRocmlmdC5UcmFuc3BvcnQ7Ci11c2luZyBUaHJpZnQuUHJvdG9jb2w7Ci11c2luZyBUaHJpZnQuVGVzdDsgLy9nZW5lcmF0ZWQgY29kZQotCi1uYW1lc3BhY2UgVGVzdAotewotICAgIGNsYXNzIFByb2dyYW0KLSAgICB7Ci0gICAgICAgIHN0YXRpYyBpbnQgTWFpbihzdHJpbmdbXSBhcmdzKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoYXJncy5MZW5ndGggPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgibXVzdCBwcm92aWRlICdzZXJ2ZXInIG9yICdjbGllbnQnIGFyZyIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3RyaW5nW10gc3ViQXJncyA9IG5ldyBzdHJpbmdbYXJncy5MZW5ndGggLSAxXTsKLSAgICAgICAgICAgIGZvcihpbnQgaSA9IDE7IGkgPCBhcmdzLkxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN1YkFyZ3NbaS0xXSA9IGFyZ3NbaV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYXJnc1swXSA9PSAiY2xpZW50IikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gVGVzdENsaWVudC5FeGVjdXRlKHN1YkFyZ3MpID8gMCA6IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChhcmdzWzBdID09ICJzZXJ2ZXIiKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBUZXN0U2VydmVyLkV4ZWN1dGUoc3ViQXJncykgPyAwIDogMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiZmlyc3QgYXJndW1lbnQgbXVzdCBiZSAnc2VydmVyJyBvciAnY2xpZW50JyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0VGVzdC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRUZXN0L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmE0YTIzLi4wMDAwMDAwCi0tLSBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRUZXN0L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi11c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKLXVzaW5nIFN5c3RlbS5SdW50aW1lLkNvbXBpbGVyU2VydmljZXM7Ci11c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7Ci0KLS8vIEdlbmVyYWwgSW5mb3JtYXRpb24gYWJvdXQgYW4gYXNzZW1ibHkgaXMgY29udHJvbGxlZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcKLS8vIHNldCBvZiBhdHRyaWJ1dGVzLiBDaGFuZ2UgdGhlc2UgYXR0cmlidXRlIHZhbHVlcyB0byBtb2RpZnkgdGhlIGluZm9ybWF0aW9uCi0vLyBhc3NvY2lhdGVkIHdpdGggYW4gYXNzZW1ibHkuCi1bYXNzZW1ibHk6IEFzc2VtYmx5VGl0bGUoIlRocmlmdFRlc3QiKV0KLVthc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiVGhyaWZ0VGVzdCIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiQ29weXJpZ2h0IMKpIDIwMTUgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KLVthc3NlbWJseTogQXNzZW1ibHlDdWx0dXJlKCIiKV0KLQotLy8gU2V0dGluZyBDb21WaXNpYmxlIHRvIGZhbHNlIG1ha2VzIHRoZSB0eXBlcyBpbiB0aGlzIGFzc2VtYmx5IG5vdCB2aXNpYmxlCi0vLyB0byBDT00gY29tcG9uZW50cy4gIElmIHlvdSBuZWVkIHRvIGFjY2VzcyBhIHR5cGUgaW4gdGhpcyBhc3NlbWJseSBmcm9tCi0vLyBDT00sIHNldCB0aGUgQ29tVmlzaWJsZSBhdHRyaWJ1dGUgdG8gdHJ1ZSBvbiB0aGF0IHR5cGUuCi1bYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQotCi0vLyBUaGUgZm9sbG93aW5nIEdVSUQgaXMgZm9yIHRoZSBJRCBvZiB0aGUgdHlwZWxpYiBpZiB0aGlzIHByb2plY3QgaXMgZXhwb3NlZCB0byBDT00KLVthc3NlbWJseTogR3VpZCgiZjQxYjE5M2ItZjFhYi00OGVlLTg4NDMtZjg4ZTQzMDg0ZTI2IildCi0KLS8vIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yIGFuIGFzc2VtYmx5IGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgZm91ciB2YWx1ZXM6Ci0vLwotLy8gICAgICBNYWpvciBWZXJzaW9uCi0vLyAgICAgIE1pbm9yIFZlcnNpb24KLS8vICAgICAgQnVpbGQgTnVtYmVyCi0vLyAgICAgIFJldmlzaW9uCi0vLwotLy8gWW91IGNhbiBzcGVjaWZ5IGFsbCB0aGUgdmFsdWVzIG9yIHlvdSBjYW4gZGVmYXVsdCB0aGUgQnVpbGQgYW5kIFJldmlzaW9uIE51bWJlcnMKLS8vIGJ5IHVzaW5nIHRoZSAnKicgYXMgc2hvd24gYmVsb3c6Ci0vLyBbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLioiKV0KLVthc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIwLjkuMy4wIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjAuOS4zLjAiKV0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRUZXN0L1Rlc3RDbGllbnQuY3MgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0VGVzdC9UZXN0Q2xpZW50LmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODk0OWFjLi4wMDAwMDAwCi0tLSBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRUZXN0L1Rlc3RDbGllbnQuY3MKKysrIC9kZXYvbnVsbApAQCAtMSw1NTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Ci11c2luZyBUaHJpZnQuQ29sbGVjdGlvbnM7Ci11c2luZyBUaHJpZnQuUHJvdG9jb2w7Ci11c2luZyBUaHJpZnQuVHJhbnNwb3J0OwotdXNpbmcgVGhyaWZ0LlRlc3Q7Ci0KLW5hbWVzcGFjZSBUZXN0Ci17Ci0gICAgcHVibGljIGNsYXNzIFRlc3RDbGllbnQKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGludCBudW1JdGVyYXRpb25zID0gMTsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgc3RyaW5nIHByb3RvY29sID0gIiI7Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBib29sIEV4ZWN1dGUoc3RyaW5nW10gYXJncykKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RyaW5nIGhvc3QgPSAibG9jYWxob3N0IjsKLSAgICAgICAgICAgICAgICBpbnQgcG9ydCA9IDkwOTA7Ci0gICAgICAgICAgICAgICAgc3RyaW5nIHVybCA9IG51bGwsIHBpcGUgPSBudWxsOwotICAgICAgICAgICAgICAgIGludCBudW1UaHJlYWRzID0gMTsKLSAgICAgICAgICAgICAgICBib29sIGJ1ZmZlcmVkID0gZmFsc2UsIGZyYW1lZCA9IGZhbHNlLCBlbmNyeXB0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBzdHJpbmcgY2VydFBhdGggPSAiLi4vLi4vLi4vLi4vLi4va2V5cy9zZXJ2ZXIucGVtIjsKLQotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLkxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJnc1tpXSA9PSAiLXUiKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9IGFyZ3NbKytpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi1uIikKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1JdGVyYXRpb25zID0gQ29udmVydC5Ub0ludDMyKGFyZ3NbKytpXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItcGlwZSIpICAvLyAtcGlwZSA8bmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlID0gYXJnc1srK2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVc2luZyBuYW1lZCBwaXBlcyB0cmFuc3BvcnQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0uQ29udGFpbnMoIi0taG9zdD0iKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0ID0gYXJnc1tpXS5TdWJzdHJpbmcoYXJnc1tpXS5JbmRleE9mKCI9IikgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0uQ29udGFpbnMoIi0tcG9ydD0iKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0ID0gaW50LlBhcnNlKGFyZ3NbaV0uU3Vic3RyaW5nKGFyZ3NbaV0uSW5kZXhPZigiPSIpKzEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi1iIiB8fCBhcmdzW2ldID09ICItLWJ1ZmZlcmVkIiB8fCBhcmdzW2ldID09ICItLXRyYW5zcG9ydD1idWZmZXJlZCIpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVc2luZyBidWZmZXJlZCBzb2NrZXRzIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItZiIgfHwgYXJnc1tpXSA9PSAiLS1mcmFtZWQiICB8fCBhcmdzW2ldID09ICItLXRyYW5zcG9ydD1mcmFtZWQiKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlVzaW5nIGZyYW1lZCB0cmFuc3BvcnQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi10IikKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1UaHJlYWRzID0gQ29udmVydC5Ub0ludDMyKGFyZ3NbKytpXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLWNvbXBhY3QiIHx8IGFyZ3NbaV0gPT0gIi0tcHJvdG9jb2w9Y29tcGFjdCIpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2wgPSAiY29tcGFjdCI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlVzaW5nIGNvbXBhY3QgcHJvdG9jb2wiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi0tanNvbiIgfHwgYXJnc1tpXSA9PSAiLS1wcm90b2NvbD1qc29uIikKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbCA9ICJqc29uIjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVXNpbmcgSlNPTiBwcm90b2NvbCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS1zc2wiKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlVzaW5nIGVuY3J5cHRlZCB0cmFuc3BvcnQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0uU3RhcnRzV2l0aCgiLS1jZXJ0PSIpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRQYXRoID0gYXJnc1tpXS5TdWJzdHJpbmcoIi0tY2VydD0iLkxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZS5TdGFja1RyYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvL2lzc3VlIHRlc3RzIG9uIHNlcGFyYXRlIHRocmVhZHMgc2ltdWx0YW5lb3VzbHkKLSAgICAgICAgICAgICAgICBUaHJlYWRbXSB0aHJlYWRzID0gbmV3IFRocmVhZFtudW1UaHJlYWRzXTsKLSAgICAgICAgICAgICAgICBEYXRlVGltZSBzdGFydCA9IERhdGVUaW1lLk5vdzsKLSAgICAgICAgICAgICAgICBmb3IgKGludCB0ZXN0ID0gMDsgdGVzdCA8IG51bVRocmVhZHM7IHRlc3QrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUGFyYW1ldGVyaXplZFRocmVhZFN0YXJ0KENsaWVudFRocmVhZCkpOwotICAgICAgICAgICAgICAgICAgICB0aHJlYWRzW3Rlc3RdID0gdDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHVybCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbmRwb2ludCB0cmFuc3BvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQgdHJhbnMgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBpcGUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUTmFtZWRQaXBlQ2xpZW50VHJhbnNwb3J0KHBpcGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbmNyeXB0ZWQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gbmV3IFRUTFNTb2NrZXQoaG9zdCwgcG9ydCwgY2VydFBhdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVFNvY2tldChob3N0LCBwb3J0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGF5ZXJlZCB0cmFuc3BvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChidWZmZXJlZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQodHJhbnMgYXMgVFN0cmVhbVRyYW5zcG9ydCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWVkKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gbmV3IFRGcmFtZWRUcmFuc3BvcnQodHJhbnMpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvL2Vuc3VyZSBwcm9wZXIgb3Blbi9jbG9zZSBvZiB0cmFuc3BvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zLk9wZW4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zLkNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0LlN0YXJ0KHRyYW5zKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFRIdHRwQ2xpZW50IGh0dHAgPSBuZXcgVEh0dHBDbGllbnQobmV3IFVyaSh1cmwpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHQuU3RhcnQoaHR0cCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCB0ZXN0ID0gMDsgdGVzdCA8IG51bVRocmVhZHM7IHRlc3QrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocmVhZHNbdGVzdF0uSm9pbigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJUb3RhbCB0aW1lOiAiICsgKERhdGVUaW1lLk5vdyAtIHN0YXJ0KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIG91dGVyRXgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUob3V0ZXJFeC5NZXNzYWdlICsgIiBTVDogIiArIG91dGVyRXguU3RhY2tUcmFjZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOwotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIENsaWVudFRocmVhZChvYmplY3Qgb2JqKQotICAgICAgICB7Ci0gICAgICAgICAgICBUVHJhbnNwb3J0IHRyYW5zcG9ydCA9IChUVHJhbnNwb3J0KW9iajsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtSXRlcmF0aW9uczsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENsaWVudFRlc3QodHJhbnNwb3J0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRyYW5zcG9ydC5DbG9zZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBzdHJpbmcgQnl0ZXNUb0hleChieXRlW10gZGF0YSkgewotICAgICAgICAgICAgcmV0dXJuIEJpdENvbnZlcnRlci5Ub1N0cmluZyhkYXRhKS5SZXBsYWNlKCItIiwgc3RyaW5nLkVtcHR5KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIFByZXBhcmVUZXN0RGF0YShib29sIHJhbmRvbURpc3QpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJ5dGVbXSByZXR2YWwgPSBuZXcgYnl0ZVsweDEwMF07Ci0gICAgICAgICAgICBpbnQgaW5pdExlbiA9IE1hdGguTWluKDB4MTAwLHJldHZhbC5MZW5ndGgpOwotCi0gICAgICAgICAgICAvLyBsaW5lYXIgZGlzdHJpYnV0aW9uLCB1bmxlc3MgcmFuZG9tIGlzIHJlcXVlc3RlZAotICAgICAgICAgICAgaWYgKCFyYW5kb21EaXN0KSB7Ci0gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbml0TGVuOyArK2kpIHsgCi0gICAgICAgICAgICAgICAgICAgIHJldHZhbFtpXSA9IChieXRlKWk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHJhbmRvbSBkaXN0cmlidXRpb24KLSAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdExlbjsgKytpKSB7IAotICAgICAgICAgICAgICAgIHJldHZhbFtpXSA9IChieXRlKTA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YXIgcm5kID0gbmV3IFJhbmRvbSgpOwotICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBpbml0TGVuOyArK2kpIHsKLSAgICAgICAgICAgICAgICB3aGlsZSggdHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICBpbnQgbmV4dFBvcyA9IHJuZC5OZXh0KCkgJSBpbml0TGVuOwotICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsW25leHRQb3NdID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbFtuZXh0UG9zXSA9IChieXRlKWk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgQ2xpZW50VGVzdChUVHJhbnNwb3J0IHRyYW5zcG9ydCkKLSAgICAgICAgewotICAgICAgICAgICAgVFByb3RvY29sIHByb3RvOwotICAgICAgICAgICAgaWYgKHByb3RvY29sID09ICJjb21wYWN0IikKLSAgICAgICAgICAgICAgICBwcm90byA9IG5ldyBUQ29tcGFjdFByb3RvY29sKHRyYW5zcG9ydCk7Ci0gICAgICAgICAgICBlbHNlIGlmIChwcm90b2NvbCA9PSAianNvbiIpCi0gICAgICAgICAgICAgICAgcHJvdG8gPSBuZXcgVEpTT05Qcm90b2NvbCh0cmFuc3BvcnQpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHByb3RvID0gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpOwotCi0gICAgICAgICAgICBUaHJpZnRUZXN0LkNsaWVudCBjbGllbnQgPSBuZXcgVGhyaWZ0VGVzdC5DbGllbnQocHJvdG8pOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCF0cmFuc3BvcnQuSXNPcGVuKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0Lk9wZW4oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkNvbm5lY3QgZmFpbGVkOiAiICsgdHR4Lk1lc3NhZ2UpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbG9uZyBzdGFydCA9IERhdGVUaW1lLk5vdy5Ub0ZpbGVUaW1lKCk7Ci0KLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RWb2lkKCkiKTsKLSAgICAgICAgICAgIGNsaWVudC50ZXN0Vm9pZCgpOwotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9IHZvaWQiKTsKLQotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdFN0cmluZyhcIlRlc3RcIikiKTsKLSAgICAgICAgICAgIHN0cmluZyBzID0gY2xpZW50LnRlc3RTdHJpbmcoIlRlc3QiKTsKLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSBcIiIgKyBzICsgIlwiIik7Ci0KLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RCb29sKHRydWUpIik7Ci0gICAgICAgICAgICBib29sIHQgPSBjbGllbnQudGVzdEJvb2woKGJvb2wpdHJ1ZSk7Ci0gICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIHQpOwotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEJvb2woZmFsc2UpIik7Ci0gICAgICAgICAgICBib29sIGYgPSBjbGllbnQudGVzdEJvb2woKGJvb2wpZmFsc2UpOwotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBmKTsKLQotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEJ5dGUoMSkiKTsKLSAgICAgICAgICAgIHNieXRlIGk4ID0gY2xpZW50LnRlc3RCeXRlKChzYnl0ZSkxKTsKLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgaTgpOwotCi0gICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0STMyKC0xKSIpOwotICAgICAgICAgICAgaW50IGkzMiA9IGNsaWVudC50ZXN0STMyKC0xKTsKLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgaTMyKTsKLQotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEk2NCgtMzQzNTk3MzgzNjgpIik7Ci0gICAgICAgICAgICBsb25nIGk2NCA9IGNsaWVudC50ZXN0STY0KC0zNDM1OTczODM2OCk7Ci0gICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIGk2NCk7Ci0KLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3REb3VibGUoNS4zMjUwOTgyMzUpIik7Ci0gICAgICAgICAgICBkb3VibGUgZHViID0gY2xpZW50LnRlc3REb3VibGUoNS4zMjUwOTgyMzUpOwotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBkdWIpOwotCi0gICAgICAgICAgICBieXRlW10gYmluT3V0ID0gUHJlcGFyZVRlc3REYXRhKHRydWUpOwotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEJpbmFyeSgiICsgQnl0ZXNUb0hleChiaW5PdXQpICsgIikiKTsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJ5dGVbXSBiaW5JbiA9IGNsaWVudC50ZXN0QmluYXJ5KGJpbk91dCk7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBCeXRlc1RvSGV4KGJpbkluKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGJpbkluLkxlbmd0aCAhPSBiaW5PdXQuTGVuZ3RoKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJ0ZXN0QmluYXJ5OiBsZW5ndGggbWlzbWF0Y2giKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBvZnMgPSAwOyBvZnMgPCBNYXRoLk1pbihiaW5Jbi5MZW5ndGgsIGJpbk91dC5MZW5ndGgpOyArK29mcykKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJpbkluW29mc10gIT0gYmluT3V0W29mc10pCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJ0ZXN0QmluYXJ5OiBjb250ZW50IG1pc21hdGNoIGF0IG9mZnNldCAiICsgb2ZzLlRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24gZSkgCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEJpbmFyeSgiICsgQnl0ZXNUb0hleChiaW5PdXQpICsgIik6ICIrZS5NZXNzYWdlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gYmluYXJ5IGVxdWFscz8gb25seSB3aXRoIGhhc2hjb2RlIG9wdGlvbiBlbmFibGVkIC4uLgotICAgICAgICAgICAgaWYoIHR5cGVvZihDcmF6eU5lc3RpbmcpLkdldE1ldGhvZCgiRXF1YWxzIikuRGVjbGFyaW5nVHlwZSA9PSB0eXBlb2YoQ3JhenlOZXN0aW5nKSkgCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ3JhenlOZXN0aW5nIG9uZSA9IG5ldyBDcmF6eU5lc3RpbmcoKTsKLSAgICAgICAgICAgICAgICBDcmF6eU5lc3RpbmcgdHdvID0gbmV3IENyYXp5TmVzdGluZygpOwotICAgICAgICAgICAgICAgIG9uZS5TdHJpbmdfZmllbGQgPSAiY3JhenkiOwotICAgICAgICAgICAgICAgIHR3by5TdHJpbmdfZmllbGQgPSAiY3JhenkiOwotICAgICAgICAgICAgICAgIG9uZS5CaW5hcnlfZmllbGQgPSBuZXcgYnl0ZVsxMF0geyAweDAwLCAweDAxLCAweDAyLCAweDA0LCAweDA4LCAweDEwLCAweDIwLCAweDQwLCAweDgwLCAweEZGIH07Ci0gICAgICAgICAgICAgICAgdHdvLkJpbmFyeV9maWVsZCA9IG5ldyBieXRlWzEwXSB7IDB4MDAsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsIDB4RkYgfTsKLSAgICAgICAgICAgICAgICBpZiAoIW9uZS5FcXVhbHModHdvKSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiQ3JhenlOZXN0aW5nLkVxdWFscyBmYWlsZWQiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdFN0cnVjdCh7XCJaZXJvXCIsIDEsIC0zLCAtNX0pIik7Ci0gICAgICAgICAgICBYdHJ1Y3QgbyA9IG5ldyBYdHJ1Y3QoKTsKLSAgICAgICAgICAgIG8uU3RyaW5nX3RoaW5nID0gIlplcm8iOwotICAgICAgICAgICAgby5CeXRlX3RoaW5nID0gKHNieXRlKTE7Ci0gICAgICAgICAgICBvLkkzMl90aGluZyA9IC0zOwotICAgICAgICAgICAgby5JNjRfdGhpbmcgPSAtNTsKLSAgICAgICAgICAgIFh0cnVjdCBpID0gY2xpZW50LnRlc3RTdHJ1Y3Qobyk7Ci0gICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0ge1wiIiArIGkuU3RyaW5nX3RoaW5nICsgIlwiLCAiICsgaS5CeXRlX3RoaW5nICsgIiwgIiArIGkuSTMyX3RoaW5nICsgIiwgIiArIGkuSTY0X3RoaW5nICsgIn0iKTsKLQotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdE5lc3QoezEsIHtcIlplcm9cIiwgMSwgLTMsIC01fSwgNX0pIik7Ci0gICAgICAgICAgICBYdHJ1Y3QyIG8yID0gbmV3IFh0cnVjdDIoKTsKLSAgICAgICAgICAgIG8yLkJ5dGVfdGhpbmcgPSAoc2J5dGUpMTsKLSAgICAgICAgICAgIG8yLlN0cnVjdF90aGluZyA9IG87Ci0gICAgICAgICAgICBvMi5JMzJfdGhpbmcgPSA1OwotICAgICAgICAgICAgWHRydWN0MiBpMiA9IGNsaWVudC50ZXN0TmVzdChvMik7Ci0gICAgICAgICAgICBpID0gaTIuU3RydWN0X3RoaW5nOwotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9IHsiICsgaTIuQnl0ZV90aGluZyArICIsIHtcIiIgKyBpLlN0cmluZ190aGluZyArICJcIiwgIiArIGkuQnl0ZV90aGluZyArICIsICIgKyBpLkkzMl90aGluZyArICIsICIgKyBpLkk2NF90aGluZyArICJ9LCAiICsgaTIuSTMyX3RoaW5nICsgIn0iKTsKLQotICAgICAgICAgICAgRGljdGlvbmFyeTxpbnQsIGludD4gbWFwb3V0ID0gbmV3IERpY3Rpb25hcnk8aW50LCBpbnQ+KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDU7IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtYXBvdXRbal0gPSBqIC0gMTA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0TWFwKHsiKTsKLSAgICAgICAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgICAgICAgICAgZm9yZWFjaCAoaW50IGtleSBpbiBtYXBvdXQuS2V5cykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIsICIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGtleSArICIgPT4gIiArIG1hcG91dFtrZXldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIn0pIik7Ci0KLSAgICAgICAgICAgIERpY3Rpb25hcnk8aW50LCBpbnQ+IG1hcGluID0gY2xpZW50LnRlc3RNYXAobWFwb3V0KTsKLQotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiID0geyIpOwotICAgICAgICAgICAgZmlyc3QgPSB0cnVlOwotICAgICAgICAgICAgZm9yZWFjaCAoaW50IGtleSBpbiBtYXBpbi5LZXlzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiwgIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoa2V5ICsgIiA9PiAiICsgbWFwaW5ba2V5XSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgifSIpOwotCi0gICAgICAgICAgICBMaXN0PGludD4gbGlzdG91dCA9IG5ldyBMaXN0PGludD4oKTsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAtMjsgaiA8IDM7IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsaXN0b3V0LkFkZChqKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RMaXN0KHsiKTsKLSAgICAgICAgICAgIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgICAgIGZvcmVhY2ggKGludCBqIGluIGxpc3RvdXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGZpcnN0KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiLCAiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShqKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIn0pIik7Ci0KLSAgICAgICAgICAgIExpc3Q8aW50PiBsaXN0aW4gPSBjbGllbnQudGVzdExpc3QobGlzdG91dCk7Ci0KLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiA9IHsiKTsKLSAgICAgICAgICAgIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgICAgIGZvcmVhY2ggKGludCBqIGluIGxpc3RpbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIsICIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGopOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIn0iKTsKLQotICAgICAgICAgICAgLy9zZXQKLSAgICAgICAgICAgIFRIYXNoU2V0PGludD4gc2V0b3V0ID0gbmV3IFRIYXNoU2V0PGludD4oKTsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAtMjsgaiA8IDM7IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzZXRvdXQuQWRkKGopOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdFNldCh7Iik7Ci0gICAgICAgICAgICBmaXJzdCA9IHRydWU7Ci0gICAgICAgICAgICBmb3JlYWNoIChpbnQgaiBpbiBzZXRvdXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGZpcnN0KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiLCAiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShqKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIn0pIik7Ci0KLSAgICAgICAgICAgIFRIYXNoU2V0PGludD4gc2V0aW4gPSBjbGllbnQudGVzdFNldChzZXRvdXQpOwotCi0gICAgICAgICAgICBDb25zb2xlLldyaXRlKCIgPSB7Iik7Ci0gICAgICAgICAgICBmaXJzdCA9IHRydWU7Ci0gICAgICAgICAgICBmb3JlYWNoIChpbnQgaiBpbiBzZXRpbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIsICIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGopOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIn0iKTsKLQotCi0gICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0RW51bShPTkUpIik7Ci0gICAgICAgICAgICBOdW1iZXJ6IHJldCA9IGNsaWVudC50ZXN0RW51bShOdW1iZXJ6Lk9ORSk7Ci0gICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIHJldCk7Ci0KLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RFbnVtKFRXTykiKTsKLSAgICAgICAgICAgIHJldCA9IGNsaWVudC50ZXN0RW51bShOdW1iZXJ6LlRXTyk7Ci0gICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIHJldCk7Ci0KLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RFbnVtKFRIUkVFKSIpOwotICAgICAgICAgICAgcmV0ID0gY2xpZW50LnRlc3RFbnVtKE51bWJlcnouVEhSRUUpOwotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyByZXQpOwotCi0gICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0RW51bShGSVZFKSIpOwotICAgICAgICAgICAgcmV0ID0gY2xpZW50LnRlc3RFbnVtKE51bWJlcnouRklWRSk7Ci0gICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIHJldCk7Ci0KLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RFbnVtKEVJR0hUKSIpOwotICAgICAgICAgICAgcmV0ID0gY2xpZW50LnRlc3RFbnVtKE51bWJlcnouRUlHSFQpOwotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyByZXQpOwotCi0gICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0VHlwZWRlZigzMDk4NTgyMzUwODI1MjMpIik7Ci0gICAgICAgICAgICBsb25nIHVpZCA9IGNsaWVudC50ZXN0VHlwZWRlZigzMDk4NTgyMzUwODI1MjNMKTsKLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgdWlkKTsKLQotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdE1hcE1hcCgxKSIpOwotICAgICAgICAgICAgRGljdGlvbmFyeTxpbnQsIERpY3Rpb25hcnk8aW50LCBpbnQ+PiBtbSA9IGNsaWVudC50ZXN0TWFwTWFwKDEpOwotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiID0geyIpOwotICAgICAgICAgICAgZm9yZWFjaCAoaW50IGtleSBpbiBtbS5LZXlzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoa2V5ICsgIiA9PiB7Iik7Ci0gICAgICAgICAgICAgICAgRGljdGlvbmFyeTxpbnQsIGludD4gbTIgPSBtbVtrZXldOwotICAgICAgICAgICAgICAgIGZvcmVhY2ggKGludCBrMiBpbiBtMi5LZXlzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShrMiArICIgPT4gIiArIG0yW2syXSArICIsICIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ9LCAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ9Iik7Ci0KLSAgICAgICAgICAgIEluc2FuaXR5IGluc2FuZSA9IG5ldyBJbnNhbml0eSgpOwotICAgICAgICAgICAgaW5zYW5lLlVzZXJNYXAgPSBuZXcgRGljdGlvbmFyeTxOdW1iZXJ6LCBsb25nPigpOwotICAgICAgICAgICAgaW5zYW5lLlVzZXJNYXBbTnVtYmVyei5GSVZFXSA9IDUwMDBMOwotICAgICAgICAgICAgWHRydWN0IHRydWNrID0gbmV3IFh0cnVjdCgpOwotICAgICAgICAgICAgdHJ1Y2suU3RyaW5nX3RoaW5nID0gIlRydWNrIjsKLSAgICAgICAgICAgIHRydWNrLkJ5dGVfdGhpbmcgPSAoc2J5dGUpODsKLSAgICAgICAgICAgIHRydWNrLkkzMl90aGluZyA9IDg7Ci0gICAgICAgICAgICB0cnVjay5JNjRfdGhpbmcgPSA4OwotICAgICAgICAgICAgaW5zYW5lLlh0cnVjdHMgPSBuZXcgTGlzdDxYdHJ1Y3Q+KCk7Ci0gICAgICAgICAgICBpbnNhbmUuWHRydWN0cy5BZGQodHJ1Y2spOwotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEluc2FuaXR5KCkiKTsKLSAgICAgICAgICAgIERpY3Rpb25hcnk8bG9uZywgRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4+IHdob2EgPSBjbGllbnQudGVzdEluc2FuaXR5KGluc2FuZSk7Ci0gICAgICAgICAgICBDb25zb2xlLldyaXRlKCIgPSB7Iik7Ci0gICAgICAgICAgICBmb3JlYWNoIChsb25nIGtleSBpbiB3aG9hLktleXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4gdmFsID0gd2hvYVtrZXldOwotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoa2V5ICsgIiA9PiB7Iik7Ci0KLSAgICAgICAgICAgICAgICBmb3JlYWNoIChOdW1iZXJ6IGsyIGluIHZhbC5LZXlzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgSW5zYW5pdHkgdjIgPSB2YWxbazJdOwotCi0gICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoazIgKyAiID0+IHsiKTsKLSAgICAgICAgICAgICAgICAgICAgRGljdGlvbmFyeTxOdW1iZXJ6LCBsb25nPiB1c2VyTWFwID0gdjIuVXNlck1hcDsKLQotICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ7Iik7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh1c2VyTWFwICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKE51bWJlcnogazMgaW4gdXNlck1hcC5LZXlzKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoazMgKyAiID0+ICIgKyB1c2VyTWFwW2szXSArICIsICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgibnVsbCIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIn0sICIpOwotCi0gICAgICAgICAgICAgICAgICAgIExpc3Q8WHRydWN0PiB4dHJ1Y3RzID0gdjIuWHRydWN0czsKLQotICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ7Iik7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh4dHJ1Y3RzICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKFh0cnVjdCB4IGluIHh0cnVjdHMpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgie1wiIiArIHguU3RyaW5nX3RoaW5nICsgIlwiLCAiICsgeC5CeXRlX3RoaW5nICsgIiwgIiArIHguSTMyX3RoaW5nICsgIiwgIiArIHguSTMyX3RoaW5nICsgIn0sICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgibnVsbCIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIn0iKTsKLQotICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ9LCAiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgifSwgIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgifSIpOwotCi0gICAgICAgICAgICBzYnl0ZSBhcmcwID0gMTsKLSAgICAgICAgICAgIGludCBhcmcxID0gMjsKLSAgICAgICAgICAgIGxvbmcgYXJnMiA9IGxvbmcuTWF4VmFsdWU7Ci0gICAgICAgICAgICBEaWN0aW9uYXJ5PHNob3J0LCBzdHJpbmc+IG11bHRpRGljdCA9IG5ldyBEaWN0aW9uYXJ5PHNob3J0LCBzdHJpbmc+KCk7Ci0gICAgICAgICAgICBtdWx0aURpY3RbMV0gPSAib25lIjsKLSAgICAgICAgICAgIE51bWJlcnogYXJnNCA9IE51bWJlcnouRklWRTsKLSAgICAgICAgICAgIGxvbmcgYXJnNSA9IDUwMDAwMDA7Ci0gICAgICAgICAgICBDb25zb2xlLldyaXRlKCJUZXN0IE11bHRpKCIgKyBhcmcwICsgIiwiICsgYXJnMSArICIsIiArIGFyZzIgKyAiLCIgKyBtdWx0aURpY3QgKyAiLCIgKyBhcmc0ICsgIiwiICsgYXJnNSArICIpIik7Ci0gICAgICAgICAgICBYdHJ1Y3QgbXVsdGlSZXNwb25zZSA9IGNsaWVudC50ZXN0TXVsdGkoYXJnMCwgYXJnMSwgYXJnMiwgbXVsdGlEaWN0LCBhcmc0LCBhcmc1KTsKLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiA9IFh0cnVjdChieXRlX3RoaW5nOiIgKyBtdWx0aVJlc3BvbnNlLkJ5dGVfdGhpbmcgKyAiLFN0cmluZ190aGluZzoiICsgbXVsdGlSZXNwb25zZS5TdHJpbmdfdGhpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIixpMzJfdGhpbmc6IiArIG11bHRpUmVzcG9uc2UuSTMyX3RoaW5nICsgIixpNjRfdGhpbmc6IiArIG11bHRpUmVzcG9uc2UuSTY0X3RoaW5nICsgIilcbiIpOwotCi0gICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVGVzdCBPbmV3YXkoMSkiKTsKLSAgICAgICAgICAgIGNsaWVudC50ZXN0T25ld2F5KDEpOwotCi0gICAgICAgICAgICBDb25zb2xlLldyaXRlKCJUZXN0IENhbGx0aW1lKCkiKTsKLSAgICAgICAgICAgIHZhciBzdGFydHQgPSBEYXRlVGltZS5VdGNOb3c7Ci0gICAgICAgICAgICBmb3IgKCBpbnQgaz0wOyBrPDEwMDA7ICsrayApCi0gICAgICAgICAgICAgICAgY2xpZW50LnRlc3RWb2lkKCk7Ci0gICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIChEYXRlVGltZS5VdGNOb3cgLSBzdGFydHQpLlRvdGFsU2Vjb25kcy5Ub1N0cmluZygpICsgIiBtcyBhIHRlc3RWb2lkKCkgY2FsbCIgKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRUZXN0L1Rlc3RTZXJ2ZXIuY3MgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0VGVzdC9UZXN0U2VydmVyLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWNjNzNjLi4wMDAwMDAwCi0tLSBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRUZXN0L1Rlc3RTZXJ2ZXIuY3MKKysrIC9kZXYvbnVsbApAQCAtMSw0ODEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UKLS8vCi0vLyBTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRSBvciB2aXNpdCB0aGUgVGhyaWZ0IHNpdGUgYXQ6Ci0vLyBodHRwOi8vZGV2ZWxvcGVycy5mYWNlYm9vay5jb20vdGhyaWZ0LwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uU2VjdXJpdHkuQ3J5cHRvZ3JhcGh5Llg1MDlDZXJ0aWZpY2F0ZXM7Ci11c2luZyBUaHJpZnQuQ29sbGVjdGlvbnM7Ci11c2luZyBUaHJpZnQuVGVzdDsgLy9nZW5lcmF0ZWQgY29kZQotdXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKLXVzaW5nIFRocmlmdC5Qcm90b2NvbDsKLXVzaW5nIFRocmlmdC5TZXJ2ZXI7Ci0KLW5hbWVzcGFjZSBUZXN0Ci17Ci0gICAgcHVibGljIGNsYXNzIFRlc3RTZXJ2ZXIKLSAgICB7Ci0gICAgcHVibGljIGNsYXNzIFRyYWRlU2VydmVyRXZlbnRIYW5kbGVyIDogVFNlcnZlckV2ZW50SGFuZGxlcgotICAgIHsKLSAgICAgIHB1YmxpYyBpbnQgY2FsbENvdW50ID0gMDsKLSAgICAgIHB1YmxpYyB2b2lkIHByZVNlcnZlKCkKLSAgICAgIHsKLSAgICAgICAgY2FsbENvdW50Kys7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNyZWF0ZUNvbnRleHQoVGhyaWZ0LlByb3RvY29sLlRQcm90b2NvbCBpbnB1dCwgVGhyaWZ0LlByb3RvY29sLlRQcm90b2NvbCBvdXRwdXQpCi0gICAgICB7Ci0gICAgICAgIGNhbGxDb3VudCsrOwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyB2b2lkIGRlbGV0ZUNvbnRleHQoT2JqZWN0IHNlcnZlckNvbnRleHQsIFRocmlmdC5Qcm90b2NvbC5UUHJvdG9jb2wgaW5wdXQsIFRocmlmdC5Qcm90b2NvbC5UUHJvdG9jb2wgb3V0cHV0KQotICAgICAgewotICAgICAgICBjYWxsQ291bnQrKzsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NDb250ZXh0KE9iamVjdCBzZXJ2ZXJDb250ZXh0LCBUaHJpZnQuVHJhbnNwb3J0LlRUcmFuc3BvcnQgdHJhbnNwb3J0KQotICAgICAgewotICAgICAgICBjYWxsQ291bnQrKzsKLSAgICAgIH0KLSAgICB9OwotCi0gICAgICAgIHB1YmxpYyBjbGFzcyBUZXN0SGFuZGxlciA6IFRocmlmdFRlc3QuSWZhY2UKLSAgICAgICAgewotICAgICAgICAgICAgcHVibGljIFRTZXJ2ZXIgc2VydmVyOwotCi0gICAgICAgICAgICBwdWJsaWMgVGVzdEhhbmRsZXIoKSB7IH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgdGVzdFZvaWQoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0Vm9pZCgpIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgdGVzdFN0cmluZyhzdHJpbmcgdGhpbmcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RzdHJpbmcoXCIiICsgdGhpbmcgKyAiXCIpIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaW5nOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgYm9vbCB0ZXN0Qm9vbChib29sIHRoaW5nKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0Qm9vbCgiICsgdGhpbmcgKyAiKSIpOwotICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHNieXRlIHRlc3RCeXRlKHNieXRlIHRoaW5nKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0Qnl0ZSgiICsgdGhpbmcgKyAiKSIpOwotICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIGludCB0ZXN0STMyKGludCB0aGluZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdEkzMigiICsgdGhpbmcgKyAiKSIpOwotICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIGxvbmcgdGVzdEk2NChsb25nIHRoaW5nKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0STY0KCIgKyB0aGluZyArICIpIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaW5nOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgZG91YmxlIHRlc3REb3VibGUoZG91YmxlIHRoaW5nKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0RG91YmxlKCIgKyB0aGluZyArICIpIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaW5nOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgYnl0ZVtdIHRlc3RCaW5hcnkoYnl0ZVtdIHRoaW5nKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0cmluZyBoZXggPSBCaXRDb252ZXJ0ZXIuVG9TdHJpbmcodGhpbmcpLlJlcGxhY2UoIi0iLCBzdHJpbmcuRW1wdHkpOwotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0QmluYXJ5KCIgKyBoZXggKyAiKSIpOwotICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIFh0cnVjdCB0ZXN0U3RydWN0KFh0cnVjdCB0aGluZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdFN0cnVjdCh7IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIiICsgdGhpbmcuU3RyaW5nX3RoaW5nICsgIlwiLCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaW5nLkJ5dGVfdGhpbmcgKyAiLCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaW5nLkkzMl90aGluZyArICIsICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpbmcuSTY0X3RoaW5nICsgIn0pIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaW5nOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgWHRydWN0MiB0ZXN0TmVzdChYdHJ1Y3QyIG5lc3QpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgWHRydWN0IHRoaW5nID0gbmVzdC5TdHJ1Y3RfdGhpbmc7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInRlc3ROZXN0KHsiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lc3QuQnl0ZV90aGluZyArICIsIHsiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiIgKyB0aGluZy5TdHJpbmdfdGhpbmcgKyAiXCIsICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpbmcuQnl0ZV90aGluZyArICIsICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpbmcuSTMyX3RoaW5nICsgIiwgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGluZy5JNjRfdGhpbmcgKyAifSwgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXN0LkkzMl90aGluZyArICJ9KSIpOwotICAgICAgICAgICAgICAgIHJldHVybiBuZXN0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgRGljdGlvbmFyeTxpbnQsIGludD4gdGVzdE1hcChEaWN0aW9uYXJ5PGludCwgaW50PiB0aGluZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdE1hcCh7Iik7Ci0gICAgICAgICAgICAgICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZm9yZWFjaCAoaW50IGtleSBpbiB0aGluZy5LZXlzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiwgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoa2V5ICsgIiA9PiAiICsgdGhpbmdba2V5XSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ9KSIpOwotICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+IHRlc3RTdHJpbmdNYXAoRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4gdGhpbmcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RTdHJpbmdNYXAoeyIpOwotICAgICAgICAgICAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgICAgICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyBrZXkgaW4gdGhpbmcuS2V5cykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIsICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGtleSArICIgPT4gIiArIHRoaW5nW2tleV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgifSkiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpbmc7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBUSGFzaFNldDxpbnQ+IHRlc3RTZXQoVEhhc2hTZXQ8aW50PiB0aGluZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdFNldCh7Iik7Ci0gICAgICAgICAgICAgICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZm9yZWFjaCAoaW50IGVsZW0gaW4gdGhpbmcpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiLCAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShlbGVtKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIn0pIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaW5nOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgTGlzdDxpbnQ+IHRlc3RMaXN0KExpc3Q8aW50PiB0aGluZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdExpc3QoeyIpOwotICAgICAgICAgICAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgICAgICAgICAgICAgIGZvcmVhY2ggKGludCBlbGVtIGluIHRoaW5nKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiwgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZWxlbSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ9KSIpOwotICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIE51bWJlcnogdGVzdEVudW0oTnVtYmVyeiB0aGluZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdEVudW0oIiArIHRoaW5nICsgIikiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpbmc7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBsb25nIHRlc3RUeXBlZGVmKGxvbmcgdGhpbmcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RUeXBlZGVmKCIgKyB0aGluZyArICIpIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaW5nOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgRGljdGlvbmFyeTxpbnQsIERpY3Rpb25hcnk8aW50LCBpbnQ+PiB0ZXN0TWFwTWFwKGludCBoZWxsbykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdE1hcE1hcCgiICsgaGVsbG8gKyAiKSIpOwotICAgICAgICAgICAgICAgIERpY3Rpb25hcnk8aW50LCBEaWN0aW9uYXJ5PGludCwgaW50Pj4gbWFwbWFwID0KLSAgICAgICAgICAgICAgICAgIG5ldyBEaWN0aW9uYXJ5PGludCwgRGljdGlvbmFyeTxpbnQsIGludD4+KCk7Ci0KLSAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5PGludCwgaW50PiBwb3MgPSBuZXcgRGljdGlvbmFyeTxpbnQsIGludD4oKTsKLSAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5PGludCwgaW50PiBuZWcgPSBuZXcgRGljdGlvbmFyeTxpbnQsIGludD4oKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IDU7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBvc1tpXSA9IGk7Ci0gICAgICAgICAgICAgICAgICAgIG5lZ1staV0gPSAtaTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtYXBtYXBbNF0gPSBwb3M7Ci0gICAgICAgICAgICAgICAgbWFwbWFwWy00XSA9IG5lZzsKLQotICAgICAgICAgICAgICAgIHJldHVybiBtYXBtYXA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBEaWN0aW9uYXJ5PGxvbmcsIERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+PiB0ZXN0SW5zYW5pdHkoSW5zYW5pdHkgYXJndW1lbnQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RJbnNhbml0eSgpIik7Ci0KLSAgICAgICAgICAgICAgICBYdHJ1Y3QgaGVsbG8gPSBuZXcgWHRydWN0KCk7Ci0gICAgICAgICAgICAgICAgaGVsbG8uU3RyaW5nX3RoaW5nID0gIkhlbGxvMiI7Ci0gICAgICAgICAgICAgICAgaGVsbG8uQnl0ZV90aGluZyA9IDI7Ci0gICAgICAgICAgICAgICAgaGVsbG8uSTMyX3RoaW5nID0gMjsKLSAgICAgICAgICAgICAgICBoZWxsby5JNjRfdGhpbmcgPSAyOwotCi0gICAgICAgICAgICAgICAgWHRydWN0IGdvb2RieWUgPSBuZXcgWHRydWN0KCk7Ci0gICAgICAgICAgICAgICAgZ29vZGJ5ZS5TdHJpbmdfdGhpbmcgPSAiR29vZGJ5ZTQiOwotICAgICAgICAgICAgICAgIGdvb2RieWUuQnl0ZV90aGluZyA9IChzYnl0ZSk0OwotICAgICAgICAgICAgICAgIGdvb2RieWUuSTMyX3RoaW5nID0gNDsKLSAgICAgICAgICAgICAgICBnb29kYnllLkk2NF90aGluZyA9IChsb25nKTQ7Ci0KLSAgICAgICAgICAgICAgICBJbnNhbml0eSBjcmF6eSA9IG5ldyBJbnNhbml0eSgpOwotICAgICAgICAgICAgICAgIGNyYXp5LlVzZXJNYXAgPSBuZXcgRGljdGlvbmFyeTxOdW1iZXJ6LCBsb25nPigpOwotICAgICAgICAgICAgICAgIGNyYXp5LlVzZXJNYXBbTnVtYmVyei5FSUdIVF0gPSAobG9uZyk4OwotICAgICAgICAgICAgICAgIGNyYXp5Llh0cnVjdHMgPSBuZXcgTGlzdDxYdHJ1Y3Q+KCk7Ci0gICAgICAgICAgICAgICAgY3JhenkuWHRydWN0cy5BZGQoZ29vZGJ5ZSk7Ci0KLSAgICAgICAgICAgICAgICBJbnNhbml0eSBsb29uZXkgPSBuZXcgSW5zYW5pdHkoKTsKLSAgICAgICAgICAgICAgICBjcmF6eS5Vc2VyTWFwW051bWJlcnouRklWRV0gPSAobG9uZyk1OwotICAgICAgICAgICAgICAgIGNyYXp5Llh0cnVjdHMuQWRkKGhlbGxvKTsKLQotICAgICAgICAgICAgICAgIERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+IGZpcnN0X21hcCA9IG5ldyBEaWN0aW9uYXJ5PE51bWJlcnosIEluc2FuaXR5PigpOwotICAgICAgICAgICAgICAgIERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+IHNlY29uZF9tYXAgPSBuZXcgRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4oKTsgOwotCi0gICAgICAgICAgICAgICAgZmlyc3RfbWFwW051bWJlcnouVFdPXSA9IGNyYXp5OwotICAgICAgICAgICAgICAgIGZpcnN0X21hcFtOdW1iZXJ6LlRIUkVFXSA9IGNyYXp5OwotCi0gICAgICAgICAgICAgICAgc2Vjb25kX21hcFtOdW1iZXJ6LlNJWF0gPSBsb29uZXk7Ci0KLSAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5PGxvbmcsIERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+PiBpbnNhbmUgPQotICAgICAgICAgICAgICAgICAgbmV3IERpY3Rpb25hcnk8bG9uZywgRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4+KCk7Ci0gICAgICAgICAgICAgICAgaW5zYW5lWyhsb25nKTFdID0gZmlyc3RfbWFwOwotICAgICAgICAgICAgICAgIGluc2FuZVsobG9uZykyXSA9IHNlY29uZF9tYXA7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gaW5zYW5lOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgWHRydWN0IHRlc3RNdWx0aShzYnl0ZSBhcmcwLCBpbnQgYXJnMSwgbG9uZyBhcmcyLCBEaWN0aW9uYXJ5PHNob3J0LCBzdHJpbmc+IGFyZzMsIE51bWJlcnogYXJnNCwgbG9uZyBhcmc1KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0TXVsdGkoKSIpOwotCi0gICAgICAgICAgICAgICAgWHRydWN0IGhlbGxvID0gbmV3IFh0cnVjdCgpOyA7Ci0gICAgICAgICAgICAgICAgaGVsbG8uU3RyaW5nX3RoaW5nID0gIkhlbGxvMiI7Ci0gICAgICAgICAgICAgICAgaGVsbG8uQnl0ZV90aGluZyA9IGFyZzA7Ci0gICAgICAgICAgICAgICAgaGVsbG8uSTMyX3RoaW5nID0gYXJnMTsKLSAgICAgICAgICAgICAgICBoZWxsby5JNjRfdGhpbmcgPSBhcmcyOwotICAgICAgICAgICAgICAgIHJldHVybiBoZWxsbzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBQcmludCAndGVzdEV4Y2VwdGlvbiglcyknIHdpdGggYXJnIGFzICclcycKLSAgICAgICAgICAgICAqIEBwYXJhbSBzdHJpbmcgYXJnIC0gYSBzdHJpbmcgaW5kaWNhdGlvbiB3aGF0IHR5cGUgb2YgZXhjZXB0aW9uIHRvIHRocm93Ci0gICAgICAgICAgICAgKiBpZiBhcmcgPT0gIlhjZXB0aW9uIiB0aHJvdyBYY2VwdGlvbiB3aXRoIGVycm9yQ29kZSA9IDEwMDEgYW5kIG1lc3NhZ2UgPSBhcmcKLSAgICAgICAgICAgICAqIGVsc2VuIGlmIGFyZyA9PSAiVEV4Y2VwdGlvbiIgdGhyb3cgVEV4Y2VwdGlvbgotICAgICAgICAgICAgICogZWxzZSBkbyBub3QgdGhyb3cgYW55dGhpbmcKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHVibGljIHZvaWQgdGVzdEV4Y2VwdGlvbihzdHJpbmcgYXJnKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0RXhjZXB0aW9uKCIgKyBhcmcgKyAiKSIpOwotICAgICAgICAgICAgICAgIGlmIChhcmcgPT0gIlhjZXB0aW9uIikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFhjZXB0aW9uIHggPSBuZXcgWGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgeC5FcnJvckNvZGUgPSAxMDAxOwotICAgICAgICAgICAgICAgICAgICB4Lk1lc3NhZ2UgPSBhcmc7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IHg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChhcmcgPT0gIlRFeGNlcHRpb24iKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRocmlmdC5URXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIFh0cnVjdCB0ZXN0TXVsdGlFeGNlcHRpb24oc3RyaW5nIGFyZzAsIHN0cmluZyBhcmcxKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0TXVsdGlFeGNlcHRpb24oIiArIGFyZzAgKyAiLCAiICsgYXJnMSArICIpIik7Ci0gICAgICAgICAgICAgICAgaWYgKGFyZzAgPT0gIlhjZXB0aW9uIikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFhjZXB0aW9uIHggPSBuZXcgWGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgeC5FcnJvckNvZGUgPSAxMDAxOwotICAgICAgICAgICAgICAgICAgICB4Lk1lc3NhZ2UgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbiI7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IHg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZzAgPT0gIlhjZXB0aW9uMiIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBYY2VwdGlvbjIgeCA9IG5ldyBYY2VwdGlvbjIoKTsKLSAgICAgICAgICAgICAgICAgICAgeC5FcnJvckNvZGUgPSAyMDAyOwotICAgICAgICAgICAgICAgICAgICB4LlN0cnVjdF90aGluZyA9IG5ldyBYdHJ1Y3QoKTsKLSAgICAgICAgICAgICAgICAgICAgeC5TdHJ1Y3RfdGhpbmcuU3RyaW5nX3RoaW5nID0gIlRoaXMgaXMgYW4gWGNlcHRpb24yIjsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgeDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBYdHJ1Y3QgcmVzdWx0ID0gbmV3IFh0cnVjdCgpOwotICAgICAgICAgICAgICAgIHJlc3VsdC5TdHJpbmdfdGhpbmcgPSBhcmcxOwotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RTdG9wKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoc2VydmVyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIuU3RvcCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgdGVzdE9uZXdheShpbnQgYXJnKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0T25ld2F5KCIgKyBhcmcgKyAiKSwgc2xlZXBpbmcuLi4iKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uVGhyZWFkaW5nLlRocmVhZC5TbGVlcChhcmcgKiAxMDAwKTsKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdE9uZXdheSBmaW5pc2hlZCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gLy8gY2xhc3MgVGVzdEhhbmRsZXIKLQotICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2wgRXhlY3V0ZShzdHJpbmdbXSBhcmdzKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBib29sIHVzZUJ1ZmZlcmVkU29ja2V0cyA9IGZhbHNlLCB1c2VGcmFtZWQgPSBmYWxzZSwgdXNlRW5jcnlwdGlvbiA9IGZhbHNlLCBjb21wYWN0ID0gZmFsc2UsIGpzb24gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBpbnQgcG9ydCA9IDkwOTA7Ci0gICAgICAgICAgICAgICAgc3RyaW5nIHBpcGUgPSBudWxsOwotICAgICAgICAgICAgICAgIHN0cmluZyBjZXJ0UGF0aCA9ICIuLi8uLi8uLi8uLi8uLi9rZXlzL3NlcnZlci5wZW0iOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5MZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhcmdzW2ldID09ICItcGlwZSIpICAvLyAtcGlwZSBuYW1lCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBpcGUgPSBhcmdzWysraV07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXS5Db250YWlucygiLS1wb3J0PSIpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwb3J0ID0gaW50LlBhcnNlKGFyZ3NbaV0uU3Vic3RyaW5nKGFyZ3NbaV0uSW5kZXhPZigiPSIpKzEpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItYiIgfHwgYXJnc1tpXSA9PSAiLS1idWZmZXJlZCIgfHwgYXJnc1tpXSA9PSAiLS10cmFuc3BvcnQ9YnVmZmVyZWQiKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1c2VCdWZmZXJlZFNvY2tldHMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi1mIiB8fCBhcmdzW2ldID09ICItLWZyYW1lZCIgIHx8IGFyZ3NbaV0gPT0gIi0tdHJhbnNwb3J0PWZyYW1lZCIpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZUZyYW1lZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS1jb21wYWN0IiB8fCBhcmdzW2ldID09ICItLXByb3RvY29sPWNvbXBhY3QiKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb21wYWN0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLWpzb24iIHx8IGFyZ3NbaV0gPT0gIi0tcHJvdG9jb2w9anNvbiIpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGpzb24gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi0tc3NsIikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdXNlRW5jcnlwdGlvbiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXS5TdGFydHNXaXRoKCItLWNlcnQ9IikpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRQYXRoID0gYXJnc1tpXS5TdWJzdHJpbmcoIi0tY2VydD0iLkxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBQcm9jZXNzb3IKLSAgICAgICAgICAgICAgICBUZXN0SGFuZGxlciB0ZXN0SGFuZGxlciA9IG5ldyBUZXN0SGFuZGxlcigpOwotICAgICAgICAgICAgICAgIFRocmlmdFRlc3QuUHJvY2Vzc29yIHRlc3RQcm9jZXNzb3IgPSBuZXcgVGhyaWZ0VGVzdC5Qcm9jZXNzb3IodGVzdEhhbmRsZXIpOwotCi0gICAgICAgICAgICAgICAgLy8gVHJhbnNwb3J0Ci0gICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCB0cmFuczsKLSAgICAgICAgICAgICAgICBpZiggcGlwZSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydChwaXBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHVzZUVuY3J5cHRpb24pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gbmV3IFRUTFNTZXJ2ZXJTb2NrZXQocG9ydCwgMCwgdXNlQnVmZmVyZWRTb2NrZXRzLCBuZXcgWDUwOUNlcnRpZmljYXRlMihjZXJ0UGF0aCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVFNlcnZlclNvY2tldChwb3J0LCAwLCB1c2VCdWZmZXJlZFNvY2tldHMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBwcm90bzsKLSAgICAgICAgICAgICAgICBpZiAoIGNvbXBhY3QgKQotICAgICAgICAgICAgICAgICAgICBwcm90byA9IG5ldyBUQ29tcGFjdFByb3RvY29sLkZhY3RvcnkoKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICgganNvbiApCi0gICAgICAgICAgICAgICAgICAgIHByb3RvID0gbmV3IFRKU09OUHJvdG9jb2wuRmFjdG9yeSgpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgcHJvdG8gPSBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKTsKLQotICAgICAgICAgICAgICAgIC8vIFNpbXBsZSBTZXJ2ZXIKLSAgICAgICAgICAgICAgICBUU2VydmVyIHNlcnZlckVuZ2luZTsKLSAgICAgICAgICAgICAgICBpZiAoIHVzZUZyYW1lZCApCi0gICAgICAgICAgICAgICAgICAgIHNlcnZlckVuZ2luZSA9IG5ldyBUU2ltcGxlU2VydmVyKHRlc3RQcm9jZXNzb3IsIHRyYW5zLCBuZXcgVEZyYW1lZFRyYW5zcG9ydC5GYWN0b3J5KCksIHByb3RvKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHNlcnZlckVuZ2luZSA9IG5ldyBUU2ltcGxlU2VydmVyKHRlc3RQcm9jZXNzb3IsIHRyYW5zLCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgcHJvdG8pOwotCi0gICAgICAgICAgICAgICAgLy8gVGhyZWFkUG9vbCBTZXJ2ZXIKLSAgICAgICAgICAgICAgICAvLyBzZXJ2ZXJFbmdpbmUgPSBuZXcgVFRocmVhZFBvb2xTZXJ2ZXIodGVzdFByb2Nlc3NvciwgdFNlcnZlclNvY2tldCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBUaHJlYWRlZCBTZXJ2ZXIKLSAgICAgICAgICAgICAgICAvLyBzZXJ2ZXJFbmdpbmUgPSBuZXcgVFRocmVhZGVkU2VydmVyKHRlc3RQcm9jZXNzb3IsIHRTZXJ2ZXJTb2NrZXQpOwotCi0gICAgICAgIC8vU2VydmVyIGV2ZW50IGhhbmRsZXIKLSAgICAgICAgVHJhZGVTZXJ2ZXJFdmVudEhhbmRsZXIgc2VydmVyRXZlbnRzID0gbmV3IFRyYWRlU2VydmVyRXZlbnRIYW5kbGVyKCk7Ci0gICAgICAgIHNlcnZlckVuZ2luZS5zZXRFdmVudEhhbmRsZXIoc2VydmVyRXZlbnRzKTsKLQotICAgICAgICAgICAgICAgIHRlc3RIYW5kbGVyLnNlcnZlciA9IHNlcnZlckVuZ2luZTsKLQotICAgICAgICAgICAgICAgIC8vIFJ1biBpdAotICAgICAgICAgICAgICAgIHN0cmluZyB3aGVyZSA9ICggcGlwZSAhPSBudWxsID8gIm9uIHBpcGUgIitwaXBlIDogIm9uIHBvcnQgIiArIHBvcnQpOwotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJTdGFydGluZyB0aGUgc2VydmVyICIgKyB3aGVyZSArCi0gICAgICAgICAgICAgICAgICAgICh1c2VCdWZmZXJlZFNvY2tldHMgPyAiIHdpdGggYnVmZmVyZWQgc29ja2V0IiA6ICIiKSArCi0gICAgICAgICAgICAgICAgICAgICh1c2VGcmFtZWQgPyAiIHdpdGggZnJhbWVkIHRyYW5zcG9ydCIgOiAiIikgKwotICAgICAgICAgICAgICAgICAgICAodXNlRW5jcnlwdGlvbiA/ICIgd2l0aCBlbmNyeXB0aW9uIiA6ICIiKSArCi0gICAgICAgICAgICAgICAgICAgIChjb21wYWN0ID8gIiB3aXRoIGNvbXBhY3QgcHJvdG9jb2wiIDogIiIpICsKLSAgICAgICAgICAgICAgICAgICAgKGpzb24gPyAiIHdpdGgganNvbiBwcm90b2NvbCIgOiAiIikgKwotICAgICAgICAgICAgICAgICAgICAiLi4uIik7Ci0gICAgICAgICAgICAgICAgc2VydmVyRW5naW5lLlNlcnZlKCk7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24geCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb25zb2xlLkVycm9yLldyaXRlKHgpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJkb25lLiIpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0VGVzdC9UaHJpZnRUZXN0LmNzcHJvaiBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRUZXN0L1RocmlmdFRlc3QuY3Nwcm9qCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjcxOTk3Li4wMDAwMDAwCi0tLSBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRUZXN0L1RocmlmdFRlc3QuY3Nwcm9qCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLe+7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgotICA8UHJvcGVydHlHcm91cD4KLSAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KLSAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+Ci0gICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4yMTAyMjwvUHJvZHVjdFZlcnNpb24+Ci0gICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPgotICAgIDxQcm9qZWN0R3VpZD57NDhERDc1N0YtQ0E5NS00REQ3LUJEQTQtNThEQjZGMTA4QzJDfTwvUHJvamVjdEd1aWQ+Ci0gICAgPE91dHB1dFR5cGU+RXhlPC9PdXRwdXRUeXBlPgotICAgIDxBcHBEZXNpZ25lckZvbGRlcj5Qcm9wZXJ0aWVzPC9BcHBEZXNpZ25lckZvbGRlcj4KLSAgICA8Um9vdE5hbWVzcGFjZT5UaHJpZnRUZXN0PC9Sb290TmFtZXNwYWNlPgotICAgIDxBc3NlbWJseU5hbWU+VGhyaWZ0VGVzdDwvQXNzZW1ibHlOYW1lPgotICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnYzLjU8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+Ci0gICAgPEZpbGVBbGlnbm1lbnQ+NTEyPC9GaWxlQWxpZ25tZW50PgotICAgIDxJc1dlYkJvb3RzdHJhcHBlcj5mYWxzZTwvSXNXZWJCb290c3RyYXBwZXI+Ci0gICAgPEZpbGVVcGdyYWRlRmxhZ3M+Ci0gICAgPC9GaWxlVXBncmFkZUZsYWdzPgotICAgIDxPbGRUb29sc1ZlcnNpb24+My41PC9PbGRUb29sc1ZlcnNpb24+Ci0gICAgPFVwZ3JhZGVCYWNrdXBMb2NhdGlvbiAvPgotICAgIDxQdWJsaXNoVXJsPnB1Ymxpc2hcPC9QdWJsaXNoVXJsPgotICAgIDxJbnN0YWxsPnRydWU8L0luc3RhbGw+Ci0gICAgPEluc3RhbGxGcm9tPkRpc2s8L0luc3RhbGxGcm9tPgotICAgIDxVcGRhdGVFbmFibGVkPmZhbHNlPC9VcGRhdGVFbmFibGVkPgotICAgIDxVcGRhdGVNb2RlPkZvcmVncm91bmQ8L1VwZGF0ZU1vZGU+Ci0gICAgPFVwZGF0ZUludGVydmFsPjc8L1VwZGF0ZUludGVydmFsPgotICAgIDxVcGRhdGVJbnRlcnZhbFVuaXRzPkRheXM8L1VwZGF0ZUludGVydmFsVW5pdHM+Ci0gICAgPFVwZGF0ZVBlcmlvZGljYWxseT5mYWxzZTwvVXBkYXRlUGVyaW9kaWNhbGx5PgotICAgIDxVcGRhdGVSZXF1aXJlZD5mYWxzZTwvVXBkYXRlUmVxdWlyZWQ+Ci0gICAgPE1hcEZpbGVFeHRlbnNpb25zPnRydWU8L01hcEZpbGVFeHRlbnNpb25zPgotICAgIDxBcHBsaWNhdGlvblJldmlzaW9uPjA8L0FwcGxpY2F0aW9uUmV2aXNpb24+Ci0gICAgPEFwcGxpY2F0aW9uVmVyc2lvbj4xLjAuMC4lMmE8L0FwcGxpY2F0aW9uVmVyc2lvbj4KLSAgICA8VXNlQXBwbGljYXRpb25UcnVzdD5mYWxzZTwvVXNlQXBwbGljYXRpb25UcnVzdD4KLSAgICA8Qm9vdHN0cmFwcGVyRW5hYmxlZD50cnVlPC9Cb290c3RyYXBwZXJFbmFibGVkPgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPgotICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPgotICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPgotICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+Ci0gICAgPE91dHB1dFBhdGg+YmluXERlYnVnXDwvT3V0cHV0UGF0aD4KLSAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFPC9EZWZpbmVDb25zdGFudHM+Ci0gICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+Ci0gICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+Ci0gICAgPENvZGVBbmFseXNpc1J1bGVTZXQ+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPgotICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPgotICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4KLSAgICA8T3V0cHV0UGF0aD5iaW5cUmVsZWFzZVw8L091dHB1dFBhdGg+Ci0gICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgotICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgotICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgotICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0PkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+Ci0gIDwvUHJvcGVydHlHcm91cD4KLSAgPEl0ZW1Hcm91cD4KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlRocmlmdEltcGwsIFZlcnNpb249MC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9TVNJTCI+Ci0gICAgICA8U3BlY2lmaWNWZXJzaW9uPkZhbHNlPC9TcGVjaWZpY1ZlcnNpb24+Ci0gICAgICA8SGludFBhdGg+LlxUaHJpZnRJbXBsLmRsbDwvSGludFBhdGg+Ci0gICAgPC9SZWZlcmVuY2U+Ci0gIDwvSXRlbUdyb3VwPgotICA8SXRlbUdyb3VwPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlByb2dyYW0uY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdENsaWVudC5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0U2VydmVyLmNzIiAvPgotICA8L0l0ZW1Hcm91cD4KLSAgPEl0ZW1Hcm91cD4KLSAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkNsaWVudC4zLjUiPgotICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+Ci0gICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy41IFNQMSBDbGllbnQgUHJvZmlsZTwvUHJvZHVjdE5hbWU+Ci0gICAgICA8SW5zdGFsbD5mYWxzZTwvSW5zdGFsbD4KLSAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+Ci0gICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5GcmFtZXdvcmsuMi4wIj4KLSAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgotICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDIuMCAlMjh4ODYlMjk8L1Byb2R1Y3ROYW1lPgotICAgICAgPEluc3RhbGw+ZmFsc2U8L0luc3RhbGw+Ci0gICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgotICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuRnJhbWV3b3JrLjMuMCI+Ci0gICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KLSAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAzLjAgJTI4eDg2JTI5PC9Qcm9kdWN0TmFtZT4KLSAgICAgIDxJbnN0YWxsPmZhbHNlPC9JbnN0YWxsPgotICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KLSAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkZyYW1ld29yay4zLjUiPgotICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+Ci0gICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy41PC9Qcm9kdWN0TmFtZT4KLSAgICAgIDxJbnN0YWxsPnRydWU8L0luc3RhbGw+Ci0gICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgotICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuRnJhbWV3b3JrLjMuNS5TUDEiPgotICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+Ci0gICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy41IFNQMTwvUHJvZHVjdE5hbWU+Ci0gICAgICA8SW5zdGFsbD5mYWxzZTwvSW5zdGFsbD4KLSAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+Ci0gICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0LldpbmRvd3MuSW5zdGFsbGVyLjMuMSI+Ci0gICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KLSAgICAgIDxQcm9kdWN0TmFtZT5XaW5kb3dzIEluc3RhbGxlciAzLjE8L1Byb2R1Y3ROYW1lPgotICAgICAgPEluc3RhbGw+dHJ1ZTwvSW5zdGFsbD4KLSAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+Ci0gIDwvSXRlbUdyb3VwPgotICA8SXRlbUdyb3VwPgotICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXHNyY1xUaHJpZnQuY3Nwcm9qIj4KLSAgICAgIDxQcm9qZWN0Pns0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9PC9Qcm9qZWN0PgotICAgICAgPE5hbWU+VGhyaWZ0PC9OYW1lPgotICAgIDwvUHJvamVjdFJlZmVyZW5jZT4KLSAgPC9JdGVtR3JvdXA+Ci0gIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkVG9vbHNQYXRoKVxNaWNyb3NvZnQuQ1NoYXJwLnRhcmdldHMiIC8+Ci0gIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuCi0gICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLgotICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4KLSAgPC9UYXJnZXQ+Ci0gIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+Ci0gIDwvVGFyZ2V0PgotICAtLT4KLSAgPFByb3BlcnR5R3JvdXA+Ci0gICAgPFByZUJ1aWxkRXZlbnQ+cm1kaXIgL3MgL3EgIiQoUHJvamVjdERpcilnZW4tY3NoYXJwIgotZGVsIC9mIC9xICIkKFByb2plY3REaXIpVGhyaWZ0SW1wbC5kbGwiCi1TRVQgT1VUUFVUX0RJUj0kKFByb2plY3REaXIpCi1TRVQgVEhSSUZUX0ZJTEU9JChQcm9qZWN0RGlyKVwuLlwuLlwuLlwuLlx0ZXN0XFRocmlmdFRlc3QudGhyaWZ0Ci1mb3IgJTI1JTI1SSBpbiAoIiUyNU9VVFBVVF9ESVIlMjUiKSBkbyBzZXQgU0hPUlRfRElSPSUyNSUyNX5mc0kKLWZvciAlMjUlMjVJIGluICgiJTI1VEhSSUZUX0ZJTEUlMjUiKSBkbyBzZXQgVEhSSUZUX1NIT1JUPSUyNSUyNX5mc0kKLSIkKFByb2plY3REaXIpXC4uXC4uXC4uXC4uXGNvbXBpbGVyXGNwcFx0aHJpZnQuZXhlIiAtLWdlbiBjc2hhcnAgLW8gJTI1U0hPUlRfRElSJTI1ICUyNVRIUklGVF9TSE9SVCUyNQotJChNU0J1aWxkVG9vbHNQYXRoKVxDc2MuZXhlIC90OmxpYnJhcnkgL291dDoiJChQcm9qZWN0RGlyKVRocmlmdEltcGwuZGxsIiAvcmVjdXJzZToiJChQcm9qZWN0RGlyKWdlbi1jc2hhcnAiXCogL3JlZmVyZW5jZToiJChQcm9qZWN0RGlyKS4uXC4uXHNyY1xiaW5cRGVidWdcVGhyaWZ0LmRsbCI8L1ByZUJ1aWxkRXZlbnQ+Ci0gIDwvUHJvcGVydHlHcm91cD4KLTwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0VGVzdC9tYWtldGVzdC5zaCBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRUZXN0L21ha2V0ZXN0LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMTBhNTIzLi4wMDAwMDAwCi0tLSBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRUZXN0L21ha2V0ZXN0LnNoCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotIyEvYmluL3NoCi0KLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0uLi8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC0tZ2VuIGNzaGFycCAtbyAuIC4uLy4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKLWdtY3MgL3Q6bGlicmFyeSAvb3V0Oi4vVGhyaWZ0SW1wbC5kbGwgL3JlY3Vyc2U6Li9nZW4tY3NoYXJwLyogL3JlZmVyZW5jZTouLi8uLi9UaHJpZnQuZGxsCi1nbWNzICAvb3V0OlRlc3RDbGllbnRTZXJ2ZXIuZXhlIC9yZWZlcmVuY2U6Li4vLi4vVGhyaWZ0LmRsbCAvcmVmZXJlbmNlOlRocmlmdEltcGwuZGxsIFRlc3RDbGllbnQuY3MgVGVzdFNlcnZlci5jcyBQcm9ncmFtLmNzCi0KLWV4cG9ydCBNT05PX1BBVEg9Li4vLi4vCi0KLXRpbWVvdXQgMTIwIC4vVGVzdENsaWVudFNlcnZlci5leGUgc2VydmVyICYKLXNsZWVwIDEKLS4vVGVzdENsaWVudFNlcnZlci5leGUgY2xpZW50CmRpZmYgLS1naXQgYS9saWIvZC9NYWtlZmlsZS5hbSBiL2xpYi9kL01ha2VmaWxlLmFtCmluZGV4IDMwYjVlYjMuLjJhODEyMTggMTAwNjQ0Ci0tLSBhL2xpYi9kL01ha2VmaWxlLmFtCisrKyBiL2xpYi9kL01ha2VmaWxlLmFtCkBAIC0xNzcsNyArMTc3LDcgQEAKIAl0b3VjaCAkQAogCiB1bml0dGVzdC9kZWJ1Zy8lOiBzcmMvJS5kICQoYWxsX3RhcmdldHMpIHVuaXR0ZXN0L2VtcHR5bWFpbi5kCi0JJChETUQpIC1nYyAtb2YkKHN1YnN0IC8sJChETURfT0ZfRElSU0VQKSwkQCkgJChkX3Rlc3RfZmxhZ3MpICReCisJJChETUQpIC1nIC1vZiQoc3Vic3QgLywkKERNRF9PRl9ESVJTRVApLCRAKSAkKGRfdGVzdF9mbGFncykgJF4KIAogdW5pdHRlc3QvcmVsZWFzZS8lOiBzcmMvJS5kICQoYWxsX3RhcmdldHMpIHVuaXR0ZXN0L2VtcHR5bWFpbi5kCiAJJChETUQpIC1PIC1yZWxlYXNlIC1vZiQoc3Vic3QgLywkKERNRF9PRl9ESVJTRVApLCRAKSAkKGRfdGVzdF9mbGFncykgJF4KQEAgLTE4NSw2ICsxODUsOCBAQAogVEVTVFMgPSAkKGFkZHByZWZpeCB1bml0dGVzdC9kZWJ1Zy8sICQoZF90ZXN0X21vZHVsZXMpKSBcCiAJJChhZGRwcmVmaXggdW5pdHRlc3QvcmVsZWFzZS8sICQoZF90ZXN0X21vZHVsZXMpKQogCitwcmVjcm9zczogYWxsLWxvY2FsCisJJChNQUtFKSAtQyB0ZXN0IHByZWNyb3NzCiAKIEVYVFJBX0RJU1QgPSBcCiAJc3JjIFwKZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvYXN5bmMvbGliZXZlbnQuZCBiL2xpYi9kL3NyYy90aHJpZnQvYXN5bmMvbGliZXZlbnQuZAppbmRleCA5NjdjNDFmLi44MTJlNGE3IDEwMDY0NAotLS0gYS9saWIvZC9zcmMvdGhyaWZ0L2FzeW5jL2xpYmV2ZW50LmQKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9hc3luYy9saWJldmVudC5kCkBAIC0zOTIsNyArMzkyLDcgQEAKICAgICAgIFRBc3luY0V2ZW50UmVhc29uLk5PUk1BTDsKICAgICAoKihjYXN0KFRTb2NrZXRFdmVudExpc3RlbmVyKilhcmcpKShyZWFzb24pOwogICAgIEdDLnJlbW92ZVJhbmdlKGFyZyk7Ci0gICAgY2xlYXIoYXJnKTsKKyAgICBkZXN0cm95KGFyZyk7CiAgICAgZnJlZShhcmcpOwogICB9CiAKQEAgLTQwMiw3ICs0MDIsNyBAQAogICAgIGFzc2VydChmbGFncyAmIEVWX1RJTUVPVVQpOwogICAgICgqKGNhc3Qodm9pZCBkZWxlZ2F0ZSgpKilhcmcpKSgpOwogICAgIEdDLnJlbW92ZVJhbmdlKGFyZyk7Ci0gICAgY2xlYXIoYXJnKTsKKyAgICBkZXN0cm95KGFyZyk7CiAgICAgZnJlZShhcmcpOwogICB9CiAKQEAgLTQ0Miw4ICs0NDIsOCBAQAogCiBwcml2YXRlIHsKICAgdGltZXZhbCB0b1RpbWV2YWwoY29uc3QoRHVyYXRpb24pIGR1cikgewotICAgIHRpbWV2YWwgdHYgPSB7dHZfc2VjOiBjYXN0KGludClkdXIudG90YWwhInNlY29uZHMiKCksCi0gICAgICB0dl91c2VjOiBkdXIuZnJhY1NlYy51c2Vjc307CisgICAgdGltZXZhbCB0djsKKyAgICBkdXIuc3BsaXQhKCJzZWNvbmRzIiwgInVzZWNzIikodHYudHZfc2VjLCB0di50dl91c2VjKTsKICAgICByZXR1cm4gdHY7CiAgIH0KIApkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9hc3luYy9zb2NrZXQuZCBiL2xpYi9kL3NyYy90aHJpZnQvYXN5bmMvc29ja2V0LmQKaW5kZXggNmRlMTNkOS4uYTA4ZjUxZCAxMDA2NDQKLS0tIGEvbGliL2Qvc3JjL3RocmlmdC9hc3luYy9zb2NrZXQuZAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L2FzeW5jL3NvY2tldC5kCkBAIC0xOCw2ICsxOCw3IEBACiAgKi8KIG1vZHVsZSB0aHJpZnQuYXN5bmMuc29ja2V0OwogCitpbXBvcnQgY29yZS5zdGRjLmVycm5vOiBFQ09OTlJFU0VUOwogaW1wb3J0IGNvcmUudGhyZWFkIDogRmliZXI7CiBpbXBvcnQgY29yZS50aW1lIDogZHVyLCBEdXJhdGlvbjsKIGltcG9ydCBzdGQuYXJyYXkgOiBlbXB0eTsKZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvYmFzZS5kIGIvbGliL2Qvc3JjL3RocmlmdC9iYXNlLmQKaW5kZXggNmUxYjU1OC4uZDVlY2U3MyAxMDA2NDQKLS0tIGEvbGliL2Qvc3JjL3RocmlmdC9iYXNlLmQKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9iYXNlLmQKQEAgLTUwLDcgKzUwLDcgQEAKIC8vLyBUaGUgVGhyaWZ0IHZlcnNpb24gc3RyaW5nLCB1c2VkIGZvciBpbmZvcm1hdGl2ZSBwdXJwb3Nlcy4KIC8vIE5vdGU6IFRoaXMgaXMgY3VycmVudGx5IGhhcmRjb2RlZCwgYnV0IHdpbGwgbGlrZWx5IGJlIGZpbGxlZCBpbiBieSB0aGUgYnVpbGQKIC8vIHN5c3RlbSBpbiBmdXR1cmUgdmVyc2lvbnMuCi1lbnVtIFZFUlNJT04gPSAiMC45LjMiOworZW51bSBWRVJTSU9OID0gIjEuMC4wIjsKIAogLyoqCiAgKiBGdW5jdGlvbnMgdXNlZCBmb3IgbG9nZ2luZyBpbnNpZGUgVGhyaWZ0LgpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9jb2RlZ2VuL2Jhc2UuZCBiL2xpYi9kL3NyYy90aHJpZnQvY29kZWdlbi9iYXNlLmQKaW5kZXggOTA2MWQwYi4uZGI1NDk5MiAxMDA2NDQKLS0tIGEvbGliL2Qvc3JjL3RocmlmdC9jb2RlZ2VuL2Jhc2UuZAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L2NvZGVnZW4vYmFzZS5kCkBAIC00OCw2ICs0OCw3IEBACiBpbXBvcnQgdGhyaWZ0LmJhc2U7CiBpbXBvcnQgdGhyaWZ0LmludGVybmFsLmNvZGVnZW47CiBpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmJhc2U7CitpbXBvcnQgdGhyaWZ0LnV0aWwuaGFzaHNldDsKIAogLyoKICAqIFRocmlmdCBzdHJ1Y3Qvc2VydmljZSBtZXRhIGRhdGEsIHdoaWNoIGlzIHVzZWQgdG8gc3RvcmUgaW5mb3JtYXRpb24gZnJvbQpAQCAtNDIwLDcgKzQyMSw3IEBACiAgICAgICByZXR1cm4gKGNhc3QoKXN1cGVyKS5vcEVxdWFscyhvdGhlcik7CiAgICAgfQogCi0gICAgc2l6ZV90IHRvSGFzaCgpIGNvbnN0IHsKKyAgICBvdmVycmlkZSBzaXplX3QgdG9IYXNoKCkgY29uc3QgewogICAgICAgcmV0dXJuIHRocmlmdFRvSGFzaEltcGwoKTsKICAgICB9CiAgIH0gZWxzZSB7CkBAIC00NjksOCArNDcwLDggQEAKIAogICBwcml2YXRlIHNpemVfdCB0aHJpZnRUb0hhc2hJbXBsKCkgY29uc3QgQHRydXN0ZWQgbm90aHJvdyB7CiAgICAgc2l6ZV90IGhhc2ggPSAwOwotICAgIGZvcmVhY2ggKG5hbWU7IEZpZWxkTmFtZXMhVGhpcykgewotICAgICAgYXV0byB2YWwgPSBtaXhpbigidGhpcy4iIH4gbmFtZSk7CisgICAgZm9yZWFjaCAoaSwgXzsgdGhpcy50dXBsZW9mKSB7CisgICAgICBhdXRvIHZhbCA9IHRoaXMudHVwbGVvZltpXTsKICAgICAgIGhhc2ggKz0gdHlwZWlkKHZhbCkuZ2V0SGFzaCgmdmFsKTsKICAgICB9CiAgICAgcmV0dXJuIGhhc2g7CkBAIC01OTEsNyArNTkyLDcgQEAKICAqIHRoZSB3aXJlIHdpdGhvdXQgYWx0ZXJpbmcgdGhlaXIgZGVmaW5pdGlvbnMuCiAgKi8KIHZvaWQgcmVhZFN0cnVjdChULCBQcm90b2NvbCwgYWxpYXMgZmllbGRNZXRhRGF0YSA9IGNhc3QoVEZpZWxkTWV0YVtdKW51bGwsCi0gIGJvb2wgcG9pbnRlclN0cnVjdCA9IGZhbHNlKShyZWYgVCBzLCBQcm90b2NvbCBwKSBpZiAoaXNUUHJvdG9jb2whUHJvdG9jb2wpCisgIGJvb2wgcG9pbnRlclN0cnVjdCA9IGZhbHNlKShhdXRvIHJlZiBUIHMsIFByb3RvY29sIHApIGlmIChpc1RQcm90b2NvbCFQcm90b2NvbCkKIHsKICAgbWl4aW4oewogICAgIHN0cmluZyBjb2RlOwpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9jb2RlZ2VuL2lkbGdlbi5kIGIvbGliL2Qvc3JjL3RocmlmdC9jb2RlZ2VuL2lkbGdlbi5kCmluZGV4IDE4YWYxYWEuLjlmODg5MzYgMTAwNjQ0Ci0tLSBhL2xpYi9kL3NyYy90aHJpZnQvY29kZWdlbi9pZGxnZW4uZAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L2NvZGVnZW4vaWRsZ2VuLmQKQEAgLTY0MSwxMyArNjQxLDE2IEBACiB9CiBgKTsKIAotICBzdGF0aWMgYXNzZXJ0KHN0cnVjdElkbFN0cmluZyFXaXRoRGVmYXVsdHMgPT0KK2ltcG9ydCBzdGQuYWxnb3JpdGhtOworICBzdGF0aWMgYXNzZXJ0KHN0cnVjdElkbFN0cmluZyFXaXRoRGVmYXVsdHMuc3RhcnRzV2l0aCgKIGBzdHJ1Y3QgV2l0aERlZmF1bHRzIHsKICAgLTE6IHN0cmluZyBhID0gImFzZGYiLAotICAtMjogZG91YmxlIGIgPSAzLjE0MTUsCi0gIDE6IFdpdGhvdXRNZXRhIGMgPSB7YTogImZvbyIsIGI6IDMsIH0sCisgIC0yOiBkb3VibGUgYiA9IDMuMTQxYCkpOworCisgIHN0YXRpYyBhc3NlcnQoc3RydWN0SWRsU3RyaW5nIVdpdGhEZWZhdWx0cy5lbmRzV2l0aCgKK2AxOiBXaXRob3V0TWV0YSBjID0ge2E6ICJmb28iLCBiOiAzLCB9LAogfQotYCk7CitgKSk7CiAKICAgc3RhdGljIGFzc2VydChzdHJ1Y3RJZGxTdHJpbmchT25lT2ZFYWNoID09CiBgc3RydWN0IE9uZU9mRWFjaCB7CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL3NzbC5kIGIvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC9zc2wuZAppbmRleCA2M2EwYTJiLi4zYWY1NGI1IDEwMDY0NAotLS0gYS9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL3NzbC5kCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvc3NsLmQKQEAgLTE3OSw3ICsxNzksNyBAQAogICBFeGNlcHRpb24gZXhjZXB0aW9uOwogCiAgIHZvaWQgaW5pdE1lc3NhZ2UoKSB7Ci0gICAgbWVzc2FnZS5jbGVhcigpOworICAgIG1lc3NhZ2UuZGVzdHJveSgpOwogICAgIGhhZE1lc3NhZ2UgPSBmYWxzZTsKICAgICBpZiAoIWxvY2F0aW9uLmVtcHR5KSB7CiAgICAgICBtZXNzYWdlIH49IGxvY2F0aW9uOwpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC9zc2xfYmlvLmQgYi9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL3NzbF9iaW8uZAppbmRleCA3OTZiZTkxLi5hZTg1MDI3IDEwMDY0NAotLS0gYS9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL3NzbF9iaW8uZAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL3NzbF9iaW8uZApAQCAtNzMsNyArNzMsNyBAQAogICB2b2lkIHNldEVycm9yKEV4Y2VwdGlvbiBlKSBub3Rocm93IHsKICAgICBFUlJfcHV0X2Vycm9yKEVSUl9MSUJfRF9FWENFUFRJT04sIEVSUl9GX0RfRVhDRVBUSU9OLCBFUlJfUl9EX0VYQ0VQVElPTiwKICAgICAgIEVSUl9GSUxFX0RfRVhDRVBUSU9OLCBFUlJfTElORV9EX0VYQ0VQVElPTik7Ci0gICAgdHJ5IHsgR0MuYWRkUm9vdChjYXN0KHZvaWQqKWUpOyB9IGNhdGNoIHt9CisgICAgdHJ5IHsgR0MuYWRkUm9vdChjYXN0KHZvaWQqKWUpOyB9IGNhdGNoIChUaHJvd2FibGUpIHt9CiAgICAgRVJSX3NldF9lcnJvcl9kYXRhKGNhc3QoY2hhciopZSwgRVJSX0ZMQUdTX0RfRVhDRVBUSU9OKTsKICAgfQogCmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3Byb3RvY29sL2pzb24uZCBiL2xpYi9kL3NyYy90aHJpZnQvcHJvdG9jb2wvanNvbi5kCmluZGV4IGU4OWFlZTEuLjU2YTcxZGEgMTAwNjQ0Ci0tLSBhL2xpYi9kL3NyYy90aHJpZnQvcHJvdG9jb2wvanNvbi5kCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvcHJvdG9jb2wvanNvbi5kCkBAIC0yNiw2ICsyNiw3IEBACiBpbXBvcnQgc3RkLnN0cmluZyA6IGZvcm1hdDsKIGltcG9ydCBzdGQudHJhaXRzIDogaXNJbnRlZ3JhbDsKIGltcG9ydCBzdGQudHlwZXR1cGxlIDogYWxsU2F0aXNmeSwgVHlwZVR1cGxlOworaW1wb3J0IHN0ZC51dGYgOiB0b1VURjg7CiBpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmJhc2U7CiBpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5iYXNlOwogCkBAIC02MSw3ICs2Miw3IEBACiAgIH0KIAogICB2b2lkIHJlc2V0KCkgewotICAgIGNvbnRleHRTdGFja18uY2xlYXIoKTsKKyAgICBkZXN0cm95KGNvbnRleHRTdGFja18pOwogICAgIGNvbnRleHRfID0gbmV3IENvbnRleHQoKTsKICAgICByZWFkZXJfID0gbmV3IExvb2thaGVhZFJlYWRlcih0cmFuc18pOwogICB9CkBAIC0xMzIsNyArMTMzLDggQEAKICAgICBib29sIGVzY2FwZU51bSA9IHZhbHVlICFpcyBudWxsIHx8IGNvbnRleHRfLmVzY2FwZU51bTsKIAogICAgIGlmICh2YWx1ZSBpcyBudWxsKSB7Ci0gICAgICB2YWx1ZSA9IGZvcm1hdCgiJS4xNmciLCBkdWIpOworICAgICAgLyogcHJlY2lzaW9uIGlzIDE3ICovCisgICAgICB2YWx1ZSA9IGZvcm1hdCgiJS4xN2ciLCBkdWIpOwogICAgIH0KIAogICAgIGlmIChlc2NhcGVOdW0pIHRyYW5zXy53cml0ZShTVFJJTkdfREVMSU1JVEVSKTsKQEAgLTQ5MiwxMiArNDk0LDE1IEBACiAgICAgcmV0dXJuIHJlYWRTeW50YXhDaGFyKHJlYWRlcl8sIGNoKTsKICAgfQogCi0gIHVieXRlIHJlYWRKc29uRXNjYXBlQ2hhcigpIHsKLSAgICByZWFkSnNvblN5bnRheENoYXIoWkVST19DSEFSKTsKLSAgICByZWFkSnNvblN5bnRheENoYXIoWkVST19DSEFSKTsKKyAgd2NoYXIgcmVhZEpzb25Fc2NhcGVDaGFyKCkgewogICAgIGF1dG8gYSA9IHJlYWRlcl8ucmVhZCgpOwogICAgIGF1dG8gYiA9IHJlYWRlcl8ucmVhZCgpOwotICAgIHJldHVybiBjYXN0KHVieXRlKSgoaGV4VmFsKGFbMF0pIDw8IDQpICsgaGV4VmFsKGJbMF0pKTsKKyAgICBhdXRvIGMgPSByZWFkZXJfLnJlYWQoKTsKKyAgICBhdXRvIGQgPSByZWFkZXJfLnJlYWQoKTsKKyAgICByZXR1cm4gY2FzdCh1c2hvcnQpKAorICAgICAgICAgIChoZXhWYWwoYVswXSkgPDwgMTIpICsgKGhleFZhbChiWzBdKSA8PCA4KSArCisgICAgICAgICAgKGhleFZhbChjWzBdKSA8PCA0KSArIGhleFZhbChkWzBdKQorICAgICAgICApOwogICB9CiAKICAgc3RyaW5nIHJlYWRKc29uU3RyaW5nKGJvb2wgc2tpcENvbnRleHQgPSBmYWxzZSkgewpAQCAtNTA2LDYgKzUxMSw3IEBACiAgICAgcmVhZEpzb25TeW50YXhDaGFyKFNUUklOR19ERUxJTUlURVIpOwogICAgIGF1dG8gYnVmZmVyID0gYXBwZW5kZXIhc3RyaW5nKCk7CiAKKyAgICB3Y2hhcltdIHdjaHM7CiAgICAgaW50IGJ5dGVzUmVhZDsKICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgYXV0byBjaCA9IHJlYWRlcl8ucmVhZCgpOwpAQCAtNTIxLDcgKzUyNywxOCBAQAogICAgICAgaWYgKGNoID09IEJBQ0tTTEFTSCkgewogICAgICAgICBjaCA9IHJlYWRlcl8ucmVhZCgpOwogICAgICAgICBpZiAoY2ggPT0gRVNDQVBFX0NIQVIpIHsKLSAgICAgICAgICBjaCA9IHJlYWRKc29uRXNjYXBlQ2hhcigpOworICAgICAgICAgIGF1dG8gd2NoID0gcmVhZEpzb25Fc2NhcGVDaGFyKCk7CisgICAgICAgICAgaWYgKHdjaCA+PSAweEQ4MDAgJiYgd2NoIDw9IDB4REJGRikgeworICAgICAgICAgICAgd2NocyB+PSB3Y2g7CisgICAgICAgICAgfSBlbHNlIGlmICh3Y2ggPj0gMHhEQzAwICYmIHdjaCA8PSAweERGRkYgJiYgd2Nocy5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiTWlzc2luZyBVVEYtMTYgaGlnaCBzdXJyb2dhdGUuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRXhjZXB0aW9uLlR5cGUuSU5WQUxJRF9EQVRBKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd2NocyB+PSB3Y2g7CisgICAgICAgICAgICBidWZmZXIucHV0KHdjaHMudG9VVEY4KTsKKyAgICAgICAgICAgIHdjaHMgPSBbXTsKKyAgICAgICAgICB9CisgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgYXV0byBwb3MgPSBjb3VudFVudGlsKGtFc2NhcGVDaGFyc1tdLCBjaFswXSk7CiAgICAgICAgICAgaWYgKHBvcyA9PSAtMSkgewpAQCAtNTMxLDkgKzU0OCwxNyBAQAogICAgICAgICAgIGNoID0ga0VzY2FwZUNoYXJWYWxzW3Bvc107CiAgICAgICAgIH0KICAgICAgIH0KKyAgICAgIGlmICh3Y2hzLmxlbmd0aCAhPSAwKSB7CisgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIk1pc3NpbmcgVVRGLTE2IGxvdyBzdXJyb2dhdGUuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xFeGNlcHRpb24uVHlwZS5JTlZBTElEX0RBVEEpOworICAgICAgfQogICAgICAgYnVmZmVyLnB1dChjaFswXSk7CiAgICAgfQogCisgICAgaWYgKHdjaHMubGVuZ3RoICE9IDApIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIk1pc3NpbmcgVVRGLTE2IGxvdyBzdXJyb2dhdGUuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRXhjZXB0aW9uLlR5cGUuSU5WQUxJRF9EQVRBKTsKKyAgICB9CiAgICAgcmV0dXJuIGJ1ZmZlci5kYXRhOwogICB9CiAKQEAgLTc3Miw2ICs3OTcsMzYgQEAKIH0KIAogdW5pdHRlc3QgeworICBpbXBvcnQgc3RkLmV4Y2VwdGlvbjsKKyAgaW1wb3J0IHRocmlmdC50cmFuc3BvcnQubWVtb3J5OworCisgIGF1dG8gYnVmID0gbmV3IFRNZW1vcnlCdWZmZXIoY2FzdCh1Ynl0ZVtdKSJcIlxcdTBlMDEgXFx1ZDgzNVxcdWRkM2VcIiIpOworICBhdXRvIGpzb24gPSB0SnNvblByb3RvY29sKGJ1Zik7CisgIGF1dG8gc3RyID0ganNvbi5yZWFkU3RyaW5nKCk7CisgIGVuZm9yY2Uoc3RyID09ICLguIEg8J2UviIpOworfQorCit1bml0dGVzdCB7CisgIC8vIFRocm93biBpZiBsb3cgc3Vycm9nYXRlIGlzIG1pc3NpbmcuCisgIGltcG9ydCBzdGQuZXhjZXB0aW9uOworICBpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5tZW1vcnk7CisKKyAgYXV0byBidWYgPSBuZXcgVE1lbW9yeUJ1ZmZlcihjYXN0KHVieXRlW10pIlwiXFx1MGUwMSBcXHVkODM1XCIiKTsKKyAgYXV0byBqc29uID0gdEpzb25Qcm90b2NvbChidWYpOworICBhc3NlcnRUaHJvd24hVFByb3RvY29sRXhjZXB0aW9uKGpzb24ucmVhZFN0cmluZygpKTsKK30KKwordW5pdHRlc3QgeworICAvLyBUaHJvd24gaWYgaGlnaCBzdXJyb2dhdGUgaXMgbWlzc2luZy4KKyAgaW1wb3J0IHN0ZC5leGNlcHRpb247CisgIGltcG9ydCB0aHJpZnQudHJhbnNwb3J0Lm1lbW9yeTsKKworICBhdXRvIGJ1ZiA9IG5ldyBUTWVtb3J5QnVmZmVyKGNhc3QodWJ5dGVbXSkiXCJcXHUwZTAxIFxcdWRkM2VcIiIpOworICBhdXRvIGpzb24gPSB0SnNvblByb3RvY29sKGJ1Zik7CisgIGFzc2VydFRocm93biFUUHJvdG9jb2xFeGNlcHRpb24oanNvbi5yZWFkU3RyaW5nKCkpOworfQorCit1bml0dGVzdCB7CiAgIGltcG9ydCB0aHJpZnQuaW50ZXJuYWwudGVzdC5wcm90b2NvbDsKICAgdGVzdENvbnRhaW5lclNpemVMaW1pdCEoVEpzb25Qcm90b2NvbCEoKSkoKTsKICAgdGVzdFN0cmluZ1NpemVMaW1pdCEoVEpzb25Qcm90b2NvbCEoKSkoKTsKZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL2Jhc2UuZCBiL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL2Jhc2UuZAppbmRleCBmOTdhZGJlLi5hMjNiMWM3IDEwMDY0NAotLS0gYS9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci9iYXNlLmQKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvYmFzZS5kCkBAIC0xMTgsNiArMTE4LDM4IEBACiAgIFRUcmFuc3BvcnRGYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3RvcnlfOwogICBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5XzsKICAgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnlfOworCitwdWJsaWM6CisKKyAgQHByb3BlcnR5IFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3RvcnkoKQorICB7CisgICAgcmV0dXJuIHByb2Nlc3NvckZhY3RvcnlfOworICB9CisKKyAgQHByb3BlcnR5IFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0KCkKKyAgeworICAgIHJldHVybiBzZXJ2ZXJUcmFuc3BvcnRfOworICB9CisKKyAgQHByb3BlcnR5IFRUcmFuc3BvcnRGYWN0b3J5IGlucHV0VHJhbnNwb3J0RmFjdG9yeSgpCisgIHsKKyAgICByZXR1cm4gaW5wdXRUcmFuc3BvcnRGYWN0b3J5XzsKKyAgfQorCisgIEBwcm9wZXJ0eSBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5KCkKKyAgeworICAgIHJldHVybiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5XzsKKyAgfQorCisgIEBwcm9wZXJ0eSBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5KCkKKyAgeworICAgIHJldHVybiBpbnB1dFByb3RvY29sRmFjdG9yeV87CisgIH0KKworICBAcHJvcGVydHkgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnkoKQorICB7CisgICAgcmV0dXJuIG91dHB1dFByb3RvY29sRmFjdG9yeV87CisgIH0KIH0KIAogLyoqCmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci9ub25ibG9ja2luZy5kIGIvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvbm9uYmxvY2tpbmcuZAppbmRleCAwMjE2Nzk5Li41ODYwYzBjIDEwMDY0NAotLS0gYS9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci9ub25ibG9ja2luZy5kCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL25vbmJsb2NraW5nLmQKQEAgLTg5MywxNCArODkzLDE0IEBACiAgICAgICBjYWxsc1NpbmNlUmVzaXplXyA9IDA7CiAKICAgICAgIGZhY3RvcnlJbnB1dFRyYW5zcG9ydF8gPQotICAgICAgICBzZXJ2ZXJfLmlucHV0VHJhbnNwb3J0RmFjdG9yeV8uZ2V0VHJhbnNwb3J0KGlucHV0VHJhbnNwb3J0Xyk7CisgICAgICAgIHNlcnZlcl8uaW5wdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChpbnB1dFRyYW5zcG9ydF8pOwogICAgICAgZmFjdG9yeU91dHB1dFRyYW5zcG9ydF8gPQotICAgICAgICBzZXJ2ZXJfLm91dHB1dFRyYW5zcG9ydEZhY3RvcnlfLmdldFRyYW5zcG9ydChvdXRwdXRUcmFuc3BvcnRfKTsKKyAgICAgICAgc2VydmVyXy5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChvdXRwdXRUcmFuc3BvcnRfKTsKIAogICAgICAgaW5wdXRQcm90b2NvbF8gPQotICAgICAgICBzZXJ2ZXJfLmlucHV0UHJvdG9jb2xGYWN0b3J5Xy5nZXRQcm90b2NvbChmYWN0b3J5SW5wdXRUcmFuc3BvcnRfKTsKKyAgICAgICAgc2VydmVyXy5pbnB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChmYWN0b3J5SW5wdXRUcmFuc3BvcnRfKTsKICAgICAgIG91dHB1dFByb3RvY29sXyA9Ci0gICAgICAgIHNlcnZlcl8ub3V0cHV0UHJvdG9jb2xGYWN0b3J5Xy5nZXRQcm90b2NvbChmYWN0b3J5T3V0cHV0VHJhbnNwb3J0Xyk7CisgICAgICAgIHNlcnZlcl8ub3V0cHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKGZhY3RvcnlPdXRwdXRUcmFuc3BvcnRfKTsKIAogICAgICAgaWYgKHNlcnZlcl8uZXZlbnRIYW5kbGVyKSB7CiAgICAgICAgIGNvbm5lY3Rpb25Db250ZXh0XyA9CkBAIC05MDgsNyArOTA4LDcgQEAKICAgICAgIH0KIAogICAgICAgYXV0byBpbmZvID0gVENvbm5lY3Rpb25JbmZvKGlucHV0UHJvdG9jb2xfLCBvdXRwdXRQcm90b2NvbF8sIHNvY2tldF8pOwotICAgICAgcHJvY2Vzc29yXyA9IHNlcnZlcl8ucHJvY2Vzc29yRmFjdG9yeV8uZ2V0UHJvY2Vzc29yKGluZm8pOworICAgICAgcHJvY2Vzc29yXyA9IHNlcnZlcl8ucHJvY2Vzc29yRmFjdG9yeS5nZXRQcm9jZXNzb3IoaW5mbyk7CiAgICAgfQogCiAgICAgfnRoaXMoKSB7CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci9zaW1wbGUuZCBiL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL3NpbXBsZS5kCmluZGV4IGY3MTgzYTcuLjVhYmE0YzEgMTAwNjQ0Ci0tLSBhL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL3NpbXBsZS5kCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL3NpbXBsZS5kCkBAIC0xNDAsNyArMTQwLDkgQEAKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KSB7Ci0gICAgICAgIGxvZ0Vycm9yKCJDbGllbnQgZGllZDogJXMiLCB0dHgpOworICAgICAgICBpZiAodHR4LnR5cGUoKSAhPSBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuRU5EX09GX0ZJTEUpIHsKKyAgICAgICAgICBsb2dFcnJvcigiQ2xpZW50IGRpZWQgdW5leHBlY3RlZGx5OiAlcyIsIHR0eCk7CisgICAgICAgIH0KICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgIGxvZ0Vycm9yKCJVbmNhdWdodCBleGNlcHRpb246ICVzIiwgZSk7CiAgICAgICB9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci90YXNrcG9vbC5kIGIvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvdGFza3Bvb2wuZAppbmRleCBiNDcyMGE0Li42NzBlNzIwIDEwMDY0NAotLS0gYS9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci90YXNrcG9vbC5kCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL3Rhc2twb29sLmQKQEAgLTI2OCw3ICsyNjgsOSBAQAogICAgICAgICB9CiAgICAgICB9CiAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpIHsKLSAgICAgIGxvZ0Vycm9yKCJDbGllbnQgZGllZDogJXMiLCB0dHgpOworICAgICAgaWYgKHR0eC50eXBlKCkgIT0gVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLkVORF9PRl9GSUxFKSB7CisgICAgICAgIGxvZ0Vycm9yKCJDbGllbnQgZGllZCB1bmV4cGVjdGVkbHk6ICVzIiwgdHR4KTsKKyAgICAgIH0KICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgbG9nRXJyb3IoIlVuY2F1Z2h0IGV4Y2VwdGlvbjogJXMiLCBlKTsKICAgICB9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci90aHJlYWRlZC5kIGIvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvdGhyZWFkZWQuZAppbmRleCAxY2RlOTgzLi4zMDBjYzg0IDEwMDY0NAotLS0gYS9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci90aHJlYWRlZC5kCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL3RocmVhZGVkLmQKQEAgLTE3Myw3ICsxNzMsOSBAQAogICAgICAgICB9CiAgICAgICB9CiAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpIHsKLSAgICAgIGxvZ0Vycm9yKCJDbGllbnQgZGllZDogJXMiLCB0dHgpOworICAgICAgaWYgKHR0eC50eXBlKCkgIT0gVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLkVORF9PRl9GSUxFKSB7CisgICAgICAgIGxvZ0Vycm9yKCJDbGllbnQgZGllZCB1bmV4cGVjdGVkbHk6ICVzIiwgdHR4KTsKKyAgICAgIH0KICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgbG9nRXJyb3IoIlVuY2F1Z2h0IGV4Y2VwdGlvbjogJXMiLCBlKTsKICAgICB9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci90cmFuc3BvcnQvYmFzZS5kIGIvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvdHJhbnNwb3J0L2Jhc2UuZAppbmRleCBkYTE2NWQzLi43MDRlMTZkIDEwMDY0NAotLS0gYS9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci90cmFuc3BvcnQvYmFzZS5kCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL3RyYW5zcG9ydC9iYXNlLmQKQEAgLTk1LDE2ICs5NSw3IEBACiAKICAgLy8vCiAgIHRoaXMoVHlwZSB0eXBlLCBzdHJpbmcgZmlsZSA9IF9fRklMRV9fLCBzaXplX3QgbGluZSA9IF9fTElORV9fLCBUaHJvd2FibGUgbmV4dCA9IG51bGwpIHsKLSAgICBzdHJpbmcgbXNnID0gIlRUcmFuc3BvcnRFeGNlcHRpb246ICI7Ci0gICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICBjYXNlIFR5cGUuVU5LTk9XTjogbXNnIH49ICJVbmtub3duIHNlcnZlciB0cmFuc3BvcnQgZXhjZXB0aW9uIjsgYnJlYWs7Ci0gICAgICBjYXNlIFR5cGUuTk9UX0xJU1RFTklORzogbXNnIH49ICJTZXJ2ZXIgdHJhbnNwb3J0IG5vdCBsaXN0ZW5pbmciOyBicmVhazsKLSAgICAgIGNhc2UgVHlwZS5BTFJFQURZX0xJU1RFTklORzogbXNnIH49ICJTZXJ2ZXIgdHJhbnNwb3J0IGFscmVhZHkgbGlzdGVuaW5nIjsgYnJlYWs7Ci0gICAgICBjYXNlIFR5cGUuUkVTT1VSQ0VfRkFJTEVEOiBtc2cgfj0gIkFuIHVuZGVybHlpbmcgcmVzb3VyY2UgZmFpbGVkIjsgYnJlYWs7Ci0gICAgICBkZWZhdWx0OiBtc2cgfj0gIihJbnZhbGlkIGV4Y2VwdGlvbiB0eXBlKSI7IGJyZWFrOwotICAgIH0KLQotICAgIHRoaXMobXNnLCB0eXBlLCBmaWxlLCBsaW5lLCBuZXh0KTsKKyAgICB0aGlzKGVycm9yTXNnKHR5cGUpLCB0eXBlLCBmaWxlLCBsaW5lLCBuZXh0KTsKICAgfQogCiAgIC8vLwpAQCAtMTI5LDUgKzEyMCwxOCBAQAogCiBwcm90ZWN0ZWQ6CiAgIFR5cGUgdHlwZV87CisKK3ByaXZhdGU6CisgIHN0cmluZyBlcnJvck1zZyhUeXBlIHR5cGUpIHsKKyAgICBzdHJpbmcgbXNnID0gIlRUcmFuc3BvcnRFeGNlcHRpb246ICI7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICBjYXNlIFR5cGUuVU5LTk9XTjogbXNnIH49ICJVbmtub3duIHNlcnZlciB0cmFuc3BvcnQgZXhjZXB0aW9uIjsgYnJlYWs7CisgICAgICBjYXNlIFR5cGUuTk9UX0xJU1RFTklORzogbXNnIH49ICJTZXJ2ZXIgdHJhbnNwb3J0IG5vdCBsaXN0ZW5pbmciOyBicmVhazsKKyAgICAgIGNhc2UgVHlwZS5BTFJFQURZX0xJU1RFTklORzogbXNnIH49ICJTZXJ2ZXIgdHJhbnNwb3J0IGFscmVhZHkgbGlzdGVuaW5nIjsgYnJlYWs7CisgICAgICBjYXNlIFR5cGUuUkVTT1VSQ0VfRkFJTEVEOiBtc2cgfj0gIkFuIHVuZGVybHlpbmcgcmVzb3VyY2UgZmFpbGVkIjsgYnJlYWs7CisgICAgICBkZWZhdWx0OiBtc2cgfj0gIihJbnZhbGlkIGV4Y2VwdGlvbiB0eXBlKSI7IGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gbXNnOworICB9CiB9CiAKZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L2ZpbGUuZCBiL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L2ZpbGUuZAppbmRleCBjYjhiY2Q3Li5mZTg4ZTczIDEwMDY0NAotLS0gYS9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9maWxlLmQKKysrIGIvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvZmlsZS5kCkBAIC0zNyw3ICszNyw4IEBACiBpbXBvcnQgc3RkLmFsZ29yaXRobSA6IG1pbiwgbWF4OwogaW1wb3J0IHN0ZC5jb25jdXJyZW5jeTsKIGltcG9ydCBzdGQuY29udiA6IHRvOwotaW1wb3J0IHN0ZC5kYXRldGltZSA6IEF1dG9TdGFydCwgZHVyLCBEdXJhdGlvbiwgU3RvcFdhdGNoOworaW1wb3J0IHN0ZC5kYXRldGltZSA6IGR1ciwgRHVyYXRpb247CitpbXBvcnQgc3RkLmRhdGV0aW1lLnN0b3B3YXRjaCA6IEF1dG9TdGFydCwgU3RvcFdhdGNoOwogaW1wb3J0IHN0ZC5leGNlcHRpb247CiBpbXBvcnQgc3RkLnN0ZGlvIDogRmlsZTsKIGltcG9ydCB0aHJpZnQuYmFzZTsKQEAgLTYzNyw3ICs2MzgsNyBAQAogICBvdmVycmlkZSB2b2lkIGNsb3NlKCkgewogICAgIGlmICghaXNPcGVuKSByZXR1cm47CiAKLSAgICBwcmlvcml0eVNlbmQod3JpdGVyVGhyZWFkXywgU2h1dGRvd25NZXNzYWdlKCksIHRoaXNUaWQpOyAvLyBGSVhNRTogU2hvdWxkIHVzZSBub3JtYWwgc2VuZCBoZXJlLgorICAgIHNlbmQod3JpdGVyVGhyZWFkXywgU2h1dGRvd25NZXNzYWdlKCksIHRoaXNUaWQpOwogICAgIHJlY2VpdmUoKFNodXRkb3duTWVzc2FnZSBtc2csIFRpZCB0aWQpe30pOwogICAgIGlzT3Blbl8gPSBmYWxzZTsKICAgfQpAQCAtODQ3LDcgKzg0OCw3IEBACiAgICAgICAgIChpbW11dGFibGUodWJ5dGUpW10gZGF0YSkgewogICAgICAgICAgIHdoaWxlIChlcnJvck9wZW5pbmcpIHsKICAgICAgICAgICAgIGxvZ0Vycm9yKCJXcml0ZXIgdGhyZWFkIGdvaW5nIHRvIHNsZWVwIGZvciAlcyDCtXMgZHVlIHRvIElPIGVycm9ycyIsCi0gICAgICAgICAgICAgIGlvRXJyb3JTbGVlcER1cmF0aW9uLmZyYWNTZWMudXNlY3MpOworICAgICAgICAgICAgICBpb0Vycm9yU2xlZXBEdXJhdGlvbi50b3RhbCEidXNlY3MiKTsKIAogICAgICAgICAgICAgLy8gU2xlZXAgZm9yIGlvRXJyb3JTbGVlcER1cmF0aW9uLCBiZWluZyByZWFkeSB0byBiZSBpbnRlcnJ1cHRlZAogICAgICAgICAgICAgLy8gYnkgc2h1dGRvd24gcmVxdWVzdHMuCkBAIC0xMDc2LDE1ICsxMDc3LDE1IEBACiAKICAgICAgIC8vIElmIGFueSBhdHRlbXB0IHRha2VzIG1vcmUgdGhhbiA1MDBtcywgdHJlYXQgdGhhdCBhcyBhIGZhdGFsIGZhaWx1cmUgdG8KICAgICAgIC8vIGF2b2lkIGxvb3Bpbmcgb3ZlciBhIHBvdGVudGlhbGx5IHZlcnkgc2xvdyBvcGVyYXRpb24uCi0gICAgICBlbmZvcmNlKHN3LnBlZWsoKS5tc2VjcyA8IDE1MDAsCi0gICAgICAgIHRleHQoImNsb3NlKCkgdG9vayAiLCBzdy5wZWVrKCkubXNlY3MsICJtcy4iKSk7CisgICAgICBlbmZvcmNlKHN3LnBlZWsoKS50b3RhbCEibXNlY3MiIDwgMTUwMCwKKyAgICAgICAgdGV4dCgiY2xvc2UoKSB0b29rICIsIHN3LnBlZWsoKS50b3RhbCEibXNlY3MiLCAibXMuIikpOwogCiAgICAgICAvLyBOb3JtYWxseSwgaXQgdGFrZXMgbGVzcyB0aGFuIDVtcyBvbiBteSBkZXYgYm94LgogICAgICAgLy8gSG93ZXZlciwgaWYgdGhlIGJveCBpcyBoZWF2aWx5IGxvYWRlZCwgc29tZSBvZiB0aGUgdGVzdCBydW5zIGNhbiB0YWtlCiAgICAgICAvLyBsb25nZXIuIEFkZGl0aW9uYWxseSwgb24gYSBXaW5kb3dzIFNlcnZlciAyMDA4IGluc3RhbmNlIHJ1bm5pbmcgaW4KICAgICAgIC8vIGEgVmlydHVhbEJveCBWTSwgaXQgaGFzIGJlZW4gb2JzZXJ2ZWQgdGhhdCBhYm91dCBhIHF1YXJ0ZXIgb2YgdGhlIHJ1bnMKICAgICAgIC8vIHRha2VzICgyMTcgwrEgMSkgbXMsIGZvciByZWFzb25zIG5vdCB5ZXQga25vd24uCi0gICAgICBpZiAoc3cucGVlaygpLm1zZWNzID4gNTApIHsKKyAgICAgIGlmIChzdy5wZWVrKCkudG90YWwhIm1zZWNzIiA+IDUwKSB7CiAgICAgICAgICsrbnVtT3ZlcjsKICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvaHR0cC5kIGIvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvaHR0cC5kCmluZGV4IDUxODZmM2QuLjBlNThkZWUgMTAwNjQ0Ci0tLSBhL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L2h0dHAuZAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9odHRwLmQKQEAgLTEzNCw3ICsxMzQsNyBAQAogICAgIH0KIAogICAgIHN0YXRpYyBib29sIGNvbXBUb0xvd2VyKHVieXRlIGEsIHVieXRlIGIpIHsKLSAgICAgIHJldHVybiBhID09IHRvTG93ZXIoY2FzdChjaGFyKWIpOworICAgICAgcmV0dXJuIHRvTG93ZXIoY2FzdChjaGFyKWEpID09IHRvTG93ZXIoY2FzdChjaGFyKWIpOwogICAgIH0KIAogICAgIGlmIChzdGFydHNXaXRoIWNvbXBUb0xvd2VyKHNwbGl0WzBdLCBjYXN0KHVieXRlW10pInRyYW5zZmVyLWVuY29kaW5nIikpIHsKQEAgLTMzMCw3ICszMzAsNyBAQAogICAgICAgIkhvc3Q6ICIgfiBob3N0XyB+ICJcclxuIiB+CiAgICAgICAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXRocmlmdFxyXG4iIH4KICAgICAgICJDb250ZW50LUxlbmd0aDogIiB+IHRvIXN0cmluZyhkYXRhTGVuZ3RoKSB+ICJcclxuIiB+Ci0gICAgICAiQWNjZXB0OiBhcHBsaWNhdGlvbi94LXRocmlmdFxyXG4iCisgICAgICAiQWNjZXB0OiBhcHBsaWNhdGlvbi94LXRocmlmdFxyXG4iIH4KICAgICAgICJVc2VyLUFnZW50OiBUaHJpZnQvIiB+IFZFUlNJT04gfiAiIChEL1RDbGllbnRIdHRwVHJhbnNwb3J0KVxyXG4iIH4KICAgICAgICJcclxuIjsKICAgfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvc29ja2V0LmQgYi9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9zb2NrZXQuZAppbmRleCAzOGI1NjdhLi5mY2IzOGRhIDEwMDY0NAotLS0gYS9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9zb2NrZXQuZAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9zb2NrZXQuZApAQCAtMTgsNiArMTgsNyBAQAogICovCiBtb2R1bGUgdGhyaWZ0LnRyYW5zcG9ydC5zb2NrZXQ7CiAKK2ltcG9ydCBjb3JlLnN0ZGMuZXJybm86IEVDT05OUkVTRVQ7CiBpbXBvcnQgY29yZS50aHJlYWQgOiBUaHJlYWQ7CiBpbXBvcnQgY29yZS50aW1lIDogZHVyLCBEdXJhdGlvbjsKIGltcG9ydCBzdGQuYXJyYXkgOiBlbXB0eTsKQEAgLTc5LDggKzgwLDggQEAKICAgICB2ZXJzaW9uIChub25lKSBhc3NlcnQod3JpdHRlbiA8PSBidWYubGVuZ3RoLCB0ZXh0KCJJbXBsZW1lbnRhdGlvbiB3cm90ZSAiIH4KICAgICAgICJtb3JlIGRhdGEgdGhhbiByZXF1ZXN0ZWQgdG8/ISAoIiwgd3JpdHRlbiwgIiB2cy4gIiwgYnVmLmxlbmd0aCwgIikiKSk7CiAgIH0gYm9keSB7Ci0gICAgYXNzZXJ0KDAsICJETUQgYnVnPyDigJMgV2h5IHdvdWxkIGNvbnRyYWN0cyB3b3JrIGZvciBpbnRlcmZhY2VzLCBidXQgbm90ICIKLSAgICAgICJmb3IgYWJzdHJhY3QgbWV0aG9kcz8gIgorICAgIGFzc2VydCgwLCAiRE1EIGJ1Zz8g4oCTIFdoeSB3b3VsZCBjb250cmFjdHMgd29yayBmb3IgaW50ZXJmYWNlcywgYnV0IG5vdCAiIH4KKyAgICAgICJmb3IgYWJzdHJhY3QgbWV0aG9kcz8gIiB+CiAgICAgICAiKEVycm9yOiBmdW5jdGlvbiBb4oCmXSBpbiBhbmQgb3V0IGNvbnRyYWN0cyByZXF1aXJlIGZ1bmN0aW9uIGJvZHkiKTsKICAgfQogCkBAIC0yNTYsNyArMjU3LDcgQEAKICAgICAgICAgbmV3IFRDb21wb3VuZE9wZXJhdGlvbkV4Y2VwdGlvbigKICAgICAgICAgICB0ZXh0KAogICAgICAgICAgICAgIkFsbCBhZGRyZXNzZXMgdHJpZWQgZmFpbGVkICgiLAotICAgICAgICAgICAgam9pbmVyKG1hcCFxe3RleHQoYS5fMCwgYDogImAsIGEuXzEubXNnLCBgImApfSh6aXAoYWRkcnMsIGVycm9ycykpLCAiLCAiKSwKKyAgICAgICAgICAgIGpvaW5lcihtYXAhcXt0ZXh0KGFbMF0sIGA6ICJgLCBhWzFdLm1zZywgYCJgKX0oemlwKGFkZHJzLCBlcnJvcnMpKSwgIiwgIiksCiAgICAgICAgICAgICAiKS4iCiAgICAgICAgICAgKSwKICAgICAgICAgICBlcnJvcnMKZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L3NzbC5kIGIvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvc3NsLmQKaW5kZXggYzFlYWIyNS4uZjhjZTQwZSAxMDA2NDQKLS0tIGEvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvc3NsLmQKKysrIGIvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvc3NsLmQKQEAgLTI0OSw3ICsyNDksMTMgQEAKICAgICB9CiAgICAgY291bnRfKys7CiAKLSAgICBjdHhfID0gU1NMX0NUWF9uZXcoVExTdjFfbWV0aG9kKCkpOworICAgIHN0YXRpYyBpZiAoT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA+PSAweDEwMTAwMDBmKSB7IC8vIE9QRU5TU0xfVkVSU0lPTl9BVF9MRUFTVCgxLCAxKSkgeworICAgICAgICBjdHhfID0gU1NMX0NUWF9uZXcoVExTX21ldGhvZCgpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjdHhfID0gU1NMX0NUWF9uZXcoU1NMdjIzX21ldGhvZCgpKTsKKyAgICAgICAgU1NMX0NUWF9zZXRfb3B0aW9ucyhjdHhfLCBTU0xfT1BfTk9fU1NMdjIpOworICAgIH0KKyAgICBTU0xfQ1RYX3NldF9vcHRpb25zKGN0eF8sIFNTTF9PUF9OT19TU0x2Myk7ICAgLy8gVEhSSUZULTMxNjQKICAgICBlbmZvcmNlKGN0eF8sIGdldFNTTEV4Y2VwdGlvbigiU1NMX0NUWF9uZXciKSk7CiAgICAgU1NMX0NUWF9zZXRfbW9kZShjdHhfLCBTU0xfTU9ERV9BVVRPX1JFVFJZKTsKICAgfQpAQCAtNDQ2LDYgKzQ1Miw3IEBACiAgICAgfQogICAgIGluaXRpYWxpemVkXyA9IHRydWU7CiAKKyAgIHN0YXRpYyBpZiAoT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA8IDB4MTAxMDAwMGYpIHsgLy8gT1BFTlNTTF9WRVJTSU9OX0JFRk9SRSgxLCAxKSkgewogICAgIFNTTF9saWJyYXJ5X2luaXQoKTsKICAgICBTU0xfbG9hZF9lcnJvcl9zdHJpbmdzKCk7CiAKQEAgLTQ2MywxMiArNDcwLDE0IEBACiAgICAgQ1JZUFRPX3NldF9keW5sb2NrX2NyZWF0ZV9jYWxsYmFjayhhc3N1bWVOb3Rocm93KCZkeW5sb2NrQ3JlYXRlQ2FsbGJhY2spKTsKICAgICBDUllQVE9fc2V0X2R5bmxvY2tfbG9ja19jYWxsYmFjayhhc3N1bWVOb3Rocm93KCZkeW5sb2NrTG9ja0NhbGxiYWNrKSk7CiAgICAgQ1JZUFRPX3NldF9keW5sb2NrX2Rlc3Ryb3lfY2FsbGJhY2soYXNzdW1lTm90aHJvdygmZHlubG9ja0Rlc3Ryb3lDYWxsYmFjaykpOworICAgfQogICB9CiAKICAgc3RhdGljIHZvaWQgY2xlYW51cE9wZW5TU0woKSB7CiAgICAgaWYgKCFpbml0aWFsaXplZF8pIHJldHVybjsKIAogICAgIGluaXRpYWxpemVkXyA9IGZhbHNlOworICAgc3RhdGljIGlmIChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSIDwgMHgxMDEwMDAwZikgeyAvLyBPUEVOU1NMX1ZFUlNJT05fQkVGT1JFKDEsIDEpKSB7CiAgICAgQ1JZUFRPX3NldF9sb2NraW5nX2NhbGxiYWNrKG51bGwpOwogICAgIENSWVBUT19zZXRfZHlubG9ja19jcmVhdGVfY2FsbGJhY2sobnVsbCk7CiAgICAgQ1JZUFRPX3NldF9keW5sb2NrX2xvY2tfY2FsbGJhY2sobnVsbCk7CkBAIC00NzYsNiArNDg1LDcgQEAKICAgICBDUllQVE9fY2xlYW51cF9hbGxfZXhfZGF0YSgpOwogICAgIEVSUl9mcmVlX3N0cmluZ3MoKTsKICAgICBFUlJfcmVtb3ZlX3N0YXRlKDApOworICAgfQogICB9CiAKICAgc3RhdGljIGV4dGVybihDKSB7CkBAIC01MTgsNyArNTI4LDcgQEAKICAgICAgIGNvbnN0KGNoYXIpKiBmaWxlLCBpbnQgbGluZSkKICAgICB7CiAgICAgICBHQy5yZW1vdmVSYW5nZShsKTsKLSAgICAgIGNsZWFyKGNhc3QoTXV0ZXgpbCk7CisgICAgICBkZXN0cm95KGNhc3QoTXV0ZXgpbCk7CiAgICAgICBmcmVlKGwpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbGliL2QvdGVzdC9NYWtlZmlsZS5hbSBiL2xpYi9kL3Rlc3QvTWFrZWZpbGUuYW0KaW5kZXggMDQ4MjU4My4uM2I2YTZmMSAxMDA3NTUKLS0tIGEvbGliL2QvdGVzdC9NYWtlZmlsZS5hbQorKysgYi9saWIvZC90ZXN0L01ha2VmaWxlLmFtCkBAIC0xOSw5ICsxOSwxMCBAQAogCiBBVVRPTUFLRV9PUFRJT05TID0gc2VyaWFsLXRlc3RzCiAKLSMgVGhyaWZ0IGNvbXBpbGVyIHJ1bGVzCitCVUlMVF9TT1VSQ0VTID0gdHJ1c3RlZC1jYS1jZXJ0aWZpY2F0ZS5wZW0gc2VydmVyLWNlcnRpZmljYXRlLnBlbQogCi1USFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAorCisjIFRocmlmdCBjb21waWxlciBydWxlcwogCiBkZWJ1Z19wcm90b19nZW4gPSAkKGFkZHByZWZpeCBnZW4tZC8sIERlYnVnUHJvdG9UZXN0X3R5cGVzLmQpCiAKQEAgLTcxLDcgKzcyLDcgQEAKIAogaWYgV0lUSF9EX1NTTF9URVNUUwogZF90ZXN0X2ZsYWdzICs9ICQoRE1EX09QRU5TU0xfRkxBR1MpIC4uLyQoRF9TU0xfTElCX05BTUUpCi10YXJnZXRzID0gdHJ1c3RlZC1jYS1jZXJ0aWZpY2F0ZS5wZW0gc2VydmVyLWNlcnRpZmljYXRlLnBlbSAkKHRhcmdldHNfKQordGFyZ2V0cyA9ICQodGFyZ2V0c18pCiByYW5fdGVzdHMgPSAkKHJhbl90ZXN0c18pCiBlbHNlCiB0YXJnZXRzID0gJChmaWx0ZXItb3V0ICQob3BlbnNzbF9kZXBlbmRlbnRfdGFyZ2V0cyksICQodGFyZ2V0c18pKQpAQCAtMTIyLDMgKzEyMyw1IEBACiAJdHJ1c3RlZC1jYS1jZXJ0aWZpY2F0ZS5wZW0gc2VydmVyLWNlcnRpZmljYXRlLnBlbQogCiBURVNUUyA9ICQocmFuX3Rlc3RzKQorCitwcmVjcm9zczogJCh0YXJnZXRzKQpkaWZmIC0tZ2l0IGEvbGliL2QvdGVzdC9hc3luY190ZXN0LmQgYi9saWIvZC90ZXN0L2FzeW5jX3Rlc3QuZAppbmRleCBmMWEwY2YzLi5mYjc2NWFkIDEwMDY0NAotLS0gYS9saWIvZC90ZXN0L2FzeW5jX3Rlc3QuZAorKysgYi9saWIvZC90ZXN0L2FzeW5jX3Rlc3QuZApAQCAtMTMwLDcgKzEzMCw3IEBACiAgIH0KIAogICBhdXRvIG1hbmFnZXJzID0gbmV3IFRMaWJldmVudEFzeW5jTWFuYWdlclttYW5hZ2VyQ291bnRdOwotICBzY29wZSAoZXhpdCkgZm9yZWFjaCAocmVmIG07IG1hbmFnZXJzKSBjbGVhcihtKTsKKyAgc2NvcGUgKGV4aXQpIGZvcmVhY2ggKHJlZiBtOyBtYW5hZ2VycykgZGVzdHJveShtKTsKIAogICBhdXRvIGNsaWVudHNUaHJlYWRzID0gbmV3IFRocmVhZEdyb3VwOwogICBmb3JlYWNoIChtYW5hZ2VySW5kZXgsIHJlZiBtYW5hZ2VyOyBtYW5hZ2VycykgewpkaWZmIC0tZ2l0IGEvbGliL2QvdGVzdC9hc3luY190ZXN0X3J1bm5lci5zaCBiL2xpYi9kL3Rlc3QvYXN5bmNfdGVzdF9ydW5uZXIuc2gKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCA0YjliN2MwLi43ZDUwN2VlCi0tLSBhL2xpYi9kL3Rlc3QvYXN5bmNfdGVzdF9ydW5uZXIuc2gKKysrIGIvbGliL2QvdGVzdC9hc3luY190ZXN0X3J1bm5lci5zaApAQCAtMSw2ICsxLDI4IEBACiAjIS9iaW4vYmFzaAorCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworQ1VSPSIkKGNkICIkKGRpcm5hbWUgIiR7QkFTSF9TT1VSQ0VbMF19IikiICYmIHB3ZCkiCisKICMgUnVucyB0aGUgYXN5bmMgdGVzdCBpbiBib3RoIFNTTCBhbmQgbm9uLVNTTCBtb2RlLgotLi9hc3luY190ZXN0ID4gL2Rldi9udWxsIHx8IGV4aXQgMQorJHtDVVJ9L2FzeW5jX3Rlc3QgPiAvZGV2L251bGwgfHwgZXhpdCAxCiBlY2hvICJOb24tU1NMIHRlc3RzIGRvbmUuIgotLi9hc3luY190ZXN0IC0tc3NsID4gL2Rldi9udWxsIHx8IGV4aXQgMQorJHtDVVJ9L2FzeW5jX3Rlc3QgLS1zc2wgPiAvZGV2L251bGwgfHwgZXhpdCAxCiBlY2hvICJTU0wgdGVzdHMgZG9uZS4iCmRpZmYgLS1naXQgYS9saWIvZC90ZXN0L2NsaWVudF9wb29sX3Rlc3QuZCBiL2xpYi9kL3Rlc3QvY2xpZW50X3Bvb2xfdGVzdC5kCmluZGV4IDg1YmNiMjkuLmIyNGM5N2EgMTAwNjQ0Ci0tLSBhL2xpYi9kL3Rlc3QvY2xpZW50X3Bvb2xfdGVzdC5kCisrKyBiL2xpYi9kL3Rlc3QvY2xpZW50X3Bvb2xfdGVzdC5kCkBAIC0xOCw2ICsxOCw3IEBACiAgKi8KIG1vZHVsZSBjbGllbnRfcG9vbF90ZXN0OwogCitpbXBvcnQgY29yZS5zeW5jLnNlbWFwaG9yZSA6IFNlbWFwaG9yZTsKIGltcG9ydCBjb3JlLnRpbWUgOiBEdXJhdGlvbiwgZHVyOwogaW1wb3J0IGNvcmUudGhyZWFkIDogVGhyZWFkOwogaW1wb3J0IHN0ZC5hbGdvcml0aG07CkBAIC0yOCw2ICsyOSw3IEBACiBpbXBvcnQgc3RkLnJhbmdlOwogaW1wb3J0IHN0ZC5zdGRpbzsKIGltcG9ydCBzdGQudHlwZWNvbnM7CitpbXBvcnQgc3RkLnZhcmlhbnQgOiBWYXJpYW50OwogaW1wb3J0IHRocmlmdC5iYXNlOwogaW1wb3J0IHRocmlmdC5hc3luYy5saWJldmVudDsKIGltcG9ydCB0aHJpZnQuYXN5bmMuc29ja2V0OwpAQCAtMzcsOSArMzksMTIgQEAKIGltcG9ydCB0aHJpZnQuY29kZWdlbi5jbGllbnQ7CiBpbXBvcnQgdGhyaWZ0LmNvZGVnZW4uY2xpZW50X3Bvb2w7CiBpbXBvcnQgdGhyaWZ0LmNvZGVnZW4ucHJvY2Vzc29yOworaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iYXNlOwogaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iaW5hcnk7CitpbXBvcnQgdGhyaWZ0LnNlcnZlci5iYXNlOwogaW1wb3J0IHRocmlmdC5zZXJ2ZXIuc2ltcGxlOwogaW1wb3J0IHRocmlmdC5zZXJ2ZXIudHJhbnNwb3J0LnNvY2tldDsKK2ltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJhc2U7CiBpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5idWZmZXJlZDsKIGltcG9ydCB0aHJpZnQudHJhbnNwb3J0LnNvY2tldDsKIGltcG9ydCB0aHJpZnQudXRpbC5jYW5jZWxsYXRpb247CkBAIC0xMDgsMTEgKzExMywyOSBAQAogICB9CiB9CiAKK2NsYXNzIFNlcnZlclByZVNlcnZlSGFuZGxlciA6IFRTZXJ2ZXJFdmVudEhhbmRsZXIgeworICB0aGlzKFNlbWFwaG9yZSBzZW0pIHsKKyAgICBzZW1fID0gc2VtOworICB9CisKKyAgb3ZlcnJpZGUgdm9pZCBwcmVTZXJ2ZSgpIHsKKyAgICBzZW1fLm5vdGlmeSgpOworICB9CisKKyAgVmFyaWFudCBjcmVhdGVDb250ZXh0KFRQcm90b2NvbCBpbnB1dCwgVFByb3RvY29sIG91dHB1dCkgeyByZXR1cm4gVmFyaWFudC5pbml0OyB9CisgIHZvaWQgZGVsZXRlQ29udGV4dChWYXJpYW50IHNlcnZlckNvbnRleHQsIFRQcm90b2NvbCBpbnB1dCwgVFByb3RvY29sIG91dHB1dCkge30KKyAgdm9pZCBwcmVQcm9jZXNzKFZhcmlhbnQgc2VydmVyQ29udGV4dCwgVFRyYW5zcG9ydCB0cmFuc3BvcnQpIHt9CisKK3ByaXZhdGU6CisgIFNlbWFwaG9yZSBzZW1fOworfQorCiBjbGFzcyBTZXJ2ZXJUaHJlYWQgOiBUaHJlYWQgewotICB0aGlzKEV4VGVzdEhhbmRsZXIgaGFuZGxlciwgVENhbmNlbGxhdGlvbiBjYW5jZWxsYXRpb24pIHsKKyAgdGhpcyhFeFRlc3RIYW5kbGVyIGhhbmRsZXIsIFNlcnZlclByZVNlcnZlSGFuZGxlciBzZXJ2ZXJIYW5kbGVyLCBUQ2FuY2VsbGF0aW9uIGNhbmNlbGxhdGlvbikgewogICAgIHN1cGVyKCZydW4pOwogICAgIGhhbmRsZXJfID0gaGFuZGxlcjsKICAgICBjYW5jZWxsYXRpb25fID0gY2FuY2VsbGF0aW9uOworICAgIHNlcnZlckhhbmRsZXJfID0gc2VydmVySGFuZGxlcjsKICAgfQogcHJpdmF0ZToKICAgdm9pZCBydW4oKSB7CkBAIC0xMjMsMTYgKzE0NiwxNyBAQAogICAgICAgc2VydmVyVHJhbnNwb3J0LnJlY3ZUaW1lb3V0ID0gZHVyISJzZWNvbmRzIigzKTsKICAgICAgIGF1dG8gdHJhbnNwb3J0RmFjdG9yeSA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5OwogCi0gICAgICBhdXRvIHNlcnZlciA9IG5ldyBUU2ltcGxlU2VydmVyKAotICAgICAgICBwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KTsKKyAgICAgIGF1dG8gc2VydmVyID0gbmV3IFRTaW1wbGVTZXJ2ZXIocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSk7CisgICAgICBzZXJ2ZXIuZXZlbnRIYW5kbGVyID0gc2VydmVySGFuZGxlcl87CiAgICAgICBzZXJ2ZXIuc2VydmUoY2FuY2VsbGF0aW9uXyk7CiAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgIHdyaXRlZmxuKCJTZXJ2ZXIgdGhyZWFkIG9uIHBvcnQgJXMgZmFpbGVkOiAlcyIsIGhhbmRsZXJfLnBvcnQsIGUpOwogICAgIH0KICAgfQogCi0gIFRDYW5jZWxsYXRpb24gY2FuY2VsbGF0aW9uXzsKICAgRXhUZXN0SGFuZGxlciBoYW5kbGVyXzsKKyAgU2VydmVyUHJlU2VydmVIYW5kbGVyIHNlcnZlckhhbmRsZXJfOworICBUQ2FuY2VsbGF0aW9uIGNhbmNlbGxhdGlvbl87CiB9CiAKIHZvaWQgbWFpbihzdHJpbmdbXSBhcmdzKSB7CkBAIC0xNDUsNiArMTY5LDkgQEAKIAogICBpbW11dGFibGUgcG9ydHMgPSBjYXN0KGltbXV0YWJsZSlhcnJheShtYXAhImNhc3QodXNob3J0KWEiKGlvdGEocG9ydCwgcG9ydCArIDYpKSk7CiAKKyAgLy8gc2VtYXBob3JlIHRoYXQgd2lsbCBiZSBpbmNyZW1lbnRlZCB3aGVuZXZlciBlYWNoIHNlcnZlciB0aHJlYWQgaGFzIGJvdW5kIGFuZCBzdGFydGVkIGxpc3RlbmluZworICBTZW1hcGhvcmUgc2VtID0gbmV3IFNlbWFwaG9yZSgwKTsKKwogdmVyc2lvbiAobm9uZSkgewogICAvLyBDYW5ub3QgdXNlIHRoaXMgZHVlIHRvIG11bHRpcGxlIERNRCBAQEJVR0BAczoKICAgLy8gMS4gwrtmdW5jdGlvbiBEIG1haW4gaXMgYSBuZXN0ZWQgZnVuY3Rpb24gYW5kIGNhbm5vdCBiZSBhY2Nlc3NlZCBmcm9tIGFycmF5wqsKQEAgLTE3NCwxMSArMjAxLDEwIEBACiB9CiAKICAgLy8gRmlyZSB1cCB0aGUgc2VydmVyIHRocmVhZHMuCi0gIGZvcmVhY2ggKGg7IGhhbmRsZXJzKSAobmV3IFNlcnZlclRocmVhZChoLCBzZXJ2ZXJDYW5jZWxsYXRpb24pKS5zdGFydCgpOworICBmb3JlYWNoIChoOyBoYW5kbGVycykgKG5ldyBTZXJ2ZXJUaHJlYWQoaCwgbmV3IFNlcnZlclByZVNlcnZlSGFuZGxlcihzZW0pLCBzZXJ2ZXJDYW5jZWxsYXRpb24pKS5zdGFydCgpOwogCi0gIC8vIEdpdmUgdGhlIHNlcnZlcnMgc29tZSB0aW1lIHRvIGdldCB1cC4gVGhpcyBzaG91bGQgcmVhbGx5IGJlIGFjY29tcGxpc2hlZAotICAvLyB2aWEgYSBiYXJyaWVyIGhlcmUgYW5kIGluIHRoZSBwcmVTZXJ2ZSgpIGhvb2suCi0gIFRocmVhZC5zbGVlcChkdXIhIm1zZWNzIigxMCkpOworICAvLyB3YWl0IHVudGlsIGFsbCB0aGUgaGFuZGxlcnMgc2lnbmFsIHRoYXQgdGhleSdyZSByZWFkeSB0byBzZXJ2ZQorICBmb3JlYWNoIChoOyBoYW5kbGVycykgKHNlbS53YWl0KGR1ciFgc2Vjb25kc2AoMSkpKTsKIAogICBzeW5jQ2xpZW50UG9vbFRlc3QocG9ydHMsIGhhbmRsZXJzKTsKICAgYXN5bmNDbGllbnRQb29sVGVzdChwb3J0cywgaGFuZGxlcnMpOwpAQCAtNDA5LDggKzQzNSw4IEBACiAgICAgKSgpOwogICAgIFRocmVhZC5zbGVlcChkdXIhIm1zZWNzIigyMCkpOwogICAgIGF1dG8gcmVzdWx0VHVwbGUgPSBwYXJ0aWFsUmVzdWx0LmZpbmlzaEdldCgpOwotICAgIGVuZm9yY2UocmVzdWx0VHVwbGUuXzAgPT0gcG9ydHNbMCAuLiAyXSk7Ci0gICAgZW5mb3JjZShlcXVhbChtYXAhImEucG9ydCIoY2FzdChUZXN0U2VydmljZUV4Y2VwdGlvbltdKXJlc3VsdFR1cGxlLl8xKSwKKyAgICBlbmZvcmNlKHJlc3VsdFR1cGxlWzBdID09IHBvcnRzWzAgLi4gMl0pOworICAgIGVuZm9yY2UoZXF1YWwobWFwISJhLnBvcnQiKGNhc3QoVGVzdFNlcnZpY2VFeGNlcHRpb25bXSlyZXN1bHRUdXBsZVsxXSksCiAgICAgICBwb3J0c1szIC4uICQgLSAxXSkpOwogICB9CiB9CmRpZmYgLS1naXQgYS9saWIvZC90ZXN0L3NlcmlhbGl6YXRpb25fYmVuY2htYXJrLmQgYi9saWIvZC90ZXN0L3NlcmlhbGl6YXRpb25fYmVuY2htYXJrLmQKaW5kZXggMzU1MTVjOC4uNDBkMDQ4MCAxMDA2NDQKLS0tIGEvbGliL2QvdGVzdC9zZXJpYWxpemF0aW9uX2JlbmNobWFyay5kCisrKyBiL2xpYi9kL3Rlc3Qvc2VyaWFsaXphdGlvbl9iZW5jaG1hcmsuZApAQCAtMTMsNyArMTMsNyBAQAogICovCiBtb2R1bGUgc2VyaWFsaXphdGlvbl9iZW5jaG1hcms7CiAKLWltcG9ydCBzdGQuZGF0ZXRpbWUgOiBBdXRvU3RhcnQsIFN0b3BXYXRjaDsKK2ltcG9ydCBzdGQuZGF0ZXRpbWUuc3RvcHdhdGNoIDogQXV0b1N0YXJ0LCBTdG9wV2F0Y2g7CiBpbXBvcnQgc3RkLm1hdGggOiBQSTsKIGltcG9ydCBzdGQuc3RkaW87CiBpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmJpbmFyeTsKQEAgLTQ2LDcgKzQ2LDcgQEAKICAgICB9CiAgICAgc3cuc3RvcCgpOwogCi0gICAgYXV0byBtc2VjcyA9IHN3LnBlZWsoKS5tc2VjczsKKyAgICBhdXRvIG1zZWNzID0gc3cucGVlaygpLnRvdGFsISJtc2VjcyI7CiAgICAgd3JpdGVmbG4oIldyaXRlOiAlcyBtcyAoJXMga0h6KSIsIG1zZWNzLCBJVEVSQVRJT05TIC8gbXNlY3MpOwogICB9CiAKQEAgLTY0LDcgKzY0LDcgQEAKICAgICB9CiAgICAgc3cuc3RvcCgpOwogCi0gICAgYXV0byBtc2VjcyA9IHN3LnBlZWsoKS5tc2VjczsKKyAgICBhdXRvIG1zZWNzID0gc3cucGVlaygpLnRvdGFsISJtc2VjcyI7CiAgICAgd3JpdGVmbG4oIiBSZWFkOiAlcyBtcyAoJXMga0h6KSIsIG1zZWNzLCBJVEVSQVRJT05TIC8gbXNlY3MpOwogICB9CiB9CmRpZmYgLS1naXQgYS9saWIvZC90ZXN0L3RocmlmdF90ZXN0X2NsaWVudC5kIGIvbGliL2QvdGVzdC90aHJpZnRfdGVzdF9jbGllbnQuZAppbmRleCBmZDUzMzI4Li40OTQxOWY3IDEwMDY0NAotLS0gYS9saWIvZC90ZXN0L3RocmlmdF90ZXN0X2NsaWVudC5kCisrKyBiL2xpYi9kL3Rlc3QvdGhyaWZ0X3Rlc3RfY2xpZW50LmQKQEAgLTI1LDYgKzI1LDcgQEAKIGltcG9ydCBzdGQuc3RkaW87CiBpbXBvcnQgc3RkLnN0cmluZzsKIGltcG9ydCBzdGQudHJhaXRzOworaW1wb3J0IHRocmlmdC5iYXNlOwogaW1wb3J0IHRocmlmdC5jb2RlZ2VuLmNsaWVudDsKIGltcG9ydCB0aHJpZnQucHJvdG9jb2wuYmFzZTsKIGltcG9ydCB0aHJpZnQucHJvdG9jb2wuYmluYXJ5OwpAQCAtNzUsNiArNzYsNyBAQAogICAgICJzc2wiLCAmc3NsLAogICAgICJ0cmFuc3BvcnQiLCAmdHJhbnNwb3J0VHlwZSwKICAgICAidHJhY2UiLCAmdHJhY2UsCisgICAgInBvcnQiLCAmcG9ydCwKICAgICAiaG9zdCIsIChzdHJpbmcgXywgc3RyaW5nIHZhbHVlKSB7CiAgICAgICBhdXRvIHBhcnRzID0gc3BsaXQodmFsdWUsICI6Iik7CiAgICAgICBpZiAocGFydHMubGVuZ3RoID4gMSkgewpAQCAtODcsMTMgKzg5LDE0IEBACiAgICAgICB9CiAgICAgfQogICApOworICBwb3J0ID0gdG8hdXNob3J0KHBvcnQpOwogCiAgIFRTb2NrZXQgc29ja2V0OwogICBpZiAoc3NsKSB7CiAgICAgYXV0byBzc2xDb250ZXh0ID0gbmV3IFRTU0xDb250ZXh0KCk7CiAgICAgc3NsQ29udGV4dC5jaXBoZXJzID0gIkFMTDohQURIOiFMT1c6IUVYUDohTUQ1OkBTVFJFTkdUSCI7CiAgICAgc3NsQ29udGV4dC5hdXRoZW50aWNhdGUgPSB0cnVlOwotICAgIHNzbENvbnRleHQubG9hZFRydXN0ZWRDZXJ0aWZpY2F0ZXMoIi4vdHJ1c3RlZC1jYS1jZXJ0aWZpY2F0ZS5wZW0iKTsKKyAgICBzc2xDb250ZXh0LmxvYWRUcnVzdGVkQ2VydGlmaWNhdGVzKCIuLi8uLi8uLi90ZXN0L2tleXMvQ0EucGVtIik7CiAgICAgc29ja2V0ID0gbmV3IFRTU0xTb2NrZXQoc3NsQ29udGV4dCwgaG9zdCwgcG9ydCk7CiAgIH0gZWxzZSB7CiAgICAgc29ja2V0ID0gbmV3IFRTb2NrZXQoaG9zdCwgcG9ydCk7CkBAIC0yODAsNiArMjgzLDE1IEBACiAgICAgICB9CiAKICAgICAgIHRyeSB7CisgICAgICAgIGlmICh0cmFjZSkgd3JpdGUoImNsaWVudC50ZXN0RXhjZXB0aW9uKFwiVEV4Y2VwdGlvblwiKSA9PiIpOworICAgICAgICBjbGllbnQudGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iKTsKKyAgICAgICAgaWYgKHRyYWNlKSB3cml0ZWxuKCIgIHZvaWRcbkZBSUxVUkUiKTsKKyAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigidGVzdEV4Y2VwdGlvbiBmYWlsZWQuIik7CisgICAgICB9IGNhdGNoIChURXhjZXB0aW9uIGUpIHsKKyAgICAgICAgaWYgKHRyYWNlKSB3cml0ZWZsbigiICB7JXN9IiwgZS5tc2cpOworICAgICAgfQorCisgICAgICB0cnkgewogICAgICAgICBpZiAodHJhY2UpIHdyaXRlKCJjbGllbnQudGVzdEV4Y2VwdGlvbihcInN1Y2Nlc3NcIikgPT4iKTsKICAgICAgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oInN1Y2Nlc3MiKTsKICAgICAgICAgaWYgKHRyYWNlKSB3cml0ZWxuKCIgIHZvaWQiKTsKZGlmZiAtLWdpdCBhL2xpYi9kL3Rlc3QvdGhyaWZ0X3Rlc3RfcnVubmVyLnNoIGIvbGliL2QvdGVzdC90aHJpZnRfdGVzdF9ydW5uZXIuc2gKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCBmYmU3NWYwLi41MWJmZTk5Ci0tLSBhL2xpYi9kL3Rlc3QvdGhyaWZ0X3Rlc3RfcnVubmVyLnNoCisrKyBiL2xpYi9kL3Rlc3QvdGhyaWZ0X3Rlc3RfcnVubmVyLnNoCkBAIC0xLDEwICsxLDM0IEBACiAjIS9iaW4vYmFzaAorCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKwogIyBSdW5zIHRoZSBEIFRocmlmdFRlc3QgY2xpZW50IGFuZCBzZXJ2ZXJzIGZvciBhbGwgY29tYmluYXRpb25zIG9mIHRyYW5zcG9ydCwKICMgcHJvdG9jb2wsIFNTTC1tb2RlIGFuZCBzZXJ2ZXIgdHlwZS4KICMgUGFzcyAtayB0byBrZWVwIGdvaW5nIGFmdGVyIGZhaWxlZCB0ZXN0cy4KIAorQ1VSPSIkKGNkICIkKGRpcm5hbWUgIiR7QkFTSF9TT1VSQ0VbMF19IikiICYmIHB3ZCkiCisKIHByb3RvY29scz0iYmluYXJ5IGNvbXBhY3QganNvbiIKLXRyYW5zcG9ydHM9ImJ1ZmZlcmVkIGZyYW1lZCBodHRwIHJhdyIKKyMgVE9ETzogZml4IGFuZCBlbmFibGUgaHR0cAorIyB0cmFuc3BvcnRzPSJidWZmZXJlZCBmcmFtZWQgcmF3IGh0dHAiCit0cmFuc3BvcnRzPSJidWZmZXJlZCBmcmFtZWQgcmF3Igogc2VydmVycz0ic2ltcGxlIHRhc2twb29sIHRocmVhZGVkIgogZnJhbWVkX29ubHlfc2VydmVycz0ibm9uYmxvY2tpbmcgcG9vbGVkTm9uYmxvY2tpbmciCiAKQEAgLTIxLDE2ICs0NSwyMCBAQAogICAgICAgICBlc2FjCiAKICAgICAgICAgYXJncz0iLS10cmFuc3BvcnQ9JHRyYW5zcG9ydCAtLXByb3RvY29sPSRwcm90b2NvbCRzc2wiCi0gICAgICAgIC4vdGhyaWZ0X3Rlc3Rfc2VydmVyICRhcmdzIC0tc2VydmVyLXR5cGU9JHNlcnZlciA+IC9kZXYvbnVsbCAmCisgICAgICAgICR7Q1VSfS90aHJpZnRfdGVzdF9zZXJ2ZXIgJGFyZ3MgLS1zZXJ2ZXItdHlwZT0kc2VydmVyID4gL2Rldi9udWxsICYKICAgICAgICAgc2VydmVyX3BpZD0kIQogCiAgICAgICAgICMgR2l2ZSB0aGUgc2VydmVyIHNvbWUgdGltZSB0byBnZXQgdXAgYW5kIGNoZWNrIGlmIGl0IHJ1bnMgKHllcywgdGhpcwogICAgICAgICAjIGlzIGEgaHVnZSBrbHVkZ2UsIHNob3VsZCBhZGQgYSBjb25uZWN0IHRpbWVvdXQgdG8gdGVzdCBjbGllbnQpLgogICAgICAgICBjbGllbnRfcmM9LTEKLSAgICAgICAgc2xlZXAgMC4wMQorICAgICAgICBpZiBbICIkc2VydmVyIiA9ICJ0YXNrcG9vbCIgXTsgdGhlbgorICAgICAgICAgIHNsZWVwIDAuNQorICAgICAgICBlbHNlCisgICAgICAgICAgc2xlZXAgMC4wMgorICAgICAgICBmaQogICAgICAgICBraWxsIC0wICRzZXJ2ZXJfcGlkIDI+L2Rldi9udWxsCiAgICAgICAgIGlmIFsgJD8gLWVxIDAgXTsgdGhlbgotICAgICAgICAgIC4vdGhyaWZ0X3Rlc3RfY2xpZW50ICRhcmdzIC0tbnVtVGVzdHM9MTAgPiAvZGV2L251bGwKKyAgICAgICAgICAke0NVUn0vdGhyaWZ0X3Rlc3RfY2xpZW50ICRhcmdzIC0tbnVtVGVzdHM9MTAgPiAvZGV2L251bGwKICAgICAgICAgICBjbGllbnRfcmM9JD8KIAogICAgICAgICAgICMgVGVtcG9yYXJpbHkgcmVkaXJlY3Qgc3RkZXJyIHRvIG51bGwgdG8gYXZvaWQgam9iIGNvbnRyb2wgbWVzc2FnZXMsCmRpZmYgLS1naXQgYS9saWIvZC90ZXN0L3RocmlmdF90ZXN0X3NlcnZlci5kIGIvbGliL2QvdGVzdC90aHJpZnRfdGVzdF9zZXJ2ZXIuZAppbmRleCAxNjA4YTU3Li5iNTgyMjUzIDEwMDY0NAotLS0gYS9saWIvZC90ZXN0L3RocmlmdF90ZXN0X3NlcnZlci5kCisrKyBiL2xpYi9kL3Rlc3QvdGhyaWZ0X3Rlc3Rfc2VydmVyLmQKQEAgLTE2LDggKzE2LDExIEBACiAgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLworCiBtb2R1bGUgdGhyaWZ0X3Rlc3Rfc2VydmVyOwogCitpbXBvcnQgY29yZS5zdGRjLmVycm5vIDogZXJybm87CitpbXBvcnQgY29yZS5zdGRjLnNpZ25hbCA6IHNpZ25hbCwgc2lnZm5fdCwgU0lHSU5ULCBTSUdfREZMLCBTSUdfRVJSOwogaW1wb3J0IGNvcmUudGhyZWFkIDogZHVyLCBUaHJlYWQ7CiBpbXBvcnQgc3RkLmFsZ29yaXRobTsKIGltcG9ydCBzdGQuZXhjZXB0aW9uIDogZW5mb3JjZTsKQEAgLTQwLDYgKzQzLDcgQEAKIGltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmZyYW1lZDsKIGltcG9ydCB0aHJpZnQudHJhbnNwb3J0Lmh0dHA7CiBpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5zc2w7CitpbXBvcnQgdGhyaWZ0LnV0aWwuY2FuY2VsbGF0aW9uOwogaW1wb3J0IHRocmlmdC51dGlsLmhhc2hzZXQ7CiBpbXBvcnQgdGVzdF91dGlsczsKIApAQCAtODYsNiArOTAsMTEgQEAKICAgICByZXR1cm4gdGhpbmc7CiAgIH0KIAorICBvdmVycmlkZSBib29sIHRlc3RCb29sKGJvb2wgdGhpbmcpIHsKKyAgICBpZiAodHJhY2VfKSB3cml0ZWZsbigidGVzdEJvb2woXCIlc1wiKSIsIHRoaW5nKTsKKyAgICByZXR1cm4gdGhpbmc7CisgIH0KKwogICBvdmVycmlkZSBYdHJ1Y3QgdGVzdFN0cnVjdChyZWYgY29uc3QoWHRydWN0KSB0aGluZykgewogICAgIGlmICh0cmFjZV8pIHdyaXRlZmxuKCJ0ZXN0U3RydWN0KHtcIiVzXCIsICVzLCAlcywgJXN9KSIsCiAgICAgICB0aGluZy5zdHJpbmdfdGhpbmcsIHRoaW5nLmJ5dGVfdGhpbmcsIHRoaW5nLmkzMl90aGluZywgdGhpbmcuaTY0X3RoaW5nKTsKQEAgLTEzOCw3ICsxNDcsMTcgQEAKIAogICBvdmVycmlkZSBJbnNhbml0eVtOdW1iZXJ6XVtVc2VySWRdIHRlc3RJbnNhbml0eShyZWYgY29uc3QoSW5zYW5pdHkpIGFyZ3VtZW50KSB7CiAgICAgaWYgKHRyYWNlXykgd3JpdGVsbigidGVzdEluc2FuaXR5KCkiKTsKLSAgICByZXR1cm4gdGVzdEluc2FuaXR5UmV0dXJuOworICAgIEluc2FuaXR5W051bWJlcnpdW1VzZXJJZF0gcmV0OworICAgIEluc2FuaXR5W051bWJlcnpdIG0xOworICAgIEluc2FuaXR5W051bWJlcnpdIG0yOworICAgIEluc2FuaXR5IHRtcDsKKyAgICB0bXAgPSBjYXN0KEluc2FuaXR5KWFyZ3VtZW50OworICAgIG0xW051bWJlcnouVFdPXSA9IHRtcDsKKyAgICBtMVtOdW1iZXJ6LlRIUkVFXSA9IHRtcDsKKyAgICBtMltOdW1iZXJ6LlNJWF0gPSBJbnNhbml0eSgpOworICAgIHJldFsxXSA9IG0xOworICAgIHJldFsyXSA9IG0yOworICAgIHJldHVybiByZXQ7CiAgIH0KIAogICBvdmVycmlkZSBYdHJ1Y3QgdGVzdE11bHRpKGJ5dGUgYXJnMCwgaW50IGFyZzEsIGxvbmcgYXJnMiwgc3RyaW5nW3Nob3J0XSBhcmczLApAQCAtMTU1LDYgKzE3NCw4IEBACiAgICAgICBlLmVycm9yQ29kZSA9IDEwMDE7CiAgICAgICBlLm1lc3NhZ2UgPSBhcmc7CiAgICAgICB0aHJvdyBlOworICAgIH0gZWxzZSBpZiAoYXJnID09ICJURXhjZXB0aW9uIikgeworICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oKTsKICAgICB9IGVsc2UgaWYgKGFyZyA9PSAiQXBwbGljYXRpb25FeGNlcHRpb24iKSB7CiAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigpOwogICAgIH0KQEAgLTE4OCwxNCArMjA5LDQ0IEBACiAgIGJvb2wgdHJhY2VfOwogfQogCitzaGFyZWQoYm9vbCkgZ1NodXRkb3duID0gZmFsc2U7CisKK25vdGhyb3cgQG5vZ2MgZXh0ZXJuKEMpIHZvaWQgaGFuZGxlU2lnbmFsKGludCBzaWcpIHsKKyAgZ1NodXRkb3duID0gdHJ1ZTsKK30KKworLy8gUnVucyBhIHRocmVhZCB0aGF0IHdhaXRzIGZvciBzaHV0ZG93biB0byBiZQorLy8gc2lnbmFsZWQgYW5kIHRoZW4gdHJpZ2dlcnMgY2FuY2VsbGF0aW9uLAorLy8gY2F1c2luZyB0aGUgc2VydmVyIHRvIHN0b3AuICBXaGlsZSB3ZSBjb3VsZAorLy8gdXNlIGEgc2lnbmFsZmQgZm9yIHRoaXMgcHVycG9zZSwgd2UgYXJlIGluc3RlYWQKKy8vIG9wdGluZyBmb3IgYSBidXN5IHdhaXRpbmcgc2NoZW1lIGZvciBtYXhpbXVtCisvLyBwb3J0YWJpbGl0eSBzaW5jZSBzaWduYWxmZCBpcyBhIGxpbnV4IHRoaW5nLgorCitjbGFzcyBTaHV0ZG93blRocmVhZCA6IFRocmVhZCB7CisgIHRoaXMoVENhbmNlbGxhdGlvbk9yaWdpbiBjYW5jZWxsYXRpb24pIHsKKyAgICBjYW5jZWxsYXRpb25fID0gY2FuY2VsbGF0aW9uOworICAgIHN1cGVyKCZydW4pOworICB9CisgIAorcHJpdmF0ZToKKyAgdm9pZCBydW4oKSB7CisgICAgd2hpbGUgKCFnU2h1dGRvd24pIHsKKyAgICAgIFRocmVhZC5zbGVlcChkdXIhKCJtc2VjcyIpKDI1KSk7CisgICAgfQorICAgIGNhbmNlbGxhdGlvbl8udHJpZ2dlcigpOworICB9CisgIAorICBUQ2FuY2VsbGF0aW9uT3JpZ2luIGNhbmNlbGxhdGlvbl87Cit9CisKIHZvaWQgbWFpbihzdHJpbmdbXSBhcmdzKSB7CiAgIHVzaG9ydCBwb3J0ID0gOTA5MDsKICAgU2VydmVyVHlwZSBzZXJ2ZXJUeXBlOwogICBQcm90b2NvbFR5cGUgcHJvdG9jb2xUeXBlOwogICBzaXplX3QgbnVtSU9UaHJlYWRzID0gMTsKICAgVHJhbnNwb3J0VHlwZSB0cmFuc3BvcnRUeXBlOwotICBib29sIHNzbDsKLSAgYm9vbCB0cmFjZTsKKyAgYm9vbCBzc2wgPSBmYWxzZTsKKyAgYm9vbCB0cmFjZSA9IHRydWU7CiAgIHNpemVfdCB0YXNrUG9vbFNpemUgPSB0b3RhbENQVXM7CiAKICAgZ2V0b3B0KGFyZ3MsICJwb3J0IiwgJnBvcnQsICJwcm90b2NvbCIsICZwcm90b2NvbFR5cGUsICJzZXJ2ZXItdHlwZSIsCkBAIC0yNDksOCArMzAwLDggQEAKICAgaWYgKHNzbCkgewogICAgIGF1dG8gc3NsQ29udGV4dCA9IG5ldyBUU1NMQ29udGV4dCgpOwogICAgIHNzbENvbnRleHQuc2VydmVyU2lkZSA9IHRydWU7Ci0gICAgc3NsQ29udGV4dC5sb2FkQ2VydGlmaWNhdGUoIi4vc2VydmVyLWNlcnRpZmljYXRlLnBlbSIpOwotICAgIHNzbENvbnRleHQubG9hZFByaXZhdGVLZXkoIi4vc2VydmVyLXByaXZhdGUta2V5LnBlbSIpOworICAgIHNzbENvbnRleHQubG9hZENlcnRpZmljYXRlKCIuLi8uLi8uLi90ZXN0L2tleXMvc2VydmVyLmNydCIpOworICAgIHNzbENvbnRleHQubG9hZFByaXZhdGVLZXkoIi4uLy4uLy4uL3Rlc3Qva2V5cy9zZXJ2ZXIua2V5Iik7CiAgICAgc3NsQ29udGV4dC5jaXBoZXJzID0gIkFMTDohQURIOiFMT1c6IUVYUDohTUQ1OkBTVFJFTkdUSCI7CiAgICAgc2VydmVyU29ja2V0ID0gbmV3IFRTU0xTZXJ2ZXJTb2NrZXQocG9ydCwgc3NsQ29udGV4dCk7CiAgIH0gZWxzZSB7CkBAIC0yNjIsOCArMzEzLDI2IEBACiAgIGF1dG8gc2VydmVyID0gY3JlYXRlU2VydmVyKHNlcnZlclR5cGUsIG51bUlPVGhyZWFkcywgdGFza1Bvb2xTaXplLAogICAgIHByb2Nlc3Nvciwgc2VydmVyU29ja2V0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpOwogCisgIC8vIFNldCB1cCBTSUdJTlQgc2lnbmFsIGhhbmRsaW5nCisgIHNpZ2ZuX3Qgb2xkSGFuZGxlciA9IHNpZ25hbChTSUdJTlQsICZoYW5kbGVTaWduYWwpOworICBlbmZvcmNlKG9sZEhhbmRsZXIgIT0gU0lHX0VSUiwKKyAgICAiQ291bGQgbm90IHJlcGxhY2UgdGhlIFNJR0lOVCBzaWduYWwgaGFuZGxlcjogZXJybm8gezB9Ii5mb3JtYXQoZXJybm8oKSkpOworICAKKyAgLy8gU2V0IHVwIGEgc2VydmVyIGNhbmNlbGxhdGlvbiB0cmlnZ2VyCisgIGF1dG8gY2FuY2VsID0gbmV3IFRDYW5jZWxsYXRpb25PcmlnaW4oKTsKKworICAvLyBTZXQgdXAgYSBsaXN0ZW5lciBmb3IgdGhlIHNodXRkb3duIGNvbmRpdGlvbiAtIHRoaXMgd2lsbAorICAvLyB3YWtlIHVwIHdoZW4gdGhlIHNpZ25hbCBvY2N1cnMgYW5kIHRyaWdnZXIgY2FuY2VsbGF0aW9uLgorICBhdXRvIHNodXRkb3duID0gbmV3IFNodXRkb3duVGhyZWFkKGNhbmNlbCk7CisgIHNodXRkb3duLnN0YXJ0KCk7CisgIAorICAvLyBTZXJ2ZSBmcm9tIHRoaXMgdGhyZWFkOyB0aGUgc2lnbmFsIHdpbGwgc3RvcCB0aGUgc2VydmVyCisgIC8vIGFuZCBjb250cm9sIHdpbGwgcmV0dXJuIGhlcmUKICAgd3JpdGVmbG4oIlN0YXJ0aW5nICVzLyVzICVzIFRocmlmdFRlc3Qgc2VydmVyICVzb24gcG9ydCAlcy4uLiIsIHByb3RvY29sVHlwZSwKICAgICB0cmFuc3BvcnRUeXBlLCBzZXJ2ZXJUeXBlLCBzc2wgPyAiKHVzaW5nIFNTTCkgIjogIiIsIHBvcnQpOwotICBzZXJ2ZXIuc2VydmUoKTsKKyAgc2VydmVyLnNlcnZlKGNhbmNlbCk7CisgIHNodXRkb3duLmpvaW4oKTsKKyAgc2lnbmFsKFNJR0lOVCwgU0lHX0RGTCk7CisgICAgCiAgIHdyaXRlbG4oImRvbmUuIik7CiB9CmRpZmYgLS1naXQgYS9saWIvZC90ZXN0L3RyYW5zcG9ydF90ZXN0LmQgYi9saWIvZC90ZXN0L3RyYW5zcG9ydF90ZXN0LmQKaW5kZXggMDliZjZmZC4uNjIzZTAzZiAxMDA2NDQKLS0tIGEvbGliL2QvdGVzdC90cmFuc3BvcnRfdGVzdC5kCisrKyBiL2xpYi9kL3Rlc3QvdHJhbnNwb3J0X3Rlc3QuZApAQCAtMTQ0LDcgKzE0NCw3IEBACiAgIH0KIAogICB+dGhpcygpIHsKLSAgICBjbGVhcihpbm5lcl8pOworICAgIGRlc3Ryb3koaW5uZXJfKTsKICAgfQogCiBwcml2YXRlOgpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvLmFuYWx5c2lzX29wdGlvbnMgYi9saWIvZGFydC8uYW5hbHlzaXNfb3B0aW9ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTBkNGM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvLmFuYWx5c2lzX29wdGlvbnMKQEAgLTAsMCArMSwyIEBACithbmFseXplcjoKKyAgc3Ryb25nLW1vZGU6IHRydWUKZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L0xJQ0VOU0UgYi9saWIvZGFydC9MSUNFTlNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlYWNiNjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9MSUNFTlNFCkBAIC0wLDAgKzEsMTYgQEAKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L01ha2VmaWxlLmFtIGIvbGliL2RhcnQvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI2ZGRjMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMzMgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCithbGwtbG9jYWw6CisJJChEQVJUUFVCKSBnZXQKKworY2xlYW4tbG9jYWw6CisJJChSTSkgLXIgLnB1YgorCWZpbmQgLiAtdHlwZSBkIC1uYW1lICJwYWNrYWdlcyIgfCB4YXJncyAkKFJNKSAtcgorCWZpbmQgLiAtdHlwZSBmIC1uYW1lICIucGFja2FnZXMiIHwgeGFyZ3MgJChSTSkKKwlmaW5kIC4gLXR5cGUgZiAtbmFtZSAicHVic3BlYy5sb2NrIiB8IHhhcmdzICQoUk0pCisKK2NoZWNrLWxvY2FsOiBhbGwKKworRVhUUkFfRElTVCA9IFwKKwkuYW5hbHlzaXNfb3B0aW9ucworCmRpZmYgLS1naXQgYS9saWIvZGFydC9SRUFETUUubWQgYi9saWIvZGFydC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJlMTY4YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L1JFQURNRS5tZApAQCAtMCwwICsxLDI2IEBACitUaHJpZnQgRGFydCBMaWJyYXJ5CisKK0xpY2Vuc2UKKz09PT09PT0KKworTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK2Rpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCitzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwordW5kZXIgdGhlIExpY2Vuc2UuCisKK1VzaW5nIFRocmlmdCB3aXRoIERhcnQKKz09PT09PT09PT09PT09PT09PT09CisKK0RhcnQgMS4xMi4wIG9yIG5ld2VyIGlzIHJlcXVpcmVkCmRpZmYgLS1naXQgYS9saWIvZGFydC9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvbGliL2RhcnQvY29kaW5nX3N0YW5kYXJkcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmY2MDAzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvY29kaW5nX3N0YW5kYXJkcy5tZApAQCAtMCwwICsxLDYgQEAKKyMgRGFydCBDb2RpbmcgU3RhbmRhcmRzCisKKyMjIyBQbGVhc2UgZm9sbG93OgorICogW1RocmlmdCBHZW5lcmFsIENvZGluZyBTdGFuZGFyZHNdKC9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZCkKKyAqIFtVc2UgZGFydGZtdF0oaHR0cHM6Ly93d3cuZGFydGxhbmcub3JnL3Rvb2xzL2RhcnRmbXQvKSBhbmQgZm9sbG93IHRoZSAKKyAgIFtEYXJ0IFN0eWxlIEd1aWRlXShodHRwczovL3d3dy5kYXJ0bGFuZy5vcmcvYXJ0aWNsZXMvc3R5bGUtZ3VpZGUvKQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy9icm93c2VyL3Rfd2ViX3NvY2tldC5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy9icm93c2VyL3Rfd2ViX3NvY2tldC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NjkzYjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL2Jyb3dzZXIvdF93ZWJfc29ja2V0LmRhcnQKQEAgLTAsMCArMSwxMzAgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitsaWJyYXJ5IHRocmlmdC5zcmMuYnJvd3NlcjsKKworaW1wb3J0ICdkYXJ0OmFzeW5jJzsKK2ltcG9ydCAnZGFydDpjb252ZXJ0JyBzaG93IEJBU0U2NDsKK2ltcG9ydCAnZGFydDpodG1sJyBzaG93IENsb3NlRXZlbnQ7CitpbXBvcnQgJ2RhcnQ6aHRtbCcgc2hvdyBFdmVudDsKK2ltcG9ydCAnZGFydDpodG1sJyBzaG93IE1lc3NhZ2VFdmVudDsKK2ltcG9ydCAnZGFydDpodG1sJyBzaG93IFdlYlNvY2tldDsKK2ltcG9ydCAnZGFydDp0eXBlZF9kYXRhJyBzaG93IFVpbnQ4TGlzdDsKKworaW1wb3J0ICdwYWNrYWdlOnRocmlmdC90aHJpZnQuZGFydCc7CisKKy8vLyBBIFtUU29ja2V0XSBiYWNrZWQgYnkgYSBbV2ViU29ja2V0XSBmcm9tIGRhcnQ6aHRtbAorY2xhc3MgVFdlYlNvY2tldCBpbXBsZW1lbnRzIFRTb2NrZXQgeworICBmaW5hbCBVcmkgdXJsOworCisgIGZpbmFsIFN0cmVhbUNvbnRyb2xsZXI8VFNvY2tldFN0YXRlPiBfb25TdGF0ZUNvbnRyb2xsZXI7CisgIFN0cmVhbTxUU29ja2V0U3RhdGU+IGdldCBvblN0YXRlID0+IF9vblN0YXRlQ29udHJvbGxlci5zdHJlYW07CisKKyAgZmluYWwgU3RyZWFtQ29udHJvbGxlcjxPYmplY3Q+IF9vbkVycm9yQ29udHJvbGxlcjsKKyAgU3RyZWFtPE9iamVjdD4gZ2V0IG9uRXJyb3IgPT4gX29uRXJyb3JDb250cm9sbGVyLnN0cmVhbTsKKworICBmaW5hbCBTdHJlYW1Db250cm9sbGVyPFVpbnQ4TGlzdD4gX29uTWVzc2FnZUNvbnRyb2xsZXI7CisgIFN0cmVhbTxVaW50OExpc3Q+IGdldCBvbk1lc3NhZ2UgPT4gX29uTWVzc2FnZUNvbnRyb2xsZXIuc3RyZWFtOworCisgIGZpbmFsIExpc3Q8VWludDhMaXN0PiBfcmVxdWVzdHMgPSBbXTsKKworICBUV2ViU29ja2V0KHRoaXMudXJsKQorICAgICAgOiBfb25TdGF0ZUNvbnRyb2xsZXIgPSBuZXcgU3RyZWFtQ29udHJvbGxlci5icm9hZGNhc3QoKSwKKyAgICAgICAgX29uRXJyb3JDb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXIuYnJvYWRjYXN0KCksCisgICAgICAgIF9vbk1lc3NhZ2VDb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXIuYnJvYWRjYXN0KCkgeworICAgIGlmICh1cmwgPT0gbnVsbCB8fCAhdXJsLmhhc0F1dGhvcml0eSB8fCAhdXJsLmhhc1BvcnQpIHsKKyAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCdJbnZhbGlkIHVybCcpOworICAgIH0KKyAgfQorCisgIFdlYlNvY2tldCBfc29ja2V0OworCisgIGJvb2wgZ2V0IGlzT3BlbiA9PiBfc29ja2V0ICE9IG51bGwgJiYgX3NvY2tldC5yZWFkeVN0YXRlID09IFdlYlNvY2tldC5PUEVOOworCisgIGJvb2wgZ2V0IGlzQ2xvc2VkID0+CisgICAgICBfc29ja2V0ID09IG51bGwgfHwgX3NvY2tldC5yZWFkeVN0YXRlID09IFdlYlNvY2tldC5DTE9TRUQ7CisKKyAgRnV0dXJlIG9wZW4oKSB7CisgICAgaWYgKCFpc0Nsb3NlZCkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFcnJvcigKKyAgICAgICAgICBUVHJhbnNwb3J0RXJyb3JUeXBlLkFMUkVBRFlfT1BFTiwgJ1NvY2tldCBhbHJlYWR5IGNvbm5lY3RlZCcpOworICAgIH0KKworICAgIF9zb2NrZXQgPSBuZXcgV2ViU29ja2V0KHVybC50b1N0cmluZygpKTsKKyAgICBfc29ja2V0Lm9uRXJyb3IubGlzdGVuKF9vbkVycm9yKTsKKyAgICBfc29ja2V0Lm9uT3Blbi5saXN0ZW4oX29uT3Blbik7CisgICAgX3NvY2tldC5vbkNsb3NlLmxpc3Rlbihfb25DbG9zZSk7CisgICAgX3NvY2tldC5vbk1lc3NhZ2UubGlzdGVuKF9vbk1lc3NhZ2UpOworCisgICAgcmV0dXJuIF9zb2NrZXQub25PcGVuLmZpcnN0OworICB9CisKKyAgRnV0dXJlIGNsb3NlKCkgeworICAgIGlmIChfc29ja2V0ICE9IG51bGwpIHsKKyAgICAgIF9zb2NrZXQuY2xvc2UoKTsKKyAgICAgIHJldHVybiBfc29ja2V0Lm9uQ2xvc2UuZmlyc3Q7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBuZXcgRnV0dXJlLnZhbHVlKCk7CisgICAgfQorICB9CisKKyAgdm9pZCBzZW5kKFVpbnQ4TGlzdCBkYXRhKSB7CisgICAgX3JlcXVlc3RzLmFkZChkYXRhKTsKKyAgICBfc2VuZFJlcXVlc3RzKCk7CisgIH0KKworICB2b2lkIF9zZW5kUmVxdWVzdHMoKSB7CisgICAgd2hpbGUgKGlzT3BlbiAmJiBfcmVxdWVzdHMuaXNOb3RFbXB0eSkgeworICAgICAgVWludDhMaXN0IGRhdGEgPSBfcmVxdWVzdHMucmVtb3ZlQXQoMCk7CisgICAgICBfc29ja2V0LnNlbmRTdHJpbmcoQkFTRTY0LmVuY29kZShkYXRhKSk7CisgICAgfQorICB9CisKKyAgdm9pZCBfb25PcGVuKEV2ZW50IGV2ZW50KSB7CisgICAgX29uU3RhdGVDb250cm9sbGVyLmFkZChUU29ja2V0U3RhdGUuT1BFTik7CisgICAgX3NlbmRSZXF1ZXN0cygpOworICB9CisKKyAgdm9pZCBfb25DbG9zZShDbG9zZUV2ZW50IGV2ZW50KSB7CisgICAgX3NvY2tldCA9IG51bGw7CisKKyAgICBpZiAoX3JlcXVlc3RzLmlzTm90RW1wdHkpIHsKKyAgICAgIF9vbkVycm9yQ29udHJvbGxlcgorICAgICAgICAgIC5hZGQobmV3IFN0YXRlRXJyb3IoJ1NvY2tldCB3YXMgY2xvc2VkIHdpdGggcGVuZGluZyByZXF1ZXN0cycpKTsKKyAgICB9CisgICAgX3JlcXVlc3RzLmNsZWFyKCk7CisKKyAgICBfb25TdGF0ZUNvbnRyb2xsZXIuYWRkKFRTb2NrZXRTdGF0ZS5DTE9TRUQpOworICB9CisKKyAgdm9pZCBfb25NZXNzYWdlKE1lc3NhZ2VFdmVudCBtZXNzYWdlKSB7CisgICAgdHJ5IHsKKyAgICAgIFVpbnQ4TGlzdCBkYXRhID0KKyAgICAgICAgICBuZXcgVWludDhMaXN0LmZyb21MaXN0KEJBU0U2NC5kZWNvZGUobWVzc2FnZS5kYXRhKSk7CisgICAgICBfb25NZXNzYWdlQ29udHJvbGxlci5hZGQoZGF0YSk7CisgICAgfSBvbiBGb3JtYXRFeGNlcHRpb24gY2F0Y2ggKF8pIHsKKyAgICAgIHZhciBlcnJvciA9IG5ldyBUUHJvdG9jb2xFcnJvcihUUHJvdG9jb2xFcnJvclR5cGUuSU5WQUxJRF9EQVRBLAorICAgICAgICAgICJFeHBlY3RlZCBhIEJhc2UgNjQgZW5jb2RlZCBzdHJpbmcuIik7CisgICAgICBfb25FcnJvckNvbnRyb2xsZXIuYWRkKGVycm9yKTsKKyAgICB9CisgIH0KKworICB2b2lkIF9vbkVycm9yKEV2ZW50IGV2ZW50KSB7CisgICAgY2xvc2UoKTsKKyAgICBfb25FcnJvckNvbnRyb2xsZXIuYWRkKGV2ZW50LnRvU3RyaW5nKCkpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL2NvbnNvbGUvdF90Y3Bfc29ja2V0LmRhcnQgYi9saWIvZGFydC9saWIvc3JjL2NvbnNvbGUvdF90Y3Bfc29ja2V0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjcxNDgwMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvY29uc29sZS90X3RjcF9zb2NrZXQuZGFydApAQCAtMCwwICsxLDgxIEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworbGlicmFyeSB0aHJpZnQuc3JjLmNvbnNvbGUudF90Y3Bfc29ja2V0OworCitpbXBvcnQgJ2RhcnQ6YXN5bmMnOworaW1wb3J0ICdkYXJ0OmlvJzsKK2ltcG9ydCAnZGFydDp0eXBlZF9kYXRhJyBzaG93IFVpbnQ4TGlzdDsKKworaW1wb3J0ICdwYWNrYWdlOnRocmlmdC90aHJpZnQuZGFydCc7CisKKy8vLyBBIFtUU29ja2V0XSBiYWNrZWQgYnkgYSBbU29ja2V0XSBmcm9tIGRhcnQ6aW8KK2NsYXNzIFRUY3BTb2NrZXQgaW1wbGVtZW50cyBUU29ja2V0IHsKKyAgZmluYWwgU3RyZWFtQ29udHJvbGxlcjxUU29ja2V0U3RhdGU+IF9vblN0YXRlQ29udHJvbGxlcjsKKyAgU3RyZWFtPFRTb2NrZXRTdGF0ZT4gZ2V0IG9uU3RhdGUgPT4gX29uU3RhdGVDb250cm9sbGVyLnN0cmVhbTsKKworICBmaW5hbCBTdHJlYW1Db250cm9sbGVyPE9iamVjdD4gX29uRXJyb3JDb250cm9sbGVyOworICBTdHJlYW08T2JqZWN0PiBnZXQgb25FcnJvciA9PiBfb25FcnJvckNvbnRyb2xsZXIuc3RyZWFtOworCisgIGZpbmFsIFN0cmVhbUNvbnRyb2xsZXI8VWludDhMaXN0PiBfb25NZXNzYWdlQ29udHJvbGxlcjsKKyAgU3RyZWFtPFVpbnQ4TGlzdD4gZ2V0IG9uTWVzc2FnZSA9PiBfb25NZXNzYWdlQ29udHJvbGxlci5zdHJlYW07CisKKyAgVFRjcFNvY2tldChTb2NrZXQgc29ja2V0KQorICAgICAgOiBfb25TdGF0ZUNvbnRyb2xsZXIgPSBuZXcgU3RyZWFtQ29udHJvbGxlci5icm9hZGNhc3QoKSwKKyAgICAgICAgX29uRXJyb3JDb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXIuYnJvYWRjYXN0KCksCisgICAgICAgIF9vbk1lc3NhZ2VDb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXIuYnJvYWRjYXN0KCkgeworICAgIGlmIChzb2NrZXQgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3Iubm90TnVsbCgnc29ja2V0Jyk7CisgICAgfQorCisgICAgX3NvY2tldCA9IHNvY2tldDsKKyAgICBfc29ja2V0Lmxpc3Rlbihfb25NZXNzYWdlLCBvbkVycm9yOiBfb25FcnJvciwgb25Eb25lOiBjbG9zZSk7CisgIH0KKworICBTb2NrZXQgX3NvY2tldDsKKworICBib29sIGdldCBpc09wZW4gPT4gX3NvY2tldCAhPSBudWxsOworCisgIGJvb2wgZ2V0IGlzQ2xvc2VkID0+IF9zb2NrZXQgPT0gbnVsbDsKKworICBGdXR1cmUgb3BlbigpIGFzeW5jIHsKKyAgICBfb25TdGF0ZUNvbnRyb2xsZXIuYWRkKFRTb2NrZXRTdGF0ZS5PUEVOKTsKKyAgfQorCisgIEZ1dHVyZSBjbG9zZSgpIGFzeW5jIHsKKyAgICBpZiAoX3NvY2tldCAhPSBudWxsKSB7CisgICAgICBhd2FpdCBfc29ja2V0LmNsb3NlKCk7CisgICAgICBfc29ja2V0ID0gbnVsbDsKKyAgICB9CisKKyAgICBfb25TdGF0ZUNvbnRyb2xsZXIuYWRkKFRTb2NrZXRTdGF0ZS5DTE9TRUQpOworICB9CisKKyAgdm9pZCBzZW5kKFVpbnQ4TGlzdCBkYXRhKSB7CisgICAgX3NvY2tldC5hZGQoZGF0YSk7CisgIH0KKworICB2b2lkIF9vbk1lc3NhZ2UoTGlzdDxpbnQ+IG1lc3NhZ2UpIHsKKyAgICBVaW50OExpc3QgZGF0YSA9IG5ldyBVaW50OExpc3QuZnJvbUxpc3QobWVzc2FnZSk7CisgICAgX29uTWVzc2FnZUNvbnRyb2xsZXIuYWRkKGRhdGEpOworICB9CisKKyAgdm9pZCBfb25FcnJvcihPYmplY3QgZXJyb3IpIHsKKyAgICBjbG9zZSgpOworICAgIF9vbkVycm9yQ29udHJvbGxlci5hZGQoJyRlcnJvcicpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL2NvbnNvbGUvdF93ZWJfc29ja2V0LmRhcnQgYi9saWIvZGFydC9saWIvc3JjL2NvbnNvbGUvdF93ZWJfc29ja2V0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVkNzI4NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvY29uc29sZS90X3dlYl9zb2NrZXQuZGFydApAQCAtMCwwICsxLDg5IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworbGlicmFyeSB0aHJpZnQuc3JjLmNvbnNvbGUudF93ZWJfc29ja2V0OworCitpbXBvcnQgJ2RhcnQ6YXN5bmMnOworaW1wb3J0ICdkYXJ0OmNvbnZlcnQnIHNob3cgQkFTRTY0OworaW1wb3J0ICdkYXJ0OmlvJzsKK2ltcG9ydCAnZGFydDp0eXBlZF9kYXRhJyBzaG93IFVpbnQ4TGlzdDsKKworaW1wb3J0ICdwYWNrYWdlOnRocmlmdC90aHJpZnQuZGFydCc7CisKKy8vLyBBIFtUU29ja2V0XSBiYWNrZWQgYnkgYSBbV2ViU29ja2V0XSBmcm9tIGRhcnQ6aW8KK2NsYXNzIFRXZWJTb2NrZXQgaW1wbGVtZW50cyBUU29ja2V0IHsKKyAgZmluYWwgU3RyZWFtQ29udHJvbGxlcjxUU29ja2V0U3RhdGU+IF9vblN0YXRlQ29udHJvbGxlcjsKKyAgU3RyZWFtPFRTb2NrZXRTdGF0ZT4gZ2V0IG9uU3RhdGUgPT4gX29uU3RhdGVDb250cm9sbGVyLnN0cmVhbTsKKworICBmaW5hbCBTdHJlYW1Db250cm9sbGVyPE9iamVjdD4gX29uRXJyb3JDb250cm9sbGVyOworICBTdHJlYW08T2JqZWN0PiBnZXQgb25FcnJvciA9PiBfb25FcnJvckNvbnRyb2xsZXIuc3RyZWFtOworCisgIGZpbmFsIFN0cmVhbUNvbnRyb2xsZXI8VWludDhMaXN0PiBfb25NZXNzYWdlQ29udHJvbGxlcjsKKyAgU3RyZWFtPFVpbnQ4TGlzdD4gZ2V0IG9uTWVzc2FnZSA9PiBfb25NZXNzYWdlQ29udHJvbGxlci5zdHJlYW07CisKKyAgVFdlYlNvY2tldChXZWJTb2NrZXQgc29ja2V0KQorICAgICAgOiBfb25TdGF0ZUNvbnRyb2xsZXIgPSBuZXcgU3RyZWFtQ29udHJvbGxlci5icm9hZGNhc3QoKSwKKyAgICAgICAgX29uRXJyb3JDb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXIuYnJvYWRjYXN0KCksCisgICAgICAgIF9vbk1lc3NhZ2VDb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXIuYnJvYWRjYXN0KCkgeworICAgIGlmIChzb2NrZXQgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3Iubm90TnVsbCgnc29ja2V0Jyk7CisgICAgfQorCisgICAgX3NvY2tldCA9IHNvY2tldDsKKyAgICBfc29ja2V0Lmxpc3Rlbihfb25NZXNzYWdlLCBvbkVycm9yOiBfb25FcnJvciwgb25Eb25lOiBjbG9zZSk7CisgIH0KKworICBXZWJTb2NrZXQgX3NvY2tldDsKKworICBib29sIGdldCBpc09wZW4gPT4gX3NvY2tldCAhPSBudWxsOworCisgIGJvb2wgZ2V0IGlzQ2xvc2VkID0+IF9zb2NrZXQgPT0gbnVsbDsKKworICBGdXR1cmUgb3BlbigpIGFzeW5jIHsKKyAgICBfb25TdGF0ZUNvbnRyb2xsZXIuYWRkKFRTb2NrZXRTdGF0ZS5PUEVOKTsKKyAgfQorCisgIEZ1dHVyZSBjbG9zZSgpIGFzeW5jIHsKKyAgICBpZiAoX3NvY2tldCAhPSBudWxsKSB7CisgICAgICBhd2FpdCBfc29ja2V0LmNsb3NlKCk7CisgICAgICBfc29ja2V0ID0gbnVsbDsKKyAgICB9CisKKyAgICBfb25TdGF0ZUNvbnRyb2xsZXIuYWRkKFRTb2NrZXRTdGF0ZS5DTE9TRUQpOworICB9CisKKyAgdm9pZCBzZW5kKFVpbnQ4TGlzdCBkYXRhKSB7CisgICAgX3NvY2tldC5hZGQoQkFTRTY0LmVuY29kZShkYXRhKSk7CisgIH0KKworICB2b2lkIF9vbk1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICB0cnkgeworICAgICAgVWludDhMaXN0IGRhdGEgPQorICAgICAgICAgIG5ldyBVaW50OExpc3QuZnJvbUxpc3QoQkFTRTY0LmRlY29kZShtZXNzYWdlKSk7CisgICAgICBfb25NZXNzYWdlQ29udHJvbGxlci5hZGQoZGF0YSk7CisgICAgfSBvbiBGb3JtYXRFeGNlcHRpb24gY2F0Y2ggKF8pIHsKKyAgICAgIHZhciBlcnJvciA9IG5ldyBUUHJvdG9jb2xFcnJvcihUUHJvdG9jb2xFcnJvclR5cGUuSU5WQUxJRF9EQVRBLAorICAgICAgICAgICJFeHBlY3RlZCBhIEJhc2UgNjQgZW5jb2RlZCBzdHJpbmcuIik7CisgICAgICBfb25FcnJvckNvbnRyb2xsZXIuYWRkKGVycm9yKTsKKyAgICB9CisgIH0KKworICB2b2lkIF9vbkVycm9yKE9iamVjdCBlcnJvcikgeworICAgIGNsb3NlKCk7CisgICAgX29uRXJyb3JDb250cm9sbGVyLmFkZCgnJGVycm9yJyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9iaW5hcnlfcHJvdG9jb2wuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9iaW5hcnlfcHJvdG9jb2wuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzg1ZDgxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X2JpbmFyeV9wcm90b2NvbC5kYXJ0CkBAIC0wLDAgKzEsMjgxIEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKK2NsYXNzIFRCaW5hcnlQcm90b2NvbEZhY3RvcnkgaW1wbGVtZW50cyBUUHJvdG9jb2xGYWN0b3J5PFRCaW5hcnlQcm90b2NvbD4geworICBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KHt0aGlzLnN0cmljdFJlYWQ6IGZhbHNlLCB0aGlzLnN0cmljdFdyaXRlOiB0cnVlfSk7CisKKyAgZmluYWwgYm9vbCBzdHJpY3RSZWFkOworICBmaW5hbCBib29sIHN0cmljdFdyaXRlOworCisgIFRCaW5hcnlQcm90b2NvbCBnZXRQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zcG9ydCkgeworICAgIHJldHVybiBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCwKKyAgICAgICAgc3RyaWN0UmVhZDogc3RyaWN0UmVhZCwgc3RyaWN0V3JpdGU6IHN0cmljdFdyaXRlKTsKKyAgfQorfQorCisvLy8gQmluYXJ5IHByb3RvY29sIGltcGxlbWVudGF0aW9uIGZvciBUaHJpZnQuCisvLy8KKy8vLyBBZGFwdGVkIGZyb20gdGhlIEMjIHZlcnNpb24uCitjbGFzcyBUQmluYXJ5UHJvdG9jb2wgZXh0ZW5kcyBUUHJvdG9jb2wgeworICBzdGF0aWMgY29uc3QgaW50IFZFUlNJT05fTUFTSyA9IDB4ZmZmZjAwMDA7CisgIHN0YXRpYyBjb25zdCBpbnQgVkVSU0lPTl8xID0gMHg4MDAxMDAwMDsKKworICBzdGF0aWMgY29uc3QgVXRmOENvZGVjIF91dGY4Q29kZWMgPSBjb25zdCBVdGY4Q29kZWMoKTsKKworICBmaW5hbCBib29sIHN0cmljdFJlYWQ7CisgIGZpbmFsIGJvb2wgc3RyaWN0V3JpdGU7CisKKyAgVEJpbmFyeVByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnNwb3J0LAorICAgICAge3RoaXMuc3RyaWN0UmVhZDogZmFsc2UsIHRoaXMuc3RyaWN0V3JpdGU6IHRydWV9KQorICAgICAgOiBzdXBlcih0cmFuc3BvcnQpOworCisgIC8vLyB3cml0ZQorICB2b2lkIHdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICBpZiAoc3RyaWN0V3JpdGUpIHsKKyAgICAgIGludCB2ZXJzaW9uID0gVkVSU0lPTl8xIHwgbWVzc2FnZS50eXBlOworICAgICAgd3JpdGVJMzIodmVyc2lvbik7CisgICAgICB3cml0ZVN0cmluZyhtZXNzYWdlLm5hbWUpOworICAgICAgd3JpdGVJMzIobWVzc2FnZS5zZXFpZCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHdyaXRlU3RyaW5nKG1lc3NhZ2UubmFtZSk7CisgICAgICB3cml0ZUJ5dGUobWVzc2FnZS50eXBlKTsKKyAgICAgIHdyaXRlSTMyKG1lc3NhZ2Uuc2VxaWQpOworICAgIH0KKyAgfQorCisgIHZvaWQgd3JpdGVNZXNzYWdlRW5kKCkge30KKworICB2b2lkIHdyaXRlU3RydWN0QmVnaW4oVFN0cnVjdCBzdHJ1Y3QpIHt9CisKKyAgdm9pZCB3cml0ZVN0cnVjdEVuZCgpIHt9CisKKyAgdm9pZCB3cml0ZUZpZWxkQmVnaW4oVEZpZWxkIGZpZWxkKSB7CisgICAgd3JpdGVCeXRlKGZpZWxkLnR5cGUpOworICAgIHdyaXRlSTE2KGZpZWxkLmlkKTsKKyAgfQorCisgIHZvaWQgd3JpdGVGaWVsZEVuZCgpIHt9CisKKyAgdm9pZCB3cml0ZUZpZWxkU3RvcCgpIHsKKyAgICB3cml0ZUJ5dGUoVFR5cGUuU1RPUCk7CisgIH0KKworICB2b2lkIHdyaXRlTWFwQmVnaW4oVE1hcCBtYXApIHsKKyAgICB3cml0ZUJ5dGUobWFwLmtleVR5cGUpOworICAgIHdyaXRlQnl0ZShtYXAudmFsdWVUeXBlKTsKKyAgICB3cml0ZUkzMihtYXAubGVuZ3RoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVNYXBFbmQoKSB7fQorCisgIHZvaWQgd3JpdGVMaXN0QmVnaW4oVExpc3QgbGlzdCkgeworICAgIHdyaXRlQnl0ZShsaXN0LmVsZW1lbnRUeXBlKTsKKyAgICB3cml0ZUkzMihsaXN0Lmxlbmd0aCk7CisgIH0KKworICB2b2lkIHdyaXRlTGlzdEVuZCgpIHt9CisKKyAgdm9pZCB3cml0ZVNldEJlZ2luKFRTZXQgc2V0KSB7CisgICAgd3JpdGVCeXRlKHNldC5lbGVtZW50VHlwZSk7CisgICAgd3JpdGVJMzIoc2V0Lmxlbmd0aCk7CisgIH0KKworICB2b2lkIHdyaXRlU2V0RW5kKCkge30KKworICB2b2lkIHdyaXRlQm9vbChib29sIGIpIHsKKyAgICBpZiAoYiA9PSBudWxsKSBiID0gZmFsc2U7CisgICAgd3JpdGVCeXRlKGIgPyAxIDogMCk7CisgIH0KKworICBmaW5hbCBCeXRlRGF0YSBfYnl0ZU91dCA9IG5ldyBCeXRlRGF0YSgxKTsKKyAgdm9pZCB3cml0ZUJ5dGUoaW50IGJ5dGUpIHsKKyAgICBpZiAoYnl0ZSA9PSBudWxsKSBieXRlID0gMDsKKyAgICBfYnl0ZU91dC5zZXRVaW50OCgwLCBieXRlKTsKKyAgICB0cmFuc3BvcnQud3JpdGUoX2J5dGVPdXQuYnVmZmVyLmFzVWludDhMaXN0KCksIDAsIDEpOworICB9CisKKyAgZmluYWwgQnl0ZURhdGEgX2kxNk91dCA9IG5ldyBCeXRlRGF0YSgyKTsKKyAgdm9pZCB3cml0ZUkxNihpbnQgaTE2KSB7CisgICAgaWYgKGkxNiA9PSBudWxsKSBpMTYgPSAwOworICAgIF9pMTZPdXQuc2V0SW50MTYoMCwgaTE2KTsKKyAgICB0cmFuc3BvcnQud3JpdGUoX2kxNk91dC5idWZmZXIuYXNVaW50OExpc3QoKSwgMCwgMik7CisgIH0KKworICBmaW5hbCBCeXRlRGF0YSBfaTMyT3V0ID0gbmV3IEJ5dGVEYXRhKDQpOworICB2b2lkIHdyaXRlSTMyKGludCBpMzIpIHsKKyAgICBpZiAoaTMyID09IG51bGwpIGkzMiA9IDA7CisgICAgX2kzMk91dC5zZXRJbnQzMigwLCBpMzIpOworICAgIHRyYW5zcG9ydC53cml0ZShfaTMyT3V0LmJ1ZmZlci5hc1VpbnQ4TGlzdCgpLCAwLCA0KTsKKyAgfQorCisgIGZpbmFsIFVpbnQ4TGlzdCBfaTY0T3V0ID0gbmV3IFVpbnQ4TGlzdCg4KTsKKyAgdm9pZCB3cml0ZUk2NChpbnQgaTY0KSB7CisgICAgaWYgKGk2NCA9PSBudWxsKSBpNjQgPSAwOworICAgIHZhciBpID0gbmV3IEludDY0KGk2NCk7CisgICAgdmFyIGJ0cyA9IGkudG9CeXRlcygpOworICAgIGZvciAodmFyIGogPSAwOyBqIDwgODsgaisrKSB7CisgICAgICBfaTY0T3V0W2pdID0gYnRzWzggLSBqIC0gMV07CisgICAgfQorICAgIHRyYW5zcG9ydC53cml0ZShfaTY0T3V0LCAwLCA4KTsKKyAgfQorCisgIHZvaWQgd3JpdGVTdHJpbmcoU3RyaW5nIHMpIHsKKyAgICB2YXIgYnl0ZXMgPSBzICE9IG51bGwgPyBfdXRmOENvZGVjLmVuY29kZShzKSA6IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoW10pOworICAgIHdyaXRlSTMyKGJ5dGVzLmxlbmd0aCk7CisgICAgdHJhbnNwb3J0LndyaXRlKGJ5dGVzLCAwLCBieXRlcy5sZW5ndGgpOworICB9CisKKyAgZmluYWwgQnl0ZURhdGEgX2RvdWJsZU91dCA9IG5ldyBCeXRlRGF0YSg4KTsKKyAgdm9pZCB3cml0ZURvdWJsZShkb3VibGUgZCkgeworICAgIGlmIChkID09IG51bGwpIGQgPSAwLjA7CisgICAgX2RvdWJsZU91dC5zZXRGbG9hdDY0KDAsIGQpOworICAgIHRyYW5zcG9ydC53cml0ZShfZG91YmxlT3V0LmJ1ZmZlci5hc1VpbnQ4TGlzdCgpLCAwLCA4KTsKKyAgfQorCisgIHZvaWQgd3JpdGVCaW5hcnkoVWludDhMaXN0IGJ5dGVzKSB7CisgICAgdmFyIGxlbmd0aCA9IGJ5dGVzLmxlbmd0aDsKKyAgICB3cml0ZUkzMihsZW5ndGgpOworICAgIHRyYW5zcG9ydC53cml0ZShieXRlcywgMCwgbGVuZ3RoKTsKKyAgfQorCisgIC8vLyByZWFkCisgIFRNZXNzYWdlIHJlYWRNZXNzYWdlQmVnaW4oKSB7CisgICAgU3RyaW5nIG5hbWU7CisgICAgaW50IHR5cGU7CisgICAgaW50IHNlcWlkOworCisgICAgaW50IHNpemUgPSByZWFkSTMyKCk7CisgICAgaWYgKHNpemUgPCAwKSB7CisgICAgICBpbnQgdmVyc2lvbiA9IHNpemUgJiBWRVJTSU9OX01BU0s7CisgICAgICBpZiAodmVyc2lvbiAhPSBWRVJTSU9OXzEpIHsKKyAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKFRQcm90b2NvbEVycm9yVHlwZS5CQURfVkVSU0lPTiwKKyAgICAgICAgICAgICJCYWQgdmVyc2lvbiBpbiByZWFkTWVzc2FnZUJlZ2luOiAkdmVyc2lvbiIpOworICAgICAgfQorICAgICAgdHlwZSA9IHNpemUgJiAweDAwMDAwMGZmOworICAgICAgbmFtZSA9IHJlYWRTdHJpbmcoKTsKKyAgICAgIHNlcWlkID0gcmVhZEkzMigpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoc3RyaWN0UmVhZCkgeworICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoVFByb3RvY29sRXJyb3JUeXBlLkJBRF9WRVJTSU9OLAorICAgICAgICAgICAgIk1pc3NpbmcgdmVyc2lvbiBpbiByZWFkTWVzc2FnZUJlZ2luIik7CisgICAgICB9CisgICAgICBuYW1lID0gX3JlYWRTdHJpbmcoc2l6ZSk7CisgICAgICB0eXBlID0gcmVhZEJ5dGUoKTsKKyAgICAgIHNlcWlkID0gcmVhZEkzMigpOworICAgIH0KKyAgICByZXR1cm4gbmV3IFRNZXNzYWdlKG5hbWUsIHR5cGUsIHNlcWlkKTsKKyAgfQorCisgIHZvaWQgcmVhZE1lc3NhZ2VFbmQoKSB7fQorCisgIFRTdHJ1Y3QgcmVhZFN0cnVjdEJlZ2luKCkgeworICAgIHJldHVybiBuZXcgVFN0cnVjdCgpOworICB9CisKKyAgdm9pZCByZWFkU3RydWN0RW5kKCkge30KKworICBURmllbGQgcmVhZEZpZWxkQmVnaW4oKSB7CisgICAgU3RyaW5nIG5hbWUgPSAiIjsKKyAgICBpbnQgdHlwZSA9IHJlYWRCeXRlKCk7CisgICAgaW50IGlkID0gdHlwZSAhPSBUVHlwZS5TVE9QID8gcmVhZEkxNigpIDogMDsKKworICAgIHJldHVybiBuZXcgVEZpZWxkKG5hbWUsIHR5cGUsIGlkKTsKKyAgfQorCisgIHZvaWQgcmVhZEZpZWxkRW5kKCkge30KKworICBUTWFwIHJlYWRNYXBCZWdpbigpIHsKKyAgICBpbnQga2V5VHlwZSA9IHJlYWRCeXRlKCk7CisgICAgaW50IHZhbHVlVHlwZSA9IHJlYWRCeXRlKCk7CisgICAgaW50IGxlbmd0aCA9IHJlYWRJMzIoKTsKKworICAgIHJldHVybiBuZXcgVE1hcChrZXlUeXBlLCB2YWx1ZVR5cGUsIGxlbmd0aCk7CisgIH0KKworICB2b2lkIHJlYWRNYXBFbmQoKSB7fQorCisgIFRMaXN0IHJlYWRMaXN0QmVnaW4oKSB7CisgICAgaW50IGVsZW1lbnRUeXBlID0gcmVhZEJ5dGUoKTsKKyAgICBpbnQgbGVuZ3RoID0gcmVhZEkzMigpOworCisgICAgcmV0dXJuIG5ldyBUTGlzdChlbGVtZW50VHlwZSwgbGVuZ3RoKTsKKyAgfQorCisgIHZvaWQgcmVhZExpc3RFbmQoKSB7fQorCisgIFRTZXQgcmVhZFNldEJlZ2luKCkgeworICAgIGludCBlbGVtZW50VHlwZSA9IHJlYWRCeXRlKCk7CisgICAgaW50IGxlbmd0aCA9IHJlYWRJMzIoKTsKKworICAgIHJldHVybiBuZXcgVFNldChlbGVtZW50VHlwZSwgbGVuZ3RoKTsKKyAgfQorCisgIHZvaWQgcmVhZFNldEVuZCgpIHt9CisKKyAgYm9vbCByZWFkQm9vbCgpID0+IHJlYWRCeXRlKCkgPT0gMTsKKworICBmaW5hbCBVaW50OExpc3QgX2J5dGVJbiA9IG5ldyBVaW50OExpc3QoMSk7CisgIGludCByZWFkQnl0ZSgpIHsKKyAgICB0cmFuc3BvcnQucmVhZEFsbChfYnl0ZUluLCAwLCAxKTsKKyAgICByZXR1cm4gX2J5dGVJbi5idWZmZXIuYXNCeXRlRGF0YSgpLmdldFVpbnQ4KDApOworICB9CisKKyAgZmluYWwgVWludDhMaXN0IF9pMTZJbiA9IG5ldyBVaW50OExpc3QoMik7CisgIGludCByZWFkSTE2KCkgeworICAgIHRyYW5zcG9ydC5yZWFkQWxsKF9pMTZJbiwgMCwgMik7CisgICAgcmV0dXJuIF9pMTZJbi5idWZmZXIuYXNCeXRlRGF0YSgpLmdldEludDE2KDApOworICB9CisKKyAgZmluYWwgVWludDhMaXN0IF9pMzJJbiA9IG5ldyBVaW50OExpc3QoNCk7CisgIGludCByZWFkSTMyKCkgeworICAgIHRyYW5zcG9ydC5yZWFkQWxsKF9pMzJJbiwgMCwgNCk7CisgICAgcmV0dXJuIF9pMzJJbi5idWZmZXIuYXNCeXRlRGF0YSgpLmdldEludDMyKDApOworICB9CisKKyAgZmluYWwgVWludDhMaXN0IF9pNjRJbiA9IG5ldyBVaW50OExpc3QoOCk7CisgIGludCByZWFkSTY0KCkgeworICAgIHRyYW5zcG9ydC5yZWFkQWxsKF9pNjRJbiwgMCwgOCk7CisgICAgdmFyIGkgPSBuZXcgSW50NjQuZnJvbUJ5dGVzQmlnRW5kaWFuKF9pNjRJbik7CisgICAgcmV0dXJuIGkudG9JbnQoKTsKKyAgfQorCisgIGZpbmFsIFVpbnQ4TGlzdCBfZG91YmxlSW4gPSBuZXcgVWludDhMaXN0KDgpOworICBkb3VibGUgcmVhZERvdWJsZSgpIHsKKyAgICB0cmFuc3BvcnQucmVhZEFsbChfZG91YmxlSW4sIDAsIDgpOworICAgIHJldHVybiBfZG91YmxlSW4uYnVmZmVyLmFzQnl0ZURhdGEoKS5nZXRGbG9hdDY0KDApOworICB9CisKKyAgU3RyaW5nIHJlYWRTdHJpbmcoKSB7CisgICAgaW50IHNpemUgPSByZWFkSTMyKCk7CisgICAgcmV0dXJuIF9yZWFkU3RyaW5nKHNpemUpOworICB9CisKKyAgU3RyaW5nIF9yZWFkU3RyaW5nKGludCBzaXplKSB7CisgICAgVWludDhMaXN0IHN0cmluZ0luID0gbmV3IFVpbnQ4TGlzdChzaXplKTsKKyAgICB0cmFuc3BvcnQucmVhZEFsbChzdHJpbmdJbiwgMCwgc2l6ZSk7CisgICAgcmV0dXJuIF91dGY4Q29kZWMuZGVjb2RlKHN0cmluZ0luKTsKKyAgfQorCisgIFVpbnQ4TGlzdCByZWFkQmluYXJ5KCkgeworICAgIGludCBsZW5ndGggPSByZWFkSTMyKCk7CisgICAgVWludDhMaXN0IGJpbmFyeUluID0gbmV3IFVpbnQ4TGlzdChsZW5ndGgpOworICAgIHRyYW5zcG9ydC5yZWFkQWxsKGJpbmFyeUluLCAwLCBsZW5ndGgpOworICAgIHJldHVybiBiaW5hcnlJbjsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X2NvbXBhY3RfcHJvdG9jb2wuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9jb21wYWN0X3Byb3RvY29sLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJkNzY0MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9jb21wYWN0X3Byb3RvY29sLmRhcnQKQEAgLTAsMCArMSw0NzAgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAnTGljZW5zZScpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICdBUyBJUycgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworY2xhc3MgVENvbXBhY3RQcm90b2NvbEZhY3RvcnkgaW1wbGVtZW50cyBUUHJvdG9jb2xGYWN0b3J5PFRDb21wYWN0UHJvdG9jb2w+IHsKKyAgVENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKTsKKworICBUQ29tcGFjdFByb3RvY29sIGdldFByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnNwb3J0KSB7CisgICAgcmV0dXJuIG5ldyBUQ29tcGFjdFByb3RvY29sKHRyYW5zcG9ydCk7CisgIH0KK30KKworLy8vIENvbXBhY3QgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gZm9yIFRocmlmdC4KKy8vLworLy8vIFVzZSBvZiBmaXhudW0gbGlicmFyeSBpcyByZXF1aXJlZCBkdWUgdG8gYnVncyBsaWtlCisvLy8gaHR0cHM6Ly9naXRodWIuY29tL2RhcnQtbGFuZy9zZGsvaXNzdWVzLzE1MzYxCisvLy8KKy8vLyBBZGFwdGVkIGZyb20gdGhlIEphdmEgdmVyc2lvbi4KK2NsYXNzIFRDb21wYWN0UHJvdG9jb2wgZXh0ZW5kcyBUUHJvdG9jb2wgeworICBzdGF0aWMgY29uc3QgaW50IFBST1RPQ09MX0lEID0gMHg4MjsKKyAgc3RhdGljIGNvbnN0IGludCBWRVJTSU9OID0gMTsKKyAgc3RhdGljIGNvbnN0IGludCBWRVJTSU9OX01BU0sgPSAweDFmOworICBzdGF0aWMgY29uc3QgaW50IFRZUEVfTUFTSyA9IDB4RTA7CisgIHN0YXRpYyBjb25zdCBpbnQgVFlQRV9CSVRTID0gMHgwNzsKKyAgc3RhdGljIGNvbnN0IGludCBUWVBFX1NISUZUX0FNT1VOVCA9IDU7CisgIHN0YXRpYyBmaW5hbCBURmllbGQgVFNUT1AgPSBuZXcgVEZpZWxkKCIiLCBUVHlwZS5TVE9QLCAwKTsKKworICBzdGF0aWMgY29uc3QgaW50IFRZUEVfQk9PTEVBTl9UUlVFID0gMHgwMTsKKyAgc3RhdGljIGNvbnN0IGludCBUWVBFX0JPT0xFQU5fRkFMU0UgPSAweDAyOworICBzdGF0aWMgY29uc3QgaW50IFRZUEVfQllURSA9IDB4MDM7CisgIHN0YXRpYyBjb25zdCBpbnQgVFlQRV9JMTYgPSAweDA0OworICBzdGF0aWMgY29uc3QgaW50IFRZUEVfSTMyID0gMHgwNTsKKyAgc3RhdGljIGNvbnN0IGludCBUWVBFX0k2NCA9IDB4MDY7CisgIHN0YXRpYyBjb25zdCBpbnQgVFlQRV9ET1VCTEUgPSAweDA3OworICBzdGF0aWMgY29uc3QgaW50IFRZUEVfQklOQVJZID0gMHgwODsKKyAgc3RhdGljIGNvbnN0IGludCBUWVBFX0xJU1QgPSAweDA5OworICBzdGF0aWMgY29uc3QgaW50IFRZUEVfU0VUID0gMHgwQTsKKyAgc3RhdGljIGNvbnN0IGludCBUWVBFX01BUCA9IDB4MEI7CisgIHN0YXRpYyBjb25zdCBpbnQgVFlQRV9TVFJVQ1QgPSAweDBDOworCisgIHN0YXRpYyBmaW5hbCBMaXN0PGludD4gX3R5cGVNYXAgPSBuZXcgTGlzdC51bm1vZGlmaWFibGUobmV3IExpc3QoMTYpCisgICAgLi5bVFR5cGUuU1RPUF0gPSBUVHlwZS5TVE9QCisgICAgLi5bVFR5cGUuQk9PTF0gPSBUWVBFX0JPT0xFQU5fVFJVRQorICAgIC4uW1RUeXBlLkJZVEVdID0gVFlQRV9CWVRFCisgICAgLi5bVFR5cGUuSTE2XSA9IFRZUEVfSTE2CisgICAgLi5bVFR5cGUuSTMyXSA9IFRZUEVfSTMyCisgICAgLi5bVFR5cGUuSTY0XSA9IFRZUEVfSTY0CisgICAgLi5bVFR5cGUuRE9VQkxFXSA9IFRZUEVfRE9VQkxFCisgICAgLi5bVFR5cGUuU1RSSU5HXSA9IFRZUEVfQklOQVJZCisgICAgLi5bVFR5cGUuTElTVF0gPSBUWVBFX0xJU1QKKyAgICAuLltUVHlwZS5TRVRdID0gVFlQRV9TRVQKKyAgICAuLltUVHlwZS5NQVBdID0gVFlQRV9NQVAKKyAgICAuLltUVHlwZS5TVFJVQ1RdID0gVFlQRV9TVFJVQ1QpOworCisgIHN0YXRpYyBjb25zdCBVdGY4Q29kZWMgX3V0ZjhDb2RlYyA9IGNvbnN0IFV0ZjhDb2RlYygpOworCisgIC8vIFByZXRlbmQgdGhpcyBpcyBhIHN0YWNrCisgIERvdWJsZUxpbmtlZFF1ZXVlPGludD4gX2xhc3RGaWVsZCA9IG5ldyBEb3VibGVMaW5rZWRRdWV1ZTxpbnQ+KCk7CisgIGludCBfbGFzdEZpZWxkSWQgPSAwOworCisgIFRGaWVsZCBfYm9vbGVhbkZpZWxkID0gbnVsbDsKKyAgYm9vbCBfYm9vbFZhbHVlID0gbnVsbDsKKworICBmaW5hbCBVaW50OExpc3QgdGVtcExpc3QgPSBuZXcgVWludDhMaXN0KDEwKTsKKyAgZmluYWwgQnl0ZURhdGEgdGVtcEJEID0gbmV3IEJ5dGVEYXRhKDEwKTsKKworICBUQ29tcGFjdFByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnNwb3J0KSA6IHN1cGVyKHRyYW5zcG9ydCk7CisKKyAgLy8vIFdyaXRlCisgIHZvaWQgd3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UgbWVzc2FnZSkgeworICAgIHdyaXRlQnl0ZShQUk9UT0NPTF9JRCk7CisgICAgd3JpdGVCeXRlKChWRVJTSU9OICYgVkVSU0lPTl9NQVNLKSB8CisgICAgICAgICgobWVzc2FnZS50eXBlIDw8IFRZUEVfU0hJRlRfQU1PVU5UKSAmIFRZUEVfTUFTSykpOworICAgIF93cml0ZVZhckludDMyKG5ldyBJbnQzMihtZXNzYWdlLnNlcWlkKSk7CisgICAgd3JpdGVTdHJpbmcobWVzc2FnZS5uYW1lKTsKKyAgfQorCisgIHZvaWQgd3JpdGVNZXNzYWdlRW5kKCkge30KKworICB2b2lkIHdyaXRlU3RydWN0QmVnaW4oVFN0cnVjdCBzdHJ1Y3QpIHsKKyAgICBfbGFzdEZpZWxkLmFkZExhc3QoX2xhc3RGaWVsZElkKTsKKyAgICBfbGFzdEZpZWxkSWQgPSAwOworICB9CisKKyAgdm9pZCB3cml0ZVN0cnVjdEVuZCgpIHsKKyAgICBfbGFzdEZpZWxkSWQgPSBfbGFzdEZpZWxkLnJlbW92ZUxhc3QoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVGaWVsZEJlZ2luKFRGaWVsZCBmaWVsZCkgeworICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLkJPT0wpIHsKKyAgICAgIF9ib29sZWFuRmllbGQgPSBmaWVsZDsKKyAgICB9IGVsc2UgeworICAgICAgX3dyaXRlRmllbGRCZWdpbihmaWVsZCwgLTEpOworICAgIH0KKyAgfQorCisgIHZvaWQgX3dyaXRlRmllbGRCZWdpbihURmllbGQgZmllbGQsIGludCB0eXBlT3ZlcnJpZGUpIHsKKyAgICBpbnQgdHlwZVRvV3JpdGUgPQorICAgICAgICB0eXBlT3ZlcnJpZGUgPT0gLTEgPyBfZ2V0Q29tcGFjdFR5cGUoZmllbGQudHlwZSkgOiB0eXBlT3ZlcnJpZGU7CisKKyAgICBpZiAoZmllbGQuaWQgPiBfbGFzdEZpZWxkSWQgJiYgZmllbGQuaWQgLSBfbGFzdEZpZWxkSWQgPD0gMTUpIHsKKyAgICAgIHdyaXRlQnl0ZSgoZmllbGQuaWQgLSBfbGFzdEZpZWxkSWQpIDw8IDQgfCB0eXBlVG9Xcml0ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHdyaXRlQnl0ZSh0eXBlVG9Xcml0ZSk7CisgICAgICB3cml0ZUkxNihmaWVsZC5pZCk7CisgICAgfQorCisgICAgX2xhc3RGaWVsZElkID0gZmllbGQuaWQ7CisgIH0KKworICB2b2lkIHdyaXRlRmllbGRFbmQoKSB7fQorCisgIHZvaWQgd3JpdGVGaWVsZFN0b3AoKSB7CisgICAgd3JpdGVCeXRlKFRUeXBlLlNUT1ApOworICB9CisKKyAgdm9pZCB3cml0ZU1hcEJlZ2luKFRNYXAgbWFwKSB7CisgICAgaWYgKG1hcC5sZW5ndGggPT0gMCkgeworICAgICAgd3JpdGVCeXRlKDApOworICAgIH0gZWxzZSB7CisgICAgICBfd3JpdGVWYXJJbnQzMihuZXcgSW50MzIobWFwLmxlbmd0aCkpOworICAgICAgd3JpdGVCeXRlKAorICAgICAgICAgIF9nZXRDb21wYWN0VHlwZShtYXAua2V5VHlwZSkgPDwgNCB8IF9nZXRDb21wYWN0VHlwZShtYXAudmFsdWVUeXBlKSk7CisgICAgfQorICB9CisKKyAgdm9pZCB3cml0ZU1hcEVuZCgpIHt9CisKKyAgdm9pZCB3cml0ZUxpc3RCZWdpbihUTGlzdCBsaXN0KSB7CisgICAgX3dyaXRlQ29sbGVjdGlvbkJlZ2luKGxpc3QuZWxlbWVudFR5cGUsIGxpc3QubGVuZ3RoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVMaXN0RW5kKCkge30KKworICB2b2lkIHdyaXRlU2V0QmVnaW4oVFNldCBzZXQpIHsKKyAgICBfd3JpdGVDb2xsZWN0aW9uQmVnaW4oc2V0LmVsZW1lbnRUeXBlLCBzZXQubGVuZ3RoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVTZXRFbmQoKSB7fQorCisgIHZvaWQgd3JpdGVCb29sKGJvb2wgYikgeworICAgIGlmIChiID09IG51bGwpIGIgPSBmYWxzZTsKKyAgICBpZiAoX2Jvb2xlYW5GaWVsZCAhPSBudWxsKSB7CisgICAgICBfd3JpdGVGaWVsZEJlZ2luKAorICAgICAgICAgIF9ib29sZWFuRmllbGQsIGIgPyBUWVBFX0JPT0xFQU5fVFJVRSA6IFRZUEVfQk9PTEVBTl9GQUxTRSk7CisgICAgICBfYm9vbGVhbkZpZWxkID0gbnVsbDsKKyAgICB9IGVsc2UgeworICAgICAgd3JpdGVCeXRlKGIgPyBUWVBFX0JPT0xFQU5fVFJVRSA6IFRZUEVfQk9PTEVBTl9GQUxTRSk7CisgICAgfQorICB9CisKKyAgdm9pZCB3cml0ZUJ5dGUoaW50IGIpIHsKKyAgICBpZiAoYiA9PSBudWxsKSBiID0gMDsKKyAgICB0ZW1wTGlzdFswXSA9IGI7CisgICAgdHJhbnNwb3J0LndyaXRlKHRlbXBMaXN0LCAwLCAxKTsKKyAgfQorCisgIHZvaWQgd3JpdGVJMTYoaW50IGkxNikgeworICAgIGlmIChpMTYgPT0gbnVsbCkgaTE2ID0gMDsKKyAgICBfd3JpdGVWYXJJbnQzMihfaW50MzJUb1ppZ1phZyhuZXcgSW50MzIoaTE2KSkpOworICB9CisKKyAgdm9pZCB3cml0ZUkzMihpbnQgaTMyKSB7CisgICAgaWYgKGkzMiA9PSBudWxsKSBpMzIgPSAwOworICAgIF93cml0ZVZhckludDMyKF9pbnQzMlRvWmlnWmFnKG5ldyBJbnQzMihpMzIpKSk7CisgIH0KKworICB2b2lkIHdyaXRlSTY0KGludCBpNjQpIHsKKyAgICBpZiAoaTY0ID09IG51bGwpIGk2NCA9IDA7CisgICAgX3dyaXRlVmFySW50NjQoX2ludDY0VG9aaWdaYWcobmV3IEludDY0KGk2NCkpKTsKKyAgfQorCisgIHZvaWQgd3JpdGVEb3VibGUoZG91YmxlIGQpIHsKKyAgICBpZiAoZCA9PSBudWxsKSBkID0gMC4wOworICAgIHRlbXBCRC5zZXRGbG9hdDY0KDAsIGQsIEVuZGlhbm5lc3MuTElUVExFX0VORElBTik7CisgICAgdHJhbnNwb3J0LndyaXRlKHRlbXBCRC5idWZmZXIuYXNVaW50OExpc3QoKSwgMCwgOCk7CisgIH0KKworICB2b2lkIHdyaXRlU3RyaW5nKFN0cmluZyBzdHIpIHsKKyAgICBVaW50OExpc3QgYnl0ZXMgPQorICAgICAgICBzdHIgIT0gbnVsbCA/IF91dGY4Q29kZWMuZW5jb2RlKHN0cikgOiBuZXcgVWludDhMaXN0LmZyb21MaXN0KFtdKTsKKyAgICB3cml0ZUJpbmFyeShieXRlcyk7CisgIH0KKworICB2b2lkIHdyaXRlQmluYXJ5KFVpbnQ4TGlzdCBieXRlcykgeworICAgIF93cml0ZVZhckludDMyKG5ldyBJbnQzMihieXRlcy5sZW5ndGgpKTsKKyAgICB0cmFuc3BvcnQud3JpdGUoYnl0ZXMsIDAsIGJ5dGVzLmxlbmd0aCk7CisgIH0KKworICB2b2lkIF93cml0ZVZhckludDMyKEludDMyIG4pIHsKKyAgICBpbnQgaWR4ID0gMDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgaWYgKChuICYgfjB4N0YpID09IDApIHsKKyAgICAgICAgdGVtcExpc3RbaWR4KytdID0gKG4gJiAweEZGKS50b0ludCgpOworICAgICAgICBicmVhazsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRlbXBMaXN0W2lkeCsrXSA9ICgoKG4gJiAweDdGKSB8IDB4ODApICYgMHhGRikudG9JbnQoKTsKKyAgICAgICAgbiA9IG4uc2hpZnRSaWdodFVuc2lnbmVkKDcpOworICAgICAgfQorICAgIH0KKyAgICB0cmFuc3BvcnQud3JpdGUodGVtcExpc3QsIDAsIGlkeCk7CisgIH0KKworICB2b2lkIF93cml0ZVZhckludDY0KEludDY0IG4pIHsKKyAgICBpbnQgaWR4ID0gMDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgaWYgKChuICYgfjB4N0YpID09IDApIHsKKyAgICAgICAgdGVtcExpc3RbaWR4KytdID0gKG4gJiAweEZGKS50b0ludCgpOworICAgICAgICBicmVhazsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRlbXBMaXN0W2lkeCsrXSA9ICgoKG4gJiAweDdGKSB8IDB4ODApICYgMHhGRikudG9JbnQoKTsKKyAgICAgICAgbiA9IG4uc2hpZnRSaWdodFVuc2lnbmVkKDcpOworICAgICAgfQorICAgIH0KKyAgICB0cmFuc3BvcnQud3JpdGUodGVtcExpc3QsIDAsIGlkeCk7CisgIH0KKworICB2b2lkIF93cml0ZUNvbGxlY3Rpb25CZWdpbihpbnQgZWxlbVR5cGUsIGludCBsZW5ndGgpIHsKKyAgICBpZiAobGVuZ3RoIDw9IDE0KSB7CisgICAgICB3cml0ZUJ5dGUobGVuZ3RoIDw8IDQgfCBfZ2V0Q29tcGFjdFR5cGUoZWxlbVR5cGUpKTsKKyAgICB9IGVsc2UgeworICAgICAgd3JpdGVCeXRlKDB4RjAgfCBfZ2V0Q29tcGFjdFR5cGUoZWxlbVR5cGUpKTsKKyAgICAgIF93cml0ZVZhckludDMyKG5ldyBJbnQzMihsZW5ndGgpKTsKKyAgICB9CisgIH0KKworICBJbnQzMiBfaW50MzJUb1ppZ1phZyhJbnQzMiBuKSB7CisgICAgcmV0dXJuIChuIDw8IDEpIF4gKG4gPj4gMzEpOworICB9CisKKyAgSW50NjQgX2ludDY0VG9aaWdaYWcoSW50NjQgbikgeworICAgIHJldHVybiAobiA8PCAxKSBeIChuID4+IDYzKTsKKyAgfQorCisgIC8vLyBSZWFkCisgIFRNZXNzYWdlIHJlYWRNZXNzYWdlQmVnaW4oKSB7CisgICAgaW50IHByb3RvY29sSWQgPSByZWFkQnl0ZSgpOworICAgIGlmIChwcm90b2NvbElkICE9IFBST1RPQ09MX0lEKSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoVFByb3RvY29sRXJyb3JUeXBlLkJBRF9WRVJTSU9OLAorICAgICAgICAgICdFeHBlY3RlZCBwcm90b2NvbCBpZCAkUFJPVE9DT0xfSUQgYnV0IGdvdCAkcHJvdG9jb2xJZCcpOworICAgIH0KKyAgICBpbnQgdmVyc2lvbkFuZFR5cGUgPSByZWFkQnl0ZSgpOworICAgIGludCB2ZXJzaW9uID0gdmVyc2lvbkFuZFR5cGUgJiBWRVJTSU9OX01BU0s7CisgICAgaWYgKHZlcnNpb24gIT0gVkVSU0lPTikgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKFRQcm90b2NvbEVycm9yVHlwZS5CQURfVkVSU0lPTiwKKyAgICAgICAgICAnRXhwZWN0ZWQgdmVyc2lvbiAkVkVSU0lPTiBidXQgZ290ICR2ZXJzaW9uJyk7CisgICAgfQorICAgIGludCB0eXBlID0gKHZlcnNpb25BbmRUeXBlID4+IFRZUEVfU0hJRlRfQU1PVU5UKSAmIFRZUEVfQklUUzsKKyAgICBpbnQgc2VxSWQgPSBfcmVhZFZhckludDMyKCkudG9JbnQoKTsKKyAgICBTdHJpbmcgbWVzc2FnZU5hbWUgPSByZWFkU3RyaW5nKCk7CisgICAgcmV0dXJuIG5ldyBUTWVzc2FnZShtZXNzYWdlTmFtZSwgdHlwZSwgc2VxSWQpOworICB9CisKKyAgdm9pZCByZWFkTWVzc2FnZUVuZCgpIHt9CisKKyAgVFN0cnVjdCByZWFkU3RydWN0QmVnaW4oKSB7CisgICAgX2xhc3RGaWVsZC5hZGRMYXN0KF9sYXN0RmllbGRJZCk7CisgICAgX2xhc3RGaWVsZElkID0gMDsKKyAgICAvLyBUT0RPIG1ha2UgdGhpcyBhIGNvbnN0YW50PworICAgIHJldHVybiBuZXcgVFN0cnVjdCgpOworICB9CisKKyAgdm9pZCByZWFkU3RydWN0RW5kKCkgeworICAgIF9sYXN0RmllbGRJZCA9IF9sYXN0RmllbGQucmVtb3ZlTGFzdCgpOworICB9CisKKyAgVEZpZWxkIHJlYWRGaWVsZEJlZ2luKCkgeworICAgIGludCB0eXBlID0gcmVhZEJ5dGUoKTsKKyAgICBpZiAodHlwZSA9PSBUVHlwZS5TVE9QKSB7CisgICAgICByZXR1cm4gVFNUT1A7CisgICAgfQorCisgICAgaW50IGZpZWxkSWQ7CisgICAgaW50IG1vZGlmaWVyID0gKHR5cGUgJiAweEYwKSA+PiA0OworICAgIGlmIChtb2RpZmllciA9PSAwKSB7CisgICAgICBmaWVsZElkID0gcmVhZEkxNigpOworICAgIH0gZWxzZSB7CisgICAgICBmaWVsZElkID0gX2xhc3RGaWVsZElkICsgbW9kaWZpZXI7CisgICAgfQorCisgICAgVEZpZWxkIGZpZWxkID0gbmV3IFRGaWVsZCgnJywgX2dldFRUeXBlKHR5cGUgJiAweDBGKSwgZmllbGRJZCk7CisgICAgaWYgKF9pc0Jvb2xUeXBlKHR5cGUpKSB7CisgICAgICBfYm9vbFZhbHVlID0gKHR5cGUgJiAweDBGKSA9PSBUWVBFX0JPT0xFQU5fVFJVRTsKKyAgICB9CisKKyAgICBfbGFzdEZpZWxkSWQgPSBmaWVsZC5pZDsKKyAgICByZXR1cm4gZmllbGQ7CisgIH0KKworICB2b2lkIHJlYWRGaWVsZEVuZCgpIHt9CisKKyAgVE1hcCByZWFkTWFwQmVnaW4oKSB7CisgICAgaW50IGxlbmd0aCA9IF9yZWFkVmFySW50MzIoKS50b0ludCgpOworICAgIF9jaGVja05lZ1JlYWRMZW5ndGgobGVuZ3RoKTsKKworICAgIGludCBrZXlBbmRWYWx1ZVR5cGUgPSBsZW5ndGggPT0gMCA/IDAgOiByZWFkQnl0ZSgpOworICAgIGludCBrZXlUeXBlID0gX2dldFRUeXBlKGtleUFuZFZhbHVlVHlwZSA+PiA0KTsKKyAgICBpbnQgdmFsdWVUeXBlID0gX2dldFRUeXBlKGtleUFuZFZhbHVlVHlwZSAmIDB4MEYpOworICAgIHJldHVybiBuZXcgVE1hcChrZXlUeXBlLCB2YWx1ZVR5cGUsIGxlbmd0aCk7CisgIH0KKworICB2b2lkIHJlYWRNYXBFbmQoKSB7fQorCisgIFRMaXN0IHJlYWRMaXN0QmVnaW4oKSB7CisgICAgaW50IGxlbmd0aEFuZFR5cGUgPSByZWFkQnl0ZSgpOworICAgIGludCBsZW5ndGggPSAobGVuZ3RoQW5kVHlwZSA+PiA0KSAmIDB4MEY7CisgICAgaWYgKGxlbmd0aCA9PSAxNSkgeworICAgICAgbGVuZ3RoID0gX3JlYWRWYXJJbnQzMigpLnRvSW50KCk7CisgICAgfQorICAgIF9jaGVja05lZ1JlYWRMZW5ndGgobGVuZ3RoKTsKKyAgICBpbnQgdHlwZSA9IF9nZXRUVHlwZShsZW5ndGhBbmRUeXBlKTsKKyAgICByZXR1cm4gbmV3IFRMaXN0KHR5cGUsIGxlbmd0aCk7CisgIH0KKworICB2b2lkIHJlYWRMaXN0RW5kKCkge30KKworICBUU2V0IHJlYWRTZXRCZWdpbigpIHsKKyAgICBUTGlzdCB0bGlzdCA9IHJlYWRMaXN0QmVnaW4oKTsKKyAgICByZXR1cm4gbmV3IFRTZXQodGxpc3QuZWxlbWVudFR5cGUsIHRsaXN0Lmxlbmd0aCk7CisgIH0KKworICB2b2lkIHJlYWRTZXRFbmQoKSB7fQorCisgIGJvb2wgcmVhZEJvb2woKSB7CisgICAgaWYgKF9ib29sVmFsdWUgIT0gbnVsbCkgeworICAgICAgYm9vbCByZXN1bHQgPSBfYm9vbFZhbHVlOworICAgICAgX2Jvb2xWYWx1ZSA9IG51bGw7CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICByZXR1cm4gcmVhZEJ5dGUoKSA9PSBUWVBFX0JPT0xFQU5fVFJVRTsKKyAgfQorCisgIGludCByZWFkQnl0ZSgpIHsKKyAgICB0cmFuc3BvcnQucmVhZEFsbCh0ZW1wTGlzdCwgMCwgMSk7CisgICAgcmV0dXJuIHRlbXBMaXN0LmJ1ZmZlci5hc0J5dGVEYXRhKCkuZ2V0VWludDgoMCk7CisgIH0KKworICBpbnQgcmVhZEkxNigpIHsKKyAgICByZXR1cm4gX3ppZ3phZ1RvSW50MzIoX3JlYWRWYXJJbnQzMigpKS50b0ludCgpOworICB9CisKKyAgaW50IHJlYWRJMzIoKSB7CisgICAgcmV0dXJuIF96aWd6YWdUb0ludDMyKF9yZWFkVmFySW50MzIoKSkudG9JbnQoKTsKKyAgfQorCisgIGludCByZWFkSTY0KCkgeworICAgIHJldHVybiBfemlnemFnVG9JbnQ2NChfcmVhZFZhckludDY0KCkpLnRvSW50KCk7CisgIH0KKworICBkb3VibGUgcmVhZERvdWJsZSgpIHsKKyAgICB0cmFuc3BvcnQucmVhZEFsbCh0ZW1wTGlzdCwgMCwgOCk7CisgICAgcmV0dXJuIHRlbXBMaXN0LmJ1ZmZlci5hc0J5dGVEYXRhKCkuZ2V0RmxvYXQ2NCgwLCBFbmRpYW5uZXNzLkxJVFRMRV9FTkRJQU4pOworICB9CisKKyAgU3RyaW5nIHJlYWRTdHJpbmcoKSB7CisgICAgaW50IGxlbmd0aCA9IF9yZWFkVmFySW50MzIoKS50b0ludCgpOworICAgIF9jaGVja05lZ1JlYWRMZW5ndGgobGVuZ3RoKTsKKworICAgIC8vIFRPRE8gbG9vayBhdCB1c2luZyB0ZW1wIGZvciBzbWFsbCBzdHJpbmdzPworICAgIFVpbnQ4TGlzdCBidWZmID0gbmV3IFVpbnQ4TGlzdChsZW5ndGgpOworICAgIHRyYW5zcG9ydC5yZWFkQWxsKGJ1ZmYsIDAsIGxlbmd0aCk7CisgICAgcmV0dXJuIF91dGY4Q29kZWMuZGVjb2RlKGJ1ZmYpOworICB9CisKKyAgVWludDhMaXN0IHJlYWRCaW5hcnkoKSB7CisgICAgaW50IGxlbmd0aCA9IF9yZWFkVmFySW50MzIoKS50b0ludCgpOworICAgIF9jaGVja05lZ1JlYWRMZW5ndGgobGVuZ3RoKTsKKworICAgIFVpbnQ4TGlzdCBidWZmID0gbmV3IFVpbnQ4TGlzdChsZW5ndGgpOworICAgIHRyYW5zcG9ydC5yZWFkQWxsKGJ1ZmYsIDAsIGxlbmd0aCk7CisgICAgcmV0dXJuIGJ1ZmY7CisgIH0KKworICBJbnQzMiBfcmVhZFZhckludDMyKCkgeworICAgIEludDMyIHJlc3VsdCA9IEludDMyLlpFUk87CisgICAgaW50IHNoaWZ0ID0gMDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgSW50MzIgYiA9IG5ldyBJbnQzMihyZWFkQnl0ZSgpKTsKKyAgICAgIHJlc3VsdCB8PSAoYiAmIDB4N2YpIDw8IHNoaWZ0OworICAgICAgaWYgKChiICYgMHg4MCkgIT0gMHg4MCkgYnJlYWs7CisgICAgICBzaGlmdCArPSA3OworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgSW50NjQgX3JlYWRWYXJJbnQ2NCgpIHsKKyAgICBJbnQ2NCByZXN1bHQgPSBJbnQ2NC5aRVJPOworICAgIGludCBzaGlmdCA9IDA7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIEludDY0IGIgPSBuZXcgSW50NjQocmVhZEJ5dGUoKSk7CisgICAgICByZXN1bHQgfD0gKGIgJiAweDdmKSA8PCBzaGlmdDsKKyAgICAgIGlmICgoYiAmIDB4ODApICE9IDB4ODApIGJyZWFrOworICAgICAgc2hpZnQgKz0gNzsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIEludDMyIF96aWd6YWdUb0ludDMyKEludDMyIG4pIHsKKyAgICByZXR1cm4gKG4uc2hpZnRSaWdodFVuc2lnbmVkKDEpKSBeIC0obiAmIDEpOworICB9CisKKyAgSW50NjQgX3ppZ3phZ1RvSW50NjQoSW50NjQgbikgeworICAgIHJldHVybiAobi5zaGlmdFJpZ2h0VW5zaWduZWQoMSkpIF4gLShuICYgMSk7CisgIH0KKworICB2b2lkIF9jaGVja05lZ1JlYWRMZW5ndGgoaW50IGxlbmd0aCkgeworICAgIGlmIChsZW5ndGggPCAwKSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoCisgICAgICAgICAgVFByb3RvY29sRXJyb3JUeXBlLk5FR0FUSVZFX1NJWkUsICdOZWdhdGl2ZSBsZW5ndGg6ICRsZW5ndGgnKTsKKyAgICB9CisgIH0KKworICBpbnQgX2dldENvbXBhY3RUeXBlKGludCB0dHlwZSkgeworICAgIHJldHVybiBfdHlwZU1hcFt0dHlwZV07CisgIH0KKworICBpbnQgX2dldFRUeXBlKGludCB0eXBlKSB7CisgICAgc3dpdGNoICh0eXBlICYgMHgwRikgeworICAgICAgY2FzZSBUVHlwZS5TVE9QOgorICAgICAgICByZXR1cm4gVFR5cGUuU1RPUDsKKyAgICAgIGNhc2UgVFlQRV9CT09MRUFOX0ZBTFNFOgorICAgICAgY2FzZSBUWVBFX0JPT0xFQU5fVFJVRToKKyAgICAgICAgcmV0dXJuIFRUeXBlLkJPT0w7CisgICAgICBjYXNlIFRZUEVfQllURToKKyAgICAgICAgcmV0dXJuIFRUeXBlLkJZVEU7CisgICAgICBjYXNlIFRZUEVfSTE2OgorICAgICAgICByZXR1cm4gVFR5cGUuSTE2OworICAgICAgY2FzZSBUWVBFX0kzMjoKKyAgICAgICAgcmV0dXJuIFRUeXBlLkkzMjsKKyAgICAgIGNhc2UgVFlQRV9JNjQ6CisgICAgICAgIHJldHVybiBUVHlwZS5JNjQ7CisgICAgICBjYXNlIFRZUEVfRE9VQkxFOgorICAgICAgICByZXR1cm4gVFR5cGUuRE9VQkxFOworICAgICAgY2FzZSBUWVBFX0JJTkFSWToKKyAgICAgICAgcmV0dXJuIFRUeXBlLlNUUklORzsKKyAgICAgIGNhc2UgVFlQRV9MSVNUOgorICAgICAgICByZXR1cm4gVFR5cGUuTElTVDsKKyAgICAgIGNhc2UgVFlQRV9TRVQ6CisgICAgICAgIHJldHVybiBUVHlwZS5TRVQ7CisgICAgICBjYXNlIFRZUEVfTUFQOgorICAgICAgICByZXR1cm4gVFR5cGUuTUFQOworICAgICAgY2FzZSBUWVBFX1NUUlVDVDoKKyAgICAgICAgcmV0dXJuIFRUeXBlLlNUUlVDVDsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFcnJvcigKKyAgICAgICAgICAgIFRQcm90b2NvbEVycm9yVHlwZS5JTlZBTElEX0RBVEEsICJVbmtub3duIHR5cGU6ICR7dHlwZSAmIDB4MEZ9Iik7CisgICAgfQorICB9CisKKyAgYm9vbCBfaXNCb29sVHlwZShpbnQgYikgeworICAgIGludCBsb3dlck5pYmJsZSA9IGIgJiAweDBGOworICAgIHJldHVybiBsb3dlck5pYmJsZSA9PSBUWVBFX0JPT0xFQU5fVFJVRSB8fAorICAgICAgICBsb3dlck5pYmJsZSA9PSBUWVBFX0JPT0xFQU5fRkFMU0U7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9maWVsZC5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X2ZpZWxkLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ0YjRlNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9maWVsZC5kYXJ0CkBAIC0wLDAgKzEsMjYgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworY2xhc3MgVEZpZWxkIHsKKyAgZmluYWwgU3RyaW5nIG5hbWU7CisgIGZpbmFsIGludCB0eXBlOworICBmaW5hbCBpbnQgaWQ7CisKKyAgVEZpZWxkKHRoaXMubmFtZSwgdGhpcy50eXBlLCB0aGlzLmlkKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9qc29uX3Byb3RvY29sLmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfanNvbl9wcm90b2NvbC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYmI3YzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfanNvbl9wcm90b2NvbC5kYXJ0CkBAIC0wLDAgKzEsNzg0IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKK2NsYXNzIFRKc29uUHJvdG9jb2xGYWN0b3J5IGltcGxlbWVudHMgVFByb3RvY29sRmFjdG9yeTxUSnNvblByb3RvY29sPiB7CisgIFRKc29uUHJvdG9jb2wgZ2V0UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFuc3BvcnQpIHsKKyAgICByZXR1cm4gbmV3IFRKc29uUHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgfQorfQorCisvLy8gSlNPTiBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBmb3IgVGhyaWZ0LgorLy8vCisvLy8gQWRhcHRlZCBmcm9tIHRoZSBDIyB2ZXJzaW9uLgorY2xhc3MgVEpzb25Qcm90b2NvbCBleHRlbmRzIFRQcm90b2NvbCB7CisgIHN0YXRpYyBjb25zdCBpbnQgVkVSU0lPTl8xID0gMTsKKworICBzdGF0aWMgY29uc3QgVXRmOENvZGVjIHV0ZjhDb2RlYyA9IGNvbnN0IFV0ZjhDb2RlYygpOworCisgIF9CYXNlQ29udGV4dCBfY29udGV4dDsKKyAgX0Jhc2VDb250ZXh0IF9yb290Q29udGV4dDsKKyAgX0xvb2thaGVhZFJlYWRlciBfcmVhZGVyOworCisgIGZpbmFsIExpc3Q8X0Jhc2VDb250ZXh0PiBfY29udGV4dFN0YWNrID0gW107CisgIGZpbmFsIFVpbnQ4TGlzdCBfdGVtcEJ1ZmZlciA9IG5ldyBVaW50OExpc3QoNCk7CisKKyAgVEpzb25Qcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zcG9ydCkgOiBzdXBlcih0cmFuc3BvcnQpIHsKKyAgICBfcm9vdENvbnRleHQgPSBuZXcgX0Jhc2VDb250ZXh0KHRoaXMpOworICAgIF9yZWFkZXIgPSBuZXcgX0xvb2thaGVhZFJlYWRlcih0aGlzKTsKKyAgICBfcmVzZXRDb250ZXh0KCk7CisgIH0KKworICB2b2lkIF9wdXNoQ29udGV4dChfQmFzZUNvbnRleHQgYykgeworICAgIF9jb250ZXh0U3RhY2suYWRkKGMpOworICAgIF9jb250ZXh0ID0gYzsKKyAgfQorCisgIHZvaWQgX3BvcENvbnRleHQoKSB7CisgICAgX2NvbnRleHRTdGFjay5yZW1vdmVMYXN0KCk7CisgICAgX2NvbnRleHQgPSBfY29udGV4dFN0YWNrLmlzRW1wdHkgPyBfcm9vdENvbnRleHQgOiBfY29udGV4dFN0YWNrLmxhc3Q7CisgIH0KKworICB2b2lkIF9yZXNldENvbnRleHQoKSB7CisgICAgX2NvbnRleHRTdGFjay5jbGVhcigpOworICAgIF9jb250ZXh0ID0gX3Jvb3RDb250ZXh0OworICB9CisKKyAgLy8vIFJlYWQgYSBieXRlIHRoYXQgbXVzdCBtYXRjaCBbY2hhcl07IG90aGVyd2lzZSB0aHJvdyBhIFtUUHJvdG9jb2xFcnJvcl0uCisgIHZvaWQgX3JlYWRKc29uU3ludGF4Q2hhcihpbnQgY2hhckJ5dGUpIHsKKyAgICBpbnQgYnl0ZSA9IF9yZWFkZXIucmVhZCgpOworICAgIGlmIChieXRlICE9IGNoYXJCeXRlKSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoVFByb3RvY29sRXJyb3JUeXBlLklOVkFMSURfREFUQSwKKyAgICAgICAgICAiRXhwZWN0ZWQgY2hhcmFjdGVyICR7bmV3IFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhckJ5dGUpfSBidXQgZm91bmQ6ICR7bmV3IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZSl9Iik7CisgICAgfQorICB9CisKKyAgaW50IF9oZXhWYWwoaW50IGJ5dGUpIHsKKyAgICBpZiAoYnl0ZSA+PSBfQ29uc3RhbnRzLkhFWF8wX0JZVEVTWzBdICYmCisgICAgICAgIGJ5dGUgPD0gX0NvbnN0YW50cy5IRVhfOV9CWVRFU1swXSkgeworICAgICAgcmV0dXJuIGJ5dGUgLSBfQ29uc3RhbnRzLkhFWF8wX0JZVEVTWzBdOworICAgIH0gZWxzZSBpZiAoYnl0ZSA+PSBfQ29uc3RhbnRzLkhFWF9BX0JZVEVTWzBdICYmCisgICAgICAgIGJ5dGUgPD0gX0NvbnN0YW50cy5IRVhfRl9CWVRFU1swXSkgeworICAgICAgYnl0ZSArPSAxMDsKKyAgICAgIHJldHVybiBieXRlIC0gX0NvbnN0YW50cy5IRVhfQV9CWVRFU1swXTsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKAorICAgICAgICAgIFRQcm90b2NvbEVycm9yVHlwZS5JTlZBTElEX0RBVEEsICJFeHBlY3RlZCBoZXggY2hhcmFjdGVyIik7CisgICAgfQorICB9CisKKyAgaW50IF9oZXhDaGFyKGludCBieXRlKSA9PiBieXRlLnRvUmFkaXhTdHJpbmcoMTYpLmNvZGVVbml0QXQoMCk7CisKKyAgLy8vIHdyaXRlCisKKyAgLy8vIFdyaXRlIHRoZSBbYnl0ZXNdIGFzIEpTT04gY2hhcmFjdGVycywgZXNjYXBpbmcgYXMgbmVlZGVkLgorICB2b2lkIF93cml0ZUpzb25TdHJpbmcoVWludDhMaXN0IGJ5dGVzKSB7CisgICAgX2NvbnRleHQud3JpdGUoKTsKKyAgICB0cmFuc3BvcnQud3JpdGVBbGwoX0NvbnN0YW50cy5RVU9URV9CWVRFUyk7CisKKyAgICBpbnQgbGVuZ3RoID0gYnl0ZXMubGVuZ3RoOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgIGludCBieXRlID0gYnl0ZXNbaV07CisgICAgICBpZiAoKGJ5dGUgJiAweDAwRkYpID49IDB4MzApIHsKKyAgICAgICAgaWYgKGJ5dGUgPT0gX0NvbnN0YW50cy5CQUNLU0xBU0hfQllURVNbMF0pIHsKKyAgICAgICAgICB0cmFuc3BvcnQud3JpdGVBbGwoX0NvbnN0YW50cy5CQUNLU0xBU0hfQllURVMpOworICAgICAgICAgIHRyYW5zcG9ydC53cml0ZUFsbChfQ29uc3RhbnRzLkJBQ0tTTEFTSF9CWVRFUyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdHJhbnNwb3J0LndyaXRlKGJ5dGVzLCBpLCAxKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgX3RlbXBCdWZmZXJbMF0gPSBfQ29uc3RhbnRzLkpTT05fQ0hBUl9UQUJMRVtieXRlXTsKKyAgICAgICAgaWYgKF90ZW1wQnVmZmVyWzBdID09IDEpIHsKKyAgICAgICAgICB0cmFuc3BvcnQud3JpdGUoYnl0ZXMsIGksIDEpOworICAgICAgICB9IGVsc2UgaWYgKF90ZW1wQnVmZmVyWzBdID4gMSkgeworICAgICAgICAgIHRyYW5zcG9ydC53cml0ZUFsbChfQ29uc3RhbnRzLkJBQ0tTTEFTSF9CWVRFUyk7CisgICAgICAgICAgdHJhbnNwb3J0LndyaXRlKF90ZW1wQnVmZmVyLCAwLCAxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0cmFuc3BvcnQud3JpdGVBbGwoX0NvbnN0YW50cy5FU0NTRVFfQllURVMpOworICAgICAgICAgIF90ZW1wQnVmZmVyWzBdID0gX2hleENoYXIoYnl0ZSA+PiA0KTsKKyAgICAgICAgICBfdGVtcEJ1ZmZlclsxXSA9IF9oZXhDaGFyKGJ5dGUpOworICAgICAgICAgIHRyYW5zcG9ydC53cml0ZShfdGVtcEJ1ZmZlciwgMCwgMik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICB0cmFuc3BvcnQud3JpdGVBbGwoX0NvbnN0YW50cy5RVU9URV9CWVRFUyk7CisgIH0KKworICB2b2lkIF93cml0ZUpzb25JbnRlZ2VyKGludCBpKSB7CisgICAgaWYgKGkgPT0gbnVsbCkgaSA9IDA7CisKKyAgICBfY29udGV4dC53cml0ZSgpOworICAgIFN0cmluZyBzdHIgPSBpLnRvU3RyaW5nKCk7CisKKyAgICBpZiAoX2NvbnRleHQuZXNjYXBlTnVtYmVycykgeworICAgICAgdHJhbnNwb3J0LndyaXRlQWxsKF9Db25zdGFudHMuUVVPVEVfQllURVMpOworICAgIH0KKyAgICB0cmFuc3BvcnQud3JpdGVBbGwodXRmOENvZGVjLmVuY29kZShzdHIpKTsKKyAgICBpZiAoX2NvbnRleHQuZXNjYXBlTnVtYmVycykgeworICAgICAgdHJhbnNwb3J0LndyaXRlQWxsKF9Db25zdGFudHMuUVVPVEVfQllURVMpOworICAgIH0KKyAgfQorCisgIHZvaWQgX3dyaXRlSnNvbkRvdWJsZShkb3VibGUgZCkgeworICAgIGlmIChkID09IG51bGwpIGQgPSAwLjA7CisKKyAgICBfY29udGV4dC53cml0ZSgpOworICAgIFN0cmluZyBzdHIgPSBkLnRvU3RyaW5nKCk7CisgICAgYm9vbCBlc2NhcGVOdW1iZXJzID0gZC5pc05hTiB8fCBkLmlzSW5maW5pdGUgfHwgX2NvbnRleHQuZXNjYXBlTnVtYmVyczsKKworICAgIGlmIChlc2NhcGVOdW1iZXJzKSB7CisgICAgICB0cmFuc3BvcnQud3JpdGVBbGwoX0NvbnN0YW50cy5RVU9URV9CWVRFUyk7CisgICAgfQorICAgIHRyYW5zcG9ydC53cml0ZUFsbCh1dGY4Q29kZWMuZW5jb2RlKHN0cikpOworICAgIGlmIChlc2NhcGVOdW1iZXJzKSB7CisgICAgICB0cmFuc3BvcnQud3JpdGVBbGwoX0NvbnN0YW50cy5RVU9URV9CWVRFUyk7CisgICAgfQorICB9CisKKyAgdm9pZCBfd3JpdGVKc29uQmFzZTY0KFVpbnQ4TGlzdCBieXRlcykgeworICAgIF9jb250ZXh0LndyaXRlKCk7CisgICAgdHJhbnNwb3J0LndyaXRlQWxsKF9Db25zdGFudHMuUVVPVEVfQllURVMpOworCisgICAgU3RyaW5nIGJhc2U2NCA9IEJBU0U2NC5lbmNvZGUoYnl0ZXMpOworICAgIHRyYW5zcG9ydC53cml0ZUFsbCh1dGY4Q29kZWMuZW5jb2RlKGJhc2U2NCkpOworCisgICAgdHJhbnNwb3J0LndyaXRlQWxsKF9Db25zdGFudHMuUVVPVEVfQllURVMpOworICB9CisKKyAgdm9pZCBfd3JpdGVKc29uT2JqZWN0U3RhcnQoKSB7CisgICAgX2NvbnRleHQud3JpdGUoKTsKKyAgICB0cmFuc3BvcnQud3JpdGVBbGwoX0NvbnN0YW50cy5MQlJBQ0VfQllURVMpOworICAgIF9wdXNoQ29udGV4dChuZXcgX1BhaXJDb250ZXh0KHRoaXMpKTsKKyAgfQorCisgIHZvaWQgX3dyaXRlSnNvbk9iamVjdEVuZCgpIHsKKyAgICBfcG9wQ29udGV4dCgpOworICAgIHRyYW5zcG9ydC53cml0ZUFsbChfQ29uc3RhbnRzLlJCUkFDRV9CWVRFUyk7CisgIH0KKworICB2b2lkIF93cml0ZUpzb25BcnJheVN0YXJ0KCkgeworICAgIF9jb250ZXh0LndyaXRlKCk7CisgICAgdHJhbnNwb3J0LndyaXRlQWxsKF9Db25zdGFudHMuTEJSQUNLRVRfQllURVMpOworICAgIF9wdXNoQ29udGV4dChuZXcgX0xpc3RDb250ZXh0KHRoaXMpKTsKKyAgfQorCisgIHZvaWQgX3dyaXRlSnNvbkFycmF5RW5kKCkgeworICAgIF9wb3BDb250ZXh0KCk7CisgICAgdHJhbnNwb3J0LndyaXRlQWxsKF9Db25zdGFudHMuUkJSQUNLRVRfQllURVMpOworICB9CisKKyAgdm9pZCB3cml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgX3Jlc2V0Q29udGV4dCgpOworCisgICAgX3dyaXRlSnNvbkFycmF5U3RhcnQoKTsKKyAgICBfd3JpdGVKc29uSW50ZWdlcihWRVJTSU9OXzEpOworCisgICAgX3dyaXRlSnNvblN0cmluZyh1dGY4Q29kZWMuZW5jb2RlKG1lc3NhZ2UubmFtZSkpOworICAgIF93cml0ZUpzb25JbnRlZ2VyKG1lc3NhZ2UudHlwZSk7CisgICAgX3dyaXRlSnNvbkludGVnZXIobWVzc2FnZS5zZXFpZCk7CisgIH0KKworICB2b2lkIHdyaXRlTWVzc2FnZUVuZCgpIHsKKyAgICBfd3JpdGVKc29uQXJyYXlFbmQoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVTdHJ1Y3RCZWdpbihUU3RydWN0IHN0cnVjdCkgeworICAgIF93cml0ZUpzb25PYmplY3RTdGFydCgpOworICB9CisKKyAgdm9pZCB3cml0ZVN0cnVjdEVuZCgpIHsKKyAgICBfd3JpdGVKc29uT2JqZWN0RW5kKCk7CisgIH0KKworICB2b2lkIHdyaXRlRmllbGRCZWdpbihURmllbGQgZmllbGQpIHsKKyAgICBfd3JpdGVKc29uSW50ZWdlcihmaWVsZC5pZCk7CisgICAgX3dyaXRlSnNvbk9iamVjdFN0YXJ0KCk7CisgICAgX3dyaXRlSnNvblN0cmluZyhfQ29uc3RhbnRzLmdldFR5cGVOYW1lQnl0ZXNGb3JUeXBlSWQoZmllbGQudHlwZSkpOworICB9CisKKyAgdm9pZCB3cml0ZUZpZWxkRW5kKCkgeworICAgIF93cml0ZUpzb25PYmplY3RFbmQoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVGaWVsZFN0b3AoKSB7fQorCisgIHZvaWQgd3JpdGVNYXBCZWdpbihUTWFwIG1hcCkgeworICAgIF93cml0ZUpzb25BcnJheVN0YXJ0KCk7CisgICAgX3dyaXRlSnNvblN0cmluZyhfQ29uc3RhbnRzLmdldFR5cGVOYW1lQnl0ZXNGb3JUeXBlSWQobWFwLmtleVR5cGUpKTsKKyAgICBfd3JpdGVKc29uU3RyaW5nKF9Db25zdGFudHMuZ2V0VHlwZU5hbWVCeXRlc0ZvclR5cGVJZChtYXAudmFsdWVUeXBlKSk7CisgICAgX3dyaXRlSnNvbkludGVnZXIobWFwLmxlbmd0aCk7CisgICAgX3dyaXRlSnNvbk9iamVjdFN0YXJ0KCk7CisgIH0KKworICB2b2lkIHdyaXRlTWFwRW5kKCkgeworICAgIF93cml0ZUpzb25PYmplY3RFbmQoKTsKKyAgICBfd3JpdGVKc29uQXJyYXlFbmQoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVMaXN0QmVnaW4oVExpc3QgbGlzdCkgeworICAgIF93cml0ZUpzb25BcnJheVN0YXJ0KCk7CisgICAgX3dyaXRlSnNvblN0cmluZyhfQ29uc3RhbnRzLmdldFR5cGVOYW1lQnl0ZXNGb3JUeXBlSWQobGlzdC5lbGVtZW50VHlwZSkpOworICAgIF93cml0ZUpzb25JbnRlZ2VyKGxpc3QubGVuZ3RoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVMaXN0RW5kKCkgeworICAgIF93cml0ZUpzb25BcnJheUVuZCgpOworICB9CisKKyAgdm9pZCB3cml0ZVNldEJlZ2luKFRTZXQgc2V0KSB7CisgICAgX3dyaXRlSnNvbkFycmF5U3RhcnQoKTsKKyAgICBfd3JpdGVKc29uU3RyaW5nKF9Db25zdGFudHMuZ2V0VHlwZU5hbWVCeXRlc0ZvclR5cGVJZChzZXQuZWxlbWVudFR5cGUpKTsKKyAgICBfd3JpdGVKc29uSW50ZWdlcihzZXQubGVuZ3RoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVTZXRFbmQoKSB7CisgICAgX3dyaXRlSnNvbkFycmF5RW5kKCk7CisgIH0KKworICB2b2lkIHdyaXRlQm9vbChib29sIGIpIHsKKyAgICBpZiAoYiA9PSBudWxsKSBiID0gZmFsc2U7CisgICAgX3dyaXRlSnNvbkludGVnZXIoYiA/IDEgOiAwKTsKKyAgfQorCisgIHZvaWQgd3JpdGVCeXRlKGludCBiKSB7CisgICAgX3dyaXRlSnNvbkludGVnZXIoYik7CisgIH0KKworICB2b2lkIHdyaXRlSTE2KGludCBpMTYpIHsKKyAgICBfd3JpdGVKc29uSW50ZWdlcihpMTYpOworICB9CisKKyAgdm9pZCB3cml0ZUkzMihpbnQgaTMyKSB7CisgICAgX3dyaXRlSnNvbkludGVnZXIoaTMyKTsKKyAgfQorCisgIHZvaWQgd3JpdGVJNjQoaW50IGk2NCkgeworICAgIF93cml0ZUpzb25JbnRlZ2VyKGk2NCk7CisgIH0KKworICB2b2lkIHdyaXRlRG91YmxlKGRvdWJsZSBkKSB7CisgICAgX3dyaXRlSnNvbkRvdWJsZShkKTsKKyAgfQorCisgIHZvaWQgd3JpdGVTdHJpbmcoU3RyaW5nIHMpIHsKKyAgICB2YXIgYnl0ZXMgPSBzICE9IG51bGwgPyB1dGY4Q29kZWMuZW5jb2RlKHMpIDogbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChbXSk7CisgICAgX3dyaXRlSnNvblN0cmluZyhieXRlcyk7CisgIH0KKworICB2b2lkIHdyaXRlQmluYXJ5KFVpbnQ4TGlzdCBieXRlcykgeworICAgIF93cml0ZUpzb25CYXNlNjQoYnl0ZXMpOworICB9CisKKyAgYm9vbCBfaXNIaWdoU3Vycm9nYXRlKGludCBiKSA9PiBiID49IDB4RDgwMCAmJiBiIDw9IDB4REJGRjsKKworICBib29sIF9pc0xvd1N1cnJvZ2F0ZShpbnQgYikgPT4gYiA+PSAweERDMDAgJiYgYiA8PSAweERGRkY7CisKKyAgLy8vIHJlYWQKKworICBVaW50OExpc3QgX3JlYWRKc29uU3RyaW5nKHtib29sIHNraXBDb250ZXh0OiBmYWxzZX0pIHsKKyAgICBMaXN0PGludD4gYnl0ZXMgPSBbXTsKKyAgICBMaXN0PGludD4gY29kZXVuaXRzID0gW107CisKKyAgICBpZiAoIXNraXBDb250ZXh0KSB7CisgICAgICBfY29udGV4dC5yZWFkKCk7CisgICAgfQorCisgICAgX3JlYWRKc29uU3ludGF4Q2hhcihfQ29uc3RhbnRzLlFVT1RFX0JZVEVTWzBdKTsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgaW50IGJ5dGUgPSBfcmVhZGVyLnJlYWQoKTsKKyAgICAgIGlmIChieXRlID09IF9Db25zdGFudHMuUVVPVEVfQllURVNbMF0pIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8vIGVzY2FwZWQ/CisgICAgICBpZiAoYnl0ZSAhPSBfQ29uc3RhbnRzLkVTQ1NFUV9CWVRFU1swXSkgeworICAgICAgICBieXRlcy5hZGQoYnl0ZSk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBieXRlID0gX3JlYWRlci5yZWFkKCk7CisKKyAgICAgIC8vIGRpc3Rpbmd1aXNoIGJldHdlZW4gXHVYWFhYIGFuZCBjb250cm9sIGNoYXJzIGxpa2UgXG4KKyAgICAgIGlmIChieXRlICE9IF9Db25zdGFudHMuRVNDU0VRX0JZVEVTWzFdKSB7CisgICAgICAgIFN0cmluZyBjaGFyID0gbmV3IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZSk7CisgICAgICAgIGludCBvZmZzZXQgPSBfQ29uc3RhbnRzLkVTQ0FQRV9DSEFSUy5pbmRleE9mKGNoYXIpOworICAgICAgICBpZiAob2Zmc2V0ID09IC0xKSB7CisgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKAorICAgICAgICAgICAgICBUUHJvdG9jb2xFcnJvclR5cGUuSU5WQUxJRF9EQVRBLCAiRXhwZWN0ZWQgY29udHJvbCBjaGFyIik7CisgICAgICAgIH0KKyAgICAgICAgYnl0ZSA9IF9Db25zdGFudHMuRVNDQVBFX0NIQVJfVkFMUy5jb2RlVW5pdEF0KG9mZnNldCk7CisgICAgICAgIGJ5dGVzLmFkZChieXRlKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIC8vIGl0J3MgXHVYWFhYCisgICAgICB0cmFuc3BvcnQucmVhZEFsbChfdGVtcEJ1ZmZlciwgMCwgNCk7CisgICAgICBieXRlID0gKF9oZXhWYWwoX3RlbXBCdWZmZXJbMF0pIDw8IDEyKQorICAgICAgICArIChfaGV4VmFsKF90ZW1wQnVmZmVyWzFdKSA8PCA4KQorICAgICAgICArIChfaGV4VmFsKF90ZW1wQnVmZmVyWzJdKSA8PCA0KQorICAgICAgICArIF9oZXhWYWwoX3RlbXBCdWZmZXJbM10pOworICAgICAgaWYgKF9pc0hpZ2hTdXJyb2dhdGUoYnl0ZSkpIHsKKyAgICAgICAgaWYgKGNvZGV1bml0cy5pc05vdEVtcHR5KSB7CisgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKAorICAgICAgICAgICAgICBUUHJvdG9jb2xFcnJvclR5cGUuSU5WQUxJRF9EQVRBLCAiRXhwZWN0ZWQgbG93IHN1cnJvZ2F0ZSIpOworICAgICAgICB9CisgICAgICAgIGNvZGV1bml0cy5hZGQoYnl0ZSk7CisgICAgICB9CisgICAgICBlbHNlIGlmIChfaXNMb3dTdXJyb2dhdGUoYnl0ZSkpIHsKKyAgICAgICAgaWYgKGNvZGV1bml0cy5pc0VtcHR5KSB7CisgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKAorICAgICAgICAgICAgICBUUHJvdG9jb2xFcnJvclR5cGUuSU5WQUxJRF9EQVRBLCAiRXhwZWN0ZWQgaGlnaCBzdXJyb2dhdGUiKTsKKyAgICAgICAgfQorICAgICAgICBjb2RldW5pdHMuYWRkKGJ5dGUpOworICAgICAgICBieXRlcy5hZGRBbGwodXRmOENvZGVjLmVuY29kZShuZXcgU3RyaW5nLmZyb21DaGFyQ29kZXMoY29kZXVuaXRzKSkpOworICAgICAgICBjb2RldW5pdHMuY2xlYXIoKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBieXRlcy5hZGRBbGwodXRmOENvZGVjLmVuY29kZShuZXcgU3RyaW5nLmZyb21DaGFyQ29kZShieXRlKSkpOworICAgICAgfQorICAgIH0KKworICAgIGlmIChjb2RldW5pdHMuaXNOb3RFbXB0eSkgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKAorICAgICAgICAgIFRQcm90b2NvbEVycm9yVHlwZS5JTlZBTElEX0RBVEEsICJFeHBlY3RlZCBsb3cgc3Vycm9nYXRlIik7CisgICAgfQorCisgICAgcmV0dXJuIG5ldyBVaW50OExpc3QuZnJvbUxpc3QoYnl0ZXMpOworICB9CisKKyAgU3RyaW5nIF9yZWFkSnNvbk51bWVyaWNDaGFycygpIHsKKyAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBpZiAoIV9Db25zdGFudHMuaXNKc29uTnVtZXJpYyhfcmVhZGVyLnBlZWsoKSkpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBidWZmZXIud3JpdGUobmV3IFN0cmluZy5mcm9tQ2hhckNvZGUoX3JlYWRlci5yZWFkKCkpKTsKKyAgICB9CisgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworICB9CisKKyAgaW50IF9yZWFkSnNvbkludGVnZXIoKSB7CisgICAgX2NvbnRleHQucmVhZCgpOworCisgICAgaWYgKF9jb250ZXh0LmVzY2FwZU51bWJlcnMpIHsKKyAgICAgIF9yZWFkSnNvblN5bnRheENoYXIoX0NvbnN0YW50cy5RVU9URV9CWVRFU1swXSk7CisgICAgfQorICAgIFN0cmluZyBzdHIgPSBfcmVhZEpzb25OdW1lcmljQ2hhcnMoKTsKKyAgICBpZiAoX2NvbnRleHQuZXNjYXBlTnVtYmVycykgeworICAgICAgX3JlYWRKc29uU3ludGF4Q2hhcihfQ29uc3RhbnRzLlFVT1RFX0JZVEVTWzBdKTsKKyAgICB9CisKKyAgICB0cnkgeworICAgICAgcmV0dXJuIGludC5wYXJzZShzdHIpOworICAgIH0gb24gRm9ybWF0RXhjZXB0aW9uIGNhdGNoIChfKSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoVFByb3RvY29sRXJyb3JUeXBlLklOVkFMSURfREFUQSwKKyAgICAgICAgICAiQmFkIGRhdGEgZW5jb3VudGVkIGluIG51bWVyaWMgZGF0YSIpOworICAgIH0KKyAgfQorCisgIGRvdWJsZSBfcmVhZEpzb25Eb3VibGUoKSB7CisgICAgX2NvbnRleHQucmVhZCgpOworCisgICAgaWYgKF9yZWFkZXIucGVlaygpID09IF9Db25zdGFudHMuUVVPVEVfQllURVNbMF0pIHsKKyAgICAgIFVpbnQ4TGlzdCBieXRlcyA9IF9yZWFkSnNvblN0cmluZyhza2lwQ29udGV4dDogdHJ1ZSk7CisgICAgICBkb3VibGUgZCA9IGRvdWJsZS5wYXJzZSh1dGY4Q29kZWMuZGVjb2RlKGJ5dGVzKSwgKF8pIHsKKyAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKFRQcm90b2NvbEVycm9yVHlwZS5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAiQmFkIGRhdGEgZW5jb3VudGVkIGluIG51bWVyaWMgZGF0YSIpOworICAgICAgfSk7CisgICAgICBpZiAoIV9jb250ZXh0LmVzY2FwZU51bWJlcnMgJiYgIWQuaXNOYU4gJiYgIWQuaXNJbmZpbml0ZSkgeworICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoVFByb3RvY29sRXJyb3JUeXBlLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICJOdW1lcmljIGRhdGEgdW5leHBlY3RlZGx5IHF1b3RlZCIpOworICAgICAgfQorICAgICAgcmV0dXJuIGQ7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChfY29udGV4dC5lc2NhcGVOdW1iZXJzKSB7CisgICAgICAgIC8vIFRoaXMgd2lsbCB0aHJvdyAtIHdlIHNob3VsZCBoYXZlIGhhZCBhIHF1b3RlIGlmIGVzY2FwZU51bWJlcnMgPT0gdHJ1ZQorICAgICAgICBfcmVhZEpzb25TeW50YXhDaGFyKF9Db25zdGFudHMuUVVPVEVfQllURVNbMF0pOworICAgICAgfQorICAgICAgcmV0dXJuIGRvdWJsZS5wYXJzZShfcmVhZEpzb25OdW1lcmljQ2hhcnMoKSwgKF8pIHsKKyAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKFRQcm90b2NvbEVycm9yVHlwZS5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAiQmFkIGRhdGEgZW5jb3VudGVkIGluIG51bWVyaWMgZGF0YSIpOworICAgICAgfSk7CisgICAgfQorICB9CisKKyAgVWludDhMaXN0IF9yZWFkSnNvbkJhc2U2NCgpIHsKKyAgICAvLyBjb252ZXJ0IFVURi04IGJ5dGVzIG9mIGEgQmFzZSA2NCBlbmNvZGVkIHN0cmluZyB0byBiaW5hcnkgYnl0ZXMKKyAgICBVaW50OExpc3QgYmFzZTY0Qnl0ZXMgPSBfcmVhZEpzb25TdHJpbmcoKTsKKyAgICBTdHJpbmcgYmFzZTY0ID0gdXRmOENvZGVjLmRlY29kZShiYXNlNjRCeXRlcyk7CisKKyAgICByZXR1cm4gbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChCQVNFNjQuZGVjb2RlKGJhc2U2NCkpOworICB9CisKKyAgdm9pZCBfcmVhZEpzb25PYmplY3RTdGFydCgpIHsKKyAgICBfY29udGV4dC5yZWFkKCk7CisgICAgX3JlYWRKc29uU3ludGF4Q2hhcihfQ29uc3RhbnRzLkxCUkFDRV9CWVRFU1swXSk7CisgICAgX3B1c2hDb250ZXh0KG5ldyBfUGFpckNvbnRleHQodGhpcykpOworICB9CisKKyAgdm9pZCBfcmVhZEpzb25PYmplY3RFbmQoKSB7CisgICAgX3JlYWRKc29uU3ludGF4Q2hhcihfQ29uc3RhbnRzLlJCUkFDRV9CWVRFU1swXSk7CisgICAgX3BvcENvbnRleHQoKTsKKyAgfQorCisgIHZvaWQgX3JlYWRKc29uQXJyYXlTdGFydCgpIHsKKyAgICBfY29udGV4dC5yZWFkKCk7CisgICAgX3JlYWRKc29uU3ludGF4Q2hhcihfQ29uc3RhbnRzLkxCUkFDS0VUX0JZVEVTWzBdKTsKKyAgICBfcHVzaENvbnRleHQobmV3IF9MaXN0Q29udGV4dCh0aGlzKSk7CisgIH0KKworICB2b2lkIF9yZWFkSnNvbkFycmF5RW5kKCkgeworICAgIF9yZWFkSnNvblN5bnRheENoYXIoX0NvbnN0YW50cy5SQlJBQ0tFVF9CWVRFU1swXSk7CisgICAgX3BvcENvbnRleHQoKTsKKyAgfQorCisgIFRNZXNzYWdlIHJlYWRNZXNzYWdlQmVnaW4oKSB7CisgICAgX3Jlc2V0Q29udGV4dCgpOworCisgICAgX3JlYWRKc29uQXJyYXlTdGFydCgpOworICAgIGlmIChfcmVhZEpzb25JbnRlZ2VyKCkgIT0gVkVSU0lPTl8xKSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoCisgICAgICAgICAgVFByb3RvY29sRXJyb3JUeXBlLkJBRF9WRVJTSU9OLCAiTWVzc2FnZSBjb250YWluZWQgYmFkIHZlcnNpb24uIik7CisgICAgfQorCisgICAgVWludDhMaXN0IGJ1ZmZlciA9IF9yZWFkSnNvblN0cmluZygpOworICAgIFN0cmluZyBuYW1lID0gdXRmOENvZGVjLmRlY29kZShidWZmZXIpOworICAgIGludCB0eXBlID0gX3JlYWRKc29uSW50ZWdlcigpOworICAgIGludCBzZXFpZCA9IF9yZWFkSnNvbkludGVnZXIoKTsKKworICAgIHJldHVybiBuZXcgVE1lc3NhZ2UobmFtZSwgdHlwZSwgc2VxaWQpOworICB9CisKKyAgdm9pZCByZWFkTWVzc2FnZUVuZCgpIHsKKyAgICBfcmVhZEpzb25BcnJheUVuZCgpOworICB9CisKKyAgVFN0cnVjdCByZWFkU3RydWN0QmVnaW4oKSB7CisgICAgX3JlYWRKc29uT2JqZWN0U3RhcnQoKTsKKyAgICByZXR1cm4gbmV3IFRTdHJ1Y3QoKTsKKyAgfQorCisgIHZvaWQgcmVhZFN0cnVjdEVuZCgpIHsKKyAgICBfcmVhZEpzb25PYmplY3RFbmQoKTsKKyAgfQorCisgIFRGaWVsZCByZWFkRmllbGRCZWdpbigpIHsKKyAgICBTdHJpbmcgbmFtZSA9ICIiOworICAgIGludCB0eXBlID0gVFR5cGUuU1RPUDsKKyAgICBpbnQgaWQgPSAwOworCisgICAgaWYgKF9yZWFkZXIucGVlaygpICE9IF9Db25zdGFudHMuUkJSQUNFX0JZVEVTWzBdKSB7CisgICAgICBpZCA9IF9yZWFkSnNvbkludGVnZXIoKTsKKyAgICAgIF9yZWFkSnNvbk9iamVjdFN0YXJ0KCk7CisgICAgICB0eXBlID0gX0NvbnN0YW50cy5nZXRUeXBlSWRGb3JUeXBlTmFtZShfcmVhZEpzb25TdHJpbmcoKSk7CisgICAgfQorCisgICAgcmV0dXJuIG5ldyBURmllbGQobmFtZSwgdHlwZSwgaWQpOworICB9CisKKyAgdm9pZCByZWFkRmllbGRFbmQoKSB7CisgICAgX3JlYWRKc29uT2JqZWN0RW5kKCk7CisgIH0KKworICBUTWFwIHJlYWRNYXBCZWdpbigpIHsKKyAgICBfcmVhZEpzb25BcnJheVN0YXJ0KCk7CisgICAgaW50IGtleVR5cGUgPSBfQ29uc3RhbnRzLmdldFR5cGVJZEZvclR5cGVOYW1lKF9yZWFkSnNvblN0cmluZygpKTsKKyAgICBpbnQgdmFsdWVUeXBlID0gX0NvbnN0YW50cy5nZXRUeXBlSWRGb3JUeXBlTmFtZShfcmVhZEpzb25TdHJpbmcoKSk7CisgICAgaW50IGxlbmd0aCA9IF9yZWFkSnNvbkludGVnZXIoKTsKKyAgICBfcmVhZEpzb25PYmplY3RTdGFydCgpOworCisgICAgcmV0dXJuIG5ldyBUTWFwKGtleVR5cGUsIHZhbHVlVHlwZSwgbGVuZ3RoKTsKKyAgfQorCisgIHZvaWQgcmVhZE1hcEVuZCgpIHsKKyAgICBfcmVhZEpzb25PYmplY3RFbmQoKTsKKyAgICBfcmVhZEpzb25BcnJheUVuZCgpOworICB9CisKKyAgVExpc3QgcmVhZExpc3RCZWdpbigpIHsKKyAgICBfcmVhZEpzb25BcnJheVN0YXJ0KCk7CisgICAgaW50IGVsZW1lbnRUeXBlID0gX0NvbnN0YW50cy5nZXRUeXBlSWRGb3JUeXBlTmFtZShfcmVhZEpzb25TdHJpbmcoKSk7CisgICAgaW50IGxlbmd0aCA9IF9yZWFkSnNvbkludGVnZXIoKTsKKworICAgIHJldHVybiBuZXcgVExpc3QoZWxlbWVudFR5cGUsIGxlbmd0aCk7CisgIH0KKworICB2b2lkIHJlYWRMaXN0RW5kKCkgeworICAgIF9yZWFkSnNvbkFycmF5RW5kKCk7CisgIH0KKworICBUU2V0IHJlYWRTZXRCZWdpbigpIHsKKyAgICBfcmVhZEpzb25BcnJheVN0YXJ0KCk7CisgICAgaW50IGVsZW1lbnRUeXBlID0gX0NvbnN0YW50cy5nZXRUeXBlSWRGb3JUeXBlTmFtZShfcmVhZEpzb25TdHJpbmcoKSk7CisgICAgaW50IGxlbmd0aCA9IF9yZWFkSnNvbkludGVnZXIoKTsKKworICAgIHJldHVybiBuZXcgVFNldChlbGVtZW50VHlwZSwgbGVuZ3RoKTsKKyAgfQorCisgIHZvaWQgcmVhZFNldEVuZCgpIHsKKyAgICBfcmVhZEpzb25BcnJheUVuZCgpOworICB9CisKKyAgYm9vbCByZWFkQm9vbCgpIHsKKyAgICByZXR1cm4gX3JlYWRKc29uSW50ZWdlcigpID09IDAgPyBmYWxzZSA6IHRydWU7CisgIH0KKworICBpbnQgcmVhZEJ5dGUoKSB7CisgICAgcmV0dXJuIF9yZWFkSnNvbkludGVnZXIoKTsKKyAgfQorCisgIGludCByZWFkSTE2KCkgeworICAgIHJldHVybiBfcmVhZEpzb25JbnRlZ2VyKCk7CisgIH0KKworICBpbnQgcmVhZEkzMigpIHsKKyAgICByZXR1cm4gX3JlYWRKc29uSW50ZWdlcigpOworICB9CisKKyAgaW50IHJlYWRJNjQoKSB7CisgICAgcmV0dXJuIF9yZWFkSnNvbkludGVnZXIoKTsKKyAgfQorCisgIGRvdWJsZSByZWFkRG91YmxlKCkgeworICAgIHJldHVybiBfcmVhZEpzb25Eb3VibGUoKTsKKyAgfQorCisgIFN0cmluZyByZWFkU3RyaW5nKCkgeworICAgIHJldHVybiB1dGY4Q29kZWMuZGVjb2RlKF9yZWFkSnNvblN0cmluZygpKTsKKyAgfQorCisgIFVpbnQ4TGlzdCByZWFkQmluYXJ5KCkgeworICAgIHJldHVybiBuZXcgVWludDhMaXN0LmZyb21MaXN0KF9yZWFkSnNvbkJhc2U2NCgpKTsKKyAgfQorfQorCitjbGFzcyBfQ29uc3RhbnRzIHsKKyAgc3RhdGljIGNvbnN0IHV0Zjhjb2RlYyA9IGNvbnN0IFV0ZjhDb2RlYygpOworCisgIHN0YXRpYyBmaW5hbCBVaW50OExpc3QgSEVYXzBfQllURVMgPSBuZXcgVWludDhMaXN0LmZyb21MaXN0KCcwJy5jb2RlVW5pdHMpOworICBzdGF0aWMgZmluYWwgVWludDhMaXN0IEhFWF85X0JZVEVTID0gbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdCgnOScuY29kZVVuaXRzKTsKKyAgc3RhdGljIGZpbmFsIFVpbnQ4TGlzdCBIRVhfQV9CWVRFUyA9IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoJ2EnLmNvZGVVbml0cyk7CisgIHN0YXRpYyBmaW5hbCBVaW50OExpc3QgSEVYX0ZfQllURVMgPSBuZXcgVWludDhMaXN0LmZyb21MaXN0KCdmJy5jb2RlVW5pdHMpOworICBzdGF0aWMgZmluYWwgVWludDhMaXN0IENPTU1BX0JZVEVTID0gbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdCgnLCcuY29kZVVuaXRzKTsKKyAgc3RhdGljIGZpbmFsIFVpbnQ4TGlzdCBDT0xPTl9CWVRFUyA9IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoJzonLmNvZGVVbml0cyk7CisgIHN0YXRpYyBmaW5hbCBVaW50OExpc3QgTEJSQUNFX0JZVEVTID0gbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdCgneycuY29kZVVuaXRzKTsKKyAgc3RhdGljIGZpbmFsIFVpbnQ4TGlzdCBSQlJBQ0VfQllURVMgPSBuZXcgVWludDhMaXN0LmZyb21MaXN0KCd9Jy5jb2RlVW5pdHMpOworICBzdGF0aWMgZmluYWwgVWludDhMaXN0IExCUkFDS0VUX0JZVEVTID0gbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdCgnWycuY29kZVVuaXRzKTsKKyAgc3RhdGljIGZpbmFsIFVpbnQ4TGlzdCBSQlJBQ0tFVF9CWVRFUyA9IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoJ10nLmNvZGVVbml0cyk7CisgIHN0YXRpYyBmaW5hbCBVaW50OExpc3QgUVVPVEVfQllURVMgPSBuZXcgVWludDhMaXN0LmZyb21MaXN0KCciJy5jb2RlVW5pdHMpOworICBzdGF0aWMgZmluYWwgVWludDhMaXN0IEJBQ0tTTEFTSF9CWVRFUyA9CisgICAgICBuZXcgVWludDhMaXN0LmZyb21MaXN0KHInXCcuY29kZVVuaXRzKTsKKworICBzdGF0aWMgZmluYWwgRVNDU0VRX0JZVEVTID0gbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChyJ1x1MDAnLmNvZGVVbml0cyk7CisKKyAgc3RhdGljIGZpbmFsIFVpbnQ4TGlzdCBKU09OX0NIQVJfVEFCTEUgPSBuZXcgVWludDhMaXN0LmZyb21MaXN0KFsKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAvLyA4IGJ5dGVzCisgICAgJ2InLmNvZGVVbml0QXQoMCksICd0Jy5jb2RlVW5pdEF0KDApLCAnbicuY29kZVVuaXRBdCgwKSwgMCwgLy8gNCBieXRlcworICAgICdmJy5jb2RlVW5pdEF0KDApLCAncicuY29kZVVuaXRBdCgwKSwgMCwgMCwgLy8gNCBieXRlcworICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC8vIDggYnl0ZXMKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAvLyA4IGJ5dGVzCisgICAgMSwgMSwgJyInLmNvZGVVbml0QXQoMCksIDEsIDEsIDEsIDEsIDEsIC8vIDggYnl0ZXMKKyAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxIC8vIDggYnl0ZXMKKyAgXSk7CisKKyAgc3RhdGljIGNvbnN0IFN0cmluZyBFU0NBUEVfQ0hBUlMgPSByJyJcL2JmbnJ0JzsKKyAgc3RhdGljIGNvbnN0IFN0cmluZyBFU0NBUEVfQ0hBUl9WQUxTID0gJyJcXC9cYlxmXG5cclx0JzsKKworICBzdGF0aWMgY29uc3QgU3RyaW5nIE5BTUVfQk9PTCA9ICd0Zic7CisgIHN0YXRpYyBjb25zdCBTdHJpbmcgTkFNRV9CWVRFID0gJ2k4JzsKKyAgc3RhdGljIGNvbnN0IFN0cmluZyBOQU1FX0kxNiA9ICdpMTYnOworICBzdGF0aWMgY29uc3QgU3RyaW5nIE5BTUVfSTMyID0gJ2kzMic7CisgIHN0YXRpYyBjb25zdCBTdHJpbmcgTkFNRV9JNjQgPSAnaTY0JzsKKyAgc3RhdGljIGNvbnN0IFN0cmluZyBOQU1FX0RPVUJMRSA9ICdkYmwnOworICBzdGF0aWMgY29uc3QgU3RyaW5nIE5BTUVfU1RSVUNUID0gJ3JlYyc7CisgIHN0YXRpYyBjb25zdCBTdHJpbmcgTkFNRV9TVFJJTkcgPSAnc3RyJzsKKyAgc3RhdGljIGNvbnN0IFN0cmluZyBOQU1FX01BUCA9ICdtYXAnOworICBzdGF0aWMgY29uc3QgU3RyaW5nIE5BTUVfTElTVCA9ICdsc3QnOworICBzdGF0aWMgY29uc3QgU3RyaW5nIE5BTUVfU0VUID0gJ3NldCc7CisKKyAgc3RhdGljIGZpbmFsIE1hcDxpbnQsIFVpbnQ4TGlzdD4gX1RZUEVfSURfVE9fTkFNRV9CWVRFUyA9CisgICAgICBuZXcgTWFwLnVubW9kaWZpYWJsZSh7CisgICAgVFR5cGUuQk9PTDogbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChOQU1FX0JPT0wuY29kZVVuaXRzKSwKKyAgICBUVHlwZS5CWVRFOiBuZXcgVWludDhMaXN0LmZyb21MaXN0KE5BTUVfQllURS5jb2RlVW5pdHMpLAorICAgIFRUeXBlLkkxNjogbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChOQU1FX0kxNi5jb2RlVW5pdHMpLAorICAgIFRUeXBlLkkzMjogbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChOQU1FX0kzMi5jb2RlVW5pdHMpLAorICAgIFRUeXBlLkk2NDogbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChOQU1FX0k2NC5jb2RlVW5pdHMpLAorICAgIFRUeXBlLkRPVUJMRTogbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChOQU1FX0RPVUJMRS5jb2RlVW5pdHMpLAorICAgIFRUeXBlLlNUUklORzogbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChOQU1FX1NUUklORy5jb2RlVW5pdHMpLAorICAgIFRUeXBlLlNUUlVDVDogbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChOQU1FX1NUUlVDVC5jb2RlVW5pdHMpLAorICAgIFRUeXBlLk1BUDogbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChOQU1FX01BUC5jb2RlVW5pdHMpLAorICAgIFRUeXBlLlNFVDogbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChOQU1FX1NFVC5jb2RlVW5pdHMpLAorICAgIFRUeXBlLkxJU1Q6IG5ldyBVaW50OExpc3QuZnJvbUxpc3QoTkFNRV9MSVNULmNvZGVVbml0cykKKyAgfSk7CisKKyAgc3RhdGljIFVpbnQ4TGlzdCBnZXRUeXBlTmFtZUJ5dGVzRm9yVHlwZUlkKGludCB0eXBlSWQpIHsKKyAgICBpZiAoIV9UWVBFX0lEX1RPX05BTUVfQllURVMuY29udGFpbnNLZXkodHlwZUlkKSkgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKAorICAgICAgICAgIFRQcm90b2NvbEVycm9yVHlwZS5OT1RfSU1QTEVNRU5URUQsICJVbnJlY29nbml6ZWQgdHlwZSIpOworICAgIH0KKworICAgIHJldHVybiBfVFlQRV9JRF9UT19OQU1FX0JZVEVTW3R5cGVJZF07CisgIH0KKworICBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgaW50PiBfTkFNRV9UT19UWVBFX0lEID0gbmV3IE1hcC51bm1vZGlmaWFibGUoeworICAgIE5BTUVfQk9PTDogVFR5cGUuQk9PTCwKKyAgICBOQU1FX0JZVEU6IFRUeXBlLkJZVEUsCisgICAgTkFNRV9JMTY6IFRUeXBlLkkxNiwKKyAgICBOQU1FX0kzMjogVFR5cGUuSTMyLAorICAgIE5BTUVfSTY0OiBUVHlwZS5JNjQsCisgICAgTkFNRV9ET1VCTEU6IFRUeXBlLkRPVUJMRSwKKyAgICBOQU1FX1NUUklORzogVFR5cGUuU1RSSU5HLAorICAgIE5BTUVfU1RSVUNUOiBUVHlwZS5TVFJVQ1QsCisgICAgTkFNRV9NQVA6IFRUeXBlLk1BUCwKKyAgICBOQU1FX1NFVDogVFR5cGUuU0VULAorICAgIE5BTUVfTElTVDogVFR5cGUuTElTVAorICB9KTsKKworICBzdGF0aWMgaW50IGdldFR5cGVJZEZvclR5cGVOYW1lKFVpbnQ4TGlzdCBieXRlcykgeworICAgIFN0cmluZyBuYW1lID0gdXRmOGNvZGVjLmRlY29kZShieXRlcyk7CisgICAgaWYgKCFfTkFNRV9UT19UWVBFX0lELmNvbnRhaW5zS2V5KG5hbWUpKSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoCisgICAgICAgICAgVFByb3RvY29sRXJyb3JUeXBlLk5PVF9JTVBMRU1FTlRFRCwgIlVucmVjb2duaXplZCB0eXBlIik7CisgICAgfQorCisgICAgcmV0dXJuIF9OQU1FX1RPX1RZUEVfSURbbmFtZV07CisgIH0KKworICBzdGF0aWMgZmluYWwgU2V0PGludD4gX0pTT05fTlVNRVJJQ1MgPSBuZXcgU2V0LmZyb20oWworICAgICcrJy5jb2RlVW5pdEF0KDApLAorICAgICctJy5jb2RlVW5pdEF0KDApLAorICAgICcuJy5jb2RlVW5pdEF0KDApLAorICAgICcwJy5jb2RlVW5pdEF0KDApLAorICAgICcxJy5jb2RlVW5pdEF0KDApLAorICAgICcyJy5jb2RlVW5pdEF0KDApLAorICAgICczJy5jb2RlVW5pdEF0KDApLAorICAgICc0Jy5jb2RlVW5pdEF0KDApLAorICAgICc1Jy5jb2RlVW5pdEF0KDApLAorICAgICc2Jy5jb2RlVW5pdEF0KDApLAorICAgICc3Jy5jb2RlVW5pdEF0KDApLAorICAgICc4Jy5jb2RlVW5pdEF0KDApLAorICAgICc5Jy5jb2RlVW5pdEF0KDApLAorICAgICdFJy5jb2RlVW5pdEF0KDApLAorICAgICdlJy5jb2RlVW5pdEF0KDApCisgIF0pOworCisgIHN0YXRpYyBib29sIGlzSnNvbk51bWVyaWMoaW50IGJ5dGUpIHsKKyAgICByZXR1cm4gX0pTT05fTlVNRVJJQ1MuY29udGFpbnMoYnl0ZSk7CisgIH0KK30KKworY2xhc3MgX0xvb2thaGVhZFJlYWRlciB7CisgIGZpbmFsIFRKc29uUHJvdG9jb2wgcHJvdG9jb2w7CisKKyAgX0xvb2thaGVhZFJlYWRlcih0aGlzLnByb3RvY29sKTsKKworICBib29sIF9oYXNEYXRhID0gZmFsc2U7CisgIGZpbmFsIFVpbnQ4TGlzdCBfZGF0YSA9IG5ldyBVaW50OExpc3QoMSk7CisKKyAgaW50IHJlYWQoKSB7CisgICAgaWYgKF9oYXNEYXRhKSB7CisgICAgICBfaGFzRGF0YSA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBwcm90b2NvbC50cmFuc3BvcnQucmVhZEFsbChfZGF0YSwgMCwgMSk7CisgICAgfQorCisgICAgcmV0dXJuIF9kYXRhWzBdOworICB9CisKKyAgaW50IHBlZWsoKSB7CisgICAgaWYgKCFfaGFzRGF0YSkgeworICAgICAgcHJvdG9jb2wudHJhbnNwb3J0LnJlYWRBbGwoX2RhdGEsIDAsIDEpOworICAgIH0KKyAgICBfaGFzRGF0YSA9IHRydWU7CisKKyAgICByZXR1cm4gX2RhdGFbMF07CisgIH0KK30KKworY2xhc3MgX0Jhc2VDb250ZXh0IHsKKyAgZmluYWwgVEpzb25Qcm90b2NvbCBwcm90b2NvbDsKKworICBfQmFzZUNvbnRleHQodGhpcy5wcm90b2NvbCk7CisKKyAgdm9pZCB3cml0ZSgpIHt9CisKKyAgdm9pZCByZWFkKCkge30KKworICBib29sIGdldCBlc2NhcGVOdW1iZXJzID0+IGZhbHNlOworCisgIFN0cmluZyB0b1N0cmluZygpID0+ICdCYXNlQ29udGV4dCc7Cit9CisKK2NsYXNzIF9MaXN0Q29udGV4dCBleHRlbmRzIF9CYXNlQ29udGV4dCB7CisgIF9MaXN0Q29udGV4dChUSnNvblByb3RvY29sIHByb3RvY29sKSA6IHN1cGVyKHByb3RvY29sKTsKKworICBib29sIF9maXJzdCA9IHRydWU7CisKKyAgdm9pZCB3cml0ZSgpIHsKKyAgICBpZiAoX2ZpcnN0KSB7CisgICAgICBfZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgcHJvdG9jb2wudHJhbnNwb3J0LndyaXRlQWxsKF9Db25zdGFudHMuQ09NTUFfQllURVMpOworICAgIH0KKyAgfQorCisgIHZvaWQgcmVhZCgpIHsKKyAgICBpZiAoX2ZpcnN0KSB7CisgICAgICBfZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgcHJvdG9jb2wuX3JlYWRKc29uU3ludGF4Q2hhcihfQ29uc3RhbnRzLkNPTU1BX0JZVEVTWzBdKTsKKyAgICB9CisgIH0KKworICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnTGlzdENvbnRleHQnOworfQorCitjbGFzcyBfUGFpckNvbnRleHQgZXh0ZW5kcyBfQmFzZUNvbnRleHQgeworICBfUGFpckNvbnRleHQoVEpzb25Qcm90b2NvbCBwcm90b2NvbCkgOiBzdXBlcihwcm90b2NvbCk7CisKKyAgYm9vbCBfZmlyc3QgPSB0cnVlOworICBib29sIF9jb2xvbiA9IHRydWU7CisKKyAgVWludDhMaXN0IGdldCBzeW1ib2xCeXRlcyA9PgorICAgICAgX2NvbG9uID8gX0NvbnN0YW50cy5DT0xPTl9CWVRFUyA6IF9Db25zdGFudHMuQ09NTUFfQllURVM7CisKKyAgdm9pZCB3cml0ZSgpIHsKKyAgICBpZiAoX2ZpcnN0KSB7CisgICAgICBfZmlyc3QgPSBmYWxzZTsKKyAgICAgIF9jb2xvbiA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgIHByb3RvY29sLnRyYW5zcG9ydC53cml0ZUFsbChzeW1ib2xCeXRlcyk7CisgICAgICBfY29sb24gPSAhX2NvbG9uOworICAgIH0KKyAgfQorCisgIHZvaWQgcmVhZCgpIHsKKyAgICBpZiAoX2ZpcnN0KSB7CisgICAgICBfZmlyc3QgPSBmYWxzZTsKKyAgICAgIF9jb2xvbiA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgIHByb3RvY29sLl9yZWFkSnNvblN5bnRheENoYXIoc3ltYm9sQnl0ZXNbMF0pOworICAgICAgX2NvbG9uID0gIV9jb2xvbjsKKyAgICB9CisgIH0KKworICBib29sIGdldCBlc2NhcGVOdW1iZXJzID0+IF9jb2xvbjsKKworICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnUGFpckNvbnRleHQnOworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X2xpc3QuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9saXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlmNDY3MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9saXN0LmRhcnQKQEAgLTAsMCArMSwyNSBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCitjbGFzcyBUTGlzdCB7CisgIGZpbmFsIGludCBlbGVtZW50VHlwZTsKKyAgZmluYWwgaW50IGxlbmd0aDsKKworICBUTGlzdCh0aGlzLmVsZW1lbnRUeXBlLCB0aGlzLmxlbmd0aCk7Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfbWFwLmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfbWFwLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZkZjY4MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9tYXAuZGFydApAQCAtMCwwICsxLDI2IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKK2NsYXNzIFRNYXAgeworICBmaW5hbCBpbnQga2V5VHlwZTsKKyAgZmluYWwgaW50IHZhbHVlVHlwZTsKKyAgZmluYWwgaW50IGxlbmd0aDsKKworICBUTWFwKHRoaXMua2V5VHlwZSwgdGhpcy52YWx1ZVR5cGUsIHRoaXMubGVuZ3RoKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9tZXNzYWdlLmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfbWVzc2FnZS5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjN2I4ODYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfbWVzc2FnZS5kYXJ0CkBAIC0wLDAgKzEsMzUgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworY2xhc3MgVE1lc3NhZ2VUeXBlIHsKKyAgc3RhdGljIGNvbnN0IGludCBDQUxMID0gMTsKKyAgc3RhdGljIGNvbnN0IGludCBSRVBMWSA9IDI7CisgIHN0YXRpYyBjb25zdCBpbnQgRVhDRVBUSU9OID0gMzsKKyAgc3RhdGljIGNvbnN0IGludCBPTkVXQVkgPSA0OworfQorCitjbGFzcyBUTWVzc2FnZSB7CisgIGZpbmFsIFN0cmluZyBuYW1lOworICBmaW5hbCBpbnQgdHlwZTsKKyAgZmluYWwgaW50IHNlcWlkOworCisgIFRNZXNzYWdlKHRoaXMubmFtZSwgdGhpcy50eXBlLCB0aGlzLnNlcWlkKTsKKworICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiPFRNZXNzYWdlIG5hbWU6ICckbmFtZScgdHlwZTogJHR5cGUgc2VxaWQ6ICRzZXFpZD4iOworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X211bHRpcGxleGVkX3Byb3RvY29sLmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfbXVsdGlwbGV4ZWRfcHJvdG9jb2wuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzhhNmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X211bHRpcGxleGVkX3Byb3RvY29sLmRhcnQKQEAgLTAsMCArMSw0MyBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCisvLy8gQWRhcHRlZCBmcm9tIHRoZSBDIyB2ZXJzaW9uLgorY2xhc3MgVE11bHRpcGxleGVkUHJvdG9jb2wgZXh0ZW5kcyBUUHJvdG9jb2xEZWNvcmF0b3IgeworICBzdGF0aWMgY29uc3QgU0VQQVJBVE9SID0gJzonOworCisgIGZpbmFsIFN0cmluZyBfc2VydmljZU5hbWU7CisKKyAgVE11bHRpcGxleGVkUHJvdG9jb2woVFByb3RvY29sIHByb3RvY29sLCBTdHJpbmcgc2VydmljZU5hbWUpCisgICAgICA6IF9zZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lLAorICAgICAgICBzdXBlcihwcm90b2NvbCkgeworICAgIGlmIChzZXJ2aWNlTmFtZSA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci5ub3ROdWxsKCJzZXJ2aWNlTmFtZSIpOworICAgIH0KKyAgfQorCisgIHZvaWQgd3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UgbWVzc2FnZSkgeworICAgIGlmIChtZXNzYWdlLnR5cGUgPT0gVE1lc3NhZ2VUeXBlLkNBTEwgfHwKKyAgICAgICAgbWVzc2FnZS50eXBlID09IFRNZXNzYWdlVHlwZS5PTkVXQVkpIHsKKyAgICAgIFN0cmluZyBuYW1lID0gX3NlcnZpY2VOYW1lICsgU0VQQVJBVE9SICsgbWVzc2FnZS5uYW1lOworICAgICAgbWVzc2FnZSA9IG5ldyBUTWVzc2FnZShuYW1lLCBtZXNzYWdlLnR5cGUsIG1lc3NhZ2Uuc2VxaWQpOworICAgIH0KKworICAgIHN1cGVyLndyaXRlTWVzc2FnZUJlZ2luKG1lc3NhZ2UpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfcHJvdG9jb2wuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9wcm90b2NvbC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0OWMwMzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfcHJvdG9jb2wuZGFydApAQCAtMCwwICsxLDk1IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKK2Fic3RyYWN0IGNsYXNzIFRQcm90b2NvbCB7CisgIGZpbmFsIFRUcmFuc3BvcnQgdHJhbnNwb3J0OworCisgIFRQcm90b2NvbCh0aGlzLnRyYW5zcG9ydCk7CisKKyAgLy8vIFdyaXRlCisgIHZvaWQgd3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UgbWVzc2FnZSk7CisgIHZvaWQgd3JpdGVNZXNzYWdlRW5kKCk7CisKKyAgdm9pZCB3cml0ZVN0cnVjdEJlZ2luKFRTdHJ1Y3Qgc3RydWN0KTsKKyAgdm9pZCB3cml0ZVN0cnVjdEVuZCgpOworCisgIHZvaWQgd3JpdGVGaWVsZEJlZ2luKFRGaWVsZCBmaWVsZCk7CisgIHZvaWQgd3JpdGVGaWVsZEVuZCgpOworICB2b2lkIHdyaXRlRmllbGRTdG9wKCk7CisKKyAgdm9pZCB3cml0ZU1hcEJlZ2luKFRNYXAgbWFwKTsKKyAgdm9pZCB3cml0ZU1hcEVuZCgpOworCisgIHZvaWQgd3JpdGVMaXN0QmVnaW4oVExpc3QgbGlzdCk7CisgIHZvaWQgd3JpdGVMaXN0RW5kKCk7CisKKyAgdm9pZCB3cml0ZVNldEJlZ2luKFRTZXQgc2V0KTsKKyAgdm9pZCB3cml0ZVNldEVuZCgpOworCisgIHZvaWQgd3JpdGVCb29sKGJvb2wgYik7CisKKyAgdm9pZCB3cml0ZUJ5dGUoaW50IGIpOworCisgIHZvaWQgd3JpdGVJMTYoaW50IGkxNik7CisKKyAgdm9pZCB3cml0ZUkzMihpbnQgaTMyKTsKKworICB2b2lkIHdyaXRlSTY0KGludCBpNjQpOworCisgIHZvaWQgd3JpdGVEb3VibGUoZG91YmxlIGQpOworCisgIHZvaWQgd3JpdGVTdHJpbmcoU3RyaW5nIHN0cik7CisKKyAgdm9pZCB3cml0ZUJpbmFyeShVaW50OExpc3QgYnl0ZXMpOworCisgIC8vLyBSZWFkCisgIFRNZXNzYWdlIHJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgdm9pZCByZWFkTWVzc2FnZUVuZCgpOworCisgIFRTdHJ1Y3QgcmVhZFN0cnVjdEJlZ2luKCk7CisgIHZvaWQgcmVhZFN0cnVjdEVuZCgpOworCisgIFRGaWVsZCByZWFkRmllbGRCZWdpbigpOworICB2b2lkIHJlYWRGaWVsZEVuZCgpOworCisgIFRNYXAgcmVhZE1hcEJlZ2luKCk7CisgIHZvaWQgcmVhZE1hcEVuZCgpOworCisgIFRMaXN0IHJlYWRMaXN0QmVnaW4oKTsKKyAgdm9pZCByZWFkTGlzdEVuZCgpOworCisgIFRTZXQgcmVhZFNldEJlZ2luKCk7CisgIHZvaWQgcmVhZFNldEVuZCgpOworCisgIGJvb2wgcmVhZEJvb2woKTsKKworICBpbnQgcmVhZEJ5dGUoKTsKKworICBpbnQgcmVhZEkxNigpOworCisgIGludCByZWFkSTMyKCk7CisKKyAgaW50IHJlYWRJNjQoKTsKKworICBkb3VibGUgcmVhZERvdWJsZSgpOworCisgIFN0cmluZyByZWFkU3RyaW5nKCk7CisKKyAgVWludDhMaXN0IHJlYWRCaW5hcnkoKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9wcm90b2NvbF9kZWNvcmF0b3IuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9wcm90b2NvbF9kZWNvcmF0b3IuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2QwMmY2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X3Byb3RvY29sX2RlY29yYXRvci5kYXJ0CkBAIC0wLDAgKzEsMTUwIEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKKy8vLyBGb3J3YXJkIGFsbCBvcGVyYXRpb25zIHRvIHRoZSB3cmFwcGVkIHByb3RvY29sLiAgVXNlZCBhcyBhIGJhc2UgY2xhc3MuCisvLy8KKy8vLyBBZGFwdGVkIGZyb20gdGhlIEMjIHZlcnNpb24uCitjbGFzcyBUUHJvdG9jb2xEZWNvcmF0b3IgZXh0ZW5kcyBUUHJvdG9jb2wgeworICBmaW5hbCBUUHJvdG9jb2wgX3Byb3RvY29sOworCisgIFRQcm90b2NvbERlY29yYXRvcihUUHJvdG9jb2wgcHJvdG9jb2wpCisgICAgICA6IF9wcm90b2NvbCA9IHByb3RvY29sLAorICAgICAgICBzdXBlcihwcm90b2NvbC50cmFuc3BvcnQpOworCisgIC8vLyBXcml0ZQorCisgIHZvaWQgd3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UgbWVzc2FnZSkgeworICAgIF9wcm90b2NvbC53cml0ZU1lc3NhZ2VCZWdpbihtZXNzYWdlKTsKKyAgfQorCisgIHZvaWQgd3JpdGVNZXNzYWdlRW5kKCkgeworICAgIF9wcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVTdHJ1Y3RCZWdpbihUU3RydWN0IHN0cnVjdCkgeworICAgIF9wcm90b2NvbC53cml0ZVN0cnVjdEJlZ2luKHN0cnVjdCk7CisgIH0KKworICB2b2lkIHdyaXRlU3RydWN0RW5kKCkgeworICAgIF9wcm90b2NvbC53cml0ZVN0cnVjdEVuZCgpOworICB9CisKKyAgdm9pZCB3cml0ZUZpZWxkQmVnaW4oVEZpZWxkIGZpZWxkKSB7CisgICAgX3Byb3RvY29sLndyaXRlRmllbGRCZWdpbihmaWVsZCk7CisgIH0KKworICB2b2lkIHdyaXRlRmllbGRFbmQoKSB7CisgICAgX3Byb3RvY29sLndyaXRlRmllbGRFbmQoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVGaWVsZFN0b3AoKSB7CisgICAgX3Byb3RvY29sLndyaXRlRmllbGRTdG9wKCk7CisgIH0KKworICB2b2lkIHdyaXRlTWFwQmVnaW4oVE1hcCBtYXApIHsKKyAgICBfcHJvdG9jb2wud3JpdGVNYXBCZWdpbihtYXApOworICB9CisKKyAgdm9pZCB3cml0ZU1hcEVuZCgpIHsKKyAgICBfcHJvdG9jb2wud3JpdGVNYXBFbmQoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVMaXN0QmVnaW4oVExpc3QgbGlzdCkgeworICAgIF9wcm90b2NvbC53cml0ZUxpc3RCZWdpbihsaXN0KTsKKyAgfQorCisgIHZvaWQgd3JpdGVMaXN0RW5kKCkgeworICAgIF9wcm90b2NvbC53cml0ZUxpc3RFbmQoKTsKKyAgfQorCisgIHZvaWQgd3JpdGVTZXRCZWdpbihUU2V0IHNldCkgeworICAgIF9wcm90b2NvbC53cml0ZVNldEJlZ2luKHNldCk7CisgIH0KKworICB2b2lkIHdyaXRlU2V0RW5kKCkgeworICAgIF9wcm90b2NvbC53cml0ZVNldEVuZCgpOworICB9CisKKyAgdm9pZCB3cml0ZUJvb2woYm9vbCBiKSB7CisgICAgX3Byb3RvY29sLndyaXRlQm9vbChiKTsKKyAgfQorCisgIHZvaWQgd3JpdGVCeXRlKGludCBiKSB7CisgICAgX3Byb3RvY29sLndyaXRlQnl0ZShiKTsKKyAgfQorCisgIHZvaWQgd3JpdGVJMTYoaW50IGkxNikgeworICAgIF9wcm90b2NvbC53cml0ZUkxNihpMTYpOworICB9CisKKyAgdm9pZCB3cml0ZUkzMihpbnQgaTMyKSB7CisgICAgX3Byb3RvY29sLndyaXRlSTMyKGkzMik7CisgIH0KKworICB2b2lkIHdyaXRlSTY0KGludCBpNjQpIHsKKyAgICBfcHJvdG9jb2wud3JpdGVJNjQoaTY0KTsKKyAgfQorCisgIHZvaWQgd3JpdGVEb3VibGUoZG91YmxlIGQpIHsKKyAgICBfcHJvdG9jb2wud3JpdGVEb3VibGUoZCk7CisgIH0KKworICB2b2lkIHdyaXRlU3RyaW5nKFN0cmluZyBzdHIpIHsKKyAgICBfcHJvdG9jb2wud3JpdGVTdHJpbmcoc3RyKTsKKyAgfQorCisgIHZvaWQgd3JpdGVCaW5hcnkoVWludDhMaXN0IGJ5dGVzKSB7CisgICAgX3Byb3RvY29sLndyaXRlQmluYXJ5KGJ5dGVzKTsKKyAgfQorCisgIC8vLyBSZWFkCisgIFRNZXNzYWdlIHJlYWRNZXNzYWdlQmVnaW4oKSA9PiBfcHJvdG9jb2wucmVhZE1lc3NhZ2VCZWdpbigpOworICB2b2lkIHJlYWRNZXNzYWdlRW5kKCkgPT4gX3Byb3RvY29sLnJlYWRNZXNzYWdlRW5kKCk7CisKKyAgVFN0cnVjdCByZWFkU3RydWN0QmVnaW4oKSA9PiBfcHJvdG9jb2wucmVhZFN0cnVjdEJlZ2luKCk7CisgIHZvaWQgcmVhZFN0cnVjdEVuZCgpID0+IF9wcm90b2NvbC5yZWFkU3RydWN0RW5kKCk7CisKKyAgVEZpZWxkIHJlYWRGaWVsZEJlZ2luKCkgPT4gX3Byb3RvY29sLnJlYWRGaWVsZEJlZ2luKCk7CisgIHZvaWQgcmVhZEZpZWxkRW5kKCkgPT4gX3Byb3RvY29sLnJlYWRGaWVsZEVuZCgpOworCisgIFRNYXAgcmVhZE1hcEJlZ2luKCkgPT4gX3Byb3RvY29sLnJlYWRNYXBCZWdpbigpOworICB2b2lkIHJlYWRNYXBFbmQoKSA9PiBfcHJvdG9jb2wucmVhZE1hcEVuZCgpOworCisgIFRMaXN0IHJlYWRMaXN0QmVnaW4oKSA9PiBfcHJvdG9jb2wucmVhZExpc3RCZWdpbigpOworICB2b2lkIHJlYWRMaXN0RW5kKCkgPT4gX3Byb3RvY29sLnJlYWRMaXN0RW5kKCk7CisKKyAgVFNldCByZWFkU2V0QmVnaW4oKSA9PiBfcHJvdG9jb2wucmVhZFNldEJlZ2luKCk7CisgIHZvaWQgcmVhZFNldEVuZCgpID0+IF9wcm90b2NvbC5yZWFkU2V0RW5kKCk7CisKKyAgYm9vbCByZWFkQm9vbCgpID0+IF9wcm90b2NvbC5yZWFkQm9vbCgpOworCisgIGludCByZWFkQnl0ZSgpID0+IF9wcm90b2NvbC5yZWFkQnl0ZSgpOworCisgIGludCByZWFkSTE2KCkgPT4gX3Byb3RvY29sLnJlYWRJMTYoKTsKKworICBpbnQgcmVhZEkzMigpID0+IF9wcm90b2NvbC5yZWFkSTMyKCk7CisKKyAgaW50IHJlYWRJNjQoKSA9PiBfcHJvdG9jb2wucmVhZEk2NCgpOworCisgIGRvdWJsZSByZWFkRG91YmxlKCkgPT4gX3Byb3RvY29sLnJlYWREb3VibGUoKTsKKworICBTdHJpbmcgcmVhZFN0cmluZygpID0+IF9wcm90b2NvbC5yZWFkU3RyaW5nKCk7CisKKyAgVWludDhMaXN0IHJlYWRCaW5hcnkoKSA9PiBfcHJvdG9jb2wucmVhZEJpbmFyeSgpOworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X3Byb3RvY29sX2Vycm9yLmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfcHJvdG9jb2xfZXJyb3IuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTZiYWViCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X3Byb3RvY29sX2Vycm9yLmRhcnQKQEAgLTAsMCArMSwzMyBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCitjbGFzcyBUUHJvdG9jb2xFcnJvclR5cGUgeworICBzdGF0aWMgY29uc3QgaW50IFVOS05PV04gPSAwOworICBzdGF0aWMgY29uc3QgaW50IElOVkFMSURfREFUQSA9IDE7CisgIHN0YXRpYyBjb25zdCBpbnQgTkVHQVRJVkVfU0laRSA9IDI7CisgIHN0YXRpYyBjb25zdCBpbnQgU0laRV9MSU1JVCA9IDM7CisgIHN0YXRpYyBjb25zdCBpbnQgQkFEX1ZFUlNJT04gPSA0OworICBzdGF0aWMgY29uc3QgaW50IE5PVF9JTVBMRU1FTlRFRCA9IDU7CisgIHN0YXRpYyBjb25zdCBpbnQgREVQVEhfTElNSVQgPSA2OworfQorCitjbGFzcyBUUHJvdG9jb2xFcnJvciBleHRlbmRzIFRFcnJvciB7CisgIFRQcm90b2NvbEVycm9yKFtpbnQgdHlwZSA9IFRQcm90b2NvbEVycm9yVHlwZS5VTktOT1dOLCBTdHJpbmcgbWVzc2FnZSA9ICIiXSkKKyAgICAgIDogc3VwZXIodHlwZSwgbWVzc2FnZSk7Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfcHJvdG9jb2xfZmFjdG9yeS5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X3Byb3RvY29sX2ZhY3RvcnkuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjJjNmNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X3Byb3RvY29sX2ZhY3RvcnkuZGFydApAQCAtMCwwICsxLDIyIEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKK2Fic3RyYWN0IGNsYXNzIFRQcm90b2NvbEZhY3Rvcnk8VCBleHRlbmRzIFRQcm90b2NvbD4geworICBUIGdldFByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnNwb3J0KTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF9wcm90b2NvbF91dGlsLmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfcHJvdG9jb2xfdXRpbC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMjAwNjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfcHJvdG9jb2xfdXRpbC5kYXJ0CkBAIC0wLDAgKzEsMTA3IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKK2NsYXNzIFRQcm90b2NvbFV0aWwgeworICAvLyBlcXVhbCB0byBKYXZhU2NyaXB0IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLCAyXjUzIC0gMQorICBzdGF0aWMgY29uc3QgaW50IGRlZmF1bHRSZWN1cnNpb25MaW1pdCA9IDkwMDcxOTkyNTQ3NDA5OTE7CisKKyAgc3RhdGljIGludCBtYXhSZWN1cnNpb25MaW1pdCA9IGRlZmF1bHRSZWN1cnNpb25MaW1pdDsKKworICBzdGF0aWMgc2tpcChUUHJvdG9jb2wgcHJvdCwgaW50IHR5cGUpIHsKKyAgICBfc2tpcChwcm90LCB0eXBlLCBtYXhSZWN1cnNpb25MaW1pdCk7CisgIH0KKworICBzdGF0aWMgX3NraXAoVFByb3RvY29sIHByb3QsIGludCB0eXBlLCBpbnQgcmVjdXJzaW9uTGltaXQpIHsKKyAgICBpZiAocmVjdXJzaW9uTGltaXQgPD0gMCkgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKAorICAgICAgICAgIFRQcm90b2NvbEVycm9yVHlwZS5ERVBUSF9MSU1JVCwgIkRlcHRoIGxpbWl0IGV4Y2VlZGVkIik7CisgICAgfQorCisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICBjYXNlIFRUeXBlLkJPT0w6CisgICAgICAgIHByb3QucmVhZEJvb2woKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgVFR5cGUuQllURToKKyAgICAgICAgcHJvdC5yZWFkQnl0ZSgpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBUVHlwZS5JMTY6CisgICAgICAgIHByb3QucmVhZEkxNigpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBUVHlwZS5JMzI6CisgICAgICAgIHByb3QucmVhZEkzMigpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBUVHlwZS5JNjQ6CisgICAgICAgIHByb3QucmVhZEk2NCgpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBUVHlwZS5ET1VCTEU6CisgICAgICAgIHByb3QucmVhZERvdWJsZSgpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBUVHlwZS5TVFJJTkc6CisgICAgICAgIHByb3QucmVhZEJpbmFyeSgpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBUVHlwZS5TVFJVQ1Q6CisgICAgICAgIHByb3QucmVhZFN0cnVjdEJlZ2luKCk7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgVEZpZWxkIGZpZWxkID0gcHJvdC5yZWFkRmllbGRCZWdpbigpOworICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLlNUT1ApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBfc2tpcChwcm90LCBmaWVsZC50eXBlLCByZWN1cnNpb25MaW1pdCAtIDEpOworICAgICAgICAgIHByb3QucmVhZEZpZWxkRW5kKCk7CisgICAgICAgIH0KKyAgICAgICAgcHJvdC5yZWFkU3RydWN0RW5kKCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFRUeXBlLk1BUDoKKyAgICAgICAgVE1hcCBtYXAgPSBwcm90LnJlYWRNYXBCZWdpbigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hcC5sZW5ndGg7IGkrKykgeworICAgICAgICAgIF9za2lwKHByb3QsIG1hcC5rZXlUeXBlLCByZWN1cnNpb25MaW1pdCAtIDEpOworICAgICAgICAgIF9za2lwKHByb3QsIG1hcC52YWx1ZVR5cGUsIHJlY3Vyc2lvbkxpbWl0IC0gMSk7CisgICAgICAgIH0KKyAgICAgICAgcHJvdC5yZWFkTWFwRW5kKCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFRUeXBlLlNFVDoKKyAgICAgICAgVFNldCBzZXQgPSBwcm90LnJlYWRTZXRCZWdpbigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNldC5sZW5ndGg7IGkrKykgeworICAgICAgICAgIF9za2lwKHByb3QsIHNldC5lbGVtZW50VHlwZSwgcmVjdXJzaW9uTGltaXQgLSAxKTsKKyAgICAgICAgfQorICAgICAgICBwcm90LnJlYWRTZXRFbmQoKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgVFR5cGUuTElTVDoKKyAgICAgICAgVExpc3QgbGlzdCA9IHByb3QucmVhZExpc3RCZWdpbigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICBfc2tpcChwcm90LCBsaXN0LmVsZW1lbnRUeXBlLCByZWN1cnNpb25MaW1pdCAtIDEpOworICAgICAgICB9CisgICAgICAgIHByb3QucmVhZExpc3RFbmQoKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X3NldC5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X3NldC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNDI1MzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3Rfc2V0LmRhcnQKQEAgLTAsMCArMSwyNSBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCitjbGFzcyBUU2V0IHsKKyAgZmluYWwgaW50IGVsZW1lbnRUeXBlOworICBmaW5hbCBpbnQgbGVuZ3RoOworCisgIFRTZXQodGhpcy5lbGVtZW50VHlwZSwgdGhpcy5sZW5ndGgpOworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X3N0cnVjdC5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy9wcm90b2NvbC90X3N0cnVjdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMDNmNjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3Rfc3RydWN0LmRhcnQKQEAgLTAsMCArMSwyNCBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCitjbGFzcyBUU3RydWN0IHsKKyAgZmluYWwgU3RyaW5nIG5hbWU7CisKKyAgVFN0cnVjdChbdGhpcy5uYW1lID0gIiJdKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvcHJvdG9jb2wvdF90eXBlLmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfdHlwZS5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MTlkOTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3Byb3RvY29sL3RfdHlwZS5kYXJ0CkBAIC0wLDAgKzEsMzQgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworY2xhc3MgVFR5cGUgeworICBzdGF0aWMgY29uc3QgaW50IFNUT1AgPSAwOworICBzdGF0aWMgY29uc3QgaW50IFZPSUQgPSAxOworICBzdGF0aWMgY29uc3QgaW50IEJPT0wgPSAyOworICBzdGF0aWMgY29uc3QgaW50IEJZVEUgPSAzOworICBzdGF0aWMgY29uc3QgaW50IERPVUJMRSA9IDQ7CisgIHN0YXRpYyBjb25zdCBpbnQgSTE2ID0gNjsKKyAgc3RhdGljIGNvbnN0IGludCBJMzIgPSA4OworICBzdGF0aWMgY29uc3QgaW50IEk2NCA9IDEwOworICBzdGF0aWMgY29uc3QgaW50IFNUUklORyA9IDExOworICBzdGF0aWMgY29uc3QgaW50IFNUUlVDVCA9IDEyOworICBzdGF0aWMgY29uc3QgaW50IE1BUCA9IDEzOworICBzdGF0aWMgY29uc3QgaW50IFNFVCA9IDE0OworICBzdGF0aWMgY29uc3QgaW50IExJU1QgPSAxNTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvc2VyaWFsaXplci90X2Rlc2VyaWFsaXplci5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy9zZXJpYWxpemVyL3RfZGVzZXJpYWxpemVyLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQxZDEzOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvc2VyaWFsaXplci90X2Rlc2VyaWFsaXplci5kYXJ0CkBAIC0wLDAgKzEsNTAgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworY2xhc3MgVERlc2VyaWFsaXplciB7CisgIGZpbmFsIG1lc3NhZ2UgPSBuZXcgVE1lc3NhZ2UoJ0Rlc2VyaWFsaXplcicsIFRNZXNzYWdlVHlwZS5PTkVXQVksIDEpOworICBUQnVmZmVyZWRUcmFuc3BvcnQgdHJhbnNwb3J0OworICBUUHJvdG9jb2wgcHJvdG9jb2w7CisKKyAgVERlc2VyaWFsaXplcih7VFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3Rvcnl9KSB7CisgICAgdGhpcy50cmFuc3BvcnQgPSBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KCk7CisgICAgCisgICAgaWYgKHByb3RvY29sRmFjdG9yeSA9PSBudWxsKSB7CisgICAgICAgIHByb3RvY29sRmFjdG9yeSA9IG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCk7CisgICAgfQorICAgIAorICAgIHRoaXMucHJvdG9jb2wgPSBwcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2wodGhpcy50cmFuc3BvcnQpOworICB9CisKKyAgdm9pZCByZWFkKFRCYXNlIGJhc2UsIFVpbnQ4TGlzdCBkYXRhKSB7CisgICAgdHJhbnNwb3J0LndyaXRlQWxsKGRhdGEpOworICAgIAorICAgIHRyYW5zcG9ydC5mbHVzaCgpOworICAgIAorICAgIGJhc2UucmVhZChwcm90b2NvbCk7CisgIH0KKworICB2b2lkIHJlYWRTdHJpbmcoVEJhc2UgYmFzZSwgU3RyaW5nIGRhdGEpIHsKKyAgICB0cmFuc3BvcnQud3JpdGVBbGwoQkFTRTY0LmRlY29kZShkYXRhKSk7CisgICAgCisgICAgdHJhbnNwb3J0LmZsdXNoKCk7CisKKyAgICBiYXNlLnJlYWQocHJvdG9jb2wpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3NlcmlhbGl6ZXIvdF9zZXJpYWxpemVyLmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3NlcmlhbGl6ZXIvdF9zZXJpYWxpemVyLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBkZGI2ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvc2VyaWFsaXplci90X3NlcmlhbGl6ZXIuZGFydApAQCAtMCwwICsxLDQ4IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKK2NsYXNzIFRTZXJpYWxpemVyIHsKKyAgZmluYWwgbWVzc2FnZSA9IG5ldyBUTWVzc2FnZSgnU2VyaWFsaXplcicsIFRNZXNzYWdlVHlwZS5PTkVXQVksIDEpOworICBUQnVmZmVyZWRUcmFuc3BvcnQgdHJhbnNwb3J0OworICBUUHJvdG9jb2wgcHJvdG9jb2w7CisKKyAgVFNlcmlhbGl6ZXIoe1RQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5fSkgeworICAgIHRoaXMudHJhbnNwb3J0ID0gbmV3IFRCdWZmZXJlZFRyYW5zcG9ydCgpOworICAgIAorICAgIGlmIChwcm90b2NvbEZhY3RvcnkgPT0gbnVsbCkgeworICAgICAgcHJvdG9jb2xGYWN0b3J5ID0gbmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKTsKKyAgICB9CisKKyAgICB0aGlzLnByb3RvY29sID0gcHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKHRoaXMudHJhbnNwb3J0KTsKKyAgfQorCisgIFVpbnQ4TGlzdCB3cml0ZShUQmFzZSBiYXNlKSB7CisgICAgYmFzZS53cml0ZShwcm90b2NvbCk7CisgICAgCisgICAgcmV0dXJuIHRyYW5zcG9ydC5jb25zdW1lV3JpdGVCdWZmZXIoKTsKKyAgfQorCisgIFN0cmluZyB3cml0ZVN0cmluZyhUQmFzZSBiYXNlKSB7CisgICAgYmFzZS53cml0ZShwcm90b2NvbCk7CisgICAgCisgICAgVWludDhMaXN0IGJ5dGVzID0gdHJhbnNwb3J0LmNvbnN1bWVXcml0ZUJ1ZmZlcigpOworICAgIAorICAgIHJldHVybiBCQVNFNjQuZW5jb2RlKGJ5dGVzKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy90X2FwcGxpY2F0aW9uX2Vycm9yLmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3RfYXBwbGljYXRpb25fZXJyb3IuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjhhYmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy90X2FwcGxpY2F0aW9uX2Vycm9yLmRhcnQKQEAgLTAsMCArMSwxMDQgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworY2xhc3MgVEFwcGxpY2F0aW9uRXJyb3JUeXBlIHsKKyAgc3RhdGljIGNvbnN0IGludCBVTktOT1dOID0gMDsKKyAgc3RhdGljIGNvbnN0IGludCBVTktOT1dOX01FVEhPRCA9IDE7CisgIHN0YXRpYyBjb25zdCBpbnQgSU5WQUxJRF9NRVNTQUdFX1RZUEUgPSAyOworICBzdGF0aWMgY29uc3QgaW50IFdST05HX01FVEhPRF9OQU1FID0gMzsKKyAgc3RhdGljIGNvbnN0IGludCBCQURfU0VRVUVOQ0VfSUQgPSA0OworICBzdGF0aWMgY29uc3QgaW50IE1JU1NJTkdfUkVTVUxUID0gNTsKKyAgc3RhdGljIGNvbnN0IGludCBJTlRFUk5BTF9FUlJPUiA9IDY7CisgIHN0YXRpYyBjb25zdCBpbnQgUFJPVE9DT0xfRVJST1IgPSA3OworICBzdGF0aWMgY29uc3QgaW50IElOVkFMSURfVFJBTlNGT1JNID0gODsKKyAgc3RhdGljIGNvbnN0IGludCBJTlZBTElEX1BST1RPQ09MID0gOTsKKyAgc3RhdGljIGNvbnN0IGludCBVTlNVUFBPUlRFRF9DTElFTlRfVFlQRSA9IDEwOworfQorCitjbGFzcyBUQXBwbGljYXRpb25FcnJvciBleHRlbmRzIFRFcnJvciB7CisgIHN0YXRpYyBmaW5hbCBUU3RydWN0IF9zdHJ1Y3QgPSBuZXcgVFN0cnVjdCgiVEFwcGxpY2F0aW9uRXJyb3IiKTsKKyAgc3RhdGljIGNvbnN0IGludCBNRVNTQUdFID0gMTsKKyAgc3RhdGljIGZpbmFsIFRGaWVsZCBfbWVzc2FnZUZpZWxkID0KKyAgICAgIG5ldyBURmllbGQoIm1lc3NhZ2UiLCBUVHlwZS5TVFJJTkcsIE1FU1NBR0UpOworICBzdGF0aWMgY29uc3QgaW50IFRZUEUgPSAyOworICBzdGF0aWMgZmluYWwgVEZpZWxkIF90eXBlRmllbGQgPSBuZXcgVEZpZWxkKCJ0eXBlIiwgVFR5cGUuSTMyLCBUWVBFKTsKKworICBUQXBwbGljYXRpb25FcnJvcigKKyAgICAgIFtpbnQgdHlwZSA9IFRBcHBsaWNhdGlvbkVycm9yVHlwZS5VTktOT1dOLCBTdHJpbmcgbWVzc2FnZSA9ICIiXSkKKyAgICAgIDogc3VwZXIodHlwZSwgbWVzc2FnZSk7CisKKyAgc3RhdGljIFRBcHBsaWNhdGlvbkVycm9yIHJlYWQoVFByb3RvY29sIGlwcm90KSB7CisgICAgVEZpZWxkIGZpZWxkOworCisgICAgU3RyaW5nIG1lc3NhZ2UgPSBudWxsOworICAgIGludCB0eXBlID0gVEFwcGxpY2F0aW9uRXJyb3JUeXBlLlVOS05PV047CisKKyAgICBpcHJvdC5yZWFkU3RydWN0QmVnaW4oKTsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgZmllbGQgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpOworCisgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5TVE9QKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBzd2l0Y2ggKGZpZWxkLmlkKSB7CisgICAgICAgIGNhc2UgTUVTU0FHRToKKyAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5TVFJJTkcpIHsKKyAgICAgICAgICAgIG1lc3NhZ2UgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVFlQRToKKyAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5JMzIpIHsKKyAgICAgICAgICAgIHR5cGUgPSBpcHJvdC5yZWFkSTMyKCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlwcm90LnJlYWRGaWVsZEVuZCgpOworICAgIH0KKyAgICBpcHJvdC5yZWFkU3RydWN0RW5kKCk7CisKKyAgICByZXR1cm4gbmV3IFRBcHBsaWNhdGlvbkVycm9yKHR5cGUsIG1lc3NhZ2UpOworICB9CisKKyAgd3JpdGUoVFByb3RvY29sIG9wcm90KSB7CisgICAgb3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihfc3RydWN0KTsKKworICAgIGlmIChtZXNzYWdlICE9IG51bGwgJiYgIW1lc3NhZ2UuaXNFbXB0eSkgeworICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKF9tZXNzYWdlRmllbGQpOworICAgICAgb3Byb3Qud3JpdGVTdHJpbmcobWVzc2FnZSk7CisgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgfQorCisgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKF90eXBlRmllbGQpOworICAgIG9wcm90LndyaXRlSTMyKHR5cGUpOworICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKworICAgIG9wcm90LndyaXRlRmllbGRTdG9wKCk7CisgICAgb3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy90X2Jhc2UuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvdF9iYXNlLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU1NzFiNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvdF9iYXNlLmRhcnQKQEAgLTAsMCArMSwzNyBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCithYnN0cmFjdCBjbGFzcyBUQmFzZSB7CisgIC8vLyBSZWFkcyB0aGUgVE9iamVjdCBmcm9tIHRoZSBnaXZlbiBpbnB1dCBwcm90b2NvbC4KKyAgdm9pZCByZWFkKFRQcm90b2NvbCBpcHJvdCk7CisKKyAgLy8vIFdyaXRlcyB0aGUgb2JqZWN0cyBvdXQgdG8gdGhlIFtvcHJvdF0gcHJvdG9jb2wuCisgIHZvaWQgd3JpdGUoVFByb3RvY29sIG9wcm90KTsKKworICAvLy8gQ2hlY2sgaWYgYSBmaWVsZCBpcyBjdXJyZW50bHkgc2V0IG9yIHVuc2V0LCB1c2luZyB0aGUgW2ZpZWxkSWRdLgorICBib29sIGlzU2V0KGludCBmaWVsZElkKTsKKworICAvLy8gR2V0IGEgZmllbGQncyB2YWx1ZSBieSBbZmllbGRJZF0uIFByaW1pdGl2ZSB0eXBlcyB3aWxsIGJlIHdyYXBwZWQgaW4gdGhlCisgIC8vLyBhcHByb3ByaWF0ZSAiYm94ZWQiIHR5cGVzLgorICBnZXRGaWVsZFZhbHVlKGludCBmaWVsZElkKTsKKworICAvLy8gU2V0IGEgZmllbGQncyB2YWx1ZSBieSBbZmllbGRJZF0uIFByaW1pdGl2ZSB0eXBlcyBtdXN0IGJlICJib3hlZCIgaW4gdGhlCisgIC8vLyBhcHByb3ByaWF0ZSBvYmplY3Qgd3JhcHBlciB0eXBlLgorICBzZXRGaWVsZFZhbHVlKGludCBmaWVsZElkLCBPYmplY3QgdmFsdWUpOworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy90X2Vycm9yLmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3RfZXJyb3IuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2FiNzMyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy90X2Vycm9yLmRhcnQKQEAgLTAsMCArMSwyNyBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCitjbGFzcyBURXJyb3IgZXh0ZW5kcyBFcnJvciB7CisgIGZpbmFsIFN0cmluZyBtZXNzYWdlOworICBmaW5hbCBpbnQgdHlwZTsKKworICBURXJyb3IodGhpcy50eXBlLCB0aGlzLm1lc3NhZ2UpOworCisgIFN0cmluZyB0b1N0cmluZygpID0+ICI8VEVycm9yIHR5cGU6ICR0eXBlIG1lc3NhZ2U6ICckbWVzc2FnZSc+IjsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvdF9wcm9jZXNzb3IuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvdF9wcm9jZXNzb3IuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2YyMGZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy90X3Byb2Nlc3Nvci5kYXJ0CkBAIC0wLDAgKzEsMjQgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworLy8vIEEgcHJvY2Vzc29yIGlzIGEgZ2VuZXJpYyBvYmplY3Qgd2hpY2ggb3BlcmF0ZXMgdXBvbiBhbiBpbnB1dCBzdHJlYW0gYW5kCisvLy8gd3JpdGVzIHRvIHNvbWUgb3V0cHV0IHN0cmVhbS4KK2Fic3RyYWN0IGNsYXNzIFRQcm9jZXNzb3IgeworICBib29sIHByb2Nlc3MoVFByb3RvY29sIGlucHV0LCBUUHJvdG9jb2wgb3V0cHV0KTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3RfYnVmZmVyZWRfdHJhbnNwb3J0LmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X2J1ZmZlcmVkX3RyYW5zcG9ydC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3M2EzMGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X2J1ZmZlcmVkX3RyYW5zcG9ydC5kYXJ0CkBAIC0wLDAgKzEsOTggQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworLy8vIEJ1ZmZlcmVkIGltcGxlbWVudGF0aW9uIG9mIFtUVHJhbnNwb3J0XS4KK2NsYXNzIFRCdWZmZXJlZFRyYW5zcG9ydCBleHRlbmRzIFRUcmFuc3BvcnQgeworICBmaW5hbCBMaXN0PGludD4gX3dyaXRlQnVmZmVyID0gW107CisgIEl0ZXJhdG9yPGludD4gX3JlYWRJdGVyYXRvcjsKKworICBVaW50OExpc3QgY29uc3VtZVdyaXRlQnVmZmVyKCkgeworICAgIFVpbnQ4TGlzdCBidWZmZXIgPSBuZXcgVWludDhMaXN0LmZyb21MaXN0KF93cml0ZUJ1ZmZlcik7CisgICAgX3dyaXRlQnVmZmVyLmNsZWFyKCk7CisgICAgcmV0dXJuIGJ1ZmZlcjsKKyAgfQorCisgIHZvaWQgX3NldFJlYWRCdWZmZXIoVWludDhMaXN0IHJlYWRCdWZmZXIpIHsKKyAgICBfcmVhZEl0ZXJhdG9yID0gcmVhZEJ1ZmZlciAhPSBudWxsID8gcmVhZEJ1ZmZlci5pdGVyYXRvciA6IG51bGw7CisgIH0KKworICB2b2lkIF9yZXNldCh7Ym9vbCBpc09wZW46IGZhbHNlfSkgeworICAgIF9pc09wZW4gPSBpc09wZW47CisgICAgX3dyaXRlQnVmZmVyLmNsZWFyKCk7CisgICAgX3JlYWRJdGVyYXRvciA9IG51bGw7CisgIH0KKworICBib29sIGdldCBoYXNSZWFkRGF0YSA9PiBfcmVhZEl0ZXJhdG9yICE9IG51bGw7CisKKyAgYm9vbCBfaXNPcGVuOworICBib29sIGdldCBpc09wZW4gPT4gX2lzT3BlbjsKKworICBGdXR1cmUgb3BlbigpIGFzeW5jIHsKKyAgICBfcmVzZXQoaXNPcGVuOiB0cnVlKTsKKyAgfQorCisgIEZ1dHVyZSBjbG9zZSgpIGFzeW5jIHsKKyAgICBfcmVzZXQoaXNPcGVuOiBmYWxzZSk7CisgIH0KKworICBpbnQgcmVhZChVaW50OExpc3QgYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7CisgICAgaWYgKGJ1ZmZlciA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci5ub3ROdWxsKCJidWZmZXIiKTsKKyAgICB9CisKKyAgICBpZiAob2Zmc2V0ICsgbGVuZ3RoID4gYnVmZmVyLmxlbmd0aCkgeworICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIlRoZSByYW5nZSBleGNlZWRzIHRoZSBidWZmZXIgbGVuZ3RoIik7CisgICAgfQorCisgICAgaWYgKF9yZWFkSXRlcmF0b3IgPT0gbnVsbCB8fCBsZW5ndGggPD0gMCkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaW50IGkgPSAwOworICAgIHdoaWxlIChpIDwgbGVuZ3RoICYmIF9yZWFkSXRlcmF0b3IubW92ZU5leHQoKSkgeworICAgICAgYnVmZmVyW29mZnNldCArIGldID0gX3JlYWRJdGVyYXRvci5jdXJyZW50OworICAgICAgaSsrOworICAgIH0KKworICAgIC8vIGNsZWFudXAgaXRlcmF0b3Igd2hlbiB3ZSd2ZSByZWFjaGVkIHRoZSBlbmQKKyAgICBpZiAoX3JlYWRJdGVyYXRvci5jdXJyZW50ID09IG51bGwpIHsKKyAgICAgIF9yZWFkSXRlcmF0b3IgPSBudWxsOworICAgIH0KKworICAgIHJldHVybiBpOworICB9CisKKyAgdm9pZCB3cml0ZShVaW50OExpc3QgYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7CisgICAgaWYgKGJ1ZmZlciA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci5ub3ROdWxsKCJidWZmZXIiKTsKKyAgICB9CisKKyAgICBpZiAob2Zmc2V0ICsgbGVuZ3RoID4gYnVmZmVyLmxlbmd0aCkgeworICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIlRoZSByYW5nZSBleGNlZWRzIHRoZSBidWZmZXIgbGVuZ3RoIik7CisgICAgfQorCisgICAgX3dyaXRlQnVmZmVyLmFkZEFsbChidWZmZXIuc3VibGlzdChvZmZzZXQsIG9mZnNldCArIGxlbmd0aCkpOworICB9CisKKyAgRnV0dXJlIGZsdXNoKCkgeworICAgIF9yZWFkSXRlcmF0b3IgPSBjb25zdW1lV3JpdGVCdWZmZXIoKS5pdGVyYXRvcjsKKworICAgIHJldHVybiBuZXcgRnV0dXJlLnZhbHVlKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3RfZnJhbWVkX3RyYW5zcG9ydC5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF9mcmFtZWRfdHJhbnNwb3J0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVmMDNmNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3RfZnJhbWVkX3RyYW5zcG9ydC5kYXJ0CkBAIC0wLDAgKzEsMTY5IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKKy8vLyBGcmFtZWQgW1RUcmFuc3BvcnRdLgorLy8vCisvLy8gQWRhcHRlZCBmcm9tIHRoZSBKYXZhIEZyYW1lZCB0cmFuc3BvcnQuCitjbGFzcyBURnJhbWVkVHJhbnNwb3J0IGV4dGVuZHMgVEJ1ZmZlcmVkVHJhbnNwb3J0IHsKKyAgc3RhdGljIGNvbnN0IGludCBoZWFkZXJCeXRlQ291bnQgPSA0OworCisgIGZpbmFsIFRUcmFuc3BvcnQgX3RyYW5zcG9ydDsKKworICBmaW5hbCBVaW50OExpc3QgX2hlYWRlckJ5dGVzID0gbmV3IFVpbnQ4TGlzdChoZWFkZXJCeXRlQ291bnQpOworICBpbnQgX3JlY2VpdmVkSGVhZGVyQnl0ZXMgPSAwOworCisgIGludCBfYm9keVNpemUgPSAwOworICBVaW50OExpc3QgX2JvZHkgPSBudWxsOworICBpbnQgX3JlY2VpdmVkQm9keUJ5dGVzID0gMDsKKworICBDb21wbGV0ZXI8VWludDhMaXN0PiBfZnJhbWVDb21wbGV0ZXIgPSBudWxsOworCisgIFRGcmFtZWRUcmFuc3BvcnQoVFRyYW5zcG9ydCB0cmFuc3BvcnQpIDogX3RyYW5zcG9ydCA9IHRyYW5zcG9ydCB7CisgICAgaWYgKHRyYW5zcG9ydCA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci5ub3ROdWxsKCJ0cmFuc3BvcnQiKTsKKyAgICB9CisgIH0KKworICBib29sIGdldCBpc09wZW4gPT4gX3RyYW5zcG9ydC5pc09wZW47CisKKyAgRnV0dXJlIG9wZW4oKSB7CisgICAgX3Jlc2V0KGlzT3BlbjogdHJ1ZSk7CisgICAgcmV0dXJuIF90cmFuc3BvcnQub3BlbigpOworICB9CisKKyAgRnV0dXJlIGNsb3NlKCkgeworICAgIF9yZXNldChpc09wZW46IGZhbHNlKTsKKyAgICByZXR1cm4gX3RyYW5zcG9ydC5jbG9zZSgpOworICB9CisKKyAgaW50IHJlYWQoVWludDhMaXN0IGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgeworICAgIGlmIChoYXNSZWFkRGF0YSkgeworICAgICAgaW50IGdvdCA9IHN1cGVyLnJlYWQoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgICBpZiAoZ290ID4gMCkgcmV0dXJuIGdvdDsKKyAgICB9CisKKyAgICAvLyBJTVBPUlRBTlQ6IGJ5IHRoZSB0aW1lIHlvdSd2ZSBnb3QgaGVyZSwKKyAgICAvLyBhbiBlbnRpcmUgZnJhbWUgaXMgYXZhaWxhYmxlIGZvciByZWFkaW5nCisKKyAgICByZXR1cm4gc3VwZXIucmVhZChidWZmZXIsIG9mZnNldCwgbGVuZ3RoKTsKKyAgfQorCisgIHZvaWQgX3JlYWRGcmFtZSgpIHsKKyAgICBpZiAoX2JvZHkgPT0gbnVsbCkgeworICAgICAgYm9vbCBnb3RGdWxsSGVhZGVyID0gX3JlYWRGcmFtZUhlYWRlcigpOworICAgICAgaWYgKCFnb3RGdWxsSGVhZGVyKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBfcmVhZEZyYW1lQm9keSgpOworICB9CisKKyAgYm9vbCBfcmVhZEZyYW1lSGVhZGVyKCkgeworICAgIHZhciByZW1haW5pbmdIZWFkZXJCeXRlcyA9IGhlYWRlckJ5dGVDb3VudCAtIF9yZWNlaXZlZEhlYWRlckJ5dGVzOworCisgICAgaW50IGdvdCA9IF90cmFuc3BvcnQucmVhZChfaGVhZGVyQnl0ZXMsIF9yZWNlaXZlZEhlYWRlckJ5dGVzLCByZW1haW5pbmdIZWFkZXJCeXRlcyk7CisgICAgaWYgKGdvdCA8IDApIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXJyb3IoCisgICAgICAgICAgVFRyYW5zcG9ydEVycm9yVHlwZS5VTktOT1dOLCAiU29ja2V0IGNsb3NlZCBkdXJpbmcgZnJhbWUgaGVhZGVyIHJlYWQiKTsKKyAgICB9CisKKyAgICBfcmVjZWl2ZWRIZWFkZXJCeXRlcyArPSBnb3Q7CisKKyAgICBpZiAoX3JlY2VpdmVkSGVhZGVyQnl0ZXMgPT0gaGVhZGVyQnl0ZUNvdW50KSB7CisgICAgICBpbnQgc2l6ZSA9IF9oZWFkZXJCeXRlcy5idWZmZXIuYXNCeXRlRGF0YSgpLmdldFVpbnQzMigwKTsKKworICAgICAgX3JlY2VpdmVkSGVhZGVyQnl0ZXMgPSAwOworCisgICAgICBpZiAoc2l6ZSA8IDApIHsKKyAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFcnJvcigKKyAgICAgICAgICAgIFRUcmFuc3BvcnRFcnJvclR5cGUuVU5LTk9XTiwgIlJlYWQgYSBuZWdhdGl2ZSBmcmFtZSBzaXplOiAkc2l6ZSIpOworICAgICAgfQorCisgICAgICBfYm9keVNpemUgPSBzaXplOworICAgICAgX2JvZHkgPSBuZXcgVWludDhMaXN0KF9ib2R5U2l6ZSk7CisgICAgICBfcmVjZWl2ZWRCb2R5Qnl0ZXMgPSAwOworCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgX3JlZ2lzdGVyRm9yUmVhZGFibGVCeXRlcygpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIHZvaWQgX3JlYWRGcmFtZUJvZHkoKSB7CisgICAgdmFyIHJlbWFpbmluZ0JvZHlCeXRlcyA9IF9ib2R5U2l6ZSAtIF9yZWNlaXZlZEJvZHlCeXRlczsKKworICAgIGludCBnb3QgPSBfdHJhbnNwb3J0LnJlYWQoX2JvZHksIF9yZWNlaXZlZEJvZHlCeXRlcywgcmVtYWluaW5nQm9keUJ5dGVzKTsKKyAgICBpZiAoZ290IDwgMCkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFcnJvcigKKyAgICAgICAgICBUVHJhbnNwb3J0RXJyb3JUeXBlLlVOS05PV04sICJTb2NrZXQgY2xvc2VkIGR1cmluZyBmcmFtZSBib2R5IHJlYWQiKTsKKyAgICB9CisKKyAgICBfcmVjZWl2ZWRCb2R5Qnl0ZXMgKz0gZ290OworCisgICAgaWYgKF9yZWNlaXZlZEJvZHlCeXRlcyA9PSBfYm9keVNpemUpIHsKKyAgICAgIHZhciBib2R5ID0gX2JvZHk7CisKKyAgICAgIF9ib2R5U2l6ZSA9IDA7CisgICAgICBfYm9keSA9IG51bGw7CisgICAgICBfcmVjZWl2ZWRCb2R5Qnl0ZXMgPSAwOworCisgICAgICBfc2V0UmVhZEJ1ZmZlcihib2R5KTsKKworICAgICAgdmFyIGNvbXBsZXRlciA9IF9mcmFtZUNvbXBsZXRlcjsKKyAgICAgIF9mcmFtZUNvbXBsZXRlciA9IG51bGw7CisgICAgICBjb21wbGV0ZXIuY29tcGxldGUobmV3IFVpbnQ4TGlzdCgwKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIF9yZWdpc3RlckZvclJlYWRhYmxlQnl0ZXMoKTsKKyAgICB9CisgIH0KKworICBGdXR1cmUgZmx1c2goKSB7CisgICAgaWYgKF9mcmFtZUNvbXBsZXRlciA9PSBudWxsKSB7CisgICAgICBVaW50OExpc3QgYnVmZmVyID0gY29uc3VtZVdyaXRlQnVmZmVyKCk7CisgICAgICBpbnQgbGVuZ3RoID0gYnVmZmVyLmxlbmd0aDsKKworICAgICAgX2hlYWRlckJ5dGVzLmJ1ZmZlci5hc0J5dGVEYXRhKCkuc2V0VWludDMyKDAsIGxlbmd0aCk7CisgICAgICBfdHJhbnNwb3J0LndyaXRlKF9oZWFkZXJCeXRlcywgMCwgaGVhZGVyQnl0ZUNvdW50KTsKKyAgICAgIF90cmFuc3BvcnQud3JpdGUoYnVmZmVyLCAwLCBsZW5ndGgpOworCisgICAgICBfZnJhbWVDb21wbGV0ZXIgID0gbmV3IENvbXBsZXRlcjxVaW50OExpc3Q+KCk7CisgICAgICBfcmVnaXN0ZXJGb3JSZWFkYWJsZUJ5dGVzKCk7CisgICAgfQorCisgICAgcmV0dXJuIF9mcmFtZUNvbXBsZXRlci5mdXR1cmU7CisgIH0KKworICB2b2lkIF9yZWdpc3RlckZvclJlYWRhYmxlQnl0ZXMoKSB7CisgICAgX3RyYW5zcG9ydC5mbHVzaCgpLnRoZW4oKF8pIHsKKyAgICAgIF9yZWFkRnJhbWUoKTsKKyAgICB9KS5jYXRjaEVycm9yKChlKSB7CisgICAgICB2YXIgY29tcGxldGVyID0gX2ZyYW1lQ29tcGxldGVyOworCisgICAgICBfcmVjZWl2ZWRIZWFkZXJCeXRlcyA9IDA7CisgICAgICBfYm9keVNpemUgPSAwOworICAgICAgX2JvZHkgPSBudWxsOworICAgICAgX3JlY2VpdmVkQm9keUJ5dGVzID0gMDsKKyAgICAgIF9mcmFtZUNvbXBsZXRlciA9IG51bGw7CisKKyAgICAgIGNvbXBsZXRlci5jb21wbGV0ZUVycm9yKGUpOworICAgIH0pOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X2h0dHBfdHJhbnNwb3J0LmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X2h0dHBfdHJhbnNwb3J0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE3OGU5YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3RfaHR0cF90cmFuc3BvcnQuZGFydApAQCAtMCwwICsxLDEwMCBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhcnQgb2YgdGhyaWZ0OworCisvLy8gSFRUUCBpbXBsZW1lbnRhdGlvbiBvZiBbVFRyYW5zcG9ydF0uCisvLy8KKy8vLyBGb3IgZXhhbXBsZToKKy8vLworLy8vICAgICB2YXIgdHJhbnNwb3J0ID0gbmV3IFRIdHRwQ2xpZW50VHJhbnNwb3J0KG5ldyBCcm93c2VyQ2xpZW50KCksCisvLy8gICAgICAgICBuZXcgVEh0dHBDb25maWcodXJsLCB7J1gtTXktQ3VzdG9tLUhlYWRlcic6ICdteSB2YWx1ZSd9KSk7CisvLy8gICAgIHZhciBwcm90b2NvbCA9IG5ldyBUSnNvblByb3RvY29sKHRyYW5zcG9ydCk7CisvLy8gICAgIHZhciBjbGllbnQgPSBuZXcgTXlUaHJpZnRTZXJ2aWNlQ2xpZW50KHByb3RvY29sKTsKKy8vLyAgICAgdmFyIHJlc3VsdCA9IGNsaWVudC5teU1ldGhvZCgpOworLy8vCisvLy8gQWRhcHRlZCBmcm9tIHRoZSBKUyBYSFIgSFRUUCB0cmFuc3BvcnQuCitjbGFzcyBUSHR0cENsaWVudFRyYW5zcG9ydCBleHRlbmRzIFRCdWZmZXJlZFRyYW5zcG9ydCB7CisgIGZpbmFsIENsaWVudCBodHRwQ2xpZW50OworICBmaW5hbCBUSHR0cENvbmZpZyBjb25maWc7CisKKyAgVEh0dHBDbGllbnRUcmFuc3BvcnQodGhpcy5odHRwQ2xpZW50LCB0aGlzLmNvbmZpZykgeworICAgIGlmIChodHRwQ2xpZW50ID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yLm5vdE51bGwoImh0dHBDbGllbnQiKTsKKyAgICB9CisgIH0KKworICBGdXR1cmUgY2xvc2UoKSBhc3luYyB7CisgICAgX3Jlc2V0KGlzT3BlbjogZmFsc2UpOworICAgIGh0dHBDbGllbnQuY2xvc2UoKTsKKyAgfQorCisgIEZ1dHVyZSBmbHVzaCgpIHsKKyAgICB2YXIgcmVxdWVzdEJvZHkgPSBCQVNFNjQuZW5jb2RlKGNvbnN1bWVXcml0ZUJ1ZmZlcigpKTsKKworICAgIC8vIFVzZSBhIHN5bmMgY29tcGxldGVyIHRvIGVuc3VyZSB0aGF0IHRoZSBidWZmZXIgY2FuIGJlIHJlYWQgaW1tZWRpYXRlbHkKKyAgICAvLyBhZnRlciB0aGUgcmVhZCBidWZmZXIgaXMgc2V0LCBhbmQgYXZvaWQgYSByYWNlIGNvbmRpdGlvbiB3aGVyZSBhbm90aGVyCisgICAgLy8gcmVzcG9uc2UgY291bGQgb3ZlcndyaXRlIHRoZSByZWFkIGJ1ZmZlci4KKyAgICB2YXIgY29tcGxldGVyID0gbmV3IENvbXBsZXRlci5zeW5jKCk7CisKKyAgICBodHRwQ2xpZW50CisgICAgICAgIC5wb3N0KGNvbmZpZy51cmwsIGhlYWRlcnM6IGNvbmZpZy5oZWFkZXJzLCBib2R5OiByZXF1ZXN0Qm9keSkKKyAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSB7CisgICAgICBVaW50OExpc3QgZGF0YTsKKyAgICAgIHRyeSB7CisgICAgICAgIGRhdGEgPSBuZXcgVWludDhMaXN0LmZyb21MaXN0KAorICAgICAgICAgICAgQkFTRTY0LmRlY29kZShyZXNwb25zZS5ib2R5KSk7CisgICAgICB9IG9uIEZvcm1hdEV4Y2VwdGlvbiBjYXRjaCAoXykgeworICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXJyb3IoVFByb3RvY29sRXJyb3JUeXBlLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICJFeHBlY3RlZCBhIEJhc2UgNjQgZW5jb2RlZCBzdHJpbmcuIik7CisgICAgICB9CisKKyAgICAgIF9zZXRSZWFkQnVmZmVyKGRhdGEpOworICAgICAgY29tcGxldGVyLmNvbXBsZXRlKCk7CisgICAgfSk7CisKKyAgICByZXR1cm4gY29tcGxldGVyLmZ1dHVyZTsKKyAgfQorfQorCitjbGFzcyBUSHR0cENvbmZpZyB7CisgIGZpbmFsIFVyaSB1cmw7CisKKyAgTWFwPFN0cmluZywgU3RyaW5nPiBfaGVhZGVyczsKKyAgTWFwPFN0cmluZywgU3RyaW5nPiBnZXQgaGVhZGVycyA9PiBfaGVhZGVyczsKKworICBUSHR0cENvbmZpZyh0aGlzLnVybCwgTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzKSB7CisgICAgaWYgKHVybCA9PSBudWxsIHx8ICF1cmwuaGFzQXV0aG9yaXR5KSB7CisgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiSW52YWxpZCB1cmwiKTsKKyAgICB9CisKKyAgICBfaW5pdEhlYWRlcnMoaGVhZGVycyk7CisgIH0KKworICB2b2lkIF9pbml0SGVhZGVycyhNYXA8U3RyaW5nLCBTdHJpbmc+IGluaXRpYWwpIHsKKyAgICB2YXIgaCA9IHt9OworCisgICAgaWYgKGluaXRpYWwgIT0gbnVsbCkgeworICAgICAgaC5hZGRBbGwoaW5pdGlhbCk7CisgICAgfQorCisgICAgaFsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24veC10aHJpZnQnOworICAgIGhbJ0FjY2VwdCddID0gJ2FwcGxpY2F0aW9uL3gtdGhyaWZ0JzsKKworICAgIF9oZWFkZXJzID0gbmV3IE1hcC51bm1vZGlmaWFibGUoaCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3RfbWVzc2FnZV9yZWFkZXIuZGFydCBiL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3RfbWVzc2FnZV9yZWFkZXIuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2EwNzA4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF9tZXNzYWdlX3JlYWRlci5kYXJ0CkBAIC0wLDAgKzEsOTkgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworLy8vIFtUTWVzc2FnZVJlYWRlcl0gZXh0cmFjdHMgYSBbVE1lc3NhZ2VdIGZyb20gYnl0ZXMuICBUaGlzIGlzIHVzZWQgdG8gYWxsb3cgYQorLy8vIHRyYW5zcG9ydCB0byBpbnNwZWN0IHRoZSBtZXNzYWdlIHNlcWlkIGFuZCBtYXAgcmVzcG9uc2VzIHRvIHJlcXVlc3RzLgorY2xhc3MgVE1lc3NhZ2VSZWFkZXIgeworICBmaW5hbCBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeTsKKworICBmaW5hbCBpbnQgYnl0ZU9mZnNldDsKKyAgZmluYWwgX1RNZXNzYWdlUmVhZGVyVHJhbnNwb3J0IF90cmFuc3BvcnQ7CisKKyAgLy8vIENvbnN0cnVjdCBhIFtNZXNzYWdlUmVhZGVyXS4gIFRoZSBvcHRpb25hbCBbYnl0ZU9mZnNldF0gc3BlY2lmaWVzIHRoZQorICAvLy8gbnVtYmVyIG9mIGJ5dGVzIHRvIHNraXAgYmVmb3JlIHJlYWRpbmcgdGhlIFtUTWVzc2FnZV0uCisgIFRNZXNzYWdlUmVhZGVyKHRoaXMucHJvdG9jb2xGYWN0b3J5LCB7aW50IGJ5dGVPZmZzZXQ6IDB9KQorICAgICAgOiBfdHJhbnNwb3J0ID0gbmV3IF9UTWVzc2FnZVJlYWRlclRyYW5zcG9ydCgpLAorICAgICAgICB0aGlzLmJ5dGVPZmZzZXQgPSBieXRlT2Zmc2V0OworCisgIFRNZXNzYWdlIHJlYWRNZXNzYWdlKFVpbnQ4TGlzdCBieXRlcykgeworICAgIF90cmFuc3BvcnQucmVzZXQoYnl0ZXMsIGJ5dGVPZmZzZXQpOworICAgIFRQcm90b2NvbCBwcm90b2NvbCA9IHByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChfdHJhbnNwb3J0KTsKKyAgICBUTWVzc2FnZSBtZXNzYWdlID0gcHJvdG9jb2wucmVhZE1lc3NhZ2VCZWdpbigpOworICAgIF90cmFuc3BvcnQucmVzZXQobnVsbCk7CisKKyAgICByZXR1cm4gbWVzc2FnZTsKKyAgfQorfQorCisvLy8gQW4gaW50ZXJuYWwgY2xhc3MgdXNlZCB0byBzdXBwb3J0IFtUTWVzc2FnZVJlYWRlcl0uCitjbGFzcyBfVE1lc3NhZ2VSZWFkZXJUcmFuc3BvcnQgZXh0ZW5kcyBUVHJhbnNwb3J0IHsKKyAgX1RNZXNzYWdlUmVhZGVyVHJhbnNwb3J0KCk7CisKKyAgSXRlcmF0b3I8aW50PiBfcmVhZEl0ZXJhdG9yOworCisgIHZvaWQgcmVzZXQoVWludDhMaXN0IGJ5dGVzLCBbaW50IG9mZnNldCA9IDBdKSB7CisgICAgaWYgKGJ5dGVzID09IG51bGwpIHsKKyAgICAgIF9yZWFkSXRlcmF0b3IgPSBudWxsOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChvZmZzZXQgPiBieXRlcy5sZW5ndGgpIHsKKyAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJUaGUgb2Zmc2V0IGV4Y2VlZHMgdGhlIGJ5dGVzIGxlbmd0aCIpOworICAgIH0KKworICAgIF9yZWFkSXRlcmF0b3IgPSBieXRlcy5pdGVyYXRvcjsKKworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2Zmc2V0OyBpKyspIHsKKyAgICAgIF9yZWFkSXRlcmF0b3IubW92ZU5leHQoKTsKKyAgICB9CisgIH0KKworICBnZXQgaXNPcGVuID0+IHRydWU7CisKKyAgRnV0dXJlIG9wZW4oKSA9PiB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiVW5zdXBwb3J0ZWQgaW4gTWVzc2FnZVJlYWRlciIpOworCisgIEZ1dHVyZSBjbG9zZSgpID0+IHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJVbnN1cHBvcnRlZCBpbiBNZXNzYWdlUmVhZGVyIik7CisKKyAgaW50IHJlYWQoVWludDhMaXN0IGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgeworICAgIGlmIChidWZmZXIgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3Iubm90TnVsbCgiYnVmZmVyIik7CisgICAgfQorCisgICAgaWYgKG9mZnNldCArIGxlbmd0aCA+IGJ1ZmZlci5sZW5ndGgpIHsKKyAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJUaGUgcmFuZ2UgZXhjZWVkcyB0aGUgYnVmZmVyIGxlbmd0aCIpOworICAgIH0KKworICAgIGlmIChfcmVhZEl0ZXJhdG9yID09IG51bGwgfHwgbGVuZ3RoIDw9IDApIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGludCBpID0gMDsKKyAgICB3aGlsZSAoaSA8IGxlbmd0aCAmJiBfcmVhZEl0ZXJhdG9yLm1vdmVOZXh0KCkpIHsKKyAgICAgIGJ1ZmZlcltvZmZzZXQgKyBpXSA9IF9yZWFkSXRlcmF0b3IuY3VycmVudDsKKyAgICAgIGkrKzsKKyAgICB9CisKKyAgICByZXR1cm4gaTsKKyAgfQorCisgIHZvaWQgd3JpdGUoVWludDhMaXN0IGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgPT4KKyAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJVbnN1cHBvcnRlZCBpbiBNZXNzYWdlUmVhZGVyIik7CisKKyAgRnV0dXJlIGZsdXNoKCkgPT4gdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIlVuc3VwcG9ydGVkIGluIE1lc3NhZ2VSZWFkZXIiKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3Rfc29ja2V0LmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X3NvY2tldC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyZWI2YjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X3NvY2tldC5kYXJ0CkBAIC0wLDAgKzEsMzggQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworZW51bSBUU29ja2V0U3RhdGUgeyBDTE9TRUQsIE9QRU4gfQorCithYnN0cmFjdCBjbGFzcyBUU29ja2V0IHsKKyAgU3RyZWFtPFRTb2NrZXRTdGF0ZT4gZ2V0IG9uU3RhdGU7CisKKyAgU3RyZWFtPE9iamVjdD4gZ2V0IG9uRXJyb3I7CisKKyAgU3RyZWFtPFVpbnQ4TGlzdD4gZ2V0IG9uTWVzc2FnZTsKKworICBib29sIGdldCBpc09wZW47CisKKyAgYm9vbCBnZXQgaXNDbG9zZWQ7CisKKyAgRnV0dXJlIG9wZW4oKTsKKworICBGdXR1cmUgY2xvc2UoKTsKKworICB2b2lkIHNlbmQoVWludDhMaXN0IGRhdGEpOworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF9zb2NrZXRfdHJhbnNwb3J0LmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X3NvY2tldF90cmFuc3BvcnQuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDEzNzRhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF9zb2NrZXRfdHJhbnNwb3J0LmRhcnQKQEAgLTAsMCArMSwxNzcgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0IG9mIHRocmlmdDsKKworLy8vIFNvY2tldCBpbXBsZW1lbnRhdGlvbiBvZiBbVFRyYW5zcG9ydF0uCisvLy8KKy8vLyBGb3IgZXhhbXBsZToKKy8vLworLy8vICAgICB2YXIgdHJhbnNwb3J0ID0gbmV3IFRDbGllbnRTb2NrZXRUcmFuc3BvcnQobmV3IFRXZWJTb2NrZXQodXJsKSk7CisvLy8gICAgIHZhciBwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KTsKKy8vLyAgICAgdmFyIGNsaWVudCA9IG5ldyBNeVRocmlmdFNlcnZpY2VDbGllbnQocHJvdG9jb2wpOworLy8vICAgICB2YXIgcmVzdWx0ID0gY2xpZW50Lm15TWV0aG9kKCk7CisvLy8KKy8vLyBBZGFwdGVkIGZyb20gdGhlIEpTIFdlYlNvY2tldCB0cmFuc3BvcnQuCithYnN0cmFjdCBjbGFzcyBUU29ja2V0VHJhbnNwb3J0IGV4dGVuZHMgVEJ1ZmZlcmVkVHJhbnNwb3J0IHsKKyAgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IG5ldyBMb2dnZXIoJ3RocmlmdC5UU29ja2V0VHJhbnNwb3J0Jyk7CisKKyAgZmluYWwgVFNvY2tldCBzb2NrZXQ7CisKKyAgLy8vIEEgdHJhbnNwb3J0IHVzaW5nIHRoZSBwcm92aWRlZCBbc29ja2V0XS4KKyAgVFNvY2tldFRyYW5zcG9ydCh0aGlzLnNvY2tldCkgeworICAgIGlmIChzb2NrZXQgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3Iubm90TnVsbCgnc29ja2V0Jyk7CisgICAgfQorCisgICAgc29ja2V0Lm9uRXJyb3IubGlzdGVuKChlKSA9PiBsb2dnZXIud2FybmluZyhlKSk7CisgICAgc29ja2V0Lm9uTWVzc2FnZS5saXN0ZW4oaGFuZGxlSW5jb21pbmdNZXNzYWdlKTsKKyAgfQorCisgIGJvb2wgZ2V0IGlzT3BlbiA9PiBzb2NrZXQuaXNPcGVuOworCisgIEZ1dHVyZSBvcGVuKCkgeworICAgIF9yZXNldChpc09wZW46IHRydWUpOworICAgIHJldHVybiBzb2NrZXQub3BlbigpOworICB9CisKKyAgRnV0dXJlIGNsb3NlKCkgeworICAgIF9yZXNldChpc09wZW46IGZhbHNlKTsKKyAgICByZXR1cm4gc29ja2V0LmNsb3NlKCk7CisgIH0KKworICAvLy8gTWFrZSBhbiBpbmNvbWluZyBtZXNzYWdlIGF2YWlsYWJsZSB0byByZWFkIGZyb20gdGhlIHRyYW5zcG9ydC4KKyAgdm9pZCBoYW5kbGVJbmNvbWluZ01lc3NhZ2UoVWludDhMaXN0IG1lc3NhZ2VCeXRlcykgeworICAgIF9zZXRSZWFkQnVmZmVyKG1lc3NhZ2VCeXRlcyk7CisgIH0KK30KKworLy8vIFtUQ2xpZW50U29ja2V0VHJhbnNwb3J0XSBpcyBhIGJhc2ljIGNsaWVudCBzb2NrZXQgdHJhbnNwb3J0LiAgSXQgc2VuZHMKKy8vLyBvdXRnb2luZyBtZXNzYWdlcyBhbmQgZXhwZWN0cyBhIHJlc3BvbnNlLgorLy8vCisvLy8gTk9URTogVGhpcyB0cmFuc3BvcnQgZXhwZWN0cyBhIHNpbmdsZSB0aHJlYWRlZCBzZXJ2ZXIsIGFzIGl0IHdpbGwgcHJvY2VzcworLy8vIHJlc3BvbnNlcyBpbiBGSUZPIG9yZGVyLgorY2xhc3MgVENsaWVudFNvY2tldFRyYW5zcG9ydCBleHRlbmRzIFRTb2NrZXRUcmFuc3BvcnQgeworICBmaW5hbCBMaXN0PENvbXBsZXRlcjxVaW50OExpc3Q+PiBfY29tcGxldGVycyA9IFtdOworCisgIFRDbGllbnRTb2NrZXRUcmFuc3BvcnQoVFNvY2tldCBzb2NrZXQpIDogc3VwZXIoc29ja2V0KTsKKworICBGdXR1cmUgZmx1c2goKSB7CisgICAgVWludDhMaXN0IGJ5dGVzID0gY29uc3VtZVdyaXRlQnVmZmVyKCk7CisKKyAgICAvLyBVc2UgYSBzeW5jIGNvbXBsZXRlciB0byBlbnN1cmUgdGhhdCB0aGUgYnVmZmVyIGNhbiBiZSByZWFkIGltbWVkaWF0ZWx5CisgICAgLy8gYWZ0ZXIgdGhlIHJlYWQgYnVmZmVyIGlzIHNldCwgYW5kIGF2b2lkIGEgcmFjZSBjb25kaXRpb24gd2hlcmUgYW5vdGhlcgorICAgIC8vIHJlc3BvbnNlIGNvdWxkIG92ZXJ3cml0ZSB0aGUgcmVhZCBidWZmZXIuCisgICAgdmFyIGNvbXBsZXRlciA9IG5ldyBDb21wbGV0ZXI8VWludDhMaXN0Pi5zeW5jKCk7CisgICAgX2NvbXBsZXRlcnMuYWRkKGNvbXBsZXRlcik7CisKKyAgICBpZiAoYnl0ZXMubGVuZ3RoSW5CeXRlcyA+IDApIHsKKyAgICAgIHNvY2tldC5zZW5kKGJ5dGVzKTsKKyAgICB9CisKKyAgICByZXR1cm4gY29tcGxldGVyLmZ1dHVyZTsKKyAgfQorCisgIHZvaWQgaGFuZGxlSW5jb21pbmdNZXNzYWdlKFVpbnQ4TGlzdCBtZXNzYWdlQnl0ZXMpIHsKKyAgICBzdXBlci5oYW5kbGVJbmNvbWluZ01lc3NhZ2UobWVzc2FnZUJ5dGVzKTsKKworICAgIGlmIChfY29tcGxldGVycy5pc05vdEVtcHR5KSB7CisgICAgICB2YXIgY29tcGxldGVyID0gX2NvbXBsZXRlcnMucmVtb3ZlQXQoMCk7CisgICAgICBjb21wbGV0ZXIuY29tcGxldGUoKTsKKyAgICB9CisgIH0KK30KKworLy8vIFtUQXN5bmNDbGllbnRTb2NrZXRUcmFuc3BvcnRdIHNlbmRzIG91dGdvaW5nIG1lc3NhZ2VzIGFuZCBleHBlY3RzIGFuCisvLy8gYXN5bmNocm9ub3VzIHJlc3BvbnNlLgorLy8vCisvLy8gTk9URTogVGhpcyB0cmFuc3BvcnQgdXNlcyBhIFtNZXNzYWdlUmVhZGVyXSB0byByZWFkIGEgW1RNZXNzYWdlXSB3aGVuIGFuCisvLy8gaW5jb21pbmcgbWVzc2FnZSBhcnJpdmVzIHRvIGNvcnJlbGF0ZSBhIHJlc3BvbnNlIHRvIGEgcmVxdWVzdCwgdXNpbmcgdGhlCisvLy8gc2VxaWQuCitjbGFzcyBUQXN5bmNDbGllbnRTb2NrZXRUcmFuc3BvcnQgZXh0ZW5kcyBUU29ja2V0VHJhbnNwb3J0IHsKKyAgc3RhdGljIGNvbnN0IGRlZmF1bHRUaW1lb3V0ID0gY29uc3QgRHVyYXRpb24oc2Vjb25kczogMzApOworCisgIGZpbmFsIE1hcDxpbnQsIENvbXBsZXRlcjxVaW50OExpc3Q+PiBfY29tcGxldGVycyA9IHt9OworCisgIGZpbmFsIFRNZXNzYWdlUmVhZGVyIG1lc3NhZ2VSZWFkZXI7CisKKyAgZmluYWwgRHVyYXRpb24gcmVzcG9uc2VUaW1lb3V0OworCisgIFRBc3luY0NsaWVudFNvY2tldFRyYW5zcG9ydChUU29ja2V0IHNvY2tldCwgVE1lc3NhZ2VSZWFkZXIgbWVzc2FnZVJlYWRlciwKKyAgICAgIHtEdXJhdGlvbiByZXNwb25zZVRpbWVvdXQ6IGRlZmF1bHRUaW1lb3V0fSkKKyAgICAgIDogdGhpcy5tZXNzYWdlUmVhZGVyID0gbWVzc2FnZVJlYWRlciwKKyAgICAgICAgdGhpcy5yZXNwb25zZVRpbWVvdXQgPSByZXNwb25zZVRpbWVvdXQsCisgICAgICAgIHN1cGVyKHNvY2tldCk7CisKKyAgRnV0dXJlIGZsdXNoKCkgeworICAgIFVpbnQ4TGlzdCBieXRlcyA9IGNvbnN1bWVXcml0ZUJ1ZmZlcigpOworICAgIFRNZXNzYWdlIG1lc3NhZ2UgPSBtZXNzYWdlUmVhZGVyLnJlYWRNZXNzYWdlKGJ5dGVzKTsKKyAgICBpbnQgc2VxaWQgPSBtZXNzYWdlLnNlcWlkOworCisgICAgLy8gVXNlIGEgc3luYyBjb21wbGV0ZXIgdG8gZW5zdXJlIHRoYXQgdGhlIGJ1ZmZlciBjYW4gYmUgcmVhZCBpbW1lZGlhdGVseQorICAgIC8vIGFmdGVyIHRoZSByZWFkIGJ1ZmZlciBpcyBzZXQsIGFuZCBhdm9pZCBhIHJhY2UgY29uZGl0aW9uIHdoZXJlIGFub3RoZXIKKyAgICAvLyByZXNwb25zZSBjb3VsZCBvdmVyd3JpdGUgdGhlIHJlYWQgYnVmZmVyLgorICAgIHZhciBjb21wbGV0ZXIgPSBuZXcgQ29tcGxldGVyPFVpbnQ4TGlzdD4uc3luYygpOworICAgIF9jb21wbGV0ZXJzW3NlcWlkXSA9IGNvbXBsZXRlcjsKKworICAgIGlmIChyZXNwb25zZVRpbWVvdXQgIT0gbnVsbCkgeworICAgICAgbmV3IEZ1dHVyZS5kZWxheWVkKHJlc3BvbnNlVGltZW91dCwgKCkgeworICAgICAgICB2YXIgY29tcGxldGVyID0gX2NvbXBsZXRlcnMucmVtb3ZlKHNlcWlkKTsKKyAgICAgICAgaWYgKGNvbXBsZXRlciAhPSBudWxsKSB7CisgICAgICAgICAgY29tcGxldGVyLmNvbXBsZXRlRXJyb3IoCisgICAgICAgICAgICAgIG5ldyBUaW1lb3V0RXhjZXB0aW9uKCJSZXNwb25zZSB0aW1lZCBvdXQuIiwgcmVzcG9uc2VUaW1lb3V0KSk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgIH0KKworICAgIHNvY2tldC5zZW5kKGJ5dGVzKTsKKworICAgIHJldHVybiBjb21wbGV0ZXIuZnV0dXJlOworICB9CisKKyAgdm9pZCBoYW5kbGVJbmNvbWluZ01lc3NhZ2UoVWludDhMaXN0IG1lc3NhZ2VCeXRlcykgeworICAgIHN1cGVyLmhhbmRsZUluY29taW5nTWVzc2FnZShtZXNzYWdlQnl0ZXMpOworCisgICAgVE1lc3NhZ2UgbWVzc2FnZSA9IG1lc3NhZ2VSZWFkZXIucmVhZE1lc3NhZ2UobWVzc2FnZUJ5dGVzKTsKKyAgICB2YXIgY29tcGxldGVyID0gX2NvbXBsZXRlcnMucmVtb3ZlKG1lc3NhZ2Uuc2VxaWQpOworICAgIGlmIChjb21wbGV0ZXIgIT0gbnVsbCkgeworICAgICAgY29tcGxldGVyLmNvbXBsZXRlKCk7CisgICAgfQorICB9Cit9CisKKy8vLyBbVFNlcnZlclNvY2tldFRyYW5zcG9ydF0gbGlzdGVucyBmb3IgaW5jb21pbmcgbWVzc2FnZXMuICBXaGVuIGl0IHNlbmRzIGEKKy8vLyByZXNwb25zZSwgaXQgZG9lcyBub3QgZXhwZWN0IGFuIGFja25vd2xlZGdlbWVudC4KK2NsYXNzIFRTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQgZXh0ZW5kcyBUU29ja2V0VHJhbnNwb3J0IHsKKyAgZmluYWwgU3RyZWFtQ29udHJvbGxlciBfb25JbmNvbWluZ01lc3NhZ2VDb250cm9sbGVyOworICBTdHJlYW0gZ2V0IG9uSW5jb21pbmdNZXNzYWdlID0+IF9vbkluY29taW5nTWVzc2FnZUNvbnRyb2xsZXIuc3RyZWFtOworCisgIFRTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQoVFNvY2tldCBzb2NrZXQpCisgICAgICA6IF9vbkluY29taW5nTWVzc2FnZUNvbnRyb2xsZXIgPSBuZXcgU3RyZWFtQ29udHJvbGxlci5icm9hZGNhc3QoKSwKKyAgICAgICAgc3VwZXIoc29ja2V0KTsKKworICBGdXR1cmUgZmx1c2goKSBhc3luYyB7CisgICAgVWludDhMaXN0IG1lc3NhZ2UgPSBjb25zdW1lV3JpdGVCdWZmZXIoKTsKKyAgICBzb2NrZXQuc2VuZChtZXNzYWdlKTsKKyAgfQorCisgIHZvaWQgaGFuZGxlSW5jb21pbmdNZXNzYWdlKFVpbnQ4TGlzdCBtZXNzYWdlQnl0ZXMpIHsKKyAgICBzdXBlci5oYW5kbGVJbmNvbWluZ01lc3NhZ2UobWVzc2FnZUJ5dGVzKTsKKworICAgIF9vbkluY29taW5nTWVzc2FnZUNvbnRyb2xsZXIuYWRkKG51bGwpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X3RyYW5zcG9ydC5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF90cmFuc3BvcnQuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjNkNWViCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF90cmFuc3BvcnQuZGFydApAQCAtMCwwICsxLDcwIEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKK2Fic3RyYWN0IGNsYXNzIFRUcmFuc3BvcnQgeworICAvLy8gUXVlcmllcyB3aGV0aGVyIHRoZSB0cmFuc3BvcnQgaXMgb3Blbi4KKyAgLy8vIFJldHVybnMgW3RydWVdIGlmIHRoZSB0cmFuc3BvcnQgaXMgb3Blbi4KKyAgYm9vbCBnZXQgaXNPcGVuOworCisgIC8vLyBPcGVucyB0aGUgdHJhbnNwb3J0IGZvciByZWFkaW5nL3dyaXRpbmcuCisgIC8vLyBUaHJvd3MgW1RUcmFuc3BvcnRFcnJvcl0gaWYgdGhlIHRyYW5zcG9ydCBjb3VsZCBub3QgYmUgb3BlbmVkLgorICBGdXR1cmUgb3BlbigpOworCisgIC8vLyBDbG9zZXMgdGhlIHRyYW5zcG9ydC4KKyAgRnV0dXJlIGNsb3NlKCk7CisKKyAgLy8vIFJlYWRzIHVwIHRvIFtsZW5ndGhdIGJ5dGVzIGludG8gW2J1ZmZlcl0sIHN0YXJ0aW5nIGF0IFtvZmZzZXRdLgorICAvLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQuCisgIC8vLyBUaHJvd3MgW1RUcmFuc3BvcnRFcnJvcl0gaWYgdGhlcmUgd2FzIGFuIGVycm9yIHJlYWRpbmcgZGF0YQorICBpbnQgcmVhZChVaW50OExpc3QgYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKTsKKworICAvLy8gR3VhcmFudGVlcyB0aGF0IGFsbCBvZiBbbGVuZ3RoXSBieXRlcyBhcmUgYWN0dWFsbHkgcmVhZCBvZmYgdGhlIHRyYW5zcG9ydC4KKyAgLy8vIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSByZWFkLCB3aGljaCBtdXN0IGJlIGVxdWFsIHRvCisgIC8vLyBbbGVuZ3RoXS4KKyAgLy8vIFRocm93cyBbVFRyYW5zcG9ydEVycm9yXSBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgcmVhZGluZyBkYXRhCisgIGludCByZWFkQWxsKFVpbnQ4TGlzdCBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKyAgICBpbnQgZ290ID0gMDsKKyAgICBpbnQgcmV0ID0gMDsKKyAgICB3aGlsZSAoZ290IDwgbGVuZ3RoKSB7CisgICAgICByZXQgPSByZWFkKGJ1ZmZlciwgb2Zmc2V0ICsgZ290LCBsZW5ndGggLSBnb3QpOworICAgICAgaWYgKHJldCA8PSAwKSB7CisgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXJyb3IoCisgICAgICAgICAgICBUVHJhbnNwb3J0RXJyb3JUeXBlLlVOS05PV04sCisgICAgICAgICAgICAiQ2Fubm90IHJlYWQuIFJlbW90ZSBzaWRlIGhhcyBjbG9zZWQuIFRyaWVkIHRvIHJlYWQgJGxlbmd0aCAiCisgICAgICAgICAgICAiYnl0ZXMsIGJ1dCBvbmx5IGdvdCAkZ290IGJ5dGVzLiIpOworICAgICAgfQorICAgICAgZ290ICs9IHJldDsKKyAgICB9CisgICAgcmV0dXJuIGdvdDsKKyAgfQorCisgIC8vLyBXcml0ZXMgdXAgdG8gW2xlbl0gYnl0ZXMgZnJvbSB0aGUgYnVmZmVyLgorICAvLy8gVGhyb3dzIFtUVHJhbnNwb3J0RXJyb3JdIGlmIHRoZXJlIHdhcyBhbiBlcnJvciB3cml0aW5nIGRhdGEKKyAgdm9pZCB3cml0ZShVaW50OExpc3QgYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKTsKKworICAvLy8gV3JpdGVzIHRoZSBbYnl0ZXNdIHRvIHRoZSBvdXRwdXQuCisgIC8vLyBUaHJvd3MgW1RUcmFuc3BvcnRFcnJvcl0gaWYgdGhlcmUgd2FzIGFuIGVycm9yIHdyaXRpbmcgZGF0YQorICB2b2lkIHdyaXRlQWxsKFVpbnQ4TGlzdCBidWZmZXIpIHsKKyAgICB3cml0ZShidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgpOworICB9CisKKyAgLy8vIEZsdXNoIGFueSBwZW5kaW5nIGRhdGEgb3V0IG9mIGEgdHJhbnNwb3J0IGJ1ZmZlci4KKyAgLy8vIFRocm93cyBbVFRyYW5zcG9ydEVycm9yXSBpZiB0aGVyZSB3YXMgYW4gZXJyb3Igd3JpdGluZyBvdXQgZGF0YS4KKyAgRnV0dXJlIGZsdXNoKCk7Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X3RyYW5zcG9ydF9lcnJvci5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF90cmFuc3BvcnRfZXJyb3IuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzUwOGUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF90cmFuc3BvcnRfZXJyb3IuZGFydApAQCAtMCwwICsxLDMxIEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKK2NsYXNzIFRUcmFuc3BvcnRFcnJvclR5cGUgeworICBzdGF0aWMgY29uc3QgaW50IFVOS05PV04gPSAwOworICBzdGF0aWMgY29uc3QgaW50IE5PVF9PUEVOID0gMTsKKyAgc3RhdGljIGNvbnN0IGludCBBTFJFQURZX09QRU4gPSAyOworICBzdGF0aWMgY29uc3QgaW50IFRJTUVEX09VVCA9IDM7CisgIHN0YXRpYyBjb25zdCBpbnQgRU5EX09GX0ZJTEUgPSA0OworfQorCitjbGFzcyBUVHJhbnNwb3J0RXJyb3IgZXh0ZW5kcyBURXJyb3IgeworICBUVHJhbnNwb3J0RXJyb3IoW2ludCB0eXBlID0gVFRyYW5zcG9ydEVycm9yVHlwZS5VTktOT1dOLCBTdHJpbmcgbWVzc2FnZSA9ICIiXSkKKyAgICAgIDogc3VwZXIodHlwZSwgbWVzc2FnZSk7Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X3RyYW5zcG9ydF9mYWN0b3J5LmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X3RyYW5zcG9ydF9mYWN0b3J5LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ExMDQ2MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi9zcmMvdHJhbnNwb3J0L3RfdHJhbnNwb3J0X2ZhY3RvcnkuZGFydApAQCAtMCwwICsxLDI3IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydCBvZiB0aHJpZnQ7CisKKy8vLyBGYWN0b3J5IGNsYXNzIHVzZWQgdG8gY3JlYXRlIHdyYXBwZWQgaW5zdGFuY2Ugb2YgYSBbVFRyYW5zcG9ydF0uIFRoaXMgaXMKKy8vLyB1c2VkIHByaW1hcmlseSBpbiBzZXJ2ZXJzLgorLy8vCisvLy8gQWRhcHRlZCBmcm9tIHRoZSBKYXZhIHZlcnNpb24uCitjbGFzcyBUVHJhbnNwb3J0RmFjdG9yeSB7CisgIEZ1dHVyZTxUVHJhbnNwb3J0PiBnZXRUcmFuc3BvcnQoVFRyYW5zcG9ydCB0cmFuc3BvcnQpID0+CisgICAgICBuZXcgRnV0dXJlLnZhbHVlKHRyYW5zcG9ydCk7Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC9saWIvdGhyaWZ0LmRhcnQgYi9saWIvZGFydC9saWIvdGhyaWZ0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q5YmIwMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L2xpYi90aHJpZnQuZGFydApAQCAtMCwwICsxLDY0IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworbGlicmFyeSB0aHJpZnQ7CisKK2ltcG9ydCAnZGFydDphc3luYyc7CitpbXBvcnQgJ2RhcnQ6Y29sbGVjdGlvbic7CitpbXBvcnQgJ2RhcnQ6Y29udmVydCcgc2hvdyBVdGY4Q29kZWMsIEJBU0U2NDsKK2ltcG9ydCAnZGFydDp0eXBlZF9kYXRhJyBzaG93IEJ5dGVEYXRhOworaW1wb3J0ICdkYXJ0OnR5cGVkX2RhdGEnIHNob3cgRW5kaWFubmVzczsKK2ltcG9ydCAnZGFydDp0eXBlZF9kYXRhJyBzaG93IFVpbnQ4TGlzdDsKKworaW1wb3J0ICdwYWNrYWdlOmZpeG51bS9maXhudW0uZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6aHR0cC9odHRwLmRhcnQnIHNob3cgQ2xpZW50OworaW1wb3J0ICdwYWNrYWdlOmxvZ2dpbmcvbG9nZ2luZy5kYXJ0JzsKKworcGFydCAnc3JjL3RfYXBwbGljYXRpb25fZXJyb3IuZGFydCc7CitwYXJ0ICdzcmMvdF9iYXNlLmRhcnQnOworcGFydCAnc3JjL3RfZXJyb3IuZGFydCc7CitwYXJ0ICdzcmMvdF9wcm9jZXNzb3IuZGFydCc7CisKK3BhcnQgJ3NyYy9wcm90b2NvbC90X2JpbmFyeV9wcm90b2NvbC5kYXJ0JzsKK3BhcnQgJ3NyYy9wcm90b2NvbC90X2NvbXBhY3RfcHJvdG9jb2wuZGFydCc7CitwYXJ0ICdzcmMvcHJvdG9jb2wvdF9maWVsZC5kYXJ0JzsKK3BhcnQgJ3NyYy9wcm90b2NvbC90X2pzb25fcHJvdG9jb2wuZGFydCc7CitwYXJ0ICdzcmMvcHJvdG9jb2wvdF9saXN0LmRhcnQnOworcGFydCAnc3JjL3Byb3RvY29sL3RfbWFwLmRhcnQnOworcGFydCAnc3JjL3Byb3RvY29sL3RfbWVzc2FnZS5kYXJ0JzsKK3BhcnQgJ3NyYy9wcm90b2NvbC90X211bHRpcGxleGVkX3Byb3RvY29sLmRhcnQnOworcGFydCAnc3JjL3Byb3RvY29sL3RfcHJvdG9jb2wuZGFydCc7CitwYXJ0ICdzcmMvcHJvdG9jb2wvdF9wcm90b2NvbF9kZWNvcmF0b3IuZGFydCc7CitwYXJ0ICdzcmMvcHJvdG9jb2wvdF9wcm90b2NvbF9lcnJvci5kYXJ0JzsKK3BhcnQgJ3NyYy9wcm90b2NvbC90X3Byb3RvY29sX2ZhY3RvcnkuZGFydCc7CitwYXJ0ICdzcmMvcHJvdG9jb2wvdF9wcm90b2NvbF91dGlsLmRhcnQnOworcGFydCAnc3JjL3Byb3RvY29sL3Rfc2V0LmRhcnQnOworcGFydCAnc3JjL3Byb3RvY29sL3Rfc3RydWN0LmRhcnQnOworcGFydCAnc3JjL3Byb3RvY29sL3RfdHlwZS5kYXJ0JzsKKworcGFydCAnc3JjL3NlcmlhbGl6ZXIvdF9kZXNlcmlhbGl6ZXIuZGFydCc7CitwYXJ0ICdzcmMvc2VyaWFsaXplci90X3NlcmlhbGl6ZXIuZGFydCc7CisKK3BhcnQgJ3NyYy90cmFuc3BvcnQvdF9idWZmZXJlZF90cmFuc3BvcnQuZGFydCc7CitwYXJ0ICdzcmMvdHJhbnNwb3J0L3RfZnJhbWVkX3RyYW5zcG9ydC5kYXJ0JzsKK3BhcnQgJ3NyYy90cmFuc3BvcnQvdF9odHRwX3RyYW5zcG9ydC5kYXJ0JzsKK3BhcnQgJ3NyYy90cmFuc3BvcnQvdF9tZXNzYWdlX3JlYWRlci5kYXJ0JzsKK3BhcnQgJ3NyYy90cmFuc3BvcnQvdF9zb2NrZXQuZGFydCc7CitwYXJ0ICdzcmMvdHJhbnNwb3J0L3RfdHJhbnNwb3J0LmRhcnQnOworcGFydCAnc3JjL3RyYW5zcG9ydC90X3RyYW5zcG9ydF9lcnJvci5kYXJ0JzsKK3BhcnQgJ3NyYy90cmFuc3BvcnQvdF90cmFuc3BvcnRfZmFjdG9yeS5kYXJ0JzsKK3BhcnQgJ3NyYy90cmFuc3BvcnQvdF9zb2NrZXRfdHJhbnNwb3J0LmRhcnQnOwpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3RocmlmdF9icm93c2VyLmRhcnQgYi9saWIvZGFydC9saWIvdGhyaWZ0X2Jyb3dzZXIuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWJjMjU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3RocmlmdF9icm93c2VyLmRhcnQKQEAgLTAsMCArMSwyMiBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK2xpYnJhcnkgdGhyaWZ0X2Jyb3dzZXI7CisKKy8vLyBDbGFzc2VzIHRoYXQgYXJlIG9ubHkgc3VwcG9ydGVkIGluIGJyb3dzZXIgYXBwbGljYXRpb25zIGdvIGhlcmUKKworZXhwb3J0ICdzcmMvYnJvd3Nlci90X3dlYl9zb2NrZXQuZGFydCcgc2hvdyBUV2ViU29ja2V0OwpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3RocmlmdF9jb25zb2xlLmRhcnQgYi9saWIvZGFydC9saWIvdGhyaWZ0X2NvbnNvbGUuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGE4M2QxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvbGliL3RocmlmdF9jb25zb2xlLmRhcnQKQEAgLTAsMCArMSwyMyBAQAorLy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vLworLy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8vCisvLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK2xpYnJhcnkgdGhyaWZ0X2NvbnNvbGU7CisKKy8vLyBDbGFzc2VzIHRoYXQgYXJlIG9ubHkgc3VwcG9ydGVkIGluIGNvbnNvbGUgYXBwbGljYXRpb25zIGdvIGhlcmUKKworZXhwb3J0ICdzcmMvY29uc29sZS90X3RjcF9zb2NrZXQuZGFydCcgc2hvdyBUVGNwU29ja2V0OworZXhwb3J0ICdzcmMvY29uc29sZS90X3dlYl9zb2NrZXQuZGFydCcgc2hvdyBUV2ViU29ja2V0OwpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvcHVic3BlYy55YW1sIGIvbGliL2RhcnQvcHVic3BlYy55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkYzRhMGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9wdWJzcGVjLnlhbWwKQEAgLTAsMCArMSw0MyBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICdMaWNlbnNlJyk7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICdBUyBJUycgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorCituYW1lOiB0aHJpZnQKK3ZlcnNpb246IDEuMC4wCitkZXNjcmlwdGlvbjogPgorICBBIERhcnQgbGlicmFyeSBmb3IgQXBhY2hlIFRocmlmdAorYXV0aG9yOiBBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KK2hvbWVwYWdlOiBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcKK2RvY3VtZW50YXRpb246IGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZworCitlbnZpcm9ubWVudDoKKyAgc2RrOiAiPj0xLjEzLjAgPDIuMC4wIgorCitkZXBlbmRlbmNpZXM6CisgIGZpeG51bTogXjAuMTAuMgorICBodHRwOiBeMC4xMS4zCisgIGxvZ2dpbmc6IF4wLjExLjAKKworZGV2X2RlcGVuZGVuY2llczoKKyAgIyB0ZXN0CisgIG1vY2tpdG86IF4xLjAuMAorICB0ZXN0OiBeMC4xMi4wCisKKyAgIyBkYXJ0X2RldiAtIGh0dHBzOi8vZ2l0aHViLmNvbS9Xb3JraXZhL2RhcnRfZGV2CisgIGRhcnRfZGV2OiBeMS41LjAKKyAgY292ZXJhZ2U6IF4wLjcuMworICBkYXJ0X3N0eWxlOiAiPj0wLjIuNCA8MC4zLjAiCisgIGRhcnRkb2M6IF4wLjkuMApkaWZmIC0tZ2l0IGEvbGliL2RhcnQvdGVzdC9wcm90b2NvbC90X3Byb3RvY29sX3Rlc3QuZGFydCBiL2xpYi9kYXJ0L3Rlc3QvcHJvdG9jb2wvdF9wcm90b2NvbF90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU2Y2RlNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L3Rlc3QvcHJvdG9jb2wvdF9wcm90b2NvbF90ZXN0LmRhcnQKQEAgLTAsMCArMSw0MDYgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK2xpYnJhcnkgdGhyaWZ0LnRlc3QudHJhbnNwb3J0LnRfanNvbl9wcm90b2NvbF90ZXN0OworCitpbXBvcnQgJ2RhcnQ6YXN5bmMnOworaW1wb3J0ICdkYXJ0OmNvbnZlcnQnIHNob3cgVVRGODsKK2ltcG9ydCAnZGFydDp0eXBlZF9kYXRhJyBzaG93IFVpbnQ4TGlzdDsKKworaW1wb3J0ICdwYWNrYWdlOnRlc3QvdGVzdC5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTp0aHJpZnQvdGhyaWZ0LmRhcnQnOworCit2b2lkIG1haW4oKSB7CisgIGZpbmFsIG1lc3NhZ2UgPSBuZXcgVE1lc3NhZ2UoJ215IG1lc3NhZ2UnLCBUTWVzc2FnZVR5cGUuT05FV0FZLCAxMjMpOworCisgIFRQcm90b2NvbCBwcm90b2NvbDsKKworICBQcmltaXRpdmUgZ2V0UHJpbWl0aXZlKGludCB0VHlwZSkgeworICAgIHN3aXRjaCAodFR5cGUpIHsKKyAgICAgIGNhc2UgVFR5cGUuQk9PTDoKKyAgICAgICAgcmV0dXJuIG5ldyBQcmltaXRpdmUocHJvdG9jb2wucmVhZEJvb2wsIHByb3RvY29sLndyaXRlQm9vbCwgZmFsc2UpOworCisgICAgICBjYXNlIFRUeXBlLkJZVEU6CisgICAgICAgIHJldHVybiBuZXcgUHJpbWl0aXZlKHByb3RvY29sLnJlYWRCeXRlLCBwcm90b2NvbC53cml0ZUJ5dGUsIDApOworCisgICAgICBjYXNlIFRUeXBlLkkxNjoKKyAgICAgICAgcmV0dXJuIG5ldyBQcmltaXRpdmUocHJvdG9jb2wucmVhZEkxNiwgcHJvdG9jb2wud3JpdGVJMTYsIDApOworCisgICAgICBjYXNlIFRUeXBlLkkzMjoKKyAgICAgICAgcmV0dXJuIG5ldyBQcmltaXRpdmUocHJvdG9jb2wucmVhZEkzMiwgcHJvdG9jb2wud3JpdGVJMzIsIDApOworCisgICAgICBjYXNlIFRUeXBlLkk2NDoKKyAgICAgICAgcmV0dXJuIG5ldyBQcmltaXRpdmUocHJvdG9jb2wucmVhZEk2NCwgcHJvdG9jb2wud3JpdGVJNjQsIDApOworCisgICAgICBjYXNlIFRUeXBlLkRPVUJMRToKKyAgICAgICAgcmV0dXJuIG5ldyBQcmltaXRpdmUocHJvdG9jb2wucmVhZERvdWJsZSwgcHJvdG9jb2wud3JpdGVEb3VibGUsIDApOworCisgICAgICBjYXNlIFRUeXBlLlNUUklORzoKKyAgICAgICAgcmV0dXJuIG5ldyBQcmltaXRpdmUocHJvdG9jb2wucmVhZFN0cmluZywgcHJvdG9jb2wud3JpdGVTdHJpbmcsICcnKTsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIlVuc3VwcG9ydGVkIFRUeXBlICR0VHlwZSIpOworICAgIH0KKyAgfQorCisgIEZ1dHVyZSBwcmltaXRpdmVUZXN0KFByaW1pdGl2ZSBwcmltaXRpdmUsIGlucHV0KSBhc3luYyB7CisgICAgcHJpbWl0aXZlLndyaXRlKGlucHV0KTsKKyAgICBwcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKTsKKworICAgIGF3YWl0IHByb3RvY29sLnRyYW5zcG9ydC5mbHVzaCgpOworCisgICAgcHJvdG9jb2wucmVhZE1lc3NhZ2VCZWdpbigpOworICAgIHZhciBvdXRwdXQgPSBwcmltaXRpdmUucmVhZCgpOworCisgICAgZXhwZWN0KG91dHB1dCwgaW5wdXQpOworICB9CisKKyAgRnV0dXJlIHByaW1pdGl2ZU51bGxUZXN0KFByaW1pdGl2ZSBwcmltaXRpdmUpIGFzeW5jIHsKKyAgICBwcmltaXRpdmUud3JpdGUobnVsbCk7CisgICAgcHJvdG9jb2wud3JpdGVNZXNzYWdlRW5kKCk7CisKKyAgICBhd2FpdCBwcm90b2NvbC50cmFuc3BvcnQuZmx1c2goKTsKKworICAgIHByb3RvY29sLnJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgICB2YXIgb3V0cHV0ID0gcHJpbWl0aXZlLnJlYWQoKTsKKworICAgIGV4cGVjdChvdXRwdXQsIHByaW1pdGl2ZS5kZWZhdWx0VmFsdWUpOworICB9CisKKyAgdmFyIHNoYXJlZFRlc3RzID0gKCkgeworICAgIHRlc3QoJ1Rlc3QgbWVzc2FnZScsICgpIGFzeW5jIHsKKyAgICAgIHByb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpOworCisgICAgICBhd2FpdCBwcm90b2NvbC50cmFuc3BvcnQuZmx1c2goKTsKKworICAgICAgdmFyIHN1YmplY3QgPSBwcm90b2NvbC5yZWFkTWVzc2FnZUJlZ2luKCk7CisKKyAgICAgIGV4cGVjdChzdWJqZWN0Lm5hbWUsIG1lc3NhZ2UubmFtZSk7CisgICAgICBleHBlY3Qoc3ViamVjdC50eXBlLCBtZXNzYWdlLnR5cGUpOworICAgICAgZXhwZWN0KHN1YmplY3Quc2VxaWQsIG1lc3NhZ2Uuc2VxaWQpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBzdHJ1Y3QnLCAoKSBhc3luYyB7CisgICAgICB2YXIgaW5wdXQgPSBuZXcgVFN0cnVjdCgpOworCisgICAgICBwcm90b2NvbC53cml0ZVN0cnVjdEJlZ2luKGlucHV0KTsKKyAgICAgIHByb3RvY29sLndyaXRlU3RydWN0RW5kKCk7CisgICAgICBwcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKTsKKworICAgICAgYXdhaXQgcHJvdG9jb2wudHJhbnNwb3J0LmZsdXNoKCk7CisKKyAgICAgIHByb3RvY29sLnJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgICAgIHZhciBvdXRwdXQgPSBwcm90b2NvbC5yZWFkU3RydWN0QmVnaW4oKTsKKworICAgICAgLy8gbmFtZSBpcyBub3Qgc2VyaWFsaXplZCwgc2VlIEMjIHZlcnNpb24gZm9yIHJlZmVyZW5jZQorICAgICAgZXhwZWN0KG91dHB1dCwgaXNOb3ROdWxsKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgZmllbGQnLCAoKSBhc3luYyB7CisgICAgICB2YXIgaW5wdXQgPSBuZXcgVEZpZWxkKCdteSBmaWVsZCcsIFRUeXBlLk1BUCwgMTIzKTsKKworICAgICAgcHJvdG9jb2wud3JpdGVGaWVsZEJlZ2luKGlucHV0KTsKKyAgICAgIHByb3RvY29sLndyaXRlRmllbGRFbmQoKTsKKyAgICAgIHByb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpOworCisgICAgICBhd2FpdCBwcm90b2NvbC50cmFuc3BvcnQuZmx1c2goKTsKKworICAgICAgcHJvdG9jb2wucmVhZE1lc3NhZ2VCZWdpbigpOworICAgICAgdmFyIG91dHB1dCA9IHByb3RvY29sLnJlYWRGaWVsZEJlZ2luKCk7CisKKyAgICAgIC8vIG5hbWUgaXMgbm90IHNlcmlhbGl6ZWQsIHNlZSBDIyB2ZXJzaW9uIGZvciByZWZlcmVuY2UKKyAgICAgIGV4cGVjdChvdXRwdXQudHlwZSwgaW5wdXQudHlwZSk7CisgICAgICBleHBlY3Qob3V0cHV0LmlkLCBpbnB1dC5pZCk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IG1hcCcsICgpIGFzeW5jIHsKKyAgICAgIHZhciBpbnB1dCA9IG5ldyBUTWFwKFRUeXBlLlNUUklORywgVFR5cGUuU1RSVUNULCAxMjMpOworCisgICAgICBwcm90b2NvbC53cml0ZU1hcEJlZ2luKGlucHV0KTsKKyAgICAgIHByb3RvY29sLndyaXRlTWFwRW5kKCk7CisgICAgICBwcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKTsKKworICAgICAgYXdhaXQgcHJvdG9jb2wudHJhbnNwb3J0LmZsdXNoKCk7CisKKyAgICAgIHByb3RvY29sLnJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgICAgIHZhciBvdXRwdXQgPSBwcm90b2NvbC5yZWFkTWFwQmVnaW4oKTsKKworICAgICAgZXhwZWN0KG91dHB1dC5rZXlUeXBlLCBpbnB1dC5rZXlUeXBlKTsKKyAgICAgIGV4cGVjdChvdXRwdXQudmFsdWVUeXBlLCBpbnB1dC52YWx1ZVR5cGUpOworICAgICAgZXhwZWN0KG91dHB1dC5sZW5ndGgsIGlucHV0Lmxlbmd0aCk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IGxpc3QnLCAoKSBhc3luYyB7CisgICAgICB2YXIgaW5wdXQgPSBuZXcgVExpc3QoVFR5cGUuU1RSSU5HLCAxMjMpOworCisgICAgICBwcm90b2NvbC53cml0ZUxpc3RCZWdpbihpbnB1dCk7CisgICAgICBwcm90b2NvbC53cml0ZUxpc3RFbmQoKTsKKyAgICAgIHByb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpOworCisgICAgICBhd2FpdCBwcm90b2NvbC50cmFuc3BvcnQuZmx1c2goKTsKKworICAgICAgcHJvdG9jb2wucmVhZE1lc3NhZ2VCZWdpbigpOworICAgICAgdmFyIG91dHB1dCA9IHByb3RvY29sLnJlYWRMaXN0QmVnaW4oKTsKKworICAgICAgZXhwZWN0KG91dHB1dC5lbGVtZW50VHlwZSwgaW5wdXQuZWxlbWVudFR5cGUpOworICAgICAgZXhwZWN0KG91dHB1dC5sZW5ndGgsIGlucHV0Lmxlbmd0aCk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IHNldCcsICgpIGFzeW5jIHsKKyAgICAgIHZhciBpbnB1dCA9IG5ldyBUU2V0KFRUeXBlLlNUUklORywgMTIzKTsKKworICAgICAgcHJvdG9jb2wud3JpdGVTZXRCZWdpbihpbnB1dCk7CisgICAgICBwcm90b2NvbC53cml0ZVNldEVuZCgpOworICAgICAgcHJvdG9jb2wud3JpdGVNZXNzYWdlRW5kKCk7CisKKyAgICAgIGF3YWl0IHByb3RvY29sLnRyYW5zcG9ydC5mbHVzaCgpOworCisgICAgICBwcm90b2NvbC5yZWFkTWVzc2FnZUJlZ2luKCk7CisgICAgICB2YXIgb3V0cHV0ID0gcHJvdG9jb2wucmVhZExpc3RCZWdpbigpOworCisgICAgICBleHBlY3Qob3V0cHV0LmVsZW1lbnRUeXBlLCBpbnB1dC5lbGVtZW50VHlwZSk7CisgICAgICBleHBlY3Qob3V0cHV0Lmxlbmd0aCwgaW5wdXQubGVuZ3RoKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgYm9vbCcsICgpIGFzeW5jIHsKKyAgICAgIGF3YWl0IHByaW1pdGl2ZVRlc3QoZ2V0UHJpbWl0aXZlKFRUeXBlLkJPT0wpLCB0cnVlKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgYm9vbCBudWxsJywgKCkgYXN5bmMgeworICAgICAgYXdhaXQgcHJpbWl0aXZlTnVsbFRlc3QoZ2V0UHJpbWl0aXZlKFRUeXBlLkJPT0wpKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgYnl0ZScsICgpIGFzeW5jIHsKKyAgICAgIGF3YWl0IHByaW1pdGl2ZVRlc3QoZ2V0UHJpbWl0aXZlKFRUeXBlLkJZVEUpLCA2NCk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IGJ5dGUgbnVsbCcsICgpIGFzeW5jIHsKKyAgICAgIGF3YWl0IHByaW1pdGl2ZU51bGxUZXN0KGdldFByaW1pdGl2ZShUVHlwZS5CWVRFKSk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IEkxNicsICgpIGFzeW5jIHsKKyAgICAgIGF3YWl0IHByaW1pdGl2ZVRlc3QoZ2V0UHJpbWl0aXZlKFRUeXBlLkkxNiksIDMyNzY3KTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgSTE2IG51bGwnLCAoKSBhc3luYyB7CisgICAgICBhd2FpdCBwcmltaXRpdmVOdWxsVGVzdChnZXRQcmltaXRpdmUoVFR5cGUuSTE2KSk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IEkzMicsICgpIGFzeW5jIHsKKyAgICAgIGF3YWl0IHByaW1pdGl2ZVRlc3QoZ2V0UHJpbWl0aXZlKFRUeXBlLkkzMiksIDIxNDc0ODM2NDcpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBJMzIgbnVsbCcsICgpIGFzeW5jIHsKKyAgICAgIGF3YWl0IHByaW1pdGl2ZU51bGxUZXN0KGdldFByaW1pdGl2ZShUVHlwZS5JMzIpKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgSTY0JywgKCkgYXN5bmMgeworICAgICAgYXdhaXQgcHJpbWl0aXZlVGVzdChnZXRQcmltaXRpdmUoVFR5cGUuSTY0KSwgOTIyMzM3MjAzNjg1NDc3NTgwNyk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IEk2NCBudWxsJywgKCkgYXN5bmMgeworICAgICAgYXdhaXQgcHJpbWl0aXZlTnVsbFRlc3QoZ2V0UHJpbWl0aXZlKFRUeXBlLkk2NCkpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBkb3VibGUnLCAoKSBhc3luYyB7CisgICAgICBhd2FpdCBwcmltaXRpdmVUZXN0KGdldFByaW1pdGl2ZShUVHlwZS5ET1VCTEUpLCAzLjE0MTU5MjYpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBkb3VibGUgbnVsbCcsICgpIGFzeW5jIHsKKyAgICAgIGF3YWl0IHByaW1pdGl2ZU51bGxUZXN0KGdldFByaW1pdGl2ZShUVHlwZS5ET1VCTEUpKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3Qgc3RyaW5nJywgKCkgYXN5bmMgeworICAgICAgdmFyIGlucHV0ID0gJ1RoZXJlIGFyZSBvbmx5IHR3byBoYXJkIHRoaW5ncyBpbiBjb21wdXRlciBzY2llbmNlOiAnCisgICAgICAgICAgJ2NhY2hlIGludmFsaWRhdGlvbiwgbmFtaW5nIHRoaW5ncywgYW5kIG9mZi1ieS1vbmUgZXJyb3JzLic7CisgICAgICBhd2FpdCBwcmltaXRpdmVUZXN0KGdldFByaW1pdGl2ZShUVHlwZS5TVFJJTkcpLCBpbnB1dCk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IHN0cmluZyBudWxsJywgKCkgYXN5bmMgeworICAgICAgYXdhaXQgcHJpbWl0aXZlTnVsbFRlc3QoZ2V0UHJpbWl0aXZlKFRUeXBlLlNUUklORykpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBiaW5hcnknLCAoKSBhc3luYyB7CisgICAgICB2YXIgaW5wdXQgPSBuZXcgVWludDhMaXN0LmZyb21MaXN0KG5ldyBMaXN0LmZpbGxlZCgxMDAsIDEyMykpOworCisgICAgICBwcm90b2NvbC53cml0ZUJpbmFyeShpbnB1dCk7CisgICAgICBwcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKTsKKworICAgICAgYXdhaXQgcHJvdG9jb2wudHJhbnNwb3J0LmZsdXNoKCk7CisKKyAgICAgIHByb3RvY29sLnJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgICAgIHZhciBvdXRwdXQgPSBwcm90b2NvbC5yZWFkQmluYXJ5KCk7CisKKyAgICAgIGV4cGVjdChvdXRwdXQubGVuZ3RoLCBpbnB1dC5sZW5ndGgpOworICAgICAgZXhwZWN0KG91dHB1dC5ldmVyeSgoaSkgPT4gaSA9PSAxMjMpLCBpc1RydWUpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBjb21wbGV4IHN0cnVjdCcsICgpIGFzeW5jIHsKKyAgICAgIC8vIHsxOiB7MTA6IDIwfSwgMjogezMwOiA0MH19CisgICAgICBwcm90b2NvbC53cml0ZVN0cnVjdEJlZ2luKG5ldyBUU3RydWN0KCkpOworICAgICAgcHJvdG9jb2wud3JpdGVGaWVsZEJlZ2luKG5ldyBURmllbGQoJ3N1Y2Nlc3MnLCBUVHlwZS5NQVAsIDApKTsKKyAgICAgIHByb3RvY29sLndyaXRlTWFwQmVnaW4obmV3IFRNYXAoVFR5cGUuSTMyLCBUVHlwZS5NQVAsIDIpKTsKKworICAgICAgcHJvdG9jb2wud3JpdGVJMzIoMSk7IC8vIGtleQorICAgICAgcHJvdG9jb2wud3JpdGVNYXBCZWdpbihuZXcgVE1hcChUVHlwZS5JMzIsIFRUeXBlLkkzMiwgMSkpOworICAgICAgcHJvdG9jb2wud3JpdGVJMzIoMTApOyAvLyBrZXkKKyAgICAgIHByb3RvY29sLndyaXRlSTMyKDIwKTsgLy8gdmFsdWUKKyAgICAgIHByb3RvY29sLndyaXRlTWFwRW5kKCk7CisKKyAgICAgIHByb3RvY29sLndyaXRlSTMyKDIpOyAvLyBrZXkKKyAgICAgIHByb3RvY29sLndyaXRlTWFwQmVnaW4obmV3IFRNYXAoVFR5cGUuSTMyLCBUVHlwZS5JMzIsIDEpKTsKKyAgICAgIHByb3RvY29sLndyaXRlSTMyKDMwKTsgLy8ga2V5CisgICAgICBwcm90b2NvbC53cml0ZUkzMig0MCk7IC8vIHZhbHVlCisgICAgICBwcm90b2NvbC53cml0ZU1hcEVuZCgpOworCisgICAgICBwcm90b2NvbC53cml0ZU1hcEVuZCgpOworICAgICAgcHJvdG9jb2wud3JpdGVGaWVsZEVuZCgpOworICAgICAgcHJvdG9jb2wud3JpdGVGaWVsZFN0b3AoKTsKKyAgICAgIHByb3RvY29sLndyaXRlU3RydWN0RW5kKCk7CisgICAgICBwcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKTsKKworICAgICAgYXdhaXQgcHJvdG9jb2wudHJhbnNwb3J0LmZsdXNoKCk7CisKKyAgICAgIHByb3RvY29sLnJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgICAgIHByb3RvY29sLnJlYWRTdHJ1Y3RCZWdpbigpOworICAgICAgZXhwZWN0KHByb3RvY29sLnJlYWRGaWVsZEJlZ2luKCkudHlwZSwgVFR5cGUuTUFQKTsKKyAgICAgIGV4cGVjdChwcm90b2NvbC5yZWFkTWFwQmVnaW4oKS5sZW5ndGgsIDIpOworCisgICAgICBleHBlY3QocHJvdG9jb2wucmVhZEkzMigpLCAxKTsgLy8ga2V5CisgICAgICBleHBlY3QocHJvdG9jb2wucmVhZE1hcEJlZ2luKCkubGVuZ3RoLCAxKTsKKyAgICAgIGV4cGVjdChwcm90b2NvbC5yZWFkSTMyKCksIDEwKTsgLy8ga2V5CisgICAgICBleHBlY3QocHJvdG9jb2wucmVhZEkzMigpLCAyMCk7IC8vIHZhbHVlCisgICAgICBwcm90b2NvbC5yZWFkTWFwRW5kKCk7CisKKyAgICAgIGV4cGVjdChwcm90b2NvbC5yZWFkSTMyKCksIDIpOyAvLyBrZXkKKyAgICAgIGV4cGVjdChwcm90b2NvbC5yZWFkTWFwQmVnaW4oKS5sZW5ndGgsIDEpOworICAgICAgZXhwZWN0KHByb3RvY29sLnJlYWRJMzIoKSwgMzApOyAvLyBrZXkKKyAgICAgIGV4cGVjdChwcm90b2NvbC5yZWFkSTMyKCksIDQwKTsgLy8gdmFsdWUKKyAgICAgIHByb3RvY29sLnJlYWRNYXBFbmQoKTsKKworICAgICAgcHJvdG9jb2wucmVhZE1hcEVuZCgpOworICAgICAgcHJvdG9jb2wucmVhZEZpZWxkRW5kKCk7CisgICAgICBwcm90b2NvbC5yZWFkU3RydWN0RW5kKCk7CisgICAgICBwcm90b2NvbC5yZWFkTWVzc2FnZUVuZCgpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBuZXN0ZWQgbWFwcyBhbmQgbGlzdHMnLCAoKSBhc3luYyB7CisgICAgICAvLyB7MTogW3sxMDogMjB9XSwgMjogW3szMDogNDB9XX0KKyAgICAgIHByb3RvY29sLndyaXRlTWFwQmVnaW4obmV3IFRNYXAoVFR5cGUuSTMyLCBUVHlwZS5MSVNULCAyKSk7CisKKyAgICAgIHByb3RvY29sLndyaXRlSTMyKDEpOyAvLyBrZXkKKyAgICAgIHByb3RvY29sLndyaXRlTGlzdEJlZ2luKG5ldyBUTGlzdChUVHlwZS5NQVAsIDEpKTsKKyAgICAgIHByb3RvY29sLndyaXRlTWFwQmVnaW4obmV3IFRNYXAoVFR5cGUuSTMyLCBUVHlwZS5JMzIsIDEpKTsKKyAgICAgIHByb3RvY29sLndyaXRlSTMyKDEwKTsgLy8ga2V5CisgICAgICBwcm90b2NvbC53cml0ZUkzMigyMCk7IC8vIHZhbHVlCisgICAgICBwcm90b2NvbC53cml0ZU1hcEVuZCgpOworICAgICAgcHJvdG9jb2wud3JpdGVMaXN0RW5kKCk7CisKKyAgICAgIHByb3RvY29sLndyaXRlSTMyKDIpOyAvLyBrZXkKKyAgICAgIHByb3RvY29sLndyaXRlTGlzdEJlZ2luKG5ldyBUTGlzdChUVHlwZS5NQVAsIDEpKTsKKyAgICAgIHByb3RvY29sLndyaXRlTWFwQmVnaW4obmV3IFRNYXAoVFR5cGUuSTMyLCBUVHlwZS5JMzIsIDEpKTsKKyAgICAgIHByb3RvY29sLndyaXRlSTMyKDMwKTsgLy8ga2V5CisgICAgICBwcm90b2NvbC53cml0ZUkzMig0MCk7IC8vIHZhbHVlCisgICAgICBwcm90b2NvbC53cml0ZU1hcEVuZCgpOworICAgICAgcHJvdG9jb2wud3JpdGVMaXN0RW5kKCk7CisKKyAgICAgIHByb3RvY29sLndyaXRlTWFwRW5kKCk7CisgICAgICBwcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKTsKKworICAgICAgYXdhaXQgcHJvdG9jb2wudHJhbnNwb3J0LmZsdXNoKCk7CisKKyAgICAgIHByb3RvY29sLnJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgICAgIGV4cGVjdChwcm90b2NvbC5yZWFkTWFwQmVnaW4oKS5sZW5ndGgsIDIpOworCisgICAgICBleHBlY3QocHJvdG9jb2wucmVhZEkzMigpLCAxKTsgLy8ga2V5CisgICAgICBleHBlY3QocHJvdG9jb2wucmVhZExpc3RCZWdpbigpLmxlbmd0aCwgMSk7CisgICAgICBleHBlY3QocHJvdG9jb2wucmVhZE1hcEJlZ2luKCkubGVuZ3RoLCAxKTsKKyAgICAgIGV4cGVjdChwcm90b2NvbC5yZWFkSTMyKCksIDEwKTsgLy8ga2V5CisgICAgICBleHBlY3QocHJvdG9jb2wucmVhZEkzMigpLCAyMCk7IC8vIHZhbHVlCisgICAgICBwcm90b2NvbC5yZWFkTWFwRW5kKCk7CisgICAgICBwcm90b2NvbC5yZWFkTGlzdEVuZCgpOworCisgICAgICBleHBlY3QocHJvdG9jb2wucmVhZEkzMigpLCAyKTsgLy8ga2V5CisgICAgICBleHBlY3QocHJvdG9jb2wucmVhZExpc3RCZWdpbigpLmxlbmd0aCwgMSk7CisgICAgICBleHBlY3QocHJvdG9jb2wucmVhZE1hcEJlZ2luKCkubGVuZ3RoLCAxKTsKKyAgICAgIGV4cGVjdChwcm90b2NvbC5yZWFkSTMyKCksIDMwKTsgLy8ga2V5CisgICAgICBleHBlY3QocHJvdG9jb2wucmVhZEkzMigpLCA0MCk7IC8vIHZhbHVlCisgICAgICBwcm90b2NvbC5yZWFkTWFwRW5kKCk7CisgICAgICBwcm90b2NvbC5yZWFkTGlzdEVuZCgpOworCisgICAgICBwcm90b2NvbC5yZWFkTWFwRW5kKCk7CisgICAgICBwcm90b2NvbC5yZWFkTWVzc2FnZUVuZCgpOworICAgIH0pOworICB9OworCisgIGdyb3VwKCdKU09OJywgKCkgeworICAgIHNldFVwKCgpIHsKKyAgICAgIHByb3RvY29sID0gbmV3IFRKc29uUHJvdG9jb2wobmV3IFRCdWZmZXJlZFRyYW5zcG9ydCgpKTsKKyAgICAgIHByb3RvY29sLndyaXRlTWVzc2FnZUJlZ2luKG1lc3NhZ2UpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBlc2NhcGVkIHVuaWNvZGUnLCAoKSBhc3luYyB7CisgICAgICAvKgorICAgICAgICAgS09SX0tBSQorICAgICAgICAgICBVVEYtODogIDB4RTAgMHhCOCAweDgxCisgICAgICAgICAgIFVURi0xNjogMHgwRTAxCisgICAgICAgICBHIGNsZWY6CisgICAgICAgICAgIFVURi04OiAgMHhGMCAweDlEIDB4ODQgMHg5RQorICAgICAgICAgICBVVEYtMTY6IDB4RDgzNCAweEREMUUKKyAgICAgICAqLworICAgICAgdmFyIGJ1ZmZlciA9IFVURjguZW5jb2RlKHInIlx1MDAwMVx1MGUwMSBcdWQ4MzRcdWRkMWUiJyk7CisgICAgICB2YXIgdHJhbnNwb3J0ID0gbmV3IFRCdWZmZXJlZFRyYW5zcG9ydCgpOworICAgICAgdHJhbnNwb3J0LndyaXRlQWxsKGJ1ZmZlcik7CisKKyAgICAgIHZhciBwcm90b2NvbCA9IG5ldyBUSnNvblByb3RvY29sKHRyYW5zcG9ydCk7CisKKyAgICAgIGF3YWl0IHByb3RvY29sLnRyYW5zcG9ydC5mbHVzaCgpOworCisgICAgICB2YXIgc3ViamVjdCA9IHByb3RvY29sLnJlYWRTdHJpbmcoKTsKKyAgICAgIGV4cGVjdChzdWJqZWN0LAorICAgICAgICAgIFVURjguZGVjb2RlKFsweDAxLCAweEUwLCAweEI4LCAweDgxLCAweDIwLCAweEYwLCAweDlELCAweDg0LCAweDlFXSkpOworICAgIH0pOworCisgICAgZ3JvdXAoJ3NoYXJlZCB0ZXN0cycsIHNoYXJlZFRlc3RzKTsKKyAgfSk7CisKKyAgZ3JvdXAoJ2JpbmFyeScsICgpIHsKKyAgICBzZXRVcCgoKSB7CisgICAgICBwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2wobmV3IFRCdWZmZXJlZFRyYW5zcG9ydCgpKTsKKyAgICAgIHByb3RvY29sLndyaXRlTWVzc2FnZUJlZ2luKG1lc3NhZ2UpOworICAgIH0pOworCisgICAgZ3JvdXAoJ3NoYXJlZCB0ZXN0cycsIHNoYXJlZFRlc3RzKTsKKyAgfSk7CisKKyAgZ3JvdXAoJ2NvbXBhY3QnLCAoKSB7CisgICAgc2V0VXAoKCkgeworICAgICAgcHJvdG9jb2wgPSBuZXcgVENvbXBhY3RQcm90b2NvbChuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KCkpOworICAgICAgcHJvdG9jb2wud3JpdGVNZXNzYWdlQmVnaW4obWVzc2FnZSk7CisgICAgfSk7CisKKyAgICBncm91cCgnc2hhcmVkIHRlc3RzJywgc2hhcmVkVGVzdHMpOworICB9KTsKK30KKworY2xhc3MgUHJpbWl0aXZlIHsKKyAgZmluYWwgRnVuY3Rpb24gcmVhZDsKKyAgZmluYWwgRnVuY3Rpb24gd3JpdGU7CisgIGZpbmFsIGRlZmF1bHRWYWx1ZTsKKworICBQcmltaXRpdmUodGhpcy5yZWFkLCB0aGlzLndyaXRlLCB0aGlzLmRlZmF1bHRWYWx1ZSk7Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC90ZXN0L3NlcmlhbGl6ZXIvc2VyaWFsaXplcl90ZXN0LmRhcnQgYi9saWIvZGFydC90ZXN0L3NlcmlhbGl6ZXIvc2VyaWFsaXplcl90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY3NjUwMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L3Rlc3Qvc2VyaWFsaXplci9zZXJpYWxpemVyX3Rlc3QuZGFydApAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitsaWJyYXJ5IHRocmlmdC50ZXN0LnNlcmlhbGl6ZXIuc2VyaWFsaXplcl90ZXN0OworCitpbXBvcnQgJ3BhY2thZ2U6dGVzdC90ZXN0LmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOnRocmlmdC90aHJpZnQuZGFydCc7CitpbXBvcnQgJ3NlcmlhbGl6ZXJfdGVzdF9kYXRhLmRhcnQnOworCit2b2lkIG1haW4oKSB7CisgIHZhciBzZXJpYWxpemVyID0gKCkgeworICAgIFREZXNlcmlhbGl6ZXIgZGVzZXJpYWxpemVyOworICAgIFRTZXJpYWxpemVyIHNlcmlhbGl6ZXI7CisgICAgVGVzdFRPYmplY3QgdGVzdFRPYmplY3Q7CisKKyAgICBzZXRVcCgoKSB7CisgICAgICBzZXJpYWxpemVyID0gbmV3IFRTZXJpYWxpemVyKCk7CisgICAgICBkZXNlcmlhbGl6ZXIgPSBuZXcgVERlc2VyaWFsaXplcigpOworICAgICAgCisgICAgICB0ZXN0VE9iamVjdCA9IG5ldyBUZXN0VE9iamVjdCgpOworICAgICAgdGVzdFRPYmplY3QuYiA9IHRydWU7CisgICAgICB0ZXN0VE9iamVjdC5zID0gIlRFU1QiOworICAgICAgdGVzdFRPYmplY3QuZCA9IDE1LjI1OworICAgICAgdGVzdFRPYmplY3QuaSA9IDEwOworICAgICAgCisgICAgICB2YXIgdGVzdExpc3QgPSBuZXcgTGlzdDxTdHJpbmc+KCk7CisgICAgICB0ZXN0TGlzdC5hZGQoIlRFU1QgMSIpOworICAgICAgdGVzdExpc3QuYWRkKCJURVNUIDIiKTsKKyAgICAgIAorICAgICAgdGVzdFRPYmplY3QubCA9IHRlc3RMaXN0OworICAgIH0pOworICAgIAorICAgIGFzc2VydE5ld09iamVjdEVxdWFsc1RPYmplY3QoVGVzdFRPYmplY3QgbmV3T2JqZWN0KSB7CisgICAgICBleHBlY3QobmV3T2JqZWN0LmwsIGVxdWFscyh0ZXN0VE9iamVjdC5sKSk7CisgICAgICBleHBlY3QobmV3T2JqZWN0LmIsIGVxdWFscyh0ZXN0VE9iamVjdC5iKSk7CisgICAgICBleHBlY3QobmV3T2JqZWN0LmksIGVxdWFscyh0ZXN0VE9iamVjdC5pKSk7CisgICAgICBleHBlY3QobmV3T2JqZWN0LmQsIGVxdWFscyh0ZXN0VE9iamVjdC5kKSk7CisgICAgICBleHBlY3QobmV3T2JqZWN0LnMsIGVxdWFscyh0ZXN0VE9iamVjdC5zKSk7CisgICAgfQorICAgIAorICAgIHJ1bldyaXRlU3RyaW5nVGVzdCgpIHsKKyAgICAgIHZhciBzID0gc2VyaWFsaXplci53cml0ZVN0cmluZyh0ZXN0VE9iamVjdCk7CisKKyAgICAgIHZhciBuZXdPYmplY3QgPSBuZXcgVGVzdFRPYmplY3QoKTsKKyAgICAgIGRlc2VyaWFsaXplci5yZWFkU3RyaW5nKG5ld09iamVjdCwgcyk7CisKKyAgICAgIGFzc2VydE5ld09iamVjdEVxdWFsc1RPYmplY3QobmV3T2JqZWN0KTsKKyAgICB9OworCisgICAgcnVuV3JpdGVUZXN0KCkgeworICAgICAgdmFyIHMgPSBzZXJpYWxpemVyLndyaXRlKHRlc3RUT2JqZWN0KTsKKworICAgICAgdmFyIG5ld09iamVjdCA9IG5ldyBUZXN0VE9iamVjdCgpOworICAgICAgZGVzZXJpYWxpemVyLnJlYWQobmV3T2JqZWN0LCBzKTsKKworICAgICAgYXNzZXJ0TmV3T2JqZWN0RXF1YWxzVE9iamVjdChuZXdPYmplY3QpOworICAgIH07CisKKyAgICB0ZXN0KCdKU09OIFByb3RvY29sIFN0cmluZycsICgpIHsKKyAgICAgIHNlcmlhbGl6ZXIucHJvdG9jb2wgPSBuZXcgVEpzb25Qcm90b2NvbChzZXJpYWxpemVyLnRyYW5zcG9ydCk7CisgICAgICBkZXNlcmlhbGl6ZXIucHJvdG9jb2wgPSBuZXcgVEpzb25Qcm90b2NvbChkZXNlcmlhbGl6ZXIudHJhbnNwb3J0KTsKKyAgICAgIAorICAgICAgcnVuV3JpdGVTdHJpbmdUZXN0KCk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdKU09OIFByb3RvY29sJywgKCkgeworICAgICAgc2VyaWFsaXplci5wcm90b2NvbCA9IG5ldyBUSnNvblByb3RvY29sKHNlcmlhbGl6ZXIudHJhbnNwb3J0KTsKKyAgICAgIGRlc2VyaWFsaXplci5wcm90b2NvbCA9IG5ldyBUSnNvblByb3RvY29sKGRlc2VyaWFsaXplci50cmFuc3BvcnQpOworCisgICAgICBydW5Xcml0ZVRlc3QoKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ0JpbmFyeSBQcm90b2NvbCBTdHJpbmcnLCAoKSB7CisgICAgICBzZXJpYWxpemVyLnByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbChzZXJpYWxpemVyLnRyYW5zcG9ydCk7CisgICAgICBkZXNlcmlhbGl6ZXIucHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKGRlc2VyaWFsaXplci50cmFuc3BvcnQpOworCisgICAgICBydW5Xcml0ZVN0cmluZ1Rlc3QoKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ0JpbmFyeSBQcm90b2NvbCcsICgpIHsKKyAgICAgIHNlcmlhbGl6ZXIucHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKHNlcmlhbGl6ZXIudHJhbnNwb3J0KTsKKyAgICAgIGRlc2VyaWFsaXplci5wcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2woZGVzZXJpYWxpemVyLnRyYW5zcG9ydCk7CisKKyAgICAgIHJ1bldyaXRlVGVzdCgpOworICAgIH0pOworCisgICAgdGVzdCgnQ29tcGFjdCBQcm90b2NvbCBTdHJpbmcnLCAoKSB7CisgICAgICBzZXJpYWxpemVyLnByb3RvY29sID0gbmV3IFRDb21wYWN0UHJvdG9jb2woc2VyaWFsaXplci50cmFuc3BvcnQpOworICAgICAgZGVzZXJpYWxpemVyLnByb3RvY29sID0gbmV3IFRDb21wYWN0UHJvdG9jb2woZGVzZXJpYWxpemVyLnRyYW5zcG9ydCk7CisKKyAgICAgIHJ1bldyaXRlU3RyaW5nVGVzdCgpOworICAgIH0pOworCisgICAgdGVzdCgnQ29tcGFjdCBQcm90b2NvbCcsICgpIHsKKyAgICAgIHNlcmlhbGl6ZXIucHJvdG9jb2wgPSBuZXcgVENvbXBhY3RQcm90b2NvbChzZXJpYWxpemVyLnRyYW5zcG9ydCk7CisgICAgICBkZXNlcmlhbGl6ZXIucHJvdG9jb2wgPSBuZXcgVENvbXBhY3RQcm90b2NvbChkZXNlcmlhbGl6ZXIudHJhbnNwb3J0KTsKKworICAgICAgcnVuV3JpdGVUZXN0KCk7CisgICAgfSk7CisgIH07CisKKyAgZ3JvdXAoJ1NlcmlhbGl6ZXInLCBzZXJpYWxpemVyKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L3Rlc3Qvc2VyaWFsaXplci9zZXJpYWxpemVyX3Rlc3RfZGF0YS5kYXJ0IGIvbGliL2RhcnQvdGVzdC9zZXJpYWxpemVyL3NlcmlhbGl6ZXJfdGVzdF9kYXRhLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU4NmYwOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L3Rlc3Qvc2VyaWFsaXplci9zZXJpYWxpemVyX3Rlc3RfZGF0YS5kYXJ0CkBAIC0wLDAgKzEsMzQyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2xpYnJhcnkgdGhyaWZ0LnRlc3Quc2VyaWFsaXplci5zZXJpYWxpemVyX3Rlc3Q7CisKK2ltcG9ydCAncGFja2FnZTp0aHJpZnQvdGhyaWZ0LmRhcnQnOworCisvLy8gVGVzdFRPYmplY3QgaXMgYSBzaW1wbGUgdGVzdCBzdHJ1Y3QKK2NsYXNzIFRlc3RUT2JqZWN0IGltcGxlbWVudHMgVEJhc2UgeworICBzdGF0aWMgZmluYWwgVFN0cnVjdCBfU1RSVUNUX0RFU0MgPSBuZXcgVFN0cnVjdCgiVGVzdFRPYmplY3QiKTsKKyAgc3RhdGljIGZpbmFsIFRGaWVsZCBfSV9GSUVMRF9ERVNDID0gbmV3IFRGaWVsZCgiaSIsIFRUeXBlLkkzMiwgMSk7CisgIHN0YXRpYyBmaW5hbCBURmllbGQgX0RfRklFTERfREVTQyA9IG5ldyBURmllbGQoImQiLCBUVHlwZS5ET1VCTEUsIDIpOworICBzdGF0aWMgZmluYWwgVEZpZWxkIF9TX0ZJRUxEX0RFU0MgPSBuZXcgVEZpZWxkKCJzIiwgVFR5cGUuU1RSSU5HLCAzKTsKKyAgc3RhdGljIGZpbmFsIFRGaWVsZCBfTF9GSUVMRF9ERVNDID0gbmV3IFRGaWVsZCgibCIsIFRUeXBlLkxJU1QsIDQpOworICBzdGF0aWMgZmluYWwgVEZpZWxkIF9CX0ZJRUxEX0RFU0MgPSBuZXcgVEZpZWxkKCJiIiwgVFR5cGUuQk9PTCwgNSk7CisKKyAgaW50IF9pOworICBzdGF0aWMgY29uc3QgaW50IEkgPSAxOworICBkb3VibGUgX2Q7CisgIHN0YXRpYyBjb25zdCBpbnQgRCA9IDI7CisgIFN0cmluZyBfczsKKyAgc3RhdGljIGNvbnN0IGludCBTID0gMzsKKyAgTGlzdDxTdHJpbmc+IF9sOworICBzdGF0aWMgY29uc3QgaW50IEwgPSA0OworICBib29sIF9iOworICBzdGF0aWMgY29uc3QgaW50IEIgPSA1OworCisgIGJvb2wgX19pc3NldF9pID0gZmFsc2U7CisgIGJvb2wgX19pc3NldF9kID0gZmFsc2U7CisgIGJvb2wgX19pc3NldF9iID0gZmFsc2U7CisKKyAgVGVzdFRPYmplY3QoKSB7CisgIH0KKworICAvLyBpCisgIGludCBnZXQgaSA9PiB0aGlzLl9pOworCisgIHNldCBpKGludCBpKSB7CisgICAgdGhpcy5faSA9IGk7CisgICAgdGhpcy5fX2lzc2V0X2kgPSB0cnVlOworICB9CisKKyAgYm9vbCBpc1NldEkoKSA9PiB0aGlzLl9faXNzZXRfaTsKKworICB1bnNldEkoKSB7CisgICAgdGhpcy5fX2lzc2V0X2kgPSBmYWxzZTsKKyAgfQorCisgIC8vIGQKKyAgZG91YmxlIGdldCBkID0+IHRoaXMuX2Q7CisKKyAgc2V0IGQoZG91YmxlIGQpIHsKKyAgICB0aGlzLl9kID0gZDsKKyAgICB0aGlzLl9faXNzZXRfZCA9IHRydWU7CisgIH0KKworICBib29sIGlzU2V0RCgpID0+IHRoaXMuX19pc3NldF9kOworCisgIHVuc2V0RCgpIHsKKyAgICB0aGlzLl9faXNzZXRfZCA9IGZhbHNlOworICB9CisKKyAgLy8gcworICBTdHJpbmcgZ2V0IHMgPT4gdGhpcy5fczsKKworICBzZXQgcyhTdHJpbmcgcykgeworICAgIHRoaXMuX3MgPSBzOworICB9CisKKyAgYm9vbCBpc1NldFMoKSA9PiB0aGlzLnMgIT0gbnVsbDsKKworICB1bnNldFMoKSB7CisgICAgdGhpcy5zID0gbnVsbDsKKyAgfQorCisgIC8vIGwKKyAgTGlzdDxTdHJpbmc+IGdldCBsID0+IHRoaXMuX2w7CisKKyAgc2V0IGwoTGlzdDxTdHJpbmc+IGwpIHsKKyAgICB0aGlzLl9sID0gbDsKKyAgfQorCisgIGJvb2wgaXNTZXRMKCkgPT4gdGhpcy5sICE9IG51bGw7CisKKyAgdW5zZXRMKCkgeworICAgIHRoaXMubCA9IG51bGw7CisgIH0KKworICAvLyBiCisgIGJvb2wgZ2V0IGIgPT4gdGhpcy5fYjsKKworICBzZXQgYihib29sIGIpIHsKKyAgICB0aGlzLl9iID0gYjsKKyAgICB0aGlzLl9faXNzZXRfYiA9IHRydWU7CisgIH0KKworICBib29sIGlzU2V0QigpID0+IHRoaXMuX19pc3NldF9iOworCisgIHVuc2V0QigpIHsKKyAgICB0aGlzLl9faXNzZXRfYiA9IGZhbHNlOworICB9CisKKyAgZ2V0RmllbGRWYWx1ZShpbnQgZmllbGRJRCkgeworICAgIHN3aXRjaCAoZmllbGRJRCkgeworICAgICAgY2FzZSBJOgorICAgICAgICByZXR1cm4gdGhpcy5pOworICAgICAgY2FzZSBEOgorICAgICAgICByZXR1cm4gdGhpcy5kOworICAgICAgY2FzZSBTOgorICAgICAgICByZXR1cm4gdGhpcy5zOworICAgICAgY2FzZSBMOgorICAgICAgICByZXR1cm4gdGhpcy5sOworICAgICAgY2FzZSBCOgorICAgICAgICByZXR1cm4gdGhpcy5iOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoIkZpZWxkICRmaWVsZElEIGRvZXNuJ3QgZXhpc3QhIik7CisgICAgfQorICB9CisKKyAgc2V0RmllbGRWYWx1ZShpbnQgZmllbGRJRCwgT2JqZWN0IHZhbHVlKSB7CisgICAgc3dpdGNoIChmaWVsZElEKSB7CisgICAgICBjYXNlIEk6CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgdW5zZXRJKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGhpcy5pID0gdmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRDoKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICB1bnNldEQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aGlzLmQgPSB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBTOgorICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgIHVuc2V0UygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRoaXMucyA9IHZhbHVlOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEw6CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgdW5zZXRMKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGhpcy5sID0gdmFsdWUgYXMgTGlzdDxTdHJpbmc+OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEI6CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgdW5zZXRCKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGhpcy5iID0gdmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCJGaWVsZCAkZmllbGRJRCBkb2Vzbid0IGV4aXN0ISIpOworICAgIH0KKyAgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBjb3JyZXNwb25kaW5nIHRvIGZpZWxkSUQgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlCisgIGJvb2wgaXNTZXQoaW50IGZpZWxkSUQpIHsKKyAgICBzd2l0Y2ggKGZpZWxkSUQpIHsKKyAgICAgIGNhc2UgSToKKyAgICAgICAgcmV0dXJuIGlzU2V0SSgpOworICAgICAgY2FzZSBEOgorICAgICAgICByZXR1cm4gaXNTZXREKCk7CisgICAgICBjYXNlIFM6CisgICAgICAgIHJldHVybiBpc1NldFMoKTsKKyAgICAgIGNhc2UgTDoKKyAgICAgICAgcmV0dXJuIGlzU2V0TCgpOworICAgICAgY2FzZSBCOgorICAgICAgICByZXR1cm4gaXNTZXRCKCk7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigiRmllbGQgJGZpZWxkSUQgZG9lc24ndCBleGlzdCEiKTsKKyAgICB9CisgIH0KKworICByZWFkKFRQcm90b2NvbCBpcHJvdCkgeworICAgIFRGaWVsZCBmaWVsZDsKKyAgICBpcHJvdC5yZWFkU3RydWN0QmVnaW4oKTsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgZmllbGQgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpOworICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuU1RPUCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHN3aXRjaCAoZmllbGQuaWQpIHsKKyAgICAgICAgY2FzZSBJOgorICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLkkzMikgeworICAgICAgICAgICAgdGhpcy5pID0gaXByb3QucmVhZEkzMigpOworICAgICAgICAgICAgdGhpcy5fX2lzc2V0X2kgPSB0cnVlOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEOgorICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLkRPVUJMRSkgeworICAgICAgICAgICAgdGhpcy5kID0gaXByb3QucmVhZERvdWJsZSgpOworICAgICAgICAgICAgdGhpcy5fX2lzc2V0X2QgPSB0cnVlOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTOgorICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLlNUUklORykgeworICAgICAgICAgICAgdGhpcy5zID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBMOgorICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLkxJU1QpIHsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgVExpc3QgX2xpc3Q3NCA9IGlwcm90LnJlYWRMaXN0QmVnaW4oKTsKKyAgICAgICAgICAgICAgdGhpcy5sID0gbmV3IExpc3Q8U3RyaW5nPigpOworICAgICAgICAgICAgICBmb3IgKGludCBfaTc1ID0gMDsgX2k3NSA8IF9saXN0NzQubGVuZ3RoOyArK19pNzUpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgX2VsZW03NjsKKyAgICAgICAgICAgICAgICBfZWxlbTc2ID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgICAgICAgIHRoaXMubC5hZGQoX2VsZW03Nik7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaXByb3QucmVhZExpc3RFbmQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQjoKKyAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5CT09MKSB7CisgICAgICAgICAgICB0aGlzLmIgPSBpcHJvdC5yZWFkQm9vbCgpOworICAgICAgICAgICAgdGhpcy5fX2lzc2V0X2IgPSB0cnVlOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaXByb3QucmVhZEZpZWxkRW5kKCk7CisgICAgfQorICAgIGlwcm90LnJlYWRTdHJ1Y3RFbmQoKTsKKworICAgIC8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMgb2YgcHJpbWl0aXZlIHR5cGUsIHdoaWNoIGNhbid0IGJlIGNoZWNrZWQgaW4gdGhlIHZhbGlkYXRlIG1ldGhvZAorICAgIHZhbGlkYXRlKCk7CisgIH0KKworICB3cml0ZShUUHJvdG9jb2wgb3Byb3QpIHsKKyAgICB2YWxpZGF0ZSgpOworCisgICAgb3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihfU1RSVUNUX0RFU0MpOworICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihfSV9GSUVMRF9ERVNDKTsKKyAgICBvcHJvdC53cml0ZUkzMih0aGlzLmkpOworICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oX0RfRklFTERfREVTQyk7CisgICAgb3Byb3Qud3JpdGVEb3VibGUodGhpcy5kKTsKKyAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgaWYgKHRoaXMucyAhPSBudWxsKSB7CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oX1NfRklFTERfREVTQyk7CisgICAgICBvcHJvdC53cml0ZVN0cmluZyh0aGlzLnMpOworICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgIH0KKyAgICBpZiAodGhpcy5sICE9IG51bGwpIHsKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihfTF9GSUVMRF9ERVNDKTsKKyAgICAgIHsKKyAgICAgICAgb3Byb3Qud3JpdGVMaXN0QmVnaW4obmV3IFRMaXN0KFRUeXBlLlNUUklORywgdGhpcy5sLmxlbmd0aCkpOworICAgICAgICBmb3IgKHZhciBlbGVtNzcgaW4gdGhpcy5sKSB7CisgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoZWxlbTc3KTsKKyAgICAgICAgfQorICAgICAgICBvcHJvdC53cml0ZUxpc3RFbmQoKTsKKyAgICAgIH0KKyAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICB9CisgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKF9CX0ZJRUxEX0RFU0MpOworICAgIG9wcm90LndyaXRlQm9vbCh0aGlzLmIpOworICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICBvcHJvdC53cml0ZUZpZWxkU3RvcCgpOworICAgIG9wcm90LndyaXRlU3RydWN0RW5kKCk7CisgIH0KKworICBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgU3RyaW5nQnVmZmVyIHJldCA9IG5ldyBTdHJpbmdCdWZmZXIoIlRlc3RUT2JqZWN0KCIpOworCisgICAgcmV0LndyaXRlKCJpOiIpOworICAgIHJldC53cml0ZSh0aGlzLmkpOworCisgICAgcmV0LndyaXRlKCIsICIpOworICAgIHJldC53cml0ZSgiZDoiKTsKKyAgICByZXQud3JpdGUodGhpcy5kKTsKKworICAgIHJldC53cml0ZSgiLCAiKTsKKyAgICByZXQud3JpdGUoInM6Iik7CisgICAgaWYgKHRoaXMucyA9PSBudWxsKSB7CisgICAgICByZXQud3JpdGUoIm51bGwiKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0LndyaXRlKHRoaXMucyk7CisgICAgfQorCisgICAgcmV0LndyaXRlKCIsICIpOworICAgIHJldC53cml0ZSgibDoiKTsKKyAgICBpZiAodGhpcy5sID09IG51bGwpIHsKKyAgICAgIHJldC53cml0ZSgibnVsbCIpOworICAgIH0gZWxzZSB7CisgICAgICByZXQud3JpdGUodGhpcy5sKTsKKyAgICB9CisKKyAgICByZXQud3JpdGUoIiwgIik7CisgICAgcmV0LndyaXRlKCJiOiIpOworICAgIHJldC53cml0ZSh0aGlzLmIpOworCisgICAgcmV0LndyaXRlKCIpIik7CisKKyAgICByZXR1cm4gcmV0LnRvU3RyaW5nKCk7CisgIH0KKworICB2YWxpZGF0ZSgpIHsKKyAgICAvLyBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzCisgICAgLy8gY2hlY2sgdGhhdCBmaWVsZHMgb2YgdHlwZSBlbnVtIGhhdmUgdmFsaWQgdmFsdWVzCisgIH0KKworfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvdGVzdC90X2FwcGxpY2F0aW9uX2Vycm9yX3Rlc3QuZGFydCBiL2xpYi9kYXJ0L3Rlc3QvdF9hcHBsaWNhdGlvbl9lcnJvcl90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTExZDhkNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L3Rlc3QvdF9hcHBsaWNhdGlvbl9lcnJvcl90ZXN0LmRhcnQKQEAgLTAsMCArMSw0NiBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworbGlicmFyeSB0aHJpZnQudGVzdC50X2FwcGxpY2F0aW9uX2Vycm9yX3Rlc3Q7CisKK2ltcG9ydCAncGFja2FnZTp0ZXN0L3Rlc3QuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6dGhyaWZ0L3RocmlmdC5kYXJ0JzsKKwordm9pZCBtYWluKCkgeworICBUUHJvdG9jb2wgcHJvdG9jb2w7CisKKyAgc2V0VXAoKCkgeworICAgIHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbChuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KCkpOworICB9KTsKKworICB0ZXN0KCdXcml0ZSBhbmQgcmVhZCBhbiBhcHBsaWNhdGlvbiBlcnJvcicsICgpIHsKKyAgICB2YXIgZXhwZWN0ZWRUeXBlID0gVEFwcGxpY2F0aW9uRXJyb3JUeXBlLklOVEVSTkFMX0VSUk9SOworICAgIHZhciBleHBlY3RlZE1lc3NhZ2UgPSAndGVzdCBlcnJvciBtZXNzYWdlJzsKKworICAgIFRBcHBsaWNhdGlvbkVycm9yIGVycm9yID0KKyAgICAgICAgbmV3IFRBcHBsaWNhdGlvbkVycm9yKGV4cGVjdGVkVHlwZSwgZXhwZWN0ZWRNZXNzYWdlKTsKKyAgICBlcnJvci53cml0ZShwcm90b2NvbCk7CisKKyAgICBwcm90b2NvbC50cmFuc3BvcnQuZmx1c2goKTsKKworICAgIFRBcHBsaWNhdGlvbkVycm9yIHN1YmplY3QgPSBUQXBwbGljYXRpb25FcnJvci5yZWFkKHByb3RvY29sKTsKKworICAgIGV4cGVjdChzdWJqZWN0LCBpc05vdE51bGwpOworICAgIGV4cGVjdChzdWJqZWN0LnR5cGUsIGV4cGVjdGVkVHlwZSk7CisgICAgZXhwZWN0KHN1YmplY3QubWVzc2FnZSwgZXhwZWN0ZWRNZXNzYWdlKTsKKyAgfSk7Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC90ZXN0L3RyYW5zcG9ydC90X2ZyYW1lZF90cmFuc3BvcnRfdGVzdC5kYXJ0IGIvbGliL2RhcnQvdGVzdC90cmFuc3BvcnQvdF9mcmFtZWRfdHJhbnNwb3J0X3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDcyZTY4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvdGVzdC90cmFuc3BvcnQvdF9mcmFtZWRfdHJhbnNwb3J0X3Rlc3QuZGFydApAQCAtMCwwICsxLDE3NSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworbGlicmFyeSB0aHJpZnQudGVzdC50cmFuc3BvcnQudF9mcmFtZWRfdHJhbnNwb3J0X3Rlc3Q7CisKK2ltcG9ydCAnZGFydDphc3luYyc7CitpbXBvcnQgJ2RhcnQ6Y29udmVydCc7CitpbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YScgc2hvdyBVaW50OExpc3Q7CisKK2ltcG9ydCAncGFja2FnZTp0ZXN0L3Rlc3QuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6dGhyaWZ0L3RocmlmdC5kYXJ0JzsKKwordm9pZCBtYWluKCkgeworICBncm91cCgnVEZyYW1lZFRyYW5zcG9ydCBwYXJ0aWFsIHJlYWRzJywgKCkgeworICAgIGZpbmFsIGZsdXNoQXdhaXREdXJhdGlvbiA9IG5ldyBEdXJhdGlvbihzZWNvbmRzOiAxMCk7CisKKyAgICBGYWtlUmVhZE9ubHlTb2NrZXQgc29ja2V0OworICAgIFRTb2NrZXRUcmFuc3BvcnQgc29ja2V0VHJhbnNwb3J0OworICAgIFRGcmFtZWRUcmFuc3BvcnQgdHJhbnNwb3J0OworICAgIHZhciBtZXNzYWdlQXZhaWxhYmxlOworCisgICAgc2V0VXAoKCkgeworICAgICAgc29ja2V0ID0gbmV3IEZha2VSZWFkT25seVNvY2tldCgpOworICAgICAgc29ja2V0VHJhbnNwb3J0ID0gbmV3IFRDbGllbnRTb2NrZXRUcmFuc3BvcnQoc29ja2V0KTsKKyAgICAgIHRyYW5zcG9ydCA9IG5ldyBURnJhbWVkVHJhbnNwb3J0KHNvY2tldFRyYW5zcG9ydCk7CisgICAgICBtZXNzYWdlQXZhaWxhYmxlID0gZmFsc2U7CisgICAgfSk7CisKKyAgICBleHBlY3ROb1JlYWRhYmxlQnl0ZXMoKSB7CisgICAgICB2YXIgcmVhZEJ1ZmZlciA9IG5ldyBVaW50OExpc3QoMTI4KTsKKyAgICAgIHZhciByZWFkQnl0ZXMgPSB0cmFuc3BvcnQucmVhZChyZWFkQnVmZmVyLCAwLCByZWFkQnVmZmVyLmxlbmd0aEluQnl0ZXMpOworICAgICAgZXhwZWN0KHJlYWRCeXRlcywgMCk7CisgICAgICBleHBlY3QobWVzc2FnZUF2YWlsYWJsZSwgZmFsc2UpOworICAgIH0KKworICAgIHRlc3QoJ1Rlc3QgdHJhbnNwb3J0IHJlYWRzIG1lc3NhZ2VzIHdoZXJlIGhlYWRlciBhbmQgYm9keSBhcmUgc2VudCBzZXBhcmF0ZWx5JywgKCkgYXN5bmMgeworICAgICAgLy8gYnVmZmVyIGludG8gd2hpY2ggd2UnbGwgcmVhZAorICAgICAgdmFyIHJlYWRCdWZmZXIgPSBuZXcgVWludDhMaXN0KDEwKTsKKyAgICAgIHZhciByZWFkQnl0ZXM7CisKKyAgICAgIC8vIHJlZ2lzdGVycyBmb3IgcmVhZGFibGUgYnl0ZXMKKyAgICAgIHZhciBmbHVzaEZ1dHVyZSA9IHRyYW5zcG9ydC5mbHVzaCgpLnRpbWVvdXQoZmx1c2hBd2FpdER1cmF0aW9uKTsKKyAgICAgIGZsdXNoRnV0dXJlLnRoZW4oKF8pIHsKKyAgICAgICAgbWVzc2FnZUF2YWlsYWJsZSA9IHRydWU7CisgICAgICB9KTsKKworICAgICAgLy8gd3JpdGUgaGVhZGVyIGJ5dGVzCisgICAgICBzb2NrZXQubWVzc2FnZUNvbnRyb2xsZXIuYWRkKG5ldyBVaW50OExpc3QuZnJvbUxpc3QoWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDZdKSk7CisKKyAgICAgIC8vIHlvdSBzaG91bGRuJ3QgYmUgYWJsZSB0byBnZXQgYW55IGJ5dGVzIGZyb20gdGhlIHJlYWQsCisgICAgICAvLyBiZWNhdXNlIHRoZSBoZWFkZXIgaGFzIGJlZW4gY29uc3VtZWQgaW50ZXJuYWxseQorICAgICAgZXhwZWN0Tm9SZWFkYWJsZUJ5dGVzKCk7CisKKyAgICAgIC8vIHdyaXRlIGZpcnN0IGJhdGNoIG9mIGJvZHkKKyAgICAgIHNvY2tldC5tZXNzYWdlQ29udHJvbGxlci5hZGQobmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChVVEY4LmVuY29kZSgiSGUiKSkpOworCisgICAgICAvLyB5b3Ugc2hvdWxkbid0IGJlIGFibGUgdG8gZ2V0IGFueSBieXRlcyBmcm9tIHRoZSByZWFkLAorICAgICAgLy8gYmVjYXVzZSB0aGUgZnJhbWUgaGFzIGJlZW4gY29uc3VtZWQgaW50ZXJuYWxseQorICAgICAgZXhwZWN0Tm9SZWFkYWJsZUJ5dGVzKCk7CisKKyAgICAgIC8vIHdyaXRlIHNlY29uZCBiYXRjaCBvZiBib2R5CisgICAgICBzb2NrZXQubWVzc2FnZUNvbnRyb2xsZXIuYWRkKG5ldyBVaW50OExpc3QuZnJvbUxpc3QoVVRGOC5lbmNvZGUoImxsbyEiKSkpOworCisgICAgICAvLyBoYXZlIHRvIHdhaXQgZm9yIHRoZSBmbHVzaCB0byBjb21wbGV0ZSwKKyAgICAgIC8vIGJlY2F1c2UgaXQncyBvbmx5IHRoZW4gdGhhdCB0aGUgZnJhbWUgaXMgYXZhaWxhYmxlIGZvciByZWFkaW5nCisgICAgICBhd2FpdCBmbHVzaEZ1dHVyZTsKKyAgICAgIGV4cGVjdChtZXNzYWdlQXZhaWxhYmxlLCB0cnVlKTsKKworICAgICAgLy8gYXQgdGhpcyBwb2ludCB0aGUgZnJhbWUgaXMgY29tcGxldGUsIHNvIHdlIGV4cGVjdCB0aGUgcmVhZCB0byBjb21wbGV0ZQorICAgICAgcmVhZEJ5dGVzID0gdHJhbnNwb3J0LnJlYWQocmVhZEJ1ZmZlciwgMCwgcmVhZEJ1ZmZlci5sZW5ndGhJbkJ5dGVzKTsKKyAgICAgIGV4cGVjdChyZWFkQnl0ZXMsIDYpOworICAgICAgZXhwZWN0KHJlYWRCdWZmZXIuc3VibGlzdCgwLCA2KSwgVVRGOC5lbmNvZGUoIkhlbGxvISIpKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgdHJhbnNwb3J0IHJlYWRzIG1lc3NhZ2VzIHdoZXJlIGhlYWRlciBpcyBzZW50IGluIHBpZWNlcyAnCisgICAgICAgICAnYW5kIGJvZHkgaXMgYWxzbyBzZW50IGluIHBpZWNlcycsICgpIGFzeW5jIHsKKyAgICAgIC8vIGJ1ZmZlciBpbnRvIHdoaWNoIHdlJ2xsIHJlYWQKKyAgICAgIHZhciByZWFkQnVmZmVyID0gbmV3IFVpbnQ4TGlzdCgxMCk7CisgICAgICB2YXIgcmVhZEJ5dGVzOworCisgICAgICAvLyByZWdpc3RlcnMgZm9yIHJlYWRhYmxlIGJ5dGVzCisgICAgICB2YXIgZmx1c2hGdXR1cmUgPSB0cmFuc3BvcnQuZmx1c2goKS50aW1lb3V0KGZsdXNoQXdhaXREdXJhdGlvbik7CisgICAgICBmbHVzaEZ1dHVyZS50aGVuKChfKSB7CisgICAgICAgIG1lc3NhZ2VBdmFpbGFibGUgPSB0cnVlOworICAgICAgfSk7CisKKyAgICAgIC8vIHdyaXRlIGZpcnN0IHBhcnQgb2YgaGVhZGVyIGJ5dGVzCisgICAgICBzb2NrZXQubWVzc2FnZUNvbnRyb2xsZXIuYWRkKG5ldyBVaW50OExpc3QuZnJvbUxpc3QoWzB4MDAsIDB4MDBdKSk7CisKKyAgICAgIC8vIHlvdSBzaG91bGRuJ3QgYmUgYWJsZSB0byBnZXQgYW55IGJ5dGVzIGZyb20gdGhlIHJlYWQKKyAgICAgIGV4cGVjdE5vUmVhZGFibGVCeXRlcygpOworCisgICAgICAvLyB3cml0ZSBzZWNvbmQgcGFydCBvZiBoZWFkZXIgYnl0ZXMKKyAgICAgIHNvY2tldC5tZXNzYWdlQ29udHJvbGxlci5hZGQobmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChbMHgwMCwgMHgwM10pKTsKKworICAgICAgLy8geW91IHNob3VsZG4ndCBiZSBhYmxlIHRvIGdldCBhbnkgYnl0ZXMgZnJvbSB0aGUgcmVhZCBhZ2FpbgorICAgICAgLy8gYmVjYXVzZSBvbmx5IHRoZSBoZWFkZXIgd2FzIHJlYWQsIGFuZCB0aGVyZSdzIG5vIGZyYW1lIGJvZHkKKyAgICAgIHJlYWRCeXRlcyA9IGV4cGVjdE5vUmVhZGFibGVCeXRlcygpOworCisgICAgICAvLyB3cml0ZSBmaXJzdCBiYXRjaCBvZiBib2R5CisgICAgICBzb2NrZXQubWVzc2FnZUNvbnRyb2xsZXIuYWRkKG5ldyBVaW50OExpc3QuZnJvbUxpc3QoVVRGOC5lbmNvZGUoIkgiKSkpOworCisgICAgICAvLyB5b3Ugc2hvdWxkbid0IGJlIGFibGUgdG8gZ2V0IGFueSBieXRlcyBmcm9tIHRoZSByZWFkLAorICAgICAgLy8gYmVjYXVzZSB0aGUgZnJhbWUgaGFzIGJlZW4gY29uc3VtZWQgaW50ZXJuYWxseQorICAgICAgZXhwZWN0Tm9SZWFkYWJsZUJ5dGVzKCk7CisKKyAgICAgIC8vIHdyaXRlIHNlY29uZCBiYXRjaCBvZiBib2R5CisgICAgICBzb2NrZXQubWVzc2FnZUNvbnRyb2xsZXIuYWRkKG5ldyBVaW50OExpc3QuZnJvbUxpc3QoVVRGOC5lbmNvZGUoImkhIikpKTsKKworICAgICAgLy8gaGF2ZSB0byB3YWl0IGZvciB0aGUgZmx1c2ggdG8gY29tcGxldGUsCisgICAgICAvLyBiZWNhdXNlIGl0J3Mgb25seSB0aGVuIHRoYXQgdGhlIGZyYW1lIGlzIGF2YWlsYWJsZSBmb3IgcmVhZGluZworICAgICAgYXdhaXQgZmx1c2hGdXR1cmU7CisgICAgICBleHBlY3QobWVzc2FnZUF2YWlsYWJsZSwgdHJ1ZSk7CisKKyAgICAgIC8vIGF0IHRoaXMgcG9pbnQgdGhlIGZyYW1lIGlzIGNvbXBsZXRlLCBzbyB3ZSBleHBlY3QgdGhlIHJlYWQgdG8gY29tcGxldGUKKyAgICAgIHJlYWRCeXRlcyA9IHRyYW5zcG9ydC5yZWFkKHJlYWRCdWZmZXIsIDAsIHJlYWRCdWZmZXIubGVuZ3RoSW5CeXRlcyk7CisgICAgICBleHBlY3QocmVhZEJ5dGVzLCAzKTsKKyAgICAgIGV4cGVjdChyZWFkQnVmZmVyLnN1Ymxpc3QoMCwgMyksIFVURjguZW5jb2RlKCJIaSEiKSk7CisgICAgfSk7CisgIH0pOworfQorCisKKworY2xhc3MgRmFrZVJlYWRPbmx5U29ja2V0IGV4dGVuZHMgVFNvY2tldCB7CisKKyAgU3RyZWFtQ29udHJvbGxlcjxVaW50OExpc3Q+IG1lc3NhZ2VDb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXI8VWludDhMaXN0PihzeW5jOiB0cnVlKTsKKyAgU3RyZWFtQ29udHJvbGxlcjxPYmplY3Q+IGVycm9yQ29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyPE9iamVjdD4oKTsKKyAgU3RyZWFtQ29udHJvbGxlcjxUU29ja2V0U3RhdGU+IHN0YXRlQ29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyPFRTb2NrZXRTdGF0ZT4oKTsKKworICBAb3ZlcnJpZGUKKyAgRnV0dXJlIGNsb3NlKCkgeworICAgIC8vIG5vb3AKKyAgfQorCisgIEBvdmVycmlkZQorICBib29sIGdldCBpc0Nsb3NlZCA9PiBmYWxzZTsKKworICBAb3ZlcnJpZGUKKyAgYm9vbCBnZXQgaXNPcGVuID0+IHRydWU7CisKKyAgQG92ZXJyaWRlCisgIFN0cmVhbTxPYmplY3Q+IGdldCBvbkVycm9yID0+IGVycm9yQ29udHJvbGxlci5zdHJlYW07CisKKyAgQG92ZXJyaWRlCisgIFN0cmVhbTxVaW50OExpc3Q+IGdldCBvbk1lc3NhZ2UgPT4gbWVzc2FnZUNvbnRyb2xsZXIuc3RyZWFtOworCisgIEBvdmVycmlkZQorICBTdHJlYW08VFNvY2tldFN0YXRlPiBnZXQgb25TdGF0ZSA9PiBzdGF0ZUNvbnRyb2xsZXIuc3RyZWFtOworCisgIEBvdmVycmlkZQorICBGdXR1cmUgb3BlbigpIHsKKyAgICAvLyBub29wCisgIH0KKworICBAb3ZlcnJpZGUKKyAgdm9pZCBzZW5kKFVpbnQ4TGlzdCBkYXRhKSB7CisgICAgLy8gbm9vcAorICB9Cit9CisKZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L3Rlc3QvdHJhbnNwb3J0L3RfaHR0cF90cmFuc3BvcnRfdGVzdC5kYXJ0IGIvbGliL2RhcnQvdGVzdC90cmFuc3BvcnQvdF9odHRwX3RyYW5zcG9ydF90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZmM2QwNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L3Rlc3QvdHJhbnNwb3J0L3RfaHR0cF90cmFuc3BvcnRfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMTY0IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitsaWJyYXJ5IHRocmlmdC50ZXN0LnRyYW5zcG9ydC50X3NvY2tldF90cmFuc3BvcnRfdGVzdDsKKworaW1wb3J0ICdkYXJ0OmFzeW5jJzsKK2ltcG9ydCAnZGFydDpjb252ZXJ0JyBzaG93IEVuY29kaW5nOworaW1wb3J0ICdkYXJ0OmNvbnZlcnQnIHNob3cgVXRmOENvZGVjLCBCQVNFNjQ7CitpbXBvcnQgJ2RhcnQ6dHlwZWRfZGF0YScgc2hvdyBVaW50OExpc3Q7CisKK2ltcG9ydCAncGFja2FnZTpodHRwL2h0dHAuZGFydCcgc2hvdyBCYXNlUmVxdWVzdDsKK2ltcG9ydCAncGFja2FnZTpodHRwL2h0dHAuZGFydCcgc2hvdyBDbGllbnQ7CitpbXBvcnQgJ3BhY2thZ2U6aHR0cC9odHRwLmRhcnQnIHNob3cgUmVzcG9uc2U7CitpbXBvcnQgJ3BhY2thZ2U6aHR0cC9odHRwLmRhcnQnIHNob3cgU3RyZWFtZWRSZXNwb25zZTsKK2ltcG9ydCAncGFja2FnZTp0ZXN0L3Rlc3QuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6dGhyaWZ0L3RocmlmdC5kYXJ0JzsKKwordm9pZCBtYWluKCkgeworICBjb25zdCB1dGY4Q29kZWMgPSBjb25zdCBVdGY4Q29kZWMoKTsKKworICBncm91cCgnVEh0dHBDbGllbnRUcmFuc3BvcnQnLCAoKSB7CisgICAgRmFrZUh0dHBDbGllbnQgY2xpZW50OworICAgIFRIdHRwQ2xpZW50VHJhbnNwb3J0IHRyYW5zcG9ydDsKKworICAgIHNldFVwKCgpIHsKKyAgICAgIGNsaWVudCA9IG5ldyBGYWtlSHR0cENsaWVudChzeW5jOiBmYWxzZSk7CisgICAgICB2YXIgY29uZmlnID0gbmV3IFRIdHRwQ29uZmlnKFVyaS5wYXJzZSgnaHR0cDovL2xvY2FsaG9zdCcpLCB7fSk7CisgICAgICB0cmFuc3BvcnQgPSBuZXcgVEh0dHBDbGllbnRUcmFuc3BvcnQoY2xpZW50LCBjb25maWcpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCB0cmFuc3BvcnQgc2VuZHMgYm9keScsICgpIGFzeW5jIHsKKyAgICAgIHZhciBleHBlY3RlZFRleHQgPSAnbXkgcmVxdWVzdCc7CisgICAgICB0cmFuc3BvcnQud3JpdGVBbGwodXRmOENvZGVjLmVuY29kZShleHBlY3RlZFRleHQpKTsKKworICAgICAgZXhwZWN0KGNsaWVudC5wb3N0UmVxdWVzdCwgaXNFbXB0eSk7CisKKyAgICAgIGF3YWl0IHRyYW5zcG9ydC5mbHVzaCgpOworCisgICAgICBleHBlY3QoY2xpZW50LnBvc3RSZXF1ZXN0LCBpc05vdEVtcHR5KTsKKworICAgICAgdmFyIHJlcXVlc3RUZXh0ID0KKyAgICAgICAgICB1dGY4Q29kZWMuZGVjb2RlKEJBU0U2NC5kZWNvZGUoY2xpZW50LnBvc3RSZXF1ZXN0KSk7CisgICAgICBleHBlY3QocmVxdWVzdFRleHQsIGV4cGVjdGVkVGV4dCk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IHRyYW5zcG9ydCByZWNlaXZlcyByZXNwb25zZScsICgpIGFzeW5jIHsKKyAgICAgIHZhciBleHBlY3RlZFRleHQgPSAnbXkgcmVzcG9uc2UnOworICAgICAgdmFyIGV4cGVjdGVkQnl0ZXMgPSB1dGY4Q29kZWMuZW5jb2RlKGV4cGVjdGVkVGV4dCk7CisgICAgICBjbGllbnQucG9zdFJlc3BvbnNlID0gQkFTRTY0LmVuY29kZShleHBlY3RlZEJ5dGVzKTsKKworICAgICAgdHJhbnNwb3J0LndyaXRlQWxsKHV0ZjhDb2RlYy5lbmNvZGUoJ215IHJlcXVlc3QnKSk7CisgICAgICBleHBlY3QodHJhbnNwb3J0Lmhhc1JlYWREYXRhLCBpc0ZhbHNlKTsKKworICAgICAgYXdhaXQgdHJhbnNwb3J0LmZsdXNoKCk7CisKKyAgICAgIGV4cGVjdCh0cmFuc3BvcnQuaGFzUmVhZERhdGEsIGlzVHJ1ZSk7CisKKyAgICAgIHZhciBidWZmZXIgPSBuZXcgVWludDhMaXN0KGV4cGVjdGVkQnl0ZXMubGVuZ3RoKTsKKyAgICAgIHRyYW5zcG9ydC5yZWFkQWxsKGJ1ZmZlciwgMCwgZXhwZWN0ZWRCeXRlcy5sZW5ndGgpOworCisgICAgICB2YXIgYnVmZmVyVGV4dCA9IHV0ZjhDb2RlYy5kZWNvZGUoYnVmZmVyKTsKKyAgICAgIGV4cGVjdChidWZmZXJUZXh0LCBleHBlY3RlZFRleHQpOworICAgIH0pOworICB9KTsKKworICBncm91cCgnVEh0dHBDbGllbnRUcmFuc3BvcnQgd2l0aCBtdWx0aXBsZSBtZXNzYWdlcycsICgpIHsKKyAgICBGYWtlSHR0cENsaWVudCBjbGllbnQ7CisgICAgVEh0dHBDbGllbnRUcmFuc3BvcnQgdHJhbnNwb3J0OworCisgICAgc2V0VXAoKCkgeworICAgICAgY2xpZW50ID0gbmV3IEZha2VIdHRwQ2xpZW50KHN5bmM6IHRydWUpOworICAgICAgdmFyIGNvbmZpZyA9IG5ldyBUSHR0cENvbmZpZyhVcmkucGFyc2UoJ2h0dHA6Ly9sb2NhbGhvc3QnKSwge30pOworICAgICAgdHJhbnNwb3J0ID0gbmV3IFRIdHRwQ2xpZW50VHJhbnNwb3J0KGNsaWVudCwgY29uZmlnKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgcmVhZCBjb3JyZWN0IGJ1ZmZlciBhZnRlciBmbHVzaCcsICgpIGFzeW5jIHsKKyAgICAgIFN0cmluZyBidWZmZXJUZXh0OworICAgICAgdmFyIGV4cGVjdGVkVGV4dCA9ICdyZXNwb25zZSAxJzsKKyAgICAgIHZhciBleHBlY3RlZEJ5dGVzID0gdXRmOENvZGVjLmVuY29kZShleHBlY3RlZFRleHQpOworCisgICAgICAvLyBwcmVwYXJlIGEgcmVzcG9uc2UKKyAgICAgIHRyYW5zcG9ydC53cml0ZUFsbCh1dGY4Q29kZWMuZW5jb2RlKCdyZXF1ZXN0IDEnKSk7CisgICAgICBjbGllbnQucG9zdFJlc3BvbnNlID0gQkFTRTY0LmVuY29kZShleHBlY3RlZEJ5dGVzKTsKKworICAgICAgRnV0dXJlIHJlc3BvbnNlUmVhZHkgPSB0cmFuc3BvcnQuZmx1c2goKS50aGVuKChfKSB7CisgICAgICAgIHZhciBidWZmZXIgPSBuZXcgVWludDhMaXN0KGV4cGVjdGVkQnl0ZXMubGVuZ3RoKTsKKyAgICAgICAgdHJhbnNwb3J0LnJlYWRBbGwoYnVmZmVyLCAwLCBleHBlY3RlZEJ5dGVzLmxlbmd0aCk7CisgICAgICAgIGJ1ZmZlclRleHQgPSB1dGY4Q29kZWMuZGVjb2RlKGJ1ZmZlcik7CisgICAgICB9KTsKKworICAgICAgLy8gcHJlcGFyZSBhIHNlY29uZCByZXNwb25zZQorICAgICAgdHJhbnNwb3J0LndyaXRlQWxsKHV0ZjhDb2RlYy5lbmNvZGUoJ3JlcXVlc3QgMicpKTsKKyAgICAgIHZhciByZXNwb25zZTJCeXRlcyA9IHV0ZjhDb2RlYy5lbmNvZGUoJ3Jlc3BvbnNlIDInKTsKKyAgICAgIGNsaWVudC5wb3N0UmVzcG9uc2UgPSBCQVNFNjQuZW5jb2RlKHJlc3BvbnNlMkJ5dGVzKTsKKyAgICAgIGF3YWl0IHRyYW5zcG9ydC5mbHVzaCgpOworCisgICAgICBhd2FpdCByZXNwb25zZVJlYWR5OworICAgICAgZXhwZWN0KGJ1ZmZlclRleHQsIGV4cGVjdGVkVGV4dCk7CisgICAgfSk7CisgIH0pOworfQorCitjbGFzcyBGYWtlSHR0cENsaWVudCBpbXBsZW1lbnRzIENsaWVudCB7CisgIFN0cmluZyBwb3N0UmVzcG9uc2UgPSAnJzsKKyAgU3RyaW5nIHBvc3RSZXF1ZXN0ID0gJyc7CisKKyAgZmluYWwgYm9vbCBzeW5jOworCisgIEZha2VIdHRwQ2xpZW50KHt0aGlzLnN5bmM6IGZhbHNlfSk7CisKKyAgRnV0dXJlPFJlc3BvbnNlPiBwb3N0KHVybCwKKyAgICAgIHtNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnMsIGJvZHksIEVuY29kaW5nIGVuY29kaW5nfSkgeworICAgIHBvc3RSZXF1ZXN0ID0gYm9keTsKKyAgICB2YXIgcmVzcG9uc2UgPSBuZXcgUmVzcG9uc2UocG9zdFJlc3BvbnNlLCAyMDApOworCisgICAgaWYgKHN5bmMpIHsKKyAgICAgIHJldHVybiBuZXcgRnV0dXJlLnN5bmMoKCkgPT4gcmVzcG9uc2UpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gbmV3IEZ1dHVyZS52YWx1ZShyZXNwb25zZSk7CisgICAgfQorICB9CisKKyAgRnV0dXJlPFJlc3BvbnNlPiBoZWFkKHVybCwge01hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyc30pID0+CisgICAgICB0aHJvdyBuZXcgVW5pbXBsZW1lbnRlZEVycm9yKCk7CisKKyAgRnV0dXJlPFJlc3BvbnNlPiBnZXQodXJsLCB7TWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzfSkgPT4KKyAgICAgIHRocm93IG5ldyBVbmltcGxlbWVudGVkRXJyb3IoKTsKKworICBGdXR1cmU8UmVzcG9uc2U+IHB1dCh1cmwsCisgICAgICAgICAge01hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVycywgYm9keSwgRW5jb2RpbmcgZW5jb2Rpbmd9KSA9PgorICAgICAgdGhyb3cgbmV3IFVuaW1wbGVtZW50ZWRFcnJvcigpOworCisgIEZ1dHVyZTxSZXNwb25zZT4gcGF0Y2godXJsLAorICAgICAgICAgIHtNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnMsIGJvZHksIEVuY29kaW5nIGVuY29kaW5nfSkgPT4KKyAgICAgIHRocm93IG5ldyBVbmltcGxlbWVudGVkRXJyb3IoKTsKKworICBGdXR1cmU8UmVzcG9uc2U+IGRlbGV0ZSh1cmwsIHtNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnN9KSA9PgorICAgICAgdGhyb3cgbmV3IFVuaW1wbGVtZW50ZWRFcnJvcigpOworCisgIEZ1dHVyZTxTdHJpbmc+IHJlYWQodXJsLCB7TWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzfSkgPT4KKyAgICAgIHRocm93IG5ldyBVbmltcGxlbWVudGVkRXJyb3IoKTsKKworICBGdXR1cmU8VWludDhMaXN0PiByZWFkQnl0ZXModXJsLCB7TWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzfSkgPT4KKyAgICAgIHRocm93IG5ldyBVbmltcGxlbWVudGVkRXJyb3IoKTsKKworICBGdXR1cmU8U3RyZWFtZWRSZXNwb25zZT4gc2VuZChCYXNlUmVxdWVzdCByZXF1ZXN0KSA9PgorICAgICAgdGhyb3cgbmV3IFVuaW1wbGVtZW50ZWRFcnJvcigpOworCisgIHZvaWQgY2xvc2UoKSA9PiB0aHJvdyBuZXcgVW5pbXBsZW1lbnRlZEVycm9yKCk7Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC90ZXN0L3RyYW5zcG9ydC90X3NvY2tldF90cmFuc3BvcnRfdGVzdC5kYXJ0IGIvbGliL2RhcnQvdGVzdC90cmFuc3BvcnQvdF9zb2NrZXRfdHJhbnNwb3J0X3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjlhYjE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvdGVzdC90cmFuc3BvcnQvdF9zb2NrZXRfdHJhbnNwb3J0X3Rlc3QuZGFydApAQCAtMCwwICsxLDMxMSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworbGlicmFyeSB0aHJpZnQudGVzdC50cmFuc3BvcnQudF9zb2NrZXRfdHJhbnNwb3J0X3Rlc3Q7CisKK2ltcG9ydCAnZGFydDphc3luYyc7CitpbXBvcnQgJ2RhcnQ6Y29udmVydCcgc2hvdyBVdGY4Q29kZWMsIEJBU0U2NDsKK2ltcG9ydCAnZGFydDp0eXBlZF9kYXRhJyBzaG93IFVpbnQ4TGlzdDsKKworaW1wb3J0ICdwYWNrYWdlOm1vY2tpdG8vbW9ja2l0by5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTp0ZXN0L3Rlc3QuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6dGhyaWZ0L3RocmlmdC5kYXJ0JzsKKwordm9pZCBtYWluKCkgeworICBjb25zdCB1dGY4Q29kZWMgPSBjb25zdCBVdGY4Q29kZWMoKTsKKworICBmaW5hbCByZXF1ZXN0VGV4dCA9ICdteSB0ZXN0IHJlcXVlc3QnOworICBmaW5hbCByZXF1ZXN0Qnl0ZXMgPSBuZXcgVWludDhMaXN0LmZyb21MaXN0KHV0ZjhDb2RlYy5lbmNvZGUocmVxdWVzdFRleHQpKTsKKyAgZmluYWwgcmVxdWVzdEJhc2U2NCA9IEJBU0U2NC5lbmNvZGUocmVxdWVzdEJ5dGVzKTsKKworICBmaW5hbCByZXNwb25zZVRleHQgPSAncmVzcG9uc2UgMSc7CisgIGZpbmFsIHJlc3BvbnNlQnl0ZXMgPSBuZXcgVWludDhMaXN0LmZyb21MaXN0KHV0ZjhDb2RlYy5lbmNvZGUocmVzcG9uc2VUZXh0KSk7CisgIGZpbmFsIHJlc3BvbnNlQmFzZTY0ID0gQkFTRTY0LmVuY29kZShyZXNwb25zZUJ5dGVzKTsKKworICBmaW5hbCBmcmFtZWRSZXNwb25zZUJhc2U2NCA9CisgICAgICBCQVNFNjQuZW5jb2RlKF9nZXRGcmFtZWRSZXNwb25zZShyZXNwb25zZUJ5dGVzKSk7CisKKyAgZ3JvdXAoJ1RDbGllbnRTb2NrZXRUcmFuc3BvcnQnLCAoKSB7CisgICAgRmFrZVNvY2tldCBzb2NrZXQ7CisgICAgVFRyYW5zcG9ydCB0cmFuc3BvcnQ7CisKKyAgICBzZXRVcCgoKSBhc3luYyB7CisgICAgICBzb2NrZXQgPSBuZXcgRmFrZVNvY2tldChzeW5jOiBmYWxzZSk7CisgICAgICBhd2FpdCBzb2NrZXQub3BlbigpOworICAgICAgdHJhbnNwb3J0ID0gbmV3IFRDbGllbnRTb2NrZXRUcmFuc3BvcnQoc29ja2V0KTsKKyAgICAgIGF3YWl0IHRyYW5zcG9ydC5vcGVuKCk7CisgICAgICB0cmFuc3BvcnQud3JpdGVBbGwocmVxdWVzdEJ5dGVzKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgY2xpZW50IHNlbmRpbmcgZGF0YSBvdmVyIHRyYW5zcG9ydCcsICgpIGFzeW5jIHsKKyAgICAgIGV4cGVjdChzb2NrZXQuc2VuZFBheWxvYWQsIGlzTnVsbCk7CisKKyAgICAgIEZ1dHVyZSByZXNwb25zZVJlYWR5ID0gdHJhbnNwb3J0LmZsdXNoKCk7CisKKyAgICAgIC8vIGFsbG93IG1pY3JvdGFzayBldmVudHMgdG8gZmluaXNoCisgICAgICBhd2FpdCBuZXcgRnV0dXJlLnZhbHVlKCk7CisKKyAgICAgIGV4cGVjdChzb2NrZXQuc2VuZFBheWxvYWQsIGlzTm90TnVsbCk7CisgICAgICBleHBlY3Qoc29ja2V0LnNlbmRQYXlsb2FkLCByZXF1ZXN0Qnl0ZXMpOworCisgICAgICAvLyBzaW11bGF0ZSBhIHJlc3BvbnNlCisgICAgICBzb2NrZXQucmVjZWl2ZUZha2VNZXNzYWdlKHJlc3BvbnNlQmFzZTY0KTsKKworICAgICAgYXdhaXQgcmVzcG9uc2VSZWFkeTsKKyAgICAgIHZhciBidWZmZXIgPSBuZXcgVWludDhMaXN0KHJlc3BvbnNlQnl0ZXMubGVuZ3RoKTsKKyAgICAgIHRyYW5zcG9ydC5yZWFkQWxsKGJ1ZmZlciwgMCwgcmVzcG9uc2VCeXRlcy5sZW5ndGgpOworICAgICAgdmFyIGJ1ZmZlclRleHQgPSB1dGY4Q29kZWMuZGVjb2RlKGJ1ZmZlcik7CisKKyAgICAgIGV4cGVjdChidWZmZXJUZXh0LCByZXNwb25zZVRleHQpOworICAgIH0pOworICB9LCB0aW1lb3V0OiBuZXcgVGltZW91dChuZXcgRHVyYXRpb24oc2Vjb25kczogMSkpKTsKKworICBncm91cCgnVENsaWVudFNvY2tldFRyYW5zcG9ydCB3aXRoIEZyYW1lZFRyYW5zcG9ydCcsICgpIHsKKyAgICBGYWtlU29ja2V0IHNvY2tldDsKKyAgICBUVHJhbnNwb3J0IHRyYW5zcG9ydDsKKworICAgIHNldFVwKCgpIGFzeW5jIHsKKyAgICAgIHNvY2tldCA9IG5ldyBGYWtlU29ja2V0KHN5bmM6IHRydWUpOworICAgICAgYXdhaXQgc29ja2V0Lm9wZW4oKTsKKworICAgICAgdHJhbnNwb3J0ID0gbmV3IFRGcmFtZWRUcmFuc3BvcnQobmV3IFRDbGllbnRTb2NrZXRUcmFuc3BvcnQoc29ja2V0KSk7CisgICAgICBhd2FpdCB0cmFuc3BvcnQub3BlbigpOworICAgICAgdHJhbnNwb3J0LndyaXRlQWxsKHJlcXVlc3RCeXRlcyk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUZXN0IGNsaWVudCBzZW5kaW5nIGRhdGEgb3ZlciBmcmFtZWQgdHJhbnNwb3J0JywgKCkgYXN5bmMgeworICAgICAgU3RyaW5nIGJ1ZmZlclRleHQ7CisKKyAgICAgIEZ1dHVyZSByZXNwb25zZVJlYWR5ID0gdHJhbnNwb3J0LmZsdXNoKCkudGhlbigoXykgeworICAgICAgICB2YXIgYnVmZmVyID0gbmV3IFVpbnQ4TGlzdChyZXNwb25zZUJ5dGVzLmxlbmd0aCk7CisgICAgICAgIHRyYW5zcG9ydC5yZWFkQWxsKGJ1ZmZlciwgMCwgcmVzcG9uc2VCeXRlcy5sZW5ndGgpOworICAgICAgICBidWZmZXJUZXh0ID0gdXRmOENvZGVjLmRlY29kZShidWZmZXIpOworICAgICAgfSk7CisKKyAgICAgIC8vIHNpbXVsYXRlIGEgcmVzcG9uc2UKKyAgICAgIHNvY2tldC5yZWNlaXZlRmFrZU1lc3NhZ2UoZnJhbWVkUmVzcG9uc2VCYXNlNjQpOworCisgICAgICBhd2FpdCByZXNwb25zZVJlYWR5OworICAgICAgZXhwZWN0KGJ1ZmZlclRleHQsIHJlc3BvbnNlVGV4dCk7CisgICAgfSk7CisgIH0sIHRpbWVvdXQ6IG5ldyBUaW1lb3V0KG5ldyBEdXJhdGlvbihzZWNvbmRzOiAxKSkpOworCisgIGdyb3VwKCdUQXN5bmNDbGllbnRTb2NrZXRUcmFuc3BvcnQnLCAoKSB7CisgICAgRmFrZVNvY2tldCBzb2NrZXQ7CisgICAgRmFrZVByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3Rvcnk7CisgICAgVFRyYW5zcG9ydCB0cmFuc3BvcnQ7CisKKyAgICBzZXRVcCgoKSBhc3luYyB7CisgICAgICBzb2NrZXQgPSBuZXcgRmFrZVNvY2tldChzeW5jOiB0cnVlKTsKKyAgICAgIGF3YWl0IHNvY2tldC5vcGVuKCk7CisKKyAgICAgIHByb3RvY29sRmFjdG9yeSA9IG5ldyBGYWtlUHJvdG9jb2xGYWN0b3J5KCk7CisgICAgICBwcm90b2NvbEZhY3RvcnkubWVzc2FnZSA9IG5ldyBUTWVzc2FnZSgnZm9vJywgVE1lc3NhZ2VUeXBlLkNBTEwsIDEyMyk7CisgICAgICB0cmFuc3BvcnQgPSBuZXcgVEFzeW5jQ2xpZW50U29ja2V0VHJhbnNwb3J0KAorICAgICAgICAgIHNvY2tldCwgbmV3IFRNZXNzYWdlUmVhZGVyKHByb3RvY29sRmFjdG9yeSksCisgICAgICAgICAgcmVzcG9uc2VUaW1lb3V0OiBEdXJhdGlvbi5aRVJPKTsKKyAgICAgIGF3YWl0IHRyYW5zcG9ydC5vcGVuKCk7CisgICAgICB0cmFuc3BvcnQud3JpdGVBbGwocmVxdWVzdEJ5dGVzKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1Rlc3QgcmVzcG9uc2UgY29ycmVsYXRlcyB0byBjb3JyZWN0IHJlcXVlc3QnLCAoKSBhc3luYyB7CisgICAgICBTdHJpbmcgYnVmZmVyVGV4dDsKKworICAgICAgRnV0dXJlIHJlc3BvbnNlUmVhZHkgPSB0cmFuc3BvcnQuZmx1c2goKS50aGVuKChfKSB7CisgICAgICAgIHZhciBidWZmZXIgPSBuZXcgVWludDhMaXN0KHJlc3BvbnNlQnl0ZXMubGVuZ3RoKTsKKyAgICAgICAgdHJhbnNwb3J0LnJlYWRBbGwoYnVmZmVyLCAwLCByZXNwb25zZUJ5dGVzLmxlbmd0aCk7CisgICAgICAgIGJ1ZmZlclRleHQgPSB1dGY4Q29kZWMuZGVjb2RlKGJ1ZmZlcik7CisgICAgICB9KTsKKworICAgICAgLy8gc2ltdWxhdGUgYSByZXNwb25zZQorICAgICAgcHJvdG9jb2xGYWN0b3J5Lm1lc3NhZ2UgPSBuZXcgVE1lc3NhZ2UoJ2ZvbycsIFRNZXNzYWdlVHlwZS5SRVBMWSwgMTIzKTsKKyAgICAgIHNvY2tldC5yZWNlaXZlRmFrZU1lc3NhZ2UocmVzcG9uc2VCYXNlNjQpOworCisgICAgICAvLyBzaW11bGF0ZSBhIHNlY29uZCByZXNwb25zZQorICAgICAgdmFyIHJlc3BvbnNlMlRleHQgPSAncmVzcG9uc2UgMic7CisgICAgICB2YXIgcmVzcG9uc2UyQnl0ZXMgPQorICAgICAgICAgIG5ldyBVaW50OExpc3QuZnJvbUxpc3QodXRmOENvZGVjLmVuY29kZShyZXNwb25zZTJUZXh0KSk7CisgICAgICB2YXIgcmVzcG9uc2UyQmFzZTY0ID0gQkFTRTY0LmVuY29kZShyZXNwb25zZTJCeXRlcyk7CisgICAgICBwcm90b2NvbEZhY3RvcnkubWVzc2FnZSA9IG5ldyBUTWVzc2FnZSgnZm9vMicsIFRNZXNzYWdlVHlwZS5SRVBMWSwgMTI0KTsKKyAgICAgIHNvY2tldC5yZWNlaXZlRmFrZU1lc3NhZ2UocmVzcG9uc2UyQmFzZTY0KTsKKworICAgICAgYXdhaXQgcmVzcG9uc2VSZWFkeTsKKyAgICAgIGV4cGVjdChidWZmZXJUZXh0LCByZXNwb25zZVRleHQpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCByZXNwb25zZSB0aW1lb3V0JywgKCkgYXN5bmMgeworICAgICAgRnV0dXJlIHJlc3BvbnNlUmVhZHkgPSB0cmFuc3BvcnQuZmx1c2goKTsKKyAgICAgIGV4cGVjdChyZXNwb25zZVJlYWR5LCB0aHJvd3NBKG5ldyBpc0luc3RhbmNlT2Y8VGltZW91dEV4Y2VwdGlvbj4oKSkpOworICAgIH0pOworICB9LCB0aW1lb3V0OiBuZXcgVGltZW91dChuZXcgRHVyYXRpb24oc2Vjb25kczogMSkpKTsKKworICBncm91cCgnVEFzeW5jQ2xpZW50U29ja2V0VHJhbnNwb3J0IHdpdGggVEZyYW1lZFRyYW5zcG9ydCcsICgpIHsKKyAgICBGYWtlU29ja2V0IHNvY2tldDsKKyAgICBGYWtlUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeTsKKyAgICBUVHJhbnNwb3J0IHRyYW5zcG9ydDsKKworICAgIHNldFVwKCgpIGFzeW5jIHsKKyAgICAgIHNvY2tldCA9IG5ldyBGYWtlU29ja2V0KHN5bmM6IHRydWUpOworICAgICAgYXdhaXQgc29ja2V0Lm9wZW4oKTsKKworICAgICAgcHJvdG9jb2xGYWN0b3J5ID0gbmV3IEZha2VQcm90b2NvbEZhY3RvcnkoKTsKKyAgICAgIHByb3RvY29sRmFjdG9yeS5tZXNzYWdlID0gbmV3IFRNZXNzYWdlKCdmb28nLCBUTWVzc2FnZVR5cGUuQ0FMTCwgMTIzKTsKKyAgICAgIHZhciBtZXNzYWdlUmVhZGVyID0gbmV3IFRNZXNzYWdlUmVhZGVyKHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICBieXRlT2Zmc2V0OiBURnJhbWVkVHJhbnNwb3J0LmhlYWRlckJ5dGVDb3VudCk7CisKKyAgICAgIHRyYW5zcG9ydCA9IG5ldyBURnJhbWVkVHJhbnNwb3J0KG5ldyBUQXN5bmNDbGllbnRTb2NrZXRUcmFuc3BvcnQoCisgICAgICAgICAgc29ja2V0LCBtZXNzYWdlUmVhZGVyLAorICAgICAgICAgIHJlc3BvbnNlVGltZW91dDogRHVyYXRpb24uWkVSTykpOworICAgICAgYXdhaXQgdHJhbnNwb3J0Lm9wZW4oKTsKKyAgICAgIHRyYW5zcG9ydC53cml0ZUFsbChyZXF1ZXN0Qnl0ZXMpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBhc3luYyBjbGllbnQgc2VuZGluZyBkYXRhIG92ZXIgZnJhbWVkIHRyYW5zcG9ydCcsICgpIGFzeW5jIHsKKyAgICAgIFN0cmluZyBidWZmZXJUZXh0OworCisgICAgICBGdXR1cmUgcmVzcG9uc2VSZWFkeSA9IHRyYW5zcG9ydC5mbHVzaCgpLnRoZW4oKF8pIHsKKyAgICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBVaW50OExpc3QocmVzcG9uc2VCeXRlcy5sZW5ndGgpOworICAgICAgICB0cmFuc3BvcnQucmVhZEFsbChidWZmZXIsIDAsIHJlc3BvbnNlQnl0ZXMubGVuZ3RoKTsKKyAgICAgICAgYnVmZmVyVGV4dCA9IHV0ZjhDb2RlYy5kZWNvZGUoYnVmZmVyKTsKKyAgICAgIH0pOworCisgICAgICAvLyBzaW11bGF0ZSBhIHJlc3BvbnNlCisgICAgICBwcm90b2NvbEZhY3RvcnkubWVzc2FnZSA9IG5ldyBUTWVzc2FnZSgnZm9vJywgVE1lc3NhZ2VUeXBlLlJFUExZLCAxMjMpOworICAgICAgc29ja2V0LnJlY2VpdmVGYWtlTWVzc2FnZShmcmFtZWRSZXNwb25zZUJhc2U2NCk7CisKKyAgICAgIGF3YWl0IHJlc3BvbnNlUmVhZHk7CisgICAgICBleHBlY3QoYnVmZmVyVGV4dCwgcmVzcG9uc2VUZXh0KTsKKyAgICB9KTsKKyAgfSwgdGltZW91dDogbmV3IFRpbWVvdXQobmV3IER1cmF0aW9uKHNlY29uZHM6IDEpKSk7CisKKyAgZ3JvdXAoJ1RTZXJ2ZXJUcmFuc3BvcnQnLCAoKSB7CisgICAgdGVzdCgnVGVzdCBzZXJ2ZXIgdHJhbnNwb3J0IGxpc3RlbnMgdG8gc29ja2V0JywgKCkgYXN5bmMgeworICAgICAgdmFyIHNvY2tldCA9IG5ldyBGYWtlU29ja2V0KCk7CisgICAgICBhd2FpdCBzb2NrZXQub3BlbigpOworICAgICAgZXhwZWN0KHNvY2tldC5pc09wZW4sIGlzVHJ1ZSk7CisKKyAgICAgIHZhciB0cmFuc3BvcnQgPSBuZXcgVFNlcnZlclNvY2tldFRyYW5zcG9ydChzb2NrZXQpOworICAgICAgZXhwZWN0KHRyYW5zcG9ydC5oYXNSZWFkRGF0YSwgaXNGYWxzZSk7CisKKyAgICAgIHNvY2tldC5yZWNlaXZlRmFrZU1lc3NhZ2UocmVxdWVzdEJhc2U2NCk7CisKKyAgICAgIC8vIGFsbG93IG1pY3JvdGFzayBldmVudHMgdG8gZmluaXNoCisgICAgICBhd2FpdCBuZXcgRnV0dXJlLnZhbHVlKCk7CisKKyAgICAgIGV4cGVjdCh0cmFuc3BvcnQuaGFzUmVhZERhdGEsIGlzVHJ1ZSk7CisKKyAgICAgIHZhciBidWZmZXIgPSBuZXcgVWludDhMaXN0KHJlcXVlc3RCeXRlcy5sZW5ndGgpOworICAgICAgdHJhbnNwb3J0LnJlYWRBbGwoYnVmZmVyLCAwLCByZXF1ZXN0Qnl0ZXMubGVuZ3RoKTsKKworICAgICAgdmFyIGJ1ZmZlclRleHQgPSB1dGY4Q29kZWMuZGVjb2RlKGJ1ZmZlcik7CisgICAgICBleHBlY3QoYnVmZmVyVGV4dCwgcmVxdWVzdFRleHQpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCBzZXJ2ZXIgc2VuZGluZyBkYXRhIG92ZXIgdHJhbnNwb3J0JywgKCkgYXN5bmMgeworICAgICAgdmFyIHNvY2tldCA9IG5ldyBGYWtlU29ja2V0KCk7CisgICAgICBhd2FpdCBzb2NrZXQub3BlbigpOworCisgICAgICB2YXIgdHJhbnNwb3J0ID0gbmV3IFRTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQoc29ja2V0KTsKKworICAgICAgdHJhbnNwb3J0LndyaXRlQWxsKHJlc3BvbnNlQnl0ZXMpOworICAgICAgZXhwZWN0KHNvY2tldC5zZW5kUGF5bG9hZCwgaXNOdWxsKTsKKworICAgICAgdHJhbnNwb3J0LmZsdXNoKCk7CisKKyAgICAgIC8vIGFsbG93IG1pY3JvdGFzayBldmVudHMgdG8gZmluaXNoCisgICAgICBhd2FpdCBuZXcgRnV0dXJlLnZhbHVlKCk7CisKKyAgICAgIGV4cGVjdChzb2NrZXQuc2VuZFBheWxvYWQsIGlzTm90TnVsbCk7CisgICAgICBleHBlY3Qoc29ja2V0LnNlbmRQYXlsb2FkLCByZXNwb25zZUJ5dGVzKTsKKyAgICB9KTsKKyAgfSwgdGltZW91dDogbmV3IFRpbWVvdXQobmV3IER1cmF0aW9uKHNlY29uZHM6IDEpKSk7Cit9CisKK2NsYXNzIEZha2VTb2NrZXQgZXh0ZW5kcyBUU29ja2V0IHsKKyAgZmluYWwgU3RyZWFtQ29udHJvbGxlcjxUU29ja2V0U3RhdGU+IF9vblN0YXRlQ29udHJvbGxlcjsKKyAgU3RyZWFtPFRTb2NrZXRTdGF0ZT4gZ2V0IG9uU3RhdGUgPT4gX29uU3RhdGVDb250cm9sbGVyLnN0cmVhbTsKKworICBmaW5hbCBTdHJlYW1Db250cm9sbGVyPE9iamVjdD4gX29uRXJyb3JDb250cm9sbGVyOworICBTdHJlYW08T2JqZWN0PiBnZXQgb25FcnJvciA9PiBfb25FcnJvckNvbnRyb2xsZXIuc3RyZWFtOworCisgIGZpbmFsIFN0cmVhbUNvbnRyb2xsZXI8VWludDhMaXN0PiBfb25NZXNzYWdlQ29udHJvbGxlcjsKKyAgU3RyZWFtPFVpbnQ4TGlzdD4gZ2V0IG9uTWVzc2FnZSA9PiBfb25NZXNzYWdlQ29udHJvbGxlci5zdHJlYW07CisKKyAgRmFrZVNvY2tldCh7Ym9vbCBzeW5jOiBmYWxzZX0pCisgICAgICA6IF9vblN0YXRlQ29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyLmJyb2FkY2FzdChzeW5jOiBzeW5jKSwKKyAgICAgICAgX29uRXJyb3JDb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXIuYnJvYWRjYXN0KHN5bmM6IHN5bmMpLAorICAgICAgICBfb25NZXNzYWdlQ29udHJvbGxlciA9IG5ldyBTdHJlYW1Db250cm9sbGVyLmJyb2FkY2FzdChzeW5jOiBzeW5jKTsKKworICBib29sIF9pc09wZW47CisKKyAgYm9vbCBnZXQgaXNPcGVuID0+IF9pc09wZW47CisKKyAgYm9vbCBnZXQgaXNDbG9zZWQgPT4gIWlzT3BlbjsKKworICBGdXR1cmUgb3BlbigpIGFzeW5jIHsKKyAgICBfaXNPcGVuID0gdHJ1ZTsKKyAgICBfb25TdGF0ZUNvbnRyb2xsZXIuYWRkKFRTb2NrZXRTdGF0ZS5PUEVOKTsKKyAgfQorCisgIEZ1dHVyZSBjbG9zZSgpIGFzeW5jIHsKKyAgICBfaXNPcGVuID0gZmFsc2U7CisgICAgX29uU3RhdGVDb250cm9sbGVyLmFkZChUU29ja2V0U3RhdGUuQ0xPU0VEKTsKKyAgfQorCisgIFVpbnQ4TGlzdCBfc2VuZFBheWxvYWQ7CisgIFVpbnQ4TGlzdCBnZXQgc2VuZFBheWxvYWQgPT4gX3NlbmRQYXlsb2FkOworCisgIHZvaWQgc2VuZChVaW50OExpc3QgZGF0YSkgeworICAgIGlmICghaXNPcGVuKSB0aHJvdyBuZXcgU3RhdGVFcnJvcignVGhlIHNvY2tldCBpcyBub3Qgb3BlbicpOworCisgICAgX3NlbmRQYXlsb2FkID0gZGF0YTsKKyAgfQorCisgIHZvaWQgcmVjZWl2ZUZha2VNZXNzYWdlKFN0cmluZyBiYXNlNjQpIHsKKyAgICBpZiAoIWlzT3BlbikgdGhyb3cgbmV3IFN0YXRlRXJyb3IoJ1RoZSBzb2NrZXQgaXMgbm90IG9wZW4nKTsKKworICAgIHZhciBtZXNzYWdlID0KKyAgICAgICAgbmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChCQVNFNjQuZGVjb2RlKGJhc2U2NCkpOworICAgIF9vbk1lc3NhZ2VDb250cm9sbGVyLmFkZChtZXNzYWdlKTsKKyAgfQorfQorCitjbGFzcyBGYWtlUHJvdG9jb2xGYWN0b3J5IGltcGxlbWVudHMgVFByb3RvY29sRmFjdG9yeSB7CisgIEZha2VQcm90b2NvbEZhY3RvcnkoKTsKKworICBUTWVzc2FnZSBtZXNzYWdlOworCisgIGdldFByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnNwb3J0KSA9PiBuZXcgRmFrZVByb3RvY29sKG1lc3NhZ2UpOworfQorCitjbGFzcyBGYWtlUHJvdG9jb2wgZXh0ZW5kcyBNb2NrIGltcGxlbWVudHMgVFByb3RvY29sIHsKKyAgRmFrZVByb3RvY29sKHRoaXMuX21lc3NhZ2UpOworCisgIFRNZXNzYWdlIF9tZXNzYWdlOworCisgIHJlYWRNZXNzYWdlQmVnaW4oKSA9PiBfbWVzc2FnZTsKK30KKworVWludDhMaXN0IF9nZXRGcmFtZWRSZXNwb25zZShVaW50OExpc3QgcmVzcG9uc2VCeXRlcykgeworICB2YXIgYnl0ZU9mZnNldCA9IFRGcmFtZWRUcmFuc3BvcnQuaGVhZGVyQnl0ZUNvdW50OworICB2YXIgcmVzcG9uc2UgPSBuZXcgVWludDhMaXN0KGJ5dGVPZmZzZXQgKyByZXNwb25zZUJ5dGVzLmxlbmd0aCk7CisKKyAgcmVzcG9uc2UuYnVmZmVyLmFzQnl0ZURhdGEoKS5zZXRJbnQzMigwLCByZXNwb25zZUJ5dGVzLmxlbmd0aCk7CisgIHJlc3BvbnNlLnNldEFsbChieXRlT2Zmc2V0LCByZXNwb25zZUJ5dGVzKTsKKworICByZXR1cm4gcmVzcG9uc2U7Cit9CmRpZmYgLS1naXQgYS9saWIvZGFydC90ZXN0L3RyYW5zcG9ydC90X3RyYW5zcG9ydF90ZXN0LmRhcnQgYi9saWIvZGFydC90ZXN0L3RyYW5zcG9ydC90X3RyYW5zcG9ydF90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJiMzgxYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L3Rlc3QvdHJhbnNwb3J0L3RfdHJhbnNwb3J0X3Rlc3QuZGFydApAQCAtMCwwICsxLDQxIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitsaWJyYXJ5IHRocmlmdC50ZXN0LnRyYW5zcG9ydC50X3NvY2tldF90cmFuc3BvcnRfdGVzdDsKKworaW1wb3J0ICdwYWNrYWdlOnRlc3QvdGVzdC5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTp0aHJpZnQvdGhyaWZ0LmRhcnQnOworCisvLy8gQ29tbW9uIHRyYW5zcG9ydCB0ZXN0cwordm9pZCBtYWluKCkgeworICBncm91cCgnVFRyYW5zcG9ydEZhY3RvcnknLCAoKSB7CisgICAgdGVzdCgndHJhbnNwb3J0IGlzIHJldHVybmVkIGZyb20gYmFzZSBmYWN0b3J5JywgKCkgYXN5bmMgeworICAgICAgVFRyYW5zcG9ydCByZXN1bHQ7CisgICAgICBUVHJhbnNwb3J0IHRyYW5zcG9ydCA9IG51bGw7CisKKyAgICAgIHZhciBmYWN0b3J5ID0gbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCk7CisKKyAgICAgIHJlc3VsdCA9IGF3YWl0IGZhY3RvcnkuZ2V0VHJhbnNwb3J0KHRyYW5zcG9ydCk7CisgICAgICBleHBlY3QocmVzdWx0LCBpc051bGwpOworCisgICAgICB0cmFuc3BvcnQgPSBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KCk7CisgICAgICByZXN1bHQgPSBhd2FpdCBmYWN0b3J5LmdldFRyYW5zcG9ydCh0cmFuc3BvcnQpOworCisgICAgICBleHBlY3QocmVzdWx0LCB0cmFuc3BvcnQpOworICAgIH0pOworICB9KTsKK30KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L3Rvb2wvZGV2LmRhcnQgYi9saWIvZGFydC90b29sL2Rldi5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ZjhiOGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC90b29sL2Rldi5kYXJ0CkBAIC0wLDAgKzEsMzMgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK2xpYnJhcnkgdG9vbC5kZXY7CisKK2ltcG9ydCAncGFja2FnZTpkYXJ0X2Rldi9kYXJ0X2Rldi5kYXJ0JyBzaG93IGRldiwgY29uZmlnOworCittYWluKExpc3Q8U3RyaW5nPiBhcmdzKSBhc3luYyB7CisgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9Xb3JraXZhL2RhcnRfZGV2CisKKyAgdmFyIGRpcmVjdG9yaWVzID0gWydsaWIvJywgJ3Rlc3QvJywgJ3Rvb2wvJ107CisgIGNvbmZpZy5hbmFseXplLmVudHJ5UG9pbnRzID0gZGlyZWN0b3JpZXM7CisgIGNvbmZpZy5mb3JtYXQuZGlyZWN0b3JpZXMgPSBkaXJlY3RvcmllczsKKyAgY29uZmlnLmNvcHlMaWNlbnNlCisgICAgLi5saWNlbnNlUGF0aCA9ICdMSUNFTlNFX0hFQURFUicKKyAgICAuLmRpcmVjdG9yaWVzID0gZGlyZWN0b3JpZXM7CisKKyAgYXdhaXQgZGV2KGFyZ3MpOworfQpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS9EZWxwaGlUaHJpZnQuZ3JvdXBwcm9qIGIvbGliL2RlbHBoaS9EZWxwaGlUaHJpZnQuZ3JvdXBwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNzJlNDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL0RlbHBoaVRocmlmdC5ncm91cHByb2oKQEAgLTAsMCArMSwxNTYgQEAKK++7vwk8UHJvamVjdCB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKwkJPFByb3BlcnR5R3JvdXA+CisJCQk8UHJvamVjdEd1aWQ+ezZCRDMyN0E1LTc2ODgtNDI2My1CNkE4LUIxNTIwN0NGNEVDNX08L1Byb2plY3RHdWlkPgorCQk8L1Byb3BlcnR5R3JvdXA+CisJCTxJdGVtR3JvdXA+CisJCQk8UHJvamVjdHMgSW5jbHVkZT0idGVzdFxjbGllbnQuZHByb2oiPgorCQkJCTxEZXBlbmRlbmNpZXMvPgorCQkJPC9Qcm9qZWN0cz4KKwkJCTxQcm9qZWN0cyBJbmNsdWRlPSJ0ZXN0XHNlcnZlci5kcHJvaiI+CisJCQkJPERlcGVuZGVuY2llcy8+CisJCQk8L1Byb2plY3RzPgorCQkJPFByb2plY3RzIEluY2x1ZGU9InRlc3RcbXVsdGlwbGV4ZWRcTXVsdGlwbGV4LlRlc3QuQ2xpZW50LmRwcm9qIj4KKwkJCQk8RGVwZW5kZW5jaWVzLz4KKwkJCTwvUHJvamVjdHM+CisJCQk8UHJvamVjdHMgSW5jbHVkZT0idGVzdFxtdWx0aXBsZXhlZFxNdWx0aXBsZXguVGVzdC5TZXJ2ZXIuZHByb2oiPgorCQkJCTxEZXBlbmRlbmNpZXMvPgorCQkJPC9Qcm9qZWN0cz4KKwkJCTxQcm9qZWN0cyBJbmNsdWRlPSJ0ZXN0XHNlcmlhbGl6ZXJcVGVzdFNlcmlhbGl6ZXIuZHByb2oiPgorCQkJCTxEZXBlbmRlbmNpZXMvPgorCQkJPC9Qcm9qZWN0cz4KKwkJCTxQcm9qZWN0cyBJbmNsdWRlPSJ0ZXN0XHNraXBcc2tpcHRlc3RfdmVyc2lvbjEuZHByb2oiPgorCQkJCTxEZXBlbmRlbmNpZXMvPgorCQkJPC9Qcm9qZWN0cz4KKwkJCTxQcm9qZWN0cyBJbmNsdWRlPSJ0ZXN0XHNraXBcc2tpcHRlc3RfdmVyc2lvbjIuZHByb2oiPgorCQkJCTxEZXBlbmRlbmNpZXMvPgorCQkJPC9Qcm9qZWN0cz4KKwkJCTxQcm9qZWN0cyBJbmNsdWRlPSJ0ZXN0XHR5cGVyZWdpc3RyeVxUZXN0VHlwZVJlZ2lzdHJ5LmRwcm9qIj4KKwkJCQk8RGVwZW5kZW5jaWVzLz4KKwkJCTwvUHJvamVjdHM+CisJCQk8UHJvamVjdHMgSW5jbHVkZT0iLi5cLi5cdHV0b3JpYWxcZGVscGhpXERlbHBoaVNlcnZlclxEZWxwaGlTZXJ2ZXIuZHByb2oiPgorCQkJCTxEZXBlbmRlbmNpZXMvPgorCQkJPC9Qcm9qZWN0cz4KKwkJCTxQcm9qZWN0cyBJbmNsdWRlPSIuLlwuLlx0dXRvcmlhbFxkZWxwaGlcRGVscGhpQ2xpZW50XERlbHBoaUNsaWVudC5kcHJvaiI+CisJCQkJPERlcGVuZGVuY2llcy8+CisJCQk8L1Byb2plY3RzPgorCQkJPFByb2plY3RzIEluY2x1ZGU9InRlc3Rca2V5d29yZHNcUmVzZXJ2ZWRLZXl3b3Jkcy5kcHJvaiI+CisJCQkJPERlcGVuZGVuY2llcy8+CisJCQk8L1Byb2plY3RzPgorCQk8L0l0ZW1Hcm91cD4KKwkJPFByb2plY3RFeHRlbnNpb25zPgorCQkJPEJvcmxhbmQuUGVyc29uYWxpdHk+RGVmYXVsdC5QZXJzb25hbGl0eS4xMjwvQm9ybGFuZC5QZXJzb25hbGl0eT4KKwkJCTxCb3JsYW5kLlByb2plY3RUeXBlLz4KKwkJCTxCb3JsYW5kUHJvamVjdD4KKwkJCQk8RGVmYXVsdC5QZXJzb25hbGl0eS8+CisJCQk8L0JvcmxhbmRQcm9qZWN0PgorCQk8L1Byb2plY3RFeHRlbnNpb25zPgorCQk8VGFyZ2V0IE5hbWU9ImNsaWVudCI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFxjbGllbnQuZHByb2oiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iY2xpZW50OkNsZWFuIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XGNsaWVudC5kcHJvaiIgVGFyZ2V0cz0iQ2xlYW4iLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iY2xpZW50Ok1ha2UiPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3RcY2xpZW50LmRwcm9qIiBUYXJnZXRzPSJNYWtlIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9InNlcnZlciI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFxzZXJ2ZXIuZHByb2oiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0ic2VydmVyOkNsZWFuIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XHNlcnZlci5kcHJvaiIgVGFyZ2V0cz0iQ2xlYW4iLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0ic2VydmVyOk1ha2UiPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3Rcc2VydmVyLmRwcm9qIiBUYXJnZXRzPSJNYWtlIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9Ik11bHRpcGxleF9UZXN0X0NsaWVudCI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFxtdWx0aXBsZXhlZFxNdWx0aXBsZXguVGVzdC5DbGllbnQuZHByb2oiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iTXVsdGlwbGV4X1Rlc3RfQ2xpZW50OkNsZWFuIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XG11bHRpcGxleGVkXE11bHRpcGxleC5UZXN0LkNsaWVudC5kcHJvaiIgVGFyZ2V0cz0iQ2xlYW4iLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iTXVsdGlwbGV4X1Rlc3RfQ2xpZW50Ok1ha2UiPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3RcbXVsdGlwbGV4ZWRcTXVsdGlwbGV4LlRlc3QuQ2xpZW50LmRwcm9qIiBUYXJnZXRzPSJNYWtlIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9Ik11bHRpcGxleF9UZXN0X1NlcnZlciI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFxtdWx0aXBsZXhlZFxNdWx0aXBsZXguVGVzdC5TZXJ2ZXIuZHByb2oiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iTXVsdGlwbGV4X1Rlc3RfU2VydmVyOkNsZWFuIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XG11bHRpcGxleGVkXE11bHRpcGxleC5UZXN0LlNlcnZlci5kcHJvaiIgVGFyZ2V0cz0iQ2xlYW4iLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iTXVsdGlwbGV4X1Rlc3RfU2VydmVyOk1ha2UiPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3RcbXVsdGlwbGV4ZWRcTXVsdGlwbGV4LlRlc3QuU2VydmVyLmRwcm9qIiBUYXJnZXRzPSJNYWtlIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9IlRlc3RTZXJpYWxpemVyIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XHNlcmlhbGl6ZXJcVGVzdFNlcmlhbGl6ZXIuZHByb2oiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iVGVzdFNlcmlhbGl6ZXI6Q2xlYW4iPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3Rcc2VyaWFsaXplclxUZXN0U2VyaWFsaXplci5kcHJvaiIgVGFyZ2V0cz0iQ2xlYW4iLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iVGVzdFNlcmlhbGl6ZXI6TWFrZSI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFxzZXJpYWxpemVyXFRlc3RTZXJpYWxpemVyLmRwcm9qIiBUYXJnZXRzPSJNYWtlIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9InNraXB0ZXN0X3ZlcnNpb24xIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XHNraXBcc2tpcHRlc3RfdmVyc2lvbjEuZHByb2oiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0ic2tpcHRlc3RfdmVyc2lvbjE6Q2xlYW4iPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3Rcc2tpcFxza2lwdGVzdF92ZXJzaW9uMS5kcHJvaiIgVGFyZ2V0cz0iQ2xlYW4iLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0ic2tpcHRlc3RfdmVyc2lvbjE6TWFrZSI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFxza2lwXHNraXB0ZXN0X3ZlcnNpb24xLmRwcm9qIiBUYXJnZXRzPSJNYWtlIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9InNraXB0ZXN0X3ZlcnNpb24yIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XHNraXBcc2tpcHRlc3RfdmVyc2lvbjIuZHByb2oiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0ic2tpcHRlc3RfdmVyc2lvbjI6Q2xlYW4iPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3Rcc2tpcFxza2lwdGVzdF92ZXJzaW9uMi5kcHJvaiIgVGFyZ2V0cz0iQ2xlYW4iLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0ic2tpcHRlc3RfdmVyc2lvbjI6TWFrZSI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFxza2lwXHNraXB0ZXN0X3ZlcnNpb24yLmRwcm9qIiBUYXJnZXRzPSJNYWtlIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9IlRlc3RUeXBlUmVnaXN0cnkiPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3RcdHlwZXJlZ2lzdHJ5XFRlc3RUeXBlUmVnaXN0cnkuZHByb2oiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iVGVzdFR5cGVSZWdpc3RyeTpDbGVhbiI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFx0eXBlcmVnaXN0cnlcVGVzdFR5cGVSZWdpc3RyeS5kcHJvaiIgVGFyZ2V0cz0iQ2xlYW4iLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iVGVzdFR5cGVSZWdpc3RyeTpNYWtlIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XHR5cGVyZWdpc3RyeVxUZXN0VHlwZVJlZ2lzdHJ5LmRwcm9qIiBUYXJnZXRzPSJNYWtlIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9IkRlbHBoaVNlcnZlciI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0iLi5cLi5cdHV0b3JpYWxcZGVscGhpXERlbHBoaVNlcnZlclxEZWxwaGlTZXJ2ZXIuZHByb2oiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iRGVscGhpU2VydmVyOkNsZWFuIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSIuLlwuLlx0dXRvcmlhbFxkZWxwaGlcRGVscGhpU2VydmVyXERlbHBoaVNlcnZlci5kcHJvaiIgVGFyZ2V0cz0iQ2xlYW4iLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iRGVscGhpU2VydmVyOk1ha2UiPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9Ii4uXC4uXHR1dG9yaWFsXGRlbHBoaVxEZWxwaGlTZXJ2ZXJcRGVscGhpU2VydmVyLmRwcm9qIiBUYXJnZXRzPSJNYWtlIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9IkRlbHBoaUNsaWVudCI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0iLi5cLi5cdHV0b3JpYWxcZGVscGhpXERlbHBoaUNsaWVudFxEZWxwaGlDbGllbnQuZHByb2oiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iRGVscGhpQ2xpZW50OkNsZWFuIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSIuLlwuLlx0dXRvcmlhbFxkZWxwaGlcRGVscGhpQ2xpZW50XERlbHBoaUNsaWVudC5kcHJvaiIgVGFyZ2V0cz0iQ2xlYW4iLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iRGVscGhpQ2xpZW50Ok1ha2UiPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9Ii4uXC4uXHR1dG9yaWFsXGRlbHBoaVxEZWxwaGlDbGllbnRcRGVscGhpQ2xpZW50LmRwcm9qIiBUYXJnZXRzPSJNYWtlIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9IlJlc2VydmVkS2V5d29yZHMiPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3Rca2V5d29yZHNcUmVzZXJ2ZWRLZXl3b3Jkcy5kcHJvaiIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJSZXNlcnZlZEtleXdvcmRzOkNsZWFuIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XGtleXdvcmRzXFJlc2VydmVkS2V5d29yZHMuZHByb2oiIFRhcmdldHM9IkNsZWFuIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9IlJlc2VydmVkS2V5d29yZHM6TWFrZSI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFxrZXl3b3Jkc1xSZXNlcnZlZEtleXdvcmRzLmRwcm9qIiBUYXJnZXRzPSJNYWtlIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9IkJ1aWxkIj4KKwkJCTxDYWxsVGFyZ2V0IFRhcmdldHM9ImNsaWVudDtzZXJ2ZXI7TXVsdGlwbGV4X1Rlc3RfQ2xpZW50O011bHRpcGxleF9UZXN0X1NlcnZlcjtUZXN0U2VyaWFsaXplcjtza2lwdGVzdF92ZXJzaW9uMTtza2lwdGVzdF92ZXJzaW9uMjtUZXN0VHlwZVJlZ2lzdHJ5O0RlbHBoaVNlcnZlcjtEZWxwaGlDbGllbnQ7UmVzZXJ2ZWRLZXl3b3JkcyIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJDbGVhbiI+CisJCQk8Q2FsbFRhcmdldCBUYXJnZXRzPSJjbGllbnQ6Q2xlYW47c2VydmVyOkNsZWFuO011bHRpcGxleF9UZXN0X0NsaWVudDpDbGVhbjtNdWx0aXBsZXhfVGVzdF9TZXJ2ZXI6Q2xlYW47VGVzdFNlcmlhbGl6ZXI6Q2xlYW47c2tpcHRlc3RfdmVyc2lvbjE6Q2xlYW47c2tpcHRlc3RfdmVyc2lvbjI6Q2xlYW47VGVzdFR5cGVSZWdpc3RyeTpDbGVhbjtEZWxwaGlTZXJ2ZXI6Q2xlYW47RGVscGhpQ2xpZW50OkNsZWFuO1Jlc2VydmVkS2V5d29yZHM6Q2xlYW4iLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iTWFrZSI+CisJCQk8Q2FsbFRhcmdldCBUYXJnZXRzPSJjbGllbnQ6TWFrZTtzZXJ2ZXI6TWFrZTtNdWx0aXBsZXhfVGVzdF9DbGllbnQ6TWFrZTtNdWx0aXBsZXhfVGVzdF9TZXJ2ZXI6TWFrZTtUZXN0U2VyaWFsaXplcjpNYWtlO3NraXB0ZXN0X3ZlcnNpb24xOk1ha2U7c2tpcHRlc3RfdmVyc2lvbjI6TWFrZTtUZXN0VHlwZVJlZ2lzdHJ5Ok1ha2U7RGVscGhpU2VydmVyOk1ha2U7RGVscGhpQ2xpZW50Ok1ha2U7UmVzZXJ2ZWRLZXl3b3JkczpNYWtlIi8+CisJCTwvVGFyZ2V0PgorCQk8SW1wb3J0IENvbmRpdGlvbj0iRXhpc3RzKCckKEJEUylcQmluXENvZGVHZWFyLkdyb3VwLlRhcmdldHMnKSIgUHJvamVjdD0iJChCRFMpXEJpblxDb2RlR2Vhci5Hcm91cC5UYXJnZXRzIi8+CisJPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LkNvbnNvbGUucGFzIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LkNvbnNvbGUucGFzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTJlZWI5Li4wMDAwMDAwCi0tLSBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Db25zb2xlLnBhcworKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0oKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICopCi0KLXVuaXQgVGhyaWZ0LkNvbnNvbGU7Ci0KLWludGVyZmFjZQotCi11c2VzCi0gIFN0ZEN0cmxzOwotCi10eXBlCi0gIFRUaHJpZnRDb25zb2xlID0gY2xhc3MKLSAgcHVibGljCi0gICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBTOiBzdHJpbmcpOyB2aXJ0dWFsOwotICAgIHByb2NlZHVyZSBXcml0ZUxpbmUoIGNvbnN0IFM6IHN0cmluZyk7IHZpcnR1YWw7Ci0gIGVuZDsKLQotICBUR1VJQ29uc29sZSA9IGNsYXNzKCBUVGhyaWZ0Q29uc29sZSApCi0gIHByaXZhdGUKLSAgICBGTGluZUJyZWFrIDogQm9vbGVhbjsKLSAgICBGTWVtbyA6IFRNZW1vOwotCi0gICAgcHJvY2VkdXJlIEludGVybmFsV3JpdGUoIGNvbnN0IFM6IHN0cmluZzsgYldyaXRlTGluZTogQm9vbGVhbik7Ci0gIHB1YmxpYwotICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgUzogc3RyaW5nKTsgb3ZlcnJpZGU7Ci0gICAgcHJvY2VkdXJlIFdyaXRlTGluZSggY29uc3QgUzogc3RyaW5nKTsgb3ZlcnJpZGU7Ci0gICAgY29uc3RydWN0b3IgQ3JlYXRlKCBBTWVtbzogVE1lbW8pOwotICBlbmQ7Ci0KLWZ1bmN0aW9uIENvbnNvbGU6IFRUaHJpZnRDb25zb2xlOwotcHJvY2VkdXJlIENoYW5nZUNvbnNvbGUoIEFDb25zb2xlOiBUVGhyaWZ0Q29uc29sZSApOwotcHJvY2VkdXJlIFJlc3RvcmVDb25zb2xlVG9EZWZhdWx0OwotCi1pbXBsZW1lbnRhdGlvbgotCi12YXIKLSAgRkRlZmF1bHRDb25zb2xlIDogVFRocmlmdENvbnNvbGU7Ci0gIEZDb25zb2xlIDogVFRocmlmdENvbnNvbGU7Ci0KLWZ1bmN0aW9uIENvbnNvbGU6IFRUaHJpZnRDb25zb2xlOwotYmVnaW4KLSAgUmVzdWx0IDo9IEZDb25zb2xlOwotZW5kOwotCi17IFRUaHJpZnRDb25zb2xlIH0KLQotcHJvY2VkdXJlIFRUaHJpZnRDb25zb2xlLldyaXRlKGNvbnN0IFM6IHN0cmluZyk7Ci1iZWdpbgotICBTeXN0ZW0uV3JpdGUoIFMgKTsKLWVuZDsKLQotcHJvY2VkdXJlIFRUaHJpZnRDb25zb2xlLldyaXRlTGluZShjb25zdCBTOiBzdHJpbmcpOwotYmVnaW4KLSAgU3lzdGVtLldyaXRlbG4oIFMgKTsKLWVuZDsKLQotcHJvY2VkdXJlIENoYW5nZUNvbnNvbGUoIEFDb25zb2xlOiBUVGhyaWZ0Q29uc29sZSApOwotYmVnaW4KLSAgRkNvbnNvbGUgOj0gQUNvbnNvbGU7Ci1lbmQ7Ci0KLXByb2NlZHVyZSBSZXN0b3JlQ29uc29sZVRvRGVmYXVsdDsKLWJlZ2luCi0gIEZDb25zb2xlIDo9IEZEZWZhdWx0Q29uc29sZTsKLWVuZDsKLQoteyBUR1VJQ29uc29sZSB9Ci0KLWNvbnN0cnVjdG9yIFRHVUlDb25zb2xlLkNyZWF0ZSggQU1lbW86IFRNZW1vKTsKLWJlZ2luCi0gIGluaGVyaXRlZCBDcmVhdGU7Ci0gIEZNZW1vIDo9IEFNZW1vOwotICBGTGluZUJyZWFrIDo9IFRydWU7Ci1lbmQ7Ci0KLXByb2NlZHVyZSBUR1VJQ29uc29sZS5JbnRlcm5hbFdyaXRlKGNvbnN0IFM6IHN0cmluZzsgYldyaXRlTGluZTogQm9vbGVhbik7Ci12YXIKLSAgaWR4IDogSW50ZWdlcjsKLWJlZ2luCi0gIGlmIEZMaW5lQnJlYWsgdGhlbgotICBiZWdpbgotICAgIEZNZW1vLkxpbmVzLkFkZCggUyApOwotICBlbmQgZWxzZQotICBiZWdpbgotICAgIGlkeCA6PSBGTWVtby5MaW5lcy5Db3VudCAtIDE7Ci0gICAgaWYgaWR4IDwgMCB0aGVuCi0gICAgYmVnaW4KLSAgICAgIEZNZW1vLkxpbmVzLkFkZCggUyApOwotICAgIGVuZDsKLSAgICBGTWVtby5MaW5lc1tpZHhdIDo9IEZNZW1vLkxpbmVzW2lkeF0gKyBTOwotICBlbmQ7Ci0gIEZMaW5lQnJlYWsgOj0gYldyaXRlTGluZTsKLWVuZDsKLQotcHJvY2VkdXJlIFRHVUlDb25zb2xlLldyaXRlKGNvbnN0IFM6IHN0cmluZyk7Ci1iZWdpbgotICBJbnRlcm5hbFdyaXRlKCBTLCBGYWxzZSk7Ci1lbmQ7Ci0KLXByb2NlZHVyZSBUR1VJQ29uc29sZS5Xcml0ZUxpbmUoY29uc3QgUzogc3RyaW5nKTsKLWJlZ2luCi0gIEludGVybmFsV3JpdGUoIFMsIFRydWUpOwotZW5kOwotCi1pbml0aWFsaXphdGlvbgotYmVnaW4KLSAgRkRlZmF1bHRDb25zb2xlIDo9IFRUaHJpZnRDb25zb2xlLkNyZWF0ZTsKLSAgRkNvbnNvbGUgOj0gRkRlZmF1bHRDb25zb2xlOwotZW5kOwotCi1maW5hbGl6YXRpb24KLWJlZ2luCi0gIEZEZWZhdWx0Q29uc29sZS5GcmVlOwotZW5kOwotCi1lbmQuCi0KZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5EZWZpbmVzLmluYyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5EZWZpbmVzLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTljY2FlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LkRlZmluZXMuaW5jCkBAIC0wLDAgKzEsNTAgQEAKKygqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKikKKworCisvLyBHb29kIGxpc3RzIG9mIERlbHBoaSB2ZXJzaW9uIG51bWJlcnMKKy8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wcm9qZWN0LWplZGkvamVkaS9ibG9iL21hc3Rlci9qZWRpLmluYworLy8gaHR0cDovL2RvY3dpa2kuZW1iYXJjYWRlcm8uY29tL1JBRFN0dWRpby9TZWF0dGxlL2VuL0NvbXBpbGVyX1ZlcnNpb25zCisKKworLy8gc3RhcnQgd2l0aCBtb3N0IGJhY2t3YXJkcyBjb21wYXRpYmxlIGRlZmF1bHRzCisKK3skREVGSU5FIE9MRF9VTklUX05BTUVTfQoreyRERUZJTkUgT0xEX1NPQ0tFVFN9ICAgICAgLy8gVE9ETzogYWRkIHNvY2tldCBzdXBwb3J0IGZvciBDb21waWxlclZlcnNpb24gPj0gMjguMAoreyRVTkRFRiBIQVZFX0NMQVNTX0NUT1J9CisKKworLy8gZW5hYmxlIGZlYXR1cmVzIGFzIHRoZXkgYXJlIGF2YWlsYWJsZQorCit7JElGIENvbXBpbGVyVmVyc2lvbiA+PSAyMS4wfSAgIC8vIERlbHBoaSAyMDEwCisgIHskREVGSU5FIEhBVkVfQ0xBU1NfQ1RPUn0KK3skSUZFTkR9CisKK3skSUYgQ29tcGlsZXJWZXJzaW9uID49IDIzLjB9ICAgLy8gRGVscGhpIFhFMgorICB7JFVOREVGIE9MRF9VTklUX05BTUVTfQoreyRJRkVORH0KKworeyRJRiBDb21waWxlclZlcnNpb24gPj0gMjguMH0gICAvLyBEZWxwaGkgWEU3CisgIHskVU5ERUYgT0xEX1NPQ0tFVFN9Cit7JElGRU5EfQorCisKKy8vIEVPRgorCisKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5FeGNlcHRpb24ucGFzIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LkV4Y2VwdGlvbi5wYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQxNWMzNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5FeGNlcHRpb24ucGFzCkBAIC0wLDAgKzEsNjIgQEAKKygqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKikKKworeyRTQ09QRURFTlVNUyBPTn0KKwordW5pdCBUaHJpZnQuRXhjZXB0aW9uOworCitpbnRlcmZhY2UKKwordXNlcworICBDbGFzc2VzLCBTeXNVdGlsczsKKwordHlwZQorICAvLyBiYXNlIGNsYXNzIGZvciBhbGwgVGhyaWZ0IGV4Y2VwdGlvbnMKKyAgVEV4Y2VwdGlvbiA9IGNsYXNzKCBTeXNVdGlscy5FeGNlcHRpb24pCisgIHB1YmxpYworICAgIGZ1bmN0aW9uIE1lc3NhZ2UgOiBzdHJpbmc7ICAgICAgICAvLyBoaWRlIGluaGVyaXRlZCBwcm9wZXJ0eTogYWxsb3cgcmVhZCwgYnV0IHByZXZlbnQgYWNjaWRlbnRhbCB3cml0ZXMKKyAgICBwcm9jZWR1cmUgVXBkYXRlTWVzc2FnZVByb3BlcnR5OyAgLy8gdXBkYXRlIGluaGVyaXRlZCBtZXNzYWdlIHByb3BlcnR5IHdpdGggdG9TdHJpbmcoKQorICBlbmQ7CisKKworCisKK2ltcGxlbWVudGF0aW9uCisKK3sgVEV4Y2VwdGlvbiB9CisKK2Z1bmN0aW9uIFRFeGNlcHRpb24uTWVzc2FnZTsKKy8vIGFsbG93IHJlYWQgKGV4Y2VwdGlvbiBzdW1tYXJ5KSwgYnV0IHByZXZlbnQgYWNjaWRlbnRhbCB3cml0ZXMKKy8vIHJlYWQgd2lsbCByZXR1cm4gdGhlIGV4Y2VwdGlvbiBzdW1tYXJ5CitiZWdpbgorICByZXN1bHQgOj0gU2VsZi5Ub1N0cmluZzsKK2VuZDsKKworcHJvY2VkdXJlIFRFeGNlcHRpb24uVXBkYXRlTWVzc2FnZVByb3BlcnR5OworLy8gVXBkYXRlIHRoZSBpbmhlcml0ZWQgTWVzc2FnZSBwcm9wZXJ0eSB0byBiZXR0ZXIgY29uZm9ybSB0byBzdGFuZGFyZCBiZWhhdmlvdXIuCisvLyBOaWNlIGJlbmVmaXQ6IFRoZSBJREUgaXMgbm93IGFibGUgdG8gc2hvdyB0aGUgZXhjZXB0aW9uIG1lc3NhZ2UgYWdhaW4uCitiZWdpbgorICBpbmhlcml0ZWQgTWVzc2FnZSA6PSBTZWxmLlRvU3RyaW5nOyAgLy8gcHJvZHVjZXMgYSBzdW1tYXJ5IHRleHQKK2VuZDsKKworCisKKworZW5kLgorCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3NyYy9UaHJpZnQuUHJvY2Vzc29yLk11bHRpcGxleC5wYXMgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuUHJvY2Vzc29yLk11bHRpcGxleC5wYXMKaW5kZXggZjZkOTQ0Ni4uOGNmMjNkYiAxMDA2NDQKLS0tIGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlByb2Nlc3Nvci5NdWx0aXBsZXgucGFzCisrKyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Qcm9jZXNzb3IuTXVsdGlwbGV4LnBhcwpAQCAtNTMsMTEgKzUzLDExIEBACiAKIHR5cGUKICAgSU11bHRpcGxleGVkUHJvY2Vzc29yID0gaW50ZXJmYWNlKCBJUHJvY2Vzc29yKQotICAgIFsnezgxMEZGMzJELTIyQTItNEQ1OC1CMTI5LUIwNTkwNzAzRUNFQ30nXQorICAgIFsnezgwN0Y5RDE5LTZDRjQtNDc4OS04NDBFLTkzRTg3QTEyRUI2M30nXQogICAgIC8vIFJlZ2lzdGVyIGEgc2VydmljZSB3aXRoIHRoaXMgVE11bHRpcGxleGVkUHJvY2Vzc29yLiAgVGhpcyBhbGxvd3MgdXMKICAgICAvLyB0byBicm9rZXIgcmVxdWVzdHMgdG8gaW5kaXZpZHVhbCBzZXJ2aWNlcyBieSB1c2luZyB0aGUgc2VydmljZSBuYW1lCiAgICAgLy8gdG8gc2VsZWN0IHRoZW0gYXQgcmVxdWVzdCB0aW1lLgotICAgIHByb2NlZHVyZSBSZWdpc3RlclByb2Nlc3NvciggY29uc3Qgc2VydmljZU5hbWUgOiBTdHJpbmc7IGNvbnN0IHByb2Nlc3NvciA6IElQcm9jZXNzb3IpOworICAgIHByb2NlZHVyZSBSZWdpc3RlclByb2Nlc3NvciggY29uc3Qgc2VydmljZU5hbWUgOiBTdHJpbmc7IGNvbnN0IHByb2Nlc3NvciA6IElQcm9jZXNzb3I7IGNvbnN0IGFzRGVmYXVsdCA6IEJvb2xlYW4gPSBGQUxTRSk7CiAgIGVuZDsKIAogCkBAIC02OCwxNyArNjgsMTggQEAKICAgICAvLyB0aGUgc3RhbmRhcmQgZm9ybWF0LCB3aXRob3V0IHRoZSBzZXJ2aWNlIG5hbWUgcHJlcGVuZGVkIHRvIFRNZXNzYWdlLm5hbWUuCiAgICAgVFN0b3JlZE1lc3NhZ2VQcm90b2NvbCA9IGNsYXNzKCBUUHJvdG9jb2xEZWNvcmF0b3IpCiAgICAgcHJpdmF0ZQotICAgICAgRk1lc3NhZ2VCZWdpbiA6IElNZXNzYWdlOworICAgICAgRk1lc3NhZ2VCZWdpbiA6IFRUaHJpZnRNZXNzYWdlOwogICAgIHB1YmxpYwotICAgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBwcm90b2NvbCA6IElQcm90b2NvbDsgY29uc3QgYU1zZ0JlZ2luIDogSU1lc3NhZ2UpOwotICAgICAgZnVuY3Rpb24gUmVhZE1lc3NhZ2VCZWdpbjogSU1lc3NhZ2U7IG92ZXJyaWRlOworICAgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBwcm90b2NvbCA6IElQcm90b2NvbDsgY29uc3QgYU1zZ0JlZ2luIDogVFRocmlmdE1lc3NhZ2UpOworICAgICAgZnVuY3Rpb24gUmVhZE1lc3NhZ2VCZWdpbjogVFRocmlmdE1lc3NhZ2U7IG92ZXJyaWRlOwogICAgIGVuZDsKIAogICBwcml2YXRlCiAgICAgRlNlcnZpY2VQcm9jZXNzb3JNYXAgOiBURGljdGlvbmFyeTxTdHJpbmcsIElQcm9jZXNzb3I+OworICAgIEZEZWZhdWx0UHJvY2Vzc29yIDogSVByb2Nlc3NvcjsKIAotICAgIHByb2NlZHVyZSBFcnJvciggY29uc3Qgb3Byb3QgOiBJUHJvdG9jb2w7IGNvbnN0IG1zZyA6IElNZXNzYWdlOwotICAgICAgICAgICAgICAgICAgICAgZXh0eXBlIDogVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlRFeGNlcHRpb25UeXBlOyBjb25zdCBldHh0IDogc3RyaW5nKTsKKyAgICBwcm9jZWR1cmUgRXJyb3IoIGNvbnN0IG9wcm90IDogSVByb3RvY29sOyBjb25zdCBtc2cgOiBUVGhyaWZ0TWVzc2FnZTsKKyAgICAgICAgICAgICAgICAgICAgIGV4dHlwZSA6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkQ2xhc3M7IGNvbnN0IGV0eHQgOiBzdHJpbmcpOwogCiAgIHB1YmxpYwogICAgIGNvbnN0cnVjdG9yIENyZWF0ZTsKQEAgLTg3LDcgKzg4LDcgQEAKICAgICAvLyBSZWdpc3RlciBhIHNlcnZpY2Ugd2l0aCB0aGlzIFRNdWx0aXBsZXhlZFByb2Nlc3NvckltcGwuICBUaGlzIGFsbG93cyB1cwogICAgIC8vIHRvIGJyb2tlciByZXF1ZXN0cyB0byBpbmRpdmlkdWFsIHNlcnZpY2VzIGJ5IHVzaW5nIHRoZSBzZXJ2aWNlIG5hbWUKICAgICAvLyB0byBzZWxlY3QgdGhlbSBhdCByZXF1ZXN0IHRpbWUuCi0gICAgcHJvY2VkdXJlIFJlZ2lzdGVyUHJvY2Vzc29yKCBjb25zdCBzZXJ2aWNlTmFtZSA6IFN0cmluZzsgY29uc3QgcHJvY2Vzc29yIDogSVByb2Nlc3Nvcik7CisgICAgcHJvY2VkdXJlIFJlZ2lzdGVyUHJvY2Vzc29yKCBjb25zdCBzZXJ2aWNlTmFtZSA6IFN0cmluZzsgY29uc3QgcHJvY2Vzc29yIDogSVByb2Nlc3NvcjsgY29uc3QgYXNEZWZhdWx0IDogQm9vbGVhbiA9IEZBTFNFKTsKIAogICAgIHsgVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBwcm9jZXNzIHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgc3RlcHM6CiAgICAgICAtIFJlYWQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbWVzc2FnZS4KQEAgLTEwNSwxNCArMTA2LDE0IEBACiAKIGltcGxlbWVudGF0aW9uCiAKLWNvbnN0cnVjdG9yIFRNdWx0aXBsZXhlZFByb2Nlc3NvckltcGwuVFN0b3JlZE1lc3NhZ2VQcm90b2NvbC5DcmVhdGUoIGNvbnN0IHByb3RvY29sIDogSVByb3RvY29sOyBjb25zdCBhTXNnQmVnaW4gOiBJTWVzc2FnZSk7Citjb25zdHJ1Y3RvciBUTXVsdGlwbGV4ZWRQcm9jZXNzb3JJbXBsLlRTdG9yZWRNZXNzYWdlUHJvdG9jb2wuQ3JlYXRlKCBjb25zdCBwcm90b2NvbCA6IElQcm90b2NvbDsgY29uc3QgYU1zZ0JlZ2luIDogVFRocmlmdE1lc3NhZ2UpOwogYmVnaW4KICAgaW5oZXJpdGVkIENyZWF0ZSggcHJvdG9jb2wpOwogICBGTWVzc2FnZUJlZ2luIDo9IGFNc2dCZWdpbjsKIGVuZDsKIAogCi1mdW5jdGlvbiBUTXVsdGlwbGV4ZWRQcm9jZXNzb3JJbXBsLlRTdG9yZWRNZXNzYWdlUHJvdG9jb2wuUmVhZE1lc3NhZ2VCZWdpbjogSU1lc3NhZ2U7CitmdW5jdGlvbiBUTXVsdGlwbGV4ZWRQcm9jZXNzb3JJbXBsLlRTdG9yZWRNZXNzYWdlUHJvdG9jb2wuUmVhZE1lc3NhZ2VCZWdpbjogVFRocmlmdE1lc3NhZ2U7CiBiZWdpbgogICByZXN1bHQgOj0gRk1lc3NhZ2VCZWdpbjsKIGVuZDsKQEAgLTEzNSwyMSArMTM2LDI3IEBACiBlbmQ7CiAKIAotcHJvY2VkdXJlIFRNdWx0aXBsZXhlZFByb2Nlc3NvckltcGwuUmVnaXN0ZXJQcm9jZXNzb3IoIGNvbnN0IHNlcnZpY2VOYW1lIDogU3RyaW5nOyBjb25zdCBwcm9jZXNzb3IgOiBJUHJvY2Vzc29yKTsKK3Byb2NlZHVyZSBUTXVsdGlwbGV4ZWRQcm9jZXNzb3JJbXBsLlJlZ2lzdGVyUHJvY2Vzc29yKCBjb25zdCBzZXJ2aWNlTmFtZSA6IFN0cmluZzsgY29uc3QgcHJvY2Vzc29yIDogSVByb2Nlc3NvcjsgY29uc3QgYXNEZWZhdWx0IDogQm9vbGVhbik7CiBiZWdpbgogICBGU2VydmljZVByb2Nlc3Nvck1hcC5BZGQoIHNlcnZpY2VOYW1lLCBwcm9jZXNzb3IpOworCisgIGlmIGFzRGVmYXVsdCB0aGVuIGJlZ2luCisgICAgaWYgRkRlZmF1bHRQcm9jZXNzb3IgPSBuaWwKKyAgICB0aGVuIEZEZWZhdWx0UHJvY2Vzc29yIDo9IHByb2Nlc3NvcgorICAgIGVsc2UgcmFpc2UgVEFwcGxpY2F0aW9uRXhjZXB0aW9uSW50ZXJuYWxFcnJvci5DcmVhdGUoJ09ubHkgb25lIGRlZmF1bHQgc2VydmljZSBhbGxvd2VkJyk7CisgIGVuZDsKIGVuZDsKIAogCi1wcm9jZWR1cmUgVE11bHRpcGxleGVkUHJvY2Vzc29ySW1wbC5FcnJvciggY29uc3Qgb3Byb3QgOiBJUHJvdG9jb2w7IGNvbnN0IG1zZyA6IElNZXNzYWdlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHlwZSA6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5URXhjZXB0aW9uVHlwZTsKK3Byb2NlZHVyZSBUTXVsdGlwbGV4ZWRQcm9jZXNzb3JJbXBsLkVycm9yKCBjb25zdCBvcHJvdCA6IElQcm90b2NvbDsgY29uc3QgbXNnIDogVFRocmlmdE1lc3NhZ2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0eXBlIDogVEFwcGxpY2F0aW9uRXhjZXB0aW9uU3BlY2lhbGl6ZWRDbGFzczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBldHh0IDogc3RyaW5nKTsKIHZhciBhcHBleCAgOiBUQXBwbGljYXRpb25FeGNlcHRpb247Ci0gICAgbmV3TXNnIDogSU1lc3NhZ2U7CisgICAgbmV3TXNnIDogVFRocmlmdE1lc3NhZ2U7CiBiZWdpbgotICBhcHBleCA6PSBUQXBwbGljYXRpb25FeGNlcHRpb24uQ3JlYXRlKCBleHR5cGUsIGV0eHQpOworICBhcHBleCA6PSBleHR5cGUuQ3JlYXRlKGV0eHQpOwogICB0cnkKLSAgICBuZXdNc2cgOj0gVE1lc3NhZ2VJbXBsLkNyZWF0ZSggbXNnLk5hbWUsIFRNZXNzYWdlVHlwZS5FeGNlcHRpb24sIG1zZy5TZXFJRCk7CisgICAgSW5pdCggbmV3TXNnLCBtc2cuTmFtZSwgVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbiwgbXNnLlNlcUlEKTsKIAogICAgIG9wcm90LldyaXRlTWVzc2FnZUJlZ2luKG5ld01zZyk7CiAgICAgYXBwZXguV3JpdGUob3Byb3QpOwpAQCAtMTYzLDcgKzE3MCw3IEBACiAKIAogZnVuY3Rpb24gVE11bHRpcGxleGVkUHJvY2Vzc29ySW1wbC5Qcm9jZXNzKGNvbnN0IGlwcm90LCBvcHJvdCA6IElQcm90b2NvbDsgY29uc3QgZXZlbnRzIDogSVByb2Nlc3NvckV2ZW50cyA9IG5pbCk6IEJvb2xlYW47Ci12YXIgbXNnLCBuZXdNc2cgOiBJTWVzc2FnZTsKK3ZhciBtc2csIG5ld01zZyA6IFRUaHJpZnRNZXNzYWdlOwogICAgIGlkeCAgICAgICAgIDogSW50ZWdlcjsKICAgICBzU2VydmljZSAgICA6IHN0cmluZzsKICAgICBwcm9jZXNzb3IgICA6IElQcm9jZXNzb3I7CkBAIC0xNzgsMzQgKzE4NSw0MyBAQAogICBtc2cgOj0gaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpOwogICBpZiBub3QgKG1zZy5UeXBlXyBpbiBbVE1lc3NhZ2VUeXBlLkNhbGwsIFRNZXNzYWdlVHlwZS5PbmV3YXldKSB0aGVuIGJlZ2luCiAgICAgRXJyb3IoIG9wcm90LCBtc2csCi0gICAgICAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5URXhjZXB0aW9uVHlwZS5JbnZhbGlkTWVzc2FnZVR5cGUsCisgICAgICAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbkludmFsaWRNZXNzYWdlVHlwZSwKICAgICAgICAgICAgRVJST1JfSU5WQUxJRF9NU0dUWVBFKTsKICAgICBFeGl0KCBGQUxTRSk7CiAgIGVuZDsKIAogICAvLyBFeHRyYWN0IHRoZSBzZXJ2aWNlIG5hbWUKKyAgLy8gdXNlIEZEZWZhdWx0UHJvY2Vzc29yIGFzIGZhbGxiYWNrIGlmIHRoZXJlIGlzIG5vIHNlcGFyYXRvcgogICBpZHggOj0gUG9zKCBUTXVsdGlwbGV4ZWRQcm90b2NvbC5TRVBBUkFUT1IsIG1zZy5OYW1lKTsKLSAgaWYgaWR4IDwgMSB0aGVuIGJlZ2luCisgIGlmIGlkeCA+IDAgdGhlbiBiZWdpbgorCisgICAgLy8gQ3JlYXRlIGEgbmV3IFRNZXNzYWdlLCBzb21ldGhpbmcgdGhhdCBjYW4gYmUgY29uc3VtZWQgYnkgYW55IFRQcm90b2NvbAorICAgIHNTZXJ2aWNlIDo9IENvcHkoIG1zZy5OYW1lLCAxLCBpZHgtMSk7CisgICAgaWYgbm90IEZTZXJ2aWNlUHJvY2Vzc29yTWFwLlRyeUdldFZhbHVlKCBzU2VydmljZSwgcHJvY2Vzc29yKQorICAgIHRoZW4gYmVnaW4KKyAgICAgIEVycm9yKCBvcHJvdCwgbXNnLAorICAgICAgICAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbkludGVybmFsRXJyb3IsCisgICAgICAgICAgICAgRm9ybWF0KEVSUk9SX1VOS05PV05fU0VSVklDRSxbc1NlcnZpY2VdKSk7CisgICAgICBFeGl0KCBGQUxTRSk7CisgICAgZW5kOworCisgICAgLy8gQ3JlYXRlIGEgbmV3IFRNZXNzYWdlLCByZW1vdmluZyB0aGUgc2VydmljZSBuYW1lCisgICAgSW5jKCBpZHgsIExlbmd0aChUTXVsdGlwbGV4ZWRQcm90b2NvbC5TRVBBUkFUT1IpKTsKKyAgICBJbml0KCBuZXdNc2csIENvcHkoIG1zZy5OYW1lLCBpZHgsIE1BWElOVCksIG1zZy5UeXBlXywgbXNnLlNlcUlEKTsKKworICBlbmQKKyAgZWxzZSBpZiBGRGVmYXVsdFByb2Nlc3NvciA8PiBuaWwgdGhlbiBiZWdpbgorICAgIHByb2Nlc3NvciA6PSBGRGVmYXVsdFByb2Nlc3NvcjsKKyAgICBuZXdNc2cgICAgOj0gbXNnOyAgLy8gbm8gbmVlZCB0byBjaGFuZ2UKKworICBlbmQKKyAgZWxzZSBiZWdpbgogICAgIEVycm9yKCBvcHJvdCwgbXNnLAotICAgICAgICAgICBUQXBwbGljYXRpb25FeGNlcHRpb24uVEV4Y2VwdGlvblR5cGUuSW52YWxpZFByb3RvY29sLAorICAgICAgICAgICBUQXBwbGljYXRpb25FeGNlcHRpb25JbnZhbGlkUHJvdG9jb2wsCiAgICAgICAgICAgIEZvcm1hdChFUlJPUl9JTkNPTVBBVElCTEVfUFJPVCxbbXNnLk5hbWVdKSk7CiAgICAgRXhpdCggRkFMU0UpOwogICBlbmQ7CiAKLSAgLy8gQ3JlYXRlIGEgbmV3IFRNZXNzYWdlLCBzb21ldGhpbmcgdGhhdCBjYW4gYmUgY29uc3VtZWQgYnkgYW55IFRQcm90b2NvbAotICBzU2VydmljZSA6PSBDb3B5KCBtc2cuTmFtZSwgMSwgaWR4LTEpOwotICBpZiBub3QgRlNlcnZpY2VQcm9jZXNzb3JNYXAuVHJ5R2V0VmFsdWUoIHNTZXJ2aWNlLCBwcm9jZXNzb3IpCi0gIHRoZW4gYmVnaW4KLSAgICBFcnJvciggb3Byb3QsIG1zZywKLSAgICAgICAgICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlRFeGNlcHRpb25UeXBlLkludGVybmFsRXJyb3IsCi0gICAgICAgICAgIEZvcm1hdChFUlJPUl9VTktOT1dOX1NFUlZJQ0UsW3NTZXJ2aWNlXSkpOwotICAgIEV4aXQoIEZBTFNFKTsKLSAgZW5kOwotCi0gIC8vIENyZWF0ZSBhIG5ldyBUTWVzc2FnZSwgcmVtb3ZpbmcgdGhlIHNlcnZpY2UgbmFtZQotICBJbmMoIGlkeCwgTGVuZ3RoKFRNdWx0aXBsZXhlZFByb3RvY29sLlNFUEFSQVRPUikpOwotICBuZXdNc2cgOj0gVE1lc3NhZ2VJbXBsLkNyZWF0ZSggQ29weSggbXNnLk5hbWUsIGlkeCwgTUFYSU5UKSwgbXNnLlR5cGVfLCBtc2cuU2VxSUQpOwotCiAgIC8vIERpc3BhdGNoIHByb2Nlc3NpbmcgdG8gdGhlIHN0b3JlZCBwcm9jZXNzb3IKICAgcHJvdG9jb2wgOj0gVFN0b3JlZE1lc3NhZ2VQcm90b2NvbC5DcmVhdGUoIGlwcm90LCBuZXdNc2cpOwogICByZXN1bHQgICA6PSBwcm9jZXNzb3IucHJvY2VzcyggcHJvdG9jb2wsIG9wcm90LCBldmVudHMpOwpAQCAtMjEzLDQgKzIyOSwzIEBACiAKIAogZW5kLgotCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3NyYy9UaHJpZnQuUHJvdG9jb2wuQ29tcGFjdC5wYXMgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuUHJvdG9jb2wuQ29tcGFjdC5wYXMKaW5kZXggNjFhZjQ0ZC4uMWMxYjNkYSAxMDA2NDQKLS0tIGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlByb3RvY29sLkNvbXBhY3QucGFzCisrKyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Qcm90b2NvbC5Db21wYWN0LnBhcwpAQCAtMTIzLDcgKzEyMyw3IEBACiAKICAgICAvLyBJZiB3ZSBlbmNvdW50ZXIgYSBib29sZWFuIGZpZWxkIGJlZ2luLCBzYXZlIHRoZSBURmllbGQgaGVyZSBzbyBpdCBjYW4KICAgICAvLyBoYXZlIHRoZSB2YWx1ZSBpbmNvcnBvcmF0ZWQuCi0gICAgcHJpdmF0ZSBib29sZWFuRmllbGRfIDogSUZpZWxkOworICAgIHByaXZhdGUgYm9vbGVhbkZpZWxkXyA6IFRUaHJpZnRGaWVsZDsKIAogICAgIC8vIElmIHdlIFJlYWQgYSBmaWVsZCBoZWFkZXIsIGFuZCBpdCdzIGEgYm9vbGVhbiBmaWVsZCwgc2F2ZSB0aGUgYm9vbGVhbgogICAgIC8vIHZhbHVlIGhlcmUgc28gdGhhdCBSZWFkQm9vbCBjYW4gdXNlIGl0LgpAQCAtMTQ4LDIxICsxNDgsMjEgQEAKICAgcHJpdmF0ZQogICAgIC8vIFRoZSB3b3JraG9yc2Ugb2YgV3JpdGVGaWVsZEJlZ2luLiBJdCBoYXMgdGhlIG9wdGlvbiBvZiBkb2luZyBhICd0eXBlIG92ZXJyaWRlJwogICAgIC8vIG9mIHRoZSB0eXBlIGhlYWRlci4gVGhpcyBpcyB1c2VkIHNwZWNpZmljYWxseSBpbiB0aGUgYm9vbGVhbiBmaWVsZCBjYXNlLgotICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkQmVnaW5JbnRlcm5hbCggY29uc3QgZmllbGQgOiBJRmllbGQ7IHR5cGVPdmVycmlkZSA6IEJ5dGUpOworICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkQmVnaW5JbnRlcm5hbCggY29uc3QgZmllbGQgOiBUVGhyaWZ0RmllbGQ7IHR5cGVPdmVycmlkZSA6IEJ5dGUpOwogCiAgIHB1YmxpYwotICAgIHByb2NlZHVyZSBXcml0ZU1lc3NhZ2VCZWdpbiggY29uc3QgbXNnOiBJTWVzc2FnZSk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZU1lc3NhZ2VCZWdpbiggY29uc3QgbXNnOiBUVGhyaWZ0TWVzc2FnZSk7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBXcml0ZU1lc3NhZ2VFbmQ7IG92ZXJyaWRlOwotICAgIHByb2NlZHVyZSBXcml0ZVN0cnVjdEJlZ2luKCBjb25zdCBzdHJ1YzogSVN0cnVjdCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZVN0cnVjdEJlZ2luKCBjb25zdCBzdHJ1YzogVFRocmlmdFN0cnVjdCk7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBXcml0ZVN0cnVjdEVuZDsgb3ZlcnJpZGU7Ci0gICAgcHJvY2VkdXJlIFdyaXRlRmllbGRCZWdpbiggY29uc3QgZmllbGQ6IElGaWVsZCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkQmVnaW4oIGNvbnN0IGZpZWxkOiBUVGhyaWZ0RmllbGQpOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZEVuZDsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRTdG9wOyBvdmVycmlkZTsKLSAgICBwcm9jZWR1cmUgV3JpdGVNYXBCZWdpbiggY29uc3QgbWFwOiBJTWFwKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTWFwQmVnaW4oIGNvbnN0IG1hcDogVFRocmlmdE1hcCk7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBXcml0ZU1hcEVuZDsgb3ZlcnJpZGU7Ci0gICAgcHJvY2VkdXJlIFdyaXRlTGlzdEJlZ2luKCBjb25zdCBsaXN0OiBJTGlzdCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUxpc3RCZWdpbiggY29uc3QgbGlzdDogVFRocmlmdExpc3QpOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgV3JpdGVMaXN0RW5kKCk7IG92ZXJyaWRlOwotICAgIHByb2NlZHVyZSBXcml0ZVNldEJlZ2luKCBjb25zdCBzZXRfOiBJU2V0ICk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZVNldEJlZ2luKCBjb25zdCBzZXRfOiBUVGhyaWZ0U2V0ICk7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBXcml0ZVNldEVuZCgpOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgV3JpdGVCb29sKCBiOiBCb29sZWFuKTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFdyaXRlQnl0ZSggYjogU2hvcnRJbnQpOyBvdmVycmlkZTsKQEAgLTE5NCwxNyArMTk0LDE3IEBACiAgICAgY2xhc3MgcHJvY2VkdXJlIGZpeGVkTG9uZ1RvQnl0ZXMoIGNvbnN0IG4gOiBJbnQ2NDsgdmFyIGJ1ZiA6IFRCeXRlcyk7CiAKICAgcHVibGljCi0gICAgZnVuY3Rpb24gIFJlYWRNZXNzYWdlQmVnaW46IElNZXNzYWdlOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiAgUmVhZE1lc3NhZ2VCZWdpbjogVFRocmlmdE1lc3NhZ2U7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBSZWFkTWVzc2FnZUVuZCgpOyBvdmVycmlkZTsKLSAgICBmdW5jdGlvbiAgUmVhZFN0cnVjdEJlZ2luOiBJU3RydWN0OyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiAgUmVhZFN0cnVjdEJlZ2luOiBUVGhyaWZ0U3RydWN0OyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgUmVhZFN0cnVjdEVuZDsgb3ZlcnJpZGU7Ci0gICAgZnVuY3Rpb24gIFJlYWRGaWVsZEJlZ2luOiBJRmllbGQ7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uICBSZWFkRmllbGRCZWdpbjogVFRocmlmdEZpZWxkOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgUmVhZEZpZWxkRW5kKCk7IG92ZXJyaWRlOwotICAgIGZ1bmN0aW9uICBSZWFkTWFwQmVnaW46IElNYXA7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uICBSZWFkTWFwQmVnaW46IFRUaHJpZnRNYXA7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBSZWFkTWFwRW5kKCk7IG92ZXJyaWRlOwotICAgIGZ1bmN0aW9uICBSZWFkTGlzdEJlZ2luOiBJTGlzdDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gIFJlYWRMaXN0QmVnaW46IFRUaHJpZnRMaXN0OyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgUmVhZExpc3RFbmQoKTsgb3ZlcnJpZGU7Ci0gICAgZnVuY3Rpb24gIFJlYWRTZXRCZWdpbjogSVNldDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gIFJlYWRTZXRCZWdpbjogVFRocmlmdFNldDsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFJlYWRTZXRFbmQoKTsgb3ZlcnJpZGU7CiAgICAgZnVuY3Rpb24gIFJlYWRCb29sOiBCb29sZWFuOyBvdmVycmlkZTsKICAgICBmdW5jdGlvbiAgUmVhZEJ5dGU6IFNob3J0SW50OyBvdmVycmlkZTsKQEAgLTI3Myw3ICsyNzMsNyBAQAogICBsYXN0RmllbGRJZF8gOj0gMDsKICAgbGFzdEZpZWxkXyA6PSBUU3RhY2s8SW50ZWdlcj4uQ3JlYXRlOwogCi0gIGJvb2xlYW5GaWVsZF8gOj0gbmlsOworICBJbml0KCBib29sZWFuRmllbGRfLCAnJywgVFR5cGUuU3RvcCwgMCk7CiAgIGJvb2xWYWx1ZV8gOj0gdW51c2VkOwogZW5kOwogCkBAIC0yOTMsNyArMjkzLDcgQEAKIGJlZ2luCiAgIGxhc3RGaWVsZF8uQ2xlYXIoKTsKICAgbGFzdEZpZWxkSWRfIDo9IDA7Ci0gIGJvb2xlYW5GaWVsZF8gOj0gbmlsOworICBJbml0KCBib29sZWFuRmllbGRfLCAnJywgVFR5cGUuU3RvcCwgMCk7CiAgIGJvb2xWYWx1ZV8gOj0gdW51c2VkOwogZW5kOwogCkBAIC0zMDEsMTEgKzMwMSw4IEBACiAvLyBXcml0ZXMgYSBieXRlIHdpdGhvdXQgYW55IHBvc3NpYmlsaXR5IG9mIGFsbCB0aGF0IGZpZWxkIGhlYWRlciBub25zZW5zZS4KIC8vIFVzZWQgaW50ZXJuYWxseSBieSBvdGhlciB3cml0aW5nIG1ldGhvZHMgdGhhdCBrbm93IHRoZXkgbmVlZCB0byBXcml0ZSBhIGJ5dGUuCiBwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVCeXRlRGlyZWN0KCBjb25zdCBiIDogQnl0ZSk7Ci12YXIgZGF0YSA6IFRCeXRlczsKIGJlZ2luCi0gIFNldExlbmd0aCggZGF0YSwgMSk7Ci0gIGRhdGFbMF0gOj0gYjsKLSAgVHJhbnNwb3J0LldyaXRlKCBkYXRhKTsKKyAgVHJhbnNwb3J0LldyaXRlKCBAYiwgU2l6ZU9mKGIpKTsKIGVuZDsKIAogCkBAIC0zNDQsNyArMzQxLDcgQEAKIAogLy8gV3JpdGUgYSBtZXNzYWdlIGhlYWRlciB0byB0aGUgd2lyZS4gQ29tcGFjdCBQcm90b2NvbCBtZXNzYWdlcyBjb250YWluIHRoZQogLy8gcHJvdG9jb2wgdmVyc2lvbiBzbyB3ZSBjYW4gbWlncmF0ZSBmb3J3YXJkcyBpbiB0aGUgZnV0dXJlIGlmIG5lZWQgYmUuCi1wcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVNZXNzYWdlQmVnaW4oIGNvbnN0IG1zZzogSU1lc3NhZ2UpOworcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBtc2c6IFRUaHJpZnRNZXNzYWdlKTsKIHZhciB2ZXJzaW9uQW5kVHlwZSA6IEJ5dGU7CiBiZWdpbgogICBSZXNldDsKQEAgLTM2Miw3ICszNTksNyBAQAogLy8gV3JpdGUgYSBzdHJ1Y3QgYmVnaW4uIFRoaXMgZG9lc24ndCBhY3R1YWxseSBwdXQgYW55dGhpbmcgb24gdGhlIHdpcmUuIFdlIHVzZSBpdCBhcyBhbgogLy8gb3Bwb3J0dW5pdHkgdG8gcHV0IHNwZWNpYWwgcGxhY2Vob2xkZXIgbWFya2VycyBvbiB0aGUgZmllbGQgc3RhY2sgc28gd2UgY2FuIGdldCB0aGUKIC8vIGZpZWxkIGlkIGRlbHRhcyBjb3JyZWN0LgotcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlU3RydWN0QmVnaW4oIGNvbnN0IHN0cnVjOiBJU3RydWN0KTsKK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZVN0cnVjdEJlZ2luKCBjb25zdCBzdHJ1YzogVFRocmlmdFN0cnVjdCk7CiBiZWdpbgogICBsYXN0RmllbGRfLlB1c2gobGFzdEZpZWxkSWRfKTsKICAgbGFzdEZpZWxkSWRfIDo9IDA7CkBAIC0zODAsNyArMzc3LDcgQEAKIC8vIFdyaXRlIGEgZmllbGQgaGVhZGVyIGNvbnRhaW5pbmcgdGhlIGZpZWxkIGlkIGFuZCBmaWVsZCB0eXBlLiBJZiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZQogLy8gY3VycmVudCBmaWVsZCBpZCBhbmQgdGhlIGxhc3Qgb25lIGlzIHNtYWxsICg8IDE1KSwgdGhlbiB0aGUgZmllbGQgaWQgd2lsbCBiZSBlbmNvZGVkIGluCiAvLyB0aGUgNCBNU0IgYXMgYSBkZWx0YS4gT3RoZXJ3aXNlLCB0aGUgZmllbGQgaWQgd2lsbCBmb2xsb3cgdGhlIHR5cGUgaGVhZGVyIGFzIGEgemlnemFnIHZhcmludC4KLXByb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZUZpZWxkQmVnaW4oIGNvbnN0IGZpZWxkOiBJRmllbGQpOworcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlRmllbGRCZWdpbiggY29uc3QgZmllbGQ6IFRUaHJpZnRGaWVsZCk7CiBiZWdpbgogICBjYXNlIGZpZWxkLlR5cGVfIG9mCiAgICAgVFR5cGUuQm9vbF8gOiBib29sZWFuRmllbGRfIDo9IGZpZWxkOyAvLyB3ZSB3YW50IHRvIHBvc3NpYmx5IGluY2x1ZGUgdGhlIHZhbHVlLCBzbyB3ZSdsbCB3YWl0LgpAQCAtMzkyLDcgKzM4OSw3IEBACiAKIC8vIFRoZSB3b3JraG9yc2Ugb2YgV3JpdGVGaWVsZEJlZ2luLiBJdCBoYXMgdGhlIG9wdGlvbiBvZiBkb2luZyBhICd0eXBlIG92ZXJyaWRlJwogLy8gb2YgdGhlIHR5cGUgaGVhZGVyLiBUaGlzIGlzIHVzZWQgc3BlY2lmaWNhbGx5IGluIHRoZSBib29sZWFuIGZpZWxkIGNhc2UuCi1wcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwoIGNvbnN0IGZpZWxkIDogSUZpZWxkOyB0eXBlT3ZlcnJpZGUgOiBCeXRlKTsKK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZUZpZWxkQmVnaW5JbnRlcm5hbCggY29uc3QgZmllbGQgOiBUVGhyaWZ0RmllbGQ7IHR5cGVPdmVycmlkZSA6IEJ5dGUpOwogdmFyIHR5cGVUb1dyaXRlIDogQnl0ZTsKIGJlZ2luCiAgIC8vIGlmIHRoZXJlJ3MgYSB0eXBlIG92ZXJyaWRlLCB1c2UgdGhhdC4KQEAgLTQyNSw3ICs0MjIsNyBAQAogCiAvLyBXcml0ZSBhIG1hcCBoZWFkZXIuIElmIHRoZSBtYXAgaXMgZW1wdHksIG9taXQgdGhlIGtleSBhbmQgdmFsdWUgdHlwZQogLy8gaGVhZGVycywgYXMgd2UgZG9uJ3QgbmVlZCBhbnkgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0byBza2lwIGl0LgotcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlTWFwQmVnaW4oIGNvbnN0IG1hcDogSU1hcCk7Citwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVNYXBCZWdpbiggY29uc3QgbWFwOiBUVGhyaWZ0TWFwKTsKIHZhciBrZXksIHZhbCA6IEJ5dGU7CiBiZWdpbgogICBpZiAobWFwLkNvdW50ID0gMCkKQEAgLTQ0MCwxNCArNDM3LDE0IEBACiAKIAogLy8gV3JpdGUgYSBsaXN0IGhlYWRlci4KLXByb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZUxpc3RCZWdpbiggY29uc3QgbGlzdDogSUxpc3QpOworcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlTGlzdEJlZ2luKCBjb25zdCBsaXN0OiBUVGhyaWZ0TGlzdCk7CiBiZWdpbgogICBXcml0ZUNvbGxlY3Rpb25CZWdpbiggbGlzdC5FbGVtZW50VHlwZSwgbGlzdC5Db3VudCk7CiBlbmQ7CiAKIAogLy8gV3JpdGUgYSBzZXQgaGVhZGVyLgotcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlU2V0QmVnaW4oIGNvbnN0IHNldF86IElTZXQgKTsKK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZVNldEJlZ2luKCBjb25zdCBzZXRfOiBUVGhyaWZ0U2V0ICk7CiBiZWdpbgogICBXcml0ZUNvbGxlY3Rpb25CZWdpbiggc2V0Xy5FbGVtZW50VHlwZSwgc2V0Xy5Db3VudCk7CiBlbmQ7CkBAIC00NjQsMTAgKzQ2MSwxMCBAQAogICB0aGVuIGJ0IDo9IFR5cGVzLkJPT0xFQU5fVFJVRQogICBlbHNlIGJ0IDo9IFR5cGVzLkJPT0xFQU5fRkFMU0U7CiAKLSAgaWYgYm9vbGVhbkZpZWxkXyA8PiBuaWwgdGhlbiBiZWdpbgorICBpZiBib29sZWFuRmllbGRfLlR5cGVfID0gVFR5cGUuQm9vbF8gdGhlbiBiZWdpbgogICAgIC8vIHdlIGhhdmVuJ3Qgd3JpdHRlbiB0aGUgZmllbGQgaGVhZGVyIHlldAogICAgIFdyaXRlRmllbGRCZWdpbkludGVybmFsKCBib29sZWFuRmllbGRfLCBCeXRlKGJ0KSk7Ci0gICAgYm9vbGVhbkZpZWxkXyA6PSBuaWw7CisgICAgYm9vbGVhbkZpZWxkXy5UeXBlXyA6PSBUVHlwZS5TdG9wOwogICBlbmQKICAgZWxzZSBiZWdpbgogICAgIC8vIHdlJ3JlIG5vdCBwYXJ0IG9mIGEgZmllbGQsIHNvIGp1c3QgV3JpdGUgdGhlIHZhbHVlLgpAQCAtNjQyLDcgKzYzOSw3IEBACiAKIAogLy8gUmVhZCBhIG1lc3NhZ2UgaGVhZGVyLgotZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuUmVhZE1lc3NhZ2VCZWdpbiA6IElNZXNzYWdlOworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuUmVhZE1lc3NhZ2VCZWdpbiA6IFRUaHJpZnRNZXNzYWdlOwogdmFyIHByb3RvY29sSWQsIHZlcnNpb25BbmRUeXBlLCB2ZXJzaW9uLCB0eXBlXyA6IEJ5dGU7CiAgICAgc2VxaWQgOiBJbnRlZ2VyOwogICAgIG1zZ05tIDogU3RyaW5nOwpAQCAtNjUxLDI5ICs2NDgsMjkgQEAKIAogICBwcm90b2NvbElkIDo9IEJ5dGUoIFJlYWRCeXRlKTsKICAgaWYgKHByb3RvY29sSWQgPD4gUFJPVE9DT0xfSUQpCi0gIHRoZW4gcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uLkNyZWF0ZSggJ0V4cGVjdGVkIHByb3RvY29sIGlkICcgKyBJbnRUb0hleChQUk9UT0NPTF9JRCwyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICcgYnV0IGdvdCAnICsgSW50VG9IZXgocHJvdG9jb2xJZCwyKSk7CisgIHRoZW4gcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uQmFkVmVyc2lvbi5DcmVhdGUoICdFeHBlY3RlZCBwcm90b2NvbCBpZCAnICsgSW50VG9IZXgoUFJPVE9DT0xfSUQsMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJyBidXQgZ290ICcgKyBJbnRUb0hleChwcm90b2NvbElkLDIpKTsKIAogICB2ZXJzaW9uQW5kVHlwZSA6PSBCeXRlKCBSZWFkQnl0ZSk7CiAgIHZlcnNpb24gICAgICAgIDo9IEJ5dGUoIHZlcnNpb25BbmRUeXBlIGFuZCBWRVJTSU9OX01BU0spOwogICBpZiAodmVyc2lvbiA8PiBWRVJTSU9OKQotICB0aGVuIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbi5DcmVhdGUoICdFeHBlY3RlZCB2ZXJzaW9uICcgK0ludFRvU3RyKFZFUlNJT04pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJyBidXQgZ290ICcgKyBJbnRUb1N0cih2ZXJzaW9uKSk7CisgIHRoZW4gcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uQmFkVmVyc2lvbi5DcmVhdGUoICdFeHBlY3RlZCB2ZXJzaW9uICcgK0ludFRvU3RyKFZFUlNJT04pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICcgYnV0IGdvdCAnICsgSW50VG9TdHIodmVyc2lvbikpOwogCiAgIHR5cGVfIDo9IEJ5dGUoICh2ZXJzaW9uQW5kVHlwZSBzaHIgVFlQRV9TSElGVF9BTU9VTlQpIGFuZCBUWVBFX0JJVFMpOwogICBzZXFpZCA6PSBJbnRlZ2VyKCBSZWFkVmFyaW50MzIpOwogICBtc2dObSA6PSBSZWFkU3RyaW5nOwotICByZXN1bHQgOj0gVE1lc3NhZ2VJbXBsLkNyZWF0ZSggbXNnTm0sIFRNZXNzYWdlVHlwZSh0eXBlXyksIHNlcWlkKTsKKyAgSW5pdCggcmVzdWx0LCBtc2dObSwgVE1lc3NhZ2VUeXBlKHR5cGVfKSwgc2VxaWQpOwogZW5kOwogCiAKIC8vIFJlYWQgYSBzdHJ1Y3QgYmVnaW4uIFRoZXJlJ3Mgbm90aGluZyBvbiB0aGUgd2lyZSBmb3IgdGhpcywgYnV0IGl0IGlzIG91cgogLy8gb3Bwb3J0dW5pdHkgdG8gcHVzaCBhIG5ldyBzdHJ1Y3QgYmVnaW4gbWFya2VyIG9udG8gdGhlIGZpZWxkIHN0YWNrLgotZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuUmVhZFN0cnVjdEJlZ2luOiBJU3RydWN0OworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuUmVhZFN0cnVjdEJlZ2luOiBUVGhyaWZ0U3RydWN0OwogYmVnaW4KICAgbGFzdEZpZWxkXy5QdXNoKCBsYXN0RmllbGRJZF8pOwogICBsYXN0RmllbGRJZF8gOj0gMDsKLSAgcmVzdWx0IDo9IFRTdHJ1Y3RJbXBsLkNyZWF0ZSgnJyk7CisgIEluaXQoIHJlc3VsdCk7CiBlbmQ7CiAKIApAQCAtNjg3LDcgKzY4NCw3IEBACiAKIAogLy8gUmVhZCBhIGZpZWxkIGhlYWRlciBvZmYgdGhlIHdpcmUuCi1mdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkRmllbGRCZWdpbjogSUZpZWxkOworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuUmVhZEZpZWxkQmVnaW46IFRUaHJpZnRGaWVsZDsKIHZhciB0eXBlXyA6IEJ5dGU7CiAgICAgZmllbGRJZCwgbW9kaWZpZXIgOiBTaG9ydEludDsKIGJlZ2luCkBAIC02OTUsNyArNjkyLDcgQEAKIAogICAvLyBpZiBpdCdzIGEgc3RvcCwgdGhlbiB3ZSBjYW4gcmV0dXJuIGltbWVkaWF0ZWx5LCBhcyB0aGUgc3RydWN0IGlzIG92ZXIuCiAgIGlmIHR5cGVfID0gQnl0ZShUeXBlcy5TVE9QKSB0aGVuIGJlZ2luCi0gICAgcmVzdWx0IDo9IFRGaWVsZEltcGwuQ3JlYXRlKCAnJywgVFR5cGUuU3RvcCwgMCk7CisgICAgSW5pdCggcmVzdWx0LCAnJywgVFR5cGUuU3RvcCwgMCk7CiAgICAgRXhpdDsKICAgZW5kOwogCkBAIC03MDUsNyArNzAyLDcgQEAKICAgdGhlbiBmaWVsZElkIDo9IFJlYWRJMTYgICAgLy8gbm90IGEgZGVsdGEuIGxvb2sgYWhlYWQgZm9yIHRoZSB6aWd6YWcgdmFyaW50IGZpZWxkIGlkLgogICBlbHNlIGZpZWxkSWQgOj0gU2hvcnRJbnQoIGxhc3RGaWVsZElkXyArIG1vZGlmaWVyKTsgLy8gYWRkIHRoZSBkZWx0YSB0byB0aGUgbGFzdCBSZWFkIGZpZWxkIGlkLgogCi0gIHJlc3VsdCA6PSBURmllbGRJbXBsLkNyZWF0ZSggJycsIGdldFRUeXBlKEJ5dGUodHlwZV8gYW5kICQwRikpLCBmaWVsZElkKTsKKyAgSW5pdCggcmVzdWx0LCAnJywgZ2V0VFR5cGUoQnl0ZSh0eXBlXyBhbmQgJDBGKSksIGZpZWxkSWQpOwogCiAgIC8vIGlmIHRoaXMgaGFwcGVucyB0byBiZSBhIGJvb2xlYW4gZmllbGQsIHRoZSB2YWx1ZSBpcyBlbmNvZGVkIGluIHRoZSB0eXBlCiAgICAvLyBzYXZlIHRoZSBib29sZWFuIHZhbHVlIGluIGEgc3BlY2lhbCBpbnN0YW5jZSB2YXJpYWJsZS4KQEAgLTcyMyw3ICs3MjAsNyBAQAogLy8gUmVhZCBhIG1hcCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgc2l6ZSBpcyB6ZXJvLCBza2lwIFJlYWRpbmcgdGhlIGtleQogLy8gYW5kIHZhbHVlIHR5cGUuIFRoaXMgbWVhbnMgdGhhdCAwLWxlbmd0aCBtYXBzIHdpbGwgeWllbGQgVE1hcHMgd2l0aG91dCB0aGUKIC8vICJjb3JyZWN0IiB0eXBlcy4KLWZ1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLlJlYWRNYXBCZWdpbjogSU1hcDsKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLlJlYWRNYXBCZWdpbjogVFRocmlmdE1hcDsKIHZhciBzaXplIDogSW50ZWdlcjsKICAgICBrZXlBbmRWYWx1ZVR5cGUgOiBCeXRlOwogICAgIGtleSwgdmFsIDogVFR5cGU7CkBAIC03MzUsNyArNzMyLDcgQEAKIAogICBrZXkgOj0gZ2V0VFR5cGUoIEJ5dGUoIGtleUFuZFZhbHVlVHlwZSBzaHIgNCkpOwogICB2YWwgOj0gZ2V0VFR5cGUoIEJ5dGUoIGtleUFuZFZhbHVlVHlwZSBhbmQgJEYpKTsKLSAgcmVzdWx0IDo9IFRNYXBJbXBsLkNyZWF0ZSgga2V5LCB2YWwsIHNpemUpOworICBJbml0KCByZXN1bHQsIGtleSwgdmFsLCBzaXplKTsKICAgQVNTRVJUKCAocmVzdWx0LktleVR5cGUgPSBrZXkpIGFuZCAocmVzdWx0LlZhbHVlVHlwZSA9IHZhbCkpOwogZW5kOwogCkBAIC03NDQsNyArNzQxLDcgQEAKIC8vIGJlIHBhY2tlZCBpbnRvIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyLiBJZiBpdCdzIGEgbG9uZ2VyIGxpc3QsIHRoZSA0IE1TQgogLy8gb2YgdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIgd2lsbCBiZSAkRiwgYW5kIGEgdmFyaW50IHdpbGwgZm9sbG93IHdpdGggdGhlCiAvLyB0cnVlIHNpemUuCi1mdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkTGlzdEJlZ2luOiBJTGlzdDsKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLlJlYWRMaXN0QmVnaW46IFRUaHJpZnRMaXN0OwogdmFyIHNpemVfYW5kX3R5cGUgOiBCeXRlOwogICAgIHNpemUgOiBJbnRlZ2VyOwogICAgIHR5cGVfIDogVFR5cGU7CkBAIC03NTYsNyArNzUzLDcgQEAKICAgdGhlbiBzaXplIDo9IEludGVnZXIoIFJlYWRWYXJpbnQzMik7CiAKICAgdHlwZV8gOj0gZ2V0VFR5cGUoIHNpemVfYW5kX3R5cGUpOwotICByZXN1bHQgOj0gVExpc3RJbXBsLkNyZWF0ZSggdHlwZV8sIHNpemUpOworICBJbml0KCByZXN1bHQsIHR5cGVfLCBzaXplKTsKIGVuZDsKIAogCkBAIC03NjQsNyArNzYxLDcgQEAKIC8vIGJlIHBhY2tlZCBpbnRvIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyLiBJZiBpdCdzIGEgbG9uZ2VyIHNldCwgdGhlIDQgTVNCCiAvLyBvZiB0aGUgZWxlbWVudCB0eXBlIGhlYWRlciB3aWxsIGJlICRGLCBhbmQgYSB2YXJpbnQgd2lsbCBmb2xsb3cgd2l0aCB0aGUKIC8vIHRydWUgc2l6ZS4KLWZ1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLlJlYWRTZXRCZWdpbjogSVNldDsKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLlJlYWRTZXRCZWdpbjogVFRocmlmdFNldDsKIHZhciBzaXplX2FuZF90eXBlIDogQnl0ZTsKICAgICBzaXplIDogSW50ZWdlcjsKICAgICB0eXBlXyA6IFRUeXBlOwpAQCAtNzc2LDcgKzc3Myw3IEBACiAgIHRoZW4gc2l6ZSA6PSBJbnRlZ2VyKCBSZWFkVmFyaW50MzIpOwogCiAgIHR5cGVfIDo9IGdldFRUeXBlKCBzaXplX2FuZF90eXBlKTsKLSAgcmVzdWx0IDo9IFRTZXRJbXBsLkNyZWF0ZSggdHlwZV8sIHNpemUpOworICBJbml0KCByZXN1bHQsIHR5cGVfLCBzaXplKTsKIGVuZDsKIAogCkBAIC03OTcsMTEgKzc5NCw4IEBACiAKIC8vIFJlYWQgYSBzaW5nbGUgYnl0ZSBvZmYgdGhlIHdpcmUuIE5vdGhpbmcgaW50ZXJlc3RpbmcgaGVyZS4KIGZ1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLlJlYWRCeXRlOiBTaG9ydEludDsKLXZhciBkYXRhIDogVEJ5dGVzOwogYmVnaW4KLSAgU2V0TGVuZ3RoKCBkYXRhLCAxKTsKLSAgVHJhbnNwb3J0LlJlYWRBbGwoIGRhdGEsIDAsIDEpOwotICByZXN1bHQgOj0gZGF0YVswXTsKKyAgVHJhbnNwb3J0LlJlYWRBbGwoIEByZXN1bHQsIFNpemVPZihyZXN1bHQpLCAwLCAxKTsKIGVuZDsKIAogCkBAIC05NjAsNyArOTU0LDcgQEAKICAgdGN0IDo9IFR5cGVzKCB0eXBlXyBhbmQgJDBGKTsKICAgaWYgdGN0IGluIFtMb3coVHlwZXMpLi5IaWdoKFR5cGVzKV0KICAgdGhlbiByZXN1bHQgOj0gdGNvbXBhY3RUeXBlVG9UeXBlW3RjdF0KLSAgZWxzZSByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24uQ3JlYXRlKCdkb24nJ3Qga25vdyB3aGF0IHR5cGU6ICcrSW50VG9TdHIoT3JkKHRjdCkpKTsKKyAgZWxzZSByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25JbnZhbGlkRGF0YS5DcmVhdGUoJ2RvbicndCBrbm93IHdoYXQgdHlwZTogJytJbnRUb1N0cihPcmQodGN0KSkpOwogZW5kOwogCiAKQEAgLTk2OSw3ICs5NjMsNyBAQAogYmVnaW4KICAgaWYgdHR5cGUgaW4gVkFMSURfVFRZUEVTCiAgIHRoZW4gcmVzdWx0IDo9IEJ5dGUoIHR0eXBlVG9Db21wYWN0VHlwZVt0dHlwZV0pCi0gIGVsc2UgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uLkNyZWF0ZSgnZG9uJyd0IGtub3cgd2hhdCB0eXBlOiAnK0ludFRvU3RyKE9yZCh0dHlwZSkpKTsKKyAgZWxzZSByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25JbnZhbGlkRGF0YS5DcmVhdGUoJ2RvbicndCBrbm93IHdoYXQgdHlwZTogJytJbnRUb1N0cihPcmQodHR5cGUpKSk7CiBlbmQ7CiAKIApAQCAtMTA5NCwxMSArMTA4OCwyOSBAQAogeyRFTkRJRn0KIAogCit7JElGREVGIERlYnVnfQorcHJvY2VkdXJlIFVuaXRUZXN0OwordmFyIHcgOiBXT1JEOworY29uc3QgRlBVX0NXX0RFTk9STUFMSVpFRCA9ICQwMDAyOworYmVnaW4KKyAgdyA6PSBHZXQ4MDg3Q1c7CisgIHRyeQorICAgIFNldDgwODdDVyggdyBvciBGUFVfQ1dfREVOT1JNQUxJWkVEKTsKKworICAgIFRlc3REb3VibGVUb0ludDY0Qml0czsKKyAgICBUZXN0WmlnWmFnOworICAgIFRlc3RMb25nQnl0ZXM7CisKKyAgZmluYWxseQorICAgIFNldDgwODdDVyggdyk7CisgIGVuZDsKK2VuZDsKK3skRU5ESUZ9CisKKwogaW5pdGlhbGl6YXRpb24KICAgeyRJRkRFRiBEZWJ1Z30KLSAgVGVzdERvdWJsZVRvSW50NjRCaXRzOwotICBUZXN0WmlnWmFnOwotICBUZXN0TG9uZ0J5dGVzOworICBVbml0VGVzdDsKICAgeyRFTkRJRn0KIAogZW5kLgpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlByb3RvY29sLkpTT04ucGFzIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlByb3RvY29sLkpTT04ucGFzCmluZGV4IGY0OTFmNTMuLjMwNjAwYWEgMTAwNjQ0Ci0tLSBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Qcm90b2NvbC5KU09OLnBhcworKysgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuUHJvdG9jb2wuSlNPTi5wYXMKQEAgLTI0LDYgKzI0LDcgQEAKIGludGVyZmFjZQogCiB1c2VzCisgIENoYXJhY3RlciwKICAgQ2xhc3NlcywKICAgU3lzVXRpbHMsCiAgIE1hdGgsCkBAIC0xMDIsNyArMTAzLDcgQEAKIAogICAgICAgcHJpdmF0ZQogICAgICAgICBGSGFzRGF0YSA6IEJvb2xlYW47Ci0gICAgICAgIEZEYXRhICAgIDogVEJ5dGVzOworICAgICAgICBGRGF0YSAgICA6IEJ5dGU7CiAKICAgICAgIHB1YmxpYwogICAgICAgICAvLyBSZXR1cm4gYW5kIGNvbnN1bWUgdGhlIG5leHQgYnl0ZSB0byBiZSBSZWFkLCBlaXRoZXIgdGFraW5nIGl0IGZyb20gdGhlCkBAIC0xNjgsMTggKzE2OSwxOCBAQAogCiAgIHB1YmxpYwogICAgIC8vIElQcm90b2NvbAotICAgIHByb2NlZHVyZSBXcml0ZU1lc3NhZ2VCZWdpbiggY29uc3QgYU1zZyA6IElNZXNzYWdlKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBhTXNnIDogVFRocmlmdE1lc3NhZ2UpOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgV3JpdGVNZXNzYWdlRW5kOyBvdmVycmlkZTsKLSAgICBwcm9jZWR1cmUgV3JpdGVTdHJ1Y3RCZWdpbiggY29uc3Qgc3RydWM6IElTdHJ1Y3QpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVTdHJ1Y3RCZWdpbiggY29uc3Qgc3RydWM6IFRUaHJpZnRTdHJ1Y3QpOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgV3JpdGVTdHJ1Y3RFbmQ7IG92ZXJyaWRlOwotICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkQmVnaW4oIGNvbnN0IGZpZWxkOiBJRmllbGQpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZEJlZ2luKCBjb25zdCBmaWVsZDogVFRocmlmdEZpZWxkKTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRFbmQ7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkU3RvcDsgb3ZlcnJpZGU7Ci0gICAgcHJvY2VkdXJlIFdyaXRlTWFwQmVnaW4oIGNvbnN0IG1hcDogSU1hcCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZU1hcEJlZ2luKCBjb25zdCBtYXA6IFRUaHJpZnRNYXApOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgV3JpdGVNYXBFbmQ7IG92ZXJyaWRlOwotICAgIHByb2NlZHVyZSBXcml0ZUxpc3RCZWdpbiggY29uc3QgbGlzdDogSUxpc3QpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVMaXN0QmVnaW4oIGNvbnN0IGxpc3Q6IFRUaHJpZnRMaXN0KTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFdyaXRlTGlzdEVuZCgpOyBvdmVycmlkZTsKLSAgICBwcm9jZWR1cmUgV3JpdGVTZXRCZWdpbiggY29uc3Qgc2V0XzogSVNldCApOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVTZXRCZWdpbiggY29uc3Qgc2V0XzogVFRocmlmdFNldCApOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgV3JpdGVTZXRFbmQoKTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFdyaXRlQm9vbCggYjogQm9vbGVhbik7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBXcml0ZUJ5dGUoIGI6IFNob3J0SW50KTsgb3ZlcnJpZGU7CkBAIC0xOTAsMTcgKzE5MSwxNyBAQAogICAgIHByb2NlZHVyZSBXcml0ZVN0cmluZyggY29uc3Qgczogc3RyaW5nICk7ICAgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFdyaXRlQmluYXJ5KCBjb25zdCBiOiBUQnl0ZXMpOyBvdmVycmlkZTsKICAgICAvLwotICAgIGZ1bmN0aW9uIFJlYWRNZXNzYWdlQmVnaW46IElNZXNzYWdlOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkTWVzc2FnZUJlZ2luOiBUVGhyaWZ0TWVzc2FnZTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFJlYWRNZXNzYWdlRW5kKCk7IG92ZXJyaWRlOwotICAgIGZ1bmN0aW9uIFJlYWRTdHJ1Y3RCZWdpbjogSVN0cnVjdDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZFN0cnVjdEJlZ2luOiBUVGhyaWZ0U3RydWN0OyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgUmVhZFN0cnVjdEVuZDsgb3ZlcnJpZGU7Ci0gICAgZnVuY3Rpb24gUmVhZEZpZWxkQmVnaW46IElGaWVsZDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZEZpZWxkQmVnaW46IFRUaHJpZnRGaWVsZDsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFJlYWRGaWVsZEVuZCgpOyBvdmVycmlkZTsKLSAgICBmdW5jdGlvbiBSZWFkTWFwQmVnaW46IElNYXA7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRNYXBCZWdpbjogVFRocmlmdE1hcDsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFJlYWRNYXBFbmQoKTsgb3ZlcnJpZGU7Ci0gICAgZnVuY3Rpb24gUmVhZExpc3RCZWdpbjogSUxpc3Q7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRMaXN0QmVnaW46IFRUaHJpZnRMaXN0OyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgUmVhZExpc3RFbmQoKTsgb3ZlcnJpZGU7Ci0gICAgZnVuY3Rpb24gUmVhZFNldEJlZ2luOiBJU2V0OyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkU2V0QmVnaW46IFRUaHJpZnRTZXQ7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBSZWFkU2V0RW5kKCk7IG92ZXJyaWRlOwogICAgIGZ1bmN0aW9uIFJlYWRCb29sOiBCb29sZWFuOyBvdmVycmlkZTsKICAgICBmdW5jdGlvbiBSZWFkQnl0ZTogU2hvcnRJbnQ7IG92ZXJyaWRlOwpAQCAtMzA5LDcgKzMxMCw3IEBACiAgICAgVFR5cGUuU2V0XzogICAgIHJlc3VsdCA6PSBOQU1FX1NFVDsKICAgICBUVHlwZS5MaXN0OiAgICAgcmVzdWx0IDo9IE5BTUVfTElTVDsKICAgZWxzZQotICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbi5DcmVhdGUoIFRQcm90b2NvbEV4Y2VwdGlvbi5OT1RfSU1QTEVNRU5URUQsICdVbnJlY29nbml6ZWQgdHlwZSAoJytJbnRUb1N0cihPcmQodHlwZUlEKSkrJyknKTsKKyAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25Ob3RJbXBsZW1lbnRlZC5DcmVhdGUoJ1VucmVjb2duaXplZCB0eXBlICgnK0ludFRvU3RyKE9yZCh0eXBlSUQpKSsnKScpOwogICBlbmQ7CiBlbmQ7CiAKQEAgLTMyNyw3ICszMjgsNyBAQAogICBlbHNlIGlmIG5hbWUgPSBOQU1FX01BUCAgICB0aGVuIHJlc3VsdCA6PSBUVHlwZS5NYXAKICAgZWxzZSBpZiBuYW1lID0gTkFNRV9MSVNUICAgdGhlbiByZXN1bHQgOj0gVFR5cGUuTGlzdAogICBlbHNlIGlmIG5hbWUgPSBOQU1FX1NFVCAgICB0aGVuIHJlc3VsdCA6PSBUVHlwZS5TZXRfCi0gIGVsc2UgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uLkNyZWF0ZSggVFByb3RvY29sRXhjZXB0aW9uLk5PVF9JTVBMRU1FTlRFRCwgJ1VucmVjb2duaXplZCB0eXBlICgnK25hbWUrJyknKTsKKyAgZWxzZSByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25Ob3RJbXBsZW1lbnRlZC5DcmVhdGUoJ1VucmVjb2duaXplZCB0eXBlICgnK25hbWUrJyknKTsKIGVuZDsKIAogCkBAIC00MzYsMjEgKzQzNywxOSBAQAogICBpZiBGSGFzRGF0YQogICB0aGVuIEZIYXNEYXRhIDo9IEZBTFNFCiAgIGVsc2UgYmVnaW4KLSAgICBTZXRMZW5ndGgoIEZEYXRhLCAxKTsKLSAgICBJSlNPTlByb3RvY29sKEZQcm90bykuVHJhbnNwb3J0LlJlYWRBbGwoIEZEYXRhLCAwLCAxKTsKKyAgICBJSlNPTlByb3RvY29sKEZQcm90bykuVHJhbnNwb3J0LlJlYWRBbGwoIEBGRGF0YSwgU2l6ZU9mKEZEYXRhKSwgMCwgMSk7CiAgIGVuZDsKLSAgcmVzdWx0IDo9IEZEYXRhWzBdOworICByZXN1bHQgOj0gRkRhdGE7CiBlbmQ7CiAKIAogZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuVExvb2thaGVhZFJlYWRlci5QZWVrIDogQnl0ZTsKIGJlZ2luCiAgIGlmIG5vdCBGSGFzRGF0YSB0aGVuIGJlZ2luCi0gICAgU2V0TGVuZ3RoKCBGRGF0YSwgMSk7Ci0gICAgSUpTT05Qcm90b2NvbChGUHJvdG8pLlRyYW5zcG9ydC5SZWFkQWxsKCBGRGF0YSwgMCwgMSk7CisgICAgSUpTT05Qcm90b2NvbChGUHJvdG8pLlRyYW5zcG9ydC5SZWFkQWxsKCBARkRhdGEsIFNpemVPZihGRGF0YSksIDAsIDEpOwogICAgIEZIYXNEYXRhIDo9IFRSVUU7CiAgIGVuZDsKLSAgcmVzdWx0IDo9IEZEYXRhWzBdOworICByZXN1bHQgOj0gRkRhdGE7CiBlbmQ7CiAKIApAQCAtNTA1LDcgKzUwNCw3IEBACiBiZWdpbgogICBjaCA6PSBGUmVhZGVyLlJlYWQ7CiAgIGlmIChjaCA8PiBiKQotICB0aGVuIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbi5DcmVhdGUoIFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsICdVbmV4cGVjdGVkIGNoYXJhY3RlciAoJytDaGFyKGNoKSsnKScpOworICB0aGVuIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbkludmFsaWREYXRhLkNyZWF0ZSgnVW5leHBlY3RlZCBjaGFyYWN0ZXIgKCcrQ2hhcihjaCkrJyknKTsKIGVuZDsKIAogCkBAIC01MTUsNyArNTE0LDcgQEAKICAgaSA6PSBTdHJUb0ludERlZiggJyQwJytDaGFyKGNoKSwgLTEpOwogICBpZiAoMCA8PSBpKSBhbmQgKGkgPCAkMTApCiAgIHRoZW4gcmVzdWx0IDo9IGkKLSAgZWxzZSByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24uQ3JlYXRlKCBUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAnRXhwZWN0ZWQgaGV4IGNoYXJhY3RlciAoJytDaGFyKGNoKSsnKScpOworICBlbHNlIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbkludmFsaWREYXRhLkNyZWF0ZSgnRXhwZWN0ZWQgaGV4IGNoYXJhY3RlciAoJytDaGFyKGNoKSsnKScpOwogZW5kOwogCiAKQEAgLTY4MCw3ICs2NzksNyBAQAogZW5kOwogCiAKLXByb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZU1lc3NhZ2VCZWdpbiggY29uc3QgYU1zZyA6IElNZXNzYWdlKTsKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZU1lc3NhZ2VCZWdpbiggY29uc3QgYU1zZyA6IFRUaHJpZnRNZXNzYWdlKTsKIGJlZ2luCiAgIFJlc2V0Q29udGV4dFN0YWNrOyAgLy8gVEhSSUZULTE0NzMKIApAQCAtNjk5LDcgKzY5OCw3IEBACiBlbmQ7CiAKIAotcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLldyaXRlU3RydWN0QmVnaW4oIGNvbnN0IHN0cnVjOiBJU3RydWN0KTsKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZVN0cnVjdEJlZ2luKCBjb25zdCBzdHJ1YzogVFRocmlmdFN0cnVjdCk7CiBiZWdpbgogICBXcml0ZUpTT05PYmplY3RTdGFydDsKIGVuZDsKQEAgLTcxMSw3ICs3MTAsNyBAQAogZW5kOwogCiAKLXByb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZUZpZWxkQmVnaW4oIGNvbnN0IGZpZWxkIDogSUZpZWxkKTsKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZUZpZWxkQmVnaW4oIGNvbnN0IGZpZWxkIDogVFRocmlmdEZpZWxkKTsKIGJlZ2luCiAgIFdyaXRlSlNPTkludGVnZXIoZmllbGQuSUQpOwogICBXcml0ZUpTT05PYmplY3RTdGFydDsKQEAgLTczMCw3ICs3MjksNyBAQAogICAvLyBub3RoaW5nIHRvIGRvCiBlbmQ7CiAKLXByb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZU1hcEJlZ2luKCBjb25zdCBtYXA6IElNYXApOworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLldyaXRlTWFwQmVnaW4oIGNvbnN0IG1hcDogVFRocmlmdE1hcCk7CiBiZWdpbgogICBXcml0ZUpTT05BcnJheVN0YXJ0OwogICBXcml0ZUpTT05TdHJpbmcoIEdldFR5cGVOYW1lRm9yVHlwZUlEKCBtYXAuS2V5VHlwZSkpOwpAQCAtNzQ3LDcgKzc0Niw3IEBACiBlbmQ7CiAKIAotcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLldyaXRlTGlzdEJlZ2luKCBjb25zdCBsaXN0OiBJTGlzdCk7Citwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuV3JpdGVMaXN0QmVnaW4oIGNvbnN0IGxpc3Q6IFRUaHJpZnRMaXN0KTsKIGJlZ2luCiAgIFdyaXRlSlNPTkFycmF5U3RhcnQ7CiAgIFdyaXRlSlNPTlN0cmluZyggR2V0VHlwZU5hbWVGb3JUeXBlSUQoIGxpc3QuRWxlbWVudFR5cGUpKTsKQEAgLTc2MSw3ICs3NjAsNyBAQAogZW5kOwogCiAKLXByb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZVNldEJlZ2luKCBjb25zdCBzZXRfOiBJU2V0KTsKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZVNldEJlZ2luKCBjb25zdCBzZXRfOiBUVGhyaWZ0U2V0KTsKIGJlZ2luCiAgIFdyaXRlSlNPTkFycmF5U3RhcnQ7CiAgIFdyaXRlSlNPTlN0cmluZyggR2V0VHlwZU5hbWVGb3JUeXBlSUQoIHNldF8uRWxlbWVudFR5cGUpKTsKQEAgLTgyMSw5ICs4MjAsMTIgQEAKIHZhciBidWZmZXIgOiBUTWVtb3J5U3RyZWFtOwogICAgIGNoICA6IEJ5dGU7CiAgICAgd2NoIDogV29yZDsKKyAgICBoaWdoU3Vyb2dhdGU6IENoYXI7CisgICAgc3Vycm9nYXRlUGFpcnM6IEFycmF5WzAuLjFdIG9mIENoYXI7CiAgICAgb2ZmIDogSW50ZWdlcjsKICAgICB0bXAgOiBUQnl0ZXM7CiBiZWdpbgorICBoaWdoU3Vyb2dhdGUgOj0gIzA7CiAgIGJ1ZmZlciA6PSBUTWVtb3J5U3RyZWFtLkNyZWF0ZTsKICAgdHJ5CiAgICAgaWYgbm90IHNraXBDb250ZXh0CkBAIC04NDksNyArODUxLDcgQEAKICAgICAgIHRoZW4gYmVnaW4KICAgICAgICAgb2ZmIDo9IFBvcyggQ2hhcihjaCksIEVTQ0FQRV9DSEFSUyk7CiAgICAgICAgIGlmIG9mZiA8IDEKLSAgICAgICAgdGhlbiByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24uQ3JlYXRlKCBUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAnRXhwZWN0ZWQgY29udHJvbCBjaGFyJyk7CisgICAgICAgIHRoZW4gcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uSW52YWxpZERhdGEuQ3JlYXRlKCdFeHBlY3RlZCBjb250cm9sIGNoYXInKTsKICAgICAgICAgY2ggOj0gQnl0ZSggRVNDQVBFX0NIQVJfVkFMU1tvZmZdKTsKICAgICAgICAgYnVmZmVyLldyaXRlKCBjaCwgMSk7CiAgICAgICAgIENvbnRpbnVlOwpAQCAtODYyLDExICs4NjQsMzEgQEAKICAgICAgICAgICAgKyAoSGV4VmFsKHRtcFsxXSkgc2hsIDgpCiAgICAgICAgICAgICsgKEhleFZhbCh0bXBbMl0pIHNobCA0KQogICAgICAgICAgICArICBIZXhWYWwodG1wWzNdKTsKKwogICAgICAgLy8gd2UgbmVlZCB0byBtYWtlIFVURjggYnl0ZXMgZnJvbSBpdCwgdG8gYmUgZGVjb2RlZCBsYXRlcgotICAgICAgdG1wIDo9IFN5c1V0aWxzLlRFbmNvZGluZy5VVEY4LkdldEJ5dGVzKENoYXIod2NoKSk7Ci0gICAgICBidWZmZXIuV3JpdGUoIHRtcFswXSwgbGVuZ3RoKHRtcCkpOworICAgICAgaWYgQ2hhclV0aWxzLklzSGlnaFN1cnJvZ2F0ZShjaGFyKHdjaCkpIHRoZW4gYmVnaW4KKyAgICAgICAgaWYgaGlnaFN1cm9nYXRlIDw+ICMwCisgICAgICAgIHRoZW4gcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uSW52YWxpZERhdGEuQ3JlYXRlKCdFeHBlY3RlZCBsb3cgc3Vycm9nYXRlIGNoYXInKTsKKyAgICAgICAgaGlnaFN1cm9nYXRlIDo9IGNoYXIod2NoKTsKKyAgICAgIGVuZAorICAgICAgZWxzZSBpZiBDaGFyVXRpbHMuSXNMb3dTdXJyb2dhdGUoY2hhcih3Y2gpKSB0aGVuIGJlZ2luCisgICAgICAgIGlmIGhpZ2hTdXJvZ2F0ZSA9ICMwCisgICAgICAgIHRoZW4gVFByb3RvY29sRXhjZXB0aW9uSW52YWxpZERhdGEuQ3JlYXRlKCdFeHBlY3RlZCBoaWdoIHN1cnJvZ2F0ZSBjaGFyJyk7CisgICAgICAgIHN1cnJvZ2F0ZVBhaXJzWzBdIDo9IGhpZ2hTdXJvZ2F0ZTsKKyAgICAgICAgc3Vycm9nYXRlUGFpcnNbMV0gOj0gY2hhcih3Y2gpOworICAgICAgICB0bXAgOj0gVEVuY29kaW5nLlVURjguR2V0Qnl0ZXMoc3Vycm9nYXRlUGFpcnMpOworICAgICAgICBidWZmZXIuV3JpdGUoIHRtcFswXSwgTGVuZ3RoKHRtcCkpOworICAgICAgICBoaWdoU3Vyb2dhdGUgOj0gIzA7CisgICAgICBlbmQKKyAgICAgIGVsc2UgYmVnaW4KKyAgICAgICAgdG1wIDo9IFN5c1V0aWxzLlRFbmNvZGluZy5VVEY4LkdldEJ5dGVzKENoYXIod2NoKSk7CisgICAgICAgIGJ1ZmZlci5Xcml0ZSggdG1wWzBdLCBMZW5ndGgodG1wKSk7CisgICAgICBlbmQ7CiAgICAgZW5kOwogCisgICAgaWYgaGlnaFN1cm9nYXRlIDw+ICMwCisgICAgdGhlbiByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25JbnZhbGlkRGF0YS5DcmVhdGUoJ0V4cGVjdGVkIGxvdyBzdXJyb2dhdGUgY2hhcicpOworCiAgICAgU2V0TGVuZ3RoKCByZXN1bHQsIGJ1ZmZlci5TaXplKTsKICAgICBpZiBidWZmZXIuU2l6ZSA+IDAgdGhlbiBNb3ZlKCBidWZmZXIuTWVtb3J5XiwgcmVzdWx0WzBdLCBMZW5ndGgocmVzdWx0KSk7CiAKQEAgLTkxOSw4ICs5NDEsNyBAQAogICAgIHJlc3VsdCA6PSBTdHJUb0ludDY0KHN0cik7CiAgIGV4Y2VwdAogICAgIG9uIGU6RXhjZXB0aW9uIGRvIGJlZ2luCi0gICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24uQ3JlYXRlKCBUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0JhZCBkYXRhIGVuY291bnRlZCBpbiBudW1lcmljIGRhdGEgKCcrc3RyKycpICgnK2UuTWVzc2FnZSsnKScpOworICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uSW52YWxpZERhdGEuQ3JlYXRlKCdCYWQgZGF0YSBlbmNvdW50ZWQgaW4gbnVtZXJpYyBkYXRhICgnK3N0cisnKSAoJytlLk1lc3NhZ2UrJyknKTsKICAgICBlbmQ7CiAgIGVuZDsKIGVuZDsKQEAgLTk0Miw3ICs5NjMsNyBAQAogICAgIGFuZCBub3QgTWF0aC5Jc0luZmluaXRlKGR1YikKICAgICB0aGVuIGJlZ2luCiAgICAgICAvLyBUaHJvdyBleGNlcHRpb24gLS0gd2Ugc2hvdWxkIG5vdCBiZSBpbiBhIHN0cmluZyBpbiAgU2VsZiBjYXNlCi0gICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24uQ3JlYXRlKCBUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAnTnVtZXJpYyBkYXRhIHVuZXhwZWN0ZWRseSBxdW90ZWQnKTsKKyAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbkludmFsaWREYXRhLkNyZWF0ZSgnTnVtZXJpYyBkYXRhIHVuZXhwZWN0ZWRseSBxdW90ZWQnKTsKICAgICBlbmQ7CiAgICAgcmVzdWx0IDo9IGR1YjsKICAgICBFeGl0OwpAQCAtOTU3LDggKzk3OCw3IEBACiAgICAgcmVzdWx0IDo9IFN0clRvRmxvYXQoIHN0ciwgSU5WQVJJQU5UX0NVTFRVUkUpOwogICBleGNlcHQKICAgICBvbiBlOkV4Y2VwdGlvbgotICAgIGRvIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbi5DcmVhdGUoIFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQmFkIGRhdGEgZW5jb3VudGVkIGluIG51bWVyaWMgZGF0YSAoJytzdHIrJykgKCcrZS5NZXNzYWdlKycpJyk7CisgICAgZG8gcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uSW52YWxpZERhdGEuQ3JlYXRlKCdCYWQgZGF0YSBlbmNvdW50ZWQgaW4gbnVtZXJpYyBkYXRhICgnK3N0cisnKSAoJytlLk1lc3NhZ2UrJyknKTsKICAgZW5kOwogZW5kOwogCkBAIC0xMDI5LDE1ICsxMDQ5LDE1IEBACiBlbmQ7CiAKIAotZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuUmVhZE1lc3NhZ2VCZWdpbjogSU1lc3NhZ2U7CitmdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5SZWFkTWVzc2FnZUJlZ2luOiBUVGhyaWZ0TWVzc2FnZTsKIGJlZ2luCiAgIFJlc2V0Q29udGV4dFN0YWNrOyAgLy8gVEhSSUZULTE0NzMKIAotICByZXN1bHQgOj0gVE1lc3NhZ2VJbXBsLkNyZWF0ZTsKKyAgSW5pdCggcmVzdWx0KTsKICAgUmVhZEpTT05BcnJheVN0YXJ0OwogCiAgIGlmIFJlYWRKU09OSW50ZWdlciA8PiBWRVJTSU9OCi0gIHRoZW4gcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uLkNyZWF0ZSggVFByb3RvY29sRXhjZXB0aW9uLkJBRF9WRVJTSU9OLCAnTWVzc2FnZSBjb250YWluZWQgYmFkIHZlcnNpb24uJyk7CisgIHRoZW4gcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uQmFkVmVyc2lvbi5DcmVhdGUoJ01lc3NhZ2UgY29udGFpbmVkIGJhZCB2ZXJzaW9uLicpOwogCiAgIHJlc3VsdC5OYW1lICA6PSBTeXNVdGlscy5URW5jb2RpbmcuVVRGOC5HZXRTdHJpbmcoIFJlYWRKU09OU3RyaW5nKCBGQUxTRSkpOwogICByZXN1bHQuVHlwZV8gOj0gVE1lc3NhZ2VUeXBlKCBSZWFkSlNPTkludGVnZXIpOwpAQCAtMTA1MSwxMCArMTA3MSwxMCBAQAogZW5kOwogCiAKLWZ1bmN0aW9uIFRKU09OUHJvdG9jb2xJbXBsLlJlYWRTdHJ1Y3RCZWdpbiA6IElTdHJ1Y3QgOworZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuUmVhZFN0cnVjdEJlZ2luIDogVFRocmlmdFN0cnVjdCA7CiBiZWdpbgogICBSZWFkSlNPTk9iamVjdFN0YXJ0OwotICByZXN1bHQgOj0gVFN0cnVjdEltcGwuQ3JlYXRlKCcnKTsKKyAgSW5pdCggcmVzdWx0KTsKIGVuZDsKIAogCkBAIC0xMDY0LDExICsxMDg0LDExIEBACiBlbmQ7CiAKIAotZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuUmVhZEZpZWxkQmVnaW4gOiBJRmllbGQ7CitmdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5SZWFkRmllbGRCZWdpbiA6IFRUaHJpZnRGaWVsZDsKIHZhciBjaCA6IEJ5dGU7CiAgICAgc3RyIDogc3RyaW5nOwogYmVnaW4KLSAgcmVzdWx0IDo9IFRGaWVsZEltcGwuQ3JlYXRlOworICBJbml0KCByZXN1bHQpOwogICBjaCA6PSBGUmVhZGVyLlBlZWs7CiAgIGlmIGNoID0gUkJSQUNFWzBdCiAgIHRoZW4gcmVzdWx0LlR5cGVfIDo9IFRUeXBlLlN0b3AKQEAgLTEwODgsMTAgKzExMDgsMTAgQEAKIGVuZDsKIAogCi1mdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5SZWFkTWFwQmVnaW4gOiBJTWFwOworZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuUmVhZE1hcEJlZ2luIDogVFRocmlmdE1hcDsKIHZhciBzdHIgOiBzdHJpbmc7CiBiZWdpbgotICByZXN1bHQgOj0gVE1hcEltcGwuQ3JlYXRlOworICBJbml0KCByZXN1bHQpOwogICBSZWFkSlNPTkFycmF5U3RhcnQ7CiAKICAgc3RyIDo9IFN5c1V0aWxzLlRFbmNvZGluZy5VVEY4LkdldFN0cmluZyggUmVhZEpTT05TdHJpbmcoRkFMU0UpKTsKQEAgLTExMTIsMTAgKzExMzIsMTAgQEAKIGVuZDsKIAogCi1mdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5SZWFkTGlzdEJlZ2luIDogSUxpc3Q7CitmdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5SZWFkTGlzdEJlZ2luIDogVFRocmlmdExpc3Q7CiB2YXIgc3RyIDogc3RyaW5nOwogYmVnaW4KLSAgcmVzdWx0IDo9IFRMaXN0SW1wbC5DcmVhdGU7CisgIEluaXQoIHJlc3VsdCk7CiAgIFJlYWRKU09OQXJyYXlTdGFydDsKIAogICBzdHIgOj0gU3lzVXRpbHMuVEVuY29kaW5nLlVURjguR2V0U3RyaW5nKCBSZWFkSlNPTlN0cmluZyhGQUxTRSkpOwpAQCAtMTEzMCwxMCArMTE1MCwxMCBAQAogZW5kOwogCiAKLWZ1bmN0aW9uIFRKU09OUHJvdG9jb2xJbXBsLlJlYWRTZXRCZWdpbiA6IElTZXQ7CitmdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5SZWFkU2V0QmVnaW4gOiBUVGhyaWZ0U2V0OwogdmFyIHN0ciA6IHN0cmluZzsKIGJlZ2luCi0gIHJlc3VsdCA6PSBUU2V0SW1wbC5DcmVhdGU7CisgIEluaXQoIHJlc3VsdCk7CiAgIFJlYWRKU09OQXJyYXlTdGFydDsKIAogICBzdHIgOj0gU3lzVXRpbHMuVEVuY29kaW5nLlVURjguR2V0U3RyaW5nKCBSZWFkSlNPTlN0cmluZyhGQUxTRSkpOwpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlByb3RvY29sLk11bHRpcGxleC5wYXMgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuUHJvdG9jb2wuTXVsdGlwbGV4LnBhcwppbmRleCAxOGIzOWI1Li45M2EzODM4IDEwMDY0NAotLS0gYS9saWIvZGVscGhpL3NyYy9UaHJpZnQuUHJvdG9jb2wuTXVsdGlwbGV4LnBhcworKysgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuUHJvdG9jb2wuTXVsdGlwbGV4LnBhcwpAQCAtNzEsNyArNzEsNyBAQAogICAgIHsgUHJlcGVuZHMgdGhlIHNlcnZpY2UgbmFtZSB0byB0aGUgZnVuY3Rpb24gbmFtZSwgc2VwYXJhdGVkIGJ5IFNFUEFSQVRPUi4KICAgICAgIEFyZ3M6IFRoZSBvcmlnaW5hbCBtZXNzYWdlLgogICAgIH0KLSAgICBwcm9jZWR1cmUgV3JpdGVNZXNzYWdlQmVnaW4oIGNvbnN0IG1zZzogSU1lc3NhZ2UpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVNZXNzYWdlQmVnaW4oIGNvbnN0IG1zZzogVFRocmlmdE1lc3NhZ2UpOyBvdmVycmlkZTsKICAgZW5kOwogCiAKQEAgLTg2LDE0ICs4NiwxNCBAQAogZW5kOwogCiAKLXByb2NlZHVyZSBUTXVsdGlwbGV4ZWRQcm90b2NvbC5Xcml0ZU1lc3NhZ2VCZWdpbiggY29uc3QgbXNnOiBJTWVzc2FnZSk7Citwcm9jZWR1cmUgVE11bHRpcGxleGVkUHJvdG9jb2wuV3JpdGVNZXNzYWdlQmVnaW4oIGNvbnN0IG1zZzogVFRocmlmdE1lc3NhZ2UpOwogLy8gUHJlcGVuZHMgdGhlIHNlcnZpY2UgbmFtZSB0byB0aGUgZnVuY3Rpb24gbmFtZSwgc2VwYXJhdGVkIGJ5IFRNdWx0aXBsZXhlZFByb3RvY29sLlNFUEFSQVRPUi4KLXZhciBuZXdNc2cgOiBJTWVzc2FnZTsKK3ZhciBuZXdNc2cgOiBUVGhyaWZ0TWVzc2FnZTsKIGJlZ2luCiAgIGNhc2UgbXNnLlR5cGVfIG9mCiAgICAgVE1lc3NhZ2VUeXBlLkNhbGwsCiAgICAgVE1lc3NhZ2VUeXBlLk9uZXdheSA6IGJlZ2luCi0gICAgICBuZXdNc2cgOj0gVE1lc3NhZ2VJbXBsLkNyZWF0ZSggRlNlcnZpY2VOYW1lICsgU0VQQVJBVE9SICsgbXNnLk5hbWUsIG1zZy5UeXBlXywgbXNnLlNlcUlEKTsKKyAgICAgIEluaXQoIG5ld01zZywgRlNlcnZpY2VOYW1lICsgU0VQQVJBVE9SICsgbXNnLk5hbWUsIG1zZy5UeXBlXywgbXNnLlNlcUlEKTsKICAgICAgIGluaGVyaXRlZCBXcml0ZU1lc3NhZ2VCZWdpbiggbmV3TXNnKTsKICAgICBlbmQ7CiAKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Qcm90b2NvbC5wYXMgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuUHJvdG9jb2wucGFzCmluZGV4IDAxYjExYTguLjM2NTA5Y2EgMTAwNjQ0Ci0tLSBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Qcm90b2NvbC5wYXMKKysrIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlByb3RvY29sLnBhcwpAQCAtMjcsNiArMjcsNyBAQAogICBDbGFzc2VzLAogICBTeXNVdGlscywKICAgQ29udG5ycywKKyAgVGhyaWZ0LkV4Y2VwdGlvbiwKICAgVGhyaWZ0LlN0cmVhbSwKICAgVGhyaWZ0LkNvbGxlY3Rpb25zLAogICBUaHJpZnQuVHJhbnNwb3J0OwpAQCAtNzAsNyArNzEsNDAgQEAKIAogdHlwZQogICBJUHJvdG9jb2wgPSBpbnRlcmZhY2U7Ci0gIElTdHJ1Y3QgPSBpbnRlcmZhY2U7CisKKyAgVFRocmlmdE1lc3NhZ2UgPSByZWNvcmQKKyAgICBOYW1lOiBzdHJpbmc7CisgICAgVHlwZV86IFRNZXNzYWdlVHlwZTsKKyAgICBTZXFJRDogSW50ZWdlcjsKKyAgZW5kOworCisgIFRUaHJpZnRTdHJ1Y3QgPSByZWNvcmQKKyAgICBOYW1lOiBzdHJpbmc7CisgIGVuZDsKKworICBUVGhyaWZ0RmllbGQgPSByZWNvcmQKKyAgICBOYW1lOiBzdHJpbmc7CisgICAgVHlwZV86IFRUeXBlOworICAgIElkOiBTbWFsbEludDsKKyAgZW5kOworCisgIFRUaHJpZnRMaXN0ID0gcmVjb3JkCisgICAgRWxlbWVudFR5cGU6IFRUeXBlOworICAgIENvdW50OiBJbnRlZ2VyOworICBlbmQ7CisKKyAgVFRocmlmdE1hcCA9IHJlY29yZAorICAgIEtleVR5cGU6IFRUeXBlOworICAgIFZhbHVlVHlwZTogVFR5cGU7CisgICAgQ291bnQ6IEludGVnZXI7CisgIGVuZDsKKworICBUVGhyaWZ0U2V0ID0gcmVjb3JkCisgICAgRWxlbWVudFR5cGU6IFRUeXBlOworICAgIENvdW50OiBJbnRlZ2VyOworICBlbmQ7CisKKwogCiAgIElQcm90b2NvbEZhY3RvcnkgPSBpbnRlcmZhY2UKICAgICBbJ3s3Q0Q2NEExMC00RTlGLTRFOTktOTNCRi03MDhBMzFGNEE2N0J9J10KQEAgLTgzLDE2NCArMTE3LDQwIEBACiAgICAgZnVuY3Rpb24gQXBwZW5kKGNvbnN0IFZhbHVlOiBJVGhyaWZ0Q29udGFpbmVyKTogVFN0cmluZ0J1aWxkZXI7IG92ZXJsb2FkOwogICBlbmQ7CiAKLSAgVFByb3RvY29sRXhjZXB0aW9uID0gY2xhc3MoIEV4Y2VwdGlvbiApCisgIFRQcm90b2NvbEV4Y2VwdGlvbiA9IGNsYXNzKCBURXhjZXB0aW9uKQogICBwdWJsaWMKICAgICBjb25zdCAvLyBUT0RPKGplbnNnKTogY2hhbmdlIGludG8gZW51bQotICAgICAgVU5LTk9XTiA6IEludGVnZXIgPSAwOwotICAgICAgSU5WQUxJRF9EQVRBIDogSW50ZWdlciA9IDE7Ci0gICAgICBORUdBVElWRV9TSVpFIDogSW50ZWdlciA9IDI7Ci0gICAgICBTSVpFX0xJTUlUIDogSW50ZWdlciA9IDM7Ci0gICAgICBCQURfVkVSU0lPTiA6IEludGVnZXIgPSA0OwotICAgICAgTk9UX0lNUExFTUVOVEVEIDogSW50ZWdlciA9IDU7Ci0gICAgICBERVBUSF9MSU1JVCA6IEludGVnZXIgPSA2OworICAgICAgVU5LTk9XTiA9IDA7CisgICAgICBJTlZBTElEX0RBVEEgPSAxOworICAgICAgTkVHQVRJVkVfU0laRSA9IDI7CisgICAgICBTSVpFX0xJTUlUID0gMzsKKyAgICAgIEJBRF9WRVJTSU9OID0gNDsKKyAgICAgIE5PVF9JTVBMRU1FTlRFRCA9IDU7CisgICAgICBERVBUSF9MSU1JVCA9IDY7CiAgIHByb3RlY3RlZAotICAgIEZUeXBlIDogSW50ZWdlcjsKKyAgICBjb25zdHJ1Y3RvciBIaWRkZW5DcmVhdGUoY29uc3QgTXNnOiBzdHJpbmcpOwogICBwdWJsaWMKLSAgICBjb25zdHJ1Y3RvciBDcmVhdGU7IG92ZXJsb2FkOwotICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggdHlwZV86IEludGVnZXIgKTsgb3ZlcmxvYWQ7Ci0gICAgY29uc3RydWN0b3IgQ3JlYXRlKCB0eXBlXzogSW50ZWdlcjsgY29uc3QgbXNnOiBzdHJpbmcpOyBvdmVybG9hZDsKKyAgICAvLyBwdXJwb3NlZnVsbHkgaGlkZSBpbmhlcml0ZWQgY29uc3RydWN0b3IKKyAgICBjbGFzcyBmdW5jdGlvbiBDcmVhdGUoY29uc3QgTXNnOiBzdHJpbmcpOiBUUHJvdG9jb2xFeGNlcHRpb247IG92ZXJsb2FkOyBkZXByZWNhdGVkICdVc2Ugc3BlY2lhbGl6ZWQgVFByb3RvY29sRXhjZXB0aW9uIHR5cGVzIChvciByZWdlbmVyYXRlIGZyb20gSURMKSc7CisgICAgY2xhc3MgZnVuY3Rpb24gQ3JlYXRlOiBUUHJvdG9jb2xFeGNlcHRpb247IG92ZXJsb2FkOyBkZXByZWNhdGVkICdVc2Ugc3BlY2lhbGl6ZWQgVFByb3RvY29sRXhjZXB0aW9uIHR5cGVzIChvciByZWdlbmVyYXRlIGZyb20gSURMKSc7CisgICAgY2xhc3MgZnVuY3Rpb24gQ3JlYXRlKCB0eXBlXzogSW50ZWdlcik6IFRQcm90b2NvbEV4Y2VwdGlvbjsgb3ZlcmxvYWQ7IGRlcHJlY2F0ZWQgJ1VzZSBzcGVjaWFsaXplZCBUUHJvdG9jb2xFeGNlcHRpb24gdHlwZXMgKG9yIHJlZ2VuZXJhdGUgZnJvbSBJREwpJzsKKyAgICBjbGFzcyBmdW5jdGlvbiBDcmVhdGUoIHR5cGVfOiBJbnRlZ2VyOyBjb25zdCBtc2c6IHN0cmluZyk6IFRQcm90b2NvbEV4Y2VwdGlvbjsgb3ZlcmxvYWQ7IGRlcHJlY2F0ZWQgJ1VzZSBzcGVjaWFsaXplZCBUUHJvdG9jb2xFeGNlcHRpb24gdHlwZXMgKG9yIHJlZ2VuZXJhdGUgZnJvbSBJREwpJzsKICAgZW5kOwogCi0gIElNYXAgPSBpbnRlcmZhY2UKLSAgICBbJ3szMDUzMUQ5Ny03RTA2LTQyMzMtQjgwMC1DM0Y1M0NDRDIzRTd9J10KLSAgICBmdW5jdGlvbiBHZXRLZXlUeXBlOiBUVHlwZTsKLSAgICBwcm9jZWR1cmUgU2V0S2V5VHlwZSggVmFsdWU6IFRUeXBlKTsKLSAgICBmdW5jdGlvbiBHZXRWYWx1ZVR5cGU6IFRUeXBlOwotICAgIHByb2NlZHVyZSBTZXRWYWx1ZVR5cGUoIFZhbHVlOiBUVHlwZSk7Ci0gICAgZnVuY3Rpb24gR2V0Q291bnQ6IEludGVnZXI7Ci0gICAgcHJvY2VkdXJlIFNldENvdW50KCBWYWx1ZTogSW50ZWdlcik7Ci0gICAgcHJvcGVydHkgS2V5VHlwZTogVFR5cGUgcmVhZCBHZXRLZXlUeXBlIHdyaXRlIFNldEtleVR5cGU7Ci0gICAgcHJvcGVydHkgVmFsdWVUeXBlOiBUVHlwZSByZWFkIEdldFZhbHVlVHlwZSB3cml0ZSBTZXRWYWx1ZVR5cGU7Ci0gICAgcHJvcGVydHkgQ291bnQ6IEludGVnZXIgcmVhZCBHZXRDb3VudCB3cml0ZSBTZXRDb3VudDsKLSAgZW5kOwotCi0gIFRNYXBJbXBsID0gY2xhc3MoIFRJbnRlcmZhY2VkT2JqZWN0LCBJTWFwKQotICBwcml2YXRlCi0gICAgRlZhbHVlVHlwZTogVFR5cGU7Ci0gICAgRktleVR5cGU6IFRUeXBlOwotICAgIEZDb3VudDogSW50ZWdlcjsKLSAgcHJvdGVjdGVkCi0gICAgZnVuY3Rpb24gR2V0S2V5VHlwZTogVFR5cGU7Ci0gICAgcHJvY2VkdXJlIFNldEtleVR5cGUoIFZhbHVlOiBUVHlwZSk7Ci0gICAgZnVuY3Rpb24gR2V0VmFsdWVUeXBlOiBUVHlwZTsKLSAgICBwcm9jZWR1cmUgU2V0VmFsdWVUeXBlKCBWYWx1ZTogVFR5cGUpOwotICAgIGZ1bmN0aW9uIEdldENvdW50OiBJbnRlZ2VyOwotICAgIHByb2NlZHVyZSBTZXRDb3VudCggVmFsdWU6IEludGVnZXIpOworICAvLyBOZWVkZWQgdG8gcmVtb3ZlIGRlcHJlY2F0aW9uIHdhcm5pbmcKKyAgVFByb3RvY29sRXhjZXB0aW9uU3BlY2lhbGl6ZWQgPSBjbGFzcyBhYnN0cmFjdCAoVFByb3RvY29sRXhjZXB0aW9uKQogICBwdWJsaWMKLSAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIEFLZXlUeXBlLCBBVmFsdWVUeXBlOiBUVHlwZTsgQUNvdW50OiBJbnRlZ2VyKTsgb3ZlcmxvYWQ7Ci0gICAgY29uc3RydWN0b3IgQ3JlYXRlOyBvdmVybG9hZDsKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoY29uc3QgTXNnOiBzdHJpbmcpOwogICBlbmQ7CiAKLSAgSUxpc3QgPSBpbnRlcmZhY2UKLSAgICBbJ3s2NzYzRTFFQS1BOTM0LTQ0NzItOTA0Ri0wMDgzOTgwQjlCODd9J10KLSAgICBmdW5jdGlvbiBHZXRFbGVtZW50VHlwZTogVFR5cGU7Ci0gICAgcHJvY2VkdXJlIFNldEVsZW1lbnRUeXBlKCBWYWx1ZTogVFR5cGUpOwotICAgIGZ1bmN0aW9uIEdldENvdW50OiBJbnRlZ2VyOwotICAgIHByb2NlZHVyZSBTZXRDb3VudCggVmFsdWU6IEludGVnZXIpOwotICAgIHByb3BlcnR5IEVsZW1lbnRUeXBlOiBUVHlwZSByZWFkIEdldEVsZW1lbnRUeXBlIHdyaXRlIFNldEVsZW1lbnRUeXBlOwotICAgIHByb3BlcnR5IENvdW50OiBJbnRlZ2VyIHJlYWQgR2V0Q291bnQgd3JpdGUgU2V0Q291bnQ7Ci0gIGVuZDsKKyAgVFByb3RvY29sRXhjZXB0aW9uVW5rbm93biA9IGNsYXNzIChUUHJvdG9jb2xFeGNlcHRpb25TcGVjaWFsaXplZCk7CisgIFRQcm90b2NvbEV4Y2VwdGlvbkludmFsaWREYXRhID0gY2xhc3MgKFRQcm90b2NvbEV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVFByb3RvY29sRXhjZXB0aW9uTmVnYXRpdmVTaXplID0gY2xhc3MgKFRQcm90b2NvbEV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVFByb3RvY29sRXhjZXB0aW9uU2l6ZUxpbWl0ID0gY2xhc3MgKFRQcm90b2NvbEV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVFByb3RvY29sRXhjZXB0aW9uQmFkVmVyc2lvbiA9IGNsYXNzIChUUHJvdG9jb2xFeGNlcHRpb25TcGVjaWFsaXplZCk7CisgIFRQcm90b2NvbEV4Y2VwdGlvbk5vdEltcGxlbWVudGVkID0gY2xhc3MgKFRQcm90b2NvbEV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVFByb3RvY29sRXhjZXB0aW9uRGVwdGhMaW1pdCA9IGNsYXNzIChUUHJvdG9jb2xFeGNlcHRpb25TcGVjaWFsaXplZCk7CiAKLSAgVExpc3RJbXBsID0gY2xhc3MoIFRJbnRlcmZhY2VkT2JqZWN0LCBJTGlzdCkKLSAgcHJpdmF0ZQotICAgIEZFbGVtZW50VHlwZTogVFR5cGU7Ci0gICAgRkNvdW50IDogSW50ZWdlcjsKLSAgcHJvdGVjdGVkCi0gICAgZnVuY3Rpb24gR2V0RWxlbWVudFR5cGU6IFRUeXBlOwotICAgIHByb2NlZHVyZSBTZXRFbGVtZW50VHlwZSggVmFsdWU6IFRUeXBlKTsKLSAgICBmdW5jdGlvbiBHZXRDb3VudDogSW50ZWdlcjsKLSAgICBwcm9jZWR1cmUgU2V0Q291bnQoIFZhbHVlOiBJbnRlZ2VyKTsKLSAgcHVibGljCi0gICAgY29uc3RydWN0b3IgQ3JlYXRlKCBBRWxlbWVudFR5cGU6IFRUeXBlOyBBQ291bnQ6IEludGVnZXIpOyBvdmVybG9hZDsKLSAgICBjb25zdHJ1Y3RvciBDcmVhdGU7IG92ZXJsb2FkOwotICBlbmQ7Ci0KLSAgSVNldCA9IGludGVyZmFjZQotICAgIFsne0E4NjcxNzAwLTc1MTQtNEMxRS04QTA1LTYyNzg2ODcyMDA1Rn0nXQotICAgIGZ1bmN0aW9uIEdldEVsZW1lbnRUeXBlOiBUVHlwZTsKLSAgICBwcm9jZWR1cmUgU2V0RWxlbWVudFR5cGUoIFZhbHVlOiBUVHlwZSk7Ci0gICAgZnVuY3Rpb24gR2V0Q291bnQ6IEludGVnZXI7Ci0gICAgcHJvY2VkdXJlIFNldENvdW50KCBWYWx1ZTogSW50ZWdlcik7Ci0gICAgcHJvcGVydHkgRWxlbWVudFR5cGU6IFRUeXBlIHJlYWQgR2V0RWxlbWVudFR5cGUgd3JpdGUgU2V0RWxlbWVudFR5cGU7Ci0gICAgcHJvcGVydHkgQ291bnQ6IEludGVnZXIgcmVhZCBHZXRDb3VudCB3cml0ZSBTZXRDb3VudDsKLSAgZW5kOwotCi0gIFRTZXRJbXBsID0gY2xhc3MoIFRJbnRlcmZhY2VkT2JqZWN0LCBJU2V0KQotICBwcml2YXRlCi0gICAgRkNvdW50OiBJbnRlZ2VyOwotICAgIEZFbGVtZW50VHlwZTogVFR5cGU7Ci0gIHByb3RlY3RlZAotICAgIGZ1bmN0aW9uIEdldEVsZW1lbnRUeXBlOiBUVHlwZTsKLSAgICBwcm9jZWR1cmUgU2V0RWxlbWVudFR5cGUoIFZhbHVlOiBUVHlwZSk7Ci0gICAgZnVuY3Rpb24gR2V0Q291bnQ6IEludGVnZXI7Ci0gICAgcHJvY2VkdXJlIFNldENvdW50KCBWYWx1ZTogSW50ZWdlcik7Ci0gIHB1YmxpYwotICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggQUVsZW1lbnRUeXBlOiBUVHlwZTsgQUNvdW50OiBJbnRlZ2VyKTsgb3ZlcmxvYWQ7Ci0gICAgY29uc3RydWN0b3IgQ3JlYXRlOyBvdmVybG9hZDsKLSAgZW5kOwotCi0gIElNZXNzYWdlID0gaW50ZXJmYWNlCi0gICAgWyd7OUUzNjhCNEEtQjFGQS00M0U3LThDRjUtNTZDNjZEMjU2Q0E3fSddCi0gICAgZnVuY3Rpb24gR2V0TmFtZTogc3RyaW5nOwotICAgIHByb2NlZHVyZSBTZXROYW1lKCBjb25zdCBWYWx1ZTogc3RyaW5nKTsKLSAgICBmdW5jdGlvbiBHZXRUeXBlOiBUTWVzc2FnZVR5cGU7Ci0gICAgcHJvY2VkdXJlIFNldFR5cGUoIFZhbHVlOiBUTWVzc2FnZVR5cGUpOwotICAgIGZ1bmN0aW9uIEdldFNlcUlEOiBJbnRlZ2VyOwotICAgIHByb2NlZHVyZSBTZXRTZXFJRCggVmFsdWU6IEludGVnZXIpOwotICAgIHByb3BlcnR5IE5hbWU6IHN0cmluZyByZWFkIEdldE5hbWUgd3JpdGUgU2V0TmFtZTsKLSAgICBwcm9wZXJ0eSBUeXBlXzogVE1lc3NhZ2VUeXBlIHJlYWQgR2V0VHlwZSB3cml0ZSBTZXRUeXBlOwotICAgIHByb3BlcnR5IFNlcUlEOiBJbnRlZ2VyIHJlYWQgR2V0U2VxSUQgd3JpdGUgU2V0U2VxSUQ7Ci0gIGVuZDsKLQotICBUTWVzc2FnZUltcGwgPSBjbGFzcyggVEludGVyZmFjZWRPYmplY3QsIElNZXNzYWdlICkKLSAgcHJpdmF0ZQotICAgIEZOYW1lOiBzdHJpbmc7Ci0gICAgRk1lc3NhZ2VUeXBlOiBUTWVzc2FnZVR5cGU7Ci0gICAgRlNlcUlEOiBJbnRlZ2VyOwotICBwcm90ZWN0ZWQKLSAgICBmdW5jdGlvbiBHZXROYW1lOiBzdHJpbmc7Ci0gICAgcHJvY2VkdXJlIFNldE5hbWUoIGNvbnN0IFZhbHVlOiBzdHJpbmcpOwotICAgIGZ1bmN0aW9uIEdldFR5cGU6IFRNZXNzYWdlVHlwZTsKLSAgICBwcm9jZWR1cmUgU2V0VHlwZSggVmFsdWU6IFRNZXNzYWdlVHlwZSk7Ci0gICAgZnVuY3Rpb24gR2V0U2VxSUQ6IEludGVnZXI7Ci0gICAgcHJvY2VkdXJlIFNldFNlcUlEKCBWYWx1ZTogSW50ZWdlcik7Ci0gIHB1YmxpYwotICAgIHByb3BlcnR5IE5hbWU6IHN0cmluZyByZWFkIEZOYW1lIHdyaXRlIEZOYW1lOwotICAgIHByb3BlcnR5IFR5cGVfOiBUTWVzc2FnZVR5cGUgcmVhZCBGTWVzc2FnZVR5cGUgd3JpdGUgRk1lc3NhZ2VUeXBlOwotICAgIHByb3BlcnR5IFNlcUlEOiBJbnRlZ2VyIHJlYWQgRlNlcUlEIHdyaXRlIEZTZXFJRDsKLSAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIEFOYW1lOiBzdHJpbmc7IEFNZXNzYWdlVHlwZTogVE1lc3NhZ2VUeXBlOyBBU2VxSUQ6IEludGVnZXIpOyBvdmVybG9hZDsKLSAgICBjb25zdHJ1Y3RvciBDcmVhdGU7IG92ZXJsb2FkOwotICBlbmQ7Ci0KLSAgSUZpZWxkID0gaW50ZXJmYWNlCi0gICAgWyd7RjBENDNCRTUtNzg4My00NDJFLTgzRkYtMDU4MENDNjMyQjcyfSddCi0gICAgZnVuY3Rpb24gR2V0TmFtZTogc3RyaW5nOwotICAgIHByb2NlZHVyZSBTZXROYW1lKCBjb25zdCBWYWx1ZTogc3RyaW5nKTsKLSAgICBmdW5jdGlvbiBHZXRUeXBlOiBUVHlwZTsKLSAgICBwcm9jZWR1cmUgU2V0VHlwZSggVmFsdWU6IFRUeXBlKTsKLSAgICBmdW5jdGlvbiBHZXRJZDogU21hbGxJbnQ7Ci0gICAgcHJvY2VkdXJlIFNldElkKCBWYWx1ZTogU21hbGxJbnQpOwotICAgIHByb3BlcnR5IE5hbWU6IHN0cmluZyByZWFkIEdldE5hbWUgd3JpdGUgU2V0TmFtZTsKLSAgICBwcm9wZXJ0eSBUeXBlXzogVFR5cGUgcmVhZCBHZXRUeXBlIHdyaXRlIFNldFR5cGU7Ci0gICAgcHJvcGVydHkgSWQ6IFNtYWxsSW50IHJlYWQgR2V0SWQgd3JpdGUgU2V0SWQ7Ci0gIGVuZDsKLQotICBURmllbGRJbXBsID0gY2xhc3MoIFRJbnRlcmZhY2VkT2JqZWN0LCBJRmllbGQpCi0gIHByaXZhdGUKLSAgICBGTmFtZSA6IHN0cmluZzsKLSAgICBGVHlwZSA6IFRUeXBlOwotICAgIEZJZCAgIDogU21hbGxJbnQ7Ci0gIHByb3RlY3RlZAotICAgIGZ1bmN0aW9uIEdldE5hbWU6IHN0cmluZzsKLSAgICBwcm9jZWR1cmUgU2V0TmFtZSggY29uc3QgVmFsdWU6IHN0cmluZyk7Ci0gICAgZnVuY3Rpb24gR2V0VHlwZTogVFR5cGU7Ci0gICAgcHJvY2VkdXJlIFNldFR5cGUoIFZhbHVlOiBUVHlwZSk7Ci0gICAgZnVuY3Rpb24gR2V0SWQ6IFNtYWxsSW50OwotICAgIHByb2NlZHVyZSBTZXRJZCggVmFsdWU6IFNtYWxsSW50KTsKLSAgcHVibGljCi0gICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBBTmFtZTogc3RyaW5nOyBjb25zdCBBVHlwZTogVFR5cGU7IEFJZDogU21hbGxJbnQpOyBvdmVybG9hZDsKLSAgICBjb25zdHJ1Y3RvciBDcmVhdGU7IG92ZXJsb2FkOwotICBlbmQ7CiAKICAgVFByb3RvY29sVXRpbCA9IGNsYXNzCiAgIHB1YmxpYwpAQCAtMjYzLDE4ICsxNzMsMTggQEAKICAgSVByb3RvY29sID0gaW50ZXJmYWNlCiAgICAgWyd7NjAyQTdGRkItMEQ5RS00Q0Q4LThEN0YtRTUwNzY2NjA1ODhBfSddCiAgICAgZnVuY3Rpb24gR2V0VHJhbnNwb3J0OiBJVHJhbnNwb3J0OwotICAgIHByb2NlZHVyZSBXcml0ZU1lc3NhZ2VCZWdpbiggY29uc3QgbXNnOiBJTWVzc2FnZSk7CisgICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBtc2c6IFRUaHJpZnRNZXNzYWdlKTsKICAgICBwcm9jZWR1cmUgV3JpdGVNZXNzYWdlRW5kOwotICAgIHByb2NlZHVyZSBXcml0ZVN0cnVjdEJlZ2luKCBjb25zdCBzdHJ1YzogSVN0cnVjdCk7CisgICAgcHJvY2VkdXJlIFdyaXRlU3RydWN0QmVnaW4oIGNvbnN0IHN0cnVjOiBUVGhyaWZ0U3RydWN0KTsKICAgICBwcm9jZWR1cmUgV3JpdGVTdHJ1Y3RFbmQ7Ci0gICAgcHJvY2VkdXJlIFdyaXRlRmllbGRCZWdpbiggY29uc3QgZmllbGQ6IElGaWVsZCk7CisgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRCZWdpbiggY29uc3QgZmllbGQ6IFRUaHJpZnRGaWVsZCk7CiAgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRFbmQ7CiAgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRTdG9wOwotICAgIHByb2NlZHVyZSBXcml0ZU1hcEJlZ2luKCBjb25zdCBtYXA6IElNYXApOworICAgIHByb2NlZHVyZSBXcml0ZU1hcEJlZ2luKCBjb25zdCBtYXA6IFRUaHJpZnRNYXApOwogICAgIHByb2NlZHVyZSBXcml0ZU1hcEVuZDsKLSAgICBwcm9jZWR1cmUgV3JpdGVMaXN0QmVnaW4oIGNvbnN0IGxpc3Q6IElMaXN0KTsKKyAgICBwcm9jZWR1cmUgV3JpdGVMaXN0QmVnaW4oIGNvbnN0IGxpc3Q6IFRUaHJpZnRMaXN0KTsKICAgICBwcm9jZWR1cmUgV3JpdGVMaXN0RW5kKCk7Ci0gICAgcHJvY2VkdXJlIFdyaXRlU2V0QmVnaW4oIGNvbnN0IHNldF86IElTZXQgKTsKKyAgICBwcm9jZWR1cmUgV3JpdGVTZXRCZWdpbiggY29uc3Qgc2V0XzogVFRocmlmdFNldCApOwogICAgIHByb2NlZHVyZSBXcml0ZVNldEVuZCgpOwogICAgIHByb2NlZHVyZSBXcml0ZUJvb2woIGI6IEJvb2xlYW4pOwogICAgIHByb2NlZHVyZSBXcml0ZUJ5dGUoIGI6IFNob3J0SW50KTsKQEAgLTI4NiwxNyArMTk2LDE3IEBACiAgICAgcHJvY2VkdXJlIFdyaXRlQW5zaVN0cmluZyggY29uc3QgczogQW5zaVN0cmluZyk7CiAgICAgcHJvY2VkdXJlIFdyaXRlQmluYXJ5KCBjb25zdCBiOiBUQnl0ZXMpOwogCi0gICAgZnVuY3Rpb24gUmVhZE1lc3NhZ2VCZWdpbjogSU1lc3NhZ2U7CisgICAgZnVuY3Rpb24gUmVhZE1lc3NhZ2VCZWdpbjogVFRocmlmdE1lc3NhZ2U7CiAgICAgcHJvY2VkdXJlIFJlYWRNZXNzYWdlRW5kKCk7Ci0gICAgZnVuY3Rpb24gUmVhZFN0cnVjdEJlZ2luOiBJU3RydWN0OworICAgIGZ1bmN0aW9uIFJlYWRTdHJ1Y3RCZWdpbjogVFRocmlmdFN0cnVjdDsKICAgICBwcm9jZWR1cmUgUmVhZFN0cnVjdEVuZDsKLSAgICBmdW5jdGlvbiBSZWFkRmllbGRCZWdpbjogSUZpZWxkOworICAgIGZ1bmN0aW9uIFJlYWRGaWVsZEJlZ2luOiBUVGhyaWZ0RmllbGQ7CiAgICAgcHJvY2VkdXJlIFJlYWRGaWVsZEVuZCgpOwotICAgIGZ1bmN0aW9uIFJlYWRNYXBCZWdpbjogSU1hcDsKKyAgICBmdW5jdGlvbiBSZWFkTWFwQmVnaW46IFRUaHJpZnRNYXA7CiAgICAgcHJvY2VkdXJlIFJlYWRNYXBFbmQoKTsKLSAgICBmdW5jdGlvbiBSZWFkTGlzdEJlZ2luOiBJTGlzdDsKKyAgICBmdW5jdGlvbiBSZWFkTGlzdEJlZ2luOiBUVGhyaWZ0TGlzdDsKICAgICBwcm9jZWR1cmUgUmVhZExpc3RFbmQoKTsKLSAgICBmdW5jdGlvbiBSZWFkU2V0QmVnaW46IElTZXQ7CisgICAgZnVuY3Rpb24gUmVhZFNldEJlZ2luOiBUVGhyaWZ0U2V0OwogICAgIHByb2NlZHVyZSBSZWFkU2V0RW5kKCk7CiAgICAgZnVuY3Rpb24gUmVhZEJvb2w6IEJvb2xlYW47CiAgICAgZnVuY3Rpb24gUmVhZEJ5dGU6IFNob3J0SW50OwpAQCAtMzMyLDE4ICsyNDIsMTggQEAKIAogICAgIGZ1bmN0aW9uIEdldFRyYW5zcG9ydDogSVRyYW5zcG9ydDsKICAgcHVibGljCi0gICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBtc2c6IElNZXNzYWdlKTsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBtc2c6IFRUaHJpZnRNZXNzYWdlKTsgdmlydHVhbDsgYWJzdHJhY3Q7CiAgICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUVuZDsgdmlydHVhbDsgYWJzdHJhY3Q7Ci0gICAgcHJvY2VkdXJlIFdyaXRlU3RydWN0QmVnaW4oIGNvbnN0IHN0cnVjOiBJU3RydWN0KTsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIFdyaXRlU3RydWN0QmVnaW4oIGNvbnN0IHN0cnVjOiBUVGhyaWZ0U3RydWN0KTsgdmlydHVhbDsgYWJzdHJhY3Q7CiAgICAgcHJvY2VkdXJlIFdyaXRlU3RydWN0RW5kOyB2aXJ0dWFsOyBhYnN0cmFjdDsKLSAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZEJlZ2luKCBjb25zdCBmaWVsZDogSUZpZWxkKTsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRCZWdpbiggY29uc3QgZmllbGQ6IFRUaHJpZnRGaWVsZCk7IHZpcnR1YWw7IGFic3RyYWN0OwogICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkRW5kOyB2aXJ0dWFsOyBhYnN0cmFjdDsKICAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZFN0b3A7IHZpcnR1YWw7IGFic3RyYWN0OwotICAgIHByb2NlZHVyZSBXcml0ZU1hcEJlZ2luKCBjb25zdCBtYXA6IElNYXApOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgV3JpdGVNYXBCZWdpbiggY29uc3QgbWFwOiBUVGhyaWZ0TWFwKTsgdmlydHVhbDsgYWJzdHJhY3Q7CiAgICAgcHJvY2VkdXJlIFdyaXRlTWFwRW5kOyB2aXJ0dWFsOyBhYnN0cmFjdDsKLSAgICBwcm9jZWR1cmUgV3JpdGVMaXN0QmVnaW4oIGNvbnN0IGxpc3Q6IElMaXN0KTsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIFdyaXRlTGlzdEJlZ2luKCBjb25zdCBsaXN0OiBUVGhyaWZ0TGlzdCk7IHZpcnR1YWw7IGFic3RyYWN0OwogICAgIHByb2NlZHVyZSBXcml0ZUxpc3RFbmQoKTsgdmlydHVhbDsgYWJzdHJhY3Q7Ci0gICAgcHJvY2VkdXJlIFdyaXRlU2V0QmVnaW4oIGNvbnN0IHNldF86IElTZXQgKTsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIFdyaXRlU2V0QmVnaW4oIGNvbnN0IHNldF86IFRUaHJpZnRTZXQgKTsgdmlydHVhbDsgYWJzdHJhY3Q7CiAgICAgcHJvY2VkdXJlIFdyaXRlU2V0RW5kKCk7IHZpcnR1YWw7IGFic3RyYWN0OwogICAgIHByb2NlZHVyZSBXcml0ZUJvb2woIGI6IEJvb2xlYW4pOyB2aXJ0dWFsOyBhYnN0cmFjdDsKICAgICBwcm9jZWR1cmUgV3JpdGVCeXRlKCBiOiBTaG9ydEludCk7IHZpcnR1YWw7IGFic3RyYWN0OwpAQCAtMzU1LDE3ICsyNjUsMTcgQEAKICAgICBwcm9jZWR1cmUgV3JpdGVBbnNpU3RyaW5nKCBjb25zdCBzOiBBbnNpU3RyaW5nKTsgdmlydHVhbDsKICAgICBwcm9jZWR1cmUgV3JpdGVCaW5hcnkoIGNvbnN0IGI6IFRCeXRlcyk7IHZpcnR1YWw7IGFic3RyYWN0OwogCi0gICAgZnVuY3Rpb24gUmVhZE1lc3NhZ2VCZWdpbjogSU1lc3NhZ2U7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIGZ1bmN0aW9uIFJlYWRNZXNzYWdlQmVnaW46IFRUaHJpZnRNZXNzYWdlOyB2aXJ0dWFsOyBhYnN0cmFjdDsKICAgICBwcm9jZWR1cmUgUmVhZE1lc3NhZ2VFbmQoKTsgdmlydHVhbDsgYWJzdHJhY3Q7Ci0gICAgZnVuY3Rpb24gUmVhZFN0cnVjdEJlZ2luOiBJU3RydWN0OyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBmdW5jdGlvbiBSZWFkU3RydWN0QmVnaW46IFRUaHJpZnRTdHJ1Y3Q7IHZpcnR1YWw7IGFic3RyYWN0OwogICAgIHByb2NlZHVyZSBSZWFkU3RydWN0RW5kOyB2aXJ0dWFsOyBhYnN0cmFjdDsKLSAgICBmdW5jdGlvbiBSZWFkRmllbGRCZWdpbjogSUZpZWxkOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBmdW5jdGlvbiBSZWFkRmllbGRCZWdpbjogVFRocmlmdEZpZWxkOyB2aXJ0dWFsOyBhYnN0cmFjdDsKICAgICBwcm9jZWR1cmUgUmVhZEZpZWxkRW5kKCk7IHZpcnR1YWw7IGFic3RyYWN0OwotICAgIGZ1bmN0aW9uIFJlYWRNYXBCZWdpbjogSU1hcDsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgZnVuY3Rpb24gUmVhZE1hcEJlZ2luOiBUVGhyaWZ0TWFwOyB2aXJ0dWFsOyBhYnN0cmFjdDsKICAgICBwcm9jZWR1cmUgUmVhZE1hcEVuZCgpOyB2aXJ0dWFsOyBhYnN0cmFjdDsKLSAgICBmdW5jdGlvbiBSZWFkTGlzdEJlZ2luOiBJTGlzdDsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgZnVuY3Rpb24gUmVhZExpc3RCZWdpbjogVFRocmlmdExpc3Q7IHZpcnR1YWw7IGFic3RyYWN0OwogICAgIHByb2NlZHVyZSBSZWFkTGlzdEVuZCgpOyB2aXJ0dWFsOyBhYnN0cmFjdDsKLSAgICBmdW5jdGlvbiBSZWFkU2V0QmVnaW46IElTZXQ7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIGZ1bmN0aW9uIFJlYWRTZXRCZWdpbjogVFRocmlmdFNldDsgdmlydHVhbDsgYWJzdHJhY3Q7CiAgICAgcHJvY2VkdXJlIFJlYWRTZXRFbmQoKTsgdmlydHVhbDsgYWJzdHJhY3Q7CiAgICAgZnVuY3Rpb24gUmVhZEJvb2w6IEJvb2xlYW47IHZpcnR1YWw7IGFic3RyYWN0OwogICAgIGZ1bmN0aW9uIFJlYWRCeXRlOiBTaG9ydEludDsgdmlydHVhbDsgYWJzdHJhY3Q7CkBAIC0zODksMjIgKzI5OSw2IEBACiAgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBpcHJvdDogSVByb3RvY29sKTsKICAgZW5kOwogCi0gIElTdHJ1Y3QgPSBpbnRlcmZhY2UKLSAgICBbJ3s1RENFMzlBQS1DOTE2LTRCQzctQTc5Qi05NkEwQzM2QjIyMjB9J10KLSAgICBwcm9jZWR1cmUgU2V0TmFtZShjb25zdCBWYWx1ZTogc3RyaW5nKTsKLSAgICBmdW5jdGlvbiBHZXROYW1lOiBzdHJpbmc7Ci0gICAgcHJvcGVydHkgTmFtZTogc3RyaW5nIHJlYWQgR2V0TmFtZSB3cml0ZSBTZXROYW1lOwotICBlbmQ7Ci0KLSAgVFN0cnVjdEltcGwgPSBjbGFzcyggVEludGVyZmFjZWRPYmplY3QsIElTdHJ1Y3QgKQotICBwcml2YXRlCi0gICAgRk5hbWU6IHN0cmluZzsKLSAgcHJvdGVjdGVkCi0gICAgZnVuY3Rpb24gR2V0TmFtZTogc3RyaW5nOwotICAgIHByb2NlZHVyZSBTZXROYW1lKGNvbnN0IFZhbHVlOiBzdHJpbmcpOwotICBwdWJsaWMKLSAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IEFOYW1lOiBzdHJpbmcpOwotICBlbmQ7CiAKICAgVEJpbmFyeVByb3RvY29sSW1wbCA9IGNsYXNzKCBUUHJvdG9jb2xJbXBsICkKICAgcHJvdGVjdGVkCkBAIC00MTYsNyArMzEwLDcgQEAKICAgICBGU3RyaWN0V3JpdGUgOiBCb29sZWFuOwogCiAgIHByaXZhdGUKLSAgICBmdW5jdGlvbiBSZWFkQWxsKCB2YXIgYnVmOiBUQnl0ZXM7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyICk6IEludGVnZXI7CisgICAgZnVuY3Rpb24gUmVhZEFsbCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyICk6IEludGVnZXI7ICBpbmxpbmU7CiAgICAgZnVuY3Rpb24gUmVhZFN0cmluZ0JvZHkoIHNpemU6IEludGVnZXIpOiBzdHJpbmc7CiAKICAgcHVibGljCkBAIC00MzUsMTggKzMyOSwxOCBAQAogICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgdHJhbnM6IElUcmFuc3BvcnQpOyBvdmVybG9hZDsKICAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IHRyYW5zOiBJVHJhbnNwb3J0OyBzdHJpY3RSZWFkOiBCb29sZWFuOyBzdHJpY3RXcml0ZTogQm9vbGVhbik7IG92ZXJsb2FkOwogCi0gICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBtc2c6IElNZXNzYWdlKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBtc2c6IFRUaHJpZnRNZXNzYWdlKTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUVuZDsgb3ZlcnJpZGU7Ci0gICAgcHJvY2VkdXJlIFdyaXRlU3RydWN0QmVnaW4oIGNvbnN0IHN0cnVjOiBJU3RydWN0KTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlU3RydWN0QmVnaW4oIGNvbnN0IHN0cnVjOiBUVGhyaWZ0U3RydWN0KTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFdyaXRlU3RydWN0RW5kOyBvdmVycmlkZTsKLSAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZEJlZ2luKCBjb25zdCBmaWVsZDogSUZpZWxkKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRCZWdpbiggY29uc3QgZmllbGQ6IFRUaHJpZnRGaWVsZCk7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkRW5kOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZFN0b3A7IG92ZXJyaWRlOwotICAgIHByb2NlZHVyZSBXcml0ZU1hcEJlZ2luKCBjb25zdCBtYXA6IElNYXApOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVNYXBCZWdpbiggY29uc3QgbWFwOiBUVGhyaWZ0TWFwKTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFdyaXRlTWFwRW5kOyBvdmVycmlkZTsKLSAgICBwcm9jZWR1cmUgV3JpdGVMaXN0QmVnaW4oIGNvbnN0IGxpc3Q6IElMaXN0KTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTGlzdEJlZ2luKCBjb25zdCBsaXN0OiBUVGhyaWZ0TGlzdCk7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBXcml0ZUxpc3RFbmQoKTsgb3ZlcnJpZGU7Ci0gICAgcHJvY2VkdXJlIFdyaXRlU2V0QmVnaW4oIGNvbnN0IHNldF86IElTZXQgKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlU2V0QmVnaW4oIGNvbnN0IHNldF86IFRUaHJpZnRTZXQgKTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFdyaXRlU2V0RW5kKCk7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBXcml0ZUJvb2woIGI6IEJvb2xlYW4pOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgV3JpdGVCeXRlKCBiOiBTaG9ydEludCk7IG92ZXJyaWRlOwpAQCAtNDU2LDE3ICszNTAsMTcgQEAKICAgICBwcm9jZWR1cmUgV3JpdGVEb3VibGUoIGNvbnN0IGQ6IERvdWJsZSk7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBXcml0ZUJpbmFyeSggY29uc3QgYjogVEJ5dGVzKTsgb3ZlcnJpZGU7CiAKLSAgICBmdW5jdGlvbiBSZWFkTWVzc2FnZUJlZ2luOiBJTWVzc2FnZTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZE1lc3NhZ2VCZWdpbjogVFRocmlmdE1lc3NhZ2U7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBSZWFkTWVzc2FnZUVuZCgpOyBvdmVycmlkZTsKLSAgICBmdW5jdGlvbiBSZWFkU3RydWN0QmVnaW46IElTdHJ1Y3Q7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRTdHJ1Y3RCZWdpbjogVFRocmlmdFN0cnVjdDsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFJlYWRTdHJ1Y3RFbmQ7IG92ZXJyaWRlOwotICAgIGZ1bmN0aW9uIFJlYWRGaWVsZEJlZ2luOiBJRmllbGQ7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRGaWVsZEJlZ2luOiBUVGhyaWZ0RmllbGQ7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBSZWFkRmllbGRFbmQoKTsgb3ZlcnJpZGU7Ci0gICAgZnVuY3Rpb24gUmVhZE1hcEJlZ2luOiBJTWFwOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkTWFwQmVnaW46IFRUaHJpZnRNYXA7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBSZWFkTWFwRW5kKCk7IG92ZXJyaWRlOwotICAgIGZ1bmN0aW9uIFJlYWRMaXN0QmVnaW46IElMaXN0OyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkTGlzdEJlZ2luOiBUVGhyaWZ0TGlzdDsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFJlYWRMaXN0RW5kKCk7IG92ZXJyaWRlOwotICAgIGZ1bmN0aW9uIFJlYWRTZXRCZWdpbjogSVNldDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZFNldEJlZ2luOiBUVGhyaWZ0U2V0OyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgUmVhZFNldEVuZCgpOyBvdmVycmlkZTsKICAgICBmdW5jdGlvbiBSZWFkQm9vbDogQm9vbGVhbjsgb3ZlcnJpZGU7CiAgICAgZnVuY3Rpb24gUmVhZEJ5dGU6IFNob3J0SW50OyBvdmVycmlkZTsKQEAgLTQ5NCwxOCArMzg4LDE4IEBACiAgICAgLy8gQWxsIG9wZXJhdGlvbnMgd2lsbCBiZSBmb3J3YXJkIHRvIHRoZSBnaXZlbiBwcm90b2NvbC4gIE11c3QgYmUgbm9uLW51bGwuCiAgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBhUHJvdG9jb2wgOiBJUHJvdG9jb2wpOwogCi0gICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBtc2c6IElNZXNzYWdlKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBtc2c6IFRUaHJpZnRNZXNzYWdlKTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUVuZDsgb3ZlcnJpZGU7Ci0gICAgcHJvY2VkdXJlIFdyaXRlU3RydWN0QmVnaW4oIGNvbnN0IHN0cnVjOiBJU3RydWN0KTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlU3RydWN0QmVnaW4oIGNvbnN0IHN0cnVjOiBUVGhyaWZ0U3RydWN0KTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFdyaXRlU3RydWN0RW5kOyBvdmVycmlkZTsKLSAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZEJlZ2luKCBjb25zdCBmaWVsZDogSUZpZWxkKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRCZWdpbiggY29uc3QgZmllbGQ6IFRUaHJpZnRGaWVsZCk7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkRW5kOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZFN0b3A7IG92ZXJyaWRlOwotICAgIHByb2NlZHVyZSBXcml0ZU1hcEJlZ2luKCBjb25zdCBtYXA6IElNYXApOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVNYXBCZWdpbiggY29uc3QgbWFwOiBUVGhyaWZ0TWFwKTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFdyaXRlTWFwRW5kOyBvdmVycmlkZTsKLSAgICBwcm9jZWR1cmUgV3JpdGVMaXN0QmVnaW4oIGNvbnN0IGxpc3Q6IElMaXN0KTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTGlzdEJlZ2luKCBjb25zdCBsaXN0OiBUVGhyaWZ0TGlzdCk7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBXcml0ZUxpc3RFbmQoKTsgb3ZlcnJpZGU7Ci0gICAgcHJvY2VkdXJlIFdyaXRlU2V0QmVnaW4oIGNvbnN0IHNldF86IElTZXQgKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlU2V0QmVnaW4oIGNvbnN0IHNldF86IFRUaHJpZnRTZXQgKTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFdyaXRlU2V0RW5kKCk7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBXcml0ZUJvb2woIGI6IEJvb2xlYW4pOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgV3JpdGVCeXRlKCBiOiBTaG9ydEludCk7IG92ZXJyaWRlOwpAQCAtNTE3LDE3ICs0MTEsMTcgQEAKICAgICBwcm9jZWR1cmUgV3JpdGVBbnNpU3RyaW5nKCBjb25zdCBzOiBBbnNpU3RyaW5nKTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFdyaXRlQmluYXJ5KCBjb25zdCBiOiBUQnl0ZXMpOyBvdmVycmlkZTsKIAotICAgIGZ1bmN0aW9uIFJlYWRNZXNzYWdlQmVnaW46IElNZXNzYWdlOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkTWVzc2FnZUJlZ2luOiBUVGhyaWZ0TWVzc2FnZTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFJlYWRNZXNzYWdlRW5kKCk7IG92ZXJyaWRlOwotICAgIGZ1bmN0aW9uIFJlYWRTdHJ1Y3RCZWdpbjogSVN0cnVjdDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZFN0cnVjdEJlZ2luOiBUVGhyaWZ0U3RydWN0OyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgUmVhZFN0cnVjdEVuZDsgb3ZlcnJpZGU7Ci0gICAgZnVuY3Rpb24gUmVhZEZpZWxkQmVnaW46IElGaWVsZDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZEZpZWxkQmVnaW46IFRUaHJpZnRGaWVsZDsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFJlYWRGaWVsZEVuZCgpOyBvdmVycmlkZTsKLSAgICBmdW5jdGlvbiBSZWFkTWFwQmVnaW46IElNYXA7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRNYXBCZWdpbjogVFRocmlmdE1hcDsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFJlYWRNYXBFbmQoKTsgb3ZlcnJpZGU7Ci0gICAgZnVuY3Rpb24gUmVhZExpc3RCZWdpbjogSUxpc3Q7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRMaXN0QmVnaW46IFRUaHJpZnRMaXN0OyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgUmVhZExpc3RFbmQoKTsgb3ZlcnJpZGU7Ci0gICAgZnVuY3Rpb24gUmVhZFNldEJlZ2luOiBJU2V0OyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkU2V0QmVnaW46IFRUaHJpZnRTZXQ7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBSZWFkU2V0RW5kKCk7IG92ZXJyaWRlOwogICAgIGZ1bmN0aW9uIFJlYWRCb29sOiBCb29sZWFuOyBvdmVycmlkZTsKICAgICBmdW5jdGlvbiBSZWFkQnl0ZTogU2hvcnRJbnQ7IG92ZXJyaWRlOwpAQCAtNTc4LDYgKzQ3MiwxMyBAQAogICBlbmQ7CiAKIAorcHJvY2VkdXJlIEluaXQoIHZhciByZWMgOiBUVGhyaWZ0TWVzc2FnZTsgY29uc3QgQU5hbWU6IHN0cmluZyA9ICcnOyBjb25zdCBBTWVzc2FnZVR5cGU6IFRNZXNzYWdlVHlwZSA9IExvdyhUTWVzc2FnZVR5cGUpOyBjb25zdCBBU2VxSUQ6IEludGVnZXIgPSAwKTsgIG92ZXJsb2FkOyAgaW5saW5lOworcHJvY2VkdXJlIEluaXQoIHZhciByZWMgOiBUVGhyaWZ0U3RydWN0OyAgY29uc3QgQU5hbWU6IHN0cmluZyA9ICcnKTsgIG92ZXJsb2FkOyAgaW5saW5lOworcHJvY2VkdXJlIEluaXQoIHZhciByZWMgOiBUVGhyaWZ0RmllbGQ7ICAgY29uc3QgQU5hbWU6IHN0cmluZyA9ICcnOyBjb25zdCBBVHlwZTogVFR5cGUgPSBMb3coVFR5cGUpOyBjb25zdCBBSUQ6IFNtYWxsSW50ID0gMCk7ICBvdmVybG9hZDsgIGlubGluZTsKK3Byb2NlZHVyZSBJbml0KCB2YXIgcmVjIDogVFRocmlmdE1hcDsgICAgIGNvbnN0IEFLZXlUeXBlOiBUVHlwZSA9IExvdyhUVHlwZSk7IGNvbnN0IEFWYWx1ZVR5cGU6IFRUeXBlID0gTG93KFRUeXBlKTsgY29uc3QgQUNvdW50OiBJbnRlZ2VyID0gMCk7IG92ZXJsb2FkOyAgaW5saW5lOworcHJvY2VkdXJlIEluaXQoIHZhciByZWMgOiBUVGhyaWZ0U2V0OyAgICAgY29uc3QgQUVsZW1lbnRUeXBlOiBUVHlwZSA9IExvdyhUVHlwZSk7IGNvbnN0IEFDb3VudDogSW50ZWdlciA9IDApOyBvdmVybG9hZDsgIGlubGluZTsKK3Byb2NlZHVyZSBJbml0KCB2YXIgcmVjIDogVFRocmlmdExpc3Q7ICAgIGNvbnN0IEFFbGVtZW50VHlwZTogVFR5cGUgPSBMb3coVFR5cGUpOyBjb25zdCBBQ291bnQ6IEludGVnZXIgPSAwKTsgb3ZlcmxvYWQ7ICBpbmxpbmU7CisKIAogaW1wbGVtZW50YXRpb24KIApAQCAtNTkzLDU0ICs0OTQsNyBAQAogICBTeXN0ZW0uTW92ZSggZCwgUmVzdWx0LCBTaXplT2YoUmVzdWx0KSk7CiBlbmQ7CiAKLXsgVEZpZWxkSW1wbCB9CiAKLWNvbnN0cnVjdG9yIFRGaWVsZEltcGwuQ3JlYXRlKGNvbnN0IEFOYW1lOiBzdHJpbmc7IGNvbnN0IEFUeXBlOiBUVHlwZTsKLSAgQUlkOiBTbWFsbEludCk7Ci1iZWdpbgotICBpbmhlcml0ZWQgQ3JlYXRlOwotICBGTmFtZSA6PSBBTmFtZTsKLSAgRlR5cGUgOj0gQVR5cGU7Ci0gIEZJZCA6PSBBSWQ7Ci1lbmQ7Ci0KLWNvbnN0cnVjdG9yIFRGaWVsZEltcGwuQ3JlYXRlOwotYmVnaW4KLSAgaW5oZXJpdGVkIENyZWF0ZTsKLSAgRk5hbWUgOj0gJyc7Ci0gIEZUeXBlIDo9IExvdyhUVHlwZSk7Ci0gIEZJZCAgIDo9IDA7Ci1lbmQ7Ci0KLWZ1bmN0aW9uIFRGaWVsZEltcGwuR2V0SWQ6IFNtYWxsSW50OwotYmVnaW4KLSAgUmVzdWx0IDo9IEZJZDsKLWVuZDsKLQotZnVuY3Rpb24gVEZpZWxkSW1wbC5HZXROYW1lOiBzdHJpbmc7Ci1iZWdpbgotICBSZXN1bHQgOj0gRk5hbWU7Ci1lbmQ7Ci0KLWZ1bmN0aW9uIFRGaWVsZEltcGwuR2V0VHlwZTogVFR5cGU7Ci1iZWdpbgotICBSZXN1bHQgOj0gRlR5cGU7Ci1lbmQ7Ci0KLXByb2NlZHVyZSBURmllbGRJbXBsLlNldElkKFZhbHVlOiBTbWFsbEludCk7Ci1iZWdpbgotICBGSWQgOj0gVmFsdWU7Ci1lbmQ7Ci0KLXByb2NlZHVyZSBURmllbGRJbXBsLlNldE5hbWUoY29uc3QgVmFsdWU6IHN0cmluZyk7Ci1iZWdpbgotICBGTmFtZSA6PSBWYWx1ZTsKLWVuZDsKLQotcHJvY2VkdXJlIFRGaWVsZEltcGwuU2V0VHlwZShWYWx1ZTogVFR5cGUpOwotYmVnaW4KLSAgRlR5cGUgOj0gVmFsdWU7Ci1lbmQ7CiAKIHsgVFByb3RvY29sUmVjdXJzaW9uVHJhY2tlckltcGwgfQogCkBAIC02OTUsNyArNTQ5LDcgQEAKIGJlZ2luCiAgIGlmIEZSZWN1cnNpb25EZXB0aCA8IEZSZWN1cnNpb25MaW1pdAogICB0aGVuIEluYyhGUmVjdXJzaW9uRGVwdGgpCi0gIGVsc2UgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uLkNyZWF0ZSggVFByb3RvY29sRXhjZXB0aW9uLkRFUFRIX0xJTUlULCAnRGVwdGggbGltaXQgZXhjZWVkZWQnKTsKKyAgZWxzZSByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25EZXB0aExpbWl0LkNyZWF0ZSgnRGVwdGggbGltaXQgZXhjZWVkZWQnKTsKIGVuZDsKIAogcHJvY2VkdXJlIFRQcm90b2NvbEltcGwuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGg7CkBAIC03NTMsMTAgKzYwNywxMCBAQAogeyBUUHJvdG9jb2xVdGlsIH0KIAogY2xhc3MgcHJvY2VkdXJlIFRQcm90b2NvbFV0aWwuU2tpcCggcHJvdDogSVByb3RvY29sOyB0eXBlXzogVFR5cGUpOwotdmFyIGZpZWxkIDogSUZpZWxkOwotICAgIG1hcCAgIDogSU1hcDsKLSAgICBzZXRfICA6IElTZXQ7Ci0gICAgbGlzdCAgOiBJTGlzdDsKK3ZhciBmaWVsZCA6IFRUaHJpZnRGaWVsZDsKKyAgICBtYXAgICA6IFRUaHJpZnRNYXA7CisgICAgc2V0XyAgOiBUVGhyaWZ0U2V0OworICAgIGxpc3QgIDogVFRocmlmdExpc3Q7CiAgICAgaSAgICAgOiBJbnRlZ2VyOwogICAgIHRyYWNrZXIgOiBJUHJvdG9jb2xSZWN1cnNpb25UcmFja2VyOwogYmVnaW4KQEAgLTgwNywxODYgKzY2MSwxMCBAQAogICAgIGVuZDsKIAogICBlbHNlCi0gICAgQVNTRVJUKCBGQUxTRSk7IC8vIGFueSBuZXcgdHlwZXM/CisgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uSW52YWxpZERhdGEuQ3JlYXRlKCdVbmV4cGVjdGVkIHR5cGUgJytJbnRUb1N0cihPcmQodHlwZV8pKSk7CiAgIGVuZDsKIGVuZDsKIAoteyBUU3RydWN0SW1wbCB9Ci0KLWNvbnN0cnVjdG9yIFRTdHJ1Y3RJbXBsLkNyZWF0ZShjb25zdCBBTmFtZTogc3RyaW5nKTsKLWJlZ2luCi0gIGluaGVyaXRlZCBDcmVhdGU7Ci0gIEZOYW1lIDo9IEFOYW1lOwotZW5kOwotCi1mdW5jdGlvbiBUU3RydWN0SW1wbC5HZXROYW1lOiBzdHJpbmc7Ci1iZWdpbgotICBSZXN1bHQgOj0gRk5hbWU7Ci1lbmQ7Ci0KLXByb2NlZHVyZSBUU3RydWN0SW1wbC5TZXROYW1lKGNvbnN0IFZhbHVlOiBzdHJpbmcpOwotYmVnaW4KLSAgRk5hbWUgOj0gVmFsdWU7Ci1lbmQ7Ci0KLXsgVE1hcEltcGwgfQotCi1jb25zdHJ1Y3RvciBUTWFwSW1wbC5DcmVhdGUoIEFLZXlUeXBlLCBBVmFsdWVUeXBlOiBUVHlwZTsgQUNvdW50OiBJbnRlZ2VyKTsKLWJlZ2luCi0gIGluaGVyaXRlZCBDcmVhdGU7Ci0gIEZWYWx1ZVR5cGUgOj0gQVZhbHVlVHlwZTsKLSAgRktleVR5cGUgOj0gQUtleVR5cGU7Ci0gIEZDb3VudCA6PSBBQ291bnQ7Ci1lbmQ7Ci0KLWNvbnN0cnVjdG9yIFRNYXBJbXBsLkNyZWF0ZTsKLWJlZ2luCi0gIGluaGVyaXRlZCBDcmVhdGU7Ci1lbmQ7Ci0KLWZ1bmN0aW9uIFRNYXBJbXBsLkdldENvdW50OiBJbnRlZ2VyOwotYmVnaW4KLSAgUmVzdWx0IDo9IEZDb3VudDsKLWVuZDsKLQotZnVuY3Rpb24gVE1hcEltcGwuR2V0S2V5VHlwZTogVFR5cGU7Ci1iZWdpbgotICBSZXN1bHQgOj0gRktleVR5cGU7Ci1lbmQ7Ci0KLWZ1bmN0aW9uIFRNYXBJbXBsLkdldFZhbHVlVHlwZTogVFR5cGU7Ci1iZWdpbgotICBSZXN1bHQgOj0gRlZhbHVlVHlwZTsKLWVuZDsKLQotcHJvY2VkdXJlIFRNYXBJbXBsLlNldENvdW50KFZhbHVlOiBJbnRlZ2VyKTsKLWJlZ2luCi0gIEZDb3VudCA6PSBWYWx1ZTsKLWVuZDsKLQotcHJvY2VkdXJlIFRNYXBJbXBsLlNldEtleVR5cGUoVmFsdWU6IFRUeXBlKTsKLWJlZ2luCi0gIEZLZXlUeXBlIDo9IFZhbHVlOwotZW5kOwotCi1wcm9jZWR1cmUgVE1hcEltcGwuU2V0VmFsdWVUeXBlKFZhbHVlOiBUVHlwZSk7Ci1iZWdpbgotICBGVmFsdWVUeXBlIDo9IFZhbHVlOwotZW5kOwotCi17IElNZXNzYWdlIH0KLQotY29uc3RydWN0b3IgVE1lc3NhZ2VJbXBsLkNyZWF0ZShBTmFtZTogc3RyaW5nOyBBTWVzc2FnZVR5cGU6IFRNZXNzYWdlVHlwZTsKLSAgQVNlcUlEOiBJbnRlZ2VyKTsKLWJlZ2luCi0gIGluaGVyaXRlZCBDcmVhdGU7Ci0gIEZOYW1lIDo9IEFOYW1lOwotICBGTWVzc2FnZVR5cGUgOj0gQU1lc3NhZ2VUeXBlOwotICBGU2VxSUQgOj0gQVNlcUlEOwotZW5kOwotCi1jb25zdHJ1Y3RvciBUTWVzc2FnZUltcGwuQ3JlYXRlOwotYmVnaW4KLSAgaW5oZXJpdGVkOwotZW5kOwotCi1mdW5jdGlvbiBUTWVzc2FnZUltcGwuR2V0TmFtZTogc3RyaW5nOwotYmVnaW4KLSAgUmVzdWx0IDo9IEZOYW1lOwotZW5kOwotCi1mdW5jdGlvbiBUTWVzc2FnZUltcGwuR2V0U2VxSUQ6IEludGVnZXI7Ci1iZWdpbgotICBSZXN1bHQgOj0gRlNlcUlEOwotZW5kOwotCi1mdW5jdGlvbiBUTWVzc2FnZUltcGwuR2V0VHlwZTogVE1lc3NhZ2VUeXBlOwotYmVnaW4KLSAgUmVzdWx0IDo9IEZNZXNzYWdlVHlwZTsKLWVuZDsKLQotcHJvY2VkdXJlIFRNZXNzYWdlSW1wbC5TZXROYW1lKGNvbnN0IFZhbHVlOiBzdHJpbmcpOwotYmVnaW4KLSAgRk5hbWUgOj0gVmFsdWU7Ci1lbmQ7Ci0KLXByb2NlZHVyZSBUTWVzc2FnZUltcGwuU2V0U2VxSUQoVmFsdWU6IEludGVnZXIpOwotYmVnaW4KLSAgRlNlcUlEIDo9IFZhbHVlOwotZW5kOwotCi1wcm9jZWR1cmUgVE1lc3NhZ2VJbXBsLlNldFR5cGUoVmFsdWU6IFRNZXNzYWdlVHlwZSk7Ci1iZWdpbgotICBGTWVzc2FnZVR5cGUgOj0gVmFsdWU7Ci1lbmQ7Ci0KLXsgSVNldCB9Ci0KLWNvbnN0cnVjdG9yIFRTZXRJbXBsLkNyZWF0ZSggQUVsZW1lbnRUeXBlOiBUVHlwZTsgQUNvdW50OiBJbnRlZ2VyKTsKLWJlZ2luCi0gIGluaGVyaXRlZCBDcmVhdGU7Ci0gIEZDb3VudCA6PSBBQ291bnQ7Ci0gIEZFbGVtZW50VHlwZSA6PSBBRWxlbWVudFR5cGU7Ci1lbmQ7Ci0KLWNvbnN0cnVjdG9yIFRTZXRJbXBsLkNyZWF0ZTsKLWJlZ2luCi0gIGluaGVyaXRlZCBDcmVhdGU7Ci1lbmQ7Ci0KLWZ1bmN0aW9uIFRTZXRJbXBsLkdldENvdW50OiBJbnRlZ2VyOwotYmVnaW4KLSAgUmVzdWx0IDo9IEZDb3VudDsKLWVuZDsKLQotZnVuY3Rpb24gVFNldEltcGwuR2V0RWxlbWVudFR5cGU6IFRUeXBlOwotYmVnaW4KLSAgUmVzdWx0IDo9IEZFbGVtZW50VHlwZTsKLWVuZDsKLQotcHJvY2VkdXJlIFRTZXRJbXBsLlNldENvdW50KFZhbHVlOiBJbnRlZ2VyKTsKLWJlZ2luCi0gIEZDb3VudCA6PSBWYWx1ZTsKLWVuZDsKLQotcHJvY2VkdXJlIFRTZXRJbXBsLlNldEVsZW1lbnRUeXBlKFZhbHVlOiBUVHlwZSk7Ci1iZWdpbgotICBGRWxlbWVudFR5cGUgOj0gVmFsdWU7Ci1lbmQ7Ci0KLXsgSUxpc3QgfQotCi1jb25zdHJ1Y3RvciBUTGlzdEltcGwuQ3JlYXRlKCBBRWxlbWVudFR5cGU6IFRUeXBlOyBBQ291bnQ6IEludGVnZXIpOwotYmVnaW4KLSAgaW5oZXJpdGVkIENyZWF0ZTsKLSAgRkNvdW50IDo9IEFDb3VudDsKLSAgRkVsZW1lbnRUeXBlIDo9IEFFbGVtZW50VHlwZTsKLWVuZDsKLQotY29uc3RydWN0b3IgVExpc3RJbXBsLkNyZWF0ZTsKLWJlZ2luCi0gIGluaGVyaXRlZCBDcmVhdGU7Ci1lbmQ7Ci0KLWZ1bmN0aW9uIFRMaXN0SW1wbC5HZXRDb3VudDogSW50ZWdlcjsKLWJlZ2luCi0gIFJlc3VsdCA6PSBGQ291bnQ7Ci1lbmQ7Ci0KLWZ1bmN0aW9uIFRMaXN0SW1wbC5HZXRFbGVtZW50VHlwZTogVFR5cGU7Ci1iZWdpbgotICBSZXN1bHQgOj0gRkVsZW1lbnRUeXBlOwotZW5kOwotCi1wcm9jZWR1cmUgVExpc3RJbXBsLlNldENvdW50KFZhbHVlOiBJbnRlZ2VyKTsKLWJlZ2luCi0gIEZDb3VudCA6PSBWYWx1ZTsKLWVuZDsKLQotcHJvY2VkdXJlIFRMaXN0SW1wbC5TZXRFbGVtZW50VHlwZShWYWx1ZTogVFR5cGUpOwotYmVnaW4KLSAgRkVsZW1lbnRUeXBlIDo9IFZhbHVlOwotZW5kOwogCiB7IFRCaW5hcnlQcm90b2NvbEltcGwgfQogCkBAIC0xMDA0LDEwICs2ODIsOSBAQAogICBGU3RyaWN0V3JpdGUgOj0gc3RyaWN0V3JpdGU7CiBlbmQ7CiAKLWZ1bmN0aW9uIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZEFsbCggdmFyIGJ1ZjogVEJ5dGVzOyBvZmYsCi0gIGxlbjogSW50ZWdlcik6IEludGVnZXI7CitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRBbGwoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlciApOiBJbnRlZ2VyOwogYmVnaW4KLSAgUmVzdWx0IDo9IEZUcmFucy5SZWFkQWxsKCBidWYsIG9mZiwgbGVuICk7CisgIFJlc3VsdCA6PSBGVHJhbnMuUmVhZEFsbCggcEJ1ZiwgYnVmbGVuLCBvZmYsIGxlbiApOwogZW5kOwogCiBmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRCaW5hcnk6IFRCeXRlczsKQEAgLTEwMjMsMTYgKzcwMCwxMiBAQAogCiBmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRCb29sOiBCb29sZWFuOwogYmVnaW4KLSAgUmVzdWx0IDo9IFJlYWRCeXRlID0gMTsKKyAgUmVzdWx0IDo9IChSZWFkQnl0ZSA9IDEpOwogZW5kOwogCiBmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRCeXRlOiBTaG9ydEludDsKLXZhcgotICBiaW4gOiBUQnl0ZXM7CiBiZWdpbgotICBTZXRMZW5ndGgoIGJpbiwgMSk7Ci0gIFJlYWRBbGwoIGJpbiwgMCwgMSApOwotICBSZXN1bHQgOj0gU2hvcnRJbnQoIGJpblswXSk7CisgIFJlYWRBbGwoIEByZXN1bHQsIFNpemVPZihyZXN1bHQpLCAwLCAxKTsKIGVuZDsKIAogZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkRG91YmxlOiBEb3VibGU7CkBAIC0xMDQwLDE3ICs3MTMsMTIgQEAKICAgUmVzdWx0IDo9IENvbnZlcnRJbnQ2NFRvRG91YmxlKCBSZWFkSTY0ICkKIGVuZDsKIAotZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkRmllbGRCZWdpbjogSUZpZWxkOwotdmFyCi0gIGZpZWxkIDogSUZpZWxkOworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkRmllbGRCZWdpbjogVFRocmlmdEZpZWxkOwogYmVnaW4KLSAgZmllbGQgOj0gVEZpZWxkSW1wbC5DcmVhdGU7Ci0gIGZpZWxkLlR5cGVfIDo9IFRUeXBlKCBSZWFkQnl0ZSk7Ci0gIGlmICggZmllbGQuVHlwZV8gPD4gVFR5cGUuU3RvcCApIHRoZW4KLSAgYmVnaW4KLSAgICBmaWVsZC5JZCA6PSBSZWFkSTE2OworICBJbml0KCByZXN1bHQsICcnLCBUVHlwZSggUmVhZEJ5dGUpLCAwKTsKKyAgaWYgKCByZXN1bHQuVHlwZV8gPD4gVFR5cGUuU3RvcCApIHRoZW4gYmVnaW4KKyAgICByZXN1bHQuSWQgOj0gUmVhZEkxNjsKICAgZW5kOwotICBSZXN1bHQgOj0gZmllbGQ7CiBlbmQ7CiAKIHByb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRGaWVsZEVuZDsKQEAgLTEwNTksMjAgKzcyNywxNiBAQAogZW5kOwogCiBmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRJMTY6IFNtYWxsSW50OwotdmFyCi0gIGkxNmluIDogVEJ5dGVzOwordmFyIGkxNmluIDogcGFja2VkIGFycmF5WzAuLjFdIG9mIEJ5dGU7CiBiZWdpbgotICBTZXRMZW5ndGgoIGkxNmluLCAyICk7Ci0gIFJlYWRBbGwoIGkxNmluLCAwLCAyKTsKKyAgUmVhZEFsbCggQGkxNmluLCBTaXplb2YoaTE2aW4pLCAwLCAyKTsKICAgUmVzdWx0IDo9IFNtYWxsSW50KCgoaTE2aW5bMF0gYW5kICRGRikgc2hsIDgpIG9yIChpMTZpblsxXSBhbmQgJEZGKSk7CiBlbmQ7CiAKIGZ1bmN0aW9uIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZEkzMjogSW50ZWdlcjsKLXZhcgotICBpMzJpbiA6IFRCeXRlczsKK3ZhciBpMzJpbiA6IHBhY2tlZCBhcnJheVswLi4zXSBvZiBCeXRlOwogYmVnaW4KLSAgU2V0TGVuZ3RoKCBpMzJpbiwgNCApOwotICBSZWFkQWxsKCBpMzJpbiwgMCwgNCk7CisgIFJlYWRBbGwoIEBpMzJpbiwgU2l6ZU9mKGkzMmluKSwgMCwgNCk7CiAKICAgUmVzdWx0IDo9IEludGVnZXIoCiAgICAgKChpMzJpblswXSBhbmQgJEZGKSBzaGwgMjQpIG9yCkBAIC0xMDgzLDExICs3NDcsOSBAQAogZW5kOwogCiBmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRJNjQ6IEludDY0OwotdmFyCi0gIGk2NGluIDogVEJ5dGVzOwordmFyIGk2NGluIDogcGFja2VkIGFycmF5WzAuLjddIG9mIEJ5dGU7CiBiZWdpbgotICBTZXRMZW5ndGgoIGk2NGluLCA4KTsKLSAgUmVhZEFsbCggaTY0aW4sIDAsIDgpOworICBSZWFkQWxsKCBAaTY0aW4sIFNpemVPZihpNjRpbiksIDAsIDgpOwogICBSZXN1bHQgOj0KICAgICAoSW50NjQoIGk2NGluWzBdIGFuZCAkRkYpIHNobCA1Nikgb3IKICAgICAoSW50NjQoIGk2NGluWzFdIGFuZCAkRkYpIHNobCA0OCkgb3IKQEAgLTEwOTksMTQgKzc2MSwxMCBAQAogICAgIChJbnQ2NCggaTY0aW5bN10gYW5kICRGRikpOwogZW5kOwogCi1mdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRMaXN0QmVnaW46IElMaXN0OwotdmFyCi0gIGxpc3QgOiBJTGlzdDsKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZExpc3RCZWdpbjogVFRocmlmdExpc3Q7CiBiZWdpbgotICBsaXN0IDo9IFRMaXN0SW1wbC5DcmVhdGU7Ci0gIGxpc3QuRWxlbWVudFR5cGUgOj0gVFR5cGUoIFJlYWRCeXRlICk7Ci0gIGxpc3QuQ291bnQgOj0gUmVhZEkzMjsKLSAgUmVzdWx0IDo9IGxpc3Q7CisgIHJlc3VsdC5FbGVtZW50VHlwZSA6PSBUVHlwZShSZWFkQnl0ZSk7CisgIHJlc3VsdC5Db3VudCAgICAgICA6PSBSZWFkSTMyOwogZW5kOwogCiBwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkTGlzdEVuZDsKQEAgLTExMTQsMTUgKzc3MiwxMSBAQAogCiBlbmQ7CiAKLWZ1bmN0aW9uIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZE1hcEJlZ2luOiBJTWFwOwotdmFyCi0gIG1hcCA6IElNYXA7CitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRNYXBCZWdpbjogVFRocmlmdE1hcDsKIGJlZ2luCi0gIG1hcCA6PSBUTWFwSW1wbC5DcmVhdGU7Ci0gIG1hcC5LZXlUeXBlIDo9IFRUeXBlKCBSZWFkQnl0ZSApOwotICBtYXAuVmFsdWVUeXBlIDo9IFRUeXBlKCBSZWFkQnl0ZSApOwotICBtYXAuQ291bnQgOj0gUmVhZEkzMjsKLSAgUmVzdWx0IDo9IG1hcDsKKyAgcmVzdWx0LktleVR5cGUgICA6PSBUVHlwZShSZWFkQnl0ZSk7CisgIHJlc3VsdC5WYWx1ZVR5cGUgOj0gVFR5cGUoUmVhZEJ5dGUpOworICByZXN1bHQuQ291bnQgICAgIDo9IFJlYWRJMzI7CiBlbmQ7CiAKIHByb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRNYXBFbmQ7CkBAIC0xMTMwLDM1ICs3ODQsMzAgQEAKIAogZW5kOwogCi1mdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRNZXNzYWdlQmVnaW46IElNZXNzYWdlOworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkTWVzc2FnZUJlZ2luOiBUVGhyaWZ0TWVzc2FnZTsKIHZhcgogICBzaXplIDogSW50ZWdlcjsKICAgdmVyc2lvbiA6IEludGVnZXI7Ci0gIG1lc3NhZ2UgOiBJTWVzc2FnZTsKIGJlZ2luCi0gIG1lc3NhZ2UgOj0gVE1lc3NhZ2VJbXBsLkNyZWF0ZTsKKyAgSW5pdCggcmVzdWx0KTsKICAgc2l6ZSA6PSBSZWFkSTMyOwotICBpZiAoc2l6ZSA8IDApIHRoZW4KLSAgYmVnaW4KKyAgaWYgKHNpemUgPCAwKSB0aGVuIGJlZ2luCiAgICAgdmVyc2lvbiA6PSBzaXplIGFuZCBJbnRlZ2VyKCBWRVJTSU9OX01BU0spOwotICAgIGlmICggdmVyc2lvbiA8PiBJbnRlZ2VyKCBWRVJTSU9OXzEpKSB0aGVuCi0gICAgYmVnaW4KLSAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbi5DcmVhdGUoVFByb3RvY29sRXhjZXB0aW9uLkJBRF9WRVJTSU9OLCAnQmFkIHZlcnNpb24gaW4gUmVhZE1lc3NhZ2VCZWdpbjogJyArIEludFRvU3RyKHZlcnNpb24pICk7CisgICAgaWYgKCB2ZXJzaW9uIDw+IEludGVnZXIoIFZFUlNJT05fMSkpIHRoZW4gYmVnaW4KKyAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbkJhZFZlcnNpb24uQ3JlYXRlKCdCYWQgdmVyc2lvbiBpbiBSZWFkTWVzc2FnZUJlZ2luOiAnICsgSW50VG9TdHIodmVyc2lvbikgKTsKICAgICBlbmQ7Ci0gICAgbWVzc2FnZS5UeXBlXyA6PSBUTWVzc2FnZVR5cGUoIHNpemUgYW5kICQwMDAwMDBmZik7Ci0gICAgbWVzc2FnZS5OYW1lIDo9IFJlYWRTdHJpbmc7Ci0gICAgbWVzc2FnZS5TZXFJRCA6PSBSZWFkSTMyOwotICBlbmQgZWxzZQotICBiZWdpbgotICAgIGlmIEZTdHJpY3RSZWFkIHRoZW4KLSAgICBiZWdpbgotICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uLkNyZWF0ZSggVFByb3RvY29sRXhjZXB0aW9uLkJBRF9WRVJTSU9OLCAnTWlzc2luZyB2ZXJzaW9uIGluIHJlYWRNZXNzYWdlQmVnaW4sIG9sZCBjbGllbnQ/JyApOworICAgIHJlc3VsdC5UeXBlXyA6PSBUTWVzc2FnZVR5cGUoIHNpemUgYW5kICQwMDAwMDBmZik7CisgICAgcmVzdWx0Lk5hbWUgOj0gUmVhZFN0cmluZzsKKyAgICByZXN1bHQuU2VxSUQgOj0gUmVhZEkzMjsKKyAgZW5kCisgIGVsc2UgYmVnaW4KKyAgICBpZiBGU3RyaWN0UmVhZCB0aGVuIGJlZ2luCisgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25CYWRWZXJzaW9uLkNyZWF0ZSgnTWlzc2luZyB2ZXJzaW9uIGluIHJlYWRNZXNzYWdlQmVnaW4sIG9sZCBjbGllbnQ/JyApOwogICAgIGVuZDsKLSAgICBtZXNzYWdlLk5hbWUgOj0gUmVhZFN0cmluZ0JvZHkoIHNpemUgKTsKLSAgICBtZXNzYWdlLlR5cGVfIDo9IFRNZXNzYWdlVHlwZSggUmVhZEJ5dGUgKTsKLSAgICBtZXNzYWdlLlNlcUlEIDo9IFJlYWRJMzI7CisgICAgcmVzdWx0Lk5hbWUgOj0gUmVhZFN0cmluZ0JvZHkoIHNpemUgKTsKKyAgICByZXN1bHQuVHlwZV8gOj0gVE1lc3NhZ2VUeXBlKCBSZWFkQnl0ZSApOworICAgIHJlc3VsdC5TZXFJRCA6PSBSZWFkSTMyOwogICBlbmQ7Ci0gIFJlc3VsdCA6PSBtZXNzYWdlOwogZW5kOwogCiBwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkTWVzc2FnZUVuZDsKQEAgLTExNjcsMTQgKzgxNiwxMCBAQAogCiBlbmQ7CiAKLWZ1bmN0aW9uIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZFNldEJlZ2luOiBJU2V0OwotdmFyCi0gIHNldF8gOiBJU2V0OworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkU2V0QmVnaW46IFRUaHJpZnRTZXQ7CiBiZWdpbgotICBzZXRfIDo9IFRTZXRJbXBsLkNyZWF0ZTsKLSAgc2V0Xy5FbGVtZW50VHlwZSA6PSBUVHlwZSggUmVhZEJ5dGUgKTsKLSAgc2V0Xy5Db3VudCA6PSBSZWFkSTMyOwotICBSZXN1bHQgOj0gc2V0XzsKKyAgcmVzdWx0LkVsZW1lbnRUeXBlIDo9IFRUeXBlKFJlYWRCeXRlKTsKKyAgcmVzdWx0LkNvdW50ICAgICAgIDo9IFJlYWRJMzI7CiBlbmQ7CiAKIHByb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRTZXRFbmQ7CkBAIC0xMTkxLDkgKzgzNiw5IEBACiAgIFJlc3VsdCA6PSBURW5jb2RpbmcuVVRGOC5HZXRTdHJpbmcoIGJ1Zik7CiBlbmQ7CiAKLWZ1bmN0aW9uIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZFN0cnVjdEJlZ2luOiBJU3RydWN0OworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkU3RydWN0QmVnaW46IFRUaHJpZnRTdHJ1Y3Q7CiBiZWdpbgotICBSZXN1bHQgOj0gVFN0cnVjdEltcGwuQ3JlYXRlKCcnKTsKKyAgSW5pdCggUmVzdWx0KTsKIGVuZDsKIAogcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZFN0cnVjdEVuZDsKQEAgLTEyMTIsMjIgKzg1NywxNiBAQAogCiBwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZUJvb2woYjogQm9vbGVhbik7CiBiZWdpbgotICBpZiBiIHRoZW4KLSAgYmVnaW4KKyAgaWYgYiB0aGVuIGJlZ2luCiAgICAgV3JpdGVCeXRlKCAxICk7Ci0gIGVuZCBlbHNlCi0gIGJlZ2luCisgIGVuZCBlbHNlIGJlZ2luCiAgICAgV3JpdGVCeXRlKCAwICk7CiAgIGVuZDsKIGVuZDsKIAogcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVCeXRlKGI6IFNob3J0SW50KTsKLXZhcgotICBhIDogVEJ5dGVzOwogYmVnaW4KLSAgU2V0TGVuZ3RoKCBhLCAxKTsKLSAgYVswXSA6PSBCeXRlKCBiICk7Ci0gIEZUcmFucy5Xcml0ZSggYSwgMCwgMSApOworICBGVHJhbnMuV3JpdGUoIEBiLCAwLCAxKTsKIGVuZDsKIAogcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVEb3VibGUoIGNvbnN0IGQ6IERvdWJsZSk7CkBAIC0xMjM1LDcgKzg3NCw3IEBACiAgIFdyaXRlSTY0KENvbnZlcnREb3VibGVUb0ludDY0KGQpKTsKIGVuZDsKIAotcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVGaWVsZEJlZ2luKCBjb25zdCBmaWVsZDogSUZpZWxkKTsKK3Byb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlRmllbGRCZWdpbiggY29uc3QgZmllbGQ6IFRUaHJpZnRGaWVsZCk7CiBiZWdpbgogICBXcml0ZUJ5dGUoU2hvcnRJbnQoZmllbGQuVHlwZV8pKTsKICAgV3JpdGVJMTYoZmllbGQuSUQpOwpAQCAtMTI1MiwzMiArODkxLDI2IEBACiBlbmQ7CiAKIHByb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlSTE2KGkxNjogU21hbGxJbnQpOwotdmFyCi0gIGkxNm91dCA6IFRCeXRlczsKK3ZhciBpMTZvdXQgOiBwYWNrZWQgYXJyYXlbMC4uMV0gb2YgQnl0ZTsKIGJlZ2luCi0gIFNldExlbmd0aCggaTE2b3V0LCAyKTsKICAgaTE2b3V0WzBdIDo9IEJ5dGUoJEZGIGFuZCAoaTE2IHNociA4KSk7CiAgIGkxNm91dFsxXSA6PSBCeXRlKCRGRiBhbmQgaTE2KTsKLSAgRlRyYW5zLldyaXRlKCBpMTZvdXQgKTsKKyAgRlRyYW5zLldyaXRlKCBAaTE2b3V0LCAwLCAyKTsKIGVuZDsKIAogcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVJMzIoaTMyOiBJbnRlZ2VyKTsKLXZhcgotICBpMzJvdXQgOiBUQnl0ZXM7Cit2YXIgaTMyb3V0IDogcGFja2VkIGFycmF5WzAuLjNdIG9mIEJ5dGU7CiBiZWdpbgotICBTZXRMZW5ndGgoIGkzMm91dCwgNCk7CiAgIGkzMm91dFswXSA6PSBCeXRlKCRGRiBhbmQgKGkzMiBzaHIgMjQpKTsKICAgaTMyb3V0WzFdIDo9IEJ5dGUoJEZGIGFuZCAoaTMyIHNociAxNikpOwogICBpMzJvdXRbMl0gOj0gQnl0ZSgkRkYgYW5kIChpMzIgc2hyIDgpKTsKICAgaTMyb3V0WzNdIDo9IEJ5dGUoJEZGIGFuZCBpMzIpOwotICBGVHJhbnMuV3JpdGUoIGkzMm91dCwgMCwgNCk7CisgIEZUcmFucy5Xcml0ZSggQGkzMm91dCwgMCwgNCk7CiBlbmQ7CiAKIHByb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlSTY0KCBjb25zdCBpNjQ6IEludDY0KTsKLXZhcgotICBpNjRvdXQgOiBUQnl0ZXM7Cit2YXIgaTY0b3V0IDogcGFja2VkIGFycmF5WzAuLjddIG9mIEJ5dGU7CiBiZWdpbgotICBTZXRMZW5ndGgoIGk2NG91dCwgOCk7CiAgIGk2NG91dFswXSA6PSBCeXRlKCRGRiBhbmQgKGk2NCBzaHIgNTYpKTsKICAgaTY0b3V0WzFdIDo9IEJ5dGUoJEZGIGFuZCAoaTY0IHNociA0OCkpOwogICBpNjRvdXRbMl0gOj0gQnl0ZSgkRkYgYW5kIChpNjQgc2hyIDQwKSk7CkBAIC0xMjg2LDEwICs5MTksMTAgQEAKICAgaTY0b3V0WzVdIDo9IEJ5dGUoJEZGIGFuZCAoaTY0IHNociAxNikpOwogICBpNjRvdXRbNl0gOj0gQnl0ZSgkRkYgYW5kIChpNjQgc2hyIDgpKTsKICAgaTY0b3V0WzddIDo9IEJ5dGUoJEZGIGFuZCBpNjQpOwotICBGVHJhbnMuV3JpdGUoIGk2NG91dCwgMCwgOCk7CisgIEZUcmFucy5Xcml0ZSggQGk2NG91dCwgMCwgOCk7CiBlbmQ7CiAKLXByb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlTGlzdEJlZ2luKCBjb25zdCBsaXN0OiBJTGlzdCk7Citwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZUxpc3RCZWdpbiggY29uc3QgbGlzdDogVFRocmlmdExpc3QpOwogYmVnaW4KICAgV3JpdGVCeXRlKFNob3J0SW50KGxpc3QuRWxlbWVudFR5cGUpKTsKICAgV3JpdGVJMzIobGlzdC5Db3VudCk7CkBAIC0xMzAwLDcgKzkzMyw3IEBACiAKIGVuZDsKIAotcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVNYXBCZWdpbiggY29uc3QgbWFwOiBJTWFwKTsKK3Byb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlTWFwQmVnaW4oIGNvbnN0IG1hcDogVFRocmlmdE1hcCk7CiBiZWdpbgogICBXcml0ZUJ5dGUoU2hvcnRJbnQobWFwLktleVR5cGUpKTsKICAgV3JpdGVCeXRlKFNob3J0SW50KG1hcC5WYWx1ZVR5cGUpKTsKQEAgLTEzMTIsNyArOTQ1LDcgQEAKIAogZW5kOwogCi1wcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZU1lc3NhZ2VCZWdpbiggY29uc3QgbXNnOiBJTWVzc2FnZSk7Citwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZU1lc3NhZ2VCZWdpbiggY29uc3QgbXNnOiBUVGhyaWZ0TWVzc2FnZSk7CiB2YXIKICAgdmVyc2lvbiA6IENhcmRpbmFsOwogYmVnaW4KQEAgLTEzMzUsNyArOTY4LDcgQEAKIAogZW5kOwogCi1wcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZVNldEJlZ2luKCBjb25zdCBzZXRfOiBJU2V0KTsKK3Byb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlU2V0QmVnaW4oIGNvbnN0IHNldF86IFRUaHJpZnRTZXQpOwogYmVnaW4KICAgV3JpdGVCeXRlKFNob3J0SW50KHNldF8uRWxlbWVudFR5cGUpKTsKICAgV3JpdGVJMzIoc2V0Xy5Db3VudCk7CkBAIC0xMzQ2LDcgKzk3OSw3IEBACiAKIGVuZDsKIAotcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVTdHJ1Y3RCZWdpbiggY29uc3Qgc3RydWM6IElTdHJ1Y3QpOworcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVTdHJ1Y3RCZWdpbiggY29uc3Qgc3RydWM6IFRUaHJpZnRTdHJ1Y3QpOwogYmVnaW4KIAogZW5kOwpAQCAtMTM1OCwyMiArOTkxLDQ3IEBACiAKIHsgVFByb3RvY29sRXhjZXB0aW9uIH0KIAotY29uc3RydWN0b3IgVFByb3RvY29sRXhjZXB0aW9uLkNyZWF0ZTsKK2NvbnN0cnVjdG9yIFRQcm90b2NvbEV4Y2VwdGlvbi5IaWRkZW5DcmVhdGUoY29uc3QgTXNnOiBzdHJpbmcpOwogYmVnaW4KLSAgaW5oZXJpdGVkIENyZWF0ZSgnJyk7Ci0gIEZUeXBlIDo9IFVOS05PV047CisgIGluaGVyaXRlZCBDcmVhdGUoTXNnKTsKIGVuZDsKIAotY29uc3RydWN0b3IgVFByb3RvY29sRXhjZXB0aW9uLkNyZWF0ZSh0eXBlXzogSW50ZWdlcik7CitjbGFzcyBmdW5jdGlvbiBUUHJvdG9jb2xFeGNlcHRpb24uQ3JlYXRlKGNvbnN0IE1zZzogc3RyaW5nKTogVFByb3RvY29sRXhjZXB0aW9uOwogYmVnaW4KLSAgaW5oZXJpdGVkIENyZWF0ZSgnJyk7Ci0gIEZUeXBlIDo9IHR5cGVfOworICBSZXN1bHQgOj0gVFByb3RvY29sRXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoTXNnKTsKIGVuZDsKIAotY29uc3RydWN0b3IgVFByb3RvY29sRXhjZXB0aW9uLkNyZWF0ZSh0eXBlXzogSW50ZWdlcjsgY29uc3QgbXNnOiBzdHJpbmcpOworY2xhc3MgZnVuY3Rpb24gVFByb3RvY29sRXhjZXB0aW9uLkNyZWF0ZTogVFByb3RvY29sRXhjZXB0aW9uOwogYmVnaW4KLSAgaW5oZXJpdGVkIENyZWF0ZSggbXNnICk7Ci0gIEZUeXBlIDo9IHR5cGVfOworICBSZXN1bHQgOj0gVFByb3RvY29sRXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoJycpOworZW5kOworCitjbGFzcyBmdW5jdGlvbiBUUHJvdG9jb2xFeGNlcHRpb24uQ3JlYXRlKHR5cGVfOiBJbnRlZ2VyKTogVFByb3RvY29sRXhjZXB0aW9uOworYmVnaW4KK3skV0FSTiBTWU1CT0xfREVQUkVDQVRFRCBPRkZ9CisgIFJlc3VsdCA6PSBDcmVhdGUodHlwZV8sICcnKTsKK3skV0FSTiBTWU1CT0xfREVQUkVDQVRFRCBERUZBVUxUfQorZW5kOworCitjbGFzcyBmdW5jdGlvbiBUUHJvdG9jb2xFeGNlcHRpb24uQ3JlYXRlKHR5cGVfOiBJbnRlZ2VyOyBjb25zdCBtc2c6IHN0cmluZyk6IFRQcm90b2NvbEV4Y2VwdGlvbjsKK2JlZ2luCisgIGNhc2UgdHlwZV8gb2YKKyAgICBJTlZBTElEX0RBVEE6ICAgIFJlc3VsdCA6PSBUUHJvdG9jb2xFeGNlcHRpb25JbnZhbGlkRGF0YS5DcmVhdGUobXNnKTsKKyAgICBORUdBVElWRV9TSVpFOiAgIFJlc3VsdCA6PSBUUHJvdG9jb2xFeGNlcHRpb25OZWdhdGl2ZVNpemUuQ3JlYXRlKG1zZyk7CisgICAgU0laRV9MSU1JVDogICAgICBSZXN1bHQgOj0gVFByb3RvY29sRXhjZXB0aW9uU2l6ZUxpbWl0LkNyZWF0ZShtc2cpOworICAgIEJBRF9WRVJTSU9OOiAgICAgUmVzdWx0IDo9IFRQcm90b2NvbEV4Y2VwdGlvbkJhZFZlcnNpb24uQ3JlYXRlKG1zZyk7CisgICAgTk9UX0lNUExFTUVOVEVEOiBSZXN1bHQgOj0gVFByb3RvY29sRXhjZXB0aW9uTm90SW1wbGVtZW50ZWQuQ3JlYXRlKG1zZyk7CisgICAgREVQVEhfTElNSVQ6ICAgICBSZXN1bHQgOj0gVFByb3RvY29sRXhjZXB0aW9uRGVwdGhMaW1pdC5DcmVhdGUobXNnKTsKKyAgZWxzZQorICAgIFJlc3VsdCA6PSBUUHJvdG9jb2xFeGNlcHRpb25Vbmtub3duLkNyZWF0ZShtc2cpOworICBlbmQ7CitlbmQ7CisKK3sgVFByb3RvY29sRXhjZXB0aW9uU3BlY2lhbGl6ZWQgfQorCitjb25zdHJ1Y3RvciBUUHJvdG9jb2xFeGNlcHRpb25TcGVjaWFsaXplZC5DcmVhdGUoY29uc3QgTXNnOiBzdHJpbmcpOworYmVnaW4KKyAgaW5oZXJpdGVkIEhpZGRlbkNyZWF0ZShNc2cpOwogZW5kOwogCiB7IFRUaHJpZnRTdHJpbmdCdWlsZGVyIH0KQEAgLTE0MjAsNyArMTA3OCw3IEBACiBlbmQ7CiAKIAotcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5Xcml0ZU1lc3NhZ2VCZWdpbiggY29uc3QgbXNnOiBJTWVzc2FnZSk7Citwcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLldyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBtc2c6IFRUaHJpZnRNZXNzYWdlKTsKIGJlZ2luCiAgIEZXcmFwcGVkUHJvdG9jb2wuV3JpdGVNZXNzYWdlQmVnaW4oIG1zZyk7CiBlbmQ7CkBAIC0xNDMyLDcgKzEwOTAsNyBAQAogZW5kOwogCiAKLXByb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuV3JpdGVTdHJ1Y3RCZWdpbiggY29uc3Qgc3RydWM6IElTdHJ1Y3QpOworcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5Xcml0ZVN0cnVjdEJlZ2luKCBjb25zdCBzdHJ1YzogVFRocmlmdFN0cnVjdCk7CiBiZWdpbgogICBGV3JhcHBlZFByb3RvY29sLldyaXRlU3RydWN0QmVnaW4oIHN0cnVjKTsKIGVuZDsKQEAgLTE0NDQsNyArMTEwMiw3IEBACiBlbmQ7CiAKIAotcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5Xcml0ZUZpZWxkQmVnaW4oIGNvbnN0IGZpZWxkOiBJRmllbGQpOworcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5Xcml0ZUZpZWxkQmVnaW4oIGNvbnN0IGZpZWxkOiBUVGhyaWZ0RmllbGQpOwogYmVnaW4KICAgRldyYXBwZWRQcm90b2NvbC5Xcml0ZUZpZWxkQmVnaW4oIGZpZWxkKTsKIGVuZDsKQEAgLTE0NjIsNyArMTEyMCw3IEBACiBlbmQ7CiAKIAotcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5Xcml0ZU1hcEJlZ2luKCBjb25zdCBtYXA6IElNYXApOworcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5Xcml0ZU1hcEJlZ2luKCBjb25zdCBtYXA6IFRUaHJpZnRNYXApOwogYmVnaW4KICAgRldyYXBwZWRQcm90b2NvbC5Xcml0ZU1hcEJlZ2luKCBtYXApOwogZW5kOwpAQCAtMTQ3NCw3ICsxMTMyLDcgQEAKIGVuZDsKIAogCi1wcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLldyaXRlTGlzdEJlZ2luKCBjb25zdCBsaXN0OiBJTGlzdCk7Citwcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLldyaXRlTGlzdEJlZ2luKCBjb25zdCBsaXN0OiBUVGhyaWZ0TGlzdCk7CiBiZWdpbgogICBGV3JhcHBlZFByb3RvY29sLldyaXRlTGlzdEJlZ2luKCBsaXN0KTsKIGVuZDsKQEAgLTE0ODYsNyArMTE0NCw3IEBACiBlbmQ7CiAKIAotcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5Xcml0ZVNldEJlZ2luKCBjb25zdCBzZXRfOiBJU2V0ICk7Citwcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLldyaXRlU2V0QmVnaW4oIGNvbnN0IHNldF86IFRUaHJpZnRTZXQgKTsKIGJlZ2luCiAgIEZXcmFwcGVkUHJvdG9jb2wuV3JpdGVTZXRCZWdpbiggc2V0Xyk7CiBlbmQ7CkBAIC0xNTUyLDcgKzEyMTAsNyBAQAogZW5kOwogCiAKLWZ1bmN0aW9uIFRQcm90b2NvbERlY29yYXRvci5SZWFkTWVzc2FnZUJlZ2luOiBJTWVzc2FnZTsKK2Z1bmN0aW9uIFRQcm90b2NvbERlY29yYXRvci5SZWFkTWVzc2FnZUJlZ2luOiBUVGhyaWZ0TWVzc2FnZTsKIGJlZ2luCiAgIHJlc3VsdCA6PSBGV3JhcHBlZFByb3RvY29sLlJlYWRNZXNzYWdlQmVnaW47CiBlbmQ7CkBAIC0xNTY0LDcgKzEyMjIsNyBAQAogZW5kOwogCiAKLWZ1bmN0aW9uIFRQcm90b2NvbERlY29yYXRvci5SZWFkU3RydWN0QmVnaW46IElTdHJ1Y3Q7CitmdW5jdGlvbiBUUHJvdG9jb2xEZWNvcmF0b3IuUmVhZFN0cnVjdEJlZ2luOiBUVGhyaWZ0U3RydWN0OwogYmVnaW4KICAgcmVzdWx0IDo9IEZXcmFwcGVkUHJvdG9jb2wuUmVhZFN0cnVjdEJlZ2luOwogZW5kOwpAQCAtMTU3Niw3ICsxMjM0LDcgQEAKIGVuZDsKIAogCi1mdW5jdGlvbiBUUHJvdG9jb2xEZWNvcmF0b3IuUmVhZEZpZWxkQmVnaW46IElGaWVsZDsKK2Z1bmN0aW9uIFRQcm90b2NvbERlY29yYXRvci5SZWFkRmllbGRCZWdpbjogVFRocmlmdEZpZWxkOwogYmVnaW4KICAgcmVzdWx0IDo9IEZXcmFwcGVkUHJvdG9jb2wuUmVhZEZpZWxkQmVnaW47CiBlbmQ7CkBAIC0xNTg4LDcgKzEyNDYsNyBAQAogZW5kOwogCiAKLWZ1bmN0aW9uIFRQcm90b2NvbERlY29yYXRvci5SZWFkTWFwQmVnaW46IElNYXA7CitmdW5jdGlvbiBUUHJvdG9jb2xEZWNvcmF0b3IuUmVhZE1hcEJlZ2luOiBUVGhyaWZ0TWFwOwogYmVnaW4KICAgcmVzdWx0IDo9IEZXcmFwcGVkUHJvdG9jb2wuUmVhZE1hcEJlZ2luOwogZW5kOwpAQCAtMTYwMCw3ICsxMjU4LDcgQEAKIGVuZDsKIAogCi1mdW5jdGlvbiBUUHJvdG9jb2xEZWNvcmF0b3IuUmVhZExpc3RCZWdpbjogSUxpc3Q7CitmdW5jdGlvbiBUUHJvdG9jb2xEZWNvcmF0b3IuUmVhZExpc3RCZWdpbjogVFRocmlmdExpc3Q7CiBiZWdpbgogICByZXN1bHQgOj0gRldyYXBwZWRQcm90b2NvbC5SZWFkTGlzdEJlZ2luOwogZW5kOwpAQCAtMTYxMiw3ICsxMjcwLDcgQEAKIGVuZDsKIAogCi1mdW5jdGlvbiBUUHJvdG9jb2xEZWNvcmF0b3IuUmVhZFNldEJlZ2luOiBJU2V0OworZnVuY3Rpb24gVFByb3RvY29sRGVjb3JhdG9yLlJlYWRTZXRCZWdpbjogVFRocmlmdFNldDsKIGJlZ2luCiAgIHJlc3VsdCA6PSBGV3JhcHBlZFByb3RvY29sLlJlYWRTZXRCZWdpbjsKIGVuZDsKQEAgLTE2NzgsNiArMTMzNiw1NCBAQAogZW5kOwogCiAKK3sgSW5pdCBoZWxwZXIgZnVuY3Rpb25zIH0KKworcHJvY2VkdXJlIEluaXQoIHZhciByZWMgOiBUVGhyaWZ0TWVzc2FnZTsgY29uc3QgQU5hbWU6IHN0cmluZzsgY29uc3QgQU1lc3NhZ2VUeXBlOiBUTWVzc2FnZVR5cGU7IGNvbnN0IEFTZXFJRDogSW50ZWdlcik7CitiZWdpbgorICByZWMuTmFtZSA6PSBBTmFtZTsKKyAgcmVjLlR5cGVfIDo9IEFNZXNzYWdlVHlwZTsKKyAgcmVjLlNlcUlEIDo9IEFTZXFJRDsKK2VuZDsKKworCitwcm9jZWR1cmUgSW5pdCggdmFyIHJlYyA6IFRUaHJpZnRTdHJ1Y3Q7IGNvbnN0IEFOYW1lOiBzdHJpbmcgPSAnJyk7CitiZWdpbgorICByZWMuTmFtZSA6PSBBTmFtZTsKK2VuZDsKKworCitwcm9jZWR1cmUgSW5pdCggdmFyIHJlYyA6IFRUaHJpZnRGaWVsZDsgY29uc3QgQU5hbWU6IHN0cmluZzsgY29uc3QgQVR5cGU6IFRUeXBlOyBjb25zdCBBSUQ6IFNtYWxsSW50KTsKK2JlZ2luCisgIHJlYy5OYW1lIDo9IEFOYW1lOworICByZWMuVHlwZV8gOj0gQVR5cGU7CisgIHJlYy5JZCA6PSBBSWQ7CitlbmQ7CisKKworcHJvY2VkdXJlIEluaXQoIHZhciByZWMgOiBUVGhyaWZ0TWFwOyBjb25zdCBBS2V5VHlwZSwgQVZhbHVlVHlwZTogVFR5cGU7IGNvbnN0IEFDb3VudDogSW50ZWdlcik7CitiZWdpbgorICByZWMuVmFsdWVUeXBlIDo9IEFWYWx1ZVR5cGU7CisgIHJlYy5LZXlUeXBlIDo9IEFLZXlUeXBlOworICByZWMuQ291bnQgOj0gQUNvdW50OworZW5kOworCisKK3Byb2NlZHVyZSBJbml0KCB2YXIgcmVjIDogVFRocmlmdFNldDsgY29uc3QgQUVsZW1lbnRUeXBlOiBUVHlwZTsgY29uc3QgQUNvdW50OiBJbnRlZ2VyKTsKK2JlZ2luCisgIHJlYy5Db3VudCA6PSBBQ291bnQ7CisgIHJlYy5FbGVtZW50VHlwZSA6PSBBRWxlbWVudFR5cGU7CitlbmQ7CisKKworcHJvY2VkdXJlIEluaXQoIHZhciByZWMgOiBUVGhyaWZ0TGlzdDsgY29uc3QgQUVsZW1lbnRUeXBlOiBUVHlwZTsgY29uc3QgQUNvdW50OiBJbnRlZ2VyKTsKK2JlZ2luCisgIHJlYy5Db3VudCA6PSBBQ291bnQ7CisgIHJlYy5FbGVtZW50VHlwZSA6PSBBRWxlbWVudFR5cGU7CitlbmQ7CisKKworCisKIAogZW5kLgogCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3NyYy9UaHJpZnQuU2VyaWFsaXplci5wYXMgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuU2VyaWFsaXplci5wYXMKaW5kZXggY2Y2NDZjOC4uNWYyOTA1YSAxMDA2NDQKLS0tIGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlNlcmlhbGl6ZXIucGFzCisrKyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5TZXJpYWxpemVyLnBhcwpAQCAtMTgsMTAgKzE4LDE2IEBACiAgKikKIHVuaXQgVGhyaWZ0LlNlcmlhbGl6ZXI7CiAKK3skSSBUaHJpZnQuRGVmaW5lcy5pbmN9CisKIGludGVyZmFjZQogCiB1c2VzCisgIHskSUZERUYgT0xEX1VOSVRfTkFNRVN9CiAgIENsYXNzZXMsIFdpbmRvd3MsIFN5c1V0aWxzLAorICB7JEVMU0V9CisgIFN5c3RlbS5DbGFzc2VzLCBXaW5hcGkuV2luZG93cywgU3lzdGVtLlN5c1V0aWxzLAorICB7JEVORElGfQogICBUaHJpZnQuUHJvdG9jb2wsCiAgIFRocmlmdC5UcmFuc3BvcnQsCiAgIFRocmlmdC5TdHJlYW07CmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3NyYy9UaHJpZnQuU2VydmVyLnBhcyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5TZXJ2ZXIucGFzCmluZGV4IDI5MzU3NDcuLjEzYzU3NjIgMTAwNjQ0Ci0tLSBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5TZXJ2ZXIucGFzCisrKyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5TZXJ2ZXIucGFzCkBAIC0xOSwxMiArMTksMTcgQEAKIAogIHVuaXQgVGhyaWZ0LlNlcnZlcjsKIAoreyRJIFRocmlmdC5EZWZpbmVzLmluY30KIHskSS19ICAvLyBwcmV2ZW50IGFubm95aW5nIGVycm9ycyB3aXRoIGRlZmF1bHQgbG9nIGRlbGVnYXRlIGFuZCBubyBjb25zb2xlCiAKIGludGVyZmFjZQogCiB1c2VzCisgIHskSUZERUYgT0xEX1VOSVRfTkFNRVN9CiAgIFdpbmRvd3MsIFN5c1V0aWxzLAorICB7JEVMU0V9CisgIFdpbmFwaS5XaW5kb3dzLCBTeXN0ZW0uU3lzVXRpbHMsCisgIHskRU5ESUZ9CiAgIFRocmlmdCwKICAgVGhyaWZ0LlByb3RvY29sLAogICBUaHJpZnQuVHJhbnNwb3J0OwpAQCAtMzQ1LDcgKzM1MCw3IEBACiAgICAgICBpZiBjbGllbnQgPSBuaWwgdGhlbiBiZWdpbgogICAgICAgICBpZiBGU3RvcAogICAgICAgICB0aGVuIEFib3J0ICAvLyBzaWxlbnQgZXhjZXB0aW9uCi0gICAgICAgIGVsc2UgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoICdTZXJ2ZXJUcmFuc3BvcnQuQWNjZXB0KCkgbWF5IG5vdCByZXR1cm4gTlVMTCcgKTsKKyAgICAgICAgZWxzZSByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoJ1NlcnZlclRyYW5zcG9ydC5BY2NlcHQoKSBtYXkgbm90IHJldHVybiBOVUxMJyk7CiAgICAgICBlbmQ7CiAKICAgICAgIEZMb2dEZWxlZ2F0ZSggJ0NsaWVudCBDb25uZWN0ZWQhJyk7CmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3NyYy9UaHJpZnQuU29ja2V0LnBhcyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Tb2NrZXQucGFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwY2FiNzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuU29ja2V0LnBhcwpAQCAtMCwwICsxLDE2MTcgQEAKKygqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKikKKwordW5pdCBUaHJpZnQuU29ja2V0OworCit7JEkgVGhyaWZ0LkRlZmluZXMuaW5jfQoreyRJLX0gIC8vIHByZXZlbnQgYW5ub3lpbmcgZXJyb3JzIHdpdGggZGVmYXVsdCBsb2cgZGVsZWdhdGUgYW5kIG5vIGNvbnNvbGUKKworaW50ZXJmYWNlCit7JElGTkRFRiBPTERfU09DS0VUU30gLy8gbm90IGZvciBPTERfU09DS0VUUworCit1c2VzCisgIFdpbmFwaS5XaW5kb3dzLCBXaW5hcGkuV2luc29jazI7CisKK2NvbnN0CisgIEFJX1BBU1NJVkUgICAgICAgICAgICAgICAgPSAkMDAwMDAwMDE7ICAvLyBTb2NrZXQgYWRkcmVzcyB3aWxsIGJlIHVzZWQgaW4gYmluZCgpIGNhbGwKKyAgQUlfQ0FOT05OQU1FICAgICAgICAgICAgICA9ICQwMDAwMDAwMjsgIC8vIFJldHVybiBjYW5vbmljYWwgbmFtZSBpbiBmaXJzdCBhaV9jYW5vbm5hbWUKKyAgQUlfTlVNRVJJQ0hPU1QgICAgICAgICAgICA9ICQwMDAwMDAwNDsgIC8vIE5vZGVuYW1lIG11c3QgYmUgYSBudW1lcmljIGFkZHJlc3Mgc3RyaW5nCisgIEFJX05VTUVSSUNTRVJWICAgICAgICAgICAgPSAkMDAwMDAwMDg7ICAvLyBTZXJ2aWNlbmFtZSBtdXN0IGJlIGEgbnVtZXJpYyBwb3J0IG51bWJlcgorCisgIEFJX0FMTCAgICAgICAgICAgICAgICAgICAgPSAkMDAwMDAxMDA7ICAvLyBRdWVyeSBib3RoIElQNiBhbmQgSVA0IHdpdGggQUlfVjRNQVBQRUQKKyAgQUlfQUREUkNPTkZJRyAgICAgICAgICAgICA9ICQwMDAwMDQwMDsgIC8vIFJlc29sdXRpb24gb25seSBpZiBnbG9iYWwgYWRkcmVzcyBjb25maWd1cmVkCisgIEFJX1Y0TUFQUEVEICAgICAgICAgICAgICAgPSAkMDAwMDA4MDA7ICAvLyBPbiB2NiBmYWlsdXJlLCBxdWVyeSB2NCBhbmQgY29udmVydCB0byBWNE1BUFBFRCBmb3JtYXQKKworICBBSV9OT05fQVVUSE9SSVRBVElWRSAgICAgID0gJDAwMDA0MDAwOyAgLy8gTFVQX05PTl9BVVRIT1JJVEFUSVZFCisgIEFJX1NFQ1VSRSAgICAgICAgICAgICAgICAgPSAkMDAwMDgwMDA7ICAvLyBMVVBfU0VDVVJFCisgIEFJX1JFVFVSTl9QUkVGRVJSRURfTkFNRVMgPSAkMDAwMTAwMDA7ICAvLyBMVVBfUkVUVVJOX1BSRUZFUlJFRF9OQU1FUworCisgIEFJX0ZRRE4gICAgICAgICAgICAgICAgICAgPSAkMDAwMjAwMDA7ICAvLyBSZXR1cm4gdGhlIEZRRE4gaW4gYWlfY2Fub25uYW1lCisgIEFJX0ZJTEVTRVJWRVIgICAgICAgICAgICAgPSAkMDAwNDAwMDA7ICAvLyBSZXNvbHZpbmcgZmlsZXNlcnZlciBuYW1lIHJlc29sdXRpb24KKwordHlwZQorICBQQWRkckluZm9BID0gXlRBZGRySW5mb0E7CisgIFRBZGRySW5mb0EgPSByZWNvcmQKKyAgICBhaV9mbGFnczogSW50ZWdlcjsKKyAgICBhaV9mYW1pbHk6IEludGVnZXI7CisgICAgYWlfc29ja3R5cGU6IEludGVnZXI7CisgICAgYWlfcHJvdG9jb2w6IEludGVnZXI7CisgICAgYWlfYWRkcmxlbjogTmF0aXZlVUludDsKKyAgICBhaV9jYW5vbm5hbWU6IFBBbnNpQ2hhcjsKKyAgICBhaV9hZGRyOiBQU29ja0FkZHI7CisgICAgYWlfbmV4dDogUEFkZHJJbmZvQTsKKyAgZW5kOworCisgIFBBZGRySW5mb1cgPSBeVEFkZHJJbmZvVzsKKyAgVEFkZHJJbmZvVyA9IHJlY29yZAorICAgIGFpX2ZsYWdzOiBJbnRlZ2VyOworICAgIGFpX2ZhbWlseTogSW50ZWdlcjsKKyAgICBhaV9zb2NrdHlwZTogSW50ZWdlcjsKKyAgICBhaV9wcm90b2NvbDogSW50ZWdlcjsKKyAgICBhaV9hZGRybGVuOiBOYXRpdmVVSW50OworICAgIGFpX2Nhbm9ubmFtZTogUENoYXI7CisgICAgYWlfYWRkcjogUFNvY2tBZGRyOworICAgIGFpX25leHQ6IFBBZGRySW5mb1c7CisgIGVuZDsKKworICBUQWRkcmVzc0ZhbWlseSA9IFVTSE9SVDsKKworICBUSW42QWRkciA9IHJlY29yZAorICBjYXNlIEludGVnZXIgb2YKKyAgICAwOiAoX0J5dGU6IGFycmF5WzAuLjE1XSBvZiBVQ0hBUik7CisgICAgMTogKF9Xb3JkOiBhcnJheVswLi43XSBvZiBVU0hPUlQpOworICBlbmQ7CisKKyAgVFNjb3BlSWQgPSByZWNvcmQKKyAgcHVibGljCisgICAgVmFsdWU6IFVMT05HOworICBwcml2YXRlCisgICAgZnVuY3Rpb24gR2V0Qml0RmllbGQoTG9jOiBJbnRlZ2VyKTogSW50ZWdlcjsgaW5saW5lOworICAgIHByb2NlZHVyZSBTZXRCaXRGaWVsZChMb2M6IEludGVnZXI7IGNvbnN0IGFWYWx1ZTogSW50ZWdlcik7IGlubGluZTsKKyAgcHVibGljCisgICAgcHJvcGVydHkgWm9uZTogSW50ZWdlciBpbmRleCAkMDAyOCByZWFkIEdldEJpdEZpZWxkIHdyaXRlIFNldEJpdEZpZWxkOworICAgIHByb3BlcnR5IExldmVsOiBJbnRlZ2VyIGluZGV4ICQyODA0IHJlYWQgR2V0Qml0RmllbGQgd3JpdGUgU2V0Qml0RmllbGQ7CisgIGVuZDsKKworICBUU29ja0FkZHJJbjYgPSByZWNvcmQKKyAgICBzaW42X2ZhbWlseTogVEFkZHJlc3NGYW1pbHk7CisgICAgc2luNl9wb3J0OiBVU0hPUlQ7CisgICAgc2luNl9mbG93aW5mbzogVUxPTkc7CisgICAgc2luNl9hZGRyOiBUSW42QWRkcjsKKyAgY2FzZSBJbnRlZ2VyIG9mCisgICAgMDogKHNpbjZfc2NvcGVfaWQ6IFVMT05HKTsKKyAgICAxOiAoc2luNl9zY29wZV9zdHJ1Y3Q6IFRTY29wZUlkKTsKKyAgZW5kOworICBQU29ja0FkZHJJbjYgPSBeVFNvY2tBZGRySW42OworCitjb25zdAorICBOSV9OT0ZRRE4gICAgICA9ICQwMTsgIC8vIE9ubHkgcmV0dXJuIG5vZGVuYW1lIHBvcnRpb24gZm9yIGxvY2FsIGhvc3RzCisgIE5JX05VTUVSSUNIT1NUID0gJDAyOyAgLy8gUmV0dXJuIG51bWVyaWMgZm9ybSBvZiB0aGUgaG9zdCdzIGFkZHJlc3MKKyAgTklfTkFNRVJFUUQgICAgPSAkMDQ7ICAvLyBFcnJvciBpZiB0aGUgaG9zdCdzIG5hbWUgbm90IGluIEROUworICBOSV9OVU1FUklDU0VSViA9ICQwODsgIC8vIFJldHVybiBudW1lcmljIGZvcm0gb2YgdGhlIHNlcnZpY2UgKHBvcnQgIykKKyAgTklfREdSQU0gICAgICAgPSAkMTA7ICAvLyBTZXJ2aWNlIGlzIGEgZGF0YWdyYW0gc2VydmljZQorCisgIE5JX01BWEhPU1QgICAgID0gMTAyNTsgIC8vIE1heCBzaXplIG9mIGEgZnVsbHktcXVhbGlmaWVkIGRvbWFpbiBuYW1lCisgIE5JX01BWFNFUlYgICAgID0gMzI7ICAgIC8vIE1heCBzaXplIG9mIGEgc2VydmljZSBuYW1lCisKK2Z1bmN0aW9uIGdldGFkZHJpbmZvKHBOb2RlTmFtZSwgcFNlcnZpY2VOYW1lOiBQQW5zaUNoYXI7IGNvbnN0IHBIaW50czogVEFkZHJJbmZvQTsgdmFyIHBwUmVzdWx0OiBQQWRkckluZm9BKTogSW50ZWdlcjsgc3RkY2FsbDsKK2Z1bmN0aW9uIEdldEFkZHJJbmZvVyhwTm9kZU5hbWUsIHBTZXJ2aWNlTmFtZTogUFdpZGVDaGFyOyBjb25zdCBwSGludHM6IFRBZGRySW5mb1c7IHZhciBwcFJlc3VsdDogUEFkZHJJbmZvVyk6IEludGVnZXI7IHN0ZGNhbGw7Citwcm9jZWR1cmUgZnJlZWFkZHJpbmZvKHBBZGRySW5mbzogUEFkZHJJbmZvQSk7IHN0ZGNhbGw7Citwcm9jZWR1cmUgRnJlZUFkZHJJbmZvVyhwQWRkckluZm86IFBBZGRySW5mb1cpOyBzdGRjYWxsOworZnVuY3Rpb24gZ2V0bmFtZWluZm8oY29uc3QgcFNvY2thZGRyOiBUU29ja0FkZHI7IFNvY2thZGRyTGVuZ3RoOiBJbnRlZ2VyOyBwTm9kZUJ1ZmZlcjogUEFuc2lDaGFyOyBOb2RlQnVmZmVyU2l6ZTogRFdPUkQ7IHBTZXJ2aWNlQnVmZmVyOiBQQW5zaUNoYXI7CisgIFNlcnZpY2VCdWZmZXJTaXplOiBEV09SRDsgRmxhZ3M6IEludGVnZXIpOiBJbnRlZ2VyOyBzdGRjYWxsOworZnVuY3Rpb24gR2V0TmFtZUluZm9XKGNvbnN0IHBTb2NrYWRkcjogVFNvY2tBZGRyOyBTb2NrYWRkckxlbmd0aDogSW50ZWdlcjsgcE5vZGVCdWZmZXI6IFBXaWRlQ2hhcjsgTm9kZUJ1ZmZlclNpemU6IERXT1JEOyBwU2VydmljZUJ1ZmZlcjogUFdpZGVDaGFyOworICBTZXJ2aWNlQnVmZmVyU2l6ZTogRFdPUkQ7IEZsYWdzOiBJbnRlZ2VyKTogSW50ZWdlcjsgc3RkY2FsbDsKKwordHlwZQorICBUU21hcnRQb2ludGVyRGVzdHJveWVyPFQ+ID0gcmVmZXJlbmNlIHRvIHByb2NlZHVyZShWYWx1ZTogVCk7CisKKyAgSVNtYXJ0UG9pbnRlcjxUPiA9IHJlZmVyZW5jZSB0byBmdW5jdGlvbjogVDsKKworICBUU21hcnRQb2ludGVyPFQ+ID0gY2xhc3MoVEludGVyZmFjZWRPYmplY3QsIElTbWFydFBvaW50ZXI8VD4pCisgIHByaXZhdGUKKyAgICBGVmFsdWU6IFQ7CisgICAgRkRlc3Ryb3llcjogVFNtYXJ0UG9pbnRlckRlc3Ryb3llcjxUPjsKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKEFWYWx1ZTogVDsgQURlc3Ryb3llcjogVFNtYXJ0UG9pbnRlckRlc3Ryb3llcjxUPik7CisgICAgZGVzdHJ1Y3RvciBEZXN0cm95OyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBJbnZva2U6IFQ7CisgIGVuZDsKKworICBUQmFzZVNvY2tldCA9IGNsYXNzIGFic3RyYWN0CisgIHB1YmxpYyB0eXBlCisgICAgVExvZ0RlbGVnYXRlID0gcmVmZXJlbmNlIHRvIHByb2NlZHVyZSggY29uc3Qgc3RyOiBzdHJpbmcpOworICBzdHJpY3QgcHJpdmF0ZQorICAgIEZQb3J0OiBJbnRlZ2VyOworICAgIEZTb2NrZXQ6IFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0OworICAgIEZTZW5kVGltZW91dCwKKyAgICBGUmVjdlRpbWVvdXQ6IExvbmd3b3JkOworICAgIEZLZWVwQWxpdmU6IEJvb2xlYW47CisgICAgRkxvZ0RlbGVnYXRlOiBUTG9nRGVsZWdhdGU7CisgICAgY2xhc3MgY29uc3RydWN0b3IgQ3JlYXRlOworICAgIGNsYXNzIGRlc3RydWN0b3IgRGVzdHJveTsKKyAgICBjbGFzcyBwcm9jZWR1cmUgRGVmYXVsdExvZ0RlbGVnYXRlKGNvbnN0IFN0cjogc3RyaW5nKTsKKyAgcHJvdGVjdGVkIHR5cGUKKyAgICBJR2V0QWRkckluZm9XcmFwcGVyID0gaW50ZXJmYWNlCisgICAgICBmdW5jdGlvbiBJbml0OiBJbnRlZ2VyOworICAgICAgZnVuY3Rpb24gR2V0UmVzOiBQQWRkckluZm9XOworICAgICAgcHJvcGVydHkgUmVzOiBQQWRkckluZm9XIHJlYWQgR2V0UmVzOworICAgIGVuZDsKKyAgICBUR2V0QWRkckluZm9XcmFwcGVyID0gY2xhc3MoVEludGVyZmFjZWRPYmplY3QsIElHZXRBZGRySW5mb1dyYXBwZXIpCisgICAgc3RyaWN0IHByaXZhdGUKKyAgICAgIEZOb2RlOiBzdHJpbmc7CisgICAgICBGU2VydmljZTogc3RyaW5nOworICAgICAgRkhpbnRzLAorICAgICAgRlJlczogUEFkZHJJbmZvVzsKKyAgICBwdWJsaWMKKyAgICAgIGNvbnN0cnVjdG9yIENyZWF0ZShBTm9kZSwgQVNlcnZpY2U6IHN0cmluZzsgQUhpbnRzOiBQQWRkckluZm9XKTsKKyAgICAgIGRlc3RydWN0b3IgRGVzdHJveTsgb3ZlcnJpZGU7CisgICAgICBmdW5jdGlvbiBJbml0OiBJbnRlZ2VyOworICAgICAgZnVuY3Rpb24gR2V0UmVzOiBQQWRkckluZm9XOworICAgICAgcHJvcGVydHkgUmVzOiBQQWRkckluZm9XIHJlYWQgR2V0UmVzOworICAgIGVuZDsKKyAgc3RyaWN0IHByb3RlY3RlZAorICAgIHByb2NlZHVyZSBDb21tb25Jbml0OyB2aXJ0dWFsOworICAgIGZ1bmN0aW9uIENyZWF0ZVNvY2tldChBQWRkcmVzczogc3RyaW5nOyBBUG9ydDogSW50ZWdlcik6IElHZXRBZGRySW5mb1dyYXBwZXI7CisgICAgcHJvY2VkdXJlIFNldFJlY3ZUaW1lb3V0KEFSZWN2VGltZW91dDogTG9uZ3dvcmQpOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBTZXRTZW5kVGltZW91dChBU2VuZFRpbWVvdXQ6IExvbmd3b3JkKTsgdmlydHVhbDsKKyAgICBwcm9jZWR1cmUgU2V0S2VlcEFsaXZlKEFLZWVwQWxpdmU6IEJvb2xlYW4pOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBTZXRTb2NrZXQoQVNvY2tldDogV2luYXBpLldpbnNvY2syLlRTb2NrZXQpOworICAgIHByb3BlcnR5IExvZ0RlbGVnYXRlOiBUTG9nRGVsZWdhdGUgcmVhZCBGTG9nRGVsZWdhdGU7CisgIHB1YmxpYworICAgIC8vCisgICAgLy8gQ29uc3RydWN0cyBhIG5ldyBzb2NrZXQuIE5vdGUgdGhhdCB0aGlzIGRvZXMgTk9UIGFjdHVhbGx5IGNvbm5lY3QgdGhlCisgICAgLy8gc29ja2V0LgorICAgIC8vCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKEFMb2dEZWxlZ2F0ZTogVExvZ0RlbGVnYXRlID0gbmlsKTsgb3ZlcmxvYWQ7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKEFQb3J0OiBJbnRlZ2VyOyBBTG9nRGVsZWdhdGU6IFRMb2dEZWxlZ2F0ZSA9IG5pbCk7IG92ZXJsb2FkOworCisgICAgLy8KKyAgICAvLyBEZXN0cm95cyB0aGUgc29ja2V0IG9iamVjdCwgY2xvc2luZyBpdCBpZiBuZWNlc3NhcnkuCisgICAgLy8KKyAgICBkZXN0cnVjdG9yIERlc3Ryb3k7IG92ZXJyaWRlOworCisgICAgLy8KKyAgICAvLyBTaHV0cyBkb3duIGNvbW11bmljYXRpb25zIG9uIHRoZSBzb2NrZXQKKyAgICAvLworICAgIHByb2NlZHVyZSBDbG9zZTsgdmlydHVhbDsKKworICAgIC8vIFRoZSBwb3J0IHRoYXQgdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQgdG8KKyAgICBwcm9wZXJ0eSBQb3J0OiBJbnRlZ2VyIHJlYWQgRlBvcnQgd3JpdGUgRlBvcnQ7CisKKyAgICAvLyBUaGUgcmVjZWl2ZSB0aW1lb3V0CisgICAgcHJvcGVydHkgUmVjdlRpbWVvdXQ6IExvbmd3b3JkIHJlYWQgRlJlY3ZUaW1lb3V0IHdyaXRlIFNldFJlY3ZUaW1lb3V0OworCisgICAgLy8gVGhlIHNlbmQgdGltZW91dAorICAgIHByb3BlcnR5IFNlbmRUaW1lb3V0OiBMb25nd29yZCByZWFkIEZTZW5kVGltZW91dCB3cml0ZSBTZXRTZW5kVGltZW91dDsKKworICAgIC8vIFNldCBTT19LRUVQQUxJVkUKKyAgICBwcm9wZXJ0eSBLZWVwQWxpdmU6IEJvb2xlYW4gcmVhZCBGS2VlcEFsaXZlIHdyaXRlIFNldEtlZXBBbGl2ZTsKKworICAgIC8vIFRoZSB1bmRlcmx5aW5nIHNvY2tldCBkZXNjcmlwdG9yCisgICAgcHJvcGVydHkgU29ja2V0OiBXaW5hcGkuV2luc29jazIuVFNvY2tldCByZWFkIEZTb2NrZXQgd3JpdGUgU2V0U29ja2V0OworICBlbmQ7CisKKyAgVFNvY2tldCA9IGNsYXNzKFRCYXNlU29ja2V0KQorICBzdHJpY3QgcHJpdmF0ZSB0eXBlCisgICAgVENhY2hlZFBlZXJBZGRyID0gcmVjb3JkCisgICAgY2FzZSBJbnRlZ2VyIG9mCisgICAgICAwOiAoaXB2NDogVFNvY2tBZGRySW4pOworICAgICAgMTogKGlwdjY6IFRTb2NrQWRkckluNik7CisgICAgZW5kOworICBzdHJpY3QgcHJpdmF0ZQorICAgIEZIb3N0OiBzdHJpbmc7CisgICAgRlBlZXJIb3N0OiBzdHJpbmc7CisgICAgRlBlZXJBZGRyZXNzOiBzdHJpbmc7CisgICAgRlBlZXJQb3J0OiBJbnRlZ2VyOworICAgIEZJbnRlcnJ1cHRMaXN0ZW5lcjogSVNtYXJ0UG9pbnRlcjxXaW5hcGkuV2luc29jazIuVFNvY2tldD47CisgICAgRkNvbm5UaW1lb3V0OiBMb25nd29yZDsKKyAgICBGTGluZ2VyT246IEJvb2xlYW47CisgICAgRkxpbmdlclZhbDogSW50ZWdlcjsKKyAgICBGTm9EZWxheTogQm9vbGVhbjsKKyAgICBGTWF4UmVjdlJldHJpZXM6IExvbmd3b3JkOworICAgIEZDYWNoZWRQZWVyQWRkcjogVENhY2hlZFBlZXJBZGRyOworICAgIHByb2NlZHVyZSBJbml0UGVlckluZm87CisgICAgcHJvY2VkdXJlIE9wZW5Db25uZWN0aW9uKFJlczogVEJhc2VTb2NrZXQuSUdldEFkZHJJbmZvV3JhcHBlcik7CisgICAgcHJvY2VkdXJlIExvY2FsT3BlbjsKKyAgICBwcm9jZWR1cmUgU2V0R2VuZXJpY1RpbWVvdXQoUzogV2luYXBpLldpbnNvY2syLlRTb2NrZXQ7IFRpbWVvdXQ6IExvbmd3b3JkOyBPcHROYW1lOiBJbnRlZ2VyKTsKKyAgICBmdW5jdGlvbiBHZXRJc09wZW46IEJvb2xlYW47CisgICAgcHJvY2VkdXJlIFNldE5vRGVsYXkoQU5vRGVsYXk6IEJvb2xlYW4pOworICAgIGZ1bmN0aW9uIEdldFNvY2tldEluZm86IHN0cmluZzsKKyAgICBmdW5jdGlvbiBHZXRQZWVySG9zdDogc3RyaW5nOworICAgIGZ1bmN0aW9uIEdldFBlZXJBZGRyZXNzOiBzdHJpbmc7CisgICAgZnVuY3Rpb24gR2V0UGVlclBvcnQ6IEludGVnZXI7CisgICAgZnVuY3Rpb24gR2V0T3JpZ2luOiBzdHJpbmc7CisgIHN0cmljdCBwcm90ZWN0ZWQKKyAgICBwcm9jZWR1cmUgQ29tbW9uSW5pdDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFNldFJlY3ZUaW1lb3V0KEFSZWN2VGltZW91dDogTG9uZ3dvcmQpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgU2V0U2VuZFRpbWVvdXQoQVNlbmRUaW1lb3V0OiBMb25nd29yZCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBTZXRLZWVwQWxpdmUoQUtlZXBBbGl2ZTogQm9vbGVhbik7IG92ZXJyaWRlOworICBwdWJsaWMKKyAgICAvLworICAgIC8vIENvbnN0cnVjdHMgYSBuZXcgc29ja2V0LiBOb3RlIHRoYXQgdGhpcyBkb2VzIE5PVCBhY3R1YWxseSBjb25uZWN0IHRoZQorICAgIC8vIHNvY2tldC4KKyAgICAvLworICAgIGNvbnN0cnVjdG9yIENyZWF0ZShBTG9nRGVsZWdhdGU6IFRCYXNlU29ja2V0LlRMb2dEZWxlZ2F0ZSA9IG5pbCk7IG92ZXJsb2FkOworCisgICAgLy8KKyAgICAvLyBDb25zdHJ1Y3RzIGEgbmV3IHNvY2tldC4gTm90ZSB0aGF0IHRoaXMgZG9lcyBOT1QgYWN0dWFsbHkgY29ubmVjdCB0aGUKKyAgICAvLyBzb2NrZXQuCisgICAgLy8KKyAgICAvLyBAcGFyYW0gaG9zdCBBbiBJUCBhZGRyZXNzIG9yIGhvc3RuYW1lIHRvIGNvbm5lY3QgdG8KKyAgICAvLyBAcGFyYW0gcG9ydCBUaGUgcG9ydCB0byBjb25uZWN0IG9uCisgICAgLy8KKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoQUhvc3Q6IHN0cmluZzsgQVBvcnQ6IEludGVnZXI7IEFMb2dEZWxlZ2F0ZTogVEJhc2VTb2NrZXQuVExvZ0RlbGVnYXRlID0gbmlsKTsgb3ZlcmxvYWQ7CisKKyAgICAvLworICAgIC8vIENvbnN0cnVjdG9yIHRvIGNyZWF0ZSBzb2NrZXQgZnJvbSBzb2NrZXQgZGVzY3JpcHRvci4KKyAgICAvLworICAgIGNvbnN0cnVjdG9yIENyZWF0ZShBU29ja2V0OiBXaW5hcGkuV2luc29jazIuVFNvY2tldDsgQUxvZ0RlbGVnYXRlOiBUQmFzZVNvY2tldC5UTG9nRGVsZWdhdGUgPSBuaWwpOyBvdmVybG9hZDsKKworICAgIC8vCisgICAgLy8gQ29uc3RydWN0b3IgdG8gY3JlYXRlIHNvY2tldCBmcm9tIHNvY2tldCBkZXNjcmlwdG9yIHRoYXQKKyAgICAvLyBjYW4gYmUgaW50ZXJydXB0ZWQgc2FmZWx5LgorICAgIC8vCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKEFTb2NrZXQ6IFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0OyBBSW50ZXJydXB0TGlzdGVuZXI6IElTbWFydFBvaW50ZXI8V2luYXBpLldpbnNvY2syLlRTb2NrZXQ+OworICAgICAgQUxvZ0RlbGVnYXRlOiBUQmFzZVNvY2tldC5UTG9nRGVsZWdhdGUgPSBuaWwpOyBvdmVybG9hZDsKKworICAgIC8vCisgICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIHNvY2tldAorICAgIC8vCisgICAgLy8gQHRocm93cyBFVHJhbnNwb3J0YXRpb25FeGNlcHRpb24gSWYgdGhlIHNvY2tldCBjb3VsZCBub3QgY29ubmVjdAorICAgIC8vCisgICAgcHJvY2VkdXJlIE9wZW47CisKKyAgICAvLworICAgIC8vIFNodXRzIGRvd24gY29tbXVuaWNhdGlvbnMgb24gdGhlIHNvY2tldAorICAgIC8vCisgICAgcHJvY2VkdXJlIENsb3NlOyBvdmVycmlkZTsKKworICAgIC8vCisgICAgLy8gUmVhZHMgZnJvbSB0aGUgdW5kZXJseWluZyBzb2NrZXQuCisgICAgLy8gXHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkIG9yIDAgaW5kaWNhdGVzIEVPRgorICAgIC8vIFx0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBvZiB0eXBlczoKKyAgICAvLyAgICAgICAgICBJbnRlcnJ1cHRlZCBtZWFucyB0aGUgc29ja2V0IHdhcyBpbnRlcnJ1cHRlZAorICAgIC8vICAgICAgICAgICAgICAgICAgICAgIG91dCBvZiBhIGJsb2NraW5nIGNhbGwKKyAgICAvLyAgICAgICAgICBOb3RPcGVuIG1lYW5zIHRoZSBzb2NrZXQgaGFzIGJlZW4gY2xvc2VkCisgICAgLy8gICAgICAgICAgVGltZWRPdXQgbWVhbnMgdGhlIHJlY2VpdmUgdGltZW91dCBleHBpcmVkCisgICAgLy8gICAgICAgICAgVW5rbm93biBtZWFucyBzb21ldGhpbmcgdW5leHBlY3RlZCBoYXBwZW5lZAorICAgIC8vCisgICAgZnVuY3Rpb24gUmVhZCh2YXIgQnVmOyBMZW46IEludGVnZXIpOiBJbnRlZ2VyOworCisgICAgLy8KKyAgICAvLyBXcml0ZXMgdG8gdGhlIHVuZGVybHlpbmcgc29ja2V0LiAgTG9vcHMgdW50aWwgZG9uZSBvciBmYWlsLgorICAgIC8vCisgICAgcHJvY2VkdXJlIFdyaXRlKGNvbnN0IEJ1ZjsgTGVuOiBJbnRlZ2VyKTsKKworICAgIC8vCisgICAgLy8gV3JpdGVzIHRvIHRoZSB1bmRlcmx5aW5nIHNvY2tldC4gIERvZXMgc2luZ2xlIHNlbmQoKSBhbmQgcmV0dXJucyByZXN1bHQuCisgICAgLy8KKyAgICBmdW5jdGlvbiBXcml0ZVBhcnRpYWwoY29uc3QgQnVmOyBMZW46IEludGVnZXIpOiBJbnRlZ2VyOworCisgICAgLy8KKyAgICAvLyBSZXR1cm5zIGEgY2FjaGVkIGNvcHkgb2YgdGhlIHBlZXIgYWRkcmVzcy4KKyAgICAvLworICAgIGZ1bmN0aW9uIEdldENhY2hlZEFkZHJlc3Mob3V0IExlbjogSW50ZWdlcik6IFBTb2NrQWRkcjsKKworICAgIC8vCisgICAgLy8gU2V0IGEgY2FjaGUgb2YgdGhlIHBlZXIgYWRkcmVzcyAodXNlZCB3aGVuIHRyaXZpYWxseSBhdmFpbGFibGU6IGUuZy4KKyAgICAvLyBhY2NlcHQoKSBvciBjb25uZWN0KCkpLiBPbmx5IGNhY2hlcyBJUFY0IGFuZCBJUFY2OyB1bnNldCBmb3Igb3RoZXJzLgorICAgIC8vCisgICAgcHJvY2VkdXJlIFNldENhY2hlZEFkZHJlc3MoY29uc3QgQWRkcjogVFNvY2tBZGRyOyBMZW46IEludGVnZXIpOworCisgICAgLy8KKyAgICAvLyBDb250cm9scyB3aGV0aGVyIHRoZSBsaW5nZXIgb3B0aW9uIGlzIHNldCBvbiB0aGUgc29ja2V0LgorICAgIC8vCisgICAgLy8gQHBhcmFtIG9uICAgICAgV2hldGhlciBTT19MSU5HRVIgaXMgb24KKyAgICAvLyBAcGFyYW0gbGluZ2VyICBJZiBsaW5nZXIgaXMgYWN0aXZlLCB0aGUgbnVtYmVyIG9mIHNlY29uZHMgdG8gbGluZ2VyIGZvcgorICAgIC8vCisgICAgcHJvY2VkdXJlIFNldExpbmdlcihMaW5nZXJPbjogQm9vbGVhbjsgTGluZ2VyVmFsOiBJbnRlZ2VyKTsKKworICAgIC8vCisgICAgLy8gQ2FsbHMgc2VsZWN0KCkgb24gdGhlIHNvY2tldCB0byBzZWUgaWYgdGhlcmUgaXMgbW9yZSBkYXRhIGF2YWlsYWJsZS4KKyAgICAvLworICAgIGZ1bmN0aW9uIFBlZWs6IEJvb2xlYW47CisKKyAgICAvLyBXaGV0aGVyIHRoZSBzb2NrZXQgaXMgYWxpdmUKKyAgICBwcm9wZXJ0eSBJc09wZW46IEJvb2xlYW4gcmVhZCBHZXRJc09wZW47CisKKyAgICAvLyBUaGUgaG9zdCB0aGF0IHRoZSBzb2NrZXQgaXMgY29ubmVjdGVkIHRvCisgICAgcHJvcGVydHkgSG9zdDogc3RyaW5nIHJlYWQgRkhvc3Qgd3JpdGUgRkhvc3Q7CisKKyAgICAvLyBXaGV0aGVyIHRvIGVuYWJsZSBvciBkaXNhYmxlIE5hZ2xlJ3MgYWxnb3JpdGhtCisgICAgcHJvcGVydHkgTm9EZWxheTogQm9vbGVhbiByZWFkIEZOb0RlbGF5IHdyaXRlIFNldE5vRGVsYXk7CisKKyAgICAvLyBDb25uZWN0IHRpbWVvdXQKKyAgICBwcm9wZXJ0eSBDb25uVGltZW91dDogTG9uZ3dvcmQgcmVhZCBGQ29ublRpbWVvdXQgd3JpdGUgRkNvbm5UaW1lb3V0OworCisgICAgLy8gVGhlIG1heCBudW1iZXIgb2YgcmVjdiByZXRyaWVzIGluIHRoZSBjYXNlIG9mIGEgV1NBRVdPVUxEQkxPQ0sKKyAgICBwcm9wZXJ0eSBNYXhSZWN2UmV0cmllczogTG9uZ3dvcmQgcmVhZCBGTWF4UmVjdlJldHJpZXMgd3JpdGUgRk1heFJlY3ZSZXRyaWVzOworCisgICAgLy8gU29ja2V0IGluZm9ybWF0aW9uIGZvcm1hdHRlZCBhcyBhIHN0cmluZyA8SG9zdDogeCBQb3J0OiB4PgorICAgIHByb3BlcnR5IFNvY2tldEluZm86IHN0cmluZyByZWFkIEdldFNvY2tldEluZm87CisKKyAgICAvLyBUaGUgRE5TIG5hbWUgb2YgdGhlIGhvc3QgdG8gd2hpY2ggdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQKKyAgICBwcm9wZXJ0eSBQZWVySG9zdDogc3RyaW5nIHJlYWQgR2V0UGVlckhvc3Q7CisKKyAgICAvLyBUaGUgYWRkcmVzcyBvZiB0aGUgaG9zdCB0byB3aGljaCB0aGUgc29ja2V0IGlzIGNvbm5lY3RlZAorICAgIHByb3BlcnR5IFBlZXJBZGRyZXNzOiBzdHJpbmcgcmVhZCBHZXRQZWVyQWRkcmVzczsKKworICAgIC8vIFRoZSBwb3J0IG9mIHRoZSBob3N0IHRvIHdoaWNoIHRoZSBzb2NrZXQgaXMgY29ubmVjdGVkCisgICAgcHJvcGVydHkgUGVlclBvcnQ6IEludGVnZXIgcmVhZCBHZXRQZWVyUG9ydDsKKworICAgIC8vIFRoZSBvcmlnaW4gdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQgdG8KKyAgICBwcm9wZXJ0eSBPcmlnaW46IHN0cmluZyByZWFkIEdldE9yaWdpbjsKKyAgZW5kOworCisgIFRTZXJ2ZXJTb2NrZXRGdW5jID0gcmVmZXJlbmNlIHRvIHByb2NlZHVyZShzb2NrOiBXaW5hcGkuV2luc29jazIuVFNvY2tldCk7CisKKyAgVFNlcnZlclNvY2tldCA9IGNsYXNzKFRCYXNlU29ja2V0KQorICBzdHJpY3QgcHJpdmF0ZQorICAgIEZBZGRyZXNzOiBzdHJpbmc7CisgICAgRkFjY2VwdEJhY2tsb2csCisgICAgRlJldHJ5TGltaXQsCisgICAgRlJldHJ5RGVsYXksCisgICAgRlRjcFNlbmRCdWZmZXIsCisgICAgRlRjcFJlY3ZCdWZmZXI6IEludGVnZXI7CisgICAgRkFjY2VwdFRpbWVvdXQ6IExvbmd3b3JkOworICAgIEZMaXN0ZW5pbmcsCisgICAgRkludGVycnVwdGFibGVDaGlsZHJlbjogQm9vbGVhbjsKKyAgICBGSW50ZXJydXB0U29ja1dyaXRlciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIG5vdGlmaWVkIG9uIEludGVycnVwdCgpCisgICAgRkludGVycnVwdFNvY2tSZWFkZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyB1c2VkIGluIHNlbGVjdCB3aXRoIEZTb2NrZXQgZm9yIGludGVycnVwdGFiaWxpdHkKKyAgICBGQ2hpbGRJbnRlcnJ1cHRTb2NrV3JpdGVyOiBXaW5hcGkuV2luc29jazIuVFNvY2tldDsgICAgICAgICAgICAgICAgIC8vIGlzIG5vdGlmaWVkIG9uIEludGVycnVwdENoaWxkcmVuKCkKKyAgICBGQ2hpbGRJbnRlcnJ1cHRTb2NrUmVhZGVyOiBJU21hcnRQb2ludGVyPFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0PjsgIC8vIGlmIEZudGVycnVwdGFibGVDaGlsZHJlbiB0aGlzIGlzIHNoYXJlZCB3aXRoIGNoaWxkIFRTb2NrZXRzCisgICAgRkxpc3RlbkNhbGxiYWNrLAorICAgIEZBY2NlcHRDYWxsYmFjazogVFNlcnZlclNvY2tldEZ1bmM7CisgICAgZnVuY3Rpb24gQ3JlYXRlU29ja2V0T2JqKENsaWVudDogV2luYXBpLldpbnNvY2syLlRTb2NrZXQpOiBUU29ja2V0OworICAgIHByb2NlZHVyZSBOb3RpZnkoTm90aWZ5U29ja2V0OiBXaW5hcGkuV2luc29jazIuVFNvY2tldCk7CisgICAgcHJvY2VkdXJlIFNldEludGVycnVwdGFibGVDaGlsZHJlbihBVmFsdWU6IEJvb2xlYW4pOworICBzdHJpY3QgcHJvdGVjdGVkCisgICAgcHJvY2VkdXJlIENvbW1vbkluaXQ7IG92ZXJyaWRlOworICBwdWJsaWMgY29uc3QKKyAgICBERUZBVUxUX0JBQ0tMT0cgPSAxMDI0OworICBwdWJsaWMKKyAgICAvLworICAgIC8vIENvbnN0cnVjdG9yLgorICAgIC8vCisgICAgLy8gQHBhcmFtIHBvcnQgICAgUG9ydCBudW1iZXIgdG8gYmluZCB0bworICAgIC8vCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKEFQb3J0OiBJbnRlZ2VyOyBBTG9nRGVsZWdhdGU6IFRCYXNlU29ja2V0LlRMb2dEZWxlZ2F0ZSA9IG5pbCk7IG92ZXJsb2FkOworCisgICAgLy8KKyAgICAvLyBDb25zdHJ1Y3Rvci4KKyAgICAvLworICAgIC8vIEBwYXJhbSBwb3J0ICAgICAgICBQb3J0IG51bWJlciB0byBiaW5kIHRvCisgICAgLy8gQHBhcmFtIHNlbmRUaW1lb3V0IFNvY2tldCBzZW5kIHRpbWVvdXQKKyAgICAvLyBAcGFyYW0gcmVjdlRpbWVvdXQgU29ja2V0IHJlY2VpdmUgdGltZW91dAorICAgIC8vCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKEFQb3J0OiBJbnRlZ2VyOyBBU2VuZFRpbWVvdXQsIEFSZWN2VGltZW91dDogTG9uZ3dvcmQ7IEFMb2dEZWxlZ2F0ZTogVEJhc2VTb2NrZXQuVExvZ0RlbGVnYXRlID0gbmlsKTsgb3ZlcmxvYWQ7CisKKyAgICAvLworICAgIC8vIENvbnN0cnVjdG9yLgorICAgIC8vCisgICAgLy8gQHBhcmFtIGFkZHJlc3MgQWRkcmVzcyB0byBiaW5kIHRvCisgICAgLy8gQHBhcmFtIHBvcnQgICAgUG9ydCBudW1iZXIgdG8gYmluZCB0bworICAgIC8vCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKEFBZGRyZXNzOiBzdHJpbmc7IEFQb3J0OiBJbnRlZ2VyOyBBTG9nRGVsZWdhdGU6IFRCYXNlU29ja2V0LlRMb2dEZWxlZ2F0ZSA9IG5pbCk7IG92ZXJsb2FkOworCisgICAgcHJvY2VkdXJlIExpc3RlbjsKKyAgICBmdW5jdGlvbiBBY2NlcHQ6IFRTb2NrZXQ7CisgICAgcHJvY2VkdXJlIEludGVycnVwdDsKKyAgICBwcm9jZWR1cmUgSW50ZXJydXB0Q2hpbGRyZW47CisgICAgcHJvY2VkdXJlIENsb3NlOyBvdmVycmlkZTsKKworICAgIHByb3BlcnR5IEFjY2VwdEJhY2tsb2c6IEludGVnZXIgcmVhZCBGQWNjZXB0QmFja2xvZyB3cml0ZSBGQWNjZXB0QmFja2xvZzsKKyAgICBwcm9wZXJ0eSBBY2NlcHRUaW1lb3V0OiBMb25nd29yZCByZWFkIEZBY2NlcHRUaW1lb3V0IHdyaXRlIEZBY2NlcHRUaW1lb3V0OworICAgIHByb3BlcnR5IFJldHJ5TGltaXQ6IEludGVnZXIgcmVhZCBGUmV0cnlMaW1pdCB3cml0ZSBGUmV0cnlMaW1pdDsKKyAgICBwcm9wZXJ0eSBSZXRyeURlbGF5OiBJbnRlZ2VyIHJlYWQgRlJldHJ5RGVsYXkgd3JpdGUgRlJldHJ5RGVsYXk7CisgICAgcHJvcGVydHkgVGNwU2VuZEJ1ZmZlcjogSW50ZWdlciByZWFkIEZUY3BTZW5kQnVmZmVyIHdyaXRlIEZUY3BTZW5kQnVmZmVyOworICAgIHByb3BlcnR5IFRjcFJlY3ZCdWZmZXI6IEludGVnZXIgcmVhZCBGVGNwUmVjdkJ1ZmZlciB3cml0ZSBGVGNwUmVjdkJ1ZmZlcjsKKworICAgIC8vIFdoZW4gZW5hYmxlZCAodGhlIGRlZmF1bHQpLCBuZXcgY2hpbGRyZW4gVFNvY2tldHMgd2lsbCBiZSBjb25zdHJ1Y3RlZCBzbworICAgIC8vIHRoZXkgY2FuIGJlIGludGVycnVwdGVkIGJ5IFRTZXJ2ZXJUcmFuc3BvcnQuSW50ZXJydXB0Q2hpbGRyZW4oKS4KKyAgICAvLyBUaGlzIGlzIG1vcmUgZXhwZW5zaXZlIGluIHRlcm1zIG9mIHN5c3RlbSBjYWxscyAocG9sbCArIHJlY3YpIGhvd2V2ZXIKKyAgICAvLyBlbnN1cmVzIGEgY29ubmVjdGVkIGNsaWVudCBjYW5ub3QgaW50ZXJmZXJlIHdpdGggVFNlcnZlci5TdG9wKCkuCisgICAgLy8KKyAgICAvLyBXaGVuIGRpc2FibGVkLCBUU29ja2V0IGNoaWxkcmVuIGRvIG5vdCBpbmN1ciBhbiBhZGRpdGlvbmFsIHBvbGwoKSBjYWxsLgorICAgIC8vIFNlcnZlci1zaWRlIHJlYWRzIGFyZSBtb3JlIGVmZmljaWVudCwgaG93ZXZlciBhIGNsaWVudCBjYW4gaW50ZXJmZXJlIHdpdGgKKyAgICAvLyB0aGUgc2VydmVyJ3MgYWJpbGl0eSB0byBzaHV0ZG93biBwcm9wZXJseSBieSBzdGF5aW5nIGNvbm5lY3RlZC4KKyAgICAvLworICAgIC8vIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBsaXN0ZW4oKTsgbW9kZSBjYW5ub3QgYmUgc3dpdGNoZWQgYWZ0ZXIgdGhhdC4KKyAgICAvLyBcdGhyb3dzIEVQcm9wZXJ0eUVycm9yIGlmIGxpc3RlbigpIGhhcyBiZWVuIGNhbGxlZAorICAgIHByb3BlcnR5IEludGVycnVwdGFibGVDaGlsZHJlbjogQm9vbGVhbiByZWFkIEZJbnRlcnJ1cHRhYmxlQ2hpbGRyZW4gd3JpdGUgU2V0SW50ZXJydXB0YWJsZUNoaWxkcmVuOworCisgICAgLy8gbGlzdGVuQ2FsbGJhY2sgZ2V0cyBjYWxsZWQganVzdCBiZWZvcmUgbGlzdGVuLCBhbmQgYWZ0ZXIgYWxsIFRocmlmdAorICAgIC8vIHNldHNvY2tvcHQgY2FsbHMgaGF2ZSBiZWVuIG1hZGUuICBJZiB5b3UgaGF2ZSBjdXN0b20gc2V0c29ja29wdAorICAgIC8vIHRoaW5ncyB0aGF0IG5lZWQgdG8gaGFwcGVuIG9uIHRoZSBsaXN0ZW5pbmcgc29ja2V0LCB0aGlzIGlzIHRoZSBwbGFjZSB0byBkbyBpdC4KKyAgICBwcm9wZXJ0eSBMaXN0ZW5DYWxsYmFjazogVFNlcnZlclNvY2tldEZ1bmMgcmVhZCBGTGlzdGVuQ2FsbGJhY2sgd3JpdGUgRkxpc3RlbkNhbGxiYWNrOworCisgICAgLy8gYWNjZXB0Q2FsbGJhY2sgZ2V0cyBjYWxsZWQgYWZ0ZXIgZWFjaCBhY2NlcHQgY2FsbCwgb24gdGhlIG5ld2x5IGNyZWF0ZWQgc29ja2V0LgorICAgIC8vIEl0IGlzIGNhbGxlZCBhZnRlciBhbGwgVGhyaWZ0IHNldHNvY2tvcHQgY2FsbHMgaGF2ZSBiZWVuIG1hZGUuICBJZiB5b3UgaGF2ZQorICAgIC8vIGN1c3RvbSBzZXRzb2Nrb3B0IHRoaW5ncyB0aGF0IG5lZWQgdG8gaGFwcGVuIG9uIHRoZSBhY2NlcHRlZAorICAgIC8vIHNvY2tldCwgdGhpcyBpcyB0aGUgcGxhY2UgdG8gZG8gaXQuCisgICAgcHJvcGVydHkgQWNjZXB0Q2FsbGJhY2s6IFRTZXJ2ZXJTb2NrZXRGdW5jIHJlYWQgRkFjY2VwdENhbGxiYWNrIHdyaXRlIEZBY2NlcHRDYWxsYmFjazsKKyAgZW5kOworCit7JEVORElGfSAvLyBub3QgZm9yIE9MRF9TT0NLRVRTCitpbXBsZW1lbnRhdGlvbgoreyRJRk5ERUYgT0xEX1NPQ0tFVFN9IC8vIG5vdCBmb3IgT0xEX1NPQ0tFVFMKKwordXNlcworICBTeXN0ZW0uU3lzVXRpbHMsIFN5c3RlbS5NYXRoLCBTeXN0ZW0uRGF0ZVV0aWxzLCBUaHJpZnQuVHJhbnNwb3J0OworCitjb25zdHJ1Y3RvciBUQmFzZVNvY2tldC5UR2V0QWRkckluZm9XcmFwcGVyLkNyZWF0ZShBTm9kZSwgQVNlcnZpY2U6IHN0cmluZzsgQUhpbnRzOiBQQWRkckluZm9XKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZOb2RlIDo9IEFOb2RlOworICBGU2VydmljZSA6PSBBU2VydmljZTsKKyAgRkhpbnRzIDo9IEFIaW50czsKKyAgRlJlcyA6PSBuaWw7CitlbmQ7CisKK2Rlc3RydWN0b3IgVEJhc2VTb2NrZXQuVEdldEFkZHJJbmZvV3JhcHBlci5EZXN0cm95OworYmVnaW4KKyAgaWYgQXNzaWduZWQoRlJlcykgdGhlbgorICAgIEZyZWVBZGRySW5mb1coRlJlcyk7CisgIGluaGVyaXRlZCBEZXN0cm95OworZW5kOworCitmdW5jdGlvbiBUQmFzZVNvY2tldC5UR2V0QWRkckluZm9XcmFwcGVyLkluaXQ6IEludGVnZXI7CitiZWdpbgorICBpZiBGUmVzID0gbmlsIHRoZW4KKyAgICBFeGl0KEdldEFkZHJJbmZvVyhARk5vZGVbMV0sIEBGU2VydmljZVsxXSwgRkhpbnRzXiwgRlJlcykpOworICBSZXN1bHQgOj0gMDsKK2VuZDsKKworZnVuY3Rpb24gVEJhc2VTb2NrZXQuVEdldEFkZHJJbmZvV3JhcHBlci5HZXRSZXM6IFBBZGRySW5mb1c7CitiZWdpbgorICBSZXN1bHQgOj0gRlJlczsKK2VuZDsKKworcHJvY2VkdXJlIERlc3Ryb3llck9mRmluZVNvY2tldHMoc3NvY2s6IFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0KTsKK2JlZ2luCisgIGNsb3Nlc29ja2V0KHNzb2NrKTsKK2VuZDsKKworZnVuY3Rpb24gVFNjb3BlSWQuR2V0Qml0RmllbGQoTG9jOiBJbnRlZ2VyKTogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSAoVmFsdWUgc2hyIChMb2Mgc2hyIDgpKSBhbmQgKCgxIHNobCAoTG9jIGFuZCAkRkYpKSAtIDEpOworZW5kOworCitwcm9jZWR1cmUgVFNjb3BlSWQuU2V0Qml0RmllbGQoTG9jOiBJbnRlZ2VyOyBjb25zdCBhVmFsdWU6IEludGVnZXIpOworYmVnaW4KKyAgVmFsdWUgOj0gKFZhbHVlIGFuZCBVTE9ORygobm90ICgoMSBzaGwgKExvYyBhbmQgJEZGKSkgLSAxKSkpKSBvciBVTE9ORyhhVmFsdWUgc2hsIChMb2Mgc2hyIDgpKTsKK2VuZDsKKworZnVuY3Rpb24gZ2V0YWRkcmluZm87IGV4dGVybmFsICd3czJfMzIuZGxsJyBuYW1lICdnZXRhZGRyaW5mbyc7CitmdW5jdGlvbiBHZXRBZGRySW5mb1c7IGV4dGVybmFsICd3czJfMzIuZGxsJyBuYW1lICdHZXRBZGRySW5mb1cnOworcHJvY2VkdXJlIGZyZWVhZGRyaW5mbzsgZXh0ZXJuYWwgJ3dzMl8zMi5kbGwnIG5hbWUgJ2ZyZWVhZGRyaW5mbyc7Citwcm9jZWR1cmUgRnJlZUFkZHJJbmZvVzsgZXh0ZXJuYWwgJ3dzMl8zMi5kbGwnIG5hbWUgJ0ZyZWVBZGRySW5mb1cnOworZnVuY3Rpb24gZ2V0bmFtZWluZm87IGV4dGVybmFsICd3czJfMzIuZGxsJyBuYW1lICdnZXRuYW1laW5mbyc7CitmdW5jdGlvbiBHZXROYW1lSW5mb1c7IGV4dGVybmFsICd3czJfMzIuZGxsJyBuYW1lICdHZXROYW1lSW5mb1cnOworCitjb25zdHJ1Y3RvciBUU21hcnRQb2ludGVyPFQ+LkNyZWF0ZShBVmFsdWU6IFQ7IEFEZXN0cm95ZXI6IFRTbWFydFBvaW50ZXJEZXN0cm95ZXI8VD4pOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRlZhbHVlIDo9IEFWYWx1ZTsKKyAgRkRlc3Ryb3llciA6PSBBRGVzdHJveWVyOworZW5kOworCitkZXN0cnVjdG9yIFRTbWFydFBvaW50ZXI8VD4uRGVzdHJveTsKK2JlZ2luCisgIGlmIEFzc2lnbmVkKEZEZXN0cm95ZXIpIHRoZW4gRkRlc3Ryb3llcihGVmFsdWUpOworICBpbmhlcml0ZWQgRGVzdHJveTsKK2VuZDsKKworZnVuY3Rpb24gVFNtYXJ0UG9pbnRlcjxUPi5JbnZva2U6IFQ7CitiZWdpbgorICBSZXN1bHQgOj0gRlZhbHVlOworZW5kOworCitjbGFzcyBjb25zdHJ1Y3RvciBUQmFzZVNvY2tldC5DcmVhdGU7Cit2YXIKKyAgVmVyc2lvbjogV09SRDsKKyAgRGF0YTogV1NBRGF0YTsKKyAgRXJyb3I6IEludGVnZXI7CitiZWdpbgorICBWZXJzaW9uIDo9ICQwMjAyOworICBGaWxsQ2hhcihEYXRhLCBTaXplT2YoRGF0YSksIDApOworICBFcnJvciA6PSBXU0FTdGFydHVwKFZlcnNpb24sIERhdGEpOworICBpZiBFcnJvciA8PiAwIHRoZW4KKyAgICByYWlzZSBFeGNlcHRpb24uQ3JlYXRlKCdGYWlsZWQgdG8gaW5pdGlhbGl6ZSBXaW5zb2NrLicpOworZW5kOworCitjbGFzcyBkZXN0cnVjdG9yIFRCYXNlU29ja2V0LkRlc3Ryb3k7CitiZWdpbgorICBXU0FDbGVhbnVwOworZW5kOworCitjbGFzcyBwcm9jZWR1cmUgVEJhc2VTb2NrZXQuRGVmYXVsdExvZ0RlbGVnYXRlKGNvbnN0IFN0cjogc3RyaW5nKTsKK3ZhcgorICBPdXRTdHI6IHN0cmluZzsKK2JlZ2luCisgIE91dFN0ciA6PSBGb3JtYXQoJ1RocmlmdDogJXMgJXMnLCBbRGF0ZVRpbWVUb1N0cihOb3csIFRGb3JtYXRTZXR0aW5ncy5DcmVhdGUpLCBTdHJdKTsKKyAgdHJ5CisgICAgV3JpdGVsbihPdXRTdHIpOworICAgIGlmIElvUmVzdWx0IDw+IDAgdGhlbiBPdXRwdXREZWJ1Z1N0cmluZyhQQ2hhcihPdXRTdHIpKTsKKyAgZXhjZXB0CisgICAgT3V0cHV0RGVidWdTdHJpbmcoUENoYXIoT3V0U3RyKSk7CisgIGVuZDsKK2VuZDsKKworcHJvY2VkdXJlIFRCYXNlU29ja2V0LkNvbW1vbkluaXQ7CitiZWdpbgorICBGU29ja2V0IDo9IElOVkFMSURfU09DS0VUOworICBGUG9ydCA6PSAwOworICBGU2VuZFRpbWVvdXQgOj0gMDsKKyAgRlJlY3ZUaW1lb3V0IDo9IDA7CisgIEZLZWVwQWxpdmUgOj0gRmFsc2U7CisgIEZMb2dEZWxlZ2F0ZSA6PSBEZWZhdWx0TG9nRGVsZWdhdGU7CitlbmQ7CisKK2Z1bmN0aW9uIFRCYXNlU29ja2V0LkNyZWF0ZVNvY2tldChBQWRkcmVzczogc3RyaW5nOyBBUG9ydDogSW50ZWdlcik6IElHZXRBZGRySW5mb1dyYXBwZXI7Cit2YXIKKyAgSGludHM6IFRBZGRySW5mb1c7CisgIFJlczogUEFkZHJJbmZvVzsKKyAgVGhlUG9ydDogYXJyYXlbMC4uNV0gb2YgQ2hhcjsKKyAgRXJyb3I6IEludGVnZXI7CitiZWdpbgorICBGaWxsQ2hhcihIaW50cywgU2l6ZU9mKEhpbnRzKSwgMCk7CisgIEhpbnRzLmFpX2ZhbWlseSA6PSBQRl9VTlNQRUM7CisgIEhpbnRzLmFpX3NvY2t0eXBlIDo9IFNPQ0tfU1RSRUFNOworICBIaW50cy5haV9mbGFncyA6PSBBSV9QQVNTSVZFIG9yIEFJX0FERFJDT05GSUc7CisgIFN0ckZtdChUaGVQb3J0LCAnJWQnLCBbRlBvcnRdKTsKKworICBSZXN1bHQgOj0gVEdldEFkZHJJbmZvV3JhcHBlci5DcmVhdGUoQUFkZHJlc3MsIFRoZVBvcnQsIEBIaW50cyk7CisgIEVycm9yIDo9IFJlc3VsdC5Jbml0OworICBpZiBFcnJvciA8PiAwIHRoZW4gYmVnaW4KKyAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ0dldEFkZHJJbmZvVyAlZDogJXMnLCBbRXJyb3IsIFN5c0Vycm9yTWVzc2FnZShFcnJvcildKSk7CisgICAgQ2xvc2U7CisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdDb3VsZCBub3QgcmVzb2x2ZSBob3N0IGZvciBzZXJ2ZXIgc29ja2V0LicpOworICBlbmQ7CisKKyAgLy8gUGljayB0aGUgaXB2NiBhZGRyZXNzIGZpcnN0IHNpbmNlIGlwdjQgYWRkcmVzc2VzIGNhbiBiZSBtYXBwZWQKKyAgLy8gaW50byBpcHY2IHNwYWNlLgorICBSZXMgOj0gUmVzdWx0LlJlczsKKyAgd2hpbGUgQXNzaWduZWQoUmVzKSBkbyBiZWdpbgorICAgIGlmIChSZXNeLmFpX2ZhbWlseSA9IEFGX0lORVQ2KSBvciAobm90IEFzc2lnbmVkKFJlc14uYWlfbmV4dCkpIHRoZW4KKyAgICAgIEJyZWFrOworICAgIFJlcyA6PSBSZXNeLmFpX25leHQ7CisgIGVuZDsKKworICBGU29ja2V0IDo9IFdpbmFwaS5XaW5zb2NrMi5zb2NrZXQoUmVzXi5haV9mYW1pbHksIFJlc14uYWlfc29ja3R5cGUsIFJlc14uYWlfcHJvdG9jb2wpOworICBpZiBGU29ja2V0ID0gSU5WQUxJRF9TT0NLRVQgdGhlbiBiZWdpbgorICAgIEVycm9yIDo9IFdTQUdldExhc3RFcnJvcjsKKyAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RCYXNlU29ja2V0LkNyZWF0ZVNvY2tldCgpIHNvY2tldCgpICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJvcildKSk7CisgICAgQ2xvc2U7CisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKEZvcm1hdCgnc29ja2V0KCk6ICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJvcildKSk7CisgIGVuZDsKK2VuZDsKKworcHJvY2VkdXJlIFRCYXNlU29ja2V0LlNldFJlY3ZUaW1lb3V0KEFSZWN2VGltZW91dDogTG9uZ3dvcmQpOworYmVnaW4KKyAgRlJlY3ZUaW1lb3V0IDo9IEFSZWN2VGltZW91dDsKK2VuZDsKKworcHJvY2VkdXJlIFRCYXNlU29ja2V0LlNldFNlbmRUaW1lb3V0KEFTZW5kVGltZW91dDogTG9uZ3dvcmQpOworYmVnaW4KKyAgRlNlbmRUaW1lb3V0IDo9IEFTZW5kVGltZW91dDsKK2VuZDsKKworcHJvY2VkdXJlIFRCYXNlU29ja2V0LlNldEtlZXBBbGl2ZShBS2VlcEFsaXZlOiBCb29sZWFuKTsKK2JlZ2luCisgIEZLZWVwQWxpdmUgOj0gQUtlZXBBbGl2ZTsKK2VuZDsKKworcHJvY2VkdXJlIFRCYXNlU29ja2V0LlNldFNvY2tldChBU29ja2V0OiBXaW5hcGkuV2luc29jazIuVFNvY2tldCk7CitiZWdpbgorICBpZiBGU29ja2V0IDw+IElOVkFMSURfU09DS0VUIHRoZW4KKyAgICBDbG9zZTsKKyAgRlNvY2tldCA6PSBBU29ja2V0OworZW5kOworCitjb25zdHJ1Y3RvciBUQmFzZVNvY2tldC5DcmVhdGUoQUxvZ0RlbGVnYXRlOiBUTG9nRGVsZWdhdGUpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgQ29tbW9uSW5pdDsKKyAgaWYgQXNzaWduZWQoQUxvZ0RlbGVnYXRlKSB0aGVuIEZMb2dEZWxlZ2F0ZSA6PSBBTG9nRGVsZWdhdGU7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRCYXNlU29ja2V0LkNyZWF0ZShBUG9ydDogSW50ZWdlcjsgQUxvZ0RlbGVnYXRlOiBUTG9nRGVsZWdhdGUpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgQ29tbW9uSW5pdDsKKyAgRlBvcnQgOj0gQVBvcnQ7CisgIGlmIEFzc2lnbmVkKEFMb2dEZWxlZ2F0ZSkgdGhlbiBGTG9nRGVsZWdhdGUgOj0gQUxvZ0RlbGVnYXRlOworZW5kOworCitkZXN0cnVjdG9yIFRCYXNlU29ja2V0LkRlc3Ryb3k7CitiZWdpbgorICBDbG9zZTsKKyAgaW5oZXJpdGVkIERlc3Ryb3k7CitlbmQ7CisKK3Byb2NlZHVyZSBUQmFzZVNvY2tldC5DbG9zZTsKK2JlZ2luCisgIGlmIEZTb2NrZXQgPD4gSU5WQUxJRF9TT0NLRVQgdGhlbiBiZWdpbgorICAgIHNodXRkb3duKEZTb2NrZXQsIFNEX0JPVEgpOworICAgIGNsb3Nlc29ja2V0KEZTb2NrZXQpOworICBlbmQ7CisgIEZTb2NrZXQgOj0gSU5WQUxJRF9TT0NLRVQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUU29ja2V0LkluaXRQZWVySW5mbzsKK2JlZ2luCisgIEZDYWNoZWRQZWVyQWRkci5pcHY0LnNpbl9mYW1pbHkgOj0gQUZfVU5TUEVDOworICBGUGVlckhvc3QgOj0gJyc7CisgIEZQZWVyQWRkcmVzcyA6PSAnJzsKKyAgRlBlZXJQb3J0IDo9IDA7CitlbmQ7CisKK3Byb2NlZHVyZSBUU29ja2V0LkNvbW1vbkluaXQ7CitiZWdpbgorICBpbmhlcml0ZWQgQ29tbW9uSW5pdDsKKyAgRkhvc3QgOj0gJyc7CisgIEZJbnRlcnJ1cHRMaXN0ZW5lciA6PSBuaWw7CisgIEZDb25uVGltZW91dCA6PSAwOworICBGTGluZ2VyT24gOj0gVHJ1ZTsKKyAgRkxpbmdlclZhbCA6PSAwOworICBGTm9EZWxheSA6PSBUcnVlOworICBGTWF4UmVjdlJldHJpZXMgOj0gNTsKKyAgSW5pdFBlZXJJbmZvOworZW5kOworCitwcm9jZWR1cmUgVFNvY2tldC5PcGVuQ29ubmVjdGlvbihSZXM6IFRCYXNlU29ja2V0LklHZXRBZGRySW5mb1dyYXBwZXIpOworbGFiZWwKKyAgRG9uZTsKK3ZhcgorICBFcnJub0NvcHk6IEludGVnZXI7CisgIFJldCwKKyAgUmV0MjogSW50ZWdlcjsKKyAgRmRzOiBURmRTZXQ7CisgIFRWYWw6IFRUaW1lVmFsOworICBQVFZhbDogUFRpbWVWYWw7CisgIFZhbCwKKyAgTG9uOiBJbnRlZ2VyOworICBPbmUsCisgIFplcm86IENhcmRpbmFsOworYmVnaW4KKyAgaWYgU2VuZFRpbWVvdXQgPiAwIHRoZW4gU2V0U2VuZFRpbWVvdXQoU2VuZFRpbWVvdXQpOworICBpZiBSZWN2VGltZW91dCA+IDAgdGhlbiBTZXRSZWN2VGltZW91dChSZWN2VGltZW91dCk7CisgIGlmIEtlZXBBbGl2ZSB0aGVuIFNldEtlZXBBbGl2ZShLZWVwQWxpdmUpOworICBTZXRMaW5nZXIoRkxpbmdlck9uLCBGTGluZ2VyVmFsKTsKKyAgU2V0Tm9EZWxheShGTm9EZWxheSk7CisKKyAgLy8gU2V0IHRoZSBzb2NrZXQgdG8gYmUgbm9uIGJsb2NraW5nIGZvciBjb25uZWN0IGlmIGEgdGltZW91dCBleGlzdHMKKyAgWmVybyA6PSAwOworICBpZiBGQ29ublRpbWVvdXQgPiAwIHRoZW4gYmVnaW4KKyAgICBPbmUgOj0gMTsKKyAgICBpZiBpb2N0bHNvY2tldChTb2NrZXQsIEludGVnZXIoRklPTkJJTyksIE9uZSkgPSBTT0NLRVRfRVJST1IgdGhlbiBiZWdpbgorICAgICAgRXJybm9Db3B5IDo9IFdTQUdldExhc3RFcnJvcjsKKyAgICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNvY2tldC5PcGVuQ29ubmVjdGlvbigpIGlvY3Rsc29ja2V0KCkgJXMgJXMnLCBbU29ja2V0SW5mbywgU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoRm9ybWF0KCdpb2N0bHNvY2tldCgpIGZhaWxlZDogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgZW5kOworICBlbmQKKyAgZWxzZSBiZWdpbgorICAgIGlmIGlvY3Rsc29ja2V0KFNvY2tldCwgSW50ZWdlcihGSU9OQklPKSwgWmVybykgPSBTT0NLRVRfRVJST1IgdGhlbiBiZWdpbgorICAgICAgRXJybm9Db3B5IDo9IFdTQUdldExhc3RFcnJvcjsKKyAgICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNvY2tldC5PcGVuQ29ubmVjdGlvbigpIGlvY3Rsc29ja2V0KCkgJXMgJXMnLCBbU29ja2V0SW5mbywgU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoRm9ybWF0KCdpb2N0bHNvY2tldCgpIGZhaWxlZDogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgZW5kOworICBlbmQ7CisKKyAgUmV0IDo9IGNvbm5lY3QoU29ja2V0LCBSZXMuUmVzXi5haV9hZGRyXiwgUmVzLlJlc14uYWlfYWRkcmxlbik7CisgIGlmIFJldCA9IDAgdGhlbiBnb3RvIERvbmU7CisKKyAgRXJybm9Db3B5IDo9IFdTQUdldExhc3RFcnJvcjsKKyAgaWYgKEVycm5vQ29weSA8PiBXU0FFSU5QUk9HUkVTUykgYW5kIChFcnJub0NvcHkgPD4gV1NBRVdPVUxEQkxPQ0spIHRoZW4gYmVnaW4KKyAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTb2NrZXQuT3BlbkNvbm5lY3Rpb24oKSBjb25uZWN0KCkgJywgW1NvY2tldEluZm8sIFN5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZShGb3JtYXQoJ2Nvbm5lY3QoKSBmYWlsZWQ6ICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICBlbmQ7CisKKyAgRkRfWkVSTyhGZHMpOworICBfRkRfU0VUKFNvY2tldCwgRmRzKTsKKyAgaWYgRkNvbm5UaW1lb3V0ID4gMCB0aGVuIGJlZ2luCisgICAgVFZhbC50dl9zZWMgOj0gRkNvbm5UaW1lb3V0IGRpdiAxMDAwOworICAgIFRWYWwudHZfdXNlYyA6PSAoRkNvbm5UaW1lb3V0IG1vZCAxMDAwKSAqIDEwMDA7CisgICAgUFRWYWwgOj0gQFRWYWw7CisgIGVuZAorICBlbHNlCisgICAgUFRWYWwgOj0gbmlsOworICBSZXQgOj0gc2VsZWN0KDEsIG5pbCwgQEZkcywgbmlsLCBQVFZhbCk7CisKKyAgaWYgUmV0ID4gMCB0aGVuIGJlZ2luCisgICAgLy8gRW5zdXJlIHRoZSBzb2NrZXQgaXMgY29ubmVjdGVkIGFuZCB0aGF0IHRoZXJlIGFyZSBubyBlcnJvcnMgc2V0CisgICAgTG9uIDo9IFNpemVPZihWYWwpOworICAgIFJldDIgOj0gZ2V0c29ja29wdChTb2NrZXQsIFNPTF9TT0NLRVQsIFNPX0VSUk9SLCBAVmFsLCBMb24pOworICAgIGlmIFJldDIgPSBTT0NLRVRfRVJST1IgdGhlbiBiZWdpbgorICAgICAgRXJybm9Db3B5IDo9IFdTQUdldExhc3RFcnJvcjsKKyAgICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNvY2tldC5PcGVuQ29ubmVjdGlvbigpIGdldHNvY2tvcHQoKSAnLCBbU29ja2V0SW5mbywgU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoRm9ybWF0KCdnZXRzb2Nrb3B0KCk6ICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgIGVuZDsKKyAgICAvLyBubyBlcnJvcnMgb24gc29ja2V0LCBnbyB0byB0b3duCisgICAgaWYgVmFsID0gMCB0aGVuIGdvdG8gRG9uZTsKKyAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTb2NrZXQuT3BlbkNvbm5lY3Rpb24oKSBlcnJvciBvbiBzb2NrZXQgKGFmdGVyIHNlbGVjdCgpKSAnLCBbU29ja2V0SW5mbywgU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKEZvcm1hdCgnc29ja2V0IE9wZW5Db25uZWN0aW9uKCkgZXJyb3I6ICVzJywgW1N5c0Vycm9yTWVzc2FnZShWYWwpXSkpOworICBlbmQKKyAgZWxzZSBpZiBSZXQgPSAwIHRoZW4gYmVnaW4KKyAgICAvLyBzb2NrZXQgdGltZWQgb3V0CisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU29ja2V0Lk9wZW5Db25uZWN0aW9uKCkgdGltZWQgb3V0ICcsIFtTb2NrZXRJbmZvLCBTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ09wZW5Db25uZWN0aW9uKCkgdGltZWQgb3V0Jyk7CisgIGVuZAorICBlbHNlIGJlZ2luCisgICAgLy8gZXJyb3Igb24gc2VsZWN0KCkKKyAgICBFcnJub0NvcHkgOj0gV1NBR2V0TGFzdEVycm9yOworICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNvY2tldC5PcGVuQ29ubmVjdGlvbigpIHNlbGVjdCgpICcsIFtTb2NrZXRJbmZvLCBTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoRm9ybWF0KCdzZWxlY3QoKSBmYWlsZWQ6ICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICBlbmQ7CisKK0RvbmU6CisgIC8vIFNldCBzb2NrZXQgYmFjayB0byBub3JtYWwgbW9kZSAoYmxvY2tpbmcpCisgIGlvY3Rsc29ja2V0KFNvY2tldCwgSW50ZWdlcihGSU9OQklPKSwgWmVybyk7CisgIFNldENhY2hlZEFkZHJlc3MoUmVzLlJlc14uYWlfYWRkcl4sIFJlcy5SZXNeLmFpX2FkZHJsZW4pOworZW5kOworCitwcm9jZWR1cmUgVFNvY2tldC5Mb2NhbE9wZW47Cit2YXIKKyAgUmVzOiBUQmFzZVNvY2tldC5JR2V0QWRkckluZm9XcmFwcGVyOworYmVnaW4KKyAgaWYgSXNPcGVuIHRoZW4gRXhpdDsKKworICAvLyBWYWxpZGF0ZSBwb3J0IG51bWJlcgorICBpZiAoUG9ydCA8IDApIG9yIChQb3J0ID4gJEZGRkYpIHRoZW4KKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uQmFkQXJncy5DcmVhdGUoJ1NwZWNpZmllZCBwb3J0IGlzIGludmFsaWQnKTsKKworICBSZXMgOj0gQ3JlYXRlU29ja2V0KEhvc3QsIFBvcnQpOworCisgIE9wZW5Db25uZWN0aW9uKFJlcyk7CitlbmQ7CisKK3Byb2NlZHVyZSBUU29ja2V0LlNldEdlbmVyaWNUaW1lb3V0KFM6IFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0OyBUaW1lb3V0OiBMb25nd29yZDsgT3B0TmFtZTogSW50ZWdlcik7Cit2YXIKKyAgVGltZTogRFdPUkQ7CitiZWdpbgorICBpZiBTID0gSU5WQUxJRF9TT0NLRVQgdGhlbgorICAgIEV4aXQ7CisKKyAgVGltZSA6PSBUaW1lb3V0OworCisgIGlmIHNldHNvY2tvcHQoUywgU09MX1NPQ0tFVCwgT3B0TmFtZSwgQFRpbWUsIFNpemVPZihUaW1lKSkgPSBTT0NLRVRfRVJST1IgdGhlbgorICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnU2V0R2VuZXJpY1RpbWVvdXQoKSBzZXRzb2Nrb3B0KCkgJXMnLCBbU3lzRXJyb3JNZXNzYWdlKFdTQUdldExhc3RFcnJvcildKSk7CitlbmQ7CisKK2Z1bmN0aW9uIFRTb2NrZXQuR2V0SXNPcGVuOiBCb29sZWFuOworYmVnaW4KKyAgUmVzdWx0IDo9IFNvY2tldCA8PiBJTlZBTElEX1NPQ0tFVDsKK2VuZDsKKworcHJvY2VkdXJlIFRTb2NrZXQuU2V0Tm9EZWxheShBTm9EZWxheTogQm9vbGVhbik7Cit2YXIKKyAgVjogSW50ZWdlcjsKK2JlZ2luCisgIEZOb0RlbGF5IDo9IEFOb0RlbGF5OworICBpZiBTb2NrZXQgPSBJTlZBTElEX1NPQ0tFVCB0aGVuCisgICAgRXhpdDsKKworICBWIDo9IElmVGhlbihGTm9EZWxheSwgMSwgMCk7CisgIGlmIHNldHNvY2tvcHQoU29ja2V0LCBJUFBST1RPX1RDUCwgVENQX05PREVMQVksIEBWLCBTaXplT2YoVikpID0gU09DS0VUX0VSUk9SIHRoZW4KKyAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTb2NrZXQuU2V0Tm9EZWxheSgpIHNldHNvY2tvcHQoKSAlcyAlcycsIFtTb2NrZXRJbmZvLCBTeXNFcnJvck1lc3NhZ2UoV1NBR2V0TGFzdEVycm9yKV0pKTsKK2VuZDsKKworZnVuY3Rpb24gVFNvY2tldC5HZXRTb2NrZXRJbmZvOiBzdHJpbmc7CitiZWdpbgorICBpZiAoRkhvc3QgPSAnJykgb3IgKFBvcnQgPSAwKSB0aGVuCisgICAgUmVzdWx0IDo9ICc8SG9zdDogJyArIEdldFBlZXJBZGRyZXNzICsgJyBQb3J0OiAnICsgR2V0UGVlclBvcnQuVG9TdHJpbmcgKyAnPicKKyAgZWxzZQorICAgIFJlc3VsdCA6PSAnPEhvc3Q6ICcgKyBGSG9zdCArICcgUG9ydDogJyArIFBvcnQuVG9TdHJpbmcgKyAnPic7CitlbmQ7CisKK2Z1bmN0aW9uIFRTb2NrZXQuR2V0UGVlckhvc3Q6IHN0cmluZzsKK3ZhcgorICBBZGRyOiBUU29ja0FkZHJTdG9yYWdlOworICBBZGRyUHRyOiBQU29ja0FkZHI7CisgIEFkZHJMZW46IEludGVnZXI7CisgIENsaWVudEhvc3Q6IGFycmF5WzAuLk5JX01BWEhPU1QtMV0gb2YgQ2hhcjsKKyAgQ2xpZW50U2VydmljZTogYXJyYXlbMC4uTklfTUFYU0VSVi0xXSBvZiBDaGFyOworYmVnaW4KKyAgaWYgRlBlZXJIb3N0ID0gJycgdGhlbiBiZWdpbgorICAgIGlmIFNvY2tldCA9IElOVkFMSURfU09DS0VUIHRoZW4KKyAgICAgIEV4aXQoRlBlZXJIb3N0KTsKKworICAgIEFkZHJQdHIgOj0gR2V0Q2FjaGVkQWRkcmVzcyhBZGRyTGVuKTsKKyAgICBpZiBBZGRyUHRyID0gbmlsIHRoZW4gYmVnaW4KKyAgICAgIEFkZHJMZW4gOj0gU2l6ZU9mKEFkZHIpOworICAgICAgaWYgZ2V0cGVlcm5hbWUoU29ja2V0LCBQU29ja0FkZHIoQEFkZHIpXiwgQWRkckxlbikgPD4gMCB0aGVuCisgICAgICAgIEV4aXQoRlBlZXJIb3N0KTsKKyAgICAgIEFkZHJQdHIgOj0gUFNvY2tBZGRyKEBBZGRyKTsKKyAgICAgIFNldENhY2hlZEFkZHJlc3MoQWRkclB0cl4sIEFkZHJMZW4pOworICAgIGVuZDsKKworICAgIEdldE5hbWVJbmZvVyhBZGRyUHRyXiwgQWRkckxlbiwgQ2xpZW50SG9zdCwgTklfTUFYSE9TVCwgQ2xpZW50U2VydmljZSwgTklfTUFYU0VSViwgMCk7CisgICAgRlBlZXJIb3N0IDo9IENsaWVudEhvc3Q7CisgIGVuZDsKKyAgUmVzdWx0IDo9IEZQZWVySG9zdDsKK2VuZDsKKworZnVuY3Rpb24gVFNvY2tldC5HZXRQZWVyQWRkcmVzczogc3RyaW5nOwordmFyCisgIEFkZHI6IFRTb2NrQWRkclN0b3JhZ2U7CisgIEFkZHJQdHI6IFBTb2NrQWRkcjsKKyAgQWRkckxlbjogSW50ZWdlcjsKKyAgQ2xpZW50SG9zdDogYXJyYXlbMC4uTklfTUFYSE9TVC0xXSBvZiBDaGFyOworICBDbGllbnRTZXJ2aWNlOiBhcnJheVswLi5OSV9NQVhTRVJWLTFdIG9mIENoYXI7CitiZWdpbgorICBpZiBGUGVlckFkZHJlc3MgPSAnJyB0aGVuIGJlZ2luCisgICAgaWYgU29ja2V0ID0gSU5WQUxJRF9TT0NLRVQgdGhlbgorICAgICAgRXhpdChGUGVlckFkZHJlc3MpOworCisgICAgQWRkclB0ciA6PSBHZXRDYWNoZWRBZGRyZXNzKEFkZHJMZW4pOworICAgIGlmIEFkZHJQdHIgPSBuaWwgdGhlbiBiZWdpbgorICAgICAgQWRkckxlbiA6PSBTaXplT2YoQWRkcik7CisgICAgICBpZiBnZXRwZWVybmFtZShTb2NrZXQsIFBTb2NrQWRkcihAQWRkcileLCBBZGRyTGVuKSA8PiAwIHRoZW4KKyAgICAgICAgRXhpdChGUGVlckhvc3QpOworICAgICAgQWRkclB0ciA6PSBQU29ja0FkZHIoQEFkZHIpOworICAgICAgU2V0Q2FjaGVkQWRkcmVzcyhBZGRyUHRyXiwgQWRkckxlbik7CisgICAgZW5kOworCisgICAgR2V0TmFtZUluZm9XKEFkZHJQdHJeLCBBZGRyTGVuLCBDbGllbnRIb3N0LCBOSV9NQVhIT1NULCBDbGllbnRTZXJ2aWNlLCBOSV9NQVhTRVJWLCBOSV9OVU1FUklDSE9TVCBvciBOSV9OVU1FUklDU0VSVik7CisgICAgRlBlZXJBZGRyZXNzIDo9IENsaWVudEhvc3Q7CisgICAgVHJ5U3RyVG9JbnQoQ2xpZW50U2VydmljZSwgRlBlZXJQb3J0KTsKKyAgZW5kOworICBSZXN1bHQgOj0gRlBlZXJBZGRyZXNzCitlbmQ7CisKK2Z1bmN0aW9uIFRTb2NrZXQuR2V0UGVlclBvcnQ6IEludGVnZXI7CitiZWdpbgorICBHZXRQZWVyQWRkcmVzczsKKyAgUmVzdWx0IDo9IEZQZWVyUG9ydDsKK2VuZDsKKworZnVuY3Rpb24gVFNvY2tldC5HZXRPcmlnaW46IHN0cmluZzsKK2JlZ2luCisgIFJlc3VsdCA6PSBHZXRQZWVySG9zdCArICc6JyArIEdldFBlZXJQb3J0LlRvU3RyaW5nOworZW5kOworCitwcm9jZWR1cmUgVFNvY2tldC5TZXRSZWN2VGltZW91dChBUmVjdlRpbWVvdXQ6IExvbmd3b3JkKTsKK2JlZ2luCisgIGluaGVyaXRlZCBTZXRSZWN2VGltZW91dChBUmVjdlRpbWVvdXQpOworICBTZXRHZW5lcmljVGltZW91dChTb2NrZXQsIEFSZWN2VGltZW91dCwgU09fUkNWVElNRU8pOworZW5kOworCitwcm9jZWR1cmUgVFNvY2tldC5TZXRTZW5kVGltZW91dChBU2VuZFRpbWVvdXQ6IExvbmd3b3JkKTsKK2JlZ2luCisgIGluaGVyaXRlZCBTZXRTZW5kVGltZW91dChBU2VuZFRpbWVvdXQpOworICBTZXRHZW5lcmljVGltZW91dChTb2NrZXQsIEFTZW5kVGltZW91dCwgU09fU05EVElNRU8pOworZW5kOworCitwcm9jZWR1cmUgVFNvY2tldC5TZXRLZWVwQWxpdmUoQUtlZXBBbGl2ZTogQm9vbGVhbik7Cit2YXIKKyAgVmFsdWU6IEludGVnZXI7CitiZWdpbgorICBpbmhlcml0ZWQgU2V0S2VlcEFsaXZlKEFLZWVwQWxpdmUpOworCisgIFZhbHVlIDo9IElmVGhlbihLZWVwQWxpdmUsIDEsIDApOworICBpZiBzZXRzb2Nrb3B0KFNvY2tldCwgU09MX1NPQ0tFVCwgU09fS0VFUEFMSVZFLCBAVmFsdWUsIFNpemVPZihWYWx1ZSkpID0gU09DS0VUX0VSUk9SIHRoZW4KKyAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTb2NrZXQuU2V0S2VlcEFsaXZlKCkgc2V0c29ja29wdCgpICVzICVzJywgW1NvY2tldEluZm8sIFN5c0Vycm9yTWVzc2FnZShXU0FHZXRMYXN0RXJyb3IpXSkpOworZW5kOworCitjb25zdHJ1Y3RvciBUU29ja2V0LkNyZWF0ZShBTG9nRGVsZWdhdGU6IFRCYXNlU29ja2V0LlRMb2dEZWxlZ2F0ZSA9IG5pbCk7CitiZWdpbgorICAvLyBOb3QgbmVlZGVkLCBidXQganVzdCBhIHBsYWNlaG9sZGVyCisgIGluaGVyaXRlZCBDcmVhdGUoQUxvZ0RlbGVnYXRlKTsKK2VuZDsKKworY29uc3RydWN0b3IgVFNvY2tldC5DcmVhdGUoQUhvc3Q6IHN0cmluZzsgQVBvcnQ6IEludGVnZXI7IEFMb2dEZWxlZ2F0ZTogVEJhc2VTb2NrZXQuVExvZ0RlbGVnYXRlKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGUoQVBvcnQsIEFMb2dEZWxlZ2F0ZSk7CisgIEZIb3N0IDo9IEFIb3N0OworZW5kOworCitjb25zdHJ1Y3RvciBUU29ja2V0LkNyZWF0ZShBU29ja2V0OiBXaW5hcGkuV2luc29jazIuVFNvY2tldDsgQUxvZ0RlbGVnYXRlOiBUQmFzZVNvY2tldC5UTG9nRGVsZWdhdGUpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZShBTG9nRGVsZWdhdGUpOworICBTb2NrZXQgOj0gQVNvY2tldDsKK2VuZDsKKworY29uc3RydWN0b3IgVFNvY2tldC5DcmVhdGUoQVNvY2tldDogV2luYXBpLldpbnNvY2syLlRTb2NrZXQ7IEFJbnRlcnJ1cHRMaXN0ZW5lcjogSVNtYXJ0UG9pbnRlcjxXaW5hcGkuV2luc29jazIuVFNvY2tldD47CisgIEFMb2dEZWxlZ2F0ZTogVEJhc2VTb2NrZXQuVExvZ0RlbGVnYXRlKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGUoQUxvZ0RlbGVnYXRlKTsKKyAgU29ja2V0IDo9IEFTb2NrZXQ7CisgIEZJbnRlcnJ1cHRMaXN0ZW5lciA6PSBBSW50ZXJydXB0TGlzdGVuZXI7CitlbmQ7CisKK3Byb2NlZHVyZSBUU29ja2V0Lk9wZW47CitiZWdpbgorICBpZiBJc09wZW4gdGhlbiBFeGl0OworICBMb2NhbE9wZW47CitlbmQ7CisKK3Byb2NlZHVyZSBUU29ja2V0LkNsb3NlOworYmVnaW4KKyAgaW5oZXJpdGVkIENsb3NlOworICBJbml0UGVlckluZm87CitlbmQ7CisKK2Z1bmN0aW9uIFRTb2NrZXQuUmVhZCh2YXIgQnVmOyBMZW46IEludGVnZXIpOiBJbnRlZ2VyOworbGFiZWwKKyAgVHJ5QWdhaW47Cit2YXIKKyAgUmV0cmllczogTG9uZ3dvcmQ7CisgIEVBZ2FpblRocmVzaG9sZCwKKyAgUmVhZEVsYXBzZWQ6IFVJbnQ2NDsKKyAgU3RhcnQ6IFREYXRlVGltZTsKKyAgR290OiBJbnRlZ2VyOworICBGZHM6IFRGZFNldDsKKyAgRXJybm9Db3B5OiBJbnRlZ2VyOworICBUVmFsOiBUVGltZVZhbDsKKyAgUFRWYWw6IFBUaW1lVmFsOworICBSZXQ6IEludGVnZXI7CitiZWdpbgorICBpZiBTb2NrZXQgPSBJTlZBTElEX1NPQ0tFVCB0aGVuCisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdDYWxsZWQgcmVhZCBvbiBub24tb3BlbiBzb2NrZXQnKTsKKworICBSZXRyaWVzIDo9IDA7CisKKyAgLy8gVEhSSUZUX0VBR0FJTiBjYW4gYmUgc2lnbmFsbGVkIGJvdGggd2hlbiBhIHRpbWVvdXQgaGFzIG9jY3VycmVkIGFuZCB3aGVuCisgIC8vIHRoZSBzeXN0ZW0gaXMgb3V0IG9mIHJlc291cmNlcyAoYW4gYXdlc29tZSB1bmRvY3VtZW50ZWQgZmVhdHVyZSkuCisgIC8vIFRoZSBmb2xsb3dpbmcgaXMgYW4gYXBwcm94aW1hdGlvbiBvZiB0aGUgdGltZSBpbnRlcnZhbCB1bmRlciB3aGljaAorICAvLyBUSFJJRlRfRUFHQUlOIGlzIHRha2VuIHRvIGluZGljYXRlIGFuIG91dCBvZiByZXNvdXJjZXMgZXJyb3IuCisgIEVBZ2FpblRocmVzaG9sZCA6PSAwOworICBpZiBSZWN2VGltZW91dCA8PiAwIHRoZW4KKyAgICAvLyBpZiBhIHJlYWRUaW1lb3V0IGlzIHNwZWNpZmllZCBhbG9uZyB3aXRoIGEgbWF4IG51bWJlciBvZiByZWN2IHJldHJpZXMsIHRoZW4KKyAgICAvLyB0aGUgdGhyZXNob2xkIHdpbGwgZW5zdXJlIHRoYXQgdGhlIHJlYWQgdGltZW91dCBpcyBub3QgZXhjZWVkZWQgZXZlbiBpbiB0aGUKKyAgICAvLyBjYXNlIG9mIHJlc291cmNlIGVycm9ycworICAgIEVBZ2FpblRocmVzaG9sZCA6PSBSZWN2VGltZW91dCBkaXYgSWZUaGVuKEZNYXhSZWN2UmV0cmllcyA+IDAsIEZNYXhSZWN2UmV0cmllcywgMik7CisKK1RyeUFnYWluOgorICAvLyBSZWFkIGZyb20gdGhlIHNvY2tldAorICBpZiBSZWN2VGltZW91dCA+IDAgdGhlbgorICAgIFN0YXJ0IDo9IE5vdworICBlbHNlCisgICAgLy8gaWYgdGhlcmUgaXMgbm8gcmVhZCB0aW1lb3V0IHdlIGRvbid0IG5lZWQgdGhlIFRPRCB0byBkZXRlcm1pbmUgd2hldGhlcgorICAgIC8vIGFuIFRIUklGVF9FQUdBSU4gaXMgZHVlIHRvIGEgdGltZW91dCBvciBhbiBvdXQtb2YtcmVzb3VyY2UgY29uZGl0aW9uLgorICAgIFN0YXJ0IDo9IDA7CisKKyAgaWYgQXNzaWduZWQoRkludGVycnVwdExpc3RlbmVyKSB0aGVuIGJlZ2luCisgICAgRkRfWkVSTyhGZHMpOworICAgIF9GRF9TRVQoU29ja2V0LCBGZHMpOworICAgIF9GRF9TRVQoRkludGVycnVwdExpc3RlbmVyLCBGZHMpOworICAgIGlmIFJlY3ZUaW1lb3V0ID4gMCB0aGVuIGJlZ2luCisgICAgICBUVmFsLnR2X3NlYyA6PSBSZWN2VGltZW91dCBkaXYgMTAwMDsKKyAgICAgIFRWYWwudHZfdXNlYyA6PSAoUmVjdlRpbWVvdXQgbW9kIDEwMDApICogMTAwMDsKKyAgICAgIFBUVmFsIDo9IEBUVmFsOworICAgIGVuZAorICAgIGVsc2UKKyAgICAgIFBUVmFsIDo9IG5pbDsKKworICAgIFJldCA6PSBzZWxlY3QoMiwgQEZkcywgbmlsLCBuaWwsIFBUVmFsKTsKKyAgICBFcnJub0NvcHkgOj0gV1NBR2V0TGFzdEVycm9yOworICAgIGlmIFJldCA8IDAgdGhlbiBiZWdpbgorICAgICAgLy8gZXJyb3IgY2FzZXMKKyAgICAgIGlmIChFcnJub0NvcHkgPSBXU0FFSU5UUikgYW5kIChSZXRyaWVzIDwgRk1heFJlY3ZSZXRyaWVzKSB0aGVuIGJlZ2luCisgICAgICAgIEluYyhSZXRyaWVzKTsKKyAgICAgICAgZ290byBUcnlBZ2FpbjsKKyAgICAgIGVuZDsKKyAgICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNvY2tldC5SZWFkKCkgc2VsZWN0KCkgJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoRm9ybWF0KCdVbmtub3duOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICBlbmQKKyAgICBlbHNlIGlmIFJldCA+IDAgdGhlbiBiZWdpbgorICAgICAgLy8gQ2hlY2sgdGhlIGludGVycnVwdExpc3RlbmVyCisgICAgICBpZiBGRF9JU1NFVChGSW50ZXJydXB0TGlzdGVuZXIsIEZkcykgdGhlbgorICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uSW50ZXJydXB0ZWQuQ3JlYXRlKCdJbnRlcnJ1cHRlZCcpOworICAgIGVuZAorICAgIGVsc2UgLy8gUmV0ID0gMAorICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblRpbWVkT3V0LkNyZWF0ZSgnV1NBRVdPVUxEQkxPQ0sgKHRpbWVkIG91dCknKTsKKworICAgIC8vIGZhbGxpbmcgdGhyb3VnaCBtZWFucyB0aGVyZSBpcyBzb21ldGhpbmcgdG8gcmVjdiBhbmQgaXQgY2Fubm90IGJsb2NrCisgIGVuZDsKKworICBHb3QgOj0gcmVjdihTb2NrZXQsIEJ1ZiwgTGVuLCAwKTsKKyAgRXJybm9Db3B5IDo9IFdTQUdldExhc3RFcnJvcjsKKyAgLy8gQ2hlY2sgZm9yIGVycm9yIG9uIHJlYWQKKyAgaWYgR290IDwgMCB0aGVuIGJlZ2luCisgICAgaWYgRXJybm9Db3B5ID0gV1NBRVdPVUxEQkxPQ0sgdGhlbiBiZWdpbgorICAgICAgLy8gaWYgbm8gdGltZW91dCB3ZSBjYW4gYXNzdW1lIHRoYXQgcmVzb3VyY2UgZXhoYXVzdGlvbiBoYXMgb2NjdXJyZWQuCisgICAgICBpZiBSZWN2VGltZW91dCA9IDAgdGhlbgorICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVGltZWRPdXQuQ3JlYXRlKCdXU0FFV09VTERCTE9DSyAodW5hdmFpbGFibGUgcmVzb3VyY2VzKScpOworICAgICAgLy8gY2hlY2sgaWYgdGhpcyBpcyB0aGUgbGFjayBvZiByZXNvdXJjZXMgb3IgdGltZW91dCBjYXNlCisgICAgICBSZWFkRWxhcHNlZCA6PSBNaWxsaVNlY29uZHNCZXR3ZWVuKE5vdywgU3RhcnQpOworICAgICAgaWYgKEVBZ2FpblRocmVzaG9sZCA9IDApIG9yIChSZWFkRWxhcHNlZCA8IEVBZ2FpblRocmVzaG9sZCkgdGhlbiBiZWdpbgorICAgICAgICBpZiBSZXRyaWVzIDwgRk1heFJlY3ZSZXRyaWVzIHRoZW4gYmVnaW4KKyAgICAgICAgICBJbmMoUmV0cmllcyk7CisgICAgICAgICAgU2xlZXAoMSk7CisgICAgICAgICAgZ290byBUcnlBZ2FpbjsKKyAgICAgICAgZW5kCisgICAgICAgIGVsc2UKKyAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVGltZWRPdXQuQ3JlYXRlKCdXU0FFV09VTERCTE9DSyAodW5hdmFpbGFibGUgcmVzb3VyY2VzKScpOworICAgICAgZW5kCisgICAgICBlbHNlCisgICAgICAgIC8vIGluZmVyIHRoYXQgdGltZW91dCBoYXMgYmVlbiBoaXQKKyAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblRpbWVkT3V0LkNyZWF0ZSgnV1NBRVdPVUxEQkxPQ0sgKHRpbWVkIG91dCknKTsKKyAgICBlbmQ7CisKKyAgICAvLyBJZiBpbnRlcnJ1cHRlZCwgdHJ5IGFnYWluCisgICAgaWYgKEVycm5vQ29weSA9IFdTQUVJTlRSKSBhbmQgKFJldHJpZXMgPCBGTWF4UmVjdlJldHJpZXMpIHRoZW4gYmVnaW4KKyAgICAgIEluYyhSZXRyaWVzKTsKKyAgICAgIGdvdG8gVHJ5QWdhaW47CisgICAgZW5kOworCisgICAgaWYgRXJybm9Db3B5ID0gV1NBRUNPTk5SRVNFVCB0aGVuCisgICAgICBFeGl0KDApOworCisgICAgLy8gVGhpcyBpc2ggaXNuJ3Qgb3BlbgorICAgIGlmIEVycm5vQ29weSA9IFdTQUVOT1RDT05OIHRoZW4KKyAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnV1NBRU5PVENPTk4nKTsKKworICAgIC8vIFRpbWVkIG91dCEKKyAgICBpZiBFcnJub0NvcHkgPSBXU0FFVElNRURPVVQgdGhlbgorICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdXU0FFVElNRURPVVQnKTsKKworICAgIC8vIE5vdyBpdCdzIG5vdCBhIHRyeSBhZ2FpbiBjYXNlLCBidXQgYSByZWFsIHByb2JibGV6CisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU29ja2V0LlJlYWQoKSByZWN2KCkgJXMgJXMnLCBbU29ja2V0SW5mbywgU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisKKyAgICAvLyBTb21lIG90aGVyIGVycm9yLCB3aGF0ZXZ6CisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKEZvcm1hdCgnVW5rbm93bjogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgIGVuZDsKKworICBSZXN1bHQgOj0gR290OworZW5kOworCitwcm9jZWR1cmUgVFNvY2tldC5Xcml0ZShjb25zdCBCdWY7IExlbjogSW50ZWdlcik7Cit2YXIKKyAgU2VudCwgQjogSW50ZWdlcjsKK2JlZ2luCisgIFNlbnQgOj0gMDsKKyAgd2hpbGUgU2VudCA8IExlbiBkbyBiZWdpbgorICAgIEIgOj0gV3JpdGVQYXJ0aWFsKChQQnl0ZShAQnVmKSArIFNlbnQpXiwgTGVuIC0gU2VudCk7CisgICAgaWYgQiA9IDAgdGhlbgorICAgICAgLy8gVGhpcyBzaG91bGQgb25seSBoYXBwZW4gaWYgdGhlIHRpbWVvdXQgc2V0IHdpdGggU09fU05EVElNRU8gZXhwaXJlZC4KKyAgICAgIC8vIFJhaXNlIGFuIGV4Y2VwdGlvbi4KKyAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25UaW1lZE91dC5DcmVhdGUoJ3NlbmQgdGltZW91dCBleHBpcmVkJyk7CisgICAgSW5jKFNlbnQsIEIpOworICBlbmQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRTb2NrZXQuV3JpdGVQYXJ0aWFsKGNvbnN0IEJ1ZjsgTGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsKK3ZhcgorICBCOiBJbnRlZ2VyOworICBFcnJub0NvcHk6IEludGVnZXI7CitiZWdpbgorICBpZiBTb2NrZXQgPSBJTlZBTElEX1NPQ0tFVCB0aGVuCisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdDYWxsZWQgd3JpdGUgb24gbm9uLW9wZW4gc29ja2V0Jyk7CisKKyAgQiA6PSBzZW5kKFNvY2tldCwgQnVmLCBMZW4sIDApOworCisgIGlmIEIgPCAwIHRoZW4gYmVnaW4KKyAgICAvLyBGYWlsIG9uIGEgc2VuZCBlcnJvcgorICAgIEVycm5vQ29weSA6PSBXU0FHZXRMYXN0RXJyb3I7CisgICAgaWYgRXJybm9Db3B5ID0gV1NBRVdPVUxEQkxPQ0sgdGhlbgorICAgICAgRXhpdCgwKTsKKworICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNvY2tldC5Xcml0ZVBhcnRpYWwoKSBzZW5kKCkgJXMgJXMnLCBbU29ja2V0SW5mbywgU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisKKyAgICBpZiAoRXJybm9Db3B5ID0gV1NBRUNPTk5SRVNFVCkgb3IgKEVycm5vQ29weSA9IFdTQUVOT1RDT05OKSB0aGVuIGJlZ2luCisgICAgICBDbG9zZTsKKyAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZShGb3JtYXQoJ3dyaXRlKCkgc2VuZCgpOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICBlbmQ7CisKKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoRm9ybWF0KCd3cml0ZSgpIHNlbmQoKTogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgIGVuZDsKKworICAvLyBGYWlsIG9uIGJsb2NrZWQgc2VuZAorICBpZiBCID0gMCB0aGVuCisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdTb2NrZXQgc2VuZCByZXR1cm5lZCAwLicpOworCisgIFJlc3VsdCA6PSBCOworZW5kOworCitmdW5jdGlvbiBUU29ja2V0LkdldENhY2hlZEFkZHJlc3Mob3V0IExlbjogSW50ZWdlcik6IFBTb2NrQWRkcjsKK2JlZ2luCisgIGNhc2UgRkNhY2hlZFBlZXJBZGRyLmlwdjQuc2luX2ZhbWlseSBvZgorICAgIEFGX0lORVQ6IGJlZ2luCisgICAgICBMZW4gOj0gU2l6ZU9mKFRTb2NrQWRkckluKTsKKyAgICAgIFJlc3VsdCA6PSBQU29ja0FkZHIoQEZDYWNoZWRQZWVyQWRkci5pcHY0KTsKKyAgICBlbmQ7CisgICAgQUZfSU5FVDY6IGJlZ2luCisgICAgICBMZW4gOj0gU2l6ZU9mKFRTb2NrQWRkckluNik7CisgICAgICBSZXN1bHQgOj0gUFNvY2tBZGRyKEBGQ2FjaGVkUGVlckFkZHIuaXB2Nik7CisgICAgZW5kOworICBlbHNlCisgICAgTGVuIDo9IDA7CisgICAgUmVzdWx0IDo9IG5pbDsKKyAgZW5kOworZW5kOworCitwcm9jZWR1cmUgVFNvY2tldC5TZXRDYWNoZWRBZGRyZXNzKGNvbnN0IEFkZHI6IFRTb2NrQWRkcjsgTGVuOiBJbnRlZ2VyKTsKK2JlZ2luCisgIGNhc2UgQWRkci5zYV9mYW1pbHkgb2YKKyAgICBBRl9JTkVUOiBpZiBMZW4gPSBTaXplT2YoVFNvY2tBZGRySW4pIHRoZW4gRkNhY2hlZFBlZXJBZGRyLmlwdjQgOj0gUFNvY2tBZGRySW4oQEFkZHIpXjsKKyAgICBBRl9JTkVUNjogaWYgTGVuID0gU2l6ZU9mKFRTb2NrQWRkckluNikgdGhlbiBGQ2FjaGVkUGVlckFkZHIuaXB2NiA6PSBQU29ja0FkZHJJbjYoQEFkZHIpXjsKKyAgZW5kOworICBGUGVlckFkZHJlc3MgOj0gJyc7CisgIEZQZWVySG9zdCA6PSAnJzsKKyAgRlBlZXJQb3J0IDo9IDA7CitlbmQ7CisKK3Byb2NlZHVyZSBUU29ja2V0LlNldExpbmdlcihMaW5nZXJPbjogQm9vbGVhbjsgTGluZ2VyVmFsOiBJbnRlZ2VyKTsKK3ZhcgorICBMOiBUTGluZ2VyOworYmVnaW4KKyAgRkxpbmdlck9uIDo9IExpbmdlck9uOworICBGTGluZ2VyVmFsIDo9IExpbmdlclZhbDsKKyAgaWYgU29ja2V0ID0gSU5WQUxJRF9TT0NLRVQgdGhlbgorICAgIEV4aXQ7CisKKyAgTC5sX29ub2ZmIDo9IElmVGhlbihGTGluZ2VyT24sIDEsIDApOworICBMLmxfbGluZ2VyIDo9IExpbmdlclZhbDsKKworICBpZiBzZXRzb2Nrb3B0KFNvY2tldCwgU09MX1NPQ0tFVCwgU09fTElOR0VSLCBATCwgU2l6ZU9mKEwpKSA9IFNPQ0tFVF9FUlJPUiB0aGVuCisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU29ja2V0LlNldExpbmdlcigpIHNldHNvY2tvcHQoKSAlcyAlcycsIFtTb2NrZXRJbmZvLCBTeXNFcnJvck1lc3NhZ2UoV1NBR2V0TGFzdEVycm9yKV0pKTsKK2VuZDsKKworZnVuY3Rpb24gVFNvY2tldC5QZWVrOiBCb29sZWFuOwordmFyCisgIFJldHJpZXM6IExvbmd3b3JkOworICBGZHM6IFRGZFNldDsKKyAgVFZhbDogVFRpbWVWYWw7CisgIFBUVmFsOiBQVGltZVZhbDsKKyAgUmV0OiBJbnRlZ2VyOworICBFcnJub0NvcHk6IEludGVnZXI7CisgIEJ1ZjogQnl0ZTsKK2JlZ2luCisgIGlmIG5vdCBJc09wZW4gdGhlbiBFeGl0KEZhbHNlKTsKKworICBpZiBBc3NpZ25lZChGSW50ZXJydXB0TGlzdGVuZXIpIHRoZW4gYmVnaW4KKyAgICBSZXRyaWVzIDo9IDA7CisgICAgd2hpbGUgdHJ1ZSBkbyBiZWdpbgorICAgICAgRkRfWkVSTyhGZHMpOworICAgICAgX0ZEX1NFVChTb2NrZXQsIEZkcyk7CisgICAgICBfRkRfU0VUKEZJbnRlcnJ1cHRMaXN0ZW5lciwgRmRzKTsKKyAgICAgIGlmIFJlY3ZUaW1lb3V0ID4gMCB0aGVuIGJlZ2luCisgICAgICAgIFRWYWwudHZfc2VjIDo9IFJlY3ZUaW1lb3V0IGRpdiAxMDAwOworICAgICAgICBUVmFsLnR2X3VzZWMgOj0gKFJlY3ZUaW1lb3V0IG1vZCAxMDAwKSAqIDEwMDA7CisgICAgICAgIFBUVmFsIDo9IEBUVmFsOworICAgICAgZW5kCisgICAgICBlbHNlCisgICAgICAgIFBUVmFsIDo9IG5pbDsKKworICAgICAgUmV0IDo9IHNlbGVjdCgyLCBARmRzLCBuaWwsIG5pbCwgUFRWYWwpOworICAgICAgRXJybm9Db3B5IDo9IFdTQUdldExhc3RFcnJvcjsKKyAgICAgIGlmIFJldCA8IDAgdGhlbiBiZWdpbgorICAgICAgICAvLyBlcnJvciBjYXNlcworICAgICAgICBpZiAoRXJybm9Db3B5ID0gV1NBRUlOVFIpIGFuZCAoUmV0cmllcyA8IEZNYXhSZWN2UmV0cmllcykgdGhlbiBiZWdpbgorICAgICAgICAgIEluYyhSZXRyaWVzKTsKKyAgICAgICAgICBDb250aW51ZTsKKyAgICAgICAgZW5kOworICAgICAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTb2NrZXQuUGVlaygpIHNlbGVjdCgpICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoRm9ybWF0KCdVbmtub3duOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICAgIGVuZAorICAgICAgZWxzZSBpZiBSZXQgPiAwIHRoZW4gYmVnaW4KKyAgICAgICAgLy8gQ2hlY2sgdGhlIGludGVycnVwdExpc3RlbmVyCisgICAgICAgIGlmIEZEX0lTU0VUKEZJbnRlcnJ1cHRMaXN0ZW5lciwgRmRzKSB0aGVuCisgICAgICAgICAgRXhpdChGYWxzZSk7CisgICAgICAgIC8vIFRoZXJlIG11c3QgYmUgZGF0YSBvciBhIGRpc2Nvbm5lY3Rpb24sIGZhbGwgdGhyb3VnaCB0byB0aGUgUEVFSworICAgICAgICBCcmVhazsKKyAgICAgIGVuZAorICAgICAgZWxzZQorICAgICAgICAvLyB0aW1lb3V0CisgICAgICAgIEV4aXQoRmFsc2UpOworICAgIGVuZDsKKyAgZW5kOworCisgIC8vIENoZWNrIHRvIHNlZSBpZiBkYXRhIGlzIGF2YWlsYWJsZSBvciBpZiB0aGUgcmVtb3RlIHNpZGUgY2xvc2VkCisgIFJldCA6PSByZWN2KFNvY2tldCwgQnVmLCAxLCBNU0dfUEVFSyk7CisgIGlmIFJldCA9IFNPQ0tFVF9FUlJPUiB0aGVuIGJlZ2luCisgICAgRXJybm9Db3B5IDo9IFdTQUdldExhc3RFcnJvcjsKKyAgICBpZiBFcnJub0NvcHkgPSBXU0FFQ09OTlJFU0VUIHRoZW4gYmVnaW4KKyAgICAgIENsb3NlOworICAgICAgRXhpdChGYWxzZSk7CisgICAgZW5kOworICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNvY2tldC5QZWVrKCkgcmVjdigpICVzICVzJywgW1NvY2tldEluZm8sIFN5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Vbmtub3duLkNyZWF0ZShGb3JtYXQoJ3JlY3YoKTogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgIGVuZDsKKyAgUmVzdWx0IDo9IFJldCA+IDA7CitlbmQ7CisKK2Z1bmN0aW9uIFRTZXJ2ZXJTb2NrZXQuQ3JlYXRlU29ja2V0T2JqKENsaWVudDogV2luYXBpLldpbnNvY2syLlRTb2NrZXQpOiBUU29ja2V0OworYmVnaW4KKyAgaWYgRkludGVycnVwdGFibGVDaGlsZHJlbiB0aGVuCisgICAgUmVzdWx0IDo9IFRTb2NrZXQuQ3JlYXRlKENsaWVudCwgRkNoaWxkSW50ZXJydXB0U29ja1JlYWRlcikKKyAgZWxzZQorICAgIFJlc3VsdCA6PSBUU29ja2V0LkNyZWF0ZShDbGllbnQpOworZW5kOworCitwcm9jZWR1cmUgVFNlcnZlclNvY2tldC5Ob3RpZnkoTm90aWZ5U29ja2V0OiBXaW5hcGkuV2luc29jazIuVFNvY2tldCk7Cit2YXIKKyAgQnl0OiBCeXRlOworYmVnaW4KKyAgaWYgTm90aWZ5U29ja2V0IDw+IElOVkFMSURfU09DS0VUIHRoZW4gYmVnaW4KKyAgICBCeXQgOj0gMDsKKyAgICBpZiBzZW5kKE5vdGlmeVNvY2tldCwgQnl0LCBTaXplT2YoQnl0KSwgMCkgPSBTT0NLRVRfRVJST1IgdGhlbgorICAgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU2VydmVyU29ja2V0Lk5vdGlmeSgpIHNlbmQoKSAlcycsIFtTeXNFcnJvck1lc3NhZ2UoV1NBR2V0TGFzdEVycm9yKV0pKTsKKyAgZW5kOworZW5kOworCitwcm9jZWR1cmUgVFNlcnZlclNvY2tldC5TZXRJbnRlcnJ1cHRhYmxlQ2hpbGRyZW4oQVZhbHVlOiBCb29sZWFuKTsKK2JlZ2luCisgIGlmIEZMaXN0ZW5pbmcgdGhlbgorICAgIHJhaXNlIEV4Y2VwdGlvbi5DcmVhdGUoJ0ludGVycnVwdGFibGVDaGlsZHJlbiBjYW5ub3QgYmUgc2V0IGFmdGVyIGxpc3RlbigpJyk7CisgIEZJbnRlcnJ1cHRhYmxlQ2hpbGRyZW4gOj0gQVZhbHVlOworZW5kOworCitwcm9jZWR1cmUgVFNlcnZlclNvY2tldC5Db21tb25Jbml0OworYmVnaW4KKyAgaW5oZXJpdGVkIENvbW1vbkluaXQ7CisgIEZJbnRlcnJ1cHRhYmxlQ2hpbGRyZW4gOj0gVHJ1ZTsKKyAgRkFjY2VwdEJhY2tsb2cgOj0gREVGQVVMVF9CQUNLTE9HOworICBGQWNjZXB0VGltZW91dCA6PSAwOworICBGUmV0cnlMaW1pdCA6PSAwOworICBGUmV0cnlEZWxheSA6PSAwOworICBGVGNwU2VuZEJ1ZmZlciA6PSAwOworICBGVGNwUmVjdkJ1ZmZlciA6PSAwOworICBGTGlzdGVuaW5nIDo9IEZhbHNlOworICBGSW50ZXJydXB0U29ja1dyaXRlciA6PSBJTlZBTElEX1NPQ0tFVDsKKyAgRkludGVycnVwdFNvY2tSZWFkZXIgOj0gSU5WQUxJRF9TT0NLRVQ7CisgIEZDaGlsZEludGVycnVwdFNvY2tXcml0ZXIgOj0gSU5WQUxJRF9TT0NLRVQ7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRTZXJ2ZXJTb2NrZXQuQ3JlYXRlKEFQb3J0OiBJbnRlZ2VyOyBBTG9nRGVsZWdhdGU6IFRCYXNlU29ja2V0LlRMb2dEZWxlZ2F0ZSA9IG5pbCk7CitiZWdpbgorICAvLyBVbm5lY2Vzc2FyeSwgYnV0IGhlcmUgZm9yIGRvY3VtZW50YXRpb24gcHVycG9zZXMKKyAgaW5oZXJpdGVkIENyZWF0ZShBUG9ydCwgQUxvZ0RlbGVnYXRlKTsKK2VuZDsKKworY29uc3RydWN0b3IgVFNlcnZlclNvY2tldC5DcmVhdGUoQVBvcnQ6IEludGVnZXI7IEFTZW5kVGltZW91dCwgQVJlY3ZUaW1lb3V0OiBMb25nd29yZDsgQUxvZ0RlbGVnYXRlOiBUQmFzZVNvY2tldC5UTG9nRGVsZWdhdGUpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZShBUG9ydCwgQUxvZ0RlbGVnYXRlKTsKKyAgU2VuZFRpbWVvdXQgOj0gQVNlbmRUaW1lb3V0OworICBSZWN2VGltZW91dCA6PSBBUmVjdlRpbWVvdXQ7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRTZXJ2ZXJTb2NrZXQuQ3JlYXRlKEFBZGRyZXNzOiBzdHJpbmc7IEFQb3J0OiBJbnRlZ2VyOyBBTG9nRGVsZWdhdGU6IFRCYXNlU29ja2V0LlRMb2dEZWxlZ2F0ZSk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlKEFQb3J0LCBBTG9nRGVsZWdhdGUpOworICBGQWRkcmVzcyA6PSBBQWRkcmVzczsKK2VuZDsKKworcHJvY2VkdXJlIFRTZXJ2ZXJTb2NrZXQuTGlzdGVuOworCisgIGZ1bmN0aW9uIENyZWF0ZVNvY2tldFBhaXIodmFyIFJlYWRlciwgV3JpdGVyOiBXaW5hcGkuV2luc29jazIuVFNvY2tldCk6IEludGVnZXI7CisgIGxhYmVsCisgICAgRXJyb3I7CisgIHR5cGUKKyAgICBUU0FVbmlvbiA9IHJlY29yZAorICAgIGNhc2UgSW50ZWdlciBvZgorICAgICAgMDogKGluYWRkcjogVFNvY2tBZGRySW4pOworICAgICAgMTogKGFkZHI6IFRTb2NrQWRkcik7CisgICAgZW5kOworICB2YXIKKyAgICBhOiBUU0FVbmlvbjsKKyAgICBsaXN0ZW5lcjogV2luYXBpLldpbnNvY2syLlRTb2NrZXQ7CisgICAgZTogSW50ZWdlcjsKKyAgICBhZGRybGVuOiBJbnRlZ2VyOworICAgIGZsYWdzOiBEV09SRDsKKyAgICByZXVzZTogSW50ZWdlcjsKKyAgYmVnaW4KKyAgICBhZGRybGVuIDo9IFNpemVPZihhLmluYWRkcik7CisgICAgZmxhZ3MgOj0gMDsKKyAgICByZXVzZSA6PSAxOworCisgICAgbGlzdGVuZXIgOj0gV2luYXBpLldpbnNvY2syLnNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1ApOworICAgIGlmIGxpc3RlbmVyID0gSU5WQUxJRF9TT0NLRVQgdGhlbgorICAgICAgRXhpdChTT0NLRVRfRVJST1IpOworCisgICAgRmlsbENoYXIoYSwgU2l6ZU9mKGEpLCAwKTsKKyAgICBhLmluYWRkci5zaW5fZmFtaWx5IDo9IEFGX0lORVQ7CisgICAgYS5pbmFkZHIuc2luX2FkZHIuc19hZGRyIDo9IGh0b25sKElOQUREUl9MT09QQkFDSyk7CisgICAgYS5pbmFkZHIuc2luX3BvcnQgOj0gMDsKKyAgICBSZWFkZXIgOj0gSU5WQUxJRF9TT0NLRVQ7CisgICAgV3JpdGVyIDo9IElOVkFMSURfU09DS0VUOworCisgICAgLy8gaWdub3JlIGVycm9ycyBjb21pbmcgb3V0IG9mIHRoaXMgc2V0c29ja29wdC4gIFRoaXMgaXMgYmVjYXVzZQorICAgIC8vIFNPX0VYQ0xVU0lWRUFERFJVU0UgcmVxdWlyZXMgYWRtaW4gcHJpdmlsZWdlcyBvbiBXaW5YUCwgYnV0IHdlIGRvbid0CisgICAgLy8gd2FudCB0byBmb3JjZSBzb2NrZXQgcGFpcnMgdG8gYmUgYW4gYWRtaW4uCisgICAgc2V0c29ja29wdChsaXN0ZW5lciwgU09MX1NPQ0tFVCwgSW50ZWdlcihTT19FWENMVVNJVkVBRERSVVNFKSwgQHJldXNlLCBTaXplT2YocmV1c2UpKTsKKyAgICBpZiBiaW5kKGxpc3RlbmVyLCBhLmFkZHIsIFNpemVPZihhLmluYWRkcikpID0gU09DS0VUX0VSUk9SIHRoZW4KKyAgICAgIGdvdG8gRXJyb3I7CisKKyAgICBpZiBnZXRzb2NrbmFtZShsaXN0ZW5lciwgYS5hZGRyLCBhZGRybGVuKSA9IFNPQ0tFVF9FUlJPUiB0aGVuCisgICAgICBnb3RvIEVycm9yOworCisgICAgaWYgV2luYXBpLldpbnNvY2syLmxpc3RlbihsaXN0ZW5lciwgMSkgPSBTT0NLRVRfRVJST1IgdGhlbgorICAgICAgZ290byBFcnJvcjsKKworICAgIFJlYWRlciA6PSBXU0FTb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIDAsIG5pbCwgMCwgZmxhZ3MpOworICAgIGlmIFJlYWRlciA9IElOVkFMSURfU09DS0VUIHRoZW4KKyAgICAgIGdvdG8gRXJyb3I7CisKKyAgICBpZiBjb25uZWN0KFJlYWRlciwgYS5hZGRyLCBTaXplT2YoYS5pbmFkZHIpKSA9IFNPQ0tFVF9FUlJPUiB0aGVuCisgICAgICBnb3RvIEVycm9yOworCisgICAgV3JpdGVyIDo9IFdpbmFwaS5XaW5zb2NrMi5hY2NlcHQobGlzdGVuZXIsIG5pbCwgbmlsKTsKKyAgICBpZiBXcml0ZXIgPSBJTlZBTElEX1NPQ0tFVCB0aGVuCisgICAgICBnb3RvIEVycm9yOworCisgICAgY2xvc2Vzb2NrZXQobGlzdGVuZXIpOworICAgIEV4aXQoMCk7CisKKyAgRXJyb3I6CisgICAgZSA6PSBXU0FHZXRMYXN0RXJyb3I7CisgICAgY2xvc2Vzb2NrZXQobGlzdGVuZXIpOworICAgIGNsb3Nlc29ja2V0KFJlYWRlcik7CisgICAgY2xvc2Vzb2NrZXQoV3JpdGVyKTsKKyAgICBXU0FTZXRMYXN0RXJyb3IoZSk7CisgICAgUmVzdWx0IDo9IFNPQ0tFVF9FUlJPUjsKKyAgZW5kOworCit2YXIKKyAgVGVtcEludFJlYWRlciwKKyAgVGVtcEludFdyaXRlcjogV2luYXBpLldpbnNvY2syLlRTb2NrZXQ7CisgIE9uZTogQ2FyZGluYWw7CisgIEVycm5vQ29weTogSW50ZWdlcjsKKyAgTGluZzogVExpbmdlcjsKKyAgUmV0cmllczogSW50ZWdlcjsKKyAgQWRkckluZm86IElHZXRBZGRySW5mb1dyYXBwZXI7CisgIFNBOiBUU29ja0FkZHJTdG9yYWdlOworICBMZW46IEludGVnZXI7CitiZWdpbgorICAvLyBDcmVhdGUgdGhlIHNvY2tldCBwYWlyIHVzZWQgdG8gaW50ZXJydXB0CisgIGlmIENyZWF0ZVNvY2tldFBhaXIoVGVtcEludFJlYWRlciwgVGVtcEludFdyaXRlcikgPSBTT0NLRVRfRVJST1IgdGhlbiBiZWdpbgorICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNlcnZlclNvY2tldC5MaXN0ZW4oKSBDcmVhdGVTb2NrZXRQYWlyKCkgSW50ZXJydXB0ICVzJywgW1N5c0Vycm9yTWVzc2FnZShXU0FHZXRMYXN0RXJyb3IpXSkpOworICAgIEZJbnRlcnJ1cHRTb2NrUmVhZGVyIDo9IElOVkFMSURfU09DS0VUOworICAgIEZJbnRlcnJ1cHRTb2NrV3JpdGVyIDo9IElOVkFMSURfU09DS0VUOworICBlbmQKKyAgZWxzZSBiZWdpbgorICAgIEZJbnRlcnJ1cHRTb2NrUmVhZGVyIDo9IFRlbXBJbnRSZWFkZXI7CisgICAgRkludGVycnVwdFNvY2tXcml0ZXIgOj0gVGVtcEludFdyaXRlcjsKKyAgZW5kOworCisgIC8vIENyZWF0ZSB0aGUgc29ja2V0IHBhaXIgdXNlZCB0byBpbnRlcnJ1cHQgYWxsIGNsaWVudHMKKyAgaWYgQ3JlYXRlU29ja2V0UGFpcihUZW1wSW50UmVhZGVyLCBUZW1wSW50V3JpdGVyKSA9IFNPQ0tFVF9FUlJPUiB0aGVuIGJlZ2luCisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU2VydmVyU29ja2V0Lkxpc3RlbigpIENyZWF0ZVNvY2tldFBhaXIoKSBDaGlsZEludGVycnVwdCAlcycsIFtTeXNFcnJvck1lc3NhZ2UoV1NBR2V0TGFzdEVycm9yKV0pKTsKKyAgICBGQ2hpbGRJbnRlcnJ1cHRTb2NrUmVhZGVyIDo9IFRTbWFydFBvaW50ZXI8V2luYXBpLldpbnNvY2syLlRTb2NrZXQ+LkNyZWF0ZShJTlZBTElEX1NPQ0tFVCwgbmlsKTsKKyAgICBGQ2hpbGRJbnRlcnJ1cHRTb2NrV3JpdGVyIDo9IElOVkFMSURfU09DS0VUOworICBlbmQKKyAgZWxzZSBiZWdpbgorICAgIEZDaGlsZEludGVycnVwdFNvY2tSZWFkZXIgOj0gVFNtYXJ0UG9pbnRlcjxXaW5hcGkuV2luc29jazIuVFNvY2tldD4uQ3JlYXRlKFRlbXBJbnRSZWFkZXIsIERlc3Ryb3llck9mRmluZVNvY2tldHMpOworICAgIEZDaGlsZEludGVycnVwdFNvY2tXcml0ZXIgOj0gVGVtcEludFdyaXRlcjsKKyAgZW5kOworCisgIGlmIChQb3J0IDwgMCkgb3IgKFBvcnQgPiAkRkZGRikgdGhlbgorICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25CYWRBcmdzLkNyZWF0ZSgnU3BlY2lmaWVkIHBvcnQgaXMgaW52YWxpZCcpOworCisgIEFkZHJJbmZvIDo9IENyZWF0ZVNvY2tldChGQWRkcmVzcywgUG9ydCk7CisKKyAgLy8gU2V0IFNPX0VYQ0xVU0lWRUFERFJVU0UgdG8gcHJldmVudCAyTVNMIGRlbGF5IG9uIGFjY2VwdAorICBPbmUgOj0gMTsKKyAgc2V0c29ja29wdChTb2NrZXQsIFNPTF9TT0NLRVQsIEludGVnZXIoU09fRVhDTFVTSVZFQUREUlVTRSksIEBvbmUsIFNpemVPZihPbmUpKTsKKyAgLy8gaWdub3JlIGVycm9ycyBjb21pbmcgb3V0IG9mIHRoaXMgc2V0c29ja29wdCBvbiBXaW5kb3dzLiAgVGhpcyBpcyBiZWNhdXNlCisgIC8vIFNPX0VYQ0xVU0lWRUFERFJVU0UgcmVxdWlyZXMgYWRtaW4gcHJpdmlsZWdlcyBvbiBXaW5YUCwgYnV0IHdlIGRvbid0CisgIC8vIHdhbnQgdG8gZm9yY2Ugc2VydmVycyB0byBiZSBhbiBhZG1pbi4KKworICAvLyBTZXQgVENQIGJ1ZmZlciBzaXplcworICBpZiBGVGNwU2VuZEJ1ZmZlciA+IDAgdGhlbiBiZWdpbgorICAgIGlmIHNldHNvY2tvcHQoU29ja2V0LCBTT0xfU09DS0VULCBTT19TTkRCVUYsIEBGVGNwU2VuZEJ1ZmZlciwgU2l6ZU9mKEZUY3BTZW5kQnVmZmVyKSkgPSBTT0NLRVRfRVJST1IgdGhlbiBiZWdpbgorICAgICAgRXJybm9Db3B5IDo9IFdTQUdldExhc3RFcnJvcjsKKyAgICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNlcnZlclNvY2tldC5MaXN0ZW4oKSBzZXRzb2Nrb3B0KCkgU09fU05EQlVGICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKEZvcm1hdCgnQ291bGQgbm90IHNldCBTT19TTkRCVUY6ICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgIGVuZDsKKyAgZW5kOworCisgIGlmIEZUY3BSZWN2QnVmZmVyID4gMCB0aGVuIGJlZ2luCisgICAgaWYgc2V0c29ja29wdChTb2NrZXQsIFNPTF9TT0NLRVQsIFNPX1JDVkJVRiwgQEZUY3BSZWN2QnVmZmVyLCBTaXplT2YoRlRjcFJlY3ZCdWZmZXIpKSA9IFNPQ0tFVF9FUlJPUiB0aGVuIGJlZ2luCisgICAgICBFcnJub0NvcHkgOj0gV1NBR2V0TGFzdEVycm9yOworICAgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU2VydmVyU29ja2V0Lkxpc3RlbigpIHNldHNvY2tvcHQoKSBTT19SQ1ZCVUYgJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoRm9ybWF0KCdDb3VsZCBub3Qgc2V0IFNPX1JDVkJVRjogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgZW5kOworICBlbmQ7CisKKyAgLy8gVHVybiBsaW5nZXIgb2ZmLCBkb24ndCB3YW50IHRvIGJsb2NrIG9uIGNhbGxzIHRvIGNsb3NlCisgIExpbmcubF9vbm9mZiA6PSAwOworICBMaW5nLmxfbGluZ2VyIDo9IDA7CisgIGlmIHNldHNvY2tvcHQoU29ja2V0LCBTT0xfU09DS0VULCBTT19MSU5HRVIsIEBMaW5nLCBTaXplT2YoTGluZykpID0gU09DS0VUX0VSUk9SIHRoZW4gYmVnaW4KKyAgICBFcnJub0NvcHkgOj0gV1NBR2V0TGFzdEVycm9yOworICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNlcnZlclNvY2tldC5MaXN0ZW4oKSBzZXRzb2Nrb3B0KCkgU09fTElOR0VSICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZShGb3JtYXQoJ0NvdWxkIG5vdCBzZXQgU09fTElOR0VSOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgZW5kOworCisgIC8vIFRDUCBOb2RlbGF5LCBzcGVlZCBvdmVyIGJhbmR3aWR0aAorICBpZiBzZXRzb2Nrb3B0KFNvY2tldCwgSVBQUk9UT19UQ1AsIFRDUF9OT0RFTEFZLCBAT25lLCBTaXplT2YoT25lKSkgPSBTT0NLRVRfRVJST1IgdGhlbiBiZWdpbgorICAgIEVycm5vQ29weSA6PSBXU0FHZXRMYXN0RXJyb3I7CisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU2VydmVyU29ja2V0Lkxpc3RlbigpIHNldHNvY2tvcHQoKSBUQ1BfTk9ERUxBWSAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoRm9ybWF0KCdDb3VsZCBub3Qgc2V0IFRDUF9OT0RFTEFZOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgZW5kOworCisgIC8vIFNldCBOT05CTE9DSyBvbiB0aGUgYWNjZXB0IHNvY2tldAorICBpZiBpb2N0bHNvY2tldChTb2NrZXQsIEludGVnZXIoRklPTkJJTyksIE9uZSkgPSBTT0NLRVRfRVJST1IgdGhlbiBiZWdpbgorICAgIEVycm5vQ29weSA6PSBXU0FHZXRMYXN0RXJyb3I7CisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU2VydmVyU29ja2V0Lkxpc3RlbigpIGlvY3Rsc29ja2V0KCkgRklPTkJJTyAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoRm9ybWF0KCdpb2N0bHNvY2tldCgpIEZJT05CSU86ICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICBlbmQ7CisKKyAgLy8gcHJlcGFyZSB0aGUgcG9ydCBpbmZvcm1hdGlvbgorICAvLyB3ZSBtYXkgd2FudCB0byB0cnkgdG8gYmluZCBtb3JlIHRoYW4gb25jZSwgc2luY2UgVEhSSUZUX05PX1NPQ0tFVF9DQUNISU5HIGRvZXNuJ3QKKyAgLy8gYWx3YXlzIHNlZW0gdG8gd29yay4gVGhlIGNsaWVudCBjYW4gY29uZmlndXJlIHRoZSByZXRyeSB2YXJpYWJsZXMuCisgIFJldHJpZXMgOj0gMDsKKyAgd2hpbGUgVHJ1ZSBkbyBiZWdpbgorICAgIGlmIGJpbmQoU29ja2V0LCBBZGRySW5mby5SZXNeLmFpX2FkZHJeLCBBZGRySW5mby5SZXNeLmFpX2FkZHJsZW4pID0gMCB0aGVuCisgICAgICBCcmVhazsKKyAgICBJbmMoUmV0cmllcyk7CisgICAgaWYgUmV0cmllcyA+IEZSZXRyeUxpbWl0IHRoZW4KKyAgICAgIEJyZWFrOworICAgIFNsZWVwKEZSZXRyeURlbGF5ICogMTAwMCk7CisgIGVuZDsKKworICAvLyByZXRyaWV2ZSBiaW5kIGluZm8KKyAgaWYgKFBvcnQgPSAwKSBhbmQgKFJldHJpZXMgPCBGUmV0cnlMaW1pdCkgdGhlbiBiZWdpbgorICAgIExlbiA6PSBTaXplT2YoU0EpOworICAgIEZpbGxDaGFyKFNBLCBMZW4sIDApOworICAgIGlmIGdldHNvY2tuYW1lKFNvY2tldCwgUFNvY2tBZGRyKEBTQSleLCBMZW4pID0gU09DS0VUX0VSUk9SIHRoZW4KKyAgICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNlcnZlclNvY2tldC5MaXN0ZW4oKSBnZXRzb2NrbmFtZSgpICVzJywgW1N5c0Vycm9yTWVzc2FnZShXU0FHZXRMYXN0RXJyb3IpXSkpCisgICAgZWxzZSBiZWdpbgorICAgICAgaWYgU0Euc3NfZmFtaWx5ID0gQUZfSU5FVDYgdGhlbgorICAgICAgICBQb3J0IDo9IG50b2hzKFBTb2NrQWRkckluNihAU0EpXi5zaW42X3BvcnQpCisgICAgICBlbHNlCisgICAgICAgIFBvcnQgOj0gbnRvaHMoUFNvY2tBZGRySW4oQFNBKV4uc2luX3BvcnQpOworICAgIGVuZDsKKyAgZW5kOworCisgIC8vIHRocm93IGFuIGVycm9yIGlmIHdlIGZhaWxlZCB0byBiaW5kIHByb3Blcmx5CisgIGlmIChSZXRyaWVzID4gRlJldHJ5TGltaXQpIHRoZW4gYmVnaW4KKyAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTZXJ2ZXJTb2NrZXQuTGlzdGVuKCkgQklORCAlZCcsIFtQb3J0XSkpOworICAgIENsb3NlOworICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZShGb3JtYXQoJ0NvdWxkIG5vdCBiaW5kOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoV1NBR2V0TGFzdEVycm9yKV0pKTsKKyAgZW5kOworCisgIGlmIEFzc2lnbmVkKEZMaXN0ZW5DYWxsYmFjaykgdGhlbgorICAgIEZMaXN0ZW5DYWxsYmFjayhTb2NrZXQpOworCisgIC8vIENhbGwgbGlzdGVuCisgIGlmIFdpbmFwaS5XaW5zb2NrMi5saXN0ZW4oU29ja2V0LCBGQWNjZXB0QmFja2xvZykgPSBTT0NLRVRfRVJST1IgdGhlbiBiZWdpbgorICAgIEVycm5vQ29weSA6PSBXU0FHZXRMYXN0RXJyb3I7CisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU2VydmVyU29ja2V0Lkxpc3RlbigpIGxpc3RlbigpICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZShGb3JtYXQoJ0NvdWxkIG5vdCBsaXN0ZW46ICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICBlbmQ7CisKKyAgLy8gVGhlIHNvY2tldCBpcyBub3cgbGlzdGVuaW5nIQorZW5kOworCitmdW5jdGlvbiBUU2VydmVyU29ja2V0LkFjY2VwdDogVFNvY2tldDsKK3ZhcgorICBGZHM6IFRGZFNldDsKKyAgTWF4RUludGVycywKKyAgTnVtRUludGVyczogSW50ZWdlcjsKKyAgVFZhbDogVFRpbWVWYWw7CisgIFBUVmFsOiBQVGltZVZhbDsKKyAgRXJybm9Db3B5OiBJbnRlZ2VyOworICBCdWY6IEJ5dGU7CisgIENsaWVudEFkZHJlc3M6IFRTb2NrQWRkclN0b3JhZ2U7CisgIFNpemU6IEludGVnZXI7CisgIENsaWVudFNvY2tldDogV2luYXBpLldpbnNvY2syLlRTb2NrZXQ7CisgIFplcm86IENhcmRpbmFsOworICBDbGllbnQ6IFRTb2NrZXQ7CisgIFJldDogSW50ZWdlcjsKK2JlZ2luCisgIE1heEVJbnRlcnMgOj0gNTsKKyAgTnVtRUludGVycyA6PSAwOworCisgIHdoaWxlIFRydWUgZG8gYmVnaW4KKyAgICBGRF9aRVJPKEZkcyk7CisgICAgX0ZEX1NFVChTb2NrZXQsIEZkcyk7CisgICAgX0ZEX1NFVChGSW50ZXJydXB0U29ja1JlYWRlciwgRmRzKTsKKyAgICBpZiBGQWNjZXB0VGltZW91dCA+IDAgdGhlbiBiZWdpbgorICAgICAgVFZhbC50dl9zZWMgOj0gRkFjY2VwdFRpbWVvdXQgZGl2IDEwMDA7CisgICAgICBUVmFsLnR2X3VzZWMgOj0gKEZBY2NlcHRUaW1lb3V0IG1vZCAxMDAwKSAqIDEwMDA7CisgICAgICBQVFZhbCA6PSBAVFZhbDsKKyAgICBlbmQKKyAgICBlbHNlCisgICAgICBQVFZhbCA6PSBuaWw7CisKKyAgICAvLyBUT0RPOiBpZiBXU0FFSU5UUiBpcyByZWNlaXZlZCwgd2UnbGwgcmVzdGFydCB0aGUgdGltZW91dC4KKyAgICAvLyBUbyBiZSBhY2N1cmF0ZSwgd2UgbmVlZCB0byBmaXggdGhpcyBpbiB0aGUgZnV0dXJlLgorICAgIFJldCA6PSBzZWxlY3QoMiwgQEZkcywgbmlsLCBuaWwsIFBUVmFsKTsKKworICAgIGlmIFJldCA8IDAgdGhlbiBiZWdpbgorICAgICAgLy8gZXJyb3IgY2FzZXMKKyAgICAgIGlmIChXU0FHZXRMYXN0RXJyb3IgPSBXU0FFSU5UUikgYW5kIChOdW1FSW50ZXJzIDwgTWF4RUludGVycykgdGhlbiBiZWdpbgorICAgICAgICAvLyBUSFJJRlRfRUlOVFIgbmVlZHMgdG8gYmUgaGFuZGxlZCBtYW51YWxseSBhbmQgd2UgY2FuIHRvbGVyYXRlCisgICAgICAgIC8vIGEgY2VydGFpbiBudW1iZXIKKyAgICAgICAgSW5jKE51bUVJbnRlcnMpOworICAgICAgICBDb250aW51ZTsKKyAgICAgIGVuZDsKKyAgICAgIEVycm5vQ29weSA6PSBXU0FHZXRMYXN0RXJyb3I7CisgICAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTZXJ2ZXJTb2NrZXQuQWNjZXB0KCkgc2VsZWN0KCkgJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoRm9ybWF0KCdVbmtub3duOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICBlbmQKKyAgICBlbHNlIGlmIFJldCA+IDAgdGhlbiBiZWdpbgorICAgICAgLy8gQ2hlY2sgZm9yIGFuIGludGVycnVwdCBzaWduYWwKKyAgICAgIGlmIChGSW50ZXJydXB0U29ja1JlYWRlciA8PiBJTlZBTElEX1NPQ0tFVCkgYW5kIEZEX0lTU0VUKEZJbnRlcnJ1cHRTb2NrUmVhZGVyLCBGZHMpIHRoZW4gYmVnaW4KKyAgICAgICAgaWYgcmVjdihGSW50ZXJydXB0U29ja1JlYWRlciwgQnVmLCBTaXplT2YoQnVmKSwgMCkgPSBTT0NLRVRfRVJST1IgdGhlbgorICAgICAgICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNlcnZlclNvY2tldC5BY2NlcHQoKSByZWN2KCkgaW50ZXJydXB0ICVzJywgW1N5c0Vycm9yTWVzc2FnZShXU0FHZXRMYXN0RXJyb3IpXSkpOworICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uSW50ZXJydXB0ZWQuQ3JlYXRlKCdpbnRlcnJ1cHRlZCcpOworICAgICAgZW5kOworCisgICAgICAvLyBDaGVjayBmb3IgdGhlIGFjdHVhbCBzZXJ2ZXIgc29ja2V0IGJlaW5nIHJlYWR5CisgICAgICBpZiBGRF9JU1NFVChTb2NrZXQsIEZkcykgdGhlbgorICAgICAgICBCcmVhazsKKyAgICBlbmQKKyAgICBlbHNlIGJlZ2luCisgICAgICBMb2dEZWxlZ2F0ZSgnVFNlcnZlclNvY2tldC5BY2NlcHQoKSBzZWxlY3QoKSAwJyk7CisgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoJ3Vua25vd24gZXJyb3InKTsKKyAgICBlbmQ7CisgIGVuZDsKKworICBTaXplIDo9IFNpemVPZihDbGllbnRBZGRyZXNzKTsKKyAgQ2xpZW50U29ja2V0IDo9IFdpbmFwaS5XaW5zb2NrMi5hY2NlcHQoU29ja2V0LCBAQ2xpZW50QWRkcmVzcywgQFNpemUpOworICBpZiBDbGllbnRTb2NrZXQgPSBJTlZBTElEX1NPQ0tFVCB0aGVuIGJlZ2luCisgICAgRXJybm9Db3B5IDo9IFdTQUdldExhc3RFcnJvcjsKKyAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTZXJ2ZXJTb2NrZXQuQWNjZXB0KCkgYWNjZXB0KCkgJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKEZvcm1hdCgnYWNjZXB0KCk6ICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICBlbmQ7CisKKyAgLy8gTWFrZSBzdXJlIGNsaWVudCBzb2NrZXQgaXMgYmxvY2tpbmcKKyAgWmVybyA6PSAwOworICBpZiBpb2N0bHNvY2tldChDbGllbnRTb2NrZXQsIEludGVnZXIoRklPTkJJTyksIFplcm8pID0gU09DS0VUX0VSUk9SIHRoZW4gYmVnaW4KKyAgICBFcnJub0NvcHkgOj0gV1NBR2V0TGFzdEVycm9yOworICAgIGNsb3Nlc29ja2V0KENsaWVudFNvY2tldCk7CisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU2VydmVyU29ja2V0LkFjY2VwdCgpIGlvY3Rsc29ja2V0KCkgRklPTkJJTyAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoRm9ybWF0KCdpb2N0bHNvY2tldCgpOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgZW5kOworCisgIENsaWVudCA6PSBDcmVhdGVTb2NrZXRPYmooQ2xpZW50U29ja2V0KTsKKyAgaWYgU2VuZFRpbWVvdXQgPiAwIHRoZW4KKyAgICBDbGllbnQuU2VuZFRpbWVvdXQgOj0gU2VuZFRpbWVvdXQ7CisgIGlmIFJlY3ZUaW1lb3V0ID4gMCB0aGVuCisgICAgQ2xpZW50LlJlY3ZUaW1lb3V0IDo9IFJlY3ZUaW1lb3V0OworICBpZiBLZWVwQWxpdmUgdGhlbgorICAgIENsaWVudC5LZWVwQWxpdmUgOj0gS2VlcEFsaXZlOworICBDbGllbnQuU2V0Q2FjaGVkQWRkcmVzcyhQU29ja0FkZHIoQENsaWVudEFkZHJlc3MpXiwgU2l6ZSk7CisKKyAgaWYgQXNzaWduZWQoRkFjY2VwdENhbGxiYWNrKSB0aGVuCisgICAgRkFjY2VwdENhbGxiYWNrKENsaWVudFNvY2tldCk7CisKKyAgUmVzdWx0IDo9IENsaWVudDsKK2VuZDsKKworcHJvY2VkdXJlIFRTZXJ2ZXJTb2NrZXQuSW50ZXJydXB0OworYmVnaW4KKyAgTm90aWZ5KEZJbnRlcnJ1cHRTb2NrV3JpdGVyKTsKK2VuZDsKKworcHJvY2VkdXJlIFRTZXJ2ZXJTb2NrZXQuSW50ZXJydXB0Q2hpbGRyZW47CitiZWdpbgorICBOb3RpZnkoRkNoaWxkSW50ZXJydXB0U29ja1dyaXRlcik7CitlbmQ7CisKK3Byb2NlZHVyZSBUU2VydmVyU29ja2V0LkNsb3NlOworYmVnaW4KKyAgaW5oZXJpdGVkIENsb3NlOworICBpZiBGSW50ZXJydXB0U29ja1dyaXRlciA8PiBJTlZBTElEX1NPQ0tFVCB0aGVuCisgICAgY2xvc2Vzb2NrZXQoRkludGVycnVwdFNvY2tXcml0ZXIpOworICBpZiBGSW50ZXJydXB0U29ja1JlYWRlciA8PiBJTlZBTElEX1NPQ0tFVCB0aGVuCisgICAgY2xvc2Vzb2NrZXQoRkludGVycnVwdFNvY2tSZWFkZXIpOworICBpZiBGQ2hpbGRJbnRlcnJ1cHRTb2NrV3JpdGVyIDw+IElOVkFMSURfU09DS0VUIHRoZW4KKyAgICBjbG9zZXNvY2tldChGQ2hpbGRJbnRlcnJ1cHRTb2NrV3JpdGVyKTsKKyAgRkNoaWxkSW50ZXJydXB0U29ja1JlYWRlciA6PSBUU21hcnRQb2ludGVyPFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0Pi5DcmVhdGUoSU5WQUxJRF9TT0NLRVQsIG5pbCk7CisgIEZMaXN0ZW5pbmcgOj0gRmFsc2U7CitlbmQ7CisKK3skRU5ESUZ9IC8vIG5vdCBmb3IgT0xEX1NPQ0tFVFMKK2VuZC4KZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5TdHJlYW0ucGFzIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlN0cmVhbS5wYXMKaW5kZXggZDFmNjM4NC4uMzMwOGM1MyAxMDA2NDQKLS0tIGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlN0cmVhbS5wYXMKKysrIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlN0cmVhbS5wYXMKQEAgLTE5LDYgKzE5LDggQEAKIAogdW5pdCBUaHJpZnQuU3RyZWFtOwogCit7JEkgVGhyaWZ0LkRlZmluZXMuaW5jfQorCiBpbnRlcmZhY2UKIAogdXNlcwpAQCAtMjYsMTUgKzI4LDIxIEBACiAgIFN5c1V0aWxzLAogICBTeXNDb25zdCwKICAgUlRMQ29uc3RzLAotICBUaHJpZnQuVXRpbHMsCi0gIEFjdGl2ZVg7CisgIHskSUZERUYgT0xEX1VOSVRfTkFNRVN9CisgIEFjdGl2ZVgsCisgIHskRUxTRX0KKyAgV2luYXBpLkFjdGl2ZVgsCisgIHskRU5ESUZ9CisgIFRocmlmdC5VdGlsczsKIAogdHlwZQogCiAgIElUaHJpZnRTdHJlYW0gPSBpbnRlcmZhY2UKLSAgICBbJ3s3MzI2MjFCMy1GNjk3LTRENzYtQTFCMC1CNERENUE4RTQwMTh9J10KLSAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IGJ1ZmZlcjogVEJ5dGVzOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsKLSAgICBmdW5jdGlvbiBSZWFkKCB2YXIgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOworICAgIFsnezJBNzdEOTE2LTc0NDYtNDZDMS04NTQ1LTBBRUMwMDA4REJDQX0nXQorICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOyAgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7ICBvdmVybG9hZDsKKyAgICBmdW5jdGlvbiBSZWFkKCB2YXIgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOyAgb3ZlcmxvYWQ7CisgICAgZnVuY3Rpb24gUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOyAgb3ZlcmxvYWQ7CiAgICAgcHJvY2VkdXJlIE9wZW47CiAgICAgcHJvY2VkdXJlIENsb3NlOwogICAgIHByb2NlZHVyZSBGbHVzaDsKQEAgLTQ0LDEwICs1MiwxMiBAQAogCiAgIFRUaHJpZnRTdHJlYW1JbXBsID0gY2xhc3MoIFRJbnRlcmZhY2VkT2JqZWN0LCBJVGhyaWZ0U3RyZWFtKQogICBwcml2YXRlCi0gICAgcHJvY2VkdXJlIENoZWNrU2l6ZUFuZE9mZnNldCggY29uc3QgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOworICAgIHByb2NlZHVyZSBDaGVja1NpemVBbmRPZmZzZXQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsgIG92ZXJsb2FkOwogICBwcm90ZWN0ZWQKLSAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IGJ1ZmZlcjogVEJ5dGVzOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsgdmlydHVhbDsKLSAgICBmdW5jdGlvbiBSZWFkKCB2YXIgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOyBvdmVybG9hZDsgaW5saW5lOworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOyAgb3ZlcmxvYWQ7IHZpcnR1YWw7CisgICAgZnVuY3Rpb24gUmVhZCggdmFyIGJ1ZmZlcjogVEJ5dGVzOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcmxvYWQ7IGlubGluZTsKKyAgICBmdW5jdGlvbiBSZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7IG92ZXJsb2FkOyB2aXJ0dWFsOwogICAgIHByb2NlZHVyZSBPcGVuOyB2aXJ0dWFsOyBhYnN0cmFjdDsKICAgICBwcm9jZWR1cmUgQ2xvc2U7IHZpcnR1YWw7IGFic3RyYWN0OwogICAgIHByb2NlZHVyZSBGbHVzaDsgdmlydHVhbDsgYWJzdHJhY3Q7CkBAIC02MCw4ICs3MCw4IEBACiAgICAgRlN0cmVhbSA6IFRTdHJlYW07CiAgICAgRk93bnNTdHJlYW0gOiBCb29sZWFuOwogICBwcm90ZWN0ZWQKLSAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IGJ1ZmZlcjogVEJ5dGVzOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsgb3ZlcnJpZGU7Ci0gICAgZnVuY3Rpb24gUmVhZCggdmFyIGJ1ZmZlcjogVEJ5dGVzOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIE9wZW47IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBDbG9zZTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIEZsdXNoOyBvdmVycmlkZTsKQEAgLTc2LDggKzg2LDggQEAKICAgcHJpdmF0ZQogICAgIEZTdHJlYW0gOiBJU3RyZWFtOwogICBwcm90ZWN0ZWQKLSAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IGJ1ZmZlcjogVEJ5dGVzOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsgb3ZlcnJpZGU7Ci0gICAgZnVuY3Rpb24gUmVhZCggdmFyIGJ1ZmZlcjogVEJ5dGVzOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIE9wZW47IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBDbG9zZTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIEZsdXNoOyBvdmVycmlkZTsKQEAgLTEwNCwxMCArMTE0LDggQEAKIAogcHJvY2VkdXJlIFRUaHJpZnRTdHJlYW1BZGFwdGVyQ09NLkZsdXNoOwogYmVnaW4KLSAgaWYgSXNPcGVuIHRoZW4KLSAgYmVnaW4KLSAgICBpZiBGU3RyZWFtIDw+IG5pbCB0aGVuCi0gICAgYmVnaW4KKyAgaWYgSXNPcGVuIHRoZW4gYmVnaW4KKyAgICBpZiBGU3RyZWFtIDw+IG5pbCB0aGVuIGJlZ2luCiAgICAgICBGU3RyZWFtLkNvbW1pdCggU1RHQ19ERUZBVUxUICk7CiAgICAgZW5kOwogICBlbmQ7CkBAIC0xMjAsMTggKzEyOCwyMyBAQAogCiBwcm9jZWR1cmUgVFRocmlmdFN0cmVhbUFkYXB0ZXJDT00uT3BlbjsKIGJlZ2luCi0KKyAgLy8gbm90aGluZyB0byBkbwogZW5kOwogCi1mdW5jdGlvbiBUVGhyaWZ0U3RyZWFtQWRhcHRlckNPTS5SZWFkKCB2YXIgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOworZnVuY3Rpb24gVFRocmlmdFN0cmVhbUFkYXB0ZXJDT00uUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOwordmFyIHBUbXAgOiBQQnl0ZTsKIGJlZ2luCiAgIGluaGVyaXRlZDsKKworICBpZiBjb3VudCA+PSBidWZsZW4tb2Zmc2V0CisgIHRoZW4gY291bnQgOj0gYnVmbGVuLW9mZnNldDsKKwogICBSZXN1bHQgOj0gMDsKLSAgaWYgRlN0cmVhbSA8PiBuaWwgdGhlbgotICBiZWdpbgotICAgIGlmIGNvdW50ID4gMCB0aGVuCi0gICAgYmVnaW4KLSAgICAgIEZTdHJlYW0uUmVhZCggQGJ1ZmZlcltvZmZzZXRdLCBjb3VudCwgQFJlc3VsdCk7CisgIGlmIEZTdHJlYW0gPD4gbmlsIHRoZW4gYmVnaW4KKyAgICBpZiBjb3VudCA+IDAgdGhlbiBiZWdpbgorICAgICAgcFRtcCA6PSBwQnVmOworICAgICAgSW5jKCBwVG1wLCBvZmZzZXQpOworICAgICAgRlN0cmVhbS5SZWFkKCBwVG1wLCBjb3VudCwgQFJlc3VsdCk7CiAgICAgZW5kOwogICBlbmQ7CiBlbmQ7CkBAIC0xNDAsNzUgKzE1Myw3NiBAQAogdmFyCiAgIHN0YXRzdGc6IFRTdGF0U3RnOwogICBsZW4gOiBJbnRlZ2VyOwotICBOZXdQb3MgOiBJbnQ2NDsKKyAgTmV3UG9zIDogeyRJRiBDb21waWxlclZlcnNpb24gPj0gMjkuMH0gVUludDY0IHskRUxTRX0gSW50NjQgIHskSUZFTkR9OwogICBjYlJlYWQgOiBJbnRlZ2VyOwogYmVnaW4KICAgRmlsbENoYXIoIHN0YXRzdGcsIFNpemVPZiggc3RhdHN0ZyksIDApOwogICBsZW4gOj0gMDsKLSAgaWYgSXNPcGVuIHRoZW4KLSAgYmVnaW4KLSAgICBpZiBTdWNjZWVkZWQoIEZTdHJlYW0uU3RhdCggc3RhdHN0ZywgU1RBVEZMQUdfTk9OQU1FICkpIHRoZW4KLSAgICBiZWdpbgorICBpZiBJc09wZW4gdGhlbiBiZWdpbgorICAgIGlmIFN1Y2NlZWRlZCggRlN0cmVhbS5TdGF0KCBzdGF0c3RnLCBTVEFURkxBR19OT05BTUUgKSkgdGhlbiBiZWdpbgogICAgICAgbGVuIDo9IHN0YXRzdGcuY2JTaXplOwogICAgIGVuZDsKICAgZW5kOwogCiAgIFNldExlbmd0aCggUmVzdWx0LCBsZW4gKTsKIAotICBpZiBsZW4gPiAwIHRoZW4KLSAgYmVnaW4KLSAgICBpZiBTdWNjZWVkZWQoIEZTdHJlYW0uU2VlayggMCwgU1RSRUFNX1NFRUtfU0VULCBOZXdQb3MpICkgdGhlbgotICAgIGJlZ2luCisgIGlmIGxlbiA+IDAgdGhlbiBiZWdpbgorICAgIGlmIFN1Y2NlZWRlZCggRlN0cmVhbS5TZWVrKCAwLCBTVFJFQU1fU0VFS19TRVQsIE5ld1BvcykgKSB0aGVuIGJlZ2luCiAgICAgICBGU3RyZWFtLlJlYWQoIEBSZXN1bHRbMF0sIGxlbiwgQGNiUmVhZCk7CiAgICAgZW5kOwogICBlbmQ7CiBlbmQ7CiAKLXByb2NlZHVyZSBUVGhyaWZ0U3RyZWFtQWRhcHRlckNPTS5Xcml0ZSggY29uc3QgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOwotdmFyCi0gIG5Xcml0dGVuIDogSW50ZWdlcjsKK3Byb2NlZHVyZSBUVGhyaWZ0U3RyZWFtQWRhcHRlckNPTS5Xcml0ZSggY29uc3QgcEJ1ZjogUG9pbnRlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7Cit2YXIgbldyaXR0ZW4gOiBJbnRlZ2VyOworICAgIHBUbXAgOiBQQnl0ZTsKIGJlZ2luCiAgIGluaGVyaXRlZDsKLSAgaWYgSXNPcGVuIHRoZW4KLSAgYmVnaW4KLSAgICBpZiBjb3VudCA+IDAgdGhlbgotICAgIGJlZ2luCi0gICAgICBGU3RyZWFtLldyaXRlKCBAYnVmZmVyWzBdLCBjb3VudCwgQG5Xcml0dGVuKTsKKyAgaWYgSXNPcGVuIHRoZW4gYmVnaW4KKyAgICBpZiBjb3VudCA+IDAgdGhlbiBiZWdpbgorICAgICAgcFRtcCA6PSBwQnVmOworICAgICAgSW5jKCBwVG1wLCBvZmZzZXQpOworICAgICAgRlN0cmVhbS5Xcml0ZSggcFRtcCwgY291bnQsIEBuV3JpdHRlbik7CiAgICAgZW5kOwogICBlbmQ7CiBlbmQ7CiAKIHsgVFRocmlmdFN0cmVhbUltcGwgfQogCi1wcm9jZWR1cmUgVFRocmlmdFN0cmVhbUltcGwuQ2hlY2tTaXplQW5kT2Zmc2V0KGNvbnN0IGJ1ZmZlcjogVEJ5dGVzOyBvZmZzZXQsCi0gIGNvdW50OiBJbnRlZ2VyKTsKLXZhcgotICBsZW4gOiBJbnRlZ2VyOworcHJvY2VkdXJlIFRUaHJpZnRTdHJlYW1JbXBsLkNoZWNrU2l6ZUFuZE9mZnNldCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOwogYmVnaW4KLSAgaWYgY291bnQgPiAwIHRoZW4KLSAgYmVnaW4KLSAgICBsZW4gOj0gTGVuZ3RoKCBidWZmZXIgKTsKLSAgICBpZiAob2Zmc2V0IDwgMCkgb3IgKCBvZmZzZXQgPj0gbGVuKSB0aGVuCi0gICAgYmVnaW4KKyAgaWYgY291bnQgPiAwIHRoZW4gYmVnaW4KKyAgICBpZiAob2Zmc2V0IDwgMCkgb3IgKCBvZmZzZXQgPj0gYnVmbGVuKSB0aGVuIGJlZ2luCiAgICAgICByYWlzZSBFUmFuZ2VFcnJvci5DcmVhdGUoIFNCaXRzSW5kZXhFcnJvciApOwogICAgIGVuZDsKLSAgICBpZiBjb3VudCA+IGxlbiB0aGVuCi0gICAgYmVnaW4KKyAgICBpZiBjb3VudCA+IGJ1ZmxlbiB0aGVuIGJlZ2luCiAgICAgICByYWlzZSBFUmFuZ2VFcnJvci5DcmVhdGUoIFNCaXRzSW5kZXhFcnJvciApOwogICAgIGVuZDsKICAgZW5kOwogZW5kOwogCi1mdW5jdGlvbiBUVGhyaWZ0U3RyZWFtSW1wbC5SZWFkKHZhciBidWZmZXI6IFRCeXRlczsgb2Zmc2V0LAotICBjb3VudDogSW50ZWdlcik6IEludGVnZXI7CitmdW5jdGlvbiBUVGhyaWZ0U3RyZWFtSW1wbC5SZWFkKHZhciBidWZmZXI6IFRCeXRlczsgb2Zmc2V0LCBjb3VudDogSW50ZWdlcik6IEludGVnZXI7CitiZWdpbgorICBpZiBMZW5ndGgoYnVmZmVyKSA+IDAKKyAgdGhlbiBSZXN1bHQgOj0gUmVhZCggQGJ1ZmZlclswXSwgTGVuZ3RoKGJ1ZmZlciksIG9mZnNldCwgY291bnQpCisgIGVsc2UgUmVzdWx0IDo9IDA7CitlbmQ7CisKK2Z1bmN0aW9uIFRUaHJpZnRTdHJlYW1JbXBsLlJlYWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsKIGJlZ2luCiAgIFJlc3VsdCA6PSAwOwotICBDaGVja1NpemVBbmRPZmZzZXQoIGJ1ZmZlciwgb2Zmc2V0LCBjb3VudCApOworICBDaGVja1NpemVBbmRPZmZzZXQoIHBCdWYsIGJ1Zmxlbiwgb2Zmc2V0LCBjb3VudCApOwogZW5kOwogCiBwcm9jZWR1cmUgVFRocmlmdFN0cmVhbUltcGwuV3JpdGUoY29uc3QgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldCwgY291bnQ6IEludGVnZXIpOwogYmVnaW4KLSAgQ2hlY2tTaXplQW5kT2Zmc2V0KCBidWZmZXIsIG9mZnNldCwgY291bnQgKTsKKyAgaWYgTGVuZ3RoKGJ1ZmZlcikgPiAwCisgIHRoZW4gV3JpdGUoIEBidWZmZXJbMF0sIG9mZnNldCwgY291bnQpOworZW5kOworCitwcm9jZWR1cmUgVFRocmlmdFN0cmVhbUltcGwuV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsKK2JlZ2luCisgIENoZWNrU2l6ZUFuZE9mZnNldCggcEJ1Ziwgb2Zmc2V0K2NvdW50LCBvZmZzZXQsIGNvdW50KTsKIGVuZDsKIAogeyBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaSB9CkBAIC0yMjksMTYgKzI0MywxNSBAQAogCiBkZXN0cnVjdG9yIFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpLkRlc3Ryb3k7CiBiZWdpbgotICBpZiBGT3duc1N0cmVhbSB0aGVuCi0gIGJlZ2luCi0gICAgRlN0cmVhbS5GcmVlOwotICBlbmQ7CisgIGlmIEZPd25zU3RyZWFtIAorICB0aGVuIENsb3NlOworICAKICAgaW5oZXJpdGVkOwogZW5kOwogCiBwcm9jZWR1cmUgVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuRmx1c2g7CiBiZWdpbgotCisgIC8vIG5vdGhpbmcgdG8gZG8KIGVuZDsKIAogZnVuY3Rpb24gVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuSXNPcGVuOiBCb29sZWFuOwpAQCAtMjQ4LDE4ICsyNjEsMjMgQEAKIAogcHJvY2VkdXJlIFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpLk9wZW47CiBiZWdpbgotCisgIC8vIG5vdGhpbmcgdG8gZG8KIGVuZDsKIAotZnVuY3Rpb24gVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuUmVhZCh2YXIgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldCwKLSAgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOworZnVuY3Rpb24gVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuUmVhZChjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0LCBjb3VudDogSW50ZWdlcik6IEludGVnZXI7Cit2YXIgcFRtcCA6IFBCeXRlOwogYmVnaW4KICAgaW5oZXJpdGVkOwotICBSZXN1bHQgOj0gMDsKLSAgaWYgY291bnQgPiAwIHRoZW4KLSAgYmVnaW4KLSAgICBSZXN1bHQgOj0gRlN0cmVhbS5SZWFkKCBQb2ludGVyKEBidWZmZXJbb2Zmc2V0XSleLCBjb3VudCkKLSAgZW5kOworCisgIGlmIGNvdW50ID49IGJ1Zmxlbi1vZmZzZXQKKyAgdGhlbiBjb3VudCA6PSBidWZsZW4tb2Zmc2V0OworCisgIGlmIGNvdW50ID4gMCB0aGVuIGJlZ2luCisgICAgcFRtcCA6PSBwQnVmOworICAgIEluYyggcFRtcCwgb2Zmc2V0KTsKKyAgICBSZXN1bHQgOj0gRlN0cmVhbS5SZWFkKCBwVG1wXiwgY291bnQpCisgIGVuZAorICBlbHNlIFJlc3VsdCA6PSAwOwogZW5kOwogCiBmdW5jdGlvbiBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5Ub0FycmF5OiBUQnl0ZXM7CkBAIC0yODcsMTMgKzMwNSwxNCBAQAogICBlbmQKIGVuZDsKIAotcHJvY2VkdXJlIFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpLldyaXRlKGNvbnN0IGJ1ZmZlcjogVEJ5dGVzOyBvZmZzZXQsCi0gIGNvdW50OiBJbnRlZ2VyKTsKK3Byb2NlZHVyZSBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5Xcml0ZShjb25zdCBwQnVmIDogUG9pbnRlcjsgb2Zmc2V0LCBjb3VudDogSW50ZWdlcik7Cit2YXIgcFRtcCA6IFBCeXRlOwogYmVnaW4KICAgaW5oZXJpdGVkOwotICBpZiBjb3VudCA+IDAgdGhlbgotICBiZWdpbgotICAgIEZTdHJlYW0uV3JpdGUoIFBvaW50ZXIoQGJ1ZmZlcltvZmZzZXRdKV4sIGNvdW50KQorICBpZiBjb3VudCA+IDAgdGhlbiBiZWdpbgorICAgIHBUbXAgOj0gcEJ1ZjsKKyAgICBJbmMoIHBUbXAsIG9mZnNldCk7CisgICAgRlN0cmVhbS5Xcml0ZSggcFRtcF4sIGNvdW50KQogICBlbmQ7CiBlbmQ7CiAKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5UcmFuc3BvcnQuUGlwZXMucGFzIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlRyYW5zcG9ydC5QaXBlcy5wYXMKaW5kZXggNTkzYmIzYS4uNzdhMzQzYiAxMDA2NDQKLS0tIGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlRyYW5zcG9ydC5QaXBlcy5wYXMKKysrIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlRyYW5zcG9ydC5QaXBlcy5wYXMKQEAgLTE5LDE4ICsxOSwyMiBAQAogdW5pdCBUaHJpZnQuVHJhbnNwb3J0LlBpcGVzOwogCiB7JFdBUk4gU1lNQk9MX1BMQVRGT1JNIE9GRn0KK3skSSBUaHJpZnQuRGVmaW5lcy5pbmN9CiAKIGludGVyZmFjZQogCiB1c2VzCisgIHskSUZERUYgT0xEX1VOSVRfTkFNRVN9CiAgIFdpbmRvd3MsIFN5c1V0aWxzLCBNYXRoLCBBY2NDdHJsLCBBY2xBUEksIFN5bmNPYmpzLAorICB7JEVMU0V9CisgIFdpbmFwaS5XaW5kb3dzLCBTeXN0ZW0uU3lzVXRpbHMsIFN5c3RlbS5NYXRoLCBXaW5hcGkuQWNjQ3RybCwgV2luYXBpLkFjbEFQSSwgU3lzdGVtLlN5bmNPYmpzLAorICB7JEVORElGfQogICBUaHJpZnQuVHJhbnNwb3J0LAogICBUaHJpZnQuVXRpbHMsCiAgIFRocmlmdC5TdHJlYW07CiAKIGNvbnN0Ci0gIERFRkFVTFRfVEhSSUZUX1BJUEVfVElNRU9VVCA9IERFRkFVTFRfVEhSSUZUX1RJTUVPVVQgZGVwcmVjYXRlZCAndXNlIERFRkFVTFRfVEhSSUZUX1RJTUVPVVQnOwotCisgIERFRkFVTFRfVEhSSUZUX1BJUEVfT1BFTl9USU1FT1VUID0gMTA7ICAvLyBkZWZhdWx0OiBmYWlsIGZhc3Qgb24gb3BlbgogCiAKIHR5cGUKQEAgLTQxLDIzICs0NSwyNiBAQAogICBzdHJpY3QgcHJvdGVjdGVkCiAgICAgRlBpcGUgICAgOiBUSGFuZGxlOwogICAgIEZUaW1lb3V0IDogRFdPUkQ7CisgICAgRk9wZW5UaW1lT3V0IDogRFdPUkQ7ICAvLyBzZXBhcmF0ZSB2YWx1ZSB0byBhbGxvdyBmb3IgZmFpbC1mYXN0LW9uLW9wZW4gc2NlbmFyaW9zCiAgICAgRk92ZXJsYXBwZWQgOiBCb29sZWFuOwogCi0gICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBidWZmZXI6IFRCeXRlczsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7IG92ZXJyaWRlOwotICAgIGZ1bmN0aW9uICBSZWFkKCB2YXIgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmZzZXQsIGNvdW50IDogSW50ZWdlcik7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uICBSZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7IG92ZXJyaWRlOwogICAgIC8vcHJvY2VkdXJlIE9wZW47IG92ZXJyaWRlOyAtIHNlZSBkZXJpdmVkIGNsYXNzZXMKICAgICBwcm9jZWR1cmUgQ2xvc2U7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBGbHVzaDsgb3ZlcnJpZGU7CiAKLSAgICBmdW5jdGlvbiAgUmVhZERpcmVjdCggICAgIHZhciBidWZmZXI6IFRCeXRlczsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7Ci0gICAgZnVuY3Rpb24gIFJlYWRPdmVybGFwcGVkKCB2YXIgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOwotICAgIHByb2NlZHVyZSBXcml0ZURpcmVjdCggICAgIGNvbnN0IGJ1ZmZlcjogVEJ5dGVzOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsKLSAgICBwcm9jZWR1cmUgV3JpdGVPdmVybGFwcGVkKCBjb25zdCBidWZmZXI6IFRCeXRlczsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gIFJlYWREaXJlY3QoICAgICBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7ICBvdmVybG9hZDsKKyAgICBmdW5jdGlvbiAgUmVhZE92ZXJsYXBwZWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsgIG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBXcml0ZURpcmVjdCggICAgIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsgIG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBXcml0ZU92ZXJsYXBwZWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsgIG92ZXJsb2FkOwogCiAgICAgZnVuY3Rpb24gSXNPcGVuOiBCb29sZWFuOyBvdmVycmlkZTsKICAgICBmdW5jdGlvbiBUb0FycmF5OiBUQnl0ZXM7IG92ZXJyaWRlOwogICBwdWJsaWMKLSAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGFFbmFibGVPdmVybGFwcGVkIDogQm9vbGVhbjsgY29uc3QgYVRpbWVPdXQgOiBEV09SRCA9IERFRkFVTFRfVEhSSUZUX1RJTUVPVVQpOworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggYUVuYWJsZU92ZXJsYXBwZWQgOiBCb29sZWFuOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYVRpbWVPdXQgOiBEV09SRCA9IERFRkFVTFRfVEhSSUZUX1RJTUVPVVQ7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhT3BlblRpbWVPdXQgOiBEV09SRCA9IERFRkFVTFRfVEhSSUZUX1BJUEVfT1BFTl9USU1FT1VUKTsKICAgICBkZXN0cnVjdG9yIERlc3Ryb3k7ICBvdmVycmlkZTsKICAgZW5kOwogCkBAIC03Niw3ICs4Myw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhRW5hYmxlT3ZlcmxhcHBlZCA6IEJvb2xlYW47CiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhU2hhcmVNb2RlOiBEV09SRCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhU2VjdXJpdHlBdHRyaWJ1dGVzOiBQU2VjdXJpdHlBdHRyaWJ1dGVzID0gbmlsOwotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYVRpbWVPdXQgOiBEV09SRCA9IERFRkFVTFRfVEhSSUZUX1RJTUVPVVQpOyAgb3ZlcmxvYWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhVGltZU91dCA6IERXT1JEID0gREVGQVVMVF9USFJJRlRfVElNRU9VVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFPcGVuVGltZU91dCA6IERXT1JEID0gREVGQVVMVF9USFJJRlRfUElQRV9PUEVOX1RJTUVPVVQpOyAgb3ZlcmxvYWQ7CiAgIGVuZDsKIAogCkBAIC0xMjAsNyArMTI4LDggQEAKICAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IGFQaXBlTmFtZSA6IHN0cmluZzsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFTaGFyZU1vZGU6IERXT1JEID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFTZWN1cml0eUF0dHJpYnV0ZXM6IFBTZWN1cml0eUF0dHJpYnV0ZXMgPSBuaWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhVGltZU91dCA6IERXT1JEID0gREVGQVVMVF9USFJJRlRfVElNRU9VVCk7ICBvdmVybG9hZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFUaW1lT3V0IDogRFdPUkQgPSBERUZBVUxUX1RIUklGVF9USU1FT1VUOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYU9wZW5UaW1lT3V0IDogRFdPUkQgPSBERUZBVUxUX1RIUklGVF9QSVBFX09QRU5fVElNRU9VVCk7ICBvdmVybG9hZDsKICAgZW5kOwogCiAKQEAgLTEzOCw3ICsxNDcsOSBAQAogICBUQW5vbnltb3VzUGlwZVRyYW5zcG9ydEltcGwgPSBjbGFzcyggVFBpcGVUcmFuc3BvcnRCYXNlKQogICBwdWJsaWMKICAgICAvLyBBbm9ueW1vdXMgcGlwZSBjb25zdHJ1Y3RvcgotICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgYVBpcGVSZWFkLCBhUGlwZVdyaXRlIDogVEhhbmRsZTsgYU93bnNIYW5kbGVzIDogQm9vbGVhbik7IG92ZXJsb2FkOworICAgIGNvbnN0cnVjdG9yIENyZWF0ZShjb25zdCBhUGlwZVJlYWQsIGFQaXBlV3JpdGUgOiBUSGFuZGxlOworICAgICAgICAgICAgICAgICAgICAgICBhT3duc0hhbmRsZXMgOiBCb29sZWFuOworICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhVGltZU91dCA6IERXT1JEID0gREVGQVVMVF9USFJJRlRfVElNRU9VVCk7IG92ZXJsb2FkOwogICBlbmQ7CiAKIApAQCAtMTg3LDYgKzE5OCw3IEBACiAgICAgRkNsaWVudEFub25SZWFkLAogICAgIEZDbGllbnRBbm9uV3JpdGUgIDogVEhhbmRsZTsKIAorICAgIEZUaW1lT3V0OiBEV09SRDsKICAgcHJvdGVjdGVkCiAgICAgZnVuY3Rpb24gQWNjZXB0KGNvbnN0IGZuQWNjZXB0aW5nOiBUUHJvYyk6IElUcmFuc3BvcnQ7IG92ZXJyaWRlOwogCkBAIC0yMDEsNyArMjEzLDcgQEAKICAgICBwcm9jZWR1cmUgSW50ZXJuYWxDbG9zZTsgb3ZlcnJpZGU7CiAKICAgcHVibGljCi0gICAgY29uc3RydWN0b3IgQ3JlYXRlKCBhQnVmc2l6ZSA6IENhcmRpbmFsID0gNDA5Nik7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKGFCdWZzaXplIDogQ2FyZGluYWwgPSA0MDk2OyBhVGltZU91dCA6IERXT1JEID0gREVGQVVMVF9USFJJRlRfVElNRU9VVCk7CiAgIGVuZDsKIAogCkBAIC0yNTAsOCArMjYyLDcgQEAKICAgaWYgbm90IER1cGxpY2F0ZUhhbmRsZSggR2V0Q3VycmVudFByb2Nlc3MsIGhTb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEN1cnJlbnRQcm9jZXNzLCBAcmVzdWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBGQUxTRSwgRFVQTElDQVRFX1NBTUVfQUNDRVNTKQotICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24uQ3JlYXRlKCBUVHJhbnNwb3J0RXhjZXB0aW9uLlRFeGNlcHRpb25UeXBlLk5vdE9wZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEdXBsaWNhdGVIYW5kbGU6ICcrU3lzRXJyb3JNZXNzYWdlKEdldExhc3RFcnJvcikpOworICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnRHVwbGljYXRlSGFuZGxlOiAnK1N5c0Vycm9yTWVzc2FnZShHZXRMYXN0RXJyb3IpKTsKIGVuZDsKIAogCkBAIC0yNjAsMTMgKzI3MSwxNCBAQAogCiAKIGNvbnN0cnVjdG9yIFRQaXBlU3RyZWFtQmFzZS5DcmVhdGUoIGFFbmFibGVPdmVybGFwcGVkIDogQm9vbGVhbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFUaW1lT3V0IDogRFdPUkQgPSBERUZBVUxUX1RIUklGVF9USU1FT1VUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFUaW1lT3V0LCBhT3BlblRpbWVPdXQgOiBEV09SRCk7CiBiZWdpbgogICBpbmhlcml0ZWQgQ3JlYXRlOwotICBBU1NFUlQoIGFUaW1lb3V0ID4gMCk7Ci0gIEZQaXBlICAgICAgIDo9IElOVkFMSURfSEFORExFX1ZBTFVFOwotICBGVGltZW91dCAgICA6PSBhVGltZU91dDsKLSAgRk92ZXJsYXBwZWQgOj0gYUVuYWJsZU92ZXJsYXBwZWQ7CisgIEFTU0VSVCggYVRpbWVvdXQgPiAwKTsgIC8vIGFPcGVuVGltZW91dCBtYXkgYmUgMAorICBGUGlwZSAgICAgICAgOj0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisgIEZUaW1lb3V0ICAgICA6PSBhVGltZU91dDsKKyAgRk9wZW5UaW1lT3V0IDo9IGFPcGVuVGltZU91dDsKKyAgRk92ZXJsYXBwZWQgIDo9IGFFbmFibGVPdmVybGFwcGVkOwogZW5kOwogCiAKQEAgLTI4OCw3ICszMDAsNyBAQAogCiBwcm9jZWR1cmUgVFBpcGVTdHJlYW1CYXNlLkZsdXNoOwogYmVnaW4KLSAgLy8gbm90aGluZyB0byBkbworICBGbHVzaEZpbGVCdWZmZXJzKCBGUGlwZSk7CiBlbmQ7CiAKIApAQCAtMjk4LDQ0ICszMTAsMTAyIEBACiBlbmQ7CiAKIAotcHJvY2VkdXJlIFRQaXBlU3RyZWFtQmFzZS5Xcml0ZShjb25zdCBidWZmZXI6IFRCeXRlczsgb2Zmc2V0LCBjb3VudDogSW50ZWdlcik7Citwcm9jZWR1cmUgVFBpcGVTdHJlYW1CYXNlLldyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2Zmc2V0LCBjb3VudCA6IEludGVnZXIpOwogYmVnaW4KICAgaWYgRk92ZXJsYXBwZWQKLSAgdGhlbiBXcml0ZU92ZXJsYXBwZWQoIGJ1ZmZlciwgb2Zmc2V0LCBjb3VudCkKLSAgZWxzZSBXcml0ZURpcmVjdCggYnVmZmVyLCBvZmZzZXQsIGNvdW50KTsKKyAgdGhlbiBXcml0ZU92ZXJsYXBwZWQoIHBCdWYsIG9mZnNldCwgY291bnQpCisgIGVsc2UgV3JpdGVEaXJlY3QoIHBCdWYsIG9mZnNldCwgY291bnQpOwogZW5kOwogCiAKLWZ1bmN0aW9uIFRQaXBlU3RyZWFtQmFzZS5SZWFkKCB2YXIgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldCwgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOworZnVuY3Rpb24gVFBpcGVTdHJlYW1CYXNlLlJlYWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsKIGJlZ2luCiAgIGlmIEZPdmVybGFwcGVkCi0gIHRoZW4gcmVzdWx0IDo9IFJlYWRPdmVybGFwcGVkKCBidWZmZXIsIG9mZnNldCwgY291bnQpCi0gIGVsc2UgcmVzdWx0IDo9IFJlYWREaXJlY3QoIGJ1ZmZlciwgb2Zmc2V0LCBjb3VudCk7CisgIHRoZW4gcmVzdWx0IDo9IFJlYWRPdmVybGFwcGVkKCBwQnVmLCBidWZsZW4sIG9mZnNldCwgY291bnQpCisgIGVsc2UgcmVzdWx0IDo9IFJlYWREaXJlY3QoIHBCdWYsIGJ1Zmxlbiwgb2Zmc2V0LCBjb3VudCk7CiBlbmQ7CiAKIAotcHJvY2VkdXJlIFRQaXBlU3RyZWFtQmFzZS5Xcml0ZURpcmVjdChjb25zdCBidWZmZXI6IFRCeXRlczsgb2Zmc2V0LCBjb3VudDogSW50ZWdlcik7Ci12YXIgY2JXcml0dGVuIDogRFdPUkQ7Citwcm9jZWR1cmUgVFBpcGVTdHJlYW1CYXNlLldyaXRlRGlyZWN0KCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7Cit2YXIgY2JXcml0dGVuLCBuQnl0ZXMgOiBEV09SRDsKKyAgICBwRGF0YSA6IFBCeXRlOwogYmVnaW4KICAgaWYgbm90IElzT3BlbgotICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24uQ3JlYXRlKCBUVHJhbnNwb3J0RXhjZXB0aW9uLlRFeGNlcHRpb25UeXBlLk5vdE9wZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDYWxsZWQgd3JpdGUgb24gbm9uLW9wZW4gcGlwZScpOworICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnQ2FsbGVkIHdyaXRlIG9uIG5vbi1vcGVuIHBpcGUnKTsKIAotICBpZiBub3QgV3JpdGVGaWxlKCBGUGlwZSwgYnVmZmVyW29mZnNldF0sIGNvdW50LCBjYldyaXR0ZW4sIG5pbCkKLSAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZSggVFRyYW5zcG9ydEV4Y2VwdGlvbi5URXhjZXB0aW9uVHlwZS5Ob3RPcGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnV3JpdGUgdG8gcGlwZSBmYWlsZWQnKTsKKyAgLy8gaWYgbmVjZXNzYXJ5LCBzZW5kIHRoZSBkYXRhIGluIGNodW5rcworICAvLyB0aGVyZSdzIGEgc3lzdGVtIGxpbWl0IGFyb3VuZCAweDEwMDAwIGJ5dGVzIHRoYXQgd2UgaGl0IG90aGVyd2lzZQorICAvLyBNU0ROOiAiUGlwZSB3cml0ZSBvcGVyYXRpb25zIGFjcm9zcyBhIG5ldHdvcmsgYXJlIGxpbWl0ZWQgdG8gNjUsNTM1IGJ5dGVzIHBlciB3cml0ZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHBpcGVzLCBzZWUgdGhlIFJlbWFya3Mgc2VjdGlvbi4iCisgIG5CeXRlcyA6PSBNaW4oIDE1KjQwOTYsIGNvdW50KTsgLy8gMTYgd291bGQgZXhjZWVkIHRoZSBsaW1pdAorICBwRGF0YSAgOj0gcEJ1ZjsKKyAgSW5jKCBwRGF0YSwgb2Zmc2V0KTsKKyAgd2hpbGUgbkJ5dGVzID4gMCBkbyBiZWdpbgorICAgIGlmIG5vdCBXcml0ZUZpbGUoIEZQaXBlLCBwRGF0YV4sIG5CeXRlcywgY2JXcml0dGVuLCBuaWwpCisgICAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ1dyaXRlIHRvIHBpcGUgZmFpbGVkJyk7CisKKyAgICBJbmMoIHBEYXRhLCBjYldyaXR0ZW4pOworICAgIERlYyggY291bnQsIGNiV3JpdHRlbik7CisgICAgbkJ5dGVzIDo9IE1pbiggbkJ5dGVzLCBjb3VudCk7CisgIGVuZDsKIGVuZDsKIAogCi1mdW5jdGlvbiBUUGlwZVN0cmVhbUJhc2UuUmVhZERpcmVjdCggdmFyIGJ1ZmZlcjogVEJ5dGVzOyBvZmZzZXQsIGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsKLXZhciBjYlJlYWQsIGR3RXJyICA6IERXT1JEOworcHJvY2VkdXJlIFRQaXBlU3RyZWFtQmFzZS5Xcml0ZU92ZXJsYXBwZWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsKK3ZhciBjYldyaXR0ZW4sIGR3V2FpdCwgZHdFcnJvciwgbkJ5dGVzIDogRFdPUkQ7CisgICAgb3ZlcmxhcHBlZCA6IElPdmVybGFwcGVkSGVscGVyOworICAgIHBEYXRhIDogUEJ5dGU7CitiZWdpbgorICBpZiBub3QgSXNPcGVuCisgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdDYWxsZWQgd3JpdGUgb24gbm9uLW9wZW4gcGlwZScpOworCisgIC8vIGlmIG5lY2Vzc2FyeSwgc2VuZCB0aGUgZGF0YSBpbiBjaHVua3MKKyAgLy8gdGhlcmUncyBhIHN5c3RlbSBsaW1pdCBhcm91bmQgMHgxMDAwMCBieXRlcyB0aGF0IHdlIGhpdCBvdGhlcndpc2UKKyAgLy8gTVNETjogIlBpcGUgd3JpdGUgb3BlcmF0aW9ucyBhY3Jvc3MgYSBuZXR3b3JrIGFyZSBsaW1pdGVkIHRvIDY1LDUzNSBieXRlcyBwZXIgd3JpdGUuIEZvciBtb3JlIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBwaXBlcywgc2VlIHRoZSBSZW1hcmtzIHNlY3Rpb24uIgorICBuQnl0ZXMgOj0gTWluKCAxNSo0MDk2LCBjb3VudCk7IC8vIDE2IHdvdWxkIGV4Y2VlZCB0aGUgbGltaXQKKyAgcERhdGEgIDo9IHBCdWY7CisgIEluYyggcERhdGEsIG9mZnNldCk7CisgIHdoaWxlIG5CeXRlcyA+IDAgZG8gYmVnaW4KKyAgICBvdmVybGFwcGVkIDo9IFRPdmVybGFwcGVkSGVscGVySW1wbC5DcmVhdGU7CisgICAgaWYgbm90IFdyaXRlRmlsZSggRlBpcGUsIHBEYXRhXiwgbkJ5dGVzLCBjYldyaXR0ZW4sIG92ZXJsYXBwZWQuT3ZlcmxhcHBlZFB0cikKKyAgICB0aGVuIGJlZ2luCisgICAgICBkd0Vycm9yIDo9IEdldExhc3RFcnJvcjsKKyAgICAgIGNhc2UgZHdFcnJvciBvZgorICAgICAgICBFUlJPUl9JT19QRU5ESU5HIDogYmVnaW4KKyAgICAgICAgICBkd1dhaXQgOj0gb3ZlcmxhcHBlZC5XYWl0Rm9yKEZUaW1lb3V0KTsKKworICAgICAgICAgIGlmIChkd1dhaXQgPSBXQUlUX1RJTUVPVVQpIHRoZW4gYmVnaW4KKyAgICAgICAgICAgIENhbmNlbElvKCBGUGlwZSk7ICAvLyBwcmV2ZW50cyBwb3NzaWJsZSBBViBvbiBpbnZhbGlkIG92ZXJsYXBwZWQgcHRyCisgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVGltZWRPdXQuQ3JlYXRlKCdQaXBlIHdyaXRlIHRpbWVkIG91dCcpOworICAgICAgICAgIGVuZDsKKworICAgICAgICAgIGlmIChkd1dhaXQgPD4gV0FJVF9PQkpFQ1RfMCkKKyAgICAgICAgICBvciBub3QgR2V0T3ZlcmxhcHBlZFJlc3VsdCggRlBpcGUsIG92ZXJsYXBwZWQuT3ZlcmxhcHBlZCwgY2JXcml0dGVuLCBUUlVFKQorICAgICAgICAgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKCdQaXBlIHdyaXRlIGVycm9yJyk7CisgICAgICAgIGVuZDsKKworICAgICAgZWxzZQorICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoU3lzRXJyb3JNZXNzYWdlKGR3RXJyb3IpKTsKKyAgICAgIGVuZDsKKyAgICBlbmQ7CisKKyAgICBBU1NFUlQoIERXT1JEKG5CeXRlcykgPSBjYldyaXR0ZW4pOworCisgICAgSW5jKCBwRGF0YSwgY2JXcml0dGVuKTsKKyAgICBEZWMoIGNvdW50LCBjYldyaXR0ZW4pOworICAgIG5CeXRlcyA6PSBNaW4oIG5CeXRlcywgY291bnQpOworICBlbmQ7CitlbmQ7CisKKworZnVuY3Rpb24gVFBpcGVTdHJlYW1CYXNlLlJlYWREaXJlY3QoICAgICBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7Cit2YXIgY2JSZWFkLCBkd0VyciwgblJlbWFpbmluZyAgOiBEV09SRDsKICAgICBieXRlcywgcmV0cmllcyAgOiBMb25nSW50OwogICAgIGJPayAgICAgOiBCb29sZWFuOworICAgIHBEYXRhICAgOiBQQnl0ZTsKIGNvbnN0IElOVEVSVkFMID0gMTA7ICAvLyBtcwogYmVnaW4KICAgaWYgbm90IElzT3BlbgotICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24uQ3JlYXRlKCBUVHJhbnNwb3J0RXhjZXB0aW9uLlRFeGNlcHRpb25UeXBlLk5vdE9wZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDYWxsZWQgcmVhZCBvbiBub24tb3BlbiBwaXBlJyk7CisgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdDYWxsZWQgcmVhZCBvbiBub24tb3BlbiBwaXBlJyk7CiAKICAgLy8gTVNETjogSGFuZGxlIGNhbiBiZSBhIGhhbmRsZSB0byBhIG5hbWVkIHBpcGUgaW5zdGFuY2UsCiAgIC8vIG9yIGl0IGNhbiBiZSBhIGhhbmRsZSB0byB0aGUgcmVhZCBlbmQgb2YgYW4gYW5vbnltb3VzIHBpcGUsCkBAIC0zNDMsMTExICs0MTMsODkgQEAKICAgaWYgRlRpbWVPdXQgPD4gSU5GSU5JVEUgdGhlbiBiZWdpbgogICAgIHJldHJpZXMgOj0gTWF4KCAxLCBSb3VuZCggMS4wICogRlRpbWVPdXQgLyBJTlRFUlZBTCkpOwogICAgIHdoaWxlIFRSVUUgZG8gYmVnaW4KLSAgICAgIGlmICBJc09wZW4KLSAgICAgIGFuZCBQZWVrTmFtZWRQaXBlKCBGUGlwZSwgbmlsLCAwLCBuaWwsIEBieXRlcywgbmlsKQotICAgICAgYW5kIChieXRlcyA+IDApCi0gICAgICB0aGVuIEJyZWFrOyAgLy8gdGhlcmUgYXJlIGRhdGEKLQotICAgICAgZHdFcnIgOj0gR2V0TGFzdEVycm9yOwotICAgICAgaWYgKGR3RXJyID0gRVJST1JfSU5WQUxJRF9IQU5ETEUpCi0gICAgICBvciAoZHdFcnIgPSBFUlJPUl9CUk9LRU5fUElQRSkKLSAgICAgIG9yIChkd0VyciA9IEVSUk9SX1BJUEVfTk9UX0NPTk5FQ1RFRCkKLSAgICAgIHRoZW4gYmVnaW4KLSAgICAgICAgcmVzdWx0IDo9IDA7ICAvLyBvdGhlciBzaWRlIGNsb3NlZCB0aGUgcGlwZQotICAgICAgICBFeGl0OworICAgICAgaWYgbm90IFBlZWtOYW1lZFBpcGUoIEZQaXBlLCBuaWwsIDAsIG5pbCwgQGJ5dGVzLCBuaWwpIHRoZW4gYmVnaW4KKyAgICAgICAgZHdFcnIgOj0gR2V0TGFzdEVycm9yOworICAgICAgICBpZiAoZHdFcnIgPSBFUlJPUl9JTlZBTElEX0hBTkRMRSkKKyAgICAgICAgb3IgKGR3RXJyID0gRVJST1JfQlJPS0VOX1BJUEUpCisgICAgICAgIG9yIChkd0VyciA9IEVSUk9SX1BJUEVfTk9UX0NPTk5FQ1RFRCkKKyAgICAgICAgdGhlbiBiZWdpbgorICAgICAgICAgIHJlc3VsdCA6PSAwOyAgLy8gb3RoZXIgc2lkZSBjbG9zZWQgdGhlIHBpcGUKKyAgICAgICAgICBFeGl0OworICAgICAgICBlbmQ7CisgICAgICBlbmQKKyAgICAgIGVsc2UgaWYgYnl0ZXMgPiAwIHRoZW4gYmVnaW4KKyAgICAgICAgQnJlYWs7ICAvLyB0aGVyZSBhcmUgZGF0YQogICAgICAgZW5kOwogCiAgICAgICBEZWMoIHJldHJpZXMpOwogICAgICAgaWYgcmV0cmllcyA+IDAKICAgICAgIHRoZW4gU2xlZXAoIElOVEVSVkFMKQotICAgICAgZWxzZSByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZSggVFRyYW5zcG9ydEV4Y2VwdGlvbi5URXhjZXB0aW9uVHlwZS5UaW1lZE91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQaXBlIHJlYWQgdGltZWQgb3V0Jyk7CisgICAgICBlbHNlIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25UaW1lZE91dC5DcmVhdGUoJ1BpcGUgcmVhZCB0aW1lZCBvdXQnKTsKICAgICBlbmQ7CiAgIGVuZDsKIAotICAvLyByZWFkIHRoZSBkYXRhIChvciBibG9jayBJTkZJTklURS1seSkKLSAgYk9rIDo9IFJlYWRGaWxlKCBGUGlwZSwgYnVmZmVyW29mZnNldF0sIGNvdW50LCBjYlJlYWQsIG5pbCk7Ci0gIGlmIChub3QgYk9rKSBhbmQgKEdldExhc3RFcnJvcigpIDw+IEVSUk9SX01PUkVfREFUQSkKLSAgdGhlbiByZXN1bHQgOj0gMCAvLyBObyBtb3JlIGRhdGEsIHBvc3NpYmx5IGJlY2F1c2UgY2xpZW50IGRpc2Nvbm5lY3RlZC4KLSAgZWxzZSByZXN1bHQgOj0gY2JSZWFkOwotZW5kOworICByZXN1bHQgOj0gMDsKKyAgblJlbWFpbmluZyA6PSBjb3VudDsKKyAgcERhdGEgOj0gcEJ1ZjsKKyAgSW5jKCBwRGF0YSwgb2Zmc2V0KTsKKyAgd2hpbGUgblJlbWFpbmluZyA+IDAgZG8gYmVnaW4KKyAgICAvLyByZWFkIHRoZSBkYXRhIChvciBibG9jayBJTkZJTklURS1seSkKKyAgICBiT2sgOj0gUmVhZEZpbGUoIEZQaXBlLCBwRGF0YV4sIG5SZW1haW5pbmcsIGNiUmVhZCwgbmlsKTsKKyAgICBpZiAobm90IGJPaykgYW5kIChHZXRMYXN0RXJyb3IoKSA8PiBFUlJPUl9NT1JFX0RBVEEpCisgICAgdGhlbiBCcmVhazsgLy8gTm8gbW9yZSBkYXRhLCBwb3NzaWJseSBiZWNhdXNlIGNsaWVudCBkaXNjb25uZWN0ZWQuCiAKLQotcHJvY2VkdXJlIFRQaXBlU3RyZWFtQmFzZS5Xcml0ZU92ZXJsYXBwZWQoY29uc3QgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldCwgY291bnQ6IEludGVnZXIpOwotdmFyIGNiV3JpdHRlbiwgZHdXYWl0LCBkd0Vycm9yIDogRFdPUkQ7Ci0gICAgb3ZlcmxhcHBlZCA6IElPdmVybGFwcGVkSGVscGVyOwotYmVnaW4KLSAgaWYgbm90IElzT3BlbgotICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24uQ3JlYXRlKCBUVHJhbnNwb3J0RXhjZXB0aW9uLlRFeGNlcHRpb25UeXBlLk5vdE9wZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDYWxsZWQgd3JpdGUgb24gbm9uLW9wZW4gcGlwZScpOwotCi0gIG92ZXJsYXBwZWQgOj0gVE92ZXJsYXBwZWRIZWxwZXJJbXBsLkNyZWF0ZTsKLQotICBpZiBub3QgV3JpdGVGaWxlKCBGUGlwZSwgYnVmZmVyW29mZnNldF0sIGNvdW50LCBjYldyaXR0ZW4sIG92ZXJsYXBwZWQuT3ZlcmxhcHBlZFB0cikKLSAgdGhlbiBiZWdpbgotICAgIGR3RXJyb3IgOj0gR2V0TGFzdEVycm9yOwotICAgIGNhc2UgZHdFcnJvciBvZgotICAgICAgRVJST1JfSU9fUEVORElORyA6IGJlZ2luCi0gICAgICAgIGR3V2FpdCA6PSBvdmVybGFwcGVkLldhaXRGb3IoRlRpbWVvdXQpOwotCi0gICAgICAgIGlmIChkd1dhaXQgPSBXQUlUX1RJTUVPVVQpCi0gICAgICAgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoIFRUcmFuc3BvcnRFeGNlcHRpb24uVEV4Y2VwdGlvblR5cGUuVGltZWRPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQaXBlIHdyaXRlIHRpbWVkIG91dCcpOwotCi0gICAgICAgIGlmIChkd1dhaXQgPD4gV0FJVF9PQkpFQ1RfMCkKLSAgICAgICAgb3Igbm90IEdldE92ZXJsYXBwZWRSZXN1bHQoIEZQaXBlLCBvdmVybGFwcGVkLk92ZXJsYXBwZWQsIGNiV3JpdHRlbiwgVFJVRSkKLSAgICAgICAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZSggVFRyYW5zcG9ydEV4Y2VwdGlvbi5URXhjZXB0aW9uVHlwZS5Vbmtub3duLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUGlwZSB3cml0ZSBlcnJvcicpOwotICAgICAgZW5kOwotCi0gICAgZWxzZQotICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoIFRUcmFuc3BvcnRFeGNlcHRpb24uVEV4Y2VwdGlvblR5cGUuVW5rbm93biwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXNFcnJvck1lc3NhZ2UoZHdFcnJvcikpOwotICAgIGVuZDsKKyAgICBEZWMoIG5SZW1haW5pbmcsIGNiUmVhZCk7CisgICAgSW5jKCBwRGF0YSwgY2JSZWFkKTsKKyAgICBJbmMoIHJlc3VsdCwgY2JSZWFkKTsKICAgZW5kOwotCi0gIEFTU0VSVCggRFdPUkQoY291bnQpID0gY2JXcml0dGVuKTsKIGVuZDsKIAogCi1mdW5jdGlvbiBUUGlwZVN0cmVhbUJhc2UuUmVhZE92ZXJsYXBwZWQoIHZhciBidWZmZXI6IFRCeXRlczsgb2Zmc2V0LCBjb3VudDogSW50ZWdlcik6IEludGVnZXI7Ci12YXIgY2JSZWFkLCBkd1dhaXQsIGR3RXJyb3IgIDogRFdPUkQ7CitmdW5jdGlvbiBUUGlwZVN0cmVhbUJhc2UuUmVhZE92ZXJsYXBwZWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsKK3ZhciBjYlJlYWQsIGR3V2FpdCwgZHdFcnJvciwgblJlbWFpbmluZyA6IERXT1JEOwogICAgIGJPayAgICAgOiBCb29sZWFuOwogICAgIG92ZXJsYXBwZWQgOiBJT3ZlcmxhcHBlZEhlbHBlcjsKKyAgICBwRGF0YSAgIDogUEJ5dGU7CiBiZWdpbgogICBpZiBub3QgSXNPcGVuCi0gIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoIFRUcmFuc3BvcnRFeGNlcHRpb24uVEV4Y2VwdGlvblR5cGUuTm90T3BlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NhbGxlZCByZWFkIG9uIG5vbi1vcGVuIHBpcGUnKTsKKyAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ0NhbGxlZCByZWFkIG9uIG5vbi1vcGVuIHBpcGUnKTsKIAotICBvdmVybGFwcGVkIDo9IFRPdmVybGFwcGVkSGVscGVySW1wbC5DcmVhdGU7CisgIHJlc3VsdCA6PSAwOworICBuUmVtYWluaW5nIDo9IGNvdW50OworICBwRGF0YSA6PSBwQnVmOworICBJbmMoIHBEYXRhLCBvZmZzZXQpOworICB3aGlsZSBuUmVtYWluaW5nID4gMCBkbyBiZWdpbgorICAgIG92ZXJsYXBwZWQgOj0gVE92ZXJsYXBwZWRIZWxwZXJJbXBsLkNyZWF0ZTsKIAotICAvLyByZWFkIHRoZSBkYXRhCi0gIGJPayA6PSBSZWFkRmlsZSggRlBpcGUsIGJ1ZmZlcltvZmZzZXRdLCBjb3VudCwgY2JSZWFkLCBvdmVybGFwcGVkLk92ZXJsYXBwZWRQdHIpOwotICBpZiBub3QgYk9rIHRoZW4gYmVnaW4KLSAgICBkd0Vycm9yIDo9IEdldExhc3RFcnJvcjsKLSAgICBjYXNlIGR3RXJyb3Igb2YKLSAgICAgIEVSUk9SX0lPX1BFTkRJTkcgOiBiZWdpbgotICAgICAgICBkd1dhaXQgOj0gb3ZlcmxhcHBlZC5XYWl0Rm9yKEZUaW1lb3V0KTsKKyAgICAgLy8gcmVhZCB0aGUgZGF0YQorICAgIGJPayA6PSBSZWFkRmlsZSggRlBpcGUsIHBEYXRhXiwgblJlbWFpbmluZywgY2JSZWFkLCBvdmVybGFwcGVkLk92ZXJsYXBwZWRQdHIpOworICAgIGlmIG5vdCBiT2sgdGhlbiBiZWdpbgorICAgICAgZHdFcnJvciA6PSBHZXRMYXN0RXJyb3I7CisgICAgICBjYXNlIGR3RXJyb3Igb2YKKyAgICAgICAgRVJST1JfSU9fUEVORElORyA6IGJlZ2luCisgICAgICAgICAgZHdXYWl0IDo9IG92ZXJsYXBwZWQuV2FpdEZvcihGVGltZW91dCk7CiAKLSAgICAgICAgaWYgKGR3V2FpdCA9IFdBSVRfVElNRU9VVCkKLSAgICAgICAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZSggVFRyYW5zcG9ydEV4Y2VwdGlvbi5URXhjZXB0aW9uVHlwZS5UaW1lZE91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1BpcGUgcmVhZCB0aW1lZCBvdXQnKTsKKyAgICAgICAgICBpZiAoZHdXYWl0ID0gV0FJVF9USU1FT1VUKSB0aGVuIGJlZ2luCisgICAgICAgICAgICBDYW5jZWxJbyggRlBpcGUpOyAgLy8gcHJldmVudHMgcG9zc2libGUgQVYgb24gaW52YWxpZCBvdmVybGFwcGVkIHB0cgorICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblRpbWVkT3V0LkNyZWF0ZSgnUGlwZSByZWFkIHRpbWVkIG91dCcpOworICAgICAgICAgIGVuZDsKIAotICAgICAgICBpZiAoZHdXYWl0IDw+IFdBSVRfT0JKRUNUXzApCi0gICAgICAgIG9yIG5vdCBHZXRPdmVybGFwcGVkUmVzdWx0KCBGUGlwZSwgb3ZlcmxhcHBlZC5PdmVybGFwcGVkLCBjYlJlYWQsIFRSVUUpCi0gICAgICAgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoIFRUcmFuc3BvcnRFeGNlcHRpb24uVEV4Y2VwdGlvblR5cGUuVW5rbm93biwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1BpcGUgcmVhZCBlcnJvcicpOworICAgICAgICAgIGlmIChkd1dhaXQgPD4gV0FJVF9PQkpFQ1RfMCkKKyAgICAgICAgICBvciBub3QgR2V0T3ZlcmxhcHBlZFJlc3VsdCggRlBpcGUsIG92ZXJsYXBwZWQuT3ZlcmxhcHBlZCwgY2JSZWFkLCBUUlVFKQorICAgICAgICAgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKCdQaXBlIHJlYWQgZXJyb3InKTsKKyAgICAgICAgZW5kOworCisgICAgICBlbHNlCisgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Vbmtub3duLkNyZWF0ZShTeXNFcnJvck1lc3NhZ2UoZHdFcnJvcikpOwogICAgICAgZW5kOwotCi0gICAgZWxzZQotICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoIFRUcmFuc3BvcnRFeGNlcHRpb24uVEV4Y2VwdGlvblR5cGUuVW5rbm93biwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXNFcnJvck1lc3NhZ2UoZHdFcnJvcikpOwogICAgIGVuZDsKLSAgZW5kOwogCi0gIEFTU0VSVCggY2JSZWFkID4gMCk7ICAvLyBzZWUgVFRyYW5zcG9ydEltcGwuUmVhZEFsbCgpCi0gIEFTU0VSVCggY2JSZWFkID0gRFdPUkQoY291bnQpKTsKLSAgcmVzdWx0IDo9IGNiUmVhZDsKKyAgICBBU1NFUlQoIGNiUmVhZCA+IDApOyAgLy8gc2VlIFRUcmFuc3BvcnRJbXBsLlJlYWRBbGwoKQorICAgIEFTU0VSVCggY2JSZWFkIDw9IERXT1JEKG5SZW1haW5pbmcpKTsKKyAgICBEZWMoIG5SZW1haW5pbmcsIGNiUmVhZCk7CisgICAgSW5jKCBwRGF0YSwgY2JSZWFkKTsKKyAgICBJbmMoIHJlc3VsdCwgY2JSZWFkKTsKKyAgZW5kOwogZW5kOwogCiAKQEAgLTQ3NCw5ICs1MjIsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhRW5hYmxlT3ZlcmxhcHBlZCA6IEJvb2xlYW47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFTaGFyZU1vZGU6IERXT1JEOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhU2VjdXJpdHlBdHRyaWJ1dGVzOiBQU2VjdXJpdHlBdHRyaWJ1dGVzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhVGltZU91dCA6IERXT1JEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYVRpbWVPdXQsIGFPcGVuVGltZU91dCA6IERXT1JEKTsKIGJlZ2luCi0gIGluaGVyaXRlZCBDcmVhdGUoIGFFbmFibGVPdmVybGFwcGVkLCBhVGltZW91dCk7CisgIGluaGVyaXRlZCBDcmVhdGUoIGFFbmFibGVPdmVybGFwcGVkLCBhVGltZW91dCwgYU9wZW5UaW1lT3V0KTsKIAogICBGUGlwZU5hbWUgICAgICAgIDo9IGFQaXBlTmFtZTsKICAgRlNoYXJlTW9kZSAgICAgICA6PSBhU2hhcmVNb2RlOwpAQCAtNDg5LDE1ICs1MzcsMzMgQEAKIAogcHJvY2VkdXJlIFROYW1lZFBpcGVTdHJlYW1JbXBsLk9wZW47CiB2YXIgaFBpcGUgICAgOiBUSGFuZGxlOworICAgIHJldHJpZXMsIHRpbWVvdXQsIGR3RXJyIDogRFdPUkQ7Citjb25zdCBJTlRFUlZBTCA9IDEwOyAvLyBtcwogYmVnaW4KICAgaWYgSXNPcGVuIHRoZW4gRXhpdDsKIAorICByZXRyaWVzIDo9IE1heCggMSwgUm91bmQoIDEuMCAqIEZPcGVuVGltZU91dCAvIElOVEVSVkFMKSk7CisgIHRpbWVvdXQgOj0gRk9wZW5UaW1lT3V0OworCisgIC8vIGlmIHRoZSBzZXJ2ZXIgaGFzbid0IGdvdHRlbiB0byB0aGUgcG9pbnQgd2hlcmUgdGhlIHBpcGUgaGFzIGJlZW4gY3JlYXRlZCwgYXQgbGVhc3Qgd2FpdCB0aGUgdGltZW91dAorICAvLyBBY2NvcmRpbmcgdG8gTVNETiwgaWYgbm8gaW5zdGFuY2VzIG9mIHRoZSBzcGVjaWZpZWQgbmFtZWQgcGlwZSBleGlzdCwgdGhlIFdhaXROYW1lZFBpcGUgZnVuY3Rpb24KKyAgLy8gcmV0dXJucyBJTU1FRElBVEVMWSwgcmVnYXJkbGVzcyBvZiB0aGUgdGltZS1vdXQgdmFsdWUuCisgIC8vIEFsd2F5cyB1c2UgSU5URVJWQUwsIHNpbmNlIFdhaXROYW1lZFBpcGUoMCkgZGVmYXVsdHMgdG8gc29tZSBvdGhlciB2YWx1ZQorICB3aGlsZSBub3QgV2FpdE5hbWVkUGlwZSggUENoYXIoRlBpcGVOYW1lKSwgSU5URVJWQUwpIGRvIGJlZ2luCisgICAgZHdFcnIgOj0gR2V0TGFzdEVycm9yOworICAgIGlmIGR3RXJyIDw+IEVSUk9SX0ZJTEVfTk9UX0ZPVU5ECisgICAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ1VuYWJsZSB0byBvcGVuIHBpcGUsICcrU3lzRXJyb3JNZXNzYWdlKGR3RXJyKSk7CisKKyAgICBpZiB0aW1lb3V0IDw+IElORklOSVRFIHRoZW4gYmVnaW4KKyAgICAgIGlmIChyZXRyaWVzID4gMCkKKyAgICAgIHRoZW4gRGVjKHJldHJpZXMpCisgICAgICBlbHNlIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnVW5hYmxlIHRvIG9wZW4gcGlwZSwgdGltZWQgb3V0Jyk7CisgICAgZW5kOworCisgICAgU2xlZXAoSU5URVJWQUwpCisgIGVuZDsKKwogICAvLyBvcGVuIHRoYXQgdGhpbmd5Ci0KLSAgaWYgbm90IFdhaXROYW1lZFBpcGUoIFBDaGFyKEZQaXBlTmFtZSksIEZUaW1lb3V0KQotICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24uQ3JlYXRlKCBUVHJhbnNwb3J0RXhjZXB0aW9uLlRFeGNlcHRpb25UeXBlLk5vdE9wZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdVbmFibGUgdG8gb3BlbiBwaXBlLCAnK1N5c0Vycm9yTWVzc2FnZShHZXRMYXN0RXJyb3IpKTsKLQogICBoUGlwZSA6PSBDcmVhdGVGaWxlKCBQQ2hhciggRlBpcGVOYW1lKSwKICAgICAgICAgICAgICAgICAgICAgICAgR0VORVJJQ19SRUFEIG9yIEdFTkVSSUNfV1JJVEUsCiAgICAgICAgICAgICAgICAgICAgICAgIEZTaGFyZU1vZGUsICAgICAgICAvLyBzaGFyaW5nCkBAIC01MDcsOCArNTczLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgMCk7ICAgICAgICAgICAgICAgIC8vIG5vIHRlbXBsYXRlIGZpbGUKIAogICBpZiBoUGlwZSA9IElOVkFMSURfSEFORExFX1ZBTFVFCi0gIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoIFRUcmFuc3BvcnRFeGNlcHRpb24uVEV4Y2VwdGlvblR5cGUuTm90T3BlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1VuYWJsZSB0byBvcGVuIHBpcGUsICcrU3lzRXJyb3JNZXNzYWdlKEdldExhc3RFcnJvcikpOworICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnVW5hYmxlIHRvIG9wZW4gcGlwZSwgJytTeXNFcnJvck1lc3NhZ2UoR2V0TGFzdEVycm9yKSk7CiAKICAgLy8gZXZlcnl0aGluZyBmaW5lCiAgIEZQaXBlIDo9IGhQaXBlOwpAQCAtNTc4LDExICs2NDMsMTEgQEAKIAogY29uc3RydWN0b3IgVE5hbWVkUGlwZVRyYW5zcG9ydENsaWVudEVuZEltcGwuQ3JlYXRlKCBjb25zdCBhUGlwZU5hbWUgOiBzdHJpbmc7IGNvbnN0IGFTaGFyZU1vZGU6IERXT1JEOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhU2VjdXJpdHlBdHRyaWJ1dGVzOiBQU2VjdXJpdHlBdHRyaWJ1dGVzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhVGltZU91dCA6IERXT1JEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYVRpbWVPdXQsIGFPcGVuVGltZU91dCA6IERXT1JEKTsKIC8vIE5hbWVkIHBpcGUgY29uc3RydWN0b3IKIGJlZ2luCiAgIGluaGVyaXRlZCBDcmVhdGUoIG5pbCwgbmlsKTsKLSAgRklucHV0U3RyZWFtICA6PSBUTmFtZWRQaXBlU3RyZWFtSW1wbC5DcmVhdGUoIGFQaXBlTmFtZSwgVFJVRSwgYVNoYXJlTW9kZSwgYVNlY3VyaXR5QXR0cmlidXRlcywgYVRpbWVPdXQpOworICBGSW5wdXRTdHJlYW0gIDo9IFROYW1lZFBpcGVTdHJlYW1JbXBsLkNyZWF0ZSggYVBpcGVOYW1lLCBUUlVFLCBhU2hhcmVNb2RlLCBhU2VjdXJpdHlBdHRyaWJ1dGVzLCBhVGltZU91dCwgYU9wZW5UaW1lT3V0KTsKICAgRk91dHB1dFN0cmVhbSA6PSBGSW5wdXRTdHJlYW07ICAvLyB0cnVlIGZvciBuYW1lZCBwaXBlcwogZW5kOwogCkBAIC02MjIsMTMgKzY4NywxNSBAQAogeyBUQW5vbnltb3VzUGlwZVRyYW5zcG9ydEltcGwgfQogCiAKLWNvbnN0cnVjdG9yIFRBbm9ueW1vdXNQaXBlVHJhbnNwb3J0SW1wbC5DcmVhdGUoIGNvbnN0IGFQaXBlUmVhZCwgYVBpcGVXcml0ZSA6IFRIYW5kbGU7IGFPd25zSGFuZGxlcyA6IEJvb2xlYW4pOworY29uc3RydWN0b3IgVEFub255bW91c1BpcGVUcmFuc3BvcnRJbXBsLkNyZWF0ZSggY29uc3QgYVBpcGVSZWFkLCBhUGlwZVdyaXRlIDogVEhhbmRsZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFPd25zSGFuZGxlcyA6IEJvb2xlYW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhVGltZU91dCA6IERXT1JEID0gREVGQVVMVF9USFJJRlRfVElNRU9VVCk7CiAvLyBBbm9ueW1vdXMgcGlwZSBjb25zdHJ1Y3RvcgogYmVnaW4KICAgaW5oZXJpdGVkIENyZWF0ZSggbmlsLCBuaWwpOwogICAvLyBvdmVybGFwcGVkIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aCBBbm9uUGlwZXMsIHNlZSBNU0ROCi0gIEZJbnB1dFN0cmVhbSAgOj0gVEhhbmRsZVBpcGVTdHJlYW1JbXBsLkNyZWF0ZSggYVBpcGVSZWFkLCBhT3duc0hhbmRsZXMsIEZBTFNFKTsKLSAgRk91dHB1dFN0cmVhbSA6PSBUSGFuZGxlUGlwZVN0cmVhbUltcGwuQ3JlYXRlKCBhUGlwZVdyaXRlLCBhT3duc0hhbmRsZXMsIEZBTFNFKTsKKyAgRklucHV0U3RyZWFtICA6PSBUSGFuZGxlUGlwZVN0cmVhbUltcGwuQ3JlYXRlKCBhUGlwZVJlYWQsIGFPd25zSGFuZGxlcywgRkFMU0UsIGFUaW1lT3V0KTsKKyAgRk91dHB1dFN0cmVhbSA6PSBUSGFuZGxlUGlwZVN0cmVhbUltcGwuQ3JlYXRlKCBhUGlwZVdyaXRlLCBhT3duc0hhbmRsZXMsIEZBTFNFLCBhVGltZU91dCk7CiBlbmQ7CiAKIApAQCAtNjc1LDcgKzc0Miw3IEBACiB7IFRBbm9ueW1vdXNQaXBlU2VydmVyVHJhbnNwb3J0SW1wbCB9CiAKIAotY29uc3RydWN0b3IgVEFub255bW91c1BpcGVTZXJ2ZXJUcmFuc3BvcnRJbXBsLkNyZWF0ZSggYUJ1ZnNpemUgOiBDYXJkaW5hbCk7Citjb25zdHJ1Y3RvciBUQW5vbnltb3VzUGlwZVNlcnZlclRyYW5zcG9ydEltcGwuQ3JlYXRlKGFCdWZzaXplIDogQ2FyZGluYWw7IGFUaW1lT3V0IDogRFdPUkQpOwogLy8gQW5vbnltb3VzIHBpcGUgQ1RPUgogYmVnaW4KICAgaW5oZXJpdGVkIENyZWF0ZTsKQEAgLTY4NCwxMyArNzUxLDEzIEBACiAgIEZXcml0ZUhhbmRsZSA6PSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKICAgRkNsaWVudEFub25SZWFkIDo9IElOVkFMSURfSEFORExFX1ZBTFVFOwogICBGQ2xpZW50QW5vbldyaXRlIDo9IElOVkFMSURfSEFORExFX1ZBTFVFOworICBGVGltZU91dCA6PSBhVGltZU91dDsKIAogICAvLyBUaGUgYW5vbnltb3VzIHBpcGUgbmVlZHMgdG8gYmUgY3JlYXRlZCBmaXJzdCBzbyB0aGF0IHRoZSBzZXJ2ZXIgY2FuCiAgIC8vIHBhc3MgdGhlIGhhbmRsZXMgb24gdG8gdGhlIGNsaWVudCBiZWZvcmUgdGhlIHNlcnZlIChhY2NlcHRJbXBsKQogICAvLyBibG9ja2luZyBjYWxsLgogICBpZiBub3QgQ3JlYXRlQW5vblBpcGUKLSAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZSggVFRyYW5zcG9ydEV4Y2VwdGlvbi5URXhjZXB0aW9uVHlwZS5Ob3RPcGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc05hbWUrJy5DcmVhdGUoKSBmYWlsZWQnKTsKKyAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoQ2xhc3NOYW1lKycuQ3JlYXRlKCkgZmFpbGVkJyk7CiBlbmQ7CiAKIApAQCAtNzA0LDExICs3NzEsMTAgQEAKICAgLy8gVGhpcyAwLWJ5dGUgcmVhZCBzZXJ2ZXMgbWVyZWx5IGFzIGEgYmxvY2tpbmcgY2FsbC4KICAgaWYgbm90IFJlYWRGaWxlKCBGUmVhZEhhbmRsZSwgYnVmLCAwLCBiciwgbmlsKQogICBhbmQgKEdldExhc3RFcnJvcigpIDw+IEVSUk9SX01PUkVfREFUQSkKLSAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZSggVFRyYW5zcG9ydEV4Y2VwdGlvbi5URXhjZXB0aW9uVHlwZS5Ob3RPcGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVFNlcnZlclBpcGUgdW5hYmxlIHRvIGluaXRpYXRlIHBpcGUgY29tbXVuaWNhdGlvbicpOworICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnVFNlcnZlclBpcGUgdW5hYmxlIHRvIGluaXRpYXRlIHBpcGUgY29tbXVuaWNhdGlvbicpOwogCiAgIC8vIGNyZWF0ZSB0aGUgdHJhbnNwb3J0IGltcGwKLSAgcmVzdWx0IDo9IFRBbm9ueW1vdXNQaXBlVHJhbnNwb3J0SW1wbC5DcmVhdGUoIEZSZWFkSGFuZGxlLCBGV3JpdGVIYW5kbGUsIEZBTFNFKTsKKyAgcmVzdWx0IDo9IFRBbm9ueW1vdXNQaXBlVHJhbnNwb3J0SW1wbC5DcmVhdGUoIEZSZWFkSGFuZGxlLCBGV3JpdGVIYW5kbGUsIEZBTFNFLCBGVGltZU91dCk7CiBlbmQ7CiAKIApAQCAtNzUwLDggKzgxNiw2IEBACiAgICAgc2EgICAgICAgICAgIDogU0VDVVJJVFlfQVRUUklCVVRFUzsgLy9UU2VjdXJpdHlBdHRyaWJ1dGVzOwogICAgIGhDQVIsIGhQaXBlVywgaENBVywgaFBpcGUgOiBUSGFuZGxlOwogYmVnaW4KLSAgcmVzdWx0IDo9IEZBTFNFOwotCiAgIHNkIDo9IFBTRUNVUklUWV9ERVNDUklQVE9SKCBMb2NhbEFsbG9jKCBMUFRSLFNFQ1VSSVRZX0RFU0NSSVBUT1JfTUlOX0xFTkdUSCkpOwogICB0cnkKICAgICBXaW4zMkNoZWNrKCBJbml0aWFsaXplU2VjdXJpdHlEZXNjcmlwdG9yKCBzZCwgU0VDVVJJVFlfREVTQ1JJUFRPUl9SRVZJU0lPTikpOwpAQCAtNzYxLDE3ICs4MjUsMTcgQEAKICAgICBzYS5scFNlY3VyaXR5RGVzY3JpcHRvciA6PSBzZDsKICAgICBzYS5iSW5oZXJpdEhhbmRsZSAgICAgICA6PSBUUlVFOyAvL2FsbG93IHBhc3NpbmcgaGFuZGxlIHRvIGNoaWxkCiAKLSAgICBpZiBub3QgQ3JlYXRlUGlwZSggaENBUiwgaFBpcGVXLCBAc2EsIEZCdWZTaXplKSB0aGVuIGJlZ2luICAgLy9jcmVhdGUgc3RkaW4gcGlwZQotICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoIFRUcmFuc3BvcnRFeGNlcHRpb24uVEV4Y2VwdGlvblR5cGUuTm90T3BlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVFNlcnZlclBpcGUgQ3JlYXRlUGlwZSAoYW5vbikgZmFpbGVkLCAnK1N5c0Vycm9yTWVzc2FnZShHZXRMYXN0RXJyb3IpKTsKKyAgICBSZXN1bHQgOj0gQ3JlYXRlUGlwZSggaENBUiwgaFBpcGVXLCBAc2EsIEZCdWZTaXplKTsgLy9jcmVhdGUgc3RkaW4gcGlwZQorICAgIGlmIG5vdCBSZXN1bHQgdGhlbiBiZWdpbiAgIC8vY3JlYXRlIHN0ZGluIHBpcGUKKyAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnVFNlcnZlclBpcGUgQ3JlYXRlUGlwZSAoYW5vbikgZmFpbGVkLCAnK1N5c0Vycm9yTWVzc2FnZShHZXRMYXN0RXJyb3IpKTsKICAgICAgIEV4aXQ7CiAgICAgZW5kOwogCi0gICAgaWYgbm90IENyZWF0ZVBpcGUoIGhQaXBlLCBoQ0FXLCBAc2EsIEZCdWZTaXplKSB0aGVuIGJlZ2luICAvL2NyZWF0ZSBzdGRvdXQgcGlwZQorICAgIFJlc3VsdCA6PSBDcmVhdGVQaXBlKCBoUGlwZSwgaENBVywgQHNhLCBGQnVmU2l6ZSk7IC8vY3JlYXRlIHN0ZG91dCBwaXBlCisgICAgaWYgbm90IFJlc3VsdCB0aGVuIGJlZ2luICAvL2NyZWF0ZSBzdGRvdXQgcGlwZQogICAgICAgQ2xvc2VIYW5kbGUoIGhDQVIpOwogICAgICAgQ2xvc2VIYW5kbGUoIGhQaXBlVyk7Ci0gICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZSggVFRyYW5zcG9ydEV4Y2VwdGlvbi5URXhjZXB0aW9uVHlwZS5Ob3RPcGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUU2VydmVyUGlwZSBDcmVhdGVQaXBlIChhbm9uKSBmYWlsZWQsICcrU3lzRXJyb3JNZXNzYWdlKEdldExhc3RFcnJvcikpOworICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdUU2VydmVyUGlwZSBDcmVhdGVQaXBlIChhbm9uKSBmYWlsZWQsICcrU3lzRXJyb3JNZXNzYWdlKEdldExhc3RFcnJvcikpOwogICAgICAgRXhpdDsKICAgICBlbmQ7CiAKQEAgLTc3OSw5ICs4NDMsNiBAQAogICAgIEZDbGllbnRBbm9uV3JpdGUgOj0gaENBVzsKICAgICBGUmVhZEhhbmRsZSAgICAgIDo9IGhQaXBlOwogICAgIEZXcml0ZUhhbmRsZSAgICAgOj0gaFBpcGVXOwotCi0gICAgcmVzdWx0IDo9IFRSVUU7Ci0KICAgZmluYWxseQogICAgIGlmIHNkIDw+IG5pbCB0aGVuIExvY2FsRnJlZSggQ2FyZGluYWwoc2QpKTsKICAgZW5kOwpAQCAtODE5LDggKzg4MCwxMCBAQAogICBDcmVhdGVOYW1lZFBpcGU7CiAgIHdoaWxlIG5vdCBGQ29ubmVjdGVkIGRvIGJlZ2luCiAKLSAgICBpZiBRdWVyeVN0b3BTZXJ2ZXIKLSAgICB0aGVuIEFib3J0OworICAgIGlmIFF1ZXJ5U3RvcFNlcnZlciB0aGVuIGJlZ2luCisgICAgICBJbnRlcm5hbENsb3NlOworICAgICAgQWJvcnQ7CisgICAgZW5kOwogCiAgICAgaWYgQXNzaWduZWQoZm5BY2NlcHRpbmcpCiAgICAgdGhlbiBmbkFjY2VwdGluZygpOwpAQCAtODUyLDggKzkxNSw3IEBACiAKICAgICBlbHNlCiAgICAgICBJbnRlcm5hbENsb3NlOwotICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoIFRUcmFuc3BvcnRFeGNlcHRpb24uVEV4Y2VwdGlvblR5cGUuTm90T3BlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ2xpZW50IGNvbm5lY3Rpb24gZmFpbGVkJyk7CisgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ0NsaWVudCBjb25uZWN0aW9uIGZhaWxlZCcpOwogICAgIGVuZDsKICAgZW5kOwogCkBAIC04OTgsNyArOTYwLDcgQEAKIGZ1bmN0aW9uIFROYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnRJbXBsLkhhbmRsZSA6IFRIYW5kbGU7CiBiZWdpbgogICB7JElGREVGIFdJTjY0fQotICByZXN1bHQgOj0gVEhhbmRsZSggSW50ZXJsb2NrZWRFeGNoYW5nZUFkZDY0KCBJbnRlZ2VyKEZIYW5kbGUpLCAwKSk7CisgIHJlc3VsdCA6PSBUSGFuZGxlKCBJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkNjQoIEludDY0KEZIYW5kbGUpLCAwKSk7CiAgIHskRUxTRX0KICAgcmVzdWx0IDo9IFRIYW5kbGUoIEludGVybG9ja2VkRXhjaGFuZ2VBZGQoIEludGVnZXIoRkhhbmRsZSksIDApKTsKICAgeyRFTkRJRn0KQEAgLTk0NiwyMSArMTAwOCwyNiBAQAogICAgIHNhLmJJbmhlcml0SGFuZGxlICAgICAgIDo9IEZBTFNFOwogCiAgICAgLy8gQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBuYW1lZCBwaXBlCi0gICAgcmVzdWx0IDo9IFdpbmRvd3MuQ3JlYXRlTmFtZWRQaXBlKCBQQ2hhciggRlBpcGVOYW1lKSwgICAgICAgIC8vIHBpcGUgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUElQRV9BQ0NFU1NfRFVQTEVYIG9yICAgICAvLyByZWFkL3dyaXRlIGFjY2VzcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklMRV9GTEFHX09WRVJMQVBQRUQsICAgICAvLyBhc3luYyBtb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSVBFX1RZUEVfQllURSBvciAgICAgICAgIC8vIGJ5dGUgdHlwZSBwaXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSVBFX1JFQURNT0RFX0JZVEUsICAgICAgIC8vIGJ5dGUgcmVhZCBtb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTWF4Q29ubnMsICAgICAgICAgICAgICAgIC8vIG1heC4gaW5zdGFuY2VzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQnVmU2l6ZSwgICAgICAgICAgICAgICAgIC8vIG91dHB1dCBidWZmZXIgc2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkJ1ZlNpemUsICAgICAgICAgICAgICAgICAvLyBpbnB1dCBidWZmZXIgc2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRpbWVvdXQsICAgICAgICAgICAgICAgICAvLyB0aW1lLW91dCwgc2VlIE1TRE4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBzYSk7ICAgICAgICAgICAgICAgICAgICAgLy8gZGVmYXVsdCBzZWN1cml0eSBhdHRyaWJ1dGUKKyAgICB7JElGREVGIE9MRF9VTklUX05BTUVTfQorICAgIHJlc3VsdCA6PSBXaW5kb3dzLkNyZWF0ZU5hbWVkUGlwZSgKKyAgICB7JEVMU0V9CisgICAgcmVzdWx0IDo9IFdpbmFwaS5XaW5kb3dzLkNyZWF0ZU5hbWVkUGlwZSgKKyAgICB7JEVORElGfQorICAgICAgICBQQ2hhciggRlBpcGVOYW1lKSwgICAgICAgIC8vIHBpcGUgbmFtZQorICAgICAgICBQSVBFX0FDQ0VTU19EVVBMRVggb3IgICAgIC8vIHJlYWQvd3JpdGUgYWNjZXNzCisgICAgICAgIEZJTEVfRkxBR19PVkVSTEFQUEVELCAgICAgLy8gYXN5bmMgbW9kZQorICAgICAgICBQSVBFX1RZUEVfQllURSBvciAgICAgICAgIC8vIGJ5dGUgdHlwZSBwaXBlCisgICAgICAgIFBJUEVfUkVBRE1PREVfQllURSwgICAgICAgLy8gYnl0ZSByZWFkIG1vZGUKKyAgICAgICAgRk1heENvbm5zLCAgICAgICAgICAgICAgICAvLyBtYXguIGluc3RhbmNlcworICAgICAgICBGQnVmU2l6ZSwgICAgICAgICAgICAgICAgIC8vIG91dHB1dCBidWZmZXIgc2l6ZQorICAgICAgICBGQnVmU2l6ZSwgICAgICAgICAgICAgICAgIC8vIGlucHV0IGJ1ZmZlciBzaXplCisgICAgICAgIEZUaW1lb3V0LCAgICAgICAgICAgICAgICAgLy8gdGltZS1vdXQsIHNlZSBNU0ROCisgICAgICAgIEBzYSAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVmYXVsdCBzZWN1cml0eSBhdHRyaWJ1dGUKKyAgICApOwogCiAgICAgaWYoIHJlc3VsdCA8PiBJTlZBTElEX0hBTkRMRV9WQUxVRSkKICAgICB0aGVuIEludGVybG9ja2VkRXhjaGFuZ2VQb2ludGVyKCBQb2ludGVyKEZIYW5kbGUpLCBQb2ludGVyKHJlc3VsdCkpCi0gICAgZWxzZSByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZSggVFRyYW5zcG9ydEV4Y2VwdGlvbi5URXhjZXB0aW9uVHlwZS5Ob3RPcGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDcmVhdGVOYW1lZFBpcGUoKSBmYWlsZWQgJyArIEludFRvU3RyKEdldExhc3RFcnJvcikpOworICAgIGVsc2UgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdDcmVhdGVOYW1lZFBpcGUoKSBmYWlsZWQgJyArIEludFRvU3RyKEdldExhc3RFcnJvcikpOwogCiAgIGZpbmFsbHkKICAgICBpZiBzZCA8PiBuaWwgdGhlbiBMb2NhbEZyZWUoIENhcmRpbmFsKCBzZCkpOwpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlRyYW5zcG9ydC5wYXMgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuVHJhbnNwb3J0LnBhcwppbmRleCBjNDg1ZTcwLi5kYWQ5YWI3IDEwMDY0NAotLS0gYS9saWIvZGVscGhpL3NyYy9UaHJpZnQuVHJhbnNwb3J0LnBhcworKysgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuVHJhbnNwb3J0LnBhcwpAQCAtMTYsMzcgKzE2LDQ5IEBACiAgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqKQotCi0geyRTQ09QRURFTlVNUyBPTn0KLQogdW5pdCBUaHJpZnQuVHJhbnNwb3J0OwogCit7JEkgVGhyaWZ0LkRlZmluZXMuaW5jfQoreyRTQ09QRURFTlVNUyBPTn0KKwogaW50ZXJmYWNlCiAKIHVzZXMKICAgQ2xhc3NlcywKICAgU3lzVXRpbHMsCiAgIE1hdGgsCi0gIFNvY2tldHMsIFdpblNvY2ssCiAgIEdlbmVyaWNzLkNvbGxlY3Rpb25zLAorICB7JElGREVGIE9MRF9VTklUX05BTUVTfQorICAgIEFjdGl2ZVgsIG1zeG1sLCBXaW5Tb2NrLCBTb2NrZXRzLAorICB7JEVMU0V9CisgICAgV2luYXBpLkFjdGl2ZVgsIFdpbmFwaS5tc3htbCwgV2luYXBpLldpblNvY2ssCisgICAgeyRJRkRFRiBPTERfU09DS0VUU30KKyAgICAgIFdlYi5XaW4uU29ja2V0cywKKyAgICB7JEVMU0V9CisgICAgICBUaHJpZnQuU29ja2V0LAorICAgIHskRU5ESUZ9CisgIHskRU5ESUZ9CiAgIFRocmlmdC5Db2xsZWN0aW9ucywKKyAgVGhyaWZ0LkV4Y2VwdGlvbiwKICAgVGhyaWZ0LlV0aWxzLAotICBUaHJpZnQuU3RyZWFtLAotICBBY3RpdmVYLAotICBtc3htbDsKKyAgVGhyaWZ0LlN0cmVhbTsKIAogdHlwZQogICBJVHJhbnNwb3J0ID0gaW50ZXJmYWNlCi0gICAgWyd7QTRBOUZDMzctRDYyMC00NERDLUFEMjEtNjYyRDE2MzY0Q0U0fSddCisgICAgWyd7REI4NDk2MUUtOEJCMy00NTMyLTk5RTEtQThDN0FDMjMwMEY3fSddCiAgICAgZnVuY3Rpb24gR2V0SXNPcGVuOiBCb29sZWFuOwogICAgIHByb3BlcnR5IElzT3BlbjogQm9vbGVhbiByZWFkIEdldElzT3BlbjsKICAgICBmdW5jdGlvbiBQZWVrOiBCb29sZWFuOwogICAgIHByb2NlZHVyZSBPcGVuOwogICAgIHByb2NlZHVyZSBDbG9zZTsKLSAgICBmdW5jdGlvbiBSZWFkKHZhciBidWY6IFRCeXRlczsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOwotICAgIGZ1bmN0aW9uIFJlYWRBbGwodmFyIGJ1ZjogVEJ5dGVzOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7CisgICAgZnVuY3Rpb24gUmVhZCh2YXIgYnVmOiBUQnl0ZXM7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcmxvYWQ7CisgICAgZnVuY3Rpb24gUmVhZChjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVybG9hZDsKKyAgICBmdW5jdGlvbiBSZWFkQWxsKHZhciBidWY6IFRCeXRlczsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVybG9hZDsKKyAgICBmdW5jdGlvbiBSZWFkQWxsKGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7IG92ZXJsb2FkOwogICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgYnVmOiBUQnl0ZXMpOyBvdmVybG9hZDsKICAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IGJ1ZjogVEJ5dGVzOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik7IG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZiwgbGVuIDogSW50ZWdlcik7IG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGxlbiA6IEludGVnZXIpOyBvdmVybG9hZDsKICAgICBwcm9jZWR1cmUgRmx1c2g7CiAgIGVuZDsKIApAQCAtNTcsMTQgKzY5LDE4IEBACiAgICAgZnVuY3Rpb24gUGVlazogQm9vbGVhbjsgdmlydHVhbDsKICAgICBwcm9jZWR1cmUgT3BlbigpOyB2aXJ0dWFsOyBhYnN0cmFjdDsKICAgICBwcm9jZWR1cmUgQ2xvc2UoKTsgdmlydHVhbDsgYWJzdHJhY3Q7Ci0gICAgZnVuY3Rpb24gUmVhZCh2YXIgYnVmOiBUQnl0ZXM7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsgdmlydHVhbDsgYWJzdHJhY3Q7Ci0gICAgZnVuY3Rpb24gUmVhZEFsbCh2YXIgYnVmOiBUQnl0ZXM7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsgdmlydHVhbDsKLSAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IGJ1ZjogVEJ5dGVzKTsgb3ZlcmxvYWQ7IHZpcnR1YWw7Ci0gICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBidWY6IFRCeXRlczsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOyBvdmVybG9hZDsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgZnVuY3Rpb24gUmVhZCh2YXIgYnVmOiBUQnl0ZXM7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcmxvYWQ7IGlubGluZTsKKyAgICBmdW5jdGlvbiBSZWFkKGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7IG92ZXJsb2FkOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBmdW5jdGlvbiBSZWFkQWxsKHZhciBidWY6IFRCeXRlczsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOyAgb3ZlcmxvYWQ7IGlubGluZTsKKyAgICBmdW5jdGlvbiBSZWFkQWxsKGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7IG92ZXJsb2FkOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgYnVmOiBUQnl0ZXMpOyBvdmVybG9hZDsgaW5saW5lOworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgYnVmOiBUQnl0ZXM7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTsgb3ZlcmxvYWQ7IGlubGluZTsKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBsZW4gOiBJbnRlZ2VyKTsgb3ZlcmxvYWQ7IGlubGluZTsKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmYsIGxlbiA6IEludGVnZXIpOyBvdmVybG9hZDsgdmlydHVhbDsgYWJzdHJhY3Q7CiAgICAgcHJvY2VkdXJlIEZsdXNoOyB2aXJ0dWFsOwogICBlbmQ7CiAKLSAgVFRyYW5zcG9ydEV4Y2VwdGlvbiA9IGNsYXNzKCBFeGNlcHRpb24gKQorICBUVHJhbnNwb3J0RXhjZXB0aW9uID0gY2xhc3MoIFRFeGNlcHRpb24pCiAgIHB1YmxpYwogICAgIHR5cGUKICAgICAgIFRFeGNlcHRpb25UeXBlID0gKApAQCAtNzIsMjYgKzg4LDUxIEBACiAgICAgICAgIE5vdE9wZW4sCiAgICAgICAgIEFscmVhZHlPcGVuLAogICAgICAgICBUaW1lZE91dCwKLSAgICAgICAgRW5kT2ZGaWxlCisgICAgICAgIEVuZE9mRmlsZSwKKyAgICAgICAgQmFkQXJncywKKyAgICAgICAgSW50ZXJydXB0ZWQKICAgICAgICk7CiAgIHByaXZhdGUKLSAgICBGVHlwZSA6IFRFeGNlcHRpb25UeXBlOworICAgIGZ1bmN0aW9uIEdldFR5cGU6IFRFeGNlcHRpb25UeXBlOworICBwcm90ZWN0ZWQKKyAgICBjb25zdHJ1Y3RvciBIaWRkZW5DcmVhdGUoY29uc3QgTXNnOiBzdHJpbmcpOwogICBwdWJsaWMKLSAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIEFUeXBlOiBURXhjZXB0aW9uVHlwZSk7IG92ZXJsb2FkOwotICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgbXNnOiBzdHJpbmcpOyBvdmVybG9hZDsKLSAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIEFUeXBlOiBURXhjZXB0aW9uVHlwZTsgY29uc3QgbXNnOiBzdHJpbmcpOyBvdmVybG9hZDsKLSAgICBwcm9wZXJ0eSBUeXBlXzogVEV4Y2VwdGlvblR5cGUgcmVhZCBGVHlwZTsKKyAgICBjbGFzcyBmdW5jdGlvbiBDcmVhdGUoIEFUeXBlOiBURXhjZXB0aW9uVHlwZSk6IFRUcmFuc3BvcnRFeGNlcHRpb247IG92ZXJsb2FkOyBkZXByZWNhdGVkICdVc2Ugc3BlY2lhbGl6ZWQgVFRyYW5zcG9ydEV4Y2VwdGlvbiB0eXBlcyAob3IgcmVnZW5lcmF0ZSBmcm9tIElETCknOworICAgIGNsYXNzIGZ1bmN0aW9uIENyZWF0ZSggY29uc3QgbXNnOiBzdHJpbmcpOiBUVHJhbnNwb3J0RXhjZXB0aW9uOyByZWludHJvZHVjZTsgb3ZlcmxvYWQ7IGRlcHJlY2F0ZWQgJ1VzZSBzcGVjaWFsaXplZCBUVHJhbnNwb3J0RXhjZXB0aW9uIHR5cGVzIChvciByZWdlbmVyYXRlIGZyb20gSURMKSc7CisgICAgY2xhc3MgZnVuY3Rpb24gQ3JlYXRlKCBBVHlwZTogVEV4Y2VwdGlvblR5cGU7IGNvbnN0IG1zZzogc3RyaW5nKTogVFRyYW5zcG9ydEV4Y2VwdGlvbjsgb3ZlcmxvYWQ7IGRlcHJlY2F0ZWQgJ1VzZSBzcGVjaWFsaXplZCBUVHJhbnNwb3J0RXhjZXB0aW9uIHR5cGVzIChvciByZWdlbmVyYXRlIGZyb20gSURMKSc7CisgICAgcHJvcGVydHkgVHlwZV86IFRFeGNlcHRpb25UeXBlIHJlYWQgR2V0VHlwZTsKICAgZW5kOwogCisgIC8vIE5lZWRlZCB0byByZW1vdmUgZGVwcmVjYXRpb24gd2FybmluZworICBUVHJhbnNwb3J0RXhjZXB0aW9uU3BlY2lhbGl6ZWQgPSBjbGFzcyBhYnN0cmFjdCAoVFRyYW5zcG9ydEV4Y2VwdGlvbikKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKGNvbnN0IE1zZzogc3RyaW5nKTsKKyAgZW5kOworCisgIFRUcmFuc3BvcnRFeGNlcHRpb25Vbmtub3duID0gY2xhc3MgKFRUcmFuc3BvcnRFeGNlcHRpb25TcGVjaWFsaXplZCk7CisgIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuID0gY2xhc3MgKFRUcmFuc3BvcnRFeGNlcHRpb25TcGVjaWFsaXplZCk7CisgIFRUcmFuc3BvcnRFeGNlcHRpb25BbHJlYWR5T3BlbiA9IGNsYXNzIChUVHJhbnNwb3J0RXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUVHJhbnNwb3J0RXhjZXB0aW9uVGltZWRPdXQgPSBjbGFzcyAoVFRyYW5zcG9ydEV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVFRyYW5zcG9ydEV4Y2VwdGlvbkVuZE9mRmlsZSA9IGNsYXNzIChUVHJhbnNwb3J0RXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUVHJhbnNwb3J0RXhjZXB0aW9uQmFkQXJncyA9IGNsYXNzIChUVHJhbnNwb3J0RXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUVHJhbnNwb3J0RXhjZXB0aW9uSW50ZXJydXB0ZWQgPSBjbGFzcyAoVFRyYW5zcG9ydEV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKwogICBJSFRUUENsaWVudCA9IGludGVyZmFjZSggSVRyYW5zcG9ydCApCi0gICAgWyd7MEY1REI4QUItNzEwRC00MzM4LUFBQzktNDZCNTczNEM1MDU3fSddCisgICAgWyd7QkExNDJEMTItOEFFNi00QjUwLTlFMzMtNkI3ODQzQjIxRDczfSddCisgICAgcHJvY2VkdXJlIFNldERuc1Jlc29sdmVUaW1lb3V0KGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKKyAgICBmdW5jdGlvbiBHZXREbnNSZXNvbHZlVGltZW91dDogSW50ZWdlcjsKICAgICBwcm9jZWR1cmUgU2V0Q29ubmVjdGlvblRpbWVvdXQoY29uc3QgVmFsdWU6IEludGVnZXIpOwogICAgIGZ1bmN0aW9uIEdldENvbm5lY3Rpb25UaW1lb3V0OiBJbnRlZ2VyOworICAgIHByb2NlZHVyZSBTZXRTZW5kVGltZW91dChjb25zdCBWYWx1ZTogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gR2V0U2VuZFRpbWVvdXQ6IEludGVnZXI7CiAgICAgcHJvY2VkdXJlIFNldFJlYWRUaW1lb3V0KGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKICAgICBmdW5jdGlvbiBHZXRSZWFkVGltZW91dDogSW50ZWdlcjsKICAgICBmdW5jdGlvbiBHZXRDdXN0b21IZWFkZXJzOiBJVGhyaWZ0RGljdGlvbmFyeTxzdHJpbmcsc3RyaW5nPjsKICAgICBwcm9jZWR1cmUgU2VuZFJlcXVlc3Q7CisKKyAgICBwcm9wZXJ0eSBEbnNSZXNvbHZlVGltZW91dDogSW50ZWdlciByZWFkIEdldERuc1Jlc29sdmVUaW1lb3V0IHdyaXRlIFNldERuc1Jlc29sdmVUaW1lb3V0OwogICAgIHByb3BlcnR5IENvbm5lY3Rpb25UaW1lb3V0OiBJbnRlZ2VyIHJlYWQgR2V0Q29ubmVjdGlvblRpbWVvdXQgd3JpdGUgU2V0Q29ubmVjdGlvblRpbWVvdXQ7CisgICAgcHJvcGVydHkgU2VuZFRpbWVvdXQ6IEludGVnZXIgcmVhZCBHZXRTZW5kVGltZW91dCB3cml0ZSBTZXRTZW5kVGltZW91dDsKICAgICBwcm9wZXJ0eSBSZWFkVGltZW91dDogSW50ZWdlciByZWFkIEdldFJlYWRUaW1lb3V0IHdyaXRlIFNldFJlYWRUaW1lb3V0OwogICAgIHByb3BlcnR5IEN1c3RvbUhlYWRlcnM6IElUaHJpZnREaWN0aW9uYXJ5PHN0cmluZyxzdHJpbmc+IHJlYWQgR2V0Q3VzdG9tSGVhZGVyczsKICAgZW5kOwpAQCAtMTAxLDcgKzE0Miw5IEBACiAgICAgRlVyaSA6IHN0cmluZzsKICAgICBGSW5wdXRTdHJlYW0gOiBJVGhyaWZ0U3RyZWFtOwogICAgIEZPdXRwdXRTdHJlYW0gOiBJVGhyaWZ0U3RyZWFtOworICAgIEZEbnNSZXNvbHZlVGltZW91dCA6IEludGVnZXI7CiAgICAgRkNvbm5lY3Rpb25UaW1lb3V0IDogSW50ZWdlcjsKKyAgICBGU2VuZFRpbWVvdXQgOiBJbnRlZ2VyOwogICAgIEZSZWFkVGltZW91dCA6IEludGVnZXI7CiAgICAgRkN1c3RvbUhlYWRlcnMgOiBJVGhyaWZ0RGljdGlvbmFyeTxzdHJpbmcsc3RyaW5nPjsKIApAQCAtMTEwLDE3ICsxNTMsMjQgQEAKICAgICBmdW5jdGlvbiBHZXRJc09wZW46IEJvb2xlYW47IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBPcGVuKCk7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBDbG9zZSgpOyBvdmVycmlkZTsKLSAgICBmdW5jdGlvbiBSZWFkKCB2YXIgYnVmOiBUQnl0ZXM7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcnJpZGU7Ci0gICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBidWY6IFRCeXRlczsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiAgUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2ZmLCBsZW4gOiBJbnRlZ2VyKTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIEZsdXNoOyBvdmVycmlkZTsKIAorICAgIHByb2NlZHVyZSBTZXREbnNSZXNvbHZlVGltZW91dChjb25zdCBWYWx1ZTogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gR2V0RG5zUmVzb2x2ZVRpbWVvdXQ6IEludGVnZXI7CiAgICAgcHJvY2VkdXJlIFNldENvbm5lY3Rpb25UaW1lb3V0KGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKICAgICBmdW5jdGlvbiBHZXRDb25uZWN0aW9uVGltZW91dDogSW50ZWdlcjsKKyAgICBwcm9jZWR1cmUgU2V0U2VuZFRpbWVvdXQoY29uc3QgVmFsdWU6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIEdldFNlbmRUaW1lb3V0OiBJbnRlZ2VyOwogICAgIHByb2NlZHVyZSBTZXRSZWFkVGltZW91dChjb25zdCBWYWx1ZTogSW50ZWdlcik7CiAgICAgZnVuY3Rpb24gR2V0UmVhZFRpbWVvdXQ6IEludGVnZXI7CisKICAgICBmdW5jdGlvbiBHZXRDdXN0b21IZWFkZXJzOiBJVGhyaWZ0RGljdGlvbmFyeTxzdHJpbmcsc3RyaW5nPjsKICAgICBwcm9jZWR1cmUgU2VuZFJlcXVlc3Q7CisgICAgcHJvcGVydHkgRG5zUmVzb2x2ZVRpbWVvdXQ6IEludGVnZXIgcmVhZCBHZXREbnNSZXNvbHZlVGltZW91dCB3cml0ZSBTZXREbnNSZXNvbHZlVGltZW91dDsKICAgICBwcm9wZXJ0eSBDb25uZWN0aW9uVGltZW91dDogSW50ZWdlciByZWFkIEdldENvbm5lY3Rpb25UaW1lb3V0IHdyaXRlIFNldENvbm5lY3Rpb25UaW1lb3V0OworICAgIHByb3BlcnR5IFNlbmRUaW1lb3V0OiBJbnRlZ2VyIHJlYWQgR2V0U2VuZFRpbWVvdXQgd3JpdGUgU2V0U2VuZFRpbWVvdXQ7CiAgICAgcHJvcGVydHkgUmVhZFRpbWVvdXQ6IEludGVnZXIgcmVhZCBHZXRSZWFkVGltZW91dCB3cml0ZSBTZXRSZWFkVGltZW91dDsKICAgICBwcm9wZXJ0eSBDdXN0b21IZWFkZXJzOiBJVGhyaWZ0RGljdGlvbmFyeTxzdHJpbmcsc3RyaW5nPiByZWFkIEdldEN1c3RvbUhlYWRlcnM7CiAgIHB1YmxpYwpAQCAtMTUyLDYgKzIwMiw3IEBACiAgIGVuZDsKIAogICBUVGNwU29ja2V0U3RyZWFtSW1wbCA9IGNsYXNzKCBUVGhyaWZ0U3RyZWFtSW1wbCApCit7JElGREVGIE9MRF9TT0NLRVRTfQogICBwcml2YXRlIHR5cGUKICAgICBUV2FpdEZvckRhdGEgPSAoIHdmZF9IYXZlRGF0YSwgd2ZkX1RpbWVvdXQsIHdmZF9FcnJvcik7CiAgIHByaXZhdGUKQEAgLTE2MSw5ICsyMTIsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgIFRpbWVPdXQ6IEludGVnZXI7IHZhciB3c2FFcnJvciA6IEludGVnZXIpOiBJbnRlZ2VyOwogICAgIGZ1bmN0aW9uIFdhaXRGb3JEYXRhKCBUaW1lT3V0IDogSW50ZWdlcjsgcEJ1ZiA6IFBvaW50ZXI7IERlc2lyZWRCeXRlczogSW50ZWdlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHdzYUVycm9yLCBieXRlc1JlYWR5IDogSW50ZWdlcik6IFRXYWl0Rm9yRGF0YTsKK3skRUxTRX0KKyAgICBGVGNwQ2xpZW50OiBUU29ja2V0OworICBwcm90ZWN0ZWQgY29uc3QKKyAgICBTTEVFUF9USU1FID0gMjAwOworeyRFTkRJRn0KICAgcHJvdGVjdGVkCi0gICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBidWZmZXI6IFRCeXRlczsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7IG92ZXJyaWRlOwotICAgIGZ1bmN0aW9uIFJlYWQoIHZhciBidWZmZXI6IFRCeXRlczsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZnNldCwgY291bnQ6IEludGVnZXIpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBPcGVuOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgQ2xvc2U7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBGbHVzaDsgb3ZlcnJpZGU7CkBAIC0xNzEsNyArMjI3LDExIEBACiAgICAgZnVuY3Rpb24gSXNPcGVuOiBCb29sZWFuOyBvdmVycmlkZTsKICAgICBmdW5jdGlvbiBUb0FycmF5OiBUQnl0ZXM7IG92ZXJyaWRlOwogICBwdWJsaWMKK3skSUZERUYgT0xEX1NPQ0tFVFN9CiAgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBBVGNwQ2xpZW50OiBUQ3VzdG9tSXBDbGllbnQ7IGNvbnN0IGFUaW1lb3V0IDogSW50ZWdlciA9IDApOworeyRFTFNFfQorICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgQVRjcENsaWVudDogVFNvY2tldDsgY29uc3QgYVRpbWVvdXQgOiBMb25nd29yZCA9IDApOworeyRFTkRJRn0KICAgZW5kOwogCiAgIElTdHJlYW1UcmFuc3BvcnQgPSBpbnRlcmZhY2UoIElUcmFuc3BvcnQgKQpAQCAtMTk4LDggKzI1OCw4IEBACiAgICAgcHJvY2VkdXJlIE9wZW47IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBDbG9zZTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIEZsdXNoOyBvdmVycmlkZTsKLSAgICBmdW5jdGlvbiBSZWFkKHZhciBidWY6IFRCeXRlczsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVycmlkZTsKLSAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IGJ1ZjogVEJ5dGVzOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uICBSZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmYsIGxlbiA6IEludGVnZXIpOyBvdmVycmlkZTsKICAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IEFJbnB1dFN0cmVhbSA6IElUaHJpZnRTdHJlYW07IGNvbnN0IEFPdXRwdXRTdHJlYW0gOiBJVGhyaWZ0U3RyZWFtKTsKICAgICBkZXN0cnVjdG9yIERlc3Ryb3k7IG92ZXJyaWRlOwogICBlbmQ7CkBAIC0yMTEsOCArMjcxLDggQEAKICAgICBGUmVhZEJ1ZmZlciA6IFRNZW1vcnlTdHJlYW07CiAgICAgRldyaXRlQnVmZmVyIDogVE1lbW9yeVN0cmVhbTsKICAgcHJvdGVjdGVkCi0gICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBidWZmZXI6IFRCeXRlczsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7IG92ZXJyaWRlOwotICAgIGZ1bmN0aW9uIFJlYWQoIHZhciBidWZmZXI6IFRCeXRlczsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBPcGVuOyAgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIENsb3NlOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgRmx1c2g7IG92ZXJyaWRlOwpAQCAtMjI1LDE2ICsyODUsMjUgQEAKIAogICBUU2VydmVyU29ja2V0SW1wbCA9IGNsYXNzKCBUU2VydmVyVHJhbnNwb3J0SW1wbCkKICAgcHJpdmF0ZQoreyRJRkRFRiBPTERfU09DS0VUU30KICAgICBGU2VydmVyIDogVFRjcFNlcnZlcjsKICAgICBGUG9ydCA6IEludGVnZXI7CiAgICAgRkNsaWVudFRpbWVvdXQgOiBJbnRlZ2VyOworeyRFTFNFfQorICAgIEZTZXJ2ZXI6IFRTZXJ2ZXJTb2NrZXQ7Cit7JEVORElGfQogICAgIEZVc2VCdWZmZXJlZFNvY2tldCA6IEJvb2xlYW47CiAgICAgRk93bnNTZXJ2ZXIgOiBCb29sZWFuOwogICBwcm90ZWN0ZWQKICAgICBmdW5jdGlvbiBBY2NlcHQoIGNvbnN0IGZuQWNjZXB0aW5nOiBUUHJvYykgOiBJVHJhbnNwb3J0OyBvdmVycmlkZTsKICAgcHVibGljCit7JElGREVGIE9MRF9TT0NLRVRTfQogICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgQVNlcnZlcjogVFRjcFNlcnZlcjsgQUNsaWVudFRpbWVvdXQ6IEludGVnZXIgPSAwKTsgb3ZlcmxvYWQ7CiAgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBBUG9ydDogSW50ZWdlcjsgQUNsaWVudFRpbWVvdXQ6IEludGVnZXIgPSAwOyBBVXNlQnVmZmVyZWRTb2NrZXRzOiBCb29sZWFuID0gRkFMU0UpOyBvdmVybG9hZDsKK3skRUxTRX0KKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IEFTZXJ2ZXI6IFRTZXJ2ZXJTb2NrZXQ7IEFDbGllbnRUaW1lb3V0OiBMb25nd29yZCA9IDApOyBvdmVybG9hZDsKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIEFQb3J0OiBJbnRlZ2VyOyBBQ2xpZW50VGltZW91dDogTG9uZ3dvcmQgPSAwOyBBVXNlQnVmZmVyZWRTb2NrZXRzOiBCb29sZWFuID0gRkFMU0UpOyBvdmVybG9hZDsKK3skRU5ESUZ9CiAgICAgZGVzdHJ1Y3RvciBEZXN0cm95OyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgTGlzdGVuOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgQ2xvc2U7IG92ZXJyaWRlOwpAQCAtMjU1LDggKzMyNCw4IEBACiAgIHB1YmxpYwogICAgIHByb2NlZHVyZSBPcGVuKCk7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBDbG9zZSgpOyBvdmVycmlkZTsKLSAgICBmdW5jdGlvbiBSZWFkKHZhciBidWY6IFRCeXRlczsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVycmlkZTsKLSAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IGJ1ZjogVEJ5dGVzOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uICBSZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmYsIGxlbiA6IEludGVnZXIpOyBvdmVycmlkZTsKICAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IEFUcmFuc3BvcnQgOiBJU3RyZWFtVHJhbnNwb3J0ICk7IG92ZXJsb2FkOwogICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgQVRyYW5zcG9ydCA6IElTdHJlYW1UcmFuc3BvcnQ7IEFCdWZTaXplOiBJbnRlZ2VyKTsgb3ZlcmxvYWQ7CiAgICAgcHJvcGVydHkgVW5kZXJseWluZ1RyYW5zcG9ydDogSVRyYW5zcG9ydCByZWFkIEdldFVuZGVybHlpbmdUcmFuc3BvcnQ7CkBAIC0yNjUsMjIgKzMzNCwzOSBAQAogCiAgIFRTb2NrZXRJbXBsID0gY2xhc3MoVFN0cmVhbVRyYW5zcG9ydEltcGwpCiAgIHByaXZhdGUKK3skSUZERUYgT0xEX1NPQ0tFVFN9CiAgICAgRkNsaWVudCA6IFRDdXN0b21JcENsaWVudDsKK3skRUxTRX0KKyAgICBGQ2xpZW50OiBUU29ja2V0OworeyRFTkRJRn0KICAgICBGT3duc0NsaWVudCA6IEJvb2xlYW47CiAgICAgRkhvc3QgOiBzdHJpbmc7CiAgICAgRlBvcnQgOiBJbnRlZ2VyOworeyRJRkRFRiBPTERfU09DS0VUU30KICAgICBGVGltZW91dCA6IEludGVnZXI7Cit7JEVMU0V9CisgICAgRlRpbWVvdXQgOiBMb25nd29yZDsKK3skRU5ESUZ9CiAKICAgICBwcm9jZWR1cmUgSW5pdFNvY2tldDsKICAgcHJvdGVjdGVkCiAgICAgZnVuY3Rpb24gR2V0SXNPcGVuOiBCb29sZWFuOyBvdmVycmlkZTsKICAgcHVibGljCiAgICAgcHJvY2VkdXJlIE9wZW47IG92ZXJyaWRlOworeyRJRkRFRiBPTERfU09DS0VUU30KICAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IEFDbGllbnQgOiBUQ3VzdG9tSXBDbGllbnQ7IGFPd25zQ2xpZW50IDogQm9vbGVhbjsgQVRpbWVvdXQ6IEludGVnZXIgPSAwKTsgb3ZlcmxvYWQ7CiAgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBBSG9zdDogc3RyaW5nOyBBUG9ydDogSW50ZWdlcjsgQVRpbWVvdXQ6IEludGVnZXIgPSAwKTsgb3ZlcmxvYWQ7Cit7JEVMU0V9CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKGNvbnN0IEFDbGllbnQ6IFRTb2NrZXQ7IGFPd25zQ2xpZW50OiBCb29sZWFuKTsgb3ZlcmxvYWQ7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBBSG9zdDogc3RyaW5nOyBBUG9ydDogSW50ZWdlcjsgQVRpbWVvdXQ6IExvbmd3b3JkID0gMCk7IG92ZXJsb2FkOworeyRFTkRJRn0KICAgICBkZXN0cnVjdG9yIERlc3Ryb3k7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBDbG9zZTsgb3ZlcnJpZGU7Cit7JElGREVGIE9MRF9TT0NLRVRTfQogICAgIHByb3BlcnR5IFRjcENsaWVudDogVEN1c3RvbUlwQ2xpZW50IHJlYWQgRkNsaWVudDsKK3skRUxTRX0KKyAgICBwcm9wZXJ0eSBUY3BDbGllbnQ6IFRTb2NrZXQgcmVhZCBGQ2xpZW50OworeyRFTkRJRn0KICAgICBwcm9wZXJ0eSBIb3N0IDogc3RyaW5nIHJlYWQgRkhvc3Q7CiAgICAgcHJvcGVydHkgUG9ydDogSW50ZWdlciByZWFkIEZQb3J0OwogICBlbmQ7CkBAIC0zMDQsOSArMzkwLDEwIEBACiAgICAgICAgIGZ1bmN0aW9uIEdldFRyYW5zcG9ydCggY29uc3QgQVRyYW5zOiBJVHJhbnNwb3J0KTogSVRyYW5zcG9ydDsgb3ZlcnJpZGU7CiAgICAgICBlbmQ7CiAKLXskSUYgQ29tcGlsZXJWZXJzaW9uID49IDIxLjB9CisgICAgeyRJRkRFRiBIQVZFX0NMQVNTX0NUT1J9CiAgICAgY2xhc3MgY29uc3RydWN0b3IgQ3JlYXRlOwoteyRJRkVORH0KKyAgICB7JEVORElGfQorCiAgICAgY29uc3RydWN0b3IgQ3JlYXRlOyBvdmVybG9hZDsKICAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IEFUcmFuczogSVRyYW5zcG9ydCk7IG92ZXJsb2FkOwogICAgIGRlc3RydWN0b3IgRGVzdHJveTsgb3ZlcnJpZGU7CkBAIC0zMTUsMTQgKzQwMiwxNCBAQAogICAgIGZ1bmN0aW9uIEdldElzT3BlbjogQm9vbGVhbjsgb3ZlcnJpZGU7CiAKICAgICBwcm9jZWR1cmUgQ2xvc2UoKTsgb3ZlcnJpZGU7Ci0gICAgZnVuY3Rpb24gUmVhZCh2YXIgYnVmOiBUQnl0ZXM7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcnJpZGU7Ci0gICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBidWY6IFRCeXRlczsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiAgUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2ZmLCBsZW4gOiBJbnRlZ2VyKTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIEZsdXNoOyBvdmVycmlkZTsKICAgZW5kOwogCi17JElGIENvbXBpbGVyVmVyc2lvbiA8IDIxLjB9Cit7JElGTkRFRiBIQVZFX0NMQVNTX0NUT1J9CiBwcm9jZWR1cmUgVEZyYW1lZFRyYW5zcG9ydEltcGxfSW5pdGlhbGl6ZTsKLXskSUZFTkR9Cit7JEVORElGfQogCiBjb25zdAogICBERUZBVUxUX1RIUklGVF9USU1FT1VUID0gNSAqIDEwMDA7IC8vIG1zCkBAIC0zMzQsNyArNDIxLDcgQEAKIAogcHJvY2VkdXJlIFRUcmFuc3BvcnRJbXBsLkZsdXNoOwogYmVnaW4KLQorICAvLyBub3RoaW5nIHRvIGRvCiBlbmQ7CiAKIGZ1bmN0aW9uIFRUcmFuc3BvcnRJbXBsLlBlZWs6IEJvb2xlYW47CkBAIC0zNDIsNDEgKzQyOSw2MiBAQAogICBSZXN1bHQgOj0gSXNPcGVuOwogZW5kOwogCi1mdW5jdGlvbiBUVHJhbnNwb3J0SW1wbC5SZWFkQWxsKCB2YXIgYnVmOiBUQnl0ZXM7IG9mZiwgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsKLXZhcgotICBnb3QgOiBJbnRlZ2VyOwotICByZXQgOiBJbnRlZ2VyOworZnVuY3Rpb24gVFRyYW5zcG9ydEltcGwuUmVhZCh2YXIgYnVmOiBUQnl0ZXM7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsKIGJlZ2luCi0gIGdvdCA6PSAwOwotICB3aGlsZSAoIGdvdCA8IGxlbikgZG8KLSAgYmVnaW4KLSAgICByZXQgOj0gUmVhZCggYnVmLCBvZmYgKyBnb3QsIGxlbiAtIGdvdCk7Ci0gICAgaWYgKCByZXQgPD0gMCApIHRoZW4KLSAgICBiZWdpbgotICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoICdDYW5ub3QgcmVhZCwgUmVtb3RlIHNpZGUgaGFzIGNsb3NlZCcgKTsKLSAgICBlbmQ7Ci0gICAgZ290IDo9IGdvdCArIHJldDsKLSAgZW5kOwotICBSZXN1bHQgOj0gZ290OworICBpZiBMZW5ndGgoYnVmKSA+IDAKKyAgdGhlbiByZXN1bHQgOj0gUmVhZCggQGJ1ZlswXSwgTGVuZ3RoKGJ1ZiksIG9mZiwgbGVuKQorICBlbHNlIHJlc3VsdCA6PSAwOworZW5kOworCitmdW5jdGlvbiBUVHJhbnNwb3J0SW1wbC5SZWFkQWxsKHZhciBidWY6IFRCeXRlczsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOworYmVnaW4KKyAgaWYgTGVuZ3RoKGJ1ZikgPiAwCisgIHRoZW4gcmVzdWx0IDo9IFJlYWRBbGwoIEBidWZbMF0sIExlbmd0aChidWYpLCBvZmYsIGxlbikKKyAgZWxzZSByZXN1bHQgOj0gMDsKIGVuZDsKIAogcHJvY2VkdXJlIFRUcmFuc3BvcnRJbXBsLldyaXRlKCBjb25zdCBidWY6IFRCeXRlcyk7CiBiZWdpbgotICBTZWxmLldyaXRlKCBidWYsIDAsIExlbmd0aChidWYpICk7CisgIGlmIExlbmd0aChidWYpID4gMAorICB0aGVuIFdyaXRlKCBAYnVmWzBdLCAwLCBMZW5ndGgoYnVmKSk7CitlbmQ7CisKK3Byb2NlZHVyZSBUVHJhbnNwb3J0SW1wbC5Xcml0ZSggY29uc3QgYnVmOiBUQnl0ZXM7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTsKK2JlZ2luCisgIGlmIExlbmd0aChidWYpID4gMAorICB0aGVuIFdyaXRlKCBAYnVmWzBdLCBvZmYsIGxlbik7CitlbmQ7CisKK2Z1bmN0aW9uIFRUcmFuc3BvcnRJbXBsLlJlYWRBbGwoY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsKK3ZhciByZXQgOiBJbnRlZ2VyOworYmVnaW4KKyAgcmVzdWx0IDo9IDA7CisgIHdoaWxlIHJlc3VsdCA8IGxlbiBkbyBiZWdpbgorICAgIHJldCA6PSBSZWFkKCBwQnVmLCBidWZsZW4sIG9mZiArIHJlc3VsdCwgbGVuIC0gcmVzdWx0KTsKKyAgICBpZiByZXQgPiAwCisgICAgdGhlbiBJbmMoIHJlc3VsdCwgcmV0KQorICAgIGVsc2UgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCAnQ2Fubm90IHJlYWQsIFJlbW90ZSBzaWRlIGhhcyBjbG9zZWQnICk7CisgIGVuZDsKK2VuZDsKKworcHJvY2VkdXJlIFRUcmFuc3BvcnRJbXBsLldyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgbGVuIDogSW50ZWdlcik7CitiZWdpbgorICBTZWxmLldyaXRlKCBwQnVmLCAwLCBsZW4pOwogZW5kOwogCiB7IFRIVFRQQ2xpZW50SW1wbCB9CiAKLXByb2NlZHVyZSBUSFRUUENsaWVudEltcGwuQ2xvc2U7Ci1iZWdpbgotICBGSW5wdXRTdHJlYW0gOj0gbmlsOwotICBGT3V0cHV0U3RyZWFtIDo9IG5pbDsKLWVuZDsKLQogY29uc3RydWN0b3IgVEhUVFBDbGllbnRJbXBsLkNyZWF0ZShjb25zdCBBVXJpOiBzdHJpbmcpOwogYmVnaW4KICAgaW5oZXJpdGVkIENyZWF0ZTsKICAgRlVyaSA6PSBBVXJpOworCisgIC8vIGRlZmF1bHRzIGFjY29yZGluZyB0byBNU0ROCisgIEZEbnNSZXNvbHZlVGltZW91dCA6PSAwOyAvLyBubyB0aW1lb3V0CisgIEZDb25uZWN0aW9uVGltZW91dCA6PSA2MCAqIDEwMDA7CisgIEZTZW5kVGltZW91dCAgICAgICA6PSAzMCAqIDEwMDA7CisgIEZSZWFkVGltZW91dCAgICAgICA6PSAzMCAqIDEwMDA7CisKICAgRkN1c3RvbUhlYWRlcnMgOj0gVFRocmlmdERpY3Rpb25hcnlJbXBsPHN0cmluZyxzdHJpbmc+LkNyZWF0ZTsKICAgRk91dHB1dFN0cmVhbSA6PSBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5DcmVhdGUoIFRNZW1vcnlTdHJlYW0uQ3JlYXRlLCBUcnVlKTsKIGVuZDsKQEAgLTM4NCwyMCArNDkyLDI0IEBACiBmdW5jdGlvbiBUSFRUUENsaWVudEltcGwuQ3JlYXRlUmVxdWVzdDogSVhNTEhUVFBSZXF1ZXN0OwogdmFyCiAgIHBhaXIgOiBUUGFpcjxzdHJpbmcsc3RyaW5nPjsKKyAgc3J2SHR0cCA6IElTZXJ2ZXJYTUxIVFRQUmVxdWVzdDsKIGJlZ2luCi17JElGIENvbXBpbGVyVmVyc2lvbiA+PSAyMS4wfQotICBSZXN1bHQgOj0gQ29YTUxIVFRQLkNyZWF0ZTsKLXskRUxTRX0KKyAgeyRJRiBDb21waWxlclZlcnNpb24gPj0gMjEuMH0KKyAgUmVzdWx0IDo9IENvU2VydmVyWE1MSFRUUC5DcmVhdGU7CisgIHskRUxTRX0KICAgUmVzdWx0IDo9IENvWE1MSFRUUFJlcXVlc3QuQ3JlYXRlOwoteyRJRkVORH0KKyAgeyRJRkVORH0KKworICAvLyBzZXR0aW5nIGEgdGltZW91dCB2YWx1ZSB0byAwICh6ZXJvKSBtZWFucyAibm8gdGltZW91dCIgZm9yIHRoYXQgc2V0dGluZworICBpZiBTdXBwb3J0cyggcmVzdWx0LCBJU2VydmVyWE1MSFRUUFJlcXVlc3QsIHNydkh0dHApCisgIHRoZW4gc3J2SHR0cC5zZXRUaW1lb3V0cyggRG5zUmVzb2x2ZVRpbWVvdXQsIENvbm5lY3Rpb25UaW1lb3V0LCBTZW5kVGltZW91dCwgUmVhZFRpbWVvdXQpOwogCiAgIFJlc3VsdC5vcGVuKCdQT1NUJywgRlVyaSwgRmFsc2UsICcnLCAnJyk7CiAgIFJlc3VsdC5zZXRSZXF1ZXN0SGVhZGVyKCAnQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL3gtdGhyaWZ0Jyk7CiAgIFJlc3VsdC5zZXRSZXF1ZXN0SGVhZGVyKCAnQWNjZXB0JywgJ2FwcGxpY2F0aW9uL3gtdGhyaWZ0Jyk7CiAgIFJlc3VsdC5zZXRSZXF1ZXN0SGVhZGVyKCAnVXNlci1BZ2VudCcsICdEZWxwaGkvSUhUVFBDbGllbnQnKTsKIAotICBmb3IgcGFpciBpbiBGQ3VzdG9tSGVhZGVycyBkbwotICBiZWdpbgorICBmb3IgcGFpciBpbiBGQ3VzdG9tSGVhZGVycyBkbyBiZWdpbgogICAgIFJlc3VsdC5zZXRSZXF1ZXN0SGVhZGVyKCBwYWlyLktleSwgcGFpci5WYWx1ZSApOwogICBlbmQ7CiBlbmQ7CkBAIC00MDgsMTQgKzUyMCwxNCBAQAogICBpbmhlcml0ZWQ7CiBlbmQ7CiAKLXByb2NlZHVyZSBUSFRUUENsaWVudEltcGwuRmx1c2g7CitmdW5jdGlvbiBUSFRUUENsaWVudEltcGwuR2V0RG5zUmVzb2x2ZVRpbWVvdXQ6IEludGVnZXI7CiBiZWdpbgotICB0cnkKLSAgICBTZW5kUmVxdWVzdDsKLSAgZmluYWxseQotICAgIEZPdXRwdXRTdHJlYW0gOj0gbmlsOwotICAgIEZPdXRwdXRTdHJlYW0gOj0gVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuQ3JlYXRlKCBUTWVtb3J5U3RyZWFtLkNyZWF0ZSwgVHJ1ZSk7Ci0gIGVuZDsKKyAgUmVzdWx0IDo9IEZEbnNSZXNvbHZlVGltZW91dDsKK2VuZDsKKworcHJvY2VkdXJlIFRIVFRQQ2xpZW50SW1wbC5TZXREbnNSZXNvbHZlVGltZW91dChjb25zdCBWYWx1ZTogSW50ZWdlcik7CitiZWdpbgorICBGRG5zUmVzb2x2ZVRpbWVvdXQgOj0gVmFsdWU7CiBlbmQ7CiAKIGZ1bmN0aW9uIFRIVFRQQ2xpZW50SW1wbC5HZXRDb25uZWN0aW9uVGltZW91dDogSW50ZWdlcjsKQEAgLTQyMyw2ICs1MzUsMzEgQEAKICAgUmVzdWx0IDo9IEZDb25uZWN0aW9uVGltZW91dDsKIGVuZDsKIAorcHJvY2VkdXJlIFRIVFRQQ2xpZW50SW1wbC5TZXRDb25uZWN0aW9uVGltZW91dChjb25zdCBWYWx1ZTogSW50ZWdlcik7CitiZWdpbgorICBGQ29ubmVjdGlvblRpbWVvdXQgOj0gVmFsdWU7CitlbmQ7CisKK2Z1bmN0aW9uIFRIVFRQQ2xpZW50SW1wbC5HZXRTZW5kVGltZW91dDogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGU2VuZFRpbWVvdXQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUSFRUUENsaWVudEltcGwuU2V0U2VuZFRpbWVvdXQoY29uc3QgVmFsdWU6IEludGVnZXIpOworYmVnaW4KKyAgRlNlbmRUaW1lb3V0IDo9IFZhbHVlOworZW5kOworCitmdW5jdGlvbiBUSFRUUENsaWVudEltcGwuR2V0UmVhZFRpbWVvdXQ6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gRlJlYWRUaW1lb3V0OworZW5kOworCitwcm9jZWR1cmUgVEhUVFBDbGllbnRJbXBsLlNldFJlYWRUaW1lb3V0KGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKK2JlZ2luCisgIEZSZWFkVGltZW91dCA6PSBWYWx1ZTsKK2VuZDsKKwogZnVuY3Rpb24gVEhUVFBDbGllbnRJbXBsLkdldEN1c3RvbUhlYWRlcnM6IElUaHJpZnREaWN0aW9uYXJ5PHN0cmluZyxzdHJpbmc+OwogYmVnaW4KICAgUmVzdWx0IDo9IEZDdXN0b21IZWFkZXJzOwpAQCAtNDMzLDMxICs1NzAsMzkgQEAKICAgUmVzdWx0IDo9IFRydWU7CiBlbmQ7CiAKLWZ1bmN0aW9uIFRIVFRQQ2xpZW50SW1wbC5HZXRSZWFkVGltZW91dDogSW50ZWdlcjsKLWJlZ2luCi0gIFJlc3VsdCA6PSBGUmVhZFRpbWVvdXQ7Ci1lbmQ7Ci0KIHByb2NlZHVyZSBUSFRUUENsaWVudEltcGwuT3BlbjsKIGJlZ2luCi0KKyAgRk91dHB1dFN0cmVhbSA6PSBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5DcmVhdGUoIFRNZW1vcnlTdHJlYW0uQ3JlYXRlLCBUcnVlKTsKIGVuZDsKIAotZnVuY3Rpb24gVEhUVFBDbGllbnRJbXBsLlJlYWQoIHZhciBidWY6IFRCeXRlczsgb2ZmLCBsZW46IEludGVnZXIpOiBJbnRlZ2VyOworcHJvY2VkdXJlIFRIVFRQQ2xpZW50SW1wbC5DbG9zZTsKIGJlZ2luCi0gIGlmIEZJbnB1dFN0cmVhbSA9IG5pbCB0aGVuCi0gIGJlZ2luCi0gICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoIFRUcmFuc3BvcnRFeGNlcHRpb24uVEV4Y2VwdGlvblR5cGUuTm90T3BlbiwKLSAgICAgICdObyByZXF1ZXN0IGhhcyBiZWVuIHNlbnQnKTsKLSAgZW5kOworICBGSW5wdXRTdHJlYW0gOj0gbmlsOworICBGT3V0cHV0U3RyZWFtIDo9IG5pbDsKK2VuZDsKKworcHJvY2VkdXJlIFRIVFRQQ2xpZW50SW1wbC5GbHVzaDsKK2JlZ2luCiAgIHRyeQotICAgIFJlc3VsdCA6PSBGSW5wdXRTdHJlYW0uUmVhZCggYnVmLCBvZmYsIGxlbiApCisgICAgU2VuZFJlcXVlc3Q7CisgIGZpbmFsbHkKKyAgICBGT3V0cHV0U3RyZWFtIDo9IG5pbDsKKyAgICBGT3V0cHV0U3RyZWFtIDo9IFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpLkNyZWF0ZSggVE1lbW9yeVN0cmVhbS5DcmVhdGUsIFRydWUpOworICAgIEFTU0VSVCggRk91dHB1dFN0cmVhbSA8PiBuaWwpOworICBlbmQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRIVFRQQ2xpZW50SW1wbC5SZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOworYmVnaW4KKyAgaWYgRklucHV0U3RyZWFtID0gbmlsIHRoZW4gYmVnaW4KKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ05vIHJlcXVlc3QgaGFzIGJlZW4gc2VudCcpOworICBlbmQ7CisKKyAgdHJ5CisgICAgUmVzdWx0IDo9IEZJbnB1dFN0cmVhbS5SZWFkKCBwQnVmLCBidWZsZW4sIG9mZiwgbGVuKQogICBleGNlcHQKLSAgICBvbiBFOiBFeGNlcHRpb24gZG8KLSAgICBiZWdpbgotICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoIFRUcmFuc3BvcnRFeGNlcHRpb24uVEV4Y2VwdGlvblR5cGUuVW5rbm93biwKLSAgICAgICAgRS5NZXNzYWdlKTsKLSAgICBlbmQ7CisgICAgb24gRTogRXhjZXB0aW9uCisgICAgZG8gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKEUuTWVzc2FnZSk7CiAgIGVuZDsKIGVuZDsKIApAQCAtNDc0LDggKzYxOSw3IEBACiAgIHRyeQogICAgIGEgOj0gRk91dHB1dFN0cmVhbS5Ub0FycmF5OwogICAgIGxlbiA6PSBMZW5ndGgoYSk7Ci0gICAgaWYgbGVuID4gMCB0aGVuCi0gICAgYmVnaW4KKyAgICBpZiBsZW4gPiAwIHRoZW4gYmVnaW4KICAgICAgIG1zLldyaXRlQnVmZmVyKCBQb2ludGVyKEBhWzBdKV4sIGxlbik7CiAgICAgZW5kOwogICAgIG1zLlBvc2l0aW9uIDo9IDA7CkBAIC00ODcsMzkgKzYzMSw2MiBAQAogICBlbmQ7CiBlbmQ7CiAKLXByb2NlZHVyZSBUSFRUUENsaWVudEltcGwuU2V0Q29ubmVjdGlvblRpbWVvdXQoY29uc3QgVmFsdWU6IEludGVnZXIpOworcHJvY2VkdXJlIFRIVFRQQ2xpZW50SW1wbC5Xcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZiwgbGVuIDogSW50ZWdlcik7CiBiZWdpbgotICBGQ29ubmVjdGlvblRpbWVvdXQgOj0gVmFsdWU7Ci1lbmQ7Ci0KLXByb2NlZHVyZSBUSFRUUENsaWVudEltcGwuU2V0UmVhZFRpbWVvdXQoY29uc3QgVmFsdWU6IEludGVnZXIpOwotYmVnaW4KLSAgRlJlYWRUaW1lb3V0IDo9IFZhbHVlCi1lbmQ7Ci0KLXByb2NlZHVyZSBUSFRUUENsaWVudEltcGwuV3JpdGUoIGNvbnN0IGJ1ZjogVEJ5dGVzOyBvZmYsIGxlbjogSW50ZWdlcik7Ci1iZWdpbgotICBGT3V0cHV0U3RyZWFtLldyaXRlKCBidWYsIG9mZiwgbGVuKTsKKyAgRk91dHB1dFN0cmVhbS5Xcml0ZSggcEJ1Ziwgb2ZmLCBsZW4pOwogZW5kOwogCiB7IFRUcmFuc3BvcnRFeGNlcHRpb24gfQogCi1jb25zdHJ1Y3RvciBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZShBVHlwZTogVEV4Y2VwdGlvblR5cGUpOworZnVuY3Rpb24gVFRyYW5zcG9ydEV4Y2VwdGlvbi5HZXRUeXBlOiBURXhjZXB0aW9uVHlwZTsKK2JlZ2luCisgIGlmIFNlbGYgaXMgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4gdGhlbiBSZXN1bHQgOj0gVEV4Y2VwdGlvblR5cGUuTm90T3BlbgorICBlbHNlIGlmIFNlbGYgaXMgVFRyYW5zcG9ydEV4Y2VwdGlvbkFscmVhZHlPcGVuIHRoZW4gUmVzdWx0IDo9IFRFeGNlcHRpb25UeXBlLkFscmVhZHlPcGVuCisgIGVsc2UgaWYgU2VsZiBpcyBUVHJhbnNwb3J0RXhjZXB0aW9uVGltZWRPdXQgdGhlbiBSZXN1bHQgOj0gVEV4Y2VwdGlvblR5cGUuVGltZWRPdXQKKyAgZWxzZSBpZiBTZWxmIGlzIFRUcmFuc3BvcnRFeGNlcHRpb25FbmRPZkZpbGUgdGhlbiBSZXN1bHQgOj0gVEV4Y2VwdGlvblR5cGUuRW5kT2ZGaWxlCisgIGVsc2UgaWYgU2VsZiBpcyBUVHJhbnNwb3J0RXhjZXB0aW9uQmFkQXJncyB0aGVuIFJlc3VsdCA6PSBURXhjZXB0aW9uVHlwZS5CYWRBcmdzCisgIGVsc2UgaWYgU2VsZiBpcyBUVHJhbnNwb3J0RXhjZXB0aW9uSW50ZXJydXB0ZWQgdGhlbiBSZXN1bHQgOj0gVEV4Y2VwdGlvblR5cGUuSW50ZXJydXB0ZWQKKyAgZWxzZSBSZXN1bHQgOj0gVEV4Y2VwdGlvblR5cGUuVW5rbm93bjsKK2VuZDsKKworY29uc3RydWN0b3IgVFRyYW5zcG9ydEV4Y2VwdGlvbi5IaWRkZW5DcmVhdGUoY29uc3QgTXNnOiBzdHJpbmcpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZShNc2cpOworZW5kOworCitjbGFzcyBmdW5jdGlvbiBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZShBVHlwZTogVEV4Y2VwdGlvblR5cGUpOiBUVHJhbnNwb3J0RXhjZXB0aW9uOwogYmVnaW4KICAgLy9ubyBpbmhlcml0ZWQ7Ci0gIENyZWF0ZSggQVR5cGUsICcnICkKK3skV0FSTiBTWU1CT0xfREVQUkVDQVRFRCBPRkZ9CisgIFJlc3VsdCA6PSBDcmVhdGUoQVR5cGUsICcnKQoreyRXQVJOIFNZTUJPTF9ERVBSRUNBVEVEIERFRkFVTFR9CiBlbmQ7CiAKLWNvbnN0cnVjdG9yIFRUcmFuc3BvcnRFeGNlcHRpb24uQ3JlYXRlKEFUeXBlOiBURXhjZXB0aW9uVHlwZTsKLSAgY29uc3QgbXNnOiBzdHJpbmcpOworY2xhc3MgZnVuY3Rpb24gVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoQVR5cGU6IFRFeGNlcHRpb25UeXBlOworICBjb25zdCBtc2c6IHN0cmluZyk6IFRUcmFuc3BvcnRFeGNlcHRpb247CiBiZWdpbgotICBpbmhlcml0ZWQgQ3JlYXRlKG1zZyk7Ci0gIEZUeXBlIDo9IEFUeXBlOworICBjYXNlIEFUeXBlIG9mCisgICAgVEV4Y2VwdGlvblR5cGUuTm90T3BlbjogICAgIFJlc3VsdCA6PSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUobXNnKTsKKyAgICBURXhjZXB0aW9uVHlwZS5BbHJlYWR5T3BlbjogUmVzdWx0IDo9IFRUcmFuc3BvcnRFeGNlcHRpb25BbHJlYWR5T3Blbi5DcmVhdGUobXNnKTsKKyAgICBURXhjZXB0aW9uVHlwZS5UaW1lZE91dDogICAgUmVzdWx0IDo9IFRUcmFuc3BvcnRFeGNlcHRpb25UaW1lZE91dC5DcmVhdGUobXNnKTsKKyAgICBURXhjZXB0aW9uVHlwZS5FbmRPZkZpbGU6ICAgUmVzdWx0IDo9IFRUcmFuc3BvcnRFeGNlcHRpb25FbmRPZkZpbGUuQ3JlYXRlKG1zZyk7CisgICAgVEV4Y2VwdGlvblR5cGUuQmFkQXJnczogICAgIFJlc3VsdCA6PSBUVHJhbnNwb3J0RXhjZXB0aW9uQmFkQXJncy5DcmVhdGUobXNnKTsKKyAgICBURXhjZXB0aW9uVHlwZS5JbnRlcnJ1cHRlZDogUmVzdWx0IDo9IFRUcmFuc3BvcnRFeGNlcHRpb25JbnRlcnJ1cHRlZC5DcmVhdGUobXNnKTsKKyAgZWxzZQorICAgIFJlc3VsdCA6PSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUobXNnKTsKKyAgZW5kOwogZW5kOwogCi1jb25zdHJ1Y3RvciBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZShjb25zdCBtc2c6IHN0cmluZyk7CitjbGFzcyBmdW5jdGlvbiBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZShjb25zdCBtc2c6IHN0cmluZyk6IFRUcmFuc3BvcnRFeGNlcHRpb247CiBiZWdpbgotICBpbmhlcml0ZWQgQ3JlYXRlKG1zZyk7CisgIFJlc3VsdCA6PSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoTXNnKTsKK2VuZDsKKworeyBUVHJhbnNwb3J0RXhjZXB0aW9uU3BlY2lhbGl6ZWQgfQorCitjb25zdHJ1Y3RvciBUVHJhbnNwb3J0RXhjZXB0aW9uU3BlY2lhbGl6ZWQuQ3JlYXRlKGNvbnN0IE1zZzogc3RyaW5nKTsKK2JlZ2luCisgIGluaGVyaXRlZCBIaWRkZW5DcmVhdGUoTXNnKTsKIGVuZDsKIAogeyBUVHJhbnNwb3J0RmFjdG9yeUltcGwgfQpAQCAtNTMxLDI3ICs2OTgsNDUgQEAKIAogeyBUU2VydmVyU29ja2V0IH0KIAoreyRJRkRFRiBPTERfU09DS0VUU30KIGNvbnN0cnVjdG9yIFRTZXJ2ZXJTb2NrZXRJbXBsLkNyZWF0ZSggY29uc3QgQVNlcnZlcjogVFRjcFNlcnZlcjsgQUNsaWVudFRpbWVvdXQ6IEludGVnZXIpOwogYmVnaW4KICAgaW5oZXJpdGVkIENyZWF0ZTsKICAgRlNlcnZlciA6PSBBU2VydmVyOwogICBGQ2xpZW50VGltZW91dCA6PSBBQ2xpZW50VGltZW91dDsKIGVuZDsKLQotY29uc3RydWN0b3IgVFNlcnZlclNvY2tldEltcGwuQ3JlYXRlKEFQb3J0LCBBQ2xpZW50VGltZW91dDogSW50ZWdlcjsgQVVzZUJ1ZmZlcmVkU29ja2V0czogQm9vbGVhbik7Cit7JEVMU0V9Citjb25zdHJ1Y3RvciBUU2VydmVyU29ja2V0SW1wbC5DcmVhdGUoIGNvbnN0IEFTZXJ2ZXI6IFRTZXJ2ZXJTb2NrZXQ7IEFDbGllbnRUaW1lb3V0OiBMb25nd29yZCk7CiBiZWdpbgogICBpbmhlcml0ZWQgQ3JlYXRlOworICBGU2VydmVyIDo9IEFTZXJ2ZXI7CisgIEZTZXJ2ZXIuUmVjdlRpbWVvdXQgOj0gQUNsaWVudFRpbWVvdXQ7CisgIEZTZXJ2ZXIuU2VuZFRpbWVvdXQgOj0gQUNsaWVudFRpbWVvdXQ7CitlbmQ7Cit7JEVORElGfQorCit7JElGREVGIE9MRF9TT0NLRVRTfQorY29uc3RydWN0b3IgVFNlcnZlclNvY2tldEltcGwuQ3JlYXRlKEFQb3J0LCBBQ2xpZW50VGltZW91dDogSW50ZWdlcjsgQVVzZUJ1ZmZlcmVkU29ja2V0czogQm9vbGVhbik7Cit7JEVMU0V9Citjb25zdHJ1Y3RvciBUU2VydmVyU29ja2V0SW1wbC5DcmVhdGUoQVBvcnQ6IEludGVnZXI7IEFDbGllbnRUaW1lb3V0OiBMb25nd29yZDsgQVVzZUJ1ZmZlcmVkU29ja2V0czogQm9vbGVhbik7Cit7JEVORElGfQorYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKK3skSUZERUYgT0xEX1NPQ0tFVFN9CiAgIEZQb3J0IDo9IEFQb3J0OwogICBGQ2xpZW50VGltZW91dCA6PSBBQ2xpZW50VGltZW91dDsKLSAgRlVzZUJ1ZmZlcmVkU29ja2V0IDo9IEFVc2VCdWZmZXJlZFNvY2tldHM7Ci0gIEZPd25zU2VydmVyIDo9IFRydWU7CiAgIEZTZXJ2ZXIgOj0gVFRjcFNlcnZlci5DcmVhdGUoIG5pbCApOwogICBGU2VydmVyLkJsb2NrTW9kZSA6PSBibUJsb2NraW5nOwoteyRJRiBDb21waWxlclZlcnNpb24gPj0gMjEuMH0KKyAgeyRJRiBDb21waWxlclZlcnNpb24gPj0gMjEuMH0KICAgRlNlcnZlci5Mb2NhbFBvcnQgOj0gQW5zaVN0cmluZyggSW50VG9TdHIoIEZQb3J0KSk7Ci17JEVMU0V9CisgIHskRUxTRX0KICAgRlNlcnZlci5Mb2NhbFBvcnQgOj0gSW50VG9TdHIoIEZQb3J0KTsKLXskSUZFTkR9CisgIHskSUZFTkR9Cit7JEVMU0V9CisgIEZTZXJ2ZXIgOj0gVFNlcnZlclNvY2tldC5DcmVhdGUoQVBvcnQsIEFDbGllbnRUaW1lb3V0LCBBQ2xpZW50VGltZW91dCk7Cit7JEVORElGfQorICBGVXNlQnVmZmVyZWRTb2NrZXQgOj0gQVVzZUJ1ZmZlcmVkU29ja2V0czsKKyAgRk93bnNTZXJ2ZXIgOj0gVHJ1ZTsKIGVuZDsKIAogZGVzdHJ1Y3RvciBUU2VydmVyU29ja2V0SW1wbC5EZXN0cm95OwpAQCAtNTY1LDE1ICs3NTAsMTggQEAKIAogZnVuY3Rpb24gVFNlcnZlclNvY2tldEltcGwuQWNjZXB0KCBjb25zdCBmbkFjY2VwdGluZzogVFByb2MpOiBJVHJhbnNwb3J0OwogdmFyCit7JElGREVGIE9MRF9TT0NLRVRTfQogICBjbGllbnQgOiBUQ3VzdG9tSXBDbGllbnQ7Cit7JEVMU0V9CisgIGNsaWVudDogVFNvY2tldDsKK3skRU5ESUZ9CiAgIHRyYW5zICA6IElTdHJlYW1UcmFuc3BvcnQ7CiBiZWdpbgotICBpZiBGU2VydmVyID0gbmlsIHRoZW4KLSAgYmVnaW4KLSAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZSggVFRyYW5zcG9ydEV4Y2VwdGlvbi5URXhjZXB0aW9uVHlwZS5Ob3RPcGVuLAotICAgICAgJ05vIHVuZGVybHlpbmcgc2VydmVyIHNvY2tldC4nKTsKKyAgaWYgRlNlcnZlciA9IG5pbCB0aGVuIGJlZ2luCisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdObyB1bmRlcmx5aW5nIHNlcnZlciBzb2NrZXQuJyk7CiAgIGVuZDsKIAoreyRJRkRFRiBPTERfU09DS0VUU30KICAgY2xpZW50IDo9IG5pbDsKICAgdHJ5CiAgICAgY2xpZW50IDo9IFRDdXN0b21JcENsaWVudC5DcmVhdGUobmlsKTsKQEAgLTU4MSwxNSArNzY5LDEzIEBACiAgICAgaWYgQXNzaWduZWQoZm5BY2NlcHRpbmcpCiAgICAgdGhlbiBmbkFjY2VwdGluZygpOwogCi0gICAgaWYgbm90IEZTZXJ2ZXIuQWNjZXB0KCBjbGllbnQpIHRoZW4KLSAgICBiZWdpbgorICAgIGlmIG5vdCBGU2VydmVyLkFjY2VwdCggY2xpZW50KSB0aGVuIGJlZ2luCiAgICAgICBjbGllbnQuRnJlZTsKICAgICAgIFJlc3VsdCA6PSBuaWw7CiAgICAgICBFeGl0OwogICAgIGVuZDsKIAotICAgIGlmIGNsaWVudCA9IG5pbCB0aGVuCi0gICAgYmVnaW4KKyAgICBpZiBjbGllbnQgPSBuaWwgdGhlbiBiZWdpbgogICAgICAgUmVzdWx0IDo9IG5pbDsKICAgICAgIEV4aXQ7CiAgICAgZW5kOwpAQCAtNjA0LDQzICs3OTAsNjQgQEAKICAgZXhjZXB0CiAgICAgb24gRTogRXhjZXB0aW9uIGRvIGJlZ2luCiAgICAgICBjbGllbnQuRnJlZTsKLSAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24uQ3JlYXRlKCBFLlRvU3RyaW5nICk7CisgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoRS5Ub1N0cmluZyk7CiAgICAgZW5kOwogICBlbmQ7Cit7JEVMU0V9CisgIGlmIEFzc2lnbmVkKGZuQWNjZXB0aW5nKSB0aGVuCisgICAgZm5BY2NlcHRpbmcoKTsKKworICBjbGllbnQgOj0gRlNlcnZlci5BY2NlcHQ7CisgIHRyeQorICAgIHRyYW5zIDo9IFRTb2NrZXRJbXBsLkNyZWF0ZShjbGllbnQsIFRydWUpOworICAgIGNsaWVudCA6PSBuaWw7CisKKyAgICBpZiBGVXNlQnVmZmVyZWRTb2NrZXQgdGhlbgorICAgICAgUmVzdWx0IDo9IFRCdWZmZXJlZFRyYW5zcG9ydEltcGwuQ3JlYXRlKHRyYW5zKQorICAgIGVsc2UKKyAgICAgIFJlc3VsdCA6PSB0cmFuczsKKyAgZXhjZXB0CisgICAgY2xpZW50LkZyZWU7CisgICAgcmFpc2U7CisgIGVuZDsKK3skRU5ESUZ9CiBlbmQ7CiAKIHByb2NlZHVyZSBUU2VydmVyU29ja2V0SW1wbC5MaXN0ZW47CiBiZWdpbgogICBpZiBGU2VydmVyIDw+IG5pbCB0aGVuCiAgIGJlZ2luCit7JElGREVGIE9MRF9TT0NLRVRTfQogICAgIHRyeQogICAgICAgRlNlcnZlci5BY3RpdmUgOj0gVHJ1ZTsKICAgICBleGNlcHQKLSAgICAgIG9uIEU6IEV4Y2VwdGlvbiBkbwotICAgICAgYmVnaW4KLSAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoJ0NvdWxkIG5vdCBhY2NlcHQgb24gbGlzdGVuaW5nIHNvY2tldDogJyArIEUuTWVzc2FnZSk7Ci0gICAgICBlbmQ7CisgICAgICBvbiBFOiBFeGNlcHRpb24KKyAgICAgIGRvIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Vbmtub3duLkNyZWF0ZSgnQ291bGQgbm90IGFjY2VwdCBvbiBsaXN0ZW5pbmcgc29ja2V0OiAnICsgRS5NZXNzYWdlKTsKICAgICBlbmQ7Cit7JEVMU0V9CisgICAgRlNlcnZlci5MaXN0ZW47Cit7JEVORElGfQogICBlbmQ7CiBlbmQ7CiAKIHByb2NlZHVyZSBUU2VydmVyU29ja2V0SW1wbC5DbG9zZTsKIGJlZ2luCiAgIGlmIEZTZXJ2ZXIgPD4gbmlsIHRoZW4KLSAgYmVnaW4KK3skSUZERUYgT0xEX1NPQ0tFVFN9CiAgICAgdHJ5CiAgICAgICBGU2VydmVyLkFjdGl2ZSA6PSBGYWxzZTsKICAgICBleGNlcHQKLSAgICAgIG9uIEU6IEV4Y2VwdGlvbiBkbwotICAgICAgYmVnaW4KLSAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoJ0Vycm9yIG9uIGNsb3Npbmcgc29ja2V0IDogJyArIEUuTWVzc2FnZSk7Ci0gICAgICBlbmQ7CisgICAgICBvbiBFOiBFeGNlcHRpb24KKyAgICAgIGRvIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Vbmtub3duLkNyZWF0ZSgnRXJyb3Igb24gY2xvc2luZyBzb2NrZXQgOiAnICsgRS5NZXNzYWdlKTsKICAgICBlbmQ7Ci0gIGVuZDsKK3skRUxTRX0KKyAgICBGU2VydmVyLkNsb3NlOworeyRFTkRJRn0KIGVuZDsKIAogeyBUU29ja2V0IH0KIAoreyRJRkRFRiBPTERfU09DS0VUU30KIGNvbnN0cnVjdG9yIFRTb2NrZXRJbXBsLkNyZWF0ZSggY29uc3QgQUNsaWVudCA6IFRDdXN0b21JcENsaWVudDsgYU93bnNDbGllbnQgOiBCb29sZWFuOyBBVGltZW91dDogSW50ZWdlciA9IDApOwogdmFyIHN0cmVhbSA6IElUaHJpZnRTdHJlYW07CiBiZWdpbgpAQCAtNjUwLDggKzg1NywyMyBAQAogICBzdHJlYW0gOj0gVFRjcFNvY2tldFN0cmVhbUltcGwuQ3JlYXRlKCBGQ2xpZW50LCBGVGltZW91dCk7CiAgIGluaGVyaXRlZCBDcmVhdGUoIHN0cmVhbSwgc3RyZWFtKTsKIGVuZDsKK3skRUxTRX0KK2NvbnN0cnVjdG9yIFRTb2NrZXRJbXBsLkNyZWF0ZShjb25zdCBBQ2xpZW50OiBUU29ja2V0OyBhT3duc0NsaWVudDogQm9vbGVhbik7Cit2YXIgc3RyZWFtIDogSVRocmlmdFN0cmVhbTsKK2JlZ2luCisgIEZDbGllbnQgOj0gQUNsaWVudDsKKyAgRlRpbWVvdXQgOj0gQUNsaWVudC5SZWN2VGltZW91dDsKKyAgRk93bnNDbGllbnQgOj0gYU93bnNDbGllbnQ7CisgIHN0cmVhbSA6PSBUVGNwU29ja2V0U3RyZWFtSW1wbC5DcmVhdGUoRkNsaWVudCwgRlRpbWVvdXQpOworICBpbmhlcml0ZWQgQ3JlYXRlKHN0cmVhbSwgc3RyZWFtKTsKK2VuZDsKK3skRU5ESUZ9CiAKK3skSUZERUYgT0xEX1NPQ0tFVFN9CiBjb25zdHJ1Y3RvciBUU29ja2V0SW1wbC5DcmVhdGUoY29uc3QgQUhvc3Q6IHN0cmluZzsgQVBvcnQsIEFUaW1lb3V0OiBJbnRlZ2VyKTsKK3skRUxTRX0KK2NvbnN0cnVjdG9yIFRTb2NrZXRJbXBsLkNyZWF0ZShjb25zdCBBSG9zdDogc3RyaW5nOyBBUG9ydDogSW50ZWdlcjsgQVRpbWVvdXQ6IExvbmd3b3JkKTsKK3skRU5ESUZ9CiBiZWdpbgogICBpbmhlcml0ZWQgQ3JlYXRlKG5pbCxuaWwpOwogICBGSG9zdCA6PSBBSG9zdDsKQEAgLTY3MCwxMyArODkyLDIyIEBACiBwcm9jZWR1cmUgVFNvY2tldEltcGwuQ2xvc2U7CiBiZWdpbgogICBpbmhlcml0ZWQgQ2xvc2U7CisKKyAgRklucHV0U3RyZWFtIDo9IG5pbDsKKyAgRk91dHB1dFN0cmVhbSA6PSBuaWw7CisKICAgaWYgRk93bnNDbGllbnQKLSAgdGhlbiBGcmVlQW5kTmlsKCBGQ2xpZW50KTsKKyAgdGhlbiBGcmVlQW5kTmlsKCBGQ2xpZW50KQorICBlbHNlIEZDbGllbnQgOj0gbmlsOwogZW5kOwogCiBmdW5jdGlvbiBUU29ja2V0SW1wbC5HZXRJc09wZW46IEJvb2xlYW47CiBiZWdpbgoreyRJRkRFRiBPTERfU09DS0VUU30KICAgUmVzdWx0IDo9IChGQ2xpZW50IDw+IG5pbCkgYW5kIEZDbGllbnQuQ29ubmVjdGVkOworeyRFTFNFfQorICBSZXN1bHQgOj0gKEZDbGllbnQgPD4gbmlsKSBhbmQgRkNsaWVudC5Jc09wZW4KK3skRU5ESUZ9CiBlbmQ7CiAKIHByb2NlZHVyZSBUU29ja2V0SW1wbC5Jbml0U29ja2V0OwpAQCAtNjg3LDcgKzkxOCwxMSBAQAogICB0aGVuIEZyZWVBbmROaWwoIEZDbGllbnQpCiAgIGVsc2UgRkNsaWVudCA6PSBuaWw7CiAKK3skSUZERUYgT0xEX1NPQ0tFVFN9CiAgIEZDbGllbnQgOj0gVFRjcENsaWVudC5DcmVhdGUoIG5pbCk7Cit7JEVMU0V9CisgIEZDbGllbnQgOj0gVFNvY2tldC5DcmVhdGUoRkhvc3QsIEZQb3J0KTsKK3skRU5ESUZ9CiAgIEZPd25zQ2xpZW50IDo9IFRydWU7CiAKICAgc3RyZWFtIDo9IFRUY3BTb2NrZXRTdHJlYW1JbXBsLkNyZWF0ZSggRkNsaWVudCwgRlRpbWVvdXQpOwpAQCAtNjk3LDMyICs5MzIsMjggQEAKIAogcHJvY2VkdXJlIFRTb2NrZXRJbXBsLk9wZW47CiBiZWdpbgotICBpZiBJc09wZW4gdGhlbgotICBiZWdpbgotICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24uQ3JlYXRlKCBUVHJhbnNwb3J0RXhjZXB0aW9uLlRFeGNlcHRpb25UeXBlLkFscmVhZHlPcGVuLAotICAgICAgJ1NvY2tldCBhbHJlYWR5IGNvbm5lY3RlZCcpOworICBpZiBJc09wZW4gdGhlbiBiZWdpbgorICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25BbHJlYWR5T3Blbi5DcmVhdGUoJ1NvY2tldCBhbHJlYWR5IGNvbm5lY3RlZCcpOwogICBlbmQ7CiAKLSAgaWYgRkhvc3QgPSAgJycgdGhlbgotICBiZWdpbgotICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24uQ3JlYXRlKCBUVHJhbnNwb3J0RXhjZXB0aW9uLlRFeGNlcHRpb25UeXBlLk5vdE9wZW4sCi0gICAgICAnQ2Fubm90IG9wZW4gbnVsbCBob3N0Jyk7CisgIGlmIEZIb3N0ID0gJycgdGhlbiBiZWdpbgorICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnQ2Fubm90IG9wZW4gbnVsbCBob3N0Jyk7CiAgIGVuZDsKIAotICBpZiBQb3J0IDw9IDAgdGhlbgotICBiZWdpbgotICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24uQ3JlYXRlKCBUVHJhbnNwb3J0RXhjZXB0aW9uLlRFeGNlcHRpb25UeXBlLk5vdE9wZW4sCi0gICAgICAnQ2Fubm90IG9wZW4gd2l0aG91dCBwb3J0Jyk7CisgIGlmIFBvcnQgPD0gMCB0aGVuIGJlZ2luCisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdDYW5ub3Qgb3BlbiB3aXRob3V0IHBvcnQnKTsKICAgZW5kOwogCi0gIGlmIEZDbGllbnQgPSBuaWwgdGhlbgotICBiZWdpbgotICAgIEluaXRTb2NrZXQ7Ci0gIGVuZDsKKyAgaWYgRkNsaWVudCA9IG5pbAorICB0aGVuIEluaXRTb2NrZXQ7CiAKK3skSUZERUYgT0xEX1NPQ0tFVFN9CiAgIEZDbGllbnQuUmVtb3RlSG9zdCA6PSBUU29ja2V0SG9zdCggSG9zdCk7CiAgIEZDbGllbnQuUmVtb3RlUG9ydCA6PSBUU29ja2V0UG9ydCggSW50VG9TdHIoIFBvcnQpKTsKICAgRkNsaWVudC5Db25uZWN0OworeyRFTFNFfQorICBGQ2xpZW50Lk9wZW47Cit7JEVORElGfQogCiAgIEZJbnB1dFN0cmVhbSA6PSBUVGNwU29ja2V0U3RyZWFtSW1wbC5DcmVhdGUoIEZDbGllbnQsIEZUaW1lb3V0KTsKICAgRk91dHB1dFN0cmVhbSA6PSBGSW5wdXRTdHJlYW07CkBAIC03NjIsMTEgKzk5Myw5IEBACiAgIGJ1ZiA6IFRCeXRlczsKICAgbGVuIDogSW50ZWdlcjsKIGJlZ2luCi0gIGlmIElzT3BlbiB0aGVuCi0gIGJlZ2luCisgIGlmIElzT3BlbiB0aGVuIGJlZ2luCiAgICAgbGVuIDo9IEZXcml0ZUJ1ZmZlci5TaXplOwotICAgIGlmIGxlbiA+IDAgdGhlbgotICAgIGJlZ2luCisgICAgaWYgbGVuID4gMCB0aGVuIGJlZ2luCiAgICAgICBTZXRMZW5ndGgoIGJ1ZiwgbGVuICk7CiAgICAgICBGV3JpdGVCdWZmZXIuUG9zaXRpb24gOj0gMDsKICAgICAgIEZXcml0ZUJ1ZmZlci5SZWFkKCBQb2ludGVyKEBidWZbMF0pXiwgbGVuICk7CkBAIC03ODAsMjcgKzEwMDksMjggQEAKIGJlZ2luCiAgIFJlc3VsdCA6PSAoRldyaXRlQnVmZmVyIDw+IG5pbCkKICAgICAgICAgYW5kIChGUmVhZEJ1ZmZlciA8PiBuaWwpCi0gICAgICAgIGFuZCAoRlN0cmVhbSA8PiBuaWwpOworICAgICAgICBhbmQgKEZTdHJlYW0gPD4gbmlsKQorICAgICAgICBhbmQgRlN0cmVhbS5Jc09wZW47CiBlbmQ7CiAKIHByb2NlZHVyZSBUQnVmZmVyZWRTdHJlYW1JbXBsLk9wZW47CiBiZWdpbgotCisgIEZTdHJlYW0uT3BlbjsKIGVuZDsKIAotZnVuY3Rpb24gVEJ1ZmZlcmVkU3RyZWFtSW1wbC5SZWFkKCB2YXIgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOworZnVuY3Rpb24gVEJ1ZmZlcmVkU3RyZWFtSW1wbC5SZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7CiB2YXIKICAgblJlYWQgOiBJbnRlZ2VyOwogICB0ZW1wYnVmIDogVEJ5dGVzOworICBwVG1wIDogUEJ5dGU7CiBiZWdpbgogICBpbmhlcml0ZWQ7CiAgIFJlc3VsdCA6PSAwOwotICBpZiBJc09wZW4gdGhlbgotICBiZWdpbgorCisgIGlmIElzT3BlbiB0aGVuIGJlZ2luCiAgICAgd2hpbGUgY291bnQgPiAwIGRvIGJlZ2luCiAKLSAgICAgIGlmIEZSZWFkQnVmZmVyLlBvc2l0aW9uID49IEZSZWFkQnVmZmVyLlNpemUgdGhlbgotICAgICAgYmVnaW4KKyAgICAgIGlmIEZSZWFkQnVmZmVyLlBvc2l0aW9uID49IEZSZWFkQnVmZmVyLlNpemUgdGhlbiBiZWdpbgogICAgICAgICBGUmVhZEJ1ZmZlci5DbGVhcjsKICAgICAgICAgU2V0TGVuZ3RoKCB0ZW1wYnVmLCBGQnVmU2l6ZSk7CiAgICAgICAgIG5SZWFkIDo9IEZTdHJlYW0uUmVhZCggdGVtcGJ1ZiwgMCwgRkJ1ZlNpemUgKTsKQEAgLTgxMCwxMCArMTA0MCwxMSBAQAogICAgICAgICBGUmVhZEJ1ZmZlci5Qb3NpdGlvbiA6PSAwOwogICAgICAgZW5kOwogCi0gICAgICBpZiBGUmVhZEJ1ZmZlci5Qb3NpdGlvbiA8IEZSZWFkQnVmZmVyLlNpemUgdGhlbgotICAgICAgYmVnaW4KLSAgICAgICAgblJlYWQgIDo9IE1pbiggRlJlYWRCdWZmZXIuU2l6ZSAtIEZSZWFkQnVmZmVyLlBvc2l0aW9uLCBjb3VudCk7Ci0gICAgICAgIEluYyggUmVzdWx0LCBGUmVhZEJ1ZmZlci5SZWFkKCBQb2ludGVyKEBidWZmZXJbb2Zmc2V0XSleLCBuUmVhZCkpOworICAgICAgaWYgRlJlYWRCdWZmZXIuUG9zaXRpb24gPCBGUmVhZEJ1ZmZlci5TaXplIHRoZW4gYmVnaW4KKyAgICAgICAgblJlYWQgOj0gTWluKCBGUmVhZEJ1ZmZlci5TaXplIC0gRlJlYWRCdWZmZXIuUG9zaXRpb24sIGNvdW50KTsKKyAgICAgICAgcFRtcCAgOj0gcEJ1ZjsKKyAgICAgICAgSW5jKCBwVG1wLCBvZmZzZXQpOworICAgICAgICBJbmMoIFJlc3VsdCwgRlJlYWRCdWZmZXIuUmVhZCggcFRtcF4sIG5SZWFkKSk7CiAgICAgICAgIERlYyggY291bnQsIG5SZWFkKTsKICAgICAgICAgSW5jKCBvZmZzZXQsIG5SZWFkKTsKICAgICAgIGVuZDsKQEAgLTgyMiwzNSArMTA1MywzMiBAQAogZW5kOwogCiBmdW5jdGlvbiBUQnVmZmVyZWRTdHJlYW1JbXBsLlRvQXJyYXk6IFRCeXRlczsKLXZhcgotICBsZW4gOiBJbnRlZ2VyOwordmFyIGxlbiA6IEludGVnZXI7CiBiZWdpbgogICBsZW4gOj0gMDsKIAotICBpZiBJc09wZW4gdGhlbgotICBiZWdpbgorICBpZiBJc09wZW4gdGhlbiBiZWdpbgogICAgIGxlbiA6PSBGUmVhZEJ1ZmZlci5TaXplOwogICBlbmQ7CiAKICAgU2V0TGVuZ3RoKCBSZXN1bHQsIGxlbik7CiAKLSAgaWYgbGVuID4gMCB0aGVuCi0gIGJlZ2luCisgIGlmIGxlbiA+IDAgdGhlbiBiZWdpbgogICAgIEZSZWFkQnVmZmVyLlBvc2l0aW9uIDo9IDA7CiAgICAgRlJlYWRCdWZmZXIuUmVhZCggUG9pbnRlcihAUmVzdWx0WzBdKV4sIGxlbiApOwogICBlbmQ7CiBlbmQ7CiAKLXByb2NlZHVyZSBUQnVmZmVyZWRTdHJlYW1JbXBsLldyaXRlKCBjb25zdCBidWZmZXI6IFRCeXRlczsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7Citwcm9jZWR1cmUgVEJ1ZmZlcmVkU3RyZWFtSW1wbC5Xcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOwordmFyIHBUbXAgOiBQQnl0ZTsKIGJlZ2luCiAgIGluaGVyaXRlZDsKLSAgaWYgY291bnQgPiAwIHRoZW4KLSAgYmVnaW4KLSAgICBpZiBJc09wZW4gdGhlbgotICAgIGJlZ2luCi0gICAgICBGV3JpdGVCdWZmZXIuV3JpdGUoIFBvaW50ZXIoQGJ1ZmZlcltvZmZzZXRdKV4sIGNvdW50ICk7Ci0gICAgICBpZiBGV3JpdGVCdWZmZXIuU2l6ZSA+IEZCdWZTaXplIHRoZW4KLSAgICAgIGJlZ2luCisgIGlmIGNvdW50ID4gMCB0aGVuIGJlZ2luCisgICAgaWYgSXNPcGVuIHRoZW4gYmVnaW4KKyAgICAgIHBUbXAgOj0gcEJ1ZjsKKyAgICAgIEluYyggcFRtcCwgb2Zmc2V0KTsKKyAgICAgIEZXcml0ZUJ1ZmZlci5Xcml0ZSggcFRtcF4sIGNvdW50ICk7CisgICAgICBpZiBGV3JpdGVCdWZmZXIuU2l6ZSA+IEZCdWZTaXplIHRoZW4gYmVnaW4KICAgICAgICAgRmx1c2g7CiAgICAgICBlbmQ7CiAgICAgZW5kOwpAQCAtODU5LDI1ICsxMDg3LDYgQEAKIAogeyBUU3RyZWFtVHJhbnNwb3J0SW1wbCB9CiAKLXByb2NlZHVyZSBUU3RyZWFtVHJhbnNwb3J0SW1wbC5DbG9zZTsKLWJlZ2luCi0gIGlmIEZJbnB1dFN0cmVhbSA8PiBGT3V0cHV0U3RyZWFtIHRoZW4KLSAgYmVnaW4KLSAgICBpZiBGSW5wdXRTdHJlYW0gPD4gbmlsIHRoZW4KLSAgICBiZWdpbgotICAgICAgRklucHV0U3RyZWFtIDo9IG5pbDsKLSAgICBlbmQ7Ci0gICAgaWYgRk91dHB1dFN0cmVhbSA8PiBuaWwgdGhlbgotICAgIGJlZ2luCi0gICAgICBGT3V0cHV0U3RyZWFtIDo9IG5pbDsKLSAgICBlbmQ7Ci0gIGVuZCBlbHNlCi0gIGJlZ2luCi0gICAgRklucHV0U3RyZWFtIDo9IG5pbDsKLSAgICBGT3V0cHV0U3RyZWFtIDo9IG5pbDsKLSAgZW5kOwotZW5kOwotCiBjb25zdHJ1Y3RvciBUU3RyZWFtVHJhbnNwb3J0SW1wbC5DcmVhdGUoIGNvbnN0IEFJbnB1dFN0cmVhbSA6IElUaHJpZnRTdHJlYW07IGNvbnN0IEFPdXRwdXRTdHJlYW0gOiBJVGhyaWZ0U3RyZWFtKTsKIGJlZ2luCiAgIGluaGVyaXRlZCBDcmVhdGU7CkBAIC04OTIsMTEgKzExMDEsMTYgQEAKICAgaW5oZXJpdGVkOwogZW5kOwogCitwcm9jZWR1cmUgVFN0cmVhbVRyYW5zcG9ydEltcGwuQ2xvc2U7CitiZWdpbgorICBGSW5wdXRTdHJlYW0gOj0gbmlsOworICBGT3V0cHV0U3RyZWFtIDo9IG5pbDsKK2VuZDsKKwogcHJvY2VkdXJlIFRTdHJlYW1UcmFuc3BvcnRJbXBsLkZsdXNoOwogYmVnaW4KLSAgaWYgRk91dHB1dFN0cmVhbSA9IG5pbCB0aGVuCi0gIGJlZ2luCi0gICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoIFRUcmFuc3BvcnRFeGNlcHRpb24uVEV4Y2VwdGlvblR5cGUuTm90T3BlbiwgJ0Nhbm5vdCBmbHVzaCBudWxsIG91dHB1dHN0cmVhbScgKTsKKyAgaWYgRk91dHB1dFN0cmVhbSA9IG5pbCB0aGVuIGJlZ2luCisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdDYW5ub3QgZmx1c2ggbnVsbCBvdXRwdXRzdHJlYW0nICk7CiAgIGVuZDsKIAogICBGT3V0cHV0U3RyZWFtLkZsdXNoOwpAQCAtOTE0LDcgKzExMjgsNyBAQAogCiBmdW5jdGlvbiBUU3RyZWFtVHJhbnNwb3J0SW1wbC5HZXRPdXRwdXRTdHJlYW06IElUaHJpZnRTdHJlYW07CiBiZWdpbgotICBSZXN1bHQgOj0gRklucHV0U3RyZWFtOworICBSZXN1bHQgOj0gRk91dHB1dFN0cmVhbTsKIGVuZDsKIAogcHJvY2VkdXJlIFRTdHJlYW1UcmFuc3BvcnRJbXBsLk9wZW47CkBAIC05MjIsMjMgKzExMzYsMjIgQEAKIAogZW5kOwogCi1mdW5jdGlvbiBUU3RyZWFtVHJhbnNwb3J0SW1wbC5SZWFkKHZhciBidWY6IFRCeXRlczsgb2ZmLCBsZW46IEludGVnZXIpOiBJbnRlZ2VyOworZnVuY3Rpb24gVFN0cmVhbVRyYW5zcG9ydEltcGwuUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsKIGJlZ2luCi0gIGlmIEZJbnB1dFN0cmVhbSA9IG5pbCB0aGVuCi0gIGJlZ2luCi0gICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoIFRUcmFuc3BvcnRFeGNlcHRpb24uVEV4Y2VwdGlvblR5cGUuTm90T3BlbiwgJ0Nhbm5vdCByZWFkIGZyb20gbnVsbCBpbnB1dHN0cmVhbScgKTsKKyAgaWYgRklucHV0U3RyZWFtID0gbmlsIHRoZW4gYmVnaW4KKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ0Nhbm5vdCByZWFkIGZyb20gbnVsbCBpbnB1dHN0cmVhbScgKTsKICAgZW5kOwotICBSZXN1bHQgOj0gRklucHV0U3RyZWFtLlJlYWQoIGJ1Ziwgb2ZmLCBsZW4gKTsKKworICBSZXN1bHQgOj0gRklucHV0U3RyZWFtLlJlYWQoIHBCdWYsYnVmbGVuLCBvZmYsIGxlbiApOwogZW5kOwogCi1wcm9jZWR1cmUgVFN0cmVhbVRyYW5zcG9ydEltcGwuV3JpdGUoY29uc3QgYnVmOiBUQnl0ZXM7IG9mZiwgbGVuOiBJbnRlZ2VyKTsKK3Byb2NlZHVyZSBUU3RyZWFtVHJhbnNwb3J0SW1wbC5Xcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZiwgbGVuIDogSW50ZWdlcik7CiBiZWdpbgotICBpZiBGT3V0cHV0U3RyZWFtID0gbmlsIHRoZW4KLSAgYmVnaW4KLSAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZSggVFRyYW5zcG9ydEV4Y2VwdGlvbi5URXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAnQ2Fubm90IHdyaXRlIHRvIG51bGwgb3V0cHV0c3RyZWFtJyApOworICBpZiBGT3V0cHV0U3RyZWFtID0gbmlsIHRoZW4gYmVnaW4KKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ0Nhbm5vdCB3cml0ZSB0byBudWxsIG91dHB1dHN0cmVhbScgKTsKICAgZW5kOwogCi0gIEZPdXRwdXRTdHJlYW0uV3JpdGUoIGJ1Ziwgb2ZmLCBsZW4gKTsKKyAgRk91dHB1dFN0cmVhbS5Xcml0ZSggcEJ1Ziwgb2ZmLCBsZW4gKTsKIGVuZDsKIAogeyBUQnVmZmVyZWRUcmFuc3BvcnRJbXBsIH0KQEAgLTk0OSwxMyArMTE2Miw3IEBACiAgIENyZWF0ZSggQVRyYW5zcG9ydCwgMTAyNCApOwogZW5kOwogCi1wcm9jZWR1cmUgVEJ1ZmZlcmVkVHJhbnNwb3J0SW1wbC5DbG9zZTsKLWJlZ2luCi0gIEZUcmFuc3BvcnQuQ2xvc2U7Ci1lbmQ7Ci0KLWNvbnN0cnVjdG9yIFRCdWZmZXJlZFRyYW5zcG9ydEltcGwuQ3JlYXRlKCBjb25zdCBBVHJhbnNwb3J0OiBJU3RyZWFtVHJhbnNwb3J0OwotICBBQnVmU2l6ZTogSW50ZWdlcik7Citjb25zdHJ1Y3RvciBUQnVmZmVyZWRUcmFuc3BvcnRJbXBsLkNyZWF0ZSggY29uc3QgQVRyYW5zcG9ydDogSVN0cmVhbVRyYW5zcG9ydDsgIEFCdWZTaXplOiBJbnRlZ2VyKTsKIGJlZ2luCiAgIGluaGVyaXRlZCBDcmVhdGU7CiAgIEZUcmFuc3BvcnQgOj0gQVRyYW5zcG9ydDsKQEAgLTk2MywxMCArMTE3MCwxNiBAQAogICBJbml0QnVmZmVyczsKIGVuZDsKIAorcHJvY2VkdXJlIFRCdWZmZXJlZFRyYW5zcG9ydEltcGwuQ2xvc2U7CitiZWdpbgorICBGVHJhbnNwb3J0LkNsb3NlOworICBGSW5wdXRCdWZmZXIgOj0gbmlsOworICBGT3V0cHV0QnVmZmVyIDo9IG5pbDsgIAorZW5kOworCiBwcm9jZWR1cmUgVEJ1ZmZlcmVkVHJhbnNwb3J0SW1wbC5GbHVzaDsKIGJlZ2luCi0gIGlmIEZPdXRwdXRCdWZmZXIgPD4gbmlsIHRoZW4KLSAgYmVnaW4KKyAgaWYgRk91dHB1dEJ1ZmZlciA8PiBuaWwgdGhlbiBiZWdpbgogICAgIEZPdXRwdXRCdWZmZXIuRmx1c2g7CiAgIGVuZDsKIGVuZDsKQEAgLTk4Myw1NCArMTE5Niw1MSBAQAogCiBwcm9jZWR1cmUgVEJ1ZmZlcmVkVHJhbnNwb3J0SW1wbC5Jbml0QnVmZmVyczsKIGJlZ2luCi0gIGlmIEZUcmFuc3BvcnQuSW5wdXRTdHJlYW0gPD4gbmlsIHRoZW4KLSAgYmVnaW4KKyAgaWYgRlRyYW5zcG9ydC5JbnB1dFN0cmVhbSA8PiBuaWwgdGhlbiBiZWdpbgogICAgIEZJbnB1dEJ1ZmZlciA6PSBUQnVmZmVyZWRTdHJlYW1JbXBsLkNyZWF0ZSggRlRyYW5zcG9ydC5JbnB1dFN0cmVhbSwgRkJ1ZlNpemUgKTsKICAgZW5kOwotICBpZiBGVHJhbnNwb3J0Lk91dHB1dFN0cmVhbSA8PiBuaWwgdGhlbgotICBiZWdpbgorICBpZiBGVHJhbnNwb3J0Lk91dHB1dFN0cmVhbSA8PiBuaWwgdGhlbiBiZWdpbgogICAgIEZPdXRwdXRCdWZmZXIgOj0gVEJ1ZmZlcmVkU3RyZWFtSW1wbC5DcmVhdGUoIEZUcmFuc3BvcnQuT3V0cHV0U3RyZWFtLCBGQnVmU2l6ZSApOwogICBlbmQ7CiBlbmQ7CiAKIHByb2NlZHVyZSBUQnVmZmVyZWRUcmFuc3BvcnRJbXBsLk9wZW47CiBiZWdpbgotICBGVHJhbnNwb3J0Lk9wZW4KKyAgRlRyYW5zcG9ydC5PcGVuOworICBJbml0QnVmZmVyczsgIC8vIHdlIG5lZWQgdG8gZ2V0IHRoZSBidWZmZXJzIHRvIG1hdGNoIEZUcmFuc3BvcnQgc3Vic3RyZWFtcyBhZ2FpbgogZW5kOwogCi1mdW5jdGlvbiBUQnVmZmVyZWRUcmFuc3BvcnRJbXBsLlJlYWQodmFyIGJ1ZjogVEJ5dGVzOyBvZmYsIGxlbjogSW50ZWdlcik6IEludGVnZXI7CitmdW5jdGlvbiBUQnVmZmVyZWRUcmFuc3BvcnRJbXBsLlJlYWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7CiBiZWdpbgogICBSZXN1bHQgOj0gMDsKLSAgaWYgRklucHV0QnVmZmVyIDw+IG5pbCB0aGVuCi0gIGJlZ2luCi0gICAgUmVzdWx0IDo9IEZJbnB1dEJ1ZmZlci5SZWFkKCBidWYsIG9mZiwgbGVuICk7CisgIGlmIEZJbnB1dEJ1ZmZlciA8PiBuaWwgdGhlbiBiZWdpbgorICAgIFJlc3VsdCA6PSBGSW5wdXRCdWZmZXIuUmVhZCggcEJ1ZixidWZsZW4sIG9mZiwgbGVuICk7CiAgIGVuZDsKIGVuZDsKIAotcHJvY2VkdXJlIFRCdWZmZXJlZFRyYW5zcG9ydEltcGwuV3JpdGUoY29uc3QgYnVmOiBUQnl0ZXM7IG9mZiwgbGVuOiBJbnRlZ2VyKTsKK3Byb2NlZHVyZSBUQnVmZmVyZWRUcmFuc3BvcnRJbXBsLldyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2ZmLCBsZW4gOiBJbnRlZ2VyKTsKIGJlZ2luCi0gIGlmIEZPdXRwdXRCdWZmZXIgPD4gbmlsIHRoZW4KLSAgYmVnaW4KLSAgICBGT3V0cHV0QnVmZmVyLldyaXRlKCBidWYsIG9mZiwgbGVuICk7CisgIGlmIEZPdXRwdXRCdWZmZXIgPD4gbmlsIHRoZW4gYmVnaW4KKyAgICBGT3V0cHV0QnVmZmVyLldyaXRlKCBwQnVmLCBvZmYsIGxlbiApOwogICBlbmQ7CiBlbmQ7CiAKIHsgVEZyYW1lZFRyYW5zcG9ydEltcGwgfQogCi17JElGIENvbXBpbGVyVmVyc2lvbiA8IDIxLjB9Cit7JElGREVGIEhBVkVfQ0xBU1NfQ1RPUn0KK2NsYXNzIGNvbnN0cnVjdG9yIFRGcmFtZWRUcmFuc3BvcnRJbXBsLkNyZWF0ZTsKK2JlZ2luCisgIFNldExlbmd0aCggRkhlYWRlcl9EdW1teSwgRkhlYWRlclNpemUpOworICBGaWxsQ2hhciggRkhlYWRlcl9EdW1teVswXSwgTGVuZ3RoKCBGSGVhZGVyX0R1bW15KSAqIFNpemVPZiggQnl0ZSApLCAwKTsKK2VuZDsKK3skRUxTRX0KIHByb2NlZHVyZSBURnJhbWVkVHJhbnNwb3J0SW1wbF9Jbml0aWFsaXplOwogYmVnaW4KICAgU2V0TGVuZ3RoKCBURnJhbWVkVHJhbnNwb3J0SW1wbC5GSGVhZGVyX0R1bW15LCBURnJhbWVkVHJhbnNwb3J0SW1wbC5GSGVhZGVyU2l6ZSk7CiAgIEZpbGxDaGFyKCBURnJhbWVkVHJhbnNwb3J0SW1wbC5GSGVhZGVyX0R1bW15WzBdLAogICAgIExlbmd0aCggVEZyYW1lZFRyYW5zcG9ydEltcGwuRkhlYWRlcl9EdW1teSkgKiBTaXplT2YoIEJ5dGUgKSwgMCk7CiBlbmQ7Ci17JEVMU0V9Ci1jbGFzcyBjb25zdHJ1Y3RvciBURnJhbWVkVHJhbnNwb3J0SW1wbC5DcmVhdGU7Ci1iZWdpbgotICBTZXRMZW5ndGgoIEZIZWFkZXJfRHVtbXksIEZIZWFkZXJTaXplKTsKLSAgRmlsbENoYXIoIEZIZWFkZXJfRHVtbXlbMF0sIExlbmd0aCggRkhlYWRlcl9EdW1teSkgKiBTaXplT2YoIEJ5dGUgKSwgMCk7Ci1lbmQ7Ci17JElGRU5EfQoreyRFTkRJRn0KIAogY29uc3RydWN0b3IgVEZyYW1lZFRyYW5zcG9ydEltcGwuQ3JlYXRlOwogYmVnaW4KQEAgLTEwNjYsMTUgKzEyNzYsMTMgQEAKIGJlZ2luCiAgIGxlbiA6PSBGV3JpdGVCdWZmZXIuU2l6ZTsKICAgU2V0TGVuZ3RoKCBidWYsIGxlbik7Ci0gIGlmIGxlbiA+IDAgdGhlbgotICBiZWdpbgorICBpZiBsZW4gPiAwIHRoZW4gYmVnaW4KICAgICBTeXN0ZW0uTW92ZSggRldyaXRlQnVmZmVyLk1lbW9yeV4sIGJ1ZlswXSwgbGVuICk7CiAgIGVuZDsKIAogICBkYXRhX2xlbiA6PSBsZW4gLSBGSGVhZGVyU2l6ZTsKLSAgaWYgKGRhdGFfbGVuIDwgMCkgdGhlbgotICBiZWdpbgotICAgIHJhaXNlIEV4Y2VwdGlvbi5DcmVhdGUoICdURnJhbWVkVHJhbnNwb3J0LkZsdXNoOiBkYXRhX2xlbiA8IDAnICk7CisgIGlmIChkYXRhX2xlbiA8IDApIHRoZW4gYmVnaW4KKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoJ1RGcmFtZWRUcmFuc3BvcnQuRmx1c2g6IGRhdGFfbGVuIDwgMCcgKTsKICAgZW5kOwogCiAgIEluaXRXcml0ZUJ1ZmZlcjsKQEAgLTExMTAsMjUgKzEzMTgsMjUgQEAKICAgRlRyYW5zcG9ydC5PcGVuOwogZW5kOwogCi1mdW5jdGlvbiBURnJhbWVkVHJhbnNwb3J0SW1wbC5SZWFkKHZhciBidWY6IFRCeXRlczsgb2ZmLCBsZW46IEludGVnZXIpOiBJbnRlZ2VyOwotdmFyCi0gIGdvdCA6IEludGVnZXI7CitmdW5jdGlvbiBURnJhbWVkVHJhbnNwb3J0SW1wbC5SZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOwordmFyIHBUbXAgOiBQQnl0ZTsKIGJlZ2luCi0gIGlmIEZSZWFkQnVmZmVyIDw+IG5pbCB0aGVuCi0gIGJlZ2luCi0gICAgaWYgbGVuID4gMAotICAgIHRoZW4gZ290IDo9IEZSZWFkQnVmZmVyLlJlYWQoIFBvaW50ZXIoQGJ1ZltvZmZdKV4sIGxlbiApCi0gICAgZWxzZSBnb3QgOj0gMDsKLSAgICBpZiBnb3QgPiAwIHRoZW4KLSAgICBiZWdpbgotICAgICAgUmVzdWx0IDo9IGdvdDsKKyAgaWYgbGVuID4gKGJ1Zmxlbi1vZmYpCisgIHRoZW4gbGVuIDo9IGJ1Zmxlbi1vZmY7CisKKyAgcFRtcCA6PSBwQnVmOworICBJbmMoIHBUbXAsIG9mZik7CisKKyAgaWYgKEZSZWFkQnVmZmVyIDw+IG5pbCkgYW5kIChsZW4gPiAwKSB0aGVuIGJlZ2luCisgICAgcmVzdWx0IDo9IEZSZWFkQnVmZmVyLlJlYWQoIHBUbXBeLCBsZW4pOworICAgIGlmIHJlc3VsdCA+IDAgdGhlbiBiZWdpbgogICAgICAgRXhpdDsKICAgICBlbmQ7CiAgIGVuZDsKIAogICBSZWFkRnJhbWU7CiAgIGlmIGxlbiA+IDAKLSAgdGhlbiBSZXN1bHQgOj0gRlJlYWRCdWZmZXIuUmVhZCggUG9pbnRlcihAYnVmW29mZl0pXiwgbGVuKQorICB0aGVuIFJlc3VsdCA6PSBGUmVhZEJ1ZmZlci5SZWFkKCBwVG1wXiwgbGVuKQogICBlbHNlIFJlc3VsdCA6PSAwOwogZW5kOwogCkBAIC0xMTQ5LDE0ICsxMzU3LDIwIEBACiAgIEZUcmFuc3BvcnQuUmVhZEFsbCggYnVmZiwgMCwgc2l6ZSApOwogICBGUmVhZEJ1ZmZlci5GcmVlOwogICBGUmVhZEJ1ZmZlciA6PSBUTWVtb3J5U3RyZWFtLkNyZWF0ZTsKLSAgRlJlYWRCdWZmZXIuV3JpdGUoIFBvaW50ZXIoQGJ1ZmZbMF0pXiwgc2l6ZSApOworICBpZiBMZW5ndGgoYnVmZikgPiAwCisgIHRoZW4gRlJlYWRCdWZmZXIuV3JpdGUoIFBvaW50ZXIoQGJ1ZmZbMF0pXiwgc2l6ZSApOwogICBGUmVhZEJ1ZmZlci5Qb3NpdGlvbiA6PSAwOwogZW5kOwogCi1wcm9jZWR1cmUgVEZyYW1lZFRyYW5zcG9ydEltcGwuV3JpdGUoY29uc3QgYnVmOiBUQnl0ZXM7IG9mZiwgbGVuOiBJbnRlZ2VyKTsKK3Byb2NlZHVyZSBURnJhbWVkVHJhbnNwb3J0SW1wbC5Xcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZiwgbGVuIDogSW50ZWdlcik7Cit2YXIgcFRtcCA6IFBCeXRlOwogYmVnaW4KLSAgaWYgbGVuID4gMAotICB0aGVuIEZXcml0ZUJ1ZmZlci5Xcml0ZSggUG9pbnRlcihAYnVmW29mZl0pXiwgbGVuICk7CisgIGlmIGxlbiA+IDAgdGhlbiBiZWdpbgorICAgIHBUbXAgOj0gcEJ1ZjsKKyAgICBJbmMoIHBUbXAsIG9mZik7CisKKyAgICBGV3JpdGVCdWZmZXIuV3JpdGUoIHBUbXBeLCBsZW4gKTsKKyAgZW5kOwogZW5kOwogCiB7IFRGcmFtZWRUcmFuc3BvcnQuVEZhY3RvcnkgfQpAQCAtMTE3MywxMiArMTM4NywyNSBAQAogICBGVGNwQ2xpZW50LkNsb3NlOwogZW5kOwogCit7JElGREVGIE9MRF9TT0NLRVRTfQogY29uc3RydWN0b3IgVFRjcFNvY2tldFN0cmVhbUltcGwuQ3JlYXRlKCBjb25zdCBBVGNwQ2xpZW50OiBUQ3VzdG9tSXBDbGllbnQ7IGNvbnN0IGFUaW1lb3V0IDogSW50ZWdlcik7CiBiZWdpbgogICBpbmhlcml0ZWQgQ3JlYXRlOwogICBGVGNwQ2xpZW50IDo9IEFUY3BDbGllbnQ7CiAgIEZUaW1lb3V0IDo9IGFUaW1lb3V0OwogZW5kOworeyRFTFNFfQorY29uc3RydWN0b3IgVFRjcFNvY2tldFN0cmVhbUltcGwuQ3JlYXRlKCBjb25zdCBBVGNwQ2xpZW50OiBUU29ja2V0OyBjb25zdCBhVGltZW91dCA6IExvbmd3b3JkKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZUY3BDbGllbnQgOj0gQVRjcENsaWVudDsKKyAgaWYgYVRpbWVvdXQgPSAwIHRoZW4KKyAgICBGVGNwQ2xpZW50LlJlY3ZUaW1lb3V0IDo9IFNMRUVQX1RJTUUKKyAgZWxzZQorICAgIEZUY3BDbGllbnQuUmVjdlRpbWVvdXQgOj0gYVRpbWVvdXQ7CisgIEZUY3BDbGllbnQuU2VuZFRpbWVvdXQgOj0gYVRpbWVvdXQ7CitlbmQ7Cit7JEVORElGfQogCiBwcm9jZWR1cmUgVFRjcFNvY2tldFN0cmVhbUltcGwuRmx1c2g7CiBiZWdpbgpAQCAtMTE4Nyw3ICsxNDE0LDExIEBACiAKIGZ1bmN0aW9uIFRUY3BTb2NrZXRTdHJlYW1JbXBsLklzT3BlbjogQm9vbGVhbjsKIGJlZ2luCit7JElGREVGIE9MRF9TT0NLRVRTfQogICBSZXN1bHQgOj0gRlRjcENsaWVudC5BY3RpdmU7Cit7JEVMU0V9CisgIFJlc3VsdCA6PSBGVGNwQ2xpZW50LklzT3BlbjsKK3skRU5ESUZ9CiBlbmQ7CiAKIHByb2NlZHVyZSBUVGNwU29ja2V0U3RyZWFtSW1wbC5PcGVuOwpAQCAtMTE5Niw2ICsxNDI3LDcgQEAKIGVuZDsKIAogCit7JElGREVGIE9MRF9TT0NLRVRTfQogZnVuY3Rpb24gVFRjcFNvY2tldFN0cmVhbUltcGwuU2VsZWN0KCBSZWFkUmVhZHksIFdyaXRlUmVhZHksIEV4Y2VwdEZsYWc6IFBCb29sZWFuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lT3V0OiBJbnRlZ2VyOyB2YXIgd3NhRXJyb3IgOiBJbnRlZ2VyKTogSW50ZWdlcjsKIHZhcgpAQCAtMTIxNiw1MCArMTQ0OCw1NSBAQAogCiAgIHNvY2tldCA6PSBGVGNwQ2xpZW50LkhhbmRsZTsKIAotICBpZiBBc3NpZ25lZChSZWFkUmVhZHkpIHRoZW4KLSAgYmVnaW4KKyAgaWYgQXNzaWduZWQoUmVhZFJlYWR5KSB0aGVuIGJlZ2luCiAgICAgUmVhZEZkc3B0ciA6PSBAUmVhZEZkczsKICAgICBGRF9aRVJPKFJlYWRGZHMpOwogICAgIEZEX1NFVChzb2NrZXQsIFJlYWRGZHMpOwogICBlbmQKLSAgZWxzZQorICBlbHNlIGJlZ2luCiAgICAgUmVhZEZkc3B0ciA6PSBuaWw7CisgIGVuZDsKIAotICBpZiBBc3NpZ25lZChXcml0ZVJlYWR5KSB0aGVuCi0gIGJlZ2luCisgIGlmIEFzc2lnbmVkKFdyaXRlUmVhZHkpIHRoZW4gYmVnaW4KICAgICBXcml0ZUZkc3B0ciA6PSBAV3JpdGVGZHM7CiAgICAgRkRfWkVSTyhXcml0ZUZkcyk7CiAgICAgRkRfU0VUKHNvY2tldCwgV3JpdGVGZHMpOwogICBlbmQKLSAgZWxzZQorICBlbHNlIGJlZ2luCiAgICAgV3JpdGVGZHNwdHIgOj0gbmlsOworICBlbmQ7CiAKLSAgaWYgQXNzaWduZWQoRXhjZXB0RmxhZykgdGhlbgotICBiZWdpbgorICBpZiBBc3NpZ25lZChFeGNlcHRGbGFnKSB0aGVuIGJlZ2luCiAgICAgRXhjZXB0RmRzcHRyIDo9IEBFeGNlcHRGZHM7CiAgICAgRkRfWkVSTyhFeGNlcHRGZHMpOwogICAgIEZEX1NFVChzb2NrZXQsIEV4Y2VwdEZkcyk7CiAgIGVuZAotICBlbHNlCisgIGVsc2UgYmVnaW4KICAgICBFeGNlcHRGZHNwdHIgOj0gbmlsOworICBlbmQ7CiAKLSAgaWYgVGltZU91dCA+PSAwIHRoZW4KLSAgYmVnaW4KKyAgaWYgVGltZU91dCA+PSAwIHRoZW4gYmVnaW4KICAgICB0di50dl9zZWMgOj0gVGltZU91dCBkaXYgMTAwMDsKICAgICB0di50dl91c2VjIDo9ICAxMDAwICogKFRpbWVPdXQgbW9kIDEwMDApOwogICAgIFRpbWVwdHIgOj0gQHR2OwogICBlbmQKLSAgZWxzZQorICBlbHNlIGJlZ2luCiAgICAgVGltZXB0ciA6PSBuaWw7ICAvLyB3YWl0IGZvcmV2ZXIKKyAgZW5kOwogCiAgIHdzYUVycm9yIDo9IDA7CiAgIHRyeQoteyRJRkRFRiBNU1dJTkRPV1N9Ci0gICAgcmVzdWx0IDo9IFdpblNvY2suc2VsZWN0KHNvY2tldCArIDEsIFJlYWRGZHNwdHIsIFdyaXRlRmRzcHRyLCBFeGNlcHRGZHNwdHIsIFRpbWVwdHIpOwoteyRFTkRJRn0KLXskSUZERUYgTElOVVh9Ci0gICAgcmVzdWx0IDo9IExpYmMuc2VsZWN0KHNvY2tldCArIDEsIFJlYWRGZHNwdHIsIFdyaXRlRmRzcHRyLCBFeGNlcHRGZHNwdHIsIFRpbWVwdHIpOwoteyRFTkRJRn0KKyAgICB7JElGREVGIE1TV0lORE9XU30KKyAgICAgIHskSUZERUYgT0xEX1VOSVRfTkFNRVN9CisgICAgICByZXN1bHQgOj0gV2luU29jay5zZWxlY3QoICAgICAgICBzb2NrZXQgKyAxLCBSZWFkRmRzcHRyLCBXcml0ZUZkc3B0ciwgRXhjZXB0RmRzcHRyLCBUaW1lcHRyKTsKKyAgICAgIHskRUxTRX0KKyAgICAgIHJlc3VsdCA6PSBXaW5hcGkuV2luU29jay5zZWxlY3QoIHNvY2tldCArIDEsIFJlYWRGZHNwdHIsIFdyaXRlRmRzcHRyLCBFeGNlcHRGZHNwdHIsIFRpbWVwdHIpOworICAgICAgeyRFTkRJRn0KKyAgICB7JEVORElGfQorICAgIHskSUZERUYgTElOVVh9CisgICAgICByZXN1bHQgOj0gTGliYy5zZWxlY3QoICAgICAgICAgICBzb2NrZXQgKyAxLCBSZWFkRmRzcHRyLCBXcml0ZUZkc3B0ciwgRXhjZXB0RmRzcHRyLCBUaW1lcHRyKTsKKyAgICB7JEVORElGfQorCQogICAgIGlmIHJlc3VsdCA9IFNPQ0tFVF9FUlJPUgogICAgIHRoZW4gd3NhRXJyb3IgOj0gV1NBR2V0TGFzdEVycm9yOwogCkBAIC0xMjY4LDE4ICsxNTA1LDI0IEBACiAgIGVuZDsKIAogICBpZiBBc3NpZ25lZChSZWFkUmVhZHkpIHRoZW4KLSAgICBSZWFkUmVhZHleIDo9IEZEX0lTU0VUKHNvY2tldCwgUmVhZEZkcyk7CisgICBSZWFkUmVhZHleIDo9IEZEX0lTU0VUKHNvY2tldCwgUmVhZEZkcyk7CisgICAKICAgaWYgQXNzaWduZWQoV3JpdGVSZWFkeSkgdGhlbgogICAgIFdyaXRlUmVhZHleIDo9IEZEX0lTU0VUKHNvY2tldCwgV3JpdGVGZHMpOworICAKICAgaWYgQXNzaWduZWQoRXhjZXB0RmxhZykgdGhlbgogICAgIEV4Y2VwdEZsYWdeIDo9IEZEX0lTU0VUKHNvY2tldCwgRXhjZXB0RmRzKTsKIGVuZDsKK3skRU5ESUZ9CiAKK3skSUZERUYgT0xEX1NPQ0tFVFN9CiBmdW5jdGlvbiBUVGNwU29ja2V0U3RyZWFtSW1wbC5XYWl0Rm9yRGF0YSggVGltZU91dCA6IEludGVnZXI7IHBCdWYgOiBQb2ludGVyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2lyZWRCeXRlcyA6IEludGVnZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHdzYUVycm9yLCBieXRlc1JlYWR5IDogSW50ZWdlcik6IFRXYWl0Rm9yRGF0YTsKIHZhciBiQ2FuUmVhZCwgYkVycm9yIDogQm9vbGVhbjsKICAgICByZXR2YWwgOiBJbnRlZ2VyOworY29uc3QgCisgIE1TR19QRUVLID0geyRJRkRFRiBPTERfVU5JVF9OQU1FU30gV2luU29jay5NU0dfUEVFSyAgeyRFTFNFfSBXaW5hcGkuV2luU29jay5NU0dfUEVFSyAgeyRFTkRJRn07CiBiZWdpbgogICBieXRlc1JlYWR5IDo9IDA7CiAKQEAgLTEyOTUsNyArMTUzOCw4IEBACiAKICAgLy8gcmVjdigpIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWNlaXZlZCwgb3IgLTEgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCiAgIC8vIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSAwIHdoZW4gdGhlIHBlZXIgaGFzIHBlcmZvcm1lZCBhbiBvcmRlcmx5IHNodXRkb3duLgotICByZXR2YWwgOj0gcmVjdiggRlRjcENsaWVudC5IYW5kbGUsIHBCdWZeLCBEZXNpcmVkQnl0ZXMsIFdpblNvY2suTVNHX1BFRUspOworICAKKyAgcmV0dmFsIDo9IHJlY3YoIEZUY3BDbGllbnQuSGFuZGxlLCBwQnVmXiwgRGVzaXJlZEJ5dGVzLCBNU0dfUEVFSyk7CiAgIGlmIHJldHZhbCA8PSAwCiAgIHRoZW4gRXhpdCggVFdhaXRGb3JEYXRhLndmZF9FcnJvcik7CiAKQEAgLTEzMDMsNzIgKzE1NDcsODYgQEAKICAgYnl0ZXNSZWFkeSA6PSBNaW4oIHJldHZhbCwgRGVzaXJlZEJ5dGVzKTsKICAgcmVzdWx0IDo9IFRXYWl0Rm9yRGF0YS53ZmRfSGF2ZURhdGE7CiBlbmQ7Cit7JEVORElGfQogCi1mdW5jdGlvbiBUVGNwU29ja2V0U3RyZWFtSW1wbC5SZWFkKHZhciBidWZmZXI6IFRCeXRlczsgb2Zmc2V0LCBjb3VudDogSW50ZWdlcik6IEludGVnZXI7Cit7JElGREVGIE9MRF9TT0NLRVRTfQorZnVuY3Rpb24gVFRjcFNvY2tldFN0cmVhbUltcGwuUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOworLy8gb2xkIHNvY2tldHMgdmVyc2lvbgogdmFyIHdmZCA6IFRXYWl0Rm9yRGF0YTsKLSAgICB3c2FFcnJvciwgbkJ5dGVzIDogSW50ZWdlcjsKLSAgICBwRGVzdCA6IFBCeXRlOwotY29uc3QKLSAgU0xFRVBfVElNRSA9IDIwMDsKKyAgICB3c2FFcnJvciwKKyAgICBtc2VjcyA6IEludGVnZXI7CisgICAgbkJ5dGVzIDogSW50ZWdlcjsKKyAgICBwVG1wIDogUEJ5dGU7CiBiZWdpbgogICBpbmhlcml0ZWQ7CiAKKyAgaWYgRlRpbWVvdXQgPiAwCisgIHRoZW4gbXNlY3MgOj0gRlRpbWVvdXQKKyAgZWxzZSBtc2VjcyA6PSBERUZBVUxUX1RIUklGVF9USU1FT1VUOworCiAgIHJlc3VsdCA6PSAwOwotICBwRGVzdCA6PSBQb2ludGVyKEBidWZmZXJbb2Zmc2V0XSk7CisgIHBUbXAgICA6PSBwQnVmOworICBJbmMoIHBUbXAsIG9mZnNldCk7CiAgIHdoaWxlIGNvdW50ID4gMCBkbyBiZWdpbgogCiAgICAgd2hpbGUgVFJVRSBkbyBiZWdpbgotICAgICAgaWYgRlRpbWVvdXQgPiAwCi0gICAgICB0aGVuIHdmZCA6PSBXYWl0Rm9yRGF0YSggRlRpbWVvdXQsICAgcERlc3QsIGNvdW50LCB3c2FFcnJvciwgbkJ5dGVzKQotICAgICAgZWxzZSB3ZmQgOj0gV2FpdEZvckRhdGEoIFNMRUVQX1RJTUUsIHBEZXN0LCBjb3VudCwgd3NhRXJyb3IsIG5CeXRlcyk7Ci0KKyAgICAgIHdmZCA6PSBXYWl0Rm9yRGF0YSggbXNlY3MsIHBUbXAsIGNvdW50LCB3c2FFcnJvciwgbkJ5dGVzKTsKICAgICAgIGNhc2Ugd2ZkIG9mCi0gICAgICAgIFRXYWl0Rm9yRGF0YS53ZmRfRXJyb3IgICAgOiAgRXhpdCgwKTsKKyAgICAgICAgVFdhaXRGb3JEYXRhLndmZF9FcnJvciAgICA6ICBFeGl0OwogICAgICAgICBUV2FpdEZvckRhdGEud2ZkX0hhdmVEYXRhIDogIEJyZWFrOwogICAgICAgICBUV2FpdEZvckRhdGEud2ZkX1RpbWVvdXQgIDogIGJlZ2luCi0gICAgICAgICAgaWYgKEZUaW1lb3V0ID4gMCkKLSAgICAgICAgICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24uQ3JlYXRlKCBUVHJhbnNwb3J0RXhjZXB0aW9uLlRFeGNlcHRpb25UeXBlLlRpbWVkT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c0Vycm9yTWVzc2FnZShDYXJkaW5hbCh3c2FFcnJvcikpKTsKKyAgICAgICAgICBpZiAoRlRpbWVvdXQgPSAwKQorICAgICAgICAgIHRoZW4gRXhpdAorICAgICAgICAgIGVsc2UgYmVnaW4KKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25UaW1lZE91dC5DcmVhdGUoU3lzRXJyb3JNZXNzYWdlKENhcmRpbmFsKHdzYUVycm9yKSkpOworCisgICAgICAgICAgZW5kOwogICAgICAgICBlbmQ7CiAgICAgICBlbHNlCiAgICAgICAgIEFTU0VSVCggRkFMU0UpOwogICAgICAgZW5kOwogICAgIGVuZDsKIAorICAgIC8vIHJlZHVjZSB0aGUgdGltZW91dCBvbmNlIHdlIGdvdCBkYXRhCisgICAgaWYgRlRpbWVvdXQgPiAwCisgICAgdGhlbiBtc2VjcyA6PSBGVGltZW91dCBkaXYgMTAKKyAgICBlbHNlIG1zZWNzIDo9IERFRkFVTFRfVEhSSUZUX1RJTUVPVVQgZGl2IDEwOworICAgIG1zZWNzIDo9IE1heCggbXNlY3MsIDIwMCk7CisKICAgICBBU1NFUlQoIG5CeXRlcyA8PSBjb3VudCk7Ci0gICAgbkJ5dGVzIDo9IEZUY3BDbGllbnQuUmVjZWl2ZUJ1ZiggcERlc3ReLCBuQnl0ZXMpOwotICAgIEluYyggcERlc3QsIG5CeXRlcyk7CisgICAgbkJ5dGVzIDo9IEZUY3BDbGllbnQuUmVjZWl2ZUJ1ZiggcFRtcF4sIG5CeXRlcyk7CisgICAgSW5jKCBwVG1wLCBuQnl0ZXMpOwogICAgIERlYyggY291bnQsIG5CeXRlcyk7CiAgICAgSW5jKCByZXN1bHQsIG5CeXRlcyk7CiAgIGVuZDsKIGVuZDsKIAogZnVuY3Rpb24gVFRjcFNvY2tldFN0cmVhbUltcGwuVG9BcnJheTogVEJ5dGVzOwotdmFyCi0gIGxlbiA6IEludGVnZXI7CisvLyBvbGQgc29ja2V0cyB2ZXJzaW9uCit2YXIgbGVuIDogSW50ZWdlcjsKIGJlZ2luCiAgIGxlbiA6PSAwOwotICBpZiBJc09wZW4gdGhlbgotICBiZWdpbgorICBpZiBJc09wZW4gdGhlbiBiZWdpbgogICAgIGxlbiA6PSBGVGNwQ2xpZW50LkJ5dGVzUmVjZWl2ZWQ7CiAgIGVuZDsKIAogICBTZXRMZW5ndGgoIFJlc3VsdCwgbGVuICk7CiAKLSAgaWYgbGVuID4gMCB0aGVuCi0gIGJlZ2luCisgIGlmIGxlbiA+IDAgdGhlbiBiZWdpbgogICAgIEZUY3BDbGllbnQuUmVjZWl2ZUJ1ZiggUG9pbnRlcihAUmVzdWx0WzBdKV4sIGxlbik7CiAgIGVuZDsKIGVuZDsKIAotcHJvY2VkdXJlIFRUY3BTb2NrZXRTdHJlYW1JbXBsLldyaXRlKGNvbnN0IGJ1ZmZlcjogVEJ5dGVzOyBvZmZzZXQsIGNvdW50OiBJbnRlZ2VyKTsKK3Byb2NlZHVyZSBUVGNwU29ja2V0U3RyZWFtSW1wbC5Xcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZnNldCwgY291bnQ6IEludGVnZXIpOworLy8gb2xkIHNvY2tldHMgdmVyc2lvbgogdmFyIGJDYW5Xcml0ZSwgYkVycm9yIDogQm9vbGVhbjsKICAgICByZXR2YWwsIHdzYUVycm9yIDogSW50ZWdlcjsKKyAgICBwVG1wIDogUEJ5dGU7CiBiZWdpbgogICBpbmhlcml0ZWQ7CiAKICAgaWYgbm90IEZUY3BDbGllbnQuQWN0aXZlCi0gIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoIFRUcmFuc3BvcnRFeGNlcHRpb24uVEV4Y2VwdGlvblR5cGUuTm90T3Blbik7CisgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdub3Qgb3BlbicpOwogCiAgIC8vIFRoZSBzZWxlY3QgZnVuY3Rpb24gcmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIHNvY2tldCBoYW5kbGVzIHRoYXQgYXJlIHJlYWR5CiAgIC8vIGFuZCBjb250YWluZWQgaW4gdGhlIGZkX3NldCBzdHJ1Y3R1cmVzLCB6ZXJvIGlmIHRoZSB0aW1lIGxpbWl0IGV4cGlyZWQsCkBAIC0xMzc2LDE2ICsxNjM0LDc2IEBACiAgIC8vIFdTQUdldExhc3RFcnJvciBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSBhIHNwZWNpZmljIGVycm9yIGNvZGUuCiAgIHJldHZhbCA6PSBTZWxmLlNlbGVjdCggbmlsLCBAYkNhbldyaXRlLCBAYkVycm9yLCBGVGltZU91dCwgd3NhRXJyb3IpOwogICBpZiByZXR2YWwgPSBTT0NLRVRfRVJST1IKLSAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZSggVFRyYW5zcG9ydEV4Y2VwdGlvbi5URXhjZXB0aW9uVHlwZS5Vbmtub3duLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXNFcnJvck1lc3NhZ2UoQ2FyZGluYWwod3NhRXJyb3IpKSk7Ci0gIGlmIChyZXR2YWwgPSAwKQotICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24uQ3JlYXRlKCBUVHJhbnNwb3J0RXhjZXB0aW9uLlRFeGNlcHRpb25UeXBlLlRpbWVkT3V0KTsKLSAgaWYgYkVycm9yIG9yIG5vdCBiQ2FuV3JpdGUKLSAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZSggVFRyYW5zcG9ydEV4Y2VwdGlvbi5URXhjZXB0aW9uVHlwZS5Vbmtub3duKTsKKyAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoU3lzRXJyb3JNZXNzYWdlKENhcmRpbmFsKHdzYUVycm9yKSkpOwogCi0gIEZUY3BDbGllbnQuU2VuZEJ1ZiggUG9pbnRlcihAYnVmZmVyW29mZnNldF0pXiwgY291bnQpOworICBpZiAocmV0dmFsID0gMCkKKyAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVGltZWRPdXQuQ3JlYXRlKCd0aW1lZCBvdXQnKTsKKworICBpZiBiRXJyb3Igb3Igbm90IGJDYW5Xcml0ZQorICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Vbmtub3duLkNyZWF0ZSgndW5rbm93biBlcnJvcicpOworCisgIHBUbXAgOj0gcEJ1ZjsKKyAgSW5jKCBwVG1wLCBvZmZzZXQpOworICBGVGNwQ2xpZW50LlNlbmRCdWYoIHBUbXBeLCBjb3VudCk7CiBlbmQ7CiAKK3skRUxTRX0KKworZnVuY3Rpb24gVFRjcFNvY2tldFN0cmVhbUltcGwuUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOworLy8gbmV3IHNvY2tldHMgdmVyc2lvbgordmFyIG5CeXRlcyA6IEludGVnZXI7CisgICAgcFRtcCA6IFBCeXRlOworYmVnaW4KKyAgaW5oZXJpdGVkOworCisgIHJlc3VsdCA6PSAwOworICBwVG1wICAgOj0gcEJ1ZjsKKyAgSW5jKCBwVG1wLCBvZmZzZXQpOworICB3aGlsZSBjb3VudCA+IDAgZG8gYmVnaW4KKyAgICBuQnl0ZXMgOj0gRlRjcENsaWVudC5SZWFkKCBwVG1wXiwgY291bnQpOworICAgIGlmIG5CeXRlcyA9IDAgdGhlbiBFeGl0OworICAgIEluYyggcFRtcCwgbkJ5dGVzKTsKKyAgICBEZWMoIGNvdW50LCBuQnl0ZXMpOworICAgIEluYyggcmVzdWx0LCBuQnl0ZXMpOworICBlbmQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRUY3BTb2NrZXRTdHJlYW1JbXBsLlRvQXJyYXk6IFRCeXRlczsKKy8vIG5ldyBzb2NrZXRzIHZlcnNpb24KK3ZhciBsZW4gOiBJbnRlZ2VyOworYmVnaW4KKyAgbGVuIDo9IDA7CisgIHRyeQorICAgIGlmIEZUY3BDbGllbnQuUGVlayB0aGVuCisgICAgICByZXBlYXQKKyAgICAgICAgU2V0TGVuZ3RoKFJlc3VsdCwgTGVuZ3RoKFJlc3VsdCkgKyAxMDI0KTsKKyAgICAgICAgbGVuIDo9IEZUY3BDbGllbnQuUmVhZChSZXN1bHRbTGVuZ3RoKFJlc3VsdCkgLSAxMDI0XSwgMTAyNCk7CisgICAgICB1bnRpbCBsZW4gPCAxMDI0OworICBleGNlcHQKKyAgICBvbiBUVHJhbnNwb3J0RXhjZXB0aW9uIGRvIGJlZ2luIHsgZG9uJ3QgYWxsb3cgZGVmYXVsdCBleGNlcHRpb25zIH0gZW5kOworICAgIGVsc2UgcmFpc2U7CisgIGVuZDsKKyAgaWYgbGVuID4gMCB0aGVuCisgICAgU2V0TGVuZ3RoKFJlc3VsdCwgTGVuZ3RoKFJlc3VsdCkgLSAxMDI0ICsgbGVuKTsKK2VuZDsKKworcHJvY2VkdXJlIFRUY3BTb2NrZXRTdHJlYW1JbXBsLldyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2Zmc2V0LCBjb3VudDogSW50ZWdlcik7CisvLyBuZXcgc29ja2V0cyB2ZXJzaW9uCit2YXIgcFRtcCA6IFBCeXRlOworYmVnaW4KKyAgaW5oZXJpdGVkOworCisgIGlmIG5vdCBGVGNwQ2xpZW50LklzT3BlbgorICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnbm90IG9wZW4nKTsKKworICBwVG1wIDo9IHBCdWY7CisgIEluYyggcFRtcCwgb2Zmc2V0KTsKKyAgRlRjcENsaWVudC5Xcml0ZSggcFRtcF4sIGNvdW50KTsKK2VuZDsKKworeyRFTkRJRn0KKworCiB7JElGIENvbXBpbGVyVmVyc2lvbiA8IDIxLjB9CiBpbml0aWFsaXphdGlvbgogYmVnaW4KZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5VdGlscy5wYXMgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuVXRpbHMucGFzCmluZGV4IDE1ZWEzNmYuLjdlNTc4NjMgMTAwNjQ0Ci0tLSBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5VdGlscy5wYXMKKysrIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlV0aWxzLnBhcwpAQCAtMjEsOCArMjEsMTQgQEAKIAogaW50ZXJmYWNlCiAKK3skSSBUaHJpZnQuRGVmaW5lcy5pbmN9CisKIHVzZXMKLSAgQ2xhc3NlcywgV2luZG93cywgU3lzVXRpbHMsIFN5bmNPYmpzOworICB7JElGREVGIE9MRF9VTklUX05BTUVTfQorICBDbGFzc2VzLCBXaW5kb3dzLCBTeXNVdGlscywgQ2hhcmFjdGVyLCBTeW5jT2JqczsKKyAgeyRFTFNFfQorICBTeXN0ZW0uQ2xhc3NlcywgV2luYXBpLldpbmRvd3MsIFN5c3RlbS5TeXNVdGlscywgU3lzdGVtLkNoYXJhY3RlciwgU3lzdGVtLlN5bmNPYmpzOworICB7JEVORElGfQogCiB0eXBlCiAgIElPdmVybGFwcGVkSGVscGVyID0gaW50ZXJmYWNlCkBAIC01Niw2ICs2MiwxOCBAQAogICBlbmQ7CiAKIAorICBDaGFyVXRpbHMgPSBjbGFzcyBzZWFsZWQKKyAgcHVibGljCisgICAgY2xhc3MgZnVuY3Rpb24gSXNIaWdoU3Vycm9nYXRlKCBjb25zdCBjIDogQ2hhcikgOiBCb29sZWFuOyBzdGF0aWM7IGlubGluZTsKKyAgICBjbGFzcyBmdW5jdGlvbiBJc0xvd1N1cnJvZ2F0ZSggY29uc3QgYyA6IENoYXIpIDogQm9vbGVhbjsgc3RhdGljOyBpbmxpbmU7CisgIGVuZDsKKworCit7JElGREVGIFdpbjY0fQorZnVuY3Rpb24gSW50ZXJsb2NrZWRFeGNoYW5nZUFkZDY0KCB2YXIgQWRkZW5kIDogSW50NjQ7IFZhbHVlIDogSW50NjQpIDogSW50NjQ7ICAKK3skRU5ESUZ9CisKKwogaW1wbGVtZW50YXRpb24KIAogeyBUT3ZlcmxhcHBlZEhlbHBlckltcGwgfQpAQCAtMTg2LDQgKzIwNCw1NiBAQAogZW5kOwogCiAKK2NsYXNzIGZ1bmN0aW9uIENoYXJVdGlscy5Jc0hpZ2hTdXJyb2dhdGUoIGNvbnN0IGMgOiBDaGFyKSA6IEJvb2xlYW47CitiZWdpbgorICB7JElGIENvbXBpbGVyVmVyc2lvbiA8IDI1LjB9CisgICAgeyRJRkRFRiBPTERfVU5JVF9OQU1FU30KKyAgICByZXN1bHQgOj0gQ2hhcmFjdGVyLklzSGlnaFN1cnJvZ2F0ZShjKTsKKyAgICB7JEVMU0V9CisgICAgcmVzdWx0IDo9IFN5c3RlbS5DaGFyYWN0ZXIuSXNIaWdoU3Vycm9nYXRlKGMpOworICAgIHskRU5ESUZ9CisgIHskRUxTRX0KKyAgcmVzdWx0IDo9IGMuSXNIaWdoU3Vycm9nYXRlKCk7CisgIHskSUZFTkR9CitlbmQ7CisKKworY2xhc3MgZnVuY3Rpb24gQ2hhclV0aWxzLklzTG93U3Vycm9nYXRlKCBjb25zdCBjIDogQ2hhcikgOiBCb29sZWFuOworYmVnaW4KKyAgeyRJRiBDb21waWxlclZlcnNpb24gPCAyNS4wfQorICAgIHskSUZERUYgT0xEX1VOSVRfTkFNRVN9CisgICAgcmVzdWx0IDo9IENoYXJhY3Rlci5Jc0xvd1N1cnJvZ2F0ZShjKTsKKyAgICB7JEVMU0V9CisgICAgcmVzdWx0IDo9IFN5c3RlbS5DaGFyYWN0ZXIuSXNMb3dTdXJyb2dhdGUoYyk7CisgICAgeyRFTkRJRn0KKyAgeyRFTFNFfQorICByZXN1bHQgOj0gYy5Jc0xvd1N1cnJvZ2F0ZSgpOworICB7JElGRU5EfQorZW5kOworCisKK3skSUZERUYgV2luNjR9CisKK2Z1bmN0aW9uIEludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlNjQoIHZhciBUYXJnZXQgOiBJbnQ2NDsgRXhjaGFuZ2UsIENvbXBhcmFuZCA6IEludDY0KSA6IEludDY0OyAgaW5saW5lOworYmVnaW4KKyAgeyRJRkRFRiBPTERfVU5JVF9OQU1FU30KKyAgcmVzdWx0IDo9IFdpbmRvd3MuSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2U2NCggVGFyZ2V0LCBFeGNoYW5nZSwgQ29tcGFyYW5kKTsKKyAgeyRFTFNFfQorICByZXN1bHQgOj0gV2luQXBpLldpbmRvd3MuSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2U2NCggVGFyZ2V0LCBFeGNoYW5nZSwgQ29tcGFyYW5kKTsKKyAgeyRFTkRJRn0KK2VuZDsKKworCitmdW5jdGlvbiBJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkNjQoIHZhciBBZGRlbmQgOiBJbnQ2NDsgVmFsdWUgOiBJbnQ2NCkgOiBJbnQ2NDsKK3ZhciBvbGQgOiBJbnQ2NDsKK2JlZ2luCisgIHJlcGVhdAorICAgIE9sZCA6PSBBZGRlbmQ7CisgIHVudGlsIChJbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZTY0KCBBZGRlbmQsIE9sZCArIFZhbHVlLCBPbGQpID0gT2xkKTsKKyAgcmVzdWx0IDo9IE9sZDsKK2VuZDsKKworeyRFTkRJRn0KKworCiBlbmQuCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3NyYy9UaHJpZnQucGFzIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LnBhcwppbmRleCAwOTZkNmExLi42MjQ4MWU3IDEwMDY0NAotLS0gYS9saWIvZGVscGhpL3NyYy9UaHJpZnQucGFzCisrKyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5wYXMKQEAgLTIyLDEzICsyMiwxOSBAQAogaW50ZXJmYWNlCiAKIHVzZXMKLSAgU3lzVXRpbHMsIFRocmlmdC5Qcm90b2NvbDsKKyAgU3lzVXRpbHMsCisgIFRocmlmdC5FeGNlcHRpb24sCisgIFRocmlmdC5Qcm90b2NvbDsKIAogY29uc3QKLSAgVmVyc2lvbiA9ICcwLjkuMyc7CisgIFZlcnNpb24gPSAnMS4wLjAnOwogCiB0eXBlCi0gIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiA9IGNsYXNzKCBTeXNVdGlscy5FeGNlcHRpb24gKQorICBURXhjZXB0aW9uID0gVGhyaWZ0LkV4Y2VwdGlvbi5URXhjZXB0aW9uOyAvLyBjb21wYXRpYmlsaXR5IGFsaWFzCisKKyAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uU3BlY2lhbGl6ZWRDbGFzcyA9IGNsYXNzIG9mIFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkOworCisgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiA9IGNsYXNzKCBURXhjZXB0aW9uKQogICBwdWJsaWMKICAgICB0eXBlCiB7JFNDT1BFREVOVU1TIE9OfQpAQCAtNDcsNjcgKzUzLDExMSBAQAogICAgICAgKTsKIHskU0NPUEVERU5VTVMgT0ZGfQogICBwcml2YXRlCi0gICAgRlR5cGUgOiBURXhjZXB0aW9uVHlwZTsKKyAgICBmdW5jdGlvbiBHZXRUeXBlOiBURXhjZXB0aW9uVHlwZTsKKyAgcHJvdGVjdGVkCisgICAgY29uc3RydWN0b3IgSGlkZGVuQ3JlYXRlKGNvbnN0IE1zZzogc3RyaW5nKTsKICAgcHVibGljCi0gICAgY29uc3RydWN0b3IgQ3JlYXRlOyBvdmVybG9hZDsKLSAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIEFUeXBlOiBURXhjZXB0aW9uVHlwZSk7IG92ZXJsb2FkOwotICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggQVR5cGU6IFRFeGNlcHRpb25UeXBlOyBjb25zdCBtc2c6IHN0cmluZyk7IG92ZXJsb2FkOworICAgIC8vIHB1cnBvc2VmdWxseSBoaWRlIGluaGVyaXRlZCBjb25zdHJ1Y3RvcgorICAgIGNsYXNzIGZ1bmN0aW9uIENyZWF0ZShjb25zdCBNc2c6IHN0cmluZyk6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjsgb3ZlcmxvYWQ7IGRlcHJlY2F0ZWQgJ1VzZSBzcGVjaWFsaXplZCBUQXBwbGljYXRpb25FeGNlcHRpb24gdHlwZXMgKG9yIHJlZ2VuZXJhdGUgZnJvbSBJREwpJzsKKyAgICBjbGFzcyBmdW5jdGlvbiBDcmVhdGU6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjsgb3ZlcmxvYWQ7IGRlcHJlY2F0ZWQgJ1VzZSBzcGVjaWFsaXplZCBUQXBwbGljYXRpb25FeGNlcHRpb24gdHlwZXMgKG9yIHJlZ2VuZXJhdGUgZnJvbSBJREwpJzsKKyAgICBjbGFzcyBmdW5jdGlvbiBDcmVhdGUoIEFUeXBlOiBURXhjZXB0aW9uVHlwZSk6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjsgb3ZlcmxvYWQ7IGRlcHJlY2F0ZWQgJ1VzZSBzcGVjaWFsaXplZCBUQXBwbGljYXRpb25FeGNlcHRpb24gdHlwZXMgKG9yIHJlZ2VuZXJhdGUgZnJvbSBJREwpJzsKKyAgICBjbGFzcyBmdW5jdGlvbiBDcmVhdGUoIEFUeXBlOiBURXhjZXB0aW9uVHlwZTsgY29uc3QgbXNnOiBzdHJpbmcpOiBUQXBwbGljYXRpb25FeGNlcHRpb247IG92ZXJsb2FkOyBkZXByZWNhdGVkICdVc2Ugc3BlY2lhbGl6ZWQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHR5cGVzIChvciByZWdlbmVyYXRlIGZyb20gSURMKSc7CisKKyAgICBjbGFzcyBmdW5jdGlvbiBHZXRTcGVjaWFsaXplZEV4Y2VwdGlvblR5cGUoQVR5cGU6IFRFeGNlcHRpb25UeXBlKTogVEFwcGxpY2F0aW9uRXhjZXB0aW9uU3BlY2lhbGl6ZWRDbGFzczsKIAogICAgIGNsYXNzIGZ1bmN0aW9uIFJlYWQoIGNvbnN0IGlwcm90OiBJUHJvdG9jb2wpOiBUQXBwbGljYXRpb25FeGNlcHRpb247CiAgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBvcHJvdDogSVByb3RvY29sICk7CiAgIGVuZDsKIAotICAvLyBiYXNlIGNsYXNzIGZvciBJREwtZ2VuZXJhdGVkIGV4Y2VwdGlvbnMKLSAgVEV4Y2VwdGlvbiA9IGNsYXNzKCBTeXNVdGlscy5FeGNlcHRpb24pCisgIC8vIE5lZWRlZCB0byByZW1vdmUgZGVwcmVjYXRpb24gd2FybmluZworICBUQXBwbGljYXRpb25FeGNlcHRpb25TcGVjaWFsaXplZCA9IGNsYXNzIGFic3RyYWN0IChUQXBwbGljYXRpb25FeGNlcHRpb24pCiAgIHB1YmxpYwotICAgIGZ1bmN0aW9uIE1lc3NhZ2UgOiBzdHJpbmc7ICAgICAgICAvLyBoaWRlIGluaGVyaXRlZCBwcm9wZXJ0eTogYWxsb3cgcmVhZCwgYnV0IHByZXZlbnQgYWNjaWRlbnRhbCB3cml0ZXMKLSAgICBwcm9jZWR1cmUgVXBkYXRlTWVzc2FnZVByb3BlcnR5OyAgLy8gdXBkYXRlIGluaGVyaXRlZCBtZXNzYWdlIHByb3BlcnR5IHdpdGggdG9TdHJpbmcoKQorICAgIGNvbnN0cnVjdG9yIENyZWF0ZShjb25zdCBNc2c6IHN0cmluZyk7CiAgIGVuZDsKIAorICBUQXBwbGljYXRpb25FeGNlcHRpb25Vbmtub3duID0gY2xhc3MgKFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uVW5rbm93bk1ldGhvZCA9IGNsYXNzIChUQXBwbGljYXRpb25FeGNlcHRpb25TcGVjaWFsaXplZCk7CisgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbkludmFsaWRNZXNzYWdlVHlwZSA9IGNsYXNzIChUQXBwbGljYXRpb25FeGNlcHRpb25TcGVjaWFsaXplZCk7CisgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbldyb25nTWV0aG9kTmFtZSA9IGNsYXNzIChUQXBwbGljYXRpb25FeGNlcHRpb25TcGVjaWFsaXplZCk7CisgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbkJhZFNlcXVlbmNlSUQgPSBjbGFzcyAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUQXBwbGljYXRpb25FeGNlcHRpb25NaXNzaW5nUmVzdWx0ID0gY2xhc3MgKFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uSW50ZXJuYWxFcnJvciA9IGNsYXNzIChUQXBwbGljYXRpb25FeGNlcHRpb25TcGVjaWFsaXplZCk7CisgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvblByb3RvY29sRXJyb3IgPSBjbGFzcyAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUQXBwbGljYXRpb25FeGNlcHRpb25JbnZhbGlkVHJhbnNmb3JtID0gY2xhc3MgKFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uSW52YWxpZFByb3RvY29sID0gY2xhc3MgKFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uVW5zdXBwb3J0ZWRDbGllbnRUeXBlID0gY2xhc3MgKFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKworCiBpbXBsZW1lbnRhdGlvbgogCi17IFRFeGNlcHRpb24gfQotCi1mdW5jdGlvbiBURXhjZXB0aW9uLk1lc3NhZ2U7Ci0vLyBhbGxvdyByZWFkIChleGNlcHRpb24gc3VtbWFyeSksIGJ1dCBwcmV2ZW50IGFjY2lkZW50YWwgd3JpdGVzCi0vLyByZWFkIHdpbGwgcmV0dXJuIHRoZSBleGNlcHRpb24gc3VtbWFyeQotYmVnaW4KLSAgcmVzdWx0IDo9IFNlbGYuVG9TdHJpbmc7Ci1lbmQ7Ci0KLXByb2NlZHVyZSBURXhjZXB0aW9uLlVwZGF0ZU1lc3NhZ2VQcm9wZXJ0eTsKLS8vIFVwZGF0ZSB0aGUgaW5oZXJpdGVkIE1lc3NhZ2UgcHJvcGVydHkgdG8gYmV0dGVyIGNvbmZvcm0gdG8gc3RhbmRhcmQgYmVoYXZpb3VyLgotLy8gTmljZSBiZW5lZml0OiBUaGUgSURFIGlzIG5vdyBhYmxlIHRvIHNob3cgdGhlIGV4Y2VwdGlvbiBtZXNzYWdlIGFnYWluLgotYmVnaW4KLSAgaW5oZXJpdGVkIE1lc3NhZ2UgOj0gU2VsZi5Ub1N0cmluZzsgIC8vIHByb2R1Y2VzIGEgc3VtbWFyeSB0ZXh0Ci1lbmQ7Ci0KIHsgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIH0KIAotY29uc3RydWN0b3IgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkNyZWF0ZTsKK2Z1bmN0aW9uIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5HZXRUeXBlOiBURXhjZXB0aW9uVHlwZTsKIGJlZ2luCi0gIGluaGVyaXRlZCBDcmVhdGUoICcnICk7CisgIGlmIFNlbGYgaXMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uVW5rbm93bk1ldGhvZCB0aGVuIFJlc3VsdCA6PSBURXhjZXB0aW9uVHlwZS5Vbmtub3duTWV0aG9kCisgIGVsc2UgaWYgU2VsZiBpcyBUQXBwbGljYXRpb25FeGNlcHRpb25JbnZhbGlkTWVzc2FnZVR5cGUgdGhlbiBSZXN1bHQgOj0gVEV4Y2VwdGlvblR5cGUuSW52YWxpZE1lc3NhZ2VUeXBlCisgIGVsc2UgaWYgU2VsZiBpcyBUQXBwbGljYXRpb25FeGNlcHRpb25Xcm9uZ01ldGhvZE5hbWUgdGhlbiBSZXN1bHQgOj0gVEV4Y2VwdGlvblR5cGUuV3JvbmdNZXRob2ROYW1lCisgIGVsc2UgaWYgU2VsZiBpcyBUQXBwbGljYXRpb25FeGNlcHRpb25CYWRTZXF1ZW5jZUlEIHRoZW4gUmVzdWx0IDo9IFRFeGNlcHRpb25UeXBlLkJhZFNlcXVlbmNlSUQKKyAgZWxzZSBpZiBTZWxmIGlzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbk1pc3NpbmdSZXN1bHQgdGhlbiBSZXN1bHQgOj0gVEV4Y2VwdGlvblR5cGUuTWlzc2luZ1Jlc3VsdAorICBlbHNlIGlmIFNlbGYgaXMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uSW50ZXJuYWxFcnJvciB0aGVuIFJlc3VsdCA6PSBURXhjZXB0aW9uVHlwZS5JbnRlcm5hbEVycm9yCisgIGVsc2UgaWYgU2VsZiBpcyBUQXBwbGljYXRpb25FeGNlcHRpb25Qcm90b2NvbEVycm9yIHRoZW4gUmVzdWx0IDo9IFRFeGNlcHRpb25UeXBlLlByb3RvY29sRXJyb3IKKyAgZWxzZSBpZiBTZWxmIGlzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbkludmFsaWRUcmFuc2Zvcm0gdGhlbiBSZXN1bHQgOj0gVEV4Y2VwdGlvblR5cGUuSW52YWxpZFRyYW5zZm9ybQorICBlbHNlIGlmIFNlbGYgaXMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uSW52YWxpZFByb3RvY29sIHRoZW4gUmVzdWx0IDo9IFRFeGNlcHRpb25UeXBlLkludmFsaWRQcm90b2NvbAorICBlbHNlIGlmIFNlbGYgaXMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uVW5zdXBwb3J0ZWRDbGllbnRUeXBlIHRoZW4gUmVzdWx0IDo9IFRFeGNlcHRpb25UeXBlLlVuc3VwcG9ydGVkQ2xpZW50VHlwZQorICBlbHNlIFJlc3VsdCA6PSBURXhjZXB0aW9uVHlwZS5Vbmtub3duOwogZW5kOwogCi1jb25zdHJ1Y3RvciBUQXBwbGljYXRpb25FeGNlcHRpb24uQ3JlYXRlKEFUeXBlOiBURXhjZXB0aW9uVHlwZTsKLSAgY29uc3QgbXNnOiBzdHJpbmcpOworY29uc3RydWN0b3IgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkhpZGRlbkNyZWF0ZShjb25zdCBNc2c6IHN0cmluZyk7CiBiZWdpbgotICBpbmhlcml0ZWQgQ3JlYXRlKCBtc2cgKTsKLSAgRlR5cGUgOj0gQVR5cGU7CisgIGluaGVyaXRlZCBDcmVhdGUoTXNnKTsKIGVuZDsKIAotY29uc3RydWN0b3IgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkNyZWF0ZShBVHlwZTogVEV4Y2VwdGlvblR5cGUpOworY2xhc3MgZnVuY3Rpb24gVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkNyZWF0ZShjb25zdCBNc2c6IHN0cmluZyk6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKIGJlZ2luCi0gIGluaGVyaXRlZCBDcmVhdGUoJycpOwotICBGVHlwZSA6PSBBVHlwZTsKKyAgUmVzdWx0IDo9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvblVua25vd24uQ3JlYXRlKE1zZyk7CitlbmQ7CisKK2NsYXNzIGZ1bmN0aW9uIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5DcmVhdGU6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2JlZ2luCisgIFJlc3VsdCA6PSBUQXBwbGljYXRpb25FeGNlcHRpb25Vbmtub3duLkNyZWF0ZSgnJyk7CitlbmQ7CisKK2NsYXNzIGZ1bmN0aW9uIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5DcmVhdGUoIEFUeXBlOiBURXhjZXB0aW9uVHlwZSk6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2JlZ2luCit7JFdBUk4gU1lNQk9MX0RFUFJFQ0FURUQgT0ZGfQorICBSZXN1bHQgOj0gQ3JlYXRlKEFUeXBlLCAnJyk7Cit7JFdBUk4gU1lNQk9MX0RFUFJFQ0FURUQgREVGQVVMVH0KK2VuZDsKKworY2xhc3MgZnVuY3Rpb24gVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkNyZWF0ZSggQVR5cGU6IFRFeGNlcHRpb25UeXBlOyBjb25zdCBtc2c6IHN0cmluZyk6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2JlZ2luCisgIFJlc3VsdCA6PSBHZXRTcGVjaWFsaXplZEV4Y2VwdGlvblR5cGUoQVR5cGUpLkNyZWF0ZShtc2cpOworZW5kOworCitjbGFzcyBmdW5jdGlvbiBUQXBwbGljYXRpb25FeGNlcHRpb24uR2V0U3BlY2lhbGl6ZWRFeGNlcHRpb25UeXBlKEFUeXBlOiBURXhjZXB0aW9uVHlwZSk6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkQ2xhc3M7CitiZWdpbgorICBjYXNlIEFUeXBlIG9mCisgICAgVEV4Y2VwdGlvblR5cGUuVW5rbm93bk1ldGhvZDogICAgICAgICBSZXN1bHQgOj0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uVW5rbm93bk1ldGhvZDsKKyAgICBURXhjZXB0aW9uVHlwZS5JbnZhbGlkTWVzc2FnZVR5cGU6ICAgIFJlc3VsdCA6PSBUQXBwbGljYXRpb25FeGNlcHRpb25JbnZhbGlkTWVzc2FnZVR5cGU7CisgICAgVEV4Y2VwdGlvblR5cGUuV3JvbmdNZXRob2ROYW1lOiAgICAgICBSZXN1bHQgOj0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uV3JvbmdNZXRob2ROYW1lOworICAgIFRFeGNlcHRpb25UeXBlLkJhZFNlcXVlbmNlSUQ6ICAgICAgICAgUmVzdWx0IDo9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbkJhZFNlcXVlbmNlSUQ7CisgICAgVEV4Y2VwdGlvblR5cGUuTWlzc2luZ1Jlc3VsdDogICAgICAgICBSZXN1bHQgOj0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uTWlzc2luZ1Jlc3VsdDsKKyAgICBURXhjZXB0aW9uVHlwZS5JbnRlcm5hbEVycm9yOiAgICAgICAgIFJlc3VsdCA6PSBUQXBwbGljYXRpb25FeGNlcHRpb25JbnRlcm5hbEVycm9yOworICAgIFRFeGNlcHRpb25UeXBlLlByb3RvY29sRXJyb3I6ICAgICAgICAgUmVzdWx0IDo9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvblByb3RvY29sRXJyb3I7CisgICAgVEV4Y2VwdGlvblR5cGUuSW52YWxpZFRyYW5zZm9ybTogICAgICBSZXN1bHQgOj0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uSW52YWxpZFRyYW5zZm9ybTsKKyAgICBURXhjZXB0aW9uVHlwZS5JbnZhbGlkUHJvdG9jb2w6ICAgICAgIFJlc3VsdCA6PSBUQXBwbGljYXRpb25FeGNlcHRpb25JbnZhbGlkUHJvdG9jb2w7CisgICAgVEV4Y2VwdGlvblR5cGUuVW5zdXBwb3J0ZWRDbGllbnRUeXBlOiBSZXN1bHQgOj0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uVW5zdXBwb3J0ZWRDbGllbnRUeXBlOworICBlbHNlCisgICAgUmVzdWx0IDo9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvblVua25vd247CisgIGVuZDsKIGVuZDsKIAogY2xhc3MgZnVuY3Rpb24gVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlJlYWQoIGNvbnN0IGlwcm90OiBJUHJvdG9jb2wpOiBUQXBwbGljYXRpb25FeGNlcHRpb247CiB2YXIKLSAgZmllbGQgOiBJRmllbGQ7CisgIGZpZWxkIDogVFRocmlmdEZpZWxkOwogICBtc2cgOiBzdHJpbmc7CiAgIHR5cCA6IFRFeGNlcHRpb25UeXBlOwotICBzdHJ1YyA6IElTdHJ1Y3Q7CisgIHN0cnVjIDogVFRocmlmdFN0cnVjdDsKIGJlZ2luCiAgIG1zZyA6PSAnJzsKICAgdHlwIDo9IFRFeGNlcHRpb25UeXBlLlVua25vd247CkBAIC0xNDcsMTcgKzE5NywxNiBAQAogICAgIGlwcm90LlJlYWRGaWVsZEVuZDsKICAgZW5kOwogICBpcHJvdC5SZWFkU3RydWN0RW5kOwotICBSZXN1bHQgOj0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkNyZWF0ZSggdHlwLCBtc2cgKTsKKyAgUmVzdWx0IDo9IEdldFNwZWNpYWxpemVkRXhjZXB0aW9uVHlwZSh0eXApLkNyZWF0ZShtc2cpOwogZW5kOwogCiBwcm9jZWR1cmUgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLldyaXRlKCBjb25zdCBvcHJvdDogSVByb3RvY29sKTsKIHZhcgotICBzdHJ1YyA6IElTdHJ1Y3Q7Ci0gIGZpZWxkIDogSUZpZWxkOwotCisgIHN0cnVjIDogVFRocmlmdFN0cnVjdDsKKyAgZmllbGQgOiBUVGhyaWZ0RmllbGQ7CiBiZWdpbgotICBzdHJ1YyA6PSBUU3RydWN0SW1wbC5DcmVhdGUoICdUQXBwbGljYXRpb25FeGNlcHRpb24nICk7Ci0gIGZpZWxkIDo9IFRGaWVsZEltcGwuQ3JlYXRlOworICBJbml0KHN0cnVjLCAnVEFwcGxpY2F0aW9uRXhjZXB0aW9uJyk7CisgIEluaXQoZmllbGQpOwogCiAgIG9wcm90LldyaXRlU3RydWN0QmVnaW4oIHN0cnVjICk7CiAgIGlmIE1lc3NhZ2UgPD4gJycgdGhlbgpAQCAtMTc0LDEwICsyMjMsMTcgQEAKICAgZmllbGQuVHlwZV8gOj0gVFR5cGUuSTMyOwogICBmaWVsZC5JZCA6PSAyOwogICBvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oZmllbGQpOwotICBvcHJvdC5Xcml0ZUkzMihJbnRlZ2VyKEZUeXBlKSk7CisgIG9wcm90LldyaXRlSTMyKEludGVnZXIoR2V0VHlwZSkpOwogICBvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7CiAgIG9wcm90LldyaXRlRmllbGRTdG9wKCk7CiAgIG9wcm90LldyaXRlU3RydWN0RW5kKCk7CiBlbmQ7CiAKK3sgVEFwcGxpY2F0aW9uRXhjZXB0aW9uU3BlY2lhbGl6ZWQgfQorCitjb25zdHJ1Y3RvciBUQXBwbGljYXRpb25FeGNlcHRpb25TcGVjaWFsaXplZC5DcmVhdGUoY29uc3QgTXNnOiBzdHJpbmcpOworYmVnaW4KKyAgaW5oZXJpdGVkIEhpZGRlbkNyZWF0ZShNc2cpOworZW5kOworCiBlbmQuCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3QvQ29uc29sZUhlbHBlci5wYXMgYi9saWIvZGVscGhpL3Rlc3QvQ29uc29sZUhlbHBlci5wYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE4ZGRjZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9Db25zb2xlSGVscGVyLnBhcwpAQCAtMCwwICsxLDEzMiBAQAorKCoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQorCit1bml0IENvbnNvbGVIZWxwZXI7CisKK2ludGVyZmFjZQorCit1c2VzIENsYXNzZXM7CisKK3R5cGUKKyAgVFRocmlmdENvbnNvbGUgPSBjbGFzcworICBwdWJsaWMKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IFM6IHN0cmluZyk7IHZpcnR1YWw7CisgICAgcHJvY2VkdXJlIFdyaXRlTGluZSggY29uc3QgUzogc3RyaW5nKTsgdmlydHVhbDsKKyAgZW5kOworCisgIFRHVUlDb25zb2xlID0gY2xhc3MoIFRUaHJpZnRDb25zb2xlICkKKyAgcHJpdmF0ZQorICAgIEZMaW5lQnJlYWsgOiBCb29sZWFuOworICAgIEZNZW1vIDogVFN0cmluZ3M7CisKKyAgICBwcm9jZWR1cmUgSW50ZXJuYWxXcml0ZSggY29uc3QgUzogc3RyaW5nOyBiV3JpdGVMaW5lOiBCb29sZWFuKTsKKyAgcHVibGljCisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBTOiBzdHJpbmcpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVMaW5lKCBjb25zdCBTOiBzdHJpbmcpOyBvdmVycmlkZTsKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIEFNZW1vOiBUU3RyaW5ncyk7CisgIGVuZDsKKworZnVuY3Rpb24gQ29uc29sZTogVFRocmlmdENvbnNvbGU7Citwcm9jZWR1cmUgQ2hhbmdlQ29uc29sZSggQUNvbnNvbGU6IFRUaHJpZnRDb25zb2xlICk7Citwcm9jZWR1cmUgUmVzdG9yZUNvbnNvbGVUb0RlZmF1bHQ7CisKK2ltcGxlbWVudGF0aW9uCisKK3ZhcgorICBGRGVmYXVsdENvbnNvbGUgOiBUVGhyaWZ0Q29uc29sZTsKKyAgRkNvbnNvbGUgOiBUVGhyaWZ0Q29uc29sZTsKKworZnVuY3Rpb24gQ29uc29sZTogVFRocmlmdENvbnNvbGU7CitiZWdpbgorICBSZXN1bHQgOj0gRkNvbnNvbGU7CitlbmQ7CisKK3sgVFRocmlmdENvbnNvbGUgfQorCitwcm9jZWR1cmUgVFRocmlmdENvbnNvbGUuV3JpdGUoY29uc3QgUzogc3RyaW5nKTsKK2JlZ2luCisgIFN5c3RlbS5Xcml0ZSggUyApOworZW5kOworCitwcm9jZWR1cmUgVFRocmlmdENvbnNvbGUuV3JpdGVMaW5lKGNvbnN0IFM6IHN0cmluZyk7CitiZWdpbgorICBTeXN0ZW0uV3JpdGVsbiggUyApOworZW5kOworCitwcm9jZWR1cmUgQ2hhbmdlQ29uc29sZSggQUNvbnNvbGU6IFRUaHJpZnRDb25zb2xlICk7CitiZWdpbgorICBGQ29uc29sZSA6PSBBQ29uc29sZTsKK2VuZDsKKworcHJvY2VkdXJlIFJlc3RvcmVDb25zb2xlVG9EZWZhdWx0OworYmVnaW4KKyAgRkNvbnNvbGUgOj0gRkRlZmF1bHRDb25zb2xlOworZW5kOworCit7IFRHVUlDb25zb2xlIH0KKworY29uc3RydWN0b3IgVEdVSUNvbnNvbGUuQ3JlYXRlKCBBTWVtbzogVFN0cmluZ3MpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRk1lbW8gOj0gQU1lbW87CisgIEZMaW5lQnJlYWsgOj0gVHJ1ZTsKK2VuZDsKKworcHJvY2VkdXJlIFRHVUlDb25zb2xlLkludGVybmFsV3JpdGUoY29uc3QgUzogc3RyaW5nOyBiV3JpdGVMaW5lOiBCb29sZWFuKTsKK3ZhcgorICBpZHggOiBJbnRlZ2VyOworYmVnaW4KKyAgaWYgRkxpbmVCcmVhayB0aGVuCisgIGJlZ2luCisgICAgRk1lbW8uQWRkKCBTICk7CisgIGVuZCBlbHNlCisgIGJlZ2luCisgICAgaWR4IDo9IEZNZW1vLkNvdW50IC0gMTsKKyAgICBpZiBpZHggPCAwIHRoZW4KKyAgICAgIEZNZW1vLkFkZCggUyApCisgICAgZWxzZQorICAgICAgRk1lbW9baWR4XSA6PSBGTWVtb1tpZHhdICsgUzsKKyAgZW5kOworICBGTGluZUJyZWFrIDo9IGJXcml0ZUxpbmU7CitlbmQ7CisKK3Byb2NlZHVyZSBUR1VJQ29uc29sZS5Xcml0ZShjb25zdCBTOiBzdHJpbmcpOworYmVnaW4KKyAgSW50ZXJuYWxXcml0ZSggUywgRmFsc2UpOworZW5kOworCitwcm9jZWR1cmUgVEdVSUNvbnNvbGUuV3JpdGVMaW5lKGNvbnN0IFM6IHN0cmluZyk7CitiZWdpbgorICBJbnRlcm5hbFdyaXRlKCBTLCBUcnVlKTsKK2VuZDsKKworaW5pdGlhbGl6YXRpb24KK2JlZ2luCisgIEZEZWZhdWx0Q29uc29sZSA6PSBUVGhyaWZ0Q29uc29sZS5DcmVhdGU7CisgIEZDb25zb2xlIDo9IEZEZWZhdWx0Q29uc29sZTsKK2VuZDsKKworZmluYWxpemF0aW9uCitiZWdpbgorICBGRGVmYXVsdENvbnNvbGUuRnJlZTsKK2VuZDsKKworZW5kLgorCisKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9UZXN0Q2xpZW50LnBhcyBiL2xpYi9kZWxwaGkvdGVzdC9UZXN0Q2xpZW50LnBhcwppbmRleCA1ZjM3NWVmLi4wZmE0M2IwIDEwMDY0NAotLS0gYS9saWIvZGVscGhpL3Rlc3QvVGVzdENsaWVudC5wYXMKKysrIGIvbGliL2RlbHBoaS90ZXN0L1Rlc3RDbGllbnQucGFzCkBAIC0xOSwxNiArMTksMjUgQEAKIAogdW5pdCBUZXN0Q2xpZW50OwogCit7JEkgLi4vc3JjL1RocmlmdC5EZWZpbmVzLmluY30KKwogey4kREVGSU5FIFN0cmVzc1Rlc3R9ICAgLy8gYWN0aXZhdGUgdG8gc3RyZXNzLXRlc3QgdGhlIHNlcnZlciB3aXRoIGZyZXF1ZW50IGNvbm5lY3RzL2Rpc2Nvbm5lY3RzCi17LiRERUZJTkUgUGVyZlRlc3R9ICAgICAvLyBhY3RpdmF0ZSB0byBhY3RpdmF0ZSB0aGUgcGVyZm9ybWFuY2UgdGVzdAorey4kREVGSU5FIFBlcmZUZXN0fSAgICAgLy8gYWN0aXZhdGUgdGhlIHBlcmZvcm1hbmNlIHRlc3QKK3skREVGSU5FIEV4Y2VwdGlvbnN9ICAgIC8vIGFjdGl2YXRlIHRoZSBleGNlcHRpb25zIHRlc3QgKG9yIGRpc2FibGUgd2hpbGUgZGVidWdnaW5nKQorCit7JGlmIENvbXBpbGVyVmVyc2lvbiA+PSAyOH0KK3skREVGSU5FIFN1cHBvcnRzQXN5bmN9Cit7JGlmZW5kfQogCiBpbnRlcmZhY2UKIAogdXNlcwotICBXaW5kb3dzLCBTeXNVdGlscywgQ2xhc3NlcywgTWF0aCwKKyAgV2luZG93cywgU3lzVXRpbHMsIENsYXNzZXMsIE1hdGgsIENvbU9iaiwgQWN0aXZlWCwKKyAgeyRJRkRFRiBTdXBwb3J0c0FzeW5jfSBTeXN0ZW0uVGhyZWFkaW5nLCB7JEVORElGfQogICBEYXRlVXRpbHMsCiAgIEdlbmVyaWNzLkNvbGxlY3Rpb25zLAogICBUZXN0Q29uc3RhbnRzLAorICBDb25zb2xlSGVscGVyLAogICBUaHJpZnQsCiAgIFRocmlmdC5Qcm90b2NvbC5Db21wYWN0LAogICBUaHJpZnQuUHJvdG9jb2wuSlNPTiwKQEAgLTM3LDggKzQ2LDggQEAKICAgVGhyaWZ0LlRyYW5zcG9ydCwKICAgVGhyaWZ0LlN0cmVhbSwKICAgVGhyaWZ0LlRlc3QsCi0gIFRocmlmdC5Db2xsZWN0aW9ucywKLSAgVGhyaWZ0LkNvbnNvbGU7CisgIFRocmlmdC5VdGlscywKKyAgVGhyaWZ0LkNvbGxlY3Rpb25zOwogCiB0eXBlCiAgIFRUaHJlYWRDb25zb2xlID0gY2xhc3MKQEAgLTUwLDYgKzU5LDE3IEBACiAgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBBVGhyZWFkOiBUVGhyZWFkKTsKICAgZW5kOwogCisgIFRUZXN0U2V0dXAgPSByZWNvcmQKKyAgICBwcm90VHlwZSAgOiBUS25vd25Qcm90b2NvbDsKKyAgICBlbmRwb2ludCAgOiBURW5kcG9pbnRUcmFuc3BvcnQ7CisgICAgbGF5ZXJlZCAgIDogVExheWVyZWRUcmFuc3BvcnRzOworICAgIHVzZVNTTCAgICA6IEJvb2xlYW47IC8vIGluY2x1ZGUgd2hlcmUgYXBwcm9wcmlhdGUgKFRMYXllcmVkVHJhbnNwb3J0PykKKyAgICBob3N0ICAgICAgOiBzdHJpbmc7CisgICAgcG9ydCAgICAgIDogSW50ZWdlcjsKKyAgICBzUGlwZU5hbWUgOiBzdHJpbmc7CisgICAgaEFub25SZWFkLCBoQW5vbldyaXRlIDogVEhhbmRsZTsKKyAgZW5kOworCiAgIFRDbGllbnRUaHJlYWQgPSBjbGFzcyggVFRocmVhZCApCiAgIHByaXZhdGUgdHlwZQogICAgIFRUZXN0R3JvdXAgPSAoCkBAIC02Miw3ICs4MiwxNSBAQAogICAgICk7CiAgICAgVFRlc3RHcm91cHMgPSBzZXQgb2YgVFRlc3RHcm91cDsKIAorICAgIFRUZXN0U2l6ZSA9ICgKKyAgICAgIEVtcHR5LCAgICAgICAgICAgLy8gRWRnZSBjYXNlOiB0aGUgemVyby1sZW5ndGggZW1wdHkgYmluYXJ5CisgICAgICBOb3JtYWwsICAgICAgICAgIC8vIEZhaXJseSBzbWFsbCBhcnJheSBvZiB1c3VhbCBzaXplICgyNTYgYnl0ZXMpCisgICAgICBCeXRlQXJyYXlUZXN0LCAgIC8vIFRIUklGVC00NDU0IExhcmdlIHdyaXRlcy9yZWFkcyBtYXkgY2F1c2UgcmFuZ2UgY2hlY2sgZXJyb3JzIGluIGRlYnVnIG1vZGUKKyAgICAgIFBpcGVXcml0ZUxpbWl0ICAgLy8gVEhSSUZULTQzNzIgUGlwZSB3cml0ZSBvcGVyYXRpb25zIGFjcm9zcyBhIG5ldHdvcmsgYXJlIGxpbWl0ZWQgdG8gNjUsNTM1IGJ5dGVzIHBlciB3cml0ZS4KKyAgICApOworCiAgIHByaXZhdGUKKyAgICBGU2V0dXAgOiBUVGVzdFNldHVwOwogICAgIEZUcmFuc3BvcnQgOiBJVHJhbnNwb3J0OwogICAgIEZQcm90b2NvbCA6IElQcm90b2NvbDsKICAgICBGTnVtSXRlcmF0aW9uIDogSW50ZWdlcjsKQEAgLTgxLDE1ICsxMDksMjUgQEAKICAgICBmdW5jdGlvbiAgQ2FsY3VsYXRlRXhpdENvZGUgOiBCeXRlOwogCiAgICAgcHJvY2VkdXJlIENsaWVudFRlc3Q7CisgICAgeyRJRkRFRiBTdXBwb3J0c0FzeW5jfQorICAgIHByb2NlZHVyZSBDbGllbnRBc3luY1Rlc3Q7CisgICAgeyRFTkRJRn0KKworICAgIHByb2NlZHVyZSBJbml0aWFsaXplUHJvdG9jb2xUcmFuc3BvcnRTdGFjazsKKyAgICBwcm9jZWR1cmUgU2h1dGRvd25Qcm90b2NvbFRyYW5zcG9ydFN0YWNrOworCiAgICAgcHJvY2VkdXJlIEpTT05Qcm90b2NvbFJlYWRXcml0ZVRlc3Q7Ci0gICAgZnVuY3Rpb24gIFByZXBhcmVCaW5hcnlEYXRhKCBhUmFuZG9tRGlzdCA6IEJvb2xlYW4gPSBGQUxTRSkgOiBUQnl0ZXM7CisgICAgZnVuY3Rpb24gIFByZXBhcmVCaW5hcnlEYXRhKCBhUmFuZG9tRGlzdCA6IEJvb2xlYW47IGFTaXplIDogVFRlc3RTaXplKSA6IFRCeXRlczsKICAgICB7JElGREVGIFN0cmVzc1Rlc3R9CiAgICAgcHJvY2VkdXJlIFN0cmVzc1Rlc3QoY29uc3QgY2xpZW50IDogVFRocmlmdFRlc3QuSWZhY2UpOwogICAgIHskRU5ESUZ9CisgICAgeyRJRkRFRiBXaW42NH0KKyAgICBwcm9jZWR1cmUgVXNlSW50ZXJsb2NrZWRFeGNoYW5nZUFkZDY0OworICAgIHskRU5ESUZ9CiAgIHByb3RlY3RlZAogICAgIHByb2NlZHVyZSBFeGVjdXRlOyBvdmVycmlkZTsKICAgcHVibGljCi0gICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBBVHJhbnNwb3J0OiBJVHJhbnNwb3J0OyBjb25zdCBBUHJvdG9jb2wgOiBJUHJvdG9jb2w7IEFOdW1JdGVyYXRpb246IEludGVnZXIpOworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgYVNldHVwIDogVFRlc3RTZXR1cDsgY29uc3QgYU51bUl0ZXJhdGlvbjogSW50ZWdlcik7CiAgICAgZGVzdHJ1Y3RvciBEZXN0cm95OyBvdmVycmlkZTsKICAgZW5kOwogCkBAIC0xNzAsMzggKzIwOCwyNyBAQAogY2xhc3MgZnVuY3Rpb24gVFRlc3RDbGllbnQuRXhlY3V0ZShjb25zdCBhcmdzOiBhcnJheSBvZiBzdHJpbmcpIDogQnl0ZTsKIHZhcgogICBpIDogSW50ZWdlcjsKLSAgaG9zdCA6IHN0cmluZzsKLSAgcG9ydCA6IEludGVnZXI7Ci0gIHNQaXBlTmFtZSA6IHN0cmluZzsKLSAgaEFub25SZWFkLCBoQW5vbldyaXRlIDogVEhhbmRsZTsKKyAgdGhyZWFkRXhpdENvZGUgOiBCeXRlOwogICBzIDogc3RyaW5nOwogICB0aHJlYWRzIDogYXJyYXkgb2YgVFRocmVhZDsKICAgZHRTdGFydCA6IFREYXRlVGltZTsKICAgdGVzdCA6IEludGVnZXI7CiAgIHRocmVhZCA6IFRUaHJlYWQ7Ci0gIHRyYW5zIDogSVRyYW5zcG9ydDsKLSAgcHJvdCA6IElQcm90b2NvbDsKLSAgc3RyZWFtdHJhbnMgOiBJU3RyZWFtVHJhbnNwb3J0OwotICBodHRwIDogSUhUVFBDbGllbnQ7Ci0gIHByb3RUeXBlIDogVEtub3duUHJvdG9jb2w7Ci0gIGVuZHBvaW50IDogVEVuZHBvaW50VHJhbnNwb3J0OwotICBsYXllcmVkIDogVExheWVyZWRUcmFuc3BvcnRzOwotICBVc2VTU0wgOiBCb29sZWFuOyAvLyBpbmNsdWRlIHdoZXJlIGFwcHJvcHJpYXRlIChUTGF5ZXJlZFRyYW5zcG9ydD8pCi1jb25zdAotICAvLyBwaXBlIHRpbWVvdXRzIHRvIGJlIHVzZWQKLSAgREVCVUdfVElNRU9VVCAgID0gMzAgKiAxMDAwOwotICBSRUxFQVNFX1RJTUVPVVQgPSBERUZBVUxUX1RIUklGVF9USU1FT1VUOwotICBUSU1FT1VUICAgICAgICAgPSBSRUxFQVNFX1RJTUVPVVQ7CisgIHNldHVwIDogVFRlc3RTZXR1cDsKIGJlZ2luCi0gIHByb3RUeXBlIDo9IHByb3RfQmluYXJ5OwotICBlbmRwb2ludCA6PSB0cm5zX1NvY2tldHM7Ci0gIGxheWVyZWQgOj0gW107Ci0gIFVzZVNTTCA6PSBGQUxTRTsKLSAgaG9zdCA6PSAnbG9jYWxob3N0JzsKLSAgcG9ydCA6PSA5MDkwOwotICBzUGlwZU5hbWUgOj0gJyc7Ci0gIGhBbm9uUmVhZCA6PSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKLSAgaEFub25Xcml0ZSA6PSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKyAgLy8gaW5pdCByZWNvcmQKKyAgd2l0aCBzZXR1cCBkbyBiZWdpbgorICAgIHByb3RUeXBlICAgOj0gcHJvdF9CaW5hcnk7CisgICAgZW5kcG9pbnQgICA6PSB0cm5zX1NvY2tldHM7CisgICAgbGF5ZXJlZCAgICA6PSBbXTsKKyAgICB1c2VTU0wgICAgIDo9IEZBTFNFOworICAgIGhvc3QgICAgICAgOj0gJ2xvY2FsaG9zdCc7CisgICAgcG9ydCAgICAgICA6PSA5MDkwOworICAgIHNQaXBlTmFtZSAgOj0gJyc7CisgICAgaEFub25SZWFkICA6PSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKyAgICBoQW5vbldyaXRlIDo9IElOVkFMSURfSEFORExFX1ZBTFVFOworICBlbmQ7CisKICAgdHJ5CiAgICAgaSA6PSAwOwogICAgIHdoaWxlICggaSA8IExlbmd0aChhcmdzKSApIGRvIGJlZ2luCkBAIC0yMTYsMTUgKzI0MywxNSBAQAogICAgICAgZW5kCiAgICAgICBlbHNlIGlmIHMgPSAnLS1ob3N0JyB0aGVuIGJlZ2luCiAgICAgICAgIC8vIC0taG9zdCBhcmcgKD1sb2NhbGhvc3QpICAgICBIb3N0IHRvIGNvbm5lY3QKLSAgICAgICAgaG9zdCA6PSBhcmdzW2ldOworICAgICAgICBzZXR1cC5ob3N0IDo9IGFyZ3NbaV07CiAgICAgICAgIEluYyggaSk7CiAgICAgICBlbmQKICAgICAgIGVsc2UgaWYgcyA9ICctLXBvcnQnIHRoZW4gYmVnaW4KICAgICAgICAgLy8gLS1wb3J0IGFyZyAoPTkwOTApICAgICAgICAgIFBvcnQgbnVtYmVyIHRvIGNvbm5lY3QKICAgICAgICAgcyA6PSBhcmdzW2ldOwogICAgICAgICBJbmMoIGkpOwotICAgICAgICBwb3J0IDo9IFN0clRvSW50RGVmKHMsMCk7Ci0gICAgICAgIGlmIHBvcnQgPD0gMCB0aGVuIEludmFsaWRBcmdzOworICAgICAgICBzZXR1cC5wb3J0IDo9IFN0clRvSW50RGVmKHMsMCk7CisgICAgICAgIGlmIHNldHVwLnBvcnQgPD0gMCB0aGVuIEludmFsaWRBcmdzOwogICAgICAgZW5kCiAgICAgICBlbHNlIGlmIHMgPSAnLS1kb21haW4tc29ja2V0JyB0aGVuIGJlZ2luCiAgICAgICAgIC8vIC0tZG9tYWluLXNvY2tldCBhcmcgICAgICAgICBEb21haW4gU29ja2V0IChlLmcuIC90bXAvVGhyaWZ0VGVzdC50aHJpZnQpLCBpbnN0ZWFkIG9mIGhvc3QgYW5kIHBvcnQKQEAgLTIzMiwyNyArMjU5LDI5IEBACiAgICAgICBlbmQKICAgICAgIGVsc2UgaWYgcyA9ICctLW5hbWVkLXBpcGUnIHRoZW4gYmVnaW4KICAgICAgICAgLy8gLS1uYW1lZC1waXBlIGFyZyAgICAgICAgICAgIFdpbmRvd3MgTmFtZWQgUGlwZSAoZS5nLiBNeVRocmlmdFBpcGUpCi0gICAgICAgIGVuZHBvaW50IDo9IHRybnNfTmFtZWRQaXBlczsKLSAgICAgICAgc1BpcGVOYW1lIDo9IGFyZ3NbaV07CisgICAgICAgIHNldHVwLmVuZHBvaW50IDo9IHRybnNfTmFtZWRQaXBlczsKKyAgICAgICAgc2V0dXAuc1BpcGVOYW1lIDo9IGFyZ3NbaV07CiAgICAgICAgIEluYyggaSk7CisgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCdVc2luZyBuYW1lZCBwaXBlICgnK3NldHVwLnNQaXBlTmFtZSsnKScpOwogICAgICAgZW5kCiAgICAgICBlbHNlIGlmIHMgPSAnLS1hbm9uLXBpcGVzJyB0aGVuIGJlZ2luCiAgICAgICAgIC8vIC0tYW5vbi1waXBlcyBoUmVhZCBoV3JpdGUgICBXaW5kb3dzIEFub255bW91cyBQaXBlcyBwYWlyIChoYW5kbGVzKQotICAgICAgICBlbmRwb2ludCA6PSB0cm5zX0Fub25QaXBlczsKLSAgICAgICAgaEFub25SZWFkIDo9IFRIYW5kbGUoIFN0clRvSW50RGVmKCBhcmdzW2ldLCBJbnRlZ2VyKElOVkFMSURfSEFORExFX1ZBTFVFKSkpOworICAgICAgICBzZXR1cC5lbmRwb2ludCA6PSB0cm5zX0Fub25QaXBlczsKKyAgICAgICAgc2V0dXAuaEFub25SZWFkIDo9IFRIYW5kbGUoIFN0clRvSW50RGVmKCBhcmdzW2ldLCBJbnRlZ2VyKElOVkFMSURfSEFORExFX1ZBTFVFKSkpOwogICAgICAgICBJbmMoIGkpOwotICAgICAgICBoQW5vbldyaXRlIDo9IFRIYW5kbGUoIFN0clRvSW50RGVmKCBhcmdzW2ldLCBJbnRlZ2VyKElOVkFMSURfSEFORExFX1ZBTFVFKSkpOworICAgICAgICBzZXR1cC5oQW5vbldyaXRlIDo9IFRIYW5kbGUoIFN0clRvSW50RGVmKCBhcmdzW2ldLCBJbnRlZ2VyKElOVkFMSURfSEFORExFX1ZBTFVFKSkpOwogICAgICAgICBJbmMoIGkpOworICAgICAgICBDb25zb2xlLldyaXRlTGluZSgnVXNpbmcgYW5vbnltb3VzIHBpcGVzICgnK0ludFRvU3RyKEludGVnZXIoc2V0dXAuaEFub25SZWFkKSkrJyBhbmQgJytJbnRUb1N0cihJbnRlZ2VyKHNldHVwLmhBbm9uV3JpdGUpKSsnKScpOwogICAgICAgZW5kCiAgICAgICBlbHNlIGlmIHMgPSAnLS10cmFuc3BvcnQnIHRoZW4gYmVnaW4KICAgICAgICAgLy8gLS10cmFuc3BvcnQgYXJnICg9c29ja2V0cykgIFRyYW5zcG9ydDogYnVmZmVyZWQsIGZyYW1lZCwgaHR0cCwgZXZodHRwCiAgICAgICAgIHMgOj0gYXJnc1tpXTsKICAgICAgICAgSW5jKCBpKTsKIAotICAgICAgICBpZiAgICAgIHMgPSAnYnVmZmVyZWQnIHRoZW4gSW5jbHVkZSggbGF5ZXJlZCwgdHJuc19CdWZmZXJlZCkKLSAgICAgICAgZWxzZSBpZiBzID0gJ2ZyYW1lZCcgICB0aGVuIEluY2x1ZGUoIGxheWVyZWQsIHRybnNfRnJhbWVkKQotICAgICAgICBlbHNlIGlmIHMgPSAnaHR0cCcgICAgIHRoZW4gZW5kcG9pbnQgOj0gdHJuc19IdHRwCi0gICAgICAgIGVsc2UgaWYgcyA9ICdldmh0dHAnICAgdGhlbiBlbmRwb2ludCA6PSB0cm5zX0Fub25QaXBlcworICAgICAgICBpZiAgICAgIHMgPSAnYnVmZmVyZWQnIHRoZW4gSW5jbHVkZSggc2V0dXAubGF5ZXJlZCwgdHJuc19CdWZmZXJlZCkKKyAgICAgICAgZWxzZSBpZiBzID0gJ2ZyYW1lZCcgICB0aGVuIEluY2x1ZGUoIHNldHVwLmxheWVyZWQsIHRybnNfRnJhbWVkKQorICAgICAgICBlbHNlIGlmIHMgPSAnaHR0cCcgICAgIHRoZW4gc2V0dXAuZW5kcG9pbnQgOj0gdHJuc19IdHRwCisgICAgICAgIGVsc2UgaWYgcyA9ICdldmh0dHAnICAgdGhlbiBzZXR1cC5lbmRwb2ludCA6PSB0cm5zX0V2SHR0cAogICAgICAgICBlbHNlIEludmFsaWRBcmdzOwogICAgICAgZW5kCiAgICAgICBlbHNlIGlmIHMgPSAnLS1wcm90b2NvbCcgdGhlbiBiZWdpbgpAQCAtMjYwLDE0ICsyODksMTQgQEAKICAgICAgICAgcyA6PSBhcmdzW2ldOwogICAgICAgICBJbmMoIGkpOwogCi0gICAgICAgIGlmICAgICAgcyA9ICdiaW5hcnknICAgdGhlbiBwcm90VHlwZSA6PSBwcm90X0JpbmFyeQotICAgICAgICBlbHNlIGlmIHMgPSAnY29tcGFjdCcgIHRoZW4gcHJvdFR5cGUgOj0gcHJvdF9Db21wYWN0Ci0gICAgICAgIGVsc2UgaWYgcyA9ICdqc29uJyAgICAgdGhlbiBwcm90VHlwZSA6PSBwcm90X0pTT04KKyAgICAgICAgaWYgICAgICBzID0gJ2JpbmFyeScgICB0aGVuIHNldHVwLnByb3RUeXBlIDo9IHByb3RfQmluYXJ5CisgICAgICAgIGVsc2UgaWYgcyA9ICdjb21wYWN0JyAgdGhlbiBzZXR1cC5wcm90VHlwZSA6PSBwcm90X0NvbXBhY3QKKyAgICAgICAgZWxzZSBpZiBzID0gJ2pzb24nICAgICB0aGVuIHNldHVwLnByb3RUeXBlIDo9IHByb3RfSlNPTgogICAgICAgICBlbHNlIEludmFsaWRBcmdzOwogICAgICAgZW5kCiAgICAgICBlbHNlIGlmIHMgPSAnLS1zc2wnIHRoZW4gYmVnaW4KICAgICAgICAgLy8gLS1zc2wgICAgICAgICAgICAgICAgICAgICAgIEVuY3J5cHRlZCBUcmFuc3BvcnQgdXNpbmcgU1NMCi0gICAgICAgIFVzZVNTTCA6PSBUUlVFOworICAgICAgICBzZXR1cC51c2VTU0wgOj0gVFJVRTsKIAogICAgICAgZW5kCiAgICAgICBlbHNlIGlmIChzID0gJy1uJykgb3IgKHMgPSAnLS10ZXN0bG9vcHMnKSB0aGVuIGJlZ2luCkBAIC0yOTMsNyArMzIyLDcgQEAKIAogICAgIC8vIEluIHRoZSBhbm9ueW1vdXMgcGlwZXMgbW9kZSB0aGUgY2xpZW50IGlzIGxhdW5jaGVkIGJ5IHRoZSB0ZXN0IHNlcnZlcgogICAgIC8vIC0+IGJlaGF2ZSBuaWNlbHkgYW5kIGFsbG93IGZvciBhdHRhY2hpbmcgYSBkZWJ1Z2dlciB0byB0aGlzIHByb2Nlc3MKLSAgICBpZiAoZW5kcG9pbnQgPSB0cm5zX0Fub25QaXBlcykgYW5kIG5vdCBJc0RlYnVnZ2VyUHJlc2VudAorICAgIGlmIChzZXR1cC5lbmRwb2ludCA9IHRybnNfQW5vblBpcGVzKSBhbmQgbm90IElzRGVidWdnZXJQcmVzZW50CiAgICAgdGhlbiBNZXNzYWdlQm94KCAwLCAnQXR0YWNoIERlYnVnZ2VyIGFuZC9vciBjbGljayBPSyB0byBjb250aW51ZS4nLAogICAgICAgICAgICAgICAgICAgICAgICAgJ1RocmlmdCBUZXN0Q2xpZW50IChEZWxwaGkpJywKICAgICAgICAgICAgICAgICAgICAgICAgIE1CX09LIG9yIE1CX0lDT05FWENMQU1BVElPTik7CkBAIC0zMDEsNzggKzMzMCwzMCBAQAogICAgIFNldExlbmd0aCggdGhyZWFkcywgRk51bVRocmVhZCk7CiAgICAgZHRTdGFydCA6PSBOb3c7CiAKLSAgICBmb3IgdGVzdCA6PSAwIHRvIEZOdW1UaHJlYWQgLSAxIGRvCi0gICAgYmVnaW4KLSAgICAgIGNhc2UgZW5kcG9pbnQgb2YKLSAgICAgICAgdHJuc19Tb2NrZXRzOiBiZWdpbgotICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCdVc2luZyBzb2NrZXRzICgnK2hvc3QrJyBwb3J0ICcrSW50VG9TdHIocG9ydCkrJyknKTsKLSAgICAgICAgICBzdHJlYW10cmFucyA6PSBUU29ja2V0SW1wbC5DcmVhdGUoIGhvc3QsIHBvcnQgKTsKLSAgICAgICAgZW5kOworICAgIC8vIGxheWVyZWQgdHJhbnNwb3J0cyBhcmUgbm90IHJlYWxseSBtZWFudCB0byBiZSBzdGFja2VkIHVwb24gZWFjaCBvdGhlcgorICAgIGlmICh0cm5zX0ZyYW1lZCBpbiBzZXR1cC5sYXllcmVkKSB0aGVuIGJlZ2luCisgICAgICBDb25zb2xlLldyaXRlTGluZSgnVXNpbmcgZnJhbWVkIHRyYW5zcG9ydCcpOworICAgIGVuZAorICAgIGVsc2UgaWYgKHRybnNfQnVmZmVyZWQgaW4gc2V0dXAubGF5ZXJlZCkgdGhlbiBiZWdpbgorICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJ1VzaW5nIGJ1ZmZlcmVkIHRyYW5zcG9ydCcpOworICAgIGVuZDsKIAotICAgICAgICB0cm5zX0h0dHA6IGJlZ2luCi0gICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJ1VzaW5nIEhUVFBDbGllbnQnKTsKLSAgICAgICAgICBodHRwIDo9IFRIVFRQQ2xpZW50SW1wbC5DcmVhdGUoIGhvc3QpOwotICAgICAgICAgIHRyYW5zIDo9IGh0dHA7Ci0gICAgICAgIGVuZDsKKyAgICBDb25zb2xlLldyaXRlTGluZShUSFJJRlRfUFJPVE9DT0xTW3NldHVwLnByb3RUeXBlXSsnIHByb3RvY29sJyk7CiAKLSAgICAgICAgdHJuc19Fdkh0dHA6IGJlZ2luCi0gICAgICAgICAgcmFpc2UgRXhjZXB0aW9uLkNyZWF0ZShFTkRQT0lOVF9UUkFOU1BPUlRTW2VuZHBvaW50XSsnIHRyYW5zcG9ydCBub3QgaW1wbGVtZW50ZWQnKTsKLSAgICAgICAgZW5kOwotCi0gICAgICAgIHRybnNfTmFtZWRQaXBlczogYmVnaW4KLSAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgnVXNpbmcgbmFtZWQgcGlwZSAoJytzUGlwZU5hbWUrJyknKTsKLSAgICAgICAgICBzdHJlYW10cmFucyA6PSBUTmFtZWRQaXBlVHJhbnNwb3J0Q2xpZW50RW5kSW1wbC5DcmVhdGUoIHNQaXBlTmFtZSwgMCwgbmlsLCBUSU1FT1VUKTsKLSAgICAgICAgZW5kOwotCi0gICAgICAgIHRybnNfQW5vblBpcGVzOiBiZWdpbgotICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCdVc2luZyBhbm9ueW1vdXMgcGlwZXMgKCcrSW50VG9TdHIoSW50ZWdlcihoQW5vblJlYWQpKSsnIGFuZCAnK0ludFRvU3RyKEludGVnZXIoaEFub25Xcml0ZSkpKycpJyk7Ci0gICAgICAgICAgc3RyZWFtdHJhbnMgOj0gVEFub255bW91c1BpcGVUcmFuc3BvcnRJbXBsLkNyZWF0ZSggaEFub25SZWFkLCBoQW5vbldyaXRlLCBGQUxTRSk7Ci0gICAgICAgIGVuZDsKLQotICAgICAgZWxzZQotICAgICAgICByYWlzZSBFeGNlcHRpb24uQ3JlYXRlKCdVbmhhbmRsZWQgZW5kcG9pbnQgdHJhbnNwb3J0Jyk7Ci0gICAgICBlbmQ7Ci0gICAgICB0cmFucyA6PSBzdHJlYW10cmFuczsKLSAgICAgIEFTU0VSVCggdHJhbnMgPD4gbmlsKTsKLQotICAgICAgaWYgKHRybnNfQnVmZmVyZWQgaW4gbGF5ZXJlZCkgdGhlbiBiZWdpbgotICAgICAgICB0cmFucyA6PSBUQnVmZmVyZWRUcmFuc3BvcnRJbXBsLkNyZWF0ZSggc3RyZWFtdHJhbnMsIDMyKTsgIC8vIHNtYWxsIGJ1ZmZlciB0byB0ZXN0IHJlYWQoKQotICAgICAgICBDb25zb2xlLldyaXRlTGluZSgnVXNpbmcgYnVmZmVyZWQgdHJhbnNwb3J0Jyk7Ci0gICAgICBlbmQ7Ci0KLSAgICAgIGlmICh0cm5zX0ZyYW1lZCBpbiBsYXllcmVkKSB0aGVuIGJlZ2luCi0gICAgICAgIHRyYW5zIDo9IFRGcmFtZWRUcmFuc3BvcnRJbXBsLkNyZWF0ZSggdHJhbnMgKTsKLSAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJ1VzaW5nIGZyYW1lZCB0cmFuc3BvcnQnKTsKLSAgICAgIGVuZDsKLQotICAgICAgaWYgVXNlU1NMIHRoZW4gYmVnaW4KLSAgICAgICAgcmFpc2UgRXhjZXB0aW9uLkNyZWF0ZSgnU1NMIG5vdCBpbXBsZW1lbnRlZCcpOwotICAgICAgZW5kOwotCi0gICAgICAvLyBjcmVhdGUgcHJvdG9jb2wgaW5zdGFuY2UsIGRlZmF1bHQgdG8gQmluYXJ5UHJvdG9jb2wKLSAgICAgIGNhc2UgcHJvdFR5cGUgb2YKLSAgICAgICAgcHJvdF9CaW5hcnkgIDogIHByb3QgOj0gVEJpbmFyeVByb3RvY29sSW1wbC5DcmVhdGUoIHRyYW5zLCBCSU5BUllfU1RSSUNUX1JFQUQsIEJJTkFSWV9TVFJJQ1RfV1JJVEUpOwotICAgICAgICBwcm90X0pTT04gICAgOiAgcHJvdCA6PSBUSlNPTlByb3RvY29sSW1wbC5DcmVhdGUoIHRyYW5zKTsKLSAgICAgICAgcHJvdF9Db21wYWN0IDogIHByb3QgOj0gVENvbXBhY3RQcm90b2NvbEltcGwuQ3JlYXRlKCB0cmFucyk7Ci0gICAgICBlbHNlCi0gICAgICAgIHJhaXNlIEV4Y2VwdGlvbi5DcmVhdGUoJ1VuaGFuZGxlZCBwcm90b2NvbCcpOwotICAgICAgZW5kOwotICAgICAgQVNTRVJUKCB0cmFucyA8PiBuaWwpOwotICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoVEhSSUZUX1BST1RPQ09MU1twcm90VHlwZV0rJyBwcm90b2NvbCcpOwotCi0gICAgICB0aHJlYWQgOj0gVENsaWVudFRocmVhZC5DcmVhdGUoIHRyYW5zLCBwcm90LCBGTnVtSXRlcmF0aW9uKTsKKyAgICBmb3IgdGVzdCA6PSAwIHRvIEZOdW1UaHJlYWQgLSAxIGRvIGJlZ2luCisgICAgICB0aHJlYWQgOj0gVENsaWVudFRocmVhZC5DcmVhdGUoIHNldHVwLCBGTnVtSXRlcmF0aW9uKTsKICAgICAgIHRocmVhZHNbdGVzdF0gOj0gdGhyZWFkOwogICAgICAgdGhyZWFkLlN0YXJ0OwogICAgIGVuZDsKIAogICAgIHJlc3VsdCA6PSAwOwogICAgIGZvciB0ZXN0IDo9IDAgdG8gRk51bVRocmVhZCAtIDEgZG8gYmVnaW4KLSAgICAgIHJlc3VsdCA6PSByZXN1bHQgb3IgdGhyZWFkc1t0ZXN0XS5XYWl0Rm9yOworICAgICAgdGhyZWFkRXhpdENvZGUgOj0gdGhyZWFkc1t0ZXN0XS5XYWl0Rm9yOworICAgICAgcmVzdWx0IDo9IHJlc3VsdCBvciB0aHJlYWRFeGl0Q29kZTsKKyAgICAgIHRocmVhZHNbdGVzdF0uRnJlZTsKKyAgICAgIHRocmVhZHNbdGVzdF0gOj0gbmlsOwogICAgIGVuZDsKIAotICAgIGZvciB0ZXN0IDo9IDAgdG8gRk51bVRocmVhZCAtIDEKLSAgICBkbyB0aHJlYWRzW3Rlc3RdLkZyZWU7Ci0KICAgICBDb25zb2xlLldyaXRlKCdUb3RhbCB0aW1lOiAnICsgSW50VG9TdHIoIE1pbGxpU2Vjb25kc0JldHdlZW4oTm93LCBkdFN0YXJ0KSkpOwogCiAgIGV4Y2VwdApAQCAtNDM4LDE1ICs0MTksMTcgQEAKICAgYXJnMyA6IElUaHJpZnREaWN0aW9uYXJ5PFNtYWxsSW50LCBzdHJpbmc+OwogICBhcmc0IDogVE51bWJlcno7CiAgIGFyZzUgOiBJbnQ2NDsKKyAgeyRJRkRFRiBQZXJmVGVzdH0KICAgU3RhcnRUaWNrIDogQ2FyZGluYWw7CiAgIGsgOiBJbnRlZ2VyOwotICBwcm9jIDogVFRocmVhZFByb2NlZHVyZTsKKyAgeyRFTkRJRn0KICAgaGVsbG8sIGdvb2RieWUgOiBJWHRydWN0OwogICBjcmF6eSA6IElJbnNhbml0eTsKICAgbG9vbmV5IDogSUluc2FuaXR5OwogICBmaXJzdF9tYXAgOiBJVGhyaWZ0RGljdGlvbmFyeTxUTnVtYmVyeiwgSUluc2FuaXR5PjsKICAgc2Vjb25kX21hcCA6IElUaHJpZnREaWN0aW9uYXJ5PFROdW1iZXJ6LCBJSW5zYW5pdHk+OwotCisgIHBhaXIgOiBUUGFpcjxUTnVtYmVyeiwgVFVzZXJJZD47CisgIHRlc3RzaXplIDogVFRlc3RTaXplOwogYmVnaW4KICAgY2xpZW50IDo9IFRUaHJpZnRUZXN0LlRDbGllbnQuQ3JlYXRlKCBGUHJvdG9jb2wpOwogICBGVHJhbnNwb3J0Lk9wZW47CkBAIC00NTUsNiArNDM4LDcgQEAKICAgU3RyZXNzVGVzdCggY2xpZW50KTsKICAgeyRFTkRJRiBTdHJlc3NUZXN0fQogCisgIHskSUZERUYgRXhjZXB0aW9uc30KICAgLy8gaW4tZGVwdGggZXhjZXB0aW9uIHRlc3QKICAgLy8gKDEpIGRvIHdlIGdldCBhbiBleGNlcHRpb24gYXQgYWxsPwogICAvLyAoMikgZG8gd2UgZ2V0IHRoZSByaWdodCBleGNlcHRpb24/CkBAIC00NzEsNyArNDU1LDcgQEAKICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCAnID0gJyArIEludFRvU3RyKGUuRXJyb3JDb2RlKSArICcsICcgKyBlLk1lc3NhZ2VfICk7CiAgICAgZW5kOwogICAgIG9uIGU6VFRyYW5zcG9ydEV4Y2VwdGlvbiBkbyBFeHBlY3QoIEZBTFNFLCAnVW5leHBlY3RlZCA6ICInK2UuVG9TdHJpbmcrJyInKTsKLSAgICBvbiBlOkV4Y2VwdGlvbiBkbyBFeHBlY3QoIEZBTFNFLCAnVW5leHBlY3RlZCBleGNlcHRpb24gdHlwZSAiJytlLkNsYXNzTmFtZSsnIicpOworICAgIG9uIGU6RXhjZXB0aW9uIGRvIEV4cGVjdCggRkFMU0UsICdVbmV4cGVjdGVkIGV4Y2VwdGlvbiAiJytlLkNsYXNzTmFtZSsnIjogJytlLk1lc3NhZ2UpOwogICBlbmQ7CiAKICAgLy8gY2FzZSAyOiBleGNlcHRpb24gdHlwZSBOT1QgZGVjbGFyZWQgaW4gSURMIGF0IHRoZSBmdW5jdGlvbiBjYWxsCkBAIC00ODYsMTQgKzQ3MCwxNCBAQAogICAgIG9uIGU6VEFwcGxpY2F0aW9uRXhjZXB0aW9uIGRvIGJlZ2luCiAgICAgICBDb25zb2xlLldyaXRlTGluZSggZS5DbGFzc05hbWUrJyA9ICcrZS5NZXNzYWdlKTsgLy8gdGhpcyBpcyB3aGF0IHdlIGdldAogICAgIGVuZDsKLSAgICBvbiBlOlRFeGNlcHRpb24gZG8gRXhwZWN0KCBGQUxTRSwgJ1VuZXhwZWN0ZWQgZXhjZXB0aW9uIHR5cGUgIicrZS5DbGFzc05hbWUrJyInKTsKLSAgICBvbiBlOkV4Y2VwdGlvbiBkbyBFeHBlY3QoIEZBTFNFLCAnVW5leHBlY3RlZCBleGNlcHRpb24gdHlwZSAiJytlLkNsYXNzTmFtZSsnIicpOworICAgIG9uIGU6VEV4Y2VwdGlvbiBkbyBFeHBlY3QoIEZBTFNFLCAnVW5leHBlY3RlZCBleGNlcHRpb24gIicrZS5DbGFzc05hbWUrJyI6ICcrZS5NZXNzYWdlKTsKKyAgICBvbiBlOkV4Y2VwdGlvbiBkbyBFeHBlY3QoIEZBTFNFLCAnVW5leHBlY3RlZCBleGNlcHRpb24gIicrZS5DbGFzc05hbWUrJyI6ICcrZS5NZXNzYWdlKTsKICAgZW5kOwogCi0gIHsKKwogICBpZiBGVHJhbnNwb3J0LklzT3BlbiB0aGVuIEZUcmFuc3BvcnQuQ2xvc2U7CiAgIEZUcmFuc3BvcnQuT3BlbjsgICAvLyByZS1vcGVuIGNvbm5lY3Rpb24sIHNlcnZlciBoYXMgYWxyZWFkeSBjbG9zZWQKLSAgfQorCiAKICAgLy8gY2FzZSAzOiBubyBleGNlcHRpb24KICAgdHJ5CkBAIC01MDEsOCArNDg1LDkgQEAKICAgICBFeHBlY3QoIFRSVUUsICd0ZXN0RXhjZXB0aW9uKCcnc29tZXRoaW5nJycpOiBtdXN0IG5vdCB0cm93IGFuIGV4Y2VwdGlvbicpOwogICBleGNlcHQKICAgICBvbiBlOlRUcmFuc3BvcnRFeGNlcHRpb24gZG8gRXhwZWN0KCBGQUxTRSwgJ1VuZXhwZWN0ZWQgOiAiJytlLlRvU3RyaW5nKyciJyk7Ci0gICAgb24gZTpFeGNlcHRpb24gZG8gRXhwZWN0KCBGQUxTRSwgJ1VuZXhwZWN0ZWQgZXhjZXB0aW9uICInK2UuQ2xhc3NOYW1lKyciJyk7CisgICAgb24gZTpFeGNlcHRpb24gZG8gRXhwZWN0KCBGQUxTRSwgJ1VuZXhwZWN0ZWQgZXhjZXB0aW9uICInK2UuQ2xhc3NOYW1lKyciOiAnK2UuTWVzc2FnZSk7CiAgIGVuZDsKKyAgeyRFTkRJRiBFeGNlcHRpb25zfQogCiAKICAgLy8gc2ltcGxlIHRoaW5ncwpAQCAtNTE4LDYgKzUwMyw5IEBACiAgIHMgOj0gY2xpZW50LnRlc3RTdHJpbmcoJ1Rlc3QnKTsKICAgRXhwZWN0KCBzID0gJ1Rlc3QnLCAndGVzdFN0cmluZygnJ1Rlc3QnJykgPSAiJytzKyciJyk7CiAKKyAgcyA6PSBjbGllbnQudGVzdFN0cmluZygnJyk7ICAvLyBlbXB0eSBzdHJpbmcKKyAgRXhwZWN0KCBzID0gJycsICd0ZXN0U3RyaW5nKCcnJycpID0gIicrcysnIicpOworCiAgIHMgOj0gY2xpZW50LnRlc3RTdHJpbmcoSFVHRV9URVNUX1NUUklORyk7CiAgIEV4cGVjdCggbGVuZ3RoKHMpID0gbGVuZ3RoKEhVR0VfVEVTVF9TVFJJTkcpLAogICAgICAgICAgICd0ZXN0U3RyaW5nKCBsZW5ndGgoSFVHRV9URVNUX1NUUklORykgPSAnK0ludFRvU3RyKExlbmd0aChIVUdFX1RFU1RfU1RSSU5HKSkrJykgJwpAQCAtNTMzLDE2ICs1MjEsMTkgQEAKICAgaTY0IDo9IGNsaWVudC50ZXN0STY0KC0zNDM1OTczODM2OCk7CiAgIEV4cGVjdCggaTY0ID0gLTM0MzU5NzM4MzY4LCAndGVzdEk2NCgtMzQzNTk3MzgzNjgpID0gJyArIEludFRvU3RyKCBpNjQpKTsKIAotICBiaW5PdXQgOj0gUHJlcGFyZUJpbmFyeURhdGEoIFRSVUUpOwotICBDb25zb2xlLldyaXRlTGluZSgndGVzdEJpbmFyeSgnK0J5dGVzVG9IZXgoYmluT3V0KSsnKScpOwotICB0cnkKLSAgICBiaW5JbiA6PSBjbGllbnQudGVzdEJpbmFyeShiaW5PdXQpOwotICAgIEV4cGVjdCggTGVuZ3RoKGJpbk91dCkgPSBMZW5ndGgoYmluSW4pLCAndGVzdEJpbmFyeSgpOiBsZW5ndGggJytJbnRUb1N0cihMZW5ndGgoYmluT3V0KSkrJyA9ICcrSW50VG9TdHIoTGVuZ3RoKGJpbkluKSkpOwotICAgIGkzMiA6PSBNaW4oIExlbmd0aChiaW5PdXQpLCBMZW5ndGgoYmluSW4pKTsKLSAgICBFeHBlY3QoIENvbXBhcmVNZW0oIGJpbk91dCwgYmluSW4sIGkzMiksICd0ZXN0QmluYXJ5KCcrQnl0ZXNUb0hleChiaW5PdXQpKycpID0gJytCeXRlc1RvSGV4KGJpbkluKSk7Ci0gIGV4Y2VwdAotICAgIG9uIGU6VEFwcGxpY2F0aW9uRXhjZXB0aW9uIGRvIENvbnNvbGUuV3JpdGVMaW5lKCd0ZXN0QmluYXJ5KCk6ICcrZS5NZXNzYWdlKTsKLSAgICBvbiBlOkV4Y2VwdGlvbiBkbyBFeHBlY3QoIEZBTFNFLCAndGVzdEJpbmFyeSgpOiBVbmV4cGVjdGVkIGV4Y2VwdGlvbiAiJytlLkNsYXNzTmFtZSsnIjogJytlLk1lc3NhZ2UpOworICAvLyByYW5kb20gYmluYXJ5IHNtYWxsCisgIGZvciB0ZXN0c2l6ZSA6PSBMb3coVFRlc3RTaXplKSB0byBIaWdoKFRUZXN0U2l6ZSkgZG8gYmVnaW4KKyAgICBiaW5PdXQgOj0gUHJlcGFyZUJpbmFyeURhdGEoIFRSVUUsIHRlc3RzaXplKTsKKyAgICBDb25zb2xlLldyaXRlTGluZSgndGVzdEJpbmFyeSgnK0J5dGVzVG9IZXgoYmluT3V0KSsnKScpOworICAgIHRyeQorICAgICAgYmluSW4gOj0gY2xpZW50LnRlc3RCaW5hcnkoYmluT3V0KTsKKyAgICAgIEV4cGVjdCggTGVuZ3RoKGJpbk91dCkgPSBMZW5ndGgoYmluSW4pLCAndGVzdEJpbmFyeSgpOiBsZW5ndGggJytJbnRUb1N0cihMZW5ndGgoYmluT3V0KSkrJyA9ICcrSW50VG9TdHIoTGVuZ3RoKGJpbkluKSkpOworICAgICAgaTMyIDo9IE1pbiggTGVuZ3RoKGJpbk91dCksIExlbmd0aChiaW5JbikpOworICAgICAgRXhwZWN0KCBDb21wYXJlTWVtKCBiaW5PdXQsIGJpbkluLCBpMzIpLCAndGVzdEJpbmFyeSgnK0J5dGVzVG9IZXgoYmluT3V0KSsnKSA9ICcrQnl0ZXNUb0hleChiaW5JbikpOworICAgIGV4Y2VwdAorICAgICAgb24gZTpUQXBwbGljYXRpb25FeGNlcHRpb24gZG8gQ29uc29sZS5Xcml0ZUxpbmUoJ3Rlc3RCaW5hcnkoKTogJytlLk1lc3NhZ2UpOworICAgICAgb24gZTpFeGNlcHRpb24gZG8gRXhwZWN0KCBGQUxTRSwgJ3Rlc3RCaW5hcnkoKTogVW5leHBlY3RlZCBleGNlcHRpb24gIicrZS5DbGFzc05hbWUrJyI6ICcrZS5NZXNzYWdlKTsKKyAgICBlbmQ7CiAgIGVuZDsKIAogICBDb25zb2xlLldyaXRlTGluZSgndGVzdERvdWJsZSg1LjMyNTA5ODIzNSknKTsKQEAgLTc2OSw5ICs3NjAsOSBAQAogICBpbnNhbmUuVXNlck1hcC5BZGRPclNldFZhbHVlKCBUTnVtYmVyei5GSVZFLCA1MDAwKTsKICAgdHJ1Y2sgOj0gVFh0cnVjdEltcGwuQ3JlYXRlOwogICB0cnVjay5TdHJpbmdfdGhpbmcgOj0gJ1RydWNrJzsKLSAgdHJ1Y2suQnl0ZV90aGluZyA6PSA4OwotICB0cnVjay5JMzJfdGhpbmcgOj0gODsKLSAgdHJ1Y2suSTY0X3RoaW5nIDo9IDg7CisgIHRydWNrLkJ5dGVfdGhpbmcgOj0gLTg7ICAvLyBieXRlIGlzIHNpZ25lZAorICB0cnVjay5JMzJfdGhpbmcgOj0gMzI7CisgIHRydWNrLkk2NF90aGluZyA6PSA2NDsKICAgaW5zYW5lLlh0cnVjdHMgOj0gVFRocmlmdExpc3RJbXBsPElYdHJ1Y3Q+LkNyZWF0ZTsKICAgaW5zYW5lLlh0cnVjdHMuQWRkKCB0cnVjayApOwogICB3aG9hIDo9IGNsaWVudC50ZXN0SW5zYW5pdHkoIGluc2FuZSApOwpAQCAtODIwLDYgKzgxMSwxOCBAQAogICBlbmQ7CiAgIENvbnNvbGUuV3JpdGVMaW5lKCd9Jyk7CiAKKyAgKCoqCisgICAqIFNvIHlvdSB0aGluayB5b3UndmUgZ290IHRoaXMgYWxsIHdvcmtlZCwgb3V0IGVoPworICAgKgorICAgKiBDcmVhdGVzIGEgdGhlIHJldHVybmVkIG1hcCB3aXRoIHRoZXNlIHZhbHVlcyBhbmQgcHJpbnRzIGl0IG91dDoKKyAgICogICB7IDEgPT4geyAyID0+IGFyZ3VtZW50LAorICAgKiAgICAgICAgICAgIDMgPT4gYXJndW1lbnQsCisgICAqICAgICAgICAgIH0sCisgICAqICAgICAyID0+IHsgNiA9PiA8ZW1wdHkgSW5zYW5pdHkgc3RydWN0PiwgfSwKKyAgICogICB9CisgICAqIEByZXR1cm4gbWFwPFVzZXJJZCwgbWFwPE51bWJlcnosSW5zYW5pdHk+PiAtIGEgbWFwIHdpdGggdGhlIGFib3ZlIHZhbHVlcworICAgKikKKwogICAvLyB2ZXJpZnkgcmVzdWx0IGRhdGEKICAgRXhwZWN0KCB3aG9hLkNvdW50ID0gMiwgJ3dob2EuQ291bnQgPSAnK0ludFRvU3RyKHdob2EuQ291bnQpKTsKICAgLy8KQEAgLTg0MCwzMSArODQzLDIwIEBACiAgICAgRXhwZWN0KCBjcmF6eS5fX2lzc2V0X1VzZXJNYXAsICdjcmF6eS5fX2lzc2V0X1VzZXJNYXAgPSAnK0Jvb2xUb1N0cmluZyhjcmF6eS5fX2lzc2V0X1VzZXJNYXApKTsKICAgICBFeHBlY3QoIGNyYXp5Ll9faXNzZXRfWHRydWN0cywgJ2NyYXp5Ll9faXNzZXRfWHRydWN0cyA9ICcrQm9vbFRvU3RyaW5nKGNyYXp5Ll9faXNzZXRfWHRydWN0cykpOwogCi0gICAgRXhwZWN0KCBjcmF6eS5Vc2VyTWFwLkNvdW50ID0gMiwgJ2NyYXp5LlVzZXJNYXAuQ291bnQgPSAnK0ludFRvU3RyKGNyYXp5LlVzZXJNYXAuQ291bnQpKTsKLSAgICBFeHBlY3QoIGNyYXp5LlVzZXJNYXBbVE51bWJlcnouRklWRV0gPSA1LCAnY3JhenkuVXNlck1hcFtUTnVtYmVyei5GSVZFXSA9ICcrSW50VG9TdHIoY3JhenkuVXNlck1hcFtUTnVtYmVyei5GSVZFXSkpOwotICAgIEV4cGVjdCggY3JhenkuVXNlck1hcFtUTnVtYmVyei5FSUdIVF0gPSA4LCAnY3JhenkuVXNlck1hcFtUTnVtYmVyei5FSUdIVF0gPSAnK0ludFRvU3RyKGNyYXp5LlVzZXJNYXBbVE51bWJlcnouRUlHSFRdKSk7CisgICAgRXhwZWN0KCBjcmF6eS5Vc2VyTWFwLkNvdW50ID0gaW5zYW5lLlVzZXJNYXAuQ291bnQsICdjcmF6eS5Vc2VyTWFwLkNvdW50ID0gJytJbnRUb1N0cihjcmF6eS5Vc2VyTWFwLkNvdW50KSk7CisgICAgZm9yIHBhaXIgaW4gaW5zYW5lLlVzZXJNYXAgZG8gYmVnaW4KKyAgICAgIEV4cGVjdCggY3JhenkuVXNlck1hcFtwYWlyLktleV0gPSBwYWlyLlZhbHVlLCAnY3JhenkuVXNlck1hcFsnK0ludFRvU3RyKE9yZChwYWlyLmtleSkpKyddID0gJytJbnRUb1N0cihjcmF6eS5Vc2VyTWFwW3BhaXIuS2V5XSkpOworICAgIGVuZDsKIAotICAgIEV4cGVjdCggY3JhenkuWHRydWN0cy5Db3VudCA9IDIsICdjcmF6eS5YdHJ1Y3RzLkNvdW50ID0gJytJbnRUb1N0cihjcmF6eS5YdHJ1Y3RzLkNvdW50KSk7Ci0gICAgZ29vZGJ5ZSA6PSBjcmF6eS5YdHJ1Y3RzWzBdOyAgLy8gbGlzdHMgYXJlIG9yZGVyZWQsIHNvIHdlIGFyZSBhbGxvd2VkIHRvIGFzc3VtZSB0aGlzIG9yZGVyCi0gICAgICBoZWxsbyAgIDo9IGNyYXp5Llh0cnVjdHNbMV07Ci0KLSAgICBFeHBlY3QoIGdvb2RieWUuU3RyaW5nX3RoaW5nID0gJ0dvb2RieWU0JywgJ2dvb2RieWUuU3RyaW5nX3RoaW5nID0gIicrZ29vZGJ5ZS5TdHJpbmdfdGhpbmcrJyInKTsKLSAgICBFeHBlY3QoIGdvb2RieWUuQnl0ZV90aGluZyA9IDQsICdnb29kYnllLkJ5dGVfdGhpbmcgPSAnK0ludFRvU3RyKGdvb2RieWUuQnl0ZV90aGluZykpOwotICAgIEV4cGVjdCggZ29vZGJ5ZS5JMzJfdGhpbmcgPSA0LCAnZ29vZGJ5ZS5JMzJfdGhpbmcgPSAnK0ludFRvU3RyKGdvb2RieWUuSTMyX3RoaW5nKSk7Ci0gICAgRXhwZWN0KCBnb29kYnllLkk2NF90aGluZyA9IDQsICdnb29kYnllLkk2NF90aGluZyA9ICcrSW50VG9TdHIoZ29vZGJ5ZS5JNjRfdGhpbmcpKTsKLSAgICBFeHBlY3QoIGdvb2RieWUuX19pc3NldF9TdHJpbmdfdGhpbmcsICdnb29kYnllLl9faXNzZXRfU3RyaW5nX3RoaW5nID0gJytCb29sVG9TdHJpbmcoZ29vZGJ5ZS5fX2lzc2V0X1N0cmluZ190aGluZykpOwotICAgIEV4cGVjdCggZ29vZGJ5ZS5fX2lzc2V0X0J5dGVfdGhpbmcsICdnb29kYnllLl9faXNzZXRfQnl0ZV90aGluZyA9ICcrQm9vbFRvU3RyaW5nKGdvb2RieWUuX19pc3NldF9CeXRlX3RoaW5nKSk7Ci0gICAgRXhwZWN0KCBnb29kYnllLl9faXNzZXRfSTMyX3RoaW5nLCAnZ29vZGJ5ZS5fX2lzc2V0X0kzMl90aGluZyA9ICcrQm9vbFRvU3RyaW5nKGdvb2RieWUuX19pc3NldF9JMzJfdGhpbmcpKTsKLSAgICBFeHBlY3QoIGdvb2RieWUuX19pc3NldF9JNjRfdGhpbmcsICdnb29kYnllLl9faXNzZXRfSTY0X3RoaW5nID0gJytCb29sVG9TdHJpbmcoZ29vZGJ5ZS5fX2lzc2V0X0k2NF90aGluZykpOwotCi0gICAgRXhwZWN0KCBoZWxsby5TdHJpbmdfdGhpbmcgPSAnSGVsbG8yJywgJ2hlbGxvLlN0cmluZ190aGluZyA9ICInK2hlbGxvLlN0cmluZ190aGluZysnIicpOwotICAgIEV4cGVjdCggaGVsbG8uQnl0ZV90aGluZyA9IDIsICdoZWxsby5CeXRlX3RoaW5nID0gJytJbnRUb1N0cihoZWxsby5CeXRlX3RoaW5nKSk7Ci0gICAgRXhwZWN0KCBoZWxsby5JMzJfdGhpbmcgPSAyLCAnaGVsbG8uSTMyX3RoaW5nID0gJytJbnRUb1N0cihoZWxsby5JMzJfdGhpbmcpKTsKLSAgICBFeHBlY3QoIGhlbGxvLkk2NF90aGluZyA9IDIsICdoZWxsby5JNjRfdGhpbmcgPSAnK0ludFRvU3RyKGhlbGxvLkk2NF90aGluZykpOwotICAgIEV4cGVjdCggaGVsbG8uX19pc3NldF9TdHJpbmdfdGhpbmcsICdoZWxsby5fX2lzc2V0X1N0cmluZ190aGluZyA9ICcrQm9vbFRvU3RyaW5nKGhlbGxvLl9faXNzZXRfU3RyaW5nX3RoaW5nKSk7Ci0gICAgRXhwZWN0KCBoZWxsby5fX2lzc2V0X0J5dGVfdGhpbmcsICdoZWxsby5fX2lzc2V0X0J5dGVfdGhpbmcgPSAnK0Jvb2xUb1N0cmluZyhoZWxsby5fX2lzc2V0X0J5dGVfdGhpbmcpKTsKLSAgICBFeHBlY3QoIGhlbGxvLl9faXNzZXRfSTMyX3RoaW5nLCAnaGVsbG8uX19pc3NldF9JMzJfdGhpbmcgPSAnK0Jvb2xUb1N0cmluZyhoZWxsby5fX2lzc2V0X0kzMl90aGluZykpOwotICAgIEV4cGVjdCggaGVsbG8uX19pc3NldF9JNjRfdGhpbmcsICdoZWxsby5fX2lzc2V0X0k2NF90aGluZyA9ICcrQm9vbFRvU3RyaW5nKGhlbGxvLl9faXNzZXRfSTY0X3RoaW5nKSk7CisgICAgRXhwZWN0KCBjcmF6eS5YdHJ1Y3RzLkNvdW50ID0gaW5zYW5lLlh0cnVjdHMuQ291bnQsICdjcmF6eS5YdHJ1Y3RzLkNvdW50ID0gJytJbnRUb1N0cihjcmF6eS5YdHJ1Y3RzLkNvdW50KSk7CisgICAgZm9yIGFyZzAgOj0gMCB0byBpbnNhbmUuWHRydWN0cy5Db3VudC0xIGRvIGJlZ2luCisgICAgICBoZWxsbyAgIDo9IGluc2FuZS5YdHJ1Y3RzW2FyZzBdOworICAgICAgZ29vZGJ5ZSA6PSBjcmF6eS5YdHJ1Y3RzW2FyZzBdOworICAgICAgRXhwZWN0KCBnb29kYnllLlN0cmluZ190aGluZyA9IGhlbGxvLlN0cmluZ190aGluZywgJ2dvb2RieWUuU3RyaW5nX3RoaW5nID0gJytnb29kYnllLlN0cmluZ190aGluZyk7CisgICAgICBFeHBlY3QoIGdvb2RieWUuQnl0ZV90aGluZyA9IGhlbGxvLkJ5dGVfdGhpbmcsICdnb29kYnllLkJ5dGVfdGhpbmcgPSAnK0ludFRvU3RyKGdvb2RieWUuQnl0ZV90aGluZykpOworICAgICAgRXhwZWN0KCBnb29kYnllLkkzMl90aGluZyA9IGhlbGxvLkkzMl90aGluZywgJ2dvb2RieWUuSTMyX3RoaW5nID0gJytJbnRUb1N0cihnb29kYnllLkkzMl90aGluZykpOworICAgICAgRXhwZWN0KCBnb29kYnllLkk2NF90aGluZyA9IGhlbGxvLkk2NF90aGluZywgJ2dvb2RieWUuSTY0X3RoaW5nID0gJytJbnRUb1N0cihnb29kYnllLkk2NF90aGluZykpOworICAgIGVuZDsKICAgZW5kOwogCiAKQEAgLTkwNCw3ICs4OTYsNyBAQAogICAgIEV4cGVjdCggbm90IGkuX19pc3NldF9JNjRfdGhpbmcsICdpLl9faXNzZXRfSTY0X3RoaW5nID0gJytCb29sVG9TdHJpbmcoaS5fX2lzc2V0X0k2NF90aGluZykpOwogICAgIH0KICAgZXhjZXB0Ci0gICAgb24gZTpFeGNlcHRpb24gZG8gRXhwZWN0KCBGQUxTRSwgJ1VuZXhwZWN0ZWQgZXhjZXB0aW9uICInK2UuQ2xhc3NOYW1lKyciJyk7CisgICAgb24gZTpFeGNlcHRpb24gZG8gRXhwZWN0KCBGQUxTRSwgJ1VuZXhwZWN0ZWQgZXhjZXB0aW9uICInK2UuQ2xhc3NOYW1lKyciOiAnK2UuTWVzc2FnZSk7CiAgIGVuZDsKIAogICBTdGFydFRlc3RHcm91cCggJ3Rlc3RNdWx0aUV4Y2VwdGlvbihYY2VwdGlvbiknLCB0ZXN0X0V4Y2VwdGlvbnMpOwpAQCAtOTE4LDcgKzkxMCw3IEBACiAgICAgICBFeHBlY3QoIHguRXJyb3JDb2RlID0gMTAwMSwgJ3guRXJyb3JDb2RlID0gJytJbnRUb1N0cih4LkVycm9yQ29kZSkpOwogICAgICAgRXhwZWN0KCB4Lk1lc3NhZ2VfID0gJ1RoaXMgaXMgYW4gWGNlcHRpb24nLCAneC5NZXNzYWdlID0gIicreC5NZXNzYWdlXysnIicpOwogICAgIGVuZDsKLSAgICBvbiBlOkV4Y2VwdGlvbiBkbyBFeHBlY3QoIEZBTFNFLCAnVW5leHBlY3RlZCBleGNlcHRpb24gIicrZS5DbGFzc05hbWUrJyInKTsKKyAgICBvbiBlOkV4Y2VwdGlvbiBkbyBFeHBlY3QoIEZBTFNFLCAnVW5leHBlY3RlZCBleGNlcHRpb24gIicrZS5DbGFzc05hbWUrJyI6ICcrZS5NZXNzYWdlKTsKICAgZW5kOwogCiAgIFN0YXJ0VGVzdEdyb3VwKCAndGVzdE11bHRpRXhjZXB0aW9uKFhjZXB0aW9uMiknLCB0ZXN0X0V4Y2VwdGlvbnMpOwpAQCAtOTM4LDcgKzkzMCw3IEBACiAgICAgICBFeHBlY3QoIG5vdCB4LlN0cnVjdF90aGluZy5fX2lzc2V0X0k2NF90aGluZywgJ3guU3RydWN0X3RoaW5nLl9faXNzZXRfSTY0X3RoaW5nID0gJytCb29sVG9TdHJpbmcoeC5TdHJ1Y3RfdGhpbmcuX19pc3NldF9JNjRfdGhpbmcpKTsKICAgICAgIH0KICAgICBlbmQ7Ci0gICAgb24gZTpFeGNlcHRpb24gZG8gRXhwZWN0KCBGQUxTRSwgJ1VuZXhwZWN0ZWQgZXhjZXB0aW9uICInK2UuQ2xhc3NOYW1lKyciJyk7CisgICAgb24gZTpFeGNlcHRpb24gZG8gRXhwZWN0KCBGQUxTRSwgJ1VuZXhwZWN0ZWQgZXhjZXB0aW9uICInK2UuQ2xhc3NOYW1lKyciOiAnK2UuTWVzc2FnZSk7CiAgIGVuZDsKIAogCkBAIC05NTAsNyArOTQyLDcgQEAKICAgLy8gY2FsbCB0aW1lCiAgIHskSUZERUYgUGVyZlRlc3R9CiAgIFN0YXJ0VGVzdEdyb3VwKCAnVGVzdCBDYWxsdGltZSgpJyk7Ci0gIFN0YXJ0VGljayA6PSBHZXRUSWNrQ291bnQ7CisgIFN0YXJ0VGljayA6PSBHZXRUaWNrQ291bnQ7CiAgIGZvciBrIDo9IDAgdG8gMTAwMCAtIDEgZG8KICAgYmVnaW4KICAgICBjbGllbnQudGVzdFZvaWQoKTsKQEAgLTk2Myw2ICs5NTUsMzMgQEAKIGVuZDsKIAogCit7JElGREVGIFN1cHBvcnRzQXN5bmN9Citwcm9jZWR1cmUgVENsaWVudFRocmVhZC5DbGllbnRBc3luY1Rlc3Q7Cit2YXIKKyAgY2xpZW50IDogVFRocmlmdFRlc3QuSUFzeW5jOworICBzIDogc3RyaW5nOworICBpOCA6IFNob3J0SW50OworYmVnaW4KKyAgU3RhcnRUZXN0R3JvdXAoICdBc3luYyBUZXN0cycsIHRlc3RfVW5rbm93bik7CisgIGNsaWVudCA6PSBUVGhyaWZ0VGVzdC5UQ2xpZW50LkNyZWF0ZSggRlByb3RvY29sKTsKKyAgRlRyYW5zcG9ydC5PcGVuOworCisgIC8vIG9uZXdheSB2b2lkIGZ1bmN0aW9ucworICBjbGllbnQudGVzdE9uZXdheUFzeW5jKDEpLldhaXQ7CisgIEV4cGVjdCggVFJVRSwgJ1Rlc3QgT25ld2F5KDEpJyk7ICAvLyBzdWNjZXNzIDo9IG5vIGV4Y2VwdGlvbgorCisgIC8vIG5vcm1hbCBmdW5jdGlvbnMKKyAgcyA6PSBjbGllbnQudGVzdFN0cmluZ0FzeW5jKEhVR0VfVEVTVF9TVFJJTkcpLlZhbHVlOworICBFeHBlY3QoIGxlbmd0aChzKSA9IGxlbmd0aChIVUdFX1RFU1RfU1RSSU5HKSwKKyAgICAgICAgICAndGVzdFN0cmluZyggbGVuZ3RoKEhVR0VfVEVTVF9TVFJJTkcpID0gJytJbnRUb1N0cihMZW5ndGgoSFVHRV9URVNUX1NUUklORykpKycpICcKKyAgICAgICAgICsnPT4gbGVuZ3RoKHJlc3VsdCkgPSAnK0ludFRvU3RyKExlbmd0aChzKSkpOworCisgIGk4IDo9IGNsaWVudC50ZXN0Qnl0ZSgxKS5WYWx1ZTsKKyAgRXhwZWN0KCBpOCA9IDEsICd0ZXN0Qnl0ZSgxKSA9ICcgKyBJbnRUb1N0ciggaTggKSk7CitlbmQ7Cit7JEVORElGfQorCisKIHskSUZERUYgU3RyZXNzVGVzdH0KIHByb2NlZHVyZSBUQ2xpZW50VGhyZWFkLlN0cmVzc1Rlc3QoY29uc3QgY2xpZW50IDogVFRocmlmdFRlc3QuSWZhY2UpOwogYmVnaW4KQEAgLTk4MywzMyArMTAwMiw0OSBAQAogeyRFTkRJRn0KIAogCi1mdW5jdGlvbiBUQ2xpZW50VGhyZWFkLlByZXBhcmVCaW5hcnlEYXRhKCBhUmFuZG9tRGlzdCA6IEJvb2xlYW4gPSBGQUxTRSkgOiBUQnl0ZXM7Ci12YXIgaSwgbmV4dFBvcyA6IEludGVnZXI7CitmdW5jdGlvbiBUQ2xpZW50VGhyZWFkLlByZXBhcmVCaW5hcnlEYXRhKCBhUmFuZG9tRGlzdCA6IEJvb2xlYW47IGFTaXplIDogVFRlc3RTaXplKSA6IFRCeXRlczsKK3ZhciBpIDogSW50ZWdlcjsKIGJlZ2luCi0gIFNldExlbmd0aCggcmVzdWx0LCAkMTAwKTsKKyAgY2FzZSBhU2l6ZSBvZgorICAgIEVtcHR5ICAgICAgICAgIDogU2V0TGVuZ3RoKCByZXN1bHQsIDApOworICAgIE5vcm1hbCAgICAgICAgIDogU2V0TGVuZ3RoKCByZXN1bHQsICQxMDApOworICAgIEJ5dGVBcnJheVRlc3QgIDogU2V0TGVuZ3RoKCByZXN1bHQsIFNpemVPZihUQnl0ZUFycmF5KSArIDEyOCk7CisgICAgUGlwZVdyaXRlTGltaXQgOiBTZXRMZW5ndGgoIHJlc3VsdCwgNjU1MzUgKyAxMjgpOworICBlbHNlCisgICAgcmFpc2UgRUFyZ3VtZW50RXhjZXB0aW9uLkNyZWF0ZSgnYVNpemUnKTsKKyAgZW5kOworCiAgIEFTU0VSVCggTG93KHJlc3VsdCkgPSAwKTsKKyAgaWYgTGVuZ3RoKHJlc3VsdCkgPSAwIHRoZW4gRXhpdDsKIAogICAvLyBsaW5lYXIgZGlzdHJpYnV0aW9uLCB1bmxlc3MgcmFuZG9tIGlzIHJlcXVlc3RlZAogICBpZiBub3QgYVJhbmRvbURpc3QgdGhlbiBiZWdpbgogICAgIGZvciBpIDo9IExvdyhyZXN1bHQpIHRvIEhpZ2gocmVzdWx0KSBkbyBiZWdpbgotICAgICAgcmVzdWx0W2ldIDo9IGk7CisgICAgICByZXN1bHRbaV0gOj0gaSBtb2QgJDEwMDsKICAgICBlbmQ7CiAgICAgRXhpdDsKICAgZW5kOwogCiAgIC8vIHJhbmRvbSBkaXN0cmlidXRpb24gb2YgYWxsIDI1NiB2YWx1ZXMKICAgRmlsbENoYXIoIHJlc3VsdFswXSwgTGVuZ3RoKHJlc3VsdCkgKiBTaXplT2YocmVzdWx0WzBdKSwgJDApOwotICBpIDo9IDE7Ci0gIHdoaWxlIGkgPCBMZW5ndGgocmVzdWx0KSBkbyBiZWdpbgotICAgIG5leHRQb3MgOj0gQnl0ZSggUmFuZG9tKCQxMDApKTsKLSAgICBpZiByZXN1bHRbbmV4dFBvc10gPSAwIHRoZW4gYmVnaW4gIC8vIHVudXNlZD8KLSAgICAgIHJlc3VsdFtuZXh0UG9zXSA6PSBpOwotICAgICAgSW5jKGkpOwotICAgIGVuZDsKKyAgZm9yIGkgOj0gTG93KHJlc3VsdCkgdG8gSGlnaChyZXN1bHQpIGRvIGJlZ2luCisgICAgcmVzdWx0W2ldIDo9IEJ5dGUoIFJhbmRvbSgkMTAwKSk7CiAgIGVuZDsKIGVuZDsKIAogCit7JElGREVGIFdpbjY0fQorcHJvY2VkdXJlIFRDbGllbnRUaHJlYWQuVXNlSW50ZXJsb2NrZWRFeGNoYW5nZUFkZDY0OwordmFyIGEsYiA6IEludDY0OworYmVnaW4KKyAgYSA6PSAxOworICBiIDo9IDI7CisgIFRocmlmdC5VdGlscy5JbnRlcmxvY2tlZEV4Y2hhbmdlQWRkNjQoIGEsYik7CisgIEV4cGVjdCggYSA9IDMsICdJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkNjQnKTsKK2VuZDsKK3skRU5ESUZ9CisKKwogcHJvY2VkdXJlIFRDbGllbnRUaHJlYWQuSlNPTlByb3RvY29sUmVhZFdyaXRlVGVzdDsKIC8vIFRlc3RzIG9ubHkgdGhlbiByZWFkL3dyaXRlIHByb2NlZHVyZXMgb2YgdGhlIEpTT04gcHJvdG9jb2wKIC8vIEFsbCB0ZXN0cyBzdWNjZWVkLCBpZiB3ZSBjYW4gcmVhZCB3aGF0IHdlIHdyb3RlIGJlZm9yZQpAQCAtMTAxNyw4ICsxMDUyLDggQEAKIC8vIG90aGVyIGNsaWVudHMgb3Igc2VydmVycyBleHBlY3QgYXMgdGhlIHJlYWwgSlNPTi4gVGhpcyBpcyBiZXlvbmQgdGhlIHNjb3BlIG9mIHRoaXMgdGVzdC4KIHZhciBwcm90ICAgOiBJUHJvdG9jb2w7CiAgICAgc3RtICAgIDogVFN0cmluZ1N0cmVhbTsKLSAgICBsaXN0ICAgOiBJTGlzdDsKLSAgICBiaW5hcnksIGJpblJlYWQgOiBUQnl0ZXM7CisgICAgbGlzdCAgIDogVFRocmlmdExpc3Q7CisgICAgYmluYXJ5LCBiaW5SZWFkLCBlbXB0eUJpbmFyeSA6IFRCeXRlczsKICAgICBpLGlFcnIgOiBJbnRlZ2VyOwogY29uc3QKICAgVEVTVF9TSE9SVCAgID0gU2hvcnRJbnQoICRGRSk7CkBAIC0xMDI4LDkgKzEwNjMsOSBAQAogICBURVNUX0RPVUJMRSAgPSAtMS4yMzRlLTU2OwogICBERUxUQV9ET1VCTEUgPSBURVNUX0RPVUJMRSAqIDFlLTE0OwogICBURVNUX1NUUklORyAgPSAnYWJjLScjJDAwRTQjJDAwZjYjJDAwZmM7IC8vIGdlcm1hbiB1bWxhdXRzIChlbi11czogImZ1bm55IGNoYXJzIikKLSAgLy8gVGVzdCBUSFJJRlQtMjMzNiB3aXRoICfQoNGD0YHRgdC60L7QtSDQndCw0LfQstCw0L3QuNC1JzsKLSAgUlVTU0lBTl9URVhUID0gIyQwNDIwIyQwNDQzIyQwNDQxIyQwNDQxIyQwNDNhIyQwNDNlIyQwNDM1JyAnIyQwNDFkIyQwNDMwIyQwNDM3IyQwNDMyIyQwNDMwIyQwNDNkIyQwNDM4IyQwNDM1OwotICBSVVNTSUFOX0pTT04gPSAnIlx1MDQyMFx1MDQ0M1x1MDQ0MVx1MDQ0MVx1MDQzYVx1MDQzZVx1MDQzNSBcdTA0MWRcdTA0MzBcdTA0MzdcdTA0MzJcdTA0MzBcdTA0M2RcdTA0MzhcdTA0MzUiJzsKKyAgLy8gVGVzdCBUSFJJRlQtMjMzNiBhbmQgVEhSSUZULTM0MDQgd2l0aCBVKzFEMTFFIChHIENsZWYgc3ltYm9sKSBhbmQgJ9Cg0YPRgdGB0LrQvtC1INCd0LDQt9Cy0LDQvdC40LUnOworICBHX0NMRUZfQU5EX0NZUklMTElDX1RFWFQgPSAjJDFkMTFlJyAnIyQwNDIwIyQwNDQzIyQwNDQxIyQwNDQxIyQwNDNhIyQwNDNlIyQwNDM1JyAnIyQwNDFkIyQwNDMwIyQwNDM3IyQwNDMyIyQwNDMwIyQwNDNkIyQwNDM4IyQwNDM1OworICBHX0NMRUZfQU5EX0NZUklMTElDX0pTT04gPSAnIlx1ZDgzNFx1ZGQxZSBcdTA0MjBcdTA0NDNcdTA0NDFcdTA0NDFcdTA0M2FcdTA0M2VcdTA0MzUgXHUwNDFkXHUwNDMwXHUwNDM3XHUwNDMyXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1Iic7CiAgIC8vIHRlc3QgYm90aCBwb3NzaWJsZSBzb2xpZHVzIGVuY29kaW5ncwogICBTT0xJRFVTX0pTT05fREFUQSA9ICcib25lL3R3b1wvdGhyZWUiJzsKICAgU09MSURVU19FWENQRUNURUQgPSAnb25lL3R3by90aHJlZSc7CkBAIC0xMDQwLDcgKzEwNzUsOCBAQAogICAgIFN0YXJ0VGVzdEdyb3VwKCAnSnNvblByb3RvY29sVGVzdCcsIHRlc3RfVW5rbm93bik7CiAKICAgICAvLyBwcmVwYXJlIGJpbmFyeSBkYXRhCi0gICAgYmluYXJ5IDo9IFByZXBhcmVCaW5hcnlEYXRhKCBGQUxTRSk7CisgICAgYmluYXJ5IDo9IFByZXBhcmVCaW5hcnlEYXRhKCBGQUxTRSwgTm9ybWFsKTsKKyAgICBTZXRMZW5ndGgoIGVtcHR5QmluYXJ5LCAwKTsgLy8gZW1wdHkgYmluYXJ5IGRhdGEgYmxvY2sKIAogICAgIC8vIG91dHB1dCBzZXR1cAogICAgIHByb3QgOj0gVEpTT05Qcm90b2NvbEltcGwuQ3JlYXRlKApAQCAtMTA0OCw3ICsxMDg0LDggQEAKICAgICAgICAgICAgICAgICBuaWwsIFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpLkNyZWF0ZSggc3RtLCBGQUxTRSkpKTsKIAogICAgIC8vIHdyaXRlCi0gICAgcHJvdC5Xcml0ZUxpc3RCZWdpbiggVExpc3RJbXBsLkNyZWF0ZSggVFR5cGUuU3RyaW5nXywgOSkpOworICAgIEluaXQoIGxpc3QsIFRUeXBlLlN0cmluZ18sIDkpOworICAgIHByb3QuV3JpdGVMaXN0QmVnaW4oIGxpc3QpOwogICAgIHByb3QuV3JpdGVCb29sKCBUUlVFKTsKICAgICBwcm90LldyaXRlQm9vbCggRkFMU0UpOwogICAgIHByb3QuV3JpdGVCeXRlKCBURVNUX1NIT1JUKTsKQEAgLTEwNTgsNiArMTA5NSw4IEBACiAgICAgcHJvdC5Xcml0ZURvdWJsZSggVEVTVF9ET1VCTEUpOwogICAgIHByb3QuV3JpdGVTdHJpbmcoIFRFU1RfU1RSSU5HKTsKICAgICBwcm90LldyaXRlQmluYXJ5KCBiaW5hcnkpOworICAgIHByb3QuV3JpdGVTdHJpbmcoICcnKTsgIC8vIGVtcHR5IHN0cmluZworICAgIHByb3QuV3JpdGVCaW5hcnkoIGVtcHR5QmluYXJ5KTsgLy8gZW1wdHkgYmluYXJ5IGRhdGEgYmxvY2sKICAgICBwcm90LldyaXRlTGlzdEVuZDsKIAogICAgIC8vIGlucHV0IHNldHVwCkBAIC0xMDgwLDYgKzExMTksOCBAQAogICAgIEV4cGVjdCggYWJzKHByb3QuUmVhZERvdWJsZS1URVNUX0RPVUJMRSkgPCBhYnMoREVMVEFfRE9VQkxFKSwgJ1dyaXRlRG91YmxlL1JlYWREb3VibGUnKTsKICAgICBFeHBlY3QoIHByb3QuUmVhZFN0cmluZyA9IFRFU1RfU1RSSU5HLCAnV3JpdGVTdHJpbmcvUmVhZFN0cmluZycpOwogICAgIGJpblJlYWQgOj0gcHJvdC5SZWFkQmluYXJ5OworICAgIEV4cGVjdCggTGVuZ3RoKHByb3QuUmVhZFN0cmluZykgPSAwLCAnV3JpdGVTdHJpbmcvUmVhZFN0cmluZyAoZW1wdHkgc3RyaW5nKScpOworICAgIEV4cGVjdCggTGVuZ3RoKHByb3QuUmVhZEJpbmFyeSkgPSAwLCAnZW1wdHkgV3JpdGVCaW5hcnkvUmVhZEJpbmFyeSAoZW1wdHkgZGF0YSBibG9jayknKTsKICAgICBwcm90LlJlYWRMaXN0RW5kOwogCiAgICAgLy8gdGVzdCBiaW5hcnkgZGF0YQpAQCAtMTExNywyMiArMTE1OCwyMiBAQAogICAgIHByb3QgOj0gVEpTT05Qcm90b2NvbEltcGwuQ3JlYXRlKAogICAgICAgICAgICAgICBUU3RyZWFtVHJhbnNwb3J0SW1wbC5DcmVhdGUoCiAgICAgICAgICAgICAgICAgbmlsLCBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5DcmVhdGUoIHN0bSwgRkFMU0UpKSk7Ci0gICAgcHJvdC5Xcml0ZVN0cmluZyggUlVTU0lBTl9URVhUKTsKKyAgICBwcm90LldyaXRlU3RyaW5nKCBHX0NMRUZfQU5EX0NZUklMTElDX1RFWFQpOwogICAgIHN0bS5Qb3NpdGlvbiA6PSAwOwogICAgIHByb3QgOj0gVEpTT05Qcm90b2NvbEltcGwuQ3JlYXRlKAogICAgICAgICAgICAgICBUU3RyZWFtVHJhbnNwb3J0SW1wbC5DcmVhdGUoCiAgICAgICAgICAgICAgICAgVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuQ3JlYXRlKCBzdG0sIEZBTFNFKSwgbmlsKSk7Ci0gICAgRXhwZWN0KCBwcm90LlJlYWRTdHJpbmcgPSBSVVNTSUFOX1RFWFQsICdXcml0aW5nIEpTT04gd2l0aCBjaGFycyA+IDggYml0Jyk7CisgICAgRXhwZWN0KCBwcm90LlJlYWRTdHJpbmcgPSBHX0NMRUZfQU5EX0NZUklMTElDX1RFWFQsICdXcml0aW5nIEpTT04gd2l0aCBjaGFycyA+IDggYml0Jyk7CiAKICAgICAvLyBXaWRlY2hhcnMgc2hvdWxkIHdvcmsgd2l0aCBoZXgtZW5jb2RpbmcgdG9vLiBEbyB0aGV5PwogICAgIHN0bS5Qb3NpdGlvbiA6PSAwOwogICAgIHN0bS5TaXplICAgICA6PSAwOwotICAgIHN0bS5Xcml0ZVN0cmluZyggUlVTU0lBTl9KU09OKTsKKyAgICBzdG0uV3JpdGVTdHJpbmcoIEdfQ0xFRl9BTkRfQ1lSSUxMSUNfSlNPTik7CiAgICAgc3RtLlBvc2l0aW9uIDo9IDA7CiAgICAgcHJvdCA6PSBUSlNPTlByb3RvY29sSW1wbC5DcmVhdGUoCiAgICAgICAgICAgICAgIFRTdHJlYW1UcmFuc3BvcnRJbXBsLkNyZWF0ZSgKICAgICAgICAgICAgICAgICBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5DcmVhdGUoIHN0bSwgRkFMU0UpLCBuaWwpKTsKLSAgICBFeHBlY3QoIHByb3QuUmVhZFN0cmluZyA9IFJVU1NJQU5fVEVYVCwgJ1JlYWRpbmcgSlNPTiB3aXRoIGNoYXJzID4gOCBiaXQnKTsKKyAgICBFeHBlY3QoIHByb3QuUmVhZFN0cmluZyA9IEdfQ0xFRl9BTkRfQ1lSSUxMSUNfVEVYVCwgJ1JlYWRpbmcgSlNPTiB3aXRoIGNoYXJzID4gOCBiaXQnKTsKIAogCiAgIGZpbmFsbHkKQEAgLTExNzIsNyArMTIxMyw4IEBACiAgICAgLy8gV2UgaGF2ZSBhIGZhaWxlZCB0ZXN0IQogICAgIC8vIC0+IGlzc3VlIERlYnVnQnJlYWsgT05MWSBpZiBhIGRlYnVnZ2VyIGlzIGF0dGFjaGVkLAogICAgIC8vIC0+IHVuaGFuZGxlZCBEZWJ1Z0JyZWFrcyB3b3VsZCBjYXVzZSBXaW5kb3dzIHRvIHRlcm1pbmF0ZSB0aGUgYXBwIG90aGVyd2lzZQotICAgIGlmIElzRGVidWdnZXJQcmVzZW50IHRoZW4gYXNtIGludCAzIGVuZDsKKyAgICBpZiBJc0RlYnVnZ2VyUHJlc2VudAorICAgIHRoZW4geyRJRkRFRiBDUFVYNjR9IERlYnVnQnJlYWsgeyRFTFNFfSBhc20gaW50IDMgZW5kIHskRU5ESUZ9OwogICBlbmQ7CiBlbmQ7CiAKQEAgLTEyMTUsMTIgKzEyNTcsMTEgQEAKIGVuZDsKIAogCi1jb25zdHJ1Y3RvciBUQ2xpZW50VGhyZWFkLkNyZWF0ZSggY29uc3QgQVRyYW5zcG9ydDogSVRyYW5zcG9ydDsgY29uc3QgQVByb3RvY29sIDogSVByb3RvY29sOyBBTnVtSXRlcmF0aW9uOiBJbnRlZ2VyKTsKK2NvbnN0cnVjdG9yIFRDbGllbnRUaHJlYWQuQ3JlYXRlKCBjb25zdCBhU2V0dXAgOiBUVGVzdFNldHVwOyBjb25zdCBhTnVtSXRlcmF0aW9uOiBJbnRlZ2VyKTsKIGJlZ2luCi0gIGluaGVyaXRlZCBDcmVhdGUoIFRydWUgKTsKKyAgRlNldHVwIDo9IGFTZXR1cDsKICAgRk51bUl0ZXJhdGlvbiA6PSBBTnVtSXRlcmF0aW9uOwotICBGVHJhbnNwb3J0IDo9IEFUcmFuc3BvcnQ7Ci0gIEZQcm90b2NvbCA6PSBBUHJvdG9jb2w7CisKICAgRkNvbnNvbGUgOj0gVFRocmVhZENvbnNvbGUuQ3JlYXRlKCBTZWxmICk7CiAgIEZDdXJyZW50VGVzdCA6PSB0ZXN0X1Vua25vd247CiAKQEAgLTEyMjgsNiArMTI2OSw4IEBACiAgIEZFcnJvcnMgOj0gVFN0cmluZ0xpc3QuQ3JlYXRlOwogICBGRXJyb3JzLlNvcnRlZCA6PSBGQUxTRTsKICAgRkVycm9ycy5EdXBsaWNhdGVzIDo9IGR1cEFjY2VwdDsKKworICBpbmhlcml0ZWQgQ3JlYXRlKCBUUlVFKTsKIGVuZDsKIAogZGVzdHJ1Y3RvciBUQ2xpZW50VGhyZWFkLkRlc3Ryb3k7CkBAIC0xMjQwLDM0ICsxMjgzLDEzNiBAQAogcHJvY2VkdXJlIFRDbGllbnRUaHJlYWQuRXhlY3V0ZTsKIHZhcgogICBpIDogSW50ZWdlcjsKLSAgcHJvYyA6IFRUaHJlYWRQcm9jZWR1cmU7CiBiZWdpbgogICAvLyBwZXJmb3JtIGFsbCB0ZXN0cwogICB0cnkKKyAgICB7JElGREVGIFdpbjY0fQorICAgIFVzZUludGVybG9ja2VkRXhjaGFuZ2VBZGQ2NDsKKyAgICB7JEVORElGfQogICAgIEpTT05Qcm90b2NvbFJlYWRXcml0ZVRlc3Q7Ci0gICAgZm9yIGkgOj0gMCB0byBGTnVtSXRlcmF0aW9uIC0gMSBkbwotICAgIGJlZ2luCi0gICAgICBDbGllbnRUZXN0OworCisgICAgLy8gbXVzdCBiZSBydW4gaW4gdGhlIGNvbnRleHQgb2YgdGhlIHRocmVhZAorICAgIEluaXRpYWxpemVQcm90b2NvbFRyYW5zcG9ydFN0YWNrOworICAgIHRyeQorICAgICAgZm9yIGkgOj0gMCB0byBGTnVtSXRlcmF0aW9uIC0gMSBkbyBiZWdpbgorICAgICAgICBDbGllbnRUZXN0OworICAgICAgICB7JElGREVGIFN1cHBvcnRzQXN5bmN9CisgICAgICAgIENsaWVudEFzeW5jVGVzdDsKKyAgICAgICAgeyRFTkRJRn0KKyAgICAgIGVuZDsKKworICAgICAgLy8gcmVwb3J0IHRoZSBvdXRjb21lCisgICAgICBSZXBvcnRSZXN1bHRzOworICAgICAgU2V0UmV0dXJuVmFsdWUoIENhbGN1bGF0ZUV4aXRDb2RlKTsKKworICAgIGZpbmFsbHkKKyAgICAgIFNodXRkb3duUHJvdG9jb2xUcmFuc3BvcnRTdGFjazsKICAgICBlbmQ7CisKICAgZXhjZXB0CiAgICAgb24gZTpFeGNlcHRpb24gZG8gRXhwZWN0KCBGQUxTRSwgJ3VuZXhwZWN0ZWQgZXhjZXB0aW9uOiAiJytlLm1lc3NhZ2UrJyInKTsKICAgZW5kOworZW5kOwogCi0gIC8vIHJlcG9ydCB0aGUgb3V0Y29tZQotICBSZXBvcnRSZXN1bHRzOwotICBTZXRSZXR1cm5WYWx1ZSggQ2FsY3VsYXRlRXhpdENvZGUpOwogCi0gIC8vIHNodXRkb3duCi0gIHByb2MgOj0gcHJvY2VkdXJlCi0gIGJlZ2luCi0gICAgaWYgRlRyYW5zcG9ydCA8PiBuaWwgdGhlbgotICAgIGJlZ2luCitwcm9jZWR1cmUgVENsaWVudFRocmVhZC5Jbml0aWFsaXplUHJvdG9jb2xUcmFuc3BvcnRTdGFjazsKK3ZhcgorICBzdHJlYW10cmFucyA6IElTdHJlYW1UcmFuc3BvcnQ7CisgIGh0dHAgOiBJSFRUUENsaWVudDsKKyAgc1VybCA6IHN0cmluZzsKK2NvbnN0CisgIERFQlVHX1RJTUVPVVQgICA9IDMwICogMTAwMDsKKyAgUkVMRUFTRV9USU1FT1VUID0gREVGQVVMVF9USFJJRlRfVElNRU9VVDsKKyAgUElQRV9USU1FT1VUICAgID0gUkVMRUFTRV9USU1FT1VUOworICBIVFRQX1RJTUVPVVRTICAgPSAxMCAqIDEwMDA7CitiZWdpbgorICAvLyBuZWVkZWQgZm9yIEhUVFAgY2xpZW50cyBhcyB0aGV5IHV0aWxpemUgdGhlIE1TWE1MIENPTSBjb21wb25lbnRzCisgIE9sZUNoZWNrKCBDb0luaXRpYWxpemUoIG5pbCkpOworCisgIGNhc2UgRlNldHVwLmVuZHBvaW50IG9mCisgICAgdHJuc19Tb2NrZXRzOiBiZWdpbgorICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJ1VzaW5nIHNvY2tldHMgKCcrRlNldHVwLmhvc3QrJyBwb3J0ICcrSW50VG9TdHIoRlNldHVwLnBvcnQpKycpJyk7CisgICAgICBzdHJlYW10cmFucyA6PSBUU29ja2V0SW1wbC5DcmVhdGUoIEZTZXR1cC5ob3N0LCBGU2V0dXAucG9ydCApOworICAgICAgRlRyYW5zcG9ydCA6PSBzdHJlYW10cmFuczsKKyAgICBlbmQ7CisKKyAgICB0cm5zX0h0dHA6IGJlZ2luCisgICAgICBDb25zb2xlLldyaXRlTGluZSgnVXNpbmcgSFRUUENsaWVudCcpOworICAgICAgaWYgRlNldHVwLnVzZVNTTAorICAgICAgdGhlbiBzVXJsIDo9ICdodHRwOi8vJworICAgICAgZWxzZSBzVXJsIDo9ICdodHRwczovLyc7CisgICAgICBzVXJsIDo9IHNVcmwgKyBGU2V0dXAuaG9zdDsKKyAgICAgIGNhc2UgRlNldHVwLnBvcnQgb2YKKyAgICAgICAgODAgIDogaWYgRlNldHVwLnVzZVNTTCB0aGVuIHNVcmwgOj0gc1VybCArICc6JysgSW50VG9TdHIoRlNldHVwLnBvcnQpOworICAgICAgICA0NDMgOiBpZiBub3QgRlNldHVwLnVzZVNTTCB0aGVuIHNVcmwgOj0gc1VybCArICc6JysgSW50VG9TdHIoRlNldHVwLnBvcnQpOworICAgICAgZWxzZQorICAgICAgICBpZiBGU2V0dXAucG9ydCA+IDAgdGhlbiBzVXJsIDo9IHNVcmwgKyAnOicrIEludFRvU3RyKEZTZXR1cC5wb3J0KTsKKyAgICAgIGVuZDsKKyAgICAgIGh0dHAgOj0gVEhUVFBDbGllbnRJbXBsLkNyZWF0ZSggc1VybCk7CisgICAgICBodHRwLkRuc1Jlc29sdmVUaW1lb3V0IDo9IEhUVFBfVElNRU9VVFM7CisgICAgICBodHRwLkNvbm5lY3Rpb25UaW1lb3V0IDo9IEhUVFBfVElNRU9VVFM7CisgICAgICBodHRwLlNlbmRUaW1lb3V0ICAgICAgIDo9IEhUVFBfVElNRU9VVFM7CisgICAgICBodHRwLlJlYWRUaW1lb3V0ICAgICAgIDo9IEhUVFBfVElNRU9VVFM7CisgICAgICBGVHJhbnNwb3J0IDo9IGh0dHA7CisgICAgZW5kOworCisgICAgdHJuc19Fdkh0dHA6IGJlZ2luCisgICAgICByYWlzZSBFeGNlcHRpb24uQ3JlYXRlKEVORFBPSU5UX1RSQU5TUE9SVFNbRlNldHVwLmVuZHBvaW50XSsnIHRyYW5zcG9ydCBub3QgaW1wbGVtZW50ZWQnKTsKKyAgICBlbmQ7CisKKyAgICB0cm5zX05hbWVkUGlwZXM6IGJlZ2luCisgICAgICBzdHJlYW10cmFucyA6PSBUTmFtZWRQaXBlVHJhbnNwb3J0Q2xpZW50RW5kSW1wbC5DcmVhdGUoIEZTZXR1cC5zUGlwZU5hbWUsIDAsIG5pbCwgUElQRV9USU1FT1VULCBQSVBFX1RJTUVPVVQpOworICAgICAgRlRyYW5zcG9ydCA6PSBzdHJlYW10cmFuczsKKyAgICBlbmQ7CisKKyAgICB0cm5zX0Fub25QaXBlczogYmVnaW4KKyAgICAgIHN0cmVhbXRyYW5zIDo9IFRBbm9ueW1vdXNQaXBlVHJhbnNwb3J0SW1wbC5DcmVhdGUoIEZTZXR1cC5oQW5vblJlYWQsIEZTZXR1cC5oQW5vbldyaXRlLCBGQUxTRSk7CisgICAgICBGVHJhbnNwb3J0IDo9IHN0cmVhbXRyYW5zOworICAgIGVuZDsKKworICBlbHNlCisgICAgcmFpc2UgRXhjZXB0aW9uLkNyZWF0ZSgnVW5oYW5kbGVkIGVuZHBvaW50IHRyYW5zcG9ydCcpOworICBlbmQ7CisgIEFTU0VSVCggRlRyYW5zcG9ydCA8PiBuaWwpOworCisgIC8vIGxheWVyZWQgdHJhbnNwb3J0cyBhcmUgbm90IHJlYWxseSBtZWFudCB0byBiZSBzdGFja2VkIHVwb24gZWFjaCBvdGhlcgorICBpZiAodHJuc19GcmFtZWQgaW4gRlNldHVwLmxheWVyZWQpIHRoZW4gYmVnaW4KKyAgICBGVHJhbnNwb3J0IDo9IFRGcmFtZWRUcmFuc3BvcnRJbXBsLkNyZWF0ZSggRlRyYW5zcG9ydCk7CisgIGVuZAorICBlbHNlIGlmICh0cm5zX0J1ZmZlcmVkIGluIEZTZXR1cC5sYXllcmVkKSBhbmQgKHN0cmVhbXRyYW5zIDw+IG5pbCkgdGhlbiBiZWdpbgorICAgIEZUcmFuc3BvcnQgOj0gVEJ1ZmZlcmVkVHJhbnNwb3J0SW1wbC5DcmVhdGUoIHN0cmVhbXRyYW5zLCAzMik7ICAvLyBzbWFsbCBidWZmZXIgdG8gdGVzdCByZWFkKCkKKyAgZW5kOworCisgIGlmIEZTZXR1cC51c2VTU0wgdGhlbiBiZWdpbgorICAgIHJhaXNlIEV4Y2VwdGlvbi5DcmVhdGUoJ1NTTC9UTFMgbm90IGltcGxlbWVudGVkJyk7CisgIGVuZDsKKworICAvLyBjcmVhdGUgcHJvdG9jb2wgaW5zdGFuY2UsIGRlZmF1bHQgdG8gQmluYXJ5UHJvdG9jb2wKKyAgY2FzZSBGU2V0dXAucHJvdFR5cGUgb2YKKyAgICBwcm90X0JpbmFyeSAgOiAgRlByb3RvY29sIDo9IFRCaW5hcnlQcm90b2NvbEltcGwuQ3JlYXRlKCBGVHJhbnNwb3J0LCBCSU5BUllfU1RSSUNUX1JFQUQsIEJJTkFSWV9TVFJJQ1RfV1JJVEUpOworICAgIHByb3RfSlNPTiAgICA6ICBGUHJvdG9jb2wgOj0gVEpTT05Qcm90b2NvbEltcGwuQ3JlYXRlKCBGVHJhbnNwb3J0KTsKKyAgICBwcm90X0NvbXBhY3QgOiAgRlByb3RvY29sIDo9IFRDb21wYWN0UHJvdG9jb2xJbXBsLkNyZWF0ZSggRlRyYW5zcG9ydCk7CisgIGVsc2UKKyAgICByYWlzZSBFeGNlcHRpb24uQ3JlYXRlKCdVbmhhbmRsZWQgcHJvdG9jb2wnKTsKKyAgZW5kOworCisgIEFTU0VSVCggKEZUcmFuc3BvcnQgPD4gbmlsKSBhbmQgKEZQcm90b2NvbCA8PiBuaWwpKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVENsaWVudFRocmVhZC5TaHV0ZG93blByb3RvY29sVHJhbnNwb3J0U3RhY2s7CitiZWdpbgorICB0cnkKKyAgICBGUHJvdG9jb2wgOj0gbmlsOworCisgICAgaWYgRlRyYW5zcG9ydCA8PiBuaWwgdGhlbiBiZWdpbgogICAgICAgRlRyYW5zcG9ydC5DbG9zZTsKICAgICAgIEZUcmFuc3BvcnQgOj0gbmlsOwogICAgIGVuZDsKLSAgZW5kOwogCi0gIFN5bmNocm9uaXplKCBwcm9jICk7CisgIGZpbmFsbHkKKyAgICBDb1VuaW5pdGlhbGl6ZTsKKyAgZW5kOwogZW5kOwogCiAKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9UZXN0U2VydmVyLnBhcyBiL2xpYi9kZWxwaGkvdGVzdC9UZXN0U2VydmVyLnBhcwppbmRleCAwMTgyODJjLi42OWNiMTc1IDEwMDY0NAotLS0gYS9saWIvZGVscGhpL3Rlc3QvVGVzdFNlcnZlci5wYXMKKysrIGIvbGliL2RlbHBoaS90ZXN0L1Rlc3RTZXJ2ZXIucGFzCkBAIC0xOSw2ICsxOSw3IEBACiAKIHVuaXQgVGVzdFNlcnZlcjsKIAoreyRJIC4uL3NyYy9UaHJpZnQuRGVmaW5lcy5pbmN9CiB7JFdBUk4gU1lNQk9MX1BMQVRGT1JNIE9GRn0KIAogey4kREVGSU5FIFJ1bkVuZGxlc3N9ICAgLy8gYWN0aXZhdGUgdG8gaW50ZXJhY3RpdmVseSBzdHJlc3MtdGVzdCB0aGUgc2VydmVyIHN0b3Agcm91dGluZXMgdmlhIEN0cmwrQwpAQCAtMjgsNyArMjksNiBAQAogdXNlcwogICBXaW5kb3dzLCBTeXNVdGlscywKICAgR2VuZXJpY3MuQ29sbGVjdGlvbnMsCi0gIFRocmlmdC5Db25zb2xlLAogICBUaHJpZnQuU2VydmVyLAogICBUaHJpZnQuVHJhbnNwb3J0LAogICBUaHJpZnQuVHJhbnNwb3J0LlBpcGVzLApAQCAtNDEsNiArNDEsNyBAQAogICBUaHJpZnQsCiAgIFRlc3RDb25zdGFudHMsCiAgIFRlc3RTZXJ2ZXJFdmVudHMsCisgIENvbnNvbGVIZWxwZXIsCiAgIENvbnRucnM7CiAKIHR5cGUKQEAgLTE2Myw3ICsxNjQsNyBAQAogCiAgIGlmIChhcmcgPSAnVEV4Y2VwdGlvbicpIHRoZW4KICAgYmVnaW4KLSAgICByYWlzZSBURXhjZXB0aW9uLkNyZWF0ZSgnJyk7CisgICAgcmFpc2UgVEV4Y2VwdGlvbi5DcmVhdGUoJ1RFeGNlcHRpb24nKTsKICAgZW5kOwogCiAgIC8vIGVsc2UgZG8gbm90IHRocm93IGFueXRoaW5nCkBAIC0xODQsNDQgKzE4NSwzMyBAQAogZnVuY3Rpb24gVFRlc3RTZXJ2ZXIuVFRlc3RIYW5kbGVySW1wbC50ZXN0SW5zYW5pdHkoCiAgIGNvbnN0IGFyZ3VtZW50OiBJSW5zYW5pdHkpOiBJVGhyaWZ0RGljdGlvbmFyeTxJbnQ2NCwgSVRocmlmdERpY3Rpb25hcnk8VE51bWJlcnosIElJbnNhbml0eT4+OwogdmFyCi0gIGhlbGxvLCBnb29kYnllIDogSVh0cnVjdDsKLSAgY3JhenkgOiBJSW5zYW5pdHk7CiAgIGxvb25leSA6IElJbnNhbml0eTsKICAgZmlyc3RfbWFwIDogSVRocmlmdERpY3Rpb25hcnk8VE51bWJlcnosIElJbnNhbml0eT47CiAgIHNlY29uZF9tYXAgOiBJVGhyaWZ0RGljdGlvbmFyeTxUTnVtYmVyeiwgSUluc2FuaXR5PjsKICAgaW5zYW5lIDogSVRocmlmdERpY3Rpb25hcnk8SW50NjQsIElUaHJpZnREaWN0aW9uYXJ5PFROdW1iZXJ6LCBJSW5zYW5pdHk+PjsKIAogYmVnaW4KLQogICBDb25zb2xlLldyaXRlTGluZSgndGVzdEluc2FuaXR5KCknKTsKLSAgaGVsbG8gOj0gVFh0cnVjdEltcGwuQ3JlYXRlOwotICBoZWxsby5TdHJpbmdfdGhpbmcgOj0gJ0hlbGxvMic7Ci0gIGhlbGxvLkJ5dGVfdGhpbmcgOj0gMjsKLSAgaGVsbG8uSTMyX3RoaW5nIDo9IDI7Ci0gIGhlbGxvLkk2NF90aGluZyA6PSAyOwogCi0gIGdvb2RieWUgOj0gVFh0cnVjdEltcGwuQ3JlYXRlOwotICBnb29kYnllLlN0cmluZ190aGluZyA6PSAnR29vZGJ5ZTQnOwotICBnb29kYnllLkJ5dGVfdGhpbmcgOj0gNDsKLSAgZ29vZGJ5ZS5JMzJfdGhpbmcgOj0gNDsKLSAgZ29vZGJ5ZS5JNjRfdGhpbmcgOj0gNDsKLQotICBjcmF6eSA6PSBUSW5zYW5pdHlJbXBsLkNyZWF0ZTsKLSAgY3JhenkuVXNlck1hcCA6PSBUVGhyaWZ0RGljdGlvbmFyeUltcGw8VE51bWJlcnosIEludDY0Pi5DcmVhdGU7Ci0gIGNyYXp5LlVzZXJNYXAuQWRkT3JTZXRWYWx1ZSggVE51bWJlcnouRUlHSFQsIDgpOwotICBjcmF6eS5YdHJ1Y3RzIDo9IFRUaHJpZnRMaXN0SW1wbDxJWHRydWN0Pi5DcmVhdGU7Ci0gIGNyYXp5Llh0cnVjdHMuQWRkKGdvb2RieWUpOwotCi0gIGxvb25leSA6PSBUSW5zYW5pdHlJbXBsLkNyZWF0ZTsKLSAgY3JhenkuVXNlck1hcC5BZGRPclNldFZhbHVlKCBUTnVtYmVyei5GSVZFLCA1KTsKLSAgY3JhenkuWHRydWN0cy5BZGQoaGVsbG8pOworICAoKioKKyAgICogU28geW91IHRoaW5rIHlvdSd2ZSBnb3QgdGhpcyBhbGwgd29ya2VkLCBvdXQgZWg/CisgICAqCisgICAqIENyZWF0ZXMgYSB0aGUgcmV0dXJuZWQgbWFwIHdpdGggdGhlc2UgdmFsdWVzIGFuZCBwcmludHMgaXQgb3V0OgorICAgKiAgIHsgMSA9PiB7IDIgPT4gYXJndW1lbnQsCisgICAqICAgICAgICAgICAgMyA9PiBhcmd1bWVudCwKKyAgICogICAgICAgICAgfSwKKyAgICogICAgIDIgPT4geyA2ID0+IDxlbXB0eSBJbnNhbml0eSBzdHJ1Y3Q+LCB9LAorICAgKiAgIH0KKyAgICogQHJldHVybiBtYXA8VXNlcklkLCBtYXA8TnVtYmVyeixJbnNhbml0eT4+IC0gYSBtYXAgd2l0aCB0aGUgYWJvdmUgdmFsdWVzCisgICAqKQogCiAgIGZpcnN0X21hcCA6PSBUVGhyaWZ0RGljdGlvbmFyeUltcGw8VE51bWJlcnosIElJbnNhbml0eT4uQ3JlYXRlOwogICBzZWNvbmRfbWFwIDo9IFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxUTnVtYmVyeiwgSUluc2FuaXR5Pi5DcmVhdGU7CiAKLSAgZmlyc3RfbWFwLkFkZE9yU2V0VmFsdWUoIFROdW1iZXJ6LlRXTywgY3JhenkpOwotICBmaXJzdF9tYXAuQWRkT3JTZXRWYWx1ZSggVE51bWJlcnouVEhSRUUsIGNyYXp5KTsKKyAgZmlyc3RfbWFwLkFkZE9yU2V0VmFsdWUoIFROdW1iZXJ6LlRXTywgYXJndW1lbnQpOworICBmaXJzdF9tYXAuQWRkT3JTZXRWYWx1ZSggVE51bWJlcnouVEhSRUUsIGFyZ3VtZW50KTsKIAorICBsb29uZXkgOj0gVEluc2FuaXR5SW1wbC5DcmVhdGU7CiAgIHNlY29uZF9tYXAuQWRkT3JTZXRWYWx1ZSggVE51bWJlcnouU0lYLCBsb29uZXkpOwogCiAgIGluc2FuZSA6PSBUVGhyaWZ0RGljdGlvbmFyeUltcGw8SW50NjQsIElUaHJpZnREaWN0aW9uYXJ5PFROdW1iZXJ6LCBJSW5zYW5pdHk+Pi5DcmVhdGU7CkBAIC02NjEsNyArNjUxLDcgQEAKICAgICAgIGVuZDsKIAogICAgICAgdHJuc19IdHRwIDogYmVnaW4KLSAgICAgICAgcmFpc2UgRXhjZXB0aW9uLkNyZWF0ZSgnSFRUUCBzZXJ2ZXIgdHJhbnNwb3J0IG5vdCBpbXBsZW1lbnRlZCcpOworICAgICAgICByYWlzZSBFeGNlcHRpb24uQ3JlYXRlKEVORFBPSU5UX1RSQU5TUE9SVFNbZW5kcG9pbnRdKycgc2VydmVyIHRyYW5zcG9ydCBub3QgaW1wbGVtZW50ZWQnKTsKICAgICAgIGVuZDsKIAogICAgICAgdHJuc19OYW1lZFBpcGVzIDogYmVnaW4KZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9UZXN0U2VydmVyRXZlbnRzLnBhcyBiL2xpYi9kZWxwaGkvdGVzdC9UZXN0U2VydmVyRXZlbnRzLnBhcwppbmRleCAyZTc3NmQyLi4yMjA4Y2Q0IDEwMDY0NAotLS0gYS9saWIvZGVscGhpL3Rlc3QvVGVzdFNlcnZlckV2ZW50cy5wYXMKKysrIGIvbGliL2RlbHBoaS90ZXN0L1Rlc3RTZXJ2ZXJFdmVudHMucGFzCkBAIC0yNyw3ICsyNyw3IEBACiAgIFRocmlmdC5Qcm90b2NvbCwKICAgVGhyaWZ0LlRyYW5zcG9ydCwKICAgVGhyaWZ0LlNlcnZlciwKLSAgVGhyaWZ0LkNvbnNvbGU7CisgIENvbnNvbGVIZWxwZXI7CiAKIHR5cGUKICAgVFJlcXVlc3RFdmVudHNJbXBsID0gY2xhc3MoIFRJbnRlcmZhY2VkT2JqZWN0LCBJUmVxdWVzdEV2ZW50cykKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9jbGllbnQuZHByIGIvbGliL2RlbHBoaS90ZXN0L2NsaWVudC5kcHIKaW5kZXggNjllNDRjMi4uMDZkYmQzZCAxMDA2NDQKLS0tIGEvbGliL2RlbHBoaS90ZXN0L2NsaWVudC5kcHIKKysrIGIvbGliL2RlbHBoaS90ZXN0L2NsaWVudC5kcHIKQEAgLTI4LDE0ICsyOCwxNiBAQAogICBUaHJpZnQuVGVzdCwgLy8gaW4gJ2dlbi1kZWxwaGlcVGhyaWZ0LlRlc3QucGFzJywKICAgVGhyaWZ0IGluICcuLlxzcmNcVGhyaWZ0LnBhcycsCiAgIFRocmlmdC5UcmFuc3BvcnQgaW4gJy4uXHNyY1xUaHJpZnQuVHJhbnNwb3J0LnBhcycsCisgIFRocmlmdC5Tb2NrZXQgaW4gJy4uXHNyY1xUaHJpZnQuU29ja2V0LnBhcycsCisgIFRocmlmdC5FeGNlcHRpb24gaW4gJy4uXHNyY1xUaHJpZnQuRXhjZXB0aW9uLnBhcycsCiAgIFRocmlmdC5UcmFuc3BvcnQuUGlwZXMgaW4gJy4uXHNyY1xUaHJpZnQuVHJhbnNwb3J0LlBpcGVzLnBhcycsCiAgIFRocmlmdC5Qcm90b2NvbCBpbiAnLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5wYXMnLAogICBUaHJpZnQuUHJvdG9jb2wuSlNPTiBpbiAnLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5KU09OLnBhcycsCiAgIFRocmlmdC5Qcm90b2NvbC5Db21wYWN0IGluICcuLlxzcmNcVGhyaWZ0LlByb3RvY29sLkNvbXBhY3QucGFzJywKKyAgVGhyaWZ0LlByb3RvY29sLk11bHRpcGxleCBpbiAnLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5NdWx0aXBsZXgucGFzJywKICAgVGhyaWZ0LkNvbGxlY3Rpb25zIGluICcuLlxzcmNcVGhyaWZ0LkNvbGxlY3Rpb25zLnBhcycsCiAgIFRocmlmdC5TZXJ2ZXIgaW4gJy4uXHNyY1xUaHJpZnQuU2VydmVyLnBhcycsCiAgIFRocmlmdC5TdHJlYW0gaW4gJy4uXHNyY1xUaHJpZnQuU3RyZWFtLnBhcycsCi0gIFRocmlmdC5Db25zb2xlIGluICcuLlxzcmNcVGhyaWZ0LkNvbnNvbGUucGFzJywKICAgVGhyaWZ0LlR5cGVSZWdpc3RyeSBpbiAnLi5cc3JjXFRocmlmdC5UeXBlUmVnaXN0cnkucGFzJywKICAgVGhyaWZ0LlV0aWxzIGluICcuLlxzcmNcVGhyaWZ0LlV0aWxzLnBhcyc7CiAKQEAgLTQ0LDE5ICs0NiwxOSBAQAogICBhcmdzIDogYXJyYXkgb2Ygc3RyaW5nOwogICBpIDogSW50ZWdlcjsKICAgYXJnIDogc3RyaW5nOwotICBzIDogc3RyaW5nOwogCiBiZWdpbgogICB0cnkKICAgICBXcml0ZWxuKCAnRGVscGhpIFRlc3RDbGllbnQgJytUaHJpZnQuVmVyc2lvbik7CiAgICAgblBhcmFtQ291bnQgOj0gUGFyYW1Db3VudDsKICAgICBTZXRMZW5ndGgoIGFyZ3MsIG5QYXJhbUNvdW50KTsKLSAgICBmb3IgaSA6PSAxIHRvIG5QYXJhbUNvdW50IGRvCi0gICAgYmVnaW4KKyAgICBmb3IgaSA6PSAxIHRvIG5QYXJhbUNvdW50IGRvIGJlZ2luCiAgICAgICBhcmcgOj0gUGFyYW1TdHIoIGkgKTsKICAgICAgIGFyZ3NbaS0xXSA6PSBhcmc7CiAgICAgZW5kOworCiAgICAgRXhpdENvZGUgOj0gVFRlc3RDbGllbnQuRXhlY3V0ZSggYXJncyk7CisKICAgZXhjZXB0CiAgICAgb24gRTogRUFib3J0IGRvIGJlZ2luCiAgICAgICBFeGl0Q29kZSA6PSAkRkY7CmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3QvY29kZWdlbi9SZXNlcnZlZEtleXdvcmRzLnRocmlmdCBiL2xpYi9kZWxwaGkvdGVzdC9jb2RlZ2VuL1Jlc2VydmVkS2V5d29yZHMudGhyaWZ0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDBhZGY5Li4wMDAwMDAwCi0tLSBhL2xpYi9kZWxwaGkvdGVzdC9jb2RlZ2VuL1Jlc2VydmVkS2V5d29yZHMudGhyaWZ0CisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBtYWtlIHN1cmUgZ2VuZXJhdGVkIGNvZGUgZG9lcyBub3QgcHJvZHVjZSBuYW1lIGNvbGxpc2lvbnMgd2l0aCBwcmVkZWZpbmVkIGtleXdvcmRzCi0KLQotCi10eXBlZGVmIGkzMiBDYXJkaW5hbAotdHlwZWRlZiBzdHJpbmcgbWVzc2FnZQotdHlwZWRlZiBsaXN0PCBtYXA8IENhcmRpbmFsLCBtZXNzYWdlPj4gcHJvZ3JhbQotCi1zdHJ1Y3QgdW5pdCB7Ci0gIDE6IENhcmRpbmFsIGRvd250bzsKLSAgMjogcHJvZ3JhbSBwcm9jZWR1cmU7Ci19Ci0KLXR5cGVkZWYgc2V0PCB1bml0PiB1bml0cwotCi1leGNlcHRpb24gZXhjZXB0aW9uMSB7Ci0gIDE6IHByb2dyYW0gbWVzc2FnZTsKLSAgMjogdW5pdCBhcnJheTsKLX0KLQotc2VydmljZSBjb25zdHJ1Y3RvciB7Ci0gIHVuaXQgQ3JlYXRlKDE6IENhcmRpbmFsIGFzbTsgMjogbWVzc2FnZSBpbmhlcml0ZWQpIHRocm93cyAoMTogZXhjZXB0aW9uMSBsYWJlbCk7Ci0gIHVuaXRzIERlc3Ryb3koKTsKLX0KLQotY29uc3QgQ2FyZGluYWwgZG93bnRvID0gKzEKLWNvbnN0IENhcmRpbmFsIHB1Ymxpc2hlZCA9IC0xCi0KLWVudW0ga2V5d29yZHMgewotICByZWNvcmQgPSAxLAotICByZXBlYXQgPSAyLAotICBkZXByZWNhdGVkID0gMwotfQotCi0KLQpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L2tleXdvcmRzL1Jlc2VydmVkSW5jbHVkZWQudGhyaWZ0IGIvbGliL2RlbHBoaS90ZXN0L2tleXdvcmRzL1Jlc2VydmVkSW5jbHVkZWQudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNDdhNTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3Rlc3Qva2V5d29yZHMvUmVzZXJ2ZWRJbmNsdWRlZC50aHJpZnQKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBtYWtlIHN1cmUgZ2VuZXJhdGVkIGNvZGUgZG9lcyBub3QgcHJvZHVjZSBuYW1lIGNvbGxpc2lvbnMgd2l0aCBwcmVkZWZpbmVkIGtleXdvcmRzCituYW1lc3BhY2UgZGVscGhpIFN5c1V0aWxzCisKK2NvbnN0IGkzMiBpbnRlZ2VyID0gNDIKKworLy8gRU9GCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3Qva2V5d29yZHMvUmVzZXJ2ZWRLZXl3b3Jkcy5kcHIgYi9saWIvZGVscGhpL3Rlc3Qva2V5d29yZHMvUmVzZXJ2ZWRLZXl3b3Jkcy5kcHIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZiYzhjMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9rZXl3b3Jkcy9SZXNlcnZlZEtleXdvcmRzLmRwcgpAQCAtMCwwICsxLDE1IEBACitwcm9ncmFtIFJlc2VydmVkS2V5d29yZHM7CisKK3skQVBQVFlQRSBDT05TT0xFfQorCit1c2VzCisgIFN5c1V0aWxzLCBTeXN0ZW1fOworCitiZWdpbgorICB0cnkKKyAgICB7IFRPRE8gLW9Vc2VyIC1jQ29uc29sZSBNYWluIDogQ29kZSBoaWVyIGVpbmb8Z2VuIH0KKyAgZXhjZXB0CisgICAgb24gRTogRXhjZXB0aW9uIGRvCisgICAgICBXcml0ZWxuKEUuQ2xhc3NOYW1lLCAnOiAnLCBFLk1lc3NhZ2UpOworICBlbmQ7CitlbmQuCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3Qva2V5d29yZHMvUmVzZXJ2ZWRLZXl3b3Jkcy5kcHJvaiBiL2xpYi9kZWxwaGkvdGVzdC9rZXl3b3Jkcy9SZXNlcnZlZEtleXdvcmRzLmRwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiZDk1NDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3Rlc3Qva2V5d29yZHMvUmVzZXJ2ZWRLZXl3b3Jkcy5kcHJvagpAQCAtMCwwICsxLDExMiBAQAor77u/CTxQcm9qZWN0IHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorCQk8UHJvcGVydHlHcm91cD4KKwkJCTxQcm9qZWN0R3VpZD57RjJFOUI2RkMtQTkzMS00MjcxLThFMzAtNUE0RTQwMjQ4MUI0fTwvUHJvamVjdEd1aWQ+CisJCQk8TWFpblNvdXJjZT5SZXNlcnZlZEtleXdvcmRzLmRwcjwvTWFpblNvdXJjZT4KKwkJCTxQcm9qZWN0VmVyc2lvbj4xMi4zPC9Qcm9qZWN0VmVyc2lvbj4KKwkJCTxCYXNpcz5UcnVlPC9CYXNpcz4KKwkJCTxDb25maWcgQ29uZGl0aW9uPSInJChDb25maWcpJz09JyciPkRlYnVnPC9Db25maWc+CisJCQk8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPgorCQkJPEFwcFR5cGU+Q29uc29sZTwvQXBwVHlwZT4KKwkJCTxGcmFtZXdvcmtUeXBlPk5vbmU8L0ZyYW1ld29ya1R5cGU+CisJCQk8RENDX0RDQ0NvbXBpbGVyPkRDQzMyPC9EQ0NfRENDQ29tcGlsZXI+CisJCTwvUHJvcGVydHlHcm91cD4KKwkJPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWcpJz09J0Jhc2lzJyBvciAnJChCYXNlKSchPScnIj4KKwkJCTxCYXNlPnRydWU8L0Jhc2U+CisJCTwvUHJvcGVydHlHcm91cD4KKwkJPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWcpJz09J0RlYnVnJyBvciAnJChDZmdfMSknIT0nJyI+CisJCQk8Q2ZnXzE+dHJ1ZTwvQ2ZnXzE+CisJCQk8Q2ZnUGFyZW50PkJhc2U8L0NmZ1BhcmVudD4KKwkJCTxCYXNlPnRydWU8L0Jhc2U+CisJCTwvUHJvcGVydHlHcm91cD4KKwkJPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWcpJz09J1JlbGVhc2UnIG9yICckKENmZ18yKSchPScnIj4KKwkJCTxDZmdfMj50cnVlPC9DZmdfMj4KKwkJCTxDZmdQYXJlbnQ+QmFzZTwvQ2ZnUGFyZW50PgorCQkJPEJhc2U+dHJ1ZTwvQmFzZT4KKwkJPC9Qcm9wZXJ0eUdyb3VwPgorCQk8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKEJhc2UpJyE9JyciPgorCQkJPERDQ19JbWFnZUJhc2U+MDA0MDAwMDA8L0RDQ19JbWFnZUJhc2U+CisJCQk8RENDX0RjdU91dHB1dD4uXCQoQ29uZmlnKVwkKFBsYXRmb3JtKTwvRENDX0RjdU91dHB1dD4KKwkJCTxEQ0NfVW5pdFNlYXJjaFBhdGg+Z2VuLWRlbHBoaTsuLlwuLlxzcmM7JChEQ0NfVW5pdFNlYXJjaFBhdGgpPC9EQ0NfVW5pdFNlYXJjaFBhdGg+CisJCQk8RENDX1VuaXRBbGlhcz5XaW5UeXBlcz1XaW5kb3dzO1dpblByb2NzPVdpbmRvd3M7RGJpVHlwZXM9QkRFO0RiaVByb2NzPUJERTskKERDQ19Vbml0QWxpYXMpPC9EQ0NfVW5pdEFsaWFzPgorCQkJPERDQ19FeGVPdXRwdXQ+LlwkKENvbmZpZylcJChQbGF0Zm9ybSk8L0RDQ19FeGVPdXRwdXQ+CisJCQk8RENDX04+ZmFsc2U8L0RDQ19OPgorCQkJPERDQ19TPmZhbHNlPC9EQ0NfUz4KKwkJCTxEQ0NfSz5mYWxzZTwvRENDX0s+CisJCQk8RENDX0U+ZmFsc2U8L0RDQ19FPgorCQkJPERDQ19GPmZhbHNlPC9EQ0NfRj4KKwkJPC9Qcm9wZXJ0eUdyb3VwPgorCQk8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENmZ18xKSchPScnIj4KKwkJCTxEQ0NfRGVmaW5lPkRFQlVHOyQoRENDX0RlZmluZSk8L0RDQ19EZWZpbmU+CisJCQk8RENDX09wdGltaXplPmZhbHNlPC9EQ0NfT3B0aW1pemU+CisJCQk8RENDX0dlbmVyYXRlU3RhY2tGcmFtZXM+dHJ1ZTwvRENDX0dlbmVyYXRlU3RhY2tGcmFtZXM+CisJCTwvUHJvcGVydHlHcm91cD4KKwkJPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDZmdfMiknIT0nJyI+CisJCQk8RENDX0xvY2FsRGVidWdTeW1ib2xzPmZhbHNlPC9EQ0NfTG9jYWxEZWJ1Z1N5bWJvbHM+CisJCQk8RENDX0RlZmluZT5SRUxFQVNFOyQoRENDX0RlZmluZSk8L0RDQ19EZWZpbmU+CisJCQk8RENDX1N5bWJvbFJlZmVyZW5jZUluZm8+MDwvRENDX1N5bWJvbFJlZmVyZW5jZUluZm8+CisJCQk8RENDX0RlYnVnSW5mb3JtYXRpb24+ZmFsc2U8L0RDQ19EZWJ1Z0luZm9ybWF0aW9uPgorCQk8L1Byb3BlcnR5R3JvdXA+CisJCTxJdGVtR3JvdXA+CisJCQk8RGVscGhpQ29tcGlsZSBJbmNsdWRlPSJSZXNlcnZlZEtleXdvcmRzLmRwciI+CisJCQkJPE1haW5Tb3VyY2U+TWFpblNvdXJjZTwvTWFpblNvdXJjZT4KKwkJCTwvRGVscGhpQ29tcGlsZT4KKwkJCTxCdWlsZENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZSI+CisJCQkJPEtleT5DZmdfMjwvS2V5PgorCQkJCTxDZmdQYXJlbnQ+QmFzZTwvQ2ZnUGFyZW50PgorCQkJPC9CdWlsZENvbmZpZ3VyYXRpb24+CisJCQk8QnVpbGRDb25maWd1cmF0aW9uIEluY2x1ZGU9IkJhc2lzIj4KKwkJCQk8S2V5PkJhc2U8L0tleT4KKwkJCTwvQnVpbGRDb25maWd1cmF0aW9uPgorCQkJPEJ1aWxkQ29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1ZyI+CisJCQkJPEtleT5DZmdfMTwvS2V5PgorCQkJCTxDZmdQYXJlbnQ+QmFzZTwvQ2ZnUGFyZW50PgorCQkJPC9CdWlsZENvbmZpZ3VyYXRpb24+CisJCTwvSXRlbUdyb3VwPgorCQk8SW1wb3J0IENvbmRpdGlvbj0iRXhpc3RzKCckKEJEUylcQmluXENvZGVHZWFyLkRlbHBoaS5UYXJnZXRzJykiIFByb2plY3Q9IiQoQkRTKVxCaW5cQ29kZUdlYXIuRGVscGhpLlRhcmdldHMiLz4KKwkJPEltcG9ydCBDb25kaXRpb249IkV4aXN0cygnJChBUFBEQVRBKVxFbWJhcmNhZGVyb1wkKEJEU0FQUERBVEFCQVNFRElSKVwkKFBST0RVQ1RWRVJTSU9OKVxVc2VyVG9vbHMucHJvaicpIiBQcm9qZWN0PSIkKEFQUERBVEEpXEVtYmFyY2FkZXJvXCQoQkRTQVBQREFUQUJBU0VESVIpXCQoUFJPRFVDVFZFUlNJT04pXFVzZXJUb29scy5wcm9qIi8+CisJCTxQcm9wZXJ0eUdyb3VwPgorCQkJPFByZUJ1aWxkRXZlbnQ+PCFbQ0RBVEFbdGhyaWZ0IC1yICAtZ2VuIGRlbHBoaSBSZXNlcnZlZEtleXdvcmRzLnRocmlmdF1dPjwvUHJlQnVpbGRFdmVudD4KKwkJPC9Qcm9wZXJ0eUdyb3VwPgorCQk8UHJvamVjdEV4dGVuc2lvbnM+CisJCQk8Qm9ybGFuZC5QZXJzb25hbGl0eT5EZWxwaGkuUGVyc29uYWxpdHkuMTI8L0JvcmxhbmQuUGVyc29uYWxpdHk+CisJCQk8Qm9ybGFuZC5Qcm9qZWN0VHlwZS8+CisJCQk8Qm9ybGFuZFByb2plY3Q+CisJCQkJPERlbHBoaS5QZXJzb25hbGl0eT4KKwkJCQkJPFZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkluY2x1ZGVWZXJJbmZvIj5GYWxzZTwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iQXV0b0luY0J1aWxkIj5GYWxzZTwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iTWFqb3JWZXIiPjE8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9Ik1pbm9yVmVyIj4wPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJSZWxlYXNlIj4wPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJCdWlsZCI+MDwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iRGVidWciPkZhbHNlPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJQcmVSZWxlYXNlIj5GYWxzZTwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iU3BlY2lhbCI+RmFsc2U8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IlByaXZhdGUiPkZhbHNlPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJETEwiPkZhbHNlPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJMb2NhbGUiPjEwMzE8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkNvZGVQYWdlIj4xMjUyPC9WZXJzaW9uSW5mbz4KKwkJCQkJPC9WZXJzaW9uSW5mbz4KKwkJCQkJPFZlcnNpb25JbmZvS2V5cz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iQ29tcGFueU5hbWUiLz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iRmlsZURlc2NyaXB0aW9uIi8+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9IkZpbGVWZXJzaW9uIj4xLjAuMC4wPC9WZXJzaW9uSW5mb0tleXM+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9IkludGVybmFsTmFtZSIvPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJMZWdhbENvcHlyaWdodCIvPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJMZWdhbFRyYWRlbWFya3MiLz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iT3JpZ2luYWxGaWxlbmFtZSIvPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJQcm9kdWN0TmFtZSIvPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJQcm9kdWN0VmVyc2lvbiI+MS4wLjAuMDwvVmVyc2lvbkluZm9LZXlzPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJDb21tZW50cyIvPgorCQkJCQk8L1ZlcnNpb25JbmZvS2V5cz4KKwkJCQkJPFNvdXJjZT4KKwkJCQkJCTxTb3VyY2UgTmFtZT0iTWFpblNvdXJjZSI+UmVzZXJ2ZWRLZXl3b3Jkcy5kcHI8L1NvdXJjZT4KKwkJCQkJPC9Tb3VyY2U+CisJCQkJPC9EZWxwaGkuUGVyc29uYWxpdHk+CisJCQkJPFBsYXRmb3Jtcz4KKwkJCQkJPFBsYXRmb3JtIHZhbHVlPSJXaW4zMiI+VHJ1ZTwvUGxhdGZvcm0+CisJCQkJPC9QbGF0Zm9ybXM+CisJCQk8L0JvcmxhbmRQcm9qZWN0PgorCQkJPFByb2plY3RGaWxlVmVyc2lvbj4xMjwvUHJvamVjdEZpbGVWZXJzaW9uPgorCQk8L1Byb2plY3RFeHRlbnNpb25zPgorCTwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9rZXl3b3Jkcy9SZXNlcnZlZEtleXdvcmRzLnRocmlmdCBiL2xpYi9kZWxwaGkvdGVzdC9rZXl3b3Jkcy9SZXNlcnZlZEtleXdvcmRzLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjQ5ZDc0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS90ZXN0L2tleXdvcmRzL1Jlc2VydmVkS2V5d29yZHMudGhyaWZ0CkBAIC0wLDAgKzEsMTM4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIG1ha2Ugc3VyZSBnZW5lcmF0ZWQgY29kZSBkb2VzIG5vdCBwcm9kdWNlIG5hbWUgY29sbGlzaW9ucyB3aXRoIHByZWRlZmluZWQga2V5d29yZHMKK25hbWVzcGFjZSBkZWxwaGkgU3lzdGVtCisKK2luY2x1ZGUgIlJlc2VydmVkSW5jbHVkZWQudGhyaWZ0IgorCisKK3R5cGVkZWYgaTMyIENhcmRpbmFsCit0eXBlZGVmIHN0cmluZyBtZXNzYWdlCit0eXBlZGVmIGxpc3Q8IG1hcDwgQ2FyZGluYWwsIG1lc3NhZ2U+PiBwcm9ncmFtCisKK3N0cnVjdCB1bml0IHsKKyAgMTogQ2FyZGluYWwgZG93bnRvOworICAyOiBwcm9ncmFtIHByb2NlZHVyZTsKK30KKwordHlwZWRlZiBzZXQ8IHVuaXQ+IHVuaXRzCisKK2V4Y2VwdGlvbiBleGNlcHRpb24xIHsKKyAgMTogcHJvZ3JhbSBtZXNzYWdlOworICAyOiB1bml0IGFycmF5OworfQorCitzZXJ2aWNlIGNvbnN0cnVjdG9yIHsKKyAgdW5pdCBDcmVhdGUoMTogQ2FyZGluYWwgYXNtOyAyOiBtZXNzYWdlIGluaGVyaXRlZCkgdGhyb3dzICgxOiBleGNlcHRpb24xIGxhYmVsKTsKKyAgdW5pdHMgRGVzdHJveSgpOworfQorCitjb25zdCBDYXJkaW5hbCBkb3dudG8gPSArMQorY29uc3QgQ2FyZGluYWwgcHVibGlzaGVkID0gLTEKKworZW51bSBrZXl3b3JkcyB7CisgIHJlY29yZCA9IDEsCisgIHJlcGVhdCA9IDIsCisgIGRlcHJlY2F0ZWQgPSAzCit9CisKKworc3RydWN0IFN0cnVjdF9saXN0cyB7CisgIDE6IGxpc3Q8U3RydWN0X3NpbXBsZT4gaW5pdDsKKyAgMjogbGlzdDxTdHJ1Y3Rfc2ltcGxlPiBzdHJ1YzsKKyAgMzogbGlzdDxTdHJ1Y3Rfc2ltcGxlPiBmaWVsZDsKKyAgNDogbGlzdDxTdHJ1Y3Rfc2ltcGxlPiBmaWVsZF87CisgIDU6IGxpc3Q8U3RydWN0X3NpbXBsZT4gdHJhY2tlcjsKKyAgNjogbGlzdDxTdHJ1Y3Rfc2ltcGxlPiBTZWxmOworfQorCitzdHJ1Y3QgU3RydWN0X3N0cnVjdHMgeworICAxOiBTdHJ1Y3Rfc2ltcGxlIGluaXQ7CisgIDI6IFN0cnVjdF9zaW1wbGUgc3RydWM7CisgIDM6IFN0cnVjdF9zaW1wbGUgZmllbGQ7CisgIDQ6IFN0cnVjdF9zaW1wbGUgZmllbGRfOworICA1OiBTdHJ1Y3Rfc2ltcGxlIHRyYWNrZXI7CisgIDY6IFN0cnVjdF9zaW1wbGUgU2VsZjsKK30KKworc3RydWN0IFN0cnVjdF9zaW1wbGUgeworICAxOiBib29sIGluaXQ7CisgIDI6IGJvb2wgc3RydWM7CisgIDM6IGJvb2wgZmllbGQ7CisgIDQ6IGJvb2wgZmllbGRfOworICA1OiBib29sIHRyYWNrZXI7CisgIDY6IGJvb2wgU2VsZjsKK30KKworc3RydWN0IFN0cnVjdF9zdHJpbmdzIHsKKyAgMTogc3RyaW5nIGluaXQ7CisgIDI6IHN0cmluZyBzdHJ1YzsKKyAgMzogc3RyaW5nIGZpZWxkOworICA0OiBzdHJpbmcgZmllbGRfOworICA1OiBzdHJpbmcgdHJhY2tlcjsKKyAgNjogc3RyaW5nIFNlbGY7Cit9CisKK3N0cnVjdCBTdHJ1Y3RfYmluYXJ5IHsKKyAgMTogYmluYXJ5IGluaXQ7CisgIDI6IGJpbmFyeSBzdHJ1YzsKKyAgMzogYmluYXJ5IGZpZWxkOworICA0OiBiaW5hcnkgZmllbGRfOworICA1OiBiaW5hcnkgdHJhY2tlcjsKKyAgNjogYmluYXJ5IFNlbGY7Cit9CisKKwordHlwZWRlZiBpMzIgSVByb3RvY29sIAordHlwZWRlZiBpMzIgSVRyYW5zcG9ydAordHlwZWRlZiBpMzIgSUZhY2UKK3R5cGVkZWYgaTMyIElBc3luYwordHlwZWRlZiBpMzIgU3lzdGVtCit0eXBlZGVmIGkzMiBTeXNVdGlscwordHlwZWRlZiBpMzIgR2VuZXJpY3MKK3R5cGVkZWYgaTMyIFRocmlmdAorCitzdHJ1Y3QgU3RydWN0X1RocmlmdF9OYW1lcyB7CisgIDE6IElQcm90b2NvbCAgIElQcm90b2NvbAorICAyOiBJVHJhbnNwb3J0ICBJVHJhbnNwb3J0CisgIDM6IElGYWNlICAgICAgIElGYWNlCisgIDQ6IElBc3luYyAgICAgIElBc3luYworICA1OiBTeXN0ZW0gICAgICBTeXN0ZW0KKyAgNjogU3lzVXRpbHMgICAgU3lzVXRpbHMKKyAgNzogR2VuZXJpY3MgICAgR2VuZXJpY3MKKyAgODogVGhyaWZ0ICAgICAgVGhyaWZ0Cit9CisKKworZW51bSBUaHJpZnQ0NTU0X0VudW0geworICBGb28gPSAwLAorICBCYXIgPSAxLAorICBCYXogPSAyLAorfQorCitzdHJ1Y3QgVGhyaWZ0NDU1NF9TdHJ1Y3QgeworICAxIDogb3B0aW9uYWwgZG91YmxlIE1pblZhbHVlCisgIDIgOiBvcHRpb25hbCBkb3VibGUgTWF4VmFsdWUKKyAgMyA6IG9wdGlvbmFsIGJvb2wgSW50ZWdlciAgLy8gY2F1c2VzIGlzc3VlCisgIDQgOiBvcHRpb25hbCBUaHJpZnQ0NTU0X0VudW0gRm9vCit9CisKKworLy8gRU9GCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3QvbXVsdGlwbGV4ZWQvTXVsdGlwbGV4LlNlcnZlci5NYWluLnBhcyBiL2xpYi9kZWxwaGkvdGVzdC9tdWx0aXBsZXhlZC9NdWx0aXBsZXguU2VydmVyLk1haW4ucGFzCmluZGV4IDM3Zjg0YmIuLjM4NjBmNWEgMTAwNjQ0Ci0tLSBhL2xpYi9kZWxwaGkvdGVzdC9tdWx0aXBsZXhlZC9NdWx0aXBsZXguU2VydmVyLk1haW4ucGFzCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9tdWx0aXBsZXhlZC9NdWx0aXBsZXguU2VydmVyLk1haW4ucGFzCkBAIC0yOCw3ICsyOCw2IEBACiB1c2VzCiAgIFdpbmRvd3MsIFN5c1V0aWxzLAogICBHZW5lcmljcy5Db2xsZWN0aW9ucywKLSAgVGhyaWZ0LkNvbnNvbGUsCiAgIFRocmlmdC5TZXJ2ZXIsCiAgIFRocmlmdC5UcmFuc3BvcnQsCiAgIFRocmlmdC5UcmFuc3BvcnQuUGlwZXMsCkBAIC00MSw2ICs0MCw3IEBACiAgIEJlbmNobWFyaywgIC8vIGluIGdlbi1kZWxwaGkgZm9sZGVyCiAgIEFnZ3IsICAgICAgIC8vIGluIGdlbi1kZWxwaGkgZm9sZGVyCiAgIE11bHRpcGxleC5UZXN0LkNvbW1vbiwKKyAgQ29uc29sZUhlbHBlciwKICAgQ29udG5yczsKIAogdHlwZQpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L211bHRpcGxleGVkL011bHRpcGxleC5UZXN0LkNsaWVudC5kcHIgYi9saWIvZGVscGhpL3Rlc3QvbXVsdGlwbGV4ZWQvTXVsdGlwbGV4LlRlc3QuQ2xpZW50LmRwcgppbmRleCA5NWVlNDg2Li40Mjc4ZDhmIDEwMDY0NAotLS0gYS9saWIvZGVscGhpL3Rlc3QvbXVsdGlwbGV4ZWQvTXVsdGlwbGV4LlRlc3QuQ2xpZW50LmRwcgorKysgYi9saWIvZGVscGhpL3Rlc3QvbXVsdGlwbGV4ZWQvTXVsdGlwbGV4LlRlc3QuQ2xpZW50LmRwcgpAQCAtMjYsNiArMjYsOCBAQAogICBTeXNVdGlscywKICAgTXVsdGlwbGV4LkNsaWVudC5NYWluIGluICdNdWx0aXBsZXguQ2xpZW50Lk1haW4ucGFzJywKICAgVGhyaWZ0IGluICcuLlwuLlxzcmNcVGhyaWZ0LnBhcycsCisgIFRocmlmdC5Tb2NrZXQgaW4gJy4uXC4uXHNyY1xUaHJpZnQuU29ja2V0LnBhcycsCisgIFRocmlmdC5FeGNlcHRpb24gaW4gJy4uXC4uXHNyY1xUaHJpZnQuRXhjZXB0aW9uLnBhcycsCiAgIFRocmlmdC5UcmFuc3BvcnQgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVHJhbnNwb3J0LnBhcycsCiAgIFRocmlmdC5UcmFuc3BvcnQuUGlwZXMgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVHJhbnNwb3J0LlBpcGVzLnBhcycsCiAgIFRocmlmdC5Qcm90b2NvbCBpbiAnLi5cLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5wYXMnLApAQCAtMzMsNyArMzUsNiBAQAogICBUaHJpZnQuQ29sbGVjdGlvbnMgaW4gJy4uXC4uXHNyY1xUaHJpZnQuQ29sbGVjdGlvbnMucGFzJywKICAgVGhyaWZ0LlNlcnZlciBpbiAnLi5cLi5cc3JjXFRocmlmdC5TZXJ2ZXIucGFzJywKICAgVGhyaWZ0LlN0cmVhbSBpbiAnLi5cLi5cc3JjXFRocmlmdC5TdHJlYW0ucGFzJywKLSAgVGhyaWZ0LkNvbnNvbGUgaW4gJy4uXC4uXHNyY1xUaHJpZnQuQ29uc29sZS5wYXMnLAogICBUaHJpZnQuVHlwZVJlZ2lzdHJ5IGluICcuLlwuLlxzcmNcVGhyaWZ0LlR5cGVSZWdpc3RyeS5wYXMnLAogICBUaHJpZnQuVXRpbHMgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVXRpbHMucGFzJzsKIApkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L211bHRpcGxleGVkL011bHRpcGxleC5UZXN0LlNlcnZlci5kcHIgYi9saWIvZGVscGhpL3Rlc3QvbXVsdGlwbGV4ZWQvTXVsdGlwbGV4LlRlc3QuU2VydmVyLmRwcgppbmRleCBjN2ExYTE5Li4xMjA0NjJiIDEwMDY0NAotLS0gYS9saWIvZGVscGhpL3Rlc3QvbXVsdGlwbGV4ZWQvTXVsdGlwbGV4LlRlc3QuU2VydmVyLmRwcgorKysgYi9saWIvZGVscGhpL3Rlc3QvbXVsdGlwbGV4ZWQvTXVsdGlwbGV4LlRlc3QuU2VydmVyLmRwcgpAQCAtMjQsNyArMjQsMTAgQEAKIHVzZXMKICAgU3lzVXRpbHMsCiAgIE11bHRpcGxleC5TZXJ2ZXIuTWFpbiBpbiAnTXVsdGlwbGV4LlNlcnZlci5NYWluLnBhcycsCisgIENvbnNvbGVIZWxwZXIgaW4gJy4uXENvbnNvbGVIZWxwZXIucGFzJywKICAgVGhyaWZ0IGluICcuLlwuLlxzcmNcVGhyaWZ0LnBhcycsCisgIFRocmlmdC5FeGNlcHRpb24gaW4gJy4uXC4uXHNyY1xUaHJpZnQuRXhjZXB0aW9uLnBhcycsCisgIFRocmlmdC5Tb2NrZXQgaW4gJy4uXC4uXHNyY1xUaHJpZnQuU29ja2V0LnBhcycsCiAgIFRocmlmdC5UcmFuc3BvcnQgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVHJhbnNwb3J0LnBhcycsCiAgIFRocmlmdC5UcmFuc3BvcnQuUGlwZXMgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVHJhbnNwb3J0LlBpcGVzLnBhcycsCiAgIFRocmlmdC5Qcm90b2NvbCBpbiAnLi5cLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5wYXMnLApAQCAtMzIsNyArMzUsNiBAQAogICBUaHJpZnQuUHJvY2Vzc29yLk11bHRpcGxleCBpbiAnLi5cLi5cc3JjXFRocmlmdC5Qcm9jZXNzb3IuTXVsdGlwbGV4LnBhcycsCiAgIFRocmlmdC5Db2xsZWN0aW9ucyBpbiAnLi5cLi5cc3JjXFRocmlmdC5Db2xsZWN0aW9ucy5wYXMnLAogICBUaHJpZnQuU2VydmVyIGluICcuLlwuLlxzcmNcVGhyaWZ0LlNlcnZlci5wYXMnLAotICBUaHJpZnQuQ29uc29sZSBpbiAnLi5cLi5cc3JjXFRocmlmdC5Db25zb2xlLnBhcycsCiAgIFRocmlmdC5VdGlscyBpbiAnLi5cLi5cc3JjXFRocmlmdC5VdGlscy5wYXMnLAogICBUaHJpZnQuVHlwZVJlZ2lzdHJ5IGluICcuLlwuLlxzcmNcVGhyaWZ0LlR5cGVSZWdpc3RyeS5wYXMnLAogICBUaHJpZnQuU3RyZWFtIGluICcuLlwuLlxzcmNcVGhyaWZ0LlN0cmVhbS5wYXMnOwpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L3NlcmlhbGl6ZXIvVGVzdFNlcmlhbGl6ZXIuRGF0YS5wYXMgYi9saWIvZGVscGhpL3Rlc3Qvc2VyaWFsaXplci9UZXN0U2VyaWFsaXplci5EYXRhLnBhcwppbmRleCAzMGQ5ZGQ0Li41ZmMwMDcwIDEwMDY0NAotLS0gYS9saWIvZGVscGhpL3Rlc3Qvc2VyaWFsaXplci9UZXN0U2VyaWFsaXplci5EYXRhLnBhcworKysgYi9saWIvZGVscGhpL3Rlc3Qvc2VyaWFsaXplci9UZXN0U2VyaWFsaXplci5EYXRhLnBhcwpAQCAtMjIsNiArMjIsNyBAQAogaW50ZXJmYWNlCiAKIHVzZXMKKyAgU3lzVXRpbHMsCiAgIFRocmlmdC5Db2xsZWN0aW9ucywKICAgRGVidWdQcm90b1Rlc3Q7CiAKQEAgLTE5NCw3ICsxOTUsNyBAQAogICB7JElGIGNEZWJ1Z1Byb3RvVGVzdF9PcHRpb25fQW5zaVN0cl9CaW5hcnl9CiAgIHJlc3VsdC5TZXRCYXNlNjQoJ2Jhc2U2NCcpOwogICB7JEVMU0V9Ci0gIG5vdCB5ZXQgaW1wbAorICByZXN1bHQuU2V0QmFzZTY0KCBURW5jb2RpbmcuVVRGOC5HZXRCeXRlcygnYmFzZTY0JykpOwogICB7JElGRU5EfQogCiAgIC8vIGJ5dGUsIGkxNiwgYW5kIGk2NCBsaXN0cyBhcmUgcG9wdWxhdGVkIGJ5IGRlZmF1bHQgY29uc3RydWN0b3IKQEAgLTMzOCw3ICszMzksNyBAQAogICB7JElGIGNEZWJ1Z1Byb3RvVGVzdF9PcHRpb25fQW5zaVN0cl9CaW5hcnl9CiAgIHJlc3VsdC5BX2JpbmFyeSA6PSBBbnNpU3RyaW5nKCAjMCMxIzIjMyM0IzUjNiM3IzgpOwogICB7JEVMU0V9Ci0gIG5vdCB5ZXQgaW1wbAorICByZXN1bHQuQV9iaW5hcnkgOj0gVEVuY29kaW5nLlVURjguR2V0Qnl0ZXMoICMwIzEjMiMzIzQjNSM2IzcjOCk7CiAgIHskSUZFTkR9CiBlbmQ7CiAKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9zZXJpYWxpemVyL1Rlc3RTZXJpYWxpemVyLmRwciBiL2xpYi9kZWxwaGkvdGVzdC9zZXJpYWxpemVyL1Rlc3RTZXJpYWxpemVyLmRwcgppbmRleCAzZDlhNDUzLi41MWUyMmE0IDEwMDY0NAotLS0gYS9saWIvZGVscGhpL3Rlc3Qvc2VyaWFsaXplci9UZXN0U2VyaWFsaXplci5kcHIKKysrIGIvbGliL2RlbHBoaS90ZXN0L3NlcmlhbGl6ZXIvVGVzdFNlcmlhbGl6ZXIuZHByCkBAIC0yNCwxNiArMjQsMTggQEAKIHVzZXMKICAgQ2xhc3NlcywgV2luZG93cywgU3lzVXRpbHMsIEdlbmVyaWNzLkNvbGxlY3Rpb25zLAogICBUaHJpZnQgaW4gJy4uXC4uXHNyY1xUaHJpZnQucGFzJywKKyAgVGhyaWZ0LkV4Y2VwdGlvbiBpbiAnLi5cLi5cc3JjXFRocmlmdC5FeGNlcHRpb24ucGFzJywKKyAgVGhyaWZ0LlNvY2tldCBpbiAnLi5cLi5cc3JjXFRocmlmdC5Tb2NrZXQucGFzJywKICAgVGhyaWZ0LlRyYW5zcG9ydCBpbiAnLi5cLi5cc3JjXFRocmlmdC5UcmFuc3BvcnQucGFzJywKICAgVGhyaWZ0LlByb3RvY29sIGluICcuLlwuLlxzcmNcVGhyaWZ0LlByb3RvY29sLnBhcycsCiAgIFRocmlmdC5Qcm90b2NvbC5KU09OIGluICcuLlwuLlxzcmNcVGhyaWZ0LlByb3RvY29sLkpTT04ucGFzJywKICAgVGhyaWZ0LkNvbGxlY3Rpb25zIGluICcuLlwuLlxzcmNcVGhyaWZ0LkNvbGxlY3Rpb25zLnBhcycsCiAgIFRocmlmdC5TZXJ2ZXIgaW4gJy4uXC4uXHNyY1xUaHJpZnQuU2VydmVyLnBhcycsCi0gIFRocmlmdC5Db25zb2xlIGluICcuLlwuLlxzcmNcVGhyaWZ0LkNvbnNvbGUucGFzJywKICAgVGhyaWZ0LlV0aWxzIGluICcuLlwuLlxzcmNcVGhyaWZ0LlV0aWxzLnBhcycsCiAgIFRocmlmdC5TZXJpYWxpemVyIGluICcuLlwuLlxzcmNcVGhyaWZ0LlNlcmlhbGl6ZXIucGFzJywKICAgVGhyaWZ0LlN0cmVhbSBpbiAnLi5cLi5cc3JjXFRocmlmdC5TdHJlYW0ucGFzJywKICAgVGhyaWZ0LlR5cGVSZWdpc3RyeSBpbiAnLi5cLi5cc3JjXFRocmlmdC5UeXBlUmVnaXN0cnkucGFzJywKKyAgU3lzdGVtXywKICAgRGVidWdQcm90b1Rlc3QsCiAgIFRlc3RTZXJpYWxpemVyLkRhdGE7CiAKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9zZXJ2ZXIuZHByIGIvbGliL2RlbHBoaS90ZXN0L3NlcnZlci5kcHIKaW5kZXggZDUzMmUzNC4uYjVlNDhhNiAxMDA2NDQKLS0tIGEvbGliL2RlbHBoaS90ZXN0L3NlcnZlci5kcHIKKysrIGIvbGliL2RlbHBoaS90ZXN0L3NlcnZlci5kcHIKQEAgLTI3LDE0ICsyNywxNyBAQAogICBUZXN0U2VydmVyRXZlbnRzIGluICdUZXN0U2VydmVyRXZlbnRzLnBhcycsCiAgIFRocmlmdC5UZXN0LCAgLy8gaW4gZ2VuLWRlbHBoaSBmb2xkZXIKICAgVGhyaWZ0IGluICcuLlxzcmNcVGhyaWZ0LnBhcycsCisgIFRocmlmdC5FeGNlcHRpb24gaW4gJy4uXHNyY1xUaHJpZnQuRXhjZXB0aW9uLnBhcycsCiAgIFRocmlmdC5UcmFuc3BvcnQgaW4gJy4uXHNyY1xUaHJpZnQuVHJhbnNwb3J0LnBhcycsCisgIFRocmlmdC5Tb2NrZXQgaW4gJy4uXHNyY1xUaHJpZnQuU29ja2V0LnBhcycsCiAgIFRocmlmdC5UcmFuc3BvcnQuUGlwZXMgaW4gJy4uXHNyY1xUaHJpZnQuVHJhbnNwb3J0LlBpcGVzLnBhcycsCiAgIFRocmlmdC5Qcm90b2NvbCBpbiAnLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5wYXMnLAogICBUaHJpZnQuUHJvdG9jb2wuSlNPTiBpbiAnLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5KU09OLnBhcycsCiAgIFRocmlmdC5Qcm90b2NvbC5Db21wYWN0IGluICcuLlxzcmNcVGhyaWZ0LlByb3RvY29sLkNvbXBhY3QucGFzJywKKyAgVGhyaWZ0LlByb3RvY29sLk11bHRpcGxleCBpbiAnLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5NdWx0aXBsZXgucGFzJywKKyAgVGhyaWZ0LlByb2Nlc3Nvci5NdWx0aXBsZXggaW4gJy4uXHNyY1xUaHJpZnQuUHJvY2Vzc29yLk11bHRpcGxleC5wYXMnLAogICBUaHJpZnQuQ29sbGVjdGlvbnMgaW4gJy4uXHNyY1xUaHJpZnQuQ29sbGVjdGlvbnMucGFzJywKICAgVGhyaWZ0LlNlcnZlciBpbiAnLi5cc3JjXFRocmlmdC5TZXJ2ZXIucGFzJywKLSAgVGhyaWZ0LkNvbnNvbGUgaW4gJy4uXHNyY1xUaHJpZnQuQ29uc29sZS5wYXMnLAogICBUaHJpZnQuVHlwZVJlZ2lzdHJ5IGluICcuLlxzcmNcVGhyaWZ0LlR5cGVSZWdpc3RyeS5wYXMnLAogICBUaHJpZnQuVXRpbHMgaW4gJy4uXHNyY1xUaHJpZnQuVXRpbHMucGFzJywKICAgVGhyaWZ0LlN0cmVhbSBpbiAnLi5cc3JjXFRocmlmdC5TdHJlYW0ucGFzJzsKQEAgLTQ0LDE5ICs0NywxOSBAQAogICBhcmdzIDogYXJyYXkgb2Ygc3RyaW5nOwogICBpIDogSW50ZWdlcjsKICAgYXJnIDogc3RyaW5nOwotICBzIDogc3RyaW5nOwogCiBiZWdpbgogICB0cnkKICAgICBXcml0ZWxuKCAnRGVscGhpIFRlc3RTZXJ2ZXIgJytUaHJpZnQuVmVyc2lvbik7CiAgICAgblBhcmFtQ291bnQgOj0gUGFyYW1Db3VudDsKICAgICBTZXRMZW5ndGgoIGFyZ3MsIG5QYXJhbUNvdW50KTsKLSAgICBmb3IgaSA6PSAxIHRvIG5QYXJhbUNvdW50IGRvCi0gICAgYmVnaW4KKyAgICBmb3IgaSA6PSAxIHRvIG5QYXJhbUNvdW50IGRvIGJlZ2luCiAgICAgICBhcmcgOj0gUGFyYW1TdHIoIGkgKTsKICAgICAgIGFyZ3NbaS0xXSA6PSBhcmc7CiAgICAgZW5kOworCiAgICAgVFRlc3RTZXJ2ZXIuRXhlY3V0ZSggYXJncyApOworCiAgIGV4Y2VwdAogICAgIG9uIEU6IEVBYm9ydCBkbyBiZWdpbgogICAgICAgRXhpdENvZGUgOj0gJEZGOwpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L3NraXAvc2tpcHRlc3RfdmVyc2lvbjEuZHByIGIvbGliL2RlbHBoaS90ZXN0L3NraXAvc2tpcHRlc3RfdmVyc2lvbjEuZHByCmluZGV4IGFiNTdiYTAuLjgwM2Q2YmQgMTAwNjQ0Ci0tLSBhL2xpYi9kZWxwaGkvdGVzdC9za2lwL3NraXB0ZXN0X3ZlcnNpb24xLmRwcgorKysgYi9saWIvZGVscGhpL3Rlc3Qvc2tpcC9za2lwdGVzdF92ZXJzaW9uMS5kcHIKQEAgLTI1LDEyICsyNSwxMyBAQAogICBDbGFzc2VzLCBXaW5kb3dzLCBTeXNVdGlscywKICAgU2tpcHRlc3QuT25lLAogICBUaHJpZnQgaW4gJy4uXC4uXHNyY1xUaHJpZnQucGFzJywKKyAgVGhyaWZ0LkV4Y2VwdGlvbiBpbiAnLi5cLi5cc3JjXFRocmlmdC5FeGNlcHRpb24ucGFzJywKKyAgVGhyaWZ0LlNvY2tldCBpbiAnLi5cLi5cc3JjXFRocmlmdC5Tb2NrZXQucGFzJywKICAgVGhyaWZ0LlRyYW5zcG9ydCBpbiAnLi5cLi5cc3JjXFRocmlmdC5UcmFuc3BvcnQucGFzJywKICAgVGhyaWZ0LlByb3RvY29sIGluICcuLlwuLlxzcmNcVGhyaWZ0LlByb3RvY29sLnBhcycsCiAgIFRocmlmdC5Qcm90b2NvbC5KU09OIGluICcuLlwuLlxzcmNcVGhyaWZ0LlByb3RvY29sLkpTT04ucGFzJywKICAgVGhyaWZ0LkNvbGxlY3Rpb25zIGluICcuLlwuLlxzcmNcVGhyaWZ0LkNvbGxlY3Rpb25zLnBhcycsCiAgIFRocmlmdC5TZXJ2ZXIgaW4gJy4uXC4uXHNyY1xUaHJpZnQuU2VydmVyLnBhcycsCi0gIFRocmlmdC5Db25zb2xlIGluICcuLlwuLlxzcmNcVGhyaWZ0LkNvbnNvbGUucGFzJywKICAgVGhyaWZ0LlV0aWxzIGluICcuLlwuLlxzcmNcVGhyaWZ0LlV0aWxzLnBhcycsCiAgIFRocmlmdC5UeXBlUmVnaXN0cnkgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVHlwZVJlZ2lzdHJ5LnBhcycsCiAgIFRocmlmdC5TdHJlYW0gaW4gJy4uXC4uXHNyY1xUaHJpZnQuU3RyZWFtLnBhcyc7CkBAIC00Myw3ICs0NCw3IEBACiBmdW5jdGlvbiBDcmVhdGVQaW5nIDogSVBpbmc7CiBiZWdpbgogICByZXN1bHQgOj0gVFBpbmdJbXBsLkNyZWF0ZTsKLSAgcmVzdWx0LlZlcnNpb24xICA6PSBTa2lwdGVzdC5PbmUuVENvbnN0YW50cy5TS0lQVEVTVFNFUlZJQ0VfVkVSU0lPTjsKKyAgcmVzdWx0LlZlcnNpb24xICA6PSBUc2tpcHRlc3RfdmVyc2lvbl8xQ29uc3RhbnRzLlNLSVBURVNUU0VSVklDRV9WRVJTSU9OOwogZW5kOwogCiAKQEAgLTE3OCw3ICsxNzksNyBAQAogICBGSUxFX0pTT04gICA9ICdwaW5ncG9uZy5qc29uJzsKIGJlZ2luCiAgIHRyeQotICAgIFdyaXRlbG4oICdEZWxwaGkgU2tpcFRlc3QgJytJbnRUb1N0cihUQ29uc3RhbnRzLlNLSVBURVNUU0VSVklDRV9WRVJTSU9OKSsnIHVzaW5nICcrVGhyaWZ0LlZlcnNpb24pOworICAgIFdyaXRlbG4oICdEZWxwaGkgU2tpcFRlc3QgJytJbnRUb1N0cihUc2tpcHRlc3RfdmVyc2lvbl8xQ29uc3RhbnRzLlNLSVBURVNUU0VSVklDRV9WRVJTSU9OKSsnIHVzaW5nICcrVGhyaWZ0LlZlcnNpb24pOwogCiAgICAgV3JpdGVsbjsKICAgICBXcml0ZWxuKCdCaW5hcnkgcHJvdG9jb2wnKTsKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9za2lwL3NraXB0ZXN0X3ZlcnNpb24yLmRwciBiL2xpYi9kZWxwaGkvdGVzdC9za2lwL3NraXB0ZXN0X3ZlcnNpb24yLmRwcgppbmRleCBhYjVkNDFhLi42MzNiMjQ3IDEwMDY0NAotLS0gYS9saWIvZGVscGhpL3Rlc3Qvc2tpcC9za2lwdGVzdF92ZXJzaW9uMi5kcHIKKysrIGIvbGliL2RlbHBoaS90ZXN0L3NraXAvc2tpcHRlc3RfdmVyc2lvbjIuZHByCkBAIC0yNSwxMiArMjUsMTMgQEAKICAgQ2xhc3NlcywgV2luZG93cywgU3lzVXRpbHMsCiAgIFNraXB0ZXN0LlR3bywKICAgVGhyaWZ0IGluICcuLlwuLlxzcmNcVGhyaWZ0LnBhcycsCisgIFRocmlmdC5FeGNlcHRpb24gaW4gJy4uXC4uXHNyY1xUaHJpZnQuRXhjZXB0aW9uLnBhcycsCisgIFRocmlmdC5Tb2NrZXQgaW4gJy4uXC4uXHNyY1xUaHJpZnQuU29ja2V0LnBhcycsCiAgIFRocmlmdC5UcmFuc3BvcnQgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVHJhbnNwb3J0LnBhcycsCiAgIFRocmlmdC5Qcm90b2NvbCBpbiAnLi5cLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5wYXMnLAogICBUaHJpZnQuUHJvdG9jb2wuSlNPTiBpbiAnLi5cLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5KU09OLnBhcycsCiAgIFRocmlmdC5Db2xsZWN0aW9ucyBpbiAnLi5cLi5cc3JjXFRocmlmdC5Db2xsZWN0aW9ucy5wYXMnLAogICBUaHJpZnQuU2VydmVyIGluICcuLlwuLlxzcmNcVGhyaWZ0LlNlcnZlci5wYXMnLAotICBUaHJpZnQuQ29uc29sZSBpbiAnLi5cLi5cc3JjXFRocmlmdC5Db25zb2xlLnBhcycsCiAgIFRocmlmdC5VdGlscyBpbiAnLi5cLi5cc3JjXFRocmlmdC5VdGlscy5wYXMnLAogICBUaHJpZnQuVHlwZVJlZ2lzdHJ5IGluICcuLlwuLlxzcmNcVGhyaWZ0LlR5cGVSZWdpc3RyeS5wYXMnLAogICBUaHJpZnQuU3RyZWFtIGluICcuLlwuLlxzcmNcVGhyaWZ0LlN0cmVhbS5wYXMnOwpAQCAtNDQsNyArNDUsNyBAQAogICAgIHNldF8gOiBJSGFzaFNldDxzdHJpbmc+OwogYmVnaW4KICAgcmVzdWx0IDo9IFRQaW5nSW1wbC5DcmVhdGU7Ci0gIHJlc3VsdC5WZXJzaW9uMSAgOj0gU2tpcHRlc3QuVHdvLlRDb25zdGFudHMuU0tJUFRFU1RTRVJWSUNFX1ZFUlNJT047CisgIHJlc3VsdC5WZXJzaW9uMSAgOj0gVHNraXB0ZXN0X3ZlcnNpb25fMkNvbnN0YW50cy5TS0lQVEVTVFNFUlZJQ0VfVkVSU0lPTjsKICAgcmVzdWx0LkJvb2xWYWwgICA6PSBUUlVFOwogICByZXN1bHQuQnl0ZVZhbCAgIDo9IDI7CiAgIHJlc3VsdC5EYlZhbCAgICAgOj0gMzsKQEAgLTIwNSw3ICsyMDYsNyBAQAogICBGSUxFX0pTT04gICA9ICdwaW5ncG9uZy5qc29uJzsKIGJlZ2luCiAgIHRyeQotICAgIFdyaXRlbG4oICdEZWxwaGkgU2tpcFRlc3QgJytJbnRUb1N0cihUQ29uc3RhbnRzLlNLSVBURVNUU0VSVklDRV9WRVJTSU9OKSsnIHVzaW5nICcrVGhyaWZ0LlZlcnNpb24pOworICAgIFdyaXRlbG4oICdEZWxwaGkgU2tpcFRlc3QgJytJbnRUb1N0cihUc2tpcHRlc3RfdmVyc2lvbl8yQ29uc3RhbnRzLlNLSVBURVNUU0VSVklDRV9WRVJTSU9OKSsnIHVzaW5nICcrVGhyaWZ0LlZlcnNpb24pOwogCiAgICAgV3JpdGVsbjsKICAgICBXcml0ZWxuKCdCaW5hcnkgcHJvdG9jb2wnKTsKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC90eXBlcmVnaXN0cnkvVGVzdFR5cGVSZWdpc3RyeS5kcHIgYi9saWIvZGVscGhpL3Rlc3QvdHlwZXJlZ2lzdHJ5L1Rlc3RUeXBlUmVnaXN0cnkuZHByCmluZGV4IDlhNjUwM2EuLjE4YTdjN2QgMTAwNjQ0Ci0tLSBhL2xpYi9kZWxwaGkvdGVzdC90eXBlcmVnaXN0cnkvVGVzdFR5cGVSZWdpc3RyeS5kcHIKKysrIGIvbGliL2RlbHBoaS90ZXN0L3R5cGVyZWdpc3RyeS9UZXN0VHlwZVJlZ2lzdHJ5LmRwcgpAQCAtMjUsMTEgKzI1LDEyIEBACiAgIENsYXNzZXMsIFdpbmRvd3MsIFN5c1V0aWxzLCBHZW5lcmljcy5Db2xsZWN0aW9ucywgVHlwSW5mbywKICAgVGhyaWZ0IGluICcuLlwuLlxzcmNcVGhyaWZ0LnBhcycsCiAgIFRocmlmdC5UcmFuc3BvcnQgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVHJhbnNwb3J0LnBhcycsCisgIFRocmlmdC5FeGNlcHRpb24gaW4gJy4uXC4uXHNyY1xUaHJpZnQuRXhjZXB0aW9uLnBhcycsCisgIFRocmlmdC5Tb2NrZXQgaW4gJy4uXC4uXHNyY1xUaHJpZnQuU29ja2V0LnBhcycsCiAgIFRocmlmdC5Qcm90b2NvbCBpbiAnLi5cLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5wYXMnLAogICBUaHJpZnQuUHJvdG9jb2wuSlNPTiBpbiAnLi5cLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5KU09OLnBhcycsCiAgIFRocmlmdC5Db2xsZWN0aW9ucyBpbiAnLi5cLi5cc3JjXFRocmlmdC5Db2xsZWN0aW9ucy5wYXMnLAogICBUaHJpZnQuU2VydmVyIGluICcuLlwuLlxzcmNcVGhyaWZ0LlNlcnZlci5wYXMnLAotICBUaHJpZnQuQ29uc29sZSBpbiAnLi5cLi5cc3JjXFRocmlmdC5Db25zb2xlLnBhcycsCiAgIFRocmlmdC5VdGlscyBpbiAnLi5cLi5cc3JjXFRocmlmdC5VdGlscy5wYXMnLAogICBUaHJpZnQuU2VyaWFsaXplciBpbiAnLi5cLi5cc3JjXFRocmlmdC5TZXJpYWxpemVyLnBhcycsCiAgIFRocmlmdC5TdHJlYW0gaW4gJy4uXC4uXHNyY1xUaHJpZnQuU3RyZWFtLnBhcycsCmRpZmYgLS1naXQgYS9saWIvZXJsL01ha2VmaWxlLmFtIGIvbGliL2VybC9NYWtlZmlsZS5hbQppbmRleCBmNTc3YTYzLi4wNjMyM2I0IDEwMDY0NAotLS0gYS9saWIvZXJsL01ha2VmaWxlLmFtCisrKyBiL2xpYi9lcmwvTWFrZWZpbGUuYW0KQEAgLTE4LDI5ICsxOCw0NCBAQAogIwogCiBUSFJJRlQgPSAuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0CitUSFJJRlRfT01JVF9GSUxFID0gdGVzdC9UaHJpZnRfb21pdF93aXRob3V0LnRocmlmdAogVEhSSUZUX0ZJTEVTID0gJCh3aWxkY2FyZCB0ZXN0LyoudGhyaWZ0KSBcCisJCSAgJChUSFJJRlRfT01JVF9GSUxFKSBcCisJCSAgLi4vLi4vdGVzdC9Db25zdGFudHNEZW1vLnRocmlmdCBcCisJCSAgLi4vLi4vdGVzdC9OYW1lQ29uZmxpY3RUZXN0LnRocmlmdCBcCisJCSAgLi4vLi4vdGVzdC9Eb3VibGVDb25zdGFudHNUZXN0LnRocmlmdCBcCiAJCSAgLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAogCiBpZiBFUkxBTkdfT1RQMTYKLS5nZW5lcmF0ZWQ6ICQoVEhSSUZUKSAkKFRIUklGVF9GSUxFUykKLQlmb3IgZiBpbiAkKFRIUklGVF9GSUxFUykgOyBkbyBcCi0JCSQoVEhSSUZUKSAtLWdlbiBlcmw6b3RwMTYgLW8gdGVzdCAkJGYgOyBcCi0JZG9uZSA7CitFUkxfRkxBRyA9IGVybDpvdHAxNgorRVJMX0ZMQUdfTEVHQUNZID0gZXJsOm90cDE2LGxlZ2FjeW5hbWVzCisjIG90cDE2ICsgbWFwcyBkb2VzIG5vdCBtYWtlIHNlbnNlLiBXZSBuZWVkIHRvIGdlbmVyYXRlIGl0IGFueXdheSB0byBhdm9pZCBpbmNsdWRlIGVycm9yLgorRVJMX0ZMQUdfTUFQUyA9IGVybDpvdHAxNgogZWxzZQotLmdlbmVyYXRlZDogJChUSFJJRlQpICQoVEhSSUZUX0ZJTEVTKQotCWZvciBmIGluICQoVEhSSUZUX0ZJTEVTKSA7IGRvIFwKLQkJJChUSFJJRlQpIC0tZ2VuIGVybCAtbyB0ZXN0ICQkZiA7IFwKLQlkb25lIDsgXAotCSQoVEhSSUZUKSAtLWdlbiBlcmw6bWFwcyAtbyB0ZXN0IHRlc3QvVGhyaWZ0MzIxNC50aHJpZnQgOyBcCi0JdG91Y2ggLmdlbmVyYXRlZAorRVJMX0ZMQUcgPSBlcmwKK0VSTF9GTEFHX0xFR0FDWSA9IGVybDpsZWdhY3luYW1lcworRVJMX0ZMQUdfTUFQUyA9IGVybDptYXBzCiBlbmRpZgogCiskKFRIUklGVF9PTUlUX0ZJTEUpOiB0ZXN0L1RocmlmdF9vbWl0X3dpdGgudGhyaWZ0CisJZ3JlcCAtdiBvbWl0ICQ8ID4kQAorCisuZ2VuZXJhdGVkOiAkKFRIUklGVCkgJChUSFJJRlRfRklMRVMpCisJZm9yIGYgaW4gJChUSFJJRlRfRklMRVMpIDsgZG8gXAorCQkkKFRIUklGVCkgLS1nZW4gJChFUkxfRkxBRykgLW8gdGVzdCAkJGYgOyBcCisJZG9uZQorCSQoVEhSSUZUKSAtLWdlbiAkKEVSTF9GTEFHX0xFR0FDWSkgLW8gdGVzdCB0ZXN0L2ZsYWdzL0xlZ2FjeU5hbWVzLnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiAkKEVSTF9GTEFHX01BUFMpIC1vIHRlc3QgdGVzdC9mbGFncy9UaHJpZnQzMjE0LnRocmlmdAorCXRvdWNoIC5nZW5lcmF0ZWQKKwogYWxsOiAuZ2VuZXJhdGVkCi0JLi9yZWJhciBnZXQtZGVwcwotCS4vcmViYXIgY29tcGlsZQorCSQoUkVCQVIpIGdldC1kZXBzCisJJChSRUJBUikgY29tcGlsZQogCiBjaGVjazogLmdlbmVyYXRlZAotCS4vcmViYXIgc2tpcF9kZXBzPXRydWUgZXVuaXQKKwkkKFJFQkFSKSAtQyByZWJhci50ZXN0LmNvbmZpZyBnZXQtZGVwcworCSQoUkVCQVIpIC1DIHJlYmFyLnRlc3QuY29uZmlnIGNvbXBpbGUKKwkkKFJFQkFSKSAtQyByZWJhci50ZXN0LmNvbmZpZyBza2lwX2RlcHM9dHJ1ZSBldW5pdAogCiBpbnN0YWxsOiBhbGwKIAlta2RpciAtcCAkKERFU1RESVIpJChFUkxBTkdfSU5TVEFMTF9MSUJfRElSX3RocmlmdCkgOyBcCkBAIC01Nyw3ICs3Miw4IEBACiBjbGVhbjoKIAlybSAtZiAuZ2VuZXJhdGVkCiAJcm0gLXJmIHRlc3QvZ2VuLWVybC8KLQkuL3JlYmFyIGNsZWFuCisJcm0gLWYgJChUSFJJRlRfT01JVF9GSUxFKQorCSQoUkVCQVIpIGNsZWFuCiAKIG1haW50YWluZXItY2xlYW4tbG9jYWw6CiAJcm0gLXJmIGViaW4KQEAgLTY2LDggKzgyLDkgQEAKIAlpbmNsdWRlIFwKIAlzcmMgXAogCWNvZGluZ19zdGFuZGFyZHMubWQgXAotCXJlYmFyIFwKIAlyZWJhci5jb25maWcgXAorCXJlYmFyLmNvbmZpZy5zY3JpcHQgXAorCXJlYmFyLnRlc3QuY29uZmlnIFwKIAl0ZXN0IFwKIAlSRUFETUUubWQKIApkaWZmIC0tZ2l0IGEvbGliL2VybC9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvbGliL2VybC9jb2Rpbmdfc3RhbmRhcmRzLm1kCmluZGV4IGZhMDM5MGIuLjRkMzdkYmMgMTAwNjQ0Ci0tLSBhL2xpYi9lcmwvY29kaW5nX3N0YW5kYXJkcy5tZAorKysgYi9saWIvZXJsL2NvZGluZ19zdGFuZGFyZHMubWQKQEAgLTEgKzEsMyBAQAogUGxlYXNlIGZvbGxvdyBbR2VuZXJhbCBDb2RpbmcgU3RhbmRhcmRzXSgvZG9jL2NvZGluZ19zdGFuZGFyZHMubWQpCisKK1BhcnRpY3VsYXJseSBmb3IgRXJsYW5nIHBsZWFzZSBmb2xsb3cgdGhlIEVybGFuZyBbUHJvZ3JhbW1pbmcgUnVsZXMgYW5kIENvbnZlbnRpb25zXShodHRwOi8vd3d3LmVybGFuZy5zZS9kb2MvcHJvZ3JhbW1pbmdfcnVsZXMuc2h0bWwpLiAKZGlmZiAtLWdpdCBhL2xpYi9lcmwvaW5jbHVkZS90aHJpZnRfY29uc3RhbnRzLmhybCBiL2xpYi9lcmwvaW5jbHVkZS90aHJpZnRfY29uc3RhbnRzLmhybAppbmRleCBkYmZhYWY2Li43Y2IyOWViIDEwMDY0NAotLS0gYS9saWIvZXJsL2luY2x1ZGUvdGhyaWZ0X2NvbnN0YW50cy5ocmwKKysrIGIvbGliL2VybC9pbmNsdWRlL3RocmlmdF9jb25zdGFudHMuaHJsCkBAIC0yMiw2ICsyMiw3IEBACiAtZGVmaW5lKHRUeXBlX1ZPSUQsIDEpLgogLWRlZmluZSh0VHlwZV9CT09MLCAyKS4KIC1kZWZpbmUodFR5cGVfQllURSwgMykuCistZGVmaW5lKHRUeXBlX0k4LCAzKS4KIC1kZWZpbmUodFR5cGVfRE9VQkxFLCA0KS4KIC1kZWZpbmUodFR5cGVfSTE2LCA2KS4KIC1kZWZpbmUodFR5cGVfSTMyLCA4KS4KQEAgLTU2LDMgKzU3LDYgQEAKIC1kZWZpbmUoVEFwcGxpY2F0aW9uRXhjZXB0aW9uX0lOVkFMSURfVFJBTlNGT1JNLCA4KS4KIC1kZWZpbmUoVEFwcGxpY2F0aW9uRXhjZXB0aW9uX0lOVkFMSURfUFJPVE9DT0wsIDkpLgogLWRlZmluZShUQXBwbGljYXRpb25FeGNlcHRpb25fVU5TVVBQT1JURURfQ0xJRU5UX1RZUEUsIDEwKS4KKworLWRlZmluZSAoTVVMVElQTEVYRURfU0VSVklDRV9TRVBBUkFUT1IsICI6IikuCistZGVmaW5lIChNVUxUSVBMRVhFRF9FUlJPUl9IQU5ETEVSX0tFWSwgImVycm9yX2hhbmRsZXIiKS4KZGlmZiAtLWdpdCBhL2xpYi9lcmwvaW5jbHVkZS90aHJpZnRfcHJvdG9jb2wuaHJsIGIvbGliL2VybC9pbmNsdWRlL3RocmlmdF9wcm90b2NvbC5ocmwKaW5kZXggZjg1ZjQ1NS4uYmMwYWNjOCAxMDA2NDQKLS0tIGEvbGliL2VybC9pbmNsdWRlL3RocmlmdF9wcm90b2NvbC5ocmwKKysrIGIvbGliL2VybC9pbmNsdWRlL3RocmlmdF9wcm90b2NvbC5ocmwKQEAgLTIwLDEyICsyMCwxMiBAQAogLWlmbmRlZihUSFJJRlRfUFJPVE9DT0xfSU5DTFVERUQpLgogLWRlZmluZShUSFJJRlRfUFJPVE9DT0xfSU5DTFVERUQsIHRydWUpLgogCi0tcmVjb3JkKHByb3RvY29sX21lc3NhZ2VfYmVnaW4sIHtuYW1lLCB0eXBlLCBzZXFpZH0pLgotLXJlY29yZChwcm90b2NvbF9zdHJ1Y3RfYmVnaW4sIHtuYW1lfSkuCi0tcmVjb3JkKHByb3RvY29sX2ZpZWxkX2JlZ2luLCB7bmFtZSwgdHlwZSwgaWR9KS4KLS1yZWNvcmQocHJvdG9jb2xfbWFwX2JlZ2luLCB7a3R5cGUsIHZ0eXBlLCBzaXplfSkuCi0tcmVjb3JkKHByb3RvY29sX2xpc3RfYmVnaW4sIHtldHlwZSwgc2l6ZX0pLgotLXJlY29yZChwcm90b2NvbF9zZXRfYmVnaW4sIHtldHlwZSwgc2l6ZX0pLgorLXJlY29yZChwcm90b2NvbF9tZXNzYWdlX2JlZ2luLCB7bmFtZSA6OiBzdHJpbmcoKSwgdHlwZSA6OiBpbnRlZ2VyKCksIHNlcWlkIDo6IGludGVnZXIoKX0pLgorLXJlY29yZChwcm90b2NvbF9zdHJ1Y3RfYmVnaW4sIHtuYW1lIDo6IHN0cmluZygpfSkuCistcmVjb3JkKHByb3RvY29sX2ZpZWxkX2JlZ2luLCB7bmFtZSA6OiBzdHJpbmcoKSwgdHlwZSA6OiBpbnRlZ2VyKCksIGlkIDo6IGludGVnZXIoKX0pLgorLXJlY29yZChwcm90b2NvbF9tYXBfYmVnaW4sIHtrdHlwZSA6OiBpbnRlZ2VyKCksIHZ0eXBlIDo6IGludGVnZXIoKSwgc2l6ZSA6OiBpbnRlZ2VyKCl9KS4KKy1yZWNvcmQocHJvdG9jb2xfbGlzdF9iZWdpbiwge2V0eXBlIDo6IGludGVnZXIoKSwgc2l6ZSA6OiBpbnRlZ2VyKCl9KS4KKy1yZWNvcmQocHJvdG9jb2xfc2V0X2JlZ2luLCB7ZXR5cGUgOjogaW50ZWdlcigpLCBzaXplIDo6IGludGVnZXIoKX0pLgogCiAtdHlwZSB0cHJvdF9oZWFkZXJfdmFsKCkgOjogI3Byb3RvY29sX21lc3NhZ2VfYmVnaW57fQogICAgICAgICAgICAgICAgICAgICAgICAgICB8ICNwcm90b2NvbF9zdHJ1Y3RfYmVnaW57fQpkaWZmIC0tZ2l0IGEvbGliL2VybC9yZWJhciBiL2xpYi9lcmwvcmViYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDUzNDE5ZWEuLjAwMDAwMDAKLS0tIGEvbGliL2VybC9yZWJhcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9lcmwvcmViYXIuY29uZmlnLnNjcmlwdCBiL2xpYi9lcmwvcmViYXIuY29uZmlnLnNjcmlwdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzMzODIzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC9yZWJhci5jb25maWcuc2NyaXB0CkBAIC0wLDAgKzEsNyBAQAorRGVmMCA9IGNhc2Ugbm90IGVybGFuZzppc19idWlsdGluKGVybGFuZywgbW9ub3RvbmljX3RpbWUsIDApIG9mCisgICAgICAgICAgIHRydWUgLT4gW107CisgICAgICAgICAgIGZhbHNlIC0+IFt7ZCwgdGltZV9jb3JyZWN0aW9ufV0KKyAgICAgICBlbmQsCitEZWZzID0gRGVmMCwKK2xpc3RzOmtleXN0b3JlKGVybF9vcHRzLCAxLCBDT05GSUcsCisgICAgICAgICAgICAgICB7ZXJsX29wdHMsIHByb3BsaXN0czpnZXRfdmFsdWUoZXJsX29wdHMsIENPTkZJRywgW10pICsrIERlZnN9KS4KZGlmZiAtLWdpdCBhL2xpYi9lcmwvcmViYXIudGVzdC5jb25maWcgYi9saWIvZXJsL3JlYmFyLnRlc3QuY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZjJhZmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3JlYmFyLnRlc3QuY29uZmlnCkBAIC0wLDAgKzEsNSBAQAore2VybF9vcHRzLCBbe3BsYXRmb3JtX2RlZmluZSwgIl5SLioiLCBvdHAxNl9vcl9sZXNzfSwgZGVidWdfaW5mb119LgorCit7ZGVwcywgWworICB7bWVjaywgIiIsIHtnaXQsICJodHRwczovL2dpdGh1Yi5jb20vZXByb3h1cy9tZWNrLmdpdCIsIHt0YWcsICIwLjguOSJ9fX0KK119LgpkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0LmFwcC5zcmMgYi9saWIvZXJsL3NyYy90aHJpZnQuYXBwLnNyYwppbmRleCBjMzA2ZTBhLi5iM2IyMjVmIDEwMDY0NAotLS0gYS9saWIvZXJsL3NyYy90aHJpZnQuYXBwLnNyYworKysgYi9saWIvZXJsL3NyYy90aHJpZnQuYXBwLnNyYwpAQCAtMjIsNyArMjIsNyBAQAogICB7ZGVzY3JpcHRpb24sICJUaHJpZnQgYmluZGluZ3MifSwKIAogICAlIFRoZSB2ZXJzaW9uIG9mIHRoZSBhcHBsaWNhdG9uCi0gIHt2c24sICIwLjkuMyJ9LAorICB7dnNuLCAiMS4wLjAifSwKIAogICAlIEFsbCBtb2R1bGVzIHVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uLgogICB7bW9kdWxlcywgWwpAQCAtMzcsNiArMzcsNyBAQAogICAgIHRocmlmdF9odHRwX3RyYW5zcG9ydCwKICAgICB0aHJpZnRfanNvbl9wYXJzZXIsCiAgICAgdGhyaWZ0X2pzb25fcHJvdG9jb2wsCisgICAgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsCiAgICAgdGhyaWZ0X21lbW9yeV9idWZmZXIsCiAgICAgdGhyaWZ0X3Byb2Nlc3NvciwKICAgICB0aHJpZnRfcHJvdG9jb2wsCmRpZmYgLS1naXQgYS9saWIvZXJsL3NyYy90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0LmVybCBiL2xpYi9lcmwvc3JjL3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuZXJsCmluZGV4IGQ0ZDYxNGUuLmU5ZDNmZmYgMTAwNjQ0Ci0tLSBhL2xpYi9lcmwvc3JjL3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuZXJsCisrKyBiL2xpYi9lcmwvc3JjL3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuZXJsCkBAIC0yMSw1NyArMjEsNzggQEAKIAogLWJlaGF2aW91cih0aHJpZnRfdHJhbnNwb3J0KS4KIAotJSUgQVBJCi0tZXhwb3J0KFtuZXcvMSwgbmV3X3RyYW5zcG9ydF9mYWN0b3J5LzFdKS4KKyUlIGNvbnN0cnVjdG9yCistZXhwb3J0KFtuZXcvMV0pLgorJSUgcHJvdG9jb2wgY2FsbGJhY2tzCistZXhwb3J0KFtyZWFkLzIsIHJlYWRfZXhhY3QvMiwgd3JpdGUvMiwgZmx1c2gvMSwgY2xvc2UvMV0pLgorJSUgbGVnYWN5IGFwaQorLWV4cG9ydChbbmV3X3RyYW5zcG9ydF9mYWN0b3J5LzFdKS4KIAotJSUgdGhyaWZ0X3RyYW5zcG9ydCBjYWxsYmFja3MKLS1leHBvcnQoW3dyaXRlLzIsIHJlYWQvMiwgZmx1c2gvMSwgY2xvc2UvMV0pLgogCi0tcmVjb3JkKGJ1ZmZlcmVkX3RyYW5zcG9ydCwge3dyYXBwZWQsICUgYSB0aHJpZnRfdHJhbnNwb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX2J1ZmZlciAlIGlvbGlzdCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuCi0tdHlwZSBzdGF0ZSgpIDo6ICNidWZmZXJlZF90cmFuc3BvcnR7fS4KKy1yZWNvcmQodF9idWZmZXJlZCwgeworICB3cmFwcGVkLAorICB3cml0ZV9idWZmZXIKK30pLgorCistdHlwZSBzdGF0ZSgpIDo6ICN0X2J1ZmZlcmVke30uCisKKworLXNwZWMgbmV3KFRyYW5zcG9ydDo6dGhyaWZ0X3RyYW5zcG9ydDp0X3RyYW5zcG9ydCgpKSAtPgorICB0aHJpZnRfdHJhbnNwb3J0OnRfdHJhbnNwb3J0KCkuCisKK25ldyhXcmFwcGVkKSAtPgorICBTdGF0ZSA9ICN0X2J1ZmZlcmVkeworICAgIHdyYXBwZWQgPSBXcmFwcGVkLAorICAgIHdyaXRlX2J1ZmZlciA9IFtdCisgIH0sCisgIHRocmlmdF90cmFuc3BvcnQ6bmV3KD9NT0RVTEUsIFN0YXRlKS4KKworCiAtaW5jbHVkZSgidGhyaWZ0X3RyYW5zcG9ydF9iZWhhdmlvdXIuaHJsIikuCiAKIAotbmV3KFdyYXBwZWRUcmFuc3BvcnQpIC0+Ci0gICAgU3RhdGUgPSAjYnVmZmVyZWRfdHJhbnNwb3J0e3dyYXBwZWQgPSBXcmFwcGVkVHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9idWZmZXIgPSBbXX0sCi0gICAgdGhyaWZ0X3RyYW5zcG9ydDpuZXcoP01PRFVMRSwgU3RhdGUpLgorJSUgcmVhZHMgZGF0YSB0aHJvdWdoIGZyb20gdGhlIHdyYXBwZWQgdHJhbnNwb3J0CityZWFkKFN0YXRlID0gI3RfYnVmZmVyZWR7d3JhcHBlZCA9IFdyYXBwZWR9LCBMZW4pCit3aGVuIGlzX2ludGVnZXIoTGVuKSwgTGVuID49IDAgLT4KKyAge05ld1N0YXRlLCBSZXNwb25zZX0gPSB0aHJpZnRfdHJhbnNwb3J0OnJlYWQoV3JhcHBlZCwgTGVuKSwKKyAge1N0YXRlI3RfYnVmZmVyZWR7d3JhcHBlZCA9IE5ld1N0YXRlfSwgUmVzcG9uc2V9LgogCiAKLSUlIFdyaXRlcyBkYXRhIGludG8gdGhlIGJ1ZmZlcgotd3JpdGUoU3RhdGUgPSAjYnVmZmVyZWRfdHJhbnNwb3J0e3dyaXRlX2J1ZmZlciA9IFdCdWZ9LCBEYXRhKSAtPgotICAgIHtTdGF0ZSNidWZmZXJlZF90cmFuc3BvcnR7d3JpdGVfYnVmZmVyID0gW1dCdWYsIERhdGFdfSwgb2t9LgorJSUgcmVhZHMgZGF0YSB0aHJvdWdoIGZyb20gdGhlIHdyYXBwZWQgdHJhbnNwb3J0CityZWFkX2V4YWN0KFN0YXRlID0gI3RfYnVmZmVyZWR7d3JhcHBlZCA9IFdyYXBwZWR9LCBMZW4pCit3aGVuIGlzX2ludGVnZXIoTGVuKSwgTGVuID49IDAgLT4KKyAge05ld1N0YXRlLCBSZXNwb25zZX0gPSB0aHJpZnRfdHJhbnNwb3J0OnJlYWRfZXhhY3QoV3JhcHBlZCwgTGVuKSwKKyAge1N0YXRlI3RfYnVmZmVyZWR7d3JhcHBlZCA9IE5ld1N0YXRlfSwgUmVzcG9uc2V9LgogCi0lJSBGbHVzaGVzIHRoZSBidWZmZXIgdGhyb3VnaCB0byB0aGUgd3JhcHBlZCB0cmFuc3BvcnQKLWZsdXNoKFN0YXRlID0gI2J1ZmZlcmVkX3RyYW5zcG9ydHt3cml0ZV9idWZmZXIgPSBXQnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZWQgPSBXcmFwcGVkMH0pIC0+Ci0gICAge1dyYXBwZWQxLCBSZXNwb25zZX0gPSB0aHJpZnRfdHJhbnNwb3J0OndyaXRlKFdyYXBwZWQwLCBXQnVmKSwKLSAgICB7V3JhcHBlZDIsIF99ID0gdGhyaWZ0X3RyYW5zcG9ydDpmbHVzaChXcmFwcGVkMSksCi0gICAgTmV3U3RhdGUgPSBTdGF0ZSNidWZmZXJlZF90cmFuc3BvcnR7d3JpdGVfYnVmZmVyID0gW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlZCA9IFdyYXBwZWQyfSwKLSAgICB7TmV3U3RhdGUsIFJlc3BvbnNlfS4KIAotJSUgQ2xvc2VzIHRoZSB0cmFuc3BvcnQgYW5kIHRoZSB3cmFwcGVkIHRyYW5zcG9ydAotY2xvc2UoU3RhdGUgPSAjYnVmZmVyZWRfdHJhbnNwb3J0e3dyYXBwZWQgPSBXcmFwcGVkMH0pIC0+Ci0gICAge1dyYXBwZWQxLCBSZXN1bHR9ID0gdGhyaWZ0X3RyYW5zcG9ydDpjbG9zZShXcmFwcGVkMCksCi0gICAgTmV3U3RhdGUgPSBTdGF0ZSNidWZmZXJlZF90cmFuc3BvcnR7d3JhcHBlZCA9IFdyYXBwZWQxfSwKLSAgICB7TmV3U3RhdGUsIFJlc3VsdH0uCit3cml0ZShTdGF0ZSA9ICN0X2J1ZmZlcmVke3dyaXRlX2J1ZmZlciA9IEJ1ZmZlcn0sIERhdGEpIC0+CisgIHtTdGF0ZSN0X2J1ZmZlcmVke3dyaXRlX2J1ZmZlciA9IFtCdWZmZXIsIERhdGFdfSwgb2t9LgogCi0lJSBSZWFkcyBkYXRhIHRocm91Z2ggZnJvbSB0aGUgd3JhcHBlZCB0cmFuc3BvcnQKLXJlYWQoU3RhdGUgPSAjYnVmZmVyZWRfdHJhbnNwb3J0e3dyYXBwZWQgPSBXcmFwcGVkMH0sIExlbikgd2hlbiBpc19pbnRlZ2VyKExlbikgLT4KLSAgICB7V3JhcHBlZDEsIFJlc3BvbnNlfSA9IHRocmlmdF90cmFuc3BvcnQ6cmVhZChXcmFwcGVkMCwgTGVuKSwKLSAgICBOZXdTdGF0ZSA9IFN0YXRlI2J1ZmZlcmVkX3RyYW5zcG9ydHt3cmFwcGVkID0gV3JhcHBlZDF9LAotICAgIHtOZXdTdGF0ZSwgUmVzcG9uc2V9LgorCitmbHVzaChTdGF0ZSA9ICN0X2J1ZmZlcmVke3dyYXBwZWQgPSBXcmFwcGVkLCB3cml0ZV9idWZmZXIgPSBCdWZmZXJ9KSAtPgorICBjYXNlIGlvbGlzdF9zaXplKEJ1ZmZlcikgb2YKKyAgICAlJSBpZiB3cml0ZSBidWZmZXIgaXMgZW1wdHksIGRvIG5vdGhpbmcKKyAgICAwIC0+IHtTdGF0ZSwgb2t9OworICAgIF8gLT4KKyAgICAgIHtXcml0dGVuLCBSZXNwb25zZX0gPSB0aHJpZnRfdHJhbnNwb3J0OndyaXRlKFdyYXBwZWQsIEJ1ZmZlciksCisgICAgICB7Rmx1c2hlZCwgb2t9ID0gdGhyaWZ0X3RyYW5zcG9ydDpmbHVzaChXcml0dGVuKSwKKyAgICAgIHtTdGF0ZSN0X2J1ZmZlcmVke3dyYXBwZWQgPSBGbHVzaGVkLCB3cml0ZV9idWZmZXIgPSBbXX0sIFJlc3BvbnNlfQorICBlbmQuCisKKworY2xvc2UoU3RhdGUgPSAjdF9idWZmZXJlZHt3cmFwcGVkID0gV3JhcHBlZH0pIC0+CisgIHtDbG9zZWQsIFJlc3VsdH0gPSB0aHJpZnRfdHJhbnNwb3J0OmNsb3NlKFdyYXBwZWQpLAorICB7U3RhdGUjdF9idWZmZXJlZHt3cmFwcGVkID0gQ2xvc2VkfSwgUmVzdWx0fS4KKwogCiAlJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAlJSUgSW50ZXJuYWwgZnVuY3Rpb25zCiAlJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAlJSUlIEZBQ1RPUlkgR0VORVJBVElPTiAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCiBuZXdfdHJhbnNwb3J0X2ZhY3RvcnkoV3JhcEZhY3RvcnkpIC0+Ci0gICAgRiA9IGZ1bigpIC0+Ci0gICAgICAgICAgICAgICAge29rLCBXcmFwcGVkfSA9IFdyYXBGYWN0b3J5KCksCi0gICAgICAgICAgICAgICAgbmV3KFdyYXBwZWQpCi0gICAgICAgIGVuZCwKLSAgICB7b2ssIEZ9LgorICBGID0gZnVuKCkgLT4KKyAgICB7b2ssIFdyYXBwZWR9ID0gV3JhcEZhY3RvcnkoKSwKKyAgICBuZXcoV3JhcHBlZCkKKyAgZW5kLAorICB7b2ssIEZ9LgorCmRpZmYgLS1naXQgYS9saWIvZXJsL3NyYy90aHJpZnRfY2xpZW50LmVybCBiL2xpYi9lcmwvc3JjL3RocmlmdF9jbGllbnQuZXJsCmluZGV4IGZmNWMzZGMuLjFhOWNiNTAgMTAwNjQ0Ci0tLSBhL2xpYi9lcmwvc3JjL3RocmlmdF9jbGllbnQuZXJsCisrKyBiL2xpYi9lcmwvc3JjL3RocmlmdF9jbGllbnQuZXJsCkBAIC0zNiwxMyArMzYsMTIgQEAKIAogLXNwZWMgY2FsbCgjdGNsaWVudHt9LCBhdG9tKCksIGxpc3QoKSkgLT4geyN0Y2xpZW50e30sIHtvaywgYW55KCl9IHwge2Vycm9yLCBhbnkoKX19LgogY2FsbChDbGllbnQgPSAjdGNsaWVudHt9LCBGdW5jdGlvbiwgQXJncykKLSAgd2hlbiBpc19hdG9tKEZ1bmN0aW9uKSwgaXNfbGlzdChBcmdzKSAtPgotICAgIGNhc2Ugc2VuZF9mdW5jdGlvbl9jYWxsKENsaWVudCwgRnVuY3Rpb24sIEFyZ3MpIG9mCi0gICAgICAgIHtDbGllbnQxLCBva30gLT4KLSAgICAgICAgICAgIHJlY2VpdmVfZnVuY3Rpb25fcmVzdWx0KENsaWVudDEsIEZ1bmN0aW9uKTsKLSAgICAgICAgRWxzZSAtPgotICAgICAgICAgICAgRWxzZQotICAgIGVuZC4KK3doZW4gaXNfYXRvbShGdW5jdGlvbiksIGlzX2xpc3QoQXJncykgLT4KKyAgY2FzZSBzZW5kX2Z1bmN0aW9uX2NhbGwoQ2xpZW50LCBGdW5jdGlvbiwgQXJncykgb2YKKyAgICB7b2ssIENsaWVudDF9IC0+IHJlY2VpdmVfZnVuY3Rpb25fcmVzdWx0KENsaWVudDEsIEZ1bmN0aW9uKTsKKyAgICB7e2Vycm9yLCBYfSwgQ2xpZW50MX0gLT4ge0NsaWVudDEsIHtlcnJvciwgWH19OworICAgIEVsc2UgLT4gRWxzZQorICBlbmQuCiAKIAogJSUgU2VuZHMgYSBmdW5jdGlvbiBjYWxsIGJ1dCBkb2VzIG5vdCByZWFkIHRoZSByZXN1bHQuIFRoaXMgaXMgdXNlZnVsCkBAIC01MSw3ICs1MCwxMCBAQAogLXNwZWMgc2VuZF9jYWxsKCN0Y2xpZW50e30sIGF0b20oKSwgbGlzdCgpKSAtPiB7I3RjbGllbnR7fSwgb2t9Lgogc2VuZF9jYWxsKENsaWVudCA9ICN0Y2xpZW50e30sIEZ1bmN0aW9uLCBBcmdzKQogICB3aGVuIGlzX2F0b20oRnVuY3Rpb24pLCBpc19saXN0KEFyZ3MpIC0+Ci0gICAgc2VuZF9mdW5jdGlvbl9jYWxsKENsaWVudCwgRnVuY3Rpb24sIEFyZ3MpLgorICAgIGNhc2Ugc2VuZF9mdW5jdGlvbl9jYWxsKENsaWVudCwgRnVuY3Rpb24sIEFyZ3MpIG9mCisgICAgICB7b2ssIENsaWVudDF9IC0+IHtDbGllbnQxLCBva307CisgICAgICBFbHNlIC0+IEVsc2UKKyAgICBlbmQuCiAKIC1zcGVjIGNsb3NlKCN0Y2xpZW50e30pIC0+IG9rLgogY2xvc2UoI3RjbGllbnR7cHJvdG9jb2w9UHJvdG9jb2x9KSAtPgpAQCAtNjEsMzAgKzYzLDQwIEBACiAlJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAlJSUgSW50ZXJuYWwgZnVuY3Rpb25zCiAlJS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0tc3BlYyBzZW5kX2Z1bmN0aW9uX2NhbGwoI3RjbGllbnR7fSwgYXRvbSgpLCBsaXN0KCkpIC0+IHsjdGNsaWVudHt9LCBvayB8IHtlcnJvciwgYW55KCl9fS4KLXNlbmRfZnVuY3Rpb25fY2FsbChDbGllbnQgPSAjdGNsaWVudHtwcm90b2NvbCA9IFByb3RvMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlICA9IFNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxaWQgICAgPSBTZXFJZH0sCi0gICAgICAgICAgICAgICAgICAgRnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgQXJncykgLT4KLSAgICBQYXJhbXMgPSB0cnkgU2VydmljZTpmdW5jdGlvbl9pbmZvKEZ1bmN0aW9uLCBwYXJhbXNfdHlwZSkKLSAgICBjYXRjaCBlcnJvcjpmdW5jdGlvbl9jbGF1c2UgLT4gbm9fZnVuY3Rpb24KLSAgICBlbmQsCi0gICAgY2FzZSBQYXJhbXMgb2YKLSAgICAgICAgbm9fZnVuY3Rpb24gLT4KLSAgICAgICAgICAgIHtDbGllbnQsIHtlcnJvciwge25vX2Z1bmN0aW9uLCBGdW5jdGlvbn19fTsKLSAgICAgICAge3N0cnVjdCwgUExpc3R9IHdoZW4gbGVuZ3RoKFBMaXN0KSA9Lz0gbGVuZ3RoKEFyZ3MpIC0+Ci0gICAgICAgICAgICB7Q2xpZW50LCB7ZXJyb3IsIHtiYWRfYXJncywgRnVuY3Rpb24sIEFyZ3N9fX07Ci0gICAgICAgIHtzdHJ1Y3QsIF9QTGlzdH0gLT4KLSAgICAgICAgICAgIEJlZ2luID0gI3Byb3RvY29sX21lc3NhZ2VfYmVnaW57bmFtZSA9IGF0b21fdG9fbGlzdChGdW5jdGlvbiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSA/dE1lc3NhZ2VUeXBlX0NBTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcWlkID0gU2VxSWR9LAotICAgICAgICAgICAge1Byb3RvMSwgb2t9ID0gdGhyaWZ0X3Byb3RvY29sOndyaXRlKFByb3RvMCwgQmVnaW4pLAotICAgICAgICAgICAge1Byb3RvMiwgb2t9ID0gdGhyaWZ0X3Byb3RvY29sOndyaXRlKFByb3RvMSwge1BhcmFtcywgbGlzdF90b190dXBsZShbRnVuY3Rpb24gfCBBcmdzXSl9KSwKLSAgICAgICAgICAgIHtQcm90bzMsIG9rfSA9IHRocmlmdF9wcm90b2NvbDp3cml0ZShQcm90bzIsIG1lc3NhZ2VfZW5kKSwKLSAgICAgICAgICAgIHtQcm90bzQsIG9rfSA9IHRocmlmdF9wcm90b2NvbDpmbHVzaF90cmFuc3BvcnQoUHJvdG8zKSwKLSAgICAgICAgICAgIHtDbGllbnQjdGNsaWVudHtwcm90b2NvbCA9IFByb3RvNH0sIG9rfQotICAgIGVuZC4KKy1zcGVjIHNlbmRfZnVuY3Rpb25fY2FsbCgjdGNsaWVudHt9LCBhdG9tKCksIGxpc3QoKSkgLT4ge29rIHwge2Vycm9yLCBhbnkoKX0sICN0Y2xpZW50e319Lgorc2VuZF9mdW5jdGlvbl9jYWxsKENsaWVudCA9ICN0Y2xpZW50e3NlcnZpY2UgPSBTZXJ2aWNlfSwgRnVuY3Rpb24sIEFyZ3MpIC0+CisgIHtQYXJhbXMsIFJlcGx5fSA9IHRyeQorICAgIHtTZXJ2aWNlOmZ1bmN0aW9uX2luZm8oRnVuY3Rpb24sIHBhcmFtc190eXBlKSwgU2VydmljZTpmdW5jdGlvbl9pbmZvKEZ1bmN0aW9uLCByZXBseV90eXBlKX0KKyAgY2F0Y2ggZXJyb3I6ZnVuY3Rpb25fY2xhdXNlIC0+IHtub19mdW5jdGlvbiwgMH0KKyAgZW5kLAorICBNc2dUeXBlID0gY2FzZSBSZXBseSBvZgorICAgIG9uZXdheV92b2lkIC0+ID90TWVzc2FnZVR5cGVfT05FV0FZOworICAgIF8gLT4gP3RNZXNzYWdlVHlwZV9DQUxMCisgIGVuZCwKKyAgY2FzZSBQYXJhbXMgb2YKKyAgICBub19mdW5jdGlvbiAtPgorICAgICAge3tlcnJvciwge25vX2Z1bmN0aW9uLCBGdW5jdGlvbn19LCBDbGllbnR9OworICAgIHtzdHJ1Y3QsIFBMaXN0fSB3aGVuIGxlbmd0aChQTGlzdCkgPS89IGxlbmd0aChBcmdzKSAtPgorICAgICAge3tlcnJvciwge2JhZF9hcmdzLCBGdW5jdGlvbiwgQXJnc319LCBDbGllbnR9OworICAgIHtzdHJ1Y3QsIF9QTGlzdH0gLT4gd3JpdGVfbWVzc2FnZShDbGllbnQsIEZ1bmN0aW9uLCBBcmdzLCBQYXJhbXMsIE1zZ1R5cGUpCisgIGVuZC4KKworLXNwZWMgd3JpdGVfbWVzc2FnZSgjdGNsaWVudHt9LCBhdG9tKCksIGxpc3QoKSwge3N0cnVjdCwgbGlzdCgpfSwgaW50ZWdlcigpKSAtPgorICB7b2sgfCB7ZXJyb3IsIGFueSgpfSwgI3RjbGllbnR7fX0uCit3cml0ZV9tZXNzYWdlKENsaWVudCA9ICN0Y2xpZW50e3Byb3RvY29sID0gUDAsIHNlcWlkID0gU2VxfSwgRnVuY3Rpb24sIEFyZ3MsIFBhcmFtcywgTXNnVHlwZSkgLT4KKyAgdHJ5CisgICAge1AxLCBva30gPSB0aHJpZnRfcHJvdG9jb2w6d3JpdGUoUDAsICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lueworICAgICAgbmFtZSA9IGF0b21fdG9fbGlzdChGdW5jdGlvbiksCisgICAgICB0eXBlID0gTXNnVHlwZSwKKyAgICAgIHNlcWlkID0gU2VxCisgICAgfSksCisgICAge1AyLCBva30gPSB0aHJpZnRfcHJvdG9jb2w6d3JpdGUoUDEsIHtQYXJhbXMsIGxpc3RfdG9fdHVwbGUoW0Z1bmN0aW9ufEFyZ3NdKX0pLAorICAgIHtQMywgb2t9ID0gdGhyaWZ0X3Byb3RvY29sOndyaXRlKFAyLCBtZXNzYWdlX2VuZCksCisgICAge1A0LCBva30gPSB0aHJpZnRfcHJvdG9jb2w6Zmx1c2hfdHJhbnNwb3J0KFAzKSwKKyAgICB7b2ssIENsaWVudCN0Y2xpZW50e3Byb3RvY29sID0gUDR9fQorICBjYXRjaAorICAgIGVycm9yOntiYWRtYXRjaCwge18sIHtlcnJvciwgX30gPSBFcnJvcn19IC0+IHtFcnJvciwgQ2xpZW50fQorICBlbmQuCiAKIC1zcGVjIHJlY2VpdmVfZnVuY3Rpb25fcmVzdWx0KCN0Y2xpZW50e30sIGF0b20oKSkgLT4geyN0Y2xpZW50e30sIHtvaywgYW55KCl9IHwge2Vycm9yLCBhbnkoKX19LgogcmVjZWl2ZV9mdW5jdGlvbl9yZXN1bHQoQ2xpZW50ID0gI3RjbGllbnR7c2VydmljZSA9IFNlcnZpY2V9LCBGdW5jdGlvbikgLT4KZGlmZiAtLWdpdCBhL2xpYi9lcmwvc3JjL3RocmlmdF9jbGllbnRfdXRpbC5lcmwgYi9saWIvZXJsL3NyYy90aHJpZnRfY2xpZW50X3V0aWwuZXJsCmluZGV4IDdhMTFmM2EuLjFkYmU1MWUgMTAwNjQ0Ci0tLSBhL2xpYi9lcmwvc3JjL3RocmlmdF9jbGllbnRfdXRpbC5lcmwKKysrIGIvbGliL2VybC9zcmMvdGhyaWZ0X2NsaWVudF91dGlsLmVybApAQCAtMjAsNiArMjAsMTEgQEAKIC1tb2R1bGUodGhyaWZ0X2NsaWVudF91dGlsKS4KIAogLWV4cG9ydChbbmV3LzRdKS4KKy1leHBvcnQoW25ld19tdWx0aXBsZXhlZC8zLCBuZXdfbXVsdGlwbGV4ZWQvNF0pLgorCistdHlwZSBzZXJ2aWNlX25hbWUoKSAgICAgICAgICAgIDo6IG5vbmVtcHR5X3N0cmluZygpLgorLXR5cGUgc2VydmljZV9tb2R1bGUoKSAgICAgICAgICA6OiBhdG9tKCkuCistdHlwZSBtdWx0aXBsZXhlZF9zZXJ2aWNlX21hcCgpIDo6IFt7U2VydmljZU5hbWU6OnNlcnZpY2VfbmFtZSgpLCBTZXJ2aWNlTW9kdWxlOjpzZXJ2aWNlX21vZHVsZSgpfV0uCiAKICUlCiAlJSBTcGxpdHMgY2xpZW50IG9wdGlvbnMgaW50byBjbGllbnQsIHByb3RvY29sLCBhbmQgdHJhbnNwb3J0IG9wdGlvbnMKQEAgLTM0LDI4ICszOSw0MSBAQAogCiBzcGxpdF9vcHRpb25zKFtPcHQgPSB7T3B0S2V5LCBffSB8IFJlc3RdLCBQcm90b0luLCBUcmFuc0luKQogICB3aGVuIE9wdEtleSA9Oj0gc3RyaWN0X3JlYWQ7Ci0gICAgICAgT3B0S2V5ID06PSBzdHJpY3Rfd3JpdGUgLT4KKyAgICAgICBPcHRLZXkgPTo9IHN0cmljdF93cml0ZTsKKyAgICAgICBPcHRLZXkgPTo9IHByb3RvY29sIC0+CiAgICAgc3BsaXRfb3B0aW9ucyhSZXN0LCBbT3B0IHwgUHJvdG9Jbl0sIFRyYW5zSW4pOwogCiBzcGxpdF9vcHRpb25zKFtPcHQgPSB7T3B0S2V5LCBffSB8IFJlc3RdLCBQcm90b0luLCBUcmFuc0luKQogICB3aGVuIE9wdEtleSA9Oj0gZnJhbWVkOwogICAgICAgIE9wdEtleSA9Oj0gY29ubmVjdF90aW1lb3V0OwogICAgICAgIE9wdEtleSA9Oj0gcmVjdl90aW1lb3V0OwotICAgICAgIE9wdEtleSA9Oj0gc29ja29wdHMgLT4KKyAgICAgICBPcHRLZXkgPTo9IHNvY2tvcHRzOworICAgICAgIE9wdEtleSA9Oj0gc3NsdHJhbnNwb3J0OworICAgICAgIE9wdEtleSA9Oj0gc3Nsb3B0aW9ucy0+CiAgICAgc3BsaXRfb3B0aW9ucyhSZXN0LCBQcm90b0luLCBbT3B0IHwgVHJhbnNJbl0pLgogCiAKICUlIENsaWVudCBjb25zdHJ1Y3RvciBmb3IgdGhlIGNvbW1vbi1jYXNlIG9mIHNvY2tldCB0cmFuc3BvcnRzCi0lJSB3aXRoIHRoZSBiaW5hcnkgcHJvdG9jb2wKIG5ldyhIb3N0LCBQb3J0LCBTZXJ2aWNlLCBPcHRpb25zKQogICB3aGVuIGlzX2ludGVnZXIoUG9ydCksIGlzX2F0b20oU2VydmljZSksIGlzX2xpc3QoT3B0aW9ucykgLT4KLSAgICB7UHJvdG9PcHRzLCBUcmFuc09wdHN9ID0gc3BsaXRfb3B0aW9ucyhPcHRpb25zKSwKKyAgICB7UHJvdG9PcHRzLCBUcmFuc09wdHMwfSA9IHNwbGl0X29wdGlvbnMoT3B0aW9ucyksCiAKKyAgICB7VHJhbnNwb3J0TW9kdWxlLCBUcmFuc09wdHMyfSA9IGNhc2UgbGlzdHM6a2V5dGFrZShzc2x0cmFuc3BvcnQsIDEsIFRyYW5zT3B0czApIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3ZhbHVlLCB7XywgdHJ1ZX0sIFRyYW5zT3B0czF9IC0+IHt0aHJpZnRfc3Nsc29ja2V0X3RyYW5zcG9ydCwgVHJhbnNPcHRzMX07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLT4ge3RocmlmdF9zb2NrZXRfdHJhbnNwb3J0LCBUcmFuc09wdHMwfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kLAorCisgICAge1Byb3RvY29sTW9kdWxlLCBQcm90b09wdHMxfSA9IGNhc2UgbGlzdHM6a2V5dGFrZShwcm90b2NvbCwgMSwgUHJvdG9PcHRzKSBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2YWx1ZSwge18sIGNvbXBhY3R9LCBPcHRzfSAtPiB7dGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wsIE9wdHN9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2YWx1ZSwge18sIGpzb259LCBPcHRzfSAtPiB7dGhyaWZ0X2pzb25fcHJvdG9jb2wsIE9wdHN9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2YWx1ZSwge18sIGJpbmFyeX0sIE9wdHN9IC0+IHt0aHJpZnRfYmluYXJ5X3Byb3RvY29sLCBPcHRzfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAtPiB7dGhyaWZ0X2JpbmFyeV9wcm90b2NvbCwgUHJvdG9PcHRzfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQsCiAgICAge29rLCBUcmFuc3BvcnRGYWN0b3J5fSA9Ci0gICAgICAgIHRocmlmdF9zb2NrZXRfdHJhbnNwb3J0Om5ld190cmFuc3BvcnRfZmFjdG9yeShIb3N0LCBQb3J0LCBUcmFuc09wdHMpLAorICAgICAgICBUcmFuc3BvcnRNb2R1bGU6bmV3X3RyYW5zcG9ydF9mYWN0b3J5KEhvc3QsIFBvcnQsIFRyYW5zT3B0czIpLAogCi0gICAge29rLCBQcm90b2NvbEZhY3Rvcnl9ID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbDpuZXdfcHJvdG9jb2xfZmFjdG9yeSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zcG9ydEZhY3RvcnksIFByb3RvT3B0cyksCisgICAge29rLCBQcm90b2NvbEZhY3Rvcnl9ID0gUHJvdG9jb2xNb2R1bGU6bmV3X3Byb3RvY29sX2ZhY3RvcnkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc3BvcnRGYWN0b3J5LCBQcm90b09wdHMxKSwKIAogICAgIGNhc2UgUHJvdG9jb2xGYWN0b3J5KCkgb2YKICAgICAgICAge29rLCBQcm90b2NvbH0gLT4KQEAgLTYzLDMgKzgxLDMyIEBACiAgICAgICAgIHtlcnJvciwgRXJyb3J9IC0+CiAgICAgICAgICAgICB7ZXJyb3IsIEVycm9yfQogICAgIGVuZC4KKworLXNwZWMgbmV3X211bHRpcGxleGVkKEhvc3QsIFBvcnQsIFNlcnZpY2VzLCBPcHRpb25zKSAtPiB7b2ssIFNlcnZpY2VUaHJpZnRDbGllbnRMaXN0fSB3aGVuCisgICAgSG9zdCAgICAgICAgOjogbm9uZW1wdHlfc3RyaW5nKCksCisgICAgUG9ydCAgICAgICAgOjogbm9uX25lZ19pbnRlZ2VyKCksCisgICAgU2VydmljZXMgICAgOjogbXVsdGlwbGV4ZWRfc2VydmljZV9tYXAoKSwKKyAgICBPcHRpb25zICAgICA6OiBsaXN0KCksCisgICAgU2VydmljZVRocmlmdENsaWVudExpc3QgOjogW3tTZXJ2aWNlTmFtZTo6bGlzdCgpLCBUaHJpZnRDbGllbnQ6OnRlcm0oKX1dLgorbmV3X211bHRpcGxleGVkKEhvc3QsIFBvcnQsIFNlcnZpY2VzLCBPcHRpb25zKSB3aGVuIGlzX2ludGVnZXIoUG9ydCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfbGlzdChTZXJ2aWNlcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfbGlzdChPcHRpb25zKSAtPgorICAgIG5ld19tdWx0aXBsZXhlZCh0aHJpZnRfc29ja2V0X3RyYW5zcG9ydDpuZXdfdHJhbnNwb3J0X2ZhY3RvcnkoSG9zdCwgUG9ydCwgT3B0aW9ucyksIFNlcnZpY2VzLCBPcHRpb25zKS4KKworLXNwZWMgbmV3X211bHRpcGxleGVkKFRyYW5zcG9ydEZhY3RvcnlUdXBsZSwgU2VydmljZXMsIE9wdGlvbnMpIC0+IHtvaywgU2VydmljZVRocmlmdENsaWVudExpc3R9IHdoZW4KKyAgICBUcmFuc3BvcnRGYWN0b3J5VHVwbGUgICA6OiB7b2ssIFRyYW5zcG9ydEZhY3Rvcnk6OnRlcm0oKX0sCisgICAgU2VydmljZXMgICAgICAgICAgICAgICAgOjogbXVsdGlwbGV4ZWRfc2VydmljZV9tYXAoKSwKKyAgICBPcHRpb25zICAgICAgICAgICAgICAgICA6OiBsaXN0KCksCisgICAgU2VydmljZVRocmlmdENsaWVudExpc3QgOjogW3tTZXJ2aWNlTmFtZTo6c2VydmljZV9uYW1lKCksIFRocmlmdENsaWVudDo6dGVybSgpfV0uCituZXdfbXVsdGlwbGV4ZWQoVHJhbnNwb3J0RmFjdG9yeVR1cGxlLCBTZXJ2aWNlcywgT3B0aW9ucykgd2hlbiBpc19saXN0KFNlcnZpY2VzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2xpc3QoT3B0aW9ucyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc190dXBsZShUcmFuc3BvcnRGYWN0b3J5VHVwbGUpIC0+CisgICAge1Byb3RvT3B0cywgX30gPSBzcGxpdF9vcHRpb25zKE9wdGlvbnMpLAorCisgICAge29rLCBUcmFuc3BvcnRGYWN0b3J5fSA9IFRyYW5zcG9ydEZhY3RvcnlUdXBsZSwKKworICAgIHtvaywgUHJvdG9jb2xGYWN0b3J5fSA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2w6bmV3X3Byb3RvY29sX2ZhY3RvcnkoVHJhbnNwb3J0RmFjdG9yeSwgUHJvdG9PcHRzKSwKKworICAgIHtvaywgUHJvdG9jb2x9ID0gUHJvdG9jb2xGYWN0b3J5KCksCisKKyAgICB7b2ssIFt7U2VydmljZU5hbWUsIGVsZW1lbnQoMiwgdGhyaWZ0X2NsaWVudDpuZXcoZWxlbWVudCgyLCB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2w6bmV3KFByb3RvY29sLCBTZXJ2aWNlTmFtZSkpLCBTZXJ2aWNlKSl9IHx8IHtTZXJ2aWNlTmFtZSwgU2VydmljZX0gPC0gU2VydmljZXNdfS4KZGlmZiAtLWdpdCBhL2xpYi9lcmwvc3JjL3RocmlmdF9jb21wYWN0X3Byb3RvY29sLmVybCBiL2xpYi9lcmwvc3JjL3RocmlmdF9jb21wYWN0X3Byb3RvY29sLmVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjE0MjIxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC9zcmMvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wuZXJsCkBAIC0wLDAgKzEsMzkwIEBACislJQorJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCislJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorJSUKKyUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCislJQorJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyUlIHVuZGVyIHRoZSBMaWNlbnNlLgorJSUKKworLW1vZHVsZSh0aHJpZnRfY29tcGFjdF9wcm90b2NvbCkuCisKKy1iZWhhdmlvdXIodGhyaWZ0X3Byb3RvY29sKS4KKworLWluY2x1ZGUoInRocmlmdF9jb25zdGFudHMuaHJsIikuCistaW5jbHVkZSgidGhyaWZ0X3Byb3RvY29sLmhybCIpLgorCistZXhwb3J0KFtuZXcvMSwgbmV3LzIsCisgICAgICAgICByZWFkLzIsCisgICAgICAgICB3cml0ZS8yLAorICAgICAgICAgZmx1c2hfdHJhbnNwb3J0LzEsCisgICAgICAgICBjbG9zZV90cmFuc3BvcnQvMSwKKyAgICAgICAgIG5ld19wcm90b2NvbF9mYWN0b3J5LzIKKyAgICAgICAgXSkuCisKKy1kZWZpbmUoSURfTk9ORSwgMTYjMTAwMDApLgorLWRlZmluZShDQk9PTF9OT05FLCAwKS4KKy1kZWZpbmUoQ0JPT0xfVFJVRSwgMSkuCistZGVmaW5lKENCT09MX0ZBTFNFLCAyKS4KKworLXJlY29yZCh0X2NvbXBhY3QsIHt0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAlIHN0YXRlIGZvciBwZW5kaW5nIGJvb2xlYW4gZmllbGRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkX3N0YWNrPVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF92YWx1ZT0/Q0JPT0xfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX3N0YWNrPVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfaWQ9P0lEX05PTkUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuCistdHlwZSBzdGF0ZSgpIDo6ICN0X2NvbXBhY3R7fS4KKy1pbmNsdWRlKCJ0aHJpZnRfcHJvdG9jb2xfYmVoYXZpb3VyLmhybCIpLgorCistZGVmaW5lKFBST1RPQ09MX0lELCAxNiM4MikuCistZGVmaW5lKFZFUlNJT05fTUFTSywgMTYjMWYpLgorLWRlZmluZShWRVJTSU9OXzEsIDE2IzAxKS4KKy1kZWZpbmUoVFlQRV9NQVNLLCAxNiNFMCkuCistZGVmaW5lKFRZUEVfQklUUywgMTYjMDcpLgorLWRlZmluZShUWVBFX1NISUZUX0FNT1VOVCwgNSkuCisKK3R5cGVpZF90b19jb21wYWN0KD90VHlwZV9TVE9QKSAtPiAxNiMwOwordHlwZWlkX3RvX2NvbXBhY3QoP3RUeXBlX0JPT0wpIC0+IDE2IzI7Cit0eXBlaWRfdG9fY29tcGFjdCg/dFR5cGVfSTgpIC0+IDE2IzM7Cit0eXBlaWRfdG9fY29tcGFjdCg/dFR5cGVfSTE2KSAtPiAxNiM0OwordHlwZWlkX3RvX2NvbXBhY3QoP3RUeXBlX0kzMikgLT4gMTYjNTsKK3R5cGVpZF90b19jb21wYWN0KD90VHlwZV9JNjQpIC0+IDE2IzY7Cit0eXBlaWRfdG9fY29tcGFjdCg/dFR5cGVfRE9VQkxFKSAtPiAxNiM3OwordHlwZWlkX3RvX2NvbXBhY3QoP3RUeXBlX1NUUklORykgLT4gMTYjODsKK3R5cGVpZF90b19jb21wYWN0KD90VHlwZV9TVFJVQ1QpIC0+IDE2I0M7Cit0eXBlaWRfdG9fY29tcGFjdCg/dFR5cGVfTUFQKSAtPiAxNiNCOwordHlwZWlkX3RvX2NvbXBhY3QoP3RUeXBlX1NFVCkgLT4gMTYjQTsKK3R5cGVpZF90b19jb21wYWN0KD90VHlwZV9MSVNUKSAtPiAxNiM5LgorCitjb21wYWN0X3RvX3R5cGVpZCgxNiMwKSAtPiAgP3RUeXBlX1NUT1A7Citjb21wYWN0X3RvX3R5cGVpZCg/Q0JPT0xfRkFMU0UpIC0+ICA/dFR5cGVfQk9PTDsKK2NvbXBhY3RfdG9fdHlwZWlkKD9DQk9PTF9UUlVFKSAtPiAgP3RUeXBlX0JPT0w7Citjb21wYWN0X3RvX3R5cGVpZCgxNiM3KSAtPiAgP3RUeXBlX0RPVUJMRTsKK2NvbXBhY3RfdG9fdHlwZWlkKDE2IzMpIC0+ICA/dFR5cGVfSTg7Citjb21wYWN0X3RvX3R5cGVpZCgxNiM0KSAtPiAgP3RUeXBlX0kxNjsKK2NvbXBhY3RfdG9fdHlwZWlkKDE2IzUpIC0+ICA/dFR5cGVfSTMyOworY29tcGFjdF90b190eXBlaWQoMTYjNikgLT4gID90VHlwZV9JNjQ7Citjb21wYWN0X3RvX3R5cGVpZCgxNiM4KSAtPiAgP3RUeXBlX1NUUklORzsKK2NvbXBhY3RfdG9fdHlwZWlkKDE2I0MpIC0+ICA/dFR5cGVfU1RSVUNUOworY29tcGFjdF90b190eXBlaWQoMTYjQikgLT4gID90VHlwZV9NQVA7Citjb21wYWN0X3RvX3R5cGVpZCgxNiNBKSAtPiAgP3RUeXBlX1NFVDsKK2NvbXBhY3RfdG9fdHlwZWlkKDE2IzkpIC0+ICA/dFR5cGVfTElTVC4KKworYm9vbF90b19jYm9vbChWYWx1ZSkgd2hlbiBWYWx1ZSAtPiA/Q0JPT0xfVFJVRTsKK2Jvb2xfdG9fY2Jvb2woXykgLT4gP0NCT09MX0ZBTFNFLgorY2Jvb2xfdG9fYm9vbChWYWx1ZSkgLT4gVmFsdWUgPTo9ID9DQk9PTF9UUlVFLgorCituZXcoVHJhbnNwb3J0KSAtPiBuZXcoVHJhbnNwb3J0LCBfT3B0aW9ucyA9IFtdKS4KKworbmV3KFRyYW5zcG9ydCwgX09wdGlvbnMpIC0+CisgIFN0YXRlICA9ICN0X2NvbXBhY3R7dHJhbnNwb3J0ID0gVHJhbnNwb3J0fSwKKyAgdGhyaWZ0X3Byb3RvY29sOm5ldyg/TU9EVUxFLCBTdGF0ZSkuCisKK2ZsdXNoX3RyYW5zcG9ydChUaGlzID0gI3RfY29tcGFjdHt0cmFuc3BvcnQgPSBUcmFuc3BvcnR9KSAtPgorICB7TmV3VHJhbnNwb3J0LCBSZXN1bHR9ID0gdGhyaWZ0X3RyYW5zcG9ydDpmbHVzaChUcmFuc3BvcnQpLAorICB7VGhpcyN0X2NvbXBhY3R7dHJhbnNwb3J0ID0gTmV3VHJhbnNwb3J0fSwgUmVzdWx0fS4KKworY2xvc2VfdHJhbnNwb3J0KFRoaXMgPSAjdF9jb21wYWN0e3RyYW5zcG9ydCA9IFRyYW5zcG9ydH0pIC0+CisgIHtOZXdUcmFuc3BvcnQsIFJlc3VsdH0gPSB0aHJpZnRfdHJhbnNwb3J0OmNsb3NlKFRyYW5zcG9ydCksCisgIHtUaGlzI3RfY29tcGFjdHt0cmFuc3BvcnQgPSBOZXdUcmFuc3BvcnR9LCBSZXN1bHR9LgorCislJSUKKyUlJSBpbnN0YW5jZSBtZXRob2RzCislJSUKKword3JpdGVfZmllbGRfYmVnaW4oVGhpczAgPSAjdF9jb21wYWN0e3dyaXRlX3N0YWNrPVtMYXN0SWR8VF19LCBDb21wYWN0VHlwZSwgSWQpIC0+CisgIElkRGlmZiA9IElkIC0gTGFzdElkLAorICBUaGlzMSA9IFRoaXMwI3RfY29tcGFjdHt3cml0ZV9zdGFjaz1bSWR8VF19LAorICBjYXNlIChJZERpZmYgPiAwKSBhbmQgKElkRGlmZiA8IDE2KSBvZgorICAgIHRydWUgLT4gd3JpdGUoVGhpczEsIHtieXRlLCAoSWREaWZmIGJzbCA0KSBib3IgQ29tcGFjdFR5cGV9KTsKKyAgICBmYWxzZSAtPgorICAgICAge1RoaXMyLCBva30gPSB3cml0ZShUaGlzMSwge2J5dGUsIENvbXBhY3RUeXBlfSksCisgICAgICB3cml0ZShUaGlzMiwge2kxNiwgSWR9KQorICBlbmQuCisKKy1zcGVjIHRvX3ppZ3phZyhpbnRlZ2VyKCkpIC0+IG5vbl9uZWdfaW50ZWdlcigpLgordG9femlnemFnKFZhbHVlKSAtPiAxNiNGRkZGRkZGRkZGRkZGRkZGIGJhbmQgKChWYWx1ZSBic2wgMSkgYnhvciAoVmFsdWUgYnNyIDYzKSkuCisKKy1zcGVjIGZyb21femlnemFnKG5vbl9uZWdfaW50ZWdlcigpKSAtPiBpbnRlZ2VyKCkuCitmcm9tX3ppZ3phZyhWYWx1ZSkgLT4gKFZhbHVlIGJzciAxKSBieG9yIC0oVmFsdWUgYmFuZCAxKS4KKworLXNwZWMgdG9fdmFyaW50KG5vbl9uZWdfaW50ZWdlcigpLCBpb2xpc3QoKSkgLT4gaW9saXN0KCkuCit0b192YXJpbnQoVmFsdWUsIEFjYykgd2hlbiAoVmFsdWUgPCAxNiM4MCkgLT4gW0FjYywgVmFsdWVdOwordG9fdmFyaW50KFZhbHVlLCBBY2MpIC0+CisgIHRvX3ZhcmludChWYWx1ZSBic3IgNywgW0FjYywgKChWYWx1ZSBiYW5kIDE2IzdGKSBib3IgMTYjODApXSkuCisKKy1zcGVjIHJlYWRfdmFyaW50KCN0X2NvbXBhY3R7fSwgbm9uX25lZ19pbnRlZ2VyKCksIG5vbl9uZWdfaW50ZWdlcigpKSAtPiBub25fbmVnX2ludGVnZXIoKS4KK3JlYWRfdmFyaW50KFRoaXMwLCBBY2MsIENvdW50KSAtPgorICB7VGhpczEsIHtvaywgQnl0ZX19ID0gcmVhZChUaGlzMCwgYnl0ZSksCisgIGNhc2UgKEJ5dGUgYmFuZCAxNiM4MCkgb2YKKyAgICAwIC0+IHtUaGlzMSwge29rLCAoQnl0ZSBic2wgKDcgKiBDb3VudCkpICsgQWNjfX07CisgICAgXyAtPiByZWFkX3ZhcmludChUaGlzMSwgKChCeXRlIGJhbmQgMTYjN2YpIGJzbCAoNyAqIENvdW50KSkgKyBBY2MsIENvdW50ICsgMSkKKyAgZW5kLgorCit3cml0ZShUaGlzMCwgI3Byb3RvY29sX21lc3NhZ2VfYmVnaW57CisgICAgICAgIG5hbWUgPSBOYW1lLAorICAgICAgICB0eXBlID0gVHlwZSwKKyAgICAgICAgc2VxaWQgPSBTZXFpZH0pIC0+CisgIHtUaGlzMSwgb2t9ID0gd3JpdGUoVGhpczAsIHtieXRlLCA/UFJPVE9DT0xfSUR9KSwKKyAge1RoaXMyLCBva30gPSB3cml0ZShUaGlzMSwge2J5dGUsICg/VkVSU0lPTl8xIGJhbmQgP1ZFUlNJT05fTUFTSykgYm9yIChUeXBlIGJzbCA/VFlQRV9TSElGVF9BTU9VTlQpfSksCisgIHtUaGlzMywgb2t9ID0gd3JpdGUoVGhpczIsIHt1aTMyLCBTZXFpZH0pLAorICB7VGhpczQsIG9rfSA9IHdyaXRlKFRoaXMzLCB7c3RyaW5nLCBOYW1lfSksCisgIHtUaGlzNCwgb2t9OworCit3cml0ZShUaGlzLCBtZXNzYWdlX2VuZCkgLT4ge1RoaXMsIG9rfTsKKword3JpdGUoVGhpczAsICNwcm90b2NvbF9maWVsZF9iZWdpbnsKKyAgICAgICBuYW1lID0gX05hbWUsCisgICAgICAgdHlwZSA9IFR5cGUsCisgICAgICAgaWQgPSBJZH0pCit3aGVuIChUeXBlID06PSA/dFR5cGVfQk9PTCkgLT4ge1RoaXMwI3RfY29tcGFjdHt3cml0ZV9pZCA9IElkfSwgb2t9OworCit3cml0ZShUaGlzMCwgI3Byb3RvY29sX2ZpZWxkX2JlZ2lueworICAgICAgIG5hbWUgPSBfTmFtZSwKKyAgICAgICB0eXBlID0gVHlwZSwKKyAgICAgICBpZCA9IElkfSkgLT4KKyAgd3JpdGVfZmllbGRfYmVnaW4oVGhpczAsIHR5cGVpZF90b19jb21wYWN0KFR5cGUpLCBJZCk7CisKK3dyaXRlKFRoaXMsIGZpZWxkX3N0b3ApIC0+IHdyaXRlKFRoaXMsIHtieXRlLCA/dFR5cGVfU1RPUH0pOworCit3cml0ZShUaGlzLCBmaWVsZF9lbmQpIC0+IHtUaGlzLCBva307CisKK3dyaXRlKFRoaXMwLCAjcHJvdG9jb2xfbWFwX2JlZ2lueworICAgICAga3R5cGUgPSBfS3R5cGUsCisgICAgICB2dHlwZSA9IF9WdHlwZSwKKyAgICAgIHNpemUgPSBTaXplfSkKK3doZW4gU2l6ZSA9Oj0gMCAtPgorICB3cml0ZShUaGlzMCwge2J5dGUsIDB9KTsKKword3JpdGUoVGhpczAsICNwcm90b2NvbF9tYXBfYmVnaW57CisgICAgICAga3R5cGUgPSBLdHlwZSwKKyAgICAgICB2dHlwZSA9IFZ0eXBlLAorICAgICAgIHNpemUgPSBTaXplfSkgLT4KKyAge1RoaXMxLCBva30gPSB3cml0ZShUaGlzMCwge3VpMzIsIFNpemV9KSwKKyAgd3JpdGUoVGhpczEsIHtieXRlLCAodHlwZWlkX3RvX2NvbXBhY3QoS3R5cGUpIGJzbCA0KSBib3IgdHlwZWlkX3RvX2NvbXBhY3QoVnR5cGUpfSk7CisKK3dyaXRlKFRoaXMsIG1hcF9lbmQpIC0+IHtUaGlzLCBva307CisKK3dyaXRlKFRoaXMwLCAjcHJvdG9jb2xfbGlzdF9iZWdpbnsKKyAgICAgICAgZXR5cGUgPSBFdHlwZSwKKyAgICAgICAgc2l6ZSA9IFNpemV9KQord2hlbiBTaXplIDwgMTYjZiAtPgorICB3cml0ZShUaGlzMCwge2J5dGUsIChTaXplIGJzbCA0KSBib3IgdHlwZWlkX3RvX2NvbXBhY3QoRXR5cGUpfSk7CisKK3dyaXRlKFRoaXMwLCAjcHJvdG9jb2xfbGlzdF9iZWdpbnsKKyAgICAgICAgZXR5cGUgPSBFdHlwZSwKKyAgICAgICAgc2l6ZSA9IFNpemV9KSAtPgorICB7VGhpczEsIG9rfSA9IHdyaXRlKFRoaXMwLCB7Ynl0ZSwgMTYjZjAgYm9yIHR5cGVpZF90b19jb21wYWN0KEV0eXBlKX0pLAorICB3cml0ZShUaGlzMSwge3VpMzIsIFNpemV9KTsKKword3JpdGUoVGhpcywgbGlzdF9lbmQpIC0+IHtUaGlzLCBva307CisKK3dyaXRlKFRoaXMwLCAjcHJvdG9jb2xfc2V0X2JlZ2lueworICAgICAgICBldHlwZSA9IEV0eXBlLAorICAgICAgICBzaXplID0gU2l6ZX0pIC0+CisgIHdyaXRlKFRoaXMwLCAjcHJvdG9jb2xfbGlzdF9iZWdpbntldHlwZSA9IEV0eXBlLCBzaXplID0gIFNpemV9KTsKKword3JpdGUoVGhpcywgc2V0X2VuZCkgLT4ge1RoaXMsIG9rfTsKKword3JpdGUoVGhpcyA9ICN0X2NvbXBhY3R7d3JpdGVfc3RhY2sgPSBTdGFja30sICNwcm90b2NvbF9zdHJ1Y3RfYmVnaW57fSkgLT4KKyAge1RoaXMjdF9jb21wYWN0e3dyaXRlX3N0YWNrID0gWzB8U3RhY2tdfSwgb2t9Oword3JpdGUoVGhpcyA9ICN0X2NvbXBhY3R7d3JpdGVfc3RhY2sgPSBbX3xUXX0sIHN0cnVjdF9lbmQpIC0+CisgIHtUaGlzI3RfY29tcGFjdHt3cml0ZV9zdGFjayA9IFR9LCBva307CisKK3dyaXRlKFRoaXMgPSAjdF9jb21wYWN0e3dyaXRlX2lkID0gP0lEX05PTkV9LCB7Ym9vbCwgVmFsdWV9KSAtPgorICB3cml0ZShUaGlzLCB7Ynl0ZSwgYm9vbF90b19jYm9vbChWYWx1ZSl9KTsKKword3JpdGUoVGhpczAgPSAjdF9jb21wYWN0e3dyaXRlX2lkID0gSWR9LCB7Ym9vbCwgVmFsdWV9KSAtPgorICB7VGhpczEsIG9rfSA9IHdyaXRlX2ZpZWxkX2JlZ2luKFRoaXMwLCBib29sX3RvX2Nib29sKFZhbHVlKSwgSWQpLAorICB7VGhpczEjdF9jb21wYWN0e3dyaXRlX2lkID0gP0lEX05PTkV9LCBva307CisKK3dyaXRlKFRoaXMsIHtieXRlLCBWYWx1ZX0pIHdoZW4gaXNfaW50ZWdlcihWYWx1ZSkgLT4KKyAgd3JpdGUoVGhpcywgPDxWYWx1ZTo4L2JpZy1zaWduZWQ+Pik7CisKK3dyaXRlKFRoaXMsIHtpMTYsIFZhbHVlfSkgd2hlbiBpc19pbnRlZ2VyKFZhbHVlKSAtPiB3cml0ZShUaGlzLCB0b192YXJpbnQodG9femlnemFnKFZhbHVlKSwgW10pKTsKK3dyaXRlKFRoaXMsIHt1aTMyLCBWYWx1ZX0pIHdoZW4gaXNfaW50ZWdlcihWYWx1ZSkgLT4gd3JpdGUoVGhpcywgdG9fdmFyaW50KFZhbHVlLCBbXSkpOword3JpdGUoVGhpcywge2kzMiwgVmFsdWV9KSB3aGVuIGlzX2ludGVnZXIoVmFsdWUpIC0+CisgIHdyaXRlKFRoaXMsIHRvX3ZhcmludCh0b196aWd6YWcoVmFsdWUpLCBbXSkpOword3JpdGUoVGhpcywge2k2NCwgVmFsdWV9KSB3aGVuIGlzX2ludGVnZXIoVmFsdWUpIC0+IHdyaXRlKFRoaXMsIHRvX3ZhcmludCh0b196aWd6YWcoVmFsdWUpLCBbXSkpOworCit3cml0ZShUaGlzLCB7ZG91YmxlLCBEb3VibGV9KSAtPgorICB3cml0ZShUaGlzLCA8PERvdWJsZTo2NC9mbG9hdC1zaWduZWQtbGl0dGxlPj4pOworCit3cml0ZShUaGlzMCwge3N0cmluZywgU3RyfSkgd2hlbiBpc19saXN0KFN0cikgLT4KKyAgJSBUT0RPOiBsaW1pdCBsZW5ndGgKKyAge1RoaXMxLCBva30gPSB3cml0ZShUaGlzMCwge3VpMzIsIGxlbmd0aChTdHIpfSksCisgIHtUaGlzMiwgb2t9ID0gd3JpdGUoVGhpczEsIGxpc3RfdG9fYmluYXJ5KFN0cikpLAorICB7VGhpczIsIG9rfTsKKword3JpdGUoVGhpczAsIHtzdHJpbmcsIEJpbn0pIHdoZW4gaXNfYmluYXJ5KEJpbikgLT4KKyAgJSBUT0RPOiBsaW1pdCBsZW5ndGgKKyAge1RoaXMxLCBva30gPSB3cml0ZShUaGlzMCwge3VpMzIsIHNpemUoQmluKX0pLAorICB7VGhpczIsIG9rfSA9IHdyaXRlKFRoaXMxLCBCaW4pLAorICB7VGhpczIsIG9rfTsKKworJSUgRGF0YSA6OiBpb2xpc3QoKQord3JpdGUoVGhpcyA9ICN0X2NvbXBhY3R7dHJhbnNwb3J0ID0gVHJhbnN9LCBEYXRhKSAtPgorICB7TmV3VHJhbnNwb3J0LCBSZXN1bHR9ID0gdGhyaWZ0X3RyYW5zcG9ydDp3cml0ZShUcmFucywgRGF0YSksCisgIHtUaGlzI3RfY29tcGFjdHt0cmFuc3BvcnQgPSBOZXdUcmFuc3BvcnR9LCBSZXN1bHR9LgorCislJQorJSUKKworcmVhZChUaGlzMCwgbWVzc2FnZV9iZWdpbikgLT4KKyAge1RoaXMxLCB7b2ssID9QUk9UT0NPTF9JRH19ID0gcmVhZChUaGlzMCwgdWJ5dGUpLAorICB7VGhpczIsIHtvaywgVmVyQW5kVHlwZX19ID0gcmVhZChUaGlzMSwgdWJ5dGUpLAorICA/VkVSU0lPTl8xID0gVmVyQW5kVHlwZSBiYW5kID9WRVJTSU9OX01BU0ssCisgIHtUaGlzMywge29rLCBTZXFJZH19ID0gcmVhZChUaGlzMiwgdWkzMiksCisgIHtUaGlzNCwge29rLCBOYW1lfX0gPSByZWFkKFRoaXMzLCBzdHJpbmcpLAorICB7VGhpczQsICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lueworICAgICAgICAgICAgIG5hbWUgID0gYmluYXJ5X3RvX2xpc3QoTmFtZSksCisgICAgICAgICAgICAgdHlwZSAgPSAoVmVyQW5kVHlwZSBic3IgP1RZUEVfU0hJRlRfQU1PVU5UKSBiYW5kID9UWVBFX0JJVFMsCisgICAgICAgICAgICAgc2VxaWQgPSBTZXFJZH19OworCityZWFkKFRoaXMsIG1lc3NhZ2VfZW5kKSAtPiB7VGhpcywgb2t9OworCityZWFkKFRoaXMgPSAjdF9jb21wYWN0e3JlYWRfc3RhY2sgPSBTdGFja30sIHN0cnVjdF9iZWdpbikgLT4KKyAge1RoaXMjdF9jb21wYWN0e3JlYWRfc3RhY2sgPSBbMHxTdGFja119LCBva307CityZWFkKFRoaXMgPSAjdF9jb21wYWN0e3JlYWRfc3RhY2sgPSBbX0h8VF19LCBzdHJ1Y3RfZW5kKSAtPgorICB7VGhpcyN0X2NvbXBhY3R7cmVhZF9zdGFjayA9IFR9LCBva307CisKK3JlYWQoVGhpczAgPSAjdF9jb21wYWN0e3JlYWRfc3RhY2sgPSBbTGFzdElkfFRdfSwgZmllbGRfYmVnaW4pIC0+CisgIHtUaGlzMSwge29rLCBCeXRlfX0gPSByZWFkKFRoaXMwLCB1Ynl0ZSksCisgIGNhc2UgQnl0ZSBiYW5kIDE2I2Ygb2YKKyAgICBDb21wYWN0VHlwZSA9ID90VHlwZV9TVE9QIC0+CisgICAgICB7VGhpczEsICNwcm90b2NvbF9maWVsZF9iZWdpbnt0eXBlID0gQ29tcGFjdFR5cGV9fTsKKyAgICBDb21wYWN0VHlwZSAtPgorICAgICAge1RoaXMyLCB7b2ssIElkfX0gPSBjYXNlIEJ5dGUgYnNyIDQgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC0+IHJlYWQoVGhpczEsIGkxNik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWREaWZmIC0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7VGhpczEsIHtvaywgTGFzdElkICsgSWREaWZmfX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kLAorICAgICAgY2FzZSBjb21wYWN0X3RvX3R5cGVpZChDb21wYWN0VHlwZSkgb2YKKyAgICAgICAgP3RUeXBlX0JPT0wgLT4KKyAgICAgICAgICB7VGhpczIjdF9jb21wYWN0e3JlYWRfc3RhY2sgPSBbSWR8VF0sIHJlYWRfdmFsdWUgPSBjYm9vbF90b19ib29sKENvbXBhY3RUeXBlKX0sCisgICAgICAgICAgICNwcm90b2NvbF9maWVsZF9iZWdpbnt0eXBlID0gP3RUeXBlX0JPT0wsIGlkID0gSWR9fTsKKyAgICAgICAgVHlwZSAtPgorICAgICAgICAgIHtUaGlzMiN0X2NvbXBhY3R7cmVhZF9zdGFjayA9IFtJZHxUXX0sCisgICAgICAgICAgICNwcm90b2NvbF9maWVsZF9iZWdpbnt0eXBlID0gVHlwZSwgaWQgPSBJZH19CisgICAgICBlbmQKKyAgZW5kOworCityZWFkKFRoaXMsIGZpZWxkX2VuZCkgLT4ge1RoaXMsIG9rfTsKKworcmVhZChUaGlzMCwgbWFwX2JlZ2luKSAtPgorICB7VGhpczEsIHtvaywgU2l6ZX19ICA9IHJlYWQoVGhpczAsIHVpMzIpLAorICB7VGhpczIsIHtvaywgS1Z9fSA9IGNhc2UgU2l6ZSBvZgorICAgICAgICAgICAgICAgICAgICAgICAgMCAtPiB7VGhpczEsIHtvaywgMH19OworICAgICAgICAgICAgICAgICAgICAgICAgXyAtPiByZWFkKFRoaXMxLCB1Ynl0ZSkKKyAgICAgICAgICAgICAgICAgICAgICBlbmQsCisgIHtUaGlzMiwgI3Byb3RvY29sX21hcF9iZWdpbntrdHlwZSA9IGNvbXBhY3RfdG9fdHlwZWlkKEtWIGJzciA0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZ0eXBlID0gY29tcGFjdF90b190eXBlaWQoS1YgYmFuZCAxNiNmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBTaXplfX07CityZWFkKFRoaXMsIG1hcF9lbmQpIC0+IHtUaGlzLCBva307CisKK3JlYWQoVGhpczAsIGxpc3RfYmVnaW4pIC0+CisgIHtUaGlzMSwge29rLCBTaXplQW5kVHlwZX19ID0gcmVhZChUaGlzMCwgdWJ5dGUpLAorICB7VGhpczIsIHtvaywgU2l6ZX19ID0gY2FzZSAoU2l6ZUFuZFR5cGUgYnNyIDQpIGJhbmQgMTYjZiBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAxNiNmIC0+IHJlYWQoVGhpczEsIHVpMzIpOworICAgICAgICAgICAgICAgICAgICAgICAgICBFbHNlIC0+IHtUaGlzMSwge29rLCBFbHNlfX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZCwKKyAge1RoaXMyLCAjcHJvdG9jb2xfbGlzdF9iZWdpbntldHlwZSA9IGNvbXBhY3RfdG9fdHlwZWlkKFNpemVBbmRUeXBlIGJhbmQgMTYjZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IFNpemV9fTsKKworcmVhZChUaGlzLCBsaXN0X2VuZCkgLT4ge1RoaXMsIG9rfTsKKworcmVhZChUaGlzMCwgc2V0X2JlZ2luKSAtPgorICB7VGhpczEsIHtvaywgU2l6ZUFuZFR5cGV9fSA9IHJlYWQoVGhpczAsIHVieXRlKSwKKyAge1RoaXMyLCB7b2ssIFNpemV9fSA9IGNhc2UgKFNpemVBbmRUeXBlIGJzciA0KSBiYW5kIDE2I2Ygb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMTYjZiAtPiByZWFkKFRoaXMxLCB1aTMyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRWxzZSAtPiB7VGhpczEsIHtvaywgRWxzZX19CisgICAgICAgICAgICAgICAgICAgICAgICBlbmQsCisgIHtUaGlzMiwgI3Byb3RvY29sX3NldF9iZWdpbntldHlwZSA9IGNvbXBhY3RfdG9fdHlwZWlkKFNpemVBbmRUeXBlIGJhbmQgMTYjZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IFNpemV9fTsKKworcmVhZChUaGlzLCBzZXRfZW5kKSAtPiB7VGhpcywgb2t9OworCityZWFkKFRoaXMwLCBmaWVsZF9zdG9wKSAtPgorICB7VGhpczEsIHtvaywgP3RUeXBlX1NUT1B9fSA9IHJlYWQoVGhpczAsIHVieXRlKSwKKyAge1RoaXMxLCBva307CisKKyUlCisKK3JlYWQoVGhpczAgPSAjdF9jb21wYWN0e3JlYWRfdmFsdWUgPSA/Q0JPT0xfTk9ORX0sIGJvb2wpIC0+CisgIHtUaGlzMSwge29rLCBCeXRlfX0gPSByZWFkKFRoaXMwLCB1Ynl0ZSksCisgIHtUaGlzMSwge29rLCBjYm9vbF90b19ib29sKEJ5dGUpfX07CisKK3JlYWQoVGhpczAgPSAjdF9jb21wYWN0e3JlYWRfdmFsdWUgPSBCb29sfSwgYm9vbCkgLT4KKyAge1RoaXMwI3RfY29tcGFjdHtyZWFkX3ZhbHVlID0gP0NCT09MX05PTkV9LCB7b2ssIEJvb2x9fTsKKworcmVhZChUaGlzMCwgdWJ5dGUpIC0+CisgIHtUaGlzMSwge29rLCA8PFZhbDo4L2ludGVnZXItdW5zaWduZWQtYmlnLCBfL2JpbmFyeT4+fX0gPSByZWFkX2RhdGEoVGhpczAsIDEpLAorICB7VGhpczEsIHtvaywgVmFsfX07CisKK3JlYWQoVGhpczAsIGJ5dGUpIC0+CisgIHtUaGlzMSwgQnl0ZXN9ID0gcmVhZF9kYXRhKFRoaXMwLCAxKSwKKyAgY2FzZSBCeXRlcyBvZgorICAgIHtvaywgPDxWYWw6OC9pbnRlZ2VyLXNpZ25lZC1iaWcsIF8vYmluYXJ5Pj59IC0+IHtUaGlzMSwge29rLCBWYWx9fTsKKyAgICBFbHNlIC0+IHtUaGlzMSwgRWxzZX0KKyAgZW5kOworCityZWFkKFRoaXMwLCBpMTYpIC0+CisgIHtUaGlzMSwge29rLCBaaWd6YWd9fSA9IHJlYWRfdmFyaW50KFRoaXMwLCAwLCAwKSwKKyAge1RoaXMxLCB7b2ssIGZyb21femlnemFnKFppZ3phZyl9fTsKKworcmVhZChUaGlzMCwgdWkzMikgLT4gcmVhZF92YXJpbnQoVGhpczAsIDAsIDApOworCityZWFkKFRoaXMwLCBpMzIpIC0+CisgIHtUaGlzMSwge29rLCBaaWd6YWd9fSA9IHJlYWRfdmFyaW50KFRoaXMwLCAwLCAwKSwKKyAge1RoaXMxLCB7b2ssIGZyb21femlnemFnKFppZ3phZyl9fTsKKworcmVhZChUaGlzMCwgaTY0KSAtPgorICB7VGhpczEsIHtvaywgWmlnemFnfX0gPSByZWFkX3ZhcmludChUaGlzMCwgMCwgMCksCisgIHtUaGlzMSwge29rLCBmcm9tX3ppZ3phZyhaaWd6YWcpfX07CisKK3JlYWQoVGhpczAsIGRvdWJsZSkgLT4KKyAge1RoaXMxLCBCeXRlc30gPSByZWFkX2RhdGEoVGhpczAsIDgpLAorICBjYXNlIEJ5dGVzIG9mCisgICAge29rLCA8PFZhbDo2NC9mbG9hdC1zaWduZWQtbGl0dGxlLCBfL2JpbmFyeT4+fSAtPiB7VGhpczEsIHtvaywgVmFsfX07CisgICAgRWxzZSAtPiB7VGhpczEsIEVsc2V9CisgIGVuZDsKKworJSByZXR1cm5zIGEgYmluYXJ5IGRpcmVjdGx5LCBjYWxsIGJpbmFyeV90b19saXN0IGlmIG5lY2Vzc2FyeQorcmVhZChUaGlzMCwgc3RyaW5nKSAtPgorICB7VGhpczEsIHtvaywgU3p9fSAgPSByZWFkKFRoaXMwLCB1aTMyKSwKKyAgcmVhZF9kYXRhKFRoaXMxLCBTeikuCisKKy1zcGVjIHJlYWRfZGF0YSgjdF9jb21wYWN0e30sIG5vbl9uZWdfaW50ZWdlcigpKSAtPgorICAgIHsjdF9jb21wYWN0e30sIHtvaywgYmluYXJ5KCl9IHwge2Vycm9yLCBfUmVhc29ufX0uCityZWFkX2RhdGEoVGhpcywgMCkgLT4ge1RoaXMsIHtvaywgPDw+Pn19OworcmVhZF9kYXRhKFRoaXMgPSAjdF9jb21wYWN0e3RyYW5zcG9ydCA9IFRyYW5zfSwgTGVuKSB3aGVuIGlzX2ludGVnZXIoTGVuKSBhbmRhbHNvIExlbiA+IDAgLT4KKyAgICB7TmV3VHJhbnNwb3J0LCBSZXN1bHR9ID0gdGhyaWZ0X3RyYW5zcG9ydDpyZWFkKFRyYW5zLCBMZW4pLAorICAgIHtUaGlzI3RfY29tcGFjdHt0cmFuc3BvcnQgPSBOZXdUcmFuc3BvcnR9LCBSZXN1bHR9LgorCisKKyUlJSUgRkFDVE9SWSBHRU5FUkFUSU9OICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKKworJSUgcmV0dXJucyBhIChmdW4oKSAtPiB0aHJpZnRfcHJvdG9jb2woKSkKK25ld19wcm90b2NvbF9mYWN0b3J5KFRyYW5zcG9ydEZhY3RvcnksIF9PcHRpb25zKSAtPgorICBGID0gZnVuKCkgLT4KKyAgICAgICAgICBjYXNlIFRyYW5zcG9ydEZhY3RvcnkoKSBvZgorICAgICAgICAgICAge29rLCBUcmFuc3BvcnR9IC0+CisgICAgICAgICAgICAgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sOm5ldygKKyAgICAgICAgICAgICAgICBUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgW10pOworICAgICAgICAgICAge2Vycm9yLCBFcnJvcn0gLT4KKyAgICAgICAgICAgICAge2Vycm9yLCBFcnJvcn0KKyAgICAgICAgICBlbmQKKyAgICAgIGVuZCwKKyAge29rLCBGfS4KZGlmZiAtLWdpdCBhL2xpYi9lcmwvc3JjL3RocmlmdF9maWxlX3RyYW5zcG9ydC5lcmwgYi9saWIvZXJsL3NyYy90aHJpZnRfZmlsZV90cmFuc3BvcnQuZXJsCmluZGV4IGJhM2FhODkuLjA3MTE1MmIgMTAwNjQ0Ci0tLSBhL2xpYi9lcmwvc3JjL3RocmlmdF9maWxlX3RyYW5zcG9ydC5lcmwKKysrIGIvbGliL2VybC9zcmMvdGhyaWZ0X2ZpbGVfdHJhbnNwb3J0LmVybApAQCAtMjEsNjkgKzIxLDk1IEBACiAKIC1iZWhhdmlvdXIodGhyaWZ0X3RyYW5zcG9ydCkuCiAKLS1leHBvcnQoW25ld19yZWFkZXIvMSwKLSAgICAgICAgIG5ldy8xLAotICAgICAgICAgbmV3LzIsCi0gICAgICAgICB3cml0ZS8yLCByZWFkLzIsIGZsdXNoLzEsIGNsb3NlLzFdKS4KKyUlIGNvbnN0cnVjdG9ycworLWV4cG9ydChbbmV3LzEsIG5ldy8yXSkuCislJSBwcm90b2NvbCBjYWxsYmFja3MKKy1leHBvcnQoW3JlYWQvMiwgcmVhZF9leGFjdC8yLCB3cml0ZS8yLCBmbHVzaC8xLCBjbG9zZS8xXSkuCislJSBsZWdhY3kgYXBpCistZXhwb3J0KFtuZXdfcmVhZGVyLzFdKS4KIAotLXJlY29yZCh0X2ZpbGVfdHJhbnNwb3J0LCB7ZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkX2Nsb3NlID0gdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgPSB3cml0ZX0pLgotLXR5cGUgc3RhdGUoKSA6OiAjdF9maWxlX3RyYW5zcG9ydHt9LgotLWluY2x1ZGUoInRocmlmdF90cmFuc3BvcnRfYmVoYXZpb3VyLmhybCIpLgogCi0lJSUlIENPTlNUUlVDVElPTiAgICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKKy1yZWNvcmQodF9maWxlLCB7CisgIGRldmljZSwKKyAgc2hvdWxkX2Nsb3NlID0gdHJ1ZSwKKyAgbW9kZSA9IHdyaXRlCit9KS4KIAotbmV3X3JlYWRlcihGaWxlbmFtZSkgLT4KLSAgICBjYXNlIGZpbGU6b3BlbihGaWxlbmFtZSwgW3JlYWQsIGJpbmFyeSwge3JlYWRfYWhlYWQsIDEwMjQqMTAyNH1dKSBvZgotICAgICAgICB7b2ssIElPRGV2aWNlfSAtPgotICAgICAgICAgICAgbmV3KElPRGV2aWNlLCBbe3Nob3VsZF9jbG9zZSwgdHJ1ZX0sIHttb2RlLCByZWFkfV0pOwotICAgICAgICBFcnJvciAtPiBFcnJvcgotICAgIGVuZC4KKy10eXBlIHN0YXRlKCkgOjogI3RfZmlsZXt9LgogCi1uZXcoRGV2aWNlKSAtPgotICAgIG5ldyhEZXZpY2UsIFtdKS4KIAotJSUgRGV2aWNlIDo6IGlvX2RldmljZSgpCi0lJQorLXNwZWMgbmV3KERldmljZTo6ZmlsZTppb19kZXZpY2UoKSkgLT4KKyAgdGhyaWZ0X3RyYW5zcG9ydDp0X3RyYW5zcG9ydCgpLgorCituZXcoRGV2aWNlKSAtPiBuZXcoRGV2aWNlLCBbXSkuCisKKy1zcGVjIG5ldyhEZXZpY2U6OmZpbGU6aW9fZGV2aWNlKCksIE9wdHM6Omxpc3QoKSkgLT4KKyAgdGhyaWZ0X3RyYW5zcG9ydDp0X3RyYW5zcG9ydCgpLgorCiAlJSBEZXZpY2Ugc2hvdWxkIGJlIG9wZW5lZCBpbiByYXcgYW5kIGJpbmFyeSBtb2RlLgogbmV3KERldmljZSwgT3B0cykgd2hlbiBpc19saXN0KE9wdHMpIC0+Ci0gICAgU3RhdGUgPSBwYXJzZV9vcHRzKE9wdHMsICN0X2ZpbGVfdHJhbnNwb3J0e2RldmljZSA9IERldmljZX0pLAotICAgIHRocmlmdF90cmFuc3BvcnQ6bmV3KD9NT0RVTEUsIFN0YXRlKS4KKyAgU3RhdGUgPSBwYXJzZV9vcHRzKE9wdHMsICN0X2ZpbGV7ZGV2aWNlID0gRGV2aWNlfSksCisgIHRocmlmdF90cmFuc3BvcnQ6bmV3KD9NT0RVTEUsIFN0YXRlKS4KIAogCi0lJSBQYXJzZSBvcHRpb25zCi1wYXJzZV9vcHRzKFt7c2hvdWxkX2Nsb3NlLCBCb29sfSB8IFJlc3RdLCBTdGF0ZSkgd2hlbiBpc19ib29sZWFuKEJvb2wpIC0+Ci0gICAgcGFyc2Vfb3B0cyhSZXN0LCBTdGF0ZSN0X2ZpbGVfdHJhbnNwb3J0e3Nob3VsZF9jbG9zZSA9IEJvb2x9KTsKLXBhcnNlX29wdHMoW3ttb2RlLCBNb2RlfSB8IFJlc3RdLCBTdGF0ZSkKLSAgd2hlbiBNb2RlID06PSB3cml0ZTsKLSAgICAgICBNb2RlID06PSByZWFkIC0+Ci0gICAgcGFyc2Vfb3B0cyhSZXN0LCBTdGF0ZSN0X2ZpbGVfdHJhbnNwb3J0e21vZGUgPSBNb2RlfSk7CitwYXJzZV9vcHRzKFt7c2hvdWxkX2Nsb3NlLCBCb29sfXxSZXN0XSwgU3RhdGUpCit3aGVuIGlzX2Jvb2xlYW4oQm9vbCkgLT4KKyAgcGFyc2Vfb3B0cyhSZXN0LCBTdGF0ZSN0X2ZpbGV7c2hvdWxkX2Nsb3NlID0gQm9vbH0pOworcGFyc2Vfb3B0cyhbe21vZGUsIE1vZGV9fFJlc3RdLCBTdGF0ZSkKK3doZW4gTW9kZSA9Oj0gd3JpdGU7IE1vZGUgPTo9IHJlYWQgLT4KKyAgcGFyc2Vfb3B0cyhSZXN0LCBTdGF0ZSN0X2ZpbGV7bW9kZSA9IE1vZGV9KTsKIHBhcnNlX29wdHMoW10sIFN0YXRlKSAtPgotICAgICBTdGF0ZS4KKyAgU3RhdGUuCiAKIAotJSUlJSBUUkFOU1BPUlQgSU1QTCAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCi0KLXdyaXRlKFRoaXMgPSAjdF9maWxlX3RyYW5zcG9ydHtkZXZpY2UgPSBEZXZpY2UsIG1vZGUgPSB3cml0ZX0sIERhdGEpIC0+Ci0gICAge1RoaXMsIGZpbGU6d3JpdGUoRGV2aWNlLCBEYXRhKX07Ci13cml0ZShUaGlzLCBfRCkgLT4KLSAgICB7VGhpcywge2Vycm9yLCByZWFkX21vZGV9fS4KKy1pbmNsdWRlKCJ0aHJpZnRfdHJhbnNwb3J0X2JlaGF2aW91ci5ocmwiKS4KIAogCi1yZWFkKFRoaXMgPSAjdF9maWxlX3RyYW5zcG9ydHtkZXZpY2UgPSBEZXZpY2UsIG1vZGUgPSByZWFkfSwgTGVuKQotICB3aGVuIGlzX2ludGVnZXIoTGVuKSwgTGVuID49IDAgLT4KLSAgICB7VGhpcywgZmlsZTpyZWFkKERldmljZSwgTGVuKX07Ci1yZWFkKFRoaXMsIF9EKSAtPgotICAgIHtUaGlzLCB7ZXJyb3IsIHJlYWRfbW9kZX19LgorcmVhZChTdGF0ZSA9ICN0X2ZpbGV7ZGV2aWNlID0gRGV2aWNlLCBtb2RlID0gcmVhZH0sIExlbikKK3doZW4gaXNfaW50ZWdlcihMZW4pLCBMZW4gPj0gMCAtPgorICBjYXNlIGZpbGU6cmVhZChEZXZpY2UsIExlbikgb2YKKyAgICBlb2YgLT4ge1N0YXRlLCB7ZXJyb3IsIGVvZn19OworICAgIHtvaywgUmVzdWx0fSAtPiB7U3RhdGUsIHtvaywgaW9saXN0X3RvX2JpbmFyeShSZXN1bHQpfX0KKyAgZW5kOworcmVhZChTdGF0ZSwgXykgLT4KKyAge1N0YXRlLCB7ZXJyb3IsIHdyaXRlX21vZGV9fS4KIAotZmx1c2goVGhpcyA9ICN0X2ZpbGVfdHJhbnNwb3J0e2RldmljZSA9IERldmljZSwgbW9kZSA9IHdyaXRlfSkgLT4KLSAgICB7VGhpcywgZmlsZTpzeW5jKERldmljZSl9LgogCi1jbG9zZShUaGlzID0gI3RfZmlsZV90cmFuc3BvcnR7ZGV2aWNlID0gRGV2aWNlLCBzaG91bGRfY2xvc2UgPSBTQ30pIC0+Ci0gICAgY2FzZSBTQyBvZgotICAgICAgICB0cnVlIC0+Ci0gICAgICAgICAgICB7VGhpcywgZmlsZTpjbG9zZShEZXZpY2UpfTsKLSAgICAgICAgZmFsc2UgLT4KLSAgICAgICAgICAgIHtUaGlzLCBva30KLSAgICBlbmQuCityZWFkX2V4YWN0KFN0YXRlID0gI3RfZmlsZXtkZXZpY2UgPSBEZXZpY2UsIG1vZGUgPSByZWFkfSwgTGVuKQord2hlbiBpc19pbnRlZ2VyKExlbiksIExlbiA+PSAwIC0+CisgIGNhc2UgZmlsZTpyZWFkKERldmljZSwgTGVuKSBvZgorICAgIGVvZiAtPiB7U3RhdGUsIHtlcnJvciwgZW9mfX07CisgICAge29rLCBSZXN1bHR9IC0+CisgICAgICBjYXNlIGlvbGlzdF9zaXplKFJlc3VsdCkgb2YKKyAgICAgICAgWCB3aGVuIFggPCBMZW4gLT4ge1N0YXRlLCB7ZXJyb3IsIGVvZn19OworICAgICAgICBfIC0+IHtTdGF0ZSwge29rLCBpb2xpc3RfdG9fYmluYXJ5KFJlc3VsdCl9fQorICAgICAgZW5kCisgIGVuZDsKK3JlYWRfZXhhY3QoU3RhdGUsIF8pIC0+CisgIHtTdGF0ZSwge2Vycm9yLCB3cml0ZV9tb2RlfX0uCisKKword3JpdGUoU3RhdGUgPSAjdF9maWxle2RldmljZSA9IERldmljZSwgbW9kZSA9IHdyaXRlfSwgRGF0YSkgLT4KKyAge1N0YXRlLCBmaWxlOndyaXRlKERldmljZSwgRGF0YSl9Oword3JpdGUoU3RhdGUsIF8pIC0+CisgIHtTdGF0ZSwge2Vycm9yLCByZWFkX21vZGV9fS4KKworCitmbHVzaChTdGF0ZSA9ICN0X2ZpbGV7ZGV2aWNlID0gRGV2aWNlLCBtb2RlID0gd3JpdGV9KSAtPgorICB7U3RhdGUsIGZpbGU6c3luYyhEZXZpY2UpfS4KKworCitjbG9zZShTdGF0ZSA9ICN0X2ZpbGV7ZGV2aWNlID0gRGV2aWNlLCBzaG91bGRfY2xvc2UgPSBTQ30pIC0+CisgIGNhc2UgU0Mgb2YKKyAgICB0cnVlIC0+IHtTdGF0ZSwgZmlsZTpjbG9zZShEZXZpY2UpfTsKKyAgICBmYWxzZSAtPiB7U3RhdGUsIG9rfQorICBlbmQuCisKKworJSUgbGVnYWN5IGFwaS4gbGVmdCBmb3IgY29tcGF0aWJpbGl0eQorbmV3X3JlYWRlcihGaWxlbmFtZSkgLT4KKyAgY2FzZSBmaWxlOm9wZW4oRmlsZW5hbWUsIFtyZWFkLCBiaW5hcnksIHtyZWFkX2FoZWFkLCAxMDI0KjEwMjR9XSkgb2YKKyAgICB7b2ssIElPRGV2aWNlfSAtPiBuZXcoSU9EZXZpY2UsIFt7c2hvdWxkX2Nsb3NlLCB0cnVlfSwge21vZGUsIHJlYWR9XSk7CisgICAgRXJyb3IgLT4gRXJyb3IKKyAgZW5kLgorCmRpZmYgLS1naXQgYS9saWIvZXJsL3NyYy90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5lcmwgYi9saWIvZXJsL3NyYy90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5lcmwKaW5kZXggZWNhM2NiZS4uOWE1ZDZhZiAxMDA2NDQKLS0tIGEvbGliL2VybC9zcmMvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuZXJsCisrKyBiL2xpYi9lcmwvc3JjL3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmVybApAQCAtMjEsODMgKzIxLDEwNiBAQAogCiAtYmVoYXZpb3VyKHRocmlmdF90cmFuc3BvcnQpLgogCi0lJSBBUEkKKyUlIGNvbnN0cnVjdG9yCiAtZXhwb3J0KFtuZXcvMV0pLgorJSUgcHJvdG9jb2wgY2FsbGJhY2tzCistZXhwb3J0KFtyZWFkLzIsIHJlYWRfZXhhY3QvMiwgd3JpdGUvMiwgZmx1c2gvMSwgY2xvc2UvMV0pLgogCi0lJSB0aHJpZnRfdHJhbnNwb3J0IGNhbGxiYWNrcwotLWV4cG9ydChbd3JpdGUvMiwgcmVhZC8yLCBmbHVzaC8xLCBjbG9zZS8xXSkuCiAKLS1yZWNvcmQoZnJhbWVkX3RyYW5zcG9ydCwge3dyYXBwZWQsICUgYSB0aHJpZnRfdHJhbnNwb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkX2J1ZmZlciwgJSBpb2xpc3QoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfYnVmZmVyICUgaW9saXN0KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuCi0tdHlwZSBzdGF0ZSgpIDo6ICNmcmFtZWRfdHJhbnNwb3J0e30uCistcmVjb3JkKHRfZnJhbWVkLCB7CisgIHdyYXBwZWQsCisgIHJlYWRfYnVmZmVyLAorICB3cml0ZV9idWZmZXIKK30pLgorCistdHlwZSBzdGF0ZSgpIDo6ICN0X2ZyYW1lZHt9LgorCisKKy1zcGVjIG5ldyhUcmFuc3BvcnQ6OnRocmlmdF90cmFuc3BvcnQ6dF90cmFuc3BvcnQoKSkgLT4KKyAgdGhyaWZ0X3RyYW5zcG9ydDp0X3RyYW5zcG9ydCgpLgorCituZXcoV3JhcHBlZCkgLT4KKyAgU3RhdGUgPSAjdF9mcmFtZWR7CisgICAgd3JhcHBlZCA9IFdyYXBwZWQsCisgICAgcmVhZF9idWZmZXIgPSBbXSwKKyAgICB3cml0ZV9idWZmZXIgPSBbXQorICB9LAorICB0aHJpZnRfdHJhbnNwb3J0Om5ldyg/TU9EVUxFLCBTdGF0ZSkuCisKKwogLWluY2x1ZGUoInRocmlmdF90cmFuc3BvcnRfYmVoYXZpb3VyLmhybCIpLgogCi1uZXcoV3JhcHBlZFRyYW5zcG9ydCkgLT4KLSAgICBTdGF0ZSA9ICNmcmFtZWRfdHJhbnNwb3J0e3dyYXBwZWQgPSBXcmFwcGVkVHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF9idWZmZXIgPSBbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX2J1ZmZlciA9IFtdfSwKLSAgICB0aHJpZnRfdHJhbnNwb3J0Om5ldyg/TU9EVUxFLCBTdGF0ZSkuCiAKLSUlIFdyaXRlcyBkYXRhIGludG8gdGhlIGJ1ZmZlcgotd3JpdGUoU3RhdGUgPSAjZnJhbWVkX3RyYW5zcG9ydHt3cml0ZV9idWZmZXIgPSBXQnVmfSwgRGF0YSkgLT4KLSAgICB7U3RhdGUjZnJhbWVkX3RyYW5zcG9ydHt3cml0ZV9idWZmZXIgPSBbV0J1ZiwgRGF0YV19LCBva30uCityZWFkKFN0YXRlID0gI3RfZnJhbWVke3dyYXBwZWQgPSBXcmFwcGVkLCByZWFkX2J1ZmZlciA9IEJ1ZmZlcn0sIExlbikKK3doZW4gaXNfaW50ZWdlcihMZW4pLCBMZW4gPj0gMCAtPgorICBCaW5hcnkgPSBpb2xpc3RfdG9fYmluYXJ5KEJ1ZmZlciksCisgIGNhc2UgQmluYXJ5IG9mCisgICAgPDw+PiB3aGVuIExlbiA+IDAgLT4KKyAgICAgIGNhc2UgbmV4dF9mcmFtZShXcmFwcGVkKSBvZgorICAgICAgICB7TmV3U3RhdGUsIHtvaywgRnJhbWV9fSAtPgorICAgICAgICAgIE5ld0JpbmFyeSA9IGlvbGlzdF90b19iaW5hcnkoW0JpbmFyeSwgRnJhbWVdKSwKKyAgICAgICAgICBHaXZlID0gbWluKGlvbGlzdF9zaXplKE5ld0JpbmFyeSksIExlbiksCisgICAgICAgICAge1Jlc3VsdCwgUmVtYWluaW5nfSA9IHNwbGl0X2JpbmFyeShOZXdCaW5hcnksIEdpdmUpLAorICAgICAgICAgIHtTdGF0ZSN0X2ZyYW1lZHt3cmFwcGVkID0gTmV3U3RhdGUsIHJlYWRfYnVmZmVyID0gUmVtYWluaW5nfSwge29rLCBSZXN1bHR9fTsKKyAgICAgICAge05ld1N0YXRlLCBFcnJvcn0gLT4KKyAgICAgICAgICB7U3RhdGUjdF9mcmFtZWR7d3JhcHBlZCA9IE5ld1N0YXRlfSwgRXJyb3J9CisgICAgICBlbmQ7CisgICAgJSUgcmVhZCBvZiB6ZXJvIGJ5dGVzCisgICAgPDw+PiAtPiB7U3RhdGUsIHtvaywgPDw+Pn19OworICAgICUlIHJlYWQgYnVmZmVyIGlzIG5vbmVtcHR5CisgICAgXyAtPgorICAgICAgR2l2ZSA9IG1pbihpb2xpc3Rfc2l6ZShCaW5hcnkpLCBMZW4pLAorICAgICAge1Jlc3VsdCwgUmVtYWluaW5nfSA9IHNwbGl0X2JpbmFyeShCaW5hcnksIEdpdmUpLAorICAgICAge1N0YXRlI3RfZnJhbWVke3JlYWRfYnVmZmVyID0gUmVtYWluaW5nfSwge29rLCBSZXN1bHR9fQorICBlbmQuCiAKLSUlIEZsdXNoZXMgdGhlIGJ1ZmZlciB0aHJvdWdoIHRvIHRoZSB3cmFwcGVkIHRyYW5zcG9ydAotZmx1c2goU3RhdGUwID0gI2ZyYW1lZF90cmFuc3BvcnR7d3JpdGVfYnVmZmVyID0gQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVkID0gV3JhcHBlZDB9KSAtPgotICAgIEZyYW1lTGVuID0gaW9saXN0X3NpemUoQnVmZmVyKSwKLSAgICBEYXRhICAgICA9IFs8PEZyYW1lTGVuOjMyL2ludGVnZXItc2lnbmVkLWJpZz4+LCBCdWZmZXJdLAogCi0gICAge1dyYXBwZWQxLCBSZXNwb25zZX0gPSB0aHJpZnRfdHJhbnNwb3J0OndyaXRlKFdyYXBwZWQwLCBEYXRhKSwKK3JlYWRfZXhhY3QoU3RhdGUgPSAjdF9mcmFtZWR7d3JhcHBlZCA9IFdyYXBwZWQsIHJlYWRfYnVmZmVyID0gQnVmZmVyfSwgTGVuKQord2hlbiBpc19pbnRlZ2VyKExlbiksIExlbiA+PSAwIC0+CisgIEJpbmFyeSA9IGlvbGlzdF90b19iaW5hcnkoQnVmZmVyKSwKKyAgY2FzZSBpb2xpc3Rfc2l6ZShCaW5hcnkpIG9mCisgICAgJSUgcmVhZCBidWZmZXIgaXMgbGFyZ2VyIHRoYW4gcmVxdWVzdGVkIHJlYWQgc2l6ZQorICAgIFggd2hlbiBYID49IExlbiAtPgorICAgICAge1Jlc3VsdCwgUmVtYWluaW5nfSA9IHNwbGl0X2JpbmFyeShCaW5hcnksIExlbiksCisgICAgICB7U3RhdGUjdF9mcmFtZWR7cmVhZF9idWZmZXIgPSBSZW1haW5pbmd9LCB7b2ssIFJlc3VsdH19OworICAgICUlIHJlYWQgYnVmZmVyIGlzIGluc3VmZmljaWVudCBmb3IgcmVxdWVzdGVkIHJlYWQgc2l6ZQorICAgIF8gLT4KKyAgICAgIGNhc2UgbmV4dF9mcmFtZShXcmFwcGVkKSBvZgorICAgICAgICB7TmV3U3RhdGUsIHtvaywgRnJhbWV9fSAtPgorICAgICAgICAgIHJlYWRfZXhhY3QoCisgICAgICAgICAgICBTdGF0ZSN0X2ZyYW1lZHt3cmFwcGVkID0gTmV3U3RhdGUsIHJlYWRfYnVmZmVyID0gW0J1ZmZlciwgRnJhbWVdfSwKKyAgICAgICAgICAgIExlbgorICAgICAgICAgICk7CisgICAgICAgIHtOZXdTdGF0ZSwgRXJyb3J9IC0+CisgICAgICAgICAge1N0YXRlI3RfZnJhbWVke3dyYXBwZWQgPSBOZXdTdGF0ZX0sIEVycm9yfQorICAgICAgZW5kCisgIGVuZC4KIAotICAgIHtXcmFwcGVkMiwgX30gPSB0aHJpZnRfdHJhbnNwb3J0OmZsdXNoKFdyYXBwZWQxKSwKK25leHRfZnJhbWUoVHJhbnNwb3J0KSAtPgorICBjYXNlIHRocmlmdF90cmFuc3BvcnQ6cmVhZF9leGFjdChUcmFuc3BvcnQsIDQpIG9mCisgICAge05ld1N0YXRlLCB7b2ssIDw8RnJhbWVMZW5ndGg6MzIvaW50ZWdlci1zaWduZWQtYmlnPj59fSAtPgorICAgICAgdGhyaWZ0X3RyYW5zcG9ydDpyZWFkX2V4YWN0KE5ld1N0YXRlLCBGcmFtZUxlbmd0aCk7CisgICAgRXJyb3IgLT4gRXJyb3IKKyAgZW5kLgogCi0gICAgU3RhdGUxID0gU3RhdGUwI2ZyYW1lZF90cmFuc3BvcnR7d3JhcHBlZCA9IFdyYXBwZWQyLCB3cml0ZV9idWZmZXIgPSBbXX0sCi0gICAge1N0YXRlMSwgUmVzcG9uc2V9LgogCi0lJSBDbG9zZXMgdGhlIHRyYW5zcG9ydCBhbmQgdGhlIHdyYXBwZWQgdHJhbnNwb3J0Ci1jbG9zZShTdGF0ZSA9ICNmcmFtZWRfdHJhbnNwb3J0e3dyYXBwZWQgPSBXcmFwcGVkMH0pIC0+Ci0gICAge1dyYXBwZWQxLCBSZXN1bHR9ID0gdGhyaWZ0X3RyYW5zcG9ydDpjbG9zZShXcmFwcGVkMCksCi0gICAgTmV3U3RhdGUgPSBTdGF0ZSNmcmFtZWRfdHJhbnNwb3J0e3dyYXBwZWQgPSBXcmFwcGVkMX0sCi0gICAge05ld1N0YXRlLCBSZXN1bHR9Lgord3JpdGUoU3RhdGUgPSAjdF9mcmFtZWR7d3JpdGVfYnVmZmVyID0gQnVmZmVyfSwgRGF0YSkgLT4KKyAge1N0YXRlI3RfZnJhbWVke3dyaXRlX2J1ZmZlciA9IFtCdWZmZXIsIERhdGFdfSwgb2t9LgogCi0lJSBSZWFkcyBkYXRhIHRocm91Z2ggZnJvbSB0aGUgd3JhcHBlZCB0cmFuc3BvcnQKLXJlYWQoU3RhdGUwID0gI2ZyYW1lZF90cmFuc3BvcnR7d3JhcHBlZCA9IFdyYXBwZWQwLCByZWFkX2J1ZmZlciA9IFJCdWZ9LAotICAgICBMZW4pIHdoZW4gaXNfaW50ZWdlcihMZW4pIC0+Ci0gICAge1dyYXBwZWQxLCB7UkJ1ZjEsIFJCdWYxU2l6ZX19ID0KLSAgICAgICAgJSUgaWYgdGhlIHJlYWQgYnVmZmVyIGlzIGVtcHR5LCByZWFkIGFub3RoZXIgZnJhbWUKLSAgICAgICAgJSUgb3RoZXJ3aXNlLCBqdXN0IHJlYWQgZnJvbSB3aGF0J3MgbGVmdCBpbiB0aGUgYnVmZmVyCi0gICAgICAgIGNhc2UgaW9saXN0X3NpemUoUkJ1Zikgb2YKLSAgICAgICAgICAgIDAgLT4KLSAgICAgICAgICAgICAgICAlJSByZWFkIHRoZSBmcmFtZSBsZW5ndGgKLSAgICAgICAgICAgICAgICBjYXNlIHRocmlmdF90cmFuc3BvcnQ6cmVhZChXcmFwcGVkMCwgNCkgb2YKLSAgICAgICAgICAgICAgICAgIHtXcmFwcGVkUzEsCi0gICAgICAgICAgICAgICAgICAgIHtvaywgPDxGcmFtZUxlbjozMi9pbnRlZ2VyLXNpZ25lZC1iaWcsIF8vYmluYXJ5Pj59fSAtPgotICAgICAgICAgICAgICAgICAgICAlJSB0aGVuIHJlYWQgdGhlIGRhdGEKLSAgICAgICAgICAgICAgICAgICAgY2FzZSB0aHJpZnRfdHJhbnNwb3J0OnJlYWQoV3JhcHBlZFMxLCBGcmFtZUxlbikgb2YKLSAgICAgICAgICAgICAgICAgICAgICB7V3JhcHBlZFMyLCB7b2ssIEJpbn19IC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICB7V3JhcHBlZFMyLCB7QmluLCBlcmxhbmc6Ynl0ZV9zaXplKEJpbil9fTsKLSAgICAgICAgICAgICAgICAgICAgICB7V3JhcHBlZFMyLCB7ZXJyb3IsIFJlYXNvbjF9fSAtPgotICAgICAgICAgICAgICAgICAgICAgICAge1dyYXBwZWRTMiwge2Vycm9yLCBSZWFzb24xfX0KLSAgICAgICAgICAgICAgICAgICAgZW5kOwotICAgICAgICAgICAgICAgICAge1dyYXBwZWRTMSwge2Vycm9yLCBSZWFzb24yfX0gLT4KLSAgICAgICAgICAgICAgICAgICAge1dyYXBwZWRTMSwge2Vycm9yLCBSZWFzb24yfX0KLSAgICAgICAgICAgICAgICBlbmQ7Ci0gICAgICAgICAgICBTeiAtPgotICAgICAgICAgICAgICAgIHtXcmFwcGVkMCwge1JCdWYsIFN6fX0KLSAgICAgICAgZW5kLAogCi0gICAgJSUgcHVsbCBvZmYgR2l2ZSBieXRlcywgcmV0dXJuIHRoZW0gdG8gdGhlIHVzZXIsIGxlYXZlIHRoZSByZXN0IGluIHRoZSBidWZmZXIKLSAgICBjYXNlIFJCdWYxIG9mCi0gICAgICBlcnJvciAtPgotICAgICAgICB7IFN0YXRlMCNmcmFtZWRfdHJhbnNwb3J0IHt3cmFwcGVkID0gV3JhcHBlZDEsIHJlYWRfYnVmZmVyID0gW10gfSwKLSAgICAgICAgICB7UkJ1ZjEsIFJCdWYxU2l6ZX0gfTsKLSAgICAgIF8gLT4KLSAgICAgICAgR2l2ZSA9IG1pbihSQnVmMVNpemUsIExlbiksCi0gICAgICAgIDw8RGF0YTpHaXZlL2JpbmFyeSwgUkJ1ZjIvYmluYXJ5Pj4gPSBpb2xpc3RfdG9fYmluYXJ5KFJCdWYxKSwKK2ZsdXNoKFN0YXRlID0gI3RfZnJhbWVke3dyaXRlX2J1ZmZlciA9IEJ1ZmZlciwgd3JhcHBlZCA9IFdyYXBwZWR9KSAtPgorICBjYXNlIGlvbGlzdF9zaXplKEJ1ZmZlcikgb2YKKyAgICAlJSBpZiB3cml0ZSBidWZmZXIgaXMgZW1wdHksIGRvIG5vdGhpbmcKKyAgICAwIC0+IHtTdGF0ZSwgb2t9OworICAgIEZyYW1lTGVuIC0+CisgICAgICBEYXRhID0gWzw8RnJhbWVMZW46MzIvaW50ZWdlci1zaWduZWQtYmlnPj4sIEJ1ZmZlcl0sCisgICAgICB7V3JpdHRlbiwgUmVzcG9uc2V9ID0gdGhyaWZ0X3RyYW5zcG9ydDp3cml0ZShXcmFwcGVkLCBEYXRhKSwKKyAgICAgIHtGbHVzaGVkLCBva30gPSB0aHJpZnRfdHJhbnNwb3J0OmZsdXNoKFdyaXR0ZW4pLAorICAgICAge1N0YXRlI3RfZnJhbWVke3dyYXBwZWQgPSBGbHVzaGVkLCB3cml0ZV9idWZmZXIgPSBbXX0sIFJlc3BvbnNlfQorICBlbmQuCiAKLSAgICAgICAgeyBTdGF0ZTAjZnJhbWVkX3RyYW5zcG9ydHt3cmFwcGVkID0gV3JhcHBlZDEsIHJlYWRfYnVmZmVyPVJCdWYyfSwKLSAgICAgICAgICB7b2ssIERhdGF9IH0KLSAgICBlbmQuCisKK2Nsb3NlKFN0YXRlID0gI3RfZnJhbWVke3dyYXBwZWQgPSBXcmFwcGVkfSkgLT4KKyAge0Nsb3NlZCwgUmVzdWx0fSA9IHRocmlmdF90cmFuc3BvcnQ6Y2xvc2UoV3JhcHBlZCksCisgIHtTdGF0ZSN0X2ZyYW1lZHt3cmFwcGVkID0gQ2xvc2VkfSwgUmVzdWx0fS4KKwpkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0X2pzb25fcHJvdG9jb2wuZXJsIGIvbGliL2VybC9zcmMvdGhyaWZ0X2pzb25fcHJvdG9jb2wuZXJsCmluZGV4IDhiOWU2MTMuLmM1ZjNkYTggMTAwNjQ0Ci0tLSBhL2xpYi9lcmwvc3JjL3RocmlmdF9qc29uX3Byb3RvY29sLmVybAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfanNvbl9wcm90b2NvbC5lcmwKQEAgLTU2LDYgKzU2LDcgQEAKIHR5cGVpZF90b19qc29uKD90VHlwZV9CT09MKSAtPiAidGYiOwogdHlwZWlkX3RvX2pzb24oP3RUeXBlX0JZVEUpIC0+ICJpOCI7CiB0eXBlaWRfdG9fanNvbig/dFR5cGVfRE9VQkxFKSAtPiAiZGJsIjsKK3R5cGVpZF90b19qc29uKD90VHlwZV9JOCkgLT4gImk4IjsKIHR5cGVpZF90b19qc29uKD90VHlwZV9JMTYpIC0+ICJpMTYiOwogdHlwZWlkX3RvX2pzb24oP3RUeXBlX0kzMikgLT4gImkzMiI7CiB0eXBlaWRfdG9fanNvbig/dFR5cGVfSTY0KSAtPiAiaTY0IjsKQEAgLTY2LDggKzY3LDggQEAKIHR5cGVpZF90b19qc29uKD90VHlwZV9MSVNUKSAtPiAibHN0Ii4KIAoganNvbl90b190eXBlaWQoInRmIikgLT4gP3RUeXBlX0JPT0w7Ci1qc29uX3RvX3R5cGVpZCgiaTgiKSAtPiA/dFR5cGVfQllURTsKIGpzb25fdG9fdHlwZWlkKCJkYmwiKSAtPiA/dFR5cGVfRE9VQkxFOworanNvbl90b190eXBlaWQoImk4IikgLT4gP3RUeXBlX0k4OwoganNvbl90b190eXBlaWQoImkxNiIpIC0+ID90VHlwZV9JMTY7CiBqc29uX3RvX3R5cGVpZCgiaTMyIikgLT4gP3RUeXBlX0kzMjsKIGpzb25fdG9fdHlwZWlkKCJpNjQiKSAtPiA/dFR5cGVfSTY0OwpkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQuZXJsIGIvbGliL2VybC9zcmMvdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlOWFjYjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydC5lcmwKQEAgLTAsMCArMSw4MyBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKy1tb2R1bGUodGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQpLgorCistYmVoYXZpb3VyKHRocmlmdF90cmFuc3BvcnQpLgorCislJSBjb25zdHJ1Y3RvcnMKKy1leHBvcnQoW25ldy8wLCBuZXcvMV0pLgorJSUgcHJvdG9jb2wgY2FsbGJhY2tzCistZXhwb3J0KFtyZWFkLzIsIHJlYWRfZXhhY3QvMiwgd3JpdGUvMiwgZmx1c2gvMSwgY2xvc2UvMV0pLgorCisKKy1yZWNvcmQodF9tZW1idWZmZXIsIHsKKyAgYnVmZmVyID0gW10KK30pLgorCistdHlwZSBzdGF0ZSgpIDo6ICN0X21lbWJ1ZmZlcnt9LgorCisKKy1zcGVjIG5ldygpIC0+IHRocmlmdF90cmFuc3BvcnQ6dF90cmFuc3BvcnQoKS4KKworbmV3KCkgLT4gbmV3KFtdKS4KKworLXNwZWMgbmV3KEJ1Zjo6aW9kYXRhKCkpIC0+IHRocmlmdF90cmFuc3BvcnQ6dF90cmFuc3BvcnQoKS4KKworbmV3KEJ1Zikgd2hlbiBpc19saXN0KEJ1ZikgLT4KKyAgU3RhdGUgPSAjdF9tZW1idWZmZXJ7YnVmZmVyID0gQnVmfSwKKyAgdGhyaWZ0X3RyYW5zcG9ydDpuZXcoP01PRFVMRSwgU3RhdGUpOworbmV3KEJ1Zikgd2hlbiBpc19iaW5hcnkoQnVmKSAtPgorICBTdGF0ZSA9ICN0X21lbWJ1ZmZlcntidWZmZXIgPSBbQnVmXX0sCisgIHRocmlmdF90cmFuc3BvcnQ6bmV3KD9NT0RVTEUsIFN0YXRlKS4KKworCistaW5jbHVkZSgidGhyaWZ0X3RyYW5zcG9ydF9iZWhhdmlvdXIuaHJsIikuCisKKworcmVhZChTdGF0ZSA9ICN0X21lbWJ1ZmZlcntidWZmZXIgPSBCdWZ9LCBMZW4pCit3aGVuIGlzX2ludGVnZXIoTGVuKSwgTGVuID49IDAgLT4KKyAgQmluYXJ5ID0gaW9saXN0X3RvX2JpbmFyeShCdWYpLAorICBHaXZlID0gbWluKGlvbGlzdF9zaXplKEJpbmFyeSksIExlbiksCisgIHtSZXN1bHQsIFJlbWFpbmluZ30gPSBzcGxpdF9iaW5hcnkoQmluYXJ5LCBHaXZlKSwKKyAge1N0YXRlI3RfbWVtYnVmZmVye2J1ZmZlciA9IFJlbWFpbmluZ30sIHtvaywgUmVzdWx0fX0uCisKKworcmVhZF9leGFjdChTdGF0ZSA9ICN0X21lbWJ1ZmZlcntidWZmZXIgPSBCdWZ9LCBMZW4pCit3aGVuIGlzX2ludGVnZXIoTGVuKSwgTGVuID49IDAgLT4KKyAgQmluYXJ5ID0gaW9saXN0X3RvX2JpbmFyeShCdWYpLAorICBjYXNlIGlvbGlzdF9zaXplKEJpbmFyeSkgb2YKKyAgICBYIHdoZW4gWCA+PSBMZW4gLT4KKyAgICAgIHtSZXN1bHQsIFJlbWFpbmluZ30gPSBzcGxpdF9iaW5hcnkoQmluYXJ5LCBMZW4pLAorICAgICAge1N0YXRlI3RfbWVtYnVmZmVye2J1ZmZlciA9IFJlbWFpbmluZ30sIHtvaywgUmVzdWx0fX07CisgICAgXyAtPgorICAgICAge1N0YXRlLCB7ZXJyb3IsIGVvZn19CisgIGVuZC4KKworCit3cml0ZShTdGF0ZSA9ICN0X21lbWJ1ZmZlcntidWZmZXIgPSBCdWZ9LCBEYXRhKQord2hlbiBpc19saXN0KERhdGEpOyBpc19iaW5hcnkoRGF0YSkgLT4KKyAge1N0YXRlI3RfbWVtYnVmZmVye2J1ZmZlciA9IFtCdWYsIERhdGFdfSwgb2t9LgorCisKK2ZsdXNoKFN0YXRlKSAtPiB7U3RhdGUsIG9rfS4KKworCitjbG9zZShTdGF0ZSkgLT4ge1N0YXRlLCBva30uCisKZGlmZiAtLWdpdCBhL2xpYi9lcmwvc3JjL3RocmlmdF9tZW1vcnlfYnVmZmVyLmVybCBiL2xpYi9lcmwvc3JjL3RocmlmdF9tZW1vcnlfYnVmZmVyLmVybAppbmRleCA1M2FiYmM0Li42YTU5ZWE1IDEwMDY0NAotLS0gYS9saWIvZXJsL3NyYy90aHJpZnRfbWVtb3J5X2J1ZmZlci5lcmwKKysrIGIvbGliL2VybC9zcmMvdGhyaWZ0X21lbW9yeV9idWZmZXIuZXJsCkBAIC0yMSw0MiArMjEsMjcgQEAKIAogLWJlaGF2aW91cih0aHJpZnRfdHJhbnNwb3J0KS4KIAotJSUgQVBJCi0tZXhwb3J0KFtuZXcvMCwgbmV3LzEsIG5ld190cmFuc3BvcnRfZmFjdG9yeS8wXSkuCislJSBjb25zdHJ1Y3RvcnMKKy1leHBvcnQoW25ldy8wLCBuZXcvMV0pLgorJSUgcHJvdG9jb2wgY2FsbGJhY2tzCistZXhwb3J0KFtyZWFkLzIsIHdyaXRlLzIsIGZsdXNoLzEsIGNsb3NlLzFdKS4KKyUlIGxlZ2FjeSBhcGkKKy1leHBvcnQoW25ld190cmFuc3BvcnRfZmFjdG9yeS8wXSkuCiAKLSUlIHRocmlmdF90cmFuc3BvcnQgY2FsbGJhY2tzCi0tZXhwb3J0KFt3cml0ZS8yLCByZWFkLzIsIGZsdXNoLzEsIGNsb3NlLzFdKS4KIAotLXJlY29yZChtZW1vcnlfYnVmZmVyLCB7YnVmZmVyfSkuCi0tdHlwZSBzdGF0ZSgpIDo6ICNtZW1vcnlfYnVmZmVye30uCi0taW5jbHVkZSgidGhyaWZ0X3RyYW5zcG9ydF9iZWhhdmlvdXIuaHJsIikuCislJSB3cmFwcGVyIGFyb3VuZCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCBmb3IgbGVnYWN5IHJlYXNvbnMKIAotbmV3KCkgLT4KLSAgICBTdGF0ZSA9ICNtZW1vcnlfYnVmZmVye2J1ZmZlciA9IFtdfSwKLSAgICB0aHJpZnRfdHJhbnNwb3J0Om5ldyg/TU9EVUxFLCBTdGF0ZSkuCituZXcoKSAtPiB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydDpuZXcoKS4KIAotbmV3IChCdWYpIHdoZW4gaXNfbGlzdCAoQnVmKSAtPgotICBTdGF0ZSA9ICNtZW1vcnlfYnVmZmVye2J1ZmZlciA9IEJ1Zn0sCi0gIHRocmlmdF90cmFuc3BvcnQ6bmV3KD9NT0RVTEUsIFN0YXRlKTsKLW5ldyAoQnVmKSAtPgotICBTdGF0ZSA9ICNtZW1vcnlfYnVmZmVye2J1ZmZlciA9IFtCdWZdfSwKLSAgdGhyaWZ0X3RyYW5zcG9ydDpuZXcoP01PRFVMRSwgU3RhdGUpLgorbmV3KFN0YXRlKSAtPiB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydDpuZXcoU3RhdGUpLgogCi1uZXdfdHJhbnNwb3J0X2ZhY3RvcnkoKSAtPgotICAgIHtvaywgZnVuKCkgLT4gbmV3KCkgZW5kfS4KK25ld190cmFuc3BvcnRfZmFjdG9yeSgpIC0+IHtvaywgZnVuKCkgLT4gbmV3KCkgZW5kfS4KIAotJSUgV3JpdGVzIGRhdGEgaW50byB0aGUgYnVmZmVyCi13cml0ZShTdGF0ZSA9ICNtZW1vcnlfYnVmZmVye2J1ZmZlciA9IEJ1Zn0sIERhdGEpIC0+Ci0gICAge1N0YXRlI21lbW9yeV9idWZmZXJ7YnVmZmVyID0gW0J1ZiwgRGF0YV19LCBva30uCit3cml0ZShTdGF0ZSwgRGF0YSkgLT4gdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQ6d3JpdGUoU3RhdGUsIERhdGEpLgogCi1mbHVzaChTdGF0ZSA9ICNtZW1vcnlfYnVmZmVyIHtidWZmZXIgPSBCdWZ9KSAtPgotICAgIHtTdGF0ZSNtZW1vcnlfYnVmZmVye2J1ZmZlciA9IFtdfSwgQnVmfS4KK3JlYWQoU3RhdGUsIERhdGEpIC0+IHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0OnJlYWQoU3RhdGUsIERhdGEpLgogCi1jbG9zZShTdGF0ZSkgLT4KLSAgICB7U3RhdGUsIG9rfS4KK2ZsdXNoKFN0YXRlKSAtPiB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydDpmbHVzaChTdGF0ZSkuCiAKLXJlYWQoU3RhdGUgPSAjbWVtb3J5X2J1ZmZlcntidWZmZXIgPSBCdWZ9LCBMZW4pIHdoZW4gaXNfaW50ZWdlcihMZW4pIC0+Ci0gICAgQmluYXJ5ID0gaW9saXN0X3RvX2JpbmFyeShCdWYpLAotICAgIEdpdmUgPSBtaW4oaW9saXN0X3NpemUoQmluYXJ5KSwgTGVuKSwKLSAgICB7UmVzdWx0LCBSZW1haW5pbmd9ID0gc3BsaXRfYmluYXJ5KEJpbmFyeSwgR2l2ZSksCi0gICAge1N0YXRlI21lbW9yeV9idWZmZXJ7YnVmZmVyID0gUmVtYWluaW5nfSwge29rLCBSZXN1bHR9fS4KK2Nsb3NlKFN0YXRlKSAtPiB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydDpjbG9zZShTdGF0ZSkuCisKZGlmZiAtLWdpdCBhL2xpYi9lcmwvc3JjL3RocmlmdF9tdWx0aXBsZXhlZF9tYXBfd3JhcHBlci5lcmwgYi9saWIvZXJsL3NyYy90aHJpZnRfbXVsdGlwbGV4ZWRfbWFwX3dyYXBwZXIuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0YzVlOTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfbXVsdGlwbGV4ZWRfbWFwX3dyYXBwZXIuZXJsCkBAIC0wLDAgKzEsNTcgQEAKKyUlCislJSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCislJSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorJSUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyUlIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorJSUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorJSUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorJSUgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CislJQorJSUgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyUlCislJSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCislJSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorJSUgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCislJSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorJSUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworJSUgdW5kZXIgdGhlIExpY2Vuc2UuCislJQorCistbW9kdWxlKHRocmlmdF9tdWx0aXBsZXhlZF9tYXBfd3JhcHBlcikuCisKKy1leHBvcnQoWworICAgICAgICAgIG5ldy8wCisgICAgICAgICAsc3RvcmUvMworICAgICAgICAgLGZpbmQvMgorICAgICAgICAgLGZldGNoLzIKKyAgICAgICAgXSkuCisKKy10eXBlIHNlcnZpY2VfaGFuZGxlcigpICAgICA6OiBub25lbXB0eV9zdHJpbmcoKS4KKy10eXBlIG1vZHVsZV8oKSAgICAgICAgICAgICA6OiBhdG9tKCkuCistdHlwZSBzZXJ2aWNlX2hhbmRsZXJfbWFwKCkgOjogW3tTZXJ2aWNlSGFuZGxlcjo6c2VydmljZV9oYW5kbGVyKCksIE1vZHVsZTo6bW9kdWxlXygpfV0uCisKKy1zcGVjIG5ldygpIC0+IHNlcnZpY2VfaGFuZGxlcl9tYXAoKS4KK25ldygpIC0+CisgICAgb3JkZGljdDpuZXcoKS4KKworLXNwZWMgc3RvcmUoU2VydmljZUhhbmRsZXIsIE1vZHVsZSwgTWFwKSAtPiBOZXdNYXAgd2hlbgorICAgIFNlcnZpY2VIYW5kbGVyIDo6IHNlcnZpY2VfaGFuZGxlcigpLAorICAgIE1vZHVsZSAgICAgICAgIDo6IG1vZHVsZV8oKSwKKyAgICBNYXAgICAgICAgICAgICA6OiBzZXJ2aWNlX2hhbmRsZXJfbWFwKCksCisgICAgTmV3TWFwICAgICAgICAgOjogc2VydmljZV9oYW5kbGVyX21hcCgpLgorc3RvcmUoU2VydmljZUhhbmRsZXIsIE1vZHVsZSwgTWFwKSAtPgorICAgIG9yZGRpY3Q6c3RvcmUoU2VydmljZUhhbmRsZXIsIE1vZHVsZSwgTWFwKS4KKworLXNwZWMgZmluZChTZXJ2aWNlSGFuZGxlciwgTWFwKSAtPiB7b2ssIE1vZHVsZX0gfCBlcnJvciB3aGVuCisgICAgU2VydmljZUhhbmRsZXIgOjogc2VydmljZV9oYW5kbGVyKCksCisgICAgTW9kdWxlICAgICAgICAgOjogbW9kdWxlXygpLAorICAgIE1hcCAgICAgICAgICAgIDo6IHNlcnZpY2VfaGFuZGxlcl9tYXAoKS4KK2ZpbmQoU2VydmljZUhhbmRsZXIsIE1hcCkgLT4KKyAgICBvcmRkaWN0OmZpbmQoU2VydmljZUhhbmRsZXIsIE1hcCkuCisKKy1zcGVjIGZldGNoKFNlcnZpY2VIYW5kbGVyLCBNYXApIC0+IE1vZHVsZSB3aGVuCisgICAgU2VydmljZUhhbmRsZXIgOjogc2VydmljZV9oYW5kbGVyKCksCisgICAgTW9kdWxlICAgICAgICAgOjogbW9kdWxlXygpLAorICAgIE1hcCAgICAgICAgICAgIDo6IHNlcnZpY2VfaGFuZGxlcl9tYXAoKS4KK2ZldGNoKFNlcnZpY2VIYW5kbGVyLCBNYXApIC0+CisgICAgb3JkZGljdDpmZXRjaChTZXJ2aWNlSGFuZGxlciwgTWFwKS4KZGlmZiAtLWdpdCBhL2xpYi9lcmwvc3JjL3RocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbC5lcmwgYi9saWIvZXJsL3NyYy90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2wuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmN2I3MGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2wuZXJsCkBAIC0wLDAgKzEsODMgQEAKKyUlCislJSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCislJSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorJSUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyUlIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorJSUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorJSUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorJSUgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CislJQorJSUgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyUlCislJSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCislJSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorJSUgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCislJSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorJSUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworJSUgdW5kZXIgdGhlIExpY2Vuc2UuCislJQorCistbW9kdWxlKHRocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbCkuCisKKy1iZWhhdmlvdXIodGhyaWZ0X3Byb3RvY29sKS4KKworLWluY2x1ZGUoInRocmlmdF9jb25zdGFudHMuaHJsIikuCistaW5jbHVkZSgidGhyaWZ0X3Byb3RvY29sLmhybCIpLgorCistaW5jbHVkZSgidGhyaWZ0X3Byb3RvY29sX2JlaGF2aW91ci5ocmwiKS4KKworLWV4cG9ydChbbmV3LzIsCisgICAgICAgICByZWFkLzIsCisgICAgICAgICB3cml0ZS8yLAorICAgICAgICAgZmx1c2hfdHJhbnNwb3J0LzEsCisgICAgICAgICBjbG9zZV90cmFuc3BvcnQvMQorICAgICAgICBdKS4KKworLXJlY29yZChwcm90b2NvbCwge21vZHVsZSwgZGF0YX0pLgorLXR5cGUgcHJvdG9jb2woKSA6OiAjcHJvdG9jb2x7fS4KKworLXJlY29yZCAobXVsdGlwbGV4ZWRfcHJvdG9jb2wsIHtwcm90b2NvbF9tb2R1bGVfdG9fZGVjb3JhdGU6OmF0b20oKSwKKwkJCQkJCQkJcHJvdG9jb2xfZGF0YV90b19kZWNvcmF0ZTo6dGVybSgpLAorCQkJCQkJCQlzZXJ2aWNlX25hbWU6Om5vbmVtcHR5X3N0cmluZygpfSkuCisKKy10eXBlIHN0YXRlKCkgOjogI211bHRpcGxleGVkX3Byb3RvY29se30uCisKKy1zcGVjIG5ldyhQcm90b2NvbFRvRGVjb3JhdGU6OnByb3RvY29sKCksIFNlcnZpY2VOYW1lOjpub25lbXB0eV9zdHJpbmcoKSkgLT4ge29rLCBQcm90b2NvbDo6cHJvdG9jb2woKX0uCituZXcoUHJvdG9jb2xUb0RlY29yYXRlLCBTZXJ2aWNlTmFtZSkgd2hlbiBpc19yZWNvcmQoUHJvdG9jb2xUb0RlY29yYXRlLCBwcm90b2NvbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19saXN0KFNlcnZpY2VOYW1lKSAtPgorICAgIFN0YXRlID0gI211bHRpcGxleGVkX3Byb3RvY29se3Byb3RvY29sX21vZHVsZV90b19kZWNvcmF0ZSA9IFByb3RvY29sVG9EZWNvcmF0ZSNwcm90b2NvbC5tb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbF9kYXRhX3RvX2RlY29yYXRlID0gUHJvdG9jb2xUb0RlY29yYXRlI3Byb3RvY29sLmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lID0gU2VydmljZU5hbWV9LAorICAgIHRocmlmdF9wcm90b2NvbDpuZXcoP01PRFVMRSwgU3RhdGUpLgorCitmbHVzaF90cmFuc3BvcnQoU3RhdGUgPSAjbXVsdGlwbGV4ZWRfcHJvdG9jb2x7cHJvdG9jb2xfbW9kdWxlX3RvX2RlY29yYXRlID0gUHJvdG9jb2xNb2R1bGVUb0RlY29yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xfZGF0YV90b19kZWNvcmF0ZSA9IFN0YXRlMH0pIC0+CisgICAge1N0YXRlMSwgb2t9ID0gUHJvdG9jb2xNb2R1bGVUb0RlY29yYXRlOmZsdXNoX3RyYW5zcG9ydChTdGF0ZTApLAorICAgIHtTdGF0ZSNtdWx0aXBsZXhlZF9wcm90b2NvbHtwcm90b2NvbF9kYXRhX3RvX2RlY29yYXRlID0gU3RhdGUxfSwgb2t9LgorCitjbG9zZV90cmFuc3BvcnQoU3RhdGUgPSAjbXVsdGlwbGV4ZWRfcHJvdG9jb2x7cHJvdG9jb2xfbW9kdWxlX3RvX2RlY29yYXRlID0gUHJvdG9jb2xNb2R1bGVUb0RlY29yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xfZGF0YV90b19kZWNvcmF0ZSA9IFN0YXRlMH0pIC0+CisgICAge1N0YXRlMSwgb2t9ID0gUHJvdG9jb2xNb2R1bGVUb0RlY29yYXRlOmNsb3NlX3RyYW5zcG9ydChTdGF0ZTApLAorICAgIHtTdGF0ZSNtdWx0aXBsZXhlZF9wcm90b2NvbHtwcm90b2NvbF9kYXRhX3RvX2RlY29yYXRlID0gU3RhdGUxfSwgb2t9LgorCit3cml0ZShTdGF0ZSA9ICNtdWx0aXBsZXhlZF9wcm90b2NvbHtwcm90b2NvbF9tb2R1bGVfdG9fZGVjb3JhdGUgPSBQcm90b2NvbE1vZHVsZVRvRGVjb3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sX2RhdGFfdG9fZGVjb3JhdGUgPSBTdGF0ZTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWUgPSBTZXJ2aWNlTmFtZX0sCisgICAgICBNZXNzYWdlID0gI3Byb3RvY29sX21lc3NhZ2VfYmVnaW57bmFtZSA9IE5hbWV9KSAtPgorICAgIHtTdGF0ZTEsIG9rfSA9IFByb3RvY29sTW9kdWxlVG9EZWNvcmF0ZTp3cml0ZShTdGF0ZTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UjcHJvdG9jb2xfbWVzc2FnZV9iZWdpbntuYW1lPVNlcnZpY2VOYW1lICsrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID9NVUxUSVBMRVhFRF9TRVJWSUNFX1NFUEFSQVRPUiArKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lfSksCisgICAge1N0YXRlI211bHRpcGxleGVkX3Byb3RvY29se3Byb3RvY29sX2RhdGFfdG9fZGVjb3JhdGUgPSBTdGF0ZTF9LCBva307CisKK3dyaXRlKFN0YXRlID0gI211bHRpcGxleGVkX3Byb3RvY29se3Byb3RvY29sX21vZHVsZV90b19kZWNvcmF0ZSA9IFByb3RvY29sTW9kdWxlVG9EZWNvcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xfZGF0YV90b19kZWNvcmF0ZSA9IFN0YXRlMH0sCisgICAgICBNZXNzYWdlKSAtPgorICAgIHtTdGF0ZTEsIG9rfSA9IFByb3RvY29sTW9kdWxlVG9EZWNvcmF0ZTp3cml0ZShTdGF0ZTAsIE1lc3NhZ2UpLAorICAgIHtTdGF0ZSNtdWx0aXBsZXhlZF9wcm90b2NvbHtwcm90b2NvbF9kYXRhX3RvX2RlY29yYXRlID0gU3RhdGUxfSwgb2t9LgorCityZWFkKFN0YXRlID0gI211bHRpcGxleGVkX3Byb3RvY29se3Byb3RvY29sX21vZHVsZV90b19kZWNvcmF0ZSA9IFByb3RvY29sTW9kdWxlVG9EZWNvcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbF9kYXRhX3RvX2RlY29yYXRlID0gU3RhdGUwfSwKKyAgICAgTWVzc2FnZSkgLT4KKyAgICB7U3RhdGUxLCBSZXN1bHR9ID0gUHJvdG9jb2xNb2R1bGVUb0RlY29yYXRlOnJlYWQoU3RhdGUwLCBNZXNzYWdlKSwKKyAgICB7U3RhdGUjbXVsdGlwbGV4ZWRfcHJvdG9jb2x7cHJvdG9jb2xfZGF0YV90b19kZWNvcmF0ZSA9IFN0YXRlMX0sIFJlc3VsdH0uCmRpZmYgLS1naXQgYS9saWIvZXJsL3NyYy90aHJpZnRfcHJvY2Vzc29yLmVybCBiL2xpYi9lcmwvc3JjL3RocmlmdF9wcm9jZXNzb3IuZXJsCmluZGV4IGQ0NzQyOTQuLjVjOWYyNmYgMTAwNjQ0Ci0tLSBhL2xpYi9lcmwvc3JjL3RocmlmdF9wcm9jZXNzb3IuZXJsCisrKyBiL2xpYi9lcmwvc3JjL3RocmlmdF9wcm9jZXNzb3IuZXJsCkBAIC0zMyw0MSArMzMsNTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIgPSBIYW5kbGVyfSkuCiAKIGxvb3AoU3RhdGUwID0gI3RocmlmdF9wcm9jZXNzb3J7cHJvdG9jb2wgID0gUHJvdG8wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyID0gSGFuZGxlcn0pIC0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIgPSBIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlID0gU2VydmljZX0pIC0+CisKICAgICB7UHJvdG8xLCBNZXNzYWdlQmVnaW59ID0gdGhyaWZ0X3Byb3RvY29sOnJlYWQoUHJvdG8wLCBtZXNzYWdlX2JlZ2luKSwKICAgICBTdGF0ZTEgPSBTdGF0ZTAjdGhyaWZ0X3Byb2Nlc3Nvcntwcm90b2NvbCA9IFByb3RvMX0sCisKKyAgICBFcnJvckhhbmRsZXIgPSBmdW4KKyAgICAgICAgKEhhbmRsZXJNb2R1bGVzKSB3aGVuIGlzX2xpc3QoSGFuZGxlck1vZHVsZXMpIC0+IHRocmlmdF9tdWx0aXBsZXhlZF9tYXBfd3JhcHBlcjpmZXRjaCg/TVVMVElQTEVYRURfRVJST1JfSEFORExFUl9LRVksIEhhbmRsZXJNb2R1bGVzKTsKKyAgICAgICAgKEhhbmRsZXJNb2R1bGUpIC0+IEhhbmRsZXJNb2R1bGUKKyAgICBlbmQsCisKICAgICBjYXNlIE1lc3NhZ2VCZWdpbiBvZgorCiAgICAgICAgICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lue25hbWUgPSBGdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ID90TWVzc2FnZVR5cGVfQ0FMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxaWQgPSBTZXFpZH0gLT4KLSAgICAgICAgICAgIGNhc2UgaGFuZGxlX2Z1bmN0aW9uKFN0YXRlMSwgbGlzdF90b19hdG9tKEZ1bmN0aW9uKSwgU2VxaWQpIG9mCi0gICAgICAgICAgICAgICAge1N0YXRlMiwgb2t9IC0+IGxvb3AoU3RhdGUyKTsKLSAgICAgICAgICAgICAgICB7X1N0YXRlMiwge2Vycm9yLCBSZWFzb259fSAtPgotICAgICAgICAgICAgICAgICAgICBIYW5kbGVyOmhhbmRsZV9lcnJvcihsaXN0X3RvX2F0b20oRnVuY3Rpb24pLCBSZWFzb24pLAotICAgICAgICAgICAgICAgICAgICB0aHJpZnRfcHJvdG9jb2w6Y2xvc2VfdHJhbnNwb3J0KFByb3RvMSksCi0gICAgICAgICAgICAgICAgICAgIG9rCi0gICAgICAgICAgICBlbmQ7Ci0gICAgICAgICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lue25hbWUgPSBGdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ID90TWVzc2FnZVR5cGVfT05FV0FZLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxaWQgPSBTZXFpZH0gLT4KLSAgICAgICAgICAgIGNhc2UgaGFuZGxlX2Z1bmN0aW9uKFN0YXRlMSwgbGlzdF90b19hdG9tKEZ1bmN0aW9uKSwgU2VxaWQpIG9mCi0gICAgICAgICAgICAgICAge1N0YXRlMiwgb2t9IC0+IGxvb3AoU3RhdGUyKTsKLSAgICAgICAgICAgICAgICB7X1N0YXRlMiwge2Vycm9yLCBSZWFzb259fSAtPgotICAgICAgICAgICAgICAgICAgICBIYW5kbGVyOmhhbmRsZV9lcnJvcihsaXN0X3RvX2F0b20oRnVuY3Rpb24pLCBSZWFzb24pLAotICAgICAgICAgICAgICAgICAgICB0aHJpZnRfcHJvdG9jb2w6Y2xvc2VfdHJhbnNwb3J0KFByb3RvMSksCi0gICAgICAgICAgICAgICAgICAgIG9rCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXFpZCA9IFNlcWlkfSB3aGVuIFR5cGUgPTo9ID90TWVzc2FnZVR5cGVfQ0FMTDsgVHlwZSA9Oj0gP3RNZXNzYWdlVHlwZV9PTkVXQVkgLT4KKyAgICAgICAgICAgIGNhc2Ugc3RyaW5nOnRva2VucyhGdW5jdGlvbiwgP01VTFRJUExFWEVEX1NFUlZJQ0VfU0VQQVJBVE9SKSBvZgorICAgICAgICAgICAgICAgIFtTZXJ2aWNlTmFtZSwgRnVuY3Rpb25OYW1lXSAtPgorICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlTW9kdWxlICA9IHRocmlmdF9tdWx0aXBsZXhlZF9tYXBfd3JhcHBlcjpmZXRjaChTZXJ2aWNlTmFtZSwgU2VydmljZSksCisgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VIYW5kbGVyID0gdGhyaWZ0X211bHRpcGxleGVkX21hcF93cmFwcGVyOmZldGNoKFNlcnZpY2VOYW1lLCBIYW5kbGVyKSwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBoYW5kbGVfZnVuY3Rpb24oU3RhdGUxI3RocmlmdF9wcm9jZXNzb3J7c2VydmljZT1TZXJ2aWNlTW9kdWxlLCBoYW5kbGVyPVNlcnZpY2VIYW5kbGVyfSwgbGlzdF90b19hdG9tKEZ1bmN0aW9uTmFtZSksIFNlcWlkKSBvZgorICAgICAgICAgICAgICAgICAgICAgICAge1N0YXRlMiwgb2t9IC0+IGxvb3AoU3RhdGUyI3RocmlmdF9wcm9jZXNzb3J7c2VydmljZT1TZXJ2aWNlLCBoYW5kbGVyPUhhbmRsZXJ9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHtfU3RhdGUyLCB7ZXJyb3IsIFJlYXNvbn19IC0+CisJCQkJCQkJYXBwbHkoRXJyb3JIYW5kbGVyKEhhbmRsZXIpLCBoYW5kbGVfZXJyb3IsIFtsaXN0X3RvX2F0b20oRnVuY3Rpb24pLCBSZWFzb25dKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJpZnRfcHJvdG9jb2w6Y2xvc2VfdHJhbnNwb3J0KFByb3RvMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2sKKyAgICAgICAgICAgICAgICAgICAgZW5kOworICAgICAgICAgICAgICAgIF8gLT4KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBoYW5kbGVfZnVuY3Rpb24oU3RhdGUxLCBsaXN0X3RvX2F0b20oRnVuY3Rpb24pLCBTZXFpZCkgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgIHtTdGF0ZTIsIG9rfSAtPiBsb29wKFN0YXRlMik7CisgICAgICAgICAgICAgICAgICAgICAgICB7X1N0YXRlMiwge2Vycm9yLCBSZWFzb259fSAtPgorCQkJCQkJCWFwcGx5KEVycm9ySGFuZGxlcihIYW5kbGVyKSwgaGFuZGxlX2Vycm9yLCBbbGlzdF90b19hdG9tKEZ1bmN0aW9uKSwgUmVhc29uXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyaWZ0X3Byb3RvY29sOmNsb3NlX3RyYW5zcG9ydChQcm90bzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rCisgICAgICAgICAgICAgICAgICAgIGVuZAogICAgICAgICAgICAgZW5kOwogICAgICAgICB7ZXJyb3IsIHRpbWVvdXQgPSBSZWFzb259IC0+Ci0gICAgICAgICAgICBIYW5kbGVyOmhhbmRsZV9lcnJvcih1bmRlZmluZWQsIFJlYXNvbiksCisJCQlhcHBseShFcnJvckhhbmRsZXIoSGFuZGxlciksIGhhbmRsZV9lcnJvciwgW3VuZGVmaW5lZCwgUmVhc29uXSksCiAgICAgICAgICAgICB0aHJpZnRfcHJvdG9jb2w6Y2xvc2VfdHJhbnNwb3J0KFByb3RvMSksCiAgICAgICAgICAgICBvazsKICAgICAgICAge2Vycm9yLCBjbG9zZWQgPSBSZWFzb259IC0+CiAgICAgICAgICAgICAlJSBlcnJvcl9sb2dnZXI6aW5mb19tc2coIkNsaWVudCBkaXNjb25uZWN0ZWR+biIpLAotICAgICAgICAgICAgSGFuZGxlcjpoYW5kbGVfZXJyb3IodW5kZWZpbmVkLCBSZWFzb24pLAorCQkJYXBwbHkoRXJyb3JIYW5kbGVyKEhhbmRsZXIpLCBoYW5kbGVfZXJyb3IsIFt1bmRlZmluZWQsIFJlYXNvbl0pLAogICAgICAgICAgICAgdGhyaWZ0X3Byb3RvY29sOmNsb3NlX3RyYW5zcG9ydChQcm90bzEpLAogICAgICAgICAgICAgZXhpdChzaHV0ZG93bik7CiAgICAgICAgIHtlcnJvciwgUmVhc29ufSAtPgotICAgICAgICAgICAgSGFuZGxlcjpoYW5kbGVfZXJyb3IodW5kZWZpbmVkLCBSZWFzb24pLAorCQkJYXBwbHkoRXJyb3JIYW5kbGVyKEhhbmRsZXIpLCBoYW5kbGVfZXJyb3IsIFt1bmRlZmluZWQsIFJlYXNvbl0pLAogICAgICAgICAgICAgdGhyaWZ0X3Byb3RvY29sOmNsb3NlX3RyYW5zcG9ydChQcm90bzEpLAogICAgICAgICAgICAgZXhpdChzaHV0ZG93bikKICAgICBlbmQuCmRpZmYgLS1naXQgYS9saWIvZXJsL3NyYy90aHJpZnRfcHJvdG9jb2wuZXJsIGIvbGliL2VybC9zcmMvdGhyaWZ0X3Byb3RvY29sLmVybAppbmRleCBjNmRiNDZkLi4yZmUxMGQ2IDEwMDY0NAotLS0gYS9saWIvZXJsL3NyYy90aHJpZnRfcHJvdG9jb2wuZXJsCisrKyBiL2xpYi9lcmwvc3JjL3RocmlmdF9wcm90b2NvbC5lcmwKQEAgLTYzLDggKzYzLDggQEAKIHR5cGVpZF90b19hdG9tKD90VHlwZV9TVE9QKSAtPiBmaWVsZF9zdG9wOwogdHlwZWlkX3RvX2F0b20oP3RUeXBlX1ZPSUQpIC0+IHZvaWQ7CiB0eXBlaWRfdG9fYXRvbSg/dFR5cGVfQk9PTCkgLT4gYm9vbDsKLXR5cGVpZF90b19hdG9tKD90VHlwZV9CWVRFKSAtPiBieXRlOwogdHlwZWlkX3RvX2F0b20oP3RUeXBlX0RPVUJMRSkgLT4gZG91YmxlOwordHlwZWlkX3RvX2F0b20oP3RUeXBlX0k4KSAtPiBieXRlOwogdHlwZWlkX3RvX2F0b20oP3RUeXBlX0kxNikgLT4gaTE2OwogdHlwZWlkX3RvX2F0b20oP3RUeXBlX0kzMikgLT4gaTMyOwogdHlwZWlkX3RvX2F0b20oP3RUeXBlX0k2NCkgLT4gaTY0OwpAQCAtNzYsOCArNzYsOSBAQAogCiB0ZXJtX3RvX3R5cGVpZCh2b2lkKSAtPiA/dFR5cGVfVk9JRDsKIHRlcm1fdG9fdHlwZWlkKGJvb2wpIC0+ID90VHlwZV9CT09MOwotdGVybV90b190eXBlaWQoYnl0ZSkgLT4gP3RUeXBlX0JZVEU7Cit0ZXJtX3RvX3R5cGVpZChieXRlKSAtPiA/dFR5cGVfSTg7CiB0ZXJtX3RvX3R5cGVpZChkb3VibGUpIC0+ID90VHlwZV9ET1VCTEU7Cit0ZXJtX3RvX3R5cGVpZChpOCkgLT4gP3RUeXBlX0k4OwogdGVybV90b190eXBlaWQoaTE2KSAtPiA/dFR5cGVfSTE2OwogdGVybV90b190eXBlaWQoaTMyKSAtPiA/dFR5cGVfSTMyOwogdGVybV90b190eXBlaWQoaTY0KSAtPiA/dFR5cGVfSTY0OwpAQCAtMTQ4LDggKzE0OSwxMiBAQAogcmVhZChJUHJvdG8wLCB7bWFwLCBLZXlUeXBlLCBWYWxUeXBlfSkgLT4KICAgICB7SVByb3RvMSwgI3Byb3RvY29sX21hcF9iZWdpbntzaXplID0gU2l6ZSwga3R5cGUgPSBLVHlwZSwgdnR5cGUgPSBWVHlwZX19ID0KICAgICAgICAgcmVhZChJUHJvdG8wLCBtYXBfYmVnaW4pLAotICAgIHtLVHlwZSwgS1R5cGV9ID0ge3Rlcm1fdG9fdHlwZWlkKEtleVR5cGUpLCBLVHlwZX0sCi0gICAge1ZUeXBlLCBWVHlwZX0gPSB7dGVybV90b190eXBlaWQoVmFsVHlwZSksIFZUeXBlfSwKKyAgICBfID0gY2FzZSBTaXplIG9mCisgICAgICAwIC0+IDA7CisgICAgICBfIC0+CisgICAgICAgIHtLVHlwZSwgS1R5cGV9ID0ge3Rlcm1fdG9fdHlwZWlkKEtleVR5cGUpLCBLVHlwZX0sCisgICAgICAgIHtWVHlwZSwgVlR5cGV9ID0ge3Rlcm1fdG9fdHlwZWlkKFZhbFR5cGUpLCBWVHlwZX0KKyAgICBlbmQsCiAgICAge0xpc3QsIElQcm90bzJ9ID0gbGlzdHM6bWFwZm9sZGwoZnVuKF8sIFByb3RvUzApIC0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7UHJvdG9TMSwge29rLCBLZXl9fSA9IHJlYWQoUHJvdG9TMCwgS2V5VHlwZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7UHJvdG9TMiwge29rLCBWYWx9fSA9IHJlYWQoUHJvdG9TMSwgVmFsVHlwZSksCkBAIC0xOTEsNyArMTk2LDggQEAKICAgICAgICAgdGhyaWZ0X3Byb3RvY29sOnJlYWQoSVByb3RvMCwgZmllbGRfYmVnaW4pLAogICAgIGNhc2Uge0ZUeXBlLCBGaWR9IG9mCiAgICAgICAgIHs/dFR5cGVfU1RPUCwgX30gLT4KLSAgICAgICAgICAgIHtJUHJvdG8xLCBSVHVwbGV9OworICAgICAgICAgICAge0lQcm90bzIsIG9rfSA9IHJlYWQoSVByb3RvMSwgc3RydWN0X2VuZCksCisgICAgICAgICAgICB7SVByb3RvMiwgUlR1cGxlfTsKICAgICAgICAgX0Vsc2UgLT4KICAgICAgICAgICAgIGNhc2UgZGljdDpmaW5kKEZpZCwgU0RpY3QpIG9mCiAgICAgICAgICAgICAgICAge29rLCB7VHlwZSwgSW5kZXh9fSAtPgpAQCAtMjEzLDEyICsyMTksMTEgQEAKICAgICBlbmQuCiAKIHNraXBfZmllbGQoRlR5cGUsIElQcm90bzAsIFNEaWN0LCBSVHVwbGUpIC0+Ci0gICAgRlR5cGVBdG9tID0gdGhyaWZ0X3Byb3RvY29sOnR5cGVpZF90b19hdG9tKEZUeXBlKSwKLSAgICB7SVByb3RvMSwgb2t9ID0gdGhyaWZ0X3Byb3RvY29sOnNraXAoSVByb3RvMCwgRlR5cGVBdG9tKSwKKyAgICB7SVByb3RvMSwgb2t9ID0gc2tpcChJUHJvdG8wLCB0eXBlaWRfdG9fYXRvbShGVHlwZSkpLAogICAgIHtJUHJvdG8yLCBva30gPSByZWFkKElQcm90bzEsIGZpZWxkX2VuZCksCiAgICAgcmVhZF9zdHJ1Y3RfbG9vcChJUHJvdG8yLCBTRGljdCwgUlR1cGxlKS4KIAotLXNwZWMgc2tpcCgjcHJvdG9jb2x7fSwgYW55KCkpIC0+IHsjcHJvdG9jb2x7fSwgb2t9LgorLXNwZWMgc2tpcCgjcHJvdG9jb2x7fSwgYXRvbSgpKSAtPiB7I3Byb3RvY29se30sIG9rfS4KIAogc2tpcChQcm90bzAsIHN0cnVjdCkgLT4KICAgICB7UHJvdG8xLCBva30gPSByZWFkKFByb3RvMCwgc3RydWN0X2JlZ2luKSwKQEAgLTI1NSw3ICsyNjAsNyBAQAogICAgICAgICA/dFR5cGVfU1RPUCAtPgogICAgICAgICAgICAge1Byb3RvMSwgb2t9OwogICAgICAgICBfRWxzZSAtPgotICAgICAgICAgICAge1Byb3RvMiwgb2t9ID0gc2tpcChQcm90bzEsIFR5cGUpLAorICAgICAgICAgICAge1Byb3RvMiwgb2t9ID0gc2tpcChQcm90bzEsIHR5cGVpZF90b19hdG9tKFR5cGUpKSwKICAgICAgICAgICAgIHtQcm90bzMsIG9rfSA9IHJlYWQoUHJvdG8yLCBmaWVsZF9lbmQpLAogICAgICAgICAgICAgc2tpcF9zdHJ1Y3RfbG9vcChQcm90bzMpCiAgICAgZW5kLgpAQCAtMjY1LDggKzI3MCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gU2l6ZX0pIC0+CiAgICAgY2FzZSBTaXplIG9mCiAgICAgICAgIE4gd2hlbiBOID4gMCAtPgotICAgICAgICAgICAge1Byb3RvMSwgb2t9ID0gc2tpcChQcm90bzAsIEt0eXBlKSwKLSAgICAgICAgICAgIHtQcm90bzIsIG9rfSA9IHNraXAoUHJvdG8xLCBWdHlwZSksCisgICAgICAgICAgICB7UHJvdG8xLCBva30gPSBza2lwKFByb3RvMCwgdHlwZWlkX3RvX2F0b20oS3R5cGUpKSwKKyAgICAgICAgICAgIHtQcm90bzIsIG9rfSA9IHNraXAoUHJvdG8xLCB0eXBlaWRfdG9fYXRvbShWdHlwZSkpLAogICAgICAgICAgICAgc2tpcF9tYXBfbG9vcChQcm90bzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCNwcm90b2NvbF9tYXBfYmVnaW57c2l6ZSA9IFNpemUgLSAxfSk7CiAgICAgICAgIDAgLT4ge1Byb3RvMCwgb2t9CkBAIC0yNzYsNyArMjgxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBTaXplfSkgLT4KICAgICBjYXNlIFNpemUgb2YKICAgICAgICAgTiB3aGVuIE4gPiAwIC0+Ci0gICAgICAgICAgICB7UHJvdG8xLCBva30gPSBza2lwKFByb3RvMCwgRXR5cGUpLAorICAgICAgICAgICAge1Byb3RvMSwgb2t9ID0gc2tpcChQcm90bzAsIHR5cGVpZF90b19hdG9tKEV0eXBlKSksCiAgICAgICAgICAgICBza2lwX3NldF9sb29wKFByb3RvMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwI3Byb3RvY29sX3NldF9iZWdpbntzaXplID0gU2l6ZSAtIDF9KTsKICAgICAgICAgMCAtPiB7UHJvdG8wLCBva30KQEAgLTI4Niw3ICsyOTEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gU2l6ZX0pIC0+CiAgICAgY2FzZSBTaXplIG9mCiAgICAgICAgIE4gd2hlbiBOID4gMCAtPgotICAgICAgICAgICAge1Byb3RvMSwgb2t9ID0gc2tpcChQcm90bzAsIEV0eXBlKSwKKyAgICAgICAgICAgIHtQcm90bzEsIG9rfSA9IHNraXAoUHJvdG8wLCB0eXBlaWRfdG9fYXRvbShFdHlwZSkpLAogICAgICAgICAgICAgc2tpcF9saXN0X2xvb3AoUHJvdG8xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwI3Byb3RvY29sX2xpc3RfYmVnaW57c2l6ZSA9IFNpemUgLSAxfSk7CiAgICAgICAgIDAgLT4ge1Byb3RvMCwgb2t9CmRpZmYgLS1naXQgYS9saWIvZXJsL3NyYy90aHJpZnRfcmVjb25uZWN0aW5nX2NsaWVudC5lcmwgYi9saWIvZXJsL3NyYy90aHJpZnRfcmVjb25uZWN0aW5nX2NsaWVudC5lcmwKaW5kZXggOWRkNjI3YS4uNTM4ZmQzYSAxMDA2NDQKLS0tIGEvbGliL2VybC9zcmMvdGhyaWZ0X3JlY29ubmVjdGluZ19jbGllbnQuZXJsCisrKyBiL2xpYi9lcmwvc3JjL3RocmlmdF9yZWNvbm5lY3RpbmdfY2xpZW50LmVybApAQCAtMzYsMTQgKzM2LDE0IEBACiAgICAgICAgICAgdGVybWluYXRlLzIsCiAgICAgICAgICAgY29kZV9jaGFuZ2UvMyBdKS4KIAotLXJlY29yZCggc3RhdGUsIHsgY2xpZW50ID0gbmlsLCAKKy1yZWNvcmQoIHN0YXRlLCB7IGNsaWVudCA9IG5pbCwKICAgICAgICAgICAgICAgICAgIGhvc3QsCiAgICAgICAgICAgICAgICAgICBwb3J0LAogICAgICAgICAgICAgICAgICAgdGhyaWZ0X3N2YywKICAgICAgICAgICAgICAgICAgIHRocmlmdF9vcHRzLAogICAgICAgICAgICAgICAgICAgcmVjb25uX21pbiwKICAgICAgICAgICAgICAgICAgIHJlY29ubl9tYXgsCi0gICAgICAgICAgICAgICAgICByZWNvbm5fdGltZSwKKyAgICAgICAgICAgICAgICAgIHJlY29ubl90aW1lID0gMCwKICAgICAgICAgICAgICAgICAgIG9wX2NudF9kaWN0LAogICAgICAgICAgICAgICAgICAgb3BfdGltZV9kaWN0IH0gKS4KIApAQCAtMTE1LDkgKzExNSw5IEBACiAgICAgICAgICAgICAgX0Zyb20sCiAgICAgICAgICAgICAgU3RhdGU9I3N0YXRleyBjbGllbnQgPSBDbGllbnQgfSApIC0+CiAKLSAgU3RhcnQgPSBub3coKSwKKyAgVGltZXIgPSB0aW1lcl9mdW4oKSwKICAgUmVzdWx0ID0gKCBjYXRjaCB0aHJpZnRfY2xpZW50OmNhbGwoIENsaWVudCwgT3AsIEFyZ3MpICksCi0gIFRpbWUgPSB0aW1lcjpub3dfZGlmZiggbm93KCksIFN0YXJ0ICksCisgIFRpbWUgPSBUaW1lcigpLAogCiAgIGNhc2UgUmVzdWx0IG9mCiAgICAgeyBDLCB7IG9rLCBSZXBseSB9IH0gLT4KQEAgLTIxNyw2ICsyMTcsMjEgQEAKICAgICBmYWxzZSAtPiBCYWNrb2ZmCiAgIGVuZC4KIAorLWlmZGVmKHRpbWVfY29ycmVjdGlvbikuCit0aW1lcl9mdW4oKSAtPgorICBUMSA9IGVybGFuZzptb25vdG9uaWNfdGltZSgpLAorICBmdW4oKSAtPgorICAgIFQyID0gZXJsYW5nOm1vbm90b25pY190aW1lKCksCisgICAgZXJsYW5nOmNvbnZlcnRfdGltZV91bml0KFQyIC0gVDEsIG5hdGl2ZSwgbWljcm9fc2Vjb25kcykKKyAgZW5kLgorLWVsc2UuCit0aW1lcl9mdW4oKSAtPgorICBUMSA9IGVybGFuZzp0aW1lc3RhbXAoKSwKKyAgZnVuKCkgLT4KKyAgICBUMiA9IGVybGFuZzp0aW1lc3RhbXAoKSwKKyAgICB0aW1lcjpub3dfZGlmZihUMiwgVDEpCisgIGVuZC4KKy1lbmRpZi4KIAogaW5jcl9zdGF0cyggT3AsIFJlc3VsdCwgVGltZSwKICAgICAgICAgICAgIFN0YXRlID0gI3N0YXRleyBvcF9jbnRfZGljdCAgPSBPcENudERpY3QsCmRpZmYgLS1naXQgYS9saWIvZXJsL3NyYy90aHJpZnRfc29ja2V0X3NlcnZlci5lcmwgYi9saWIvZXJsL3NyYy90aHJpZnRfc29ja2V0X3NlcnZlci5lcmwKaW5kZXggZjdjN2EwMi4uNGUzYzA1MiAxMDA2NDQKLS0tIGEvbGliL2VybC9zcmMvdGhyaWZ0X3NvY2tldF9zZXJ2ZXIuZXJsCisrKyBiL2xpYi9lcmwvc3JjL3RocmlmdF9zb2NrZXRfc2VydmVyLmVybApAQCAtMjEsMTIgKzIxLDE5IEBACiAKIC1iZWhhdmlvdXIoZ2VuX3NlcnZlcikuCiAKLS1leHBvcnQoW3N0YXJ0LzEsIHN0b3AvMV0pLgorLWluY2x1ZGUgKCJ0aHJpZnRfY29uc3RhbnRzLmhybCIpLgogCi0tZXhwb3J0KFtpbml0LzEsIGhhbmRsZV9jYWxsLzMsIGhhbmRsZV9jYXN0LzIsIHRlcm1pbmF0ZS8yLCBjb2RlX2NoYW5nZS8zLAotICAgICAgICAgaGFuZGxlX2luZm8vMl0pLgorLWlmZGVmKFRFU1QpLgorICAgIC1jb21waWxlKGV4cG9ydF9hbGwpLgorICAgIC1leHBvcnRfcmVjb3JkcyhbdGhyaWZ0X3NvY2tldF9zZXJ2ZXJdKS4KKy1lbHNlLgorICAgIC1leHBvcnQoW3N0YXJ0LzEsIHN0b3AvMV0pLgogCi0tZXhwb3J0KFthY2NlcHRvcl9sb29wLzFdKS4KKyAgICAtZXhwb3J0KFtpbml0LzEsIGhhbmRsZV9jYWxsLzMsIGhhbmRsZV9jYXN0LzIsIHRlcm1pbmF0ZS8yLCBjb2RlX2NoYW5nZS8zLAorICAgICAgICAgICAgIGhhbmRsZV9pbmZvLzJdKS4KKworICAgIC1leHBvcnQoW2FjY2VwdG9yX2xvb3AvMV0pLgorLWVuZGlmLgogCiAtcmVjb3JkKHRocmlmdF9zb2NrZXRfc2VydmVyLAogICAgICAgICB7cG9ydCwKQEAgLTM4LDcgKzQ1LDEwIEBACiAgICAgICAgICBsaXN0ZW49bnVsbCwKICAgICAgICAgIGFjY2VwdG9yPW51bGwsCiAgICAgICAgICBzb2NrZXRfb3B0cz1be3JlY3ZfdGltZW91dCwgNTAwfV0sCi0gICAgICAgICBmcmFtZWQ9ZmFsc2UKKyAgICAgICAgIHByb3RvY29sPWJpbmFyeSwKKyAgICAgICAgIGZyYW1lZD1mYWxzZSwKKyAgICAgICAgIHNzbHRyYW5zcG9ydD1mYWxzZSwKKyAgICAgICAgIHNzbG9wdGlvbnM9W10KICAgICAgICAgfSkuCiAKIHN0YXJ0KFN0YXRlPSN0aHJpZnRfc29ja2V0X3NlcnZlcnt9KSAtPgpAQCAtOTEsMTAgKzEwMSw0NiBAQAogICAgIHBhcnNlX29wdGlvbnMoUmVzdCwgU3RhdGUjdGhyaWZ0X3NvY2tldF9zZXJ2ZXJ7aXA9UGFyc2VkSXB9KTsKIHBhcnNlX29wdGlvbnMoW3tzb2NrZXRfb3B0cywgTH0gfCBSZXN0XSwgU3RhdGUpIHdoZW4gaXNfbGlzdChMKSwgbGVuZ3RoKEwpID4gMCAtPgogICAgIHBhcnNlX29wdGlvbnMoUmVzdCwgU3RhdGUjdGhyaWZ0X3NvY2tldF9zZXJ2ZXJ7c29ja2V0X29wdHM9TH0pOwotcGFyc2Vfb3B0aW9ucyhbe2hhbmRsZXIsIEhhbmRsZXJ9IHwgUmVzdF0sIFN0YXRlKSAtPgorCitwYXJzZV9vcHRpb25zKFt7aGFuZGxlciwgW119IHwgX1Jlc3RdLCBfU3RhdGUpIC0+CisgICAgdGhyb3coIkF0IGxlYXN0IGFuIGVycm9yIGhhbmRsZXIgbXVzdCBiZSBkZWZpbmVkLiIpOworcGFyc2Vfb3B0aW9ucyhbe2hhbmRsZXIsIFNlcnZpY2VIYW5kbGVyUHJvcGVydHlMaXN0fSB8IFJlc3RdLCBTdGF0ZSkgd2hlbiBpc19saXN0KFNlcnZpY2VIYW5kbGVyUHJvcGVydHlMaXN0KSAtPgorICAgIFNlcnZpY2VIYW5kbGVyTWFwID0KKyAgICBjYXNlIFN0YXRlI3RocmlmdF9zb2NrZXRfc2VydmVyLmhhbmRsZXIgb2YKKyAgICAgICAgdW5kZWZpbmVkIC0+CisgICAgICAgICAgICBsaXN0czpmb2xkbCgKKyAgICAgICAgICAgICAgICBmdW4gKHtTZXJ2aWNlTmFtZSwgU2VydmljZUhhbmRsZXJ9LCBBY2MpIHdoZW4gaXNfbGlzdChTZXJ2aWNlTmFtZSksIGlzX2F0b20oU2VydmljZUhhbmRsZXIpIC0+CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJpZnRfbXVsdGlwbGV4ZWRfbWFwX3dyYXBwZXI6c3RvcmUoU2VydmljZU5hbWUsIFNlcnZpY2VIYW5kbGVyLCBBY2MpOworICAgICAgICAgICAgICAgICAgICAoXywgX0FjYykgLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93KCJUaGUgaGFuZGxlciBvcHRpb24gaXMgbm90IHByb3Blcmx5IGNvbmZpZ3VyZWQgZm9yIG11bHRpcGxleGVkIHNlcnZpY2VzLiBJdCBzaG91bGQgYmUgYSBraW5kIG9mIFt7XCJlcnJvcl9oYW5kbGVyXCIsIE1vZHVsZTo6YXRvbSgpfSwge1NlcmljZU5hbWU6Omxpc3QoKSwgTW9kdWxlOjphdG9tKCl9LCAuLi5dIikKKyAgICAgICAgICAgICAgICBlbmQsIHRocmlmdF9tdWx0aXBsZXhlZF9tYXBfd3JhcHBlcjpuZXcoKSwgU2VydmljZUhhbmRsZXJQcm9wZXJ0eUxpc3QpOworICAgICAgICBfIC0+IHRocm93KCJFcnJvciB3aGlsZSBwYXJzaW5nIHRoZSBoYW5kbGVyIG9wdGlvbi4iKQorICAgIGVuZCwKKyAgICBjYXNlIHRocmlmdF9tdWx0aXBsZXhlZF9tYXBfd3JhcHBlcjpmaW5kKD9NVUxUSVBMRVhFRF9FUlJPUl9IQU5ETEVSX0tFWSwgU2VydmljZUhhbmRsZXJNYXApIG9mCisgICAgICAgIHtvaywgX0Vycm9ySGFuZGxlcn0gLT4gcGFyc2Vfb3B0aW9ucyhSZXN0LCBTdGF0ZSN0aHJpZnRfc29ja2V0X3NlcnZlcntoYW5kbGVyPVNlcnZpY2VIYW5kbGVyTWFwfSk7CisgICAgICAgIGVycm9yIC0+IHRocm93KCJUaGUgaGFuZGxlciBvcHRpb24gaXMgbm90IHByb3Blcmx5IGNvbmZpZ3VyZWQgZm9yIG11bHRpcGxleGVkIHNlcnZpY2VzLiBJdCBzaG91bGQgYmUgYSBraW5kIG9mIFt7XCJlcnJvcl9oYW5kbGVyXCIsIE1vZHVsZTo6YXRvbSgpfSwge1NlcmljZU5hbWU6Omxpc3QoKSwgTW9kdWxlOjphdG9tKCl9LCAuLi5dIikKKyAgICBlbmQ7CitwYXJzZV9vcHRpb25zKFt7aGFuZGxlciwgSGFuZGxlcn0gfCBSZXN0XSwgU3RhdGUpIHdoZW4gU3RhdGUjdGhyaWZ0X3NvY2tldF9zZXJ2ZXIuaGFuZGxlciA9PSB1bmRlZmluZWQsIGlzX2F0b20oSGFuZGxlcikgLT4KICAgICBwYXJzZV9vcHRpb25zKFJlc3QsIFN0YXRlI3RocmlmdF9zb2NrZXRfc2VydmVye2hhbmRsZXI9SGFuZGxlcn0pOwotcGFyc2Vfb3B0aW9ucyhbe3NlcnZpY2UsIFNlcnZpY2V9IHwgUmVzdF0sIFN0YXRlKSAtPgorCitwYXJzZV9vcHRpb25zKFt7c2VydmljZSwgW119IHwgX1Jlc3RdLCBfU3RhdGUpIC0+CisgICAgdGhyb3coIkF0IGxlYXN0IG9uZSBzZXJ2aWNlIG1vZHVsZSBtdXN0IGJlIGRlZmluZWQuIik7CitwYXJzZV9vcHRpb25zKFt7c2VydmljZSwgU2VydmljZU1vZHVsZVByb3BlcnR5TGlzdH0gfCBSZXN0XSwgU3RhdGUpIHdoZW4gaXNfbGlzdChTZXJ2aWNlTW9kdWxlUHJvcGVydHlMaXN0KSAtPgorICAgIFNlcnZpY2VNb2R1bGVNYXAgPQorICAgIGNhc2UgU3RhdGUjdGhyaWZ0X3NvY2tldF9zZXJ2ZXIuc2VydmljZSBvZgorICAgICAgICB1bmRlZmluZWQgLT4KKyAgICAgICAgICAgIGxpc3RzOmZvbGRsKAorICAgICAgICAgICAgICAgIGZ1biAoe1NlcnZpY2VOYW1lLCBTZXJ2aWNlTW9kdWxlfSwgQWNjKSB3aGVuIGlzX2xpc3QoU2VydmljZU5hbWUpLCBpc19hdG9tKFNlcnZpY2VNb2R1bGUpIC0+CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJpZnRfbXVsdGlwbGV4ZWRfbWFwX3dyYXBwZXI6c3RvcmUoU2VydmljZU5hbWUsIFNlcnZpY2VNb2R1bGUsIEFjYyk7CisgICAgICAgICAgICAgICAgICAgIChfLCBfQWNjKSAtPgorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3coIlRoZSBzZXJ2aWNlIG9wdGlvbiBpcyBub3QgcHJvcGVybHkgY29uZmlndXJlZCBmb3IgbXVsdGlwbGV4ZWQgc2VydmljZXMuIEl0IHNob3VsZCBiZSBhIGtpbmQgb2YgW3tTZXJpY2VOYW1lOjpsaXN0KCksIFNlcnZpY2VNb2R1bGU6OmF0b20oKX0sIC4uLl0iKQorICAgICAgICAgICAgICAgIGVuZCwgdGhyaWZ0X211bHRpcGxleGVkX21hcF93cmFwcGVyOm5ldygpLCBTZXJ2aWNlTW9kdWxlUHJvcGVydHlMaXN0KTsKKyAgICAgICAgXyAtPiB0aHJvdygiRXJyb3Igd2hpbGUgcGFyc2luZyB0aGUgc2VydmljZSBvcHRpb24uIikKKyAgICBlbmQsCisgICAgcGFyc2Vfb3B0aW9ucyhSZXN0LCBTdGF0ZSN0aHJpZnRfc29ja2V0X3NlcnZlcntzZXJ2aWNlPVNlcnZpY2VNb2R1bGVNYXB9KTsKK3BhcnNlX29wdGlvbnMoW3tzZXJ2aWNlLCBTZXJ2aWNlfSB8IFJlc3RdLCBTdGF0ZSkgd2hlbiBTdGF0ZSN0aHJpZnRfc29ja2V0X3NlcnZlci5zZXJ2aWNlID09IHVuZGVmaW5lZCwgaXNfYXRvbShTZXJ2aWNlKSAtPgogICAgIHBhcnNlX29wdGlvbnMoUmVzdCwgU3RhdGUjdGhyaWZ0X3NvY2tldF9zZXJ2ZXJ7c2VydmljZT1TZXJ2aWNlfSk7CisKIHBhcnNlX29wdGlvbnMoW3ttYXgsIE1heH0gfCBSZXN0XSwgU3RhdGUpIC0+CiAgICAgTWF4SW50ID0gY2FzZSBNYXggb2YKICAgICAgICAgICAgICAgICAgTWF4IHdoZW4gaXNfbGlzdChNYXgpIC0+CkBAIC0xMDMsOCArMTQ5LDE3IEBACiAgICAgICAgICAgICAgICAgICAgICBNYXgKICAgICAgICAgICAgICBlbmQsCiAgICAgcGFyc2Vfb3B0aW9ucyhSZXN0LCBTdGF0ZSN0aHJpZnRfc29ja2V0X3NlcnZlcnttYXg9TWF4SW50fSk7CisKK3BhcnNlX29wdGlvbnMoW3twcm90b2NvbCwgUHJvdG99IHwgUmVzdF0sIFN0YXRlKSB3aGVuIGlzX2F0b20oUHJvdG8pIC0+CisgICAgcGFyc2Vfb3B0aW9ucyhSZXN0LCBTdGF0ZSN0aHJpZnRfc29ja2V0X3NlcnZlcntwcm90b2NvbD1Qcm90b30pOworCiBwYXJzZV9vcHRpb25zKFt7ZnJhbWVkLCBGcmFtZWR9IHwgUmVzdF0sIFN0YXRlKSB3aGVuIGlzX2Jvb2xlYW4oRnJhbWVkKSAtPgotICAgIHBhcnNlX29wdGlvbnMoUmVzdCwgU3RhdGUjdGhyaWZ0X3NvY2tldF9zZXJ2ZXJ7ZnJhbWVkPUZyYW1lZH0pLgorICAgIHBhcnNlX29wdGlvbnMoUmVzdCwgU3RhdGUjdGhyaWZ0X3NvY2tldF9zZXJ2ZXJ7ZnJhbWVkPUZyYW1lZH0pOworCitwYXJzZV9vcHRpb25zKFt7c3NsdHJhbnNwb3J0LCBTU0xUcmFuc3BvcnR9IHwgUmVzdF0sIFN0YXRlKSB3aGVuIGlzX2Jvb2xlYW4oU1NMVHJhbnNwb3J0KSAtPgorICAgIHBhcnNlX29wdGlvbnMoUmVzdCwgU3RhdGUjdGhyaWZ0X3NvY2tldF9zZXJ2ZXJ7c3NsdHJhbnNwb3J0PVNTTFRyYW5zcG9ydH0pOworcGFyc2Vfb3B0aW9ucyhbe3NzbG9wdGlvbnMsIFNTTE9wdGlvbnN9IHwgUmVzdF0sIFN0YXRlKSB3aGVuIGlzX2xpc3QoU1NMT3B0aW9ucykgLT4KKyAgICBwYXJzZV9vcHRpb25zKFJlc3QsIFN0YXRlI3RocmlmdF9zb2NrZXRfc2VydmVye3NzbG9wdGlvbnM9U1NMT3B0aW9uc30pLgogCiBzdGFydF9zZXJ2ZXIoU3RhdGU9I3RocmlmdF9zb2NrZXRfc2VydmVye25hbWU9TmFtZX0pIC0+CiAgICAgY2FzZSBOYW1lIG9mCkBAIC0xNjgsMjUgKzIyMywzMiBAQAogICAgIFN0YXRlI3RocmlmdF9zb2NrZXRfc2VydmVye2FjY2VwdG9yPW51bGx9OwogbmV3X2FjY2VwdG9yKFN0YXRlPSN0aHJpZnRfc29ja2V0X3NlcnZlcntsaXN0ZW49TGlzdGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlPVNlcnZpY2UsIGhhbmRsZXI9SGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0X29wdHM9T3B0cywgZnJhbWVkPUZyYW1lZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXRfb3B0cz1PcHRzLCBmcmFtZWQ9RnJhbWVkLCBwcm90b2NvbD1Qcm90bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NsdHJhbnNwb3J0PVNzbFRyYW5zcG9ydCwgc3Nsb3B0aW9ucz1Tc2xPcHRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgLT4KICAgICBQaWQgPSBwcm9jX2xpYjpzcGF3bl9saW5rKD9NT0RVTEUsIGFjY2VwdG9yX2xvb3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbe3NlbGYoKSwgTGlzdGVuLCBTZXJ2aWNlLCBIYW5kbGVyLCBPcHRzLCBGcmFtZWR9XSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbe3NlbGYoKSwgTGlzdGVuLCBTZXJ2aWNlLCBIYW5kbGVyLCBPcHRzLCBGcmFtZWQsIFNzbFRyYW5zcG9ydCwgU3NsT3B0aW9ucywgUHJvdG99XSksCiAgICAgU3RhdGUjdGhyaWZ0X3NvY2tldF9zZXJ2ZXJ7YWNjZXB0b3I9UGlkfS4KIAotYWNjZXB0b3JfbG9vcCh7U2VydmVyLCBMaXN0ZW4sIFNlcnZpY2UsIEhhbmRsZXIsIFNvY2tldE9wdHMsIEZyYW1lZH0pCithY2NlcHRvcl9sb29wKHtTZXJ2ZXIsIExpc3RlbiwgU2VydmljZSwgSGFuZGxlciwgU29ja2V0T3B0cywgRnJhbWVkLCBTc2xUcmFuc3BvcnQsIFNzbE9wdGlvbnMsIFByb3RvfSkKICAgd2hlbiBpc19waWQoU2VydmVyKSwgaXNfbGlzdChTb2NrZXRPcHRzKSAtPgogICAgIGNhc2UgY2F0Y2ggZ2VuX3RjcDphY2NlcHQoTGlzdGVuKSBvZiAlIGluZmluaXRlIHRpbWVvdXQKICAgICAgICAge29rLCBTb2NrZXR9IC0+CiAgICAgICAgICAgICBnZW5fc2VydmVyOmNhc3QoU2VydmVyLCB7YWNjZXB0ZWQsIHNlbGYoKX0pLAogICAgICAgICAgICAgUHJvdG9HZW4gPSBmdW4oKSAtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtvaywgU29ja2V0VHJhbnNwb3J0fSAgID0gdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQ6bmV3KFNvY2tldCwgU29ja2V0T3B0cyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge29rLCBUcmFuc3BvcnR9ICAgICAgICAgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZyYW1lZCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAgLT4gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQ6bmV3KFNvY2tldFRyYW5zcG9ydCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAtPiB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0Om5ldyhTb2NrZXRUcmFuc3BvcnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7b2ssIFByb3RvY29sfSAgICAgICAgICA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2w6bmV3KFRyYW5zcG9ydCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge29rLCBTb2NrZXRUcmFuc3BvcnR9ID0gY2FzZSBTc2xUcmFuc3BvcnQgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAgLT4gdGhyaWZ0X3NzbHNvY2tldF90cmFuc3BvcnQ6bmV3KFNvY2tldCwgU29ja2V0T3B0cywgU3NsT3B0aW9ucyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC0+IHRocmlmdF9zb2NrZXRfdHJhbnNwb3J0Om5ldyhTb2NrZXQsIFNvY2tldE9wdHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtvaywgVHJhbnNwb3J0fSAgICAgICA9IGNhc2UgRnJhbWVkIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgIC0+IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0Om5ldyhTb2NrZXRUcmFuc3BvcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAtPiB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0Om5ldyhTb2NrZXRUcmFuc3BvcnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtvaywgUHJvdG9jb2x9ICAgICAgICA9IGNhc2UgUHJvdG8gb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhY3QgLT4gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2w6bmV3KFRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc29uIC0+IHRocmlmdF9qc29uX3Byb3RvY29sOm5ldyhUcmFuc3BvcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXyAtPiB0aHJpZnRfYmluYXJ5X3Byb3RvY29sOm5ldyhUcmFuc3BvcnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtvaywgUHJvdG9jb2x9CiAgICAgICAgICAgICAgICAgICAgICAgIGVuZCwKICAgICAgICAgICAgIHRocmlmdF9wcm9jZXNzb3I6aW5pdCh7U2VydmVyLCBQcm90b0dlbiwgU2VydmljZSwgSGFuZGxlcn0pOwpAQCAtMjE0LDggKzI3NiwxMSBAQAogaGFuZGxlX2Nhc3Qoc3RvcCwgU3RhdGUpIC0+CiAgICAge3N0b3AsIG5vcm1hbCwgU3RhdGV9LgogCi10ZXJtaW5hdGUoX1JlYXNvbiwgI3RocmlmdF9zb2NrZXRfc2VydmVye2xpc3Rlbj1MaXN0ZW4sIHBvcnQ9UG9ydH0pIC0+Cit0ZXJtaW5hdGUoUmVhc29uLCAjdGhyaWZ0X3NvY2tldF9zZXJ2ZXJ7bGlzdGVuPUxpc3RlbiwgcG9ydD1Qb3J0fSkgLT4KICAgICBnZW5fdGNwOmNsb3NlKExpc3RlbiksCisgICAge2JhY2t0cmFjZSwgQnR9ID0gZXJsYW5nOnByb2Nlc3NfaW5mbyhzZWxmKCksIGJhY2t0cmFjZSksCisgICAgZXJyb3JfbG9nZ2VyOmVycm9yX3JlcG9ydCh7P01PRFVMRSwgP0xJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2NoaWxkX2Vycm9yLCBSZWFzb24sIEJ0fX0pLAogICAgIGNhc2UgUG9ydCA8IDEwMjQgb2YKICAgICAgICAgdHJ1ZSAtPgogICAgICAgICAgICAgY2F0Y2ggZmRzcnY6c3RvcCgpLApkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQuZXJsIGIvbGliL2VybC9zcmMvdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQuZXJsCmluZGV4IGZlYzAyNDEuLmZhMTBlZDAgMTAwNjQ0Ci0tLSBhL2xpYi9lcmwvc3JjL3RocmlmdF9zb2NrZXRfdHJhbnNwb3J0LmVybAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfc29ja2V0X3RyYW5zcG9ydC5lcmwKQEAgLTIxLDEwNCArMjEsMTU2IEBACiAKIC1iZWhhdmlvdXIodGhyaWZ0X3RyYW5zcG9ydCkuCiAKLS1leHBvcnQoW25ldy8xLAotICAgICAgICAgbmV3LzIsCi0gICAgICAgICB3cml0ZS8yLCByZWFkLzIsIGZsdXNoLzEsIGNsb3NlLzEsCislJSBjb25zdHJ1Y3RvcnMKKy1leHBvcnQoW25ldy8xLCBuZXcvMl0pLgorJSUgdHJhbnNwb3J0IGNhbGxiYWNrcworLWV4cG9ydChbcmVhZC8yLCByZWFkX2V4YWN0LzIsIHdyaXRlLzIsIGZsdXNoLzEsIGNsb3NlLzFdKS4KKyUlIGxlZ2FjeSBhcGkKKy1leHBvcnQoW25ld190cmFuc3BvcnRfZmFjdG9yeS8zXSkuCiAKLSAgICAgICAgIG5ld190cmFuc3BvcnRfZmFjdG9yeS8zXSkuCiAKLS1yZWNvcmQoZGF0YSwge3NvY2tldCwKLSAgICAgICAgICAgICAgIHJlY3ZfdGltZW91dD1pbmZpbml0eX0pLgotLXR5cGUgc3RhdGUoKSA6OiAjZGF0YXt9LgotLWluY2x1ZGUoInRocmlmdF90cmFuc3BvcnRfYmVoYXZpb3VyLmhybCIpLgorLXJlY29yZCh0X3NvY2tldCwgeworICBzb2NrZXQsCisgIHJlY3ZfdGltZW91dD02MDAwMCwKKyAgYnVmZmVyID0gW10KK30pLgogCi1uZXcoU29ja2V0KSAtPgotICAgIG5ldyhTb2NrZXQsIFtdKS4KKy10eXBlIHN0YXRlKCkgOjogI3Rfc29ja2V0e30uCisKKworLXNwZWMgbmV3KFNvY2tldDo6YW55KCkpIC0+CisgIHRocmlmdF90cmFuc3BvcnQ6dF90cmFuc3BvcnQoKS4KKworbmV3KFNvY2tldCkgLT4gbmV3KFNvY2tldCwgW10pLgorCistc3BlYyBuZXcoU29ja2V0OjphbnkoKSwgT3B0czo6bGlzdCgpKSAtPgorICB0aHJpZnRfdHJhbnNwb3J0OnRfdHJhbnNwb3J0KCkuCiAKIG5ldyhTb2NrZXQsIE9wdHMpIHdoZW4gaXNfbGlzdChPcHRzKSAtPgotICAgIFN0YXRlID0KLSAgICAgICAgY2FzZSBsaXN0czprZXlzZWFyY2gocmVjdl90aW1lb3V0LCAxLCBPcHRzKSBvZgotICAgICAgICAgICAge3ZhbHVlLCB7cmVjdl90aW1lb3V0LCBUaW1lb3V0fX0KLSAgICAgICAgICAgIHdoZW4gaXNfaW50ZWdlcihUaW1lb3V0KSwgVGltZW91dCA+IDAgLT4KLSAgICAgICAgICAgICAgICAjZGF0YXtzb2NrZXQ9U29ja2V0LCByZWN2X3RpbWVvdXQ9VGltZW91dH07Ci0gICAgICAgICAgICBfIC0+Ci0gICAgICAgICAgICAgICAgI2RhdGF7c29ja2V0PVNvY2tldH0KLSAgICAgICAgZW5kLAotICAgIHRocmlmdF90cmFuc3BvcnQ6bmV3KD9NT0RVTEUsIFN0YXRlKS4KLQotJSUgRGF0YSA6OiBpb2xpc3QoKQotd3JpdGUoVGhpcyA9ICNkYXRhe3NvY2tldCA9IFNvY2tldH0sIERhdGEpIC0+Ci0gICAge1RoaXMsIGdlbl90Y3A6c2VuZChTb2NrZXQsIERhdGEpfS4KLQotcmVhZChUaGlzID0gI2RhdGF7c29ja2V0PVNvY2tldCwgcmVjdl90aW1lb3V0PVRpbWVvdXR9LCBMZW4pCi0gIHdoZW4gaXNfaW50ZWdlcihMZW4pLCBMZW4gPj0gMCAtPgotICAgIGNhc2UgZ2VuX3RjcDpyZWN2KFNvY2tldCwgTGVuLCBUaW1lb3V0KSBvZgotICAgICAgICBFcnIgPSB7ZXJyb3IsIHRpbWVvdXR9IC0+Ci0gICAgICAgICAgICBnZW5fdGNwOmNsb3NlKFNvY2tldCksCi0gICAgICAgICAgICB7VGhpcywgRXJyfTsKLSAgICAgICAgRGF0YSAtPgotICAgICAgICAgICAge1RoaXMsIERhdGF9Ci0gICAgZW5kLgotCi0lJSBXZSBjYW4ndCByZWFsbHkgZmx1c2ggLSBldmVyeXRoaW5nIGlzIGZsdXNoZWQgd2hlbiB3ZSB3cml0ZQotZmx1c2goVGhpcykgLT4KLSAgICB7VGhpcywgb2t9LgotCi1jbG9zZShUaGlzID0gI2RhdGF7c29ja2V0ID0gU29ja2V0fSkgLT4KLSAgICB7VGhpcywgZ2VuX3RjcDpjbG9zZShTb2NrZXQpfS4KKyAgU3RhdGUgPSBwYXJzZV9vcHRzKE9wdHMsICN0X3NvY2tldHtzb2NrZXQgPSBTb2NrZXR9KSwKKyAgdGhyaWZ0X3RyYW5zcG9ydDpuZXcoP01PRFVMRSwgU3RhdGUpLgogCiAKLSUlJSUgRkFDVE9SWSBHRU5FUkFUSU9OICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKK3BhcnNlX29wdHMoW3tyZWN2X3RpbWVvdXQsIFRpbWVvdXR9fFJlc3RdLCBTdGF0ZSkKK3doZW4gaXNfaW50ZWdlcihUaW1lb3V0KSwgVGltZW91dCA+IDAgLT4KKyAgcGFyc2Vfb3B0cyhSZXN0LCBTdGF0ZSN0X3NvY2tldHtyZWN2X3RpbWVvdXQgPSBUaW1lb3V0fSk7CitwYXJzZV9vcHRzKFt7cmVjdl90aW1lb3V0LCBpbmZpbml0eX18UmVzdF0sIFN0YXRlKSAtPgorICBwYXJzZV9vcHRzKFJlc3QsIFN0YXRlI3Rfc29ja2V0e3JlY3ZfdGltZW91dCA9IGluZmluaXR5fSk7CitwYXJzZV9vcHRzKFtdLCBTdGF0ZSkgLT4KKyAgU3RhdGUuCiAKIAorLWluY2x1ZGUoInRocmlmdF90cmFuc3BvcnRfYmVoYXZpb3VyLmhybCIpLgorCisKK3JlYWQoU3RhdGUgPSAjdF9zb2NrZXR7YnVmZmVyID0gQnVmfSwgTGVuKQord2hlbiBpc19pbnRlZ2VyKExlbiksIExlbiA+PSAwIC0+CisgIEJpbmFyeSA9IGlvbGlzdF90b19iaW5hcnkoQnVmKSwKKyAgY2FzZSBpb2xpc3Rfc2l6ZShCaW5hcnkpIG9mCisgICAgWCB3aGVuIFggPj0gTGVuIC0+CisgICAgICB7UmVzdWx0LCBSZW1haW5pbmd9ID0gc3BsaXRfYmluYXJ5KEJpbmFyeSwgTGVuKSwKKyAgICAgIHtTdGF0ZSN0X3NvY2tldHtidWZmZXIgPSBSZW1haW5pbmd9LCB7b2ssIFJlc3VsdH19OworICAgIF8gLT4gcmVjdihTdGF0ZSwgTGVuKQorICBlbmQuCisKK3JlY3YoU3RhdGUgPSAjdF9zb2NrZXR7c29ja2V0ID0gU29ja2V0LCBidWZmZXIgPSBCdWZ9LCBMZW4pIC0+CisgIGNhc2UgZ2VuX3RjcDpyZWN2KFNvY2tldCwgMCwgU3RhdGUjdF9zb2NrZXQucmVjdl90aW1lb3V0KSBvZgorICAgIHtlcnJvciwgRXJyb3J9IC0+CisgICAgICBnZW5fdGNwOmNsb3NlKFNvY2tldCksCisgICAgICB7U3RhdGUsIHtlcnJvciwgRXJyb3J9fTsKKyAgICB7b2ssIERhdGF9IC0+CisgICAgICBCaW5hcnkgPSBpb2xpc3RfdG9fYmluYXJ5KFtCdWYsIERhdGFdKSwKKyAgICAgIEdpdmUgPSBtaW4oaW9saXN0X3NpemUoQmluYXJ5KSwgTGVuKSwKKyAgICAgIHtSZXN1bHQsIFJlbWFpbmluZ30gPSBzcGxpdF9iaW5hcnkoQmluYXJ5LCBHaXZlKSwKKyAgICAgIHtTdGF0ZSN0X3NvY2tldHtidWZmZXIgPSBSZW1haW5pbmd9LCB7b2ssIFJlc3VsdH19CisgIGVuZC4KKworCityZWFkX2V4YWN0KFN0YXRlID0gI3Rfc29ja2V0e2J1ZmZlciA9IEJ1Zn0sIExlbikKK3doZW4gaXNfaW50ZWdlcihMZW4pLCBMZW4gPj0gMCAtPgorICBCaW5hcnkgPSBpb2xpc3RfdG9fYmluYXJ5KEJ1ZiksCisgIGNhc2UgaW9saXN0X3NpemUoQmluYXJ5KSBvZgorICAgIFggd2hlbiBYID49IExlbiAtPiByZWFkKFN0YXRlLCBMZW4pOworICAgIFggLT4KKyAgICAgIGNhc2UgZ2VuX3RjcDpyZWN2KFN0YXRlI3Rfc29ja2V0LnNvY2tldCwgTGVuIC0gWCwgU3RhdGUjdF9zb2NrZXQucmVjdl90aW1lb3V0KSBvZgorICAgICAgICB7ZXJyb3IsIEVycm9yfSAtPgorICAgICAgICAgIGdlbl90Y3A6Y2xvc2UoU3RhdGUjdF9zb2NrZXQuc29ja2V0KSwKKyAgICAgICAgICB7U3RhdGUsIHtlcnJvciwgRXJyb3J9fTsKKyAgICAgICAge29rLCBEYXRhfSAtPgorICAgICAgICAgIHtTdGF0ZSN0X3NvY2tldHtidWZmZXIgPSBbXX0sIHtvaywgPDxCaW5hcnkvYmluYXJ5LCBEYXRhL2JpbmFyeT4+fX0KKyAgICAgIGVuZAorICBlbmQuCisKKword3JpdGUoU3RhdGUgPSAjdF9zb2NrZXR7c29ja2V0ID0gU29ja2V0fSwgRGF0YSkgLT4KKyAgY2FzZSBnZW5fdGNwOnNlbmQoU29ja2V0LCBEYXRhKSBvZgorICAgIHtlcnJvciwgRXJyb3J9IC0+CisgICAgICBnZW5fdGNwOmNsb3NlKFNvY2tldCksCisgICAgICB7U3RhdGUsIHtlcnJvciwgRXJyb3J9fTsKKyAgICBvayAtPiB7U3RhdGUsIG9rfQorICBlbmQuCisKKworZmx1c2goU3RhdGUpIC0+CisgIHtTdGF0ZSN0X3NvY2tldHtidWZmZXIgPSBbXX0sIG9rfS4KKworCitjbG9zZShTdGF0ZSA9ICN0X3NvY2tldHtzb2NrZXQgPSBTb2NrZXR9KSAtPgorICB7U3RhdGUsIGdlbl90Y3A6Y2xvc2UoU29ja2V0KX0uCisKKworJSUgbGVnYWN5IGFwaS4gbGVmdCBmb3IgY29tcGF0aWJpbGl0eQorCiAlJSBUaGUgZm9sbG93aW5nICJsb2NhbCIgcmVjb3JkIGlzIGZpbGxlZCBpbiBieSBwYXJzZV9mYWN0b3J5X29wdGlvbnMvMgogJSUgYmVsb3cuIFRoZXNlIG9wdGlvbnMgY2FuIGJlIHBhc3NlZCB0byBuZXdfcHJvdG9jb2xfZmFjdG9yeS8zIGluIGEKICUlIHByb3BsaXN0cy1zdHlsZSBvcHRpb24gbGlzdC4gVGhleSdyZSBwYXJzZWQgbGlrZSB0aGlzIHNvIGl0IGlzIGFuIE8obikKICUlIG9wZXJhdGlvbiBpbnN0ZWFkIG9mIE8obl4yKQotLXJlY29yZChmYWN0b3J5X29wdHMsIHtjb25uZWN0X3RpbWVvdXQgPSBpbmZpbml0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgc29ja29wdHMgPSBbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVkID0gZmFsc2V9KS4KKy1yZWNvcmQoZmFjdG9yeV9vcHRzLCB7CisgIGNvbm5lY3RfdGltZW91dCA9IGluZmluaXR5LAorICBzb2Nrb3B0cyA9IFtdLAorICBmcmFtZWQgPSBmYWxzZQorfSkuCiAKLXBhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhbXSwgT3B0cykgLT4KLSAgICBPcHRzOwotcGFyc2VfZmFjdG9yeV9vcHRpb25zKFt7ZnJhbWVkLCBCb29sfSB8IFJlc3RdLCBPcHRzKSB3aGVuIGlzX2Jvb2xlYW4oQm9vbCkgLT4KLSAgICBwYXJzZV9mYWN0b3J5X29wdGlvbnMoUmVzdCwgT3B0cyNmYWN0b3J5X29wdHN7ZnJhbWVkPUJvb2x9KTsKLXBhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhbe3NvY2tvcHRzLCBPcHRMaXN0fSB8IFJlc3RdLCBPcHRzKSB3aGVuIGlzX2xpc3QoT3B0TGlzdCkgLT4KLSAgICBwYXJzZV9mYWN0b3J5X29wdGlvbnMoUmVzdCwgT3B0cyNmYWN0b3J5X29wdHN7c29ja29wdHM9T3B0TGlzdH0pOwotcGFyc2VfZmFjdG9yeV9vcHRpb25zKFt7Y29ubmVjdF90aW1lb3V0LCBUT30gfCBSZXN0XSwgT3B0cykgd2hlbiBUTyA9Oj0gaW5maW5pdHk7IGlzX2ludGVnZXIoVE8pIC0+Ci0gICAgcGFyc2VfZmFjdG9yeV9vcHRpb25zKFJlc3QsIE9wdHMjZmFjdG9yeV9vcHRze2Nvbm5lY3RfdGltZW91dD1UT30pOwotcGFyc2VfZmFjdG9yeV9vcHRpb25zKFt7cmVjdl90aW1lb3V0LCBUT30gfCBSZXN0XSwgT3B0cykgd2hlbiBUTyA9Oj0gaW5maW5pdHk7IGlzX2ludGVnZXIoVE8pIC0+Ci0gICAgcGFyc2VfZmFjdG9yeV9vcHRpb25zKFJlc3QsIE9wdHMpLgorcGFyc2VfZmFjdG9yeV9vcHRpb25zKFtdLCBGYWN0b3J5T3B0cywgVHJhbnNPcHRzKSAtPiB7RmFjdG9yeU9wdHMsIFRyYW5zT3B0c307CitwYXJzZV9mYWN0b3J5X29wdGlvbnMoW3tmcmFtZWQsIEJvb2x9fFJlc3RdLCBGYWN0b3J5T3B0cywgVHJhbnNPcHRzKQord2hlbiBpc19ib29sZWFuKEJvb2wpIC0+CisgIHBhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhSZXN0LCBGYWN0b3J5T3B0cyNmYWN0b3J5X29wdHN7ZnJhbWVkID0gQm9vbH0sIFRyYW5zT3B0cyk7CitwYXJzZV9mYWN0b3J5X29wdGlvbnMoW3tzb2Nrb3B0cywgT3B0TGlzdH18UmVzdF0sIEZhY3RvcnlPcHRzLCBUcmFuc09wdHMpCit3aGVuIGlzX2xpc3QoT3B0TGlzdCkgLT4KKyAgcGFyc2VfZmFjdG9yeV9vcHRpb25zKFJlc3QsIEZhY3RvcnlPcHRzI2ZhY3Rvcnlfb3B0c3tzb2Nrb3B0cyA9IE9wdExpc3R9LCBUcmFuc09wdHMpOworcGFyc2VfZmFjdG9yeV9vcHRpb25zKFt7Y29ubmVjdF90aW1lb3V0LCBUT318UmVzdF0sIEZhY3RvcnlPcHRzLCBUcmFuc09wdHMpCit3aGVuIFRPID06PSBpbmZpbml0eTsgaXNfaW50ZWdlcihUTykgLT4KKyAgcGFyc2VfZmFjdG9yeV9vcHRpb25zKFJlc3QsIEZhY3RvcnlPcHRzI2ZhY3Rvcnlfb3B0c3tjb25uZWN0X3RpbWVvdXQgPSBUT30sIFRyYW5zT3B0cyk7CitwYXJzZV9mYWN0b3J5X29wdGlvbnMoW3tyZWN2X3RpbWVvdXQsIFRPfXxSZXN0XSwgRmFjdG9yeU9wdHMsIFRyYW5zT3B0cykKK3doZW4gVE8gPTo9IGluZmluaXR5OyBpc19pbnRlZ2VyKFRPKSAtPgorICBwYXJzZV9mYWN0b3J5X29wdGlvbnMoUmVzdCwgRmFjdG9yeU9wdHMsIFt7cmVjdl90aW1lb3V0LCBUT31dICsrIFRyYW5zT3B0cykuCiAKIAotJSUKICUlIEdlbmVyYXRlcyBhICJ0cmFuc3BvcnQgZmFjdG9yeSIgZnVuY3Rpb24gLSBhIGZ1biB3aGljaCByZXR1cm5zIGEgdGhyaWZ0X3RyYW5zcG9ydCgpCiAlJSBpbnN0YW5jZS4KLSUlIFRoaXMgY2FuIGJlIHBhc3NlZCBpbnRvIGEgcHJvdG9jb2wgZmFjdG9yeSB0byBnZW5lcmF0ZSBhIGNvbm5lY3Rpb24gdG8gYQorJSUgU3RhdGUgY2FuIGJlIHBhc3NlZCBpbnRvIGEgcHJvdG9jb2wgZmFjdG9yeSB0byBnZW5lcmF0ZSBhIGNvbm5lY3Rpb24gdG8gYQogJSUgdGhyaWZ0IHNlcnZlciBvdmVyIGEgc29ja2V0LgotJSUKIG5ld190cmFuc3BvcnRfZmFjdG9yeShIb3N0LCBQb3J0LCBPcHRpb25zKSAtPgotICAgIFBhcnNlZE9wdHMgPSBwYXJzZV9mYWN0b3J5X29wdGlvbnMoT3B0aW9ucywgI2ZhY3Rvcnlfb3B0c3t9KSwKLQotICAgIEYgPSBmdW4oKSAtPgotICAgICAgICAgICAgICAgIFNvY2tPcHRzID0gW2JpbmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cGFja2V0LCAwfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7YWN0aXZlLCBmYWxzZX0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAge25vZGVsYXksIHRydWV9IHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZWRPcHRzI2ZhY3Rvcnlfb3B0cy5zb2Nrb3B0c10sCi0gICAgICAgICAgICAgICAgY2FzZSBjYXRjaCBnZW5fdGNwOmNvbm5lY3QoSG9zdCwgUG9ydCwgU29ja09wdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VkT3B0cyNmYWN0b3J5X29wdHMuY29ubmVjdF90aW1lb3V0KSBvZgotICAgICAgICAgICAgICAgICAgICB7b2ssIFNvY2t9IC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICB7b2ssIFRyYW5zcG9ydH0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJpZnRfc29ja2V0X3RyYW5zcG9ydDpuZXcoU29jaywgT3B0aW9ucyksCi0gICAgICAgICAgICAgICAgICAgICAgICB7b2ssIEJ1ZlRyYW5zcG9ydH0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUGFyc2VkT3B0cyNmYWN0b3J5X29wdHMuZnJhbWVkIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgIC0+IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0Om5ldyhUcmFuc3BvcnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAtPiB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0Om5ldyhUcmFuc3BvcnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAge29rLCBCdWZUcmFuc3BvcnR9OwotICAgICAgICAgICAgICAgICAgICBFcnJvciAgLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yCi0gICAgICAgICAgICAgICAgZW5kCisgIHtGYWN0b3J5T3B0cywgVHJhbnNPcHRzfSA9IHBhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhPcHRpb25zLCAjZmFjdG9yeV9vcHRze30sIFtdKSwKKyAge29rLCBmdW4oKSAtPiBTb2NrT3B0cyA9IFtiaW5hcnksCisgICAgICB7cGFja2V0LCAwfSwKKyAgICAgIHthY3RpdmUsIGZhbHNlfSwKKyAgICAgIHtub2RlbGF5LCB0cnVlfXxGYWN0b3J5T3B0cyNmYWN0b3J5X29wdHMuc29ja29wdHMKKyAgICBdLAorICAgIGNhc2UgY2F0Y2ggZ2VuX3RjcDpjb25uZWN0KAorICAgICAgSG9zdCwKKyAgICAgIFBvcnQsCisgICAgICBTb2NrT3B0cywKKyAgICAgIEZhY3RvcnlPcHRzI2ZhY3Rvcnlfb3B0cy5jb25uZWN0X3RpbWVvdXQKKyAgICApIG9mCisgICAgICB7b2ssIFNvY2t9IC0+CisgICAgICAgIHtvaywgVHJhbnNwb3J0fSA9IHRocmlmdF9zb2NrZXRfdHJhbnNwb3J0Om5ldyhTb2NrLCBUcmFuc09wdHMpLAorICAgICAgICB7b2ssIEJ1ZlRyYW5zcG9ydH0gPSBjYXNlIEZhY3RvcnlPcHRzI2ZhY3Rvcnlfb3B0cy5mcmFtZWQgb2YKKyAgICAgICAgICB0cnVlICAtPiB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydDpuZXcoVHJhbnNwb3J0KTsKKyAgICAgICAgICBmYWxzZSAtPiB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0Om5ldyhUcmFuc3BvcnQpCiAgICAgICAgIGVuZCwKLSAgICB7b2ssIEZ9LgorICAgICAgICB7b2ssIEJ1ZlRyYW5zcG9ydH07CisgICAgICBFcnJvciAgLT4gRXJyb3IKKyAgICBlbmQKKyAgZW5kfS4KKwpkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0X3NzbHNvY2tldF90cmFuc3BvcnQuZXJsIGIvbGliL2VybC9zcmMvdGhyaWZ0X3NzbHNvY2tldF90cmFuc3BvcnQuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMTE1M2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfc3Nsc29ja2V0X3RyYW5zcG9ydC5lcmwKQEAgLTAsMCArMSwxNDcgQEAKKyUlCislJSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCislJSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorJSUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyUlIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorJSUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorJSUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorJSUgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CislJQorJSUgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyUlCislJSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCislJSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorJSUgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCislJSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorJSUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworJSUgdW5kZXIgdGhlIExpY2Vuc2UuCislJQorLW1vZHVsZSh0aHJpZnRfc3Nsc29ja2V0X3RyYW5zcG9ydCkuCisKKy1pbmNsdWRlKCJ0aHJpZnRfdHJhbnNwb3J0X2JlaGF2aW91ci5ocmwiKS4KKworLWJlaGF2aW91cih0aHJpZnRfdHJhbnNwb3J0KS4KKworLWV4cG9ydChbbmV3LzMsCisgICAgICAgICB3cml0ZS8yLCByZWFkLzIsIGZsdXNoLzEsIGNsb3NlLzEsCisKKyAgICAgICAgIG5ld190cmFuc3BvcnRfZmFjdG9yeS8zXSkuCisKKyUlIEV4cG9ydCBvbmx5IGZvciB0aGUgdHJhbnNwb3J0IGZhY3RvcnkKKy1leHBvcnQoW25ldy8yXSkuCisKKy1yZWNvcmQoZGF0YSwge3NvY2tldCwKKyAgICAgICAgICAgICAgIHJlY3ZfdGltZW91dD1pbmZpbml0eX0pLgorLXR5cGUgc3RhdGUoKSA6OiAjZGF0YXt9LgorCislJSBUaGUgZm9sbG93aW5nICJsb2NhbCIgcmVjb3JkIGlzIGZpbGxlZCBpbiBieSBwYXJzZV9mYWN0b3J5X29wdGlvbnMvMgorJSUgYmVsb3cuIFRoZXNlIG9wdGlvbnMgY2FuIGJlIHBhc3NlZCB0byBuZXdfcHJvdG9jb2xfZmFjdG9yeS8zIGluIGEKKyUlIHByb3BsaXN0cy1zdHlsZSBvcHRpb24gbGlzdC4gVGhleSdyZSBwYXJzZWQgbGlrZSB0aGlzIHNvIGl0IGlzIGFuIE8obikKKyUlIG9wZXJhdGlvbiBpbnN0ZWFkIG9mIE8obl4yKQorLXJlY29yZChmYWN0b3J5X29wdHMsIHtjb25uZWN0X3RpbWVvdXQgPSBpbmZpbml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgc29ja29wdHMgPSBbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVkID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgIHNzbG9wdGlvbnMgPSBbXX0pLgorCitwYXJzZV9mYWN0b3J5X29wdGlvbnMoW10sIE9wdHMpIC0+CisgICAgT3B0czsKK3BhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhbe2ZyYW1lZCwgQm9vbH0gfCBSZXN0XSwgT3B0cykgd2hlbiBpc19ib29sZWFuKEJvb2wpIC0+CisgICAgcGFyc2VfZmFjdG9yeV9vcHRpb25zKFJlc3QsIE9wdHMjZmFjdG9yeV9vcHRze2ZyYW1lZD1Cb29sfSk7CitwYXJzZV9mYWN0b3J5X29wdGlvbnMoW3tzb2Nrb3B0cywgT3B0TGlzdH0gfCBSZXN0XSwgT3B0cykgd2hlbiBpc19saXN0KE9wdExpc3QpIC0+CisgICAgcGFyc2VfZmFjdG9yeV9vcHRpb25zKFJlc3QsIE9wdHMjZmFjdG9yeV9vcHRze3NvY2tvcHRzPU9wdExpc3R9KTsKK3BhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhbe2Nvbm5lY3RfdGltZW91dCwgVE99IHwgUmVzdF0sIE9wdHMpIHdoZW4gVE8gPTo9IGluZmluaXR5OyBpc19pbnRlZ2VyKFRPKSAtPgorICAgIHBhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhSZXN0LCBPcHRzI2ZhY3Rvcnlfb3B0c3tjb25uZWN0X3RpbWVvdXQ9VE99KTsKK3BhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhbe3NzbG9wdGlvbnMsIFNzbE9wdGlvbnN9IHwgUmVzdF0sIE9wdHMpIHdoZW4gaXNfbGlzdChTc2xPcHRpb25zKSAtPgorICAgIHBhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhSZXN0LCBPcHRzI2ZhY3Rvcnlfb3B0c3tzc2xvcHRpb25zPVNzbE9wdGlvbnN9KS4KKworbmV3KFNvY2tldCwgU29ja09wdHMsIFNzbE9wdGlvbnMpIHdoZW4gaXNfbGlzdChTb2NrT3B0cyksIGlzX2xpc3QoU3NsT3B0aW9ucykgLT4KKyAgICBpbmV0OnNldG9wdHMoU29ja2V0LCBbe2FjdGl2ZSwgZmFsc2V9XSksICUlID0+IHByZXZlbnQgdGhlIHNzbCBoYW5kc2hha2UgbWVzc2FnZXMgZ2V0IGxvc3QKKworICAgICUlIHVwZ3JhZGUgdG8gYW4gc3NsIHNvY2tldAorICAgIGNhc2UgY2F0Y2ggc3NsOnNzbF9hY2NlcHQoU29ja2V0LCBTc2xPcHRpb25zKSBvZiAlIGluZmluaXRlIHRpbWVvdXQKKyAgICAgICAge29rLCBTc2xTb2NrZXR9IC0+CisgICAgICAgICAgICBuZXcoU3NsU29ja2V0LCBTb2NrT3B0cyk7CisgICAgICAgIHtlcnJvciwgUmVhc29ufSAtPgorICAgICAgICAgICAgZXhpdCh7ZXJyb3IsIFJlYXNvbn0pOworICAgICAgICBPdGhlciAtPgorICAgICAgICAgICAgZXJyb3JfbG9nZ2VyOmVycm9yX3JlcG9ydCgKKyAgICAgICAgICAgICAgW3thcHBsaWNhdGlvbiwgdGhyaWZ0fSwKKyAgICAgICAgICAgICAgICJTU0wgYWNjZXB0IGZhaWxlZCBlcnJvciIsCisgICAgICAgICAgICAgICBsaXN0czpmbGF0dGVuKGlvX2xpYjpmb3JtYXQoIn5wIiwgW090aGVyXSkpXSksCisgICAgICAgICAgICBleGl0KHtlcnJvciwgc3NsX2FjY2VwdF9mYWlsZWR9KQorICAgIGVuZC4KKworbmV3KFNzbFNvY2tldCwgU29ja09wdHMpIC0+CisgICAgU3RhdGUgPQorICAgICAgICBjYXNlIGxpc3RzOmtleXNlYXJjaChyZWN2X3RpbWVvdXQsIDEsIFNvY2tPcHRzKSBvZgorICAgICAgICAgICAge3ZhbHVlLCB7cmVjdl90aW1lb3V0LCBUaW1lb3V0fX0KKyAgICAgICAgICAgICAgd2hlbiBpc19pbnRlZ2VyKFRpbWVvdXQpLCBUaW1lb3V0ID4gMCAtPgorICAgICAgICAgICAgICAgICNkYXRhe3NvY2tldD1Tc2xTb2NrZXQsIHJlY3ZfdGltZW91dD1UaW1lb3V0fTsKKyAgICAgICAgICAgIF8gLT4KKyAgICAgICAgICAgICAgICAjZGF0YXtzb2NrZXQ9U3NsU29ja2V0fQorICAgICAgICBlbmQsCisgICAgdGhyaWZ0X3RyYW5zcG9ydDpuZXcoP01PRFVMRSwgU3RhdGUpLgorCislJSBEYXRhIDo6IGlvbGlzdCgpCit3cml0ZShUaGlzID0gI2RhdGF7c29ja2V0ID0gU29ja2V0fSwgRGF0YSkgLT4KKyAgICB7VGhpcywgc3NsOnNlbmQoU29ja2V0LCBEYXRhKX0uCisKK3JlYWQoVGhpcyA9ICNkYXRhe3NvY2tldD1Tb2NrZXQsIHJlY3ZfdGltZW91dD1UaW1lb3V0fSwgTGVuKQorICB3aGVuIGlzX2ludGVnZXIoTGVuKSwgTGVuID49IDAgLT4KKyAgICBjYXNlIHNzbDpyZWN2KFNvY2tldCwgTGVuLCBUaW1lb3V0KSBvZgorICAgICAgICBFcnIgPSB7ZXJyb3IsIHRpbWVvdXR9IC0+CisgICAgICAgICAgICBlcnJvcl9sb2dnZXI6aW5mb19tc2coInJlYWQgdGltZW91dDogcGVlciBjb25uIH5wIiwgW2luZXQ6cGVlcm5hbWUoU29ja2V0KV0pLAorICAgICAgICAgICAgc3NsOmNsb3NlKFNvY2tldCksCisgICAgICAgICAgICB7VGhpcywgRXJyfTsKKyAgICAgICAgRGF0YSAtPgorICAgICAgICAgICAge1RoaXMsIERhdGF9CisgICAgZW5kLgorCislJSBXZSBjYW4ndCByZWFsbHkgZmx1c2ggLSBldmVyeXRoaW5nIGlzIGZsdXNoZWQgd2hlbiB3ZSB3cml0ZQorZmx1c2goVGhpcykgLT4KKyAgICB7VGhpcywgb2t9LgorCitjbG9zZShUaGlzID0gI2RhdGF7c29ja2V0ID0gU29ja2V0fSkgLT4KKyAgICB7VGhpcywgc3NsOmNsb3NlKFNvY2tldCl9LgorCislJSUlIEZBQ1RPUlkgR0VORVJBVElPTiAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCisKKyUlCislJSBHZW5lcmF0ZXMgYSAidHJhbnNwb3J0IGZhY3RvcnkiIGZ1bmN0aW9uIC0gYSBmdW4gd2hpY2ggcmV0dXJucyBhIHRocmlmdF90cmFuc3BvcnQoKQorJSUgaW5zdGFuY2UuCislJSBUaGlzIGNhbiBiZSBwYXNzZWQgaW50byBhIHByb3RvY29sIGZhY3RvcnkgdG8gZ2VuZXJhdGUgYSBjb25uZWN0aW9uIHRvIGEKKyUlIHRocmlmdCBzZXJ2ZXIgb3ZlciBhIHNvY2tldC4KKyUlCituZXdfdHJhbnNwb3J0X2ZhY3RvcnkoSG9zdCwgUG9ydCwgT3B0aW9ucykgLT4KKyAgICBQYXJzZWRPcHRzID0gcGFyc2VfZmFjdG9yeV9vcHRpb25zKE9wdGlvbnMsICNmYWN0b3J5X29wdHN7fSksCisKKyAgICBGID0gZnVuKCkgLT4KKyAgICAgICAgICAgICAgICBTb2NrT3B0cyA9IFtiaW5hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAge3BhY2tldCwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAge2FjdGl2ZSwgZmFsc2V9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtub2RlbGF5LCB0cnVlfSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VkT3B0cyNmYWN0b3J5X29wdHMuc29ja29wdHNdLAorICAgICAgICAgICAgICAgIGNhc2UgY2F0Y2ggZ2VuX3RjcDpjb25uZWN0KEhvc3QsIFBvcnQsIFNvY2tPcHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlZE9wdHMjZmFjdG9yeV9vcHRzLmNvbm5lY3RfdGltZW91dCkgb2YKKyAgICAgICAgICAgICAgICAgICAge29rLCBTb2NrfSAtPgorICAgICAgICAgICAgICAgICAgICAgICAgU3NsU29jayA9IGNhc2UgY2F0Y2ggc3NsOmNvbm5lY3QoU29jaywgUGFyc2VkT3B0cyNmYWN0b3J5X29wdHMuc3Nsb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlZE9wdHMjZmFjdG9yeV9vcHRzLmNvbm5lY3RfdGltZW91dCkgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge29rLCBTc2xTb2NrZXR9IC0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTc2xTb2NrZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE90aGVyIC0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9sb2dnZXI6aW5mb19tc2coImVycm9yIHdoaWxlIGNvbm5lY3Rpbmcgb3ZlciBzc2wgLSByZWFzb246IH5wfm4iLCBbT3RoZXJdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIGdlbl90Y3A6Y2xvc2UoU29jayksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGl0KGVycm9yKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHtvaywgVHJhbnNwb3J0fSA9IHRocmlmdF9zc2xzb2NrZXRfdHJhbnNwb3J0Om5ldyhTc2xTb2NrLCBTb2NrT3B0cyksCisgICAgICAgICAgICAgICAgICAgICAgICB7b2ssIEJ1ZlRyYW5zcG9ydH0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUGFyc2VkT3B0cyNmYWN0b3J5X29wdHMuZnJhbWVkIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgIC0+IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0Om5ldyhUcmFuc3BvcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAtPiB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0Om5ldyhUcmFuc3BvcnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAge29rLCBCdWZUcmFuc3BvcnR9OworICAgICAgICAgICAgICAgICAgICBFcnJvciAgLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yCisgICAgICAgICAgICAgICAgZW5kCisgICAgICAgIGVuZCwKKyAgICB7b2ssIEZ9LgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9lcmwvc3JjL3RocmlmdF90cmFuc3BvcnQuZXJsIGIvbGliL2VybC9zcmMvdGhyaWZ0X3RyYW5zcG9ydC5lcmwKaW5kZXggMzlmOGMwNS4uMjQxNGJkZSAxMDA2NDQKLS0tIGEvbGliL2VybC9zcmMvdGhyaWZ0X3RyYW5zcG9ydC5lcmwKKysrIGIvbGliL2VybC9zcmMvdGhyaWZ0X3RyYW5zcG9ydC5lcmwKQEAgLTIwLDU5ICsyMCwxMDcgQEAKIC1tb2R1bGUodGhyaWZ0X3RyYW5zcG9ydCkuCiAKIC1leHBvcnQoW2JlaGF2aW91cl9pbmZvLzFdKS4KKyUlIGNvbnN0cnVjdG9ycworLWV4cG9ydChbbmV3LzEsIG5ldy8yXSkuCislJSB0cmFuc3BvcnQgY2FsbGJhY2tzCistZXhwb3J0KFtyZWFkLzIsIHJlYWRfZXhhY3QvMiwgd3JpdGUvMiwgZmx1c2gvMSwgY2xvc2UvMV0pLgogCi0tZXhwb3J0KFtuZXcvMiwKLSAgICAgICAgIHdyaXRlLzIsCi0gICAgICAgICByZWFkLzIsCi0gICAgICAgICBmbHVzaC8xLAotICAgICAgICAgY2xvc2UvMQotICAgICAgICBdKS4KKy1leHBvcnRfdHlwZShbdF90cmFuc3BvcnQvMF0pLgorCiAKIGJlaGF2aW91cl9pbmZvKGNhbGxiYWNrcykgLT4KLSAgICBbe3JlYWQsIDJ9LAotICAgICB7d3JpdGUsIDJ9LAotICAgICB7Zmx1c2gsIDF9LAotICAgICB7Y2xvc2UsIDF9Ci0gICAgXS4KKyAgW3tyZWFkLCAyfSwge3dyaXRlLCAyfSwge2ZsdXNoLCAxfSwge2Nsb3NlLCAxfV0uCiAKLS1yZWNvcmQodHJhbnNwb3J0LCB7bW9kdWxlLCBkYXRhfSkuCisKKy1yZWNvcmQodF90cmFuc3BvcnQsIHsKKyAgbW9kdWxlLAorICBzdGF0ZQorfSkuCisKKy10eXBlIHN0YXRlKCkgOjogI3RfdHJhbnNwb3J0e30uCistdHlwZSB0X3RyYW5zcG9ydCgpIDo6ICN0X3RyYW5zcG9ydHt9LgorCiAKIC1pZmRlZih0cmFuc3BvcnRfd3JhcHBlcl9tb2R1bGUpLgogLWRlZmluZShkZWJ1Z193cmFwKFRyYW5zcG9ydCksCi0gICAgICAgIGNhc2UgVHJhbnNwb3J0I3RyYW5zcG9ydC5tb2R1bGUgb2YKLSAgICAgICAgICAgID90cmFuc3BvcnRfd3JhcHBlcl9tb2R1bGUgLT4KLSAgICAgICAgICAgICAgICBUcmFuc3BvcnQ7Ci0gICAgICAgICAgICBfRWxzZSAtPgotICAgICAgICAgICAgICAgIHtvaywgUmVzdWx0fSA9ID90cmFuc3BvcnRfd3JhcHBlcl9tb2R1bGU6bmV3KFRyYW5zcG9ydCksCi0gICAgICAgICAgICAgICAgUmVzdWx0Ci0gICAgICAgIGVuZCkuCisgIGNhc2UgVHJhbnNwb3J0I3RfdHJhbnNwb3J0Lm1vZHVsZSBvZgorICAgID90cmFuc3BvcnRfd3JhcHBlcl9tb2R1bGUgLT4gVHJhbnNwb3J0OworICAgIF9FbHNlIC0+CisgICAgICB7b2ssIFJlc3VsdH0gPSA/dHJhbnNwb3J0X3dyYXBwZXJfbW9kdWxlOm5ldyhUcmFuc3BvcnQpLAorICAgICAgUmVzdWx0CisgIGVuZAorKS4KIC1lbHNlLgogLWRlZmluZShkZWJ1Z193cmFwKFRyYW5zcG9ydCksIFRyYW5zcG9ydCkuCiAtZW5kaWYuCiAKLW5ldyhNb2R1bGUsIERhdGEpIHdoZW4gaXNfYXRvbShNb2R1bGUpIC0+Ci0gICAgVHJhbnNwb3J0MCA9ICN0cmFuc3BvcnR7bW9kdWxlID0gTW9kdWxlLCBkYXRhID0gRGF0YX0sCi0gICAgVHJhbnNwb3J0MSA9ID9kZWJ1Z193cmFwKFRyYW5zcG9ydDApLAotICAgIHtvaywgVHJhbnNwb3J0MX0uCiAKLS1zcGVjIHdyaXRlKCN0cmFuc3BvcnR7fSwgaW9saXN0KCkgfCBiaW5hcnkoKSkgLT4geyN0cmFuc3BvcnR7fSwgb2sgfCB7ZXJyb3IsIF9SZWFzb259fS4KLXdyaXRlKFRyYW5zcG9ydCwgRGF0YSkgLT4KLSAgICBNb2R1bGUgPSBUcmFuc3BvcnQjdHJhbnNwb3J0Lm1vZHVsZSwKLSAgICB7TmV3VHJhbnNEYXRhLCBSZXN1bHR9ID0gTW9kdWxlOndyaXRlKFRyYW5zcG9ydCN0cmFuc3BvcnQuZGF0YSwgRGF0YSksCi0gICAge1RyYW5zcG9ydCN0cmFuc3BvcnR7ZGF0YSA9IE5ld1RyYW5zRGF0YX0sIFJlc3VsdH0uCistdHlwZSB3cmFwcGFibGUoKSA6OgorICBiaW5hcnkoKSB8CisgIGxpc3QoKSB8CisgIHttZW1idWZmZXIsIGJpbmFyeSgpIHwgbGlzdCgpfSB8CisgIHt0Y3AsIHBvcnQoKX0gfAorICB7dGNwLCBwb3J0KCksIGxpc3QoKX0gfAorICB7ZmlsZSwgZmlsZTppb19kZXZpY2UoKX0gfAorICB7ZmlsZSwgZmlsZTppb19kZXZpY2UoKSwgbGlzdCgpfSB8CisgIHtmaWxlLCBmaWxlOmZpbGVuYW1lKCl9IHwKKyAge2ZpbGUsIGZpbGU6ZmlsZW5hbWUoKSwgbGlzdCgpfS4KIAotLXNwZWMgcmVhZCgjdHJhbnNwb3J0e30sIG5vbl9uZWdfaW50ZWdlcigpKSAtPiB7I3RyYW5zcG9ydHt9LCB7b2ssIGJpbmFyeSgpfSB8IHtlcnJvciwgX1JlYXNvbn19LgotcmVhZChUcmFuc3BvcnQsIExlbikgd2hlbiBpc19pbnRlZ2VyKExlbikgLT4KLSAgICBNb2R1bGUgPSBUcmFuc3BvcnQjdHJhbnNwb3J0Lm1vZHVsZSwKLSAgICB7TmV3VHJhbnNEYXRhLCBSZXN1bHR9ID0gTW9kdWxlOnJlYWQoVHJhbnNwb3J0I3RyYW5zcG9ydC5kYXRhLCBMZW4pLAotICAgIHtUcmFuc3BvcnQjdHJhbnNwb3J0e2RhdGEgPSBOZXdUcmFuc0RhdGF9LCBSZXN1bHR9LgorLXNwZWMgbmV3KHdyYXBwYWJsZSgpKSAtPiB7b2ssICN0X3RyYW5zcG9ydHt9fS4KIAotLXNwZWMgZmx1c2goI3RyYW5zcG9ydHt9KSAtPiB7I3RyYW5zcG9ydHt9LCBvayB8IHtlcnJvciwgX1JlYXNvbn19LgotZmx1c2goVHJhbnNwb3J0ID0gI3RyYW5zcG9ydHttb2R1bGUgPSBNb2R1bGUsIGRhdGEgPSBEYXRhfSkgLT4KLSAgICB7TmV3VHJhbnNEYXRhLCBSZXN1bHR9ID0gTW9kdWxlOmZsdXNoKERhdGEpLAotICAgIHtUcmFuc3BvcnQjdHJhbnNwb3J0e2RhdGEgPSBOZXdUcmFuc0RhdGF9LCBSZXN1bHR9LgorbmV3KHttZW1idWZmZXIsIE1lbWJ1ZmZlcn0pIHdoZW4gaXNfYmluYXJ5KE1lbWJ1ZmZlcik7IGlzX2xpc3QoTWVtYnVmZmVyKSAtPgorICB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydDpuZXcoTWVtYnVmZmVyKTsKK25ldyh7bWVtYnVmZmVyLCBNZW1idWZmZXIsIFtdfSkgd2hlbiBpc19iaW5hcnkoTWVtYnVmZmVyKTsgaXNfbGlzdChNZW1idWZmZXIpIC0+CisgIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0Om5ldyhNZW1idWZmZXIpOworbmV3KHt0Y3AsIFNvY2tldH0pIHdoZW4gaXNfcG9ydChTb2NrZXQpIC0+CisgIG5ldyh7dGNwLCBTb2NrZXQsIFtdfSk7CituZXcoe3RjcCwgU29ja2V0LCBPcHRzfSkgd2hlbiBpc19wb3J0KFNvY2tldCkgLT4KKyAgdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQ6bmV3KFNvY2tldCwgT3B0cyk7CituZXcoe2ZpbGUsIEZpbGVuYW1lfSkgd2hlbiBpc19saXN0KEZpbGVuYW1lKTsgaXNfYmluYXJ5KEZpbGVuYW1lKSAtPgorICBuZXcoe2ZpbGUsIEZpbGVuYW1lLCBbXX0pOworbmV3KHtmaWxlLCBGaWxlbmFtZSwgT3B0c30pIHdoZW4gaXNfbGlzdChGaWxlbmFtZSk7IGlzX2JpbmFyeShGaWxlbmFtZSkgLT4KKyAge29rLCBGaWxlfSA9IGZpbGU6b3BlbihGaWxlbmFtZSwgW3JhdywgYmluYXJ5XSksCisgIG5ldyh7ZmlsZSwgRmlsZSwgT3B0c30pOworbmV3KHtmaWxlLCBGaWxlLCBPcHRzfSkgLT4KKyAgdGhyaWZ0X2ZpbGVfdHJhbnNwb3J0Om5ldyhGaWxlLCBPcHRzKS4KIAotLXNwZWMgY2xvc2UoI3RyYW5zcG9ydHt9KSAtPiB7I3RyYW5zcG9ydHt9LCBvayB8IHtlcnJvciwgX1JlYXNvbn19LgotY2xvc2UoVHJhbnNwb3J0ID0gI3RyYW5zcG9ydHttb2R1bGUgPSBNb2R1bGUsIGRhdGEgPSBEYXRhfSkgLT4KLSAgICB7TmV3VHJhbnNEYXRhLCBSZXN1bHR9ID0gTW9kdWxlOmNsb3NlKERhdGEpLAotICAgIHtUcmFuc3BvcnQjdHJhbnNwb3J0e2RhdGEgPSBOZXdUcmFuc0RhdGF9LCBSZXN1bHR9LgorLXNwZWMgbmV3KE1vZHVsZTo6bW9kdWxlKCksIFN0YXRlOjphbnkoKSkgLT4ge29rLCAjdF90cmFuc3BvcnR7fX0uCisKK25ldyhNb2R1bGUsIFN0YXRlKSB3aGVuIGlzX2F0b20oTW9kdWxlKSAtPgorICB7b2ssID9kZWJ1Z193cmFwKCN0X3RyYW5zcG9ydHttb2R1bGUgPSBNb2R1bGUsIHN0YXRlID0gU3RhdGV9KX0uCisKKworLWluY2x1ZGUoInRocmlmdF90cmFuc3BvcnRfYmVoYXZpb3VyLmhybCIpLgorCisKK3JlYWQoVHJhbnNwb3J0ID0gI3RfdHJhbnNwb3J0e21vZHVsZSA9IE1vZHVsZX0sIExlbikKK3doZW4gaXNfaW50ZWdlcihMZW4pLCBMZW4gPj0gMCAtPgorICB7TmV3U3RhdGUsIFJlc3VsdH0gPSBNb2R1bGU6cmVhZChUcmFuc3BvcnQjdF90cmFuc3BvcnQuc3RhdGUsIExlbiksCisgIHtUcmFuc3BvcnQjdF90cmFuc3BvcnR7c3RhdGUgPSBOZXdTdGF0ZX0sIFJlc3VsdH0uCisKKworcmVhZF9leGFjdChUcmFuc3BvcnQgPSAjdF90cmFuc3BvcnR7bW9kdWxlID0gTW9kdWxlfSwgTGVuKQord2hlbiBpc19pbnRlZ2VyKExlbiksIExlbiA+PSAwIC0+CisgIGNhc2UgbGlzdHM6a2V5ZmluZChyZWFkX2V4YWN0LCAxLCBNb2R1bGU6bW9kdWxlX2luZm8oZXhwb3J0cykpIG9mCisgICAge3JlYWRfZXhhY3QsIDJ9IC0+CisgICAgICB7TmV3U3RhdGUsIFJlc3VsdH0gPSBNb2R1bGU6cmVhZF9leGFjdChUcmFuc3BvcnQjdF90cmFuc3BvcnQuc3RhdGUsIExlbiksCisgICAgICB7VHJhbnNwb3J0I3RfdHJhbnNwb3J0e3N0YXRlID0gTmV3U3RhdGV9LCBSZXN1bHR9OworICAgIF8gLT4KKyAgICAgIHJlYWQoVHJhbnNwb3J0LCBMZW4pCisgIGVuZC4KKworCit3cml0ZShUcmFuc3BvcnQgPSAjdF90cmFuc3BvcnR7bW9kdWxlID0gTW9kdWxlfSwgRGF0YSkgLT4KKyAge05ld1N0YXRlLCBSZXN1bHR9ID0gTW9kdWxlOndyaXRlKFRyYW5zcG9ydCN0X3RyYW5zcG9ydC5zdGF0ZSwgRGF0YSksCisgIHtUcmFuc3BvcnQjdF90cmFuc3BvcnR7c3RhdGUgPSBOZXdTdGF0ZX0sIFJlc3VsdH0uCisKKworZmx1c2goVHJhbnNwb3J0ID0gI3RfdHJhbnNwb3J0e21vZHVsZSA9IE1vZHVsZX0pIC0+CisgIHtOZXdTdGF0ZSwgUmVzdWx0fSA9IE1vZHVsZTpmbHVzaChUcmFuc3BvcnQjdF90cmFuc3BvcnQuc3RhdGUpLAorICB7VHJhbnNwb3J0I3RfdHJhbnNwb3J0e3N0YXRlID0gTmV3U3RhdGV9LCBSZXN1bHR9LgorCisKK2Nsb3NlKFRyYW5zcG9ydCA9ICN0X3RyYW5zcG9ydHttb2R1bGUgPSBNb2R1bGV9KSAtPgorICB7TmV3U3RhdGUsIFJlc3VsdH0gPSBNb2R1bGU6Y2xvc2UoVHJhbnNwb3J0I3RfdHJhbnNwb3J0LnN0YXRlKSwKKyAge1RyYW5zcG9ydCN0X3RyYW5zcG9ydHtzdGF0ZSA9IE5ld1N0YXRlfSwgUmVzdWx0fS4KKwpkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L1RocmlmdF9vbWl0X3dpdGgudGhyaWZ0IGIvbGliL2VybC90ZXN0L1RocmlmdF9vbWl0X3dpdGgudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZmZjN2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3Rlc3QvVGhyaWZ0X29taXRfd2l0aC50aHJpZnQKQEAgLTAsMCArMSwyMiBAQAorc3RydWN0IHRlc3QxIHsKKyAgMTogaTMyIG9uZQorICAyOiBpMzIgdHdvICAgICAgICAgICAgICAgICAgICAvLyBvbWl0CisgIDM6IGkzMiB0aHJlZQorfQorCitzdHJ1Y3QgdGVzdDIgeworICAxOiBpMzIgb25lCisgIDI6IHRlc3QyIHR3byAgICAgICAgICAgICAgICAgIC8vIG9taXQKKyAgMzogaTMyIHRocmVlCit9CisKK3N0cnVjdCB0ZXN0MyB7CisgIDE6IGkzMiBvbmUKKyAgMjogbGlzdDx0ZXN0MT4gdHdvICAgICAgICAgICAgLy8gb21pdAorfQorCitzdHJ1Y3QgdGVzdDQgeworICAxOiBpMzIgb25lCisgIDI6IG1hcDxpMzIsdGVzdDE+IHR3byAgICAgICAgIC8vIG9taXQKK30KKwpkaWZmIC0tZ2l0IGEvdGVzdC9lcmwvTGVnYWN5TmFtZXMudGhyaWZ0IGIvbGliL2VybC90ZXN0L2ZsYWdzL0xlZ2FjeU5hbWVzLnRocmlmdApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdC9lcmwvTGVnYWN5TmFtZXMudGhyaWZ0CnJlbmFtZSB0byBsaWIvZXJsL3Rlc3QvZmxhZ3MvTGVnYWN5TmFtZXMudGhyaWZ0CmRpZmYgLS1naXQgYS9saWIvZXJsL3Rlc3QvVGhyaWZ0MzIxNC50aHJpZnQgYi9saWIvZXJsL3Rlc3QvZmxhZ3MvVGhyaWZ0MzIxNC50aHJpZnQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYi9lcmwvdGVzdC9UaHJpZnQzMjE0LnRocmlmdApyZW5hbWUgdG8gbGliL2VybC90ZXN0L2ZsYWdzL1RocmlmdDMyMTQudGhyaWZ0CmRpZmYgLS1naXQgYS9saWIvZXJsL3Rlc3QvbGVnYWN5X25hbWVzX3Rlc3QuZXJsIGIvbGliL2VybC90ZXN0L2xlZ2FjeV9uYW1lc190ZXN0LmVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTZhYTNlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90ZXN0L2xlZ2FjeV9uYW1lc190ZXN0LmVybApAQCAtMCwwICsxLDY5IEBACislJQorJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCislJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorJSUKKyUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCislJQorJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyUlIHVuZGVyIHRoZSBMaWNlbnNlLgorJSUKKworLW1vZHVsZShsZWdhY3lfbmFtZXNfdGVzdCkuCistY29tcGlsZShleHBvcnRfYWxsKS4KKworLWluY2x1ZGVfbGliKCJldW5pdC9pbmNsdWRlL2V1bml0LmhybCIpLgorCistaW5jbHVkZSgiZ2VuLWVybC9sZWdhY3lOYW1lc19jb25zdGFudHMuaHJsIikuCisKK3JlY29yZF9nZW5lcmF0aW9uX3Rlc3RfKCkgLT4KKyAgWworICAgIHsiY2FwaXRhbGl6ZWRTdHJ1Y3QgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtjYXBpdGFsaXplZFN0cnVjdCwgXywgX30sCisgICAgICAjY2FwaXRhbGl6ZWRTdHJ1Y3R7aWQ9bnVsbCxtZXNzYWdlPW51bGx9CisgICAgKX0KKyAgXS4KKworc3RydWN0X2luZm9fdGVzdF8oKSAtPgorICBbCisgICAgeyJjYXBpdGFsaXplZFN0cnVjdCBleHRlbmRlZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwgaTMyLCAnaWQnLCB1bmRlZmluZWR9LAorICAgICAgICB7MiwgdW5kZWZpbmVkLCBzdHJpbmcsICdtZXNzYWdlJywgdW5kZWZpbmVkfQorICAgICAgXX0sCisgICAgICBsZWdhY3lOYW1lc190eXBlczpzdHJ1Y3RfaW5mb19leHQoY2FwaXRhbGl6ZWRTdHJ1Y3QpCisgICAgKX0sCisgICAgeyJsaXN0Q2FwaXRhbGl6ZWRTdHJ1Y3RzIGV4dGVuZGVkIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCB7bGlzdCwge3N0cnVjdCwgeydsZWdhY3lOYW1lc190eXBlcycsICdjYXBpdGFsaXplZFN0cnVjdCd9fX0sICdzdHJ1Y3RzJywgW119CisgICAgICBdfSwKKyAgICAgIGxlZ2FjeU5hbWVzX3R5cGVzOnN0cnVjdF9pbmZvX2V4dChsaXN0Q2FwaXRhbGl6ZWRTdHJ1Y3RzKQorICAgICl9CisgIF0uCisKK3NlcnZpY2VfaW5mb190ZXN0XygpIC0+CisgIFsKKyAgICB7Im5hbWVzIHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB7c3RydWN0LCB7J2xlZ2FjeU5hbWVzX3R5cGVzJywgJ2NhcGl0YWxpemVkU3RydWN0J319fSwKKyAgICAgICAgezIsIHtzdHJ1Y3QsIHsnbGVnYWN5TmFtZXNfdHlwZXMnLCAnY2FwaXRhbGl6ZWRTdHJ1Y3QnfX19CisgICAgICBdfSwKKyAgICAgIGxlZ2FjeU5hbWVzX3RocmlmdDpmdW5jdGlvbl9pbmZvKG5hbWVzLCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7Im5hbWVzIHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIHsnbGVnYWN5TmFtZXNfdHlwZXMnLCAnbGlzdENhcGl0YWxpemVkU3RydWN0cyd9fSwKKyAgICAgIGxlZ2FjeU5hbWVzX3RocmlmdDpmdW5jdGlvbl9pbmZvKG5hbWVzLCByZXBseV90eXBlKQorICAgICl9LAorICAgIHsibmFtZXMgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIHtzdHJ1Y3QsIHsnbGVnYWN5TmFtZXNfdHlwZXMnLCAneGNlcHRpb24nfX19XX0sCisgICAgICBsZWdhY3lOYW1lc190aHJpZnQ6ZnVuY3Rpb25faW5mbyhuYW1lcywgZXhjZXB0aW9ucykKKyAgICApfQorICBdLgpkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L211bHRpcGxleGluZy50aHJpZnQgYi9saWIvZXJsL3Rlc3QvbXVsdGlwbGV4aW5nLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yzc5OTRiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90ZXN0L211bHRpcGxleGluZy50aHJpZnQKQEAgLTAsMCArMSw3IEBACitzZXJ2aWNlIE11bHRpcGxleGluZ19DYWxjdWxhdG9yIHsKKyAgICBpMzIgYWRkKDE6IGkzMiB4LCAyOiBpMzIgeSkKK30KKworc2VydmljZSBNdWx0aXBsZXhpbmdfV2VhdGhlclJlcG9ydCB7CisgICAgZG91YmxlIGdldFRlbXBlcmF0dXJlKCkKK30KZGlmZiAtLWdpdCBhL2xpYi9lcmwvdGVzdC9tdWx0aXBsZXhpbmdfdGVzdC5lcmwgYi9saWIvZXJsL3Rlc3QvbXVsdGlwbGV4aW5nX3Rlc3QuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMmQ2MTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3Rlc3QvbXVsdGlwbGV4aW5nX3Rlc3QuZXJsCkBAIC0wLDAgKzEsNTcgQEAKKy1tb2R1bGUobXVsdGlwbGV4aW5nX3Rlc3QpLgorCistaW5jbHVkZV9saWIoImV1bml0L2luY2x1ZGUvZXVuaXQuaHJsIikuCisKKy1leHBvcnQoWworICAgICBoYW5kbGVfZnVuY3Rpb24vMgorICAgICxoYW5kbGVfZXJyb3IvMgorXSkuCisKK3N0YXJ0X211bHRpcGxleGVkX3NlcnZlcl90ZXN0KCkgLT4KKworICAgIFBvcnQgPSA5MDkwLAorICAgIFNlcnZpY2VzID0gWworICAgICAgICAgICAgICAgIHsiTXVsdGlwbGV4aW5nX0NhbGN1bGF0b3IiLCAgICBtdWx0aXBsZXhpbmdfX2NhbGN1bGF0b3JfdGhyaWZ0fSwKKyAgICAgICAgICAgICAgICB7Ik11bHRpcGxleGluZ19XZWF0aGVyUmVwb3J0IiwgbXVsdGlwbGV4aW5nX193ZWF0aGVyX3JlcG9ydF90aHJpZnR9CisgICAgICAgICAgICAgICBdLAorCisgICAge29rLCBQaWR9ID0gdGhyaWZ0X3NvY2tldF9zZXJ2ZXI6c3RhcnQoWworICAgICAgICB7aXAsICIxMjcuMC4wLjEifSwKKyAgICAgICAge3BvcnQsIFBvcnR9LAorICAgICAgICB7bmFtZSwgP01PRFVMRX0sCisgICAgICAgIHtzZXJ2aWNlLCBTZXJ2aWNlc30sCisgICAgICAgIHtoYW5kbGVyLCBbCisgICAgICAgICAgICB7ImVycm9yX2hhbmRsZXIiLCAgICAgICAgICAgICAgP01PRFVMRX0sCisgICAgICAgICAgICB7Ik11bHRpcGxleGluZ19DYWxjdWxhdG9yIiwgICAgP01PRFVMRX0sCisgICAgICAgICAgICB7Ik11bHRpcGxleGluZ19XZWF0aGVyUmVwb3J0IiwgP01PRFVMRX0KKyAgICAgICAgXX0KKyAgICAgXSksCisKKyAgICB7b2ssIFt7Ik11bHRpcGxleGluZ19DYWxjdWxhdG9yIiwgQ2FsY3VsYXRvckNsaWVudDB9LAorICAgICAgICAgIHsiTXVsdGlwbGV4aW5nX1dlYXRoZXJSZXBvcnQiLCBXZWF0aGVyUmVwb3J0Q2xpZW50MH1dfSA9IHRocmlmdF9jbGllbnRfdXRpbDpuZXdfbXVsdGlwbGV4ZWQoIjEyNy4wLjAuMSIsIFBvcnQsIFNlcnZpY2VzLCBbXSksCisKKyAgICA/YXNzZXJ0TWF0Y2goe18sIHtlcnJvciwge2JhZF9hcmdzLCBfLCBffX19LCB0aHJpZnRfY2xpZW50OmNhbGwoV2VhdGhlclJlcG9ydENsaWVudDAsIGdldFRlbXBlcmF0dXJlLCBbMV0pKSwKKyAgICA/YXNzZXJ0TWF0Y2goe18sIHtlcnJvciwge2JhZF9hcmdzLCBfLCBffX19LCB0aHJpZnRfY2xpZW50OmNhbGwoQ2FsY3VsYXRvckNsaWVudDAsIGFkZCwgWzFdKSksCisgICAgP2Fzc2VydE1hdGNoKHtfLCB7ZXJyb3IsIHtiYWRfYXJncywgXywgX319fSwgdGhyaWZ0X2NsaWVudDpjYWxsKENhbGN1bGF0b3JDbGllbnQwLCBhZGQsIFsxLDEsMV0pKSwKKworICAgID9hc3NlcnRNYXRjaCh7Xywge2Vycm9yLCB7bm9fZnVuY3Rpb24sIF99fX0sIHRocmlmdF9jbGllbnQ6Y2FsbChDYWxjdWxhdG9yQ2xpZW50MCwgZ2V0VGVtcGVyYXR1cmUsIFtdKSksCisgICAgP2Fzc2VydE1hdGNoKHtfLCB7ZXJyb3IsIHtub19mdW5jdGlvbiwgX319fSwgdGhyaWZ0X2NsaWVudDpjYWxsKFdlYXRoZXJSZXBvcnRDbGllbnQwLCBhZGQsIFs0MSwgMV0pKSwKKworICAgID9hc3NlcnRNYXRjaCh7Xywge29rLCA0Mn19LCB0aHJpZnRfY2xpZW50OmNhbGwoQ2FsY3VsYXRvckNsaWVudDAsIGFkZCwgWzQxLCAxXSkpLAorICAgID9hc3NlcnRNYXRjaCh7Xywge29rLCA0Mi4wfX0sIHRocmlmdF9jbGllbnQ6Y2FsbChXZWF0aGVyUmVwb3J0Q2xpZW50MCwgZ2V0VGVtcGVyYXR1cmUsIFtdKSksCisKKyAgICB0aHJpZnRfc29ja2V0X3NlcnZlcjpzdG9wKFBpZCkuCisKKyUlIEhBTkRMRSBGVU5DVElPTlMKKworJSUgQ2FsY3VsYXRvciBoYW5kbGVzCitoYW5kbGVfZnVuY3Rpb24oYWRkLCB7WCwgWX0pIC0+CisgICAge3JlcGx5LCBYICsgWX07CisKKyUlIFdlYXRoZXJSZXBvcnQgaGFuZGxlcworaGFuZGxlX2Z1bmN0aW9uKGdldFRlbXBlcmF0dXJlLCB7fSkgLT4KKyAgICB7cmVwbHksIDQyLjB9LgorCitoYW5kbGVfZXJyb3IoX0YsIF9SZWFzb24pIC0+CislJSAgICAgP2RlYnVnSGVyZSwgP2RlYnVnVmFsKHtfRiwgX1JlYXNvbn0pLAorICAgIG9rLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9lcmwvdGVzdC9uYW1lX2NvbmZsaWN0X3Rlc3QuZXJsIGIvbGliL2VybC90ZXN0L25hbWVfY29uZmxpY3RfdGVzdC5lcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAxZGY1NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvdGVzdC9uYW1lX2NvbmZsaWN0X3Rlc3QuZXJsCkBAIC0wLDAgKzEsMjk5IEBACislJQorJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCislJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorJSUKKyUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCislJQorJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyUlIHVuZGVyIHRoZSBMaWNlbnNlLgorJSUKKworLW1vZHVsZShuYW1lX2NvbmZsaWN0X3Rlc3QpLgorLWNvbXBpbGUoZXhwb3J0X2FsbCkuCisKKy1pbmNsdWRlX2xpYigiZXVuaXQvaW5jbHVkZS9ldW5pdC5ocmwiKS4KKworLWluY2x1ZGUoImdlbi1lcmwvbmFtZV9jb25mbGljdF90ZXN0X2NvbnN0YW50cy5ocmwiKS4KKworcmVjb3JkX2dlbmVyYXRpb25fdGVzdF8oKSAtPgorICBbCisgICAgeyJ1c2luZyByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge3VzaW5nLCBfLCBffSwKKyAgICAgICN1c2luZ3tzaW5nbGU9bnVsbCxpbnRlZ2VyPW51bGx9CisgICAgKX0sCisgICAgeyJkZWxlZ2F0ZSByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge2RlbGVnYXRlLCBfLCBffSwKKyAgICAgICNkZWxlZ2F0ZXtwYXJ0aWFsPW51bGwsZGVsZWdhdGU9bnVsbH0KKyAgICApfSwKKyAgICB7ImdldCByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge2dldCwgX30sCisgICAgICAjZ2V0e3NieXRlPW51bGx9CisgICAgKX0sCisgICAgeyJwYXJ0aWFsIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7cGFydGlhbCwgXywgXywgX30sCisgICAgICAjcGFydGlhbHt1c2luZz1udWxsfQorICAgICl9LAorICAgIHsiQ2xhc3NBbmRQcm9wIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J0NsYXNzQW5kUHJvcCcsIF8sIF8sIF8sIF99LAorICAgICAgIydDbGFzc0FuZFByb3AneworICAgICAgICAnQ2xhc3NBbmRQcm9wJz1udWxsLAorICAgICAgICAnQ2xhc3NBbmRQcm9wXyc9bnVsbCwKKyAgICAgICAgJ0NsYXNzQW5kUHJvcF9fJz1udWxsLAorICAgICAgICAnQ2xhc3NBbmRQcm9wZXInPW51bGwKKyAgICAgIH0KKyAgICApfSwKKyAgICB7InNlY29uZF9jaGFuY2UgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtzZWNvbmRfY2hhbmNlLCBfLCBfLCBfLCBffSwKKyAgICAgICNzZWNvbmRfY2hhbmNleworICAgICAgICAnU0VDT05EX0NIQU5DRSc9bnVsbCwKKyAgICAgICAgJ1NFQ09ORF9DSEFOQ0VfJz1udWxsLAorICAgICAgICAnU0VDT05EX0NIQU5DRV9fJz1udWxsLAorICAgICAgICAnU0VDT05EX0NIQU5DRVMnPW51bGwKKyAgICAgIH0KKyAgICApfSwKKyAgICB7Ik5PV19FQVRfVEhJUyByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeydOT1dfRUFUX1RISVMnLCBfLCBfLCBfLCBffSwKKyAgICAgICMnTk9XX0VBVF9USElTJ3sKKyAgICAgICAgbm93X2VhdF90aGlzPW51bGwsCisgICAgICAgIG5vd19lYXRfdGhpc189bnVsbCwKKyAgICAgICAgbm93X2VhdF90aGlzX189bnVsbCwKKyAgICAgICAgbm93X2VhdF90aGlzX2FuZF90aGlzPW51bGwKKyAgICAgIH0KKyAgICApfSwKKyAgICB7IlRoZUVkZ2VDYXNlIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J1RoZUVkZ2VDYXNlJywgXywgXywgXywgXywgXywgX30sCisgICAgICAjJ1RoZUVkZ2VDYXNlJ3sKKyAgICAgICAgdGhlRWRnZUNhc2U9bnVsbCwKKyAgICAgICAgdGhlRWRnZUNhc2VfPW51bGwsCisgICAgICAgIHRoZUVkZ2VDYXNlX189bnVsbCwKKyAgICAgICAgJ1RoZUVkZ2VDYXNlJz1udWxsLAorICAgICAgICAnVGhlRWRnZUNhc2VfJz1udWxsLAorICAgICAgICAnVGhlRWRnZUNhc2VfXyc9bnVsbAorICAgICAgfQorICAgICl9LAorICAgIHsiVHJpY2t5XyByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeydUcmlja3lfJywgXywgX30sCisgICAgICAjJ1RyaWNreV8ne3RyaWNreT1udWxsLCdUcmlja3knPW51bGx9CisgICAgKX0sCisgICAgeyJOZXN0ZWQgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsnTmVzdGVkJywgXywgXywgXywgXywgXywgX30sCisgICAgICAjJ05lc3RlZCd7CisgICAgICAgICdDbGFzc0FuZFByb3AnPW51bGwsCisgICAgICAgIHNlY29uZF9jaGFuY2U9bnVsbCwKKyAgICAgICAgJ05PV19FQVRfVEhJUyc9bnVsbCwKKyAgICAgICAgJ1RoZUVkZ2VDYXNlJz1udWxsLAorICAgICAgICAnVHJpY2t5Xyc9bnVsbCwKKyAgICAgICAgJ05lc3RlZCc9bnVsbAorICAgICAgfQorICAgICl9LAorICAgIHsiUHJvYmxlbV8gcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsnUHJvYmxlbV8nLCBfLCBffSwKKyAgICAgICMnUHJvYmxlbV8ne3Byb2JsZW09bnVsbCwnUHJvYmxlbSc9bnVsbH0KKyAgICApfQorICBdLgorCitzdHJ1Y3RfaW5mb190ZXN0XygpIC0+CisgIFsKKyAgICB7InVzaW5nIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCBkb3VibGV9LHsyLCBkb3VibGV9XX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8odXNpbmcpCisgICAgKX0sCisgICAgeyJkZWxlZ2F0ZSBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHN0cmluZ30sCisgICAgICAgIHsyLCB7c3RydWN0LCB7bmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLCBkZWxlZ2F0ZX19fQorICAgICAgXX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oZGVsZWdhdGUpCisgICAgKX0sCisgICAgeyJnZXQgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIGJvb2x9XX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oZ2V0KQorICAgICl9LAorICAgIHsicGFydGlhbCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsIHVzaW5nfX19LAorICAgICAgICB7MiwgYm9vbH0sCisgICAgICAgIHszLCBib29sfQorICAgICAgXX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8ocGFydGlhbCkKKyAgICApfSwKKyAgICB7IkNsYXNzQW5kUHJvcCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFt7MSwgYm9vbH0sezIsIGJvb2x9LHszLCBib29sfSx7NCwgYm9vbH1dfSwKKyAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mbygnQ2xhc3NBbmRQcm9wJykKKyAgICApfSwKKyAgICB7InNlY29uZF9jaGFuY2UgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIGJvb2x9LHsyLCBib29sfSx7MywgYm9vbH0sezQsIGJvb2x9XX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oc2Vjb25kX2NoYW5jZSkKKyAgICApfSwKKyAgICB7Ik5PV19FQVRfVEhJUyBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFt7MSwgYm9vbH0sezIsIGJvb2x9LHszLCBib29sfSx7NCwgYm9vbH1dfSwKKyAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mbygnTk9XX0VBVF9USElTJykKKyAgICApfSwKKyAgICB7IlRoZUVkZ2VDYXNlIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCBib29sfSx7MiwgYm9vbH0sezMsIGJvb2x9LHs0LCBib29sfSx7NSwgYm9vbH0sezYsIGJvb2x9XX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oJ1RoZUVkZ2VDYXNlJykKKyAgICApfSwKKyAgICB7IlRyaWNreV8gZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIGJvb2x9LHsyLCBib29sfV19LAorICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvKCdUcmlja3lfJykKKyAgICApfSwKKyAgICB7Ik5lc3RlZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsICdDbGFzc0FuZFByb3AnfX19LAorICAgICAgICB7Miwge3N0cnVjdCwge25hbWVfY29uZmxpY3RfdGVzdF90eXBlcywgc2Vjb25kX2NoYW5jZX19fSwKKyAgICAgICAgezMsIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsICdOT1dfRUFUX1RISVMnfX19LAorICAgICAgICB7NCwge3N0cnVjdCwge25hbWVfY29uZmxpY3RfdGVzdF90eXBlcywgJ1RoZUVkZ2VDYXNlJ319fSwKKyAgICAgICAgezUsIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsICdUcmlja3lfJ319fSwKKyAgICAgICAgezYsIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsICdOZXN0ZWQnfX19CisgICAgICBdfSwKKyAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mbygnTmVzdGVkJykKKyAgICApfSwKKyAgICB7IlByb2JsZW1fIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCBib29sfSx7MiwgYm9vbH1dfSwKKyAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mbygnUHJvYmxlbV8nKQorICAgICl9LAorICAgIHsidXNpbmcgZXh0ZW5kZWQgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIGRvdWJsZSwgc2luZ2xlLCB1bmRlZmluZWR9LAorICAgICAgICB7MiwgdW5kZWZpbmVkLCBkb3VibGUsIGludGVnZXIsIHVuZGVmaW5lZH0KKyAgICAgIF19LAorICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCh1c2luZykKKyAgICApfSwKKyAgICB7ImRlbGVnYXRlIGV4dGVuZGVkIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCBzdHJpbmcsIHBhcnRpYWwsIHVuZGVmaW5lZH0sCisgICAgICAgIHsyLCB1bmRlZmluZWQsIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsIGRlbGVnYXRlfX0sIGRlbGVnYXRlLCB1bmRlZmluZWR9CisgICAgICBdfSwKKyAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoZGVsZWdhdGUpCisgICAgKX0sCisgICAgeyJnZXQgZXh0ZW5kZWQgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIHVuZGVmaW5lZCwgYm9vbCwgc2J5dGUsIHVuZGVmaW5lZH1dfSwKKyAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoZ2V0KQorICAgICl9LAorICAgIHsicGFydGlhbCBleHRlbmRlZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwge3N0cnVjdCwge25hbWVfY29uZmxpY3RfdGVzdF90eXBlcywgdXNpbmd9fSwgdXNpbmcsICN1c2luZ3t9fSwKKyAgICAgICAgezIsIHVuZGVmaW5lZCwgYm9vbCwgcmVhZCwgdW5kZWZpbmVkfSwKKyAgICAgICAgezMsIHVuZGVmaW5lZCwgYm9vbCwgd3JpdGUsIHVuZGVmaW5lZH0KKyAgICAgIF19LAorICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dChwYXJ0aWFsKQorICAgICl9LAorICAgIHsiQ2xhc3NBbmRQcm9wIGV4dGVuZGVkIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCBib29sLCAnQ2xhc3NBbmRQcm9wJywgdW5kZWZpbmVkfSwKKyAgICAgICAgezIsIHVuZGVmaW5lZCwgYm9vbCwgJ0NsYXNzQW5kUHJvcF8nLCB1bmRlZmluZWR9LAorICAgICAgICB7MywgdW5kZWZpbmVkLCBib29sLCAnQ2xhc3NBbmRQcm9wX18nLCB1bmRlZmluZWR9LAorICAgICAgICB7NCwgdW5kZWZpbmVkLCBib29sLCAnQ2xhc3NBbmRQcm9wZXInLCB1bmRlZmluZWR9CisgICAgICBdfSwKKyAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ0NsYXNzQW5kUHJvcCcpCisgICAgKX0sCisgICAgeyJzZWNvbmRfY2hhbmNlIGV4dGVuZGVkIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCBib29sLCAnU0VDT05EX0NIQU5DRScsIHVuZGVmaW5lZH0sCisgICAgICAgIHsyLCB1bmRlZmluZWQsIGJvb2wsICdTRUNPTkRfQ0hBTkNFXycsIHVuZGVmaW5lZH0sCisgICAgICAgIHszLCB1bmRlZmluZWQsIGJvb2wsICdTRUNPTkRfQ0hBTkNFX18nLCB1bmRlZmluZWR9LAorICAgICAgICB7NCwgdW5kZWZpbmVkLCBib29sLCAnU0VDT05EX0NIQU5DRVMnLCB1bmRlZmluZWR9CisgICAgICBdfSwKKyAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoc2Vjb25kX2NoYW5jZSkKKyAgICApfSwKKyAgICB7Ik5PV19FQVRfVEhJUyBleHRlbmRlZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwgYm9vbCwgbm93X2VhdF90aGlzLCB1bmRlZmluZWR9LAorICAgICAgICB7MiwgdW5kZWZpbmVkLCBib29sLCBub3dfZWF0X3RoaXNfLCB1bmRlZmluZWR9LAorICAgICAgICB7MywgdW5kZWZpbmVkLCBib29sLCBub3dfZWF0X3RoaXNfXywgdW5kZWZpbmVkfSwKKyAgICAgICAgezQsIHVuZGVmaW5lZCwgYm9vbCwgbm93X2VhdF90aGlzX2FuZF90aGlzLCB1bmRlZmluZWR9CisgICAgICBdfSwKKyAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ05PV19FQVRfVEhJUycpCisgICAgKX0sCisgICAgeyJUaGVFZGdlQ2FzZSBleHRlbmRlZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwgYm9vbCwgdGhlRWRnZUNhc2UsIHVuZGVmaW5lZH0sCisgICAgICAgIHsyLCB1bmRlZmluZWQsIGJvb2wsIHRoZUVkZ2VDYXNlXywgdW5kZWZpbmVkfSwKKyAgICAgICAgezMsIHVuZGVmaW5lZCwgYm9vbCwgdGhlRWRnZUNhc2VfXywgdW5kZWZpbmVkfSwKKyAgICAgICAgezQsIHVuZGVmaW5lZCwgYm9vbCwgJ1RoZUVkZ2VDYXNlJywgdW5kZWZpbmVkfSwKKyAgICAgICAgezUsIHVuZGVmaW5lZCwgYm9vbCwgJ1RoZUVkZ2VDYXNlXycsIHVuZGVmaW5lZH0sCisgICAgICAgIHs2LCB1bmRlZmluZWQsIGJvb2wsICdUaGVFZGdlQ2FzZV9fJywgdW5kZWZpbmVkfQorICAgICAgXX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCdUaGVFZGdlQ2FzZScpCisgICAgKX0sCisgICAgeyJUcmlja3lfIGV4dGVuZGVkIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCBib29sLCB0cmlja3ksIHVuZGVmaW5lZH0sCisgICAgICAgIHsyLCB1bmRlZmluZWQsIGJvb2wsICdUcmlja3knLCB1bmRlZmluZWR9CisgICAgICBdfSwKKyAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ1RyaWNreV8nKQorICAgICl9LAorICAgIHsiTmVzdGVkIGV4dGVuZGVkIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCB7c3RydWN0LCB7CisgICAgICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLAorICAgICAgICAgICdDbGFzc0FuZFByb3AnCisgICAgICAgIH19LCAnQ2xhc3NBbmRQcm9wJywgIydDbGFzc0FuZFByb3Ane319LAorICAgICAgICB7MiwgdW5kZWZpbmVkLCB7c3RydWN0LCB7CisgICAgICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLAorICAgICAgICAgIHNlY29uZF9jaGFuY2UKKyAgICAgICAgfX0sIHNlY29uZF9jaGFuY2UsICNzZWNvbmRfY2hhbmNle319LAorICAgICAgICB7MywgdW5kZWZpbmVkLCB7c3RydWN0LCB7CisgICAgICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLAorICAgICAgICAgICdOT1dfRUFUX1RISVMnCisgICAgICAgIH19LCAnTk9XX0VBVF9USElTJywgIydOT1dfRUFUX1RISVMne319LAorICAgICAgICB7NCwgdW5kZWZpbmVkLCB7c3RydWN0LCB7CisgICAgICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLAorICAgICAgICAgICdUaGVFZGdlQ2FzZScKKyAgICAgICAgfX0sICdUaGVFZGdlQ2FzZScsICMnVGhlRWRnZUNhc2Une319LAorICAgICAgICB7NSwgdW5kZWZpbmVkLCB7c3RydWN0LCB7CisgICAgICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLAorICAgICAgICAgICdUcmlja3lfJworICAgICAgICB9fSwgJ1RyaWNreV8nLCAjJ1RyaWNreV8ne319LAorICAgICAgICB7NiwgdW5kZWZpbmVkLCB7c3RydWN0LCB7CisgICAgICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLAorICAgICAgICAgICdOZXN0ZWQnCisgICAgICAgIH19LCAnTmVzdGVkJywgdW5kZWZpbmVkfQorICAgICAgXX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCdOZXN0ZWQnKQorICAgICl9LAorICAgIHsiUHJvYmxlbV8gZXh0ZW5kZWQgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIGJvb2wsIHByb2JsZW0sIHVuZGVmaW5lZH0sCisgICAgICAgIHsyLCB1bmRlZmluZWQsIGJvb2wsICdQcm9ibGVtJywgdW5kZWZpbmVkfQorICAgICAgXX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCdQcm9ibGVtXycpCisgICAgKX0KKyAgXS4KKworc2VydmljZV9pbmZvX3Rlc3RfKCkgLT4KKyAgWworICAgIHsiZXZlbnQgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFt7MSwge3N0cnVjdCwge25hbWVfY29uZmxpY3RfdGVzdF90eXBlcywgcGFydGlhbH19fV19LAorICAgICAgZXh0ZXJuX3RocmlmdDpmdW5jdGlvbl9pbmZvKGV2ZW50LCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7ImV2ZW50IHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsIGRlbGVnYXRlfX0sCisgICAgICBleHRlcm5fdGhyaWZ0OmZ1bmN0aW9uX2luZm8oZXZlbnQsIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJldmVudCBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIGV4dGVybl90aHJpZnQ6ZnVuY3Rpb25faW5mbyhldmVudCwgZXhjZXB0aW9ucykKKyAgICApfSwKKyAgICB7IkZvbyBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCB7c3RydWN0LCB7bmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLCAnTmVzdGVkJ319fV19LAorICAgICAgZXh0ZXJuX3RocmlmdDpmdW5jdGlvbl9pbmZvKCdGb28nLCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7IkZvbyByZXBseSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICBleHRlcm5fdGhyaWZ0OmZ1bmN0aW9uX2luZm8oJ0ZvbycsIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJGb28gZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsICdQcm9ibGVtXyd9fX1dfSwKKyAgICAgIGV4dGVybl90aHJpZnQ6ZnVuY3Rpb25faW5mbygnRm9vJywgZXhjZXB0aW9ucykKKyAgICApfQorICBdLgpkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L3Rlc3RfY2xpZW50LmVybCBiL2xpYi9lcmwvdGVzdC90ZXN0X2NsaWVudC5lcmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlODVjNDcuLjAwMDAwMDAKLS0tIGEvbGliL2VybC90ZXN0L3Rlc3RfY2xpZW50LmVybAorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0lJQotJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0lJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotJSUKLSUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0lJQotJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSUlIHVuZGVyIHRoZSBMaWNlbnNlLgotJSUKLQotLW1vZHVsZSh0ZXN0X2NsaWVudCkuCi0KLS1leHBvcnQoW3N0YXJ0LzAsIHN0YXJ0LzFdKS4KLQotLWluY2x1ZGUoImdlbi1lcmwvdGhyaWZ0X3Rlc3RfdHlwZXMuaHJsIikuCi0KLS1yZWNvcmQob3B0aW9ucywge3BvcnQgPSA5MDkwLAotICAgICAgICAgICAgICAgICAgY2xpZW50X29wdHMgPSBbXX0pLgotCi1wYXJzZV9hcmdzKEFyZ3MpIC0+IHBhcnNlX2FyZ3MoQXJncywgI29wdGlvbnN7fSkuCi1wYXJzZV9hcmdzKFtdLCBPcHRzKSAtPiBPcHRzOwotcGFyc2VfYXJncyhbSGVhZCB8IFJlc3RdLCBPcHRzKSAtPgotICAgIE5ld09wdHMgPQotICAgICAgICBjYXNlIGNhdGNoIGxpc3RfdG9faW50ZWdlcihIZWFkKSBvZgotICAgICAgICAgICAgUG9ydCB3aGVuIGlzX2ludGVnZXIoUG9ydCkgLT4KLSAgICAgICAgICAgICAgICBPcHRzI29wdGlvbnN7cG9ydCA9IFBvcnR9OwotICAgICAgICAgICAgX0Vsc2UgLT4KLSAgICAgICAgICAgICAgICBjYXNlIEhlYWQgb2YKLSAgICAgICAgICAgICAgICAgICAgImZyYW1lZCIgLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIE9wdHMjb3B0aW9uc3tjbGllbnRfb3B0cyA9IFt7ZnJhbWVkLCB0cnVlfSB8IE9wdHMjb3B0aW9ucy5jbGllbnRfb3B0c119OwotICAgICAgICAgICAgICAgICAgICAiIiAtPgotICAgICAgICAgICAgICAgICAgICAgICAgT3B0czsKLSAgICAgICAgICAgICAgICAgICAgX0Vsc2UgLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIGVybGFuZzplcnJvcih7YmFkX2FyZywgSGVhZH0pCi0gICAgICAgICAgICAgICAgZW5kCi0gICAgICAgIGVuZCwKLSAgICBwYXJzZV9hcmdzKFJlc3QsIE5ld09wdHMpLgotCi0KLXN0YXJ0KCkgLT4gc3RhcnQoW10pLgotc3RhcnQoQXJncykgLT4KLSAgI29wdGlvbnN7cG9ydCA9IFBvcnQsIGNsaWVudF9vcHRzID0gQ2xpZW50T3B0c30gPSBwYXJzZV9hcmdzKEFyZ3MpLAotICB7b2ssIENsaWVudDB9ID0gdGhyaWZ0X2NsaWVudF91dGlsOm5ldygKLSAgICAiMTI3LjAuMC4xIiwgUG9ydCwgdGhyaWZ0X3Rlc3RfdGhyaWZ0LCBDbGllbnRPcHRzKSwKLQotICBEZW1vWHRydWN0ID0gIydYdHJ1Y3QnewotICAgIHN0cmluZ190aGluZyA9IDw8Ilplcm8iPj4sCi0gICAgYnl0ZV90aGluZyA9IDEsCi0gICAgaTMyX3RoaW5nID0gOTEyODM2MSwKLSAgICBpNjRfdGhpbmcgPSA5MjIzMzcyMDM2ODU0Nzc1ODA3fSwKLQotICBEZW1vTmVzdCA9ICMnWHRydWN0Mid7Ci0gICAgYnl0ZV90aGluZyA9IDcsCi0gICAgc3RydWN0X3RoaW5nID0gRGVtb1h0cnVjdCwKLSAgICAlIE5vdGUgdGhhdCB3ZSBkb24ndCBzZXQgaTMyX3RoaW5nLCBpdCB3aWxsIGNvbWUgYmFjayBhcyB1bmRlZmluZWQKLSAgICAlIGZyb20gdGhlIFB5dGhvbiBzZXJ2ZXIsIGJ1dCAwIGZyb20gdGhlIEMrKyBzZXJ2ZXIsIHNpbmNlIGl0IGlzIG5vdAotICAgICUgb3B0aW9uYWwKLSAgICBpMzJfdGhpbmcgPSAyfSwKLQotICAlIElzIGl0IHNhZmUgdG8gbWF0Y2ggdGhlc2UgdGhpbmdzPwotICBEZW1vRGljdCA9IGRpY3Q6ZnJvbV9saXN0KFsge0tleSwgS2V5LTEwfSB8fCBLZXkgPC0gbGlzdHM6c2VxKDAsMTApIF0pLAotICBEZW1vU2V0ID0gc2V0czpmcm9tX2xpc3QoWyBLZXkgfHwgS2V5IDwtIGxpc3RzOnNlcSgtMywzKSBdKSwKLQotICAlRGVtb0luc2FuZSA9ICNpbnNhbml0eXsKLSAgJSAgdXNlck1hcCA9IGRpY3Q6ZnJvbV9saXN0KFt7P3RocmlmdFRlc3RfRklWRSwgNTAwMH1dKSwKLSAgJSAgeHRydWN0cyA9IFsjeHRydWN0eyBzdHJpbmdfdGhpbmcgPSA8PCJUcnVjayI+PiwgYnl0ZV90aGluZyA9IDgsIGkzMl90aGluZyA9IDgsIGk2NF90aGluZyA9IDh9XX0sCi0KLSAge0NsaWVudDAxLCB7b2ssIG9rfX0gPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MCwgdGVzdFZvaWQsIFtdKSwKLQotICB7Q2xpZW50MDIsIHtvaywgPDwiVGVzdCI+Pn19ICAgICAgPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MDEsIHRlc3RTdHJpbmcsIFsiVGVzdCJdKSwKLSAge0NsaWVudDAzLCB7b2ssIDw8IlRlc3QiPj59fSAgICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDAyLCB0ZXN0U3RyaW5nLCBbPDwiVGVzdCI+Pl0pLAotICB7Q2xpZW50MDQsIHtvaywgNjN9fSAgICAgICAgICAgICAgPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MDMsIHRlc3RCeXRlLCBbNjNdKSwKLSAge0NsaWVudDA1LCB7b2ssIC0xfX0gICAgICAgICAgICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDA0LCB0ZXN0STMyLCBbLTFdKSwKLSAge0NsaWVudDA2LCB7b2ssIDB9fSAgICAgICAgICAgICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDA1LCB0ZXN0STMyLCBbMF0pLAotICB7Q2xpZW50MDcsIHtvaywgLTM0MzU5NzM4MzY4fX0gICAgPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MDYsIHRlc3RJNjQsIFstMzQzNTk3MzgzNjhdKSwKLSAge0NsaWVudDA4LCB7b2ssIC01LjIwOTg1MjN9fSAgICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDA3LCB0ZXN0RG91YmxlLCBbLTUuMjA5ODUyM10pLAotICAlJSBUT0RPOiBhZGQgdGVzdEJpbmFyeSgpIGNhbGwKLSAge0NsaWVudDA5LCB7b2ssIERlbW9YdHJ1Y3R9fSAgICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDA4LCB0ZXN0U3RydWN0LCBbRGVtb1h0cnVjdF0pLAotICB7Q2xpZW50MTAsIHtvaywgRGVtb05lc3R9fSAgICAgICAgPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MDksIHRlc3ROZXN0LCBbRGVtb05lc3RdKSwKLSAge0NsaWVudDExLCB7b2ssIERlbW9EaWN0fX0gICAgICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDEwLCB0ZXN0TWFwLCBbRGVtb0RpY3RdKSwKLSAge0NsaWVudDEyLCB7b2ssIERlbW9TZXR9fSAgICAgICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDExLCB0ZXN0U2V0LCBbRGVtb1NldF0pLAotICB7Q2xpZW50MTMsIHtvaywgWy0xLDIsM119fSAgICAgICAgPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MTIsIHRlc3RMaXN0LCBbWy0xLDIsM11dKSwKLSAge0NsaWVudDE0LCB7b2ssIDF9fSAgICAgICAgICAgICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDEzLCB0ZXN0RW51bSwgWz9USFJJRlRfVEVTVF9OVU1CRVJaX09ORV0pLAotICB7Q2xpZW50MTUsIHtvaywgMzA5ODU4MjM1MDgyNTIzfX0gPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MTQsIHRlc3RUeXBlZGVmLCBbMzA5ODU4MjM1MDgyNTIzXSksCi0KLSAgJSBObyBweXRob24gaW1wbGVtZW50YXRpb24sIGJ1dCB3b3JrcyB3aXRoIEMrKyBhbmQgRXJsYW5nLgotICAle0NsaWVudDE2LCB7b2ssIEluc2FuZVJlc3VsdH19ICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDE1LCB0ZXN0SW5zYW5pdHksIFtEZW1vSW5zYW5lXSksCi0gICVpbzpmb3JtYXQoIn5wfm4iLCBbSW5zYW5lUmVzdWx0XSksCi0gIENsaWVudDE2ID0gQ2xpZW50MTUsCi0KLSAge0NsaWVudDE3LCB7b2ssICMnWHRydWN0J3tzdHJpbmdfdGhpbmcgPSA8PCJNZXNzYWdlIj4+fX19ID0KLSAgICB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MTYsIHRlc3RNdWx0aUV4Y2VwdGlvbiwgWyJTYWZlIiwgIk1lc3NhZ2UiXSksCi0KLSAgQ2xpZW50MTggPQotICAgIHRyeQotICAgICAge0NsaWVudFMxLCBSZXN1bHQxfSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQxNywgdGVzdE11bHRpRXhjZXB0aW9uLCBbIlhjZXB0aW9uIiwgIk1lc3NhZ2UiXSksCi0gICAgICBpbzpmb3JtYXQoIlVuZXhwZWN0ZWQgcmV0dXJuISB+cH5uIiwgW1Jlc3VsdDFdKSwKLSAgICAgIENsaWVudFMxCi0gICAgY2F0Y2gKLSAgICAgIHRocm93OntDbGllbnRTMiwge2V4Y2VwdGlvbiwgRXhuUzEgPSAjJ1hjZXB0aW9uJ3t9fX0gLT4KLSAgICAgICAgIydYY2VwdGlvbid7ZXJyb3JDb2RlID0gMTAwMSwgbWVzc2FnZSA9IDw8IlRoaXMgaXMgYW4gWGNlcHRpb24iPj59ID0gRXhuUzEsCi0gICAgICAgIENsaWVudFMyOwotICAgICAgdGhyb3c6e0NsaWVudFMyLCB7ZXhjZXB0aW9uLCBfRXhuUzEgPSAjJ1hjZXB0aW9uMid7fX19IC0+Ci0gICAgICAgIGlvOmZvcm1hdCgiV3JvbmcgZXhjZXB0aW9uIHR5cGUhfm4iLCBbXSksCi0gICAgICAgIENsaWVudFMyCi0gICAgZW5kLAotCi0gIENsaWVudDE5ID0KLSAgICB0cnkKLSAgICAgIHtDbGllbnRTMywgUmVzdWx0Mn0gPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MTgsIHRlc3RNdWx0aUV4Y2VwdGlvbiwgWyJYY2VwdGlvbjIiLCAiTWVzc2FnZSJdKSwKLSAgICAgIGlvOmZvcm1hdCgiVW5leHBlY3RlZCByZXR1cm4hIH5wfm4iLCBbUmVzdWx0Ml0pLAotICAgICAgQ2xpZW50UzMKLSAgICBjYXRjaAotICAgICAgdGhyb3c6e0NsaWVudFM0LCB7ZXhjZXB0aW9uLCBfRXhuUzIgPSAjJ1hjZXB0aW9uJ3t9fX0gLT4KLSAgICAgICAgaW86Zm9ybWF0KCJXcm9uZyBleGNlcHRpb24gdHlwZSF+biIsIFtdKSwKLSAgICAgICAgQ2xpZW50UzQ7Ci0gICAgICB0aHJvdzp7Q2xpZW50UzQsIHtleGNlcHRpb24sIEV4blMyID0gIydYY2VwdGlvbjIne319fSAtPgotICAgICAgICAjJ1hjZXB0aW9uMid7ZXJyb3JDb2RlID0gMjAwMiwKLSAgICAgICAgICAgICAgICAgICBzdHJ1Y3RfdGhpbmcgPSAjJ1h0cnVjdCd7Ci0gICAgICAgICAgICAgICAgICAgICBzdHJpbmdfdGhpbmcgPSA8PCJUaGlzIGlzIGFuIFhjZXB0aW9uMiI+Pn19ID0gRXhuUzIsCi0gICAgICAgIENsaWVudFM0Ci0gICAgZW5kLAotCi0gIHRocmlmdF9jbGllbnQ6Y2xvc2UoQ2xpZW50MTkpLgpkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L3Rlc3RfY29uc3QuZXJsIGIvbGliL2VybC90ZXN0L3Rlc3RfY29uc3QuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNzc3N2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3Rlc3QvdGVzdF9jb25zdC5lcmwKQEAgLTAsMCArMSw1NCBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKy1tb2R1bGUodGVzdF9jb25zdCkuCisKKy1pZmRlZihURVNUKS4KKy1pbmNsdWRlX2xpYigiZXVuaXQvaW5jbHVkZS9ldW5pdC5ocmwiKS4KKworLWluY2x1ZGUoImdlbi1lcmwvY29uc3RhbnRzX2RlbW9fdHlwZXMuaHJsIikuCisKK25hbWVzcGFjZV90ZXN0KCkgLT4KKyAgJSUgVmVyaWZ5IHRoYXQgcmVjb3JkcyBwcm9kdWNlZCBieSBDb25zdGFudHNEZW1vLnRocmlmdCBoYXZlIHRoZSByaWdodCBuYW1lc3BhY2UuCisgIGlvOmZvcm1hdCh1c2VyLCAiaW4gbmFtZXNwYWNlX3Rlc3QoKVxuIiwgW10pLAorICB7c3RydWN0LCBffSA9IGNvbnN0YW50c19kZW1vX3R5cGVzOnN0cnVjdF9pbmZvKCdjb25zdHNfdGhpbmcnKSwKKyAge3N0cnVjdCwgX30gPSBjb25zdGFudHNfZGVtb190eXBlczpzdHJ1Y3RfaW5mbygnY29uc3RzX0JsYWgnKSwKKyAgb2suCisKK2NvbnN0X21hcF90ZXN0KCkgLT4KKyAgP2Fzc2VydEVxdWFsKDIzMywgY29uc3RhbnRzX2RlbW9fY29uc3RhbnRzOmdlbl9tYXAoMzU1MzIpKSwKKyAgP2Fzc2VydEVycm9yKGZ1bmN0aW9uX2NsYXVzZSwgY29uc3RhbnRzX2RlbW9fY29uc3RhbnRzOmdlbl9tYXAoMCkpLAorCisgID9hc3NlcnRFcXVhbCg4NTMsIGNvbnN0YW50c19kZW1vX2NvbnN0YW50czpnZW5fbWFwKDQzNTIzLCBkZWZhdWx0KSksCisgID9hc3NlcnRFcXVhbChkZWZhdWx0LCBjb25zdGFudHNfZGVtb19jb25zdGFudHM6Z2VuX21hcCgxMDExMCwgZGVmYXVsdCkpLAorCisgID9hc3NlcnRFcXVhbCg5ODMyNSwgY29uc3RhbnRzX2RlbW9fY29uc3RhbnRzOmdlbl9tYXAyKCJsa2pzZGYiKSksCisgID9hc3NlcnRFcnJvcihmdW5jdGlvbl9jbGF1c2UsIGNvbnN0YW50c19kZW1vX2NvbnN0YW50czpnZW5fbWFwMigibm9uZXhpc3QiKSksCisKKyAgP2Fzc2VydEVxdWFsKDIzMywgY29uc3RhbnRzX2RlbW9fY29uc3RhbnRzOmdlbl9tYXAyKCJoZWxsbyIsIDMyMSkpLAorICA/YXNzZXJ0RXF1YWwoMzIxLCBjb25zdGFudHNfZGVtb19jb25zdGFudHM6Z2VuX21hcDIoImdvb2RieWUiLCAzMjEpKS4KKworY29uc3RfbGlzdF90ZXN0KCkgLT4KKyAgP2Fzc2VydEVxdWFsKDIzNTk4MzUyLCBjb25zdGFudHNfZGVtb19jb25zdGFudHM6Z2VuX2xpc3QoMikpLAorICA/YXNzZXJ0RXJyb3IoZnVuY3Rpb25fY2xhdXNlLCBjb25zdGFudHNfZGVtb19jb25zdGFudHM6Z2VuX2xpc3QoMCkpLAorCisgID9hc3NlcnRFcXVhbCgzMjUzNTIzLCBjb25zdGFudHNfZGVtb19jb25zdGFudHM6Z2VuX2xpc3QoMywgZGVmYXVsdCkpLAorICA/YXNzZXJ0RXF1YWwoZGVmYXVsdCwgY29uc3RhbnRzX2RlbW9fY29uc3RhbnRzOmdlbl9saXN0KDEwLCBkZWZhdWx0KSkuCisKKy1lbmRpZi4gJSUgVEVTVApkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L3Rlc3RfbWVtYnVmZmVyLmVybCBiL2xpYi9lcmwvdGVzdC90ZXN0X21lbWJ1ZmZlci5lcmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MWFlMTEuLjAwMDAwMDAKLS0tIGEvbGliL2VybC90ZXN0L3Rlc3RfbWVtYnVmZmVyLmVybAorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0lJQotJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0lJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotJSUKLSUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0lJQotJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSUlIHVuZGVyIHRoZSBMaWNlbnNlLgotJSUKLQotLW1vZHVsZSh0ZXN0X21lbWJ1ZmZlcikuCi0KLS1pZmRlZihURVNUKS4KLS1pbmNsdWRlX2xpYigiZXVuaXQvaW5jbHVkZS9ldW5pdC5ocmwiKS4KLQotLWluY2x1ZGUoImdlbi1lcmwvdGhyaWZ0X3Rlc3RfdHlwZXMuaHJsIikuCi0KLXRlc3RfZGF0YSgpIC0+Ci0gICMnWHRydWN0J3sKLSAgICBzdHJpbmdfdGhpbmcgPSA8PCJmb29iYXIiPj4sCi0gICAgYnl0ZV90aGluZyA9IDEyMywKLSAgICBpMzJfdGhpbmcgPSAxMjM0NTY3LAotICAgIGk2NF90aGluZyA9IDEyMzQ1Njc4OTAwCi0gIH0uCi0KLWVuY29kZV9kZWNvZGVfMV90ZXN0KCkgLT4KLSAge29rLCBUcmFuc3BvcnR9ID0gdGhyaWZ0X21lbW9yeV9idWZmZXI6bmV3KCksCi0gIHtvaywgUHJvdG9jb2wwfSA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2w6bmV3KFRyYW5zcG9ydCksCi0gIFRlc3REYXRhID0gdGVzdF9kYXRhKCksCi0gIHtQcm90b2NvbDEsIG9rfSA9IHRocmlmdF9wcm90b2NvbDp3cml0ZShQcm90b2NvbDAsCi0gICAge3tzdHJ1Y3QsIGVsZW1lbnQoMiwgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oJ1h0cnVjdCcpKX0sCi0gICAgICBUZXN0RGF0YX0pLAotICB7X1Byb3RvY29sMiwge29rLCBSZXN1bHR9fSA9IHRocmlmdF9wcm90b2NvbDpyZWFkKFByb3RvY29sMSwKLSAgICB7c3RydWN0LCBlbGVtZW50KDIsIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvKCdYdHJ1Y3QnKSl9LAotICAgICdYdHJ1Y3QnKSwKLSAgUmVzdWx0ID0gVGVzdERhdGEuCi0KLWVuY29kZV9kZWNvZGVfMl90ZXN0KCkgLT4KLSAge29rLCBUcmFuc3BvcnR9ID0gdGhyaWZ0X21lbW9yeV9idWZmZXI6bmV3KCksCi0gIHtvaywgUHJvdG9jb2wwfSA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2w6bmV3KFRyYW5zcG9ydCksCi0gIFRlc3REYXRhID0gdGVzdF9kYXRhKCksCi0gIHtQcm90b2NvbDEsIG9rfSA9IHRocmlmdF9wcm90b2NvbDp3cml0ZShQcm90b2NvbDAsCi0gICAge3tzdHJ1Y3QsIGVsZW1lbnQoMiwgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oJ1h0cnVjdCcpKX0sCi0gICAgICBUZXN0RGF0YX0pLAotICB7X1Byb3RvY29sMiwge29rLCBSZXN1bHR9fSA9IHRocmlmdF9wcm90b2NvbDpyZWFkKFByb3RvY29sMSwKLSAgICB7c3RydWN0LCBlbGVtZW50KDIsIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvKCdYdHJ1Y3QzJykpfSwKLSAgICAnWHRydWN0MycpLAotCi0gIFJlc3VsdCA9ICMnWHRydWN0Myd7c3RyaW5nX3RoaW5nID0gVGVzdERhdGEjJ1h0cnVjdCcuc3RyaW5nX3RoaW5nLAotICAgIGNoYW5nZWQgPSB1bmRlZmluZWQsCi0gICAgaTMyX3RoaW5nID0gVGVzdERhdGEjJ1h0cnVjdCcuaTMyX3RoaW5nLAotICAgIGk2NF90aGluZyA9IFRlc3REYXRhIydYdHJ1Y3QnLmk2NF90aGluZ30uCi0KLQotZW5jb2RlX2RlY29kZV8zX3Rlc3QoKSAtPgotICB7b2ssIFRyYW5zcG9ydH0gPSB0aHJpZnRfbWVtb3J5X2J1ZmZlcjpuZXcoKSwKLSAge29rLCBQcm90b2NvbDB9ID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbDpuZXcoVHJhbnNwb3J0KSwKLSAgVGVzdERhdGEgPSAjJ0Jvb2xzJ3tpbV90cnVlID0gdHJ1ZSwgaW1fZmFsc2UgPSBmYWxzZX0sCi0gIHtQcm90b2NvbDEsIG9rfSA9IHRocmlmdF9wcm90b2NvbDp3cml0ZShQcm90b2NvbDAsCi0gICAge3tzdHJ1Y3QsIGVsZW1lbnQoMiwgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oJ0Jvb2xzJykpfSwKLSAgICAgIFRlc3REYXRhfSksCi0gIHtfUHJvdG9jb2wyLCB7b2ssIFJlc3VsdH19ID0gdGhyaWZ0X3Byb3RvY29sOnJlYWQoUHJvdG9jb2wxLAotICAgIHtzdHJ1Y3QsIGVsZW1lbnQoMiwgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oJ0Jvb2xzJykpfSwKLSAgICAnQm9vbHMnKSwKLQotICB0cnVlID0gVGVzdERhdGEjJ0Jvb2xzJy5pbV90cnVlICA9Oj0gUmVzdWx0IydCb29scycuaW1fdHJ1ZSwKLSAgdHJ1ZSA9IFRlc3REYXRhIydCb29scycuaW1fZmFsc2UgPTo9IFJlc3VsdCMnQm9vbHMnLmltX2ZhbHNlLgotCi0KLWVuY29kZV9kZWNvZGVfNF90ZXN0KCkgLT4KLSAge29rLCBUcmFuc3BvcnR9ID0gdGhyaWZ0X21lbW9yeV9idWZmZXI6bmV3KCksCi0gIHtvaywgUHJvdG9jb2wwfSA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2w6bmV3KFRyYW5zcG9ydCksCi0gIFRlc3REYXRhID0gIydJbnNhbml0eSd7eHRydWN0cz1bXX0sCi0gIHtQcm90b2NvbDEsIG9rfSA9IHRocmlmdF9wcm90b2NvbDp3cml0ZShQcm90b2NvbDAsCi0gICAge3tzdHJ1Y3QsIGVsZW1lbnQoMiwgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oJ0luc2FuaXR5JykpfSwKLSAgICAgIFRlc3REYXRhfSksCi0gIHtfUHJvdG9jb2wyLCB7b2ssIFJlc3VsdH19ID0gdGhyaWZ0X3Byb3RvY29sOnJlYWQoUHJvdG9jb2wxLAotICAgIHtzdHJ1Y3QsIGVsZW1lbnQoMiwgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oJ0luc2FuaXR5JykpfSwKLSAgICAnSW5zYW5pdHknKSwKLQotICBUZXN0RGF0YSA9IFJlc3VsdC4KLQotZW5jb2RlX2RlY29kZV81X3Rlc3QoKSAtPgotICAlIHRlc3Qgd3JpdGluZyB0byBhIGJ1ZmZlciwgZ2V0dGluZyB0aGUgYnl0ZXMgb3V0LCBwdXR0aW5nIHRoZW0KLSAgJSBpbiBhIG5ldyBidWZmZXIgYW5kIHJlYWRpbmcgdGhlbQotCi0gICUgaGVyZSdzIHRoZSB3cml0aW5nIHBhcnQKLSAge29rLCBUcmFuc3BvcnQwfSA9IHRocmlmdF9tZW1vcnlfYnVmZmVyOm5ldygpLAotICB7b2ssIFByb3RvY29sMH0gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sOm5ldyhUcmFuc3BvcnQwKSwKLSAgVGVzdERhdGEgPSB0ZXN0X2RhdGEoKSwKLSAge1Byb3RvY29sMSwgb2t9ID0gdGhyaWZ0X3Byb3RvY29sOndyaXRlKFByb3RvY29sMCwKLSAgICB7e3N0cnVjdCwgZWxlbWVudCgyLCB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mbygnWHRydWN0JykpfSwKLSAgICAgIFRlc3REYXRhfSksCi0gICUgZmx1c2ggbm93IHJldHVybnMgdGhlIGJ1ZmZlcgotICB7X1Byb3RvY29sMiwgQnVmfSA9IHRocmlmdF9wcm90b2NvbDpmbHVzaF90cmFuc3BvcnQoUHJvdG9jb2wxKSwKLQotICAlIG5vdyB0aGUgcmVhZGluZyBwYXJ0Ci0gIHtvaywgVDJ9ID0gdGhyaWZ0X21lbW9yeV9idWZmZXI6bmV3IChCdWYpLAotICB7b2ssIFAyfSA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2w6bmV3KFQyKSwKLSAge18sIHtvaywgUmVzdWx0fX0gPSB0aHJpZnRfcHJvdG9jb2w6cmVhZChQMiwKLSAgICB7c3RydWN0LCBlbGVtZW50KDIsIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvKCdYdHJ1Y3QnKSl9LAotICAgICdYdHJ1Y3QnKSwKLQotICBSZXN1bHQgPSBUZXN0RGF0YS4KLQotLWVuZGlmLgpkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L3Rlc3Rfb21pdC5lcmwgYi9saWIvZXJsL3Rlc3QvdGVzdF9vbWl0LmVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDg0MWUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90ZXN0L3Rlc3Rfb21pdC5lcmwKQEAgLTAsMCArMSw3OSBAQAorLW1vZHVsZSh0ZXN0X29taXQpLgorCistaW5jbHVkZSgiZ2VuLWVybC90aHJpZnRfb21pdF93aXRoX3R5cGVzLmhybCIpLgorCistaWZkZWYoVEVTVCkuCistaW5jbHVkZV9saWIoImV1bml0L2luY2x1ZGUvZXVuaXQuaHJsIikuCisKK29taXRfc3RydWN0MV90ZXN0KCkgLT4KKyAgJSUgSW4gdGhpcyB0ZXN0LCB0aGUgZmllbGQgdGhhdCBpcyBkZWxldGVkIGlzIGEgYmFzaWMgdHlwZSAoYW4gaTMyKS4KKyAgQSA9ICN0ZXN0MXtvbmUgPSAxLCB0aHJlZSA9IDN9LAorICBCID0gI3Rlc3Qxe29uZSA9IDEsIHR3byA9IDIsIHRocmVlID0gM30sCisgIHtvaywgVHJhbnNwb3J0fSA9IHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0Om5ldygpLAorICB7b2ssIFAwfSA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2w6bmV3KFRyYW5zcG9ydCksCisKKyAge1AxLCBva30gPSB0aHJpZnRfcHJvdG9jb2w6d3JpdGUoUDAsIHt7c3RydWN0LCB7dGhyaWZ0X29taXRfd2l0aF90eXBlcywgZWxlbWVudCgxLCBBKX19LCBBfSksCisgIHtQMiwge29rLCBPMH19ID0gdGhyaWZ0X3Byb3RvY29sOnJlYWQoUDEsIHtzdHJ1Y3QsIHt0aHJpZnRfb21pdF93aXRob3V0X3R5cGVzLCBlbGVtZW50KDEsIEEpfX0pLAorICA/YXNzZXJ0RXF1YWwoZWxlbWVudCgxLCBBKSwgZWxlbWVudCgxLCBPMCkpLAorICA/YXNzZXJ0RXF1YWwoZWxlbWVudCgyLCBBKSwgZWxlbWVudCgyLCBPMCkpLAorICA/YXNzZXJ0RXF1YWwoZWxlbWVudCg0LCBBKSwgZWxlbWVudCgzLCBPMCkpLAorCisgIHtQMywgb2t9ID0gdGhyaWZ0X3Byb3RvY29sOndyaXRlKFAyLCB7e3N0cnVjdCwge3RocmlmdF9vbWl0X3dpdGhfdHlwZXMsIGVsZW1lbnQoMSwgQil9fSwgQn0pLAorICB7X1A0LCB7b2ssIE8xfX0gPSB0aHJpZnRfcHJvdG9jb2w6cmVhZChQMywge3N0cnVjdCwge3RocmlmdF9vbWl0X3dpdGhvdXRfdHlwZXMsIGVsZW1lbnQoMSwgQSl9fSksCisgID9hc3NlcnRFcXVhbChlbGVtZW50KDEsIEEpLCBlbGVtZW50KDEsIE8xKSksCisgID9hc3NlcnRFcXVhbChlbGVtZW50KDIsIEEpLCBlbGVtZW50KDIsIE8xKSksCisgID9hc3NlcnRFcXVhbChlbGVtZW50KDQsIEEpLCBlbGVtZW50KDMsIE8xKSksCisKKyAgb2suCisKK29taXRfc3RydWN0Ml90ZXN0KCkgLT4KKyAgJSUgSW4gdGhpcyB0ZXN0LCB0aGUgZmllbGQgdGhhdCBpcyBkZWxldGVkIGlzIGEgc3RydWN0LgorICBBID0gI3Rlc3Qye29uZSA9IDEsIHR3byA9ICN0ZXN0MntvbmUgPSAxMCwgdGhyZWUgPSAzMH0sIHRocmVlID0gM30sCisgIEIgPSAjdGVzdDJ7b25lID0gMSwgdHdvID0gI3Rlc3Qye29uZSA9IDEwLCB0d28gPSAjdGVzdDJ7b25lID0gMTAwfSwgdGhyZWUgPSAzMH0sIHRocmVlID0gM30sCisKKyAge29rLCBUcmFuc3BvcnR9ID0gdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQ6bmV3KCksCisgIHtvaywgUDB9ID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbDpuZXcoVHJhbnNwb3J0KSwKKworICB7UDEsIG9rfSA9IHRocmlmdF9wcm90b2NvbDp3cml0ZShQMCwge3tzdHJ1Y3QsIHt0aHJpZnRfb21pdF93aXRoX3R5cGVzLCBlbGVtZW50KDEsIEEpfX0sIEF9KSwKKyAge1AyLCB7b2ssIE8wfX0gPSB0aHJpZnRfcHJvdG9jb2w6cmVhZChQMSwge3N0cnVjdCwge3RocmlmdF9vbWl0X3dpdGhvdXRfdHlwZXMsIGVsZW1lbnQoMSwgQSl9fSksCisgID9hc3NlcnRFcXVhbChlbGVtZW50KDEsIEEpLCBlbGVtZW50KDEsIE8wKSksCisgID9hc3NlcnRFcXVhbChlbGVtZW50KDIsIEEpLCBlbGVtZW50KDIsIE8wKSksCisgID9hc3NlcnRFcXVhbChlbGVtZW50KDQsIEEpLCBlbGVtZW50KDMsIE8wKSksCisKKyAge1AzLCBva30gPSB0aHJpZnRfcHJvdG9jb2w6d3JpdGUoUDIsIHt7c3RydWN0LCB7dGhyaWZ0X29taXRfd2l0aF90eXBlcywgZWxlbWVudCgxLCBCKX19LCBCfSksCisgIHtfUDQsIHtvaywgTzF9fSA9IHRocmlmdF9wcm90b2NvbDpyZWFkKFAzLCB7c3RydWN0LCB7dGhyaWZ0X29taXRfd2l0aG91dF90eXBlcywgZWxlbWVudCgxLCBBKX19KSwKKyAgP2Fzc2VydEVxdWFsKGVsZW1lbnQoMSwgQSksIGVsZW1lbnQoMSwgTzEpKSwKKyAgP2Fzc2VydEVxdWFsKGVsZW1lbnQoMiwgQSksIGVsZW1lbnQoMiwgTzEpKSwKKyAgP2Fzc2VydEVxdWFsKGVsZW1lbnQoNCwgQSksIGVsZW1lbnQoMywgTzEpKSwKKworICBvay4KKworb21pdF9saXN0X3Rlc3QoKSAtPgorICAlJSBJbiB0aGlzIHRlc3QsIHRoZSBmaWVsZCB0aGF0IGlzIGRlbGV0ZWQgaXMgYSBsaXN0LgorICBBID0gI3Rlc3Qxe29uZSA9IDEsIHR3byA9IDIsIHRocmVlID0gM30sCisgIEIgPSAjdGVzdDN7b25lID0gMSwgdHdvID0gWyBBIF19LAorCisgIHtvaywgVHJhbnNwb3J0fSA9IHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0Om5ldygpLAorICB7b2ssIFAwfSA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2w6bmV3KFRyYW5zcG9ydCksCisKKyAge1AxLCBva30gPSB0aHJpZnRfcHJvdG9jb2w6d3JpdGUoUDAsIHt7c3RydWN0LCB7dGhyaWZ0X29taXRfd2l0aF90eXBlcywgZWxlbWVudCgxLCBCKX19LCBCfSksCisgIHtfUDIsIHtvaywgTzB9fSA9IHRocmlmdF9wcm90b2NvbDpyZWFkKFAxLCB7c3RydWN0LCB7dGhyaWZ0X29taXRfd2l0aG91dF90eXBlcywgZWxlbWVudCgxLCBCKX19KSwKKyAgP2Fzc2VydEVxdWFsKGVsZW1lbnQoMiwgQiksIGVsZW1lbnQoMiwgTzApKSwKKworICBvay4KKworb21pdF9tYXBfdGVzdCgpIC0+CisgICUlIEluIHRoaXMgdGVzdCwgdGhlIGZpZWxkIHRoYXQgaXMgZGVsZXRlZCBpcyBhIG1hcC4KKyAgQSA9ICN0ZXN0MXtvbmUgPSAxLCB0d28gPSAyLCB0aHJlZSA9IDN9LAorICBCID0gI3Rlc3Q0e29uZSA9IDEsIHR3byA9IGRpY3Q6ZnJvbV9saXN0KFsgezIsIEF9IF0pfSwKKworICB7b2ssIFRyYW5zcG9ydH0gPSB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydDpuZXcoKSwKKyAge29rLCBQMH0gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sOm5ldyhUcmFuc3BvcnQpLAorCisgIHtQMSwgb2t9ID0gdGhyaWZ0X3Byb3RvY29sOndyaXRlKFAwLCB7e3N0cnVjdCwge3RocmlmdF9vbWl0X3dpdGhfdHlwZXMsIGVsZW1lbnQoMSwgQil9fSwgQn0pLAorICB7X1AyLCB7b2ssIE8wfX0gPSB0aHJpZnRfcHJvdG9jb2w6cmVhZChQMSwge3N0cnVjdCwge3RocmlmdF9vbWl0X3dpdGhvdXRfdHlwZXMsIGVsZW1lbnQoMSwgQil9fSksCisgID9hc3NlcnRFcXVhbChlbGVtZW50KDIsIEIpLCBlbGVtZW50KDIsIE8wKSksCisKKyAgb2suCisKKy1lbmRpZi4gJSUgVEVTVApkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L3Rlc3RfcmVuZGVyZWRfZG91YmxlX2NvbnN0YW50cy5lcmwgYi9saWIvZXJsL3Rlc3QvdGVzdF9yZW5kZXJlZF9kb3VibGVfY29uc3RhbnRzLmVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2ZjZTgxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90ZXN0L3Rlc3RfcmVuZGVyZWRfZG91YmxlX2NvbnN0YW50cy5lcmwKQEAgLTAsMCArMSw2OCBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKy1tb2R1bGUodGVzdF9yZW5kZXJlZF9kb3VibGVfY29uc3RhbnRzKS4KKworLWlmZGVmKFRFU1QpLgorLWluY2x1ZGVfbGliKCJldW5pdC9pbmNsdWRlL2V1bml0LmhybCIpLgorCistaW5jbHVkZSgiZ2VuLWVybC9kb3VibGVfY29uc3RhbnRzX3Rlc3RfY29uc3RhbnRzLmhybCIpLgorCistZGVmaW5lKEVQU0lMT04sIDAuMDAwMDAwMSkuCisKK3JlbmRlcmVkX2RvdWJsZV9jb25zdGFudHNfdGVzdCgpIC0+CisgID9hc3NlcnQoYWJzKDEuMCAtID9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVF9URVNUKSA9PCA/RVBTSUxPTiksCisgID9hc3NlcnQoYWJzKC0xMDAuMCAtID9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVF9URVNUKSA9PCA/RVBTSUxPTiksCisgID9hc3NlcnQoYWJzKDkyMjMzNzIwMzY4NTQ3NzU4MDcuMCAtID9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5UX1RFU1QpID08ID9FUFNJTE9OKSwKKyAgP2Fzc2VydChhYnMoLTkyMjMzNzIwMzY4NTQ3NzU4MDcuMCAtID9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVF9URVNUKSA9PCA/RVBTSUxPTiksCisgID9hc3NlcnQoYWJzKDMuMTQxNTkyNjUzNTkgLSA/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTX1RFU1QpID08ID9FUFNJTE9OKSwKKyAgP2Fzc2VydChhYnMoMTAwMDAwMC4xIC0gP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkgPTwgP0VQU0lMT04pLAorICA/YXNzZXJ0KGFicygtMTAwMDAwMC4xIC0gP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkgPTwgP0VQU0lMT04pLAorICA/YXNzZXJ0KGFicygxLjdlKzMwOCAtID9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRV9URVNUKSA9PCA/RVBTSUxPTiksCisgID9hc3NlcnQoYWJzKDkyMjMzNzIwMzY4NTQ3NzU4MTYuNDMgLSA/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUKSA9PCA/RVBTSUxPTiksCisgID9hc3NlcnQoYWJzKC0xLjdlKzMwOCAtID9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRV9URVNUKSA9PCA/RVBTSUxPTiksCisgID9hc3NlcnQoYWJzKC05MjIzMzcyMDM2ODU0Nzc1ODE2LjQzIC0gP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpID08ID9FUFNJTE9OKSwKKyAgP2Fzc2VydChpc19mbG9hdCg/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlRfVEVTVCkpLAorICA/YXNzZXJ0KGlzX2Zsb2F0KD9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVF9URVNUKSksCisgID9hc3NlcnQoaXNfZmxvYXQoP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlRfVEVTVCkpLAorICA/YXNzZXJ0KGlzX2Zsb2F0KD9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVF9URVNUKSksCisgID9hc3NlcnQoaXNfZmxvYXQoP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMU19URVNUKSksCisgID9hc3NlcnQoaXNfZmxvYXQoP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkpLAorICA/YXNzZXJ0KGlzX2Zsb2F0KD9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpKSwKKyAgP2Fzc2VydChpc19mbG9hdCg/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEVfVEVTVCkpLAorICA/YXNzZXJ0KGlzX2Zsb2F0KD9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpKSwKKyAgP2Fzc2VydChpc19mbG9hdCg/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEVfVEVTVCkpLAorICA/YXNzZXJ0KGlzX2Zsb2F0KD9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUKSkuCisKK3JlbmRlcmVkX2RvdWJsZV9saXN0X3Rlc3QoKSAtPgorICA/YXNzZXJ0RXF1YWwoMTIsIGxlbmd0aCg/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9MSVNUX1RFU1QpKSwKKyAgP2Fzc2VydChhYnMoMS4wIC0gbGlzdHM6bnRoKDEsID9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0xJU1RfVEVTVCkpID08ID9FUFNJTE9OKSwKKyAgP2Fzc2VydChhYnMoLTEwMC4wIC0gbGlzdHM6bnRoKDIsID9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0xJU1RfVEVTVCkpID08ID9FUFNJTE9OKSwKKyAgP2Fzc2VydChhYnMoMTAwLjAgLSBsaXN0czpudGgoMywgP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfTElTVF9URVNUKSkgPTwgP0VQU0lMT04pLAorICA/YXNzZXJ0KGFicyg5MjIzMzcyMDM2ODU0Nzc1ODA3LjAgLSBsaXN0czpudGgoNCwgP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfTElTVF9URVNUKSkgPTwgP0VQU0lMT04pLAorICA/YXNzZXJ0KGFicygtOTIyMzM3MjAzNjg1NDc3NTgwNy4wIC0gbGlzdHM6bnRoKDUsID9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0xJU1RfVEVTVCkpID08ID9FUFNJTE9OKSwKKyAgP2Fzc2VydChhYnMoMy4xNDE1OTI2NTM1OSAtIGxpc3RzOm50aCg2LCA/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9MSVNUX1RFU1QpKSA9PCA/RVBTSUxPTiksCisgID9hc3NlcnQoYWJzKDEwMDAwMDAuMSAtIGxpc3RzOm50aCg3LCA/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9MSVNUX1RFU1QpKSA9PCA/RVBTSUxPTiksCisgID9hc3NlcnQoYWJzKC0xMDAwMDAwLjEgLSBsaXN0czpudGgoOCwgP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfTElTVF9URVNUKSkgPTwgP0VQU0lMT04pLAorICA/YXNzZXJ0KGFicygxLjdlKzMwOCAtIGxpc3RzOm50aCg5LCA/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9MSVNUX1RFU1QpKSA9PCA/RVBTSUxPTiksCisgID9hc3NlcnQoYWJzKC0xLjdlKzMwOCAtIGxpc3RzOm50aCgxMCwgP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfTElTVF9URVNUKSkgPTwgP0VQU0lMT04pLAorICA/YXNzZXJ0KGFicyg5MjIzMzcyMDM2ODU0Nzc1ODE2LjQzIC0gbGlzdHM6bnRoKDExLCA/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9MSVNUX1RFU1QpKSA9PCA/RVBTSUxPTiksCisgID9hc3NlcnQoYWJzKC05MjIzMzcyMDM2ODU0Nzc1ODE2LjQzIC0gbGlzdHM6bnRoKDEyLCA/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9MSVNUX1RFU1QpKSA9PCA/RVBTSUxPTikuCisKKy1lbmRpZi4gJSUgVEVTVApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9lcmwvdGVzdC90ZXN0X3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuZXJsIGIvbGliL2VybC90ZXN0L3Rlc3RfdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5lcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUxOWU4MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvdGVzdC90ZXN0X3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuZXJsCkBAIC0wLDAgKzEsMzU5IEBACislJQorJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCislJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorJSUKKyUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCislJQorJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyUlIHVuZGVyIHRoZSBMaWNlbnNlLgorJSUKKworLW1vZHVsZSh0ZXN0X3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQpLgorLWluY2x1ZGVfbGliKCJldW5pdC9pbmNsdWRlL2V1bml0LmhybCIpLgorCisKK25ldyhUcmFuc3BvcnQpIC0+IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnQ6bmV3KFRyYW5zcG9ydCkuCisKK25ld190ZXN0XygpIC0+CisgIFsKKyAgICB7Im5ldyBidWZmZXJlZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge29rLCB7dF90cmFuc3BvcnQsIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnQsIHt0X2J1ZmZlcmVkLAorICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIFtdfX0sCisgICAgICAgIFtdCisgICAgICB9fX0sCisgICAgICBuZXcoe3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCBbXX19KQorICAgICl9CisgIF0uCisKKworcmVhZChGcmFtZSwgQnl0ZXMpIC0+IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnQ6cmVhZChGcmFtZSwgQnl0ZXMpLgorCityZWFkX3Rlc3RfKCkgLT4KKyAgWworICAgIHsicmVhZCB6ZXJvIGJ5dGVzIGZyb20gYW4gZW1wdHkgYnVmZmVyZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsKKyAgICAgICAge3RfYnVmZmVyZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAge29rLCA8PD4+fQorICAgICAgfSwKKyAgICAgIHJlYWQoCisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDAKKyAgICAgICkKKyAgICApfSwKKyAgICB7InJlYWQgMSBieXRlIGZyb20gYW4gZW1wdHkgYnVmZmVyZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtfLCB7b2ssIDw8Pj59fSwKKyAgICAgIHJlYWQoCisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDEKKyAgICAgICkKKyAgICApfSwKKyAgICB7InJlYWQgemVybyBieXRlcyBmcm9tIG5vbmVtcHR5IGJ1ZmZlcmVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwKKyAgICAgICAgICAgIDw8ImhhbGxvIHdvcmxkIj4+CisgICAgICAgICAgfX0sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAge29rLCA8PD4+fQorICAgICAgfSwKKyAgICAgIHJlYWQoCisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwKKyAgICAgICAgICAgIDw8ImhhbGxvIHdvcmxkIj4+CisgICAgICAgICAgfX0sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgMAorICAgICAgKQorICAgICl9LAorICAgIHsicmVhZCAxIGJ5dGUgZnJvbSBub25lbXB0eSBidWZmZXJlZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8ImFsbG8gd29ybGQiPj59fSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICB7b2ssIDw8ImgiPj59CisgICAgICB9LAorICAgICAgcmVhZCgKKyAgICAgICAge3RfYnVmZmVyZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PCJoYWxsbyB3b3JsZCI+Pn19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDEKKyAgICAgICkKKyAgICApfSwKKyAgICB7InJlYWQgMSBieXRlIGZyb20gbm9uZW1wdHkgYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsKKyAgICAgICAge3RfYnVmZmVyZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PCJhbGxvIHdvcmxkIj4+fX0sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAge29rLCA8PCJoIj4+fQorICAgICAgfSwKKyAgICAgIHJlYWQoCisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDwiaGFsbG8gd29ybGQiPj59fSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICAxCisgICAgICApCisgICAgKX0sCisgICAgeyJyZWFkIGEgemlsbGlvbiBieXRlcyBmcm9tIG5vbmVtcHR5IGJ1ZmZlcmVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIHtvaywgPDwiaGFsbG8gd29ybGQiPj59CisgICAgICB9LAorICAgICAgcmVhZCgKKyAgICAgICAge3RfYnVmZmVyZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PCJoYWxsbyB3b3JsZCI+Pn19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDY1NTM2CisgICAgICApCisgICAgKX0KKyAgXS4KKworCityZWFkX2V4YWN0KEZyYW1lLCBCeXRlcykgLT4gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydDpyZWFkX2V4YWN0KEZyYW1lLCBCeXRlcykuCisKK3JlYWRfZXhhY3RfdGVzdF8oKSAtPgorICBbCisgICAgeyJyZWFkIGV4YWN0bHkgemVybyBieXRlcyBmcm9tIGFuIGVtcHR5IGJ1ZmZlcmVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIHtvaywgPDw+Pn0KKyAgICAgIH0sCisgICAgICByZWFkX2V4YWN0KAorICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICAwCisgICAgICApCisgICAgKX0sCisgICAgeyJyZWFkIGV4YWN0bHkgMSBieXRlIGZyb20gYW4gZW1wdHkgYnVmZmVyZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtfLCB7ZXJyb3IsIGVvZn19LAorICAgICAgcmVhZF9leGFjdCgKKyAgICAgICAge3RfYnVmZmVyZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgMQorICAgICAgKQorICAgICl9LAorICAgIHsicmVhZCBleGFjdGx5IHplcm8gYnl0ZXMgZnJvbSBub25lbXB0eSBidWZmZXJlZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8ImhhbGxvIHdvcmxkIj4+fX0sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAge29rLCA8PD4+fQorICAgICAgfSwKKyAgICAgIHJlYWRfZXhhY3QoCisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDwiaGFsbG8gd29ybGQiPj59fSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICAwCisgICAgICApCisgICAgKX0sCisgICAgeyJyZWFkIGV4YWN0bHkgMSBieXRlIGZyb20gbm9uZW1wdHkgYnVmZmVyZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsKKyAgICAgICAge3RfYnVmZmVyZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PCJhbGxvIHdvcmxkIj4+fX0sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAge29rLCA8PCJoIj4+fQorICAgICAgfSwKKyAgICAgIHJlYWRfZXhhY3QoCisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwKKyAgICAgICAgICAgIDw8ImhhbGxvIHdvcmxkIj4+CisgICAgICAgICAgfX0sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgMQorICAgICAgKQorICAgICl9LAorICAgIHsicmVhZCBleGFjdGx5IDEgYnl0ZSBmcm9tIG5vbmVtcHR5IGJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDwiYWxsbyB3b3JsZCI+Pn19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIHtvaywgPDwiaCI+Pn0KKyAgICAgIH0sCisgICAgICByZWFkX2V4YWN0KAorICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8ImhhbGxvIHdvcmxkIj4+fX0sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgMQorICAgICAgKQorICAgICl9LAorICAgIHsicmVhZCBleGFjdGx5IGEgemlsbGlvbiBieXRlcyBmcm9tIG5vbmVtcHR5IGJ1ZmZlcmVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDwiaGFsbG8gd29ybGQiPj59fSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICB7ZXJyb3IsIGVvZn0KKyAgICAgIH0sCisgICAgICByZWFkX2V4YWN0KAorICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsCisgICAgICAgICAgICA8PCJoYWxsbyB3b3JsZCI+PgorICAgICAgICAgIH19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDY1NTM2CisgICAgICApCisgICAgKX0KKyAgXS4KKworCit3cml0ZShGcmFtZWQsIERhdGEpIC0+IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnQ6d3JpdGUoRnJhbWVkLCBEYXRhKS4KKword3JpdGVfdGVzdF8oKSAtPgorICBbCisgICAgeyJ3cml0ZSBlbXB0eSBsaXN0IHRvIGVtcHR5IGJ1ZmZlcmVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtbXSwgW11dCisgICAgICAgIH0sCisgICAgICAgIG9rCisgICAgICB9LAorICAgICAgd3JpdGUoCisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIFtdCisgICAgICApCisgICAgKX0sCisgICAgeyJ3cml0ZSBlbXB0eSBsaXN0IHRvIG5vbmVtcHR5IGJ1ZmZlcmVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtbImhhbGxvIHdvcmxkIl0sIFtdXQorICAgICAgICB9LAorICAgICAgICBvaworICAgICAgfSwKKyAgICAgIHdyaXRlKAorICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbImhhbGxvIHdvcmxkIl0KKyAgICAgICAgfSwKKyAgICAgICAgW10KKyAgICAgICkKKyAgICApfSwKKyAgICB7IndyaXRlIGVtcHR5IGJpbmFyeSB0byBlbXB0eSBidWZmZXJlZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbW10sIDw8Pj5dCisgICAgICAgIH0sCisgICAgICAgIG9rCisgICAgICB9LAorICAgICAgd3JpdGUoCisgICAgICAgIHt0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDw8Pj4KKyAgICAgICkKKyAgICApfSwKKyAgICB7IndyaXRlIGVtcHR5IGJpbmFyeSB0byBub25lbXB0eSBidWZmZXJlZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbWyJoYWxsbyB3b3JsZCJdLCA8PD4+XQorICAgICAgICB9LAorICAgICAgICBvaworICAgICAgfSwKKyAgICAgIHdyaXRlKAorICAgICAgICB7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbImhhbGxvIHdvcmxkIl0KKyAgICAgICAgfSwKKyAgICAgICAgPDw+PgorICAgICAgKQorICAgICl9CisgIF0uCisKKworZmx1c2goVHJhbnNwb3J0KSAtPiB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0OmZsdXNoKFRyYW5zcG9ydCkuCisKK2ZsdXNoX3Rlc3RfKCkgLT4KKyAgWworICAgIHsiZmx1c2ggZW1wdHkgYnVmZmVyZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHt7dF9idWZmZXJlZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICBvaworICAgICAgfSwKKyAgICAgIGZsdXNoKHt0X2J1ZmZlcmVkLAorICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgW10KKyAgICAgIH0pCisgICAgKX0sCisgICAgeyJmbHVzaCBub25lbXB0eSBidWZmZXJlZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge3t0X2J1ZmZlcmVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwKKyAgICAgICAgICAgIFs8PD4+LCA8PCJoYWxsbyB3b3JsZCI+Pl0KKyAgICAgICAgICB9fSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICBvaworICAgICAgfSwKKyAgICAgIGZsdXNoKHt0X2J1ZmZlcmVkLAorICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgPDwiaGFsbG8gd29ybGQiPj4KKyAgICAgIH0pCisgICAgKX0KKyAgXS4KKworCitjbG9zZShUcmFuc3BvcnQpIC0+IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnQ6Y2xvc2UoVHJhbnNwb3J0KS4KKworY2xvc2VfdGVzdF8oKSAtPgorICB7ImNsb3NlIGJ1ZmZlcmVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAge3t0X2J1ZmZlcmVkLAorICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgW10KKyAgICAgIH0sCisgICAgICBvaworICAgIH0sCisgICAgY2xvc2Uoe3RfYnVmZmVyZWQsCisgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgIFtdCisgICAgfSkKKyAgKX0uCisKZGlmZiAtLWdpdCBhL2xpYi9lcmwvdGVzdC90ZXN0X3RocmlmdF9jb21wYWN0X3Byb3RvY29sLmVybCBiL2xpYi9lcmwvdGVzdC90ZXN0X3RocmlmdF9jb21wYWN0X3Byb3RvY29sLmVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGE3OGM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90ZXN0L3Rlc3RfdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wuZXJsCkBAIC0wLDAgKzEsMjE5IEBACislJQorJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCislJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorJSUKKyUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCislJQorJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyUlIHVuZGVyIHRoZSBMaWNlbnNlLgorJSUKKworLW1vZHVsZSh0ZXN0X3RocmlmdF9jb21wYWN0X3Byb3RvY29sKS4KKy1pbmNsdWRlX2xpYigiZXVuaXQvaW5jbHVkZS9ldW5pdC5ocmwiKS4KKy1pbmNsdWRlKCJ0aHJpZnRfY29uc3RhbnRzLmhybCIpLgorLWluY2x1ZGUoInRocmlmdF9wcm90b2NvbC5ocmwiKS4KKworCituZXcoVHJhbnNwb3J0KSAtPiB0aHJpZnRfY29tcGFjdF9wcm90b2NvbDpuZXcoVHJhbnNwb3J0KS4KK25ldygpIC0+CisgIHtvaywgVHJhbnNwb3J0fSA9IHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0Om5ldygpLAorICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbDpuZXcoVHJhbnNwb3J0KS4KKworbmV3X3Rlc3QoKSAtPgorICBuZXcodGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQ6bmV3KCkpLgorCit3cml0ZShUaGlzLCBWYWx1ZSkgLT4gdGhyaWZ0X3Byb3RvY29sOndyaXRlKFRoaXMsIFZhbHVlKS4KK3JlYWQoVGhpcywgVHlwZSkgLT4gdGhyaWZ0X3Byb3RvY29sOnJlYWQoVGhpcywgVHlwZSkuCisKK3N0cihUaGlzMCwgVmFsdWUwKSAtPgorICB7VGhpczEsIG9rfSA9IHdyaXRlKFRoaXMwLCB7c3RyaW5nLCBWYWx1ZTB9KSwKKyAge1RoaXMyLCB7b2ssIFZhbHVlMX19ID0gcmVhZChUaGlzMSwgc3RyaW5nKSwKKyAgP2Fzc2VydEVxdWFsKFZhbHVlMCwgYmluYXJ5X3RvX2xpc3QoVmFsdWUxKSksCisgIHtUaGlzMiwgb2t9Lgorc3RyaW5nX3Rlc3QoKSAtPgorICB7b2ssIFRoaXMwfSA9IG5ldygpLAorICB7VGhpczEsIG9rfSA9IHN0cihUaGlzMCwgImFhYSIpLAorICB7VGhpczIsIG9rfSA9IHN0cihUaGlzMSwgIiIpLAorICB7VGhpczIsIG9rfS4KKworcm91bmRfdHJpcChUaGlzMCwgVHlwZSwgVmFsdWUwKSAtPgorICB7VGhpczEsIG9rfSA9IHdyaXRlKFRoaXMwLCB7VHlwZSwgVmFsdWUwfSksCisgIHtUaGlzMiwge29rLCBWYWx1ZTF9fSA9IHJlYWQoVGhpczEsIFR5cGUpLAorICA/YXNzZXJ0RXF1YWwoVmFsdWUwLCBWYWx1ZTEpLAorICB7VGhpczIsIG9rfS4KKworYm9vbF90ZXN0KCkgLT4KKyAge29rLCBUaGlzMH0gPSBuZXcoKSwKKyAge1RoaXMxLCBva30gPSByb3VuZF90cmlwKFRoaXMwLCBib29sLCB0cnVlKSwKKyAge1RoaXMyLCBva30gPSByb3VuZF90cmlwKFRoaXMxLCBib29sLCBmYWxzZSksCisgIHtUaGlzMiwgb2t9LgorCitieXRlKFRoaXMwLCBWYWx1ZTApIC0+IHJvdW5kX3RyaXAoVGhpczAsIGJ5dGUsIFZhbHVlMCkuCitieXRlX3Rlc3QoKSAtPgorICB7b2ssIFRoaXMwfSA9IG5ldygpLAorICB7VGhpczEsIG9rfSA9IGJ5dGUoVGhpczAsIDApLAorICB7VGhpczIsIG9rfSA9IGJ5dGUoVGhpczEsIDQyKSwKKyAge1RoaXMzLCBva30gPSBieXRlKFRoaXMyLCAtMSksCisgIHtUaGlzNCwgb2t9ID0gYnl0ZShUaGlzMywgLTEyOCksCisgIHtUaGlzNCwgb2t9LgorCitpMTYoVGhpczAsIFZhbHVlMCkgLT4gcm91bmRfdHJpcChUaGlzMCwgaTE2LCBWYWx1ZTApLgoraTE2X3Rlc3QoKSAtPgorICB7b2ssIFRoaXMwfSA9IG5ldygpLAorICB7VGhpczEsIG9rfSA9IGkxNihUaGlzMCwgMCksCisgIHtUaGlzMiwgb2t9ID0gaTE2KFRoaXMxLCA0MiksCisgIHtUaGlzMywgb2t9ID0gaTE2KFRoaXMyLCAzMDAwMCksCisgIHtUaGlzNCwgb2t9ID0gaTE2KFRoaXMzLCAtMSksCisgIHtUaGlzNSwgb2t9ID0gaTE2KFRoaXM0LCAtMTI4KSwKKyAge1RoaXM2LCBva30gPSBpMTYoVGhpczUsIC0zMDAwMCksCisgIHtUaGlzNiwgb2t9LgorCitpMzIoVGhpczAsIFZhbHVlMCkgLT4gcm91bmRfdHJpcChUaGlzMCwgaTMyLCBWYWx1ZTApLgoraTMyX3Rlc3QoKSAtPgorICB7b2ssIFRoaXMwfSA9IG5ldygpLAorICB7VGhpczEsIG9rfSA9IGkzMihUaGlzMCwgMCksCisgIHtUaGlzMiwgb2t9ID0gaTMyKFRoaXMxLCA0MiksCisgIHtUaGlzMywgb2t9ID0gaTMyKFRoaXMyLCAzMDAwMCksCisgIHtUaGlzNCwgb2t9ID0gaTMyKFRoaXMzLCAyMDAwMDAwMDAyKSwKKyAge1RoaXM1LCBva30gPSBpMzIoVGhpczQsIC0xKSwKKyAge1RoaXM2LCBva30gPSBpMzIoVGhpczUsIC0xMjgpLAorICB7VGhpczcsIG9rfSA9IGkzMihUaGlzNiwgLTMwMDAwKSwKKyAge1RoaXM4LCBva30gPSBpMzIoVGhpczcsIC0yMDAwMDAwMDAyKSwKKyAge1RoaXM4LCBva30uCisKK2k2NChUaGlzMCwgVmFsdWUwKSAtPiByb3VuZF90cmlwKFRoaXMwLCBpNjQsIFZhbHVlMCkuCitpNjRfdGVzdCgpIC0+CisgIHtvaywgVGhpczB9ID0gbmV3KCksCisgIHtUaGlzMSwgb2t9ID0gaTY0KFRoaXMwLCAwKSwKKyAge1RoaXMyLCBva30gPSBpNjQoVGhpczEsIDQyKSwKKyAge1RoaXMzLCBva30gPSBpNjQoVGhpczIsIDMwMDAwKSwKKyAge1RoaXM0LCBva30gPSBpNjQoVGhpczMsIDIwMDAwMDAwMDIpLAorICB7VGhpczUsIG9rfSA9IGk2NChUaGlzNCwgMTAwMDAwMDAwMDAwMDAwMDY0KSwKKyAge1RoaXM2LCBva30gPSBpNjQoVGhpczUsIC0xKSwKKyAge1RoaXM3LCBva30gPSBpNjQoVGhpczYsIC0xMjgpLAorICB7VGhpczgsIG9rfSA9IGk2NChUaGlzNywgLTMwMDAwKSwKKyAge1RoaXM5LCBva30gPSBpNjQoVGhpczgsIC0yMDAwMDAwMDAyKSwKKyAge1RoaXMxMCwgb2t9ID0gaTY0KFRoaXM5LCAtMTAwMDAwMDAwMDAwMDAwMDY0KSwKKyAge1RoaXMxMCwgb2t9LgorCitzdHJ1Y3RfdGVzdCgpIC0+CisgIHtvaywgUDB9ID0gbmV3KCksCisgIHtQMSwgb2t9ID0gd3JpdGUoUDAsICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lueyBuYW1lID0gIk1lc3NhZ2UxIiwgdHlwZSA9ID90VHlwZV9JOCwgc2VxaWQgPSAzfSksCisgIHtQMiwgb2t9ID0gd3JpdGUoUDEsICNwcm90b2NvbF9zdHJ1Y3RfYmVnaW57fSksCisgIHtQMywgb2t9ID0gd3JpdGUoUDIsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgbmFtZSA9ICJmaWVsZDEiLCB0eXBlID0gP3RUeXBlX0k4LCBpZCA9IDF9KSwKKyAge1A0LCBva30gPSB3cml0ZShQMywge2J5dGUsIDQyfSksCisgIHtQNSwgb2t9ID0gd3JpdGUoUDQsIGZpZWxkX2VuZCksCisgIHtQNiwgb2t9ID0gd3JpdGUoUDUsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgbmFtZSA9ICJmaWVsZDIiLCB0eXBlID0gP3RUeXBlX0k4LCBpZCA9IDE0fSksCisgIHtQNywgb2t9ID0gd3JpdGUoUDYsIHtieXRlLCAzfSksCisgIHtQOCwgb2t9ID0gd3JpdGUoUDcsIGZpZWxkX2VuZCksCisgIHtQOSwgb2t9ID0gd3JpdGUoUDgsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgbmFtZSA9ICJmaWVsZDMiLCB0eXBlID0gP3RUeXBlX0k4LCBpZCA9IDQyfSksCisgIHtQMTAsIG9rfSA9IHdyaXRlKFA5LCB7Ynl0ZSwgOH0pLAorICB7UDExLCBva30gPSB3cml0ZShQMTAsIGZpZWxkX2VuZCksCisgIHtQMTIsIG9rfSA9IHdyaXRlKFAxMSwgZmllbGRfc3RvcCksCisgIHtQMTMsIG9rfSA9IHdyaXRlKFAxMiwgc3RydWN0X2VuZCksCisgIHtQMTQsIG9rfSA9IHdyaXRlKFAxMywgbWVzc2FnZV9lbmQpLAorCisgIHtQMTUsICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lueyBuYW1lID0gIk1lc3NhZ2UxIiwgdHlwZSA9ID90VHlwZV9JOCwgc2VxaWQgPSAzfX0gPSByZWFkKFAxNCwgbWVzc2FnZV9iZWdpbiksCisgIHtQMTYsIG9rfSA9IHJlYWQoUDE1LCBzdHJ1Y3RfYmVnaW4pLAorICB7UDE3LCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IHR5cGUgPSA/dFR5cGVfSTgsIGlkID0gMSB9fSA9IHJlYWQoUDE2LCBmaWVsZF9iZWdpbiksCisgIHtQMTgsIHtvaywgNDJ9fSA9IHJlYWQoUDE3LCBieXRlKSwKKyAge1AxOSwgb2t9ID0gcmVhZChQMTgsIGZpZWxkX2VuZCksCisgIHtQMjAsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgdHlwZSA9ID90VHlwZV9JOCwgaWQgPSAxNCB9fSA9IHJlYWQoUDE5LCBmaWVsZF9iZWdpbiksCisgIHtQMjEsIHtvaywgM319ID0gcmVhZChQMjAsIGJ5dGUpLAorICB7UDIyLCBva30gPSByZWFkKFAyMSwgZmllbGRfZW5kKSwKKyAge1AyMywgI3Byb3RvY29sX2ZpZWxkX2JlZ2lueyB0eXBlID0gP3RUeXBlX0k4LCBpZCA9IDQyIH19ID0gcmVhZChQMjIsIGZpZWxkX2JlZ2luKSwKKyAge1AyNCwge29rLCA4fX0gPSByZWFkKFAyMywgYnl0ZSksCisgIHtQMjUsIG9rfSA9IHJlYWQoUDI0LCBmaWVsZF9lbmQpLAorICB7UDI2LCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IHR5cGUgPSA/dFR5cGVfU1RPUH19ID0gcmVhZChQMjUsIGZpZWxkX2JlZ2luKSwKKyAge1AyNywgb2t9ID0gcmVhZChQMjYsIHN0cnVjdF9lbmQpLAorICB7UDI4LCBva30gPSByZWFkKFAyNywgbWVzc2FnZV9lbmQpLAorICB7UDI4LCBva30uCisKK2Jvb2xfZmllbGRfdGVzdCgpIC0+CisgIHtvaywgUDB9ID0gbmV3KCksCisgIHtQMSwgb2t9ID0gd3JpdGUoUDAsICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lueyBuYW1lID0gIk1lc3NhZ2UxIiwgdHlwZSA9ID90VHlwZV9JOCwgc2VxaWQgPSAzfSksCisgIHtQMiwgb2t9ID0gd3JpdGUoUDEsICNwcm90b2NvbF9zdHJ1Y3RfYmVnaW57fSksCisgIHtQMywgb2t9ID0gd3JpdGUoUDIsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgbmFtZSA9ICJmaWVsZDEiLCB0eXBlID0gP3RUeXBlX0JPT0wsIGlkID0gMX0pLAorICB7UDQsIG9rfSA9IHdyaXRlKFAzLCB7Ym9vbCwgdHJ1ZX0pLAorICB7UDUsIG9rfSA9IHdyaXRlKFA0LCBmaWVsZF9lbmQpLAorICB7UDYsIG9rfSA9IHdyaXRlKFA1LCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IG5hbWUgPSAiZmllbGQyIiwgdHlwZSA9ID90VHlwZV9CT09MLCBpZCA9IDE0fSksCisgIHtQNywgb2t9ID0gd3JpdGUoUDYsIHtib29sLCBmYWxzZX0pLAorICB7UDgsIG9rfSA9IHdyaXRlKFA3LCBmaWVsZF9lbmQpLAorICB7UDksIG9rfSA9IHdyaXRlKFA4LCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IG5hbWUgPSAiZmllbGQzIiwgdHlwZSA9ID90VHlwZV9CT09MLCBpZCA9IDQyfSksCisgIHtQMTAsIG9rfSA9IHdyaXRlKFA5LCB7Ym9vbCwgdHJ1ZX0pLAorICB7UDExLCBva30gPSB3cml0ZShQMTAsIGZpZWxkX2VuZCksCisgIHtQMTIsIG9rfSA9IHdyaXRlKFAxMSwgZmllbGRfc3RvcCksCisgIHtQMTMsIG9rfSA9IHdyaXRlKFAxMiwgc3RydWN0X2VuZCksCisgIHtQMTQsIG9rfSA9IHdyaXRlKFAxMywgbWVzc2FnZV9lbmQpLAorCisgIHtQMTUsICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lueyBuYW1lID0gIk1lc3NhZ2UxIiwgdHlwZSA9ID90VHlwZV9JOCwgc2VxaWQgPSAzfX0gPSByZWFkKFAxNCwgbWVzc2FnZV9iZWdpbiksCisgIHtQMTYsIG9rfSA9IHJlYWQoUDE1LCBzdHJ1Y3RfYmVnaW4pLAorICB7UDE3LCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IHR5cGUgPSA/dFR5cGVfQk9PTCwgaWQgPSAxIH19ID0gcmVhZChQMTYsIGZpZWxkX2JlZ2luKSwKKyAge1AxOCwge29rLCB0cnVlfX0gPSByZWFkKFAxNywgYm9vbCksCisgIHtQMTksIG9rfSA9IHJlYWQoUDE4LCBmaWVsZF9lbmQpLAorICB7UDIwLCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IHR5cGUgPSA/dFR5cGVfQk9PTCwgaWQgPSAxNCB9fSA9IHJlYWQoUDE5LCBmaWVsZF9iZWdpbiksCisgIHtQMjEsIHtvaywgZmFsc2V9fSA9IHJlYWQoUDIwLCBib29sKSwKKyAge1AyMiwgb2t9ID0gcmVhZChQMjEsIGZpZWxkX2VuZCksCisgIHtQMjMsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgdHlwZSA9ID90VHlwZV9CT09MLCBpZCA9IDQyIH19ID0gcmVhZChQMjIsIGZpZWxkX2JlZ2luKSwKKyAge1AyNCwge29rLCB0cnVlfX0gPSByZWFkKFAyMywgYm9vbCksCisgIHtQMjUsIG9rfSA9IHJlYWQoUDI0LCBmaWVsZF9lbmQpLAorICB7UDI2LCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IHR5cGUgPSA/dFR5cGVfU1RPUH19ID0gcmVhZChQMjUsIGZpZWxkX2JlZ2luKSwKKyAge1AyNywgb2t9ID0gcmVhZChQMjYsIHN0cnVjdF9lbmQpLAorICB7UDI4LCBva30gPSByZWFkKFAyNywgbWVzc2FnZV9lbmQpLAorICB7UDI4LCBva30uCisKK25lc3RpbmdfdGVzdCgpIC0+CisgIHtvaywgUDB9ID0gbmV3KCksCisgIHtQMSwgb2t9ID0gd3JpdGUoUDAsICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lueyBuYW1lID0gIk1lc3NhZ2UxIiwgdHlwZSA9ID90VHlwZV9JOCwgc2VxaWQgPSAzfSksCisgIHtQMiwgb2t9ID0gd3JpdGUoUDEsICNwcm90b2NvbF9zdHJ1Y3RfYmVnaW57fSksCisgIHtQMywgb2t9ID0gd3JpdGUoUDIsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgbmFtZSA9ICJmaWVsZDEiLCB0eXBlID0gP3RUeXBlX0JPT0wsIGlkID0gMTR9KSwKKyAge1A0LCBva30gPSB3cml0ZShQMywge2Jvb2wsIHRydWV9KSwKKyAge1A1LCBva30gPSB3cml0ZShQNCwgZmllbGRfZW5kKSwKKworICB7UDYsIG9rfSA9IHdyaXRlKFA1LCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IG5hbWUgPSAiZmllbGQyIiwgdHlwZSA9ID90VHlwZV9TVFJVQ1QsIGlkID0gMjh9KSwKKyAge1A3LCBva30gPSB3cml0ZShQNiwgI3Byb3RvY29sX3N0cnVjdF9iZWdpbnt9KSwKKyAge1A4LCBva30gPSB3cml0ZShQNywgI3Byb3RvY29sX2ZpZWxkX2JlZ2lueyBuYW1lID0gImZpZWxkMl8xIiwgdHlwZSA9ID90VHlwZV9CT09MLCBpZCA9IDMwMDAwfSksCisgIHtQOSwgb2t9ID0gd3JpdGUoUDgsIHtib29sLCBmYWxzZX0pLAorICB7UDEwLCBva30gPSB3cml0ZShQOSwgZmllbGRfZW5kKSwKKyAge1AxMSwgb2t9ID0gd3JpdGUoUDEwLCBmaWVsZF9zdG9wKSwKKyAge1AxMiwgb2t9ID0gd3JpdGUoUDExLCBzdHJ1Y3RfZW5kKSwKKyAge1AxMywgb2t9ID0gd3JpdGUoUDEyLCBmaWVsZF9lbmQpLAorCisgIHtQMTQsIG9rfSA9IHdyaXRlKFAxMywgI3Byb3RvY29sX2ZpZWxkX2JlZ2lueyBuYW1lID0gImZpZWxkMyIsIHR5cGUgPSA/dFR5cGVfQk9PTCwgaWQgPSA0Mn0pLAorICB7UDE1LCBva30gPSB3cml0ZShQMTQsIHtib29sLCB0cnVlfSksCisgIHtQMTYsIG9rfSA9IHdyaXRlKFAxNSwgZmllbGRfZW5kKSwKKyAge1AxNywgb2t9ID0gd3JpdGUoUDE2LCBmaWVsZF9zdG9wKSwKKyAge1AxOCwgb2t9ID0gd3JpdGUoUDE3LCBzdHJ1Y3RfZW5kKSwKKyAge1AxOSwgb2t9ID0gd3JpdGUoUDE4LCBtZXNzYWdlX2VuZCksCisKKyAge1AyMCwgI3Byb3RvY29sX21lc3NhZ2VfYmVnaW57IG5hbWUgPSAiTWVzc2FnZTEiLCB0eXBlID0gP3RUeXBlX0k4LCBzZXFpZCA9IDN9fSA9IHJlYWQoUDE5LCBtZXNzYWdlX2JlZ2luKSwKKyAge1AyMSwgb2t9ID0gcmVhZChQMjAsIHN0cnVjdF9iZWdpbiksCisgIHtQMjIsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgdHlwZSA9ID90VHlwZV9CT09MLCBpZCA9IDE0IH19ID0gcmVhZChQMjEsIGZpZWxkX2JlZ2luKSwKKyAge1AyMywge29rLCB0cnVlfX0gPSByZWFkKFAyMiwgYm9vbCksCisgIHtQMjQsIG9rfSA9IHJlYWQoUDIzLCBmaWVsZF9lbmQpLAorCisgIHtQMjUsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgdHlwZSA9ID90VHlwZV9TVFJVQ1QsIGlkID0gMjggfX0gPSByZWFkKFAyNCwgZmllbGRfYmVnaW4pLAorICB7UDI2LCBva30gPSByZWFkKFAyNSwgc3RydWN0X2JlZ2luKSwKKyAge1AyNywgI3Byb3RvY29sX2ZpZWxkX2JlZ2lueyB0eXBlID0gP3RUeXBlX0JPT0wsIGlkID0gMzAwMDAgfX0gPSByZWFkKFAyNiwgZmllbGRfYmVnaW4pLAorICB7UDI4LCB7b2ssIGZhbHNlfX0gPSByZWFkKFAyNywgYm9vbCksCisgIHtQMjksIG9rfSA9IHJlYWQoUDI4LCBmaWVsZF9lbmQpLAorICB7UDMwLCAjcHJvdG9jb2xfZmllbGRfYmVnaW57IHR5cGUgPSA/dFR5cGVfU1RPUCB9fSA9IHJlYWQoUDI5LCBmaWVsZF9iZWdpbiksCisgIHtQMzEsIG9rfSA9IHJlYWQoUDMwLCBzdHJ1Y3RfZW5kKSwKKyAge1AzMiwgb2t9ID0gcmVhZChQMzEsIGZpZWxkX2VuZCksCisKKyAge1AzMywgI3Byb3RvY29sX2ZpZWxkX2JlZ2lueyB0eXBlID0gP3RUeXBlX0JPT0wsIGlkID0gNDIgfX0gPSByZWFkKFAzMiwgZmllbGRfYmVnaW4pLAorICB7UDM0LCB7b2ssIHRydWV9fSA9IHJlYWQoUDMzLCBib29sKSwKKyAge1AzNSwgb2t9ID0gcmVhZChQMzQsIGZpZWxkX2VuZCksCisgIHtQMzYsICNwcm90b2NvbF9maWVsZF9iZWdpbnsgdHlwZSA9ID90VHlwZV9TVE9QIH19ID0gcmVhZChQMzUsIGZpZWxkX2JlZ2luKSwKKyAge1AzNywgb2t9ID0gcmVhZChQMzYsIHN0cnVjdF9lbmQpLAorICB7UDM4LCBva30gPSByZWFkKFAzNywgbWVzc2FnZV9lbmQpLAorICB7UDM4LCBva30uCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rlc3QvdGVzdF90aHJpZnRfZmlsZV90cmFuc3BvcnQuZXJsIGIvbGliL2VybC90ZXN0L3Rlc3RfdGhyaWZ0X2ZpbGVfdHJhbnNwb3J0LmVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTVjMWQxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90ZXN0L3Rlc3RfdGhyaWZ0X2ZpbGVfdHJhbnNwb3J0LmVybApAQCAtMCwwICsxLDIxMyBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKy1tb2R1bGUodGVzdF90aHJpZnRfZmlsZV90cmFuc3BvcnQpLgorLWluY2x1ZGVfbGliKCJldW5pdC9pbmNsdWRlL2V1bml0LmhybCIpLgorCisKK25ldyhGaWxlKSAtPiB0aHJpZnRfZmlsZV90cmFuc3BvcnQ6bmV3KEZpbGUpLgorbmV3KEZpbGUsIE9wdHMpIC0+IHRocmlmdF9maWxlX3RyYW5zcG9ydDpuZXcoRmlsZSwgT3B0cykuCisKK25ld190ZXN0XygpIC0+CisgIFsKKyAgICB7Im5ldyBmaWxlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtvaywge18sIHRocmlmdF9maWxlX3RyYW5zcG9ydCwge3RfZmlsZSwgYV9mYWtlX2ZpbGUsIHRydWUsIHdyaXRlfX19LAorICAgICAgbmV3KGFfZmFrZV9maWxlKQorICAgICl9LAorICAgIHsibmV3IGZpbGUgaW4gcmVhZCBtb2RlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtvaywge18sIHRocmlmdF9maWxlX3RyYW5zcG9ydCwge3RfZmlsZSwgYV9mYWtlX2ZpbGUsIHRydWUsIHJlYWR9fX0sCisgICAgICBuZXcoYV9mYWtlX2ZpbGUsIFt7bW9kZSwgcmVhZH1dKQorICAgICl9LAorICAgIHsibmV3IGZpbGUgaW4gd3JpdGUgbW9kZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7b2ssIHtfLCB0aHJpZnRfZmlsZV90cmFuc3BvcnQsIHt0X2ZpbGUsIGFfZmFrZV9maWxlLCB0cnVlLCB3cml0ZX19fSwKKyAgICAgIG5ldyhhX2Zha2VfZmlsZSwgW3ttb2RlLCB3cml0ZX1dKQorICAgICl9LAorICAgIHsibmV3IGZpbGUgaW4gc2hvdWxkX2Nsb3NlIHRydWUgbW9kZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7b2ssIHtfLCB0aHJpZnRfZmlsZV90cmFuc3BvcnQsIHt0X2ZpbGUsIGFfZmFrZV9maWxlLCB0cnVlLCB3cml0ZX19fSwKKyAgICAgIG5ldyhhX2Zha2VfZmlsZSwgW3tzaG91bGRfY2xvc2UsIHRydWV9XSkKKyAgICApfSwKKyAgICB7Im5ldyBmaWxlIGluIHNob3VsZF9jbG9zZSBmYWxzZSBtb2RlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtvaywge18sIHRocmlmdF9maWxlX3RyYW5zcG9ydCwge3RfZmlsZSwgYV9mYWtlX2ZpbGUsIGZhbHNlLCB3cml0ZX19fSwKKyAgICAgIG5ldyhhX2Zha2VfZmlsZSwgW3tzaG91bGRfY2xvc2UsIGZhbHNlfV0pCisgICAgKX0KKyAgXS4KKworCityZWFkKEZpbGUsIEJ5dGVzKSAtPiB0aHJpZnRfZmlsZV90cmFuc3BvcnQ6cmVhZChGaWxlLCBCeXRlcykuCisKK3JlYWRfdGVzdF8oKSAtPgorICB7c2V0dXAsCisgICAgZnVuKCkgLT4KKyAgICAgIG1lY2s6bmV3KGZpbGUsIFt1bnN0aWNrLCBwYXNzdGhyb3VnaF0pLAorICAgICAgbWVjazpleHBlY3QoZmlsZSwgcmVhZCwgZnVuKEJpbiwgTikgLT4KKyAgICAgICAge1Jlc3VsdCwgX30gPSBzcGxpdF9iaW5hcnkoQmluLCBtaW4oaW9saXN0X3NpemUoQmluKSwgTikpLAorICAgICAgICB7b2ssIFJlc3VsdH0KKyAgICAgIGVuZCkKKyAgICBlbmQsCisgICAgZnVuKF8pIC0+IG1lY2s6dW5sb2FkKGZpbGUpIGVuZCwKKyAgICBbCisgICAgICB7InJlYWQgemVybyBieXRlcyBmcm9tIGVtcHR5IGZpbGUiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7Xywge29rLCA8PD4+fX0sCisgICAgICAgIHJlYWQoe3RfZmlsZSwgPDw+PiwgdHJ1ZSwgcmVhZH0sIDApCisgICAgICApfSwKKyAgICAgIHsicmVhZCAxIGJ5dGUgZnJvbSBlbXB0eSBmaWxlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge18sIHtvaywgPDw+Pn19LAorICAgICAgICByZWFkKHt0X2ZpbGUsIDw8Pj4sIHRydWUsIHJlYWR9LCAxKQorICAgICAgKX0sCisgICAgICB7InJlYWQgemVybyBieXRlcyBmcm9tIG5vbmVtcHR5IGZpbGUiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7Xywge29rLCA8PD4+fX0sCisgICAgICAgIHJlYWQoe3RfZmlsZSwgPDwiaGFsbG8gd29ybGQiPj4sIHRydWUsIHJlYWR9LCAwKQorICAgICAgKX0sCisgICAgICB7InJlYWQgMSBieXRlIGZyb20gbm9uZW1wdHkgZmlsZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHtfLCB7b2ssIDw8ImgiPj59fSwKKyAgICAgICAgcmVhZCh7dF9maWxlLCA8PCJoYWxsbyB3b3JsZCI+PiwgdHJ1ZSwgcmVhZH0sIDEpCisgICAgICApfSwKKyAgICAgIHsicmVhZCBhIHppbGxpb24gYnl0ZXMgZnJvbSBub25lbXB0eSBmaWxlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge18sIHtvaywgPDwiaGFsbG8gd29ybGQiPj59fSwKKyAgICAgICAgcmVhZCh7dF9maWxlLCA8PCJoYWxsbyB3b3JsZCI+PiwgdHJ1ZSwgcmVhZH0sIDY1NTM2KQorICAgICAgKX0sCisgICAgICB7InJlYWQgMCBieXRlIGZyb20gZmlsZSBpbiB3cml0ZSBtb2RlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge18sIHtlcnJvciwgd3JpdGVfbW9kZX19LAorICAgICAgICByZWFkKHt0X2ZpbGUsIDw8Pj4sIHRydWUsIHdyaXRlfSwgMCkKKyAgICAgICl9LAorICAgICAgeyJyZWFkIDEgYnl0ZSBmcm9tIGZpbGUgaW4gd3JpdGUgbW9kZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHtfLCB7ZXJyb3IsIHdyaXRlX21vZGV9fSwKKyAgICAgICAgcmVhZCh7dF9maWxlLCA8PD4+LCB0cnVlLCB3cml0ZX0sIDEpCisgICAgICApfQorICAgIF0KKyAgfS4KKworCityZWFkX2V4YWN0KEZpbGUsIEJ5dGVzKSAtPiB0aHJpZnRfZmlsZV90cmFuc3BvcnQ6cmVhZF9leGFjdChGaWxlLCBCeXRlcykuCisKK3JlYWRfZXhhY3RfdGVzdF8oKSAtPgorICB7c2V0dXAsCisgICAgZnVuKCkgLT4KKyAgICAgIG1lY2s6bmV3KGZpbGUsIFt1bnN0aWNrLCBwYXNzdGhyb3VnaF0pLAorICAgICAgbWVjazpleHBlY3QoZmlsZSwgcmVhZCwgZnVuKEJpbiwgTikgLT4KKyAgICAgICAge1Jlc3VsdCwgX30gPSBzcGxpdF9iaW5hcnkoQmluLCBtaW4oaW9saXN0X3NpemUoQmluKSwgTikpLAorICAgICAgICB7b2ssIFJlc3VsdH0KKyAgICAgIGVuZCkKKyAgICBlbmQsCisgICAgZnVuKF8pIC0+IG1lY2s6dW5sb2FkKGZpbGUpIGVuZCwKKyAgICBbCisgICAgICB7InJlYWQgZXhhY3RseSB6ZXJvIGJ5dGVzIGZyb20gZW1wdHkgZmlsZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHtfLCB7b2ssIDw8Pj59fSwKKyAgICAgICAgcmVhZF9leGFjdCh7dF9maWxlLCA8PD4+LCB0cnVlLCByZWFkfSwgMCkKKyAgICAgICl9LAorICAgICAgeyJyZWFkIGV4YWN0bHkgMSBieXRlIGZyb20gZW1wdHkgZmlsZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHtfLCB7ZXJyb3IsIGVvZn19LAorICAgICAgICByZWFkX2V4YWN0KHt0X2ZpbGUsIDw8Pj4sIHRydWUsIHJlYWR9LCAxKQorICAgICAgKX0sCisgICAgICB7InJlYWQgZXhhY3RseSB6ZXJvIGJ5dGVzIGZyb20gbm9uZW1wdHkgZmlsZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHtfLCB7b2ssIDw8Pj59fSwKKyAgICAgICAgcmVhZF9leGFjdCh7dF9maWxlLCA8PCJoYWxsbyB3b3JsZCI+PiwgdHJ1ZSwgcmVhZH0sIDApCisgICAgICApfSwKKyAgICAgIHsicmVhZCBleGFjdGx5IDEgYnl0ZSBmcm9tIG5vbmVtcHR5IGZpbGUiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7Xywge29rLCA8PCJoIj4+fX0sCisgICAgICAgIHJlYWRfZXhhY3Qoe3RfZmlsZSwgPDwiaGFsbG8gd29ybGQiPj4sIHRydWUsIHJlYWR9LCAxKQorICAgICAgKX0sCisgICAgICB7InJlYWQgZXhhY3RseSBhIHppbGxpb24gYnl0ZXMgZnJvbSBub25lbXB0eSBmaWxlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge18sIHtlcnJvciwgZW9mfX0sCisgICAgICAgIHJlYWRfZXhhY3Qoe3RfZmlsZSwgPDwiaGFsbG8gd29ybGQiPj4sIHRydWUsIHJlYWR9LCA2NTUzNikKKyAgICAgICl9LAorICAgICAgeyJyZWFkIGV4YWN0bHkgMCBieXRlIGZyb20gZmlsZSBpbiB3cml0ZSBtb2RlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge18sIHtlcnJvciwgd3JpdGVfbW9kZX19LAorICAgICAgICByZWFkX2V4YWN0KHt0X2ZpbGUsIDw8Pj4sIHRydWUsIHdyaXRlfSwgMCkKKyAgICAgICl9LAorICAgICAgeyJyZWFkIGV4YWN0bHkgMSBieXRlIGZyb20gZmlsZSBpbiB3cml0ZSBtb2RlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge18sIHtlcnJvciwgd3JpdGVfbW9kZX19LAorICAgICAgICByZWFkX2V4YWN0KHt0X2ZpbGUsIDw8Pj4sIHRydWUsIHdyaXRlfSwgMSkKKyAgICAgICl9CisgICAgXQorICB9LgorCisKK3dyaXRlKEZpbGUsIERhdGEpIC0+IHRocmlmdF9maWxlX3RyYW5zcG9ydDp3cml0ZShGaWxlLCBEYXRhKS4KKword3JpdGVfdGVzdF8oKSAtPgorICB7c2V0dXAsCisgICAgZnVuKCkgLT4KKyAgICAgIG1lY2s6bmV3KGZpbGUsIFt1bnN0aWNrLCBwYXNzdGhyb3VnaF0pLAorICAgICAgbWVjazpleHBlY3QoZmlsZSwgd3JpdGUsIGZ1bihfLCBfKSAtPiBvayBlbmQpCisgICAgZW5kLAorICAgIGZ1bihfKSAtPiBtZWNrOnVubG9hZChmaWxlKSBlbmQsCisgICAgWworICAgICAgeyJ3cml0ZSBlbXB0eSBsaXN0IHRvIGZpbGUiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3RfZmlsZSwgYV9mYWtlX2ZpbGUsIHRydWUsIHdyaXRlfSwgb2t9LAorICAgICAgICB3cml0ZSh7dF9maWxlLCBhX2Zha2VfZmlsZSwgdHJ1ZSwgd3JpdGV9LCBbXSkKKyAgICAgICl9LAorICAgICAgeyJ3cml0ZSBlbXB0eSBiaW5hcnkgdG8gZmlsZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHt7dF9maWxlLCBhX2Zha2VfZmlsZSwgdHJ1ZSwgd3JpdGV9LCBva30sCisgICAgICAgIHdyaXRlKHt0X2ZpbGUsIGFfZmFrZV9maWxlLCB0cnVlLCB3cml0ZX0sIDw8Pj4pCisgICAgICApfSwKKyAgICAgIHsid3JpdGUgYSBsaXN0IHRvIGZpbGUiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3RfZmlsZSwgYV9mYWtlX2ZpbGUsIHRydWUsIHdyaXRlfSwgb2t9LAorICAgICAgICB3cml0ZSh7dF9maWxlLCBhX2Zha2VfZmlsZSwgdHJ1ZSwgd3JpdGV9LCAiaGFsbG8gd29ybGQiKQorICAgICAgKX0sCisgICAgICB7IndyaXRlIGEgYmluYXJ5IHRvIGZpbGUiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3RfZmlsZSwgYV9mYWtlX2ZpbGUsIHRydWUsIHdyaXRlfSwgb2t9LAorICAgICAgICB3cml0ZSh7dF9maWxlLCBhX2Zha2VfZmlsZSwgdHJ1ZSwgd3JpdGV9LCA8PCJoYWxsbyB3b3JsZCI+PikKKyAgICAgICl9LAorICAgICAgeyJ3cml0ZSBhIGJpbmFyeSB0byBmaWxlIGluIHJlYWQgbW9kZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHtfLCB7ZXJyb3IsIHJlYWRfbW9kZX19LAorICAgICAgICB3cml0ZSh7dF9maWxlLCBhX2Zha2VfZmlsZSwgdHJ1ZSwgcmVhZH0sIDw8ImhhbGxvIHdvcmxkIj4+KQorICAgICAgKX0sCisgICAgICB7IndyaXRlIGEgbGlzdCB0byBmaWxlIGluIHJlYWQgbW9kZSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHtfLCB7ZXJyb3IsIHJlYWRfbW9kZX19LAorICAgICAgICB3cml0ZSh7dF9maWxlLCBhX2Zha2VfZmlsZSwgdHJ1ZSwgcmVhZH0sICJoYWxsbyB3b3JsZCIpCisgICAgICApfQorICAgIF0KKyAgfS4KKworCitmbHVzaChUcmFuc3BvcnQpIC0+IHRocmlmdF9maWxlX3RyYW5zcG9ydDpmbHVzaChUcmFuc3BvcnQpLgorCitmbHVzaF90ZXN0XygpIC0+CisgIHtzZXR1cCwKKyAgICBmdW4oKSAtPgorICAgICAgbWVjazpuZXcoZmlsZSwgW3Vuc3RpY2ssIHBhc3N0aHJvdWdoXSksCisgICAgICBtZWNrOmV4cGVjdChmaWxlLCBzeW5jLCBmdW4oX0ZpbGUpIC0+IG9rIGVuZCkKKyAgICBlbmQsCisgICAgZnVuKF8pIC0+IG1lY2s6dW5sb2FkKGZpbGUpIGVuZCwKKyAgICBbCisgICAgICB7ImZsdXNoIGZpbGUiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3RfZmlsZSwgYV9mYWtlX2ZpbGUsIHRydWUsIHdyaXRlfSwgb2t9LAorICAgICAgICBmbHVzaCh7dF9maWxlLCBhX2Zha2VfZmlsZSwgdHJ1ZSwgd3JpdGV9KQorICAgICAgKX0KKyAgICBdCisgIH0uCisKKworY2xvc2UoVHJhbnNwb3J0KSAtPiB0aHJpZnRfZmlsZV90cmFuc3BvcnQ6Y2xvc2UoVHJhbnNwb3J0KS4KKworY2xvc2VfdGVzdF8oKSAtPgorICB7c2V0dXAsCisgICAgZnVuKCkgLT4KKyAgICAgIG1lY2s6bmV3KGZpbGUsIFt1bnN0aWNrLCBwYXNzdGhyb3VnaF0pLAorICAgICAgbWVjazpleHBlY3QoZmlsZSwgY2xvc2UsIGZ1bihfKSAtPiBvayBlbmQpCisgICAgZW5kLAorICAgIGZ1bihfKSAtPiBtZWNrOnVubG9hZChmaWxlKSBlbmQsCisgICAgWworICAgICAgeyJjbG9zZSBmaWxlIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge3t0X2ZpbGUsIGFfZmFrZV9maWxlLCB0cnVlLCB3cml0ZX0sIG9rfSwKKyAgICAgICAgY2xvc2Uoe3RfZmlsZSwgYV9mYWtlX2ZpbGUsIHRydWUsIHdyaXRlfSkKKyAgICAgICl9CisgICAgXQorICB9LgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9lcmwvdGVzdC90ZXN0X3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmVybCBiL2xpYi9lcmwvdGVzdC90ZXN0X3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTUzOGE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90ZXN0L3Rlc3RfdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuZXJsCkBAIC0wLDAgKzEsNDA0IEBACislJQorJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCislJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorJSUKKyUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCislJQorJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyUlIHVuZGVyIHRoZSBMaWNlbnNlLgorJSUKKworLW1vZHVsZSh0ZXN0X3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0KS4KKy1pbmNsdWRlX2xpYigiZXVuaXQvaW5jbHVkZS9ldW5pdC5ocmwiKS4KKworCituZXcoVHJhbnNwb3J0KSAtPiB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydDpuZXcoVHJhbnNwb3J0KS4KKworbmV3X3Rlc3RfKCkgLT4KKyAgWworICAgIHsibmV3IGZyYW1lZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge29rLCB7dF90cmFuc3BvcnQsIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0LCB7dF9mcmFtZWQsCisgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgW119fSwKKyAgICAgICAgW10sCisgICAgICAgIFtdCisgICAgICB9fX0sCisgICAgICBuZXcoe3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCBbXX19KQorICAgICl9CisgIF0uCisKKworcmVhZChGcmFtZSwgQnl0ZXMpIC0+IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0OnJlYWQoRnJhbWUsIEJ5dGVzKS4KKworcmVhZF90ZXN0XygpIC0+CisgIFsKKyAgICB7InJlYWQgemVybyBieXRlcyBmcm9tIGFuIGVtcHR5IGZyYW1lZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW10sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAge29rLCA8PD4+fQorICAgICAgfSwKKyAgICAgIHJlYWQoCisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbXSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICAwCisgICAgICApCisgICAgKX0sCisgICAgeyJyZWFkIDEgYnl0ZSBmcm9tIGFuIGVtcHR5IGZyYW1lZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge18sIHtlcnJvciwgZW9mfX0sCisgICAgICByZWFkKAorICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW10sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgMQorICAgICAgKQorICAgICl9LAorICAgIHsicmVhZCB6ZXJvIGJ5dGVzIGZyb20gbm9uZW1wdHkgZnJhbWVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsCisgICAgICAgICAgICA8PDAsIDAsIDAsIDExLCAiaGFsbG8gd29ybGQiPj4KKyAgICAgICAgICB9fSwKKyAgICAgICAgICBbXSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICB7b2ssIDw8Pj59CisgICAgICB9LAorICAgICAgcmVhZCgKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwKKyAgICAgICAgICAgIDw8MCwgMCwgMCwgMTEsICJoYWxsbyB3b3JsZCI+PgorICAgICAgICAgIH19LAorICAgICAgICAgIFtdLAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDAKKyAgICAgICkKKyAgICApfSwKKyAgICB7InJlYWQgMSBieXRlIGZyb20gbm9uZW1wdHkgZnJhbWVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICA8PCJhbGxvIHdvcmxkIj4+LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIHtvaywgPDwiaCI+Pn0KKyAgICAgIH0sCisgICAgICByZWFkKAorICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLAorICAgICAgICAgICAgPDwwLCAwLCAwLCAxMSwgImhhbGxvIHdvcmxkIj4+CisgICAgICAgICAgfX0sCisgICAgICAgICAgW10sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgMQorICAgICAgKQorICAgICl9LAorICAgIHsicmVhZCAxIGJ5dGUgZnJvbSBub25lbXB0eSBidWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgPDwiYWxsbyB3b3JsZCI+PiwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICB7b2ssIDw8ImgiPj59CisgICAgICB9LAorICAgICAgcmVhZCgKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIDw8ImhhbGxvIHdvcmxkIj4+LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDEKKyAgICAgICkKKyAgICApfSwKKyAgICB7InJlYWQgYSB6aWxsaW9uIGJ5dGVzIGZyb20gbm9uZW1wdHkgZnJhbWVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICA8PD4+LAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIHtvaywgPDwiaGFsbG8gd29ybGQiPj59CisgICAgICB9LAorICAgICAgcmVhZCgKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwKKyAgICAgICAgICAgIDw8MCwgMCwgMCwgMTEsICJoYWxsbyB3b3JsZCI+PgorICAgICAgICAgIH19LAorICAgICAgICAgIFtdLAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDY1NTM2CisgICAgICApCisgICAgKX0KKyAgXS4KKworCityZWFkX2V4YWN0KEZyYW1lLCBCeXRlcykgLT4gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQ6cmVhZF9leGFjdChGcmFtZSwgQnl0ZXMpLgorCityZWFkX2V4YWN0X3Rlc3RfKCkgLT4KKyAgWworICAgIHsicmVhZCBleGFjdGx5IHplcm8gYnl0ZXMgZnJvbSBhbiBlbXB0eSBmcmFtZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIDw8Pj4sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAge29rLCA8PD4+fQorICAgICAgfSwKKyAgICAgIHJlYWRfZXhhY3QoCisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbXSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICAwCisgICAgICApCisgICAgKX0sCisgICAgeyJyZWFkIGV4YWN0bHkgMSBieXRlIGZyb20gYW4gZW1wdHkgZnJhbWVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7Xywge2Vycm9yLCBlb2Z9fSwKKyAgICAgIHJlYWRfZXhhY3QoCisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbXSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICAxCisgICAgICApCisgICAgKX0sCisgICAgeyJyZWFkIGV4YWN0bHkgemVybyBieXRlcyBmcm9tIG5vbmVtcHR5IGZyYW1lZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLAorICAgICAgICAgICAgPDwwLCAwLCAwLCAxMSwgImhhbGxvIHdvcmxkIj4+CisgICAgICAgICAgfX0sCisgICAgICAgICAgPDw+PiwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICB7b2ssIDw8Pj59CisgICAgICB9LAorICAgICAgcmVhZF9leGFjdCgKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwKKyAgICAgICAgICAgIDw8MCwgMCwgMCwgMTEsICJoYWxsbyB3b3JsZCI+PgorICAgICAgICAgIH19LAorICAgICAgICAgIFtdLAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIDAKKyAgICAgICkKKyAgICApfSwKKyAgICB7InJlYWQgZXhhY3RseSAxIGJ5dGUgZnJvbSBub25lbXB0eSBmcmFtZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIDw8ImFsbG8gd29ybGQiPj4sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAge29rLCA8PCJoIj4+fQorICAgICAgfSwKKyAgICAgIHJlYWRfZXhhY3QoCisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsCisgICAgICAgICAgICA8PDAsIDAsIDAsIDExLCAiaGFsbG8gd29ybGQiPj4KKyAgICAgICAgICB9fSwKKyAgICAgICAgICBbXSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICAxCisgICAgICApCisgICAgKX0sCisgICAgeyJyZWFkIGV4YWN0bHkgMSBieXRlIGZyb20gbm9uZW1wdHkgYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIDw8ImFsbG8gd29ybGQiPj4sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAge29rLCA8PCJoIj4+fQorICAgICAgfSwKKyAgICAgIHJlYWRfZXhhY3QoCisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICA8PCJoYWxsbyB3b3JsZCI+PiwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICAxCisgICAgICApCisgICAgKX0sCisgICAgeyJyZWFkIGV4YWN0bHkgYSB6aWxsaW9uIGJ5dGVzIGZyb20gbm9uZW1wdHkgZnJhbWVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbW10sPDwiaGFsbG8gd29ybGQiPj5dLAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIHtlcnJvciwgZW9mfQorICAgICAgfSwKKyAgICAgIHJlYWRfZXhhY3QoCisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsCisgICAgICAgICAgICA8PDAsIDAsIDAsIDExLCAiaGFsbG8gd29ybGQiPj4KKyAgICAgICAgICB9fSwKKyAgICAgICAgICBbXSwKKyAgICAgICAgICBbXQorICAgICAgICB9LAorICAgICAgICA2NTUzNgorICAgICAgKQorICAgICl9CisgIF0uCisKKword3JpdGUoRnJhbWVkLCBEYXRhKSAtPiB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydDp3cml0ZShGcmFtZWQsIERhdGEpLgorCit3cml0ZV90ZXN0XygpIC0+CisgIFsKKyAgICB7IndyaXRlIGVtcHR5IGxpc3QgdG8gZW1wdHkgZnJhbWVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbXSwKKyAgICAgICAgICBbW10sIFtdXQorICAgICAgICB9LAorICAgICAgICBvaworICAgICAgfSwKKyAgICAgIHdyaXRlKAorICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW10sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgW10KKyAgICAgICkKKyAgICApfSwKKyAgICB7IndyaXRlIGVtcHR5IGxpc3QgdG8gbm9uZW1wdHkgZnJhbWVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7CisgICAgICAgIHt0X2ZyYW1lZCwKKyAgICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgICBbXSwKKyAgICAgICAgICBbWyJoYWxsbyB3b3JsZCJdLCBbXV0KKyAgICAgICAgfSwKKyAgICAgICAgb2sKKyAgICAgIH0sCisgICAgICB3cml0ZSgKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdLAorICAgICAgICAgIFsiaGFsbG8gd29ybGQiXQorICAgICAgICB9LAorICAgICAgICBbXQorICAgICAgKQorICAgICl9LAorICAgIHsid3JpdGUgZW1wdHkgYmluYXJ5IHRvIGVtcHR5IGZyYW1lZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW10sCisgICAgICAgICAgW1tdLCA8PD4+XQorICAgICAgICB9LAorICAgICAgICBvaworICAgICAgfSwKKyAgICAgIHdyaXRlKAorICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW10sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgPDw+PgorICAgICAgKQorICAgICl9LAorICAgIHsid3JpdGUgZW1wdHkgYmluYXJ5IHRvIG5vbmVtcHR5IGZyYW1lZCBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeworICAgICAgICB7dF9mcmFtZWQsCisgICAgICAgICAge3RfdHJhbnNwb3J0LCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCwge3RfbWVtYnVmZmVyLCA8PD4+fX0sCisgICAgICAgICAgW10sCisgICAgICAgICAgW1siaGFsbG8gd29ybGQiXSwgPDw+Pl0KKyAgICAgICAgfSwKKyAgICAgICAgb2sKKyAgICAgIH0sCisgICAgICB3cml0ZSgKKyAgICAgICAge3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdLAorICAgICAgICAgIFsiaGFsbG8gd29ybGQiXQorICAgICAgICB9LAorICAgICAgICA8PD4+CisgICAgICApCisgICAgKX0KKyAgXS4KKworCitmbHVzaChUcmFuc3BvcnQpIC0+IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0OmZsdXNoKFRyYW5zcG9ydCkuCisKK2ZsdXNoX3Rlc3RfKCkgLT4KKyAgWworICAgIHsiZmx1c2ggZW1wdHkgZnJhbWVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICAgIFtdLAorICAgICAgICAgIFtdCisgICAgICAgIH0sCisgICAgICAgIG9rCisgICAgICB9LAorICAgICAgZmx1c2goe3RfZnJhbWVkLAorICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgW10sCisgICAgICAgIFtdCisgICAgICB9KQorICAgICl9LAorICAgIHsiZmx1c2ggbm9uZW1wdHkgZnJhbWVkIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfZnJhbWVkLAorICAgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwKKyAgICAgICAgICAgIFs8PD4+LCBbPDwwLCAwLCAwLCAxMT4+LCA8PCJoYWxsbyB3b3JsZCI+Pl1dCisgICAgICAgICAgfX0sCisgICAgICAgICAgW10sCisgICAgICAgICAgW10KKyAgICAgICAgfSwKKyAgICAgICAgb2sKKyAgICAgIH0sCisgICAgICBmbHVzaCh7dF9mcmFtZWQsCisgICAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgICBbXSwKKyAgICAgICAgPDwiaGFsbG8gd29ybGQiPj4KKyAgICAgIH0pCisgICAgKX0KKyAgXS4KKworCitjbG9zZShUcmFuc3BvcnQpIC0+IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0OmNsb3NlKFRyYW5zcG9ydCkuCisKK2Nsb3NlX3Rlc3RfKCkgLT4KKyAgeyJjbG9zZSBmcmFtZWQgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICB7e3RfZnJhbWVkLAorICAgICAgICB7dF90cmFuc3BvcnQsIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LCB7dF9tZW1idWZmZXIsIDw8Pj59fSwKKyAgICAgICAgW10sCisgICAgICAgIFtdCisgICAgICB9LAorICAgICAgb2sKKyAgICB9LAorICAgIGNsb3NlKHt0X2ZyYW1lZCwKKyAgICAgIHt0X3RyYW5zcG9ydCwgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQsIHt0X21lbWJ1ZmZlciwgPDw+Pn19LAorICAgICAgW10sCisgICAgICBbXQorICAgIH0pCisgICl9LgorCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rlc3QvdGVzdF90aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydC5lcmwgYi9saWIvZXJsL3Rlc3QvdGVzdF90aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydC5lcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY4OWM3OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvdGVzdC90ZXN0X3RocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LmVybApAQCAtMCwwICsxLDE2NyBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKy1tb2R1bGUodGVzdF90aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCkuCistaW5jbHVkZV9saWIoImV1bml0L2luY2x1ZGUvZXVuaXQuaHJsIikuCisKKworbmV3KCkgLT4gdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQ6bmV3KCkuCituZXcoRGF0YSkgLT4gdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQ6bmV3KERhdGEpLgorCituZXdfdGVzdF8oKSAtPgorICBbCisgICAgeyJuZXcgZW1wdHkgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtvaywge18sIF8sIHt0X21lbWJ1ZmZlciwgW119fX0sCisgICAgICBuZXcoKQorICAgICl9LAorICAgIHsibmV3IG1lbWJ1ZmZlciB3aXRoIDw8Pj4iLCA/X2Fzc2VydE1hdGNoKAorICAgICAge29rLCB7XywgXywge3RfbWVtYnVmZmVyLCBbPDw+Pl19fX0sCisgICAgICBuZXcoPDw+PikKKyAgICApfSwKKyAgICB7Im5ldyBtZW1idWZmZXIgd2l0aCBbXSIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7b2ssIHtfLCBfLCB7dF9tZW1idWZmZXIsIFtdfX19LAorICAgICAgbmV3KFtdKQorICAgICl9LAorICAgIHsibmV3IG1lbWJ1ZmZlciB3aXRoIDw8XCJoYWxsbyB3b3JsZFwiPj4iLCA/X2Fzc2VydE1hdGNoKAorICAgICAge29rLCB7XywgXywge3RfbWVtYnVmZmVyLCBbPDwiaGFsbG8gd29ybGQiPj5dfX19LAorICAgICAgbmV3KDw8ImhhbGxvIHdvcmxkIj4+KQorICAgICl9LAorICAgIHsibmV3IG1lbWJ1ZmZlciB3aXRoIFwiaGFsbG8gd29ybGRcIiIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7b2ssIHtfLCBfLCB7dF9tZW1idWZmZXIsICJoYWxsbyB3b3JsZCJ9fX0sCisgICAgICBuZXcoImhhbGxvIHdvcmxkIikKKyAgICApfQorICBdLgorCisKK3JlYWQoTWVtYnVmZmVyLCBCeXRlcykgLT4gdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQ6cmVhZChNZW1idWZmZXIsIEJ5dGVzKS4KKworcmVhZF90ZXN0XygpIC0+CisgIFsKKyAgICB7InJlYWQgemVybyBieXRlcyBmcm9tIGFuIGVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7Xywge29rLCA8PD4+fX0sCisgICAgICByZWFkKHt0X21lbWJ1ZmZlciwgW119LCAwKQorICAgICl9LAorICAgIHsicmVhZCAxIGJ5dGUgZnJvbSBhbiBlbXB0eSBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge18sIHtvaywgPDw+Pn19LAorICAgICAgcmVhZCh7dF9tZW1idWZmZXIsIFtdfSwgMSkKKyAgICApfSwKKyAgICB7InJlYWQgemVybyBieXRlcyBmcm9tIG5vbmVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfbWVtYnVmZmVyLCA8PCJoYWxsbyB3b3JsZCI+Pn0sIHtvaywgPDw+Pn19LAorICAgICAgcmVhZCh7dF9tZW1idWZmZXIsIFtbImhhbGxvIiwgIiAiXSwgIndvcmxkIl19LCAwKQorICAgICl9LAorICAgIHsicmVhZCAxIGJ5dGUgZnJvbSBub25lbXB0eSBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge3t0X21lbWJ1ZmZlciwgPDwiYWxsbyB3b3JsZCI+Pn0sIHtvaywgPDwiaCI+Pn19LAorICAgICAgcmVhZCh7dF9tZW1idWZmZXIsIFtbImhhbGxvIiwgIiAiXSwgIndvcmxkIl19LCAxKQorICAgICl9LAorICAgIHsicmVhZCBhIHppbGxpb24gYnl0ZXMgZnJvbSBub25lbXB0eSBidWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge3t0X21lbWJ1ZmZlciwgPDw+Pn0sIHtvaywgPDwiaGFsbG8gd29ybGQiPj59fSwKKyAgICAgIHJlYWQoe3RfbWVtYnVmZmVyLCBbWyJoYWxsbyIsICIgIl0sICJ3b3JsZCJdfSwgNjU1MzYpCisgICAgKX0KKyAgXS4KKworCityZWFkX2V4YWN0KE1lbWJ1ZmZlciwgQnl0ZXMpIC0+CisgIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0OnJlYWRfZXhhY3QoTWVtYnVmZmVyLCBCeXRlcykuCisKK3JlYWRfZXhhY3RfdGVzdF8oKSAtPgorICBbCisgICAgeyJyZWFkIGV4YWN0bHkgemVybyBieXRlcyBmcm9tIGFuIGVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7Xywge29rLCA8PD4+fX0sCisgICAgICByZWFkX2V4YWN0KHt0X21lbWJ1ZmZlciwgW119LCAwKQorICAgICl9LAorICAgIHsicmVhZCBleGFjdGx5IDEgYnl0ZSBmcm9tIGFuIGVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7Xywge2Vycm9yLCBlb2Z9fSwKKyAgICAgIHJlYWRfZXhhY3Qoe3RfbWVtYnVmZmVyLCBbXX0sIDEpCisgICAgKX0sCisgICAgeyJyZWFkIGV4YWN0bHkgemVybyBieXRlcyBmcm9tIG5vbmVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfbWVtYnVmZmVyLCA8PCJoYWxsbyB3b3JsZCI+Pn0sIHtvaywgPDw+Pn19LAorICAgICAgcmVhZF9leGFjdCh7dF9tZW1idWZmZXIsIFtbImhhbGxvIiwgIiAiXSwgIndvcmxkIl19LCAwKQorICAgICl9LAorICAgIHsicmVhZCBleGFjdGx5IDEgYnl0ZSBmcm9tIG5vbmVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfbWVtYnVmZmVyLCA8PCJhbGxvIHdvcmxkIj4+fSwge29rLCA8PCJoIj4+fX0sCisgICAgICByZWFkX2V4YWN0KHt0X21lbWJ1ZmZlciwgW1siaGFsbG8iLCAiICJdLCAid29ybGQiXX0sIDEpCisgICAgKX0sCisgICAgeyJyZWFkIGV4YWN0bHkgYSB6aWxsaW9uIGJ5dGVzIGZyb20gbm9uZW1wdHkgYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHt7dF9tZW1idWZmZXIsIFtbImhhbGxvIiwgIiAiXSwgIndvcmxkIl19LCB7ZXJyb3IsIGVvZn19LAorICAgICAgcmVhZF9leGFjdCh7dF9tZW1idWZmZXIsIFtbImhhbGxvIiwgIiAiXSwgIndvcmxkIl19LCA2NTUzNikKKyAgICApfQorICBdLgorCisKK3dyaXRlKE1lbWJ1ZmZlciwgRGF0YSkgLT4gdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQ6d3JpdGUoTWVtYnVmZmVyLCBEYXRhKS4KKword3JpdGVfdGVzdF8oKSAtPgorICBbCisgICAgeyJ3cml0ZSBlbXB0eSBsaXN0IHRvIGVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfbWVtYnVmZmVyLCBbW10sIFtdXX0sIG9rfSwKKyAgICAgIHdyaXRlKHt0X21lbWJ1ZmZlciwgW119LCBbXSkKKyAgICApfSwKKyAgICB7IndyaXRlIGVtcHR5IGxpc3QgdG8gbm9uZW1wdHkgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHt7dF9tZW1idWZmZXIsIFsiaGFsbG8gd29ybGQiLCBbXV19LCBva30sCisgICAgICB3cml0ZSh7dF9tZW1idWZmZXIsICJoYWxsbyB3b3JsZCJ9LCBbXSkKKyAgICApfSwKKyAgICB7IndyaXRlIGVtcHR5IGJpbmFyeSB0byBlbXB0eSBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge3t0X21lbWJ1ZmZlciwgW1tdLCA8PD4+XX0sIG9rfSwKKyAgICAgIHdyaXRlKHt0X21lbWJ1ZmZlciwgW119LCA8PD4+KQorICAgICl9LAorICAgIHsid3JpdGUgZW1wdHkgYmluYXJ5IHRvIG5vbmVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfbWVtYnVmZmVyLCBbImhhbGxvIHdvcmxkIiwgPDw+Pl19LCBva30sCisgICAgICB3cml0ZSh7dF9tZW1idWZmZXIsICJoYWxsbyB3b3JsZCJ9LCA8PD4+KQorICAgICl9LAorICAgIHsid3JpdGUgYSBsaXN0IHRvIGVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfbWVtYnVmZmVyLCBbW10sICJoYWxsbyB3b3JsZCJdfSwgb2t9LAorICAgICAgd3JpdGUoe3RfbWVtYnVmZmVyLCBbXX0sICJoYWxsbyB3b3JsZCIpCisgICAgKX0sCisgICAgeyJ3cml0ZSBhIGxpc3QgdG8gbm9uZW1wdHkgbWVtYnVmZmVyIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHt7dF9tZW1idWZmZXIsIFtbImhhbGxvIiwgIiAiXSwgIndvcmxkIl19LCBva30sCisgICAgICB3cml0ZSh7dF9tZW1idWZmZXIsIFsiaGFsbG8iLCAiICJdfSwgIndvcmxkIikKKyAgICApfSwKKyAgICB7IndyaXRlIGEgYmluYXJ5IHRvIGVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfbWVtYnVmZmVyLCBbW10sIDw8ImhhbGxvIHdvcmxkIj4+XX0sIG9rfSwKKyAgICAgIHdyaXRlKHt0X21lbWJ1ZmZlciwgW119LCA8PCJoYWxsbyB3b3JsZCI+PikKKyAgICApfSwKKyAgICB7IndyaXRlIGEgYmluYXJ5IHRvIG5vbmVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfbWVtYnVmZmVyLCBbWyJoYWxsbyIsICIgIl0sIDw8IndvcmxkIj4+XX0sIG9rfSwKKyAgICAgIHdyaXRlKHt0X21lbWJ1ZmZlciwgWyJoYWxsbyIsICIgIl19LCA8PCJ3b3JsZCI+PikKKyAgICApfQorICBdLgorCisKK2ZsdXNoKFRyYW5zcG9ydCkgLT4gdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQ6Zmx1c2goVHJhbnNwb3J0KS4KKworZmx1c2hfdGVzdF8oKSAtPgorICBbCisgICAgeyJmbHVzaCBlbXB0eSBtZW1idWZmZXIiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge3t0X21lbWJ1ZmZlciwgW119LCBva30sCisgICAgICBmbHVzaCh7dF9tZW1idWZmZXIsIFtdfSkKKyAgICApfSwKKyAgICB7ImZsdXNoIG5vbmVtcHR5IG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7e3RfbWVtYnVmZmVyLCBbPDwiaGFsbG8gd29ybGQiPj5dfSwgb2t9LAorICAgICAgZmx1c2goe3RfbWVtYnVmZmVyLCBbPDwiaGFsbG8gd29ybGQiPj5dfSkKKyAgICApfQorICBdLgorCisKK2Nsb3NlKFRyYW5zcG9ydCkgLT4gdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQ6Y2xvc2UoVHJhbnNwb3J0KS4KKworY2xvc2VfdGVzdF8oKSAtPgorICB7ImNsb3NlIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAge3t0X21lbWJ1ZmZlciwgX30sIG9rfSwKKyAgICBjbG9zZSh7dF9tZW1idWZmZXIsIFtdfSkKKyAgKX0uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L3Rlc3RfdGhyaWZ0X3NlcnZlci5lcmwgYi9saWIvZXJsL3Rlc3QvdGVzdF90aHJpZnRfc2VydmVyLmVybApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY0M2I3Mi4uMDAwMDAwMAotLS0gYS9saWIvZXJsL3Rlc3QvdGVzdF90aHJpZnRfc2VydmVyLmVybAorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0lJQotJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0lJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotJSUKLSUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0lJQotJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSUlIHVuZGVyIHRoZSBMaWNlbnNlLgotJSUKLQotLW1vZHVsZSh0ZXN0X3RocmlmdF9zZXJ2ZXIpLgotCi0tZXhwb3J0KFtnby8wLCBnby8xLCBzdGFydF9saW5rLzIsIGhhbmRsZV9mdW5jdGlvbi8yXSkuCi0KLS1pbmNsdWRlKCJnZW4tZXJsL3RocmlmdF90ZXN0X3R5cGVzLmhybCIpLgotCi0tcmVjb3JkKG9wdGlvbnMsIHtwb3J0ID0gOTA5MCwKLSAgICAgICAgICAgICAgICAgIHNlcnZlcl9vcHRzID0gW119KS4KLQotcGFyc2VfYXJncyhBcmdzKSAtPiBwYXJzZV9hcmdzKEFyZ3MsICNvcHRpb25ze30pLgotcGFyc2VfYXJncyhbXSwgT3B0cykgLT4gT3B0czsKLXBhcnNlX2FyZ3MoW0hlYWQgfCBSZXN0XSwgT3B0cykgLT4KLSAgICBOZXdPcHRzID0KLSAgICAgICAgY2FzZSBjYXRjaCBsaXN0X3RvX2ludGVnZXIoSGVhZCkgb2YKLSAgICAgICAgICAgIFBvcnQgd2hlbiBpc19pbnRlZ2VyKFBvcnQpIC0+Ci0gICAgICAgICAgICAgICAgT3B0cyNvcHRpb25ze3BvcnQgPSBQb3J0fTsKLSAgICAgICAgICAgIF9FbHNlIC0+Ci0gICAgICAgICAgICAgICAgY2FzZSBIZWFkIG9mCi0gICAgICAgICAgICAgICAgICAgICJmcmFtZWQiIC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBPcHRzI29wdGlvbnN7c2VydmVyX29wdHMgPSBbe2ZyYW1lZCwgdHJ1ZX0gfCBPcHRzI29wdGlvbnMuc2VydmVyX29wdHNdfTsKLSAgICAgICAgICAgICAgICAgICAgIiIgLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIE9wdHM7Ci0gICAgICAgICAgICAgICAgICAgIF9FbHNlIC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcmxhbmc6ZXJyb3Ioe2JhZF9hcmcsIEhlYWR9KQotICAgICAgICAgICAgICAgIGVuZAotICAgICAgICBlbmQsCi0gICAgcGFyc2VfYXJncyhSZXN0LCBOZXdPcHRzKS4KLQotZ28oKSAtPiBnbyhbXSkuCi1nbyhBcmdzKSAtPgotICAgICNvcHRpb25ze3BvcnQgPSBQb3J0LCBzZXJ2ZXJfb3B0cyA9IFNlcnZlck9wdHN9ID0gcGFyc2VfYXJncyhBcmdzKSwKLSAgICBzcGF3bihmdW4oKSAtPiBzdGFydF9saW5rKFBvcnQsIFNlcnZlck9wdHMpLCByZWNlaXZlIGFmdGVyIGluZmluaXR5IC0+IG9rIGVuZCBlbmQpLgotCi1zdGFydF9saW5rKFBvcnQsIFNlcnZlck9wdHMpIC0+Ci0gICAgdGhyaWZ0X3NvY2tldF9zZXJ2ZXI6c3RhcnQoW3toYW5kbGVyLCA/TU9EVUxFfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NlcnZpY2UsIHRocmlmdF90ZXN0X3RocmlmdH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtwb3J0LCBQb3J0fV0gKysKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2ZXJPcHRzKS4KLQotCi1oYW5kbGVfZnVuY3Rpb24odGVzdFZvaWQsIHt9KSAtPgotICAgIGlvOmZvcm1hdCgidGVzdFZvaWR+biIpLAotICAgIG9rOwotCi1oYW5kbGVfZnVuY3Rpb24odGVzdFN0cmluZywge1N9KSB3aGVuIGlzX2JpbmFyeShTKSAtPgotICAgIGlvOmZvcm1hdCgidGVzdFN0cmluZzogfnB+biIsIFtTXSksCi0gICAge3JlcGx5LCBTfTsKLQotaGFuZGxlX2Z1bmN0aW9uKHRlc3RCeXRlLCB7STh9KSB3aGVuIGlzX2ludGVnZXIoSTgpIC0+Ci0gICAgaW86Zm9ybWF0KCJ0ZXN0Qnl0ZTogfnB+biIsIFtJOF0pLAotICAgIHtyZXBseSwgSTh9OwotCi1oYW5kbGVfZnVuY3Rpb24odGVzdEkzMiwge0kzMn0pIHdoZW4gaXNfaW50ZWdlcihJMzIpIC0+Ci0gICAgaW86Zm9ybWF0KCJ0ZXN0STMyOiB+cH5uIiwgW0kzMl0pLAotICAgIHtyZXBseSwgSTMyfTsKLQotaGFuZGxlX2Z1bmN0aW9uKHRlc3RJNjQsIHtJNjR9KSB3aGVuIGlzX2ludGVnZXIoSTY0KSAtPgotICAgIGlvOmZvcm1hdCgidGVzdEk2NDogfnB+biIsIFtJNjRdKSwKLSAgICB7cmVwbHksIEk2NH07Ci0KLWhhbmRsZV9mdW5jdGlvbih0ZXN0RG91YmxlLCB7RG91YmxlfSkgd2hlbiBpc19mbG9hdChEb3VibGUpIC0+Ci0gICAgaW86Zm9ybWF0KCJ0ZXN0RG91YmxlOiB+cH5uIiwgW0RvdWJsZV0pLAotICAgIHtyZXBseSwgRG91YmxlfTsKLQotaGFuZGxlX2Z1bmN0aW9uKHRlc3RCaW5hcnksIHtTfSkgd2hlbiBpc19iaW5hcnkoUykgLT4KLSAgICBpbzpmb3JtYXQoInRlc3RCaW5hcnk6IH5wfm4iLCBbU10pLAotICAgIHtyZXBseSwgU307Ci0KLWhhbmRsZV9mdW5jdGlvbih0ZXN0U3RydWN0LAotICAgICAgICAgICAgICAgIHtTdHJ1Y3QgPSAjJ1h0cnVjdCd7c3RyaW5nX3RoaW5nID0gU3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV90aGluZyA9IEJ5dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMzJfdGhpbmcgPSBJMzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpNjRfdGhpbmcgPSBJNjR9fSkKLXdoZW4gaXNfYmluYXJ5KFN0cmluZyksCi0gICAgIGlzX2ludGVnZXIoQnl0ZSksCi0gICAgIGlzX2ludGVnZXIoSTMyKSwKLSAgICAgaXNfaW50ZWdlcihJNjQpIC0+Ci0gICAgaW86Zm9ybWF0KCJ0ZXN0U3RydWN0OiB+cH5uIiwgW1N0cnVjdF0pLAotICAgIHtyZXBseSwgU3RydWN0fTsKLQotaGFuZGxlX2Z1bmN0aW9uKHRlc3ROZXN0LAotICAgICAgICAgICAgICAgIHtOZXN0fSkgd2hlbiBpc19yZWNvcmQoTmVzdCwgJ1h0cnVjdDInKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfcmVjb3JkKE5lc3QjJ1h0cnVjdDInLnN0cnVjdF90aGluZywgJ1h0cnVjdCcpIC0+Ci0gICAgaW86Zm9ybWF0KCJ0ZXN0TmVzdDogfnB+biIsIFtOZXN0XSksCi0gICAge3JlcGx5LCBOZXN0fTsKLQotaGFuZGxlX2Z1bmN0aW9uKHRlc3RNYXAsIHtNYXB9KSAtPgotICAgIGlvOmZvcm1hdCgidGVzdE1hcDogfnB+biIsIFtkaWN0OnRvX2xpc3QoTWFwKV0pLAotICAgIHtyZXBseSwgTWFwfTsKLQotaGFuZGxlX2Z1bmN0aW9uKHRlc3RTZXQsIHtTZXR9KSAtPgotICAgIHRydWUgPSBzZXRzOmlzX3NldChTZXQpLAotICAgIGlvOmZvcm1hdCgidGVzdFNldDogfnB+biIsIFtzZXRzOnRvX2xpc3QoU2V0KV0pLAotICAgIHtyZXBseSwgU2V0fTsKLQotaGFuZGxlX2Z1bmN0aW9uKHRlc3RMaXN0LCB7TGlzdH0pIHdoZW4gaXNfbGlzdChMaXN0KSAtPgotICAgIGlvOmZvcm1hdCgidGVzdExpc3Q6IH5wfm4iLCBbTGlzdF0pLAotICAgIHtyZXBseSwgTGlzdH07Ci0KLWhhbmRsZV9mdW5jdGlvbih0ZXN0RW51bSwge0VudW19KSB3aGVuIGlzX2ludGVnZXIoRW51bSkgLT4KLSAgICBpbzpmb3JtYXQoInRlc3RFbnVtOiB+cH5uIiwgW0VudW1dKSwKLSAgICB7cmVwbHksIEVudW19OwotCi1oYW5kbGVfZnVuY3Rpb24odGVzdFR5cGVkZWYsIHtVc2VySUR9KSB3aGVuIGlzX2ludGVnZXIoVXNlcklEKSAtPgotICAgIGlvOmZvcm1hdCgidGVzdFR5cGVkZWY6IH5wfm4iLCBbVXNlcklEXSksCi0gICAge3JlcGx5LCBVc2VySUR9OwotCi1oYW5kbGVfZnVuY3Rpb24odGVzdE1hcE1hcCwge0hlbGxvfSkgLT4KLSAgICBpbzpmb3JtYXQoInRlc3RNYXBNYXA6IH5wfm4iLCBbSGVsbG9dKSwKLQotICAgIFBvc0xpc3QgPSBbe0ksIEl9ICAgfHwgSSA8LSBsaXN0czpzZXEoMSwgNSldLAotICAgIE5lZ0xpc3QgPSBbey1JLCAtSX0gfHwgSSA8LSBsaXN0czpzZXEoMSwgNSldLAotCi0gICAgTWFwTWFwID0gZGljdDpmcm9tX2xpc3QoW3s0LCAgZGljdDpmcm9tX2xpc3QoUG9zTGlzdCl9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTQsIGRpY3Q6ZnJvbV9saXN0KE5lZ0xpc3QpfV0pLAotICAgIHtyZXBseSwgTWFwTWFwfTsKLQotaGFuZGxlX2Z1bmN0aW9uKHRlc3RJbnNhbml0eSwge0luc2FuaXR5fSkgd2hlbiBpc19yZWNvcmQoSW5zYW5pdHksICdJbnNhbml0eScpIC0+Ci0gICAgSGVsbG8gPSAjJ1h0cnVjdCd7c3RyaW5nX3RoaW5nID0gPDwiSGVsbG8yIj4+LAotICAgICAgICAgICAgICAgICAgICBieXRlX3RoaW5nID0gMiwKLSAgICAgICAgICAgICAgICAgICAgaTMyX3RoaW5nID0gMiwKLSAgICAgICAgICAgICAgICAgICAgaTY0X3RoaW5nID0gMn0sCi0KLSAgICBHb29kYnllID0gIydYdHJ1Y3Qne3N0cmluZ190aGluZyA9IDw8Ikdvb2RieWU0Ij4+LAotICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfdGhpbmcgPSA0LAotICAgICAgICAgICAgICAgICAgICAgIGkzMl90aGluZyA9IDQsCi0gICAgICAgICAgICAgICAgICAgICAgaTY0X3RoaW5nID0gNH0sCi0gICAgQ3JhenkgPSAjJ0luc2FuaXR5J3sKLSAgICAgIHVzZXJNYXAgPSBkaWN0OmZyb21fbGlzdChbez9USFJJRlRfVEVTVF9OVU1CRVJaX0VJR0hULCA4fV0pLAotICAgICAgeHRydWN0cyA9IFtHb29kYnllXQotICAgICAgfSwKLQotICAgIExvb25leSA9ICMnSW5zYW5pdHknewotICAgICAgdXNlck1hcCA9IGRpY3Q6ZnJvbV9saXN0KFt7P1RIUklGVF9URVNUX05VTUJFUlpfRklWRSwgNX1dKSwKLSAgICAgIHh0cnVjdHMgPSBbSGVsbG9dCi0gICAgICB9LAotCi0gICAgRmlyc3RNYXAgPSBkaWN0OmZyb21fbGlzdChbez9USFJJRlRfVEVTVF9OVU1CRVJaX1RXTywgQ3Jhenl9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs/VEhSSUZUX1RFU1RfTlVNQkVSWl9USFJFRSwgQ3Jhenl9XSksCi0KLSAgICBTZWNvbmRNYXAgPSBkaWN0OmZyb21fbGlzdChbez9USFJJRlRfVEVTVF9OVU1CRVJaX1NJWCwgTG9vbmV5fV0pLAotCi0gICAgSW5zYW5lID0gZGljdDpmcm9tX2xpc3QoW3sxLCBGaXJzdE1hcH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsyLCBTZWNvbmRNYXB9XSksCi0KLSAgICBpbzpmb3JtYXQoIlJldHVybiA9IH5wfm4iLCBbSW5zYW5lXSksCi0KLSAgICB7cmVwbHksIEluc2FuZX07Ci0KLWhhbmRsZV9mdW5jdGlvbih0ZXN0TXVsdGksIEFyZ3MgPSB7QXJnMCwgQXJnMSwgQXJnMiwgX0FyZzMsIEFyZzQsIEFyZzV9KQotICB3aGVuIGlzX2ludGVnZXIoQXJnMCksCi0gICAgICAgaXNfaW50ZWdlcihBcmcxKSwKLSAgICAgICBpc19pbnRlZ2VyKEFyZzIpLAotICAgICAgIGlzX2ludGVnZXIoQXJnNCksCi0gICAgICAgaXNfaW50ZWdlcihBcmc1KSAtPgotCi0gICAgaW86Zm9ybWF0KCJ0ZXN0TXVsdGkofnApfm4iLCBbQXJnc10pLAotICAgIHtyZXBseSwgIydYdHJ1Y3Qne3N0cmluZ190aGluZyA9IDw8IkhlbGxvMiI+PiwKLSAgICAgICAgICAgICAgICAgICAgYnl0ZV90aGluZyA9IEFyZzAsCi0gICAgICAgICAgICAgICAgICAgIGkzMl90aGluZyA9IEFyZzEsCi0gICAgICAgICAgICAgICAgICAgIGk2NF90aGluZyA9IEFyZzJ9fTsKLQotaGFuZGxlX2Z1bmN0aW9uKHRlc3RFeGNlcHRpb24sIHtTdHJpbmd9KSB3aGVuIGlzX2JpbmFyeShTdHJpbmcpIC0+Ci0gICAgaW86Zm9ybWF0KCJ0ZXN0RXhjZXB0aW9uKH5wKX5uIiwgW1N0cmluZ10pLAotICAgIGNhc2UgU3RyaW5nIG9mCi0gICAgICAgIDw8IlhjZXB0aW9uIj4+IC0+Ci0gICAgICAgICAgICB0aHJvdygjJ1hjZXB0aW9uJ3tlcnJvckNvZGUgPSAxMDAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBTdHJpbmd9KTsKLSAgICAgICAgXyAtPgotICAgICAgICAgICAgb2sKLSAgICBlbmQ7Ci0KLWhhbmRsZV9mdW5jdGlvbih0ZXN0TXVsdGlFeGNlcHRpb24sIHtBcmcwLCBBcmcxfSkgLT4KLSAgICBpbzpmb3JtYXQoInRlc3RNdWx0aUV4Y2VwdGlvbih+cCwgfnApfm4iLCBbQXJnMCwgQXJnMV0pLAotICAgIGNhc2UgQXJnMCBvZgotICAgICAgICA8PCJYY2VwdGlvbiI+PiAtPgotICAgICAgICAgICAgdGhyb3coIydYY2VwdGlvbid7ZXJyb3JDb2RlID0gMTAwMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IDw8IlRoaXMgaXMgYW4gWGNlcHRpb24iPj59KTsKLSAgICAgICAgPDwiWGNlcHRpb24yIj4+IC0+Ci0gICAgICAgICAgICB0aHJvdygjJ1hjZXB0aW9uMid7ZXJyb3JDb2RlID0gMjAwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdF90aGluZyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjJ1h0cnVjdCd7c3RyaW5nX3RoaW5nID0gPDwiVGhpcyBpcyBhbiBYY2VwdGlvbjIiPj59fSk7Ci0gICAgICAgIF8gLT4KLSAgICAgICAgICAgIHtyZXBseSwgIydYdHJ1Y3Qne3N0cmluZ190aGluZyA9IEFyZzF9fQotICAgIGVuZDsKLQotaGFuZGxlX2Z1bmN0aW9uKHRlc3RPbmV3YXksIHtTZWNvbmRzfSkgLT4KLSAgICB0aW1lcjpzbGVlcCgxMDAwICogU2Vjb25kcyksCi0gICAgb2suCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rlc3QvdGVzdF90aHJpZnRfc29ja2V0X3RyYW5zcG9ydC5lcmwgYi9saWIvZXJsL3Rlc3QvdGVzdF90aHJpZnRfc29ja2V0X3RyYW5zcG9ydC5lcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJjMGYyNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvdGVzdC90ZXN0X3RocmlmdF9zb2NrZXRfdHJhbnNwb3J0LmVybApAQCAtMCwwICsxLDE5OSBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKy1tb2R1bGUodGVzdF90aHJpZnRfc29ja2V0X3RyYW5zcG9ydCkuCistaW5jbHVkZV9saWIoImV1bml0L2luY2x1ZGUvZXVuaXQuaHJsIikuCisKKworbmV3KFNvY2tldCkgLT4gdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQ6bmV3KFNvY2tldCkuCituZXcoU29ja2V0LCBPcHRzKSAtPiB0aHJpZnRfc29ja2V0X3RyYW5zcG9ydDpuZXcoU29ja2V0LCBPcHRzKS4KKworbmV3X3Rlc3RfKCkgLT4KKyAgWworICAgIHsibmV3IHNvY2tldCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7b2ssIHtfLCB0aHJpZnRfc29ja2V0X3RyYW5zcG9ydCwge3Rfc29ja2V0LCBhX2Zha2Vfc29ja2V0LCA2MDAwMCwgW119fX0sCisgICAgICBuZXcoYV9mYWtlX3NvY2tldCkKKyAgICApfSwKKyAgICB7Im5ldyBzb2NrZXQgd2l0aCBubyBvcHRpb25zIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtvaywge18sIHRocmlmdF9zb2NrZXRfdHJhbnNwb3J0LCB7dF9zb2NrZXQsIGFfZmFrZV9zb2NrZXQsIDYwMDAwLCBbXX19fSwKKyAgICAgIG5ldyhhX2Zha2Vfc29ja2V0LCBbXSkKKyAgICApfSwKKyAgICB7Im5ldyBzb2NrZXQgd2l0aCBpbnRlZ2VyIHRpbWVvdXQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge29rLCB7XywgdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQsIHt0X3NvY2tldCwgYV9mYWtlX3NvY2tldCwgNTAwMCwgW119fX0sCisgICAgICBuZXcoYV9mYWtlX3NvY2tldCwgW3tyZWN2X3RpbWVvdXQsIDUwMDB9XSkKKyAgICApfSwKKyAgICB7Im5ldyBzb2NrZXQgd2l0aCBpbmZpbml0eSB0aW1lb3V0IiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtvaywge18sIHRocmlmdF9zb2NrZXRfdHJhbnNwb3J0LCB7dF9zb2NrZXQsIGFfZmFrZV9zb2NrZXQsIGluZmluaXR5LCBbXX19fSwKKyAgICAgIG5ldyhhX2Zha2Vfc29ja2V0LCBbe3JlY3ZfdGltZW91dCwgaW5maW5pdHl9XSkKKyAgICApfQorICBdLgorCisKK3JlYWQoU29ja2V0LCBCeXRlcykgLT4gdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQ6cmVhZChTb2NrZXQsIEJ5dGVzKS4KKworcmVhZF90ZXN0XygpIC0+CisgIHtzZXR1cCwKKyAgICBmdW4oKSAtPgorICAgICAgbWVjazpuZXcoZ2VuX3RjcCwgW3Vuc3RpY2ssIHBhc3N0aHJvdWdoXSksCisgICAgICBtZWNrOmV4cGVjdChnZW5fdGNwLCByZWN2LCBmdW4oQmluLCAwLCBfKSAtPiB7b2ssIEJpbn0gZW5kKQorICAgIGVuZCwKKyAgICBmdW4oXykgLT4gbWVjazp1bmxvYWQoZ2VuX3RjcCkgZW5kLAorICAgIFsKKyAgICAgIHsicmVhZCB6ZXJvIGJ5dGVzIGZyb20gZW1wdHkgc29ja2V0IiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge18sIHtvaywgPDw+Pn19LAorICAgICAgICByZWFkKHt0X3NvY2tldCwgPDw+PiwgNjAwMDAsIFtdfSwgMCkKKyAgICAgICl9LAorICAgICAgeyJyZWFkIDEgYnl0ZSBmcm9tIGVtcHR5IHNvY2tldCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHtfLCB7b2ssIDw8Pj59fSwKKyAgICAgICAgcmVhZCh7dF9zb2NrZXQsIDw8Pj4sIDYwMDAwLCBbXX0sIDEpCisgICAgICApfSwKKyAgICAgIHsicmVhZCB6ZXJvIGJ5dGVzIGZyb20gbm9uZW1wdHkgc29ja2V0IiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge3t0X3NvY2tldCwgXywgXywgX30sIHtvaywgPDw+Pn19LAorICAgICAgICByZWFkKHt0X3NvY2tldCwgPDwiaGFsbG8gd29ybGQiPj4sIDYwMDAwLCBbXX0sIDApCisgICAgICApfSwKKyAgICAgIHsicmVhZCAxIGJ5dGUgZnJvbSBub25lbXB0eSBzb2NrZXQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3Rfc29ja2V0LCBfLCBfLCA8PCJhbGxvIHdvcmxkIj4+fSwge29rLCA8PCJoIj4+fX0sCisgICAgICAgIHJlYWQoe3Rfc29ja2V0LCA8PCJoYWxsbyB3b3JsZCI+PiwgNjAwMDAsIFtdfSwgMSkKKyAgICAgICl9LAorICAgICAgeyJyZWFkIGEgemlsbGlvbiBieXRlcyBmcm9tIG5vbmVtcHR5IHNvY2tldCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHt7dF9zb2NrZXQsIF8sIF8sIDw8Pj59LCB7b2ssIDw8ImhhbGxvIHdvcmxkIj4+fX0sCisgICAgICAgIHJlYWQoe3Rfc29ja2V0LCA8PCJoYWxsbyB3b3JsZCI+PiwgNjAwMDAsIFtdfSwgNjU1MzYpCisgICAgICApfSwKKyAgICAgIHsicmVhZCAxIGJ5dGUgZnJvbSBwcmV2aW91c2x5IGJ1ZmZlcmVkIHNvY2tldCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHt7dF9zb2NrZXQsIF8sIF8sIDw8ImFsbG8iPj59LCB7b2ssIDw8ImgiPj59fSwKKyAgICAgICAgcmVhZCh7dF9zb2NrZXQsIDw8IiB3b3JsZCI+PiwgNjAwMDAsIDw8ImhhbGxvIj4+fSwgMSkKKyAgICAgICl9LAorICAgICAgeyJyZWFkIDYgYnl0ZSBmcm9tIHByZXZpb3VzbHkgYnVmZmVyZWQgc29ja2V0IiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge3t0X3NvY2tldCwgXywgXywgPDwid29ybGQiPj59LCB7b2ssIDw8ImhhbGxvICI+Pn19LAorICAgICAgICByZWFkKHt0X3NvY2tldCwgPDwiIHdvcmxkIj4+LCA2MDAwMCwgPDwiaGFsbG8iPj59LCA2KQorICAgICAgKX0sCisgICAgICB7InJlYWQgYSB6aWxsaW9uIGJ5dGVzIGZyb20gcHJldmlvdXNseSBidWZmZXJlZCBzb2NrZXQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3Rfc29ja2V0LCBfLCBfLCA8PD4+fSwge29rLCA8PCJoYWxsbyB3b3JsZCI+Pn19LAorICAgICAgICByZWFkKHt0X3NvY2tldCwgPDwiIHdvcmxkIj4+LCA2MDAwMCwgPDwiaGFsbG8iPj59LCA2NTUzNikKKyAgICAgICl9CisgICAgXQorICB9LgorCisKK3JlYWRfZXhhY3QoU29ja2V0LCBCeXRlcykgLT4gdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQ6cmVhZF9leGFjdChTb2NrZXQsIEJ5dGVzKS4KKworcmVhZF9leGFjdF90ZXN0XygpIC0+CisgIHtzZXR1cCwKKyAgICBmdW4oKSAtPgorICAgICAgbWVjazpuZXcoZ2VuX3RjcCwgW3Vuc3RpY2ssIHBhc3N0aHJvdWdoXSksCisgICAgICBtZWNrOmV4cGVjdChnZW5fdGNwLCByZWN2LCBmdW4oQmluLCBOLCBfKSAtPgorICAgICAgICBjYXNlIE4gb2YKKyAgICAgICAgICAwIC0+IHtvaywgQmlufTsKKyAgICAgICAgICAxIC0+IHtvaywgPDwiaCI+Pn07CisgICAgICAgICAgTiB3aGVuIE4gPiAyIC0+IHtlcnJvciwgdGltZW91dH0KKyAgICAgICAgZW5kCisgICAgICBlbmQpLAorICAgICAgbWVjazpleHBlY3QoZ2VuX3RjcCwgY2xvc2UsIGZ1bihfKSAtPiBvayBlbmQpCisgICAgZW5kLAorICAgIGZ1bihfKSAtPiBtZWNrOnVubG9hZChnZW5fdGNwKSBlbmQsCisgICAgWworICAgICAgeyJyZWFkX2V4YWN0IHplcm8gYnl0ZXMgZnJvbSBlbXB0eSBzb2NrZXQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7Xywge29rLCA8PD4+fX0sCisgICAgICAgIHJlYWRfZXhhY3Qoe3Rfc29ja2V0LCA8PD4+LCA2MDAwMCwgW119LCAwKQorICAgICAgKX0sCisgICAgICB7InJlYWRfZXhhY3QgemVybyBieXRlcyBmcm9tIG5vbmVtcHR5IHNvY2tldCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHt7dF9zb2NrZXQsIF8sIF8sIF99LCB7b2ssIDw8Pj59fSwKKyAgICAgICAgcmVhZF9leGFjdCh7dF9zb2NrZXQsIDw8ImhhbGxvIHdvcmxkIj4+LCA2MDAwMCwgW119LCAwKQorICAgICAgKX0sCisgICAgICB7InJlYWRfZXhhY3QgMSBieXRlIGZyb20gbm9uZW1wdHkgc29ja2V0IiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge3t0X3NvY2tldCwgXywgXywgW119LCB7b2ssIDw8ImgiPj59fSwKKyAgICAgICAgcmVhZF9leGFjdCh7dF9zb2NrZXQsIDw8ImhhbGxvIHdvcmxkIj4+LCA2MDAwMCwgW119LCAxKQorICAgICAgKX0sCisgICAgICB7InJlYWRfZXhhY3QgYSB6aWxsaW9uIGJ5dGVzIGZyb20gbm9uZW1wdHkgc29ja2V0IiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge3t0X3NvY2tldCwgXywgXywgW119LCB7ZXJyb3IsIHRpbWVvdXR9fSwKKyAgICAgICAgcmVhZF9leGFjdCh7dF9zb2NrZXQsIDw8ImhhbGxvIHdvcmxkIj4+LCA2MDAwMCwgW119LCA2NTUzNikKKyAgICAgICl9LAorICAgICAgeyJyZWFkX2V4YWN0IDEgYnl0ZSBmcm9tIHByZXZpb3VzbHkgYnVmZmVyZWQgc29ja2V0IiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge3t0X3NvY2tldCwgXywgXywgPDwiYWxsbyI+Pn0sIHtvaywgPDwiaCI+Pn19LAorICAgICAgICByZWFkX2V4YWN0KHt0X3NvY2tldCwgPDwiIHdvcmxkIj4+LCA2MDAwMCwgPDwiaGFsbG8iPj59LCAxKQorICAgICAgKX0sCisgICAgICB7InJlYWRfZXhhY3QgNiBieXRlIGZyb20gcHJldmlvdXNseSBidWZmZXJlZCBzb2NrZXQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgICB7e3Rfc29ja2V0LCBfLCBfLCBbXX0sIHtvaywgPDwibW9yZSBoIj4+fX0sCisgICAgICAgIHJlYWRfZXhhY3Qoe3Rfc29ja2V0LCA8PCJoYWxsbyI+PiwgNjAwMDAsIDw8Im1vcmUgIj4+fSwgNikKKyAgICAgICl9LAorICAgICAgeyJyZWFkX2V4YWN0IGEgemlsbGlvbiBieXRlcyBmcm9tIHByZXZpb3VzbHkgYnVmZmVyZWQgc29ja2V0IiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge3t0X3NvY2tldCwgXywgXywgPDwiaGFsbG8iPj59LCB7ZXJyb3IsIHRpbWVvdXR9fSwKKyAgICAgICAgcmVhZF9leGFjdCh7dF9zb2NrZXQsIDw8IiB3b3JsZCI+PiwgNjAwMDAsIDw8ImhhbGxvIj4+fSwgNjU1MzYpCisgICAgICApfQorICAgIF0KKyAgfS4KKworCit3cml0ZShTb2NrZXQsIERhdGEpIC0+IHRocmlmdF9zb2NrZXRfdHJhbnNwb3J0OndyaXRlKFNvY2tldCwgRGF0YSkuCisKK3dyaXRlX3Rlc3RfKCkgLT4KKyAge3NldHVwLAorICAgIGZ1bigpIC0+CisgICAgICBtZWNrOm5ldyhnZW5fdGNwLCBbdW5zdGljaywgcGFzc3Rocm91Z2hdKSwKKyAgICAgIG1lY2s6ZXhwZWN0KGdlbl90Y3AsIHNlbmQsIGZ1bihfLCBfKSAtPiBvayBlbmQpCisgICAgZW5kLAorICAgIGZ1bihfKSAtPiBtZWNrOnVubG9hZChnZW5fdGNwKSBlbmQsCisgICAgWworICAgICAgeyJ3cml0ZSBlbXB0eSBsaXN0IHRvIHNvY2tldCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHt7dF9zb2NrZXQsIGFfZmFrZV9zb2NrZXQsIDYwMDAwLCBbXX0sIG9rfSwKKyAgICAgICAgd3JpdGUoe3Rfc29ja2V0LCBhX2Zha2Vfc29ja2V0LCA2MDAwMCwgW119LCBbXSkKKyAgICAgICl9LAorICAgICAgeyJ3cml0ZSBlbXB0eSBiaW5hcnkgdG8gc29ja2V0IiwgP19hc3NlcnRNYXRjaCgKKyAgICAgICAge3t0X3NvY2tldCwgYV9mYWtlX3NvY2tldCwgNjAwMDAsIFtdfSwgb2t9LAorICAgICAgICB3cml0ZSh7dF9zb2NrZXQsIGFfZmFrZV9zb2NrZXQsIDYwMDAwLCBbXX0sIDw8Pj4pCisgICAgICApfSwKKyAgICAgIHsid3JpdGUgYSBsaXN0IHRvIHNvY2tldCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHt7dF9zb2NrZXQsIGFfZmFrZV9zb2NrZXQsIDYwMDAwLCBbXX0sIG9rfSwKKyAgICAgICAgd3JpdGUoe3Rfc29ja2V0LCBhX2Zha2Vfc29ja2V0LCA2MDAwMCwgW119LCAiaGFsbG8gd29ybGQiKQorICAgICAgKX0sCisgICAgICB7IndyaXRlIGEgYmluYXJ5IHRvIHNvY2tldCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHt7dF9zb2NrZXQsIGFfZmFrZV9zb2NrZXQsIDYwMDAwLCBbXX0sIG9rfSwKKyAgICAgICAgd3JpdGUoe3Rfc29ja2V0LCBhX2Zha2Vfc29ja2V0LCA2MDAwMCwgW119LCA8PCJoYWxsbyB3b3JsZCI+PikKKyAgICAgICl9CisgICAgXQorICB9LgorCisKK2ZsdXNoKFRyYW5zcG9ydCkgLT4gdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQ6Zmx1c2goVHJhbnNwb3J0KS4KKworZmx1c2hfdGVzdF8oKSAtPgorICBbCisgICAgeyJmbHVzaCBzb2NrZXQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge3t0X3NvY2tldCwgYV9mYWtlX3NvY2tldCwgNjAwMDAsIFtdfSwgb2t9LAorICAgICAgZmx1c2goe3Rfc29ja2V0LCBhX2Zha2Vfc29ja2V0LCA2MDAwMCwgW119KQorICAgICl9CisgIF0uCisKKworY2xvc2UoVHJhbnNwb3J0KSAtPiB0aHJpZnRfc29ja2V0X3RyYW5zcG9ydDpjbG9zZShUcmFuc3BvcnQpLgorCitjbG9zZV90ZXN0XygpIC0+CisgIHtzZXR1cCwKKyAgICBmdW4oKSAtPgorICAgICAgbWVjazpuZXcoZ2VuX3RjcCwgW3Vuc3RpY2ssIHBhc3N0aHJvdWdoXSksCisgICAgICBtZWNrOmV4cGVjdChnZW5fdGNwLCBjbG9zZSwgZnVuKF8pIC0+IG9rIGVuZCkKKyAgICBlbmQsCisgICAgZnVuKF8pIC0+IG1lY2s6dW5sb2FkKGdlbl90Y3ApIGVuZCwKKyAgICBbCisgICAgICB7ImNsb3NlIG1lbWJ1ZmZlciIsID9fYXNzZXJ0TWF0Y2goCisgICAgICAgIHt7dF9zb2NrZXQsIGFfZmFrZV9zb2NrZXQsIDYwMDAwLCBbXX0sIG9rfSwKKyAgICAgICAgY2xvc2Uoe3Rfc29ja2V0LCBhX2Zha2Vfc29ja2V0LCA2MDAwMCwgW119KQorICAgICAgKX0KKyAgICBdCisgIH0uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L3RocmlmdF9zb2NrZXRfc2VydmVyX3Rlc3QuZXJsIGIvbGliL2VybC90ZXN0L3RocmlmdF9zb2NrZXRfc2VydmVyX3Rlc3QuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MThiODQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3Rlc3QvdGhyaWZ0X3NvY2tldF9zZXJ2ZXJfdGVzdC5lcmwKQEAgLTAsMCArMSw0OSBAQAorLW1vZHVsZSAodGhyaWZ0X3NvY2tldF9zZXJ2ZXJfdGVzdCkuCisKKy1pbmNsdWRlX2xpYigiZXVuaXQvaW5jbHVkZS9ldW5pdC5ocmwiKS4KKworLWluY2x1ZGUgKCJ0aHJpZnRfY29uc3RhbnRzLmhybCIpLgorCitwYXJzZV9oYW5kbGVyX29wdGlvbnNfdGVzdF8oKSAtPgorICAgIENvcnJlY3RTZXJ2aWNlSGFuZGxlck9wdGlvbkxpc3QgPSBbez9NVUxUSVBMRVhFRF9FUlJPUl9IQU5ETEVSX0tFWSwgP01PRFVMRX0sIHsiU2VydmljZTEiLCA/TU9EVUxFfSwgeyJTZXJ2aWNlMiIsID9NT0RVTEV9XSwKKyAgICBNaXNzaW5nRXJyb3JIYW5kbGVyT3B0aW9uTGlzdCAgID0gW3siU2VydmljZTEiLCA/TU9EVUxFfSwgeyJTZXJ2aWNlMiIsID9NT0RVTEV9XSwKKyAgICBXcm9uZ1NlcnZpY2UySGFuZGxlck9wdGlvbkxpc3QgID0gW3s/TVVMVElQTEVYRURfRVJST1JfSEFORExFUl9LRVksID9NT0RVTEV9LCB7IlNlcnZpY2UxIiwgP01PRFVMRX0sIHsiU2VydmljZTIiLCAiTW9kdWxlIn1dLAorICAgIFdyb25nU2VydmljZUtleU9wdGlvbkxpc3QgICAgICAgPSBbez9NVUxUSVBMRVhFRF9FUlJPUl9IQU5ETEVSX0tFWSwgP01PRFVMRX0sIHsnc2VydmljZTEnLCA/TU9EVUxFfSwgeyJTZXJ2aWNlMiIsID9NT0RVTEV9XSwKKyAgICBDb3JyZWN0SGFuZGxlclRlc3RGdW5jdGlvbiA9IGZ1bigpIC0+CisgICAgICAgID9hc3NlcnRNYXRjaCh7dGhyaWZ0X3NvY2tldF9zZXJ2ZXIsXyxfLF8sXyxfLF8sXyxfLF8sXyxfLF8sX30sIHRocmlmdF9zb2NrZXRfc2VydmVyOnBhcnNlX29wdGlvbnMoW3toYW5kbGVyLCBDb3JyZWN0U2VydmljZUhhbmRsZXJPcHRpb25MaXN0fV0pKSwKKyAgICAgICAge3RocmlmdF9zb2NrZXRfc2VydmVyLF8sXywgSGFuZGxlckxpc3QsXyxfLF8sXyxfLF8sXyxfLF8sX30gPSB0aHJpZnRfc29ja2V0X3NlcnZlcjpwYXJzZV9vcHRpb25zKFt7aGFuZGxlciwgQ29ycmVjdFNlcnZpY2VIYW5kbGVyT3B0aW9uTGlzdH1dKSwKKyAgICAgICAgbGlzdHM6Zm9yZWFjaChmdW4KKyAgICAgICAgICAgICh7U2VydmljZU5hbWUsIEhhbmRsZXJNb2R1bGV9KSAtPgorICAgICAgICAgICAgICAgID9hc3NlcnRNYXRjaCh7b2ssIEhhbmRsZXJNb2R1bGV9IHdoZW4gaXNfYXRvbShIYW5kbGVyTW9kdWxlKSwgdGhyaWZ0X211bHRpcGxleGVkX21hcF93cmFwcGVyOmZpbmQoU2VydmljZU5hbWUsIEhhbmRsZXJMaXN0KSkKKyAgICAgICAgZW5kLCBDb3JyZWN0U2VydmljZUhhbmRsZXJPcHRpb25MaXN0KQorICAgIGVuZCwKKyAgICBbCisgICAgIHsiQmFkIGFyZ3VtZW50IGZvciB0aGUgaGFuZGxlciBvcHRpb24iLCA/X2Fzc2VydFRocm93KF8sIHRocmlmdF9zb2NrZXRfc2VydmVyOnBhcnNlX29wdGlvbnMoW3toYW5kbGVyLCBbXX1dKSl9LAorICAgICB7IlRyeSB0byBwYXJzZSB0aGUgaGFuZGxlciBvcHRpb24gdHdpY2UiLCA/X2Fzc2VydFRocm93KF8sIHRocmlmdF9zb2NrZXRfc2VydmVyOnBhcnNlX29wdGlvbnMoW3toYW5kbGVyLCA/TU9EVUxFfSwge2hhbmRsZXIsIENvcnJlY3RTZXJ2aWNlSGFuZGxlck9wdGlvbkxpc3R9XSkpfSwKKyAgICAgeyJQYXJzZSB0aGUgaGFuZGxlciBvcHRpb24gYXMgYSBub24gbXVsdGlwbGV4ZWQgc2VydmljZSBoYW5kbGVyIiwgP19hc3NlcnRNYXRjaCh7dGhyaWZ0X3NvY2tldF9zZXJ2ZXIsXyxfLD9NT0RVTEUsXyxfLF8sXyxfLF8sXyxfLF8sX30sIHRocmlmdF9zb2NrZXRfc2VydmVyOnBhcnNlX29wdGlvbnMoW3toYW5kbGVyLCA/TU9EVUxFfV0pKX0sCisgICAgIHsiTm8gZXJyb3IgaGFuZGxlciB3YXMgZGVmaW5lZCIsID9fYXNzZXJ0VGhyb3coXywgdGhyaWZ0X3NvY2tldF9zZXJ2ZXI6cGFyc2Vfb3B0aW9ucyhbe2hhbmRsZXIsIE1pc3NpbmdFcnJvckhhbmRsZXJPcHRpb25MaXN0fV0pKX0sCisgICAgIHsiQmFkIGhhbmRsZXIgbW9kdWxlIGZvciBTZXJ2aWNlMiIsID9fYXNzZXJ0VGhyb3coXywgdGhyaWZ0X3NvY2tldF9zZXJ2ZXI6cGFyc2Vfb3B0aW9ucyhbe2hhbmRsZXIsIFdyb25nU2VydmljZTJIYW5kbGVyT3B0aW9uTGlzdH1dKSl9LAorICAgICB7IkJhZCBzZXJ2aWNlIGtleSBmb3IgU2VydmljZTEiLCA/X2Fzc2VydFRocm93KF8sIHRocmlmdF9zb2NrZXRfc2VydmVyOnBhcnNlX29wdGlvbnMoW3toYW5kbGVyLCBXcm9uZ1NlcnZpY2VLZXlPcHRpb25MaXN0fV0pKX0sCisgICAgIHsiVHJ5IHRvIHBhcnNlIGEgY29ycmVjdCBoYW5kbGVyIG9wdGlvbiBsaXN0IiwgQ29ycmVjdEhhbmRsZXJUZXN0RnVuY3Rpb259CisgICAgXS4KKworcGFyc2Vfc2VydmljZV9vcHRpb25zX3Rlc3RfKCkgLT4KKyAgICBDb3JyZWN0U2VydmljZU1vZHVsZU9wdGlvbkxpc3QgPSBbeyJTZXJ2aWNlMSIsID9NT0RVTEV9LCB7IlNlcnZpY2UyIiwgP01PRFVMRX1dLAorICAgIFdyb25nU2VydmljZTJNb2R1bGVPcHRpb25MaXN0ICA9IFt7IlNlcnZpY2UxIiwgP01PRFVMRX0sIHsiU2VydmljZTIiLCAidGhyaWZ0X3NlcnZpY2VfbW9kdWxlIn1dLAorICAgIFdyb25nU2VydmljZUtleU9wdGlvbkxpc3QgICAgICAgPSBbeydzZXJ2aWNlMScsID9NT0RVTEV9LCB7IlNlcnZpY2UyIiwgP01PRFVMRX1dLAorICAgIENvcnJlY3RTZXJ2aWNlTW9kdWxlVGVzdEZ1bmN0aW9uID0gZnVuKCkgLT4KKyAgICAgICAgP2Fzc2VydE1hdGNoKHt0aHJpZnRfc29ja2V0X3NlcnZlcixfLF8sXyxfLF8sXyxfLF8sXyxfLF8sXyxffSwgdGhyaWZ0X3NvY2tldF9zZXJ2ZXI6cGFyc2Vfb3B0aW9ucyhbe3NlcnZpY2UsIENvcnJlY3RTZXJ2aWNlTW9kdWxlT3B0aW9uTGlzdH1dKSksCisgICAgICAgIHt0aHJpZnRfc29ja2V0X3NlcnZlcixfLCBTZXJ2aWNlTW9kdWxlTGlzdCxfLF8sXyxfLF8sXyxfLF8sXyxfLF99ID0gdGhyaWZ0X3NvY2tldF9zZXJ2ZXI6cGFyc2Vfb3B0aW9ucyhbe3NlcnZpY2UsIENvcnJlY3RTZXJ2aWNlTW9kdWxlT3B0aW9uTGlzdH1dKSwKKyAgICAgICAgbGlzdHM6Zm9yZWFjaChmdW4KKyAgICAgICAgICAgICh7U2VydmljZU5hbWUsIFNlcnZpY2VNb2R1bGV9KSAtPgorICAgICAgICAgICAgICAgID9hc3NlcnRNYXRjaCh7b2ssIFNlcnZpY2VNb2R1bGV9IHdoZW4gaXNfYXRvbShTZXJ2aWNlTW9kdWxlKSwgdGhyaWZ0X211bHRpcGxleGVkX21hcF93cmFwcGVyOmZpbmQoU2VydmljZU5hbWUsIFNlcnZpY2VNb2R1bGVMaXN0KSkKKyAgICAgICAgZW5kLCBDb3JyZWN0U2VydmljZU1vZHVsZU9wdGlvbkxpc3QpCisgICAgZW5kLAorICAgIFsKKyAgICAgeyJCYWQgYXJndW1lbnQgZm9yIHRoZSBzZXJ2aWNlIG9wdGlvbiIsID9fYXNzZXJ0VGhyb3coXywgdGhyaWZ0X3NvY2tldF9zZXJ2ZXI6cGFyc2Vfb3B0aW9ucyhbe3NlcnZpY2UsIFtdfV0pKX0sCisgICAgIHsiVHJ5IHRvIHBhcnNlIHRoZSBzZXJ2aWNlIG9wdGlvbiB0d2ljZSIsID9fYXNzZXJ0VGhyb3coXywgdGhyaWZ0X3NvY2tldF9zZXJ2ZXI6cGFyc2Vfb3B0aW9ucyhbe3NlcnZpY2UsID9NT0RVTEV9LCB7c2VydmljZSwgQ29ycmVjdFNlcnZpY2VNb2R1bGVPcHRpb25MaXN0fV0pKX0sCisgICAgIHsiUGFyc2UgYSBzZXJ2aWNlIG1vZHVsZSBmb3IgYSBub24gbXVsdGlwbGV4ZWQgc2VydmljZSIsID9fYXNzZXJ0TWF0Y2goe3RocmlmdF9zb2NrZXRfc2VydmVyLF8sP01PRFVMRSxfLF8sXyxfLF8sXyxfLF8sXyxfLF99LCB0aHJpZnRfc29ja2V0X3NlcnZlcjpwYXJzZV9vcHRpb25zKFt7c2VydmljZSwgP01PRFVMRX1dKSl9LAorICAgICB7IkJhZCBzZXJ2aWNlIG1vZHVsZSBmb3IgU2VydmljZTIiLCA/X2Fzc2VydFRocm93KF8sIHRocmlmdF9zb2NrZXRfc2VydmVyOnBhcnNlX29wdGlvbnMoW3tzZXJ2aWNlLCBXcm9uZ1NlcnZpY2UyTW9kdWxlT3B0aW9uTGlzdH1dKSl9LAorICAgICB7IkJhZCBzZXJ2aWNlIGtleSBmb3IgU2VydmljZTEiLCA/X2Fzc2VydFRocm93KF8sIHRocmlmdF9zb2NrZXRfc2VydmVyOnBhcnNlX29wdGlvbnMoW3tzZXJ2aWNlLCBXcm9uZ1NlcnZpY2VLZXlPcHRpb25MaXN0fV0pKX0sCisgICAgIHsiVHJ5IHRvIHBhcnNlIGEgY29ycmVjdCBzZXJ2aWNlIG9wdGlvbiBsaXN0IiwgQ29ycmVjdFNlcnZpY2VNb2R1bGVUZXN0RnVuY3Rpb259CisgICAgXS4KZGlmZiAtLWdpdCBhL2xpYi9lcmwvdGVzdC90aHJpZnRfdGVzdF90ZXN0LmVybCBiL2xpYi9lcmwvdGVzdC90aHJpZnRfdGVzdF90ZXN0LmVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2RmNjFkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90ZXN0L3RocmlmdF90ZXN0X3Rlc3QuZXJsCkBAIC0wLDAgKzEsNjQzIEBACislJQorJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCislJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorJSUKKyUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCislJQorJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyUlIHVuZGVyIHRoZSBMaWNlbnNlLgorJSUKKworJSBkb24ndCByZW5hbWUgdGhpcyB0aHJpZnRfdGVzdCwgaXQgY2xvYmJlcnMgZ2VuZXJhdGVkIGZpbGVzCistbW9kdWxlKHRocmlmdF90ZXN0X3Rlc3QpLgorLWNvbXBpbGUoZXhwb3J0X2FsbCkuCisKKy1pbmNsdWRlX2xpYigiZXVuaXQvaW5jbHVkZS9ldW5pdC5ocmwiKS4KKworLWluY2x1ZGUoImdlbi1lcmwvdGhyaWZ0X3Rlc3RfY29uc3RhbnRzLmhybCIpLgorCitjb25zdGFudF90ZXN0XygpIC0+CisgIFsKKyAgICB7Im15TnVtYmVyeiBlcXVhbHMgMSIsID9fYXNzZXJ0RXF1YWwoMSwgP1RIUklGVF9URVNUX01ZTlVNQkVSWil9CisgIF0uCisKK3JlY29yZF9nZW5lcmF0aW9uX3Rlc3RfKCkgLT4KKyAgWworICAgIHsiQm9uayByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeyd0aHJpZnQudGVzdC5Cb25rJywgXywgX30sCisgICAgICAjJ3RocmlmdC50ZXN0LkJvbmsne21lc3NhZ2U9bnVsbCx0eXBlPW51bGx9CisgICAgKX0sCisgICAgeyJCb29scyByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeyd0aHJpZnQudGVzdC5Cb29scycsIF8sIF99LAorICAgICAgIyd0aHJpZnQudGVzdC5Cb29scyd7aW1fdHJ1ZT1udWxsLGltX2ZhbHNlPW51bGx9CisgICAgKX0sCisgICAgeyJYdHJ1Y3QgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsndGhyaWZ0LnRlc3QuWHRydWN0JywgXywgXywgXywgX30sCisgICAgICAjJ3RocmlmdC50ZXN0Llh0cnVjdCd7c3RyaW5nX3RoaW5nPW51bGwsYnl0ZV90aGluZz1udWxsLGkzMl90aGluZz1udWxsLGk2NF90aGluZz1udWxsfQorICAgICl9LAorICAgIHsiWHRydWN0MiByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeyd0aHJpZnQudGVzdC5YdHJ1Y3QyJywgXywgXywgX30sCisgICAgICAjJ3RocmlmdC50ZXN0Llh0cnVjdDIne2J5dGVfdGhpbmc9bnVsbCxzdHJ1Y3RfdGhpbmc9bnVsbCxpMzJfdGhpbmc9bnVsbH0KKyAgICApfSwKKyAgICB7Ilh0cnVjdDMgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsndGhyaWZ0LnRlc3QuWHRydWN0MycsIF8sIF8sIF8sIF99LAorICAgICAgIyd0aHJpZnQudGVzdC5YdHJ1Y3QzJ3tzdHJpbmdfdGhpbmc9bnVsbCxjaGFuZ2VkPW51bGwsaTMyX3RoaW5nPW51bGwsaTY0X3RoaW5nPW51bGx9CisgICAgKX0sCisgICAgeyJJbnNhbml0eSByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeyd0aHJpZnQudGVzdC5JbnNhbml0eScsIF8sIF99LAorICAgICAgIyd0aHJpZnQudGVzdC5JbnNhbml0eSd7dXNlck1hcD1udWxsLHh0cnVjdHM9bnVsbH0KKyAgICApfSwKKyAgICB7IkNyYXp5TmVzdGluZyByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeyd0aHJpZnQudGVzdC5DcmF6eU5lc3RpbmcnLCBfLCBfLCBfLCBffSwKKyAgICAgICMndGhyaWZ0LnRlc3QuQ3JhenlOZXN0aW5nJ3sKKyAgICAgICAgc3RyaW5nX2ZpZWxkPW51bGwsCisgICAgICAgIHNldF9maWVsZD1udWxsLAorICAgICAgICBsaXN0X2ZpZWxkPW51bGwsCisgICAgICAgIGJpbmFyeV9maWVsZD1udWxsCisgICAgICB9CisgICAgKX0sCisgICAgeyJYY2VwdGlvbiByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeyd0aHJpZnQudGVzdC5YY2VwdGlvbicsIF8sIF99LAorICAgICAgIyd0aHJpZnQudGVzdC5YY2VwdGlvbid7ZXJyb3JDb2RlPW51bGwsbWVzc2FnZT1udWxsfQorICAgICl9LAorICAgIHsiWGNlcHRpb24yIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J3RocmlmdC50ZXN0LlhjZXB0aW9uMicsIF8sIF99LAorICAgICAgIyd0aHJpZnQudGVzdC5YY2VwdGlvbjIne2Vycm9yQ29kZT1udWxsLHN0cnVjdF90aGluZz1udWxsfQorICAgICl9LAorICAgIHsiRW1wdHlTdHJ1Y3QgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCh7J3RocmlmdC50ZXN0LkVtcHR5U3RydWN0J30sICMndGhyaWZ0LnRlc3QuRW1wdHlTdHJ1Y3Qne30pfSwKKyAgICB7Ik9uZUZpZWxkIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goeyd0aHJpZnQudGVzdC5PbmVGaWVsZCcsIF99LCAjJ3RocmlmdC50ZXN0Lk9uZUZpZWxkJ3tmaWVsZD1udWxsfSl9LAorICAgIHsiVmVyc2lvbmluZ1Rlc3RWMSByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeyd0aHJpZnQudGVzdC5WZXJzaW9uaW5nVGVzdFYxJywgXywgXywgX30sCisgICAgICAjJ3RocmlmdC50ZXN0LlZlcnNpb25pbmdUZXN0VjEne2JlZ2luX2luX2JvdGg9bnVsbCxvbGRfc3RyaW5nPW51bGwsZW5kX2luX2JvdGg9bnVsbH0KKyAgICApfSwKKyAgICB7IlZlcnNpb25pbmdUZXN0VjIgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsndGhyaWZ0LnRlc3QuVmVyc2lvbmluZ1Rlc3RWMicsIF8sIF8sIF8sIF8sIF8sIF8sIF8sIF8sIF8sIF8sIF8sIF99LAorICAgICAgIyd0aHJpZnQudGVzdC5WZXJzaW9uaW5nVGVzdFYyJ3sKKyAgICAgICAgYmVnaW5faW5fYm90aD1udWxsLAorICAgICAgICBuZXdpbnQ9bnVsbCwKKyAgICAgICAgbmV3Ynl0ZT1udWxsLAorICAgICAgICBuZXdzaG9ydD1udWxsLAorICAgICAgICBuZXdsb25nPW51bGwsCisgICAgICAgIG5ld2RvdWJsZT1udWxsLAorICAgICAgICBuZXdzdHJ1Y3Q9bnVsbCwKKyAgICAgICAgbmV3bGlzdD1udWxsLAorICAgICAgICBuZXdzZXQ9bnVsbCwKKyAgICAgICAgbmV3bWFwPW51bGwsCisgICAgICAgIG5ld3N0cmluZz1udWxsLAorICAgICAgICBlbmRfaW5fYm90aD1udWxsCisgICAgICB9CisgICAgKX0sCisgICAgeyJMaXN0VHlwZVZlcnNpb25pbmdWMSByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeyd0aHJpZnQudGVzdC5MaXN0VHlwZVZlcnNpb25pbmdWMScsIF8sIF99LAorICAgICAgIyd0aHJpZnQudGVzdC5MaXN0VHlwZVZlcnNpb25pbmdWMSd7bXlpbnRzPW51bGwsaGVsbG89bnVsbH0KKyAgICApfSwKKyAgICB7Ikxpc3RUeXBlVmVyc2lvbmluZ1YyIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J3RocmlmdC50ZXN0Lkxpc3RUeXBlVmVyc2lvbmluZ1YyJywgXywgX30sCisgICAgICAjJ3RocmlmdC50ZXN0Lkxpc3RUeXBlVmVyc2lvbmluZ1YyJ3tzdHJpbmdzPW51bGwsaGVsbG89bnVsbH0KKyAgICApfSwKKyAgICB7Ikd1ZXNzUHJvdG9jb2xTdHJ1Y3QgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsndGhyaWZ0LnRlc3QuR3Vlc3NQcm90b2NvbFN0cnVjdCcsIF99LAorICAgICAgIyd0aHJpZnQudGVzdC5HdWVzc1Byb3RvY29sU3RydWN0J3ttYXBfZmllbGQ9bnVsbH0KKyAgICApfSwKKyAgICB7IkxhcmdlRGVsdGFzIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J3RocmlmdC50ZXN0LkxhcmdlRGVsdGFzJywgXywgXywgXywgXywgXywgXywgXywgXywgXywgX30sCisgICAgICAjJ3RocmlmdC50ZXN0LkxhcmdlRGVsdGFzJ3sKKyAgICAgICAgYjE9bnVsbCwKKyAgICAgICAgYjEwPW51bGwsCisgICAgICAgIGIxMDA9bnVsbCwKKyAgICAgICAgY2hlY2tfdHJ1ZT1udWxsLAorICAgICAgICBiMTAwMD1udWxsLAorICAgICAgICBjaGVja19mYWxzZT1udWxsLAorICAgICAgICB2ZXJ0d28yMDAwPW51bGwsCisgICAgICAgIGFfc2V0MjUwMD1udWxsLAorICAgICAgICB2ZXJ0d28zMDAwPW51bGwsCisgICAgICAgIGJpZ19udW1iZXJzPW51bGwKKyAgICAgIH0KKyAgICApfSwKKyAgICB7Ik5lc3RlZExpc3RzSTMyeDIgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsndGhyaWZ0LnRlc3QuTmVzdGVkTGlzdHNJMzJ4MicsIF99LAorICAgICAgIyd0aHJpZnQudGVzdC5OZXN0ZWRMaXN0c0kzMngyJ3tpbnRlZ2VybGlzdD1udWxsfQorICAgICl9LAorICAgIHsiTmVzdGVkTGlzdHNJMzJ4MyByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeyd0aHJpZnQudGVzdC5OZXN0ZWRMaXN0c0kzMngzJywgX30sCisgICAgICAjJ3RocmlmdC50ZXN0Lk5lc3RlZExpc3RzSTMyeDMne2ludGVnZXJsaXN0PW51bGx9CisgICAgKX0sCisgICAgeyJOZXN0ZWRNaXhlZHgyIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J3RocmlmdC50ZXN0Lk5lc3RlZE1peGVkeDInLCBfLCBfLCBffSwKKyAgICAgICMndGhyaWZ0LnRlc3QuTmVzdGVkTWl4ZWR4Mid7CisgICAgICAgIGludF9zZXRfbGlzdD1udWxsLAorICAgICAgICBtYXBfaW50X3N0cnNldD1udWxsLAorICAgICAgICBtYXBfaW50X3N0cnNldF9saXN0PW51bGwKKyAgICAgIH0KKyAgICApfSwKKyAgICB7Ikxpc3RCb25rcyByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKHsndGhyaWZ0LnRlc3QuTGlzdEJvbmtzJywgX30sICMndGhyaWZ0LnRlc3QuTGlzdEJvbmtzJ3tib25rPW51bGx9KX0sCisgICAgeyJOZXN0ZWRMaXN0c0JvbmsgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsndGhyaWZ0LnRlc3QuTmVzdGVkTGlzdHNCb25rJywgX30sCisgICAgICAjJ3RocmlmdC50ZXN0Lk5lc3RlZExpc3RzQm9uayd7Ym9uaz1udWxsfQorICAgICl9LAorICAgIHsiQm9vbFRlc3QgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsndGhyaWZ0LnRlc3QuQm9vbFRlc3QnLCBfLCBffSwKKyAgICAgICMndGhyaWZ0LnRlc3QuQm9vbFRlc3Qne2I9bnVsbCxzPW51bGx9CisgICAgKX0sCisgICAgeyJTdHJ1Y3RBIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goeyd0aHJpZnQudGVzdC5TdHJ1Y3RBJywgX30sICMndGhyaWZ0LnRlc3QuU3RydWN0QSd7cz1udWxsfSl9LAorICAgIHsiU3RydWN0QiByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeyd0aHJpZnQudGVzdC5TdHJ1Y3RCJywgXywgX30sCisgICAgICAjJ3RocmlmdC50ZXN0LlN0cnVjdEIne2FhPW51bGwsYWI9bnVsbH0KKyAgICApfQorICBdLgorCitzdHJ1Y3RfaW5mb190ZXN0XygpIC0+CisgIFsKKyAgICB7IkJvbmsgZGVmaW5pdGlvbiAoc2hvcnQgdmVyc2lvbikiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCBzdHJpbmd9LCB7MiwgaTMyfV19LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oJ3RocmlmdC50ZXN0LkJvbmsnKQorICAgICl9LAorICAgIHsiQm9uayBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwgc3RyaW5nLCBtZXNzYWdlLCB1bmRlZmluZWR9LAorICAgICAgICB7MiwgdW5kZWZpbmVkLCBpMzIsIHR5cGUsIHVuZGVmaW5lZH0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCd0aHJpZnQudGVzdC5Cb25rJykKKyAgICApfSwKKyAgICB7IkJvb2xzIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCBib29sLCBpbV90cnVlLCB1bmRlZmluZWR9LAorICAgICAgICB7MiwgdW5kZWZpbmVkLCBib29sLCBpbV9mYWxzZSwgdW5kZWZpbmVkfQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0LkJvb2xzJykKKyAgICApfSwKKyAgICB7Ilh0cnVjdCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwgc3RyaW5nLCBzdHJpbmdfdGhpbmcsIHVuZGVmaW5lZH0sCisgICAgICAgIHs0LCB1bmRlZmluZWQsIGJ5dGUsIGJ5dGVfdGhpbmcsIHVuZGVmaW5lZH0sCisgICAgICAgIHs5LCB1bmRlZmluZWQsIGkzMiwgaTMyX3RoaW5nLCB1bmRlZmluZWR9LAorICAgICAgICB7MTEsIHVuZGVmaW5lZCwgaTY0LCBpNjRfdGhpbmcsIHVuZGVmaW5lZH0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCd0aHJpZnQudGVzdC5YdHJ1Y3QnKQorICAgICl9LAorICAgIHsiWHRydWN0MiBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwgYnl0ZSwgYnl0ZV90aGluZywgdW5kZWZpbmVkfSwKKyAgICAgICAgezIsIHVuZGVmaW5lZCwge3N0cnVjdCwgeyd0aHJpZnRfdGVzdF90eXBlcycsICd0aHJpZnQudGVzdC5YdHJ1Y3QnfX0sIHN0cnVjdF90aGluZywgIyd0aHJpZnQudGVzdC5YdHJ1Y3Qne319LAorICAgICAgICB7MywgdW5kZWZpbmVkLCBpMzIsIGkzMl90aGluZywgdW5kZWZpbmVkfQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0Llh0cnVjdDInKQorICAgICl9LAorICAgIHsiWHRydWN0MyBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwgc3RyaW5nLCBzdHJpbmdfdGhpbmcsIHVuZGVmaW5lZH0sCisgICAgICAgIHs0LCB1bmRlZmluZWQsIGkzMiwgY2hhbmdlZCwgdW5kZWZpbmVkfSwKKyAgICAgICAgezksIHVuZGVmaW5lZCwgaTMyLCBpMzJfdGhpbmcsIHVuZGVmaW5lZH0sCisgICAgICAgIHsxMSwgdW5kZWZpbmVkLCBpNjQsIGk2NF90aGluZywgdW5kZWZpbmVkfQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0Llh0cnVjdDMnKQorICAgICl9LAorICAgIHsiSW5zYW5pdHkgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIHttYXAsIGkzMiwgaTY0fSwgdXNlck1hcCwgZGljdDpuZXcoKX0sCisgICAgICAgIHsyLCB1bmRlZmluZWQsIHtsaXN0LCB7c3RydWN0LCB7J3RocmlmdF90ZXN0X3R5cGVzJywgJ3RocmlmdC50ZXN0Llh0cnVjdCd9fX0sIHh0cnVjdHMsIFtdfQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0Lkluc2FuaXR5JykKKyAgICApfSwKKyAgICB7IkNyYXp5TmVzdGluZyBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwgc3RyaW5nLCBzdHJpbmdfZmllbGQsIHVuZGVmaW5lZH0sCisgICAgICAgIHsyLCBvcHRpb25hbCwge3NldCwge3N0cnVjdCwgeyd0aHJpZnRfdGVzdF90eXBlcycsICd0aHJpZnQudGVzdC5JbnNhbml0eSd9fX0sIHNldF9maWVsZCwgc2V0czpuZXcoKX0sCisgICAgICAgIHszLCByZXF1aXJlZCwge2xpc3QsIHttYXAsCisgICAgICAgICAge3NldCwgaTMyfSwKKyAgICAgICAgICB7bWFwLCBpMzIsIHtzZXQsIHtsaXN0LCB7bWFwLCB7c3RydWN0LCB7J3RocmlmdF90ZXN0X3R5cGVzJywgJ3RocmlmdC50ZXN0Lkluc2FuaXR5J319LCBzdHJpbmd9fX19CisgICAgICAgIH19LCBsaXN0X2ZpZWxkLCBbXX0sCisgICAgICAgIHs0LCB1bmRlZmluZWQsIHN0cmluZywgYmluYXJ5X2ZpZWxkLCB1bmRlZmluZWR9CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgndGhyaWZ0LnRlc3QuQ3JhenlOZXN0aW5nJykKKyAgICApfSwKKyAgICB7IlhjZXB0aW9uIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCBpMzIsIGVycm9yQ29kZSwgdW5kZWZpbmVkfSwKKyAgICAgICAgezIsIHVuZGVmaW5lZCwgc3RyaW5nLCBtZXNzYWdlLCB1bmRlZmluZWR9CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgndGhyaWZ0LnRlc3QuWGNlcHRpb24nKQorICAgICl9LAorICAgIHsiWGNlcHRpb24yIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCBpMzIsIGVycm9yQ29kZSwgdW5kZWZpbmVkfSwKKyAgICAgICAgezIsIHVuZGVmaW5lZCwge3N0cnVjdCwgeyd0aHJpZnRfdGVzdF90eXBlcycsICd0aHJpZnQudGVzdC5YdHJ1Y3QnfX0sIHN0cnVjdF90aGluZywgIyd0aHJpZnQudGVzdC5YdHJ1Y3Qne319CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgndGhyaWZ0LnRlc3QuWGNlcHRpb24yJykKKyAgICApfSwKKyAgICB7IkVtcHR5U3RydWN0IGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW119LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCd0aHJpZnQudGVzdC5FbXB0eVN0cnVjdCcpCisgICAgKX0sCisgICAgeyJPbmVGaWVsZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwge3N0cnVjdCwgeyd0aHJpZnRfdGVzdF90eXBlcycsICd0aHJpZnQudGVzdC5FbXB0eVN0cnVjdCd9fSwgZmllbGQsICMndGhyaWZ0LnRlc3QuRW1wdHlTdHJ1Y3Qne319CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgndGhyaWZ0LnRlc3QuT25lRmllbGQnKQorICAgICl9LAorICAgIHsiVmVyc2lvbmluZ1Rlc3RWMSBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwgaTMyLCBiZWdpbl9pbl9ib3RoLCB1bmRlZmluZWR9LAorICAgICAgICB7MywgdW5kZWZpbmVkLCBzdHJpbmcsIG9sZF9zdHJpbmcsIHVuZGVmaW5lZH0sCisgICAgICAgIHsxMiwgdW5kZWZpbmVkLCBpMzIsIGVuZF9pbl9ib3RoLCB1bmRlZmluZWR9CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgndGhyaWZ0LnRlc3QuVmVyc2lvbmluZ1Rlc3RWMScpCisgICAgKX0sCisgICAgeyJWZXJzaW9uaW5nVGVzdFYyIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCBpMzIsIGJlZ2luX2luX2JvdGgsIHVuZGVmaW5lZH0sCisgICAgICAgIHsyLCB1bmRlZmluZWQsIGkzMiwgbmV3aW50LCB1bmRlZmluZWR9LAorICAgICAgICB7MywgdW5kZWZpbmVkLCBieXRlLCBuZXdieXRlLCB1bmRlZmluZWR9LAorICAgICAgICB7NCwgdW5kZWZpbmVkLCBpMTYsIG5ld3Nob3J0LCB1bmRlZmluZWR9LAorICAgICAgICB7NSwgdW5kZWZpbmVkLCBpNjQsIG5ld2xvbmcsIHVuZGVmaW5lZH0sCisgICAgICAgIHs2LCB1bmRlZmluZWQsIGRvdWJsZSwgbmV3ZG91YmxlLCB1bmRlZmluZWR9LAorICAgICAgICB7NywgdW5kZWZpbmVkLCB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICd0aHJpZnQudGVzdC5Cb25rJ319LCBuZXdzdHJ1Y3QsICMndGhyaWZ0LnRlc3QuQm9uayd7fX0sCisgICAgICAgIHs4LCB1bmRlZmluZWQsIHtsaXN0LCBpMzJ9LCBuZXdsaXN0LCBbXX0sCisgICAgICAgIHs5LCB1bmRlZmluZWQsIHtzZXQsIGkzMn0sIG5ld3NldCwgc2V0czpuZXcoKX0sCisgICAgICAgIHsxMCwgdW5kZWZpbmVkLCB7bWFwLCBpMzIsIGkzMn0sIG5ld21hcCwgZGljdDpuZXcoKX0sCisgICAgICAgIHsxMSwgdW5kZWZpbmVkLCBzdHJpbmcsIG5ld3N0cmluZywgdW5kZWZpbmVkfSwKKyAgICAgICAgezEyLCB1bmRlZmluZWQsIGkzMiwgZW5kX2luX2JvdGgsIHVuZGVmaW5lZH0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCd0aHJpZnQudGVzdC5WZXJzaW9uaW5nVGVzdFYyJykKKyAgICApfSwKKyAgICB7Ikxpc3RUeXBlVmVyc2lvbmluZ1YxIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCB7bGlzdCwgaTMyfSwgbXlpbnRzLCBbXX0sCisgICAgICAgIHsyLCB1bmRlZmluZWQsIHN0cmluZywgaGVsbG8sIHVuZGVmaW5lZH0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCd0aHJpZnQudGVzdC5MaXN0VHlwZVZlcnNpb25pbmdWMScpCisgICAgKX0sCisgICAgeyJMaXN0VHlwZVZlcnNpb25pbmdWMiBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwge2xpc3QsIHN0cmluZ30sIHN0cmluZ3MsIFtdfSwKKyAgICAgICAgezIsIHVuZGVmaW5lZCwgc3RyaW5nLCBoZWxsbywgdW5kZWZpbmVkfQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0Lkxpc3RUeXBlVmVyc2lvbmluZ1YyJykKKyAgICApfSwKKyAgICB7Ikd1ZXNzUHJvdG9jb2xTdHJ1Y3QgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHs3LCB1bmRlZmluZWQsIHttYXAsIHN0cmluZywgc3RyaW5nfSwgbWFwX2ZpZWxkLCBkaWN0Om5ldygpfQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0Lkd1ZXNzUHJvdG9jb2xTdHJ1Y3QnKQorICAgICl9LAorICAgIHsiTGFyZ2VEZWx0YXMgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ3RocmlmdC50ZXN0LkJvb2xzJ319LCBiMSwgIyd0aHJpZnQudGVzdC5Cb29scyd7fX0sCisgICAgICAgIHsxMCwgdW5kZWZpbmVkLCB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICd0aHJpZnQudGVzdC5Cb29scyd9fSwgYjEwLCAjJ3RocmlmdC50ZXN0LkJvb2xzJ3t9fSwKKyAgICAgICAgezEwMCwgdW5kZWZpbmVkLCB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICd0aHJpZnQudGVzdC5Cb29scyd9fSwgYjEwMCwgIyd0aHJpZnQudGVzdC5Cb29scyd7fX0sCisgICAgICAgIHs1MDAsIHVuZGVmaW5lZCwgYm9vbCwgY2hlY2tfdHJ1ZSwgdW5kZWZpbmVkfSwKKyAgICAgICAgezEwMDAsIHVuZGVmaW5lZCwge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAndGhyaWZ0LnRlc3QuQm9vbHMnfX0sIGIxMDAwLCAjJ3RocmlmdC50ZXN0LkJvb2xzJ3t9fSwKKyAgICAgICAgezE1MDAsIHVuZGVmaW5lZCwgYm9vbCwgY2hlY2tfZmFsc2UsIHVuZGVmaW5lZH0sCisgICAgICAgIHsyMDAwLCB1bmRlZmluZWQsIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ3RocmlmdC50ZXN0LlZlcnNpb25pbmdUZXN0VjInfX0sIHZlcnR3bzIwMDAsICMndGhyaWZ0LnRlc3QuVmVyc2lvbmluZ1Rlc3RWMid7fX0sCisgICAgICAgIHsyNTAwLCB1bmRlZmluZWQsIHtzZXQsIHN0cmluZ30sIGFfc2V0MjUwMCwgc2V0czpuZXcoKX0sCisgICAgICAgIHszMDAwLCB1bmRlZmluZWQsIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ3RocmlmdC50ZXN0LlZlcnNpb25pbmdUZXN0VjInfX0sIHZlcnR3bzMwMDAsICMndGhyaWZ0LnRlc3QuVmVyc2lvbmluZ1Rlc3RWMid7fX0sCisgICAgICAgIHs0MDAwLCB1bmRlZmluZWQsIHtsaXN0LCBpMzJ9LCBiaWdfbnVtYmVycywgW119CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgndGhyaWZ0LnRlc3QuTGFyZ2VEZWx0YXMnKQorICAgICl9LAorICAgIHsiTmVzdGVkTGlzdHNJMzJ4MiBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwge2xpc3QsIHtsaXN0LCBpMzJ9fSwgaW50ZWdlcmxpc3QsIFtdfQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0Lk5lc3RlZExpc3RzSTMyeDInKQorICAgICl9LAorICAgIHsiTmVzdGVkTGlzdHNJMzJ4MyBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwge2xpc3QsIHtsaXN0LCB7bGlzdCwgaTMyfX19LCBpbnRlZ2VybGlzdCwgW119CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgndGhyaWZ0LnRlc3QuTmVzdGVkTGlzdHNJMzJ4MycpCisgICAgKX0sCisgICAgeyJOZXN0ZWRNaXhlZHgyIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCB7bGlzdCwge3NldCwgaTMyfX0sIGludF9zZXRfbGlzdCwgW119LAorICAgICAgICB7MiwgdW5kZWZpbmVkLCB7bWFwLCBpMzIsIHtzZXQsIHN0cmluZ319LCBtYXBfaW50X3N0cnNldCwgZGljdDpuZXcoKX0sCisgICAgICAgIHszLCB1bmRlZmluZWQsIHtsaXN0LCB7bWFwLCBpMzIsIHtzZXQsIHN0cmluZ319fSwgbWFwX2ludF9zdHJzZXRfbGlzdCwgW119CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgndGhyaWZ0LnRlc3QuTmVzdGVkTWl4ZWR4MicpCisgICAgKX0sCisgICAgeyJMaXN0Qm9ua3MgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIHtsaXN0LCB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICd0aHJpZnQudGVzdC5Cb25rJ319fSwgYm9uaywgW119CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgndGhyaWZ0LnRlc3QuTGlzdEJvbmtzJykKKyAgICApfSwKKyAgICB7Ik5lc3RlZExpc3RzQm9uayBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwge2xpc3QsIHtsaXN0LCB7bGlzdCwge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAndGhyaWZ0LnRlc3QuQm9uayd9fX19fSwgYm9uaywgW119CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgndGhyaWZ0LnRlc3QuTmVzdGVkTGlzdHNCb25rJykKKyAgICApfSwKKyAgICB7IkJvb2xUZXN0IGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgb3B0aW9uYWwsIGJvb2wsIGIsIHRydWV9LAorICAgICAgICB7Miwgb3B0aW9uYWwsIHN0cmluZywgcywgInRydWUifQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ3RocmlmdC50ZXN0LkJvb2xUZXN0JykKKyAgICApfSwKKyAgICB7IlN0cnVjdEEgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIHJlcXVpcmVkLCBzdHJpbmcsIHMsIHVuZGVmaW5lZH1dfSwKKyAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgndGhyaWZ0LnRlc3QuU3RydWN0QScpCisgICAgKX0sCisgICAgeyJTdHJ1Y3RCIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgb3B0aW9uYWwsIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ3RocmlmdC50ZXN0LlN0cnVjdEEnfX0sIGFhLCAjJ3RocmlmdC50ZXN0LlN0cnVjdEEne319LAorICAgICAgICB7MiwgcmVxdWlyZWQsIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ3RocmlmdC50ZXN0LlN0cnVjdEEnfX0sIGFiLCAjJ3RocmlmdC50ZXN0LlN0cnVjdEEne319CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgndGhyaWZ0LnRlc3QuU3RydWN0QicpCisgICAgKX0KKyAgXS4KKworc2VydmljZV9pbmZvX3Rlc3RfKCkgLT4KKyAgWworICAgIHsidGVzdFZvaWQgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RWb2lkLCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RWb2lkIHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RWb2lkLCByZXBseV90eXBlKQorICAgICl9LAorICAgIHsidGVzdFZvaWQgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0Vm9pZCwgZXhjZXB0aW9ucykKKyAgICApfSwKKyAgICB7InRlc3RTdHJpbmcgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFt7MSwgc3RyaW5nfV19LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdFN0cmluZywgcGFyYW1zX3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0U3RyaW5nIHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHN0cmluZywKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RTdHJpbmcsIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0U3RyaW5nIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW119LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdFN0cmluZywgZXhjZXB0aW9ucykKKyAgICApfSwKKyAgICB7InRlc3RCeXRlIHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIGJ5dGV9XX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0Qnl0ZSwgcGFyYW1zX3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0Qnl0ZSByZXBseSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICBieXRlLAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdEJ5dGUsIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0Qnl0ZSBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RCeXRlLCBleGNlcHRpb25zKQorICAgICl9LAorICAgIHsidGVzdEkzMiBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCBpMzJ9XX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0STMyLCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RJMzIgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAorICAgICAgaTMyLAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdEkzMiwgcmVwbHlfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RJMzIgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0STMyLCBleGNlcHRpb25zKQorICAgICl9LAorICAgIHsidGVzdEk2NCBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCBpNjR9XX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0STY0LCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RJNjQgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAorICAgICAgaTY0LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdEk2NCwgcmVwbHlfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RJNjQgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0STY0LCBleGNlcHRpb25zKQorICAgICl9LAorICAgIHsidGVzdERvdWJsZSBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCBkb3VibGV9XX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0RG91YmxlLCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3REb3VibGUgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAorICAgICAgZG91YmxlLAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdERvdWJsZSwgcmVwbHlfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3REb3VibGUgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0RG91YmxlLCBleGNlcHRpb25zKQorICAgICl9LAorICAgIHsidGVzdFN0cnVjdCBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAndGhyaWZ0LnRlc3QuWHRydWN0J319fQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0U3RydWN0LCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RTdHJ1Y3QgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAndGhyaWZ0LnRlc3QuWHRydWN0J319LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdFN0cnVjdCwgcmVwbHlfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RTdHJ1Y3QgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0U3RydWN0LCBleGNlcHRpb25zKQorICAgICl9LAorICAgIHsidGVzdE5lc3QgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ3RocmlmdC50ZXN0Llh0cnVjdDInfX19CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3ROZXN0LCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3ROZXN0IHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ3RocmlmdC50ZXN0Llh0cnVjdDInfX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0TmVzdCwgcmVwbHlfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3ROZXN0IGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW119LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdE5lc3QsIGV4Y2VwdGlvbnMpCisgICAgKX0sCisgICAgeyJ0ZXN0TWFwIHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB7bWFwLCBpMzIsIGkzMn19CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RNYXAsIHBhcmFtc190eXBlKQorICAgICl9LAorICAgIHsidGVzdE1hcCByZXBseSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7bWFwLCBpMzIsIGkzMn0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0TWFwLCByZXBseV90eXBlKQorICAgICl9LAorICAgIHsidGVzdE1hcCBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RNYXAsIGV4Y2VwdGlvbnMpCisgICAgKX0sCisgICAgeyJ0ZXN0U3RyaW5nTWFwIHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB7bWFwLCBzdHJpbmcsIHN0cmluZ319CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RTdHJpbmdNYXAsIHBhcmFtc190eXBlKQorICAgICl9LAorICAgIHsidGVzdFN0cmluZ01hcCByZXBseSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7bWFwLCBzdHJpbmcsIHN0cmluZ30sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0U3RyaW5nTWFwLCByZXBseV90eXBlKQorICAgICl9LAorICAgIHsidGVzdFN0cmluZ01hcCBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RTdHJpbmdNYXAsIGV4Y2VwdGlvbnMpCisgICAgKX0sCisgICAgeyJ0ZXN0U2V0IHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB7c2V0LCBpMzJ9fQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0U2V0LCBwYXJhbXNfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RTZXQgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3NldCwgaTMyfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RTZXQsIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0U2V0IGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW119LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdFNldCwgZXhjZXB0aW9ucykKKyAgICApfSwKKyAgICB7InRlc3RMaXN0IHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB7bGlzdCwgaTMyfX0KKyAgICAgIF19LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdExpc3QsIHBhcmFtc190eXBlKQorICAgICl9LAorICAgIHsidGVzdExpc3QgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge2xpc3QsIGkzMn0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0TGlzdCwgcmVwbHlfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RMaXN0IGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW119LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdExpc3QsIGV4Y2VwdGlvbnMpCisgICAgKX0sCisgICAgeyJ0ZXN0RW51bSBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgaTMyfQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0RW51bSwgcGFyYW1zX3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0RW51bSByZXBseSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICBpMzIsCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0RW51bSwgcmVwbHlfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RFbnVtIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW119LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdEVudW0sIGV4Y2VwdGlvbnMpCisgICAgKX0sCisgICAgeyJ0ZXN0VHlwZWRlZiBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCBpNjR9XX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0VHlwZWRlZiwgcGFyYW1zX3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0VHlwZWRlZiByZXBseSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICBpNjQsCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0VHlwZWRlZiwgcmVwbHlfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RUeXBlZGVmIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW119LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdFR5cGVkZWYsIGV4Y2VwdGlvbnMpCisgICAgKX0sCisgICAgeyJ0ZXN0TWFwTWFwIHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCBpMzJ9CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RNYXBNYXAsIHBhcmFtc190eXBlKQorICAgICl9LAorICAgIHsidGVzdE1hcE1hcCByZXBseSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7bWFwLCBpMzIsIHttYXAsIGkzMixpMzJ9fSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RNYXBNYXAsIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0TWFwTWFwIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW119LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdE1hcE1hcCwgZXhjZXB0aW9ucykKKyAgICApfSwKKyAgICB7InRlc3RJbnNhbml0eSBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAndGhyaWZ0LnRlc3QuSW5zYW5pdHknfX19CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RJbnNhbml0eSwgcGFyYW1zX3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0SW5zYW5pdHkgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge21hcCwgaTY0LCB7bWFwLCBpMzIsIHtzdHJ1Y3QsIHsndGhyaWZ0X3Rlc3RfdHlwZXMnLCAndGhyaWZ0LnRlc3QuSW5zYW5pdHknfX19fSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RJbnNhbml0eSwgcmVwbHlfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RJbnNhbml0eSBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RJbnNhbml0eSwgZXhjZXB0aW9ucykKKyAgICApfSwKKyAgICB7InRlc3RNdWx0aSBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgYnl0ZX0sCisgICAgICAgIHsyLCBpMzJ9LAorICAgICAgICB7MywgaTY0fSwKKyAgICAgICAgezQsIHttYXAsIGkxNiwgc3RyaW5nfX0sCisgICAgICAgIHs1LCBpMzJ9LAorICAgICAgICB7NiwgaTY0fQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0TXVsdGksIHBhcmFtc190eXBlKQorICAgICl9LAorICAgIHsidGVzdE11bHRpIHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ3RocmlmdC50ZXN0Llh0cnVjdCd9fSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RNdWx0aSwgcmVwbHlfdHlwZSkKKyAgICApfSwKKyAgICB7InRlc3RNdWx0aSBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RNdWx0aSwgZXhjZXB0aW9ucykKKyAgICApfSwKKyAgICB7InRlc3RFeGNlcHRpb24gcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFt7MSwgc3RyaW5nfV19LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdEV4Y2VwdGlvbiwgcGFyYW1zX3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0RXhjZXB0aW9uIHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RFeGNlcHRpb24sIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0RXhjZXB0aW9uIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAndGhyaWZ0LnRlc3QuWGNlcHRpb24nfX19CisgICAgICBdfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RFeGNlcHRpb24sIGV4Y2VwdGlvbnMpCisgICAgKX0sCisgICAgeyJ0ZXN0TXVsdGlFeGNlcHRpb24gcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFt7MSwgc3RyaW5nfSwgezIsIHN0cmluZ31dfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RNdWx0aUV4Y2VwdGlvbiwgcGFyYW1zX3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0TXVsdGlFeGNlcHRpb24gcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAndGhyaWZ0LnRlc3QuWHRydWN0J319LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdE11bHRpRXhjZXB0aW9uLCByZXBseV90eXBlKQorICAgICl9LAorICAgIHsidGVzdE11bHRpRXhjZXB0aW9uIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAndGhyaWZ0LnRlc3QuWGNlcHRpb24nfX19LAorICAgICAgICB7Miwge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAndGhyaWZ0LnRlc3QuWGNlcHRpb24yJ319fQorICAgICAgXX0sCisgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0TXVsdGlFeGNlcHRpb24sIGV4Y2VwdGlvbnMpCisgICAgKX0sCisgICAgeyJ0ZXN0T25ld2F5IHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIGkzMn1dfSwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RPbmV3YXksIHBhcmFtc190eXBlKQorICAgICl9LAorICAgIHsidGVzdE9uZXdheSByZXBseSIsID9fYXNzZXJ0RXF1YWwoCisgICAgICBvbmV3YXlfdm9pZCwKKyAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RPbmV3YXksIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJ0ZXN0T25ld2F5IGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW119LAorICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdE9uZXdheSwgZXhjZXB0aW9ucykKKyAgICApfSwKKyAgICB7InNlY29uZHRlc3RTdHJpbmcgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFt7MSwgc3RyaW5nfV19LAorICAgICAgc2Vjb25kX3NlcnZpY2VfdGhyaWZ0OmZ1bmN0aW9uX2luZm8oc2Vjb25kdGVzdFN0cmluZywgcGFyYW1zX3R5cGUpCisgICAgKX0sCisgICAgeyJzZWNvbmR0ZXN0U3RyaW5nIHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHN0cmluZywKKyAgICAgIHNlY29uZF9zZXJ2aWNlX3RocmlmdDpmdW5jdGlvbl9pbmZvKHNlY29uZHRlc3RTdHJpbmcsIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJzZWNvbmR0ZXN0U3RyaW5nIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW119LAorICAgICAgc2Vjb25kX3NlcnZpY2VfdGhyaWZ0OmZ1bmN0aW9uX2luZm8oc2Vjb25kdGVzdFN0cmluZywgZXhjZXB0aW9ucykKKyAgICApfQorICBdLgpkaWZmIC0tZ2l0IGEvbGliL2dvL01ha2VmaWxlLmFtIGIvbGliL2dvL01ha2VmaWxlLmFtCmluZGV4IGZmOTQ2ZWEuLjBkZmE1ZmEgMTAwNjQ0Ci0tLSBhL2xpYi9nby9NYWtlZmlsZS5hbQorKysgYi9saWIvZ28vTWFrZWZpbGUuYW0KQEAgLTMxLDEwICszMSwxMyBAQAogCUBlY2hvICcjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIycKIAogY2hlY2stbG9jYWw6Ci0JJChHTykgdGVzdCAuL3RocmlmdAorCUdPUEFUSD1gcHdkYCAkKEdPKSB0ZXN0IC1yYWNlIC4vdGhyaWZ0CisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yZiBwa2cKIAogYWxsLWxvY2FsOgotCSQoR08pIGJ1aWxkIC4vdGhyaWZ0CisJR09QQVRIPWBwd2RgICQoR08pIGJ1aWxkIC4vdGhyaWZ0CiAKIEVYVFJBX0RJU1QgPSBcCiAJdGhyaWZ0IFwKZGlmZiAtLWdpdCBhL2xpYi9nby9SRUFETUUubWQgYi9saWIvZ28vUkVBRE1FLm1kCmluZGV4IDFlMTQzNDIuLmNlNmQ1ZWQgMTAwNjQ0Ci0tLSBhL2xpYi9nby9SRUFETUUubWQKKysrIGIvbGliL2dvL1JFQURNRS5tZApAQCAtMjQsMTAgKzI0LDEyIEBACiBVc2luZyBUaHJpZnQgd2l0aCBHbwogPT09PT09PT09PT09PT09PT09PT0KIAorVGhyaWZ0IHN1cHBvcnRzIEdvIDEuNysKKwogSW4gZm9sbG93aW5nIEdvIGNvbnZlbnRpb25zLCB3ZSByZWNvbW1lbmQgeW91IHVzZSB0aGUgJ2dvJyB0b29sIHRvIGluc3RhbGwKIFRocmlmdCBmb3IgZ28uCiAKLSAgICAkIGdvIGdldCBnaXQuYXBhY2hlLm9yZy90aHJpZnQuZ2l0L2xpYi9nby90aHJpZnQvLi4uCisgICAgJCBnbyBnZXQgZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L2xpYi9nby90aHJpZnQvLi4uCiAKIFdpbGwgcmV0cmlldmUgYW5kIGluc3RhbGwgdGhlIG1vc3QgcmVjZW50IHZlcnNpb24gb2YgdGhlIHBhY2thZ2UuCiAKQEAgLTY0LDMgKzY2LDE4IEBACiAKIEFuZCBzbyBvbi4gVGhlIGNvZGUgZ2VuZXJhdG9yIGFsc28gY3JlYXRlcyBhbmFsb2dvdXMgaGVscGVycyBmb3IgdXNlci1kZWZpbmVkCiB0eXBlZGVmcyBhbmQgZW51bXMuCisKK0FkZGluZyBjdXN0b20gdGFncyB0byBnZW5lcmF0ZWQgVGhyaWZ0IHN0cnVjdHMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworWW91IGNhbiBhZGQgdGFncyB0byB0aGUgYXV0by1nZW5lcmF0ZWQgdGhyaWZ0IHN0cnVjdHMgdXNpbmcgdGhlIGZvbGxvd2luZyBmb3JtYXQ6CisKKyAgICBzdHJ1Y3QgZm9vIHsKKyAgICAgIDE6IHJlcXVpcmVkIHN0cmluZyBCYXIgKGdvLnRhZyA9ICJzb21lX3RhZzpcInNvbWVfdGFnX3ZhbHVlXCIiKQorICAgIH0KKyAgICAKK3doaWNoIHdpbGwgZ2VuZXJhdGU6CisKKyAgICB0eXBlIEZvbyBzdHJ1Y3QgeworICAgICAgQmFyIHN0cmluZyBgdGhyaWZ0OiJiYXIsMSxyZXF1aXJlZCIgc29tZV90YWc6InNvbWVfdGFnX3ZhbHVlImAKKyAgICB9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC9NYWtlZmlsZS5hbSBiL2xpYi9nby90ZXN0L01ha2VmaWxlLmFtCmluZGV4IGJiY2VjOTYuLjc4ZDQ2ODEgMTAwNjQ0Ci0tLSBhL2xpYi9nby90ZXN0L01ha2VmaWxlLmFtCisrKyBiL2xpYi9nby90ZXN0L01ha2VmaWxlLmFtCkBAIC0xNyw4ICsxNyw3IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1USFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAotVEhSSUZUQVJHUyA9IC1vdXQgZ29wYXRoL3NyYy8gLS1nZW4gZ286dGhyaWZ0X2ltcG9ydD10aHJpZnQKK1RIUklGVEFSR1MgPSAtb3V0IGdvcGF0aC9zcmMvIC0tZ2VuIGdvOnRocmlmdF9pbXBvcnQ9dGhyaWZ0JChDT01QSUxFUl9FWFRSQUZMQUcpCiBUSFJJRlRURVNUID0gJCh0b3Bfc3JjZGlyKS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CiAKICMgVGhyaWZ0IGZvciBHTyBoYXMgcHJvYmxlbXMgd2l0aCBjb21wbGV4IG1hcCBrZXlzOiBUSFJJRlQtMjA2MwpAQCAtMjgsMTEgKzI3LDEzIEBACiAJCQkJTXVsdGlwbGV4ZWRQcm90b2NvbFRlc3QudGhyaWZ0IFwKIAkJCQlPbmV3YXlUZXN0LnRocmlmdCBcCiAJCQkJT3B0aW9uYWxGaWVsZHNUZXN0LnRocmlmdCBcCisJCQkJUmVxdWlyZWRGaWVsZFRlc3QudGhyaWZ0IFwKIAkJCQlTZXJ2aWNlc1Rlc3QudGhyaWZ0IFwKIAkJCQlHb1RhZ1Rlc3QudGhyaWZ0IFwKIAkJCQlUeXBlZGVmRmllbGRUZXN0LnRocmlmdCBcCiAJCQkJUmVmQW5ub3RhdGlvbkZpZWxkc1Rlc3QudGhyaWZ0IFwKIAkJCQlVbmlvbkRlZmF1bHRWYWx1ZVRlc3QudGhyaWZ0IFwKKwkJCQlVbmlvbkJpbmFyeVRlc3QudGhyaWZ0IFwKIAkJCQlFcnJvclRlc3QudGhyaWZ0IFwKIAkJCQlOYW1lc1Rlc3QudGhyaWZ0IFwKIAkJCQlJbml0aWFsaXNtc1Rlc3QudGhyaWZ0IFwKQEAgLTQ2LDE2ICs0NywyMCBAQAogCSQoVEhSSUZUKSAkKFRIUklGVEFSR1MpIE11bHRpcGxleGVkUHJvdG9jb2xUZXN0LnRocmlmdAogCSQoVEhSSUZUKSAkKFRIUklGVEFSR1MpIE9uZXdheVRlc3QudGhyaWZ0CiAJJChUSFJJRlQpICQoVEhSSUZUQVJHUykgT3B0aW9uYWxGaWVsZHNUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAkKFRIUklGVEFSR1MpIFJlcXVpcmVkRmllbGRUZXN0LnRocmlmdAogCSQoVEhSSUZUKSAkKFRIUklGVEFSR1MpIFNlcnZpY2VzVGVzdC50aHJpZnQKIAkkKFRIUklGVCkgJChUSFJJRlRBUkdTKSBHb1RhZ1Rlc3QudGhyaWZ0CiAJJChUSFJJRlQpICQoVEhSSUZUQVJHUykgVHlwZWRlZkZpZWxkVGVzdC50aHJpZnQKIAkkKFRIUklGVCkgJChUSFJJRlRBUkdTKSBSZWZBbm5vdGF0aW9uRmllbGRzVGVzdC50aHJpZnQKIAkkKFRIUklGVCkgJChUSFJJRlRBUkdTKSBVbmlvbkRlZmF1bHRWYWx1ZVRlc3QudGhyaWZ0CisJJChUSFJJRlQpICQoVEhSSUZUQVJHUykgVW5pb25CaW5hcnlUZXN0LnRocmlmdAogCSQoVEhSSUZUKSAkKFRIUklGVEFSR1MpIEVycm9yVGVzdC50aHJpZnQKIAkkKFRIUklGVCkgJChUSFJJRlRBUkdTKSBOYW1lc1Rlc3QudGhyaWZ0CiAJJChUSFJJRlQpICQoVEhSSUZUQVJHUykgSW5pdGlhbGlzbXNUZXN0LnRocmlmdAogCSQoVEhSSUZUKSAkKFRIUklGVEFSR1MpLHJlYWRfd3JpdGVfcHJpdmF0ZSBEb250RXhwb3J0UldUZXN0LnRocmlmdAogCSQoVEhSSUZUKSAkKFRIUklGVEFSR1MpLGlnbm9yZV9pbml0aWFsaXNtcyBJZ25vcmVJbml0aWFsaXNtc1Rlc3QudGhyaWZ0CisJR09QQVRIPWBwd2RgL2dvcGF0aCAkKEdPKSBnZXQgZ2l0aHViLmNvbS9nb2xhbmcvbW9jay9nb21vY2sgfHwgdHJ1ZQorCXNlZCAtaSAncy9cImNvbnRleHRcIi9cImdvbGFuZy5vcmdcL3hcL25ldFwvY29udGV4dFwiL2cnIGdvcGF0aC9zcmMvZ2l0aHViLmNvbS9nb2xhbmcvbW9jay9nb21vY2svY29udHJvbGxlci5nbyB8fCB0cnVlCiAJR09QQVRIPWBwd2RgL2dvcGF0aCAkKEdPKSBnZXQgZ2l0aHViLmNvbS9nb2xhbmcvbW9jay9nb21vY2sKIAlsbiAtbmZzIC4uLy4uLy4uL3RocmlmdCBnb3BhdGgvc3JjL3RocmlmdAogCWxuIC1uZnMgLi4vLi4vdGVzdHMgZ29wYXRoL3NyYy90ZXN0cwpAQCAtNzMsNyArNzgsOCBAQAogCQkJCW5hbWVzdGVzdCBcCiAJCQkJaW5pdGlhbGlzbXN0ZXN0IFwKIAkJCQlkb250ZXhwb3J0cnd0ZXN0IFwKLQkJCQlpZ25vcmVpbml0aWFsaXNtc3Rlc3QKKwkJCQlpZ25vcmVpbml0aWFsaXNtc3Rlc3QgXAorCQkJCXVuaW9uYmluYXJ5dGVzdAogCUdPUEFUSD1gcHdkYC9nb3BhdGggJChHTykgdGVzdCB0aHJpZnQgdGVzdHMgZG9udGV4cG9ydHJ3dGVzdAogCiBjbGVhbi1sb2NhbDoKQEAgLTkyLDggKzk4LDEwIEBACiAJTmFtZXNwYWNlZFRlc3QudGhyaWZ0IFwKIAlPbmV3YXlUZXN0LnRocmlmdCBcCiAJT3B0aW9uYWxGaWVsZHNUZXN0LnRocmlmdCBcCisJUmVxdWlyZWRGaWVsZFRlc3QudGhyaWZ0IFwKIAlSZWZBbm5vdGF0aW9uRmllbGRzVGVzdC50aHJpZnQgXAogCVVuaW9uRGVmYXVsdFZhbHVlVGVzdC50aHJpZnQgXAorCVVuaW9uQmluYXJ5VGVzdC50aHJpZnQgXAogCVNlcnZpY2VzVGVzdC50aHJpZnQgXAogCVR5cGVkZWZGaWVsZFRlc3QudGhyaWZ0IFwKIAlFcnJvclRlc3QudGhyaWZ0IFwKZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L1JlcXVpcmVkRmllbGRUZXN0LnRocmlmdCBiL2xpYi9nby90ZXN0L1JlcXVpcmVkRmllbGRUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTJkY2FlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvUmVxdWlyZWRGaWVsZFRlc3QudGhyaWZ0CkBAIC0wLDAgKzEsNyBAQAorc3RydWN0IFJlcXVpcmVkRmllbGQgeworICAxOiByZXF1aXJlZCBzdHJpbmcgbmFtZQorfQorCitzdHJ1Y3QgT3RoZXJUaGluZyB7CisgIDE6IHJlcXVpcmVkIGkxNiB2YWx1ZQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvVW5pb25CaW5hcnlUZXN0LnRocmlmdCBiL2xpYi9nby90ZXN0L1VuaW9uQmluYXJ5VGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc3MTEyYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L1VuaW9uQmluYXJ5VGVzdC50aHJpZnQKQEAgLTAsMCArMSwyNSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgU2VlIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ1NzMKK3VuaW9uIFNhbXBsZSB7CisgIDE6IG1hcDxzdHJpbmcsIHN0cmluZz4gdTEsCisgIDI6IGJpbmFyeSB1MiwKKyAgMzogbGlzdDxzdHJpbmc+IHUzCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC9kb250ZXhwb3J0cnd0ZXN0L2NvbXBpbGVfdGVzdC5nbyBiL2xpYi9nby90ZXN0L2RvbnRleHBvcnRyd3Rlc3QvY29tcGlsZV90ZXN0LmdvCmluZGV4IDJiODc3ZTMuLmNmNjc2M2UgMTAwNjQ0Ci0tLSBhL2xpYi9nby90ZXN0L2RvbnRleHBvcnRyd3Rlc3QvY29tcGlsZV90ZXN0LmdvCisrKyBiL2xpYi9nby90ZXN0L2RvbnRleHBvcnRyd3Rlc3QvY29tcGlsZV90ZXN0LmdvCkBAIC0yMCw3ICsyMCw2IEBACiBwYWNrYWdlIGRvbnRleHBvcnRyd3Rlc3QKIAogaW1wb3J0ICgKLQkiZm10IgogCSJ0ZXN0aW5nIgogKQogCkBAIC0yOSwxMCArMjgsMTAgQEAKIGZ1bmMgVGVzdFJlYWRXcml0ZU1ldGhvZHNBcmVQcml2YXRlKHQgKnRlc3RpbmcuVCkgewogCS8vIFRoaXMgd2lsbCBvbmx5IGNvbXBpbGUgaWYgcmVhZC93cml0ZSBtZXRob2RzIGV4aXN0CiAJcyA6PSBOZXdUZXN0U3RydWN0KCkKLQlmbXQuU3ByaW50ZigiJXYiLCBzLnJlYWQpCi0JZm10LlNwcmludGYoIiV2Iiwgcy53cml0ZSkKKwlfID0gcy5yZWFkCisJXyA9IHMud3JpdGUKIAogCWlzIDo9IE5ld0lubmVyU3RydWN0KCkKLQlmbXQuU3ByaW50ZigiJXYiLCBpcy5yZWFkKQotCWZtdC5TcHJpbnRmKCIldiIsIGlzLndyaXRlKQorCV8gPSBpcy5yZWFkCisJXyA9IGlzLndyaXRlCiB9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC90ZXN0cy9jbGllbnRfZXJyb3JfdGVzdC5nbyBiL2xpYi9nby90ZXN0L3Rlc3RzL2NsaWVudF9lcnJvcl90ZXN0LmdvCmluZGV4IDgyOWExZGQuLmZkZWM0ZWEgMTAwNjQ0Ci0tLSBhL2xpYi9nby90ZXN0L3Rlc3RzL2NsaWVudF9lcnJvcl90ZXN0LmdvCisrKyBiL2xpYi9nby90ZXN0L3Rlc3RzL2NsaWVudF9lcnJvcl90ZXN0LmdvCkBAIC0yMCwxMSArMjAsMTMgQEAKIHBhY2thZ2UgdGVzdHMKIAogaW1wb3J0ICgKLQkiZ2l0aHViLmNvbS9nb2xhbmcvbW9jay9nb21vY2siCisJImNvbnRleHQiCiAJImVycm9ycyIKIAkiZXJyb3J0ZXN0IgogCSJ0ZXN0aW5nIgogCSJ0aHJpZnQiCisKKwkiZ2l0aHViLmNvbS9nb2xhbmcvbW9jay9nb21vY2siCiApCiAKIC8vIFRlc3RDYXNlOiBDb21wcmVoZW5zaXZlIGNhbGwgYW5kIHJlcGx5IHdvcmtmbG93IGluIHRoZSBjbGllbnQuCkBAIC0yMTEsNyArMjEzLDcgQEAKIAlpZiBmYWlsQXQgPT0gMjUgewogCQllcnIgPSBmYWlsV2l0aAogCX0KLQlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuRmx1c2goKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKIAlpZiBmYWlsQXQgPT0gMjUgewogCQlyZXR1cm4gdHJ1ZQogCX0KQEAgLTM5NywxMiArMzk5LDQ0IEBACiAvLyBFeHBlY3RpbmcgVFRyYW5zcG9ydEVycm9yIG9uIGZhaWwuCiBmdW5jIFRlc3RDbGllbnRSZXBvcnRUVHJhbnNwb3J0RXJyb3JzKHQgKnRlc3RpbmcuVCkgewogCW1vY2tDdHJsIDo9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCi0JdHJhbnNwb3J0IDo9IHRocmlmdC5OZXdUTWVtb3J5QnVmZmVyKCkKIAogCXRoaW5nIDo9IGVycm9ydGVzdC5OZXdUZXN0U3RydWN0KCkKIAl0aGluZy5NID0gbWFrZShtYXBbc3RyaW5nXXN0cmluZykKIAl0aGluZy5MID0gbWFrZShbXXN0cmluZywgMCkKLQl0aGluZy5TID0gbWFrZShtYXBbc3RyaW5nXWJvb2wpCisJdGhpbmcuUyA9IG1ha2UoW11zdHJpbmcsIDApCisJdGhpbmcuSSA9IDMKKworCWVyciA6PSB0aHJpZnQuTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbih0aHJpZnQuVElNRURfT1VULCAidGVzdCIpCisJZm9yIGkgOj0gMDsgOyBpKysgeworCQlwcm90b2NvbCA6PSBOZXdNb2NrVFByb3RvY29sKG1vY2tDdHJsKQorCQlpZiAhcHJlcGFyZUNsaWVudENhbGxSZXBseShwcm90b2NvbCwgaSwgZXJyKSB7CisJCQlyZXR1cm4KKwkJfQorCQljbGllbnQgOj0gZXJyb3J0ZXN0Lk5ld0Vycm9yVGVzdENsaWVudCh0aHJpZnQuTmV3VFN0YW5kYXJkQ2xpZW50KHByb3RvY29sLCBwcm90b2NvbCkpCisJCV8sIHJldEVyciA6PSBjbGllbnQuVGVzdFN0cnVjdChkZWZhdWx0Q3R4LCB0aGluZykKKwkJbW9ja0N0cmwuRmluaXNoKCkKKwkJbW9ja0N0cmwgPSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCQllcnIyLCBvayA6PSByZXRFcnIuKHRocmlmdC5UVHJhbnNwb3J0RXhjZXB0aW9uKQorCQlpZiAhb2sgeworCQkJdC5GYXRhbCgiRXhwZWN0ZWQgYSBUVHJhc3BvcnRFeGNlcHRpb24iKQorCQl9CisKKwkJaWYgZXJyMi5UeXBlSWQoKSAhPSB0aHJpZnQuVElNRURfT1VUIHsKKwkJCXQuRmF0YWwoIkV4cGVjdGVkIFRJTUVEX09VVCBlcnJvciIpCisJCX0KKwl9Cit9CisKKy8vIFRlc3RDYXNlOiBDb21wcmVoZW5zaXZlIGNhbGwgYW5kIHJlcGx5IHdvcmtmbG93IGluIHRoZSBjbGllbnQuCisvLyBFeHBlY3RpbmcgVFRyYW5zcG9ydEVycm9yIG9uIGZhaWwuCisvLyBTaW1pbGFyIHRvIFRlc3RDbGllbnRSZXBvcnRUVHJhbnNwb3J0RXJyb3JzLCBidXQgdXNpbmcgbGVnYWN5IGNsaWVudCBjb25zdHJ1Y3Rvci4KK2Z1bmMgVGVzdENsaWVudFJlcG9ydFRUcmFuc3BvcnRFcnJvcnNMZWdhY3kodCAqdGVzdGluZy5UKSB7CisJbW9ja0N0cmwgOj0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKwl0cmFuc3BvcnQgOj0gdGhyaWZ0Lk5ld1RNZW1vcnlCdWZmZXIoKQorCXRoaW5nIDo9IGVycm9ydGVzdC5OZXdUZXN0U3RydWN0KCkKKwl0aGluZy5NID0gbWFrZShtYXBbc3RyaW5nXXN0cmluZykKKwl0aGluZy5MID0gbWFrZShbXXN0cmluZywgMCkKKwl0aGluZy5TID0gbWFrZShbXXN0cmluZywgMCkKIAl0aGluZy5JID0gMwogCiAJZXJyIDo9IHRocmlmdC5OZXdUVHJhbnNwb3J0RXhjZXB0aW9uKHRocmlmdC5USU1FRF9PVVQsICJ0ZXN0IikKQEAgLTQxMiw4ICs0NDYsOSBAQAogCQkJcmV0dXJuCiAJCX0KIAkJY2xpZW50IDo9IGVycm9ydGVzdC5OZXdFcnJvclRlc3RDbGllbnRQcm90b2NvbCh0cmFuc3BvcnQsIHByb3RvY29sLCBwcm90b2NvbCkKLQkJXywgcmV0RXJyIDo9IGNsaWVudC5UZXN0U3RydWN0KHRoaW5nKQorCQlfLCByZXRFcnIgOj0gY2xpZW50LlRlc3RTdHJ1Y3QoZGVmYXVsdEN0eCwgdGhpbmcpCiAJCW1vY2tDdHJsLkZpbmlzaCgpCisJCW1vY2tDdHJsID0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKIAkJZXJyMiwgb2sgOj0gcmV0RXJyLih0aHJpZnQuVFRyYW5zcG9ydEV4Y2VwdGlvbikKIAkJaWYgIW9rIHsKIAkJCXQuRmF0YWwoIkV4cGVjdGVkIGEgVFRyYXNwb3J0RXhjZXB0aW9uIikKQEAgLTQyOSwxMiArNDY0LDQzIEBACiAvLyBFeHBlY3RpbmcgVFRQcm90b2NvbEVycm9ycyBvbiBmYWlsLgogZnVuYyBUZXN0Q2xpZW50UmVwb3J0VFByb3RvY29sRXJyb3JzKHQgKnRlc3RpbmcuVCkgewogCW1vY2tDdHJsIDo9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCi0JdHJhbnNwb3J0IDo9IHRocmlmdC5OZXdUTWVtb3J5QnVmZmVyKCkKIAogCXRoaW5nIDo9IGVycm9ydGVzdC5OZXdUZXN0U3RydWN0KCkKIAl0aGluZy5NID0gbWFrZShtYXBbc3RyaW5nXXN0cmluZykKIAl0aGluZy5MID0gbWFrZShbXXN0cmluZywgMCkKLQl0aGluZy5TID0gbWFrZShtYXBbc3RyaW5nXWJvb2wpCisJdGhpbmcuUyA9IG1ha2UoW11zdHJpbmcsIDApCisJdGhpbmcuSSA9IDMKKworCWVyciA6PSB0aHJpZnQuTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUodGhyaWZ0LklOVkFMSURfREFUQSwgZXJyb3JzLk5ldygidGVzdCIpKQorCWZvciBpIDo9IDA7IDsgaSsrIHsKKwkJcHJvdG9jb2wgOj0gTmV3TW9ja1RQcm90b2NvbChtb2NrQ3RybCkKKwkJaWYgIXByZXBhcmVDbGllbnRDYWxsUmVwbHkocHJvdG9jb2wsIGksIGVycikgeworCQkJcmV0dXJuCisJCX0KKwkJY2xpZW50IDo9IGVycm9ydGVzdC5OZXdFcnJvclRlc3RDbGllbnQodGhyaWZ0Lk5ld1RTdGFuZGFyZENsaWVudChwcm90b2NvbCwgcHJvdG9jb2wpKQorCQlfLCByZXRFcnIgOj0gY2xpZW50LlRlc3RTdHJ1Y3QoZGVmYXVsdEN0eCwgdGhpbmcpCisJCW1vY2tDdHJsLkZpbmlzaCgpCisJCW1vY2tDdHJsID0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKwkJZXJyMiwgb2sgOj0gcmV0RXJyLih0aHJpZnQuVFByb3RvY29sRXhjZXB0aW9uKQorCQlpZiAhb2sgeworCQkJdC5GYXRhbCgiRXhwZWN0ZWQgYSBUUHJvdG9jb2xFeGNlcHRpb24iKQorCQl9CisJCWlmIGVycjIuVHlwZUlkKCkgIT0gdGhyaWZ0LklOVkFMSURfREFUQSB7CisJCQl0LkZhdGFsKCJFeHBlY3RlZCBJTlZBTElEX0RBVEEgZXJyb3IiKQorCQl9CisJfQorfQorCisvLyBUZXN0Q2FzZTogQ29tcHJlaGVuc2l2ZSBjYWxsIGFuZCByZXBseSB3b3JrZmxvdyBpbiB0aGUgY2xpZW50LgorLy8gRXhwZWN0aW5nIFRUUHJvdG9jb2xFcnJvcnMgb24gZmFpbC4KKy8vIFNpbWlsYXIgdG8gVGVzdENsaWVudFJlcG9ydFRQcm90b2NvbEVycm9ycywgYnV0IHVzaW5nIGxlZ2FjeSBjbGllbnQgY29uc3RydWN0b3IuCitmdW5jIFRlc3RDbGllbnRSZXBvcnRUUHJvdG9jb2xFcnJvcnNMZWdhY3kodCAqdGVzdGluZy5UKSB7CisJbW9ja0N0cmwgOj0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKwl0cmFuc3BvcnQgOj0gdGhyaWZ0Lk5ld1RNZW1vcnlCdWZmZXIoKQorCXRoaW5nIDo9IGVycm9ydGVzdC5OZXdUZXN0U3RydWN0KCkKKwl0aGluZy5NID0gbWFrZShtYXBbc3RyaW5nXXN0cmluZykKKwl0aGluZy5MID0gbWFrZShbXXN0cmluZywgMCkKKwl0aGluZy5TID0gbWFrZShbXXN0cmluZywgMCkKIAl0aGluZy5JID0gMwogCiAJZXJyIDo9IHRocmlmdC5OZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZSh0aHJpZnQuSU5WQUxJRF9EQVRBLCBlcnJvcnMuTmV3KCJ0ZXN0IikpCkBAIC00NDQsOCArNTEwLDkgQEAKIAkJCXJldHVybgogCQl9CiAJCWNsaWVudCA6PSBlcnJvcnRlc3QuTmV3RXJyb3JUZXN0Q2xpZW50UHJvdG9jb2wodHJhbnNwb3J0LCBwcm90b2NvbCwgcHJvdG9jb2wpCi0JCV8sIHJldEVyciA6PSBjbGllbnQuVGVzdFN0cnVjdCh0aGluZykKKwkJXywgcmV0RXJyIDo9IGNsaWVudC5UZXN0U3RydWN0KGRlZmF1bHRDdHgsIHRoaW5nKQogCQltb2NrQ3RybC5GaW5pc2goKQorCQltb2NrQ3RybCA9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCiAJCWVycjIsIG9rIDo9IHJldEVyci4odGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbikKIAkJaWYgIW9rIHsKIAkJCXQuRmF0YWwoIkV4cGVjdGVkIGEgVFByb3RvY29sRXhjZXB0aW9uIikKQEAgLTQ3MCw3ICs1MzcsNyBAQAogCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkU3RvcCgpLkFmdGVyKGxhc3QpCiAJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RydWN0RW5kKCkuQWZ0ZXIobGFzdCkKIAlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVNZXNzYWdlRW5kKCkuQWZ0ZXIobGFzdCkKLQlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuRmx1c2goKS5BZnRlcihsYXN0KQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkuQWZ0ZXIobGFzdCkKIAogCS8vIFJlYWRpbmcgdGhlIGV4Y2VwdGlvbiwgbWlnaHQgZmFpbC4KIAlpZiBmYWlsQXQgPT0gMCB7CkBAIC01NTcsMTYgKzYyNCw1MiBAQAogLy8gVGVzdENhc2U6IGNhbGwgYW5kIHJlcGx5IHdpdGggZXhjZXB0aW9uIHdvcmtmbG93IGluIHRoZSBjbGllbnQuCiBmdW5jIFRlc3RDbGllbnRDYWxsRXhjZXB0aW9uKHQgKnRlc3RpbmcuVCkgewogCW1vY2tDdHJsIDo9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCi0JdHJhbnNwb3J0IDo9IHRocmlmdC5OZXdUTWVtb3J5QnVmZmVyKCkKIAogCWVyciA6PSB0aHJpZnQuTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbih0aHJpZnQuVElNRURfT1VULCAidGVzdCIpCiAJZm9yIGkgOj0gMDsgOyBpKysgewogCQlwcm90b2NvbCA6PSBOZXdNb2NrVFByb3RvY29sKG1vY2tDdHJsKQogCQl3aWxsQ29tcGxldGUgOj0gIXByZXBhcmVDbGllbnRDYWxsRXhjZXB0aW9uKHByb3RvY29sLCBpLCBlcnIpCiAKLQkJY2xpZW50IDo9IGVycm9ydGVzdC5OZXdFcnJvclRlc3RDbGllbnRQcm90b2NvbCh0cmFuc3BvcnQsIHByb3RvY29sLCBwcm90b2NvbCkKLQkJXywgcmV0RXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nKCJ0ZXN0IikKKwkJY2xpZW50IDo9IGVycm9ydGVzdC5OZXdFcnJvclRlc3RDbGllbnQodGhyaWZ0Lk5ld1RTdGFuZGFyZENsaWVudChwcm90b2NvbCwgcHJvdG9jb2wpKQorCQlfLCByZXRFcnIgOj0gY2xpZW50LlRlc3RTdHJpbmcoZGVmYXVsdEN0eCwgInRlc3QiKQogCQltb2NrQ3RybC5GaW5pc2goKQorCQltb2NrQ3RybCA9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisKKwkJaWYgIXdpbGxDb21wbGV0ZSB7CisJCQllcnIyLCBvayA6PSByZXRFcnIuKHRocmlmdC5UVHJhbnNwb3J0RXhjZXB0aW9uKQorCQkJaWYgIW9rIHsKKwkJCQl0LkZhdGFsKCJFeHBlY3RlZCBhIFRUcmFuc3BvcnRFeGNlcHRpb24iKQorCQkJfQorCQkJaWYgZXJyMi5UeXBlSWQoKSAhPSB0aHJpZnQuVElNRURfT1VUIHsKKwkJCQl0LkZhdGFsKCJFeHBlY3RlZCBUSU1FRF9PVVQgZXJyb3IiKQorCQkJfQorCQl9IGVsc2UgeworCQkJZXJyMiwgb2sgOj0gcmV0RXJyLih0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKQorCQkJaWYgIW9rIHsKKwkJCQl0LkZhdGFsKCJFeHBlY3RlZCBhIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpCisJCQl9CisJCQlpZiBlcnIyLlR5cGVJZCgpICE9IHRocmlmdC5QUk9UT0NPTF9FUlJPUiB7CisJCQkJdC5GYXRhbCgiRXhwZWN0ZWQgUFJPVE9DT0xfRVJST1IgZXJyb3IiKQorCQkJfQorCQkJYnJlYWsKKwkJfQorCX0KK30KKworLy8gVGVzdENhc2U6IGNhbGwgYW5kIHJlcGx5IHdpdGggZXhjZXB0aW9uIHdvcmtmbG93IGluIHRoZSBjbGllbnQuCisvLyBTaW1pbGFyIHRvIFRlc3RDbGllbnRDYWxsRXhjZXB0aW9uLCBidXQgdXNpbmcgbGVnYWN5IGNsaWVudCBjb25zdHJ1Y3Rvci4KK2Z1bmMgVGVzdENsaWVudENhbGxFeGNlcHRpb25MZWdhY3kodCAqdGVzdGluZy5UKSB7CisJbW9ja0N0cmwgOj0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKwl0cmFuc3BvcnQgOj0gdGhyaWZ0Lk5ld1RNZW1vcnlCdWZmZXIoKQorCWVyciA6PSB0aHJpZnQuTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbih0aHJpZnQuVElNRURfT1VULCAidGVzdCIpCisJZm9yIGkgOj0gMDsgOyBpKysgeworCQlwcm90b2NvbCA6PSBOZXdNb2NrVFByb3RvY29sKG1vY2tDdHJsKQorCQl3aWxsQ29tcGxldGUgOj0gIXByZXBhcmVDbGllbnRDYWxsRXhjZXB0aW9uKHByb3RvY29sLCBpLCBlcnIpCisKKwkJY2xpZW50IDo9IGVycm9ydGVzdC5OZXdFcnJvclRlc3RDbGllbnRQcm90b2NvbCh0cmFuc3BvcnQsIHByb3RvY29sLCBwcm90b2NvbCkKKwkJXywgcmV0RXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nKGRlZmF1bHRDdHgsICJ0ZXN0IikKKwkJbW9ja0N0cmwuRmluaXNoKCkKKwkJbW9ja0N0cmwgPSBnb21vY2suTmV3Q29udHJvbGxlcih0KQogCiAJCWlmICF3aWxsQ29tcGxldGUgewogCQkJZXJyMiwgb2sgOj0gcmV0RXJyLih0aHJpZnQuVFRyYW5zcG9ydEV4Y2VwdGlvbikKQEAgLTU5Miw2ICs2OTUsMzYgQEAKIC8vIFRlc3RDYXNlOiBNaXNtYXRjaGluZyBzZXF1ZW5jZSBpZCBoYXMgYmVlbiByZWNlaXZlZCBpbiB0aGUgY2xpZW50LgogZnVuYyBUZXN0Q2xpZW50U2VxSWRNaXNtYXRjaCh0ICp0ZXN0aW5nLlQpIHsKIAltb2NrQ3RybCA6PSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCXByb3RvY29sIDo9IE5ld01vY2tUUHJvdG9jb2wobW9ja0N0cmwpCisJZ29tb2NrLkluT3JkZXIoCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlTWVzc2FnZUJlZ2luKCJ0ZXN0U3RyaW5nIiwgdGhyaWZ0LkNBTEwsIGludDMyKDEpKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJ1Y3RCZWdpbigidGVzdFN0cmluZ19hcmdzIiksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRCZWdpbigicyIsIHRocmlmdC5UVHlwZSh0aHJpZnQuU1RSSU5HKSwgaW50MTYoMSkpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cmluZygidGVzdCIpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkRW5kKCksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRTdG9wKCksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RydWN0RW5kKCksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlTWVzc2FnZUVuZCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSksCisJCXByb3RvY29sLkVYUEVDVCgpLlJlYWRNZXNzYWdlQmVnaW4oKS5SZXR1cm4oInRlc3RTdHJpbmciLCB0aHJpZnQuUkVQTFksIGludDMyKDIpLCBuaWwpLAorCSkKKworCWNsaWVudCA6PSBlcnJvcnRlc3QuTmV3RXJyb3JUZXN0Q2xpZW50KHRocmlmdC5OZXdUU3RhbmRhcmRDbGllbnQocHJvdG9jb2wsIHByb3RvY29sKSkKKwlfLCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmcoZGVmYXVsdEN0eCwgInRlc3QiKQorCW1vY2tDdHJsLkZpbmlzaCgpCisJYXBwRXJyLCBvayA6PSBlcnIuKHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24pCisJaWYgIW9rIHsKKwkJdC5GYXRhbCgiRXhwZWN0ZWQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIikKKwl9CisJaWYgYXBwRXJyLlR5cGVJZCgpICE9IHRocmlmdC5CQURfU0VRVUVOQ0VfSUQgeworCQl0LkZhdGFsKCJFeHBlY3RlZCBCQURfU0VRVUVOQ0VfSUQgZXJyb3IiKQorCX0KK30KKworLy8gVGVzdENhc2U6IE1pc21hdGNoaW5nIHNlcXVlbmNlIGlkIGhhcyBiZWVuIHJlY2VpdmVkIGluIHRoZSBjbGllbnQuCisvLyBTaW1pbGFyIHRvIFRlc3RDbGllbnRTZXFJZE1pc21hdGNoLCBidXQgdXNpbmcgbGVnYWN5IGNsaWVudCBjb25zdHJ1Y3Rvci4KK2Z1bmMgVGVzdENsaWVudFNlcUlkTWlzbWF0Y2hMZWdlYWN5KHQgKnRlc3RpbmcuVCkgeworCW1vY2tDdHJsIDo9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCiAJdHJhbnNwb3J0IDo9IHRocmlmdC5OZXdUTWVtb3J5QnVmZmVyKCkKIAlwcm90b2NvbCA6PSBOZXdNb2NrVFByb3RvY29sKG1vY2tDdHJsKQogCWdvbW9jay5Jbk9yZGVyKApAQCAtNjAzLDEyICs3MzYsMTIgQEAKIAkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZFN0b3AoKSwKIAkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJ1Y3RFbmQoKSwKIAkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVNZXNzYWdlRW5kKCksCi0JCXByb3RvY29sLkVYUEVDVCgpLkZsdXNoKCksCisJCXByb3RvY29sLkVYUEVDVCgpLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKSwKIAkJcHJvdG9jb2wuRVhQRUNUKCkuUmVhZE1lc3NhZ2VCZWdpbigpLlJldHVybigidGVzdFN0cmluZyIsIHRocmlmdC5SRVBMWSwgaW50MzIoMiksIG5pbCksCiAJKQogCiAJY2xpZW50IDo9IGVycm9ydGVzdC5OZXdFcnJvclRlc3RDbGllbnRQcm90b2NvbCh0cmFuc3BvcnQsIHByb3RvY29sLCBwcm90b2NvbCkKLQlfLCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmcoInRlc3QiKQorCV8sIGVyciA6PSBjbGllbnQuVGVzdFN0cmluZyhkZWZhdWx0Q3R4LCAidGVzdCIpCiAJbW9ja0N0cmwuRmluaXNoKCkKIAlhcHBFcnIsIG9rIDo9IGVyci4odGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbikKIAlpZiAhb2sgewpAQCAtNjIyLDYgKzc1NSwzNiBAQAogLy8gVGVzdENhc2U6IFdyb25nIG1ldGhvZCBuYW1lIGhhcyBiZWVuIHJlY2VpdmVkIGluIHRoZSBjbGllbnQuCiBmdW5jIFRlc3RDbGllbnRXcm9uZ01ldGhvZE5hbWUodCAqdGVzdGluZy5UKSB7CiAJbW9ja0N0cmwgOj0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKwlwcm90b2NvbCA6PSBOZXdNb2NrVFByb3RvY29sKG1vY2tDdHJsKQorCWdvbW9jay5Jbk9yZGVyKAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZU1lc3NhZ2VCZWdpbigidGVzdFN0cmluZyIsIHRocmlmdC5DQUxMLCBpbnQzMigxKSksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RydWN0QmVnaW4oInRlc3RTdHJpbmdfYXJncyIpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkQmVnaW4oInMiLCB0aHJpZnQuVFR5cGUodGhyaWZ0LlNUUklORyksIGludDE2KDEpKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJpbmcoInRlc3QiKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZEVuZCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkU3RvcCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEVuZCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZU1lc3NhZ2VFbmQoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5SZWFkTWVzc2FnZUJlZ2luKCkuUmV0dXJuKCJ1bmtub3duIiwgdGhyaWZ0LlJFUExZLCBpbnQzMigxKSwgbmlsKSwKKwkpCisKKwljbGllbnQgOj0gZXJyb3J0ZXN0Lk5ld0Vycm9yVGVzdENsaWVudCh0aHJpZnQuTmV3VFN0YW5kYXJkQ2xpZW50KHByb3RvY29sLCBwcm90b2NvbCkpCisJXywgZXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nKGRlZmF1bHRDdHgsICJ0ZXN0IikKKwltb2NrQ3RybC5GaW5pc2goKQorCWFwcEVyciwgb2sgOj0gZXJyLih0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKQorCWlmICFvayB7CisJCXQuRmF0YWwoIkV4cGVjdGVkIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpCisJfQorCWlmIGFwcEVyci5UeXBlSWQoKSAhPSB0aHJpZnQuV1JPTkdfTUVUSE9EX05BTUUgeworCQl0LkZhdGFsKCJFeHBlY3RlZCBXUk9OR19NRVRIT0RfTkFNRSBlcnJvciIpCisJfQorfQorCisvLyBUZXN0Q2FzZTogV3JvbmcgbWV0aG9kIG5hbWUgaGFzIGJlZW4gcmVjZWl2ZWQgaW4gdGhlIGNsaWVudC4KKy8vIFNpbWlsYXIgdG8gVGVzdENsaWVudFdyb25nTWV0aG9kTmFtZSwgYnV0IHVzaW5nIGxlZ2FjeSBjbGllbnQgY29uc3RydWN0b3IuCitmdW5jIFRlc3RDbGllbnRXcm9uZ01ldGhvZE5hbWVMZWdhY3kodCAqdGVzdGluZy5UKSB7CisJbW9ja0N0cmwgOj0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKIAl0cmFuc3BvcnQgOj0gdGhyaWZ0Lk5ld1RNZW1vcnlCdWZmZXIoKQogCXByb3RvY29sIDo9IE5ld01vY2tUUHJvdG9jb2wobW9ja0N0cmwpCiAJZ29tb2NrLkluT3JkZXIoCkBAIC02MzMsMTIgKzc5NiwxMiBAQAogCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkU3RvcCgpLAogCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEVuZCgpLAogCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZU1lc3NhZ2VFbmQoKSwKLQkJcHJvdG9jb2wuRVhQRUNUKCkuRmx1c2goKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpLAogCQlwcm90b2NvbC5FWFBFQ1QoKS5SZWFkTWVzc2FnZUJlZ2luKCkuUmV0dXJuKCJ1bmtub3duIiwgdGhyaWZ0LlJFUExZLCBpbnQzMigxKSwgbmlsKSwKIAkpCiAKIAljbGllbnQgOj0gZXJyb3J0ZXN0Lk5ld0Vycm9yVGVzdENsaWVudFByb3RvY29sKHRyYW5zcG9ydCwgcHJvdG9jb2wsIHByb3RvY29sKQotCV8sIGVyciA6PSBjbGllbnQuVGVzdFN0cmluZygidGVzdCIpCisJXywgZXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nKGRlZmF1bHRDdHgsICJ0ZXN0IikKIAltb2NrQ3RybC5GaW5pc2goKQogCWFwcEVyciwgb2sgOj0gZXJyLih0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKQogCWlmICFvayB7CkBAIC02NTIsNiArODE1LDM2IEBACiAvLyBUZXN0Q2FzZTogV3JvbmcgbWVzc2FnZSB0eXBlIGhhcyBiZWVuIHJlY2VpdmVkIGluIHRoZSBjbGllbnQuCiBmdW5jIFRlc3RDbGllbnRXcm9uZ01lc3NhZ2VUeXBlKHQgKnRlc3RpbmcuVCkgewogCW1vY2tDdHJsIDo9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisJcHJvdG9jb2wgOj0gTmV3TW9ja1RQcm90b2NvbChtb2NrQ3RybCkKKwlnb21vY2suSW5PcmRlcigKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVNZXNzYWdlQmVnaW4oInRlc3RTdHJpbmciLCB0aHJpZnQuQ0FMTCwgaW50MzIoMSkpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEJlZ2luKCJ0ZXN0U3RyaW5nX2FyZ3MiKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZEJlZ2luKCJzIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5TVFJJTkcpLCBpbnQxNigxKSksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RyaW5nKCJ0ZXN0IiksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRFbmQoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZFN0b3AoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJ1Y3RFbmQoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVNZXNzYWdlRW5kKCksCisJCXByb3RvY29sLkVYUEVDVCgpLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuUmVhZE1lc3NhZ2VCZWdpbigpLlJldHVybigidGVzdFN0cmluZyIsIHRocmlmdC5JTlZBTElEX1RNRVNTQUdFX1RZUEUsIGludDMyKDEpLCBuaWwpLAorCSkKKworCWNsaWVudCA6PSBlcnJvcnRlc3QuTmV3RXJyb3JUZXN0Q2xpZW50KHRocmlmdC5OZXdUU3RhbmRhcmRDbGllbnQocHJvdG9jb2wsIHByb3RvY29sKSkKKwlfLCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmcoZGVmYXVsdEN0eCwgInRlc3QiKQorCW1vY2tDdHJsLkZpbmlzaCgpCisJYXBwRXJyLCBvayA6PSBlcnIuKHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24pCisJaWYgIW9rIHsKKwkJdC5GYXRhbCgiRXhwZWN0ZWQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIikKKwl9CisJaWYgYXBwRXJyLlR5cGVJZCgpICE9IHRocmlmdC5JTlZBTElEX01FU1NBR0VfVFlQRV9FWENFUFRJT04geworCQl0LkZhdGFsKCJFeHBlY3RlZCBJTlZBTElEX01FU1NBR0VfVFlQRV9FWENFUFRJT04gZXJyb3IiKQorCX0KK30KKworLy8gVGVzdENhc2U6IFdyb25nIG1lc3NhZ2UgdHlwZSBoYXMgYmVlbiByZWNlaXZlZCBpbiB0aGUgY2xpZW50LgorLy8gU2ltaWxhciB0byBUZXN0Q2xpZW50V3JvbmdNZXNzYWdlVHlwZSwgYnV0IHVzaW5nIGxlZ2FjeSBjbGllbnQgY29uc3RydWN0b3IuCitmdW5jIFRlc3RDbGllbnRXcm9uZ01lc3NhZ2VUeXBlTGVnYWN5KHQgKnRlc3RpbmcuVCkgeworCW1vY2tDdHJsIDo9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCiAJdHJhbnNwb3J0IDo9IHRocmlmdC5OZXdUTWVtb3J5QnVmZmVyKCkKIAlwcm90b2NvbCA6PSBOZXdNb2NrVFByb3RvY29sKG1vY2tDdHJsKQogCWdvbW9jay5Jbk9yZGVyKApAQCAtNjYzLDEyICs4NTYsMTIgQEAKIAkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZFN0b3AoKSwKIAkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJ1Y3RFbmQoKSwKIAkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVNZXNzYWdlRW5kKCksCi0JCXByb3RvY29sLkVYUEVDVCgpLkZsdXNoKCksCisJCXByb3RvY29sLkVYUEVDVCgpLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKSwKIAkJcHJvdG9jb2wuRVhQRUNUKCkuUmVhZE1lc3NhZ2VCZWdpbigpLlJldHVybigidGVzdFN0cmluZyIsIHRocmlmdC5JTlZBTElEX1RNRVNTQUdFX1RZUEUsIGludDMyKDEpLCBuaWwpLAogCSkKIAogCWNsaWVudCA6PSBlcnJvcnRlc3QuTmV3RXJyb3JUZXN0Q2xpZW50UHJvdG9jb2wodHJhbnNwb3J0LCBwcm90b2NvbCwgcHJvdG9jb2wpCi0JXywgZXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nKCJ0ZXN0IikKKwlfLCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmcoZGVmYXVsdEN0eCwgInRlc3QiKQogCW1vY2tDdHJsLkZpbmlzaCgpCiAJYXBwRXJyLCBvayA6PSBlcnIuKHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24pCiAJaWYgIW9rIHsKZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L3Rlc3RzL2NvbnRleHQuZ28gYi9saWIvZ28vdGVzdC90ZXN0cy9jb250ZXh0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5M2E4MmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC90ZXN0cy9jb250ZXh0LmdvCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0ZXN0cworCitpbXBvcnQgKAorCSJjb250ZXh0IgorKQorCit2YXIgZGVmYXVsdEN0eCA9IGNvbnRleHQuQmFja2dyb3VuZCgpCmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC90ZXN0cy9tdWx0aXBsZXhlZF9wcm90b2NvbF90ZXN0LmdvIGIvbGliL2dvL3Rlc3QvdGVzdHMvbXVsdGlwbGV4ZWRfcHJvdG9jb2xfdGVzdC5nbwppbmRleCAwMDY2OWVmLi42MWFjNjI4IDEwMDY0NAotLS0gYS9saWIvZ28vdGVzdC90ZXN0cy9tdWx0aXBsZXhlZF9wcm90b2NvbF90ZXN0LmdvCisrKyBiL2xpYi9nby90ZXN0L3Rlc3RzL211bHRpcGxleGVkX3Byb3RvY29sX3Rlc3QuZ28KQEAgLTIwLDEwICsyMCwxMiBAQAogcGFja2FnZSB0ZXN0cwogCiBpbXBvcnQgKAorCSJjb250ZXh0IgogCSJtdWx0aXBsZXhlZHByb3RvY29sdGVzdCIKIAkibmV0IgogCSJ0ZXN0aW5nIgogCSJ0aHJpZnQiCisJInRpbWUiCiApCiAKIGZ1bmMgRmluZEF2YWlsYWJsZVRDUFNlcnZlclBvcnQoKSBuZXQuQWRkciB7CkBAIC0zNywyNCArMzksMzIgQEAKIAogdHlwZSBGaXJzdEltcGwgc3RydWN0e30KIAotZnVuYyAoZiAqRmlyc3RJbXBsKSBSZXR1cm5PbmUoKSAociBpbnQ2NCwgZXJyIGVycm9yKSB7CitmdW5jIChmICpGaXJzdEltcGwpIFJldHVybk9uZShjdHggY29udGV4dC5Db250ZXh0KSAociBpbnQ2NCwgZXJyIGVycm9yKSB7CiAJcmV0dXJuIDEsIG5pbAogfQogCiB0eXBlIFNlY29uZEltcGwgc3RydWN0e30KIAotZnVuYyAocyAqU2Vjb25kSW1wbCkgUmV0dXJuVHdvKCkgKHIgaW50NjQsIGVyciBlcnJvcikgeworZnVuYyAocyAqU2Vjb25kSW1wbCkgUmV0dXJuVHdvKGN0eCBjb250ZXh0LkNvbnRleHQpIChyIGludDY0LCBlcnIgZXJyb3IpIHsKIAlyZXR1cm4gMiwgbmlsCiB9CiAKLXZhciBwcm9jZXNzb3IgPSB0aHJpZnQuTmV3VE11bHRpcGxleGVkUHJvY2Vzc29yKCkKK2Z1bmMgY3JlYXRlVHJhbnNwb3J0KGFkZHIgbmV0LkFkZHIpICh0aHJpZnQuVFRyYW5zcG9ydCwgZXJyb3IpIHsKKwlzb2NrZXQgOj0gdGhyaWZ0Lk5ld1RTb2NrZXRGcm9tQWRkclRpbWVvdXQoYWRkciwgVElNRU9VVCkKKwl0cmFuc3BvcnQgOj0gdGhyaWZ0Lk5ld1RGcmFtZWRUcmFuc3BvcnQoc29ja2V0KQorCWVyciA6PSB0cmFuc3BvcnQuT3BlbigpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBuaWwsIGVycgorCX0KKwlyZXR1cm4gdHJhbnNwb3J0LCBuaWwKK30KIAotZnVuYyBUZXN0SW5pdFR3b1NlcnZlcnModCAqdGVzdGluZy5UKSB7Ci0JdmFyIGVyciBlcnJvcgorZnVuYyBUZXN0TXVsdGlwbGV4ZWRQcm90b2NvbEZpcnN0KHQgKnRlc3RpbmcuVCkgeworCXByb2Nlc3NvciA6PSB0aHJpZnQuTmV3VE11bHRpcGxleGVkUHJvY2Vzc29yKCkKIAlwcm90b2NvbEZhY3RvcnkgOj0gdGhyaWZ0Lk5ld1RCaW5hcnlQcm90b2NvbEZhY3RvcnlEZWZhdWx0KCkKIAl0cmFuc3BvcnRGYWN0b3J5IDo9IHRocmlmdC5OZXdUVHJhbnNwb3J0RmFjdG9yeSgpCiAJdHJhbnNwb3J0RmFjdG9yeSA9IHRocmlmdC5OZXdURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSh0cmFuc3BvcnRGYWN0b3J5KQotCWFkZHIgPSBGaW5kQXZhaWxhYmxlVENQU2VydmVyUG9ydCgpCisJYWRkciA6PSBGaW5kQXZhaWxhYmxlVENQU2VydmVyUG9ydCgpCiAJc2VydmVyVHJhbnNwb3J0LCBlcnIgOj0gdGhyaWZ0Lk5ld1RTZXJ2ZXJTb2NrZXRUaW1lb3V0KGFkZHIuU3RyaW5nKCksIFRJTUVPVVQpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWwoIlVuYWJsZSB0byBjcmVhdGUgc2VydmVyIHNvY2tldCIsIGVycikKQEAgLTY3LDgxICs3NywxMTcgQEAKIAlzZWNvbmRQcm9jZXNzb3IgOj0gbXVsdGlwbGV4ZWRwcm90b2NvbHRlc3QuTmV3U2Vjb25kUHJvY2Vzc29yKCZTZWNvbmRJbXBse30pCiAJcHJvY2Vzc29yLlJlZ2lzdGVyUHJvY2Vzc29yKCJTZWNvbmRTZXJ2aWNlIiwgc2Vjb25kUHJvY2Vzc29yKQogCisJZGVmZXIgc2VydmVyLlN0b3AoKQogCWdvIHNlcnZlci5TZXJ2ZSgpCi19CisJdGltZS5TbGVlcCgxMCAqIHRpbWUuTWlsbGlzZWNvbmQpCiAKLXZhciBmaXJzdENsaWVudCAqbXVsdGlwbGV4ZWRwcm90b2NvbHRlc3QuRmlyc3RDbGllbnQKLQotZnVuYyBUZXN0SW5pdENsaWVudDEodCAqdGVzdGluZy5UKSB7Ci0Jc29ja2V0IDo9IHRocmlmdC5OZXdUU29ja2V0RnJvbUFkZHJUaW1lb3V0KGFkZHIsIFRJTUVPVVQpCi0JdHJhbnNwb3J0IDo9IHRocmlmdC5OZXdURnJhbWVkVHJhbnNwb3J0KHNvY2tldCkKLQl2YXIgcHJvdG9jb2wgdGhyaWZ0LlRQcm90b2NvbCA9IHRocmlmdC5OZXdUQmluYXJ5UHJvdG9jb2xUcmFuc3BvcnQodHJhbnNwb3J0KQotCXByb3RvY29sID0gdGhyaWZ0Lk5ld1RNdWx0aXBsZXhlZFByb3RvY29sKHByb3RvY29sLCAiRmlyc3RTZXJ2aWNlIikKLQlmaXJzdENsaWVudCA9IG11bHRpcGxleGVkcHJvdG9jb2x0ZXN0Lk5ld0ZpcnN0Q2xpZW50UHJvdG9jb2wodHJhbnNwb3J0LCBwcm90b2NvbCwgcHJvdG9jb2wpCi0JZXJyIDo9IHRyYW5zcG9ydC5PcGVuKCkKKwl0cmFuc3BvcnQsIGVyciA6PSBjcmVhdGVUcmFuc3BvcnQoYWRkcikKIAlpZiBlcnIgIT0gbmlsIHsKLQkJdC5GYXRhbCgiVW5hYmxlIHRvIG9wZW4gY2xpZW50IHNvY2tldCIsIGVycikKKwkJdC5GYXRhbChlcnIpCiAJfQotfQorCWRlZmVyIHRyYW5zcG9ydC5DbG9zZSgpCisJcHJvdG9jb2wgOj0gdGhyaWZ0Lk5ld1RNdWx0aXBsZXhlZFByb3RvY29sKHRocmlmdC5OZXdUQmluYXJ5UHJvdG9jb2xUcmFuc3BvcnQodHJhbnNwb3J0KSwgIkZpcnN0U2VydmljZSIpCiAKLXZhciBzZWNvbmRDbGllbnQgKm11bHRpcGxleGVkcHJvdG9jb2x0ZXN0LlNlY29uZENsaWVudAorCWNsaWVudCA6PSBtdWx0aXBsZXhlZHByb3RvY29sdGVzdC5OZXdGaXJzdENsaWVudCh0aHJpZnQuTmV3VFN0YW5kYXJkQ2xpZW50KHByb3RvY29sLCBwcm90b2NvbCkpCiAKLWZ1bmMgVGVzdEluaXRDbGllbnQyKHQgKnRlc3RpbmcuVCkgewotCXNvY2tldCA6PSB0aHJpZnQuTmV3VFNvY2tldEZyb21BZGRyVGltZW91dChhZGRyLCBUSU1FT1VUKQotCXRyYW5zcG9ydCA6PSB0aHJpZnQuTmV3VEZyYW1lZFRyYW5zcG9ydChzb2NrZXQpCi0JdmFyIHByb3RvY29sIHRocmlmdC5UUHJvdG9jb2wgPSB0aHJpZnQuTmV3VEJpbmFyeVByb3RvY29sVHJhbnNwb3J0KHRyYW5zcG9ydCkKLQlwcm90b2NvbCA9IHRocmlmdC5OZXdUTXVsdGlwbGV4ZWRQcm90b2NvbChwcm90b2NvbCwgIlNlY29uZFNlcnZpY2UiKQotCXNlY29uZENsaWVudCA9IG11bHRpcGxleGVkcHJvdG9jb2x0ZXN0Lk5ld1NlY29uZENsaWVudFByb3RvY29sKHRyYW5zcG9ydCwgcHJvdG9jb2wsIHByb3RvY29sKQotCWVyciA6PSB0cmFuc3BvcnQuT3BlbigpCi0JaWYgZXJyICE9IG5pbCB7Ci0JCXQuRmF0YWwoIlVuYWJsZSB0byBvcGVuIGNsaWVudCBzb2NrZXQiLCBlcnIpCi0JfQotfQotCi0vL2NyZWF0ZSBjbGllbnQgd2l0aG91dCBzZXJ2aWNlIHByZWZpeAotZnVuYyBjcmVhdGVMZWdhY3lDbGllbnQodCAqdGVzdGluZy5UKSAqbXVsdGlwbGV4ZWRwcm90b2NvbHRlc3QuU2Vjb25kQ2xpZW50IHsKLQlzb2NrZXQgOj0gdGhyaWZ0Lk5ld1RTb2NrZXRGcm9tQWRkclRpbWVvdXQoYWRkciwgVElNRU9VVCkKLQl0cmFuc3BvcnQgOj0gdGhyaWZ0Lk5ld1RGcmFtZWRUcmFuc3BvcnQoc29ja2V0KQotCXZhciBwcm90b2NvbCB0aHJpZnQuVFByb3RvY29sID0gdGhyaWZ0Lk5ld1RCaW5hcnlQcm90b2NvbFRyYW5zcG9ydCh0cmFuc3BvcnQpCi0JbGVnYWN5Q2xpZW50IDo9IG11bHRpcGxleGVkcHJvdG9jb2x0ZXN0Lk5ld1NlY29uZENsaWVudFByb3RvY29sKHRyYW5zcG9ydCwgcHJvdG9jb2wsIHByb3RvY29sKQotCWVyciA6PSB0cmFuc3BvcnQuT3BlbigpCi0JaWYgZXJyICE9IG5pbCB7Ci0JCXQuRmF0YWwoIlVuYWJsZSB0byBvcGVuIGNsaWVudCBzb2NrZXQiLCBlcnIpCi0JfQotCXJldHVybiBsZWdhY3lDbGllbnQKLX0KLQotZnVuYyBUZXN0Q2FsbEZpcnN0KHQgKnRlc3RpbmcuVCkgewotCXJldCwgZXJyIDo9IGZpcnN0Q2xpZW50LlJldHVybk9uZSgpCisJcmV0LCBlcnIgOj0gY2xpZW50LlJldHVybk9uZShkZWZhdWx0Q3R4KQogCWlmIGVyciAhPSBuaWwgewogCQl0LkZhdGFsKCJVbmFibGUgdG8gY2FsbCBmaXJzdCBzZXJ2ZXI6IiwgZXJyKQotCX0KLQlpZiByZXQgIT0gMSB7CisJfSBlbHNlIGlmIHJldCAhPSAxIHsKIAkJdC5GYXRhbCgiVW5leHBlY3RlZCByZXN1bHQgZnJvbSBzZXJ2ZXI6ICIsIHJldCkKIAl9CiB9CiAKLWZ1bmMgVGVzdENhbGxTZWNvbmQodCAqdGVzdGluZy5UKSB7Ci0JcmV0LCBlcnIgOj0gc2Vjb25kQ2xpZW50LlJldHVyblR3bygpCitmdW5jIFRlc3RNdWx0aXBsZXhlZFByb3RvY29sU2Vjb25kKHQgKnRlc3RpbmcuVCkgeworCXByb2Nlc3NvciA6PSB0aHJpZnQuTmV3VE11bHRpcGxleGVkUHJvY2Vzc29yKCkKKwlwcm90b2NvbEZhY3RvcnkgOj0gdGhyaWZ0Lk5ld1RCaW5hcnlQcm90b2NvbEZhY3RvcnlEZWZhdWx0KCkKKwl0cmFuc3BvcnRGYWN0b3J5IDo9IHRocmlmdC5OZXdUVHJhbnNwb3J0RmFjdG9yeSgpCisJdHJhbnNwb3J0RmFjdG9yeSA9IHRocmlmdC5OZXdURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSh0cmFuc3BvcnRGYWN0b3J5KQorCWFkZHIgOj0gRmluZEF2YWlsYWJsZVRDUFNlcnZlclBvcnQoKQorCXNlcnZlclRyYW5zcG9ydCwgZXJyIDo9IHRocmlmdC5OZXdUU2VydmVyU29ja2V0VGltZW91dChhZGRyLlN0cmluZygpLCBUSU1FT1VUKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJVbmFibGUgdG8gY3JlYXRlIHNlcnZlciBzb2NrZXQiLCBlcnIpCisJfQorCXNlcnZlciA9IHRocmlmdC5OZXdUU2ltcGxlU2VydmVyNChwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KQorCisJZmlyc3RQcm9jZXNzb3IgOj0gbXVsdGlwbGV4ZWRwcm90b2NvbHRlc3QuTmV3Rmlyc3RQcm9jZXNzb3IoJkZpcnN0SW1wbHt9KQorCXByb2Nlc3Nvci5SZWdpc3RlclByb2Nlc3NvcigiRmlyc3RTZXJ2aWNlIiwgZmlyc3RQcm9jZXNzb3IpCisKKwlzZWNvbmRQcm9jZXNzb3IgOj0gbXVsdGlwbGV4ZWRwcm90b2NvbHRlc3QuTmV3U2Vjb25kUHJvY2Vzc29yKCZTZWNvbmRJbXBse30pCisJcHJvY2Vzc29yLlJlZ2lzdGVyUHJvY2Vzc29yKCJTZWNvbmRTZXJ2aWNlIiwgc2Vjb25kUHJvY2Vzc29yKQorCisJZGVmZXIgc2VydmVyLlN0b3AoKQorCWdvIHNlcnZlci5TZXJ2ZSgpCisJdGltZS5TbGVlcCgxMCAqIHRpbWUuTWlsbGlzZWNvbmQpCisKKwl0cmFuc3BvcnQsIGVyciA6PSBjcmVhdGVUcmFuc3BvcnQoYWRkcikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbChlcnIpCisJfQorCWRlZmVyIHRyYW5zcG9ydC5DbG9zZSgpCisJcHJvdG9jb2wgOj0gdGhyaWZ0Lk5ld1RNdWx0aXBsZXhlZFByb3RvY29sKHRocmlmdC5OZXdUQmluYXJ5UHJvdG9jb2xUcmFuc3BvcnQodHJhbnNwb3J0KSwgIlNlY29uZFNlcnZpY2UiKQorCisJY2xpZW50IDo9IG11bHRpcGxleGVkcHJvdG9jb2x0ZXN0Lk5ld1NlY29uZENsaWVudCh0aHJpZnQuTmV3VFN0YW5kYXJkQ2xpZW50KHByb3RvY29sLCBwcm90b2NvbCkpCisKKwlyZXQsIGVyciA6PSBjbGllbnQuUmV0dXJuVHdvKGRlZmF1bHRDdHgpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWwoIlVuYWJsZSB0byBjYWxsIHNlY29uZCBzZXJ2ZXI6IiwgZXJyKQotCX0KLQlpZiByZXQgIT0gMiB7CisJfSBlbHNlIGlmIHJldCAhPSAyIHsKIAkJdC5GYXRhbCgiVW5leHBlY3RlZCByZXN1bHQgZnJvbSBzZXJ2ZXI6ICIsIHJldCkKIAl9CiB9CiAKLWZ1bmMgVGVzdENhbGxMZWdhY3kodCAqdGVzdGluZy5UKSB7Ci0JbGVnYWN5Q2xpZW50IDo9IGNyZWF0ZUxlZ2FjeUNsaWVudCh0KQotCXJldCwgZXJyIDo9IGxlZ2FjeUNsaWVudC5SZXR1cm5Ud28oKQorZnVuYyBUZXN0TXVsdGlwbGV4ZWRQcm90b2NvbExlZ2FjeSh0ICp0ZXN0aW5nLlQpIHsKKwlwcm9jZXNzb3IgOj0gdGhyaWZ0Lk5ld1RNdWx0aXBsZXhlZFByb2Nlc3NvcigpCisJcHJvdG9jb2xGYWN0b3J5IDo9IHRocmlmdC5OZXdUQmluYXJ5UHJvdG9jb2xGYWN0b3J5RGVmYXVsdCgpCisJdHJhbnNwb3J0RmFjdG9yeSA6PSB0aHJpZnQuTmV3VFRyYW5zcG9ydEZhY3RvcnkoKQorCXRyYW5zcG9ydEZhY3RvcnkgPSB0aHJpZnQuTmV3VEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkodHJhbnNwb3J0RmFjdG9yeSkKKwlhZGRyIDo9IEZpbmRBdmFpbGFibGVUQ1BTZXJ2ZXJQb3J0KCkKKwlzZXJ2ZXJUcmFuc3BvcnQsIGVyciA6PSB0aHJpZnQuTmV3VFNlcnZlclNvY2tldFRpbWVvdXQoYWRkci5TdHJpbmcoKSwgVElNRU9VVCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVW5hYmxlIHRvIGNyZWF0ZSBzZXJ2ZXIgc29ja2V0IiwgZXJyKQorCX0KKwlzZXJ2ZXIgPSB0aHJpZnQuTmV3VFNpbXBsZVNlcnZlcjQocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSkKKworCWZpcnN0UHJvY2Vzc29yIDo9IG11bHRpcGxleGVkcHJvdG9jb2x0ZXN0Lk5ld0ZpcnN0UHJvY2Vzc29yKCZGaXJzdEltcGx7fSkKKwlwcm9jZXNzb3IuUmVnaXN0ZXJQcm9jZXNzb3IoIkZpcnN0U2VydmljZSIsIGZpcnN0UHJvY2Vzc29yKQorCisJc2Vjb25kUHJvY2Vzc29yIDo9IG11bHRpcGxleGVkcHJvdG9jb2x0ZXN0Lk5ld1NlY29uZFByb2Nlc3NvcigmU2Vjb25kSW1wbHt9KQorCXByb2Nlc3Nvci5SZWdpc3RlclByb2Nlc3NvcigiU2Vjb25kU2VydmljZSIsIHNlY29uZFByb2Nlc3NvcikKKworCWRlZmVyIHNlcnZlci5TdG9wKCkKKwlnbyBzZXJ2ZXIuU2VydmUoKQorCXRpbWUuU2xlZXAoMTAgKiB0aW1lLk1pbGxpc2Vjb25kKQorCisJdHJhbnNwb3J0LCBlcnIgOj0gY3JlYXRlVHJhbnNwb3J0KGFkZHIpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3IoZXJyKQorCQlyZXR1cm4KKwl9CisJZGVmZXIgdHJhbnNwb3J0LkNsb3NlKCkKKworCXByb3RvY29sIDo9IHRocmlmdC5OZXdUQmluYXJ5UHJvdG9jb2xUcmFuc3BvcnQodHJhbnNwb3J0KQorCWNsaWVudCA6PSBtdWx0aXBsZXhlZHByb3RvY29sdGVzdC5OZXdTZWNvbmRDbGllbnQodGhyaWZ0Lk5ld1RTdGFuZGFyZENsaWVudChwcm90b2NvbCwgcHJvdG9jb2wpKQorCisJcmV0LCBlcnIgOj0gY2xpZW50LlJldHVyblR3byhkZWZhdWx0Q3R4KQogCS8vZXhwZWN0IGVycm9yIHNpbmNlIGRlZmF1bHQgcHJvY2Vzc29yIGlzIG5vdCByZWdpc3RlcmVkCiAJaWYgZXJyID09IG5pbCB7CiAJCXQuRmF0YWwoIkV4cGVjdGluZyBlcnJvciIpCiAJfQorCiAJLy9yZWdpc3RlciBkZWZhdWx0IHByb2Nlc3NvciBhbmQgY2FsbCBhZ2FpbgogCXByb2Nlc3Nvci5SZWdpc3RlckRlZmF1bHQobXVsdGlwbGV4ZWRwcm90b2NvbHRlc3QuTmV3U2Vjb25kUHJvY2Vzc29yKCZTZWNvbmRJbXBse30pKQotCWxlZ2FjeUNsaWVudCA9IGNyZWF0ZUxlZ2FjeUNsaWVudCh0KQotCXJldCwgZXJyID0gbGVnYWN5Q2xpZW50LlJldHVyblR3bygpCisJdHJhbnNwb3J0LCBlcnIgPSBjcmVhdGVUcmFuc3BvcnQoYWRkcikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcihlcnIpCisJCXJldHVybgorCX0KKwlkZWZlciB0cmFuc3BvcnQuQ2xvc2UoKQorCisJcHJvdG9jb2wgPSB0aHJpZnQuTmV3VEJpbmFyeVByb3RvY29sVHJhbnNwb3J0KHRyYW5zcG9ydCkKKwljbGllbnQgPSBtdWx0aXBsZXhlZHByb3RvY29sdGVzdC5OZXdTZWNvbmRDbGllbnQodGhyaWZ0Lk5ld1RTdGFuZGFyZENsaWVudChwcm90b2NvbCwgcHJvdG9jb2wpKQorCisJcmV0LCBlcnIgPSBjbGllbnQuUmV0dXJuVHdvKGRlZmF1bHRDdHgpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWwoIlVuYWJsZSB0byBjYWxsIGxlZ2FjeSBzZXJ2ZXI6IiwgZXJyKQogCX0KQEAgLTE0OSw5ICsxOTUsMyBAQAogCQl0LkZhdGFsKCJVbmV4cGVjdGVkIHJlc3VsdCBmcm9tIHNlcnZlcjogIiwgcmV0KQogCX0KIH0KLQotZnVuYyBUZXN0U2h1dGRvd25TZXJ2ZXJBbmRDbGllbnRzKHQgKnRlc3RpbmcuVCkgewotCWZpcnN0Q2xpZW50LlRyYW5zcG9ydC5DbG9zZSgpCi0Jc2Vjb25kQ2xpZW50LlRyYW5zcG9ydC5DbG9zZSgpCi0Jc2VydmVyLlN0b3AoKQotfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvdGVzdHMvb25lX3dheV90ZXN0LmdvIGIvbGliL2dvL3Rlc3QvdGVzdHMvb25lX3dheV90ZXN0LmdvCmluZGV4IDNmZjAyNWYuLjQ4ZDBiYmUgMTAwNjQ0Ci0tLSBhL2xpYi9nby90ZXN0L3Rlc3RzL29uZV93YXlfdGVzdC5nbworKysgYi9saWIvZ28vdGVzdC90ZXN0cy9vbmVfd2F5X3Rlc3QuZ28KQEAgLTIwLDYgKzIwLDcgQEAKIHBhY2thZ2UgdGVzdHMKIAogaW1wb3J0ICgKKwkiY29udGV4dCIKIAkiZm10IgogCSJuZXQiCiAJIm9uZXdheXRlc3QiCkBAIC0zOSw5ICs0MCw5IEBACiAKIHR5cGUgaW1wbCBzdHJ1Y3R7fQogCi1mdW5jIChpICppbXBsKSBIaShpbiBpbnQ2NCwgcyBzdHJpbmcpIChlcnIgZXJyb3IpICAgICAgICB7IGZtdC5QcmludGxuKCJIaSEiKTsgcmV0dXJuIH0KLWZ1bmMgKGkgKmltcGwpIEVtcHR5ZnVuYygpIChlcnIgZXJyb3IpICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIH0KLWZ1bmMgKGkgKmltcGwpIEVjaG9JbnQocGFyYW0gaW50NjQpIChyIGludDY0LCBlcnIgZXJyb3IpIHsgcmV0dXJuIHBhcmFtLCBuaWwgfQorZnVuYyAoaSAqaW1wbCkgSGkoY3R4IGNvbnRleHQuQ29udGV4dCwgaW4gaW50NjQsIHMgc3RyaW5nKSAoZXJyIGVycm9yKSAgICAgICAgeyBmbXQuUHJpbnRsbigiSGkhIik7IHJldHVybiB9CitmdW5jIChpICppbXBsKSBFbXB0eWZ1bmMoY3R4IGNvbnRleHQuQ29udGV4dCkgKGVyciBlcnJvcikgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiB9CitmdW5jIChpICppbXBsKSBFY2hvSW50KGN0eCBjb250ZXh0LkNvbnRleHQsIHBhcmFtIGludDY0KSAociBpbnQ2NCwgZXJyIGVycm9yKSB7IHJldHVybiBwYXJhbSwgbmlsIH0KIAogY29uc3QgVElNRU9VVCA9IHRpbWUuU2Vjb25kCiAKQEAgLTYwLDEyICs2MSwxMyBAQAogCXNlcnZlciA9IHRocmlmdC5OZXdUU2ltcGxlU2VydmVyMihwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCkKIAogCWdvIHNlcnZlci5TZXJ2ZSgpCisJdGltZS5TbGVlcCgxMCAqIHRpbWUuTWlsbGlzZWNvbmQpCiB9CiAKIGZ1bmMgVGVzdEluaXRPbmV3YXlDbGllbnQodCAqdGVzdGluZy5UKSB7CiAJdHJhbnNwb3J0IDo9IHRocmlmdC5OZXdUU29ja2V0RnJvbUFkZHJUaW1lb3V0KGFkZHIsIFRJTUVPVVQpCiAJcHJvdG9jb2wgOj0gdGhyaWZ0Lk5ld1RCaW5hcnlQcm90b2NvbFRyYW5zcG9ydCh0cmFuc3BvcnQpCi0JY2xpZW50ID0gb25ld2F5dGVzdC5OZXdPbmVXYXlDbGllbnRQcm90b2NvbCh0cmFuc3BvcnQsIHByb3RvY29sLCBwcm90b2NvbCkKKwljbGllbnQgPSBvbmV3YXl0ZXN0Lk5ld09uZVdheUNsaWVudCh0aHJpZnQuTmV3VFN0YW5kYXJkQ2xpZW50KHByb3RvY29sLCBwcm90b2NvbCkpCiAJZXJyIDo9IHRyYW5zcG9ydC5PcGVuKCkKIAlpZiBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbCgiVW5hYmxlIHRvIG9wZW4gY2xpZW50IHNvY2tldCIsIGVycikKQEAgLTc0LDEyICs3NiwxMiBAQAogCiBmdW5jIFRlc3RDYWxsT25ld2F5U2VydmVyKHQgKnRlc3RpbmcuVCkgewogCS8vY2FsbCBvbmV3YXkgZnVuY3Rpb24KLQllcnIgOj0gY2xpZW50LkhpKDEsICIiKQorCWVyciA6PSBjbGllbnQuSGkoZGVmYXVsdEN0eCwgMSwgIiIpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWwoIlVuZXhwZWN0ZWQgZXJyb3I6ICIsIGVycikKIAl9CiAJLy9UaGVyZSBpcyBubyB3YXkgdG8gZGV0ZWN0IHByb3RvY29sIHByb2JsZW1zIHdpdGggc2luZ2xlIG9uZXdheSBjYWxsIHNvIHdlIGNhbGwgaXQgc2Vjb25kIHRpbWUKLQlpLCBlcnIgOj0gY2xpZW50LkVjaG9JbnQoNDIpCisJaSwgZXJyIDo9IGNsaWVudC5FY2hvSW50KGRlZmF1bHRDdHgsIDQyKQogCWlmIGVyciAhPSBuaWwgewogCQl0LkZhdGFsKCJVbmV4cGVjdGVkIGVycm9yOiAiLCBlcnIpCiAJfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvdGVzdHMvcHJvdG9jb2xfbW9jay5nbyBiL2xpYi9nby90ZXN0L3Rlc3RzL3Byb3RvY29sX21vY2suZ28KaW5kZXggOTE5N2ZlZC4uNTFkN2EwMiAxMDA2NDQKLS0tIGEvbGliL2dvL3Rlc3QvdGVzdHMvcHJvdG9jb2xfbW9jay5nbworKysgYi9saWIvZ28vdGVzdC90ZXN0cy9wcm90b2NvbF9tb2NrLmdvCkBAIC0yMyw3ICsyMyw5IEBACiBwYWNrYWdlIHRlc3RzCiAKIGltcG9ydCAoCisJImNvbnRleHQiCiAJdGhyaWZ0ICJ0aHJpZnQiCisKIAlnb21vY2sgImdpdGh1Yi5jb20vZ29sYW5nL21vY2svZ29tb2NrIgogKQogCkBAIC00OCwxMyArNTAsMTMgQEAKIAlyZXR1cm4gX20ucmVjb3JkZXIKIH0KIAotZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIEZsdXNoKCkgZXJyb3IgeworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIEZsdXNoKGN0eCBjb250ZXh0LkNvbnRleHQpIGVycm9yIHsKIAlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiRmx1c2giKQogCXJldDAsIF8gOj0gcmV0WzBdLihlcnJvcikKIAlyZXR1cm4gcmV0MAogfQogCi1mdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIEZsdXNoKCkgKmdvbW9jay5DYWxsIHsKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgRmx1c2goY3R4IGNvbnRleHQuQ29udGV4dCkgKmdvbW9jay5DYWxsIHsKIAlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiRmx1c2giKQogfQogCmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC90ZXN0cy9wcm90b2NvbHNfdGVzdC5nbyBiL2xpYi9nby90ZXN0L3Rlc3RzL3Byb3RvY29sc190ZXN0LmdvCmluZGV4IDQyMmI1YzguLmNmZmQ5YzMgMTAwNjQ0Ci0tLSBhL2xpYi9nby90ZXN0L3Rlc3RzL3Byb3RvY29sc190ZXN0LmdvCisrKyBiL2xpYi9nby90ZXN0L3Rlc3RzL3Byb3RvY29sc190ZXN0LmdvCkBAIC00Miw5ICs0MiwxMiBAQAogCiAJLy8gY2xpZW50CiAJdmFyIHRyYW5zcG9ydCB0aHJpZnQuVFRyYW5zcG9ydCA9IHRocmlmdC5OZXdUU29ja2V0RnJvbUFkZHJUaW1lb3V0KGFkZHIsIFRJTUVPVVQpCi0JdHJhbnNwb3J0ID0gdHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQodHJhbnNwb3J0KQorCXRyYW5zcG9ydCwgZXJyID0gdHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQodHJhbnNwb3J0KQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsKGVycikKKwl9CiAJdmFyIHByb3RvY29sIHRocmlmdC5UUHJvdG9jb2wgPSBwcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnNwb3J0KQotCXRocmlmdFRlc3RDbGllbnQgOj0gdGhyaWZ0dGVzdC5OZXdUaHJpZnRUZXN0Q2xpZW50UHJvdG9jb2wodHJhbnNwb3J0LCBwcm90b2NvbCwgcHJvdG9jb2wpCisJdGhyaWZ0VGVzdENsaWVudCA6PSB0aHJpZnR0ZXN0Lk5ld1RocmlmdFRlc3RDbGllbnQodGhyaWZ0Lk5ld1RTdGFuZGFyZENsaWVudChwcm90b2NvbCwgcHJvdG9jb2wpKQogCWVyciA9IHRyYW5zcG9ydC5PcGVuKCkKIAlpZiBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbCgiVW5hYmxlIHRvIG9wZW4gY2xpZW50IHNvY2tldCIsIGVycikKZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L3Rlc3RzL3JlcXVpcmVkX2ZpZWxkc190ZXN0LmdvIGIvbGliL2dvL3Rlc3QvdGVzdHMvcmVxdWlyZWRfZmllbGRzX3Rlc3QuZ28KaW5kZXggMjA1MzcxMi4uM2ZhNDE0YSAxMDA2NDQKLS0tIGEvbGliL2dvL3Rlc3QvdGVzdHMvcmVxdWlyZWRfZmllbGRzX3Rlc3QuZ28KKysrIGIvbGliL2dvL3Rlc3QvdGVzdHMvcmVxdWlyZWRfZmllbGRzX3Rlc3QuZ28KQEAgLTIwLDEyICsyMCw0NSBAQAogcGFja2FnZSB0ZXN0cwogCiBpbXBvcnQgKAorCSJjb250ZXh0IgogCSJnaXRodWIuY29tL2dvbGFuZy9tb2NrL2dvbW9jayIKIAkib3B0aW9uYWxmaWVsZHN0ZXN0IgorCSJyZXF1aXJlZGZpZWxkdGVzdCIKIAkidGVzdGluZyIKIAkidGhyaWZ0IgogKQogCitmdW5jIFRlc3RSZXF1aXJlZEZpZWxkX1N1Y2Vjc3NXaGVuU2V0KHQgKnRlc3RpbmcuVCkgeworCS8vIGNyZWF0ZSBhIG5ldyBSZXF1aXJlZEZpZWxkIGluc3RhbmNlIHdpdGggdGhlIHJlcXVpcmVkIGZpZWxkIHNldAorCXNvdXJjZSA6PSAmcmVxdWlyZWRmaWVsZHRlc3QuUmVxdWlyZWRGaWVsZHtOYW1lOiAidGhpcyBpcyBhIHRlc3QifQorCXNvdXJjZURhdGEsIGVyciA6PSB0aHJpZnQuTmV3VFNlcmlhbGl6ZXIoKS5Xcml0ZShjb250ZXh0LkJhY2tncm91bmQoKSwgc291cmNlKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiZmFpbGVkIHRvIHNlcmlhbGl6ZSAlVDogJXYiLCBzb3VyY2UsIGVycikKKwl9CisKKwlkIDo9IHRocmlmdC5OZXdURGVzZXJpYWxpemVyKCkKKwllcnIgPSBkLlJlYWQoJnJlcXVpcmVkZmllbGR0ZXN0LlJlcXVpcmVkRmllbGR7fSwgc291cmNlRGF0YSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIkRpZCBub3QgZXhwZWN0IGFuIGVycm9yIHdoZW4gdHJ5aW5nIHRvIGRlc2VyaWFsaXplIHRoZSByZXF1aXJlZGZpZWxkdGVzdC5SZXF1aXJlZEZpZWxkOiAldiIsIGVycikKKwl9Cit9CisKK2Z1bmMgVGVzdFJlcXVpcmVkRmllbGRfRXJyb3JXaGVuTWlzc2luZyh0ICp0ZXN0aW5nLlQpIHsKKwkvLyBjcmVhdGUgYSBuZXcgT3RoZXJUaGluZyBpbnN0YW5jZSwgd2l0aG91dCBzZXR0aW5nIHRoZSByZXF1aXJlZCBmaWVsZAorCXNvdXJjZSA6PSAmcmVxdWlyZWRmaWVsZHRlc3QuT3RoZXJUaGluZ3t9CisJc291cmNlRGF0YSwgZXJyIDo9IHRocmlmdC5OZXdUU2VyaWFsaXplcigpLldyaXRlKGNvbnRleHQuQmFja2dyb3VuZCgpLCBzb3VyY2UpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJmYWlsZWQgdG8gc2VyaWFsaXplICVUOiAldiIsIHNvdXJjZSwgZXJyKQorCX0KKworCS8vIGF0dGVtcHQgdG8gZGVzZXJpYWxpemUgaW50byBhIGRpZmZlcmVudCB0eXBlICh3aGljaCBzaG91bGQgZmFpbCkKKwlkIDo9IHRocmlmdC5OZXdURGVzZXJpYWxpemVyKCkKKwllcnIgPSBkLlJlYWQoJnJlcXVpcmVkZmllbGR0ZXN0LlJlcXVpcmVkRmllbGR7fSwgc291cmNlRGF0YSkKKwlpZiBlcnIgPT0gbmlsIHsKKwkJdC5GYXRhbCgiRXhwZWN0ZWQgYW4gZXJyb3Igd2hlbiB0cnlpbmcgdG8gZGVzZXJpYWxpemUgYW4gb2JqZWN0IHdoaWNoIGlzIG1pc3NpbmcgYSByZXF1aXJlZCBmaWVsZCIpCisJfQorfQorCiBmdW5jIFRlc3RTdHJ1Y3RSZWFkUmVxdWlyZWRGaWVsZHModCAqdGVzdGluZy5UKSB7CiAJbW9ja0N0cmwgOj0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKIAlwcm90b2NvbCA6PSBOZXdNb2NrVFByb3RvY29sKG1vY2tDdHJsKQpAQCAtNDAsNiArNzMsNyBAQAogCiAJZXJyIDo9IHRlc3RTdHJ1Y3QuUmVhZChwcm90b2NvbCkKIAltb2NrQ3RybC5GaW5pc2goKQorCW1vY2tDdHJsID0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKIAlpZiBlcnIgPT0gbmlsIHsKIAkJdC5GYXRhbCgiRXhwZWN0ZWQgcmVhZCB0byBmYWlsIikKIAl9CkBAIC02Myw2ICs5Nyw3IEBACiAKIAllcnIgPSB0ZXN0U3RydWN0LlJlYWQocHJvdG9jb2wpCiAJbW9ja0N0cmwuRmluaXNoKCkKKwltb2NrQ3RybCA9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCiAJaWYgZXJyID09IG5pbCB7CiAJCXQuRmF0YWwoIkV4cGVjdGVkIHJlYWQgdG8gZmFpbCIpCiAJfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvdGVzdHMvc3RydWN0X2FyZ3NfcmV0c190ZXN0LmdvIGIvbGliL2dvL3Rlc3QvdGVzdHMvc3RydWN0X2FyZ3NfcmV0c190ZXN0LmdvCmluZGV4IDM2MzQyM2QuLjgxZTliMjYgMTAwNjQ0Ci0tLSBhL2xpYi9nby90ZXN0L3Rlc3RzL3N0cnVjdF9hcmdzX3JldHNfdGVzdC5nbworKysgYi9saWIvZ28vdGVzdC90ZXN0cy9zdHJ1Y3RfYXJnc19yZXRzX3Rlc3QuZ28KQEAgLTMwLDcgKzMwLDcgQEAKIAl2YXIgaWZhY2Ugc3QuQVNlcnYKIAl2YXIgZXJyIGVycm9yCiAKLQlzYSwgZXJyID0gaWZhY2UuU3RydWN0QUZ1bmNfMXN0cnVjdEEoc2EpCisJc2EsIGVyciA9IGlmYWNlLlN0cnVjdEFGdW5jXzFzdHJ1Y3RBKGRlZmF1bHRDdHgsIHNhKQogCV8gPSBlcnIKIAlfID0gc2EKIH0KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L3Rlc3RzL3RocmlmdHRlc3RfZHJpdmVyLmdvIGIvbGliL2dvL3Rlc3QvdGVzdHMvdGhyaWZ0dGVzdF9kcml2ZXIuZ28KaW5kZXggOTE1MzgzZi4uZGU1NGNiYyAxMDA2NDQKLS0tIGEvbGliL2dvL3Rlc3QvdGVzdHMvdGhyaWZ0dGVzdF9kcml2ZXIuZ28KKysrIGIvbGliL2dvL3Rlc3QvdGVzdHMvdGhyaWZ0dGVzdF9kcml2ZXIuZ28KQEAgLTM4LDE1ICszOCwxNSBAQAogCWNsaWVudCA6PSBwLmNsaWVudAogCXQgOj0gcC50CiAKLQlpZiBjbGllbnQuVGVzdFZvaWQoKSAhPSBuaWwgeworCWlmIGNsaWVudC5UZXN0Vm9pZChkZWZhdWx0Q3R4KSAhPSBuaWwgewogCQl0LkZhdGFsKCJUZXN0Vm9pZCBmYWlsZWQiKQogCX0KIAotCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdFN0cmluZygiVGVzdCIpOyByICE9ICJUZXN0IiB8fCBlcnIgIT0gbmlsIHsKKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmcoZGVmYXVsdEN0eCwgIlRlc3QiKTsgciAhPSAiVGVzdCIgfHwgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWwoIlRlc3RTdHJpbmcgd2l0aCBzaW1wbGUgdGV4dCBmYWlsZWQiKQogCX0KIAotCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdFN0cmluZygiIik7IHIgIT0gIiIgfHwgZXJyICE9IG5pbCB7CisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nKGRlZmF1bHRDdHgsICIiKTsgciAhPSAiIiB8fCBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbCgiVGVzdFN0cmluZyB3aXRoIGVtcHR5IHRleHQgZmFpbGVkIikKIAl9CiAKQEAgLTc2LDcgKzc2LDcgQEAKIAkJIldhbG9uLCBXaW5hcmF5LCDlkLTor60sIGlzaVhob3NhLCDXmdeZ1rTXk9eZ16ksIFlvcsO5YsOhLCBaZcOqdXdzLCDkuK3mlocsICIgKwogCQkiQsOibi1sw6JtLWfDuiwg57K16KqeIgogCi0JaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nKHN0cmluZ1Rlc3QpOyByICE9IHN0cmluZ1Rlc3QgfHwgZXJyICE9IG5pbCB7CisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nKGRlZmF1bHRDdHgsIHN0cmluZ1Rlc3QpOyByICE9IHN0cmluZ1Rlc3QgfHwgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWwoIlRlc3RTdHJpbmcgd2l0aCBhbGwgbGFuZ3VhZ2VzIGZhaWxlZCIpCiAJfQogCkBAIC04Niw0NCArODYsNDQgQEAKIAkJIiBub3ctYS1idW5jaC1vZi1qdW5rOiAhQCMkJSYoKSgmJSQje317fTw+PD48IiArCiAJCSIgY2hhci10by10ZXN0LWpzb24tcGFyc2luZzogXV0gXCJdXSBcXFwiIH19fXsgW1tbICIKIAotCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdFN0cmluZyhzcGVjaWFsQ2hhcmFjdGVycyk7IHIgIT0gc3BlY2lhbENoYXJhY3RlcnMgfHwgZXJyICE9IG5pbCB7CisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nKGRlZmF1bHRDdHgsIHNwZWNpYWxDaGFyYWN0ZXJzKTsgciAhPSBzcGVjaWFsQ2hhcmFjdGVycyB8fCBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbCgiVGVzdFN0cmluZyB3aXRoIHNwZWNpYWxDaGFyYWN0ZXJzIGZhaWxlZCIpCiAJfQogCi0JaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0Qnl0ZSgxKTsgciAhPSAxIHx8IGVyciAhPSBuaWwgeworCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdEJ5dGUoZGVmYXVsdEN0eCwgMSk7IHIgIT0gMSB8fCBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbCgiVGVzdEJ5dGUoMSkgZmFpbGVkIikKIAl9Ci0JaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0Qnl0ZSgwKTsgciAhPSAwIHx8IGVyciAhPSBuaWwgeworCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdEJ5dGUoZGVmYXVsdEN0eCwgMCk7IHIgIT0gMCB8fCBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbCgiVGVzdEJ5dGUoMCkgZmFpbGVkIikKIAl9Ci0JaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0Qnl0ZSgtMSk7IHIgIT0gLTEgfHwgZXJyICE9IG5pbCB7CisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0Qnl0ZShkZWZhdWx0Q3R4LCAtMSk7IHIgIT0gLTEgfHwgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWwoIlRlc3RCeXRlKC0xKSBmYWlsZWQiKQogCX0KLQlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RCeXRlKC0xMjcpOyByICE9IC0xMjcgfHwgZXJyICE9IG5pbCB7CisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0Qnl0ZShkZWZhdWx0Q3R4LCAtMTI3KTsgciAhPSAtMTI3IHx8IGVyciAhPSBuaWwgewogCQl0LkZhdGFsKCJUZXN0Qnl0ZSgtMTI3KSBmYWlsZWQiKQogCX0KIAotCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdEkzMigtMSk7IHIgIT0gLTEgfHwgZXJyICE9IG5pbCB7CisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0STMyKGRlZmF1bHRDdHgsIC0xKTsgciAhPSAtMSB8fCBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbCgiVGVzdEkzMigtMSkgZmFpbGVkIikKIAl9Ci0JaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0STMyKDEpOyByICE9IDEgfHwgZXJyICE9IG5pbCB7CisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0STMyKGRlZmF1bHRDdHgsIDEpOyByICE9IDEgfHwgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWwoIlRlc3RJMzIoMSkgZmFpbGVkIikKIAl9CiAKLQlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RJNjQoLTUpOyByICE9IC01IHx8IGVyciAhPSBuaWwgeworCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdEk2NChkZWZhdWx0Q3R4LCAtNSk7IHIgIT0gLTUgfHwgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWwoIlRlc3RJNjQoLTUpIGZhaWxlZCIpCiAJfQotCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdEk2NCg1KTsgciAhPSA1IHx8IGVyciAhPSBuaWwgeworCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdEk2NChkZWZhdWx0Q3R4LCA1KTsgciAhPSA1IHx8IGVyciAhPSBuaWwgewogCQl0LkZhdGFsKCJUZXN0STY0KDUpIGZhaWxlZCIpCiAJfQotCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdEk2NCgtMzQzNTk3MzgzNjgpOyByICE9IC0zNDM1OTczODM2OCB8fCBlcnIgIT0gbmlsIHsKKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RJNjQoZGVmYXVsdEN0eCwgLTM0MzU5NzM4MzY4KTsgciAhPSAtMzQzNTk3MzgzNjggfHwgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWwoIlRlc3RJNjQoLTM0MzU5NzM4MzY4KSBmYWlsZWQiKQogCX0KIAotCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdERvdWJsZSgtNS4yMDk4NTIzKTsgciAhPSAtNS4yMDk4NTIzIHx8IGVyciAhPSBuaWwgeworCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdERvdWJsZShkZWZhdWx0Q3R4LCAtNS4yMDk4NTIzKTsgciAhPSAtNS4yMDk4NTIzIHx8IGVyciAhPSBuaWwgewogCQl0LkZhdGFsKCJUZXN0RG91YmxlKC01LjIwOTg1MjMpIGZhaWxlZCIpCiAJfQotCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdERvdWJsZSgtNy4wMTIwNTIxNzUyMTUwNDQpOyByICE9IC03LjAxMjA1MjE3NTIxNTA0NCB8fCBlcnIgIT0gbmlsIHsKKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3REb3VibGUoZGVmYXVsdEN0eCwgLTcuMDEyMDUyMTc1MjE1MDQ0KTsgciAhPSAtNy4wMTIwNTIxNzUyMTUwNDQgfHwgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWwoIlRlc3REb3VibGUoLTcuMDEyMDUyMTc1MjE1MDQ0KSBmYWlsZWQiKQogCX0KIApAQCAtMTM0LDcgKzEzNCw3IEBACiAJb3V0LkJ5dGVUaGluZyA9IDEKIAlvdXQuSTMyVGhpbmcgPSAtMwogCW91dC5JNjRUaGluZyA9IDEwMDAwMDAKLQlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RTdHJ1Y3Qob3V0KTsgIXJlZmxlY3QuRGVlcEVxdWFsKHIsIG91dCkgfHwgZXJyICE9IG5pbCB7CisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0U3RydWN0KGRlZmF1bHRDdHgsIG91dCk7ICFyZWZsZWN0LkRlZXBFcXVhbChyLCBvdXQpIHx8IGVyciAhPSBuaWwgewogCQl0LkZhdGFsKCJUZXN0U3RydWN0IGZhaWxlZCIpCiAJfQogCkBAIC0xNDIsNyArMTQyLDcgQEAKIAlvdXQyLkJ5dGVUaGluZyA9IDEKIAlvdXQyLlN0cnVjdFRoaW5nID0gb3V0CiAJb3V0Mi5JMzJUaGluZyA9IDUKLQlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3ROZXN0KG91dDIpOyAhcmVmbGVjdC5EZWVwRXF1YWwociwgb3V0MikgfHwgZXJyICE9IG5pbCB7CisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0TmVzdChkZWZhdWx0Q3R4LCBvdXQyKTsgIXJlZmxlY3QuRGVlcEVxdWFsKHIsIG91dDIpIHx8IGVyciAhPSBuaWwgewogCQl0LkZhdGFsKCJUZXN0TmVzdCBmYWlsZWQiKQogCX0KIApAQCAtMTUwLDcgKzE1MCw3IEBACiAJZm9yIGkgOj0gaW50MzIoMCk7IGkgPCA1OyBpKysgewogCQltYXBvdXRbaV0gPSBpIC0gMTAKIAl9Ci0JaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0TWFwKG1hcG91dCk7ICFyZWZsZWN0LkRlZXBFcXVhbChyLCBtYXBvdXQpIHx8IGVyciAhPSBuaWwgeworCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdE1hcChkZWZhdWx0Q3R4LCBtYXBvdXQpOyAhcmVmbGVjdC5EZWVwRXF1YWwociwgbWFwb3V0KSB8fCBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbCgiVGVzdE1hcCBmYWlsZWQiKQogCX0KIApAQCAtMTU4LDI1ICsxNTgsMjUgQEAKIAkJImEiOiAiMTIzIiwgImEgYiI6ICJ3aXRoIHNwYWNlcyAiLCAic2FtZSI6ICJzYW1lIiwgIjAiOiAibnVtZXJpYyBrZXkiLAogCQkibG9uZ1ZhbHVlIjogc3RyaW5nVGVzdCwgc3RyaW5nVGVzdDogImxvbmcga2V5IiwKIAl9Ci0JaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nTWFwKG1hcFRlc3RJbnB1dCk7ICFyZWZsZWN0LkRlZXBFcXVhbChyLCBtYXBUZXN0SW5wdXQpIHx8IGVyciAhPSBuaWwgeworCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdFN0cmluZ01hcChkZWZhdWx0Q3R4LCBtYXBUZXN0SW5wdXQpOyAhcmVmbGVjdC5EZWVwRXF1YWwociwgbWFwVGVzdElucHV0KSB8fCBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbCgiVGVzdFN0cmluZ01hcCBmYWlsZWQiKQogCX0KIAotCXNldFRlc3RJbnB1dCA6PSBtYXBbaW50MzJdYm9vbHsxOiB0cnVlLCAyOiB0cnVlLCAzOiB0cnVlfQotCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdFNldChzZXRUZXN0SW5wdXQpOyAhcmVmbGVjdC5EZWVwRXF1YWwociwgc2V0VGVzdElucHV0KSB8fCBlcnIgIT0gbmlsIHsKKwlzZXRUZXN0SW5wdXQgOj0gW11pbnQzMnsxLCAyLCAzfQorCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdFNldChkZWZhdWx0Q3R4LCBzZXRUZXN0SW5wdXQpOyAhcmVmbGVjdC5EZWVwRXF1YWwociwgc2V0VGVzdElucHV0KSB8fCBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbCgiVGVzdFNldCBmYWlsZWQiKQogCX0KIAogCWxpc3RUZXN0IDo9IFtdaW50MzJ7MSwgMiwgM30KLQlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RMaXN0KGxpc3RUZXN0KTsgIXJlZmxlY3QuRGVlcEVxdWFsKHIsIGxpc3RUZXN0KSB8fCBlcnIgIT0gbmlsIHsKKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RMaXN0KGRlZmF1bHRDdHgsIGxpc3RUZXN0KTsgIXJlZmxlY3QuRGVlcEVxdWFsKHIsIGxpc3RUZXN0KSB8fCBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbCgiVGVzdExpc3QgZmFpbGVkIikKIAl9CiAKLQlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RFbnVtKHRocmlmdHRlc3QuTnVtYmVyel9PTkUpOyByICE9IHRocmlmdHRlc3QuTnVtYmVyel9PTkUgfHwgZXJyICE9IG5pbCB7CisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0RW51bShkZWZhdWx0Q3R4LCB0aHJpZnR0ZXN0Lk51bWJlcnpfT05FKTsgciAhPSB0aHJpZnR0ZXN0Lk51bWJlcnpfT05FIHx8IGVyciAhPSBuaWwgewogCQl0LkZhdGFsKCJUZXN0RW51bSBmYWlsZWQiKQogCX0KIAotCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdFR5cGVkZWYoNjkpOyByICE9IDY5IHx8IGVyciAhPSBuaWwgeworCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdFR5cGVkZWYoZGVmYXVsdEN0eCwgNjkpOyByICE9IDY5IHx8IGVyciAhPSBuaWwgewogCQl0LkZhdGFsKCJUZXN0VHlwZWRlZiBmYWlsZWQiKQogCX0KIApAQCAtMTg0LDcgKzE4NCw3IEBACiAJCTQ6ICB7MTogMSwgMjogMiwgMzogMywgNDogNH0sCiAJCS00OiB7LTQ6IC00LCAtMzogLTMsIC0yOiAtMiwgLTE6IC0xfSwKIAl9Ci0JaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0TWFwTWFwKDEpOyAhcmVmbGVjdC5EZWVwRXF1YWwociwgbWFwTWFwVGVzdCkgfHwgZXJyICE9IG5pbCB7CisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0TWFwTWFwKGRlZmF1bHRDdHgsIDEpOyAhcmVmbGVjdC5EZWVwRXF1YWwociwgbWFwTWFwVGVzdCkgfHwgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWwoIlRlc3RNYXBNYXAgZmFpbGVkIikKIAl9CiAKQEAgLTIxMiwyNSArMjEyLDI1IEBACiAJCTE6IHt0aHJpZnR0ZXN0Lk51bWJlcnpfVFdPOiBjcmF6eSwgdGhyaWZ0dGVzdC5OdW1iZXJ6X1RIUkVFOiBjcmF6eX0sCiAJCTI6IHt0aHJpZnR0ZXN0Lk51bWJlcnpfU0lYOiBjcmF6eUVtcHR5fSwKIAl9Ci0JaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0SW5zYW5pdHkoY3JhenkpOyAhcmVmbGVjdC5EZWVwRXF1YWwociwgaW5zYW5pdHkpIHx8IGVyciAhPSBuaWwgeworCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdEluc2FuaXR5KGRlZmF1bHRDdHgsIGNyYXp5KTsgIXJlZmxlY3QuRGVlcEVxdWFsKHIsIGluc2FuaXR5KSB8fCBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbCgiVGVzdEluc2FuaXR5IGZhaWxlZCIpCiAJfQogCi0JaWYgZXJyIDo9IGNsaWVudC5UZXN0RXhjZXB0aW9uKCJURXhjZXB0aW9uIik7IGVyciA9PSBuaWwgeworCWlmIGVyciA6PSBjbGllbnQuVGVzdEV4Y2VwdGlvbihkZWZhdWx0Q3R4LCAiVEV4Y2VwdGlvbiIpOyBlcnIgPT0gbmlsIHsKIAkJdC5GYXRhbCgiVGVzdEV4Y2VwdGlvbiBURXhjZXB0aW9uIGZhaWxlZCIpCiAJfQogCi0JaWYgZXJyLCBvayA6PSBjbGllbnQuVGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iKS4oKnRocmlmdHRlc3QuWGNlcHRpb24pOyBvayA9PSBmYWxzZSB8fCBlcnIgPT0gbmlsIHsKKwlpZiBlcnIsIG9rIDo9IGNsaWVudC5UZXN0RXhjZXB0aW9uKGRlZmF1bHRDdHgsICJYY2VwdGlvbiIpLigqdGhyaWZ0dGVzdC5YY2VwdGlvbik7IG9rID09IGZhbHNlIHx8IGVyciA9PSBuaWwgewogCQl0LkZhdGFsKCJUZXN0RXhjZXB0aW9uIFhjZXB0aW9uIGZhaWxlZCIpCiAJfSBlbHNlIGlmIGVyci5FcnJvckNvZGUgIT0gMTAwMSB8fCBlcnIuTWVzc2FnZSAhPSAiWGNlcHRpb24iIHsKIAkJdC5GYXRhbCgiVGVzdEV4Y2VwdGlvbiBYY2VwdGlvbiBmYWlsZWQiKQogCX0KIAotCWlmIGVyciA6PSBjbGllbnQuVGVzdEV4Y2VwdGlvbigibm8gRXhjZXB0aW9uIik7IGVyciAhPSBuaWwgeworCWlmIGVyciA6PSBjbGllbnQuVGVzdEV4Y2VwdGlvbihkZWZhdWx0Q3R4LCAibm8gRXhjZXB0aW9uIik7IGVyciAhPSBuaWwgewogCQl0LkZhdGFsKCJUZXN0RXhjZXB0aW9uIG5vIEV4Y2VwdGlvbiBmYWlsZWQiKQogCX0KIAotCWlmIGVyciA6PSBjbGllbnQuVGVzdE9uZXdheSgwKTsgZXJyICE9IG5pbCB7CisJaWYgZXJyIDo9IGNsaWVudC5UZXN0T25ld2F5KGRlZmF1bHRDdHgsIDApOyBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbCgiVGVzdE9uZXdheSBmYWlsZWQiKQogCX0KIH0KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L3Rlc3RzL3RocmlmdHRlc3RfaGFuZGxlci5nbyBiL2xpYi9nby90ZXN0L3Rlc3RzL3RocmlmdHRlc3RfaGFuZGxlci5nbwppbmRleCA1MGZlNzE4Li4zMWI5ZWUyIDEwMDY0NAotLS0gYS9saWIvZ28vdGVzdC90ZXN0cy90aHJpZnR0ZXN0X2hhbmRsZXIuZ28KKysrIGIvbGliL2dvL3Rlc3QvdGVzdHMvdGhyaWZ0dGVzdF9oYW5kbGVyLmdvCkBAIC0yMCw2ICsyMCw3IEBACiBwYWNrYWdlIHRlc3RzCiAKIGltcG9ydCAoCisJImNvbnRleHQiCiAJImVycm9ycyIKIAkidGhyaWZ0IgogCSJ0aHJpZnR0ZXN0IgpAQCAtMzMsMTEgKzM0LDExIEBACiAJcmV0dXJuICZTZWNvbmRTZXJ2aWNlSGFuZGxlcnt9CiB9CiAKLWZ1bmMgKHAgKlNlY29uZFNlcnZpY2VIYW5kbGVyKSBCbGFoQmxhaCgpIChlcnIgZXJyb3IpIHsKK2Z1bmMgKHAgKlNlY29uZFNlcnZpY2VIYW5kbGVyKSBCbGFoQmxhaChjdHggY29udGV4dC5Db250ZXh0KSAoZXJyIGVycm9yKSB7CiAJcmV0dXJuIG5pbAogfQogCi1mdW5jIChwICpTZWNvbmRTZXJ2aWNlSGFuZGxlcikgU2Vjb25kdGVzdFN0cmluZyh0aGluZyBzdHJpbmcpIChyIHN0cmluZywgZXJyIGVycm9yKSB7CitmdW5jIChwICpTZWNvbmRTZXJ2aWNlSGFuZGxlcikgU2Vjb25kdGVzdFN0cmluZyhjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBzdHJpbmcpIChyIHN0cmluZywgZXJyIGVycm9yKSB7CiAJcmV0dXJuIHRoaW5nLCBuaWwKIH0KIApAQCAtNDgsNzEgKzQ5LDcxIEBACiAJcmV0dXJuICZUaHJpZnRUZXN0SGFuZGxlcnt9CiB9CiAKLWZ1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0Vm9pZCgpIChlcnIgZXJyb3IpIHsKK2Z1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0Vm9pZChjdHggY29udGV4dC5Db250ZXh0KSAoZXJyIGVycm9yKSB7CiAJcmV0dXJuIG5pbAogfQogCi1mdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdFN0cmluZyh0aGluZyBzdHJpbmcpIChyIHN0cmluZywgZXJyIGVycm9yKSB7CitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdFN0cmluZyhjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBzdHJpbmcpIChyIHN0cmluZywgZXJyIGVycm9yKSB7CiAJcmV0dXJuIHRoaW5nLCBuaWwKIH0KIAotZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RCb29sKHRoaW5nIGJvb2wpIChyIGJvb2wsIGVyciBlcnJvcikgeworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RCb29sKGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIGJvb2wpIChyIGJvb2wsIGVyciBlcnJvcikgewogCXJldHVybiB0aGluZywgbmlsCiB9CiAKLWZ1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0Qnl0ZSh0aGluZyBpbnQ4KSAociBpbnQ4LCBlcnIgZXJyb3IpIHsKK2Z1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0Qnl0ZShjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBpbnQ4KSAociBpbnQ4LCBlcnIgZXJyb3IpIHsKIAlyZXR1cm4gdGhpbmcsIG5pbAogfQogCi1mdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdEkzMih0aGluZyBpbnQzMikgKHIgaW50MzIsIGVyciBlcnJvcikgeworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RJMzIoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgaW50MzIpIChyIGludDMyLCBlcnIgZXJyb3IpIHsKIAlyZXR1cm4gdGhpbmcsIG5pbAogfQogCi1mdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdEk2NCh0aGluZyBpbnQ2NCkgKHIgaW50NjQsIGVyciBlcnJvcikgeworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RJNjQoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgaW50NjQpIChyIGludDY0LCBlcnIgZXJyb3IpIHsKIAlyZXR1cm4gdGhpbmcsIG5pbAogfQogCi1mdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdERvdWJsZSh0aGluZyBmbG9hdDY0KSAociBmbG9hdDY0LCBlcnIgZXJyb3IpIHsKK2Z1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0RG91YmxlKGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIGZsb2F0NjQpIChyIGZsb2F0NjQsIGVyciBlcnJvcikgewogCXJldHVybiB0aGluZywgbmlsCiB9CiAKLWZ1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0QmluYXJ5KHRoaW5nIFtdYnl0ZSkgKHIgW11ieXRlLCBlcnIgZXJyb3IpIHsKK2Z1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0QmluYXJ5KGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIFtdYnl0ZSkgKHIgW11ieXRlLCBlcnIgZXJyb3IpIHsKIAlyZXR1cm4gdGhpbmcsIG5pbAogfQogCi1mdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdFN0cnVjdCh0aGluZyAqdGhyaWZ0dGVzdC5YdHJ1Y3QpIChyICp0aHJpZnR0ZXN0Llh0cnVjdCwgZXJyIGVycm9yKSB7CitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdFN0cnVjdChjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyAqdGhyaWZ0dGVzdC5YdHJ1Y3QpIChyICp0aHJpZnR0ZXN0Llh0cnVjdCwgZXJyIGVycm9yKSB7CiAJcmV0dXJuIHRoaW5nLCBuaWwKIH0KIAotZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3ROZXN0KHRoaW5nICp0aHJpZnR0ZXN0Llh0cnVjdDIpIChyICp0aHJpZnR0ZXN0Llh0cnVjdDIsIGVyciBlcnJvcikgeworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3ROZXN0KGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nICp0aHJpZnR0ZXN0Llh0cnVjdDIpIChyICp0aHJpZnR0ZXN0Llh0cnVjdDIsIGVyciBlcnJvcikgewogCXJldHVybiB0aGluZywgbmlsCiB9CiAKLWZ1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0TWFwKHRoaW5nIG1hcFtpbnQzMl1pbnQzMikgKHIgbWFwW2ludDMyXWludDMyLCBlcnIgZXJyb3IpIHsKK2Z1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0TWFwKGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIG1hcFtpbnQzMl1pbnQzMikgKHIgbWFwW2ludDMyXWludDMyLCBlcnIgZXJyb3IpIHsKIAlyZXR1cm4gdGhpbmcsIG5pbAogfQogCi1mdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdFN0cmluZ01hcCh0aGluZyBtYXBbc3RyaW5nXXN0cmluZykgKHIgbWFwW3N0cmluZ11zdHJpbmcsIGVyciBlcnJvcikgeworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RTdHJpbmdNYXAoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgbWFwW3N0cmluZ11zdHJpbmcpIChyIG1hcFtzdHJpbmddc3RyaW5nLCBlcnIgZXJyb3IpIHsKIAlyZXR1cm4gdGhpbmcsIG5pbAogfQogCi1mdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdFNldCh0aGluZyBtYXBbaW50MzJdYm9vbCkgKHIgbWFwW2ludDMyXWJvb2wsIGVyciBlcnJvcikgeworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RTZXQoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgW11pbnQzMikgKHIgW11pbnQzMiwgZXJyIGVycm9yKSB7CiAJcmV0dXJuIHRoaW5nLCBuaWwKIH0KIAotZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RMaXN0KHRoaW5nIFtdaW50MzIpIChyIFtdaW50MzIsIGVyciBlcnJvcikgeworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RMaXN0KGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIFtdaW50MzIpIChyIFtdaW50MzIsIGVyciBlcnJvcikgewogCXJldHVybiB0aGluZywgbmlsCiB9CiAKLWZ1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0RW51bSh0aGluZyB0aHJpZnR0ZXN0Lk51bWJlcnopIChyIHRocmlmdHRlc3QuTnVtYmVyeiwgZXJyIGVycm9yKSB7CitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdEVudW0oY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgdGhyaWZ0dGVzdC5OdW1iZXJ6KSAociB0aHJpZnR0ZXN0Lk51bWJlcnosIGVyciBlcnJvcikgewogCXJldHVybiB0aGluZywgbmlsCiB9CiAKLWZ1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0VHlwZWRlZih0aGluZyB0aHJpZnR0ZXN0LlVzZXJJZCkgKHIgdGhyaWZ0dGVzdC5Vc2VySWQsIGVyciBlcnJvcikgeworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RUeXBlZGVmKGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIHRocmlmdHRlc3QuVXNlcklkKSAociB0aHJpZnR0ZXN0LlVzZXJJZCwgZXJyIGVycm9yKSB7CiAJcmV0dXJuIHRoaW5nLCBuaWwKIH0KIAotZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RNYXBNYXAoaGVsbG8gaW50MzIpIChyIG1hcFtpbnQzMl1tYXBbaW50MzJdaW50MzIsIGVyciBlcnJvcikgeworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RNYXBNYXAoY3R4IGNvbnRleHQuQ29udGV4dCwgaGVsbG8gaW50MzIpIChyIG1hcFtpbnQzMl1tYXBbaW50MzJdaW50MzIsIGVyciBlcnJvcikgewogCXIgPSBtYWtlKG1hcFtpbnQzMl1tYXBbaW50MzJdaW50MzIpCiAJcG9zIDo9IG1ha2UobWFwW2ludDMyXWludDMyKQogCW5lZyA6PSBtYWtlKG1hcFtpbnQzMl1pbnQzMikKQEAgLTEyNyw3ICsxMjgsNyBAQAogCXJldHVybiByLCBuaWwKIH0KIAotZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RJbnNhbml0eShhcmd1bWVudCAqdGhyaWZ0dGVzdC5JbnNhbml0eSkgKHIgbWFwW3RocmlmdHRlc3QuVXNlcklkXW1hcFt0aHJpZnR0ZXN0Lk51bWJlcnpdKnRocmlmdHRlc3QuSW5zYW5pdHksIGVyciBlcnJvcikgeworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RJbnNhbml0eShjdHggY29udGV4dC5Db250ZXh0LCBhcmd1bWVudCAqdGhyaWZ0dGVzdC5JbnNhbml0eSkgKHIgbWFwW3RocmlmdHRlc3QuVXNlcklkXW1hcFt0aHJpZnR0ZXN0Lk51bWJlcnpdKnRocmlmdHRlc3QuSW5zYW5pdHksIGVyciBlcnJvcikgewogCWhlbGxvIDo9IHRocmlmdHRlc3QuTmV3WHRydWN0KCkKIAloZWxsby5TdHJpbmdUaGluZyA9ICJIZWxsbzIiCiAJaGVsbG8uQnl0ZVRoaW5nID0gMgpAQCAtMTYyLDcgKzE2Myw3IEBACiAJcmV0dXJuIGluc2FuZSwgbmlsCiB9CiAKLWZ1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0TXVsdGkoYXJnMCBpbnQ4LCBhcmcxIGludDMyLCBhcmcyIGludDY0LCBhcmczIG1hcFtpbnQxNl1zdHJpbmcsIGFyZzQgdGhyaWZ0dGVzdC5OdW1iZXJ6LCBhcmc1IHRocmlmdHRlc3QuVXNlcklkKSAociAqdGhyaWZ0dGVzdC5YdHJ1Y3QsIGVyciBlcnJvcikgeworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RNdWx0aShjdHggY29udGV4dC5Db250ZXh0LCBhcmcwIGludDgsIGFyZzEgaW50MzIsIGFyZzIgaW50NjQsIGFyZzMgbWFwW2ludDE2XXN0cmluZywgYXJnNCB0aHJpZnR0ZXN0Lk51bWJlcnosIGFyZzUgdGhyaWZ0dGVzdC5Vc2VySWQpIChyICp0aHJpZnR0ZXN0Llh0cnVjdCwgZXJyIGVycm9yKSB7CiAJciA9IHRocmlmdHRlc3QuTmV3WHRydWN0KCkKIAlyLlN0cmluZ1RoaW5nID0gIkhlbGxvMiIKIAlyLkJ5dGVUaGluZyA9IGFyZzAKQEAgLTE3MSw3ICsxNzIsNyBAQAogCXJldHVybiByLCBuaWwKIH0KIAotZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RFeGNlcHRpb24oYXJnIHN0cmluZykgKGVyciBlcnJvcikgeworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RFeGNlcHRpb24oY3R4IGNvbnRleHQuQ29udGV4dCwgYXJnIHN0cmluZykgKGVyciBlcnJvcikgewogCWlmIGFyZyA9PSAiWGNlcHRpb24iIHsKIAkJeCA6PSB0aHJpZnR0ZXN0Lk5ld1hjZXB0aW9uKCkKIAkJeC5FcnJvckNvZGUgPSAxMDAxCkBAIC0xODQsNyArMTg1LDcgQEAKIAl9CiB9CiAKLWZ1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0TXVsdGlFeGNlcHRpb24oYXJnMCBzdHJpbmcsIGFyZzEgc3RyaW5nKSAociAqdGhyaWZ0dGVzdC5YdHJ1Y3QsIGVyciBlcnJvcikgeworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RNdWx0aUV4Y2VwdGlvbihjdHggY29udGV4dC5Db250ZXh0LCBhcmcwIHN0cmluZywgYXJnMSBzdHJpbmcpIChyICp0aHJpZnR0ZXN0Llh0cnVjdCwgZXJyIGVycm9yKSB7CiAJaWYgYXJnMCA9PSAiWGNlcHRpb24iIHsKIAkJeCA6PSB0aHJpZnR0ZXN0Lk5ld1hjZXB0aW9uKCkKIAkJeC5FcnJvckNvZGUgPSAxMDAxCkBAIC0yMDMsNyArMjA0LDcgQEAKIAlyZXR1cm4gcmVzLCBuaWwKIH0KIAotZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RPbmV3YXkoc2Vjb25kc1RvU2xlZXAgaW50MzIpIChlcnIgZXJyb3IpIHsKK2Z1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0T25ld2F5KGN0eCBjb250ZXh0LkNvbnRleHQsIHNlY29uZHNUb1NsZWVwIGludDMyKSAoZXJyIGVycm9yKSB7CiAJdGltZS5TbGVlcCh0aW1lLlNlY29uZCAqIHRpbWUuRHVyYXRpb24oc2Vjb25kc1RvU2xlZXApKQogCXJldHVybiBuaWwKIH0KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L3Rlc3RzL3VuaW9uX2JpbmFyeV90ZXN0LmdvIGIvbGliL2dvL3Rlc3QvdGVzdHMvdW5pb25fYmluYXJ5X3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRhZTJjYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L3Rlc3RzL3VuaW9uX2JpbmFyeV90ZXN0LmdvCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0ZXN0cworCitpbXBvcnQgKAorCSJ0ZXN0aW5nIgorCSJ1bmlvbmJpbmFyeXRlc3QiCispCisKKworLy8gU2VlIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ1NzMKK2Z1bmMgVGVzdFVuaW9uQmluYXJ5KHQgKnRlc3RpbmcuVCkgeworCXMgOj0gdW5pb25iaW5hcnl0ZXN0Lk5ld1NhbXBsZSgpCisJcy5VMSA9IG1hcFtzdHJpbmddc3RyaW5ne30KKwlzLlUyID0gW11ieXRle30KKwlpZiBuIDo9IHMuQ291bnRTZXRGaWVsZHNTYW1wbGUoKTsgbiAhPSAyIHsKKwkJdC5FcnJvcmYoIkV4cGVjdGVkIDIgc2V0IGZpZWxkcywgZ290ICVkISIsIG4pCisJfQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9hcHBsaWNhdGlvbl9leGNlcHRpb24uZ28gYi9saWIvZ28vdGhyaWZ0L2FwcGxpY2F0aW9uX2V4Y2VwdGlvbi5nbwppbmRleCA2NjU1Y2M1Li5iOWQ3ZWVkIDEwMDY0NAotLS0gYS9saWIvZ28vdGhyaWZ0L2FwcGxpY2F0aW9uX2V4Y2VwdGlvbi5nbworKysgYi9saWIvZ28vdGhyaWZ0L2FwcGxpY2F0aW9uX2V4Y2VwdGlvbi5nbwpAQCAtMzAsMTEgKzMwLDIyIEBACiAJUFJPVE9DT0xfRVJST1IgICAgICAgICAgICAgICAgID0gNwogKQogCit2YXIgZGVmYXVsdEFwcGxpY2F0aW9uRXhjZXB0aW9uTWVzc2FnZSA9IG1hcFtpbnQzMl1zdHJpbmd7CisJVU5LTk9XTl9BUFBMSUNBVElPTl9FWENFUFRJT046ICAidW5rbm93biBhcHBsaWNhdGlvbiBleGNlcHRpb24iLAorCVVOS05PV05fTUVUSE9EOiAgICAgICAgICAgICAgICAgInVua25vd24gbWV0aG9kIiwKKwlJTlZBTElEX01FU1NBR0VfVFlQRV9FWENFUFRJT046ICJpbnZhbGlkIG1lc3NhZ2UgdHlwZSIsCisJV1JPTkdfTUVUSE9EX05BTUU6ICAgICAgICAgICAgICAid3JvbmcgbWV0aG9kIG5hbWUiLAorCUJBRF9TRVFVRU5DRV9JRDogICAgICAgICAgICAgICAgImJhZCBzZXF1ZW5jZSBJRCIsCisJTUlTU0lOR19SRVNVTFQ6ICAgICAgICAgICAgICAgICAibWlzc2luZyByZXN1bHQiLAorCUlOVEVSTkFMX0VSUk9SOiAgICAgICAgICAgICAgICAgInVua25vd24gaW50ZXJuYWwgZXJyb3IiLAorCVBST1RPQ09MX0VSUk9SOiAgICAgICAgICAgICAgICAgInVua25vd24gcHJvdG9jb2wgZXJyb3IiLAorfQorCiAvLyBBcHBsaWNhdGlvbiBsZXZlbCBUaHJpZnQgZXhjZXB0aW9uCiB0eXBlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBpbnRlcmZhY2UgewogCVRFeGNlcHRpb24KIAlUeXBlSWQoKSBpbnQzMgotCVJlYWQoaXByb3QgVFByb3RvY29sKSAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uLCBlcnJvcikKKwlSZWFkKGlwcm90IFRQcm90b2NvbCkgZXJyb3IKIAlXcml0ZShvcHJvdCBUUHJvdG9jb2wpIGVycm9yCiB9CiAKQEAgLTQ0LDcgKzU1LDEwIEBACiB9CiAKIGZ1bmMgKGUgdEFwcGxpY2F0aW9uRXhjZXB0aW9uKSBFcnJvcigpIHN0cmluZyB7Ci0JcmV0dXJuIGUubWVzc2FnZQorCWlmIGUubWVzc2FnZSAhPSAiIiB7CisJCXJldHVybiBlLm1lc3NhZ2UKKwl9CisJcmV0dXJuIGRlZmF1bHRBcHBsaWNhdGlvbkV4Y2VwdGlvbk1lc3NhZ2VbZS50eXBlX10KIH0KIAogZnVuYyBOZXdUQXBwbGljYXRpb25FeGNlcHRpb24odHlwZV8gaW50MzIsIG1lc3NhZ2Ugc3RyaW5nKSBUQXBwbGljYXRpb25FeGNlcHRpb24gewpAQCAtNTUsMTAgKzY5LDExIEBACiAJcmV0dXJuIHAudHlwZV8KIH0KIAotZnVuYyAocCAqdEFwcGxpY2F0aW9uRXhjZXB0aW9uKSBSZWFkKGlwcm90IFRQcm90b2NvbCkgKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiwgZXJyb3IpIHsKK2Z1bmMgKHAgKnRBcHBsaWNhdGlvbkV4Y2VwdGlvbikgUmVhZChpcHJvdCBUUHJvdG9jb2wpIGVycm9yIHsKKwkvLyBUT0RPOiB0aGlzIHNob3VsZCByZWFsbHkgYmUgZ2VuZXJhdGVkIGJ5IHRoZSBjb21waWxlcgogCV8sIGVyciA6PSBpcHJvdC5SZWFkU3RydWN0QmVnaW4oKQogCWlmIGVyciAhPSBuaWwgewotCQlyZXR1cm4gbmlsLCBlcnIKKwkJcmV0dXJuIGVycgogCX0KIAogCW1lc3NhZ2UgOj0gIiIKQEAgLTY3LDcgKzgyLDcgQEAKIAlmb3IgewogCQlfLCB0dHlwZSwgaWQsIGVyciA6PSBpcHJvdC5SZWFkRmllbGRCZWdpbigpCiAJCWlmIGVyciAhPSBuaWwgewotCQkJcmV0dXJuIG5pbCwgZXJyCisJCQlyZXR1cm4gZXJyCiAJCX0KIAkJaWYgdHR5cGUgPT0gU1RPUCB7CiAJCQlicmVhawpAQCAtNzYsMzMgKzkxLDQwIEBACiAJCWNhc2UgMToKIAkJCWlmIHR0eXBlID09IFNUUklORyB7CiAJCQkJaWYgbWVzc2FnZSwgZXJyID0gaXByb3QuUmVhZFN0cmluZygpOyBlcnIgIT0gbmlsIHsKLQkJCQkJcmV0dXJuIG5pbCwgZXJyCisJCQkJCXJldHVybiBlcnIKIAkJCQl9CiAJCQl9IGVsc2UgewogCQkJCWlmIGVyciA9IFNraXBEZWZhdWx0RGVwdGgoaXByb3QsIHR0eXBlKTsgZXJyICE9IG5pbCB7Ci0JCQkJCXJldHVybiBuaWwsIGVycgorCQkJCQlyZXR1cm4gZXJyCiAJCQkJfQogCQkJfQogCQljYXNlIDI6CiAJCQlpZiB0dHlwZSA9PSBJMzIgewogCQkJCWlmIHR5cGVfLCBlcnIgPSBpcHJvdC5SZWFkSTMyKCk7IGVyciAhPSBuaWwgewotCQkJCQlyZXR1cm4gbmlsLCBlcnIKKwkJCQkJcmV0dXJuIGVycgogCQkJCX0KIAkJCX0gZWxzZSB7CiAJCQkJaWYgZXJyID0gU2tpcERlZmF1bHREZXB0aChpcHJvdCwgdHR5cGUpOyBlcnIgIT0gbmlsIHsKLQkJCQkJcmV0dXJuIG5pbCwgZXJyCisJCQkJCXJldHVybiBlcnIKIAkJCQl9CiAJCQl9CiAJCWRlZmF1bHQ6CiAJCQlpZiBlcnIgPSBTa2lwRGVmYXVsdERlcHRoKGlwcm90LCB0dHlwZSk7IGVyciAhPSBuaWwgewotCQkJCXJldHVybiBuaWwsIGVycgorCQkJCXJldHVybiBlcnIKIAkJCX0KIAkJfQogCQlpZiBlcnIgPSBpcHJvdC5SZWFkRmllbGRFbmQoKTsgZXJyICE9IG5pbCB7Ci0JCQlyZXR1cm4gbmlsLCBlcnIKKwkJCXJldHVybiBlcnIKIAkJfQogCX0KLQlyZXR1cm4gTmV3VEFwcGxpY2F0aW9uRXhjZXB0aW9uKHR5cGVfLCBtZXNzYWdlKSwgaXByb3QuUmVhZFN0cnVjdEVuZCgpCisJaWYgZXJyIDo9IGlwcm90LlJlYWRTdHJ1Y3RFbmQoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisKKwlwLm1lc3NhZ2UgPSBtZXNzYWdlCisJcC50eXBlXyA9IHR5cGVfCisKKwlyZXR1cm4gbmlsCiB9CiAKIGZ1bmMgKHAgKnRBcHBsaWNhdGlvbkV4Y2VwdGlvbikgV3JpdGUob3Byb3QgVFByb3RvY29sKSAoZXJyIGVycm9yKSB7CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2FwcGxpY2F0aW9uX2V4Y2VwdGlvbl90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC9hcHBsaWNhdGlvbl9leGNlcHRpb25fdGVzdC5nbwppbmRleCA3MDEwZjg2Li43NzQzMzU3IDEwMDY0NAotLS0gYS9saWIvZ28vdGhyaWZ0L2FwcGxpY2F0aW9uX2V4Y2VwdGlvbl90ZXN0LmdvCisrKyBiL2xpYi9nby90aHJpZnQvYXBwbGljYXRpb25fZXhjZXB0aW9uX3Rlc3QuZ28KQEAgLTI1LDE3ICsyNSwxNyBAQAogCiBmdW5jIFRlc3RUQXBwbGljYXRpb25FeGNlcHRpb24odCAqdGVzdGluZy5UKSB7CiAJZXhjIDo9IE5ld1RBcHBsaWNhdGlvbkV4Y2VwdGlvbihVTktOT1dOX0FQUExJQ0FUSU9OX0VYQ0VQVElPTiwgIiIpCi0JaWYgZXhjLkVycm9yKCkgIT0gIiIgeworCWlmIGV4Yy5FcnJvcigpICE9IGRlZmF1bHRBcHBsaWNhdGlvbkV4Y2VwdGlvbk1lc3NhZ2VbVU5LTk9XTl9BUFBMSUNBVElPTl9FWENFUFRJT05dIHsKIAkJdC5GYXRhbGYoIkV4cGVjdGVkIGVtcHR5IHN0cmluZyBmb3IgZXhjZXB0aW9uIGJ1dCBmb3VuZCAnJXMnIiwgZXhjLkVycm9yKCkpCiAJfQogCWlmIGV4Yy5UeXBlSWQoKSAhPSBVTktOT1dOX0FQUExJQ0FUSU9OX0VYQ0VQVElPTiB7Ci0JCXQuRmF0YWxmKCJFeHBlY3RlZCB0eXBlIFVOS05PV04gZm9yIGV4Y2VwdGlvbiBidXQgZm91bmQgJyVzJyIsIGV4Yy5UeXBlSWQoKSkKKwkJdC5GYXRhbGYoIkV4cGVjdGVkIHR5cGUgVU5LTk9XTiBmb3IgZXhjZXB0aW9uIGJ1dCBmb3VuZCAnJXYnIiwgZXhjLlR5cGVJZCgpKQogCX0KIAlleGMgPSBOZXdUQXBwbGljYXRpb25FeGNlcHRpb24oV1JPTkdfTUVUSE9EX05BTUUsICJqdW5rX21ldGhvZCIpCiAJaWYgZXhjLkVycm9yKCkgIT0gImp1bmtfbWV0aG9kIiB7CiAJCXQuRmF0YWxmKCJFeHBlY3RlZCAnanVua19tZXRob2QnIGZvciBleGNlcHRpb24gYnV0IGZvdW5kICclcyciLCBleGMuRXJyb3IoKSkKIAl9CiAJaWYgZXhjLlR5cGVJZCgpICE9IFdST05HX01FVEhPRF9OQU1FIHsKLQkJdC5GYXRhbGYoIkV4cGVjdGVkIHR5cGUgV1JPTkdfTUVUSE9EX05BTUUgZm9yIGV4Y2VwdGlvbiBidXQgZm91bmQgJyVzJyIsIGV4Yy5UeXBlSWQoKSkKKwkJdC5GYXRhbGYoIkV4cGVjdGVkIHR5cGUgV1JPTkdfTUVUSE9EX05BTUUgZm9yIGV4Y2VwdGlvbiBidXQgZm91bmQgJyV2JyIsIGV4Yy5UeXBlSWQoKSkKIAl9CiB9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2JpbmFyeV9wcm90b2NvbC5nbyBiL2xpYi9nby90aHJpZnQvYmluYXJ5X3Byb3RvY29sLmdvCmluZGV4IGUxYjQwNTYuLjFmOTBiZjQgMTAwNjQ0Ci0tLSBhL2xpYi9nby90aHJpZnQvYmluYXJ5X3Byb3RvY29sLmdvCisrKyBiL2xpYi9nby90aHJpZnQvYmluYXJ5X3Byb3RvY29sLmdvCkBAIC0yMCw2ICsyMCw4IEBACiBwYWNrYWdlIHRocmlmdAogCiBpbXBvcnQgKAorCSJieXRlcyIKKwkiY29udGV4dCIKIAkiZW5jb2RpbmcvYmluYXJ5IgogCSJlcnJvcnMiCiAJImZtdCIKQEAgLTQ0Niw5ICs0NDgsNiBAQAogCWlmIHNpemUgPCAwIHsKIAkJcmV0dXJuIG5pbCwgaW52YWxpZERhdGFMZW5ndGgKIAl9Ci0JaWYgdWludDY0KHNpemUpID4gcC50cmFucy5SZW1haW5pbmdCeXRlcygpIHsKLQkJcmV0dXJuIG5pbCwgaW52YWxpZERhdGFMZW5ndGgKLQl9CiAKIAlpc2l6ZSA6PSBpbnQoc2l6ZSkKIAlidWYgOj0gbWFrZShbXWJ5dGUsIGlzaXplKQpAQCAtNDU2LDggKzQ1NSw4IEBACiAJcmV0dXJuIGJ1ZiwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKIH0KIAotZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBGbHVzaCgpIChlcnIgZXJyb3IpIHsKLQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKHAudHJhbnMuRmx1c2goKSkKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgRmx1c2goY3R4IGNvbnRleHQuQ29udGV4dCkgKGVyciBlcnJvcikgeworCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24ocC50cmFucy5GbHVzaChjdHgpKQogfQogCiBmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFNraXAoZmllbGRUeXBlIFRUeXBlKSAoZXJyIGVycm9yKSB7CkBAIC00NzMsMTkgKzQ3MiwzOCBAQAogCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQogfQogCitjb25zdCByZWFkTGltaXQgPSAzMjc2OAorCiBmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIHJlYWRTdHJpbmdCb2R5KHNpemUgaW50MzIpICh2YWx1ZSBzdHJpbmcsIGVyciBlcnJvcikgewogCWlmIHNpemUgPCAwIHsKIAkJcmV0dXJuICIiLCBuaWwKIAl9Ci0JaWYgdWludDY0KHNpemUpID4gcC50cmFucy5SZW1haW5pbmdCeXRlcygpIHsKLQkJcmV0dXJuICIiLCBpbnZhbGlkRGF0YUxlbmd0aAorCisJdmFyICgKKwkJYnVmIGJ5dGVzLkJ1ZmZlcgorCQllICAgZXJyb3IKKwkJYiAgIFtdYnl0ZQorCSkKKworCXN3aXRjaCB7CisJY2FzZSBpbnQoc2l6ZSkgPD0gbGVuKHAuYnVmZmVyKToKKwkJYiA9IHAuYnVmZmVyWzpzaXplXSAvLyBhdm9pZHMgYWxsb2NhdGlvbiBmb3Igc21hbGwgcmVhZHMKKwljYXNlIGludChzaXplKSA8IHJlYWRMaW1pdDoKKwkJYiA9IG1ha2UoW11ieXRlLCBzaXplKQorCWRlZmF1bHQ6CisJCWIgPSBtYWtlKFtdYnl0ZSwgcmVhZExpbWl0KQogCX0KLQl2YXIgYnVmIFtdYnl0ZQotCWlmIGludChzaXplKSA8PSBsZW4ocC5idWZmZXIpIHsKLQkJYnVmID0gcC5idWZmZXJbMDpzaXplXQotCX0gZWxzZSB7Ci0JCWJ1ZiA9IG1ha2UoW11ieXRlLCBzaXplKQorCisJZm9yIHNpemUgPiAwIHsKKwkJXywgZSA9IGlvLlJlYWRGdWxsKHAudHJhbnMsIGIpCisJCWJ1Zi5Xcml0ZShiKQorCQlpZiBlICE9IG5pbCB7CisJCQlicmVhaworCQl9CisJCXNpemUgLT0gcmVhZExpbWl0CisJCWlmIHNpemUgPCByZWFkTGltaXQgJiYgc2l6ZSA+IDAgeworCQkJYiA9IGJbOnNpemVdCisJCX0KIAl9Ci0JXywgZSA6PSBpby5SZWFkRnVsbChwLnRyYW5zLCBidWYpCi0JcmV0dXJuIHN0cmluZyhidWYpLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwlyZXR1cm4gYnVmLlN0cmluZygpLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKIH0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvYnVmZmVyZWRfdHJhbnNwb3J0LmdvIGIvbGliL2dvL3RocmlmdC9idWZmZXJlZF90cmFuc3BvcnQuZ28KaW5kZXggOGJjYWQxZS4uOTY3MDIwNiAxMDA2NDQKLS0tIGEvbGliL2dvL3RocmlmdC9idWZmZXJlZF90cmFuc3BvcnQuZ28KKysrIGIvbGliL2dvL3RocmlmdC9idWZmZXJlZF90cmFuc3BvcnQuZ28KQEAgLTIxLDYgKzIxLDcgQEAKIAogaW1wb3J0ICgKIAkiYnVmaW8iCisJImNvbnRleHQiCiApCiAKIHR5cGUgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSBzdHJ1Y3QgewpAQCAtMzIsOCArMzMsOCBAQAogCXRwIFRUcmFuc3BvcnQKIH0KIAotZnVuYyAocCAqVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSkgR2V0VHJhbnNwb3J0KHRyYW5zIFRUcmFuc3BvcnQpIFRUcmFuc3BvcnQgewotCXJldHVybiBOZXdUQnVmZmVyZWRUcmFuc3BvcnQodHJhbnMsIHAuc2l6ZSkKK2Z1bmMgKHAgKlRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkpIEdldFRyYW5zcG9ydCh0cmFucyBUVHJhbnNwb3J0KSAoVFRyYW5zcG9ydCwgZXJyb3IpIHsKKwlyZXR1cm4gTmV3VEJ1ZmZlcmVkVHJhbnNwb3J0KHRyYW5zLCBwLnNpemUpLCBuaWwKIH0KIAogZnVuYyBOZXdUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KGJ1ZmZlclNpemUgaW50KSAqVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSB7CkBAIC02MiwxNCArNjMsMzAgQEAKIAlyZXR1cm4gcC50cC5DbG9zZSgpCiB9CiAKLWZ1bmMgKHAgKlRCdWZmZXJlZFRyYW5zcG9ydCkgRmx1c2goKSBlcnJvciB7CitmdW5jIChwICpUQnVmZmVyZWRUcmFuc3BvcnQpIFJlYWQoYiBbXWJ5dGUpIChpbnQsIGVycm9yKSB7CisJbiwgZXJyIDo9IHAuUmVhZFdyaXRlci5SZWFkKGIpCisJaWYgZXJyICE9IG5pbCB7CisJCXAuUmVhZFdyaXRlci5SZWFkZXIuUmVzZXQocC50cCkKKwl9CisJcmV0dXJuIG4sIGVycgorfQorCitmdW5jIChwICpUQnVmZmVyZWRUcmFuc3BvcnQpIFdyaXRlKGIgW11ieXRlKSAoaW50LCBlcnJvcikgeworCW4sIGVyciA6PSBwLlJlYWRXcml0ZXIuV3JpdGUoYikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcC5SZWFkV3JpdGVyLldyaXRlci5SZXNldChwLnRwKQorCX0KKwlyZXR1cm4gbiwgZXJyCit9CisKK2Z1bmMgKHAgKlRCdWZmZXJlZFRyYW5zcG9ydCkgRmx1c2goY3R4IGNvbnRleHQuQ29udGV4dCkgZXJyb3IgewogCWlmIGVyciA6PSBwLlJlYWRXcml0ZXIuRmx1c2goKTsgZXJyICE9IG5pbCB7CisJCXAuUmVhZFdyaXRlci5Xcml0ZXIuUmVzZXQocC50cCkKIAkJcmV0dXJuIGVycgogCX0KLQlyZXR1cm4gcC50cC5GbHVzaCgpCisJcmV0dXJuIHAudHAuRmx1c2goY3R4KQogfQogCiBmdW5jIChwICpUQnVmZmVyZWRUcmFuc3BvcnQpIFJlbWFpbmluZ0J5dGVzKCkgKG51bV9ieXRlcyB1aW50NjQpIHsKIAlyZXR1cm4gcC50cC5SZW1haW5pbmdCeXRlcygpCiB9Ci0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvY2xpZW50LmdvIGIvbGliL2dvL3RocmlmdC9jbGllbnQuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg3OTFjYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvY2xpZW50LmdvCkBAIC0wLDAgKzEsODUgQEAKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImNvbnRleHQiCisJImZtdCIKKykKKwordHlwZSBUQ2xpZW50IGludGVyZmFjZSB7CisJQ2FsbChjdHggY29udGV4dC5Db250ZXh0LCBtZXRob2Qgc3RyaW5nLCBhcmdzLCByZXN1bHQgVFN0cnVjdCkgZXJyb3IKK30KKwordHlwZSBUU3RhbmRhcmRDbGllbnQgc3RydWN0IHsKKwlzZXFJZCAgICAgICAgaW50MzIKKwlpcHJvdCwgb3Byb3QgVFByb3RvY29sCit9CisKKy8vIFRTdGFuZGFyZENsaWVudCBpbXBsZW1lbnRzIFRDbGllbnQsIGFuZCB1c2VzIHRoZSBzdGFuZGFyZCBtZXNzYWdlIGZvcm1hdCBmb3IgVGhyaWZ0LgorLy8gSXQgaXMgbm90IHNhZmUgZm9yIGNvbmN1cnJlbnQgdXNlLgorZnVuYyBOZXdUU3RhbmRhcmRDbGllbnQoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wgVFByb3RvY29sKSAqVFN0YW5kYXJkQ2xpZW50IHsKKwlyZXR1cm4gJlRTdGFuZGFyZENsaWVudHsKKwkJaXByb3Q6IGlucHV0UHJvdG9jb2wsCisJCW9wcm90OiBvdXRwdXRQcm90b2NvbCwKKwl9Cit9CisKK2Z1bmMgKHAgKlRTdGFuZGFyZENsaWVudCkgU2VuZChjdHggY29udGV4dC5Db250ZXh0LCBvcHJvdCBUUHJvdG9jb2wsIHNlcUlkIGludDMyLCBtZXRob2Qgc3RyaW5nLCBhcmdzIFRTdHJ1Y3QpIGVycm9yIHsKKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVNZXNzYWdlQmVnaW4obWV0aG9kLCBDQUxMLCBzZXFJZCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCWlmIGVyciA6PSBhcmdzLldyaXRlKG9wcm90KTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJaWYgZXJyIDo9IG9wcm90LldyaXRlTWVzc2FnZUVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwlyZXR1cm4gb3Byb3QuRmx1c2goY3R4KQorfQorCitmdW5jIChwICpUU3RhbmRhcmRDbGllbnQpIFJlY3YoaXByb3QgVFByb3RvY29sLCBzZXFJZCBpbnQzMiwgbWV0aG9kIHN0cmluZywgcmVzdWx0IFRTdHJ1Y3QpIGVycm9yIHsKKwlyTWV0aG9kLCByVHlwZUlkLCByU2VxSWQsIGVyciA6PSBpcHJvdC5SZWFkTWVzc2FnZUJlZ2luKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKworCWlmIG1ldGhvZCAhPSByTWV0aG9kIHsKKwkJcmV0dXJuIE5ld1RBcHBsaWNhdGlvbkV4Y2VwdGlvbihXUk9OR19NRVRIT0RfTkFNRSwgZm10LlNwcmludGYoIiVzOiB3cm9uZyBtZXRob2QgbmFtZSIsIG1ldGhvZCkpCisJfSBlbHNlIGlmIHNlcUlkICE9IHJTZXFJZCB7CisJCXJldHVybiBOZXdUQXBwbGljYXRpb25FeGNlcHRpb24oQkFEX1NFUVVFTkNFX0lELCBmbXQuU3ByaW50ZigiJXM6IG91dCBvZiBvcmRlciBzZXF1ZW5jZSByZXNwb25zZSIsIG1ldGhvZCkpCisJfSBlbHNlIGlmIHJUeXBlSWQgPT0gRVhDRVBUSU9OIHsKKwkJdmFyIGV4Y2VwdGlvbiB0QXBwbGljYXRpb25FeGNlcHRpb24KKwkJaWYgZXJyIDo9IGV4Y2VwdGlvbi5SZWFkKGlwcm90KTsgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gZXJyCisJCX0KKworCQlpZiBlcnIgOj0gaXByb3QuUmVhZE1lc3NhZ2VFbmQoKTsgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gZXJyCisJCX0KKworCQlyZXR1cm4gJmV4Y2VwdGlvbgorCX0gZWxzZSBpZiByVHlwZUlkICE9IFJFUExZIHsKKwkJcmV0dXJuIE5ld1RBcHBsaWNhdGlvbkV4Y2VwdGlvbihJTlZBTElEX01FU1NBR0VfVFlQRV9FWENFUFRJT04sIGZtdC5TcHJpbnRmKCIlczogaW52YWxpZCBtZXNzYWdlIHR5cGUiLCBtZXRob2QpKQorCX0KKworCWlmIGVyciA6PSByZXN1bHQuUmVhZChpcHJvdCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCisJcmV0dXJuIGlwcm90LlJlYWRNZXNzYWdlRW5kKCkKK30KKworZnVuYyAocCAqVFN0YW5kYXJkQ2xpZW50KSBDYWxsKGN0eCBjb250ZXh0LkNvbnRleHQsIG1ldGhvZCBzdHJpbmcsIGFyZ3MsIHJlc3VsdCBUU3RydWN0KSBlcnJvciB7CisJcC5zZXFJZCsrCisJc2VxSWQgOj0gcC5zZXFJZAorCisJaWYgZXJyIDo9IHAuU2VuZChjdHgsIHAub3Byb3QsIHNlcUlkLCBtZXRob2QsIGFyZ3MpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKworCS8vIG1ldGhvZCBpcyBvbmV3YXkKKwlpZiByZXN1bHQgPT0gbmlsIHsKKwkJcmV0dXJuIG5pbAorCX0KKworCXJldHVybiBwLlJlY3YocC5pcHJvdCwgc2VxSWQsIG1ldGhvZCwgcmVzdWx0KQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9jb21tb25fdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvY29tbW9uX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM1OTdmZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvY29tbW9uX3Rlc3QuZ28KQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgImNvbnRleHQiCisKK3R5cGUgbW9ja1Byb2Nlc3NvciBzdHJ1Y3QgeworCVByb2Nlc3NGdW5jIGZ1bmMoaW4sIG91dCBUUHJvdG9jb2wpIChib29sLCBURXhjZXB0aW9uKQorfQorCitmdW5jIChtICptb2NrUHJvY2Vzc29yKSBQcm9jZXNzKGN0eCBjb250ZXh0LkNvbnRleHQsIGluLCBvdXQgVFByb3RvY29sKSAoYm9vbCwgVEV4Y2VwdGlvbikgeworCXJldHVybiBtLlByb2Nlc3NGdW5jKGluLCBvdXQpCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2NvbXBhY3RfcHJvdG9jb2wuZ28gYi9saWIvZ28vdGhyaWZ0L2NvbXBhY3RfcHJvdG9jb2wuZ28KaW5kZXggMGJjNWZkZC4uMTkwMGQ1MCAxMDA2NDQKLS0tIGEvbGliL2dvL3RocmlmdC9jb21wYWN0X3Byb3RvY29sLmdvCisrKyBiL2xpYi9nby90aHJpZnQvY29tcGFjdF9wcm90b2NvbC5nbwpAQCAtMjAsNiArMjAsNyBAQAogcGFja2FnZSB0aHJpZnQKIAogaW1wb3J0ICgKKwkiY29udGV4dCIKIAkiZW5jb2RpbmcvYmluYXJ5IgogCSJmbXQiCiAJImlvIgpAQCAtNTYxLDkgKzU2Miw2IEBACiAJaWYgbGVuZ3RoIDwgMCB7CiAJCXJldHVybiAiIiwgaW52YWxpZERhdGFMZW5ndGgKIAl9Ci0JaWYgdWludDY0KGxlbmd0aCkgPiBwLnRyYW5zLlJlbWFpbmluZ0J5dGVzKCkgewotCQlyZXR1cm4gIiIsIGludmFsaWREYXRhTGVuZ3RoCi0JfQogCiAJaWYgbGVuZ3RoID09IDAgewogCQlyZXR1cm4gIiIsIG5pbApAQCAtNTkwLDE3ICs1ODgsMTQgQEAKIAlpZiBsZW5ndGggPCAwIHsKIAkJcmV0dXJuIG5pbCwgaW52YWxpZERhdGFMZW5ndGgKIAl9Ci0JaWYgdWludDY0KGxlbmd0aCkgPiBwLnRyYW5zLlJlbWFpbmluZ0J5dGVzKCkgewotCQlyZXR1cm4gbmlsLCBpbnZhbGlkRGF0YUxlbmd0aAotCX0KIAogCWJ1ZiA6PSBtYWtlKFtdYnl0ZSwgbGVuZ3RoKQogCV8sIGUgPSBpby5SZWFkRnVsbChwLnRyYW5zLCBidWYpCiAJcmV0dXJuIGJ1ZiwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCiB9CiAKLWZ1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIEZsdXNoKCkgKGVyciBlcnJvcikgewotCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24ocC50cmFucy5GbHVzaCgpKQorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgRmx1c2goY3R4IGNvbnRleHQuQ29udGV4dCkgKGVyciBlcnJvcikgeworCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24ocC50cmFucy5GbHVzaChjdHgpKQogfQogCiBmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBTa2lwKGZpZWxkVHlwZSBUVHlwZSkgKGVyciBlcnJvcikgewpAQCAtODA2LDcgKzgwMSw3IEBACiAJY2FzZSBDT01QQUNUX1NUUlVDVDoKIAkJcmV0dXJuIFNUUlVDVCwgbmlsCiAJfQotCXJldHVybiBTVE9QLCBURXhjZXB0aW9uKGZtdC5FcnJvcmYoImRvbid0IGtub3cgd2hhdCB0eXBlOiAlcyIsIHQmMHgwZikpCisJcmV0dXJuIFNUT1AsIFRFeGNlcHRpb24oZm10LkVycm9yZigiZG9uJ3Qga25vdyB3aGF0IHR5cGU6ICV2IiwgdCYweDBmKSkKIH0KIAogLy8gR2l2ZW4gYSBUVHlwZSB2YWx1ZSwgZmluZCB0aGUgYXBwcm9wcmlhdGUgVENvbXBhY3RQcm90b2NvbC5UeXBlcyBjb25zdGFudC4KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvY29tcGFjdF9wcm90b2NvbF90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC9jb21wYWN0X3Byb3RvY29sX3Rlc3QuZ28KaW5kZXggNzI4MTJmOS4uNjVmNzdmMiAxMDA2NDQKLS0tIGEvbGliL2dvL3RocmlmdC9jb21wYWN0X3Byb3RvY29sX3Rlc3QuZ28KKysrIGIvbGliL2dvL3RocmlmdC9jb21wYWN0X3Byb3RvY29sX3Rlc3QuZ28KQEAgLTI2LDI4ICsyNiwzNSBAQAogCiBmdW5jIFRlc3RSZWFkV3JpdGVDb21wYWN0UHJvdG9jb2wodCAqdGVzdGluZy5UKSB7CiAJUmVhZFdyaXRlUHJvdG9jb2xUZXN0KHQsIE5ld1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCkpCi0JICAgdHJhbnNwb3J0cyA6PSBbXVRUcmFuc3BvcnR7Ci0JICAgICBOZXdUTWVtb3J5QnVmZmVyKCksCi0JICAgICBOZXdTdHJlYW1UcmFuc3BvcnRSVyhieXRlcy5OZXdCdWZmZXIobWFrZShbXWJ5dGUsIDAsIDE2Mzg0KSkpLAotCSAgICAgTmV3VEZyYW1lZFRyYW5zcG9ydChOZXdUTWVtb3J5QnVmZmVyKCkpLAotCSAgIH0KLQkgICBmb3IgXywgdHJhbnMgOj0gcmFuZ2UgdHJhbnNwb3J0cyB7Ci0JICAgICBwIDo9IE5ld1RDb21wYWN0UHJvdG9jb2wodHJhbnMpOwotCSAgICAgUmVhZFdyaXRlQm9vbCh0LCBwLCB0cmFucyk7Ci0JICAgICBwID0gTmV3VENvbXBhY3RQcm90b2NvbCh0cmFucyk7Ci0JICAgICBSZWFkV3JpdGVCeXRlKHQsIHAsIHRyYW5zKTsKLQkgICAgIHAgPSBOZXdUQ29tcGFjdFByb3RvY29sKHRyYW5zKTsKLQkgICAgIFJlYWRXcml0ZUkxNih0LCBwLCB0cmFucyk7Ci0JICAgICBwID0gTmV3VENvbXBhY3RQcm90b2NvbCh0cmFucyk7Ci0JICAgICBSZWFkV3JpdGVJMzIodCwgcCwgdHJhbnMpOwotCSAgICAgcCA9IE5ld1RDb21wYWN0UHJvdG9jb2wodHJhbnMpOwotCSAgICAgUmVhZFdyaXRlSTY0KHQsIHAsIHRyYW5zKTsKLQkgICAgIHAgPSBOZXdUQ29tcGFjdFByb3RvY29sKHRyYW5zKTsKLQkgICAgIFJlYWRXcml0ZURvdWJsZSh0LCBwLCB0cmFucyk7Ci0JICAgICBwID0gTmV3VENvbXBhY3RQcm90b2NvbCh0cmFucyk7Ci0JICAgICBSZWFkV3JpdGVTdHJpbmcodCwgcCwgdHJhbnMpOwotCSAgICAgcCA9IE5ld1RDb21wYWN0UHJvdG9jb2wodHJhbnMpOwotCSAgICAgUmVhZFdyaXRlQmluYXJ5KHQsIHAsIHRyYW5zKTsKLQkgICAgIHRyYW5zLkNsb3NlKCk7Ci0JICAgfQorCisJdHJhbnNwb3J0cyA6PSBbXVRUcmFuc3BvcnR7CisJCU5ld1RNZW1vcnlCdWZmZXIoKSwKKwkJTmV3U3RyZWFtVHJhbnNwb3J0UlcoYnl0ZXMuTmV3QnVmZmVyKG1ha2UoW11ieXRlLCAwLCAxNjM4NCkpKSwKKwkJTmV3VEZyYW1lZFRyYW5zcG9ydChOZXdUTWVtb3J5QnVmZmVyKCkpLAorCX0KKworCXpsaWIwLCBfIDo9IE5ld1RabGliVHJhbnNwb3J0KE5ld1RNZW1vcnlCdWZmZXIoKSwgMCkKKwl6bGliNiwgXyA6PSBOZXdUWmxpYlRyYW5zcG9ydChOZXdUTWVtb3J5QnVmZmVyKCksIDYpCisJemxpYjksIF8gOj0gTmV3VFpsaWJUcmFuc3BvcnQoTmV3VEZyYW1lZFRyYW5zcG9ydChOZXdUTWVtb3J5QnVmZmVyKCkpLCA5KQorCXRyYW5zcG9ydHMgPSBhcHBlbmQodHJhbnNwb3J0cywgemxpYjAsIHpsaWI2LCB6bGliOSkKKworCWZvciBfLCB0cmFucyA6PSByYW5nZSB0cmFuc3BvcnRzIHsKKwkJcCA6PSBOZXdUQ29tcGFjdFByb3RvY29sKHRyYW5zKQorCQlSZWFkV3JpdGVCb29sKHQsIHAsIHRyYW5zKQorCQlwID0gTmV3VENvbXBhY3RQcm90b2NvbCh0cmFucykKKwkJUmVhZFdyaXRlQnl0ZSh0LCBwLCB0cmFucykKKwkJcCA9IE5ld1RDb21wYWN0UHJvdG9jb2wodHJhbnMpCisJCVJlYWRXcml0ZUkxNih0LCBwLCB0cmFucykKKwkJcCA9IE5ld1RDb21wYWN0UHJvdG9jb2wodHJhbnMpCisJCVJlYWRXcml0ZUkzMih0LCBwLCB0cmFucykKKwkJcCA9IE5ld1RDb21wYWN0UHJvdG9jb2wodHJhbnMpCisJCVJlYWRXcml0ZUk2NCh0LCBwLCB0cmFucykKKwkJcCA9IE5ld1RDb21wYWN0UHJvdG9jb2wodHJhbnMpCisJCVJlYWRXcml0ZURvdWJsZSh0LCBwLCB0cmFucykKKwkJcCA9IE5ld1RDb21wYWN0UHJvdG9jb2wodHJhbnMpCisJCVJlYWRXcml0ZVN0cmluZyh0LCBwLCB0cmFucykKKwkJcCA9IE5ld1RDb21wYWN0UHJvdG9jb2wodHJhbnMpCisJCVJlYWRXcml0ZUJpbmFyeSh0LCBwLCB0cmFucykKKwkJdHJhbnMuQ2xvc2UoKQorCX0KIH0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvY29udGV4dC5nbyBiL2xpYi9nby90aHJpZnQvY29udGV4dC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTVjMWJjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9jb250ZXh0LmdvCkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICJjb250ZXh0IgorCit2YXIgZGVmYXVsdEN0eCA9IGNvbnRleHQuQmFja2dyb3VuZCgpCmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2RlYnVnX3Byb3RvY29sLmdvIGIvbGliL2dvL3RocmlmdC9kZWJ1Z19wcm90b2NvbC5nbwppbmRleCBkMzcyNTJjLi41Nzk0M2UwIDEwMDY0NAotLS0gYS9saWIvZ28vdGhyaWZ0L2RlYnVnX3Byb3RvY29sLmdvCisrKyBiL2xpYi9nby90aHJpZnQvZGVidWdfcHJvdG9jb2wuZ28KQEAgLTIwLDYgKzIwLDcgQEAKIHBhY2thZ2UgdGhyaWZ0CiAKIGltcG9ydCAoCisJImNvbnRleHQiCiAJImxvZyIKICkKIApAQCAtMjU4LDggKzI1OSw4IEBACiAJbG9nLlByaW50ZigiJXNTa2lwKGZpZWxkVHlwZT0lI3YpIChlcnI9JSN2KSIsIHRkcC5Mb2dQcmVmaXgsIGZpZWxkVHlwZSwgZXJyKQogCXJldHVybgogfQotZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgRmx1c2goKSAoZXJyIGVycm9yKSB7Ci0JZXJyID0gdGRwLkRlbGVnYXRlLkZsdXNoKCkKK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIEZsdXNoKGN0eCBjb250ZXh0LkNvbnRleHQpIChlcnIgZXJyb3IpIHsKKwllcnIgPSB0ZHAuRGVsZWdhdGUuRmx1c2goY3R4KQogCWxvZy5QcmludGYoIiVzRmx1c2goKSAoZXJyPSUjdikiLCB0ZHAuTG9nUHJlZml4LCBlcnIpCiAJcmV0dXJuCiB9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2ZyYW1lZF90cmFuc3BvcnQuZ28gYi9saWIvZ28vdGhyaWZ0L2ZyYW1lZF90cmFuc3BvcnQuZ28KaW5kZXggZDBiYWUyMS4uODFmYTY1YSAxMDA2NDQKLS0tIGEvbGliL2dvL3RocmlmdC9mcmFtZWRfdHJhbnNwb3J0LmdvCisrKyBiL2xpYi9nby90aHJpZnQvZnJhbWVkX3RyYW5zcG9ydC5nbwpAQCAtMjIsNiArMjIsNyBAQAogaW1wb3J0ICgKIAkiYnVmaW8iCiAJImJ5dGVzIgorCSJjb250ZXh0IgogCSJlbmNvZGluZy9iaW5hcnkiCiAJImZtdCIKIAkiaW8iCkBAIC00OCwxMSArNDksMTUgQEAKIH0KIAogZnVuYyBOZXdURnJhbWVkVHJhbnNwb3J0RmFjdG9yeU1heExlbmd0aChmYWN0b3J5IFRUcmFuc3BvcnRGYWN0b3J5LCBtYXhMZW5ndGggdWludDMyKSBUVHJhbnNwb3J0RmFjdG9yeSB7Ci0gICAgICAgIHJldHVybiAmdEZyYW1lZFRyYW5zcG9ydEZhY3Rvcnl7ZmFjdG9yeTogZmFjdG9yeSwgbWF4TGVuZ3RoOiBtYXhMZW5ndGh9CisJcmV0dXJuICZ0RnJhbWVkVHJhbnNwb3J0RmFjdG9yeXtmYWN0b3J5OiBmYWN0b3J5LCBtYXhMZW5ndGg6IG1heExlbmd0aH0KIH0KIAotZnVuYyAocCAqdEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkpIEdldFRyYW5zcG9ydChiYXNlIFRUcmFuc3BvcnQpIFRUcmFuc3BvcnQgewotCXJldHVybiBOZXdURnJhbWVkVHJhbnNwb3J0TWF4TGVuZ3RoKHAuZmFjdG9yeS5HZXRUcmFuc3BvcnQoYmFzZSksIHAubWF4TGVuZ3RoKQorZnVuYyAocCAqdEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkpIEdldFRyYW5zcG9ydChiYXNlIFRUcmFuc3BvcnQpIChUVHJhbnNwb3J0LCBlcnJvcikgeworCXR0LCBlcnIgOj0gcC5mYWN0b3J5LkdldFRyYW5zcG9ydChiYXNlKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gbmlsLCBlcnIKKwl9CisJcmV0dXJuIE5ld1RGcmFtZWRUcmFuc3BvcnRNYXhMZW5ndGgodHQsIHAubWF4TGVuZ3RoKSwgbmlsCiB9CiAKIGZ1bmMgTmV3VEZyYW1lZFRyYW5zcG9ydCh0cmFuc3BvcnQgVFRyYW5zcG9ydCkgKlRGcmFtZWRUcmFuc3BvcnQgewpAQCAtMTMxLDIxICsxMzYsMjMgQEAKIAlyZXR1cm4gcC5idWYuV3JpdGVTdHJpbmcocykKIH0KIAotZnVuYyAocCAqVEZyYW1lZFRyYW5zcG9ydCkgRmx1c2goKSBlcnJvciB7CitmdW5jIChwICpURnJhbWVkVHJhbnNwb3J0KSBGbHVzaChjdHggY29udGV4dC5Db250ZXh0KSBlcnJvciB7CiAJc2l6ZSA6PSBwLmJ1Zi5MZW4oKQogCWJ1ZiA6PSBwLmJ1ZmZlcls6NF0KIAliaW5hcnkuQmlnRW5kaWFuLlB1dFVpbnQzMihidWYsIHVpbnQzMihzaXplKSkKIAlfLCBlcnIgOj0gcC50cmFuc3BvcnQuV3JpdGUoYnVmKQogCWlmIGVyciAhPSBuaWwgeworCQlwLmJ1Zi5UcnVuY2F0ZSgwKQogCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21FcnJvcihlcnIpCiAJfQogCWlmIHNpemUgPiAwIHsKIAkJaWYgbiwgZXJyIDo9IHAuYnVmLldyaXRlVG8ocC50cmFuc3BvcnQpOyBlcnIgIT0gbmlsIHsKIAkJCXByaW50KCJFcnJvciB3aGlsZSBmbHVzaGluZyB3cml0ZSBidWZmZXIgb2Ygc2l6ZSAiLCBzaXplLCAiIHRvIHRyYW5zcG9ydCwgb25seSB3cm90ZSAiLCBuLCAiIGJ5dGVzOiAiLCBlcnIuRXJyb3IoKSwgIlxuIikKKwkJCXAuYnVmLlRydW5jYXRlKDApCiAJCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21FcnJvcihlcnIpCiAJCX0KIAl9Ci0JZXJyID0gcC50cmFuc3BvcnQuRmx1c2goKQorCWVyciA9IHAudHJhbnNwb3J0LkZsdXNoKGN0eCkKIAlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21FcnJvcihlcnIpCiB9CiAKQEAgLTE2NCw0ICsxNzEsMyBAQAogZnVuYyAocCAqVEZyYW1lZFRyYW5zcG9ydCkgUmVtYWluaW5nQnl0ZXMoKSAobnVtX2J5dGVzIHVpbnQ2NCkgewogCXJldHVybiB1aW50NjQocC5mcmFtZVNpemUpCiB9Ci0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvaHR0cF9jbGllbnQuZ28gYi9saWIvZ28vdGhyaWZ0L2h0dHBfY2xpZW50LmdvCmluZGV4IGJmMGVkNjIuLjVjODJiZjUgMTAwNjQ0Ci0tLSBhL2xpYi9nby90aHJpZnQvaHR0cF9jbGllbnQuZ28KKysrIGIvbGliL2dvL3RocmlmdC9odHRwX2NsaWVudC5nbwpAQCAtMjEsMTMgKzIxLDIxIEBACiAKIGltcG9ydCAoCiAJImJ5dGVzIgorCSJjb250ZXh0IgogCSJpbyIKKwkiaW8vaW91dGlsIgogCSJuZXQvaHR0cCIKIAkibmV0L3VybCIKIAkic3RyY29udiIKICkKIAorLy8gRGVmYXVsdCB0byB1c2luZyB0aGUgc2hhcmVkIGh0dHAgY2xpZW50LiBMaWJyYXJ5IHVzZXJzIGFyZQorLy8gZnJlZSB0byBjaGFuZ2UgdGhpcyBnbG9iYWwgY2xpZW50IG9yIHNwZWNpZnkgb25lIHRocm91Z2gKKy8vIFRIdHRwQ2xpZW50T3B0aW9ucy4KK3ZhciBEZWZhdWx0SHR0cENsaWVudCAqaHR0cC5DbGllbnQgPSBodHRwLkRlZmF1bHRDbGllbnQKKwogdHlwZSBUSHR0cENsaWVudCBzdHJ1Y3QgeworCWNsaWVudCAgICAgICAgICAgICAqaHR0cC5DbGllbnQKIAlyZXNwb25zZSAgICAgICAgICAgKmh0dHAuUmVzcG9uc2UKIAl1cmwgICAgICAgICAgICAgICAgKnVybC5VUkwKIAlyZXF1ZXN0QnVmZmVyICAgICAgKmJ5dGVzLkJ1ZmZlcgpAQCAtMzcsNTcgKzQ1LDQ5IEBACiB9CiAKIHR5cGUgVEh0dHBDbGllbnRUcmFuc3BvcnRGYWN0b3J5IHN0cnVjdCB7Ci0JdXJsICAgIHN0cmluZwotCWlzUG9zdCBib29sCisJb3B0aW9ucyBUSHR0cENsaWVudE9wdGlvbnMKKwl1cmwgICAgIHN0cmluZwogfQogCi1mdW5jIChwICpUSHR0cENsaWVudFRyYW5zcG9ydEZhY3RvcnkpIEdldFRyYW5zcG9ydCh0cmFucyBUVHJhbnNwb3J0KSBUVHJhbnNwb3J0IHsKK2Z1bmMgKHAgKlRIdHRwQ2xpZW50VHJhbnNwb3J0RmFjdG9yeSkgR2V0VHJhbnNwb3J0KHRyYW5zIFRUcmFuc3BvcnQpIChUVHJhbnNwb3J0LCBlcnJvcikgewogCWlmIHRyYW5zICE9IG5pbCB7CiAJCXQsIG9rIDo9IHRyYW5zLigqVEh0dHBDbGllbnQpCiAJCWlmIG9rICYmIHQudXJsICE9IG5pbCB7Ci0JCQlpZiB0LnJlcXVlc3RCdWZmZXIgIT0gbmlsIHsKLQkJCQl0MiwgXyA6PSBOZXdUSHR0cFBvc3RDbGllbnQodC51cmwuU3RyaW5nKCkpCi0JCQkJcmV0dXJuIHQyCi0JCQl9Ci0JCQl0MiwgXyA6PSBOZXdUSHR0cENsaWVudCh0LnVybC5TdHJpbmcoKSkKLQkJCXJldHVybiB0MgorCQkJcmV0dXJuIE5ld1RIdHRwQ2xpZW50V2l0aE9wdGlvbnModC51cmwuU3RyaW5nKCksIHAub3B0aW9ucykKIAkJfQogCX0KLQlpZiBwLmlzUG9zdCB7Ci0JCXMsIF8gOj0gTmV3VEh0dHBQb3N0Q2xpZW50KHAudXJsKQotCQlyZXR1cm4gcwotCX0KLQlzLCBfIDo9IE5ld1RIdHRwQ2xpZW50KHAudXJsKQotCXJldHVybiBzCisJcmV0dXJuIE5ld1RIdHRwQ2xpZW50V2l0aE9wdGlvbnMocC51cmwsIHAub3B0aW9ucykKK30KKwordHlwZSBUSHR0cENsaWVudE9wdGlvbnMgc3RydWN0IHsKKwkvLyBJZiBuaWwsIERlZmF1bHRIdHRwQ2xpZW50IGlzIHVzZWQKKwlDbGllbnQgKmh0dHAuQ2xpZW50CiB9CiAKIGZ1bmMgTmV3VEh0dHBDbGllbnRUcmFuc3BvcnRGYWN0b3J5KHVybCBzdHJpbmcpICpUSHR0cENsaWVudFRyYW5zcG9ydEZhY3RvcnkgewotCXJldHVybiAmVEh0dHBDbGllbnRUcmFuc3BvcnRGYWN0b3J5e3VybDogdXJsLCBpc1Bvc3Q6IGZhbHNlfQorCXJldHVybiBOZXdUSHR0cENsaWVudFRyYW5zcG9ydEZhY3RvcnlXaXRoT3B0aW9ucyh1cmwsIFRIdHRwQ2xpZW50T3B0aW9uc3t9KQogfQogCi1mdW5jIE5ld1RIdHRwUG9zdENsaWVudFRyYW5zcG9ydEZhY3RvcnkodXJsIHN0cmluZykgKlRIdHRwQ2xpZW50VHJhbnNwb3J0RmFjdG9yeSB7Ci0JcmV0dXJuICZUSHR0cENsaWVudFRyYW5zcG9ydEZhY3Rvcnl7dXJsOiB1cmwsIGlzUG9zdDogdHJ1ZX0KK2Z1bmMgTmV3VEh0dHBDbGllbnRUcmFuc3BvcnRGYWN0b3J5V2l0aE9wdGlvbnModXJsIHN0cmluZywgb3B0aW9ucyBUSHR0cENsaWVudE9wdGlvbnMpICpUSHR0cENsaWVudFRyYW5zcG9ydEZhY3RvcnkgeworCXJldHVybiAmVEh0dHBDbGllbnRUcmFuc3BvcnRGYWN0b3J5e3VybDogdXJsLCBvcHRpb25zOiBvcHRpb25zfQogfQogCi1mdW5jIE5ld1RIdHRwQ2xpZW50KHVybHN0ciBzdHJpbmcpIChUVHJhbnNwb3J0LCBlcnJvcikgewotCXBhcnNlZFVSTCwgZXJyIDo9IHVybC5QYXJzZSh1cmxzdHIpCi0JaWYgZXJyICE9IG5pbCB7Ci0JCXJldHVybiBuaWwsIGVycgotCX0KLQlyZXNwb25zZSwgZXJyIDo9IGh0dHAuR2V0KHVybHN0cikKLQlpZiBlcnIgIT0gbmlsIHsKLQkJcmV0dXJuIG5pbCwgZXJyCi0JfQotCXJldHVybiAmVEh0dHBDbGllbnR7cmVzcG9uc2U6IHJlc3BvbnNlLCB1cmw6IHBhcnNlZFVSTH0sIG5pbAotfQotCi1mdW5jIE5ld1RIdHRwUG9zdENsaWVudCh1cmxzdHIgc3RyaW5nKSAoVFRyYW5zcG9ydCwgZXJyb3IpIHsKK2Z1bmMgTmV3VEh0dHBDbGllbnRXaXRoT3B0aW9ucyh1cmxzdHIgc3RyaW5nLCBvcHRpb25zIFRIdHRwQ2xpZW50T3B0aW9ucykgKFRUcmFuc3BvcnQsIGVycm9yKSB7CiAJcGFyc2VkVVJMLCBlcnIgOj0gdXJsLlBhcnNlKHVybHN0cikKIAlpZiBlcnIgIT0gbmlsIHsKIAkJcmV0dXJuIG5pbCwgZXJyCiAJfQogCWJ1ZiA6PSBtYWtlKFtdYnl0ZSwgMCwgMTAyNCkKLQlyZXR1cm4gJlRIdHRwQ2xpZW50e3VybDogcGFyc2VkVVJMLCByZXF1ZXN0QnVmZmVyOiBieXRlcy5OZXdCdWZmZXIoYnVmKSwgaGVhZGVyOiBodHRwLkhlYWRlcnt9fSwgbmlsCisJY2xpZW50IDo9IG9wdGlvbnMuQ2xpZW50CisJaWYgY2xpZW50ID09IG5pbCB7CisJCWNsaWVudCA9IERlZmF1bHRIdHRwQ2xpZW50CisJfQorCWh0dHBIZWFkZXIgOj0gbWFwW3N0cmluZ11bXXN0cmluZ3siQ29udGVudC1UeXBlIjogeyJhcHBsaWNhdGlvbi94LXRocmlmdCJ9fQorCXJldHVybiAmVEh0dHBDbGllbnR7Y2xpZW50OiBjbGllbnQsIHVybDogcGFyc2VkVVJMLCByZXF1ZXN0QnVmZmVyOiBieXRlcy5OZXdCdWZmZXIoYnVmKSwgaGVhZGVyOiBodHRwSGVhZGVyfSwgbmlsCit9CisKK2Z1bmMgTmV3VEh0dHBDbGllbnQodXJsc3RyIHN0cmluZykgKFRUcmFuc3BvcnQsIGVycm9yKSB7CisJcmV0dXJuIE5ld1RIdHRwQ2xpZW50V2l0aE9wdGlvbnModXJsc3RyLCBUSHR0cENsaWVudE9wdGlvbnN7fSkKIH0KIAogLy8gU2V0IHRoZSBIVFRQIEhlYWRlciBmb3IgdGhpcyBzcGVjaWZpYyBUaHJpZnQgVHJhbnNwb3J0CkBAIC0xMzIsNiArMTMyLDEzIEBACiBmdW5jIChwICpUSHR0cENsaWVudCkgY2xvc2VSZXNwb25zZSgpIGVycm9yIHsKIAl2YXIgZXJyIGVycm9yCiAJaWYgcC5yZXNwb25zZSAhPSBuaWwgJiYgcC5yZXNwb25zZS5Cb2R5ICE9IG5pbCB7CisJCS8vIFRoZSBkb2NzIHNwZWNpZnkgdGhhdCBpZiBrZWVwYWxpdmUgaXMgZW5hYmxlZCBhbmQgdGhlIHJlc3BvbnNlIGJvZHkgaXMgbm90CisJCS8vIHJlYWQgdG8gY29tcGxldGlvbiB0aGUgY29ubmVjdGlvbiB3aWxsIG5ldmVyIGJlIHJldHVybmVkIHRvIHRoZSBwb29sIGFuZAorCQkvLyByZXVzZWQuIEVycm9ycyBhcmUgYmVpbmcgaWdub3JlZCBoZXJlIGJlY2F1c2UgaWYgdGhlIGNvbm5lY3Rpb24gaXMgaW52YWxpZAorCQkvLyBhbmQgdGhpcyBmYWlscyBmb3Igc29tZSByZWFzb24sIHRoZSBDbG9zZSgpIG1ldGhvZCB3aWxsIGRvIGFueSByZW1haW5pbmcKKwkJLy8gY2xlYW51cC4KKwkJaW8uQ29weShpb3V0aWwuRGlzY2FyZCwgcC5yZXNwb25zZS5Cb2R5KQorCiAJCWVyciA9IHAucmVzcG9uc2UuQm9keS5DbG9zZSgpCiAJfQogCkBAIC0xNzUsMjQgKzE4MiwyOCBAQAogCXJldHVybiBwLnJlcXVlc3RCdWZmZXIuV3JpdGVTdHJpbmcocykKIH0KIAotZnVuYyAocCAqVEh0dHBDbGllbnQpIEZsdXNoKCkgZXJyb3IgeworZnVuYyAocCAqVEh0dHBDbGllbnQpIEZsdXNoKGN0eCBjb250ZXh0LkNvbnRleHQpIGVycm9yIHsKIAkvLyBDbG9zZSBhbnkgcHJldmlvdXMgcmVzcG9uc2UgYm9keSB0byBhdm9pZCBsZWFraW5nIGNvbm5lY3Rpb25zLgogCXAuY2xvc2VSZXNwb25zZSgpCiAKLQljbGllbnQgOj0gJmh0dHAuQ2xpZW50e30KIAlyZXEsIGVyciA6PSBodHRwLk5ld1JlcXVlc3QoIlBPU1QiLCBwLnVybC5TdHJpbmcoKSwgcC5yZXF1ZXN0QnVmZmVyKQogCWlmIGVyciAhPSBuaWwgewogCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21FcnJvcihlcnIpCiAJfQotCXAuaGVhZGVyLkFkZCgiQ29udGVudC1UeXBlIiwgImFwcGxpY2F0aW9uL3gtdGhyaWZ0IikKIAlyZXEuSGVhZGVyID0gcC5oZWFkZXIKLQlyZXNwb25zZSwgZXJyIDo9IGNsaWVudC5EbyhyZXEpCisJaWYgY3R4ICE9IG5pbCB7CisJCXJlcSA9IHJlcS5XaXRoQ29udGV4dChjdHgpCisJfQorCXJlc3BvbnNlLCBlcnIgOj0gcC5jbGllbnQuRG8ocmVxKQogCWlmIGVyciAhPSBuaWwgewogCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21FcnJvcihlcnIpCiAJfQogCWlmIHJlc3BvbnNlLlN0YXR1c0NvZGUgIT0gaHR0cC5TdGF0dXNPSyB7Ci0JCS8vIENsb3NlIHRoZSByZXNwb25zZSB0byBhdm9pZCBsZWFraW5nIGZpbGUgZGVzY3JpcHRvcnMuCi0JCXJlc3BvbnNlLkJvZHkuQ2xvc2UoKQorCQkvLyBDbG9zZSB0aGUgcmVzcG9uc2UgdG8gYXZvaWQgbGVha2luZyBmaWxlIGRlc2NyaXB0b3JzLiBjbG9zZVJlc3BvbnNlIGRvZXMKKwkJLy8gbW9yZSB0aGFuIGp1c3QgY2FsbCBDbG9zZSgpLCBzbyB0ZW1wb3JhcmlseSBhc3NpZ24gaXQgYW5kIHJldXNlIHRoZSBsb2dpYy4KKwkJcC5yZXNwb25zZSA9IHJlc3BvbnNlCisJCXAuY2xvc2VSZXNwb25zZSgpCisKIAkJLy8gVE9ETyhwb21hY2spIGxvZyBiYWQgcmVzcG9uc2UKIAkJcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oVU5LTk9XTl9UUkFOU1BPUlRfRVhDRVBUSU9OLCAiSFRUUCBSZXNwb25zZSBjb2RlOiAiK3N0cmNvbnYuSXRvYShyZXNwb25zZS5TdGF0dXNDb2RlKSkKIAl9CkBAIC0yMDEsMTIgKzIxMiwzMSBAQAogfQogCiBmdW5jIChwICpUSHR0cENsaWVudCkgUmVtYWluaW5nQnl0ZXMoKSAobnVtX2J5dGVzIHVpbnQ2NCkgewotCWxlbiA6PSBwLnJlc3BvbnNlLkNvbnRlbnRMZW5ndGggCisJbGVuIDo9IHAucmVzcG9uc2UuQ29udGVudExlbmd0aAogCWlmIGxlbiA+PSAwIHsKIAkJcmV0dXJuIHVpbnQ2NChsZW4pCiAJfQotCQorCiAJY29uc3QgbWF4U2l6ZSA9IF51aW50NjQoMCkKLQlyZXR1cm4gbWF4U2l6ZSAgLy8gdGhlIHRocnV0aCBpcywgd2UganVzdCBkb24ndCBrbm93IHVubGVzcyBmcmFtZWQgaXMgdXNlZAorCXJldHVybiBtYXhTaXplIC8vIHRoZSB0aHJ1dGggaXMsIHdlIGp1c3QgZG9uJ3Qga25vdyB1bmxlc3MgZnJhbWVkIGlzIHVzZWQKIH0KIAorLy8gRGVwcmVjYXRlZDogVXNlIE5ld1RIdHRwQ2xpZW50VHJhbnNwb3J0RmFjdG9yeSBpbnN0ZWFkLgorZnVuYyBOZXdUSHR0cFBvc3RDbGllbnRUcmFuc3BvcnRGYWN0b3J5KHVybCBzdHJpbmcpICpUSHR0cENsaWVudFRyYW5zcG9ydEZhY3RvcnkgeworCXJldHVybiBOZXdUSHR0cENsaWVudFRyYW5zcG9ydEZhY3RvcnlXaXRoT3B0aW9ucyh1cmwsIFRIdHRwQ2xpZW50T3B0aW9uc3t9KQorfQorCisvLyBEZXByZWNhdGVkOiBVc2UgTmV3VEh0dHBDbGllbnRUcmFuc3BvcnRGYWN0b3J5V2l0aE9wdGlvbnMgaW5zdGVhZC4KK2Z1bmMgTmV3VEh0dHBQb3N0Q2xpZW50VHJhbnNwb3J0RmFjdG9yeVdpdGhPcHRpb25zKHVybCBzdHJpbmcsIG9wdGlvbnMgVEh0dHBDbGllbnRPcHRpb25zKSAqVEh0dHBDbGllbnRUcmFuc3BvcnRGYWN0b3J5IHsKKwlyZXR1cm4gTmV3VEh0dHBDbGllbnRUcmFuc3BvcnRGYWN0b3J5V2l0aE9wdGlvbnModXJsLCBvcHRpb25zKQorfQorCisvLyBEZXByZWNhdGVkOiBVc2UgTmV3VEh0dHBDbGllbnRXaXRoT3B0aW9ucyBpbnN0ZWFkLgorZnVuYyBOZXdUSHR0cFBvc3RDbGllbnRXaXRoT3B0aW9ucyh1cmxzdHIgc3RyaW5nLCBvcHRpb25zIFRIdHRwQ2xpZW50T3B0aW9ucykgKFRUcmFuc3BvcnQsIGVycm9yKSB7CisJcmV0dXJuIE5ld1RIdHRwQ2xpZW50V2l0aE9wdGlvbnModXJsc3RyLCBvcHRpb25zKQorfQorCisvLyBEZXByZWNhdGVkOiBVc2UgTmV3VEh0dHBDbGllbnQgaW5zdGVhZC4KK2Z1bmMgTmV3VEh0dHBQb3N0Q2xpZW50KHVybHN0ciBzdHJpbmcpIChUVHJhbnNwb3J0LCBlcnJvcikgeworCXJldHVybiBOZXdUSHR0cENsaWVudFdpdGhPcHRpb25zKHVybHN0ciwgVEh0dHBDbGllbnRPcHRpb25ze30pCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2h0dHBfY2xpZW50X3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L2h0dHBfY2xpZW50X3Rlc3QuZ28KaW5kZXggMGMyY2IyOC4uNDUzNjgwYSAxMDA2NDQKLS0tIGEvbGliL2dvL3RocmlmdC9odHRwX2NsaWVudF90ZXN0LmdvCisrKyBiL2xpYi9nby90aHJpZnQvaHR0cF9jbGllbnRfdGVzdC5nbwpAQCAtMjAsNiArMjAsNyBAQAogcGFja2FnZSB0aHJpZnQKIAogaW1wb3J0ICgKKwkibmV0L2h0dHAiCiAJInRlc3RpbmciCiApCiAKQEAgLTQ4LDMgKzQ5LDU4IEBACiAJfQogCVRyYW5zcG9ydEhlYWRlclRlc3QodCwgdHJhbnMsIHRyYW5zKQogfQorCitmdW5jIFRlc3RIdHRwQ3VzdG9tQ2xpZW50KHQgKnRlc3RpbmcuVCkgeworCWwsIGFkZHIgOj0gSHR0cENsaWVudFNldHVwRm9yVGVzdCh0KQorCWlmIGwgIT0gbmlsIHsKKwkJZGVmZXIgbC5DbG9zZSgpCisJfQorCisJaHR0cFRyYW5zcG9ydCA6PSAmY3VzdG9tSHR0cFRyYW5zcG9ydHt9CisKKwl0cmFucywgZXJyIDo9IE5ld1RIdHRwUG9zdENsaWVudFdpdGhPcHRpb25zKCJodHRwOi8vIithZGRyLlN0cmluZygpLCBUSHR0cENsaWVudE9wdGlvbnN7CisJCUNsaWVudDogJmh0dHAuQ2xpZW50eworCQkJVHJhbnNwb3J0OiBodHRwVHJhbnNwb3J0LAorCQl9LAorCX0pCisJaWYgZXJyICE9IG5pbCB7CisJCWwuQ2xvc2UoKQorCQl0LkZhdGFsZigiVW5hYmxlIHRvIGNvbm5lY3QgdG8gJXM6ICVzIiwgYWRkci5TdHJpbmcoKSwgZXJyKQorCX0KKwlUcmFuc3BvcnRIZWFkZXJUZXN0KHQsIHRyYW5zLCB0cmFucykKKworCWlmICFodHRwVHJhbnNwb3J0LmhpdCB7CisJCXQuRmF0YWxmKCJDdXN0b20gY2xpZW50IHdhcyBub3QgdXNlZCIpCisJfQorfQorCitmdW5jIFRlc3RIdHRwQ3VzdG9tQ2xpZW50UGFja2FnZVNjb3BlKHQgKnRlc3RpbmcuVCkgeworCWwsIGFkZHIgOj0gSHR0cENsaWVudFNldHVwRm9yVGVzdCh0KQorCWlmIGwgIT0gbmlsIHsKKwkJZGVmZXIgbC5DbG9zZSgpCisJfQorCWh0dHBUcmFuc3BvcnQgOj0gJmN1c3RvbUh0dHBUcmFuc3BvcnR7fQorCURlZmF1bHRIdHRwQ2xpZW50ID0gJmh0dHAuQ2xpZW50eworCQlUcmFuc3BvcnQ6IGh0dHBUcmFuc3BvcnQsCisJfQorCisJdHJhbnMsIGVyciA6PSBOZXdUSHR0cFBvc3RDbGllbnQoImh0dHA6Ly8iICsgYWRkci5TdHJpbmcoKSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJbC5DbG9zZSgpCisJCXQuRmF0YWxmKCJVbmFibGUgdG8gY29ubmVjdCB0byAlczogJXMiLCBhZGRyLlN0cmluZygpLCBlcnIpCisJfQorCVRyYW5zcG9ydEhlYWRlclRlc3QodCwgdHJhbnMsIHRyYW5zKQorCisJaWYgIWh0dHBUcmFuc3BvcnQuaGl0IHsKKwkJdC5GYXRhbGYoIkN1c3RvbSBjbGllbnQgd2FzIG5vdCB1c2VkIikKKwl9Cit9CisKK3R5cGUgY3VzdG9tSHR0cFRyYW5zcG9ydCBzdHJ1Y3QgeworCWhpdCBib29sCit9CisKK2Z1bmMgKGMgKmN1c3RvbUh0dHBUcmFuc3BvcnQpIFJvdW5kVHJpcChyZXEgKmh0dHAuUmVxdWVzdCkgKCpodHRwLlJlc3BvbnNlLCBlcnJvcikgeworCWMuaGl0ID0gdHJ1ZQorCXJldHVybiBodHRwLkRlZmF1bHRUcmFuc3BvcnQuUm91bmRUcmlwKHJlcSkKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvaHR0cF90cmFuc3BvcnQuZ28gYi9saWIvZ28vdGhyaWZ0L2h0dHBfdHJhbnNwb3J0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZjBmMzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L2h0dHBfdHJhbnNwb3J0LmdvCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiY29tcHJlc3MvZ3ppcCIKKwkiaW8iCisJIm5ldC9odHRwIgorCSJzdHJpbmdzIgorKQorCisvLyBOZXdUaHJpZnRIYW5kbGVyRnVuYyBpcyBhIGZ1bmN0aW9uIHRoYXQgY3JlYXRlIGEgcmVhZHkgdG8gdXNlIEFwYWNoZSBUaHJpZnQgSGFuZGxlciBmdW5jdGlvbgorZnVuYyBOZXdUaHJpZnRIYW5kbGVyRnVuYyhwcm9jZXNzb3IgVFByb2Nlc3NvciwKKwlpblBmYWN0b3J5LCBvdXRQZmFjdG9yeSBUUHJvdG9jb2xGYWN0b3J5KSBmdW5jKHcgaHR0cC5SZXNwb25zZVdyaXRlciwgciAqaHR0cC5SZXF1ZXN0KSB7CisKKwlyZXR1cm4gZ3ooZnVuYyh3IGh0dHAuUmVzcG9uc2VXcml0ZXIsIHIgKmh0dHAuUmVxdWVzdCkgeworCQl3LkhlYWRlcigpLkFkZCgiQ29udGVudC1UeXBlIiwgImFwcGxpY2F0aW9uL3gtdGhyaWZ0IikKKworCQl0cmFuc3BvcnQgOj0gTmV3U3RyZWFtVHJhbnNwb3J0KHIuQm9keSwgdykKKwkJcHJvY2Vzc29yLlByb2Nlc3Moci5Db250ZXh0KCksIGluUGZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnNwb3J0KSwgb3V0UGZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnNwb3J0KSkKKwl9KQorfQorCisvLyBneiB0cmFuc3BhcmVudGx5IGNvbXByZXNzZXMgdGhlIEhUVFAgcmVzcG9uc2UgaWYgdGhlIGNsaWVudCBzdXBwb3J0cyBpdC4KK2Z1bmMgZ3ooaGFuZGxlciBodHRwLkhhbmRsZXJGdW5jKSBodHRwLkhhbmRsZXJGdW5jIHsKKwlyZXR1cm4gZnVuYyh3IGh0dHAuUmVzcG9uc2VXcml0ZXIsIHIgKmh0dHAuUmVxdWVzdCkgeworCQlpZiAhc3RyaW5ncy5Db250YWlucyhyLkhlYWRlci5HZXQoIkFjY2VwdC1FbmNvZGluZyIpLCAiZ3ppcCIpIHsKKwkJCWhhbmRsZXIodywgcikKKwkJCXJldHVybgorCQl9CisJCXcuSGVhZGVyKCkuU2V0KCJDb250ZW50LUVuY29kaW5nIiwgImd6aXAiKQorCQlneiA6PSBnemlwLk5ld1dyaXRlcih3KQorCQlkZWZlciBnei5DbG9zZSgpCisJCWd6dyA6PSBnemlwUmVzcG9uc2VXcml0ZXJ7V3JpdGVyOiBneiwgUmVzcG9uc2VXcml0ZXI6IHd9CisJCWhhbmRsZXIoZ3p3LCByKQorCX0KK30KKwordHlwZSBnemlwUmVzcG9uc2VXcml0ZXIgc3RydWN0IHsKKwlpby5Xcml0ZXIKKwlodHRwLlJlc3BvbnNlV3JpdGVyCit9CisKK2Z1bmMgKHcgZ3ppcFJlc3BvbnNlV3JpdGVyKSBXcml0ZShiIFtdYnl0ZSkgKGludCwgZXJyb3IpIHsKKwlyZXR1cm4gdy5Xcml0ZXIuV3JpdGUoYikKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvaW9zdHJlYW1fdHJhbnNwb3J0LmdvIGIvbGliL2dvL3RocmlmdC9pb3N0cmVhbV90cmFuc3BvcnQuZ28KaW5kZXggNzk0ODcyZi4uZmVhOTNiYyAxMDA2NDQKLS0tIGEvbGliL2dvL3RocmlmdC9pb3N0cmVhbV90cmFuc3BvcnQuZ28KKysrIGIvbGliL2dvL3RocmlmdC9pb3N0cmVhbV90cmFuc3BvcnQuZ28KQEAgLTIxLDYgKzIxLDcgQEAKIAogaW1wb3J0ICgKIAkiYnVmaW8iCisJImNvbnRleHQiCiAJImlvIgogKQogCkBAIC0zOCwzOCArMzksMzggQEAKIAlpc1JlYWRXcml0ZXIgYm9vbAogfQogCi1mdW5jIChwICpTdHJlYW1UcmFuc3BvcnRGYWN0b3J5KSBHZXRUcmFuc3BvcnQodHJhbnMgVFRyYW5zcG9ydCkgVFRyYW5zcG9ydCB7CitmdW5jIChwICpTdHJlYW1UcmFuc3BvcnRGYWN0b3J5KSBHZXRUcmFuc3BvcnQodHJhbnMgVFRyYW5zcG9ydCkgKFRUcmFuc3BvcnQsIGVycm9yKSB7CiAJaWYgdHJhbnMgIT0gbmlsIHsKIAkJdCwgb2sgOj0gdHJhbnMuKCpTdHJlYW1UcmFuc3BvcnQpCiAJCWlmIG9rIHsKIAkJCWlmIHQuaXNSZWFkV3JpdGVyIHsKLQkJCQlyZXR1cm4gTmV3U3RyZWFtVHJhbnNwb3J0UlcodC5SZWFkZXIuKGlvLlJlYWRXcml0ZXIpKQorCQkJCXJldHVybiBOZXdTdHJlYW1UcmFuc3BvcnRSVyh0LlJlYWRlci4oaW8uUmVhZFdyaXRlcikpLCBuaWwKIAkJCX0KIAkJCWlmIHQuUmVhZGVyICE9IG5pbCAmJiB0LldyaXRlciAhPSBuaWwgewotCQkJCXJldHVybiBOZXdTdHJlYW1UcmFuc3BvcnQodC5SZWFkZXIsIHQuV3JpdGVyKQorCQkJCXJldHVybiBOZXdTdHJlYW1UcmFuc3BvcnQodC5SZWFkZXIsIHQuV3JpdGVyKSwgbmlsCiAJCQl9CiAJCQlpZiB0LlJlYWRlciAhPSBuaWwgJiYgdC5Xcml0ZXIgPT0gbmlsIHsKLQkJCQlyZXR1cm4gTmV3U3RyZWFtVHJhbnNwb3J0Uih0LlJlYWRlcikKKwkJCQlyZXR1cm4gTmV3U3RyZWFtVHJhbnNwb3J0Uih0LlJlYWRlciksIG5pbAogCQkJfQogCQkJaWYgdC5SZWFkZXIgPT0gbmlsICYmIHQuV3JpdGVyICE9IG5pbCB7Ci0JCQkJcmV0dXJuIE5ld1N0cmVhbVRyYW5zcG9ydFcodC5Xcml0ZXIpCisJCQkJcmV0dXJuIE5ld1N0cmVhbVRyYW5zcG9ydFcodC5Xcml0ZXIpLCBuaWwKIAkJCX0KLQkJCXJldHVybiAmU3RyZWFtVHJhbnNwb3J0e30KKwkJCXJldHVybiAmU3RyZWFtVHJhbnNwb3J0e30sIG5pbAogCQl9CiAJfQogCWlmIHAuaXNSZWFkV3JpdGVyIHsKLQkJcmV0dXJuIE5ld1N0cmVhbVRyYW5zcG9ydFJXKHAuUmVhZGVyLihpby5SZWFkV3JpdGVyKSkKKwkJcmV0dXJuIE5ld1N0cmVhbVRyYW5zcG9ydFJXKHAuUmVhZGVyLihpby5SZWFkV3JpdGVyKSksIG5pbAogCX0KIAlpZiBwLlJlYWRlciAhPSBuaWwgJiYgcC5Xcml0ZXIgIT0gbmlsIHsKLQkJcmV0dXJuIE5ld1N0cmVhbVRyYW5zcG9ydChwLlJlYWRlciwgcC5Xcml0ZXIpCisJCXJldHVybiBOZXdTdHJlYW1UcmFuc3BvcnQocC5SZWFkZXIsIHAuV3JpdGVyKSwgbmlsCiAJfQogCWlmIHAuUmVhZGVyICE9IG5pbCAmJiBwLldyaXRlciA9PSBuaWwgewotCQlyZXR1cm4gTmV3U3RyZWFtVHJhbnNwb3J0UihwLlJlYWRlcikKKwkJcmV0dXJuIE5ld1N0cmVhbVRyYW5zcG9ydFIocC5SZWFkZXIpLCBuaWwKIAl9CiAJaWYgcC5SZWFkZXIgPT0gbmlsICYmIHAuV3JpdGVyICE9IG5pbCB7Ci0JCXJldHVybiBOZXdTdHJlYW1UcmFuc3BvcnRXKHAuV3JpdGVyKQorCQlyZXR1cm4gTmV3U3RyZWFtVHJhbnNwb3J0VyhwLldyaXRlciksIG5pbAogCX0KLQlyZXR1cm4gJlN0cmVhbVRyYW5zcG9ydHt9CisJcmV0dXJuICZTdHJlYW1UcmFuc3BvcnR7fSwgbmlsCiB9CiAKIGZ1bmMgTmV3U3RyZWFtVHJhbnNwb3J0RmFjdG9yeShyZWFkZXIgaW8uUmVhZGVyLCB3cml0ZXIgaW8uV3JpdGVyLCBpc1JlYWRXcml0ZXIgYm9vbCkgKlN0cmVhbVRyYW5zcG9ydEZhY3RvcnkgewpAQCAtMTM4LDcgKzEzOSw3IEBACiB9CiAKIC8vIEZsdXNoZXMgdGhlIHVuZGVybHlpbmcgb3V0cHV0IHN0cmVhbSBpZiBub3QgbnVsbC4KLWZ1bmMgKHAgKlN0cmVhbVRyYW5zcG9ydCkgRmx1c2goKSBlcnJvciB7CitmdW5jIChwICpTdHJlYW1UcmFuc3BvcnQpIEZsdXNoKGN0eCBjb250ZXh0LkNvbnRleHQpIGVycm9yIHsKIAlpZiBwLldyaXRlciA9PSBuaWwgewogCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihOT1RfT1BFTiwgIkNhbm5vdCBmbHVzaCBudWxsIG91dHB1dFN0cmVhbSIpCiAJfQpAQCAtMjA5LDYgKzIxMCw1IEBACiAKIGZ1bmMgKHAgKlN0cmVhbVRyYW5zcG9ydCkgUmVtYWluaW5nQnl0ZXMoKSAobnVtX2J5dGVzIHVpbnQ2NCkgewogCWNvbnN0IG1heFNpemUgPSBedWludDY0KDApCi0JcmV0dXJuIG1heFNpemUgIC8vIHRoZSB0aHJ1dGggaXMsIHdlIGp1c3QgZG9uJ3Qga25vdyB1bmxlc3MgZnJhbWVkIGlzIHVzZWQKKwlyZXR1cm4gbWF4U2l6ZSAvLyB0aGUgdGhydXRoIGlzLCB3ZSBqdXN0IGRvbid0IGtub3cgdW5sZXNzIGZyYW1lZCBpcyB1c2VkCiB9Ci0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvanNvbl9wcm90b2NvbC5nbyBiL2xpYi9nby90aHJpZnQvanNvbl9wcm90b2NvbC5nbwppbmRleCA2NjlhN2JkLi43YmU2ODVkIDEwMDY0NAotLS0gYS9saWIvZ28vdGhyaWZ0L2pzb25fcHJvdG9jb2wuZ28KKysrIGIvbGliL2dvL3RocmlmdC9qc29uX3Byb3RvY29sLmdvCkBAIC0yMCw2ICsyMCw3IEBACiBwYWNrYWdlIHRocmlmdAogCiBpbXBvcnQgKAorCSJjb250ZXh0IgogCSJlbmNvZGluZy9iYXNlNjQiCiAJImZtdCIKICkKQEAgLTYwLDYgKzYxLDcgQEAKIH0KIAogZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgV3JpdGVNZXNzYWdlQmVnaW4obmFtZSBzdHJpbmcsIHR5cGVJZCBUTWVzc2FnZVR5cGUsIHNlcUlkIGludDMyKSBlcnJvciB7CisJcC5yZXNldENvbnRleHRTdGFjaygpIC8vIFRIUklGVC0zNzM1CiAJaWYgZSA6PSBwLk91dHB1dExpc3RCZWdpbigpOyBlICE9IG5pbCB7CiAJCXJldHVybiBlCiAJfQpAQCAtMjAyLDE3ICsyMDQsMTggQEAKIAlpZiBlIDo9IHAuT3V0cHV0UHJlVmFsdWUoKTsgZSAhPSBuaWwgewogCQlyZXR1cm4gZQogCX0KLQlpZiBfLCBlIDo9IHAud3JpdGVyLldyaXRlKEpTT05fUVVPVEVfQllURVMpOyBlICE9IG5pbCB7CisJaWYgXywgZSA6PSBwLndyaXRlKEpTT05fUVVPVEVfQllURVMpOyBlICE9IG5pbCB7CiAJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKIAl9CiAJd3JpdGVyIDo9IGJhc2U2NC5OZXdFbmNvZGVyKGJhc2U2NC5TdGRFbmNvZGluZywgcC53cml0ZXIpCiAJaWYgXywgZSA6PSB3cml0ZXIuV3JpdGUodik7IGUgIT0gbmlsIHsKKwkJcC53cml0ZXIuUmVzZXQocC50cmFucykgLy8gVEhSSUZULTM3MzUKIAkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQogCX0KIAlpZiBlIDo9IHdyaXRlci5DbG9zZSgpOyBlICE9IG5pbCB7CiAJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKIAl9Ci0JaWYgXywgZSA6PSBwLndyaXRlci5Xcml0ZShKU09OX1FVT1RFX0JZVEVTKTsgZSAhPSBuaWwgeworCWlmIF8sIGUgOj0gcC53cml0ZShKU09OX1FVT1RFX0JZVEVTKTsgZSAhPSBuaWwgewogCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCiAJfQogCXJldHVybiBwLk91dHB1dFBvc3RWYWx1ZSgpCkBAIC0yMjAsNiArMjIzLDcgQEAKIAogLy8gUmVhZGluZyBtZXRob2RzLgogZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgUmVhZE1lc3NhZ2VCZWdpbigpIChuYW1lIHN0cmluZywgdHlwZUlkIFRNZXNzYWdlVHlwZSwgc2VxSWQgaW50MzIsIGVyciBlcnJvcikgeworCXAucmVzZXRDb250ZXh0U3RhY2soKSAvLyBUSFJJRlQtMzczNQogCWlmIGlzTnVsbCwgZXJyIDo9IHAuUGFyc2VMaXN0QmVnaW4oKTsgaXNOdWxsIHx8IGVyciAhPSBuaWwgewogCQlyZXR1cm4gbmFtZSwgdHlwZUlkLCBzZXFJZCwgZXJyCiAJfQpAQCAtMzg3LDcgKzM5MSw3IEBACiAJCWlmIGVyciAhPSBuaWwgewogCQkJcmV0dXJuIHYsIGVycgogCQl9Ci0JfSBlbHNlIGlmIGxlbihmKSA+PSAwICYmIGZbMF0gPT0gSlNPTl9OVUxMWzBdIHsKKwl9IGVsc2UgaWYgbGVuKGYpID4gMCAmJiBmWzBdID09IEpTT05fTlVMTFswXSB7CiAJCWIgOj0gbWFrZShbXWJ5dGUsIGxlbihKU09OX05VTEwpKQogCQlfLCBlcnIgOj0gcC5yZWFkZXIuUmVhZChiKQogCQlpZiBlcnIgIT0gbmlsIHsKQEAgLTQxNyw3ICs0MjEsNyBAQAogCQlpZiBlcnIgIT0gbmlsIHsKIAkJCXJldHVybiB2LCBlcnIKIAkJfQotCX0gZWxzZSBpZiBsZW4oZikgPj0gMCAmJiBmWzBdID09IEpTT05fTlVMTFswXSB7CisJfSBlbHNlIGlmIGxlbihmKSA+IDAgJiYgZlswXSA9PSBKU09OX05VTExbMF0gewogCQliIDo9IG1ha2UoW11ieXRlLCBsZW4oSlNPTl9OVUxMKSkKIAkJXywgZXJyIDo9IHAucmVhZGVyLlJlYWQoYikKIAkJaWYgZXJyICE9IG5pbCB7CkBAIC00MzUsMTAgKzQzOSwxMCBAQAogCXJldHVybiB2LCBwLlBhcnNlUG9zdFZhbHVlKCkKIH0KIAotZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgRmx1c2goKSAoZXJyIGVycm9yKSB7CitmdW5jIChwICpUSlNPTlByb3RvY29sKSBGbHVzaChjdHggY29udGV4dC5Db250ZXh0KSAoZXJyIGVycm9yKSB7CiAJZXJyID0gcC53cml0ZXIuRmx1c2goKQogCWlmIGVyciA9PSBuaWwgewotCQllcnIgPSBwLnRyYW5zLkZsdXNoKCkKKwkJZXJyID0gcC50cmFucy5GbHVzaChjdHgpCiAJfQogCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQogfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9qc29uX3Byb3RvY29sX3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L2pzb25fcHJvdG9jb2xfdGVzdC5nbwppbmRleCA3MTA0Y2UzLi41OWM0ZDY0IDEwMDY0NAotLS0gYS9saWIvZ28vdGhyaWZ0L2pzb25fcHJvdG9jb2xfdGVzdC5nbworKysgYi9saWIvZ28vdGhyaWZ0L2pzb25fcHJvdG9jb2xfdGVzdC5nbwpAQCAtMjAsNiArMjAsNyBAQAogcGFja2FnZSB0aHJpZnQKIAogaW1wb3J0ICgKKwkiY29udGV4dCIKIAkiZW5jb2RpbmcvYmFzZTY0IgogCSJlbmNvZGluZy9qc29uIgogCSJmbXQiCkBAIC0zNiw3ICszNyw3IEBACiAJCWlmIGUgOj0gcC5Xcml0ZUJvb2wodmFsdWUpOyBlICE9IG5pbCB7CiAJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQogCQl9Ci0JCWlmIGUgOj0gcC5GbHVzaCgpOyBlICE9IG5pbCB7CisJCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKIAkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCiAJCX0KIAkJcyA6PSB0cmFucy5TdHJpbmcoKQpAQCAtNjgsNyArNjksNyBAQAogCQl9IGVsc2UgewogCQkJdHJhbnMuV3JpdGUoW11ieXRleycwJ30pIC8vIG5vdCBKU09OX0ZBTFNFCiAJCX0KLQkJdHJhbnMuRmx1c2goKQorCQl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKIAkJcyA6PSB0cmFucy5TdHJpbmcoKQogCQl2LCBlIDo9IHAuUmVhZEJvb2woKQogCQlpZiBlICE9IG5pbCB7CkBAIC05NCw3ICs5NSw3IEBACiAJCWlmIGUgOj0gcC5Xcml0ZUJ5dGUodmFsdWUpOyBlICE9IG5pbCB7CiAJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQogCQl9Ci0JCWlmIGUgOj0gcC5GbHVzaCgpOyBlICE9IG5pbCB7CisJCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKIAkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCiAJCX0KIAkJcyA6PSB0cmFucy5TdHJpbmcoKQpAQCAtMTE2LDcgKzExNyw3IEBACiAJCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQogCQlwIDo9IE5ld1RKU09OUHJvdG9jb2wodHJhbnMpCiAJCXRyYW5zLldyaXRlU3RyaW5nKHN0cmNvbnYuSXRvYShpbnQodmFsdWUpKSkKLQkJdHJhbnMuRmx1c2goKQorCQl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKIAkJcyA6PSB0cmFucy5TdHJpbmcoKQogCQl2LCBlIDo9IHAuUmVhZEJ5dGUoKQogCQlpZiBlICE9IG5pbCB7CkBAIC0xNDEsNyArMTQyLDcgQEAKIAkJaWYgZSA6PSBwLldyaXRlSTE2KHZhbHVlKTsgZSAhPSBuaWwgewogCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKIAkJfQotCQlpZiBlIDo9IHAuRmx1c2goKTsgZSAhPSBuaWwgeworCQlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CiAJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQogCQl9CiAJCXMgOj0gdHJhbnMuU3RyaW5nKCkKQEAgLTE2Myw3ICsxNjQsNyBAQAogCQl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKIAkJcCA6PSBOZXdUSlNPTlByb3RvY29sKHRyYW5zKQogCQl0cmFucy5Xcml0ZVN0cmluZyhzdHJjb252Lkl0b2EoaW50KHZhbHVlKSkpCi0JCXRyYW5zLkZsdXNoKCkKKwkJdHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCiAJCXMgOj0gdHJhbnMuU3RyaW5nKCkKIAkJdiwgZSA6PSBwLlJlYWRJMTYoKQogCQlpZiBlICE9IG5pbCB7CkBAIC0xODgsNyArMTg5LDcgQEAKIAkJaWYgZSA6PSBwLldyaXRlSTMyKHZhbHVlKTsgZSAhPSBuaWwgewogCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKIAkJfQotCQlpZiBlIDo9IHAuRmx1c2goKTsgZSAhPSBuaWwgeworCQlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CiAJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQogCQl9CiAJCXMgOj0gdHJhbnMuU3RyaW5nKCkKQEAgLTIxMCw3ICsyMTEsNyBAQAogCQl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKIAkJcCA6PSBOZXdUSlNPTlByb3RvY29sKHRyYW5zKQogCQl0cmFucy5Xcml0ZVN0cmluZyhzdHJjb252Lkl0b2EoaW50KHZhbHVlKSkpCi0JCXRyYW5zLkZsdXNoKCkKKwkJdHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCiAJCXMgOj0gdHJhbnMuU3RyaW5nKCkKIAkJdiwgZSA6PSBwLlJlYWRJMzIoKQogCQlpZiBlICE9IG5pbCB7CkBAIC0yMzUsNyArMjM2LDcgQEAKIAkJaWYgZSA6PSBwLldyaXRlSTY0KHZhbHVlKTsgZSAhPSBuaWwgewogCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKIAkJfQotCQlpZiBlIDo9IHAuRmx1c2goKTsgZSAhPSBuaWwgeworCQlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CiAJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQogCQl9CiAJCXMgOj0gdHJhbnMuU3RyaW5nKCkKQEAgLTI1Nyw3ICsyNTgsNyBAQAogCQl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKIAkJcCA6PSBOZXdUSlNPTlByb3RvY29sKHRyYW5zKQogCQl0cmFucy5Xcml0ZVN0cmluZyhzdHJjb252LkZvcm1hdEludCh2YWx1ZSwgMTApKQotCQl0cmFucy5GbHVzaCgpCisJCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQogCQlzIDo9IHRyYW5zLlN0cmluZygpCiAJCXYsIGUgOj0gcC5SZWFkSTY0KCkKIAkJaWYgZSAhPSBuaWwgewpAQCAtMjgyLDcgKzI4Myw3IEBACiAJCWlmIGUgOj0gcC5Xcml0ZURvdWJsZSh2YWx1ZSk7IGUgIT0gbmlsIHsKIAkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCiAJCX0KLQkJaWYgZSA6PSBwLkZsdXNoKCk7IGUgIT0gbmlsIHsKKwkJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgewogCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKIAkJfQogCQlzIDo9IHRyYW5zLlN0cmluZygpCkBAIC0zMTksNyArMzIwLDcgQEAKIAkJcCA6PSBOZXdUSlNPTlByb3RvY29sKHRyYW5zKQogCQluIDo9IE5ld051bWVyaWNGcm9tRG91YmxlKHZhbHVlKQogCQl0cmFucy5Xcml0ZVN0cmluZyhuLlN0cmluZygpKQotCQl0cmFucy5GbHVzaCgpCisJCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQogCQlzIDo9IHRyYW5zLlN0cmluZygpCiAJCXYsIGUgOj0gcC5SZWFkRG91YmxlKCkKIAkJaWYgZSAhPSBuaWwgewpAQCAtMzU4LDcgKzM1OSw3IEBACiAJCWlmIGUgOj0gcC5Xcml0ZVN0cmluZyh2YWx1ZSk7IGUgIT0gbmlsIHsKIAkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCiAJCX0KLQkJaWYgZSA6PSBwLkZsdXNoKCk7IGUgIT0gbmlsIHsKKwkJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgewogCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKIAkJfQogCQlzIDo9IHRyYW5zLlN0cmluZygpCkBAIC0zODAsNyArMzgxLDcgQEAKIAkJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCiAJCXAgOj0gTmV3VEpTT05Qcm90b2NvbCh0cmFucykKIAkJdHJhbnMuV3JpdGVTdHJpbmcoanNvblF1b3RlKHZhbHVlKSkKLQkJdHJhbnMuRmx1c2goKQorCQl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKIAkJcyA6PSB0cmFucy5TdHJpbmcoKQogCQl2LCBlIDo9IHAuUmVhZFN0cmluZygpCiAJCWlmIGUgIT0gbmlsIHsKQEAgLTQwOSw3ICs0MTAsNyBAQAogCWlmIGUgOj0gcC5Xcml0ZUJpbmFyeSh2YWx1ZSk7IGUgIT0gbmlsIHsKIAkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKIAl9Ci0JaWYgZSA6PSBwLkZsdXNoKCk7IGUgIT0gbmlsIHsKKwlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CiAJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCiAJfQogCXMgOj0gdHJhbnMuU3RyaW5nKCkKQEAgLTQ0MSw3ICs0NDIsNyBAQAogCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQogCXAgOj0gTmV3VEpTT05Qcm90b2NvbCh0cmFucykKIAl0cmFucy5Xcml0ZVN0cmluZyhqc29uUXVvdGUoYjY0U3RyaW5nKSkKLQl0cmFucy5GbHVzaCgpCisJdHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCiAJcyA6PSB0cmFucy5TdHJpbmcoKQogCXYsIGUgOj0gcC5SZWFkQmluYXJ5KCkKIAlpZiBlICE9IG5pbCB7CkBAIC00NzQsNyArNDc1LDcgQEAKIAkJfQogCX0KIAlwLldyaXRlTGlzdEVuZCgpCi0JaWYgZSA6PSBwLkZsdXNoKCk7IGUgIT0gbmlsIHsKKwlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CiAJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIGUuRXJyb3IoKSkKIAl9CiAJc3RyIDo9IHRyYW5zLlN0cmluZygpCkBAIC01MjgsNyArNTI5LDcgQEAKIAkJfQogCX0KIAlwLldyaXRlU2V0RW5kKCkKLQlpZiBlIDo9IHAuRmx1c2goKTsgZSAhPSBuaWwgeworCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKIAkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgZS5FcnJvcigpKQogCX0KIAlzdHIgOj0gdHJhbnMuU3RyaW5nKCkKQEAgLTU4NSwxMiArNTg2LDEyIEBACiAJCX0KIAl9CiAJcC5Xcml0ZU1hcEVuZCgpCi0JaWYgZSA6PSBwLkZsdXNoKCk7IGUgIT0gbmlsIHsKKwlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CiAJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIGUuRXJyb3IoKSkKIAl9CiAJc3RyIDo9IHRyYW5zLlN0cmluZygpCiAJaWYgc3RyWzBdICE9ICdbJyB8fCBzdHJbbGVuKHN0ciktMV0gIT0gJ10nIHsKLQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMsIHdyb3RlOiAlcSwgaW4gZ286ICVxIiwgdGhldHlwZSwgc3RyLCBET1VCTEVfVkFMVUVTKQorCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcywgd3JvdGU6ICV2LCBpbiBnbzogJXYiLCB0aGV0eXBlLCBzdHIsIERPVUJMRV9WQUxVRVMpCiAJfQogCWV4cGVjdGVkS2V5VHlwZSwgZXhwZWN0ZWRWYWx1ZVR5cGUsIGV4cGVjdGVkU2l6ZSwgZXJyIDo9IHAuUmVhZE1hcEJlZ2luKCkKIAlpZiBlcnIgIT0gbmlsIHsKZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvbG93bGV2ZWxfYmVuY2htYXJrc190ZXN0LmdvIGIvbGliL2dvL3RocmlmdC9sb3dsZXZlbF9iZW5jaG1hcmtzX3Rlc3QuZ28KaW5kZXggYTUwOTRhZS4uZTE3MzY1NSAxMDA2NDQKLS0tIGEvbGliL2dvL3RocmlmdC9sb3dsZXZlbF9iZW5jaG1hcmtzX3Rlc3QuZ28KKysrIGIvbGliL2dvL3RocmlmdC9sb3dsZXZlbF9iZW5jaG1hcmtzX3Rlc3QuZ28KQEAgLTM2LDcgKzM2LDEwIEBACiB9CiAKIGZ1bmMgQmVuY2htYXJrQmluYXJ5Qm9vbF8wKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKIAlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgewogCQlSZWFkV3JpdGVCb29sKGIsIHAsIHRyYW5zKQpAQCAtNDQsNyArNDcsMTAgQEAKIH0KIAogZnVuYyBCZW5jaG1hcmtCaW5hcnlCeXRlXzAoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUJ5dGUoYiwgcCwgdHJhbnMpCkBAIC01Miw3ICs1OCwxMCBAQAogfQogCiBmdW5jIEJlbmNobWFya0JpbmFyeUkxNl8wKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKIAlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgewogCQlSZWFkV3JpdGVJMTYoYiwgcCwgdHJhbnMpCkBAIC02MCwzNSArNjksNTAgQEAKIH0KIAogZnVuYyBCZW5jaG1hcmtCaW5hcnlJMzJfMChiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlSTMyKGIsIHAsIHRyYW5zKQogCX0KIH0KIGZ1bmMgQmVuY2htYXJrQmluYXJ5STY0XzAoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUk2NChiLCBwLCB0cmFucykKIAl9CiB9CiBmdW5jIEJlbmNobWFya0JpbmFyeURvdWJsZV8wKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKIAlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgewogCQlSZWFkV3JpdGVEb3VibGUoYiwgcCwgdHJhbnMpCiAJfQogfQogZnVuYyBCZW5jaG1hcmtCaW5hcnlTdHJpbmdfMChiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlU3RyaW5nKGIsIHAsIHRyYW5zKQogCX0KIH0KIGZ1bmMgQmVuY2htYXJrQmluYXJ5QmluYXJ5XzAoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUJpbmFyeShiLCBwLCB0cmFucykKQEAgLTk2LDcgKzEyMCwxMCBAQAogfQogCiBmdW5jIEJlbmNobWFya0JpbmFyeUJvb2xfMShiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlQm9vbChiLCBwLCB0cmFucykKQEAgLTEwNCw3ICsxMzEsMTAgQEAKIH0KIAogZnVuYyBCZW5jaG1hcmtCaW5hcnlCeXRlXzEoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUJ5dGUoYiwgcCwgdHJhbnMpCkBAIC0xMTIsNyArMTQyLDEwIEBACiB9CiAKIGZ1bmMgQmVuY2htYXJrQmluYXJ5STE2XzEoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUkxNihiLCBwLCB0cmFucykKQEAgLTEyMCwzNSArMTUzLDUwIEBACiB9CiAKIGZ1bmMgQmVuY2htYXJrQmluYXJ5STMyXzEoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUkzMihiLCBwLCB0cmFucykKIAl9CiB9CiBmdW5jIEJlbmNobWFya0JpbmFyeUk2NF8xKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKIAlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgewogCQlSZWFkV3JpdGVJNjQoYiwgcCwgdHJhbnMpCiAJfQogfQogZnVuYyBCZW5jaG1hcmtCaW5hcnlEb3VibGVfMShiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlRG91YmxlKGIsIHAsIHRyYW5zKQogCX0KIH0KIGZ1bmMgQmVuY2htYXJrQmluYXJ5U3RyaW5nXzEoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZVN0cmluZyhiLCBwLCB0cmFucykKIAl9CiB9CiBmdW5jIEJlbmNobWFya0JpbmFyeUJpbmFyeV8xKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKIAlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgewogCQlSZWFkV3JpdGVCaW5hcnkoYiwgcCwgdHJhbnMpCkBAIC0xNTYsNyArMjA0LDEwIEBACiB9CiAKIGZ1bmMgQmVuY2htYXJrQmluYXJ5Qm9vbF8yKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKIAlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgewogCQlSZWFkV3JpdGVCb29sKGIsIHAsIHRyYW5zKQpAQCAtMTY0LDcgKzIxNSwxMCBAQAogfQogCiBmdW5jIEJlbmNobWFya0JpbmFyeUJ5dGVfMihiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlQnl0ZShiLCBwLCB0cmFucykKQEAgLTE3Miw3ICsyMjYsMTAgQEAKIH0KIAogZnVuYyBCZW5jaG1hcmtCaW5hcnlJMTZfMihiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlSTE2KGIsIHAsIHRyYW5zKQpAQCAtMTgwLDM1ICsyMzcsNTAgQEAKIH0KIAogZnVuYyBCZW5jaG1hcmtCaW5hcnlJMzJfMihiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlSTMyKGIsIHAsIHRyYW5zKQogCX0KIH0KIGZ1bmMgQmVuY2htYXJrQmluYXJ5STY0XzIoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUk2NChiLCBwLCB0cmFucykKIAl9CiB9CiBmdW5jIEJlbmNobWFya0JpbmFyeURvdWJsZV8yKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKIAlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgewogCQlSZWFkV3JpdGVEb3VibGUoYiwgcCwgdHJhbnMpCiAJfQogfQogZnVuYyBCZW5jaG1hcmtCaW5hcnlTdHJpbmdfMihiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlU3RyaW5nKGIsIHAsIHRyYW5zKQogCX0KIH0KIGZ1bmMgQmVuY2htYXJrQmluYXJ5QmluYXJ5XzIoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUJpbmFyeShiLCBwLCB0cmFucykKQEAgLTIxNiw3ICsyODgsMTAgQEAKIH0KIAogZnVuYyBCZW5jaG1hcmtDb21wYWN0Qm9vbF8wKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlQm9vbChiLCBwLCB0cmFucykKQEAgLTIyNCw3ICsyOTksMTAgQEAKIH0KIAogZnVuYyBCZW5jaG1hcmtDb21wYWN0Qnl0ZV8wKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlQnl0ZShiLCBwLCB0cmFucykKQEAgLTIzMiw3ICszMTAsMTAgQEAKIH0KIAogZnVuYyBCZW5jaG1hcmtDb21wYWN0STE2XzAoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKIAlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgewogCQlSZWFkV3JpdGVJMTYoYiwgcCwgdHJhbnMpCkBAIC0yNDAsMzUgKzMyMSw1MCBAQAogfQogCiBmdW5jIEJlbmNobWFya0NvbXBhY3RJMzJfMChiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUkzMihiLCBwLCB0cmFucykKIAl9CiB9CiBmdW5jIEJlbmNobWFya0NvbXBhY3RJNjRfMChiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUk2NChiLCBwLCB0cmFucykKIAl9CiB9CiBmdW5jIEJlbmNobWFya0NvbXBhY3REb3VibGUwKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlRG91YmxlKGIsIHAsIHRyYW5zKQogCX0KIH0KIGZ1bmMgQmVuY2htYXJrQ29tcGFjdFN0cmluZzAoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKIAlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgewogCQlSZWFkV3JpdGVTdHJpbmcoYiwgcCwgdHJhbnMpCiAJfQogfQogZnVuYyBCZW5jaG1hcmtDb21wYWN0QmluYXJ5MChiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUJpbmFyeShiLCBwLCB0cmFucykKQEAgLTI3Niw3ICszNzIsMTAgQEAKIH0KIAogZnVuYyBCZW5jaG1hcmtDb21wYWN0Qm9vbF8xKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlQm9vbChiLCBwLCB0cmFucykKQEAgLTI4NCw3ICszODMsMTAgQEAKIH0KIAogZnVuYyBCZW5jaG1hcmtDb21wYWN0Qnl0ZV8xKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlQnl0ZShiLCBwLCB0cmFucykKQEAgLTI5Miw3ICszOTQsMTAgQEAKIH0KIAogZnVuYyBCZW5jaG1hcmtDb21wYWN0STE2XzEoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKIAlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgewogCQlSZWFkV3JpdGVJMTYoYiwgcCwgdHJhbnMpCkBAIC0zMDAsMzUgKzQwNSw1MCBAQAogfQogCiBmdW5jIEJlbmNobWFya0NvbXBhY3RJMzJfMShiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUkzMihiLCBwLCB0cmFucykKIAl9CiB9CiBmdW5jIEJlbmNobWFya0NvbXBhY3RJNjRfMShiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUk2NChiLCBwLCB0cmFucykKIAl9CiB9CiBmdW5jIEJlbmNobWFya0NvbXBhY3REb3VibGUxKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlRG91YmxlKGIsIHAsIHRyYW5zKQogCX0KIH0KIGZ1bmMgQmVuY2htYXJrQ29tcGFjdFN0cmluZzEoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKIAlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgewogCQlSZWFkV3JpdGVTdHJpbmcoYiwgcCwgdHJhbnMpCiAJfQogfQogZnVuYyBCZW5jaG1hcmtDb21wYWN0QmluYXJ5MShiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUJpbmFyeShiLCBwLCB0cmFucykKQEAgLTMzNiw3ICs0NTYsMTAgQEAKIH0KIAogZnVuYyBCZW5jaG1hcmtDb21wYWN0Qm9vbF8yKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlQm9vbChiLCBwLCB0cmFucykKQEAgLTM0NCw3ICs0NjcsMTAgQEAKIH0KIAogZnVuYyBCZW5jaG1hcmtDb21wYWN0Qnl0ZV8yKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlQnl0ZShiLCBwLCB0cmFucykKQEAgLTM1Miw3ICs0NzgsMTAgQEAKIH0KIAogZnVuYyBCZW5jaG1hcmtDb21wYWN0STE2XzIoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKIAlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgewogCQlSZWFkV3JpdGVJMTYoYiwgcCwgdHJhbnMpCkBAIC0zNjAsMzUgKzQ4OSw1MCBAQAogfQogCiBmdW5jIEJlbmNobWFya0NvbXBhY3RJMzJfMihiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUkzMihiLCBwLCB0cmFucykKIAl9CiB9CiBmdW5jIEJlbmNobWFya0NvbXBhY3RJNjRfMihiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUk2NChiLCBwLCB0cmFucykKIAl9CiB9CiBmdW5jIEJlbmNobWFya0NvbXBhY3REb3VibGUyKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlRG91YmxlKGIsIHAsIHRyYW5zKQogCX0KIH0KIGZ1bmMgQmVuY2htYXJrQ29tcGFjdFN0cmluZzIoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKIAlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgewogCQlSZWFkV3JpdGVTdHJpbmcoYiwgcCwgdHJhbnMpCiAJfQogfQogZnVuYyBCZW5jaG1hcmtDb21wYWN0QmluYXJ5MihiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUJpbmFyeShiLCBwLCB0cmFucykKZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvbWVtb3J5X2J1ZmZlci5nbyBiL2xpYi9nby90aHJpZnQvbWVtb3J5X2J1ZmZlci5nbwppbmRleCBiNjJmZDU2Li41OTM2ZDI3IDEwMDY0NAotLS0gYS9saWIvZ28vdGhyaWZ0L21lbW9yeV9idWZmZXIuZ28KKysrIGIvbGliL2dvL3RocmlmdC9tZW1vcnlfYnVmZmVyLmdvCkBAIC0yMSw2ICsyMSw3IEBACiAKIGltcG9ydCAoCiAJImJ5dGVzIgorCSJjb250ZXh0IgogKQogCiAvLyBNZW1vcnkgYnVmZmVyLWJhc2VkIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUVHJhbnNwb3J0IGludGVyZmFjZS4KQEAgLTMzLDE0ICszNCwxNCBAQAogCXNpemUgaW50CiB9CiAKLWZ1bmMgKHAgKlRNZW1vcnlCdWZmZXJUcmFuc3BvcnRGYWN0b3J5KSBHZXRUcmFuc3BvcnQodHJhbnMgVFRyYW5zcG9ydCkgVFRyYW5zcG9ydCB7CitmdW5jIChwICpUTWVtb3J5QnVmZmVyVHJhbnNwb3J0RmFjdG9yeSkgR2V0VHJhbnNwb3J0KHRyYW5zIFRUcmFuc3BvcnQpIChUVHJhbnNwb3J0LCBlcnJvcikgewogCWlmIHRyYW5zICE9IG5pbCB7CiAJCXQsIG9rIDo9IHRyYW5zLigqVE1lbW9yeUJ1ZmZlcikKIAkJaWYgb2sgJiYgdC5zaXplID4gMCB7Ci0JCQlyZXR1cm4gTmV3VE1lbW9yeUJ1ZmZlckxlbih0LnNpemUpCisJCQlyZXR1cm4gTmV3VE1lbW9yeUJ1ZmZlckxlbih0LnNpemUpLCBuaWwKIAkJfQogCX0KLQlyZXR1cm4gTmV3VE1lbW9yeUJ1ZmZlckxlbihwLnNpemUpCisJcmV0dXJuIE5ld1RNZW1vcnlCdWZmZXJMZW4ocC5zaXplKSwgbmlsCiB9CiAKIGZ1bmMgTmV3VE1lbW9yeUJ1ZmZlclRyYW5zcG9ydEZhY3Rvcnkoc2l6ZSBpbnQpICpUTWVtb3J5QnVmZmVyVHJhbnNwb3J0RmFjdG9yeSB7CkBAIC03MCw3ICs3MSw3IEBACiB9CiAKIC8vIEZsdXNoaW5nIGEgbWVtb3J5IGJ1ZmZlciBpcyBhIG5vLW9wCi1mdW5jIChwICpUTWVtb3J5QnVmZmVyKSBGbHVzaCgpIGVycm9yIHsKK2Z1bmMgKHAgKlRNZW1vcnlCdWZmZXIpIEZsdXNoKGN0eCBjb250ZXh0LkNvbnRleHQpIGVycm9yIHsKIAlyZXR1cm4gbmlsCiB9CiAKZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvbXVsdGlwbGV4ZWRfcHJvdG9jb2wuZ28gYi9saWIvZ28vdGhyaWZ0L211bHRpcGxleGVkX3Byb3RvY29sLmdvCmluZGV4IDMxNTdlMGQuLmQwMjhhMzAgMTAwNjQ0Ci0tLSBhL2xpYi9nby90aHJpZnQvbXVsdGlwbGV4ZWRfcHJvdG9jb2wuZ28KKysrIGIvbGliL2dvL3RocmlmdC9tdWx0aXBsZXhlZF9wcm90b2NvbC5nbwpAQCAtMjAsNiArMjAsNyBAQAogcGFja2FnZSB0aHJpZnQKIAogaW1wb3J0ICgKKwkiY29udGV4dCIKIAkiZm10IgogCSJzdHJpbmdzIgogKQpAQCAtMTI3LDcgKzEyOCw3IEBACiAJdC5zZXJ2aWNlUHJvY2Vzc29yTWFwW25hbWVdID0gcHJvY2Vzc29yCiB9CiAKLWZ1bmMgKHQgKlRNdWx0aXBsZXhlZFByb2Nlc3NvcikgUHJvY2Vzcyhpbiwgb3V0IFRQcm90b2NvbCkgKGJvb2wsIFRFeGNlcHRpb24pIHsKK2Z1bmMgKHQgKlRNdWx0aXBsZXhlZFByb2Nlc3NvcikgUHJvY2VzcyhjdHggY29udGV4dC5Db250ZXh0LCBpbiwgb3V0IFRQcm90b2NvbCkgKGJvb2wsIFRFeGNlcHRpb24pIHsKIAluYW1lLCB0eXBlSWQsIHNlcWlkLCBlcnIgOj0gaW4uUmVhZE1lc3NhZ2VCZWdpbigpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXJldHVybiBmYWxzZSwgZXJyCkBAIC0xNDAsNyArMTQxLDcgQEAKIAlpZiBsZW4odikgIT0gMiB7CiAJCWlmIHQuRGVmYXVsdFByb2Nlc3NvciAhPSBuaWwgewogCQkJc21iIDo9IE5ld1N0b3JlZE1lc3NhZ2VQcm90b2NvbChpbiwgbmFtZSwgdHlwZUlkLCBzZXFpZCkKLQkJCXJldHVybiB0LkRlZmF1bHRQcm9jZXNzb3IuUHJvY2VzcyhzbWIsIG91dCkKKwkJCXJldHVybiB0LkRlZmF1bHRQcm9jZXNzb3IuUHJvY2VzcyhjdHgsIHNtYiwgb3V0KQogCQl9CiAJCXJldHVybiBmYWxzZSwgZm10LkVycm9yZigiU2VydmljZSBuYW1lIG5vdCBmb3VuZCBpbiBtZXNzYWdlIG5hbWU6ICVzLiAgRGlkIHlvdSBmb3JnZXQgdG8gdXNlIGEgVE11bHRpcGxleFByb3RvY29sIGluIHlvdXIgY2xpZW50PyIsIG5hbWUpCiAJfQpAQCAtMTQ5LDcgKzE1MCw3IEBACiAJCXJldHVybiBmYWxzZSwgZm10LkVycm9yZigiU2VydmljZSBuYW1lIG5vdCBmb3VuZDogJXMuICBEaWQgeW91IGZvcmdldCB0byBjYWxsIHJlZ2lzdGVyUHJvY2Vzc29yKCk/IiwgdlswXSkKIAl9CiAJc21iIDo9IE5ld1N0b3JlZE1lc3NhZ2VQcm90b2NvbChpbiwgdlsxXSwgdHlwZUlkLCBzZXFpZCkKLQlyZXR1cm4gYWN0dWFsUHJvY2Vzc29yLlByb2Nlc3Moc21iLCBvdXQpCisJcmV0dXJuIGFjdHVhbFByb2Nlc3Nvci5Qcm9jZXNzKGN0eCwgc21iLCBvdXQpCiB9CiAKIC8vUHJvdG9jb2wgdGhhdCB1c2Ugc3RvcmVkIG1lc3NhZ2UgZm9yIFJlYWRNZXNzYWdlQmVnaW4KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvcHJvY2Vzc29yLmdvIGIvbGliL2dvL3RocmlmdC9wcm9jZXNzb3IuZ28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMGQzZmEuLjAwMDAwMDAKLS0tIGEvbGliL2dvL3RocmlmdC9wcm9jZXNzb3IuZ28KKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgdGhyaWZ0Ci0KLS8vIEEgcHJvY2Vzc29yIGlzIGEgZ2VuZXJpYyBvYmplY3Qgd2hpY2ggb3BlcmF0ZXMgdXBvbiBhbiBpbnB1dCBzdHJlYW0gYW5kCi0vLyB3cml0ZXMgdG8gc29tZSBvdXRwdXQgc3RyZWFtLgotdHlwZSBUUHJvY2Vzc29yIGludGVyZmFjZSB7Ci0JUHJvY2Vzcyhpbiwgb3V0IFRQcm90b2NvbCkgKGJvb2wsIFRFeGNlcHRpb24pCi19Ci0KLXR5cGUgVFByb2Nlc3NvckZ1bmN0aW9uIGludGVyZmFjZSB7Ci0JUHJvY2VzcyhzZXFJZCBpbnQzMiwgaW4sIG91dCBUUHJvdG9jb2wpIChib29sLCBURXhjZXB0aW9uKQotfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9wcm9jZXNzb3JfZmFjdG9yeS5nbyBiL2xpYi9nby90aHJpZnQvcHJvY2Vzc29yX2ZhY3RvcnkuZ28KaW5kZXggOWQ2NDVkZi4uZTRiMTMyYiAxMDA2NDQKLS0tIGEvbGliL2dvL3RocmlmdC9wcm9jZXNzb3JfZmFjdG9yeS5nbworKysgYi9saWIvZ28vdGhyaWZ0L3Byb2Nlc3Nvcl9mYWN0b3J5LmdvCkBAIC0xOSw2ICsxOSwxOCBAQAogCiBwYWNrYWdlIHRocmlmdAogCitpbXBvcnQgImNvbnRleHQiCisKKy8vIEEgcHJvY2Vzc29yIGlzIGEgZ2VuZXJpYyBvYmplY3Qgd2hpY2ggb3BlcmF0ZXMgdXBvbiBhbiBpbnB1dCBzdHJlYW0gYW5kCisvLyB3cml0ZXMgdG8gc29tZSBvdXRwdXQgc3RyZWFtLgordHlwZSBUUHJvY2Vzc29yIGludGVyZmFjZSB7CisJUHJvY2VzcyhjdHggY29udGV4dC5Db250ZXh0LCBpbiwgb3V0IFRQcm90b2NvbCkgKGJvb2wsIFRFeGNlcHRpb24pCit9CisKK3R5cGUgVFByb2Nlc3NvckZ1bmN0aW9uIGludGVyZmFjZSB7CisJUHJvY2VzcyhjdHggY29udGV4dC5Db250ZXh0LCBzZXFJZCBpbnQzMiwgaW4sIG91dCBUUHJvdG9jb2wpIChib29sLCBURXhjZXB0aW9uKQorfQorCiAvLyBUaGUgZGVmYXVsdCBwcm9jZXNzb3IgZmFjdG9yeSBqdXN0IHJldHVybnMgYSBzaW5nbGV0b24KIC8vIGluc3RhbmNlLgogdHlwZSBUUHJvY2Vzc29yRmFjdG9yeSBpbnRlcmZhY2UgewpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9wcm90b2NvbC5nbyBiL2xpYi9nby90aHJpZnQvcHJvdG9jb2wuZ28KaW5kZXggNDVmYTIwMi4uNjE1YjdhNCAxMDA2NDQKLS0tIGEvbGliL2dvL3RocmlmdC9wcm90b2NvbC5nbworKysgYi9saWIvZ28vdGhyaWZ0L3Byb3RvY29sLmdvCkBAIC0yMCw3ICsyMCw5IEBACiBwYWNrYWdlIHRocmlmdAogCiBpbXBvcnQgKAorCSJjb250ZXh0IgogCSJlcnJvcnMiCisJImZtdCIKICkKIAogY29uc3QgKApAQCAtNzMsNyArNzUsNyBAQAogCVJlYWRCaW5hcnkoKSAodmFsdWUgW11ieXRlLCBlcnIgZXJyb3IpCiAKIAlTa2lwKGZpZWxkVHlwZSBUVHlwZSkgKGVyciBlcnJvcikKLQlGbHVzaCgpIChlcnIgZXJyb3IpCisJRmx1c2goY3R4IGNvbnRleHQuQ29udGV4dCkgKGVyciBlcnJvcikKIAogCVRyYW5zcG9ydCgpIFRUcmFuc3BvcnQKIH0KQEAgLTg4LDkgKzkwLDkgQEAKIAogLy8gU2tpcHMgb3ZlciB0aGUgbmV4dCBkYXRhIGVsZW1lbnQgZnJvbSB0aGUgcHJvdmlkZWQgaW5wdXQgVFByb3RvY29sIG9iamVjdC4KIGZ1bmMgU2tpcChzZWxmIFRQcm90b2NvbCwgZmllbGRUeXBlIFRUeXBlLCBtYXhEZXB0aCBpbnQpIChlcnIgZXJyb3IpIHsKLQkKLSAgICBpZiBtYXhEZXB0aCA8PSAwIHsKLQkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKCBERVBUSF9MSU1JVCwgZXJyb3JzLk5ldygiRGVwdGggbGltaXQgZXhjZWVkZWQiKSkKKworCWlmIG1heERlcHRoIDw9IDAgeworCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoREVQVEhfTElNSVQsIGVycm9ycy5OZXcoIkRlcHRoIGxpbWl0IGV4Y2VlZGVkIikpCiAJfQogCiAJc3dpdGNoIGZpZWxkVHlwZSB7CkBAIC0xNzAsNiArMTcyLDggQEAKIAkJCX0KIAkJfQogCQlyZXR1cm4gc2VsZi5SZWFkTGlzdEVuZCgpCisJZGVmYXVsdDoKKwkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZXJyb3JzLk5ldyhmbXQuU3ByaW50ZigiVW5rbm93biBkYXRhIHR5cGUgJWQiLCBmaWVsZFR5cGUpKSkKIAl9CiAJcmV0dXJuIG5pbAogfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9wcm90b2NvbF9leGNlcHRpb24uZ28gYi9saWIvZ28vdGhyaWZ0L3Byb3RvY29sX2V4Y2VwdGlvbi5nbwppbmRleCA2ZTM1N2VlLi4yOWFiNzVkIDEwMDY0NAotLS0gYS9saWIvZ28vdGhyaWZ0L3Byb3RvY29sX2V4Y2VwdGlvbi5nbworKysgYi9saWIvZ28vdGhyaWZ0L3Byb3RvY29sX2V4Y2VwdGlvbi5nbwpAQCAtNjAsNyArNjAsNyBAQAogCWlmIGVyciA9PSBuaWwgewogCQlyZXR1cm4gbmlsCiAJfQotCWlmIGUsb2sgOj0gZXJyLihUUHJvdG9jb2xFeGNlcHRpb24pOyBvayB7CisJaWYgZSwgb2sgOj0gZXJyLihUUHJvdG9jb2xFeGNlcHRpb24pOyBvayB7CiAJCXJldHVybiBlCiAJfQogCWlmIF8sIG9rIDo9IGVyci4oYmFzZTY0LkNvcnJ1cHRJbnB1dEVycm9yKTsgb2sgewpAQCAtNzUsNCArNzUsMyBAQAogCX0KIAlyZXR1cm4gJnRQcm90b2NvbEV4Y2VwdGlvbntlcnJUeXBlLCBlcnIuRXJyb3IoKX0KIH0KLQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9wcm90b2NvbF90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC9wcm90b2NvbF90ZXN0LmdvCmluZGV4IDYxM2VhZTYuLjk0NDA1NWMgMTAwNjQ0Ci0tLSBhL2xpYi9nby90aHJpZnQvcHJvdG9jb2xfdGVzdC5nbworKysgYi9saWIvZ28vdGhyaWZ0L3Byb3RvY29sX3Rlc3QuZ28KQEAgLTIxLDYgKzIxLDcgQEAKIAogaW1wb3J0ICgKIAkiYnl0ZXMiCisJImNvbnRleHQiCiAJImlvL2lvdXRpbCIKIAkibWF0aCIKIAkibmV0IgpAQCAtMzEsNyArMzIsNiBAQAogY29uc3QgUFJPVE9DT0xfQklOQVJZX0RBVEFfU0laRSA9IDE1NQogCiB2YXIgKAotCWRhdGEgICAgICAgICAgIHN0cmluZyAvLyB0ZXN0IGRhdGEgZm9yIHdyaXRpbmcKIAlwcm90b2NvbF9iZGF0YSBbXWJ5dGUgLy8gdGVzdCBkYXRhIGZvciB3cml0aW5nOyBzYW1lIGFzIGRhdGEKIAlCT09MX1ZBTFVFUyAgICBbXWJvb2wKIAlCWVRFX1ZBTFVFUyAgICBbXWludDgKQEAgLTQ3LDcgKzQ3LDYgQEAKIAlmb3IgaSA6PSAwOyBpIDwgUFJPVE9DT0xfQklOQVJZX0RBVEFfU0laRTsgaSsrIHsKIAkJcHJvdG9jb2xfYmRhdGFbaV0gPSBieXRlKChpICsgJ2EnKSAlIDI1NSkKIAl9Ci0JZGF0YSA9IHN0cmluZyhwcm90b2NvbF9iZGF0YSkKIAlCT09MX1ZBTFVFUyA9IFtdYm9vbHtmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCB0cnVlfQogCUJZVEVfVkFMVUVTID0gW11pbnQ4ezExNywgMCwgMSwgMzIsIDEyNywgLTEyOCwgLTF9CiAJSU5UMTZfVkFMVUVTID0gW11pbnQxNns0NTksIDAsIDEsIC0xLCAtMTI4LCAxMjcsIDMyNzY3LCAtMzI3Njh9CkBAIC0xMjAsNTggKzExOSw5NyBAQAogCQlOZXdUTWVtb3J5QnVmZmVyVHJhbnNwb3J0RmFjdG9yeSgxMDI0KSwKIAkJTmV3U3RyZWFtVHJhbnNwb3J0RmFjdG9yeShidWYsIGJ1ZiwgdHJ1ZSksCiAJCU5ld1RGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KE5ld1RNZW1vcnlCdWZmZXJUcmFuc3BvcnRGYWN0b3J5KDEwMjQpKSwKKwkJTmV3VFpsaWJUcmFuc3BvcnRGYWN0b3J5V2l0aEZhY3RvcnkoMCwgTmV3VE1lbW9yeUJ1ZmZlclRyYW5zcG9ydEZhY3RvcnkoMTAyNCkpLAorCQlOZXdUWmxpYlRyYW5zcG9ydEZhY3RvcnlXaXRoRmFjdG9yeSg2LCBOZXdUTWVtb3J5QnVmZmVyVHJhbnNwb3J0RmFjdG9yeSgxMDI0KSksCisJCU5ld1RabGliVHJhbnNwb3J0RmFjdG9yeVdpdGhGYWN0b3J5KDksIE5ld1RGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KE5ld1RNZW1vcnlCdWZmZXJUcmFuc3BvcnRGYWN0b3J5KDEwMjQpKSksCiAJCU5ld1RIdHRwUG9zdENsaWVudFRyYW5zcG9ydEZhY3RvcnkoImh0dHA6Ly8iICsgYWRkci5TdHJpbmcoKSksCiAJfQogCWZvciBfLCB0ZiA6PSByYW5nZSB0cmFuc3BvcnRzIHsKLQkJdHJhbnMgOj0gdGYuR2V0VHJhbnNwb3J0KG5pbCkKKwkJdHJhbnMsIGVyciA6PSB0Zi5HZXRUcmFuc3BvcnQobmlsKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXQuRXJyb3IoZXJyKQorCQkJY29udGludWUKKwkJfQogCQlwIDo9IHByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbCh0cmFucykKIAkJUmVhZFdyaXRlQm9vbCh0LCBwLCB0cmFucykKIAkJdHJhbnMuQ2xvc2UoKQogCX0KIAlmb3IgXywgdGYgOj0gcmFuZ2UgdHJhbnNwb3J0cyB7Ci0JCXRyYW5zIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCisJCXRyYW5zLCBlcnIgOj0gdGYuR2V0VHJhbnNwb3J0KG5pbCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQl0LkVycm9yKGVycikKKwkJCWNvbnRpbnVlCisJCX0KIAkJcCA6PSBwcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnMpCiAJCVJlYWRXcml0ZUJ5dGUodCwgcCwgdHJhbnMpCiAJCXRyYW5zLkNsb3NlKCkKIAl9CiAJZm9yIF8sIHRmIDo9IHJhbmdlIHRyYW5zcG9ydHMgewotCQl0cmFucyA6PSB0Zi5HZXRUcmFuc3BvcnQobmlsKQorCQl0cmFucywgZXJyIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcihlcnIpCisJCQljb250aW51ZQorCQl9CiAJCXAgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKQogCQlSZWFkV3JpdGVJMTYodCwgcCwgdHJhbnMpCiAJCXRyYW5zLkNsb3NlKCkKIAl9CiAJZm9yIF8sIHRmIDo9IHJhbmdlIHRyYW5zcG9ydHMgewotCQl0cmFucyA6PSB0Zi5HZXRUcmFuc3BvcnQobmlsKQorCQl0cmFucywgZXJyIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcihlcnIpCisJCQljb250aW51ZQorCQl9CiAJCXAgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKQogCQlSZWFkV3JpdGVJMzIodCwgcCwgdHJhbnMpCiAJCXRyYW5zLkNsb3NlKCkKIAl9CiAJZm9yIF8sIHRmIDo9IHJhbmdlIHRyYW5zcG9ydHMgewotCQl0cmFucyA6PSB0Zi5HZXRUcmFuc3BvcnQobmlsKQorCQl0cmFucywgZXJyIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcihlcnIpCisJCQljb250aW51ZQorCQl9CiAJCXAgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKQogCQlSZWFkV3JpdGVJNjQodCwgcCwgdHJhbnMpCiAJCXRyYW5zLkNsb3NlKCkKIAl9CiAJZm9yIF8sIHRmIDo9IHJhbmdlIHRyYW5zcG9ydHMgewotCQl0cmFucyA6PSB0Zi5HZXRUcmFuc3BvcnQobmlsKQorCQl0cmFucywgZXJyIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcihlcnIpCisJCQljb250aW51ZQorCQl9CiAJCXAgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKQogCQlSZWFkV3JpdGVEb3VibGUodCwgcCwgdHJhbnMpCiAJCXRyYW5zLkNsb3NlKCkKIAl9CiAJZm9yIF8sIHRmIDo9IHJhbmdlIHRyYW5zcG9ydHMgewotCQl0cmFucyA6PSB0Zi5HZXRUcmFuc3BvcnQobmlsKQorCQl0cmFucywgZXJyIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcihlcnIpCisJCQljb250aW51ZQorCQl9CiAJCXAgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKQogCQlSZWFkV3JpdGVTdHJpbmcodCwgcCwgdHJhbnMpCiAJCXRyYW5zLkNsb3NlKCkKIAl9CiAJZm9yIF8sIHRmIDo9IHJhbmdlIHRyYW5zcG9ydHMgewotCQl0cmFucyA6PSB0Zi5HZXRUcmFuc3BvcnQobmlsKQorCQl0cmFucywgZXJyIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcihlcnIpCisJCQljb250aW51ZQorCQl9CiAJCXAgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKQogCQlSZWFkV3JpdGVCaW5hcnkodCwgcCwgdHJhbnMpCiAJCXRyYW5zLkNsb3NlKCkKIAl9CiAJZm9yIF8sIHRmIDo9IHJhbmdlIHRyYW5zcG9ydHMgewotCQl0cmFucyA6PSB0Zi5HZXRUcmFuc3BvcnQobmlsKQorCQl0cmFucywgZXJyIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcihlcnIpCisJCQljb250aW51ZQorCQl9CiAJCXAgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKQogCQlSZWFkV3JpdGVJNjQodCwgcCwgdHJhbnMpCiAJCVJlYWRXcml0ZURvdWJsZSh0LCBwLCB0cmFucykKQEAgLTE5MSwxNyArMjI5LDE3IEBACiAJZm9yIGssIHYgOj0gcmFuZ2UgQk9PTF9WQUxVRVMgewogCQllcnIgPSBwLldyaXRlQm9vbCh2KQogCQlpZiBlcnIgIT0gbmlsIHsKLQkJCXQuRXJyb3JmKCIlczogJVQgJVQgJXEgRXJyb3Igd3JpdGluZyBib29sIGluIGxpc3QgYXQgaW5kZXggJWQ6ICVxIiwgIlJlYWRXcml0ZUJvb2wiLCBwLCB0cmFucywgZXJyLCBrLCB2KQorCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCAldiBFcnJvciB3cml0aW5nIGJvb2wgaW4gbGlzdCBhdCBpbmRleCAldjogJXYiLCAiUmVhZFdyaXRlQm9vbCIsIHAsIHRyYW5zLCBlcnIsIGssIHYpCiAJCX0KIAl9CiAJcC5Xcml0ZUxpc3RFbmQoKQogCWlmIGVyciAhPSBuaWwgewotCQl0LkVycm9yZigiJXM6ICVUICVUICVxIEVycm9yIHdyaXRpbmcgbGlzdCBlbmQ6ICVxIiwgIlJlYWRXcml0ZUJvb2wiLCBwLCB0cmFucywgZXJyLCBCT09MX1ZBTFVFUykKKwkJdC5FcnJvcmYoIiVzOiAlVCAlVCAldiBFcnJvciB3cml0aW5nIGxpc3QgZW5kOiAldiIsICJSZWFkV3JpdGVCb29sIiwgcCwgdHJhbnMsIGVyciwgQk9PTF9WQUxVRVMpCiAJfQotCXAuRmx1c2goKQorCXAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCiAJdGhldHlwZTIsIHRoZWxlbjIsIGVyciA6PSBwLlJlYWRMaXN0QmVnaW4oKQogCWlmIGVyciAhPSBuaWwgewotCQl0LkVycm9yZigiJXM6ICVUICVUICVxIEVycm9yIHJlYWRpbmcgbGlzdDogJXEiLCAiUmVhZFdyaXRlQm9vbCIsIHAsIHRyYW5zLCBlcnIsIEJPT0xfVkFMVUVTKQorCQl0LkVycm9yZigiJXM6ICVUICVUICV2IEVycm9yIHJlYWRpbmcgbGlzdDogJXYiLCAiUmVhZFdyaXRlQm9vbCIsIHAsIHRyYW5zLCBlcnIsIEJPT0xfVkFMVUVTKQogCX0KIAlfLCBvayA6PSBwLigqVFNpbXBsZUpTT05Qcm90b2NvbCkKIAlpZiAhb2sgewpAQCAtMjA5LDE2ICsyNDcsMTYgQEAKIAkJCXQuRXJyb3JmKCIlczogJVQgJVQgdHlwZSAlcyAhPSB0eXBlICVzIiwgIlJlYWRXcml0ZUJvb2wiLCBwLCB0cmFucywgdGhldHlwZSwgdGhldHlwZTIpCiAJCX0KIAkJaWYgdGhlbGVuICE9IHRoZWxlbjIgewotCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCBsZW4gJXMgIT0gbGVuICVzIiwgIlJlYWRXcml0ZUJvb2wiLCBwLCB0cmFucywgdGhlbGVuLCB0aGVsZW4yKQorCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCBsZW4gJXYgIT0gbGVuICV2IiwgIlJlYWRXcml0ZUJvb2wiLCBwLCB0cmFucywgdGhlbGVuLCB0aGVsZW4yKQogCQl9CiAJfQogCWZvciBrLCB2IDo9IHJhbmdlIEJPT0xfVkFMVUVTIHsKIAkJdmFsdWUsIGVyciA6PSBwLlJlYWRCb29sKCkKIAkJaWYgZXJyICE9IG5pbCB7Ci0JCQl0LkVycm9yZigiJXM6ICVUICVUICVxIEVycm9yIHJlYWRpbmcgYm9vbCBhdCBpbmRleCAlZDogJXEiLCAiUmVhZFdyaXRlQm9vbCIsIHAsIHRyYW5zLCBlcnIsIGssIHYpCisJCQl0LkVycm9yZigiJXM6ICVUICVUICV2IEVycm9yIHJlYWRpbmcgYm9vbCBhdCBpbmRleCAldjogJXYiLCAiUmVhZFdyaXRlQm9vbCIsIHAsIHRyYW5zLCBlcnIsIGssIHYpCiAJCX0KIAkJaWYgdiAhPSB2YWx1ZSB7Ci0JCQl0LkVycm9yZigiJXM6IGluZGV4ICVkICVxICVxICVxICE9ICVxIiwgIlJlYWRXcml0ZUJvb2wiLCBrLCBwLCB0cmFucywgdiwgdmFsdWUpCisJCQl0LkVycm9yZigiJXM6IGluZGV4ICV2ICV2ICV2ICV2ICE9ICV2IiwgIlJlYWRXcml0ZUJvb2wiLCBrLCBwLCB0cmFucywgdiwgdmFsdWUpCiAJCX0KIAl9CiAJZXJyID0gcC5SZWFkTGlzdEVuZCgpCkBAIC0yNDQsNyArMjgyLDcgQEAKIAlpZiBlcnIgIT0gbmlsIHsKIAkJdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciB3cml0aW5nIGxpc3QgZW5kOiAlcSIsICJSZWFkV3JpdGVCeXRlIiwgcCwgdHJhbnMsIGVyciwgQllURV9WQUxVRVMpCiAJfQotCWVyciA9IHAuRmx1c2goKQorCWVyciA9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRXJyb3JmKCIlczogJVQgJVQgJXEgRXJyb3IgZmx1c2hpbmcgbGlzdCBvZiBieXRlczogJXEiLCAiUmVhZFdyaXRlQnl0ZSIsIHAsIHRyYW5zLCBlcnIsIEJZVEVfVkFMVUVTKQogCX0KQEAgLTI1OCw3ICsyOTYsNyBAQAogCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCB0eXBlICVzICE9IHR5cGUgJXMiLCAiUmVhZFdyaXRlQnl0ZSIsIHAsIHRyYW5zLCB0aGV0eXBlLCB0aGV0eXBlMikKIAkJfQogCQlpZiB0aGVsZW4gIT0gdGhlbGVuMiB7Ci0JCQl0LkVycm9yZigiJXM6ICVUICVUIGxlbiAlcyAhPSBsZW4gJXMiLCAiUmVhZFdyaXRlQnl0ZSIsIHAsIHRyYW5zLCB0aGVsZW4sIHRoZWxlbjIpCisJCQl0LkVycm9yZigiJXM6ICVUICVUIGxlbiAldiAhPSBsZW4gJXYiLCAiUmVhZFdyaXRlQnl0ZSIsIHAsIHRyYW5zLCB0aGVsZW4sIHRoZWxlbjIpCiAJCX0KIAl9CiAJZm9yIGssIHYgOj0gcmFuZ2UgQllURV9WQUxVRVMgewpAQCAtMjg0LDcgKzMyMiw3IEBACiAJCXAuV3JpdGVJMTYodikKIAl9CiAJcC5Xcml0ZUxpc3RFbmQoKQotCXAuRmx1c2goKQorCXAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCiAJdGhldHlwZTIsIHRoZWxlbjIsIGVyciA6PSBwLlJlYWRMaXN0QmVnaW4oKQogCWlmIGVyciAhPSBuaWwgewogCQl0LkVycm9yZigiJXM6ICVUICVUICVxIEVycm9yIHJlYWRpbmcgbGlzdDogJXEiLCAiUmVhZFdyaXRlSTE2IiwgcCwgdHJhbnMsIGVyciwgSU5UMTZfVkFMVUVTKQpAQCAtMjk1LDcgKzMzMyw3IEBACiAJCQl0LkVycm9yZigiJXM6ICVUICVUIHR5cGUgJXMgIT0gdHlwZSAlcyIsICJSZWFkV3JpdGVJMTYiLCBwLCB0cmFucywgdGhldHlwZSwgdGhldHlwZTIpCiAJCX0KIAkJaWYgdGhlbGVuICE9IHRoZWxlbjIgewotCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCBsZW4gJXMgIT0gbGVuICVzIiwgIlJlYWRXcml0ZUkxNiIsIHAsIHRyYW5zLCB0aGVsZW4sIHRoZWxlbjIpCisJCQl0LkVycm9yZigiJXM6ICVUICVUIGxlbiAldiAhPSBsZW4gJXYiLCAiUmVhZFdyaXRlSTE2IiwgcCwgdHJhbnMsIHRoZWxlbiwgdGhlbGVuMikKIAkJfQogCX0KIAlmb3IgaywgdiA6PSByYW5nZSBJTlQxNl9WQUxVRVMgewpAQCAtMzIxLDcgKzM1OSw3IEBACiAJCXAuV3JpdGVJMzIodikKIAl9CiAJcC5Xcml0ZUxpc3RFbmQoKQotCXAuRmx1c2goKQorCXAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCiAJdGhldHlwZTIsIHRoZWxlbjIsIGVyciA6PSBwLlJlYWRMaXN0QmVnaW4oKQogCWlmIGVyciAhPSBuaWwgewogCQl0LkVycm9yZigiJXM6ICVUICVUICVxIEVycm9yIHJlYWRpbmcgbGlzdDogJXEiLCAiUmVhZFdyaXRlSTMyIiwgcCwgdHJhbnMsIGVyciwgSU5UMzJfVkFMVUVTKQpAQCAtMzMyLDcgKzM3MCw3IEBACiAJCQl0LkVycm9yZigiJXM6ICVUICVUIHR5cGUgJXMgIT0gdHlwZSAlcyIsICJSZWFkV3JpdGVJMzIiLCBwLCB0cmFucywgdGhldHlwZSwgdGhldHlwZTIpCiAJCX0KIAkJaWYgdGhlbGVuICE9IHRoZWxlbjIgewotCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCBsZW4gJXMgIT0gbGVuICVzIiwgIlJlYWRXcml0ZUkzMiIsIHAsIHRyYW5zLCB0aGVsZW4sIHRoZWxlbjIpCisJCQl0LkVycm9yZigiJXM6ICVUICVUIGxlbiAldiAhPSBsZW4gJXYiLCAiUmVhZFdyaXRlSTMyIiwgcCwgdHJhbnMsIHRoZWxlbiwgdGhlbGVuMikKIAkJfQogCX0KIAlmb3IgaywgdiA6PSByYW5nZSBJTlQzMl9WQUxVRVMgewpAQCAtMzU3LDcgKzM5NSw3IEBACiAJCXAuV3JpdGVJNjQodikKIAl9CiAJcC5Xcml0ZUxpc3RFbmQoKQotCXAuRmx1c2goKQorCXAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCiAJdGhldHlwZTIsIHRoZWxlbjIsIGVyciA6PSBwLlJlYWRMaXN0QmVnaW4oKQogCWlmIGVyciAhPSBuaWwgewogCQl0LkVycm9yZigiJXM6ICVUICVUICVxIEVycm9yIHJlYWRpbmcgbGlzdDogJXEiLCAiUmVhZFdyaXRlSTY0IiwgcCwgdHJhbnMsIGVyciwgSU5UNjRfVkFMVUVTKQpAQCAtMzY4LDcgKzQwNiw3IEBACiAJCQl0LkVycm9yZigiJXM6ICVUICVUIHR5cGUgJXMgIT0gdHlwZSAlcyIsICJSZWFkV3JpdGVJNjQiLCBwLCB0cmFucywgdGhldHlwZSwgdGhldHlwZTIpCiAJCX0KIAkJaWYgdGhlbGVuICE9IHRoZWxlbjIgewotCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCBsZW4gJXMgIT0gbGVuICVzIiwgIlJlYWRXcml0ZUk2NCIsIHAsIHRyYW5zLCB0aGVsZW4sIHRoZWxlbjIpCisJCQl0LkVycm9yZigiJXM6ICVUICVUIGxlbiAldiAhPSBsZW4gJXYiLCAiUmVhZFdyaXRlSTY0IiwgcCwgdHJhbnMsIHRoZWxlbiwgdGhlbGVuMikKIAkJfQogCX0KIAlmb3IgaywgdiA6PSByYW5nZSBJTlQ2NF9WQUxVRVMgewpAQCAtMzkzLDI4ICs0MzEsMjggQEAKIAkJcC5Xcml0ZURvdWJsZSh2KQogCX0KIAlwLldyaXRlTGlzdEVuZCgpCi0JcC5GbHVzaCgpCisJcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKIAl0aGV0eXBlMiwgdGhlbGVuMiwgZXJyIDo9IHAuUmVhZExpc3RCZWdpbigpCiAJaWYgZXJyICE9IG5pbCB7Ci0JCXQuRXJyb3JmKCIlczogJVQgJVQgJXEgRXJyb3IgcmVhZGluZyBsaXN0OiAlcSIsICJSZWFkV3JpdGVEb3VibGUiLCBwLCB0cmFucywgZXJyLCBET1VCTEVfVkFMVUVTKQorCQl0LkVycm9yZigiJXM6ICVUICVUICV2IEVycm9yIHJlYWRpbmcgbGlzdDogJXYiLCAiUmVhZFdyaXRlRG91YmxlIiwgcCwgdHJhbnMsIGVyciwgRE9VQkxFX1ZBTFVFUykKIAl9CiAJaWYgdGhldHlwZSAhPSB0aGV0eXBlMiB7CiAJCXQuRXJyb3JmKCIlczogJVQgJVQgdHlwZSAlcyAhPSB0eXBlICVzIiwgIlJlYWRXcml0ZURvdWJsZSIsIHAsIHRyYW5zLCB0aGV0eXBlLCB0aGV0eXBlMikKIAl9CiAJaWYgdGhlbGVuICE9IHRoZWxlbjIgewotCQl0LkVycm9yZigiJXM6ICVUICVUIGxlbiAlcyAhPSBsZW4gJXMiLCAiUmVhZFdyaXRlRG91YmxlIiwgcCwgdHJhbnMsIHRoZWxlbiwgdGhlbGVuMikKKwkJdC5FcnJvcmYoIiVzOiAlVCAlVCBsZW4gJXYgIT0gbGVuICV2IiwgIlJlYWRXcml0ZURvdWJsZSIsIHAsIHRyYW5zLCB0aGVsZW4sIHRoZWxlbjIpCiAJfQogCWZvciBrLCB2IDo9IHJhbmdlIERPVUJMRV9WQUxVRVMgewogCQl2YWx1ZSwgZXJyIDo9IHAuUmVhZERvdWJsZSgpCiAJCWlmIGVyciAhPSBuaWwgewotCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciByZWFkaW5nIGRvdWJsZSBhdCBpbmRleCAlZDogJXEiLCAiUmVhZFdyaXRlRG91YmxlIiwgcCwgdHJhbnMsIGVyciwgaywgdikKKwkJCXQuRXJyb3JmKCIlczogJVQgJVQgJXEgRXJyb3IgcmVhZGluZyBkb3VibGUgYXQgaW5kZXggJWQ6ICV2IiwgIlJlYWRXcml0ZURvdWJsZSIsIHAsIHRyYW5zLCBlcnIsIGssIHYpCiAJCX0KIAkJaWYgbWF0aC5Jc05hTih2KSB7CiAJCQlpZiAhbWF0aC5Jc05hTih2YWx1ZSkgewotCQkJCXQuRXJyb3JmKCIlczogJVQgJVQgbWF0aC5Jc05hTiglcSkgIT0gbWF0aC5Jc05hTiglcSkiLCAiUmVhZFdyaXRlRG91YmxlIiwgcCwgdHJhbnMsIHYsIHZhbHVlKQorCQkJCXQuRXJyb3JmKCIlczogJVQgJVQgbWF0aC5Jc05hTigldikgIT0gbWF0aC5Jc05hTigldikiLCAiUmVhZFdyaXRlRG91YmxlIiwgcCwgdHJhbnMsIHYsIHZhbHVlKQogCQkJfQogCQl9IGVsc2UgaWYgdiAhPSB2YWx1ZSB7Ci0JCQl0LkVycm9yZigiJXM6ICVUICVUICV2ICE9ICVxIiwgIlJlYWRXcml0ZURvdWJsZSIsIHAsIHRyYW5zLCB2LCB2YWx1ZSkKKwkJCXQuRXJyb3JmKCIlczogJVQgJVQgJXYgIT0gJXYiLCAiUmVhZFdyaXRlRG91YmxlIiwgcCwgdHJhbnMsIHYsIHZhbHVlKQogCQl9CiAJfQogCWVyciA9IHAuUmVhZExpc3RFbmQoKQpAQCAtNDMxLDcgKzQ2OSw3IEBACiAJCXAuV3JpdGVTdHJpbmcodikKIAl9CiAJcC5Xcml0ZUxpc3RFbmQoKQotCXAuRmx1c2goKQorCXAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCiAJdGhldHlwZTIsIHRoZWxlbjIsIGVyciA6PSBwLlJlYWRMaXN0QmVnaW4oKQogCWlmIGVyciAhPSBuaWwgewogCQl0LkVycm9yZigiJXM6ICVUICVUICVxIEVycm9yIHJlYWRpbmcgbGlzdDogJXEiLCAiUmVhZFdyaXRlU3RyaW5nIiwgcCwgdHJhbnMsIGVyciwgU1RSSU5HX1ZBTFVFUykKQEAgLTQ0Miw3ICs0ODAsNyBAQAogCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCB0eXBlICVzICE9IHR5cGUgJXMiLCAiUmVhZFdyaXRlU3RyaW5nIiwgcCwgdHJhbnMsIHRoZXR5cGUsIHRoZXR5cGUyKQogCQl9CiAJCWlmIHRoZWxlbiAhPSB0aGVsZW4yIHsKLQkJCXQuRXJyb3JmKCIlczogJVQgJVQgbGVuICVzICE9IGxlbiAlcyIsICJSZWFkV3JpdGVTdHJpbmciLCBwLCB0cmFucywgdGhlbGVuLCB0aGVsZW4yKQorCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCBsZW4gJXYgIT0gbGVuICV2IiwgIlJlYWRXcml0ZVN0cmluZyIsIHAsIHRyYW5zLCB0aGVsZW4sIHRoZWxlbjIpCiAJCX0KIAl9CiAJZm9yIGssIHYgOj0gcmFuZ2UgU1RSSU5HX1ZBTFVFUyB7CkBAIC00NTEsNyArNDg5LDcgQEAKIAkJCXQuRXJyb3JmKCIlczogJVQgJVQgJXEgRXJyb3IgcmVhZGluZyBzdHJpbmcgYXQgaW5kZXggJWQ6ICVxIiwgIlJlYWRXcml0ZVN0cmluZyIsIHAsIHRyYW5zLCBlcnIsIGssIHYpCiAJCX0KIAkJaWYgdiAhPSB2YWx1ZSB7Ci0JCQl0LkVycm9yZigiJXM6ICVUICVUICVkICE9ICVkIiwgIlJlYWRXcml0ZVN0cmluZyIsIHAsIHRyYW5zLCB2LCB2YWx1ZSkKKwkJCXQuRXJyb3JmKCIlczogJVQgJVQgJXYgIT0gJXYiLCAiUmVhZFdyaXRlU3RyaW5nIiwgcCwgdHJhbnMsIHYsIHZhbHVlKQogCQl9CiAJfQogCWlmIGVyciAhPSBuaWwgewpAQCAtNDYyLDcgKzUwMCw3IEBACiBmdW5jIFJlYWRXcml0ZUJpbmFyeSh0IHRlc3RpbmcuVEIsIHAgVFByb3RvY29sLCB0cmFucyBUVHJhbnNwb3J0KSB7CiAJdiA6PSBwcm90b2NvbF9iZGF0YQogCXAuV3JpdGVCaW5hcnkodikKLQlwLkZsdXNoKCkKKwlwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQogCXZhbHVlLCBlcnIgOj0gcC5SZWFkQmluYXJ5KCkKIAlpZiBlcnIgIT0gbmlsIHsKIAkJdC5FcnJvcmYoIiVzOiAlVCAlVCBVbmFibGUgdG8gcmVhZCBiaW5hcnk6ICVzIiwgIlJlYWRXcml0ZUJpbmFyeSIsIHAsIHRyYW5zLCBlcnIuRXJyb3IoKSkKZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvcmljaF90cmFuc3BvcnQuZ28gYi9saWIvZ28vdGhyaWZ0L3JpY2hfdHJhbnNwb3J0LmdvCmluZGV4IDhlMjk2YTkuLjQwMjViZWIgMTAwNjQ0Ci0tLSBhL2xpYi9nby90aHJpZnQvcmljaF90cmFuc3BvcnQuZ28KKysrIGIvbGliL2dvL3RocmlmdC9yaWNoX3RyYW5zcG9ydC5nbwpAQCAtNjYsNCArNjYsMyBAQAogCV8sIGVyciA6PSB3LldyaXRlKHZbMDoxXSkKIAlyZXR1cm4gZXJyCiB9Ci0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvcmljaF90cmFuc3BvcnRfdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvcmljaF90cmFuc3BvcnRfdGVzdC5nbwppbmRleCA0MTUxM2Y4Li4yNWMzZmQ1IDEwMDY0NAotLS0gYS9saWIvZ28vdGhyaWZ0L3JpY2hfdHJhbnNwb3J0X3Rlc3QuZ28KKysrIGIvbGliL2dvL3RocmlmdC9yaWNoX3RyYW5zcG9ydF90ZXN0LmdvCkBAIC0zNyw3ICszNywxMSBAQAogCQlOZXdUSHR0cFBvc3RDbGllbnRUcmFuc3BvcnRGYWN0b3J5KCJodHRwOi8vMTI3LjAuMC4xIiksCiAJfQogCWZvciBfLCB0ZiA6PSByYW5nZSB0cmFuc3BvcnRzIHsKLQkJdHJhbnMgOj0gdGYuR2V0VHJhbnNwb3J0KG5pbCkKKwkJdHJhbnMsIGVyciA6PSB0Zi5HZXRUcmFuc3BvcnQobmlsKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXQuRXJyb3IoZXJyKQorCQkJY29udGludWUKKwkJfQogCQlfLCBvayA6PSB0cmFucy4oVFJpY2hUcmFuc3BvcnQpCiAJCWlmICFvayB7CiAJCQl0LkVycm9yZigiVHJhbnNwb3J0ICVzIGRvZXMgbm90IGltcGxlbWVudCBUUmljaFRyYW5zcG9ydCBpbnRlcmZhY2UiLCByZWZsZWN0LlZhbHVlT2YodHJhbnMpKQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9zZXJpYWxpemVyLmdvIGIvbGliL2dvL3RocmlmdC9zZXJpYWxpemVyLmdvCmluZGV4IDc3MTIyMjkuLjFmZjRkMzcgMTAwNjQ0Ci0tLSBhL2xpYi9nby90aHJpZnQvc2VyaWFsaXplci5nbworKysgYi9saWIvZ28vdGhyaWZ0L3NlcmlhbGl6ZXIuZ28KQEAgLTE5LDYgKzE5LDEwIEBACiAKIHBhY2thZ2UgdGhyaWZ0CiAKK2ltcG9ydCAoCisJImNvbnRleHQiCispCisKIHR5cGUgVFNlcmlhbGl6ZXIgc3RydWN0IHsKIAlUcmFuc3BvcnQgKlRNZW1vcnlCdWZmZXIKIAlQcm90b2NvbCAgVFByb3RvY29sCkBAIC0zOCwzNSArNDIsMzUgQEAKIAkJcHJvdG9jb2x9CiB9CiAKLWZ1bmMgKHQgKlRTZXJpYWxpemVyKSBXcml0ZVN0cmluZyhtc2cgVFN0cnVjdCkgKHMgc3RyaW5nLCBlcnIgZXJyb3IpIHsKK2Z1bmMgKHQgKlRTZXJpYWxpemVyKSBXcml0ZVN0cmluZyhjdHggY29udGV4dC5Db250ZXh0LCBtc2cgVFN0cnVjdCkgKHMgc3RyaW5nLCBlcnIgZXJyb3IpIHsKIAl0LlRyYW5zcG9ydC5SZXNldCgpCiAKIAlpZiBlcnIgPSBtc2cuV3JpdGUodC5Qcm90b2NvbCk7IGVyciAhPSBuaWwgewogCQlyZXR1cm4KIAl9CiAKLQlpZiBlcnIgPSB0LlByb3RvY29sLkZsdXNoKCk7IGVyciAhPSBuaWwgeworCWlmIGVyciA9IHQuUHJvdG9jb2wuRmx1c2goY3R4KTsgZXJyICE9IG5pbCB7CiAJCXJldHVybgogCX0KLQlpZiBlcnIgPSB0LlRyYW5zcG9ydC5GbHVzaCgpOyBlcnIgIT0gbmlsIHsKKwlpZiBlcnIgPSB0LlRyYW5zcG9ydC5GbHVzaChjdHgpOyBlcnIgIT0gbmlsIHsKIAkJcmV0dXJuCiAJfQogCiAJcmV0dXJuIHQuVHJhbnNwb3J0LlN0cmluZygpLCBuaWwKIH0KIAotZnVuYyAodCAqVFNlcmlhbGl6ZXIpIFdyaXRlKG1zZyBUU3RydWN0KSAoYiBbXWJ5dGUsIGVyciBlcnJvcikgeworZnVuYyAodCAqVFNlcmlhbGl6ZXIpIFdyaXRlKGN0eCBjb250ZXh0LkNvbnRleHQsIG1zZyBUU3RydWN0KSAoYiBbXWJ5dGUsIGVyciBlcnJvcikgewogCXQuVHJhbnNwb3J0LlJlc2V0KCkKIAogCWlmIGVyciA9IG1zZy5Xcml0ZSh0LlByb3RvY29sKTsgZXJyICE9IG5pbCB7CiAJCXJldHVybgogCX0KIAotCWlmIGVyciA9IHQuUHJvdG9jb2wuRmx1c2goKTsgZXJyICE9IG5pbCB7CisJaWYgZXJyID0gdC5Qcm90b2NvbC5GbHVzaChjdHgpOyBlcnIgIT0gbmlsIHsKIAkJcmV0dXJuCiAJfQogCi0JaWYgZXJyID0gdC5UcmFuc3BvcnQuRmx1c2goKTsgZXJyICE9IG5pbCB7CisJaWYgZXJyID0gdC5UcmFuc3BvcnQuRmx1c2goY3R4KTsgZXJyICE9IG5pbCB7CiAJCXJldHVybgogCX0KIApkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9zZXJpYWxpemVyX3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L3NlcmlhbGl6ZXJfdGVzdC5nbwppbmRleCAzY2RiMzg3Li4zMjIyN2VmIDEwMDY0NAotLS0gYS9saWIvZ28vdGhyaWZ0L3NlcmlhbGl6ZXJfdGVzdC5nbworKysgYi9saWIvZ28vdGhyaWZ0L3NlcmlhbGl6ZXJfdGVzdC5nbwpAQCAtMjAsNiArMjAsNyBAQAogcGFja2FnZSB0aHJpZnQKIAogaW1wb3J0ICgKKwkiY29udGV4dCIKIAkiZXJyb3JzIgogCSJmbXQiCiAJInRlc3RpbmciCkBAIC04NSwxMCArODYsMTAgQEAKIAltLkJpbiA9IG1ha2UoW11ieXRlLCAxMCkKIAltLlN0cmluZ01hcCA9IG1ha2UobWFwW3N0cmluZ11zdHJpbmcsIDUpCiAJbS5TdHJpbmdMaXN0ID0gbWFrZShbXXN0cmluZywgNSkKLQltLlN0cmluZ1NldCA9IG1ha2UobWFwW3N0cmluZ11ib29sLCA1KQorCW0uU3RyaW5nU2V0ID0gbWFrZShtYXBbc3RyaW5nXXN0cnVjdHt9LCA1KQogCW0uRSA9IDIKIAotCXMsIGVyciA6PSB0LldyaXRlU3RyaW5nKCZtKQorCXMsIGVyciA6PSB0LldyaXRlU3RyaW5nKGNvbnRleHQuQmFja2dyb3VuZCgpLCAmbSkKIAlpZiBlcnIgIT0gbmlsIHsKIAkJcmV0dXJuIGZhbHNlLCBlcnJvcnMuTmV3KGZtdC5TcHJpbnRmKCJVbmFibGUgdG8gU2VyaWFsaXplIHN0cnVjdFxuXHQgJXMiLCBlcnIpKQogCX0KQEAgLTExOSwxMCArMTIwLDEwIEBACiAJbS5CaW4gPSBtYWtlKFtdYnl0ZSwgMTApCiAJbS5TdHJpbmdNYXAgPSBtYWtlKG1hcFtzdHJpbmddc3RyaW5nLCA1KQogCW0uU3RyaW5nTGlzdCA9IG1ha2UoW11zdHJpbmcsIDUpCi0JbS5TdHJpbmdTZXQgPSBtYWtlKG1hcFtzdHJpbmddYm9vbCwgNSkKKwltLlN0cmluZ1NldCA9IG1ha2UobWFwW3N0cmluZ11zdHJ1Y3R7fSwgNSkKIAltLkUgPSAyCiAKLQlzLCBlcnIgOj0gdC5Xcml0ZVN0cmluZygmbSkKKwlzLCBlcnIgOj0gdC5Xcml0ZVN0cmluZyhjb250ZXh0LkJhY2tncm91bmQoKSwgJm0pCiAJaWYgZXJyICE9IG5pbCB7CiAJCXJldHVybiBmYWxzZSwgZXJyb3JzLk5ldyhmbXQuU3ByaW50ZigiVW5hYmxlIHRvIFNlcmlhbGl6ZSBzdHJ1Y3Rcblx0ICVzIiwgZXJyKSkKIApkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9zZXJpYWxpemVyX3R5cGVzX3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L3NlcmlhbGl6ZXJfdHlwZXNfdGVzdC5nbwppbmRleCAxMGY0NzM3Li5lNTQ3MmJiIDEwMDY0NAotLS0gYS9saWIvZ28vdGhyaWZ0L3NlcmlhbGl6ZXJfdHlwZXNfdGVzdC5nbworKysgYi9saWIvZ28vdGhyaWZ0L3NlcmlhbGl6ZXJfdHlwZXNfdGVzdC5nbwpAQCAtMTksNyArMTksNyBAQAogCiBwYWNrYWdlIHRocmlmdAogCi0vLyBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMS4wLjAtZGV2KQorLy8gQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKEZJWE1FKQogLy8gRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lORwogCiAvKiBUSEUgRk9MTE9XSU5HIFRIUklGVCBGSUxFIFdBUyBVU0VEIFRPIENSRUFURSBUSElTCkBAIC05NywxOCArOTcsMTggQEAKIGZ1bmMgTXlUZXN0RW51bVB0cih2IE15VGVzdEVudW0pICpNeVRlc3RFbnVtIHsgcmV0dXJuICZ2IH0KIAogdHlwZSBNeVRlc3RTdHJ1Y3Qgc3RydWN0IHsKLQlPbiAgICAgICAgIGJvb2wgICAgICAgICAgICAgIGB0aHJpZnQ6Im9uLDEiIGpzb246Im9uImAKLQlCICAgICAgICAgIGludDggICAgICAgICAgICAgIGB0aHJpZnQ6ImIsMiIganNvbjoiYiJgCi0JSW50MTYgICAgICBpbnQxNiAgICAgICAgICAgICBgdGhyaWZ0OiJpbnQxNiwzIiBqc29uOiJpbnQxNiJgCi0JSW50MzIgICAgICBpbnQzMiAgICAgICAgICAgICBgdGhyaWZ0OiJpbnQzMiw0IiBqc29uOiJpbnQzMiJgCi0JSW50NjQgICAgICBpbnQ2NCAgICAgICAgICAgICBgdGhyaWZ0OiJpbnQ2NCw1IiBqc29uOiJpbnQ2NCJgCi0JRCAgICAgICAgICBmbG9hdDY0ICAgICAgICAgICBgdGhyaWZ0OiJkLDYiIGpzb246ImQiYAotCVN0ICAgICAgICAgc3RyaW5nICAgICAgICAgICAgYHRocmlmdDoic3QsNyIganNvbjoic3QiYAotCUJpbiAgICAgICAgW11ieXRlICAgICAgICAgICAgYHRocmlmdDoiYmluLDgiIGpzb246ImJpbiJgCi0JU3RyaW5nTWFwICBtYXBbc3RyaW5nXXN0cmluZyBgdGhyaWZ0OiJzdHJpbmdNYXAsOSIganNvbjoic3RyaW5nTWFwImAKLQlTdHJpbmdMaXN0IFtdc3RyaW5nICAgICAgICAgIGB0aHJpZnQ6InN0cmluZ0xpc3QsMTAiIGpzb246InN0cmluZ0xpc3QiYAotCVN0cmluZ1NldCAgbWFwW3N0cmluZ11ib29sICAgYHRocmlmdDoic3RyaW5nU2V0LDExIiBqc29uOiJzdHJpbmdTZXQiYAotCUUgICAgICAgICAgTXlUZXN0RW51bSAgICAgICAgYHRocmlmdDoiZSwxMiIganNvbjoiZSJgCisJT24gICAgICAgICBib29sICAgICAgICAgICAgICAgIGB0aHJpZnQ6Im9uLDEiIGpzb246Im9uImAKKwlCICAgICAgICAgIGludDggICAgICAgICAgICAgICAgYHRocmlmdDoiYiwyIiBqc29uOiJiImAKKwlJbnQxNiAgICAgIGludDE2ICAgICAgICAgICAgICAgYHRocmlmdDoiaW50MTYsMyIganNvbjoiaW50MTYiYAorCUludDMyICAgICAgaW50MzIgICAgICAgICAgICAgICBgdGhyaWZ0OiJpbnQzMiw0IiBqc29uOiJpbnQzMiJgCisJSW50NjQgICAgICBpbnQ2NCAgICAgICAgICAgICAgIGB0aHJpZnQ6ImludDY0LDUiIGpzb246ImludDY0ImAKKwlEICAgICAgICAgIGZsb2F0NjQgICAgICAgICAgICAgYHRocmlmdDoiZCw2IiBqc29uOiJkImAKKwlTdCAgICAgICAgIHN0cmluZyAgICAgICAgICAgICAgYHRocmlmdDoic3QsNyIganNvbjoic3QiYAorCUJpbiAgICAgICAgW11ieXRlICAgICAgICAgICAgICBgdGhyaWZ0OiJiaW4sOCIganNvbjoiYmluImAKKwlTdHJpbmdNYXAgIG1hcFtzdHJpbmddc3RyaW5nICAgYHRocmlmdDoic3RyaW5nTWFwLDkiIGpzb246InN0cmluZ01hcCJgCisJU3RyaW5nTGlzdCBbXXN0cmluZyAgICAgICAgICAgIGB0aHJpZnQ6InN0cmluZ0xpc3QsMTAiIGpzb246InN0cmluZ0xpc3QiYAorCVN0cmluZ1NldCAgbWFwW3N0cmluZ11zdHJ1Y3R7fSBgdGhyaWZ0OiJzdHJpbmdTZXQsMTEiIGpzb246InN0cmluZ1NldCJgCisJRSAgICAgICAgICBNeVRlc3RFbnVtICAgICAgICAgIGB0aHJpZnQ6ImUsMTIiIGpzb246ImUiYAogfQogCiBmdW5jIE5ld015VGVzdFN0cnVjdCgpICpNeVRlc3RTdHJ1Y3QgewpAQCAtMTU1LDcgKzE1NSw3IEBACiAJcmV0dXJuIHAuU3RyaW5nTGlzdAogfQogCi1mdW5jIChwICpNeVRlc3RTdHJ1Y3QpIEdldFN0cmluZ1NldCgpIG1hcFtzdHJpbmddYm9vbCB7CitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIEdldFN0cmluZ1NldCgpIG1hcFtzdHJpbmddc3RydWN0e30gewogCXJldHVybiBwLlN0cmluZ1NldAogfQogCkBAIC0zNjYsNyArMzY2LDcgQEAKIAlpZiBlcnIgIT0gbmlsIHsKIAkJcmV0dXJuIFByZXBlbmRFcnJvcigiZXJyb3IgcmVhZGluZyBzZXQgYmVnaW46ICIsIGVycikKIAl9Ci0JdFNldCA6PSBtYWtlKG1hcFtzdHJpbmddYm9vbCwgc2l6ZSkKKwl0U2V0IDo9IG1ha2UobWFwW3N0cmluZ11zdHJ1Y3R7fSwgc2l6ZSkKIAlwLlN0cmluZ1NldCA9IHRTZXQKIAlmb3IgaSA6PSAwOyBpIDwgc2l6ZTsgaSsrIHsKIAkJdmFyIF9lbGVtMyBzdHJpbmcKQEAgLTM3NSw3ICszNzUsNyBAQAogCQl9IGVsc2UgewogCQkJX2VsZW0zID0gdgogCQl9Ci0JCXAuU3RyaW5nU2V0W19lbGVtM10gPSB0cnVlCisJCXAuU3RyaW5nU2V0W19lbGVtM10gPSBzdHJ1Y3R7fXt9CiAJfQogCWlmIGVyciA6PSBpcHJvdC5SZWFkU2V0RW5kKCk7IGVyciAhPSBuaWwgewogCQlyZXR1cm4gUHJlcGVuZEVycm9yKCJlcnJvciByZWFkaW5nIHNldCBlbmQ6ICIsIGVycikKQEAgLTU5OCw3ICs1OTgsNyBAQAogCWlmIGVyciA6PSBvcHJvdC5Xcml0ZVNldEJlZ2luKFNUUklORywgbGVuKHAuU3RyaW5nU2V0KSk7IGVyciAhPSBuaWwgewogCQlyZXR1cm4gUHJlcGVuZEVycm9yKCJlcnJvciB3cml0aW5nIHNldCBiZWdpbjogIiwgZXJyKQogCX0KLQlmb3IgdiwgXyA6PSByYW5nZSBwLlN0cmluZ1NldCB7CisJZm9yIHYgOj0gcmFuZ2UgcC5TdHJpbmdTZXQgewogCQlpZiBlcnIgOj0gb3Byb3QuV3JpdGVTdHJpbmcoc3RyaW5nKHYpKTsgZXJyICE9IG5pbCB7CiAJCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVC4gKDApIGZpZWxkIHdyaXRlIGVycm9yOiAiLCBwKSwgZXJyKQogCQl9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3NlcnZlcl9zb2NrZXQuZ28gYi9saWIvZ28vdGhyaWZ0L3NlcnZlcl9zb2NrZXQuZ28KaW5kZXggMjU4MTA1Ni4uN2RkMjRhZSAxMDA2NDQKLS0tIGEvbGliL2dvL3RocmlmdC9zZXJ2ZXJfc29ja2V0LmdvCisrKyBiL2xpYi9nby90aHJpZnQvc2VydmVyX3NvY2tldC5nbwpAQCAtNDcsNyArNDcsMTQgQEAKIAlyZXR1cm4gJlRTZXJ2ZXJTb2NrZXR7YWRkcjogYWRkciwgY2xpZW50VGltZW91dDogY2xpZW50VGltZW91dH0sIG5pbAogfQogCisvLyBDcmVhdGVzIGEgVFNlcnZlclNvY2tldCBmcm9tIGEgbmV0LkFkZHIKK2Z1bmMgTmV3VFNlcnZlclNvY2tldEZyb21BZGRyVGltZW91dChhZGRyIG5ldC5BZGRyLCBjbGllbnRUaW1lb3V0IHRpbWUuRHVyYXRpb24pICpUU2VydmVyU29ja2V0IHsKKwlyZXR1cm4gJlRTZXJ2ZXJTb2NrZXR7YWRkcjogYWRkciwgY2xpZW50VGltZW91dDogY2xpZW50VGltZW91dH0KK30KKwogZnVuYyAocCAqVFNlcnZlclNvY2tldCkgTGlzdGVuKCkgZXJyb3IgeworCXAubXUuTG9jaygpCisJZGVmZXIgcC5tdS5VbmxvY2soKQogCWlmIHAuSXNMaXN0ZW5pbmcoKSB7CiAJCXJldHVybiBuaWwKIAl9CkBAIC02NywxMCArNzQsMTUgQEAKIAlpZiBpbnRlcnJ1cHRlZCB7CiAJCXJldHVybiBuaWwsIGVyclRyYW5zcG9ydEludGVycnVwdGVkCiAJfQotCWlmIHAubGlzdGVuZXIgPT0gbmlsIHsKKworCXAubXUuTG9jaygpCisJbGlzdGVuZXIgOj0gcC5saXN0ZW5lcgorCXAubXUuVW5sb2NrKCkKKwlpZiBsaXN0ZW5lciA9PSBuaWwgewogCQlyZXR1cm4gbmlsLCBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKE5PVF9PUEVOLCAiTm8gdW5kZXJseWluZyBzZXJ2ZXIgc29ja2V0IikKIAl9Ci0JY29ubiwgZXJyIDo9IHAubGlzdGVuZXIuQWNjZXB0KCkKKworCWNvbm4sIGVyciA6PSBsaXN0ZW5lci5BY2NlcHQoKQogCWlmIGVyciAhPSBuaWwgewogCQlyZXR1cm4gbmlsLCBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbUVycm9yKGVycikKIAl9CkBAIC04NCw2ICs5Niw4IEBACiAKIC8vIENvbm5lY3RzIHRoZSBzb2NrZXQsIGNyZWF0aW5nIGEgbmV3IHNvY2tldCBvYmplY3QgaWYgbmVjZXNzYXJ5LgogZnVuYyAocCAqVFNlcnZlclNvY2tldCkgT3BlbigpIGVycm9yIHsKKwlwLm11LkxvY2soKQorCWRlZmVyIHAubXUuVW5sb2NrKCkKIAlpZiBwLklzTGlzdGVuaW5nKCkgewogCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihBTFJFQURZX09QRU4sICJTZXJ2ZXIgc29ja2V0IGFscmVhZHkgb3BlbiIpCiAJfQpAQCAtMTAzLDE5ICsxMTcsMjEgQEAKIH0KIAogZnVuYyAocCAqVFNlcnZlclNvY2tldCkgQ2xvc2UoKSBlcnJvciB7Ci0JZGVmZXIgZnVuYygpIHsKLQkJcC5saXN0ZW5lciA9IG5pbAotCX0oKQorCXZhciBlcnIgZXJyb3IKKwlwLm11LkxvY2soKQogCWlmIHAuSXNMaXN0ZW5pbmcoKSB7Ci0JCXJldHVybiBwLmxpc3RlbmVyLkNsb3NlKCkKKwkJZXJyID0gcC5saXN0ZW5lci5DbG9zZSgpCisJCXAubGlzdGVuZXIgPSBuaWwKIAl9Ci0JcmV0dXJuIG5pbAorCXAubXUuVW5sb2NrKCkKKwlyZXR1cm4gZXJyCiB9CiAKIGZ1bmMgKHAgKlRTZXJ2ZXJTb2NrZXQpIEludGVycnVwdCgpIGVycm9yIHsKIAlwLm11LkxvY2soKQogCXAuaW50ZXJydXB0ZWQgPSB0cnVlCiAJcC5tdS5VbmxvY2soKQorCXAuQ2xvc2UoKQogCiAJcmV0dXJuIG5pbAogfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9zZXJ2ZXJfc29ja2V0X3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L3NlcnZlcl9zb2NrZXRfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWUxOTgzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9zZXJ2ZXJfc29ja2V0X3Rlc3QuZ28KQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJmbXQiCisJInRlc3RpbmciCispCisKK2Z1bmMgVGVzdFNvY2tldElzbnRMaXN0ZW5pbmdBZnRlckludGVycnVwdCh0ICp0ZXN0aW5nLlQpIHsKKwlob3N0IDo9ICIxMjcuMC4wLjEiCisJcG9ydCA6PSA5MDkwCisJYWRkciA6PSBmbXQuU3ByaW50ZigiJXM6JWQiLCBob3N0LCBwb3J0KQorCisJc29ja2V0IDo9IENyZWF0ZVNlcnZlclNvY2tldCh0LCBhZGRyKQorCXNvY2tldC5MaXN0ZW4oKQorCXNvY2tldC5JbnRlcnJ1cHQoKQorCisJbmV3U29ja2V0IDo9IENyZWF0ZVNlcnZlclNvY2tldCh0LCBhZGRyKQorCWVyciA6PSBuZXdTb2NrZXQuTGlzdGVuKCkKKwlkZWZlciBuZXdTb2NrZXQuSW50ZXJydXB0KCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIkZhaWxlZCB0byByZWJpbmRzOiAlcyIsIGVycikKKwl9Cit9CisKK2Z1bmMgVGVzdFNvY2tldENvbmN1cnJlbmN5KHQgKnRlc3RpbmcuVCkgeworCWhvc3QgOj0gIjEyNy4wLjAuMSIKKwlwb3J0IDo9IDkwOTAKKwlhZGRyIDo9IGZtdC5TcHJpbnRmKCIlczolZCIsIGhvc3QsIHBvcnQpCisKKwlzb2NrZXQgOj0gQ3JlYXRlU2VydmVyU29ja2V0KHQsIGFkZHIpCisJZ28gZnVuYygpIHsgc29ja2V0Lkxpc3RlbigpIH0oKQorCWdvIGZ1bmMoKSB7IHNvY2tldC5JbnRlcnJ1cHQoKSB9KCkKK30KKworZnVuYyBDcmVhdGVTZXJ2ZXJTb2NrZXQodCAqdGVzdGluZy5ULCBhZGRyIHN0cmluZykgKlRTZXJ2ZXJTb2NrZXQgeworCXNvY2tldCwgZXJyIDo9IE5ld1RTZXJ2ZXJTb2NrZXQoYWRkcikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIkZhaWxlZCB0byBjcmVhdGUgc2VydmVyIHNvY2tldDogJXMiLCBlcnIpCisJfQorCXJldHVybiBzb2NrZXQKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvc2ltcGxlX2pzb25fcHJvdG9jb2wuZ28gYi9saWIvZ28vdGhyaWZ0L3NpbXBsZV9qc29uX3Byb3RvY29sLmdvCmluZGV4IGQzMGUyYmMuLjJlOGE3MTEgMTAwNjQ0Ci0tLSBhL2xpYi9nby90aHJpZnQvc2ltcGxlX2pzb25fcHJvdG9jb2wuZ28KKysrIGIvbGliL2dvL3RocmlmdC9zaW1wbGVfanNvbl9wcm90b2NvbC5nbwpAQCAtMjIsNiArMjIsNyBAQAogaW1wb3J0ICgKIAkiYnVmaW8iCiAJImJ5dGVzIgorCSJjb250ZXh0IgogCSJlbmNvZGluZy9iYXNlNjQiCiAJImVuY29kaW5nL2pzb24iCiAJImZtdCIKQEAgLTE1Niw2ICsxNTcsNyBAQAogfQogCiBmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBXcml0ZU1lc3NhZ2VCZWdpbihuYW1lIHN0cmluZywgdHlwZUlkIFRNZXNzYWdlVHlwZSwgc2VxSWQgaW50MzIpIGVycm9yIHsKKwlwLnJlc2V0Q29udGV4dFN0YWNrKCkgLy8gVEhSSUZULTM3MzUKIAlpZiBlIDo9IHAuT3V0cHV0TGlzdEJlZ2luKCk7IGUgIT0gbmlsIHsKIAkJcmV0dXJuIGUKIAl9CkBAIC0yNjksMTcgKzI3MSwxOCBAQAogCWlmIGUgOj0gcC5PdXRwdXRQcmVWYWx1ZSgpOyBlICE9IG5pbCB7CiAJCXJldHVybiBlCiAJfQotCWlmIF8sIGUgOj0gcC53cml0ZXIuV3JpdGUoSlNPTl9RVU9URV9CWVRFUyk7IGUgIT0gbmlsIHsKKwlpZiBfLCBlIDo9IHAud3JpdGUoSlNPTl9RVU9URV9CWVRFUyk7IGUgIT0gbmlsIHsKIAkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQogCX0KIAl3cml0ZXIgOj0gYmFzZTY0Lk5ld0VuY29kZXIoYmFzZTY0LlN0ZEVuY29kaW5nLCBwLndyaXRlcikKIAlpZiBfLCBlIDo9IHdyaXRlci5Xcml0ZSh2KTsgZSAhPSBuaWwgeworCQlwLndyaXRlci5SZXNldChwLnRyYW5zKSAvLyBUSFJJRlQtMzczNQogCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCiAJfQogCWlmIGUgOj0gd3JpdGVyLkNsb3NlKCk7IGUgIT0gbmlsIHsKIAkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQogCX0KLQlpZiBfLCBlIDo9IHAud3JpdGVyLldyaXRlKEpTT05fUVVPVEVfQllURVMpOyBlICE9IG5pbCB7CisJaWYgXywgZSA6PSBwLndyaXRlKEpTT05fUVVPVEVfQllURVMpOyBlICE9IG5pbCB7CiAJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKIAl9CiAJcmV0dXJuIHAuT3V0cHV0UG9zdFZhbHVlKCkKQEAgLTI4Nyw2ICsyOTAsNyBAQAogCiAvLyBSZWFkaW5nIG1ldGhvZHMuCiBmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBSZWFkTWVzc2FnZUJlZ2luKCkgKG5hbWUgc3RyaW5nLCB0eXBlSWQgVE1lc3NhZ2VUeXBlLCBzZXFJZCBpbnQzMiwgZXJyIGVycm9yKSB7CisJcC5yZXNldENvbnRleHRTdGFjaygpIC8vIFRIUklGVC0zNzM1CiAJaWYgaXNOdWxsLCBlcnIgOj0gcC5QYXJzZUxpc3RCZWdpbigpOyBpc051bGwgfHwgZXJyICE9IG5pbCB7CiAJCXJldHVybiBuYW1lLCB0eXBlSWQsIHNlcUlkLCBlcnIKIAl9CkBAIC01MDEsNyArNTA1LDcgQEAKIAkJaWYgZXJyICE9IG5pbCB7CiAJCQlyZXR1cm4gdiwgZXJyCiAJCX0KLQl9IGVsc2UgaWYgbGVuKGYpID49IDAgJiYgZlswXSA9PSBKU09OX05VTExbMF0geworCX0gZWxzZSBpZiBsZW4oZikgPiAwICYmIGZbMF0gPT0gSlNPTl9OVUxMWzBdIHsKIAkJYiA6PSBtYWtlKFtdYnl0ZSwgbGVuKEpTT05fTlVMTCkpCiAJCV8sIGVyciA6PSBwLnJlYWRlci5SZWFkKGIpCiAJCWlmIGVyciAhPSBuaWwgewpAQCAtNTMxLDcgKzUzNSw3IEBACiAJCWlmIGVyciAhPSBuaWwgewogCQkJcmV0dXJuIHYsIGVycgogCQl9Ci0JfSBlbHNlIGlmIGxlbihmKSA+PSAwICYmIGZbMF0gPT0gSlNPTl9OVUxMWzBdIHsKKwl9IGVsc2UgaWYgbGVuKGYpID4gMCAmJiBmWzBdID09IEpTT05fTlVMTFswXSB7CiAJCWIgOj0gbWFrZShbXWJ5dGUsIGxlbihKU09OX05VTEwpKQogCQlfLCBlcnIgOj0gcC5yZWFkZXIuUmVhZChiKQogCQlpZiBlcnIgIT0gbmlsIHsKQEAgLTU0OSw3ICs1NTMsNyBAQAogCXJldHVybiB2LCBwLlBhcnNlUG9zdFZhbHVlKCkKIH0KIAotZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgRmx1c2goKSAoZXJyIGVycm9yKSB7CitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBGbHVzaChjdHggY29udGV4dC5Db250ZXh0KSAoZXJyIGVycm9yKSB7CiAJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihwLndyaXRlci5GbHVzaCgpKQogfQogCkBAIC01NjUsMTIgKzU2OSwxMiBAQAogCWN4dCA6PSBfUGFyc2VDb250ZXh0KHAuZHVtcENvbnRleHRbbGVuKHAuZHVtcENvbnRleHQpLTFdKQogCXN3aXRjaCBjeHQgewogCWNhc2UgX0NPTlRFWFRfSU5fTElTVCwgX0NPTlRFWFRfSU5fT0JKRUNUX05FWFRfS0VZOgotCQlpZiBfLCBlIDo9IHAud3JpdGVyLldyaXRlKEpTT05fQ09NTUEpOyBlICE9IG5pbCB7CisJCWlmIF8sIGUgOj0gcC53cml0ZShKU09OX0NPTU1BKTsgZSAhPSBuaWwgewogCQkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQogCQl9CiAJCWJyZWFrCiAJY2FzZSBfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9WQUxVRToKLQkJaWYgXywgZSA6PSBwLndyaXRlci5Xcml0ZShKU09OX0NPTE9OKTsgZSAhPSBuaWwgeworCQlpZiBfLCBlIDo9IHAud3JpdGUoSlNPTl9DT0xPTik7IGUgIT0gbmlsIHsKIAkJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKIAkJfQogCQlicmVhawpAQCAtNjI2LDcgKzYzMCw3IEBACiAJaWYgZSA6PSBwLk91dHB1dFByZVZhbHVlKCk7IGUgIT0gbmlsIHsKIAkJcmV0dXJuIGUKIAl9Ci0JaWYgXywgZSA6PSBwLndyaXRlci5Xcml0ZShKU09OX05VTEwpOyBlICE9IG5pbCB7CisJaWYgXywgZSA6PSBwLndyaXRlKEpTT05fTlVMTCk7IGUgIT0gbmlsIHsKIAkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQogCX0KIAlyZXR1cm4gcC5PdXRwdXRQb3N0VmFsdWUoKQpAQCAtNjg0LDcgKzY4OCw3IEBACiB9CiAKIGZ1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIE91dHB1dFN0cmluZ0RhdGEocyBzdHJpbmcpIGVycm9yIHsKLQlfLCBlIDo9IHAud3JpdGVyLldyaXRlKFtdYnl0ZShzKSkKKwlfLCBlIDo9IHAud3JpdGUoW11ieXRlKHMpKQogCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKIH0KIApAQCAtNjkyLDcgKzY5Niw3IEBACiAJaWYgZSA6PSBwLk91dHB1dFByZVZhbHVlKCk7IGUgIT0gbmlsIHsKIAkJcmV0dXJuIGUKIAl9Ci0JaWYgXywgZSA6PSBwLndyaXRlci5Xcml0ZShKU09OX0xCUkFDRSk7IGUgIT0gbmlsIHsKKwlpZiBfLCBlIDo9IHAud3JpdGUoSlNPTl9MQlJBQ0UpOyBlICE9IG5pbCB7CiAJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKIAl9CiAJcC5kdW1wQ29udGV4dCA9IGFwcGVuZChwLmR1bXBDb250ZXh0LCBpbnQoX0NPTlRFWFRfSU5fT0JKRUNUX0ZJUlNUKSkKQEAgLTcwMCw3ICs3MDQsNyBAQAogfQogCiBmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBPdXRwdXRPYmplY3RFbmQoKSBlcnJvciB7Ci0JaWYgXywgZSA6PSBwLndyaXRlci5Xcml0ZShKU09OX1JCUkFDRSk7IGUgIT0gbmlsIHsKKwlpZiBfLCBlIDo9IHAud3JpdGUoSlNPTl9SQlJBQ0UpOyBlICE9IG5pbCB7CiAJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKIAl9CiAJcC5kdW1wQ29udGV4dCA9IHAuZHVtcENvbnRleHRbOmxlbihwLmR1bXBDb250ZXh0KS0xXQpAQCAtNzE0LDcgKzcxOCw3IEBACiAJaWYgZSA6PSBwLk91dHB1dFByZVZhbHVlKCk7IGUgIT0gbmlsIHsKIAkJcmV0dXJuIGUKIAl9Ci0JaWYgXywgZSA6PSBwLndyaXRlci5Xcml0ZShKU09OX0xCUkFDS0VUKTsgZSAhPSBuaWwgeworCWlmIF8sIGUgOj0gcC53cml0ZShKU09OX0xCUkFDS0VUKTsgZSAhPSBuaWwgewogCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCiAJfQogCXAuZHVtcENvbnRleHQgPSBhcHBlbmQocC5kdW1wQ29udGV4dCwgaW50KF9DT05URVhUX0lOX0xJU1RfRklSU1QpKQpAQCAtNzIyLDcgKzcyNiw3IEBACiB9CiAKIGZ1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIE91dHB1dExpc3RFbmQoKSBlcnJvciB7Ci0JaWYgXywgZSA6PSBwLndyaXRlci5Xcml0ZShKU09OX1JCUkFDS0VUKTsgZSAhPSBuaWwgeworCWlmIF8sIGUgOj0gcC53cml0ZShKU09OX1JCUkFDS0VUKTsgZSAhPSBuaWwgewogCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCiAJfQogCXAuZHVtcENvbnRleHQgPSBwLmR1bXBDb250ZXh0WzpsZW4ocC5kdW1wQ29udGV4dCktMV0KQEAgLTEwNjEsNyArMTA2NSw3IEBACiAJZm9yIF8sIGNoYXIgOj0gcmFuZ2UgbGluZSB7CiAJCXN3aXRjaCBjaGFyIHsKIAkJZGVmYXVsdDoKLQkJCWUgOj0gZm10LkVycm9yZigiRXhwZWN0aW5nIGVuZCBvZiBsaXN0IFwiXVwiLCBidXQgZm91bmQ6IFwiIiwgbGluZSwgIlwiIikKKwkJCWUgOj0gZm10LkVycm9yZigiRXhwZWN0aW5nIGVuZCBvZiBsaXN0IFwiXVwiLCBidXQgZm91bmQ6IFwiJXZcIiIsIGxpbmUpCiAJCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQogCQljYXNlICcgJywgJ1xuJywgJ1xyJywgJ1x0JywgcnVuZShKU09OX1JCUkFDS0VUWzBdKToKIAkJCWJyZWFrCkBAIC0xMzE4LDMgKzEzMjIsMTcgQEAKIAl9CiAJcmV0dXJuIHRydWUKIH0KKworLy8gUmVzZXQgdGhlIGNvbnRleHQgc3RhY2sgdG8gaXRzIGluaXRpYWwgc3RhdGUuCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSByZXNldENvbnRleHRTdGFjaygpIHsKKwlwLnBhcnNlQ29udGV4dFN0YWNrID0gW11pbnR7aW50KF9DT05URVhUX0lOX1RPUExFVkVMKX0KKwlwLmR1bXBDb250ZXh0ID0gW11pbnR7aW50KF9DT05URVhUX0lOX1RPUExFVkVMKX0KK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgd3JpdGUoYiBbXWJ5dGUpIChpbnQsIGVycm9yKSB7CisJbiwgZXJyIDo9IHAud3JpdGVyLldyaXRlKGIpCisJaWYgZXJyICE9IG5pbCB7CisJCXAud3JpdGVyLlJlc2V0KHAudHJhbnMpIC8vIFRIUklGVC0zNzM1CisJfQorCXJldHVybiBuLCBlcnIKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvc2ltcGxlX2pzb25fcHJvdG9jb2xfdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvc2ltcGxlX2pzb25fcHJvdG9jb2xfdGVzdC5nbwppbmRleCA4ZjBkY2M5Li43Yjk4MDgyIDEwMDY0NAotLS0gYS9saWIvZ28vdGhyaWZ0L3NpbXBsZV9qc29uX3Byb3RvY29sX3Rlc3QuZ28KKysrIGIvbGliL2dvL3RocmlmdC9zaW1wbGVfanNvbl9wcm90b2NvbF90ZXN0LmdvCkBAIC0yMCw2ICsyMCw3IEBACiBwYWNrYWdlIHRocmlmdAogCiBpbXBvcnQgKAorCSJjb250ZXh0IgogCSJlbmNvZGluZy9iYXNlNjQiCiAJImVuY29kaW5nL2pzb24iCiAJImZtdCIKQEAgLTM3LDcgKzM4LDcgQEAKIAkJaWYgZSA6PSBwLldyaXRlQm9vbCh2YWx1ZSk7IGUgIT0gbmlsIHsKIAkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCiAJCX0KLQkJaWYgZSA6PSBwLkZsdXNoKCk7IGUgIT0gbmlsIHsKKwkJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgewogCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKIAkJfQogCQlzIDo9IHRyYW5zLlN0cmluZygpCkBAIC02Myw3ICs2NCw3IEBACiAJCX0gZWxzZSB7CiAJCQl0cmFucy5Xcml0ZShKU09OX0ZBTFNFKQogCQl9Ci0JCXRyYW5zLkZsdXNoKCkKKwkJdHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCiAJCXMgOj0gdHJhbnMuU3RyaW5nKCkKIAkJdiwgZSA6PSBwLlJlYWRCb29sKCkKIAkJaWYgZSAhPSBuaWwgewpAQCAtODgsNyArODksNyBAQAogCQlpZiBlIDo9IHAuV3JpdGVCeXRlKHZhbHVlKTsgZSAhPSBuaWwgewogCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKIAkJfQotCQlpZiBlIDo9IHAuRmx1c2goKTsgZSAhPSBuaWwgeworCQlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CiAJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQogCQl9CiAJCXMgOj0gdHJhbnMuU3RyaW5nKCkKQEAgLTExMCw3ICsxMTEsNyBAQAogCQl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKIAkJcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQogCQl0cmFucy5Xcml0ZVN0cmluZyhzdHJjb252Lkl0b2EoaW50KHZhbHVlKSkpCi0JCXRyYW5zLkZsdXNoKCkKKwkJdHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCiAJCXMgOj0gdHJhbnMuU3RyaW5nKCkKIAkJdiwgZSA6PSBwLlJlYWRCeXRlKCkKIAkJaWYgZSAhPSBuaWwgewpAQCAtMTM1LDcgKzEzNiw3IEBACiAJCWlmIGUgOj0gcC5Xcml0ZUkxNih2YWx1ZSk7IGUgIT0gbmlsIHsKIAkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCiAJCX0KLQkJaWYgZSA6PSBwLkZsdXNoKCk7IGUgIT0gbmlsIHsKKwkJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgewogCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKIAkJfQogCQlzIDo9IHRyYW5zLlN0cmluZygpCkBAIC0xNTcsNyArMTU4LDcgQEAKIAkJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCiAJCXAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKIAkJdHJhbnMuV3JpdGVTdHJpbmcoc3RyY29udi5JdG9hKGludCh2YWx1ZSkpKQotCQl0cmFucy5GbHVzaCgpCisJCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQogCQlzIDo9IHRyYW5zLlN0cmluZygpCiAJCXYsIGUgOj0gcC5SZWFkSTE2KCkKIAkJaWYgZSAhPSBuaWwgewpAQCAtMTgyLDcgKzE4Myw3IEBACiAJCWlmIGUgOj0gcC5Xcml0ZUkzMih2YWx1ZSk7IGUgIT0gbmlsIHsKIAkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCiAJCX0KLQkJaWYgZSA6PSBwLkZsdXNoKCk7IGUgIT0gbmlsIHsKKwkJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgewogCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKIAkJfQogCQlzIDo9IHRyYW5zLlN0cmluZygpCkBAIC0yMDQsNyArMjA1LDcgQEAKIAkJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCiAJCXAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKIAkJdHJhbnMuV3JpdGVTdHJpbmcoc3RyY29udi5JdG9hKGludCh2YWx1ZSkpKQotCQl0cmFucy5GbHVzaCgpCisJCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQogCQlzIDo9IHRyYW5zLlN0cmluZygpCiAJCXYsIGUgOj0gcC5SZWFkSTMyKCkKIAkJaWYgZSAhPSBuaWwgewpAQCAtMjI4LDcgKzIyOSw3IEBACiAJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCiAJcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQogCXRyYW5zLldyaXRlU3RyaW5nKHZhbHVlKQotCXRyYW5zLkZsdXNoKCkKKwl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKIAlzIDo9IHRyYW5zLlN0cmluZygpCiAJdiwgZSA6PSBwLlJlYWRJMzIoKQogCkBAIC0yNTAsNyArMjUxLDcgQEAKIAkJaWYgZSA6PSBwLldyaXRlSTY0KHZhbHVlKTsgZSAhPSBuaWwgewogCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKIAkJfQotCQlpZiBlIDo9IHAuRmx1c2goKTsgZSAhPSBuaWwgeworCQlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CiAJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQogCQl9CiAJCXMgOj0gdHJhbnMuU3RyaW5nKCkKQEAgLTI3Miw3ICsyNzMsNyBAQAogCQl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKIAkJcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQogCQl0cmFucy5Xcml0ZVN0cmluZyhzdHJjb252LkZvcm1hdEludCh2YWx1ZSwgMTApKQotCQl0cmFucy5GbHVzaCgpCisJCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQogCQlzIDo9IHRyYW5zLlN0cmluZygpCiAJCXYsIGUgOj0gcC5SZWFkSTY0KCkKIAkJaWYgZSAhPSBuaWwgewpAQCAtMjk2LDcgKzI5Nyw3IEBACiAJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCiAJcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQogCXRyYW5zLldyaXRlU3RyaW5nKHZhbHVlKQotCXRyYW5zLkZsdXNoKCkKKwl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKIAlzIDo9IHRyYW5zLlN0cmluZygpCiAJdiwgZSA6PSBwLlJlYWRJNjQoKQogCkBAIC0zMTgsNyArMzE5LDcgQEAKIAkJaWYgZSA6PSBwLldyaXRlRG91YmxlKHZhbHVlKTsgZSAhPSBuaWwgewogCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKIAkJfQotCQlpZiBlIDo9IHAuRmx1c2goKTsgZSAhPSBuaWwgeworCQlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CiAJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQogCQl9CiAJCXMgOj0gdHJhbnMuU3RyaW5nKCkKQEAgLTM1NSw3ICszNTYsNyBAQAogCQlwIDo9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCiAJCW4gOj0gTmV3TnVtZXJpY0Zyb21Eb3VibGUodmFsdWUpCiAJCXRyYW5zLldyaXRlU3RyaW5nKG4uU3RyaW5nKCkpCi0JCXRyYW5zLkZsdXNoKCkKKwkJdHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCiAJCXMgOj0gdHJhbnMuU3RyaW5nKCkKIAkJdiwgZSA6PSBwLlJlYWREb3VibGUoKQogCQlpZiBlICE9IG5pbCB7CkBAIC0zOTQsNyArMzk1LDcgQEAKIAkJaWYgZSA6PSBwLldyaXRlU3RyaW5nKHZhbHVlKTsgZSAhPSBuaWwgewogCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKIAkJfQotCQlpZiBlIDo9IHAuRmx1c2goKTsgZSAhPSBuaWwgeworCQlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CiAJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQogCQl9CiAJCXMgOj0gdHJhbnMuU3RyaW5nKCkKQEAgLTQxNiw3ICs0MTcsNyBAQAogCQl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKIAkJcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQogCQl0cmFucy5Xcml0ZVN0cmluZyhqc29uUXVvdGUodmFsdWUpKQotCQl0cmFucy5GbHVzaCgpCisJCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQogCQlzIDo9IHRyYW5zLlN0cmluZygpCiAJCXYsIGUgOj0gcC5SZWFkU3RyaW5nKCkKIAkJaWYgZSAhPSBuaWwgewpAQCAtNDQwLDcgKzQ0MSw3IEBACiAJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCiAJcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQogCXRyYW5zLldyaXRlU3RyaW5nKHZhbHVlKQotCXRyYW5zLkZsdXNoKCkKKwl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKIAlzIDo9IHRyYW5zLlN0cmluZygpCiAJdiwgZSA6PSBwLlJlYWRTdHJpbmcoKQogCWlmIGUgIT0gbmlsIHsKQEAgLTQ2NCw3ICs0NjUsNyBAQAogCWlmIGUgOj0gcC5Xcml0ZUJpbmFyeSh2YWx1ZSk7IGUgIT0gbmlsIHsKIAkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKIAl9Ci0JaWYgZSA6PSBwLkZsdXNoKCk7IGUgIT0gbmlsIHsKKwlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CiAJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCiAJfQogCXMgOj0gdHJhbnMuU3RyaW5nKCkKQEAgLTQ4Nyw3ICs0ODgsNyBAQAogCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQogCXAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKIAl0cmFucy5Xcml0ZVN0cmluZyhqc29uUXVvdGUoYjY0U3RyaW5nKSkKLQl0cmFucy5GbHVzaCgpCisJdHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCiAJcyA6PSB0cmFucy5TdHJpbmcoKQogCXYsIGUgOj0gcC5SZWFkQmluYXJ5KCkKIAlpZiBlICE9IG5pbCB7CkBAIC01MTYsNyArNTE3LDcgQEAKIAl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKIAlwIDo9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCiAJdHJhbnMuV3JpdGVTdHJpbmcodmFsdWUpCi0JdHJhbnMuRmx1c2goKQorCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQogCXMgOj0gdHJhbnMuU3RyaW5nKCkKIAliLCBlIDo9IHAuUmVhZEJpbmFyeSgpCiAJdiA6PSBzdHJpbmcoYikKQEAgLTU0Miw3ICs1NDMsNyBAQAogCQl9CiAJfQogCXAuV3JpdGVMaXN0RW5kKCkKLQlpZiBlIDo9IHAuRmx1c2goKTsgZSAhPSBuaWwgeworCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKIAkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgZS5FcnJvcigpKQogCX0KIAlzdHIgOj0gdHJhbnMuU3RyaW5nKCkKQEAgLTU5Niw3ICs1OTcsNyBAQAogCQl9CiAJfQogCXAuV3JpdGVTZXRFbmQoKQotCWlmIGUgOj0gcC5GbHVzaCgpOyBlICE9IG5pbCB7CisJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgewogCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCBlLkVycm9yKCkpCiAJfQogCXN0ciA6PSB0cmFucy5TdHJpbmcoKQpAQCAtNjUzLDEyICs2NTQsMTIgQEAKIAkJfQogCX0KIAlwLldyaXRlTWFwRW5kKCkKLQlpZiBlIDo9IHAuRmx1c2goKTsgZSAhPSBuaWwgeworCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKIAkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgZS5FcnJvcigpKQogCX0KIAlzdHIgOj0gdHJhbnMuU3RyaW5nKCkKIAlpZiBzdHJbMF0gIT0gJ1snIHx8IHN0cltsZW4oc3RyKS0xXSAhPSAnXScgewotCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcywgd3JvdGU6ICVxLCBpbiBnbzogJXEiLCB0aGV0eXBlLCBzdHIsIERPVUJMRV9WQUxVRVMpCisJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzLCB3cm90ZTogJXYsIGluIGdvOiAldiIsIHRoZXR5cGUsIHN0ciwgRE9VQkxFX1ZBTFVFUykKIAl9CiAJbCA6PSBzdHJpbmdzLlNwbGl0KHN0clsxOmxlbihzdHIpLTFdLCAiLCIpCiAJaWYgbGVuKGwpIDwgMyB7CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3NpbXBsZV9zZXJ2ZXIuZ28gYi9saWIvZ28vdGhyaWZ0L3NpbXBsZV9zZXJ2ZXIuZ28KaW5kZXggYTU0ZDgwNC4uNjAzNTgwMiAxMDA2NDQKLS0tIGEvbGliL2dvL3RocmlmdC9zaW1wbGVfc2VydmVyLmdvCisrKyBiL2xpYi9nby90aHJpZnQvc2ltcGxlX3NlcnZlci5nbwpAQCAtMjIsMTEgKzIyLDE5IEBACiBpbXBvcnQgKAogCSJsb2ciCiAJInJ1bnRpbWUvZGVidWciCisJInN5bmMiCisJInN5bmMvYXRvbWljIgogKQogCi0vLyBTaW1wbGUsIG5vbi1jb25jdXJyZW50IHNlcnZlciBmb3IgdGVzdGluZy4KKy8qCisgKiBUaGlzIGlzIG5vdCBhIHR5cGljYWwgVFNpbXBsZVNlcnZlciBhcyBpdCBpcyBub3QgYmxvY2tlZCBhZnRlciBhY2NlcHQgYSBzb2NrZXQuCisgKiBJdCBpcyBtb3JlIGxpa2UgYSBUVGhyZWFkZWRTZXJ2ZXIgdGhhdCBjYW4gaGFuZGxlIGRpZmZlcmVudCBjb25uZWN0aW9ucyBpbiBkaWZmZXJlbnQgZ29yb3V0aW5lcy4KKyAqIFRoaXMgd2lsbCB3b3JrIGlmIGdvbGFuZyB1c2VyIGltcGxlbWVudHMgYSBjb25uLXBvb2wgbGlrZSB0aGluZyBpbiBjbGllbnQgc2lkZS4KKyAqLwogdHlwZSBUU2ltcGxlU2VydmVyIHN0cnVjdCB7Ci0JcXVpdCBjaGFuIHN0cnVjdHt9CisJY2xvc2VkIGludDMyCisJd2cgICAgIHN5bmMuV2FpdEdyb3VwCisJbXUgICAgIHN5bmMuTXV0ZXgKIAogCXByb2Nlc3NvckZhY3RvcnkgICAgICAgVFByb2Nlc3NvckZhY3RvcnkKIAlzZXJ2ZXJUcmFuc3BvcnQgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQKQEAgLTg2LDcgKzk0LDYgQEAKIAkJb3V0cHV0VHJhbnNwb3J0RmFjdG9yeTogb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKIAkJaW5wdXRQcm90b2NvbEZhY3Rvcnk6ICAgaW5wdXRQcm90b2NvbEZhY3RvcnksCiAJCW91dHB1dFByb3RvY29sRmFjdG9yeTogIG91dHB1dFByb3RvY29sRmFjdG9yeSwKLQkJcXVpdDogbWFrZShjaGFuIHN0cnVjdHt9LCAxKSwKIAl9CiB9CiAKQEAgLTExOCwyMyArMTI1LDM3IEBACiAJcmV0dXJuIHAuc2VydmVyVHJhbnNwb3J0Lkxpc3RlbigpCiB9CiAKK2Z1bmMgKHAgKlRTaW1wbGVTZXJ2ZXIpIGlubmVyQWNjZXB0KCkgKGludDMyLCBlcnJvcikgeworCWNsaWVudCwgZXJyIDo9IHAuc2VydmVyVHJhbnNwb3J0LkFjY2VwdCgpCisJcC5tdS5Mb2NrKCkKKwlkZWZlciBwLm11LlVubG9jaygpCisJY2xvc2VkIDo9IGF0b21pYy5Mb2FkSW50MzIoJnAuY2xvc2VkKQorCWlmIGNsb3NlZCAhPSAwIHsKKwkJcmV0dXJuIGNsb3NlZCwgbmlsCisJfQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gMCwgZXJyCisJfQorCWlmIGNsaWVudCAhPSBuaWwgeworCQlwLndnLkFkZCgxKQorCQlnbyBmdW5jKCkgeworCQkJZGVmZXIgcC53Zy5Eb25lKCkKKwkJCWlmIGVyciA6PSBwLnByb2Nlc3NSZXF1ZXN0cyhjbGllbnQpOyBlcnIgIT0gbmlsIHsKKwkJCQlsb2cuUHJpbnRsbigiZXJyb3IgcHJvY2Vzc2luZyByZXF1ZXN0OiIsIGVycikKKwkJCX0KKwkJfSgpCisJfQorCXJldHVybiAwLCBuaWwKK30KKwogZnVuYyAocCAqVFNpbXBsZVNlcnZlcikgQWNjZXB0TG9vcCgpIGVycm9yIHsKIAlmb3IgewotCQljbGllbnQsIGVyciA6PSBwLnNlcnZlclRyYW5zcG9ydC5BY2NlcHQoKQorCQljbG9zZWQsIGVyciA6PSBwLmlubmVyQWNjZXB0KCkKIAkJaWYgZXJyICE9IG5pbCB7Ci0JCQlzZWxlY3QgewotCQkJY2FzZSA8LXAucXVpdDoKLQkJCQlyZXR1cm4gbmlsCi0JCQlkZWZhdWx0OgotCQkJfQogCQkJcmV0dXJuIGVycgogCQl9Ci0JCWlmIGNsaWVudCAhPSBuaWwgewotCQkJZ28gZnVuYygpIHsKLQkJCQlpZiBlcnIgOj0gcC5wcm9jZXNzUmVxdWVzdHMoY2xpZW50KTsgZXJyICE9IG5pbCB7Ci0JCQkJCWxvZy5QcmludGxuKCJlcnJvciBwcm9jZXNzaW5nIHJlcXVlc3Q6IiwgZXJyKQotCQkJCX0KLQkJCX0oKQorCQlpZiBjbG9zZWQgIT0gMCB7CisJCQlyZXR1cm4gbmlsCiAJCX0KIAl9CiB9CkBAIC0xNDksMTUgKzE3MCwyNyBAQAogfQogCiBmdW5jIChwICpUU2ltcGxlU2VydmVyKSBTdG9wKCkgZXJyb3IgewotCXAucXVpdCA8LSBzdHJ1Y3R7fXt9CisJcC5tdS5Mb2NrKCkKKwlkZWZlciBwLm11LlVubG9jaygpCisJaWYgYXRvbWljLkxvYWRJbnQzMigmcC5jbG9zZWQpICE9IDAgeworCQlyZXR1cm4gbmlsCisJfQorCWF0b21pYy5TdG9yZUludDMyKCZwLmNsb3NlZCwgMSkKIAlwLnNlcnZlclRyYW5zcG9ydC5JbnRlcnJ1cHQoKQorCXAud2cuV2FpdCgpCiAJcmV0dXJuIG5pbAogfQogCiBmdW5jIChwICpUU2ltcGxlU2VydmVyKSBwcm9jZXNzUmVxdWVzdHMoY2xpZW50IFRUcmFuc3BvcnQpIGVycm9yIHsKIAlwcm9jZXNzb3IgOj0gcC5wcm9jZXNzb3JGYWN0b3J5LkdldFByb2Nlc3NvcihjbGllbnQpCi0JaW5wdXRUcmFuc3BvcnQgOj0gcC5pbnB1dFRyYW5zcG9ydEZhY3RvcnkuR2V0VHJhbnNwb3J0KGNsaWVudCkKLQlvdXRwdXRUcmFuc3BvcnQgOj0gcC5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpCisJaW5wdXRUcmFuc3BvcnQsIGVyciA6PSBwLmlucHV0VHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQoY2xpZW50KQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCW91dHB1dFRyYW5zcG9ydCwgZXJyIDo9IHAub3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQoY2xpZW50KQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQogCWlucHV0UHJvdG9jb2wgOj0gcC5pbnB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbChpbnB1dFRyYW5zcG9ydCkKIAlvdXRwdXRQcm90b2NvbCA6PSBwLm91dHB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbChvdXRwdXRUcmFuc3BvcnQpCiAJZGVmZXIgZnVuYygpIHsKQEAgLTE2NSw2ICsxOTgsNyBAQAogCQkJbG9nLlByaW50ZigicGFuaWMgaW4gcHJvY2Vzc29yOiAlczogJXMiLCBlLCBkZWJ1Zy5TdGFjaygpKQogCQl9CiAJfSgpCisKIAlpZiBpbnB1dFRyYW5zcG9ydCAhPSBuaWwgewogCQlkZWZlciBpbnB1dFRyYW5zcG9ydC5DbG9zZSgpCiAJfQpAQCAtMTcyLDEzICsyMDYsMTkgQEAKIAkJZGVmZXIgb3V0cHV0VHJhbnNwb3J0LkNsb3NlKCkKIAl9CiAJZm9yIHsKLQkJb2ssIGVyciA6PSBwcm9jZXNzb3IuUHJvY2VzcyhpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCkKKwkJaWYgYXRvbWljLkxvYWRJbnQzMigmcC5jbG9zZWQpICE9IDAgeworCQkJcmV0dXJuIG5pbAorCQl9CisKKwkJb2ssIGVyciA6PSBwcm9jZXNzb3IuUHJvY2VzcyhkZWZhdWx0Q3R4LCBpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCkKIAkJaWYgZXJyLCBvayA6PSBlcnIuKFRUcmFuc3BvcnRFeGNlcHRpb24pOyBvayAmJiBlcnIuVHlwZUlkKCkgPT0gRU5EX09GX0ZJTEUgewogCQkJcmV0dXJuIG5pbAogCQl9IGVsc2UgaWYgZXJyICE9IG5pbCB7Ci0JCQlsb2cuUHJpbnRmKCJlcnJvciBwcm9jZXNzaW5nIHJlcXVlc3Q6ICVzIiwgZXJyKQogCQkJcmV0dXJuIGVycgogCQl9CisJCWlmIGVyciwgb2sgOj0gZXJyLihUQXBwbGljYXRpb25FeGNlcHRpb24pOyBvayAmJiBlcnIuVHlwZUlkKCkgPT0gVU5LTk9XTl9NRVRIT0QgeworCQkJY29udGludWUKKwkJfQogCQlpZiAhb2sgewogCQkJYnJlYWsKIAkJfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9zaW1wbGVfc2VydmVyX3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L3NpbXBsZV9zZXJ2ZXJfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODE0OWE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9zaW1wbGVfc2VydmVyX3Rlc3QuZ28KQEAgLTAsMCArMSwxNTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkidGVzdGluZyIKKwkiZXJyb3JzIgorCSJydW50aW1lIgorKQorCit0eXBlIG1vY2tTZXJ2ZXJUcmFuc3BvcnQgc3RydWN0IHsKKwlMaXN0ZW5GdW5jICAgIGZ1bmMoKSBlcnJvcgorCUFjY2VwdEZ1bmMgICAgZnVuYygpIChUVHJhbnNwb3J0LCBlcnJvcikKKwlDbG9zZUZ1bmMgICAgIGZ1bmMoKSBlcnJvcgorCUludGVycnVwdEZ1bmMgZnVuYygpIGVycm9yCit9CisKK2Z1bmMgKG0gKm1vY2tTZXJ2ZXJUcmFuc3BvcnQpIExpc3RlbigpIGVycm9yIHsKKwlyZXR1cm4gbS5MaXN0ZW5GdW5jKCkKK30KKworZnVuYyAobSAqbW9ja1NlcnZlclRyYW5zcG9ydCkgQWNjZXB0KCkgKFRUcmFuc3BvcnQsIGVycm9yKSB7CisJcmV0dXJuIG0uQWNjZXB0RnVuYygpCit9CisKK2Z1bmMgKG0gKm1vY2tTZXJ2ZXJUcmFuc3BvcnQpIENsb3NlKCkgZXJyb3IgeworCXJldHVybiBtLkNsb3NlRnVuYygpCit9CisKK2Z1bmMgKG0gKm1vY2tTZXJ2ZXJUcmFuc3BvcnQpIEludGVycnVwdCgpIGVycm9yIHsKKwlyZXR1cm4gbS5JbnRlcnJ1cHRGdW5jKCkKK30KKwordHlwZSBtb2NrVFRyYW5zcG9ydCBzdHJ1Y3QgeworCVRUcmFuc3BvcnQKK30KKworZnVuYyAobSAqbW9ja1RUcmFuc3BvcnQpIENsb3NlKCkgZXJyb3IgeworCXJldHVybiBuaWwKK30KKworZnVuYyBUZXN0TXVsdGlwbGVTdG9wKHQgKnRlc3RpbmcuVCkgeworCXByb2MgOj0gJm1vY2tQcm9jZXNzb3J7CisJCVByb2Nlc3NGdW5jOiBmdW5jKGluLCBvdXQgVFByb3RvY29sKSAoYm9vbCwgVEV4Y2VwdGlvbikgeworCQkJcmV0dXJuIGZhbHNlLCBuaWwKKwkJfSwKKwl9CisKKwl2YXIgaW50ZXJydXB0Q2FsbGVkIGJvb2wKKwljIDo9IG1ha2UoY2hhbiBzdHJ1Y3R7fSkKKwl0cmFucyA6PSAmbW9ja1NlcnZlclRyYW5zcG9ydHsKKwkJTGlzdGVuRnVuYzogZnVuYygpIGVycm9yIHsKKwkJCXJldHVybiBuaWwKKwkJfSwKKwkJQWNjZXB0RnVuYzogZnVuYygpIChUVHJhbnNwb3J0LCBlcnJvcikgeworCQkJPC1jCisJCQlyZXR1cm4gbmlsLCBuaWwKKwkJfSwKKwkJQ2xvc2VGdW5jOiBmdW5jKCkgZXJyb3IgeworCQkJYyA8LSBzdHJ1Y3R7fXt9CisJCQlyZXR1cm4gbmlsCisJCX0sCisJCUludGVycnVwdEZ1bmM6IGZ1bmMoKSBlcnJvciB7CisJCQlpbnRlcnJ1cHRDYWxsZWQgPSB0cnVlCisJCQlyZXR1cm4gbmlsCisJCX0sCisJfQorCisJc2VydiA6PSBOZXdUU2ltcGxlU2VydmVyMihwcm9jLCB0cmFucykKKwlnbyBzZXJ2LlNlcnZlKCkKKwlzZXJ2LlN0b3AoKQorCWlmICFpbnRlcnJ1cHRDYWxsZWQgeworCQl0LkVycm9yKCJmaXJzdCBzZXJ2ZXIgdHJhbnNwb3J0IHNob3VsZCBoYXZlIGJlZW4gaW50ZXJydXB0ZWQiKQorCX0KKworCXNlcnYgPSBOZXdUU2ltcGxlU2VydmVyMihwcm9jLCB0cmFucykKKwlpbnRlcnJ1cHRDYWxsZWQgPSBmYWxzZQorCWdvIHNlcnYuU2VydmUoKQorCXNlcnYuU3RvcCgpCisJaWYgIWludGVycnVwdENhbGxlZCB7CisJCXQuRXJyb3IoInNlY29uZCBzZXJ2ZXIgdHJhbnNwb3J0IHNob3VsZCBoYXZlIGJlZW4gaW50ZXJydXB0ZWQiKQorCX0KK30KKworZnVuYyBUZXN0V2FpdFJhY2UodCAqdGVzdGluZy5UKSB7CisJcHJvYyA6PSAmbW9ja1Byb2Nlc3NvcnsKKwkJUHJvY2Vzc0Z1bmM6IGZ1bmMoaW4sIG91dCBUUHJvdG9jb2wpIChib29sLCBURXhjZXB0aW9uKSB7CisJCQlyZXR1cm4gZmFsc2UsIG5pbAorCQl9LAorCX0KKworCXRyYW5zIDo9ICZtb2NrU2VydmVyVHJhbnNwb3J0eworCQlMaXN0ZW5GdW5jOiBmdW5jKCkgZXJyb3IgeworCQkJcmV0dXJuIG5pbAorCQl9LAorCQlBY2NlcHRGdW5jOiBmdW5jKCkgKFRUcmFuc3BvcnQsIGVycm9yKSB7CisJCQlyZXR1cm4gJm1vY2tUVHJhbnNwb3J0e30sIG5pbAorCQl9LAorCQlDbG9zZUZ1bmM6IGZ1bmMoKSBlcnJvciB7CisJCQlyZXR1cm4gbmlsCisJCX0sCisJCUludGVycnVwdEZ1bmM6IGZ1bmMoKSBlcnJvciB7CisJCQlyZXR1cm4gbmlsCisJCX0sCisJfQorCisJc2VydiA6PSBOZXdUU2ltcGxlU2VydmVyMihwcm9jLCB0cmFucykKKwlnbyBzZXJ2LlNlcnZlKCkKKwlydW50aW1lLkdvc2NoZWQoKQorCXNlcnYuU3RvcCgpCit9CisKK2Z1bmMgVGVzdE5vSGFuZ0R1cmluZ1N0b3BGcm9tRGFuZ2xpbmdMb2NrQWNxdWlyZUR1cmluZ0FjY2VwdExvb3AodCAqdGVzdGluZy5UKSB7CisJcHJvYyA6PSAmbW9ja1Byb2Nlc3NvcnsKKwkJUHJvY2Vzc0Z1bmM6IGZ1bmMoaW4sIG91dCBUUHJvdG9jb2wpIChib29sLCBURXhjZXB0aW9uKSB7CisJCQlyZXR1cm4gZmFsc2UsIG5pbAorCQl9LAorCX0KKworCXRyYW5zIDo9ICZtb2NrU2VydmVyVHJhbnNwb3J0eworCQlMaXN0ZW5GdW5jOiBmdW5jKCkgZXJyb3IgeworCQkJcmV0dXJuIG5pbAorCQl9LAorCQlBY2NlcHRGdW5jOiBmdW5jKCkgKFRUcmFuc3BvcnQsIGVycm9yKSB7CisJCQlyZXR1cm4gbmlsLCBlcnJvcnMuTmV3KCJubyBzaXIiKQorCQl9LAorCQlDbG9zZUZ1bmM6IGZ1bmMoKSBlcnJvciB7CisJCQlyZXR1cm4gbmlsCisJCX0sCisJCUludGVycnVwdEZ1bmM6IGZ1bmMoKSBlcnJvciB7CisJCQlyZXR1cm4gbmlsCisJCX0sCisJfQorCisJc2VydiA6PSBOZXdUU2ltcGxlU2VydmVyMihwcm9jLCB0cmFucykKKwlnbyBzZXJ2LlNlcnZlKCkKKwlydW50aW1lLkdvc2NoZWQoKQorCXNlcnYuU3RvcCgpCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3NvY2tldC5nbyBiL2xpYi9nby90aHJpZnQvc29ja2V0LmdvCmluZGV4IDgyZTI4YjQuLjg4NTQyNzkgMTAwNjQ0Ci0tLSBhL2xpYi9nby90aHJpZnQvc29ja2V0LmdvCisrKyBiL2xpYi9nby90aHJpZnQvc29ja2V0LmdvCkBAIC0yMCw2ICsyMCw3IEBACiBwYWNrYWdlIHRocmlmdAogCiBpbXBvcnQgKAorCSJjb250ZXh0IgogCSJuZXQiCiAJInRpbWUiCiApCkBAIC0xNDgsNyArMTQ5LDcgQEAKIAlyZXR1cm4gcC5jb25uLldyaXRlKGJ1ZikKIH0KIAotZnVuYyAocCAqVFNvY2tldCkgRmx1c2goKSBlcnJvciB7CitmdW5jIChwICpUU29ja2V0KSBGbHVzaChjdHggY29udGV4dC5Db250ZXh0KSBlcnJvciB7CiAJcmV0dXJuIG5pbAogfQogCkBAIC0xNjEsNiArMTYyLDUgQEAKIAogZnVuYyAocCAqVFNvY2tldCkgUmVtYWluaW5nQnl0ZXMoKSAobnVtX2J5dGVzIHVpbnQ2NCkgewogCWNvbnN0IG1heFNpemUgPSBedWludDY0KDApCi0JcmV0dXJuIG1heFNpemUgIC8vIHRoZSB0aHJ1dGggaXMsIHdlIGp1c3QgZG9uJ3Qga25vdyB1bmxlc3MgZnJhbWVkIGlzIHVzZWQKKwlyZXR1cm4gbWF4U2l6ZSAvLyB0aGUgdGhydXRoIGlzLCB3ZSBqdXN0IGRvbid0IGtub3cgdW5sZXNzIGZyYW1lZCBpcyB1c2VkCiB9Ci0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvc3NsX3NlcnZlcl9zb2NrZXQuZ28gYi9saWIvZ28vdGhyaWZ0L3NzbF9zZXJ2ZXJfc29ja2V0LmdvCmluZGV4IDU4Zjg1OWIuLjkwN2FmY2EgMTAwNjQ0Ci0tLSBhL2xpYi9nby90aHJpZnQvc3NsX3NlcnZlcl9zb2NrZXQuZ28KKysrIGIvbGliL2dvL3RocmlmdC9zc2xfc2VydmVyX3NvY2tldC5nbwpAQCAtMjAsOSArMjAsOSBAQAogcGFja2FnZSB0aHJpZnQKIAogaW1wb3J0ICgKKwkiY3J5cHRvL3RscyIKIAkibmV0IgogCSJ0aW1lIgotCSJjcnlwdG8vdGxzIgogKQogCiB0eXBlIFRTU0xTZXJ2ZXJTb2NrZXQgc3RydWN0IHsKQEAgLTM4LDYgKzM4LDkgQEAKIH0KIAogZnVuYyBOZXdUU1NMU2VydmVyU29ja2V0VGltZW91dChsaXN0ZW5BZGRyIHN0cmluZywgY2ZnICp0bHMuQ29uZmlnLCBjbGllbnRUaW1lb3V0IHRpbWUuRHVyYXRpb24pICgqVFNTTFNlcnZlclNvY2tldCwgZXJyb3IpIHsKKwlpZiBjZmcuTWluVmVyc2lvbiA9PSAwIHsKKwkJY2ZnLk1pblZlcnNpb24gPSB0bHMuVmVyc2lvblRMUzEwCisJfQogCWFkZHIsIGVyciA6PSBuZXQuUmVzb2x2ZVRDUEFkZHIoInRjcCIsIGxpc3RlbkFkZHIpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXJldHVybiBuaWwsIGVycgpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9zc2xfc29ja2V0LmdvIGIvbGliL2dvL3RocmlmdC9zc2xfc29ja2V0LmdvCmluZGV4IDA0ZDM4NTAuLmJhNjMzNzcgMTAwNjQ0Ci0tLSBhL2xpYi9nby90aHJpZnQvc3NsX3NvY2tldC5nbworKysgYi9saWIvZ28vdGhyaWZ0L3NzbF9zb2NrZXQuZ28KQEAgLTIwLDYgKzIwLDcgQEAKIHBhY2thZ2UgdGhyaWZ0CiAKIGltcG9ydCAoCisJImNvbnRleHQiCiAJImNyeXB0by90bHMiCiAJIm5ldCIKIAkidGltZSIKQEAgLTQ4LDYgKzQ5LDkgQEAKIC8vIE5ld1RTU0xTb2NrZXRUaW1lb3V0IGNyZWF0ZXMgYSBuZXQuQ29ubi1iYWNrZWQgVFRyYW5zcG9ydCwgZ2l2ZW4gYSBob3N0IGFuZCBwb3J0CiAvLyBpdCBhbHNvIGFjY2VwdHMgYSB0bHMgQ29uZmlndXJhdGlvbiBhbmQgYSB0aW1lb3V0IGFzIGEgdGltZS5EdXJhdGlvbgogZnVuYyBOZXdUU1NMU29ja2V0VGltZW91dChob3N0UG9ydCBzdHJpbmcsIGNmZyAqdGxzLkNvbmZpZywgdGltZW91dCB0aW1lLkR1cmF0aW9uKSAoKlRTU0xTb2NrZXQsIGVycm9yKSB7CisJaWYgY2ZnLk1pblZlcnNpb24gPT0gMCB7CisJCWNmZy5NaW5WZXJzaW9uID0gdGxzLlZlcnNpb25UTFMxMAorCX0KIAlyZXR1cm4gJlRTU0xTb2NrZXR7aG9zdFBvcnQ6IGhvc3RQb3J0LCB0aW1lb3V0OiB0aW1lb3V0LCBjZmc6IGNmZ30sIG5pbAogfQogCkBAIC04Nyw3ICs5MSw4IEBACiAJLy8gSWYgd2UgaGF2ZSBhIGhvc3RuYW1lLCB3ZSBuZWVkIHRvIHBhc3MgdGhlIGhvc3RuYW1lIHRvIHRscy5EaWFsIGZvcgogCS8vIGNlcnRpZmljYXRlIGhvc3RuYW1lIGNoZWNrcy4KIAlpZiBwLmhvc3RQb3J0ICE9ICIiIHsKLQkJaWYgcC5jb25uLCBlcnIgPSB0bHMuRGlhbCgidGNwIiwgcC5ob3N0UG9ydCwgcC5jZmcpOyBlcnIgIT0gbmlsIHsKKwkJaWYgcC5jb25uLCBlcnIgPSB0bHMuRGlhbFdpdGhEaWFsZXIoJm5ldC5EaWFsZXJ7CisJCQlUaW1lb3V0OiBwLnRpbWVvdXR9LCAidGNwIiwgcC5ob3N0UG9ydCwgcC5jZmcpOyBlcnIgIT0gbmlsIHsKIAkJCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKE5PVF9PUEVOLCBlcnIuRXJyb3IoKSkKIAkJfQogCX0gZWxzZSB7CkBAIC0xMDMsNyArMTA4LDggQEAKIAkJaWYgbGVuKHAuYWRkci5TdHJpbmcoKSkgPT0gMCB7CiAJCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihOT1RfT1BFTiwgIkNhbm5vdCBvcGVuIGJhZCBhZGRyZXNzLiIpCiAJCX0KLQkJaWYgcC5jb25uLCBlcnIgPSB0bHMuRGlhbChwLmFkZHIuTmV0d29yaygpLCBwLmFkZHIuU3RyaW5nKCksIHAuY2ZnKTsgZXJyICE9IG5pbCB7CisJCWlmIHAuY29ubiwgZXJyID0gdGxzLkRpYWxXaXRoRGlhbGVyKCZuZXQuRGlhbGVyeworCQkJVGltZW91dDogcC50aW1lb3V0fSwgcC5hZGRyLk5ldHdvcmsoKSwgcC5hZGRyLlN0cmluZygpLCBwLmNmZyk7IGVyciAhPSBuaWwgewogCQkJcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oTk9UX09QRU4sIGVyci5FcnJvcigpKQogCQl9CiAJfQpAQCAtMTUzLDcgKzE1OSw3IEBACiAJcmV0dXJuIHAuY29ubi5Xcml0ZShidWYpCiB9CiAKLWZ1bmMgKHAgKlRTU0xTb2NrZXQpIEZsdXNoKCkgZXJyb3IgeworZnVuYyAocCAqVFNTTFNvY2tldCkgRmx1c2goY3R4IGNvbnRleHQuQ29udGV4dCkgZXJyb3IgewogCXJldHVybiBuaWwKIH0KIApAQCAtMTY2LDYgKzE3Miw1IEBACiAKIGZ1bmMgKHAgKlRTU0xTb2NrZXQpIFJlbWFpbmluZ0J5dGVzKCkgKG51bV9ieXRlcyB1aW50NjQpIHsKIAljb25zdCBtYXhTaXplID0gXnVpbnQ2NCgwKQotCXJldHVybiBtYXhTaXplICAvLyB0aGUgdGhydXRoIGlzLCB3ZSBqdXN0IGRvbid0IGtub3cgdW5sZXNzIGZyYW1lZCBpcyB1c2VkCisJcmV0dXJuIG1heFNpemUgLy8gdGhlIHRocnV0aCBpcywgd2UganVzdCBkb24ndCBrbm93IHVubGVzcyBmcmFtZWQgaXMgdXNlZAogfQotCmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3RyYW5zcG9ydC5nbyBiL2xpYi9nby90aHJpZnQvdHJhbnNwb3J0LmdvCmluZGV4IDQ1Mzg5OTYuLmJhMjczOGEgMTAwNjQ0Ci0tLSBhL2xpYi9nby90aHJpZnQvdHJhbnNwb3J0LmdvCisrKyBiL2xpYi9nby90aHJpZnQvdHJhbnNwb3J0LmdvCkBAIC0yMCw2ICsyMCw3IEBACiBwYWNrYWdlIHRocmlmdAogCiBpbXBvcnQgKAorCSJjb250ZXh0IgogCSJlcnJvcnMiCiAJImlvIgogKQpAQCAtMzAsMTUgKzMxLDE4IEBACiAJRmx1c2goKSAoZXJyIGVycm9yKQogfQogCit0eXBlIENvbnRleHRGbHVzaGVyIGludGVyZmFjZSB7CisJRmx1c2goY3R4IGNvbnRleHQuQ29udGV4dCkgKGVyciBlcnJvcikKK30KKwogdHlwZSBSZWFkU2l6ZVByb3ZpZGVyIGludGVyZmFjZSB7CiAJUmVtYWluaW5nQnl0ZXMoKSAobnVtX2J5dGVzIHVpbnQ2NCkKIH0KIAotCiAvLyBFbmNhcHN1bGF0ZXMgdGhlIEkvTyBsYXllcgogdHlwZSBUVHJhbnNwb3J0IGludGVyZmFjZSB7CiAJaW8uUmVhZFdyaXRlQ2xvc2VyCi0JRmx1c2hlcgorCUNvbnRleHRGbHVzaGVyCiAJUmVhZFNpemVQcm92aWRlcgogCiAJLy8gT3BlbnMgdGhlIHRyYW5zcG9ydCBmb3IgY29tbXVuaWNhdGlvbgpAQCAtNTIsNyArNTYsNiBAQAogCVdyaXRlU3RyaW5nKHMgc3RyaW5nKSAobiBpbnQsIGVyciBlcnJvcikKIH0KIAotCiAvLyBUaGlzIGlzICJlbmNoYW5jZWQiIHRyYW5zcG9ydCB3aXRoIGV4dHJhIGNhcGFiaWxpdGllcy4gWW91IG5lZWQgdG8gdXNlIG9uZSBvZiB0aGVzZQogLy8gdG8gY29uc3RydWN0IHByb3RvY29sLgogLy8gTm90YWJseSwgVFNvY2tldCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UsIGFuZCBpdCBpcyBhbHdheXMgYSBtaXN0YWtlIHRvIHVzZQpAQCAtNjIsNyArNjUsNiBAQAogCWlvLkJ5dGVSZWFkZXIKIAlpby5CeXRlV3JpdGVyCiAJc3RyaW5nV3JpdGVyCi0JRmx1c2hlcgorCUNvbnRleHRGbHVzaGVyCiAJUmVhZFNpemVQcm92aWRlcgogfQotCmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3RyYW5zcG9ydF9mYWN0b3J5LmdvIGIvbGliL2dvL3RocmlmdC90cmFuc3BvcnRfZmFjdG9yeS5nbwppbmRleCA1MzNkMWI0Li5jODA1ODA3IDEwMDY0NAotLS0gYS9saWIvZ28vdGhyaWZ0L3RyYW5zcG9ydF9mYWN0b3J5LmdvCisrKyBiL2xpYi9nby90aHJpZnQvdHJhbnNwb3J0X2ZhY3RvcnkuZ28KQEAgLTI0LDE0ICsyNCwxNCBAQAogLy8gYSBTZXJ2ZXJUcmFuc3BvcnQgYW5kIHRoZW4gbWF5IHdhbnQgdG8gbXV0YXRlIHRoZW0gKGkuZS4gY3JlYXRlCiAvLyBhIEJ1ZmZlcmVkVHJhbnNwb3J0IGZyb20gdGhlIHVuZGVybHlpbmcgYmFzZSB0cmFuc3BvcnQpCiB0eXBlIFRUcmFuc3BvcnRGYWN0b3J5IGludGVyZmFjZSB7Ci0JR2V0VHJhbnNwb3J0KHRyYW5zIFRUcmFuc3BvcnQpIFRUcmFuc3BvcnQKKwlHZXRUcmFuc3BvcnQodHJhbnMgVFRyYW5zcG9ydCkgKFRUcmFuc3BvcnQsIGVycm9yKQogfQogCiB0eXBlIHRUcmFuc3BvcnRGYWN0b3J5IHN0cnVjdHt9CiAKIC8vIFJldHVybiBhIHdyYXBwZWQgaW5zdGFuY2Ugb2YgdGhlIGJhc2UgVHJhbnNwb3J0LgotZnVuYyAocCAqdFRyYW5zcG9ydEZhY3RvcnkpIEdldFRyYW5zcG9ydCh0cmFucyBUVHJhbnNwb3J0KSBUVHJhbnNwb3J0IHsKLQlyZXR1cm4gdHJhbnMKK2Z1bmMgKHAgKnRUcmFuc3BvcnRGYWN0b3J5KSBHZXRUcmFuc3BvcnQodHJhbnMgVFRyYW5zcG9ydCkgKFRUcmFuc3BvcnQsIGVycm9yKSB7CisJcmV0dXJuIHRyYW5zLCBuaWwKIH0KIAogZnVuYyBOZXdUVHJhbnNwb3J0RmFjdG9yeSgpIFRUcmFuc3BvcnRGYWN0b3J5IHsKZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvdHJhbnNwb3J0X3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L3RyYW5zcG9ydF90ZXN0LmdvCmluZGV4IDg2NDk1OGEuLjAxMjc4MDMgMTAwNjQ0Ci0tLSBhL2xpYi9nby90aHJpZnQvdHJhbnNwb3J0X3Rlc3QuZ28KKysrIGIvbGliL2dvL3RocmlmdC90cmFuc3BvcnRfdGVzdC5nbwpAQCAtMjAsNiArMjAsNyBAQAogcGFja2FnZSB0aHJpZnQKIAogaW1wb3J0ICgKKwkiY29udGV4dCIKIAkiaW8iCiAJIm5ldCIKIAkic3RyY29udiIKQEAgLTU0LDcgKzU1LDcgQEAKIAlpZiBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbGYoIlRyYW5zcG9ydCAlVCBjYW5ub3Qgd3JpdGUgYmluYXJ5IGRhdGEgb2YgbGVuZ3RoICVkOiAlcyIsIHdyaXRlVHJhbnMsIGxlbih0cmFuc3BvcnRfYmRhdGEpLCBlcnIpCiAJfQotCWVyciA9IHdyaXRlVHJhbnMuRmx1c2goKQorCWVyciA9IHdyaXRlVHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWxmKCJUcmFuc3BvcnQgJVQgY2Fubm90IGZsdXNoIHdyaXRlIG9mIGJpbmFyeSBkYXRhOiAlcyIsIHdyaXRlVHJhbnMsIGVycikKIAl9CkBAIC03NCw3ICs3NSw3IEBACiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWxmKCJUcmFuc3BvcnQgJVQgY2Fubm90IHdyaXRlIGJpbmFyeSBkYXRhIDIgb2YgbGVuZ3RoICVkOiAlcyIsIHdyaXRlVHJhbnMsIGxlbih0cmFuc3BvcnRfYmRhdGEpLCBlcnIpCiAJfQotCWVyciA9IHdyaXRlVHJhbnMuRmx1c2goKQorCWVyciA9IHdyaXRlVHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWxmKCJUcmFuc3BvcnQgJVQgY2Fubm90IGZsdXNoIHdyaXRlIGJpbmFyeSBkYXRhIDI6ICVzIiwgd3JpdGVUcmFucywgZXJyKQogCX0KQEAgLTExMyw3ICsxMTQsNyBAQAogCWlmIGVyciAhPSBuaWwgewogCQl0LkZhdGFsZigiVHJhbnNwb3J0ICVUIGNhbm5vdCB3cml0ZSBiaW5hcnkgZGF0YSBvZiBsZW5ndGggJWQ6ICVzIiwgd3JpdGVUcmFucywgbGVuKHRyYW5zcG9ydF9iZGF0YSksIGVycikKIAl9Ci0JZXJyID0gd3JpdGVUcmFucy5GbHVzaCgpCisJZXJyID0gd3JpdGVUcmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKIAlpZiBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbGYoIlRyYW5zcG9ydCAlVCBjYW5ub3QgZmx1c2ggd3JpdGUgb2YgYmluYXJ5IGRhdGE6ICVzIiwgd3JpdGVUcmFucywgZXJyKQogCX0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvdHlwZS5nbyBiL2xpYi9nby90aHJpZnQvdHlwZS5nbwppbmRleCA3YzY4YzJiLi40MjkyZmZjIDEwMDY0NAotLS0gYS9saWIvZ28vdGhyaWZ0L3R5cGUuZ28KKysrIGIvbGliL2dvL3RocmlmdC90eXBlLmdvCkBAIC00MCw3ICs0MCw3IEBACiAJTElTVCAgID0gMTUKIAlVVEY4ICAgPSAxNgogCVVURjE2ICA9IDE3Ci0JQklOQVJZID0gMTgKKwkvL0JJTkFSWSA9IDE4ICAgd3JvbmcgYW5kIHVudXN1ZWQKICkKIAogdmFyIHR5cGVOYW1lcyA9IG1hcFtpbnRdc3RyaW5newpAQCAtNDgsNiArNDgsNyBAQAogCVZPSUQ6ICAgIlZPSUQiLAogCUJPT0w6ICAgIkJPT0wiLAogCUJZVEU6ICAgIkJZVEUiLAorCURPVUJMRTogIkRPVUJMRSIsCiAJSTE2OiAgICAiSTE2IiwKIAlJMzI6ICAgICJJMzIiLAogCUk2NDogICAgIkk2NCIsCmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3psaWJfdHJhbnNwb3J0LmdvIGIvbGliL2dvL3RocmlmdC96bGliX3RyYW5zcG9ydC5nbwppbmRleCBlNDc0NTVmLi5mM2Q0MjY3IDEwMDY0NAotLS0gYS9saWIvZ28vdGhyaWZ0L3psaWJfdHJhbnNwb3J0LmdvCisrKyBiL2xpYi9nby90aHJpZnQvemxpYl90cmFuc3BvcnQuZ28KQEAgLTIxLDEzICsyMSwxNSBAQAogCiBpbXBvcnQgKAogCSJjb21wcmVzcy96bGliIgorCSJjb250ZXh0IgogCSJpbyIKIAkibG9nIgogKQogCiAvLyBUWmxpYlRyYW5zcG9ydEZhY3RvcnkgaXMgYSBmYWN0b3J5IGZvciBUWmxpYlRyYW5zcG9ydCBpbnN0YW5jZXMKIHR5cGUgVFpsaWJUcmFuc3BvcnRGYWN0b3J5IHN0cnVjdCB7Ci0JbGV2ZWwgaW50CisJbGV2ZWwgICBpbnQKKwlmYWN0b3J5IFRUcmFuc3BvcnRGYWN0b3J5CiB9CiAKIC8vIFRabGliVHJhbnNwb3J0IGlzIGEgVFRyYW5zcG9ydCBpbXBsZW1lbnRhdGlvbiB0aGF0IG1ha2VzIHVzZSBvZiB6bGliIGNvbXByZXNzaW9uLgpAQCAtMzgsMTQgKzQwLDI3IEBACiB9CiAKIC8vIEdldFRyYW5zcG9ydCBjb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIE5ld1RabGliVHJhbnNwb3J0Ci1mdW5jIChwICpUWmxpYlRyYW5zcG9ydEZhY3RvcnkpIEdldFRyYW5zcG9ydCh0cmFucyBUVHJhbnNwb3J0KSBUVHJhbnNwb3J0IHsKLQl0LCBfIDo9IE5ld1RabGliVHJhbnNwb3J0KHRyYW5zLCBwLmxldmVsKQotCXJldHVybiB0CitmdW5jIChwICpUWmxpYlRyYW5zcG9ydEZhY3RvcnkpIEdldFRyYW5zcG9ydCh0cmFucyBUVHJhbnNwb3J0KSAoVFRyYW5zcG9ydCwgZXJyb3IpIHsKKwlpZiBwLmZhY3RvcnkgIT0gbmlsIHsKKwkJLy8gd3JhcCBvdGhlciBmYWN0b3J5CisJCXZhciBlcnIgZXJyb3IKKwkJdHJhbnMsIGVyciA9IHAuZmFjdG9yeS5HZXRUcmFuc3BvcnQodHJhbnMpCisJCWlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuIG5pbCwgZXJyCisJCX0KKwl9CisJcmV0dXJuIE5ld1RabGliVHJhbnNwb3J0KHRyYW5zLCBwLmxldmVsKQogfQogCiAvLyBOZXdUWmxpYlRyYW5zcG9ydEZhY3RvcnkgY29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiBOZXdUWmxpYlRyYW5zcG9ydEZhY3RvcnkKIGZ1bmMgTmV3VFpsaWJUcmFuc3BvcnRGYWN0b3J5KGxldmVsIGludCkgKlRabGliVHJhbnNwb3J0RmFjdG9yeSB7Ci0JcmV0dXJuICZUWmxpYlRyYW5zcG9ydEZhY3Rvcnl7bGV2ZWw6IGxldmVsfQorCXJldHVybiAmVFpsaWJUcmFuc3BvcnRGYWN0b3J5e2xldmVsOiBsZXZlbCwgZmFjdG9yeTogbmlsfQorfQorCisvLyBOZXdUWmxpYlRyYW5zcG9ydEZhY3RvcnkgY29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiBUWmxpYlRyYW5zcG9ydEZhY3RvcnkKKy8vIGFzIGEgd3JhcHBlciBvdmVyIGV4aXN0aW5nIHRyYW5zcG9ydCBmYWN0b3J5CitmdW5jIE5ld1RabGliVHJhbnNwb3J0RmFjdG9yeVdpdGhGYWN0b3J5KGxldmVsIGludCwgZmFjdG9yeSBUVHJhbnNwb3J0RmFjdG9yeSkgKlRabGliVHJhbnNwb3J0RmFjdG9yeSB7CisJcmV0dXJuICZUWmxpYlRyYW5zcG9ydEZhY3Rvcnl7bGV2ZWw6IGxldmVsLCBmYWN0b3J5OiBmYWN0b3J5fQogfQogCiAvLyBOZXdUWmxpYlRyYW5zcG9ydCBjb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIFRabGliVHJhbnNwb3J0CkBAIC03NywxMSArOTIsMTEgQEAKIH0KIAogLy8gRmx1c2ggZmx1c2hlcyB0aGUgd3JpdGVyIGFuZCBpdHMgdW5kZXJseWluZyB0cmFuc3BvcnQuCi1mdW5jICh6ICpUWmxpYlRyYW5zcG9ydCkgRmx1c2goKSBlcnJvciB7CitmdW5jICh6ICpUWmxpYlRyYW5zcG9ydCkgRmx1c2goY3R4IGNvbnRleHQuQ29udGV4dCkgZXJyb3IgewogCWlmIGVyciA6PSB6LndyaXRlci5GbHVzaCgpOyBlcnIgIT0gbmlsIHsKIAkJcmV0dXJuIGVycgogCX0KLQlyZXR1cm4gei50cmFuc3BvcnQuRmx1c2goKQorCXJldHVybiB6LnRyYW5zcG9ydC5GbHVzaChjdHgpCiB9CiAKIC8vIElzT3BlbiByZXR1cm5zIHRydWUgaWYgdGhlIHRyYW5zcG9ydCBpcyBvcGVuCmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3psaWJfdHJhbnNwb3J0X3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L3psaWJfdHJhbnNwb3J0X3Rlc3QuZ28KaW5kZXggZjU3NjEwYy4uM2M2ZjExZSAxMDA2NDQKLS0tIGEvbGliL2dvL3RocmlmdC96bGliX3RyYW5zcG9ydF90ZXN0LmdvCisrKyBiL2xpYi9nby90aHJpZnQvemxpYl90cmFuc3BvcnRfdGVzdC5nbwpAQCAtMzEsMyArMzEsMzIgQEAKIAl9CiAJVHJhbnNwb3J0VGVzdCh0LCB0cmFucywgdHJhbnMpCiB9CisKK3R5cGUgRHVtbXlUcmFuc3BvcnRGYWN0b3J5IHN0cnVjdHt9CisKK2Z1bmMgKHAgKkR1bW15VHJhbnNwb3J0RmFjdG9yeSkgR2V0VHJhbnNwb3J0KHRyYW5zIFRUcmFuc3BvcnQpIChUVHJhbnNwb3J0LCBlcnJvcikgeworCXJldHVybiBOZXdUTWVtb3J5QnVmZmVyKCksIG5pbAorfQorCitmdW5jIFRlc3RabGliRmFjdG9yeVRyYW5zcG9ydFdpdGhGYWN0b3J5KHQgKnRlc3RpbmcuVCkgeworCWZhY3RvcnkgOj0gTmV3VFpsaWJUcmFuc3BvcnRGYWN0b3J5V2l0aEZhY3RvcnkoCisJCXpsaWIuQmVzdENvbXByZXNzaW9uLAorCQkmRHVtbXlUcmFuc3BvcnRGYWN0b3J5e30sCisJKQorCWJ1ZmZlciA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwl0cmFucywgZXJyIDo9IGZhY3RvcnkuR2V0VHJhbnNwb3J0KGJ1ZmZlcikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbChlcnIpCisJfQorCVRyYW5zcG9ydFRlc3QodCwgdHJhbnMsIHRyYW5zKQorfQorCitmdW5jIFRlc3RabGliRmFjdG9yeVRyYW5zcG9ydFdpdGhvdXRGYWN0b3J5KHQgKnRlc3RpbmcuVCkgeworCWZhY3RvcnkgOj0gTmV3VFpsaWJUcmFuc3BvcnRGYWN0b3J5V2l0aEZhY3RvcnkoemxpYi5CZXN0Q29tcHJlc3Npb24sIG5pbCkKKwlidWZmZXIgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJdHJhbnMsIGVyciA6PSBmYWN0b3J5LkdldFRyYW5zcG9ydChidWZmZXIpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoZXJyKQorCX0KKwlUcmFuc3BvcnRUZXN0KHQsIHRyYW5zLCB0cmFucykKK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL1JFQURNRS5tZCBiL2xpYi9oYXhlL1JFQURNRS5tZAppbmRleCBmZDRkZWJlLi5lNzRiNzczIDEwMDY0NAotLS0gYS9saWIvaGF4ZS9SRUFETUUubWQKKysrIGIvbGliL2hheGUvUkVBRE1FLm1kCkBAIC00NCw5ICs0NCw5IEBACiBIYXhlIG9uIExpbnV4IAogLS0tLS0tLS0tLS0tLS0tCiAKLUZvciBMaW51eCBwbGF0Zm9ybXMgaXQgaXMgcmVjb21tZW5kZWQgbm90IHRvIGRvd25sb2FkIHRoZSAKLWJpbmFyaWVzIG1hbnVhbGx5LCBpbnN0ZWFkIHVzZSB0aGUgSGF4ZSBpbnN0YWxsYXRpb24gc2hlbGwgCi1zY3JpcHQgd2hpY2ggY2FuIGJlIGZvdW5kIGF0IGBodHRwOi8vd3d3Lm9wZW5mbC5vcmcvZG93bmxvYWRgLgorRm9yIExpbnV4IHBsYXRmb3JtcyBpdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgdGhlIGRpc3Ryby1zcGVjaWZpYyBwYWNrYWdlCittYW5hZ2VyLCB3aGVyZSBwb3NzaWJsZS4gTW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgYXQgdGhlIAorSGF4ZSBMaW51eCBkb3dubG9hZCBzZWN0aW9uOiBodHRwOi8vaGF4ZS5vcmcvZG93bmxvYWQvbGludXgKIAogSWYgeW91IHJ1biBpbnRvIHRoZSBlcnJvciBtZXNzYWdlIAogCkBAIC02OSwxMCArNjksMTAgQEAKIFRocmlmdCBIYXhlIGJpbmRpbmdzIGNhbiBiZSBzZXQgdXAgdmlhIHRoZSBgaGF4ZWxpYmAgdG9vbCAgCiBlaXRoZXIgZnJvbSB0aGUgb2ZmaWNpYWwgQVNGIHJlcG8sIG9yIHZpYSB0aGUgZ2l0aHViIG1pcnJvci4KIAotLSBUbyBzZXQgdXAgYW55ICoqc3RhYmxlIHZlcnNpb24qKiwgY2hvb3NlIHRoZSBhcHByb3ByaWF0ZSBicmFuY2ggKGUuZy4gYDAuOS4zYCk6CistIFRvIHNldCB1cCBhbnkgKipzdGFibGUgdmVyc2lvbioqLCBjaG9vc2UgdGhlIGFwcHJvcHJpYXRlIGJyYW5jaCAoZS5nLiBgMS4wLjBgLCBldGMuKToKIAotICAgIC0gYGhheGVsaWIgZ2l0IHRocmlmdCBodHRwczovL2dpdC5hcGFjaGUub3JnL3RocmlmdC5naXQgMC45LjMgbGliL2hheGVgCi0gICAgLSBgaGF4ZWxpYiBnaXQgdGhyaWZ0IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0LmdpdCAwLjkuMyBsaWIvaGF4ZWAKKyAgICAtIGBoYXhlbGliIGdpdCB0aHJpZnQgaHR0cHM6Ly9naXQuYXBhY2hlLm9yZy90aHJpZnQuZ2l0IDEuMC4wIGxpYi9oYXhlYAorICAgIC0gYGhheGVsaWIgZ2l0IHRocmlmdCBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC5naXQgMS4wLjAgbGliL2hheGVgCiAKIC0gVG8gc2V0IHVwIHRoZSBjdXJyZW50ICoqZGV2ZWxvcG1lbnQgdmVyc2lvbioqLCB1c2UgdGhlIGBtYXN0ZXJgIGJyYW5jaDoKICAgCkBAIC05NCw3ICs5NCw4IEBACiBDdXJyZW50IHN0YXR1cwogPT09PT09PT09PT09PT09PT09PT09PT09CiAtIHRlc3RlZCB3aXRoIEhheGUgQysrIHRhcmdldAotLSB0cmFuc3BvcnRzOiBTb2NrZXQsIEhUVFAgKGNsaWVudCBvbmx5KSwgU3RyZWFtCistIHRlc3RlZCB3aXRoIEhheGUgUEhQIHRhcmdldCAoY29uc29sZS93ZWIgc2VydmVyLCBiaW5hcnkgcHJvdG9jb2xzKQorLSB0cmFuc3BvcnRzOiBTb2NrZXQsIEhUVFAgKHNlcnZlcnMgcnVuIGluc2lkZSBQSFAgc2VydmVyL1BIUCB0YXJnZXQgb25seSksIFN0cmVhbQogLSBwcm90b2NvbHM6IEJpbmFyeSwgSlNPTiwgTXVsdGlwbGV4LCBDb21wYWN0CiAtIHR1dG9yaWFsIGNsaWVudCBhbmQgc2VydmVyIGF2YWlsYWJsZQogLSBjcm9zcy10ZXN0IGNsaWVudCBhbmQgc2VydmVyIGF2YWlsYWJsZSAKQEAgLTExNiwzICsxMTcsNDggQEAKIEphdmFzY3JpcHQ6CiAtIHR1dG9yaWFsIGZhaWxzIHRvIGJ1aWxkIGJlY2F1c2Ugb2YgdW5zdXBwb3J0ZWQgU3lzLmFyZ3MKIAorUEhQIEhUVFAgU2VydmVyIG5vdGVzCis9PT09PT09PT09PT09PT09PT09PT09PT0KKworLSB5b3UgaGF2ZSB0byBpbXBvcnQgUEhQIGZpbGVzIGdlbmVyYXRlZCBieSBoYXhlIGludG8gUEhQCitgYGBwaHAKK3JlcXVpcmVfb25jZSAgZGlybmFtZShfX0ZJTEVfXykgLiAnL2Jpbi9waHAtd2ViLXNlcnZlci9NYWluLWRlYnVnLnBocCc7CitgYGAKKworLSB0cmFjZSgpIGJ5IGRlZmF1bHQgb3V0cHV0cyBpbnRvIHN0ZG91dCAoaHR0cCByZXNwb25zZSksIHNvIHlvdSBoYXZlIHRvIHJlZGlyZWN0IGl0IHRvIHN0ZGVyciBvciB5b3Ugb3duIGxvZ3MsIHNvbWV0aGluZyBsaWtlCitgYGBoYXhlCisvL3JlbWFwIHRyYWNlIHRvIGVycm9yIGxvZworaGF4ZS5Mb2cudHJhY2UgPSBmdW5jdGlvbih2OkR5bmFtaWMsID9pbmZvczpoYXhlLlBvc0luZm9zKSAKK3sgCisJLy9zaW11bGF0ZSBub3JtYWwgdHJhY2UgaHR0cHM6Ly9naXRodWIuY29tL0hheGVGb3VuZGF0aW9uL2hheGUvYmxvYi9kZXZlbG9wbWVudC9zdGQvaGF4ZS9Mb2cuaHgKKwl2YXIgbmV3VmFsdWUgOiBEeW5hbWljOworCWlmIChpbmZvcyAhPSBudWxsICYmIGluZm9zLmN1c3RvbVBhcmFtcyE9bnVsbCkgeworCQl2YXIgZXh0cmE6U3RyaW5nID0gIiI7CisJCWZvciggdiBpbiBpbmZvcy5jdXN0b21QYXJhbXMgKQorCQkJZXh0cmEgKz0gIiwiICsgdjsKKwkJbmV3VmFsdWUgPSB2ICsgZXh0cmE7CisJfQorCWVsc2UgeworCQluZXdWYWx1ZSA9IHY7CisJfQorCXZhciBtc2cgPSBpbmZvcyAhPSBudWxsID8gaW5mb3MuZmlsZU5hbWUgKyAnOicgKyBpbmZvcy5saW5lTnVtYmVyICsgJzogJyA6ICcnOworCVN5cy5zdGRlcnIoKS53cml0ZVN0cmluZygnJHttc2d9JHtuZXdWYWx1ZX1cbicpOworfQorYGBgCisKKy0gdG8gYWxsb3cgdGhyaWZ0IHNlcnZlciB0byByZWFkL3dyaXRlIEhUVFAgcmVxdWVzdC9yZXNwb25zZSwgaXQgc2hvdWxkIGJlIHBvaW50ZWQgb3V0IHRvIHBocCBzdHJlYW1zCitgYGBoYXhlCit0cmFuc3BvcnQgPQluZXcgVFdyYXBwaW5nU2VydmVyVHJhbnNwb3J0KAorCQkJCW5ldyBUU3RyZWFtVHJhbnNwb3J0KAorCQkJCQluZXcgVEZpbGVTdHJlYW0oInBocDovL2lucHV0IiwgUmVhZCksCisJCQkJCW5ldyBURmlsZVN0cmVhbSgicGhwOi8vb3V0cHV0IiwgQXBwZW5kKQorCQkJCQkpCisJCQkJKTsKK2BgYAorCistIFRTaW1wbGVTZXJ2ZXIgZG9lc24ndCBzdG9wIGFmdGVyIGZpcnN0IGNhbGwsIHNvIHByb2Nlc3Nvci5wcm9jZXNzKCkgc2hvdWxkIGJlIGNhbGxlZCBpbnN0ZWFkLCBvciB1c2UgcnVuT25jZSBwcm9wZXJ0eSAKK2BgYGhheGUKK3ZhciBzZXJ2ZXIgPSBuZXcgVFNpbXBsZVNlcnZlciggcHJvY2Vzc29yLCB0cmFuc3BvcnQsIHRyYW5zZmFjdG9yeSwgcHJvdGZhY3RvcnkpOworc2VydmVyLnJ1bk9uY2UgPSB0cnVlOworYGBgCisKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL2hheGVsaWIuanNvbiBiL2xpYi9oYXhlL2hheGVsaWIuanNvbgppbmRleCBiZDA3YWM1Li45OTJhZDkwIDEwMDY0NAotLS0gYS9saWIvaGF4ZS9oYXhlbGliLmpzb24KKysrIGIvbGliL2hheGUvaGF4ZWxpYi5qc29uCkBAIC0xLDExICsxLDEyIEBACiB7CiAJIm5hbWUiOiAidGhyaWZ0IiwKLQkidXJsIiA6ICJodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC90cmVlL21hc3Rlci9saWIvaGF4ZSIsCi0JImxpY2Vuc2UiOiAiQXBhY2hlIDIuMCIsCisJInVybCIgOiAiaHR0cDovL3RocmlmdC5hcGFjaGUub3JnIiwKKwkibGljZW5zZSI6ICJBcGFjaGUiLAogCSJ0YWdzIjogWyJ0aHJpZnQiLCAicnBjIiwgInNlcmlhbGl6YXRpb24iLCAiY3Jvc3MiLCAiZnJhbWV3b3JrIl0sCiAJImRlc2NyaXB0aW9uIjogIkhheGUgYmluZGluZ3MgZm9yIHRoZSBBcGFjaGUgVGhyaWZ0IFJQQyBhbmQgc2VyaWFsaXphdGlvbiBmcmFtZXdvcmsiLAotCSJ2ZXJzaW9uIjogIjAuOS4zIiwKLQkicmVsZWFzZW5vdGUiOiAiVGhlIEFwYWNoZSBUaHJpZnQgY29tcGlsZXIgbmVlZHMgdG8gYmUgaW5zdGFsbGVkIHNlcGFyYXRlbHksIHNlZSBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmciLAorCSJ2ZXJzaW9uIjogIjEuMC4wIiwKKwkicmVsZWFzZW5vdGUiOiAiTGljZW5zZWQgdW5kZXIgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBUaGUgQXBhY2hlIFRocmlmdCBjb21waWxlciBuZWVkcyB0byBiZSBpbnN0YWxsZWQgc2VwYXJhdGVseS4iLAogCSJjb250cmlidXRvcnMiOiBbIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIl0sCi0JImRlcGVuZGVuY2llcyI6IHsgfQorCSJkZXBlbmRlbmNpZXMiOiB7IH0sCisJImNsYXNzUGF0aCI6ICJzcmMiCiB9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvaGVscGVyL1ppZ1phZy5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9oZWxwZXIvWmlnWmFnLmh4CmluZGV4IDg2MjA2MGQuLjNmODYwMWIgMTAwNjQ0Ci0tLSBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9oZWxwZXIvWmlnWmFnLmh4CisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9oZWxwZXIvWmlnWmFnLmh4CkBAIC0yMCw2ICsyMCw3IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LmhlbHBlcjsKIAogaW1wb3J0IGhheGUuSW50NjQ7CitpbXBvcnQgaGF4ZS5JbnQzMjsKIAogY2xhc3MgWmlnWmFnIHsKIApAQCAtMjgsNyArMjksMTUgQEAKICAgICAgKiByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBGcm9tSW50KCBuIDogSW50KSA6IFVJbnQgICAgeworICAgICAgICAjaWYgcGhwCisKKyAgICAgICAgcmV0dXJuIGNhc3QoY2FzdChjYXN0KG4sSW50MzIpIDw8IDEsSW50MzIpIF4gY2FzdChjYXN0KG4sSW50MzIpID4+IDMxLEludDMyKSxVSW50KTsKKworICAgICAgICAjZWxzZQorCiAgICAgICAgIHJldHVybiBjYXN0KG4gPDwgMSxVSW50KSBeIGNhc3QobiA+PiAzMSxVSW50KTsKKworICAgICAgICAjZW5kCiAgICAgfQogCiAKQEAgLTM2LDcgKzQ1LDE4IEBACiAgICAgICogQ29udmVydCBmcm9tIHppZ3phZyBpbnQgdG8gaW50LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gVG9JbnQoIG4gOiBVSW50KSA6IEludCB7CisgICAgICAgICNpZiBwaHAKKworICAgICAgICB2YXIgYSA9ICgweDdGRkZGRkZGICYgY2FzdChuID4+IDEsSW50KSk7CisgICAgICAgIHZhciBiID0gKGNhc3QobiAmIDEsSW50KSk7CisgICAgICAgIGIgPSAtYjsgIC8vIHdvcmthcm91bmQgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9IYXhlRm91bmRhdGlvbi9oYXhlL2lzc3Vlcy81Mjg4CisgICAgICAgIHJldHVybiBhIF4gYjsKKworICAgICAgICAjZWxzZQorCiAgICAgICAgIHJldHVybiAoMHg3RkZGRkZGRiAmIGNhc3QobiA+PiAxLEludCkpIF4gKC1jYXN0KG4gJiAxLEludCkpOworCisgICAgICAgICNlbmQKICAgICB9CiAKIApAQCAtNjcsNiArODcsOSBAQAogICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIFRlc3QzMiggdGVzdCA6IEludCkgOiBWb2lkIHsKICAgICAgICAgdmFyIGEgOiBVSW50ID0gWmlnWmFnLkZyb21JbnQoIHRlc3QpOwogICAgICAgICB2YXIgYiA6IEludCA9IFppZ1phZy5Ub0ludChhKTsKKyAgICAgICAgI2lmIHBocAorICAgICAgICB0ZXN0ID0gdGVzdCAmIDB4RkZGRkZGRkY7ICAvLyB3b3JrYXJvdW5kIGZvciBodHRwczovL2dpdGh1Yi5jb20vSGF4ZUZvdW5kYXRpb24vaGF4ZS9pc3N1ZXMvNTI4OQorICAgICAgICAjZW5kCiAgICAgICAgIGlmKCB0ZXN0ICE9IGIpCiAgICAgICAgICAgICB0aHJvdyAnWmlnWmFnLlRlc3QzMigkdGVzdCkgZmFpbGVkOiBhID0gJGEsIGIgPSAkYic7CiAgICAgfQpAQCAtODgsMjIgKzExMSwyOCBAQAogICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gVW5pdFRlc3QoKSA6IFZvaWQgewogICAgICAgdmFyIHUxIDogVUludCA9IDB4RkZGRkZGRkU7CiAgICAgICB2YXIgdTIgOiBVSW50ID0gMHhGRkZGRkZGRjsKKyAgICAgIHZhciBpMSA6IEludCA9IDIxNDc0ODM2NDc7CisgICAgICB2YXIgaTIgOiBJbnQgPSAtMjE0NzQ4MzY0ODsKKworICAgICAgI2lmIHBocAorICAgICAgaTIgPSBpMiAmIDB4RkZGRkZGRkY7ICAvLyB3b3JrYXJvdW5kIGZvciBodHRwczovL2dpdGh1Yi5jb20vSGF4ZUZvdW5kYXRpb24vaGF4ZS9pc3N1ZXMvNTI4OQorICAgICAgI2VuZAogCiAgICAgICAvLyBwcm90b2J1ZiB0ZXN0Y2FzZXMKICAgICAgIGlmKCBGcm9tSW50KDApICAhPSAwKSB0aHJvdyAncGIgIzEgdG8gWmlnWmFnJzsKICAgICAgIGlmKCBGcm9tSW50KC0xKSAhPSAxKSB0aHJvdyAncGIgIzIgdG8gWmlnWmFnJzsKICAgICAgIGlmKCBGcm9tSW50KDEpICAhPSAyKSB0aHJvdyAncGIgIzMgdG8gWmlnWmFnJzsKICAgICAgIGlmKCBGcm9tSW50KC0yKSAhPSAzKSB0aHJvdyAncGIgIzQgdG8gWmlnWmFnJzsKLSAgICAgIGlmKCBGcm9tSW50KDIxNDc0ODM2NDcpICE9IHUxKSB0aHJvdyAncGIgIzUgdG8gWmlnWmFnJzsKLSAgICAgIGlmKCBGcm9tSW50KC0yMTQ3NDgzNjQ4KSAhPSB1MikgdGhyb3cgJ3BiICM2IHRvIFppZ1phZyc7CisgICAgICBpZiggRnJvbUludChpMSkgIT0gdTEpIHRocm93ICdwYiAjNSB0byBaaWdaYWcnOworICAgICAgaWYoIEZyb21JbnQoaTIpICE9IHUyKSB0aHJvdyAncGIgIzYgdG8gWmlnWmFnJzsKIAogICAgICAgLy8gcHJvdG9idWYgdGVzdGNhc2VzCiAgICAgICBpZiggVG9JbnQoMCkgIT0gMCkgdGhyb3cgJ3BiICMxIGZyb20gWmlnWmFnJzsKICAgICAgIGlmKCBUb0ludCgxKSAhPSAtMSkgdGhyb3cgJ3BiICMyIGZyb20gWmlnWmFnJzsKICAgICAgIGlmKCBUb0ludCgyKSAhPSAxKSB0aHJvdyAncGIgIzMgZnJvbSBaaWdaYWcnOwogICAgICAgaWYoIFRvSW50KDMpICE9IC0yKSB0aHJvdyAncGIgIzQgZnJvbSBaaWdaYWcnOwotICAgICAgaWYoIFRvSW50KHUxKSAhPSAyMTQ3NDgzNjQ3KSB0aHJvdyAncGIgIzUgZnJvbSBaaWdaYWcsIGdvdCAke1RvSW50KHUxKX0nOwotICAgICAgaWYoIFRvSW50KHUyKSAhPSAtMjE0NzQ4MzY0OCkgdGhyb3cgJ3BiICM2IGZyb20gWmlnWmFnLCBnb3QgJHtUb0ludCh1Mil9JzsKKyAgICAgIGlmKCBUb0ludCh1MSkgIT0gaTEpIHRocm93ICdwYiAjNSBmcm9tIFppZ1phZywgZ290ICR7VG9JbnQodTEpfSBleHBlY3RlZCAkaTEnOworICAgICAgaWYoIFRvSW50KHUyKSAhPSBpMikgdGhyb3cgJ3BiICM2IGZyb20gWmlnWmFnLCBnb3QgJHtUb0ludCh1Mil9IGV4cGVjdGVkICRpMic7CiAKICAgICAgIC8vIGJhY2sgYW5kIGZvcnRoIDMyCiAgICAgICBUZXN0MzIoIDApOwpAQCAtMTI1LDQgKzE1NCw1IEBACiAgICAgfQogICAgICNlbmQKIH0KLSAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisKKyAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmh4CmluZGV4IDIyZTg4ZTQuLmI3ZjM4NDIgMTAwNjQ0Ci0tLSBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaHgKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oeApAQCAtNzksNyArNzksNyBAQAogICAgIGZ1bmN0aW9uIHJlYWRTdHJpbmcoKSA6IFN0cmluZzsKICAgICBmdW5jdGlvbiByZWFkQmluYXJ5KCkgOiBCeXRlczsKIAotCS8vIHJlY3Vyc2lvbiB0cmFja2luZwotCWZ1bmN0aW9uIEluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkgOiBWb2lkOwotCWZ1bmN0aW9uIERlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkgOiBWb2lkOworICAgIC8vIHJlY3Vyc2lvbiB0cmFja2luZworICAgIGZ1bmN0aW9uIEluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkgOiBWb2lkOworICAgIGZ1bmN0aW9uIERlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkgOiBWb2lkOwogfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IuaHgKaW5kZXggZTQzZDJkOS4uNzY5ZTkzYyAxMDA2NDQKLS0tIGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5oeAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLmh4CkBAIC0yMTUsNCArMjE1LDEyIEBACiAgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRCaW5hcnkoKSA6IEJ5dGVzIHsKICAgICAgICAgcmV0dXJuIHdyYXBwZWQucmVhZEJpbmFyeSgpOwogICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBJbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpIDogVm9pZCB7CisgICAgICAgIHJldHVybiB3cmFwcGVkLkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIERlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkgOiBWb2lkIHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWQuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVXRpbC5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xVdGlsLmh4CmluZGV4IDcxZWQ0YmEuLjAwMWU0MDUgMTAwNjQ0Ci0tLSBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xVdGlsLmh4CisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xVdGlsLmh4CkBAIC0zNSw3NiArMzUsNzYgQEAKICAgICAgKiBAcGFyYW0gdHlwZSAgdGhlIG5leHQgdmFsdWUgd2lsbCBiZSBpbnRlcHJldGVkIGFzIHRoaXMgVFR5cGUgdmFsdWUuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBza2lwKHByb3Q6VFByb3RvY29sLCB0eXBlIDogSW50KSA6IFZvaWQgewotCQlwcm90LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7Ci0JCXRyeQotCQl7Ci0JCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCQljYXNlIFRUeXBlLkJPT0w6IAotCQkJCQlwcm90LnJlYWRCb29sKCk7CisgICAgICAgIHByb3QuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuQk9PTDoKKyAgICAgICAgICAgICAgICAgICAgcHJvdC5yZWFkQm9vbCgpOwogCi0JCQkJY2FzZSBUVHlwZS5CWVRFOiAKLQkJCQkJcHJvdC5yZWFkQnl0ZSgpOworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuQllURToKKyAgICAgICAgICAgICAgICAgICAgcHJvdC5yZWFkQnl0ZSgpOwogCi0JCQkJY2FzZSBUVHlwZS5JMTY6IAotCQkJCQlwcm90LnJlYWRJMTYoKTsKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkkxNjoKKyAgICAgICAgICAgICAgICAgICAgcHJvdC5yZWFkSTE2KCk7CiAKLQkJCQljYXNlIFRUeXBlLkkzMjogCi0JCQkJCXByb3QucmVhZEkzMigpOworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuSTMyOgorICAgICAgICAgICAgICAgICAgICBwcm90LnJlYWRJMzIoKTsKIAotCQkJCWNhc2UgVFR5cGUuSTY0OiAKLQkJCQkJcHJvdC5yZWFkSTY0KCk7CisgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5JNjQ6CisgICAgICAgICAgICAgICAgICAgIHByb3QucmVhZEk2NCgpOwogCi0JCQkJY2FzZSBUVHlwZS5ET1VCTEU6IAotCQkJCQlwcm90LnJlYWREb3VibGUoKTsKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkRPVUJMRToKKyAgICAgICAgICAgICAgICAgICAgcHJvdC5yZWFkRG91YmxlKCk7CiAKLQkJCQljYXNlIFRUeXBlLlNUUklORzogCi0JCQkJCXByb3QucmVhZEJpbmFyeSgpOworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuU1RSSU5HOgorICAgICAgICAgICAgICAgICAgICBwcm90LnJlYWRCaW5hcnkoKTsKIAotCQkJCWNhc2UgVFR5cGUuU1RSVUNUOiAKLQkJCQkJcHJvdC5yZWFkU3RydWN0QmVnaW4oKTsKLQkJCQkJd2hpbGUgKHRydWUpIHsKLQkJCQkJCXZhciBmaWVsZDpURmllbGQgPSBwcm90LnJlYWRGaWVsZEJlZ2luKCk7Ci0JCQkJCQlpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5TVE9QKSB7Ci0JCQkJCQkgIGJyZWFrOwotCQkJCQkJfQotCQkJCQkJc2tpcChwcm90LCBmaWVsZC50eXBlKTsKLQkJCQkJCXByb3QucmVhZEZpZWxkRW5kKCk7Ci0JCQkJCX0KLQkJCQkJcHJvdC5yZWFkU3RydWN0RW5kKCk7CisgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5TVFJVQ1Q6CisgICAgICAgICAgICAgICAgICAgIHByb3QucmVhZFN0cnVjdEJlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmllbGQ6VEZpZWxkID0gcHJvdC5yZWFkRmllbGRCZWdpbigpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuU1RPUCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAocHJvdCwgZmllbGQudHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm90LnJlYWRGaWVsZEVuZCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHByb3QucmVhZFN0cnVjdEVuZCgpOwogCi0JCQkJY2FzZSBUVHlwZS5NQVA6IAotCQkJCQl2YXIgbWFwOlRNYXAgPSBwcm90LnJlYWRNYXBCZWdpbigpOwotCQkJCQlmb3IgKGkgaW4gMCAuLi4gbWFwLnNpemUpIHsKLQkJCQkJCXNraXAocHJvdCwgbWFwLmtleVR5cGUpOwotCQkJCQkJc2tpcChwcm90LCBtYXAudmFsdWVUeXBlKTsKLQkJCQkJfQotCQkJCQlwcm90LnJlYWRNYXBFbmQoKTsKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLk1BUDoKKyAgICAgICAgICAgICAgICAgICAgdmFyIG1hcDpUTWFwID0gcHJvdC5yZWFkTWFwQmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpIGluIDAgLi4uIG1hcC5zaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwKHByb3QsIG1hcC5rZXlUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAocHJvdCwgbWFwLnZhbHVlVHlwZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHJvdC5yZWFkTWFwRW5kKCk7CiAKLQkJCQljYXNlIFRUeXBlLlNFVDogCi0JCQkJCXZhciBzZXQ6VFNldCA9IHByb3QucmVhZFNldEJlZ2luKCk7Ci0JCQkJCWZvciAoaiBpbiAwIC4uLiBzZXQuc2l6ZSkgewotCQkJCQkJc2tpcChwcm90LCBzZXQuZWxlbVR5cGUpOwotCQkJCQl9Ci0JCQkJCXByb3QucmVhZFNldEVuZCgpOworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuU0VUOgorICAgICAgICAgICAgICAgICAgICB2YXIgc2V0OlRTZXQgPSBwcm90LnJlYWRTZXRCZWdpbigpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGogaW4gMCAuLi4gc2V0LnNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAocHJvdCwgc2V0LmVsZW1UeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwcm90LnJlYWRTZXRFbmQoKTsKIAotCQkJCWNhc2UgVFR5cGUuTElTVDogCi0JCQkJCXZhciBsaXN0OlRMaXN0ID0gcHJvdC5yZWFkTGlzdEJlZ2luKCk7Ci0JCQkJCWZvciAoayBpbiAwIC4uLiBsaXN0LnNpemUpIHsKLQkJCQkJCXNraXAocHJvdCwgbGlzdC5lbGVtVHlwZSk7Ci0JCQkJCX0KLQkJCQkJcHJvdC5yZWFkTGlzdEVuZCgpOworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuTElTVDoKKyAgICAgICAgICAgICAgICAgICAgdmFyIGxpc3Q6VExpc3QgPSBwcm90LnJlYWRMaXN0QmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChrIGluIDAgLi4uIGxpc3Quc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2tpcChwcm90LCBsaXN0LmVsZW1UeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwcm90LnJlYWRMaXN0RW5kKCk7CiAKLQkJCQlkZWZhdWx0OgotCQkJCQl0cmFjZSgiVW5rbm93biBmaWVsZCB0eXBlICIsdHlwZSwiIGluIHNraXBNYXhEZXB0aCgpIik7Ci0JCQl9Ci0JCQkKLQkJCXByb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsKLQkJfQotCQljYXRjaChlOkR5bmFtaWMpCi0JCXsKLQkJCXByb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsKLQkJCXRocm93IGU7Ci0JCX0KKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorCQkJCQl0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5VTktOT1dOLCAiVW5rbm93biBmaWVsZCB0eXBlICR7dHlwZX0iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJvdC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOworICAgICAgICB9CisgICAgICAgIGNhdGNoKGU6RHluYW1pYykKKyAgICAgICAgeworICAgICAgICAgICAgcHJvdC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfQogICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RSZWN1cnNpb25UcmFja2VyLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RSZWN1cnNpb25UcmFja2VyLmh4CmluZGV4IGI4ODJjZjIuLmNmMDIxMWIgMTAwNjQ0Ci0tLSBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUmVjdXJzaW9uVHJhY2tlci5oeAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFJlY3Vyc2lvblRyYWNrZXIuaHgKQEAgLTI0LDI1ICsyNCwyNSBAQAogCiBjbGFzcyBUUmVjdXJzaW9uVHJhY2tlciB7CiAKLQkvLyBkZWZhdWx0IAotICAgIHByaXZhdGUgc3RhdGljIGlubGluZSB2YXIgREVGQVVMVF9SRUNVUlNJT05fREVQVEggOiBJbnQgPSA2NDsgCisgICAgLy8gZGVmYXVsdAorICAgIHByaXZhdGUgc3RhdGljIGlubGluZSB2YXIgREVGQVVMVF9SRUNVUlNJT05fREVQVEggOiBJbnQgPSA2NDsKIAotCS8vIGxpbWl0IGFuZCBhY3R1YWwgdmFsdWUKLQlwdWJsaWMgdmFyIHJlY3Vyc2lvbkxpbWl0IDogSW50ID0gREVGQVVMVF9SRUNVUlNJT05fREVQVEg7CisgICAgLy8gbGltaXQgYW5kIGFjdHVhbCB2YWx1ZQorICAgIHB1YmxpYyB2YXIgcmVjdXJzaW9uTGltaXQgOiBJbnQgPSBERUZBVUxUX1JFQ1VSU0lPTl9ERVBUSDsKICAgICBwcml2YXRlIHZhciByZWN1cnNpb25EZXB0aCA6IEludCA9IDA7CiAKLQlwdWJsaWMgZnVuY3Rpb24gSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKSA6IFZvaWQgCi0JewotCQlpZiAocmVjdXJzaW9uRGVwdGggPCByZWN1cnNpb25MaW1pdCkKLQkJCSsrcmVjdXJzaW9uRGVwdGg7Ci0JCWVsc2UKLQkJCXRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLkRFUFRIX0xJTUlULCAiRGVwdGggbGltaXQgZXhjZWVkZWQiKTsKLQl9CisgICAgcHVibGljIGZ1bmN0aW9uIEluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkgOiBWb2lkCisgICAgeworICAgICAgICBpZiAocmVjdXJzaW9uRGVwdGggPCByZWN1cnNpb25MaW1pdCkKKyAgICAgICAgICAgICsrcmVjdXJzaW9uRGVwdGg7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLkRFUFRIX0xJTUlULCAiRGVwdGggbGltaXQgZXhjZWVkZWQiKTsKKyAgICB9CiAKLQlwdWJsaWMgZnVuY3Rpb24gRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKSA6IFZvaWQgCi0JewotCQktLXJlY3Vyc2lvbkRlcHRoOwotCX0KKyAgICBwdWJsaWMgZnVuY3Rpb24gRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKSA6IFZvaWQKKyAgICB7CisgICAgICAgIC0tcmVjdXJzaW9uRGVwdGg7CisgICAgfQogCiAKIH0KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5oeAppbmRleCAzYjY0YjYyLi4wNjAwNzQ0IDEwMDY0NAotLS0gYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuaHgKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmh4CkBAIC0yOSw2ICsyOSwxMCBAQAogCiAgICAgcHJpdmF0ZSB2YXIgc3RvcCA6IEJvb2wgPSBmYWxzZTsKIAorICAgIC8vc3RvcHMganVzdCBhZnRlciBpbnB1dCB0cmFuc3BvcnQgcmV0dXJucyBFT0YKKyAgICAvL3VzZWZ1bCBmb3IgbGltaXRlZCBzY2VuYXJpb3MsIGxpa2UgZW1iZWRpbmcgaW50byBwaHAgc2VydmVyCisgICAgcHVibGljIHZhciBydW5PbmNlIDogQm9vbCA9IGZhbHNlOworCiAgICAgcHVibGljIGZ1bmN0aW9uIG5ldyggcHJvY2Vzc29yIDogVFByb2Nlc3NvciwKICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQgOiBUU2VydmVyVHJhbnNwb3J0LAogICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnkgOiBUVHJhbnNwb3J0RmFjdG9yeSA9IG51bGwsCkBAIC0xMDIsNiArMTA2LDExIEBACiAgICAgICAgICAgICBjYXRjaCggdHR4IDogVFRyYW5zcG9ydEV4Y2VwdGlvbikKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAvLyBVc3VhbGx5IGEgY2xpZW50IGRpc2Nvbm5lY3QsIGV4cGVjdGVkCisgICAgICAgICAgICAgICAgaWYocnVuT25jZSAmJiB0dHguZXJyb3JJRCA9PSBUVHJhbnNwb3J0RXhjZXB0aW9uLkVORF9PRl9GSUxFKSB7CisgICAgICAgICAgICAgICAgICAvL2lucHV0IHJldHVybnMgZW9mLCBleGl0CisgICAgICAgICAgICAgICAgICAvL2ZvbGxvd3MgbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UU2VydmVyRnJhbWV3b3JrLmNwcAorICAgICAgICAgICAgICAgICAgU3RvcCgpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhdGNoKCBwZXggOiBUUHJvdG9jb2xFeGNlcHRpb24pCiAgICAgICAgICAgICB7CkBAIC0xMTIsNiArMTIxLDExIEBACiAgICAgICAgICAgICAgICAgbG9nRGVsZWdhdGUoZSk7IC8vIFVuZXhwZWN0ZWQKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgaWYoY2xpZW50ICE9IG51bGwgJiYgIXJ1bk9uY2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2xpZW50LmNsb3NlKCk7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIC8vIEZpcmUgZGVsZXRlQ29udGV4dCBzZXJ2ZXIgZXZlbnQgYWZ0ZXIgY2xpZW50IGRpc2Nvbm5lY3RzCiAgICAgICAgICAgICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXIuZGVsZXRlQ29udGV4dChjb25uZWN0aW9uQ29udGV4dCwgaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpOwpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0Lmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0Lmh4CmluZGV4IDU4NmE4YjYuLjRiYWRiMmEgMTAwNjQ0Ci0tLSBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oeAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaHgKQEAgLTM5LDI2ICszOSwyMiBAQAogICAgIC8vIFVuZGVybHlpbmcgc2VydmVyIHdpdGggc29ja2V0CiAgICAgcHJpdmF0ZSB2YXIgX3NvY2tldCA6IFNvY2tldD0gbnVsbDsKIAotICAgIC8vIFBvcnQgdG8gbGlzdGVuIG9uCi0gICAgcHJpdmF0ZSB2YXIgX3BvcnQgOiBJbnQgPSAwOwotCiAgICAgLy8gVGltZW91dCBmb3IgY2xpZW50IHNvY2tldHMgZnJvbSBhY2NlcHQKLSAgICBwcml2YXRlIHZhciBfY2xpZW50VGltZW91dCA6IEZsb2F0ID0gMDsKKyAgICBwcml2YXRlIHZhciBfY2xpZW50VGltZW91dCA6IEZsb2F0ID0gNTsKIAogICAgIC8vIFdoZXRoZXIgb3Igbm90IHRvIHdyYXAgbmV3IFRTb2NrZXQgY29ubmVjdGlvbnMgaW4gYnVmZmVycwogICAgIHByaXZhdGUgdmFyIF91c2VCdWZmZXJlZFNvY2tldHMgOiBCb29sID0gZmFsc2U7CiAKIAotICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoIHBvcnQgOiBJbnQsIGNsaWVudFRpbWVvdXQgOiBGbG9hdCA9IDAsIHVzZUJ1ZmZlcmVkU29ja2V0cyA6IEJvb2wgPSBmYWxzZSkKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KD9hZGRyZXNzIDogU3RyaW5nID0gJ2xvY2FsaG9zdCcsICBwb3J0IDogSW50LCBjbGllbnRUaW1lb3V0IDogRmxvYXQgPSA1LCB1c2VCdWZmZXJlZFNvY2tldHMgOiBCb29sID0gZmFsc2UpCiAgICAgewotICAgICAgICBfcG9ydCA9IHBvcnQ7CiAgICAgICAgIF9jbGllbnRUaW1lb3V0ID0gY2xpZW50VGltZW91dDsKICAgICAgICAgX3VzZUJ1ZmZlcmVkU29ja2V0cyA9IHVzZUJ1ZmZlcmVkU29ja2V0czsKIAogICAgICAgICB0cnkKICAgICAgICAgewogICAgICAgICAgICAgX3NvY2tldCA9IG5ldyBTb2NrZXQoKTsKLSAgICAgICAgICAgIF9zb2NrZXQuYmluZCggbmV3IEhvc3QoJ2xvY2FsaG9zdCcpLCBwb3J0KTsKKyAgICAgICAgICAgIF9zb2NrZXQuYmluZCggbmV3IEhvc3QoYWRkcmVzcyksIHBvcnQpOwogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChlIDogRHluYW1pYykKICAgICAgICAgewpAQCAtNzQsNyArNzAsOSBAQAogICAgICAgICBpZiAoX3NvY2tldCAhPSBudWxsKSAgICB7CiAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAjaWYgIXBocAogICAgICAgICAgICAgICAgIF9zb2NrZXQubGlzdGVuKDEpOworICAgICAgICAgICAgICAgICNlbmQKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhdGNoIChlIDogRHluYW1pYykKICAgICAgICAgICAgIHsKQEAgLTk0LDcgKzkyLDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgdmFyIGFjY2VwdGVkID0gX3NvY2tldC5hY2NlcHQoKTsKICAgICAgICAgICAgIHZhciByZXN1bHQgPSBUU29ja2V0LmZyb21Tb2NrZXQoYWNjZXB0ZWQpOwotICAgICAgICAgICAgYWNjZXB0ZWQuc2V0VGltZW91dCggX2NsaWVudFRpbWVvdXQpOworICAgICAgICAgICAgcmVzdWx0LnNldFRpbWVvdXQoIF9jbGllbnRUaW1lb3V0KTsKIAogICAgICAgICAgICAgaWYoIF91c2VCdWZmZXJlZFNvY2tldHMpCiAgICAgICAgICAgICB7CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaHgKaW5kZXggOGFhMDYwOC4uNzk0MWFiOSAxMDA2NDQKLS0tIGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmh4CisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oeApAQCAtNzMsNyArNzMsNyBAQAogICAgIHByaXZhdGUgdmFyIG91dHB1dCA6IE91dHB1dCA9IG51bGw7CiAgICAgI2VuZAogCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW5saW5lIHZhciBERUZBVUxUX1RJTUVPVVQgPSA1LjA7CisgICAgcHJpdmF0ZSB2YXIgdGltZW91dCA6IEZsb2F0ID0gMzA7CiAKICAgICBwcml2YXRlIHZhciBvYnVmZmVyIDogQnl0ZXNPdXRwdXQgPSBuZXcgQnl0ZXNPdXRwdXQoKTsKICAgICBwcml2YXRlIHZhciBpb0NhbGxiYWNrIDogVEV4Y2VwdGlvbi0+Vm9pZCA9IG51bGw7CkBAIC05Miw3ICs5Miw4IEBACiAgICAgI2lmICEgKGZsYXNoIHx8IGpzKQogICAgIC8vIHVzZWQgYnkgVFNvY2tldFNlcnZlcgogICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZnJvbVNvY2tldCggc29ja2V0IDogU29ja2V0KSA6IFRTb2NrZXQgIHsKLSAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBUU29ja2V0KCIiLDApOworICAgICAgICB2YXIgc29ja2V0SG9zdCA9IHNvY2tldC5ob3N0KCk7CisgICAgICAgIHZhciByZXN1bHQgPSBuZXcgVFNvY2tldChzb2NrZXRIb3N0Lmhvc3QudG9TdHJpbmcoKSwgc29ja2V0SG9zdC5wb3J0KTsKICAgICAgICAgcmVzdWx0LmFzc2lnblNvY2tldChzb2NrZXQpOwogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KQEAgLTI0MCw3ICsyNDEsNyBAQAogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChlIDogVEV4Y2VwdGlvbikKICAgICAgICAgewotICAgICAgICAgICAgdHJhY2UoJ1RFeGNlcHRpb24gJGUnKTsKKyAgICAgICAgICAgIHRyYWNlKCdURXhjZXB0aW9uICRlLCBtZXNzYWdlIDogJHtlLmVycm9yTXNnfScpOwogICAgICAgICAgICAgaWYoaW9DYWxsYmFjayAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgaW9DYWxsYmFjayhlKTsKICAgICAgICAgICAgIH0KQEAgLTI3MCwxMSArMjcxLDE3IEBACiAgICAgICAgIHZhciBzb2NrZXQgPSBuZXcgU29ja2V0KCk7CiAgICAgICAgIHNvY2tldC5jb25uZWN0KGhvc3QsIHBvcnQpOwogCisgICAgICAgICNlbHNlaWYgcGhwCisgICAgICAgIHZhciBzb2NrZXQgPSBuZXcgU29ja2V0KCk7CisgICAgICAgIHNvY2tldC5jb25uZWN0KGhvc3QsIHBvcnQpOworICAgICAgICBzb2NrZXQuc2V0QmxvY2tpbmcodHJ1ZSk7CisgICAgICAgIHNvY2tldC5zZXRUaW1lb3V0KHRpbWVvdXQpOworCiAgICAgICAgICNlbHNlCiAgICAgICAgIHZhciBzb2NrZXQgPSBuZXcgU29ja2V0KCk7CiAgICAgICAgIHNvY2tldC5zZXRCbG9ja2luZyh0cnVlKTsKICAgICAgICAgc29ja2V0LnNldEZhc3RTZW5kKHRydWUpOwotICAgICAgICBzb2NrZXQuc2V0VGltZW91dCggREVGQVVMVF9USU1FT1VUKTsKKyAgICAgICAgc29ja2V0LnNldFRpbWVvdXQodGltZW91dCk7CiAgICAgICAgIHNvY2tldC5jb25uZWN0KGhvc3QsIHBvcnQpOwogCiAgICAgICAgICNlbmQKQEAgLTMwMSw0ICszMDgsMTEgQEAKICAgICAgICAgI2VuZAogICAgIH0KIAorICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRUaW1lb3V0KCB0aW1lb3V0IDogRmxvYXQgKSA6IFZvaWQgeworICAgICAgICBpZihpc09wZW4oKSkgeworICAgICAgICAgICAgc29ja2V0LnNldFRpbWVvdXQodGltZW91dCk7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy50aW1lb3V0ID0gdGltZW91dDsKKyAgICB9CisKIH0KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5oeAppbmRleCA0YTNiZDkwLi5lNmIzMTc5IDEwMDY0NAotLS0gYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaHgKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0Lmh4CkBAIC0xOSw2ICsxOSw3IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OwogCitpbXBvcnQgaGF4ZS5pby5Fb2Y7CiBpbXBvcnQgaGF4ZS5pby5CeXRlczsKIGltcG9ydCBoYXhlLmlvLkJ5dGVzQnVmZmVyOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LkFic3RyYWN0TWV0aG9kRXJyb3I7CkBAIC04NSwxNiArODYsMjEgQEAKICAgICAgICAgdmFyIGdvdCA6IEludCA9IDA7CiAgICAgICAgIHZhciByZXQgOiBJbnQgPSAwOwogICAgICAgICB3aGlsZSAoZ290IDwgbGVuKSB7CisgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHJldCA9IHJlYWQoYnVmLCBvZmYrZ290LCBsZW4tZ290KTsKICAgICAgICAgICAgIGlmIChyZXQgPD0gMCkgewogICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLlVOS05PV04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCByZWFkLiBSZW1vdGUgc2lkZSBoYXMgY2xvc2VkLiBUcmllZCB0byByZWFkICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGxlbiArICIgYnl0ZXMsIGJ1dCBvbmx5IGdvdCAiICsgZ290ICsgIiBieXRlcy4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCByZWFkLiBSZW1vdGUgc2lkZSBoYXMgY2xvc2VkLiBUcmllZCB0byByZWFkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKyBsZW4gKyAiIGJ5dGVzLCBidXQgb25seSBnb3QgIiArIGdvdCArICIgYnl0ZXMuIik7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBnb3QgKz0gcmV0OworICAgICAgICAgIH0KKyAgICAgICAgICBjYXRjaCAoZW9mIDogRW9mKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkVORF9PRl9GSUxFLCAnQ2FuXCd0IHJlYWQgJGxlbiBieXRlcyEnKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZ290ICs9IHJldDsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZ290OwotICAgICAgfQorICAgIH0KIAogICAgIC8qKgogICAgICAqIFdyaXRlcyB0aGUgYnVmZmVyIHRvIHRoZSBvdXRwdXQKQEAgLTEzMCw0ICsxMzYsNCBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IEFic3RyYWN0TWV0aG9kRXJyb3IoKTsKICAgICB9CiAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RXcmFwcGluZ1NlcnZlclRyYW5zcG9ydC5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFdyYXBwaW5nU2VydmVyVHJhbnNwb3J0Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyMjcyZjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RXcmFwcGluZ1NlcnZlclRyYW5zcG9ydC5oeApAQCAtMCwwICsxLDQ3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OworCisKKy8qCisgICB3cmFwcyByZWFsIHRyYW5zcG9ydCwgcHJvdmlkZWQgYnkgY29uc3RydWN0b3IKKyovCitjbGFzcyBUV3JhcHBpbmdTZXJ2ZXJUcmFuc3BvcnQgZXh0ZW5kcyBUU2VydmVyVHJhbnNwb3J0IHsKKworICBwcml2YXRlIHZhciB0cmFuc3BvcnQoZGVmYXVsdCxudWxsKSA6IFRUcmFuc3BvcnQ7CisKKyAgcHVibGljIGZ1bmN0aW9uIG5ldyh0cmFuc3BvcnQgOiBUVHJhbnNwb3J0KSB7CisgICAgdGhpcy50cmFuc3BvcnQgPSB0cmFuc3BvcnQ7CisgIH0KKworICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gTGlzdGVuKCkgOiBWb2lkCisgIHsKKyAgfQorCisgIHByaXZhdGUgb3ZlcnJpZGUgZnVuY3Rpb24gQWNjZXB0SW1wbCgpIDogVFRyYW5zcG9ydAorICB7CisgICAgcmV0dXJuIHRyYW5zcG9ydDsKKyAgfQorCisgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBDbG9zZSgpIDogVm9pZAorICB7CisKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvdGVzdC9NYWtlZmlsZS5hbSBiL2xpYi9oYXhlL3Rlc3QvTWFrZWZpbGUuYW0KaW5kZXggN2QyOWY4MS4uMmI4YjI0NSAxMDA2NDQKLS0tIGEvbGliL2hheGUvdGVzdC9NYWtlZmlsZS5hbQorKysgYi9saWIvaGF4ZS90ZXN0L01ha2VmaWxlLmFtCkBAIC0xNywxMyArMTcsMTMgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLVRIUklGVCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0CiBUSFJJRlRDTUQgPSAkKFRIUklGVCkgLS1nZW4gaGF4ZSAtcgogVEhSSUZUVEVTVCA9ICQodG9wX3NyY2RpcikvdGVzdC9UaHJpZnRUZXN0LnRocmlmdAogQUdHUiA9ICQodG9wX3NyY2RpcikvY29udHJpYi9hc3luYy10ZXN0L2FnZ3IudGhyaWZ0CiBCRU5DSE1BUksgPSAkKHRvcF9zcmNkaXIpL2xpYi9yYi9iZW5jaG1hcmsvQmVuY2htYXJrLnRocmlmdAogCiBCSU5fQ1BQID0gYmluL01haW4tZGVidWcKK0JJTl9QSFAgPSBiaW4vcGhwL01haW4tZGVidWcucGhwCiAKIGdlbi1oYXhlL3RocmlmdC90ZXN0L1RocmlmdFRlc3QuaHg6ICQoVEhSSUZUVEVTVCkKIAkkKFRIUklGVENNRCkgJChUSFJJRlRURVNUKQpAQCAtMzQsNyArMzQsNyBAQAogZ2VuLWhheGUvdGhyaWZ0L3Rlc3QvQmVuY2htYXJrU2VydmljZS5oeDogJChCRU5DSE1BUkspCiAJJChUSFJJRlRDTUQpICQoQkVOQ0hNQVJLKQogCi1hbGwtbG9jYWw6ICQoQklOX0NQUCkKK2FsbC1sb2NhbDogJChCSU5fQ1BQKSAkKEJJTl9QSFApCiAKICQoQklOX0NQUCk6IFwKIAkJc3JjLyouaHggXApAQCAtNDQsNiArNDQsMTQgQEAKIAkJZ2VuLWhheGUvdGhyaWZ0L3Rlc3QvQmVuY2htYXJrU2VydmljZS5oeAogCSQoSEFYRSkgLS1jd2QgLiAgY3BwLmh4bWwKIAorJChCSU5fUEhQKTogXAorCQlzcmMvKi5oeCBcCisJCS4uL3NyYy9vcmcvYXBhY2hlL3RocmlmdC8qKi8qLmh4IFwKKwkJZ2VuLWhheGUvdGhyaWZ0L3Rlc3QvVGhyaWZ0VGVzdC5oeCBcCisJCWdlbi1oYXhlL3RocmlmdC90ZXN0L0FnZ3IuaHggXAorCQlnZW4taGF4ZS90aHJpZnQvdGVzdC9CZW5jaG1hcmtTZXJ2aWNlLmh4CisJJChIQVhFKSAtLWN3ZCAuICBwaHAuaHhtbAorCiAKICNUT0RPOiBvdGhlciBoYXhlIHRhcmdldHMKICMgICAgJChIQVhFKSAgLS1jd2QgLiAgY3NoYXJwCkBAIC01MSwxNSArNTksMTUgQEAKICMgICAgJChIQVhFKSAgLS1jd2QgLiAgamF2YQogIyAgICAkKEhBWEUpICAtLWN3ZCAuICBqYXZhc2NyaXB0CiAjICAgICQoSEFYRSkgIC0tY3dkIC4gIG5la28KLSMgICAgJChIQVhFKSAgLS1jd2QgLiAgcGhwCiAjICAgICQoSEFYRSkgIC0tY3dkIC4gIHB5dGhvbiAgIyBuZWVkcyBIYXhlIDMuMi4wCiAKIAogY2xlYW4tbG9jYWw6CiAJJChSTSkgLXIgZ2VuLWhheGUgYmluCiAKLWNoZWNrOiAkKEJJTl9DUFApCitjaGVjazogJChCSU5fQ1BQKSAkKEJJTl9QSFApCiAJJChCSU5fQ1BQKQorCXBocCAtZiAkKEJJTl9QSFApCiAKIEVYVFJBX0RJU1QgPSBcCiAgICAgICAgICAgICAgc3JjIFwKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3Rlc3QvcGhwLmh4bWwgYi9saWIvaGF4ZS90ZXN0L3BocC5oeG1sCmluZGV4IGI4NmU2NGMuLjE0ZjJiMmQgMTAwNjQ0Ci0tLSBhL2xpYi9oYXhlL3Rlc3QvcGhwLmh4bWwKKysrIGIvbGliL2hheGUvdGVzdC9waHAuaHhtbApAQCAtMjYsNyArMjYsOCBAQAogLW1haW4gTWFpbgogCiAjUEhQIHRhcmdldAotLXBocCBiaW4vVGVzdC5waHAKKy1waHAgYmluL3BocC8KKy0tcGhwLWZyb250IE1haW4tZGVidWcucGhwCiAKICNBZGQgZGVidWcgaW5mb3JtYXRpb24KIC1kZWJ1ZwpAQCAtMzUsNCArMzYsNCBAQAogIyItZGNlIG5vIiA6IGRvIG5vdCByZW1vdmUgdW51c2VkIGNvZGUKICMiLWRjZSBzdGQiIDogcmVtb3ZlIHVudXNlZCBjb2RlIGluIHRoZSBzdGQgbGliIChkZWZhdWx0KQogIyItZGNlIGZ1bGwiIDogcmVtb3ZlIGFsbCB1bnVzZWQgY29kZQotLWRjZSBmdWxsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorLWRjZSBmdWxsCmRpZmYgLS1naXQgYS9saWIvaHMvQ01ha2VMaXN0cy50eHQgYi9saWIvaHMvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIwYTMxOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ocy9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDkzIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyBSZWJ1aWxkIHdoZW4gYW55IG9mIHRoZXNlIGZpbGVzIGNoYW5nZXMKK3NldChoYXNrZWxsX3NvdXJjZXMKKyAgICBzcmMvVGhyaWZ0LmhzCisgICAgc3JjL1RocmlmdC9BcmJpdHJhcmllcy5ocworICAgIHNyYy9UaHJpZnQvUHJvdG9jb2wuaHMKKyAgICBzcmMvVGhyaWZ0L1Byb3RvY29sL0JpbmFyeS5ocworICAgIHNyYy9UaHJpZnQvUHJvdG9jb2wvQ29tcGFjdC5ocworICAgIHNyYy9UaHJpZnQvUHJvdG9jb2wvSlNPTi5ocworICAgIHNyYy9UaHJpZnQvU2VydmVyLmhzCisgICAgc3JjL1RocmlmdC9UcmFuc3BvcnQuaHMKKyAgICBzcmMvVGhyaWZ0L1RyYW5zcG9ydC9FbXB0eS5ocworICAgIHNyYy9UaHJpZnQvVHJhbnNwb3J0L0ZyYW1lZC5ocworICAgIHNyYy9UaHJpZnQvVHJhbnNwb3J0L0hhbmRsZS5ocworICAgIHNyYy9UaHJpZnQvVHJhbnNwb3J0L0h0dHBDbGllbnQuaHMKKyAgICBzcmMvVGhyaWZ0L1RyYW5zcG9ydC9JT0J1ZmZlci5ocworICAgIHNyYy9UaHJpZnQvVHlwZXMuaHMKKyAgICB0aHJpZnQuY2FiYWwKKykKKworaWYoQlVJTERfVEVTVElORykKKyAgICBsaXN0KEFQUEVORCBoYXNrZWxsX3NvcnVjZXMKKyAgICAgICAgdGVzdC9TcGVjLmhzCisgICAgICAgIHRlc3QvQmluYXJ5U3BlYy5ocworICAgICAgICB0ZXN0L0NvbXBhY3RTcGVjLmhzCisgICAgICAgIHRlc3QvSlNPTlNwZWMuaHMKKyAgICApCisgICAgc2V0KGhzX2VuYWJsZV90ZXN0ICItLWVuYWJsZS10ZXN0cyIpCitlbmRpZigpCisKK3NldChoYXNrZWxsX2FydGlmYWN0cyB0aHJpZnRfY2FiYWwuc3RhbXApCisjIEFkZGluZyAqLmhpIGZpbGVzIHNvIHRoYXQgYW55IG1pc3NpbmcgZmlsZSB0cmlnZ2VycyB0aGUgYnVpbGQKK2ZvcmVhY2goU1JDICR7aGFza2VsbF9zb3VyY2VzfSkKKyAgICBnZXRfZmlsZW5hbWVfY29tcG9uZW50KEVYICR7U1JDfSBFWFQpCisgICAgaWYoJHtFWH0gU1RSRVFVQUwgIi5ocyIpCisgICAgICAgIGZpbGUoUkVMQVRJVkVfUEFUSCBSRUwgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3NyYyAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vJHtTUkN9KQorICAgICAgICBnZXRfZmlsZW5hbWVfY29tcG9uZW50KERJUiAke1JFTH0gRElSRUNUT1JZKQorICAgICAgICBnZXRfZmlsZW5hbWVfY29tcG9uZW50KEJBU0UgJHtSRUx9IE5BTUVfV0UpCisgICAgICAgIGxpc3QoQVBQRU5EIGhhc2tlbGxfYXJ0aWZhY3RzIGRpc3QvYnVpbGQvJHtESVJ9LyR7QkFTRX0uaGkpCisgICAgZW5kaWYoKQorZW5kZm9yZWFjaCgpCisKK2lmKENNQUtFX0JVSUxEX1RZUEUgU1RSRVFVQUwgIkRlYnVnIikKKyAgICBzZXQoaHNfb3B0aW1pemUgLU8wKQorZWxzZWlmKENNQUtFX0JVSUxEX1RZUEUgU1RSRVFVQUwgIlJlbGVhc2UiKQorICAgIHNldChoc19vcHRpbWl6ZSAtTzEpCitlbmRpZigpCisKK2FkZF9jdXN0b21fY29tbWFuZCgKKyAgICBPVVRQVVQgJHtoYXNrZWxsX2FydGlmYWN0c30KKyAgICBDT01NQU5EICR7Q0FCQUx9IHVwZGF0ZQorICAgICMgQnVpbGQgZGVwZW5kZW5jaWVzIGZpcnN0IHdpdGhvdXQgLS1idWlsZGRpciwgb3RoZXJ3aXNlIGl0IGZhaWxzLgorICAgIENPTU1BTkQgJHtDQUJBTH0gaW5zdGFsbCAtLW9ubHktZGVwZW5kZW5jaWVzICR7aHNfZW5hYmxlX3Rlc3R9CisgICAgQ09NTUFORCAke0NBQkFMfSBjb25maWd1cmUgJHtoc19vcHRpbWl6ZX0gJHtoc19lbmFibGVfdGVzdH0gLS1idWlsZGRpcj0ke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZGlzdAorICAgIENPTU1BTkQgJHtDQUJBTH0gYnVpbGQgLS1idWlsZGRpcj0ke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZGlzdAorICAgIENPTU1BTkQgJHtDQUJBTH0gaW5zdGFsbCAtLWJ1aWxkZGlyPSR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9kaXN0CisgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIHRvdWNoICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnRfY2FiYWwuc3RhbXAKKyAgICBXT1JLSU5HX0RJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0KKyAgICBERVBFTkRTICR7aGFza2VsbF9zb3VyY2VzfQorICAgIENPTU1FTlQgIkJ1aWxkaW5nIEhhc2tlbGwgbGlicmFyeSIpCisKK2FkZF9jdXN0b21fdGFyZ2V0KGhhc2tlbGxfbGlicmFyeSBBTEwKKyAgICBERVBFTkRTICR7aGFza2VsbF9hcnRpZmFjdHN9KQorCitpZihCVUlMRF9URVNUSU5HKQorICAgIGFkZF90ZXN0KE5BTUUgSGFza2VsbENhYmFsQ2hlY2sKKyAgICAgICAgICAgIENPTU1BTkQgJHtDQUJBTH0gY2hlY2sKKyAgICAgICAgICAgIFdPUktJTkdfRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfSkKKyAgICBhZGRfdGVzdChOQU1FIEhhc2tlbGxDYWJhbFRlc3QKKyAgICAgICAgICAgICMgQ2FiYWwgZmFpbHMgdG8gZmluZCBidWlsdCBleGVjdXRhYmxlIHdoZW4gLS1idWlsZGRpciBpcyBzcGVjaWZpZWQuCisgICAgICAgICAgICAjIFNvIHdlIGludm9rZSB0aGUgZXhlY3V0YWJsZSBkaXJlY3RseS4KKyAgICAgICAgICAgICMgQ09NTUFORCAke0NBQkFMfSB0ZXN0IC0tYnVpbGRkaXI9JHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2Rpc3QKKyAgICAgICAgICAgICMgV09SS0lOR19ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9KQorICAgICAgICAgICAgQ09NTUFORCBkaXN0L2J1aWxkL3NwZWMvc3BlYykKK2VuZGlmKCkKZGlmZiAtLWdpdCBhL2xpYi9ocy9MSUNFTlNFIGIvbGliL2hzL0xJQ0VOU0UKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbGliL2hzL01ha2VmaWxlLmFtIGIvbGliL2hzL01ha2VmaWxlLmFtCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggNDU1MjljNy4uM2NkOGI1NwotLS0gYS9saWIvaHMvTWFrZWZpbGUuYW0KKysrIGIvbGliL2hzL01ha2VmaWxlLmFtCkBAIC0xOSwxMiArMTksMTQgQEAKIAogRVhUUkFfRElTVCA9IFwKIAljb2Rpbmdfc3RhbmRhcmRzLm1kIFwKKwlDTWFrZUxpc3RzLnR4dCBcCiAJTElDRU5TRSBcCiAJUkVBRE1FLm1kIFwKIAlTZXR1cC5saHMgXAogCVRPRE8gXAotCVRocmlmdC5jYWJhbCBcCi0Jc3JjCisJdGhyaWZ0LmNhYmFsIFwKKwlzcmMgXAorCXRlc3QKIAogYWxsLWxvY2FsOgogCSQoQ0FCQUwpIHVwZGF0ZQpAQCAtNDIsMyArNDQsNyBAQAogCiBjaGVjay1sb2NhbDoKIAkkKENBQkFMKSBjaGVjaworCSQoQ0FCQUwpIGluc3RhbGwgLS1vbmx5LWRlcGVuZGVuY2llcyAtLWVuYWJsZS10ZXN0cworCSQoQ0FCQUwpIGNvbmZpZ3VyZSAtLWVuYWJsZS10ZXN0cworCSQoQ0FCQUwpIGJ1aWxkCisJJChDQUJBTCkgdGVzdApkaWZmIC0tZ2l0IGEvbGliL2hzL1JFQURNRS5tZCBiL2xpYi9ocy9SRUFETUUubWQKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbGliL2hzL1RPRE8gYi9saWIvaHMvVE9ETwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9saWIvaHMvVGhyaWZ0LmNhYmFsIGIvbGliL2hzL1RocmlmdC5jYWJhbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGFhNjU1NS4uMDAwMDAwMAotLS0gYS9saWIvaHMvVGhyaWZ0LmNhYmFsCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLS0KLS0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLS0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0tLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0tLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0tLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0tLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS0tCi0tLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLS0KLS0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLS0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0tLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLS0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0tLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0tLSB1bmRlciB0aGUgTGljZW5zZS4KLS0tCi0KLU5hbWU6ICAgICAgICAgICB0aHJpZnQKLVZlcnNpb246ICAgICAgICAwLjkuMwotQ2FiYWwtVmVyc2lvbjogID49IDEuOAotTGljZW5zZTogICAgICAgIE90aGVyTGljZW5zZQotQ2F0ZWdvcnk6ICAgICAgIEZvcmVpZ24KLUJ1aWxkLVR5cGU6ICAgICBTaW1wbGUKLVN5bm9wc2lzOiAgICAgICBIYXNrZWxsIGJpbmRpbmdzIGZvciB0aGUgQXBhY2hlIFRocmlmdCBSUEMgc3lzdGVtCi1Ib21lcGFnZTogICAgICAgaHR0cDovL3RocmlmdC5hcGFjaGUub3JnCi1CdWctUmVwb3J0czogICAgaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQKLU1haW50YWluZXI6ICAgICBkZXZAdGhyaWZ0LmFwYWNoZS5vcmcKLUxpY2Vuc2UtRmlsZTogICBMSUNFTlNFCi0KLURlc2NyaXB0aW9uOgotICBIYXNrZWxsIGJpbmRpbmdzIGZvciB0aGUgQXBhY2hlIFRocmlmdCBSUEMgc3lzdGVtLiBSZXF1aXJlcyB0aGUgdXNlIG9mIHRoZSB0aHJpZnQgY29kZSBnZW5lcmF0b3IuCi0KLWZsYWcgbmV0d29yay11cmkKLSAgIGRlc2NyaXB0aW9uOiBHZXQgTmV0d29yay5VUkkgZnJvbSB0aGUgbmV0d29yay11cmkgcGFja2FnZQotICAgZGVmYXVsdDogVHJ1ZQotCi1MaWJyYXJ5Ci0gIEhzLVNvdXJjZS1EaXJzOgotICAgIHNyYwotICBCdWlsZC1EZXBlbmRzOgotICAgIGJhc2UgPj0gNCwgYmFzZSA8IDUsIGNvbnRhaW5lcnMsIGdoYy1wcmltLCBhdHRvcGFyc2VjLCBiaW5hcnksIGJ5dGVzdHJpbmcgPj0gMC4xMCwgaGFzaGFibGUsIEhUVFAsIHRleHQsIHVub3JkZXJlZC1jb250YWluZXJzLCB2ZWN0b3IsIFF1aWNrQ2hlY2ssIHNwbGl0Ci0gIGlmIGZsYWcobmV0d29yay11cmkpCi0gICAgIGJ1aWxkLWRlcGVuZHM6IG5ldHdvcmstdXJpID49IDIuNiwgbmV0d29yayA+PSAyLjYKLSAgZWxzZQotICAgICBidWlsZC1kZXBlbmRzOiBuZXR3b3JrIDwgMi42Ci0gIEV4cG9zZWQtTW9kdWxlczoKLSAgICBUaHJpZnQsCi0gICAgVGhyaWZ0LkFyYml0cmFyaWVzCi0gICAgVGhyaWZ0LlByb3RvY29sLAotICAgIFRocmlmdC5Qcm90b2NvbC5CaW5hcnksCi0gICAgVGhyaWZ0LlByb3RvY29sLkNvbXBhY3QsCi0gICAgVGhyaWZ0LlByb3RvY29sLkpTT04sCi0gICAgVGhyaWZ0LlNlcnZlciwKLSAgICBUaHJpZnQuVHJhbnNwb3J0LAotICAgIFRocmlmdC5UcmFuc3BvcnQuRW1wdHksCi0gICAgVGhyaWZ0LlRyYW5zcG9ydC5GcmFtZWQsCi0gICAgVGhyaWZ0LlRyYW5zcG9ydC5IYW5kbGUsCi0gICAgVGhyaWZ0LlRyYW5zcG9ydC5IdHRwQ2xpZW50LAotICAgIFRocmlmdC5UcmFuc3BvcnQuSU9CdWZmZXIsCi0gICAgVGhyaWZ0LlR5cGVzCi0gIEV4dGVuc2lvbnM6Ci0gICAgRGVyaXZlRGF0YVR5cGVhYmxlLAotICAgIEV4aXN0ZW50aWFsUXVhbnRpZmljYXRpb24sCi0gICAgRmxleGlibGVJbnN0YW5jZXMsCi0gICAgS2luZFNpZ25hdHVyZXMsCi0gICAgTWFnaWNIYXNoLAotICAgIFJhbmtOVHlwZXMsCi0gICAgUmVjb3JkV2lsZENhcmRzLAotICAgIFNjb3BlZFR5cGVWYXJpYWJsZXMsCi0gICAgVHlwZVN5bm9ueW1JbnN0YW5jZXMKZGlmZiAtLWdpdCBhL2xpYi9ocy9zcmMvVGhyaWZ0LmhzIGIvbGliL2hzL3NyYy9UaHJpZnQuaHMKaW5kZXggNThhMzA0Yi4uNjU4MDIwOSAxMDA2NDQKLS0tIGEvbGliL2hzL3NyYy9UaHJpZnQuaHMKKysrIGIvbGliL2hzL3NyYy9UaHJpZnQuaHMKQEAgLTkwLDEzICs5MCwxMyBAQAogICBkZXJpdmluZyAoIFNob3csIFR5cGVhYmxlICkKIGluc3RhbmNlIEV4Y2VwdGlvbiBBcHBFeG4KIAotd3JpdGVBcHBFeG4gOjogKFByb3RvY29sIHAsIFRyYW5zcG9ydCB0KSA9PiBwIHQgLT4gQXBwRXhuIC0+IElPICgpCit3cml0ZUFwcEV4biA6OiBQcm90b2NvbCBwID0+IHAgLT4gQXBwRXhuIC0+IElPICgpCiB3cml0ZUFwcEV4biBwdCBhZSA9IHdyaXRlVmFsIHB0ICQgVFN0cnVjdCAkIE1hcC5mcm9tTGlzdAogICAgICAgICAgICAgICAgICAgICBbICgxLCAoIm1lc3NhZ2UiLCBUU3RyaW5nICQgZW5jb2RlVXRmOCAkIHBhY2sgJCBhZV9tZXNzYWdlIGFlKSkKICAgICAgICAgICAgICAgICAgICAgLCAoMiwgKCJ0eXBlIiwgVEkzMiAkIGZyb21JbnRlZ3JhbCAkIGZyb21FbnVtIChhZV90eXBlIGFlKSkpCiAgICAgICAgICAgICAgICAgICAgIF0KIAotcmVhZEFwcEV4biA6OiAoUHJvdG9jb2wgcCwgVHJhbnNwb3J0IHQpID0+IHAgdCAtPiBJTyBBcHBFeG4KK3JlYWRBcHBFeG4gOjogUHJvdG9jb2wgcCA9PiBwIC0+IElPIEFwcEV4bgogcmVhZEFwcEV4biBwdCA9IGRvCiAgICAgbGV0IHR5cGVtYXAgPSBNYXAuZnJvbUxpc3QgWygxLCgibWVzc2FnZSIsVF9TVFJJTkcpKSwoMiwoInR5cGUiLFRfSTMyKSldCiAgICAgVFN0cnVjdCBmaWVsZHMgPC0gcmVhZFZhbCBwdCAkIFRfU1RSVUNUIHR5cGVtYXAKZGlmZiAtLWdpdCBhL2xpYi9ocy9zcmMvVGhyaWZ0L0FyYml0cmFyaWVzLmhzIGIvbGliL2hzL3NyYy9UaHJpZnQvQXJiaXRyYXJpZXMuaHMKaW5kZXggM2E2MGVkMi4uZTljMGZjMyAxMDA2NDQKLS0tIGEvbGliL2hzL3NyYy9UaHJpZnQvQXJiaXRyYXJpZXMuaHMKKysrIGIvbGliL2hzL3NyYy9UaHJpZnQvQXJiaXRyYXJpZXMuaHMKQEAgLTI2LDEyICsyNiw2IEBACiBpbnN0YW5jZSBBcmJpdHJhcnkgQnl0ZVN0cmluZyB3aGVyZQogICBhcmJpdHJhcnkgPSBCUy5wYWNrIC4gZmlsdGVyICgvPSAwKSA8JD4gYXJiaXRyYXJ5CiAKLWluc3RhbmNlIChPcmQgaywgQXJiaXRyYXJ5IGssIEFyYml0cmFyeSB2KSA9PiBBcmJpdHJhcnkgKE1hcCBrIHYpIHdoZXJlCi0gIGFyYml0cmFyeSA9IE1hcC5mcm9tTGlzdCA8JD4gYXJiaXRyYXJ5Ci0KLWluc3RhbmNlIChPcmQgaywgQXJiaXRyYXJ5IGspID0+IEFyYml0cmFyeSAoU2V0LlNldCBrKSB3aGVyZQotICBhcmJpdHJhcnkgPSBTZXQuZnJvbUxpc3QgPCQ+IGFyYml0cmFyeQotCiBpbnN0YW5jZSAoQXJiaXRyYXJ5IGspID0+IEFyYml0cmFyeSAoVmVjdG9yLlZlY3RvciBrKSB3aGVyZQogICBhcmJpdHJhcnkgPSBWZWN0b3IuZnJvbUxpc3QgPCQ+IGFyYml0cmFyeQogCmRpZmYgLS1naXQgYS9saWIvaHMvc3JjL1RocmlmdC9Qcm90b2NvbC5ocyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1Byb3RvY29sLmhzCmluZGV4IGVhNTg2NDIuLjY3YTkxNzUgMTAwNjQ0Ci0tLSBhL2xpYi9ocy9zcmMvVGhyaWZ0L1Byb3RvY29sLmhzCisrKyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1Byb3RvY29sLmhzCkBAIC0yMiwxOSArMjIsMTggQEAKIAogbW9kdWxlIFRocmlmdC5Qcm90b2NvbAogICAgICggUHJvdG9jb2woLi4pCisgICAgLCBTdGF0ZWxlc3NQcm90b2NvbCguLikKICAgICAsIFByb3RvY29sRXhuKC4uKQogICAgICwgUHJvdG9jb2xFeG5UeXBlKC4uKQogICAgICwgZ2V0VHlwZU9mCiAgICAgLCBydW5QYXJzZXIKLSAgICAsIHZlcnNpb25NYXNrCi0gICAgLCB2ZXJzaW9uMQogICAgICwgYnNUb0RvdWJsZQorICAgICwgYnNUb0RvdWJsZUxFCiAgICAgKSB3aGVyZQogCiBpbXBvcnQgQ29udHJvbC5FeGNlcHRpb24KIGltcG9ydCBEYXRhLkF0dG9wYXJzZWMuQnl0ZVN0cmluZwogaW1wb3J0IERhdGEuQml0cwotaW1wb3J0IERhdGEuQnl0ZVN0cmluZy5MYXp5IChCeXRlU3RyaW5nLCB0b1N0cmljdCkKIGltcG9ydCBEYXRhLkJ5dGVTdHJpbmcuVW5zYWZlCiBpbXBvcnQgRGF0YS5GdW5jdG9yICgoPCQ+KSkKIGltcG9ydCBEYXRhLkludApAQCAtNDMsMzcgKzQyLDI2IEBACiBpbXBvcnQgRGF0YS5UeXBlYWJsZSAoVHlwZWFibGUpCiBpbXBvcnQgRGF0YS5Xb3JkCiBpbXBvcnQgRm9yZWlnbi5QdHIgKGNhc3RQdHIpCi1pbXBvcnQgRm9yZWlnbi5TdG9yYWJsZSAoU3RvcmFibGUsIHBlZWssIHBva2UpCitpbXBvcnQgRm9yZWlnbi5TdG9yYWJsZSAocGVlaywgcG9rZSkKIGltcG9ydCBTeXN0ZW0uSU8uVW5zYWZlCiBpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZyBhcyBCUwogaW1wb3J0IHF1YWxpZmllZCBEYXRhLkhhc2hNYXAuU3RyaWN0IGFzIE1hcAoraW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcuTGF6eSBhcyBMQlMKIAotaW1wb3J0IFRocmlmdC5UeXBlcwogaW1wb3J0IFRocmlmdC5UcmFuc3BvcnQKLQotdmVyc2lvbk1hc2sgOjogSW50MzIKLXZlcnNpb25NYXNrID0gZnJvbUludGVncmFsICgweGZmZmYwMDAwIDo6IFdvcmQzMikKLQotdmVyc2lvbjEgOjogSW50MzIKLXZlcnNpb24xID0gZnJvbUludGVncmFsICgweDgwMDEwMDAwIDo6IFdvcmQzMikKK2ltcG9ydCBUaHJpZnQuVHlwZXMKIAogY2xhc3MgUHJvdG9jb2wgYSB3aGVyZQotICBnZXRUcmFuc3BvcnQgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IHQKKyAgcmVhZEJ5dGUgOjogYSAtPiBJTyBMQlMuQnl0ZVN0cmluZworICByZWFkVmFsIDo6IGEgLT4gVGhyaWZ0VHlwZSAtPiBJTyBUaHJpZnRWYWwKKyAgcmVhZE1lc3NhZ2UgOjogYSAtPiAoKFRleHQsIE1lc3NhZ2VUeXBlLCBJbnQzMikgLT4gSU8gYikgLT4gSU8gYgogCi0gIHdyaXRlTWVzc2FnZUJlZ2luIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiAoVGV4dCwgTWVzc2FnZVR5cGUsIEludDMyKSAtPiBJTyAoKQotICB3cml0ZU1lc3NhZ2VFbmQgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IElPICgpCi0gIHdyaXRlTWVzc2FnZUVuZCBfID0gcmV0dXJuICgpCi0gIAotICByZWFkTWVzc2FnZUJlZ2luIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBJTyAoVGV4dCwgTWVzc2FnZVR5cGUsIEludDMyKQotICByZWFkTWVzc2FnZUVuZCA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gSU8gKCkKLSAgcmVhZE1lc3NhZ2VFbmQgXyA9IHJldHVybiAoKQorICB3cml0ZVZhbCA6OiBhIC0+IFRocmlmdFZhbCAtPiBJTyAoKQorICB3cml0ZU1lc3NhZ2UgOjogYSAtPiAoVGV4dCwgTWVzc2FnZVR5cGUsIEludDMyKSAtPiBJTyAoKSAtPiBJTyAoKQogCi0gIHNlcmlhbGl6ZVZhbCA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gVGhyaWZ0VmFsIC0+IEJ5dGVTdHJpbmcKLSAgZGVzZXJpYWxpemVWYWwgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IFRocmlmdFR5cGUgLT4gQnl0ZVN0cmluZyAtPiBUaHJpZnRWYWwKLQotICB3cml0ZVZhbCA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gVGhyaWZ0VmFsIC0+IElPICgpCi0gIHdyaXRlVmFsIHAgPSB0V3JpdGUgKGdldFRyYW5zcG9ydCBwKSAuIHNlcmlhbGl6ZVZhbCBwCi0gIHJlYWRWYWwgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IFRocmlmdFR5cGUgLT4gSU8gVGhyaWZ0VmFsCitjbGFzcyBQcm90b2NvbCBhID0+IFN0YXRlbGVzc1Byb3RvY29sIGEgd2hlcmUKKyAgc2VyaWFsaXplVmFsIDo6IGEgLT4gVGhyaWZ0VmFsIC0+IExCUy5CeXRlU3RyaW5nCisgIGRlc2VyaWFsaXplVmFsIDo6IGEgLT4gVGhyaWZ0VHlwZSAtPiBMQlMuQnl0ZVN0cmluZyAtPiBUaHJpZnRWYWwKIAogZGF0YSBQcm90b2NvbEV4blR5cGUKICAgICA9IFBFX1VOS05PV04KQEAgLTEwMSwxMiArODksMTMgQEAKICAgVEkzMnt9IC0+IFRfSTMyCiAgIFRJNjR7fSAtPiBUX0k2NAogICBUU3RyaW5ne30gLT4gVF9TVFJJTkcKKyAgVEJpbmFyeXt9IC0+IFRfQklOQVJZCiAgIFREb3VibGV7fSAtPiBUX0RPVUJMRQogCi1ydW5QYXJzZXIgOjogKFByb3RvY29sIHAsIFRyYW5zcG9ydCB0LCBTaG93IGEpID0+IHAgdCAtPiBQYXJzZXIgYSAtPiBJTyBhCitydW5QYXJzZXIgOjogKFByb3RvY29sIHAsIFNob3cgYSkgPT4gcCAtPiBQYXJzZXIgYSAtPiBJTyBhCiBydW5QYXJzZXIgcHJvdCBwID0gcmVmaWxsID4+PSBnZXRSZXN1bHQgLiBwYXJzZSBwCiAgIHdoZXJlCi0gICAgcmVmaWxsID0gaGFuZGxlIGhhbmRsZUVPRiAkIHRvU3RyaWN0IDwkPiB0UmVhZCAoZ2V0VHJhbnNwb3J0IHByb3QpIDEKKyAgICByZWZpbGwgPSBoYW5kbGUgaGFuZGxlRU9GICQgTEJTLnRvU3RyaWN0IDwkPiByZWFkQnl0ZSBwcm90CiAgICAgZ2V0UmVzdWx0IChEb25lIF8gYSkgPSByZXR1cm4gYQogICAgIGdldFJlc3VsdCAoUGFydGlhbCBrKSA9IHJlZmlsbCA+Pj0gZ2V0UmVzdWx0IC4gawogICAgIGdldFJlc3VsdCBmID0gdGhyb3cgJCBQcm90b2NvbEV4biBQRV9JTlZBTElEX0RBVEEgKHNob3cgZikKQEAgLTExOSwxOCArMTA4LDIyIEBACiAtLSB0aGVyZWZvcmUgdGhlIGJlaGF2aW9yIG9mIHRoaXMgZnVuY3Rpb24gdmFyaWVzIGJhc2VkIG9uIHdoZXRoZXIgdGhlIGxvY2FsCiAtLSBtYWNoaW5lIGlzIGJpZyBlbmRpYW4gb3IgbGl0dGxlIGVuZGlhbi4KIGJzVG9Eb3VibGUgOjogQlMuQnl0ZVN0cmluZyAtPiBEb3VibGUKLWJzVG9Eb3VibGUgYnMgPSB1bnNhZmVEdXBhYmxlUGVyZm9ybUlPICQgdW5zYWZlVXNlQXNDU3RyaW5nIGJzIGNhc3RCcwotICB3aGVyZQorYnNUb0RvdWJsZUxFIDo6IEJTLkJ5dGVTdHJpbmcgLT4gRG91YmxlCiAjaWYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgotICAgIGNhc3RCcyBjaHJQdHIgPSBkbwotICAgICAgdyA8LSBwZWVrIChjYXN0UHRyIGNoclB0cikKLSAgICAgIHBva2UgKGNhc3RQdHIgY2hyUHRyKSAoYnl0ZVN3YXAgdykKLSAgICAgIHBlZWsgKGNhc3RQdHIgY2hyUHRyKQorYnNUb0RvdWJsZSBicyA9IHVuc2FmZUR1cGFibGVQZXJmb3JtSU8gJCB1bnNhZmVVc2VBc0NTdHJpbmcgYnMgY2FzdEJzU3dhcHBlZAorYnNUb0RvdWJsZUxFIGJzID0gdW5zYWZlRHVwYWJsZVBlcmZvcm1JTyAkIHVuc2FmZVVzZUFzQ1N0cmluZyBicyBjYXN0QnMKICNlbHNlCi0gICAgY2FzdEJzID0gcGVlayAuIGNhc3RQdHIKK2JzVG9Eb3VibGUgYnMgPSB1bnNhZmVEdXBhYmxlUGVyZm9ybUlPICQgdW5zYWZlVXNlQXNDU3RyaW5nIGJzIGNhc3RCcworYnNUb0RvdWJsZUxFIGJzID0gdW5zYWZlRHVwYWJsZVBlcmZvcm1JTyAkIHVuc2FmZVVzZUFzQ1N0cmluZyBicyBjYXN0QnNTd2FwcGVkCiAjZW5kaWYKIAotI2lmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKworY2FzdEJzU3dhcHBlZCBjaHJQdHIgPSBkbworICB3IDwtIHBlZWsgKGNhc3RQdHIgY2hyUHRyKQorICBwb2tlIChjYXN0UHRyIGNoclB0cikgKGJ5dGVTd2FwIHcpCisgIHBlZWsgKGNhc3RQdHIgY2hyUHRyKQorY2FzdEJzID0gcGVlayAuIGNhc3RQdHIKKwogLS0gfCBTd2FwIGVuZGlhbm5lc3Mgb2YgYSA2NC1iaXQgd29yZAogYnl0ZVN3YXAgOjogV29yZDY0IC0+IFdvcmQ2NAogYnl0ZVN3YXAgdyA9ICh3IGBzaGlmdExgIDU2IC4mLiAweEZGMDAwMDAwMDAwMDAwMDApIC58LgpAQCAtMTQxLDQgKzEzNCwzIEBACiAgICAgICAgICAgICAgKHcgYHNoaWZ0UmAgMjQgLiYuIDB4MDAwMDAwMDAwMEZGMDAwMCkgLnwuCiAgICAgICAgICAgICAgKHcgYHNoaWZ0UmAgNDAgLiYuIDB4MDAwMDAwMDAwMDAwRkYwMCkgLnwuCiAgICAgICAgICAgICAgKHcgYHNoaWZ0UmAgNTYgLiYuIDB4MDAwMDAwMDAwMDAwMDBGRikKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2hzL3NyYy9UaHJpZnQvUHJvdG9jb2wvQmluYXJ5LmhzIGIvbGliL2hzL3NyYy9UaHJpZnQvUHJvdG9jb2wvQmluYXJ5LmhzCmluZGV4IGFjNzg0ODMuLjdiMGFjZDkgMTAwNjQ0Ci0tLSBhL2xpYi9ocy9zcmMvVGhyaWZ0L1Byb3RvY29sL0JpbmFyeS5ocworKysgYi9saWIvaHMvc3JjL1RocmlmdC9Qcm90b2NvbC9CaW5hcnkuaHMKQEAgLTI1LDYgKzI1LDggQEAKIG1vZHVsZSBUaHJpZnQuUHJvdG9jb2wuQmluYXJ5CiAgICAgKCBtb2R1bGUgVGhyaWZ0LlByb3RvY29sCiAgICAgLCBCaW5hcnlQcm90b2NvbCguLikKKyAgICAsIHZlcnNpb25NYXNrCisgICAgLCB2ZXJzaW9uMQogICAgICkgd2hlcmUKIAogaW1wb3J0IENvbnRyb2wuRXhjZXB0aW9uICggdGhyb3cgKQpAQCAtMzUsNiArMzcsNyBAQAogaW1wb3J0IERhdGEuSW50CiBpbXBvcnQgRGF0YS5Nb25vaWQKIGltcG9ydCBEYXRhLlRleHQuTGF6eS5FbmNvZGluZyAoIGRlY29kZVV0ZjgsIGVuY29kZVV0ZjggKQoraW1wb3J0IERhdGEuV29yZAogCiBpbXBvcnQgVGhyaWZ0LlByb3RvY29sCiBpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydApAQCAtNDcsMzcgKzUwLDU1IEBACiBpbXBvcnQgcXVhbGlmaWVkIERhdGEuSGFzaE1hcC5TdHJpY3QgYXMgTWFwCiBpbXBvcnQgcXVhbGlmaWVkIERhdGEuVGV4dC5MYXp5IGFzIExUCiAKLWRhdGEgQmluYXJ5UHJvdG9jb2wgYSA9IEJpbmFyeVByb3RvY29sIGEKK3ZlcnNpb25NYXNrIDo6IEludDMyCit2ZXJzaW9uTWFzayA9IGZyb21JbnRlZ3JhbCAoMHhmZmZmMDAwMCA6OiBXb3JkMzIpCisKK3ZlcnNpb24xIDo6IEludDMyCit2ZXJzaW9uMSA9IGZyb21JbnRlZ3JhbCAoMHg4MDAxMDAwMCA6OiBXb3JkMzIpCisKK2RhdGEgQmluYXJ5UHJvdG9jb2wgYSA9IFRyYW5zcG9ydCBhID0+IEJpbmFyeVByb3RvY29sIGEKKworZ2V0VHJhbnNwb3J0IDo6IFRyYW5zcG9ydCB0ID0+IEJpbmFyeVByb3RvY29sIHQgLT4gdAorZ2V0VHJhbnNwb3J0IChCaW5hcnlQcm90b2NvbCB0KSA9IHQKIAogLS0gTk9URTogUmVhZGluZyBhbmQgV3JpdGluZyBmdW5jdGlvbnMgcmVseSBvbiBCdWlsZGVycyBhbmQgRGF0YS5CaW5hcnkgdG8KIC0tIGVuY29kZSBhbmQgZGVjb2RlIGRhdGEuICBEYXRhLkJpbmFyeSBhc3N1bWVzIHRoYXQgdGhlIGJpbmFyeSB2YWx1ZXMgaXQgaXMKIC0tIGVuY29kaW5nIHRvIGFuZCBkZWNvZGluZyBmcm9tIGFyZSBpbiBCSUcgRU5ESUFOIGZvcm1hdCwgYW5kIGNvbnZlcnRzIHRoZQogLS0gZW5kaWFubmVzcyBhcyBuZWNlc3NhcnkgdG8gbWF0Y2ggdGhlIGxvY2FsIG1hY2hpbmUuCi1pbnN0YW5jZSBQcm90b2NvbCBCaW5hcnlQcm90b2NvbCB3aGVyZQotICAgIGdldFRyYW5zcG9ydCAoQmluYXJ5UHJvdG9jb2wgdCkgPSB0CitpbnN0YW5jZSBUcmFuc3BvcnQgdCA9PiBQcm90b2NvbCAoQmluYXJ5UHJvdG9jb2wgdCkgd2hlcmUKKyAgICByZWFkQnl0ZSBwID0gdFJlYWRBbGwgKGdldFRyYW5zcG9ydCBwKSAxCisgICAgLS0gZmx1c2hUcmFuc3BvcnQgcCA9IHRGbHVzaCAoZ2V0VHJhbnNwb3J0IHApCisgICAgd3JpdGVNZXNzYWdlIHAgKG4sIHQsIHMpIGYgPSBkbworICAgICAgdFdyaXRlIChnZXRUcmFuc3BvcnQgcCkgbWVzc2FnZUJlZ2luCisgICAgICBmCisgICAgICB0Rmx1c2ggJCBnZXRUcmFuc3BvcnQgcAorICAgICAgd2hlcmUKKyAgICAgICAgbWVzc2FnZUJlZ2luID0gdG9MYXp5Qnl0ZVN0cmluZyAkCisgICAgICAgICAgYnVpbGRCaW5hcnlWYWx1ZSAoVEkzMiAodmVyc2lvbjEgLnwuIGZyb21JbnRlZ3JhbCAoZnJvbUVudW0gdCkpKSA8PgorICAgICAgICAgIGJ1aWxkQmluYXJ5VmFsdWUgKFRTdHJpbmcgJCBlbmNvZGVVdGY4IG4pIDw+CisgICAgICAgICAgYnVpbGRCaW5hcnlWYWx1ZSAoVEkzMiBzKQogCi0gICAgd3JpdGVNZXNzYWdlQmVnaW4gcCAobiwgdCwgcykgPSB0V3JpdGUgKGdldFRyYW5zcG9ydCBwKSAkIHRvTGF6eUJ5dGVTdHJpbmcgJAotICAgICAgICBidWlsZEJpbmFyeVZhbHVlIChUSTMyICh2ZXJzaW9uMSAufC4gZnJvbUludGVncmFsIChmcm9tRW51bSB0KSkpIDw+Ci0gICAgICAgIGJ1aWxkQmluYXJ5VmFsdWUgKFRTdHJpbmcgJCBlbmNvZGVVdGY4IG4pIDw+Ci0gICAgICAgIGJ1aWxkQmluYXJ5VmFsdWUgKFRJMzIgcykKKyAgICByZWFkTWVzc2FnZSBwID0gKHJlYWRNZXNzYWdlQmVnaW4gcCA+Pj0pCisgICAgICB3aGVyZQorICAgICAgICByZWFkTWVzc2FnZUJlZ2luIHAgPSBydW5QYXJzZXIgcCAkIGRvCisgICAgICAgICAgVEkzMiB2ZXIgPC0gcGFyc2VCaW5hcnlWYWx1ZSBUX0kzMgorICAgICAgICAgIGlmIHZlciAuJi4gdmVyc2lvbk1hc2sgLz0gdmVyc2lvbjEKKyAgICAgICAgICAgIHRoZW4gdGhyb3cgJCBQcm90b2NvbEV4biBQRV9CQURfVkVSU0lPTiAiTWlzc2luZyB2ZXJzaW9uIGlkZW50aWZpZXIiCisgICAgICAgICAgICBlbHNlIGRvCisgICAgICAgICAgICAgIFRTdHJpbmcgcyA8LSBwYXJzZUJpbmFyeVZhbHVlIFRfU1RSSU5HCisgICAgICAgICAgICAgIFRJMzIgc3ogPC0gcGFyc2VCaW5hcnlWYWx1ZSBUX0kzMgorICAgICAgICAgICAgICByZXR1cm4gKGRlY29kZVV0ZjggcywgdG9FbnVtICQgZnJvbUludGVncmFsICQgdmVyIC4mLiAweEZGLCBzeikKIAotICAgIHJlYWRNZXNzYWdlQmVnaW4gcCA9IHJ1blBhcnNlciBwICQgZG8KLSAgICAgIFRJMzIgdmVyIDwtIHBhcnNlQmluYXJ5VmFsdWUgVF9JMzIKLSAgICAgIGlmIHZlciAuJi4gdmVyc2lvbk1hc2sgLz0gdmVyc2lvbjEKLSAgICAgICAgdGhlbiB0aHJvdyAkIFByb3RvY29sRXhuIFBFX0JBRF9WRVJTSU9OICJNaXNzaW5nIHZlcnNpb24gaWRlbnRpZmllciIKLSAgICAgICAgZWxzZSBkbwotICAgICAgICAgIFRTdHJpbmcgcyA8LSBwYXJzZUJpbmFyeVZhbHVlIFRfU1RSSU5HCi0gICAgICAgICAgVEkzMiBzeiA8LSBwYXJzZUJpbmFyeVZhbHVlIFRfSTMyCi0gICAgICAgICAgcmV0dXJuIChkZWNvZGVVdGY4IHMsIHRvRW51bSAkIGZyb21JbnRlZ3JhbCAkIHZlciAuJi4gMHhGRiwgc3opCisgICAgd3JpdGVWYWwgcCA9IHRXcml0ZSAoZ2V0VHJhbnNwb3J0IHApIC4gdG9MYXp5Qnl0ZVN0cmluZyAuIGJ1aWxkQmluYXJ5VmFsdWUKKyAgICByZWFkVmFsIHAgPSBydW5QYXJzZXIgcCAuIHBhcnNlQmluYXJ5VmFsdWUKIAoraW5zdGFuY2UgVHJhbnNwb3J0IHQgPT4gU3RhdGVsZXNzUHJvdG9jb2wgKEJpbmFyeVByb3RvY29sIHQpIHdoZXJlCiAgICAgc2VyaWFsaXplVmFsIF8gPSB0b0xhenlCeXRlU3RyaW5nIC4gYnVpbGRCaW5hcnlWYWx1ZQogICAgIGRlc2VyaWFsaXplVmFsIF8gdHkgYnMgPQogICAgICAgY2FzZSBMUC5laXRoZXJSZXN1bHQgJCBMUC5wYXJzZSAocGFyc2VCaW5hcnlWYWx1ZSB0eSkgYnMgb2YKICAgICAgICAgTGVmdCBzIC0+IGVycm9yIHMKICAgICAgICAgUmlnaHQgdmFsIC0+IHZhbAogCi0gICAgcmVhZFZhbCBwID0gcnVuUGFyc2VyIHAgLiBwYXJzZUJpbmFyeVZhbHVlCi0KIC0tIHwgV3JpdGluZyBGdW5jdGlvbnMKIGJ1aWxkQmluYXJ5VmFsdWUgOjogVGhyaWZ0VmFsIC0+IEJ1aWxkZXIKIGJ1aWxkQmluYXJ5VmFsdWUgKFRTdHJ1Y3QgZmllbGRzKSA9IGJ1aWxkQmluYXJ5U3RydWN0IGZpZWxkcyA8PiBidWlsZFR5cGUgVF9TVE9QCkBAIC0xMDQsNiArMTI1LDcgQEAKIGJ1aWxkQmluYXJ5VmFsdWUgKFRTdHJpbmcgcykgPSBpbnQzMkJFIGxlbiA8PiBsYXp5Qnl0ZVN0cmluZyBzCiAgIHdoZXJlCiAgICAgbGVuIDo6IEludDMyID0gZnJvbUludGVncmFsIChMQlMubGVuZ3RoIHMpCitidWlsZEJpbmFyeVZhbHVlIChUQmluYXJ5IHMpID0gYnVpbGRCaW5hcnlWYWx1ZSAoVFN0cmluZyBzKQogCiBidWlsZEJpbmFyeVN0cnVjdCA6OiBNYXAuSGFzaE1hcCBJbnQxNiAoTFQuVGV4dCwgVGhyaWZ0VmFsKSAtPiBCdWlsZGVyCiBidWlsZEJpbmFyeVN0cnVjdCA9IE1hcC5mb2xkcldpdGhLZXkgY29tYmluZSBtZW1wdHkKQEAgLTEyMSw3ICsxNDMsNyBAQAogCiAtLSB8IFJlYWRpbmcgRnVuY3Rpb25zCiBwYXJzZUJpbmFyeVZhbHVlIDo6IFRocmlmdFR5cGUgLT4gUC5QYXJzZXIgVGhyaWZ0VmFsCi1wYXJzZUJpbmFyeVZhbHVlIChUX1NUUlVDVCBfKSA9IFRTdHJ1Y3QgPCQ+IHBhcnNlQmluYXJ5U3RydWN0CitwYXJzZUJpbmFyeVZhbHVlIChUX1NUUlVDVCB0bWFwKSA9IFRTdHJ1Y3QgPCQ+IHBhcnNlQmluYXJ5U3RydWN0IHRtYXAKIHBhcnNlQmluYXJ5VmFsdWUgKFRfTUFQIF8gXykgPSBkbwogICBrdCA8LSBwYXJzZVR5cGUKICAgdnQgPC0gcGFyc2VUeXBlCkBAIC0xNDEsMTggKzE2MywyMyBAQAogcGFyc2VCaW5hcnlWYWx1ZSBUX0kzMiA9IFRJMzIgLiBCaW5hcnkuZGVjb2RlIC4gTEJTLmZyb21TdHJpY3QgPCQ+IFAudGFrZSA0CiBwYXJzZUJpbmFyeVZhbHVlIFRfSTY0ID0gVEk2NCAuIEJpbmFyeS5kZWNvZGUgLiBMQlMuZnJvbVN0cmljdCA8JD4gUC50YWtlIDgKIHBhcnNlQmluYXJ5VmFsdWUgVF9ET1VCTEUgPSBURG91YmxlIC4gYnNUb0RvdWJsZSA8JD4gUC50YWtlIDgKLXBhcnNlQmluYXJ5VmFsdWUgVF9TVFJJTkcgPSBkbwotICBpIDo6IEludDMyICA8LSBCaW5hcnkuZGVjb2RlIC4gTEJTLmZyb21TdHJpY3QgPCQ+IFAudGFrZSA0Ci0gIFRTdHJpbmcgLiBMQlMuZnJvbVN0cmljdCA8JD4gUC50YWtlIChmcm9tSW50ZWdyYWwgaSkKK3BhcnNlQmluYXJ5VmFsdWUgVF9TVFJJTkcgPSBwYXJzZUJpbmFyeVN0cmluZyBUU3RyaW5nCitwYXJzZUJpbmFyeVZhbHVlIFRfQklOQVJZID0gcGFyc2VCaW5hcnlTdHJpbmcgVEJpbmFyeQogcGFyc2VCaW5hcnlWYWx1ZSB0eSA9IGVycm9yICQgIkNhbm5vdCByZWFkIHZhbHVlIG9mIHR5cGUgIiArKyBzaG93IHR5CiAKLXBhcnNlQmluYXJ5U3RydWN0IDo6IFAuUGFyc2VyIChNYXAuSGFzaE1hcCBJbnQxNiAoTFQuVGV4dCwgVGhyaWZ0VmFsKSkKLXBhcnNlQmluYXJ5U3RydWN0ID0gTWFwLmZyb21MaXN0IDwkPiBQLm1hbnlUaWxsIHBhcnNlRmllbGQgKG1hdGNoVHlwZSBUX1NUT1ApCitwYXJzZUJpbmFyeVN0cmluZyB0eSA9IGRvCisgIGkgOjogSW50MzIgIDwtIEJpbmFyeS5kZWNvZGUgLiBMQlMuZnJvbVN0cmljdCA8JD4gUC50YWtlIDQKKyAgdHkgLiBMQlMuZnJvbVN0cmljdCA8JD4gUC50YWtlIChmcm9tSW50ZWdyYWwgaSkKKworcGFyc2VCaW5hcnlTdHJ1Y3QgOjogVHlwZU1hcCAtPiBQLlBhcnNlciAoTWFwLkhhc2hNYXAgSW50MTYgKExULlRleHQsIFRocmlmdFZhbCkpCitwYXJzZUJpbmFyeVN0cnVjdCB0bWFwID0gTWFwLmZyb21MaXN0IDwkPiBQLm1hbnlUaWxsIHBhcnNlRmllbGQgKG1hdGNoVHlwZSBUX1NUT1ApCiAgIHdoZXJlCiAgICAgcGFyc2VGaWVsZCA9IGRvCiAgICAgICB0IDwtIHBhcnNlVHlwZQogICAgICAgbiA8LSBCaW5hcnkuZGVjb2RlIC4gTEJTLmZyb21TdHJpY3QgPCQ+IFAudGFrZSAyCi0gICAgICB2IDwtIHBhcnNlQmluYXJ5VmFsdWUgdAorICAgICAgdiA8LSBjYXNlICh0LCBNYXAubG9va3VwIG4gdG1hcCkgb2YKKyAgICAgICAgICAgICAoVF9TVFJJTkcsIEp1c3QgKF8sIFRfQklOQVJZKSkgLT4gcGFyc2VCaW5hcnlWYWx1ZSBUX0JJTkFSWQorICAgICAgICAgICAgIF8gLT4gcGFyc2VCaW5hcnlWYWx1ZSB0CiAgICAgICByZXR1cm4gKG4sICgiIiwgdikpCiAKIHBhcnNlQmluYXJ5TWFwIDo6IFRocmlmdFR5cGUgLT4gVGhyaWZ0VHlwZSAtPiBJbnQzMiAtPiBQLlBhcnNlciBbKFRocmlmdFZhbCwgVGhyaWZ0VmFsKV0KZGlmZiAtLWdpdCBhL2xpYi9ocy9zcmMvVGhyaWZ0L1Byb3RvY29sL0NvbXBhY3QuaHMgYi9saWIvaHMvc3JjL1RocmlmdC9Qcm90b2NvbC9Db21wYWN0LmhzCmluZGV4IGEzMjlmNGUuLmYyMzk3MGEgMTAwNjQ0Ci0tLSBhL2xpYi9ocy9zcmMvVGhyaWZ0L1Byb3RvY29sL0NvbXBhY3QuaHMKKysrIGIvbGliL2hzL3NyYy9UaHJpZnQvUHJvdG9jb2wvQ29tcGFjdC5ocwpAQCAtMjUsMTAgKzI1LDExIEBACiBtb2R1bGUgVGhyaWZ0LlByb3RvY29sLkNvbXBhY3QKICAgICAoIG1vZHVsZSBUaHJpZnQuUHJvdG9jb2wKICAgICAsIENvbXBhY3RQcm90b2NvbCguLikKKyAgICAsIHBhcnNlVmFyaW50CisgICAgLCBidWlsZFZhcmludAogICAgICkgd2hlcmUKIAogaW1wb3J0IENvbnRyb2wuQXBwbGljYXRpdmUKLWltcG9ydCBDb250cm9sLkV4Y2VwdGlvbiAoIHRocm93ICkKIGltcG9ydCBDb250cm9sLk1vbmFkCiBpbXBvcnQgRGF0YS5BdHRvcGFyc2VjLkJ5dGVTdHJpbmcgYXMgUAogaW1wb3J0IERhdGEuQXR0b3BhcnNlYy5CeXRlU3RyaW5nLkxhenkgYXMgTFAKQEAgLTQwLDcgKzQxLDcgQEAKIGltcG9ydCBEYXRhLldvcmQKIGltcG9ydCBEYXRhLlRleHQuTGF6eS5FbmNvZGluZyAoIGRlY29kZVV0ZjgsIGVuY29kZVV0ZjggKQogCi1pbXBvcnQgVGhyaWZ0LlByb3RvY29sIGhpZGluZyAodmVyc2lvbk1hc2spCitpbXBvcnQgVGhyaWZ0LlByb3RvY29sCiBpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydAogaW1wb3J0IFRocmlmdC5UeXBlcwogCkBAIC01NSw3ICs1Niw3IEBACiBkYXRhIENvbXBhY3RQcm90b2NvbCBhID0gQ29tcGFjdFByb3RvY29sIGEKICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBeIENvbnN0dWN0IGEgJ0NvbXBhY3RQcm90b2NvbCcgd2l0aCBhICdUcmFuc3BvcnQnCiAKLXByb3RvY29sSUQsIHZlcnNpb24sIHR5cGVNYXNrIDo6IEludDgKK3Byb3RvY29sSUQsIHZlcnNpb24sIHZlcnNpb25NYXNrLCB0eXBlTWFzaywgdHlwZUJpdHMgOjogV29yZDgKIHByb3RvY29sSUQgID0gMHg4MiAtLSAxMDAwIDAwMTAKIHZlcnNpb24gICAgID0gMHgwMQogdmVyc2lvbk1hc2sgPSAweDFmIC0tIDAwMDEgMTExMQpAQCAtNjQsMzggKzY1LDQ3IEBACiB0eXBlU2hpZnRBbW91bnQgOjogSW50CiB0eXBlU2hpZnRBbW91bnQgPSA1CiAKK2dldFRyYW5zcG9ydCA6OiBUcmFuc3BvcnQgdCA9PiBDb21wYWN0UHJvdG9jb2wgdCAtPiB0CitnZXRUcmFuc3BvcnQgKENvbXBhY3RQcm90b2NvbCB0KSA9IHQKIAotaW5zdGFuY2UgUHJvdG9jb2wgQ29tcGFjdFByb3RvY29sIHdoZXJlCi0gICAgZ2V0VHJhbnNwb3J0IChDb21wYWN0UHJvdG9jb2wgdCkgPSB0CitpbnN0YW5jZSBUcmFuc3BvcnQgdCA9PiBQcm90b2NvbCAoQ29tcGFjdFByb3RvY29sIHQpIHdoZXJlCisgICAgcmVhZEJ5dGUgcCA9IHRSZWFkQWxsIChnZXRUcmFuc3BvcnQgcCkgMQorICAgIHdyaXRlTWVzc2FnZSBwIChuLCB0LCBzKSBmID0gZG8KKyAgICAgIHRXcml0ZSAoZ2V0VHJhbnNwb3J0IHApIG1lc3NhZ2VCZWdpbgorICAgICAgZgorICAgICAgdEZsdXNoICQgZ2V0VHJhbnNwb3J0IHAKKyAgICAgIHdoZXJlCisgICAgICAgIG1lc3NhZ2VCZWdpbiA9IHRvTGF6eUJ5dGVTdHJpbmcgJAorICAgICAgICAgIEIud29yZDggcHJvdG9jb2xJRCA8PgorICAgICAgICAgIEIud29yZDggKCh2ZXJzaW9uIC4mLiB2ZXJzaW9uTWFzaykgLnwuCisgICAgICAgICAgICAgICAgICAoKChmcm9tSW50ZWdyYWwgJCBmcm9tRW51bSB0KSBgc2hpZnRMYAorICAgICAgICAgICAgICAgICAgdHlwZVNoaWZ0QW1vdW50KSAuJi4gdHlwZU1hc2spKSA8PgorICAgICAgICAgIGJ1aWxkVmFyaW50IChpMzJUb1ppZ1phZyBzKSA8PgorICAgICAgICAgIGJ1aWxkQ29tcGFjdFZhbHVlIChUU3RyaW5nICQgZW5jb2RlVXRmOCBuKQogCi0gICAgd3JpdGVNZXNzYWdlQmVnaW4gcCAobiwgdCwgcykgPSB0V3JpdGUgKGdldFRyYW5zcG9ydCBwKSAkIHRvTGF6eUJ5dGVTdHJpbmcgJAotICAgICAgQi5pbnQ4IHByb3RvY29sSUQgPD4KLSAgICAgIEIuaW50OCAoKHZlcnNpb24gLiYuIHZlcnNpb25NYXNrKSAufC4KLSAgICAgICAgICAgICAgKCgoZnJvbUludGVncmFsICQgZnJvbUVudW0gdCkgYHNoaWZ0TGAKLSAgICAgICAgICAgICAgICB0eXBlU2hpZnRBbW91bnQpIC4mLiB0eXBlTWFzaykpIDw+Ci0gICAgICBidWlsZFZhcmludCAoaTMyVG9aaWdaYWcgcykgPD4KLSAgICAgIGJ1aWxkQ29tcGFjdFZhbHVlIChUU3RyaW5nICQgZW5jb2RlVXRmOCBuKQotICAgIAotICAgIHJlYWRNZXNzYWdlQmVnaW4gcCA9IHJ1blBhcnNlciBwICQgZG8KLSAgICAgIHBpZCA8LSBmcm9tSW50ZWdyYWwgPCQ+IFAuYW55V29yZDgKLSAgICAgIHdoZW4gKHBpZCAvPSBwcm90b2NvbElEKSAkIGVycm9yICJCYWQgUHJvdG9jb2wgSUQiCi0gICAgICB3IDwtIGZyb21JbnRlZ3JhbCA8JD4gUC5hbnlXb3JkOAotICAgICAgbGV0IHZlciA9IHcgLiYuIHZlcnNpb25NYXNrIAotICAgICAgd2hlbiAodmVyIC89IHZlcnNpb24pICQgZXJyb3IgIkJhZCBQcm90b2NvbCB2ZXJzaW9uIgotICAgICAgbGV0IHR5cCA9ICh3IGBzaGlmdFJgIHR5cGVTaGlmdEFtb3VudCkgLiYuIHR5cGVCaXRzCi0gICAgICBzZXFJZCA8LSBwYXJzZVZhcmludCB6aWdaYWdUb0kzMgotICAgICAgVFN0cmluZyBuYW1lIDwtIHBhcnNlQ29tcGFjdFZhbHVlIFRfU1RSSU5HCi0gICAgICByZXR1cm4gKGRlY29kZVV0ZjggbmFtZSwgdG9FbnVtICQgZnJvbUludGVncmFsICQgdHlwLCBzZXFJZCkKKyAgICByZWFkTWVzc2FnZSBwIGYgPSByZWFkTWVzc2FnZUJlZ2luID4+PSBmCisgICAgICB3aGVyZQorICAgICAgICByZWFkTWVzc2FnZUJlZ2luID0gcnVuUGFyc2VyIHAgJCBkbworICAgICAgICAgIHBpZCA8LSBmcm9tSW50ZWdyYWwgPCQ+IFAuYW55V29yZDgKKyAgICAgICAgICB3aGVuIChwaWQgLz0gcHJvdG9jb2xJRCkgJCBlcnJvciAiQmFkIFByb3RvY29sIElEIgorICAgICAgICAgIHcgPC0gZnJvbUludGVncmFsIDwkPiBQLmFueVdvcmQ4CisgICAgICAgICAgbGV0IHZlciA9IHcgLiYuIHZlcnNpb25NYXNrCisgICAgICAgICAgd2hlbiAodmVyIC89IHZlcnNpb24pICQgZXJyb3IgIkJhZCBQcm90b2NvbCB2ZXJzaW9uIgorICAgICAgICAgIGxldCB0eXAgPSAodyBgc2hpZnRSYCB0eXBlU2hpZnRBbW91bnQpIC4mLiB0eXBlQml0cworICAgICAgICAgIHNlcUlkIDwtIHBhcnNlVmFyaW50IHppZ1phZ1RvSTMyCisgICAgICAgICAgVFN0cmluZyBuYW1lIDwtIHBhcnNlQ29tcGFjdFZhbHVlIFRfU1RSSU5HCisgICAgICAgICAgcmV0dXJuIChkZWNvZGVVdGY4IG5hbWUsIHRvRW51bSAkIGZyb21JbnRlZ3JhbCAkIHR5cCwgc2VxSWQpCiAKKyAgICB3cml0ZVZhbCBwID0gdFdyaXRlIChnZXRUcmFuc3BvcnQgcCkgLiB0b0xhenlCeXRlU3RyaW5nIC4gYnVpbGRDb21wYWN0VmFsdWUKKyAgICByZWFkVmFsIHAgdHkgPSBydW5QYXJzZXIgcCAkIHBhcnNlQ29tcGFjdFZhbHVlIHR5CisKK2luc3RhbmNlIFRyYW5zcG9ydCB0ID0+IFN0YXRlbGVzc1Byb3RvY29sIChDb21wYWN0UHJvdG9jb2wgdCkgd2hlcmUKICAgICBzZXJpYWxpemVWYWwgXyA9IHRvTGF6eUJ5dGVTdHJpbmcgLiBidWlsZENvbXBhY3RWYWx1ZQogICAgIGRlc2VyaWFsaXplVmFsIF8gdHkgYnMgPQogICAgICAgY2FzZSBMUC5laXRoZXJSZXN1bHQgJCBMUC5wYXJzZSAocGFyc2VDb21wYWN0VmFsdWUgdHkpIGJzIG9mCiAgICAgICAgIExlZnQgcyAtPiBlcnJvciBzCiAgICAgICAgIFJpZ2h0IHZhbCAtPiB2YWwKIAotICAgIHJlYWRWYWwgcCB0eSA9IHJ1blBhcnNlciBwICQgcGFyc2VDb21wYWN0VmFsdWUgdHkKLQotCiAtLSB8IFdyaXRpbmcgRnVuY3Rpb25zCiBidWlsZENvbXBhY3RWYWx1ZSA6OiBUaHJpZnRWYWwgLT4gQnVpbGRlcgogYnVpbGRDb21wYWN0VmFsdWUgKFRTdHJ1Y3QgZmllbGRzKSA9IGJ1aWxkQ29tcGFjdFN0cnVjdCBmaWVsZHMKQEAgLTEyMCwxMCArMTMwLDExIEBACiBidWlsZENvbXBhY3RWYWx1ZSAoVEkxNiBpKSA9IGJ1aWxkVmFyaW50ICQgaTE2VG9aaWdaYWcgaQogYnVpbGRDb21wYWN0VmFsdWUgKFRJMzIgaSkgPSBidWlsZFZhcmludCAkIGkzMlRvWmlnWmFnIGkKIGJ1aWxkQ29tcGFjdFZhbHVlIChUSTY0IGkpID0gYnVpbGRWYXJpbnQgJCBpNjRUb1ppZ1phZyBpCi1idWlsZENvbXBhY3RWYWx1ZSAoVERvdWJsZSBkKSA9IGRvdWJsZUJFIGQKK2J1aWxkQ29tcGFjdFZhbHVlIChURG91YmxlIGQpID0gZG91YmxlTEUgZAogYnVpbGRDb21wYWN0VmFsdWUgKFRTdHJpbmcgcykgPSBidWlsZFZhcmludCBsZW4gPD4gbGF6eUJ5dGVTdHJpbmcgcwogICB3aGVyZQogICAgIGxlbiA9IGZyb21JbnRlZ3JhbCAoTEJTLmxlbmd0aCBzKSA6OiBXb3JkMzIKK2J1aWxkQ29tcGFjdFZhbHVlIChUQmluYXJ5IHMpID0gYnVpbGRDb21wYWN0VmFsdWUgKFRTdHJpbmcgcykKIAogYnVpbGRDb21wYWN0U3RydWN0IDo6IE1hcC5IYXNoTWFwIEludDE2IChMVC5UZXh0LCBUaHJpZnRWYWwpIC0+IEJ1aWxkZXIKIGJ1aWxkQ29tcGFjdFN0cnVjdCA9IGZsaXAgKGxvb3AgMCkgbWVtcHR5IC4gTWFwLnRvTGlzdApAQCAtMTQ2LDcgKzE1Nyw3IEBACiAKIC0tIHwgUmVhZGluZyBGdW5jdGlvbnMKIHBhcnNlQ29tcGFjdFZhbHVlIDo6IFRocmlmdFR5cGUgLT4gUGFyc2VyIFRocmlmdFZhbAotcGFyc2VDb21wYWN0VmFsdWUgKFRfU1RSVUNUIF8pID0gVFN0cnVjdCA8JD4gcGFyc2VDb21wYWN0U3RydWN0CitwYXJzZUNvbXBhY3RWYWx1ZSAoVF9TVFJVQ1QgdG1hcCkgPSBUU3RydWN0IDwkPiBwYXJzZUNvbXBhY3RTdHJ1Y3QgdG1hcAogcGFyc2VDb21wYWN0VmFsdWUgKFRfTUFQIGt0JyB2dCcpID0gZG8KICAgbiA8LSBwYXJzZVZhcmludCBpZAogICBpZiBuID09IDAKQEAgLTE2MywxNCArMTc0LDE3IEBACiBwYXJzZUNvbXBhY3RWYWx1ZSBUX0kxNiA9IFRJMTYgPCQ+IHBhcnNlVmFyaW50IHppZ1phZ1RvSTE2CiBwYXJzZUNvbXBhY3RWYWx1ZSBUX0kzMiA9IFRJMzIgPCQ+IHBhcnNlVmFyaW50IHppZ1phZ1RvSTMyCiBwYXJzZUNvbXBhY3RWYWx1ZSBUX0k2NCA9IFRJNjQgPCQ+IHBhcnNlVmFyaW50IHppZ1phZ1RvSTY0Ci1wYXJzZUNvbXBhY3RWYWx1ZSBUX0RPVUJMRSA9IFREb3VibGUgLiBic1RvRG91YmxlIDwkPiBQLnRha2UgOAotcGFyc2VDb21wYWN0VmFsdWUgVF9TVFJJTkcgPSBkbwotICBsZW4gOjogV29yZDMyIDwtIHBhcnNlVmFyaW50IGlkCi0gIFRTdHJpbmcgLiBMQlMuZnJvbVN0cmljdCA8JD4gUC50YWtlIChmcm9tSW50ZWdyYWwgbGVuKQorcGFyc2VDb21wYWN0VmFsdWUgVF9ET1VCTEUgPSBURG91YmxlIC4gYnNUb0RvdWJsZUxFIDwkPiBQLnRha2UgOAorcGFyc2VDb21wYWN0VmFsdWUgVF9TVFJJTkcgPSBwYXJzZUNvbXBhY3RTdHJpbmcgVFN0cmluZworcGFyc2VDb21wYWN0VmFsdWUgVF9CSU5BUlkgPSBwYXJzZUNvbXBhY3RTdHJpbmcgVEJpbmFyeQogcGFyc2VDb21wYWN0VmFsdWUgdHkgPSBlcnJvciAkICJDYW5ub3QgcmVhZCB2YWx1ZSBvZiB0eXBlICIgKysgc2hvdyB0eQogCi1wYXJzZUNvbXBhY3RTdHJ1Y3QgOjogUGFyc2VyIChNYXAuSGFzaE1hcCBJbnQxNiAoTFQuVGV4dCwgVGhyaWZ0VmFsKSkKLXBhcnNlQ29tcGFjdFN0cnVjdCA9IE1hcC5mcm9tTGlzdCA8JD4gcGFyc2VGaWVsZHMgMAorcGFyc2VDb21wYWN0U3RyaW5nIHR5ID0gZG8KKyAgbGVuIDo6IFdvcmQzMiA8LSBwYXJzZVZhcmludCBpZAorICB0eSAuIExCUy5mcm9tU3RyaWN0IDwkPiBQLnRha2UgKGZyb21JbnRlZ3JhbCBsZW4pCisKK3BhcnNlQ29tcGFjdFN0cnVjdCA6OiBUeXBlTWFwIC0+IFBhcnNlciAoTWFwLkhhc2hNYXAgSW50MTYgKExULlRleHQsIFRocmlmdFZhbCkpCitwYXJzZUNvbXBhY3RTdHJ1Y3QgdG1hcCA9IE1hcC5mcm9tTGlzdCA8JD4gcGFyc2VGaWVsZHMgMAogICB3aGVyZQogICAgIHBhcnNlRmllbGRzIDo6IEludDE2IC0+IFBhcnNlciBbKEludDE2LCAoTFQuVGV4dCwgVGhyaWZ0VmFsKSldCiAgICAgcGFyc2VGaWVsZHMgbGFzdElkID0gZG8KQEAgLTE4NSw3ICsxOTksOSBAQAogICAgICAgICAgICAgICAgICBlbHNlIHBhcnNlVmFyaW50IHppZ1phZ1RvSTE2CiAgICAgICAgICAgdmFsIDwtIGlmIHR5ID09IFRfQk9PTAogICAgICAgICAgICAgICAgICB0aGVuIHJldHVybiAoVEJvb2wgJCAodyAuJi4gMHgwRikgPT0gMHgwMSkKLSAgICAgICAgICAgICAgICAgZWxzZSBwYXJzZUNvbXBhY3RWYWx1ZSB0eQorICAgICAgICAgICAgICAgICBlbHNlIGNhc2UgKHR5LCBNYXAubG9va3VwIGZpZCB0bWFwKSBvZgorICAgICAgICAgICAgICAgICAgICAgICAgKFRfU1RSSU5HLCBKdXN0IChfLCBUX0JJTkFSWSkpIC0+IHBhcnNlQ29tcGFjdFZhbHVlIFRfQklOQVJZCisgICAgICAgICAgICAgICAgICAgICAgICBfIC0+IHBhcnNlQ29tcGFjdFZhbHVlIHR5CiAgICAgICAgICAgKChmaWQsIChMVC5lbXB0eSwgdmFsKSkgOiApIDwkPiBwYXJzZUZpZWxkcyBmaWQKIAogcGFyc2VDb21wYWN0TWFwIDo6IFRocmlmdFR5cGUgLT4gVGhyaWZ0VHlwZSAtPiBJbnQzMiAtPgpAQCAtMjU1LDYgKzI3MSw3IEBACiAgIFRfSTY0IC0+IDB4MDYKICAgVF9ET1VCTEUgLT4gMHgwNwogICBUX1NUUklORyAtPiAweDA4CisgIFRfQklOQVJZIC0+IDB4MDgKICAgVF9MSVNUe30gLT4gMHgwOQogICBUX1NFVHt9IC0+IDB4MEEKICAgVF9NQVB7fSAtPiAweDBCCkBAIC0yNzEsMTEgKzI4OCwxMiBAQAogICBUSTY0IF8gLT4gMHgwNgogICBURG91YmxlIF8gLT4gMHgwNwogICBUU3RyaW5nIF8gLT4gMHgwOAorICBUQmluYXJ5IF8gLT4gMHgwOAogICBUTGlzdHt9IC0+IDB4MDkKICAgVFNldHt9IC0+IDB4MEEKICAgVE1hcHt9IC0+IDB4MEIKICAgVFN0cnVjdHt9IC0+IDB4MEMKLSAgCisKIHR5cGVGcm9tIDo6IFdvcmQ4IC0+IFRocmlmdFR5cGUKIHR5cGVGcm9tIHcgPSBjYXNlIHcgb2YKICAgMHgwMSAtPiBUX0JPT0wKZGlmZiAtLWdpdCBhL2xpYi9ocy9zcmMvVGhyaWZ0L1Byb3RvY29sL0hlYWRlci5ocyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1Byb3RvY29sL0hlYWRlci5ocwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjQyZGI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hzL3NyYy9UaHJpZnQvUHJvdG9jb2wvSGVhZGVyLmhzCkBAIC0wLDAgKzEsMTQxIEBACistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworCittb2R1bGUgVGhyaWZ0LlByb3RvY29sLkhlYWRlcgorICAgICggbW9kdWxlIFRocmlmdC5Qcm90b2NvbAorICAgICwgSGVhZGVyUHJvdG9jb2woLi4pCisgICAgLCBnZXRQcm90b2NvbFR5cGUKKyAgICAsIHNldFByb3RvY29sVHlwZQorICAgICwgZ2V0SGVhZGVycworICAgICwgZ2V0V3JpdGVIZWFkZXJzCisgICAgLCBzZXRIZWFkZXIKKyAgICAsIHNldEhlYWRlcnMKKyAgICAsIGNyZWF0ZUhlYWRlclByb3RvY29sCisgICAgLCBjcmVhdGVIZWFkZXJQcm90b2NvbDEKKyAgICApIHdoZXJlCisKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wuQmluYXJ5CitpbXBvcnQgVGhyaWZ0LlByb3RvY29sLkpTT04KK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wuQ29tcGFjdAoraW1wb3J0IFRocmlmdC5UcmFuc3BvcnQKK2ltcG9ydCBUaHJpZnQuVHJhbnNwb3J0LkhlYWRlcgoraW1wb3J0IERhdGEuSU9SZWYKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5NYXAgYXMgTWFwCisKK2RhdGEgUHJvdG9jb2xXcmFwID0gZm9yYWxsIGEuIChQcm90b2NvbCBhKSA9PiBQcm90b2NvbFdyYXAoYSkKKworaW5zdGFuY2UgUHJvdG9jb2wgUHJvdG9jb2xXcmFwIHdoZXJlCisgIHJlYWRCeXRlIChQcm90b2NvbFdyYXAgcCkgPSByZWFkQnl0ZSBwCisgIHJlYWRWYWwgKFByb3RvY29sV3JhcCBwKSA9IHJlYWRWYWwgcAorICByZWFkTWVzc2FnZSAoUHJvdG9jb2xXcmFwIHApID0gcmVhZE1lc3NhZ2UgcAorICB3cml0ZVZhbCAoUHJvdG9jb2xXcmFwIHApID0gd3JpdGVWYWwgcAorICB3cml0ZU1lc3NhZ2UgKFByb3RvY29sV3JhcCBwKSA9IHdyaXRlTWVzc2FnZSBwCisKK2RhdGEgSGVhZGVyUHJvdG9jb2wgaSBvID0gKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gSGVhZGVyUHJvdG9jb2wgeworICAgIHRyYW5zIDo6IEhlYWRlclRyYW5zcG9ydCBpIG8sCisgICAgd3JhcHBlZFByb3RvIDo6IElPUmVmIFByb3RvY29sV3JhcAorICB9CisKK2NyZWF0ZVByb3RvY29sV3JhcCA6OiBUcmFuc3BvcnQgdCA9PiBQcm90b2NvbFR5cGUgLT4gdCAtPiBQcm90b2NvbFdyYXAKK2NyZWF0ZVByb3RvY29sV3JhcCB0eXAgdCA9CisgIGNhc2UgdHlwIG9mCisgICAgVEJpbmFyeSAtPiBQcm90b2NvbFdyYXAgJCBCaW5hcnlQcm90b2NvbCB0CisgICAgVENvbXBhY3QgLT4gUHJvdG9jb2xXcmFwICQgQ29tcGFjdFByb3RvY29sIHQKKyAgICBUSlNPTiAtPiBQcm90b2NvbFdyYXAgJCBKU09OUHJvdG9jb2wgdAorCitjcmVhdGVIZWFkZXJQcm90b2NvbCA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBpIC0+IG8gLT4gSU8oSGVhZGVyUHJvdG9jb2wgaSBvKQorY3JlYXRlSGVhZGVyUHJvdG9jb2wgaSBvID0gZG8KKyAgdCA8LSBvcGVuSGVhZGVyVHJhbnNwb3J0IGkgbworICBwaWQgPC0gcmVhZElPUmVmICQgcHJvdG9jb2xUeXBlIHQKKyAgcHJvdG8gPC0gbmV3SU9SZWYgJCBjcmVhdGVQcm90b2NvbFdyYXAgcGlkIHQKKyAgcmV0dXJuICQgSGVhZGVyUHJvdG9jb2wgeyB0cmFucyA9IHQsIHdyYXBwZWRQcm90byA9IHByb3RvIH0KKworY3JlYXRlSGVhZGVyUHJvdG9jb2wxIDo6IFRyYW5zcG9ydCB0ID0+IHQgLT4gSU8oSGVhZGVyUHJvdG9jb2wgdCB0KQorY3JlYXRlSGVhZGVyUHJvdG9jb2wxIHQgPSBjcmVhdGVIZWFkZXJQcm90b2NvbCB0IHQKKworcmVzZXRQcm90b2NvbCA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBIZWFkZXJQcm90b2NvbCBpIG8gLT4gSU8gKCkKK3Jlc2V0UHJvdG9jb2wgcCA9IGRvCisgIHBpZCA8LSByZWFkSU9SZWYgJCBwcm90b2NvbFR5cGUgJCB0cmFucyBwCisgIHdyaXRlSU9SZWYgKHdyYXBwZWRQcm90byBwKSAkIGNyZWF0ZVByb3RvY29sV3JhcCBwaWQgJCB0cmFucyBwCisKK2dldFdyYXBwZWQgPSByZWFkSU9SZWYgLiB3cmFwcGVkUHJvdG8KKworc2V0VHJhbnNwb3J0IDo6IChUcmFuc3BvcnQgaSwgVHJhbnNwb3J0IG8pID0+IEhlYWRlclByb3RvY29sIGkgbyAtPiBIZWFkZXJUcmFuc3BvcnQgaSBvIC0+IEhlYWRlclByb3RvY29sIGkgbworc2V0VHJhbnNwb3J0IHAgdCA9IHAgeyB0cmFucyA9IHQgfQorCit1cGRhdGVUcmFuc3BvcnQgOjogKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gSGVhZGVyUHJvdG9jb2wgaSBvIC0+IChIZWFkZXJUcmFuc3BvcnQgaSBvIC0+IEhlYWRlclRyYW5zcG9ydCBpIG8pLT4gSGVhZGVyUHJvdG9jb2wgaSBvCit1cGRhdGVUcmFuc3BvcnQgcCBmID0gc2V0VHJhbnNwb3J0IHAgKGYgJCB0cmFucyBwKQorCit0eXBlIEhlYWRlcnMgPSBNYXAuTWFwIFN0cmluZyBTdHJpbmcKKworLS0gVE9ETzogd2Ugd2FudCB0byBzZXQgaGVhZGVycyB3aXRob3V0IHJlY3JlYXRpbmcgY2xpZW50Li4uCitzZXRIZWFkZXIgOjogKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gSGVhZGVyUHJvdG9jb2wgaSBvIC0+IFN0cmluZyAtPiBTdHJpbmcgLT4gSGVhZGVyUHJvdG9jb2wgaSBvCitzZXRIZWFkZXIgcCBrIHYgPSB1cGRhdGVUcmFuc3BvcnQgcCAkIFx0IC0+IHQgeyB3cml0ZUhlYWRlcnMgPSBNYXAuaW5zZXJ0IGsgdiAkIHdyaXRlSGVhZGVycyB0IH0KKworc2V0SGVhZGVycyA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBIZWFkZXJQcm90b2NvbCBpIG8gLT4gSGVhZGVycyAtPiBIZWFkZXJQcm90b2NvbCBpIG8KK3NldEhlYWRlcnMgcCBoID0gdXBkYXRlVHJhbnNwb3J0IHAgJCBcdCAtPiB0IHsgd3JpdGVIZWFkZXJzID0gaCB9CisKKy0tIFRPRE86IG1ha2UgaXQgcHVibGljIG9uY2Ugd2UgaGF2ZSBmaXJzdCB0cmFuc2Zvcm0gaW1wbGVtZW50YXRpb24gZm9yIEhhc2tlbGwKK3NldFRyYW5zZm9ybXMgOjogKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gSGVhZGVyUHJvdG9jb2wgaSBvIC0+IFtUcmFuc2Zvcm1UeXBlXSAtPiBIZWFkZXJQcm90b2NvbCBpIG8KK3NldFRyYW5zZm9ybXMgcCB0cnMgPSB1cGRhdGVUcmFuc3BvcnQgcCAkIFx0IC0+IHQgeyB3cml0ZVRyYW5zZm9ybXMgPSB0cnMgfQorCitzZXRUcmFuc2Zvcm0gOjogKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gSGVhZGVyUHJvdG9jb2wgaSBvIC0+IFRyYW5zZm9ybVR5cGUgLT4gSGVhZGVyUHJvdG9jb2wgaSBvCitzZXRUcmFuc2Zvcm0gcCB0ciA9IHVwZGF0ZVRyYW5zcG9ydCBwICQgXHQgLT4gdCB7IHdyaXRlVHJhbnNmb3JtcyA9IHRyOih3cml0ZVRyYW5zZm9ybXMgdCkgfQorCitnZXRXcml0ZUhlYWRlcnMgOjogKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gSGVhZGVyUHJvdG9jb2wgaSBvIC0+IEhlYWRlcnMKK2dldFdyaXRlSGVhZGVycyA9IHdyaXRlSGVhZGVycyAuIHRyYW5zCisKK2dldEhlYWRlcnMgOjogKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gSGVhZGVyUHJvdG9jb2wgaSBvIC0+IElPIFsoU3RyaW5nLCBTdHJpbmcpXQorZ2V0SGVhZGVycyA9IHJlYWRJT1JlZiAuIGhlYWRlcnMgLiB0cmFucworCitnZXRQcm90b2NvbFR5cGUgOjogKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gSGVhZGVyUHJvdG9jb2wgaSBvIC0+IElPIFByb3RvY29sVHlwZQorZ2V0UHJvdG9jb2xUeXBlIHAgPSByZWFkSU9SZWYgJCBwcm90b2NvbFR5cGUgJCB0cmFucyBwCisKK3NldFByb3RvY29sVHlwZSA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBIZWFkZXJQcm90b2NvbCBpIG8gLT4gUHJvdG9jb2xUeXBlIC0+IElPICgpCitzZXRQcm90b2NvbFR5cGUgcCB0eXAgPSBkbworICB0eXAwIDwtIGdldFByb3RvY29sVHlwZSBwCisgIGlmIHR5cCA9PSB0eXAwCisgICAgdGhlbiByZXR1cm4gKCkKKyAgICBlbHNlIGRvCisgICAgICB0U2V0UHJvdG9jb2wgKHRyYW5zIHApIHR5cAorICAgICAgcmVzZXRQcm90b2NvbCBwCisKK2luc3RhbmNlIChUcmFuc3BvcnQgaSwgVHJhbnNwb3J0IG8pID0+IFByb3RvY29sIChIZWFkZXJQcm90b2NvbCBpIG8pIHdoZXJlCisgIHJlYWRCeXRlIHAgPSB0UmVhZEFsbCAodHJhbnMgcCkgMQorCisgIHJlYWRWYWwgcCB0cCA9IGRvCisgICAgcHJvdG8gPC0gZ2V0V3JhcHBlZCBwCisgICAgcmVhZFZhbCBwcm90byB0cAorCisgIHJlYWRNZXNzYWdlIHAgZiA9IGRvCisgICAgdFJlc2V0UHJvdG9jb2wgKHRyYW5zIHApCisgICAgcmVzZXRQcm90b2NvbCBwCisgICAgcHJvdG8gPC0gZ2V0V3JhcHBlZCBwCisgICAgcmVhZE1lc3NhZ2UgcHJvdG8gZgorCisgIHdyaXRlVmFsIHAgdiA9IGRvCisgICAgcHJvdG8gPC0gZ2V0V3JhcHBlZCBwCisgICAgd3JpdGVWYWwgcHJvdG8gdgorCisgIHdyaXRlTWVzc2FnZSBwIHggZiA9IGRvCisgICAgcHJvdG8gPC0gZ2V0V3JhcHBlZCBwCisgICAgd3JpdGVNZXNzYWdlIHByb3RvIHggZgorCmRpZmYgLS1naXQgYS9saWIvaHMvc3JjL1RocmlmdC9Qcm90b2NvbC9KU09OLmhzIGIvbGliL2hzL3NyYy9UaHJpZnQvUHJvdG9jb2wvSlNPTi5ocwppbmRleCBmMzc4ZWEyLi44MzllZGRjIDEwMDY0NAotLS0gYS9saWIvaHMvc3JjL1RocmlmdC9Qcm90b2NvbC9KU09OLmhzCisrKyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1Byb3RvY29sL0pTT04uaHMKQEAgLTI5LDEwICsyOSwxMiBAQAogICAgICkgd2hlcmUKIAogaW1wb3J0IENvbnRyb2wuQXBwbGljYXRpdmUKK2ltcG9ydCBDb250cm9sLkV4Y2VwdGlvbiAoYnJhY2tldCkKIGltcG9ydCBDb250cm9sLk1vbmFkCiBpbXBvcnQgRGF0YS5BdHRvcGFyc2VjLkJ5dGVTdHJpbmcgYXMgUAogaW1wb3J0IERhdGEuQXR0b3BhcnNlYy5CeXRlU3RyaW5nLkNoYXI4IGFzIFBDCiBpbXBvcnQgRGF0YS5BdHRvcGFyc2VjLkJ5dGVTdHJpbmcuTGF6eSBhcyBMUAoraW1wb3J0IERhdGEuQnl0ZVN0cmluZy5CYXNlNjQuTGF6eSBhcyBCNjRDCiBpbXBvcnQgRGF0YS5CeXRlU3RyaW5nLkxhenkuQnVpbGRlciBhcyBCCiBpbXBvcnQgRGF0YS5CeXRlU3RyaW5nLkludGVybmFsIChjMncsIHcyYykKIGltcG9ydCBEYXRhLkZ1bmN0b3IKQEAgLTQ5LDQ0ICs1MSw1NSBAQAogaW1wb3J0IFRocmlmdC5UeXBlcwogCiBpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5MYXp5IGFzIExCUworaW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcuTGF6eS5DaGFyOCBhcyBMQlNDCiBpbXBvcnQgcXVhbGlmaWVkIERhdGEuVGV4dC5MYXp5IGFzIExUCiAKLS0tIHwgVGhlIEpTT04gUHJvdG9jb2wgZGF0YSB1c2VzIHRoZSBzdGFuZGFyZCAnVFNpbXBsZUpTT05Qcm90b2NvbCcuICBEYXRhIGlzCistLSB8IFRoZSBKU09OIFByb3RvY29sIGRhdGEgdXNlcyB0aGUgc3RhbmRhcmQgJ1RKU09OUHJvdG9jb2wnLiAgRGF0YSBpcwogLS0gZW5jb2RlZCBhcyBhIEpTT04gJ0J5dGVTdHJpbmcnCiBkYXRhIEpTT05Qcm90b2NvbCB0ID0gSlNPTlByb3RvY29sIHQKICAgICAgICAgICAgICAgICAgICAgICAtLSBeIENvbnN0cnVjdCBhICdKU09OUHJvdG9jb2wnIHdpdGggYSAnVHJhbnNwb3J0JworZ2V0VHJhbnNwb3J0IDo6IFRyYW5zcG9ydCB0ID0+IEpTT05Qcm90b2NvbCB0IC0+IHQKK2dldFRyYW5zcG9ydCAoSlNPTlByb3RvY29sIHQpID0gdAogCi1pbnN0YW5jZSBQcm90b2NvbCBKU09OUHJvdG9jb2wgd2hlcmUKLSAgICBnZXRUcmFuc3BvcnQgKEpTT05Qcm90b2NvbCB0KSA9IHQKK2luc3RhbmNlIFRyYW5zcG9ydCB0ID0+IFByb3RvY29sIChKU09OUHJvdG9jb2wgdCkgd2hlcmUKKyAgICByZWFkQnl0ZSBwID0gdFJlYWRBbGwgKGdldFRyYW5zcG9ydCBwKSAxCiAKLSAgICB3cml0ZU1lc3NhZ2VCZWdpbiAoSlNPTlByb3RvY29sIHQpIChzLCB0eSwgc3EpID0gdFdyaXRlIHQgJCB0b0xhenlCeXRlU3RyaW5nICQKLSAgICAgIEIuY2hhcjggJ1snIDw+IGJ1aWxkU2hvd2FibGUgKDEgOjogSW50MzIpIDw+Ci0gICAgICBCLnN0cmluZzggIixcIiIgPD4gZXNjYXBlIChlbmNvZGVVdGY4IHMpIDw+IEIuY2hhcjggJ1wiJyA8PgotICAgICAgQi5jaGFyOCAnLCcgPD4gYnVpbGRTaG93YWJsZSAoZnJvbUVudW0gdHkpIDw+Ci0gICAgICBCLmNoYXI4ICcsJyA8PiBidWlsZFNob3dhYmxlIHNxIDw+Ci0gICAgICBCLmNoYXI4ICcsJwotICAgIHdyaXRlTWVzc2FnZUVuZCAoSlNPTlByb3RvY29sIHQpID0gdFdyaXRlIHQgIl0iCi0gICAgcmVhZE1lc3NhZ2VCZWdpbiBwID0gcnVuUGFyc2VyIHAgJCBza2lwU3BhY2UgKj4gZG8KLSAgICAgIF92ZXIgOjogSW50MzIgPC0gbGV4ZW1lIChQQy5jaGFyOCAnWycpICo+IGxleGVtZSAoc2lnbmVkIGRlY2ltYWwpCi0gICAgICBicyA8LSBsZXhlbWUgKFBDLmNoYXI4ICcsJykgKj4gbGV4ZW1lIGVzY2FwZWRTdHJpbmcKLSAgICAgIGNhc2UgZGVjb2RlVXRmOCcgYnMgb2YKLSAgICAgICAgTGVmdCBfIC0+IGZhaWwgInJlYWRNZXNzYWdlOiBpbnZhbGlkIHRleHQgZW5jb2RpbmciCi0gICAgICAgIFJpZ2h0IHN0ciAtPiBkbwotICAgICAgICAgIHR5IDwtIHRvRW51bSA8JD4gKGxleGVtZSAoUEMuY2hhcjggJywnKSAqPiBsZXhlbWUgKHNpZ25lZCBkZWNpbWFsKSkKLSAgICAgICAgICBzZXFOdW0gPC0gbGV4ZW1lIChQQy5jaGFyOCAnLCcpICo+IGxleGVtZSAoc2lnbmVkIGRlY2ltYWwpCi0gICAgICAgICAgXyA8LSBQQy5jaGFyOCAnLCcKLSAgICAgICAgICByZXR1cm4gKHN0ciwgdHksIHNlcU51bSkKLSAgICByZWFkTWVzc2FnZUVuZCBwID0gdm9pZCAkIHJ1blBhcnNlciBwIChQQy5jaGFyOCAnXScpCisgICAgd3JpdGVNZXNzYWdlIChKU09OUHJvdG9jb2wgdCkgKHMsIHR5LCBzcSkgPSBicmFja2V0IHJlYWRNZXNzYWdlQmVnaW4gcmVhZE1lc3NhZ2VFbmQgLiBjb25zdAorICAgICAgd2hlcmUKKyAgICAgICAgcmVhZE1lc3NhZ2VCZWdpbiA9IHRXcml0ZSB0ICQgdG9MYXp5Qnl0ZVN0cmluZyAkCisgICAgICAgICAgQi5jaGFyOCAnWycgPD4gYnVpbGRTaG93YWJsZSAoMSA6OiBJbnQzMikgPD4KKyAgICAgICAgICBCLnN0cmluZzggIixcIiIgPD4gZXNjYXBlIChlbmNvZGVVdGY4IHMpIDw+IEIuY2hhcjggJ1wiJyA8PgorICAgICAgICAgIEIuY2hhcjggJywnIDw+IGJ1aWxkU2hvd2FibGUgKGZyb21FbnVtIHR5KSA8PgorICAgICAgICAgIEIuY2hhcjggJywnIDw+IGJ1aWxkU2hvd2FibGUgc3EgPD4KKyAgICAgICAgICBCLmNoYXI4ICcsJworICAgICAgICByZWFkTWVzc2FnZUVuZCBfID0gZG8KKyAgICAgICAgICB0V3JpdGUgdCAiXSIKKyAgICAgICAgICB0Rmx1c2ggdAogCisgICAgcmVhZE1lc3NhZ2UgcCA9IGJyYWNrZXQgcmVhZE1lc3NhZ2VCZWdpbiByZWFkTWVzc2FnZUVuZAorICAgICAgd2hlcmUKKyAgICAgICAgcmVhZE1lc3NhZ2VCZWdpbiA9IHJ1blBhcnNlciBwICQgc2tpcFNwYWNlICo+IGRvCisgICAgICAgICAgX3ZlciA6OiBJbnQzMiA8LSBsZXhlbWUgKFBDLmNoYXI4ICdbJykgKj4gbGV4ZW1lIChzaWduZWQgZGVjaW1hbCkKKyAgICAgICAgICBicyA8LSBsZXhlbWUgKFBDLmNoYXI4ICcsJykgKj4gbGV4ZW1lIGVzY2FwZWRTdHJpbmcKKyAgICAgICAgICBjYXNlIGRlY29kZVV0ZjgnIGJzIG9mCisgICAgICAgICAgICBMZWZ0IF8gLT4gZmFpbCAicmVhZE1lc3NhZ2U6IGludmFsaWQgdGV4dCBlbmNvZGluZyIKKyAgICAgICAgICAgIFJpZ2h0IHN0ciAtPiBkbworICAgICAgICAgICAgICB0eSA8LSB0b0VudW0gPCQ+IChsZXhlbWUgKFBDLmNoYXI4ICcsJykgKj4gbGV4ZW1lIChzaWduZWQgZGVjaW1hbCkpCisgICAgICAgICAgICAgIHNlcU51bSA8LSBsZXhlbWUgKFBDLmNoYXI4ICcsJykgKj4gbGV4ZW1lIChzaWduZWQgZGVjaW1hbCkKKyAgICAgICAgICAgICAgXyA8LSBQQy5jaGFyOCAnLCcKKyAgICAgICAgICAgICAgcmV0dXJuIChzdHIsIHR5LCBzZXFOdW0pCisgICAgICAgIHJlYWRNZXNzYWdlRW5kIF8gPSB2b2lkICQgcnVuUGFyc2VyIHAgKFBDLmNoYXI4ICddJykKKworICAgIHdyaXRlVmFsIHAgPSB0V3JpdGUgKGdldFRyYW5zcG9ydCBwKSAuIHRvTGF6eUJ5dGVTdHJpbmcgLiBidWlsZEpTT05WYWx1ZQorICAgIHJlYWRWYWwgcCB0eSA9IHJ1blBhcnNlciBwICQgc2tpcFNwYWNlICo+IHBhcnNlSlNPTlZhbHVlIHR5CisKK2luc3RhbmNlIFRyYW5zcG9ydCB0ID0+IFN0YXRlbGVzc1Byb3RvY29sIChKU09OUHJvdG9jb2wgdCkgd2hlcmUKICAgICBzZXJpYWxpemVWYWwgXyA9IHRvTGF6eUJ5dGVTdHJpbmcgLiBidWlsZEpTT05WYWx1ZQogICAgIGRlc2VyaWFsaXplVmFsIF8gdHkgYnMgPQogICAgICAgY2FzZSBMUC5laXRoZXJSZXN1bHQgJCBMUC5wYXJzZSAocGFyc2VKU09OVmFsdWUgdHkpIGJzIG9mCiAgICAgICAgIExlZnQgcyAtPiBlcnJvciBzCiAgICAgICAgIFJpZ2h0IHZhbCAtPiB2YWwKIAotICAgIHJlYWRWYWwgcCB0eSA9IHJ1blBhcnNlciBwICQgc2tpcFNwYWNlICo+IHBhcnNlSlNPTlZhbHVlIHR5Ci0KLQogLS0gV3JpdGluZyBGdW5jdGlvbnMKIAogYnVpbGRKU09OVmFsdWUgOjogVGhyaWZ0VmFsIC0+IEJ1aWxkZXIKQEAgLTEwNSwxMyArMTE4LDE0IEBACiAgICBlbHNlIG1lbXB0eSkgPD4KICAgQi5jaGFyOCAnXScKIGJ1aWxkSlNPTlZhbHVlIChUU2V0IHR5IGVudHJpZXMpID0gYnVpbGRKU09OVmFsdWUgKFRMaXN0IHR5IGVudHJpZXMpCi1idWlsZEpTT05WYWx1ZSAoVEJvb2wgYikgPSBpZiBiIHRoZW4gQi5zdHJpbmc4ICJ0cnVlIiBlbHNlIEIuc3RyaW5nOCAiZmFsc2UiCitidWlsZEpTT05WYWx1ZSAoVEJvb2wgYikgPSBpZiBiIHRoZW4gQi5jaGFyOCAnMScgZWxzZSBCLmNoYXI4ICcwJwogYnVpbGRKU09OVmFsdWUgKFRCeXRlIGIpID0gYnVpbGRTaG93YWJsZSBiCiBidWlsZEpTT05WYWx1ZSAoVEkxNiBpKSA9IGJ1aWxkU2hvd2FibGUgaQogYnVpbGRKU09OVmFsdWUgKFRJMzIgaSkgPSBidWlsZFNob3dhYmxlIGkKIGJ1aWxkSlNPTlZhbHVlIChUSTY0IGkpID0gYnVpbGRTaG93YWJsZSBpCiBidWlsZEpTT05WYWx1ZSAoVERvdWJsZSBkKSA9IGJ1aWxkU2hvd2FibGUgZAogYnVpbGRKU09OVmFsdWUgKFRTdHJpbmcgcykgPSBCLmNoYXI4ICdcIicgPD4gZXNjYXBlIHMgPD4gQi5jaGFyOCAnXCInCitidWlsZEpTT05WYWx1ZSAoVEJpbmFyeSBzKSA9IEIuY2hhcjggJ1wiJyA8PiAoQi5sYXp5Qnl0ZVN0cmluZyAuIEI2NEMuZW5jb2RlICQgcykgPD4gQi5jaGFyOCAnXCInCiAKIGJ1aWxkSlNPTlN0cnVjdCA6OiBNYXAuSGFzaE1hcCBJbnQxNiAoTFQuVGV4dCwgVGhyaWZ0VmFsKSAtPiBCdWlsZGVyCiBidWlsZEpTT05TdHJ1Y3QgPSBtY29uY2F0IC4gaW50ZXJzcGVyc2UgKEIuY2hhcjggJywnKSAuIE1hcC5mb2xkcldpdGhLZXkgYnVpbGRGaWVsZCBbXQpAQCAtMTQ5LDIyICsxNjMsMjUgQEAKICAgICBiZXR3ZWVuICd7JyAnfScgKHBhcnNlSlNPTk1hcCBrdCB2dCkKIHBhcnNlSlNPTlZhbHVlIChUX0xJU1QgdHkpID0gZm1hcCAoVExpc3QgdHkpICQKICAgYmV0d2VlbiAnWycgJ10nICQgZG8KLSAgICBsZW4gPC0gbGV4ZW1lIGVzY2FwZWRTdHJpbmcgKj4gbGV4ZW1lIChQQy5jaGFyOCAnLCcpICo+Ci0gICAgICAgICAgIGxleGVtZSBkZWNpbWFsIDwqIGxleGVtZSAoUEMuY2hhcjggJywnKQotICAgIGlmIGxlbiA+IDAgdGhlbiBwYXJzZUpTT05MaXN0IHR5IGVsc2UgcmV0dXJuIFtdCisgICAgbGVuIDwtIGxleGVtZSBlc2NhcGVkU3RyaW5nICo+IGxleGVtZSAoUEMuY2hhcjggJywnKSAqPiBsZXhlbWUgZGVjaW1hbAorICAgIGlmIGxlbiA+IDAKKyAgICAgIHRoZW4gbGV4ZW1lIChQQy5jaGFyOCAnLCcpICo+IHBhcnNlSlNPTkxpc3QgdHkKKyAgICAgIGVsc2UgcmV0dXJuIFtdCiBwYXJzZUpTT05WYWx1ZSAoVF9TRVQgdHkpID0gZm1hcCAoVFNldCB0eSkgJAogICBiZXR3ZWVuICdbJyAnXScgJCBkbwotICAgIGxlbiA8LSBsZXhlbWUgZXNjYXBlZFN0cmluZyAqPiBsZXhlbWUgKFBDLmNoYXI4ICcsJykgKj4KLSAgICAgICAgICAgbGV4ZW1lIGRlY2ltYWwgPCogbGV4ZW1lIChQQy5jaGFyOCAnLCcpCi0gICAgaWYgbGVuID4gMCB0aGVuIHBhcnNlSlNPTkxpc3QgdHkgZWxzZSByZXR1cm4gW10KKyAgICBsZW4gPC0gbGV4ZW1lIGVzY2FwZWRTdHJpbmcgKj4gbGV4ZW1lIChQQy5jaGFyOCAnLCcpICo+IGxleGVtZSBkZWNpbWFsCisgICAgaWYgbGVuID4gMAorICAgICAgdGhlbiAgbGV4ZW1lIChQQy5jaGFyOCAnLCcpICo+IHBhcnNlSlNPTkxpc3QgdHkKKyAgICAgIGVsc2UgcmV0dXJuIFtdCiBwYXJzZUpTT05WYWx1ZSBUX0JPT0wgPQotICAoVEJvb2wgVHJ1ZSA8JCBzdHJpbmcgInRydWUiKSA8fD4gKFRCb29sIEZhbHNlIDwkIHN0cmluZyAiZmFsc2UiKQorICAoVEJvb2wgVHJ1ZSA8JCBQQy5jaGFyOCAnMScpIDx8PiAoVEJvb2wgRmFsc2UgPCQgUEMuY2hhcjggJzAnKQogcGFyc2VKU09OVmFsdWUgVF9CWVRFID0gVEJ5dGUgPCQ+IHNpZ25lZCBkZWNpbWFsCiBwYXJzZUpTT05WYWx1ZSBUX0kxNiA9IFRJMTYgPCQ+IHNpZ25lZCBkZWNpbWFsCiBwYXJzZUpTT05WYWx1ZSBUX0kzMiA9IFRJMzIgPCQ+IHNpZ25lZCBkZWNpbWFsCiBwYXJzZUpTT05WYWx1ZSBUX0k2NCA9IFRJNjQgPCQ+IHNpZ25lZCBkZWNpbWFsCiBwYXJzZUpTT05WYWx1ZSBUX0RPVUJMRSA9IFREb3VibGUgPCQ+IGRvdWJsZQogcGFyc2VKU09OVmFsdWUgVF9TVFJJTkcgPSBUU3RyaW5nIDwkPiBlc2NhcGVkU3RyaW5nCitwYXJzZUpTT05WYWx1ZSBUX0JJTkFSWSA9IFRCaW5hcnkgPCQ+IGJhc2U2NFN0cmluZwogcGFyc2VKU09OVmFsdWUgVF9TVE9QID0gZmFpbCAicGFyc2VKU09OVmFsdWU6IGNhbm5vdCBwYXJzZSB0eXBlIFRfU1RPUCIKIHBhcnNlSlNPTlZhbHVlIFRfVk9JRCA9IGZhaWwgInBhcnNlSlNPTlZhbHVlOiBjYW5ub3QgcGFyc2UgdHlwZSBUX1ZPSUQiCiAKQEAgLTE3OSw2ICsxOTYsNyBAQAogICAgICAgICAgICAgICAgICAgLCBUX0k2NAogICAgICAgICAgICAgICAgICAgLCBUX0RPVUJMRQogICAgICAgICAgICAgICAgICAgLCBUX1NUUklORworICAgICAgICAgICAgICAgICAgLCBUX0JJTkFSWQogICAgICAgICAgICAgICAgICAgXQogICB3aGVyZQogICAgIHNraXBCZXR3ZWVuIDo6IENoYXIgLT4gQ2hhciAtPiBQYXJzZXIgKCkKQEAgLTIwMCw5ICsyMTgsMTMgQEAKIAogcGFyc2VKU09OTWFwIDo6IFRocmlmdFR5cGUgLT4gVGhyaWZ0VHlwZSAtPiBQYXJzZXIgWyhUaHJpZnRWYWwsIFRocmlmdFZhbCldCiBwYXJzZUpTT05NYXAga3QgdnQgPQotICAoKCwpIDwkPiBsZXhlbWUgKFBDLmNoYXI4ICciJyAqPiBwYXJzZUpTT05WYWx1ZSBrdCA8KiBQQy5jaGFyOCAnIicpIDwqPgorICAoKCwpIDwkPiBsZXhlbWUgKHBhcnNlSlNPTktleSBrdCkgPCo+CiAgICAobGV4ZW1lIChQQy5jaGFyOCAnOicpICo+IGxleGVtZSAocGFyc2VKU09OVmFsdWUgdnQpKSkgYHNlcEJ5YAogICBsZXhlbWUgKFBDLmNoYXI4ICcsJykKKyAgd2hlcmUKKyAgICBwYXJzZUpTT05LZXkgVF9TVFJJTkcgPSBwYXJzZUpTT05WYWx1ZSBUX1NUUklORworICAgIHBhcnNlSlNPTktleSBUX0JJTkFSWSA9IHBhcnNlSlNPTlZhbHVlIFRfQklOQVJZCisgICAgcGFyc2VKU09OS2V5IGt0ID0gUEMuY2hhcjggJyInICo+IHBhcnNlSlNPTlZhbHVlIGt0IDwqIFBDLmNoYXI4ICciJwogCiBwYXJzZUpTT05MaXN0IDo6IFRocmlmdFR5cGUgLT4gUGFyc2VyIFtUaHJpZnRWYWxdCiBwYXJzZUpTT05MaXN0IHR5ID0gbGV4ZW1lIChwYXJzZUpTT05WYWx1ZSB0eSkgYHNlcEJ5YCBsZXhlbWUgKFBDLmNoYXI4ICcsJykKQEAgLTIxMiw2ICsyMzQsMjAgQEAKICAgICAgICAgICAgICAgICAoTEJTLnBhY2sgPCQ+IFAubWFueScgKGVzY2FwZWRDaGFyIDx8PiBub3RDaGFyOCAnIicpKSA8KgogICAgICAgICAgICAgICAgIFBDLmNoYXI4ICciJwogCitiYXNlNjRTdHJpbmcgOjogUGFyc2VyIExCUy5CeXRlU3RyaW5nCitiYXNlNjRTdHJpbmcgPSBQQy5jaGFyOCAnIicgKj4KKyAgICAgICAgICAgICAgIChkZWNvZGVCYXNlNjQgLiBMQlNDLnBhY2sgPCQ+IFAubWFueScgKFBDLm5vdENoYXIgJyInKSkgPCoKKyAgICAgICAgICAgICAgIFBDLmNoYXI4ICciJworICAgICAgICAgICAgICAgd2hlcmUKKyAgICAgICAgICAgICAgICAgZGVjb2RlQmFzZTY0IGIgPQorICAgICAgICAgICAgICAgICAgIGxldCBwYWRkZWQgPSBjYXNlIChMQlMubGVuZ3RoIGIpIGBtb2RgIDQgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyIC0+IExCUy5hcHBlbmQgYiAiPT0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAtPiBMQlMuYXBwZW5kIGIgIj0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXyAtPiBiIGluCisgICAgICAgICAgICAgICAgICAgY2FzZSBCNjRDLmRlY29kZSBwYWRkZWQgb2YKKyAgICAgICAgICAgICAgICAgICAgIFJpZ2h0IHMgLT4gcworICAgICAgICAgICAgICAgICAgICAgTGVmdCB4IC0+IGVycm9yIHgKKwogZXNjYXBlZENoYXIgOjogUGFyc2VyIFdvcmQ4CiBlc2NhcGVkQ2hhciA9IFBDLmNoYXI4ICdcXCcgKj4gKGMydyA8JD4gY2hvaWNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsgJ1xTT0gnIDwkIFAuc3RyaW5nICJ1MDAwMSIKQEAgLTMyMSw1ICszNTcsNiBAQAogICBUX0k2NCAgICAgIC0+ICJpNjQiCiAgIFRfRE9VQkxFICAgLT4gImRibCIKICAgVF9TVFJJTkcgICAtPiAic3RyIgorICBUX0JJTkFSWSAgIC0+ICJzdHIiCiAgIF8gLT4gZXJyb3IgIlVucmVjb2duaXplZCBUeXBlIgogCmRpZmYgLS1naXQgYS9saWIvaHMvc3JjL1RocmlmdC9TZXJ2ZXIuaHMgYi9saWIvaHMvc3JjL1RocmlmdC9TZXJ2ZXIuaHMKaW5kZXggZWQ3NGNlYi4uNTQzZjMzOCAxMDA2NDQKLS0tIGEvbGliL2hzL3NyYy9UaHJpZnQvU2VydmVyLmhzCisrKyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1NlcnZlci5ocwpAQCAtMzgsMTAgKzM4LDEwIEBACiAKIC0tIHwgQSB0aHJlYWRlZCBzZXZlciB0aGF0IGlzIGNhcGFibGUgb2YgdXNpbmcgYW55IFRyYW5zcG9ydCBvciBQcm90b2NvbAogLS0gaW5zdGFuY2VzLgotcnVuVGhyZWFkZWRTZXJ2ZXIgOjogKFRyYW5zcG9ydCB0LCBQcm90b2NvbCBpLCBQcm90b2NvbCBvKQotICAgICAgICAgICAgICAgICAgPT4gKFNvY2tldCAtPiBJTyAoaSB0LCBvIHQpKQorcnVuVGhyZWFkZWRTZXJ2ZXIgOjogKFByb3RvY29sIGksIFByb3RvY29sIG8pCisgICAgICAgICAgICAgICAgICA9PiAoU29ja2V0IC0+IElPIChpLCBvKSkKICAgICAgICAgICAgICAgICAgIC0+IGgKLSAgICAgICAgICAgICAgICAgIC0+IChoIC0+IChpIHQsIG8gdCkgLT4gSU8gQm9vbCkKKyAgICAgICAgICAgICAgICAgIC0+IChoIC0+IChpLCBvKSAtPiBJTyBCb29sKQogICAgICAgICAgICAgICAgICAgLT4gUG9ydElECiAgICAgICAgICAgICAgICAgICAtPiBJTyBhCiBydW5UaHJlYWRlZFNlcnZlciBhY2NlcHRlciBoYW5kIHByb2NfIHBvcnQgPSBkbwpkaWZmIC0tZ2l0IGEvbGliL2hzL3NyYy9UaHJpZnQvVHJhbnNwb3J0L0hhbmRsZS5ocyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1RyYW5zcG9ydC9IYW5kbGUuaHMKaW5kZXggYjdkMTZlNC4uZmY2Mjk1YiAxMDA2NDQKLS0tIGEvbGliL2hzL3NyYy9UaHJpZnQvVHJhbnNwb3J0L0hhbmRsZS5ocworKysgYi9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQvSGFuZGxlLmhzCkBAIC00NCw3ICs0NCwxMyBAQAogaW5zdGFuY2UgVHJhbnNwb3J0IEhhbmRsZSB3aGVyZQogICAgIHRJc09wZW4gPSBoSXNPcGVuCiAgICAgdENsb3NlID0gaENsb3NlCi0gICAgdFJlYWQgaCBuID0gTEJTLmhHZXQgaCBuIGBDb250cm9sLkV4Y2VwdGlvbi5jYXRjaGAgaGFuZGxlRU9GIG1lbXB0eQorICAgIHRSZWFkIGggbiA9IHJlYWQgYENvbnRyb2wuRXhjZXB0aW9uLmNhdGNoYCBoYW5kbGVFT0YgbWVtcHR5CisgICAgICB3aGVyZQorICAgICAgICByZWFkID0gZG8KKyAgICAgICAgICBoTG9va0FoZWFkIGgKKyAgICAgICAgICBMQlMuaEdldE5vbkJsb2NraW5nIGggbgorICAgIHRSZWFkQWxsIF8gMCA9IHJldHVybiBtZW1wdHkKKyAgICB0UmVhZEFsbCBoIG4gPSBMQlMuaEdldCBoIG4gYENvbnRyb2wuRXhjZXB0aW9uLmNhdGNoYCB0aHJvd1RyYW5zcG9ydEV4bgogICAgIHRQZWVrIGggPSAoSnVzdCAuIGMydyA8JD4gaExvb2tBaGVhZCBoKSBgQ29udHJvbC5FeGNlcHRpb24uY2F0Y2hgIGhhbmRsZUVPRiBOb3RoaW5nCiAgICAgdFdyaXRlID0gTEJTLmhQdXQKICAgICB0Rmx1c2ggPSBoRmx1c2gKQEAgLTYxLDggKzY3LDEyIEBACiBpbnN0YW5jZSBIYW5kbGVTb3VyY2UgKEhvc3ROYW1lLCBQb3J0SUQpIHdoZXJlCiAgICAgaE9wZW4gPSB1bmN1cnJ5IGNvbm5lY3RUbwogCit0aHJvd1RyYW5zcG9ydEV4biA6OiBJT0Vycm9yIC0+IElPIGEKK3Rocm93VHJhbnNwb3J0RXhuIGUgPSBpZiBpc0VPRkVycm9yIGUKKyAgICB0aGVuIHRocm93ICQgVHJhbnNwb3J0RXhuICJDYW5ub3QgcmVhZC4gUmVtb3RlIHNpZGUgaGFzIGNsb3NlZC4iIFRFX1VOS05PV04KKyAgICBlbHNlIHRocm93ICQgVHJhbnNwb3J0RXhuICJIYW5kbGUgdFJlYWRBbGw6IENvdWxkIG5vdCByZWFkIiBURV9VTktOT1dOCiAKIGhhbmRsZUVPRiA6OiBhIC0+IElPRXJyb3IgLT4gSU8gYQogaGFuZGxlRU9GIGEgZSA9IGlmIGlzRU9GRXJyb3IgZQogICAgIHRoZW4gcmV0dXJuIGEKLSAgICBlbHNlIHRocm93ICQgVHJhbnNwb3J0RXhuICJUQ2hhbm5lbFRyYW5zcG9ydDogQ291bGQgbm90IHJlYWQiIFRFX1VOS05PV04KKyAgICBlbHNlIHRocm93ICQgVHJhbnNwb3J0RXhuICJIYW5kbGU6IENvdWxkIG5vdCByZWFkIiBURV9VTktOT1dOCmRpZmYgLS1naXQgYS9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQvSGVhZGVyLmhzIGIvbGliL2hzL3NyYy9UaHJpZnQvVHJhbnNwb3J0L0hlYWRlci5ocwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGFjYWQyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hzL3NyYy9UaHJpZnQvVHJhbnNwb3J0L0hlYWRlci5ocwpAQCAtMCwwICsxLDM1NCBAQAorLS0KKy0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCistLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCistLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCistLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCistLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy0tCistLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLS0KKy0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCistLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCistLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCistLSB1bmRlciB0aGUgTGljZW5zZS4KKy0tCisKK21vZHVsZSBUaHJpZnQuVHJhbnNwb3J0LkhlYWRlcgorICAoIG1vZHVsZSBUaHJpZnQuVHJhbnNwb3J0CisgICwgSGVhZGVyVHJhbnNwb3J0KC4uKQorICAsIG9wZW5IZWFkZXJUcmFuc3BvcnQKKyAgLCBQcm90b2NvbFR5cGUoLi4pCisgICwgVHJhbnNmb3JtVHlwZSguLikKKyAgLCBDbGllbnRUeXBlKC4uKQorICAsIHRSZXNldFByb3RvY29sCisgICwgdFNldFByb3RvY29sCisgICkgd2hlcmUKKworaW1wb3J0IFRocmlmdC5UcmFuc3BvcnQKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wuQ29tcGFjdAoraW1wb3J0IENvbnRyb2wuQXBwbGljYXRpdmUKK2ltcG9ydCBDb250cm9sLkV4Y2VwdGlvbiAoIHRocm93ICkKK2ltcG9ydCBDb250cm9sLk1vbmFkCitpbXBvcnQgRGF0YS5CaXRzCitpbXBvcnQgRGF0YS5JT1JlZgoraW1wb3J0IERhdGEuSW50CitpbXBvcnQgRGF0YS5Nb25vaWQKK2ltcG9ydCBEYXRhLldvcmQKKworaW1wb3J0IHF1YWxpZmllZCBEYXRhLkF0dG9wYXJzZWMuQnl0ZVN0cmluZyBhcyBQCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQmluYXJ5IGFzIEJpbmFyeQoraW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcgYXMgQlMKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkNoYXI4IGFzIEMKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkxhenkgYXMgTEJTCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5MYXp5LkJ1aWxkZXIgYXMgQgoraW1wb3J0IHF1YWxpZmllZCBEYXRhLk1hcCBhcyBNYXAKKworZGF0YSBQcm90b2NvbFR5cGUgPSBUQmluYXJ5IHwgVENvbXBhY3QgfCBUSlNPTiBkZXJpdmluZyAoRW51bSwgRXEpCitkYXRhIENsaWVudFR5cGUgPSBIZWFkZXJDbGllbnQgfCBGcmFtZWQgfCBVbmZyYW1lZCBkZXJpdmluZyAoRW51bSwgRXEpCisKK2luZm9JZEtleVZhbHVlID0gMQorCit0eXBlIEhlYWRlcnMgPSBNYXAuTWFwIFN0cmluZyBTdHJpbmcKKworZGF0YSBUcmFuc2Zvcm1UeXBlID0gWmxpYlRyYW5zZm9ybSBkZXJpdmluZyAoRW51bSwgRXEpCisKK2Zyb21UcmFuc3BvcnRUeXBlIDo6IFRyYW5zZm9ybVR5cGUgLT4gSW50MTYKK2Zyb21UcmFuc3BvcnRUeXBlIFpsaWJUcmFuc2Zvcm0gPSAxCisKK3RvVHJhbnNwb3J0VHlwZSA6OiBJbnQxNiAtPiBUcmFuc2Zvcm1UeXBlCit0b1RyYW5zcG9ydFR5cGUgMSA9IFpsaWJUcmFuc2Zvcm0KK3RvVHJhbnNwb3J0VHlwZSBfID0gIHRocm93ICQgVHJhbnNwb3J0RXhuICJIZWFkZXJUcmFuc3BvcnQ6IFVua25vd24gdHJhbnNmb3JtIElEIiBURV9VTktOT1dOCisKK2RhdGEgSGVhZGVyVHJhbnNwb3J0IGkgbyA9IChUcmFuc3BvcnQgaSwgVHJhbnNwb3J0IG8pID0+IEhlYWRlclRyYW5zcG9ydAorICAgIHsgcmVhZEJ1ZmZlciA6OiBJT1JlZiBMQlMuQnl0ZVN0cmluZworICAgICwgd3JpdGVCdWZmZXIgOjogSU9SZWYgQi5CdWlsZGVyCisgICAgLCBpblRyYW5zIDo6IGkKKyAgICAsIG91dFRyYW5zIDo6IG8KKyAgICAsIGNsaWVudFR5cGUgOjogSU9SZWYgQ2xpZW50VHlwZQorICAgICwgcHJvdG9jb2xUeXBlIDo6IElPUmVmIFByb3RvY29sVHlwZQorICAgICwgaGVhZGVycyA6OiBJT1JlZiBbKFN0cmluZywgU3RyaW5nKV0KKyAgICAsIHdyaXRlSGVhZGVycyA6OiBIZWFkZXJzCisgICAgLCB0cmFuc2Zvcm1zIDo6IElPUmVmIFtUcmFuc2Zvcm1UeXBlXQorICAgICwgd3JpdGVUcmFuc2Zvcm1zIDo6IFtUcmFuc2Zvcm1UeXBlXQorICAgIH0KKworb3BlbkhlYWRlclRyYW5zcG9ydCA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBpIC0+IG8gLT4gSU8gKEhlYWRlclRyYW5zcG9ydCBpIG8pCitvcGVuSGVhZGVyVHJhbnNwb3J0IGkgbyA9IGRvCisgIHBpZCA8LSBuZXdJT1JlZiBUQ29tcGFjdAorICByQnVmIDwtIG5ld0lPUmVmIExCUy5lbXB0eQorICB3QnVmIDwtIG5ld0lPUmVmIG1lbXB0eQorICBjVHlwZSA8LSBuZXdJT1JlZiBIZWFkZXJDbGllbnQKKyAgaCA8LSBuZXdJT1JlZiBbXQorICB0cmFucyA8LSBuZXdJT1JlZiBbXQorICByZXR1cm4gSGVhZGVyVHJhbnNwb3J0CisgICAgICB7IHJlYWRCdWZmZXIgPSByQnVmCisgICAgICAsIHdyaXRlQnVmZmVyID0gd0J1ZgorICAgICAgLCBpblRyYW5zID0gaQorICAgICAgLCBvdXRUcmFucyA9IG8KKyAgICAgICwgY2xpZW50VHlwZSA9IGNUeXBlCisgICAgICAsIHByb3RvY29sVHlwZSA9IHBpZAorICAgICAgLCBoZWFkZXJzID0gaAorICAgICAgLCB3cml0ZUhlYWRlcnMgPSBNYXAuZW1wdHkKKyAgICAgICwgdHJhbnNmb3JtcyA9IHRyYW5zCisgICAgICAsIHdyaXRlVHJhbnNmb3JtcyA9IFtdCisgICAgICB9CisKK2lzRnJhbWVkIHQgPSAoLz0gVW5mcmFtZWQpIDwkPiByZWFkSU9SZWYgKGNsaWVudFR5cGUgdCkKKworcmVhZEZyYW1lIDo6IChUcmFuc3BvcnQgaSwgVHJhbnNwb3J0IG8pID0+IEhlYWRlclRyYW5zcG9ydCBpIG8gLT4gSU8gQm9vbAorcmVhZEZyYW1lIHQgPSBkbworICBsZXQgaW5wdXQgPSBpblRyYW5zIHQKKyAgbGV0IHJCdWYgPSByZWFkQnVmZmVyIHQKKyAgbGV0IGNUeXBlID0gY2xpZW50VHlwZSB0CisgIGxzeiA8LSB0UmVhZCBpbnB1dCA0CisgIGxldCBzeiA9IExCUy50b1N0cmljdCBsc3oKKyAgY2FzZSBQLnBhcnNlT25seSBQLmVuZE9mSW5wdXQgc3ogb2YKKyAgICBSaWdodCBfIC0+IGRvIHJldHVybiBGYWxzZQorICAgIExlZnQgXyAtPiBkbworICAgICAgY2FzZSBwYXJzZUJpbmFyeU1hZ2ljIHN6IG9mCisgICAgICAgIFJpZ2h0IF8gLT4gZG8KKyAgICAgICAgICB3cml0ZUlPUmVmIHJCdWYgJCBsc3oKKyAgICAgICAgICB3cml0ZUlPUmVmIGNUeXBlIFVuZnJhbWVkCisgICAgICAgICAgd3JpdGVJT1JlZiAocHJvdG9jb2xUeXBlIHQpIFRCaW5hcnkKKyAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBMZWZ0IF8gLT4gZG8KKyAgICAgICAgICBjYXNlIHBhcnNlQ29tcGFjdE1hZ2ljIHN6IG9mCisgICAgICAgICAgICBSaWdodCBfIC0+IGRvCisgICAgICAgICAgICAgIHdyaXRlSU9SZWYgckJ1ZiAkIGxzegorICAgICAgICAgICAgICB3cml0ZUlPUmVmIGNUeXBlIFVuZnJhbWVkCisgICAgICAgICAgICAgIHdyaXRlSU9SZWYgKHByb3RvY29sVHlwZSB0KSBUQ29tcGFjdAorICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgTGVmdCBfIC0+IGRvCisgICAgICAgICAgICAgIGxldCBsZW4gPSBCaW5hcnkuZGVjb2RlIGxzeiA6OiBJbnQzMgorICAgICAgICAgICAgICBsYnVmIDwtIHRSZWFkQWxsIGlucHV0ICQgZnJvbUludGVncmFsIGxlbgorICAgICAgICAgICAgICBsZXQgYnVmID0gTEJTLnRvU3RyaWN0IGxidWYKKyAgICAgICAgICAgICAgY2FzZSBwYXJzZUJpbmFyeU1hZ2ljIGJ1ZiBvZgorICAgICAgICAgICAgICAgIFJpZ2h0IF8gLT4gZG8KKyAgICAgICAgICAgICAgICAgIHdyaXRlSU9SZWYgY1R5cGUgRnJhbWVkCisgICAgICAgICAgICAgICAgICB3cml0ZUlPUmVmIChwcm90b2NvbFR5cGUgdCkgVEJpbmFyeQorICAgICAgICAgICAgICAgICAgd3JpdGVJT1JlZiByQnVmIGxidWYKKyAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICAgICAgTGVmdCBfIC0+IGRvCisgICAgICAgICAgICAgICAgICBjYXNlIHBhcnNlQ29tcGFjdE1hZ2ljIGJ1ZiBvZgorICAgICAgICAgICAgICAgICAgICBSaWdodCBfIC0+IGRvCisgICAgICAgICAgICAgICAgICAgICAgd3JpdGVJT1JlZiBjVHlwZSBGcmFtZWQKKyAgICAgICAgICAgICAgICAgICAgICB3cml0ZUlPUmVmIChwcm90b2NvbFR5cGUgdCkgVENvbXBhY3QKKyAgICAgICAgICAgICAgICAgICAgICB3cml0ZUlPUmVmIHJCdWYgbGJ1ZgorICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICAgICAgICAgIExlZnQgXyAtPiBkbworICAgICAgICAgICAgICAgICAgICAgIGNhc2UgcGFyc2VIZWFkZXJNYWdpYyBidWYgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgIFJpZ2h0IGZsYWdzIC0+IGRvCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCAoZmxhZ3MsIHNlcU51bSwgaGVhZGVyLCBib2R5KSA9IGV4dHJhY3RIZWFkZXIgYnVmCisgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlSU9SZWYgY1R5cGUgSGVhZGVyQ2xpZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUhlYWRlciB0IGhlYWRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkIDwtIHVudHJhbnNmb3JtIHQgYm9keQorICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUlPUmVmIHJCdWYgJCBMQlMuZnJvbVN0cmljdCAkIHBheWxvYWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgIExlZnQgXyAtPgorICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAkIFRyYW5zcG9ydEV4biAiSGVhZGVyVHJhbnNwb3J0OiB1bmtvbnduIGNsaWVudCB0eXBlIiBURV9VTktOT1dOCisKK3BhcnNlQmluYXJ5TWFnaWMgPSBQLnBhcnNlT25seSAkIFAud29yZDggMHg4MCAqPiBQLndvcmQ4IDB4MDEgKj4gUC53b3JkOCAweDAwICo+IFAuYW55V29yZDgKK3BhcnNlQ29tcGFjdE1hZ2ljID0gUC5wYXJzZU9ubHkgJCBQLndvcmQ4IDB4ODIgKj4gUC5zYXRpc2Z5IChcYiAtPiBiIC4mLiAweDFmID09IDB4MDEpCitwYXJzZUhlYWRlck1hZ2ljID0gUC5wYXJzZU9ubHkgJCBQLndvcmQ4IDB4MGYgKj4gUC53b3JkOCAweGZmICo+IChQLmNvdW50IDIgUC5hbnlXb3JkOCkKKworcGFyc2VJMzIgOjogUC5QYXJzZXIgSW50MzIKK3BhcnNlSTMyID0gQmluYXJ5LmRlY29kZSAuIExCUy5mcm9tU3RyaWN0IDwkPiBQLnRha2UgNAorcGFyc2VJMTYgOjogUC5QYXJzZXIgSW50MTYKK3BhcnNlSTE2ID0gQmluYXJ5LmRlY29kZSAuIExCUy5mcm9tU3RyaWN0IDwkPiBQLnRha2UgMgorCitleHRyYWN0SGVhZGVyIDo6IEJTLkJ5dGVTdHJpbmcgLT4gKEludDE2LCBJbnQzMiwgQlMuQnl0ZVN0cmluZywgQlMuQnl0ZVN0cmluZykKK2V4dHJhY3RIZWFkZXIgYnMgPQorICBjYXNlIFAucGFyc2UgZXh0cmFjdEhlYWRlcl8gYnMgb2YKKyAgICBQLkRvbmUgcmVtYWluIChmbGFncywgc2VxTnVtLCBoZWFkZXIpIC0+IChmbGFncywgc2VxTnVtLCBoZWFkZXIsIHJlbWFpbikKKyAgICBfIC0+IHRocm93ICQgVHJhbnNwb3J0RXhuICJIZWFkZXJUcmFuc3BvcnQ6IEludmFsaWQgaGVhZGVyIiBURV9VTktOT1dOCisgIHdoZXJlCisgICAgZXh0cmFjdEhlYWRlcl8gPSBkbworICAgICAgbWFnaWMgPC0gUC53b3JkOCAweDBmICo+IFAud29yZDggMHhmZgorICAgICAgZmxhZ3MgPC0gcGFyc2VJMTYKKyAgICAgIHNlcU51bSA8LSBwYXJzZUkzMgorICAgICAgKGhlYWRlclNpemUgOjogSW50KSA8LSAoKiA0KSAuIGZyb21JbnRlZ3JhbCA8JD4gcGFyc2VJMTYKKyAgICAgIGhlYWRlciA8LSBQLnRha2UgaGVhZGVyU2l6ZQorICAgICAgcmV0dXJuIChmbGFncywgc2VxTnVtLCBoZWFkZXIpCisKK2hhbmRsZUhlYWRlciB0IGhlYWRlciA9CisgIGNhc2UgUC5wYXJzZU9ubHkgcGFyc2VIZWFkZXIgaGVhZGVyIG9mCisgICAgUmlnaHQgKHBUeXBlLCB0cmFucywgaW5mbykgLT4gZG8KKyAgICAgIHdyaXRlSU9SZWYgKHByb3RvY29sVHlwZSB0KSBwVHlwZQorICAgICAgd3JpdGVJT1JlZiAodHJhbnNmb3JtcyB0KSB0cmFucworICAgICAgd3JpdGVJT1JlZiAoaGVhZGVycyB0KSBpbmZvCisgICAgXyAtPiB0aHJvdyAkIFRyYW5zcG9ydEV4biAiSGVhZGVyVHJhbnNwb3J0OiBJbnZhbGlkIGhlYWRlciIgVEVfVU5LTk9XTgorCisKK2l3MTYgOjogSW50MTYgLT4gV29yZDE2CitpdzE2ID0gZnJvbUludGVncmFsCitpdzMyIDo6IEludDMyIC0+IFdvcmQzMgoraXczMiA9IGZyb21JbnRlZ3JhbAord2kxNiA6OiBXb3JkMTYgLT4gSW50MTYKK3dpMTYgPSBmcm9tSW50ZWdyYWwKK3dpMzIgOjogV29yZDMyIC0+IEludDMyCit3aTMyID0gZnJvbUludGVncmFsCisKK3BhcnNlSGVhZGVyIDo6IFAuUGFyc2VyIChQcm90b2NvbFR5cGUsIFtUcmFuc2Zvcm1UeXBlXSwgWyhTdHJpbmcsIFN0cmluZyldKQorcGFyc2VIZWFkZXIgPSBkbworICBwcm90b2NvbFR5cGUgPC0gdG9Qcm90b2NvbFR5cGUgPCQ+IHBhcnNlVmFyaW50IHdpMTYKKyAgbnVtVHJhbnMgPC0gZnJvbUludGVncmFsIDwkPiBwYXJzZVZhcmludCB3aTE2CisgIHRyYW5zIDwtIHJlcGxpY2F0ZU0gbnVtVHJhbnMgcGFyc2VUcmFuc2Zvcm0KKyAgaW5mbyA8LSBwYXJzZUluZm8KKyAgcmV0dXJuIChwcm90b2NvbFR5cGUsIHRyYW5zLCBpbmZvKQorCit0b1Byb3RvY29sVHlwZSA6OiBJbnQxNiAtPiBQcm90b2NvbFR5cGUKK3RvUHJvdG9jb2xUeXBlIDAgPSBUQmluYXJ5Cit0b1Byb3RvY29sVHlwZSAxID0gVEpTT04KK3RvUHJvdG9jb2xUeXBlIDIgPSBUQ29tcGFjdAorCitmcm9tUHJvdG9jb2xUeXBlIDo6IFByb3RvY29sVHlwZSAtPiBJbnQxNgorZnJvbVByb3RvY29sVHlwZSBUQmluYXJ5ID0gMAorZnJvbVByb3RvY29sVHlwZSBUSlNPTiA9IDEKK2Zyb21Qcm90b2NvbFR5cGUgVENvbXBhY3QgPSAyCisKK3BhcnNlVHJhbnNmb3JtIDo6IFAuUGFyc2VyIFRyYW5zZm9ybVR5cGUKK3BhcnNlVHJhbnNmb3JtID0gdG9UcmFuc3BvcnRUeXBlIDwkPiBwYXJzZVZhcmludCB3aTE2CisKK3BhcnNlSW5mbyA6OiBQLlBhcnNlciBbKFN0cmluZywgU3RyaW5nKV0KK3BhcnNlSW5mbyA9IGRvCisgIG4gPC0gUC5laXRoZXJQIFAuZW5kT2ZJbnB1dCAocGFyc2VWYXJpbnQgd2kzMikKKyAgY2FzZSBuIG9mCisgICAgTGVmdCBfIC0+IHJldHVybiBbXQorICAgIFJpZ2h0IG4wIC0+CisgICAgICByZXBsaWNhdGVNIChmcm9tSW50ZWdyYWwgbjApICQgZG8KKyAgICAgICAga2xlbiA8LSBwYXJzZVZhcmludCB3aTE2CisgICAgICAgIGsgPC0gUC50YWtlICQgZnJvbUludGVncmFsIGtsZW4KKyAgICAgICAgdmxlbiA8LSBwYXJzZVZhcmludCB3aTE2CisgICAgICAgIHYgPC0gUC50YWtlICQgZnJvbUludGVncmFsIHZsZW4KKyAgICAgICAgcmV0dXJuIChDLnVucGFjayBrLCBDLnVucGFjayB2KQorCitwYXJzZVN0cmluZyA6OiBQLlBhcnNlciBCUy5CeXRlU3RyaW5nCitwYXJzZVN0cmluZyA9IHBhcnNlVmFyaW50IHdpMzIgPj49IChQLnRha2UgLiBmcm9tSW50ZWdyYWwpCisKK2J1aWxkSGVhZGVyIDo6IEhlYWRlclRyYW5zcG9ydCBpIG8gLT4gSU8gQi5CdWlsZGVyCitidWlsZEhlYWRlciB0ID0gZG8KKyAgcFR5cGUgPC0gcmVhZElPUmVmICQgcHJvdG9jb2xUeXBlIHQKKyAgbGV0IHBJZCA9IGJ1aWxkVmFyaW50ICQgaXcxNiAkIGZyb21Qcm90b2NvbFR5cGUgcFR5cGUKKyAgbGV0IGhlYWRlckNvbnRlbnQgPSBwSWQgPD4gKGJ1aWxkVHJhbnNmb3JtcyB0KSA8PiAoYnVpbGRJbmZvIHQpCisgIGxldCBsZW4gPSBmcm9tSW50ZWdyYWwgJCBMQlMubGVuZ3RoICQgQi50b0xhenlCeXRlU3RyaW5nIGhlYWRlckNvbnRlbnQKKyAgLS0gVE9ETzogbGVuZ3RoIGxpbWl0IGNoZWNrCisgIGxldCBwYWRkaW5nID0gbWNvbmNhdCAkIHJlcGxpY2F0ZSAobW9kIGxlbiA0KSAkIEIud29yZDggMAorICBsZXQgY29kZWRMZW4gPSBCLmludDE2QkUgKGZyb21JbnRlZ3JhbCAkIChxdW90IChsZW4gLSAxKSA0KSArIDEpCisgIGxldCBmbGFncyA9IDAKKyAgbGV0IHNlcU51bSA9IDAKKyAgcmV0dXJuICQgQi5pbnQxNkJFIDB4MGZmZiA8PiBCLmludDE2QkUgZmxhZ3MgPD4gQi5pbnQzMkJFIHNlcU51bSA8PiBjb2RlZExlbiA8PiBoZWFkZXJDb250ZW50IDw+IHBhZGRpbmcKKworYnVpbGRUcmFuc2Zvcm1zIDo6IEhlYWRlclRyYW5zcG9ydCBpIG8gLT4gQi5CdWlsZGVyCistLSBUT0RPOiBjaGVjayBsZW5ndGggbGltaXQKK2J1aWxkVHJhbnNmb3JtcyB0ID0KKyAgbGV0IHRyYW5zID0gd3JpdGVUcmFuc2Zvcm1zIHQgaW4KKyAgKGJ1aWxkVmFyaW50ICQgaXcxNiAkIGZyb21JbnRlZ3JhbCAkIGxlbmd0aCB0cmFucykgPD4KKyAgKG1jb25jYXQgJCBtYXAgKGJ1aWxkVmFyaW50IC4gaXcxNiAuIGZyb21UcmFuc3BvcnRUeXBlKSB0cmFucykKKworYnVpbGRJbmZvIDo6IEhlYWRlclRyYW5zcG9ydCBpIG8gLT4gQi5CdWlsZGVyCitidWlsZEluZm8gdCA9CisgIGxldCBoID0gTWFwLmFzc29jcyAkIHdyaXRlSGVhZGVycyB0IGluCisgIC0tIFRPRE86IGNoZWNrIGxlbmd0aCBsaW1pdAorICBjYXNlIGxlbmd0aCBoIG9mCisgICAgMCAtPiBtZW1wdHkKKyAgICBsZW4gLT4gKGJ1aWxkVmFyaW50ICQgaXcxNiAkIGZyb21JbnRlZ3JhbCAkIGxlbikgPD4gKG1jb25jYXQgJCBtYXAgYnVpbGRJbmZvRW50cnkgaCkKKyAgd2hlcmUKKyAgICBidWlsZEluZm9FbnRyeSAoaywgdikgPSBidWlsZFZhclN0ciBrIDw+IGJ1aWxkVmFyU3RyIHYKKyAgICAtLSBUT0RPOiBjaGVjayBsZW5ndGggbGltaXQKKyAgICBidWlsZFZhclN0ciBzID0gKGJ1aWxkVmFyaW50ICQgaXcxNiAkIGZyb21JbnRlZ3JhbCAkIGxlbmd0aCBzKSA8PiBCLnN0cmluZzggcworCit0UmVzZXRQcm90b2NvbCA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBIZWFkZXJUcmFuc3BvcnQgaSBvIC0+IElPIEJvb2wKK3RSZXNldFByb3RvY29sIHQgPSBkbworICByQnVmIDwtIHJlYWRJT1JlZiAkIHJlYWRCdWZmZXIgdAorICB3cml0ZUlPUmVmIChjbGllbnRUeXBlIHQpIEhlYWRlckNsaWVudAorICByZWFkRnJhbWUgdAorCit0U2V0UHJvdG9jb2wgOjogKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gSGVhZGVyVHJhbnNwb3J0IGkgbyAtPiBQcm90b2NvbFR5cGUgLT4gSU8gKCkKK3RTZXRQcm90b2NvbCB0ID0gd3JpdGVJT1JlZiAocHJvdG9jb2xUeXBlIHQpCisKK3RyYW5zZm9ybSA6OiBIZWFkZXJUcmFuc3BvcnQgaSBvIC0+IExCUy5CeXRlU3RyaW5nIC0+IExCUy5CeXRlU3RyaW5nCit0cmFuc2Zvcm0gdCBicyA9CisgIGZvbGRyIGFwcGx5VHJhbnNmb3JtIGJzICQgd3JpdGVUcmFuc2Zvcm1zIHQKKyAgd2hlcmUKKyAgICAtLSBhcHBseVRyYW5zZm9ybSBicyBabGliVHJhbnNmb3JtID0KKyAgICAtLSAgIHRocm93ICQgVHJhbnNwb3J0RXhuICJIZWFkZXJUcmFuc3BvcnQ6IG5vdCBpbXBsZW1lbnRlZDogWmxpYlRyYW5zZm9ybSAgIiBURV9VTktOT1dOCisgICAgYXBwbHlUcmFuc2Zvcm0gYnMgXyA9CisgICAgICB0aHJvdyAkIFRyYW5zcG9ydEV4biAiSGVhZGVyVHJhbnNwb3J0OiBVbmtub3duIHRyYW5zZm9ybSIgVEVfVU5LTk9XTgorCit1bnRyYW5zZm9ybSA6OiBIZWFkZXJUcmFuc3BvcnQgaSBvIC0+IEJTLkJ5dGVTdHJpbmcgLT4gSU8gQlMuQnl0ZVN0cmluZwordW50cmFuc2Zvcm0gdCBicyA9IGRvCisgIHRyYW5zIDwtIHJlYWRJT1JlZiAkIHRyYW5zZm9ybXMgdAorICByZXR1cm4gJCBmb2xkbCB1bmFwcGx5VHJhbnNmb3JtIGJzIHRyYW5zCisgIHdoZXJlCisgICAgLS0gdW5hcHBseVRyYW5zZm9ybSBicyBabGliVHJhbnNmb3JtID0KKyAgICAtLSAgIHRocm93ICQgVHJhbnNwb3J0RXhuICJIZWFkZXJUcmFuc3BvcnQ6IG5vdCBpbXBsZW1lbnRlZDogWmxpYlRyYW5zZm9ybSAgIiBURV9VTktOT1dOCisgICAgdW5hcHBseVRyYW5zZm9ybSBicyBfID0KKyAgICAgIHRocm93ICQgVHJhbnNwb3J0RXhuICJIZWFkZXJUcmFuc3BvcnQ6IFVua25vd24gdHJhbnNmb3JtIiBURV9VTktOT1dOCisKK2luc3RhbmNlIChUcmFuc3BvcnQgaSwgVHJhbnNwb3J0IG8pID0+IFRyYW5zcG9ydCAoSGVhZGVyVHJhbnNwb3J0IGkgbykgd2hlcmUKKyAgdElzT3BlbiB0ID0gZG8KKyAgICB0SXNPcGVuIChpblRyYW5zIHQpCisgICAgdElzT3BlbiAob3V0VHJhbnMgdCkKKworICB0Q2xvc2UgdCA9IGRvCisgICAgdENsb3NlKG91dFRyYW5zIHQpCisgICAgdENsb3NlKGluVHJhbnMgdCkKKworICB0UmVhZCB0IGxlbiA9IGRvCisgICAgckJ1ZiA8LSByZWFkSU9SZWYgJCByZWFkQnVmZmVyIHQKKyAgICBpZiBub3QgJCBMQlMubnVsbCByQnVmCisgICAgICB0aGVuIGRvCisgICAgICAgIGxldCAoY29uc3VtZWQsIHJlbWFpbikgPSBMQlMuc3BsaXRBdCAoZnJvbUludGVncmFsIGxlbikgckJ1ZgorICAgICAgICB3cml0ZUlPUmVmIChyZWFkQnVmZmVyIHQpIHJlbWFpbgorICAgICAgICByZXR1cm4gY29uc3VtZWQKKyAgICAgIGVsc2UgZG8KKyAgICAgICAgZnJhbWVkIDwtIGlzRnJhbWVkIHQKKyAgICAgICAgaWYgbm90IGZyYW1lZAorICAgICAgICAgIHRoZW4gdFJlYWQgKGluVHJhbnMgdCkgbGVuCisgICAgICAgICAgZWxzZSBkbworICAgICAgICAgICAgb2sgPC0gcmVhZEZyYW1lIHQKKyAgICAgICAgICAgIGlmIG9rCisgICAgICAgICAgICAgIHRoZW4gdFJlYWQgdCBsZW4KKyAgICAgICAgICAgICAgZWxzZSByZXR1cm4gTEJTLmVtcHR5CisKKyAgdFBlZWsgdCA9IGRvCisgICAgckJ1ZiA8LSByZWFkSU9SZWYgKHJlYWRCdWZmZXIgdCkKKyAgICBpZiBub3QgJCBMQlMubnVsbCByQnVmCisgICAgICB0aGVuIHJldHVybiAkIEp1c3QgJCBMQlMuaGVhZCByQnVmCisgICAgICBlbHNlIGRvCisgICAgICAgIGZyYW1lZCA8LSBpc0ZyYW1lZCB0CisgICAgICAgIGlmIG5vdCBmcmFtZWQKKyAgICAgICAgICB0aGVuIHRQZWVrIChpblRyYW5zIHQpCisgICAgICAgICAgZWxzZSBkbworICAgICAgICAgICAgb2sgPC0gcmVhZEZyYW1lIHQKKyAgICAgICAgICAgIGlmIG9rCisgICAgICAgICAgICAgIHRoZW4gdFBlZWsgdAorICAgICAgICAgICAgICBlbHNlIHJldHVybiBOb3RoaW5nCisKKyAgdFdyaXRlIHQgYnVmID0gZG8KKyAgICBsZXQgd0J1ZiA9IHdyaXRlQnVmZmVyIHQKKyAgICBmcmFtZWQgPC0gaXNGcmFtZWQgdAorICAgIGlmIGZyYW1lZAorICAgICAgdGhlbiBtb2RpZnlJT1JlZiB3QnVmICg8PiBCLmxhenlCeXRlU3RyaW5nIGJ1ZikKKyAgICAgIGVsc2UKKyAgICAgICAgLS0gVE9ETzogd2hhdCBzaG91bGQgd2UgZG8gd2hlbiBzd2l0Y2hlZCB0byB1bmZyYW1lZCBpbiB0aGUgbWlkZGxlID8KKyAgICAgICAgdFdyaXRlKG91dFRyYW5zIHQpIGJ1ZgorCisgIHRGbHVzaCB0ID0gZG8KKyAgICBjVHlwZSA8LSByZWFkSU9SZWYgJCBjbGllbnRUeXBlIHQKKyAgICBjYXNlIGNUeXBlIG9mCisgICAgICBVbmZyYW1lZCAtPiB0Rmx1c2ggJCBvdXRUcmFucyB0CisgICAgICBGcmFtZWQgLT4gZmx1c2hCdWZmZXIgdCBpZCBtZW1wdHkKKyAgICAgIEhlYWRlckNsaWVudCAtPiBidWlsZEhlYWRlciB0ID4+PSBmbHVzaEJ1ZmZlciB0ICh0cmFuc2Zvcm0gdCkKKyAgICB3aGVyZQorICAgICAgZmx1c2hCdWZmZXIgdCBmIGhlYWRlciA9IGRvCisgICAgICAgIHdCdWYgPC0gcmVhZElPUmVmICQgd3JpdGVCdWZmZXIgdAorICAgICAgICB3cml0ZUlPUmVmICh3cml0ZUJ1ZmZlciB0KSBtZW1wdHkKKyAgICAgICAgbGV0IHBheWxvYWQgPSBCLnRvTGF6eUJ5dGVTdHJpbmcgKGhlYWRlciA8PiB3QnVmKQorICAgICAgICB0V3JpdGUgKG91dFRyYW5zIHQpICQgQmluYXJ5LmVuY29kZSAoZnJvbUludGVncmFsICQgTEJTLmxlbmd0aCBwYXlsb2FkIDo6IEludDMyKQorICAgICAgICB0V3JpdGUgKG91dFRyYW5zIHQpICQgZiBwYXlsb2FkCisgICAgICAgIHRGbHVzaCAob3V0VHJhbnMgdCkKZGlmZiAtLWdpdCBhL2xpYi9ocy9zcmMvVGhyaWZ0L1RyYW5zcG9ydC9NZW1vcnkuaHMgYi9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQvTWVtb3J5LmhzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjOTNhZjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQvTWVtb3J5LmhzCkBAIC0wLDAgKzEsNzcgQEAKKy0tCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCittb2R1bGUgVGhyaWZ0LlRyYW5zcG9ydC5NZW1vcnkKKyAgICAgICAoIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAsIE1lbW9yeUJ1ZmZlciguLikKKyAgICAgICApIHdoZXJlCisKK2ltcG9ydCBEYXRhLkJ5dGVTdHJpbmcuTGF6eS5CdWlsZGVyCitpbXBvcnQgRGF0YS5GdW5jdG9yCitpbXBvcnQgRGF0YS5JT1JlZgoraW1wb3J0IERhdGEuTW9ub2lkCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5MYXp5IGFzIExCUworCitpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydAorCisKK2RhdGEgTWVtb3J5QnVmZmVyID0gTWVtb3J5QnVmZmVyIHsKKyAgd3JpdGVCdWZmZXIgOjogSU9SZWYgQnVpbGRlciwKKyAgcmVhZEJ1ZmZlciA6OiBJT1JlZiBMQlMuQnl0ZVN0cmluZworfQorCitvcGVuTWVtb3J5QnVmZmVyIDo6IElPIE1lbW9yeUJ1ZmZlcgorb3Blbk1lbW9yeUJ1ZmZlciA9IGRvCisgIHdidWYgPC0gbmV3SU9SZWYgbWVtcHR5CisgIHJidWYgPC0gbmV3SU9SZWYgbWVtcHR5CisgIHJldHVybiBNZW1vcnlCdWZmZXIgeworICAgIHdyaXRlQnVmZmVyID0gd2J1ZiwKKyAgICByZWFkQnVmZmVyID0gcmJ1ZgorICB9CisKK2luc3RhbmNlIFRyYW5zcG9ydCBNZW1vcnlCdWZmZXIgd2hlcmUKKyAgdElzT3BlbiA9IGNvbnN0ICQgcmV0dXJuIEZhbHNlCisgIHRDbG9zZSAgPSBjb25zdCAkIHJldHVybiAoKQorICB0Rmx1c2ggdHJhbnMgPSBkbworICAgIGxldCB3QnVmID0gd3JpdGVCdWZmZXIgdHJhbnMKKyAgICB3YiA8LSByZWFkSU9SZWYgd0J1ZgorICAgIG1vZGlmeUlPUmVmIChyZWFkQnVmZmVyIHRyYW5zKSAkIFxyYiAtPiBtYXBwZW5kIHJiICQgdG9MYXp5Qnl0ZVN0cmluZyB3YgorICAgIHdyaXRlSU9SZWYgd0J1ZiBtZW1wdHkKKworICB0UmVhZCBfIDAgPSByZXR1cm4gbWVtcHR5CisgIHRSZWFkIHRyYW5zIG4gPSBkbworICAgIGxldCByYnVmID0gcmVhZEJ1ZmZlciB0cmFucworICAgIHJiIDwtIHJlYWRJT1JlZiByYnVmCisgICAgbGV0IGxlbiA9IGZyb21JbnRlZ3JhbCAkIExCUy5sZW5ndGggcmIKKyAgICBpZiBsZW4gPT0gMAorICAgICAgdGhlbiBkbworICAgICAgICB0Rmx1c2ggdHJhbnMKKyAgICAgICAgcmIyIDwtIHJlYWRJT1JlZiAocmVhZEJ1ZmZlciB0cmFucykKKyAgICAgICAgaWYgKGZyb21JbnRlZ3JhbCAkIExCUy5sZW5ndGggcmIyKSA9PSAwCisgICAgICAgICAgdGhlbiByZXR1cm4gbWVtcHR5CisgICAgICAgICAgZWxzZSB0UmVhZCB0cmFucyBuCisgICAgICBlbHNlIGRvCisgICAgICAgIGxldCAocmV0LCByZW1haW4pID0gTEJTLnNwbGl0QXQgKGZyb21JbnRlZ3JhbCBuKSByYgorICAgICAgICB3cml0ZUlPUmVmIHJidWYgcmVtYWluCisgICAgICAgIHJldHVybiByZXQKKworICB0UGVlayB0cmFucyA9IChmbWFwIGZzdCAuIExCUy51bmNvbnMpIDwkPiByZWFkSU9SZWYgKHJlYWRCdWZmZXIgdHJhbnMpCisKKyAgdFdyaXRlIHRyYW5zIHYgPSBkbworICAgIG1vZGlmeUlPUmVmICh3cml0ZUJ1ZmZlciB0cmFucykgKDw+IGxhenlCeXRlU3RyaW5nIHYpCmRpZmYgLS1naXQgYS9saWIvaHMvc3JjL1RocmlmdC9UeXBlcy5ocyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1R5cGVzLmhzCmluZGV4IGI5MGM0MmMuLjJhMjAwMjUgMTAwNjQ0Ci0tLSBhL2xpYi9ocy9zcmMvVGhyaWZ0L1R5cGVzLmhzCisrKyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1R5cGVzLmhzCkBAIC0zMSwxMiArMzEsNiBAQAogaW1wb3J0IHF1YWxpZmllZCBEYXRhLkhhc2hTZXQgYXMgU2V0CiBpbXBvcnQgcXVhbGlmaWVkIERhdGEuVmVjdG9yIGFzIFZlY3RvcgogCi1pbnN0YW5jZSAoSGFzaGFibGUgaywgSGFzaGFibGUgdikgPT4gSGFzaGFibGUgKE1hcC5IYXNoTWFwIGsgdikgd2hlcmUKLSAgaGFzaFdpdGhTYWx0IHNhbHQgPSBmb2xkbCcgaGFzaFdpdGhTYWx0IHNhbHQgLiBNYXAudG9MaXN0Ci0KLWluc3RhbmNlIChIYXNoYWJsZSBhKSA9PiBIYXNoYWJsZSAoU2V0Lkhhc2hTZXQgYSkgd2hlcmUKLSAgaGFzaFdpdGhTYWx0ID0gZm9sZGwnIGhhc2hXaXRoU2FsdAotCiBpbnN0YW5jZSAoSGFzaGFibGUgYSkgPT4gSGFzaGFibGUgKFZlY3Rvci5WZWN0b3IgYSkgd2hlcmUKICAgaGFzaFdpdGhTYWx0ID0gVmVjdG9yLmZvbGRsJyBoYXNoV2l0aFNhbHQKIApAQCAtNTMsNiArNDcsNyBAQAogICAgICAgICAgICAgICAgfCBUSTMyIEludDMyCiAgICAgICAgICAgICAgICB8IFRJNjQgSW50NjQKICAgICAgICAgICAgICAgIHwgVFN0cmluZyBMQlMuQnl0ZVN0cmluZworICAgICAgICAgICAgICAgfCBUQmluYXJ5IExCUy5CeXRlU3RyaW5nCiAgICAgICAgICAgICAgICB8IFREb3VibGUgRG91YmxlCiAgICAgICAgICAgICAgICAgIGRlcml2aW5nIChFcSwgU2hvdykKIApAQCAtNzAsNiArNjUsNyBAQAogICAgIHwgVF9JMzIKICAgICB8IFRfSTY0CiAgICAgfCBUX1NUUklORworICAgIHwgVF9CSU5BUlkKICAgICB8IFRfU1RSVUNUIFR5cGVNYXAKICAgICB8IFRfTUFQIFRocmlmdFR5cGUgVGhyaWZ0VHlwZQogICAgIHwgVF9TRVQgVGhyaWZ0VHlwZQpAQCAtODksNiArODUsNyBAQAogICAgIGZyb21FbnVtIFRfSTMyICAgICAgICA9IDgKICAgICBmcm9tRW51bSBUX0k2NCAgICAgICAgPSAxMAogICAgIGZyb21FbnVtIFRfU1RSSU5HICAgICA9IDExCisgICAgZnJvbUVudW0gVF9CSU5BUlkgICAgID0gMTEKICAgICBmcm9tRW51bSAoVF9TVFJVQ1QgXykgPSAxMgogICAgIGZyb21FbnVtIChUX01BUCBfIF8pICA9IDEzCiAgICAgZnJvbUVudW0gKFRfU0VUIF8pICAgID0gMTQKQEAgLTEwMyw2ICsxMDAsNyBAQAogICAgIHRvRW51bSA4ICA9IFRfSTMyCiAgICAgdG9FbnVtIDEwID0gVF9JNjQKICAgICB0b0VudW0gMTEgPSBUX1NUUklORworICAgIC0tIHRvRW51bSAxMSA9IFRfQklOQVJZCiAgICAgdG9FbnVtIDEyID0gVF9TVFJVQ1QgTWFwLmVtcHR5CiAgICAgdG9FbnVtIDEzID0gVF9NQVAgVF9WT0lEIFRfVk9JRAogICAgIHRvRW51bSAxNCA9IFRfU0VUIFRfVk9JRApkaWZmIC0tZ2l0IGEvbGliL2hzL3Rlc3QvQmluYXJ5U3BlYy5ocyBiL2xpYi9ocy90ZXN0L0JpbmFyeVNwZWMuaHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY5MmZhYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ocy90ZXN0L0JpbmFyeVNwZWMuaHMKQEAgLTAsMCArMSw5MSBAQAorLS0KKy0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCistLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCistLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCistLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCistLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy0tCistLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLS0KKy0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCistLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCistLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCistLSB1bmRlciB0aGUgTGljZW5zZS4KKy0tCisKK21vZHVsZSBCaW5hcnlTcGVjIHdoZXJlCisKK2ltcG9ydCBUZXN0LkhzcGVjCitpbXBvcnQgVGVzdC5Ic3BlYy5RdWlja0NoZWNrIChwcm9wKQorCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5MYXp5IGFzIExCUworaW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcuTGF6eS5DaGFyOCBhcyBDCisKK2ltcG9ydCBUaHJpZnQuVHlwZXMKK2ltcG9ydCBUaHJpZnQuVHJhbnNwb3J0CitpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydC5NZW1vcnkKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wuQmluYXJ5CisKK3NwZWMgOjogU3BlYworc3BlYyA9IGRvCisgIGRlc2NyaWJlICJCaW5hcnlQcm90b2NvbCIgJCBkbworICAgIGRlc2NyaWJlICJkb3VibGUiICQgZG8KKyAgICAgIGl0ICJ3cml0ZXMgaW4gYmlnIGVuZGlhbiBvcmRlciIgJCBkbworICAgICAgICBsZXQgdmFsID0gMiAqKiA1MworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEJpbmFyeVByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvIChURG91YmxlIHZhbCkKKyAgICAgICAgYmluIDwtIHRSZWFkIHRyYW5zIDgKKyAgICAgICAgKExCUy51bnBhY2sgYmluKSBgc2hvdWxkQmVgWzY3LCA2NCwgMCwgMCwgMCwgMCwgMCwgMF0KKworICAgICAgaXQgInJlYWRzIGluIGJpZyBlbmRpYW4gb3JkZXIiICQgZG8KKyAgICAgICAgbGV0IGJpbiA9IExCUy5wYWNrIFs2NywgNjQsIDAsIDAsIDAsIDAsIDAsIDBdCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gQmluYXJ5UHJvdG9jb2wgdHJhbnMKKyAgICAgICAgdFdyaXRlIHRyYW5zIGJpbgorICAgICAgICB2YWwgPC0gcmVhZFZhbCBwcm90byBUX0RPVUJMRQorICAgICAgICB2YWwgYHNob3VsZEJlYCAoVERvdWJsZSAkIDIgKiogNTMpCisKKyAgICAgIHByb3AgInJvdW5kIHRyaXAiICQgXHZhbCAtPiBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEJpbmFyeVByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvICQgVERvdWJsZSB2YWwKKyAgICAgICAgdmFsMiA8LSByZWFkVmFsIHByb3RvIFRfRE9VQkxFCisgICAgICAgIHZhbDIgYHNob3VsZEJlYCAoVERvdWJsZSB2YWwpCisKKyAgICBkZXNjcmliZSAic3RyaW5nIiAkIGRvCisgICAgICBpdCAid3JpdGVzIiAkIGRvCisgICAgICAgIGxldCB2YWwgPSBDLnBhY2sgImFhYSIKKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBCaW5hcnlQcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAoVFN0cmluZyB2YWwpCisgICAgICAgIGJpbiA8LSB0UmVhZCB0cmFucyA3CisgICAgICAgIChMQlMudW5wYWNrIGJpbikgYHNob3VsZEJlYCBbMCwgMCwgMCwgMywgOTcsIDk3LCA5N10KKworICAgIGRlc2NyaWJlICJiaW5hcnkiICQgZG8KKyAgICAgIGl0ICJ3cml0ZXMiICQgZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBCaW5hcnlQcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAoVEJpbmFyeSAkIExCUy5wYWNrIFs0MiwgNDMsIDQ0XSkKKyAgICAgICAgYmluIDwtIHRSZWFkIHRyYW5zIDEwMAorICAgICAgICAoTEJTLnVucGFjayBiaW4pIGBzaG91bGRCZWAgWzAsIDAsIDAsIDMsIDQyLCA0MywgNDRdCisKKyAgICAgIGl0ICJyZWFkcyIgJCBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEJpbmFyeVByb3RvY29sIHRyYW5zCisgICAgICAgIHRXcml0ZSB0cmFucyAkIExCUy5wYWNrIFswLCAwLCAwLCAzLCA0MiwgNDMsIDQ0XQorICAgICAgICB2YWwgPC0gcmVhZFZhbCBwcm90byAoVF9CSU5BUlkpCisgICAgICAgIHZhbCBgc2hvdWxkQmVgIChUQmluYXJ5ICQgTEJTLnBhY2sgWzQyLCA0MywgNDRdKQorCisgICAgICBwcm9wICJyb3VuZCB0cmlwIiAkIFx2YWwgLT4gZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBCaW5hcnlQcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAoVEJpbmFyeSAkIExCUy5wYWNrIHZhbCkKKyAgICAgICAgdmFsMiA8LSByZWFkVmFsIHByb3RvIChUX0JJTkFSWSkKKyAgICAgICAgdmFsMiBgc2hvdWxkQmVgIChUQmluYXJ5ICQgTEJTLnBhY2sgdmFsKQorCmRpZmYgLS1naXQgYS9saWIvaHMvdGVzdC9Db21wYWN0U3BlYy5ocyBiL2xpYi9ocy90ZXN0L0NvbXBhY3RTcGVjLmhzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NDBlN2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaHMvdGVzdC9Db21wYWN0U3BlYy5ocwpAQCAtMCwwICsxLDgxIEBACistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworbW9kdWxlIENvbXBhY3RTcGVjIHdoZXJlCisKK2ltcG9ydCBUZXN0LkhzcGVjCitpbXBvcnQgVGVzdC5Ic3BlYy5RdWlja0NoZWNrIChwcm9wKQorCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5MYXp5IGFzIExCUworCitpbXBvcnQgVGhyaWZ0LlR5cGVzCitpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydAoraW1wb3J0IFRocmlmdC5UcmFuc3BvcnQuTWVtb3J5CitpbXBvcnQgVGhyaWZ0LlByb3RvY29sCitpbXBvcnQgVGhyaWZ0LlByb3RvY29sLkNvbXBhY3QKKworc3BlYyA6OiBTcGVjCitzcGVjID0gZG8KKyAgZGVzY3JpYmUgIkNvbXBhY3RQcm90b2NvbCIgJCBkbworICAgIGRlc2NyaWJlICJkb3VibGUiICQgZG8KKyAgICAgIGl0ICJ3cml0ZXMgaW4gbGl0dGxlIGVuZGlhbiBvcmRlciIgJCBkbworICAgICAgICBsZXQgdmFsID0gMiAqKiA1MworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IENvbXBhY3RQcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAoVERvdWJsZSB2YWwpCisgICAgICAgIGJpbiA8LSB0UmVhZEFsbCB0cmFucyA4CisgICAgICAgIChMQlMudW5wYWNrIGJpbikgYHNob3VsZEJlYFswLCAwLCAwLCAwLCAwLCAwLCA2NCwgNjddCisKKyAgICAgIGl0ICJyZWFkcyBpbiBsaXR0bGUgZW5kaWFuIG9yZGVyIiAkIGRvCisgICAgICAgIGxldCBiaW4gPSBMQlMucGFjayBbMCwgMCwgMCwgMCwgMCwgMCwgNjQsIDY3XQorICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IENvbXBhY3RQcm90b2NvbCB0cmFucworICAgICAgICB0V3JpdGUgdHJhbnMgYmluCisgICAgICAgIHZhbCA8LSByZWFkVmFsIHByb3RvIFRfRE9VQkxFCisgICAgICAgIHZhbCBgc2hvdWxkQmVgIChURG91YmxlICQgMiAqKiA1MykKKworICAgICAgcHJvcCAicm91bmQgdHJpcCIgJCBcdmFsIC0+IGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gQ29tcGFjdFByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvICQgVERvdWJsZSB2YWwKKyAgICAgICAgdmFsMiA8LSByZWFkVmFsIHByb3RvIFRfRE9VQkxFCisgICAgICAgIHZhbDIgYHNob3VsZEJlYCAoVERvdWJsZSB2YWwpCisKKyAgICBkZXNjcmliZSAiYmluYXJ5IiAkIGRvCisgICAgICBpdCAid3JpdGVzIiAkIGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gQ29tcGFjdFByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvIChUQmluYXJ5ICQgTEJTLnBhY2sgWzQyLCA0MywgNDRdKQorICAgICAgICBiaW4gPC0gdFJlYWQgdHJhbnMgMTAwCisgICAgICAgIChMQlMudW5wYWNrIGJpbikgYHNob3VsZEJlYCBbMywgNDIsIDQzLCA0NF0KKworICAgICAgaXQgInJlYWRzIiAkIGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gQ29tcGFjdFByb3RvY29sIHRyYW5zCisgICAgICAgIHRXcml0ZSB0cmFucyAkIExCUy5wYWNrIFszLCA0MiwgNDMsIDQ0XQorICAgICAgICB2YWwgPC0gcmVhZFZhbCBwcm90byAoVF9CSU5BUlkpCisgICAgICAgIHZhbCBgc2hvdWxkQmVgIChUQmluYXJ5ICQgTEJTLnBhY2sgWzQyLCA0MywgNDRdKQorCisgICAgICBwcm9wICJyb3VuZCB0cmlwIiAkIFx2YWwgLT4gZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBDb21wYWN0UHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gKFRCaW5hcnkgJCBMQlMucGFjayB2YWwpCisgICAgICAgIHZhbDIgPC0gcmVhZFZhbCBwcm90byAoVF9CSU5BUlkpCisgICAgICAgIHZhbDIgYHNob3VsZEJlYCAoVEJpbmFyeSAkIExCUy5wYWNrIHZhbCkKKwpkaWZmIC0tZ2l0IGEvbGliL2hzL3Rlc3QvSlNPTlNwZWMuaHMgYi9saWIvaHMvdGVzdC9KU09OU3BlYy5ocwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjJjODI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hzL3Rlc3QvSlNPTlNwZWMuaHMKQEAgLTAsMCArMSwyMjUgQEAKKy0tCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCittb2R1bGUgSlNPTlNwZWMgd2hlcmUKKworaW1wb3J0IFRlc3QuSHNwZWMKK2ltcG9ydCBUZXN0LkhzcGVjLlF1aWNrQ2hlY2sgKHByb3ApCisKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkxhenkgYXMgTEJTCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5MYXp5LkNoYXI4IGFzIEMKKworaW1wb3J0IFRocmlmdC5UeXBlcworaW1wb3J0IFRocmlmdC5UcmFuc3BvcnQKK2ltcG9ydCBUaHJpZnQuVHJhbnNwb3J0Lk1lbW9yeQoraW1wb3J0IFRocmlmdC5Qcm90b2NvbAoraW1wb3J0IFRocmlmdC5Qcm90b2NvbC5KU09OCisKK3RTdHJpbmcgOjogW0NoYXJdIC0+IFRocmlmdFZhbAordFN0cmluZyA9IFRTdHJpbmcgLiBDLnBhY2sKKworc3BlYyA6OiBTcGVjCitzcGVjID0gZG8KKyAgZGVzY3JpYmUgIkpTT05Qcm90b2NvbCIgJCBkbworICAgIGRlc2NyaWJlICJib29sIiAkIGRvCisgICAgICBpdCAid3JpdGVzIHRydWUgYXMgMSIgJCBkbworICAgICAgICBsZXQgdmFsID0gVHJ1ZQorICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAoVEJvb2wgdmFsKQorICAgICAgICBiaW4gPC10UmVhZCB0cmFucyAxMDAKKyAgICAgICAgKEMudW5wYWNrIGJpbikgYHNob3VsZEJlYCBbJzEnXQorCisgICAgICBpdCAid3JpdGVzIGZhbHNlIGFzIDAiICQgZG8KKyAgICAgICAgbGV0IHZhbCA9IEZhbHNlCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvIChUQm9vbCB2YWwpCisgICAgICAgIGJpbiA8LSB0UmVhZCB0cmFucyAxMDAKKyAgICAgICAgKEMudW5wYWNrIGJpbikgYHNob3VsZEJlYCBbJzAnXQorCisgICAgICBwcm9wICJyb3VuZCB0cmlwIiAkIFx2YWwgLT4gZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gJCBUQm9vbCB2YWwKKyAgICAgICAgdmFsMiA8LSByZWFkVmFsIHByb3RvIFRfQk9PTAorICAgICAgICB2YWwyIGBzaG91bGRCZWAgKFRCb29sIHZhbCkKKworICAgIGRlc2NyaWJlICJzdHJpbmciICQgZG8KKyAgICAgIGl0ICJ3cml0ZXMiICQgZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gKFRTdHJpbmcgJCBDLnBhY2sgIlwiYSIpCisgICAgICAgIGJpbiA8LSB0UmVhZCB0cmFucyAxMDAKKyAgICAgICAgKEMudW5wYWNrIGJpbikgYHNob3VsZEJlYCAiXCJcXFwiYVwiIgorCisgICAgICBpdCAicmVhZHMiICQgZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgdFdyaXRlIHRyYW5zICQgQy5wYWNrICJcIlxcXCJhXCIiCisgICAgICAgIHZhbCA8LSByZWFkVmFsIHByb3RvIChUX1NUUklORykKKyAgICAgICAgdmFsIGBzaG91bGRCZWAgKFRTdHJpbmcgJCBDLnBhY2sgIlwiYSIpCisKKyAgICAgIHByb3AgInJvdW5kIHRyaXAiICQgXHZhbCAtPiBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAoVFN0cmluZyAkIEMucGFjayB2YWwpCisgICAgICAgIHZhbDIgPC0gcmVhZFZhbCBwcm90byAoVF9TVFJJTkcpCisgICAgICAgIHZhbDIgYHNob3VsZEJlYCAoVFN0cmluZyAkIEMucGFjayB2YWwpCisKKyAgICBkZXNjcmliZSAiYmluYXJ5IiAkIGRvCisgICAgICBpdCAid3JpdGVzIHdpdGggcGFkZGluZyIgJCBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAoVEJpbmFyeSAkIExCUy5wYWNrIFsxXSkKKyAgICAgICAgYmluIDwtIHRSZWFkIHRyYW5zIDEwMAorICAgICAgICAoQy51bnBhY2sgYmluKSBgc2hvdWxkQmVgICJcIkFRPT1cIiIKKworICAgICAgaXQgInJlYWRzIHdpdGggcGFkZGluZyIgJCBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB0V3JpdGUgdHJhbnMgJCBDLnBhY2sgIlwiQVE9PVwiIgorICAgICAgICB2YWwgPC0gcmVhZFZhbCBwcm90byAoVF9CSU5BUlkpCisgICAgICAgIHZhbCBgc2hvdWxkQmVgIChUQmluYXJ5ICQgTEJTLnBhY2sgWzFdKQorCisgICAgICBpdCAicmVhZHMgd2l0aG91dCBwYWRkaW5nIiAkIGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHRXcml0ZSB0cmFucyAkIEMucGFjayAiXCJBUVwiIgorICAgICAgICB2YWwgPC0gcmVhZFZhbCBwcm90byAoVF9CSU5BUlkpCisgICAgICAgIHZhbCBgc2hvdWxkQmVgIChUQmluYXJ5ICQgTEJTLnBhY2sgWzFdKQorCisgICAgICBwcm9wICJyb3VuZCB0cmlwIiAkIFx2YWwgLT4gZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gKFRCaW5hcnkgJCBMQlMucGFjayB2YWwpCisgICAgICAgIHZhbDIgPC0gcmVhZFZhbCBwcm90byAoVF9CSU5BUlkpCisgICAgICAgIHZhbDIgYHNob3VsZEJlYCAoVEJpbmFyeSAkIExCUy5wYWNrIHZhbCkKKworICAgIGRlc2NyaWJlICJsaXN0IiAkIGRvCisgICAgICBpdCAid3JpdGVzIGVtcHR5IGxpc3QiICQgZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gKFRMaXN0IFRfQllURSBbXSkKKyAgICAgICAgYmluIDwtIHRSZWFkIHRyYW5zIDEwMAorICAgICAgICAoQy51bnBhY2sgYmluKSBgc2hvdWxkQmVgICJbXCJpOFwiLDBdIgorCisgICAgICBpdCAicmVhZHMgZW1wdHkiICQgZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgdFdyaXRlIHRyYW5zIChDLnBhY2sgIltcImk4XCIsMF0iKQorICAgICAgICB2YWwgPC0gcmVhZFZhbCBwcm90byAoVF9MSVNUIFRfQllURSkKKyAgICAgICAgdmFsIGBzaG91bGRCZWAgKFRMaXN0IFRfQllURSBbXSkKKworICAgICAgaXQgIndyaXRlcyBzaW5nbGUgZWxlbWVudCIgJCBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAoVExpc3QgVF9CWVRFIFtUQnl0ZSAwXSkKKyAgICAgICAgYmluIDwtIHRSZWFkIHRyYW5zIDEwMAorICAgICAgICAoQy51bnBhY2sgYmluKSBgc2hvdWxkQmVgICJbXCJpOFwiLDEsMF0iCisKKyAgICAgIGl0ICJyZWFkcyBzaW5nbGUgZWxlbWVudCIgJCBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB0V3JpdGUgdHJhbnMgKEMucGFjayAiW1wiaThcIiwxLDBdIikKKyAgICAgICAgdmFsIDwtIHJlYWRWYWwgcHJvdG8gKFRfTElTVCBUX0JZVEUpCisgICAgICAgIHZhbCBgc2hvdWxkQmVgIChUTGlzdCBUX0JZVEUgW1RCeXRlIDBdKQorCisgICAgICBpdCAicmVhZHMgZWxlbWVudHMiICQgZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgdFdyaXRlIHRyYW5zIChDLnBhY2sgIltcImk4XCIsMiw0MiwgNDNdIikKKyAgICAgICAgdmFsIDwtIHJlYWRWYWwgcHJvdG8gKFRfTElTVCBUX0JZVEUpCisgICAgICAgIHZhbCBgc2hvdWxkQmVgIChUTGlzdCBUX0JZVEUgW1RCeXRlIDQyLCBUQnl0ZSA0M10pCisKKyAgICAgIHByb3AgInJvdW5kIHRyaXAiICQgXHZhbCAtPiBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAkIChUTGlzdCBUX1NUUklORyAkIG1hcCB0U3RyaW5nIHZhbCkKKyAgICAgICAgdmFsMiA8LSByZWFkVmFsIHByb3RvICQgVF9MSVNUIFRfU1RSSU5HCisgICAgICAgIHZhbDIgYHNob3VsZEJlYCAoVExpc3QgVF9TVFJJTkcgJCBtYXAgdFN0cmluZyB2YWwpCisKKyAgICBkZXNjcmliZSAic2V0IiAkIGRvCisgICAgICBpdCAid3JpdGVzIGVtcHR5IiAkIGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvIChUU2V0IFRfQllURSBbXSkKKyAgICAgICAgYmluIDwtIHRSZWFkIHRyYW5zIDEwMAorICAgICAgICAoQy51bnBhY2sgYmluKSBgc2hvdWxkQmVgICJbXCJpOFwiLDBdIgorCisgICAgICBpdCAicmVhZHMgZW1wdHkiICQgZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgdFdyaXRlIHRyYW5zIChDLnBhY2sgIltcImk4XCIsMF0iKQorICAgICAgICB2YWwgPC0gcmVhZFZhbCBwcm90byAoVF9TRVQgVF9CWVRFKQorICAgICAgICB2YWwgYHNob3VsZEJlYCAoVFNldCBUX0JZVEUgW10pCisKKyAgICAgIGl0ICJyZWFkcyBzaW5nbGUgZWxlbWVudCIgJCBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB0V3JpdGUgdHJhbnMgKEMucGFjayAiW1wiaThcIiwxLDBdIikKKyAgICAgICAgdmFsIDwtIHJlYWRWYWwgcHJvdG8gKFRfU0VUIFRfQllURSkKKyAgICAgICAgdmFsIGBzaG91bGRCZWAgKFRTZXQgVF9CWVRFIFtUQnl0ZSAwXSkKKworICAgICAgaXQgInJlYWRzIGVsZW1lbnRzIiAkIGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHRXcml0ZSB0cmFucyAoQy5wYWNrICJbXCJpOFwiLDIsNDIsIDQzXSIpCisgICAgICAgIHZhbCA8LSByZWFkVmFsIHByb3RvIChUX1NFVCBUX0JZVEUpCisgICAgICAgIHZhbCBgc2hvdWxkQmVgIChUU2V0IFRfQllURSBbVEJ5dGUgNDIsIFRCeXRlIDQzXSkKKworICAgICAgcHJvcCAicm91bmQgdHJpcCIgJCBcdmFsIC0+IGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvICQgKFRTZXQgVF9TVFJJTkcgJCBtYXAgdFN0cmluZyB2YWwpCisgICAgICAgIHZhbDIgPC0gcmVhZFZhbCBwcm90byAkIFRfU0VUIFRfU1RSSU5HCisgICAgICAgIHZhbDIgYHNob3VsZEJlYCAoVFNldCBUX1NUUklORyAkIG1hcCB0U3RyaW5nIHZhbCkKKworICAgIGRlc2NyaWJlICJtYXAiICQgZG8KKyAgICAgIGl0ICJ3cml0ZXMgZW1wdHkiICQgZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gKFRNYXAgVF9CWVRFIFRfQllURSBbXSkKKyAgICAgICAgYmluIDwtIHRSZWFkIHRyYW5zIDEwMAorICAgICAgICAoQy51bnBhY2sgYmluKSBgc2hvdWxkQmVgIltcImk4XCIsXCJpOFwiLDAse31dIgorCisgICAgICBpdCAicmVhZHMgZW1wdHkiICQgZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgdFdyaXRlIHRyYW5zIChDLnBhY2sgIltcImk4XCIsXCJpOFwiLDAse31dIikKKyAgICAgICAgdmFsIDwtIHJlYWRWYWwgcHJvdG8gKFRfTUFQIFRfQllURSBUX0JZVEUpCisgICAgICAgIHZhbCBgc2hvdWxkQmVgIChUTWFwIFRfQllURSBUX0JZVEUgW10pCisKKyAgICAgIGl0ICJyZWFkcyBzdHJpbmctc3RyaW5nIiAkIGRvCisgICAgICAgIGxldCBiaW4gPSAiW1wic3RyXCIsXCJzdHJcIiwyLHtcImFcIjpcIjJcIixcImJcIjpcImJsYWhcIn1dIgorICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB0V3JpdGUgdHJhbnMgKEMucGFjayBiaW4pCisgICAgICAgIHZhbCA8LSByZWFkVmFsIHByb3RvIChUX01BUCBUX1NUUklORyBUX1NUUklORykKKyAgICAgICAgdmFsYHNob3VsZEJlYCAoVE1hcCBUX1NUUklORyBUX1NUUklORyBbKHRTdHJpbmcgImEiLCB0U3RyaW5nICIyIiksICh0U3RyaW5nICJiIiwgdFN0cmluZyAiYmxhaCIpXSkKKworICAgICAgcHJvcCAicm91bmQgdHJpcCIgJCBcdmFsIC0+IGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvICQgKFRNYXAgVF9TVFJJTkcgVF9TVFJJTkcgJCBtYXAgdG9LViB2YWwpCisgICAgICAgIHZhbDIgPC0gcmVhZFZhbCBwcm90byAkIFRfTUFQIFRfU1RSSU5HIFRfU1RSSU5HCisgICAgICAgIHZhbDIgYHNob3VsZEJlYCAoVE1hcCBUX1NUUklORyBUX1NUUklORyAkIG1hcCB0b0tWIHZhbCkKKyAgICAgICAgd2hlcmUKKyAgICAgICAgICB0b0tWIHYgPSAodFN0cmluZyB2LCB0U3RyaW5nIHYpCisKZGlmZiAtLWdpdCBhL2xpYi9ocy90ZXN0L1NwZWMuaHMgYi9saWIvaHMvdGVzdC9TcGVjLmhzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYzlhOTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaHMvdGVzdC9TcGVjLmhzCkBAIC0wLDAgKzEsMzggQEAKKy0tCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCistLSBPdXIgQ0kgZG9lcyBub3Qgd29yayB3ZWxsIHdpdGggYXV0byBkaXNjb3Zlci4KKy0tIE5lZWQgdG8gYWRkIGJ1aWxkLXRpbWUgUEFUSCB2YXJpYWJsZSB0byBoc3BlYy1kaXNjb3ZlciBkaXIgZnJvbSBDTWFrZQorLS0gb3IgaW5zdGFsbCBoc3BlYyBzeXN0ZW0td2lkZSBmb3IgdGhlIGZvbGxvd2luZyB0byB3b3JrLgorLS0gey0jIE9QVElPTlNfR0hDIC1GIC1wZ21GIGhzcGVjLWRpc2NvdmVyICMtfQorCitpbXBvcnQgVGVzdC5Ic3BlYworCitpbXBvcnQgcXVhbGlmaWVkIEJpbmFyeVNwZWMKK2ltcG9ydCBxdWFsaWZpZWQgQ29tcGFjdFNwZWMKK2ltcG9ydCBxdWFsaWZpZWQgSlNPTlNwZWMKKworbWFpbiA6OiBJTyAoKQorbWFpbiA9IGhzcGVjIHNwZWMKKworc3BlYyA6OiBTcGVjCitzcGVjID0gZG8KKyAgZGVzY3JpYmUgIkJpbmFyeSIgQmluYXJ5U3BlYy5zcGVjCisgIGRlc2NyaWJlICJDb21wYWN0IiBDb21wYWN0U3BlYy5zcGVjCisgIGRlc2NyaWJlICJKU09OIiBKU09OU3BlYy5zcGVjCmRpZmYgLS1naXQgYS9saWIvaHMvdGhyaWZ0LmNhYmFsIGIvbGliL2hzL3RocmlmdC5jYWJhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTE1NTU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hzL3RocmlmdC5jYWJhbApAQCAtMCwwICsxLDg0IEBACistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworTmFtZTogICAgICAgICAgIHRocmlmdAorVmVyc2lvbjogICAgICAgIDEuMC4wCitDYWJhbC1WZXJzaW9uOiAgMS4yNAorTGljZW5zZTogICAgICAgIE90aGVyTGljZW5zZQorQ2F0ZWdvcnk6ICAgICAgIEZvcmVpZ24KK0J1aWxkLVR5cGU6ICAgICBTaW1wbGUKK1N5bm9wc2lzOiAgICAgICBIYXNrZWxsIGJpbmRpbmdzIGZvciB0aGUgQXBhY2hlIFRocmlmdCBSUEMgc3lzdGVtCitIb21lcGFnZTogICAgICAgaHR0cDovL3RocmlmdC5hcGFjaGUub3JnCitCdWctUmVwb3J0czogICAgaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQKK01haW50YWluZXI6ICAgICBkZXZAdGhyaWZ0LmFwYWNoZS5vcmcKK0xpY2Vuc2UtRmlsZTogICBMSUNFTlNFCisKK0Rlc2NyaXB0aW9uOgorICBIYXNrZWxsIGJpbmRpbmdzIGZvciB0aGUgQXBhY2hlIFRocmlmdCBSUEMgc3lzdGVtLiBSZXF1aXJlcyB0aGUgdXNlIG9mIHRoZSB0aHJpZnQgY29kZSBnZW5lcmF0b3IuCisKK2ZsYWcgbmV0d29yay11cmkKKyAgIGRlc2NyaXB0aW9uOiBHZXQgTmV0d29yay5VUkkgZnJvbSB0aGUgbmV0d29yay11cmkgcGFja2FnZQorICAgZGVmYXVsdDogVHJ1ZQorCitMaWJyYXJ5CisgIEhzLVNvdXJjZS1EaXJzOgorICAgIHNyYworICBCdWlsZC1EZXBlbmRzOgorICAgIGJhc2UgPj0gNCwgYmFzZSA8IDUsIGNvbnRhaW5lcnMsIGdoYy1wcmltLCBhdHRvcGFyc2VjLCBiaW5hcnksIGJ5dGVzdHJpbmcgPj0gMC4xMCwgYmFzZTY0LWJ5dGVzdHJpbmcsIGhhc2hhYmxlLCBIVFRQLCB0ZXh0LCBoc3BlYy1jb3JlID4gMi40LjAsIHVub3JkZXJlZC1jb250YWluZXJzID49IDAuMi42LCB2ZWN0b3IgPj0gMC4xMC4xMi4yLCBRdWlja0NoZWNrID49IDIuOC4yLCBzcGxpdAorICBpZiBmbGFnKG5ldHdvcmstdXJpKQorICAgICBidWlsZC1kZXBlbmRzOiBuZXR3b3JrLXVyaSA+PSAyLjYsIG5ldHdvcmsgPj0gMi42CisgIGVsc2UKKyAgICAgYnVpbGQtZGVwZW5kczogbmV0d29yayA8IDIuNgorICBFeHBvc2VkLU1vZHVsZXM6CisgICAgVGhyaWZ0LAorICAgIFRocmlmdC5BcmJpdHJhcmllcworICAgIFRocmlmdC5Qcm90b2NvbCwKKyAgICBUaHJpZnQuUHJvdG9jb2wuSGVhZGVyLAorICAgIFRocmlmdC5Qcm90b2NvbC5CaW5hcnksCisgICAgVGhyaWZ0LlByb3RvY29sLkNvbXBhY3QsCisgICAgVGhyaWZ0LlByb3RvY29sLkpTT04sCisgICAgVGhyaWZ0LlNlcnZlciwKKyAgICBUaHJpZnQuVHJhbnNwb3J0LAorICAgIFRocmlmdC5UcmFuc3BvcnQuRW1wdHksCisgICAgVGhyaWZ0LlRyYW5zcG9ydC5GcmFtZWQsCisgICAgVGhyaWZ0LlRyYW5zcG9ydC5IYW5kbGUsCisgICAgVGhyaWZ0LlRyYW5zcG9ydC5IZWFkZXIsCisgICAgVGhyaWZ0LlRyYW5zcG9ydC5IdHRwQ2xpZW50LAorICAgIFRocmlmdC5UcmFuc3BvcnQuSU9CdWZmZXIsCisgICAgVGhyaWZ0LlRyYW5zcG9ydC5NZW1vcnksCisgICAgVGhyaWZ0LlR5cGVzCisgIERlZmF1bHQtTGFuZ3VhZ2U6IEhhc2tlbGwyMDEwCisgIERlZmF1bHQtRXh0ZW5zaW9uczoKKyAgICBEZXJpdmVEYXRhVHlwZWFibGUsCisgICAgRXhpc3RlbnRpYWxRdWFudGlmaWNhdGlvbiwKKyAgICBGbGV4aWJsZUluc3RhbmNlcywKKyAgICBLaW5kU2lnbmF0dXJlcywKKyAgICBNYWdpY0hhc2gsCisgICAgUmFua05UeXBlcywKKyAgICBSZWNvcmRXaWxkQ2FyZHMsCisgICAgU2NvcGVkVHlwZVZhcmlhYmxlcywKKyAgICBUeXBlU3lub255bUluc3RhbmNlcworCitUZXN0LVN1aXRlIHNwZWMKKyAgVHlwZTogZXhpdGNvZGUtc3RkaW8tMS4wCisgIEhzLVNvdXJjZS1EaXJzOiB0ZXN0CisgIEdoYy1PcHRpb25zOiAtV2FsbAorICBtYWluLWlzOiBTcGVjLmhzCisgIEJ1aWxkLURlcGVuZHM6IGJhc2UsIHRocmlmdCwgaHNwZWMsIFF1aWNrQ2hlY2sgPj0gMi44LjIsIGJ5dGVzdHJpbmcgPj0gMC4xMCwgdW5vcmRlcmVkLWNvbnRhaW5lcnMgPj0gMC4yLjYKKyAgRGVmYXVsdC1MYW5ndWFnZTogSGFza2VsbDIwMTAKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL0NNYWtlTGlzdHMudHh0IGIvbGliL2phdmEvQ01ha2VMaXN0cy50eHQKaW5kZXggYmExMWYzNC4uNDYwNjRlNiAxMDA2NDQKLS0tIGEvbGliL2phdmEvQ01ha2VMaXN0cy50eHQKKysrIGIvbGliL2phdmEvQ01ha2VMaXN0cy50eHQKQEAgLTE3LDMyICsxNyw3MSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotaWYoSVNfQUJTT0xVVEUgIiR7TElCX0lOU1RBTExfRElSfSIpCi0gICAgc2V0KEpBVkFfSU5TVEFMTF9ESVIgIiR7TElCX0lOU1RBTExfRElSfS9qYXZhIikKLWVsc2UoKQotICAgIHNldChKQVZBX0lOU1RBTExfRElSICIke0NNQUtFX0lOU1RBTExfUFJFRklYfS8ke0xJQl9JTlNUQUxMX0RJUn0vamF2YSIpCi1lbmRpZigpCitpZihBTkRST0lEKQorICAgIHNldChUSFJJRlRfQUFSIG91dHB1dHMvYWFyL3RocmlmdC1kZWJ1Zy5hYXIgb3V0cHV0cy9hYXIvdGhyaWZ0LXJlbGVhc2UuYWFyKQorICAgIGFkZF9jdXN0b21fY29tbWFuZCgKKyAgICAgICAgT1VUUFVUICR7VEhSSUZUX0FBUn0KKyAgICAgICAgQ09NTUFORCAke0dSQURMRV9FWEVDVVRBQkxFfQorICAgICAgICAgICAgLXAgIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9hbmRyb2lkIgorICAgICAgICAgICAgIi1QYnVpbGREaXI9JHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2FuZHJvaWQvYnVpbGQiIGFzc2VtYmxlCisgICAgKQorICAgIGFkZF9jdXN0b21fdGFyZ2V0KHRocmlmdF9hYXIgQUxMIERFUEVORFMgJHtUSFJJRlRfQUFSfSkKIAotaWYoSVNfQUJTT0xVVEUgIiR7RE9DX0lOU1RBTExfRElSfSIpCi0gICAgc2V0KEpBVkFfRE9DX0lOU1RBTExfRElSICIke0RPQ19JTlNUQUxMX0RJUn0vamF2YSIpCi1lbHNlKCkKLSAgICBzZXQoSkFWQV9ET0NfSU5TVEFMTF9ESVIgIiR7Q01BS0VfSU5TVEFMTF9QUkVGSVh9LyR7RE9DX0lOU1RBTExfRElSfS9qYXZhIikKLWVuZGlmKCkKK2Vsc2UoQU5EUk9JRCkKIAotYWRkX2N1c3RvbV90YXJnZXQoYW50X2J1aWxkIEFMTAotICAgIENPTU1BTkQgJHtBbnRfRVhFQ1VUQUJMRX0gJHtBTlRfRkxBR1N9IC1EYnVpbGQuZGlyPSR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfSAtRHdvcmtpbmcuZGlyPSR7d29ya19kaXJ9IC1mIGJ1aWxkLnhtbAotICAgIFdPUktJTkdfRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfQotICAgIENPTU1FTlQgIkJ1aWxkaW5nIEphdmEgbGlicmFyeSB1c2luZyBBbnQiCi0pCisgICAgaWYoSVNfQUJTT0xVVEUgIiR7TElCX0lOU1RBTExfRElSfSIpCisgICAgICAgIHNldChKQVZBX0lOU1RBTExfRElSICIke0xJQl9JTlNUQUxMX0RJUn0vamF2YSIpCisgICAgZWxzZSgpCisgICAgICAgIHNldChKQVZBX0lOU1RBTExfRElSICIke0NNQUtFX0lOU1RBTExfUFJFRklYfS8ke0xJQl9JTlNUQUxMX0RJUn0vamF2YSIpCisgICAgZW5kaWYoKQogCi0jIEhvb2sgdGhlIGFudCBpbnN0YWxsIHRhc2sgaW50byBDTWFrZSBpbnN0YWxsCi1pbnN0YWxsKENPREUgImV4ZWN1dGVfcHJvY2VzcygKLSAgICBDT01NQU5EICR7QW50X0VYRUNVVEFCTEV9ICR7QU5UX0ZMQUdTfSBpbnN0YWxsCi0gICAgLURidWlsZC5kaXI9JHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9IC1Ed29ya2luZy5kaXI9JHt3b3JrX2Rpcn0KLSAgICAtRGluc3RhbGwucGF0aD0ke0pBVkFfSU5TVEFMTF9ESVJ9IC1EaW5zdGFsbC5qYXZhZG9jLnBhdGg9JHtKQVZBX0RPQ19JTlNUQUxMX0RJUn0gLWYgYnVpbGQueG1sCi0gICAgV09SS0lOR19ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9Ci0pIikKKyAgICBpZihJU19BQlNPTFVURSAiJHtET0NfSU5TVEFMTF9ESVJ9IikKKyAgICAgICAgc2V0KEpBVkFfRE9DX0lOU1RBTExfRElSICIke0RPQ19JTlNUQUxMX0RJUn0vamF2YSIpCisgICAgZWxzZSgpCisgICAgICAgIHNldChKQVZBX0RPQ19JTlNUQUxMX0RJUiAiJHtDTUFLRV9JTlNUQUxMX1BSRUZJWH0vJHtET0NfSU5TVEFMTF9ESVJ9L2phdmEiKQorICAgIGVuZGlmKCkKIAotaWYoQlVJTERfVEVTVElORykKLSAgICAjYWRkX3N1YmRpcmVjdG9yeSh0ZXN0KQotZW5kaWYoKQorICAgIGFkZF9jdXN0b21fdGFyZ2V0KFRocmlmdEphdmEgQUxMCisgICAgICAgIENPTU1FTlQgIkJ1aWxkaW5nIEphdmEgbGlicmFyeSB1c2luZyBHcmFkbGUgV3JhcHBlciIKKyAgICAgICAgQ09NTUFORCAke0dSQURMRVdfRVhFQ1VUQUJMRX0gJHtHUkFETEVfT1BUU30gYXNzZW1ibGUKKyAgICAgICAgICAgIC0tY29uc29sZT1wbGFpbiAtLW5vLWRhZW1vbgorICAgICAgICAgICAgLVByZWxlYXNlPXRydWUKKyAgICAgICAgICAgIC1QdGhyaWZ0LnZlcnNpb249JHt0aHJpZnRfVkVSU0lPTn0KKyAgICAgICAgICAgICItUGJ1aWxkLmRpcj0ke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vYnVpbGQiCisgICAgICAgIFdPUktJTkdfRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfQorICAgICkKKworICAgICMgRW5hYmxlIHB1Ymxpc2hpbmcgZnJvbSBDTWFrZSBpZiB0aGUgcHVibGlzaGluZyBpbmZvcm1hdGlvbiBpcyBwcm92aWRlZAorICAgIGFkZF9jdXN0b21fdGFyZ2V0KE1hdmVuUHVibGlzaAorICAgICAgICBDT01NRU5UICJQdWJsaXNoaW5nIEphdmEgTGlicmFyeSB0byBBcGFjaGUgTWF2ZW4gc3RhZ2luZyIKKyAgICAgICAgQ09NTUFORCAke0dSQURMRVdfRVhFQ1VUQUJMRX0gJHtHUkFETEVfT1BUU30gY2xlYW4gdXBsb2FkQXJjaGl2ZXMKKyAgICAgICAgICAgIC0tY29uc29sZT1wbGFpbiAtLW5vLWRhZW1vbgorICAgICAgICAgICAgLVByZWxlYXNlPXRydWUKKyAgICAgICAgICAgIC1QdGhyaWZ0LnZlcnNpb249JHt0aHJpZnRfVkVSU0lPTn0KKyAgICAgICAgICAgICItUGJ1aWxkLmRpcj0ke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vYnVpbGQiCisgICAgICAgIFdPUktJTkdfRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfQorICAgICkKKworICAgICMgSG9vayB0aGUgQ01ha2UgaW5zdGFsbCBwcm9jZXNzIHRvIHRoZSByZXN1bHRzIGZyb20gbWFrZSBBTEwuCisgICAgIyBUaGlzIHdvcmtzIGJlc3Qgd2hlbiAnbWFrZSBhbGwgJiYgc3VkbyBtYWtlIGluc3RhbGwvZmFzdCcgaXMgdXNlZC4KKyAgICAjIFVzaW5nIHNsYXNoIHRvIGVuZCB0aGUgc291cmNlIGxvY2F0aW9uIHRvIGF2b2lkIGNvcHlpbmcgdGhlIGRpcmVjdG9yeSBwYXRoLgorICAgIGluc3RhbGwoRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9idWlsZC9saWJzLworICAgICAgICAgICAgREVTVElOQVRJT04gJHtKQVZBX0lOU1RBTExfRElSfQorICAgICAgICAgICAgRklMRVNfTUFUQ0hJTkcgUEFUVEVSTiAibGlidGhyaWZ0LSR7dGhyaWZ0X1ZFUlNJT059LmphciIpCisgICAgaW5zdGFsbChESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2J1aWxkL2RlcHMvCisgICAgICAgICAgICBERVNUSU5BVElPTiAke0pBVkFfSU5TVEFMTF9ESVJ9CisgICAgICAgICAgICBGSUxFU19NQVRDSElORyBQQVRURVJOICIqLmphciIpCisgICAgaW5zdGFsbChESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2J1aWxkL2RvY3MvamF2YWRvYy8KKyAgICAgICAgICAgIERFU1RJTkFUSU9OICR7SkFWQV9ET0NfSU5TVEFMTF9ESVJ9KQorCisgICAgaWYoQlVJTERfVEVTVElORykKKyAgICAgICAgYWRkX3Rlc3QoTkFNRSBKYXZhVGVzdAorICAgICAgICAgICAgICAgIENPTU1BTkQgJHtHUkFETEVXX0VYRUNVVEFCTEV9ICR7R1JBRExFX09QVFN9IHRlc3QKKyAgICAgICAgICAgICAgICAgICAgLS1jb25zb2xlPXBsYWluIC0tbm8tZGFlbW9uCisgICAgICAgICAgICAgICAgICAgIC1QcmVsZWFzZT10cnVlCisgICAgICAgICAgICAgICAgICAgIC1QdGhyaWZ0LnZlcnNpb249JHt0aHJpZnRfVkVSU0lPTn0KKyAgICAgICAgICAgICAgICAgICAgIi1QYnVpbGQuZGlyPSR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9idWlsZCIKKyAgICAgICAgICAgICAgICAgICAgIi1QdGhyaWZ0LmNvbXBpbGVyPSR7VEhSSUZUX0NPTVBJTEVSfSIKKyAgICAgICAgICAgICAgICBXT1JLSU5HX0RJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0pCisgICAgZW5kaWYoKQorZW5kaWYoQU5EUk9JRCkKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL01ha2VmaWxlLmFtIGIvbGliL2phdmEvTWFrZWZpbGUuYW0KaW5kZXggODU5ZjNmMi4uNjU5ODFjYSAxMDA2NDQKLS0tIGEvbGliL2phdmEvTWFrZWZpbGUuYW0KKysrIGIvbGliL2phdmEvTWFrZWZpbGUuYW0KQEAgLTE5LDMxICsxOSw1NCBAQAogCiBleHBvcnQgQ0xBU1NQQVRICiAKLVRIUklGVCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0Ci0KIGFsbC1sb2NhbDoKLQkkKEFOVCkgJChBTlRfRkxBR1MpCisJLi9ncmFkbGV3ICQoR1JBRExFX09QVFMpIGFzc2VtYmxlIFwKKwkJLVByZWxlYXNlPXRydWUgXAorCQktUHRocmlmdC52ZXJzaW9uPSQoUEFDS0FHRV9WRVJTSU9OKSBcCisJCS0tY29uc29sZT1wbGFpbgogCiBpbnN0YWxsLWV4ZWMtaG9vazoKLQkkKEFOVCkgJChBTlRfRkxBR1MpIGluc3RhbGwgLURpbnN0YWxsLnBhdGg9JChERVNURElSKSQoSkFWQV9QUkVGSVgpIFwKLQkJLURpbnN0YWxsLmphdmFkb2MucGF0aD0kKERFU1RESVIpJChkb2NkaXIpL2phdmEKKwkuL2dyYWRsZXcgJChHUkFETEVfT1BUUykgaW5zdGFsbCBcCisJCS1QcmVsZWFzZT10cnVlIFwKKwkJLVBpbnN0YWxsLnBhdGg9JChERVNURElSKSQoSkFWQV9QUkVGSVgpIFwKKwkJLVBpbnN0YWxsLmphdmFkb2MucGF0aD0kKERFU1RESVIpJChkb2NkaXIpL2phdmEgXAorCQktUHRocmlmdC52ZXJzaW9uPSQoUEFDS0FHRV9WRVJTSU9OKSBcCisJCS0tY29uc29sZT1wbGFpbgogCi0jIE1ha2Ugc3VyZSB0aGlzIGRvZXNuJ3QgZmFpbCBpZiBhbnQgaXMgbm90IGNvbmZpZ3VyZWQuCiBjbGVhbi1sb2NhbDoKLQlBTlQ9JChBTlQpIDsgaWYgdGVzdCAteiAiJCRBTlQiIDsgdGhlbiBBTlQ9OiA7IGZpIDsgXAotCSQkQU5UICQoQU5UX0ZMQUdTKSBjbGVhbgorCS4vZ3JhZGxldyAkKEdSQURMRV9PUFRTKSBjbGVhbiAtLWNvbnNvbGU9cGxhaW4KIAogcHJlY3Jvc3M6ICQoVEhSSUZUKQotCSQoQU5UKSAkKEFOVF9GTEFHUykgY29tcGlsZS10ZXN0CisJLi9ncmFkbGV3ICQoR1JBRExFX09QVFMpIHNoYWRvd0phciBcCisJCS1QcmVsZWFzZT10cnVlIFwKKwkJLVB0aHJpZnQudmVyc2lvbj0kKFBBQ0tBR0VfVkVSU0lPTikgXAorCQktUHRocmlmdC5jb21waWxlcj0kKFRIUklGVCkgXAorCQktLWNvbnNvbGU9cGxhaW4KIAotY2hlY2stbG9jYWw6IGFsbAotCSQoQU5UKSAkKEFOVF9GTEFHUykgdGVzdAorY2hlY2stbG9jYWw6ICQoVEhSSUZUKQorCS4vZ3JhZGxldyAkKEdSQURMRV9PUFRTKSB0ZXN0IFwKKwkJLVByZWxlYXNlPXRydWUgXAorCQktUHRocmlmdC52ZXJzaW9uPSQoUEFDS0FHRV9WRVJTSU9OKSBcCisJCS1QdGhyaWZ0LmNvbXBpbGVyPSQoVEhSSUZUKSBcCisJCS0tY29uc29sZT1wbGFpbgorCittYXZlbi1wdWJsaXNoOgorCS4vZ3JhZGxldyAkKEdSQURMRV9PUFRTKSB1cGxvYWRBcmNoaXZlcyBcCisJCS1QcmVsZWFzZT10cnVlIFwKKwkJLVB0aHJpZnQudmVyc2lvbj0kKFBBQ0tBR0VfVkVSU0lPTikgXAorCQktLWNvbnNvbGU9cGxhaW4KIAogRVhUUkFfRElTVCA9IFwKLQlidWlsZC54bWwgXAotCWJ1aWxkLnByb3BlcnRpZXMgXAorCWJ1aWxkLmdyYWRsZSBcCisJZ3JhZGxlLnByb3BlcnRpZXMgXAorCXNldHRpbmdzLmdyYWRsZSBcCisJZ3JhZGxlIFwKKwlncmFkbGV3IFwKKwlncmFkbGV3LmJhdCBcCiAJQ01ha2VMaXN0cy50eHQgXAogCWNvZGluZ19zdGFuZGFyZHMubWQgXAorCWFuZHJvaWQgXAogCXNyYyBcCiAJdGVzdCBcCi0JUkVBRE1FLm1kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorCWNvZGVfcXVhbGl0eV90b29scyBcCisJUkVBRE1FLm1kCmRpZmYgLS1naXQgYS9saWIvamF2YS9SRUFETUUubWQgYi9saWIvamF2YS9SRUFETUUubWQKaW5kZXggNjZiY2ZhNS4uMGI1ZjBkOCAxMDA2NDQKLS0tIGEvbGliL2phdmEvUkVBRE1FLm1kCisrKyBiL2xpYi9qYXZhL1JFQURNRS5tZApAQCAtMjAsMTggKzIwLDU5IEBACiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiB1bmRlciB0aGUgTGljZW5zZS4KIAotVXNpbmcgVGhyaWZ0IHdpdGggSmF2YQotPT09PT09PT09PT09PT09PT09PT09PQorQnVpbGRpbmcgYW5kIGluc3RhbGxpbmcgZnJvbSBzb3VyY2UKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1doZW4gdXNpbmcgYSBDTWFrZSBidWlsZCBmcm9tIHRoZSBzb3VyY2UgZGlzdHJpYnV0aW9uIG9uIExpbnV4IHRoZQorZWFzaWVzdCB3YXkgdG8gYnVpbGQgYW5kIGluc3RhbGwgaXMgdGhpcyBzaW1wbGUgY29tbWFuZCBsaW5lOgorCisgICAgbWFrZSBhbGwgJiYgc3VkbyBtYWtlIGluc3RhbGwvZmFzdAorCitJdCBpcyBpbXBvcnRhbnQgdG8gdXNlIHRoZSBpbnN0YWxsL2Zhc3Qgb3B0aW9uIHRvIGVsaW1pbmF0ZQordGhlIGF1dG9tYXRpYyByZWJ1aWxkIGJ5IGRlcGVuZGVuY3kgdGhhdCBjYXVzZXMgaXNzdWVzIGJlY2F1c2UKK3RoZSBidWlsZCB0b29saW5nIGlzIGRlc2lnbmVkIHRvIHdvcmsgd2l0aCBjYWNoZWQgZmlsZXMgaW4gdGhlCit1c2VyIGhvbWUgZGlyZWN0b3J5IGR1cmluZyB0aGUgYnVpbGQgcHJvY2Vzcy4gSW5zdGVhZCB0aGlzIGJ1aWxkcwordGhlIGNvZGUgaW4gdGhlIGV4cGVjdGVkIGxvY2FsIGJ1aWxkIHRyZWUgYW5kIHRoZW4gdXNlcyBDTWFrZQoraW5zdGFsbCBjb2RlIHRvIGNvcHkgdG8gdGhlIHRhcmdldCBkZXN0aW5hdGlvbi4KKworQnVpbGRpbmcgVGhyaWZ0IHdpdGggR3JhZGxlIHdpdGhvdXQgQ01ha2UvQXV0b2NvbmYKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIFRoZSBUaHJpZnQgSmF2YSBzb3VyY2UgaXMgbm90IGJ1aWxkIHVzaW5nIHRoZSBHTlUgdG9vbHMsIGJ1dCByYXRoZXIgdXNlcwotdGhlIEFwYWNoZSBBbnQgYnVpbGQgc3lzdGVtLCB3aGljaCB0ZW5kcyB0byBiZSBwcmVkb21pbmFudCBhbW9uZ3N0IEphdmEKK3RoZSBHcmFkbGUgYnVpbGQgc3lzdGVtLCB3aGljaCB0ZW5kcyB0byBiZSBwcmVkb21pbmFudCBhbW9uZ3N0IEphdmEKIGRldmVsb3BlcnMuCiAKIFRvIGNvbXBpbGUgdGhlIEphdmEgVGhyaWZ0IGxpYnJhcmllcywgc2ltcGx5IGRvIHRoZSBmb2xsb3dpbmc6CiAKLSAgICBhbnQKKyAgICAuL2dyYWRsZXcKIAotWWVwLCB0aGF0J3MgZWFzeS4gTG9vayBmb3IgbGlidGhyaWZ0LmphciBpbiB0aGUgYmFzZSBkaXJlY3RvcnkuCitZZXAsIHRoYXQncyBlYXN5LiBMb29rIGZvciBsaWJ0aHJpZnQtPHZlcnNpb24+LmphciBpbiB0aGUgYnVpbGQvbGlicyBkaXJlY3RvcnkuCisKK1RoZSBkZWZhdWx0IGJ1aWxkIHdpbGwgcnVuIHRoZSB1bml0IHRlc3RzIHdoaWNoIGV4cGVjdCBhIHVzYWJsZQorVGhyaWZ0IGNvbXBpbGVyIHRvIGV4aXN0IG9uIHRoZSBzeXN0ZW0uIFlvdSBoYXZlIHR3byBjaG9pY2VzIGZvcgordGhhdC4KKworKiBCdWlsZCB0aGUgVGhyaWZ0IGV4ZWN1dGFibGUgZnJvbSBzb3VyY2UgYXQgdGhlIGRlZmF1bHQKKyAgbG9jYXRpb24gaW4gdGhlIHNvdXJjZSB0cmVlLiBUaGUgcHJvamVjdCBpcyBjb25maWd1cmVkCisgIHRvIGxvb2sgZm9yIGl0IHRoZXJlLgorKiBJbnN0YWxsIHRoZSBwdWJsaXNoZWQgYmluYXJ5IGRpc3RyaWJ1dGlvbiB0byBoYXZlIFRocmlmdAorICBleGVjdXRhYmxlIGluIGEga25vd24gbG9jYXRpb24gYW5kIGFkZCB0aGUgcGF0aCB0byB0aGUKKyAgfi8uZ3JhZGxlL2dyYWRsZS5wcm9wZXJ0aWVzIGZpbGUgdXNpbmcgdGhlIHByb3BlcnR5IG5hbWUKKyAgInRocmlmdC5jb21waWxlciIuIEZvciBleGFtcGxlIHRoaXMgd291bGQgc2V0IHRoZSBwYXRoIGluCisgIGEgV2luZG93cyBib3ggaWYgVGhyaWZ0IHdhcyBpbnN0YWxsZWQgdW5kZXIgQzpcVGhyaWZ0CisKKyAgICB0aHJpZnQuY29tcGlsZXI9QzovVGhyaWZ0L3RocmlmdC5leGUKKworVG8ganVzdCBidWlsZCB0aGUgbGlicmFyeSB3aXRob3V0IHJ1bm5pbmcgdW5pdCB0ZXN0cyB5b3Ugc2ltcGx5IGRvIHRoaXMuCisKKyAgICAuL2dyYWRsZXcgYXNzZW1ibGUKKworVG8gaW5zdGFsbCB0aGUgbGlicmFyeSBpbiB0aGUgbG9jYWwgTWF2ZW4gcmVwb3NpdG9yeSBsb2NhdGlvbgord2hlcmUgb3RoZXIgTWF2ZW4gb3IgR3JhZGxlIGJ1aWxkcyBjYW4gcmVmZXJlbmNlIGl0IHNpbXBseSBkbyB0aGlzLgorCisgICAgLi9ncmFkbGV3IGluc3RhbGwKKworVGhlIGxpYnJhcnkgd2lsbCBiZSBwbGFjZWQgaW4geW91ciBob21lIGRpcmVjdG9yeSB1bmRlciAubTIvcmVwb3NpdG9yeQogCiBUbyBpbmNsdWRlIFRocmlmdCBpbiB5b3VyIGFwcGxpY2F0aW9ucyBzaW1wbHkgYWRkIGxpYnRocmlmdC5qYXIgdG8geW91cgogY2xhc3NwYXRoLCBvciBpbnN0YWxsIGlmIGluIHlvdXIgZGVmYXVsdCBzeXN0ZW0gY2xhc3NwYXRoIG9mIGNob2ljZS4KQEAgLTM5LDE1ICs4MCw5NyBAQAogCiBCdWlsZCBUaHJpZnQgYmVoaW5kIGEgcHJveHk6CiAKLSAgICBhbnQgLURwcm94eS5lbmFibGVkPTEgLURwcm94eS5ob3N0PW15cHJveHlob3N0IC1EcHJveHkudXNlcj10aHJpZnR1c2VyIC1EcHJveHkucGFzcz10b3BzZWNyZXQKKyAgICAuL2dyYWRsZXcgLURodHRwLnByb3h5SG9zdD1teXByb3h5aG9zdCAtRGh0dHAucHJveHlQb3J0PTgwODAgLURodHRwLnByb3h5VXNlcj10aHJpZnR1c2VyIC1EaHR0cC5wcm94eVBhc3N3b3JkPXRvcHNlY3JldAogCiBvciB2aWEKIAotICAgIC4vY29uZmlndXJlIC0td2l0aC1qYXZhIEFOVF9GTEFHUz0nLURwcm94eS5lbmFibGVkPTEgLURwcm94eS5ob3N0PW15cHJveHlob3N0IC1EcHJveHkudXNlcj10aHJpZnR1c2VyIC1EcHJveHkucGFzcz10b3BzZWNyZXQnCisgICAgLi9jb25maWd1cmUgLS13aXRoLWphdmEgR1JBRExFX09QVFM9Jy1EaHR0cC5wcm94eUhvc3Q9bXlwcm94eWhvc3QgLURodHRwLnByb3h5UG9ydD04MDgwIC1EaHR0cC5wcm94eVVzZXI9dGhyaWZ0dXNlciAtRGh0dHAucHJveHlQYXNzd29yZD10b3BzZWNyZXQnCisKKworVW5pdCBUZXN0IEhUTUwgUmVwb3J0cworPT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgYnVpbGQgd2lsbCBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlIGFuIEhUTUwgVW5pdCBUZXN0IHJlcG9ydC4gVGhpcyBjYW4gYmUgZm91bmQKK3VuZGVyIGJ1aWxkL3JlcG9ydHMvdGVzdHMvdGVzdC9pbmRleC5odG1sLiBJdCBjYW4gYmUgdmlld2VkIHdpdGggYSBicm93c2VyCitkaXJlY3RseSBmcm9tIHRoYXQgbG9jYXRpb24uCisKKworQ2xvdmVyIENvZGUgQ292ZXJhZ2UgZm9yIFRocmlmdAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgYnVpbGQgd2lsbCBvcHRpb25hbGx5IGdlbmVyYXRlIENsb3ZlciBDb2RlIGNvdmVyYWdlIGlmIHRoZSBHcmFkbGUgcHJvcGVydHkKK2BjbG92ZXJFbmFibGVkPXRydWVgIGlzIHNldCBpbiB+Ly5ncmFkbGUvZ3JhZGxlLnByb3BlcnRpZXMgb3Igb24gdGhlIGNvbW1hbmQgbGluZQordmlhIGAtUGNsb3ZlckVuYWJsZWQ9dHJ1ZWAuIFRoZSBnZW5lcmF0ZWQgcmVwb3J0IGNhbiBiZSBmb3VuZCB1bmRlciB0aGUgbG9jYXRpb24KK2J1aWxkL3JlcG9ydHMvY2xvdmVyL2h0bWwvaW5kZXguaHRtbC4gSXQgY2FuIGJlIHZpZXdlZCB3aXRoIGEgYnJvd3NlcgorZGlyZWN0bHkgZnJvbSB0aGF0IGxvY2F0aW9uLiBBZGRpdGlvbmFsbHksIGEgUERGIHJlcG9ydCBpcyBnZW5lcmF0ZWQgYW5kIGlzIGZvdW5kCit1bmRlciB0aGUgbG9jYXRpb24gYnVpbGQvcmVwb3J0cy9jbG92ZXIvY2xvdmVyLnBkZi4KKworVGhlIGZvbGxvd2luZyBjb21tYW5kIHdpbGwgYnVpbGQsIHVuaXQgdGVzdCwgYW5kIGdlbmVyYXRlIENsb3ZlciByZXBvcnRzOgorCisgICAgLi9ncmFkbGV3IC1QY2xvdmVyRW5hYmxlZD10cnVlCisKKworUHVibGlzaGluZyBNYXZlbiBBcnRpZmFjdHMgdG8gTWF2ZW4gQ2VudHJhbAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgQXV0b21ha2UgYnVpbGQgZ2VuZXJhdGVzIGEgTWFrZWZpbGUgdGhhdCBwcm92aWRlcyB0aGUgY29ycmVjdCBwYXJhbWV0ZXJzCit3aGVuIHlvdSBydW4gdGhlIGJ1aWxkIHByb3ZpZGVkIHRoZSBjb25maWd1cmUuYWMgaGFzIGJlZW4gc2V0IHdpdGggdGhlIGNvcnJlY3QKK3ZlcnNpb24gbnVtYmVyLiBUaGUgR3JhZGxlIGJ1aWxkIHdpbGwgcmVjZWl2ZSB0aGUgY29ycmVjdCB2YWx1ZSBmb3IgdGhlIGJ1aWxkLgorVGhlIHNhbWUgYXBwbGllcyB0byB0aGUgQ01ha2UgYnVpbGQsIHRoZSB2YWx1ZSBmcm9tIHRoZSBjb25maWd1cmUuYWMgZmlsZSB3aWxsCitiZSB1c2VkIGlmIHlvdSBleGVjdXRlIHRoZXNlIGNvbW1hbmRzOgorCisgICAgbWFrZSBtYXZlbi1wdWJsaXNoICAgLS0gVGhpcyBpcyBmb3IgYW4gQXV0b21ha2UgTGludXggYnVpbGQKKyAgICBtYWtlIE1hdmVuUHVibGlzaCAgICAtLSBUaGlzIGlzIGZvciBhIENNYWtlIGdlbmVyYXRlZCBidWlsZAorCitUaGUgdXBsb2FkQXJjaGl2ZXMgdGFzayBpbiBHcmFkbGUgaXMgcHJlY29uZmlndXJlZCB3aXRoIGFsbCBuZWNlc3NhcnkgZGV0YWlscwordG8gc2lnbiBhbmQgcHVibGlzaCB0aGUgYXJ0aWZhY3RzIGZyb20gdGhlIGJ1aWxkIHRvIHRoZSBBcGFjaGUgTWF2ZW4gc3RhZ2luZworcmVwb3NpdG9yeS4gVGhlIHRhc2sgcmVxdWlyZXMgdGhlIGZvbGxvd2luZyBleHRlcm5hbGx5IHByb3ZpZGVkIHByb3BlcnRpZXMgdG8KK2F1dGhlbnRpY2F0ZSB0byB0aGUgcmVwb3NpdG9yeSBhbmQgc2lnbiB0aGUgYXJ0aWZhY3RzLiBUaGUgcHJlZmVycmVkIGFwcHJvYWNoCitpcyB0byBjcmVhdGUgb3IgZWRpdCB0aGUgfi8uZ3JhZGxlL2dyYWRsZS5wcm9wZXJ0aWVzIGZpbGUgYW5kIGFkZCB0aGUgZm9sbG93aW5nCitwcm9wZXJ0aWVzIHRvIGl0LgorCisgICAgIyBTaWduaW5nIGtleSBpbmZvcm1hdGlvbiBmb3IgYXJ0aWZhY3RzIFBHUCBzaWduYXR1cmUgKHZhbHVlcyBhcmUgZXhhbXBsZXMpCisgICAgc2lnbmluZy5rZXlJZD0yNDg3NUQ3MworICAgIHNpZ25pbmcucGFzc3dvcmQ9c2VjcmV0CisgICAgc2lnbmluZy5zZWNyZXRLZXlSaW5nRmlsZT0vVXNlcnMvbWUvLmdudXBnL3NlY3JpbmcuZ3BnCisKKyAgICAjIEFwYWNoZSBNYXZlbiBzdGFnaW5nIHJlcG9zaXRvcnkgdXNlciBjcmVkZW50aWFscworICAgIG1hdmVuVXNlcj1tZU15c2VsZkFuZEkKKyAgICBtYXZlblBhc3N3b3JkPU15U3VwZXJBd2Vzb21lU2VjcmV0UGFzc3dvcmQKKworSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBtYW51YWxseSBwdWJsaXNoIHVzaW5nIHRoZSBHcmFkbGUgYnVpbGQgZGlyZWN0bHkuCitXaXRoIHRoZSBrZXkgaW5mb3JtYXRpb24gYW5kIGNyZWRlbnRpYWxzIGluIHBsYWNlIHRoZSBmb2xsb3dpbmcgd2lsbCBnZW5lcmF0ZQoraWYgbmVlZGVkIHRoZSBidWlsZCBhcnRpZmFjdHMgYW5kIHByb2NlZWQgdG8gcHVibGlzaCB0aGUgcmVzdWx0cy4KKworICAgIC4vZ3JhZGxldyAtUHJlbGVhc2U9dHJ1ZSAtUHRocmlmdC52ZXJzaW9uPTAuMTEuMCB1cGxvYWRBcmNoaXZlcworCitJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIG92ZXJyaWRlIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSBmb3IgdGhlIE1hdmVuIFB1YmxpY2F0aW9uCitieSB1c2luZyBhIEdyYWRsZSBwcm9wZXJ0eSwgZm9yIGV4YW1wbGUgeW91IGNhbiBwdWJsaXNoIHNpZ25lZCBKQVIgZmlsZXMgdG8geW91cgorY29tcGFueSBpbnRlcm5hbCBzZXJ2ZXIgaWYgeW91IGFkZCB0aGlzIHRvIHRoZSBjb21tYW5kIGxpbmUgb3IgaW4gdGhlCit+Ly5ncmFkbGUvZ3JhZGxlLnByb3BlcnRpZXMgZmlsZS4gVGhlIFVSTCBiZWxvdyBhc3N1bWVzIGEgTmV4dXMgUmVwb3NpdG9yeS4KKworICAgIG1hdmVuLXJlcG9zaXRvcnktdXJsPWh0dHBzOi8vbXkuY29tcGFueS5jb20vc2VydmljZS9sb2NhbC9zdGFnaW5nL2RlcGxveS9tYXZlbjIKKworT3IgdGhlIHNhbWUgb24gdGhlIGNvbW1hbmQgbGluZToKKworICAgIC4vZ3JhZGxldyAtUG1hdmVuLXJlcG9zaXRvcnktdXJsPWh0dHBzOi8vbXkuY29tcGFueS5jb20vc2VydmljZS9sb2NhbC9zdGFnaW5nL2RlcGxveS9tYXZlbjIgLVByZWxlYXNlPXRydWUgLVB0aHJpZnQudmVyc2lvbj0wLjExLjAgdXBsb2FkQXJjaGl2ZXMKIAogCiBEZXBlbmRlbmNpZXMKID09PT09PT09PT09PQogCi1BcGFjaGUgQW50Ci1odHRwOi8vYW50LmFwYWNoZS5vcmcvCitHcmFkbGUKK2h0dHA6Ly9ncmFkbGUub3JnLworCisjIEJyZWFraW5nIENoYW5nZXMKKworIyMgMC4xMi4wCisKK1RoZSBhY2Nlc3MgbW9kaWZpZXIgb2YgdGhlIEF1dG9FeHBhbmRpbmdCdWZmZXIgY2xhc3MgaGFzIGJlZW4gY2hhbmdlZCBmcm9tCitwdWJsaWMgdG8gZGVmYXVsdCAocGFja2FnZSkgYW5kIHdpbGwgbm8gbG9uZ2VyIGJlIGFjY2Vzc2libGUgYnkgdGhpcmQtcGFydHkKK2xpYnJhcmllcy4KKworVGhlIGFjY2VzcyBtb2RpZmllciBvZiB0aGUgU2hvcnRTdGFjayBjbGFzcyBoYXMgYmVlbiBjaGFuZ2VkIGZyb20KK3B1YmxpYyB0byBkZWZhdWx0IChwYWNrYWdlKSBhbmQgd2lsbCBubyBsb25nZXIgYmUgYWNjZXNzaWJsZSBieSB0aGlyZC1wYXJ0eQorbGlicmFyaWVzLgorCmRpZmYgLS1naXQgYS9saWIvamF2YS9hbmRyb2lkL2J1aWxkLmdyYWRsZSBiL2xpYi9qYXZhL2FuZHJvaWQvYnVpbGQuZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5OTg0MjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9hbmRyb2lkL2J1aWxkLmdyYWRsZQpAQCAtMCwwICsxLDUwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2FwcGx5IHBsdWdpbjogJ2NvbS5hbmRyb2lkLmxpYnJhcnknCisKK2FuZHJvaWQgeworICAgIGNvbXBpbGVTZGtWZXJzaW9uIDIzCisgICAgYnVpbGRUb29sc1ZlcnNpb24gIjIzLjAuMSIKKyAgICB1c2VMaWJyYXJ5ICdvcmcuYXBhY2hlLmh0dHAubGVnYWN5JworICAgIHNvdXJjZVNldHMubWFpbi5qYXZhIHsKKyAgICAgICAgc3JjRGlyICcuLi9zcmMnCisgICAgICAgIGV4Y2x1ZGUgJ29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2FzbENsaWVudFRyYW5zcG9ydC5qYXZhJworICAgICAgICBleGNsdWRlICdvcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNhc2xTZXJ2ZXJUcmFuc3BvcnQuamF2YScKKyAgICAgICAgZXhjbHVkZSAnb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTYXNsVHJhbnNwb3J0LmphdmEnCisgICAgfQorfQorCityZXBvc2l0b3JpZXMgeworICAgIG1hdmVuQ2VudHJhbCgpCit9CitkZXBlbmRlbmNpZXMgeworICAgIGNvbXBpbGUgJ29yZy5zbGY0ajpzbGY0ai1hcGk6MS43LjEzJworICAgIGNvbXBpbGUgJ2phdmF4LnNlcnZsZXQ6c2VydmxldC1hcGk6Mi41JworICAgIGNvbXBpbGUgJ29yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHM6aHR0cGNvcmU6NC40LjQnCit9CisKK2J1aWxkc2NyaXB0IHsKKyAgICByZXBvc2l0b3JpZXMgeworICAgICAgICBtYXZlbkNlbnRyYWwoKQorICAgIH0KKyAgICBkZXBlbmRlbmNpZXMgeworICAgICAgICBjbGFzc3BhdGggJ2NvbS5hbmRyb2lkLnRvb2xzLmJ1aWxkOmdyYWRsZToxLjUuMCcKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9hbmRyb2lkL3NldHRpbmdzLmdyYWRsZSBiL2xpYi9qYXZhL2FuZHJvaWQvc2V0dGluZ3MuZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ZTk3YmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9hbmRyb2lkL3NldHRpbmdzLmdyYWRsZQpAQCAtMCwwICsxIEBACityb290UHJvamVjdC5uYW1lPSd0aHJpZnQnCmRpZmYgLS1naXQgYS9saWIvamF2YS9hbmRyb2lkL3NyYy9tYWluL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9saWIvamF2YS9hbmRyb2lkL3NyYy9tYWluL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNhYmRiNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL2FuZHJvaWQvc3JjL21haW4vQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8bWFuaWZlc3QgcGFja2FnZT0ib3JnLmFwYWNoZS50aHJpZnQiPgorICA8YXBwbGljYXRpb24gLz4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9saWIvamF2YS9idWlsZC5ncmFkbGUgYi9saWIvamF2YS9idWlsZC5ncmFkbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMwMmY3NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL2J1aWxkLmdyYWRsZQpAQCAtMCwwICsxLDY0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIFVzaW5nIHRoZSBsZWdhY3kgcGx1Z2luIGNsYXNzcGF0aCBmb3IgQ2xvdmVyIHNvIGl0IGNhbiBiZSBsb2FkZWQgb3B0aW9uYWxseQorYnVpbGRzY3JpcHQgeworICAgIHJlcG9zaXRvcmllcyB7CisgICAgICAgIGdvb2dsZSgpCisgICAgICAgIGpjZW50ZXIoKQorICAgICAgICBncmFkbGVQbHVnaW5Qb3J0YWwoKQorICAgIH0KKworICAgIGRlcGVuZGVuY2llcyB7CisgICAgICAgIGNsYXNzcGF0aCAnY29tLmJtdXNjaGtvOmdyYWRsZS1jbG92ZXItcGx1Z2luOjIuMi4wJworICAgIH0KK30KKworcGx1Z2lucyB7CisgICAgaWQgJ2phdmEnCisgICAgaWQgJ21hdmVuJworICAgIGlkICdzaWduaW5nJworICAgIGlkICdjb20uZ2l0aHViLmpvaG5yZW5nZWxtYW4uc2hhZG93JyB2ZXJzaW9uICcyLjAuMicKK30KKworZGVzY3JpcHRpb24gPSAnQXBhY2hlIFRocmlmdCBKYXZhIExpYnJhcnknCisKK2RlZmF1bHRUYXNrcyAnYnVpbGQnCisKKy8vIFZlcnNpb24gY29tcG9uZW50cyBmb3IgdGhpcyBwcm9qZWN0Citncm91cCA9IHByb3BlcnR5KCd0aHJpZnQuZ3JvdXBpZCcpCisKKy8vIERyb3AgdGhlIC1kZXYgc3VmZml4LCB3ZSB1c2UgdGhlIFNOQVBTSE9UIHN1ZmZpeCBmb3Igbm9uLXJlbGVhc2UgdmVyc2lvbnMKK2RlZiBwYXJzZWRWZXJzaW9uID0gcHJvcGVydHkoJ3RocmlmdC52ZXJzaW9uJykudG9TdHJpbmcoKS5yZXBsYWNlKCctZGV2JywgJycpCitpZiAoQm9vbGVhbi5wYXJzZUJvb2xlYW4ocHJvamVjdC5yZWxlYXNlKSkgeworICAgIHZlcnNpb24gPSBwYXJzZWRWZXJzaW9uCit9IGVsc2UgeworICAgIHZlcnNpb24gPSBwYXJzZWRWZXJzaW9uICsgJy1TTkFQU0hPVCcKK30KKworLy8gS2VlcGluZyB0aGUgcmVzdCBvZiB0aGUgYnVpbGQgbG9naWMgaW4gZnVuY3Rpb25hbCBuYW1lZCBzY3JpcHRzIGZvciBjbGFyaXR5CithcHBseSBmcm9tOiAnZ3JhZGxlL2Vudmlyb25tZW50LmdyYWRsZScKK2FwcGx5IGZyb206ICdncmFkbGUvc291cmNlQ29uZmlndXJhdGlvbi5ncmFkbGUnCithcHBseSBmcm9tOiAnZ3JhZGxlL2FkZGl0aW9uYWxBcnRpZmFjdHMuZ3JhZGxlJworYXBwbHkgZnJvbTogJ2dyYWRsZS9nZW5lcmF0ZVRlc3RUaHJpZnQuZ3JhZGxlJworYXBwbHkgZnJvbTogJ2dyYWRsZS91bml0VGVzdHMuZ3JhZGxlJworYXBwbHkgZnJvbTogJ2dyYWRsZS9jbG92ZXJDb3ZlcmFnZS5ncmFkbGUnCithcHBseSBmcm9tOiAnZ3JhZGxlL2Z1bmN0aW9uYWxUZXN0cy5ncmFkbGUnCithcHBseSBmcm9tOiAnZ3JhZGxlL3B1Ymxpc2hpbmcuZ3JhZGxlJworYXBwbHkgZnJvbTogJ2dyYWRsZS9jb2RlUXVhbGl0eUNoZWNrcy5ncmFkbGUnCmRpZmYgLS1naXQgYS9saWIvamF2YS9idWlsZC5wcm9wZXJ0aWVzIGIvbGliL2phdmEvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJlMWMxMC4uMDAwMDAwMAotLS0gYS9saWIvamF2YS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotdGhyaWZ0LnZlcnNpb249MC45LjMKLXRocmlmdC5ncm91cGlkPW9yZy5hcGFjaGUudGhyaWZ0Ci1yZWxlYXNlPXRydWUKLQotIyBKYXIgVmVyc2lvbnMgCi1tdm4uYW50LnRhc2sudmVyc2lvbj0yLjEuMwotCi0jIExvY2FsIEluc3RhbGwgcGF0aHMKLWluc3RhbGwucGF0aD0vdXNyL2xvY2FsL2xpYgotaW5zdGFsbC5qYXZhZG9jLnBhdGg9JHtpbnN0YWxsLnBhdGh9Ci0KLSMgTWF2ZW4gZGVwZW5kZW5jeSBkb3dubG9hZCBsb2NhdGlvbnMKLW12bi5yZXBvPWh0dHA6Ly9yZXBvMS5tYXZlbi5vcmcvbWF2ZW4yCi1hcGFjaGUucmVwbz1odHRwczovL3JlcG9zaXRvcnkuYXBhY2hlLm9yZy9jb250ZW50L3JlcG9zaXRvcmllcy9yZWxlYXNlcwotbXZuLmFudC50YXNrLnVybD0ke212bi5yZXBvfS9vcmcvYXBhY2hlL21hdmVuL21hdmVuLWFudC10YXNrcy8ke212bi5hbnQudGFzay52ZXJzaW9ufQotbXZuLmFudC50YXNrLmphcj1tYXZlbi1hbnQtdGFza3MtJHttdm4uYW50LnRhc2sudmVyc2lvbn0uamFyCi0KLSMgQXBhY2hlIE1hdmVuIHB1Ymxpc2ggCi1saWNlbnNlPWh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQKLW1hdmVuLXJlcG9zaXRvcnktdXJsPWh0dHBzOi8vcmVwb3NpdG9yeS5hcGFjaGUub3JnL3NlcnZpY2UvbG9jYWwvc3RhZ2luZy9kZXBsb3kvbWF2ZW4yCi1tYXZlbi1yZXBvc2l0b3J5LWlkPWFwYWNoZS5yZWxlYXNlcy5odHRwcwotCi0jIEphciBWZXJzaW9ucyAKLW12bi5hbnQudGFzay52ZXJzaW9uPTIuMS4zCi0KLSMgRGVwZW5kZW5jeSB2ZXJzaW9ucwotaHR0cGNsaWVudC52ZXJzaW9uPTQuNC4xCi1odHRwY29yZS52ZXJzaW9uPTQuNC4xCi1zbGY0ai52ZXJzaW9uPTEuNy4xMgotc2VydmxldC52ZXJzaW9uPTIuNQotCmRpZmYgLS1naXQgYS9saWIvamF2YS9idWlsZC54bWwgYi9saWIvamF2YS9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY3OTE0MmUuLjAwMDAwMDAKLS0tIGEvbGliL2phdmEvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDE0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci08cHJvamVjdCBuYW1lPSJsaWJ0aHJpZnQiIGRlZmF1bHQ9ImRpc3QiIGJhc2VkaXI9Ii4iCi0gIHhtbG5zOmFydGlmYWN0PSJhbnRsaWI6b3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5hbnQiPgotCi0gIDxkZXNjcmlwdGlvbj5UaHJpZnQgQnVpbGQgRmlsZTwvZGVzY3JpcHRpb24+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0aHJpZnQucm9vdCIgbG9jYXRpb249Ii4uLy4uLyIvPgotICA8cHJvcGVydHkgbmFtZT0idGhyaWZ0LmFydGlmYWN0aWQiIHZhbHVlPSJsaWJ0aHJpZnQiLz4KLQotICA8IS0tIEluY2x1ZGUgdGhlIGJhc2UgcHJvcGVydGllcyBmaWxlIC0tPgotICA8cHJvcGVydHkgZmlsZT0iJHtiYXNlZGlyfS9idWlsZC5wcm9wZXJ0aWVzIiAvPgotCi0gIDxwcm9wZXJ0eSBlbnZpcm9ubWVudD0iZW52Ii8+Ci0KLSAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0idmVyc2lvbiIgdmFsdWU9IiR7dGhyaWZ0LnZlcnNpb259Ij4KLSAgICA8aXNzZXQgcHJvcGVydHk9InJlbGVhc2UiLz4KLSAgPC9jb25kaXRpb24+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ2ZXJzaW9uIiB2YWx1ZT0iJHt0aHJpZnQudmVyc2lvbn0tc25hcHNob3QiLz4KLQotICA8cHJvcGVydHkgbmFtZT0iZmluYWwubmFtZSIgdmFsdWU9IiR7dGhyaWZ0LmFydGlmYWN0aWR9LSR7dmVyc2lvbn0iLz4KLQotICA8cHJvcGVydHkgbmFtZT0ic3JjIiBsb2NhdGlvbj0iJHtiYXNlZGlyfS9zcmMiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmRpciIgbG9jYXRpb249IiR7YmFzZWRpcn0vYnVpbGQiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmxpYi5kaXIiIGxvY2F0aW9uPSIke2J1aWxkLmRpcn0vbGliIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC50b29scy5kaXIiIGxvY2F0aW9uPSIke2J1aWxkLmRpcn0vdG9vbHMiLz4KLSAgPHByb3BlcnR5IG5hbWU9InNyYy50ZXN0IiBsb2NhdGlvbj0idGVzdCIvPgotICA8cHJvcGVydHkgbmFtZT0iamF2YWRvYy5kaXIiIGxvY2F0aW9uPSIke2J1aWxkLmRpcn0vamF2YWRvYyIvPgotICA8cHJvcGVydHkgbmFtZT0iYnVpbGQudGVzdC5kaXIiIGxvY2F0aW9uPSIke2J1aWxkLmRpcn0vdGVzdCIvPgotICA8cHJvcGVydHkgbmFtZT0idGVzdC50aHJpZnQuaG9tZSIgbG9jYXRpb249IiR7dGhyaWZ0LnJvb3R9L3Rlc3QiLz4KLQotICA8cHJvcGVydHkgbmFtZT0iZ2VuIiBsb2NhdGlvbj0iZ2VuLWphdmEiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImdlbmJlYW4iIGxvY2F0aW9uPSJnZW4tamF2YWJlYW4iLz4KLSAgPHByb3BlcnR5IG5hbWU9ImdlbnJldXNlIiBsb2NhdGlvbj0iZ2VuLWphdmFyZXVzZSIvPgotICA8cHJvcGVydHkgbmFtZT0iZ2VuZnVsbGNhbWVsIiBsb2NhdGlvbj0iZ2VuLWZ1bGxjYW1lbCIvPgotCi0gIDxwcm9wZXJ0eSBuYW1lPSJqYXIuZmlsZSIgbG9jYXRpb249IiR7YnVpbGQuZGlyfS8ke2ZpbmFsLm5hbWV9LmphciIvPgotICA8cHJvcGVydHkgbmFtZT0idGVzdC5qYXIuZmlsZSIgbG9jYXRpb249IiR7YnVpbGQuZGlyfS8ke2ZpbmFsLm5hbWV9LXRlc3QuamFyIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJqYXZhZG9jLmphci5maWxlIiBsb2NhdGlvbj0iJHtidWlsZC5kaXJ9LyR7ZmluYWwubmFtZX0tamF2YWRvYy5qYXIiLz4KLSAgPHByb3BlcnR5IG5hbWU9InNvdXJjZS5qYXIuZmlsZSIgbG9jYXRpb249IiR7YnVpbGQuZGlyfS8ke2ZpbmFsLm5hbWV9LXNvdXJjZXMuamFyIi8+Ci0KLSAgPCEtLSBKdW5pdCBwcm9wZXJ0aWVzIC0tPgotICA8cHJvcGVydHkgbmFtZT0idGVzdC5qdW5pdC5vdXRwdXQuZm9ybWF0IiB2YWx1ZT0icGxhaW4iLz4KLSAgPHByb3BlcnR5IG5hbWU9InRlc3QudGltZW91dCIgdmFsdWU9IjIwMDAwMDAiLz4KLSAgPHByb3BlcnR5IG5hbWU9InRlc3Quc3JjLmRpciIgbG9jYXRpb249IiR7YmFzZWRpcn0vdGVzdCIvPgotICA8cHJvcGVydHkgbmFtZT0idGVzdC5sb2cuZGlyIiB2YWx1ZT0iJHtidWlsZC50ZXN0LmRpcn0vbG9nIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0LnBvcnQiIHZhbHVlPSI5MDkwIi8+Ci0KLSAgPCEtLSBtYXZlbiBwcm9wZXJ0aWVzIC0tPgotICA8cHJvcGVydHkgbmFtZT0icG9tLnhtbCIgbG9jYXRpb249IiR7YnVpbGQuZGlyfS8ke2ZpbmFsLm5hbWV9LnBvbSIvPgotCi0gIDxwYXRoIGlkPSJjb21waWxlLmNsYXNzcGF0aCI+Ci0gICAgPGZpbGVzZXQgZGlyPSIke2J1aWxkLmxpYi5kaXJ9Ij4KLSAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouamFyIi8+Ci0gICAgPC9maWxlc2V0PgotICA8L3BhdGg+Ci0KLSAgPHBhdGggaWQ9InRlc3QuY2xhc3NwYXRoIj4KLSAgICA8cGF0aCByZWZpZD0iY29tcGlsZS5jbGFzc3BhdGgiLz4KLSAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtlbnYuQ0xBU1NQQVRIfSIvPgotICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtidWlsZC50ZXN0LmRpcn0iLz4KLSAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7amFyLmZpbGV9Ii8+Ci0gICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3Rlc3QuamFyLmZpbGV9Ii8+Ci0KLSAgPC9wYXRoPgotCi0gIDwhLS0gVGFza3MgLS0+Ci0gIDx0YXJnZXQgbmFtZT0iaW5pdCIgZGVwZW5kcz0ic2V0dXAuaW5pdCxtdm4uaW5pdCIgdW5sZXNzPSJpbml0LmZpbmlzaGVkIj4KLSAgICA8cHJvcGVydHkgbmFtZT0iaW5pdC5maW5pc2hlZCIgdmFsdWU9InRydWUiLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJzZXR1cC5pbml0Ij4KLSAgICA8dHN0YW1wLz4KLSAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmRpcn0iLz4KLSAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmxpYi5kaXJ9Ii8+Ci0gICAgPG1rZGlyIGRpcj0iJHtidWlsZC50b29scy5kaXJ9Ii8+Ci0gICAgPG1rZGlyIGRpcj0iJHtidWlsZC50ZXN0LmRpcn0iLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJjb21waWxlIiBkZXBlbmRzPSJpbml0Ij4KLSAgICA8amF2YWMgc3JjZGlyPSIke3NyY30iIGRlc3RkaXI9IiR7YnVpbGQuZGlyfSIgc291cmNlPSIxLjUiIHRhcmdldD0iMS41IgotICAgIGRlYnVnPSJ0cnVlIiBjbGFzc3BhdGhyZWY9ImNvbXBpbGUuY2xhc3NwYXRoIiBpbmNsdWRlYW50cnVudGltZT0iZmFsc2UiIGVuY29kaW5nPSJVVEYtOCI+Ci0gICAgICA8Y29tcGlsZXJhcmcgdmFsdWU9Ii1YbGludDp1bmNoZWNrZWQiLz4KLSAgICA8L2phdmFjPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9ImphdmFkb2MiIGRlcGVuZHM9ImluaXQiPgotICAgIDxqYXZhZG9jIHNvdXJjZXBhdGg9IiR7c3JjfSIgZGVzdGRpcj0iJHtqYXZhZG9jLmRpcn0iCi0gICAgICB2ZXJzaW9uPSJ0cnVlIiB3aW5kb3d0aXRsZT0iVGhyaWZ0IEphdmEgQVBJIiBkb2N0aXRsZT0iVGhyaWZ0IEphdmEgQVBJIgotICAgICAgY2xhc3NwYXRocmVmPSJ0ZXN0LmNsYXNzcGF0aCI+Ci0gICAgPC9qYXZhZG9jPgotICAgIDxqYXIgamFyZmlsZT0iJHtqYXZhZG9jLmphci5maWxlfSIgYmFzZWRpcj0iJHtqYXZhZG9jLmRpcn0iPgotICAgICAgPG1hbmlmZXN0PgotICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkltcGxlbWVudGF0aW9uLVZlcnNpb24iIHZhbHVlPSIke3ZlcnNpb259Ii8+Ci0gICAgICA8L21hbmlmZXN0PgotICAgIDwvamFyPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9ImRpc3QiIGRlcGVuZHM9ImNvbXBpbGUiPgotICAgIDxta2RpciBkaXI9IiR7YnVpbGQuZGlyfS9NRVRBLUlORiIvPgotICAgIDxjb3B5IGZpbGU9IiR7dGhyaWZ0LnJvb3R9L0xJQ0VOU0UiIHRvZmlsZT0iJHtidWlsZC5kaXJ9L01FVEEtSU5GL0xJQ0VOU0UudHh0Ii8+Ci0gICAgPGNvcHkgZmlsZT0iJHt0aHJpZnQucm9vdH0vTk9USUNFIiB0b2ZpbGU9IiR7YnVpbGQuZGlyfS9NRVRBLUlORi9OT1RJQ0UudHh0Ii8+Ci0gICAgPGphciBqYXJmaWxlPSIke2phci5maWxlfSI+Ci0gICAgICA8bWFuaWZlc3Q+Ci0gICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iSW1wbGVtZW50YXRpb24tVmVyc2lvbiIgdmFsdWU9IiR7dmVyc2lvbn0iLz4KLSAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJCdW5kbGUtTWFuaWZlc3RWZXJzaW9uIiB2YWx1ZT0iMiIvPgotICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkJ1bmRsZS1TeW1ib2xpY05hbWUiIHZhbHVlPSIke3RocmlmdC5ncm91cGlkfSIvPgotICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkJ1bmRsZS1OYW1lIiB2YWx1ZT0iQXBhY2hlIFRocmlmdCIvPgotICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkJ1bmRsZS1WZXJzaW9uIiB2YWx1ZT0iJHt2ZXJzaW9ufSIvPgotICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkJ1bmRsZS1EZXNjcmlwdGlvbiIgdmFsdWU9IkFwYWNoZSBUaHJpZnQgbGlicmFyeSIvPgotICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkJ1bmRsZS1MaWNlbnNlIiB2YWx1ZT0iJHtsaWNlbnNlfSIvPgotICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5IiB2YWx1ZT0ibGF6eSIvPgotICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkV4cG9ydC1QYWNrYWdlIiB2YWx1ZT0iJHt0aHJpZnQuZ3JvdXBpZH0uYXN5bmM7dXNlczo9JnF1b3Q7JHt0aHJpZnQuZ3JvdXBpZH0ucHJvdG9jb2wsJHt0aHJpZnQuZ3JvdXBpZH0udHJhbnNwb3J0LG9yZy5zbGY0aiwke3RocmlmdC5ncm91cGlkfSZxdW90Ozt2ZXJzaW9uPSZxdW90OyR7dmVyc2lvbn0mcXVvdDssJHt0aHJpZnQuZ3JvdXBpZH0ucHJvdG9jb2w7dXNlczo9JnF1b3Q7JHt0aHJpZnQuZ3JvdXBpZH0udHJhbnNwb3J0LCR7dGhyaWZ0Lmdyb3VwaWR9LCR7dGhyaWZ0Lmdyb3VwaWR9LnNjaGVtZSZxdW90Ozt2ZXJzaW9uPSZxdW90OyR7dmVyc2lvbn0mcXVvdDssJHt0aHJpZnQuZ3JvdXBpZH0uc2VydmVyO3VzZXM6PSZxdW90OyR7dGhyaWZ0Lmdyb3VwaWR9LnRyYW5zcG9ydCwke3RocmlmdC5ncm91cGlkfS5wcm90b2NvbCwke3RocmlmdC5ncm91cGlkfSxvcmcuc2xmNGosamF2YXguc2VydmxldCxqYXZheC5zZXJ2bGV0Lmh0dHAmcXVvdDs7dmVyc2lvbj0mcXVvdDske3ZlcnNpb259JnF1b3Q7LCR7dGhyaWZ0Lmdyb3VwaWR9LnRyYW5zcG9ydDt1c2VzOj0mcXVvdDske3RocmlmdC5ncm91cGlkfS5wcm90b2NvbCwke3RocmlmdC5ncm91cGlkfSxvcmcuYXBhY2hlLmh0dHAuY2xpZW50LG9yZy5hcGFjaGUuaHR0cC5wYXJhbXMsb3JnLmFwYWNoZS5odHRwLmVudGl0eSxvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMsb3JnLmFwYWNoZS5odHRwLG9yZy5zbGY0aixqYXZheC5uZXQuc3NsLGphdmF4Lm5ldCxqYXZheC5zZWN1cml0eS5zYXNsLGphdmF4LnNlY3VyaXR5LmF1dGguY2FsbGJhY2smcXVvdDs7dmVyc2lvbj0mcXVvdDske3ZlcnNpb259JnF1b3Q7LCR7dGhyaWZ0Lmdyb3VwaWR9O3VzZXM6PSZxdW90OyR7dGhyaWZ0Lmdyb3VwaWR9LnByb3RvY29sLCR7dGhyaWZ0Lmdyb3VwaWR9LmFzeW5jLCR7dGhyaWZ0Lmdyb3VwaWR9LnNlcnZlciwke3RocmlmdC5ncm91cGlkfS50cmFuc3BvcnQsb3JnLnNsZjRqLG9yZy5hcGFjaGUubG9nNGosJHt0aHJpZnQuZ3JvdXBpZH0uc2NoZW1lJnF1b3Q7O3ZlcnNpb249JnF1b3Q7JHt2ZXJzaW9ufSZxdW90Oywke3RocmlmdC5ncm91cGlkfS5tZXRhX2RhdGE7dXNlczo9JnF1b3Q7JHt0aHJpZnQuZ3JvdXBpZH0mcXVvdDs7dmVyc2lvbj0mcXVvdDske3ZlcnNpb259JnF1b3Q7LCR7dGhyaWZ0Lmdyb3VwaWR9LnNjaGVtZTt1c2VzOj0mcXVvdDske3RocmlmdC5ncm91cGlkfS5wcm90b2NvbCwke3RocmlmdC5ncm91cGlkfSZxdW90Ozt2ZXJzaW9uPSZxdW90OyR7dmVyc2lvbn0mcXVvdDsiLz4KLSAgICAgICA8YXR0cmlidXRlIG5hbWU9IkltcG9ydC1QYWNrYWdlIiB2YWx1ZT0iamF2YXgubmV0LGphdmF4Lm5ldC5zc2wsamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFjayxqYXZheC5zZWN1cml0eS5zYXNsLGphdmF4LnNlcnZsZXQ7cmVzb2x1dGlvbjo9b3B0aW9uYWwsamF2YXguc2VydmxldC5odHRwO3Jlc29sdXRpb246PW9wdGlvbmFsLG9yZy5zbGY0ajtyZXNvbHV0aW9uOj1vcHRpb25hbDt2ZXJzaW9uPSZxdW90O1sxLjQsMikmcXVvdDssb3JnLmFwYWNoZS5odHRwLmNsaWVudDtyZXNvbHV0aW9uOj1vcHRpb25hbCxvcmcuYXBhY2hlLmh0dHAucGFyYW1zO3Jlc29sdXRpb246PW9wdGlvbmFsLG9yZy5hcGFjaGUuaHR0cC5lbnRpdHk7cmVzb2x1dGlvbjo9b3B0aW9uYWwsb3JnLmFwYWNoZS5odHRwLmNsaWVudC5tZXRob2RzO3Jlc29sdXRpb246PW9wdGlvbmFsLG9yZy5hcGFjaGUuaHR0cDtyZXNvbHV0aW9uOj1vcHRpb25hbCIvPgotICAgICAgPC9tYW5pZmVzdD4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtidWlsZC5kaXJ9Ij4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS90aHJpZnQvKiovKi5jbGFzcyIvPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSJNRVRBLUlORi8qLnR4dCIvPgotICAgICAgPC9maWxlc2V0PgotICAgIDwvamFyPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InBhY2suc3JjIj4KLSAgICA8amFyIGphcmZpbGU9IiR7c291cmNlLmphci5maWxlfSI+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7c3JjfSI+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouamF2YSIvPgotICAgICAgPC9maWxlc2V0PgotICAgIDwvamFyPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9Imluc3RhbGwiIGRlcGVuZHM9ImRpc3QsamF2YWRvYyI+Ci0gICAgPGNvcHkgdG9kaXI9IiR7aW5zdGFsbC5wYXRofSI+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7YnVpbGQuZGlyfSIgaW5jbHVkZXM9IiouamFyIi8+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7YnVpbGQubGliLmRpcn0iIGluY2x1ZGVzPSIqLmphciIvPgotICAgIDwvY29weT4KLSAgICA8Y29weSB0b2Rpcj0iJHtpbnN0YWxsLmphdmFkb2MucGF0aH0iPgotICAgICAgPGZpbGVzZXQgZGlyPSIke2phdmFkb2MuZGlyfSIgaW5jbHVkZXM9IioqLyoiLz4KLSAgICA8L2NvcHk+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iY2xlYW4iPgotICAgIDxkZWxldGUgZGlyPSIke2J1aWxkLmRpcn0iLz4KLSAgICA8ZGVsZXRlIGRpcj0iJHtnZW59Ii8+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7Z2VuYmVhbn0iLz4KLSAgICA8ZGVsZXRlIGRpcj0iJHtnZW5yZXVzZX0iLz4KLSAgICA8ZGVsZXRlIGRpcj0iJHtnZW5mdWxsY2FtZWx9Ii8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0ib3B0aW9uYWwtZ2VuZXJhdGUiIHVubGVzcz0ibm8tZ2VuLXRocmlmdCI+Ci0gICAgPGFudGNhbGwgdGFyZ2V0PSJnZW5lcmF0ZSI+Ci0gICAgPC9hbnRjYWxsPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUtdGVzdCIgZGVzY3JpcHRpb249IkJ1aWxkIHRoZSB0ZXN0IHN1aXRlIGNsYXNzZXMiIGRlcGVuZHM9Im9wdGlvbmFsLWdlbmVyYXRlLGRpc3QiPgotICAgIDxqYXZhYyBkZWJ1Zz0idHJ1ZSIgc3JjZGlyPSIke2dlbn0iIGRlc3RkaXI9IiR7YnVpbGQudGVzdC5kaXJ9IiBjbGFzc3BhdGhyZWY9InRlc3QuY2xhc3NwYXRoIiBpbmNsdWRlYW50cnVudGltZT0iZmFsc2UiIGVuY29kaW5nPSJVVEYtOCI+Ci0gICAgICA8Y29tcGlsZXJhcmcgdmFsdWU9Ii1YbGludDpkZXByZWNhdGlvbiIvPgotICAgICAgPCEtLTxjb21waWxlcmFyZyB2YWx1ZT0iLVhsaW50OnVuY2hlY2tlZCIvPi0tPgotICAgIDwvamF2YWM+Ci0gICAgPGphdmFjIGRlYnVnPSJ0cnVlIiBzcmNkaXI9IiR7Z2VuYmVhbn0iIGRlc3RkaXI9IiR7YnVpbGQudGVzdC5kaXJ9IiBjbGFzc3BhdGhyZWY9InRlc3QuY2xhc3NwYXRoIiBpbmNsdWRlYW50cnVudGltZT0iZmFsc2UiIGVuY29kaW5nPSJVVEYtOCI+Ci0gICAgICA8Y29tcGlsZXJhcmcgdmFsdWU9Ii1YbGludDpkZXByZWNhdGlvbiIvPgotICAgICAgPCEtLTxjb21waWxlcmFyZyB2YWx1ZT0iLVhsaW50OnVuY2hlY2tlZCIvPi0tPgotICAgIDwvamF2YWM+Ci0gICAgPGphdmFjIGRlYnVnPSJ0cnVlIiBzcmNkaXI9IiR7Z2VucmV1c2V9IiBkZXN0ZGlyPSIke2J1aWxkLnRlc3QuZGlyfSIgY2xhc3NwYXRocmVmPSJ0ZXN0LmNsYXNzcGF0aCIgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIiBlbmNvZGluZz0iVVRGLTgiPgotICAgICAgPGNvbXBpbGVyYXJnIHZhbHVlPSItWGxpbnQ6ZGVwcmVjYXRpb24iLz4KLSAgICAgIDwhLS08Y29tcGlsZXJhcmcgdmFsdWU9Ii1YbGludDp1bmNoZWNrZWQiLz4tLT4KLSAgICA8L2phdmFjPgotICAgIDxqYXZhYyBkZWJ1Zz0idHJ1ZSIgc3JjZGlyPSIke2dlbmZ1bGxjYW1lbH0iIGRlc3RkaXI9IiR7YnVpbGQudGVzdC5kaXJ9IiBjbGFzc3BhdGhyZWY9InRlc3QuY2xhc3NwYXRoIiBpbmNsdWRlYW50cnVudGltZT0iZmFsc2UiIGVuY29kaW5nPSJVVEYtOCI+Ci0gICAgICA8Y29tcGlsZXJhcmcgdmFsdWU9Ii1YbGludDpkZXByZWNhdGlvbiIvPgotICAgICAgPCEtLTxjb21waWxlcmFyZyB2YWx1ZT0iLVhsaW50OnVuY2hlY2tlZCIvPi0tPgotICAgIDwvamF2YWM+Ci0gICAgPGphdmFjIGRlYnVnPSJ0cnVlIiBzcmNkaXI9IiR7c3JjLnRlc3R9IiBkZXN0ZGlyPSIke2J1aWxkLnRlc3QuZGlyfSIgY2xhc3NwYXRocmVmPSJ0ZXN0LmNsYXNzcGF0aCIgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIiBlbmNvZGluZz0iVVRGLTgiPgotICAgICAgPGNvbXBpbGVyYXJnIHZhbHVlPSItWGxpbnQ6ZGVwcmVjYXRpb24iLz4KLSAgICAgIDwhLS08Y29tcGlsZXJhcmcgdmFsdWU9Ii1YbGludDp1bmNoZWNrZWQiLz4tLT4KLSAgICA8L2phdmFjPgotICAgIDxjb3B5IHRvZGlyPSIke2J1aWxkLnRlc3QuZGlyfSI+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7c3JjLnRlc3R9IiBpbmNsdWRlcz0ibG9nNGoucHJvcGVydGllcyIvPgotICAgIDwvY29weT4KLSAgICA8amFyIGphcmZpbGU9IiR7dGVzdC5qYXIuZmlsZX0iIGJhc2VkaXI9IiR7YnVpbGQudGVzdC5kaXJ9Ii8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0ianVuaXQtdGVzdCIgZGVzY3JpcHRpb249IlJ1biB0aGUgSlVuaXQgdGVzdCBzdWl0ZSIgZGVwZW5kcz0iY29tcGlsZS10ZXN0Ij4KLSAgICA8bWtkaXIgZGlyPSIke3Rlc3QubG9nLmRpcn0iLz4KLSAgICA8anVuaXQgcHJpbnRzdW1tYXJ5PSJ0cnVlIiBzaG93b3V0cHV0PSIke3Rlc3Qub3V0cHV0fSIgdGltZW91dD0iJHt0ZXN0LnRpbWVvdXR9IgotICAgICAgaGFsdG9uZmFpbHVyZT0idHJ1ZSIgZXJyb3JQcm9wZXJ0eT0idGVzdHMuZmFpbGVkIiBmYWlsdXJlUHJvcGVydHk9InRlc3RzLmZhaWxlZCIKLSAgICAgIGZvcms9InRydWUiIGZvcmttb2RlPSJwZXJUZXN0IiBtYXhtZW1vcnk9IjUxMm0iCi0gICAgPgotICAgICAgPHN5c3Byb3BlcnR5IGtleT0iYnVpbGQudGVzdCIgdmFsdWU9IiR7YnVpbGQudGVzdC5kaXJ9Ii8+Ci0gICAgICA8c3lzcHJvcGVydHkga2V5PSJ0ZXN0LnBvcnQiIHZhbHVlPSIke3Rlc3QucG9ydH0iLz4KLSAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9ImphdmF4Lm5ldC5zc2wudHJ1c3RTdG9yZSIgdmFsdWU9IiR7c3JjLnRlc3R9Ly50cnVzdHN0b3JlIi8+Ci0gICAgICA8c3lzcHJvcGVydHkga2V5PSJqYXZheC5uZXQuc3NsLnRydXN0U3RvcmVQYXNzd29yZCIgdmFsdWU9InRocmlmdCIvPgotICAgICAgPHN5c3Byb3BlcnR5IGtleT0iamF2YXgubmV0LnNzbC5rZXlTdG9yZSIgdmFsdWU9IiR7c3JjLnRlc3R9Ly5rZXlzdG9yZSIvPgotICAgICAgPHN5c3Byb3BlcnR5IGtleT0iamF2YXgubmV0LnNzbC5rZXlTdG9yZVBhc3N3b3JkIiB2YWx1ZT0idGhyaWZ0Ii8+Ci0gICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJ0ZXN0LmNsYXNzcGF0aCIvPgotICAgICAgPGZvcm1hdHRlciB0eXBlPSIke3Rlc3QuanVuaXQub3V0cHV0LmZvcm1hdH0iLz4KLSAgICAgIDxiYXRjaHRlc3QgdG9kaXI9IiR7dGVzdC5sb2cuZGlyfSIgdW5sZXNzPSJ0ZXN0Y2FzZSI+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHt0ZXN0LnNyYy5kaXJ9Ij4KLSAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi9UZXN0Ki5qYXZhIi8+Ci0gICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovVGVzdENsaWVudC5qYXZhIi8+Ci0gICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovVGVzdFNlcnZlci5qYXZhIi8+Ci0gICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovVGVzdE5vbmJsb2NraW5nU2VydmVyLmphdmEiLz4KLSAgICAgICAgPC9maWxlc2V0PgotICAgICAgPC9iYXRjaHRlc3Q+Ci0gICAgICA8YmF0Y2h0ZXN0IHRvZGlyPSIke3Rlc3QubG9nLmRpcn0iIGlmPSJ0ZXN0Y2FzZSI+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHt0ZXN0LnNyYy5kaXJ9IiBpbmNsdWRlcz0iKiovJHt0ZXN0Y2FzZX0uamF2YSIvPgotICAgICAgPC9iYXRjaHRlc3Q+Ci0gICAgPC9qdW5pdD4KLSAgICA8ZmFpbCBpZj0idGVzdHMuZmFpbGVkIj5UZXN0cyBmYWlsZWQhPC9mYWlsPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9ImRlcHJlY2F0ZWQtdGVzdCIgZGVzY3JpcHRpb249IlJ1biB0aGUgbm9uLUpVbml0IHRlc3Qgc3VpdGUiIGRlcGVuZHM9ImNvbXBpbGUtdGVzdCI+Ci0gICAgPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRocmlmdC50ZXN0LkVxdWFsaXR5VGVzdCIgY2xhc3NwYXRocmVmPSJ0ZXN0LmNsYXNzcGF0aCIgZmFpbG9uZXJyb3I9InRydWUiLz4KLSAgICA8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUudGhyaWZ0LnRlc3QuSmF2YUJlYW5zVGVzdCIgY2xhc3NwYXRocmVmPSJ0ZXN0LmNsYXNzcGF0aCIgZmFpbG9uZXJyb3I9InRydWUiLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0IiBkZXNjcmlwdGlvbj0iUnVuIHRoZSBmdWxsIHRlc3Qgc3VpdGUiIGRlcGVuZHM9Imp1bml0LXRlc3QsZGVwcmVjYXRlZC10ZXN0Ii8+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0Y2xpZW50IiBkZXNjcmlwdGlvbj0iUnVuIGEgdGVzdCBjbGllbnQiIGRlcGVuZHM9ImNvbXBpbGUtdGVzdCwgcnVuLXRlc3RjbGllbnQiLz4KLSAgPHRhcmdldCBuYW1lPSJydW4tdGVzdGNsaWVudCIgZGVzY3JpcHRpb249IlJ1biBhIHRlc3QgY2xpZW50Ij4KLSAgICA8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUudGhyaWZ0LnRlc3QuVGVzdENsaWVudCIKLSAgICAgIGNsYXNzcGF0aHJlZj0idGVzdC5jbGFzc3BhdGgiIGZhaWxvbmVycm9yPSJ0cnVlIiBmb3JrPSJ0cnVlIj4KLSAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9ImphdmF4Lm5ldC5zc2wudHJ1c3RTdG9yZSIgdmFsdWU9IiR7c3JjLnRlc3R9Ly50cnVzdHN0b3JlIi8+Ci0gICAgICA8c3lzcHJvcGVydHkga2V5PSJqYXZheC5uZXQuc3NsLnRydXN0U3RvcmVQYXNzd29yZCIgdmFsdWU9InRocmlmdCIvPgotICAgICAgPGFyZyBsaW5lPSIke3Rlc3RhcmdzfSIvPgotICAgIDwvamF2YT4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0c2VydmVyIiBkZXNjcmlwdGlvbj0iUnVuIGEgdGVzdCBzZXJ2ZXIiIGRlcGVuZHM9ImNvbXBpbGUtdGVzdCwgcnVuLXRlc3RzZXJ2ZXIiLz4KLSAgPHRhcmdldCBuYW1lPSJydW4tdGVzdHNlcnZlciIgZGVzY3JpcHRpb249IlJ1biBhIHRlc3Qgc2VydmVyIj4KLSAgICA8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUudGhyaWZ0LnRlc3QuVGVzdFNlcnZlciIKLSAgICAgIGNsYXNzcGF0aHJlZj0idGVzdC5jbGFzc3BhdGgiIGZhaWxvbmVycm9yPSJ0cnVlIiBmb3JrPSJ0cnVlIj4KLSAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9ImphdmF4Lm5ldC5zc2wua2V5U3RvcmUiIHZhbHVlPSIke3NyYy50ZXN0fS8ua2V5c3RvcmUiLz4KLSAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9ImphdmF4Lm5ldC5zc2wua2V5U3RvcmVQYXNzd29yZCIgdmFsdWU9InRocmlmdCIvPgotICAgICAgPGFyZyBsaW5lPSIke3Rlc3RhcmdzfSIvPgotICAgIDwvamF2YT4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0bm9uYmxvY2tpbmdzZXJ2ZXIiIGRlc2NyaXB0aW9uPSJSdW4gYSB0ZXN0IG5vbmJsb2NraW5nIHNlcnZlciIgZGVwZW5kcz0iY29tcGlsZS10ZXN0LCBydW4tdGVzdG5vbmJsb2NraW5nc2VydmVyIi8+Ci0gIDx0YXJnZXQgbmFtZT0icnVuLXRlc3Rub25ibG9ja2luZ3NlcnZlciIgZGVzY3JpcHRpb249IlJ1biBhIHRlc3Qgbm9uYmxvY2tpbmcgc2VydmVyIj4KLSAgICA8amF2YSBjbGFzc25hbWU9Im9yZy5hcGFjaGUudGhyaWZ0LnRlc3QuVGVzdE5vbmJsb2NraW5nU2VydmVyIgotICAgICAgY2xhc3NwYXRocmVmPSJ0ZXN0LmNsYXNzcGF0aCIgZmFpbG9uZXJyb3I9InRydWUiPgotICAgICAgPGFyZyBsaW5lPSIke3Rlc3RhcmdzfSIvPgotICAgIDwvamF2YT4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJnZW5lcmF0ZSI+Ci0gICAgPCEtLSBHZW5lcmF0ZSB0aGUgdGhyaWZ0IGdlbi1qYXZhIHNvdXJjZSAtLT4KLSAgICA8ZXhlYyBleGVjdXRhYmxlPSIuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IiBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8YXJnIGxpbmU9Ii0tZ2VuIGphdmE6aGFzaGNvZGUgJHt0ZXN0LnRocmlmdC5ob21lfS9UaHJpZnRUZXN0LnRocmlmdCIvPgotICAgIDwvZXhlYz4KLSAgICA8ZXhlYyBleGVjdXRhYmxlPSIuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IiBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8YXJnIGxpbmU9Ii0tZ2VuIGphdmE6aGFzaGNvZGUgJHt0ZXN0LnRocmlmdC5ob21lfS9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQiLz4KLSAgICA8L2V4ZWM+Ci0gICAgPGV4ZWMgZXhlY3V0YWJsZT0iLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCIgZmFpbG9uZXJyb3I9InRydWUiPgotICAgICAgPGFyZyBsaW5lPSItLWdlbiBqYXZhOmhhc2hjb2RlICR7dGVzdC50aHJpZnQuaG9tZX0vT3B0aW9uYWxSZXF1aXJlZFRlc3QudGhyaWZ0Ii8+Ci0gICAgPC9leGVjPgotICAgIDxleGVjIGV4ZWN1dGFibGU9Ii4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQiIGZhaWxvbmVycm9yPSJ0cnVlIj4KLSAgICAgIDxhcmcgbGluZT0iLS1nZW4gamF2YTpiZWFucyxub2NhbWVsICR7dGVzdC50aHJpZnQuaG9tZX0vSmF2YUJlYW5zVGVzdC50aHJpZnQiLz4KLSAgICA8L2V4ZWM+Ci0gICAgPGV4ZWMgZXhlY3V0YWJsZT0iLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCIgZmFpbG9uZXJyb3I9InRydWUiPgotICAgICAgPGFyZyBsaW5lPSItLWdlbiBqYXZhOmhhc2hjb2RlICR7dGVzdC50aHJpZnQuaG9tZX0vTWFueU9wdGlvbmFscy50aHJpZnQiLz4KLSAgICA8L2V4ZWM+Ci0gICAgPGV4ZWMgZXhlY3V0YWJsZT0ibWtkaXIiIGZhaWxvbmVycm9yPSJ0cnVlIj4KLSAgICAgIDxhcmcgbGluZT0iLXAgJHtnZW5mdWxsY2FtZWx9Ii8+Ci0gICAgPC9leGVjPgotICAgIDxleGVjIGV4ZWN1dGFibGU9Ii4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQiIGZhaWxvbmVycm9yPSJ0cnVlIj4KLSAgICAgIDxhcmcgbGluZT0iLS1nZW4gamF2YTpoYXNoY29kZSxmdWxsY2FtZWwgLW91dCAke2dlbmZ1bGxjYW1lbH0gJHt0ZXN0LnRocmlmdC5ob21lfS9EZW5zZUxpbmtpbmdUZXN0LnRocmlmdCIvPgotICAgIDwvZXhlYz4KLSAgICA8ZXhlYyBleGVjdXRhYmxlPSJta2RpciIgZmFpbG9uZXJyb3I9InRydWUiPgotICAgICAgPGFyZyBsaW5lPSItcCAke2dlbnJldXNlfSIvPgotICAgIDwvZXhlYz4KLSAgICA8ZXhlYyBleGVjdXRhYmxlPSIuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IiBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8YXJnIGxpbmU9Ii0tZ2VuIGphdmE6cmV1c2Utb2JqZWN0cyAtb3V0ICR7Z2VucmV1c2V9ICR7dGVzdC50aHJpZnQuaG9tZX0vUmV1c2VPYmplY3RzLnRocmlmdCIvPgotICAgIDwvZXhlYz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJwcm94eSIgaWY9InByb3h5LmVuYWJsZWQiPgotICAgIDxzZXRwcm94eSBwcm94eWhvc3Q9IiR7cHJveHkuaG9zdH0iIHByb3h5cG9ydD0iJHtwcm94eS5wb3J0fSIKLSAgICAgIHByb3h5dXNlcj0iJHtwcm94eS51c2VyfSIgcHJveHlwYXNzd29yZD0iJHtwcm94eS5wYXNzfSIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9Im12bi5hbnQudGFza3MuZG93bmxvYWQiIGRlcGVuZHM9InNldHVwLmluaXQsbXZuLmFudC50YXNrcy5jaGVjayxwcm94eSIgdW5sZXNzPSJtdm4uYW50LnRhc2tzLmZvdW5kIj4KLSAgICA8Z2V0IHNyYz0iJHttdm4uYW50LnRhc2sudXJsfS8ke212bi5hbnQudGFzay5qYXJ9IiBkZXN0PSIke2J1aWxkLnRvb2xzLmRpcn0vJHttdm4uYW50LnRhc2suamFyfSIgdXNldGltZXN0YW1wPSJ0cnVlIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0ibXZuLmFudC50YXNrcy5jaGVjayI+Ci0gICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ibXZuLmFudC50YXNrcy5mb3VuZCI+Ci0gICAgICA8dHlwZWZvdW5kIHVyaT0iYW50bGliOm9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuYW50IiBuYW1lPSJhcnRpZmFjdCIvPgotICAgIDwvY29uZGl0aW9uPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9Im12bi5pbml0IiBkZXBlbmRzPSJtdm4uYW50LnRhc2tzLmRvd25sb2FkIiB1bmxlc3M9Im12bi5maW5pc2hlZCI+Ci0gICAgPCEtLSBEb3dubG9hZCBtdm4gYW50IHRhc2tzLCBkb3dubG9hZCBkZXBlbmRlbmNpZXMsIGFuZCBzZXR1cCBwb20gZmlsZSAtLT4KLSAgICA8dHlwZWRlZiB1cmk9ImFudGxpYjpvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LmFudCIgY2xhc3NwYXRoPSIke2J1aWxkLnRvb2xzLmRpcn0vJHttdm4uYW50LnRhc2suamFyfSIvPgotCi0gICAgPCEtLSByZW1vdGUgcmVwb3NpdG9yaWVzIHVzZWQgdG8gZG93bmxvYWQgZGVwZW5kZW5jaWVzIGZyb20gLS0+Ci0gICAgPGFydGlmYWN0OnJlbW90ZVJlcG9zaXRvcnkgaWQ9ImNlbnRyYWwiIHVybD0iJHttdm4ucmVwb30iLz4KLSAgICA8YXJ0aWZhY3Q6cmVtb3RlUmVwb3NpdG9yeSBpZD0iYXBhY2hlIiB1cmw9IiR7YXBhY2hlLnJlcG99Ii8+Ci0KLSAgICA8IS0tIFBvbSBmaWxlIGluZm9ybWF0aW9uIC0tPgotICAgIDxhcnRpZmFjdDpwb20gaWQ9InBvbSIKLSAgICAgIGdyb3VwSWQ9IiR7dGhyaWZ0Lmdyb3VwaWR9IgotICAgICAgYXJ0aWZhY3RJZD0iJHt0aHJpZnQuYXJ0aWZhY3RpZH0iCi0gICAgICB2ZXJzaW9uPSIke3ZlcnNpb259IgotICAgICAgdXJsPSJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmciCi0gICAgICBuYW1lPSJBcGFjaGUgVGhyaWZ0IgotICAgICAgZGVzY3JpcHRpb249IlRocmlmdCBpcyBhIHNvZnR3YXJlIGZyYW1ld29yayBmb3Igc2NhbGFibGUgY3Jvc3MtbGFuZ3VhZ2Ugc2VydmljZXMgZGV2ZWxvcG1lbnQuIgotICAgICAgcGFja2FnaW5nPSJwb20iCi0gICAgPgotICAgICAgPHJlbW90ZVJlcG9zaXRvcnkgcmVmaWQ9ImNlbnRyYWwiLz4KLSAgICAgIDxyZW1vdGVSZXBvc2l0b3J5IHJlZmlkPSJhcGFjaGUiLz4KLSAgICAgIDxsaWNlbnNlIG5hbWU9IlRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjAiIHVybD0iJHtsaWNlbnNlfSIvPgotICAgICAgPHNjbSBjb25uZWN0aW9uPSJzY206Z2l0Omh0dHBzOi8vZ2l0LXdpcC11cy5hcGFjaGUub3JnL3JlcG9zL2FzZi90aHJpZnQuZ2l0IgotICAgICAgZGV2ZWxvcGVyQ29ubmVjdGlvbj0ic2NtOmdpdDpodHRwczovL2dpdC13aXAtdXMuYXBhY2hlLm9yZy9yZXBvcy9hc2YvdGhyaWZ0LmdpdCIKLSAgICAgIHVybD0iaHR0cHM6Ly9naXQtd2lwLXVzLmFwYWNoZS5vcmcvcmVwb3MvYXNmP3A9dGhyaWZ0LmdpdCIKLSAgICAgIC8+Ci0gICAgICA8IS0tIFRocmlmdCBEZXZlbG9wZXJzIC0tPgotICAgICAgPGRldmVsb3BlciBpZD0ibWNzbGVlIiBuYW1lPSJNYXJrIFNsZWUiLz4KLSAgICAgIDxkZXZlbG9wZXIgaWQ9ImRyZWlzcyIgbmFtZT0iRGF2aWQgUmVpc3MiLz4KLSAgICAgIDxkZXZlbG9wZXIgaWQ9ImFkaXR5YSIgbmFtZT0iQWRpdHlhIEFnYXJ3YWwiLz4KLSAgICAgIDxkZXZlbG9wZXIgaWQ9Im1hcmNrIiBuYW1lPSJNYXJjIEt3aWF0a293c2tpIi8+Ci0gICAgICA8ZGV2ZWxvcGVyIGlkPSJqd2FuZyIgbmFtZT0iSmFtZXMgV2FuZyIvPgotICAgICAgPGRldmVsb3BlciBpZD0iY3Bpcm8iIG5hbWU9IkNocmlzIFBpcm8iLz4KLSAgICAgIDxkZXZlbG9wZXIgaWQ9ImJtYXVyZXIiIG5hbWU9IkJlbiBNYXVyZXIiLz4KLSAgICAgIDxkZXZlbG9wZXIgaWQ9ImtjbGFyayIgbmFtZT0iS2V2aW4gQ2xhcmsiLz4KLSAgICAgIDxkZXZlbG9wZXIgaWQ9Impha2UiIG5hbWU9Ikpha2UgTHVjaWFuaSIvPgotICAgICAgPGRldmVsb3BlciBpZD0iYnJ5YW5kdXhidXJ5IiBuYW1lPSJCcnlhbiBEdXhidXJ5Ii8+Ci0gICAgICA8ZGV2ZWxvcGVyIGlkPSJlc3RldmUiIG5hbWU9IkVzdGV2ZSBGZXJuYW5kZXoiLz4KLSAgICAgIDxkZXZlbG9wZXIgaWQ9InRvZGQiIG5hbWU9IlRvZGQgTGlwY29uIi8+Ci0gICAgICA8ZGV2ZWxvcGVyIGlkPSJnZWVjaG9yYW1hIiBuYW1lPSJBbmRyZXcgTWNHZWFjaGllIi8+Ci0gICAgICA8ZGV2ZWxvcGVyIGlkPSJtb2xpbmFybyIgbmFtZT0iQW50aG9ueSBNb2xpbmFybyIvPgotICAgICAgPGRldmVsb3BlciBpZD0icm9nZXIiIG5hbWU9IlJvZ2VyIE1laWVyIi8+Ci0gICAgICA8ZGV2ZWxvcGVyIGlkPSJqZmFycmVsbCIgbmFtZT0iSmFrZSBGYXJyZWxsIi8+Ci0gICAgICA8ZGV2ZWxvcGVyIGlkPSJqZW5zZyIgbmFtZT0iSmVucyBHZXllciIvPgotICAgICAgPGRldmVsb3BlciBpZD0iY2FybCIgbmFtZT0iQ2FybCBZZWtzaWdpYW4iLz4KLQotICAgICAgPCEtLSBUaHJpZnQgZGVwZW5kZW5jaWVzIGxpc3QgLS0+Ci0gICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcuc2xmNGoiIGFydGlmYWN0SWQ9InNsZjRqLWFwaSIgdmVyc2lvbj0iJHtzbGY0ai52ZXJzaW9ufSIvPgotICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iamF2YXguc2VydmxldCIgYXJ0aWZhY3RJZD0ic2VydmxldC1hcGkiIHZlcnNpb249IiR7c2VydmxldC52ZXJzaW9ufSIgc2NvcGU9InByb3ZpZGVkIi8+Ci0gICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzIiBhcnRpZmFjdElkPSJodHRwY2xpZW50IiB2ZXJzaW9uPSIke2h0dHBjbGllbnQudmVyc2lvbn0iLz4KLSAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMiIGFydGlmYWN0SWQ9Imh0dHBjb3JlIiB2ZXJzaW9uPSIke2h0dHBjb3JlLnZlcnNpb259Ii8+Ci0gICAgPC9hcnRpZmFjdDpwb20+Ci0KLSAgICA8IS0tIEdlbmVyYXRlIHRoZSBwb20gZmlsZSAtLT4KLSAgICA8YXJ0aWZhY3Q6d3JpdGVwb20gcG9tUmVmSWQ9InBvbSIgZmlsZT0iJHtwb20ueG1sfSIvPgotCi0gICAgPCEtLSBEb3dubG9hZCB0aGUgZGVwZW5kZW5jaWVzIC0tPgotICAgIDxhcnRpZmFjdDpkZXBlbmRlbmNpZXMgZmlsZXNldElkPSJidWlsZC1kZXBlbmRlbmN5LWphcnMiIHBvbVJlZklkPSJwb20iLz4KLQotICAgIDwhLS0gQ29weSB0aGUgZGVwZW5kZW5jaWVzIHRvIHRoZSBidWlsZC9saWIgZGlyIC0tPgotICAgIDxjb3B5IHRvZGlyPSIke2J1aWxkLmRpcn0vbGliIj4KLSAgICAgIDxmaWxlc2V0IHJlZmlkPSJidWlsZC1kZXBlbmRlbmN5LWphcnMiLz4KLSAgICAgIDxtYXBwZXIgdHlwZT0iZmxhdHRlbiIvPgotICAgIDwvY29weT4KLQotICAgIDwhLS0gRGVwZW5kZW5jaWVzIG5lZWRlZCBmb3IgdGVzdGluZyAtLT4KLSAgICA8YXJ0aWZhY3Q6ZGVwZW5kZW5jaWVzIGZpbGVzZXRJZD0idGVzdC1kZXBlbmRlbmN5LWphcnMiIHVzZVNjb3BlPSJydW50aW1lIj4KLSAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5zbGY0aiIgYXJ0aWZhY3RJZD0ic2xmNGotbG9nNGoxMiIgdmVyc2lvbj0iMS41LjgiLz4KLSAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Imp1bml0IiBhcnRpZmFjdElkPSJqdW5pdCIgdmVyc2lvbj0iNC40Ii8+Ci0gICAgPC9hcnRpZmFjdDpkZXBlbmRlbmNpZXM+Ci0KLSAgICA8IS0tIENvcHkgdGhlIHRlc3QgZGVwZW5kZW5jaWVzIHRvIHRoZSBidWlsZC9saWIgZGlyIC0tPgotICAgIDxjb3B5IHRvZGlyPSIke2J1aWxkLmRpcn0vbGliIj4KLSAgICAgIDxmaWxlc2V0IHJlZmlkPSJ0ZXN0LWRlcGVuZGVuY3ktamFycyIvPgotICAgICAgPG1hcHBlciB0eXBlPSJmbGF0dGVuIi8+Ci0gICAgPC9jb3B5PgotCi0gICAgPHByb3BlcnR5IG5hbWU9Im12bi5maW5pc2hlZCIgdmFsdWU9InRydWUiLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPG1hY3JvZGVmIG5hbWU9InNpZ25BbmREZXBsb3kiPgotICAgIDwhLS0gU2lnbiBhbmQgZGVwbG95IGphcnMgdG8gYXBhY2hlIHJlcG8gLS0+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJmaWxlIi8+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzc2lmaWVyIiBkZWZhdWx0PSIiLz4KLSAgICA8YXR0cmlidXRlIG5hbWU9InBhY2thZ2luZyIgZGVmYXVsdD0iamFyIi8+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJwb20iIGRlZmF1bHQ9IiIvPgotICAgIDxzZXF1ZW50aWFsPgotICAgICAgPGFydGlmYWN0Om12biBmb3JrPSJ0cnVlIj4KLSAgICAgICAgPGFyZyB2YWx1ZT0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zOm1hdmVuLWdwZy1wbHVnaW46MS42OnNpZ24tYW5kLWRlcGxveS1maWxlIi8+Ci0gICAgICAgIDxhcmcgdmFsdWU9Ii1EcmVwb3NpdG9yeUlkPSR7bWF2ZW4tcmVwb3NpdG9yeS1pZH0iLz4KLSAgICAgICAgPGFyZyB2YWx1ZT0iLUR1cmw9JHttYXZlbi1yZXBvc2l0b3J5LXVybH0iLz4KLSAgICAgICAgPGFyZyB2YWx1ZT0iLURwb21GaWxlPUB7cG9tfSIvPgotICAgICAgICA8YXJnIHZhbHVlPSItRGZpbGU9QHtmaWxlfSIvPgotICAgICAgICA8YXJnIHZhbHVlPSItRGNsYXNzaWZpZXI9QHtjbGFzc2lmaWVyfSIvPgotICAgICAgICA8YXJnIHZhbHVlPSItRHBhY2thZ2luZz1Ae3BhY2thZ2luZ30iLz4KLSAgICAgICAgPGFyZyB2YWx1ZT0iLVBncGciLz4KLSAgICAgIDwvYXJ0aWZhY3Q6bXZuPgotICAgIDwvc2VxdWVudGlhbD4KLSAgPC9tYWNyb2RlZj4KLQotICA8dGFyZ2V0IG5hbWU9InB1Ymxpc2giIGRlcGVuZHM9ImNsZWFuLGluaXQsdGVzdCxkaXN0LGphdmFkb2MscGFjay5zcmMiPgotICAgIDwhLS0gQ29tcGlsZSwgcGFja2FnZSwgdGVzdCBhbmQgdGhlbiBzZW5kIHJlbGVhc2UgdG8gYXBhY2hlIG1hdmVuIHJlcG8gLS0+Ci0gICAgPCEtLSBydW4gd2l0aDogYW50IC1EcmVsZWFzZT10cnVlIHB1Ymxpc2gtLT4KLSAgICA8c2lnbkFuZERlcGxveSBmaWxlPSIke3BvbS54bWx9IiBwYWNrYWdpbmc9InBvbSIgY2xhc3NpZmllcj0iIiBwb209IiR7cG9tLnhtbH0iLz4KLSAgICA8c2lnbkFuZERlcGxveSBmaWxlPSIke2phci5maWxlfSIgY2xhc3NpZmllcj0iIiBwb209IiR7cG9tLnhtbH0iLz4KLSAgICA8c2lnbkFuZERlcGxveSBmaWxlPSIke2phdmFkb2MuamFyLmZpbGV9IiBjbGFzc2lmaWVyPSJqYXZhZG9jIiBwb209IiR7cG9tLnhtbH0iLz4KLSAgICA8c2lnbkFuZERlcGxveSBmaWxlPSIke3NvdXJjZS5qYXIuZmlsZX0iIGNsYXNzaWZpZXI9InNvdXJjZXMiIHBvbT0iJHtwb20ueG1sfSIvPgotICA8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2NvZGVfcXVhbGl0eV90b29scy9maW5kYnVncy1maWx0ZXIueG1sIGIvbGliL2phdmEvY29kZV9xdWFsaXR5X3Rvb2xzL2ZpbmRidWdzLWZpbHRlci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE5M2IwYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL2NvZGVfcXVhbGl0eV90b29scy9maW5kYnVncy1maWx0ZXIueG1sCkBAIC0wLDAgKzEsNTEgQEAKKzxGaW5kQnVnc0ZpbHRlcj4KKyAgICA8IS0tCisgICAgICAgIFRoaXMgZmlsZSBjb250cm9scyBmaWx0ZXJpbmcgc29tZSBvZiB0aGUgbW9yZSBvYm5veGlvdXMgZmluZGJ1Z3MgcmVwb3J0cy4KKyAgICAgICAgU29tZSBtYXkgYmUgd29ydGh5IG9mIGV4YW1pbmF0aW9uIGFuZCByZXNvbHV0aW9uLCBvdGhlcnMgYXJlIHRvbyBuaXQtcGlja3kuCisgICAgLS0+CisgICAgPE1hdGNoPgorICAgICAgICA8T3I+CisgICAgICAgICAgICA8IS0tIEZpbHRlciB0aGUgbWlzc2luZyBzZXJpYWxWZXJzaW9uVUlEIGVycm9ycyAtLT4KKyAgICAgICAgICAgIDxCdWcgY29kZT0iU25WSSIgLz4KKyAgICAgICAgICAgIDwhLS0gRmlsdGVyIE1hbGljaW91cyBjb2RlIHZ1bG5lcmFiaWxpdHkgV2FybmluZ3MgLS0+CisgICAgICAgICAgICA8QnVnIGNvZGU9IkVJLEVJMiIgLz4KKyAgICAgICAgICAgIDwhLS0gRmlsdGVyIFVuY2hlY2tlZC91bmNvbmZpcm1lZCBjYXN0IC0tPgorICAgICAgICAgICAgPEJ1ZyBjb2RlPSJCQyIgLz4KKyAgICAgICAgICAgIDwhLS0gRmlsdGVyIFNob3VsZCByZXR1cm4gYSB6ZXJvIGxlbmd0aCBhcnJheSByYXRoZXIgdGhhbiBudWxsPyAtLT4KKyAgICAgICAgICAgIDxCdWcgY29kZT0iUFpMQSIgLz4KKyAgICAgICAgICAgIDwhLS0gRmlsdGVyIFJlZHVuZGFudCBudWxsY2hlY2sgLS0+CisgICAgICAgICAgICA8QnVnIGNvZGU9IlJDTiIgLz4KKyAgICAgICAgICAgIDwhLS0gRmlsdGVyIEV4Y2VwdGlvbiBpcyBjYXVnaHQgd2hlbiBFeGNlcHRpb24gaXMgbm90IHRocm93biAtLT4KKyAgICAgICAgICAgIDxCdWcgY29kZT0iUkVDIiAvPgorICAgICAgICAgICAgPCEtLSBGaWx0ZXIgU3dpdGNoIHN0YXRlbWVudCBmb3VuZCB3aGVyZSBkZWZhdWx0IGNhc2UgaXMgbWlzc2luZyAtLT4KKyAgICAgICAgICAgIDxCdWcgY29kZT0iU0YiIC8+CisgICAgICAgICAgICA8IS0tIEZpbHRlciBVbnJlYWQgcHVibGljL3Byb3RlY3RlZCBmaWVsZCAtLT4KKyAgICAgICAgICAgIDxCdWcgY29kZT0iVXJGIiAvPgorICAgICAgICAgICAgPCEtLSBGaWx0ZXIgRmllbGQgbm90IGluaXRpYWxpemVkIGluIGNvbnN0cnVjdG9yIGFuZCBkZXJlZmVyZW5jZWQgLS0+CisgICAgICAgICAgICA8QnVnIGNvZGU9IlV3RiIgLz4KKyAgICAgICAgPC9Pcj4KKyAgICA8L01hdGNoPgorICAgICA8TWF0Y2g+CisgICAgICAgIDwhLS0gRmlsdGVyIG1ldGhvZCBpbnZva2VzIFN5c3RlbS5leGl0KC4uLiksIHdoaWNoIHNodXRzIGRvd24gdGhlIGVudGlyZSB2aXJ0dWFsIG1hY2hpbmUgLS0+CisgICAgICAgIDxDbGFzcyBuYW1lPSJvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVEZpbGVUcmFuc3BvcnQiIC8+CisgICAgICAgIDxNZXRob2QgbmFtZT0icHJpbnRVc2FnZSIgLz4KKyAgICAgICAgPEJ1ZyBjb2RlPSJEbSIgLz4KKyAgICAgPC9NYXRjaD4KKyAgICAgPE1hdGNoPgorICAgICAgICA8IS0tIEZpbHRlciBtZXRob2QgbWlnaHQgaWdub3JlIGphdmEubGFuZy5FeGNlcHRpb24gLS0+CisgICAgICAgPENsYXNzIG5hbWU9Im9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UU2ltcGxlRmlsZVRyYW5zcG9ydCIgLz4KKyAgICAgICA8TWV0aG9kIG5hbWU9ImNsb3NlIiAvPgorICAgICAgIDxCdWcgY29kZT0iREUiIC8+CisgICAgIDwvTWF0Y2g+CisgICAgIDxNYXRjaD4KKyAgICAgICAgPCEtLSBGaWx0ZXIgbWV0aG9kIG1pZ2h0IGlnbm9yZSBqYXZhLmxhbmcuRXhjZXB0aW9uIC0tPgorICAgICAgIDxDbGFzcyBuYW1lPSJvcmcuYXBhY2hlLnRocmlmdC5UTm9uYmxvY2tpbmdNdWx0aUZldGNoQ2xpZW50JE11bHRpRmV0Y2giIC8+CisgICAgICAgPE1ldGhvZCBuYW1lPSJydW4iIC8+CisgICAgICAgPEJ1ZyBjb2RlPSJERSIgLz4KKyAgICAgPC9NYXRjaD4KKyAgICAgPE1hdGNoPgorICAgICAgICA8IS0tIEZpbHRlciBDbGFzcyBkZWZpbmVzIG5vbi10cmFuc2llbnQgbm9uLXNlcmlhbGl6YWJsZSBpbnN0YW5jZSBmaWVsZCAtLT4KKyAgICAgICA8Q2xhc3MgbmFtZT0ib3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLlRTZXJ2bGV0IiAvPgorICAgICAgIDxCdWcgY29kZT0iU2UiIC8+CisgICAgIDwvTWF0Y2g+Cis8L0ZpbmRCdWdzRmlsdGVyPgpkaWZmIC0tZ2l0IGEvbGliL2phdmEvZ3JhZGxlLnByb3BlcnRpZXMgYi9saWIvamF2YS9ncmFkbGUucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTZhOTZlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvZ3JhZGxlLnByb3BlcnRpZXMKQEAgLTAsMCArMSwzMyBAQAorIyBUaGlzIGZpbGUgaXMgc2hhcmVkIGN1cnJlbnRseSBiZXR3ZWVuIHRoaXMgR3JhZGxlIGJ1aWxkIGFuZCB0aGUKKyMgQW50IGJ1aWxkcyBmb3IgZmQzMDMgYW5kIEphdmFTY3JpcHQuIEtlZXAgdGhlIGRvdHRlZCBub3RhdGlvbiBmb3IKKyMgdGhlIHByb3BlcnRpZXMgdG8gbWluaW1pemUgdGhlIGNoYW5nZXMgaW4gdGhlIGRlcGVuZGVuY2llcy4KK3RocmlmdC52ZXJzaW9uPTEuMC4wCit0aHJpZnQuZ3JvdXBpZD1vcmcuYXBhY2hlLnRocmlmdAorcmVsZWFzZT10cnVlCisKKyMgTG9jYWwgSW5zdGFsbCBwYXRocworaW5zdGFsbC5wYXRoPS91c3IvbG9jYWwvbGliCitpbnN0YWxsLmphdmFkb2MucGF0aD0vdXNyL2xvY2FsL2xpYgorCisjIFRlc3QgZXhlY3V0aW9uIHByb3BlcnRpZXMKK3Rlc3RQb3J0PTkwOTAKKworIyBUZXN0IHdpdGggQ2xvdmVyIENvZGUgY292ZXJhZ2UgKGRpc2FibGVkIGJ5IGRlZmF1bHQpCitjbG92ZXJFbmFibGVkPWZhbHNlCisKKyMgTWF2ZW4gZGVwZW5kZW5jeSBkb3dubG9hZCBsb2NhdGlvbnMKK212bi5yZXBvPWh0dHA6Ly9yZXBvMS5tYXZlbi5vcmcvbWF2ZW4yCithcGFjaGUucmVwbz1odHRwczovL3JlcG9zaXRvcnkuYXBhY2hlLm9yZy9jb250ZW50L3JlcG9zaXRvcmllcy9yZWxlYXNlcworCisjIEFwYWNoZSBNYXZlbiBwdWJsaXNoCitsaWNlbnNlPWh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQKK21hdmVuLXJlcG9zaXRvcnktdXJsPWh0dHBzOi8vcmVwb3NpdG9yeS5hcGFjaGUub3JnL3NlcnZpY2UvbG9jYWwvc3RhZ2luZy9kZXBsb3kvbWF2ZW4yCittYXZlbi1yZXBvc2l0b3J5LWlkPWFwYWNoZS5yZWxlYXNlcy5odHRwcworCisjIERlcGVuZGVuY3kgdmVyc2lvbnMKK2h0dHBjbGllbnQudmVyc2lvbj00LjQuMQoraHR0cGNvcmUudmVyc2lvbj00LjQuMQorc2xmNGoudmVyc2lvbj0xLjcuMTIKK3NlcnZsZXQudmVyc2lvbj0yLjUKK2p1bml0LnZlcnNpb249NC4xMgorbW9ja2l0by52ZXJzaW9uPTEuOS41CmRpZmYgLS1naXQgYS9saWIvamF2YS9ncmFkbGUvYWRkaXRpb25hbEFydGlmYWN0cy5ncmFkbGUgYi9saWIvamF2YS9ncmFkbGUvYWRkaXRpb25hbEFydGlmYWN0cy5ncmFkbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAxNDY5ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL2dyYWRsZS9hZGRpdGlvbmFsQXJ0aWZhY3RzLmdyYWRsZQpAQCAtMCwwICsxLDQwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIEZvbGxvd2luZyBHcmFkbGUgYmVzdCBwcmFjdGljZXMgdG8ga2VlcCBidWlsZCBsb2dpYyBvcmdhbml6ZWQKKwordGFzayBzb3VyY2VzSmFyKHR5cGU6IEphciwgZ3JvdXA6ICdCdWlsZCcpIHsKKyAgICBkZXNjcmlwdGlvbiA9ICdBc3NlbWJsZXMgYSBqYXIgYXJjaGl2ZSBjb250YWluaW5nIHRoZSBtYWluIEphdmEgc291cmNlcy4nCisKKyAgICBjbGFzc2lmaWVyICdzb3VyY2VzJworICAgIGZyb20gc291cmNlU2V0cy5tYWluLmFsbFNvdXJjZQorfQorCit0YXNrIGphdmFkb2NKYXIodHlwZTogSmFyLCBkZXBlbmRzT246IGphdmFkb2MsIGdyb3VwOiAnQnVpbGQnKSB7CisgICAgZGVzY3JpcHRpb24gPSAnQXNzZW1ibGVzIGEgamFyIGFyY2hpdmUgY29udGFpbmluZyB0aGUgSmF2YURvYy4nCisKKyAgICBjbGFzc2lmaWVyICdqYXZhZG9jJworICAgIGZyb20gamF2YWRvYy5kZXN0aW5hdGlvbkRpcgorfQorCithcnRpZmFjdHMgeworICAgIGFyY2hpdmVzIHNvdXJjZXNKYXIKKyAgICBhcmNoaXZlcyBqYXZhZG9jSmFyCit9CisKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2dyYWRsZS9jbG92ZXJDb3ZlcmFnZS5ncmFkbGUgYi9saWIvamF2YS9ncmFkbGUvY2xvdmVyQ292ZXJhZ2UuZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZjBlNzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9ncmFkbGUvY2xvdmVyQ292ZXJhZ2UuZ3JhZGxlCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gRm9sbG93aW5nIEdyYWRsZSBiZXN0IHByYWN0aWNlcyB0byBrZWVwIGJ1aWxkIGxvZ2ljIG9yZ2FuaXplZAorCisvLyBLZWVwIHRoaXMgYXMgYW4gb3B0aW9uYWwgZmVhdHVyZSBmb3Igbm93LCBkaXNhYmxlZCBieSBkZWZhdWx0CitpZiAoQm9vbGVhbi5wYXJzZUJvb2xlYW4ocHJvamVjdC5jbG92ZXJFbmFibGVkKSkgeworICAgIGFwcGx5IHBsdWdpbjogJ2NvbS5ibXVzY2hrby5jbG92ZXInCisKKyAgICBkZXBlbmRlbmNpZXMgeworICAgICAgICBjbG92ZXIgJ29yZy5vcGVuY2xvdmVyOmNsb3Zlcjo0LjIuKycKKyAgICB9CisKKyAgICBjbG92ZXIgeworCisgICAgICAgIHRlc3RJbmNsdWRlcyA9IFsnKiovVGVzdCouamF2YSddCisgICAgICAgIC8vIEV4Y2x1ZGUgdGhlIGdlbmVyYXRlZCB0ZXN0IGNvZGUgZnJvbSBjb2RlIGNvdmVyYWdlCisgICAgICAgIHRlc3RFeGNsdWRlcyA9IFsndGhyaWZ0L3Rlc3QvVGVzdCouamF2YSddCisKKyAgICAgICAgY29tcGlsZXIgeworICAgICAgICAgICAgZW5jb2RpbmcgPSAnVVRGLTgnCisgICAgICAgICAgICBkZWJ1ZyA9IHRydWUKKyAgICAgICAgfQorCisgICAgICAgIHJlcG9ydCB7CisgICAgICAgICAgICBodG1sID0gdHJ1ZQorICAgICAgICAgICAgcGRmID0gdHJ1ZQorICAgICAgICB9CisgICAgfQorCisgICAgYnVpbGQuZGVwZW5kc09uIGNsb3ZlckdlbmVyYXRlUmVwb3J0Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9ncmFkbGUvY29kZVF1YWxpdHlDaGVja3MuZ3JhZGxlIGIvbGliL2phdmEvZ3JhZGxlL2NvZGVRdWFsaXR5Q2hlY2tzLmdyYWRsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmYxYzI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvZ3JhZGxlL2NvZGVRdWFsaXR5Q2hlY2tzLmdyYWRsZQpAQCAtMCwwICsxLDM5IEBACisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBDb25maWd1cmUgdGhlIEdyYWRsZSBjb2RlIHF1YWxpdHkgcGx1Z2lucyBoZXJlLgorLy8KKworYXBwbHkgcGx1Z2luOiAnZmluZGJ1Z3MnCisKK2ZpbmRidWdzIHsKKyAgICBpZ25vcmVGYWlsdXJlcyA9IHRydWUKKyAgICB0b29sVmVyc2lvbiA9ICczLjAuMScKKyAgICBzb3VyY2VTZXRzID0gWyBzb3VyY2VTZXRzLm1haW4gXQorICAgIGVmZm9ydCA9ICdtYXgnCisgICAgcmVwb3J0TGV2ZWwgPSAnbG93JworICAgIGV4Y2x1ZGVGaWx0ZXIgPSBmaWxlKCdjb2RlX3F1YWxpdHlfdG9vbHMvZmluZGJ1Z3MtZmlsdGVyLnhtbCcpCit9CisKK3Rhc2tzLndpdGhUeXBlKEZpbmRCdWdzKSB7CisgICAgcmVwb3J0cyB7CisgICAgICAgIHRleHQuZW5hYmxlZCA9IGZhbHNlCisgICAgICAgIGh0bWwuZW5hYmxlZCA9IHRydWUKKyAgICAgICAgeG1sLmVuYWJsZWQgPSBmYWxzZQorICAgIH0KK30KKworYXBwbHkgcGx1Z2luOiAncG1kJworCitwbWQgeworICAgIGlnbm9yZUZhaWx1cmVzID0gdHJ1ZQorICAgIHRvb2xWZXJzaW9uID0gJzYuMC4wJworICAgIHNvdXJjZVNldHMgPSBbIHNvdXJjZVNldHMubWFpbiBdCisgICAgcnVsZVNldHMgPSBbICdqYXZhLWJhc2ljJyBdCit9CisKK3Rhc2tzLndpdGhUeXBlKFBtZCkgeworICAgIHJlcG9ydHMgeworICAgICAgICBodG1sLmVuYWJsZWQgPSB0cnVlCisgICAgICAgIHhtbC5lbmFibGVkID0gZmFsc2UKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9ncmFkbGUvZW52aXJvbm1lbnQuZ3JhZGxlIGIvbGliL2phdmEvZ3JhZGxlL2Vudmlyb25tZW50LmdyYWRsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjdlYjFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvZ3JhZGxlL2Vudmlyb25tZW50LmdyYWRsZQpAQCAtMCwwICsxLDczIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIEZvbGxvd2luZyBHcmFkbGUgYmVzdCBwcmFjdGljZXMgdG8ga2VlcCBidWlsZCBsb2dpYyBvcmdhbml6ZWQKKworLy8gT3ZlcnJpZGUgdGhlIGJ1aWxkIGRpcmVjdG9yeSBpZiBDTWFrZSBpcyB1c2VkIChhbGxvd3MgZm9yIG91dC1vZi10cmVlLWJ1aWxkcykKK2lmIChoYXNQcm9wZXJ0eSgnYnVpbGQuZGlyJykpIHsKKyAgICBidWlsZERpciA9IGZpbGUocHJvcGVydHkoJ2J1aWxkLmRpcicpKQorfQorCisvLyBJbiBvcmRlciB0byByZW1haW4gY29tcGF0aWJsZSB3aXRoIG90aGVyIEFudCBiYXNlZCBidWlsZHMgaW4gdGhlIHN5c3RlbQorLy8gd2UgY29udmVydCB0aGUgZ3JhZGxlLnByb3BlcnRpZXMgaW50byBEU0wgZnJpZW5kbHkgY2FtZWxDYXNlZCBwcm9wZXJ0aWVzCitleHQuaW5zdGFsbFBhdGggPSBwcm9wZXJ0eSgnaW5zdGFsbC5wYXRoJykKK2V4dC5pbnN0YWxsSmF2YWRvY1BhdGggPSBwcm9wZXJ0eSgnaW5zdGFsbC5qYXZhZG9jLnBhdGgnKQorCitleHQudGhyaWZ0Um9vdCA9IGZpbGUoJy4uLy4uJykKKworaWYgKGhhc1Byb3BlcnR5KCd0aHJpZnQuY29tcGlsZXInKSkgeworICAgIGV4dC50aHJpZnRDb21waWxlciA9IHByb3BlcnR5KCd0aHJpZnQuY29tcGlsZXInKQorfSBlbHNlIHsKKyAgICBleHQudGhyaWZ0Q29tcGlsZXIgPSAiJHRocmlmdFJvb3QvY29tcGlsZXIvY3BwL3RocmlmdCIKK30KKworZXh0Lm12blJlcG8gPSBwcm9wZXJ0eSgnbXZuLnJlcG8nKQorZXh0LmFwYWNoZVJlcG8gPSBwcm9wZXJ0eSgnYXBhY2hlLnJlcG8nKQorZXh0Lm1hdmVuUmVwb3NpdG9yeVVybCA9IHByb3BlcnR5KCdtYXZlbi1yZXBvc2l0b3J5LXVybCcpCisKKy8vIFZlcnNpb25zIHVzZWQgaW4gdGhpcyBwcm9qZWN0CitleHQuaHR0cGNsaWVudFZlcnNpb24gPSBwcm9wZXJ0eSgnaHR0cGNsaWVudC52ZXJzaW9uJykKK2V4dC5odHRwY29yZVZlcnNpb24gPSBwcm9wZXJ0eSgnaHR0cGNvcmUudmVyc2lvbicpCitleHQuc2VydmxldFZlcnNpb24gPSBwcm9wZXJ0eSgnc2VydmxldC52ZXJzaW9uJykKK2V4dC5zbGY0alZlcnNpb24gPSBwcm9wZXJ0eSgnc2xmNGoudmVyc2lvbicpCitleHQuanVuaXRWZXJzaW9uID0gcHJvcGVydHkoJ2p1bml0LnZlcnNpb24nKQorZXh0Lm1vY2tpdG9WZXJzaW9uID0gcHJvcGVydHkoJ21vY2tpdG8udmVyc2lvbicpCisKKy8vIEluIHRoaXMgc2VjdGlvbiB5b3UgZGVjbGFyZSB3aGVyZSB0byBmaW5kIHRoZSBkZXBlbmRlbmNpZXMgb2YgeW91ciBwcm9qZWN0CityZXBvc2l0b3JpZXMgeworICAgIG1hdmVuIHsKKyAgICAgICAgbmFtZSAnTWF2ZW4gQ2VudHJhbCBSZXBvc2l0b3J5JworICAgICAgICB1cmwgbXZuUmVwbworICAgIH0KKyAgICBtYXZlbiB7CisgICAgICAgIG5hbWUgJ0FwYWNoZSBNYXZlbiBSZXBvc2l0b3J5JworICAgICAgICB1cmwgYXBhY2hlUmVwbworICAgIH0KK30KKworZGVwZW5kZW5jaWVzIHsKKyAgICBjb21waWxlICJvcmcuc2xmNGo6c2xmNGotYXBpOiR7c2xmNGpWZXJzaW9ufSIKKyAgICBjb21waWxlICJvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzOmh0dHBjbGllbnQ6JHtodHRwY2xpZW50VmVyc2lvbn0iCisgICAgY29tcGlsZSAib3JnLmFwYWNoZS5odHRwY29tcG9uZW50czpodHRwY29yZToke2h0dHBjb3JlVmVyc2lvbn0iCisgICAgY29tcGlsZSAiamF2YXguc2VydmxldDpzZXJ2bGV0LWFwaToke3NlcnZsZXRWZXJzaW9ufSIKKworICAgIHRlc3RDb21waWxlICJqdW5pdDpqdW5pdDoke2p1bml0VmVyc2lvbn0iCisgICAgdGVzdENvbXBpbGUgIm9yZy5tb2NraXRvOm1vY2tpdG8tYWxsOiR7bW9ja2l0b1ZlcnNpb259IgorICAgIHRlc3RSdW50aW1lICJvcmcuc2xmNGo6c2xmNGotbG9nNGoxMjoke3NsZjRqVmVyc2lvbn0iCit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9ncmFkbGUvZnVuY3Rpb25hbFRlc3RzLmdyYWRsZSBiL2xpYi9qYXZhL2dyYWRsZS9mdW5jdGlvbmFsVGVzdHMuZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MjBkMTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9ncmFkbGUvZnVuY3Rpb25hbFRlc3RzLmdyYWRsZQpAQCAtMCwwICsxLDE1NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBGb2xsb3dpbmcgR3JhZGxlIGJlc3QgcHJhY3RpY2VzIHRvIGtlZXAgYnVpbGQgbG9naWMgb3JnYW5pemVkCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZ1bmN0aW9uYWwgdGVzdGluZyBoYXJuZXNzIGNyZWF0aW9uLiBUaGlzIGhlbHBzIHJ1biB0aGUgY3Jvc3MtY2hlY2sgdGVzdHMuCisvLyBUaGUgTWFrZWZpbGUgcHJlY3Jvc3MgdGFyZ2V0IGludm9rZXMgdGhlIHNoYWRvd0phciB0YXNrIGFuZCB0aGUgdGVzdHMuanNvbgorLy8gY29kZSBpcyBjaGFuZ2VkIHRvIGNhbGwgcnVuY2xpZW50IG9yIHJ1bnNlcnZlciBhcyBuZWVkZWQuCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENyb3NzIFRlc3Qgc291cmNlcyBhcmUgc2VwYXJhdGVkIGluIHRoZWlyIG93biBzb3VyY2VTZXQKKy8vCitzb3VyY2VTZXRzIHsKKyAgICBjcm9zc1Rlc3QgeworICAgICAgICBqYXZhIHsKKyAgICAgICAgICAgIHNyY0RpciAndGVzdCcKKyAgICAgICAgICAgIGluY2x1ZGUgJyoqL3Rlc3QvVGVzdENsaWVudC5qYXZhJworICAgICAgICAgICAgaW5jbHVkZSAnKiovdGVzdC9UZXN0U2VydmVyLmphdmEnCisgICAgICAgICAgICBpbmNsdWRlICcqKi90ZXN0L1Rlc3ROb25ibG9ja2luZ1NlcnZlci5qYXZhJworICAgICAgICB9CisgICAgfQorfQorCitjb25maWd1cmF0aW9ucyB7CisgICAgY3Jvc3NUZXN0Q29tcGlsZSB7IGV4dGVuZHNGcm9tIHRlc3RDb21waWxlIH0KKyAgICBjcm9zc1Rlc3RSdW50aW1lIHsgZXh0ZW5kc0Zyb20gY3Jvc3NUZXN0Q29tcGlsZSwgdGVzdFJ1bnRpbWUgfQorfQorCitkZXBlbmRlbmNpZXMgeworICAgIGNyb3NzVGVzdENvbXBpbGUgc291cmNlU2V0cy5tYWluLm91dHB1dAorICAgIGNyb3NzVGVzdENvbXBpbGUgc291cmNlU2V0cy50ZXN0Lm91dHB1dAorfQorCisvLyBJIGFtIHVzaW5nIHNoYWRvdyBwbHVnaW4gdG8gbWFrZSBhIHNlbGYgY29udGFpbmVkIGZ1bmN0aW9uYWwgdGVzdCBVYmVyIEpBUiB0aGF0CisvLyBlbGltaW5hdGVzIHN0YXJ0dXAgcHJvYmxlbXMgd2l0aCB3cmFwcGluZyB0aGUgY3Jvc3MtY2hlY2sgaGFybmVzcyBpbiBHcmFkbGUuCisvLyBUaGlzIGlzIHVzZWQgYnkgdGhlIHJ1bm5lciBzY3JpcHRzIGFzIHRoZSBzaW5nbGUgY2xhc3NwYXRoIGVudHJ5IHdoaWNoCisvLyBhbGxvd3MgdGhlIHByb2Nlc3MgdG8gYmUgYXMgbGlnaHR3ZWlnaHQgYXMgaXQgY2FuLgorc2hhZG93SmFyIHsKKyAgICBkZXNjcmlwdGlvbiA9ICdBc3NlbWJsZSBhIHRlc3QgSkFSIGZpbGUgZm9yIGNyb3NzLWNoZWNrIGV4ZWN1dGlvbicKKyAgICAvLyBtYWtlIHN1cmUgdGhlIHJ1bm5lcnMgYXJlIGNyZWF0ZWQgd2hlbiB0aGlzIHJ1bnMKKyAgICBkZXBlbmRzT24gJ2dlbmVyYXRlUnVubmVyU2NyaXB0Rm9yQ2xpZW50JywgJ2dlbmVyYXRlUnVubmVyU2NyaXB0Rm9yU2VydmVyJywgJ2dlbmVyYXRlUnVubmVyU2NyaXB0Rm9yTm9uYmxvY2tpbmdTZXJ2ZXInCisKKyAgICBiYXNlTmFtZSA9ICdmdW5jdGlvbmFsVGVzdCcKKyAgICBkZXN0aW5hdGlvbkRpciA9IGZpbGUoIiRidWlsZERpci9mdW5jdGlvbmFsVGVzdEphciIpCisgICAgY2xhc3NpZmllciA9IG51bGwKKworICAgIC8vIFdlIGRvIG5vdCBuZWVkIGEgdmVyc2lvbiBudW1iZXIgZm9yIHRoaXMgaW50ZXJuYWwgamFyCisgICAgdmVyc2lvbiA9IG51bGwKKworICAgIC8vIEJ1bmRsZSB0aGUgY29tcGxldGUgc2V0IG9mIHVuaXQgdGVzdCBjbGFzc2VzIGluY2x1ZGluZyBnZW5lcmF0ZWQgY29kZQorICAgIC8vIGFuZCB0aGUgcnVudGltZSBkZXBlbmRlbmNpZXMgaW4gb25lIEpBUiB0byBleHBlZGl0ZSBleGVjdXRpb24uCisgICAgZnJvbSBzb3VyY2VTZXRzLnRlc3Qub3V0cHV0CisgICAgZnJvbSBzb3VyY2VTZXRzLmNyb3NzVGVzdC5vdXRwdXQKKyAgICBjb25maWd1cmF0aW9ucyA9IFtwcm9qZWN0LmNvbmZpZ3VyYXRpb25zLnRlc3RSdW50aW1lXQorfQorCisvLyBDb21tb24gc2NyaXB0IHJ1bm5lciBjb25maWd1cmF0aW9uIGVsZW1lbnRzCitkZWYgc2NyaXB0RXh0ID0gJycKK2RlZiBleGVjRXh0ID0gJycKK2RlZiBzY3JpcHRIZWFkID0gJyMhL2Jpbi9iYXNoJworZGVmIGFyZ3MgPSAnJConCisKKy8vIEFsdGhvdWdoIHRoaXMgaXMgbWFya2VkIGludGVybmFsIGl0IGlzIGFuIGF2YWlsYWJsZSBhbmQgc3RhYmxlIGludGVyZmFjZQoraWYgKG9yZy5ncmFkbGUuaW50ZXJuYWwub3MuT3BlcmF0aW5nU3lzdGVtLmN1cnJlbnQoKS53aW5kb3dzKSB7CisgICAgc2NyaXB0RXh0ID0gJy5iYXQnCisgICAgZXhlY0V4dCA9ICcuZXhlJworICAgIHNjcmlwdEhlYWQgPSAnQGVjaG8gb2ZmJworICAgIGFyZ3MgPSAnJSonCit9CisKKy8vIFRoZSBKYXZhIGV4ZWN1dGFibGUgdG8gdXNlIHdpdGggdGhlIHJ1bm5lciBzY3JpcHRzCitkZWYgamF2YUV4ZSA9IGZpbGUoIiR7U3lzdGVtLmdldFByb3BlcnR5KCdqYXZhLmhvbWUnKX0vYmluL2phdmEke2V4ZWNFeHR9IikuY2Fub25pY2FsUGF0aAorLy8gVGhlIGNvbW1vbiBVYmVyIGphciBwYXRoCitkZWYgamFyUGF0aCA9IHNoYWRvd0phci5hcmNoaXZlUGF0aC5jYW5vbmljYWxQYXRoCitkZWYgdHJ1c3RTdG9yZSA9IGZpbGUoJ3Rlc3QvLnRydXN0c3RvcmUnKS5jYW5vbmljYWxQYXRoCitkZWYga2V5U3RvcmUgPSBmaWxlKCd0ZXN0Ly5rZXlzdG9yZScpLmNhbm9uaWNhbFBhdGgKKwordGFzayBnZW5lcmF0ZVJ1bm5lclNjcmlwdEZvckNsaWVudChncm91cDogJ0J1aWxkJykgeworICAgIGRlc2NyaXB0aW9uID0gJ0dlbmVyYXRlIGEgcnVubmVyIHNjcmlwdCBmb3IgY3Jvc3MtY2hlY2sgdGVzdHMgd2l0aCBUZXN0Q2xpZW50JworCisgICAgZGVmIGNsaWVudEZpbGUgPSBmaWxlKCIkYnVpbGREaXIvcnVuY2xpZW50JHtzY3JpcHRFeHR9IikKKworICAgIGRlZiBydW5DbGllbnRUZXh0ID0gIiIiXAorJHtzY3JpcHRIZWFkfQorCisiJHtqYXZhRXhlfSIgLWNwICIkamFyUGF0aCIgIi1EamF2YXgubmV0LnNzbC50cnVzdFN0b3JlPSR0cnVzdFN0b3JlIiAtRGphdmF4Lm5ldC5zc2wudHJ1c3RTdG9yZVBhc3N3b3JkPXRocmlmdCBvcmcuYXBhY2hlLnRocmlmdC50ZXN0LlRlc3RDbGllbnQgJGFyZ3MKKyIiIgorICAgIGlucHV0cy5wcm9wZXJ0eSAncnVuQ2xpZW50VGV4dCcsIHJ1bkNsaWVudFRleHQKKyAgICBvdXRwdXRzLmZpbGUgY2xpZW50RmlsZQorCisgICAgZG9MYXN0IHsKKyAgICAgICAgY2xpZW50RmlsZS5wYXJlbnRGaWxlLm1rZGlycygpCisgICAgICAgIGNsaWVudEZpbGUudGV4dCA9IHJ1bkNsaWVudFRleHQKKyAgICAgICAgY2xpZW50RmlsZS5zZXRFeGVjdXRhYmxlKHRydWUsIGZhbHNlKQorICAgIH0KK30KKwordGFzayBnZW5lcmF0ZVJ1bm5lclNjcmlwdEZvclNlcnZlcihncm91cDogJ0J1aWxkJykgeworICAgIGRlc2NyaXB0aW9uID0gJ0dlbmVyYXRlIGEgcnVubmVyIHNjcmlwdCBmb3IgY3Jvc3MtY2hlY2sgdGVzdHMgd2l0aCBUZXN0U2VydmVyJworCisgICAgZGVmIHNlcnZlckZpbGUgPSBmaWxlKCIkYnVpbGREaXIvcnVuc2VydmVyJHtzY3JpcHRFeHR9IikKKworICAgIGRlZiBydW5TZXJ2ZXJUZXh0ID0gIiIiXAorJHtzY3JpcHRIZWFkfQorCisiJHtqYXZhRXhlfSIgLWNwICIkamFyUGF0aCIgIi1EamF2YXgubmV0LnNzbC5rZXlTdG9yZT0ka2V5U3RvcmUiIC1EamF2YXgubmV0LnNzbC5rZXlTdG9yZVBhc3N3b3JkPXRocmlmdCBvcmcuYXBhY2hlLnRocmlmdC50ZXN0LlRlc3RTZXJ2ZXIgJGFyZ3MKKyIiIgorCisgICAgaW5wdXRzLnByb3BlcnR5ICdydW5TZXJ2ZXJUZXh0JywgcnVuU2VydmVyVGV4dAorICAgIG91dHB1dHMuZmlsZSBzZXJ2ZXJGaWxlCisKKyAgICBkb0xhc3QgeworICAgICAgICBzZXJ2ZXJGaWxlLnBhcmVudEZpbGUubWtkaXJzKCkKKyAgICAgICAgc2VydmVyRmlsZS50ZXh0ID0gcnVuU2VydmVyVGV4dAorICAgICAgICBzZXJ2ZXJGaWxlLnNldEV4ZWN1dGFibGUodHJ1ZSwgZmFsc2UpCisgICAgfQorfQorCit0YXNrIGdlbmVyYXRlUnVubmVyU2NyaXB0Rm9yTm9uYmxvY2tpbmdTZXJ2ZXIoZ3JvdXA6ICdCdWlsZCcpIHsKKyAgICBkZXNjcmlwdGlvbiA9ICdHZW5lcmF0ZSBhIHJ1bm5lciBzY3JpcHQgZm9yIGNyb3NzLWNoZWNrIHRlc3RzIHdpdGggVGVzdE5vbmJsb2NraW5nU2VydmVyJworCisgICAgZGVmIHNlcnZlckZpbGUgPSBmaWxlKCIkYnVpbGREaXIvcnVubm9uYmxvY2tpbmdzZXJ2ZXIke3NjcmlwdEV4dH0iKQorCisgICAgZGVmIHJ1blNlcnZlclRleHQgPSAiIiJcCiske3NjcmlwdEhlYWR9CisKKyIke2phdmFFeGV9IiAtY3AgIiRqYXJQYXRoIiAiLURqYXZheC5uZXQuc3NsLmtleVN0b3JlPSRrZXlTdG9yZSIgLURqYXZheC5uZXQuc3NsLmtleVN0b3JlUGFzc3dvcmQ9dGhyaWZ0IG9yZy5hcGFjaGUudGhyaWZ0LnRlc3QuVGVzdE5vbmJsb2NraW5nU2VydmVyICRhcmdzCisiIiIKKworICAgIGlucHV0cy5wcm9wZXJ0eSAncnVuU2VydmVyVGV4dCcsIHJ1blNlcnZlclRleHQKKyAgICBvdXRwdXRzLmZpbGUgc2VydmVyRmlsZQorCisgICAgZG9MYXN0IHsKKyAgICAgICAgc2VydmVyRmlsZS5wYXJlbnRGaWxlLm1rZGlycygpCisgICAgICAgIHNlcnZlckZpbGUudGV4dCA9IHJ1blNlcnZlclRleHQKKyAgICAgICAgc2VydmVyRmlsZS5zZXRFeGVjdXRhYmxlKHRydWUsIGZhbHNlKQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2dyYWRsZS9nZW5lcmF0ZVRlc3RUaHJpZnQuZ3JhZGxlIGIvbGliL2phdmEvZ3JhZGxlL2dlbmVyYXRlVGVzdFRocmlmdC5ncmFkbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI1MzczOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL2dyYWRsZS9nZW5lcmF0ZVRlc3RUaHJpZnQuZ3JhZGxlCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIEZvbGxvd2luZyBHcmFkbGUgYmVzdCBwcmFjdGljZXMgdG8ga2VlcCBidWlsZCBsb2dpYyBvcmdhbml6ZWQKKworLy8gR2VuZXJhdGVkIGNvZGUgbG9jYXRpb25zIGZvciBVbml0IHRlc3RzCitleHQuZ2VuU3JjID0gZmlsZSgiJGJ1aWxkRGlyL2dlbi1qYXZhIikKK2V4dC5nZW5CZWFuU3JjID0gZmlsZSgiJGJ1aWxkRGlyL2dlbi1qYXZhYmVhbiIpCitleHQuZ2VuUmV1c2VTcmMgPSBmaWxlKCIkYnVpbGREaXIvZ2VuLWphdmFyZXVzZSIpCitleHQuZ2VuRnVsbENhbWVsU3JjID0gZmlsZSgiJGJ1aWxkRGlyL2dlbi1mdWxsY2FtZWwiKQorZXh0LmdlblVuc2FmZVNyYyA9IGZpbGUoIiRidWlsZERpci9nZW4tdW5zYWZlIikKKworLy8gQWRkIHRoZSBnZW5lcmF0ZWQgY29kZSBkaXJlY3RvcmllcyB0byB0aGUgdGVzdCBzb3VyY2Ugc2V0Citzb3VyY2VTZXRzIHsKKyAgICB0ZXN0LmphdmEuc3JjRGlycyBnZW5TcmMsIGdlbkJlYW5TcmMsIGdlblJldXNlU3JjLCBnZW5GdWxsQ2FtZWxTcmMsIGdlblVuc2FmZVNyYworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb2RlIGdlbmVyYXRpb24gZm9yIFVuaXQgVGVzdGluZworCisvLyBBIGNhbGxhYmxlIGNsb3N1cmUgdG8gbWFrZSB0aGlzIGVhc2llcgorZXh0LnRocmlmdENvbXBpbGUgPSB7IFRhc2sgdGFzaywgU3RyaW5nIHRocmlmdEZpbGVOYW1lLCBTdHJpbmcgZ2VuZXJhdG9yID0gJ2phdmEnLCBGaWxlIG91dHB1dERpciA9IGdlblNyYyAtPgorICAgIGRlZiB0aHJpZnRGaWxlID0gZmlsZSgiJHRocmlmdFJvb3QvdGVzdC8kdGhyaWZ0RmlsZU5hbWUiKQorICAgIGFzc2VydCB0aHJpZnRGaWxlLmV4aXN0cygpCisKKyAgICB0YXNrLmlucHV0cy5maWxlIHRocmlmdEZpbGUKKyAgICB0YXNrLm91dHB1dHMuZGlyIG91dHB1dERpcgorCisgICAgdGFzay5kb0xhc3QgeworICAgICAgICBvdXRwdXREaXIubWtkaXJzKCkKKyAgICAgICAgZGVmIHJlc3VsdCA9IGV4ZWMgeworICAgICAgICAgICAgZXhlY3V0YWJsZSBmaWxlKHRocmlmdENvbXBpbGVyKQorICAgICAgICAgICAgYXJncyAnLS1nZW4nLCBnZW5lcmF0b3IKKyAgICAgICAgICAgIGFyZ3MgJy1vdXQnLCBvdXRwdXREaXIKKyAgICAgICAgICAgIGFyZ3MgdGhyaWZ0RmlsZQorICAgICAgICAgICAgc3RhbmRhcmRPdXRwdXQgPSB0YXNrLm91dHB1dEJ1ZmZlcgorICAgICAgICAgICAgZXJyb3JPdXRwdXQgPSB0YXNrLm91dHB1dEJ1ZmZlcgorICAgICAgICAgICAgaWdub3JlRXhpdFZhbHVlID0gdHJ1ZQorICAgICAgICB9CisgICAgICAgIGlmIChyZXN1bHQuZXhpdFZhbHVlICE9IDApIHsKKyAgICAgICAgICAgIC8vIE9ubHkgc2hvdyB0aGUgVGhyaWZ0IGNvbXBpbGVyIG91dHB1dCBvbiBmYWlsdXJlcywgY3V0cyBkb3duIG9uIG5vaXNlIQorICAgICAgICAgICAgcHJpbnRsbiB0YXNrLm91dHB1dEJ1ZmZlci50b1N0cmluZygpCisgICAgICAgICAgICByZXN1bHQucmV0aHJvd0ZhaWx1cmUoKQorICAgICAgICB9CisgICAgfQorfQorCit0YXNrIGdlbmVyYXRlKGdyb3VwOiAnQnVpbGQnKSB7CisgICAgZGVzY3JpcHRpb24gPSAnR2VuZXJhdGUgYWxsIHVuaXQgdGVzdCBUaHJpZnQgc291cmNlcycKKyAgICBjb21waWxlVGVzdEphdmEuZGVwZW5kc09uIGl0Cit9CisKK3Rhc2sgZ2VuZXJhdGVKYXZhKGdyb3VwOiAnQnVpbGQnKSB7CisgICAgZGVzY3JpcHRpb24gPSAnR2VuZXJhdGUgdGhlIHRocmlmdCBnZW4tamF2YSBzb3VyY2UnCisgICAgZ2VuZXJhdGUuZGVwZW5kc09uIGl0CisKKyAgICBleHQub3V0cHV0QnVmZmVyID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpCisKKyAgICB0aHJpZnRDb21waWxlKGl0LCAnVGhyaWZ0VGVzdC50aHJpZnQnKQorICAgIHRocmlmdENvbXBpbGUoaXQsICdKYXZhVHlwZXMudGhyaWZ0JykKKyAgICB0aHJpZnRDb21waWxlKGl0LCAnRGVidWdQcm90b1Rlc3QudGhyaWZ0JykKKyAgICB0aHJpZnRDb21waWxlKGl0LCAnRG91YmxlQ29uc3RhbnRzVGVzdC50aHJpZnQnKQorICAgIHRocmlmdENvbXBpbGUoaXQsICdPcHRpb25hbFJlcXVpcmVkVGVzdC50aHJpZnQnKQorICAgIHRocmlmdENvbXBpbGUoaXQsICdNYW55T3B0aW9uYWxzLnRocmlmdCcpCisgICAgdGhyaWZ0Q29tcGlsZShpdCwgJ0phdmFEZWVwQ29weVRlc3QudGhyaWZ0JykKKyAgICB0aHJpZnRDb21waWxlKGl0LCAnRW51bUNvbnRhaW5lcnNUZXN0LnRocmlmdCcpCit9CisKK3Rhc2sgZ2VuZXJhdGVCZWFuSmF2YShncm91cDogJ0J1aWxkJykgeworICAgIGRlc2NyaXB0aW9uID0gJ0dlbmVyYXRlIHRoZSB0aHJpZnQgZ2VuLWphdmFiZWFuIHNvdXJjZScKKyAgICBnZW5lcmF0ZS5kZXBlbmRzT24gaXQKKworICAgIGV4dC5vdXRwdXRCdWZmZXIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkKKworICAgIHRocmlmdENvbXBpbGUoaXQsICdKYXZhQmVhbnNUZXN0LnRocmlmdCcsICdqYXZhOmJlYW5zLG5vY2FtZWwnLCBnZW5CZWFuU3JjKQorfQorCit0YXNrIGdlbmVyYXRlUmV1c2VKYXZhKGdyb3VwOiAnQnVpbGQnKSB7CisgICAgZGVzY3JpcHRpb24gPSAnR2VuZXJhdGUgdGhlIHRocmlmdCBnZW4tamF2YXJldXNlIHNvdXJjZScKKyAgICBnZW5lcmF0ZS5kZXBlbmRzT24gaXQKKworICAgIGV4dC5vdXRwdXRCdWZmZXIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkKKworICAgIHRocmlmdENvbXBpbGUoaXQsICdGdWxsQ2FtZWxUZXN0LnRocmlmdCcsICdqYXZhOmZ1bGxjYW1lbCcsIGdlbkZ1bGxDYW1lbFNyYykKK30KKwordGFzayBnZW5lcmF0ZUZ1bGxDYW1lbEphdmEoZ3JvdXA6ICdCdWlsZCcpIHsKKyAgICBkZXNjcmlwdGlvbiA9ICdHZW5lcmF0ZSB0aGUgdGhyaWZ0IGdlbi1mdWxsY2FtZWwgc291cmNlJworICAgIGdlbmVyYXRlLmRlcGVuZHNPbiBpdAorCisgICAgZXh0Lm91dHB1dEJ1ZmZlciA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKQorCisgICAgdGhyaWZ0Q29tcGlsZShpdCwgJ1JldXNlT2JqZWN0cy50aHJpZnQnLCAnamF2YTpyZXVzZS1vYmplY3RzJywgZ2VuUmV1c2VTcmMpCit9CisKK3Rhc2sgZ2VuZXJhdGVVbnNhZmVCaW5hcmllc0phdmEoZ3JvdXA6ICdCdWlsZCcpIHsKKyAgICBkZXNjcmlwdGlvbiA9ICdHZW5lcmF0ZSB0aGUgdGhyaWZ0IGdlbi11bnNhZmViaW5hcmllcyBzb3VyY2UnCisgICAgZ2VuZXJhdGUuZGVwZW5kc09uIGl0CisKKyAgICBleHQub3V0cHV0QnVmZmVyID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpCisKKyAgICB0aHJpZnRDb21waWxlKGl0LCAnVW5zYWZlVHlwZXMudGhyaWZ0JywgJ2phdmE6dW5zYWZlX2JpbmFyaWVzJywgZ2VuVW5zYWZlU3JjKQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvZ3JhZGxlL3B1Ymxpc2hpbmcuZ3JhZGxlIGIvbGliL2phdmEvZ3JhZGxlL3B1Ymxpc2hpbmcuZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMDQwNDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9ncmFkbGUvcHVibGlzaGluZy5ncmFkbGUKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gRm9sbG93aW5nIEdyYWRsZSBiZXN0IHByYWN0aWNlcyB0byBrZWVwIGJ1aWxkIGxvZ2ljIG9yZ2FuaXplZAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbnN0YWxsYXRpb24gc3VidGFza3MsIG5vdCB1c2VkIGN1cnJlbnRseSwgd2UgdXNlICJtYWtlIGluc3RhbGwvZmFzdCIKK3Rhc2sgaW5zdGFsbERpc3QodHlwZTogQ29weSwgZ3JvdXA6ICdJbnN0YWxsJykgeworICAgIGRlc2NyaXB0aW9uID0gIkNvcHkgVGhyaWZ0IEpBUiBhbmQgZGVwZW5kZW5jaWVzIGludG8gJGluc3RhbGxQYXRoIGxvY2F0aW9uIgorCisgICAgZGVzdGluYXRpb25EaXIgPSBmaWxlKGluc3RhbGxQYXRoKQorCisgICAgZnJvbSBqYXIKKyAgICBmcm9tIGNvbmZpZ3VyYXRpb25zLmNvbXBpbGUKK30KKwordGFzayBpbnN0YWxsSmF2YWRvYyh0eXBlOiBDb3B5LCBncm91cDogJ0luc3RhbGwnLCBkZXBlbmRzT246IGphdmFkb2MpIHsKKyAgICBkZXNjcmlwdGlvbiA9ICJJbnN0YWxsIFRocmlmdCBKYXZhRG9jIGludG8gJGluc3RhbGxKYXZhZG9jUGF0aCBsb2NhdGlvbiIKKworICAgIGRlc3RpbmF0aW9uRGlyID0gZmlsZShpbnN0YWxsSmF2YWRvY1BhdGgpCisKKyAgICBmcm9tIGphdmFkb2MuZGVzdGluYXRpb25EaXIKK30KKworLy8gVGhpcyBpcyBub3QgbmVlZGVkIGJ5IEdyYWRsZSBidWlsZHMgYnV0IHRoZSByZW1haW5pbmcgQW50IGJ1aWxkcyBzZWVtIHRvCisvLyBuZWVkIGFjY2VzcyB0byB0aGUgZ2VuZXJhdGVkIHRlc3QgY2xhc3NlcyBmb3IgVGhyaWZ0IHVuaXQgdGVzdHMgc28gd2UKKy8vIGFzc2lzdCB0aGVtIHRvIHVzZSBpdCB0aGlzIHdheS4KK3Rhc2sgY29weURlcGVuZGVuY2llcyh0eXBlOiBDb3B5LCBncm91cDogJ0J1aWxkJykgeworICAgIGRlc2NyaXB0aW9uID0gJ0NvcHkgcnVudGltZSBkZXBlbmRlbmNpZXMgaW4gYSBjb21tb24gbG9jYXRpb24gZm9yIG90aGVyIEFudCBiYXNlZCBwcm9qZWN0cycKKyAgICBwcm9qZWN0LmFzc2VtYmxlLmRlcGVuZHNPbiBpdAorCisgICAgZGVzdGluYXRpb25EaXIgPSBmaWxlKCIkYnVpbGREaXIvZGVwcyIpCisgICAgZnJvbSBjb25maWd1cmF0aW9ucy50ZXN0UnVudGltZQorICAgIC8vIGV4Y2x1ZGUgc29tZSB2ZXJ5IHNwZWNpZmljIHVuaXQgdGVzdCBkZXBlbmRlbmNpZXMKKyAgICBleGNsdWRlICcqKi9qdW5pdCouamFyJywgJyoqL21vY2tpdG8qLmphcicsICcqKi9oYW1jcmVzdCouamFyJworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBbGxvdyB0aGlzIGNvbmZpZ3VyYXRpb24gdG8gYmUgc2hhcmVkIGJldHdlZW4gaW5zdGFsbCBhbmQgdXBsb2FkQXJjaGl2ZXMgdGFza3MKK2RlZiBjb25maWd1cmVQb20ocG9tKSB7CisgICAgcG9tLnByb2plY3QgeworICAgICAgICBuYW1lICdBcGFjaGUgVGhyaWZ0JworICAgICAgICBkZXNjcmlwdGlvbiAnVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcyBkZXZlbG9wbWVudC4nCisgICAgICAgIHBhY2thZ2luZyAnamFyJworICAgICAgICB1cmwgJ2h0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZycKKworICAgICAgICBzY20geworICAgICAgICAgICAgdXJsICdodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC5naXQnCisgICAgICAgICAgICBjb25uZWN0aW9uICdzY206Z2l0Omh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0LmdpdCcKKyAgICAgICAgICAgIGRldmVsb3BlckNvbm5lY3Rpb24gJ3NjbTpnaXQ6aHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQuZ2l0JworICAgICAgICB9CisKKyAgICAgICAgbGljZW5zZXMgeworICAgICAgICAgICAgbGljZW5zZSB7CisgICAgICAgICAgICAgICAgbmFtZSAnVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCcKKyAgICAgICAgICAgICAgICB1cmwgIiR7cHJvamVjdC5saWNlbnNlfSIKKyAgICAgICAgICAgICAgICBkaXN0cmlidXRpb24gJ3JlcG8nCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBkZXZlbG9wZXJzIHsKKyAgICAgICAgICAgIGRldmVsb3BlciB7CisgICAgICAgICAgICAgICAgaWQgJ2RldicKKyAgICAgICAgICAgICAgICBuYW1lICdBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMnCisgICAgICAgICAgICAgICAgZW1haWwgJ2RldkB0aHJpZnQuYXBhY2hlLm9yZycKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHBvbS53aGVuQ29uZmlndXJlZCB7CisgICAgICAgIC8vIEZpeHVwIHRoZSBzY29wZSBmb3Igc2VydmxldC1hcGkgdG8gYmUgJ3Byb3ZpZGVkJyBpbnN0ZWFkIG9mICdjb21waWxlJworICAgICAgICBkZXBlbmRlbmNpZXMuZmluZCB7IGRlcCAtPiBkZXAuZ3JvdXBJZCA9PSAnamF2YXguc2VydmxldCcgJiYgZGVwLmFydGlmYWN0SWQgPT0gJ3NlcnZsZXQtYXBpJyB9LndpdGggeworICAgICAgICAgICAgLy8gaXQub3B0aW9uYWwgPSB0cnVlCisgICAgICAgICAgICBpdC5zY29wZSA9ICdwcm92aWRlZCcKKyAgICAgICAgfQorICAgIH0KK30KKworaW5zdGFsbCB7CisgICAgcmVwb3NpdG9yaWVzLm1hdmVuSW5zdGFsbGVyIHsKKyAgICAgICAgY29uZmlndXJlUG9tKHBvbSkKKyAgICB9Cit9CisKK3VwbG9hZEFyY2hpdmVzIHsKKyAgICBkZXBlbmRzT24gdGVzdCAvLyBtYWtlIHN1cmUgd2UgcnVuIHVuaXQgdGVzdHMgd2hlbiBwdWJsaXNoaW5nCisgICAgcmVwb3NpdG9yaWVzLm1hdmVuRGVwbG95ZXIgeworICAgICAgICAvLyBzaWduUG9tIHdpbGwgc2lsZW50bHkgZG8gbm90aGluZyB3aGVuIG5vIHNpZ25pbmcgaW5mb3JtYXRpb24gaXMgcHJvdmlkZWQKKyAgICAgICAgYmVmb3JlRGVwbG95bWVudCB7IE1hdmVuRGVwbG95bWVudCBkZXBsb3ltZW50IC0+IHNpZ25pbmcuc2lnblBvbShkZXBsb3ltZW50KSB9CisgICAgICAgIHJlcG9zaXRvcnkodXJsOiBwcm9qZWN0Lm1hdmVuUmVwb3NpdG9yeVVybCkgeworICAgICAgICAgICAgaWYgKHByb2plY3QuaGFzUHJvcGVydHkoJ21hdmVuVXNlcicpICYmIHByb2plY3QuaGFzUHJvcGVydHkoJ21hdmVuUGFzc3dvcmQnKSkgeworICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uKHVzZXJOYW1lOiBtYXZlblVzZXIsIHBhc3N3b3JkOiBtYXZlblBhc3N3b3JkKQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbmZpZ3VyZVBvbShwb20pCisgICAgfQorfQorCisvLyBTaWduaW5nIGNvbmZpZ3VyYXRpb24sIG9wdGlvbmFsLCBvbmx5IHdoZW4gcmVsZWFzZSBhbmQgdXBsb2FkQXJjaGl2ZXMgaXMgYWN0aXZhdGVkCitzaWduaW5nIHsKKyAgICByZXF1aXJlZCB7ICF2ZXJzaW9uLmVuZHNXaXRoKCJTTkFQU0hPVCIpICYmIGdyYWRsZS50YXNrR3JhcGguaGFzVGFzaygidXBsb2FkQXJjaGl2ZXMiKSB9CisgICAgc2lnbiBjb25maWd1cmF0aW9ucy5hcmNoaXZlcworfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvZ3JhZGxlL3NvdXJjZUNvbmZpZ3VyYXRpb24uZ3JhZGxlIGIvbGliL2phdmEvZ3JhZGxlL3NvdXJjZUNvbmZpZ3VyYXRpb24uZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZDAzMzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9ncmFkbGUvc291cmNlQ29uZmlndXJhdGlvbi5ncmFkbGUKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBGb2xsb3dpbmcgR3JhZGxlIGJlc3QgcHJhY3RpY2VzIHRvIGtlZXAgYnVpbGQgbG9naWMgb3JnYW5pemVkCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHNvdXJjZSBzZXRzIGZvciBtYWluIGFuZCB0ZXN0IHNvdXJjZXMKK3NvdXJjZVNldHMgeworICAgIG1haW4geworICAgICAgICBqYXZhIHsKKyAgICAgICAgICAgIHNyY0RpciAnc3JjJworICAgICAgICB9CisgICAgfQorICAgIHRlc3QgeworICAgICAgICBqYXZhIHsKKyAgICAgICAgICAgIHNyY0RpciAndGVzdCcKKyAgICAgICAgICAgIC8vIHNlZSBmdW5jdGlvbmFsVGVzdHMuZ3JhZGxlIGZvciB0aGVzZSBmaWxlcworICAgICAgICAgICAgZXhjbHVkZSAnKiovdGVzdC9UZXN0Q2xpZW50LmphdmEnCisgICAgICAgICAgICBleGNsdWRlICcqKi90ZXN0L1Rlc3RTZXJ2ZXIuamF2YScKKyAgICAgICAgICAgIGV4Y2x1ZGUgJyoqL3Rlc3QvVGVzdE5vbmJsb2NraW5nU2VydmVyLmphdmEnCisgICAgICAgIH0KKyAgICAgICAgcmVzb3VyY2VzIHsKKyAgICAgICAgICAgIHNyY0RpciAndGVzdCcKKyAgICAgICAgICAgIGluY2x1ZGUgJ2xvZzRqLnByb3BlcnRpZXMnCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvbXBpbGVyIGNvbmZpZ3VyYXRpb24gZGV0YWlscworCitzb3VyY2VDb21wYXRpYmlsaXR5ID0gJzEuOCcKK3RhcmdldENvbXBhdGliaWxpdHkgPSAnMS44JworCit0YXNrcy53aXRoVHlwZShKYXZhQ29tcGlsZSkgeworICAgIG9wdGlvbnMuZW5jb2RpbmcgPSAnVVRGLTgnCisgICAgb3B0aW9ucy5kZWJ1ZyA9IHRydWUKKyAgICBvcHRpb25zLmRlcHJlY2F0aW9uID0gdHJ1ZQorICAgIC8vIG9wdGlvbnMuY29tcGlsZXJBcmdzLmFkZEFsbCgnLVhsaW50OnVuY2hlY2tlZCcpCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEphciBwYWNrYWdpbmcgZGV0YWlscworcHJvY2Vzc1Jlc291cmNlcyB7CisgICAgaW50bygnTUVUQS1JTkYnKSB7CisgICAgICAgIGZyb20gIiR0aHJpZnRSb290L0xJQ0VOU0UiCisgICAgICAgIGZyb20gIiR0aHJpZnRSb290L05PVElDRSIKKyAgICAgICAgcmVuYW1lKCcoLispJywgJyQxLnR4dCcpCisgICAgfQorfQorCitqYXIgeworICAgIHByb2plY3QudGVzdC5kZXBlbmRzT24gaXQKKyAgICBtYW5pZmVzdCB7CisgICAgICAgIGF0dHJpYnV0ZXMoWworICAgICAgICAgICAgIkltcGxlbWVudGF0aW9uLVZlcnNpb24iOiAiJHtwcm9qZWN0LnZlcnNpb259IiwKKyAgICAgICAgICAgICJCdW5kbGUtTWFuaWZlc3RWZXJzaW9uIjogIjIiLAorICAgICAgICAgICAgIkJ1bmRsZS1TeW1ib2xpY05hbWUiOiAiJHtwcm9qZWN0Lmdyb3VwfSIsCisgICAgICAgICAgICAiQnVuZGxlLU5hbWUiOiAiQXBhY2hlIFRocmlmdCIsCisgICAgICAgICAgICAiQnVuZGxlLVZlcnNpb24iOiAiJHtwcm9qZWN0LnZlcnNpb259IiwKKyAgICAgICAgICAgICJCdW5kbGUtRGVzY3JpcHRpb24iOiAiQXBhY2hlIFRocmlmdCBsaWJyYXJ5IiwKKyAgICAgICAgICAgICJCdW5kbGUtTGljZW5zZSI6ICIke3Byb2plY3QubGljZW5zZX0iLAorICAgICAgICAgICAgIkJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5IjogImxhenkiLAorICAgICAgICAgICAgIkV4cG9ydC1QYWNrYWdlIjogIiR7cHJvamVjdC5ncm91cH0uYXN5bmM7dXNlczo9XCIke3Byb2plY3QuZ3JvdXB9LnByb3RvY29sLCR7cHJvamVjdC5ncm91cH0udHJhbnNwb3J0LG9yZy5zbGY0aiwke3Byb2plY3QuZ3JvdXB9XCI7dmVyc2lvbj1cIiR7dmVyc2lvbn1cIiwke3Byb2plY3QuZ3JvdXB9LnByb3RvY29sO3VzZXM6PVwiJHtwcm9qZWN0Lmdyb3VwfS50cmFuc3BvcnQsJHtwcm9qZWN0Lmdyb3VwfSwke3Byb2plY3QuZ3JvdXB9LnNjaGVtZVwiO3ZlcnNpb249XCIke3ZlcnNpb259XCIsJHtwcm9qZWN0Lmdyb3VwfS5zZXJ2ZXI7dXNlczo9XCIke3Byb2plY3QuZ3JvdXB9LnRyYW5zcG9ydCwke3Byb2plY3QuZ3JvdXB9LnByb3RvY29sLCR7cHJvamVjdC5ncm91cH0sb3JnLnNsZjRqLGphdmF4LnNlcnZsZXQsamF2YXguc2VydmxldC5odHRwXCI7dmVyc2lvbj1cIiR7dmVyc2lvbn1cIiwke3Byb2plY3QuZ3JvdXB9LnRyYW5zcG9ydDt1c2VzOj1cIiR7cHJvamVjdC5ncm91cH0ucHJvdG9jb2wsJHtwcm9qZWN0Lmdyb3VwfSxvcmcuYXBhY2hlLmh0dHAuY2xpZW50LG9yZy5hcGFjaGUuaHR0cC5wYXJhbXMsb3JnLmFwYWNoZS5odHRwLmVudGl0eSxvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMsb3JnLmFwYWNoZS5odHRwLG9yZy5zbGY0aixqYXZheC5uZXQuc3NsLGphdmF4Lm5ldCxqYXZheC5zZWN1cml0eS5zYXNsLGphdmF4LnNlY3VyaXR5LmF1dGguY2FsbGJhY2tcIjt2ZXJzaW9uPVwiJHt2ZXJzaW9ufVwiLCR7cHJvamVjdC5ncm91cH07dXNlczo9XCIke3Byb2plY3QuZ3JvdXB9LnByb3RvY29sLCR7cHJvamVjdC5ncm91cH0uYXN5bmMsJHtwcm9qZWN0Lmdyb3VwfS5zZXJ2ZXIsJHtwcm9qZWN0Lmdyb3VwfS50cmFuc3BvcnQsb3JnLnNsZjRqLG9yZy5hcGFjaGUubG9nNGosJHtwcm9qZWN0Lmdyb3VwfS5zY2hlbWVcIjt2ZXJzaW9uPVwiJHt2ZXJzaW9ufVwiLCR7cHJvamVjdC5ncm91cH0ubWV0YV9kYXRhO3VzZXM6PVwiJHtwcm9qZWN0Lmdyb3VwfVwiO3ZlcnNpb249XCIke3ZlcnNpb259XCIsJHtwcm9qZWN0Lmdyb3VwfS5zY2hlbWU7dXNlczo9XCIke3Byb2plY3QuZ3JvdXB9LnByb3RvY29sLCR7cHJvamVjdC5ncm91cH1cIjt2ZXJzaW9uPVwiJHt2ZXJzaW9ufVwiIiwKKyAgICAgICAgICAgICJJbXBvcnQtUGFja2FnZSI6ICJqYXZheC5uZXQsamF2YXgubmV0LnNzbCxqYXZheC5zZWN1cml0eS5hdXRoLmNhbGxiYWNrLGphdmF4LnNlY3VyaXR5LnNhc2wsamF2YXguc2VydmxldDtyZXNvbHV0aW9uOj1vcHRpb25hbCxqYXZheC5zZXJ2bGV0Lmh0dHA7cmVzb2x1dGlvbjo9b3B0aW9uYWwsb3JnLnNsZjRqO3Jlc29sdXRpb246PW9wdGlvbmFsO3ZlcnNpb249XCJbMS40LDIpXCIsb3JnLmFwYWNoZS5odHRwLmNsaWVudDtyZXNvbHV0aW9uOj1vcHRpb25hbCxvcmcuYXBhY2hlLmh0dHAucGFyYW1zO3Jlc29sdXRpb246PW9wdGlvbmFsLG9yZy5hcGFjaGUuaHR0cC5lbnRpdHk7cmVzb2x1dGlvbjo9b3B0aW9uYWwsb3JnLmFwYWNoZS5odHRwLmNsaWVudC5tZXRob2RzO3Jlc29sdXRpb246PW9wdGlvbmFsLG9yZy5hcGFjaGUuaHR0cDtyZXNvbHV0aW9uOj1vcHRpb25hbCIKKyAgICAgICAgXSkKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9ncmFkbGUvdW5pdFRlc3RzLmdyYWRsZSBiL2xpYi9qYXZhL2dyYWRsZS91bml0VGVzdHMuZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxZjJmYmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9ncmFkbGUvdW5pdFRlc3RzLmdyYWRsZQpAQCAtMCwwICsxLDgyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIEZvbGxvd2luZyBHcmFkbGUgYmVzdCBwcmFjdGljZXMgdG8ga2VlcCBidWlsZCBsb2dpYyBvcmdhbml6ZWQKKworLy8gQnVuZGxlIHRoZSB0ZXN0IGNsYXNzZXMgaW4gYSBKQVIgZm9yIG90aGVyIEFudCBiYXNlZCBidWlsZHMKK3Rhc2sgdGVzdEphcih0eXBlOiBKYXIsIGdyb3VwOiAnQnVpbGQnKSB7CisgICAgZGVzY3JpcHRpb24gPSAnQXNzZW1ibGVzIGEgamFyIGFyY2hpdmUgY29udGFpbmluZyB0aGUgdGVzdCBjbGFzc2VzLicKKyAgICBwcm9qZWN0LnRlc3QuZGVwZW5kc09uIGl0CisKKyAgICBjbGFzc2lmaWVyICd0ZXN0JworICAgIGZyb20gc291cmNlU2V0cy50ZXN0Lm91dHB1dAorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBVbml0IHRlc3QgdGFza3MgYW5kIGNvbmZpZ3VyYXRpb25zCisKKy8vIEhlbHAgdGhlIHVwIHRvIGRhdGUgYWxnb3JpdGhtIHRvIG1ha2UgdGhlc2UgdGVzdHMgZG9uZQorZXh0Lm1hcmtUYXNrRG9uZSA9IHsgdGFzayAtPgorICAgIGRlZiBidWlsZEZpbGUgPSBmaWxlKCIkYnVpbGREaXIvJHt0YXNrLm5hbWV9LmZsYWciKQorICAgIHRhc2suaW5wdXRzLmZpbGVzIHRhc2suY2xhc3NwYXRoCisgICAgdGFzay5vdXRwdXRzLmZpbGUgYnVpbGRGaWxlCisgICAgdGFzay5kb0xhc3QgeworICAgICAgICBidWlsZEZpbGUudGV4dCA9ICdQYXNzZWQhJworICAgIH0KK30KKwordGFzayBkZXByZWNhdGVkRXF1YWxpdHlUZXN0KHR5cGU6IEphdmFFeGVjLCBncm91cDogJ1ZlcmlmaWNhdGlvbicpIHsKKyAgICBkZXNjcmlwdGlvbiA9ICdSdW4gdGhlIG5vbi1KVW5pdCB0ZXN0IHN1aXRlICcKKyAgICBjbGFzc3BhdGggPSBzb3VyY2VTZXRzLnRlc3QucnVudGltZUNsYXNzcGF0aAorICAgIG1haW4gJ29yZy5hcGFjaGUudGhyaWZ0LnRlc3QuRXF1YWxpdHlUZXN0JworICAgIG1hcmtUYXNrRG9uZShpdCkKK30KKwordGFzayBkZXByZWNhdGVkSmF2YUJlYW5zVGVzdCh0eXBlOiBKYXZhRXhlYywgZ3JvdXA6ICdWZXJpZmljYXRpb24nKSB7CisgICAgZGVzY3JpcHRpb24gPSAnUnVuIHRoZSBub24tSlVuaXQgdGVzdCBzdWl0ZSAnCisgICAgY2xhc3NwYXRoID0gc291cmNlU2V0cy50ZXN0LnJ1bnRpbWVDbGFzc3BhdGgKKyAgICBtYWluICdvcmcuYXBhY2hlLnRocmlmdC50ZXN0LkphdmFCZWFuc1Rlc3QnCisgICAgbWFya1Rhc2tEb25lKGl0KQorfQorCisvLyBNYWluIFVuaXQgVGVzdCB0YXNrIGNvbmZpZ3VyYXRpb24KK3Rlc3QgeworICAgIGRlc2NyaXB0aW9uPSJSdW4gdGhlIGZ1bGwgdGVzdCBzdWl0ZSIKKyAgICBkZXBlbmRzT24gZGVwcmVjYXRlZEVxdWFsaXR5VGVzdCwgZGVwcmVjYXRlZEphdmFCZWFuc1Rlc3QKKworICAgIC8vIEFsbG93IHJlcGVhdGluZyB0ZXN0cyBldmVuIGFmdGVyIHN1Y2Nlc3NmdWwgZXhlY3V0aW9uCisgICAgaWYgKHByb2plY3QuaGFzUHJvcGVydHkoJ3JlcnVuVGVzdHMnKSkgeworICAgICAgICBvdXRwdXRzLnVwVG9EYXRlV2hlbiB7IGZhbHNlIH0KKyAgICB9CisKKyAgICBpbmNsdWRlICcqKi9UZXN0Ki5jbGFzcycKKyAgICBleGNsdWRlICcqKi9UZXN0KlwkKi5jbGFzcycKKworICAgIG1heEhlYXBTaXplID0gJzUxMm0nCisgICAgZm9ya0V2ZXJ5ID0gMQorCisgICAgc3lzdGVtUHJvcGVydGllcyA9IFsKKyAgICAgICAgJ2J1aWxkLnRlc3QnOiAiJHtjb21waWxlVGVzdEphdmEuZGVzdGluYXRpb25EaXJ9IiwKKyAgICAgICAgJ3Rlc3QucG9ydCc6ICIke3Rlc3RQb3J0fSIsCisgICAgICAgICdqYXZheC5uZXQuc3NsLnRydXN0U3RvcmUnOiAiJHtwcm9qZWN0RGlyfS90ZXN0Ly50cnVzdHN0b3JlIiwKKyAgICAgICAgJ2phdmF4Lm5ldC5zc2wudHJ1c3RTdG9yZVBhc3N3b3JkJzogJ3RocmlmdCcsCisgICAgICAgICdqYXZheC5uZXQuc3NsLmtleVN0b3JlJzogIiR7cHJvamVjdERpcn0vdGVzdC8ua2V5c3RvcmUiLAorICAgICAgICAnamF2YXgubmV0LnNzbC5rZXlTdG9yZVBhc3N3b3JkJzogJ3RocmlmdCcKKyAgICBdCit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5qYXIgYi9saWIvamF2YS9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkzNDBiNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvamF2YS9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5wcm9wZXJ0aWVzIGIvbGliL2phdmEvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzJiYmU1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIucHJvcGVydGllcwpAQCAtMCwwICsxLDUgQEAKK2Rpc3RyaWJ1dGlvbkJhc2U9R1JBRExFX1VTRVJfSE9NRQorZGlzdHJpYnV0aW9uUGF0aD13cmFwcGVyL2Rpc3RzCit6aXBTdG9yZUJhc2U9R1JBRExFX1VTRVJfSE9NRQoremlwU3RvcmVQYXRoPXdyYXBwZXIvZGlzdHMKK2Rpc3RyaWJ1dGlvblVybD1odHRwc1w6Ly9zZXJ2aWNlcy5ncmFkbGUub3JnL2Rpc3RyaWJ1dGlvbnMvZ3JhZGxlLTQuNC4xLWJpbi56aXAKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2dyYWRsZXcgYi9saWIvamF2YS9ncmFkbGV3Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNjY2RkM2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9ncmFkbGV3CkBAIC0wLDAgKzEsMTcyIEBACisjIS91c3IvYmluL2VudiBzaAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjCisjIyAgR3JhZGxlIHN0YXJ0IHVwIHNjcmlwdCBmb3IgVU4qWAorIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIEF0dGVtcHQgdG8gc2V0IEFQUF9IT01FCisjIFJlc29sdmUgbGlua3M6ICQwIG1heSBiZSBhIGxpbmsKK1BSRz0iJDAiCisjIE5lZWQgdGhpcyBmb3IgcmVsYXRpdmUgc3ltbGlua3MuCit3aGlsZSBbIC1oICIkUFJHIiBdIDsgZG8KKyAgICBscz1gbHMgLWxkICIkUFJHImAKKyAgICBsaW5rPWBleHByICIkbHMiIDogJy4qLT4gXCguKlwpJCdgCisgICAgaWYgZXhwciAiJGxpbmsiIDogJy8uKicgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgICAgUFJHPSIkbGluayIKKyAgICBlbHNlCisgICAgICAgIFBSRz1gZGlybmFtZSAiJFBSRyJgIi8kbGluayIKKyAgICBmaQorZG9uZQorU0FWRUQ9ImBwd2RgIgorY2QgImBkaXJuYW1lIFwiJFBSR1wiYC8iID4vZGV2L251bGwKK0FQUF9IT01FPSJgcHdkIC1QYCIKK2NkICIkU0FWRUQiID4vZGV2L251bGwKKworQVBQX05BTUU9IkdyYWRsZSIKK0FQUF9CQVNFX05BTUU9YGJhc2VuYW1lICIkMCJgCisKKyMgQWRkIGRlZmF1bHQgSlZNIG9wdGlvbnMgaGVyZS4gWW91IGNhbiBhbHNvIHVzZSBKQVZBX09QVFMgYW5kIEdSQURMRV9PUFRTIHRvIHBhc3MgSlZNIG9wdGlvbnMgdG8gdGhpcyBzY3JpcHQuCitERUZBVUxUX0pWTV9PUFRTPSIiCisKKyMgVXNlIHRoZSBtYXhpbXVtIGF2YWlsYWJsZSwgb3Igc2V0IE1BWF9GRCAhPSAtMSB0byB1c2UgdGhhdCB2YWx1ZS4KK01BWF9GRD0ibWF4aW11bSIKKword2FybiAoKSB7CisgICAgZWNobyAiJCoiCit9CisKK2RpZSAoKSB7CisgICAgZWNobworICAgIGVjaG8gIiQqIgorICAgIGVjaG8KKyAgICBleGl0IDEKK30KKworIyBPUyBzcGVjaWZpYyBzdXBwb3J0IChtdXN0IGJlICd0cnVlJyBvciAnZmFsc2UnKS4KK2N5Z3dpbj1mYWxzZQorbXN5cz1mYWxzZQorZGFyd2luPWZhbHNlCitub25zdG9wPWZhbHNlCitjYXNlICJgdW5hbWVgIiBpbgorICBDWUdXSU4qICkKKyAgICBjeWd3aW49dHJ1ZQorICAgIDs7CisgIERhcndpbiogKQorICAgIGRhcndpbj10cnVlCisgICAgOzsKKyAgTUlOR1cqICkKKyAgICBtc3lzPXRydWUKKyAgICA7OworICBOT05TVE9QKiApCisgICAgbm9uc3RvcD10cnVlCisgICAgOzsKK2VzYWMKKworQ0xBU1NQQVRIPSRBUFBfSE9NRS9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5qYXIKKworIyBEZXRlcm1pbmUgdGhlIEphdmEgY29tbWFuZCB0byB1c2UgdG8gc3RhcnQgdGhlIEpWTS4KK2lmIFsgLW4gIiRKQVZBX0hPTUUiIF0gOyB0aGVuCisgICAgaWYgWyAteCAiJEpBVkFfSE9NRS9qcmUvc2gvamF2YSIgXSA7IHRoZW4KKyAgICAgICAgIyBJQk0ncyBKREsgb24gQUlYIHVzZXMgc3RyYW5nZSBsb2NhdGlvbnMgZm9yIHRoZSBleGVjdXRhYmxlcworICAgICAgICBKQVZBQ01EPSIkSkFWQV9IT01FL2pyZS9zaC9qYXZhIgorICAgIGVsc2UKKyAgICAgICAgSkFWQUNNRD0iJEpBVkFfSE9NRS9iaW4vamF2YSIKKyAgICBmaQorICAgIGlmIFsgISAteCAiJEpBVkFDTUQiIF0gOyB0aGVuCisgICAgICAgIGRpZSAiRVJST1I6IEpBVkFfSE9NRSBpcyBzZXQgdG8gYW4gaW52YWxpZCBkaXJlY3Rvcnk6ICRKQVZBX0hPTUUKKworUGxlYXNlIHNldCB0aGUgSkFWQV9IT01FIHZhcmlhYmxlIGluIHlvdXIgZW52aXJvbm1lbnQgdG8gbWF0Y2ggdGhlCitsb2NhdGlvbiBvZiB5b3VyIEphdmEgaW5zdGFsbGF0aW9uLiIKKyAgICBmaQorZWxzZQorICAgIEpBVkFDTUQ9ImphdmEiCisgICAgd2hpY2ggamF2YSA+L2Rldi9udWxsIDI+JjEgfHwgZGllICJFUlJPUjogSkFWQV9IT01FIGlzIG5vdCBzZXQgYW5kIG5vICdqYXZhJyBjb21tYW5kIGNvdWxkIGJlIGZvdW5kIGluIHlvdXIgUEFUSC4KKworUGxlYXNlIHNldCB0aGUgSkFWQV9IT01FIHZhcmlhYmxlIGluIHlvdXIgZW52aXJvbm1lbnQgdG8gbWF0Y2ggdGhlCitsb2NhdGlvbiBvZiB5b3VyIEphdmEgaW5zdGFsbGF0aW9uLiIKK2ZpCisKKyMgSW5jcmVhc2UgdGhlIG1heGltdW0gZmlsZSBkZXNjcmlwdG9ycyBpZiB3ZSBjYW4uCitpZiBbICIkY3lnd2luIiA9ICJmYWxzZSIgLWEgIiRkYXJ3aW4iID0gImZhbHNlIiAtYSAiJG5vbnN0b3AiID0gImZhbHNlIiBdIDsgdGhlbgorICAgIE1BWF9GRF9MSU1JVD1gdWxpbWl0IC1IIC1uYAorICAgIGlmIFsgJD8gLWVxIDAgXSA7IHRoZW4KKyAgICAgICAgaWYgWyAiJE1BWF9GRCIgPSAibWF4aW11bSIgLW8gIiRNQVhfRkQiID0gIm1heCIgXSA7IHRoZW4KKyAgICAgICAgICAgIE1BWF9GRD0iJE1BWF9GRF9MSU1JVCIKKyAgICAgICAgZmkKKyAgICAgICAgdWxpbWl0IC1uICRNQVhfRkQKKyAgICAgICAgaWYgWyAkPyAtbmUgMCBdIDsgdGhlbgorICAgICAgICAgICAgd2FybiAiQ291bGQgbm90IHNldCBtYXhpbXVtIGZpbGUgZGVzY3JpcHRvciBsaW1pdDogJE1BWF9GRCIKKyAgICAgICAgZmkKKyAgICBlbHNlCisgICAgICAgIHdhcm4gIkNvdWxkIG5vdCBxdWVyeSBtYXhpbXVtIGZpbGUgZGVzY3JpcHRvciBsaW1pdDogJE1BWF9GRF9MSU1JVCIKKyAgICBmaQorZmkKKworIyBGb3IgRGFyd2luLCBhZGQgb3B0aW9ucyB0byBzcGVjaWZ5IGhvdyB0aGUgYXBwbGljYXRpb24gYXBwZWFycyBpbiB0aGUgZG9jaworaWYgJGRhcndpbjsgdGhlbgorICAgIEdSQURMRV9PUFRTPSIkR1JBRExFX09QVFMgXCItWGRvY2s6bmFtZT0kQVBQX05BTUVcIiBcIi1YZG9jazppY29uPSRBUFBfSE9NRS9tZWRpYS9ncmFkbGUuaWNuc1wiIgorZmkKKworIyBGb3IgQ3lnd2luLCBzd2l0Y2ggcGF0aHMgdG8gV2luZG93cyBmb3JtYXQgYmVmb3JlIHJ1bm5pbmcgamF2YQoraWYgJGN5Z3dpbiA7IHRoZW4KKyAgICBBUFBfSE9NRT1gY3lncGF0aCAtLXBhdGggLS1taXhlZCAiJEFQUF9IT01FImAKKyAgICBDTEFTU1BBVEg9YGN5Z3BhdGggLS1wYXRoIC0tbWl4ZWQgIiRDTEFTU1BBVEgiYAorICAgIEpBVkFDTUQ9YGN5Z3BhdGggLS11bml4ICIkSkFWQUNNRCJgCisKKyAgICAjIFdlIGJ1aWxkIHRoZSBwYXR0ZXJuIGZvciBhcmd1bWVudHMgdG8gYmUgY29udmVydGVkIHZpYSBjeWdwYXRoCisgICAgUk9PVERJUlNSQVc9YGZpbmQgLUwgLyAtbWF4ZGVwdGggMSAtbWluZGVwdGggMSAtdHlwZSBkIDI+L2Rldi9udWxsYAorICAgIFNFUD0iIgorICAgIGZvciBkaXIgaW4gJFJPT1RESVJTUkFXIDsgZG8KKyAgICAgICAgUk9PVERJUlM9IiRST09URElSUyRTRVAkZGlyIgorICAgICAgICBTRVA9InwiCisgICAgZG9uZQorICAgIE9VUkNZR1BBVFRFUk49IiheKCRST09URElSUykpIgorICAgICMgQWRkIGEgdXNlci1kZWZpbmVkIHBhdHRlcm4gdG8gdGhlIGN5Z3BhdGggYXJndW1lbnRzCisgICAgaWYgWyAiJEdSQURMRV9DWUdQQVRURVJOIiAhPSAiIiBdIDsgdGhlbgorICAgICAgICBPVVJDWUdQQVRURVJOPSIkT1VSQ1lHUEFUVEVSTnwoJEdSQURMRV9DWUdQQVRURVJOKSIKKyAgICBmaQorICAgICMgTm93IGNvbnZlcnQgdGhlIGFyZ3VtZW50cyAtIGtsdWRnZSB0byBsaW1pdCBvdXJzZWx2ZXMgdG8gL2Jpbi9zaAorICAgIGk9MAorICAgIGZvciBhcmcgaW4gIiRAIiA7IGRvCisgICAgICAgIENIRUNLPWBlY2hvICIkYXJnInxlZ3JlcCAtYyAiJE9VUkNZR1BBVFRFUk4iIC1gCisgICAgICAgIENIRUNLMj1gZWNobyAiJGFyZyJ8ZWdyZXAgLWMgIl4tImAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMgRGV0ZXJtaW5lIGlmIGFuIG9wdGlvbgorCisgICAgICAgIGlmIFsgJENIRUNLIC1uZSAwIF0gJiYgWyAkQ0hFQ0syIC1lcSAwIF0gOyB0aGVuICAgICAgICAgICAgICAgICAgICAjIyMgQWRkZWQgYSBjb25kaXRpb24KKyAgICAgICAgICAgIGV2YWwgYGVjaG8gYXJncyRpYD1gY3lncGF0aCAtLXBhdGggLS1pZ25vcmUgLS1taXhlZCAiJGFyZyJgCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGV2YWwgYGVjaG8gYXJncyRpYD0iXCIkYXJnXCIiCisgICAgICAgIGZpCisgICAgICAgIGk9JCgoaSsxKSkKKyAgICBkb25lCisgICAgY2FzZSAkaSBpbgorICAgICAgICAoMCkgc2V0IC0tIDs7CisgICAgICAgICgxKSBzZXQgLS0gIiRhcmdzMCIgOzsKKyAgICAgICAgKDIpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiA7OworICAgICAgICAoMykgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiIDs7CisgICAgICAgICg0KSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgIiRhcmdzMyIgOzsKKyAgICAgICAgKDUpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiAiJGFyZ3M0IiA7OworICAgICAgICAoNikgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiICIkYXJnczMiICIkYXJnczQiICIkYXJnczUiIDs7CisgICAgICAgICg3KSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgIiRhcmdzMyIgIiRhcmdzNCIgIiRhcmdzNSIgIiRhcmdzNiIgOzsKKyAgICAgICAgKDgpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiAiJGFyZ3M0IiAiJGFyZ3M1IiAiJGFyZ3M2IiAiJGFyZ3M3IiA7OworICAgICAgICAoOSkgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiICIkYXJnczMiICIkYXJnczQiICIkYXJnczUiICIkYXJnczYiICIkYXJnczciICIkYXJnczgiIDs7CisgICAgZXNhYworZmkKKworIyBFc2NhcGUgYXBwbGljYXRpb24gYXJncworc2F2ZSAoKSB7CisgICAgZm9yIGkgZG8gcHJpbnRmICVzXFxuICIkaSIgfCBzZWQgInMvJy8nXFxcXCcnL2c7MXMvXi8nLztcJHMvXCQvJyBcXFxcLyIgOyBkb25lCisgICAgZWNobyAiICIKK30KK0FQUF9BUkdTPSQoc2F2ZSAiJEAiKQorCisjIENvbGxlY3QgYWxsIGFyZ3VtZW50cyBmb3IgdGhlIGphdmEgY29tbWFuZCwgZm9sbG93aW5nIHRoZSBzaGVsbCBxdW90aW5nIGFuZCBzdWJzdGl0dXRpb24gcnVsZXMKK2V2YWwgc2V0IC0tICRERUZBVUxUX0pWTV9PUFRTICRKQVZBX09QVFMgJEdSQURMRV9PUFRTICJcIi1Eb3JnLmdyYWRsZS5hcHBuYW1lPSRBUFBfQkFTRV9OQU1FXCIiIC1jbGFzc3BhdGggIlwiJENMQVNTUEFUSFwiIiBvcmcuZ3JhZGxlLndyYXBwZXIuR3JhZGxlV3JhcHBlck1haW4gIiRBUFBfQVJHUyIKKworIyBieSBkZWZhdWx0IHdlIHNob3VsZCBiZSBpbiB0aGUgY29ycmVjdCBwcm9qZWN0IGRpciwgYnV0IHdoZW4gcnVuIGZyb20gRmluZGVyIG9uIE1hYywgdGhlIGN3ZCBpcyB3cm9uZworaWYgWyAiJCh1bmFtZSkiID0gIkRhcndpbiIgXSAmJiBbICIkSE9NRSIgPSAiJFBXRCIgXTsgdGhlbgorICBjZCAiJChkaXJuYW1lICIkMCIpIgorZmkKKworZXhlYyAiJEpBVkFDTUQiICIkQCIKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2dyYWRsZXcuYmF0IGIvbGliL2phdmEvZ3JhZGxldy5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk1NTMxNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL2dyYWRsZXcuYmF0CkBAIC0wLDAgKzEsODQgQEAKK0BpZiAiJURFQlVHJSIgPT0gIiIgQGVjaG8gb2ZmCitAcmVtICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitAcmVtCitAcmVtICBHcmFkbGUgc3RhcnR1cCBzY3JpcHQgZm9yIFdpbmRvd3MKK0ByZW0KK0ByZW0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworQHJlbSBTZXQgbG9jYWwgc2NvcGUgZm9yIHRoZSB2YXJpYWJsZXMgd2l0aCB3aW5kb3dzIE5UIHNoZWxsCitpZiAiJU9TJSI9PSJXaW5kb3dzX05UIiBzZXRsb2NhbAorCitzZXQgRElSTkFNRT0lfmRwMAoraWYgIiVESVJOQU1FJSIgPT0gIiIgc2V0IERJUk5BTUU9Lgorc2V0IEFQUF9CQVNFX05BTUU9JX5uMAorc2V0IEFQUF9IT01FPSVESVJOQU1FJQorCitAcmVtIEFkZCBkZWZhdWx0IEpWTSBvcHRpb25zIGhlcmUuIFlvdSBjYW4gYWxzbyB1c2UgSkFWQV9PUFRTIGFuZCBHUkFETEVfT1BUUyB0byBwYXNzIEpWTSBvcHRpb25zIHRvIHRoaXMgc2NyaXB0Lgorc2V0IERFRkFVTFRfSlZNX09QVFM9CisKK0ByZW0gRmluZCBqYXZhLmV4ZQoraWYgZGVmaW5lZCBKQVZBX0hPTUUgZ290byBmaW5kSmF2YUZyb21KYXZhSG9tZQorCitzZXQgSkFWQV9FWEU9amF2YS5leGUKKyVKQVZBX0VYRSUgLXZlcnNpb24gPk5VTCAyPiYxCitpZiAiJUVSUk9STEVWRUwlIiA9PSAiMCIgZ290byBpbml0CisKK2VjaG8uCitlY2hvIEVSUk9SOiBKQVZBX0hPTUUgaXMgbm90IHNldCBhbmQgbm8gJ2phdmEnIGNvbW1hbmQgY291bGQgYmUgZm91bmQgaW4geW91ciBQQVRILgorZWNoby4KK2VjaG8gUGxlYXNlIHNldCB0aGUgSkFWQV9IT01FIHZhcmlhYmxlIGluIHlvdXIgZW52aXJvbm1lbnQgdG8gbWF0Y2ggdGhlCitlY2hvIGxvY2F0aW9uIG9mIHlvdXIgSmF2YSBpbnN0YWxsYXRpb24uCisKK2dvdG8gZmFpbAorCis6ZmluZEphdmFGcm9tSmF2YUhvbWUKK3NldCBKQVZBX0hPTUU9JUpBVkFfSE9NRToiPSUKK3NldCBKQVZBX0VYRT0lSkFWQV9IT01FJS9iaW4vamF2YS5leGUKKworaWYgZXhpc3QgIiVKQVZBX0VYRSUiIGdvdG8gaW5pdAorCitlY2hvLgorZWNobyBFUlJPUjogSkFWQV9IT01FIGlzIHNldCB0byBhbiBpbnZhbGlkIGRpcmVjdG9yeTogJUpBVkFfSE9NRSUKK2VjaG8uCitlY2hvIFBsZWFzZSBzZXQgdGhlIEpBVkFfSE9NRSB2YXJpYWJsZSBpbiB5b3VyIGVudmlyb25tZW50IHRvIG1hdGNoIHRoZQorZWNobyBsb2NhdGlvbiBvZiB5b3VyIEphdmEgaW5zdGFsbGF0aW9uLgorCitnb3RvIGZhaWwKKworOmluaXQKK0ByZW0gR2V0IGNvbW1hbmQtbGluZSBhcmd1bWVudHMsIGhhbmRsaW5nIFdpbmRvd3MgdmFyaWFudHMKKworaWYgbm90ICIlT1MlIiA9PSAiV2luZG93c19OVCIgZ290byB3aW45eE1FX2FyZ3MKKworOndpbjl4TUVfYXJncworQHJlbSBTbHVycCB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KK3NldCBDTURfTElORV9BUkdTPQorc2V0IF9TS0lQPTIKKworOndpbjl4TUVfYXJnc19zbHVycAoraWYgInglfjEiID09ICJ4IiBnb3RvIGV4ZWN1dGUKKworc2V0IENNRF9MSU5FX0FSR1M9JSoKKworOmV4ZWN1dGUKK0ByZW0gU2V0dXAgdGhlIGNvbW1hbmQgbGluZQorCitzZXQgQ0xBU1NQQVRIPSVBUFBfSE9NRSVcZ3JhZGxlXHdyYXBwZXJcZ3JhZGxlLXdyYXBwZXIuamFyCisKK0ByZW0gRXhlY3V0ZSBHcmFkbGUKKyIlSkFWQV9FWEUlIiAlREVGQVVMVF9KVk1fT1BUUyUgJUpBVkFfT1BUUyUgJUdSQURMRV9PUFRTJSAiLURvcmcuZ3JhZGxlLmFwcG5hbWU9JUFQUF9CQVNFX05BTUUlIiAtY2xhc3NwYXRoICIlQ0xBU1NQQVRIJSIgb3JnLmdyYWRsZS53cmFwcGVyLkdyYWRsZVdyYXBwZXJNYWluICVDTURfTElORV9BUkdTJQorCis6ZW5kCitAcmVtIEVuZCBsb2NhbCBzY29wZSBmb3IgdGhlIHZhcmlhYmxlcyB3aXRoIHdpbmRvd3MgTlQgc2hlbGwKK2lmICIlRVJST1JMRVZFTCUiPT0iMCIgZ290byBtYWluRW5kCisKKzpmYWlsCityZW0gU2V0IHZhcmlhYmxlIEdSQURMRV9FWElUX0NPTlNPTEUgaWYgeW91IG5lZWQgdGhlIF9zY3JpcHRfIHJldHVybiBjb2RlIGluc3RlYWQgb2YKK3JlbSB0aGUgX2NtZC5leGUgL2NfIHJldHVybiBjb2RlIQoraWYgIG5vdCAiIiA9PSAiJUdSQURMRV9FWElUX0NPTlNPTEUlIiBleGl0IDEKK2V4aXQgL2IgMQorCis6bWFpbkVuZAoraWYgIiVPUyUiPT0iV2luZG93c19OVCIgZW5kbG9jYWwKKworOm9tZWdhCmRpZmYgLS1naXQgYS9saWIvamF2YS9zZXR0aW5ncy5ncmFkbGUgYi9saWIvamF2YS9zZXR0aW5ncy5ncmFkbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzliZDhiYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NldHRpbmdzLmdyYWRsZQpAQCAtMCwwICsxLDIwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3Jvb3RQcm9qZWN0Lm5hbWUgPSAnbGlidGhyaWZ0JwpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L0FzeW5jUHJvY2Vzc0Z1bmN0aW9uLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvQXN5bmNQcm9jZXNzRnVuY3Rpb24uamF2YQppbmRleCA3OTllMDJkLi40ODNjOGQwIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvQXN5bmNQcm9jZXNzRnVuY3Rpb24uamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvQXN5bmNQcm9jZXNzRnVuY3Rpb24uamF2YQpAQCAtMjAsMTEgKzIwLDEwIEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5Bc3luY01ldGhvZENhbGxiYWNrOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2w7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLkFic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXI7CiAKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBc3luY1Byb2Nlc3NGdW5jdGlvbjxJLCBULCBSPiB7CitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQXN5bmNQcm9jZXNzRnVuY3Rpb248SSwgVCBleHRlbmRzIFRCYXNlLCBSPiB7CiAgICAgZmluYWwgU3RyaW5nIG1ldGhvZE5hbWU7CiAKICAgICBwdWJsaWMgQXN5bmNQcm9jZXNzRnVuY3Rpb24oU3RyaW5nIG1ldGhvZE5hbWUpIHsKQEAgLTM3LDEzICszNiwxMyBAQAogCiAgICAgcHVibGljIGFic3RyYWN0IFQgZ2V0RW1wdHlBcmdzSW5zdGFuY2UoKTsKIAotICAgIHB1YmxpYyBhYnN0cmFjdCBBc3luY01ldGhvZENhbGxiYWNrIGdldFJlc3VsdEhhbmRsZXIoZmluYWwgQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlci5Bc3luY0ZyYW1lQnVmZmVyIGZiLCBpbnQgc2VxaWQpOworICAgIHB1YmxpYyBhYnN0cmFjdCBBc3luY01ldGhvZENhbGxiYWNrPFI+IGdldFJlc3VsdEhhbmRsZXIoZmluYWwgQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlci5Bc3luY0ZyYW1lQnVmZmVyIGZiLCBpbnQgc2VxaWQpOwogCiAgICAgcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKCkgewogICAgICAgICByZXR1cm4gbWV0aG9kTmFtZTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBzZW5kUmVzcG9uc2UoZmluYWwgQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlci5Bc3luY0ZyYW1lQnVmZmVyIGZiLCBmaW5hbCBUQmFzZSByZXN1bHQsIGZpbmFsIGJ5dGUgdHlwZSwgZmluYWwgaW50IHNlcWlkKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgc2VuZFJlc3BvbnNlKGZpbmFsIEFic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXIuQXN5bmNGcmFtZUJ1ZmZlciBmYiwgZmluYWwgVFNlcmlhbGl6YWJsZSByZXN1bHQsIGZpbmFsIGJ5dGUgdHlwZSwgZmluYWwgaW50IHNlcWlkKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgICAgIFRQcm90b2NvbCBvcHJvdCA9IGZiLmdldE91dHB1dFByb3RvY29sKCk7CiAKICAgICAgICAgb3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKGdldE1ldGhvZE5hbWUoKSwgdHlwZSwgc2VxaWQpKTsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9PcHRpb24uamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9PcHRpb24uamF2YQppbmRleCBkYjI1ZWM1Li5kNWNkMzA5IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvT3B0aW9uLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L09wdGlvbi5qYXZhCkBAIC0yNCw2ICsyNCw5IEBACiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBPcHRpb248VD4gewogCisgICAgQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPcHRpb24gTk9ORSA9IG5ldyBOb25lKCk7CisKICAgICAvKioKICAgICAgKiBXaGV0aGVyIHRoZSBPcHRpb24gaXMgZGVmaW5lZCBvciBub3QKICAgICAgKiBAcmV0dXJuCkBAIC04Nyw3ICs5MCw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuICJTb21lKCIrdmFsdWUudG9TdHJpbmcoKSsiKSI7CisgICAgICAgICAgICByZXR1cm4gIlNvbWUoIiArIHZhbHVlICsgIikiOwogICAgICAgICB9CiAgICAgfQogCkBAIC05OSw5ICsxMDIsOSBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgPFQ+IE9wdGlvbjxUPiBmcm9tTnVsbGFibGUoVCB2YWx1ZSkgewogICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTb21lPFQ+KHZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiBzb21lKHZhbHVlKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgTm9uZTxUPigpOworICAgICAgICAgICAgcmV0dXJuIG5vbmUoKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTE1LDcgKzExOCw4IEBACiAgICAgICAgIHJldHVybiBuZXcgU29tZTxUPih2YWx1ZSk7CiAgICAgfQogCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAgICAgcHVibGljIHN0YXRpYyA8VD4gTm9uZTxUPiBub25lKCkgewotICAgICAgICByZXR1cm4gbmV3IE5vbmU8VD4oKTsKKyAgICAgICAgcmV0dXJuIChOb25lPFQ+KSBOT05FOwogICAgIH0KIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvUHJvY2Vzc0Z1bmN0aW9uLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvUHJvY2Vzc0Z1bmN0aW9uLmphdmEKaW5kZXggMTljOGYxNC4uZTYyMTNkZiAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1Byb2Nlc3NGdW5jdGlvbi5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9Qcm9jZXNzRnVuY3Rpb24uamF2YQpAQCAtMSwxMiArMSwxMCBAQAotLyoqCi0gKiAKLSAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKIAogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2w7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKQEAgLTMzLDI3ICszMSw0OSBAQAogICAgICAgcmV0dXJuOwogICAgIH0KICAgICBpcHJvdC5yZWFkTWVzc2FnZUVuZCgpOwotICAgIFRCYXNlIHJlc3VsdCA9IG51bGw7CisgICAgVFNlcmlhbGl6YWJsZSByZXN1bHQgPSBudWxsOworICAgIGJ5dGUgbXNnVHlwZSA9IFRNZXNzYWdlVHlwZS5SRVBMWTsKIAogICAgIHRyeSB7CiAgICAgICByZXN1bHQgPSBnZXRSZXN1bHQoaWZhY2UsIGFyZ3MpOwotICAgIH0gY2F0Y2goVEV4Y2VwdGlvbiB0ZXgpIHsKLSAgICAgIExPR0dFUi5lcnJvcigiSW50ZXJuYWwgZXJyb3IgcHJvY2Vzc2luZyAiICsgZ2V0TWV0aG9kTmFtZSgpLCB0ZXgpOwotICAgICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5JTlRFUk5BTF9FUlJPUiwgCisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiBleCkgeworICAgICAgTE9HR0VSLmVycm9yKCJUcmFuc3BvcnQgZXJyb3Igd2hpbGUgcHJvY2Vzc2luZyAiICsgZ2V0TWV0aG9kTmFtZSgpLCBleCk7CisgICAgICB0aHJvdyBleDsKKyAgICB9IGNhdGNoIChUQXBwbGljYXRpb25FeGNlcHRpb24gZXgpIHsKKyAgICAgIExPR0dFUi5lcnJvcigiSW50ZXJuYWwgYXBwbGljYXRpb24gZXJyb3IgcHJvY2Vzc2luZyAiICsgZ2V0TWV0aG9kTmFtZSgpLCBleCk7CisgICAgICByZXN1bHQgPSBleDsKKyAgICAgIG1zZ1R5cGUgPSBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgTE9HR0VSLmVycm9yKCJJbnRlcm5hbCBlcnJvciBwcm9jZXNzaW5nICIgKyBnZXRNZXRob2ROYW1lKCksIGV4KTsKKyAgICAgIGlmKHJldGhyb3dVbmhhbmRsZWRFeGNlcHRpb25zKCkpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4LmdldE1lc3NhZ2UoKSwgZXgpOworICAgICAgaWYoIWlzT25ld2F5KCkpIHsKKyAgICAgICAgcmVzdWx0ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uSU5URVJOQUxfRVJST1IsCisgICAgICAgICAgICAiSW50ZXJuYWwgZXJyb3IgcHJvY2Vzc2luZyAiICsgZ2V0TWV0aG9kTmFtZSgpKTsKKyAgICAgICAgbXNnVHlwZSA9IFRNZXNzYWdlVHlwZS5FWENFUFRJT047CisgICAgICB9CisgICAgfQorCisgICAgaWYoIWlzT25ld2F5KCkpIHsKKyAgICAgIG9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShnZXRNZXRob2ROYW1lKCksIG1zZ1R5cGUsIHNlcWlkKSk7CisgICAgICByZXN1bHQud3JpdGUob3Byb3QpOworICAgICAgb3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7CisgICAgICBvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBoYW5kbGVFeGNlcHRpb24oaW50IHNlcWlkLCBUUHJvdG9jb2wgb3Byb3QpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBpZiAoIWlzT25ld2F5KCkpIHsKKyAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uSU5URVJOQUxfRVJST1IsCiAgICAgICAgICJJbnRlcm5hbCBlcnJvciBwcm9jZXNzaW5nICIgKyBnZXRNZXRob2ROYW1lKCkpOwogICAgICAgb3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKGdldE1ldGhvZE5hbWUoKSwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgc2VxaWQpKTsKICAgICAgIHgud3JpdGUob3Byb3QpOwogICAgICAgb3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7CiAgICAgICBvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOwotICAgICAgcmV0dXJuOwogICAgIH0KKyAgfQogCi0gICAgaWYoIWlzT25ld2F5KCkpIHsKLSAgICAgIG9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShnZXRNZXRob2ROYW1lKCksIFRNZXNzYWdlVHlwZS5SRVBMWSwgc2VxaWQpKTsKLSAgICAgIHJlc3VsdC53cml0ZShvcHJvdCk7Ci0gICAgICBvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsKLSAgICAgIG9wcm90LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7Ci0gICAgfQorICBwcm90ZWN0ZWQgYm9vbGVhbiByZXRocm93VW5oYW5kbGVkRXhjZXB0aW9ucygpeworICAgIHJldHVybiBmYWxzZTsKICAgfQogCiAgIHByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGlzT25ld2F5KCk7CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvU2hvcnRTdGFjay5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1Nob3J0U3RhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk1N2QxYy4uMDAwMDAwMAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvU2hvcnRTdGFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKLQotLyoqCi0gKiBTaG9ydFN0YWNrIGlzIGEgc2hvcnQtc3BlY2lmaWMgU3RhY2sgaW1wbGVtZW50YXRpb24gd3JpdHRlbiBmb3IgdGhlIGV4cHJlc3MKLSAqIHB1cnBvc2Ugb2YgdmVyeSBmYXN0IG9wZXJhdGlvbnMgb24gVENvbXBhY3RQcm90b2NvbCdzIGZpZWxkIGlkIHN0YWNrLiBUaGlzCi0gKiBpbXBsZW1lbnRhdGlvbiBwZXJmb3JtcyBhdCBsZWFzdCAxMHggZmFzdGVyIHRoYW4gamF2YS51dGlsLlN0YWNrLgotICovCi1wdWJsaWMgY2xhc3MgU2hvcnRTdGFjayB7Ci0KLSAgcHJpdmF0ZSBzaG9ydFtdIHZlY3RvcjsKLSAgcHJpdmF0ZSBpbnQgdG9wID0gLTE7Ci0KLSAgcHVibGljIFNob3J0U3RhY2soaW50IGluaXRpYWxDYXBhY2l0eSkgewotICAgIHZlY3RvciA9IG5ldyBzaG9ydFtpbml0aWFsQ2FwYWNpdHldOwotICB9Ci0KLSAgcHVibGljIHNob3J0IHBvcCgpIHsKLSAgICByZXR1cm4gdmVjdG9yW3RvcC0tXTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHB1c2goc2hvcnQgcHVzaGVkKSB7Ci0gICAgaWYgKHZlY3Rvci5sZW5ndGggPT0gdG9wICsgMSkgewotICAgICAgZ3JvdygpOwotICAgIH0KLSAgICB2ZWN0b3JbKyt0b3BdID0gcHVzaGVkOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGdyb3coKSB7Ci0gICAgc2hvcnRbXSBuZXdWZWN0b3IgPSBuZXcgc2hvcnRbdmVjdG9yLmxlbmd0aCAqIDJdOwotICAgIFN5c3RlbS5hcnJheWNvcHkodmVjdG9yLCAwLCBuZXdWZWN0b3IsIDAsIHZlY3Rvci5sZW5ndGgpOwotICAgIHZlY3RvciA9IG5ld1ZlY3RvcjsKLSAgfQotCi0gIHB1YmxpYyBzaG9ydCBwZWVrKCkgewotICAgIHJldHVybiB2ZWN0b3JbdG9wXTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgIHRvcCA9IC0xOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgc2IuYXBwZW5kKCI8U2hvcnRTdGFjayB2ZWN0b3I6WyIpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmVjdG9yLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBpZiAoaSAhPSAwKSB7Ci0gICAgICAgIHNiLmFwcGVuZCgiICIpOwotICAgICAgfQotCi0gICAgICBpZiAoaSA9PSB0b3ApIHsKLSAgICAgICAgc2IuYXBwZW5kKCI+PiIpOwotICAgICAgfQotCi0gICAgICBzYi5hcHBlbmQodmVjdG9yW2ldKTsKLQotICAgICAgaWYgKGkgPT0gdG9wKSB7Ci0gICAgICAgIHNiLmFwcGVuZCgiPDwiKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgc2IuYXBwZW5kKCJdPiIpOwotICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICB9Ci19CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmphdmEKaW5kZXggYjU0YTVjZS4uNGQ2OTNkOSAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQXBwbGljYXRpb25FeGNlcHRpb24uamF2YQpAQCAtMjksNyArMjksNyBAQAogICogQXBwbGljYXRpb24gbGV2ZWwgZXhjZXB0aW9uCiAgKgogICovCi1wdWJsaWMgY2xhc3MgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGV4dGVuZHMgVEV4Y2VwdGlvbiB7CitwdWJsaWMgY2xhc3MgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGV4dGVuZHMgVEV4Y2VwdGlvbiBpbXBsZW1lbnRzIFRTZXJpYWxpemFibGUgewogCiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFRTdHJ1Y3QgVEFQUExJQ0FUSU9OX0VYQ0VQVElPTl9TVFJVQ1QgPSBuZXcgVFN0cnVjdCgiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIik7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFRGaWVsZCBNRVNTQUdFX0ZJRUxEID0gbmV3IFRGaWVsZCgibWVzc2FnZSIsIFRUeXBlLlNUUklORywgKHNob3J0KTEpOwpAQCAtNTAsNiArNTAsNyBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTlNVUFBPUlRFRF9DTElFTlRfVFlQRSA9IDEwOwogCiAgIHByb3RlY3RlZCBpbnQgdHlwZV8gPSBVTktOT1dOOworICBwcml2YXRlIFN0cmluZyBtZXNzYWdlXyA9IG51bGw7CiAKICAgcHVibGljIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbigpIHsKICAgICBzdXBlcigpOwpAQCAtNzMsNyArNzQsMTggQEAKICAgICByZXR1cm4gdHlwZV87CiAgIH0KIAotICBwdWJsaWMgc3RhdGljIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiByZWFkKFRQcm90b2NvbCBpcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24geworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgeworICAgIGlmIChtZXNzYWdlXyA9PSBudWxsKSB7CisgICAgICByZXR1cm4gc3VwZXIuZ2V0TWVzc2FnZSgpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHJldHVybiBtZXNzYWdlXzsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCByZWFkKFRQcm90b2NvbCBpcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24KKyAgewogICAgIFRGaWVsZCBmaWVsZDsKICAgICBpcHJvdC5yZWFkU3RydWN0QmVnaW4oKTsKIApAQCAtODYsMzIgKzk4LDQzIEBACiAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgICAgc3dpdGNoIChmaWVsZC5pZCkgewotICAgICAgY2FzZSAxOgotICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5TVFJJTkcpIHsKLSAgICAgICAgICBtZXNzYWdlID0gaXByb3QucmVhZFN0cmluZygpOwotICAgICAgICB9IGVsc2UgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuU1RSSU5HKSB7CisgICAgICAgICAgICBtZXNzYWdlID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLkkzMikgeworICAgICAgICAgICAgdHlwZSA9IGlwcm90LnJlYWRJMzIoKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMjoKLSAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuSTMyKSB7Ci0gICAgICAgICAgdHlwZSA9IGlwcm90LnJlYWRJMzIoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsKLSAgICAgICAgYnJlYWs7CisgICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgICBpcHJvdC5yZWFkRmllbGRFbmQoKTsKICAgICB9CiAgICAgaXByb3QucmVhZFN0cnVjdEVuZCgpOwotCi0gICAgcmV0dXJuIG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24odHlwZSwgbWVzc2FnZSk7CisgICAgdHlwZV8gPSB0eXBlOworICAgIG1lc3NhZ2VfID0gbWVzc2FnZTsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHdyaXRlKFRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24geworICAvKioKKyAgICogQ29udmVuaWVuY2UgZmFjdG9yeSBtZXRob2QgZm9yIGNvbnN0cnVjdGluZyBhIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBnaXZlbiBhIFRQcm90b2NvbCBpbnB1dAorICAgKi8KKyAgcHVibGljIHN0YXRpYyBUQXBwbGljYXRpb25FeGNlcHRpb24gcmVhZEZyb20oVFByb3RvY29sIGlwcm90KSB0aHJvd3MgVEV4Y2VwdGlvbgorICB7CisgICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHJlc3VsdCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oKTsKKyAgICByZXN1bHQucmVhZChpcHJvdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlKFRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24KKyAgewogICAgIG9wcm90LndyaXRlU3RydWN0QmVnaW4oVEFQUExJQ0FUSU9OX0VYQ0VQVElPTl9TVFJVQ1QpOwogICAgIGlmIChnZXRNZXNzYWdlKCkgIT0gbnVsbCkgewogICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKE1FU1NBR0VfRklFTEQpOwpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RBc3luY1Byb2Nlc3Nvci5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RBc3luY1Byb2Nlc3Nvci5qYXZhCmluZGV4IDBhMDY5ZWEuLjUzM2U3NGQgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQXN5bmNQcm9jZXNzb3IuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEFzeW5jUHJvY2Vzc29yLmphdmEKQEAgLTE4LDE0ICsxOCw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CiAKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC4qOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLkFic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXIuKjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLkFic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXIuQXN5bmNGcmFtZUJ1ZmZlcjsKIAogcHVibGljIGludGVyZmFjZSBUQXN5bmNQcm9jZXNzb3IgewogICAgIC8qKgpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCYXNlLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJhc2UuamF2YQppbmRleCBiM2VkMWJjLi5lMTQ4OWQ1IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJhc2UuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJhc2UuamF2YQpAQCAtMjcsMjEgKzI3LDcgQEAKICAqIEdlbmVyaWMgYmFzZSBpbnRlcmZhY2UgZm9yIGdlbmVyYXRlZCBUaHJpZnQgb2JqZWN0cy4KICAqCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgVEJhc2U8VCBleHRlbmRzIFRCYXNlPD8sPz4sIEYgZXh0ZW5kcyBURmllbGRJZEVudW0+IGV4dGVuZHMgQ29tcGFyYWJsZTxUPiwgIFNlcmlhbGl6YWJsZSB7Ci0KLSAgLyoqCi0gICAqIFJlYWRzIHRoZSBUT2JqZWN0IGZyb20gdGhlIGdpdmVuIGlucHV0IHByb3RvY29sLgotICAgKgotICAgKiBAcGFyYW0gaXByb3QgSW5wdXQgcHJvdG9jb2wKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlYWQoVFByb3RvY29sIGlwcm90KSB0aHJvd3MgVEV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogV3JpdGVzIHRoZSBvYmplY3RzIG91dCB0byB0aGUgcHJvdG9jb2wKLSAgICoKLSAgICogQHBhcmFtIG9wcm90IE91dHB1dCBwcm90b2NvbAotICAgKi8KLSAgcHVibGljIHZvaWQgd3JpdGUoVFByb3RvY29sIG9wcm90KSB0aHJvd3MgVEV4Y2VwdGlvbjsKK3B1YmxpYyBpbnRlcmZhY2UgVEJhc2U8VCBleHRlbmRzIFRCYXNlPFQsRj4sIEYgZXh0ZW5kcyBURmllbGRJZEVudW0+IGV4dGVuZHMgQ29tcGFyYWJsZTxUPiwgIFRTZXJpYWxpemFibGUsIFNlcmlhbGl6YWJsZSB7CiAKICAgLyoqCiAgICAqIEdldCB0aGUgRiBpbnN0YW5jZSB0aGF0IGNvcnJlc3BvbmRzIHRvIGZpZWxkSWQuCkBAIC01Niw3ICs0Miw3IEBACiAgIHB1YmxpYyBib29sZWFuIGlzU2V0KEYgZmllbGQpOwogCiAgIC8qKgotICAgKiBHZXQgYSBmaWVsZCdzIHZhbHVlIGJ5IGZpZWxkIHZhcmlhYmxlLiBQcmltaXRpdmUgdHlwZXMgd2lsbCBiZSB3cmFwcGVkIGluIAorICAgKiBHZXQgYSBmaWVsZCdzIHZhbHVlIGJ5IGZpZWxkIHZhcmlhYmxlLiBQcmltaXRpdmUgdHlwZXMgd2lsbCBiZSB3cmFwcGVkIGluCiAgICAqIHRoZSBhcHByb3ByaWF0ZSAiYm94ZWQiIHR5cGVzLgogICAgKgogICAgKiBAcGFyYW0gZmllbGQKQEAgLTcxLDcgKzU3LDcgQEAKICAgICovCiAgIHB1YmxpYyB2b2lkIHNldEZpZWxkVmFsdWUoRiBmaWVsZCwgT2JqZWN0IHZhbHVlKTsKIAotICBwdWJsaWMgVEJhc2U8VCwgRj4gZGVlcENvcHkoKTsKKyAgcHVibGljIFQgZGVlcENvcHkoKTsKIAogICAvKioKICAgICogUmV0dXJuIHRvIHRoZSBzdGF0ZSBvZiBoYXZpbmcganVzdCBiZWVuIGluaXRpYWxpemVkLCBhcyB0aG91Z2ggeW91IGhhZCBqdXN0CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJhc2VBc3luY1Byb2Nlc3Nvci5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCYXNlQXN5bmNQcm9jZXNzb3IuamF2YQppbmRleCBlZDZjMzIzLi4wYWIxODI3IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJhc2VBc3luY1Byb2Nlc3Nvci5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQmFzZUFzeW5jUHJvY2Vzc29yLmphdmEKQEAgLTE5LDYgKzE5LDcgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLkFzeW5jTWV0aG9kQ2FsbGJhY2s7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlci4qOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CkBAIC01MywzNSArNTQsNTcgQEAKICAgICAgICAgaWYgKGZuID09IG51bGwpIHsKICAgICAgICAgICAgIFRQcm90b2NvbFV0aWwuc2tpcChpbiwgVFR5cGUuU1RSVUNUKTsKICAgICAgICAgICAgIGluLnJlYWRNZXNzYWdlRW5kKCk7Ci0gICAgICAgICAgICBUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlVOS05PV05fTUVUSE9ELCAiSW52YWxpZCBtZXRob2QgbmFtZTogJyIrbXNnLm5hbWUrIiciKTsKLSAgICAgICAgICAgIG91dC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UobXNnLm5hbWUsIFRNZXNzYWdlVHlwZS5FWENFUFRJT04sIG1zZy5zZXFpZCkpOwotICAgICAgICAgICAgeC53cml0ZShvdXQpOwotICAgICAgICAgICAgb3V0LndyaXRlTWVzc2FnZUVuZCgpOwotICAgICAgICAgICAgb3V0LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7CisKKyAgICAgICAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uVU5LTk9XTl9NRVRIT0QsCisgICAgICAgICAgICAgICAgIkludmFsaWQgbWV0aG9kIG5hbWU6ICciICsgbXNnLm5hbWUgKyAiJyIpOworICAgICAgICAgICAgTE9HR0VSLmRlYnVnKCJJbnZhbGlkIG1ldGhvZCBuYW1lIiwgeCk7CisKKyAgICAgICAgICAgIC8vIHRoaXMgbWVhbnMgaXQgaXMgYSB0d28td2F5IHJlcXVlc3QsIHNvIHdlIGNhbiBzZW5kIGEgcmVwbHkKKyAgICAgICAgICAgIGlmIChtc2cudHlwZSA9PSBUTWVzc2FnZVR5cGUuQ0FMTCkgeworICAgICAgICAgICAgICBvdXQud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKG1zZy5uYW1lLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBtc2cuc2VxaWQpKTsKKyAgICAgICAgICAgICAgeC53cml0ZShvdXQpOworICAgICAgICAgICAgICBvdXQud3JpdGVNZXNzYWdlRW5kKCk7CisgICAgICAgICAgICAgIG91dC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgZmIucmVzcG9uc2VSZWFkeSgpOwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KIAogICAgICAgICAvL0dldCBBcmdzCi0gICAgICAgIFRCYXNlIGFyZ3MgPSAoVEJhc2UpZm4uZ2V0RW1wdHlBcmdzSW5zdGFuY2UoKTsKKyAgICAgICAgVEJhc2UgYXJncyA9IGZuLmdldEVtcHR5QXJnc0luc3RhbmNlKCk7CiAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGFyZ3MucmVhZChpbik7CiAgICAgICAgIH0gY2F0Y2ggKFRQcm90b2NvbEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBpbi5yZWFkTWVzc2FnZUVuZCgpOwotICAgICAgICAgICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5QUk9UT0NPTF9FUlJPUiwgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgb3V0LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShtc2cubmFtZSwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgbXNnLnNlcWlkKSk7Ci0gICAgICAgICAgICB4LndyaXRlKG91dCk7Ci0gICAgICAgICAgICBvdXQud3JpdGVNZXNzYWdlRW5kKCk7Ci0gICAgICAgICAgICBvdXQuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsKKworICAgICAgICAgICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5QUk9UT0NPTF9FUlJPUiwKKyAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICBMT0dHRVIuZGVidWcoIkNvdWxkIG5vdCByZXRyaWV2ZSBmdW5jdGlvbiBhcmd1bWVudHMiLCB4KTsKKworICAgICAgICAgICAgaWYgKCFmbi5pc09uZXdheSgpKSB7CisgICAgICAgICAgICAgIG91dC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UobXNnLm5hbWUsIFRNZXNzYWdlVHlwZS5FWENFUFRJT04sIG1zZy5zZXFpZCkpOworICAgICAgICAgICAgICB4LndyaXRlKG91dCk7CisgICAgICAgICAgICAgIG91dC53cml0ZU1lc3NhZ2VFbmQoKTsKKyAgICAgICAgICAgICAgb3V0LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBmYi5yZXNwb25zZVJlYWR5KCk7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBpbi5yZWFkTWVzc2FnZUVuZCgpOwogCisgICAgICAgIGlmIChmbi5pc09uZXdheSgpKSB7CisgICAgICAgICAgZmIucmVzcG9uc2VSZWFkeSgpOworICAgICAgICB9CiAKICAgICAgICAgLy9zdGFydCBvZmYgcHJvY2Vzc2luZyBmdW5jdGlvbgotICAgICAgICBmbi5zdGFydChpZmFjZSwgYXJncyxmbi5nZXRSZXN1bHRIYW5kbGVyKGZiLG1zZy5zZXFpZCkpOworICAgICAgICBBc3luY01ldGhvZENhbGxiYWNrIHJlc3VsdEhhbmRsZXIgPSBmbi5nZXRSZXN1bHRIYW5kbGVyKGZiLCBtc2cuc2VxaWQpOworICAgICAgICB0cnkgeworICAgICAgICAgIGZuLnN0YXJ0KGlmYWNlLCBhcmdzLCByZXN1bHRIYW5kbGVyKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBMT0dHRVIuZGVidWcoIkV4Y2VwdGlvbiBoYW5kbGluZyBmdW5jdGlvbiIsIGUpOworICAgICAgICAgIHJlc3VsdEhhbmRsZXIub25FcnJvcihlKTsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQmFzZUhlbHBlci5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCYXNlSGVscGVyLmphdmEKaW5kZXggNTUxNzUzNi4uNmY2YzZlYiAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCYXNlSGVscGVyLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCYXNlSGVscGVyLmphdmEKQEAgLTI1LDEwICsyNSwxMSBAQAogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIGltcG9ydCBqYXZhLnV0aWwuU29ydGVkTWFwOwotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7CiBpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIAogcHVibGljIGZpbmFsIGNsYXNzIFRCYXNlSGVscGVyIHsKIApAQCAtNTMsNTcgKzU0LDI3IEBACiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG8oYm9vbGVhbiBhLCBib29sZWFuIGIpIHsKLSAgICByZXR1cm4gQm9vbGVhbi52YWx1ZU9mKGEpLmNvbXBhcmVUbyhiKTsKKyAgICByZXR1cm4gQm9vbGVhbi5jb21wYXJlKGEsIGIpOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVRvKGJ5dGUgYSwgYnl0ZSBiKSB7Ci0gICAgaWYgKGEgPCBiKSB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfSBlbHNlIGlmIChiIDwgYSkgewotICAgICAgcmV0dXJuIDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KKyAgICByZXR1cm4gQnl0ZS5jb21wYXJlKGEsIGIpOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVRvKHNob3J0IGEsIHNob3J0IGIpIHsKLSAgICBpZiAoYSA8IGIpIHsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9IGVsc2UgaWYgKGIgPCBhKSB7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQorICAgIHJldHVybiBTaG9ydC5jb21wYXJlKGEsYik7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG8oaW50IGEsIGludCBiKSB7Ci0gICAgaWYgKGEgPCBiKSB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfSBlbHNlIGlmIChiIDwgYSkgewotICAgICAgcmV0dXJuIDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KKyAgICByZXR1cm4gSW50ZWdlci5jb21wYXJlKGEsIGIpOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVRvKGxvbmcgYSwgbG9uZyBiKSB7Ci0gICAgaWYgKGEgPCBiKSB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfSBlbHNlIGlmIChiIDwgYSkgewotICAgICAgcmV0dXJuIDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KKyAgICByZXR1cm4gTG9uZy5jb21wYXJlKGEsIGIpOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVRvKGRvdWJsZSBhLCBkb3VibGUgYikgewotICAgIGlmIChhIDwgYikgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0gZWxzZSBpZiAoYiA8IGEpIHsKLSAgICAgIHJldHVybiAxOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9CisgICAgcmV0dXJuIERvdWJsZS5jb21wYXJlKGEsIGIpOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVRvKFN0cmluZyBhLCBTdHJpbmcgYikgewpAQCAtMTExLDE3ICs4MiwxNiBAQAogICB9CiAKICAgcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVRvKGJ5dGVbXSBhLCBieXRlW10gYikgewotICAgIGludCBzaXplQ29tcGFyZSA9IGNvbXBhcmVUbyhhLmxlbmd0aCwgYi5sZW5ndGgpOwotICAgIGlmIChzaXplQ29tcGFyZSAhPSAwKSB7Ci0gICAgICByZXR1cm4gc2l6ZUNvbXBhcmU7Ci0gICAgfQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykgewotICAgICAgaW50IGJ5dGVDb21wYXJlID0gY29tcGFyZVRvKGFbaV0sIGJbaV0pOwotICAgICAgaWYgKGJ5dGVDb21wYXJlICE9IDApIHsKLSAgICAgICAgcmV0dXJuIGJ5dGVDb21wYXJlOworICAgIGludCBjb21wYXJlID0gY29tcGFyZVRvKGEubGVuZ3RoLCBiLmxlbmd0aCk7CisgICAgaWYgKGNvbXBhcmUgPT0gMCkgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7CisgICAgICAgIGNvbXBhcmUgPSBjb21wYXJlVG8oYVtpXSwgYltpXSk7CisgICAgICAgIGlmIChjb21wYXJlICE9IDApIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gY29tcGFyZTsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmVUbyhDb21wYXJhYmxlIGEsIENvbXBhcmFibGUgYikgewpAQCAtMTI5LDQxICs5OSwzOSBAQAogICB9CiAKICAgcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVRvKExpc3QgYSwgTGlzdCBiKSB7Ci0gICAgaW50IGxhc3RDb21wYXJpc29uID0gY29tcGFyZVRvKGEuc2l6ZSgpLCBiLnNpemUoKSk7Ci0gICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKLSAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKLSAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhLnNpemUoKTsgaSsrKSB7Ci0gICAgICBsYXN0Q29tcGFyaXNvbiA9IGNvbXBhcmF0b3IuY29tcGFyZShhLmdldChpKSwgYi5nZXQoaSkpOwotICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKLSAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgIGludCBjb21wYXJlID0gY29tcGFyZVRvKGEuc2l6ZSgpLCBiLnNpemUoKSk7CisgICAgaWYgKGNvbXBhcmUgPT0gMCkgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbXBhcmUgPSBjb21wYXJhdG9yLmNvbXBhcmUoYS5nZXQoaSksIGIuZ2V0KGkpKTsKKyAgICAgICAgaWYgKGNvbXBhcmUgIT0gMCkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAgICAgICB9CiAgICAgfQotICAgIHJldHVybiAwOworICAgIHJldHVybiBjb21wYXJlOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVRvKFNldCBhLCBTZXQgYikgewotICAgIGludCBsYXN0Q29tcGFyaXNvbiA9IGNvbXBhcmVUbyhhLnNpemUoKSwgYi5zaXplKCkpOwotICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7Ci0gICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247Ci0gICAgfQotICAgIFNvcnRlZFNldCBzb3J0ZWRBID0gbmV3IFRyZWVTZXQoY29tcGFyYXRvcik7Ci0gICAgc29ydGVkQS5hZGRBbGwoYSk7Ci0gICAgU29ydGVkU2V0IHNvcnRlZEIgPSBuZXcgVHJlZVNldChjb21wYXJhdG9yKTsKLSAgICBzb3J0ZWRCLmFkZEFsbChiKTsKKyAgICBpbnQgY29tcGFyZSA9IGNvbXBhcmVUbyhhLnNpemUoKSwgYi5zaXplKCkpOworICAgIGlmIChjb21wYXJlID09IDApIHsKKyAgICAgIEFycmF5TGlzdCBzb3J0ZWRBID0gbmV3IEFycmF5TGlzdChhKTsKKyAgICAgIEFycmF5TGlzdCBzb3J0ZWRCID0gbmV3IEFycmF5TGlzdChiKTsKIAotICAgIEl0ZXJhdG9yIGl0ZXJBID0gc29ydGVkQS5pdGVyYXRvcigpOwotICAgIEl0ZXJhdG9yIGl0ZXJCID0gc29ydGVkQi5pdGVyYXRvcigpOworICAgICAgQ29sbGVjdGlvbnMuc29ydChzb3J0ZWRBLCBjb21wYXJhdG9yKTsKKyAgICAgIENvbGxlY3Rpb25zLnNvcnQoc29ydGVkQiwgY29tcGFyYXRvcik7CiAKLSAgICAvLyBDb21wYXJlIGVhY2ggaXRlbS4KLSAgICB3aGlsZSAoaXRlckEuaGFzTmV4dCgpICYmIGl0ZXJCLmhhc05leHQoKSkgewotICAgICAgbGFzdENvbXBhcmlzb24gPSBjb21wYXJhdG9yLmNvbXBhcmUoaXRlckEubmV4dCgpLCBpdGVyQi5uZXh0KCkpOwotICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKLSAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgICAgSXRlcmF0b3IgaXRlckEgPSBzb3J0ZWRBLml0ZXJhdG9yKCk7CisgICAgICBJdGVyYXRvciBpdGVyQiA9IHNvcnRlZEIuaXRlcmF0b3IoKTsKKworICAgICAgLy8gQ29tcGFyZSBlYWNoIGl0ZW0uCisgICAgICB3aGlsZSAoaXRlckEuaGFzTmV4dCgpICYmIGl0ZXJCLmhhc05leHQoKSkgeworICAgICAgICBjb21wYXJlID0gY29tcGFyYXRvci5jb21wYXJlKGl0ZXJBLm5leHQoKSwgaXRlckIubmV4dCgpKTsKKyAgICAgICAgaWYgKGNvbXBhcmUgIT0gMCkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAgICAgICB9CiAgICAgfQotCi0gICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIGNvbXBhcmU7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG8oTWFwIGEsIE1hcCBiKSB7CkBAIC0zMTYsMTIgKzI4NCwxNCBAQAogICB9CiAKICAgcHVibGljIHN0YXRpYyBieXRlW10gY29weUJpbmFyeShmaW5hbCBieXRlW10gb3JpZykgewotICAgIGlmIChvcmlnID09IG51bGwpIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KKyAgICByZXR1cm4gKG9yaWcgPT0gbnVsbCkgPyBudWxsIDogQXJyYXlzLmNvcHlPZihvcmlnLCBvcmlnLmxlbmd0aCk7CisgIH0KIAotICAgIGJ5dGVbXSBjb3B5ID0gbmV3IGJ5dGVbb3JpZy5sZW5ndGhdOwotICAgIFN5c3RlbS5hcnJheWNvcHkob3JpZywgMCwgY29weSwgMCwgb3JpZy5sZW5ndGgpOwotICAgIHJldHVybiBjb3B5OworICBwdWJsaWMgc3RhdGljIGludCBoYXNoQ29kZShsb25nIHZhbHVlKSB7CisgICAgcmV0dXJuIExvbmcuaGFzaENvZGUodmFsdWUpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBpbnQgaGFzaENvZGUoZG91YmxlIHZhbHVlKSB7CisgICAgcmV0dXJuIERvdWJsZS5oYXNoQ29kZSh2YWx1ZSk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQnl0ZUFycmF5T3V0cHV0U3RyZWFtLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJ5dGVBcnJheU91dHB1dFN0cmVhbS5qYXZhCmluZGV4IDFjMzdlY2QuLjNhMmQ1NmMgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQnl0ZUFycmF5T3V0cHV0U3RyZWFtLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCeXRlQXJyYXlPdXRwdXRTdHJlYW0uamF2YQpAQCAtMjAsNiArMjAsNyBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKIAogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKIAogLyoqCiAgKiBDbGFzcyB0aGF0IGFsbG93cyBhY2Nlc3MgdG8gdGhlIHVuZGVybHlpbmcgYnVmIHdpdGhvdXQgZG9pbmcgZGVlcApAQCAtNTMsNCArNTQsOCBAQAogICBwdWJsaWMgaW50IGxlbigpIHsKICAgICByZXR1cm4gY291bnQ7CiAgIH0KKworICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKENoYXJzZXQgY2hhcnNldCkgeworICAgIHJldHVybiBuZXcgU3RyaW5nKGJ1ZiwgMCwgY291bnQsIGNoYXJzZXQpOworICB9CiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVERlc2VyaWFsaXplci5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1REZXNlcmlhbGl6ZXIuamF2YQppbmRleCBiZjZjOTdjLi5kMWQzOTY2IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVERlc2VyaWFsaXplci5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9URGVzZXJpYWxpemVyLmphdmEKQEAgLTI1MSw0OCArMjUxLDMxIEBACiAgICAgdHJ5IHsKICAgICAgIFRGaWVsZCBmaWVsZCA9IGxvY2F0ZUZpZWxkKGJ5dGVzLCBmaWVsZElkUGF0aEZpcnN0LCBmaWVsZElkUGF0aFJlc3QpOwogICAgICAgaWYgKGZpZWxkICE9IG51bGwpIHsKLSAgICAgICAgLy8gaWYgdGhpcyBwb2ludCBpcyByZWFjaGVkLCBpcHJvdCB3aWxsIGJlIHBvc2l0aW9uZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBmaWVsZC4KLSAgICAgICAgc3dpdGNoKHR0eXBlKXsKKyAgICAgICAgaWYgKHR0eXBlID09IGZpZWxkLnR5cGUpIHsKKyAgICAgICAgICAvLyBpZiB0aGlzIHBvaW50IGlzIHJlYWNoZWQsIGlwcm90IHdpbGwgYmUgcG9zaXRpb25lZCBhdCB0aGUgc3RhcnQgb2YKKyAgICAgICAgICAvLyB0aGUgZmllbGQKKyAgICAgICAgICBzd2l0Y2ggKHR0eXBlKSB7CiAgICAgICAgICAgY2FzZSBUVHlwZS5CT09MOgotICAgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuQk9PTCl7Ci0gICAgICAgICAgICAgIHJldHVybiBwcm90b2NvbF8ucmVhZEJvb2woKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgcmV0dXJuIHByb3RvY29sXy5yZWFkQm9vbCgpOwogICAgICAgICAgIGNhc2UgVFR5cGUuQllURToKLSAgICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLkJZVEUpIHsKLSAgICAgICAgICAgICAgcmV0dXJuIHByb3RvY29sXy5yZWFkQnl0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICByZXR1cm4gcHJvdG9jb2xfLnJlYWRCeXRlKCk7CiAgICAgICAgICAgY2FzZSBUVHlwZS5ET1VCTEU6Ci0gICAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5ET1VCTEUpIHsKLSAgICAgICAgICAgICAgcmV0dXJuIHByb3RvY29sXy5yZWFkRG91YmxlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHJldHVybiBwcm90b2NvbF8ucmVhZERvdWJsZSgpOwogICAgICAgICAgIGNhc2UgVFR5cGUuSTE2OgotICAgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuSTE2KSB7Ci0gICAgICAgICAgICAgIHJldHVybiBwcm90b2NvbF8ucmVhZEkxNigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICByZXR1cm4gcHJvdG9jb2xfLnJlYWRJMTYoKTsKICAgICAgICAgICBjYXNlIFRUeXBlLkkzMjoKLSAgICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLkkzMikgewotICAgICAgICAgICAgICByZXR1cm4gcHJvdG9jb2xfLnJlYWRJMzIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgcmV0dXJuIHByb3RvY29sXy5yZWFkSTMyKCk7CiAgICAgICAgICAgY2FzZSBUVHlwZS5JNjQ6Ci0gICAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5JNjQpIHsKLSAgICAgICAgICAgICAgcmV0dXJuIHByb3RvY29sXy5yZWFkSTY0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHJldHVybiBwcm90b2NvbF8ucmVhZEk2NCgpOwogICAgICAgICAgIGNhc2UgVFR5cGUuU1RSSU5HOgotICAgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuU1RSSU5HKSB7Ci0gICAgICAgICAgICAgIHJldHVybiBwcm90b2NvbF8ucmVhZFN0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAxMDA6IC8vIGhhY2sgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHN0cmluZyBhbmQgYmluYXJ5Ci0gICAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5TVFJJTkcpIHsKLSAgICAgICAgICAgICAgcmV0dXJuIHByb3RvY29sXy5yZWFkQmluYXJ5KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHJldHVybiBwcm90b2NvbF8ucmVhZFN0cmluZygpOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gaGFjayB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gc3RyaW5nIGFuZCBiaW5hcnkKKyAgICAgICAgaWYgKHR0eXBlID09IDEwMCAmJiBmaWVsZC50eXBlID09IFRUeXBlLlNUUklORykgeworICAgICAgICAgIHJldHVybiBwcm90b2NvbF8ucmVhZEJpbmFyeSgpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgICByZXR1cm4gbnVsbDsKQEAgLTMwNywxMSArMjkwLDkgQEAKICAgcHJpdmF0ZSBURmllbGQgbG9jYXRlRmllbGQoYnl0ZVtdIGJ5dGVzLCBURmllbGRJZEVudW0gZmllbGRJZFBhdGhGaXJzdCwgVEZpZWxkSWRFbnVtIC4uLiBmaWVsZElkUGF0aFJlc3QpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICB0cmFuc18ucmVzZXQoYnl0ZXMpOwogCi0gICAgVEZpZWxkSWRFbnVtW10gZmllbGRJZFBhdGg9IG5ldyBURmllbGRJZEVudW1bZmllbGRJZFBhdGhSZXN0Lmxlbmd0aCArIDFdOworICAgIFRGaWVsZElkRW51bVtdIGZpZWxkSWRQYXRoID0gbmV3IFRGaWVsZElkRW51bVtmaWVsZElkUGF0aFJlc3QubGVuZ3RoICsgMV07CiAgICAgZmllbGRJZFBhdGhbMF0gPSBmaWVsZElkUGF0aEZpcnN0OwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRJZFBhdGhSZXN0Lmxlbmd0aDsgaSsrKXsKLSAgICAgIGZpZWxkSWRQYXRoW2kgKyAxXSA9IGZpZWxkSWRQYXRoUmVzdFtpXTsKLSAgICB9CisgICAgU3lzdGVtLmFycmF5Y29weShmaWVsZElkUGF0aFJlc3QsIDAsIGZpZWxkSWRQYXRoLCAxLCBmaWVsZElkUGF0aFJlc3QubGVuZ3RoKTsKIAogICAgIC8vIGluZGV4IGludG8gZmllbGQgSUQgcGF0aCBiZWluZyBjdXJyZW50bHkgc2VhcmNoZWQgZm9yCiAgICAgaW50IGN1clBhdGhJbmRleCA9IDA7CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEVudW1IZWxwZXIuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9URW51bUhlbHBlci5qYXZhCmluZGV4IGMxN2Q2NjEuLmZiYzc3ODcgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9URW51bUhlbHBlci5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9URW51bUhlbHBlci5qYXZhCkBAIC0xOSw3ICsxOSw2IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CiAKLWltcG9ydCBqYXZhLmxhbmcuSW5zdGFudGlhdGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmxhbmcuTm9TdWNoTWV0aG9kRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubGFuZy5JbGxlZ2FsQWNjZXNzRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVE11bHRpcGxleGVkUHJvY2Vzc29yLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVE11bHRpcGxleGVkUHJvY2Vzc29yLmphdmEKaW5kZXggZjY1NDdhYy4uZDBjNTYwMyAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuamF2YQpAQCAtNTIsNiArNTIsNyBAQAogCiAgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLFRQcm9jZXNzb3I+IFNFUlZJQ0VfUFJPQ0VTU09SX01BUAogICAgICAgICAgICAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsVFByb2Nlc3Nvcj4oKTsKKyAgICBwcml2YXRlIFRQcm9jZXNzb3IgZGVmYXVsdFByb2Nlc3NvcjsKIAogICAgIC8qKgogICAgICAqICdSZWdpc3RlcicgYSBzZXJ2aWNlIHdpdGggdGhpcyA8Y29kZT5UTXVsdGlwbGV4ZWRQcm9jZXNzb3I8L2NvZGU+LiAgVGhpcwpAQCAtNjgsNiArNjksMTQgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBSZWdpc3RlciBhIHNlcnZpY2UgdG8gYmUgY2FsbGVkIHRvIHByb2Nlc3MgcXVlcmllcyB3aXRob3V0IHNlcnZpY2UgbmFtZQorICAgICAqIEBwYXJhbSBwcm9jZXNzb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWdpc3RlckRlZmF1bHQoVFByb2Nlc3NvciBwcm9jZXNzb3IpIHsKKyAgICAgICAgZGVmYXVsdFByb2Nlc3NvciA9IHByb2Nlc3NvcjsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIDxjb2RlPnByb2Nlc3M8L2NvZGU+IHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgc3RlcHM6CiAgICAgICoKICAgICAgKiA8b2w+CkBAIC03Nyw3ICs4Niw3IEBACiAgICAgICogICAgIDxsaT5EaXNwYXRjaCB0byB0aGUgcHJvY2Vzc29yLCB3aXRoIGEgZGVjb3JhdGVkIGluc3RhbmNlIG9mIFRQcm90b2NvbAogICAgICAqICAgICAgICAgdGhhdCBhbGxvd3MgcmVhZE1lc3NhZ2VCZWdpbigpIHRvIHJldHVybiB0aGUgb3JpZ2luYWwgVE1lc3NhZ2UuPC9saT4KICAgICAgKiA8L29sPgotICAgICAqICAKKyAgICAgKgogICAgICAqIEB0aHJvd3MgVEV4Y2VwdGlvbiBJZiB0aGUgbWVzc2FnZSB0eXBlIGlzIG5vdCBDQUxMIG9yIE9ORVdBWSwgaWYKICAgICAgKiB0aGUgc2VydmljZSBuYW1lIHdhcyBub3QgZm91bmQgaW4gdGhlIG1lc3NhZ2UsIG9yIGlmIHRoZSBzZXJ2aWNlCiAgICAgICogbmFtZSB3YXMgbm90IGZvdW5kIGluIHRoZSBzZXJ2aWNlIG1hcC4gIFlvdSBjYWxsZWQge0BsaW5rICNyZWdpc3RlclByb2Nlc3NvcihTdHJpbmcsIFRQcm9jZXNzb3IpIHJlZ2lzdGVyUHJvY2Vzc29yfQpAQCAtOTIsMTQgKzEwMSwxNiBAQAogICAgICAgICBUTWVzc2FnZSBtZXNzYWdlID0gaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpOwogCiAgICAgICAgIGlmIChtZXNzYWdlLnR5cGUgIT0gVE1lc3NhZ2VUeXBlLkNBTEwgJiYgbWVzc2FnZS50eXBlICE9IFRNZXNzYWdlVHlwZS5PTkVXQVkpIHsKLSAgICAgICAgICAgIC8vIFRPRE8gQXBhY2hlIEd1eXMgLSBDYW4gdGhlIHNlcnZlciBldmVyIGdldCBhbiBFWENFUFRJT04gb3IgUkVQTFk/Ci0gICAgICAgICAgICAvLyBUT0RPIFNob3VsZCB3ZSBjaGVjayBmb3IgdGhpcyBoZXJlPwogICAgICAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIlRoaXMgc2hvdWxkIG5vdCBoYXZlIGhhcHBlbmVkIT8iKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIEV4dHJhY3QgdGhlIHNlcnZpY2UgbmFtZQogICAgICAgICBpbnQgaW5kZXggPSBtZXNzYWdlLm5hbWUuaW5kZXhPZihUTXVsdGlwbGV4ZWRQcm90b2NvbC5TRVBBUkFUT1IpOwogICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgaWYgKGRlZmF1bHRQcm9jZXNzb3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIERpc3BhdGNoIHByb2Nlc3NpbmcgdG8gdGhlIHN0b3JlZCBwcm9jZXNzb3IKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFByb2Nlc3Nvci5wcm9jZXNzKG5ldyBTdG9yZWRNZXNzYWdlUHJvdG9jb2woaXByb3QsIG1lc3NhZ2UpLCBvcHJvdCk7CisgICAgICAgICAgfQogICAgICAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIlNlcnZpY2UgbmFtZSBub3QgZm91bmQgaW4gbWVzc2FnZSBuYW1lOiAiICsgbWVzc2FnZS5uYW1lICsgIi4gIERpZCB5b3UgIiArCiAgICAgICAgICAgICAgICAgICAgICJmb3JnZXQgdG8gdXNlIGEgVE11bHRpcGxleFByb3RvY29sIGluIHlvdXIgY2xpZW50PyIpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVE5vbmJsb2NraW5nTXVsdGlGZXRjaENsaWVudC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1ROb25ibG9ja2luZ011bHRpRmV0Y2hDbGllbnQuamF2YQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVE5vbmJsb2NraW5nTXVsdGlGZXRjaFN0YXRzLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVE5vbmJsb2NraW5nTXVsdGlGZXRjaFN0YXRzLmphdmEKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RTZXJpYWxpemFibGUuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UU2VyaWFsaXphYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAwMDJjNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UU2VyaWFsaXphYmxlLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sOworCisvKioKKyAqIEdlbmVyaWMgYmFzZSBpbnRlcmZhY2UgZm9yIGdlbmVyYXRlZCBUaHJpZnQgb2JqZWN0cy4KKyAqCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVFNlcmlhbGl6YWJsZSB7CisKKyAgLyoqCisgICAqIFJlYWRzIHRoZSBUT2JqZWN0IGZyb20gdGhlIGdpdmVuIGlucHV0IHByb3RvY29sLgorICAgKgorICAgKiBAcGFyYW0gaXByb3QgSW5wdXQgcHJvdG9jb2wKKyAgICovCisgIHB1YmxpYyB2b2lkIHJlYWQoVFByb3RvY29sIGlwcm90KSB0aHJvd3MgVEV4Y2VwdGlvbjsKKworICAvKioKKyAgICogV3JpdGVzIHRoZSBvYmplY3RzIG91dCB0byB0aGUgcHJvdG9jb2wKKyAgICoKKyAgICogQHBhcmFtIG9wcm90IE91dHB1dCBwcm90b2NvbAorICAgKi8KKyAgcHVibGljIHZvaWQgd3JpdGUoVFByb3RvY29sIG9wcm90KSB0aHJvd3MgVEV4Y2VwdGlvbjsKKworfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RTZXJ2aWNlQ2xpZW50LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVFNlcnZpY2VDbGllbnQuamF2YQppbmRleCAyNTlhNTA3Li4wMGEzNmVlIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVFNlcnZpY2VDbGllbnQuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVFNlcnZpY2VDbGllbnQuamF2YQpAQCAtNzYsMTIgKzc2LDE0IEBACiAgIHByb3RlY3RlZCB2b2lkIHJlY2VpdmVCYXNlKFRCYXNlPD8sPz4gcmVzdWx0LCBTdHJpbmcgbWV0aG9kTmFtZSkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIFRNZXNzYWdlIG1zZyA9IGlwcm90Xy5yZWFkTWVzc2FnZUJlZ2luKCk7CiAgICAgaWYgKG1zZy50eXBlID09IFRNZXNzYWdlVHlwZS5FWENFUFRJT04pIHsKLSAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4ID0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uLnJlYWQoaXByb3RfKTsKKyAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbigpOworICAgICAgeC5yZWFkKGlwcm90Xyk7CiAgICAgICBpcHJvdF8ucmVhZE1lc3NhZ2VFbmQoKTsKICAgICAgIHRocm93IHg7CiAgICAgfQogICAgIGlmIChtc2cuc2VxaWQgIT0gc2VxaWRfKSB7Ci0gICAgICB0aHJvdyBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5CQURfU0VRVUVOQ0VfSUQsIG1ldGhvZE5hbWUgKyAiIGZhaWxlZDogb3V0IG9mIHNlcXVlbmNlIHJlc3BvbnNlIik7CisgICAgICB0aHJvdyBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5CQURfU0VRVUVOQ0VfSUQsCisgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiJXMgZmFpbGVkOiBvdXQgb2Ygc2VxdWVuY2UgcmVzcG9uc2U6IGV4cGVjdGVkICVkIGJ1dCBnb3QgJWQiLCBtZXRob2ROYW1lLCBzZXFpZF8sIG1zZy5zZXFpZCkpOwogICAgIH0KICAgICByZXN1bHQucmVhZChpcHJvdF8pOwogICAgIGlwcm90Xy5yZWFkTWVzc2FnZUVuZCgpOwpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RVbmlvbi5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RVbmlvbi5qYXZhCmluZGV4IDMwNTJlZTEuLjFlZjExZGYgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UVW5pb24uamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVFVuaW9uLmphdmEKQEAgLTM0LDcgKzM0LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuU3RhbmRhcmRTY2hlbWU7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLlR1cGxlU2NoZW1lOwogCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVFVuaW9uPFQgZXh0ZW5kcyBUVW5pb248Pyw/PiwgRiBleHRlbmRzIFRGaWVsZElkRW51bT4gaW1wbGVtZW50cyBUQmFzZTxULCBGPiB7CitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVFVuaW9uPFQgZXh0ZW5kcyBUVW5pb248VCxGPiwgRiBleHRlbmRzIFRGaWVsZElkRW51bT4gaW1wbGVtZW50cyBUQmFzZTxULCBGPiB7CiAKICAgcHJvdGVjdGVkIE9iamVjdCB2YWx1ZV87CiAgIHByb3RlY3RlZCBGIHNldEZpZWxkXzsKQEAgLTc5LDcgKzc5LDcgQEAKICAgfQogCiAgIHByaXZhdGUgc3RhdGljIE1hcCBkZWVwQ29weU1hcChNYXA8T2JqZWN0LCBPYmplY3Q+IG1hcCkgewotICAgIE1hcCBjb3B5ID0gbmV3IEhhc2hNYXAoKTsKKyAgICBNYXAgY29weSA9IG5ldyBIYXNoTWFwKG1hcC5zaXplKCkpOwogICAgIGZvciAoTWFwLkVudHJ5PE9iamVjdCwgT2JqZWN0PiBlbnRyeSA6IG1hcC5lbnRyeVNldCgpKSB7CiAgICAgICBjb3B5LnB1dChkZWVwQ29weU9iamVjdChlbnRyeS5nZXRLZXkoKSksIGRlZXBDb3B5T2JqZWN0KGVudHJ5LmdldFZhbHVlKCkpKTsKICAgICB9CkBAIC04Nyw3ICs4Nyw3IEBACiAgIH0KIAogICBwcml2YXRlIHN0YXRpYyBTZXQgZGVlcENvcHlTZXQoU2V0IHNldCkgewotICAgIFNldCBjb3B5ID0gbmV3IEhhc2hTZXQoKTsKKyAgICBTZXQgY29weSA9IG5ldyBIYXNoU2V0KHNldC5zaXplKCkpOwogICAgIGZvciAoT2JqZWN0IG8gOiBzZXQpIHsKICAgICAgIGNvcHkuYWRkKGRlZXBDb3B5T2JqZWN0KG8pKTsKICAgICB9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvYW5ub3RhdGlvbi9OdWxsYWJsZS5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2Fubm90YXRpb24vTnVsbGFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzRiMDFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2Fubm90YXRpb24vTnVsbGFibGUuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuYW5ub3RhdGlvbjsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKKworLyoqCisgKiBBbm5vdGF0aW9uIGluZGljYXRpbmcgYSBmaWVsZCwgbWV0aG9kIHJldHVybiwgb3IgbWV0aG9kIHBhcmFtZXRlciBtYXkgYmUge0Bjb2RlIG51bGx9LgorICogV2UgcGFja2FnZSBvdXIgb3duIGFubm90YXRpb24gdG8gYXZvaWQgYSBtYW5kYXRvcnkgdGhpcmQtcGFydHkgZGVwZW5kZW5jeS4KKyAqLworQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuQ0xBU1MpCitwdWJsaWMgQGludGVyZmFjZSBOdWxsYWJsZSB7CisKK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9hc3luYy9Bc3luY01ldGhvZENhbGxiYWNrLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvYXN5bmMvQXN5bmNNZXRob2RDYWxsYmFjay5qYXZhCmluZGV4IDAwMDA0YjcuLjRlYmRlMDcgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9hc3luYy9Bc3luY01ldGhvZENhbGxiYWNrLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2FzeW5jL0FzeW5jTWV0aG9kQ2FsbGJhY2suamF2YQpAQCAtMTgsMjIgKzE4LDM0IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuYXN5bmM7CiAKLQorLyoqCisgKiBBIGhhbmRsZXIgaW50ZXJmYWNlIGFzeW5jaHJvbm91cyBjbGllbnRzIGNhbiBpbXBsZW1lbnQgdG8gcmVjZWl2ZSBmdXR1cmUKKyAqIG5vdGljZSBvZiB0aGUgcmVzdWx0cyBvZiBhbiBhc3luY2hyb25vdXMgbWV0aG9kIGNhbGwuCisgKgorICogQHBhcmFtIDxUPiBUaGUgcmV0dXJuIHR5cGUgb2YgdGhlIGFzeW5jaHJvbm91c2x5IGludm9rZWQgbWV0aG9kLgorICovCiBwdWJsaWMgaW50ZXJmYWNlIEFzeW5jTWV0aG9kQ2FsbGJhY2s8VD4gewogICAvKioKICAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgcmVtb3RlIHNpZGUgaGFzIGNvbXBsZXRlZCBpbnZva2luZwotICAgKiB5b3VyIG1ldGhvZCBjYWxsIGFuZCB0aGUgcmVzdWx0IGlzIGZ1bGx5IHJlYWQuIEZvciBvbmV3YXkgbWV0aG9kIGNhbGxzLAotICAgKiB0aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBhcyBzb29uIGFzIHdlIGhhdmUgY29tcGxldGVkIHdyaXRpbmcgb3V0IHRoZQotICAgKiByZXF1ZXN0LgotICAgKiBAcGFyYW0gcmVzcG9uc2UKKyAgICogeW91ciBtZXRob2QgY2FsbCBhbmQgdGhlIHJlc3VsdCBpcyBmdWxseSByZWFkLiBGb3Ige0Bjb2RlIG9uZXdheX0gbWV0aG9kCisgICAqIGNhbGxzLCB0aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBhcyBzb29uIGFzIHdlIGhhdmUgY29tcGxldGVkIHdyaXRpbmcgb3V0CisgICAqIHRoZSByZXF1ZXN0LgorICAgKgorICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgYXN5bmNocm9ub3VzbHkgaW52b2tlZCBtZXRob2Q7CisgICAqICAgICAgICAgICAgICAgICB7QGNvZGUgbnVsbH0gZm9yIHZvaWQgbWV0aG9kcyB3aGljaCBpbmNsdWRlcworICAgKiAgICAgICAgICAgICAgICAge0Bjb2RlIG9uZXdheX0gbWV0aG9kcy4KICAgICovCi0gIHB1YmxpYyB2b2lkIG9uQ29tcGxldGUoVCByZXNwb25zZSk7CisgIHZvaWQgb25Db21wbGV0ZShUIHJlc3BvbnNlKTsKIAogICAvKioKLSAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGVyZSBpcyBhbiB1bmV4cGVjdGVkIGNsaWVudHNpZGUKLSAgICogZXhjZXB0aW9uLiBUaGlzIGRvZXMgbm90IGluY2x1ZGUgYXBwbGljYXRpb24tZGVmaW5lZCBleGNlcHRpb25zIHRoYXQKLSAgICogYXBwZWFyIGluIHRoZSBJREwsIGJ1dCByYXRoZXIgdGhpbmdzIGxpa2UgSU9FeGNlcHRpb25zLgotICAgKiBAcGFyYW0gZXhjZXB0aW9uCisgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlcmUgaXMgZWl0aGVyIGFuIHVuZXhwZWN0ZWQgY2xpZW50LXNpZGUKKyAgICogZXhjZXB0aW9uIGxpa2UgYW4gSU9FeGNlcHRpb24gb3IgZWxzZSB3aGVuIHRoZSByZW1vdGUgbWV0aG9kIHJhaXNlcyBhbgorICAgKiBleGNlcHRpb24sIGVpdGhlciBkZWNsYXJlZCBpbiB0aGUgSURMIG9yIGR1ZSB0byBhbiB1bmV4cGVjdGVkIHNlcnZlci1zaWRlCisgICAqIGVycm9yLgorICAgKgorICAgKiBAcGFyYW0gZXhjZXB0aW9uIFRoZSBleGNlcHRpb24gZW5jb3VudGVyZWQgcHJvY2Vzc2luZyB0aGUgdGhlIGFzeW5jaHJvbm91cworICAgKiAgICAgICAgICAgICAgICAgIG1ldGhvZCBjYWxsLCBtYXkgYmUgYSBsb2NhbCBleGNlcHRpb24gb3IgYW4gdW5tYXJzaGFsbGVkCisgICAqICAgICAgICAgICAgICAgICAgcmVtb3RlIGV4Y2VwdGlvbi4KICAgICovCi0gIHB1YmxpYyB2b2lkIG9uRXJyb3IoRXhjZXB0aW9uIGV4Y2VwdGlvbik7CisgIHZvaWQgb25FcnJvcihFeGNlcHRpb24gZXhjZXB0aW9uKTsKIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9hc3luYy9UQXN5bmNDbGllbnQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9hc3luYy9UQXN5bmNDbGllbnQuamF2YQppbmRleCA5YTIyNzE3Li4wMDUwMThhIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvYXN5bmMvVEFzeW5jQ2xpZW50LmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2FzeW5jL1RBc3luY0NsaWVudC5qYXZhCkBAIC02Niw3ICs2Niw3IEBACiAKICAgLyoqCiAgICAqIEdldCB0aGUgY2xpZW50J3MgZXJyb3IgLSByZXR1cm5zIG51bGwgaWYgbm8gZXJyb3IKLSAgICogQHJldHVybiBHZXQgdGhlIGNsaWVudCdzIGVycm9yLiA8YnIgLz4gcmV0dXJucyBudWxsIGlmIG5vIGVycm9yCisgICAqIEByZXR1cm4gR2V0IHRoZSBjbGllbnQncyBlcnJvci4gPHA+IHJldHVybnMgbnVsbCBpZiBubyBlcnJvcgogICAgKi8KICAgcHVibGljIEV4Y2VwdGlvbiBnZXRFcnJvcigpIHsKICAgICByZXR1cm4gX19fZXJyb3I7CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvYXN5bmMvVEFzeW5jTWV0aG9kQ2FsbC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2FzeW5jL1RBc3luY01ldGhvZENhbGwuamF2YQppbmRleCA1YzY3OWI2Li4zYmYxNzQ3IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvYXN5bmMvVEFzeW5jTWV0aG9kQ2FsbC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9hc3luYy9UQXN5bmNNZXRob2RDYWxsLmphdmEKQEAgLTMzLDExICszMywxNSBAQAogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uOwogCiAvKioKLSAqIEVuY2Fwc3VsYXRlcyBhbiBhc3luYyBtZXRob2QgY2FsbAorICogRW5jYXBzdWxhdGVzIGFuIGFzeW5jIG1ldGhvZCBjYWxsLgorICogPHA+CiAgKiBOZWVkIHRvIGdlbmVyYXRlOgotICogICAtIHByaXZhdGUgdm9pZCB3cml0ZV9hcmdzKFRQcm90b2NvbCBwcm90b2NvbCkKLSAqICAgLSBwdWJsaWMgVCBnZXRSZXN1bHQoKSB0aHJvd3MgPEV4Y2VwdGlvbl8xPiwgPEV4Y2VwdGlvbl8yPiwgLi4uCi0gKiBAcGFyYW0gPFQ+CisgKiA8dWw+CisgKiAgIDxsaT5wcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB3cml0ZV9hcmdzKFRQcm90b2NvbCBwcm90b2NvbCk8L2xpPgorICogICA8bGk+cHJvdGVjdGVkIGFic3RyYWN0IFQgZ2V0UmVzdWx0KCkgdGhyb3dzICZsdDtFeGNlcHRpb25fMSZndDssICZsdDtFeGNlcHRpb25fMiZndDssIC4uLjwvbGk+CisgKiA8L3VsPgorICoKKyAqIEBwYXJhbSA8VD4gVGhlIHJldHVybiB0eXBlIG9mIHRoZSBlbmNhcHN1bGF0ZWQgbWV0aG9kIGNhbGwuCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUQXN5bmNNZXRob2RDYWxsPFQ+IHsKIApAQCAtMTEzLDYgKzExNyw4IEBACiAKICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgd3JpdGVfYXJncyhUUHJvdG9jb2wgcHJvdG9jb2wpIHRocm93cyBURXhjZXB0aW9uOwogCisgIHByb3RlY3RlZCBhYnN0cmFjdCBUIGdldFJlc3VsdCgpIHRocm93cyBFeGNlcHRpb247CisKICAgLyoqCiAgICAqIEluaXRpYWxpemUgYnVmZmVycy4KICAgICogQHRocm93cyBURXhjZXB0aW9uIGlmIGJ1ZmZlciBpbml0aWFsaXphdGlvbiBmYWlscwpAQCAtMTY3LDcgKzE3Myw3IEBACiAgICAqIHNlbGVjdCBpbnRlcmVzdHMgd2l0aG91dCB3b3JyeWluZyBhYm91dCBjb25jdXJyZW5jeS4KICAgICogQHBhcmFtIGtleQogICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdHJhbnNpdGlvbihTZWxlY3Rpb25LZXkga2V5KSB7CisgIHZvaWQgdHJhbnNpdGlvbihTZWxlY3Rpb25LZXkga2V5KSB7CiAgICAgLy8gRW5zdXJlIGtleSBpcyB2YWxpZAogICAgIGlmICgha2V5LmlzVmFsaWQoKSkgewogICAgICAga2V5LmNhbmNlbCgpOwpAQCAtMjI1LDggKzIzMSwxNCBAQAogICAgIGtleS5pbnRlcmVzdE9wcygwKTsKICAgICAvLyB0aGlzIGVuc3VyZXMgdGhhdCB0aGUgVEFzeW5jTWV0aG9kIGluc3RhbmNlIGRvZXNuJ3QgaGFuZyBhcm91bmQKICAgICBrZXkuYXR0YWNoKG51bGwpOwotICAgIGNsaWVudC5vbkNvbXBsZXRlKCk7Ci0gICAgY2FsbGJhY2sub25Db21wbGV0ZSgoVCl0aGlzKTsKKyAgICB0cnkgeworICAgICAgVCByZXN1bHQgPSB0aGlzLmdldFJlc3VsdCgpOworICAgICAgY2xpZW50Lm9uQ29tcGxldGUoKTsKKyAgICAgIGNhbGxiYWNrLm9uQ29tcGxldGUocmVzdWx0KTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAga2V5LmNhbmNlbCgpOworICAgICAgb25FcnJvcihlKTsKKyAgICB9CiAgIH0KIAogICBwcml2YXRlIHZvaWQgZG9SZWFkaW5nUmVzcG9uc2VTaXplKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9TaG9ydFN0YWNrLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvU2hvcnRTdGFjay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNjU5MzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvU2hvcnRTdGFjay5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCisvKioKKyAqIFNob3J0U3RhY2sgaXMgYSBzaG9ydC1zcGVjaWZpYyBTdGFjayBpbXBsZW1lbnRhdGlvbiB3cml0dGVuIGZvciB0aGUgZXhwcmVzcworICogcHVycG9zZSBvZiB2ZXJ5IGZhc3Qgb3BlcmF0aW9ucyBvbiBUQ29tcGFjdFByb3RvY29sJ3MgZmllbGQgaWQgc3RhY2suIFRoaXMKKyAqIGltcGxlbWVudGF0aW9uIHBlcmZvcm1zIGF0IGxlYXN0IDEweCBmYXN0ZXIgdGhhbiBqYXZhLnV0aWwuU3RhY2suCisgKi8KK2NsYXNzIFNob3J0U3RhY2sgeworCisgIHByaXZhdGUgc2hvcnRbXSB2ZWN0b3I7CisKKyAgLyoqIEFsd2F5cyBwb2ludHMgdG8gdGhlIG5leHQgbG9jYXRpb24gKi8KKyAgcHJpdmF0ZSBpbnQgdG9wID0gMDsKKworICBwdWJsaWMgU2hvcnRTdGFjayhpbnQgaW5pdGlhbENhcGFjaXR5KSB7CisgICAgdmVjdG9yID0gbmV3IHNob3J0W2luaXRpYWxDYXBhY2l0eV07CisgIH0KKworICBwdWJsaWMgc2hvcnQgcG9wKCkgeworICAgIHJldHVybiB2ZWN0b3JbLS10b3BdOworICB9CisKKyAgcHVibGljIHZvaWQgcHVzaChzaG9ydCBwdXNoZWQpIHsKKyAgICBpZiAodmVjdG9yLmxlbmd0aCA9PSB0b3ApIHsKKyAgICAgIGdyb3coKTsKKyAgICB9CisgICAgdmVjdG9yW3RvcCsrXSA9IHB1c2hlZDsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBncm93KCkgeworICAgIHZlY3RvciA9IEFycmF5cy5jb3B5T2YodmVjdG9yLCB2ZWN0b3IubGVuZ3RoIDw8IDEpOworICB9CisKKyAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgdG9wID0gMDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgIHNiLmFwcGVuZCgiPFNob3J0U3RhY2sgdmVjdG9yOlsiKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHZlY3Rvci5sZW5ndGg7IGkrKykgeworICAgICAgYm9vbGVhbiBpc1RvcCA9IChpID09ICh0b3AgLSAxKSk7CisgICAgICBzaG9ydCB2YWx1ZSA9IHZlY3RvcltpXTsKKyAgICAgIGlmIChpICE9IDApIHsKKyAgICAgICAgc2IuYXBwZW5kKCcgJyk7CisgICAgICB9CisgICAgICBpZiAoaXNUb3ApIHsKKyAgICAgICAgc2IuYXBwZW5kKCI+PiIpLmFwcGVuZCh2YWx1ZSkuYXBwZW5kKCI8PCIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2IuYXBwZW5kKHZhbHVlKTsKKyAgICAgIH0KKyAgICB9CisgICAgc2IuYXBwZW5kKCJdPiIpOworICAgIHJldHVybiBzYi50b1N0cmluZygpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmphdmEKaW5kZXggNjViMzM1My4uNzkyNGUyZiAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuamF2YQpAQCAtMTksOCArMTksOCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOwogCi1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKQEAgLTUyLDYgKzUyLDggQEAKICAgcHJvdGVjdGVkIGJvb2xlYW4gc3RyaWN0UmVhZF87CiAgIHByb3RlY3RlZCBib29sZWFuIHN0cmljdFdyaXRlXzsKIAorICBwcml2YXRlIGZpbmFsIGJ5dGVbXSBpbm91dFRlbXAgPSBuZXcgYnl0ZVs4XTsKKwogICAvKioKICAgICogRmFjdG9yeQogICAgKi8KQEAgLTY5LDYgKzcxLDEwIEBACiAgICAgICB0aGlzKHN0cmljdFJlYWQsIHN0cmljdFdyaXRlLCBOT19MRU5HVEhfTElNSVQsIE5PX0xFTkdUSF9MSU1JVCk7CiAgICAgfQogCisgICAgcHVibGljIEZhY3RvcnkobG9uZyBzdHJpbmdMZW5ndGhMaW1pdCwgbG9uZyBjb250YWluZXJMZW5ndGhMaW1pdCkgeworICAgICAgdGhpcyhmYWxzZSwgdHJ1ZSwgc3RyaW5nTGVuZ3RoTGltaXQsIGNvbnRhaW5lckxlbmd0aExpbWl0KTsKKyAgICB9CisKICAgICBwdWJsaWMgRmFjdG9yeShib29sZWFuIHN0cmljdFJlYWQsIGJvb2xlYW4gc3RyaWN0V3JpdGUsIGxvbmcgc3RyaW5nTGVuZ3RoTGltaXQsIGxvbmcgY29udGFpbmVyTGVuZ3RoTGltaXQpIHsKICAgICAgIHN0cmluZ0xlbmd0aExpbWl0XyA9IHN0cmluZ0xlbmd0aExpbWl0OwogICAgICAgY29udGFpbmVyTGVuZ3RoTGltaXRfID0gY29udGFpbmVyTGVuZ3RoTGltaXQ7CkBAIC05Miw2ICs5OCwxMCBAQAogICAgIHRoaXModHJhbnMsIE5PX0xFTkdUSF9MSU1JVCwgTk9fTEVOR1RIX0xJTUlULCBzdHJpY3RSZWFkLCBzdHJpY3RXcml0ZSk7CiAgIH0KIAorICBwdWJsaWMgVEJpbmFyeVByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnMsIGxvbmcgc3RyaW5nTGVuZ3RoTGltaXQsIGxvbmcgY29udGFpbmVyTGVuZ3RoTGltaXQpIHsKKyAgICB0aGlzKHRyYW5zLCBzdHJpbmdMZW5ndGhMaW1pdCwgY29udGFpbmVyTGVuZ3RoTGltaXQsIGZhbHNlLCB0cnVlKTsKKyAgfQorCiAgIHB1YmxpYyBUQmluYXJ5UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucywgbG9uZyBzdHJpbmdMZW5ndGhMaW1pdCwgbG9uZyBjb250YWluZXJMZW5ndGhMaW1pdCwgYm9vbGVhbiBzdHJpY3RSZWFkLCBib29sZWFuIHN0cmljdFdyaXRlKSB7CiAgICAgc3VwZXIodHJhbnMpOwogICAgIHN0cmluZ0xlbmd0aExpbWl0XyA9IHN0cmluZ0xlbmd0aExpbWl0OwpAQCAtMTAwLDYgKzExMCw3IEBACiAgICAgc3RyaWN0V3JpdGVfID0gc3RyaWN0V3JpdGU7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UgbWVzc2FnZSkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGlmIChzdHJpY3RXcml0ZV8pIHsKICAgICAgIGludCB2ZXJzaW9uID0gVkVSU0lPTl8xIHwgbWVzc2FnZS50eXBlOwpAQCAtMTEzLDk4ICsxMjQsMTEwIEBACiAgICAgfQogICB9CiAKLSAgcHVibGljIHZvaWQgd3JpdGVNZXNzYWdlRW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHdyaXRlTWVzc2FnZUVuZCgpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKLSAgcHVibGljIHZvaWQgd3JpdGVTdHJ1Y3RCZWdpbihUU3RydWN0IHN0cnVjdCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHdyaXRlU3RydWN0QmVnaW4oVFN0cnVjdCBzdHJ1Y3QpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKLSAgcHVibGljIHZvaWQgd3JpdGVTdHJ1Y3RFbmQoKSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgd3JpdGVTdHJ1Y3RFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZUZpZWxkQmVnaW4oVEZpZWxkIGZpZWxkKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgd3JpdGVCeXRlKGZpZWxkLnR5cGUpOwogICAgIHdyaXRlSTE2KGZpZWxkLmlkKTsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHdyaXRlRmllbGRFbmQoKSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgd3JpdGVGaWVsZEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlRmllbGRTdG9wKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHdyaXRlQnl0ZShUVHlwZS5TVE9QKTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZU1hcEJlZ2luKFRNYXAgbWFwKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgd3JpdGVCeXRlKG1hcC5rZXlUeXBlKTsKICAgICB3cml0ZUJ5dGUobWFwLnZhbHVlVHlwZSk7CiAgICAgd3JpdGVJMzIobWFwLnNpemUpOwogICB9CiAKLSAgcHVibGljIHZvaWQgd3JpdGVNYXBFbmQoKSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgd3JpdGVNYXBFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZUxpc3RCZWdpbihUTGlzdCBsaXN0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgd3JpdGVCeXRlKGxpc3QuZWxlbVR5cGUpOwogICAgIHdyaXRlSTMyKGxpc3Quc2l6ZSk7CiAgIH0KIAotICBwdWJsaWMgdm9pZCB3cml0ZUxpc3RFbmQoKSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgd3JpdGVMaXN0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVTZXRCZWdpbihUU2V0IHNldCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHdyaXRlQnl0ZShzZXQuZWxlbVR5cGUpOwogICAgIHdyaXRlSTMyKHNldC5zaXplKTsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHdyaXRlU2V0RW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHdyaXRlU2V0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVCb29sKGJvb2xlYW4gYikgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHdyaXRlQnl0ZShiID8gKGJ5dGUpMSA6IChieXRlKTApOwogICB9CiAKLSAgcHJpdmF0ZSBieXRlIFtdIGJvdXQgPSBuZXcgYnl0ZVsxXTsKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlQnl0ZShieXRlIGIpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICBib3V0WzBdID0gYjsKLSAgICB0cmFuc18ud3JpdGUoYm91dCwgMCwgMSk7CisgICAgaW5vdXRUZW1wWzBdID0gYjsKKyAgICB0cmFuc18ud3JpdGUoaW5vdXRUZW1wLCAwLCAxKTsKICAgfQogCi0gIHByaXZhdGUgYnl0ZVtdIGkxNm91dCA9IG5ldyBieXRlWzJdOworICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVJMTYoc2hvcnQgaTE2KSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgaTE2b3V0WzBdID0gKGJ5dGUpKDB4ZmYgJiAoaTE2ID4+IDgpKTsKLSAgICBpMTZvdXRbMV0gPSAoYnl0ZSkoMHhmZiAmIChpMTYpKTsKLSAgICB0cmFuc18ud3JpdGUoaTE2b3V0LCAwLCAyKTsKKyAgICBpbm91dFRlbXBbMF0gPSAoYnl0ZSkoMHhmZiAmIChpMTYgPj4gOCkpOworICAgIGlub3V0VGVtcFsxXSA9IChieXRlKSgweGZmICYgKGkxNikpOworICAgIHRyYW5zXy53cml0ZShpbm91dFRlbXAsIDAsIDIpOwogICB9CiAKLSAgcHJpdmF0ZSBieXRlW10gaTMyb3V0ID0gbmV3IGJ5dGVbNF07CisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZUkzMihpbnQgaTMyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgaTMyb3V0WzBdID0gKGJ5dGUpKDB4ZmYgJiAoaTMyID4+IDI0KSk7Ci0gICAgaTMyb3V0WzFdID0gKGJ5dGUpKDB4ZmYgJiAoaTMyID4+IDE2KSk7Ci0gICAgaTMyb3V0WzJdID0gKGJ5dGUpKDB4ZmYgJiAoaTMyID4+IDgpKTsKLSAgICBpMzJvdXRbM10gPSAoYnl0ZSkoMHhmZiAmIChpMzIpKTsKLSAgICB0cmFuc18ud3JpdGUoaTMyb3V0LCAwLCA0KTsKKyAgICBpbm91dFRlbXBbMF0gPSAoYnl0ZSkoMHhmZiAmIChpMzIgPj4gMjQpKTsKKyAgICBpbm91dFRlbXBbMV0gPSAoYnl0ZSkoMHhmZiAmIChpMzIgPj4gMTYpKTsKKyAgICBpbm91dFRlbXBbMl0gPSAoYnl0ZSkoMHhmZiAmIChpMzIgPj4gOCkpOworICAgIGlub3V0VGVtcFszXSA9IChieXRlKSgweGZmICYgKGkzMikpOworICAgIHRyYW5zXy53cml0ZShpbm91dFRlbXAsIDAsIDQpOwogICB9CiAKLSAgcHJpdmF0ZSBieXRlW10gaTY0b3V0ID0gbmV3IGJ5dGVbOF07CisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZUk2NChsb25nIGk2NCkgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIGk2NG91dFswXSA9IChieXRlKSgweGZmICYgKGk2NCA+PiA1NikpOwotICAgIGk2NG91dFsxXSA9IChieXRlKSgweGZmICYgKGk2NCA+PiA0OCkpOwotICAgIGk2NG91dFsyXSA9IChieXRlKSgweGZmICYgKGk2NCA+PiA0MCkpOwotICAgIGk2NG91dFszXSA9IChieXRlKSgweGZmICYgKGk2NCA+PiAzMikpOwotICAgIGk2NG91dFs0XSA9IChieXRlKSgweGZmICYgKGk2NCA+PiAyNCkpOwotICAgIGk2NG91dFs1XSA9IChieXRlKSgweGZmICYgKGk2NCA+PiAxNikpOwotICAgIGk2NG91dFs2XSA9IChieXRlKSgweGZmICYgKGk2NCA+PiA4KSk7Ci0gICAgaTY0b3V0WzddID0gKGJ5dGUpKDB4ZmYgJiAoaTY0KSk7Ci0gICAgdHJhbnNfLndyaXRlKGk2NG91dCwgMCwgOCk7CisgICAgaW5vdXRUZW1wWzBdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDU2KSk7CisgICAgaW5vdXRUZW1wWzFdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDQ4KSk7CisgICAgaW5vdXRUZW1wWzJdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDQwKSk7CisgICAgaW5vdXRUZW1wWzNdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDMyKSk7CisgICAgaW5vdXRUZW1wWzRdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDI0KSk7CisgICAgaW5vdXRUZW1wWzVdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDE2KSk7CisgICAgaW5vdXRUZW1wWzZdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDgpKTsKKyAgICBpbm91dFRlbXBbN10gPSAoYnl0ZSkoMHhmZiAmIChpNjQpKTsKKyAgICB0cmFuc18ud3JpdGUoaW5vdXRUZW1wLCAwLCA4KTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZURvdWJsZShkb3VibGUgZHViKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgd3JpdGVJNjQoRG91YmxlLmRvdWJsZVRvTG9uZ0JpdHMoZHViKSk7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVTdHJpbmcoU3RyaW5nIHN0cikgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIHRyeSB7Ci0gICAgICBieXRlW10gZGF0ID0gc3RyLmdldEJ5dGVzKCJVVEYtOCIpOwotICAgICAgd3JpdGVJMzIoZGF0Lmxlbmd0aCk7Ci0gICAgICB0cmFuc18ud3JpdGUoZGF0LCAwLCBkYXQubGVuZ3RoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVleCkgewotICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIkpWTSBET0VTIE5PVCBTVVBQT1JUIFVURi04Iik7Ci0gICAgfQorICAgIGJ5dGVbXSBkYXQgPSBzdHIuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisgICAgd3JpdGVJMzIoZGF0Lmxlbmd0aCk7CisgICAgdHJhbnNfLndyaXRlKGRhdCwgMCwgZGF0Lmxlbmd0aCk7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVCaW5hcnkoQnl0ZUJ1ZmZlciBiaW4pIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBpbnQgbGVuZ3RoID0gYmluLmxpbWl0KCkgLSBiaW4ucG9zaXRpb24oKTsKICAgICB3cml0ZUkzMihsZW5ndGgpOwpAQCAtMjE1LDYgKzIzOCw3IEBACiAgICAqIFJlYWRpbmcgbWV0aG9kcy4KICAgICovCiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBUTWVzc2FnZSByZWFkTWVzc2FnZUJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGludCBzaXplID0gcmVhZEkzMigpOwogICAgIGlmIChzaXplIDwgMCkgewpAQCAtMjMxLDY0ICsyNTUsNzYgQEAKICAgICB9CiAgIH0KIAotICBwdWJsaWMgdm9pZCByZWFkTWVzc2FnZUVuZCgpIHt9CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCByZWFkTWVzc2FnZUVuZCgpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKLSAgcHVibGljIFRTdHJ1Y3QgcmVhZFN0cnVjdEJlZ2luKCkgeworICBAT3ZlcnJpZGUKKyAgcHVibGljIFRTdHJ1Y3QgcmVhZFN0cnVjdEJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHJldHVybiBBTk9OWU1PVVNfU1RSVUNUOwogICB9CiAKLSAgcHVibGljIHZvaWQgcmVhZFN0cnVjdEVuZCgpIHt9CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCByZWFkU3RydWN0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIFRGaWVsZCByZWFkRmllbGRCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBieXRlIHR5cGUgPSByZWFkQnl0ZSgpOwogICAgIHNob3J0IGlkID0gdHlwZSA9PSBUVHlwZS5TVE9QID8gMCA6IHJlYWRJMTYoKTsKICAgICByZXR1cm4gbmV3IFRGaWVsZCgiIiwgdHlwZSwgaWQpOwogICB9CiAKLSAgcHVibGljIHZvaWQgcmVhZEZpZWxkRW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJlYWRGaWVsZEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBUTWFwIHJlYWRNYXBCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBUTWFwIG1hcCA9IG5ldyBUTWFwKHJlYWRCeXRlKCksIHJlYWRCeXRlKCksIHJlYWRJMzIoKSk7CiAgICAgY2hlY2tDb250YWluZXJSZWFkTGVuZ3RoKG1hcC5zaXplKTsKICAgICByZXR1cm4gbWFwOwogICB9CiAKLSAgcHVibGljIHZvaWQgcmVhZE1hcEVuZCgpIHt9CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCByZWFkTWFwRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIFRMaXN0IHJlYWRMaXN0QmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgVExpc3QgbGlzdCA9IG5ldyBUTGlzdChyZWFkQnl0ZSgpLCByZWFkSTMyKCkpOwogICAgIGNoZWNrQ29udGFpbmVyUmVhZExlbmd0aChsaXN0LnNpemUpOwogICAgIHJldHVybiBsaXN0OwogICB9CiAKLSAgcHVibGljIHZvaWQgcmVhZExpc3RFbmQoKSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcmVhZExpc3RFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgVFNldCByZWFkU2V0QmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgVFNldCBzZXQgPSBuZXcgVFNldChyZWFkQnl0ZSgpLCByZWFkSTMyKCkpOwogICAgIGNoZWNrQ29udGFpbmVyUmVhZExlbmd0aChzZXQuc2l6ZSk7CiAgICAgcmV0dXJuIHNldDsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHJlYWRTZXRFbmQoKSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcmVhZFNldEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBib29sZWFuIHJlYWRCb29sKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHJldHVybiAocmVhZEJ5dGUoKSA9PSAxKTsKICAgfQogCi0gIHByaXZhdGUgYnl0ZVtdIGJpbiA9IG5ldyBieXRlWzFdOworICBAT3ZlcnJpZGUKICAgcHVibGljIGJ5dGUgcmVhZEJ5dGUoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgaWYgKHRyYW5zXy5nZXRCeXRlc1JlbWFpbmluZ0luQnVmZmVyKCkgPj0gMSkgewogICAgICAgYnl0ZSBiID0gdHJhbnNfLmdldEJ1ZmZlcigpW3RyYW5zXy5nZXRCdWZmZXJQb3NpdGlvbigpXTsKICAgICAgIHRyYW5zXy5jb25zdW1lQnVmZmVyKDEpOwogICAgICAgcmV0dXJuIGI7CiAgICAgfQotICAgIHJlYWRBbGwoYmluLCAwLCAxKTsKLSAgICByZXR1cm4gYmluWzBdOworICAgIHJlYWRBbGwoaW5vdXRUZW1wLCAwLCAxKTsKKyAgICByZXR1cm4gaW5vdXRUZW1wWzBdOwogICB9CiAKLSAgcHJpdmF0ZSBieXRlW10gaTE2cmQgPSBuZXcgYnl0ZVsyXTsKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBzaG9ydCByZWFkSTE2KCkgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIGJ5dGVbXSBidWYgPSBpMTZyZDsKKyAgICBieXRlW10gYnVmID0gaW5vdXRUZW1wOwogICAgIGludCBvZmYgPSAwOwogCiAgICAgaWYgKHRyYW5zXy5nZXRCeXRlc1JlbWFpbmluZ0luQnVmZmVyKCkgPj0gMikgewpAQCAtMjk2LDcgKzMzMiw3IEBACiAgICAgICBvZmYgPSB0cmFuc18uZ2V0QnVmZmVyUG9zaXRpb24oKTsKICAgICAgIHRyYW5zXy5jb25zdW1lQnVmZmVyKDIpOwogICAgIH0gZWxzZSB7Ci0gICAgICByZWFkQWxsKGkxNnJkLCAwLCAyKTsKKyAgICAgIHJlYWRBbGwoaW5vdXRUZW1wLCAwLCAyKTsKICAgICB9CiAKICAgICByZXR1cm4KQEAgLTMwNSw5ICszNDEsOSBAQAogICAgICAgICgoYnVmW29mZisxXSAmIDB4ZmYpKSk7CiAgIH0KIAotICBwcml2YXRlIGJ5dGVbXSBpMzJyZCA9IG5ldyBieXRlWzRdOworICBAT3ZlcnJpZGUKICAgcHVibGljIGludCByZWFkSTMyKCkgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIGJ5dGVbXSBidWYgPSBpMzJyZDsKKyAgICBieXRlW10gYnVmID0gaW5vdXRUZW1wOwogICAgIGludCBvZmYgPSAwOwogCiAgICAgaWYgKHRyYW5zXy5nZXRCeXRlc1JlbWFpbmluZ0luQnVmZmVyKCkgPj0gNCkgewpAQCAtMzE1LDcgKzM1MSw3IEBACiAgICAgICBvZmYgPSB0cmFuc18uZ2V0QnVmZmVyUG9zaXRpb24oKTsKICAgICAgIHRyYW5zXy5jb25zdW1lQnVmZmVyKDQpOwogICAgIH0gZWxzZSB7Ci0gICAgICByZWFkQWxsKGkzMnJkLCAwLCA0KTsKKyAgICAgIHJlYWRBbGwoaW5vdXRUZW1wLCAwLCA0KTsKICAgICB9CiAgICAgcmV0dXJuCiAgICAgICAoKGJ1ZltvZmZdICYgMHhmZikgPDwgMjQpIHwKQEAgLTMyNCw5ICszNjAsOSBAQAogICAgICAgKChidWZbb2ZmKzNdICYgMHhmZikpOwogICB9CiAKLSAgcHJpdmF0ZSBieXRlW10gaTY0cmQgPSBuZXcgYnl0ZVs4XTsKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBsb25nIHJlYWRJNjQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgYnl0ZVtdIGJ1ZiA9IGk2NHJkOworICAgIGJ5dGVbXSBidWYgPSBpbm91dFRlbXA7CiAgICAgaW50IG9mZiA9IDA7CiAKICAgICBpZiAodHJhbnNfLmdldEJ5dGVzUmVtYWluaW5nSW5CdWZmZXIoKSA+PSA4KSB7CkBAIC0zMzQsNyArMzcwLDcgQEAKICAgICAgIG9mZiA9IHRyYW5zXy5nZXRCdWZmZXJQb3NpdGlvbigpOwogICAgICAgdHJhbnNfLmNvbnN1bWVCdWZmZXIoOCk7CiAgICAgfSBlbHNlIHsKLSAgICAgIHJlYWRBbGwoaTY0cmQsIDAsIDgpOworICAgICAgcmVhZEFsbChpbm91dFRlbXAsIDAsIDgpOwogICAgIH0KIAogICAgIHJldHVybgpAQCAtMzQ4LDQ5ICszODQsMzkgQEAKICAgICAgICgobG9uZykoYnVmW29mZis3XSAmIDB4ZmYpKTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgZG91YmxlIHJlYWREb3VibGUoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgcmV0dXJuIERvdWJsZS5sb25nQml0c1RvRG91YmxlKHJlYWRJNjQoKSk7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIFN0cmluZyByZWFkU3RyaW5nKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGludCBzaXplID0gcmVhZEkzMigpOwogCiAgICAgY2hlY2tTdHJpbmdSZWFkTGVuZ3RoKHNpemUpOwotICAgIGlmIChzdHJpbmdMZW5ndGhMaW1pdF8gPiAwICYmIHNpemUgPiBzdHJpbmdMZW5ndGhMaW1pdF8pIHsKLSAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLlNJWkVfTElNSVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdHJpbmcgZmllbGQgZXhjZWVkZWQgc3RyaW5nIHNpemUgbGltaXQiKTsKLSAgICB9CiAKICAgICBpZiAodHJhbnNfLmdldEJ5dGVzUmVtYWluaW5nSW5CdWZmZXIoKSA+PSBzaXplKSB7Ci0gICAgICB0cnkgewotICAgICAgICBTdHJpbmcgcyA9IG5ldyBTdHJpbmcodHJhbnNfLmdldEJ1ZmZlcigpLCB0cmFuc18uZ2V0QnVmZmVyUG9zaXRpb24oKSwgc2l6ZSwgIlVURi04Iik7Ci0gICAgICAgIHRyYW5zXy5jb25zdW1lQnVmZmVyKHNpemUpOwotICAgICAgICByZXR1cm4gczsKLSAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiSlZNIERPRVMgTk9UIFNVUFBPUlQgVVRGLTgiKTsKLSAgICAgIH0KKyAgICAgIFN0cmluZyBzID0gbmV3IFN0cmluZyh0cmFuc18uZ2V0QnVmZmVyKCksIHRyYW5zXy5nZXRCdWZmZXJQb3NpdGlvbigpLAorICAgICAgICAgIHNpemUsIFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOworICAgICAgdHJhbnNfLmNvbnN1bWVCdWZmZXIoc2l6ZSk7CisgICAgICByZXR1cm4gczsKICAgICB9CiAKICAgICByZXR1cm4gcmVhZFN0cmluZ0JvZHkoc2l6ZSk7CiAgIH0KIAogICBwdWJsaWMgU3RyaW5nIHJlYWRTdHJpbmdCb2R5KGludCBzaXplKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgdHJ5IHsKLSAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtzaXplXTsKLSAgICAgIHRyYW5zXy5yZWFkQWxsKGJ1ZiwgMCwgc2l6ZSk7Ci0gICAgICByZXR1cm4gbmV3IFN0cmluZyhidWYsICJVVEYtOCIpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdWV4KSB7Ci0gICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiSlZNIERPRVMgTk9UIFNVUFBPUlQgVVRGLTgiKTsKLSAgICB9CisgICAgY2hlY2tTdHJpbmdSZWFkTGVuZ3RoKHNpemUpOworICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtzaXplXTsKKyAgICB0cmFuc18ucmVhZEFsbChidWYsIDAsIHNpemUpOworICAgIHJldHVybiBuZXcgU3RyaW5nKGJ1ZiwgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIEJ5dGVCdWZmZXIgcmVhZEJpbmFyeSgpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBpbnQgc2l6ZSA9IHJlYWRJMzIoKTsKIAotICAgIGlmIChzdHJpbmdMZW5ndGhMaW1pdF8gPiAwICYmIHNpemUgPiBzdHJpbmdMZW5ndGhMaW1pdF8pIHsKLSAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLlNJWkVfTElNSVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCaW5hcnkgZmllbGQgZXhjZWVkZWQgc3RyaW5nIHNpemUgbGltaXQiKTsKLSAgICB9CisgICAgY2hlY2tTdHJpbmdSZWFkTGVuZ3RoKHNpemUpOwogCiAgICAgaWYgKHRyYW5zXy5nZXRCeXRlc1JlbWFpbmluZ0luQnVmZmVyKCkgPj0gc2l6ZSkgewogICAgICAgQnl0ZUJ1ZmZlciBiYiA9IEJ5dGVCdWZmZXIud3JhcCh0cmFuc18uZ2V0QnVmZmVyKCksIHRyYW5zXy5nZXRCdWZmZXJQb3NpdGlvbigpLCBzaXplKTsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5qYXZhCmluZGV4IDU5NzNmY2QuLmVlMDU4NjkgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuamF2YQpAQCAtMjIsOCArMjIsOCBAQAogCiBpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOwogCi1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuU2hvcnRTdGFjazsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0OwogCkBAIC0zNyw2ICszNyw4IEBACiAgKiBhbmQgaTY0IGZpZWxkcyB5b3UgaGF2ZSwgdGhlIG1vcmUgYmVuZWZpdCB5b3UnbGwgc2VlLgogICovCiBwdWJsaWMgY2xhc3MgVENvbXBhY3RQcm90b2NvbCBleHRlbmRzIFRQcm90b2NvbCB7CisgIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGVbXSBFTVBUWV9CWVRFUyA9IG5ldyBieXRlWzBdOworICBwcml2YXRlIGZpbmFsIHN0YXRpYyBCeXRlQnVmZmVyIEVNUFRZX0JVRkZFUiA9IEJ5dGVCdWZmZXIud3JhcChFTVBUWV9CWVRFUyk7CiAKICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgbG9uZyBOT19MRU5HVEhfTElNSVQgPSAtMTsKIApAQCAtMTQ0LDYgKzE0NiwxMiBAQAogICBwcml2YXRlIGZpbmFsIGxvbmcgY29udGFpbmVyTGVuZ3RoTGltaXRfOwogCiAgIC8qKgorICAgKiBUZW1wb3JhcnkgYnVmZmVyIHVzZWQgZm9yIHZhcmlvdXMgb3BlcmF0aW9ucyB0aGF0IHdvdWxkIG90aGVyd2lzZSByZXF1aXJlIGEKKyAgICogc21hbGwgYWxsb2NhdGlvbi4KKyAgICovCisgIHByaXZhdGUgZmluYWwgYnl0ZVtdIHRlbXAgPSBuZXcgYnl0ZVsxMF07CisKKyAgLyoqCiAgICAqIENyZWF0ZSBhIFRDb21wYWN0UHJvdG9jb2wuCiAgICAqCiAgICAqIEBwYXJhbSB0cmFuc3BvcnQgdGhlIFRUcmFuc3BvcnQgb2JqZWN0IHRvIHJlYWQgZnJvbSBvciB3cml0ZSB0by4KQEAgLTE5NCw2ICsyMDIsNyBAQAogICAgKiBXcml0ZSBhIG1lc3NhZ2UgaGVhZGVyIHRvIHRoZSB3aXJlLiBDb21wYWN0IFByb3RvY29sIG1lc3NhZ2VzIGNvbnRhaW4gdGhlCiAgICAqIHByb3RvY29sIHZlcnNpb24gc28gd2UgY2FuIG1pZ3JhdGUgZm9yd2FyZHMgaW4gdGhlIGZ1dHVyZSBpZiBuZWVkIGJlLgogICAgKi8KKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIG1lc3NhZ2UpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICB3cml0ZUJ5dGVEaXJlY3QoUFJPVE9DT0xfSUQpOwogICAgIHdyaXRlQnl0ZURpcmVjdCgoVkVSU0lPTiAmIFZFUlNJT05fTUFTSykgfCAoKG1lc3NhZ2UudHlwZSA8PCBUWVBFX1NISUZUX0FNT1VOVCkgJiBUWVBFX01BU0spKTsKQEAgLTIwNiw2ICsyMTUsNyBAQAogICAgKiB1c2UgaXQgYXMgYW4gb3Bwb3J0dW5pdHkgdG8gcHV0IHNwZWNpYWwgcGxhY2Vob2xkZXIgbWFya2VycyBvbiB0aGUgZmllbGQKICAgICogc3RhY2sgc28gd2UgY2FuIGdldCB0aGUgZmllbGQgaWQgZGVsdGFzIGNvcnJlY3QuCiAgICAqLworICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVTdHJ1Y3RCZWdpbihUU3RydWN0IHN0cnVjdCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGxhc3RGaWVsZF8ucHVzaChsYXN0RmllbGRJZF8pOwogICAgIGxhc3RGaWVsZElkXyA9IDA7CkBAIC0yMjIsNyArMjMyLDcgQEAKIAogICAvKioKICAgICogV3JpdGUgYSBmaWVsZCBoZWFkZXIgY29udGFpbmluZyB0aGUgZmllbGQgaWQgYW5kIGZpZWxkIHR5cGUuIElmIHRoZQotICAgKiBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGN1cnJlbnQgZmllbGQgaWQgYW5kIHRoZSBsYXN0IG9uZSBpcyBzbWFsbCAoPCAxNSksCisgICAqIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgY3VycmVudCBmaWVsZCBpZCBhbmQgdGhlIGxhc3Qgb25lIGlzIHNtYWxsICgmbHQ7IDE1KSwKICAgICogdGhlbiB0aGUgZmllbGQgaWQgd2lsbCBiZSBlbmNvZGVkIGluIHRoZSA0IE1TQiBhcyBhIGRlbHRhLiBPdGhlcndpc2UsIHRoZQogICAgKiBmaWVsZCBpZCB3aWxsIGZvbGxvdyB0aGUgdHlwZSBoZWFkZXIgYXMgYSB6aWd6YWcgdmFyaW50LgogICAgKi8KQEAgLTM0MywyMSArMzUzLDE2IEBACiAgICAqIFdyaXRlIGEgZG91YmxlIHRvIHRoZSB3aXJlIGFzIDggYnl0ZXMuCiAgICAqLwogICBwdWJsaWMgdm9pZCB3cml0ZURvdWJsZShkb3VibGUgZHViKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgYnl0ZVtdIGRhdGEgPSBuZXcgYnl0ZVtdezAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9OwotICAgIGZpeGVkTG9uZ1RvQnl0ZXMoRG91YmxlLmRvdWJsZVRvTG9uZ0JpdHMoZHViKSwgZGF0YSwgMCk7Ci0gICAgdHJhbnNfLndyaXRlKGRhdGEpOworICAgIGZpeGVkTG9uZ1RvQnl0ZXMoRG91YmxlLmRvdWJsZVRvTG9uZ0JpdHMoZHViKSwgdGVtcCwgMCk7CisgICAgdHJhbnNfLndyaXRlKHRlbXAsIDAsIDgpOwogICB9CiAKICAgLyoqCiAgICAqIFdyaXRlIGEgc3RyaW5nIHRvIHRoZSB3aXJlIHdpdGggYSB2YXJpbnQgc2l6ZSBwcmVjZWRpbmcuCiAgICAqLwogICBwdWJsaWMgdm9pZCB3cml0ZVN0cmluZyhTdHJpbmcgc3RyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgdHJ5IHsKLSAgICAgIGJ5dGVbXSBieXRlcyA9IHN0ci5nZXRCeXRlcygiVVRGLTgiKTsKLSAgICAgIHdyaXRlQmluYXJ5KGJ5dGVzLCAwLCBieXRlcy5sZW5ndGgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIlVURi04IG5vdCBzdXBwb3J0ZWQhIik7Ci0gICAgfQorICAgIGJ5dGVbXSBieXRlcyA9IHN0ci5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKKyAgICB3cml0ZUJpbmFyeShieXRlcywgMCwgYnl0ZXMubGVuZ3RoKTsKICAgfQogCiAgIC8qKgpAQCAtNDA1LDQwICs0MTAsMzggQEAKICAgICogV3JpdGUgYW4gaTMyIGFzIGEgdmFyaW50LiBSZXN1bHRzIGluIDEtNSBieXRlcyBvbiB0aGUgd2lyZS4KICAgICogVE9ETzogbWFrZSBhIHBlcm1hbmVudCBidWZmZXIgbGlrZSB3cml0ZVZhcmludDY0PwogICAgKi8KLSAgYnl0ZVtdIGkzMmJ1ZiA9IG5ldyBieXRlWzVdOwogICBwcml2YXRlIHZvaWQgd3JpdGVWYXJpbnQzMihpbnQgbikgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGludCBpZHggPSAwOwogICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICBpZiAoKG4gJiB+MHg3RikgPT0gMCkgewotICAgICAgICBpMzJidWZbaWR4KytdID0gKGJ5dGUpbjsKKyAgICAgICAgdGVtcFtpZHgrK10gPSAoYnl0ZSluOwogICAgICAgICAvLyB3cml0ZUJ5dGVEaXJlY3QoKGJ5dGUpbik7CiAgICAgICAgIGJyZWFrOwogICAgICAgICAvLyByZXR1cm47CiAgICAgICB9IGVsc2UgewotICAgICAgICBpMzJidWZbaWR4KytdID0gKGJ5dGUpKChuICYgMHg3RikgfCAweDgwKTsKKyAgICAgICAgdGVtcFtpZHgrK10gPSAoYnl0ZSkoKG4gJiAweDdGKSB8IDB4ODApOwogICAgICAgICAvLyB3cml0ZUJ5dGVEaXJlY3QoKGJ5dGUpKChuICYgMHg3RikgfCAweDgwKSk7CiAgICAgICAgIG4gPj4+PSA3OwogICAgICAgfQogICAgIH0KLSAgICB0cmFuc18ud3JpdGUoaTMyYnVmLCAwLCBpZHgpOworICAgIHRyYW5zXy53cml0ZSh0ZW1wLCAwLCBpZHgpOwogICB9CiAKICAgLyoqCiAgICAqIFdyaXRlIGFuIGk2NCBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTEwIGJ5dGVzIG9uIHRoZSB3aXJlLgogICAgKi8KLSAgYnl0ZVtdIHZhcmludDY0b3V0ID0gbmV3IGJ5dGVbMTBdOwogICBwcml2YXRlIHZvaWQgd3JpdGVWYXJpbnQ2NChsb25nIG4pIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBpbnQgaWR4ID0gMDsKICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgaWYgKChuICYgfjB4N0ZMKSA9PSAwKSB7Ci0gICAgICAgIHZhcmludDY0b3V0W2lkeCsrXSA9IChieXRlKW47CisgICAgICAgIHRlbXBbaWR4KytdID0gKGJ5dGUpbjsKICAgICAgICAgYnJlYWs7CiAgICAgICB9IGVsc2UgewotICAgICAgICB2YXJpbnQ2NG91dFtpZHgrK10gPSAoKGJ5dGUpKChuICYgMHg3RikgfCAweDgwKSk7CisgICAgICAgIHRlbXBbaWR4KytdID0gKChieXRlKSgobiAmIDB4N0YpIHwgMHg4MCkpOwogICAgICAgICBuID4+Pj0gNzsKICAgICAgIH0KICAgICB9Ci0gICAgdHJhbnNfLndyaXRlKHZhcmludDY0b3V0LCAwLCBpZHgpOworICAgIHRyYW5zXy53cml0ZSh0ZW1wLCAwLCBpZHgpOwogICB9CiAKICAgLyoqCkBAIC00NzYsMTAgKzQ3OSw5IEBACiAgICAqIFdyaXRlcyBhIGJ5dGUgd2l0aG91dCBhbnkgcG9zc2liaWxpdHkgb2YgYWxsIHRoYXQgZmllbGQgaGVhZGVyIG5vbnNlbnNlLgogICAgKiBVc2VkIGludGVybmFsbHkgYnkgb3RoZXIgd3JpdGluZyBtZXRob2RzIHRoYXQga25vdyB0aGV5IG5lZWQgdG8gd3JpdGUgYSBieXRlLgogICAgKi8KLSAgcHJpdmF0ZSBieXRlW10gYnl0ZURpcmVjdEJ1ZmZlciA9IG5ldyBieXRlWzFdOwogICBwcml2YXRlIHZvaWQgd3JpdGVCeXRlRGlyZWN0KGJ5dGUgYikgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIGJ5dGVEaXJlY3RCdWZmZXJbMF0gPSBiOwotICAgIHRyYW5zXy53cml0ZShieXRlRGlyZWN0QnVmZmVyKTsKKyAgICB0ZW1wWzBdID0gYjsKKyAgICB0cmFuc18ud3JpdGUodGVtcCwgMCwgMSk7CiAgIH0KIAogICAvKioKQEAgLTYyMSw3ICs2MjMsNiBAQAogICAgIHJldHVybiByZWFkQnl0ZSgpID09IFR5cGVzLkJPT0xFQU5fVFJVRTsKICAgfQogCi0gIGJ5dGVbXSBieXRlUmF3QnVmID0gbmV3IGJ5dGVbMV07CiAgIC8qKgogICAgKiBSZWFkIGEgc2luZ2xlIGJ5dGUgb2ZmIHRoZSB3aXJlLiBOb3RoaW5nIGludGVyZXN0aW5nIGhlcmUuCiAgICAqLwpAQCAtNjMxLDggKzYzMiw4IEBACiAgICAgICBiID0gdHJhbnNfLmdldEJ1ZmZlcigpW3RyYW5zXy5nZXRCdWZmZXJQb3NpdGlvbigpXTsKICAgICAgIHRyYW5zXy5jb25zdW1lQnVmZmVyKDEpOwogICAgIH0gZWxzZSB7Ci0gICAgICB0cmFuc18ucmVhZEFsbChieXRlUmF3QnVmLCAwLCAxKTsKLSAgICAgIGIgPSBieXRlUmF3QnVmWzBdOworICAgICAgdHJhbnNfLnJlYWRBbGwodGVtcCwgMCwgMSk7CisgICAgICBiID0gdGVtcFswXTsKICAgICB9CiAgICAgcmV0dXJuIGI7CiAgIH0KQEAgLTY2Miw5ICs2NjMsOCBAQAogICAgKiBObyBtYWdpYyBoZXJlIC0ganVzdCByZWFkIGEgZG91YmxlIG9mZiB0aGUgd2lyZS4KICAgICovCiAgIHB1YmxpYyBkb3VibGUgcmVhZERvdWJsZSgpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICBieXRlW10gbG9uZ0JpdHMgPSBuZXcgYnl0ZVs4XTsKLSAgICB0cmFuc18ucmVhZEFsbChsb25nQml0cywgMCwgOCk7Ci0gICAgcmV0dXJuIERvdWJsZS5sb25nQml0c1RvRG91YmxlKGJ5dGVzVG9Mb25nKGxvbmdCaXRzKSk7CisgICAgdHJhbnNfLnJlYWRBbGwodGVtcCwgMCwgOCk7CisgICAgcmV0dXJuIERvdWJsZS5sb25nQml0c1RvRG91YmxlKGJ5dGVzVG9Mb25nKHRlbXApKTsKICAgfQogCiAgIC8qKgpAQCAtNjc4LDE3ICs2NzgsMTUgQEAKICAgICAgIHJldHVybiAiIjsKICAgICB9CiAKLSAgICB0cnkgewotICAgICAgaWYgKHRyYW5zXy5nZXRCeXRlc1JlbWFpbmluZ0luQnVmZmVyKCkgPj0gbGVuZ3RoKSB7Ci0gICAgICAgIFN0cmluZyBzdHIgPSBuZXcgU3RyaW5nKHRyYW5zXy5nZXRCdWZmZXIoKSwgdHJhbnNfLmdldEJ1ZmZlclBvc2l0aW9uKCksIGxlbmd0aCwgIlVURi04Iik7Ci0gICAgICAgIHRyYW5zXy5jb25zdW1lQnVmZmVyKGxlbmd0aCk7Ci0gICAgICAgIHJldHVybiBzdHI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhyZWFkQmluYXJ5KGxlbmd0aCksICJVVEYtOCIpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIlVURi04IG5vdCBzdXBwb3J0ZWQhIik7CisgICAgZmluYWwgU3RyaW5nIHN0cjsKKyAgICBpZiAodHJhbnNfLmdldEJ5dGVzUmVtYWluaW5nSW5CdWZmZXIoKSA+PSBsZW5ndGgpIHsKKyAgICAgIHN0ciA9IG5ldyBTdHJpbmcodHJhbnNfLmdldEJ1ZmZlcigpLCB0cmFuc18uZ2V0QnVmZmVyUG9zaXRpb24oKSwKKyAgICAgICAgICBsZW5ndGgsIFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOworICAgICAgdHJhbnNfLmNvbnN1bWVCdWZmZXIobGVuZ3RoKTsKKyAgICB9IGVsc2UgeworICAgICAgc3RyID0gbmV3IFN0cmluZyhyZWFkQmluYXJ5KGxlbmd0aCksIFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOwogICAgIH0KKyAgICByZXR1cm4gc3RyOwogICB9CiAKICAgLyoqCkBAIC02OTcsNyArNjk1LDcgQEAKICAgcHVibGljIEJ5dGVCdWZmZXIgcmVhZEJpbmFyeSgpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBpbnQgbGVuZ3RoID0gcmVhZFZhcmludDMyKCk7CiAgICAgY2hlY2tTdHJpbmdSZWFkTGVuZ3RoKGxlbmd0aCk7Ci0gICAgaWYgKGxlbmd0aCA9PSAwKSByZXR1cm4gQnl0ZUJ1ZmZlci53cmFwKG5ldyBieXRlWzBdKTsKKyAgICBpZiAobGVuZ3RoID09IDApIHJldHVybiBFTVBUWV9CVUZGRVI7CiAKICAgICBpZiAodHJhbnNfLmdldEJ5dGVzUmVtYWluaW5nSW5CdWZmZXIoKSA+PSBsZW5ndGgpIHsKICAgICAgIEJ5dGVCdWZmZXIgYmIgPSBCeXRlQnVmZmVyLndyYXAodHJhbnNfLmdldEJ1ZmZlcigpLCB0cmFuc18uZ2V0QnVmZmVyUG9zaXRpb24oKSwgbGVuZ3RoKTsKQEAgLTcxNCw3ICs3MTIsNyBAQAogICAgKiBSZWFkIGEgYnl0ZVtdIG9mIGEga25vd24gbGVuZ3RoIGZyb20gdGhlIHdpcmUuCiAgICAqLwogICBwcml2YXRlIGJ5dGVbXSByZWFkQmluYXJ5KGludCBsZW5ndGgpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICBpZiAobGVuZ3RoID09IDApIHJldHVybiBuZXcgYnl0ZVswXTsKKyAgICBpZiAobGVuZ3RoID09IDApIHJldHVybiBFTVBUWV9CWVRFUzsKIAogICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtsZW5ndGhdOwogICAgIHRyYW5zXy5yZWFkQWxsKGJ1ZiwgMCwgbGVuZ3RoKTsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5qYXZhCmluZGV4IGY1MTMyMmMuLmQzN2M0OTMgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuamF2YQpAQCAtMTksOCArMTksMTAgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKIAotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLlN0YWNrOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEJ5dGVBcnJheU91dHB1dFN0cmVhbTsKQEAgLTMwNiw2ICszMDgsMTMgQEAKICAgICBjb250ZXh0XyA9IGNvbnRleHRTdGFja18ucG9wKCk7CiAgIH0KIAorICAvLyBSZXNldCB0aGUgY29udGV4dCBzdGFjayB0byBpdHMgaW5pdGlhbCBzdGF0ZQorICBwcml2YXRlIHZvaWQgcmVzZXRDb250ZXh0KCkgeworICAgIHdoaWxlICghY29udGV4dFN0YWNrXy5pc0VtcHR5KCkpIHsKKyAgICAgIHBvcENvbnRleHQoKTsKKyAgICB9CisgIH0KKwogICAvKioKICAgICogQ29uc3RydWN0b3IKICAgICovCkBAIC00MDksMTIgKzQxOCw4IEBACiAgICAgaWYgKGVzY2FwZU51bSkgewogICAgICAgdHJhbnNfLndyaXRlKFFVT1RFKTsKICAgICB9Ci0gICAgdHJ5IHsKLSAgICAgIGJ5dGVbXSBidWYgPSBzdHIuZ2V0Qnl0ZXMoIlVURi04Iik7Ci0gICAgICB0cmFuc18ud3JpdGUoYnVmKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVleCkgewotICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIkpWTSBET0VTIE5PVCBTVVBQT1JUIFVURi04Iik7Ci0gICAgfQorICAgIGJ5dGVbXSBidWYgPSBzdHIuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisgICAgdHJhbnNfLndyaXRlKGJ1Zik7CiAgICAgaWYgKGVzY2FwZU51bSkgewogICAgICAgdHJhbnNfLndyaXRlKFFVT1RFKTsKICAgICB9CkBAIC00NDQsMTIgKzQ0OSw4IEBACiAgICAgaWYgKGVzY2FwZU51bSkgewogICAgICAgdHJhbnNfLndyaXRlKFFVT1RFKTsKICAgICB9Ci0gICAgdHJ5IHsKLSAgICAgIGJ5dGVbXSBiID0gc3RyLmdldEJ5dGVzKCJVVEYtOCIpOwotICAgICAgdHJhbnNfLndyaXRlKGIsIDAsIGIubGVuZ3RoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVleCkgewotICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIkpWTSBET0VTIE5PVCBTVVBQT1JUIFVURi04Iik7Ci0gICAgfQorICAgIGJ5dGVbXSBiID0gc3RyLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOworICAgIHRyYW5zXy53cml0ZShiLCAwLCBiLmxlbmd0aCk7CiAgICAgaWYgKGVzY2FwZU51bSkgewogICAgICAgdHJhbnNfLndyaXRlKFFVT1RFKTsKICAgICB9CkBAIC01MDEsMTQgKzUwMiwxMSBAQAogCiAgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZSBtZXNzYWdlKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgcmVzZXRDb250ZXh0KCk7IC8vIFRIUklGVC0zNzQzCiAgICAgd3JpdGVKU09OQXJyYXlTdGFydCgpOwogICAgIHdyaXRlSlNPTkludGVnZXIoVkVSU0lPTik7Ci0gICAgdHJ5IHsKLSAgICAgIGJ5dGVbXSBiID0gbWVzc2FnZS5uYW1lLmdldEJ5dGVzKCJVVEYtOCIpOwotICAgICAgd3JpdGVKU09OU3RyaW5nKGIpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdWV4KSB7Ci0gICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiSlZNIERPRVMgTk9UIFNVUFBPUlQgVVRGLTgiKTsKLSAgICB9CisgICAgYnl0ZVtdIGIgPSBtZXNzYWdlLm5hbWUuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisgICAgd3JpdGVKU09OU3RyaW5nKGIpOwogICAgIHdyaXRlSlNPTkludGVnZXIobWVzc2FnZS50eXBlKTsKICAgICB3cml0ZUpTT05JbnRlZ2VyKG1lc3NhZ2Uuc2VxaWQpOwogICB9CkBAIC02MTgsMTIgKzYxNiw4IEBACiAKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlU3RyaW5nKFN0cmluZyBzdHIpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICB0cnkgewotICAgICAgYnl0ZVtdIGIgPSBzdHIuZ2V0Qnl0ZXMoIlVURi04Iik7Ci0gICAgICB3cml0ZUpTT05TdHJpbmcoYik7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZXgpIHsKLSAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJKVk0gRE9FUyBOT1QgU1VQUE9SVCBVVEYtOCIpOwotICAgIH0KKyAgICBieXRlW10gYiA9IHN0ci5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKKyAgICB3cml0ZUpTT05TdHJpbmcoYik7CiAgIH0KIAogICBAT3ZlcnJpZGUKQEAgLTY0MCw2ICs2MzQsNyBAQAogICBwcml2YXRlIFRCeXRlQXJyYXlPdXRwdXRTdHJlYW0gcmVhZEpTT05TdHJpbmcoYm9vbGVhbiBza2lwQ29udGV4dCkKICAgICB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgVEJ5dGVBcnJheU91dHB1dFN0cmVhbSBhcnIgPSBuZXcgVEJ5dGVBcnJheU91dHB1dFN0cmVhbShERUZfU1RSSU5HX1NJWkUpOworICAgIEFycmF5TGlzdDxDaGFyYWN0ZXI+IGNvZGV1bml0cyA9IG5ldyBBcnJheUxpc3Q8Q2hhcmFjdGVyPigpOwogICAgIGlmICghc2tpcENvbnRleHQpIHsKICAgICAgIGNvbnRleHRfLnJlYWQoKTsKICAgICB9CkBAIC02NTIsMTAgKzY0Nyw0MSBAQAogICAgICAgaWYgKGNoID09IEVTQ1NFUVswXSkgewogICAgICAgICBjaCA9IHJlYWRlcl8ucmVhZCgpOwogICAgICAgICBpZiAoY2ggPT0gRVNDU0VRWzFdKSB7Ci0gICAgICAgICAgcmVhZEpTT05TeW50YXhDaGFyKFpFUk8pOwotICAgICAgICAgIHJlYWRKU09OU3ludGF4Q2hhcihaRVJPKTsKLSAgICAgICAgICB0cmFuc18ucmVhZEFsbCh0bXBidWZfLCAwLCAyKTsKLSAgICAgICAgICBjaCA9IChieXRlKSgoaGV4VmFsKChieXRlKXRtcGJ1Zl9bMF0pIDw8IDQpICsgaGV4VmFsKHRtcGJ1Zl9bMV0pKTsKKyAgICAgICAgICB0cmFuc18ucmVhZEFsbCh0bXBidWZfLCAwLCA0KTsKKyAgICAgICAgICBzaG9ydCBjdSA9IChzaG9ydCkoCisgICAgICAgICAgICAgICgoc2hvcnQpaGV4VmFsKHRtcGJ1Zl9bMF0pIDw8IDEyKSArCisgICAgICAgICAgICAgICgoc2hvcnQpaGV4VmFsKHRtcGJ1Zl9bMV0pIDw8IDgpICsKKyAgICAgICAgICAgICAgKChzaG9ydCloZXhWYWwodG1wYnVmX1syXSkgPDwgNCkgKworICAgICAgICAgICAgICAoc2hvcnQpaGV4VmFsKHRtcGJ1Zl9bM10pKTsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKENoYXJhY3Rlci5pc0hpZ2hTdXJyb2dhdGUoKGNoYXIpY3UpKSB7CisgICAgICAgICAgICAgIGlmIChjb2RldW5pdHMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGxvdyBzdXJyb2dhdGUgY2hhciIpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGNvZGV1bml0cy5hZGQoKGNoYXIpY3UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoQ2hhcmFjdGVyLmlzTG93U3Vycm9nYXRlKChjaGFyKWN1KSkgeworICAgICAgICAgICAgICBpZiAoY29kZXVuaXRzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgaGlnaCBzdXJyb2dhdGUgY2hhciIpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgY29kZXVuaXRzLmFkZCgoY2hhciljdSk7CisgICAgICAgICAgICAgIGFyci53cml0ZSgKKyAgICAgICAgICAgICAgICAgIChuZXcgU3RyaW5nKG5ldyBpbnRbXSB7IGNvZGV1bml0cy5nZXQoMCksIGNvZGV1bml0cy5nZXQoMSkgfSwKKyAgICAgICAgICAgICAgICAgICAgICAwLCAyKSkuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkpOworICAgICAgICAgICAgICBjb2RldW5pdHMuY2xlYXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICBhcnIud3JpdGUoKG5ldyBTdHJpbmcobmV3IGludFtdIHsgY3UgfSwgMCwgMSkpCisgICAgICAgICAgICAgICAgICAuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAiSW52YWxpZCB1bmljb2RlIHNlcXVlbmNlIik7CisgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGVsc2UgewogICAgICAgICAgIGludCBvZmYgPSBFU0NBUEVfQ0hBUlMuaW5kZXhPZihjaCk7CkBAIC03MzMsMTkgKzc1OSwxNCBAQAogICAgIGNvbnRleHRfLnJlYWQoKTsKICAgICBpZiAocmVhZGVyXy5wZWVrKCkgPT0gUVVPVEVbMF0pIHsKICAgICAgIFRCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYXJyID0gcmVhZEpTT05TdHJpbmcodHJ1ZSk7Ci0gICAgICB0cnkgewotICAgICAgICBkb3VibGUgZHViID0gRG91YmxlLnZhbHVlT2YoYXJyLnRvU3RyaW5nKCJVVEYtOCIpKTsKLSAgICAgICAgaWYgKCFjb250ZXh0Xy5lc2NhcGVOdW0oKSAmJiAhRG91YmxlLmlzTmFOKGR1YikgJiYKLSAgICAgICAgICAgICFEb3VibGUuaXNJbmZpbml0ZShkdWIpKSB7Ci0gICAgICAgICAgLy8gVGhyb3cgZXhjZXB0aW9uIC0tIHdlIHNob3VsZCBub3QgYmUgaW4gYSBzdHJpbmcgaW4gdGhpcyBjYXNlCi0gICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk51bWVyaWMgZGF0YSB1bmV4cGVjdGVkbHkgcXVvdGVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGR1YjsKKyAgICAgIGRvdWJsZSBkdWIgPSBEb3VibGUudmFsdWVPZihhcnIudG9TdHJpbmcoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkpOworICAgICAgaWYgKCFjb250ZXh0Xy5lc2NhcGVOdW0oKSAmJiAhRG91YmxlLmlzTmFOKGR1YikKKyAgICAgICAgICAmJiAhRG91YmxlLmlzSW5maW5pdGUoZHViKSkgeworICAgICAgICAvLyBUaHJvdyBleGNlcHRpb24gLS0gd2Ugc2hvdWxkIG5vdCBiZSBpbiBhIHN0cmluZyBpbiB0aGlzIGNhc2UKKyAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgIk51bWVyaWMgZGF0YSB1bmV4cGVjdGVkbHkgcXVvdGVkIik7CiAgICAgICB9Ci0gICAgICBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBleCkgewotICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiSlZNIERPRVMgTk9UIFNVUFBPUlQgVVRGLTgiKTsKLSAgICAgIH0KKyAgICAgIHJldHVybiBkdWI7CiAgICAgfQogICAgIGVsc2UgewogICAgICAgaWYgKGNvbnRleHRfLmVzY2FwZU51bSgpKSB7CkBAIC03NjksNiArNzkwLDExIEBACiAgICAgaW50IGxlbiA9IGFyci5sZW4oKTsKICAgICBpbnQgb2ZmID0gMDsKICAgICBpbnQgc2l6ZSA9IDA7CisgICAgLy8gSWdub3JlIHBhZGRpbmcKKyAgICBpbnQgYm91bmQgPSBsZW4gPj0gMiA/IGxlbiAtIDIgOiAwOworICAgIGZvciAoaW50IGkgPSBsZW4gLSAxOyBpID49IGJvdW5kICYmIGJbaV0gPT0gJz0nOyAtLWkpIHsKKyAgICAgIC0tbGVuOworICAgIH0KICAgICB3aGlsZSAobGVuID49IDQpIHsKICAgICAgIC8vIERlY29kZSA0IGJ5dGVzIGF0IGEgdGltZQogICAgICAgVEJhc2U2NFV0aWxzLmRlY29kZShiLCBvZmYsIDQsIGIsIHNpemUpOyAvLyBOQjogZGVjb2RlZCBpbiBwbGFjZQpAQCAtODEzLDE4ICs4MzksMTMgQEAKIAogICBAT3ZlcnJpZGUKICAgcHVibGljIFRNZXNzYWdlIHJlYWRNZXNzYWdlQmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgcmVzZXRDb250ZXh0KCk7IC8vIFRIUklGVC0zNzQzCiAgICAgcmVhZEpTT05BcnJheVN0YXJ0KCk7CiAgICAgaWYgKHJlYWRKU09OSW50ZWdlcigpICE9IFZFUlNJT04pIHsKICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLkJBRF9WRVJTSU9OLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWVzc2FnZSBjb250YWluZWQgYmFkIHZlcnNpb24uIik7CiAgICAgfQotICAgIFN0cmluZyBuYW1lOwotICAgIHRyeSB7Ci0gICAgICBuYW1lID0gcmVhZEpTT05TdHJpbmcoZmFsc2UpLnRvU3RyaW5nKCJVVEYtOCIpOwotICAgIH0KLSAgICBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBleCkgewotICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIkpWTSBET0VTIE5PVCBTVVBQT1JUIFVURi04Iik7Ci0gICAgfQorICAgIFN0cmluZyBuYW1lID0gcmVhZEpTT05TdHJpbmcoZmFsc2UpLnRvU3RyaW5nKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOwogICAgIGJ5dGUgdHlwZSA9IChieXRlKSByZWFkSlNPTkludGVnZXIoKTsKICAgICBpbnQgc2VxaWQgPSAoaW50KSByZWFkSlNPTkludGVnZXIoKTsKICAgICByZXR1cm4gbmV3IFRNZXNzYWdlKG5hbWUsIHR5cGUsIHNlcWlkKTsKQEAgLTk0MSwxMiArOTYyLDcgQEAKIAogICBAT3ZlcnJpZGUKICAgcHVibGljIFN0cmluZyByZWFkU3RyaW5nKCkgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIHRyeSB7Ci0gICAgICByZXR1cm4gcmVhZEpTT05TdHJpbmcoZmFsc2UpLnRvU3RyaW5nKCJVVEYtOCIpOwotICAgIH0KLSAgICBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBleCkgewotICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIkpWTSBET0VTIE5PVCBTVVBQT1JUIFVURi04Iik7Ci0gICAgfQorICAgIHJldHVybiByZWFkSlNPTlN0cmluZyhmYWxzZSkudG9TdHJpbmcoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CiAgIH0KIAogICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmphdmEKaW5kZXggMzUzNTI3NC4uMGVhNTY2YiAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmphdmEKQEAgLTMxLDIxICszMSwyMyBAQAogICoKICAqIDxwPlRoaXMgZXhhbXBsZSB1c2VzIGEgc2luZ2xlIHNvY2tldCB0cmFuc3BvcnQgdG8gaW52b2tlIHR3byBzZXJ2aWNlczoKICAqCi0gKiA8YmxvY2txdW90ZT48Y29kZT4KLSAqICAgICBUU29ja2V0IHRyYW5zcG9ydCA9IG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCA5MDkwKTs8YnIvPgotICogICAgIHRyYW5zcG9ydC5vcGVuKCk7PGJyLz4KLSAqPGJyLz4KLSAqICAgICBUQmluYXJ5UHJvdG9jb2wgcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCk7PGJyLz4KLSAqPGJyLz4KLSAqICAgICBUTXVsdGlwbGV4ZWRQcm90b2NvbCBtcCA9IG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbChwcm90b2NvbCwgIkNhbGN1bGF0b3IiKTs8YnIvPgotICogICAgIENhbGN1bGF0b3IuQ2xpZW50IHNlcnZpY2UgPSBuZXcgQ2FsY3VsYXRvci5DbGllbnQobXApOzxici8+Ci0gKjxici8+Ci0gKiAgICAgVE11bHRpcGxleGVkUHJvdG9jb2wgbXAyID0gbmV3IFRNdWx0aXBsZXhlZFByb3RvY29sKHByb3RvY29sLCAiV2VhdGhlclJlcG9ydCIpOzxici8+Ci0gKiAgICAgV2VhdGhlclJlcG9ydC5DbGllbnQgc2VydmljZTIgPSBuZXcgV2VhdGhlclJlcG9ydC5DbGllbnQobXAyKTs8YnIvPgotICo8YnIvPgotICogICAgIFN5c3RlbS5vdXQucHJpbnRsbihzZXJ2aWNlLmFkZCgyLDIpKTs8YnIvPgotICogICAgIFN5c3RlbS5vdXQucHJpbnRsbihzZXJ2aWNlMi5nZXRUZW1wZXJhdHVyZSgpKTs8YnIvPgotICogPC9jb2RlPjwvYmxvY2txdW90ZT4KKyAqIDxwcmU+CisgKiB7QGNvZGUKKyAqICAgICBUU29ja2V0IHRyYW5zcG9ydCA9IG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCA5MDkwKTsKKyAqICAgICB0cmFuc3BvcnQub3BlbigpOworICoKKyAqICAgICBUQmluYXJ5UHJvdG9jb2wgcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCk7CisgKgorICogICAgIFRNdWx0aXBsZXhlZFByb3RvY29sIG1wID0gbmV3IFRNdWx0aXBsZXhlZFByb3RvY29sKHByb3RvY29sLCAiQ2FsY3VsYXRvciIpOworICogICAgIENhbGN1bGF0b3IuQ2xpZW50IHNlcnZpY2UgPSBuZXcgQ2FsY3VsYXRvci5DbGllbnQobXApOworICoKKyAqICAgICBUTXVsdGlwbGV4ZWRQcm90b2NvbCBtcDIgPSBuZXcgVE11bHRpcGxleGVkUHJvdG9jb2wocHJvdG9jb2wsICJXZWF0aGVyUmVwb3J0Iik7CisgKiAgICAgV2VhdGhlclJlcG9ydC5DbGllbnQgc2VydmljZTIgPSBuZXcgV2VhdGhlclJlcG9ydC5DbGllbnQobXAyKTsKKyAqCisgKiAgICAgU3lzdGVtLm91dC5wcmludGxuKHNlcnZpY2UuYWRkKDIsMikpOworICogICAgIFN5c3RlbS5vdXQucHJpbnRsbihzZXJ2aWNlMi5nZXRUZW1wZXJhdHVyZSgpKTsKKyAqIH0KKyAqIDwvcHJlPgogICoKICAqIEBzZWUgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRGVjb3JhdG9yCiAgKi8KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xVdGlsLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVXRpbC5qYXZhCmluZGV4IDc1MjUyMGEuLmNkYWEzMGIgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xVdGlsLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbFV0aWwuamF2YQpAQCAtMTQxLDcgKzE0MSw4IEBACiAgICAgICAgIGJyZWFrOwogCiAgICAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKKyAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5yZWNvZ25pemVkIHR5cGUgIiArIHR5cGUpOwogICAgIH0KICAgfQogCkBAIC0xNTIsNyArMTUzLDcgQEAKICAgICogSW4gc29tZSBjYXNlcywgbm8gZ3Vlc3MgY2FuIGJlIGRvbmUsIGluIHRoYXQgY2FzZSB3ZSByZXR1cm4gdGhlCiAgICAqIGZhbGxiYWNrIFRQcm90b2NvbEZhY3RvcnkuCiAgICAqIFRvIGJlIGNlcnRhaW4gdG8gY29ycmVjdGx5IGRldGVjdCB0aGUgcHJvdG9jb2wsIHRoZSBmaXJzdCBlbmNvZGVkCi0gICAqIGZpZWxkIHNob3VsZCBoYXZlIGEgZmllbGQgaWQgPCAyNTYKKyAgICogZmllbGQgc2hvdWxkIGhhdmUgYSBmaWVsZCBpZCAmbHQ7IDI1NgogICAgKgogICAgKiBAcGFyYW0gZGF0YSBUaGUgc2VyaWFsaXplZCBkYXRhIHRvIGd1ZXNzIHRoZSBwcm90b2NvbCBmb3IuCiAgICAqIEBwYXJhbSBmYWxsYmFjayBUaGUgVFByb3RvY29sIHRvIHJldHVybiBpZiBubyBndWVzcyBjYW4gYmUgbWFkZS4KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UU2ltcGxlSlNPTlByb3RvY29sLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFNpbXBsZUpTT05Qcm90b2NvbC5qYXZhCmluZGV4IGZmYTEzOWEuLmViN2UyM2IgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UU2ltcGxlSlNPTlByb3RvY29sLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RTaW1wbGVKU09OUHJvdG9jb2wuamF2YQpAQCAtMTksOCArMTksOCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOwogCi1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOwogaW1wb3J0IGphdmEudXRpbC5TdGFjazsKIAogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CkBAIC0xNDMsNiArMTQzLDE1IEBACiAgIH0KIAogICAvKioKKyAgICogUmVzZXQgdGhlIHdyaXRlIGNvbnRleHQgc3RhY2sgdG8gaXRzIGluaXRpYWwgc3RhdGUuCisgICAqLworICBwcm90ZWN0ZWQgdm9pZCByZXNldFdyaXRlQ29udGV4dCgpIHsKKyAgICB3aGlsZSAoIXdyaXRlQ29udGV4dFN0YWNrXy5pc0VtcHR5KCkpIHsKKyAgICAgIHBvcFdyaXRlQ29udGV4dCgpOworICAgIH0KKyAgfQorCisgIC8qKgogICAgKiBVc2VkIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIGFyZSBub3QgZW5jb3VudGVyaW5nIGEgbWFwIHdob3NlIGtleXMgYXJlIGNvbnRhaW5lcnMKICAgICovCiAgIHByb3RlY3RlZCB2b2lkIGFzc2VydENvbnRleHRJc05vdE1hcEtleShTdHJpbmcgaW52YWxpZEtleVR5cGUpIHRocm93cyBDb2xsZWN0aW9uTWFwS2V5RXhjZXB0aW9uIHsKQEAgLTE1OCw3ICsxNjcsOSBAQAogICAgIHN1cGVyKHRyYW5zKTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZSBtZXNzYWdlKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgcmVzZXRXcml0ZUNvbnRleHQoKTsgLy8gVEhSSUZULTM3NDMKICAgICB0cmFuc18ud3JpdGUoTEJSQUNLRVQpOwogICAgIHB1c2hXcml0ZUNvbnRleHQobmV3IExpc3RDb250ZXh0KCkpOwogICAgIHdyaXRlU3RyaW5nKG1lc3NhZ2UubmFtZSk7CkBAIC0xNjYsMzEgKzE3NywzOCBAQAogICAgIHdyaXRlSTMyKG1lc3NhZ2Uuc2VxaWQpOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlTWVzc2FnZUVuZCgpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBwb3BXcml0ZUNvbnRleHQoKTsKICAgICB0cmFuc18ud3JpdGUoUkJSQUNLRVQpOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlU3RydWN0QmVnaW4oVFN0cnVjdCBzdHJ1Y3QpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICB3cml0ZUNvbnRleHRfLndyaXRlKCk7CiAgICAgdHJhbnNfLndyaXRlKExCUkFDRSk7CiAgICAgcHVzaFdyaXRlQ29udGV4dChuZXcgU3RydWN0Q29udGV4dCgpKTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZVN0cnVjdEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBwb3BXcml0ZUNvbnRleHQoKTsKICAgICB0cmFuc18ud3JpdGUoUkJSQUNFKTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZUZpZWxkQmVnaW4oVEZpZWxkIGZpZWxkKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgLy8gTm90ZSB0aGF0IGV4dHJhIHR5cGUgaW5mb3JtYXRpb24gaXMgb21pdHRlZCBpbiBKU09OIQogICAgIHdyaXRlU3RyaW5nKGZpZWxkLm5hbWUpOwogICB9CiAKLSAgcHVibGljIHZvaWQgd3JpdGVGaWVsZEVuZCgpIHt9CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCB3cml0ZUZpZWxkRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAotICBwdWJsaWMgdm9pZCB3cml0ZUZpZWxkU3RvcCgpIHt9CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCB3cml0ZUZpZWxkU3RvcCgpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlTWFwQmVnaW4oVE1hcCBtYXApIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBhc3NlcnRDb250ZXh0SXNOb3RNYXBLZXkoTUFQKTsKICAgICB3cml0ZUNvbnRleHRfLndyaXRlKCk7CkBAIC0xOTksMTEgKzIxNywxMyBAQAogICAgIC8vIE5vIG1ldGFkYXRhIQogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlTWFwRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHBvcFdyaXRlQ29udGV4dCgpOwogICAgIHRyYW5zXy53cml0ZShSQlJBQ0UpOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlTGlzdEJlZ2luKFRMaXN0IGxpc3QpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBhc3NlcnRDb250ZXh0SXNOb3RNYXBLZXkoTElTVCk7CiAgICAgd3JpdGVDb250ZXh0Xy53cml0ZSgpOwpAQCAtMjEyLDExICsyMzIsMTMgQEAKICAgICAvLyBObyBtZXRhZGF0YSEKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZUxpc3RFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgcG9wV3JpdGVDb250ZXh0KCk7CiAgICAgdHJhbnNfLndyaXRlKFJCUkFDS0VUKTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZVNldEJlZ2luKFRTZXQgc2V0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgYXNzZXJ0Q29udGV4dElzTm90TWFwS2V5KFNFVCk7CiAgICAgd3JpdGVDb250ZXh0Xy53cml0ZSgpOwpAQCAtMjI1LDIzICsyNDcsMjggQEAKICAgICAvLyBObyBtZXRhZGF0YSEKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZVNldEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBwb3BXcml0ZUNvbnRleHQoKTsKICAgICB0cmFuc18ud3JpdGUoUkJSQUNLRVQpOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlQm9vbChib29sZWFuIGIpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICB3cml0ZUJ5dGUoYiA/IChieXRlKTEgOiAoYnl0ZSkwKTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZUJ5dGUoYnl0ZSBiKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgd3JpdGVJMzIoYik7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVJMTYoc2hvcnQgaTE2KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgd3JpdGVJMzIoaTE2KTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZUkzMihpbnQgaTMyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgaWYod3JpdGVDb250ZXh0Xy5pc01hcEtleSgpKSB7CiAgICAgICB3cml0ZVN0cmluZyhJbnRlZ2VyLnRvU3RyaW5nKGkzMikpOwpAQCAtMjUyLDE0ICsyNzksMTEgQEAKICAgfQogCiAgIHB1YmxpYyB2b2lkIF93cml0ZVN0cmluZ0RhdGEoU3RyaW5nIHMpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICB0cnkgewotICAgICAgYnl0ZVtdIGIgPSBzLmdldEJ5dGVzKCJVVEYtOCIpOwotICAgICAgdHJhbnNfLndyaXRlKGIpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdWV4KSB7Ci0gICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiSlZNIERPRVMgTk9UIFNVUFBPUlQgVVRGLTgiKTsKLSAgICB9CisgICAgYnl0ZVtdIGIgPSBzLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOworICAgIHRyYW5zXy53cml0ZShiKTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZUk2NChsb25nIGk2NCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGlmKHdyaXRlQ29udGV4dF8uaXNNYXBLZXkoKSkgewogICAgICAgd3JpdGVTdHJpbmcoTG9uZy50b1N0cmluZyhpNjQpKTsKQEAgLTI2OSw2ICsyOTMsNyBAQAogICAgIH0KICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZURvdWJsZShkb3VibGUgZHViKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgaWYod3JpdGVDb250ZXh0Xy5pc01hcEtleSgpKSB7CiAgICAgICB3cml0ZVN0cmluZyhEb3VibGUudG9TdHJpbmcoZHViKSk7CkBAIC0yNzgsNiArMzAzLDcgQEAKICAgICB9CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVTdHJpbmcoU3RyaW5nIHN0cikgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHdyaXRlQ29udGV4dF8ud3JpdGUoKTsKICAgICBpbnQgbGVuZ3RoID0gc3RyLmxlbmd0aCgpOwpAQCAtMzMxLDkwICszNTcsMTA4IEBACiAgICAgX3dyaXRlU3RyaW5nRGF0YShlc2NhcGUudG9TdHJpbmcoKSk7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVCaW5hcnkoQnl0ZUJ1ZmZlciBiaW4pIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICB0cnkgewotICAgICAgLy8gVE9ETyhtY3NsZWUpOiBGaXggdGhpcwotICAgICAgd3JpdGVTdHJpbmcobmV3IFN0cmluZyhiaW4uYXJyYXkoKSwgYmluLnBvc2l0aW9uKCkgKyBiaW4uYXJyYXlPZmZzZXQoKSwgYmluLmxpbWl0KCkgLSBiaW4ucG9zaXRpb24oKSAtIGJpbi5hcnJheU9mZnNldCgpLCAiVVRGLTgiKSk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZXgpIHsKLSAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJKVk0gRE9FUyBOT1QgU1VQUE9SVCBVVEYtOCIpOwotICAgIH0KKyAgICAvLyBUT0RPKG1jc2xlZSk6IEZpeCB0aGlzCisgICAgd3JpdGVTdHJpbmcobmV3IFN0cmluZyhiaW4uYXJyYXkoKSwgYmluLnBvc2l0aW9uKCkgKyBiaW4uYXJyYXlPZmZzZXQoKSwKKyAgICAgICAgYmluLmxpbWl0KCkgLSBiaW4ucG9zaXRpb24oKSAtIGJpbi5hcnJheU9mZnNldCgpLAorICAgICAgICBTdGFuZGFyZENoYXJzZXRzLlVURl84KSk7CiAgIH0KIAogICAvKioKICAgICogUmVhZGluZyBtZXRob2RzLgogICAgKi8KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIFRNZXNzYWdlIHJlYWRNZXNzYWdlQmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgLy8gVE9ETyhtY3NsZWUpOiBpbXBsZW1lbnQKICAgICByZXR1cm4gRU1QVFlfTUVTU0FHRTsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHJlYWRNZXNzYWdlRW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJlYWRNZXNzYWdlRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAotICBwdWJsaWMgVFN0cnVjdCByZWFkU3RydWN0QmVnaW4oKSB7CisgIEBPdmVycmlkZQorICBwdWJsaWMgVFN0cnVjdCByZWFkU3RydWN0QmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgLy8gVE9ETyhtY3NsZWUpOiBpbXBsZW1lbnQKICAgICByZXR1cm4gQU5PTllNT1VTX1NUUlVDVDsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHJlYWRTdHJ1Y3RFbmQoKSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcmVhZFN0cnVjdEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBURmllbGQgcmVhZEZpZWxkQmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgLy8gVE9ETyhtY3NsZWUpOiBpbXBsZW1lbnQKICAgICByZXR1cm4gQU5PTllNT1VTX0ZJRUxEOwogICB9CiAKLSAgcHVibGljIHZvaWQgcmVhZEZpZWxkRW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJlYWRGaWVsZEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBUTWFwIHJlYWRNYXBCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICAvLyBUT0RPKG1jc2xlZSk6IGltcGxlbWVudAogICAgIHJldHVybiBFTVBUWV9NQVA7CiAgIH0KIAotICBwdWJsaWMgdm9pZCByZWFkTWFwRW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJlYWRNYXBFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgVExpc3QgcmVhZExpc3RCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICAvLyBUT0RPKG1jc2xlZSk6IGltcGxlbWVudAogICAgIHJldHVybiBFTVBUWV9MSVNUOwogICB9CiAKLSAgcHVibGljIHZvaWQgcmVhZExpc3RFbmQoKSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcmVhZExpc3RFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgVFNldCByZWFkU2V0QmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgLy8gVE9ETyhtY3NsZWUpOiBpbXBsZW1lbnQKICAgICByZXR1cm4gRU1QVFlfU0VUOwogICB9CiAKLSAgcHVibGljIHZvaWQgcmVhZFNldEVuZCgpIHt9CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCByZWFkU2V0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIGJvb2xlYW4gcmVhZEJvb2woKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgcmV0dXJuIChyZWFkQnl0ZSgpID09IDEpOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBieXRlIHJlYWRCeXRlKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIC8vIFRPRE8obWNzbGVlKTogaW1wbGVtZW50CiAgICAgcmV0dXJuIDA7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHNob3J0IHJlYWRJMTYoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgLy8gVE9ETyhtY3NsZWUpOiBpbXBsZW1lbnQKICAgICByZXR1cm4gMDsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgaW50IHJlYWRJMzIoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgLy8gVE9ETyhtY3NsZWUpOiBpbXBsZW1lbnQKICAgICByZXR1cm4gMDsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgbG9uZyByZWFkSTY0KCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIC8vIFRPRE8obWNzbGVlKTogaW1wbGVtZW50CiAgICAgcmV0dXJuIDA7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIGRvdWJsZSByZWFkRG91YmxlKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIC8vIFRPRE8obWNzbGVlKTogaW1wbGVtZW50CiAgICAgcmV0dXJuIDA7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIFN0cmluZyByZWFkU3RyaW5nKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIC8vIFRPRE8obWNzbGVlKTogaW1wbGVtZW50CiAgICAgcmV0dXJuICIiOwpAQCAtNDI1LDYgKzQ2OSw3IEBACiAgICAgcmV0dXJuICIiOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBCeXRlQnVmZmVyIHJlYWRCaW5hcnkoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgLy8gVE9ETyhtY3NsZWUpOiBpbXBsZW1lbnQKICAgICByZXR1cm4gQnl0ZUJ1ZmZlci53cmFwKG5ldyBieXRlWzBdKTsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlci5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9BYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyLmphdmEKaW5kZXggMGM0OTJjYy4uOGMyMDZlNCAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9BYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9BYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyLmphdmEKQEAgLTE5LDE1ICsxOSw2IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyOwogCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdGlvbktleTsKLWltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3RvcjsKLWltcG9ydCBqYXZhLm5pby5jaGFubmVscy5zcGkuU2VsZWN0b3JQcm92aWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNMb25nOwotCiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEFzeW5jUHJvY2Vzc29yOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRCeXRlQXJyYXlPdXRwdXRTdHJlYW07CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKQEAgLTQyLDYgKzMzLDE1IEBACiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3Rpb25LZXk7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0b3I7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuc3BpLlNlbGVjdG9yUHJvdmlkZXI7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljTG9uZzsKKwogLyoqCiAgKiBQcm92aWRlcyBjb21tb24gbWV0aG9kcyBhbmQgY2xhc3NlcyB1c2VkIGJ5IG5vbmJsb2NraW5nIFRTZXJ2ZXIKICAqIGltcGxlbWVudGF0aW9ucy4KQEAgLTUwLDcgKzUwLDcgQEAKICAgcHJvdGVjdGVkIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihnZXRDbGFzcygpLmdldE5hbWUoKSk7CiAKICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyQXJnczxUIGV4dGVuZHMgQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlckFyZ3M8VD4+IGV4dGVuZHMgQWJzdHJhY3RTZXJ2ZXJBcmdzPFQ+IHsKLSAgICBwdWJsaWMgbG9uZyBtYXhSZWFkQnVmZmVyQnl0ZXMgPSBMb25nLk1BWF9WQUxVRTsKKyAgICBwdWJsaWMgbG9uZyBtYXhSZWFkQnVmZmVyQnl0ZXMgPSAyNTYgKiAxMDI0ICogMTAyNDsKIAogICAgIHB1YmxpYyBBYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyQXJncyhUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQgdHJhbnNwb3J0KSB7CiAgICAgICBzdXBlcih0cmFuc3BvcnQpOwpAQCAtMTAyLDcgKzEwMiw3IEBACiAKICAgLyoqCiAgICAqIFN0YXJ0cyBhbnkgdGhyZWFkcyByZXF1aXJlZCBmb3Igc2VydmluZy4KLSAgICogCisgICAqCiAgICAqIEByZXR1cm4gdHJ1ZSBpZiBldmVyeXRoaW5nIHdlbnQgb2ssIGZhbHNlIGlmIHRocmVhZHMgY291bGQgbm90IGJlIHN0YXJ0ZWQuCiAgICAqLwogICBwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBzdGFydFRocmVhZHMoKTsKQEAgLTExNSw3ICsxMTUsNyBAQAogCiAgIC8qKgogICAgKiBIYXZlIHRoZSBzZXJ2ZXIgdHJhbnNwb3J0IHN0YXJ0IGFjY2VwdGluZyBjb25uZWN0aW9ucy4KLSAgICogCisgICAqCiAgICAqIEByZXR1cm4gdHJ1ZSBpZiB3ZSBzdGFydGVkIGxpc3RlbmluZyBzdWNjZXNzZnVsbHksIGZhbHNlIGlmIHNvbWV0aGluZyB3ZW50CiAgICAqICAgICAgICAgd3JvbmcuCiAgICAqLwpAQCAtMTM5LDcgKzEzOSw3IEBACiAgIC8qKgogICAgKiBQZXJmb3JtIGFuIGludm9jYXRpb24uIFRoaXMgbWV0aG9kIGNvdWxkIGJlaGF2ZSBzZXZlcmFsIGRpZmZlcmVudCB3YXlzIC0KICAgICogaW52b2tlIGltbWVkaWF0ZWx5IGlubGluZSwgcXVldWUgZm9yIHNlcGFyYXRlIGV4ZWN1dGlvbiwgZXRjLgotICAgKiAKKyAgICoKICAgICogQHJldHVybiB0cnVlIGlmIGludm9jYXRpb24gd2FzIHN1Y2Nlc3NmdWxseSByZXF1ZXN0ZWQsIHdoaWNoIGlzIG5vdCBhCiAgICAqICAgICAgICAgZ3VhcmFudGVlIHRoYXQgaW52b2NhdGlvbiBoYXMgY29tcGxldGVkLiBGYWxzZSBpZiB0aGUgcmVxdWVzdAogICAgKiAgICAgICAgIGZhaWxlZC4KQEAgLTE1Miw3ICsxNTIsNyBAQAogICAgKiBjb3JyZXNwb25kaW5nIHRvIHJlcXVlc3RzLgogICAgKi8KICAgcHJvdGVjdGVkIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U2VsZWN0VGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKLSAgICBwcm90ZWN0ZWQgZmluYWwgU2VsZWN0b3Igc2VsZWN0b3I7CisgICAgcHJvdGVjdGVkIFNlbGVjdG9yIHNlbGVjdG9yOwogCiAgICAgLy8gTGlzdCBvZiBGcmFtZUJ1ZmZlcnMgdGhhdCB3YW50IHRvIGNoYW5nZSB0aGVpciBzZWxlY3Rpb24gaW50ZXJlc3RzLgogICAgIHByb3RlY3RlZCBmaW5hbCBTZXQ8RnJhbWVCdWZmZXI+IHNlbGVjdEludGVyZXN0Q2hhbmdlcyA9IG5ldyBIYXNoU2V0PEZyYW1lQnVmZmVyPigpOwpAQCAtMjg1LDIxICsyODUsMjEgQEAKICAgICBwcm90ZWN0ZWQgQnl0ZUJ1ZmZlciBidWZmZXJfOwogCiAgICAgcHJvdGVjdGVkIGZpbmFsIFRCeXRlQXJyYXlPdXRwdXRTdHJlYW0gcmVzcG9uc2VfOwotICAgIAorCiAgICAgLy8gdGhlIGZyYW1lIHRoYXQgdGhlIFRUcmFuc3BvcnQgc2hvdWxkIHdyYXAuCiAgICAgcHJvdGVjdGVkIGZpbmFsIFRNZW1vcnlJbnB1dFRyYW5zcG9ydCBmcmFtZVRyYW5zXzsKLSAgICAKKwogICAgIC8vIHRoZSB0cmFuc3BvcnQgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBjb25uZWN0IHRvIGNsaWVudHMKICAgICBwcm90ZWN0ZWQgZmluYWwgVFRyYW5zcG9ydCBpblRyYW5zXzsKLSAgICAKKwogICAgIHByb3RlY3RlZCBmaW5hbCBUVHJhbnNwb3J0IG91dFRyYW5zXzsKLSAgICAKKwogICAgIC8vIHRoZSBpbnB1dCBwcm90b2NvbCB0byB1c2Ugb24gZnJhbWVzCiAgICAgcHJvdGVjdGVkIGZpbmFsIFRQcm90b2NvbCBpblByb3RfOwotICAgIAorCiAgICAgLy8gdGhlIG91dHB1dCBwcm90b2NvbCB0byB1c2Ugb24gZnJhbWVzCiAgICAgcHJvdGVjdGVkIGZpbmFsIFRQcm90b2NvbCBvdXRQcm90XzsKLSAgICAKKwogICAgIC8vIGNvbnRleHQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29ubmVjdGlvbgogICAgIHByb3RlY3RlZCBmaW5hbCBTZXJ2ZXJDb250ZXh0IGNvbnRleHRfOwogCkBAIC0zMjgsNyArMzI4LDcgQEAKICAgICAvKioKICAgICAgKiBHaXZlIHRoaXMgRnJhbWVCdWZmZXIgYSBjaGFuY2UgdG8gcmVhZC4gVGhlIHNlbGVjdG9yIGxvb3Agc2hvdWxkIGhhdmUKICAgICAgKiByZWNlaXZlZCBhIHJlYWQgZXZlbnQgZm9yIHRoaXMgRnJhbWVCdWZmZXIuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbm5lY3Rpb24gc2hvdWxkIGxpdmUgb24sIGZhbHNlIGlmIGl0IHNob3VsZCBiZQogICAgICAqICAgICAgICAgY2xvc2VkCiAgICAgICovCkBAIC00MzUsMTcgKzQzNSwyMyBAQAogICAgICAqIGhhcyBjb21lIGluLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNoYW5nZVNlbGVjdEludGVyZXN0cygpIHsKLSAgICAgIGlmIChzdGF0ZV8gPT0gRnJhbWVCdWZmZXJTdGF0ZS5BV0FJVElOR19SRUdJU1RFUl9XUklURSkgeworICAgICAgc3dpdGNoIChzdGF0ZV8pIHsKKyAgICAgIGNhc2UgQVdBSVRJTkdfUkVHSVNURVJfV1JJVEU6CiAgICAgICAgIC8vIHNldCB0aGUgT1BfV1JJVEUgaW50ZXJlc3QKICAgICAgICAgc2VsZWN0aW9uS2V5Xy5pbnRlcmVzdE9wcyhTZWxlY3Rpb25LZXkuT1BfV1JJVEUpOwogICAgICAgICBzdGF0ZV8gPSBGcmFtZUJ1ZmZlclN0YXRlLldSSVRJTkc7Ci0gICAgICB9IGVsc2UgaWYgKHN0YXRlXyA9PSBGcmFtZUJ1ZmZlclN0YXRlLkFXQUlUSU5HX1JFR0lTVEVSX1JFQUQpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEFXQUlUSU5HX1JFR0lTVEVSX1JFQUQ6CiAgICAgICAgIHByZXBhcmVSZWFkKCk7Ci0gICAgICB9IGVsc2UgaWYgKHN0YXRlXyA9PSBGcmFtZUJ1ZmZlclN0YXRlLkFXQUlUSU5HX0NMT1NFKSB7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBBV0FJVElOR19DTE9TRToKICAgICAgICAgY2xvc2UoKTsKICAgICAgICAgc2VsZWN0aW9uS2V5Xy5jYW5jZWwoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIExPR0dFUi5lcnJvcigiY2hhbmdlU2VsZWN0SW50ZXJlc3Qgd2FzIGNhbGxlZCwgYnV0IHN0YXRlIGlzIGludmFsaWQgKCIgKyBzdGF0ZV8gKyAiKSIpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIExPR0dFUi5lcnJvcigKKyAgICAgICAgICAgICJjaGFuZ2VTZWxlY3RJbnRlcmVzdCB3YXMgY2FsbGVkLCBidXQgc3RhdGUgaXMgaW52YWxpZCAoe30pIiwKKyAgICAgICAgICAgIHN0YXRlXyk7CiAgICAgICB9CiAgICAgfQogCkBAIC00NTUsNyArNDYxLDcgQEAKICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKICAgICAgIC8vIGlmIHdlJ3JlIGJlaW5nIGNsb3NlZCBkdWUgdG8gYW4gZXJyb3IsIHdlIG1pZ2h0IGhhdmUgYWxsb2NhdGVkIGEKICAgICAgIC8vIGJ1ZmZlciB0aGF0IHdlIG5lZWQgdG8gc3VidHJhY3QgZm9yIG91ciBtZW1vcnkgYWNjb3VudGluZy4KLSAgICAgIGlmIChzdGF0ZV8gPT0gRnJhbWVCdWZmZXJTdGF0ZS5SRUFESU5HX0ZSQU1FIHx8IAorICAgICAgaWYgKHN0YXRlXyA9PSBGcmFtZUJ1ZmZlclN0YXRlLlJFQURJTkdfRlJBTUUgfHwKICAgICAgICAgICBzdGF0ZV8gPT0gRnJhbWVCdWZmZXJTdGF0ZS5SRUFEX0ZSQU1FX0NPTVBMRVRFIHx8CiAgICAgICAgICAgc3RhdGVfID09IEZyYW1lQnVmZmVyU3RhdGUuQVdBSVRJTkdfQ0xPU0UpIHsKICAgICAgICAgcmVhZEJ1ZmZlckJ5dGVzQWxsb2NhdGVkLmFkZEFuZEdldCgtYnVmZmVyXy5hcnJheSgpLmxlbmd0aCk7CkBAIC01MTAsNyArNTE2LDcgQEAKICAgICBwdWJsaWMgdm9pZCBpbnZva2UoKSB7CiAgICAgICBmcmFtZVRyYW5zXy5yZXNldChidWZmZXJfLmFycmF5KCkpOwogICAgICAgcmVzcG9uc2VfLnJlc2V0KCk7Ci0gICAgICAKKwogICAgICAgdHJ5IHsKICAgICAgICAgaWYgKGV2ZW50SGFuZGxlcl8gIT0gbnVsbCkgewogICAgICAgICAgIGV2ZW50SGFuZGxlcl8ucHJvY2Vzc0NvbnRleHQoY29udGV4dF8sIGluVHJhbnNfLCBvdXRUcmFuc18pOwpAQCAtNTMwLDcgKzUzNiw3IEBACiAKICAgICAvKioKICAgICAgKiBQZXJmb3JtIGEgcmVhZCBpbnRvIGJ1ZmZlci4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVhZCBzdWNjZWVkZWQsIGZhbHNlIGlmIHRoZXJlIHdhcyBhbiBlcnJvciBvciB0aGUKICAgICAgKiAgICAgICAgIGNvbm5lY3Rpb24gY2xvc2VkLgogICAgICAqLwpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9URXh0ZW5zaWJsZVNlcnZsZXQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVEV4dGVuc2libGVTZXJ2bGV0LmphdmEKaW5kZXggZDMyOGRkNi4uNzUwODJjMCAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9URXh0ZW5zaWJsZVNlcnZsZXQuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RFeHRlbnNpYmxlU2VydmxldC5qYXZhCkBAIC02Myw3ICs2Myw3IEBACiAgICAqIFJldHVybnMgdGhlIGFwcHJvcHJpYXRlIHtAbGluayBUUHJvY2Vzc29yfS4gVGhpcyB3aWxsIGJlIGNhbGxlZCA8Yj5vbmNlPC9iPiBqdXN0CiAgICAqIGFmdGVyIHRoZSB7QGxpbmsgI2luaXQoKX0gbWV0aG9kCiAgICAqIAotICAgKiBAcmV0dXJuCisgICAqIEByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIHtAbGluayBUUHJvY2Vzc29yfQogICAgKi8KICAgcHJvdGVjdGVkIGFic3RyYWN0IFRQcm9jZXNzb3IgZ2V0UHJvY2Vzc29yKCk7CiAKQEAgLTcxLDcgKzcxLDcgQEAKICAgICogUmV0dXJucyB0aGUgYXBwcm9wcmlhdGUgaW4ge0BsaW5rIFRQcm90b2NvbEZhY3Rvcnl9LiBUaGlzIHdpbGwgYmUgY2FsbGVkCiAgICAqIDxiPm9uY2U8L2I+IGp1c3QgYWZ0ZXIgdGhlIHtAbGluayAjaW5pdCgpfSBtZXRob2QKICAgICogCi0gICAqIEByZXR1cm4KKyAgICogQHJldHVybiB0aGUgYXBwcm9wcmlhdGUgaW4ge0BsaW5rIFRQcm90b2NvbEZhY3Rvcnl9CiAgICAqLwogICBwcm90ZWN0ZWQgYWJzdHJhY3QgVFByb3RvY29sRmFjdG9yeSBnZXRJblByb3RvY29sRmFjdG9yeSgpOwogCkBAIC03OSw3ICs3OSw3IEBACiAgICAqIFJldHVybnMgdGhlIGFwcHJvcHJpYXRlIG91dCB7QGxpbmsgVFByb3RvY29sRmFjdG9yeX0uIFRoaXMgd2lsbCBiZSBjYWxsZWQKICAgICogPGI+b25jZTwvYj4ganVzdCBhZnRlciB0aGUge0BsaW5rICNpbml0KCl9IG1ldGhvZAogICAgKiAKLSAgICogQHJldHVybgorICAgKiBAcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBvdXQge0BsaW5rIFRQcm90b2NvbEZhY3Rvcnl9CiAgICAqLwogICBwcm90ZWN0ZWQgYWJzdHJhY3QgVFByb3RvY29sRmFjdG9yeSBnZXRPdXRQcm90b2NvbEZhY3RvcnkoKTsKIApkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9USHNIYVNlcnZlci5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9USHNIYVNlcnZlci5qYXZhCmluZGV4IDJlZjRiODMuLjRjNWQ3YjUgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVEhzSGFTZXJ2ZXIuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RIc0hhU2VydmVyLmphdmEKQEAgLTQ1LDYgKzQ1LDI4IEBACiAgICAgICBzdXBlcih0cmFuc3BvcnQpOwogICAgIH0KIAorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbWluIGFuZCBtYXggdGhyZWFkcy4KKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI21pbldvcmtlclRocmVhZHMoaW50KX0gYW5kIHtAbGluayAjbWF4V29ya2VyVGhyZWFkcyhpbnQpfSAgaW5zdGVhZC4KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBBcmdzIHdvcmtlclRocmVhZHMoaW50IG4pIHsKKyAgICAgIG1pbldvcmtlclRocmVhZHMgPSBuOworICAgICAgbWF4V29ya2VyVGhyZWFkcyA9IG47CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHdoYXQgdGhlIG1pbiB0aHJlYWRzIHdhcyBzZXQgdG8uCisgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjZ2V0TWluV29ya2VyVGhyZWFkcygpfSBhbmQge0BsaW5rICNnZXRNYXhXb3JrZXJUaHJlYWRzKCl9IGluc3RlYWQuCisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgaW50IGdldFdvcmtlclRocmVhZHMoKSB7CisgICAgICByZXR1cm4gbWluV29ya2VyVGhyZWFkczsKKyAgICB9CisKICAgICBwdWJsaWMgQXJncyBtaW5Xb3JrZXJUaHJlYWRzKGludCBuKSB7CiAgICAgICBtaW5Xb3JrZXJUaHJlYWRzID0gbjsKICAgICAgIHJldHVybiB0aGlzOwpAQCAtMTA5LDcgKzEzMSw3IEBACiAgIH0KIAogICAvKioKLSAgICogQGluaGVyaXREb2MKKyAgICoge0Bpbmhlcml0RG9jfQogICAgKi8KICAgQE92ZXJyaWRlCiAgIHByb3RlY3RlZCB2b2lkIHdhaXRGb3JTaHV0ZG93bigpIHsKQEAgLTEzMyw2ICsxNTUsOSBAQAogICAgIHJldHVybiBpbnZva2VyOwogICB9CiAKKyAgcHJvdGVjdGVkIEV4ZWN1dG9yU2VydmljZSBnZXRJbnZva2VyKCkgeworICAgIHJldHVybiBpbnZva2VyOworICB9CiAKICAgcHJvdGVjdGVkIHZvaWQgZ3JhY2VmdWxseVNodXRkb3duSW52b2tlclBvb2woKSB7CiAgICAgLy8gdHJ5IHRvIGdyYWNlZnVsbHkgc2h1dCBkb3duIHRoZSBleGVjdXRvciBzZXJ2aWNlCmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RTZXJ2ZXIuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFNlcnZlci5qYXZhCmluZGV4IDgwZjRmODYuLmJhYzA2YjIgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFNlcnZlci5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFNlcnZlci5qYXZhCkBAIC0xMjMsNyArMTIzLDcgQEAKICAgICovCiAgIHByb3RlY3RlZCBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeV87CiAKLSAgcHJpdmF0ZSBib29sZWFuIGlzU2VydmluZzsKKyAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIGlzU2VydmluZzsKIAogICBwcm90ZWN0ZWQgVFNlcnZlckV2ZW50SGFuZGxlciBldmVudEhhbmRsZXJfOwogCmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmphdmEKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCAwNTI5ZDcyLi4xNjk3YWQ2Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmphdmEKQEAgLTc1LDYgKzc1LDExIEBACiAgICAgICByZXR1cm4gdGhpczsKICAgICB9CiAKKyAgICBwdWJsaWMgQXJncyBzdG9wVGltZW91dFVuaXQoVGltZVVuaXQgdHUpIHsKKyAgICAgIHN0b3BUaW1lb3V0VW5pdCA9IHR1OworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCiAgICAgcHVibGljIEFyZ3MgcmVxdWVzdFRpbWVvdXQoaW50IG4pIHsKICAgICAgIHJlcXVlc3RUaW1lb3V0ID0gbjsKICAgICAgIHJldHVybiB0aGlzOwpAQCAtMTM2LDI2ICsxNDEsNDQgQEAKICAgICByZXR1cm4gbmV3IFRocmVhZFBvb2xFeGVjdXRvcihhcmdzLm1pbldvcmtlclRocmVhZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5tYXhXb3JrZXJUaHJlYWRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3Muc3RvcFRpbWVvdXRWYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZVVuaXQuU0VDT05EUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLnN0b3BUaW1lb3V0VW5pdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRvclF1ZXVlKTsKICAgfQogCi0KLSAgcHVibGljIHZvaWQgc2VydmUoKSB7Ci0gICAgdHJ5IHsKKyAgcHJvdGVjdGVkIEV4ZWN1dG9yU2VydmljZSBnZXRFeGVjdXRvclNlcnZpY2UoKSB7CisgICAgcmV0dXJuIGV4ZWN1dG9yU2VydmljZV87CisgIH0KKyAgCisgIHByb3RlY3RlZCBib29sZWFuIHByZVNlcnZlKCkgeworICAJdHJ5IHsKICAgICAgIHNlcnZlclRyYW5zcG9ydF8ubGlzdGVuKCk7CiAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpIHsKICAgICAgIExPR0dFUi5lcnJvcigiRXJyb3Igb2NjdXJyZWQgZHVyaW5nIGxpc3RlbmluZy4iLCB0dHgpOwotICAgICAgcmV0dXJuOworICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIC8vIFJ1biB0aGUgcHJlU2VydmUgZXZlbnQKICAgICBpZiAoZXZlbnRIYW5kbGVyXyAhPSBudWxsKSB7CiAgICAgICBldmVudEhhbmRsZXJfLnByZVNlcnZlKCk7CiAgICAgfQotCiAgICAgc3RvcHBlZF8gPSBmYWxzZTsKICAgICBzZXRTZXJ2aW5nKHRydWUpOworICAgIAorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgcHVibGljIHZvaWQgc2VydmUoKSB7CisgIAlpZiAoIXByZVNlcnZlKCkpIHsKKyAgCQlyZXR1cm47CisgIAl9CisKKyAgCWV4ZWN1dGUoKTsKKyAgCXdhaXRGb3JTaHV0ZG93bigpOworICAgIAorICAgIHNldFNlcnZpbmcoZmFsc2UpOworICB9CisgIAorICBwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKCkgewogICAgIGludCBmYWlsdXJlQ291bnQgPSAwOwogICAgIHdoaWxlICghc3RvcHBlZF8pIHsKICAgICAgIHRyeSB7CkBAIC0yMDgsOCArMjMxLDEwIEBACiAgICAgICAgIH0KICAgICAgIH0KICAgICB9Ci0KLSAgICBleGVjdXRvclNlcnZpY2VfLnNodXRkb3duKCk7CisgIH0KKyAgCisgIHByb3RlY3RlZCB2b2lkIHdhaXRGb3JTaHV0ZG93bigpIHsKKyAgCWV4ZWN1dG9yU2VydmljZV8uc2h1dGRvd24oKTsKIAogICAgIC8vIExvb3AgdW50aWwgYXdhaXRUZXJtaW5hdGlvbiBmaW5hbGx5IGRvZXMgcmV0dXJuIHdpdGhvdXQgYSBpbnRlcnJ1cHRlZAogICAgIC8vIGV4Y2VwdGlvbi4gSWYgd2UgZG9uJ3QgZG8gdGhpcywgdGhlbiB3ZSdsbCBzaHV0IGRvd24gcHJlbWF0dXJlbHkuIFdlIHdhbnQKQEAgLTIyNyw3ICsyNTIsNiBAQAogICAgICAgICBub3cgPSBuZXdub3c7CiAgICAgICB9CiAgICAgfQotICAgIHNldFNlcnZpbmcoZmFsc2UpOwogICB9CiAKICAgcHVibGljIHZvaWQgc3RvcCgpIHsKQEAgLTI2OSw3ICsyOTMsNyBAQAogICAgICAgICBpbnB1dFRyYW5zcG9ydCA9IGlucHV0VHJhbnNwb3J0RmFjdG9yeV8uZ2V0VHJhbnNwb3J0KGNsaWVudF8pOwogICAgICAgICBvdXRwdXRUcmFuc3BvcnQgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5Xy5nZXRUcmFuc3BvcnQoY2xpZW50Xyk7CiAgICAgICAgIGlucHV0UHJvdG9jb2wgPSBpbnB1dFByb3RvY29sRmFjdG9yeV8uZ2V0UHJvdG9jb2woaW5wdXRUcmFuc3BvcnQpOwotICAgICAgICBvdXRwdXRQcm90b2NvbCA9IG91dHB1dFByb3RvY29sRmFjdG9yeV8uZ2V0UHJvdG9jb2wob3V0cHV0VHJhbnNwb3J0KTsJICAKKyAgICAgICAgb3V0cHV0UHJvdG9jb2wgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnlfLmdldFByb3RvY29sKG91dHB1dFRyYW5zcG9ydCk7CiAKICAgICAgICAgZXZlbnRIYW5kbGVyID0gZ2V0RXZlbnRIYW5kbGVyKCk7CiAgICAgICAgIGlmIChldmVudEhhbmRsZXIgIT0gbnVsbCkgewpAQCAtMjg3LDE0ICszMTEsMjIgQEAKICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgIH0gY2F0Y2ggKFRTYXNsVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkgewotICAgICAgICAvLyBTb21ldGhpbmcgdGhhdHMgbm90IFNBU0wgd2FzIGluIHRoZSBzdHJlYW0sIGNvbnRpbnVlIHNpbGVudGx5IAotICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpIHsKLSAgICAgICAgLy8gQXNzdW1lIHRoZSBjbGllbnQgZGllZCBhbmQgY29udGludWUgc2lsZW50bHkKICAgICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24gdHgpIHsKICAgICAgICAgTE9HR0VSLmVycm9yKCJUaHJpZnQgZXJyb3Igb2NjdXJyZWQgZHVyaW5nIHByb2Nlc3Npbmcgb2YgbWVzc2FnZS4iLCB0eCk7CiAgICAgICB9IGNhdGNoIChFeGNlcHRpb24geCkgewotICAgICAgICBMT0dHRVIuZXJyb3IoIkVycm9yIG9jY3VycmVkIGR1cmluZyBwcm9jZXNzaW5nIG9mIG1lc3NhZ2UuIiwgeCk7CisgICAgICAgIC8vIFdlJ2xsIHVzdWFsbHkgcmVjZWl2ZSBSdW50aW1lRXhjZXB0aW9uIHR5cGVzIGhlcmUKKyAgICAgICAgLy8gTmVlZCB0byB1bndyYXAgdG8gYXNjZXJ0YWluIHJlYWwgY2F1c2luZyBleGNlcHRpb24gYmVmb3JlIHdlIGNob29zZSB0byBpZ25vcmUKKyAgICAgICAgVGhyb3dhYmxlIHJlYWxDYXVzZSA9IHguZ2V0Q2F1c2UoKTsKKyAgICAgICAgLy8gSWdub3JlIGVyci1sb2dnaW5nIGFsbCB0cmFuc3BvcnQtbGV2ZWwvdHlwZSBleGNlcHRpb25zCisgICAgICAgIGlmICgocmVhbENhdXNlICE9IG51bGwgJiYgcmVhbENhdXNlIGluc3RhbmNlb2YgVFRyYW5zcG9ydEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHx8ICh4IGluc3RhbmNlb2YgVFRyYW5zcG9ydEV4Y2VwdGlvbikpIHsKKyAgICAgICAgICBMT0dHRVIuZGVidWcoCisgICAgICAgICAgICAgICJSZWNlaXZlZCBUVHJhbnNwb3J0RXhjZXB0aW9uIGR1cmluZyBwcm9jZXNzaW5nIG9mIG1lc3NhZ2UuIElnbm9yaW5nLiIsCisgICAgICAgICAgICAgIHgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIExvZyB0aGUgZXhjZXB0aW9uIGF0IGVycm9yIGxldmVsIGFuZCBjb250aW51ZQorICAgICAgICAgIExPR0dFUi5lcnJvcigiRXJyb3Igb2NjdXJyZWQgZHVyaW5nIHByb2Nlc3Npbmcgb2YgbWVzc2FnZS4iLCB4KTsKKyAgICAgICAgfQogICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgaWYgKGV2ZW50SGFuZGxlciAhPSBudWxsKSB7CiAgICAgICAgICAgZXZlbnRIYW5kbGVyLmRlbGV0ZUNvbnRleHQoY29ubmVjdGlvbkNvbnRleHQsIGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKTsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VsZWN0b3JTZXJ2ZXIuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VsZWN0b3JTZXJ2ZXIuamF2YQppbmRleCAzNTNiOGUwLi4wMzg1MDdlIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlbGVjdG9yU2VydmVyLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZWxlY3RvclNlcnZlci5qYXZhCkBAIC0xOSw3ICsxOSwxNSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlcjsKIAoraW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlROb25ibG9ja2luZ1RyYW5zcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5DbG9zZWRDaGFubmVsRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdGFibGVDaGFubmVsOwogaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdGlvbktleTsKIGltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3RvcjsKIGltcG9ydCBqYXZhLm5pby5jaGFubmVscy5zcGkuU2VsZWN0b3JQcm92aWRlcjsKQEAgLTM3LDI0ICs0NSwxOCBAQAogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlJlamVjdGVkRXhlY3V0aW9uRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogCi1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE5vbmJsb2NraW5nVHJhbnNwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci0KIC8qKgogICogQSBIYWxmLVN5bmMvSGFsZi1Bc3luYyBzZXJ2ZXIgd2l0aCBhIHNlcGFyYXRlIHBvb2wgb2YgdGhyZWFkcyB0byBoYW5kbGUKICAqIG5vbi1ibG9ja2luZyBJL08uIEFjY2VwdHMgYXJlIGhhbmRsZWQgb24gYSBzaW5nbGUgdGhyZWFkLCBhbmQgYSBjb25maWd1cmFibGUKICAqIG51bWJlciBvZiBub25ibG9ja2luZyBzZWxlY3RvciB0aHJlYWRzIG1hbmFnZSByZWFkaW5nIGFuZCB3cml0aW5nIG9mIGNsaWVudAogICogY29ubmVjdGlvbnMuIEEgc3luY2hyb25vdXMgd29ya2VyIHRocmVhZCBwb29sIGhhbmRsZXMgcHJvY2Vzc2luZyBvZiByZXF1ZXN0cy4KLSAqIAorICoKICAqIFBlcmZvcm1zIGJldHRlciB0aGFuIFROb25ibG9ja2luZ1NlcnZlci9USHNIYVNlcnZlciBpbiBtdWx0aS1jb3JlCiAgKiBlbnZpcm9ubWVudHMgd2hlbiB0aGUgdGhlIGJvdHRsZW5lY2sgaXMgQ1BVIG9uIHRoZSBzaW5nbGUgc2VsZWN0b3IgdGhyZWFkCiAgKiBoYW5kbGluZyBJL08uIEluIGFkZGl0aW9uLCBiZWNhdXNlIHRoZSBhY2NlcHQgaGFuZGxpbmcgaXMgZGVjb3VwbGVkIGZyb20KICAqIHJlYWRzL3dyaXRlcyBhbmQgaW52b2NhdGlvbiwgdGhlIHNlcnZlciBoYXMgYmV0dGVyIGFiaWxpdHkgdG8gaGFuZGxlIGJhY2stCiAgKiBwcmVzc3VyZSBmcm9tIG5ldyBjb25uZWN0aW9ucyAoZS5nLiBzdG9wIGFjY2VwdGluZyB3aGVuIGJ1c3kpLgotICogCisgKgogICogTGlrZSBUTm9uYmxvY2tpbmdTZXJ2ZXIsIGl0IHJlbGllcyBvbiB0aGUgdXNlIG9mIFRGcmFtZWRUcmFuc3BvcnQuCiAgKi8KIHB1YmxpYyBjbGFzcyBUVGhyZWFkZWRTZWxlY3RvclNlcnZlciBleHRlbmRzIEFic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXIgewpAQCAtMjA1LDcgKzIwNyw3IEBACiAKICAgLyoqCiAgICAqIFN0YXJ0IHRoZSBhY2NlcHQgYW5kIHNlbGVjdG9yIHRocmVhZHMgcnVubmluZyB0byBkZWFsIHdpdGggY2xpZW50cy4KLSAgICogCisgICAqCiAgICAqIEByZXR1cm4gdHJ1ZSBpZiBldmVyeXRoaW5nIHdlbnQgb2ssIGZhbHNlIGlmIHdlIGNvdWxkbid0IHN0YXJ0IGZvciBzb21lCiAgICAqICAgICAgICAgcmVhc29uLgogICAgKi8KQEAgLTM0OSw3ICszNTEsNyBAQAogCiAgICAgLyoqCiAgICAgICogU2V0IHVwIHRoZSBBY2NlcHRUaGVhZAotICAgICAqIAorICAgICAqCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAqLwogICAgIHB1YmxpYyBBY2NlcHRUaHJlYWQoVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKQEAgLTQ3OCwxMCArNDgwLDEzIEBACiAKICAgICAvLyBBY2NlcHRlZCBjb25uZWN0aW9ucyBhZGRlZCBieSB0aGUgYWNjZXB0IHRocmVhZC4KICAgICBwcml2YXRlIGZpbmFsIEJsb2NraW5nUXVldWU8VE5vbmJsb2NraW5nVHJhbnNwb3J0PiBhY2NlcHRlZFF1ZXVlOworICAgIHByaXZhdGUgaW50IFNFTEVDVE9SX0FVVE9fUkVCVUlMRF9USFJFU0hPTEQgPSA1MTI7CisgICAgcHJpdmF0ZSBsb25nIE1PTklUT1JfUEVSSU9EID0gMTAwMEw7CisgICAgcHJpdmF0ZSBpbnQganZtQnVnID0gMDsKIAogICAgIC8qKgogICAgICAqIFNldCB1cCB0aGUgU2VsZWN0b3JUaHJlYWQgd2l0aCBhbiB1bmJvdW5kZWQgcXVldWUgZm9yIGluY29taW5nIGFjY2VwdHMuCi0gICAgICogCisgICAgICoKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICogICAgICAgICAgIGlmIGEgc2VsZWN0b3IgY2Fubm90IGJlIGNyZWF0ZWQKICAgICAgKi8KQEAgLTQ5MSw3ICs0OTYsNyBAQAogCiAgICAgLyoqCiAgICAgICogU2V0IHVwIHRoZSBTZWxlY3RvclRocmVhZCB3aXRoIGFuIGJvdW5kZWQgcXVldWUgZm9yIGluY29taW5nIGFjY2VwdHMuCi0gICAgICogCisgICAgICoKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICogICAgICAgICAgIGlmIGEgc2VsZWN0b3IgY2Fubm90IGJlIGNyZWF0ZWQKICAgICAgKi8KQEAgLTUwMSw3ICs1MDYsNyBAQAogCiAgICAgLyoqCiAgICAgICogU2V0IHVwIHRoZSBTZWxlY3RvclRocmVhZCB3aXRoIGEgc3BlY2lmaWVkIHF1ZXVlIGZvciBjb25uZWN0aW9ucy4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBhY2NlcHRlZFF1ZXVlCiAgICAgICogICAgICAgICAgVGhlIEJsb2NraW5nUXVldWUgaW1wbGVtZW50YXRpb24gZm9yIGhvbGRpbmcgaW5jb21pbmcgYWNjZXB0ZWQKICAgICAgKiAgICAgICAgICBjb25uZWN0aW9ucy4KQEAgLTUxNSw3ICs1MjAsNyBAQAogICAgIC8qKgogICAgICAqIEhhbmRzIG9mZiBhbiBhY2NlcHRlZCBjb25uZWN0aW9uIHRvIGJlIGhhbmRsZWQgYnkgdGhpcyB0aHJlYWQuIFRoaXMKICAgICAgKiBtZXRob2Qgd2lsbCBibG9jayBpZiB0aGUgcXVldWUgZm9yIG5ldyBjb25uZWN0aW9ucyBpcyBhdCBjYXBhY2l0eS4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBhY2NlcHRlZAogICAgICAqICAgICAgICAgIFRoZSBjb25uZWN0aW9uIHRoYXQgaGFzIGJlZW4gYWNjZXB0ZWQuCiAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb25uZWN0aW9uIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBhZGRlZC4KQEAgLTU2Niw4ICs1NzEsOCBAQAogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBzZWxlY3QoKSB7CiAgICAgICB0cnkgewotICAgICAgICAvLyB3YWl0IGZvciBpbyBldmVudHMuCi0gICAgICAgIHNlbGVjdG9yLnNlbGVjdCgpOworCisgICAgICAgIGRvU2VsZWN0KCk7CiAKICAgICAgICAgLy8gcHJvY2VzcyB0aGUgaW8gZXZlbnRzIHdlIHJlY2VpdmVkCiAgICAgICAgIEl0ZXJhdG9yPFNlbGVjdGlvbktleT4gc2VsZWN0ZWRLZXlzID0gc2VsZWN0b3Iuc2VsZWN0ZWRLZXlzKCkuaXRlcmF0b3IoKTsKQEAgLTU5Niw2ICs2MDEsNzcgQEAKICAgICAgIH0KICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBEbyBzZWxlY3QgYW5kIGp1ZGdlIGVwb2xsIGJ1ZyBoYXBwZW4uCisgICAgICogU2VlIDogaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDI1MQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBkb1NlbGVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICBsb25nIGJlZm9yZVNlbGVjdCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgaW50IHNlbGVjdGVkTnVtcyA9IHNlbGVjdG9yLnNlbGVjdCgpOworICAgICAgbG9uZyBhZnRlclNlbGVjdCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCisgICAgICBpZiAoc2VsZWN0ZWROdW1zID09IDApIHsKKyAgICAgICAganZtQnVnKys7CisgICAgICB9IGVsc2UgeworICAgICAgICBqdm1CdWcgPSAwOworICAgICAgfQorCisgICAgICBsb25nIHNlbGVjdGVkVGltZSA9IGFmdGVyU2VsZWN0IC0gYmVmb3JlU2VsZWN0OworICAgICAgaWYgKHNlbGVjdGVkVGltZSA+PSBNT05JVE9SX1BFUklPRCkgeworICAgICAgICBqdm1CdWcgPSAwOworICAgICAgfSBlbHNlIGlmIChqdm1CdWcgPiBTRUxFQ1RPUl9BVVRPX1JFQlVJTERfVEhSRVNIT0xEKSB7CisgICAgICAgIExPR0dFUi53YXJuKCJJbiB7fSBtcyBoYXBwZW4ge30gdGltZXMganZtIGJ1ZzsgcmVidWlsZGluZyBzZWxlY3Rvci4iLCBNT05JVE9SX1BFUklPRCwganZtQnVnKTsKKyAgICAgICAgcmVidWlsZFNlbGVjdG9yKCk7CisgICAgICAgIHNlbGVjdG9yLnNlbGVjdE5vdygpOworICAgICAgICBqdm1CdWcgPSAwOworICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwbGFjZXMgdGhlIGN1cnJlbnQgU2VsZWN0b3Igb2YgdGhpcyBTZWxlY3RvclRocmVhZCB3aXRoIG5ld2x5IGNyZWF0ZWQgU2VsZWN0b3IgdG8gd29yaworICAgICAqIGFyb3VuZCB0aGUgaW5mYW1vdXMgZXBvbGwgMTAwJSBDUFUgYnVnLgorICAgICAqLworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgcmVidWlsZFNlbGVjdG9yKCkgeworICAgICAgZmluYWwgU2VsZWN0b3Igb2xkU2VsZWN0b3IgPSBzZWxlY3RvcjsKKyAgICAgIGlmIChvbGRTZWxlY3RvciA9PSBudWxsKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIFNlbGVjdG9yIG5ld1NlbGVjdG9yID0gbnVsbDsKKyAgICAgIHRyeSB7CisgICAgICAgIG5ld1NlbGVjdG9yID0gU2VsZWN0b3Iub3BlbigpOworICAgICAgICBMT0dHRVIud2FybigiQ3JlYXRlZCBuZXcgU2VsZWN0b3IuIik7CisgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIExPR0dFUi5lcnJvcigiQ3JlYXRlIG5ldyBTZWxlY3RvciBlcnJvci4iLCBlKTsKKyAgICAgIH0KKworICAgICAgZm9yIChTZWxlY3Rpb25LZXkga2V5IDogb2xkU2VsZWN0b3Iuc2VsZWN0ZWRLZXlzKCkpIHsKKyAgICAgICAgaWYgKCFrZXkuaXNWYWxpZCgpICYmIGtleS5yZWFkeU9wcygpID09IDApCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIFNlbGVjdGFibGVDaGFubmVsIGNoYW5uZWwgPSBrZXkuY2hhbm5lbCgpOworICAgICAgICBPYmplY3QgYXR0YWNobWVudCA9IGtleS5hdHRhY2htZW50KCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBpZiAoYXR0YWNobWVudCA9PSBudWxsKSB7CisgICAgICAgICAgICBjaGFubmVsLnJlZ2lzdGVyKG5ld1NlbGVjdG9yLCBrZXkucmVhZHlPcHMoKSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNoYW5uZWwucmVnaXN0ZXIobmV3U2VsZWN0b3IsIGtleS5yZWFkeU9wcygpLCBhdHRhY2htZW50KTsKKyAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKENsb3NlZENoYW5uZWxFeGNlcHRpb24gZSkgeworICAgICAgICAgIExPR0dFUi5lcnJvcigiUmVnaXN0ZXIgbmV3IHNlbGVjdG9yIGtleSBlcnJvci4iLCBlKTsKKyAgICAgICAgfQorCisgICAgICB9CisKKyAgICAgIHNlbGVjdG9yID0gbmV3U2VsZWN0b3I7CisgICAgICB0cnkgeworICAgICAgICBvbGRTZWxlY3Rvci5jbG9zZSgpOworICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICBMT0dHRVIuZXJyb3IoIkNsb3NlIG9sZCBzZWxlY3RvciBlcnJvci4iLCBlKTsKKyAgICAgIH0KKyAgICAgIExPR0dFUi53YXJuKCJSZXBsYWNlIG5ldyBzZWxlY3RvciBzdWNjZXNzLiIpOworICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzQWNjZXB0ZWRDb25uZWN0aW9ucygpIHsKICAgICAgIC8vIFJlZ2lzdGVyIGFjY2VwdGVkIGNvbm5lY3Rpb25zCiAgICAgICB3aGlsZSAoIXN0b3BwZWRfKSB7CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L0F1dG9FeHBhbmRpbmdCdWZmZXIuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvQXV0b0V4cGFuZGluZ0J1ZmZlci5qYXZhCmluZGV4IGIwMjkwNWYuLmZjM2FhOTIgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvQXV0b0V4cGFuZGluZ0J1ZmZlci5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvQXV0b0V4cGFuZGluZ0J1ZmZlci5qYXZhCkBAIC0xOCw2ICsxOCw4IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OwogCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKwogLyoqCiAgKiBIZWxwZXIgY2xhc3MgdGhhdCB3cmFwcyBhIGJ5dGVbXSBzbyB0aGF0IGl0IGNhbiBleHBhbmQgYW5kIGJlIHJldXNlZC4gVXNlcnMKICAqIHNob3VsZCBjYWxsIHJlc2l6ZUlmTmVjZXNzYXJ5IHRvIG1ha2Ugc3VyZSB0aGUgYnVmZmVyIGhhcyBzdWl0YWJsZSBjYXBhY2l0eSwKQEAgLTI1LDI4ICsyNywyNCBAQAogICogcmF0ZSBzbGlnaHRseSBmYXN0ZXIgdGhhbiB0aGUgcmVxdWVzdGVkIGNhcGFjaXR5IHdpdGggdGhlICh1bnRlc3RlZCkKICAqIG9iamVjdGl2ZSBvZiBhdm9pZGluZyBleHBlbnNpdmUgYnVmZmVyIGFsbG9jYXRpb25zIGFuZCBjb3BpZXMuCiAgKi8KLXB1YmxpYyBjbGFzcyBBdXRvRXhwYW5kaW5nQnVmZmVyIHsKK2NsYXNzIEF1dG9FeHBhbmRpbmdCdWZmZXIgewogICBwcml2YXRlIGJ5dGVbXSBhcnJheTsKIAotICBwcml2YXRlIGZpbmFsIGRvdWJsZSBncm93dGhDb2VmZmljaWVudDsKLQotICBwdWJsaWMgQXV0b0V4cGFuZGluZ0J1ZmZlcihpbnQgaW5pdGlhbENhcGFjaXR5LCBkb3VibGUgZ3Jvd3RoQ29lZmZpY2llbnQpIHsKLSAgICBpZiAoZ3Jvd3RoQ29lZmZpY2llbnQgPCAxLjApIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkdyb3d0aCBjb2VmZmljaWVudCBtdXN0IGJlID49IDEuMCIpOwotICAgIH0KLSAgICBhcnJheSA9IG5ldyBieXRlW2luaXRpYWxDYXBhY2l0eV07Ci0gICAgdGhpcy5ncm93dGhDb2VmZmljaWVudCA9IGdyb3d0aENvZWZmaWNpZW50OworICBwdWJsaWMgQXV0b0V4cGFuZGluZ0J1ZmZlcihpbnQgaW5pdGlhbENhcGFjaXR5KSB7CisgICAgdGhpcy5hcnJheSA9IG5ldyBieXRlW2luaXRpYWxDYXBhY2l0eV07CiAgIH0KIAogICBwdWJsaWMgdm9pZCByZXNpemVJZk5lY2Vzc2FyeShpbnQgc2l6ZSkgewotICAgIGlmIChhcnJheS5sZW5ndGggPCBzaXplKSB7Ci0gICAgICBieXRlW10gbmV3QnVmID0gbmV3IGJ5dGVbKGludCkoc2l6ZSAqIGdyb3d0aENvZWZmaWNpZW50KV07Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCAwLCBuZXdCdWYsIDAsIGFycmF5Lmxlbmd0aCk7Ci0gICAgICBhcnJheSA9IG5ld0J1ZjsKKyAgICBmaW5hbCBpbnQgY3VycmVudENhcGFjaXR5ID0gdGhpcy5hcnJheS5sZW5ndGg7CisgICAgaWYgKGN1cnJlbnRDYXBhY2l0eSA8IHNpemUpIHsKKyAgICAgIC8vIEluY3JlYXNlIGJ5IGEgZmFjdG9yIG9mIDEuNXgKKyAgICAgIGludCBncm93Q2FwYWNpdHkgPSBjdXJyZW50Q2FwYWNpdHkgKyAoY3VycmVudENhcGFjaXR5ID4+IDEpOworICAgICAgaW50IG5ld0NhcGFjaXR5ID0gTWF0aC5tYXgoZ3Jvd0NhcGFjaXR5LCBzaXplKTsKKyAgICAgIHRoaXMuYXJyYXkgPSBBcnJheXMuY29weU9mKGFycmF5LCBuZXdDYXBhY2l0eSk7CiAgICAgfQogICB9CiAKICAgcHVibGljIGJ5dGVbXSBhcnJheSgpIHsKLSAgICByZXR1cm4gYXJyYXk7CisgICAgcmV0dXJuIHRoaXMuYXJyYXk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvQXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvQXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQuamF2YQppbmRleCAwODFiYzQ4Li5hMjhkMjU0IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L0F1dG9FeHBhbmRpbmdCdWZmZXJSZWFkVHJhbnNwb3J0LmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9BdXRvRXhwYW5kaW5nQnVmZmVyUmVhZFRyYW5zcG9ydC5qYXZhCkBAIC0yOCw4ICsyOCw4IEBACiAgIHByaXZhdGUgaW50IHBvcyA9IDA7CiAgIHByaXZhdGUgaW50IGxpbWl0ID0gMDsKIAotICBwdWJsaWMgQXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQoaW50IGluaXRpYWxDYXBhY2l0eSwgZG91YmxlIG92ZXJncm93dGhDb2VmZmljaWVudCkgewotICAgIHRoaXMuYnVmID0gbmV3IEF1dG9FeHBhbmRpbmdCdWZmZXIoaW5pdGlhbENhcGFjaXR5LCBvdmVyZ3Jvd3RoQ29lZmZpY2llbnQpOworICBwdWJsaWMgQXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQoaW50IGluaXRpYWxDYXBhY2l0eSkgeworICAgIHRoaXMuYnVmID0gbmV3IEF1dG9FeHBhbmRpbmdCdWZmZXIoaW5pdGlhbENhcGFjaXR5KTsKICAgfQogCiAgIHB1YmxpYyB2b2lkIGZpbGwoVFRyYW5zcG9ydCBpblRyYW5zLCBpbnQgbGVuZ3RoKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L0F1dG9FeHBhbmRpbmdCdWZmZXJXcml0ZVRyYW5zcG9ydC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9BdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQuamF2YQppbmRleCA5YjM1NjkzLi5lYzdlN2Q0IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L0F1dG9FeHBhbmRpbmdCdWZmZXJXcml0ZVRyYW5zcG9ydC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvQXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0LmphdmEKQEAgLTI1LDEwICsyNSwyOSBAQAogCiAgIHByaXZhdGUgZmluYWwgQXV0b0V4cGFuZGluZ0J1ZmZlciBidWY7CiAgIHByaXZhdGUgaW50IHBvczsKKyAgcHJpdmF0ZSBpbnQgcmVzOwogCi0gIHB1YmxpYyBBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQoaW50IGluaXRpYWxDYXBhY2l0eSwgZG91YmxlIGdyb3d0aENvZWZmaWNpZW50KSB7Ci0gICAgdGhpcy5idWYgPSBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlcihpbml0aWFsQ2FwYWNpdHksIGdyb3d0aENvZWZmaWNpZW50KTsKLSAgICB0aGlzLnBvcyA9IDA7CisgIC8qKgorICAgKiBDb25zdHJ1Y3Rvci4KKyAgICogQHBhcmFtIGluaXRpYWxDYXBhY2l0eSB0aGUgaW5pdGlhbCBjYXBhY2l0eSBvZiB0aGUgYnVmZmVyCisgICAqIEBwYXJhbSBmcm9udFJlc2VydmUgc3BhY2UsIGlmIGFueSwgdG8gcmVzZXJ2ZSBhdCB0aGUgYmVnaW5uaW5nIHN1Y2gKKyAgICogICAgICAgICAgICAgICAgICAgICB0aGF0IHRoZSBmaXJzdCB3cml0ZSBpcyBhZnRlciB0aGlzIHJlc2VydmUuCisgICAqICAgICAgICAgICAgICAgICAgICAgVGhpcyBhbGxvd3MgZnJhbWVkIHRyYW5zcG9ydCB0byByZXNlcnZlIHNwYWNlCisgICAqICAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSBmcmFtZSBidWZmZXIgbGVuZ3RoLgorICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBpbml0aWFsQ2FwYWNpdHkgaXMgbGVzcyB0aGFuIG9uZQorICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBmcm9udFJlc2VydmUgaXMgbGVzcyB0aGFuIHplcm8KKyAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgZnJvbnRSZXNlcnZlIGlzIGdyZWF0ZXIgdGhhbiBpbml0aWFsQ2FwYWNpdHkKKyAgICovCisgIHB1YmxpYyBBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQoaW50IGluaXRpYWxDYXBhY2l0eSwgaW50IGZyb250UmVzZXJ2ZSkgeworICAgIGlmIChpbml0aWFsQ2FwYWNpdHkgPCAxKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbml0aWFsQ2FwYWNpdHkiKTsKKyAgICB9CisgICAgaWYgKGZyb250UmVzZXJ2ZSA8IDAgfHwgaW5pdGlhbENhcGFjaXR5IDwgZnJvbnRSZXNlcnZlKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJmcm9udFJlc2VydmUiKTsKKyAgICB9CisgICAgdGhpcy5idWYgPSBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlcihpbml0aWFsQ2FwYWNpdHkpOworICAgIHRoaXMucG9zID0gZnJvbnRSZXNlcnZlOworICAgIHRoaXMucmVzID0gZnJvbnRSZXNlcnZlOwogICB9CiAKICAgQE92ZXJyaWRlCkBAIC01NiwxMSArNzUsMTQgQEAKICAgICByZXR1cm4gYnVmOwogICB9CiAKLSAgcHVibGljIGludCBnZXRQb3MoKSB7CisgIC8qKgorICAgKiBAcmV0dXJuIGxlbmd0aCBvZiB0aGUgYnVmZmVyLCBpbmNsdWRpbmcgYW55IGZyb250IHJlc2VydmUKKyAgICovCisgIHB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewogICAgIHJldHVybiBwb3M7CiAgIH0KIAogICBwdWJsaWMgdm9pZCByZXNldCgpIHsKLSAgICBwb3MgPSAwOworICAgIHBvcyA9IHJlczsKICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UQnl0ZUJ1ZmZlci5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UQnl0ZUJ1ZmZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2YjA2NTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RCeXRlQnVmZmVyLmphdmEKQEAgLTAsMCArMSw4NyBAQAorcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBqYXZhLm5pby5CdWZmZXJPdmVyZmxvd0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CdWZmZXJVbmRlcmZsb3dFeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKKworLyoqCisgKiBCeXRlQnVmZmVyLWJhY2tlZCBpbXBsZW1lbnRhdGlvbiBvZiBUVHJhbnNwb3J0LgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgVEJ5dGVCdWZmZXIgZXh0ZW5kcyBUVHJhbnNwb3J0IHsKKyAgcHJpdmF0ZSBmaW5hbCBCeXRlQnVmZmVyIGJ5dGVCdWZmZXI7CisKKyAgLyoqCisgICAqIENyZWF0ZXMgYSBuZXcgVEJ5dGVCdWZmZXIgd3JhcHBpbmcgYSBnaXZlbiBOSU8gQnl0ZUJ1ZmZlci4KKyAgICovCisgIHB1YmxpYyBUQnl0ZUJ1ZmZlcihCeXRlQnVmZmVyIGJ5dGVCdWZmZXIpIHsKKyAgICB0aGlzLmJ5dGVCdWZmZXIgPSBieXRlQnVmZmVyOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGlzT3BlbigpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBvcGVuKCkgeworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgZmluYWwgaW50IG4gPSBNYXRoLm1pbihieXRlQnVmZmVyLnJlbWFpbmluZygpLCBsZW4pOworICAgIGlmIChuID4gMCkgeworICAgICAgdHJ5IHsKKyAgICAgICAgYnl0ZUJ1ZmZlci5nZXQoYnVmLCBvZmYsIG4pOworICAgICAgfSBjYXRjaCAoQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIlVuZXhwZWN0ZWQgZW5kIG9mIGlucHV0IGJ1ZmZlciIsIGUpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIGJ5dGVCdWZmZXIucHV0KGJ1Ziwgb2ZmLCBsZW4pOworICAgIH0gY2F0Y2ggKEJ1ZmZlck92ZXJmbG93RXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJOb3QgZW5vdWdoIHJvb20gaW4gb3V0cHV0IGJ1ZmZlciIsIGUpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBHZXQgdGhlIHVuZGVybHlpbmcgTklPIEJ5dGVCdWZmZXIuCisgICAqLworICBwdWJsaWMgQnl0ZUJ1ZmZlciBnZXRCeXRlQnVmZmVyKCkgeworICAgIHJldHVybiBieXRlQnVmZmVyOworICB9CisKKyAgLyoqCisgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBjYWxsIGNsZWFyKCkgb24gdGhlIHVuZGVybHlpbmcgTklPIEJ5dGVCdWZmZXIuCisgICAqLworICBwdWJsaWMgVEJ5dGVCdWZmZXIgY2xlYXIoKSB7CisgICAgYnl0ZUJ1ZmZlci5jbGVhcigpOworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgLyoqCisgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBjYWxsIGZsaXAoKSBvbiB0aGUgdW5kZXJseWluZyBOSU8gQnl0ZUJ1ZmZlci4KKyAgICAgKi8KKyAgcHVibGljIFRCeXRlQnVmZmVyIGZsaXAoKSB7CisgICAgYnl0ZUJ1ZmZlci5mbGlwKCk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICAvKioKKyAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGNvbnZlcnQgdGhlIHVuZGVybHlpbmcgTklPIEJ5dGVCdWZmZXIgdG8gYQorICAgKiBwbGFpbiBvbGQgYnl0ZSBhcnJheS4KKyAgICovCisgIHB1YmxpYyBieXRlW10gdG9CeXRlQXJyYXkoKSB7CisgICAgZmluYWwgYnl0ZVtdIGRhdGEgPSBuZXcgYnl0ZVtieXRlQnVmZmVyLnJlbWFpbmluZygpXTsKKyAgICBieXRlQnVmZmVyLnNsaWNlKCkuZ2V0KGRhdGEpOworICAgIHJldHVybiBkYXRhOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGYXN0RnJhbWVkVHJhbnNwb3J0LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGYXN0RnJhbWVkVHJhbnNwb3J0LmphdmEKaW5kZXggZTMyYjdkYi4uYTFmZDI0OSAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URmFzdEZyYW1lZFRyYW5zcG9ydC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZhc3RGcmFtZWRUcmFuc3BvcnQuamF2YQpAQCAtMTksMTIgKzE5LDEyIEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKIAogLyoqCi0gKiBUaGlzIHRyYW5zcG9ydCBpcyB3aXJlIGNvbXBhdGlibGUgd2l0aCB7QGxpbmsgVEZyYW1lZFRyYW5zcG9ydH0sIGJ1dCBtYWtlcyAKKyAqIFRoaXMgdHJhbnNwb3J0IGlzIHdpcmUgY29tcGF0aWJsZSB3aXRoIHtAbGluayBURnJhbWVkVHJhbnNwb3J0fSwgYnV0IG1ha2VzCiAgKiB1c2Ugb2YgcmV1c2FibGUsIGV4cGFuZGluZyByZWFkIGFuZCB3cml0ZSBidWZmZXJzIGluIG9yZGVyIHRvIGF2b2lkCiAgKiBhbGxvY2F0aW5nIG5ldyBieXRlW11zIGFsbCB0aGUgdGltZS4gU2luY2UgdGhlIGJ1ZmZlcnMgb25seSBleHBhbmQsIHlvdQogICogc2hvdWxkIHByb2JhYmx5IG9ubHkgdXNlIHRoaXMgdHJhbnNwb3J0IGlmIHlvdXIgbWVzc2FnZXMgYXJlIG5vdCB0b28gdmFyaWFibHkKICAqIGxhcmdlLCB1bmxlc3MgdGhlIHBlcnNpc3RlbnQgbWVtb3J5IGNvc3QgaXMgbm90IGFuIGlzc3VlLgotICogCisgKgogICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBOT1QgdGhyZWFkc2FmZS4KICAqLwogcHVibGljIGNsYXNzIFRGYXN0RnJhbWVkVHJhbnNwb3J0IGV4dGVuZHMgVFRyYW5zcG9ydCB7CkBAIC02NSw3ICs2NSw4IEBACiAKICAgcHJpdmF0ZSBmaW5hbCBUVHJhbnNwb3J0IHVuZGVybHlpbmc7CiAgIHByaXZhdGUgZmluYWwgQXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0IHdyaXRlQnVmZmVyOwotICBwcml2YXRlIGZpbmFsIEF1dG9FeHBhbmRpbmdCdWZmZXJSZWFkVHJhbnNwb3J0IHJlYWRCdWZmZXI7CisgIHByaXZhdGUgQXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQgcmVhZEJ1ZmZlcjsKKyAgcHJpdmF0ZSBmaW5hbCBpbnQgaW5pdGlhbEJ1ZmZlckNhcGFjaXR5OwogICBwcml2YXRlIGZpbmFsIGJ5dGVbXSBpMzJidWYgPSBuZXcgYnl0ZVs0XTsKICAgcHJpdmF0ZSBmaW5hbCBpbnQgbWF4TGVuZ3RoOwogCkBAIC05MSw3ICs5Miw3IEBACiAgIH0KIAogICAvKioKLSAgICogCisgICAqCiAgICAqIEBwYXJhbSB1bmRlcmx5aW5nIFRyYW5zcG9ydCB0aGF0IHJlYWwgcmVhZHMgYW5kIHdyaXRlcyB3aWxsIGdvIHRocm91Z2ggdG8uCiAgICAqIEBwYXJhbSBpbml0aWFsQnVmZmVyQ2FwYWNpdHkgVGhlIGluaXRpYWwgc2l6ZSBvZiB0aGUgcmVhZCBhbmQgd3JpdGUgYnVmZmVycy4KICAgICogSW4gcHJhY3RpY2UsIGl0J3Mgbm90IGNyaXRpY2FsIHRvIHNldCB0aGlzIHVubGVzcyB5b3Uga25vdyBpbiBhZHZhbmNlIHRoYXQKQEAgLTEwNCw4ICsxMDUsOSBAQAogICBwdWJsaWMgVEZhc3RGcmFtZWRUcmFuc3BvcnQoVFRyYW5zcG9ydCB1bmRlcmx5aW5nLCBpbnQgaW5pdGlhbEJ1ZmZlckNhcGFjaXR5LCBpbnQgbWF4TGVuZ3RoKSB7CiAgICAgdGhpcy51bmRlcmx5aW5nID0gdW5kZXJseWluZzsKICAgICB0aGlzLm1heExlbmd0aCA9IG1heExlbmd0aDsKLSAgICB3cml0ZUJ1ZmZlciA9IG5ldyBBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQoaW5pdGlhbEJ1ZmZlckNhcGFjaXR5LCAxLjUpOwotICAgIHJlYWRCdWZmZXIgPSBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQoaW5pdGlhbEJ1ZmZlckNhcGFjaXR5LCAxLjUpOworICAgIHRoaXMuaW5pdGlhbEJ1ZmZlckNhcGFjaXR5ID0gaW5pdGlhbEJ1ZmZlckNhcGFjaXR5OworICAgIHJlYWRCdWZmZXIgPSBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQoaW5pdGlhbEJ1ZmZlckNhcGFjaXR5KTsKKyAgICB3cml0ZUJ1ZmZlciA9IG5ldyBBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQoaW5pdGlhbEJ1ZmZlckNhcGFjaXR5LCA0KTsKICAgfQogCiAgIEBPdmVycmlkZQpAQCAtMTQxLDExICsxNDMsMTQgQEAKICAgICBpbnQgc2l6ZSA9IFRGcmFtZWRUcmFuc3BvcnQuZGVjb2RlRnJhbWVTaXplKGkzMmJ1Zik7CiAKICAgICBpZiAoc2l6ZSA8IDApIHsKLSAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJSZWFkIGEgbmVnYXRpdmUgZnJhbWUgc2l6ZSAoIiArIHNpemUgKyAiKSEiKTsKKyAgICAgIGNsb3NlKCk7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkNPUlJVUFRFRF9EQVRBLCAiUmVhZCBhIG5lZ2F0aXZlIGZyYW1lIHNpemUgKCIgKyBzaXplICsgIikhIik7CiAgICAgfQogCiAgICAgaWYgKHNpemUgPiBtYXhMZW5ndGgpIHsKLSAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJGcmFtZSBzaXplICgiICsgc2l6ZSArICIpIGxhcmdlciB0aGFuIG1heCBsZW5ndGggKCIgKyBtYXhMZW5ndGggKyAiKSEiKTsKKyAgICAgIGNsb3NlKCk7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkNPUlJVUFRFRF9EQVRBLAorICAgICAgICAgICJGcmFtZSBzaXplICgiICsgc2l6ZSArICIpIGxhcmdlciB0aGFuIG1heCBsZW5ndGggKCIgKyBtYXhMZW5ndGggKyAiKSEiKTsKICAgICB9CiAKICAgICByZWFkQnVmZmVyLmZpbGwodW5kZXJseWluZywgc2l6ZSk7CkBAIC0xNjEsMTIgKzE2NiwxOSBAQAogICAgIHJlYWRCdWZmZXIuY29uc3VtZUJ1ZmZlcihsZW4pOwogICB9CiAKKyAgLyoqCisgICAqIE9ubHkgY2xlYXJzIHRoZSByZWFkIGJ1ZmZlciEKKyAgICovCisgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgIHJlYWRCdWZmZXIgPSBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQoaW5pdGlhbEJ1ZmZlckNhcGFjaXR5KTsKKyAgfQorCiAgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKLSAgICBpbnQgbGVuZ3RoID0gd3JpdGVCdWZmZXIuZ2V0UG9zKCk7Ci0gICAgVEZyYW1lZFRyYW5zcG9ydC5lbmNvZGVGcmFtZVNpemUobGVuZ3RoLCBpMzJidWYpOwotICAgIHVuZGVybHlpbmcud3JpdGUoaTMyYnVmLCAwLCA0KTsKLSAgICB1bmRlcmx5aW5nLndyaXRlKHdyaXRlQnVmZmVyLmdldEJ1ZigpLmFycmF5KCksIDAsIGxlbmd0aCk7CisgICAgaW50IHBheWxvYWRMZW5ndGggPSB3cml0ZUJ1ZmZlci5nZXRMZW5ndGgoKSAtIDQ7ICAgICAgICAKKyAgICBieXRlW10gZGF0YSA9IHdyaXRlQnVmZmVyLmdldEJ1ZigpLmFycmF5KCk7CisgICAgVEZyYW1lZFRyYW5zcG9ydC5lbmNvZGVGcmFtZVNpemUocGF5bG9hZExlbmd0aCwgZGF0YSk7CisgICAgdW5kZXJseWluZy53cml0ZShkYXRhLCAwLCBwYXlsb2FkTGVuZ3RoICsgNCk7CiAgICAgd3JpdGVCdWZmZXIucmVzZXQoKTsKICAgICB1bmRlcmx5aW5nLmZsdXNoKCk7CiAgIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZpbGVQcm9jZXNzb3IuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZpbGVQcm9jZXNzb3IuamF2YQppbmRleCA0ZTZhMTk4Li45NjA4N2QxIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGaWxlUHJvY2Vzc29yLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVByb2Nlc3Nvci5qYXZhCkBAIC0yNyw4ICsyNyw2IEBACiAvKioKICAqIEZpbGVQcm9jZXNzb3I6IGhlbHBzIGluIHByb2Nlc3NpbmcgZmlsZXMgZ2VuZXJhdGVkIGJ5IFRGaWxlVHJhbnNwb3J0LgogICogUG9ydCBvZiBvcmlnaW5hbCBjcHAgaW1wbGVtZW50YXRpb24KLSAqCi0gKiBAYXV0aG9yIEpveWRlZXAgU2VuIFNhcm1hIDxqc3Nhcm1hQGZhY2Vib29rLmNvbT4KICAqLwogcHVibGljIGNsYXNzIFRGaWxlUHJvY2Vzc29yIHsKIApkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5qYXZhCmluZGV4IDAwNDRkMmEuLmMwMTFjNTIgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0LmphdmEKQEAgLTMzLDggKzMzLDYgQEAKICAqIEl0IG1heSBtYWtlIGJldHRlciBzZW5zZSB0byBwcm92aWRlIGEgYmFzaWMgc3RyZWFtIGFjY2VzcyBvbiB0b3Agb2YgdGhlIGZyYW1lZCBmaWxlIGZvcm1hdAogICogVGhlIEZpbGVUcmFuc3BvcnQgY2FuIHRoZW4gYmUgYSB1c2VyIG9mIHRoaXMgZnJhbWVkIGZpbGUgZm9ybWF0IHdpdGggc29tZSBhZGRpdGlvbmFsIGxvZ2ljCiAgKiBmb3IgY2h1bmtpbmcuCi0gKgotICogQGF1dGhvciBKb3lkZWVwIFNlbiBTYXJtYSA8anNzYXJtYUBmYWNlYm9vay5jb20+CiAgKi8KIHB1YmxpYyBjbGFzcyBURmlsZVRyYW5zcG9ydCBleHRlbmRzIFRUcmFuc3BvcnQgewogCkBAIC0zNjgsNyArMzY2LDcgQEAKICAgICAgIGN1cnJlbnRFdmVudF8gPSBuZXcgRXZlbnQobmV3IGJ5dGUgWzI1Nl0pOwogCiAgICAgICBpZighcmVhZE9ubHlfKQotICAgICAgICBvdXRwdXRTdHJlYW1fID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKGlucHV0RmlsZV8uZ2V0T3V0cHV0U3RyZWFtKCksIDgxOTIpOworICAgICAgICBvdXRwdXRTdHJlYW1fID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKGlucHV0RmlsZV8uZ2V0T3V0cHV0U3RyZWFtKCkpOwogICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkgewogICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwgaW94KTsKICAgICB9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5qYXZhCmluZGV4IGM5NDhhYTQuLmEwMDZjM2EgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5qYXZhCkBAIC00NSw3ICs0NSw4IEBACiAgIC8qKgogICAgKiBCdWZmZXIgZm9yIGlucHV0CiAgICAqLwotICBwcml2YXRlIFRNZW1vcnlJbnB1dFRyYW5zcG9ydCByZWFkQnVmZmVyXyA9IG5ldyBUTWVtb3J5SW5wdXRUcmFuc3BvcnQobmV3IGJ5dGVbMF0pOworICBwcml2YXRlIGZpbmFsIFRNZW1vcnlJbnB1dFRyYW5zcG9ydCByZWFkQnVmZmVyXyA9CisgICAgbmV3IFRNZW1vcnlJbnB1dFRyYW5zcG9ydChuZXcgYnl0ZVswXSk7CiAKICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5IGV4dGVuZHMgVFRyYW5zcG9ydEZhY3RvcnkgewogICAgIHByaXZhdGUgaW50IG1heExlbmd0aF87CkBAIC02NSwxNiArNjYsMjUgQEAKICAgfQogCiAgIC8qKgorICAgKiBTb21ldGhpbmcgdG8gZmlsbCBpbiB0aGUgZmlyc3QgZm91ciBieXRlcyBvZiB0aGUgYnVmZmVyCisgICAqIHRvIG1ha2Ugcm9vbSBmb3IgdGhlIGZyYW1lIHNpemUuICBUaGlzIGFsbG93cyB0aGUKKyAgICogaW1wbGVtZW50YXRpb24gdG8gd3JpdGUgb25jZSBpbnN0ZWFkIG9mIHR3aWNlLgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIHNpemVGaWxsZXJfID0gbmV3IGJ5dGVbXSB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfTsKKworICAvKioKICAgICogQ29uc3RydWN0b3Igd3JhcHMgYXJvdW5kIGFub3RoZXIgdHJhbnNwb3J0CiAgICAqLwogICBwdWJsaWMgVEZyYW1lZFRyYW5zcG9ydChUVHJhbnNwb3J0IHRyYW5zcG9ydCwgaW50IG1heExlbmd0aCkgewogICAgIHRyYW5zcG9ydF8gPSB0cmFuc3BvcnQ7CiAgICAgbWF4TGVuZ3RoXyA9IG1heExlbmd0aDsKKyAgICB3cml0ZUJ1ZmZlcl8ud3JpdGUoc2l6ZUZpbGxlcl8sIDAsIDQpOwogICB9CiAKICAgcHVibGljIFRGcmFtZWRUcmFuc3BvcnQoVFRyYW5zcG9ydCB0cmFuc3BvcnQpIHsKICAgICB0cmFuc3BvcnRfID0gdHJhbnNwb3J0OwogICAgIG1heExlbmd0aF8gPSBURnJhbWVkVHJhbnNwb3J0LkRFRkFVTFRfTUFYX0xFTkdUSDsKKyAgICB3cml0ZUJ1ZmZlcl8ud3JpdGUoc2l6ZUZpbGxlcl8sIDAsIDQpOwogICB9CiAKICAgcHVibGljIHZvaWQgb3BlbigpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKQEAgLTkwLDExICsxMDAsOSBAQAogICB9CiAKICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKLSAgICBpZiAocmVhZEJ1ZmZlcl8gIT0gbnVsbCkgewotICAgICAgaW50IGdvdCA9IHJlYWRCdWZmZXJfLnJlYWQoYnVmLCBvZmYsIGxlbik7Ci0gICAgICBpZiAoZ290ID4gMCkgewotICAgICAgICByZXR1cm4gZ290OwotICAgICAgfQorICAgIGludCBnb3QgPSByZWFkQnVmZmVyXy5yZWFkKGJ1Ziwgb2ZmLCBsZW4pOworICAgIGlmIChnb3QgPiAwKSB7CisgICAgICByZXR1cm4gZ290OwogICAgIH0KIAogICAgIC8vIFJlYWQgYW5vdGhlciBmcmFtZSBvZiBkYXRhCkBAIC0xMjMsNiArMTMxLDEwIEBACiAgICAgcmVhZEJ1ZmZlcl8uY29uc3VtZUJ1ZmZlcihsZW4pOwogICB9CiAKKyAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgcmVhZEJ1ZmZlcl8uY2xlYXIoKTsKKyAgfQorCiAgIHByaXZhdGUgZmluYWwgYnl0ZVtdIGkzMmJ1ZiA9IG5ldyBieXRlWzRdOwogCiAgIHByaXZhdGUgdm9pZCByZWFkRnJhbWUoKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CkBAIC0xMzAsMTEgKzE0MiwxNCBAQAogICAgIGludCBzaXplID0gZGVjb2RlRnJhbWVTaXplKGkzMmJ1Zik7CiAKICAgICBpZiAoc2l6ZSA8IDApIHsKLSAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJSZWFkIGEgbmVnYXRpdmUgZnJhbWUgc2l6ZSAoIiArIHNpemUgKyAiKSEiKTsKKyAgICAgIGNsb3NlKCk7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkNPUlJVUFRFRF9EQVRBLCAiUmVhZCBhIG5lZ2F0aXZlIGZyYW1lIHNpemUgKCIgKyBzaXplICsgIikhIik7CiAgICAgfQogCiAgICAgaWYgKHNpemUgPiBtYXhMZW5ndGhfKSB7Ci0gICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiRnJhbWUgc2l6ZSAoIiArIHNpemUgKyAiKSBsYXJnZXIgdGhhbiBtYXggbGVuZ3RoICgiICsgbWF4TGVuZ3RoXyArICIpISIpOworICAgICAgY2xvc2UoKTsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uQ09SUlVQVEVEX0RBVEEsCisgICAgICAgICAgIkZyYW1lIHNpemUgKCIgKyBzaXplICsgIikgbGFyZ2VyIHRoYW4gbWF4IGxlbmd0aCAoIiArIG1heExlbmd0aF8gKyAiKSEiKTsKICAgICB9CiAKICAgICBieXRlW10gYnVmZiA9IG5ldyBieXRlW3NpemVdOwpAQCAtMTQ5LDEyICsxNjQsMTIgQEAKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gewogICAgIGJ5dGVbXSBidWYgPSB3cml0ZUJ1ZmZlcl8uZ2V0KCk7Ci0gICAgaW50IGxlbiA9IHdyaXRlQnVmZmVyXy5sZW4oKTsKKyAgICBpbnQgbGVuID0gd3JpdGVCdWZmZXJfLmxlbigpIC0gNDsgICAgICAgLy8gYWNjb3VudCBmb3IgdGhlIHByZXBlbmRlZCBmcmFtZSBzaXplCiAgICAgd3JpdGVCdWZmZXJfLnJlc2V0KCk7CisgICAgd3JpdGVCdWZmZXJfLndyaXRlKHNpemVGaWxsZXJfLCAwLCA0KTsgIC8vIG1ha2Ugcm9vbSBmb3IgdGhlIG5leHQgZnJhbWUncyBzaXplIGRhdGEKIAotICAgIGVuY29kZUZyYW1lU2l6ZShsZW4sIGkzMmJ1Zik7Ci0gICAgdHJhbnNwb3J0Xy53cml0ZShpMzJidWYsIDAsIDQpOwotICAgIHRyYW5zcG9ydF8ud3JpdGUoYnVmLCAwLCBsZW4pOworICAgIGVuY29kZUZyYW1lU2l6ZShsZW4sIGJ1Zik7ICAgICAgICAgICAgICAvLyB0aGlzIGlzIHRoZSBmcmFtZSBsZW5ndGggd2l0aG91dCB0aGUgZmlsbGVyCisgICAgdHJhbnNwb3J0Xy53cml0ZShidWYsIDAsIGxlbiArIDQpOyAgICAgIC8vIHdlIGhhdmUgdG8gd3JpdGUgdGhlIGZyYW1lIHNpemUgYW5kIGZyYW1lIGRhdGEKICAgICB0cmFuc3BvcnRfLmZsdXNoKCk7CiAgIH0KIApAQCAtMTY2LDcgKzE4MSw3IEBACiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBkZWNvZGVGcmFtZVNpemUoZmluYWwgYnl0ZVtdIGJ1ZikgewotICAgIHJldHVybiAKKyAgICByZXR1cm4KICAgICAgICgoYnVmWzBdICYgMHhmZikgPDwgMjQpIHwKICAgICAgICgoYnVmWzFdICYgMHhmZikgPDwgMTYpIHwKICAgICAgICgoYnVmWzJdICYgMHhmZikgPDwgIDgpIHwKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuamF2YQppbmRleCA1YTViMzdjLi5jMzA2M2ZlIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cENsaWVudC5qYXZhCkBAIC0zMDQsNiArMzA0LDkgQEAKICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihpb2UpOwogICAgICAgICB9CiAgICAgICB9CisgICAgICBpZiAocG9zdCAhPSBudWxsKSB7CisgICAgICAgIHBvc3QucmVsZWFzZUNvbm5lY3Rpb24oKTsKKyAgICAgIH0KICAgICB9CiAgIH0KIApkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIuamF2YQppbmRleCBlZjVmNWMyLi5iMTlhYzg2IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIuamF2YQpAQCAtMjAsNyArMjAsNyBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CiAKIC8qKgogICogTWVtb3J5IGJ1ZmZlci1iYXNlZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVFRyYW5zcG9ydCBpbnRlcmZhY2UuCkBAIC0zMCw2ICszMCw4IEBACiAgICAqIENyZWF0ZSBhIFRNZW1vcnlCdWZmZXIgd2l0aCBhbiBpbml0aWFsIGJ1ZmZlciBzaXplIG9mIDxpPnNpemU8L2k+LiBUaGUKICAgICogaW50ZXJuYWwgYnVmZmVyIHdpbGwgZ3JvdyBhcyBuZWNlc3NhcnkgdG8gYWNjb21tb2RhdGUgdGhlIHNpemUgb2YgdGhlIGRhdGEKICAgICogYmVpbmcgd3JpdHRlbiB0byBpdC4KKyAgICoKKyAgICogQHBhcmFtIHNpemUgdGhlIGluaXRpYWwgc2l6ZSBvZiB0aGUgYnVmZmVyCiAgICAqLwogICBwdWJsaWMgVE1lbW9yeUJ1ZmZlcihpbnQgc2l6ZSkgewogICAgIGFycl8gPSBuZXcgVEJ5dGVBcnJheU91dHB1dFN0cmVhbShzaXplKTsKQEAgLTY5LDExICs3MSwxMSBAQAogICAvKioKICAgICogT3V0cHV0IHRoZSBjb250ZW50cyBvZiB0aGUgbWVtb3J5IGJ1ZmZlciBhcyBhIFN0cmluZywgdXNpbmcgdGhlIHN1cHBsaWVkCiAgICAqIGVuY29kaW5nCi0gICAqIEBwYXJhbSBlbmMgIHRoZSBlbmNvZGluZyB0byB1c2UKKyAgICogQHBhcmFtIGNoYXJzZXQgdGhlIGVuY29kaW5nIHRvIHVzZQogICAgKiBAcmV0dXJuIHRoZSBjb250ZW50cyBvZiB0aGUgbWVtb3J5IGJ1ZmZlciBhcyBhIFN0cmluZwogICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZyhTdHJpbmcgZW5jKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIGFycl8udG9TdHJpbmcoZW5jKTsKKyAgcHVibGljIFN0cmluZyB0b1N0cmluZyhDaGFyc2V0IGNoYXJzZXQpIHsKKyAgICByZXR1cm4gYXJyXy50b1N0cmluZyhjaGFyc2V0KTsKICAgfQogCiAgIHB1YmxpYyBTdHJpbmcgaW5zcGVjdCgpIHsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyU29ja2V0LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclNvY2tldC5qYXZhCmluZGV4IDQ0ZmUyNzMuLmVmODJhYzIgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyU29ja2V0LmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuamF2YQpAQCAtOTMsNyArOTMsNyBAQAogICAgICAgc2VydmVyU29ja2V0Xy5iaW5kKGFyZ3MuYmluZEFkZHIsIGFyZ3MuYmFja2xvZyk7CiAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CiAgICAgICBzZXJ2ZXJTb2NrZXRfID0gbnVsbDsKLSAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDb3VsZCBub3QgY3JlYXRlIFNlcnZlclNvY2tldCBvbiBhZGRyZXNzICIgKyBhcmdzLmJpbmRBZGRyLnRvU3RyaW5nKCkgKyAiLiIpOworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNvdWxkIG5vdCBjcmVhdGUgU2VydmVyU29ja2V0IG9uIGFkZHJlc3MgIiArIGFyZ3MuYmluZEFkZHIudG9TdHJpbmcoKSArICIuIiwgaW9lKTsKICAgICB9CiAgIH0KIApkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTb2NrZXQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU29ja2V0LmphdmEKaW5kZXggMjNmODU3NC4uZjg2YTQ4YiAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTb2NrZXQuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NvY2tldC5qYXZhCkBAIC01NSw3ICs1NSw2IEBACiAgICAqIENyZWF0ZSBhIG5ldyBub25ibG9ja2luZyBzb2NrZXQgdHJhbnNwb3J0IHRoYXQgd2lsbCBiZSBjb25uZWN0ZWQgdG8gaG9zdDpwb3J0LgogICAgKiBAcGFyYW0gaG9zdAogICAgKiBAcGFyYW0gcG9ydAotICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24KICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgogICAgKi8KICAgcHVibGljIFROb25ibG9ja2luZ1NvY2tldChTdHJpbmcgaG9zdCwgaW50IHBvcnQsIGludCB0aW1lb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMVHJhbnNwb3J0RmFjdG9yeS5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMVHJhbnNwb3J0RmFjdG9yeS5qYXZhCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggNzZjOThjOC4uMjIzMmEzMQotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTU0xUcmFuc3BvcnRGYWN0b3J5LmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMVHJhbnNwb3J0RmFjdG9yeS5qYXZhCkBAIC00OSw5ICs0OSw5IEBACiAgICAqIGZyb20gU3lzdGVtIHByb3BlcnRpZXMgdGhhdCBhcmUgc2V0LgogICAgKgogICAgKiBFeGFtcGxlIHN5c3RlbSBwcm9wZXJ0aWVzOgotICAgKiAtRGphdmF4Lm5ldC5zc2wudHJ1c3RTdG9yZT08dHJ1c3RzdG9yZSBsb2NhdGlvbj4KKyAgICogLURqYXZheC5uZXQuc3NsLnRydXN0U3RvcmU9Jmx0O3RydXN0c3RvcmUgbG9jYXRpb24mZ3Q7CiAgICAqIC1EamF2YXgubmV0LnNzbC50cnVzdFN0b3JlUGFzc3dvcmQ9cGFzc3dvcmQKLSAgICogLURqYXZheC5uZXQuc3NsLmtleVN0b3JlPTxrZXlzdG9yZSBsb2NhdGlvbj4KKyAgICogLURqYXZheC5uZXQuc3NsLmtleVN0b3JlPSZsdDtrZXlzdG9yZSBsb2NhdGlvbiZndDsKICAgICogLURqYXZheC5uZXQuc3NsLmtleVN0b3JlUGFzc3dvcmQ9cGFzc3dvcmQKICAgICoKICAgICogQHBhcmFtIHBvcnQKQEAgLTE4Niw3ICsxODYsMTEgQEAKICAgICAgIGlmIChwYXJhbXMuaXNUcnVzdFN0b3JlU2V0KSB7CiAgICAgICAgIHRtZiA9IFRydXN0TWFuYWdlckZhY3RvcnkuZ2V0SW5zdGFuY2UocGFyYW1zLnRydXN0TWFuYWdlclR5cGUpOwogICAgICAgICBLZXlTdG9yZSB0cyA9IEtleVN0b3JlLmdldEluc3RhbmNlKHBhcmFtcy50cnVzdFN0b3JlVHlwZSk7Ci0gICAgICAgIGluID0gZ2V0U3RvcmVBc1N0cmVhbShwYXJhbXMudHJ1c3RTdG9yZSk7CisgICAgICAgIGlmIChwYXJhbXMudHJ1c3RTdG9yZVN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgaW4gPSBwYXJhbXMudHJ1c3RTdG9yZVN0cmVhbTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpbiA9IGdldFN0b3JlQXNTdHJlYW0ocGFyYW1zLnRydXN0U3RvcmUpOworICAgICAgICB9CiAgICAgICAgIHRzLmxvYWQoaW4sCiAgICAgICAgICAgICAgICAgKHBhcmFtcy50cnVzdFBhc3MgIT0gbnVsbCA/IHBhcmFtcy50cnVzdFBhc3MudG9DaGFyQXJyYXkoKSA6IG51bGwpKTsKICAgICAgICAgdG1mLmluaXQodHMpOwpAQCAtMTk1LDcgKzE5OSwxMSBAQAogICAgICAgaWYgKHBhcmFtcy5pc0tleVN0b3JlU2V0KSB7CiAgICAgICAgIGttZiA9IEtleU1hbmFnZXJGYWN0b3J5LmdldEluc3RhbmNlKHBhcmFtcy5rZXlNYW5hZ2VyVHlwZSk7CiAgICAgICAgIEtleVN0b3JlIGtzID0gS2V5U3RvcmUuZ2V0SW5zdGFuY2UocGFyYW1zLmtleVN0b3JlVHlwZSk7Ci0gICAgICAgIGlzID0gZ2V0U3RvcmVBc1N0cmVhbShwYXJhbXMua2V5U3RvcmUpOworICAgICAgICBpZiAocGFyYW1zLmtleVN0b3JlU3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgCWlzID0gcGFyYW1zLmtleVN0b3JlU3RyZWFtOworICAgICAgICB9IGVsc2UgeworICAgICAgICAJaXMgPSBnZXRTdG9yZUFzU3RyZWFtKHBhcmFtcy5rZXlTdG9yZSk7CisgICAgICAgIH0KICAgICAgICAga3MubG9hZChpcywgcGFyYW1zLmtleVBhc3MudG9DaGFyQXJyYXkoKSk7CiAgICAgICAgIGttZi5pbml0KGtzLCBwYXJhbXMua2V5UGFzcy50b0NoYXJBcnJheSgpKTsKICAgICAgIH0KQEAgLTI3MywxMCArMjgxLDEyIEBACiAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVFNTTFRyYW5zcG9ydFBhcmFtZXRlcnMgewogICAgIHByb3RlY3RlZCBTdHJpbmcgcHJvdG9jb2wgPSAiVExTIjsKICAgICBwcm90ZWN0ZWQgU3RyaW5nIGtleVN0b3JlOworICAgIHByb3RlY3RlZCBJbnB1dFN0cmVhbSBrZXlTdG9yZVN0cmVhbTsKICAgICBwcm90ZWN0ZWQgU3RyaW5nIGtleVBhc3M7CiAgICAgcHJvdGVjdGVkIFN0cmluZyBrZXlNYW5hZ2VyVHlwZSA9IEtleU1hbmFnZXJGYWN0b3J5LmdldERlZmF1bHRBbGdvcml0aG0oKTsKICAgICBwcm90ZWN0ZWQgU3RyaW5nIGtleVN0b3JlVHlwZSA9ICJKS1MiOwogICAgIHByb3RlY3RlZCBTdHJpbmcgdHJ1c3RTdG9yZTsKKyAgICBwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gdHJ1c3RTdG9yZVN0cmVhbTsKICAgICBwcm90ZWN0ZWQgU3RyaW5nIHRydXN0UGFzczsKICAgICBwcm90ZWN0ZWQgU3RyaW5nIHRydXN0TWFuYWdlclR5cGUgPSBUcnVzdE1hbmFnZXJGYWN0b3J5LmdldERlZmF1bHRBbGdvcml0aG0oKTsKICAgICBwcm90ZWN0ZWQgU3RyaW5nIHRydXN0U3RvcmVUeXBlID0gIkpLUyI7CkBAIC0zMDksNyArMzE5LDcgQEAKICAgICAgIGlmIChwcm90b2NvbCAhPSBudWxsKSB7CiAgICAgICAgIHRoaXMucHJvdG9jb2wgPSBwcm90b2NvbDsKICAgICAgIH0KLSAgICAgIHRoaXMuY2lwaGVyU3VpdGVzID0gQXJyYXlzLmNvcHlPZihjaXBoZXJTdWl0ZXMsIGNpcGhlclN1aXRlcy5sZW5ndGgpOworICAgICAgdGhpcy5jaXBoZXJTdWl0ZXMgPSBjaXBoZXJTdWl0ZXMgIT0gbnVsbCA/IEFycmF5cy5jb3B5T2YoY2lwaGVyU3VpdGVzLCBjaXBoZXJTdWl0ZXMubGVuZ3RoKSA6IG51bGw7CiAgICAgICB0aGlzLmNsaWVudEF1dGggPSBjbGllbnRBdXRoOwogICAgIH0KIApAQCAtMzMyLDcgKzM0MiwyMCBAQAogICAgICAgfQogICAgICAgaXNLZXlTdG9yZVNldCA9IHRydWU7CiAgICAgfQotCisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBrZXlzdG9yZSwgcGFzc3dvcmQsIGNlcnRpZmljYXRlIHR5cGUgYW5kIHRoZSBzdG9yZSB0eXBlCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5U3RvcmVTdHJlYW0gS2V5c3RvcmUgY29udGVudCBpbnB1dCBzdHJlYW0KKyAgICAgKiBAcGFyYW0ga2V5UGFzcyBLZXlzdG9yZSBwYXNzd29yZAorICAgICAqIEBwYXJhbSBrZXlNYW5hZ2VyVHlwZSBUaGUgZGVmYXVsdCBpcyBYNTA5CisgICAgICogQHBhcmFtIGtleVN0b3JlVHlwZSBUaGUgZGVmYXVsdCBpcyBKS1MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRLZXlTdG9yZShJbnB1dFN0cmVhbSBrZXlTdG9yZVN0cmVhbSwgU3RyaW5nIGtleVBhc3MsIFN0cmluZyBrZXlNYW5hZ2VyVHlwZSwgU3RyaW5nIGtleVN0b3JlVHlwZSkgeworICAgIAl0aGlzLmtleVN0b3JlU3RyZWFtID0ga2V5U3RvcmVTdHJlYW07CisgICAgCXNldEtleVN0b3JlKCIiLCBrZXlQYXNzLCBrZXlNYW5hZ2VyVHlwZSwga2V5U3RvcmVUeXBlKTsKKyAgICB9CisgICAgCiAgICAgLyoqCiAgICAgICogU2V0IHRoZSBrZXlzdG9yZSBhbmQgcGFzc3dvcmQKICAgICAgKgpAQCAtMzQyLDcgKzM2NSwxNyBAQAogICAgIHB1YmxpYyB2b2lkIHNldEtleVN0b3JlKFN0cmluZyBrZXlTdG9yZSwgU3RyaW5nIGtleVBhc3MpIHsKICAgICAgIHNldEtleVN0b3JlKGtleVN0b3JlLCBrZXlQYXNzLCBudWxsLCBudWxsKTsKICAgICB9Ci0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGtleXN0b3JlIGFuZCBwYXNzd29yZAorICAgICAqCisgICAgICogQHBhcmFtIGtleVN0b3JlU3RyZWFtIEtleXN0b3JlIGNvbnRlbnQgaW5wdXQgc3RyZWFtCisgICAgICogQHBhcmFtIGtleVBhc3MgS2V5c3RvcmUgcGFzc3dvcmQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRLZXlTdG9yZShJbnB1dFN0cmVhbSBrZXlTdG9yZVN0cmVhbSwgU3RyaW5nIGtleVBhc3MpIHsKKyAgICAgIHNldEtleVN0b3JlKGtleVN0b3JlU3RyZWFtLCBrZXlQYXNzLCBudWxsLCBudWxsKTsKKyAgICB9CisgICAgCiAgICAgLyoqCiAgICAgICogU2V0IHRoZSB0cnVzdHN0b3JlLCBwYXNzd29yZCwgY2VydGlmaWNhdGUgdHlwZSBhbmQgdGhlIHN0b3JlIHR5cGUKICAgICAgKgpAQCAtMzYyLDYgKzM5NSwxOSBAQAogICAgICAgfQogICAgICAgaXNUcnVzdFN0b3JlU2V0ID0gdHJ1ZTsKICAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSB0cnVzdHN0b3JlLCBwYXNzd29yZCwgY2VydGlmaWNhdGUgdHlwZSBhbmQgdGhlIHN0b3JlIHR5cGUKKyAgICAgKgorICAgICAqIEBwYXJhbSB0cnVzdFN0b3JlU3RyZWFtIFRydXN0c3RvcmUgY29udGVudCBpbnB1dCBzdHJlYW0KKyAgICAgKiBAcGFyYW0gdHJ1c3RQYXNzIFRydXN0c3RvcmUgcGFzc3dvcmQKKyAgICAgKiBAcGFyYW0gdHJ1c3RNYW5hZ2VyVHlwZSBUaGUgZGVmYXVsdCBpcyBYNTA5CisgICAgICogQHBhcmFtIHRydXN0U3RvcmVUeXBlIFRoZSBkZWZhdWx0IGlzIEpLUworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRydXN0U3RvcmUoSW5wdXRTdHJlYW0gdHJ1c3RTdG9yZVN0cmVhbSwgU3RyaW5nIHRydXN0UGFzcywgU3RyaW5nIHRydXN0TWFuYWdlclR5cGUsIFN0cmluZyB0cnVzdFN0b3JlVHlwZSkgeworICAgICAgdGhpcy50cnVzdFN0b3JlU3RyZWFtID0gdHJ1c3RTdG9yZVN0cmVhbTsKKyAgICAgIHNldFRydXN0U3RvcmUoIiIsIHRydXN0UGFzcywgdHJ1c3RNYW5hZ2VyVHlwZSwgdHJ1c3RTdG9yZVR5cGUpOworICAgIH0KIAogICAgIC8qKgogICAgICAqIFNldCB0aGUgdHJ1c3RzdG9yZSBhbmQgcGFzc3dvcmQKQEAgLTM3Miw2ICs0MTgsMTYgQEAKICAgICBwdWJsaWMgdm9pZCBzZXRUcnVzdFN0b3JlKFN0cmluZyB0cnVzdFN0b3JlLCBTdHJpbmcgdHJ1c3RQYXNzKSB7CiAgICAgICBzZXRUcnVzdFN0b3JlKHRydXN0U3RvcmUsIHRydXN0UGFzcywgbnVsbCwgbnVsbCk7CiAgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgdHJ1c3RzdG9yZSBhbmQgcGFzc3dvcmQKKyAgICAgKgorICAgICAqIEBwYXJhbSB0cnVzdFN0b3JlU3RyZWFtIFRydXN0c3RvcmUgY29udGVudCBpbnB1dCBzdHJlYW0KKyAgICAgKiBAcGFyYW0gdHJ1c3RQYXNzIFRydXN0c3RvcmUgcGFzc3dvcmQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUcnVzdFN0b3JlKElucHV0U3RyZWFtIHRydXN0U3RvcmVTdHJlYW0sIFN0cmluZyB0cnVzdFBhc3MpIHsKKyAgICAgIHNldFRydXN0U3RvcmUodHJ1c3RTdG9yZVN0cmVhbSwgdHJ1c3RQYXNzLCBudWxsLCBudWxsKTsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBTZXQgaWYgY2xpZW50IGF1dGhlbnRpY2F0aW9uIGlzIHJlcXVpcmVkCkBAIC0zODAsNiArNDM2LDYgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZXF1aXJlQ2xpZW50QXV0aChib29sZWFuIGNsaWVudEF1dGgpIHsKICAgICAgIHRoaXMuY2xpZW50QXV0aCA9IGNsaWVudEF1dGg7Ci0gICAgfQotICB9CisJCX0KKwl9CiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTYXNsQ2xpZW50VHJhbnNwb3J0LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTYXNsQ2xpZW50VHJhbnNwb3J0LmphdmEKaW5kZXggNWFhMGNjZC4uNGIxY2EwYSAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2FzbENsaWVudFRyYW5zcG9ydC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNhc2xDbGllbnRUcmFuc3BvcnQuamF2YQpAQCAtMTksNiArMTksNyBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKIAoraW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiBpbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFjay5DYWxsYmFja0hhbmRsZXI7CkBAIC05Niw3ICs5Nyw3IEBACiAgICAgTE9HR0VSLmRlYnVnKCJTZW5kaW5nIG1lY2hhbmlzbSBuYW1lIHt9IGFuZCBpbml0aWFsIHJlc3BvbnNlIG9mIGxlbmd0aCB7fSIsIG1lY2hhbmlzbSwKICAgICAgICAgaW5pdGlhbFJlc3BvbnNlLmxlbmd0aCk7CiAKLSAgICBieXRlW10gbWVjaGFuaXNtQnl0ZXMgPSBtZWNoYW5pc20uZ2V0Qnl0ZXMoKTsKKyAgICBieXRlW10gbWVjaGFuaXNtQnl0ZXMgPSBtZWNoYW5pc20uZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CiAgICAgc2VuZFNhc2xNZXNzYWdlKE5lZ290aWF0aW9uU3RhdHVzLlNUQVJULAogICAgICAgICAgICAgICAgICAgICBtZWNoYW5pc21CeXRlcyk7CiAgICAgLy8gU2VuZCBpbml0aWFsIHJlc3BvbnNlCmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTYXNsU2VydmVyVHJhbnNwb3J0LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTYXNsU2VydmVyVHJhbnNwb3J0LmphdmEKaW5kZXggYzg4M2M4Zi4uMzliODFjYSAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2FzbFNlcnZlclRyYW5zcG9ydC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNhc2xTZXJ2ZXJUcmFuc3BvcnQuamF2YQpAQCAtMjAsNiArMjAsNyBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CiAKIGltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwpAQCAtMTMwLDcgKzEzMSw3IEBACiAgICAgfQogCiAgICAgLy8gR2V0IHRoZSBtZWNoYW5pc20gbmFtZS4KLSAgICBTdHJpbmcgbWVjaGFuaXNtTmFtZSA9IG5ldyBTdHJpbmcobWVzc2FnZS5wYXlsb2FkKTsKKyAgICBTdHJpbmcgbWVjaGFuaXNtTmFtZSA9IG5ldyBTdHJpbmcobWVzc2FnZS5wYXlsb2FkLCBTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKICAgICBUU2FzbFNlcnZlckRlZmluaXRpb24gc2VydmVyRGVmaW5pdGlvbiA9IHNlcnZlckRlZmluaXRpb25NYXAuZ2V0KG1lY2hhbmlzbU5hbWUpOwogICAgIExPR0dFUi5kZWJ1ZygiUmVjZWl2ZWQgbWVjaGFuaXNtIG5hbWUgJ3t9JyIsIG1lY2hhbmlzbU5hbWUpOwogCkBAIC0xNDUsNyArMTQ2LDcgQEAKIAogICAvKioKICAgICogPGNvZGU+VFRyYW5zcG9ydEZhY3Rvcnk8L2NvZGU+IHRvIGNyZWF0ZQotICAgKiA8Y29kZT5UU2FzbFNlcnZlclRyYW5zcG9ydHM8Yy9vZGU+LiBFbnN1cmVzIHRoYXQgYSBnaXZlbgorICAgKiA8Y29kZT5UU2FzbFNlcnZlclRyYW5zcG9ydHM8L2NvZGU+LiBFbnN1cmVzIHRoYXQgYSBnaXZlbgogICAgKiB1bmRlcmx5aW5nIDxjb2RlPlRUcmFuc3BvcnQ8L2NvZGU+IGluc3RhbmNlIHJlY2VpdmVzIHRoZSBzYW1lCiAgICAqIDxjb2RlPlRTYXNsU2VydmVyVHJhbnNwb3J0PC9jb2RlPi4gVGhpcyBpcyBraW5kIG9mIGFuIGF3ZnVsIGhhY2sgdG8gd29yawogICAgKiBhcm91bmQgdGhlIGZhY3QgdGhhdCBUaHJpZnQgaXMgZGVzaWduZWQgYXNzdW1pbmcgdGhhdApkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2FzbFRyYW5zcG9ydC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2FzbFRyYW5zcG9ydC5qYXZhCmluZGV4IDc5Mzg5MTYuLmJlZDNiMzkgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNhc2xUcmFuc3BvcnQuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTYXNsVHJhbnNwb3J0LmphdmEKQEAgLTE5LDcgKzE5LDcgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CiAKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKQEAgLTM1LDcgKzM1LDcgQEAKIAogLyoqCiAgKiBBIHN1cGVyY2xhc3MgZm9yIFNBU0wgY2xpZW50L3NlcnZlciB0aHJpZnQgdHJhbnNwb3J0cy4gQSBzdWJjbGFzcyBuZWVkIG9ubHkKLSAqIGltcGxlbWVudCB0aGUgPGNvZGU+b3Blbjwvb3Blbj4gbWV0aG9kLgorICogaW1wbGVtZW50IHRoZSA8Y29kZT5vcGVuPC9jb2RlPiBtZXRob2QuCiAgKi8KIGFic3RyYWN0IGNsYXNzIFRTYXNsVHJhbnNwb3J0IGV4dGVuZHMgVFRyYW5zcG9ydCB7CiAKQEAgLTE1OCw5ICsxNTgsOSBAQAogICAgIG1lc3NhZ2VIZWFkZXJbMF0gPSBzdGF0dXMuZ2V0VmFsdWUoKTsKICAgICBFbmNvZGluZ1V0aWxzLmVuY29kZUJpZ0VuZGlhbihwYXlsb2FkLmxlbmd0aCwgbWVzc2FnZUhlYWRlciwgU1RBVFVTX0JZVEVTKTsKIAotICAgIGlmIChMT0dHRVIuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgIExPR0dFUi5kZWJ1ZyhnZXRSb2xlKCkgKyAiOiBXcml0aW5nIG1lc3NhZ2Ugd2l0aCBzdGF0dXMge30gYW5kIHBheWxvYWQgbGVuZ3RoIHt9IiwKLSAgICAgICAgICAgICAgICAgICBzdGF0dXMsIHBheWxvYWQubGVuZ3RoKTsKKyAgICBMT0dHRVIuZGVidWcoInt9OiBXcml0aW5nIG1lc3NhZ2Ugd2l0aCBzdGF0dXMge30gYW5kIHBheWxvYWQgbGVuZ3RoIHt9IiwKKyAgICAgICAgZ2V0Um9sZSgpLCBzdGF0dXMsIHBheWxvYWQubGVuZ3RoKTsKKwogICAgIHVuZGVybHlpbmdUcmFuc3BvcnQud3JpdGUobWVzc2FnZUhlYWRlcik7CiAgICAgdW5kZXJseWluZ1RyYW5zcG9ydC53cml0ZShwYXlsb2FkKTsKICAgICB1bmRlcmx5aW5nVHJhbnNwb3J0LmZsdXNoKCk7CkBAIC0xOTQsMTcgKzE5NCwxMSBAQAogICAgIHVuZGVybHlpbmdUcmFuc3BvcnQucmVhZEFsbChwYXlsb2FkLCAwLCBwYXlsb2FkLmxlbmd0aCk7CiAKICAgICBpZiAoc3RhdHVzID09IE5lZ290aWF0aW9uU3RhdHVzLkJBRCB8fCBzdGF0dXMgPT0gTmVnb3RpYXRpb25TdGF0dXMuRVJST1IpIHsKLSAgICAgIHRyeSB7Ci0gICAgICAgIFN0cmluZyByZW1vdGVNZXNzYWdlID0gbmV3IFN0cmluZyhwYXlsb2FkLCAiVVRGLTgiKTsKLSAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIlBlZXIgaW5kaWNhdGVkIGZhaWx1cmU6ICIgKyByZW1vdGVNZXNzYWdlKTsKLSAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihlKTsKLSAgICAgIH0KKyAgICAgIFN0cmluZyByZW1vdGVNZXNzYWdlID0gbmV3IFN0cmluZyhwYXlsb2FkLCBTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJQZWVyIGluZGljYXRlZCBmYWlsdXJlOiAiICsgcmVtb3RlTWVzc2FnZSk7CiAgICAgfQotCi0gICAgaWYgKExPR0dFUi5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgTE9HR0VSLmRlYnVnKGdldFJvbGUoKSArICI6IFJlY2VpdmVkIG1lc3NhZ2Ugd2l0aCBzdGF0dXMge30gYW5kIHBheWxvYWQgbGVuZ3RoIHt9IiwKLSAgICAgICAgICAgICAgICAgICBzdGF0dXMsIHBheWxvYWQubGVuZ3RoKTsKKyAgICBMT0dHRVIuZGVidWcoInt9OiBSZWNlaXZlZCBtZXNzYWdlIHdpdGggc3RhdHVzIHt9IGFuZCBwYXlsb2FkIGxlbmd0aCB7fSIsCisgICAgICAgIGdldFJvbGUoKSwgc3RhdHVzLCBwYXlsb2FkLmxlbmd0aCk7CiAgICAgcmV0dXJuIG5ldyBTYXNsUmVzcG9uc2Uoc3RhdHVzLCBwYXlsb2FkKTsKICAgfQogCkBAIC0yMjQsNyArMjE4LDcgQEAKICAgICovCiAgIHByb3RlY3RlZCBUVHJhbnNwb3J0RXhjZXB0aW9uIHNlbmRBbmRUaHJvd01lc3NhZ2UoTmVnb3RpYXRpb25TdGF0dXMgc3RhdHVzLCBTdHJpbmcgbWVzc2FnZSkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gewogICAgIHRyeSB7Ci0gICAgICBzZW5kU2FzbE1lc3NhZ2Uoc3RhdHVzLCBtZXNzYWdlLmdldEJ5dGVzKCkpOworICAgICAgc2VuZFNhc2xNZXNzYWdlKHN0YXR1cywgbWVzc2FnZS5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KSk7CiAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgIExPR0dFUi53YXJuKCJDb3VsZCBub3Qgc2VuZCBmYWlsdXJlIHJlc3BvbnNlIiwgZSk7CiAgICAgICBtZXNzYWdlICs9ICJcbkFsc28sIGNvdWxkIG5vdCBzZW5kIHJlc3BvbnNlOiAiICsgZS50b1N0cmluZygpOwpAQCAtMjg3LDcgKzI4MSw3IEBACiAgICAgICAgIGlmIChtZXNzYWdlLnN0YXR1cyA9PSBOZWdvdGlhdGlvblN0YXR1cy5DT01QTEVURSAmJgogICAgICAgICAgICAgZ2V0Um9sZSgpID09IFNhc2xSb2xlLkNMSUVOVCkgewogICAgICAgICAgIExPR0dFUi5kZWJ1Zygie306IEFsbCBkb25lISIsIGdldFJvbGUoKSk7Ci0gICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAogICAgICAgICBzZW5kU2FzbE1lc3NhZ2Uoc2FzbC5pc0NvbXBsZXRlKCkgPyBOZWdvdGlhdGlvblN0YXR1cy5DT01QTEVURSA6IE5lZ290aWF0aW9uU3RhdHVzLk9LLApAQCAtMjk1LDggKzI4OSw2IEBACiAgICAgICB9CiAgICAgICBMT0dHRVIuZGVidWcoInt9OiBNYWluIG5lZ290aWF0aW9uIGxvb3AgY29tcGxldGUiLCBnZXRSb2xlKCkpOwogCi0gICAgICBhc3NlcnQgc2FzbC5pc0NvbXBsZXRlKCk7Ci0KICAgICAgIC8vIElmIHdlJ3JlIHRoZSBjbGllbnQsIGFuZCB3ZSdyZSBjb21wbGV0ZSwgYnV0IHRoZSBzZXJ2ZXIgaXNuJ3QKICAgICAgIC8vIGNvbXBsZXRlIHlldCwgd2UgbmVlZCB0byB3YWl0IGZvciBpdHMgcmVzcG9uc2UuIFRoaXMgd2lsbCBvY2N1cgogICAgICAgLy8gd2l0aCBBTk9OWU1PVVMgYXV0aCwgZm9yIGV4YW1wbGUsIHdoZXJlIHdlIHNlbmQgYW4gaW5pdGlhbCByZXNwb25zZQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuamF2YQppbmRleCA3YmQ4N2Y0Li43OWY3YjdmIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuamF2YQpAQCAtMTExLDcgKzExMSw3IEBACiAgIH0KIAogICBwdWJsaWMgdm9pZCBsaXN0ZW4oKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7Ci0gICAgLy8gTWFrZSBzdXJlIG5vdCB0byBibG9jayBvbiBhY2NlcHQKKyAgICAvLyBNYWtlIHN1cmUgdG8gYmxvY2sgb24gYWNjZXB0CiAgICAgaWYgKHNlcnZlclNvY2tldF8gIT0gbnVsbCkgewogICAgICAgdHJ5IHsKICAgICAgICAgc2VydmVyU29ja2V0Xy5zZXRTb1RpbWVvdXQoMCk7CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldC5qYXZhCmluZGV4IGJjNDQyMDkuLmIyMGIzMmIgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldC5qYXZhCkBAIC00MCwyNyArNDAsMjcgQEAKICAgLyoqCiAgICAqIFdyYXBwZWQgU29ja2V0IG9iamVjdAogICAgKi8KLSAgcHJpdmF0ZSBTb2NrZXQgc29ja2V0XyA9IG51bGw7CisgIHByaXZhdGUgU29ja2V0IHNvY2tldF87CiAKICAgLyoqCiAgICAqIFJlbW90ZSBob3N0CiAgICAqLwotICBwcml2YXRlIFN0cmluZyBob3N0XyAgPSBudWxsOworICBwcml2YXRlIFN0cmluZyBob3N0XzsKIAogICAvKioKICAgICogUmVtb3RlIHBvcnQKICAgICovCi0gIHByaXZhdGUgaW50IHBvcnRfID0gMDsKKyAgcHJpdmF0ZSBpbnQgcG9ydF87CiAKICAgLyoqCiAgICAqIFNvY2tldCB0aW1lb3V0IC0gcmVhZCB0aW1lb3V0IG9uIHRoZSBzb2NrZXQKICAgICovCi0gIHByaXZhdGUgaW50IHNvY2tldFRpbWVvdXRfID0gMDsKKyAgcHJpdmF0ZSBpbnQgc29ja2V0VGltZW91dF87CiAKICAgLyoqCiAgICAqIENvbm5lY3Rpb24gdGltZW91dAogICAgKi8KLSAgcHJpdmF0ZSBpbnQgY29ubmVjdFRpbWVvdXRfID0gMDsKKyAgcHJpdmF0ZSBpbnQgY29ubmVjdFRpbWVvdXRfOwogCiAgIC8qKgogICAgKiBDb25zdHJ1Y3RvciB0aGF0IHRha2VzIGFuIGFscmVhZHkgY3JlYXRlZCBzb2NrZXQuCkBAIC04MCw4ICs4MCw4IEBACiAKICAgICBpZiAoaXNPcGVuKCkpIHsKICAgICAgIHRyeSB7Ci0gICAgICAgIGlucHV0U3RyZWFtXyA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHNvY2tldF8uZ2V0SW5wdXRTdHJlYW0oKSwgMTAyNCk7Ci0gICAgICAgIG91dHB1dFN0cmVhbV8gPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oc29ja2V0Xy5nZXRPdXRwdXRTdHJlYW0oKSwgMTAyNCk7CisgICAgICAgIGlucHV0U3RyZWFtXyA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHNvY2tldF8uZ2V0SW5wdXRTdHJlYW0oKSk7CisgICAgICAgIG91dHB1dFN0cmVhbV8gPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oc29ja2V0Xy5nZXRPdXRwdXRTdHJlYW0oKSk7CiAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpIHsKICAgICAgICAgY2xvc2UoKTsKICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwgaW94KTsKQEAgLTIwNiwxMSArMjA2LDExIEBACiAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkFMUkVBRFlfT1BFTiwgIlNvY2tldCBhbHJlYWR5IGNvbm5lY3RlZC4iKTsKICAgICB9CiAKLSAgICBpZiAoaG9zdF8ubGVuZ3RoKCkgPT0gMCkgeworICAgIGlmIChob3N0XyA9PSBudWxsIHx8IGhvc3RfLmxlbmd0aCgpID09IDApIHsKICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sICJDYW5ub3Qgb3BlbiBudWxsIGhvc3QuIik7CiAgICAgfQotICAgIGlmIChwb3J0XyA8PSAwKSB7Ci0gICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLCAiQ2Fubm90IG9wZW4gd2l0aG91dCBwb3J0LiIpOworICAgIGlmIChwb3J0XyA8PSAwIHx8IHBvcnRfID4gNjU1MzUpIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sICJJbnZhbGlkIHBvcnQgIiArIHBvcnRfKTsKICAgICB9CiAKICAgICBpZiAoc29ja2V0XyA9PSBudWxsKSB7CkBAIC0yMTksOCArMjE5LDggQEAKIAogICAgIHRyeSB7CiAgICAgICBzb2NrZXRfLmNvbm5lY3QobmV3IEluZXRTb2NrZXRBZGRyZXNzKGhvc3RfLCBwb3J0XyksIGNvbm5lY3RUaW1lb3V0Xyk7Ci0gICAgICBpbnB1dFN0cmVhbV8gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShzb2NrZXRfLmdldElucHV0U3RyZWFtKCksIDEwMjQpOwotICAgICAgb3V0cHV0U3RyZWFtXyA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShzb2NrZXRfLmdldE91dHB1dFN0cmVhbSgpLCAxMDI0KTsKKyAgICAgIGlucHV0U3RyZWFtXyA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHNvY2tldF8uZ2V0SW5wdXRTdHJlYW0oKSk7CisgICAgICBvdXRwdXRTdHJlYW1fID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKHNvY2tldF8uZ2V0T3V0cHV0U3RyZWFtKCkpOwogICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkgewogICAgICAgY2xvc2UoKTsKICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sIGlveCk7CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5qYXZhCmluZGV4IGQwOGYzYjAuLmI4ODZiYzIgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5qYXZhCkBAIC0zNCw2ICszNCw3IEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFMUkVBRFlfT1BFTiA9IDI7CiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRJTUVEX09VVCA9IDM7CiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVORF9PRl9GSUxFID0gNDsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09SUlVQVEVEX0RBVEEgPSA1OwogCiAgIHByb3RlY3RlZCBpbnQgdHlwZV8gPSBVTktOT1dOOwogCmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0LmphdmEKaW5kZXggZGY0ZGUxMy4uZTc1NWFhNSAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuamF2YQpAQCAtNzQsMTEgKzc0LDExIEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgc3VwZXIuY2xvc2UoKTsKICAgICAgICAgaWYgKHRyYW5zcG9ydF8uaXNPcGVuKCkpIHsKICAgICAgICAgICAgIHRyYW5zcG9ydF8uY2xvc2UoKTsKICAgICAgICAgfQogICAgIH0KLQogfQogCiBjbGFzcyBUVHJhbnNwb3J0SW5wdXRTdHJlYW0gZXh0ZW5kcyBJbnB1dFN0cmVhbSB7CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L0ZpeHR1cmVzLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L0ZpeHR1cmVzLmphdmEKaW5kZXggOWYyODEyNC4uNjFmNDBhNSAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9GaXh0dXJlcy5qYXZhCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvRml4dHVyZXMuamF2YQpAQCAtMjAsNiArMjAsNyBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKIAogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CkBAIC0yNjcsNyArMjY4LDcgQEAKICAgICAgIG9uZU9mRWFjaC5zZXRJbnRlZ2VyNjQoKGxvbmcpIDYwMDAgKiAxMDAwICogMTAwMCk7CiAgICAgICBvbmVPZkVhY2guc2V0RG91YmxlX3ByZWNpc2lvbihNYXRoLlBJKTsKICAgICAgIG9uZU9mRWFjaC5zZXRTb21lX2NoYXJhY3RlcnMoIkpTT04gVEhJUyEgXCJcMSIpOwotICAgICAgb25lT2ZFYWNoLnNldFpvbWdfdW5pY29kZShuZXcgU3RyaW5nKGtVbmljb2RlQnl0ZXMsICJVVEYtOCIpKTsKKyAgICAgIG9uZU9mRWFjaC5zZXRab21nX3VuaWNvZGUobmV3IFN0cmluZyhrVW5pY29kZUJ5dGVzLCBTdGFuZGFyZENoYXJzZXRzLlVURl84KSk7CiAgICAgICBvbmVPZkVhY2guc2V0QmFzZTY0KEJ5dGVCdWZmZXIud3JhcCgiYmFzZTY0Ii5nZXRCeXRlcygpKSk7CiAgICAgICAvLyBieXRlLCBpMTYsIGFuZCBpNjQgbGlzdHMgYXJlIHBvcHVsYXRlZCBieSBkZWZhdWx0IGNvbnN0cnVjdG9yCiAKQEAgLTI3Nyw3ICsyNzgsNyBAQAogICAgICAgbmVzdGluZyA9IG5ldyBOZXN0aW5nKGJvbmssIG9uZU9mRWFjaCk7CiAKICAgICAgIGhvbHlNb2xleSA9IG5ldyBIb2x5TW9sZXkoKTsKLSAgICAgIEFycmF5TGlzdCBiaWcgPSBuZXcgQXJyYXlMaXN0PE9uZU9mRWFjaD4oKTsKKyAgICAgIExpc3Q8T25lT2ZFYWNoPiBiaWcgPSBuZXcgQXJyYXlMaXN0PE9uZU9mRWFjaD4oKTsKICAgICAgIGJpZy5hZGQobmV3IE9uZU9mRWFjaChvbmVPZkVhY2gpKTsKICAgICAgIGJpZy5hZGQobmVzdGluZy5teV9vb2UpOwogICAgICAgaG9seU1vbGV5LnNldEJpZyhiaWcpOwpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0RGVlcENvcHkuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdERlZXBDb3B5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNhZmFlZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdERlZXBDb3B5LmphdmEKQEAgLTAsMCArMSwzNCBAQAorcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCB0aHJpZnQudGVzdC5EZWVwQ29weUJhcjsKK2ltcG9ydCB0aHJpZnQudGVzdC5EZWVwQ29weUZvbzsKKworcHVibGljIGNsYXNzIFRlc3REZWVwQ29weSBleHRlbmRzIFRlc3RDYXNlIHsKKworICBwdWJsaWMgdm9pZCB0ZXN0RGVlcENvcHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBEZWVwQ29weUZvbyBmb28gPSBuZXcgRGVlcENvcHlGb28oKTsKKworICAgIGZvby5hZGRUb0wobmV3IERlZXBDb3B5QmFyKCkpOworICAgIGZvby5hZGRUb1MobmV3IERlZXBDb3B5QmFyKCkpOworICAgIGZvby5wdXRUb00oInRlc3QgMyIsIG5ldyBEZWVwQ29weUJhcigpKTsKKworICAgIGZvby5hZGRUb0xpKG5ldyB0aHJpZnQudGVzdC5PYmplY3QoKSk7CisgICAgZm9vLmFkZFRvU2kobmV3IHRocmlmdC50ZXN0Lk9iamVjdCgpKTsKKyAgICBmb28ucHV0VG9NaSgidGVzdCAzIiwgbmV3IHRocmlmdC50ZXN0Lk9iamVjdCgpKTsKKworICAgIGZvby5zZXRCYXIobmV3IERlZXBDb3B5QmFyKCkpOworCisgICAgZmluYWwgRGVlcENvcHlGb28gZGVlcENvcHlGb28gPSBmb28uZGVlcENvcHkoKTsKKworICAgIGFzc2VydE5vdFNhbWUoZm9vLmdldEJhcigpLCBkZWVwQ29weUZvby5nZXRCYXIoKSk7CisKKyAgICBhc3NlcnROb3RTYW1lKGZvby5nZXRMKCkuZ2V0KDApLCAgICAgICAgICAgICAgICAgICAgICAgICAgZGVlcENvcHlGb28uZ2V0TCgpLmdldCgwKSk7CisgICAgYXNzZXJ0Tm90U2FtZShmb28uZ2V0UygpLnRvQXJyYXkobmV3IERlZXBDb3B5QmFyWzBdKVswXSwgIGRlZXBDb3B5Rm9vLmdldFMoKS50b0FycmF5KG5ldyBEZWVwQ29weUJhclswXSlbMF0pOworICAgIGFzc2VydE5vdFNhbWUoZm9vLmdldE0oKS5nZXQoInRlc3QgMyIpLCAgICAgICAgICAgICAgICAgICBkZWVwQ29weUZvby5nZXRNKCkuZ2V0KCJ0ZXN0IDMiKSk7CisKKyAgICBhc3NlcnROb3RTYW1lKGZvby5nZXRMaSgpLmdldCgwKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWVwQ29weUZvby5nZXRMaSgpLmdldCgwKSk7CisgICAgYXNzZXJ0Tm90U2FtZShmb28uZ2V0U2koKS50b0FycmF5KG5ldyB0aHJpZnQudGVzdC5PYmplY3RbMF0pWzBdLCAgZGVlcENvcHlGb28uZ2V0U2koKS50b0FycmF5KG5ldyB0aHJpZnQudGVzdC5PYmplY3RbMF0pWzBdKTsKKyAgICBhc3NlcnROb3RTYW1lKGZvby5nZXRNaSgpLmdldCgidGVzdCAzIiksICAgICAgICAgICAgICAgICAgICAgICAgICBkZWVwQ29weUZvby5nZXRNaSgpLmdldCgidGVzdCAzIikpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RFbnVtQ29udGFpbmVycy5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0RW51bUNvbnRhaW5lcnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODMyNDZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0RW51bUNvbnRhaW5lcnMuamF2YQpAQCAtMCwwICsxLDgxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQgdGhyaWZ0LnRlc3QuZW51bWNvbnRhaW5lcnMuRW51bUNvbnRhaW5lcnNUZXN0Q29uc3RhbnRzOworaW1wb3J0IHRocmlmdC50ZXN0LmVudW1jb250YWluZXJzLkdvZEJlYW47CitpbXBvcnQgdGhyaWZ0LnRlc3QuZW51bWNvbnRhaW5lcnMuR3JlZWtHb2RHb2RkZXNzOworCitpbXBvcnQgamF2YS51dGlsLkVudW1NYXA7CitpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CisKK3B1YmxpYyBjbGFzcyBUZXN0RW51bUNvbnRhaW5lcnMgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW51bUNvbnRhaW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgR29kQmVhbiBiMSA9IG5ldyBHb2RCZWFuKCk7CisgICAgICAgIGIxLmFkZFRvR29kZGVzcyhHcmVla0dvZEdvZGRlc3MuSEVSQSk7CisgICAgICAgIGIxLmdldEdvZGRlc3MoKS5hZGQoR3JlZWtHb2RHb2RkZXNzLkFQSFJPRElURSk7CisgICAgICAgIGIxLnB1dFRvUG93ZXIoR3JlZWtHb2RHb2RkZXNzLlpFVVMsIDEwMDApOworICAgICAgICBiMS5nZXRQb3dlcigpLnB1dChHcmVla0dvZEdvZGRlc3MuSEVSQSwgMzMzKTsKKyAgICAgICAgYjEucHV0VG9CeUFsaWFzKCJNci4gWiIsIEdyZWVrR29kR29kZGVzcy5aRVVTKTsKKyAgICAgICAgYjEuYWRkVG9JbWFnZXMoIkJhdGhzIG9mIEFwaHJvZGl0ZSAwMS5qcGVnIik7CisKKyAgICAgICAgZmluYWwgR29kQmVhbiBiMiA9IG5ldyBHb2RCZWFuKGIxKTsKKworICAgICAgICBmaW5hbCBHb2RCZWFuIGIzID0gbmV3IEdvZEJlYW4oKTsKKyAgICAgICAgeworICAgICAgICAgICAgZmluYWwgVFNlcmlhbGl6ZXIgc2VyaWFsaXplciA9IG5ldyBUU2VyaWFsaXplcigpOworICAgICAgICAgICAgZmluYWwgVERlc2VyaWFsaXplciBkZXNlcmlhbGl6ZXIgPSBuZXcgVERlc2VyaWFsaXplcigpOworCisgICAgICAgICAgICBmaW5hbCBieXRlW10gYnl0ZXMgPSBzZXJpYWxpemVyLnNlcmlhbGl6ZShiMSk7CisgICAgICAgICAgICBkZXNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoYjMsIGJ5dGVzKTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydFRydWUoYjEuZ2V0R29kZGVzcygpICE9IGIyLmdldEdvZGRlc3MoKSk7CisgICAgICAgIGFzc2VydFRydWUoYjEuZ2V0UG93ZXIoKSAhPSBiMi5nZXRQb3dlcigpKTsKKworICAgICAgICBhc3NlcnRUcnVlKGIxLmdldEdvZGRlc3MoKSAhPSBiMy5nZXRHb2RkZXNzKCkpOworICAgICAgICBhc3NlcnRUcnVlKGIxLmdldFBvd2VyKCkgIT0gYjMuZ2V0UG93ZXIoKSk7CisKKyAgICAgICAgZm9yIChHb2RCZWFuIGVhY2ggOiBuZXcgR29kQmVhbltde2IxLCBiMiwgYjN9KSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGVhY2guZ2V0R29kZGVzcygpLmNvbnRhaW5zKEdyZWVrR29kR29kZGVzcy5IRVJBKSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShlYWNoLmdldEdvZGRlc3MoKS5jb250YWlucyhHcmVla0dvZEdvZGRlc3MuUE9TRUlET04pKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZWFjaC5nZXRHb2RkZXNzKCkgaW5zdGFuY2VvZiBFbnVtU2V0KTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxMDAwKSwgZWFjaC5nZXRQb3dlcigpLmdldChHcmVla0dvZEdvZGRlc3MuWkVVUykpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigzMzMpLCBlYWNoLmdldFBvd2VyKCkuZ2V0KEdyZWVrR29kR29kZGVzcy5IRVJBKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGVhY2guZ2V0UG93ZXIoKSBpbnN0YW5jZW9mIEVudW1NYXApOworCisgICAgICAgICAgICBhc3NlcnRUcnVlKGVhY2guZ2V0QnlBbGlhcygpIGluc3RhbmNlb2YgSGFzaE1hcCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGVhY2guZ2V0SW1hZ2VzKCkgaW5zdGFuY2VvZiBIYXNoU2V0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RFbnVtQ29uc3RhbnRzKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoImxpZ2h0bmluZyBib2x0IiwgRW51bUNvbnRhaW5lcnNUZXN0Q29uc3RhbnRzLkFUVFJJQlVURVMuZ2V0KEdyZWVrR29kR29kZGVzcy5aRVVTKSk7CisgICAgICAgIGFzc2VydFRydWUoRW51bUNvbnRhaW5lcnNUZXN0Q29uc3RhbnRzLkFUVFJJQlVURVMgaW5zdGFuY2VvZiBFbnVtTWFwKTsKKworICAgICAgICBhc3NlcnRUcnVlKEVudW1Db250YWluZXJzVGVzdENvbnN0YW50cy5CRUFVVFkuY29udGFpbnMoR3JlZWtHb2RHb2RkZXNzLkFQSFJPRElURSkpOworICAgICAgICBhc3NlcnRUcnVlKEVudW1Db250YWluZXJzVGVzdENvbnN0YW50cy5CRUFVVFkgaW5zdGFuY2VvZiBFbnVtU2V0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RGdWxsQ2FtZWwuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdEZ1bGxDYW1lbC5qYXZhCmluZGV4IDE2ODFmYjguLmZjOTg4OTggMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdEZ1bGxDYW1lbC5qYXZhCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdEZ1bGxDYW1lbC5qYXZhCkBAIC0yNiw4ICsyNiw4IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEJpbmFyeVByb3RvY29sOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlOwogCi1pbXBvcnQgdGhyaWZ0LnRlc3QuT25lT2ZFYWNoWlo7Ci1pbXBvcnQgdGhyaWZ0LnRlc3QuVW5kZXJzY29yZVNydjsKK2ltcG9ydCB0aHJpZnQudGVzdC5mdWxsY2FtZWwuT25lT2ZFYWNoWlo7CitpbXBvcnQgdGhyaWZ0LnRlc3QuZnVsbGNhbWVsLlVuZGVyc2NvcmVTcnY7CiAKIC8vIFNhbml0eSBjaGVjayBmb3IgdGhlIGNvZGUgZ2VuZXJhdGVkIGJ5ICdmdWxsY2FtZWwnLgogLy8KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdE11bHRpcGxleGVkUHJvY2Vzc29yLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RNdWx0aXBsZXhlZFByb2Nlc3Nvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNzc2Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RNdWx0aXBsZXhlZFByb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5NYXRjaGVycy5hbnk7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ubW9jazsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by52ZXJpZnk7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ud2hlbjsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2w7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworcHVibGljIGNsYXNzIFRlc3RNdWx0aXBsZXhlZFByb2Nlc3NvciB7CisgIHByaXZhdGUgVE11bHRpcGxleGVkUHJvY2Vzc29yIG1wOworICBwcml2YXRlIFRQcm90b2NvbCBpcHJvdDsKKyAgcHJpdmF0ZSBUUHJvdG9jb2wgb3Byb3Q7CisKKyAgQEJlZm9yZQorICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIG1wID0gbmV3IFRNdWx0aXBsZXhlZFByb2Nlc3NvcigpOworICAgIGlwcm90ID0gbW9jayhUUHJvdG9jb2wuY2xhc3MpOworICAgIG9wcm90ID0gbW9jayhUUHJvdG9jb2wuY2xhc3MpOworICB9CisKKyAgQFRlc3QoZXhwZWN0ZWQgPSBURXhjZXB0aW9uLmNsYXNzKQorICBwdWJsaWMgdm9pZCB0ZXN0V3JvbmdNZXNzYWdlVHlwZSgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB3aGVuIChpcHJvdC5yZWFkTWVzc2FnZUJlZ2luKCkpLnRoZW5SZXR1cm4obmV3IFRNZXNzYWdlKCJzZXJ2aWNlOmZ1bmMiLCBUTWVzc2FnZVR5cGUuUkVQTFksIDQyKSk7CisgICAgbXAucHJvY2VzcyhpcHJvdCwgb3Byb3QpOworICB9CisKKyAgQFRlc3QoZXhwZWN0ZWQgPSBURXhjZXB0aW9uLmNsYXNzKQorICBwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoU2VydmljZSgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB3aGVuKGlwcm90LnJlYWRNZXNzYWdlQmVnaW4oKSkudGhlblJldHVybihuZXcgVE1lc3NhZ2UoInNlcnZpY2U6ZnVuYyIsIFRNZXNzYWdlVHlwZS5DQUxMLCA0MikpOworCisgICAgbXAucHJvY2VzcyhpcHJvdCwgb3Byb3QpOworICB9CisKKyAgc3RhdGljIGNsYXNzIFN0dWJQcm9jZXNzb3IgaW1wbGVtZW50cyBUUHJvY2Vzc29yIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzKFRQcm90b2NvbCBpbiwgVFByb3RvY29sIG91dCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgVE1lc3NhZ2UgbXNnID0gaW4ucmVhZE1lc3NhZ2VCZWdpbigpOworICAgICAgaWYgKCEiZnVuYyIuZXF1YWxzKG1zZy5uYW1lKSB8fCBtc2cudHlwZSE9VE1lc3NhZ2VUeXBlLkNBTEwgfHwgbXNnLnNlcWlkIT00MikgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiaW5jb3JyZWN0IHBhcmFtZXRlcnMiKTsKKyAgICAgIH0KKyAgICAgIG91dC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoImZ1bmMiLCBUTWVzc2FnZVR5cGUuUkVQTFksIDQyKSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0RXhpc3RpbmdTZXJ2aWNlKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHdoZW4oaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpKS50aGVuUmV0dXJuKG5ldyBUTWVzc2FnZSgic2VydmljZTpmdW5jIiwgVE1lc3NhZ2VUeXBlLkNBTEwsIDQyKSk7CisgICAgbXAucmVnaXN0ZXJQcm9jZXNzb3IoInNlcnZpY2UiLCBuZXcgU3R1YlByb2Nlc3NvcigpKTsKKyAgICBtcC5wcm9jZXNzKGlwcm90LCBvcHJvdCk7CisgICAgdmVyaWZ5KG9wcm90KS53cml0ZU1lc3NhZ2VCZWdpbihhbnkoVE1lc3NhZ2UuY2xhc3MpKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0U2VydmljZSgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB3aGVuKGlwcm90LnJlYWRNZXNzYWdlQmVnaW4oKSkudGhlblJldHVybihuZXcgVE1lc3NhZ2UoImZ1bmMiLCBUTWVzc2FnZVR5cGUuQ0FMTCwgNDIpKTsKKyAgICBtcC5yZWdpc3RlckRlZmF1bHQobmV3IFN0dWJQcm9jZXNzb3IoKSk7CisgICAgbXAucHJvY2VzcyhpcHJvdCwgb3Byb3QpOworICAgIHZlcmlmeShvcHJvdCkud3JpdGVNZXNzYWdlQmVnaW4oYW55KFRNZXNzYWdlLmNsYXNzKSk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY5MWZlMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSwxNzkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHRocmlmdC50ZXN0LkRvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHM7CisKK3B1YmxpYyBjbGFzcyBUZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZG91YmxlIEVQU0lMT04gPSAwLjAwMDAwMDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QgPQorICAgICAgICAiZmFpbGVkIHRvIHZlcmlmeSBhIGRvdWJsZSBjb25zdGFudCBnZW5lcmF0ZWQgYnkgVGhyaWZ0IChleHBlY3RlZCA9ICVmLCBnb3QgPSAlZikiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0xJU1RfVEVTVCA9CisgICAgICAgICJmYWlsZWQgdG8gdmVyaWZ5IGEgbGlzdCBpdGVtIGJ5IFRocmlmdCAoZXhwZWN0ZWQgPSAlZiwgZ290ID0gJWYpIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTID0KKyAgICAgICAgInRoZSByZW5kZXJlZCB2YXJpYWJsZSB3aXRoIG5hbWUgJXMgaXMgbm90IG9mIGRvdWJsZSB0eXBlIjsKKworICAgIC8vIHRvIG1ha2Ugc3VyZSBsaXN0cyBjb250YWluaW5nIGRvdWJsZXMgYXJlIGdlbmVyYXRlZCBjb3JyZWN0bHkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVuZGVyZWREb3VibGVMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIGRvdWJsZVtdIEVYUEVDVEVEX0xJU1QgPQorICAgICAgICAgICAgezFkLC0xMDBkLDEwMGQsOTIyMzM3MjAzNjg1NDc3NTgwN2QsLTkyMjMzNzIwMzY4NTQ3NzU4MDdkLDMuMTQxNTkyNjUzNTksMTAwMDAwMC4xLC0xMDAwMDAwLjEsMS43ZSszMDgsCisgICAgICAgICAgICAgLTEuN2UrMzA4LDkyMjMzNzIwMzY4NTQ3NzU4MTYuNDMsLTkyMjMzNzIwMzY4NTQ3NzU4MTYuNDN9OworICAgICAgICBhc3NlcnRFcXVhbHMoRVhQRUNURURfTElTVC5sZW5ndGgsIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0xJU1RfVEVTVC5zaXplKCkpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEVYUEVDVEVEX0xJU1QubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICBBU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0xJU1RfVEVTVCwKKyAgICAgICAgICAgICAgICAgICAgRVhQRUNURURfTElTVFtpXSwKKyAgICAgICAgICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfTElTVF9URVNULmdldChpKSksCisgICAgICAgICAgICAgICAgRVhQRUNURURfTElTVFtpXSwgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfTElTVF9URVNULmdldChpKSwgRVBTSUxPTik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyB0byBtYWtlIHN1cmUgdGhlIHZhcmlhYmxlcyBpbnNpZGUgVGhyaWZ0IGZpbGVzIGFyZSBnZW5lcmF0ZWQgY29ycmVjdGx5CisgICAgcHVibGljIHZvaWQgdGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIGRvdWJsZSBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5UID0gMS4wOworICAgICAgICBmaW5hbCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVCA9IC0xMDAuMDsKKyAgICAgICAgZmluYWwgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVCA9IDkyMjMzNzIwMzY4NTQ3NzU4MDcuMDsKKyAgICAgICAgZmluYWwgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlQgPSAtOTIyMzM3MjAzNjg1NDc3NTgwNy4wOworICAgICAgICBmaW5hbCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFMgPSAzLjE0MTU5MjY1MzU5OworICAgICAgICBmaW5hbCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFID0gMTAwMDAwMC4xOworICAgICAgICBmaW5hbCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFID0gLTEwMDAwMDAuMTsKKyAgICAgICAgZmluYWwgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEUgPSAxLjdlKzMwODsKKyAgICAgICAgZmluYWwgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSA9IDkyMjMzNzIwMzY4NTQ3NzU4MTYuNDM7CisgICAgICAgIGZpbmFsIGRvdWJsZSBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFID0gLTEuN2UrMzA4OworICAgICAgICBmaW5hbCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSA9IC05MjIzMzcyMDM2ODU0Nzc1ODE2LjQzOworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QsCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVCwKKyAgICAgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlRfVEVTVCksCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5ULAorICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5UX1RFU1QsIEVQU0lMT04pOworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QsCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVCwKKyAgICAgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlRfVEVTVCksCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5ULAorICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5UX1RFU1QsIEVQU0lMT04pOworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QsCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5ULAorICAgICAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5UX1RFU1QpLAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5ULAorICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlRfVEVTVCwgRVBTSUxPTik7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCwKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5ULAorICAgICAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVF9URVNUKSwKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlQsCisgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlRfVEVTVCwgRVBTSUxPTik7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCwKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMUywKKyAgICAgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTX1RFU1QpLAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFMsCisgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTX1RFU1QsIEVQU0lMT04pOworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QsCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFLAorICAgICAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpLAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFLAorICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCwgRVBTSUxPTik7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCwKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEUsCisgICAgICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCksCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEUsCisgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRV9URVNULCBFUFNJTE9OKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICBBU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNULAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEUsCisgICAgICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFX1RFU1QpLAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRSwKKyAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRV9URVNULCBFUFNJTE9OKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICBBU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNULAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSwKKyAgICAgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUKSwKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSwKKyAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsIEVQU0lMT04pOworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QsCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRSwKKyAgICAgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEVfVEVTVCksCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFLAorICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFX1RFU1QsIEVQU0lMT04pOworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QsCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSwKKyAgICAgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCksCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFLAorICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsIEVQU0lMT04pOworICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgU3RyaW5nLmZvcm1hdChBU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MsICJET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5UX1RFU1QiKSwKKyAgICAgICAgICAgIERvdWJsZS5jbGFzcy5pc0luc3RhbmNlKERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVF9URVNUKSk7CisgICAgICAgIGFzc2VydFRydWUoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUywgIkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlRfVEVTVCIpLAorICAgICAgICAgICAgRG91YmxlLmNsYXNzLmlzSW5zdGFuY2UoRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5UX1RFU1QpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTLCAiRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5UX1RFU1QiKSwKKyAgICAgICAgICAgIERvdWJsZS5jbGFzcy5pc0luc3RhbmNlKERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5UX1RFU1QpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTLCAiRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVF9URVNUIiksCisgICAgICAgICAgICBEb3VibGUuY2xhc3MuaXNJbnN0YW5jZShEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlRfVEVTVCkpOworICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgU3RyaW5nLmZvcm1hdChBU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MsICJET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMU19URVNUIiksCisgICAgICAgICAgICBEb3VibGUuY2xhc3MuaXNJbnN0YW5jZShEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTX1RFU1QpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTLCAiRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QiKSwKKyAgICAgICAgICAgIERvdWJsZS5jbGFzcy5pc0luc3RhbmNlKERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTLCAiRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QiKSwKKyAgICAgICAgICAgIERvdWJsZS5jbGFzcy5pc0luc3RhbmNlKERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpKTsKKyAgICAgICAgLy9hc3NlcnRUcnVlKAorICAgICAgICAvLyAgICBTdHJpbmcuZm9ybWF0KEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUywgIkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEVfVEVTVCIpLAorICAgICAgICAvLyAgICBEb3VibGUuY2xhc3MuaXNJbnN0YW5jZShEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEVfVEVTVCkpOworICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgU3RyaW5nLmZvcm1hdChBU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MsICJET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCIpLAorICAgICAgICAgICAgRG91YmxlLmNsYXNzLmlzSW5zdGFuY2UoRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkpOworICAgICAgICAvL2Fzc2VydFRydWUoCisgICAgICAgIC8vICAgIFN0cmluZy5mb3JtYXQoQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTLCAiRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRV9URVNUIiksCisgICAgICAgIC8vICAgIERvdWJsZS5jbGFzcy5pc0luc3RhbmNlKERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRV9URVNUKSk7CisgICAgICAgIGFzc2VydFRydWUoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUywgIkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCIpLAorICAgICAgICAgICAgRG91YmxlLmNsYXNzLmlzSW5zdGFuY2UoCisgICAgICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RSZXVzZS5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0UmV1c2UuamF2YQppbmRleCBkYjE2Yzc0Li5iNDRhYmQwIDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RSZXVzZS5qYXZhCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFJldXNlLmphdmEKQEAgLTIxLDEwICsyMSw3IEBACiAKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIAotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRCaW5hcnlQcm90b2NvbDsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZTsKIAogaW1wb3J0IHRocmlmdC50ZXN0LlJldXNlOwogCmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RTaG9ydFN0YWNrLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RTaG9ydFN0YWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3ODMxZTUuLjAwMDAwMDAKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0U2hvcnRTdGFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0U2hvcnRTdGFjayBleHRlbmRzIFRlc3RDYXNlIHsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5VTV9UUklBTFMgPSA1OwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTlVNX1JFUFMgPSAxMDAwMDAwMDsKLQotICBwdWJsaWMgdm9pZCB0ZXN0T3BzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgU2hvcnRTdGFjayBzID0gbmV3IFNob3J0U3RhY2soMTApOwotICAgIHMucHVzaCgoc2hvcnQpMTApOwotICAgIHMucHVzaCgoc2hvcnQpMTEpOwotICAgIHMucHVzaCgoc2hvcnQpMTIpOwotICAgIGFzc2VydEVxdWFscygoc2hvcnQpMTIsIHMucGVlaygpKTsKLSAgICBhc3NlcnRFcXVhbHMoKHNob3J0KTEyLCBzLnBlZWsoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKChzaG9ydCkxMiwgcy5wb3AoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKChzaG9ydCkxMSwgcy5wb3AoKSk7Ci0gICAgcy5wdXNoKChzaG9ydCk0MCk7Ci0gICAgYXNzZXJ0RXF1YWxzKChzaG9ydCk0MCwgcy5wZWVrKCkpOwotICAgIGFzc2VydEVxdWFscygoc2hvcnQpNDAsIHMucG9wKCkpOwotICAgIGFzc2VydEVxdWFscygoc2hvcnQpMTAsIHMucGVlaygpKTsKLSAgICBhc3NlcnRFcXVhbHMoKHNob3J0KTEwLCBzLnBvcCgpKTsKLSAgICB0cnkgewotICAgICAgcy5wZWVrKCk7Ci0gICAgICBmYWlsKCJzaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uISIpOwotICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyB5YXkKLSAgICB9Ci0KLSAgICB0cnkgewotICAgICAgcy5wb3AoKTsKLSAgICAgIGZhaWwoInNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24hIik7Ci0gICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIHlheQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RHcm93KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgU2hvcnRTdGFjayBzID0gbmV3IFNob3J0U3RhY2soMSk7Ci0gICAgcy5wdXNoKChzaG9ydCkxKTsKLSAgICBzLnB1c2goKHNob3J0KTEpOwotICAgIHMucHVzaCgoc2hvcnQpMSk7Ci0gICAgcy5wdXNoKChzaG9ydCkxKTsKLSAgICBzLnB1c2goKHNob3J0KTEpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgZm9yIChpbnQgdHJpYWwgPSAwOyB0cmlhbCA8IE5VTV9UUklBTFM7IHRyaWFsKyspIHsKLSAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgIFNob3J0U3RhY2sgcyA9IG5ldyBTaG9ydFN0YWNrKDEwKTsKLSAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IE5VTV9SRVBTOyByZXArKykgewotICAgICAgICBzLnB1c2goKHNob3J0KTEpOwotICAgICAgICBzLnB1c2goKHNob3J0KTExKTsKLSAgICAgICAgcy5wdXNoKChzaG9ydCkxMTEpOwotICAgICAgICBzLnBvcCgpOwotICAgICAgICBzLnBvcCgpOwotICAgICAgICBzLnB1c2goKHNob3J0KTEyKTsKLSAgICAgICAgcy5wdXNoKChzaG9ydCkxMjEpOwotICAgICAgICBzLnB1c2goKHNob3J0KTEyMTEpOwotICAgICAgICBzLnB1c2goKHNob3J0KTEyMTExKTsKLSAgICAgICAgcy5wb3AoKTsKLSAgICAgICAgcy5wb3AoKTsKLSAgICAgICAgcy5wb3AoKTsKLSAgICAgICAgcy5wb3AoKTsKLSAgICAgICAgcy5wdXNoKChzaG9ydCk1KTsKLSAgICAgICAgcy5wb3AoKTsKLSAgICAgICAgcy5wb3AoKTsKLSAgICAgIH0KLSAgICAgIGxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNob3J0U3RhY2s6ICIgKyAoZW5kLXN0YXJ0KSk7Ci0KLSAgICAgIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICBTdGFjazxTaG9ydD4gc3RkU3RhY2sgPSBuZXcgU3RhY2s8U2hvcnQ+KCk7Ci0gICAgICBmb3IgKGludCByZXAgPSAwOyByZXAgPCBOVU1fUkVQUzsgcmVwKyspIHsKLSAgICAgICAgc3RkU3RhY2sucHVzaCgoc2hvcnQpMSk7Ci0gICAgICAgIHN0ZFN0YWNrLnB1c2goKHNob3J0KTExKTsKLSAgICAgICAgc3RkU3RhY2sucHVzaCgoc2hvcnQpMTExKTsKLSAgICAgICAgc3RkU3RhY2sucG9wKCk7Ci0gICAgICAgIHN0ZFN0YWNrLnBvcCgpOwotICAgICAgICBzdGRTdGFjay5wdXNoKChzaG9ydCkxMik7Ci0gICAgICAgIHN0ZFN0YWNrLnB1c2goKHNob3J0KTEyMSk7Ci0gICAgICAgIHN0ZFN0YWNrLnB1c2goKHNob3J0KTEyMTEpOwotICAgICAgICBzdGRTdGFjay5wdXNoKChzaG9ydCkxMjExMSk7Ci0gICAgICAgIHN0ZFN0YWNrLnBvcCgpOwotICAgICAgICBzdGRTdGFjay5wb3AoKTsKLSAgICAgICAgc3RkU3RhY2sucG9wKCk7Ci0gICAgICAgIHN0ZFN0YWNrLnBvcCgpOwotICAgICAgICBzdGRTdGFjay5wdXNoKChzaG9ydCk1KTsKLSAgICAgICAgc3RkU3RhY2sucG9wKCk7Ci0gICAgICAgIHN0ZFN0YWNrLnBvcCgpOwotICAgICAgfQotICAgICAgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkJ1aWx0LWluIHN0YWNrOiAiICsgKGVuZC1zdGFydCkpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0U3RydWN0LmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RTdHJ1Y3QuamF2YQppbmRleCBiMGRmZmM4Li4zMzc5ZWQxIDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RTdHJ1Y3QuamF2YQorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RTdHJ1Y3QuamF2YQpAQCAtMzA4LDEyICszMDgsNDAgQEAKICAgICAgICAgb2JqZWN0LnRvU3RyaW5nKCkpOwogICB9CiAKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRBcnJheUVxdWFscyhieXRlW10gZXhwZWN0ZWQsIGJ5dGVbXSBhY3R1YWwpIHsKKyAgICBpZiAoIWphdmEudXRpbC5BcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpKSB7CisgICAgICBmYWlsKCJFeHBlY3RlZCBieXRlIGFycmF5IGRpZCBub3QgbWF0Y2ggYWN0dWFsLiIpOworICAgIH0KKyAgfQorCiAgIHB1YmxpYyB2b2lkIHRlc3RCeXRlc0J1ZmZlckZlYXR1cmVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgSmF2YVRlc3RIZWxwZXIgbyA9IG5ldyBKYXZhVGVzdEhlbHBlcigpOworICAgIAorICAgIGZpbmFsIFN0cmluZyB0ZXN0U3RyaW5nID0gInRlc3RCeXRlc0J1ZmZlckZlYXR1cmVzIjsKKyAgICBmaW5hbCBKYXZhVGVzdEhlbHBlciBvID0gbmV3IEphdmFUZXN0SGVscGVyKCk7CisKICAgICBvLnNldFJlcV9iaW4oKEJ5dGVCdWZmZXIpbnVsbCk7CiAgICAgYXNzZXJ0TnVsbChvLmdldFJlcV9iaW4oKSk7CisKKyAgICBvLnNldFJlcV9iaW4oQnl0ZUJ1ZmZlci53cmFwKHRlc3RTdHJpbmcuZ2V0Qnl0ZXMoKSkpOworICAgIGFzc2VydEFycmF5RXF1YWxzKHRlc3RTdHJpbmcuZ2V0Qnl0ZXMoKSwgby5nZXRSZXFfYmluKCkpOworCiAgICAgby5zZXRSZXFfYmluKChieXRlW10pbnVsbCk7CiAgICAgYXNzZXJ0TnVsbChvLmdldFJlcV9iaW4oKSk7CisKKyAgICBvLnNldFJlcV9iaW4odGVzdFN0cmluZy5nZXRCeXRlcygpKTsKKyAgICBhc3NlcnRBcnJheUVxdWFscyh0ZXN0U3RyaW5nLmdldEJ5dGVzKCksIG8uZ2V0UmVxX2JpbigpKTsKKworICAgIG8uc2V0RmllbGRWYWx1ZShKYXZhVGVzdEhlbHBlci5fRmllbGRzLlJFUV9CSU4sIG51bGwpOworICAgIGFzc2VydE51bGwoby5nZXRSZXFfYmluKCkpOworCisgICAgby5zZXRGaWVsZFZhbHVlKEphdmFUZXN0SGVscGVyLl9GaWVsZHMuUkVRX0JJTiwgdGVzdFN0cmluZy5nZXRCeXRlcygpKTsKKyAgICBhc3NlcnRBcnJheUVxdWFscyh0ZXN0U3RyaW5nLmdldEJ5dGVzKCksIG8uZ2V0UmVxX2JpbigpKTsKKworICAgIG8uc2V0RmllbGRWYWx1ZShKYXZhVGVzdEhlbHBlci5fRmllbGRzLlJFUV9CSU4sIG51bGwpOworICAgIGFzc2VydE51bGwoby5nZXRSZXFfYmluKCkpOworCisgICAgby5zZXRGaWVsZFZhbHVlKEphdmFUZXN0SGVscGVyLl9GaWVsZHMuUkVRX0JJTiwgQnl0ZUJ1ZmZlci53cmFwKHRlc3RTdHJpbmcuZ2V0Qnl0ZXMoKSkpOworICAgIGFzc2VydEFycmF5RXF1YWxzKHRlc3RTdHJpbmcuZ2V0Qnl0ZXMoKSwgby5nZXRSZXFfYmluKCkpOwogICB9CiAKICAgcHVibGljIHZvaWQgdGVzdEphdmFTZXJpYWxpemFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFVuc2FmZUJpbmFyaWVzLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RVbnNhZmVCaW5hcmllcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZmMyMTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RVbnNhZmVCaW5hcmllcy5qYXZhCkBAIC0wLDAgKzEsMTQ2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKK2ltcG9ydCB0aHJpZnQudGVzdC5TYWZlQnl0ZXM7CitpbXBvcnQgdGhyaWZ0LnRlc3QuVW5zYWZlQnl0ZXM7CisKKy8vICB0ZXN0IGdlbmVyYXRpbmcgdHlwZXMgd2l0aCB1bi1jb3BpZWQgYnl0ZVtdL0J5dGVCdWZmZXIgaW5wdXQvb3V0cHV0CisvLworcHVibGljIGNsYXNzIFRlc3RVbnNhZmVCaW5hcmllcyBleHRlbmRzIFRlc3RTdHJ1Y3QgeworCisgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBpbnB1dCgpIHsKKyAgICByZXR1cm4gbmV3IGJ5dGVbXXsxLCAxfTsKKyAgfQorCisgIC8vCisgIC8vICB2ZXJpZnkgdGhhdCB0aGUgdW5zYWZlX2JpbmFyaWVzIG9wdGlvbiBtb2RpZmllcyBiZWhhdmlvcgorICAvLworCisgIC8vICBjb25zdHJ1Y3RvciBkb2Vzbid0IGNvcHkKKyAgcHVibGljIHZvaWQgdGVzdFVuc2FmZUNvbnN0cnVjdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICBieXRlW10gaW5wdXQgPSBpbnB1dCgpOworICAgIFVuc2FmZUJ5dGVzIHN0cnVjdCA9IG5ldyBVbnNhZmVCeXRlcyhCeXRlQnVmZmVyLndyYXAoaW5wdXQpKTsKKworICAgIGlucHV0WzBdID0gMjsKKworICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscygKKyAgICAgICAgbmV3IGJ5dGVbXXsyLCAxfSwKKyAgICAgICAgc3RydWN0LmdldEJ5dGVzKCkpCisgICAgKTsKKworICB9CisKKyAgLy8gIGdldHRlciBkb2Vzbid0IGNvcHkKKyAgLy8gIG5vdGU6IHRoaXMgYmVoYXZpb3IgaXMgdGhlIHNhbWUgd2l0aC93aXRob3V0IHRoZSBmbGFnLCBidXQgaWYgdGhpcyBkZWZhdWx0IGV2ZXIgY2hhbmdlcywgdGhlIGN1cnJlbnQgYmVoYXZpb3IKKyAgLy8gICAgICAgIHNob3VsZCBiZSByZXRhaW5lZCB3aGVuIHVzaW5nIHRoaXMgZmxhZworICBwdWJsaWMgdm9pZCB0ZXN0VW5zYWZlR2V0dGVyKCl7CisgICAgVW5zYWZlQnl0ZXMgc3RydWN0ID0gbmV3IFVuc2FmZUJ5dGVzKEJ5dGVCdWZmZXIud3JhcChpbnB1dCgpKSk7CisKKyAgICBieXRlW10gdmFsID0gc3RydWN0LmdldEJ5dGVzKCk7CisgICAgdmFsWzBdID0gMjsKKworICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscygKKyAgICAgICAgbmV3IGJ5dGVbXXsyLCAxfSwKKyAgICAgICAgc3RydWN0LmdldEJ5dGVzKCkpCisgICAgKTsKKworICB9CisKKyAgLy8gIHNldHRlciBkb2Vzbid0IGNvcHkKKyAgcHVibGljIHZvaWQgdGVzdFVuc2FmZVNldHRlcigpeworICAgIFVuc2FmZUJ5dGVzIHN0cnVjdCA9IG5ldyBVbnNhZmVCeXRlcygpOworCisgICAgYnl0ZVtdIHZhbCA9IGlucHV0KCk7CisgICAgc3RydWN0LnNldEJ5dGVzKHZhbCk7CisKKyAgICB2YWxbMF0gPSAyOworCisgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKAorICAgICAgICBuZXcgYnl0ZVtdezIsIDF9LAorICAgICAgICBzdHJ1Y3QuZ2V0Qnl0ZXMoKSkKKyAgICApOworCisgIH0KKworICAvLyAgYnVmZmVyIGRvZW5zJ3QgY29weQorICBwdWJsaWMgdm9pZCB0ZXN0VW5zYWZlQnVmZmVyRm9yKCl7CisgICAgVW5zYWZlQnl0ZXMgc3RydWN0ID0gbmV3IFVuc2FmZUJ5dGVzKEJ5dGVCdWZmZXIud3JhcChpbnB1dCgpKSk7CisKKyAgICBCeXRlQnVmZmVyIHZhbCA9IHN0cnVjdC5idWZmZXJGb3JCeXRlcygpOworICAgIHZhbC5hcnJheSgpWzBdID0gMjsKKworICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscygKKyAgICAgICAgbmV3IGJ5dGVbXXsyLCAxfSwKKyAgICAgICAgc3RydWN0LmdldEJ5dGVzKCkpCisgICAgKTsKKworICB9CisKKyAgLy8KKyAgLy8gIHZlcmlmeSB0aGF0IHRoZSBkZWZhdWx0IGdlbmVyYXRvciBkb2VzIG5vdCBjaGFuZ2UgYmVoYXZpb3IKKyAgLy8KKworICBwdWJsaWMgdm9pZCB0ZXN0U2FmZUNvbnN0cnVjdG9yKCkgeworCisgICAgYnl0ZVtdIGlucHV0ID0gaW5wdXQoKTsKKyAgICBTYWZlQnl0ZXMgc3RydWN0ID0gbmV3IFNhZmVCeXRlcyhCeXRlQnVmZmVyLndyYXAoaW5wdXQpKTsKKworICAgIGlucHV0WzBdID0gMjsKKworICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscygKKyAgICAgICAgbmV3IGJ5dGVbXXsxLCAxfSwKKyAgICAgICAgc3RydWN0LmdldEJ5dGVzKCkpCisgICAgKTsKKworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFNhZmVTZXR0ZXIoKSB7CisKKyAgICBieXRlW10gaW5wdXQgPSBpbnB1dCgpOworICAgIFNhZmVCeXRlcyBzdHJ1Y3QgPSBuZXcgU2FmZUJ5dGVzKEJ5dGVCdWZmZXIud3JhcChpbnB1dCkpOworCisgICAgaW5wdXRbMF0gPSAyOworCisgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKAorICAgICAgICBuZXcgYnl0ZVtdezEsIDF9LAorICAgICAgICBzdHJ1Y3QuZ2V0Qnl0ZXMoKSkKKyAgICApOworCisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0U2FmZUJ1ZmZlckZvcigpeworICAgIFNhZmVCeXRlcyBzdHJ1Y3QgPSBuZXcgU2FmZUJ5dGVzKEJ5dGVCdWZmZXIud3JhcChpbnB1dCgpKSk7CisKKyAgICBCeXRlQnVmZmVyIHZhbCA9IHN0cnVjdC5idWZmZXJGb3JCeXRlcygpOworICAgIHZhbC5hcnJheSgpWzBdID0gMjsKKworICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscygKKyAgICAgICAgbmV3IGJ5dGVbXXsxLCAxfSwKKyAgICAgICAgc3RydWN0LmdldEJ5dGVzKCkpCisgICAgKTsKKworICB9CisKK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvYXN5bmMvVGVzdFRBc3luY0NsaWVudE1hbmFnZXIuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvYXN5bmMvVGVzdFRBc3luY0NsaWVudE1hbmFnZXIuamF2YQppbmRleCAxMmQwZWFmLi5jNDgzY2YyIDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L2FzeW5jL1Rlc3RUQXN5bmNDbGllbnRNYW5hZ2VyLmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9hc3luYy9UZXN0VEFzeW5jQ2xpZW50TWFuYWdlci5qYXZhCkBAIC0yMiwxMSArMjIsMTMgQEAKIGltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwogaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZW91dEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljUmVmZXJlbmNlOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwogCkBAIC0zOSwxMiArNDEsOSBAQAogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTm9uYmxvY2tpbmdTb2NrZXQ7CiAKIGltcG9ydCB0aHJpZnQudGVzdC5Db21wYWN0UHJvdG9UZXN0U3RydWN0OworaW1wb3J0IHRocmlmdC50ZXN0LkV4Y2VwdGlvbldpdGhBTWFwOwogaW1wb3J0IHRocmlmdC50ZXN0LlNydjsKIGltcG9ydCB0aHJpZnQudGVzdC5TcnYuSWZhY2U7Ci1pbXBvcnQgdGhyaWZ0LnRlc3QuU3J2LkFzeW5jQ2xpZW50Lkphbmt5X2NhbGw7Ci1pbXBvcnQgdGhyaWZ0LnRlc3QuU3J2LkFzeW5jQ2xpZW50Lm9uZXdheU1ldGhvZF9jYWxsOwotaW1wb3J0IHRocmlmdC50ZXN0LlNydi5Bc3luY0NsaWVudC5wcmltaXRpdmVNZXRob2RfY2FsbDsKLWltcG9ydCB0aHJpZnQudGVzdC5TcnYuQXN5bmNDbGllbnQudm9pZE1ldGhvZF9jYWxsOwogCiBwdWJsaWMgY2xhc3MgVGVzdFRBc3luY0NsaWVudE1hbmFnZXIgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKQEAgLTgzLDUzICs4MiwxMTMgQEAKICAgICBiYXNpY0NhbGwoY2xpZW50KTsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHRlc3RUaW1lb3V0Q2FsbCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIGZpbmFsIENvdW50RG93bkxhdGNoIGxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOwotICAgIFNydi5Bc3luY0NsaWVudCBjbGllbnQgPSBnZXRDbGllbnQoKTsKLSAgICBjbGllbnQuc2V0VGltZW91dCgxMDApOwotICAgIGNsaWVudC5wcmltaXRpdmVNZXRob2QobmV3IEFzeW5jTWV0aG9kQ2FsbGJhY2s8cHJpbWl0aXZlTWV0aG9kX2NhbGw+KCkgewotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICBpZiAoIShleGNlcHRpb24gaW5zdGFuY2VvZiBUaW1lb3V0RXhjZXB0aW9uKSkgewotICAgICAgICAgICAgU3RyaW5nV3JpdGVyIHNpbmsgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgICAgICBleGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKG5ldyBQcmludFdyaXRlcihzaW5rLCB0cnVlKSk7Ci0gICAgICAgICAgICBmYWlsKCJleHBlY3RlZCBUaW1lb3V0RXhjZXB0aW9uIGJ1dCBnb3QgIiArIHNpbmsudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgeworICBwcml2YXRlIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBFcnJvckNhbGxUZXN0PEMgZXh0ZW5kcyBUQXN5bmNDbGllbnQsIFI+IHsKKyAgICBmaW5hbCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIGxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworICAgICAgZmluYWwgQXRvbWljUmVmZXJlbmNlPEV4Y2VwdGlvbj4gZXJyb3IgPSBuZXcgQXRvbWljUmVmZXJlbmNlPEV4Y2VwdGlvbj4oKTsKKyAgICAgIEMgY2xpZW50ID0gZXhlY3V0ZUVycm9yaW5nQ2FsbChuZXcgQXN5bmNNZXRob2RDYWxsYmFjazxSPigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ29tcGxldGUoUiByZXNwb25zZSkgewogICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOwogICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICAgIGVycm9yLnNldChleGNlcHRpb24pOworICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOworICAgICAgICB9CisgICAgICB9KTsKKyAgICAgIGxhdGNoLmF3YWl0KDIsIFRpbWVVbml0LlNFQ09ORFMpOworICAgICAgYXNzZXJ0VHJ1ZShjbGllbnQuaGFzRXJyb3IoKSk7CisgICAgICBFeGNlcHRpb24gZXhjZXB0aW9uID0gZXJyb3IuZ2V0KCk7CisgICAgICBhc3NlcnROb3ROdWxsKGV4Y2VwdGlvbik7CisgICAgICBhc3NlcnRTYW1lKGV4Y2VwdGlvbiwgY2xpZW50LmdldEVycm9yKCkpOworICAgICAgdmFsaWRhdGVFcnJvcihjbGllbnQsIGV4Y2VwdGlvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhlY3V0ZXMgYSBjYWxsIHRoYXQgaXMgZXhwZWN0ZWQgdG8gcmFpc2UgYW4gZXhjZXB0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSB0ZXN0aW5nIGNhbGxiYWNrIHRoYXQgc2hvdWxkIGJlIGluc3RhbGxlZC4KKyAgICAgKiBAcmV0dXJuIFRoZSBjbGllbnQgdGhlIGNhbGwgd2FzIG1hZGUgYWdhaW5zdC4KKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpZiB0aGVyZSB3YXMgYSBwcm9ibGVtIHNldHRpbmcgdXAgdGhlIGNsaWVudCBvciBtYWtpbmcgdGhlIGNhbGwuCisgICAgICovCisgICAgYWJzdHJhY3QgQyBleGVjdXRlRXJyb3JpbmdDYWxsKEFzeW5jTWV0aG9kQ2FsbGJhY2s8Uj4gY2FsbGJhY2spIHRocm93cyBFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBGdXJ0aGVyIHZhbGlkYXRlcyB0aGUgcHJvcGVydGllcyBvZiB0aGUgZXJyb3IgcmFpc2VkIGluIHRoZSByZW1vdGUgY2FsbCBhbmQgdGhlIHN0YXRlIG9mIHRoZQorICAgICAqIGNsaWVudCBhZnRlciB0aGF0IGNhbGwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xpZW50IFRoZSBjbGllbnQgcmV0dXJuZWQgZnJvbSB7QGxpbmsgI2V4ZWN1dGVFcnJvcmluZ0NhbGwoQXN5bmNNZXRob2RDYWxsYmFjayl9LgorICAgICAqIEBwYXJhbSBlcnJvciBUaGUgZXhjZXB0aW9uIHJhaXNlZCBieSB0aGUgcmVtb3RlIGNhbGwuCisgICAgICovCisgICAgYWJzdHJhY3Qgdm9pZCB2YWxpZGF0ZUVycm9yKEMgY2xpZW50LCBFeGNlcHRpb24gZXJyb3IpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFVuZXhwZWN0ZWRSZW1vdGVFeGNlcHRpb25DYWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgbmV3IEVycm9yQ2FsbFRlc3Q8U3J2LkFzeW5jQ2xpZW50LCBCb29sZWFuPigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgU3J2LkFzeW5jQ2xpZW50IGV4ZWN1dGVFcnJvcmluZ0NhbGwoQXN5bmNNZXRob2RDYWxsYmFjazxCb29sZWFuPiBjYWxsYmFjaykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFNydi5Bc3luY0NsaWVudCBjbGllbnQgPSBnZXRDbGllbnQoKTsKKyAgICAgICAgY2xpZW50LmRlY2xhcmVkRXhjZXB0aW9uTWV0aG9kKGZhbHNlLCBjYWxsYmFjayk7CisgICAgICAgIHJldHVybiBjbGllbnQ7CiAgICAgICB9CiAKICAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIHZvaWQgb25Db21wbGV0ZShwcmltaXRpdmVNZXRob2RfY2FsbCByZXNwb25zZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgIGZhaWwoIlNob3VsZCBub3QgaGF2ZSBmaW5pc2hlZCB0aW1lZCBvdXQgY2FsbC4iKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKLSAgICAgICAgfQorICAgICAgdm9pZCB2YWxpZGF0ZUVycm9yKFNydi5Bc3luY0NsaWVudCBjbGllbnQsIEV4Y2VwdGlvbiBlcnJvcikgeworICAgICAgICBhc3NlcnRGYWxzZShjbGllbnQuaGFzVGltZW91dCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShlcnJvciBpbnN0YW5jZW9mIFRFeGNlcHRpb24pOwogICAgICAgfQotICAgIH0pOwotICAgIGxhdGNoLmF3YWl0KDIsIFRpbWVVbml0LlNFQ09ORFMpOwotICAgIGFzc2VydFRydWUoY2xpZW50Lmhhc0Vycm9yKCkpOwotICAgIGFzc2VydFRydWUoY2xpZW50LmdldEVycm9yKCkgaW5zdGFuY2VvZiBUaW1lb3V0RXhjZXB0aW9uKTsKKyAgICB9LnJ1blRlc3QoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3REZWNsYXJlZFJlbW90ZUV4Y2VwdGlvbkNhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBuZXcgRXJyb3JDYWxsVGVzdDxTcnYuQXN5bmNDbGllbnQsIEJvb2xlYW4+KCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBTcnYuQXN5bmNDbGllbnQgZXhlY3V0ZUVycm9yaW5nQ2FsbChBc3luY01ldGhvZENhbGxiYWNrPEJvb2xlYW4+IGNhbGxiYWNrKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3J2LkFzeW5jQ2xpZW50IGNsaWVudCA9IGdldENsaWVudCgpOworICAgICAgICBjbGllbnQuZGVjbGFyZWRFeGNlcHRpb25NZXRob2QodHJ1ZSwgY2FsbGJhY2spOworICAgICAgICByZXR1cm4gY2xpZW50OworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHZvaWQgdmFsaWRhdGVFcnJvcihTcnYuQXN5bmNDbGllbnQgY2xpZW50LCBFeGNlcHRpb24gZXJyb3IpIHsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY2xpZW50Lmhhc1RpbWVvdXQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhFeGNlcHRpb25XaXRoQU1hcC5jbGFzcywgZXJyb3IuZ2V0Q2xhc3MoKSk7CisgICAgICAgIEV4Y2VwdGlvbldpdGhBTWFwIGV4Y2VwdGlvbldpdGhBTWFwID0gKEV4Y2VwdGlvbldpdGhBTWFwKSBlcnJvcjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJibGFoIiwgZXhjZXB0aW9uV2l0aEFNYXAuZ2V0QmxhaCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpLCBleGNlcHRpb25XaXRoQU1hcC5nZXRNYXBfZmllbGQoKSk7CisgICAgICB9CisgICAgfS5ydW5UZXN0KCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0VGltZW91dENhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBuZXcgRXJyb3JDYWxsVGVzdDxTcnYuQXN5bmNDbGllbnQsIEludGVnZXI+KCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBTcnYuQXN5bmNDbGllbnQgZXhlY3V0ZUVycm9yaW5nQ2FsbChBc3luY01ldGhvZENhbGxiYWNrPEludGVnZXI+IGNhbGxiYWNrKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3J2LkFzeW5jQ2xpZW50IGNsaWVudCA9IGdldENsaWVudCgpOworICAgICAgICBjbGllbnQuc2V0VGltZW91dCgxMDApOworICAgICAgICBjbGllbnQucHJpbWl0aXZlTWV0aG9kKGNhbGxiYWNrKTsKKyAgICAgICAgcmV0dXJuIGNsaWVudDsKKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICB2b2lkIHZhbGlkYXRlRXJyb3IoU3J2LkFzeW5jQ2xpZW50IGNsaWVudCwgRXhjZXB0aW9uIGVycm9yKSB7CisgICAgICAgIGFzc2VydFRydWUoY2xpZW50Lmhhc1RpbWVvdXQoKSk7CisgICAgICAgIGFzc2VydFRydWUoZXJyb3IgaW5zdGFuY2VvZiBUaW1lb3V0RXhjZXB0aW9uKTsKKyAgICAgIH0KKyAgICB9LnJ1blRlc3QoKTsKICAgfQogCiAgIHB1YmxpYyB2b2lkIHRlc3RWb2lkQ2FsbCgpIHRocm93cyBFeGNlcHRpb24gewogICAgIGZpbmFsIENvdW50RG93bkxhdGNoIGxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOwogICAgIGZpbmFsIEF0b21pY0Jvb2xlYW4gcmV0dXJuZWQgPSBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSk7CiAgICAgU3J2LkFzeW5jQ2xpZW50IGNsaWVudCA9IGdldENsaWVudCgpOwotICAgIGNsaWVudC52b2lkTWV0aG9kKG5ldyBGYWlsdXJlTGVzc0NhbGxiYWNrPFNydi5Bc3luY0NsaWVudC52b2lkTWV0aG9kX2NhbGw+KCkgeworICAgIGNsaWVudC52b2lkTWV0aG9kKG5ldyBGYWlsdXJlTGVzc0NhbGxiYWNrPFZvaWQ+KCkgewogICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgdm9pZCBvbkNvbXBsZXRlKHZvaWRNZXRob2RfY2FsbCByZXNwb25zZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgIHJlc3BvbnNlLmdldFJlc3VsdCgpOwotICAgICAgICAgIHJldHVybmVkLnNldCh0cnVlKTsKLSAgICAgICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgZmFpbChlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKLSAgICAgICAgfQorICAgICAgcHVibGljIHZvaWQgb25Db21wbGV0ZShWb2lkIHJlc3BvbnNlKSB7CisgICAgICAgIHJldHVybmVkLnNldCh0cnVlKTsKKyAgICAgICAgbGF0Y2guY291bnREb3duKCk7CiAgICAgICB9CiAgICAgfSk7CiAgICAgbGF0Y2guYXdhaXQoMSwgVGltZVVuaXQuU0VDT05EUyk7CkBAIC0xNDAsMTcgKzE5OSwxMSBAQAogICAgIGZpbmFsIENvdW50RG93bkxhdGNoIGxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOwogICAgIGZpbmFsIEF0b21pY0Jvb2xlYW4gcmV0dXJuZWQgPSBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSk7CiAgICAgU3J2LkFzeW5jQ2xpZW50IGNsaWVudCA9IGdldENsaWVudCgpOwotICAgIGNsaWVudC5vbmV3YXlNZXRob2QobmV3IEZhaWx1cmVMZXNzQ2FsbGJhY2s8b25ld2F5TWV0aG9kX2NhbGw+KCkgeworICAgIGNsaWVudC5vbmV3YXlNZXRob2QobmV3IEZhaWx1cmVMZXNzQ2FsbGJhY2s8Vm9pZD4oKSB7CiAgICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyB2b2lkIG9uQ29tcGxldGUob25ld2F5TWV0aG9kX2NhbGwgcmVzcG9uc2UpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICByZXNwb25zZS5nZXRSZXN1bHQoKTsKLSAgICAgICAgICByZXR1cm5lZC5zZXQodHJ1ZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24gZSkgewotICAgICAgICAgIGZhaWwoZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgbGF0Y2guY291bnREb3duKCk7Ci0gICAgICAgIH0KKyAgICAgIHB1YmxpYyB2b2lkIG9uQ29tcGxldGUoVm9pZCByZXNwb25zZSkgeworICAgICAgICByZXR1cm5lZC5zZXQodHJ1ZSk7CisgICAgICAgIGxhdGNoLmNvdW50RG93bigpOwogICAgICAgfQogICAgIH0pOwogICAgIGxhdGNoLmF3YWl0KDEsIFRpbWVVbml0LlNFQ09ORFMpOwpAQCAtMTg4LDE3ICsyNDEsMTIgQEAKICAgcHJpdmF0ZSB2b2lkIGJhc2ljQ2FsbChTcnYuQXN5bmNDbGllbnQgY2xpZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKICAgICBmaW5hbCBBdG9taWNCb29sZWFuIHJldHVybmVkID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOwotICAgIGNsaWVudC5KYW5reSgxLCBuZXcgRmFpbHVyZUxlc3NDYWxsYmFjazxTcnYuQXN5bmNDbGllbnQuSmFua3lfY2FsbD4oKSB7CisgICAgY2xpZW50Lkphbmt5KDEsIG5ldyBGYWlsdXJlTGVzc0NhbGxiYWNrPEludGVnZXI+KCkgewogICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgdm9pZCBvbkNvbXBsZXRlKEphbmt5X2NhbGwgcmVzcG9uc2UpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICBhc3NlcnRFcXVhbHMoMywgcmVzcG9uc2UuZ2V0UmVzdWx0KCkpOwotICAgICAgICAgIHJldHVybmVkLnNldCh0cnVlKTsKLSAgICAgICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgZmFpbChlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKLSAgICAgICAgfQorICAgICAgcHVibGljIHZvaWQgb25Db21wbGV0ZShJbnRlZ2VyIHJlc3BvbnNlKSB7CisgICAgICAgIGFzc2VydEVxdWFscygzLCByZXNwb25zZS5pbnRWYWx1ZSgpKTsKKyAgICAgICAgcmV0dXJuZWQuc2V0KHRydWUpOworICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKICAgICAgIH0KIAogICAgICAgQE92ZXJyaWRlCkBAIC0yNTAsOSArMjk4LDE4IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb25ld2F5TWV0aG9kKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGRlY2xhcmVkRXhjZXB0aW9uTWV0aG9kKGJvb2xlYW4gc2hvdWxkVGhyb3dEZWNsYXJlZCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgaWYgKHNob3VsZFRocm93RGVjbGFyZWQpIHsKKyAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbldpdGhBTWFwKCJibGFoIiwgbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIlVuZXhwZWN0ZWQhIik7CisgICAgICB9CisgICAgfQogICB9CiAKLSAgcHJpdmF0ZSBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgRmFpbHVyZUxlc3NDYWxsYmFjazxUIGV4dGVuZHMgVEFzeW5jTWV0aG9kQ2FsbD4gaW1wbGVtZW50cyBBc3luY01ldGhvZENhbGxiYWNrPFQ+IHsKKyAgcHJpdmF0ZSBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgRmFpbHVyZUxlc3NDYWxsYmFjazxUPiBpbXBsZW1lbnRzIEFzeW5jTWV0aG9kQ2FsbGJhY2s8VD4gewogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewogICAgICAgZmFpbChleGNlcHRpb24pOwpAQCAtMjg3LDE4ICszNDQsMTMgQEAKICAgICAgICAgICAvLyBjb25uZWN0IGFuIGFzeW5jIGNsaWVudAogICAgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIGxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOwogICAgICAgICAgIGZpbmFsIEF0b21pY0Jvb2xlYW4gcmV0dXJuZWQgPSBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSk7Ci0gICAgICAgICAgY2xpZW50Xy5KYW5reSgxLCBuZXcgQXN5bmNNZXRob2RDYWxsYmFjazxTcnYuQXN5bmNDbGllbnQuSmFua3lfY2FsbD4oKSB7CisgICAgICAgICAgY2xpZW50Xy5KYW5reSgxLCBuZXcgQXN5bmNNZXRob2RDYWxsYmFjazxJbnRlZ2VyPigpIHsKIAogICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNvbXBsZXRlKEphbmt5X2NhbGwgcmVzcG9uc2UpIHsKLSAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMywgcmVzcG9uc2UuZ2V0UmVzdWx0KCkpOwotICAgICAgICAgICAgICAgIHJldHVybmVkLnNldCh0cnVlKTsKLSAgICAgICAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKLSAgICAgICAgICAgICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgbGF0Y2guY291bnREb3duKCk7Ci0gICAgICAgICAgICAgICAgZmFpbChlKTsKLSAgICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25Db21wbGV0ZShJbnRlZ2VyIHJlc3VsdCkgeworICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMywgcmVzdWx0LmludFZhbHVlKCkpOworICAgICAgICAgICAgICByZXR1cm5lZC5zZXQodHJ1ZSk7CisgICAgICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBAT3ZlcnJpZGUKQEAgLTMyMyw0ICszNzUsNCBAQAogICAgICAgfQogICAgIH0KICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvUHJvdG9jb2xUZXN0QmFzZS5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9Qcm90b2NvbFRlc3RCYXNlLmphdmEKaW5kZXggMmFjMDIxMS4uMDM4NmQ4MyAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9Qcm90b2NvbFRlc3RCYXNlLmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9Qcm90b2NvbFRlc3RCYXNlLmphdmEKQEAgLTMyNyw2ICszMjcsMTEgQEAKICAgICAgIEBPdmVycmlkZQogICAgICAgcHVibGljIHZvaWQgb25ld2F5TWV0aG9kKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBib29sZWFuIGRlY2xhcmVkRXhjZXB0aW9uTWV0aG9kKGJvb2xlYW4gc2hvdWxkVGhyb3cpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHNob3VsZFRocm93OworICAgICAgfQogICAgIH07CiAKICAgICBTcnYuUHJvY2Vzc29yIHRlc3RQcm9jZXNzb3IgPSBuZXcgU3J2LlByb2Nlc3NvcihoYW5kbGVyKTsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVGVzdFNob3J0U3RhY2suamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVGVzdFNob3J0U3RhY2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGU3OGVlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UZXN0U2hvcnRTdGFjay5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBUZXN0U2hvcnRTdGFjayBleHRlbmRzIFRlc3RDYXNlIHsKKworICBwdWJsaWMgdm9pZCB0ZXN0T3BzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgU2hvcnRTdGFjayBzID0gbmV3IFNob3J0U3RhY2soMSk7CisgICAgcy5wdXNoKChzaG9ydCkxMCk7CisgICAgcy5wdXNoKChzaG9ydCkxMSk7CisgICAgcy5wdXNoKChzaG9ydCkxMik7CisgICAgYXNzZXJ0RXF1YWxzKChzaG9ydCkxMiwgcy5wb3AoKSk7CisgICAgYXNzZXJ0RXF1YWxzKChzaG9ydCkxMSwgcy5wb3AoKSk7CisgICAgcy5wdXNoKChzaG9ydCk0MCk7CisgICAgYXNzZXJ0RXF1YWxzKChzaG9ydCk0MCwgcy5wb3AoKSk7CisgICAgYXNzZXJ0RXF1YWxzKChzaG9ydCkxMCwgcy5wb3AoKSk7CisgICAgdHJ5IHsKKyAgICAgIHMucG9wKCk7CisgICAgICBmYWlsKCJzaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uISIpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyB5YXkKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVGVzdFRKU09OUHJvdG9jb2wuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVGVzdFRKU09OUHJvdG9jb2wuamF2YQppbmRleCBkNzM3NmFjLi5jMmNhMWZhIDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Rlc3RUSlNPTlByb3RvY29sLmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UZXN0VEpTT05Qcm90b2NvbC5qYXZhCkBAIC0xOCw2ICsxOCwxMiBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOwogCitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5USlNPTlByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyOworCiBwdWJsaWMgY2xhc3MgVGVzdFRKU09OUHJvdG9jb2wgZXh0ZW5kcyBQcm90b2NvbFRlc3RCYXNlIHsKICAgQE92ZXJyaWRlCiAgIHByb3RlY3RlZCBUUHJvdG9jb2xGYWN0b3J5IGdldEZhY3RvcnkoKSB7CkBAIC0yOCw0ICszNCwxNSBAQAogICBwcm90ZWN0ZWQgYm9vbGVhbiBjYW5CZVVzZWROYWtlZCgpIHsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0RXNjYXBlZFVuaWNvZGUoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgU3RyaW5nIGpzb25TdHJpbmcgPSAiXCJoZWxsbyB1bmljb2RlIFxcdTBlMDFcXHVkODM0XFx1ZGQxZSB3b3JsZFwiIjsKKyAgICBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcgPSAiaGVsbG8gdW5pY29kZSBcdTBlMDFcdWQ4MzRcdWRkMWUgd29ybGQiOworCisgICAgVE1lbW9yeUJ1ZmZlciBidWZmZXIgPSBuZXcgVE1lbW9yeUJ1ZmZlcigxMDAwKTsKKyAgICBUSlNPTlByb3RvY29sIHByb3RvY29sID0gbmV3IFRKU09OUHJvdG9jb2woYnVmZmVyKTsKKyAgICBidWZmZXIud3JpdGUoanNvblN0cmluZy5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KSk7CisKKyAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIHByb3RvY29sLnJlYWRTdHJpbmcoKSk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVGVzdFRQcm90b2NvbFV0aWwuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVGVzdFRQcm90b2NvbFV0aWwuamF2YQppbmRleCAxOTljNzA3Li44OWNmNTM2IDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Rlc3RUUHJvdG9jb2xVdGlsLmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UZXN0VFByb3RvY29sVXRpbC5qYXZhCkBAIC0xOCwyNCArMTgsMTAgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKIAotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LkZpeHR1cmVzOwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlREZXNlcmlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UU2VyaWFsaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcjsKIAotaW1wb3J0IHRocmlmdC50ZXN0LkNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3Q7Ci1pbXBvcnQgdGhyaWZ0LnRlc3QuSG9seU1vbGV5OwotaW1wb3J0IHRocmlmdC50ZXN0Lk5lc3Rpbmc7Ci1pbXBvcnQgdGhyaWZ0LnRlc3QuT25lT2ZFYWNoOwotaW1wb3J0IHRocmlmdC50ZXN0LlNydjsKIGltcG9ydCB0aHJpZnQudGVzdC5HdWVzc1Byb3RvY29sU3RydWN0OwogCiBwdWJsaWMgY2xhc3MgVGVzdFRQcm90b2NvbFV0aWwgZXh0ZW5kcyBUZXN0Q2FzZSB7CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Rlc3RUU2ltcGxlSlNPTlByb3RvY29sLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Rlc3RUU2ltcGxlSlNPTlByb3RvY29sLmphdmEKaW5kZXggM2JiNmE5ZS4uOWQxMjViMSAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UZXN0VFNpbXBsZUpTT05Qcm90b2NvbC5qYXZhCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVGVzdFRTaW1wbGVKU09OUHJvdG9jb2wuamF2YQpAQCAtMTgsNyArMTgsNyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOwogCi1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIApAQCAtMjcsNiArMjcsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyOwogCiBpbXBvcnQgdGhyaWZ0LnRlc3QuQ29tcGFjdFByb3RvVGVzdFN0cnVjdDsKK2ltcG9ydCB0aHJpZnQudGVzdC5Ib2x5TW9sZXk7CiAKIHB1YmxpYyBjbGFzcyBUZXN0VFNpbXBsZUpTT05Qcm90b2NvbCBleHRlbmRzIFRlc3RDYXNlIHsKICAgcHJpdmF0ZSBUTWVtb3J5QnVmZmVyIGJ1ZjsKQEAgLTM5LDE2ICs0MCwxNiBAQAogICB9CiAKICAgcHJpdmF0ZSBTdHJpbmcgYnVmVG9TdHJpbmcoKSB7Ci0gICAgdHJ5IHsKLSAgICAgIHJldHVybiBidWYudG9TdHJpbmcoIlVURi04Iik7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICB9CisgICAgcmV0dXJuIGJ1Zi50b1N0cmluZyhTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKICAgfQogCiAgIHB1YmxpYyB2b2lkIHRlc3RIb2x5TW9sZXkoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgRml4dHVyZXMuaG9seU1vbGV5LndyaXRlKHByb3RvKTsKLSAgICBhc3NlcnRFcXVhbHMoIntcImJpZ1wiOlt7XCJpbV90cnVlXCI6MSxcImltX2ZhbHNlXCI6MCxcImFfYml0ZVwiOjM1LFwiaW50ZWdlcjE2XCI6MjcwMDAsXCJpbnRlZ2VyMzJcIjoxNjc3NzIxNixcImludGVnZXI2NFwiOjYwMDAwMDAwMDAsXCJkb3VibGVfcHJlY2lzaW9uXCI6My4xNDE1OTI2NTM1ODk3OTMsXCJzb21lX2NoYXJhY3RlcnNcIjpcIkpTT04gVEhJUyEgXFxcIlxcdTAwMDFcIixcInpvbWdfdW5pY29kZVwiOlwi04Diha7OnSDQnc6/4oW/0L7JodCz0LDPgeKEjiDOkXR0zrHihb3Ouu+/veKAvFwiLFwid2hhdF93aG9cIjowLFwiYmFzZTY0XCI6XCJiYXNlNjRcIixcImJ5dGVfbGlzdFwiOlsxLDIsM10sXCJpMTZfbGlzdFwiOlsxLDIsM10sXCJpNjRfbGlzdFwiOlsxLDIsM119LHtcImltX3RydWVcIjoxLFwiaW1fZmFsc2VcIjowLFwiYV9iaXRlXCI6LTQyLFwiaW50ZWdlcjE2XCI6MjcwMDAsXCJpbnRlZ2VyMzJcIjoxNjc3NzIxNixcImludGVnZXI2NFwiOjYwMDAwMDAwMDAsXCJkb3VibGVfcHJlY2lzaW9uXCI6My4xNDE1OTI2NTM1ODk3OTMsXCJzb21lX2NoYXJhY3RlcnNcIjpcIkpTT04gVEhJUyEgXFxcIlxcdTAwMDFcIixcInpvbWdfdW5pY29kZVwiOlwi04Diha7OnSDQnc6/4oW/0L7JodCz0LDPgeKEjiDOkXR0zrHihb3Ouu+/veKAvFwiLFwid2hhdF93aG9cIjowLFwiYmFzZTY0XCI6XCJiYXNlNjRcIixcImJ5dGVfbGlzdFwiOlsxLDIsM10sXCJpMTZfbGlzdFwiOlsxLDIsM10sXCJpNjRfbGlzdFwiOlsxLDIsM119XSxcImNvbnRhaW5cIjpbW10sW1widGhlbiBhIG9uZSwgdHdvXCIsXCJ0aHJlZSFcIixcIkZPVVIhIVwiXSxbXCJhbmQgYSBvbmVcIixcImFuZCBhIHR3b1wiXV0sXCJib25rc1wiOntcInR3b1wiOlt7XCJ0eXBlXCI6MSxcIm1lc3NhZ2VcIjpcIldhaXQuXCJ9LHtcInR5cGVcIjoyLFwibWVzc2FnZVwiOlwiV2hhdD9cIn1dLFwidGhyZWVcIjpbXSxcInplcm9cIjpbXX19IiwgYnVmVG9TdHJpbmcoKSk7CisgICAgZmluYWwgSG9seU1vbGV5IGhvbHlNb2xleSA9IEZpeHR1cmVzLmhvbHlNb2xleS5kZWVwQ29weSgpOworICAgIC8vIHVuc2V0IHNldHMgdGhhdCBwcm9kdWNlIGluY29uc2lzdGVudCBvcmRlcmluZyBiZXR3ZWVuIEpESzcvOAorICAgIGhvbHlNb2xleS51bnNldEJvbmtzKCk7CisgICAgaG9seU1vbGV5LnVuc2V0Q29udGFpbigpOworICAgIGhvbHlNb2xleS53cml0ZShwcm90byk7CisgICAgYXNzZXJ0RXF1YWxzKCJ7XCJiaWdcIjpbe1wiaW1fdHJ1ZVwiOjEsXCJpbV9mYWxzZVwiOjAsXCJhX2JpdGVcIjozNSxcImludGVnZXIxNlwiOjI3MDAwLFwiaW50ZWdlcjMyXCI6MTY3NzcyMTYsXCJpbnRlZ2VyNjRcIjo2MDAwMDAwMDAwLFwiZG91YmxlX3ByZWNpc2lvblwiOjMuMTQxNTkyNjUzNTg5NzkzLFwic29tZV9jaGFyYWN0ZXJzXCI6XCJKU09OIFRISVMhIFxcXCJcXHUwMDAxXCIsXCJ6b21nX3VuaWNvZGVcIjpcItOA4oWuzp0g0J3Ov+KFv9C+yaHQs9Cwz4HihI4gzpF0dM6x4oW9zrrvv73igLxcIixcIndoYXRfd2hvXCI6MCxcImJhc2U2NFwiOlwiYmFzZTY0XCIsXCJieXRlX2xpc3RcIjpbMSwyLDNdLFwiaTE2X2xpc3RcIjpbMSwyLDNdLFwiaTY0X2xpc3RcIjpbMSwyLDNdfSx7XCJpbV90cnVlXCI6MSxcImltX2ZhbHNlXCI6MCxcImFfYml0ZVwiOi00MixcImludGVnZXIxNlwiOjI3MDAwLFwiaW50ZWdlcjMyXCI6MTY3NzcyMTYsXCJpbnRlZ2VyNjRcIjo2MDAwMDAwMDAwLFwiZG91YmxlX3ByZWNpc2lvblwiOjMuMTQxNTkyNjUzNTg5NzkzLFwic29tZV9jaGFyYWN0ZXJzXCI6XCJKU09OIFRISVMhIFxcXCJcXHUwMDAxXCIsXCJ6b21nX3VuaWNvZGVcIjpcItOA4oWuzp0g0J3Ov+KFv9C+yaHQs9Cwz4HihI4gzpF0dM6x4oW9zrrvv73igLxcIixcIndoYXRfd2hvXCI6MCxcImJhc2U2NFwiOlwiYmFzZTY0XCIsXCJieXRlX2xpc3RcIjpbMSwyLDNdLFwiaTE2X2xpc3RcIjpbMSwyLDNdLFwiaTY0X2xpc3RcIjpbMSwyLDNdfV19IiwgYnVmVG9TdHJpbmcoKSk7CiAgIH0KIAogICBwdWJsaWMgdm9pZCB0ZXN0TmVzdGluZygpIHRocm93cyBURXhjZXB0aW9uIHsKQEAgLTY3LDggKzY4LDE5IEBACiAgICAgc3RydWN0LnVuc2V0TGlzdF9ieXRlX21hcCgpOwogICAgIHN0cnVjdC51bnNldFNldF9ieXRlX21hcCgpOwogICAgIHN0cnVjdC51bnNldE1hcF9ieXRlX21hcCgpOworICAgIC8vIHVuc2V0IHNldHMgYW5kIG1hcHMgdGhhdCBwcm9kdWNlIGluY29uc2lzdGVudCBvcmRlcmluZyBiZXR3ZWVuIEpESzcvOAorICAgIHN0cnVjdC51bnNldEJ5dGVfc2V0KCk7CisgICAgc3RydWN0LnVuc2V0STE2X3NldCgpOworICAgIHN0cnVjdC51bnNldEk2NF9zZXQoKTsKKyAgICBzdHJ1Y3QudW5zZXREb3VibGVfc2V0KCk7CisgICAgc3RydWN0LnVuc2V0U3RyaW5nX3NldCgpOworICAgIHN0cnVjdC51bnNldEkxNl9ieXRlX21hcCgpOworICAgIHN0cnVjdC51bnNldEkzMl9ieXRlX21hcCgpOworICAgIHN0cnVjdC51bnNldEk2NF9ieXRlX21hcCgpOworICAgIHN0cnVjdC51bnNldERvdWJsZV9ieXRlX21hcCgpOworICAgIHN0cnVjdC51bnNldFN0cmluZ19ieXRlX21hcCgpOwogICAgIHN0cnVjdC53cml0ZShwcm90byk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJ7XCJhX2J5dGVcIjoxMjcsXCJhX2kxNlwiOjMyMDAwLFwiYV9pMzJcIjoxMDAwMDAwMDAwLFwiYV9pNjRcIjoxMDk5NTExNjI3Nzc1LFwiYV9kb3VibGVcIjo1LjY3ODksXCJhX3N0cmluZ1wiOlwibXkgc3RyaW5nXCIsXCJhX2JpbmFyeVwiOlwiXFx1MDAwMFxcdTAwMDFcXHUwMDAyXFx1MDAwM1xcdTAwMDRcXHUwMDA1XFx1MDAwNlxcdTAwMDdcXGJcIixcInRydWVfZmllbGRcIjoxLFwiZmFsc2VfZmllbGRcIjowLFwiZW1wdHlfc3RydWN0X2ZpZWxkXCI6e30sXCJieXRlX2xpc3RcIjpbLTEyNywtMSwwLDEsMTI3XSxcImkxNl9saXN0XCI6Wy0xLDAsMSwzMjc2N10sXCJpMzJfbGlzdFwiOlstMSwwLDI1NSw2NTUzNSwxNjc3NzIxNSwyMTQ3NDgzNjQ3XSxcImk2NF9saXN0XCI6Wy0xLDAsMjU1LDY1NTM1LDE2Nzc3MjE1LDQyOTQ5NjcyOTUsMTA5OTUxMTYyNzc3NSwyODE0NzQ5NzY3MTA2NTUsNzIwNTc1OTQwMzc5Mjc5MzUsOTIyMzM3MjAzNjg1NDc3NTgwN10sXCJkb3VibGVfbGlzdFwiOlswLjEsMC4yLDAuM10sXCJzdHJpbmdfbGlzdFwiOltcImZpcnN0XCIsXCJzZWNvbmRcIixcInRoaXJkXCJdLFwiYm9vbGVhbl9saXN0XCI6WzEsMSwxLDAsMCwwXSxcInN0cnVjdF9saXN0XCI6W3t9LHt9XSxcImJ5dGVfc2V0XCI6WzAsMSwtMTI3LDEyNywtMV0sXCJpMTZfc2V0XCI6WzAsMSwzMjc2NywtMV0sXCJpMzJfc2V0XCI6WzEsMiwzXSxcImk2NF9zZXRcIjpbOTIyMzM3MjAzNjg1NDc3NTgwNyw3MjA1NzU5NDAzNzkyNzkzNSw2NTUzNSwwLC0xLDI1NSwxMDk5NTExNjI3Nzc1LDI4MTQ3NDk3NjcxMDY1NSw0Mjk0OTY3Mjk1LDE2Nzc3MjE1XSxcImRvdWJsZV9zZXRcIjpbMC4xLDAuMiwwLjNdLFwic3RyaW5nX3NldFwiOltcInNlY29uZFwiLFwidGhpcmRcIixcImZpcnN0XCJdLFwiYm9vbGVhbl9zZXRcIjpbMCwxXSxcInN0cnVjdF9zZXRcIjpbe31dLFwiYnl0ZV9ieXRlX21hcFwiOntcIjFcIjoyfSxcImkxNl9ieXRlX21hcFwiOntcIjFcIjoxLFwiMzI3NjdcIjoxLFwiLTFcIjoxfSxcImkzMl9ieXRlX21hcFwiOntcIjFcIjoxLFwiMjE0NzQ4MzY0N1wiOjEsXCItMVwiOjF9LFwiaTY0X2J5dGVfbWFwXCI6e1wiOTIyMzM3MjAzNjg1NDc3NTgwN1wiOjEsXCItMVwiOjEsXCIwXCI6MSxcIjFcIjoxfSxcImRvdWJsZV9ieXRlX21hcFwiOntcIjEuMVwiOjEsXCItMS4xXCI6MX0sXCJzdHJpbmdfYnl0ZV9tYXBcIjp7XCJcIjowLFwic2Vjb25kXCI6MixcInRoaXJkXCI6MyxcImZpcnN0XCI6MX0sXCJib29sZWFuX2J5dGVfbWFwXCI6e1wiMFwiOjAsXCIxXCI6MX0sXCJieXRlX2kxNl9tYXBcIjp7XCIxXCI6MSxcIjJcIjotMSxcIjNcIjozMjc2N30sXCJieXRlX2kzMl9tYXBcIjp7XCIxXCI6MSxcIjJcIjotMSxcIjNcIjoyMTQ3NDgzNjQ3fSxcImJ5dGVfaTY0X21hcFwiOntcIjFcIjoxLFwiMlwiOi0xLFwiM1wiOjkyMjMzNzIwMzY4NTQ3NzU4MDd9LFwiYnl0ZV9kb3VibGVfbWFwXCI6e1wiMVwiOjAuMSxcIjJcIjotMC4xLFwiM1wiOjEwMDAwMDAuMH0sXCJieXRlX3N0cmluZ19tYXBcIjp7XCIxXCI6XCJcIixcIjJcIjpcImJsYWhcIixcIjNcIjpcImxvb29vb29vb29vb29vb25nIHN0cmluZ1wifSxcImJ5dGVfYm9vbGVhbl9tYXBcIjp7XCIxXCI6MSxcIjJcIjowfSxcImJ5dGVfbWFwX21hcFwiOntcIjBcIjp7fSxcIjFcIjp7XCIxXCI6MX0sXCIyXCI6e1wiMVwiOjEsXCIyXCI6Mn19LFwiYnl0ZV9zZXRfbWFwXCI6e1wiMFwiOltdLFwiMVwiOlsxXSxcIjJcIjpbMSwyXX0sXCJieXRlX2xpc3RfbWFwXCI6e1wiMFwiOltdLFwiMVwiOlsxXSxcIjJcIjpbMSwyXX19IiwgYnVmVG9TdHJpbmcoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJ7XCJhX2J5dGVcIjoxMjcsXCJhX2kxNlwiOjMyMDAwLFwiYV9pMzJcIjoxMDAwMDAwMDAwLFwiYV9pNjRcIjoxMDk5NTExNjI3Nzc1LFwiYV9kb3VibGVcIjo1LjY3ODksXCJhX3N0cmluZ1wiOlwibXkgc3RyaW5nXCIsXCJhX2JpbmFyeVwiOlwiXFx1MDAwMFxcdTAwMDFcXHUwMDAyXFx1MDAwM1xcdTAwMDRcXHUwMDA1XFx1MDAwNlxcdTAwMDdcXGJcIixcInRydWVfZmllbGRcIjoxLFwiZmFsc2VfZmllbGRcIjowLFwiZW1wdHlfc3RydWN0X2ZpZWxkXCI6e30sXCJieXRlX2xpc3RcIjpbLTEyNywtMSwwLDEsMTI3XSxcImkxNl9saXN0XCI6Wy0xLDAsMSwzMjc2N10sXCJpMzJfbGlzdFwiOlstMSwwLDI1NSw2NTUzNSwxNjc3NzIxNSwyMTQ3NDgzNjQ3XSxcImk2NF9saXN0XCI6Wy0xLDAsMjU1LDY1NTM1LDE2Nzc3MjE1LDQyOTQ5NjcyOTUsMTA5OTUxMTYyNzc3NSwyODE0NzQ5NzY3MTA2NTUsNzIwNTc1OTQwMzc5Mjc5MzUsOTIyMzM3MjAzNjg1NDc3NTgwN10sXCJkb3VibGVfbGlzdFwiOlswLjEsMC4yLDAuM10sXCJzdHJpbmdfbGlzdFwiOltcImZpcnN0XCIsXCJzZWNvbmRcIixcInRoaXJkXCJdLFwiYm9vbGVhbl9saXN0XCI6WzEsMSwxLDAsMCwwXSxcInN0cnVjdF9saXN0XCI6W3t9LHt9XSxcImkzMl9zZXRcIjpbMSwyLDNdLFwiYm9vbGVhbl9zZXRcIjpbMCwxXSxcInN0cnVjdF9zZXRcIjpbe31dLFwiYnl0ZV9ieXRlX21hcFwiOntcIjFcIjoyfSxcImJvb2xlYW5fYnl0ZV9tYXBcIjp7XCIwXCI6MCxcIjFcIjoxfSxcImJ5dGVfaTE2X21hcFwiOntcIjFcIjoxLFwiMlwiOi0xLFwiM1wiOjMyNzY3fSxcImJ5dGVfaTMyX21hcFwiOntcIjFcIjoxLFwiMlwiOi0xLFwiM1wiOjIxNDc0ODM2NDd9LFwiYnl0ZV9pNjRfbWFwXCI6e1wiMVwiOjEsXCIyXCI6LTEsXCIzXCI6OTIyMzM3MjAzNjg1NDc3NTgwN30sXCJieXRlX2RvdWJsZV9tYXBcIjp7XCIxXCI6MC4xLFwiMlwiOi0wLjEsXCIzXCI6MTAwMDAwMC4xfSxcImJ5dGVfc3RyaW5nX21hcFwiOntcIjFcIjpcIlwiLFwiMlwiOlwiYmxhaFwiLFwiM1wiOlwibG9vb29vb29vb29vb29vbmcgc3RyaW5nXCJ9LFwiYnl0ZV9ib29sZWFuX21hcFwiOntcIjFcIjoxLFwiMlwiOjB9LFwiYnl0ZV9tYXBfbWFwXCI6e1wiMFwiOnt9LFwiMVwiOntcIjFcIjoxfSxcIjJcIjp7XCIxXCI6MSxcIjJcIjoyfX0sXCJieXRlX3NldF9tYXBcIjp7XCIwXCI6W10sXCIxXCI6WzFdLFwiMlwiOlsxLDJdfSxcImJ5dGVfbGlzdF9tYXBcIjp7XCIwXCI6W10sXCIxXCI6WzFdLFwiMlwiOlsxLDJdfX0iLCBidWZUb1N0cmluZygpKTsKICAgfQogCiAgIHB1YmxpYyB2b2lkIHRlc3RUaHJvd3NPbkNvbGxlY3Rpb25LZXlzKCkgdGhyb3dzIFRFeGNlcHRpb24gewpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvU2VydmVyVGVzdEJhc2UuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1NlcnZlclRlc3RCYXNlLmphdmEKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBiOTU3NzliLi4xZGVlMjJkCi0tLSBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1NlcnZlclRlc3RCYXNlLmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvU2VydmVyVGVzdEJhc2UuamF2YQpAQCAtNTQsMTMgKzU0LDEzIEBACiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VydmVyVGVzdEJhc2UgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0SGFuZGxlciBpbXBsZW1lbnRzIFRocmlmdFRlc3QuSWZhY2UgewotICAKKwogICAgIHB1YmxpYyBUZXN0SGFuZGxlcigpIHt9Ci0gIAorCiAgICAgcHVibGljIHZvaWQgdGVzdFZvaWQoKSB7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0Vm9pZCgpXG4iKTsKICAgICB9Ci0gIAorCiAgICAgcHVibGljIFN0cmluZyB0ZXN0U3RyaW5nKFN0cmluZyB0aGluZykgewogICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdFN0cmluZyhcIiIgKyB0aGluZyArICJcIilcbiIpOwogICAgICAgcmV0dXJuIHRoaW5nOwpAQCAtNzAsMzAgKzcwLDM1IEBACiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0Qm9vbCgiICsgdGhpbmcgKyAiKVxuIik7CiAgICAgICByZXR1cm4gdGhpbmc7CiAgICAgfQotICAKKwogICAgIHB1YmxpYyBieXRlIHRlc3RCeXRlKGJ5dGUgdGhpbmcpIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RCeXRlKCIgKyB0aGluZyArICIpXG4iKTsKICAgICAgIHJldHVybiB0aGluZzsKICAgICB9Ci0gIAorCiAgICAgcHVibGljIGludCB0ZXN0STMyKGludCB0aGluZykgewogICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdEkzMigiICsgdGhpbmcgKyAiKVxuIik7CiAgICAgICByZXR1cm4gdGhpbmc7CiAgICAgfQotICAKKwogICAgIHB1YmxpYyBsb25nIHRlc3RJNjQobG9uZyB0aGluZykgewogICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdEk2NCgiICsgdGhpbmcgKyAiKVxuIik7CiAgICAgICByZXR1cm4gdGhpbmc7CiAgICAgfQotICAKKwogICAgIHB1YmxpYyBkb3VibGUgdGVzdERvdWJsZShkb3VibGUgdGhpbmcpIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3REb3VibGUoIiArIHRoaW5nICsgIilcbiIpOwogICAgICAgcmV0dXJuIHRoaW5nOwogICAgIH0KIAogICAgIHB1YmxpYyBCeXRlQnVmZmVyIHRlc3RCaW5hcnkoQnl0ZUJ1ZmZlciB0aGluZykgewotICAgICAgU3RyaW5nIGhleHN0ciA9ICJUT0RPOiB0b0hleFN0cmluZyh0aGluZykiOwotCSAgU3lzdGVtLm91dC5wcmludCgidGVzdEJpbmFyeSgiICsgaGV4c3RyICsgIilcbiIpOworICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKHRoaW5nLnJlbWFpbmluZygpICogMyk7CisgICAgICB0aGluZy5tYXJrKCk7CisgICAgICB3aGlsZSAodGhpbmcucmVtYWluaW5nKCkgPiAwKSB7CisgICAgICAgIHNiLmFwcGVuZChTdHJpbmcuZm9ybWF0KCIlMDJYICIsIHRoaW5nLmdldCgpKSk7CisgICAgICB9CisgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0QmluYXJ5KCIgKyBzYi50b1N0cmluZygpICsgIilcbiIpOworICAgICAgdGhpbmcucmVzZXQoKTsKICAgICAgIHJldHVybiB0aGluZzsKICAgICB9CiAKQEAgLTEwNSw3ICsxMTAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICB0aGluZy5pNjRfdGhpbmcgKyAifSlcbiIpOwogICAgICAgcmV0dXJuIHRoaW5nOwogICAgIH0KLSAgCisKICAgICBwdWJsaWMgWHRydWN0MiB0ZXN0TmVzdChYdHJ1Y3QyIG5lc3QpIHsKICAgICAgIFh0cnVjdCB0aGluZyA9IG5lc3Quc3RydWN0X3RoaW5nOwogICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdE5lc3QoeyIgKwpAQCAtMTE3LDcgKzEyMiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgIG5lc3QuaTMyX3RoaW5nICsgIn0pXG4iKTsKICAgICAgIHJldHVybiBuZXN0OwogICAgIH0KLSAgCisKICAgICBwdWJsaWMgTWFwPEludGVnZXIsSW50ZWdlcj4gdGVzdE1hcChNYXA8SW50ZWdlcixJbnRlZ2VyPiB0aGluZykgewogICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdE1hcCh7Iik7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KHRoaW5nKTsKQEAgLTEzMSw3ICsxMzYsNyBAQAogICAgICAgU3lzdGVtLm91dC5wcmludCgifSlcbiIpOwogICAgICAgcmV0dXJuIHRoaW5nOwogICAgIH0KLSAgCisKICAgICBwdWJsaWMgU2V0PEludGVnZXI+IHRlc3RTZXQoU2V0PEludGVnZXI+IHRoaW5nKSB7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0U2V0KHsiKTsKICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOwpAQCAtMTQ2LDcgKzE1MSw3IEBACiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9KVxuIik7CiAgICAgICByZXR1cm4gdGhpbmc7CiAgICAgfQotICAKKwogICAgIHB1YmxpYyBMaXN0PEludGVnZXI+IHRlc3RMaXN0KExpc3Q8SW50ZWdlcj4gdGhpbmcpIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RMaXN0KHsiKTsKICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOwpAQCAtMTYxLDc4ICsxNjYsNTggQEAKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn0pXG4iKTsKICAgICAgIHJldHVybiB0aGluZzsKICAgICB9Ci0gIAorCiAgICAgcHVibGljIE51bWJlcnogdGVzdEVudW0oTnVtYmVyeiB0aGluZykgewogICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdEVudW0oIiArIHRoaW5nICsgIilcbiIpOwogICAgICAgcmV0dXJuIHRoaW5nOwogICAgIH0KLSAgCisKICAgICBwdWJsaWMgbG9uZyB0ZXN0VHlwZWRlZihsb25nIHRoaW5nKSB7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0VHlwZWRlZigiICsgdGhpbmcgKyAiKVxuIik7CiAgICAgICByZXR1cm4gdGhpbmc7CiAgICAgfQotICAKKwogICAgIHB1YmxpYyBNYXA8SW50ZWdlcixNYXA8SW50ZWdlcixJbnRlZ2VyPj4gdGVzdE1hcE1hcChpbnQgaGVsbG8pIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RNYXBNYXAoIiArIGhlbGxvICsgIilcbiIpOwogICAgICAgTWFwPEludGVnZXIsTWFwPEludGVnZXIsSW50ZWdlcj4+IG1hcG1hcCA9CiAgICAgICAgIG5ldyBIYXNoTWFwPEludGVnZXIsTWFwPEludGVnZXIsSW50ZWdlcj4+KCk7Ci0gIAorCiAgICAgICBIYXNoTWFwPEludGVnZXIsSW50ZWdlcj4gcG9zID0gbmV3IEhhc2hNYXA8SW50ZWdlcixJbnRlZ2VyPigpOwogICAgICAgSGFzaE1hcDxJbnRlZ2VyLEludGVnZXI+IG5lZyA9IG5ldyBIYXNoTWFwPEludGVnZXIsSW50ZWdlcj4oKTsKICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgNTsgaSsrKSB7CiAgICAgICAgIHBvcy5wdXQoaSwgaSk7CiAgICAgICAgIG5lZy5wdXQoLWksIC1pKTsKICAgICAgIH0KLSAgCisKICAgICAgIG1hcG1hcC5wdXQoNCwgcG9zKTsKICAgICAgIG1hcG1hcC5wdXQoLTQsIG5lZyk7Ci0gIAorCiAgICAgICByZXR1cm4gbWFwbWFwOwogICAgIH0KLSAgCisKICAgICBwdWJsaWMgTWFwPExvbmcsIE1hcDxOdW1iZXJ6LEluc2FuaXR5Pj4gdGVzdEluc2FuaXR5KEluc2FuaXR5IGFyZ3VtZW50KSB7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0SW5zYW5pdHkoKVxuIik7Ci0gIAotICAgICAgWHRydWN0IGhlbGxvID0gbmV3IFh0cnVjdCgpOwotICAgICAgaGVsbG8uc3RyaW5nX3RoaW5nID0gIkhlbGxvMiI7Ci0gICAgICBoZWxsby5ieXRlX3RoaW5nID0gMjsKLSAgICAgIGhlbGxvLmkzMl90aGluZyA9IDI7Ci0gICAgICBoZWxsby5pNjRfdGhpbmcgPSAyOwotICAKLSAgICAgIFh0cnVjdCBnb29kYnllID0gbmV3IFh0cnVjdCgpOwotICAgICAgZ29vZGJ5ZS5zdHJpbmdfdGhpbmcgPSAiR29vZGJ5ZTQiOwotICAgICAgZ29vZGJ5ZS5ieXRlX3RoaW5nID0gKGJ5dGUpNDsKLSAgICAgIGdvb2RieWUuaTMyX3RoaW5nID0gNDsKLSAgICAgIGdvb2RieWUuaTY0X3RoaW5nID0gKGxvbmcpNDsKLSAgCi0gICAgICBJbnNhbml0eSBjcmF6eSA9IG5ldyBJbnNhbml0eSgpOwotICAgICAgY3JhenkudXNlck1hcCA9IG5ldyBIYXNoTWFwPE51bWJlcnosIExvbmc+KCk7Ci0gICAgICBjcmF6eS51c2VyTWFwLnB1dChOdW1iZXJ6LkVJR0hULCAobG9uZyk4KTsKLSAgICAgIGNyYXp5LnVzZXJNYXAucHV0KE51bWJlcnouRklWRSwgKGxvbmcpNSk7Ci0gICAgICBjcmF6eS54dHJ1Y3RzID0gbmV3IEFycmF5TGlzdDxYdHJ1Y3Q+KCk7Ci0gICAgICBjcmF6eS54dHJ1Y3RzLmFkZChnb29kYnllKTsKLSAgICAgIGNyYXp5Lnh0cnVjdHMuYWRkKGhlbGxvKTsKLSAgCisKICAgICAgIEhhc2hNYXA8TnVtYmVyeixJbnNhbml0eT4gZmlyc3RfbWFwID0gbmV3IEhhc2hNYXA8TnVtYmVyeiwgSW5zYW5pdHk+KCk7CiAgICAgICBIYXNoTWFwPE51bWJlcnosSW5zYW5pdHk+IHNlY29uZF9tYXAgPSBuZXcgSGFzaE1hcDxOdW1iZXJ6LCBJbnNhbml0eT4oKTs7Ci0gIAotICAgICAgZmlyc3RfbWFwLnB1dChOdW1iZXJ6LlRXTywgY3JhenkpOwotICAgICAgZmlyc3RfbWFwLnB1dChOdW1iZXJ6LlRIUkVFLCBjcmF6eSk7Ci0gIAorCisgICAgICBmaXJzdF9tYXAucHV0KE51bWJlcnouVFdPLCBhcmd1bWVudCk7CisgICAgICBmaXJzdF9tYXAucHV0KE51bWJlcnouVEhSRUUsIGFyZ3VtZW50KTsKKwogICAgICAgSW5zYW5pdHkgbG9vbmV5ID0gbmV3IEluc2FuaXR5KCk7CiAgICAgICBzZWNvbmRfbWFwLnB1dChOdW1iZXJ6LlNJWCwgbG9vbmV5KTsKLSAgCisKICAgICAgIE1hcDxMb25nLE1hcDxOdW1iZXJ6LEluc2FuaXR5Pj4gaW5zYW5lID0KICAgICAgICAgbmV3IEhhc2hNYXA8TG9uZywgTWFwPE51bWJlcnosSW5zYW5pdHk+PigpOwogICAgICAgaW5zYW5lLnB1dCgobG9uZykxLCBmaXJzdF9tYXApOwogICAgICAgaW5zYW5lLnB1dCgobG9uZykyLCBzZWNvbmRfbWFwKTsKLSAgCisKICAgICAgIHJldHVybiBpbnNhbmU7CiAgICAgfQotICAKKwogICAgIHB1YmxpYyBYdHJ1Y3QgdGVzdE11bHRpKGJ5dGUgYXJnMCwgaW50IGFyZzEsIGxvbmcgYXJnMiwgTWFwPFNob3J0LFN0cmluZz4gYXJnMywgTnVtYmVyeiBhcmc0LCBsb25nIGFyZzUpIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RNdWx0aSgpXG4iKTsKLSAgCisKICAgICAgIFh0cnVjdCBoZWxsbyA9IG5ldyBYdHJ1Y3QoKTs7CiAgICAgICBoZWxsby5zdHJpbmdfdGhpbmcgPSAiSGVsbG8yIjsKICAgICAgIGhlbGxvLmJ5dGVfdGhpbmcgPSBhcmcwOwpAQCAtMjQwLDIzICsyMjUsMjQgQEAKICAgICAgIGhlbGxvLmk2NF90aGluZyA9IGFyZzI7CiAgICAgICByZXR1cm4gaGVsbG87CiAgICAgfQotICAKKwogICAgIHB1YmxpYyB2b2lkIHRlc3RFeGNlcHRpb24oU3RyaW5nIGFyZykgdGhyb3dzIFhjZXB0aW9uLCBURXhjZXB0aW9uIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RFeGNlcHRpb24oIithcmcrIilcbiIpOwotICAgICAgaWYgKGFyZy5lcXVhbHMoIlhjZXB0aW9uIikpIHsKKyAgICAgIGlmICgiWGNlcHRpb24iLmVxdWFscyhhcmcpKSB7CiAgICAgICAgIFhjZXB0aW9uIHggPSBuZXcgWGNlcHRpb24oKTsKICAgICAgICAgeC5lcnJvckNvZGUgPSAxMDAxOwogICAgICAgICB4Lm1lc3NhZ2UgPSBhcmc7CiAgICAgICAgIHRocm93IHg7Ci0gICAgICB9IGVsc2UgaWYgKGFyZy5lcXVhbHMoIlRFeGNlcHRpb24iKSkgewotICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbihhcmcpOworICAgICAgfSBlbHNlIGlmICgiVEV4Y2VwdGlvbiIuZXF1YWxzKGFyZykpIHsKKyAgICAgICAgLy8gVW5zcGVjaWZpZWQgZXhjZXB0aW9uIHNob3VsZCB5aWVsZCBhIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBvbiBjbGllbnQgc2lkZQorICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihhcmcpOwogICAgICAgfSBlbHNlIHsKICAgICAgICAgWHRydWN0IHJlc3VsdCA9IG5ldyBYdHJ1Y3QoKTsKICAgICAgICAgcmVzdWx0LnN0cmluZ190aGluZyA9IGFyZzsKICAgICAgIH0KICAgICAgIHJldHVybjsKICAgICB9Ci0gIAorCiAgICAgcHVibGljIFh0cnVjdCB0ZXN0TXVsdGlFeGNlcHRpb24oU3RyaW5nIGFyZzAsIFN0cmluZyBhcmcxKSB0aHJvd3MgWGNlcHRpb24sIFhjZXB0aW9uMiB7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0TXVsdGlFeGNlcHRpb24oIiArIGFyZzAgKyAiLCAiICsgYXJnMSArICIpXG4iKTsKICAgICAgIGlmIChhcmcwLmVxdWFscygiWGNlcHRpb24iKSkgewpAQCAtMjcxLDE3ICsyNTcsMTcgQEAKICAgICAgICAgeC5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nID0gIlRoaXMgaXMgYW4gWGNlcHRpb24yIjsKICAgICAgICAgdGhyb3cgeDsKICAgICAgIH0KLSAgCisKICAgICAgIFh0cnVjdCByZXN1bHQgPSBuZXcgWHRydWN0KCk7CiAgICAgICByZXN1bHQuc3RyaW5nX3RoaW5nID0gYXJnMTsKICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQotICAKKwogICAgIHB1YmxpYyB2b2lkIHRlc3RPbmV3YXkoaW50IHNsZWVwRm9yKSB7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInRlc3RPbmV3YXkoIiArIEludGVnZXIudG9TdHJpbmcoc2xlZXBGb3IpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAiKSA9PiBzbGVlcGluZy4uLiIpOwogICAgICAgdHJ5IHsKLSAgICAgICAgVGhyZWFkLnNsZWVwKHNsZWVwRm9yICogMTAwMCk7CisgICAgICAgIFRocmVhZC5zbGVlcChzbGVlcEZvciAqIFNMRUVQX0RFTEFZKTsKICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJEb25lIHNsZWVwaW5nISIpOwogICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaWUpOwpAQCAtMjk2LDcgKzI4Miw4IEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhPU1QgPSAibG9jYWxob3N0IjsKICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUE9SVCA9IEludGVnZXIudmFsdWVPZigKICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoInRlc3QucG9ydCIsICI5MDkwIikpOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBTT0NLRVRfVElNRU9VVCA9IDEwMDA7CisgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFNMRUVQX0RFTEFZID0gMTAwMDsKKyAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgU09DS0VUX1RJTUVPVVQgPSAxNTAwOwogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBYdHJ1Y3QgWFNUUlVDVCA9IG5ldyBYdHJ1Y3QoIlplcm8iLCAoYnl0ZSkgMSwgLTMsIC01KTsKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgWHRydWN0MiBYU1RSVUNUMiA9IG5ldyBYdHJ1Y3QyKChieXRlKTEsIFhTVFJVQ1QsIDUpOwogCkBAIC0zNDgsNyArMzM1LDcgQEAKICAgLy8gdG9kbzogYWRkIGFzc2VydGlvbnMKICAgcHJpdmF0ZSB2b2lkIHRlc3RJbnNhbml0eShUaHJpZnRUZXN0LkNsaWVudCB0ZXN0Q2xpZW50KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgSW5zYW5pdHkgaW5zYW5lOwotICAKKwogICAgIGluc2FuZSA9IG5ldyBJbnNhbml0eSgpOwogICAgIGluc2FuZS51c2VyTWFwID0gbmV3IEhhc2hNYXA8TnVtYmVyeiwgTG9uZz4oKTsKICAgICBpbnNhbmUudXNlck1hcC5wdXQoTnVtYmVyei5GSVZFLCAobG9uZyk1MDAwKTsKQEAgLTM2Niw3ICszNTMsNyBAQAogICAgIGZvciAobG9uZyBrZXkgOiB3aG9hLmtleVNldCgpKSB7CiAgICAgICBNYXA8TnVtYmVyeixJbnNhbml0eT4gdmFsID0gd2hvYS5nZXQoa2V5KTsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoa2V5ICsgIiA9PiB7Iik7Ci0gIAorCiAgICAgICBmb3IgKE51bWJlcnogazIgOiB2YWwua2V5U2V0KCkpIHsKICAgICAgICAgSW5zYW5pdHkgdjIgPSB2YWwuZ2V0KGsyKTsKICAgICAgICAgU3lzdGVtLm91dC5wcmludChrMiArICIgPT4geyIpOwpAQCAtMzc4LDcgKzM2NSw3IEBACiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn0sICIpOwotICAKKwogICAgICAgICBMaXN0PFh0cnVjdD4geHRydWN0cyA9IHYyLnh0cnVjdHM7CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInsiKTsKICAgICAgICAgaWYgKHh0cnVjdHMgIT0gbnVsbCkgewpAQCAtMzg3LDcgKzM3NCw3IEBACiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn0iKTsKLSAgCisKICAgICAgICAgU3lzdGVtLm91dC5wcmludCgifSwgIik7CiAgICAgICB9CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9LCAiKTsKQEAgLTQwMiw3ICszODksNyBAQAogICBwdWJsaWMgdm9pZCB0ZXN0SXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogICAgIGZvciAoVFByb3RvY29sRmFjdG9yeSBwcm90b0ZhY3RvcnkgOiBnZXRQcm90b2NvbHMoKSkgewotICAgICAgVFByb2Nlc3NvciBwcm9jZXNzb3IgPSB1c2VBc3luY1Byb2Nlc3NvcigpID8gbmV3IFRocmlmdFRlc3QuQXN5bmNQcm9jZXNzb3IobmV3IEFzeW5jVGVzdEhhbmRsZXIoKSkgOiBuZXcgVGhyaWZ0VGVzdC5Qcm9jZXNzb3IobmV3IFRlc3RIYW5kbGVyKCkpOworICAgICAgVFByb2Nlc3NvciBwcm9jZXNzb3IgPSB1c2VBc3luY1Byb2Nlc3NvcigpID8gbmV3IFRocmlmdFRlc3QuQXN5bmNQcm9jZXNzb3I8QXN5bmNUZXN0SGFuZGxlcj4obmV3IEFzeW5jVGVzdEhhbmRsZXIoKSkgOiBuZXcgVGhyaWZ0VGVzdC5Qcm9jZXNzb3I8VGVzdEhhbmRsZXI+KG5ldyBUZXN0SGFuZGxlcigpKTsKIAogICAgICAgc3RhcnRTZXJ2ZXIocHJvY2Vzc29yLCBwcm90b0ZhY3RvcnkpOwogCkBAIC00MzEsOSArNDE4LDExIEBACiAgICAgICB0ZXN0VHlwZWRlZih0ZXN0Q2xpZW50KTsKICAgICAgIHRlc3ROZXN0ZWRNYXAodGVzdENsaWVudCk7CiAgICAgICB0ZXN0SW5zYW5pdHkodGVzdENsaWVudCk7Ci0gICAgICB0ZXN0T25ld2F5KHRlc3RDbGllbnQpOwogICAgICAgdGVzdEV4Y2VwdGlvbih0ZXN0Q2xpZW50KTsKKyAgICAgIHRlc3RPbmV3YXkodGVzdENsaWVudCk7CisgICAgICB0ZXN0STMyKHRlc3RDbGllbnQpOwogICAgICAgdHJhbnNwb3J0LmNsb3NlKCk7CisgICAgICBzb2NrZXQuY2xvc2UoKTsKIAogICAgICAgc3RvcFNlcnZlcigpOwogICAgIH0KQEAgLTQ0NCw3ICs0MzMsNyBAQAogICB9CiAKICAgcHVibGljIExpc3Q8VFByb3RvY29sRmFjdG9yeT4gZ2V0UHJvdG9jb2xzKCkgewotICAgIHJldHVybiBQUk9UT0NPTFM7ICAKKyAgICByZXR1cm4gUFJPVE9DT0xTOwogICB9CiAKICAgcHJpdmF0ZSB2b2lkIHRlc3RMaXN0KFRocmlmdFRlc3QuQ2xpZW50IHRlc3RDbGllbnQpIHRocm93cyBURXhjZXB0aW9uIHsKQEAgLTQ4MCwxNCArNDY5LDE0IEBACiAgICAgICB0ZXN0Q2xpZW50LnRlc3RNYXBNYXAoMSk7CiAgICAgTWFwPEludGVnZXIsTWFwPEludGVnZXIsSW50ZWdlcj4+IG1hcG1hcCA9CiAgICAgICBuZXcgSGFzaE1hcDxJbnRlZ2VyLE1hcDxJbnRlZ2VyLEludGVnZXI+PigpOwotICAKKwogICAgIEhhc2hNYXA8SW50ZWdlcixJbnRlZ2VyPiBwb3MgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLEludGVnZXI+KCk7CiAgICAgSGFzaE1hcDxJbnRlZ2VyLEludGVnZXI+IG5lZyA9IG5ldyBIYXNoTWFwPEludGVnZXIsSW50ZWdlcj4oKTsKICAgICBmb3IgKGludCBpID0gMTsgaSA8IDU7IGkrKykgewogICAgICAgcG9zLnB1dChpLCBpKTsKICAgICAgIG5lZy5wdXQoLWksIC1pKTsKICAgICB9Ci0gIAorCiAgICAgbWFwbWFwLnB1dCg0LCBwb3MpOwogICAgIG1hcG1hcC5wdXQoLTQsIG5lZyk7CiAgICAgYXNzZXJ0RXF1YWxzKG1hcG1hcCwgbW0pOwpAQCAtNDk5LDcgKzQ4OCwxMCBAQAogICB9CiAKICAgcHJpdmF0ZSB2b2lkIHRlc3RPbmV3YXkoVGhyaWZ0VGVzdC5DbGllbnQgdGVzdENsaWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgdGVzdENsaWVudC50ZXN0T25ld2F5KDMpOworICAgIGxvbmcgYmVnaW4gPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICB0ZXN0Q2xpZW50LnRlc3RPbmV3YXkoMSk7CisgICAgbG9uZyBlbGFwc2VkID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBiZWdpbjsKKyAgICBhc3NlcnRUcnVlKGVsYXBzZWQgPCA1MDApOwogICB9CiAKICAgcHJpdmF0ZSB2b2lkIHRlc3RTZXQoVGhyaWZ0VGVzdC5DbGllbnQgdGVzdENsaWVudCkgdGhyb3dzIFRFeGNlcHRpb24gewpAQCAtNTQ0LDE2MyArNTM2LDE3NiBAQAogICB9CiAKICAgcHVibGljIHZvaWQgdGVzdFRyYW5zcG9ydEZhY3RvcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAKICAgICBmb3IgKFRQcm90b2NvbEZhY3RvcnkgcHJvdG9GYWN0b3J5IDogZ2V0UHJvdG9jb2xzKCkpIHsKICAgICAgIFRlc3RIYW5kbGVyIGhhbmRsZXIgPSBuZXcgVGVzdEhhbmRsZXIoKTsKLSAgICAgIFRocmlmdFRlc3QuUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBUaHJpZnRUZXN0LlByb2Nlc3NvcihoYW5kbGVyKTsKLSAgCisgICAgICBUaHJpZnRUZXN0LlByb2Nlc3NvcjxUZXN0SGFuZGxlcj4gcHJvY2Vzc29yID0gbmV3IFRocmlmdFRlc3QuUHJvY2Vzc29yPFRlc3RIYW5kbGVyPihoYW5kbGVyKTsKKwogICAgICAgZmluYWwgQ2FsbENvdW50aW5nVHJhbnNwb3J0RmFjdG9yeSBmYWN0b3J5ID0gbmV3IENhbGxDb3VudGluZ1RyYW5zcG9ydEZhY3RvcnkobmV3IFRGcmFtZWRUcmFuc3BvcnQuRmFjdG9yeSgpKTsKLSAgCisKICAgICAgIHN0YXJ0U2VydmVyKHByb2Nlc3NvciwgcHJvdG9GYWN0b3J5LCBmYWN0b3J5KTsKICAgICAgIGFzc2VydEVxdWFscygwLCBmYWN0b3J5LmNvdW50KTsKLSAgCisKICAgICAgIFRTb2NrZXQgc29ja2V0ID0gbmV3IFRTb2NrZXQoSE9TVCwgUE9SVCk7CiAgICAgICBzb2NrZXQuc2V0VGltZW91dChTT0NLRVRfVElNRU9VVCk7CiAgICAgICBUVHJhbnNwb3J0IHRyYW5zcG9ydCA9IGdldENsaWVudFRyYW5zcG9ydChzb2NrZXQpOwogICAgICAgb3Blbih0cmFuc3BvcnQpOwotICAKKwogICAgICAgVFByb3RvY29sIHByb3RvY29sID0gcHJvdG9GYWN0b3J5LmdldFByb3RvY29sKHRyYW5zcG9ydCk7CiAgICAgICBUaHJpZnRUZXN0LkNsaWVudCB0ZXN0Q2xpZW50ID0gbmV3IFRocmlmdFRlc3QuQ2xpZW50KHByb3RvY29sKTsKICAgICAgIGFzc2VydEVxdWFscygwLCB0ZXN0Q2xpZW50LnRlc3RCeXRlKChieXRlKSAwKSk7CiAgICAgICBhc3NlcnRFcXVhbHMoMiwgZmFjdG9yeS5jb3VudCk7CisgICAgICBzb2NrZXQuY2xvc2UoKTsKICAgICAgIHN0b3BTZXJ2ZXIoKTsKICAgICB9CiAgIH0KIAogICBwcml2YXRlIHZvaWQgdGVzdEV4Y2VwdGlvbihUaHJpZnRUZXN0LkNsaWVudCB0ZXN0Q2xpZW50KSB0aHJvd3MgVEV4Y2VwdGlvbiwgWGNlcHRpb24gewotICAgIC8vQFRPRE8gdGVzdEV4Y2VwdGlvbgotICAgIC8vdGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKCJubyBFeGNlcHRpb24iKTsKLSAgICAvKnRyeSB7Ci0gICAgICAgIHRlc3RDbGllbnQudGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iKTsKKyAgICB0cnkgeworICAgICAgdGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKCJYY2VwdGlvbiIpOworICAgICAgYXNzZXJ0IGZhbHNlOwogICAgIH0gY2F0Y2goWGNlcHRpb24gZSkgewotICAgIAlhc3NlcnRFcXVhbHMoZS5tZXNzYWdlLCAiWGNlcHRpb24iKTsKLSAgICB9Ki8KLSAgICAvKnRyeSB7Ci0gICAgICAgIHRlc3RDbGllbnQudGVzdEV4Y2VwdGlvbigiQXBwbGljYXRpb25FeGNlcHRpb24iKTsKKyAgICAgIGFzc2VydEVxdWFscyhlLm1lc3NhZ2UsICJYY2VwdGlvbiIpOworICAgICAgYXNzZXJ0RXF1YWxzKGUuZXJyb3JDb2RlLCAxMDAxKTsKKyAgICB9CisgICAgdHJ5IHsKKyAgICAgIHRlc3RDbGllbnQudGVzdEV4Y2VwdGlvbigiVEV4Y2VwdGlvbiIpOworICAgICAgYXNzZXJ0IGZhbHNlOwogICAgIH0gY2F0Y2goVEV4Y2VwdGlvbiBlKSB7Ci0gICAgCWFzc2VydEVxdWFscyhlLm1lc3NhZ2UsICJBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpOwotICAgIH0qLworICAgIH0KKyAgICB0ZXN0Q2xpZW50LnRlc3RFeGNlcHRpb24oIm5vIEV4Y2VwdGlvbiIpOwogICB9CiAKIAotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQXN5bmNUZXN0SGFuZGxlciBpbXBsZW1lbnRzIFRocmlmdFRlc3QuQXN5bmNJZmFjZSB7CisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQXN5bmNUZXN0SGFuZGxlciBpbXBsZW1lbnRzIFRocmlmdFRlc3QuQXN5bmNJZmFjZSB7CiAKLSAgICAgICAgVGVzdEhhbmRsZXIgaGFuZGxlciA9IG5ldyBUZXN0SGFuZGxlcigpOworICAgIFRlc3RIYW5kbGVyIGhhbmRsZXIgPSBuZXcgVGVzdEhhbmRsZXIoKTsKIAotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgdGVzdFZvaWQoQXN5bmNNZXRob2RDYWxsYmFjayByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUobnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgdGVzdFN0cmluZyhTdHJpbmcgdGhpbmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2sgcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24gewotICAgICAgICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdFN0cmluZyh0aGluZykpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlc3RCb29sKGJvb2xlYW4gdGhpbmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2sgcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24gewotICAgICAgICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdEJvb2wodGhpbmcpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0Qnl0ZShieXRlIHRoaW5nLCBBc3luY01ldGhvZENhbGxiYWNrIHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3RCeXRlKHRoaW5nKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgdGVzdEkzMihpbnQgdGhpbmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2sgcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24gewotICAgICAgICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdEkzMih0aGluZykpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlc3RJNjQobG9uZyB0aGluZywgQXN5bmNNZXRob2RDYWxsYmFjayByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0STY0KHRoaW5nKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgdGVzdERvdWJsZShkb3VibGUgdGhpbmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2sgcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24gewotICAgICAgICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdERvdWJsZSh0aGluZykpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlIAotICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0QmluYXJ5KEJ5dGVCdWZmZXIgdGhpbmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2sgcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24gewotICAgICAgICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdEJpbmFyeSh0aGluZykpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJ1Y3QoWHRydWN0IHRoaW5nLCBBc3luY01ldGhvZENhbGxiYWNrIHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3RTdHJ1Y3QodGhpbmcpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0TmVzdChYdHJ1Y3QyIHRoaW5nLCBBc3luY01ldGhvZENhbGxiYWNrIHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3ROZXN0KHRoaW5nKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgdGVzdE1hcChNYXA8SW50ZWdlciwgSW50ZWdlcj4gdGhpbmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2sgcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24gewotICAgICAgICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdE1hcCh0aGluZykpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdNYXAoTWFwPFN0cmluZywgU3RyaW5nPiB0aGluZywgQXN5bmNNZXRob2RDYWxsYmFjayByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0U3RyaW5nTWFwKHRoaW5nKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgdGVzdFNldChTZXQ8SW50ZWdlcj4gdGhpbmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2sgcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24gewotICAgICAgICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdFNldCh0aGluZykpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlc3RMaXN0KExpc3Q8SW50ZWdlcj4gdGhpbmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2sgcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24gewotICAgICAgICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdExpc3QodGhpbmcpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0RW51bShOdW1iZXJ6IHRoaW5nLCBBc3luY01ldGhvZENhbGxiYWNrIHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3RFbnVtKHRoaW5nKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgdGVzdFR5cGVkZWYobG9uZyB0aGluZywgQXN5bmNNZXRob2RDYWxsYmFjayByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0VHlwZWRlZih0aGluZykpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlc3RNYXBNYXAoaW50IGhlbGxvLCBBc3luY01ldGhvZENhbGxiYWNrIHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3RNYXBNYXAoaGVsbG8pKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zYW5pdHkoSW5zYW5pdHkgYXJndW1lbnQsIEFzeW5jTWV0aG9kQ2FsbGJhY2sgcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24gewotICAgICAgICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdEluc2FuaXR5KGFyZ3VtZW50KSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgdGVzdE11bHRpKGJ5dGUgYXJnMCwgaW50IGFyZzEsIGxvbmcgYXJnMiwgTWFwPFNob3J0LCBTdHJpbmc+IGFyZzMsIE51bWJlcnogYXJnNCwgbG9uZyBhcmc1LCBBc3luY01ldGhvZENhbGxiYWNrIHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3RNdWx0aShhcmcwLGFyZzEsYXJnMixhcmczLGFyZzQsYXJnNSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlc3RFeGNlcHRpb24oU3RyaW5nIGFyZywgQXN5bmNNZXRob2RDYWxsYmFjayByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgLy8gaGFuZGxlci50ZXN0RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgdGVzdE11bHRpRXhjZXB0aW9uKFN0cmluZyBhcmcwLCBTdHJpbmcgYXJnMSwgQXN5bmNNZXRob2RDYWxsYmFjayByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAvL1RvIGNoYW5nZSBib2R5IG9mIGltcGxlbWVudGVkIG1ldGhvZHMgdXNlIEZpbGUgfCBTZXR0aW5ncyB8IEZpbGUgVGVtcGxhdGVzLgotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHRlc3RPbmV3YXkoaW50IHNlY29uZHNUb1NsZWVwLCBBc3luY01ldGhvZENhbGxiYWNrIHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGhhbmRsZXIudGVzdE9uZXdheShzZWNvbmRzVG9TbGVlcCk7Ci0gICAgICAgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUobnVsbCk7Ci0gICAgICAgIH0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Vm9pZChBc3luY01ldGhvZENhbGxiYWNrPFZvaWQ+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShudWxsKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nKFN0cmluZyB0aGluZywgQXN5bmNNZXRob2RDYWxsYmFjazxTdHJpbmc+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3RTdHJpbmcodGhpbmcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Qm9vbChib29sZWFuIHRoaW5nLCBBc3luY01ldGhvZENhbGxiYWNrPEJvb2xlYW4+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3RCb29sKHRoaW5nKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdEJ5dGUoYnl0ZSB0aGluZywgQXN5bmNNZXRob2RDYWxsYmFjazxCeXRlPiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0Qnl0ZSh0aGluZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RJMzIoaW50IHRoaW5nLCBBc3luY01ldGhvZENhbGxiYWNrPEludGVnZXI+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3RJMzIodGhpbmcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0STY0KGxvbmcgdGhpbmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2s8TG9uZz4gcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdEk2NCh0aGluZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3REb3VibGUoZG91YmxlIHRoaW5nLCBBc3luY01ldGhvZENhbGxiYWNrPERvdWJsZT4gcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdERvdWJsZSh0aGluZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RCaW5hcnkoQnl0ZUJ1ZmZlciB0aGluZywgQXN5bmNNZXRob2RDYWxsYmFjazxCeXRlQnVmZmVyPiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0QmluYXJ5KHRoaW5nKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdFN0cnVjdChYdHJ1Y3QgdGhpbmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2s8WHRydWN0PiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0U3RydWN0KHRoaW5nKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdE5lc3QoWHRydWN0MiB0aGluZywgQXN5bmNNZXRob2RDYWxsYmFjazxYdHJ1Y3QyPiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0TmVzdCh0aGluZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RNYXAoTWFwPEludGVnZXIsIEludGVnZXI+IHRoaW5nLCBBc3luY01ldGhvZENhbGxiYWNrPE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPj4gcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdE1hcCh0aGluZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdNYXAoTWFwPFN0cmluZywgU3RyaW5nPiB0aGluZywgQXN5bmNNZXRob2RDYWxsYmFjazxNYXA8U3RyaW5nLCBTdHJpbmc+PiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0U3RyaW5nTWFwKHRoaW5nKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdFNldChTZXQ8SW50ZWdlcj4gdGhpbmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2s8U2V0PEludGVnZXI+PiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0U2V0KHRoaW5nKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdExpc3QoTGlzdDxJbnRlZ2VyPiB0aGluZywgQXN5bmNNZXRob2RDYWxsYmFjazxMaXN0PEludGVnZXI+PiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0TGlzdCh0aGluZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RFbnVtKE51bWJlcnogdGhpbmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2s8TnVtYmVyej4gcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdEVudW0odGhpbmcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHlwZWRlZihsb25nIHRoaW5nLCBBc3luY01ldGhvZENhbGxiYWNrPExvbmc+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3RUeXBlZGVmKHRoaW5nKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdE1hcE1hcChpbnQgaGVsbG8sIEFzeW5jTWV0aG9kQ2FsbGJhY2s8TWFwPEludGVnZXIsTWFwPEludGVnZXIsSW50ZWdlcj4+PiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0TWFwTWFwKGhlbGxvKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdEluc2FuaXR5KEluc2FuaXR5IGFyZ3VtZW50LCBBc3luY01ldGhvZENhbGxiYWNrPE1hcDxMb25nLCBNYXA8TnVtYmVyeixJbnNhbml0eT4+PiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0SW5zYW5pdHkoYXJndW1lbnQpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGkoYnl0ZSBhcmcwLCBpbnQgYXJnMSwgbG9uZyBhcmcyLCBNYXA8U2hvcnQsIFN0cmluZz4gYXJnMywgTnVtYmVyeiBhcmc0LCBsb25nIGFyZzUsIEFzeW5jTWV0aG9kQ2FsbGJhY2s8WHRydWN0PiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0TXVsdGkoYXJnMCxhcmcxLGFyZzIsYXJnMyxhcmc0LGFyZzUpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhjZXB0aW9uKFN0cmluZyBhcmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2s8Vm9pZD4gcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdEV4Y2VwdGlvbigiK2FyZysiKVxuIik7CisgICAgICBpZiAoIlhjZXB0aW9uIi5lcXVhbHMoYXJnKSkgeworICAgICAgICBYY2VwdGlvbiB4ID0gbmV3IFhjZXB0aW9uKCk7CisgICAgICAgIHguZXJyb3JDb2RlID0gMTAwMTsKKyAgICAgICAgeC5tZXNzYWdlID0gYXJnOworICAgICAgICAvLyB0aHJvdyBhbmQgb25FcnJvciB5aWVsZCB0aGUgc2FtZSByZXN1bHQuCisgICAgICAgIC8vIHRocm93IHg7CisgICAgICAgIHJlc3VsdEhhbmRsZXIub25FcnJvcih4KTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfSBlbHNlIGlmICgiVEV4Y2VwdGlvbiIuZXF1YWxzKGFyZykpIHsKKyAgICAgICAgLy8gdGhyb3cgYW5kIG9uRXJyb3IgeWllbGQgdGhlIHNhbWUgcmVzdWx0LgorICAgICAgICAvLyByZXN1bHRIYW5kbGVyLm9uRXJyb3IobmV3IFRFeGNlcHRpb24oYXJnKSk7CisgICAgICAgIC8vIHJldHVybjsKKyAgICAgICAgLy8gVW5zcGVjaWZpZWQgZXhjZXB0aW9uIHNob3VsZCB5aWVsZCBhIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBvbiBjbGllbnQgc2lkZQorICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihhcmcpOworICAgICAgfQorICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aUV4Y2VwdGlvbihTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEsIEFzeW5jTWV0aG9kQ2FsbGJhY2s8WHRydWN0PiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAvL1RvIGNoYW5nZSBib2R5IG9mIGltcGxlbWVudGVkIG1ldGhvZHMgdXNlIEZpbGUgfCBTZXR0aW5ncyB8IEZpbGUgVGVtcGxhdGVzLgorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RPbmV3YXkoaW50IHNlY29uZHNUb1NsZWVwLCBBc3luY01ldGhvZENhbGxiYWNrPFZvaWQ+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIGhhbmRsZXIudGVzdE9uZXdheShzZWNvbmRzVG9TbGVlcCk7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUobnVsbCk7CisgICAgfQorICB9CisKIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdGVzdC9UZXN0Q2xpZW50LmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Rlc3QvVGVzdENsaWVudC5qYXZhCmluZGV4IGI1NDQ2MWUuLmZlYWE5NzIgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdGVzdC9UZXN0Q2xpZW50LmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90ZXN0L1Rlc3RDbGllbnQuamF2YQpAQCAtMTksMzIgKzE5LDQwIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudGVzdDsKIAotLy8gR2VuZXJhdGVkIGNvZGUKLWltcG9ydCB0aHJpZnQudGVzdC4qOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UU2VyaWFsaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFNvY2tldDsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVEh0dHBDbGllbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRGcmFtZWRUcmFuc3BvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRGYXN0RnJhbWVkVHJhbnNwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UU1NMVHJhbnNwb3J0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFNTTFRyYW5zcG9ydEZhY3RvcnkuVFNTTFRyYW5zcG9ydFBhcmFtZXRlcnM7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEJpbmFyeVByb3RvY29sOwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbDsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5USlNPTlByb3RvY29sOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRDb21wYWN0UHJvdG9jb2w7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEpTT05Qcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTXVsdGlwbGV4ZWRQcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2w7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFNpbXBsZUpTT05Qcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVEZhc3RGcmFtZWRUcmFuc3BvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRGcmFtZWRUcmFuc3BvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRIdHRwQ2xpZW50OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UU1NMVHJhbnNwb3J0RmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFNvY2tldDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbjsKIAotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworLy8gR2VuZXJhdGVkIGNvZGUKK2ltcG9ydCB0aHJpZnQudGVzdC5JbnNhbml0eTsKK2ltcG9ydCB0aHJpZnQudGVzdC5OdW1iZXJ6OworaW1wb3J0IHRocmlmdC50ZXN0LlNlY29uZFNlcnZpY2U7CitpbXBvcnQgdGhyaWZ0LnRlc3QuVGhyaWZ0VGVzdDsKK2ltcG9ydCB0aHJpZnQudGVzdC5YY2VwdGlvbjsKK2ltcG9ydCB0aHJpZnQudGVzdC5YY2VwdGlvbjI7CitpbXBvcnQgdGhyaWZ0LnRlc3QuWHRydWN0OworaW1wb3J0IHRocmlmdC50ZXN0Llh0cnVjdDI7CiAKIC8qKgogICogVGVzdCBKYXZhIGNsaWVudCBmb3IgdGhyaWZ0LiBFc3NlbnRpYWxseSBqdXN0IGEgY29weSBvZiB0aGUgQysrIHZlcnNpb24sCkBAIC01Myw2ICs2MSwxNCBAQAogICoKICAqLwogcHVibGljIGNsYXNzIFRlc3RDbGllbnQgeworCisgIHByaXZhdGUgc3RhdGljIGludCBFUlJfQkFTRVRZUEVTID0gMTsKKyAgcHJpdmF0ZSBzdGF0aWMgaW50IEVSUl9TVFJVQ1RTID0gMjsKKyAgcHJpdmF0ZSBzdGF0aWMgaW50IEVSUl9DT05UQUlORVJTID0gNDsKKyAgcHJpdmF0ZSBzdGF0aWMgaW50IEVSUl9FWENFUFRJT05TID0gODsKKyAgcHJpdmF0ZSBzdGF0aWMgaW50IEVSUl9QUk9UT0NPTFMgPSAxNjsKKyAgcHJpdmF0ZSBzdGF0aWMgaW50IEVSUl9VTktOT1dOID0gNjQ7CisKICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKICAgICBTdHJpbmcgaG9zdCA9ICJsb2NhbGhvc3QiOwogICAgIGludCBwb3J0ID0gOTA5MDsKQEAgLTY5LDggKzg1LDggQEAKICAgICAgICAgICBob3N0ID0gYXJnc1tpXS5zcGxpdCgiPSIpWzFdOwogICAgICAgICAgIGhvc3QudHJpbSgpOwogICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uc3RhcnRzV2l0aCgiLS1wb3J0IikpIHsKLSAgICAgICAgICBwb3J0ID0gSW50ZWdlci52YWx1ZU9mKGFyZ3NbaV0uc3BsaXQoIj0iKVsxXSk7IAotICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uc3RhcnRzV2l0aCgiLS1uIikgfHwgCisgICAgICAgICAgcG9ydCA9IEludGVnZXIudmFsdWVPZihhcmdzW2ldLnNwbGl0KCI9IilbMV0pOworICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uc3RhcnRzV2l0aCgiLS1uIikgfHwKICAgICAgICAgICAgIGFyZ3NbaV0uc3RhcnRzV2l0aCgiLS10ZXN0bG9vcHMiKSl7CiAgICAgICAgICAgbnVtVGVzdHMgPSBJbnRlZ2VyLnZhbHVlT2YoYXJnc1tpXS5zcGxpdCgiPSIpWzFdKTsKICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLS10aW1lb3V0IikpIHsKQEAgLTg1LDExICsxMDEsMTEgQEAKICAgICAgICAgICBzc2wgPSB0cnVlOwogICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItLWhlbHAiKSkgewogICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQWxsb3dlZCBvcHRpb25zOiIpOwotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtLWhlbHBcdFx0XHRQcm9kdWNlIGhlbHAgbWVzc2FnZSIpOyAKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLS1oZWxwXHRcdFx0UHJvZHVjZSBoZWxwIG1lc3NhZ2UiKTsKICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLS1ob3N0PWFyZyAoPSIgKyBob3N0ICsgIilcdEhvc3QgdG8gY29ubmVjdCIpOwogICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtLXBvcnQ9YXJnICg9IiArIHBvcnQgKyAiKVx0UG9ydCBudW1iZXIgdG8gY29ubmVjdCIpOwogICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtLXRyYW5zcG9ydD1hcmcgKD0iICsgdHJhbnNwb3J0X3R5cGUgKyAiKVxuXHRcdFx0XHRUcmFuc3BvcnQ6IGJ1ZmZlcmVkLCBmcmFtZWQsIGZhc3RmcmFtZWQsIGh0dHAiKTsKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLS1wcm90b2NvbD1hcmcgKD0iICsgcHJvdG9jb2xfdHlwZSArICIpXHRQcm90b2NvbDogYmluYXJ5LCBqc29uLCBjb21wYWN0Iik7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC0tcHJvdG9jb2w9YXJnICg9IiArIHByb3RvY29sX3R5cGUgKyAiKVx0UHJvdG9jb2w6IGJpbmFyeSwgY29tcGFjdCwganNvbiwgbXVsdGksIG11bHRpYywgbXVsdGlqIik7CiAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC0tc3NsXHRcdFx0RW5jcnlwdGVkIFRyYW5zcG9ydCB1c2luZyBTU0wiKTsKICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLS10ZXN0bG9vcHNbLS1uXT1hcmcgKD0iICsgbnVtVGVzdHMgKyAiKVx0TnVtYmVyIG9mIFRlc3RzIik7CiAgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7CkBAIC05NywxNSArMTEzLDE4IEBACiAgICAgICB9CiAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHgpIHsKICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiQ2FuIG5vdCBwYXJzZSBhcmd1bWVudHMhIFNlZSAtLWhlbHAiKTsKLSAgICAgIFN5c3RlbS5leGl0KDEpOworICAgICAgU3lzdGVtLmV4aXQoRVJSX1VOS05PV04pOwogICAgIH0KIAogICAgIHRyeSB7CiAgICAgICBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoImJpbmFyeSIpKSB7CiAgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUuZXF1YWxzKCJjb21wYWN0IikpIHsKICAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoImpzb24iKSkgeworICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlLmVxdWFscygibXVsdGkiKSkgeworICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlLmVxdWFscygibXVsdGljIikpIHsKKyAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoIm11bHRpaiIpKSB7CiAgICAgICB9IGVsc2UgewotICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJVbmtub3duIHByb3RvY29sIHR5cGUhICIgKyBwcm90b2NvbF90eXBlKTsgCisgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlVua25vd24gcHJvdG9jb2wgdHlwZSEgIiArIHByb3RvY29sX3R5cGUpOwogICAgICAgfQogICAgICAgaWYgKHRyYW5zcG9ydF90eXBlLmVxdWFscygiYnVmZmVyZWQiKSkgewogICAgICAgfSBlbHNlIGlmICh0cmFuc3BvcnRfdHlwZS5lcXVhbHMoImZyYW1lZCIpKSB7CkBAIC0xMTksNyArMTM4LDcgQEAKICAgICAgIH0KICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJFcnJvcjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgIFN5c3RlbS5leGl0KDEpOworICAgICAgU3lzdGVtLmV4aXQoRVJSX1VOS05PV04pOwogICAgIH0KIAogICAgIFRUcmFuc3BvcnQgdHJhbnNwb3J0ID0gbnVsbDsKQEAgLTE0NiwyNyArMTY1LDMyIEBACiAgICAgICB9CiAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHgpIHsKICAgICAgIHgucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICBTeXN0ZW0uZXhpdCgxKTsKKyAgICAgIFN5c3RlbS5leGl0KEVSUl9VTktOT1dOKTsKICAgICB9CiAKICAgICBUUHJvdG9jb2wgdFByb3RvY29sID0gbnVsbDsKLSAgICBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoImpzb24iKSkgeworICAgIFRQcm90b2NvbCB0UHJvdG9jb2wyID0gbnVsbDsKKyAgICBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoImpzb24iKSB8fCBwcm90b2NvbF90eXBlLmVxdWFscygibXVsdGlqIikpIHsKICAgICAgIHRQcm90b2NvbCA9IG5ldyBUSlNPTlByb3RvY29sKHRyYW5zcG9ydCk7Ci0gICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlLmVxdWFscygiY29tcGFjdCIpKSB7CisgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlLmVxdWFscygiY29tcGFjdCIpIHx8IHByb3RvY29sX3R5cGUuZXF1YWxzKCJtdWx0aWMiKSkgewogICAgICAgdFByb3RvY29sID0gbmV3IFRDb21wYWN0UHJvdG9jb2wodHJhbnNwb3J0KTsKICAgICB9IGVsc2UgewogICAgICAgdFByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpOwogICAgIH0KIAotICAgIFRocmlmdFRlc3QuQ2xpZW50IHRlc3RDbGllbnQgPQotICAgICAgbmV3IFRocmlmdFRlc3QuQ2xpZW50KHRQcm90b2NvbCk7CisgICAgaWYgKHByb3RvY29sX3R5cGUuc3RhcnRzV2l0aCgibXVsdGkiKSkgeworICAgICAgdFByb3RvY29sMiA9IG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbCh0UHJvdG9jb2wsICJTZWNvbmRTZXJ2aWNlIik7CisgICAgICB0UHJvdG9jb2wgPSBuZXcgVE11bHRpcGxleGVkUHJvdG9jb2wodFByb3RvY29sLCAiVGhyaWZ0VGVzdCIpOworICAgIH0KKworICAgIFRocmlmdFRlc3QuQ2xpZW50IHRlc3RDbGllbnQgPSBuZXcgVGhyaWZ0VGVzdC5DbGllbnQodFByb3RvY29sKTsKICAgICBJbnNhbml0eSBpbnNhbmUgPSBuZXcgSW5zYW5pdHkoKTsKIAogICAgIGxvbmcgdGltZU1pbiA9IDA7CiAgICAgbG9uZyB0aW1lTWF4ID0gMDsKICAgICBsb25nIHRpbWVUb3QgPSAwOwogCi0gICAgaW50IGZhaWxDb3VudCA9IDA7CisgICAgaW50IHJldHVybkNvZGUgPSAwOwogICAgIGZvciAoaW50IHRlc3QgPSAwOyB0ZXN0IDwgbnVtVGVzdHM7ICsrdGVzdCkgewogICAgICAgdHJ5IHsKICAgICAgICAgLyoqCkBAIC0xODAsNyArMjA0LDcgQEAKICAgICAgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkgewogICAgICAgICAgICAgdHR4LnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDb25uZWN0IGZhaWxlZDogIiArIHR0eC5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgICAgICBTeXN0ZW0uZXhpdChFUlJfVU5LTk9XTik7CiAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTE5NSw3ICsyMTksNyBAQAogICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiA9IHZvaWRcbiIpOwogICAgICAgICB9IGNhdGNoIChUQXBwbGljYXRpb25FeGNlcHRpb24gdGF4KSB7CiAgICAgICAgICAgdGF4LnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgIGZhaWxDb3VudCsrOworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0JBU0VUWVBFUzsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgpAQCAtMjA1LDE5ICsyMjksMzIgQEAKICAgICAgICAgU3RyaW5nIHMgPSB0ZXN0Q2xpZW50LnRlc3RTdHJpbmcoIlRlc3QiKTsKICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0gXCIiICsgcyArICJcIlxuIik7CiAgICAgICAgIGlmICghcy5lcXVhbHMoIlRlc3QiKSkgewotICAgICAgICAgIGZhaWxDb3VudCsrOwotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRkFJTFVSRVxuIik7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfQkFTRVRZUEVTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBNdWx0aXBsZXhlZCB0ZXN0CisgICAgICAgICAqLworICAgICAgICBpZiAocHJvdG9jb2xfdHlwZS5zdGFydHNXaXRoKCJtdWx0aSIpKSB7CisgICAgICAgICAgU2Vjb25kU2VydmljZS5DbGllbnQgc2Vjb25kQ2xpZW50ID0gbmV3IFNlY29uZFNlcnZpY2UuQ2xpZW50KHRQcm90b2NvbDIpOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInNlY29uZHRlc3RTdHJpbmcoXCJUZXN0MlwiKSIpOworICAgICAgICAgIHMgPSBzZWNvbmRDbGllbnQuc2Vjb25kdGVzdFN0cmluZygiVGVzdDIiKTsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgPSBcIiIgKyBzICsgIlwiXG4iKTsKKyAgICAgICAgICBpZiAoIXMuZXF1YWxzKCJ0ZXN0U3RyaW5nKFwiVGVzdDJcIikiKSkgeworICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfUFJPVE9DT0xTOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKioKICAgICAgICAgICogQllURSBURVNUCiAgICAgICAgICAqLwogICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0Qnl0ZSgxKSIpOwogICAgICAgICBieXRlIGk4ID0gdGVzdENsaWVudC50ZXN0Qnl0ZSgoYnl0ZSkxKTsKICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0gIiArIGk4ICsgIlxuIik7CiAgICAgICAgIGlmIChpOCAhPSAxKSB7Ci0gICAgICAgICAgZmFpbENvdW50Kys7IAotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRkFJTFVSRVxuIik7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfQkFTRVRZUEVTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgpAQCAtMjI3LDggKzI2NCw4IEBACiAgICAgICAgIGludCBpMzIgPSB0ZXN0Q2xpZW50LnRlc3RJMzIoLTEpOwogICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgPSAiICsgaTMyICsgIlxuIik7CiAgICAgICAgIGlmIChpMzIgIT0gLTEpIHsKLSAgICAgICAgICBmYWlsQ291bnQrKzsgCi0gICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGQUlMVVJFXG4iKTsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9CQVNFVFlQRVM7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKipcbiIpOwogICAgICAgICB9CiAKICAgICAgICAgLyoqCkBAIC0yMzgsOCArMjc1LDggQEAKICAgICAgICAgbG9uZyBpNjQgPSB0ZXN0Q2xpZW50LnRlc3RJNjQoLTM0MzU5NzM4MzY4TCk7CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiA9ICIgKyBpNjQgKyAiXG4iKTsKICAgICAgICAgaWYgKGk2NCAhPSAtMzQzNTk3MzgzNjhMKSB7Ci0gICAgICAgICAgZmFpbENvdW50Kys7Ci0gICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGQUlMVVJFXG4iKTsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9CQVNFVFlQRVM7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKipcbiIpOwogICAgICAgICB9CiAKICAgICAgICAgLyoqCkBAIC0yNDksMTQgKzI4Niw0MCBAQAogICAgICAgICBkb3VibGUgZHViID0gdGVzdENsaWVudC50ZXN0RG91YmxlKC01LjMyNTA5ODIzNSk7CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiA9ICIgKyBkdWIgKyAiXG4iKTsKICAgICAgICAgaWYgKE1hdGguYWJzKGR1YiAtICgtNS4zMjUwOTgyMzUpKSA+IDAuMDAxKSB7Ci0gICAgICAgICAgZmFpbENvdW50Kys7Ci0gICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGQUlMVVJFXG4iKTsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9CQVNFVFlQRVM7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKipcbiIpOwogICAgICAgICB9CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEJJTkFSWSBURVNUCiAgICAgICAgICAqLwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJUT0RPOiB0ZXN0QmluYXJ5KCAuLi4gKSIpOworICAgICAgICB0cnkgeworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RCaW5hcnkoLTEyOC4uLjEyNykgPSAiKTsKKyAgICAgICAgICBieXRlW10gZGF0YSA9IG5ldyBieXRlW10gey0xMjgsIC0xMjcsIC0xMjYsIC0xMjUsIC0xMjQsIC0xMjMsIC0xMjIsIC0xMjEsIC0xMjAsIC0xMTksIC0xMTgsIC0xMTcsIC0xMTYsIC0xMTUsIC0xMTQsIC0xMTMsIC0xMTIsIC0xMTEsIC0xMTAsIC0xMDksIC0xMDgsIC0xMDcsIC0xMDYsIC0xMDUsIC0xMDQsIC0xMDMsIC0xMDIsIC0xMDEsIC0xMDAsIC05OSwgLTk4LCAtOTcsIC05NiwgLTk1LCAtOTQsIC05MywgLTkyLCAtOTEsIC05MCwgLTg5LCAtODgsIC04NywgLTg2LCAtODUsIC04NCwgLTgzLCAtODIsIC04MSwgLTgwLCAtNzksIC03OCwgLTc3LCAtNzYsIC03NSwgLTc0LCAtNzMsIC03MiwgLTcxLCAtNzAsIC02OSwgLTY4LCAtNjcsIC02NiwgLTY1LCAtNjQsIC02MywgLTYyLCAtNjEsIC02MCwgLTU5LCAtNTgsIC01NywgLTU2LCAtNTUsIC01NCwgLTUzLCAtNTIsIC01MSwgLTUwLCAtNDksIC00OCwgLTQ3LCAtNDYsIC00NSwgLTQ0LCAtNDMsIC00MiwgLTQxLCAtNDAsIC0zOSwgLTM4LCAtMzcsIC0zNiwgLTM1LCAtMzQsIC0zMywgLTMyLCAtMzEsIC0zMCwgLTI5LCAtMjgsIC0yNywgLTI2LCAtMjUsIC0yNCwgLTIzLCAtMjIsIC0yMSwgLTIwLCAtMTksIC0xOCwgLTE3LCAtMTYsIC0xNSwgLTE0LCAtMTMsIC0xMiwgLTExLCAtMTAsIC05LCAtOCwgLTcsIC02LCAtNSwgLTQsIC0zLCAtMiwgLTEsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLCA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsIDQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCA2MiwgNjMsIDY0LCA2NSwgNjYsIDY3LCA2OCwgNjksIDcwLCA3MSwgNzIsIDczLCA3NCwgNzUsIDc2LCA3NywgNzgsIDc5LCA4MCwgODEsIDgyLCA4MywgODQsIDg1LCA4NiwgODcsIDg4LCA4OSwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LCAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAxMTEsIDExMiwgMTEzLCAxMTQsIDExNSwgMTE2LCAxMTcsIDExOCwgMTE5LCAxMjAsIDEyMSwgMTIyLCAxMjMsIDEyNCwgMTI1LCAxMjYsIDEyN307CisgICAgICAgICAgQnl0ZUJ1ZmZlciBiaW4gPSB0ZXN0Q2xpZW50LnRlc3RCaW5hcnkoQnl0ZUJ1ZmZlci53cmFwKGRhdGEpKTsKKyAgICAgICAgICBiaW4ubWFyaygpOworICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW2Jpbi5saW1pdCgpIC0gYmluLnBvc2l0aW9uKCldOworICAgICAgICAgIGJpbi5nZXQoYnl0ZXMpOworICAgICAgICAgIGJpbi5yZXNldCgpOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInsiKTsKKyAgICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiwgIik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KGJ5dGVzW2ldKTsKKyAgICAgICAgICB9CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ9Iik7CisgICAgICAgICAgaWYgKCFCeXRlQnVmZmVyLndyYXAoZGF0YSkuZXF1YWxzKGJpbikpIHsKKyAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0JBU0VUWVBFUzsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0JBU0VUWVBFUzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7CisgICAgICAgIH0KIAogICAgICAgICAvKioKICAgICAgICAgICogU1RSVUNUIFRFU1QKQEAgLTI2OCwxNCArMzMxLDE0IEBACiAgICAgICAgIG91dC5pMzJfdGhpbmcgPSAtMzsKICAgICAgICAgb3V0Lmk2NF90aGluZyA9IC01OwogICAgICAgICBYdHJ1Y3QgaW4gPSB0ZXN0Q2xpZW50LnRlc3RTdHJ1Y3Qob3V0KTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0geyIgKyAiXCIiICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW4uc3RyaW5nX3RoaW5nICsgIlwiLCIgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbi5ieXRlX3RoaW5nICsgIiwgIiArIAotICAgICAgICAgICAgICAgICAgICAgICAgIGluLmkzMl90aGluZyArICIsICIgKyAKKyAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0geyIgKyAiXCIiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbi5zdHJpbmdfdGhpbmcgKyAiXCIsIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgaW4uYnl0ZV90aGluZyArICIsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgIGluLmkzMl90aGluZyArICIsICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgIGluLmk2NF90aGluZyArICJ9XG4iKTsKICAgICAgICAgaWYgKCFpbi5lcXVhbHMob3V0KSkgewotICAgICAgICAgIGZhaWxDb3VudCsrOyAKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZBSUxVUkVcbiIpOworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX1NUUlVDVFM7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKipcbiIpOwogICAgICAgICB9CiAKICAgICAgICAgLyoqCkBAIC0yODgsMTUgKzM1MSwxNSBAQAogICAgICAgICBvdXQyLmkzMl90aGluZyA9IDU7CiAgICAgICAgIFh0cnVjdDIgaW4yID0gdGVzdENsaWVudC50ZXN0TmVzdChvdXQyKTsKICAgICAgICAgaW4gPSBpbjIuc3RydWN0X3RoaW5nOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgPSB7IiArIGluMi5ieXRlX3RoaW5nICsgIiwgeyIgKyAiXCIiICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW4uc3RyaW5nX3RoaW5nICsgIlwiLCAiICsgCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiA9IHsiICsgaW4yLmJ5dGVfdGhpbmcgKyAiLCB7IiArICJcIiIgKworICAgICAgICAgICAgICAgICAgICAgICAgIGluLnN0cmluZ190aGluZyArICJcIiwgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW4uYnl0ZV90aGluZyArICIsICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgIGluLmkzMl90aGluZyArICIsICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgIGluLmk2NF90aGluZyArICJ9LCAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICBpbjIuaTMyX3RoaW5nICsgIn1cbiIpOwogICAgICAgICBpZiAoIWluMi5lcXVhbHMob3V0MikpIHsKLSAgICAgICAgICBmYWlsQ291bnQrKzsKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZBSUxVUkVcbiIpOworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX1NUUlVDVFM7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKipcbiIpOwogICAgICAgICB9CiAKICAgICAgICAgLyoqCkBAIC0zMzAsMTQgKzM5Myw0OCBAQAogICAgICAgICB9CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn1cbiIpOwogICAgICAgICBpZiAoIW1hcG91dC5lcXVhbHMobWFwaW4pKSB7Ci0gICAgICAgICAgZmFpbENvdW50Kys7IAotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRkFJTFVSRVxuIik7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfQ09OVEFJTkVSUzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKlxuIik7CiAgICAgICAgIH0KIAogICAgICAgICAvKioKICAgICAgICAgICogU1RSSU5HIE1BUCBURVNUCi0gICAgICAgICAqICBtaXNzaW5nCiAgICAgICAgICAqLworICAgICAgICB0cnkgeworICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gc21hcG91dCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworICAgICAgICAgIHNtYXBvdXQucHV0KCJhIiwgIjIiKTsKKyAgICAgICAgICBzbWFwb3V0LnB1dCgiYiIsICJibGFoIik7CisgICAgICAgICAgc21hcG91dC5wdXQoInNvbWUiLCAidGhpbmciKTsKKyAgICAgICAgICBmb3IgKFN0cmluZyBrZXkgOiBzbWFwb3V0LmtleVNldCgpKSB7CisgICAgICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiwgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KGtleSArICIgPT4gIiArIHNtYXBvdXQuZ2V0KGtleSkpOworICAgICAgICAgIH0KKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9KSIpOworICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gc21hcGluID0gdGVzdENsaWVudC50ZXN0U3RyaW5nTWFwKHNtYXBvdXQpOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiA9IHsiKTsKKyAgICAgICAgICBmaXJzdCA9IHRydWU7CisgICAgICAgICAgZm9yIChTdHJpbmcga2V5IDogc21hcGluLmtleVNldCgpKSB7CisgICAgICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiwgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KGtleSArICIgPT4gIiArIHNtYXBvdXQuZ2V0KGtleSkpOworICAgICAgICAgIH0KKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9XG4iKTsKKyAgICAgICAgICBpZiAoIXNtYXBvdXQuZXF1YWxzKHNtYXBpbikpIHsKKyAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0NPTlRBSU5FUlM7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9DT05UQUlORVJTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7CisgICAgICAgIH0KIAogICAgICAgICAvKioKICAgICAgICAgICogU0VUIFRFU1QKQEAgLTM3MCw4ICs0NjcsOCBAQAogICAgICAgICB9CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn1cbiIpOwogICAgICAgICBpZiAoIXNldG91dC5lcXVhbHMoc2V0aW4pKSB7Ci0gICAgICAgICAgZmFpbENvdW50Kys7IAotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRkFJTFVSRVxuIik7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfQ09OVEFJTkVSUzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKlxuIik7CiAgICAgICAgIH0KIAogICAgICAgICAvKioKQEAgLTQwNSw4ICs1MDIsOCBAQAogICAgICAgICB9CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn1cbiIpOwogICAgICAgICBpZiAoIWxpc3RvdXQuZXF1YWxzKGxpc3RpbikpIHsKLSAgICAgICAgICBmYWlsQ291bnQrKzsgCi0gICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGQUlMVVJFXG4iKTsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9DT05UQUlORVJTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgpAQCAtNDE2LDQwICs1MTMsNDAgQEAKICAgICAgICAgTnVtYmVyeiByZXQgPSB0ZXN0Q2xpZW50LnRlc3RFbnVtKE51bWJlcnouT05FKTsKICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0gIiArIHJldCArICJcbiIpOwogICAgICAgICBpZiAocmV0ICE9IE51bWJlcnouT05FKSB7Ci0gICAgICAgICAgZmFpbENvdW50Kys7Ci0gICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGQUlMVVJFXG4iKTsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9TVFJVQ1RTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKICAgICAgICAgfQogCiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RFbnVtKFRXTykiKTsKICAgICAgICAgcmV0ID0gdGVzdENsaWVudC50ZXN0RW51bShOdW1iZXJ6LlRXTyk7CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiA9ICIgKyByZXQgKyAiXG4iKTsKICAgICAgICAgaWYgKHJldCAhPSBOdW1iZXJ6LlRXTykgewotICAgICAgICAgIGZhaWxDb3VudCsrOyAKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZBSUxVUkVcbiIpOworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX1NUUlVDVFM7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKipcbiIpOwogICAgICAgICB9CiAKICAgICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdEVudW0oVEhSRUUpIik7CiAgICAgICAgIHJldCA9IHRlc3RDbGllbnQudGVzdEVudW0oTnVtYmVyei5USFJFRSk7CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiA9ICIgKyByZXQgKyAiXG4iKTsKICAgICAgICAgaWYgKHJldCAhPSBOdW1iZXJ6LlRIUkVFKSB7Ci0gICAgICAgICAgZmFpbENvdW50Kys7Ci0gICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGQUlMVVJFXG4iKTsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9TVFJVQ1RTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKICAgICAgICAgfQogCiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RFbnVtKEZJVkUpIik7CiAgICAgICAgIHJldCA9IHRlc3RDbGllbnQudGVzdEVudW0oTnVtYmVyei5GSVZFKTsKICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0gIiArIHJldCArICJcbiIpOwogICAgICAgICBpZiAocmV0ICE9IE51bWJlcnouRklWRSkgewotICAgICAgICAgIGZhaWxDb3VudCsrOwotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRkFJTFVSRVxuIik7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfU1RSVUNUUzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKlxuIik7CiAgICAgICAgIH0KIAogICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0RW51bShFSUdIVCkiKTsKICAgICAgICAgcmV0ID0gdGVzdENsaWVudC50ZXN0RW51bShOdW1iZXJ6LkVJR0hUKTsKICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0gIiArIHJldCArICJcbiIpOwogICAgICAgICBpZiAocmV0ICE9IE51bWJlcnouRUlHSFQpIHsKLSAgICAgICAgICBmYWlsQ291bnQrKzsKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZBSUxVUkVcbiIpOworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX1NUUlVDVFM7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKipcbiIpOwogICAgICAgICB9CiAKICAgICAgICAgLyoqCkBAIC00NTksOCArNTU2LDggQEAKICAgICAgICAgbG9uZyB1aWQgPSB0ZXN0Q2xpZW50LnRlc3RUeXBlZGVmKDMwOTg1ODIzNTA4MjUyM0wpOwogICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgPSAiICsgdWlkICsgIlxuIik7CiAgICAgICAgIGlmICh1aWQgIT0gMzA5ODU4MjM1MDgyNTIzTCkgewotICAgICAgICAgIGZhaWxDb3VudCsrOwotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRkFJTFVSRVxuIik7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfQkFTRVRZUEVTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgpAQCAtNDc5LDEyMSArNTc2LDE3NCBAQAogICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn0sICIpOwogICAgICAgICB9CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn1cbiIpOworICAgICAgICBpZiAobW0uc2l6ZSgpICE9IDIgfHwgIW1tLmNvbnRhaW5zS2V5KDQpIHx8ICFtbS5jb250YWluc0tleSgtNCkpIHsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9DT05UQUlORVJTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBNYXA8SW50ZWdlciwgSW50ZWdlcj4gbTEgPSBtbS5nZXQoNCk7CisgICAgICAgICAgTWFwPEludGVnZXIsIEludGVnZXI+IG0yID0gbW0uZ2V0KC00KTsKKyAgICAgICAgICBpZiAobTEuZ2V0KDEpICE9IDEgfHwgbTEuZ2V0KDIpICE9IDIgfHwgbTEuZ2V0KDMpICE9IDMgfHwgbTEuZ2V0KDQpICE9IDQgfHwKKyAgICAgICAgICAgICAgbTIuZ2V0KC0xKSAhPSAtMSB8fCBtMi5nZXQoLTIpICE9IC0yIHx8IG0yLmdldCgtMykgIT0gLTMgfHwgbTIuZ2V0KC00KSAhPSAtNCkgeworICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfQ09OVEFJTkVSUzsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KIAogICAgICAgICAvKioKICAgICAgICAgICogSU5TQU5JVFkgVEVTVAogICAgICAgICAgKi8KLSAgICAgICAgaW5zYW5lID0gbmV3IEluc2FuaXR5KCk7Ci0gICAgICAgIGluc2FuZS51c2VyTWFwID0gbmV3IEhhc2hNYXA8TnVtYmVyeiwgTG9uZz4oKTsKLSAgICAgICAgaW5zYW5lLnVzZXJNYXAucHV0KE51bWJlcnouRklWRSwgKGxvbmcpNTAwMCk7Ci0gICAgICAgIFh0cnVjdCB0cnVjayA9IG5ldyBYdHJ1Y3QoKTsKLSAgICAgICAgdHJ1Y2suc3RyaW5nX3RoaW5nID0gIlRydWNrIjsKLSAgICAgICAgdHJ1Y2suYnl0ZV90aGluZyA9IChieXRlKTg7Ci0gICAgICAgIHRydWNrLmkzMl90aGluZyA9IDg7Ci0gICAgICAgIHRydWNrLmk2NF90aGluZyA9IDg7Ci0gICAgICAgIGluc2FuZS54dHJ1Y3RzID0gbmV3IEFycmF5TGlzdDxYdHJ1Y3Q+KCk7Ci0gICAgICAgIGluc2FuZS54dHJ1Y3RzLmFkZCh0cnVjayk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RJbnNhbml0eSgpIik7Ci0gICAgICAgIE1hcDxMb25nLE1hcDxOdW1iZXJ6LEluc2FuaXR5Pj4gd2hvYSA9Ci0gICAgICAgICAgdGVzdENsaWVudC50ZXN0SW5zYW5pdHkoaW5zYW5lKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0geyIpOwotICAgICAgICBmb3IgKGxvbmcga2V5IDogd2hvYS5rZXlTZXQoKSkgewotICAgICAgICAgIE1hcDxOdW1iZXJ6LEluc2FuaXR5PiB2YWwgPSB3aG9hLmdldChrZXkpOwotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoa2V5ICsgIiA9PiB7Iik7CiAKLSAgICAgICAgICBmb3IgKE51bWJlcnogazIgOiB2YWwua2V5U2V0KCkpIHsKLSAgICAgICAgICAgIEluc2FuaXR5IHYyID0gdmFsLmdldChrMik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KGsyICsgIiA9PiB7Iik7Ci0gICAgICAgICAgICBNYXA8TnVtYmVyeiwgTG9uZz4gdXNlck1hcCA9IHYyLnVzZXJNYXA7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ7Iik7Ci0gICAgICAgICAgICBpZiAodXNlck1hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgIGZvciAoTnVtYmVyeiBrMyA6IHVzZXJNYXAua2V5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KGszICsgIiA9PiAiICsgdXNlck1hcC5nZXQoazMpICsgIiwgIik7CisgICAgICAgIGJvb2xlYW4gaW5zYW5pdHlGYWlsZWQgPSB0cnVlOworICAgICAgICB0cnkgeworICAgICAgICAgIFh0cnVjdCBoZWxsbyA9IG5ldyBYdHJ1Y3QoKTsKKyAgICAgICAgICBoZWxsby5zdHJpbmdfdGhpbmcgPSAiSGVsbG8yIjsKKyAgICAgICAgICBoZWxsby5ieXRlX3RoaW5nID0gMjsKKyAgICAgICAgICBoZWxsby5pMzJfdGhpbmcgPSAyOworICAgICAgICAgIGhlbGxvLmk2NF90aGluZyA9IDI7CisKKyAgICAgICAgICBYdHJ1Y3QgZ29vZGJ5ZSA9IG5ldyBYdHJ1Y3QoKTsKKyAgICAgICAgICBnb29kYnllLnN0cmluZ190aGluZyA9ICJHb29kYnllNCI7CisgICAgICAgICAgZ29vZGJ5ZS5ieXRlX3RoaW5nID0gKGJ5dGUpNDsKKyAgICAgICAgICBnb29kYnllLmkzMl90aGluZyA9IDQ7CisgICAgICAgICAgZ29vZGJ5ZS5pNjRfdGhpbmcgPSAobG9uZyk0OworCisgICAgICAgICAgaW5zYW5lLnVzZXJNYXAgPSBuZXcgSGFzaE1hcDxOdW1iZXJ6LCBMb25nPigpOworICAgICAgICAgIGluc2FuZS51c2VyTWFwLnB1dChOdW1iZXJ6LkVJR0hULCAobG9uZyk4KTsKKyAgICAgICAgICBpbnNhbmUudXNlck1hcC5wdXQoTnVtYmVyei5GSVZFLCAobG9uZyk1KTsKKyAgICAgICAgICBpbnNhbmUueHRydWN0cyA9IG5ldyBBcnJheUxpc3Q8WHRydWN0PigpOworICAgICAgICAgIGluc2FuZS54dHJ1Y3RzLmFkZChnb29kYnllKTsKKyAgICAgICAgICBpbnNhbmUueHRydWN0cy5hZGQoaGVsbG8pOworCisgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdEluc2FuaXR5KCkiKTsKKyAgICAgICAgICBNYXA8TG9uZyxNYXA8TnVtYmVyeixJbnNhbml0eT4+IHdob2EgPQorICAgICAgICAgICAgdGVzdENsaWVudC50ZXN0SW5zYW5pdHkoaW5zYW5lKTsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgPSB7Iik7CisgICAgICAgICAgZm9yIChsb25nIGtleSA6IHdob2Eua2V5U2V0KCkpIHsKKyAgICAgICAgICAgIE1hcDxOdW1iZXJ6LEluc2FuaXR5PiB2YWwgPSB3aG9hLmdldChrZXkpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludChrZXkgKyAiID0+IHsiKTsKKworICAgICAgICAgICAgZm9yIChOdW1iZXJ6IGsyIDogdmFsLmtleVNldCgpKSB7CisgICAgICAgICAgICAgIEluc2FuaXR5IHYyID0gdmFsLmdldChrMik7CisgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoazIgKyAiID0+IHsiKTsKKyAgICAgICAgICAgICAgTWFwPE51bWJlcnosIExvbmc+IHVzZXJNYXAgPSB2Mi51c2VyTWFwOworICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ7Iik7CisgICAgICAgICAgICAgIGlmICh1c2VyTWFwICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKE51bWJlcnogazMgOiB1c2VyTWFwLmtleVNldCgpKSB7CisgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KGszICsgIiA9PiAiICsgdXNlck1hcC5nZXQoazMpICsgIiwgIik7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9LCAiKTsKKyAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgifSwgIik7CiAKLSAgICAgICAgICAgIExpc3Q8WHRydWN0PiB4dHJ1Y3RzID0gdjIueHRydWN0czsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInsiKTsKLSAgICAgICAgICAgIGlmICh4dHJ1Y3RzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgZm9yIChYdHJ1Y3QgeCA6IHh0cnVjdHMpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ7IiArICJcIiIgKyB4LnN0cmluZ190aGluZyArICJcIiwgIiArIHguYnl0ZV90aGluZyArICIsICIgKyB4LmkzMl90aGluZyArICIsICIrIHguaTY0X3RoaW5nICsgIn0sICIpOworICAgICAgICAgICAgICBMaXN0PFh0cnVjdD4geHRydWN0cyA9IHYyLnh0cnVjdHM7CisgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInsiKTsKKyAgICAgICAgICAgICAgaWYgKHh0cnVjdHMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZvciAoWHRydWN0IHggOiB4dHJ1Y3RzKSB7CisgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ7IiArICJcIiIgKyB4LnN0cmluZ190aGluZyArICJcIiwgIiArIHguYnl0ZV90aGluZyArICIsICIgKyB4LmkzMl90aGluZyArICIsICIrIHguaTY0X3RoaW5nICsgIn0sICIpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgifSIpOworICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9Iik7CiAKKyAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgifSwgIik7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9LCAiKTsKICAgICAgICAgICB9Ci0gICAgICAgICAgU3lzdGVtLm91dC5wcmludCgifSwgIik7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgifVxuIik7CisgICAgICAgICAgaWYgKHdob2Euc2l6ZSgpID09IDIgJiYgd2hvYS5jb250YWluc0tleSgxTCkgJiYgd2hvYS5jb250YWluc0tleSgyTCkpIHsKKyAgICAgICAgICAgIE1hcDxOdW1iZXJ6LCBJbnNhbml0eT4gZmlyc3RfbWFwID0gd2hvYS5nZXQoMUwpOworICAgICAgICAgICAgTWFwPE51bWJlcnosIEluc2FuaXR5PiBzZWNvbmRfbWFwID0gd2hvYS5nZXQoMkwpOworICAgICAgICAgICAgaWYgKGZpcnN0X21hcC5zaXplKCkgPT0gMiAmJgorICAgICAgICAgICAgICAgIGZpcnN0X21hcC5jb250YWluc0tleShOdW1iZXJ6LlRXTykgJiYKKyAgICAgICAgICAgICAgICBmaXJzdF9tYXAuY29udGFpbnNLZXkoTnVtYmVyei5USFJFRSkgJiYKKyAgICAgICAgICAgICAgICBzZWNvbmRfbWFwLnNpemUoKSA9PSAxICYmCisgICAgICAgICAgICAgICAgc2Vjb25kX21hcC5jb250YWluc0tleShOdW1iZXJ6LlNJWCkgJiYKKyAgICAgICAgICAgICAgICBpbnNhbmUuZXF1YWxzKGZpcnN0X21hcC5nZXQoTnVtYmVyei5UV08pKSAmJgorICAgICAgICAgICAgICAgIGluc2FuZS5lcXVhbHMoZmlyc3RfbWFwLmdldChOdW1iZXJ6LlRIUkVFKSkpIHsKKyAgICAgICAgICAgICAgSW5zYW5pdHkgc2l4ID1zZWNvbmRfbWFwLmdldChOdW1iZXJ6LlNJWCk7CisgICAgICAgICAgICAgIC8vIENhbm5vdCB1c2UgIm5ldyBJbnNhbml0eSgpLmVxdWFscyhzaXgpIiBiZWNhdXNlIGFzIG9mIG5vdywgc3RydWN0L2NvbnRhaW5lcgorICAgICAgICAgICAgICAvLyBmaWVsZHMgd2l0aCBkZWZhdWx0IHJlcXVpcmVkbmVzcyBoYXZlIGlzc2V0PWZhbHNlIGZvciBsb2NhbCBpbnN0YW5jZXMgYW5kIHlldAorICAgICAgICAgICAgICAvLyByZWNlaXZlZCBlbXB0eSB2YWx1ZXMgZnJvbSBvdGhlciBsYW5ndWFnZXMgbGlrZSBDKysgaGF2ZSBpc3NldD10cnVlIC4KKyAgICAgICAgICAgICAgaWYgKHNpeC5nZXRVc2VyTWFwU2l6ZSgpID09IDAgJiYgc2l4LmdldFh0cnVjdHNTaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIC8vIE9LCisgICAgICAgICAgICAgICAgaW5zYW5pdHlGYWlsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfU1RSVUNUUzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOworICAgICAgICAgIGluc2FuaXR5RmFpbGVkID0gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludCgifVxuIik7CisgICAgICAgIGlmIChpbnNhbml0eUZhaWxlZCkgeworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX1NUUlVDVFM7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICB9CiAKLSAgICAgICAgCiAgICAgICAgIC8qKgogICAgICAgICAgKiBFWEVDUFRJT04gVEVTVAogICAgICAgICAgKi8KICAgICAgICAgdHJ5IHsKICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0Q2xpZW50LnRlc3RFeGNlcHRpb24oXCJYY2VwdGlvblwiKSA9PiIpOwogICAgICAgICAgIHRlc3RDbGllbnQudGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iKTsKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgIHZvaWRcbkZBSUxVUkVcbiIpOwotICAgICAgICAgIGZhaWxDb3VudCsrOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiAgdm9pZFxuKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9FWENFUFRJT05TOwogICAgICAgICB9IGNhdGNoKFhjZXB0aW9uIGUpIHsKICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiICB7JWQsIFwiJXNcIn1cbiIsIGUuZXJyb3JDb2RlLCBlLm1lc3NhZ2UpOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKFwiVEV4Y2VwdGlvblwiKSA9PiIpOwogICAgICAgICAgIHRlc3RDbGllbnQudGVzdEV4Y2VwdGlvbigiVEV4Y2VwdGlvbiIpOwotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiAgdm9pZFxuRkFJTFVSRVxuIik7Ci0gICAgICAgICAgZmFpbENvdW50Kys7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiICB2b2lkXG4qKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0VYQ0VQVElPTlM7CiAgICAgICAgIH0gY2F0Y2goVEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIiAge1wiJXNcIn1cbiIsIGUuZ2V0TWVzc2FnZSgpKTsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICB0cnkgewogICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RDbGllbnQudGVzdEV4Y2VwdGlvbihcInN1Y2Nlc3NcIikgPT4iKTsKICAgICAgICAgICB0ZXN0Q2xpZW50LnRlc3RFeGNlcHRpb24oInN1Y2Nlc3MiKTsKICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgIHZvaWRcbiIpOwogICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiICBleGNlcHRpb25cbkZBSUxVUkVcbiIpOwotICAgICAgICAgIGZhaWxDb3VudCsrOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCIgIGV4Y2VwdGlvblxuKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9FWENFUFRJT05TOwogICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAKKworCiAgICAgICAgIC8qKgogICAgICAgICAgKiBNVUxUSSBFWENFUFRJT04gVEVTVAogICAgICAgICAgKi8KLSAgICAgICAgCisKICAgICAgICAgdHJ5IHsKICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigidGVzdENsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oXCJYY2VwdGlvblwiLCBcInRlc3QgMVwiKSA9PiIpOwogICAgICAgICAgIHRlc3RDbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKCJYY2VwdGlvbiIsICJ0ZXN0IDEiKTsKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgIHJlc3VsdFxuRkFJTFVSRVxuIik7Ci0gICAgICAgICAgZmFpbENvdW50Kys7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiICByZXN1bHRcbioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfRVhDRVBUSU9OUzsKICAgICAgICAgfSBjYXRjaChYY2VwdGlvbiBlKSB7CiAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIiAgeyVkLCBcIiVzXCJ9XG4iLCBlLmVycm9yQ29kZSwgZS5tZXNzYWdlKTsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICB0cnkgewogICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCJ0ZXN0Q2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbihcIlhjZXB0aW9uMlwiLCBcInRlc3QgMlwiKSA9PiIpOwogICAgICAgICAgIHRlc3RDbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKCJYY2VwdGlvbjIiLCAidGVzdCAyIik7Ci0gICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiICByZXN1bHRcbkZBSUxVUkVcbiIpOwotICAgICAgICAgIGZhaWxDb3VudCsrOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiAgcmVzdWx0XG4qKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0VYQ0VQVElPTlM7CiAgICAgICAgIH0gY2F0Y2goWGNlcHRpb24yIGUpIHsKICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiICB7JWQsIHtcIiVzXCJ9fVxuIiwgZS5lcnJvckNvZGUsIGUuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZyk7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgdHJ5IHsKICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0Q2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbihcInN1Y2Nlc3NcIiwgXCJ0ZXN0IDNcIikgPT4iKTsKICAgICAgICAgICBYdHJ1Y3QgcmVzdWx0OwogICAgICAgICAgIHJlc3VsdCA9IHRlc3RDbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKCJzdWNjZXNzIiwgInRlc3QgMyIpOwogICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCIgIHt7XCIlc1wifX1cbiIsIHJlc3VsdC5zdHJpbmdfdGhpbmcpOwogICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIiAgZXhjZXB0aW9uXG5GQUlMVVJFXG4iKTsKLSAgICAgICAgICBmYWlsQ291bnQrKzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiICBleGNlcHRpb25cbioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfRVhDRVBUSU9OUzsKICAgICAgICAgfQogCiAKLSAgICAgICAgCisKICAgICAgICAgLyoqCiAgICAgICAgICAqIE9ORVdBWSBURVNUCiAgICAgICAgICAqLwpAQCAtNjAzLDkgKzc1MywxMCBAQAogICAgICAgICBsb25nIG9uZXdheUVsYXBzZWRNaWxsaXMgPSAoU3lzdGVtLm5hbm9UaW1lKCkgLSBzdGFydE9uZXdheSkgLyAxMDAwMDAwOwogICAgICAgICBpZiAob25ld2F5RWxhcHNlZE1pbGxpcyA+IDIwMCkgewogICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT25ld2F5IHRlc3QgZmFpbGVkOiB0b29rICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9uZy50b1N0cmluZyhvbmV3YXlFbGFwc2VkTWlsbGlzKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXMiKTsKLSAgICAgICAgICBmYWlsQ291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9uZy50b1N0cmluZyhvbmV3YXlFbGFwc2VkTWlsbGlzKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtcyIpOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCIqKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0JBU0VUWVBFUzsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN1Y2Nlc3MgLSB0b29rICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb25nLnRvU3RyaW5nKG9uZXdheUVsYXBzZWRNaWxsaXMpICsKQEAgLTYyOCw4ICs3NzksOSBAQAogCiAgICAgICAgIHRyYW5zcG9ydC5jbG9zZSgpOwogICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHgpIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIioqKiBGQUlMVVJFICoqKlxuIik7CiAgICAgICAgIHgucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIGZhaWxDb3VudCsrOworICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9VTktOT1dOOwogICAgICAgfQogICAgIH0KIApAQCAtNjQxLDEzICs3OTMsMTQgQEAKIAogICAgIHRyeSB7CiAgICAgICBTdHJpbmcganNvbiA9IChuZXcgVFNlcmlhbGl6ZXIobmV3IFRTaW1wbGVKU09OUHJvdG9jb2wuRmFjdG9yeSgpKSkudG9TdHJpbmcoaW5zYW5lKTsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5Gb3IgZ29vZCBtZWF1c3JlIGhlcmUgaXMgc29tZSBKU09OOlxuIiArIGpzb24pOworICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcblNhbXBsZSBUU2ltcGxlSlNPTlByb3RvY29sIG91dHB1dDpcbiIgKyBqc29uKTsKICAgICB9IGNhdGNoIChURXhjZXB0aW9uIHgpIHsKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqIik7CiAgICAgICB4LnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgICByZXR1cm5Db2RlIHw9IEVSUl9CQVNFVFlQRVM7CiAgICAgfQogCiAKLSAgICBTeXN0ZW0uZXhpdChmYWlsQ291bnQpOworICAgIFN5c3RlbS5leGl0KHJldHVybkNvZGUpOwogICB9CiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Rlc3QvVGVzdFNlcnZlci5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90ZXN0L1Rlc3RTZXJ2ZXIuamF2YQppbmRleCBlZTA4NjZlLi4xZjNlNTU1IDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Rlc3QvVGVzdFNlcnZlci5qYXZhCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdGVzdC9UZXN0U2VydmVyLmphdmEKQEAgLTMwLDYgKzMwLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5USlNPTlByb3RvY29sOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbDsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNdWx0aXBsZXhlZFByb3RvY29sOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5TZXJ2ZXJDb250ZXh0OwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5UU2VydmVyOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5UU2VydmVyLkFyZ3M7CkBAIC00NiwxMCArNDcsMTEgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydEZhY3Rvcnk7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlROb25ibG9ja2luZ1NlcnZlclNvY2tldDsKLQoraW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRNdWx0aXBsZXhlZFByb2Nlc3NvcjsKIAogaW1wb3J0IHRocmlmdC50ZXN0Lkluc2FuaXR5OwogaW1wb3J0IHRocmlmdC50ZXN0Lk51bWJlcno7CitpbXBvcnQgdGhyaWZ0LnRlc3QuU2Vjb25kU2VydmljZTsKIGltcG9ydCB0aHJpZnQudGVzdC5UaHJpZnRUZXN0OwogaW1wb3J0IHRocmlmdC50ZXN0LlhjZXB0aW9uOwogaW1wb3J0IHRocmlmdC50ZXN0LlhjZXB0aW9uMjsKQEAgLTU4LDYgKzYwLDI0IEBACiAKIHB1YmxpYyBjbGFzcyBUZXN0U2VydmVyIHsKIAorICAvLyBNdWx0aXBsZXhlZCBQcm90b2NvbCBTdXBwb3J0IERldGFpbHM6CisgIC8vCisgIC8vIEZvciBtdWx0aXBsZXhlZCB0ZXN0aW5nIHdlIGFsd2F5cyB1c2UgYmluYXJ5IHByb3RvY29sIHVuZGVybmVhdGguCisgIC8vCisgIC8vICJUaHJpZnRUZXN0IiBuYW1lZCBzZXJ2aWNlIGltcGxlbWVudHMgIlRocmlmdFRlc3QiIGZyb20gVGhyaWZ0VGVzdC50aHJpZnQKKyAgLy8gIlNlY29uZFNlcnZpY2UiIG5hbWVkIHNlcnZpY2UgaW1wbGVtZW50cyAiU2Vjb25kU2VydmljZSIgZnJvbSBUaHJpZnRUZXN0LnRocmlmdAorICAvLyBJbiBhZGRpdGlvbiwgdG8gc3VwcG9ydCBvbGRlciBub24tbXVsdGlwbGV4ZWQgY2xpZW50cyB1c2luZyB0aGUgc2FtZSBjb25jcmV0ZSBwcm90b2NvbAorICAvLyB0aGUgbXVsdGlwbGV4ZWQgcHJvY2Vzc29yIGlzIHRhdWdodCB0byB1c2UgIlRocmlmdFRlc3QiIGlmIHRoZSBpbmNvbWluZyByZXF1ZXN0IGhhcyBubworICAvLyBtdWx0aXBsZXhlZCBjYWxsIG5hbWUgZGVjb3JhdGlvbi4KKworICBzdGF0aWMgY2xhc3MgU2Vjb25kSGFuZGxlciBpbXBsZW1lbnRzIHRocmlmdC50ZXN0LlNlY29uZFNlcnZpY2UuSWZhY2UgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGphdmEubGFuZy5TdHJpbmcgc2Vjb25kdGVzdFN0cmluZyhqYXZhLmxhbmcuU3RyaW5nIHRoaW5nKSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbgorICAgIHsgcmV0dXJuICJ0ZXN0U3RyaW5nKFwiIiArIHRoaW5nICsgIlwiKSI7IH0KKworICB9CisKICAgc3RhdGljIGNsYXNzIFRlc3RTZXJ2ZXJDb250ZXh0IGltcGxlbWVudHMgU2VydmVyQ29udGV4dCB7CiAKICAgICAgICAgaW50IGNvbm5lY3Rpb25JZDsKQEAgLTExMSw2ICsxMzEsOCBAQAogICAgICAgU3RyaW5nIHByb3RvY29sX3R5cGUgPSAiYmluYXJ5IjsKICAgICAgIFN0cmluZyBzZXJ2ZXJfdHlwZSA9ICJ0aHJlYWQtcG9vbCI7CiAgICAgICBTdHJpbmcgZG9tYWluX3NvY2tldCA9ICIiOworICAgICAgaW50IHN0cmluZ19saW1pdCA9IC0xOworICAgICAgaW50IGNvbnRhaW5lcl9saW1pdCA9IC0xOwogICAgICAgdHJ5IHsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgaWYgKGFyZ3NbaV0uc3RhcnRzV2l0aCgiLS1wb3J0IikpIHsKQEAgLTEyOCwxNCArMTUwLDIwIEBACiAgICAgICAgICAgICB0cmFuc3BvcnRfdHlwZS50cmltKCk7CiAgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLS1zc2wiKSkgewogICAgICAgICAgICAgc3NsID0gdHJ1ZTsKKyAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uc3RhcnRzV2l0aCgiLS1zdHJpbmctbGltaXQiKSkgeworICAgICAgICAgICAgc3RyaW5nX2xpbWl0ID0gSW50ZWdlci52YWx1ZU9mKGFyZ3NbaV0uc3BsaXQoIj0iKVsxXSk7CisgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLnN0YXJ0c1dpdGgoIi0tY29udGFpbmVyLWxpbWl0IikpIHsKKyAgICAgICAgICAgIGNvbnRhaW5lcl9saW1pdCA9IEludGVnZXIudmFsdWVPZihhcmdzW2ldLnNwbGl0KCI9IilbMV0pOwogICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi0taGVscCIpKSB7CiAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkFsbG93ZWQgb3B0aW9uczoiKTsKICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtLWhlbHBcdFx0XHRQcm9kdWNlIGhlbHAgbWVzc2FnZSIpOwogICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC0tcG9ydD1hcmcgKD0iICsgcG9ydCArICIpXHRQb3J0IG51bWJlciB0byBjb25uZWN0Iik7CiAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLS10cmFuc3BvcnQ9YXJnICg9IiArIHRyYW5zcG9ydF90eXBlICsgIilcblx0XHRcdFx0VHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkLCBmYXN0ZnJhbWVkIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLS1wcm90b2NvbD1hcmcgKD0iICsgcHJvdG9jb2xfdHlwZSArICIpXHRQcm90b2NvbDogYmluYXJ5LCBqc29uLCBjb21wYWN0Iik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLS1wcm90b2NvbD1hcmcgKD0iICsgcHJvdG9jb2xfdHlwZSArICIpXHRQcm90b2NvbDogYmluYXJ5LCBjb21wYWN0LCBqc29uLCBtdWx0aSwgbXVsdGljLCBtdWx0aWoiKTsKICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtLXNzbFx0XHRcdEVuY3J5cHRlZCBUcmFuc3BvcnQgdXNpbmcgU1NMIik7CiAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLS1zZXJ2ZXItdHlwZT1hcmcgKD0iICsgc2VydmVyX3R5cGUgKyIpXG5cdFx0XHRcdFR5cGUgb2Ygc2VydmVyOiBzaW1wbGUsIHRocmVhZC1wb29sLCBub25ibG9ja2luZywgdGhyZWFkZWQtc2VsZWN0b3IiKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtLXN0cmluZy1saW1pdD1hcmcgKD0iICsgc3RyaW5nX2xpbWl0ICsgIilcdFN0cmluZyByZWFkIGxlbmd0aCBsaW1pdCIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC0tY29udGFpbmVyLWxpbWl0PWFyZyAoPSIgKyBjb250YWluZXJfbGltaXQgKyAiKVx0Q29udGFpbmVyIHJlYWQgbGVuZ3RoIGxpbWl0Iik7CiAgICAgICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTE1OSw4ICsxODcsMTEgQEAKICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJVbmtub3duIHNlcnZlciB0eXBlISAiICsgc2VydmVyX3R5cGUpOwogICAgICAgICB9CiAgICAgICAgIGlmIChwcm90b2NvbF90eXBlLmVxdWFscygiYmluYXJ5IikpIHsKLSAgICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlLmVxdWFscygianNvbiIpKSB7CiAgICAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoImNvbXBhY3QiKSkgeworICAgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUuZXF1YWxzKCJqc29uIikpIHsKKyAgICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlLmVxdWFscygibXVsdGkiKSkgeworICAgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUuZXF1YWxzKCJtdWx0aWMiKSkgeworICAgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUuZXF1YWxzKCJtdWx0aWoiKSkgewogICAgICAgICB9IGVsc2UgewogICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlVua25vd24gcHJvdG9jb2wgdHlwZSEgIiArIHByb3RvY29sX3R5cGUpOwogICAgICAgICB9CkBAIC0xNzUsMjAgKzIwNiwyMSBAQAogICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKICAgICAgIH0KIAotICAgICAgLy8gUHJvY2Vzc29yCi0gICAgICBUZXN0SGFuZGxlciB0ZXN0SGFuZGxlciA9Ci0gICAgICAgIG5ldyBUZXN0SGFuZGxlcigpOwotICAgICAgVGhyaWZ0VGVzdC5Qcm9jZXNzb3IgdGVzdFByb2Nlc3NvciA9Ci0gICAgICAgIG5ldyBUaHJpZnRUZXN0LlByb2Nlc3Nvcih0ZXN0SGFuZGxlcik7CisgICAgICAvLyBQcm9jZXNzb3JzCisgICAgICBUZXN0SGFuZGxlciB0ZXN0SGFuZGxlciA9IG5ldyBUZXN0SGFuZGxlcigpOworICAgICAgVGhyaWZ0VGVzdC5Qcm9jZXNzb3IgdGVzdFByb2Nlc3NvciA9IG5ldyBUaHJpZnRUZXN0LlByb2Nlc3Nvcih0ZXN0SGFuZGxlcik7CisKKyAgICAgIFNlY29uZEhhbmRsZXIgc2Vjb25kSGFuZGxlciA9IG5ldyBTZWNvbmRIYW5kbGVyKCk7CisgICAgICBTZWNvbmRTZXJ2aWNlLlByb2Nlc3NvciBzZWNvbmRQcm9jZXNzb3IgPSBuZXcgU2Vjb25kU2VydmljZS5Qcm9jZXNzb3Ioc2Vjb25kSGFuZGxlcik7CiAKICAgICAgIC8vIFByb3RvY29sIGZhY3RvcnkKICAgICAgIFRQcm90b2NvbEZhY3RvcnkgdFByb3RvY29sRmFjdG9yeSA9IG51bGw7Ci0gICAgICBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoImpzb24iKSkgeworICAgICAgaWYgKHByb3RvY29sX3R5cGUuZXF1YWxzKCJqc29uIikgfHwgcHJvdG9jb2xfdHlwZS5lcXVhbHMoIm11bHRpaiIpKSB7CiAgICAgICAgIHRQcm90b2NvbEZhY3RvcnkgPSBuZXcgVEpTT05Qcm90b2NvbC5GYWN0b3J5KCk7Ci0gICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUuZXF1YWxzKCJjb21wYWN0IikpIHsKLSAgICAgICAgdFByb3RvY29sRmFjdG9yeSA9IG5ldyBUQ29tcGFjdFByb3RvY29sLkZhY3RvcnkoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRQcm90b2NvbEZhY3RvcnkgPSBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKTsKKyAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoImNvbXBhY3QiKSB8fCBwcm90b2NvbF90eXBlLmVxdWFscygibXVsdGljIikpIHsKKyAgICAgICAgdFByb3RvY29sRmFjdG9yeSA9IG5ldyBUQ29tcGFjdFByb3RvY29sLkZhY3Rvcnkoc3RyaW5nX2xpbWl0LCBjb250YWluZXJfbGltaXQpOworICAgICAgfSBlbHNlIHsgLy8gYWxzbyBjb3ZlcnMgbXVsdGkKKyAgICAgICAgdFByb3RvY29sRmFjdG9yeSA9IG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeShzdHJpbmdfbGltaXQsIGNvbnRhaW5lcl9saW1pdCk7CiAgICAgICB9CiAKICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IHRUcmFuc3BvcnRGYWN0b3J5ID0gbnVsbDsKQEAgLTIwMyw2ICsyMzUsMTEgQEAKIAogICAgICAgVFNlcnZlciBzZXJ2ZXJFbmdpbmUgPSBudWxsOwogCisgICAgICAvLyBJZiB3ZSBhcmUgbXVsdGlwbGV4aW5nIHNlcnZpY2VzIGluIG9uZSBzZXJ2ZXIuLi4KKyAgICAgIFRNdWx0aXBsZXhlZFByb2Nlc3NvciBtdWx0aXBsZXhlZFByb2Nlc3NvciA9IG5ldyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IoKTsKKyAgICAgIG11bHRpcGxleGVkUHJvY2Vzc29yLnJlZ2lzdGVyRGVmYXVsdCAgKHRlc3RQcm9jZXNzb3IpOworICAgICAgbXVsdGlwbGV4ZWRQcm9jZXNzb3IucmVnaXN0ZXJQcm9jZXNzb3IoIlRocmlmdFRlc3QiLCB0ZXN0UHJvY2Vzc29yKTsKKyAgICAgIG11bHRpcGxleGVkUHJvY2Vzc29yLnJlZ2lzdGVyUHJvY2Vzc29yKCJTZWNvbmRTZXJ2aWNlIiwgc2Vjb25kUHJvY2Vzc29yKTsKIAogICAgICAgaWYgKHNlcnZlcl90eXBlLmVxdWFscygibm9uYmxvY2tpbmciKSB8fAogICAgICAgICAgIHNlcnZlcl90eXBlLmVxdWFscygidGhyZWFkZWQtc2VsZWN0b3IiKSkgewpAQCAtMjEwLDIzICsyNDcsMjEgQEAKICAgICAgICAgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0IHROb25ibG9ja2luZ1NlcnZlclNvY2tldCA9CiAgICAgICAgICAgbmV3IFROb25ibG9ja2luZ1NlcnZlclNvY2tldChuZXcgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0Lk5vbmJsb2NraW5nQWJzdHJhY3RTZXJ2ZXJTb2NrZXRBcmdzKCkucG9ydChwb3J0KSk7CiAKLSAgICAgICAgaWYgKHNlcnZlcl90eXBlLmVxdWFscygibm9uYmxvY2tpbmciKSkgeworICAgICAgICBpZiAoc2VydmVyX3R5cGUuY29udGFpbnMoIm5vbmJsb2NraW5nIikpIHsKICAgICAgICAgICAvLyBOb25ibG9ja2luZyBTZXJ2ZXIKICAgICAgICAgICBUTm9uYmxvY2tpbmdTZXJ2ZXIuQXJncyB0Tm9uYmxvY2tpbmdTZXJ2ZXJBcmdzCiAgICAgICAgICAgICAgID0gbmV3IFROb25ibG9ja2luZ1NlcnZlci5BcmdzKHROb25ibG9ja2luZ1NlcnZlclNvY2tldCk7Ci0gICAgICAgICAgdE5vbmJsb2NraW5nU2VydmVyQXJncy5wcm9jZXNzb3IodGVzdFByb2Nlc3Nvcik7CisgICAgICAgICAgdE5vbmJsb2NraW5nU2VydmVyQXJncy5wcm9jZXNzb3IocHJvdG9jb2xfdHlwZS5zdGFydHNXaXRoKCJtdWx0aSIpID8gbXVsdGlwbGV4ZWRQcm9jZXNzb3IgOiB0ZXN0UHJvY2Vzc29yKTsKICAgICAgICAgICB0Tm9uYmxvY2tpbmdTZXJ2ZXJBcmdzLnByb3RvY29sRmFjdG9yeSh0UHJvdG9jb2xGYWN0b3J5KTsKICAgICAgICAgICB0Tm9uYmxvY2tpbmdTZXJ2ZXJBcmdzLnRyYW5zcG9ydEZhY3RvcnkodFRyYW5zcG9ydEZhY3RvcnkpOwotCiAgICAgICAgICAgc2VydmVyRW5naW5lID0gbmV3IFROb25ibG9ja2luZ1NlcnZlcih0Tm9uYmxvY2tpbmdTZXJ2ZXJBcmdzKTsKICAgICAgICAgfSBlbHNlIHsgLy8gc2VydmVyX3R5cGUuZXF1YWxzKCJ0aHJlYWRlZC1zZWxlY3RvciIpCiAgICAgICAgICAgLy8gVGhyZWFkZWRTZWxlY3RvciBTZXJ2ZXIKICAgICAgICAgICBUVGhyZWFkZWRTZWxlY3RvclNlcnZlci5BcmdzIHRUaHJlYWRlZFNlbGVjdG9yU2VydmVyQXJncwogICAgICAgICAgICAgICA9IG5ldyBUVGhyZWFkZWRTZWxlY3RvclNlcnZlci5BcmdzKHROb25ibG9ja2luZ1NlcnZlclNvY2tldCk7Ci0gICAgICAgICAgdFRocmVhZGVkU2VsZWN0b3JTZXJ2ZXJBcmdzLnByb2Nlc3Nvcih0ZXN0UHJvY2Vzc29yKTsKKyAgICAgICAgICB0VGhyZWFkZWRTZWxlY3RvclNlcnZlckFyZ3MucHJvY2Vzc29yKHByb3RvY29sX3R5cGUuc3RhcnRzV2l0aCgibXVsdGkiKSA/IG11bHRpcGxleGVkUHJvY2Vzc29yIDogdGVzdFByb2Nlc3Nvcik7CiAgICAgICAgICAgdFRocmVhZGVkU2VsZWN0b3JTZXJ2ZXJBcmdzLnByb3RvY29sRmFjdG9yeSh0UHJvdG9jb2xGYWN0b3J5KTsKICAgICAgICAgICB0VGhyZWFkZWRTZWxlY3RvclNlcnZlckFyZ3MudHJhbnNwb3J0RmFjdG9yeSh0VHJhbnNwb3J0RmFjdG9yeSk7Ci0KICAgICAgICAgICBzZXJ2ZXJFbmdpbmUgPSBuZXcgVFRocmVhZGVkU2VsZWN0b3JTZXJ2ZXIodFRocmVhZGVkU2VsZWN0b3JTZXJ2ZXJBcmdzKTsKICAgICAgICAgfQogICAgICAgfSBlbHNlIHsKQEAgLTI0MywyOSArMjc4LDI4IEBACiAgICAgICAgIGlmIChzZXJ2ZXJfdHlwZS5lcXVhbHMoInNpbXBsZSIpKSB7CiAgICAgICAgICAgLy8gU2ltcGxlIFNlcnZlcgogICAgICAgICAgIFRTZXJ2ZXIuQXJncyB0U2VydmVyQXJncyA9IG5ldyBUU2VydmVyLkFyZ3ModFNlcnZlclNvY2tldCk7Ci0gICAgICAgICAgdFNlcnZlckFyZ3MucHJvY2Vzc29yKHRlc3RQcm9jZXNzb3IpOworICAgICAgICAgIHRTZXJ2ZXJBcmdzLnByb2Nlc3Nvcihwcm90b2NvbF90eXBlLnN0YXJ0c1dpdGgoIm11bHRpIikgPyBtdWx0aXBsZXhlZFByb2Nlc3NvciA6IHRlc3RQcm9jZXNzb3IpOwogICAgICAgICAgIHRTZXJ2ZXJBcmdzLnByb3RvY29sRmFjdG9yeSh0UHJvdG9jb2xGYWN0b3J5KTsKICAgICAgICAgICB0U2VydmVyQXJncy50cmFuc3BvcnRGYWN0b3J5KHRUcmFuc3BvcnRGYWN0b3J5KTsKLQogICAgICAgICAgIHNlcnZlckVuZ2luZSA9IG5ldyBUU2ltcGxlU2VydmVyKHRTZXJ2ZXJBcmdzKTsKICAgICAgICAgfSBlbHNlIHsgLy8gc2VydmVyX3R5cGUuZXF1YWxzKCJ0aHJlYWRwb29sIikKICAgICAgICAgICAvLyBUaHJlYWRQb29sIFNlcnZlcgogICAgICAgICAgIFRUaHJlYWRQb29sU2VydmVyLkFyZ3MgdFRocmVhZFBvb2xTZXJ2ZXJBcmdzCiAgICAgICAgICAgICAgID0gbmV3IFRUaHJlYWRQb29sU2VydmVyLkFyZ3ModFNlcnZlclNvY2tldCk7Ci0gICAgICAgICAgdFRocmVhZFBvb2xTZXJ2ZXJBcmdzLnByb2Nlc3Nvcih0ZXN0UHJvY2Vzc29yKTsKKyAgICAgICAgICB0VGhyZWFkUG9vbFNlcnZlckFyZ3MucHJvY2Vzc29yKHByb3RvY29sX3R5cGUuc3RhcnRzV2l0aCgibXVsdGkiKSA/IG11bHRpcGxleGVkUHJvY2Vzc29yIDogdGVzdFByb2Nlc3Nvcik7CiAgICAgICAgICAgdFRocmVhZFBvb2xTZXJ2ZXJBcmdzLnByb3RvY29sRmFjdG9yeSh0UHJvdG9jb2xGYWN0b3J5KTsKICAgICAgICAgICB0VGhyZWFkUG9vbFNlcnZlckFyZ3MudHJhbnNwb3J0RmFjdG9yeSh0VHJhbnNwb3J0RmFjdG9yeSk7Ci0KICAgICAgICAgICBzZXJ2ZXJFbmdpbmUgPSBuZXcgVFRocmVhZFBvb2xTZXJ2ZXIodFRocmVhZFBvb2xTZXJ2ZXJBcmdzKTsKICAgICAgICAgfQogICAgICAgfQogCi0KLSAgICAgIC8vU2V0IHNlcnZlciBldmVudCBoYW5kbGVyCisgICAgICAvLyBTZXQgc2VydmVyIGV2ZW50IGhhbmRsZXIKICAgICAgIHNlcnZlckVuZ2luZS5zZXRTZXJ2ZXJFdmVudEhhbmRsZXIobmV3IFRlc3RTZXJ2ZXJFdmVudEhhbmRsZXIoKSk7CiAKICAgICAgIC8vIFJ1biBpdAotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTdGFydGluZyB0aGUgc2VydmVyIG9uIHBvcnQgIiArIHBvcnQgKyAiLi4uIik7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXJ0aW5nIHRoZSAiICsgKHNzbCA/ICJzc2wgc2VydmVyIiA6ICJzZXJ2ZXIiKSArCisgICAgICAgICIgWyIgKyBwcm90b2NvbF90eXBlICsgIi8iICsgdHJhbnNwb3J0X3R5cGUgKyAiLyIgKyBzZXJ2ZXJfdHlwZSArICJdIG9uICIgKworICAgICAgICAoKGRvbWFpbl9zb2NrZXQgPT0gIiIpID8gKCJwb3J0ICIgKyBwb3J0KSA6ICgidW5peCBzb2NrZXQgIiArIGRvbWFpbl9zb2NrZXQpKSk7CiAgICAgICBzZXJ2ZXJFbmdpbmUuc2VydmUoKTsKIAogICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiB4KSB7CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9SZWFkQ291bnRpbmdUcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1JlYWRDb3VudGluZ1RyYW5zcG9ydC5qYXZhCmluZGV4IDg0NzQxODguLjNjNzQ5ZjkgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1JlYWRDb3VudGluZ1RyYW5zcG9ydC5qYXZhCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1JlYWRDb3VudGluZ1RyYW5zcG9ydC5qYXZhCkBAIC0yMiwyNiArMjIsNDAgQEAKIHB1YmxpYyBjbGFzcyBSZWFkQ291bnRpbmdUcmFuc3BvcnQgZXh0ZW5kcyBUVHJhbnNwb3J0IHsKICAgcHVibGljIGludCByZWFkQ291bnQgPSAwOwogICBwcml2YXRlIFRUcmFuc3BvcnQgdHJhbnM7CisgIHByaXZhdGUgYm9vbGVhbiBvcGVuID0gdHJ1ZTsKIAogICBwdWJsaWMgUmVhZENvdW50aW5nVHJhbnNwb3J0KFRUcmFuc3BvcnQgdW5kZXJseWluZykgewogICAgIHRyYW5zID0gdW5kZXJseWluZzsKICAgfQogCiAgIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBjbG9zZSgpIHt9CisgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgIG9wZW4gPSBmYWxzZTsKKyAgfQogCiAgIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBpc09wZW4oKSB7cmV0dXJuIHRydWU7fQorICBwdWJsaWMgYm9vbGVhbiBpc09wZW4oKSB7CisgICAgcmV0dXJuIG9wZW47CisgIH0KIAogICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgb3BlbigpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHt9CisgIHB1YmxpYyB2b2lkIG9wZW4oKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgb3BlbiA9IHRydWU7CisgIH0KIAogICBAT3ZlcnJpZGUKICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICBpZiAoIWlzT3BlbigpKSB7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLCAiVHJhbnNwb3J0IGlzIGNsb3NlZCIpOworICAgIH0KICAgICByZWFkQ291bnQrKzsKICAgICByZXR1cm4gdHJhbnMucmVhZChidWYsIG9mZiwgbGVuKTsKICAgfQogCiAgIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7fQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIGlmICghaXNPcGVuKCkpIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sICJUcmFuc3BvcnQgaXMgY2xvc2VkIik7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0QXV0b0V4cGFuZGluZ0J1ZmZlci5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdEF1dG9FeHBhbmRpbmdCdWZmZXIuamF2YQppbmRleCAzMzdkY2Y4Li5jMzUzNDg5IDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0QXV0b0V4cGFuZGluZ0J1ZmZlci5qYXZhCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RBdXRvRXhwYW5kaW5nQnVmZmVyLmphdmEKQEAgLTIzLDcgKzIzLDcgQEAKIHB1YmxpYyBjbGFzcyBUZXN0QXV0b0V4cGFuZGluZ0J1ZmZlciBleHRlbmRzIFRlc3RDYXNlIHsKICAgcHVibGljIHZvaWQgdGVzdEV4cGFuZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAvLyBoYXMgZXhwZWN0ZWQgaW5pdGlhbCBjYXBhY2l0eQotICAgIEF1dG9FeHBhbmRpbmdCdWZmZXIgYiA9IG5ldyBBdXRvRXhwYW5kaW5nQnVmZmVyKDEwLCAxLjUpOworICAgIEF1dG9FeHBhbmRpbmdCdWZmZXIgYiA9IG5ldyBBdXRvRXhwYW5kaW5nQnVmZmVyKDEwKTsKICAgICBhc3NlcnRFcXVhbHMoMTAsIGIuYXJyYXkoKS5sZW5ndGgpOwogCiAgICAgLy8gZG9lc24ndCBzaHJpbmsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RBdXRvRXhwYW5kaW5nQnVmZmVyUmVhZFRyYW5zcG9ydC5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdEF1dG9FeHBhbmRpbmdCdWZmZXJSZWFkVHJhbnNwb3J0LmphdmEKaW5kZXggMmUxZjk0Ny4uODNlYmMyZCAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdEF1dG9FeHBhbmRpbmdCdWZmZXJSZWFkVHJhbnNwb3J0LmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdEF1dG9FeHBhbmRpbmdCdWZmZXJSZWFkVHJhbnNwb3J0LmphdmEKQEAgLTMyLDcgKzMyLDcgQEAKICAgfQogCiAgIHB1YmxpYyB2b2lkIHRlc3RJdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIEF1dG9FeHBhbmRpbmdCdWZmZXJSZWFkVHJhbnNwb3J0IHQgPSBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQoMTUwLCAxLjUpOworICAgIEF1dG9FeHBhbmRpbmdCdWZmZXJSZWFkVHJhbnNwb3J0IHQgPSBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQoMTUwKTsKIAogICAgIFRNZW1vcnlJbnB1dFRyYW5zcG9ydCBtZW1idWYgPSBuZXcgVE1lbW9yeUlucHV0VHJhbnNwb3J0KEhVTkRSRURfQllURVMpOwogCmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0QXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0LmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0QXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0LmphdmEKaW5kZXggZDVmMjM5ZC4uODZiNWIwZCAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdEF1dG9FeHBhbmRpbmdCdWZmZXJXcml0ZVRyYW5zcG9ydC5qYXZhCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQuamF2YQpAQCAtMTksMjYgKzE5LDUxIEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKIAogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKIAotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK3B1YmxpYyBjbGFzcyBUZXN0QXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0IHsKIAotcHVibGljIGNsYXNzIFRlc3RBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KKyAgQFRlc3QKICAgcHVibGljIHZvaWQgdGVzdEl0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgQXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0IHQgPSBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0KDEsIDEuNSk7CisgICAgQXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0IHQgPSBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0KDEsIDApOworICAgIGFzc2VydEVxdWFscygwLCB0LmdldExlbmd0aCgpKTsKICAgICBhc3NlcnRFcXVhbHMoMSwgdC5nZXRCdWYoKS5hcnJheSgpLmxlbmd0aCk7CiAgICAgYnl0ZVtdIGIxID0gbmV3IGJ5dGVbXXsxLDIsM307CiAgICAgdC53cml0ZShiMSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDMsIHQuZ2V0UG9zKCkpOworICAgIGFzc2VydEVxdWFscygzLCB0LmdldExlbmd0aCgpKTsKICAgICBhc3NlcnRUcnVlKHQuZ2V0QnVmKCkuYXJyYXkoKS5sZW5ndGggPj0gMyk7CiAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVCdWZmZXIud3JhcChiMSksIEJ5dGVCdWZmZXIud3JhcCh0LmdldEJ1ZigpLmFycmF5KCksIDAsIDMpKTsKIAogICAgIHQucmVzZXQoKTsKKyAgICBhc3NlcnRFcXVhbHMoMCwgdC5nZXRMZW5ndGgoKSk7CiAgICAgYXNzZXJ0VHJ1ZSh0LmdldEJ1ZigpLmFycmF5KCkubGVuZ3RoID49IDMpOwotICAgIGFzc2VydEVxdWFscygwLCB0LmdldFBvcygpKTsKICAgICBieXRlW10gYjIgPSBuZXcgYnl0ZVtdezQsNX07CiAgICAgdC53cml0ZShiMik7Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIHQuZ2V0UG9zKCkpOworICAgIGFzc2VydEVxdWFscygyLCB0LmdldExlbmd0aCgpKTsKICAgICBhc3NlcnRFcXVhbHMoQnl0ZUJ1ZmZlci53cmFwKGIyKSwgQnl0ZUJ1ZmZlci53cmFwKHQuZ2V0QnVmKCkuYXJyYXkoKSwgMCwgMikpOworCisgICAgQXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0IHV1dCA9IG5ldyBBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQoOCwgNCk7CisgICAgYXNzZXJ0RXF1YWxzKDQsIHV1dC5nZXRMZW5ndGgoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDgsIHV1dC5nZXRCdWYoKS5hcnJheSgpLmxlbmd0aCk7CisgICAgdXV0LndyaXRlKGIxKTsKKyAgICBhc3NlcnRFcXVhbHMoNywgdXV0LmdldExlbmd0aCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoOCwgdXV0LmdldEJ1ZigpLmFycmF5KCkubGVuZ3RoKTsKKyAgICBhc3NlcnRFcXVhbHMoQnl0ZUJ1ZmZlci53cmFwKGIxKSwgQnl0ZUJ1ZmZlci53cmFwKHV1dC5nZXRCdWYoKS5hcnJheSgpLCA0LCAzKSk7CisgIH0KKworICBAVGVzdChleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykKKyAgcHVibGljIHZvaWQgdGVzdEJhZEluaXRpYWxTaXplKCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgbmV3IEF1dG9FeHBhbmRpbmdCdWZmZXJXcml0ZVRyYW5zcG9ydCgwLCAwKTsKKyAgfQorCisgIEBUZXN0KGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQorICBwdWJsaWMgdm9pZCB0ZXN0QmFkRnJvbnRSZXNlcnZlU2l6ZSgpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgIG5ldyBBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQoNCwgLTEpOworICB9CisKKyAgQFRlc3QoZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpCisgIHB1YmxpYyB2b2lkIHRlc3RUb29TbWFsbEZyb250UmVzZXJ2ZVNpemUoKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0KDQsIDUpOwogICB9CiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VEJ5dGVCdWZmZXIuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUQnl0ZUJ1ZmZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3MzA3NWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VEJ5dGVCdWZmZXIuamF2YQpAQCAtMCwwICsxLDM2IEBACitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMuQ2hhcnNldHM7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CisKK3B1YmxpYyBjbGFzcyBUZXN0VEJ5dGVCdWZmZXIgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgIHB1YmxpYyB2b2lkIHRlc3RSZWFkV3JpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBUQnl0ZUJ1ZmZlciBieXRlQnVmZmVyID0gbmV3IFRCeXRlQnVmZmVyKEJ5dGVCdWZmZXIuYWxsb2NhdGUoMTYpKTsKKyAgICBieXRlQnVmZmVyLndyaXRlKCJIZWxsbyBXb3JsZCIuZ2V0Qnl0ZXMoQ2hhcnNldHMuVVRGXzgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIkhlbGxvIFdvcmxkIiwgbmV3IFN0cmluZyhieXRlQnVmZmVyLmZsaXAoKS50b0J5dGVBcnJheSgpLCBDaGFyc2V0cy5VVEZfOCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFJldXNlUmVhZFdyaXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgZmluYWwgVEJ5dGVCdWZmZXIgYnl0ZUJ1ZmZlciA9IG5ldyBUQnl0ZUJ1ZmZlcihCeXRlQnVmZmVyLmFsbG9jYXRlKDE2KSk7CisgICAgYnl0ZUJ1ZmZlci53cml0ZSgiSGVsbG8gV29ybGQiLmdldEJ5dGVzKENoYXJzZXRzLlVURl84KSk7CisgICAgYXNzZXJ0RXF1YWxzKCJIZWxsbyBXb3JsZCIsIG5ldyBTdHJpbmcoYnl0ZUJ1ZmZlci5mbGlwKCkudG9CeXRlQXJyYXkoKSwgQ2hhcnNldHMuVVRGXzgpKTsKKworICAgIGJ5dGVCdWZmZXIuY2xlYXIoKTsKKworICAgIGJ5dGVCdWZmZXIud3JpdGUoIkdvb2RieWUgSG9yc2VzIi5nZXRCeXRlcyhDaGFyc2V0cy5VVEZfOCkpOworICAgIGFzc2VydEVxdWFscygiR29vZGJ5ZSBIb3JzZXMiLCBuZXcgU3RyaW5nKGJ5dGVCdWZmZXIuZmxpcCgpLnRvQnl0ZUFycmF5KCksIENoYXJzZXRzLlVURl84KSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0T3ZlcmZsb3coKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBUQnl0ZUJ1ZmZlciBieXRlQnVmZmVyID0gbmV3IFRCeXRlQnVmZmVyKEJ5dGVCdWZmZXIuYWxsb2NhdGUoNCkpOworICAgIHRyeSB7CisgICAgICBieXRlQnVmZmVyLndyaXRlKCJIZWxsbyBXb3JsZCIuZ2V0Qnl0ZXMoQ2hhcnNldHMuVVRGXzgpKTsKKyAgICAgIGZhaWwoIkV4cGVjdGVkIHdyaXRlIG9wZXJhdGlvbiB0byBmYWlsIHdpdGggVFRyYW5zcG9ydEV4Y2VwdGlvbiIpOworICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gZSkgeworICAgICAgYXNzZXJ0RXF1YWxzKCJOb3QgZW5vdWdoIHJvb20gaW4gb3V0cHV0IGJ1ZmZlciIsIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RURmFzdEZyYW1lZFRyYW5zcG9ydC5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRGYXN0RnJhbWVkVHJhbnNwb3J0LmphdmEKaW5kZXggZTAyNDA0OS4uMDZlZTIwNiAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRGYXN0RnJhbWVkVHJhbnNwb3J0LmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRGYXN0RnJhbWVkVHJhbnNwb3J0LmphdmEKQEAgLTE5LDggKzE5LDE1IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKIAogcHVibGljIGNsYXNzIFRlc3RURmFzdEZyYW1lZFRyYW5zcG9ydCBleHRlbmRzIFRlc3RURnJhbWVkVHJhbnNwb3J0IHsKKyAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgSU5JVElBTF9DQVBBQ0lUWSA9IDUwOworCiAgIEBPdmVycmlkZQogICBwcm90ZWN0ZWQgVFRyYW5zcG9ydCBnZXRUcmFuc3BvcnQoVFRyYW5zcG9ydCB1bmRlcmx5aW5nKSB7Ci0gICAgcmV0dXJuIG5ldyBURmFzdEZyYW1lZFRyYW5zcG9ydCh1bmRlcmx5aW5nLCA1MCwgMTAgKiAxMDI0ICogMTAyNCk7CisgICAgcmV0dXJuIG5ldyBURmFzdEZyYW1lZFRyYW5zcG9ydCh1bmRlcmx5aW5nLCBJTklUSUFMX0NBUEFDSVRZLCAxMCAqIDEwMjQgKiAxMDI0KTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgVFRyYW5zcG9ydCBnZXRUcmFuc3BvcnQoVFRyYW5zcG9ydCB1bmRlcmx5aW5nLCBpbnQgbWF4TGVuZ3RoKSB7CisgICAgcmV0dXJuIG5ldyBURmFzdEZyYW1lZFRyYW5zcG9ydCh1bmRlcmx5aW5nLCBJTklUSUFMX0NBUEFDSVRZLCBtYXhMZW5ndGgpOwogICB9CiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VEZyYW1lZFRyYW5zcG9ydC5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRGcmFtZWRUcmFuc3BvcnQuamF2YQppbmRleCA3OGY1OGVjLi5lMzBkNzRiIDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VEZyYW1lZFRyYW5zcG9ydC5qYXZhCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RURnJhbWVkVHJhbnNwb3J0LmphdmEKQEAgLTM0LDYgKzM0LDEwIEBACiAgICAgcmV0dXJuIG5ldyBURnJhbWVkVHJhbnNwb3J0KHVuZGVybHlpbmcpOwogICB9CiAKKyAgcHJvdGVjdGVkIFRUcmFuc3BvcnQgZ2V0VHJhbnNwb3J0KFRUcmFuc3BvcnQgdW5kZXJseWluZywgaW50IG1heExlbmd0aCkgeworICAgIHJldHVybiBuZXcgVEZyYW1lZFRyYW5zcG9ydCh1bmRlcmx5aW5nLCBtYXhMZW5ndGgpOworICB9CisKICAgcHVibGljIHN0YXRpYyBieXRlW10gYnl0ZVNlcXVlbmNlKGludCBzdGFydCwgaW50IGVuZCkgewogICAgIGJ5dGVbXSByZXN1bHQgPSBuZXcgYnl0ZVtlbmQtc3RhcnQrMV07CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gKGVuZC1zdGFydCk7IGkrKykgewpAQCAtNzUsNiArNzksNDAgQEAKICAgICBhc3NlcnRFcXVhbHMoNCwgY291bnRUcmFucy5yZWFkQ291bnQpOwogICB9CiAKKyAgcHVibGljIHZvaWQgdGVzdEludmFsaWRGcmFtZVNpemUoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIGludCBtYXhMZW5ndGggPSAxMjg7CisKKyAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICBEYXRhT3V0cHV0U3RyZWFtIGRvcyA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKGJhb3MpOworICAgIGRvcy53cml0ZUludCgxMzApOworICAgIGRvcy53cml0ZShieXRlU2VxdWVuY2UoMCwgMTI5KSk7CisKKyAgICBUTWVtb3J5QnVmZmVyIG1lbWJ1ZiA9IG5ldyBUTWVtb3J5QnVmZmVyKDApOworICAgIG1lbWJ1Zi53cml0ZShiYW9zLnRvQnl0ZUFycmF5KCkpOworCisgICAgUmVhZENvdW50aW5nVHJhbnNwb3J0IGNvdW50VHJhbnMgPSBuZXcgUmVhZENvdW50aW5nVHJhbnNwb3J0KG1lbWJ1Zik7CisgICAgVFRyYW5zcG9ydCB0cmFucyA9IGdldFRyYW5zcG9ydChjb3VudFRyYW5zLCBtYXhMZW5ndGgpOworCisgICAgYnl0ZVtdIHJlYWRCdWYgPSBuZXcgYnl0ZVsxMF07CisgICAgdHJ5IHsKKyAgICAgIHRyYW5zLnJlYWQocmVhZEJ1ZiwgMCwgNCk7CisgICAgICBmYWlsKCJFeHBlY3RlZCBhIFRUcmFuc3BvcnRFeGNlcHRpb24iKTsKKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIFdlIGV4cGVjdCB0aGlzIGV4Y2VwdGlvbiBiZWNhdXNlIHRoZSBmcmFtZSB3ZSdyZSB0cnlpbmcgdG8gcmVhZCBpcyBsYXJnZXIgdGhhbiBvdXIgbWF4IGZyYW1lIGxlbmd0aAorICAgICAgYXNzZXJ0RXF1YWxzKFRUcmFuc3BvcnRFeGNlcHRpb24uQ09SUlVQVEVEX0RBVEEsIGUuZ2V0VHlwZSgpKTsKKyAgICB9CisKKyAgICBhc3NlcnRGYWxzZSh0cmFucy5pc09wZW4oKSk7CisKKyAgICB0cnkgeworICAgICAgdHJhbnMucmVhZChyZWFkQnVmLCAwLCA0KTsKKyAgICAgIGZhaWwoIkV4cGVjdGVkIGEgVFRyYW5zcG9ydEV4Y2VwdGlvbiIpOworICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gZSkgeworICAgICAgLy8gVGhpcyB0aW1lIHdlIGdldCBhbiBleGNlcHRpb24gaW5kaWNhdGluZyB0aGUgY29ubmVjdGlvbiB3YXMgY2xvc2VkCisgICAgICBhc3NlcnRFcXVhbHMoVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwgZS5nZXRUeXBlKCkpOworICAgIH0KKyAgfQorCiAgIHB1YmxpYyB2b2lkIHRlc3RXcml0ZSgpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgV3JpdGVDb3VudGluZ1RyYW5zcG9ydCBjb3VudGluZ1RyYW5zID0gbmV3IFdyaXRlQ291bnRpbmdUcmFuc3BvcnQobmV3IFRJT1N0cmVhbVRyYW5zcG9ydChuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oYmFvcykpKTsKQEAgLTg3LDExICsxMjUsMTEgQEAKICAgICBhc3NlcnRFcXVhbHMoMCwgY291bnRpbmdUcmFucy53cml0ZUNvdW50KTsKIAogICAgIHRyYW5zLmZsdXNoKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIGNvdW50aW5nVHJhbnMud3JpdGVDb3VudCk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIGNvdW50aW5nVHJhbnMud3JpdGVDb3VudCk7CiAKICAgICB0cmFucy53cml0ZShieXRlU2VxdWVuY2UoMCwgMjQ1KSk7CiAgICAgdHJhbnMuZmx1c2goKTsKLSAgICBhc3NlcnRFcXVhbHMoNCwgY291bnRpbmdUcmFucy53cml0ZUNvdW50KTsKKyAgICBhc3NlcnRFcXVhbHMoMiwgY291bnRpbmdUcmFucy53cml0ZUNvdW50KTsKIAogICAgIERhdGFJbnB1dFN0cmVhbSBkaW4gPSBuZXcgRGF0YUlucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKICAgICBhc3NlcnRFcXVhbHMoMjU2LCBkaW4ucmVhZEludCgpKTsKQEAgLTE0NSw0ICsxODMsMzIgQEAKICAgICBhc3NlcnRFcXVhbHMoNjUsIHRyYW5zLmdldEJ5dGVzUmVtYWluaW5nSW5CdWZmZXIoKSk7CiAgICAgYXNzZXJ0RXF1YWxzKDEwLCB0cmFucy5nZXRCdWZmZXJQb3NpdGlvbigpKTsKICAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RDbGVhcigpIHRocm93cyBJT0V4Y2VwdGlvbiwgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgRGF0YU91dHB1dFN0cmVhbSBkb3MgPSBuZXcgRGF0YU91dHB1dFN0cmVhbShiYW9zKTsKKyAgICBkb3Mud3JpdGVJbnQoMjIwKTsKKyAgICBkb3Mud3JpdGUoYnl0ZVNlcXVlbmNlKDAsIDIxOSkpOworCisgICAgVE1lbW9yeUJ1ZmZlciBtZW1idWYgPSBuZXcgVE1lbW9yeUJ1ZmZlcigwKTsKKyAgICBtZW1idWYud3JpdGUoYmFvcy50b0J5dGVBcnJheSgpKTsKKworICAgIFJlYWRDb3VudGluZ1RyYW5zcG9ydCBjb3VudFRyYW5zID0gbmV3IFJlYWRDb3VudGluZ1RyYW5zcG9ydChtZW1idWYpOworICAgIFRUcmFuc3BvcnQgdHJhbnMgPSBnZXRUcmFuc3BvcnQoY291bnRUcmFucyk7CisKKyAgICBieXRlW10gcmVhZEJ1ZiA9IG5ldyBieXRlWzIyMF07CisgICAgdHJhbnMucmVhZChyZWFkQnVmLCAwLCAyMjApOworICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhyZWFkQnVmLCBieXRlU2VxdWVuY2UoMCwyMTkpKSk7CisKKyAgICBhc3NlcnRUcnVlKHRyYW5zIGluc3RhbmNlb2YgVEZyYW1lZFRyYW5zcG9ydCB8fCB0cmFucyBpbnN0YW5jZW9mIFRGYXN0RnJhbWVkVHJhbnNwb3J0KTsKKyAgICBpZiAodHJhbnMgaW5zdGFuY2VvZiBURnJhbWVkVHJhbnNwb3J0KSB7CisgICAgICBhc3NlcnRUcnVlKHRyYW5zLmdldEJ1ZmZlcigpICE9IG51bGwgJiYgdHJhbnMuZ2V0QnVmZmVyKCkubGVuZ3RoID4gMCk7CisgICAgICAoKFRGcmFtZWRUcmFuc3BvcnQpIHRyYW5zKS5jbGVhcigpOworICAgICAgYXNzZXJ0VHJ1ZSh0cmFucy5nZXRCdWZmZXIoKSA9PSBudWxsKTsKKyAgICB9IGVsc2UgaWYgKHRyYW5zIGluc3RhbmNlb2YgVEZhc3RGcmFtZWRUcmFuc3BvcnQpIHsKKyAgICAgIGFzc2VydFRydWUodHJhbnMuZ2V0QnVmZmVyKCkubGVuZ3RoID4gVGVzdFRGYXN0RnJhbWVkVHJhbnNwb3J0LklOSVRJQUxfQ0FQQUNJVFkpOworICAgICAgKChURmFzdEZyYW1lZFRyYW5zcG9ydCkgdHJhbnMpLmNsZWFyKCk7CisgICAgICBhc3NlcnRUcnVlKHRyYW5zLmdldEJ1ZmZlcigpLmxlbmd0aCA9PSBUZXN0VEZhc3RGcmFtZWRUcmFuc3BvcnQuSU5JVElBTF9DQVBBQ0lUWSk7CisgICAgfQorICB9CiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNTTFRyYW5zcG9ydEZhY3RvcnkuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUU1NMVHJhbnNwb3J0RmFjdG9yeS5qYXZhCmluZGV4IDQ3ODQwN2EuLjAzMmMyZWIgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUU1NMVHJhbnNwb3J0RmFjdG9yeS5qYXZhCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUU1NMVHJhbnNwb3J0RmFjdG9yeS5qYXZhCkBAIC00NSw2ICs0NSwxMCBAQAogICB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICByZXR1cm4gVFNTTFRyYW5zcG9ydEZhY3RvcnkuZ2V0Q2xpZW50U29ja2V0KEhPU1QsIFBPUlQpOwogICB9CisgIAorICBwcm90ZWN0ZWQgVFNlcnZlclNvY2tldCBnZXRTZXJ2ZXJUcmFuc3BvcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gVFNTTFRyYW5zcG9ydEZhY3RvcnkuZ2V0U2VydmVyU29ja2V0KFBPUlQpOworICB9CiAKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHN0YXJ0U2VydmVyKGZpbmFsIFRQcm9jZXNzb3IgcHJvY2Vzc29yLCBmaW5hbCBUUHJvdG9jb2xGYWN0b3J5IHByb3RvRmFjdG9yeSwgZmluYWwgVFRyYW5zcG9ydEZhY3RvcnkgZmFjdG9yeSkKQEAgLTUyLDExICs1NiwxMSBAQAogICAgIHNlcnZlclRocmVhZCA9IG5ldyBUaHJlYWQoKSB7CiAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQgPSBUU1NMVHJhbnNwb3J0RmFjdG9yeS5nZXRTZXJ2ZXJTb2NrZXQoUE9SVCk7CisgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQgPSBnZXRTZXJ2ZXJUcmFuc3BvcnQoKTsKICAgICAgICAgICBmaW5hbCBBcmdzIGFyZ3MgPSBuZXcgQXJncyhzZXJ2ZXJUcmFuc3BvcnQpLnByb2Nlc3Nvcihwcm9jZXNzb3IpOwogICAgICAgICAgIHNlcnZlciA9IG5ldyBUU2ltcGxlU2VydmVyKGFyZ3MpOwogICAgICAgICAgIHNlcnZlci5zZXJ2ZSgpOwotICAgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwogICAgICAgICAgIGFzc2VydCBmYWxzZTsKICAgICAgICAgfQpAQCAtNjQsNyArNjgsNyBAQAogICAgIH07CiAKICAgICBzZXJ2ZXJUaHJlYWQuc3RhcnQoKTsKLSAgICBUaHJlYWQuc2xlZXAoMTAwMCk7CisgICAgVGhyZWFkLnNsZWVwKFNMRUVQX0RFTEFZKTsKICAgfQogCiAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRTU0xUcmFuc3BvcnRGYWN0b3J5U3RyZWFtZWRTdG9yZS5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRTU0xUcmFuc3BvcnRGYWN0b3J5U3RyZWFtZWRTdG9yZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YmY1Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNTTFRyYW5zcG9ydEZhY3RvcnlTdHJlYW1lZFN0b3JlLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworCitwdWJsaWMgY2xhc3MgVGVzdFRTU0xUcmFuc3BvcnRGYWN0b3J5U3RyZWFtZWRTdG9yZSBleHRlbmRzIFRlc3RUU1NMVHJhbnNwb3J0RmFjdG9yeSB7CisgIHByaXZhdGUgc3RhdGljIFN0cmluZyBrZXlTdG9yZUxvY2F0aW9uID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZheC5uZXQuc3NsLmtleVN0b3JlIik7CisgIHByaXZhdGUgc3RhdGljIFN0cmluZyB0cnVzdFN0b3JlTG9jYXRpb24gPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmF4Lm5ldC5zc2wudHJ1c3RTdG9yZSIpOworICAKKyAgcHVibGljIFRlc3RUU1NMVHJhbnNwb3J0RmFjdG9yeVN0cmVhbWVkU3RvcmUoKSB7CisgICAgc3VwZXIoKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiAgT3ZlcnJpZGUgc3lzdGVtIHByb3BlcnRpZXMgdG8gYmUgYWJsZSB0byB0ZXN0IHBhc3NpbmcKKyAgICAgKiAgdGhlIHRydXN0U3RvcmUgYW5kIGtleVN0b3JlIGFzIGlucHV0IHN0cmVhbQorICAgICAqLworICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YXgubmV0LnNzbC50cnVzdFN0b3JlIiwgIiIpOworICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YXgubmV0LnNzbC5rZXlTdG9yZSIsICIiKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgVFRyYW5zcG9ydCBnZXRDbGllbnRUcmFuc3BvcnQoVFRyYW5zcG9ydCB1bmRlcmx5aW5nVHJhbnNwb3J0KQorICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUU1NMVHJhbnNwb3J0RmFjdG9yeS5UU1NMVHJhbnNwb3J0UGFyYW1ldGVycyBwYXJhbXMgPSBuZXcKKyAgICAgIFRTU0xUcmFuc3BvcnRGYWN0b3J5LlRTU0xUcmFuc3BvcnRQYXJhbWV0ZXJzKCk7CisKKyAgICBwYXJhbXMuc2V0VHJ1c3RTdG9yZShuZXcgRmlsZUlucHV0U3RyZWFtKHRydXN0U3RvcmVMb2NhdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJqYXZheC5uZXQuc3NsLnRydXN0U3RvcmVQYXNzd29yZCIpKTsKKyAgICAKKyAgICByZXR1cm4gVFNTTFRyYW5zcG9ydEZhY3RvcnkuZ2V0Q2xpZW50U29ja2V0KEhPU1QsIFBPUlQsIDAvKnRpbWVvdXQqLywgcGFyYW1zKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgVFNlcnZlclNvY2tldCBnZXRTZXJ2ZXJUcmFuc3BvcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUU1NMVHJhbnNwb3J0RmFjdG9yeS5UU1NMVHJhbnNwb3J0UGFyYW1ldGVycyBwYXJhbXMgPSBuZXcKKyAgICAgICAgVFNTTFRyYW5zcG9ydEZhY3RvcnkuVFNTTFRyYW5zcG9ydFBhcmFtZXRlcnMoKTsKKyAgICAKKyAgICBwYXJhbXMuc2V0S2V5U3RvcmUobmV3IEZpbGVJbnB1dFN0cmVhbShrZXlTdG9yZUxvY2F0aW9uKSwgCisgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YXgubmV0LnNzbC5rZXlTdG9yZVBhc3N3b3JkIikpOworICAgIAorICAgIHJldHVybiBUU1NMVHJhbnNwb3J0RmFjdG9yeS5nZXRTZXJ2ZXJTb2NrZXQoUE9SVCwgMC8qdGltZW91dCovLCBJbmV0QWRkcmVzcy5nZXRCeU5hbWUoSE9TVCksIHBhcmFtcyk7CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNhc2xUcmFuc3BvcnRzLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNhc2xUcmFuc3BvcnRzLmphdmEKaW5kZXggNzg4Mzk1Zi4uMzZhMDZlOSAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRTYXNsVHJhbnNwb3J0cy5qYXZhCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUU2FzbFRyYW5zcG9ydHMuamF2YQpAQCAtMjAsNiArMjAsNyBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCkBAIC0zMzIsMTIgKzMzMyw4IEBACiAgICAgICAgIHRocm93IG5ldyBTYXNsRXhjZXB0aW9uKCJBbHJlYWR5IGNvbXBsZXRlISIpOwogICAgICAgfQogCi0gICAgICB0cnkgewotICAgICAgICBoYXNQcm92aWRlZEluaXRpYWxSZXNwb25zZSA9IHRydWU7Ci0gICAgICAgIHJldHVybiB1c2VybmFtZS5nZXRCeXRlcygiVVRGLTgiKTsKLSAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgdGhyb3cgbmV3IFNhc2xFeGNlcHRpb24oZS50b1N0cmluZygpKTsKLSAgICAgIH0KKyAgICAgIGhhc1Byb3ZpZGVkSW5pdGlhbFJlc3BvbnNlID0gdHJ1ZTsKKyAgICAgIHJldHVybiB1c2VybmFtZS5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKICAgICB9CiAgICAgcHVibGljIGJvb2xlYW4gaXNDb21wbGV0ZSgpIHsgcmV0dXJuIGhhc1Byb3ZpZGVkSW5pdGlhbFJlc3BvbnNlOyB9CiAgICAgcHVibGljIGJ5dGVbXSB1bndyYXAoYnl0ZVtdIGluY29taW5nLCBpbnQgb2Zmc2V0LCBpbnQgbGVuKSB7CkBAIC0zNTQsMTEgKzM1MSw3IEBACiAgICAgcHJpdmF0ZSBTdHJpbmcgdXNlcjsKICAgICBwdWJsaWMgU3RyaW5nIGdldE1lY2hhbmlzbU5hbWUoKSB7IHJldHVybiAiQU5PTllNT1VTIjsgfQogICAgIHB1YmxpYyBieXRlW10gZXZhbHVhdGVSZXNwb25zZShieXRlW10gcmVzcG9uc2UpIHRocm93cyBTYXNsRXhjZXB0aW9uIHsKLSAgICAgIHRyeSB7Ci0gICAgICAgIHRoaXMudXNlciA9IG5ldyBTdHJpbmcocmVzcG9uc2UsICJVVEYtOCIpOwotICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBuZXcgU2FzbEV4Y2VwdGlvbihlLnRvU3RyaW5nKCkpOwotICAgICAgfQorICAgICAgdGhpcy51c2VyID0gbmV3IFN0cmluZyhyZXNwb25zZSwgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CiAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAgICAgcHVibGljIGJvb2xlYW4gaXNDb21wbGV0ZSgpIHsgcmV0dXJuIHVzZXIgIT0gbnVsbDsgfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRTaW1wbGVGaWxlVHJhbnNwb3J0LmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNpbXBsZUZpbGVUcmFuc3BvcnQuamF2YQppbmRleCA1ZDJmYjQ1Li43Yjg4MGY0IDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNpbXBsZUZpbGVUcmFuc3BvcnQuamF2YQorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNpbXBsZUZpbGVUcmFuc3BvcnQuamF2YQpAQCAtMjcsMjEgKzI3LDIxIEBACiAgIHB1YmxpYyB2b2lkIHRlc3RGcmVzaCgpIHRocm93cyBFeGNlcHRpb24gewogICAgIC8vVGVzdCB3cml0ZSBzaWRlCiAgICAgUGF0aCB0ZW1wRmlsZVBhdGhOYW1lID0gRmlsZXMuY3JlYXRlVGVtcEZpbGUoIlRTaW1wbGVGaWxlVHJhbnNwb3J0VGVzdCIsIG51bGwpOwotICAgIEZpbGVzLmRlbGV0ZSh0ZW1wRmlsZVBhdGhOYW1lKTsgICAgICAgIAorICAgIEZpbGVzLmRlbGV0ZSh0ZW1wRmlsZVBhdGhOYW1lKTsKICAgICBieXRlW10gaW5wdXRfYnVmID0gbmV3IGJ5dGVbXXsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMH07CiAgICAgVFNpbXBsZUZpbGVUcmFuc3BvcnQgdHJhbnNfd3JpdGUgPSBuZXcgVFNpbXBsZUZpbGVUcmFuc3BvcnQodGVtcEZpbGVQYXRoTmFtZS50b1N0cmluZygpLGZhbHNlLCB0cnVlLCBmYWxzZSk7CiAgICAgYXNzZXJ0ICghdHJhbnNfd3JpdGUuaXNPcGVuKCkpOwogICAgIHRyYW5zX3dyaXRlLm9wZW4oKTsKICAgICBhc3NlcnQodHJhbnNfd3JpdGUuaXNPcGVuKCkpOwogICAgIHRyYW5zX3dyaXRlLndyaXRlKGlucHV0X2J1Zik7Ci0gICAgdHJhbnNfd3JpdGUud3JpdGUoaW5wdXRfYnVmLDIsMik7ICAgIAorICAgIHRyYW5zX3dyaXRlLndyaXRlKGlucHV0X2J1ZiwyLDIpOwogICAgIHRyYW5zX3dyaXRlLmZsdXNoKCk7CiAgICAgdHJhbnNfd3JpdGUuY2xvc2UoKTsKLSAgICAKKwogICAgIC8vVGVzdCByZWFkIHNpZGUKICAgICBUU2ltcGxlRmlsZVRyYW5zcG9ydCB0cmFucyA9IG5ldyBUU2ltcGxlRmlsZVRyYW5zcG9ydCh0ZW1wRmlsZVBhdGhOYW1lLnRvU3RyaW5nKCksdHJ1ZSwgZmFsc2UpOwotICAgIGFzc2VydCh0cmFuc193cml0ZS5pc09wZW4oKSk7Ci0gICAgCisgICAgYXNzZXJ0KHRyYW5zLmlzT3BlbigpKTsKKwogICAgIC8vU2ltcGxlIGZpbGUgdHJhbnMgcHJvdmlkZXMgbm8gYnVmZmVyIGFjY2VzcwogICAgIGFzc2VydCgwID09IHRyYW5zLmdldEJ1ZmZlclBvc2l0aW9uKCkpOwogICAgIGFzc2VydChudWxsID09IHRyYW5zLmdldEJ1ZmZlcigpKTsKQEAgLTU2LDE5ICs1NiwxOSBAQAogICAgIHRyYW5zLnJlYWRBbGwoYnVmMSwgMCwgQlVGU0laKTsKICAgICBhc3NlcnQoQlVGU0laID09IHRyYW5zLmdldEZpbGVQb2ludGVyKCkpOwogICAgIGFzc2VydChBcnJheXMuZXF1YWxzKG5ldyBieXRlW117MSwgMiwgMywgNH0sIGJ1ZjEpKTsKLSAgICAKKwogICAgIGludCBieXRlc1JlYWQgPSB0cmFucy5yZWFkKGJ1ZjEsIDAsIEJVRlNJWik7CiAgICAgYXNzZXJ0KGJ5dGVzUmVhZCA+IDApOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnl0ZXNSZWFkOyArK2kpIHsKLSAgICAgIGFzc2VydChidWYxW2ldID09IGkrNSk7ICAgIAorICAgICAgYXNzZXJ0KGJ1ZjFbaV0gPT0gaSs1KTsKICAgICB9Ci0gICAgCisKICAgICB0cmFucy5zZWVrKDApOwogICAgIGFzc2VydCgwID09IHRyYW5zLmdldEZpbGVQb2ludGVyKCkpOwogICAgIHRyYW5zLnJlYWRBbGwoYnVmMSwgMCwgQlVGU0laKTsKICAgICBhc3NlcnQoQXJyYXlzLmVxdWFscyhuZXcgYnl0ZVtdezEsIDIsIDMsIDR9LCBidWYxKSk7CiAgICAgYXNzZXJ0KEJVRlNJWiA9PSB0cmFucy5nZXRGaWxlUG9pbnRlcigpKTsKICAgICB0cmFucy5jbG9zZSgpOwotICAgIEZpbGVzLmRlbGV0ZSh0ZW1wRmlsZVBhdGhOYW1lKTsgICAgICAKKyAgICBGaWxlcy5kZWxldGUodGVtcEZpbGVQYXRoTmFtZSk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUWmxpYlRyYW5zcG9ydC5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRabGliVHJhbnNwb3J0LmphdmEKaW5kZXggZmU4ZGQ1MS4uM2Q3ZjljMSAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRabGliVHJhbnNwb3J0LmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRabGliVHJhbnNwb3J0LmphdmEKQEAgLTE4LDE0ICsxOCwxOSBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKIAotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5EYXRhSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5EYXRhT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuemlwLkRhdGFGb3JtYXRFeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLnppcC5EZWZsYXRlck91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLnV0aWwuemlwLkluZmxhdGVySW5wdXRTdHJlYW07CiAKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKIHB1YmxpYyBjbGFzcyBUZXN0VFpsaWJUcmFuc3BvcnQgZXh0ZW5kcyBUZXN0Q2FzZSB7CiAKICAgcHJvdGVjdGVkIFRUcmFuc3BvcnQgZ2V0VHJhbnNwb3J0KFRUcmFuc3BvcnQgdW5kZXJseWluZykgewpAQCAtNTAsNiArNTUsMjEgQEAKICAgICB0cmFucy5jbG9zZSgpOwogICB9CiAKKyAgcHVibGljIHZvaWQgdGVzdENsb3NlT3BlbigpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICBUVHJhbnNwb3J0IHRyYW5zID0gZ2V0VHJhbnNwb3J0KG5ldyBUSU9TdHJlYW1UcmFuc3BvcnQoYmFvcykpOworICAgIGJ5dGVbXSB1bmNvbXByZXNzZWQgPSBieXRlU2VxdWVuY2UoMCwgMjQ1KTsKKyAgICB0cmFucy53cml0ZSh1bmNvbXByZXNzZWQpOworICAgIHRyYW5zLmNsb3NlKCk7CisgICAgZmluYWwgYnl0ZVtdIGNvbXByZXNzZWQgPSBiYW9zLnRvQnl0ZUFycmF5KCk7CisKKyAgICBmaW5hbCBieXRlW10gYnVmID0gbmV3IGJ5dGVbMjU1XTsKKyAgICBUVHJhbnNwb3J0IHRyYW5zUmVhZCA9IGdldFRyYW5zcG9ydChuZXcgVElPU3RyZWFtVHJhbnNwb3J0KG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShjb21wcmVzc2VkKSkpOworICAgIGludCByZWFkQnl0ZXMgPSB0cmFuc1JlYWQucmVhZChidWYsIDAsIGJ1Zi5sZW5ndGgpOworICAgIGFzc2VydEVxdWFscyh1bmNvbXByZXNzZWQubGVuZ3RoLCByZWFkQnl0ZXMpOworICAgIHRyYW5zUmVhZC5jbG9zZSgpOworICB9CisKICAgcHVibGljIHZvaWQgdGVzdFJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFRUcmFuc3BvcnRFeGNlcHRpb24gewogICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgIERlZmxhdGVyT3V0cHV0U3RyZWFtIGRlZmxhdGVyT3V0cHV0U3RyZWFtID0gbmV3IERlZmxhdGVyT3V0cHV0U3RyZWFtKGJhb3MpOwpkaWZmIC0tZ2l0IGEvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5qYXZhIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5qYXZhCmluZGV4IGRlNzA4NmYuLmQzOTE2ODYgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuamF2YQorKysgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmphdmEKQEAgLTE5LDYgKzE5LDcgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKIAoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5TdGFjazsKIApAQCAtMzQ4LDYgKzM0OSw0NyBAQAogICAgIH0KICAgfQogCisgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNIaWdoU3Vycm9nYXRlKGNoYXIgYykgeworICAgIHJldHVybiBjID49ICdcdUQ4MDAnICYmIGMgPD0gJ1x1REJGRic7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTG93U3Vycm9nYXRlKGNoYXIgYykgeworICAgIHJldHVybiBjID49ICdcdURDMDAnICYmIGMgPD0gJ1x1REZGRic7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBieXRlW10gdG9VVEY4KGludCBjb2RlcG9pbnQpIHsKKyAgICBmaW5hbCBpbnRbXSBGSVJTVF9CWVRFX01BU0sgPSB7IDAsIDB4YzAsIDB4ZTAsIDB4ZjAgfTsKKyAgICBpbnQgbGVuZ3RoID0gMDsKKyAgICBpZiAoY29kZXBvaW50IDw9IDB4N2YpIGxlbmd0aCA9IDE7CisgICAgZWxzZSBpZiAoY29kZXBvaW50IDw9IDB4N2ZmKSBsZW5ndGggPSAyOworICAgIGVsc2UgaWYgKGNvZGVwb2ludCA8PSAweGZmZmYpIGxlbmd0aCA9IDM7CisgICAgZWxzZSBpZiAoY29kZXBvaW50IDw9IDB4MWZmZmZmKSBsZW5ndGggPSA0OworICAgIGVsc2UgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNvZGUgcG9pbnQgb3ZlciBVKzFGRkZGRiBpcyBub3Qgc3VwcG9ydGVkIik7CisKKyAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVtsZW5ndGhdOworICAgIHN3aXRjaCAobGVuZ3RoKSB7CisgICAgY2FzZSA0OgorICAgICAgYnl0ZXNbM10gPSAoYnl0ZSkoKGNvZGVwb2ludCAmIDB4M2YpIHwgMHg4MCk7CisgICAgICBjb2RlcG9pbnQgPj49IDY7CisgICAgY2FzZSAzOgorICAgICAgYnl0ZXNbMl0gPSAoYnl0ZSkoKGNvZGVwb2ludCAmIDB4M2YpIHwgMHg4MCk7CisgICAgICBjb2RlcG9pbnQgPj49IDY7CisgICAgY2FzZSAyOgorICAgICAgYnl0ZXNbMV0gPSAoYnl0ZSkoKGNvZGVwb2ludCAmIDB4M2YpIHwgMHg4MCk7CisgICAgICBjb2RlcG9pbnQgPj49IDY7CisgICAgY2FzZSAxOgorICAgICAgYnl0ZXNbMF0gPSAoYnl0ZSkoY29kZXBvaW50IHwgRklSU1RfQllURV9NQVNLW2xlbmd0aCAtIDFdKTsKKyAgICB9CisKKyAgICByZXR1cm4gYnl0ZXM7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBieXRlW10gdG9VVEY4KGludCBoaWdoLCBpbnQgbG93KSB7CisgICAgaW50IGNvZGVwb2ludCA9ICgxIDw8IDE2KSArICgoaGlnaCAmIDB4M2ZmKSA8PCAxMCk7CisgICAgY29kZXBvaW50ICs9IGxvdyAmIDB4M2ZmOworICAgIHJldHVybiB0b1VURjgoY29kZXBvaW50KTsKKyAgfQorCiAgIC8vIFdyaXRlIHRoZSBieXRlcyBpbiBhcnJheSBidWYgYXMgYSBKU09OIGNoYXJhY3RlcnMsIGVzY2FwaW5nIGFzIG5lZWRlZAogICBwcml2YXRlIHZvaWQgd3JpdGVKU09OU3RyaW5nKGJ5dGVbXSBiKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgY29udGV4dF8ud3JpdGUoKTsKQEAgLTU5Niw2ICs2MzgsNyBAQAogICBwcml2YXRlIFRCeXRlQXJyYXlPdXRwdXRTdHJlYW0gcmVhZEpTT05TdHJpbmcoYm9vbGVhbiBza2lwQ29udGV4dCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIFRCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYXJyID0gbmV3IFRCeXRlQXJyYXlPdXRwdXRTdHJlYW0oREVGX1NUUklOR19TSVpFKTsKKyAgICBpbnQgaGlnaFN1cnJvZ2F0ZSA9IDA7CiAgICAgaWYgKCFza2lwQ29udGV4dCkgewogICAgICAgY29udGV4dF8ucmVhZCgpOwogICAgIH0KQEAgLTYwOCwxMCArNjUxLDQyIEBACiAgICAgICBpZiAoY2ggPT0gRVNDU0VRWzBdKSB7CiAgICAgICAgIGNoID0gcmVhZGVyXy5yZWFkKCk7CiAgICAgICAgIGlmIChjaCA9PSBFU0NTRVFbMV0pIHsKLSAgICAgICAgICByZWFkSlNPTlN5bnRheENoYXIoWkVSTyk7Ci0gICAgICAgICAgcmVhZEpTT05TeW50YXhDaGFyKFpFUk8pOwotICAgICAgICAgIHRyYW5zXy5yZWFkQWxsKHRtcGJ1Zl8sIDAsIDIpOwotICAgICAgICAgIGNoID0gKGJ5dGUpKChoZXhWYWwodG1wYnVmX1swXSkgPDwgNCkgKyBoZXhWYWwodG1wYnVmX1sxXSkpOworICAgICAgICAgIHRyYW5zXy5yZWFkQWxsKHRtcGJ1Zl8sIDAsIDQpOworICAgICAgICAgIHNob3J0IGN1ID0gKHNob3J0KSgKKyAgICAgICAgICAgICAgKChzaG9ydCloZXhWYWwodG1wYnVmX1swXSkgPDwgMTIpICsKKyAgICAgICAgICAgICAgKChzaG9ydCloZXhWYWwodG1wYnVmX1sxXSkgPDwgOCkgKworICAgICAgICAgICAgICAoKHNob3J0KWhleFZhbCh0bXBidWZfWzJdKSA8PCA0KSArCisgICAgICAgICAgICAgIChzaG9ydCloZXhWYWwodG1wYnVmX1szXSkpOworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoaXNIaWdoU3Vycm9nYXRlKChjaGFyKWN1KSkgeworICAgICAgICAgICAgICBpZiAoaGlnaFN1cnJvZ2F0ZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgbG93IHN1cnJvZ2F0ZSBjaGFyIik7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaGlnaFN1cnJvZ2F0ZSA9IGN1OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoaXNMb3dTdXJyb2dhdGUoKGNoYXIpY3UpKSB7CisgICAgICAgICAgICAgIGlmIChoaWdoU3Vycm9nYXRlID09IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBoaWdoIHN1cnJvZ2F0ZSBjaGFyIik7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBhcnIud3JpdGUodG9VVEY4KGhpZ2hTdXJyb2dhdGUsIGN1KSk7CisgICAgICAgICAgICAgIGhpZ2hTdXJyb2dhdGUgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgIGFyci53cml0ZSh0b1VURjgoY3UpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgICBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uTk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICJKVk0gZG9lcyBub3Qgc3VwcG9ydCBVVEYtOCIpOworICAgICAgICAgIH0KKyAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAiSW52YWxpZCB1bmljb2RlIHNlcXVlbmNlIik7CisgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGVsc2UgewogICAgICAgICAgIGludCBvZmYgPSBFU0NBUEVfQ0hBUlMuaW5kZXhPZihjaCk7CkBAIC02MjQsNiArNjk5LDExIEBACiAgICAgICB9CiAgICAgICBhcnIud3JpdGUoY2gpOwogICAgIH0KKworICAgIGlmIChoaWdoU3Vycm9nYXRlICE9IDApIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAiRXhwZWN0ZWQgbG93IHN1cnJvZ2F0ZSBjaGFyIik7CisgICAgfQogICAgIHJldHVybiBhcnI7CiAgIH0KIApAQCAtNzIyLDYgKzgwMiwxMSBAQAogICAgIGludCBsZW4gPSBhcnIubGVuKCk7CiAgICAgaW50IG9mZiA9IDA7CiAgICAgaW50IHNpemUgPSAwOworICAgIC8vIElnbm9yZSBwYWRkaW5nCisgICAgaW50IGJvdW5kID0gbGVuID49IDIgPyBsZW4gLSAyIDogMDsKKyAgICBmb3IgKGludCBpID0gbGVuIC0gMTsgaSA+PSBib3VuZCAmJiBiW2ldID09ICc9JzsgLS1pKSB7CisgICAgICAtLWxlbjsKKyAgICB9CiAgICAgd2hpbGUgKGxlbiA+PSA0KSB7CiAgICAgICAvLyBEZWNvZGUgNCBieXRlcyBhdCBhIHRpbWUKICAgICAgIFRCYXNlNjRVdGlscy5kZWNvZGUoYiwgb2ZmLCA0LCBiLCBzaXplKTsgLy8gTkI6IGRlY29kZWQgaW4gcGxhY2UKZGlmZiAtLWdpdCBhL2xpYi9qcy9HcnVudGZpbGUuanMgYi9saWIvanMvR3J1bnRmaWxlLmpzCmluZGV4IDMyYzg4MzQuLmIzMmEwMTYgMTAwNjQ0Ci0tLSBhL2xpYi9qcy9HcnVudGZpbGUuanMKKysrIGIvbGliL2pzL0dydW50ZmlsZS5qcwpAQCAtMyw2ICszLDcgQEAKIC8vUHJlcmVxdWlzaXRlczoKIC8vIE5vZGUgU2V0dXAgLSAgIG5vZGVqcy5vcmcKIC8vIEdydW50IFNldHVwIC0gIG5wbSBpbnN0YWxsICAvL3JlYWRzIHRoZSAuL3BhY2thZ2UuanNvbiBhbmQgaW5zdGFsbHMgcHJvamVjdCBkZXBlbmRlbmNpZXMKKy8vIFJ1biBncnVudCAtICAgIG5weCBncnVudCAgLy8gdXNlcyBwcm9qZWN0LWxvY2FsIGluc3RhbGxlZCB2ZXJzaW9uIG9mIGdydW50IChmcm9tIHBhY2thZ2UuanNvbikKIAogbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihncnVudCkgewogICAndXNlIHN0cmljdCc7CkBAIC0zOCwxMTIgKzM5LDIxNiBAQAogICAgIH0sCiAgICAgc2hlbGw6IHsKICAgICAgIEluc3RhbGxUaHJpZnRKUzogewotICAgICAgICBjb21tYW5kOiAnbWtkaXIgdGVzdC9idWlsZDsgbWtkaXIgdGVzdC9idWlsZC9qczsgY3Agc3JjL3RocmlmdC5qcyB0ZXN0L2J1aWxkL2pzL3RocmlmdC5qcycKKyAgICAgICAgY29tbWFuZDogJ21rZGlyIC1wIHRlc3QvYnVpbGQvanMvbGliOyBjcCBzcmMvdGhyaWZ0LmpzIHRlc3QvYnVpbGQvanMvdGhyaWZ0LmpzJwogICAgICAgfSwKICAgICAgIEluc3RhbGxUaHJpZnROb2RlSlNEZXA6IHsKLSAgICAgICAgY29tbWFuZDogJ2NkIC4uL25vZGVqczsgbnBtIGluc3RhbGwnCisgICAgICAgIGNvbW1hbmQ6ICdjZCAuLi8uLjsgbnBtIGluc3RhbGwnCisgICAgICB9LAorICAgICAgSW5zdGFsbFRlc3RMaWJzOiB7CisgICAgICAgIGNvbW1hbmQ6ICdjZCB0ZXN0OyBhbnQgZG93bmxvYWRfanNsaWJzJwogICAgICAgfSwKICAgICAgIFRocmlmdEdlbjogewotICAgICAgICBjb21tYW5kOiAndGhyaWZ0IC1nZW4ganMgLWdlbiBqczpub2RlIC1vIHRlc3QgLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCcKKyAgICAgICAgY29tbWFuZDogWworICAgICAgICAgICdta2RpciAtcCB0ZXN0L2dlbi1qcycsCisgICAgICAgICAgJy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLWdlbiBqcyAtLW91dCB0ZXN0L2dlbi1qcyAuLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0JywKKyAgICAgICAgICAnLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtZ2VuIGpzIC0tb3V0IHRlc3QvZ2VuLWpzIC4uLy4uL3Rlc3QvSnNEZWVwQ29uc3RydWN0b3JUZXN0LnRocmlmdCcsCisgICAgICAgICAgJ21rZGlyIC1wIHRlc3QvZ2VuLWpzLWpxdWVyeScsCisgICAgICAgICAgJy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLWdlbiBqczpqcXVlcnkgLS1vdXQgdGVzdC9nZW4tanMtanF1ZXJ5IC4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQnLAorICAgICAgICAgICdta2RpciAtcCB0ZXN0L2dlbi1ub2RlanMnLAorICAgICAgICAgICcuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1nZW4ganM6bm9kZSAtLW91dCB0ZXN0L2dlbi1ub2RlanMgLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCcsCisgICAgICAgICAgJ21rZGlyIC1wIHRlc3QvZ2VuLWpzLWVzNicsCisgICAgICAgICAgJy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLWdlbiBqczplczYgLS1vdXQgdGVzdC9nZW4tanMtZXM2IC4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQnLAorICAgICAgICAgICdta2RpciAtcCB0ZXN0L2dlbi1ub2RlanMtZXM2JywKKyAgICAgICAgICAnLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtZ2VuIGpzOm5vZGUsZXM2IC0tb3V0IC4vdGVzdC9nZW4tbm9kZWpzLWVzNiAuLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0JywKKyAgICAgICAgXS5qb2luKCcgJiYgJykKICAgICAgIH0sCiAgICAgICBUaHJpZnRHZW5KUTogewotICAgICAgICBjb21tYW5kOiAndGhyaWZ0IC1nZW4ganM6anF1ZXJ5IC1nZW4ganM6bm9kZSAtbyB0ZXN0IC4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQnCisgICAgICAgIGNvbW1hbmQ6ICcuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1nZW4ganM6anF1ZXJ5IC1nZW4ganM6bm9kZSAtbyB0ZXN0IC4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQnCiAgICAgICB9LAogICAgICAgVGhyaWZ0R2VuRGVlcENvbnN0cnVjdG9yOiB7Ci0gICAgICAgIGNvbW1hbmQ6ICd0aHJpZnQgLWdlbiBqcyAtbyB0ZXN0IC4uLy4uL3Rlc3QvSnNEZWVwQ29uc3RydWN0b3JUZXN0LnRocmlmdCcKLSAgICAgIH0KLSAgICB9LAotICAgIGV4dGVybmFsX2RhZW1vbjogeworICAgICAgICBjb21tYW5kOiAnLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtZ2VuIGpzIC1vIHRlc3QgLi4vLi4vdGVzdC9Kc0RlZXBDb25zdHJ1Y3RvclRlc3QudGhyaWZ0JworICAgICAgfSwKKyAgICAgIFRocmlmdEdlbkRvdWJsZUNvbnN0YW50czogeworICAgICAgICBjb21tYW5kOiAnLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtZ2VuIGpzIC1vIHRlc3QgLi4vLi4vdGVzdC9Eb3VibGVDb25zdGFudHNUZXN0LnRocmlmdCcKKyAgICAgIH0sCiAgICAgICBUaHJpZnRUZXN0U2VydmVyOiB7CiAgICAgICAgIG9wdGlvbnM6IHsKLSAgICAgICAgICBzdGFydENoZWNrOiBmdW5jdGlvbihzdGRvdXQsIHN0ZGVycikgewotICAgICAgICAgICAgcmV0dXJuICgvVGhyaWZ0IFNlcnZlciBydW5uaW5nIG9uIHBvcnQvKS50ZXN0KHN0ZG91dCk7Ci0gICAgICAgICAgfSwKLSAgICAgICAgICBub2RlU3Bhd25PcHRpb25zOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjd2Q6ICJ0ZXN0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudjoge05PREVfUEFUSDogIi4uLy4uL25vZGVqcy9saWI6Li4vLi4vbm9kZWpzL25vZGVfbW9kdWxlcyJ9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgIGFzeW5jOiB0cnVlLAorICAgICAgICAgIGV4ZWNPcHRpb25zOiB7CisgICAgICAgICAgICBjd2Q6ICIuL3Rlc3QiLAorICAgICAgICAgICAgZW52OiB7Tk9ERV9QQVRIOiAiLi4vLi4vbm9kZWpzL2xpYjouLi8uLi8uLi9ub2RlX21vZHVsZXMifQorICAgICAgICAgIH0KICAgICAgICAgfSwKLSAgICAgICAgY21kOiAibm9kZSIsCi0gICAgICAgIGFyZ3M6IFsic2VydmVyX2h0dHAuanMiXQorICAgICAgICBjb21tYW5kOiAibm9kZSBzZXJ2ZXJfaHR0cC5qcyIsCisgICAgICB9LAorICAgICAgVGhyaWZ0VGVzdFNlcnZlckVTNjogeworICAgICAgICBvcHRpb25zOiB7CisgICAgICAgICAgYXN5bmM6IHRydWUsCisgICAgICAgICAgZXhlY09wdGlvbnM6IHsKKyAgICAgICAgICAgIGN3ZDogIi4vdGVzdCIsCisgICAgICAgICAgICBlbnY6IHtOT0RFX1BBVEg6ICIuLi8uLi9ub2RlanMvbGliOi4uLy4uLy4uL25vZGVfbW9kdWxlcyJ9CisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICBjb21tYW5kOiAibm9kZSBzZXJ2ZXJfaHR0cC5qcyAtLWVzNiIsCiAgICAgICB9LAogICAgICAgVGhyaWZ0VGVzdFNlcnZlcl9UTFM6IHsKICAgICAgICAgb3B0aW9uczogewotICAgICAgICAgIHN0YXJ0Q2hlY2s6IGZ1bmN0aW9uKHN0ZG91dCwgc3RkZXJyKSB7Ci0gICAgICAgICAgICByZXR1cm4gKC9UaHJpZnQgU2VydmVyIHJ1bm5pbmcgb24gcG9ydC8pLnRlc3Qoc3Rkb3V0KTsKLSAgICAgICAgICB9LAotICAgICAgICAgIG5vZGVTcGF3bk9wdGlvbnM6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN3ZDogInRlc3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52OiB7Tk9ERV9QQVRIOiAiLi4vLi4vbm9kZWpzL2xpYjouLi8uLi9ub2RlanMvbm9kZV9tb2R1bGVzIn0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgYXN5bmM6IHRydWUsCisgICAgICAgICAgZXhlY09wdGlvbnM6IHsKKyAgICAgICAgICAgIGN3ZDogIi4vdGVzdCIsCisgICAgICAgICAgICBlbnY6IHtOT0RFX1BBVEg6ICIuLi8uLi9ub2RlanMvbGliOi4uLy4uLy4uL25vZGVfbW9kdWxlcyJ9CisgICAgICAgICAgfQogICAgICAgICB9LAotICAgICAgICBjbWQ6ICJub2RlIiwKLSAgICAgICAgYXJnczogWyJzZXJ2ZXJfaHR0cHMuanMiXQotICAgICAgfQorICAgICAgICBjb21tYW5kOiAibm9kZSBzZXJ2ZXJfaHR0cHMuanMiLAorICAgICAgfSwKKyAgICAgIFRocmlmdFRlc3RTZXJ2ZXJFUzZfVExTOiB7CisgICAgICAgIG9wdGlvbnM6IHsKKyAgICAgICAgICBhc3luYzogdHJ1ZSwKKyAgICAgICAgICBleGVjT3B0aW9uczogeworICAgICAgICAgICAgY3dkOiAiLi90ZXN0IiwKKyAgICAgICAgICAgIGVudjoge05PREVfUEFUSDogIi4uLy4uL25vZGVqcy9saWI6Li4vLi4vLi4vbm9kZV9tb2R1bGVzIn0KKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIGNvbW1hbmQ6ICJub2RlIHNlcnZlcl9odHRwcy5qcyAtLWVzNiIsCisgICAgICB9LAogICAgIH0sCiAgICAgcXVuaXQ6IHsKICAgICAgIFRocmlmdEpTOiB7CiAgICAgICAgIG9wdGlvbnM6IHsKICAgICAgICAgICB1cmxzOiBbCi0gICAgICAgICAgICAnaHR0cDovL2xvY2FsaG9zdDo4MDg4L3Rlc3Qtbm9qcS5odG1sJwotICAgICAgICAgIF0KKyAgICAgICAgICAgICdodHRwOi8vbG9jYWxob3N0OjgwODkvdGVzdC1ub2pxLmh0bWwnCisgICAgICAgICAgXSwKKyAgICAgICAgICBwdXBwZXRlZXI6IHsKKyAgICAgICAgICAgIGhlYWRsZXNzOiB0cnVlLAorICAgICAgICAgICAgYXJnczogWyctLW5vLXNhbmRib3gnXSwKKyAgICAgICAgICB9LAogICAgICAgICB9CiAgICAgICB9LAogICAgICAgVGhyaWZ0SlNKUTogewogICAgICAgICBvcHRpb25zOiB7CiAgICAgICAgICAgdXJsczogWwotICAgICAgICAgICAgJ2h0dHA6Ly9sb2NhbGhvc3Q6ODA4OC90ZXN0Lmh0bWwnCi0gICAgICAgICAgXQorICAgICAgICAgICAgJ2h0dHA6Ly9sb2NhbGhvc3Q6ODA4OS90ZXN0Lmh0bWwnCisgICAgICAgICAgXSwKKyAgICAgICAgICBwdXBwZXRlZXI6IHsKKyAgICAgICAgICAgIGhlYWRsZXNzOiB0cnVlLAorICAgICAgICAgICAgYXJnczogWyctLW5vLXNhbmRib3gnXSwKKyAgICAgICAgICB9LAorICAgICAgICB9CisgICAgICB9LAorICAgICAgVGhyaWZ0SlNfRG91YmxlUmVuZGVyaW5nOiB7CisgICAgICAgIG9wdGlvbnM6IHsKKyAgICAgICAgICB1cmxzOiBbCisgICAgICAgICAgICAnaHR0cDovL2xvY2FsaG9zdDo4MDg5L3Rlc3QtZG91YmxlLXJlbmRlcmluZy5odG1sJworICAgICAgICAgIF0sCisgICAgICAgICAgcHVwcGV0ZWVyOiB7CisgICAgICAgICAgICBoZWFkbGVzczogdHJ1ZSwKKyAgICAgICAgICAgIGFyZ3M6IFsnLS1uby1zYW5kYm94J10sCisgICAgICAgICAgICBpZ25vcmVIVFRQU0Vycm9yczogdHJ1ZSwKKyAgICAgICAgICB9LAogICAgICAgICB9CiAgICAgICB9LAogICAgICAgVGhyaWZ0V1M6IHsKICAgICAgICAgb3B0aW9uczogewogICAgICAgICAgIHVybHM6IFsKLSAgICAgICAgICAgICdodHRwOi8vbG9jYWxob3N0OjgwODgvdGVzdHdzLmh0bWwnCi0gICAgICAgICAgXQorICAgICAgICAgICAgJ2h0dHA6Ly9sb2NhbGhvc3Q6ODA4OS90ZXN0d3MuaHRtbCcKKyAgICAgICAgICBdLAorICAgICAgICAgIHB1cHBldGVlcjogeworICAgICAgICAgICAgaGVhZGxlc3M6IHRydWUsCisgICAgICAgICAgICBhcmdzOiBbJy0tbm8tc2FuZGJveCddLAorICAgICAgICAgIH0sCiAgICAgICAgIH0KICAgICAgIH0sCiAgICAgICBUaHJpZnRKU19UTFM6IHsKICAgICAgICAgb3B0aW9uczogewotICAgICAgICAgICctLWlnbm9yZS1zc2wtZXJyb3JzJzogdHJ1ZSwKICAgICAgICAgICB1cmxzOiBbCi0gICAgICAgICAgICAnaHR0cHM6Ly9sb2NhbGhvc3Q6ODA4OS90ZXN0LW5vanEuaHRtbCcKLSAgICAgICAgICBdCisgICAgICAgICAgICAnaHR0cHM6Ly9sb2NhbGhvc3Q6ODA5MS90ZXN0LW5vanEuaHRtbCcKKyAgICAgICAgICBdLAorICAgICAgICAgIHB1cHBldGVlcjogeworICAgICAgICAgICAgaGVhZGxlc3M6IHRydWUsCisgICAgICAgICAgICBhcmdzOiBbJy0tbm8tc2FuZGJveCddLAorICAgICAgICAgICAgaWdub3JlSFRUUFNFcnJvcnM6IHRydWUsCisgICAgICAgICAgfSwKICAgICAgICAgfQogICAgICAgfSwKICAgICAgIFRocmlmdEpTSlFfVExTOiB7CiAgICAgICAgIG9wdGlvbnM6IHsKLSAgICAgICAgICAnLS1pZ25vcmUtc3NsLWVycm9ycyc6IHRydWUsCiAgICAgICAgICAgdXJsczogWwotICAgICAgICAgICAgJ2h0dHBzOi8vbG9jYWxob3N0OjgwODkvdGVzdC5odG1sJwotICAgICAgICAgIF0KKyAgICAgICAgICAgICdodHRwczovL2xvY2FsaG9zdDo4MDkxL3Rlc3QuaHRtbCcKKyAgICAgICAgICBdLAorICAgICAgICAgIHB1cHBldGVlcjogeworICAgICAgICAgICAgaGVhZGxlc3M6IHRydWUsCisgICAgICAgICAgICBhcmdzOiBbJy0tbm8tc2FuZGJveCddLAorICAgICAgICAgICAgaWdub3JlSFRUUFNFcnJvcnM6IHRydWUsCisgICAgICAgICAgfSwKICAgICAgICAgfQogICAgICAgfSwKICAgICAgIFRocmlmdFdTX1RMUzogewogICAgICAgICBvcHRpb25zOiB7Ci0gICAgICAgICAgJy0taWdub3JlLXNzbC1lcnJvcnMnOiB0cnVlLAogICAgICAgICAgIHVybHM6IFsKLSAgICAgICAgICAgICdodHRwczovL2xvY2FsaG9zdDo4MDg5L3Rlc3R3cy5odG1sJwotICAgICAgICAgIF0KKyAgICAgICAgICAgICdodHRwczovL2xvY2FsaG9zdDo4MDkxL3Rlc3R3cy5odG1sJworICAgICAgICAgIF0sCisgICAgICAgICAgcHVwcGV0ZWVyOiB7CisgICAgICAgICAgICBoZWFkbGVzczogdHJ1ZSwKKyAgICAgICAgICAgIGFyZ3M6IFsnLS1uby1zYW5kYm94J10sCisgICAgICAgICAgICBpZ25vcmVIVFRQU0Vycm9yczogdHJ1ZSwKKyAgICAgICAgICB9LAogICAgICAgICB9CiAgICAgICB9LAogICAgICAgVGhyaWZ0RGVlcENvbnN0cnVjdG9yOiB7CiAgICAgICAgIG9wdGlvbnM6IHsKICAgICAgICAgICB1cmxzOiBbCi0gICAgICAgICAgICAnaHR0cDovL2xvY2FsaG9zdDo4MDg4L3Rlc3QtZGVlcC1jb25zdHJ1Y3Rvci5odG1sJwotICAgICAgICAgIF0KKyAgICAgICAgICAgICdodHRwOi8vbG9jYWxob3N0OjgwODkvdGVzdC1kZWVwLWNvbnN0cnVjdG9yLmh0bWwnCisgICAgICAgICAgXSwKKyAgICAgICAgICBwdXBwZXRlZXI6IHsKKyAgICAgICAgICAgIGhlYWRsZXNzOiB0cnVlLAorICAgICAgICAgICAgYXJnczogWyctLW5vLXNhbmRib3gnXSwKKyAgICAgICAgICB9LAorICAgICAgICB9CisgICAgICB9LAorICAgICAgVGhyaWZ0V1NFUzY6IHsKKyAgICAgICAgb3B0aW9uczogeworICAgICAgICAgIHVybHM6IFsKKyAgICAgICAgICAgICdodHRwOi8vbG9jYWxob3N0OjgwODgvdGVzdC1lczYuaHRtbCcKKyAgICAgICAgICBdLAorICAgICAgICAgIHB1cHBldGVlcjogeworICAgICAgICAgICAgaGVhZGxlc3M6IHRydWUsCisgICAgICAgICAgICBhcmdzOiBbJy0tbm8tc2FuZGJveCddLAorICAgICAgICAgIH0sCiAgICAgICAgIH0KICAgICAgIH0KICAgICB9LAogICAgIGpzaGludDogewotICAgICAgZmlsZXM6IFsnR3J1bnRmaWxlLmpzJywgJ3NyYy8qKi8qLmpzJywgJ3Rlc3QvKi5qcyddLAotICAgICAgb3B0aW9uczogewotICAgICAgICAvLyBvcHRpb25zIGhlcmUgdG8gb3ZlcnJpZGUgSlNIaW50IGRlZmF1bHRzCi0gICAgICAgIGdsb2JhbHM6IHsKLSAgICAgICAgICBqUXVlcnk6IHRydWUsCi0gICAgICAgICAgY29uc29sZTogdHJ1ZSwKLSAgICAgICAgICBtb2R1bGU6IHRydWUsCi0gICAgICAgICAgZG9jdW1lbnQ6IHRydWUKKyAgICAgIC8vIFRoZSBtYWluIHRocmlmdCBsaWJyYXJ5IGZpbGUuIG5vdCBlczYgeWV0IDooCisgICAgICBsaWI6IHsKKyAgICAgICAgc3JjOiBbJ3NyYy8qKi8qLmpzJ10sCisgICAgICB9LAorICAgICAgLy8gVGhlIHRlc3QgZmlsZXMgdXNlIGVzNgorICAgICAgdGVzdDogeworICAgICAgICBzcmM6IFsnR3J1bnRmaWxlLmpzJywgJ3Rlc3QvKi5qcyddLAorICAgICAgICBvcHRpb25zOiB7CisgICAgICAgICAgZXN2ZXJzaW9uOiA2LAorICAgICAgICB9CisgICAgICB9LAorICAgICAgZ2VuX2pzX2NvZGU6IHsKKyAgICAgICAgc3JjOiBbJ3Rlc3QvZ2VuLWpzLyouanMnLCAndGVzdC9nZW4tanMtanF1ZXJ5LyouanMnXSwKKyAgICAgIH0sCisgICAgICBnZW5fZXM2X2NvZGU6IHsKKyAgICAgICAgc3JjOiBbJ3Rlc3QvZ2VuLWpzLWVzNi8qLmpzJ10sCisgICAgICAgIG9wdGlvbnM6IHsKKyAgICAgICAgICBlc3ZlcnNpb246IDYsCisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICBnZW5fbm9kZV9jb2RlOiB7CisgICAgICAgIHNyYzogWyd0ZXN0L2dlbi1ub2RlanMvKi5qcyddLAorICAgICAgICBvcHRpb25zOiB7CisgICAgICAgICAgbm9kZTogdHJ1ZSwKKyAgICAgICAgfQorICAgICAgfSwKKyAgICAgIGdlbl9ub2RlX2VzNl9jb2RlOiB7CisgICAgICAgIHNyYzogWyd0ZXN0L2dlbi1ub2RlanMtZXM2LyouanMnXSwKKyAgICAgICAgb3B0aW9uczogeworICAgICAgICAgIG5vZGU6IHRydWUsCisgICAgICAgICAgZXN2ZXJzaW9uOiA2LAogICAgICAgICB9CiAgICAgICB9CiAgICAgfSwKQEAgLTE1NCwxOSArMjU5LDM1IEBACiAgIGdydW50LmxvYWROcG1UYXNrcygnZ3J1bnQtY29udHJpYi1xdW5pdCcpOwogICBncnVudC5sb2FkTnBtVGFza3MoJ2dydW50LWNvbnRyaWItY29uY2F0Jyk7CiAgIGdydW50LmxvYWROcG1UYXNrcygnZ3J1bnQtanNkb2MnKTsKLSAgZ3J1bnQubG9hZE5wbVRhc2tzKCdncnVudC1leHRlcm5hbC1kYWVtb24nKTsKLSAgZ3J1bnQubG9hZE5wbVRhc2tzKCdncnVudC1zaGVsbCcpOworICBncnVudC5sb2FkTnBtVGFza3MoJ2dydW50LXNoZWxsLXNwYXduJyk7CiAKLSAgZ3J1bnQucmVnaXN0ZXJUYXNrKCd0ZXN0JywgWydqc2hpbnQnLCAnc2hlbGw6SW5zdGFsbFRocmlmdEpTJywgJ3NoZWxsOkluc3RhbGxUaHJpZnROb2RlSlNEZXAnLCAnc2hlbGw6VGhyaWZ0R2VuJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdleHRlcm5hbF9kYWVtb246VGhyaWZ0VGVzdFNlcnZlcicsICdleHRlcm5hbF9kYWVtb246VGhyaWZ0VGVzdFNlcnZlcl9UTFMnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NoZWxsOlRocmlmdEdlbkRlZXBDb25zdHJ1Y3RvcicsICdxdW5pdDpUaHJpZnREZWVwQ29uc3RydWN0b3InLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3F1bml0OlRocmlmdEpTJywgJ3F1bml0OlRocmlmdEpTX1RMUycsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2hlbGw6VGhyaWZ0R2VuSlEnLCAncXVuaXQ6VGhyaWZ0SlNKUScsICdxdW5pdDpUaHJpZnRKU0pRX1RMUycKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSk7Ci0gIGdydW50LnJlZ2lzdGVyVGFzaygnZGVmYXVsdCcsIFsnanNoaW50JywgJ3NoZWxsOkluc3RhbGxUaHJpZnRKUycsICdzaGVsbDpJbnN0YWxsVGhyaWZ0Tm9kZUpTRGVwJywgJ3NoZWxsOlRocmlmdEdlbicsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXh0ZXJuYWxfZGFlbW9uOlRocmlmdFRlc3RTZXJ2ZXInLCAnZXh0ZXJuYWxfZGFlbW9uOlRocmlmdFRlc3RTZXJ2ZXJfVExTJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdxdW5pdDpUaHJpZnRKUycsICdxdW5pdDpUaHJpZnRKU19UTFMnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NoZWxsOlRocmlmdEdlbkpRJywgJ3F1bml0OlRocmlmdEpTSlEnLCAncXVuaXQ6VGhyaWZ0SlNKUV9UTFMnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmNhdCcsICd1Z2xpZnknLCAnanNkb2MnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pOworICBncnVudC5yZWdpc3RlclRhc2soJ3dhaXQnLCAnV2FpdCBqdXN0IG9uZSBzZWNvbmQgZm9yIHNlcnZlciB0byBzdGFydCcsIGZ1bmN0aW9uICgpIHsKKyAgICB2YXIgZG9uZSA9IHRoaXMuYXN5bmMoKTsKKyAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeworICAgICAgZG9uZSh0cnVlKTsKKyAgICB9LCAxMDAwKTsKKyAgfSk7CisKKyAgZ3J1bnQucmVnaXN0ZXJUYXNrKCdpbnN0YWxsQW5kR2VuZXJhdGUnLCBbCisgICAgJ3NoZWxsOkluc3RhbGxUaHJpZnRKUycsICdzaGVsbDpJbnN0YWxsVGhyaWZ0Tm9kZUpTRGVwJywgJ3NoZWxsOlRocmlmdEdlbicsCisgICAgJ3NoZWxsOlRocmlmdEdlbkRlZXBDb25zdHJ1Y3RvcicsICdzaGVsbDpUaHJpZnRHZW5Eb3VibGVDb25zdGFudHMnLAorICAgICdzaGVsbDpJbnN0YWxsVGVzdExpYnMnLAorICBdKTsKKworICBncnVudC5yZWdpc3RlclRhc2soJ3Rlc3QnLCBbCisgICAgJ2luc3RhbGxBbmRHZW5lcmF0ZScsCisgICAgJ2pzaGludCcsCisgICAgJ3NoZWxsOlRocmlmdFRlc3RTZXJ2ZXInLCAnc2hlbGw6VGhyaWZ0VGVzdFNlcnZlcl9UTFMnLAorICAgICdzaGVsbDpUaHJpZnRUZXN0U2VydmVyRVM2JywgJ3NoZWxsOlRocmlmdFRlc3RTZXJ2ZXJFUzZfVExTJywKKyAgICAnd2FpdCcsCisgICAgJ3F1bml0OlRocmlmdERlZXBDb25zdHJ1Y3RvcicsCisgICAgJ3F1bml0OlRocmlmdEpTJywgJ3F1bml0OlRocmlmdEpTX1RMUycsCisgICAgJ3F1bml0OlRocmlmdEpTX0RvdWJsZVJlbmRlcmluZycsCisgICAgJ3F1bml0OlRocmlmdFdTJywKKyAgICAncXVuaXQ6VGhyaWZ0SlNKUScsICdxdW5pdDpUaHJpZnRKU0pRX1RMUycsCisgICAgJ3F1bml0OlRocmlmdFdTRVM2JywKKyAgICAnc2hlbGw6VGhyaWZ0VGVzdFNlcnZlcjpraWxsJywgJ3NoZWxsOlRocmlmdFRlc3RTZXJ2ZXJfVExTOmtpbGwnLAorICAgICdzaGVsbDpUaHJpZnRUZXN0U2VydmVyRVM2OmtpbGwnLCAnc2hlbGw6VGhyaWZ0VGVzdFNlcnZlckVTNl9UTFM6a2lsbCcsCisgIF0pOworICBncnVudC5yZWdpc3RlclRhc2soJ2RlZmF1bHQnLCBbJ3Rlc3QnLCAnY29uY2F0JywgJ3VnbGlmeScsICdqc2RvYyddKTsKIH07CmRpZmYgLS1naXQgYS9saWIvanMvTWFrZWZpbGUuYW0gYi9saWIvanMvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVhMjBhNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qcy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDMwIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyBNYWtlIHN1cmUgdGhpcyBkb2Vzbid0IGZhaWwgaWYgYW50IGlzIG5vdCBjb25maWd1cmVkLgorIyBXZSBjYWxsIGluc3RhbGwgdHdpY2UgdG8gd29yayBhcm91bmQgbnBtIGlzc3VlcworIworaWYgSEFWRV9OUE0KK1NVQkRJUlMgPSB0ZXN0CisKK2NoZWNrLWxvY2FsOiBhbGwKKwkkKE5QTSkgaW5zdGFsbCB8fCAkKE5QTSkgaW5zdGFsbAorCSQoTlBNKSBsaXN0CisJLi9ub2RlX21vZHVsZXMvLmJpbi9ncnVudAorZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9qcy9SRUFETUUubWQgYi9saWIvanMvUkVBRE1FLm1kCmluZGV4IGRmYTZlODIuLjlkNTFlMmEgMTAwNjQ0Ci0tLSBhL2xpYi9qcy9SRUFETUUubWQKKysrIGIvbGliL2pzL1JFQURNRS5tZApAQCAtMzgsMTkgKzM4LDEyIEBACiBzb3VyY2VzIGZyb20gdGhlIGludGVybmV0LiBUbyBidWlsZCB0aGUgSmF2YVNjcmlwdCBicmFuY2gKIG9mIEFwYWNoZSBUaHJpZnQgZXhlY3V0ZSB0aGUgY29tbWFuZDoKIAotICAgIGdydW50CisgICAgbnB4IGdydW50CiAgICAgCi1UaGlzIHJ1bnMgdGhlIGdydW50IGJ1aWxkIHRvb2wsIGxpbnRpbmcgYWxsIG9mIHRoZSBzb3VyY2UKLWZpbGVzLCBzZXR0aW5nIHVwIGFuZCBydW5uaW5nIHRoZSB0ZXN0cywgY29uY2F0ZW5hdGluZyBhbmQKLW1pbmlmeWluZyB0aGUgbWFpbiBsaWJyYXJpZXMgYW5kIGdlbmVyYXRpbmcgdGhlIGh0bWwgCi1kb2N1bWVudGF0aW9uLgotCi1JZiBncnVudCBpcyBub3QgaW5zdGFsbGVkIHlvdSBjYW4gaW5zdGFsbCBpdCB3aXRoIG5wbQotbGlrZSB0aGlzOgotCi0gICBzdWRvIG5wbSBpbnN0YWxsIC1nIGdydW50LWNsaQotICAgbnBtIGluc3RhbGwgZ3J1bnQgLS1zYXZlLWRldgotCitUaGlzIHJ1bnMgdGhlIGdydW50IGJ1aWxkIHRvb2wgKGZyb20gd2l0aGluIGAuL25vZGVfbW9kdWxlcy8uYmluL2ApLAorbGludGluZyBhbGwgb2YgdGhlIHNvdXJjZSBmaWxlcywgc2V0dGluZyB1cCBhbmQgcnVubmluZyB0aGUKK3Rlc3RzLCBjb25jYXRlbmF0aW5nIGFuZCBtaW5pZnlpbmcgdGhlIG1haW4gbGlicmFyaWVzIGFuZAorZ2VuZXJhdGluZyB0aGUgaHRtbCBkb2N1bWVudGF0aW9uLgogCiBUcmVlCiAtLS0tCmRpZmYgLS1naXQgYS9saWIvanMvcGFja2FnZS1sb2NrLmpzb24gYi9saWIvanMvcGFja2FnZS1sb2NrLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNkODFjMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qcy9wYWNrYWdlLWxvY2suanNvbgpAQCAtMCwwICsxLDM3NzcgQEAKK3sKKyAgIm5hbWUiOiAidGhyaWZ0IiwKKyAgInZlcnNpb24iOiAiMS4wLjAiLAorICAibG9ja2ZpbGVWZXJzaW9uIjogMSwKKyAgInJlcXVpcmVzIjogdHJ1ZSwKKyAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAiYWJicmV2IjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FiYnJldi8tL2FiYnJldi0xLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItbm5lOS9JaVEvaHpJaFk2cGREbmJCdHo3RGpQVEtyWTAwUC96dlBTbTVwT0ZrbDZ4dUdyR25Ybi9WdFROTmZOdEFmWjkvMVJ0ZWhrc3pVOXFjVGlpMFE9PSIKKyAgICB9LAorICAgICJhZ2VudC1iYXNlIjogeworICAgICAgInZlcnNpb24iOiAiNC4yLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FnZW50LWJhc2UvLS9hZ2VudC1iYXNlLTQuMi4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1KVndYTXI5bkhZVFVYc0JGS1VxaEp3dmxjWVUvYmxyZU9FVWtoTlIyZVhaSXZ3ZCtjK281VjRNZ0RQS1duTVMvNTZhd04zVFJ6SVArS29Qbityb1F0Zz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXM2LXByb21pc2lmeSI6ICJeNS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiYWp2IjogeworICAgICAgInZlcnNpb24iOiAiNS41LjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fqdi8tL2Fqdi01LjUuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWM3WHV5aityWlQ0OVA1UWlzMEd0UWlCZHlXVT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY28iOiAiXjQuNi4wIiwKKyAgICAgICAgImZhc3QtZGVlcC1lcXVhbCI6ICJeMS4wLjAiLAorICAgICAgICAiZmFzdC1qc29uLXN0YWJsZS1zdHJpbmdpZnkiOiAiXjIuMC4wIiwKKyAgICAgICAgImpzb24tc2NoZW1hLXRyYXZlcnNlIjogIl4wLjMuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJhbGlnbi10ZXh0IjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FsaWduLXRleHQvLS9hbGlnbi10ZXh0LTAuMS40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRE5rS1ZoQ1Q4MTBLbVNWc0lyY0dsRFA2MFJjPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImtpbmQtb2YiOiAiXjMuMC4yIiwKKyAgICAgICAgImxvbmdlc3QiOiAiXjEuMC4xIiwKKyAgICAgICAgInJlcGVhdC1zdHJpbmciOiAiXjEuNS4yIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJraW5kLW9mIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjMuMi4yIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcva2luZC1vZi8tL2tpbmQtb2YtMy4yLjIudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTWVvaHB6UzZ1YnV3OHlSbTJKT3VwUjVLUEdRPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWJ1ZmZlciI6ICJeMS4xLjUiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiYW5zaS1yZWdleCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hbnNpLXJlZ2V4Ly0vYW5zaS1yZWdleC0yLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXc3TTZ0ZTQyRFliZzVpandSb3JuN3lmV1ZOOD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhbnNpLXN0eWxlcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMi4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hbnNpLXN0eWxlcy8tL2Fuc2ktc3R5bGVzLTMuMi4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1WVDBaSTZrWlJkVGg4WXlKdzNTTWJZbS91K05xZnNBeEVwV08wUGY5c3E4L2U5NFd4eE9wUEt4OUZSMUZseUN0T1ZETk9RKzhudGxxRnhpUmMrcjVxQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY29sb3ItY29udmVydCI6ICJeMS45LjAiCisgICAgICB9CisgICAgfSwKKyAgICAiYXJncGFyc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMTAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FyZ3BhcnNlLy0vYXJncGFyc2UtMS4wLjEwLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1vNVJveTZ0Tkc0U0wvRk9rQ0FONlJ6amlha1pTMjVSTFlGcmNNdHRKcWJkZDhCV3JuQStmR3o1N2lONVBiMDZwdkJHdmw1Z1EwQjQ4ZEpsc2xYdm9UZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAic3ByaW50Zi1qcyI6ICJ+MS4wLjIiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgInNwcmludGYtanMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjMiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zcHJpbnRmLWpzLy0vc3ByaW50Zi1qcy0xLjAuMy50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1CT2FTYjJZb2xUVlBQZEFWSURZenVGY3BmaXc9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiYXJyLWRpZmYiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXJyLWRpZmYvLS9hcnItZGlmZi00LjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTFrWVFkUDYvN0hIbjRWSTFkaG95bWwzSHhTQT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhcnItZmxhdHRlbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hcnItZmxhdHRlbi8tL2Fyci1mbGF0dGVuLTEuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1MM2hLVjVSL3A1bzgxUjdPMDJJR253cERta3A2RTk4MlhodGJ1d1NlM080cU90TU1NdG9kaWNBU0ExQ255MlUrYUNYY05wbWwrbTRkUHN2c0ozamF0Zz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYXJyLXVuaW9uIjogeworICAgICAgInZlcnNpb24iOiAiMy4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fyci11bmlvbi8tL2Fyci11bmlvbi0zLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTQ1c0pycW5lK0dhbzhnYmlpSzlqa1p1dU9jUT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhcnJheS1lYWNoIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FycmF5LWVhY2gvLS9hcnJheS1lYWNoLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcDVTdkRBV3JGMUtFYnVkVG9mSVJvRnVneEU4PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFycmF5LWZpbmQtaW5kZXgiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXJyYXktZmluZC1pbmRleC8tL2FycmF5LWZpbmQtaW5kZXgtMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0zd0VLb1NoK0ZrdTlwdmx5T3dxV29leEJoNkU9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYXJyYXktc2xpY2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXJyYXktc2xpY2UvLS9hcnJheS1zbGljZS0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItQjFxTUQzUkJQN084bzBIMkticlhEeUIwSWNjZWpNRjE1Kzg3THZsb3IxMk9OUFJIUDZnVGpYTU5rdC9kM1p1T0diQWU2NmhGbWFDZkVDSTI0VWZwNnc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFycmF5LXVuaXF1ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMy4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hcnJheS11bmlxdWUvLS9hcnJheS11bmlxdWUtMC4zLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1xSlMzWFV2RTlzMW5udk1rU3AvWTlHcmkxQ2c9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYXNuMSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMi40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hc24xLy0vYXNuMS0wLjIuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItanh3elFwTFFqU21XWGd3YUNaRTlOeitnbEFHMDF5RjFRbldnYmhHd0hJNUE2RlJJRVk2SVZxdEhoSWVwSHFJNy9reUV5UUVhZ0JDNW1CRUZsSVl2ZGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJzYWZlci1idWZmZXIiOiAifjIuMS4wIgorICAgICAgfQorICAgIH0sCisgICAgImFzc2VydC1wbHVzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fzc2VydC1wbHVzLy0vYXNzZXJ0LXBsdXMtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS04UzRQUEYxM3NMSE4yUlJwUXVUcGJCNU4xU1U9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYXNzaWduLXN5bWJvbHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXNzaWduLXN5bWJvbHMvLS9hc3NpZ24tc3ltYm9scy0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVdXWi9RZnJkVHlETXZDdTVhNDFQZjNqc0EyYz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhc3luYyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuNS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2FzeW5jLy0vYXN5bmMtMS41LjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS03R3BocmxaSURBdzhza0hKVmhqaUNKTDVaeW89IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYXN5bmMtbGltaXRlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hc3luYy1saW1pdGVyLy0vYXN5bmMtbGltaXRlci0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItanAvdUZub29PaU8rTDIxMWVaT29TeXpwT0lUTVh4MXJCSVRhdVl5a0czQlJZUHU4aDBVY3hzUE5CMDRSUjV2bzRUeXozK2F5MTd0UjZKVmY5cXpZV2c9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFzeW5ja2l0IjogeworICAgICAgInZlcnNpb24iOiAiMC40LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FzeW5ja2l0Ly0vYXN5bmNraXQtMC40LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS14NTdaZjM4MHk0OHJvYnlYa0x6RFprZExTM2s9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgImF0b2IiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXRvYi8tL2F0b2ItMi4xLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVdtNnVrb2FPR0ppLzczcC9jbDJHdkxqVEk1Sk0xay9PMTRpc0Q3M1lNTDhTdHJILzcvbFJGZ21nOG5JQ1pnRDNiWlp2andDR3h0TU9EM3dXTkF1OGNnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhd3Mtc2lnbjIiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjcuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXdzLXNpZ24yLy0vYXdzLXNpZ24yLTAuNy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdEc2SkNUU3BXUjh0TDIrRzErYXA4YlArZHFnPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJhd3M0IjogeworICAgICAgInZlcnNpb24iOiAiMS44LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2F3czQvLS9hd3M0LTEuOC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1SZVp4dk5ISU92ODhGbFQ3cnhjWElJQzBmUHQ0S1pxWmJPbGl2eVd0WEx0OEVTeDg0emQza01DNmlLNWpWZVMycXQrZzdmdFM3eWU0ZmkwNlg1cnRSUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgImJhYnlsb24iOiB7CisgICAgICAidmVyc2lvbiI6ICI3LjAuMC1iZXRhLjE5IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9iYWJ5bG9uLy0vYmFieWxvbi03LjAuMC1iZXRhLjE5LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1WZzBDOXMvUkVYNi9XSVhOMzdVS3B2NVpoUmk2QTRwakhscGtFMzQrOC9hNmMyVzFRNjkybjNobWMrU1pHNWxLUm5hRXhMVWJ4dEoxU1ZUK0thQ1EvQT09IgorICAgIH0sCisgICAgImJhbGFuY2VkLW1hdGNoIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2JhbGFuY2VkLW1hdGNoLy0vYmFsYW5jZWQtbWF0Y2gtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1pYlRSbWFzcjdrbmVGazZnSzRuT1JpMXh0MmM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYmFzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMTEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYmFzZS8tL2Jhc2UtMC4xMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi01VDZQNHhQZ3BwMFlERnZTV3dFWjROb0UzYU00UUJRWER6bVZicmFDa0ZqOHpITSttYmE4U3lxQjVEYlpXeVI3bVlIbzZZN0JkUW8zTW9BNG0wVGVRZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY2FjaGUtYmFzZSI6ICJeMS4wLjEiLAorICAgICAgICAiY2xhc3MtdXRpbHMiOiAiXjAuMy41IiwKKyAgICAgICAgImNvbXBvbmVudC1lbWl0dGVyIjogIl4xLjIuMSIsCisgICAgICAgICJkZWZpbmUtcHJvcGVydHkiOiAiXjEuMC4wIiwKKyAgICAgICAgImlzb2JqZWN0IjogIl4zLjAuMSIsCisgICAgICAgICJtaXhpbi1kZWVwIjogIl4xLjIuMCIsCisgICAgICAgICJwYXNjYWxjYXNlIjogIl4wLjEuMSIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVmaW5lLXByb3BlcnR5Ly0vZGVmaW5lLXByb3BlcnR5LTEuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLWRwNjZyejlLWTZyVHI1Nk5NRXlidm5tL3NPWT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1kZXNjcmlwdG9yIjogIl4xLjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJpcy1hY2Nlc3Nvci1kZXNjcmlwdG9yIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtYWNjZXNzb3ItZGVzY3JpcHRvci8tL2lzLWFjY2Vzc29yLWRlc2NyaXB0b3ItMS4wLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1tNWhuSFRrY1ZzUGZxeDNBS2x5dHRJUGI3SitYeWtIdkpQMkI5YlpEamxoTElvRXE0WG9LNjRWZzdib1psVldZSzZMVVk5NGRZUEVFN0xoMFprWktjUT09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAia2luZC1vZiI6ICJeNi4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAiaXMtZGF0YS1kZXNjcmlwdG9yIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZGF0YS1kZXNjcmlwdG9yLy0vaXMtZGF0YS1kZXNjcmlwdG9yLTEuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItamJSWHkxRm10QW9DalFrVm1JVll3dXVxREZVYmFPZURqbWVkMXRPR1Byc01odEpBNHJEOXRrZ0EwRjFxSjNnUkZSWGNIWVZrZGVhUDUwUTVyRS9qTFE9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImtpbmQtb2YiOiAiXjYuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImlzLWRlc2NyaXB0b3IiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1kZXNjcmlwdG9yLy0vaXMtZGVzY3JpcHRvci0xLjAuMi50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTJlaXM1V3FRR1Y3cGVvb0R5TG1ORVBVcnBzOStTWFg1YzlwTDN4RUIrNGU5SG5HdURhN21CN2tIeEh3NENicVM5azFUMmhPSDNtaUw4bjhXdGlZVnRnPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1hY2Nlc3Nvci1kZXNjcmlwdG9yIjogIl4xLjAuMCIsCisgICAgICAgICAgICAiaXMtZGF0YS1kZXNjcmlwdG9yIjogIl4xLjAuMCIsCisgICAgICAgICAgICAia2luZC1vZiI6ICJeNi4wLjIiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiYmNyeXB0LXBia2RmIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2JjcnlwdC1wYmtkZi8tL2JjcnlwdC1wYmtkZi0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXBEQWRPSnRxUS9tMmYvUEtFYVAyWTM0MkRwND0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAidHdlZXRuYWNsIjogIl4wLjE0LjMiCisgICAgICB9CisgICAgfSwKKyAgICAiYmx1ZWJpcmQiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjUuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYmx1ZWJpcmQvLS9ibHVlYmlyZC0zLjUuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZGhIVFdNSTdrTXg1d2hNUW50bDdWcjlDNkJ2VjEwbEZYREFhc25xbnJNWWhYVkN6ems2SU85Rm8yTDc1alhIVDA3V3JPbmdMMVdEWE9wK3lZUzkxWWc9PSIKKyAgICB9LAorICAgICJicmFjZS1leHBhbnNpb24iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMTEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2JyYWNlLWV4cGFuc2lvbi8tL2JyYWNlLWV4cGFuc2lvbi0xLjEuMTEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWlDdVBIREZnckhYN0gydkVJLzV4cHowN3pTSEIwMFRwdWdxaG1ZdFZtTU82NTE4bUN1Uk1vT1lGbGRFQmwwZzE4N3Vmb3pkYUhnV0tjWUZiNjFxR2lBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJiYWxhbmNlZC1tYXRjaCI6ICJeMS4wLjAiLAorICAgICAgICAiY29uY2F0LW1hcCI6ICIwLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJicmFjZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjMuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYnJhY2VzLy0vYnJhY2VzLTIuMy4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1hTmRibmo5UDhQamRYVTR5YmFXTEsySUYzamMvRW9EWWJDN0Fhelc2dG8zVFJzZlh4c2NDOVVYT0I1aURpRVFya3lJYldwMlNMUWRhNCtRQWE3bmMzdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXJyLWZsYXR0ZW4iOiAiXjEuMS4wIiwKKyAgICAgICAgImFycmF5LXVuaXF1ZSI6ICJeMC4zLjIiLAorICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiAiXjIuMC4xIiwKKyAgICAgICAgImZpbGwtcmFuZ2UiOiAiXjQuMC4wIiwKKyAgICAgICAgImlzb2JqZWN0IjogIl4zLjAuMSIsCisgICAgICAgICJyZXBlYXQtZWxlbWVudCI6ICJeMS4xLjIiLAorICAgICAgICAic25hcGRyYWdvbiI6ICJeMC44LjEiLAorICAgICAgICAic25hcGRyYWdvbi1ub2RlIjogIl4yLjAuMSIsCisgICAgICAgICJzcGxpdC1zdHJpbmciOiAiXjMuMC4yIiwKKyAgICAgICAgInRvLXJlZ2V4IjogIl4zLjAuMSIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9leHRlbmQtc2hhbGxvdy8tL2V4dGVuZC1zaGFsbG93LTIuMC4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLVVhOTlZVXJacWZZUTZodXZ1NWlkYXh4V2lROD0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1leHRlbmRhYmxlIjogIl4wLjEuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJicm93c2VyaWZ5LXpsaWIiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYnJvd3NlcmlmeS16bGliLy0vYnJvd3NlcmlmeS16bGliLTAuMS40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdXpYNHBSbjJBT0Q2YTRTRkpCeVhuUUZCK3kwPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInBha28iOiAifjAuMi4wIgorICAgICAgfQorICAgIH0sCisgICAgImJ1ZmZlci1mcm9tIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2J1ZmZlci1mcm9tLy0vYnVmZmVyLWZyb20tMS4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU1RY1hFVWJDS3RFbzdiaHFFczY1NjBIeWQ0WGFvdlpsTy9rOVYzaGpWVUYvendXN0tCVmRTSzRnSXQvYnp3UzlNYlI1cW9iK0Y1anVzWnNiMFlRSzJBPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJidWZmZXItc2hpbXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYnVmZmVyLXNoaW1zLy0vYnVmZmVyLXNoaW1zLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbVhqT01YT0l4a210aDVNQ2pEUjM3d1JLaTFFPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImJ1aWx0aW4tbW9kdWxlcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9idWlsdGluLW1vZHVsZXMvLS9idWlsdGluLW1vZHVsZXMtMS4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1KdzhIYkZweXdDOWJaYVI5K1V4ZjQ2SjRpUzg9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY2FjaGUtYmFzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jYWNoZS1iYXNlLy0vY2FjaGUtYmFzZS0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItQUtjZFRuRlNXQVRkNS9HQ1BSeHIyQ2h3SUo4NUNleXJFeWpSSGxLeFE1NmQ0WEpNR3ltMHVBaUtuMHhiTE9HT2wzK3lScE9UaTQ4NGRWQ0VjNUFVelE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNvbGxlY3Rpb24tdmlzaXQiOiAiXjEuMC4wIiwKKyAgICAgICAgImNvbXBvbmVudC1lbWl0dGVyIjogIl4xLjIuMSIsCisgICAgICAgICJnZXQtdmFsdWUiOiAiXjIuMC42IiwKKyAgICAgICAgImhhcy12YWx1ZSI6ICJeMS4wLjAiLAorICAgICAgICAiaXNvYmplY3QiOiAiXjMuMC4xIiwKKyAgICAgICAgInNldC12YWx1ZSI6ICJeMi4wLjAiLAorICAgICAgICAidG8tb2JqZWN0LXBhdGgiOiAiXjAuMy4wIiwKKyAgICAgICAgInVuaW9uLXZhbHVlIjogIl4xLjAuMCIsCisgICAgICAgICJ1bnNldC12YWx1ZSI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiY2FtZWxjYXNlIjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NhbWVsY2FzZS8tL2NhbWVsY2FzZS0yLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWZCMFcxbm1odStXY29DeXM3UHNCSGlBZldoOD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjYW1lbGNhc2Uta2V5cyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2NhbWVsY2FzZS1rZXlzLy0vY2FtZWxjYXNlLWtleXMtMi4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1NSXZ1ci8zeWdSa0ZIdm9ka3lJVHlSdVBrdWM9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY2FtZWxjYXNlIjogIl4yLjAuMCIsCisgICAgICAgICJtYXAtb2JqIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJjYXNlbGVzcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMTIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2FzZWxlc3MvLS9jYXNlbGVzcy0wLjEyLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1HMmdjSWYrRUF6eUNaVU1KQm9sQ0RSaHhVZHc9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgImNhdGhhcnNpcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuOC45IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jYXRoYXJzaXMvLS9jYXRoYXJzaXMtMC44LjkudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1tTXlKREtaUzNTN3c1d3Mza2xNUS81NlEvSXM9IiwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInVuZGVyc2NvcmUtY29udHJpYiI6ICJ+MC4zLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiY2VudGVyLWFsaWduIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NlbnRlci1hbGlnbi8tL2NlbnRlci1hbGlnbi0wLjEuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXFnMHlZcHR1NlhJZ0JCSEwxRVlja0h2Q3Q2MD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhbGlnbi10ZXh0IjogIl4wLjEuMyIsCisgICAgICAgICJsYXp5LWNhY2hlIjogIl4xLjAuMyIKKyAgICAgIH0KKyAgICB9LAorICAgICJjaGFsayI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jaGFsay8tL2NoYWxrLTIuNC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1PYk42aDF2MmZUSlNtVVhvUzNuTVE5MkxiREs5YmU0VFYrNkcrb21RbEdKRmRjVVg1aGVLaTFMWjFZblJNSWd3VExFajNFMjRiVDZ0WW5pNTBybENmUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYW5zaS1zdHlsZXMiOiAiXjMuMi4xIiwKKyAgICAgICAgImVzY2FwZS1zdHJpbmctcmVnZXhwIjogIl4xLjAuNSIsCisgICAgICAgICJzdXBwb3J0cy1jb2xvciI6ICJeNS4zLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiY2xhc3MtdXRpbHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjMuNiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2xhc3MtdXRpbHMvLS9jbGFzcy11dGlscy0wLjMuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItcU9oUGEvRmo3czZUWThIOGVzR3U1UU5wTU1ReHo3OWgrdXJ6ck5ZTjZtbis5Qm54bERHZjVRWitYZUNEc3hTalBxc1NSNTZYT1pPSm1wZXVybkxNZWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFyci11bmlvbiI6ICJeMy4xLjAiLAorICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogIl4wLjIuNSIsCisgICAgICAgICJpc29iamVjdCI6ICJeMy4wLjAiLAorICAgICAgICAic3RhdGljLWV4dGVuZCI6ICJeMC4xLjEiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIwLjIuNSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlZmluZS1wcm9wZXJ0eS8tL2RlZmluZS1wcm9wZXJ0eS0wLjIuNS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS13MXNlK1Jqc1BKa1BtbHZGZStCS3JPeGNnUlk9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtZGVzY3JpcHRvciI6ICJeMC4xLjAiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiY2xpIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NsaS8tL2NsaS0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUlvRjFOUEpMK2tsUXcwMVRMVWpzdkdJYmpCUT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJleGl0IjogIjAuMS4yIiwKKyAgICAgICAgImdsb2IiOiAiXjcuMS4xIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJnbG9iIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjcuMS4zIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ2xvYi8tL2dsb2ItNy4xLjMudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi12Y2Z1aUl4b2dMVjREbEdCSElVT3dJMElicko4SFdQYzRNVTdIenZpR2VOaG8vVUpEZmk2QjVwM3NIZVdJUTBLR0lVMEpweGk1Wkh4ZW1RZkxra0F3UT09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiZnMucmVhbHBhdGgiOiAiXjEuMC4wIiwKKyAgICAgICAgICAgICJpbmZsaWdodCI6ICJeMS4wLjQiLAorICAgICAgICAgICAgImluaGVyaXRzIjogIjIiLAorICAgICAgICAgICAgIm1pbmltYXRjaCI6ICJeMy4wLjQiLAorICAgICAgICAgICAgIm9uY2UiOiAiXjEuMy4wIiwKKyAgICAgICAgICAgICJwYXRoLWlzLWFic29sdXRlIjogIl4xLjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJjbGl1aSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jbGl1aS8tL2NsaXVpLTIuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtUzBkWFlQK0FKa3gyTERvWEdRTXVrY2Yrb05FPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNlbnRlci1hbGlnbiI6ICJeMC4xLjEiLAorICAgICAgICAicmlnaHQtYWxpZ24iOiAiXjAuMS4xIiwKKyAgICAgICAgIndvcmR3cmFwIjogIjAuMC4yIgorICAgICAgfQorICAgIH0sCisgICAgImNvIjogeworICAgICAgInZlcnNpb24iOiAiNC42LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvLy0vY28tNC42LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1icWE5ODloVHJsVE11T1I3K2d2eitRTWZzWVE9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgImNvZmZlZXNjcmlwdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMTAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29mZmVlc2NyaXB0Ly0vY29mZmVlc2NyaXB0LTEuMTAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTU2cURBWkYrOWlHelhZbzU4MGpjM1IyMzR6ND0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjb2xsZWN0aW9uLXZpc2l0IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvbGxlY3Rpb24tdmlzaXQvLS9jb2xsZWN0aW9uLXZpc2l0LTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtUzhBM1BCWkx3eWtiVFRhTWdwenhxQXBaM0tBPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIm1hcC12aXNpdCI6ICJeMS4wLjAiLAorICAgICAgICAib2JqZWN0LXZpc2l0IjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJjb2xvci1jb252ZXJ0IjogeworICAgICAgInZlcnNpb24iOiAiMS45LjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvbG9yLWNvbnZlcnQvLS9jb2xvci1jb252ZXJ0LTEuOS4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1RZkFVdGQrdkZkQXRGUWNDOENDeVl0MWZZV3hTcUFpSzJjU0Q2ekRCOE4zY3BzRUJBdlJ4cDl6T0dnNkcvU0hISllBVDg4L2F6L0l1REdBTHNOVmJHZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY29sb3ItbmFtZSI6ICIxLjEuMyIKKyAgICAgIH0KKyAgICB9LAorICAgICJjb2xvci1uYW1lIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvbG9yLW5hbWUvLS9jb2xvci1uYW1lLTEuMS4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcDlCVmk5aWNRdmVWM1VJeWozUUlNY3BUdkNVPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNvbG9ycyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb2xvcnMvLS9jb2xvcnMtMS4xLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1Gb3BIQVhWcmFuOVJvU3pneVh2NktNQ0U3V009IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY29tYmluZWQtc3RyZWFtIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjciLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvbWJpbmVkLXN0cmVhbS8tL2NvbWJpbmVkLXN0cmVhbS0xLjAuNy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItYnJXbDl5NnZPQjF4WVBaY3BaZGUzTjl6REJ5WFRvc0FlTURvNHAxd3pvNlVNT1g0dnVtQitUUDFSWjc2c2ZFNk1kNjhRME5KU3JFL2diZXpkNFVsK3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRlbGF5ZWQtc3RyZWFtIjogIn4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJjb21wb25lbnQtZW1pdHRlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMi4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb21wb25lbnQtZW1pdHRlci8tL2NvbXBvbmVudC1lbWl0dGVyLTEuMi4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRTNrWTF0ZUNnL2ZmZW10OFdtUGhRT2FVSmVZPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNvbmNhdC1tYXAiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29uY2F0LW1hcC8tL2NvbmNhdC1tYXAtMC4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0yS2xyMTMvV2pmZDVPbk1EYWp1ZzFVQmRSM3M9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY29uY2F0LXN0cmVhbSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuNi4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb25jYXQtc3RyZWFtLy0vY29uY2F0LXN0cmVhbS0xLjYuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItMjdIQmdoSnhqaVp0SWszWWN2bi80a2JKay8xdVp1SkZmdVBFbnM2TGFFdnB2RzFmMGhUZWE4bGlscm91eW85bVZjMkdXZGNFWjhPTG9HbVNBRGxyQ3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImJ1ZmZlci1mcm9tIjogIl4xLjAuMCIsCisgICAgICAgICJpbmhlcml0cyI6ICJeMi4wLjMiLAorICAgICAgICAicmVhZGFibGUtc3RyZWFtIjogIl4yLjIuMiIsCisgICAgICAgICJ0eXBlZGFycmF5IjogIl4wLjAuNiIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAicmVhZGFibGUtc3RyZWFtIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMy42IiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZWFkYWJsZS1zdHJlYW0vLS9yZWFkYWJsZS1zdHJlYW0tMi4zLjYudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi10UXRLQTlXSUFoQkYzK1ZMQXNleU1xWmVCalcwQUhKb3hPdFlxU1VaTkp4YXVFcm1MYlZtMkZXMXkrSi9ZQTlkVXJBQzM5SVRlamxaV2hWSXdhd2tLdz09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiY29yZS11dGlsLWlzIjogIn4xLjAuMCIsCisgICAgICAgICAgICAiaW5oZXJpdHMiOiAifjIuMC4zIiwKKyAgICAgICAgICAgICJpc2FycmF5IjogIn4xLjAuMCIsCisgICAgICAgICAgICAicHJvY2Vzcy1uZXh0aWNrLWFyZ3MiOiAifjIuMC4wIiwKKyAgICAgICAgICAgICJzYWZlLWJ1ZmZlciI6ICJ+NS4xLjEiLAorICAgICAgICAgICAgInN0cmluZ19kZWNvZGVyIjogIn4xLjEuMSIsCisgICAgICAgICAgICAidXRpbC1kZXByZWNhdGUiOiAifjEuMC4xIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgInN0cmluZ19kZWNvZGVyIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMS4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3RyaW5nX2RlY29kZXIvLS9zdHJpbmdfZGVjb2Rlci0xLjEuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW4vU2hudkRpNkZIYmJWZnZpcm8rV29qaUZ6ditzOE1QTUhCY3pWZVBmVXBESkx3b0xUMGh0MWw0WXdCQ2JpOHBKQXZlRUVkbmtIeVB5VFAvbXpSZndnPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJzYWZlLWJ1ZmZlciI6ICJ+NS4xLjAiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiY29uc29sZS1icm93c2VyaWZ5IjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvbnNvbGUtYnJvd3NlcmlmeS8tL2NvbnNvbGUtYnJvd3NlcmlmeS0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLThDUWNSWE1LbjhZeU95QnR2emp0eDBIUXV4QT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJkYXRlLW5vdyI6ICJeMC4xLjQiCisgICAgICB9CisgICAgfSwKKyAgICAiY29weS1kZXNjcmlwdG9yIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvcHktZGVzY3JpcHRvci8tL2NvcHktZGVzY3JpcHRvci0wLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVoyOXVzOE9abDhMdUdzT3BKUDFoSkhTUFY0MD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjb3JlLXV0aWwtaXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29yZS11dGlsLWlzLy0vY29yZS11dGlsLWlzLTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdGYxVUlncWl2RnExZXF0eFFNbEFkVVVEd2FjPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNyb3NzLXNwYXduIjogeworICAgICAgInZlcnNpb24iOiAiNi4wLjUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Nyb3NzLXNwYXduLy0vY3Jvc3Mtc3Bhd24tNi4wLjUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWVUVkxyQlN0N2ZqYkR5Z3o4MDVwTW5zdElzMlZUQk5rUm0wcXhaZCtNN0E1WERkeFZSV081TXhHQlhaaGpZNGNxTFlMZHRyR3FSZjhtQlBtendTcFdRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJuaWNlLXRyeSI6ICJeMS4wLjQiLAorICAgICAgICAicGF0aC1rZXkiOiAiXjIuMC4xIiwKKyAgICAgICAgInNlbXZlciI6ICJeNS41LjAiLAorICAgICAgICAic2hlYmFuZy1jb21tYW5kIjogIl4xLjIuMCIsCisgICAgICAgICJ3aGljaCI6ICJeMS4yLjkiCisgICAgICB9CisgICAgfSwKKyAgICAiY3VycmVudGx5LXVuaGFuZGxlZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jdXJyZW50bHktdW5oYW5kbGVkLy0vY3VycmVudGx5LXVuaGFuZGxlZC0wLjQuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLW1JM3pQK3F4a2U5NW1tRTJuZGRzRjYzNVYrbz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhcnJheS1maW5kLWluZGV4IjogIl4xLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJjeWNsZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jeWNsZS8tL2N5Y2xlLTEuMC4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSWVnTEsraFlENWkwYVBONVF3WmlzRWJEU3RJPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJkYXNoZGFzaCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMTQuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGFzaGRhc2gvLS9kYXNoZGFzaC0xLjE0LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1oVHo2RDN5K0wrMWQ0Z01tdU4xWUVEWDI0dkE9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFzc2VydC1wbHVzIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJkYXRlLW5vdyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kYXRlLW5vdy8tL2RhdGUtbm93LTAuMS40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtNnZRNS9VMUlTSzEwNWN4OXZ2SUFaeXVlTkZzPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImRhdGVmb3JtYXQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMTIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RhdGVmb3JtYXQvLS9kYXRlZm9ybWF0LTEuMC4xMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLW54SkxaMWxNazMvM0JwTXVTbVFzeW8yNy91az0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJnZXQtc3RkaW4iOiAiXjQuMC4xIiwKKyAgICAgICAgIm1lb3ciOiAiXjMuMy4wIgorICAgICAgfQorICAgIH0sCisgICAgImRlYnVnIjogeworICAgICAgInZlcnNpb24iOiAiMi42LjkiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlYnVnLy0vZGVidWctMi42LjkudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWJDN0VscmRKYUpuUGJBUCsxRW90WXZxWnNiM2VjbDV3aTZCZmk2QkpUVWNOb3dwNmN2c3BnMGpYem5SVEtEam0vRTdBZGdGQlZlQVBWTU5jS0dzSE1BPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJtcyI6ICIyLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJkZWNhbWVsaXplIjogeworICAgICAgInZlcnNpb24iOiAiMS4yLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlY2FtZWxpemUvLS9kZWNhbWVsaXplLTEuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtOWxOTkZSU0NhYklEVXVlKzRtOVFINW9aRXBBPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImRlY29kZS11cmktY29tcG9uZW50IjogeworICAgICAgInZlcnNpb24iOiAiMC4yLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlY29kZS11cmktY29tcG9uZW50Ly0vZGVjb2RlLXVyaS1jb21wb25lbnQtMC4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS02emtUTXpSWWQxeTRUTkdoK3VCaUVHdTRkVVU9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZGVmaW5lLXByb3BlcnR5IjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlZmluZS1wcm9wZXJ0eS8tL2RlZmluZS1wcm9wZXJ0eS0yLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItandLMlVWNGNuUHBiY0c3K1ZSQVJLVFpQVVdvd3dYQThiekg1TlA2dWQwb2VBeHlZUHVHWlVBQzdoTXVncENkejRCZVNabDJEbDlrNjZDSEovNDZaWVE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzLWRlc2NyaXB0b3IiOiAiXjEuMC4yIiwKKyAgICAgICAgImlzb2JqZWN0IjogIl4zLjAuMSIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiaXMtYWNjZXNzb3ItZGVzY3JpcHRvciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWFjY2Vzc29yLWRlc2NyaXB0b3IvLS9pcy1hY2Nlc3Nvci1kZXNjcmlwdG9yLTEuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItbTVobkhUa2NWc1BmcXgzQUtseXR0SVBiN0orWHlrSHZKUDJCOWJaRGpsaExJb0VxNFhvSzY0Vmc3Ym9abFZXWUs2TFVZOTRkWVBFRTdMaDBaa1pLY1E9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImtpbmQtb2YiOiAiXjYuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImlzLWRhdGEtZGVzY3JpcHRvciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWRhdGEtZGVzY3JpcHRvci8tL2lzLWRhdGEtZGVzY3JpcHRvci0xLjAuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWpiUlh5MUZtdEFvQ2pRa1ZtSVZZd3V1cURGVWJhT2VEam1lZDF0T0dQcnNNaHRKQTRyRDl0a2dBMEYxcUozZ1JGUlhjSFlWa2RlYVA1MFE1ckUvakxRPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJraW5kLW9mIjogIl42LjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJpcy1kZXNjcmlwdG9yIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZGVzY3JpcHRvci8tL2lzLWRlc2NyaXB0b3ItMS4wLjIudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0yZWlzNVdxUUdWN3Blb29EeUxtTkVQVXJwczkrU1hYNWM5cEwzeEVCKzRlOUhuR3VEYTdtQjdrSHhIdzRDYnFTOWsxVDJoT0gzbWlMOG44V3RpWVZ0Zz09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtYWNjZXNzb3ItZGVzY3JpcHRvciI6ICJeMS4wLjAiLAorICAgICAgICAgICAgImlzLWRhdGEtZGVzY3JpcHRvciI6ICJeMS4wLjAiLAorICAgICAgICAgICAgImtpbmQtb2YiOiAiXjYuMC4yIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImRlbGF5ZWQtc3RyZWFtIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlbGF5ZWQtc3RyZWFtLy0vZGVsYXllZC1zdHJlYW0tMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0zenJobWF5dCszMUVDcXJnc3A0aWNySk94aGs9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZGV0ZWN0LWZpbGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGV0ZWN0LWZpbGUvLS9kZXRlY3QtZmlsZS0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLThOWnRBMmNxZ2x5eHR6dmJQK1lqRU1qbFVyYz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJkb20tc2VyaWFsaXplciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kb20tc2VyaWFsaXplci8tL2RvbS1zZXJpYWxpemVyLTAuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtQnp4cGRVYk9CNERPSTc1S0tPS1Q1QXZERElJPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRvbWVsZW1lbnR0eXBlIjogIn4xLjEuMSIsCisgICAgICAgICJlbnRpdGllcyI6ICJ+MS4xLjEiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImRvbWVsZW1lbnR0eXBlIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMS4zIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZG9tZWxlbWVudHR5cGUvLS9kb21lbGVtZW50dHlwZS0xLjEuMy50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS12U2gzUGlaQ2lCcnNVVlJKSkNtY1hOZ2lHRnM9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9LAorICAgICAgICAiZW50aXRpZXMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4xLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lbnRpdGllcy8tL2VudGl0aWVzLTEuMS4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLWJsd3RDbFlodGRyYTdPK0F1UTdmdGMxM2N2QT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJkb21lbGVtZW50dHlwZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kb21lbGVtZW50dHlwZS8tL2RvbWVsZW1lbnR0eXBlLTEuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtc1hydGd1aXJXZVV0MmNHYkYxYmcvQmh5Qk1JPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImRvbWhhbmRsZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjMuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZG9taGFuZGxlci8tL2RvbWhhbmRsZXItMi4zLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1MZVdhQ0NMVkFuK3IvMjhETENzbG9xaXI1emc9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZG9tZWxlbWVudHR5cGUiOiAiMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJkb211dGlscyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuNS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kb211dGlscy8tL2RvbXV0aWxzLTEuNS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtM05oSWlpYjFZOVlRZWVTTW4zdCtNamMyZ3M4PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRvbS1zZXJpYWxpemVyIjogIjAiLAorICAgICAgICAiZG9tZWxlbWVudHR5cGUiOiAiMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJlY2MtanNibiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lY2MtanNibi8tL2VjYy1qc2JuLTAuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtT29PcEJPVkRVeWg0ZE1Wa3QxU1Rob1NhbU1rPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJqc2JuIjogIn4wLjEuMCIsCisgICAgICAgICJzYWZlci1idWZmZXIiOiAiXjIuMS4wIgorICAgICAgfQorICAgIH0sCisgICAgImVudGl0aWVzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VudGl0aWVzLy0vZW50aXRpZXMtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1zcGg2bzRJVFIvemVaQ3NrL2Z5ZVQ3Y1N2eVk9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZXJyb3ItZXgiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjMuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXJyb3ItZXgvLS9lcnJvci1leC0xLjMuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItN2RGSE5tcWVGU0V0MlpCc0NyaW9yS25uM1oycGorZmQ5a21JNlFvV3c0Ly9ETCtpY0VCZmMwVTdxSkNpc3FyVHNLVGp3NGZORnkycFc5T3FTdEQ4NGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzLWFycmF5aXNoIjogIl4wLjIuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJlczYtcHJvbWlzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMi41IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lczYtcHJvbWlzZS8tL2VzNi1wcm9taXNlLTQuMi41LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1uNnd2cGRFNDNWRnRKcStsVURZREJGVXdWOFRaYnVHWExWNEQ2d0thZmcxM2xkem5Lc3lFdmF0dWJubVVlMzF6Y3ZlbFN6T0hGK1hiYVQrQmw5T2JEZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZXM2LXByb21pc2lmeSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjUuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2VzNi1wcm9taXNpZnkvLS9lczYtcHJvbWlzaWZ5LTUuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVVFuV0x6NVc2cFo4UzJOUVd1OElLUnlLVWdNPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImVzNi1wcm9taXNlIjogIl40LjAuMyIKKyAgICAgIH0KKyAgICB9LAorICAgICJlc2NhcGUtc3RyaW5nLXJlZ2V4cCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC41IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc2NhcGUtc3RyaW5nLXJlZ2V4cC8tL2VzY2FwZS1zdHJpbmctcmVnZXhwLTEuMC41LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRzJIQVZpR1FxTi8ycmp1eXp3SUF5aE1MaHRRPSIKKyAgICB9LAorICAgICJlc3ByaW1hIjogeworICAgICAgInZlcnNpb24iOiAiMi43LjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzcHJpbWEvLS9lc3ByaW1hLTIuNy4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbHVPM0RWZDU5cTFKelFNbWM5SERFblo3cFlFPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImV2ZW50ZW1pdHRlcjIiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjQuMTQiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXZlbnRlbWl0dGVyMi8tL2V2ZW50ZW1pdHRlcjItMC40LjE0LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtajJHM1hONEJLeTZlc29UVVZGV0R0V1E3WWFzPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImV4aXQiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXhpdC8tL2V4aXQtMC4xLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1CakpqajQySGZNZ2hCOU1LRC84YUY4dWh6UXc9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZXhwYW5kLWJyYWNrZXRzIjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V4cGFuZC1icmFja2V0cy8tL2V4cGFuZC1icmFja2V0cy0yLjEuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXQzYzE0eFhPTVBhMjcvRDRPd1FWR2lKRWxpST0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJkZWJ1ZyI6ICJeMi4zLjMiLAorICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogIl4wLjIuNSIsCisgICAgICAgICJleHRlbmQtc2hhbGxvdyI6ICJeMi4wLjEiLAorICAgICAgICAicG9zaXgtY2hhcmFjdGVyLWNsYXNzZXMiOiAiXjAuMS4wIiwKKyAgICAgICAgInJlZ2V4LW5vdCI6ICJeMS4wLjAiLAorICAgICAgICAic25hcGRyYWdvbiI6ICJeMC44LjEiLAorICAgICAgICAidG8tcmVnZXgiOiAiXjMuMC4xIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJkZWZpbmUtcHJvcGVydHkiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMC4yLjUiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWZpbmUtcHJvcGVydHkvLS9kZWZpbmUtcHJvcGVydHktMC4yLjUudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdzFzZStSanNQSmtQbWx2RmUrQktyT3hjZ1JZPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWRlc2NyaXB0b3IiOiAiXjAuMS4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImV4dGVuZC1zaGFsbG93IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXh0ZW5kLXNoYWxsb3cvLS9leHRlbmQtc2hhbGxvdy0yLjAuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1VYTk5WVVyWnFmWVE2aHV2dTVpZGF4eFdpUTg9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtZXh0ZW5kYWJsZSI6ICJeMC4xLjAiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiZXhwYW5kLXRpbGRlIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V4cGFuZC10aWxkZS8tL2V4cGFuZC10aWxkZS0yLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWwrZ0JxZ1V0OENSVTNrYXdLL1loWkN6Y2hRST0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJob21lZGlyLXBvbHlmaWxsIjogIl4xLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJleHRlbmQiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXh0ZW5kLy0vZXh0ZW5kLTMuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1manF1QzU5Y0Q3Q3lXNnVyTlhLMEZCdWZrWmNvaUdHODB3VHVQdWpYNTkwY0I1VHRsbjIwRTJVQjRTL1dBUlZxaFhmZlpsMkxOZ1MrZ1FkUElJaW0vZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZXh0ZW5kLXNoYWxsb3ciOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXh0ZW5kLXNoYWxsb3cvLS9leHRlbmQtc2hhbGxvdy0zLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUpxY2Fyd2M3T2ZzaEp4Y25SaE1jSndRQ2piZz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhc3NpZ24tc3ltYm9scyI6ICJeMS4wLjAiLAorICAgICAgICAiaXMtZXh0ZW5kYWJsZSI6ICJeMS4wLjEiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImlzLWV4dGVuZGFibGUiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1leHRlbmRhYmxlLy0vaXMtZXh0ZW5kYWJsZS0xLjAuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWFyblhNeFQxaGhvS285azFMWmRtbE55SmRERGZ5MnYwZlhqRmxtb2s0K2k4dWwvNldsYlZnZTliaE03NE9wTlBRUE1HVVRvRHR6K0tYYTFQbmVKeE9BPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1wbGFpbi1vYmplY3QiOiAiXjIuMC40IgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImV4dGdsb2IiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXh0Z2xvYi8tL2V4dGdsb2ItMi4wLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU5tYjZRWGtFTHN1QnIyNENKU2tpbG82VUhIZ2Jla0s1VWlaZ2ZFNlVIRDNFYjI3WUM2b0QrYmhjVCt0SjZjbDhkbXNnZFF4bldsY3J5OGtzQklCTHB3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhcnJheS11bmlxdWUiOiAiXjAuMy4yIiwKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6ICJeMS4wLjAiLAorICAgICAgICAiZXhwYW5kLWJyYWNrZXRzIjogIl4yLjEuNCIsCisgICAgICAgICJleHRlbmQtc2hhbGxvdyI6ICJeMi4wLjEiLAorICAgICAgICAiZnJhZ21lbnQtY2FjaGUiOiAiXjAuMi4xIiwKKyAgICAgICAgInJlZ2V4LW5vdCI6ICJeMS4wLjAiLAorICAgICAgICAic25hcGRyYWdvbiI6ICJeMC44LjEiLAorICAgICAgICAidG8tcmVnZXgiOiAiXjMuMC4xIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJkZWZpbmUtcHJvcGVydHkiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWZpbmUtcHJvcGVydHkvLS9kZWZpbmUtcHJvcGVydHktMS4wLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZHA2NnJ6OUtZNnJUcjU2Tk1FeWJ2bm0vc09ZPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWRlc2NyaXB0b3IiOiAiXjEuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImV4dGVuZC1zaGFsbG93IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXh0ZW5kLXNoYWxsb3cvLS9leHRlbmQtc2hhbGxvdy0yLjAuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1VYTk5WVVyWnFmWVE2aHV2dTVpZGF4eFdpUTg9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtZXh0ZW5kYWJsZSI6ICJeMC4xLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAiaXMtYWNjZXNzb3ItZGVzY3JpcHRvciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWFjY2Vzc29yLWRlc2NyaXB0b3IvLS9pcy1hY2Nlc3Nvci1kZXNjcmlwdG9yLTEuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItbTVobkhUa2NWc1BmcXgzQUtseXR0SVBiN0orWHlrSHZKUDJCOWJaRGpsaExJb0VxNFhvSzY0Vmc3Ym9abFZXWUs2TFVZOTRkWVBFRTdMaDBaa1pLY1E9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImtpbmQtb2YiOiAiXjYuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImlzLWRhdGEtZGVzY3JpcHRvciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWRhdGEtZGVzY3JpcHRvci8tL2lzLWRhdGEtZGVzY3JpcHRvci0xLjAuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWpiUlh5MUZtdEFvQ2pRa1ZtSVZZd3V1cURGVWJhT2VEam1lZDF0T0dQcnNNaHRKQTRyRDl0a2dBMEYxcUozZ1JGUlhjSFlWa2RlYVA1MFE1ckUvakxRPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJraW5kLW9mIjogIl42LjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJpcy1kZXNjcmlwdG9yIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZGVzY3JpcHRvci8tL2lzLWRlc2NyaXB0b3ItMS4wLjIudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0yZWlzNVdxUUdWN3Blb29EeUxtTkVQVXJwczkrU1hYNWM5cEwzeEVCKzRlOUhuR3VEYTdtQjdrSHhIdzRDYnFTOWsxVDJoT0gzbWlMOG44V3RpWVZ0Zz09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtYWNjZXNzb3ItZGVzY3JpcHRvciI6ICJeMS4wLjAiLAorICAgICAgICAgICAgImlzLWRhdGEtZGVzY3JpcHRvciI6ICJeMS4wLjAiLAorICAgICAgICAgICAgImtpbmQtb2YiOiAiXjYuMC4yIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImV4dHJhY3QtemlwIjogeworICAgICAgInZlcnNpb24iOiAiMS42LjciLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V4dHJhY3QtemlwLy0vZXh0cmFjdC16aXAtMS42LjcudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1xRUMwdUs5a0F5Wk1qYlYvVHhwME16NzRIK2s9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY29uY2F0LXN0cmVhbSI6ICIxLjYuMiIsCisgICAgICAgICJkZWJ1ZyI6ICIyLjYuOSIsCisgICAgICAgICJta2RpcnAiOiAiMC41LjEiLAorICAgICAgICAieWF1emwiOiAiMi40LjEiCisgICAgICB9CisgICAgfSwKKyAgICAiZXh0c3ByaW50ZiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9leHRzcHJpbnRmLy0vZXh0c3ByaW50Zi0xLjMuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWxwR0VRT01FR25wQlQ0eFM0OFYwNnp3K0hnVT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJleWVzIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjgiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V5ZXMvLS9leWVzLTAuMS44LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWXM4U0FqVEdnM2hka0NOSXFBRHZQZ3pDQzhBPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJmYXN0LWRlZXAtZXF1YWwiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmFzdC1kZWVwLWVxdWFsLy0vZmFzdC1kZWVwLWVxdWFsLTEuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtd0ZOSGVCZklhMUhhcUZQSUhnV2JjejBDTmhRPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJmYXN0LWpzb24tc3RhYmxlLXN0cmluZ2lmeSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mYXN0LWpzb24tc3RhYmxlLXN0cmluZ2lmeS8tL2Zhc3QtanNvbi1zdGFibGUtc3RyaW5naWZ5LTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtMVJRc0RLN21zUmlmaDlPbllSRUdUNGJJdS9JPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJmZC1zbGljZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmQtc2xpY2VyLy0vZmQtc2xpY2VyLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtaTF2TDJld3lmRkJCdjVxd0kvMW5VUEVYZm1VPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInBlbmQiOiAifjEuMi4wIgorICAgICAgfQorICAgIH0sCisgICAgImZpZ3VyZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjcuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmlndXJlcy8tL2ZpZ3VyZXMtMS43LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS15K0hqci96eHpVUzRESzMrMG8zSGs2bHdIUzQ9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXNjYXBlLXN0cmluZy1yZWdleHAiOiAiXjEuMC41IiwKKyAgICAgICAgIm9iamVjdC1hc3NpZ24iOiAiXjQuMS4wIgorICAgICAgfQorICAgIH0sCisgICAgImZpbGwtcmFuZ2UiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmlsbC1yYW5nZS8tL2ZpbGwtcmFuZ2UtNC4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0xVVNCSFVLUG1Pc0dwajNFQXRKQVBES01PUGM9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiAiXjIuMC4xIiwKKyAgICAgICAgImlzLW51bWJlciI6ICJeMy4wLjAiLAorICAgICAgICAicmVwZWF0LXN0cmluZyI6ICJeMS42LjEiLAorICAgICAgICAidG8tcmVnZXgtcmFuZ2UiOiAiXjIuMS4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJleHRlbmQtc2hhbGxvdyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V4dGVuZC1zaGFsbG93Ly0vZXh0ZW5kLXNoYWxsb3ctMi4wLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVWE5OVlVclpxZllRNmh1dnU1aWRheHhXaVE4PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWV4dGVuZGFibGUiOiAiXjAuMS4wIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImZpbmQtdXAiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmluZC11cC8tL2ZpbmQtdXAtMS4xLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1heTZZSXJHaXpncGdxMlRXRU96SzFUeXlUUTg9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicGF0aC1leGlzdHMiOiAiXjIuMC4wIiwKKyAgICAgICAgInBpbmtpZS1wcm9taXNlIjogIl4yLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJmaW5kdXAtc3luYyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9maW5kdXAtc3luYy8tL2ZpbmR1cC1zeW5jLTAuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTjVNS3BkZ1d0M2ZBTkVYaGxtekdlUXBNQ3hZPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImdsb2IiOiAifjUuMC4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJnbG9iIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjUuMC4xNSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dsb2IvLS9nbG9iLTUuMC4xNS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1HOGsydWVBdlNtQS96Q0l1ejNZejB3dUxrN0U9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaW5mbGlnaHQiOiAiXjEuMC40IiwKKyAgICAgICAgICAgICJpbmhlcml0cyI6ICIyIiwKKyAgICAgICAgICAgICJtaW5pbWF0Y2giOiAiMiB8fCAzIiwKKyAgICAgICAgICAgICJvbmNlIjogIl4xLjMuMCIsCisgICAgICAgICAgICAicGF0aC1pcy1hYnNvbHV0ZSI6ICJeMS4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiZmluZWQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmluZWQvLS9maW5lZC0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXMzM0lSTGRxTDE1d2dlaUU5OEN1TkU4Vk5IWT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJleHBhbmQtdGlsZGUiOiAiXjIuMC4yIiwKKyAgICAgICAgImlzLXBsYWluLW9iamVjdCI6ICJeMi4wLjMiLAorICAgICAgICAib2JqZWN0LmRlZmF1bHRzIjogIl4xLjEuMCIsCisgICAgICAgICJvYmplY3QucGljayI6ICJeMS4yLjAiLAorICAgICAgICAicGFyc2UtZmlsZXBhdGgiOiAiXjEuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgImZsYWdnZWQtcmVzcGF3biI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mbGFnZ2VkLXJlc3Bhd24vLS9mbGFnZ2VkLXJlc3Bhd24tMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1Ubm11bXk2emkvaHJPN1ZyOCtDbGFxWDhxOWM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZm9yLWluIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Zvci1pbi8tL2Zvci1pbi0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWdRYU5LVnFCUXV3S3h5Ykc0aUFNTVB0dFhvQT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJmb3Itb3duIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Zvci1vd24vLS9mb3Itb3duLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEteGpNeTlCWE8zRXNFMi81d3o0TmtsTVU4dEVzPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImZvci1pbiI6ICJeMS4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiZm9yZXZlci1hZ2VudCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNi4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mb3JldmVyLWFnZW50Ly0vZm9yZXZlci1hZ2VudC0wLjYuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLSs4Y2ZERUd0NnpmNWJGZDYwZTFDMlAyc3lwRT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAiZm9ybS1kYXRhIjogeworICAgICAgInZlcnNpb24iOiAiMi4zLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Zvcm0tZGF0YS8tL2Zvcm0tZGF0YS0yLjMuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItMWxMS0IyTXUzYUdQMVEvMmVDT3gwZk5iUk1lN1hkd2t0d09ydWhmcXFkMHJJSld3TjREaCtFM2hyUFNsRENYblNSN1V0WjFOMzhyVlhtKzYrTUVoSlE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhc3luY2tpdCI6ICJeMC40LjAiLAorICAgICAgICAiY29tYmluZWQtc3RyZWFtIjogIl4xLjAuNiIsCisgICAgICAgICJtaW1lLXR5cGVzIjogIl4yLjEuMTIiCisgICAgICB9CisgICAgfSwKKyAgICAiZnJhZ21lbnQtY2FjaGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZnJhZ21lbnQtY2FjaGUvLS9mcmFnbWVudC1jYWNoZS0wLjIuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVFwRDYwbjhUNkp2bjh6ZVp4cnhhQ3IvL0RSaz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJtYXAtY2FjaGUiOiAiXjAuMi4yIgorICAgICAgfQorICAgIH0sCisgICAgImZzLWV4dHJhIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ZzLWV4dHJhLy0vZnMtZXh0cmEtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS16VHpsOStmTFlVV0lQOHJqR1I2WWQvaFllVkE9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImdyYWNlZnVsLWZzIjogIl40LjEuMiIsCisgICAgICAgICJqc29uZmlsZSI6ICJeMi4xLjAiLAorICAgICAgICAia2xhdyI6ICJeMS4wLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImtsYXciOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4zLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9rbGF3Ly0va2xhdy0xLjMuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1RSWhETzBhenNib2xuWGg0WFk2Vzl6dWdKRGs9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJncmFjZWZ1bC1mcyI6ICJeNC4xLjkiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiZnMucmVhbHBhdGgiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZnMucmVhbHBhdGgvLS9mcy5yZWFscGF0aC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUZRU3RKU01WaktwQTIwb25oOHNCUVJtVTZrOD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJnZXQtc3RkaW4iOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ2V0LXN0ZGluLy0vZ2V0LXN0ZGluLTQuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdVdqR3NLQkRoREpKQXVpL0dsM3pKWG1rVVA0PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImdldC12YWx1ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC42IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9nZXQtdmFsdWUvLS9nZXQtdmFsdWUtMi4wLjYudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0zQlhLSEdjamg4cDJ2VGVzQ2psYm9nUXFMQ2c9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZ2V0b2JqZWN0IjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dldG9iamVjdC8tL2dldG9iamVjdC0wLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUJIcEVsNG42RmcwQmoxU0c3WkV5QzI3SGlGdz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJnZXRwYXNzIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjciLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dldHBhc3MvLS9nZXRwYXNzLTAuMS43LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWHYrT1BtaE5WcHJreXlzU2dtQk9pNlloU2ZvPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhc3NlcnQtcGx1cyI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiZ2xvYiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjcuMC42IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9nbG9iLy0vZ2xvYi03LjAuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUlSdXZyMG5sSmJqTmt5WU5GS3NUWVZLejlYbz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJmcy5yZWFscGF0aCI6ICJeMS4wLjAiLAorICAgICAgICAiaW5mbGlnaHQiOiAiXjEuMC40IiwKKyAgICAgICAgImluaGVyaXRzIjogIjIiLAorICAgICAgICAibWluaW1hdGNoIjogIl4zLjAuMiIsCisgICAgICAgICJvbmNlIjogIl4xLjMuMCIsCisgICAgICAgICJwYXRoLWlzLWFic29sdXRlIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJnbG9iYWwtbW9kdWxlcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9nbG9iYWwtbW9kdWxlcy8tL2dsb2JhbC1tb2R1bGVzLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1zS3pwRWtmMTFHcE9GdXcwWnpqem10NEI0VVp3ak9jRzc1N1BQdnJmaHhjTEZicTB3cHNncE9xeHB4dHhGaUNHNER0RzkzTTZYUlZiRjJvR2RldjdiZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZ2xvYmFsLXByZWZpeCI6ICJeMS4wLjEiLAorICAgICAgICAiaXMtd2luZG93cyI6ICJeMS4wLjEiLAorICAgICAgICAicmVzb2x2ZS1kaXIiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImdsb2JhbC1wcmVmaXgiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ2xvYmFsLXByZWZpeC8tL2dsb2JhbC1wcmVmaXgtMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0yL2REeHNGSmtsazhaVlZveTJidE1zQVNMcjQ9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXhwYW5kLXRpbGRlIjogIl4yLjAuMiIsCisgICAgICAgICJob21lZGlyLXBvbHlmaWxsIjogIl4xLjAuMSIsCisgICAgICAgICJpbmkiOiAiXjEuMy40IiwKKyAgICAgICAgImlzLXdpbmRvd3MiOiAiXjEuMC4xIiwKKyAgICAgICAgIndoaWNoIjogIl4xLjIuMTQiCisgICAgICB9CisgICAgfSwKKyAgICAiZ3JhY2VmdWwtZnMiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjEuMTEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dyYWNlZnVsLWZzLy0vZ3JhY2VmdWwtZnMtNC4xLjExLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRG92ZjVOSGR1SVZOWk9CT3A4QU9LZ0p1VmxnPSIKKyAgICB9LAorICAgICJncnVudCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ncnVudC8tL2dydW50LTEuMC4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0vSnptWk5QZktvcmxDcnJteFdxUU80SlZvZE8rRFZkNVhYNERrb2NMLzFXbExsS1ZMRTkrU2RFSWVtcE9BeERoV1B5c0xsZTZhZnZuL2hnN0NrMms5Zz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY29mZmVlc2NyaXB0IjogIn4xLjEwLjAiLAorICAgICAgICAiZGF0ZWZvcm1hdCI6ICJ+MS4wLjEyIiwKKyAgICAgICAgImV2ZW50ZW1pdHRlcjIiOiAifjAuNC4xMyIsCisgICAgICAgICJleGl0IjogIn4wLjEuMSIsCisgICAgICAgICJmaW5kdXAtc3luYyI6ICJ+MC4zLjAiLAorICAgICAgICAiZ2xvYiI6ICJ+Ny4wLjAiLAorICAgICAgICAiZ3J1bnQtY2xpIjogIn4xLjIuMCIsCisgICAgICAgICJncnVudC1rbm93bi1vcHRpb25zIjogIn4xLjEuMCIsCisgICAgICAgICJncnVudC1sZWdhY3ktbG9nIjogIn4yLjAuMCIsCisgICAgICAgICJncnVudC1sZWdhY3ktdXRpbCI6ICJ+MS4xLjEiLAorICAgICAgICAiaWNvbnYtbGl0ZSI6ICJ+MC40LjEzIiwKKyAgICAgICAgImpzLXlhbWwiOiAifjMuNS4yIiwKKyAgICAgICAgIm1pbmltYXRjaCI6ICJ+My4wLjIiLAorICAgICAgICAibWtkaXJwIjogIn4wLjUuMSIsCisgICAgICAgICJub3B0IjogIn4zLjAuNiIsCisgICAgICAgICJwYXRoLWlzLWFic29sdXRlIjogIn4xLjAuMCIsCisgICAgICAgICJyaW1yYWYiOiAifjIuNi4yIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJncnVudC1jbGkiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4yLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ncnVudC1jbGkvLS9ncnVudC1jbGktMS4yLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVmlzUm5yc0duZHRHU3M0b1JWQWI2WHMxdHFnPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImZpbmR1cC1zeW5jIjogIn4wLjMuMCIsCisgICAgICAgICAgICAiZ3J1bnQta25vd24tb3B0aW9ucyI6ICJ+MS4xLjAiLAorICAgICAgICAgICAgIm5vcHQiOiAifjMuMC42IiwKKyAgICAgICAgICAgICJyZXNvbHZlIjogIn4xLjEuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJub3B0IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjMuMC42IiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbm9wdC8tL25vcHQtMy4wLjYudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEteGtaZHZ3aXJ6VTJ6V1RGL2VheG9wa2F5ai9rPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImFiYnJldiI6ICIxIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImdydW50LWNsaSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMy4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ncnVudC1jbGkvLS9ncnVudC1jbGktMS4zLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVV3QlJ1L1FwQWpEYzUzRFJMRWt5aWxGZEwwemVucHh1K2ZkZFRJbHNGL0tKcWROY0hhUW12eXUxVzNjRGVzWjlycXFaZEtLNUE4K1FESXlMVUVXb1pRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJncnVudC1rbm93bi1vcHRpb25zIjogIn4xLjEuMCIsCisgICAgICAgICJpbnRlcnByZXQiOiAifjEuMS4wIiwKKyAgICAgICAgImxpZnRvZmYiOiAifjIuNS4wIiwKKyAgICAgICAgIm5vcHQiOiAifjQuMC4xIiwKKyAgICAgICAgInY4ZmxhZ3MiOiAifjMuMC4yIgorICAgICAgfQorICAgIH0sCisgICAgImdydW50LWNvbnRyaWItY29uY2F0IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dydW50LWNvbnRyaWItY29uY2F0Ly0vZ3J1bnQtY29udHJpYi1jb25jYXQtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1ZVkNZWXdoT2h4MStodDVJd0JVbG50bDNSYjA9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY2hhbGsiOiAiXjEuMC4wIiwKKyAgICAgICAgInNvdXJjZS1tYXAiOiAiXjAuNS4zIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJhbnNpLXN0eWxlcyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjIuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fuc2ktc3R5bGVzLy0vYW5zaS1zdHlsZXMtMi4yLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdERMZE0xaTJOTTkxNGVSbVEyZ2tCVFBCM2I0PSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfSwKKyAgICAgICAgImNoYWxrIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMS4zIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jaGFsay8tL2NoYWxrLTEuMS4zLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLXFCRmNWZVNuQXY1TkZRcTlPSEtDS240Si9KZz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJhbnNpLXN0eWxlcyI6ICJeMi4yLjEiLAorICAgICAgICAgICAgImVzY2FwZS1zdHJpbmctcmVnZXhwIjogIl4xLjAuMiIsCisgICAgICAgICAgICAiaGFzLWFuc2kiOiAiXjIuMC4wIiwKKyAgICAgICAgICAgICJzdHJpcC1hbnNpIjogIl4zLjAuMCIsCisgICAgICAgICAgICAic3VwcG9ydHMtY29sb3IiOiAiXjIuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgInN1cHBvcnRzLWNvbG9yIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3VwcG9ydHMtY29sb3IvLS9zdXBwb3J0cy1jb2xvci0yLjAuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1VMTBFWE9hMk5qK2tBUmNJUmltWlhwM3pKTWM9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiZ3J1bnQtY29udHJpYi1qc2hpbnQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ncnVudC1jb250cmliLWpzaGludC8tL2dydW50LWNvbnRyaWItanNoaW50LTEuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTnAyUW15V1R4QTZMNTVsQXNoTkFoUXg1T2F3PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNoYWxrIjogIl4xLjEuMSIsCisgICAgICAgICJob29rZXIiOiAiXjAuMi4zIiwKKyAgICAgICAgImpzaGludCI6ICJ+Mi45LjQiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImFuc2ktc3R5bGVzIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMi4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYW5zaS1zdHlsZXMvLS9hbnNpLXN0eWxlcy0yLjIuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS10RExkTTFpMk5NOTE0ZVJtUTJna0JUUEIzYjQ9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9LAorICAgICAgICAiY2hhbGsiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4xLjMiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2NoYWxrLy0vY2hhbGstMS4xLjMudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcUJGY1ZlU25BdjVORlFxOU9IS0NLbjRKL0pnPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImFuc2ktc3R5bGVzIjogIl4yLjIuMSIsCisgICAgICAgICAgICAiZXNjYXBlLXN0cmluZy1yZWdleHAiOiAiXjEuMC4yIiwKKyAgICAgICAgICAgICJoYXMtYW5zaSI6ICJeMi4wLjAiLAorICAgICAgICAgICAgInN0cmlwLWFuc2kiOiAiXjMuMC4wIiwKKyAgICAgICAgICAgICJzdXBwb3J0cy1jb2xvciI6ICJeMi4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAic3VwcG9ydHMtY29sb3IiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdXBwb3J0cy1jb2xvci8tL3N1cHBvcnRzLWNvbG9yLTIuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLVUxMEVYT2EyTmora0FSY0lSaW1aWHAzekpNYz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJncnVudC1jb250cmliLXF1bml0IjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dydW50LWNvbnRyaWItcXVuaXQvLS9ncnVudC1jb250cmliLXF1bml0LTMuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1zOTk0K2lwS3djK29VVUlXYUdJdzFzb3lJRDRwRXhTR01kL2NIUU41aDBwOEtiSWpSMUxlM1pDM2dpU0RES1h0WkZFMGkrT2JmMHVJak52amZ0WDJDdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXZlbnRlbWl0dGVyMiI6ICJeNS4wLjEiLAorICAgICAgICAicC1lYWNoLXNlcmllcyI6ICJeMS4wLjAiLAorICAgICAgICAicHVwcGV0ZWVyIjogIjEuNy4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJldmVudGVtaXR0ZXIyIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjUuMC4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXZlbnRlbWl0dGVyMi8tL2V2ZW50ZW1pdHRlcjItNS4wLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWVplZ2xkWDdhMWZvbEM5djErcXRZNkNjbEZJPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImdydW50LWNvbnRyaWItdWdsaWZ5IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ3J1bnQtY29udHJpYi11Z2xpZnkvLS9ncnVudC1jb250cmliLXVnbGlmeS0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXJtZWtiNUZUN2RUTEVZRTZWZXRweHcxOXN2cz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjaGFsayI6ICJeMS4wLjAiLAorICAgICAgICAibG9kYXNoIjogIl40LjAuMSIsCisgICAgICAgICJtYXhtaW4iOiAiXjEuMS4wIiwKKyAgICAgICAgInVnbGlmeS1qcyI6ICJ+Mi42LjIiLAorICAgICAgICAidXJpLXBhdGgiOiAiXjEuMC4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJhbnNpLXN0eWxlcyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjIuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fuc2ktc3R5bGVzLy0vYW5zaS1zdHlsZXMtMi4yLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdERMZE0xaTJOTTkxNGVSbVEyZ2tCVFBCM2I0PSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfSwKKyAgICAgICAgImNoYWxrIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMS4zIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jaGFsay8tL2NoYWxrLTEuMS4zLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLXFCRmNWZVNuQXY1TkZRcTlPSEtDS240Si9KZz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJhbnNpLXN0eWxlcyI6ICJeMi4yLjEiLAorICAgICAgICAgICAgImVzY2FwZS1zdHJpbmctcmVnZXhwIjogIl4xLjAuMiIsCisgICAgICAgICAgICAiaGFzLWFuc2kiOiAiXjIuMC4wIiwKKyAgICAgICAgICAgICJzdHJpcC1hbnNpIjogIl4zLjAuMCIsCisgICAgICAgICAgICAic3VwcG9ydHMtY29sb3IiOiAiXjIuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgInN1cHBvcnRzLWNvbG9yIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3VwcG9ydHMtY29sb3IvLS9zdXBwb3J0cy1jb2xvci0yLjAuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1VMTBFWE9hMk5qK2tBUmNJUmltWlhwM3pKTWM9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiZ3J1bnQtanNkb2MiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjMuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ3J1bnQtanNkb2MvLS9ncnVudC1qc2RvYy0yLjMuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZ0M2NlRDUlhlUU1qM0hJeXFWU0JKbTh6ZFV6NDNlNXZhRy9QTE8vNjI3QTFlZGJKbnp4aEpWN25GMEtxTHdNTTBSRE51MWlzdEM2ZnZmbllxRktpM3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNyb3NzLXNwYXduIjogIl42LjAuNSIsCisgICAgICAgICJqc2RvYyI6ICJ+My41LjUiLAorICAgICAgICAibWFya2VkIjogIl4wLjUuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAibWFya2VkIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjAuNS4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWFya2VkLy0vbWFya2VkLTAuNS4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItaVVrQlplZ0Nab3U0QWR3YktUd1NXL2xORGN6NU91UlNsM3FkY2wzMUlhMEIyUVBHMEpuK3RLYmxoLzkvZVA5LzYrNGgyN3Zwb2g4d2VsL3ZRT1Ywdnc9PSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImdydW50LWtub3duLW9wdGlvbnMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ3J1bnQta25vd24tb3B0aW9ucy8tL2dydW50LWtub3duLW9wdGlvbnMtMS4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWNId3NMcW9pZ2hwdTdUdVlqNVJvbm5FdXhHVkZuenRjVXFUcXA1clhGR1lMNE91UEZvZndDNFljZzduOWZZd3ZLNkY1V2JZZ2VWT3dwaDlDcnMyZnNRPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJncnVudC1sZWdhY3ktbG9nIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dydW50LWxlZ2FjeS1sb2cvLS9ncnVudC1sZWdhY3ktbG9nLTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0xbTMrNVF2RFlmUjFsdHI4aGppYWlOamRkeEdkUVdjSDBydzFpS0tpUW5GMCt4dGdUYXppclNUR3U2OFJjaFB5aDFPQm5nMWJCVWpMbVg4cTlOcG9Ddz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY29sb3JzIjogIn4xLjEuMiIsCisgICAgICAgICJncnVudC1sZWdhY3ktbG9nLXV0aWxzIjogIn4yLjAuMCIsCisgICAgICAgICJob29rZXIiOiAifjAuMi4zIiwKKyAgICAgICAgImxvZGFzaCI6ICJ+NC4xNy41IgorICAgICAgfQorICAgIH0sCisgICAgImdydW50LWxlZ2FjeS1sb2ctdXRpbHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ3J1bnQtbGVnYWN5LWxvZy11dGlscy8tL2dydW50LWxlZ2FjeS1sb2ctdXRpbHMtMi4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW83dUh5Ty9KK2kydFhHOHIyYlpObFZrMjB2bElGSjlJRVl5SE1DUUdmV1lydThKdjN3VHFLWnp2VjMwWVc5cldFanEwZVAzY2ZsUTFxV29qSWU5VkZBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjaGFsayI6ICJ+Mi40LjEiLAorICAgICAgICAibG9kYXNoIjogIn40LjE3LjEwIgorICAgICAgfQorICAgIH0sCisgICAgImdydW50LWxlZ2FjeS11dGlsIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dydW50LWxlZ2FjeS11dGlsLy0vZ3J1bnQtbGVnYWN5LXV0aWwtMS4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTl6eUEyOXcvZkJlNkJJZmpHRU5uZHdvZTFVeTMxQklYeFRIM3M4bWdhMFo1QnoyU3A0VUNqa2V5djJ0STQ0OXlta3gzeDI2Qis0NkZWNGZYRWRkbDVBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhc3luYyI6ICJ+MS41LjIiLAorICAgICAgICAiZXhpdCI6ICJ+MC4xLjEiLAorICAgICAgICAiZ2V0b2JqZWN0IjogIn4wLjEuMCIsCisgICAgICAgICJob29rZXIiOiAifjAuMi4zIiwKKyAgICAgICAgImxvZGFzaCI6ICJ+NC4xNy4xMCIsCisgICAgICAgICJ1bmRlcnNjb3JlLnN0cmluZyI6ICJ+My4zLjQiLAorICAgICAgICAid2hpY2giOiAifjEuMy4wIgorICAgICAgfQorICAgIH0sCisgICAgImdydW50LXNoZWxsLXNwYXduIjogeworICAgICAgInZlcnNpb24iOiAiMC4zLjEwIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ncnVudC1zaGVsbC1zcGF3bi8tL2dydW50LXNoZWxsLXNwYXduLTAuMy4xMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWdidU5SWDdFZlRHQ3FIMWpDTytFWGQrNVNJOD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJncnVudCI6ICI+PTAuNC54IiwKKyAgICAgICAgInN5bmMtZXhlYyI6ICJ+MC42LjIiCisgICAgICB9CisgICAgfSwKKyAgICAiZ3ppcC1zaXplIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2d6aXAtc2l6ZS8tL2d6aXAtc2l6ZS0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVpzK0xFQkJISW51VnVzNXVvZG9NRjM3VndpOD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJicm93c2VyaWZ5LXpsaWIiOiAiXjAuMS40IiwKKyAgICAgICAgImNvbmNhdC1zdHJlYW0iOiAiXjEuNC4xIgorICAgICAgfQorICAgIH0sCisgICAgImhhci1zY2hlbWEiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaGFyLXNjaGVtYS8tL2hhci1zY2hlbWEtMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1xVXdpSk92S3dFZUNvTmtEVlNIeVJ6VzM3Skk9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgImhhci12YWxpZGF0b3IiOiB7CisgICAgICAidmVyc2lvbiI6ICI1LjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaGFyLXZhbGlkYXRvci8tL2hhci12YWxpZGF0b3ItNS4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLStxbm1Oakk0T2ZIMmlwUTlWUU93MjNiQmQvaWJ0ZmJWZEsyZlliWTRhY1REcUtUVy9ZRHA5TWNpbVpkRGJHOGlWOWZaaXpVcVFNRDV4dnJpQjE0NlRBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYWp2IjogIl41LjMuMCIsCisgICAgICAgICJoYXItc2NoZW1hIjogIl4yLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJoYXMtYW5zaSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9oYXMtYW5zaS8tL2hhcy1hbnNpLTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTlBVRW5PSHMzeXNHU2E4KzhrNUY3VFZCYlpFPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFuc2ktcmVnZXgiOiAiXjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImhhcy1mbGFnIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2hhcy1mbGFnLy0vaGFzLWZsYWctMy4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS10ZFJVM0NHWnJpSldtZk5HZmxvSDg3bFZ1djA9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaGFzLXZhbHVlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2hhcy12YWx1ZS8tL2hhcy12YWx1ZS0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUdMS0IybGhiSEZ4UjN2Sk1rdzdTbWd2bXNYYz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJnZXQtdmFsdWUiOiAiXjIuMC42IiwKKyAgICAgICAgImhhcy12YWx1ZXMiOiAiXjEuMC4wIiwKKyAgICAgICAgImlzb2JqZWN0IjogIl4zLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJoYXMtdmFsdWVzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2hhcy12YWx1ZXMvLS9oYXMtdmFsdWVzLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbGJDMlArd2hSbUdhYitWLzUxWW8xYU9lL2s4PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzLW51bWJlciI6ICJeMy4wLjAiLAorICAgICAgICAia2luZC1vZiI6ICJeNC4wLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImtpbmQtb2YiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiNC4wLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9raW5kLW9mLy0va2luZC1vZi00LjAuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1JSUU5ODljU2tvc2djM2hwR2tVR2I2NXkzVmM9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtYnVmZmVyIjogIl4xLjEuNSIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJoYXNoYSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9oYXNoYS8tL2hhc2hhLTIuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZU5mTC9CNXRaakEvNTVnM05sbUVVWHN2YnVFPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpcy1zdHJlYW0iOiAiXjEuMC4xIiwKKyAgICAgICAgInBpbmtpZS1wcm9taXNlIjogIl4yLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJob21lZGlyLXBvbHlmaWxsIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2hvbWVkaXItcG9seWZpbGwvLS9ob21lZGlyLXBvbHlmaWxsLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVEN1OGluV0ptUDdyOWUxb1dBOTIxR2RvdEx3PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInBhcnNlLXBhc3N3ZCI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiaG9va2VyIjogeworICAgICAgInZlcnNpb24iOiAiMC4yLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2hvb2tlci8tL2hvb2tlci0wLjIuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXVEVDNJOHhLSkNxbVdXTkZuZmJaaE1YVDJWaz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJob3N0ZWQtZ2l0LWluZm8iOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjcuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaG9zdGVkLWdpdC1pbmZvLy0vaG9zdGVkLWdpdC1pbmZvLTIuNy4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi03VC9CeEgxOXpiY0NUYThYa01sYks1bFRvMVd0Z2tGaTNHdmRXRXlOdWM0VmV4Ny85RHFibnBzZjRKTXlkY2ZqOUhDZzR6VVdGVEwzWmE2bGFwZzUvdz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaHRtbHBhcnNlcjIiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjguMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaHRtbHBhcnNlcjIvLS9odG1scGFyc2VyMi0zLjguMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLW1Xd29zWkZSYW92b1pRR24xNWRYNWNjTUVHZz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJkb21lbGVtZW50dHlwZSI6ICIxIiwKKyAgICAgICAgImRvbWhhbmRsZXIiOiAiMi4zIiwKKyAgICAgICAgImRvbXV0aWxzIjogIjEuNSIsCisgICAgICAgICJlbnRpdGllcyI6ICIxLjAiLAorICAgICAgICAicmVhZGFibGUtc3RyZWFtIjogIjEuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJodHRwLXNpZ25hdHVyZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9odHRwLXNpZ25hdHVyZS8tL2h0dHAtc2lnbmF0dXJlLTEuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbXV6WkpSRkhjdlBaVzJXbUNydVBmQmo3ck9FPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhc3NlcnQtcGx1cyI6ICJeMS4wLjAiLAorICAgICAgICAianNwcmltIjogIl4xLjIuMiIsCisgICAgICAgICJzc2hwayI6ICJeMS43LjAiCisgICAgICB9CisgICAgfSwKKyAgICAiaHR0cHMtcHJveHktYWdlbnQiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjIuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaHR0cHMtcHJveHktYWdlbnQvLS9odHRwcy1wcm94eS1hZ2VudC0yLjIuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItSFBDVFMxTFc1MWJjeU1ZYnhVSU9PNEhFT2xRMS8xcVJhRldjeXh2d2FxVVM5VFk4OGFvRXVIVVkzM2t1QWgxWWhWVmFEUWhMWnNuUGQrWE5BUldabFE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFnZW50LWJhc2UiOiAiXjQuMS4wIiwKKyAgICAgICAgImRlYnVnIjogIl4zLjEuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZGVidWciOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMy4yLjYiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWJ1Zy8tL2RlYnVnLTMuMi42LnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItbWVsK2pmN25ydEVsNVBuMVF4NDZ6QVJYS0RwQmJ2emV6c2U3cDdMcUlObWRvSWs4UFlQNVN5U2F4RW1ZdjZUWjBKeUVLQTFoc0NJZDZESWhnSVR0V1E9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgIm1zIjogIl4yLjEuMSIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJtcyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjEuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21zLy0vbXMtMi4xLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi10Z3ArZGw1Y0drMjh1dFlrdEJzckZxQTdIS2dyaGdQc2c2Wi9FZmhXSTRnbDFId3E4Qi9HbVkvMG9YWjZuRjhoRFZlc1MvRnBuWWFEL2tPV2hZUXZ5Zz09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiaWNvbnYtbGl0ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNC4yNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaWNvbnYtbGl0ZS8tL2ljb252LWxpdGUtMC40LjI0LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi12M01YblpBY3ZueXdrVFVFWm9tSUFjdGxlN1JYWGVlZE9SMzF3d2w3Vmx5b1hPNFFpOWFydlNlbk5RV25lMVRjUndoQ0wxSHdMSTIxYkVxZHBqOC9yQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAic2FmZXItYnVmZmVyIjogIj49IDIuMS4yIDwgMyIKKyAgICAgIH0KKyAgICB9LAorICAgICJpbmRlbnQtc3RyaW5nIjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2luZGVudC1zdHJpbmcvLS9pbmRlbnQtc3RyaW5nLTIuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtamkxSU5JZENFaHRLZ2hpM29UZnBwU0JKM0lBPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInJlcGVhdGluZyI6ICJeMi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiaW5mbGlnaHQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuNiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaW5mbGlnaHQvLS9pbmZsaWdodC0xLjAuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVNiMWpNZGZRTFF3SnZKRUtFSFc2Z1dXMWJmaz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJvbmNlIjogIl4xLjMuMCIsCisgICAgICAgICJ3cmFwcHkiOiAiMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJpbmhlcml0cyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pbmhlcml0cy8tL2luaGVyaXRzLTIuMC4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWXp3c2crUGFRcVVDOVNSbUFpU0E5Q0NDWWQ0PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImluaSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMy41IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pbmkvLS9pbmktMS4zLjUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVJaWTVodUlLQ01SV0RVcVpsRWk3MmYvbG1YS012dXN6Y01CZHVsaVEzbm5XYng5WC9aQlFPN0Rpak1FWVM5RWhIQmIycWFjUlVNdEM3c3ZMd2UwbGN3PT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpbnRlcnByZXQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaW50ZXJwcmV0Ly0vaW50ZXJwcmV0LTEuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZnRHeFFReHFEZzk0ejVYVHVFUU1ZL2VMaGhRPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlzLWFic29sdXRlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWFic29sdXRlLy0vaXMtYWJzb2x1dGUtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWRPV29xZmx2Y3lkQVJhMzYwR3Z2MThEWi9nUnVIS2kyTlUvd1U1WDFaRnpkWWZIMjlua2lOWnNGM21wNE9KM0g0eW85TXg4QS91QUdOenB6UE4zeUJBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpcy1yZWxhdGl2ZSI6ICJeMS4wLjAiLAorICAgICAgICAiaXMtd2luZG93cyI6ICJeMS4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiaXMtYWNjZXNzb3ItZGVzY3JpcHRvciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS42IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1hY2Nlc3Nvci1kZXNjcmlwdG9yLy0vaXMtYWNjZXNzb3ItZGVzY3JpcHRvci0wLjEuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXFlRXNzNjZOaDJjbjd1ODRRL2lnaVh0Y21OWT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJraW5kLW9mIjogIl4zLjAuMiIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAia2luZC1vZiI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIzLjIuMiIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2tpbmQtb2YvLS9raW5kLW9mLTMuMi4yLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLU1lb2hwelM2dWJ1dzh5Um0ySk91cFI1S1BHUT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1idWZmZXIiOiAiXjEuMS41IgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImlzLWFycmF5aXNoIjogeworICAgICAgInZlcnNpb24iOiAiMC4yLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWFycmF5aXNoLy0vaXMtYXJyYXlpc2gtMC4yLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1kOG1ZUUZKNnFPeXhxTHBwZTRCa1ducVNhcDA9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaXMtYnVmZmVyIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjYiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWJ1ZmZlci8tL2lzLWJ1ZmZlci0xLjEuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItTmNkQUx3cFhrVG01WnZ2Yms3b3dPVVN2VnZCS0RnS1A1L2V3ZlhFem5tUUZmczRaUm1hbk9lS0JUalJWamthM1FGb042WEorOUYzVVNxZkhxVGFVNXc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlzLWJ1aWx0aW4tbW9kdWxlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtYnVpbHRpbi1tb2R1bGUvLS9pcy1idWlsdGluLW1vZHVsZS0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVZBVnkwMDk2d3hHZmozYkRETHdiSGdONi83ND0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJidWlsdGluLW1vZHVsZXMiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImlzLWRhdGEtZGVzY3JpcHRvciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1kYXRhLWRlc2NyaXB0b3IvLS9pcy1kYXRhLWRlc2NyaXB0b3ItMC4xLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1DMTdtU0RpT0xJWUNndWVUOFlWdjdEOHdHMVk9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAia2luZC1vZiI6ICJeMy4wLjIiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImtpbmQtb2YiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMy4yLjIiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9raW5kLW9mLy0va2luZC1vZi0zLjIuMi50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1NZW9ocHpTNnVidXc4eVJtMkpPdXBSNUtQR1E9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtYnVmZmVyIjogIl4xLjEuNSIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJpcy1kZXNjcmlwdG9yIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjYiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWRlc2NyaXB0b3IvLS9pcy1kZXNjcmlwdG9yLTAuMS42LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1hdkRZcjBTQjNEd085enNNb3YwZ0tDRVNGWXFDbkU0aHEvNHozVGRVbHVrRXk1dDlDMFlScTdITHJzTjUyTkFjcVhLYWVwZUNEMG4rQjBhcm5WRzNIZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXMtYWNjZXNzb3ItZGVzY3JpcHRvciI6ICJeMC4xLjYiLAorICAgICAgICAiaXMtZGF0YS1kZXNjcmlwdG9yIjogIl4wLjEuNCIsCisgICAgICAgICJraW5kLW9mIjogIl41LjAuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAia2luZC1vZiI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICI1LjEuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2tpbmQtb2YvLS9raW5kLW9mLTUuMS4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItTkdFRXJuSDZGMnZVdVhEaCtPbGJjS1c3L3dPY2ZkUkhhWjdWV3RxQ3p0ZkhyaS8rK1lLbVA1MU9kV2VHUHVxQ09iYTZrazJPVGU1ZDAyVm1UQjgwUHc9PSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImlzLWV4dGVuZGFibGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZXh0ZW5kYWJsZS8tL2lzLWV4dGVuZGFibGUtMC4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1ZckVRNG9ta2NVR09Qc05xWVgxSExqQWQvSWs9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaXMtZXh0Z2xvYiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1leHRnbG9iLy0vaXMtZXh0Z2xvYi0yLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXFJd0NVMWVSOEM3VGZIYWh1ZXFYYzhneitNST0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpcy1maW5pdGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZmluaXRlLy0vaXMtZmluaXRlLTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtekdaM2FWWUN2bFVPOFI2TFNxWXdVMEsyMEtvPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIm51bWJlci1pcy1uYW4iOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImlzLWdsb2IiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZ2xvYi8tL2lzLWdsb2ItMy4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1lNld1SkNGNEJLeHdjSHVXa2lWblNHekQ2RW89IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXMtZXh0Z2xvYiI6ICJeMi4xLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiaXMtbnVtYmVyIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLW51bWJlci8tL2lzLW51bWJlci0zLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUpQMWlBYVI0TFBVRlljZ1FKMnI4ZlJMWEVaVT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJraW5kLW9mIjogIl4zLjAuMiIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAia2luZC1vZiI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIzLjIuMiIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2tpbmQtb2YvLS9raW5kLW9mLTMuMi4yLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLU1lb2hwelM2dWJ1dzh5Um0ySk91cFI1S1BHUT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1idWZmZXIiOiAiXjEuMS41IgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImlzLXBsYWluLW9iamVjdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1wbGFpbi1vYmplY3QvLS9pcy1wbGFpbi1vYmplY3QtMi4wLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWg1UHBnWGtXaXRjMzhCQk1ZYXdUWU1XSkhGWkpWbkJxdUZFNTd4RnBqQjhwSkZpRjZnWitiVStXeUkveXFYaUZSNW1kTHNnWU5hUGU4dWFvNlV2OU9nPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpc29iamVjdCI6ICJeMy4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiaXMtcmVsYXRpdmUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtcmVsYXRpdmUvLS9pcy1yZWxhdGl2ZS0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItS3cvUmVLMGlxd0tldTBNSVRMRnVqMGpiUEFtRWlPc0l3eUlYdnZiZmE2UWZtTjlwa0QxTSs4cGRrN1JsL2RUS2JIMzQvWEJGTWJnRDRpTUpoTFFiR0E9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzLXVuYy1wYXRoIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJpcy1zdHJlYW0iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtc3RyZWFtLy0vaXMtc3RyZWFtLTEuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRXRTajNVNW80TGVjNjQyOGhCYzY2QTJSeWtRPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJpcy10eXBlZGFycmF5IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLXR5cGVkYXJyYXkvLS9pcy10eXBlZGFycmF5LTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtNUhuSUNGamZEQnNSM2RwcFFQbGdFZnphU3BvPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJpcy11bmMtcGF0aCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy11bmMtcGF0aC8tL2lzLXVuYy1wYXRoLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1tckdwVmQwZnM3V1dMZlZzU3R2Z0Y2aUVKbmJqREZaaDkvZW1oUkRjR1dUZHVUZk5IZDlDSGVVd0gzZ1lJamRid280T242aHVua3p0d09hQXcweWxsUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAidW5jLXBhdGgtcmVnZXgiOiAiXjAuMS4yIgorICAgICAgfQorICAgIH0sCisgICAgImlzLXV0ZjgiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtdXRmOC8tL2lzLXV0ZjgtMC4yLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1TdzJoUkNFRTBiTTJOQTZBZVg2R1hQT2ZmWEk9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaXMtd2luZG93cyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy13aW5kb3dzLy0vaXMtd2luZG93cy0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZVhLMVVJbnEyYlBtanlYNmUzVkhJek1Mb2JjNEo5NGk0QVduK0hwcTNPVTVLa3JSQzk2T0FjUjNQUkovcEd1Nm04VFJuQkhQOWRrWFFWc1QvQ09WSUE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlzYXJyYXkiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXNhcnJheS8tL2lzYXJyYXktMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS11NU5kU0Znc3VoYU1Cb05KVjZWS1BnY1NUeEU9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaXNleGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXNleGUvLS9pc2V4ZS0yLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTZQdnpkTnhWYi9pVWVoRGNzRmN0WXo4cytoQT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpc29iamVjdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pc29iamVjdC8tL2lzb2JqZWN0LTMuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVGtNZWtyRWFsekZqYXFINXlOSE12UDJyZU44PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlzc3RyZWFtIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzc3RyZWFtLy0vaXNzdHJlYW0tMC4xLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1SK1kvZXZWYSttK1M0VkFPYVE2NHVGS2NDWm89IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAianMteWFtbCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuNS41IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qcy15YW1sLy0vanMteWFtbC0zLjUuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUEzZkRnQmZLdkhNaXNOSDd6U1dra1dRZkw3ND0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhcmdwYXJzZSI6ICJeMS4wLjIiLAorICAgICAgICAiZXNwcmltYSI6ICJeMi42LjAiCisgICAgICB9CisgICAgfSwKKyAgICAianMyeG1scGFyc2VyIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2pzMnhtbHBhcnNlci8tL2pzMnhtbHBhcnNlci0zLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVA3WU9xZ2ljVkVENU1aOVJkZ3pOQitKSmx6TT0iLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAieG1sY3JlYXRlIjogIl4xLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJqc2JuIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2pzYm4vLS9qc2JuLTAuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcGVaVXd1V2kzclh5QWRsczc3eW9EQTd5OVJNPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImpzZG9jIjogeworICAgICAgInZlcnNpb24iOiAiMy41LjUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2pzZG9jLy0vanNkb2MtMy41LjUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTZQeEI2NVRBVTRXTzBXenlyLzQvWWhsR292WGwwRVZZZnBLYnBTcm9TajBxQnhUNC94b2QvbDQwT3BrbTM4ZFJIUmRRZ2RlWTgzNk0wdVZuSlFHN2tnPT0iLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYmFieWxvbiI6ICI3LjAuMC1iZXRhLjE5IiwKKyAgICAgICAgImJsdWViaXJkIjogIn4zLjUuMCIsCisgICAgICAgICJjYXRoYXJzaXMiOiAifjAuOC45IiwKKyAgICAgICAgImVzY2FwZS1zdHJpbmctcmVnZXhwIjogIn4xLjAuNSIsCisgICAgICAgICJqczJ4bWxwYXJzZXIiOiAifjMuMC4wIiwKKyAgICAgICAgImtsYXciOiAifjIuMC4wIiwKKyAgICAgICAgIm1hcmtlZCI6ICJ+MC4zLjYiLAorICAgICAgICAibWtkaXJwIjogIn4wLjUuMSIsCisgICAgICAgICJyZXF1aXp6bGUiOiAifjAuMi4xIiwKKyAgICAgICAgInN0cmlwLWpzb24tY29tbWVudHMiOiAifjIuMC4xIiwKKyAgICAgICAgInRhZmZ5ZGIiOiAiMi42LjIiLAorICAgICAgICAidW5kZXJzY29yZSI6ICJ+MS44LjMiCisgICAgICB9CisgICAgfSwKKyAgICAianNoaW50IjogeworICAgICAgInZlcnNpb24iOiAiMi45LjYiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2pzaGludC8tL2pzaGludC0yLjkuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItS085U0lBS1RsSlFPTTRsRTY0R1FVdEdCUnBUT3V2YnJSclNadzNBaFV4TU5HMjY2blg5aEsyY0tBNFNCaFhPajBpckpHeU55R1NMVDYySEdPVkRFT0E9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNsaSI6ICJ+MS4wLjAiLAorICAgICAgICAiY29uc29sZS1icm93c2VyaWZ5IjogIjEuMS54IiwKKyAgICAgICAgImV4aXQiOiAiMC4xLngiLAorICAgICAgICAiaHRtbHBhcnNlcjIiOiAiMy44LngiLAorICAgICAgICAibG9kYXNoIjogIn40LjE3LjEwIiwKKyAgICAgICAgIm1pbmltYXRjaCI6ICJ+My4wLjIiLAorICAgICAgICAicGhhbnRvbSI6ICJ+NC4wLjEiLAorICAgICAgICAicGhhbnRvbWpzLXByZWJ1aWx0IjogIn4yLjEuNyIsCisgICAgICAgICJzaGVsbGpzIjogIjAuMy54IiwKKyAgICAgICAgInN0cmlwLWpzb24tY29tbWVudHMiOiAiMS4wLngiLAorICAgICAgICAidW5pY29kZS01LjIuMCI6ICJeMC43LjUiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgInN0cmlwLWpzb24tY29tbWVudHMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjQiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdHJpcC1qc29uLWNvbW1lbnRzLy0vc3RyaXAtanNvbi1jb21tZW50cy0xLjAuNC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1IaFg3eXNsOVB1bWI4dGM3VEdWckNDdTYrNUU9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAianNsaW50IjogeworICAgICAgInZlcnNpb24iOiAiMC4xMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qc2xpbnQvLS9qc2xpbnQtMC4xMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1Sb0NzeUlDY0tBKzZURnNieXM5RHBLVGZQVmFDNzFNbTVRU2p2cldBMGxEVk4rTEl2eDZhcGE0MkZGaXNNcW1DVHZKOER4a2NvUUdKMGo3bTNrVFZvdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXhpdCI6ICJ+MC4xLjIiLAorICAgICAgICAiZ2xvYiI6ICJ+Ny4xLjIiLAorICAgICAgICAibm9wdCI6ICJ+My4wLjEiLAorICAgICAgICAicmVhZGFibGUtc3RyZWFtIjogIn4yLjEuNSIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZ2xvYiI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICI3LjEuMyIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dsb2IvLS9nbG9iLTcuMS4zLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItdmNmdWlJeG9nTFY0RGxHQkhJVU93STBJYnJKOEhXUGM0TVU3SHp2aUdlTmhvL1VKRGZpNkI1cDNzSGVXSVEwS0dJVTBKcHhpNVpIeGVtUWZMa2tBd1E9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImZzLnJlYWxwYXRoIjogIl4xLjAuMCIsCisgICAgICAgICAgICAiaW5mbGlnaHQiOiAiXjEuMC40IiwKKyAgICAgICAgICAgICJpbmhlcml0cyI6ICIyIiwKKyAgICAgICAgICAgICJtaW5pbWF0Y2giOiAiXjMuMC40IiwKKyAgICAgICAgICAgICJvbmNlIjogIl4xLjMuMCIsCisgICAgICAgICAgICAicGF0aC1pcy1hYnNvbHV0ZSI6ICJeMS4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAibm9wdCI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIzLjAuNiIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL25vcHQvLS9ub3B0LTMuMC42LnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLXhrWmR2d2lyelUyeldURi9lYXhvcGtheWovaz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJhYmJyZXYiOiAiMSIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJwcm9jZXNzLW5leHRpY2stYXJncyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuNyIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Byb2Nlc3MtbmV4dGljay1hcmdzLy0vcHJvY2Vzcy1uZXh0aWNrLWFyZ3MtMS4wLjcudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRlE0Z3QxWlpDdFA1RUpQeVdrOHEyTC96QzZNPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfSwKKyAgICAgICAgInJlYWRhYmxlLXN0cmVhbSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjEuNSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVhZGFibGUtc3RyZWFtLy0vcmVhZGFibGUtc3RyZWFtLTIuMS41LnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLVp2cUxjZzRVT0xOa2FCOHEwYVk4WVlSSXlkQT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJidWZmZXItc2hpbXMiOiAiXjEuMC4wIiwKKyAgICAgICAgICAgICJjb3JlLXV0aWwtaXMiOiAifjEuMC4wIiwKKyAgICAgICAgICAgICJpbmhlcml0cyI6ICJ+Mi4wLjEiLAorICAgICAgICAgICAgImlzYXJyYXkiOiAifjEuMC4wIiwKKyAgICAgICAgICAgICJwcm9jZXNzLW5leHRpY2stYXJncyI6ICJ+MS4wLjYiLAorICAgICAgICAgICAgInN0cmluZ19kZWNvZGVyIjogIn4wLjEwLngiLAorICAgICAgICAgICAgInV0aWwtZGVwcmVjYXRlIjogIn4xLjAuMSIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJqc29uLXNjaGVtYSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMi4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qc29uLXNjaGVtYS8tL2pzb24tc2NoZW1hLTAuMi4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdElESWt1V2FMd1dWVE9jbnZUOHFUb2d2bmhNPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJqc29uLXNjaGVtYS10cmF2ZXJzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMy4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qc29uLXNjaGVtYS10cmF2ZXJzZS8tL2pzb24tc2NoZW1hLXRyYXZlcnNlLTAuMy4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTkpwdFJNVTZVZDZKdEFnRnhkWGxtMEY5TTBBPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJqc29uLXN0cmluZ2lmeS1zYWZlIjogeworICAgICAgInZlcnNpb24iOiAiNS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2pzb24tc3RyaW5naWZ5LXNhZmUvLS9qc29uLXN0cmluZ2lmeS1zYWZlLTUuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRXBhaTFZL1VYeG1nOXM0QjFsY0I0c2MxdHVzPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJqc29uZmlsZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2pzb25maWxlLy0vanNvbmZpbGUtMi40LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1OemFpdENpNGU3Mmd6SU8xUDZQV002TmNLdWc9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImdyYWNlZnVsLWZzIjogIl40LjEuNiIKKyAgICAgIH0KKyAgICB9LAorICAgICJqc3ByaW0iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjQuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvanNwcmltLy0vanNwcmltLTEuNC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTVQ1bXZCNWN3RzVEaThHM1Nad3VYRmFzdHFJPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhc3NlcnQtcGx1cyI6ICIxLjAuMCIsCisgICAgICAgICJleHRzcHJpbnRmIjogIjEuMy4wIiwKKyAgICAgICAgImpzb24tc2NoZW1hIjogIjAuMi4zIiwKKyAgICAgICAgInZlcnJvciI6ICIxLjEwLjAiCisgICAgICB9CisgICAgfSwKKyAgICAia2V3IjogeworICAgICAgInZlcnNpb24iOiAiMC43LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2tldy8tL2tldy0wLjcuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWVkazlMVE0yUFcvZEtYQ3pOZGtVR3RXUjE1cz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAia2luZC1vZiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjYuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9raW5kLW9mLy0va2luZC1vZi02LjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItczVrTE9jbkgwWHFETytGdnVhTFg4RERqWjE4Q0dGazdWeWdINDBRb0tQVVFoVzRlMnJ2TTByd1VxMHQ4SVFET3dZU2VMSzAxVTkwT2p6QlRtZTJRcUE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImtsYXciOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcva2xhdy8tL2tsYXctMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1XY0VvNE54YzVCQWdFVkVaVHV1Y3Y0V0dVUFk9IiwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImdyYWNlZnVsLWZzIjogIl40LjEuOSIKKyAgICAgIH0KKyAgICB9LAorICAgICJsYXp5LWNhY2hlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2xhenktY2FjaGUvLS9sYXp5LWNhY2hlLTEuMC40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtb2RlUHc2VUVkTXVBaEYwN08yNGRwSnBFYm80PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImxpZnRvZmYiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjUuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbGlmdG9mZi8tL2xpZnRvZmYtMi41LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1JQWtwRzdNYzZvWWJ2eENud1Zvb3l2ZGNNZXc9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXh0ZW5kIjogIl4zLjAuMCIsCisgICAgICAgICJmaW5kdXAtc3luYyI6ICJeMi4wLjAiLAorICAgICAgICAiZmluZWQiOiAiXjEuMC4xIiwKKyAgICAgICAgImZsYWdnZWQtcmVzcGF3biI6ICJeMS4wLjAiLAorICAgICAgICAiaXMtcGxhaW4tb2JqZWN0IjogIl4yLjAuNCIsCisgICAgICAgICJvYmplY3QubWFwIjogIl4xLjAuMCIsCisgICAgICAgICJyZWNob2lyIjogIl4wLjYuMiIsCisgICAgICAgICJyZXNvbHZlIjogIl4xLjEuNyIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZmluZHVwLXN5bmMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9maW5kdXAtc3luYy8tL2ZpbmR1cC1zeW5jLTIuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLWt5YXhTSXdpMGFZSWhsQ29hUUd5MmFrS0xMdz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJkZXRlY3QtZmlsZSI6ICJeMS4wLjAiLAorICAgICAgICAgICAgImlzLWdsb2IiOiAiXjMuMS4wIiwKKyAgICAgICAgICAgICJtaWNyb21hdGNoIjogIl4zLjAuNCIsCisgICAgICAgICAgICAicmVzb2x2ZS1kaXIiOiAiXjEuMC4xIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImxvYWQtanNvbi1maWxlIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbG9hZC1qc29uLWZpbGUvLS9sb2FkLWpzb24tZmlsZS0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWxXa0ZjSTFZdExxMHdpWWJCUFdmTWNtVGRNQT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJncmFjZWZ1bC1mcyI6ICJeNC4xLjIiLAorICAgICAgICAicGFyc2UtanNvbiI6ICJeMi4yLjAiLAorICAgICAgICAicGlmeSI6ICJeMi4wLjAiLAorICAgICAgICAicGlua2llLXByb21pc2UiOiAiXjIuMC4wIiwKKyAgICAgICAgInN0cmlwLWJvbSI6ICJeMi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAibG9kYXNoIjogeworICAgICAgInZlcnNpb24iOiAiNC4xNy4xMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbG9kYXNoLy0vbG9kYXNoLTQuMTcuMTEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWNRS2g4aWdvNVFVaFo3bGczOERZV0F4TXZqU0FLRzBBOHdHU1ZpbVAwN1NJVUVLMlVPK2FyU1JLYlJaV3RlbE10TjVWMEhrd2g1cnlPdG8vU3NoWUlnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJsb25nZXN0IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2xvbmdlc3QvLS9sb25nZXN0LTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTUtDeTJqajNOM0RvS1VvTkl1WmlYdGQ5QUpjPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImxvdWQtcmVqZWN0aW9uIjogeworICAgICAgInZlcnNpb24iOiAiMS42LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2xvdWQtcmVqZWN0aW9uLy0vbG91ZC1yZWplY3Rpb24tMS42LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1XMGI0QVVmdDdsZUljUENHMEVnaHo1bU9WUjg9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY3VycmVudGx5LXVuaGFuZGxlZCI6ICJeMC40LjEiLAorICAgICAgICAic2lnbmFsLWV4aXQiOiAiXjMuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgIm1ha2UtaXRlcmF0b3IiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWFrZS1pdGVyYXRvci8tL21ha2UtaXRlcmF0b3ItMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXB4aXVYaDBpVkVxN1ZNN0tNSWhzNWd4c2Z4Q3V4MlVScHRVUWFYbzRpWlpKeEJBelRQT0xFMkJ1bU81ZGJmVllxL2hCSkZCUi9hMW1GRG1PeDVBR213PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJraW5kLW9mIjogIl42LjAuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJtYXAtY2FjaGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWFwLWNhY2hlLy0vbWFwLWNhY2hlLTAuMi4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtd3lxOUM5WlNYWnNGRmtXN1R5YXNYY21LRGI4PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm1hcC1vYmoiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWFwLW9iai8tL21hcC1vYmotMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0yVFBPdVNCZGdyM1BTSWIyZEN2Y0swM3FGRzA9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAibWFwLXZpc2l0IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21hcC12aXNpdC8tL21hcC12aXNpdC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTdOeW84VEZFNW1EeHRiMUI4UzgwZWRtTis0OD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJvYmplY3QtdmlzaXQiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgIm1hcmtlZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMy4xOSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9tYXJrZWQvLS9tYXJrZWQtMC4zLjE5LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1lYTJlR1dPcU54UGNYdjhkeUVSZFNyLzZGbXp2V3d6ak14cGZHQi9zYk1jY1hvY3QreFkrWXVrUEQrUVRVWnd5dks3Qlp3Y3I0bTIxV0JPVzQxcEFrZz09IgorICAgIH0sCisgICAgIm1heG1pbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9tYXhtaW4vLS9tYXhtaW4tMS4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1jVFplaEttZDJQaXo5OVg5NHZBTkhuOXp2bUU9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY2hhbGsiOiAiXjEuMC4wIiwKKyAgICAgICAgImZpZ3VyZXMiOiAiXjEuMC4xIiwKKyAgICAgICAgImd6aXAtc2l6ZSI6ICJeMS4wLjAiLAorICAgICAgICAicHJldHR5LWJ5dGVzIjogIl4xLjAuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiYW5zaS1zdHlsZXMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4yLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hbnNpLXN0eWxlcy8tL2Fuc2ktc3R5bGVzLTIuMi4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLXRETGRNMWkyTk05MTRlUm1RMmdrQlRQQjNiND0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0sCisgICAgICAgICJjaGFsayI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjEuMyIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2hhbGsvLS9jaGFsay0xLjEuMy50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1xQkZjVmVTbkF2NU5GUXE5T0hLQ0tuNEovSmc9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiYW5zaS1zdHlsZXMiOiAiXjIuMi4xIiwKKyAgICAgICAgICAgICJlc2NhcGUtc3RyaW5nLXJlZ2V4cCI6ICJeMS4wLjIiLAorICAgICAgICAgICAgImhhcy1hbnNpIjogIl4yLjAuMCIsCisgICAgICAgICAgICAic3RyaXAtYW5zaSI6ICJeMy4wLjAiLAorICAgICAgICAgICAgInN1cHBvcnRzLWNvbG9yIjogIl4yLjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJzdXBwb3J0cy1jb2xvciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N1cHBvcnRzLWNvbG9yLy0vc3VwcG9ydHMtY29sb3ItMi4wLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVTEwRVhPYTJOaitrQVJjSVJpbVpYcDN6Sk1jPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgIm1lb3ciOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjcuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9tZW93Ly0vbWVvdy0zLjcuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWNzdG1pMEpTS0NrS3UvcUZhSkpZY3dpb0Fmcz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjYW1lbGNhc2Uta2V5cyI6ICJeMi4wLjAiLAorICAgICAgICAiZGVjYW1lbGl6ZSI6ICJeMS4xLjIiLAorICAgICAgICAibG91ZC1yZWplY3Rpb24iOiAiXjEuMC4wIiwKKyAgICAgICAgIm1hcC1vYmoiOiAiXjEuMC4xIiwKKyAgICAgICAgIm1pbmltaXN0IjogIl4xLjEuMyIsCisgICAgICAgICJub3JtYWxpemUtcGFja2FnZS1kYXRhIjogIl4yLjMuNCIsCisgICAgICAgICJvYmplY3QtYXNzaWduIjogIl40LjAuMSIsCisgICAgICAgICJyZWFkLXBrZy11cCI6ICJeMS4wLjEiLAorICAgICAgICAicmVkZW50IjogIl4xLjAuMCIsCisgICAgICAgICJ0cmltLW5ld2xpbmVzIjogIl4xLjAuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAibWluaW1pc3QiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4yLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL21pbmltaXN0Ly0vbWluaW1pc3QtMS4yLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbzFBSXNnOUJPRDdzSDdrVTlNMWQ5NW9tUW9RPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgIm1pY3JvbWF0Y2giOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjEuMTAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21pY3JvbWF0Y2gvLS9taWNyb21hdGNoLTMuMS4xMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItTVdpa2dsOW45TTN3K2Jwc1kzSGU4TCt3OWVGOTMzOHhSbDhJQU81dmlEaXp3U3p6aUZFeVV6bzJ4cnJsb0I2NEFEYlRmOHVBOHZScXF0dERUT21jY2c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFyci1kaWZmIjogIl40LjAuMCIsCisgICAgICAgICJhcnJheS11bmlxdWUiOiAiXjAuMy4yIiwKKyAgICAgICAgImJyYWNlcyI6ICJeMi4zLjEiLAorICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogIl4yLjAuMiIsCisgICAgICAgICJleHRlbmQtc2hhbGxvdyI6ICJeMy4wLjIiLAorICAgICAgICAiZXh0Z2xvYiI6ICJeMi4wLjQiLAorICAgICAgICAiZnJhZ21lbnQtY2FjaGUiOiAiXjAuMi4xIiwKKyAgICAgICAgImtpbmQtb2YiOiAiXjYuMC4yIiwKKyAgICAgICAgIm5hbm9tYXRjaCI6ICJeMS4yLjkiLAorICAgICAgICAib2JqZWN0LnBpY2siOiAiXjEuMy4wIiwKKyAgICAgICAgInJlZ2V4LW5vdCI6ICJeMS4wLjAiLAorICAgICAgICAic25hcGRyYWdvbiI6ICJeMC44LjEiLAorICAgICAgICAidG8tcmVnZXgiOiAiXjMuMC4yIgorICAgICAgfQorICAgIH0sCisgICAgIm1pbWUiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjMuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWltZS8tL21pbWUtMi4zLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU9FVWxsY1ZveWRCSEdOMXo4NHlmUURpbW41OHBaTk5OWGdabEhYU2JveE1sRnZnSTZNWFNXcFdLcEZScmE3SDFIeHBWaEhUa3JnaGZSVzQ5azZ5amVnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJtaW1lLWRiIjogeworICAgICAgInZlcnNpb24iOiAiMS4zNy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9taW1lLWRiLy0vbWltZS1kYi0xLjM3LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVIzQzRkYjZiZ1FobEloUFU0OGZVdGRWbUtuZmxxK2hSZGFkN0l5S2h0RmowNlZQTlZkazJSaGlZTDNValFJbHNvOEwrWXhBdEZrb2JUMFZLK1MveWJnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJtaW1lLXR5cGVzIjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjIxIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9taW1lLXR5cGVzLy0vbWltZS10eXBlcy0yLjEuMjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTNpTDZEYndweUx6alIzeEhTRk5GZWI5TnovTThXRGtYMzN0MUdGUW5GT2xsV2s4cE9yaC9MU3JCNU9YbG5sVzVQOUxINzNYNmxvVy9lb2djK0Y1bEpnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJtaW1lLWRiIjogIn4xLjM3LjAiCisgICAgICB9CisgICAgfSwKKyAgICAibWluaW1hdGNoIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21pbmltYXRjaC8tL21pbmltYXRjaC0zLjAuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTIteUpIVlFFaHlxUExVVGd0OUI4M1BYdTZXM3J4NE12dkh2U1V2VG9vZ3B3b0dET1VRK3lEclIwSFJvdCt5T0NkQ083dTRoWDNwV2Z0NmtXQkJjcWgwVUE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImJyYWNlLWV4cGFuc2lvbiI6ICJeMS4xLjciCisgICAgICB9CisgICAgfSwKKyAgICAibWluaW1pc3QiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjAuOCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9taW5pbWlzdC8tL21pbmltaXN0LTAuMC44LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtaFgvS3Y4TTVmU1lsdUNLQ1l1aHFwNkFSc0YwPSIKKyAgICB9LAorICAgICJtaXhpbi1kZWVwIjogeworICAgICAgInZlcnNpb24iOiAiMS4zLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21peGluLWRlZXAvLS9taXhpbi1kZWVwLTEuMy4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi04Wkl0TEhlRWdhcUV2ZDVsWUJYZm00RVpTRkNYMjlKYjlLK2xBSGhES3pSZUtCUUtqM1IrN05PRjZ0anFZaTl0NG9JOFZVZmFXSVRKUW04NnduWEdOUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZm9yLWluIjogIl4xLjAuMiIsCisgICAgICAgICJpcy1leHRlbmRhYmxlIjogIl4xLjAuMSIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiaXMtZXh0ZW5kYWJsZSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWV4dGVuZGFibGUvLS9pcy1leHRlbmRhYmxlLTEuMC4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItYXJuWE14VDFoaG9LbzlrMUxaZG1sTnlKZEREZnkydjBmWGpGbG1vazQraTh1bC82V2xiVmdlOWJoTTc0T3BOUFFQTUdVVG9EdHorS1hhMVBuZUp4T0E9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLXBsYWluLW9iamVjdCI6ICJeMi4wLjQiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAibWtkaXJwIjogeworICAgICAgInZlcnNpb24iOiAiMC41LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWtkaXJwLy0vbWtkaXJwLTAuNS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTUFWME9Pckd6MytNUjJmemhraldhWDExeVFNPSIsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJtaW5pbWlzdCI6ICIwLjAuOCIKKyAgICAgIH0KKyAgICB9LAorICAgICJtcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9tcy8tL21zLTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVmdpdXJmd0F2bXdwQWQ5Zm1HRjRqZURWbDhnPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm5hbm9tYXRjaCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMi4xMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbmFub21hdGNoLy0vbmFub21hdGNoLTEuMi4xMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZnBvZTJUMFJiSHdCVEJVT2Z0QWZCUGFERWkwNnVmYVVhaTBtRTZZbjFrYWNjM1NuVEVyZmIvaCtYOTRWWHpJNjRyS0ZIWUltWFN2ZHdHR0Ntd09xQ0E9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFyci1kaWZmIjogIl40LjAuMCIsCisgICAgICAgICJhcnJheS11bmlxdWUiOiAiXjAuMy4yIiwKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6ICJeMi4wLjIiLAorICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiAiXjMuMC4yIiwKKyAgICAgICAgImZyYWdtZW50LWNhY2hlIjogIl4wLjIuMSIsCisgICAgICAgICJpcy13aW5kb3dzIjogIl4xLjAuMiIsCisgICAgICAgICJraW5kLW9mIjogIl42LjAuMiIsCisgICAgICAgICJvYmplY3QucGljayI6ICJeMS4zLjAiLAorICAgICAgICAicmVnZXgtbm90IjogIl4xLjAuMCIsCisgICAgICAgICJzbmFwZHJhZ29uIjogIl4wLjguMSIsCisgICAgICAgICJ0by1yZWdleCI6ICJeMy4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAibmljZS10cnkiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuNSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbmljZS10cnkvLS9uaWNlLXRyeS0xLjAuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItMW5oNDVkZWViNW9sTlk3ZVg4MkJrUE83U1N4UjVTU1lKaVBUclRkRlVWWXdBbDhDS01BNU45UGpUWWtIaVJqaXNWY3hjUTFIWGRMaHgycXh4SnpMTlE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm5vcHQiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbm9wdC8tL25vcHQtNC4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0wTlJvV3YxVUZSazhqSFVGWUMwTkY4MWtSMDA9IiwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFiYnJldiI6ICIxIiwKKyAgICAgICAgIm9zZW52IjogIl4wLjEuNCIKKyAgICAgIH0KKyAgICB9LAorICAgICJub3JtYWxpemUtcGFja2FnZS1kYXRhIjogeworICAgICAgInZlcnNpb24iOiAiMi40LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL25vcm1hbGl6ZS1wYWNrYWdlLWRhdGEvLS9ub3JtYWxpemUtcGFja2FnZS1kYXRhLTIuNC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi05ampVRmJUUGZFeTNSL2FkLzJvTmJLdFc5SGdvdmw1TzFGdkZXS2tLYmxOWG9OL09vdTYrOStLS29oUEsxM1ljMy9UeXVueVdoSnA2Z3ZSTlIvUFBBdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaG9zdGVkLWdpdC1pbmZvIjogIl4yLjEuNCIsCisgICAgICAgICJpcy1idWlsdGluLW1vZHVsZSI6ICJeMS4wLjAiLAorICAgICAgICAic2VtdmVyIjogIjIgfHwgMyB8fCA0IHx8IDUiLAorICAgICAgICAidmFsaWRhdGUtbnBtLXBhY2thZ2UtbGljZW5zZSI6ICJeMy4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAibnVtYmVyLWlzLW5hbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9udW1iZXItaXMtbmFuLy0vbnVtYmVyLWlzLW5hbi0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUNYdGdLMU5DS2xJc0d2dUhrREdETnBRYUFSMD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJvYXV0aC1zaWduIjogeworICAgICAgInZlcnNpb24iOiAiMC45LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29hdXRoLXNpZ24vLS9vYXV0aC1zaWduLTAuOS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1mZXhoVUZGUFRHVjh5YkF0U0lHYlY2Z09rU3Y4VXRSYkRCbkF5TFF3NFFQS2tnTmxzSDJCeVBHdE1VcWRXa29zNllDUm1BcVZpd2dackpjL21SRHpaUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgIm9iamVjdC1hc3NpZ24iOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvb2JqZWN0LWFzc2lnbi8tL29iamVjdC1hc3NpZ24tNC4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1JUW10eDVaWWg4L0FYTHZVUXNySXY3czJDR009IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAib2JqZWN0LWNvcHkiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvb2JqZWN0LWNvcHkvLS9vYmplY3QtY29weS0wLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWZuMkZpM2diMThtUnBCdXBkZTA0RW5WT21Zdz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjb3B5LWRlc2NyaXB0b3IiOiAiXjAuMS4wIiwKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6ICJeMC4yLjUiLAorICAgICAgICAia2luZC1vZiI6ICJeMy4wLjMiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIwLjIuNSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlZmluZS1wcm9wZXJ0eS8tL2RlZmluZS1wcm9wZXJ0eS0wLjIuNS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS13MXNlK1Jqc1BKa1BtbHZGZStCS3JPeGNnUlk9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtZGVzY3JpcHRvciI6ICJeMC4xLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAia2luZC1vZiI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIzLjIuMiIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2tpbmQtb2YvLS9raW5kLW9mLTMuMi4yLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLU1lb2hwelM2dWJ1dzh5Um0ySk91cFI1S1BHUT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1idWZmZXIiOiAiXjEuMS41IgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgIm9iamVjdC12aXNpdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vYmplY3QtdmlzaXQvLS9vYmplY3QtdmlzaXQtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS05NXhFazY4TVUzZTFuK09kT1Y1QkJDM1FSYnM9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXNvYmplY3QiOiAiXjMuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgIm9iamVjdC5kZWZhdWx0cyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vYmplY3QuZGVmYXVsdHMvLS9vYmplY3QuZGVmYXVsdHMtMS4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1PbitHZ3pTMEI5NmdiYUZ0aU5YTktlUTEvczg9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXJyYXktZWFjaCI6ICJeMS4wLjEiLAorICAgICAgICAiYXJyYXktc2xpY2UiOiAiXjEuMC4wIiwKKyAgICAgICAgImZvci1vd24iOiAiXjEuMC4wIiwKKyAgICAgICAgImlzb2JqZWN0IjogIl4zLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJvYmplY3QubWFwIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29iamVjdC5tYXAvLS9vYmplY3QubWFwLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtejRQbG5jajh3SzFmUWxEaDk0czdnYjJBSFRjPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImZvci1vd24iOiAiXjEuMC4wIiwKKyAgICAgICAgIm1ha2UtaXRlcmF0b3IiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgIm9iamVjdC5waWNrIjogeworICAgICAgInZlcnNpb24iOiAiMS4zLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29iamVjdC5waWNrLy0vb2JqZWN0LnBpY2stMS4zLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1oNkVLeE1GcFM5TGh5L1Uxa2FaaFFmdGQxMGM9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXNvYmplY3QiOiAiXjMuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgIm9uY2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjQuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvb25jZS8tL29uY2UtMS40LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1XRHNhcDNXV0hVc1JPc0Y5bkZDNjc1M1hhOUU9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAid3JhcHB5IjogIjEiCisgICAgICB9CisgICAgfSwKKyAgICAib3MtaG9tZWRpciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vcy1ob21lZGlyLy0vb3MtaG9tZWRpci0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLS83eEppRE51RG9NOTRNRm94KzhWSVNHcWY3TT0iCisgICAgfSwKKyAgICAib3MtdG1wZGlyIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29zLXRtcGRpci8tL29zLXRtcGRpci0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXUrWjBCc2VhcUZ4Yy9zZG0vbGMwVlYzNkVuUT0iCisgICAgfSwKKyAgICAib3NlbnYiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuNSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvb3NlbnYvLS9vc2Vudi0wLjEuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItMENXY0NFQ2RNVmMyUnczVTV3OVpqcVg2Z2E2dWJrMXhEVkt4dEJRUEs3d2lzLzBGMnI5VDZrNHlkR1loZWNsN1lVQnhCVnhoTDVvaXNQc054QVBlMmc9PSIsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJvcy1ob21lZGlyIjogIl4xLjAuMCIsCisgICAgICAgICJvcy10bXBkaXIiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInAtZWFjaC1zZXJpZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcC1lYWNoLXNlcmllcy8tL3AtZWFjaC1zZXJpZXMtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1rdzg5RXQwZlVPZERSRmVpTE5id1NzYXRmM0U9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicC1yZWR1Y2UiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInAtcmVkdWNlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3AtcmVkdWNlLy0vcC1yZWR1Y2UtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1HTUt3M1pOcVJwQ2xLZmdqSDFpZy9iYWtmZm89IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGFrbyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMi45IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wYWtvLy0vcGFrby0wLjIuOS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTgvZFNMMDczZ2pTTnFCWWJyWjdQMVJ2NE9uVT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwYXJzZS1maWxlcGF0aCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wYXJzZS1maWxlcGF0aC8tL3BhcnNlLWZpbGVwYXRoLTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcGpJU2YxT3E4OUZZZHZXSEx6LzZ4MlBXeUpFPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzLWFic29sdXRlIjogIl4xLjAuMCIsCisgICAgICAgICJtYXAtY2FjaGUiOiAiXjAuMi4wIiwKKyAgICAgICAgInBhdGgtcm9vdCI6ICJeMC4xLjEiCisgICAgICB9CisgICAgfSwKKyAgICAicGFyc2UtanNvbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wYXJzZS1qc29uLy0vcGFyc2UtanNvbi0yLjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTlJRDBCRFR2Z0hRZmhHa0puNDNxR1BWYVRjaz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJlcnJvci1leCI6ICJeMS4yLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicGFyc2UtcGFzc3dkIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BhcnNlLXBhc3N3ZC8tL3BhcnNlLXBhc3N3ZC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWJWdVRTa1ZwazdJOU4vUUtPQzF2Rm1hbzVjWT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwYXNjYWxjYXNlIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Bhc2NhbGNhc2UvLS9wYXNjYWxjYXNlLTAuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtczJQbFhvQUd5bS9pRjRUUzJ5SzlGZGVSZnhRPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInBhdGgtZXhpc3RzIjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BhdGgtZXhpc3RzLy0vcGF0aC1leGlzdHMtMi4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1EK3RzWlBEOFVZMmFkVTNWNzdZc2NDSjJIMHM9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicGlua2llLXByb21pc2UiOiAiXjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInBhdGgtaXMtYWJzb2x1dGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGF0aC1pcy1hYnNvbHV0ZS8tL3BhdGgtaXMtYWJzb2x1dGUtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1GMHVTYUhOVk5QKzhlczVyOVRwYW5odGNYMTg9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGF0aC1rZXkiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGF0aC1rZXkvLS9wYXRoLWtleS0yLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVFSeXR0WFRGb1VEVHBMR1JEVURZRE1uMEMwQT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwYXRoLXJvb3QiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGF0aC1yb290Ly0vcGF0aC1yb290LTAuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbWtwb0ZNckJ3TTF6TmdxVjh5Q0R5T3BIUmJjPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInBhdGgtcm9vdC1yZWdleCI6ICJeMC4xLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicGF0aC1yb290LXJlZ2V4IjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BhdGgtcm9vdC1yZWdleC8tL3BhdGgtcm9vdC1yZWdleC0wLjEuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXY4emNqZld4TGNVc2kwUHNPTkdOY3NCTHFXMD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwYXRoLXR5cGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGF0aC10eXBlLy0vcGF0aC10eXBlLTEuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtV2NSUGZ1U1IybkJOcEJYYVdrQnd1aytQNUVFPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImdyYWNlZnVsLWZzIjogIl40LjEuMiIsCisgICAgICAgICJwaWZ5IjogIl4yLjAuMCIsCisgICAgICAgICJwaW5raWUtcHJvbWlzZSI6ICJeMi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicGVuZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wZW5kLy0vcGVuZC0xLjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWVsZnJWUXBuZy9rUlV6SDg5R1k5WEk0QWVsQT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwZXJmb3JtYW5jZS1ub3ciOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGVyZm9ybWFuY2Utbm93Ly0vcGVyZm9ybWFuY2Utbm93LTIuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWXduMDRPWDZrVDdCeHBNSHJqWkxTemQ4bm5zPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJwaGFudG9tIjogeworICAgICAgInZlcnNpb24iOiAiNC4wLjEyIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9waGFudG9tLy0vcGhhbnRvbS00LjAuMTIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVR6ODJYaHRQbXdDazFGRlBtZWN5N3lSR1pHMmJ0cHpZMktJOWZjb1BUN3pUOWRldDBDY015ZkJGUHAxUzhEcXpzblFubThaWUVmZHk1Mjhtd1Z0a3NBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicGhhbnRvbWpzLXByZWJ1aWx0IjogIl4yLjEuMTYiLAorICAgICAgICAic3BsaXQiOiAiXjEuMC4xIiwKKyAgICAgICAgIndpbnN0b24iOiAiXjIuNC4wIgorICAgICAgfQorICAgIH0sCisgICAgInBoYW50b21qcy1wcmVidWlsdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4xNiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGhhbnRvbWpzLXByZWJ1aWx0Ly0vcGhhbnRvbWpzLXByZWJ1aWx0LTIuMS4xNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTc5SVNwS09XYlRaSGFFNm91bmlGU2I0cTcrOD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXM2LXByb21pc2UiOiAiXjQuMC4zIiwKKyAgICAgICAgImV4dHJhY3QtemlwIjogIl4xLjYuNSIsCisgICAgICAgICJmcy1leHRyYSI6ICJeMS4wLjAiLAorICAgICAgICAiaGFzaGEiOiAiXjIuMi4wIiwKKyAgICAgICAgImtldyI6ICJeMC43LjAiLAorICAgICAgICAicHJvZ3Jlc3MiOiAiXjEuMS44IiwKKyAgICAgICAgInJlcXVlc3QiOiAiXjIuODEuMCIsCisgICAgICAgICJyZXF1ZXN0LXByb2dyZXNzIjogIl4yLjAuMSIsCisgICAgICAgICJ3aGljaCI6ICJeMS4yLjEwIgorICAgICAgfQorICAgIH0sCisgICAgInBpZnkiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjMuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGlmeS8tL3BpZnktMi4zLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS03UlFhYXNCRHFFbnFXSVNZNTl5b3NWTXc2UXc9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGlua2llIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BpbmtpZS8tL3BpbmtpZS0yLjAuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWNsVnJnTStnMUlxWFRvRG5ja2pvRHRUMytIQT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwaW5raWUtcHJvbWlzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9waW5raWUtcHJvbWlzZS8tL3BpbmtpZS1wcm9taXNlLTIuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSVRYVzM2ZWpXTUJwckpzWGgzWW9naWhGRC9vPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInBpbmtpZSI6ICJeMi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicG9zaXgtY2hhcmFjdGVyLWNsYXNzZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcG9zaXgtY2hhcmFjdGVyLWNsYXNzZXMvLS9wb3NpeC1jaGFyYWN0ZXItY2xhc3Nlcy0wLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUFlckEvanRhOXhvcWJBTCtxN2pCL3ZmZ0Rxcz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwcmV0dHktYnl0ZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcHJldHR5LWJ5dGVzLy0vcHJldHR5LWJ5dGVzLTEuMC40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtQ2lMb0lRWUpyVFZVTDR5TlhTRlpyL0IxSElRPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImdldC1zdGRpbiI6ICJeNC4wLjEiLAorICAgICAgICAibWVvdyI6ICJeMy4xLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicHJvY2Vzcy1uZXh0aWNrLWFyZ3MiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcHJvY2Vzcy1uZXh0aWNrLWFyZ3MvLS9wcm9jZXNzLW5leHRpY2stYXJncy0yLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItTXRFQzFUcU4wRVU1bmVwaGFKNHJBdFRoSHRDODZkTk45cUN1RWh0c2h2cFZCa0FXNVpPN0JBU045UkVuRjllb1hHY1J1YitwRnVLRXBPSEUrSGJFTXc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInByb2dyZXNzIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjgiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcHJvZ3Jlc3MvLS9wcm9ncmVzcy0xLjEuOC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTRtREhqMkZoemRtdzVXekQ0S2hkNFh4NlY3ND0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAicHJveHktZnJvbS1lbnYiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcHJveHktZnJvbS1lbnYvLS9wcm94eS1mcm9tLWVudi0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU04VURtUGNPcCt1VzBoOTdnWFl3cFZlUngrND0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwc2wiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMjkiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BzbC8tL3BzbC0xLjEuMjkudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUFlVW1RMG9MTjAyZmxWSFhXaDlzU0pGN21jZEZxMHBwaWQvSmtFcnVmYzNoR0lWL0FNYThGbzlWZ0RvL2NUMmpGZE9Xb0Z2SHA5MHFxQkg1NFcrZ2pRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAicHVueWNvZGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjQuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcHVueWNvZGUvLS9wdW55Y29kZS0xLjQuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXdOV21PeWNZZ0FyWTRlc1BwU2FjaE4xQmhGND0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAicHVwcGV0ZWVyIjogeworICAgICAgInZlcnNpb24iOiAiMS43LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3B1cHBldGVlci8tL3B1cHBldGVlci0xLjcuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZisxRHhLSFBxY2U2Q1hVQnoyZVZPMldjQVRlVmVRU09QRzlHWWFHT2JFWkRDaUNFVXdHK2dvZ2pNc3J2bjdoZTJ3SFRxTlZiNXA2UlVyd21yOFhGQkE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRlYnVnIjogIl4zLjEuMCIsCisgICAgICAgICJleHRyYWN0LXppcCI6ICJeMS42LjYiLAorICAgICAgICAiaHR0cHMtcHJveHktYWdlbnQiOiAiXjIuMi4xIiwKKyAgICAgICAgIm1pbWUiOiAiXjIuMC4zIiwKKyAgICAgICAgInByb2dyZXNzIjogIl4yLjAuMCIsCisgICAgICAgICJwcm94eS1mcm9tLWVudiI6ICJeMS4wLjAiLAorICAgICAgICAicmltcmFmIjogIl4yLjYuMSIsCisgICAgICAgICJ3cyI6ICJeNS4xLjEiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImRlYnVnIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjMuMi42IiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVidWcvLS9kZWJ1Zy0zLjIuNi50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW1lbCtqZjducnRFbDVQbjFReDQ2ekFSWEtEcEJidnplenNlN3A3THFJTm1kb0lrOFBZUDVTeVNheEVtWXY2VFowSnlFS0ExaHNDSWQ2REloZ0lUdFdRPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJtcyI6ICJeMi4xLjEiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAibXMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4xLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9tcy8tL21zLTIuMS4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItdGdwK2RsNWNHazI4dXRZa3RCc3JGcUE3SEtncmhnUHNnNlovRWZoV0k0Z2wxSHdxOEIvR21ZLzBvWFo2bkY4aERWZXNTL0ZwbllhRC9rT1doWVF2eWc9PSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfSwKKyAgICAgICAgInByb2dyZXNzIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcHJvZ3Jlc3MvLS9wcm9ncmVzcy0yLjAuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU9FK2E2dnpxYXpjK0s2THhKclg1VVB5S0Z2R25MNUNZbXEyakZHTklCV0hwYzRReUU0OS9ZT3VtY3JwUUZKcGZlam12UnRiSnpnTzF6UG1NQ3FsYkJnPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJxcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjYuNS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9xcy8tL3FzLTYuNS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1ONVpBWDQvTHhKbUYrN3dONzRwVUQ2cUFoOS93bnZkUWNqcTlUWmpldnZYelNVbzdiZm13OTFzYXFNanpHUzJ4cTkxL29kTjJkVy9XT2w3cVFITkRHQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgInJlYWQtcGtnIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JlYWQtcGtnLy0vcmVhZC1wa2ctMS4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS05ZitxWHMwcHl6SEFSMHZLZlhWcmE3S2VQeWc9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAibG9hZC1qc29uLWZpbGUiOiAiXjEuMC4wIiwKKyAgICAgICAgIm5vcm1hbGl6ZS1wYWNrYWdlLWRhdGEiOiAiXjIuMy4yIiwKKyAgICAgICAgInBhdGgtdHlwZSI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicmVhZC1wa2ctdXAiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVhZC1wa2ctdXAvLS9yZWFkLXBrZy11cC0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLW5XUEJNbmJBWlpHTlYvQUNwWDlBb2JaRCt3ST0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJmaW5kLXVwIjogIl4xLjAuMCIsCisgICAgICAgICJyZWFkLXBrZyI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicmVhZGFibGUtc3RyZWFtIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjE0IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL3JlYWRhYmxlLXN0cmVhbS8tL3JlYWRhYmxlLXN0cmVhbS0xLjEuMTQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1mUFRGVHZaSTQ0RXdoTVkyM1NCNTRXYkFnZGs9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY29yZS11dGlsLWlzIjogIn4xLjAuMCIsCisgICAgICAgICJpbmhlcml0cyI6ICJ+Mi4wLjEiLAorICAgICAgICAiaXNhcnJheSI6ICIwLjAuMSIsCisgICAgICAgICJzdHJpbmdfZGVjb2RlciI6ICJ+MC4xMC54IgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJpc2FycmF5IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjAuMC4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXNhcnJheS8tL2lzYXJyYXktMC4wLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtaWhpcy9LbW85QmQrQ2F2OFlEaVRtd1hSN3Q4PSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInJlY2hvaXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjYuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVjaG9pci8tL3JlY2hvaXItMC42LjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1oU0JMVk51b0xWZEM0b3lXZFc3ME92VU9NNFE9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicmVzb2x2ZSI6ICJeMS4xLjYiCisgICAgICB9CisgICAgfSwKKyAgICAicmVkZW50IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JlZGVudC8tL3JlZGVudC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXo1RnFzZjFmSHhiZnNnZ2kzVzdIOXpEQ3I5ND0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpbmRlbnQtc3RyaW5nIjogIl4yLjEuMCIsCisgICAgICAgICJzdHJpcC1pbmRlbnQiOiAiXjEuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgInJlZ2V4LW5vdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZWdleC1ub3QvLS9yZWdleC1ub3QtMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUo2U0RqVWdEeFFqNU51c25PdGRGeER3Ti8rSFd5a1I4R0VMd2N0SjdtZHFoY3l5MXhFYzRTUkZIVVh2eFRwNjYxWWFWS0FqZlJMWjljQ3FTNnRuMzJBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJleHRlbmQtc2hhbGxvdyI6ICJeMy4wLjIiLAorICAgICAgICAic2FmZS1yZWdleCI6ICJeMS4xLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicmVwZWF0LWVsZW1lbnQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVwZWF0LWVsZW1lbnQvLS9yZXBlYXQtZWxlbWVudC0xLjEuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItYWhHcTBablY1bTVYdFpMTWIrdlA3NmtjQU01bmtMcWswbHBxQXVvalNLR2dRdG40ZVJpNFpaR20yb2xvMnpLRkgrc01zV2FxT0NXMWRxQW5PcnU3Mmc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInJlcGVhdC1zdHJpbmciOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjYuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVwZWF0LXN0cmluZy8tL3JlcGVhdC1zdHJpbmctMS42LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1qY3JrY09ISWlyd3RZQS8vU25kaWh0cDE1amM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicmVwZWF0aW5nIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JlcGVhdGluZy8tL3JlcGVhdGluZy0yLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVVoVEZPcEp0TlZKd2RTZjdxMEZkdkFqUWJkbz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpcy1maW5pdGUiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInJlcXVlc3QiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjg4LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JlcXVlc3QvLS9yZXF1ZXN0LTIuODguMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItTkFxQlNyaWpHTFpkTTBXWk5zSW5MSnBrSm9rTDcyWFlqVXBuQjBpd3NSZ3hoN2RCNkNPckhuVEJOd04wRStsSERBSnp1N2tMQWtEZVkwOHoyL0EwaGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhd3Mtc2lnbjIiOiAifjAuNy4wIiwKKyAgICAgICAgImF3czQiOiAiXjEuOC4wIiwKKyAgICAgICAgImNhc2VsZXNzIjogIn4wLjEyLjAiLAorICAgICAgICAiY29tYmluZWQtc3RyZWFtIjogIn4xLjAuNiIsCisgICAgICAgICJleHRlbmQiOiAifjMuMC4yIiwKKyAgICAgICAgImZvcmV2ZXItYWdlbnQiOiAifjAuNi4xIiwKKyAgICAgICAgImZvcm0tZGF0YSI6ICJ+Mi4zLjIiLAorICAgICAgICAiaGFyLXZhbGlkYXRvciI6ICJ+NS4xLjAiLAorICAgICAgICAiaHR0cC1zaWduYXR1cmUiOiAifjEuMi4wIiwKKyAgICAgICAgImlzLXR5cGVkYXJyYXkiOiAifjEuMC4wIiwKKyAgICAgICAgImlzc3RyZWFtIjogIn4wLjEuMiIsCisgICAgICAgICJqc29uLXN0cmluZ2lmeS1zYWZlIjogIn41LjAuMSIsCisgICAgICAgICJtaW1lLXR5cGVzIjogIn4yLjEuMTkiLAorICAgICAgICAib2F1dGgtc2lnbiI6ICJ+MC45LjAiLAorICAgICAgICAicGVyZm9ybWFuY2Utbm93IjogIl4yLjEuMCIsCisgICAgICAgICJxcyI6ICJ+Ni41LjIiLAorICAgICAgICAic2FmZS1idWZmZXIiOiAiXjUuMS4yIiwKKyAgICAgICAgInRvdWdoLWNvb2tpZSI6ICJ+Mi40LjMiLAorICAgICAgICAidHVubmVsLWFnZW50IjogIl4wLjYuMCIsCisgICAgICAgICJ1dWlkIjogIl4zLjMuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJyZXF1ZXN0LXByb2dyZXNzIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JlcXVlc3QtcHJvZ3Jlc3MvLS9yZXF1ZXN0LXByb2dyZXNzLTIuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWFRhN1Y1WWNaenFsdDRqYnlCUWYzeU8wVGdnPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJ0aHJvdHRsZWl0IjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJyZXF1aXp6bGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVxdWl6emxlLy0vcmVxdWl6emxlLTAuMi4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtYVVQRFV3eE5tbjVHOGMzZFVjRlkvR2NNMjk0PSIsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJ1bmRlcnNjb3JlIjogIn4xLjYuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAidW5kZXJzY29yZSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjYuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3VuZGVyc2NvcmUvLS91bmRlcnNjb3JlLTEuNi4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLWl6aXhES3plOWpNM3VMSk9UL2h0UmE2bEthZz0iCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJyZXNvbHZlIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjciLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Jlc29sdmUvLS9yZXNvbHZlLTEuMS43LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSURFVTJDclN4ZTJlamdRUnM1TW9kZWlKNlhzPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInJlc29sdmUtZGlyIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Jlc29sdmUtZGlyLy0vcmVzb2x2ZS1kaXItMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1lYVFHUk1OaXZvTHlidi9uT2NtN1U0SUViME09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXhwYW5kLXRpbGRlIjogIl4yLjAuMCIsCisgICAgICAgICJnbG9iYWwtbW9kdWxlcyI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicmVzb2x2ZS11cmwiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVzb2x2ZS11cmwvLS9yZXNvbHZlLXVybC0wLjIuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUxHTi81M3lKT3YwcVpqL2lHcWtJQUdqaUJTbz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJyZXQiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMTUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JldC8tL3JldC0wLjEuMTUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVRUbFlwYStPTCt2TU1ORzI0eFNsUUdFSjNCL1J6RWZVbExjdDdiNUcveXRhdit3UHJwbENwVk1GdXd6WGJrZWNKcmI2SVlvMWlGYjBTOXYzNzc1NG1nPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJyaWdodC1hbGlnbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yaWdodC1hbGlnbi8tL3JpZ2h0LWFsaWduLTAuMS4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWVRPYmNpL21vMUZXaVNFTkpPRk1saFNHRSs4PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFsaWduLXRleHQiOiAiXjAuMS4xIgorICAgICAgfQorICAgIH0sCisgICAgInJpbXJhZiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNi4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yaW1yYWYvLS9yaW1yYWYtMi42LjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWxyZWV3TEsvQmxnaG14dGZIMzZZWVZnMWk4SUFjZTRUSTdvYW83NUkxZzI0NSs2QmN0cVRWUWlCUDNZVUo5QzZEUU9YSm1rWVI5WDlmQ0x0Q09KYzV3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJnbG9iIjogIl43LjAuNSIKKyAgICAgIH0KKyAgICB9LAorICAgICJzYWZlLWJ1ZmZlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjUuMS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zYWZlLWJ1ZmZlci8tL3NhZmUtYnVmZmVyLTUuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1HZDJVWkJKRGtYbFk3R2JKeGZzRTgvbnZLa1VFVTFHMzhjMXNpTjZRUDZhOVBUOU1tSEI4R25wc2NTbU1KU29GOExPSXJ0OHVkL3dQdG9qeXM0RzYrZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic2FmZS1yZWdleCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zYWZlLXJlZ2V4Ly0vc2FmZS1yZWdleC0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVFLTm1uenNIZlI2VVBVUmluaFY5MUlBanZ5ND0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJyZXQiOiAifjAuMS4xMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJzYWZlci1idWZmZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2FmZXItYnVmZmVyLy0vc2FmZXItYnVmZmVyLTIuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1ZWm8zSzgyU0Q3Uml5aTBFMUVRUG9qTHo3a3BlcG5TUUk5SXlQYkhIZzFYWFhldmI1ZEpJN3RweU4yQUR4R2NRYkhHN3ZjeVJIazBjYndxY1FyaVV0Zz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic2VtdmVyIjogeworICAgICAgInZlcnNpb24iOiAiNS42LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NlbXZlci8tL3NlbXZlci01LjYuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItUlM5UjZSMzVOWWdRbisrZmtEV2FPbXFHb2o0RWs5Z0dzK0RQeE5VWkt1d0UxODN4akpyb0t2eW8xSXpWRmVYdlVydm1BTHk2RldENXhyZEpUMjVnTWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInNldC12YWx1ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zZXQtdmFsdWUvLS9zZXQtdmFsdWUtMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWh3MHl4azlHVC9IcjV5SkVZbkhOS1lYa0lBOG1WSmdkOWRpdFlaQ2UxNlpjemNhRUxZWWNmdmFYZXNOQUNrMk84TzBuVGlQUWNRaEdVUWo4Skx6ZWVnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJleHRlbmQtc2hhbGxvdyI6ICJeMi4wLjEiLAorICAgICAgICAiaXMtZXh0ZW5kYWJsZSI6ICJeMC4xLjEiLAorICAgICAgICAiaXMtcGxhaW4tb2JqZWN0IjogIl4yLjAuMyIsCisgICAgICAgICJzcGxpdC1zdHJpbmciOiAiXjMuMC4xIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJleHRlbmQtc2hhbGxvdyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V4dGVuZC1zaGFsbG93Ly0vZXh0ZW5kLXNoYWxsb3ctMi4wLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVWE5OVlVclpxZllRNmh1dnU1aWRheHhXaVE4PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWV4dGVuZGFibGUiOiAiXjAuMS4wIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInNoZWJhbmctY29tbWFuZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zaGViYW5nLWNvbW1hbmQvLS9zaGViYW5nLWNvbW1hbmQtMS4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1SS3JHVzJsYkF6bUphTU9mTmovdVhlcjk4ZW89IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAic2hlYmFuZy1yZWdleCI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAic2hlYmFuZy1yZWdleCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zaGViYW5nLXJlZ2V4Ly0vc2hlYmFuZy1yZWdleC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTJrTDBsMERBdEMyeXlwY29WeHl4a01tTy9xTT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJzaGVsbGpzIjogeworICAgICAgInZlcnNpb24iOiAiMC4zLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NoZWxsanMvLS9zaGVsbGpzLTAuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTlpibU1IcDRGVVQxa2ZOOXBoZzJEekhiVjdFPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInNpZ25hbC1leGl0IjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NpZ25hbC1leGl0Ly0vc2lnbmFsLWV4aXQtMy4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS10ZjNBanhLSDZoRjRZbzVCWGlVVEszTmtiRzA9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic25hcGRyYWdvbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuOC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zbmFwZHJhZ29uLy0vc25hcGRyYWdvbi0wLjguMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItRnR5T25XTi93Q0hUVlhPTXd2U3YyNmQra281dldsSURENnpvVUo3TFc4dmgrWkJDOFFkbGp2ZVJQK2NyTnJ0Qndpb0VVV3kvNGRNdGJCakE0aW9ObGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImJhc2UiOiAiXjAuMTEuMSIsCisgICAgICAgICJkZWJ1ZyI6ICJeMi4yLjAiLAorICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogIl4wLjIuNSIsCisgICAgICAgICJleHRlbmQtc2hhbGxvdyI6ICJeMi4wLjEiLAorICAgICAgICAibWFwLWNhY2hlIjogIl4wLjIuMiIsCisgICAgICAgICJzb3VyY2UtbWFwIjogIl4wLjUuNiIsCisgICAgICAgICJzb3VyY2UtbWFwLXJlc29sdmUiOiAiXjAuNS4wIiwKKyAgICAgICAgInVzZSI6ICJeMy4xLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIwLjIuNSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlZmluZS1wcm9wZXJ0eS8tL2RlZmluZS1wcm9wZXJ0eS0wLjIuNS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS13MXNlK1Jqc1BKa1BtbHZGZStCS3JPeGNnUlk9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtZGVzY3JpcHRvciI6ICJeMC4xLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9leHRlbmQtc2hhbGxvdy8tL2V4dGVuZC1zaGFsbG93LTIuMC4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLVVhOTlZVXJacWZZUTZodXZ1NWlkYXh4V2lROD0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1leHRlbmRhYmxlIjogIl4wLjEuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJzbmFwZHJhZ29uLW5vZGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc25hcGRyYWdvbi1ub2RlLy0vc25hcGRyYWdvbi1ub2RlLTIuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1PMjdsNHhhTVl0L1JTUTVUUjN2cFdDQUI1S2IvY3pJY3FVRk9NL0M0ZlljTG5iWlVjMVBralRBTWpvZjJwQldhU1R3T1VkNnFVSGNGR1ZHajdhSXdudz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogIl4xLjAuMCIsCisgICAgICAgICJpc29iamVjdCI6ICJeMy4wLjAiLAorICAgICAgICAic25hcGRyYWdvbi11dGlsIjogIl4zLjAuMSIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVmaW5lLXByb3BlcnR5Ly0vZGVmaW5lLXByb3BlcnR5LTEuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLWRwNjZyejlLWTZyVHI1Nk5NRXlidm5tL3NPWT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1kZXNjcmlwdG9yIjogIl4xLjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJpcy1hY2Nlc3Nvci1kZXNjcmlwdG9yIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtYWNjZXNzb3ItZGVzY3JpcHRvci8tL2lzLWFjY2Vzc29yLWRlc2NyaXB0b3ItMS4wLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1tNWhuSFRrY1ZzUGZxeDNBS2x5dHRJUGI3SitYeWtIdkpQMkI5YlpEamxoTElvRXE0WG9LNjRWZzdib1psVldZSzZMVVk5NGRZUEVFN0xoMFprWktjUT09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAia2luZC1vZiI6ICJeNi4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAiaXMtZGF0YS1kZXNjcmlwdG9yIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZGF0YS1kZXNjcmlwdG9yLy0vaXMtZGF0YS1kZXNjcmlwdG9yLTEuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItamJSWHkxRm10QW9DalFrVm1JVll3dXVxREZVYmFPZURqbWVkMXRPR1Byc01odEpBNHJEOXRrZ0EwRjFxSjNnUkZSWGNIWVZrZGVhUDUwUTVyRS9qTFE9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImtpbmQtb2YiOiAiXjYuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImlzLWRlc2NyaXB0b3IiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1kZXNjcmlwdG9yLy0vaXMtZGVzY3JpcHRvci0xLjAuMi50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTJlaXM1V3FRR1Y3cGVvb0R5TG1ORVBVcnBzOStTWFg1YzlwTDN4RUIrNGU5SG5HdURhN21CN2tIeEh3NENicVM5azFUMmhPSDNtaUw4bjhXdGlZVnRnPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1hY2Nlc3Nvci1kZXNjcmlwdG9yIjogIl4xLjAuMCIsCisgICAgICAgICAgICAiaXMtZGF0YS1kZXNjcmlwdG9yIjogIl4xLjAuMCIsCisgICAgICAgICAgICAia2luZC1vZiI6ICJeNi4wLjIiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAic25hcGRyYWdvbi11dGlsIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NuYXBkcmFnb24tdXRpbC8tL3NuYXBkcmFnb24tdXRpbC0zLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItbWJLa01kUUtzalg0QkFMNGJSWVRqMjFlZE9mOGNON1hIZFlVSkVlK1puOTloVkVZY012S1BjdDFJcU5lNytBWlBpcm44QkNET1FCSFFaa25xbUtsWlE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImtpbmQtb2YiOiAiXjMuMi4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJraW5kLW9mIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjMuMi4yIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcva2luZC1vZi8tL2tpbmQtb2YtMy4yLjIudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTWVvaHB6UzZ1YnV3OHlSbTJKT3VwUjVLUEdRPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWJ1ZmZlciI6ICJeMS4xLjUiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAic291cmNlLW1hcCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNS43IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zb3VyY2UtbWFwLy0vc291cmNlLW1hcC0wLjUuNy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWlnT2RMUkFoMGkwZW9VeUEyT3BHaTZMdlA4dz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJzb3VyY2UtbWFwLXJlc29sdmUiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjUuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc291cmNlLW1hcC1yZXNvbHZlLy0vc291cmNlLW1hcC1yZXNvbHZlLTAuNS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1NanFzdk53eXoxczBrODFHb3ovOXZSQmU5U1pkQjA5QmR3Ky96WXlPKzNDdVBrNmZvdVRheHNjSGtndEU4akt2ZjAxa1ZmbDhyaUh6RVJRL2tlZmFTQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXRvYiI6ICJeMi4xLjEiLAorICAgICAgICAiZGVjb2RlLXVyaS1jb21wb25lbnQiOiAiXjAuMi4wIiwKKyAgICAgICAgInJlc29sdmUtdXJsIjogIl4wLjIuMSIsCisgICAgICAgICJzb3VyY2UtbWFwLXVybCI6ICJeMC40LjAiLAorICAgICAgICAidXJpeCI6ICJeMC4xLjAiCisgICAgICB9CisgICAgfSwKKyAgICAic291cmNlLW1hcC11cmwiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjQuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc291cmNlLW1hcC11cmwvLS9zb3VyY2UtbWFwLXVybC0wLjQuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVBwTmRmZDF6WXh1WFpabFcxVkVvNkh0UWhLTT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJzcGR4LWNvcnJlY3QiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3BkeC1jb3JyZWN0Ly0vc3BkeC1jb3JyZWN0LTMuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1xOWhlZHR6eVhIcjVTMEExdkVQb0svN2w4TnBma0ZZVHE2aUNZK1BubzJaYmRaUjZXZXhaRnRxZVZHa0d4VzNURUpNTjkxNFo1NUVuQUdNbWVubElRUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAic3BkeC1leHByZXNzaW9uLXBhcnNlIjogIl4zLjAuMCIsCisgICAgICAgICJzcGR4LWxpY2Vuc2UtaWRzIjogIl4zLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJzcGR4LWV4Y2VwdGlvbnMiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3BkeC1leGNlcHRpb25zLy0vc3BkeC1leGNlcHRpb25zLTIuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0yWFFBQ2ZFbEtpOVNsVmIxQ1lhZEtEWHZvYWpQZ0JWUG4vZ09RTHJUdkhkRWxhVmhyN1pFYnFKYVJuSkxWTmVhSTRjTUVBZ1ZDZUJNS0Y2TVdSRENSQT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic3BkeC1leHByZXNzaW9uLXBhcnNlIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NwZHgtZXhwcmVzc2lvbi1wYXJzZS8tL3NwZHgtZXhwcmVzc2lvbi1wYXJzZS0zLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItWWc2RDNYcFJENGtrT21UcGRnYlVpRUpGS2doSkgwM2ZpQzFPUGxsNWgvMHNPNm5laDJqcVJEVkhPUTRvL0xNZWEwdGdDa2JNZ2VhNWlwL2UrTWtXeWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInNwZHgtZXhjZXB0aW9ucyI6ICJeMi4xLjAiLAorICAgICAgICAic3BkeC1saWNlbnNlLWlkcyI6ICJeMy4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAic3BkeC1saWNlbnNlLWlkcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zcGR4LWxpY2Vuc2UtaWRzLy0vc3BkeC1saWNlbnNlLWlkcy0zLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItVGZPZlBjWUdCQjVzRHVQbjNkZUJ5eFBobWZlZ0FocERZS1NPWFpRTjgxT3lycmlmOFpDb2RPTHpLM0Flc0VMbkN4MDNraWtoeUR3aDBwZnZ2UXZGOHc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInNwbGl0IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NwbGl0Ly0vc3BsaXQtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW1UeU9vUGJyaXZ0WG53bkl4WlJGWVJyUE50RUZLbHBCMmZ2alNuQ1FVaUFBNnFBWnpxd25hNWVudks0dWs2T0llUDE3Q3NkRjNyU0JHWVZCc1UwVGtnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAidGhyb3VnaCI6ICIyIgorICAgICAgfQorICAgIH0sCisgICAgInNwbGl0LXN0cmluZyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zcGxpdC1zdHJpbmcvLS9zcGxpdC1zdHJpbmctMy4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU56TlZoSkRZcHdjZVZWaWk4L0h1NkRLZkQyRytOclFIbFMvVi9xZ3Y3NjNFWXVkVndFY01RTnhkMmxoKzBWclVCeVhOL29Ka2w1Z3JPaFlXdlFVWWl3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJleHRlbmQtc2hhbGxvdyI6ICJeMy4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAic3ByaW50Zi1qcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zcHJpbnRmLWpzLy0vc3ByaW50Zi1qcy0xLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU5yNTRNZ3IrV0FIMnpxUHVlTGJscXJsQTZndz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJzc2hwayI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMTUuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3NocGsvLS9zc2hway0xLjE1LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW1TZGdOVWFpZGsrZFJVNU1oWXROOXplYmR6RjJpRzBjTlBXeThIRytXOHkrZlQxSm5Ta2gwZnp6cGpPYTBMN1A4aTFSc2N6Mzh0MGg0Z1BjS3o0M3hBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXNuMSI6ICJ+MC4yLjMiLAorICAgICAgICAiYXNzZXJ0LXBsdXMiOiAiXjEuMC4wIiwKKyAgICAgICAgImJjcnlwdC1wYmtkZiI6ICJeMS4wLjAiLAorICAgICAgICAiZGFzaGRhc2giOiAiXjEuMTIuMCIsCisgICAgICAgICJlY2MtanNibiI6ICJ+MC4xLjEiLAorICAgICAgICAiZ2V0cGFzcyI6ICJeMC4xLjEiLAorICAgICAgICAianNibiI6ICJ+MC4xLjAiLAorICAgICAgICAic2FmZXItYnVmZmVyIjogIl4yLjAuMiIsCisgICAgICAgICJ0d2VldG5hY2wiOiAifjAuMTQuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJzdGFjay10cmFjZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMC4xMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3RhY2stdHJhY2UvLS9zdGFjay10cmFjZS0wLjAuMTAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1WSHh3czBmbzB5dE9FSTZob3FGWjVmM2VHY0E9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgInN0YXRpYy1leHRlbmQiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3RhdGljLWV4dGVuZC8tL3N0YXRpYy1leHRlbmQtMC4xLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1ZSUNjT2N2L1ZUTnlKdjFlQzFJUE5COGZ0Y1k9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogIl4wLjIuNSIsCisgICAgICAgICJvYmplY3QtY29weSI6ICJeMC4xLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIwLjIuNSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlZmluZS1wcm9wZXJ0eS8tL2RlZmluZS1wcm9wZXJ0eS0wLjIuNS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS13MXNlK1Jqc1BKa1BtbHZGZStCS3JPeGNnUlk9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtZGVzY3JpcHRvciI6ICJeMC4xLjAiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAic3RyaW5nX2RlY29kZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEwLjMxIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdHJpbmdfZGVjb2Rlci8tL3N0cmluZ19kZWNvZGVyLTAuMTAuMzEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1ZdUlEdkVGMmJHd295ZnlFTUIyckhGTVErcFE9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic3RyaXAtYW5zaSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL3N0cmlwLWFuc2kvLS9zdHJpcC1hbnNpLTMuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtYWpoZnVJVTlsUzFmOEYwT2lxK1VKNDNHUGM4PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFuc2ktcmVnZXgiOiAiXjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInN0cmlwLWJvbSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdHJpcC1ib20vLS9zdHJpcC1ib20tMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1ZaG1vVmhaU0JKSHpWNGk5dnhSSHFaeCthdzQ9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXMtdXRmOCI6ICJeMC4yLjAiCisgICAgICB9CisgICAgfSwKKyAgICAic3RyaXAtaW5kZW50IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N0cmlwLWluZGVudC8tL3N0cmlwLWluZGVudC0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLURIbGlwcTN2cDd2VXJEWmtZS1k0VlNyaG9LST0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJnZXQtc3RkaW4iOiAiXjQuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgInN0cmlwLWpzb24tY29tbWVudHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3RyaXAtanNvbi1jb21tZW50cy8tL3N0cmlwLWpzb24tY29tbWVudHMtMi4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1QRk1aUXVrSXdtbDhEc05FaFl3b2JIeWdwZ289IgorICAgIH0sCisgICAgInN1cHBvcnRzLWNvbG9yIjogeworICAgICAgInZlcnNpb24iOiAiNS41LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N1cHBvcnRzLWNvbG9yLy0vc3VwcG9ydHMtY29sb3ItNS41LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVFqVmp3ZFhJdDQwOE1JaUFxQ1g0b1VLc2dVMkVxQUd6czJQcGttNGFRWWJqbStaRVdFY1c0U2ZGTlRyNHVNTlptYTBleTRmNWxnTHJrQjBhWDBRTW93PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJoYXMtZmxhZyI6ICJeMy4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAic3luYy1leGVjIjogeworICAgICAgInZlcnNpb24iOiAiMC42LjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N5bmMtZXhlYy8tL3N5bmMtZXhlYy0wLjYuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWNYMGl6RlB3emgzdlZaUTJMenFKb3V1NUVRVT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ0YWZmeWRiIjogeworICAgICAgInZlcnNpb24iOiAiMi42LjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3RhZmZ5ZGIvLS90YWZmeWRiLTIuNi4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZkx5MlMxb1VHMm91L0N4ZExHZTA0VkN5b21nPSIKKyAgICB9LAorICAgICJ0aHJvdHRsZWl0IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Rocm90dGxlaXQvLS90aHJvdHRsZWl0LTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbm5oWU50cjBaME1VV2xtRXRpYU5nb1Vvckd3PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJ0aHJvdWdoIjogeworICAgICAgInZlcnNpb24iOiAiMi4zLjgiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdGhyb3VnaC8tL3Rocm91Z2gtMi4zLjgudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1EZFRKLzZxOE5YbGdzYmNrRVYxK0RvYWk0ZlU9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgInRvLW9iamVjdC1wYXRoIjogeworICAgICAgInZlcnNpb24iOiAiMC4zLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3RvLW9iamVjdC1wYXRoLy0vdG8tb2JqZWN0LXBhdGgtMC4zLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1LWFdJdDdEbjRLd0k0RTVuTDRYQjlKbWVGNjg9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAia2luZC1vZiI6ICJeMy4wLjIiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImtpbmQtb2YiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMy4yLjIiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9raW5kLW9mLy0va2luZC1vZi0zLjIuMi50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1NZW9ocHpTNnVidXc4eVJtMkpPdXBSNUtQR1E9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtYnVmZmVyIjogIl4xLjEuNSIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJ0by1yZWdleCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90by1yZWdleC8tL3RvLXJlZ2V4LTMuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1GV3RsZU5BdFovS2kycXRxZWoyQ1hUT2F5T0g5YkhEUUYrUTQ4VnBXeURYamJZeEE0WXo4aURCMzF6WE9CVWxPSEhLaWREYnFHVnJUVXZRTVBtQkdCdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogIl4yLjAuMiIsCisgICAgICAgICJleHRlbmQtc2hhbGxvdyI6ICJeMy4wLjIiLAorICAgICAgICAicmVnZXgtbm90IjogIl4xLjAuMiIsCisgICAgICAgICJzYWZlLXJlZ2V4IjogIl4xLjEuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJ0by1yZWdleC1yYW5nZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90by1yZWdleC1yYW5nZS8tL3RvLXJlZ2V4LXJhbmdlLTIuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZklEQmU1Myt2bG1lSnpaK0RVM1ZXUUZCMnpnPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzLW51bWJlciI6ICJeMy4wLjAiLAorICAgICAgICAicmVwZWF0LXN0cmluZyI6ICJeMS42LjEiCisgICAgICB9CisgICAgfSwKKyAgICAidG91Z2gtY29va2llIjogeworICAgICAgInZlcnNpb24iOiAiMi40LjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3RvdWdoLWNvb2tpZS8tL3RvdWdoLWNvb2tpZS0yLjQuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItUTVzcmsvNHZETTU0V0pzSmlvM1hObjZLMnNDRytDUThHNVd6NmJaaFJab0FlLytUeGpXQi9HbEZBbllFYmtZVmxPTjlGTWsvZkUzaDJSTHBQWG80bFE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJwc2wiOiAiXjEuMS4yNCIsCisgICAgICAgICJwdW55Y29kZSI6ICJeMS40LjEiCisgICAgICB9CisgICAgfSwKKyAgICAidHJpbS1uZXdsaW5lcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90cmltLW5ld2xpbmVzLy0vdHJpbS1uZXdsaW5lcy0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVdJZVdhN1dDcEZBNlFldFNUMzAxQVJnVnBoTT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ0dW5uZWwtYWdlbnQiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjYuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdHVubmVsLWFnZW50Ly0vdHVubmVsLWFnZW50LTAuNi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSjZYZW9HczJzRW9LbVdaM1N5a0lhUEQ4UVAwPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJzYWZlLWJ1ZmZlciI6ICJeNS4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAidHdlZXRuYWNsIjogeworICAgICAgInZlcnNpb24iOiAiMC4xNC41IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90d2VldG5hY2wvLS90d2VldG5hY2wtMC4xNC41LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtV3VhQmQvR1MxRVZpYWRFSXI2ay8rSFEvVDJRPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInR5cGVkYXJyYXkiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjAuNiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdHlwZWRhcnJheS8tL3R5cGVkYXJyYXktMC4wLjYudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1obnJIVGpoa0dIc2RQVWZabHFlT3hjaURCM2M9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAidWdsaWZ5LWpzIjogeworICAgICAgInZlcnNpb24iOiAiMi42LjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdWdsaWZ5LWpzLy0vdWdsaWZ5LWpzLTIuNi40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWmVvdnN3V2NrNVJwTHhYKzJId3JOc0ZybXQ4PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFzeW5jIjogIn4wLjIuNiIsCisgICAgICAgICJzb3VyY2UtbWFwIjogIn4wLjUuMSIsCisgICAgICAgICJ1Z2xpZnktdG8tYnJvd3NlcmlmeSI6ICJ+MS4wLjAiLAorICAgICAgICAieWFyZ3MiOiAifjMuMTAuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiYXN5bmMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMC4yLjEwIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hc3luYy8tL2FzeW5jLTAuMi4xMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS10cnZnc0dkTG5YR1hDTW80M293amZMVW13OUU9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAidWdsaWZ5LXRvLWJyb3dzZXJpZnkiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdWdsaWZ5LXRvLWJyb3dzZXJpZnkvLS91Z2xpZnktdG8tYnJvd3NlcmlmeS0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWJna2sxcjJtdGEvalNlT2FiV01vVUtENGdyYz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ1bmMtcGF0aC1yZWdleCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91bmMtcGF0aC1yZWdleC8tL3VuYy1wYXRoLXJlZ2V4LTAuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtNXozVDE3RFh4ZTJHKzZ4ckN1Zll4cWFkVVBvPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInVuZGVyc2NvcmUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjguMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdW5kZXJzY29yZS8tL3VuZGVyc2NvcmUtMS44LjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1UeisxT3hCdVlKZjgrY3RCQ2ZLbDZiMzZVQ0k9IgorICAgIH0sCisgICAgInVuZGVyc2NvcmUtY29udHJpYiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91bmRlcnNjb3JlLWNvbnRyaWIvLS91bmRlcnNjb3JlLWNvbnRyaWItMC4zLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1abHRtd2tlRCtQb3JHTW40eTdEaXg5U01Kc2M9IiwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInVuZGVyc2NvcmUiOiAiMS42LjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgInVuZGVyc2NvcmUiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS42LjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91bmRlcnNjb3JlLy0vdW5kZXJzY29yZS0xLjYuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1peml4REt6ZTlqTTN1TEpPVC9odFJhNmxLYWc9IgorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAidW5kZXJzY29yZS5zdHJpbmciOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjMuNSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdW5kZXJzY29yZS5zdHJpbmcvLS91bmRlcnNjb3JlLnN0cmluZy0zLjMuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZytkcG1nbitYQm5lTG1YWG8rc0dsVzV4UUV0NEVya1MzbWdlTjJHRmJyZW1ZZU1CU0pLcjlXZjJLSnBsUVZhaVBZL2Y3Rk42YXRvc1dZTm05b3ZyWWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInNwcmludGYtanMiOiAiXjEuMC4zIiwKKyAgICAgICAgInV0aWwtZGVwcmVjYXRlIjogIl4xLjAuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJ1bmljb2RlLTUuMi4wIjogeworICAgICAgInZlcnNpb24iOiAiMC43LjUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3VuaWNvZGUtNS4yLjAvLS91bmljb2RlLTUuMi4wLTAuNy41LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1LVkdMVzFCcmkzMHgwMHl2NEhOTThrQnhvcUZYcjBTYm81NTczNW52cmxzeDRQWUJab2wzVXRvV2dPNDkyZlN3bXNldHpQRVp6eTczcmJVOE9HWEpjQT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAidW5pb24tdmFsdWUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdW5pb24tdmFsdWUvLS91bmlvbi12YWx1ZS0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVhISERUTFc2MWR6cjQrb00wSUlIdWxxaHJxUT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhcnItdW5pb24iOiAiXjMuMS4wIiwKKyAgICAgICAgImdldC12YWx1ZSI6ICJeMi4wLjYiLAorICAgICAgICAiaXMtZXh0ZW5kYWJsZSI6ICJeMC4xLjEiLAorICAgICAgICAic2V0LXZhbHVlIjogIl4wLjQuMyIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9leHRlbmQtc2hhbGxvdy8tL2V4dGVuZC1zaGFsbG93LTIuMC4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLVVhOTlZVXJacWZZUTZodXZ1NWlkYXh4V2lROD0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1leHRlbmRhYmxlIjogIl4wLjEuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJzZXQtdmFsdWUiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMC40LjMiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zZXQtdmFsdWUvLS9zZXQtdmFsdWUtMC40LjMudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZmJDUG5UMGkzSDk0NVRyenc3OUdadXpmelBFPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImV4dGVuZC1zaGFsbG93IjogIl4yLjAuMSIsCisgICAgICAgICAgICAiaXMtZXh0ZW5kYWJsZSI6ICJeMC4xLjEiLAorICAgICAgICAgICAgImlzLXBsYWluLW9iamVjdCI6ICJeMi4wLjEiLAorICAgICAgICAgICAgInRvLW9iamVjdC1wYXRoIjogIl4wLjMuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJ1bnNldC12YWx1ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91bnNldC12YWx1ZS8tL3Vuc2V0LXZhbHVlLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZzNhSFAzMGpOUmVmK3g1dnc2anREZnlLdFZrPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImhhcy12YWx1ZSI6ICJeMC4zLjEiLAorICAgICAgICAiaXNvYmplY3QiOiAiXjMuMC4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJoYXMtdmFsdWUiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMC4zLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9oYXMtdmFsdWUvLS9oYXMtdmFsdWUtMC4zLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZXg5WXV0cGl5b0ord0tJSGdDVmxTRVdaWGg4PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImdldC12YWx1ZSI6ICJeMi4wLjMiLAorICAgICAgICAgICAgImhhcy12YWx1ZXMiOiAiXjAuMS40IiwKKyAgICAgICAgICAgICJpc29iamVjdCI6ICJeMi4wLjAiCisgICAgICAgICAgfSwKKyAgICAgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAgICAgImlzb2JqZWN0IjogeworICAgICAgICAgICAgICAidmVyc2lvbiI6ICIyLjEuMCIsCisgICAgICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pc29iamVjdC8tL2lzb2JqZWN0LTIuMS4wLnRneiIsCisgICAgICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS04R1ZXRUphajhkb3U5R0p5K0JYSVFOaCtESWs9IiwKKyAgICAgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICAgICAiaXNhcnJheSI6ICIxLjAuMCIKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImhhcy12YWx1ZXMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMC4xLjQiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9oYXMtdmFsdWVzLy0vaGFzLXZhbHVlcy0wLjEuNC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1iV0hlbGRrZC9LbTVvQ0NKclRoTC80OWl0M0U9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAidXJpLXBhdGgiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdXJpLXBhdGgvLS91cmktcGF0aC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWwwZndHRFdKTThNZDRQelAyQzBUam1jbUxqST0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ1cml4IjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3VyaXgvLS91cml4LTAuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtMnBOL2VtTGlIK3dmMFkxSnMxd3BOUVo2YkhJPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInVzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91c2UvLS91c2UtMy4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWN3RVNWWGxPM3VybDlZV2xGVy9UQTljc2hDRWh0dTdJS0ovcDVzb0ovZ0dwajd2YnZGckFZL2VJaW9RNkR3MjNLalpoWWdpSW84SE9zMW5RMnZyL29RPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ1dGlsLWRlcHJlY2F0ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91dGlsLWRlcHJlY2F0ZS8tL3V0aWwtZGVwcmVjYXRlLTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtUlExTnlmcHczbk1uWXZ2UzFLS0pnVUdhRE04PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInV1aWQiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjMuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdXVpZC8tL3V1aWQtMy4zLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXlYSm1lTmF3M0RubktBT0tKRTUxc0wvWmFZZldKUmwxcEs5ZHIxOVlGQ3UwT2JTMjMxQUIxL0xicVRLUkFRNWt3OEE5MHJBNmZyNHJpT1VwVFp2UVpBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAidjhmbGFncyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy92OGZsYWdzLy0vdjhmbGFncy0zLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItNnNnU0tvRncxVXBVUGQzY0ZkRjdRR25ySDZ0RGVCZ1cxRjN2OWd5OGdMWTBtbGJpQlhxOHNveThhUXBZNnhlZUNqSDVLK0p2QzYyQWNwN2d0bDd3V0E9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImhvbWVkaXItcG9seWZpbGwiOiAiXjEuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgInZhbGlkYXRlLW5wbS1wYWNrYWdlLWxpY2Vuc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdmFsaWRhdGUtbnBtLXBhY2thZ2UtbGljZW5zZS8tL3ZhbGlkYXRlLW5wbS1wYWNrYWdlLWxpY2Vuc2UtMy4wLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLURwS20yVWkveE43L0hRS0N0cFp4b1JXQmhaOVowa3F0eWdHOFhDZ05ROFpsRG54dVFtV2hqNTY2ajhmTjRDdTMvSm1iaHNEbzdmY0FKcTRzOWgyN0V3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJzcGR4LWNvcnJlY3QiOiAiXjMuMC4wIiwKKyAgICAgICAgInNwZHgtZXhwcmVzc2lvbi1wYXJzZSI6ICJeMy4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAidmVycm9yIjogeworICAgICAgInZlcnNpb24iOiAiMS4xMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy92ZXJyb3IvLS92ZXJyb3ItMS4xMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtT2hCY29YQlRyMVhXNG5EQitDaUdndUdOcEFBPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhc3NlcnQtcGx1cyI6ICJeMS4wLjAiLAorICAgICAgICAiY29yZS11dGlsLWlzIjogIjEuMC4yIiwKKyAgICAgICAgImV4dHNwcmludGYiOiAiXjEuMi4wIgorICAgICAgfQorICAgIH0sCisgICAgIndoaWNoIjogeworICAgICAgInZlcnNpb24iOiAiMS4zLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3doaWNoLy0vd2hpY2gtMS4zLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUh4SmRZV3ExTVRJUWJKM253MGNxc3NIb1ROVTI2N0tsckR1R1oxV1lseERTdFV0S1VoT2FKbWgxMTIvVFptSHh4VWZ1SnFQWFNPbTd0RHlhczBPU0lRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpc2V4ZSI6ICJeMi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAid2luZG93LXNpemUiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvd2luZG93LXNpemUvLS93aW5kb3ctc2l6ZS0wLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVZEak5McWs3SUM3Nk9obitpSWV1NThsUG5KMD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ3aW5zdG9uIjogeworICAgICAgInZlcnNpb24iOiAiMi40LjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3dpbnN0b24vLS93aW5zdG9uLTIuNC40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1OQm8yUGVwbjRoSzRWMDFVZmNXY0RsbWlWVHM3VlRCMWg3YmduQjByZ1AxNDZiWWhNeFgweXBDejNsQk9mTnhDTzRadWVrN3llVCt5L3pNMU9mTXc0UT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFzeW5jIjogIn4xLjAuMCIsCisgICAgICAgICJjb2xvcnMiOiAiMS4wLngiLAorICAgICAgICAiY3ljbGUiOiAiMS4wLngiLAorICAgICAgICAiZXllcyI6ICIwLjEueCIsCisgICAgICAgICJpc3N0cmVhbSI6ICIwLjEueCIsCisgICAgICAgICJzdGFjay10cmFjZSI6ICIwLjAueCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiYXN5bmMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2FzeW5jLy0vYXN5bmMtMS4wLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtK1B3RXlqb1RlRXJlbmhaQnI1aFhqUHZXUjZrPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgICAgICB9LAorICAgICAgICAiY29sb3JzIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4zIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29sb3JzLy0vY29sb3JzLTEuMC4zLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLUJEUDBUWUNXZ1AzcllPMG1EeHNNSmk2Q3BBcz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgIndvcmR3cmFwIjogeworICAgICAgInZlcnNpb24iOiAiMC4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3dvcmR3cmFwLy0vd29yZHdyYXAtMC4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS10NVpwdTBMc3RBbjRQVmc4clZMS0YrcWhaRDg9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAid3JhcHB5IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3dyYXBweS8tL3dyYXBweS0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXRTUTlqejdCcWpYeE5rWUZ2QTBRTnVNS3RwOD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ3cyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjUuMi4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy93cy8tL3dzLTUuMi4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1qYUhGRDZQRnY2VWdvSVZkYTZxWmxscHRRc01sREVKa1RRY3lienpYRFlNMVhPOVk4ZW02OTFGR01QbU00NldHeUxVNHo5S01nUU4rcXJ1eC9uaGxIQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXN5bmMtbGltaXRlciI6ICJ+MS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAieG1sY3JlYXRlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3htbGNyZWF0ZS8tL3htbGNyZWF0ZS0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLSttdjNZcVlLUVQrejNZOUxBOFd5YVNPTk1JOD0iCisgICAgfSwKKyAgICAieWFyZ3MiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjEwLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcveWFyZ3MvLS95YXJncy0zLjEwLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS05KzU3MkZmZGZCMHRPTURuVHZ2V2dkRkRIOUU9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY2FtZWxjYXNlIjogIl4xLjAuMiIsCisgICAgICAgICJjbGl1aSI6ICJeMi4xLjAiLAorICAgICAgICAiZGVjYW1lbGl6ZSI6ICJeMS4wLjAiLAorICAgICAgICAid2luZG93LXNpemUiOiAiMC4xLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImNhbWVsY2FzZSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjIuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NhbWVsY2FzZS8tL2NhbWVsY2FzZS0xLjIuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1tN1V3VFM0TFZtbUxMSFdMQ0tQcXFkcWxpams9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAieWF1emwiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjQuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcveWF1emwvLS95YXV6bC0yLjQuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWxTajBRdHF4c2loT1dMUTNtN0dVNGk0TVFBVT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJmZC1zbGljZXIiOiAifjEuMC4xIgorICAgICAgfQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2pzL3BhY2thZ2UuanNvbiBiL2xpYi9qcy9wYWNrYWdlLmpzb24KaW5kZXggZjQwZThiMy4uYTU5Y2RjNCAxMDA2NDQKLS0tIGEvbGliL2pzL3BhY2thZ2UuanNvbgorKysgYi9saWIvanMvcGFja2FnZS5qc29uCkBAIC0xLDE0ICsxLDE5IEBACiB7CiAgICJuYW1lIjogInRocmlmdCIsCi0gICJ2ZXJzaW9uIjogIjAuOS4zIiwKKyAgInZlcnNpb24iOiAiMS4wLjAiLAogICAiZGV2RGVwZW5kZW5jaWVzIjogewotICAgICJncnVudCI6ICJ+MC40LjUiLAotICAgICJncnVudC1jb250cmliLXVnbGlmeSI6ICJ+MC4yLjIiLAotICAgICJncnVudC1jb250cmliLWpzaGludCI6ICJ+MC42LjMiLAotICAgICJncnVudC1jb250cmliLXF1bml0IjogIn4wLjIuMiIsCi0gICAgImdydW50LWNvbnRyaWItY29uY2F0IjogIn4wLjMuMCIsCi0gICAgImdydW50LWpzZG9jIjogIl4wLjYuMCIsCi0gICAgImdydW50LWV4dGVybmFsLWRhZW1vbiI6ICJ+MS4xLjAiLAotICAgICJncnVudC1zaGVsbCI6ICJ+MC42LjQiCisgICAgImdydW50IjogIl4xLjAuMiIsCisgICAgImdydW50LWNsaSI6ICJeMS4yLjAiLAorICAgICJncnVudC1jb250cmliLWNvbmNhdCI6ICJeMS4wLjEiLAorICAgICJncnVudC1jb250cmliLWpzaGludCI6ICJeMS4wLjAiLAorICAgICJncnVudC1jb250cmliLXF1bml0IjogIl4zLjAuMSIsCisgICAgImdydW50LWNvbnRyaWItdWdsaWZ5IjogIl4xLjAuMSIsCisgICAgImdydW50LWpzZG9jIjogIl4yLjIuMSIsCisgICAgImdydW50LXNoZWxsLXNwYXduIjogIl4wLjMuMTAiLAorICAgICJqc2xpbnQiOiAiXjAuMTIuMCIKKyAgfSwKKyAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAianNkb2MiOiAiXjMuNS41IiwKKyAgICAibm9wdCI6ICJeNC4wLjEiCiAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qcy9zcmMvdGhyaWZ0LmpzIGIvbGliL2pzL3NyYy90aHJpZnQuanMKaW5kZXggOTU1YzJkZS4uOWJmODEyNyAxMDA2NDQKLS0tIGEvbGliL2pzL3NyYy90aHJpZnQuanMKKysrIGIvbGliL2pzL3NyYy90aHJpZnQuanMKQEAgLTIwLDIxICsyMCwyMSBAQAogLypqc2hpbnQgZXZpbDp0cnVlKi8KIAogLyoqCi0gKiBUaGUgVGhyaWZ0IG5hbWVzcGFjZSBob3VzZXMgdGhlIEFwYWNoZSBUaHJpZnQgSmF2YVNjcmlwdCBsaWJyYXJ5IAotICogZWxlbWVudHMgcHJvdmlkaW5nIEphdmFTY3JpcHQgYmluZGluZ3MgZm9yIHRoZSBBcGFjaGUgVGhyaWZ0IFJQQyAKLSAqIHN5c3RlbS4gRW5kIHVzZXJzIHdpbGwgdHlwaWNhbGx5IG9ubHkgZGlyZWN0bHkgbWFrZSB1c2Ugb2YgdGhlIAotICogVHJhbnNwb3J0IChUWEhSVHJhbnNwb3J0L1RXZWJTb2NrZXRUcmFuc3BvcnQpIGFuZCBQcm90b2NvbCAKKyAqIFRoZSBUaHJpZnQgbmFtZXNwYWNlIGhvdXNlcyB0aGUgQXBhY2hlIFRocmlmdCBKYXZhU2NyaXB0IGxpYnJhcnkKKyAqIGVsZW1lbnRzIHByb3ZpZGluZyBKYXZhU2NyaXB0IGJpbmRpbmdzIGZvciB0aGUgQXBhY2hlIFRocmlmdCBSUEMKKyAqIHN5c3RlbS4gRW5kIHVzZXJzIHdpbGwgdHlwaWNhbGx5IG9ubHkgZGlyZWN0bHkgbWFrZSB1c2Ugb2YgdGhlCisgKiBUcmFuc3BvcnQgKFRYSFJUcmFuc3BvcnQvVFdlYlNvY2tldFRyYW5zcG9ydCkgYW5kIFByb3RvY29sCiAgKiAoVEpTT05QUm90b2NvbC9UQmluYXJ5UHJvdG9jb2wpIGNvbnN0cnVjdG9ycy4KLSAqIAotICogT2JqZWN0IG1ldGhvZHMgYmVnaW5uaW5nIHdpdGggYSBfXyAoZS5nLiBfX29uT3BlbigpKSBhcmUgaW50ZXJuYWwgCisgKgorICogT2JqZWN0IG1ldGhvZHMgYmVnaW5uaW5nIHdpdGggYSBfXyAoZS5nLiBfX29uT3BlbigpKSBhcmUgaW50ZXJuYWwKICAqIGFuZCBzaG91bGQgbm90IGJlIGNhbGxlZCBvdXRzaWRlIG9mIHRoZSBvYmplY3QncyBvd24gbWV0aG9kcy4KLSAqIAorICoKICAqIFRoaXMgbGlicmFyeSBjcmVhdGVzIG9uZSBnbG9iYWwgb2JqZWN0OiBUaHJpZnQKICAqIENvZGUgaW4gdGhpcyBsaWJyYXJ5IG11c3QgbmV2ZXIgY3JlYXRlIGFkZGl0aW9uYWwgZ2xvYmFsIGlkZW50aWZpZXJzLAogICogYWxsIGZlYXR1cmVzIG11c3QgYmUgc2NvcGVkIHdpdGhpbiB0aGUgVGhyaWZ0IG5hbWVzcGFjZS4KICAqIEBuYW1lc3BhY2UKICAqIEBleGFtcGxlCi0gKiAgICAgdmFyIHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVHJhbnNwb3J0KCJodHRwOi8vbG9jYWxob3N0Ojg1ODUiKTsKKyAqICAgICB2YXIgdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UcmFuc3BvcnQoJ2h0dHA6Ly9sb2NhbGhvc3Q6ODU4NScpOwogICogICAgIHZhciBwcm90b2NvbCAgPSBuZXcgVGhyaWZ0LlByb3RvY29sKHRyYW5zcG9ydCk7CiAgKiAgICAgdmFyIGNsaWVudCA9IG5ldyBNeVRocmlmdFN2Y0NsaWVudChwcm90b2NvbCk7CiAgKiAgICAgdmFyIHJlc3VsdCA9IGNsaWVudC5NeU1ldGhvZCgpOwpAQCAtNDYsNyArNDYsNyBAQAogICAgICAqIEBjb25zdCB7c3RyaW5nfSBWZXJzaW9uCiAgICAgICogQG1lbWJlcm9mIFRocmlmdAogICAgICAqLwotICAgIFZlcnNpb246ICcwLjkuMycsCisgICAgVmVyc2lvbjogJzEuMC4wJywKIAogICAgIC8qKgogICAgICAqIFRocmlmdCBJREwgdHlwZSBzdHJpbmcgdG8gSWQgbWFwcGluZy4KQEAgLTU1LDcgKzU1LDcgQEAKICAgICAgKiBAcHJvcGVydHkge251bWJlcn0gIFZPSUQgICAtIE5vIHZhbHVlIChvbmx5IGxlZ2FsIGZvciByZXR1cm4gdHlwZXMpLgogICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgQk9PTCAgIC0gVHJ1ZS9GYWxzZSBpbnRlZ2VyLgogICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgQllURSAgIC0gU2lnbmVkIDggYml0IGludGVnZXIuCi0gICAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBJMDggICAgLSBTaWduZWQgOCBiaXQgaW50ZWdlci4gICAgIAorICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgSTA4ICAgIC0gU2lnbmVkIDggYml0IGludGVnZXIuCiAgICAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBET1VCTEUgLSA2NCBiaXQgSUVFRSA4NTQgZmxvYXRpbmcgcG9pbnQuCiAgICAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBJMTYgICAgLSBTaWduZWQgMTYgYml0IGludGVnZXIuCiAgICAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBJMzIgICAgLSBTaWduZWQgMzIgYml0IGludGVnZXIuCkBAIC03MCwyMyArNzAsMjMgQEAKICAgICAgKiBAcHJvcGVydHkge251bWJlcn0gIFVURjE2ICAtIEFycmF5IG9mIGJ5dGVzIHJlcHJlc2VudGluZyBhIHN0cmluZyBvZiBVVEYxNiBlbmNvZGVkIGNoYXJhY3RlcnMuCiAgICAgICovCiAgICAgVHlwZTogewotICAgICAgICAnU1RPUCcgOiAwLAotICAgICAgICAnVk9JRCcgOiAxLAotICAgICAgICAnQk9PTCcgOiAyLAotICAgICAgICAnQllURScgOiAzLAotICAgICAgICAnSTA4JyA6IDMsCi0gICAgICAgICdET1VCTEUnIDogNCwKLSAgICAgICAgJ0kxNicgOiA2LAotICAgICAgICAnSTMyJyA6IDgsCi0gICAgICAgICdJNjQnIDogMTAsCi0gICAgICAgICdTVFJJTkcnIDogMTEsCi0gICAgICAgICdVVEY3JyA6IDExLAotICAgICAgICAnU1RSVUNUJyA6IDEyLAotICAgICAgICAnTUFQJyA6IDEzLAotICAgICAgICAnU0VUJyA6IDE0LAotICAgICAgICAnTElTVCcgOiAxNSwKLSAgICAgICAgJ1VURjgnIDogMTYsCi0gICAgICAgICdVVEYxNicgOiAxNworICAgICAgICBTVE9QOiAwLAorICAgICAgICBWT0lEOiAxLAorICAgICAgICBCT09MOiAyLAorICAgICAgICBCWVRFOiAzLAorICAgICAgICBJMDg6IDMsCisgICAgICAgIERPVUJMRTogNCwKKyAgICAgICAgSTE2OiA2LAorICAgICAgICBJMzI6IDgsCisgICAgICAgIEk2NDogMTAsCisgICAgICAgIFNUUklORzogMTEsCisgICAgICAgIFVURjc6IDExLAorICAgICAgICBTVFJVQ1Q6IDEyLAorICAgICAgICBNQVA6IDEzLAorICAgICAgICBTRVQ6IDE0LAorICAgICAgICBMSVNUOiAxNSwKKyAgICAgICAgVVRGODogMTYsCisgICAgICAgIFVURjE2OiAxNwogICAgIH0sCiAKICAgICAvKioKQEAgLTk4LDEwICs5OCwxMCBAQAogICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgT05FV0FZICAgIC0gT25ld2F5IFJQQyBjYWxsIGZyb20gY2xpZW50IHRvIHNlcnZlciB3aXRoIG5vIHJlc3BvbnNlLgogICAgICAqLwogICAgIE1lc3NhZ2VUeXBlOiB7Ci0gICAgICAgICdDQUxMJyA6IDEsCi0gICAgICAgICdSRVBMWScgOiAyLAotICAgICAgICAnRVhDRVBUSU9OJyA6IDMsCi0gICAgICAgICdPTkVXQVknIDogNAorICAgICAgICBDQUxMOiAxLAorICAgICAgICBSRVBMWTogMiwKKyAgICAgICAgRVhDRVBUSU9OOiAzLAorICAgICAgICBPTkVXQVk6IDQKICAgICB9LAogCiAgICAgLyoqCkBAIC0xMzAsNyArMTMwLDcgQEAKICAgICAgIGZ1bmN0aW9uIEYoKSB7fQogICAgICAgRi5wcm90b3R5cGUgPSBzdXBlckNvbnN0cnVjdG9yLnByb3RvdHlwZTsKICAgICAgIGNvbnN0cnVjdG9yLnByb3RvdHlwZSA9IG5ldyBGKCk7Ci0gICAgICBjb25zdHJ1Y3Rvci5wcm90b3R5cGUubmFtZSA9IG5hbWUgfHwgIiI7CisgICAgICBjb25zdHJ1Y3Rvci5wcm90b3R5cGUubmFtZSA9IG5hbWUgfHwgJyc7CiAgICAgfQogfTsKIApAQCAtMTcxLDE3ICsxNzEsMTcgQEAKICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgVU5TVVBQT1JURURfQ0xJRU5UX1RZUEUgLSBVbnVzZWQuCiAgKi8KIFRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb25UeXBlID0gewotICAgICdVTktOT1dOJyA6IDAsCi0gICAgJ1VOS05PV05fTUVUSE9EJyA6IDEsCi0gICAgJ0lOVkFMSURfTUVTU0FHRV9UWVBFJyA6IDIsCi0gICAgJ1dST05HX01FVEhPRF9OQU1FJyA6IDMsCi0gICAgJ0JBRF9TRVFVRU5DRV9JRCcgOiA0LAotICAgICdNSVNTSU5HX1JFU1VMVCcgOiA1LAotICAgICdJTlRFUk5BTF9FUlJPUicgOiA2LAotICAgICdQUk9UT0NPTF9FUlJPUicgOiA3LAotICAgICdJTlZBTElEX1RSQU5TRk9STScgOiA4LAotICAgICdJTlZBTElEX1BST1RPQ09MJyA6IDksCi0gICAgJ1VOU1VQUE9SVEVEX0NMSUVOVF9UWVBFJyA6IDEwCisgICAgVU5LTk9XTjogMCwKKyAgICBVTktOT1dOX01FVEhPRDogMSwKKyAgICBJTlZBTElEX01FU1NBR0VfVFlQRTogMiwKKyAgICBXUk9OR19NRVRIT0RfTkFNRTogMywKKyAgICBCQURfU0VRVUVOQ0VfSUQ6IDQsCisgICAgTUlTU0lOR19SRVNVTFQ6IDUsCisgICAgSU5URVJOQUxfRVJST1I6IDYsCisgICAgUFJPVE9DT0xfRVJST1I6IDcsCisgICAgSU5WQUxJRF9UUkFOU0ZPUk06IDgsCisgICAgSU5WQUxJRF9QUk9UT0NPTDogOSwKKyAgICBVTlNVUFBPUlRFRF9DTElFTlRfVFlQRTogMTAKIH07CiAKIC8qKgpAQCAtMTk0LDcgKzE5NCw3IEBACiAqLwogVGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiA9IGZ1bmN0aW9uKG1lc3NhZ2UsIGNvZGUpIHsKICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOwotICAgIHRoaXMuY29kZSA9IHR5cGVvZiBjb2RlID09PSAibnVtYmVyIiA/IGNvZGUgOiAwOworICAgIHRoaXMuY29kZSA9IHR5cGVvZiBjb2RlID09PSAnbnVtYmVyJyA/IGNvZGUgOiAwOwogfTsKIFRocmlmdC5pbmhlcml0cyhUaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uLCBUaHJpZnQuVEV4Y2VwdGlvbiwgJ1RBcHBsaWNhdGlvbkV4Y2VwdGlvbicpOwogCkBAIC0yNzIsNiArMjcyLDI1IEBACiAgICAgcmV0dXJuIHRoaXMuY29kZTsKIH07CiAKK1RocmlmdC5UUHJvdG9jb2xFeGNlcHRpb25UeXBlID0geworICAgIFVOS05PV046IDAsCisgICAgSU5WQUxJRF9EQVRBOiAxLAorICAgIE5FR0FUSVZFX1NJWkU6IDIsCisgICAgU0laRV9MSU1JVDogMywKKyAgICBCQURfVkVSU0lPTjogNCwKKyAgICBOT1RfSU1QTEVNRU5URUQ6IDUsCisgICAgREVQVEhfTElNSVQ6IDYKK307CisKK1RocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24gPSBmdW5jdGlvbiBUUHJvdG9jb2xFeGNlcHRpb24odHlwZSwgbWVzc2FnZSkgeworICAgIEVycm9yLmNhbGwodGhpcyk7CisgICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7CisgICAgdGhpcy5uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lOworICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKK307CitUaHJpZnQuaW5oZXJpdHMoVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbiwgVGhyaWZ0LlRFeGNlcHRpb24sICdUUHJvdG9jb2xFeGNlcHRpb24nKTsKKwogLyoqCiAgKiBDb25zdHJ1Y3RvciBGdW5jdGlvbiBmb3IgdGhlIFhIUiB0cmFuc3BvcnQuCiAgKiBJZiB5b3UgZG8gbm90IHNwZWNpZnkgYSB1cmwgdGhlbiB5b3UgbXVzdCBoYW5kbGUgWEhSIG9wZXJhdGlvbnMgb24KQEAgLTI3OSw4ICsyOTgsOCBAQAogICogZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCiAgKiBAY29uc3RydWN0b3IKICAqIEBwYXJhbSB7c3RyaW5nfSBbdXJsXSAtIFRoZSBVUkwgdG8gY29ubmVjdCB0by4KLSAqIEBjbGFzc2Rlc2MgVGhlIEFwYWNoZSBUaHJpZnQgVHJhbnNwb3J0IGxheWVyIHBlcmZvcm1zIGJ5dGUgbGV2ZWwgSS9PIAotICogYmV0d2VlbiBSUEMgY2xpZW50cyBhbmQgc2VydmVycy4gVGhlIEphdmFTY3JpcHQgVFhIUlRyYW5zcG9ydCBvYmplY3QgCisgKiBAY2xhc3NkZXNjIFRoZSBBcGFjaGUgVGhyaWZ0IFRyYW5zcG9ydCBsYXllciBwZXJmb3JtcyBieXRlIGxldmVsIEkvTworICogYmV0d2VlbiBSUEMgY2xpZW50cyBhbmQgc2VydmVycy4gVGhlIEphdmFTY3JpcHQgVFhIUlRyYW5zcG9ydCBvYmplY3QKICAqIHVzZXMgSHR0cFtzXS9YSFIuIFRhcmdldCBzZXJ2ZXJzIG11c3QgaW1wbGVtZW50IHRoZSBodHRwW3NdIHRyYW5zcG9ydAogICogKHNlZTogbm9kZS5qcyBleGFtcGxlIHNlcnZlcl9odHRwLmpzKS4KICAqIEBleGFtcGxlCkBAIC0yOTEsNiArMzEwLDcgQEAKICAgICB0aGlzLndwb3MgPSAwOwogICAgIHRoaXMucnBvcyA9IDA7CiAgICAgdGhpcy51c2VDT1JTID0gKG9wdGlvbnMgJiYgb3B0aW9ucy51c2VDT1JTKTsKKyAgICB0aGlzLmN1c3RvbUhlYWRlcnMgPSBvcHRpb25zID8gKG9wdGlvbnMuY3VzdG9tSGVhZGVycyA/IG9wdGlvbnMuY3VzdG9tSGVhZGVycyA6IHt9KToge307CiAgICAgdGhpcy5zZW5kX2J1ZiA9ICcnOwogICAgIHRoaXMucmVjdl9idWYgPSAnJzsKIH07CkBAIC0zMDksMTIgKzMyOSwxMiBAQAogICAgIH0sCiAKICAgICAvKioKLSAgICAgKiBTZW5kcyB0aGUgY3VycmVudCBYUkggcmVxdWVzdCBpZiB0aGUgdHJhbnNwb3J0IHdhcyBjcmVhdGVkIHdpdGggYSBVUkwgCisgICAgICogU2VuZHMgdGhlIGN1cnJlbnQgWFJIIHJlcXVlc3QgaWYgdGhlIHRyYW5zcG9ydCB3YXMgY3JlYXRlZCB3aXRoIGEgVVJMCiAgICAgICogYW5kIHRoZSBhc3luYyBwYXJhbWV0ZXIgaXMgZmFsc2UuIElmIHRoZSB0cmFuc3BvcnQgd2FzIG5vdCBjcmVhdGVkIHdpdGgKLSAgICAgKiBhIFVSTCwgb3IgdGhlIGFzeW5jIHBhcmFtZXRlciBpcyBUcnVlIGFuZCBubyBjYWxsYmFjayBpcyBwcm92aWRlZCwgb3IgCisgICAgICogYSBVUkwsIG9yIHRoZSBhc3luYyBwYXJhbWV0ZXIgaXMgVHJ1ZSBhbmQgbm8gY2FsbGJhY2sgaXMgcHJvdmlkZWQsIG9yCiAgICAgICogdGhlIFVSTCBpcyBhbiBlbXB0eSBzdHJpbmcsIHRoZSBjdXJyZW50IHNlbmQgYnVmZmVyIGlzIHJldHVybmVkLgogICAgICAqIEBwYXJhbSB7b2JqZWN0fSBhc3luYyAtIElmIHRydWUgdGhlIGN1cnJlbnQgc2VuZCBidWZmZXIgaXMgcmV0dXJuZWQuCi0gICAgICogQHBhcmFtIHtvYmplY3R9IGNhbGxiYWNrIC0gT3B0aW9uYWwgYXN5bmMgY29tcGxldGlvbiBjYWxsYmFjayAKKyAgICAgKiBAcGFyYW0ge29iamVjdH0gY2FsbGJhY2sgLSBPcHRpb25hbCBhc3luYyBjb21wbGV0aW9uIGNhbGxiYWNrCiAgICAgICogQHJldHVybnMge3VuZGVmaW5lZHxzdHJpbmd9IE5vdGhpbmcgb3IgdGhlIGN1cnJlbnQgc2VuZCBidWZmZXIuCiAgICAgICogQHRocm93cyB7c3RyaW5nfSBJZiBYSFIgZmFpbHMuCiAgICAgICovCkBAIC0zMzMsOSArMzUzLDkgQEAKICAgICAgICAgaWYgKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAvL0lnbm9yZSBYSFIgY2FsbGJhY2tzIHVudGlsIHRoZSBkYXRhIGFycml2ZXMsIHRoZW4gY2FsbCB0aGUKICAgICAgICAgICAgIC8vICBjbGllbnQncyBjYWxsYmFjawotICAgICAgICAgICAgeHJlcS5vbnJlYWR5c3RhdGVjaGFuZ2UgPSAKKyAgICAgICAgICAgIHhyZXEub25yZWFkeXN0YXRlY2hhbmdlID0KICAgICAgICAgICAgICAgKGZ1bmN0aW9uKCkgewotICAgICAgICAgICAgICAgIHZhciBjbGllbnRDYWxsYmFjayA9IGNhbGxiYWNrOyAgICAKKyAgICAgICAgICAgICAgICB2YXIgY2xpZW50Q2FsbGJhY2sgPSBjYWxsYmFjazsKICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09IDQgJiYgdGhpcy5zdGF0dXMgPT0gMjAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0UmVjdkJ1ZmZlcih0aGlzLnJlc3BvbnNlVGV4dCk7CkBAIC0zNDMsMTAgKzM2MywyNSBAQAogICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgIH0oKSk7CisKKyAgICAgICAgICAgIC8vIGRldGVjdCBuZXQ6OkVSUl9DT05ORUNUSU9OX1JFRlVTRUQgYW5kIGNhbGwgdGhlIGNhbGxiYWNrLgorICAgICAgICAgICAgeHJlcS5vbmVycm9yID0KKyAgICAgICAgICAgICAgICAoZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgICB2YXIgY2xpZW50Q2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgICAgICAgICBjbGllbnRDYWxsYmFjaygpOworICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICB9KCkpOworCiAgICAgICAgIH0KIAogICAgICAgICB4cmVxLm9wZW4oJ1BPU1QnLCB0aGlzLnVybCwgISFhc3luYyk7CiAKKyAgICAgICAgLy8gYWRkIGN1c3RvbSBoZWFkZXJzCisgICAgICAgIE9iamVjdC5rZXlzKHNlbGYuY3VzdG9tSGVhZGVycykuZm9yRWFjaChmdW5jdGlvbihwcm9wKSB7CisgICAgICAgICAgICB4cmVxLnNldFJlcXVlc3RIZWFkZXIocHJvcCwgc2VsZi5jdXN0b21IZWFkZXJzW3Byb3BdKTsKKyAgICAgICAgfSk7CisKICAgICAgICAgaWYgKHhyZXEuc2V0UmVxdWVzdEhlYWRlcikgewogICAgICAgICAgICAgeHJlcS5zZXRSZXF1ZXN0SGVhZGVyKCdBY2NlcHQnLCAnYXBwbGljYXRpb24vdm5kLmFwYWNoZS50aHJpZnQuanNvbjsgY2hhcnNldD11dGYtOCcpOwogICAgICAgICAgICAgeHJlcS5zZXRSZXF1ZXN0SGVhZGVyKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24vdm5kLmFwYWNoZS50aHJpZnQuanNvbjsgY2hhcnNldD11dGYtOCcpOwpAQCAtNDI0LDE5ICs0NTksMTkgQEAKICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHRyYW5zcG9ydCBpcyBvcGVuLCBYSFIgYWx3YXlzIHJldHVybnMgdHJ1ZS4KICAgICAgKiBAcmVhZG9ubHkKICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gQWx3YXlzIFRydWUuCi0gICAgICovICAgIAorICAgICAqLwogICAgIGlzT3BlbjogZnVuY3Rpb24oKSB7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0sCiAKICAgICAvKioKICAgICAgKiBPcGVucyB0aGUgdHJhbnNwb3J0IGNvbm5lY3Rpb24sIHdpdGggWEhSIHRoaXMgaXMgYSBub3AuCi0gICAgICovICAgIAorICAgICAqLwogICAgIG9wZW46IGZ1bmN0aW9uKCkge30sCiAKICAgICAvKioKICAgICAgKiBDbG9zZXMgdGhlIHRyYW5zcG9ydCBjb25uZWN0aW9uLCB3aXRoIFhIUiB0aGlzIGlzIGEgbm9wLgotICAgICAqLyAgICAKKyAgICAgKi8KICAgICBjbG9zZTogZnVuY3Rpb24oKSB7fSwKIAogICAgIC8qKgpAQCAtNDc2LDcgKzUxMSw3IEBACiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgc2VuZCBidWZmZXIgdG8gYnVmLgogICAgICAqIEBwYXJhbSB7c3RyaW5nfSBidWYgLSBUaGUgYnVmZmVyIHRvIHNlbmQuCi0gICAgICovICAgIAorICAgICAqLwogICAgIHdyaXRlOiBmdW5jdGlvbihidWYpIHsKICAgICAgICAgdGhpcy5zZW5kX2J1ZiA9IGJ1ZjsKICAgICB9LApAQCAtNDg1LDcgKzUyMCw3IEBACiAgICAgICogUmV0dXJucyB0aGUgc2VuZCBidWZmZXIuCiAgICAgICogQHJlYWRvbmx5CiAgICAgICogQHJldHVybnMge3N0cmluZ30gVGhlIHNlbmQgYnVmZmVyLgotICAgICAqLyAKKyAgICAgKi8KICAgICBnZXRTZW5kQnVmZmVyOiBmdW5jdGlvbigpIHsKICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZF9idWY7CiAgICAgfQpAQCAtNDk3LDggKzUzMiw4IEBACiAgKiBDb25zdHJ1Y3RvciBGdW5jdGlvbiBmb3IgdGhlIFdlYlNvY2tldCB0cmFuc3BvcnQuCiAgKiBAY29uc3RydWN0b3IKICAqIEBwYXJhbSB7c3RyaW5nfSBbdXJsXSAtIFRoZSBVUkwgdG8gY29ubmVjdCB0by4KLSAqIEBjbGFzc2Rlc2MgVGhlIEFwYWNoZSBUaHJpZnQgVHJhbnNwb3J0IGxheWVyIHBlcmZvcm1zIGJ5dGUgbGV2ZWwgSS9PIAotICogYmV0d2VlbiBSUEMgY2xpZW50cyBhbmQgc2VydmVycy4gVGhlIEphdmFTY3JpcHQgVFdlYlNvY2tldFRyYW5zcG9ydCBvYmplY3QgCisgKiBAY2xhc3NkZXNjIFRoZSBBcGFjaGUgVGhyaWZ0IFRyYW5zcG9ydCBsYXllciBwZXJmb3JtcyBieXRlIGxldmVsIEkvTworICogYmV0d2VlbiBSUEMgY2xpZW50cyBhbmQgc2VydmVycy4gVGhlIEphdmFTY3JpcHQgVFdlYlNvY2tldFRyYW5zcG9ydCBvYmplY3QKICAqIHVzZXMgdGhlIFdlYlNvY2tldCBwcm90b2NvbC4gVGFyZ2V0IHNlcnZlcnMgbXVzdCBpbXBsZW1lbnQgV2ViU29ja2V0LgogICogKHNlZTogbm9kZS5qcyBleGFtcGxlIHNlcnZlcl9odHRwLmpzKS4KICAqIEBleGFtcGxlCkBAIC01MjEsNDMgKzU1Niw0NSBAQAogICAgIH0sCiAKICAgICAvKioKLSAgICAgKiBTZW5kcyB0aGUgY3VycmVudCBXUyByZXF1ZXN0IGFuZCByZWdpc3RlcnMgY2FsbGJhY2suIFRoZSBhc3luYyAKLSAgICAgKiBwYXJhbWV0ZXIgaXMgaWdub3JlZCAoV1MgZmx1c2ggaXMgYWx3YXlzIGFzeW5jKSBhbmQgdGhlIGNhbGxiYWNrIAorICAgICAqIFNlbmRzIHRoZSBjdXJyZW50IFdTIHJlcXVlc3QgYW5kIHJlZ2lzdGVycyBjYWxsYmFjay4gVGhlIGFzeW5jCisgICAgICogcGFyYW1ldGVyIGlzIGlnbm9yZWQgKFdTIGZsdXNoIGlzIGFsd2F5cyBhc3luYykgYW5kIHRoZSBjYWxsYmFjawogICAgICAqIGZ1bmN0aW9uIHBhcmFtZXRlciBpcyByZXF1aXJlZC4KICAgICAgKiBAcGFyYW0ge29iamVjdH0gYXN5bmMgLSBJZ25vcmVkLgogICAgICAqIEBwYXJhbSB7b2JqZWN0fSBjYWxsYmFjayAtIFRoZSBjbGllbnQgY29tcGxldGlvbiBjYWxsYmFjay4KLSAgICAgKiBAcmV0dXJucyB7dW5kZWZpbmVkfHN0cmluZ30gTm90aGluZyAodW5kZWZpbmVkKSAKKyAgICAgKiBAcmV0dXJucyB7dW5kZWZpbmVkfHN0cmluZ30gTm90aGluZyAodW5kZWZpbmVkKQogICAgICAqLwogICAgIGZsdXNoOiBmdW5jdGlvbihhc3luYywgY2FsbGJhY2spIHsKICAgICAgIHZhciBzZWxmID0gdGhpczsKICAgICAgIGlmICh0aGlzLmlzT3BlbigpKSB7CiAgICAgICAgIC8vU2VuZCBkYXRhIGFuZCByZWdpc3RlciBhIGNhbGxiYWNrIHRvIGludm9rZSB0aGUgY2xpZW50IGNhbGxiYWNrCi0gICAgICAgIHRoaXMuc29ja2V0LnNlbmQodGhpcy5zZW5kX2J1Zik7IAorICAgICAgICB0aGlzLnNvY2tldC5zZW5kKHRoaXMuc2VuZF9idWYpOwogICAgICAgICB0aGlzLmNhbGxiYWNrcy5wdXNoKChmdW5jdGlvbigpIHsKLSAgICAgICAgICB2YXIgY2xpZW50Q2FsbGJhY2sgPSBjYWxsYmFjazsgICAgCisgICAgICAgICAgdmFyIGNsaWVudENhbGxiYWNrID0gY2FsbGJhY2s7CiAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKG1zZykgewogICAgICAgICAgICAgc2VsZi5zZXRSZWN2QnVmZmVyKG1zZyk7Ci0gICAgICAgICAgICBjbGllbnRDYWxsYmFjaygpOworICAgICAgICAgICAgaWYgKGNsaWVudENhbGxiYWNrKSB7CisgICAgICAgICAgICAgICAgY2xpZW50Q2FsbGJhY2soKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICB9OwogICAgICAgICB9KCkpKTsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIC8vUXVldWUgdGhlIHNlbmQgdG8gZ28gb3V0IF9fb25PcGVuCiAgICAgICAgIHRoaXMuc2VuZF9wZW5kaW5nLnB1c2goewogICAgICAgICAgIGJ1ZjogdGhpcy5zZW5kX2J1ZiwKLSAgICAgICAgICBjYjogIGNhbGxiYWNrCisgICAgICAgICAgY2I6IGNhbGxiYWNrCiAgICAgICAgIH0pOwogICAgICAgfQogICAgIH0sCiAKLSAgICBfX29uT3BlbjogZnVuY3Rpb24oKSB7IAorICAgIF9fb25PcGVuOiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICAgICAgaWYgKHRoaXMuc2VuZF9wZW5kaW5nLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAvL0lmIHRoZSB1c2VyIG1hZGUgY2FsbHMgYmVmb3JlIHRoZSBjb25uZWN0aW9uIHdhcyBmdWxseSAKKyAgICAgICAgICAvL0lmIHRoZSB1c2VyIG1hZGUgY2FsbHMgYmVmb3JlIHRoZSBjb25uZWN0aW9uIHdhcyBmdWxseQogICAgICAgICAgIC8vb3Blbiwgc2VuZCB0aGVtIG5vdwogICAgICAgICAgIHRoaXMuc2VuZF9wZW5kaW5nLmZvckVhY2goZnVuY3Rpb24oZWxlbSkgewotICAgICAgICAgICAgIHRoaXMuc29ja2V0LnNlbmQoZWxlbS5idWYpOwotICAgICAgICAgICAgIHRoaXMuY2FsbGJhY2tzLnB1c2goKGZ1bmN0aW9uKCkgewotICAgICAgICAgICAgICAgdmFyIGNsaWVudENhbGxiYWNrID0gZWxlbS5jYjsgICAgCisgICAgICAgICAgICAgc2VsZi5zb2NrZXQuc2VuZChlbGVtLmJ1Zik7CisgICAgICAgICAgICAgc2VsZi5jYWxsYmFja3MucHVzaCgoZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICB2YXIgY2xpZW50Q2FsbGJhY2sgPSBlbGVtLmNiOwogICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKG1zZykgewogICAgICAgICAgICAgICAgICAgc2VsZi5zZXRSZWN2QnVmZmVyKG1zZyk7CiAgICAgICAgICAgICAgICAgICBjbGllbnRDYWxsYmFjaygpOwpAQCAtNTY3LDE5ICs2MDQsMTkgQEAKICAgICAgICAgICB0aGlzLnNlbmRfcGVuZGluZyA9IFtdOwogICAgICAgIH0KICAgICB9LAotICAgIAotICAgIF9fb25DbG9zZTogZnVuY3Rpb24oZXZ0KSB7IAorCisgICAgX19vbkNsb3NlOiBmdW5jdGlvbihldnQpIHsKICAgICAgIHRoaXMuX19yZXNldCh0aGlzLnVybCk7CiAgICAgfSwKLSAgICAgCisKICAgICBfX29uTWVzc2FnZTogZnVuY3Rpb24oZXZ0KSB7CiAgICAgICBpZiAodGhpcy5jYWxsYmFja3MubGVuZ3RoKSB7CiAgICAgICAgIHRoaXMuY2FsbGJhY2tzLnNoaWZ0KCkoZXZ0LmRhdGEpOwogICAgICAgfQogICAgIH0sCi0gICAgIAotICAgIF9fb25FcnJvcjogZnVuY3Rpb24oZXZ0KSB7IAotICAgICAgY29uc29sZS5sb2coIlRocmlmdCBXZWJTb2NrZXQgRXJyb3I6ICIgKyBldnQudG9TdHJpbmcoKSk7CisKKyAgICBfX29uRXJyb3I6IGZ1bmN0aW9uKGV2dCkgeworICAgICAgY29uc29sZS5sb2coJ1RocmlmdCBXZWJTb2NrZXQgRXJyb3I6ICcgKyBldnQudG9TdHJpbmcoKSk7CiAgICAgICB0aGlzLnNvY2tldC5jbG9zZSgpOwogICAgIH0sCiAKQEAgLTU5NywxNSArNjM0LDE1IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB0cmFuc3BvcnQgaXMgb3BlbgogICAgICAqIEByZWFkb25seQotICAgICAqIEByZXR1cm5zIHtib29sZWFufSAKLSAgICAgKi8gICAgCisgICAgICogQHJldHVybnMge2Jvb2xlYW59CisgICAgICovCiAgICAgaXNPcGVuOiBmdW5jdGlvbigpIHsKICAgICAgICAgcmV0dXJuIHRoaXMuc29ja2V0ICYmIHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgPT0gdGhpcy5zb2NrZXQuT1BFTjsKICAgICB9LAogCiAgICAgLyoqCiAgICAgICogT3BlbnMgdGhlIHRyYW5zcG9ydCBjb25uZWN0aW9uCi0gICAgICovICAgIAorICAgICAqLwogICAgIG9wZW46IGZ1bmN0aW9uKCkgewogICAgICAgLy9JZiBPUEVOL0NPTk5FQ1RJTkcvQ0xPU0lORyBpZ25vcmUgYWRkaXRpb25hbCBvcGVucwogICAgICAgaWYgKHRoaXMuc29ja2V0ICYmIHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgIT0gdGhpcy5zb2NrZXQuQ0xPU0VEKSB7CkBAIC02MTMsMTUgKzY1MCwxNSBAQAogICAgICAgfQogICAgICAgLy9JZiB0aGVyZSBpcyBubyBzb2NrZXQgb3IgdGhlIHNvY2tldCBpcyBjbG9zZWQ6CiAgICAgICB0aGlzLnNvY2tldCA9IG5ldyBXZWJTb2NrZXQodGhpcy51cmwpOwotICAgICAgdGhpcy5zb2NrZXQub25vcGVuID0gdGhpcy5fX29uT3Blbi5iaW5kKHRoaXMpOyAKLSAgICAgIHRoaXMuc29ja2V0Lm9ubWVzc2FnZSA9IHRoaXMuX19vbk1lc3NhZ2UuYmluZCh0aGlzKTsgCi0gICAgICB0aGlzLnNvY2tldC5vbmVycm9yID0gdGhpcy5fX29uRXJyb3IuYmluZCh0aGlzKTsgCi0gICAgICB0aGlzLnNvY2tldC5vbmNsb3NlID0gdGhpcy5fX29uQ2xvc2UuYmluZCh0aGlzKTsgCisgICAgICB0aGlzLnNvY2tldC5vbm9wZW4gPSB0aGlzLl9fb25PcGVuLmJpbmQodGhpcyk7CisgICAgICB0aGlzLnNvY2tldC5vbm1lc3NhZ2UgPSB0aGlzLl9fb25NZXNzYWdlLmJpbmQodGhpcyk7CisgICAgICB0aGlzLnNvY2tldC5vbmVycm9yID0gdGhpcy5fX29uRXJyb3IuYmluZCh0aGlzKTsKKyAgICAgIHRoaXMuc29ja2V0Lm9uY2xvc2UgPSB0aGlzLl9fb25DbG9zZS5iaW5kKHRoaXMpOwogICAgIH0sCiAKICAgICAvKioKICAgICAgKiBDbG9zZXMgdGhlIHRyYW5zcG9ydCBjb25uZWN0aW9uCi0gICAgICovICAgIAorICAgICAqLwogICAgIGNsb3NlOiBmdW5jdGlvbigpIHsKICAgICAgIHRoaXMuc29ja2V0LmNsb3NlKCk7CiAgICAgfSwKQEAgLTY2Myw3ICs3MDAsNyBAQAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIHNlbmQgYnVmZmVyIHRvIGJ1Zi4KICAgICAgKiBAcGFyYW0ge3N0cmluZ30gYnVmIC0gVGhlIGJ1ZmZlciB0byBzZW5kLgotICAgICAqLyAgICAKKyAgICAgKi8KICAgICB3cml0ZTogZnVuY3Rpb24oYnVmKSB7CiAgICAgICAgIHRoaXMuc2VuZF9idWYgPSBidWY7CiAgICAgfSwKQEAgLTY3Miw3ICs3MDksNyBAQAogICAgICAqIFJldHVybnMgdGhlIHNlbmQgYnVmZmVyLgogICAgICAqIEByZWFkb25seQogICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBzZW5kIGJ1ZmZlci4KLSAgICAgKi8gCisgICAgICovCiAgICAgZ2V0U2VuZEJ1ZmZlcjogZnVuY3Rpb24oKSB7CiAgICAgICAgIHJldHVybiB0aGlzLnNlbmRfYnVmOwogICAgIH0KQEAgLTY4Myw4ICs3MjAsOCBAQAogICogSW5pdGlhbGl6ZXMgYSBUaHJpZnQgSlNPTiBwcm90b2NvbCBpbnN0YW5jZS4KICAqIEBjb25zdHJ1Y3RvcgogICogQHBhcmFtIHtUaHJpZnQuVHJhbnNwb3J0fSB0cmFuc3BvcnQgLSBUaGUgdHJhbnNwb3J0IHRvIHNlcmlhbGl6ZSB0by9mcm9tLgotICogQGNsYXNzZGVzYyBBcGFjaGUgVGhyaWZ0IFByb3RvY29scyBwZXJmb3JtIHNlcmlhbGl6YXRpb24gd2hpY2ggZW5hYmxlcyBjcm9zcyAKLSAqIGxhbmd1YWdlIFJQQy4gVGhlIFByb3RvY29sIHR5cGUgaXMgdGhlIEphdmFTY3JpcHQgYnJvd3NlciBpbXBsZW1lbnRhdGlvbiAKKyAqIEBjbGFzc2Rlc2MgQXBhY2hlIFRocmlmdCBQcm90b2NvbHMgcGVyZm9ybSBzZXJpYWxpemF0aW9uIHdoaWNoIGVuYWJsZXMgY3Jvc3MKKyAqIGxhbmd1YWdlIFJQQy4gVGhlIFByb3RvY29sIHR5cGUgaXMgdGhlIEphdmFTY3JpcHQgYnJvd3NlciBpbXBsZW1lbnRhdGlvbgogICogb2YgdGhlIEFwYWNoZSBUaHJpZnQgVEpTT05Qcm90b2NvbC4KICAqIEBleGFtcGxlCiAgKiAgICAgdmFyIHByb3RvY29sICA9IG5ldyBUaHJpZnQuUHJvdG9jb2wodHJhbnNwb3J0KTsKQEAgLTc0NCw3ICs3ODEsNyBAQAogICAgICAqIFJldHVybnMgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LgogICAgICAqIEByZWFkb25seQogICAgICAqIEByZXR1cm5zIHtUaHJpZnQuVHJhbnNwb3J0fSBUaGUgdW5kZXJseWluZyB0cmFuc3BvcnQuCi0gICAgICovIAorICAgICAqLwogICAgIGdldFRyYW5zcG9ydDogZnVuY3Rpb24oKSB7CiAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zcG9ydDsKICAgICB9LApAQCAtOTg2LDcgKzEwMjMsNyBAQAogICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ1wiJykgewogICAgICAgICAgICAgICAgICAgICBlc2NhcGVkU3RyaW5nICs9ICdcXFwiJzsgLy8gd3JpdGUgb3V0IGFzOiBcIgogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT09ICdcXCcpIHsgICAgLy8gYSBzaW5nbGUgYmFja3NsYXNoCi0gICAgICAgICAgICAgICAgICAgIGVzY2FwZWRTdHJpbmcgKz0gJ1xcXFwnOyAvLyB3cml0ZSBvdXQgYXMgZG91YmxlIGJhY2tzbGFzaCAKKyAgICAgICAgICAgICAgICAgICAgZXNjYXBlZFN0cmluZyArPSAnXFxcXCc7IC8vIHdyaXRlIG91dCBhcyBkb3VibGUgYmFja3NsYXNoCiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJ1xiJykgeyAgICAvLyBhIHNpbmdsZSBiYWNrc3BhY2U6IGludmlzaWJsZQogICAgICAgICAgICAgICAgICAgICBlc2NhcGVkU3RyaW5nICs9ICdcXGInOyAgLy8gd3JpdGUgb3V0IGFzOiBcYiIKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAnXGYnKSB7ICAgIC8vIGEgc2luZ2xlIGZvcm1mZWVkOiBpbnZpc2libGUKQEAgLTEwMDYsOCArMTA0MywxOSBAQAogICAgIH0sCiAKICAgICAvKiogU2VyaWFsaXplcyBhIHN0cmluZyAqLwotICAgIHdyaXRlQmluYXJ5OiBmdW5jdGlvbihzdHIpIHsKLSAgICAgICAgdGhpcy53cml0ZVN0cmluZyhzdHIpOworICAgIHdyaXRlQmluYXJ5OiBmdW5jdGlvbihiaW5hcnkpIHsKKyAgICAgICAgdmFyIHN0ciA9ICcnOworICAgICAgICBpZiAodHlwZW9mIGJpbmFyeSA9PSAnc3RyaW5nJykgeworICAgICAgICAgICAgc3RyID0gYmluYXJ5OworICAgICAgICB9IGVsc2UgaWYgKGJpbmFyeSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHsKKyAgICAgICAgICAgIHZhciBhcnIgPSBiaW5hcnk7CisgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgIHN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGFycltpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd3cml0ZUJpbmFyeSBvbmx5IGFjY2VwdHMgU3RyaW5nIG9yIFVpbnQ4QXJyYXkuJyk7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy50c3RhY2sucHVzaCgnIicgKyBidG9hKHN0cikgKyAnIicpOwogICAgIH0sCiAKICAgICAvKioKQEAgLTEwMTcsOCArMTA2NSw4IEBACiAgICAgICAgQHByb3BlcnR5IHtUaHJpZnQuTWVzc2FnZVR5cGV9IG10eXBlIC0gVGhlIHR5cGUgb2YgbWVzc2FnZSBjYWxsLgogICAgICAgIEBwcm9wZXJ0eSB7bnVtYmVyfSByc2VxaWQgLSBUaGUgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBtZXNzYWdlICgwIGluIFRocmlmdCBSUEMpLgogICAgICAqLwotICAgIC8qKiAKLSAgICAgKiBEZXNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIG1lc3NhZ2UuIAorICAgIC8qKgorICAgICAqIERlc2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgbWVzc2FnZS4KICAgICAgKiBAcmV0dXJucyB7QW5vblJlYWRNZXNzYWdlQmVnaW5SZXR1cm59CiAgICAgICovCiAgICAgcmVhZE1lc3NhZ2VCZWdpbjogZnVuY3Rpb24oKSB7CkBAIC0xMDU1LDExICsxMTAzLDExIEBACiAgICAgcmVhZE1lc3NhZ2VFbmQ6IGZ1bmN0aW9uKCkgewogICAgIH0sCiAKLSAgICAvKiogCi0gICAgICogRGVzZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBzdHJ1Y3QuIAorICAgIC8qKgorICAgICAqIERlc2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgc3RydWN0LgogICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbbmFtZV0gLSBUaGUgbmFtZSBvZiB0aGUgc3RydWN0IChpZ25vcmVkKQogICAgICAqIEByZXR1cm5zIHtvYmplY3R9IC0gQW4gb2JqZWN0IHdpdGggYW4gZW1wdHkgc3RyaW5nIGZuYW1lIHByb3BlcnR5Ci0gICAgICovICAgIAorICAgICAqLwogICAgIHJlYWRTdHJ1Y3RCZWdpbjogZnVuY3Rpb24obmFtZSkgewogICAgICAgICB2YXIgciA9IHt9OwogICAgICAgICByLmZuYW1lID0gJyc7CkBAIC0xMDg2LDggKzExMzQsOCBAQAogICAgICAgIEBwcm9wZXJ0eSB7VGhyaWZ0LlR5cGV9IGZ0eXBlIC0gVGhlIGRhdGEgdHlwZSBvZiB0aGUgZmllbGQuCiAgICAgICAgQHByb3BlcnR5IHtudW1iZXJ9IGZpZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgZmllbGQuCiAgICAgICovCi0gICAgLyoqIAotICAgICAqIERlc2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgZmllbGQuIAorICAgIC8qKgorICAgICAqIERlc2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgZmllbGQuCiAgICAgICogQHJldHVybnMge0Fub25SZWFkRmllbGRCZWdpblJldHVybn0KICAgICAgKi8KICAgICByZWFkRmllbGRCZWdpbjogZnVuY3Rpb24oKSB7CkBAIC0xMTU1LDggKzEyMDMsOCBAQAogICAgICAgIEBwcm9wZXJ0eSB7VGhyaWZ0LlR5cGV9IHZ0eXBlIC0gVGhlIGRhdGEgdHlwZSBvZiB0aGUgdmFsdWUuCiAgICAgICAgQHByb3BlcnR5IHtudW1iZXJ9IHNpemUgLSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBtYXAuCiAgICAgICovCi0gICAgLyoqIAotICAgICAqIERlc2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgbWFwLiAKKyAgICAvKioKKyAgICAgKiBEZXNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIG1hcC4KICAgICAgKiBAcmV0dXJucyB7QW5vblJlYWRNYXBCZWdpblJldHVybn0KICAgICAgKi8KICAgICByZWFkTWFwQmVnaW46IGZ1bmN0aW9uKCkgewpAQCAtMTE5MSw4ICsxMjM5LDggQEAKICAgICAgICBAcHJvcGVydHkge1RocmlmdC5UeXBlfSBldHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGVsZW1lbnQuCiAgICAgICAgQHByb3BlcnR5IHtudW1iZXJ9IHNpemUgLSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjb2xsZWN0aW9uLgogICAgICAqLwotICAgIC8qKiAKLSAgICAgKiBEZXNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIGxpc3QuIAorICAgIC8qKgorICAgICAqIERlc2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgbGlzdC4KICAgICAgKiBAcmV0dXJucyB7QW5vblJlYWRDb2xCZWdpblJldHVybn0KICAgICAgKi8KICAgICByZWFkTGlzdEJlZ2luOiBmdW5jdGlvbigpIHsKQEAgLTEyMTAsMTEgKzEyNTgsMTYgQEAKIAogICAgIC8qKiBEZXNlcmlhbGl6ZXMgdGhlIGVuZCBvZiBhIGxpc3QuICovCiAgICAgcmVhZExpc3RFbmQ6IGZ1bmN0aW9uKCkgewotICAgICAgICB0aGlzLnJlYWRGaWVsZEVuZCgpOworICAgICAgICB2YXIgcG9zID0gdGhpcy5ycG9zLnBvcCgpIC0gMjsKKyAgICAgICAgdmFyIHN0ID0gdGhpcy5yc3RhY2s7CisgICAgICAgIHN0LnBvcCgpOworICAgICAgICBpZiAoc3QgaW5zdGFuY2VvZiBBcnJheSAmJiBzdC5sZW5ndGggPiBwb3MgJiYgc3RbcG9zXS5sZW5ndGggPiAwKSB7CisgICAgICAgICAgc3QucHVzaChzdFtwb3NdLnNoaWZ0KCkpOworICAgICAgICB9CiAgICAgfSwKIAotICAgIC8qKiAKLSAgICAgKiBEZXNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIHNldC4gCisgICAgLyoqCisgICAgICogRGVzZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBzZXQuCiAgICAgICogQHJldHVybnMge0Fub25SZWFkQ29sQmVnaW5SZXR1cm59CiAgICAgICovCiAgICAgcmVhZFNldEJlZ2luOiBmdW5jdGlvbihlbGVtVHlwZSwgc2l6ZSkgewpAQCAtMTIyNiw4ICsxMjc5LDggQEAKICAgICAgICAgcmV0dXJuIHRoaXMucmVhZExpc3RFbmQoKTsKICAgICB9LAogCi0gICAgLyoqIFJldHVybnMgYW4gb2JqZWN0IHdpdGggYSB2YWx1ZSBwcm9wZXJ0eSBzZXQgdG8gCi0gICAgICogIEZhbHNlIHVubGVzcyB0aGUgbmV4dCBudW1iZXIgaW4gdGhlIHByb3RvY29sIGJ1ZmZlciAKKyAgICAvKiogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBhIHZhbHVlIHByb3BlcnR5IHNldCB0bworICAgICAqICBGYWxzZSB1bmxlc3MgdGhlIG5leHQgbnVtYmVyIGluIHRoZSBwcm90b2NvbCBidWZmZXIKICAgICAgKiAgaXMgMSwgaW4gd2hpY2ggY2FzZSB0aGUgdmFsdWUgcHJvcGVydHkgaXMgVHJ1ZSAqLwogICAgIHJlYWRCb29sOiBmdW5jdGlvbigpIHsKICAgICAgICAgdmFyIHIgPSB0aGlzLnJlYWRJMzIoKTsKQEAgLTEyNDEsMTkgKzEyOTQsMTkgQEAKICAgICAgICAgcmV0dXJuIHI7CiAgICAgfSwKIAotICAgIC8qKiBSZXR1cm5zIHRoZSBhbiBvYmplY3Qgd2l0aCBhIHZhbHVlIHByb3BlcnR5IHNldCB0byB0aGUgCisgICAgLyoqIFJldHVybnMgdGhlIGFuIG9iamVjdCB3aXRoIGEgdmFsdWUgcHJvcGVydHkgc2V0IHRvIHRoZQogICAgICAgICBuZXh0IHZhbHVlIGZvdW5kIGluIHRoZSBwcm90b2NvbCBidWZmZXIgKi8KICAgICByZWFkQnl0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgIHJldHVybiB0aGlzLnJlYWRJMzIoKTsKICAgICB9LAogCi0gICAgLyoqIFJldHVybnMgdGhlIGFuIG9iamVjdCB3aXRoIGEgdmFsdWUgcHJvcGVydHkgc2V0IHRvIHRoZSAKKyAgICAvKiogUmV0dXJucyB0aGUgYW4gb2JqZWN0IHdpdGggYSB2YWx1ZSBwcm9wZXJ0eSBzZXQgdG8gdGhlCiAgICAgICAgIG5leHQgdmFsdWUgZm91bmQgaW4gdGhlIHByb3RvY29sIGJ1ZmZlciAqLwogICAgIHJlYWRJMTY6IGZ1bmN0aW9uKCkgewogICAgICAgICByZXR1cm4gdGhpcy5yZWFkSTMyKCk7CiAgICAgfSwKIAotICAgIC8qKiBSZXR1cm5zIHRoZSBhbiBvYmplY3Qgd2l0aCBhIHZhbHVlIHByb3BlcnR5IHNldCB0byB0aGUgCisgICAgLyoqIFJldHVybnMgdGhlIGFuIG9iamVjdCB3aXRoIGEgdmFsdWUgcHJvcGVydHkgc2V0IHRvIHRoZQogICAgICAgICBuZXh0IHZhbHVlIGZvdW5kIGluIHRoZSBwcm90b2NvbCBidWZmZXIgKi8KICAgICByZWFkSTMyOiBmdW5jdGlvbihmKSB7CiAgICAgICAgIGlmIChmID09PSB1bmRlZmluZWQpIHsKQEAgLTEyNjYsNyArMTMxOSwxMSBAQAogICAgICAgICAgICAgaWYgKGYubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICAgci52YWx1ZSA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgci52YWx1ZSA9IGYuc2hpZnQoKTsKKyAgICAgICAgICAgICAgICBpZiAoIWYuaXNSZXZlcnNlZCkgeworICAgICAgICAgICAgICAgICAgICBmLnJldmVyc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgZi5pc1JldmVyc2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgci52YWx1ZSA9IGYucG9wKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAoZiBpbnN0YW5jZW9mIE9iamVjdCkgewogICAgICAgICAgICBmb3IgKHZhciBpIGluIGYpIHsKQEAgLTEyODcsMzIgKzEzNDQsMzQgQEAKICAgICAgICAgcmV0dXJuIHI7CiAgICAgfSwKIAotICAgIC8qKiBSZXR1cm5zIHRoZSBhbiBvYmplY3Qgd2l0aCBhIHZhbHVlIHByb3BlcnR5IHNldCB0byB0aGUgCisgICAgLyoqIFJldHVybnMgdGhlIGFuIG9iamVjdCB3aXRoIGEgdmFsdWUgcHJvcGVydHkgc2V0IHRvIHRoZQogICAgICAgICBuZXh0IHZhbHVlIGZvdW5kIGluIHRoZSBwcm90b2NvbCBidWZmZXIgKi8KICAgICByZWFkSTY0OiBmdW5jdGlvbigpIHsKICAgICAgICAgcmV0dXJuIHRoaXMucmVhZEkzMigpOwogICAgIH0sCiAKLSAgICAvKiogUmV0dXJucyB0aGUgYW4gb2JqZWN0IHdpdGggYSB2YWx1ZSBwcm9wZXJ0eSBzZXQgdG8gdGhlIAorICAgIC8qKiBSZXR1cm5zIHRoZSBhbiBvYmplY3Qgd2l0aCBhIHZhbHVlIHByb3BlcnR5IHNldCB0byB0aGUKICAgICAgICAgbmV4dCB2YWx1ZSBmb3VuZCBpbiB0aGUgcHJvdG9jb2wgYnVmZmVyICovCiAgICAgcmVhZERvdWJsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgIHJldHVybiB0aGlzLnJlYWRJMzIoKTsKICAgICB9LAogCi0gICAgLyoqIFJldHVybnMgdGhlIGFuIG9iamVjdCB3aXRoIGEgdmFsdWUgcHJvcGVydHkgc2V0IHRvIHRoZSAKKyAgICAvKiogUmV0dXJucyB0aGUgYW4gb2JqZWN0IHdpdGggYSB2YWx1ZSBwcm9wZXJ0eSBzZXQgdG8gdGhlCiAgICAgICAgIG5leHQgdmFsdWUgZm91bmQgaW4gdGhlIHByb3RvY29sIGJ1ZmZlciAqLwogICAgIHJlYWRTdHJpbmc6IGZ1bmN0aW9uKCkgewogICAgICAgICB2YXIgciA9IHRoaXMucmVhZEkzMigpOwogICAgICAgICByZXR1cm4gcjsKICAgICB9LAogCi0gICAgLyoqIFJldHVybnMgdGhlIGFuIG9iamVjdCB3aXRoIGEgdmFsdWUgcHJvcGVydHkgc2V0IHRvIHRoZSAKKyAgICAvKiogUmV0dXJucyB0aGUgYW4gb2JqZWN0IHdpdGggYSB2YWx1ZSBwcm9wZXJ0eSBzZXQgdG8gdGhlCiAgICAgICAgIG5leHQgdmFsdWUgZm91bmQgaW4gdGhlIHByb3RvY29sIGJ1ZmZlciAqLwogICAgIHJlYWRCaW5hcnk6IGZ1bmN0aW9uKCkgewotICAgICAgICByZXR1cm4gdGhpcy5yZWFkU3RyaW5nKCk7CisgICAgICAgIHZhciByID0gdGhpcy5yZWFkSTMyKCk7CisgICAgICAgIHIudmFsdWUgPSBhdG9iKHIudmFsdWUpOworICAgICAgICByZXR1cm4gcjsKICAgICB9LAogCi0gICAgLyoqIAorICAgIC8qKgogICAgICAqIE1ldGhvZCB0byBhcmJpdHJhcmlseSBza2lwIG92ZXIgZGF0YSAqLwogICAgIHNraXA6IGZ1bmN0aW9uKHR5cGUpIHsKICAgICAgICAgdmFyIHJldCwgaTsKQEAgLTEzODMsNiArMTQ0Miw5IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHRoaXMucmVhZExpc3RFbmQoKTsKICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbihUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uVHlwZS5JTlZBTElEX0RBVEEpOwogICAgICAgICB9CiAgICAgfQogfTsKQEAgLTEzOTIsMjMgKzE0NTQsMjMgQEAKICAqIEluaXRpYWxpemVzIGEgTXV0aWxwbGV4UHJvdG9jb2wgSW1wbGVtZW50YXRpb24gYXMgYSBXcmFwcGVyIGZvciBUaHJpZnQuUHJvdG9jb2wKICAqIEBjb25zdHJ1Y3RvcgogICovCi1UaHJpZnQuTXVsdGlwbGV4UHJvdG9jb2wgPSBmdW5jdGlvbiAoc3J2TmFtZSwgdHJhbnMsIHN0cmljdFJlYWQsIHN0cmljdFdyaXRlKSB7CitUaHJpZnQuTXVsdGlwbGV4UHJvdG9jb2wgPSBmdW5jdGlvbihzcnZOYW1lLCB0cmFucywgc3RyaWN0UmVhZCwgc3RyaWN0V3JpdGUpIHsKICAgICBUaHJpZnQuUHJvdG9jb2wuY2FsbCh0aGlzLCB0cmFucywgc3RyaWN0UmVhZCwgc3RyaWN0V3JpdGUpOwogICAgIHRoaXMuc2VydmljZU5hbWUgPSBzcnZOYW1lOwogfTsKIFRocmlmdC5pbmhlcml0cyhUaHJpZnQuTXVsdGlwbGV4UHJvdG9jb2wsIFRocmlmdC5Qcm90b2NvbCwgJ211bHRpcGxleFByb3RvY29sJyk7CiAKIC8qKiBPdmVycmlkZSB3cml0ZU1lc3NhZ2VCZWdpbiBtZXRob2Qgb2YgcHJvdG90eXBlKi8KLVRocmlmdC5NdWx0aXBsZXhQcm90b2NvbC5wcm90b3R5cGUud3JpdGVNZXNzYWdlQmVnaW4gPSBmdW5jdGlvbiAobmFtZSwgdHlwZSwgc2VxaWQpIHsKK1RocmlmdC5NdWx0aXBsZXhQcm90b2NvbC5wcm90b3R5cGUud3JpdGVNZXNzYWdlQmVnaW4gPSBmdW5jdGlvbihuYW1lLCB0eXBlLCBzZXFpZCkgewogCiAgICAgaWYgKHR5cGUgPT09IFRocmlmdC5NZXNzYWdlVHlwZS5DQUxMIHx8IHR5cGUgPT09IFRocmlmdC5NZXNzYWdlVHlwZS5PTkVXQVkpIHsKLSAgICAgICAgVGhyaWZ0LlByb3RvY29sLnByb3RvdHlwZS53cml0ZU1lc3NhZ2VCZWdpbi5jYWxsKHRoaXMsIHRoaXMuc2VydmljZU5hbWUgKyAiOiIgKyBuYW1lLCB0eXBlLCBzZXFpZCk7CisgICAgICAgIFRocmlmdC5Qcm90b2NvbC5wcm90b3R5cGUud3JpdGVNZXNzYWdlQmVnaW4uY2FsbCh0aGlzLCB0aGlzLnNlcnZpY2VOYW1lICsgJzonICsgbmFtZSwgdHlwZSwgc2VxaWQpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIFRocmlmdC5Qcm90b2NvbC5wcm90b3R5cGUud3JpdGVNZXNzYWdlQmVnaW4uY2FsbCh0aGlzLCBuYW1lLCB0eXBlLCBzZXFpZCk7CiAgICAgfQogfTsKIAotVGhyaWZ0Lk11bHRpcGxleGVyID0gZnVuY3Rpb24gKCkgeworVGhyaWZ0Lk11bHRpcGxleGVyID0gZnVuY3Rpb24oKSB7CiAgICAgdGhpcy5zZXFpZCA9IDA7CiB9OwogCkBAIC0xNDIzLDEyICsxNDg1LDEyIEBACiAgKiAgICB2YXIgcHJvdG9jb2wgPSBuZXcgVGhyaWZ0LlByb3RvY29sKHRyYW5zcG9ydCk7CiAgKiAgICB2YXIgY2xpZW50ID0gbXAuY3JlYXRlQ2xpZW50KCdBdXRoU2VydmljZScsIEF1dGhTZXJ2aWNlQ2xpZW50LCB0cmFuc3BvcnQpOwogKi8KLVRocmlmdC5NdWx0aXBsZXhlci5wcm90b3R5cGUuY3JlYXRlQ2xpZW50ID0gZnVuY3Rpb24gKHNlcnZpY2VOYW1lLCBTQ2wsIHRyYW5zcG9ydCkgeworVGhyaWZ0Lk11bHRpcGxleGVyLnByb3RvdHlwZS5jcmVhdGVDbGllbnQgPSBmdW5jdGlvbihzZXJ2aWNlTmFtZSwgU0NsLCB0cmFuc3BvcnQpIHsKICAgICBpZiAoU0NsLkNsaWVudCkgewogICAgICAgICBTQ2wgPSBTQ2wuQ2xpZW50OwogICAgIH0KICAgICB2YXIgc2VsZiA9IHRoaXM7Ci0gICAgU0NsLnByb3RvdHlwZS5uZXdfc2VxaWQgPSBmdW5jdGlvbiAoKSB7CisgICAgU0NsLnByb3RvdHlwZS5uZXdfc2VxaWQgPSBmdW5jdGlvbigpIHsKICAgICAgICAgc2VsZi5zZXFpZCArPSAxOwogICAgICAgICByZXR1cm4gc2VsZi5zZXFpZDsKICAgICB9OwpAQCAtMTQ3MSw3ICsxNTMzLDcgQEAKICAgcmV0dXJuIHJlc3VsdDsKIH07CiAKLWNvcHlNYXAgPSBmdW5jdGlvbihvYmosIHR5cGVzKXsKK2NvcHlNYXAgPSBmdW5jdGlvbihvYmosIHR5cGVzKSB7CiAKICAgaWYgKCFvYmopIHtyZXR1cm4gb2JqOyB9CiAKQEAgLTE0ODYsOCArMTU0OCw4IEBACiAgIHZhciBUeXBlID0gdHlwZTsKIAogICB2YXIgcmVzdWx0ID0ge30sIHZhbDsKLSAgZm9yKHZhciBwcm9wIGluIG9iaikgewotICAgIGlmKG9iai5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgeworICBmb3IgKHZhciBwcm9wIGluIG9iaikgeworICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkocHJvcCkpIHsKICAgICAgIHZhbCA9IG9ialtwcm9wXTsKICAgICAgIGlmICh0eXBlID09PSBudWxsKSB7CiAgICAgICAgIHJlc3VsdFtwcm9wXSA9IHZhbDsKZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L2J1aWxkLnByb3BlcnRpZXMgYi9saWIvanMvdGVzdC9idWlsZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NjM2NjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanMvdGVzdC9idWlsZC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNSBAQAorIyBNYXZlbiBBbnQgdGFza3MgSmFyIGRldGFpbHMKK212bi5hbnQudGFzay52ZXJzaW9uPTIuMS4zCittdm4ucmVwbz1odHRwOi8vcmVwbzEubWF2ZW4ub3JnL21hdmVuMgorbXZuLmFudC50YXNrLnVybD0ke212bi5yZXBvfS9vcmcvYXBhY2hlL21hdmVuL21hdmVuLWFudC10YXNrcy8ke212bi5hbnQudGFzay52ZXJzaW9ufQorbXZuLmFudC50YXNrLmphcj1tYXZlbi1hbnQtdGFza3MtJHttdm4uYW50LnRhc2sudmVyc2lvbn0uamFyCmRpZmYgLS1naXQgYS9saWIvanMvdGVzdC9idWlsZC54bWwgYi9saWIvanMvdGVzdC9idWlsZC54bWwKaW5kZXggOWJlNzNjZi4uMDRjMTM2MCAxMDA3NTUKLS0tIGEvbGliL2pzL3Rlc3QvYnVpbGQueG1sCisrKyBiL2xpYi9qcy90ZXN0L2J1aWxkLnhtbApAQCAtMzEsMTcgKzMxLDIxIEBACiAgIDwhLS0gdGhlIHJvb3QgZGlyZWN0b3J5LCB3aGVyZSB5b3UgdW5wYWNrIHRocmlmdCBkaXN0aWJ1dGlvbiAoZS5nLiB0aHJpZnQtMC54LngudGFyLmd6KSAtLT4KICAgPHByb3BlcnR5IG5hbWU9InRocmlmdC5kaXIiIGxvY2F0aW9uPSIuLi8uLi8uLi8iIC8+CiAgIDxwcm9wZXJ0eSBuYW1lPSJ0aHJpZnQuamF2YS5kaXIiIGxvY2F0aW9uPSIke3RocmlmdC5kaXJ9L2xpYi9qYXZhIiAvPgorICA8cHJvcGVydHkgbmFtZT0iYnVpbGQudG9vbHMuZGlyIiBsb2NhdGlvbj0iJHt0aHJpZnQuamF2YS5kaXJ9L2J1aWxkL3Rvb2xzLyIvPgorICA8cHJvcGVydHkgZmlsZT0iJHtiYXNlZGlyfS9idWlsZC5wcm9wZXJ0aWVzIi8+CiAKICAgPCEtLSBJbmNsdWRlIHRoZSBiYXNlIGphdmEgcHJvcGVydGllcyBmaWxlIC0tPgotICA8cHJvcGVydHkgZmlsZT0iJHt0aHJpZnQuamF2YS5kaXJ9L2J1aWxkLnByb3BlcnRpZXMiIC8+CisgIDxwcm9wZXJ0eSBmaWxlPSIke3RocmlmdC5qYXZhLmRpcn0vZ3JhZGxlLnByb3BlcnRpZXMiIC8+CiAKICAgPHByb3BlcnR5IG5hbWU9InRocmlmdC5jb21waWxlciIgbG9jYXRpb249IiR7dGhyaWZ0LmRpcn0vY29tcGlsZXIvY3BwL3RocmlmdCIgLz4KIAogICA8cGF0aCBpZD0ibGlicy5jbGFzc3BhdGgiPgotICAgIDxmaWxlc2V0IGRpcj0iJHt0aHJpZnQuamF2YS5kaXJ9L2J1aWxkLyI+Ci0gICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciIgLz4KKyAgICA8ZmlsZXNldCBkaXI9IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC9saWJzIj4KKyAgICAgIDxpbmNsdWRlIG5hbWU9ImxpYnRocmlmdCouamFyIiAvPgorICAgICAgPGV4Y2x1ZGUgbmFtZT0ibGlidGhyaWZ0KmphdmFkb2MuamFyIiAvPgorICAgICAgPGV4Y2x1ZGUgbmFtZT0ibGlidGhyaWZ0KnNvdXJjZXMuamFyIiAvPgogICAgIDwvZmlsZXNldD4KLSAgICA8ZmlsZXNldCBkaXI9IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC9saWIiPgorICAgIDxmaWxlc2V0IGRpcj0iJHt0aHJpZnQuamF2YS5kaXJ9L2J1aWxkL2RlcHMiPgogICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiIC8+CiAgICAgPC9maWxlc2V0PgogICAgIDxmaWxlc2V0IGRpcj0iJHtidWlsZH0vbGliIj4KQEAgLTU5LDE1ICs2MywxNiBAQAogICAgICAgPGNvbmRpdGlvbj4KICAgICAgICAgPG5vdD4KICAgICAgICAgICA8cmVzb3VyY2Vjb3VudCBjb3VudD0iMiI+Ci0gICAgICAgICAgICA8ZmlsZXNldCBpZD0iZnMiIGRpcj0iJHt0aHJpZnQuamF2YS5kaXJ9L2J1aWxkIj4KKyAgICAgICAgICAgIDxmaWxlc2V0IGlkPSJmcyIgZGlyPSIke3RocmlmdC5qYXZhLmRpcn0vYnVpbGQvbGlicyI+CiAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9ImxpYnRocmlmdCouamFyIiAvPgogICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJsaWJ0aHJpZnQqamF2YWRvYy5qYXIiIC8+CisgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9ImxpYnRocmlmdCpzb3VyY2VzLmphciIgLz4KICAgICAgICAgICAgIDwvZmlsZXNldD4KICAgICAgICAgICA8L3Jlc291cmNlY291bnQ+CiAgICAgICAgIDwvbm90PgogICAgICAgPC9jb25kaXRpb24+CiAgICAgICBZb3UgbmVlZCBsaWJ0aHJpZnQqLmphciBhbmQgbGlidGhyaWZ0KnRlc3QuamFyIGxvY2F0ZWQgYXQKLSAgICAgICR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZAorICAgICAgJHt0aHJpZnQuamF2YS5kaXJ9L2J1aWxkL2xpYnMKICAgICAgIERpZCB5b3UgY29tcGlsZSBUaHJpZnQgSmF2YSBsaWJyYXJ5IGFuZCBpdHMgdGVzdCBzdWl0ZSBieSAiYW50IGNvbXBpbGUtdGVzdCI/CiAgICAgPC9mYWlsPgogICAgIDxmYWlsPgpAQCAtODQsNiArODksNyBAQAogCiAgIDx0YXJnZXQgbmFtZT0iaW5pdCIgZGVwZW5kcz0iZGVwZW5kZW5jaWVzIj4KICAgICA8dHN0YW1wIC8+CisgICAgPG1rZGlyIGRpcj0iJHtidWlsZC50b29scy5kaXJ9Ii8+CiAgICAgPG1rZGlyIGRpcj0iJHtidWlsZH0iLz4KICAgICA8bWtkaXIgZGlyPSIke2J1aWxkfS9qcy9saWIiLz4KICAgICA8bWtkaXIgZGlyPSIke2J1aWxkfS9saWIiLz4KQEAgLTkyLDIxICs5OCwxOSBAQAogICAgIDxta2RpciBkaXI9IiR7YnVpbGR9L3Rlc3QvbG9nIi8+CiAgIDwvdGFyZ2V0PgogCi0gIDx0YXJnZXQgbmFtZT0ianNsaWJzIiBkZXBlbmRzPSJpbml0LCBwcm94eSI+CisgIDx0YXJnZXQgbmFtZT0iZG93bmxvYWRfanNsaWJzIj4KICAgICA8Z2V0IHNyYz0iaHR0cDovL2NvZGUuanF1ZXJ5LmNvbS9qcXVlcnktMS4xMS4zLm1pbi5qcyIgZGVzdD0iJHtidWlsZH0vanMvbGliL2pxdWVyeS5qcyIgdXNldGltZXN0YW1wPSJ0cnVlIi8+Ci0gICAgPGdldCBzcmM9Imh0dHA6Ly9qcy10ZXN0LWRyaXZlci5nb29nbGVjb2RlLmNvbS9zdm4vdHJ1bmsvSnNUZXN0RHJpdmVyL2NvbnRyaWIvcXVuaXQvc3JjL2VxdWl2LmpzIiBkZXN0PSIke2J1aWxkfS9qcy9saWIvZXF1aXYuanMiIHVzZXRpbWVzdGFtcD0idHJ1ZSIvPgotICAgIDxnZXQgc3JjPSJodHRwOi8vanMtdGVzdC1kcml2ZXIuZ29vZ2xlY29kZS5jb20vc3ZuL3RydW5rL0pzVGVzdERyaXZlci9jb250cmliL3F1bml0L3NyYy9RVW5pdEFkYXB0ZXIuanMiIGRlc3Q9IiR7YnVpbGR9L2pzL2xpYi9RVW5pdEFkYXB0ZXIuanMiIHVzZXRpbWVzdGFtcD0idHJ1ZSIvPgorICAgIDxnZXQgc3JjPSJodHRwOi8vY29kZS5qcXVlcnkuY29tL3F1bml0L3F1bml0LTIuNi4yLmpzIiBkZXN0PSIke2J1aWxkfS9qcy9saWIvcXVuaXQuanMiIHVzZXRpbWVzdGFtcD0idHJ1ZSIvPgorICAgIDxnZXQgc3JjPSJodHRwOi8vY29kZS5qcXVlcnkuY29tL3F1bml0L3F1bml0LTIuNi4yLmNzcyIgZGVzdD0iJHtidWlsZH0vanMvbGliL3F1bml0LmNzcyIgdXNldGltZXN0YW1wPSJ0cnVlIi8+CisgIDwvdGFyZ2V0PgogCi0gICAgPGdldCBzcmM9Imh0dHA6Ly9jb2RlLmpxdWVyeS5jb20vcXVuaXQvcXVuaXQtMS4xOC4wLmpzIiBkZXN0PSIke2J1aWxkfS9qcy9saWIvcXVuaXQuanMiIHVzZXRpbWVzdGFtcD0idHJ1ZSIvPgotICAgIDxnZXQgc3JjPSJodHRwOi8vY29kZS5qcXVlcnkuY29tL3F1bml0L3F1bml0LTEuMTguMC5jc3MiIGRlc3Q9IiR7YnVpbGR9L2pzL2xpYi9xdW5pdC5jc3MiIHVzZXRpbWVzdGFtcD0idHJ1ZSIvPgotICAgIDwhLS0ganMtdGVzdC1kcml2ZXIgaGFzIGlzc3VlcyB3aXRoIHJlbGF0aXZlIHBhdGguLi5zbyB3ZSBuZWVkIGEgY29weSAtLT4KLSAgICA8Y29weSBmaWxlPSIuLi9zcmMvdGhyaWZ0LmpzIiB0b2Rpcj0iJHtidWlsZH0vanMiLz4KKyAgPHRhcmdldCBuYW1lPSJqc2xpYnMiIGRlcGVuZHM9ImluaXQsIHByb3h5LCBkb3dubG9hZF9qc2xpYnMiPgogICA8L3RhcmdldD4KIAogICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUiIGRlc2NyaXB0aW9uPSJjb21waWxlIHRoZSB0ZXN0IHN1aXRlIiBkZXBlbmRzPSJpbml0LCBnZW5lcmF0ZSwgcmVzb2x2ZSI+CiAgICAgPCEtLSAvL1RPRE8gZW5hYmxlIDxjb21waWxlcmFyZyB2YWx1ZT0iLVhsaW50Ii8+LS0+Ci0gICAgPGphdmFjIGluY2x1ZGVhbnRydW50aW1lPSJmYWxzZSIgc3JjZGlyPSIke2dlbmphdmF9IiBkZXN0ZGlyPSIke2J1aWxkfS90ZXN0IiBjbGFzc3BhdGhyZWY9ImxpYnMuY2xhc3NwYXRoIi8+Ci0gICAgPGphdmFjIGluY2x1ZGVhbnRydW50aW1lPSJmYWxzZSIgc3JjZGlyPSIke3NyY30iIGRlc3RkaXI9IiR7YnVpbGR9L3Rlc3QiIGNsYXNzcGF0aHJlZj0ibGlicy5jbGFzc3BhdGgiLz4KKyAgICA8amF2YWMgY29tcGlsZXI9Im1vZGVybiIgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIiBzcmNkaXI9IiR7Z2VuamF2YX0iIGRlc3RkaXI9IiR7YnVpbGR9L3Rlc3QiIGNsYXNzcGF0aHJlZj0ibGlicy5jbGFzc3BhdGgiLz4KKyAgICA8amF2YWMgY29tcGlsZXI9Im1vZGVybiIgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIiBzcmNkaXI9IiR7c3JjfSIgZGVzdGRpcj0iJHtidWlsZH0vdGVzdCIgY2xhc3NwYXRocmVmPSJsaWJzLmNsYXNzcGF0aCIvPgogICA8L3RhcmdldD4KIAogICA8dGFyZ2V0IG5hbWU9ImpzdGVzdCIgZGVzY3JpcHRpb249ImNyZWF0ZSB0aGUgdGVzdCBzdWl0ZSBqYXIgZmlsZSIgZGVwZW5kcz0iY29tcGlsZSI+CkBAIC0xNTksNDQgKzE2Myw2IEBACiAgICAgPC9wYXJhbGxlbD4KICAgPC90YXJnZXQ+CiAKLSAgPHRhcmdldCBuYW1lPSJqc3Rlc3Rkcml2ZXItc2VydmVyIiBkZXNjcmlwdGlvbj0ic3RhcnQgdGhlIGpzLXRlc3QtZHJpdmVyIHNlcnZlciIgZGVwZW5kcz0iaW5pdCwgcmVzb2x2ZSI+Ci0gICAgPGVjaG8+U3RhcnRpbmcganMtdGVzdC1kcml2ZXIgU2VydmVyLi4uPC9lY2hvPgotICAgIDxqYXZhIGphcj0iJHtidWlsZH0vbGliL2pzdGVzdGRyaXZlci0xLjMuNS5qYXIiIGRpcj0iLiIgZm9yaz0idHJ1ZSIKLSAgICAgICAgICAgIGZhaWxvbmVycm9yPSJ0cnVlIiBvdXRwdXQ9IiR7YnVpbGR9L2xvZy9qc3Rlc3Rkcml2ZXItc2VydmVyLmxvZyI+Ci0gICAgICA8YXJnIGxpbmU9Ii0tcG9ydCA5ODc2Ii8+Ci0gICAgPC9qYXZhPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9ImpzdGVzdGRyaXZlciIgZGVzY3JpcHRpb249ImRvIHVuaXQgdGVzdHMgd2l0aCBqcy10ZXN0LWRyaXZlciIgZGVwZW5kcz0iaW5pdCwganN0ZXN0LCBqc2xpYnMiPgotICAgIDxwYXJhbGxlbD4KLSAgICAgIDxqYXZhIGNsYXNzbmFtZT0idGVzdC5IdHRwZCIgZm9yaz0idHJ1ZSIgdGltZW91dD0iMTAwMDAiCi0gICAgICAgIGNsYXNzcGF0aHJlZj0idGVzdC5jbGFzc3BhdGgiIGZhaWxvbmVycm9yPSJmYWxzZSIgb3V0cHV0PSIke2J1aWxkfS9sb2cvdW5pdHRlc3QubG9nIj4KLSAgICAgICAgPGFyZyB2YWx1ZT0iLi4vIiAvPgotICAgICAgPC9qYXZhPgotICAgICAgPHNlcXVlbnRpYWw+Ci0gICAgICAgIDxzbGVlcCBzZWNvbmRzPSIyIi8+Ci0gICAgICAgIDxlY2hvPlJ1bm5pbmcgVW5pdCBUZXN0cyB3aXRoIGpzLXRlc3QtZHJpdmVyPC9lY2hvPgotICAgICAgICAgIDxqYXZhIGphcj0iJHtidWlsZH0vbGliL2pzdGVzdGRyaXZlci0xLjMuNS5qYXIiIGRpcj0iLiIgZm9yaz0idHJ1ZSIKLSAgICAgICAgICAgIGZhaWxvbmVycm9yPSJ0cnVlIiBvdXRwdXQ9IiR7YnVpbGR9L2xvZy9qc3Rlc3Rkcml2ZXIubG9nIj4KLSAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii0tY29uZmlnIiAvPgotICAgICAgICAgICAgPGFyZyB2YWx1ZT0ianNUZXN0RHJpdmVyLmNvbmYiIC8+Ci0KLSAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii0tcmVzZXQiIC8+Ci0gICAgICAgICAgICA8YXJnIHZhbHVlPSItLXZlcmJvc2UiIC8+Ci0KLSAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii0tcnVubmVyTW9kZSIgLz4KLSAgICAgICAgICAgIDxhcmcgdmFsdWU9IkRFQlVHIiAvPgotCi0gICAgICAgICAgICA8YXJnIHZhbHVlPSItLXRlc3RzIiAvPgotICAgICAgICAgICAgPGFyZyB2YWx1ZT0iYWxsIiAvPgotCi0gICAgICAgICAgICA8YXJnIHZhbHVlPSItLXRlc3RPdXRwdXQiIC8+Ci0gICAgICAgICAgICA8YXJnIHZhbHVlPSIke2J1aWxkfS90ZXN0L2xvZy8iIC8+Ci0gICAgICAgIDwvamF2YT4KLSAgICAgIDwvc2VxdWVudGlhbD4KLSAgICA8L3BhcmFsbGVsPgotICA8L3RhcmdldD4KLQogICA8dGFyZ2V0IG5hbWU9ImdlbmVyYXRlIj4KICAgICA8ZXhlYyBleGVjdXRhYmxlPSIke3RocmlmdC5jb21waWxlcn0iIGZhaWxvbmVycm9yPSJ0cnVlIj4KICAgICAgIDxhcmcgbGluZT0iLS1nZW4gamF2YSAke3RocmlmdC5kaXJ9L3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQiIC8+CkBAIC0yMDQsNiArMTcwLDkgQEAKICAgICA8ZXhlYyBleGVjdXRhYmxlPSIke3RocmlmdC5jb21waWxlcn0iIGZhaWxvbmVycm9yPSJ0cnVlIj4KICAgICAgIDxhcmcgbGluZT0iLS1nZW4ganM6anF1ZXJ5ICR7dGhyaWZ0LmRpcn0vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCIgLz4KICAgICA8L2V4ZWM+CisgICAgPGV4ZWMgZXhlY3V0YWJsZT0iJHt0aHJpZnQuY29tcGlsZXJ9IiBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICA8YXJnIGxpbmU9Ii0tZ2VuIGpzOmpxdWVyeSAke3RocmlmdC5kaXJ9L3Rlc3QvRG91YmxlQ29uc3RhbnRzVGVzdC50aHJpZnQiIC8+CisgICAgPC9leGVjPgogICA8L3RhcmdldD4KIAogICA8dGFyZ2V0IG5hbWU9InRlc3QiIGRlc2NyaXB0aW9uPSJydW4gdGVzdCBzdWl0ZSAobGludCwgdW5pdHRlc3QpIiBkZXBlbmRzPSJsaW50LCB1bml0dGVzdCIvPgpAQCAtMjUwLDE2ICsyMTksMjMgQEAKICAgICA8ZGVsZXRlIGRpcj0iJHtnZW5qc30iIC8+CiAgIDwvdGFyZ2V0PgogCi0gIDx0YXJnZXQgbmFtZT0icmVzb2x2ZSIgdW5sZXNzPSJtdm4uZmluaXNoZWQiPgorICA8dGFyZ2V0IG5hbWU9Im12bi5hbnQudGFza3MuZG93bmxvYWQiIGRlcGVuZHM9ImluaXQsbXZuLmFudC50YXNrcy5jaGVjayIgdW5sZXNzPSJtdm4uYW50LnRhc2tzLmZvdW5kIj4KKyAgICA8Z2V0IHNyYz0iJHttdm4uYW50LnRhc2sudXJsfS8ke212bi5hbnQudGFzay5qYXJ9IiBkZXN0PSIke2J1aWxkLnRvb2xzLmRpcn0vJHttdm4uYW50LnRhc2suamFyfSIgdXNldGltZXN0YW1wPSJ0cnVlIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibXZuLmFudC50YXNrcy5jaGVjayI+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ibXZuLmFudC50YXNrcy5mb3VuZCI+CisgICAgICA8dHlwZWZvdW5kIHVyaT0iYW50bGliOm9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuYW50IiBuYW1lPSJhcnRpZmFjdCIvPgorICAgIDwvY29uZGl0aW9uPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InJlc29sdmUiIGRlcGVuZHM9Im12bi5hbnQudGFza3MuZG93bmxvYWQiIHVubGVzcz0ibXZuLmZpbmlzaGVkIj4KICAgICA8dHlwZWRlZiB1cmk9ImFudGxpYjpvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LmFudCIgY2xhc3NwYXRoPSIke3RocmlmdC5qYXZhLmRpcn0vYnVpbGQvdG9vbHMvJHttdm4uYW50LnRhc2suamFyfSIvPgogCiAgICAgPGFydGlmYWN0OmRlcGVuZGVuY2llcyBmaWxlc2V0SWQ9ImpzLnRlc3QuZGVwZW5kZW5jeS5qYXJzIj4KICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMiIGFydGlmYWN0SWQ9Imh0dHBjbGllbnQiIHZlcnNpb249IjQuMC4xIi8+CiAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJjb20uZ29vZ2xlY29kZS5qc2xpbnQ0amF2YSIgYXJ0aWZhY3RJZD0ianNsaW50NGphdmEtYW50IiB2ZXJzaW9uPSIxLjQuNiIvPgogICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iZXUubWVkc2VhLm1pbWV1dGlsIiBhcnRpZmFjdElkPSJtaW1lLXV0aWwiIHZlcnNpb249IjIuMS4zIi8+Ci0KLSAgICAgIDwhLS0gZ2V0IGpzdGVzdGRyaXZlci5qYXIgdmlhIG1hdmVuLS0+Ci0gICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJjb20uZ29vZ2xlY29kZS5qc3RkLW1hdmVuLXBsdWdpbiIgYXJ0aWZhY3RJZD0ianN0ZC1tYXZlbi1wbHVnaW4iIHZlcnNpb249IjEuMy41LjEiLz4KICAgICA8L2FydGlmYWN0OmRlcGVuZGVuY2llcz4KIAogICAgIDwhLS0gQ29weSB0aGUgZGVwZW5kZW5jaWVzIHRvIHRoZSBidWlsZC9saWIgZGlyIC0tPgpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3QvZGVlcC1jb25zdHJ1Y3Rvci50ZXN0LmpzIGIvbGliL2pzL3Rlc3QvZGVlcC1jb25zdHJ1Y3Rvci50ZXN0LmpzCmluZGV4IDlhMTk4MDkuLjgyZDNhMWUgMTAwNjQ0Ci0tLSBhL2xpYi9qcy90ZXN0L2RlZXAtY29uc3RydWN0b3IudGVzdC5qcworKysgYi9saWIvanMvdGVzdC9kZWVwLWNvbnN0cnVjdG9yLnRlc3QuanMKQEAgLTEsMTggKzEsMTggQEAKIGZ1bmN0aW9uIHNlcmlhbGl6ZShkYXRhKSB7Ci0gIHZhciB0cmFuc3BvcnQgPSBuZXcgVGhyaWZ0LlRyYW5zcG9ydCgiL3NlcnZpY2UiKTsKLSAgdmFyIHByb3RvY29sICA9IG5ldyBUaHJpZnQuUHJvdG9jb2wodHJhbnNwb3J0KTsKLSAgcHJvdG9jb2wud3JpdGVNZXNzYWdlQmVnaW4oIiIsIDAsIDApOworICBjb25zdCB0cmFuc3BvcnQgPSBuZXcgVGhyaWZ0LlRyYW5zcG9ydCgnL3NlcnZpY2UnKTsKKyAgY29uc3QgcHJvdG9jb2wgPSBuZXcgVGhyaWZ0LlByb3RvY29sKHRyYW5zcG9ydCk7CisgIHByb3RvY29sLndyaXRlTWVzc2FnZUJlZ2luKCcnLCAwLCAwKTsKICAgZGF0YS53cml0ZShwcm90b2NvbCk7CiAgIHByb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpOwogICByZXR1cm4gdHJhbnNwb3J0LnNlbmRfYnVmOwogfQogCiBmdW5jdGlvbiBkZXNlcmlhbGl6ZShzZXJpYWxpemVkLCB0eXBlKSB7Ci0gIHZhciB0cmFuc3BvcnQgPSBuZXcgVGhyaWZ0LlRyYW5zcG9ydCgiL3NlcnZpY2UiKTsKKyAgY29uc3QgdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UcmFuc3BvcnQoJy9zZXJ2aWNlJyk7CiAgIHRyYW5zcG9ydC5zZXRSZWN2QnVmZmVyKHNlcmlhbGl6ZWQpOwotICB2YXIgcHJvdG9jb2wgID0gbmV3IFRocmlmdC5Qcm90b2NvbCh0cmFuc3BvcnQpOworICBjb25zdCBwcm90b2NvbCA9IG5ldyBUaHJpZnQuUHJvdG9jb2wodHJhbnNwb3J0KTsKICAgcHJvdG9jb2wucmVhZE1lc3NhZ2VCZWdpbigpOwotICB2YXIgZGF0YSA9IG5ldyB0eXBlKCk7CisgIGNvbnN0IGRhdGEgPSBuZXcgdHlwZSgpOwogICBkYXRhLnJlYWQocHJvdG9jb2wpOwogICBwcm90b2NvbC5yZWFkTWVzc2FnZUVuZCgpOwogICByZXR1cm4gZGF0YTsKQEAgLTI3LDEyICsyNywxMiBAQAogCiAgICAgc3RydWN0X2xpc3RfZmllbGQ6IFsKICAgICAgIG5ldyBTaW1wbGUoe3ZhbHVlOiAnYid9KSwKLSAgICAgIG5ldyBTaW1wbGUoe3ZhbHVlOiAnYyd9KSwKKyAgICAgIG5ldyBTaW1wbGUoe3ZhbHVlOiAnYyd9KQogICAgIF0sCiAKICAgICBzdHJ1Y3Rfc2V0X2ZpZWxkOiBbCiAgICAgICBuZXcgU2ltcGxlKHt2YWx1ZTogJ2QnfSksCi0gICAgICBuZXcgU2ltcGxlKHt2YWx1ZTogJ2UnfSksCisgICAgICBuZXcgU2ltcGxlKHt2YWx1ZTogJ2UnfSkKICAgICBdLAogCiAgICAgc3RydWN0X21hcF9maWVsZDogewpAQCAtNjEsNyArNjEsMTMgQEAKICAgICAgICAgICBEQjogbmV3IFNpbXBsZSh7dmFsdWU6ICdrJ30pCiAgICAgICAgIH0KICAgICAgIF0KLSAgICB9CisgICAgfSwKKworICAgIGxpc3Rfb2ZfbGlzdF9maWVsZDogWworICAgICAgIFsnb25lJywgJ3R3byddLAorICAgICAgIFsndGhyZWUnLCAnZm91ciddLAorICAgICAgIFsnZml2ZScsICdzaXgnXQorICAgIF0KICAgfQogICApOwogfQpAQCAtNzUsMTIgKzgxLDEyIEBACiAKICAgICBzdHJ1Y3RfbGlzdF9maWVsZDogWwogICAgICAge3ZhbHVlOiAnYid9LAotICAgICAge3ZhbHVlOiAnYyd9LAorICAgICAge3ZhbHVlOiAnYyd9CiAgICAgXSwKIAogICAgIHN0cnVjdF9zZXRfZmllbGQ6IFsKICAgICAgIHt2YWx1ZTogJ2QnfSwKLSAgICAgIHt2YWx1ZTogJ2UnfSwKKyAgICAgIHt2YWx1ZTogJ2UnfQogICAgIF0sCiAKICAgICBzdHJ1Y3RfbWFwX2ZpZWxkOiB7CkBAIC0xMDgsNyArMTE0LDEzIEBACiAgICAgICAgICAgREI6IHt2YWx1ZTogJ2snfQogICAgICAgICB9CiAgICAgICBdCi0gICAgfQorICAgIH0sCisKKyAgICBsaXN0X29mX2xpc3RfZmllbGQ6IFsKKyAgICAgIFsnb25lJywgJ3R3byddLAorICAgICAgWyd0aHJlZScsICdmb3VyJ10sCisgICAgICBbJ2ZpdmUnLCAnc2l4J10KKyAgIF0KICAgfTsKIH0KIApAQCAtMTI1LDM4ICsxMzcsNDQgQEAKICAgICBhc3NlcnQuZXF1YWwob2JqLnN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZFswXVswXS5DWzFdLnZhbHVlLCAnaScpOwogICAgIGFzc2VydC5lcXVhbChvYmouc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkMi5EWzBdLkRBLnZhbHVlLCAnaicpOwogICAgIGFzc2VydC5lcXVhbChvYmouc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkMi5EWzFdLkRCLnZhbHVlLCAnaycpOworICAgIGFzc2VydC5lcXVhbChvYmoubGlzdF9vZl9saXN0X2ZpZWxkWzBdWzBdLCAnb25lJyk7CisgICAgYXNzZXJ0LmVxdWFsKG9iai5saXN0X29mX2xpc3RfZmllbGRbMF1bMV0sICd0d28nKTsKKyAgICBhc3NlcnQuZXF1YWwob2JqLmxpc3Rfb2ZfbGlzdF9maWVsZFsxXVswXSwgJ3RocmVlJyk7CisgICAgYXNzZXJ0LmVxdWFsKG9iai5saXN0X29mX2xpc3RfZmllbGRbMV1bMV0sICdmb3VyJyk7CisgICAgYXNzZXJ0LmVxdWFsKG9iai5saXN0X29mX2xpc3RfZmllbGRbMl1bMF0sICdmaXZlJyk7CisgICAgYXNzZXJ0LmVxdWFsKG9iai5saXN0X29mX2xpc3RfZmllbGRbMl1bMV0sICdzaXgnKTsKIH0KIAotdmFyIGNhc2VzID0geworY29uc3QgY2FzZXMgPSB7CiAKLSAgIlNlcmlhbGl6ZS9kZXNlcmlhbGl6ZSBzaW1wbGUgc3RydWN0IHNob3VsZCByZXR1cm4gZXF1YWwgb2JqZWN0IjogZnVuY3Rpb24oYXNzZXJ0KXsKLSAgICB2YXIgdE9iaiA9IG5ldyBTaW1wbGUoe3ZhbHVlOiAnYSd9KTsKLSAgICB2YXIgcmVjZWl2ZWQgPSBkZXNlcmlhbGl6ZShzZXJpYWxpemUodE9iaiksIFNpbXBsZSk7CisgICdTZXJpYWxpemUvZGVzZXJpYWxpemUgc2ltcGxlIHN0cnVjdCBzaG91bGQgcmV0dXJuIGVxdWFsIG9iamVjdCc6IGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGNvbnN0IHRPYmogPSBuZXcgU2ltcGxlKHt2YWx1ZTogJ2EnfSk7CisgICAgY29uc3QgcmVjZWl2ZWQgPSBkZXNlcmlhbGl6ZShzZXJpYWxpemUodE9iaiksIFNpbXBsZSk7CiAgICAgYXNzZXJ0Lm9rKHRPYmogIT09IHJlY2VpdmVkKTsKICAgICBhc3NlcnQuZGVlcEVxdWFsKHJlY2VpdmVkLCB0T2JqKTsKICAgfSwKIAogCi0gICJTZXJpYWxpemUvZGVzZXJpYWxpemUgc2hvdWxkIHJldHVybiBlcXVhbCBvYmplY3QiOiBmdW5jdGlvbihhc3NlcnQpewotICAgIHZhciB0T2JqID0gY3JlYXRlVGhyaWZ0T2JqKCk7Ci0gICAgdmFyIHJlY2VpdmVkID0gZGVzZXJpYWxpemUoc2VyaWFsaXplKHRPYmopLCBDb21wbGV4KTsKKyAgJ1NlcmlhbGl6ZS9kZXNlcmlhbGl6ZSBzaG91bGQgcmV0dXJuIGVxdWFsIG9iamVjdCc6IGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGNvbnN0IHRPYmogPSBjcmVhdGVUaHJpZnRPYmooKTsKKyAgICBjb25zdCByZWNlaXZlZCA9IGRlc2VyaWFsaXplKHNlcmlhbGl6ZSh0T2JqKSwgQ29tcGxleCk7CiAgICAgYXNzZXJ0Lm9rKHRPYmogIT09IHJlY2VpdmVkKTsKICAgICBhc3NlcnQuZGVlcEVxdWFsKHJlY2VpdmVkLCB0T2JqKTsKICAgfSwKIAotICAiTmVzdGVkIHN0cnVjdHMgYW5kIGNvbnRhaW5lcnMgaW5pdGlhbGl6ZWQgZnJvbSBwbGFpbiBqcyBvYmplY3RzIHNob3VsZCBzZXJpYWxpemUgc2FtZSBhcyBpZiBpbml0aWFsaXplZCBmcm9tIHRocmlmdCBvYmplY3RzIjogZnVuY3Rpb24oYXNzZXJ0KSB7Ci0gICAgdmFyIHRPYmoxID0gY3JlYXRlVGhyaWZ0T2JqKCk7Ci0gICAgdmFyIHRPYmoyID0gbmV3IENvbXBsZXgoY3JlYXRlSnNPYmooKSk7CisgICdOZXN0ZWQgc3RydWN0cyBhbmQgY29udGFpbmVycyBpbml0aWFsaXplZCBmcm9tIHBsYWluIGpzIG9iamVjdHMgc2hvdWxkIHNlcmlhbGl6ZSBzYW1lIGFzIGlmIGluaXRpYWxpemVkIGZyb20gdGhyaWZ0IG9iamVjdHMnOiBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBjb25zdCB0T2JqMSA9IGNyZWF0ZVRocmlmdE9iaigpOworICAgIGNvbnN0IHRPYmoyID0gbmV3IENvbXBsZXgoY3JlYXRlSnNPYmooKSk7CiAgICAgYXNzZXJ0VmFsdWVzKHRPYmoyLCBhc3NlcnQpOwogICAgIGFzc2VydC5lcXVhbChzZXJpYWxpemUodE9iajIpLCBzZXJpYWxpemUodE9iajEpKTsKICAgfSwKIAotICAiTW9kaWZpY2F0aW9ucyB0byBhcmdzIG9iamVjdCBzaG91bGQgbm90IGFmZmVjdCBjb25zdHJ1Y3RlZCBUaHJpZnQgb2JqZWN0IjogZnVuY3Rpb24gKGFzc2VydCkgeworICAnTW9kaWZpY2F0aW9ucyB0byBhcmdzIG9iamVjdCBzaG91bGQgbm90IGFmZmVjdCBjb25zdHJ1Y3RlZCBUaHJpZnQgb2JqZWN0JzogZnVuY3Rpb24oYXNzZXJ0KSB7CiAKLSAgICB2YXIgYXJncyA9IGNyZWF0ZUpzT2JqKCk7CisgICAgY29uc3QgYXJncyA9IGNyZWF0ZUpzT2JqKCk7CiAgICAgYXNzZXJ0VmFsdWVzKGFyZ3MsIGFzc2VydCk7CiAKLSAgICB2YXIgdE9iaiA9IG5ldyBDb21wbGV4KGFyZ3MpOworICAgIGNvbnN0IHRPYmogPSBuZXcgQ29tcGxleChhcmdzKTsKICAgICBhc3NlcnRWYWx1ZXModE9iaiwgYXNzZXJ0KTsKIAogICAgIGFyZ3Muc3RydWN0X2ZpZWxkLnZhbHVlID0gJ1paWic7CkBAIC0xNzQsOCArMTkyLDggQEAKICAgICBhc3NlcnRWYWx1ZXModE9iaiwgYXNzZXJ0KTsKICAgfSwKIAotICAibnVsbHMgYXJlIG9rIjogZnVuY3Rpb24oYXNzZXJ0KSB7Ci0gICAgdmFyIHRPYmogPSBuZXcgQ29tcGxleCh7CisgICdudWxscyBhcmUgb2snOiBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBjb25zdCB0T2JqID0gbmV3IENvbXBsZXgoewogICAgICAgc3RydWN0X2ZpZWxkOiBudWxsLAogICAgICAgc3RydWN0X2xpc3RfZmllbGQ6IG51bGwsCiAgICAgICBzdHJ1Y3Rfc2V0X2ZpZWxkOiBudWxsLApAQCAtMTgzLDcgKzIwMSw3IEBACiAgICAgICBzdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQ6IG51bGwsCiAgICAgICBzdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQyOiBudWxsCiAgICAgfSk7Ci0gICAgdmFyIHJlY2VpdmVkID0gZGVzZXJpYWxpemUoc2VyaWFsaXplKHRPYmopLCBDb21wbGV4KTsKKyAgICBjb25zdCByZWNlaXZlZCA9IGRlc2VyaWFsaXplKHNlcmlhbGl6ZSh0T2JqKSwgQ29tcGxleCk7CiAgICAgYXNzZXJ0Lm9rKHRPYmogIT09IHJlY2VpdmVkKTsKICAgICBhc3NlcnQuZGVlcEVxdWFsKHRPYmosIHJlY2VpdmVkKTsKICAgfQpAQCAtMTkxLDUgKzIwOSw1IEBACiB9OwogCiBPYmplY3Qua2V5cyhjYXNlcykuZm9yRWFjaChmdW5jdGlvbihjYXNlTmFtZSkgewotICB0ZXN0KGNhc2VOYW1lLCBjYXNlc1tjYXNlTmFtZV0pOworICBRVW5pdC50ZXN0KGNhc2VOYW1lLCBjYXNlc1tjYXNlTmFtZV0pOwogfSk7CmRpZmYgLS1naXQgYS9saWIvanMvdGVzdC9qc1Rlc3REcml2ZXIuY29uZiBiL2xpYi9qcy90ZXN0L2pzVGVzdERyaXZlci5jb25mCmluZGV4IGI5NzAyY2QuLmViMTU4OGMgMTAwNzU1Ci0tLSBhL2xpYi9qcy90ZXN0L2pzVGVzdERyaXZlci5jb25mCisrKyBiL2xpYi9qcy90ZXN0L2pzVGVzdERyaXZlci5jb25mCkBAIC03LDYgKzcsNyBAQAogIyBkZXBlbmRlbmNpZXMKICAgLSBidWlsZC9qcy9saWIvanF1ZXJ5LmpzCiAgIC0gYnVpbGQvanMvdGhyaWZ0LmpzCisgIC0gZ2VuLWpzL0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLmpzCiAgIC0gZ2VuLWpzL1RocmlmdFRlc3RfdHlwZXMuanMKICAgLSBnZW4tanMvVGhyaWZ0VGVzdC5qcwogIyB0aGUgdGVzdCBzdWl0ZQpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3QvcGhhbnRvbS1jbGllbnQuanMgYi9saWIvanMvdGVzdC9waGFudG9tLWNsaWVudC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTE3ZTcxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzL3Rlc3QvcGhhbnRvbS1jbGllbnQuanMKQEAgLTAsMCArMSwzODIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyAvKiBqc2hpbnQgLVcxMDAgKi8KKworKGZ1bmN0aW9uKCkgeworICAndXNlIHN0cmljdCc7CisKKyAgLy8gUnVkaW1lbnRhcnkgdGVzdCBoZWxwZXIgZnVuY3Rpb25zCisgIC8vIFRPRE86IFJldHVybiBlcnJvciBjb2RlIGJhc2VkIG9uIGtpbmQgb2YgZXJyb3JzIHJhdGhlciB0aGFuIHRocm93CisgIHZhciBvayA9IGZ1bmN0aW9uKHQsIG1zZykgeworICAgIGlmICghdCkgeworICAgICAgY29uc29sZS5sb2coJyoqKiBGQUlMRUQgKioqJyk7CisgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTsKKyAgICB9CisgIH07CisgIHZhciBlcXVhbCA9IGZ1bmN0aW9uKGEsIGIpIHsKKyAgICBpZiAoYSAhPT0gYikgeworICAgICAgY29uc29sZS5sb2coJyoqKiBGQUlMRUQgKioqJyk7CisgICAgICB0aHJvdyBuZXcgRXJyb3IoKTsKKyAgICB9CisgIH07CisgIHZhciB0ZXN0ID0gZnVuY3Rpb24obmFtZSwgZikgeworICAgIGNvbnNvbGUubG9nKCdURVNUIDogJyArIG5hbWUpOworICAgIGYoKTsKKyAgICBjb25zb2xlLmxvZygnT0tcbicpOworICB9OworCisgIHZhciBwYXJzZUFyZ3MgPSBmdW5jdGlvbihhcmdzKSB7CisgICAgdmFyIHNraXBzID0gWworICAgICAgJy0tdHJhbnNwb3J0PWh0dHAnLAorICAgICAgJy0tcHJvdG9jb2w9anNvbicKKyAgICBdOworICAgIHZhciBvcHRzID0geworICAgICAgcG9ydDogJzkwOTAnCisgICAgICAvLyBwcm90b2NvbDogJ2pzb24nLAorICAgIH07CisgICAgdmFyIGtleXMgPSB7fTsKKyAgICBmb3IgKHZhciBrZXkgaW4gb3B0cykgeworICAgICAga2V5c1snLS0nICsga2V5ICsgJz0nXSA9IGtleTsKKyAgICB9CisgICAgZm9yICh2YXIgaSBpbiBhcmdzKSB7CisgICAgICB2YXIgYXJnID0gYXJnc1tpXTsKKyAgICAgIGlmIChza2lwcy5pbmRleE9mKGFyZykgIT0gLTEpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICB2YXIgaGl0ID0gZmFsc2U7CisgICAgICBmb3IgKHZhciBrIGluIGtleXMpIHsKKyAgICAgICAgaWYgKGFyZy5zbGljZSgwLCBrLmxlbmd0aCkgPT09IGspIHsKKyAgICAgICAgICBvcHRzW2tleXNba11dID0gYXJnLnNsaWNlKGsubGVuZ3RoKTsKKyAgICAgICAgICBoaXQgPSB0cnVlOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoIWhpdCkgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gYXJndW1lbnQ6ICcgKyBhcmcpOworICAgICAgfQorICAgIH0KKyAgICBvcHRzLnBvcnQgPSBwYXJzZUludChvcHRzLnBvcnQsIDEwKTsKKyAgICBpZiAoIW9wdHMucG9ydCB8fCBvcHRzLnBvcnQgPCAxIHx8IG9wdHMucG9ydCA+IDY1NTM1KSB7CisgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcG9ydCBudW1iZXInKTsKKyAgICB9CisgICAgcmV0dXJuIG9wdHM7CisgIH07CisKKyAgdmFyIGV4ZWN1dGUgPSBmdW5jdGlvbigpIHsKKyAgICBjb25zb2xlLmxvZygnIyMjIEFwYWNoZSBUaHJpZnQgSmF2YXNjcmlwdCBzdGFuZGFsb25lIHRlc3QgY2xpZW50Jyk7CisgICAgY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScpOworCisgICAgcGhhbnRvbS5wYWdlLmluamVjdEpzKCdzcmMvdGhyaWZ0LmpzJyk7CisgICAgcGhhbnRvbS5wYWdlLmluamVjdEpzKCd0ZXN0L2dlbi1qcy9UaHJpZnRUZXN0X3R5cGVzLmpzJyk7CisgICAgcGhhbnRvbS5wYWdlLmluamVjdEpzKCd0ZXN0L2dlbi1qcy9UaHJpZnRUZXN0LmpzJyk7CisKKyAgICB2YXIgc3lzdGVtID0gcmVxdWlyZSgnc3lzdGVtJyk7CisgICAgdmFyIG9wdHMgPSBwYXJzZUFyZ3Moc3lzdGVtLmFyZ3Muc2xpY2UoMSkpOworICAgIHZhciBwb3J0ID0gb3B0cy5wb3J0OworICAgIHZhciB0cmFuc3BvcnQgPSBuZXcgVGhyaWZ0LlRyYW5zcG9ydCgnaHR0cDovL2xvY2FsaG9zdDonICsgcG9ydCArICcvc2VydmljZScpOworICAgIHZhciBwcm90b2NvbCA9IG5ldyBUaHJpZnQuUHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICB2YXIgY2xpZW50ID0gbmV3IFRocmlmdFRlc3QuVGhyaWZ0VGVzdENsaWVudChwcm90b2NvbCk7CisKKworICAgIC8vIFRPRE86IFJlbW92ZSBkdXBsaWNhdGUgY29kZSB3aXRoIHRlc3QuanMuCisgICAgLy8gYWxsIExhbmd1YWdlcyBpbiBVVEYtOAorICAgIHZhciBzdHJpbmdUZXN0ID0gIkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvbsOpcywg2KfZhNi52LHYqNmK2KksINmF2LXYsdmJLCBBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXrJmXJiYXljYW4sINCR0LDRiNKh0L7RgNGCLCBCb2FyaXNjaCwgxb1lbWFpdMSXxaFrYSwg0JHQtdC70LDRgNGD0YHQutCw0Y8sINCR0LXQu9Cw0YDRg9GB0LrQsNGPICjRgtCw0YDQsNGI0LrQtdCy0ZbRhtCwKSwg0JHRitC70LPQsNGA0YHQutC4LCBCYW1hbmFua2FuLCDgpqzgpr7gpoLgprLgpr4sIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsw6AsIE3DrG5nLWTElcykbmctbmfhubPMhCwg0J3QvtGF0YfQuNC50L0sIENlYnVhbm8sIOGPo+GOs+GOqSwgxIxlc2t5LCDQodC70L7QstGjzIHQvdGM0YHQutGKIC8g4rCU4rCO4rCR4rCC4rCh4rCQ4rCg4rCU4rCN4rCfLCDQp9OR0LLQsNGI0LvQsCwgQ3ltcmFlZywgRGFuc2ssIFphemFraSwg3oveqN6I3qzegN6o3oTept6Q3rAsIM6VzrvOu863zr3Ouc66zqwsIEVtaWxpw6BuIGUgcnVtYWduw7JsLCBFbmdsaXNoLCBFc3BlcmFudG8sIEVzcGHDsW9sLCBFZXN0aSwgRXVza2FyYSwg2YHYp9ix2LPbjCwgU3VvbWksIFbDtXJvLCBGw7hyb3lza3QsIEZyYW7Dp2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwg6LSb6KqeLCBHw6BpZGhsaWcsIEdhbGVnbywgQXZhw7FlJ+G6vSwg4KqX4KuB4Kqc4Kqw4Kq+4Kqk4KuALCBHYWVsZywg16LXkdeo15nXqiwg4KS54KS/4KSo4KWN4KSm4KWALCBGaWppIEhpbmRpLCBIcnZhdHNraSwgS3JlecOybCBheWlzeWVuLCBNYWd5YXIsINWA1aHVtdWl1oDVpdW2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwgSWxva2FubywgSWRvLCDDjXNsZW5za2EsIEl0YWxpYW5vLCDml6XmnKzoqp4sIExvamJhbiwgQmFzYSBKYXdhLCDhg6Xhg5Dhg6Dhg5fhg6Phg5rhg5gsIEtvbmdvLCBLYWxhYWxsaXN1dCwg4LKV4LKo4LON4LKo4LKhLCDtlZzqta3slrQsINCa0YrQsNGA0LDRh9Cw0Lkt0JzQsNC70LrRitCw0YAsIFJpcG9hcmlzY2gsIEt1cmTDriwg0JrQvtC80LgsIEtlcm5ld2VrLCDQmtGL0YDQs9GL0LfRh9CwLCBMYXRpbmEsIExhZGlubywgTMOrdHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ8OhbGEsIOC6peC6suC6pywgTGlldHV2acWzLCBMYXR2aWXFoXUsIEJhc2EgQmFueXVtYXNhbiwgTWFsYWdhc3ksINCc0LDQutC10LTQvtC90YHQutC4LCDgtK7gtLLgtK/gtL7gtLPgtIIsIOCkruCksOCkvuCkoOClgCwgQmFoYXNhIE1lbGF5dSwg2YXYp9iy2ZDYsdmI2YbbjCwgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIOCkqOClh+CkquCkvuCksiDgpK3gpL7gpLfgpL4sIE5lZGVybGFuZHMsIOKAqk5vcnNrIChueW5vcnNrKeKArCwg4oCqTm9yc2sgKGJva23DpWwp4oCsLCBOb3Vvcm1hbmQsIERpbsOpIGJpemFhZCwgT2NjaXRhbiwg0JjRgNC+0L3QsNGDLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBOb3JmdWsgLyBQaXRrZXJuLCBQb2xza2ksINm+2YbYrNin2KjbjCwg2b7amtiq2YgsIFBvcnR1Z3XDqnMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbcOibsSDLCDQoNGD0YHRgdC60LjQuSwg0KHQsNGF0LAg0YLRi9C70LAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTw6FtZWdpZWxsYSwgU2ltcGxlIEVuZ2xpc2gsIFNsb3ZlbsSNaW5hLCBTbG92ZW7FocSNaW5hLCDQodGA0L/RgdC60LggLyBTcnBza2ksIFNlZWx0ZXJzaywgU3ZlbnNrYSwgS2lzd2FoaWxpLCDgrqTgrq7grr/grrTgr40sIOCwpOCxhuCwsuCxgeCwl+CxgSwg0KLQvtK30LjQutOjLCDguYTguJfguKIsIFTDvHJrbWVuw6dlLCBUYWdhbG9nLCBUw7xya8OnZSwg0KLQsNGC0LDRgNGH0LAvVGF0YXLDp2EsINCj0LrRgNCw0ZfQvdGB0YzQutCwLCDYp9ix2K/ZiCwgVGnhur9uZyBWaeG7h3QsIFZvbGFww7xrLCBXYWxvbiwgV2luYXJheSwg5ZC06K+tLCBpc2lYaG9zYSwg15nXmda015PXmdepLCBZb3LDuWLDoSwgWmXDqnV3cywg5Lit5paHLCBCw6JuLWzDom0tZ8O6LCDnsrXoqp4iOworCisgICAgZnVuY3Rpb24gY2hlY2tSZWN1cnNpdmVseShtYXAxLCBtYXAyKSB7CisgICAgICBpZiAodHlwZW9mIG1hcDEgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIG1hcDIgIT09ICdmdW5jdGlvbicpIHsKKyAgICAgICAgaWYgKCFtYXAxIHx8IHR5cGVvZiBtYXAxICE9PSAnb2JqZWN0JykgeworICAgICAgICAgIGVxdWFsKG1hcDEsIG1hcDIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZvciAodmFyIGtleSBpbiBtYXAxKSB7CisgICAgICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5KG1hcDFba2V5XSwgbWFwMltrZXldKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICB0ZXN0KCdWb2lkJywgZnVuY3Rpb24oKSB7CisgICAgICBlcXVhbChjbGllbnQudGVzdFZvaWQoKSwgdW5kZWZpbmVkKTsKKyAgICB9KTsKKyAgICB0ZXN0KCdCaW5hcnkgKFN0cmluZyknLCBmdW5jdGlvbigpIHsKKyAgICAgIHZhciBiaW5hcnkgPSAnJzsKKyAgICAgIGZvciAodmFyIHYgPSAyNTU7IHYgPj0gMDsgLS12KSB7CisgICAgICAgIGJpbmFyeSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHYpOworICAgICAgfQorICAgICAgZXF1YWwoY2xpZW50LnRlc3RCaW5hcnkoYmluYXJ5KSwgYmluYXJ5KTsKKyAgICB9KTsKKyAgICB0ZXN0KCdCaW5hcnkgKFVpbnQ4QXJyYXkpJywgZnVuY3Rpb24oKSB7CisgICAgICB2YXIgYmluYXJ5ID0gJyc7CisgICAgICBmb3IgKHZhciB2ID0gMjU1OyB2ID49IDA7IC0tdikgeworICAgICAgICBiaW5hcnkgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSh2KTsKKyAgICAgIH0KKyAgICAgIHZhciBhcnIgPSBuZXcgVWludDhBcnJheShiaW5hcnkubGVuZ3RoKTsKKyAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYmluYXJ5Lmxlbmd0aDsgKytpKSB7CisgICAgICAgIGFycltpXSA9IGJpbmFyeVtpXS5jaGFyQ29kZUF0KCk7CisgICAgICB9CisgICAgICBlcXVhbChjbGllbnQudGVzdEJpbmFyeShhcnIpLCBiaW5hcnkpOworICAgIH0pOworICAgIHRlc3QoJ1N0cmluZycsIGZ1bmN0aW9uKCkgeworICAgICAgZXF1YWwoY2xpZW50LnRlc3RTdHJpbmcoJycpLCAnJyk7CisgICAgICBlcXVhbChjbGllbnQudGVzdFN0cmluZyhzdHJpbmdUZXN0KSwgc3RyaW5nVGVzdCk7CisKKyAgICAgIHZhciBzcGVjaWFsQ2hhcmFjdGVycyA9ICdxdW90ZTogXCIgYmFja3NsYXNoOicgKworICAgICAgICAnIGZvcndhcmRzbGFzaC1lc2NhcGVkOiBcLyAnICsKKyAgICAgICAgICAnIGJhY2tzcGFjZTogXGIgZm9ybWZlZWQ6IFxmIG5ld2xpbmU6IFxuIHJldHVybjogXHIgdGFiOiAnICsKKyAgICAgICAgICAgICcgbm93LWFsbC1vZi10aGVtLXRvZ2V0aGVyOiAiXFxcL1xiXG5cclx0JyArCisgICAgICAgICAgICAgICcgbm93LWEtYnVuY2gtb2YtanVuazogIUAjJCUmKCkoJiUkI3t9e308Pjw+PCc7CisgICAgICAgICAgICAgIGVxdWFsKGNsaWVudC50ZXN0U3RyaW5nKHNwZWNpYWxDaGFyYWN0ZXJzKSwgc3BlY2lhbENoYXJhY3RlcnMpOworICAgIH0pOworICAgIHRlc3QoJ0RvdWJsZScsIGZ1bmN0aW9uKCkgeworICAgICAgZXF1YWwoY2xpZW50LnRlc3REb3VibGUoMCksIDApOworICAgICAgZXF1YWwoY2xpZW50LnRlc3REb3VibGUoLTEpLCAtMSk7CisgICAgICBlcXVhbChjbGllbnQudGVzdERvdWJsZSgzLjE0KSwgMy4xNCk7CisgICAgICBlcXVhbChjbGllbnQudGVzdERvdWJsZShNYXRoLnBvdygyLCA2MCkpLCBNYXRoLnBvdygyLCA2MCkpOworICAgIH0pOworICAgIHRlc3QoJ0Jvb2wnLCBmdW5jdGlvbigpIHsKKyAgICAgIGVxdWFsKGNsaWVudC50ZXN0Qm9vbCh0cnVlKSwgdHJ1ZSk7CisgICAgICBlcXVhbChjbGllbnQudGVzdEJvb2woZmFsc2UpLCBmYWxzZSk7CisgICAgfSk7CisgICAgdGVzdCgnSTgnLCBmdW5jdGlvbigpIHsKKyAgICAgIGVxdWFsKGNsaWVudC50ZXN0Qnl0ZSgwKSwgMCk7CisgICAgICBlcXVhbChjbGllbnQudGVzdEJ5dGUoMHgwMSksIDB4MDEpOworICAgIH0pOworICAgIHRlc3QoJ0kzMicsIGZ1bmN0aW9uKCkgeworICAgICAgZXF1YWwoY2xpZW50LnRlc3RJMzIoMCksIDApOworICAgICAgZXF1YWwoY2xpZW50LnRlc3RJMzIoTWF0aC5wb3coMiwgMzApKSwgTWF0aC5wb3coMiwgMzApKTsKKyAgICAgIGVxdWFsKGNsaWVudC50ZXN0STMyKC1NYXRoLnBvdygyLCAzMCkpLCAtTWF0aC5wb3coMiwgMzApKTsKKyAgICB9KTsKKyAgICB0ZXN0KCdJNjQnLCBmdW5jdGlvbigpIHsKKyAgICAgIGVxdWFsKGNsaWVudC50ZXN0STY0KDApLCAwKTsKKyAgICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjAgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKKyAgICAgIGVxdWFsKGNsaWVudC50ZXN0STY0KE1hdGgucG93KDIsIDUyKSksIE1hdGgucG93KDIsIDUyKSk7CisgICAgICBlcXVhbChjbGllbnQudGVzdEk2NCgtTWF0aC5wb3coMiwgNTIpKSwgLU1hdGgucG93KDIsIDUyKSk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdTdHJ1Y3QnLCBmdW5jdGlvbigpIHsKKyAgICAgIHZhciBzdHJ1Y3RUZXN0SW5wdXQgPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QoKTsKKyAgICAgIHN0cnVjdFRlc3RJbnB1dC5zdHJpbmdfdGhpbmcgPSAnd29ya2VkJzsKKyAgICAgIHN0cnVjdFRlc3RJbnB1dC5ieXRlX3RoaW5nID0gMHgwMTsKKyAgICAgIHN0cnVjdFRlc3RJbnB1dC5pMzJfdGhpbmcgPSBNYXRoLnBvdygyLCAzMCk7CisgICAgICAvL1RoaXMgaXMgdXN1YWxseSAyXjYwIGJ1dCBKUyBjYW5ub3QgcmVwcmVzZW50IGFueXRoaW5nIG92ZXIgMl41MiBhY2N1cmF0ZWx5CisgICAgICBzdHJ1Y3RUZXN0SW5wdXQuaTY0X3RoaW5nID0gTWF0aC5wb3coMiwgNTIpOworCisgICAgICB2YXIgc3RydWN0VGVzdE91dHB1dCA9IGNsaWVudC50ZXN0U3RydWN0KHN0cnVjdFRlc3RJbnB1dCk7CisKKyAgICAgIGVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuc3RyaW5nX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuc3RyaW5nX3RoaW5nKTsKKyAgICAgIGVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuYnl0ZV90aGluZywgc3RydWN0VGVzdElucHV0LmJ5dGVfdGhpbmcpOworICAgICAgZXF1YWwoc3RydWN0VGVzdE91dHB1dC5pMzJfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5pMzJfdGhpbmcpOworICAgICAgZXF1YWwoc3RydWN0VGVzdE91dHB1dC5pNjRfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5pNjRfdGhpbmcpOworCisgICAgICBlcXVhbChKU09OLnN0cmluZ2lmeShzdHJ1Y3RUZXN0T3V0cHV0KSwgSlNPTi5zdHJpbmdpZnkoc3RydWN0VGVzdElucHV0KSk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdOZXN0JywgZnVuY3Rpb24oKSB7CisgICAgICB2YXIgeHRyVGVzdElucHV0ID0gbmV3IFRocmlmdFRlc3QuWHRydWN0KCk7CisgICAgICB4dHJUZXN0SW5wdXQuc3RyaW5nX3RoaW5nID0gJ3dvcmtlZCc7CisgICAgICB4dHJUZXN0SW5wdXQuYnl0ZV90aGluZyA9IDB4MDE7CisgICAgICB4dHJUZXN0SW5wdXQuaTMyX3RoaW5nID0gTWF0aC5wb3coMiwgMzApOworICAgICAgLy9UaGlzIGlzIHVzdWFsbHkgMl42MCBidXQgSlMgY2Fubm90IHJlcHJlc2VudCBhbnl0aGluZyBvdmVyIDJeNTIgYWNjdXJhdGVseQorICAgICAgeHRyVGVzdElucHV0Lmk2NF90aGluZyA9IE1hdGgucG93KDIsIDUyKTsKKworICAgICAgdmFyIG5lc3RUZXN0SW5wdXQgPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QyKCk7CisgICAgICBuZXN0VGVzdElucHV0LmJ5dGVfdGhpbmcgPSAweDAyOworICAgICAgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcgPSB4dHJUZXN0SW5wdXQ7CisgICAgICBuZXN0VGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsIDE1KTsKKworICAgICAgdmFyIG5lc3RUZXN0T3V0cHV0ID0gY2xpZW50LnRlc3ROZXN0KG5lc3RUZXN0SW5wdXQpOworCisgICAgICBlcXVhbChuZXN0VGVzdE91dHB1dC5ieXRlX3RoaW5nLCBuZXN0VGVzdElucHV0LmJ5dGVfdGhpbmcpOworICAgICAgZXF1YWwobmVzdFRlc3RPdXRwdXQuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nKTsKKyAgICAgIGVxdWFsKG5lc3RUZXN0T3V0cHV0LnN0cnVjdF90aGluZy5ieXRlX3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5ieXRlX3RoaW5nKTsKKyAgICAgIGVxdWFsKG5lc3RUZXN0T3V0cHV0LnN0cnVjdF90aGluZy5pMzJfdGhpbmcsIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nLmkzMl90aGluZyk7CisgICAgICBlcXVhbChuZXN0VGVzdE91dHB1dC5zdHJ1Y3RfdGhpbmcuaTY0X3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5pNjRfdGhpbmcpOworICAgICAgZXF1YWwobmVzdFRlc3RPdXRwdXQuaTMyX3RoaW5nLCBuZXN0VGVzdElucHV0LmkzMl90aGluZyk7CisKKyAgICAgIGVxdWFsKEpTT04uc3RyaW5naWZ5KG5lc3RUZXN0T3V0cHV0KSwgSlNPTi5zdHJpbmdpZnkobmVzdFRlc3RJbnB1dCkpOworICAgIH0pOworCisgICAgdGVzdCgnTWFwJywgZnVuY3Rpb24oKSB7CisgICAgICB2YXIgbWFwVGVzdElucHV0ID0gezc6IDc3LCA4OiA4OCwgOTogOTl9OworCisgICAgICB2YXIgbWFwVGVzdE91dHB1dCA9IGNsaWVudC50ZXN0TWFwKG1hcFRlc3RJbnB1dCk7CisKKyAgICAgIGZvciAodmFyIGtleSBpbiBtYXBUZXN0T3V0cHV0KSB7CisgICAgICAgIGVxdWFsKG1hcFRlc3RPdXRwdXRba2V5XSwgbWFwVGVzdElucHV0W2tleV0pOworICAgICAgfQorICAgIH0pOworCisgICAgdGVzdCgnU3RyaW5nTWFwJywgZnVuY3Rpb24oKSB7CisgICAgICB2YXIgbWFwVGVzdElucHV0ID0geworICAgICAgICAnYSc6ICcxMjMnLCAnYSBiJzogJ3dpdGggc3BhY2VzICcsICdzYW1lJzogJ3NhbWUnLCAnMCc6ICdudW1lcmljIGtleScsCisgICAgICAgICdsb25nVmFsdWUnOiBzdHJpbmdUZXN0LCBzdHJpbmdUZXN0OiAnbG9uZyBrZXknCisgICAgICB9OworCisgICAgICB2YXIgbWFwVGVzdE91dHB1dCA9IGNsaWVudC50ZXN0U3RyaW5nTWFwKG1hcFRlc3RJbnB1dCk7CisKKyAgICAgIGZvciAodmFyIGtleSBpbiBtYXBUZXN0T3V0cHV0KSB7CisgICAgICAgIGVxdWFsKG1hcFRlc3RPdXRwdXRba2V5XSwgbWFwVGVzdElucHV0W2tleV0pOworICAgICAgfQorICAgIH0pOworCisgICAgdGVzdCgnU2V0JywgZnVuY3Rpb24oKSB7CisgICAgICB2YXIgc2V0VGVzdElucHV0ID0gWzEsIDIsIDNdOworICAgICAgb2soY2xpZW50LnRlc3RTZXQoc2V0VGVzdElucHV0KSwgc2V0VGVzdElucHV0KTsKKyAgICB9KTsKKworICAgIHRlc3QoJ0xpc3QnLCBmdW5jdGlvbigpIHsKKyAgICAgIHZhciBsaXN0VGVzdElucHV0ID0gWzEsIDIsIDNdOworICAgICAgb2soY2xpZW50LnRlc3RMaXN0KGxpc3RUZXN0SW5wdXQpLCBsaXN0VGVzdElucHV0KTsKKyAgICB9KTsKKworICAgIHRlc3QoJ0VudW0nLCBmdW5jdGlvbigpIHsKKyAgICAgIGVxdWFsKGNsaWVudC50ZXN0RW51bShUaHJpZnRUZXN0Lk51bWJlcnouT05FKSwgVGhyaWZ0VGVzdC5OdW1iZXJ6Lk9ORSk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdUeXBlRGVmJywgZnVuY3Rpb24oKSB7CisgICAgICBlcXVhbChjbGllbnQudGVzdFR5cGVkZWYoNjkpLCA2OSk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdTa2lwJywgZnVuY3Rpb24oKSB7CisgICAgICB2YXIgc3RydWN0VGVzdElucHV0ID0gbmV3IFRocmlmdFRlc3QuWHRydWN0KCk7CisgICAgICB2YXIgbW9kaWZpZWRDbGllbnQgPSBuZXcgVGhyaWZ0VGVzdC5UaHJpZnRUZXN0Q2xpZW50KHByb3RvY29sKTsKKworICAgICAgbW9kaWZpZWRDbGllbnQucmVjdl90ZXN0U3RydWN0ID0gZnVuY3Rpb24oKSB7CisgICAgICAgIHZhciBpbnB1dCA9IG1vZGlmaWVkQ2xpZW50LmlucHV0OworICAgICAgICB2YXIgeHRydWN0MyA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdDMoKTsKKworICAgICAgICBpbnB1dC5yZWFkTWVzc2FnZUJlZ2luKCk7CisgICAgICAgIGlucHV0LnJlYWRTdHJ1Y3RCZWdpbigpOworCisgICAgICAgIC8vIHJlYWQgWHRydWN0IGRhdGEgd2l0aCBYdHJ1Y3QzCisgICAgICAgIGlucHV0LnJlYWRGaWVsZEJlZ2luKCk7CisgICAgICAgIHh0cnVjdDMucmVhZChpbnB1dCk7CisgICAgICAgIGlucHV0LnJlYWRGaWVsZEVuZCgpOworICAgICAgICAvLyByZWFkIFRocmlmdC5UeXBlLlNUT1AgbWVzc2FnZQorICAgICAgICBpbnB1dC5yZWFkRmllbGRCZWdpbigpOworICAgICAgICBpbnB1dC5yZWFkRmllbGRFbmQoKTsKKworICAgICAgICBpbnB1dC5yZWFkU3RydWN0RW5kKCk7CisgICAgICAgIGlucHV0LnJlYWRNZXNzYWdlRW5kKCk7CisKKyAgICAgICAgcmV0dXJuIHh0cnVjdDM7CisgICAgICB9OworCisgICAgICBzdHJ1Y3RUZXN0SW5wdXQuc3RyaW5nX3RoaW5nID0gJ3dvcmtlZCc7CisgICAgICBzdHJ1Y3RUZXN0SW5wdXQuYnl0ZV90aGluZyA9IDB4MDE7CisgICAgICBzdHJ1Y3RUZXN0SW5wdXQuaTMyX3RoaW5nID0gTWF0aC5wb3coMiwgMzApOworICAgICAgc3RydWN0VGVzdElucHV0Lmk2NF90aGluZyA9IE1hdGgucG93KDIsIDUyKTsKKworICAgICAgdmFyIHN0cnVjdFRlc3RPdXRwdXQgPSBtb2RpZmllZENsaWVudC50ZXN0U3RydWN0KHN0cnVjdFRlc3RJbnB1dCk7CisKKyAgICAgIGVxdWFsKHN0cnVjdFRlc3RPdXRwdXQgaW5zdGFuY2VvZiBUaHJpZnRUZXN0Llh0cnVjdDMsIHRydWUpOworICAgICAgZXF1YWwoc3RydWN0VGVzdE91dHB1dC5zdHJpbmdfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5zdHJpbmdfdGhpbmcpOworICAgICAgZXF1YWwoc3RydWN0VGVzdE91dHB1dC5jaGFuZ2VkLCBudWxsKTsKKyAgICAgIGVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuaTMyX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuaTMyX3RoaW5nKTsKKyAgICAgIGVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuaTY0X3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuaTY0X3RoaW5nKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ01hcE1hcCcsIGZ1bmN0aW9uKCkgeworICAgICAgdmFyIG1hcE1hcFRlc3RFeHBlY3RlZFJlc3VsdCA9IHsKKyAgICAgICAgJzQnOiB7JzEnOiAxLCAnMic6IDIsICczJzogMywgJzQnOiA0fSwKKyAgICAgICAgJy00JzogeyctNCc6IC00LCAnLTMnOiAtMywgJy0yJzogLTIsICctMSc6IC0xfQorICAgICAgfTsKKworICAgICAgdmFyIG1hcE1hcFRlc3RPdXRwdXQgPSBjbGllbnQudGVzdE1hcE1hcCgxKTsKKworCisgICAgICBmb3IgKHZhciBrZXkgaW4gbWFwTWFwVGVzdE91dHB1dCkgeworICAgICAgICBmb3IgKHZhciBrZXkyIGluIG1hcE1hcFRlc3RPdXRwdXRba2V5XSkgeworICAgICAgICAgIGVxdWFsKG1hcE1hcFRlc3RPdXRwdXRba2V5XVtrZXkyXSwgbWFwTWFwVGVzdEV4cGVjdGVkUmVzdWx0W2tleV1ba2V5Ml0pOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGNoZWNrUmVjdXJzaXZlbHkobWFwTWFwVGVzdE91dHB1dCwgbWFwTWFwVGVzdEV4cGVjdGVkUmVzdWx0KTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1hjZXB0aW9uJywgZnVuY3Rpb24oKSB7CisgICAgICB0cnkgeworICAgICAgICBjbGllbnQudGVzdEV4Y2VwdGlvbignWGNlcHRpb24nKTsKKyAgICAgICAgb2soZmFsc2UpOworICAgICAgfSBjYXRjaCAoZSkgeworICAgICAgICBlcXVhbChlLmVycm9yQ29kZSwgMTAwMSk7CisgICAgICAgIGVxdWFsKGUubWVzc2FnZSwgJ1hjZXB0aW9uJyk7CisgICAgICB9CisgICAgfSk7CisKKyAgICB0ZXN0KCdubyBFeGNlcHRpb24nLCBmdW5jdGlvbigpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCdubyBFeGNlcHRpb24nKTsKKyAgICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICAgb2soZmFsc2UpOworICAgICAgfQorICAgIH0pOworCisgICAgdGVzdCgnVEV4Y2VwdGlvbicsIGZ1bmN0aW9uKCkgeworICAgICAgdHJ5IHsKKyAgICAgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oJ1RFeGNlcHRpb24nKTsKKyAgICAgICAgb2soZmFsc2UpOworICAgICAgfSBjYXRjaCAoZSkgeworICAgICAgICBvayhvayk7CisgICAgICB9CisgICAgfSk7CisKKyAgICB2YXIgY3JhenkgPSB7CisgICAgICAndXNlck1hcCc6IHsgJzUnOiA1LCAnOCc6IDggfSwKKyAgICAgICd4dHJ1Y3RzJzogW3sKKyAgICAgICAgJ3N0cmluZ190aGluZyc6ICdHb29kYnllNCcsCisgICAgICAgICdieXRlX3RoaW5nJzogNCwKKyAgICAgICAgJ2kzMl90aGluZyc6IDQsCisgICAgICAgICdpNjRfdGhpbmcnOiA0CisgICAgICB9LAorICAgICAgeworICAgICAgICAnc3RyaW5nX3RoaW5nJzogJ0hlbGxvMicsCisgICAgICAgICdieXRlX3RoaW5nJzogMiwKKyAgICAgICAgJ2kzMl90aGluZyc6IDIsCisgICAgICAgICdpNjRfdGhpbmcnOiAyCisgICAgICB9XQorICAgIH07CisgICAgdGVzdCgnSW5zYW5pdHknLCBmdW5jdGlvbigpIHsKKyAgICAgIHZhciBpbnNhbml0eSA9IHsKKyAgICAgICAgJzEnOiB7CisgICAgICAgICAgJzInOiBjcmF6eSwKKyAgICAgICAgICAnMyc6IGNyYXp5CisgICAgICAgIH0sCisgICAgICAgICcyJzogeyAnNic6IHsgJ3VzZXJNYXAnOiBudWxsLCAneHRydWN0cyc6IG51bGwgfSB9CisgICAgICB9OworICAgICAgdmFyIHJlcyA9IGNsaWVudC50ZXN0SW5zYW5pdHkobmV3IFRocmlmdFRlc3QuSW5zYW5pdHkoY3JhenkpKTsKKyAgICAgIG9rKHJlcywgSlNPTi5zdHJpbmdpZnkocmVzKSk7CisgICAgICBvayhpbnNhbml0eSwgSlNPTi5zdHJpbmdpZnkoaW5zYW5pdHkpKTsKKworICAgICAgY2hlY2tSZWN1cnNpdmVseShyZXMsIGluc2FuaXR5KTsKKyAgICB9KTsKKworICAgIGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKTsKKyAgICBjb25zb2xlLmxvZygnIyMjIEFsbCB0ZXN0cyBzdWNjZWVkZWQuJyk7CisgICAgcmV0dXJuIDA7CisgIH07CisKKyAgdHJ5IHsKKyAgICB2YXIgcmV0ID0gZXhlY3V0ZSgpOworICAgIHBoYW50b20uZXhpdChyZXQpOworICB9IGNhdGNoIChlcnIpIHsKKyAgICAvLyBDYXRjaCBhbGwgYW5kIGV4aXQgdG8gYXZvaWQgaGFuZy4KKyAgICBjb25zb2xlLmVycm9yKGVycik7CisgICAgcGhhbnRvbS5leGl0KDEpOworICB9Cit9KSgpOwpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3QvcGhhbnRvbWpzLXF1bml0LmpzIGIvbGliL2pzL3Rlc3QvcGhhbnRvbWpzLXF1bml0LmpzCmluZGV4IGE4NDBkYjYuLmMxZDdhNWIgMTAwNzU1Ci0tLSBhL2xpYi9qcy90ZXN0L3BoYW50b21qcy1xdW5pdC5qcworKysgYi9saWIvanMvdGVzdC9waGFudG9tanMtcXVuaXQuanMKQEAgLTI4LDE4ICsyOCwxOCBAQAogICAgICAgICBzdGFydCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpLAogICAgICAgICBjb25kaXRpb24gPSBmYWxzZSwKICAgICAgICAgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpIHsKLSAgICAgICAgICAgIGlmICggKG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gc3RhcnQgPCBtYXh0aW1lT3V0TWlsbGlzKSAmJiAhY29uZGl0aW9uICkgeworICAgICAgICAgICAgaWYgKChuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIHN0YXJ0IDwgbWF4dGltZU91dE1pbGxpcykgJiYgIWNvbmRpdGlvbikgewogICAgICAgICAgICAgICAgIC8vIElmIG5vdCB0aW1lLW91dCB5ZXQgYW5kIGNvbmRpdGlvbiBub3QgeWV0IGZ1bGZpbGxlZAotICAgICAgICAgICAgICAgIGNvbmRpdGlvbiA9ICh0eXBlb2YodGVzdEZ4KSA9PT0gInN0cmluZyIgPyBldmFsKHRlc3RGeCkgOiB0ZXN0RngoKSk7IC8vPCBkZWZlbnNpdmUgY29kZQorICAgICAgICAgICAgICAgIGNvbmRpdGlvbiA9ICh0eXBlb2YodGVzdEZ4KSA9PT0gJ3N0cmluZycgPyBldmFsKHRlc3RGeCkgOiB0ZXN0RngoKSk7IC8vPCBkZWZlbnNpdmUgY29kZQogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZighY29uZGl0aW9uKSB7CisgICAgICAgICAgICAgICAgaWYgKCFjb25kaXRpb24pIHsKICAgICAgICAgICAgICAgICAgICAgLy8gSWYgY29uZGl0aW9uIHN0aWxsIG5vdCBmdWxmaWxsZWQgKHRpbWVvdXQgYnV0IGNvbmRpdGlvbiBpcyAnZmFsc2UnKQogICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygiJ3dhaXRGb3IoKScgdGltZW91dCIpOwogICAgICAgICAgICAgICAgICAgICBwaGFudG9tLmV4aXQoMSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgLy8gQ29uZGl0aW9uIGZ1bGZpbGxlZCAodGltZW91dCBhbmQvb3IgY29uZGl0aW9uIGlzICd0cnVlJykKLSAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coIid3YWl0Rm9yKCknIGZpbmlzaGVkIGluICIgKyAobmV3IERhdGUoKS5nZXRUaW1lKCkgLSBzdGFydCkgKyAibXMuIik7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yob25SZWFkeSkgPT09ICJzdHJpbmciKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCInd2FpdEZvcigpJyBmaW5pc2hlZCBpbiAiICsgKG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gc3RhcnQpICsgJ21zLicpOworICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKG9uUmVhZHkpID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICAgZXZhbChvblJlYWR5KTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG9uUmVhZHkoKTsgLy88IERvIHdoYXQgaXQncyBzdXBwb3NlZCB0byBkbyBvbmNlIHRoZSBjb25kaXRpb24gaXMgZnVsZmlsbGVkCkBAIC02MywyMSArNjMsMjEgQEAKICAgICBjb25zb2xlLmxvZyhtc2cpOwogfTsKIAotcGFnZS5vcGVuKHN5c3RlbS5hcmdzWzFdLCBmdW5jdGlvbihzdGF0dXMpewotICAgIGlmIChzdGF0dXMgIT09ICJzdWNjZXNzIikgewotICAgICAgICBjb25zb2xlLmxvZygiVW5hYmxlIHRvIGFjY2VzcyBuZXR3b3JrIik7CitwYWdlLm9wZW4oc3lzdGVtLmFyZ3NbMV0sIGZ1bmN0aW9uKHN0YXR1cykgeworICAgIGlmIChzdGF0dXMgIT09ICdzdWNjZXNzJykgeworICAgICAgICBjb25zb2xlLmxvZygnVW5hYmxlIHRvIGFjY2VzcyBuZXR3b3JrJyk7CiAgICAgICAgIHBoYW50b20uZXhpdCgxKTsKICAgICB9IGVsc2UgewotICAgICAgICB3YWl0Rm9yKGZ1bmN0aW9uKCl7Ci0gICAgICAgICAgICByZXR1cm4gcGFnZS5ldmFsdWF0ZShmdW5jdGlvbigpeworICAgICAgICB3YWl0Rm9yKGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIHBhZ2UuZXZhbHVhdGUoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgdmFyIGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3F1bml0LXRlc3RyZXN1bHQnKTsKICAgICAgICAgICAgICAgICBpZiAoZWwgJiYgZWwuaW5uZXJUZXh0Lm1hdGNoKCdjb21wbGV0ZWQnKSkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0sIGZ1bmN0aW9uKCl7Ci0gICAgICAgICAgICB2YXIgZmFpbGVkTnVtID0gcGFnZS5ldmFsdWF0ZShmdW5jdGlvbigpeworICAgICAgICB9LCBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIHZhciBmYWlsZWROdW0gPSBwYWdlLmV2YWx1YXRlKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgIHZhciBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdxdW5pdC10ZXN0cmVzdWx0Jyk7CiAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZWwuaW5uZXJUZXh0KTsKICAgICAgICAgICAgICAgICB0cnkgewpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3Qvc2VydmVyX2h0dHAuanMgYi9saWIvanMvdGVzdC9zZXJ2ZXJfaHR0cC5qcwppbmRleCBlMTk1ZTgwLi44MzgwYzNhIDEwMDY0NAotLS0gYS9saWIvanMvdGVzdC9zZXJ2ZXJfaHR0cC5qcworKysgYi9saWIvanMvdGVzdC9zZXJ2ZXJfaHR0cC5qcwpAQCAtMTcsMzMgKzE3LDM5IEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vL1RoaXMgSFRUUCBzZXJ2ZXIgaXMgZGVzaWduZWQgdG8gc2VydmUgdGhlIHRlc3QuaHRtbCBicm93c2VyCi0vLyAgYmFzZWQgSmF2YVNjcmlwdCB0ZXN0IHBhZ2UgKHdoaWNoIG11c3QgYmUgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5KS4gCisvLyAgVGhpcyBIVFRQIHNlcnZlciBpcyBkZXNpZ25lZCB0byBzZXJ2ZSB0aGUgdGVzdC5odG1sIGJyb3dzZXIKKy8vICBiYXNlZCBKYXZhU2NyaXB0IHRlc3QgcGFnZSAod2hpY2ggbXVzdCBiZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkpLgogLy8gIFRoaXMgc2VydmVyIGFsc28gc3VwcGxpZXMgdGhlIFRocmlmdCBiYXNlZCB0ZXN0IHNlcnZpY2UsIHdoaWNoIGRlcGVuZHMKIC8vICBvbiB0aGUgc3RhbmRhcmQgVGhyaWZ0VGVzdC50aHJpZnQgSURMIHNlcnZpY2UgKHdoaWNoIG11c3QgYmUgY29tcGlsZWQKIC8vICBmb3IgTm9kZSBhbmQgYnJvd3NlciBiYXNlZCBKYXZhU2NyaXB0IGluIC4vZ2VuLW5vZGVqcyBhbmQgLi9nZW4tanMKLS8vICByZXNwZWN0aXZlbHkpLiAKKy8vICByZXNwZWN0aXZlbHkpLgorLy8KKy8vICBVc2luZyB0aGUgY29tbWFuZCBmbGFnIC0tZXM2LCB0aGlzIHNlcnZlciBjYW4gYmUgcnVuIHVzaW5nIG5vZGVqcyBjb2RlIGJ1aWx0CisvLyAgZm9yIHRoZSBlczYgZW52aXJvbm1lbnQgb3IgZm9yIHByZS1lczYgZW52aXJvbm1lbnQuCisvLwogCi12YXIgdGhyaWZ0ID0gcmVxdWlyZSgnLi4vLi4vbm9kZWpzL2xpYi90aHJpZnQnKTsKLXZhciBUaHJpZnRUZXN0U3ZjID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL1RocmlmdFRlc3QuanMnKTsKLXZhciBUaHJpZnRUZXN0SGFuZGxlciA9IHJlcXVpcmUoJy4vdGVzdF9oYW5kbGVyJykuVGhyaWZ0VGVzdEhhbmRsZXI7Citjb25zdCB0aHJpZnQgPSByZXF1aXJlKCcuLi8uLi9ub2RlanMvbGliL3RocmlmdCcpOworY29uc3QgZXM2TW9kZSA9IHByb2Nlc3MuYXJndi5pbmNsdWRlcygnLS1lczYnKTsKK2NvbnN0IGdlbkZvbGRlciA9IGVzNk1vZGUgPyAnZ2VuLW5vZGVqcy1lczYnIDogJ2dlbi1ub2RlanMnOworY29uc3QgVGhyaWZ0VGVzdFN2YyA9IHJlcXVpcmUoYC4vJHtnZW5Gb2xkZXJ9L1RocmlmdFRlc3QuanNgKTsKK2NvbnN0IFRocmlmdFRlc3RIYW5kbGVyID0gcmVxdWlyZSgnLi90ZXN0X2hhbmRsZXInKS5UaHJpZnRUZXN0SGFuZGxlcjsKIAotdmFyIFRocmlmdFRlc3RTdmNPcHQgPSB7Citjb25zdCBUaHJpZnRUZXN0U3ZjT3B0ID0gewogCXRyYW5zcG9ydDogdGhyaWZ0LlRCdWZmZXJlZFRyYW5zcG9ydCwKIAlwcm90b2NvbDogdGhyaWZ0LlRKU09OUHJvdG9jb2wsCiAJcHJvY2Vzc29yOiBUaHJpZnRUZXN0U3ZjLAogCWhhbmRsZXI6IFRocmlmdFRlc3RIYW5kbGVyCiB9OwogCi12YXIgVGhyaWZ0V2ViU2VydmVyT3B0aW9ucyA9IHsKLQlmaWxlczogIi4iLAorY29uc3QgVGhyaWZ0V2ViU2VydmVyT3B0aW9ucyA9IHsKKwlmaWxlczogX19kaXJuYW1lLAogCXNlcnZpY2VzOiB7Ci0JCSIvc2VydmljZSI6IFRocmlmdFRlc3RTdmNPcHQKKwkJJy9zZXJ2aWNlJzogVGhyaWZ0VGVzdFN2Y09wdAogCX0KIH07CiAKLXZhciBzZXJ2ZXIgPSB0aHJpZnQuY3JlYXRlV2ViU2VydmVyKFRocmlmdFdlYlNlcnZlck9wdGlvbnMpOwotdmFyIHBvcnQgPSA4MDg4OworY29uc3Qgc2VydmVyID0gdGhyaWZ0LmNyZWF0ZVdlYlNlcnZlcihUaHJpZnRXZWJTZXJ2ZXJPcHRpb25zKTsKK2NvbnN0IHBvcnQgPSBlczZNb2RlID8gODA4OCA6IDgwODk7CiBzZXJ2ZXIubGlzdGVuKHBvcnQpOwotY29uc29sZS5sb2coIlNlcnZpbmcgZmlsZXMgZnJvbTogIiArIF9fZGlybmFtZSk7Ci1jb25zb2xlLmxvZygiSHR0cC9UaHJpZnQgU2VydmVyIHJ1bm5pbmcgb24gcG9ydDogIiArIHBvcnQpOworY29uc29sZS5sb2coYFNlcnZpbmcgZmlsZXMgZnJvbTogJHtfX2Rpcm5hbWV9YCk7Citjb25zb2xlLmxvZyhgSHR0cC9UaHJpZnQgU2VydmVyIChFUzYgbW9kZSAke2VzNk1vZGV9KSBydW5uaW5nIG9uIHBvcnQ6ICR7cG9ydH1gKTsKZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3NlcnZlcl9odHRwcy5qcyBiL2xpYi9qcy90ZXN0L3NlcnZlcl9odHRwcy5qcwppbmRleCBhZjE3NDViLi4xYTE3MWRkIDEwMDY0NAotLS0gYS9saWIvanMvdGVzdC9zZXJ2ZXJfaHR0cHMuanMKKysrIGIvbGliL2pzL3Rlc3Qvc2VydmVyX2h0dHBzLmpzCkBAIC0xOCw3ICsxOCw3IEBACiAgKi8KIAogLy9UaGlzIEhUVFAgc2VydmVyIGlzIGRlc2lnbmVkIHRvIHNlcnZlciB0aGUgdGVzdC5odG1sIGJyb3dzZXIKLS8vICBiYXNlZCBKYXZhU2NyaXB0IHRlc3QgcGFnZSAod2hpY2ggbXVzdCBiZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkpLiAKKy8vICBiYXNlZCBKYXZhU2NyaXB0IHRlc3QgcGFnZSAod2hpY2ggbXVzdCBiZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkpLgogLy8gIFRoaXMgc2VydmVyIGFsc28gc3VwcGxpZXMgdGhlIFRocmlmdCBiYXNlZCB0ZXN0IHNlcnZpY2UsIHdoaWNoIGRlcGVuZHMKIC8vICBvbiB0aGUgc3RhbmRhcmQgVGhyaWZ0VGVzdC50aHJpZnQgSURMIHNlcnZpY2UgKHdoaWNoIG11c3QgYmUgY29tcGlsZWQKIC8vICBmb3IgTm9kZSBhbmQgYnJvd3NlciBiYXNlZCBKYXZhU2NyaXB0IGluIC4vZ2VuLW5vZGVqcyBhbmQgLi9nZW4tanMKQEAgLTI2LDMyICsyNiwzNCBAQAogLy8gIHN1cHBvcnQgbGlicmFyaWVzIGZvciB0ZXN0Lmh0bWwgKGpxdWVyeS5qcywgcXVuaXQuanMgYW5kIHF1bml0LmNzcwogLy8gIGluIC4vYnVpbGQvanMvbGliKS4KIAotdmFyIGZzID0gcmVxdWlyZSgiZnMiKTsKLXZhciB0aHJpZnQgPSByZXF1aXJlKCcuLi8uLi9ub2RlanMvbGliL3RocmlmdCcpOwotdmFyIFRocmlmdFRlc3RTdmMgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvVGhyaWZ0VGVzdC5qcycpOwotdmFyIFRocmlmdFRlc3RIYW5kbGVyID0gcmVxdWlyZSgnLi90ZXN0X2hhbmRsZXInKS5UaHJpZnRUZXN0SGFuZGxlcjsKK2NvbnN0IGZzID0gcmVxdWlyZSgnZnMnKTsKK2NvbnN0IHRocmlmdCA9IHJlcXVpcmUoJy4uLy4uL25vZGVqcy9saWIvdGhyaWZ0Jyk7Citjb25zdCBlczZNb2RlID0gcHJvY2Vzcy5hcmd2LmluY2x1ZGVzKCctLWVzNicpOworY29uc3QgZ2VuRm9sZGVyID0gZXM2TW9kZSA/ICdnZW4tbm9kZWpzLWVzNicgOiAnZ2VuLW5vZGVqcyc7Citjb25zdCBUaHJpZnRUZXN0U3ZjID0gcmVxdWlyZShgLi8ke2dlbkZvbGRlcn0vVGhyaWZ0VGVzdC5qc2ApOworY29uc3QgVGhyaWZ0VGVzdEhhbmRsZXIgPSByZXF1aXJlKCcuL3Rlc3RfaGFuZGxlcicpLlRocmlmdFRlc3RIYW5kbGVyOwogCiAvL1NldHVwIHRoZSBJL08gc3RhY2sgb3B0aW9ucyBmb3IgdGhlIFRocmlmdFRlc3Qgc2VydmljZQotdmFyIFRocmlmdFRlc3RTdmNPcHQgPSB7Citjb25zdCBUaHJpZnRUZXN0U3ZjT3B0ID0gewogICB0cmFuc3BvcnQ6IHRocmlmdC5UQnVmZmVyZWRUcmFuc3BvcnQsCiAgIHByb3RvY29sOiB0aHJpZnQuVEpTT05Qcm90b2NvbCwKICAgcHJvY2Vzc29yOiBUaHJpZnRUZXN0U3ZjLAogICBoYW5kbGVyOiBUaHJpZnRUZXN0SGFuZGxlcgogfTsKIAotdmFyIFRocmlmdFdlYlNlcnZlck9wdGlvbnMgPSB7Ci0gIGZpbGVzOiAiLiIsCitjb25zdCBUaHJpZnRXZWJTZXJ2ZXJPcHRpb25zID0geworICBmaWxlczogX19kaXJuYW1lLAogICB0bHM6IHsKLSAgICAga2V5OiBmcy5yZWFkRmlsZVN5bmMoIi4uLy4uLy4uL3Rlc3Qva2V5cy9zZXJ2ZXIua2V5IiksCi0gICAgIGNlcnQ6IGZzLnJlYWRGaWxlU3luYygiLi4vLi4vLi4vdGVzdC9rZXlzL3NlcnZlci5jcnQiKQotICB9LAkKKyAgICAga2V5OiBmcy5yZWFkRmlsZVN5bmMoJy4uLy4uLy4uL3Rlc3Qva2V5cy9zZXJ2ZXIua2V5JyksCisgICAgIGNlcnQ6IGZzLnJlYWRGaWxlU3luYygnLi4vLi4vLi4vdGVzdC9rZXlzL3NlcnZlci5jcnQnKQorICB9LAogICBzZXJ2aWNlczogewotICAgICIvc2VydmljZSI6IFRocmlmdFRlc3RTdmNPcHQKKyAgICAnL3NlcnZpY2UnOiBUaHJpZnRUZXN0U3ZjT3B0CiAgIH0KIH07CiAKLXZhciBzZXJ2ZXIgPSB0aHJpZnQuY3JlYXRlV2ViU2VydmVyKFRocmlmdFdlYlNlcnZlck9wdGlvbnMpOwotdmFyIHBvcnQgPSA4MDg5OworY29uc3Qgc2VydmVyID0gdGhyaWZ0LmNyZWF0ZVdlYlNlcnZlcihUaHJpZnRXZWJTZXJ2ZXJPcHRpb25zKTsKK2NvbnN0IHBvcnQgPSBlczZNb2RlID8gODA5MCA6IDgwOTE7CiBzZXJ2ZXIubGlzdGVuKHBvcnQpOwotY29uc29sZS5sb2coIlNlcnZpbmcgZmlsZXMgZnJvbTogIiArIF9fZGlybmFtZSk7Ci1jb25zb2xlLmxvZygiSHR0cC9UaHJpZnQgU2VydmVyIHJ1bm5pbmcgb24gcG9ydDogIiArIHBvcnQpOworY29uc29sZS5sb2coYFNlcnZpbmcgZmlsZXMgZnJvbTogJHtfX2Rpcm5hbWV9YCk7Citjb25zb2xlLmxvZyhgSHR0cC9UaHJpZnQgU2VydmVyIChFUzYgbW9kZSAke2VzNk1vZGV9KSBydW5uaW5nIG9uIHBvcnQ6ICR7cG9ydH1gKTsKZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3Rlc3QtYXN5bmMuanMgYi9saWIvanMvdGVzdC90ZXN0LWFzeW5jLmpzCmluZGV4IDMzNmUyYmMuLjhjNmIxM2UgMTAwNjQ0Ci0tLSBhL2xpYi9qcy90ZXN0L3Rlc3QtYXN5bmMuanMKKysrIGIvbGliL2pzL3Rlc3QvdGVzdC1hc3luYy5qcwpAQCAtMTcsOSArMTcsOSBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KICAvKiBqc2hpbnQgLVcxMDAgKi8KLSAKKwogLyoKLSAqIEZ1bGx5IEFzeW5jIEphdmFTY3JpcHQgdGVzdCBzdWl0ZSBmb3IgVGhyaWZ0VGVzdC50aHJpZnQuIAorICogRnVsbHkgQXN5bmMgSmF2YVNjcmlwdCB0ZXN0IHN1aXRlIGZvciBUaHJpZnRUZXN0LnRocmlmdC4KICAqIFRoZXNlIHRlc3RzIGFyZSBkZXNpZ25lZCB0byBleGVyY2lzZSB0aGUgV2ViU29ja2V0IHRyYW5zcG9ydAogICogKHdoaWNoIGlzIGV4Y2x1c2l2ZWx5IGFzeW5jKS4KICAqCkBAIC0zMCwzMTkgKzMwLDM0MSBAQAogCiAKIC8vIGFsbCBMYW5ndWFnZXMgaW4gVVRGLTgKLXZhciBzdHJpbmdUZXN0ID0gIkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvbsOpcywg2KfZhNi52LHYqNmK2KksINmF2LXYsdmJLCBBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXrJmXJiYXljYW4sINCR0LDRiNKh0L7RgNGCLCBCb2FyaXNjaCwgxb1lbWFpdMSXxaFrYSwg0JHQtdC70LDRgNGD0YHQutCw0Y8sINCR0LXQu9Cw0YDRg9GB0LrQsNGPICjRgtCw0YDQsNGI0LrQtdCy0ZbRhtCwKSwg0JHRitC70LPQsNGA0YHQutC4LCBCYW1hbmFua2FuLCDgpqzgpr7gpoLgprLgpr4sIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsw6AsIE3DrG5nLWTElcykbmctbmfhubPMhCwg0J3QvtGF0YfQuNC50L0sIENlYnVhbm8sIOGPo+GOs+GOqSwgxIxlc2t5LCDQodC70L7QstGjzIHQvdGM0YHQutGKIC8g4rCU4rCO4rCR4rCC4rCh4rCQ4rCg4rCU4rCN4rCfLCDQp9OR0LLQsNGI0LvQsCwgQ3ltcmFlZywgRGFuc2ssIFphemFraSwg3oveqN6I3qzegN6o3oTept6Q3rAsIM6VzrvOu863zr3Ouc66zqwsIEVtaWxpw6BuIGUgcnVtYWduw7JsLCBFbmdsaXNoLCBFc3BlcmFudG8sIEVzcGHDsW9sLCBFZXN0aSwgRXVza2FyYSwg2YHYp9ix2LPbjCwgU3VvbWksIFbDtXJvLCBGw7hyb3lza3QsIEZyYW7Dp2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwg6LSb6KqeLCBHw6BpZGhsaWcsIEdhbGVnbywgQXZhw7FlJ+G6vSwg4KqX4KuB4Kqc4Kqw4Kq+4Kqk4KuALCBHYWVsZywg16LXkdeo15nXqiwg4KS54KS/4KSo4KWN4KSm4KWALCBGaWppIEhpbmRpLCBIcnZhdHNraSwgS3JlecOybCBheWlzeWVuLCBNYWd5YXIsINWA1aHVtdWl1oDVpdW2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwgSWxva2FubywgSWRvLCDDjXNsZW5za2EsIEl0YWxpYW5vLCDml6XmnKzoqp4sIExvamJhbiwgQmFzYSBKYXdhLCDhg6Xhg5Dhg6Dhg5fhg6Phg5rhg5gsIEtvbmdvLCBLYWxhYWxsaXN1dCwg4LKV4LKo4LON4LKo4LKhLCDtlZzqta3slrQsINCa0YrQsNGA0LDRh9Cw0Lkt0JzQsNC70LrRitCw0YAsIFJpcG9hcmlzY2gsIEt1cmTDriwg0JrQvtC80LgsIEtlcm5ld2VrLCDQmtGL0YDQs9GL0LfRh9CwLCBMYXRpbmEsIExhZGlubywgTMOrdHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ8OhbGEsIOC6peC6suC6pywgTGlldHV2acWzLCBMYXR2aWXFoXUsIEJhc2EgQmFueXVtYXNhbiwgTWFsYWdhc3ksINCc0LDQutC10LTQvtC90YHQutC4LCDgtK7gtLLgtK/gtL7gtLPgtIIsIOCkruCksOCkvuCkoOClgCwgQmFoYXNhIE1lbGF5dSwg2YXYp9iy2ZDYsdmI2YbbjCwgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIOCkqOClh+CkquCkvuCksiDgpK3gpL7gpLfgpL4sIE5lZGVybGFuZHMsIOKAqk5vcnNrIChueW5vcnNrKeKArCwg4oCqTm9yc2sgKGJva23DpWwp4oCsLCBOb3Vvcm1hbmQsIERpbsOpIGJpemFhZCwgT2NjaXRhbiwg0JjRgNC+0L3QsNGDLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBOb3JmdWsgLyBQaXRrZXJuLCBQb2xza2ksINm+2YbYrNin2KjbjCwg2b7amtiq2YgsIFBvcnR1Z3XDqnMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbcOibsSDLCDQoNGD0YHRgdC60LjQuSwg0KHQsNGF0LAg0YLRi9C70LAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTw6FtZWdpZWxsYSwgU2ltcGxlIEVuZ2xpc2gsIFNsb3ZlbsSNaW5hLCBTbG92ZW7FocSNaW5hLCDQodGA0L/RgdC60LggLyBTcnBza2ksIFNlZWx0ZXJzaywgU3ZlbnNrYSwgS2lzd2FoaWxpLCDgrqTgrq7grr/grrTgr40sIOCwpOCxhuCwsuCxgeCwl+CxgSwg0KLQvtK30LjQutOjLCDguYTguJfguKIsIFTDvHJrbWVuw6dlLCBUYWdhbG9nLCBUw7xya8OnZSwg0KLQsNGC0LDRgNGH0LAvVGF0YXLDp2EsINCj0LrRgNCw0ZfQvdGB0YzQutCwLCDYp9ix2K/ZiCwgVGnhur9uZyBWaeG7h3QsIFZvbGFww7xrLCBXYWxvbiwgV2luYXJheSwg5ZC06K+tLCBpc2lYaG9zYSwg15nXmda015PXmdepLCBZb3LDuWLDoSwgWmXDqnV3cywg5Lit5paHLCBCw6JuLWzDom0tZ8O6LCDnsrXoqp4iOwotICAKLWZ1bmN0aW9uIGNoZWNrUmVjdXJzaXZlbHkobWFwMSwgbWFwMikgeworY29uc3Qgc3RyaW5nVGVzdCA9ICJBZnJpa2FhbnMsIEFsZW1hbm5pc2NoLCBBcmFnb27DqXMsINin2YTYudix2KjZitipLCDZhdi12LHZiSwgQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6yZlyYmF5Y2FuLCDQkdCw0YjSodC+0YDRgiwgQm9hcmlzY2gsIMW9ZW1haXTEl8Wha2EsINCR0LXQu9Cw0YDRg9GB0LrQsNGPLCDQkdC10LvQsNGA0YPRgdC60LDRjyAo0YLQsNGA0LDRiNC60LXQstGW0YbQsCksINCR0YrQu9Cz0LDRgNGB0LrQuCwgQmFtYW5hbmthbiwg4Kas4Ka+4KaC4Kay4Ka+LCBCcmV6aG9uZWcsIEJvc2Fuc2tpLCBDYXRhbMOgLCBNw6xuZy1kxJXMpG5nLW5n4bmzzIQsINCd0L7RhdGH0LjQudC9LCBDZWJ1YW5vLCDhj6PhjrPhjqksIMSMZXNreSwg0KHQu9C+0LLRo8yB0L3RjNGB0LrRiiAvIOKwlOKwjuKwkeKwguKwoeKwkOKwoOKwlOKwjeKwnywg0KfTkdCy0LDRiNC70LAsIEN5bXJhZWcsIERhbnNrLCBaYXpha2ksIN6L3qjeiN6s3oDeqN6E3qbekN6wLCDOlc67zrvOt869zrnOus6sLCBFbWlsacOgbiBlIHJ1bWFnbsOybCwgRW5nbGlzaCwgRXNwZXJhbnRvLCBFc3Bhw7FvbCwgRWVzdGksIEV1c2thcmEsINmB2KfYsdiz24wsIFN1b21pLCBWw7VybywgRsO4cm95c2t0LCBGcmFuw6dhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIOi0m+iqniwgR8OgaWRobGlnLCBHYWxlZ28sIEF2YcOxZSfhur0sIOCql+CrgeCqnOCqsOCqvuCqpOCrgCwgR2FlbGcsINei15HXqNeZ16osIOCkueCkv+CkqOCljeCkpuClgCwgRmlqaSBIaW5kaSwgSHJ2YXRza2ksIEtyZXnDsmwgYXlpc3llbiwgTWFneWFyLCDVgNWh1bXVpdaA1aXVtiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsIElsb2thbm8sIElkbywgw41zbGVuc2thLCBJdGFsaWFubywg5pel5pys6KqeLCBMb2piYW4sIEJhc2EgSmF3YSwg4YOl4YOQ4YOg4YOX4YOj4YOa4YOYLCBLb25nbywgS2FsYWFsbGlzdXQsIOCyleCyqOCzjeCyqOCyoSwg7ZWc6rWt7Ja0LCDQmtGK0LDRgNCw0YfQsNC5LdCc0LDQu9C60YrQsNGALCBSaXBvYXJpc2NoLCBLdXJkw64sINCa0L7QvNC4LCBLZXJuZXdlaywg0JrRi9GA0LPRi9C30YfQsCwgTGF0aW5hLCBMYWRpbm8sIEzDq3R6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmfDoWxhLCDguqXgurLguqcsIExpZXR1dmnFsywgTGF0dmllxaF1LCBCYXNhIEJhbnl1bWFzYW4sIE1hbGFnYXN5LCDQnNCw0LrQtdC00L7QvdGB0LrQuCwg4LSu4LSy4LSv4LS+4LSz4LSCLCDgpK7gpLDgpL7gpKDgpYAsIEJhaGFzYSBNZWxheXUsINmF2KfYstmQ2LHZiNmG24wsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCDgpKjgpYfgpKrgpL7gpLIg4KSt4KS+4KS34KS+LCBOZWRlcmxhbmRzLCDigKpOb3JzayAobnlub3JzaynigKwsIOKAqk5vcnNrIChib2ttw6VsKeKArCwgTm91b3JtYW5kLCBEaW7DqSBiaXphYWQsIE9jY2l0YW4sINCY0YDQvtC90LDRgywgUGFwaWFtZW50dSwgRGVpdHNjaCwgTm9yZnVrIC8gUGl0a2VybiwgUG9sc2tpLCDZvtmG2KzYp9io24wsINm+2prYqtmILCBQb3J0dWd1w6pzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb23Dom7Egywg0KDRg9GB0YHQutC40LksINCh0LDRhdCwINGC0YvQu9CwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU8OhbWVnaWVsbGEsIFNpbXBsZSBFbmdsaXNoLCBTbG92ZW7EjWluYSwgU2xvdmVuxaHEjWluYSwg0KHRgNC/0YHQutC4IC8gU3Jwc2tpLCBTZWVsdGVyc2ssIFN2ZW5za2EsIEtpc3dhaGlsaSwg4K6k4K6u4K6/4K604K+NLCDgsKTgsYbgsLLgsYHgsJfgsYEsINCi0L7St9C40LrToywg4LmE4LiX4LiiLCBUw7xya21lbsOnZSwgVGFnYWxvZywgVMO8cmvDp2UsINCi0LDRgtCw0YDRh9CwL1RhdGFyw6dhLCDQo9C60YDQsNGX0L3RgdGM0LrQsCwg2KfYsdiv2YgsIFRp4bq/bmcgVmnhu4d0LCBWb2xhcMO8aywgV2Fsb24sIFdpbmFyYXksIOWQtOivrSwgaXNpWGhvc2EsINeZ15nWtNeT15nXqSwgWW9yw7liw6EsIFplw6p1d3MsIOS4reaWhywgQsOibi1sw6JtLWfDuiwg57K16KqeIjsKKworZnVuY3Rpb24gY2hlY2tSZWN1cnNpdmVseShhc3NlcnQsIG1hcDEsIG1hcDIpIHsKICAgaWYgKHR5cGVvZiBtYXAxICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBtYXAyICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgaWYgKCFtYXAxIHx8IHR5cGVvZiBtYXAxICE9PSAnb2JqZWN0JykgewotICAgICAgICBlcXVhbChtYXAxLCBtYXAyKTsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKG1hcDEsIG1hcDIpOwogICAgIH0gZWxzZSB7Ci0gICAgICBmb3IgKHZhciBrZXkgaW4gbWFwMSkgewotICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5KG1hcDFba2V5XSwgbWFwMltrZXldKTsKKyAgICAgIGZvciAobGV0IGtleSBpbiBtYXAxKSB7CisgICAgICAgIGNoZWNrUmVjdXJzaXZlbHkoYXNzZXJ0LCBtYXAxW2tleV0sIG1hcDJba2V5XSk7CiAgICAgICB9CiAgICAgfQogICB9CiB9CiAKLW1vZHVsZSgiQmFzZSBUeXBlcyIpOworUVVuaXQubW9kdWxlKCdCYXNlIFR5cGVzJyk7CiAKLSAgYXN5bmNUZXN0KCJWb2lkIiwgZnVuY3Rpb24oKSB7Ci0gICAgZXhwZWN0KCAxICk7CisgIFFVbml0LnRlc3QoJ1ZvaWQnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDEpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKICAgICBjbGllbnQudGVzdFZvaWQoZnVuY3Rpb24ocmVzdWx0KSB7Ci0gICAgICBlcXVhbChyZXN1bHQsIHVuZGVmaW5lZCk7Ci0gICAgICBRVW5pdC5zdGFydCgpOworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgdW5kZWZpbmVkKTsKKyAgICAgIGRvbmUoKTsKICAgICB9KTsKICAgfSk7Ci0gIAotICAKLSAgYXN5bmNUZXN0KCJTdHJpbmciLCBmdW5jdGlvbigpIHsKLSAgICBleHBlY3QoIDMgKTsKLSAgICBRVW5pdC5zdG9wKDIpOwotICAgIGNsaWVudC50ZXN0U3RyaW5nKCcnLCBmdW5jdGlvbihyZXN1bHQpewotICAgICAgIGVxdWFsKHJlc3VsdCwgJycpOwotICAgICAgIFFVbml0LnN0YXJ0KCk7CisKKworICBRVW5pdC50ZXN0KCdTdHJpbmcnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDMpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoMyk7CisgICAgY2xpZW50LnRlc3RTdHJpbmcoJycsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsICcnKTsKKyAgICAgICBkb25lKCk7CiAgICAgfSk7Ci0gICAgY2xpZW50LnRlc3RTdHJpbmcoc3RyaW5nVGVzdCwgZnVuY3Rpb24ocmVzdWx0KXsKLSAgICAgICBlcXVhbChyZXN1bHQsIHN0cmluZ1Rlc3QpOwotICAgICAgIFFVbml0LnN0YXJ0KCk7CisgICAgY2xpZW50LnRlc3RTdHJpbmcoc3RyaW5nVGVzdCwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgc3RyaW5nVGVzdCk7CisgICAgICAgZG9uZSgpOwogICAgIH0pOwogCi0gICAgdmFyIHNwZWNpYWxDaGFyYWN0ZXJzID0gJ3F1b3RlOiBcIiBiYWNrc2xhc2g6JyArCisgICAgY29uc3Qgc3BlY2lhbENoYXJhY3RlcnMgPSAncXVvdGU6IFwiIGJhY2tzbGFzaDonICsKICAgICAgICAgICAnIGZvcndhcmRzbGFzaC1lc2NhcGVkOiBcLyAnICsKICAgICAgICAgICAnIGJhY2tzcGFjZTogXGIgZm9ybWZlZWQ6IFxmIG5ld2xpbmU6IFxuIHJldHVybjogXHIgdGFiOiAnICsKICAgICAgICAgICAnIG5vdy1hbGwtb2YtdGhlbS10b2dldGhlcjogIlxcXC9cYlxuXHJcdCcgKwogICAgICAgICAgICcgbm93LWEtYnVuY2gtb2YtanVuazogIUAjJCUmKCkoJiUkI3t9e308Pjw+PCc7Ci0gICAgY2xpZW50LnRlc3RTdHJpbmcoc3BlY2lhbENoYXJhY3RlcnMsIGZ1bmN0aW9uKHJlc3VsdCl7Ci0gICAgICAgZXF1YWwocmVzdWx0LCBzcGVjaWFsQ2hhcmFjdGVycyk7Ci0gICAgICAgUVVuaXQuc3RhcnQoKTsKKyAgICBjbGllbnQudGVzdFN0cmluZyhzcGVjaWFsQ2hhcmFjdGVycywgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgc3BlY2lhbENoYXJhY3RlcnMpOworICAgICAgIGRvbmUoKTsKICAgICB9KTsKICAgfSk7Ci0gIGFzeW5jVGVzdCgiRG91YmxlIiwgZnVuY3Rpb24oKSB7Ci0gICAgZXhwZWN0KCA0ICk7Ci0gICAgUVVuaXQuc3RvcCgzKTsKLSAgICBjbGllbnQudGVzdERvdWJsZSgwLCBmdW5jdGlvbihyZXN1bHQpewotICAgICAgIGVxdWFsKHJlc3VsdCwgMCk7Ci0gICAgICAgUVVuaXQuc3RhcnQoKTsKKyAgUVVuaXQudGVzdCgnRG91YmxlJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCg0KTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKDQpOworICAgIGNsaWVudC50ZXN0RG91YmxlKDAsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIDApOworICAgICAgIGRvbmUoKTsKICAgICB9KTsKLSAgICBjbGllbnQudGVzdERvdWJsZSgtMSwgZnVuY3Rpb24ocmVzdWx0KXsKLSAgICAgICBlcXVhbChyZXN1bHQsIC0xKTsKLSAgICAgICBRVW5pdC5zdGFydCgpOworICAgIGNsaWVudC50ZXN0RG91YmxlKC0xLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCAtMSk7CisgICAgICAgZG9uZSgpOwogICAgIH0pOwotICAgIGNsaWVudC50ZXN0RG91YmxlKDMuMTQsIGZ1bmN0aW9uKHJlc3VsdCl7Ci0gICAgICAgZXF1YWwocmVzdWx0LCAzLjE0KTsKLSAgICAgICBRVW5pdC5zdGFydCgpOworICAgIGNsaWVudC50ZXN0RG91YmxlKDMuMTQsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIDMuMTQpOworICAgICAgIGRvbmUoKTsKICAgICB9KTsKLSAgICBjbGllbnQudGVzdERvdWJsZShNYXRoLnBvdygyLDYwKSwgZnVuY3Rpb24ocmVzdWx0KXsKLSAgICAgICBlcXVhbChyZXN1bHQsIE1hdGgucG93KDIsNjApKTsKLSAgICAgICBRVW5pdC5zdGFydCgpOworICAgIGNsaWVudC50ZXN0RG91YmxlKE1hdGgucG93KDIsIDYwKSwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgTWF0aC5wb3coMiwgNjApKTsKKyAgICAgICBkb25lKCk7CiAgICAgfSk7CiAgIH0pOwotICAvLyBUT0RPOiBhZGQgdGVzdEJpbmFyeSgpIAotICBhc3luY1Rlc3QoIkJ5dGUiLCBmdW5jdGlvbigpIHsKLSAgICBleHBlY3QoIDIgKTsKLSAgICBRVW5pdC5zdG9wKCk7CisgIC8vIFRPRE86IGFkZCB0ZXN0QmluYXJ5KCkKKyAgUVVuaXQudGVzdCgnQnl0ZScsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMik7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygyKTsKICAgICBjbGllbnQudGVzdEJ5dGUoMCwgZnVuY3Rpb24ocmVzdWx0KSB7Ci0gICAgICAgZXF1YWwocmVzdWx0LCAwKTsKLSAgICAgICBRVW5pdC5zdGFydCgpOworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIDApOworICAgICAgIGRvbmUoKTsKICAgICB9KTsKICAgICBjbGllbnQudGVzdEJ5dGUoMHgwMSwgZnVuY3Rpb24ocmVzdWx0KSB7Ci0gICAgICAgZXF1YWwocmVzdWx0LCAweDAxKTsKLSAgICAgICBRVW5pdC5zdGFydCgpOworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIDB4MDEpOworICAgICAgIGRvbmUoKTsKICAgICB9KTsKICAgfSk7Ci0gIGFzeW5jVGVzdCgiSTMyIiwgZnVuY3Rpb24oKSB7Ci0gICAgZXhwZWN0KCAzICk7Ci0gICAgUVVuaXQuc3RvcCgyKTsKLSAgICBjbGllbnQudGVzdEkzMigwLCBmdW5jdGlvbihyZXN1bHQpewotICAgICAgIGVxdWFsKHJlc3VsdCwgMCk7Ci0gICAgICAgUVVuaXQuc3RhcnQoKTsKKyAgUVVuaXQudGVzdCgnSTMyJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgzKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKDMpOworICAgIGNsaWVudC50ZXN0STMyKDAsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIDApOworICAgICAgIGRvbmUoKTsKICAgICB9KTsKLSAgICBjbGllbnQudGVzdEkzMihNYXRoLnBvdygyLDMwKSwgZnVuY3Rpb24ocmVzdWx0KXsKLSAgICAgICBlcXVhbChyZXN1bHQsIE1hdGgucG93KDIsMzApKTsKLSAgICAgICBRVW5pdC5zdGFydCgpOworICAgIGNsaWVudC50ZXN0STMyKE1hdGgucG93KDIsIDMwKSwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgTWF0aC5wb3coMiwgMzApKTsKKyAgICAgICBkb25lKCk7CiAgICAgfSk7Ci0gICAgY2xpZW50LnRlc3RJMzIoLU1hdGgucG93KDIsMzApLCBmdW5jdGlvbihyZXN1bHQpewotICAgICAgIGVxdWFsKHJlc3VsdCwgLU1hdGgucG93KDIsMzApKTsKLSAgICAgICBRVW5pdC5zdGFydCgpOworICAgIGNsaWVudC50ZXN0STMyKC1NYXRoLnBvdygyLCAzMCksIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIC1NYXRoLnBvdygyLCAzMCkpOworICAgICAgIGRvbmUoKTsKICAgICB9KTsKICAgfSk7Ci0gIGFzeW5jVGVzdCgiSTY0IiwgZnVuY3Rpb24oKSB7Ci0gICAgZXhwZWN0KCAzICk7Ci0gICAgUVVuaXQuc3RvcCgyKTsKLSAgICBjbGllbnQudGVzdEk2NCgwLCBmdW5jdGlvbihyZXN1bHQpewotICAgICAgIGVxdWFsKHJlc3VsdCwgMCk7Ci0gICAgICAgUVVuaXQuc3RhcnQoKTsKKyAgUVVuaXQudGVzdCgnSTY0JywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgzKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKDMpOworICAgIGNsaWVudC50ZXN0STY0KDAsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIDApOworICAgICAgIGRvbmUoKTsKICAgICB9KTsKICAgICAvL1RoaXMgaXMgdXN1YWxseSAyXjYwIGJ1dCBKUyBjYW5ub3QgcmVwcmVzZW50IGFueXRoaW5nIG92ZXIgMl41MiBhY2N1cmF0ZWx5Ci0gICAgY2xpZW50LnRlc3RJNjQoTWF0aC5wb3coMiw1MiksIGZ1bmN0aW9uKHJlc3VsdCl7Ci0gICAgICAgZXF1YWwocmVzdWx0LCBNYXRoLnBvdygyLDUyKSk7Ci0gICAgICAgUVVuaXQuc3RhcnQoKTsKKyAgICBjbGllbnQudGVzdEk2NChNYXRoLnBvdygyLCA1MiksIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIE1hdGgucG93KDIsIDUyKSk7CisgICAgICAgZG9uZSgpOwogICAgIH0pOwotICAgIGNsaWVudC50ZXN0STY0KC1NYXRoLnBvdygyLDUyKSwgZnVuY3Rpb24ocmVzdWx0KXsKLSAgICAgICBlcXVhbChyZXN1bHQsIC1NYXRoLnBvdygyLDUyKSk7Ci0gICAgICAgUVVuaXQuc3RhcnQoKTsKKyAgICBjbGllbnQudGVzdEk2NCgtTWF0aC5wb3coMiwgNTIpLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCAtTWF0aC5wb3coMiwgNTIpKTsKKyAgICAgICBkb25lKCk7CiAgICAgfSk7CiAgIH0pOwotICAKIAotICAKIAotbW9kdWxlKCJTdHJ1Y3R1cmVkIFR5cGVzIik7CiAKLSAgYXN5bmNUZXN0KCJTdHJ1Y3QiLCBmdW5jdGlvbigpIHsKLSAgICBleHBlY3QoIDUgKTsKLSAgICB2YXIgc3RydWN0VGVzdElucHV0ID0gbmV3IFRocmlmdFRlc3QuWHRydWN0KCk7CisKK1FVbml0Lm1vZHVsZSgnU3RydWN0dXJlZCBUeXBlcycpOworCisgIFFVbml0LnRlc3QoJ1N0cnVjdCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoNSk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNvbnN0IHN0cnVjdFRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdCgpOwogICAgIHN0cnVjdFRlc3RJbnB1dC5zdHJpbmdfdGhpbmcgPSAnd29ya2VkJzsKICAgICBzdHJ1Y3RUZXN0SW5wdXQuYnl0ZV90aGluZyA9IDB4MDE7Ci0gICAgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsMzApOworICAgIHN0cnVjdFRlc3RJbnB1dC5pMzJfdGhpbmcgPSBNYXRoLnBvdygyLCAzMCk7CiAgICAgLy9UaGlzIGlzIHVzdWFsbHkgMl42MCBidXQgSlMgY2Fubm90IHJlcHJlc2VudCBhbnl0aGluZyBvdmVyIDJeNTIgYWNjdXJhdGVseQotICAgIHN0cnVjdFRlc3RJbnB1dC5pNjRfdGhpbmcgPSBNYXRoLnBvdygyLDUyKTsKKyAgICBzdHJ1Y3RUZXN0SW5wdXQuaTY0X3RoaW5nID0gTWF0aC5wb3coMiwgNTIpOwogCi0gICAgY2xpZW50LnRlc3RTdHJ1Y3Qoc3RydWN0VGVzdElucHV0LCBmdW5jdGlvbihyZXN1bHQpewotICAgICAgZXF1YWwocmVzdWx0LnN0cmluZ190aGluZywgc3RydWN0VGVzdElucHV0LnN0cmluZ190aGluZyk7Ci0gICAgICBlcXVhbChyZXN1bHQuYnl0ZV90aGluZywgc3RydWN0VGVzdElucHV0LmJ5dGVfdGhpbmcpOwotICAgICAgZXF1YWwocmVzdWx0LmkzMl90aGluZywgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyk7Ci0gICAgICBlcXVhbChyZXN1bHQuaTY0X3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuaTY0X3RoaW5nKTsKLSAgICAgIGVxdWFsKEpTT04uc3RyaW5naWZ5KHJlc3VsdCksIEpTT04uc3RyaW5naWZ5KHN0cnVjdFRlc3RJbnB1dCkpOwotICAgICAgUVVuaXQuc3RhcnQoKTsgICAgICAKKyAgICBjbGllbnQudGVzdFN0cnVjdChzdHJ1Y3RUZXN0SW5wdXQsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5zdHJpbmdfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5zdHJpbmdfdGhpbmcpOworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5ieXRlX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuYnl0ZV90aGluZyk7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LmkzMl90aGluZywgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyk7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0Lmk2NF90aGluZywgc3RydWN0VGVzdElucHV0Lmk2NF90aGluZyk7CisgICAgICBhc3NlcnQuZXF1YWwoSlNPTi5zdHJpbmdpZnkocmVzdWx0KSwgSlNPTi5zdHJpbmdpZnkoc3RydWN0VGVzdElucHV0KSk7CisgICAgICBkb25lKCk7CiAgICAgfSk7CiAgIH0pOwogCi0gIGFzeW5jVGVzdCgiTmVzdCIsIGZ1bmN0aW9uKCkgewotICAgIGV4cGVjdCggNyApOwotICAgIHZhciB4dHJUZXN0SW5wdXQgPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QoKTsKKyAgUVVuaXQudGVzdCgnTmVzdCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoNyk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNvbnN0IHh0clRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdCgpOwogICAgIHh0clRlc3RJbnB1dC5zdHJpbmdfdGhpbmcgPSAnd29ya2VkJzsKICAgICB4dHJUZXN0SW5wdXQuYnl0ZV90aGluZyA9IDB4MDE7Ci0gICAgeHRyVGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsMzApOworICAgIHh0clRlc3RJbnB1dC5pMzJfdGhpbmcgPSBNYXRoLnBvdygyLCAzMCk7CiAgICAgLy9UaGlzIGlzIHVzdWFsbHkgMl42MCBidXQgSlMgY2Fubm90IHJlcHJlc2VudCBhbnl0aGluZyBvdmVyIDJeNTIgYWNjdXJhdGVseQotICAgIHh0clRlc3RJbnB1dC5pNjRfdGhpbmcgPSBNYXRoLnBvdygyLDUyKTsKLSAgICAKLSAgICB2YXIgbmVzdFRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdDIoKTsKKyAgICB4dHJUZXN0SW5wdXQuaTY0X3RoaW5nID0gTWF0aC5wb3coMiwgNTIpOworCisgICAgY29uc3QgbmVzdFRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdDIoKTsKICAgICBuZXN0VGVzdElucHV0LmJ5dGVfdGhpbmcgPSAweDAyOwogICAgIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nID0geHRyVGVzdElucHV0OwotICAgIG5lc3RUZXN0SW5wdXQuaTMyX3RoaW5nID0gTWF0aC5wb3coMiwxNSk7Ci0gICAgCi0gICAgY2xpZW50LnRlc3ROZXN0KG5lc3RUZXN0SW5wdXQsIGZ1bmN0aW9uKHJlc3VsdCl7Ci0gICAgICBlcXVhbChyZXN1bHQuYnl0ZV90aGluZywgbmVzdFRlc3RJbnB1dC5ieXRlX3RoaW5nKTsKLSAgICAgIGVxdWFsKHJlc3VsdC5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcpOwotICAgICAgZXF1YWwocmVzdWx0LnN0cnVjdF90aGluZy5ieXRlX3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5ieXRlX3RoaW5nKTsKLSAgICAgIGVxdWFsKHJlc3VsdC5zdHJ1Y3RfdGhpbmcuaTMyX3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5pMzJfdGhpbmcpOwotICAgICAgZXF1YWwocmVzdWx0LnN0cnVjdF90aGluZy5pNjRfdGhpbmcsIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nLmk2NF90aGluZyk7Ci0gICAgICBlcXVhbChyZXN1bHQuaTMyX3RoaW5nLCBuZXN0VGVzdElucHV0LmkzMl90aGluZyk7ICAKLSAgICAgIGVxdWFsKEpTT04uc3RyaW5naWZ5KHJlc3VsdCksIEpTT04uc3RyaW5naWZ5KG5lc3RUZXN0SW5wdXQpKTsKLSAgICAgIFFVbml0LnN0YXJ0KCk7ICAgICAgCisgICAgbmVzdFRlc3RJbnB1dC5pMzJfdGhpbmcgPSBNYXRoLnBvdygyLCAxNSk7CisKKyAgICBjbGllbnQudGVzdE5lc3QobmVzdFRlc3RJbnB1dCwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LmJ5dGVfdGhpbmcsIG5lc3RUZXN0SW5wdXQuYnl0ZV90aGluZyk7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcsIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZyk7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LnN0cnVjdF90aGluZy5ieXRlX3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5ieXRlX3RoaW5nKTsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuc3RydWN0X3RoaW5nLmkzMl90aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuaTMyX3RoaW5nKTsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuc3RydWN0X3RoaW5nLmk2NF90aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuaTY0X3RoaW5nKTsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuaTMyX3RoaW5nLCBuZXN0VGVzdElucHV0LmkzMl90aGluZyk7CisgICAgICBhc3NlcnQuZXF1YWwoSlNPTi5zdHJpbmdpZnkocmVzdWx0KSwgSlNPTi5zdHJpbmdpZnkobmVzdFRlc3RJbnB1dCkpOworICAgICAgZG9uZSgpOwogICAgIH0pOwogICB9KTsKIAotICBhc3luY1Rlc3QoIk1hcCIsIGZ1bmN0aW9uKCkgewotICAgIGV4cGVjdCggMyApOwotICAgIHZhciBtYXBUZXN0SW5wdXQgPSB7Nzo3NywgODo4OCwgOTo5OX07CisgIFFVbml0LnRlc3QoJ01hcCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMyk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNvbnN0IG1hcFRlc3RJbnB1dCA9IHs3OiA3NywgODogODgsIDk6IDk5fTsKIAotICAgIGNsaWVudC50ZXN0TWFwKG1hcFRlc3RJbnB1dCwgZnVuY3Rpb24ocmVzdWx0KXsKLSAgICAgIGZvciAodmFyIGtleSBpbiByZXN1bHQpIHsKLSAgICAgICAgZXF1YWwocmVzdWx0W2tleV0sIG1hcFRlc3RJbnB1dFtrZXldKTsKKyAgICBjbGllbnQudGVzdE1hcChtYXBUZXN0SW5wdXQsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgZm9yIChsZXQga2V5IGluIHJlc3VsdCkgeworICAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0W2tleV0sIG1hcFRlc3RJbnB1dFtrZXldKTsKICAgICAgIH0KLSAgICAgIFFVbml0LnN0YXJ0KCk7ICAKKyAgICAgIGRvbmUoKTsKICAgICB9KTsKICAgfSk7CiAKLSAgYXN5bmNUZXN0KCJTdHJpbmdNYXAiLCBmdW5jdGlvbigpIHsKLSAgICBleHBlY3QoIDYgKTsKLSAgICB2YXIgbWFwVGVzdElucHV0ID0gewotICAgICAgImEiOiIxMjMiLCAiYSBiIjoid2l0aCBzcGFjZXMgIiwgInNhbWUiOiJzYW1lIiwgIjAiOiJudW1lcmljIGtleSIsCi0gICAgICAibG9uZ1ZhbHVlIjpzdHJpbmdUZXN0LCBzdHJpbmdUZXN0OiJsb25nIGtleSIKKyAgUVVuaXQudGVzdCgnU3RyaW5nTWFwJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCg2KTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgY29uc3QgbWFwVGVzdElucHV0ID0geworICAgICAgJ2EnOiAnMTIzJywgJ2EgYic6ICd3aXRoIHNwYWNlcyAnLCAnc2FtZSc6ICdzYW1lJywgJzAnOiAnbnVtZXJpYyBrZXknLAorICAgICAgJ2xvbmdWYWx1ZSc6IHN0cmluZ1Rlc3QsIHN0cmluZ1Rlc3Q6ICdsb25nIGtleScKICAgICB9OwogCi0gICAgY2xpZW50LnRlc3RTdHJpbmdNYXAobWFwVGVzdElucHV0LCBmdW5jdGlvbihyZXN1bHQpewotICAgICAgZm9yICh2YXIga2V5IGluIHJlc3VsdCkgewotICAgICAgICBlcXVhbChyZXN1bHRba2V5XSwgbWFwVGVzdElucHV0W2tleV0pOworICAgIGNsaWVudC50ZXN0U3RyaW5nTWFwKG1hcFRlc3RJbnB1dCwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBmb3IgKGxldCBrZXkgaW4gcmVzdWx0KSB7CisgICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHRba2V5XSwgbWFwVGVzdElucHV0W2tleV0pOwogICAgICAgfQotICAgICAgUVVuaXQuc3RhcnQoKTsKKyAgICAgIGRvbmUoKTsKICAgICB9KTsKICAgfSk7CiAKLSAgYXN5bmNUZXN0KCJTZXQiLCBmdW5jdGlvbigpIHsKLSAgICBleHBlY3QoIDEgKTsKLSAgICB2YXIgc2V0VGVzdElucHV0ID0gWzEsMiwzXTsKLSAgICBjbGllbnQudGVzdFNldChzZXRUZXN0SW5wdXQsIGZ1bmN0aW9uKHJlc3VsdCl7Ci0gICAgICBvayhyZXN1bHQsIHNldFRlc3RJbnB1dCk7Ci0gICAgICBRVW5pdC5zdGFydCgpOworICBRVW5pdC50ZXN0KCdTZXQnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDEpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICBjb25zdCBzZXRUZXN0SW5wdXQgPSBbMSwgMiwgM107CisgICAgY2xpZW50LnRlc3RTZXQoc2V0VGVzdElucHV0LCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5vayhyZXN1bHQsIHNldFRlc3RJbnB1dCk7CisgICAgICBkb25lKCk7CiAgICAgfSk7CiAgIH0pOwogCi0gIGFzeW5jVGVzdCgiTGlzdCIsIGZ1bmN0aW9uKCkgewotICAgIGV4cGVjdCggMSApOwotICAgIHZhciBsaXN0VGVzdElucHV0ID0gWzEsMiwzXTsKLSAgICBjbGllbnQudGVzdExpc3QobGlzdFRlc3RJbnB1dCwgZnVuY3Rpb24ocmVzdWx0KXsKLSAgICAgIG9rKHJlc3VsdCwgbGlzdFRlc3RJbnB1dCk7Ci0gICAgICBRVW5pdC5zdGFydCgpOworICBRVW5pdC50ZXN0KCdMaXN0JywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgxKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgY29uc3QgbGlzdFRlc3RJbnB1dCA9IFsxLCAyLCAzXTsKKyAgICBjbGllbnQudGVzdExpc3QobGlzdFRlc3RJbnB1dCwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQub2socmVzdWx0LCBsaXN0VGVzdElucHV0KTsKKyAgICAgIGRvbmUoKTsKICAgICB9KTsKICAgfSk7CiAKLSAgYXN5bmNUZXN0KCJFbnVtIiwgZnVuY3Rpb24oKSB7Ci0gICAgZXhwZWN0KCAxICk7Ci0gICAgY2xpZW50LnRlc3RFbnVtKFRocmlmdFRlc3QuTnVtYmVyei5PTkUsIGZ1bmN0aW9uKHJlc3VsdCl7Ci0gICAgICBlcXVhbChyZXN1bHQsIFRocmlmdFRlc3QuTnVtYmVyei5PTkUpOwotICAgICAgUVVuaXQuc3RhcnQoKTsKKyAgUVVuaXQudGVzdCgnRW51bScsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMSk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNsaWVudC50ZXN0RW51bShUaHJpZnRUZXN0Lk51bWJlcnouT05FLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIFRocmlmdFRlc3QuTnVtYmVyei5PTkUpOworICAgICAgZG9uZSgpOwogICAgIH0pOwogICB9KTsKIAotICBhc3luY1Rlc3QoIlR5cGVEZWYiLCBmdW5jdGlvbigpIHsKLSAgICBleHBlY3QoIDEgKTsKLSAgICBjbGllbnQudGVzdFR5cGVkZWYoNjksIGZ1bmN0aW9uKHJlc3VsdCl7Ci0gICAgICBlcXVhbChyZXN1bHQsIDY5KTsKLSAgICAgIFFVbml0LnN0YXJ0KCk7CisgIFFVbml0LnRlc3QoJ1R5cGVEZWYnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDEpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICBjbGllbnQudGVzdFR5cGVkZWYoNjksIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgNjkpOworICAgICAgZG9uZSgpOwogICAgIH0pOwogICB9KTsKIAogCi1tb2R1bGUoImRlZXBlciEiKTsKK1FVbml0Lm1vZHVsZSgnZGVlcGVyIScpOwogCi0gIGFzeW5jVGVzdCgiTWFwTWFwIiwgZnVuY3Rpb24oKSB7Ci0gICAgZXhwZWN0KCAxNiApOwotICAgIHZhciBtYXBNYXBUZXN0RXhwZWN0ZWRSZXN1bHQgPSB7Ci0gICAgICAiNCI6eyIxIjoxLCIyIjoyLCIzIjozLCI0Ijo0fSwKLSAgICAgICItNCI6eyItNCI6LTQsICItMyI6LTMsICItMiI6LTIsICItMSI6LTF9CisgIFFVbml0LnRlc3QoJ01hcE1hcCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMTYpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICBjb25zdCBtYXBNYXBUZXN0RXhwZWN0ZWRSZXN1bHQgPSB7CisgICAgICAnNCc6IHsnMSc6IDEsICcyJzogMiwgJzMnOiAzLCAnNCc6IDR9LAorICAgICAgJy00JzogeyctNCc6IC00LCAnLTMnOiAtMywgJy0yJzogLTIsICctMSc6IC0xfQogICAgIH07CiAKLSAgICBjbGllbnQudGVzdE1hcE1hcCgxLCBmdW5jdGlvbihyZXN1bHQpewotICAgICAgZm9yICh2YXIga2V5IGluIHJlc3VsdCkgewotICAgICAgICBmb3IgKHZhciBrZXkyIGluIHJlc3VsdFtrZXldKSB7Ci0gICAgICAgICAgZXF1YWwocmVzdWx0W2tleV1ba2V5Ml0sIG1hcE1hcFRlc3RFeHBlY3RlZFJlc3VsdFtrZXldW2tleTJdKTsKKyAgICBjbGllbnQudGVzdE1hcE1hcCgxLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGZvciAobGV0IGtleSBpbiByZXN1bHQpIHsKKyAgICAgICAgZm9yIChsZXQga2V5MiBpbiByZXN1bHRba2V5XSkgeworICAgICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHRba2V5XVtrZXkyXSwgbWFwTWFwVGVzdEV4cGVjdGVkUmVzdWx0W2tleV1ba2V5Ml0pOwogICAgICAgICB9CiAgICAgICB9Ci0gICAgICBjaGVja1JlY3Vyc2l2ZWx5KHJlc3VsdCwgbWFwTWFwVGVzdEV4cGVjdGVkUmVzdWx0KTsKLSAgICAgIFFVbml0LnN0YXJ0KCk7CisgICAgICBjaGVja1JlY3Vyc2l2ZWx5KGFzc2VydCwgcmVzdWx0LCBtYXBNYXBUZXN0RXhwZWN0ZWRSZXN1bHQpOworICAgICAgZG9uZSgpOwogICAgIH0pOwogICB9KTsKIAogCi1tb2R1bGUoIkV4Y2VwdGlvbiIpOworUVVuaXQubW9kdWxlKCdFeGNlcHRpb24nKTsKIAotICBhc3luY1Rlc3QoIlhjZXB0aW9uIiwgZnVuY3Rpb24oKSB7Ci0gICAgZXhwZWN0KDIpOwotICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCJYY2VwdGlvbiIsIGZ1bmN0aW9uKGUpewotICAgICAgZXF1YWwoZS5lcnJvckNvZGUsIDEwMDEpOwotICAgICAgZXF1YWwoZS5tZXNzYWdlLCAiWGNlcHRpb24iKTsKLSAgICAgIFFVbml0LnN0YXJ0KCk7CisgIFFVbml0LnRlc3QoJ1hjZXB0aW9uJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgyKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oJ1hjZXB0aW9uJywgZnVuY3Rpb24oZSkgeworICAgICAgYXNzZXJ0LmVxdWFsKGUuZXJyb3JDb2RlLCAxMDAxKTsKKyAgICAgIGFzc2VydC5lcXVhbChlLm1lc3NhZ2UsICdYY2VwdGlvbicpOworICAgICAgZG9uZSgpOwogICAgIH0pOwogICB9KTsKIAotICBhc3luY1Rlc3QoIm5vIEV4Y2VwdGlvbiIsIDAsIGZ1bmN0aW9uKCkgewotICAgIGV4cGVjdCggMSApOwotICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCJubyBFeGNlcHRpb24iLCBmdW5jdGlvbihlKXsKLSAgICAgIG9rKCFlKTsKLSAgICAgIFFVbml0LnN0YXJ0KCk7CisgIFFVbml0LnRlc3QoJ25vIEV4Y2VwdGlvbicsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMSk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCdubyBFeGNlcHRpb24nLCBmdW5jdGlvbihlKSB7CisgICAgICBhc3NlcnQub2soIWUpOworICAgICAgZG9uZSgpOwogICAgIH0pOwogICB9KTsKIAotbW9kdWxlKCJJbnNhbml0eSIpOworUVVuaXQubW9kdWxlKCdJbnNhbml0eScpOwogCi0gIGFzeW5jVGVzdCgidGVzdEluc2FuaXR5IiwgZnVuY3Rpb24oKSB7Ci0gICAgZXhwZWN0KCAyNCApOwotICAgIHZhciBpbnNhbml0eSA9IHsKLSAgICAgICIxIjp7Ci0gICAgICAgICIyIjp7Ci0gICAgICAgICAgInVzZXJNYXAiOnsgIjUiOjUsICI4Ijo4IH0sCi0gICAgICAgICAgInh0cnVjdHMiOlt7Ci0gICAgICAgICAgICAgICJzdHJpbmdfdGhpbmciOiJHb29kYnllNCIsCi0gICAgICAgICAgICAgICJieXRlX3RoaW5nIjo0LAotICAgICAgICAgICAgICAiaTMyX3RoaW5nIjo0LAotICAgICAgICAgICAgICAiaTY0X3RoaW5nIjo0CisgIFFVbml0LnRlc3QoJ3Rlc3RJbnNhbml0eScsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMjQpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICBjb25zdCBpbnNhbml0eSA9IHsKKyAgICAgICcxJzogeworICAgICAgICAnMic6IHsKKyAgICAgICAgICAndXNlck1hcCc6IHsgJzUnOiA1LCAnOCc6IDggfSwKKyAgICAgICAgICAneHRydWN0cyc6IFt7CisgICAgICAgICAgICAgICdzdHJpbmdfdGhpbmcnOiAnR29vZGJ5ZTQnLAorICAgICAgICAgICAgICAnYnl0ZV90aGluZyc6IDQsCisgICAgICAgICAgICAgICdpMzJfdGhpbmcnOiA0LAorICAgICAgICAgICAgICAnaTY0X3RoaW5nJzogNAogICAgICAgICAgICAgfSwKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgInN0cmluZ190aGluZyI6IkhlbGxvMiIsCi0gICAgICAgICAgICAgICJieXRlX3RoaW5nIjoyLAotICAgICAgICAgICAgICAiaTMyX3RoaW5nIjoyLAotICAgICAgICAgICAgICAiaTY0X3RoaW5nIjoyCisgICAgICAgICAgICAgICdzdHJpbmdfdGhpbmcnOiAnSGVsbG8yJywKKyAgICAgICAgICAgICAgJ2J5dGVfdGhpbmcnOiAyLAorICAgICAgICAgICAgICAnaTMyX3RoaW5nJzogMiwKKyAgICAgICAgICAgICAgJ2k2NF90aGluZyc6IDIKICAgICAgICAgICAgIH0KICAgICAgICAgICBdCiAgICAgICAgIH0sCi0gICAgICAgICIzIjp7Ci0gICAgICAgICAgInVzZXJNYXAiOnsgIjUiOjUsICI4Ijo4IH0sCi0gICAgICAgICAgInh0cnVjdHMiOlt7Ci0gICAgICAgICAgICAgICJzdHJpbmdfdGhpbmciOiJHb29kYnllNCIsCi0gICAgICAgICAgICAgICJieXRlX3RoaW5nIjo0LAotICAgICAgICAgICAgICAiaTMyX3RoaW5nIjo0LAotICAgICAgICAgICAgICAiaTY0X3RoaW5nIjo0CisgICAgICAgICczJzogeworICAgICAgICAgICd1c2VyTWFwJzogeyAnNSc6IDUsICc4JzogOCB9LAorICAgICAgICAgICd4dHJ1Y3RzJzogW3sKKyAgICAgICAgICAgICAgJ3N0cmluZ190aGluZyc6ICdHb29kYnllNCcsCisgICAgICAgICAgICAgICdieXRlX3RoaW5nJzogNCwKKyAgICAgICAgICAgICAgJ2kzMl90aGluZyc6IDQsCisgICAgICAgICAgICAgICdpNjRfdGhpbmcnOiA0CiAgICAgICAgICAgICB9LAogICAgICAgICAgICAgewotICAgICAgICAgICAgICAic3RyaW5nX3RoaW5nIjoiSGVsbG8yIiwKLSAgICAgICAgICAgICAgImJ5dGVfdGhpbmciOjIsCi0gICAgICAgICAgICAgICJpMzJfdGhpbmciOjIsCi0gICAgICAgICAgICAgICJpNjRfdGhpbmciOjIKKyAgICAgICAgICAgICAgJ3N0cmluZ190aGluZyc6ICdIZWxsbzInLAorICAgICAgICAgICAgICAnYnl0ZV90aGluZyc6IDIsCisgICAgICAgICAgICAgICdpMzJfdGhpbmcnOiAyLAorICAgICAgICAgICAgICAnaTY0X3RoaW5nJzogMgogICAgICAgICAgICAgfQogICAgICAgICAgIF0KICAgICAgICAgfQogICAgICAgfSwKLSAgICAgICIyIjp7ICI2Ijp7ICJ1c2VyTWFwIjpudWxsLCAieHRydWN0cyI6bnVsbCB9IH0KKyAgICAgICcyJzogeyAnNic6IHsgJ3VzZXJNYXAnOiBudWxsLCAneHRydWN0cyc6IG51bGwgfSB9CiAgICAgfTsKLSAgICBjbGllbnQudGVzdEluc2FuaXR5KG5ldyBUaHJpZnRUZXN0Lkluc2FuaXR5KCksIGZ1bmN0aW9uKHJlcyl7Ci0gICAgICBvayhyZXMsIEpTT04uc3RyaW5naWZ5KHJlcykpOwotICAgICAgb2soaW5zYW5pdHksIEpTT04uc3RyaW5naWZ5KGluc2FuaXR5KSk7Ci0gICAgICBjaGVja1JlY3Vyc2l2ZWx5KHJlcywgaW5zYW5pdHkpOwotICAgICAgUVVuaXQuc3RhcnQoKTsKKyAgICBjbGllbnQudGVzdEluc2FuaXR5KG5ldyBUaHJpZnRUZXN0Lkluc2FuaXR5KCksIGZ1bmN0aW9uKHJlcykgeworICAgICAgYXNzZXJ0Lm9rKHJlcywgSlNPTi5zdHJpbmdpZnkocmVzKSk7CisgICAgICBhc3NlcnQub2soaW5zYW5pdHksIEpTT04uc3RyaW5naWZ5KGluc2FuaXR5KSk7CisgICAgICBjaGVja1JlY3Vyc2l2ZWx5KGFzc2VydCwgcmVzLCBpbnNhbml0eSk7CisgICAgICBkb25lKCk7CiAgICAgfSk7CiAgIH0pOwogCitRVW5pdC5tb2R1bGUoJ09uZXdheScpOwogCisgIFFVbml0LnRlc3QoJ3Rlc3RPbmV3YXknLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDEpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICBjbGllbnQudGVzdE9uZXdheSgxLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIHVuZGVmaW5lZCk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOwpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3QvdGVzdC1kZWVwLWNvbnN0cnVjdG9yLmh0bWwgYi9saWIvanMvdGVzdC90ZXN0LWRlZXAtY29uc3RydWN0b3IuaHRtbAppbmRleCA1ODM1ZGM4Li5kZmMwZGE2IDEwMDc1NQotLS0gYS9saWIvanMvdGVzdC90ZXN0LWRlZXAtY29uc3RydWN0b3IuaHRtbAorKysgYi9saWIvanMvdGVzdC90ZXN0LWRlZXAtY29uc3RydWN0b3IuaHRtbApAQCAtMjUsMTcgKzI1LDE3IEBACiAgIDxzY3JpcHQgc3JjPSJidWlsZC9qcy90aHJpZnQuanMiICAgICAgICAgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CiAgIDxzY3JpcHQgc3JjPSJnZW4tanMvSnNEZWVwQ29uc3RydWN0b3JUZXN0X3R5cGVzLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KICAgPCEtLSBqUXVlcnkgLS0+Ci0gIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHA6Ly9jb2RlLmpxdWVyeS5jb20vanF1ZXJ5LTEuNy4yLmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImJ1aWxkL2pzL2xpYi9qcXVlcnkuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KIAogICA8IS0tIFFVbml0IFRlc3QgZnJhbWV3b3JrLS0+Ci0gIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHA6Ly9jb2RlLmpxdWVyeS5jb20vcXVuaXQvcXVuaXQtMS4xNC4wLmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+Ci0gIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL2NvZGUuanF1ZXJ5LmNvbS9xdW5pdC9xdW5pdC0xLjE0LjAuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgbWVkaWE9InNjcmVlbiIgLz4KKwk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJidWlsZC9qcy9saWIvcXVuaXQuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKwk8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImJ1aWxkL2pzL2xpYi9xdW5pdC5jc3MiIHR5cGU9InRleHQvY3NzIiBtZWRpYT0ic2NyZWVuIiAvPgogCiAgIDwhLS0gdGhlIFRlc3QgU3VpdGUtLT4KICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iZGVlcC1jb25zdHJ1Y3Rvci50ZXN0LmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CiA8L2hlYWQ+CiA8Ym9keT4KLSAgPGgxIGlkPSJxdW5pdC1oZWFkZXIiPlRocmlmdCBKYXZhc2NyaXB0IEJpbmRpbmdzOiBEZWVwIENvbnN0cnVjdG9yIFRlc3QgKDxhIGhyZWY9Imh0dHBzOi8vZ2l0LXdpcC11cy5hcGFjaGUub3JnL3JlcG9zL2FzZj9wPXRocmlmdC5naXQ7YT1ibG9iO2Y9dGVzdC9Kc0RlZXBDb25zdHJ1Y3RvclRlc3QudGhyaWZ0O2hiPUhFQUQiPkpzRGVlcENvbnN0cnVjdG9yVGVzdC50aHJpZnQ8L2E+KTwvaDE+CisgIDxoMSBpZD0icXVuaXQtaGVhZGVyIj5UaHJpZnQgSmF2YXNjcmlwdCBCaW5kaW5nczogRGVlcCBDb25zdHJ1Y3RvciBUZXN0ICg8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC9ibG9iL21hc3Rlci90ZXN0L0pzRGVlcENvbnN0cnVjdG9yVGVzdC50aHJpZnQiPkpzRGVlcENvbnN0cnVjdG9yVGVzdC50aHJpZnQ8L2E+KTwvaDE+CiAgIDxoMiBpZD0icXVuaXQtYmFubmVyIj48L2gyPgogICA8ZGl2IGlkPSJxdW5pdC10ZXN0cnVubmVyLXRvb2xiYXIiPjwvZGl2PgogICA8aDIgaWQ9InF1bml0LXVzZXJBZ2VudCI+PC9oMj4KZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3Rlc3QtZG91YmxlLXJlbmRlcmluZy5odG1sIGIvbGliL2pzL3Rlc3QvdGVzdC1kb3VibGUtcmVuZGVyaW5nLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E0MzBhNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qcy90ZXN0L3Rlc3QtZG91YmxlLXJlbmRlcmluZy5odG1sCkBAIC0wLDAgKzEsNTUgQEAKKys8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KKzxoZWFkPgorICAgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+CisgICAgICA8dGl0bGU+UmVuZGVyaW5nIERvdWJsZSBDb25zdGFudHMgaW4gSlM6IFVuaXQgVGVzdDwvdGl0bGU+CisKKyAgICAgIDxzY3JpcHQgc3JjPSJidWlsZC9qcy90aHJpZnQuanMiICAgICAgICAgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisgICAgICA8c2NyaXB0IHNyYz0iZ2VuLWpzL1RocmlmdFRlc3RfdHlwZXMuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorICAgICAgPHNjcmlwdCBzcmM9Imdlbi1qcy9UaHJpZnRUZXN0LmpzIiAgICAgICB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKyAgICAgIDwhLS0gZG91YmxlIGNvbnN0YW50cyB0byBjaGVjayAtLT4KKyAgICAgIDxzY3JpcHQgc3JjPSJnZW4tanMvRG91YmxlQ29uc3RhbnRzVGVzdF90eXBlcy5qcyIgICAgICAgICB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKworICAgICAgPCEtLSBqUXVlcnkgLS0+CisgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJidWlsZC9qcy9saWIvanF1ZXJ5LmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisKKyAgICAgIDwhLS0gUVVuaXQgVGVzdCBmcmFtZXdvcmstLT4KKyAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImJ1aWxkL2pzL2xpYi9xdW5pdC5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJidWlsZC9qcy9saWIvcXVuaXQuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgbWVkaWE9InNjcmVlbiIgLz4KKworICAgICAgPCEtLSB0aGUgVGVzdCBTdWl0ZS0tPgorICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idGVzdC1kb3VibGUtcmVuZGVyaW5nLmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisgICAgPC9oZWFkPgorPGJvZHk+CisgIDxoMSBpZD0icXVuaXQtaGVhZGVyIj5SZW5kZXJpbmcgRG91YmxlIENvbnN0YW50cyBpbiBKUzogVW5pdCBUZXN0PC9oMT4KKyAgPGgyIGlkPSJxdW5pdC1iYW5uZXIiPjwvaDI+CisgIDxkaXYgaWQ9InF1bml0LXRlc3RydW5uZXItdG9vbGJhciI+PC9kaXY+CisgIDxoMiBpZD0icXVuaXQtdXNlckFnZW50Ij48L2gyPgorICA8b2wgaWQ9InF1bml0LXRlc3RzIj48bGk+PCEtLSBnZXQgdmFsaWQgeGh0bWwgc3RyaWN0LS0+PC9saT48L29sPgorICA8IS0tIFVuY29tbWVudCB0aGlzIHRvIGNoZWNrIHRoZSB2YWxpZGl0eS4gVGhpcyBzaWduaWZpY2FudGx5IHNsb3dzIGRvd24gdGhlIHRlc3QuCisgIDxwPgorICAgICAgPGEgaHJlZj0iaHR0cDovL3ZhbGlkYXRvci53My5vcmcvY2hlY2svcmVmZXJlciI+PGltZworICAgICAgICAgIHNyYz0iaHR0cDovL3d3dy53My5vcmcvSWNvbnMvdmFsaWQteGh0bWwxMCIKKyAgICAgICAgICBhbHQ9IlZhbGlkIFhIVE1MIDEuMCEiIGhlaWdodD0iMzEiIHdpZHRoPSI4OCIgLz48L2E+CisgIDwvcD4KKyAgLS0+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9saWIvanMvdGVzdC90ZXN0LWRvdWJsZS1yZW5kZXJpbmcuanMgYi9saWIvanMvdGVzdC90ZXN0LWRvdWJsZS1yZW5kZXJpbmcuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc5MGMxYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qcy90ZXN0L3Rlc3QtZG91YmxlLXJlbmRlcmluZy5qcwpAQCAtMCwwICsxLDEyNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworIC8qIGpzaGludCAtVzEwMCAqLworCisvKgorICogSmF2YVNjcmlwdCB0ZXN0IHN1aXRlIGZvciBkb3VibGUgY29uc3RhbnRzIGluc2lkZQorICogRG91YmxlQ29uc3RhbnRzVGVzdC50aHJpZnQuIFRoZXNlIHRlc3RzIHdpbGwgcnVuIGFnYWluc3QgTm9ybWFsICgtZ2VuIGpzKQorICogQXBhY2hlIFRocmlmdCBpbnRlcmZhY2VzLgorICoKKyAqIFRvIGNvbXBpbGUgY2xpZW50IGNvZGUgZm9yIHRoaXMgdGVzdCB1c2U6CisgKiAgICAgICQgdGhyaWZ0IC1nZW4ganMgRG91YmxlQ29uc3RhbnRzVGVzdC50aHJpZnQKKyAqLworCisvLyBkb3VibGUgYXNzZXJ0aW9uIHRocmVzaG9sZAorY29uc3QgRVBTSUxPTiA9IDAuMDAwMDAwMTsKKworLy8gV29yayBhcm91bmQgZm9yIG9sZCBBUEkgdXNlZCBieSBRVW5pdEFkYXB0ZXIgb2YganNUZXN0RHJpdmVyCitpZiAodHlwZW9mIFFVbml0LmxvZyA9PSAnZnVuY3Rpb24nKSB7CisgIC8vIFdoZW4gdXNpbmcgcmVhbCBRVW5pdCAoZnJvbiBQaGFudG9tSlMpIGxvZyBmYWlsdXJlcyB0byBjb25zb2xlCisgIFFVbml0LmxvZyhmdW5jdGlvbihkZXRhaWxzKSB7CisgICAgaWYgKCFkZXRhaWxzLnJlc3VsdCkgeworICAgICAgY29uc29sZS5sb2coJz09PT09PT09IEZBSUwgPT09PT09PT0nKTsKKyAgICAgIGNvbnNvbGUubG9nKCdUZXN0TmFtZTogJyArIGRldGFpbHMubmFtZSk7CisgICAgICBpZiAoZGV0YWlscy5tZXNzYWdlKSBjb25zb2xlLmxvZyhkZXRhaWxzLm1lc3NhZ2UpOworICAgICAgY29uc29sZS5sb2coJ0V4cGVjdGVkOiAnICsgZGV0YWlscy5leHBlY3RlZCk7CisgICAgICBjb25zb2xlLmxvZygnQWN0dWFsICA6ICcgKyBkZXRhaWxzLmFjdHVhbCk7CisgICAgICBjb25zb2xlLmxvZygnPT09PT09PT09PT09PT09PT09PT09PScpOworICAgIH0KKyAgfSk7Cit9CisKK1FVbml0Lm1vZHVsZSgnRG91YmxlIHJlbmRlcmluZycpOworCisgIFFVbml0LnRlc3QoJ0RvdWJsZSAocmVuZGVyaW5nKScsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGNvbnNvbGUubG9nKCdEb3VibGUgcmVuZGVyaW5nIHRlc3QgLS0gc3RhcnRzJyk7CisgICAgY29uc3QgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVCA9IDE7CisgICAgY29uc3QgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVCA9IC0xMDA7CisgICAgY29uc3QgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5UID0gOTIyMzM3MjAzNjg1NDc3NTgwNzsKKyAgICBjb25zdCBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UID0gLTkyMjMzNzIwMzY4NTQ3NzU4MDc7CisgICAgY29uc3QgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFMgPSAzLjE0MTU5MjY1MzU5OworICAgIGNvbnN0IEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRSA9IDEwMDAwMDAuMTsKKyAgICBjb25zdCBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEUgPSAtMTAwMDAwMC4xOworICAgIGNvbnN0IEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEUgPSAxLjdlKzMwODsKKyAgICBjb25zdCBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEUgPSA5MjIzMzcyMDM2ODU0Nzc1ODE2LjQzOworICAgIGNvbnN0IEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEUgPSAtMS43ZSszMDg7CisgICAgY29uc3QgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSA9IC05MjIzMzcyMDM2ODU0Nzc1ODE2LjQzOworICAgIGFzc2VydC5vaygKKyAgICAgICAgTWF0aC5hYnMoRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVCAtIERPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlRfVEVTVCkgPD0gRVBTSUxPTik7CisgICAgYXNzZXJ0Lm9rKAorICAgICAgICBNYXRoLmFicygKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlQgLQorICAgICAgICAgICAgRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVF9URVNUKSA8PSBFUFNJTE9OKTsKKyAgICBhc3NlcnQub2soCisgICAgICAgIE1hdGguYWJzKAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5UIC0KKyAgICAgICAgICAgIERPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVF9URVNUKSA8PSBFUFNJTE9OKTsKKyAgICBhc3NlcnQub2soCisgICAgICAgIE1hdGguYWJzKAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVCAtCisgICAgICAgICAgICBET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UX1RFU1QpIDw9IEVQU0lMT04pOworICAgIGFzc2VydC5vaygKKyAgICAgICAgTWF0aC5hYnMoCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMUyAtCisgICAgICAgICAgICBET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMU19URVNUKSA8PSBFUFNJTE9OKTsKKyAgICBhc3NlcnQub2soCisgICAgICAgIE1hdGguYWJzKAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFIC0KKyAgICAgICAgICAgIERPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRV9URVNUKSA8PSBFUFNJTE9OKTsKKyAgICBhc3NlcnQub2soCisgICAgICAgIE1hdGguYWJzKAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFIC0KKyAgICAgICAgICAgIERPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUKSA8PSBFUFNJTE9OKTsKKyAgICBhc3NlcnQub2soCisgICAgICAgIE1hdGguYWJzKAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRSAtCisgICAgICAgICAgICBET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFX1RFU1QpIDw9IEVQU0lMT04pOworICAgIGFzc2VydC5vaygKKyAgICAgICAgTWF0aC5hYnMoCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEUgLQorICAgICAgICAgICAgRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpIDw9IEVQU0lMT04pOworICAgIGFzc2VydC5vaygKKyAgICAgICAgTWF0aC5hYnMoCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFIC0KKyAgICAgICAgICAgIERPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEVfVEVTVCkgPD0gRVBTSUxPTik7CisgICAgYXNzZXJ0Lm9rKAorICAgICAgICBNYXRoLmFicygKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEUgLQorICAgICAgICAgICAgRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUKSA8PSBFUFNJTE9OKTsKKyAgICBhc3NlcnQuZXF1YWwodHlwZW9mIERPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlRfVEVTVCwgJ251bWJlcicpOworICAgIGFzc2VydC5lcXVhbCh0eXBlb2YgRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVF9URVNULCAnbnVtYmVyJyk7CisgICAgYXNzZXJ0LmVxdWFsKHR5cGVvZiBET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlRfVEVTVCwgJ251bWJlcicpOworICAgIGFzc2VydC5lcXVhbCh0eXBlb2YgRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVF9URVNULCAnbnVtYmVyJyk7CisgICAgYXNzZXJ0LmVxdWFsKHR5cGVvZiBET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMU19URVNULCAnbnVtYmVyJyk7CisgICAgYXNzZXJ0LmVxdWFsKHR5cGVvZiBET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCwgJ251bWJlcicpOworICAgIGFzc2VydC5lcXVhbCh0eXBlb2YgRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsICdudW1iZXInKTsKKyAgICBhc3NlcnQuZXF1YWwodHlwZW9mIERPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEVfVEVTVCwgJ251bWJlcicpOworICAgIGFzc2VydC5lcXVhbCh0eXBlb2YgRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsICdudW1iZXInKTsKKyAgICBhc3NlcnQuZXF1YWwodHlwZW9mIERPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEVfVEVTVCwgJ251bWJlcicpOworICAgIGFzc2VydC5lcXVhbCh0eXBlb2YgRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNULCAnbnVtYmVyJyk7CisgICAgY29uc3QgRVhQRUNURURfRE9VQkxFX0xJU1QgPQorICAgICAgICBbMSwtMTAwLDEwMCw5MjIzMzcyMDM2ODU0Nzc1ODA3LC05MjIzMzcyMDM2ODU0Nzc1ODA3LDMuMTQxNTkyNjUzNTksMTAwMDAwMC4xLC0xMDAwMDAwLjEsMS43ZSszMDgsLTEuN2UrMzA4LAorICAgICAgICAgICAgOTIyMzM3MjAzNjg1NDc3NTgxNi40MywtOTIyMzM3MjAzNjg1NDc3NTgxNi40M107CisgICAgYXNzZXJ0LmVxdWFsKERPVUJMRV9MSVNUX1RFU1QubGVuZ3RoLCBFWFBFQ1RFRF9ET1VCTEVfTElTVC5sZW5ndGgpOworICAgIGZvciAobGV0IGkgPSAwOyBpIDwgRVhQRUNURURfRE9VQkxFX0xJU1QubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgYXNzZXJ0Lm9rKE1hdGguYWJzKEVYUEVDVEVEX0RPVUJMRV9MSVNUW2ldIC0gRE9VQkxFX0xJU1RfVEVTVFtpXSkgPD0gRVBTSUxPTik7CisgICAgfQorICAgIGNvbnNvbGUubG9nKCdEb3VibGUgcmVuZGVyaW5nIHRlc3QgLS0gZW5kcycpOworICB9KTsKKwpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3QvdGVzdC1lczYuaHRtbCBiL2xpYi9qcy90ZXN0L3Rlc3QtZXM2Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYwNDkwMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qcy90ZXN0L3Rlc3QtZXM2Lmh0bWwKQEAgLTAsMCArMSw2MiBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Cis8aGVhZD4KKyAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+CisgIDx0aXRsZT5UaHJpZnQgSmF2YXNjcmlwdCBCaW5kaW5nczogVW5pdCBUZXN0PC90aXRsZT4KKworICA8c2NyaXB0IHNyYz0iYnVpbGQvanMvdGhyaWZ0LmpzIiAgICAgICAgIHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorICA8c2NyaXB0IHNyYz0iZ2VuLWpzLWVzNi9UaHJpZnRUZXN0X3R5cGVzLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKyAgPHNjcmlwdCBzcmM9Imdlbi1qcy1lczYvVGhyaWZ0VGVzdC5qcyIgICAgICAgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisKKyAgPCEtLSBqUXVlcnkgLS0+CisgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImJ1aWxkL2pzL2xpYi9qcXVlcnkuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKworICA8IS0tIFFVbml0IFRlc3QgZnJhbWV3b3JrLS0+CisgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImJ1aWxkL2pzL2xpYi9xdW5pdC5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImJ1aWxkL2pzL2xpYi9xdW5pdC5jc3MiIHR5cGU9InRleHQvY3NzIiBtZWRpYT0ic2NyZWVuIiAvPgorCisgIDwhLS0gdGhlIFRlc3QgU3VpdGUtLT4KKyAgPHNjcmlwdD4KKyAgICBjb25zdCBsb2MgPSB3aW5kb3cubG9jYXRpb247CisgICAgY29uc3Qgd3NfdXJpID0gKChsb2MucHJvdG9jb2wgPT09ICJodHRwczoiKSA/ICJ3c3M6Ly8iIDogIndzOi8vIikgKworICAgICAgICAgICAgICAgICAgIGxvYy5ob3N0bmFtZSArICI6IiArIGxvYy5wb3J0ICsgbG9jLnBhdGhuYW1lOworICAgIGNvbnN0IHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVFdlYlNvY2tldFRyYW5zcG9ydCh3c191cmkpOworICAgIGNvbnN0IHByb3RvY29sICA9IG5ldyBUaHJpZnQuUHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICBjb25zdCBjbGllbnQgICAgPSBuZXcgVGhyaWZ0VGVzdC5UaHJpZnRUZXN0Q2xpZW50KHByb3RvY29sKTsKKyAgICB0cmFuc3BvcnQub3BlbigpOworICA8L3NjcmlwdD4KKyAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idGVzdC1lczYuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKzwvaGVhZD4KKzxib2R5PgorICA8aDEgaWQ9InF1bml0LWhlYWRlciI+VGhyaWZ0IEphdmFzY3JpcHQgQmluZGluZ3M6IFVuaXQgVGVzdCAoPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQvYmxvYi9tYXN0ZXIvdGVzdC9UaHJpZnRUZXN0LnRocmlmdCI+VGhyaWZ0VGVzdC50aHJpZnQ8L2E+KTwvaDE+CisgIDxoMiBpZD0icXVuaXQtYmFubmVyIj48L2gyPgorICA8ZGl2IGlkPSJxdW5pdC10ZXN0cnVubmVyLXRvb2xiYXIiPjwvZGl2PgorICA8aDIgaWQ9InF1bml0LXVzZXJBZ2VudCI+PC9oMj4KKyAgPG9sIGlkPSJxdW5pdC10ZXN0cyI+PGxpPjwhLS0gZ2V0IHZhbGlkIHhodG1sIHN0cmljdC0tPjwvbGk+PC9vbD4KKyAgPCEtLSBVbmNvbW1lbnQgdGhpcyB0byBjaGVjayB0aGUgdmFsaWRpdHkuIFRoaXMgc2lnbmlmaWNhbnRseSBzbG93cyBkb3duIHRoZSB0ZXN0LgorICA8cD4KKyAgICAgIDxhIGhyZWY9Imh0dHA6Ly92YWxpZGF0b3IudzMub3JnL2NoZWNrL3JlZmVyZXIiPjxpbWcKKyAgICAgICAgICBzcmM9Imh0dHA6Ly93d3cudzMub3JnL0ljb25zL3ZhbGlkLXhodG1sMTAiCisgICAgICAgICAgYWx0PSJWYWxpZCBYSFRNTCAxLjAhIiBoZWlnaHQ9IjMxIiB3aWR0aD0iODgiIC8+PC9hPgorICA8L3A+CisgIC0tPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3QvdGVzdC1lczYuanMgYi9saWIvanMvdGVzdC90ZXN0LWVzNi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDUxNzFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzL3Rlc3QvdGVzdC1lczYuanMKQEAgLTAsMCArMSwzNzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyAvKiBqc2hpbnQgLVcxMDAgKi8KKworLyoKKyAqIEZ1bGx5IEFzeW5jIEphdmFTY3JpcHQgdGVzdCBzdWl0ZSBmb3IgVGhyaWZ0VGVzdC50aHJpZnQuCisgKiBUaGVzZSB0ZXN0cyBhcmUgZGVzaWduZWQgdG8gZXhlcmNpc2UgdGhlIFdlYlNvY2tldCB0cmFuc3BvcnQKKyAqICh3aGljaCBpcyBleGNsdXNpdmVseSBhc3luYykuCisgKgorICogVG8gY29tcGlsZSBjbGllbnQgY29kZSBmb3IgdGhpcyB0ZXN0IHVzZToKKyAqICAgICAgJCB0aHJpZnQgLWdlbiBqczplczYgVGhyaWZ0VGVzdC50aHJpZnQKKyAqLworCisKKworLy8gYWxsIExhbmd1YWdlcyBpbiBVVEYtOAorCitjb25zdCBzdHJpbmdUZXN0ID0gIkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvbsOpcywg2KfZhNi52LHYqNmK2KksINmF2LXYsdmJLCBBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXrJmXJiYXljYW4sINCR0LDRiNKh0L7RgNGCLCBCb2FyaXNjaCwgxb1lbWFpdMSXxaFrYSwg0JHQtdC70LDRgNGD0YHQutCw0Y8sINCR0LXQu9Cw0YDRg9GB0LrQsNGPICjRgtCw0YDQsNGI0LrQtdCy0ZbRhtCwKSwg0JHRitC70LPQsNGA0YHQutC4LCBCYW1hbmFua2FuLCDgpqzgpr7gpoLgprLgpr4sIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsw6AsIE3DrG5nLWTElcykbmctbmfhubPMhCwg0J3QvtGF0YfQuNC50L0sIENlYnVhbm8sIOGPo+GOs+GOqSwgxIxlc2t5LCDQodC70L7QstGjzIHQvdGM0YHQutGKIC8g4rCU4rCO4rCR4rCC4rCh4rCQ4rCg4rCU4rCN4rCfLCDQp9OR0LLQsNGI0LvQsCwgQ3ltcmFlZywgRGFuc2ssIFphemFraSwg3oveqN6I3qzegN6o3oTept6Q3rAsIM6VzrvOu863zr3Ouc66zqwsIEVtaWxpw6BuIGUgcnVtYWduw7JsLCBFbmdsaXNoLCBFc3BlcmFudG8sIEVzcGHDsW9sLCBFZXN0aSwgRXVza2FyYSwg2YHYp9ix2LPbjCwgU3VvbWksIFbDtXJvLCBGw7hyb3lza3QsIEZyYW7Dp2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwg6LSb6KqeLCBHw6BpZGhsaWcsIEdhbGVnbywgQXZhw7FlJ+G6vSwg4KqX4KuB4Kqc4Kqw4Kq+4Kqk4KuALCBHYWVsZywg16LXkdeo15nXqiwg4KS54KS/4KSo4KWN4KSm4KWALCBGaWppIEhpbmRpLCBIcnZhdHNraSwgS3JlecOybCBheWlzeWVuLCBNYWd5YXIsINWA1aHVtdWl1oDVpdW2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwgSWxva2FubywgSWRvLCDDjXNsZW5za2EsIEl0YWxpYW5vLCDml6XmnKzoqp4sIExvamJhbiwgQmFzYSBKYXdhLCDhg6Xhg5Dhg6Dhg5fhg6Phg5rhg5gsIEtvbmdvLCBLYWxhYWxsaXN1dCwg4LKV4LKo4LON4LKo4LKhLCDtlZzqta3slrQsINCa0YrQsNGA0LDRh9Cw0Lkt0JzQsNC70LrRitCw0YAsIFJpcG9hcmlzY2gsIEt1cmTDriwg0JrQvtC80LgsIEtlcm5ld2VrLCDQmtGL0YDQs9GL0LfRh9CwLCBMYXRpbmEsIExhZGlubywgTMOrdHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ8OhbGEsIOC6peC6suC6pywgTGlldHV2acWzLCBMYXR2aWXFoXUsIEJhc2EgQmFueXVtYXNhbiwgTWFsYWdhc3ksINCc0LDQutC10LTQvtC90YHQutC4LCDgtK7gtLLgtK/gtL7gtLPgtIIsIOCkruCksOCkvuCkoOClgCwgQmFoYXNhIE1lbGF5dSwg2YXYp9iy2ZDYsdmI2YbbjCwgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIOCkqOClh+CkquCkvuCksiDgpK3gpL7gpLfgpL4sIE5lZGVybGFuZHMsIOKAqk5vcnNrIChueW5vcnNrKeKArCwg4oCqTm9yc2sgKGJva23DpWwp4oCsLCBOb3Vvcm1hbmQsIERpbsOpIGJpemFhZCwgT2NjaXRhbiwg0JjRgNC+0L3QsNGDLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBOb3JmdWsgLyBQaXRrZXJuLCBQb2xza2ksINm+2YbYrNin2KjbjCwg2b7amtiq2YgsIFBvcnR1Z3XDqnMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbcOibsSDLCDQoNGD0YHRgdC60LjQuSwg0KHQsNGF0LAg0YLRi9C70LAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTw6FtZWdpZWxsYSwgU2ltcGxlIEVuZ2xpc2gsIFNsb3ZlbsSNaW5hLCBTbG92ZW7FocSNaW5hLCDQodGA0L/RgdC60LggLyBTcnBza2ksIFNlZWx0ZXJzaywgU3ZlbnNrYSwgS2lzd2FoaWxpLCDgrqTgrq7grr/grrTgr40sIOCwpOCxhuCwsuCxgeCwl+CxgSwg0KLQvtK30LjQutOjLCDguYTguJfguKIsIFTDvHJrbWVuw6dlLCBUYWdhbG9nLCBUw7xya8OnZSwg0KLQsNGC0LDRgNGH0LAvVGF0YXLDp2EsINCj0LrRgNCw0ZfQvdGB0YzQutCwLCDYp9ix2K/ZiCwgVGnhur9uZyBWaeG7h3QsIFZvbGFww7xrLCBXYWxvbiwgV2luYXJheSwg5ZC06K+tLCBpc2lYaG9zYSwg15nXmda015PXmdepLCBZb3LDuWLDoSwgWmXDqnV3cywg5Lit5paHLCBCw6JuLWzDom0tZ8O6LCDnsrXoqp4iOworCitmdW5jdGlvbiBjaGVja1JlY3Vyc2l2ZWx5KGFzc2VydCwgbWFwMSwgbWFwMikgeworICBpZiAodHlwZW9mIG1hcDEgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIG1hcDIgIT09ICdmdW5jdGlvbicpIHsKKyAgICBpZiAoIW1hcDEgfHwgdHlwZW9mIG1hcDEgIT09ICdvYmplY3QnKSB7CisgICAgICAgIGFzc2VydC5lcXVhbChtYXAxLCBtYXAyKTsKKyAgICB9IGVsc2UgeworICAgICAgZm9yICh2YXIga2V5IGluIG1hcDEpIHsKKyAgICAgICAgY2hlY2tSZWN1cnNpdmVseShhc3NlcnQsIG1hcDFba2V5XSwgbWFwMltrZXldKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworUVVuaXQubW9kdWxlKCdCYXNlIFR5cGVzJyk7CisKKyAgUVVuaXQudGVzdCgnVm9pZCcsIGZ1bmN0aW9uKCBhc3NlcnQgKSB7CisgICAgYXNzZXJ0LmV4cGVjdCgxKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgY2xpZW50LnRlc3RWb2lkKCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIHVuZGVmaW5lZCk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisgIFFVbml0LnRlc3QoJ1N0cmluZycsIGZ1bmN0aW9uKCBhc3NlcnQgKSB7CisgICAgYXNzZXJ0LmV4cGVjdCgzKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKDMpOworICAgIGNsaWVudC50ZXN0U3RyaW5nKCcnKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsICcnKTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgICAgY2xpZW50LnRlc3RTdHJpbmcoc3RyaW5nVGVzdCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBzdHJpbmdUZXN0KTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgICAgdmFyIHNwZWNpYWxDaGFyYWN0ZXJzID0gJ3F1b3RlOiBcIiBiYWNrc2xhc2g6JyArCisgICAgICAgICAgJyBmb3J3YXJkc2xhc2gtZXNjYXBlZDogXC8gJyArCisgICAgICAgICAgJyBiYWNrc3BhY2U6IFxiIGZvcm1mZWVkOiBcZiBuZXdsaW5lOiBcbiByZXR1cm46IFxyIHRhYjogJyArCisgICAgICAgICAgJyBub3ctYWxsLW9mLXRoZW0tdG9nZXRoZXI6ICJcXFwvXGJcblxyXHQnICsKKyAgICAgICAgICAnIG5vdy1hLWJ1bmNoLW9mLWp1bms6ICFAIyQlJigpKCYlJCN7fXt9PD48PjwnOworICAgIGNsaWVudC50ZXN0U3RyaW5nKHNwZWNpYWxDaGFyYWN0ZXJzKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIHNwZWNpYWxDaGFyYWN0ZXJzKTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisgIFFVbml0LnRlc3QoJ0RvdWJsZScsIGZ1bmN0aW9uKCBhc3NlcnQgKSB7CisgICAgYXNzZXJ0LmV4cGVjdCg0KTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKDQpOworICAgIGNsaWVudC50ZXN0RG91YmxlKDApLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgMCk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICAgIGNsaWVudC50ZXN0RG91YmxlKC0xKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIC0xKTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgICAgY2xpZW50LnRlc3REb3VibGUoMy4xNCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCAzLjE0KTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgICAgY2xpZW50LnRlc3REb3VibGUoTWF0aC5wb3coMiwgNjApKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIE1hdGgucG93KDIsIDYwKSk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKyAgLy8gVE9ETzogYWRkIHRlc3RCaW5hcnkoKQorICBRVW5pdC50ZXN0KCdCeXRlJywgZnVuY3Rpb24oIGFzc2VydCApIHsKKyAgICBhc3NlcnQuZXhwZWN0KDIpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoMik7CisgICAgY2xpZW50LnRlc3RCeXRlKDApLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgMCk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICAgIGNsaWVudC50ZXN0Qnl0ZSgweDAxKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIDB4MDEpOworICAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisgIFFVbml0LnRlc3QoJ0kzMicsIGZ1bmN0aW9uKCBhc3NlcnQgKSB7CisgICAgYXNzZXJ0LmV4cGVjdCgzKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKDMpOworICAgIGNsaWVudC50ZXN0STMyKDApLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgMCk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICAgIGNsaWVudC50ZXN0STMyKE1hdGgucG93KDIsIDMwKSkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBNYXRoLnBvdygyLCAzMCkpOworICAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgICBjbGllbnQudGVzdEkzMigtTWF0aC5wb3coMiwgMzApKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIC1NYXRoLnBvdygyLCAzMCkpOworICAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisgIFFVbml0LnRlc3QoJ0k2NCcsIGZ1bmN0aW9uKCBhc3NlcnQgKSB7CisgICAgYXNzZXJ0LmV4cGVjdCgzKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKDMpOworICAgIGNsaWVudC50ZXN0STY0KDApLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgMCk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjAgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKKyAgICBjbGllbnQudGVzdEk2NChNYXRoLnBvdygyLCA1MikpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgTWF0aC5wb3coMiwgNTIpKTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgICAgY2xpZW50LnRlc3RJNjQoLU1hdGgucG93KDIsIDUyKSkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCAtTWF0aC5wb3coMiwgNTIpKTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisKK1FVbml0Lm1vZHVsZSgnU3RydWN0dXJlZCBUeXBlcycpOworCisgIFFVbml0LnRlc3QoJ1N0cnVjdCcsIGZ1bmN0aW9uKCBhc3NlcnQgKSB7CisgICAgYXNzZXJ0LmV4cGVjdCg1KTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgdmFyIHN0cnVjdFRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdCgpOworICAgIHN0cnVjdFRlc3RJbnB1dC5zdHJpbmdfdGhpbmcgPSAnd29ya2VkJzsKKyAgICBzdHJ1Y3RUZXN0SW5wdXQuYnl0ZV90aGluZyA9IDB4MDE7CisgICAgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsIDMwKTsKKyAgICAvL1RoaXMgaXMgdXN1YWxseSAyXjYwIGJ1dCBKUyBjYW5ub3QgcmVwcmVzZW50IGFueXRoaW5nIG92ZXIgMl41MiBhY2N1cmF0ZWx5CisgICAgc3RydWN0VGVzdElucHV0Lmk2NF90aGluZyA9IE1hdGgucG93KDIsIDUyKTsKKworICAgIGNsaWVudC50ZXN0U3RydWN0KHN0cnVjdFRlc3RJbnB1dCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuc3RyaW5nX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuc3RyaW5nX3RoaW5nKTsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuYnl0ZV90aGluZywgc3RydWN0VGVzdElucHV0LmJ5dGVfdGhpbmcpOworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5pMzJfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5pMzJfdGhpbmcpOworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5pNjRfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5pNjRfdGhpbmcpOworICAgICAgYXNzZXJ0LmVxdWFsKEpTT04uc3RyaW5naWZ5KHJlc3VsdCksIEpTT04uc3RyaW5naWZ5KHN0cnVjdFRlc3RJbnB1dCkpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKworICBRVW5pdC50ZXN0KCdOZXN0JywgZnVuY3Rpb24oIGFzc2VydCApIHsKKyAgICBhc3NlcnQuZXhwZWN0KDcpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICB2YXIgeHRyVGVzdElucHV0ID0gbmV3IFRocmlmdFRlc3QuWHRydWN0KCk7CisgICAgeHRyVGVzdElucHV0LnN0cmluZ190aGluZyA9ICd3b3JrZWQnOworICAgIHh0clRlc3RJbnB1dC5ieXRlX3RoaW5nID0gMHgwMTsKKyAgICB4dHJUZXN0SW5wdXQuaTMyX3RoaW5nID0gTWF0aC5wb3coMiwgMzApOworICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjAgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKKyAgICB4dHJUZXN0SW5wdXQuaTY0X3RoaW5nID0gTWF0aC5wb3coMiwgNTIpOworCisgICAgdmFyIG5lc3RUZXN0SW5wdXQgPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QyKCk7CisgICAgbmVzdFRlc3RJbnB1dC5ieXRlX3RoaW5nID0gMHgwMjsKKyAgICBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZyA9IHh0clRlc3RJbnB1dDsKKyAgICBuZXN0VGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsIDE1KTsKKworICAgIGNsaWVudC50ZXN0TmVzdChuZXN0VGVzdElucHV0KS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5ieXRlX3RoaW5nLCBuZXN0VGVzdElucHV0LmJ5dGVfdGhpbmcpOworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcpOworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5zdHJ1Y3RfdGhpbmcuYnl0ZV90aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuYnl0ZV90aGluZyk7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LnN0cnVjdF90aGluZy5pMzJfdGhpbmcsIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nLmkzMl90aGluZyk7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LnN0cnVjdF90aGluZy5pNjRfdGhpbmcsIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nLmk2NF90aGluZyk7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LmkzMl90aGluZywgbmVzdFRlc3RJbnB1dC5pMzJfdGhpbmcpOworICAgICAgYXNzZXJ0LmVxdWFsKEpTT04uc3RyaW5naWZ5KHJlc3VsdCksIEpTT04uc3RyaW5naWZ5KG5lc3RUZXN0SW5wdXQpKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKKyAgUVVuaXQudGVzdCgnTWFwJywgZnVuY3Rpb24oIGFzc2VydCApIHsKKyAgICBhc3NlcnQuZXhwZWN0KDMpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICB2YXIgbWFwVGVzdElucHV0ID0gezc6IDc3LCA4OiA4OCwgOTogOTl9OworCisgICAgY2xpZW50LnRlc3RNYXAobWFwVGVzdElucHV0KS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgZm9yICh2YXIga2V5IGluIHJlc3VsdCkgeworICAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0W2tleV0sIG1hcFRlc3RJbnB1dFtrZXldKTsKKyAgICAgIH0KKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKKyAgUVVuaXQudGVzdCgnU3RyaW5nTWFwJywgZnVuY3Rpb24oIGFzc2VydCApIHsKKyAgICBhc3NlcnQuZXhwZWN0KDYpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICB2YXIgbWFwVGVzdElucHV0ID0geworICAgICAgJ2EnOiAnMTIzJywgJ2EgYic6ICd3aXRoIHNwYWNlcyAnLCAnc2FtZSc6ICdzYW1lJywgJzAnOiAnbnVtZXJpYyBrZXknLAorICAgICAgJ2xvbmdWYWx1ZSc6IHN0cmluZ1Rlc3QsIHN0cmluZ1Rlc3Q6ICdsb25nIGtleScKKyAgICB9OworCisgICAgY2xpZW50LnRlc3RTdHJpbmdNYXAobWFwVGVzdElucHV0KS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgZm9yICh2YXIga2V5IGluIHJlc3VsdCkgeworICAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0W2tleV0sIG1hcFRlc3RJbnB1dFtrZXldKTsKKyAgICAgIH0KKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKKyAgUVVuaXQudGVzdCgnU2V0JywgZnVuY3Rpb24oIGFzc2VydCApIHsKKyAgICBhc3NlcnQuZXhwZWN0KDEpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICB2YXIgc2V0VGVzdElucHV0ID0gWzEsIDIsIDNdOworICAgIGNsaWVudC50ZXN0U2V0KHNldFRlc3RJbnB1dCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5vayhyZXN1bHQsIHNldFRlc3RJbnB1dCk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisgIFFVbml0LnRlc3QoJ0xpc3QnLCBmdW5jdGlvbiggYXNzZXJ0ICkgeworICAgIGFzc2VydC5leHBlY3QoMSk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIHZhciBsaXN0VGVzdElucHV0ID0gWzEsIDIsIDNdOworICAgIGNsaWVudC50ZXN0TGlzdChsaXN0VGVzdElucHV0KS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0Lm9rKHJlc3VsdCwgbGlzdFRlc3RJbnB1dCk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisgIFFVbml0LnRlc3QoJ0VudW0nLCBmdW5jdGlvbiggYXNzZXJ0ICkgeworICAgIGFzc2VydC5leHBlY3QoMSk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNsaWVudC50ZXN0RW51bShUaHJpZnRUZXN0Lk51bWJlcnouT05FKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgVGhyaWZ0VGVzdC5OdW1iZXJ6Lk9ORSk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisgIFFVbml0LnRlc3QoJ1R5cGVEZWYnLCBmdW5jdGlvbiggYXNzZXJ0ICkgeworICAgIGFzc2VydC5leHBlY3QoMSk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNsaWVudC50ZXN0VHlwZWRlZig2OSkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIDY5KTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKKworUVVuaXQubW9kdWxlKCdkZWVwZXIhJyk7CisKKyAgUVVuaXQudGVzdCgnTWFwTWFwJywgZnVuY3Rpb24oIGFzc2VydCApIHsKKyAgICBhc3NlcnQuZXhwZWN0KDE2KTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgdmFyIG1hcE1hcFRlc3RFeHBlY3RlZFJlc3VsdCA9IHsKKyAgICAgICc0JzogeycxJzogMSwgJzInOiAyLCAnMyc6IDMsICc0JzogNH0sCisgICAgICAnLTQnOiB7Jy00JzogLTQsICctMyc6IC0zLCAnLTInOiAtMiwgJy0xJzogLTF9CisgICAgfTsKKworICAgIGNsaWVudC50ZXN0TWFwTWFwKDEpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBmb3IgKHZhciBrZXkgaW4gcmVzdWx0KSB7CisgICAgICAgIGZvciAodmFyIGtleTIgaW4gcmVzdWx0W2tleV0pIHsKKyAgICAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0W2tleV1ba2V5Ml0sIG1hcE1hcFRlc3RFeHBlY3RlZFJlc3VsdFtrZXldW2tleTJdKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgY2hlY2tSZWN1cnNpdmVseShhc3NlcnQsIHJlc3VsdCwgbWFwTWFwVGVzdEV4cGVjdGVkUmVzdWx0KTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKKworUVVuaXQubW9kdWxlKCdFeGNlcHRpb24nKTsKKworICBRVW5pdC50ZXN0KCdYY2VwdGlvbicsIGZ1bmN0aW9uKCBhc3NlcnQgKSB7CisgICAgYXNzZXJ0LmV4cGVjdCgyKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oJ1hjZXB0aW9uJykudGhlbihmdW5jdGlvbihyZXMpIHsKKyAgICAgIGFzc2VydC5vayhmYWxzZSk7CisgICAgfSkuY2F0Y2goZnVuY3Rpb24oZSkgeworCisgICAgICBjb25zb2xlLmxvZyhgRXhjZXB0aW9uIGV4Y2VwdGlvbiBlYCk7CisgICAgICBjb25zb2xlLmxvZyhlKTsKKyAgICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGUsIG51bGwsIDIpKTsKKworICAgICAgYXNzZXJ0LmVxdWFsKGUuZXJyb3JDb2RlLCAxMDAxKTsKKyAgICAgIGFzc2VydC5lcXVhbChlLm1lc3NhZ2UsICdYY2VwdGlvbicpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKworICBRVW5pdC50ZXN0KCdubyBFeGNlcHRpb24nLCBmdW5jdGlvbiggYXNzZXJ0ICkgeworICAgIGFzc2VydC5leHBlY3QoMSk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCdubyBFeGNlcHRpb24nKS50aGVuKGZ1bmN0aW9uKGUpIHsKKyAgICAgIGFzc2VydC5vayghZSk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCitRVW5pdC5tb2R1bGUoJ0luc2FuaXR5Jyk7CisKKyAgUVVuaXQudGVzdCgndGVzdEluc2FuaXR5JywgZnVuY3Rpb24oIGFzc2VydCApIHsKKyAgICBhc3NlcnQuZXhwZWN0KDI0KTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgdmFyIGluc2FuaXR5ID0geworICAgICAgJzEnOiB7CisgICAgICAgICcyJzogeworICAgICAgICAgICd1c2VyTWFwJzogeyAnNSc6IDUsICc4JzogOCB9LAorICAgICAgICAgICd4dHJ1Y3RzJzogW3sKKyAgICAgICAgICAgICAgJ3N0cmluZ190aGluZyc6ICdHb29kYnllNCcsCisgICAgICAgICAgICAgICdieXRlX3RoaW5nJzogNCwKKyAgICAgICAgICAgICAgJ2kzMl90aGluZyc6IDQsCisgICAgICAgICAgICAgICdpNjRfdGhpbmcnOiA0CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAnc3RyaW5nX3RoaW5nJzogJ0hlbGxvMicsCisgICAgICAgICAgICAgICdieXRlX3RoaW5nJzogMiwKKyAgICAgICAgICAgICAgJ2kzMl90aGluZyc6IDIsCisgICAgICAgICAgICAgICdpNjRfdGhpbmcnOiAyCisgICAgICAgICAgICB9CisgICAgICAgICAgXQorICAgICAgICB9LAorICAgICAgICAnMyc6IHsKKyAgICAgICAgICAndXNlck1hcCc6IHsgJzUnOiA1LCAnOCc6IDggfSwKKyAgICAgICAgICAneHRydWN0cyc6IFt7CisgICAgICAgICAgICAgICdzdHJpbmdfdGhpbmcnOiAnR29vZGJ5ZTQnLAorICAgICAgICAgICAgICAnYnl0ZV90aGluZyc6IDQsCisgICAgICAgICAgICAgICdpMzJfdGhpbmcnOiA0LAorICAgICAgICAgICAgICAnaTY0X3RoaW5nJzogNAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgJ3N0cmluZ190aGluZyc6ICdIZWxsbzInLAorICAgICAgICAgICAgICAnYnl0ZV90aGluZyc6IDIsCisgICAgICAgICAgICAgICdpMzJfdGhpbmcnOiAyLAorICAgICAgICAgICAgICAnaTY0X3RoaW5nJzogMgorICAgICAgICAgICAgfQorICAgICAgICAgIF0KKyAgICAgICAgfQorICAgICAgfSwKKyAgICAgICcyJzogeyAnNic6IHsgJ3VzZXJNYXAnOiBudWxsLCAneHRydWN0cyc6IG51bGwgfSB9CisgICAgfTsKKyAgICBjbGllbnQudGVzdEluc2FuaXR5KG5ldyBUaHJpZnRUZXN0Lkluc2FuaXR5KCkpLnRoZW4oZnVuY3Rpb24ocmVzKSB7CisgICAgICBhc3NlcnQub2socmVzLCBKU09OLnN0cmluZ2lmeShyZXMpKTsKKyAgICAgIGFzc2VydC5vayhpbnNhbml0eSwgSlNPTi5zdHJpbmdpZnkoaW5zYW5pdHkpKTsKKyAgICAgIGNoZWNrUmVjdXJzaXZlbHkoYXNzZXJ0LCByZXMsIGluc2FuaXR5KTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKK1FVbml0Lm1vZHVsZSgnT25ld2F5Jyk7CisgIFFVbml0LnRlc3QoJ3Rlc3RPbmV3YXknLCBmdW5jdGlvbiggYXNzZXJ0ICkgeworICAgIGFzc2VydC5leHBlY3QoMSk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNsaWVudC50ZXN0T25ld2F5KDEpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCB1bmRlZmluZWQpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3Rlc3QtanEuanMgYi9saWIvanMvdGVzdC90ZXN0LWpxLmpzCmluZGV4IDIzZWQ2MGYuLmY2MmJiOTUgMTAwNjQ0Ci0tLSBhL2xpYi9qcy90ZXN0L3Rlc3QtanEuanMKKysrIGIvbGliL2pzL3Rlc3QvdGVzdC1qcS5qcwpAQCAtMzMsMTI2ICszMywxMjcgQEAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8valF1ZXJ5IGFzeW5jaHJvbm91cyB0ZXN0cwogalF1ZXJ5LmFqYXhTZXR1cCh7IHRpbWVvdXQ6IDAgfSk7Ci0kKGRvY3VtZW50KS5hamF4RXJyb3IoIGZ1bmN0aW9uKCkgeyBRVW5pdC5zdGFydCgpOyB9ICk7CiAKLW1vZHVsZSgialEgQXN5bmMgTWFudWFsIik7CitRVW5pdC5tb2R1bGUoJ2pRIEFzeW5jIE1hbnVhbCcpOwogCi0gIHRlc3QoInRlc3RJMzIiLCBmdW5jdGlvbigpIHsKLSAgICBleHBlY3QoIDIgKTsKLSAgICBRVW5pdC5zdG9wKCk7CisgIFFVbml0LnRlc3QoJ3Rlc3RJMzInLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDIpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoMik7CiAKLSAgICB2YXIgdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UcmFuc3BvcnQoKTsKLSAgICB2YXIgcHJvdG9jb2wgID0gbmV3IFRocmlmdC5Qcm90b2NvbCh0cmFuc3BvcnQpOwotICAgIHZhciBjbGllbnQgICAgPSBuZXcgVGhyaWZ0VGVzdC5UaHJpZnRUZXN0Q2xpZW50KHByb3RvY29sKTsKKyAgICBjb25zdCB0cmFuc3BvcnQgPSBuZXcgVGhyaWZ0LlRyYW5zcG9ydCgpOworICAgIGNvbnN0IHByb3RvY29sID0gbmV3IFRocmlmdC5Qcm90b2NvbCh0cmFuc3BvcnQpOworICAgIGNvbnN0IGNsaWVudCA9IG5ldyBUaHJpZnRUZXN0LlRocmlmdFRlc3RDbGllbnQocHJvdG9jb2wpOwogCi0gICAgdmFyIGpxeGhyID0galF1ZXJ5LmFqYXgoewotICAgICAgdXJsOiAiL3NlcnZpY2UiLAotICAgICAgZGF0YTogY2xpZW50LnNlbmRfdGVzdEkzMihNYXRoLnBvdygtMiwzMSkpLAotICAgICAgdHlwZTogIlBPU1QiLAorICAgIGNvbnN0IGpxeGhyID0galF1ZXJ5LmFqYXgoeworICAgICAgdXJsOiAnL3NlcnZpY2UnLAorICAgICAgZGF0YTogY2xpZW50LnNlbmRfdGVzdEkzMihNYXRoLnBvdygtMiwgMzEpKSwKKyAgICAgIHR5cGU6ICdQT1NUJywKICAgICAgIGNhY2hlOiBmYWxzZSwKLSAgICAgIGRhdGFUeXBlOiAidGV4dCIsCi0gICAgICBzdWNjZXNzOiBmdW5jdGlvbihyZXMpewotICAgICAgICB0cmFuc3BvcnQuc2V0UmVjdkJ1ZmZlciggcmVzICk7Ci0gICAgICAgIGVxdWFsKGNsaWVudC5yZWN2X3Rlc3RJMzIoKSwgTWF0aC5wb3coLTIsMzEpKTsKKyAgICAgIGRhdGFUeXBlOiAndGV4dCcsCisgICAgICBzdWNjZXNzOiBmdW5jdGlvbihyZXMpIHsKKyAgICAgICAgdHJhbnNwb3J0LnNldFJlY3ZCdWZmZXIocmVzKTsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC5yZWN2X3Rlc3RJMzIoKSwgTWF0aC5wb3coLTIsIDMxKSk7CisgICAgICAgIGRvbmUoKTsKICAgICAgIH0sCi0gICAgICBlcnJvcjogZnVuY3Rpb24oKSB7IG9rKGZhbHNlKTsgfSwKKyAgICAgIGVycm9yOiBmdW5jdGlvbigpIHsgYXNzZXJ0Lm9rKGZhbHNlKTsgfSwKICAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbigpIHsKLSAgICAgICAgb2sodHJ1ZSk7Ci0gICAgICAgIFFVbml0LnN0YXJ0KCk7CisgICAgICAgIGFzc2VydC5vayh0cnVlKTsKKyAgICAgICAgZG9uZSgpOwogICAgICAgfQogICAgIH0pOwogICB9KTsKIAotICB0ZXN0KCJ0ZXN0STY0IiwgZnVuY3Rpb24oKSB7Ci0gICAgZXhwZWN0KCAyICk7Ci0gICAgUVVuaXQuc3RvcCgpOworICBRVW5pdC50ZXN0KCd0ZXN0STY0JywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgyKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKDIpOwogCi0gICAgdmFyIHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVHJhbnNwb3J0KCk7Ci0gICAgdmFyIHByb3RvY29sICA9IG5ldyBUaHJpZnQuUHJvdG9jb2wodHJhbnNwb3J0KTsKLSAgICB2YXIgY2xpZW50ICAgID0gbmV3IFRocmlmdFRlc3QuVGhyaWZ0VGVzdENsaWVudChwcm90b2NvbCk7CisgICAgY29uc3QgdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UcmFuc3BvcnQoKTsKKyAgICBjb25zdCBwcm90b2NvbCA9IG5ldyBUaHJpZnQuUHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICBjb25zdCBjbGllbnQgPSBuZXcgVGhyaWZ0VGVzdC5UaHJpZnRUZXN0Q2xpZW50KHByb3RvY29sKTsKIAogICAgIGpRdWVyeS5hamF4KHsKLSAgICAgIHVybDogIi9zZXJ2aWNlIiwKKyAgICAgIHVybDogJy9zZXJ2aWNlJywKICAgICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjEgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKLSAgICAgIGRhdGE6IGNsaWVudC5zZW5kX3Rlc3RJNjQoTWF0aC5wb3coLTIsNTIpKSwKLSAgICAgIHR5cGU6ICJQT1NUIiwKKyAgICAgIGRhdGE6IGNsaWVudC5zZW5kX3Rlc3RJNjQoTWF0aC5wb3coLTIsIDUyKSksCisgICAgICB0eXBlOiAnUE9TVCcsCiAgICAgICBjYWNoZTogZmFsc2UsCi0gICAgICBkYXRhVHlwZTogInRleHQiLAotICAgICAgc3VjY2VzczogZnVuY3Rpb24ocmVzKXsKLSAgICAgICAgdHJhbnNwb3J0LnNldFJlY3ZCdWZmZXIoIHJlcyApOworICAgICAgZGF0YVR5cGU6ICd0ZXh0JywKKyAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKHJlcykgeworICAgICAgICB0cmFuc3BvcnQuc2V0UmVjdkJ1ZmZlcihyZXMpOwogICAgICAgICAvL1RoaXMgaXMgdXN1YWxseSAyXjYxIGJ1dCBKUyBjYW5ub3QgcmVwcmVzZW50IGFueXRoaW5nIG92ZXIgMl41MiBhY2N1cmF0ZWx5Ci0gICAgICAgIGVxdWFsKGNsaWVudC5yZWN2X3Rlc3RJNjQoKSwgTWF0aC5wb3coLTIsNTIpKTsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC5yZWN2X3Rlc3RJNjQoKSwgTWF0aC5wb3coLTIsIDUyKSk7CisgICAgICAgIGRvbmUoKTsKICAgICAgIH0sCi0gICAgICBlcnJvcjogZnVuY3Rpb24oKSB7IG9rKGZhbHNlKTsgfSwKKyAgICAgIGVycm9yOiBmdW5jdGlvbigpIHsgYXNzZXJ0Lm9rKGZhbHNlKTsgfSwKICAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbigpIHsKLSAgICAgICAgb2sodHJ1ZSk7Ci0gICAgICAgIFFVbml0LnN0YXJ0KCk7CisgICAgICAgIGFzc2VydC5vayh0cnVlKTsKKyAgICAgICAgZG9uZSgpOwogICAgICAgfQogICAgIH0pOwogICB9KTsKIAogCi1tb2R1bGUoImpRIEFzeW5jIik7Ci0gIHRlc3QoIkkzMiIsIGZ1bmN0aW9uKCkgewotICAgIGV4cGVjdCggMyApOworUVVuaXQubW9kdWxlKCdqUSBBc3luYycpOworICBRVW5pdC50ZXN0KCdJMzInLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDMpOwogCi0gICAgUVVuaXQuc3RvcCgpOwotICAgIGNsaWVudC50ZXN0STMyKE1hdGgucG93KDIsMzApLCBmdW5jdGlvbihyZXN1bHQpIHsKLSAgICAgIGVxdWFsKHJlc3VsdCwgTWF0aC5wb3coMiwzMCkpOwotICAgICAgUVVuaXQuc3RhcnQoKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKDMpOworICAgIGNsaWVudC50ZXN0STMyKE1hdGgucG93KDIsIDMwKSwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBNYXRoLnBvdygyLCAzMCkpOworICAgICAgZG9uZSgpOwogICAgIH0pOwogCi0gICAgUVVuaXQuc3RvcCgpOwotICAgIHZhciBqcXhociA9IGNsaWVudC50ZXN0STMyKE1hdGgucG93KC0yLDMxKSwgZnVuY3Rpb24ocmVzdWx0KSB7Ci0gICAgICBlcXVhbChyZXN1bHQsIE1hdGgucG93KC0yLDMxKSk7CisgICAgY29uc3QganF4aHIgPSBjbGllbnQudGVzdEkzMihNYXRoLnBvdygtMiwgMzEpLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIE1hdGgucG93KC0yLCAzMSkpOworICAgICAgZG9uZSgpOwogICAgIH0pOwogCiAgICAganF4aHIuc3VjY2VzcyhmdW5jdGlvbihyZXN1bHQpIHsKLSAgICAgIGVxdWFsKHJlc3VsdCwgTWF0aC5wb3coLTIsMzEpKTsKLSAgICAgIFFVbml0LnN0YXJ0KCk7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBNYXRoLnBvdygtMiwgMzEpKTsKKyAgICAgIGRvbmUoKTsKICAgICB9KTsKICAgfSk7CiAKLSAgdGVzdCgiSTY0IiwgZnVuY3Rpb24oKSB7Ci0gICAgZXhwZWN0KCA0ICk7CisgIFFVbml0LnRlc3QoJ0k2NCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoNCk7CiAKLSAgICBRVW5pdC5zdG9wKCk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYyg0KTsKICAgICAvL1RoaXMgaXMgdXN1YWxseSAyXjYwIGJ1dCBKUyBjYW5ub3QgcmVwcmVzZW50IGFueXRoaW5nIG92ZXIgMl41MiBhY2N1cmF0ZWx5Ci0gICAgY2xpZW50LnRlc3RJNjQoTWF0aC5wb3coMiw1MiksIGZ1bmN0aW9uKHJlc3VsdCkgewotICAgICAgZXF1YWwocmVzdWx0LCBNYXRoLnBvdygyLDUyKSk7Ci0gICAgICBRVW5pdC5zdGFydCgpOworICAgIGNsaWVudC50ZXN0STY0KE1hdGgucG93KDIsIDUyKSwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBNYXRoLnBvdygyLCA1MikpOworICAgICAgZG9uZSgpOwogICAgIH0pOwogCi0gICAgUVVuaXQuc3RvcCgpOwogICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjAgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKLSAgICBjbGllbnQudGVzdEk2NChNYXRoLnBvdygtMiw1MiksIGZ1bmN0aW9uKHJlc3VsdCkgewotICAgICAgZXF1YWwocmVzdWx0LCBNYXRoLnBvdygtMiw1MikpOworICAgIGNsaWVudC50ZXN0STY0KE1hdGgucG93KC0yLCA1MiksIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgTWF0aC5wb3coLTIsIDUyKSk7CisgICAgICBkb25lKCk7CiAgICAgfSkKLSAgICAuZXJyb3IoIGZ1bmN0aW9uKHhociwgc3RhdHVzLCBlKSB7ICBvayhmYWxzZSwgZS5tZXNzYWdlKTsgfSApCisgICAgLmVycm9yKGZ1bmN0aW9uKHhociwgc3RhdHVzLCBlKSB7IGFzc2VydC5vayhmYWxzZSwgZS5tZXNzYWdlKTsgfSkKICAgICAuc3VjY2VzcyhmdW5jdGlvbihyZXN1bHQpIHsKICAgICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjAgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKLSAgICAgIGVxdWFsKHJlc3VsdCwgTWF0aC5wb3coLTIsNTIpKTsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIE1hdGgucG93KC0yLCA1MikpOworICAgICAgZG9uZSgpOwogICAgIH0pCiAgICAgLmNvbXBsZXRlKGZ1bmN0aW9uKCkgewotICAgICAgb2sodHJ1ZSk7Ci0gICAgICBRVW5pdC5zdGFydCgpOworICAgICAgYXNzZXJ0Lm9rKHRydWUpOworICAgICAgZG9uZSgpOwogICAgIH0pOwogICB9KTsKIAotICB0ZXN0KCJYY2VwdGlvbiIsIGZ1bmN0aW9uKCkgewotICAgIGV4cGVjdCggMiApOworICBRVW5pdC50ZXN0KCdYY2VwdGlvbicsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMik7CiAKLSAgICBRVW5pdC5zdG9wKCk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygyKTsKIAotICAgIHZhciBkZmQgPSBjbGllbnQudGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iLCBmdW5jdGlvbihyZXN1bHQpIHsKLSAgICAgIG9rKGZhbHNlKTsKLSAgICAgIFFVbml0LnN0YXJ0KCk7CisgICAgY29uc3QgZGZkID0gY2xpZW50LnRlc3RFeGNlcHRpb24oJ1hjZXB0aW9uJywgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQub2soZmFsc2UpOworICAgICAgZG9uZSgpOwogICAgIH0pCi0gICAgLmVycm9yKGZ1bmN0aW9uKHhociwgc3RhdHVzLCBlKXsKLSAgICAgIGVxdWFsKGUuZXJyb3JDb2RlLCAxMDAxKTsKLSAgICAgIGVxdWFsKGUubWVzc2FnZSwgIlhjZXB0aW9uIik7Ci0gICAgICAvL1FVbml0LnN0YXJ0KCk7Ci0gICAgICAvL05vdGUgc3RhcnQgaXMgbm90IHJlcXVpcmVkIGhlcmUgYmVjYXVzZToKLSAgICAgIC8vJChkb2N1bWVudCkuYWpheEVycm9yKCBmdW5jdGlvbigpIHsgUVVuaXQuc3RhcnQoKTsgfSApOworICAgIC5lcnJvcihmdW5jdGlvbih4aHIsIHN0YXR1cywgZSkgeworICAgICAgYXNzZXJ0LmVxdWFsKGUuZXJyb3JDb2RlLCAxMDAxKTsKKyAgICAgIGFzc2VydC5lcXVhbChlLm1lc3NhZ2UsICdYY2VwdGlvbicpOworICAgICAgZG9uZSgpOworICAgICAgJChkb2N1bWVudCkuYWpheEVycm9yKCBmdW5jdGlvbigpIHsgZG9uZSgpOyB9ICk7CiAgICAgfSk7CiAgIH0pOwpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3QvdGVzdC1ub2pxLmh0bWwgYi9saWIvanMvdGVzdC90ZXN0LW5vanEuaHRtbAppbmRleCA1NDFiZmZlLi40MDg0MjRlIDEwMDY0NAotLS0gYS9saWIvanMvdGVzdC90ZXN0LW5vanEuaHRtbAorKysgYi9saWIvanMvdGVzdC90ZXN0LW5vanEuaHRtbApAQCAtMjksMTUgKzI5LDE1IEBACiAgIDwhLS0gUVVuaXQgVGVzdCBmcmFtZXdvcmstLT4KICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iYnVpbGQvanMvbGliL3F1bml0LmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CiAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iYnVpbGQvanMvbGliL3F1bml0LmNzcyIgdHlwZT0idGV4dC9jc3MiIG1lZGlhPSJzY3JlZW4iIC8+Ci0gIAorCiAgIDwhLS0gdGhlIFRlc3QgU3VpdGUtLT4KICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idGVzdC5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgogICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0ZXN0LW5vanEuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KIDwvaGVhZD4KIDxib2R5PgotICA8aDEgaWQ9InF1bml0LWhlYWRlciI+VGhyaWZ0IEphdmFzY3JpcHQgQmluZGluZ3M6IFVuaXQgVGVzdCAoPGEgaHJlZj0iaHR0cHM6Ly9naXQtd2lwLXVzLmFwYWNoZS5vcmcvcmVwb3MvYXNmP3A9dGhyaWZ0LmdpdDthPWJsb2I7Zj10ZXN0L1RocmlmdFRlc3QudGhyaWZ0O2hiPUhFQUQiPlRocmlmdFRlc3QudGhyaWZ0PC9hPik8L2gxPgorICA8aDEgaWQ9InF1bml0LWhlYWRlciI+VGhyaWZ0IEphdmFzY3JpcHQgQmluZGluZ3M6IFVuaXQgVGVzdCAoPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQvYmxvYi9tYXN0ZXIvdGVzdC9UaHJpZnRUZXN0LnRocmlmdCI+VGhyaWZ0VGVzdC50aHJpZnQ8L2E+KTwvaDE+CiAgIDxoMiBpZD0icXVuaXQtYmFubmVyIj48L2gyPgotICA8ZGl2IGlkPSJxdW5pdC10ZXN0cnVubmVyLXRvb2xiYXIiPjwvZGl2PiAKKyAgPGRpdiBpZD0icXVuaXQtdGVzdHJ1bm5lci10b29sYmFyIj48L2Rpdj4KICAgPGgyIGlkPSJxdW5pdC11c2VyQWdlbnQiPjwvaDI+CiAgIDxvbCBpZD0icXVuaXQtdGVzdHMiPjxsaT48IS0tIGdldCB2YWxpZCB4aHRtbCBzdHJpY3QtLT48L2xpPjwvb2w+CiAgIDwhLS0gVW5jb21tZW50IHRoaXMgdG8gY2hlY2sgdGhlIHZhbGlkaXR5LiBUaGlzIHNpZ25pZmljYW50bHkgc2xvd3MgZG93biB0aGUgdGVzdC4KZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3Rlc3Qtbm9qcS5qcyBiL2xpYi9qcy90ZXN0L3Rlc3Qtbm9qcS5qcwppbmRleCAxOWY5ZTYxLi4yYjgwMWQyIDEwMDY0NAotLS0gYS9saWIvanMvdGVzdC90ZXN0LW5vanEuanMKKysrIGIvbGliL2pzL3Rlc3QvdGVzdC1ub2pxLmpzCkBAIC0xNyw3ICsxNyw3IEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogIC8qIGpzaGludCAtVzEwMCAqLwotIAorCiAvKgogICogSmF2YVNjcmlwdCB0ZXN0IHN1aXRlIGZvciBUaHJpZnRUZXN0LnRocmlmdC4gVGhlc2UgdGVzdHMKICAqIHdpbGwgcnVuIG9ubHkgd2l0aCBub3JtYWwgIi1nZW4ganMiIEFwYWNoZSBUaHJpZnQgaW50ZXJmYWNlcy4KQEAgLTI1LDcgKzI1LDcgQEAKICAqICAgICAgJCB0aHJpZnQgLWdlbiBqcyBUaHJpZnRUZXN0LnRocmlmdAogICoKICAqIFNlZSBhbHNvOgotICogKysgdGVzdC5qcyBmb3IgZ2VuZXJpYyB0ZXN0cyAgCisgKiArKyB0ZXN0LmpzIGZvciBnZW5lcmljIHRlc3RzCiAgKiArKyB0ZXN0LWpxLmpzIGZvciAiLWdlbiBqczpqcXVlcnkiIG9ubHkgdGVzdHMKICAqLwogCkBAIC0zMywxNyArMzMsMTYgQEAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vQXN5bmMgZXhjZXB0aW9uIHRlc3RzCiAKLW1vZHVsZSgiTm9qUSBBc3luYyIpOworUVVuaXQubW9kdWxlKCdOb2pRIEFzeW5jJyk7CiAKLSAgdGVzdCgiWGNlcHRpb24iLCBmdW5jdGlvbigpIHsKLSAgICBleHBlY3QoIDIgKTsKK1FVbml0LnRlc3QoJ1hjZXB0aW9uJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgyKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CiAKLSAgICBRVW5pdC5zdG9wKCk7Ci0KLSAgICBjbGllbnQudGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iLCBmdW5jdGlvbihyZXN1bHQpIHsKLSAgICAgIGVxdWFsKHJlc3VsdC5lcnJvckNvZGUsIDEwMDEpOwotICAgICAgZXF1YWwocmVzdWx0Lm1lc3NhZ2UsICJYY2VwdGlvbiIpOwotICAgICAgUVVuaXQuc3RhcnQoKTsKKyAgICBjbGllbnQudGVzdEV4Y2VwdGlvbignWGNlcHRpb24nLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuZXJyb3JDb2RlLCAxMDAxKTsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQubWVzc2FnZSwgJ1hjZXB0aW9uJyk7CisgICAgICBkb25lKCk7CiAgICAgfSk7CiAgIH0pOwogCmRpZmYgLS1naXQgYS9saWIvanMvdGVzdC90ZXN0Lmh0bWwgYi9saWIvanMvdGVzdC90ZXN0Lmh0bWwKaW5kZXggZWRlYzNhMy4uOGI2NzAxNCAxMDA3NTUKLS0tIGEvbGliL2pzL3Rlc3QvdGVzdC5odG1sCisrKyBiL2xpYi9qcy90ZXN0L3Rlc3QuaHRtbApAQCAtMjMsOCArMjMsOCBAQAogICA8dGl0bGU+VGhyaWZ0IEphdmFzY3JpcHQgQmluZGluZ3M6IFVuaXQgVGVzdDwvdGl0bGU+CiAKICAgPHNjcmlwdCBzcmM9ImJ1aWxkL2pzL3RocmlmdC5qcyIgICAgICAgICB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KLSAgPHNjcmlwdCBzcmM9Imdlbi1qcy9UaHJpZnRUZXN0X3R5cGVzLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KLSAgPHNjcmlwdCBzcmM9Imdlbi1qcy9UaHJpZnRUZXN0LmpzIiAgICAgICB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKyAgPHNjcmlwdCBzcmM9Imdlbi1qcy1qcXVlcnkvVGhyaWZ0VGVzdF90eXBlcy5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisgIDxzY3JpcHQgc3JjPSJnZW4tanMtanF1ZXJ5L1RocmlmdFRlc3QuanMiICAgICAgIHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgogCiAgIDwhLS0galF1ZXJ5IC0tPgogICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJidWlsZC9qcy9saWIvanF1ZXJ5LmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CkBAIC0zNCwxNiArMzQsMTEgQEAKICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJidWlsZC9qcy9saWIvcXVuaXQuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgbWVkaWE9InNjcmVlbiIgLz4KIAogICA8IS0tIHRoZSBUZXN0IFN1aXRlLS0+Ci0gIDxzY3JpcHQ+Ci0gICAgdmFyIHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVHJhbnNwb3J0KCIvc2VydmljZSIpOwotICAgIHZhciBwcm90b2NvbCAgPSBuZXcgVGhyaWZ0LlByb3RvY29sKHRyYW5zcG9ydCk7Ci0gICAgdmFyIGNsaWVudCAgICA9IG5ldyBUaHJpZnRUZXN0LlRocmlmdFRlc3RDbGllbnQocHJvdG9jb2wpOwotICA8L3NjcmlwdD4KICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idGVzdC5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgogICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0ZXN0LWpxLmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CiA8L2hlYWQ+CiA8Ym9keT4KLSAgPGgxIGlkPSJxdW5pdC1oZWFkZXIiPlRocmlmdCBKYXZhc2NyaXB0IEJpbmRpbmdzOiBVbml0IFRlc3QgKDxhIGhyZWY9Imh0dHBzOi8vZ2l0LXdpcC11cy5hcGFjaGUub3JnL3JlcG9zL2FzZj9wPXRocmlmdC5naXQ7YT1ibG9iO2Y9dGVzdC9UaHJpZnRUZXN0LnRocmlmdDtoYj1IRUFEIj5UaHJpZnRUZXN0LnRocmlmdDwvYT4pPC9oMT4KKyAgPGgxIGlkPSJxdW5pdC1oZWFkZXIiPlRocmlmdCBKYXZhc2NyaXB0IEJpbmRpbmdzOiBVbml0IFRlc3QgKDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L2Jsb2IvbWFzdGVyL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQiPlRocmlmdFRlc3QudGhyaWZ0PC9hPik8L2gxPgogICA8aDIgaWQ9InF1bml0LWJhbm5lciI+PC9oMj4KICAgPGRpdiBpZD0icXVuaXQtdGVzdHJ1bm5lci10b29sYmFyIj48L2Rpdj4KICAgPGgyIGlkPSJxdW5pdC11c2VyQWdlbnQiPjwvaDI+CmRpZmYgLS1naXQgYS9saWIvanMvdGVzdC90ZXN0LmpzIGIvbGliL2pzL3Rlc3QvdGVzdC5qcwppbmRleCBlZTE0NjEyLi5hODZhNTA5IDEwMDc1NQotLS0gYS9saWIvanMvdGVzdC90ZXN0LmpzCisrKyBiL2xpYi9qcy90ZXN0L3Rlc3QuanMKQEAgLTIzLDcgKzIzLDcgQEAKICAqIHdpbGwgcnVuIGFnYWluc3QgTm9ybWFsICgtZ2VuIGpzKSBhbmQgalF1ZXJ5ICgtZ2VuIGpzOmpxdWVyeSkKICAqIEFwYWNoZSBUaHJpZnQgaW50ZXJmYWNlcy4KICAqCi0gKiBTeW5jaHJvbm91cyBibG9ja2luZyBjYWxscyBzaG91bGQgYmUgaWRlbnRpY2FsIGluIGJvdGggCisgKiBTeW5jaHJvbm91cyBibG9ja2luZyBjYWxscyBzaG91bGQgYmUgaWRlbnRpY2FsIGluIGJvdGgKICAqIE5vcm1hbCBhbmQgalF1ZXJ5IGludGVyZmFjZXMuIEFsbCBzeW5jaHJvbm91cyB0ZXN0cyBiZWxvbmcKICAqIGhlcmUuCiAgKgpAQCAtNDcsOSArNDcsOSBAQAogICogKysgdGVzdC1qcS5qcyBmb3IgIi1nZW4ganM6anF1ZXJ5IiBvbmx5IHRlc3RzCiAgKi8KIAotdmFyIHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVHJhbnNwb3J0KCIvc2VydmljZSIpOwotdmFyIHByb3RvY29sICA9IG5ldyBUaHJpZnQuUHJvdG9jb2wodHJhbnNwb3J0KTsKLXZhciBjbGllbnQgICAgPSBuZXcgVGhyaWZ0VGVzdC5UaHJpZnRUZXN0Q2xpZW50KHByb3RvY29sKTsKK2NvbnN0IHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVHJhbnNwb3J0KCcvc2VydmljZScpOworY29uc3QgcHJvdG9jb2wgPSBuZXcgVGhyaWZ0LlByb3RvY29sKHRyYW5zcG9ydCk7Citjb25zdCBjbGllbnQgPSBuZXcgVGhyaWZ0VGVzdC5UaHJpZnRUZXN0Q2xpZW50KHByb3RvY29sKTsKIAogLy8gV29yayBhcm91bmQgZm9yIG9sZCBBUEkgdXNlZCBieSBRVW5pdEFkYXB0ZXIgb2YganNUZXN0RHJpdmVyCiBpZiAodHlwZW9mIFFVbml0LmxvZyA9PSAnZnVuY3Rpb24nKSB7CkBAIC01OCw3ICs1OCw3IEBACiAgICAgaWYgKCFkZXRhaWxzLnJlc3VsdCkgewogICAgICAgY29uc29sZS5sb2coJz09PT09PT09IEZBSUwgPT09PT09PT0nKTsKICAgICAgIGNvbnNvbGUubG9nKCdUZXN0TmFtZTogJyArIGRldGFpbHMubmFtZSk7Ci0gICAgICBkZXRhaWxzLm1lc3NhZ2UgJiYgY29uc29sZS5sb2coZGV0YWlscy5tZXNzYWdlKTsKKyAgICAgIGlmIChkZXRhaWxzLm1lc3NhZ2UpIGNvbnNvbGUubG9nKGRldGFpbHMubWVzc2FnZSk7CiAgICAgICBjb25zb2xlLmxvZygnRXhwZWN0ZWQ6ICcgKyBkZXRhaWxzLmV4cGVjdGVkKTsKICAgICAgIGNvbnNvbGUubG9nKCdBY3R1YWwgIDogJyArIGRldGFpbHMuYWN0dWFsKTsKICAgICAgIGNvbnNvbGUubG9nKCc9PT09PT09PT09PT09PT09PT09PT09Jyk7CkBAIC02NywxNTIgKzY3LDE3MCBAQAogfQogCiAvLyBhbGwgTGFuZ3VhZ2VzIGluIFVURi04Ci12YXIgc3RyaW5nVGVzdCA9ICJBZnJpa2FhbnMsIEFsZW1hbm5pc2NoLCBBcmFnb27DqXMsINin2YTYudix2KjZitipLCDZhdi12LHZiSwgQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6yZlyYmF5Y2FuLCDQkdCw0YjSodC+0YDRgiwgQm9hcmlzY2gsIMW9ZW1haXTEl8Wha2EsINCR0LXQu9Cw0YDRg9GB0LrQsNGPLCDQkdC10LvQsNGA0YPRgdC60LDRjyAo0YLQsNGA0LDRiNC60LXQstGW0YbQsCksINCR0YrQu9Cz0LDRgNGB0LrQuCwgQmFtYW5hbmthbiwg4Kas4Ka+4KaC4Kay4Ka+LCBCcmV6aG9uZWcsIEJvc2Fuc2tpLCBDYXRhbMOgLCBNw6xuZy1kxJXMpG5nLW5n4bmzzIQsINCd0L7RhdGH0LjQudC9LCBDZWJ1YW5vLCDhj6PhjrPhjqksIMSMZXNreSwg0KHQu9C+0LLRo8yB0L3RjNGB0LrRiiAvIOKwlOKwjuKwkeKwguKwoeKwkOKwoOKwlOKwjeKwnywg0KfTkdCy0LDRiNC70LAsIEN5bXJhZWcsIERhbnNrLCBaYXpha2ksIN6L3qjeiN6s3oDeqN6E3qbekN6wLCDOlc67zrvOt869zrnOus6sLCBFbWlsacOgbiBlIHJ1bWFnbsOybCwgRW5nbGlzaCwgRXNwZXJhbnRvLCBFc3Bhw7FvbCwgRWVzdGksIEV1c2thcmEsINmB2KfYsdiz24wsIFN1b21pLCBWw7VybywgRsO4cm95c2t0LCBGcmFuw6dhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIOi0m+iqniwgR8OgaWRobGlnLCBHYWxlZ28sIEF2YcOxZSfhur0sIOCql+CrgeCqnOCqsOCqvuCqpOCrgCwgR2FlbGcsINei15HXqNeZ16osIOCkueCkv+CkqOCljeCkpuClgCwgRmlqaSBIaW5kaSwgSHJ2YXRza2ksIEtyZXnDsmwgYXlpc3llbiwgTWFneWFyLCDVgNWh1bXVpdaA1aXVtiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsIElsb2thbm8sIElkbywgw41zbGVuc2thLCBJdGFsaWFubywg5pel5pys6KqeLCBMb2piYW4sIEJhc2EgSmF3YSwg4YOl4YOQ4YOg4YOX4YOj4YOa4YOYLCBLb25nbywgS2FsYWFsbGlzdXQsIOCyleCyqOCzjeCyqOCyoSwg7ZWc6rWt7Ja0LCDQmtGK0LDRgNCw0YfQsNC5LdCc0LDQu9C60YrQsNGALCBSaXBvYXJpc2NoLCBLdXJkw64sINCa0L7QvNC4LCBLZXJuZXdlaywg0JrRi9GA0LPRi9C30YfQsCwgTGF0aW5hLCBMYWRpbm8sIEzDq3R6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmfDoWxhLCDguqXgurLguqcsIExpZXR1dmnFsywgTGF0dmllxaF1LCBCYXNhIEJhbnl1bWFzYW4sIE1hbGFnYXN5LCDQnNCw0LrQtdC00L7QvdGB0LrQuCwg4LSu4LSy4LSv4LS+4LSz4LSCLCDgpK7gpLDgpL7gpKDgpYAsIEJhaGFzYSBNZWxheXUsINmF2KfYstmQ2LHZiNmG24wsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCDgpKjgpYfgpKrgpL7gpLIg4KSt4KS+4KS34KS+LCBOZWRlcmxhbmRzLCDigKpOb3JzayAobnlub3JzaynigKwsIOKAqk5vcnNrIChib2ttw6VsKeKArCwgTm91b3JtYW5kLCBEaW7DqSBiaXphYWQsIE9jY2l0YW4sINCY0YDQvtC90LDRgywgUGFwaWFtZW50dSwgRGVpdHNjaCwgTm9yZnVrIC8gUGl0a2VybiwgUG9sc2tpLCDZvtmG2KzYp9io24wsINm+2prYqtmILCBQb3J0dWd1w6pzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb23Dom7Egywg0KDRg9GB0YHQutC40LksINCh0LDRhdCwINGC0YvQu9CwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU8OhbWVnaWVsbGEsIFNpbXBsZSBFbmdsaXNoLCBTbG92ZW7EjWluYSwgU2xvdmVuxaHEjWluYSwg0KHRgNC/0YHQutC4IC8gU3Jwc2tpLCBTZWVsdGVyc2ssIFN2ZW5za2EsIEtpc3dhaGlsaSwg4K6k4K6u4K6/4K604K+NLCDgsKTgsYbgsLLgsYHgsJfgsYEsINCi0L7St9C40LrToywg4LmE4LiX4LiiLCBUw7xya21lbsOnZSwgVGFnYWxvZywgVMO8cmvDp2UsINCi0LDRgtCw0YDRh9CwL1RhdGFyw6dhLCDQo9C60YDQsNGX0L3RgdGM0LrQsCwg2KfYsdiv2YgsIFRp4bq/bmcgVmnhu4d0LCBWb2xhcMO8aywgV2Fsb24sIFdpbmFyYXksIOWQtOivrSwgaXNpWGhvc2EsINeZ15nWtNeT15nXqSwgWW9yw7liw6EsIFplw6p1d3MsIOS4reaWhywgQsOibi1sw6JtLWfDuiwg57K16KqeIjsKK2NvbnN0IHN0cmluZ1Rlc3QgPSAiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uw6lzLCDYp9mE2LnYsdio2YrYqSwg2YXYtdix2YksIEFzdHVyaWFudSwgQXltYXIgYXJ1LCBBesmZcmJheWNhbiwg0JHQsNGI0qHQvtGA0YIsIEJvYXJpc2NoLCDFvWVtYWl0xJfFoWthLCDQkdC10LvQsNGA0YPRgdC60LDRjywg0JHQtdC70LDRgNGD0YHQutCw0Y8gKNGC0LDRgNCw0YjQutC10LLRltGG0LApLCDQkdGK0LvQs9Cw0YDRgdC60LgsIEJhbWFuYW5rYW4sIOCmrOCmvuCmguCmsuCmviwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWzDoCwgTcOsbmctZMSVzKRuZy1uZ+G5s8yELCDQndC+0YXRh9C40LnQvSwgQ2VidWFubywg4Y+j4Y6z4Y6pLCDEjGVza3ksINCh0LvQvtCy0aPMgdC90YzRgdC60YogLyDisJTisI7isJHisILisKHisJDisKDisJTisI3isJ8sINCn05HQstCw0YjQu9CwLCBDeW1yYWVnLCBEYW5zaywgWmF6YWtpLCDei96o3ojerN6A3qjehN6m3pDesCwgzpXOu867zrfOvc65zrrOrCwgRW1pbGnDoG4gZSBydW1hZ27DsmwsIEVuZ2xpc2gsIEVzcGVyYW50bywgRXNwYcOxb2wsIEVlc3RpLCBFdXNrYXJhLCDZgdin2LHYs9uMLCBTdW9taSwgVsO1cm8sIEbDuHJveXNrdCwgRnJhbsOnYWlzLCBBcnBldGFuLCBGdXJsYW4sIEZyeXNrLCBHYWVpbGdlLCDotJvoqp4sIEfDoGlkaGxpZywgR2FsZWdvLCBBdmHDsWUn4bq9LCDgqpfgq4HgqpzgqrDgqr7gqqTgq4AsIEdhZWxnLCDXoteR16jXmdeqLCDgpLngpL/gpKjgpY3gpKbgpYAsIEZpamkgSGluZGksIEhydmF0c2tpLCBLcmV5w7JsIGF5aXN5ZW4sIE1hZ3lhciwg1YDVodW11aXWgNWl1bYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCBJbG9rYW5vLCBJZG8sIMONc2xlbnNrYSwgSXRhbGlhbm8sIOaXpeacrOiqniwgTG9qYmFuLCBCYXNhIEphd2EsIOGDpeGDkOGDoOGDl+GDo+GDmuGDmCwgS29uZ28sIEthbGFhbGxpc3V0LCDgspXgsqjgs43gsqjgsqEsIO2VnOq1reyWtCwg0JrRitCw0YDQsNGH0LDQuS3QnNCw0LvQutGK0LDRgCwgUmlwb2FyaXNjaCwgS3VyZMOuLCDQmtC+0LzQuCwgS2VybmV3ZWssINCa0YvRgNCz0YvQt9GH0LAsIExhdGluYSwgTGFkaW5vLCBMw6t0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nw6FsYSwg4Lql4Lqy4LqnLCBMaWV0dXZpxbMsIExhdHZpZcWhdSwgQmFzYSBCYW55dW1hc2FuLCBNYWxhZ2FzeSwg0JzQsNC60LXQtNC+0L3RgdC60LgsIOC0ruC0suC0r+C0vuC0s+C0giwg4KSu4KSw4KS+4KSg4KWALCBCYWhhc2EgTWVsYXl1LCDZhdin2LLZkNix2YjZhtuMLCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwg4KSo4KWH4KSq4KS+4KSyIOCkreCkvuCkt+CkviwgTmVkZXJsYW5kcywg4oCqTm9yc2sgKG55bm9yc2sp4oCsLCDigKpOb3JzayAoYm9rbcOlbCnigKwsIE5vdW9ybWFuZCwgRGluw6kgYml6YWFkLCBPY2NpdGFuLCDQmNGA0L7QvdCw0YMsIFBhcGlhbWVudHUsIERlaXRzY2gsIE5vcmZ1ayAvIFBpdGtlcm4sIFBvbHNraSwg2b7Zhtis2KfYqNuMLCDZvtqa2KrZiCwgUG9ydHVndcOqcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tw6JuxIMsINCg0YPRgdGB0LrQuNC5LCDQodCw0YXQsCDRgtGL0LvQsCwgU2FyZHUsIFNpY2lsaWFudSwgU2NvdHMsIFPDoW1lZ2llbGxhLCBTaW1wbGUgRW5nbGlzaCwgU2xvdmVuxI1pbmEsIFNsb3ZlbsWhxI1pbmEsINCh0YDQv9GB0LrQuCAvIFNycHNraSwgU2VlbHRlcnNrLCBTdmVuc2thLCBLaXN3YWhpbGksIOCupOCuruCuv+CutOCvjSwg4LCk4LGG4LCy4LGB4LCX4LGBLCDQotC+0rfQuNC606MsIOC5hOC4l+C4oiwgVMO8cmttZW7Dp2UsIFRhZ2Fsb2csIFTDvHJrw6dlLCDQotCw0YLQsNGA0YfQsC9UYXRhcsOnYSwg0KPQutGA0LDRl9C90YHRjNC60LAsINin2LHYr9mILCBUaeG6v25nIFZp4buHdCwgVm9sYXDDvGssIFdhbG9uLCBXaW5hcmF5LCDlkLTor60sIGlzaVhob3NhLCDXmdeZ1rTXk9eZ16ksIFlvcsO5YsOhLCBaZcOqdXdzLCDkuK3mlocsIELDom4tbMOibS1nw7osIOeyteiqniI7CiAKLWZ1bmN0aW9uIGNoZWNrUmVjdXJzaXZlbHkobWFwMSwgbWFwMikgeworZnVuY3Rpb24gY2hlY2tSZWN1cnNpdmVseShhc3NlcnQsIG1hcDEsIG1hcDIpIHsKICAgaWYgKHR5cGVvZiBtYXAxICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBtYXAyICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgaWYgKCFtYXAxIHx8IHR5cGVvZiBtYXAxICE9PSAnb2JqZWN0JykgewotICAgICAgICBlcXVhbChtYXAxLCBtYXAyKTsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKG1hcDEsIG1hcDIpOwogICAgIH0gZWxzZSB7Ci0gICAgICBmb3IgKHZhciBrZXkgaW4gbWFwMSkgewotICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5KG1hcDFba2V5XSwgbWFwMltrZXldKTsKKyAgICAgIGZvciAobGV0IGtleSBpbiBtYXAxKSB7CisgICAgICAgIGNoZWNrUmVjdXJzaXZlbHkoYXNzZXJ0LCBtYXAxW2tleV0sIG1hcDJba2V5XSk7CiAgICAgICB9CiAgICAgfQogICB9CiB9CiAKLW1vZHVsZSgiQmFzZSBUeXBlcyIpOworUVVuaXQubW9kdWxlKCdCYXNlIFR5cGVzJyk7CiAKLSAgdGVzdCgiVm9pZCIsIGZ1bmN0aW9uKCkgewotICAgIGVxdWFsKGNsaWVudC50ZXN0Vm9pZCgpLCB1bmRlZmluZWQpOworICBRVW5pdC50ZXN0KCdWb2lkJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0Vm9pZCgpLCB1bmRlZmluZWQpOwogICB9KTsKLSAgdGVzdCgiU3RyaW5nIiwgZnVuY3Rpb24oKSB7Ci0gICAgZXF1YWwoY2xpZW50LnRlc3RTdHJpbmcoJycpLCAnJyk7Ci0gICAgZXF1YWwoY2xpZW50LnRlc3RTdHJpbmcoc3RyaW5nVGVzdCksIHN0cmluZ1Rlc3QpOworICBRVW5pdC50ZXN0KCdCaW5hcnkgKFN0cmluZyknLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBsZXQgYmluYXJ5ID0gJyc7CisgICAgZm9yIChsZXQgdiA9IDI1NTsgdiA+PSAwOyAtLXYpIHsKKyAgICAgIGJpbmFyeSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHYpOworICAgIH0KKyAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnRlc3RCaW5hcnkoYmluYXJ5KSwgYmluYXJ5KTsKKyAgfSk7CisgIFFVbml0LnRlc3QoJ0JpbmFyeSAoVWludDhBcnJheSknLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBsZXQgYmluYXJ5ID0gJyc7CisgICAgZm9yIChsZXQgdiA9IDI1NTsgdiA+PSAwOyAtLXYpIHsKKyAgICAgIGJpbmFyeSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHYpOworICAgIH0KKyAgICBjb25zdCBhcnIgPSBuZXcgVWludDhBcnJheShiaW5hcnkubGVuZ3RoKTsKKyAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJpbmFyeS5sZW5ndGg7ICsraSkgeworICAgICAgYXJyW2ldID0gYmluYXJ5W2ldLmNoYXJDb2RlQXQoKTsKKyAgICB9CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0QmluYXJ5KGFyciksIGJpbmFyeSk7CisgIH0pOworICBRVW5pdC50ZXN0KCdTdHJpbmcnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnRlc3RTdHJpbmcoJycpLCAnJyk7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0U3RyaW5nKHN0cmluZ1Rlc3QpLCBzdHJpbmdUZXN0KTsKIAotICAgIHZhciBzcGVjaWFsQ2hhcmFjdGVycyA9ICdxdW90ZTogXCIgYmFja3NsYXNoOicgKworICAgIGNvbnN0IHNwZWNpYWxDaGFyYWN0ZXJzID0gJ3F1b3RlOiBcIiBiYWNrc2xhc2g6JyArCiAgICAgICAgICAgJyBmb3J3YXJkc2xhc2gtZXNjYXBlZDogXC8gJyArCiAgICAgICAgICAgJyBiYWNrc3BhY2U6IFxiIGZvcm1mZWVkOiBcZiBuZXdsaW5lOiBcbiByZXR1cm46IFxyIHRhYjogJyArCiAgICAgICAgICAgJyBub3ctYWxsLW9mLXRoZW0tdG9nZXRoZXI6ICJcXFwvXGJcblxyXHQnICsKICAgICAgICAgICAnIG5vdy1hLWJ1bmNoLW9mLWp1bms6ICFAIyQlJigpKCYlJCN7fXt9PD48PjwnOwotICAgIGVxdWFsKGNsaWVudC50ZXN0U3RyaW5nKHNwZWNpYWxDaGFyYWN0ZXJzKSxzcGVjaWFsQ2hhcmFjdGVycyk7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0U3RyaW5nKHNwZWNpYWxDaGFyYWN0ZXJzKSwgc3BlY2lhbENoYXJhY3RlcnMpOwogICB9KTsKLSAgdGVzdCgiRG91YmxlIiwgZnVuY3Rpb24oKSB7Ci0gICAgZXF1YWwoY2xpZW50LnRlc3REb3VibGUoMCksIDApOwotICAgIGVxdWFsKGNsaWVudC50ZXN0RG91YmxlKC0xKSwgLTEpOwotICAgIGVxdWFsKGNsaWVudC50ZXN0RG91YmxlKDMuMTQpLCAzLjE0KTsKLSAgICBlcXVhbChjbGllbnQudGVzdERvdWJsZShNYXRoLnBvdygyLDYwKSksIE1hdGgucG93KDIsNjApKTsKKyAgUVVuaXQudGVzdCgnRG91YmxlJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0RG91YmxlKDApLCAwKTsKKyAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnRlc3REb3VibGUoLTEpLCAtMSk7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0RG91YmxlKDMuMTQpLCAzLjE0KTsKKyAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnRlc3REb3VibGUoTWF0aC5wb3coMiwgNjApKSwgTWF0aC5wb3coMiwgNjApKTsKICAgfSk7Ci0gIHRlc3QoIkJ5dGUiLCBmdW5jdGlvbigpIHsKLSAgICBlcXVhbChjbGllbnQudGVzdEJ5dGUoMCksIDApOwotICAgIGVxdWFsKGNsaWVudC50ZXN0Qnl0ZSgweDAxKSwgMHgwMSk7CisgIFFVbml0LnRlc3QoJ0J5dGUnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnRlc3RCeXRlKDApLCAwKTsKKyAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnRlc3RCeXRlKDB4MDEpLCAweDAxKTsKICAgfSk7Ci0gIHRlc3QoIkkzMiIsIGZ1bmN0aW9uKCkgewotICAgIGVxdWFsKGNsaWVudC50ZXN0STMyKDApLCAwKTsKLSAgICBlcXVhbChjbGllbnQudGVzdEkzMihNYXRoLnBvdygyLDMwKSksIE1hdGgucG93KDIsMzApKTsKLSAgICBlcXVhbChjbGllbnQudGVzdEkzMigtTWF0aC5wb3coMiwzMCkpLCAtTWF0aC5wb3coMiwzMCkpOworICBRVW5pdC50ZXN0KCdJMzInLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnRlc3RJMzIoMCksIDApOworICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdEkzMihNYXRoLnBvdygyLCAzMCkpLCBNYXRoLnBvdygyLCAzMCkpOworICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdEkzMigtTWF0aC5wb3coMiwgMzApKSwgLU1hdGgucG93KDIsIDMwKSk7CiAgIH0pOwotICB0ZXN0KCJJNjQiLCBmdW5jdGlvbigpIHsKLSAgICBlcXVhbChjbGllbnQudGVzdEk2NCgwKSwgMCk7CisgIFFVbml0LnRlc3QoJ0k2NCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdEk2NCgwKSwgMCk7CiAgICAgLy9UaGlzIGlzIHVzdWFsbHkgMl42MCBidXQgSlMgY2Fubm90IHJlcHJlc2VudCBhbnl0aGluZyBvdmVyIDJeNTIgYWNjdXJhdGVseQotICAgIGVxdWFsKGNsaWVudC50ZXN0STY0KE1hdGgucG93KDIsNTIpKSwgTWF0aC5wb3coMiw1MikpOwotICAgIGVxdWFsKGNsaWVudC50ZXN0STY0KC1NYXRoLnBvdygyLDUyKSksIC1NYXRoLnBvdygyLDUyKSk7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0STY0KE1hdGgucG93KDIsIDUyKSksIE1hdGgucG93KDIsIDUyKSk7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0STY0KC1NYXRoLnBvdygyLCA1MikpLCAtTWF0aC5wb3coMiwgNTIpKTsKICAgfSk7CiAKIAotbW9kdWxlKCJTdHJ1Y3R1cmVkIFR5cGVzIik7CitRVW5pdC5tb2R1bGUoJ1N0cnVjdHVyZWQgVHlwZXMnKTsKIAotICB0ZXN0KCJTdHJ1Y3QiLCBmdW5jdGlvbigpIHsKLSAgICB2YXIgc3RydWN0VGVzdElucHV0ID0gbmV3IFRocmlmdFRlc3QuWHRydWN0KCk7CisgIFFVbml0LnRlc3QoJ1N0cnVjdCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGNvbnN0IHN0cnVjdFRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdCgpOwogICAgIHN0cnVjdFRlc3RJbnB1dC5zdHJpbmdfdGhpbmcgPSAnd29ya2VkJzsKICAgICBzdHJ1Y3RUZXN0SW5wdXQuYnl0ZV90aGluZyA9IDB4MDE7Ci0gICAgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsMzApOworICAgIHN0cnVjdFRlc3RJbnB1dC5pMzJfdGhpbmcgPSBNYXRoLnBvdygyLCAzMCk7CiAgICAgLy9UaGlzIGlzIHVzdWFsbHkgMl42MCBidXQgSlMgY2Fubm90IHJlcHJlc2VudCBhbnl0aGluZyBvdmVyIDJeNTIgYWNjdXJhdGVseQotICAgIHN0cnVjdFRlc3RJbnB1dC5pNjRfdGhpbmcgPSBNYXRoLnBvdygyLDUyKTsKKyAgICBzdHJ1Y3RUZXN0SW5wdXQuaTY0X3RoaW5nID0gTWF0aC5wb3coMiwgNTIpOwogCi0gICAgdmFyIHN0cnVjdFRlc3RPdXRwdXQgPSBjbGllbnQudGVzdFN0cnVjdChzdHJ1Y3RUZXN0SW5wdXQpOworICAgIGNvbnN0IHN0cnVjdFRlc3RPdXRwdXQgPSBjbGllbnQudGVzdFN0cnVjdChzdHJ1Y3RUZXN0SW5wdXQpOwogCi0gICAgZXF1YWwoc3RydWN0VGVzdE91dHB1dC5zdHJpbmdfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5zdHJpbmdfdGhpbmcpOwotICAgIGVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuYnl0ZV90aGluZywgc3RydWN0VGVzdElucHV0LmJ5dGVfdGhpbmcpOwotICAgIGVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuaTMyX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuaTMyX3RoaW5nKTsKLSAgICBlcXVhbChzdHJ1Y3RUZXN0T3V0cHV0Lmk2NF90aGluZywgc3RydWN0VGVzdElucHV0Lmk2NF90aGluZyk7CisgICAgYXNzZXJ0LmVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuc3RyaW5nX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuc3RyaW5nX3RoaW5nKTsKKyAgICBhc3NlcnQuZXF1YWwoc3RydWN0VGVzdE91dHB1dC5ieXRlX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuYnl0ZV90aGluZyk7CisgICAgYXNzZXJ0LmVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuaTMyX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuaTMyX3RoaW5nKTsKKyAgICBhc3NlcnQuZXF1YWwoc3RydWN0VGVzdE91dHB1dC5pNjRfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5pNjRfdGhpbmcpOwogCi0gICAgZXF1YWwoSlNPTi5zdHJpbmdpZnkoc3RydWN0VGVzdE91dHB1dCksIEpTT04uc3RyaW5naWZ5KHN0cnVjdFRlc3RJbnB1dCkpOworICAgIGFzc2VydC5lcXVhbChKU09OLnN0cmluZ2lmeShzdHJ1Y3RUZXN0T3V0cHV0KSwgSlNPTi5zdHJpbmdpZnkoc3RydWN0VGVzdElucHV0KSk7CiAgIH0pOwogCi0gIHRlc3QoIk5lc3QiLCBmdW5jdGlvbigpIHsKLSAgICB2YXIgeHRyVGVzdElucHV0ID0gbmV3IFRocmlmdFRlc3QuWHRydWN0KCk7CisgIFFVbml0LnRlc3QoJ05lc3QnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBjb25zdCB4dHJUZXN0SW5wdXQgPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QoKTsKICAgICB4dHJUZXN0SW5wdXQuc3RyaW5nX3RoaW5nID0gJ3dvcmtlZCc7CiAgICAgeHRyVGVzdElucHV0LmJ5dGVfdGhpbmcgPSAweDAxOwotICAgIHh0clRlc3RJbnB1dC5pMzJfdGhpbmcgPSBNYXRoLnBvdygyLDMwKTsKKyAgICB4dHJUZXN0SW5wdXQuaTMyX3RoaW5nID0gTWF0aC5wb3coMiwgMzApOwogICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjAgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKLSAgICB4dHJUZXN0SW5wdXQuaTY0X3RoaW5nID0gTWF0aC5wb3coMiw1Mik7CisgICAgeHRyVGVzdElucHV0Lmk2NF90aGluZyA9IE1hdGgucG93KDIsIDUyKTsKIAotICAgIHZhciBuZXN0VGVzdElucHV0ID0gbmV3IFRocmlmdFRlc3QuWHRydWN0MigpOworICAgIGNvbnN0IG5lc3RUZXN0SW5wdXQgPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QyKCk7CiAgICAgbmVzdFRlc3RJbnB1dC5ieXRlX3RoaW5nID0gMHgwMjsKICAgICBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZyA9IHh0clRlc3RJbnB1dDsKLSAgICBuZXN0VGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsMTUpOworICAgIG5lc3RUZXN0SW5wdXQuaTMyX3RoaW5nID0gTWF0aC5wb3coMiwgMTUpOwogCi0gICAgdmFyIG5lc3RUZXN0T3V0cHV0ID0gY2xpZW50LnRlc3ROZXN0KG5lc3RUZXN0SW5wdXQpOworICAgIGNvbnN0IG5lc3RUZXN0T3V0cHV0ID0gY2xpZW50LnRlc3ROZXN0KG5lc3RUZXN0SW5wdXQpOwogCi0gICAgZXF1YWwobmVzdFRlc3RPdXRwdXQuYnl0ZV90aGluZywgbmVzdFRlc3RJbnB1dC5ieXRlX3RoaW5nKTsKLSAgICBlcXVhbChuZXN0VGVzdE91dHB1dC5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcpOwotICAgIGVxdWFsKG5lc3RUZXN0T3V0cHV0LnN0cnVjdF90aGluZy5ieXRlX3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5ieXRlX3RoaW5nKTsKLSAgICBlcXVhbChuZXN0VGVzdE91dHB1dC5zdHJ1Y3RfdGhpbmcuaTMyX3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5pMzJfdGhpbmcpOwotICAgIGVxdWFsKG5lc3RUZXN0T3V0cHV0LnN0cnVjdF90aGluZy5pNjRfdGhpbmcsIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nLmk2NF90aGluZyk7Ci0gICAgZXF1YWwobmVzdFRlc3RPdXRwdXQuaTMyX3RoaW5nLCBuZXN0VGVzdElucHV0LmkzMl90aGluZyk7CisgICAgYXNzZXJ0LmVxdWFsKG5lc3RUZXN0T3V0cHV0LmJ5dGVfdGhpbmcsIG5lc3RUZXN0SW5wdXQuYnl0ZV90aGluZyk7CisgICAgYXNzZXJ0LmVxdWFsKG5lc3RUZXN0T3V0cHV0LnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcsIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZyk7CisgICAgYXNzZXJ0LmVxdWFsKG5lc3RUZXN0T3V0cHV0LnN0cnVjdF90aGluZy5ieXRlX3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5ieXRlX3RoaW5nKTsKKyAgICBhc3NlcnQuZXF1YWwobmVzdFRlc3RPdXRwdXQuc3RydWN0X3RoaW5nLmkzMl90aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuaTMyX3RoaW5nKTsKKyAgICBhc3NlcnQuZXF1YWwobmVzdFRlc3RPdXRwdXQuc3RydWN0X3RoaW5nLmk2NF90aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuaTY0X3RoaW5nKTsKKyAgICBhc3NlcnQuZXF1YWwobmVzdFRlc3RPdXRwdXQuaTMyX3RoaW5nLCBuZXN0VGVzdElucHV0LmkzMl90aGluZyk7CiAKLSAgICBlcXVhbChKU09OLnN0cmluZ2lmeShuZXN0VGVzdE91dHB1dCksIEpTT04uc3RyaW5naWZ5KG5lc3RUZXN0SW5wdXQpKTsKKyAgICBhc3NlcnQuZXF1YWwoSlNPTi5zdHJpbmdpZnkobmVzdFRlc3RPdXRwdXQpLCBKU09OLnN0cmluZ2lmeShuZXN0VGVzdElucHV0KSk7CiAgIH0pOwogCi0gIHRlc3QoIk1hcCIsIGZ1bmN0aW9uKCkgewotICAgIHZhciBtYXBUZXN0SW5wdXQgPSB7Nzo3NywgODo4OCwgOTo5OX07CisgIFFVbml0LnRlc3QoJ01hcCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGNvbnN0IG1hcFRlc3RJbnB1dCA9IHs3OiA3NywgODogODgsIDk6IDk5fTsKIAotICAgIHZhciBtYXBUZXN0T3V0cHV0ID0gY2xpZW50LnRlc3RNYXAobWFwVGVzdElucHV0KTsKKyAgICBjb25zdCBtYXBUZXN0T3V0cHV0ID0gY2xpZW50LnRlc3RNYXAobWFwVGVzdElucHV0KTsKIAotICAgIGZvciAodmFyIGtleSBpbiBtYXBUZXN0T3V0cHV0KSB7Ci0gICAgICBlcXVhbChtYXBUZXN0T3V0cHV0W2tleV0sIG1hcFRlc3RJbnB1dFtrZXldKTsKKyAgICBmb3IgKGxldCBrZXkgaW4gbWFwVGVzdE91dHB1dCkgeworICAgICAgYXNzZXJ0LmVxdWFsKG1hcFRlc3RPdXRwdXRba2V5XSwgbWFwVGVzdElucHV0W2tleV0pOwogICAgIH0KICAgfSk7CiAKLSAgdGVzdCgiU3RyaW5nTWFwIiwgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIG1hcFRlc3RJbnB1dCA9IHsKLSAgICAgICJhIjoiMTIzIiwgImEgYiI6IndpdGggc3BhY2VzICIsICJzYW1lIjoic2FtZSIsICIwIjoibnVtZXJpYyBrZXkiLAotICAgICAgImxvbmdWYWx1ZSI6c3RyaW5nVGVzdCwgc3RyaW5nVGVzdDoibG9uZyBrZXkiCisgIFFVbml0LnRlc3QoJ1N0cmluZ01hcCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGNvbnN0IG1hcFRlc3RJbnB1dCA9IHsKKyAgICAgICdhJzogJzEyMycsICdhIGInOiAnd2l0aCBzcGFjZXMgJywgJ3NhbWUnOiAnc2FtZScsICcwJzogJ251bWVyaWMga2V5JywKKyAgICAgICdsb25nVmFsdWUnOiBzdHJpbmdUZXN0LCBzdHJpbmdUZXN0OiAnbG9uZyBrZXknCiAgICAgfTsKIAotICAgIHZhciBtYXBUZXN0T3V0cHV0ID0gY2xpZW50LnRlc3RTdHJpbmdNYXAobWFwVGVzdElucHV0KTsKKyAgICBjb25zdCBtYXBUZXN0T3V0cHV0ID0gY2xpZW50LnRlc3RTdHJpbmdNYXAobWFwVGVzdElucHV0KTsKIAotICAgIGZvciAodmFyIGtleSBpbiBtYXBUZXN0T3V0cHV0KSB7Ci0gICAgICBlcXVhbChtYXBUZXN0T3V0cHV0W2tleV0sIG1hcFRlc3RJbnB1dFtrZXldKTsKKyAgICBmb3IgKGxldCBrZXkgaW4gbWFwVGVzdE91dHB1dCkgeworICAgICAgYXNzZXJ0LmVxdWFsKG1hcFRlc3RPdXRwdXRba2V5XSwgbWFwVGVzdElucHV0W2tleV0pOwogICAgIH0KICAgfSk7CiAKLSAgdGVzdCgiU2V0IiwgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHNldFRlc3RJbnB1dCA9IFsxLDIsM107Ci0gICAgb2soY2xpZW50LnRlc3RTZXQoc2V0VGVzdElucHV0KSwgc2V0VGVzdElucHV0KTsKKyAgUVVuaXQudGVzdCgnU2V0JywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgY29uc3Qgc2V0VGVzdElucHV0ID0gWzEsIDIsIDNdOworICAgIGFzc2VydC5vayhjbGllbnQudGVzdFNldChzZXRUZXN0SW5wdXQpLCBzZXRUZXN0SW5wdXQpOwogICB9KTsKIAotICB0ZXN0KCJMaXN0IiwgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGxpc3RUZXN0SW5wdXQgPSBbMSwyLDNdOwotICAgIG9rKGNsaWVudC50ZXN0TGlzdChsaXN0VGVzdElucHV0KSwgbGlzdFRlc3RJbnB1dCk7CisgIFFVbml0LnRlc3QoJ0xpc3QnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBjb25zdCBsaXN0VGVzdElucHV0ID0gWzEsIDIsIDNdOworICAgIGFzc2VydC5vayhjbGllbnQudGVzdExpc3QobGlzdFRlc3RJbnB1dCksIGxpc3RUZXN0SW5wdXQpOwogICB9KTsKIAotICB0ZXN0KCJFbnVtIiwgZnVuY3Rpb24oKSB7Ci0gICAgZXF1YWwoY2xpZW50LnRlc3RFbnVtKFRocmlmdFRlc3QuTnVtYmVyei5PTkUpLCBUaHJpZnRUZXN0Lk51bWJlcnouT05FKTsKKyAgUVVuaXQudGVzdCgnRW51bScsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdEVudW0oVGhyaWZ0VGVzdC5OdW1iZXJ6Lk9ORSksIFRocmlmdFRlc3QuTnVtYmVyei5PTkUpOwogICB9KTsKIAotICB0ZXN0KCJUeXBlRGVmIiwgZnVuY3Rpb24oKSB7Ci0gICAgZXF1YWwoY2xpZW50LnRlc3RUeXBlZGVmKDY5KSwgNjkpOworICBRVW5pdC50ZXN0KCdUeXBlRGVmJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0VHlwZWRlZig2OSksIDY5KTsKICAgfSk7CiAKLSAgdGVzdCgiU2tpcCIsIGZ1bmN0aW9uKCkgewotICAgIHZhciBzdHJ1Y3RUZXN0SW5wdXQgPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QoKTsKLSAgICB2YXIgbW9kaWZpZWRDbGllbnQgPSBuZXcgVGhyaWZ0VGVzdC5UaHJpZnRUZXN0Q2xpZW50KHByb3RvY29sKTsKKyAgUVVuaXQudGVzdCgnU2tpcCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGNvbnN0IHN0cnVjdFRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdCgpOworICAgIGNvbnN0IG1vZGlmaWVkQ2xpZW50ID0gbmV3IFRocmlmdFRlc3QuVGhyaWZ0VGVzdENsaWVudChwcm90b2NvbCk7CiAKICAgICBtb2RpZmllZENsaWVudC5yZWN2X3Rlc3RTdHJ1Y3QgPSBmdW5jdGlvbigpIHsKLSAgICAgIHZhciBpbnB1dCAgPSBtb2RpZmllZENsaWVudC5pbnB1dDsKLSAgICAgIHZhciB4dHJ1Y3QzID0gbmV3IFRocmlmdFRlc3QuWHRydWN0MygpOworICAgICAgY29uc3QgaW5wdXQgPSBtb2RpZmllZENsaWVudC5pbnB1dDsKKyAgICAgIGNvbnN0IHh0cnVjdDMgPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QzKCk7CiAKICAgICAgIGlucHV0LnJlYWRNZXNzYWdlQmVnaW4oKTsKICAgICAgIGlucHV0LnJlYWRTdHJ1Y3RCZWdpbigpOwpAQCAtMjMyLDE3OCArMjUwLDE2NiBAQAogICAgIH07CiAKICAgICBzdHJ1Y3RUZXN0SW5wdXQuc3RyaW5nX3RoaW5nID0gJ3dvcmtlZCc7Ci0gICAgc3RydWN0VGVzdElucHV0LmJ5dGVfdGhpbmcgICA9IDB4MDE7Ci0gICAgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyAgICA9IE1hdGgucG93KDIsMzApOwotICAgIHN0cnVjdFRlc3RJbnB1dC5pNjRfdGhpbmcgICAgPSBNYXRoLnBvdygyLDUyKTsKKyAgICBzdHJ1Y3RUZXN0SW5wdXQuYnl0ZV90aGluZyA9IDB4MDE7CisgICAgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsIDMwKTsKKyAgICBzdHJ1Y3RUZXN0SW5wdXQuaTY0X3RoaW5nID0gTWF0aC5wb3coMiwgNTIpOwogCi0gICAgdmFyIHN0cnVjdFRlc3RPdXRwdXQgPSBtb2RpZmllZENsaWVudC50ZXN0U3RydWN0KHN0cnVjdFRlc3RJbnB1dCk7CisgICAgY29uc3Qgc3RydWN0VGVzdE91dHB1dCA9IG1vZGlmaWVkQ2xpZW50LnRlc3RTdHJ1Y3Qoc3RydWN0VGVzdElucHV0KTsKIAotICAgIGVxdWFsKHN0cnVjdFRlc3RPdXRwdXQgaW5zdGFuY2VvZiBUaHJpZnRUZXN0Llh0cnVjdDMsIHRydWUpOwotICAgIGVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuc3RyaW5nX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuc3RyaW5nX3RoaW5nKTsKLSAgICBlcXVhbChzdHJ1Y3RUZXN0T3V0cHV0LmNoYW5nZWQsIG51bGwpOwotICAgIGVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuaTMyX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuaTMyX3RoaW5nKTsKLSAgICBlcXVhbChzdHJ1Y3RUZXN0T3V0cHV0Lmk2NF90aGluZywgc3RydWN0VGVzdElucHV0Lmk2NF90aGluZyk7CisgICAgYXNzZXJ0LmVxdWFsKHN0cnVjdFRlc3RPdXRwdXQgaW5zdGFuY2VvZiBUaHJpZnRUZXN0Llh0cnVjdDMsIHRydWUpOworICAgIGFzc2VydC5lcXVhbChzdHJ1Y3RUZXN0T3V0cHV0LnN0cmluZ190aGluZywgc3RydWN0VGVzdElucHV0LnN0cmluZ190aGluZyk7CisgICAgYXNzZXJ0LmVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuY2hhbmdlZCwgbnVsbCk7CisgICAgYXNzZXJ0LmVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuaTMyX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuaTMyX3RoaW5nKTsKKyAgICBhc3NlcnQuZXF1YWwoc3RydWN0VGVzdE91dHB1dC5pNjRfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5pNjRfdGhpbmcpOwogICB9KTsKIAogCi1tb2R1bGUoImRlZXBlciEiKTsKK1FVbml0Lm1vZHVsZSgnZGVlcGVyIScpOwogCi0gIHRlc3QoIk1hcE1hcCIsIGZ1bmN0aW9uKCkgewotICAgIHZhciBtYXBNYXBUZXN0RXhwZWN0ZWRSZXN1bHQgPSB7Ci0gICAgICAiNCI6eyIxIjoxLCIyIjoyLCIzIjozLCI0Ijo0fSwKLSAgICAgICItNCI6eyItNCI6LTQsICItMyI6LTMsICItMiI6LTIsICItMSI6LTF9CisgIFFVbml0LnRlc3QoJ01hcE1hcCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGNvbnN0IG1hcE1hcFRlc3RFeHBlY3RlZFJlc3VsdCA9IHsKKyAgICAgICc0JzogeycxJzogMSwgJzInOiAyLCAnMyc6IDMsICc0JzogNH0sCisgICAgICAnLTQnOiB7Jy00JzogLTQsICctMyc6IC0zLCAnLTInOiAtMiwgJy0xJzogLTF9CiAgICAgfTsKIAotICAgIHZhciBtYXBNYXBUZXN0T3V0cHV0ID0gY2xpZW50LnRlc3RNYXBNYXAoMSk7CisgICAgY29uc3QgbWFwTWFwVGVzdE91dHB1dCA9IGNsaWVudC50ZXN0TWFwTWFwKDEpOwogCiAKLSAgICBmb3IgKHZhciBrZXkgaW4gbWFwTWFwVGVzdE91dHB1dCkgewotICAgICAgZm9yICh2YXIga2V5MiBpbiBtYXBNYXBUZXN0T3V0cHV0W2tleV0pIHsKLSAgICAgICAgZXF1YWwobWFwTWFwVGVzdE91dHB1dFtrZXldW2tleTJdLCBtYXBNYXBUZXN0RXhwZWN0ZWRSZXN1bHRba2V5XVtrZXkyXSk7CisgICAgZm9yIChsZXQga2V5IGluIG1hcE1hcFRlc3RPdXRwdXQpIHsKKyAgICAgIGZvciAobGV0IGtleTIgaW4gbWFwTWFwVGVzdE91dHB1dFtrZXldKSB7CisgICAgICAgIGFzc2VydC5lcXVhbChtYXBNYXBUZXN0T3V0cHV0W2tleV1ba2V5Ml0sIG1hcE1hcFRlc3RFeHBlY3RlZFJlc3VsdFtrZXldW2tleTJdKTsKICAgICAgIH0KICAgICB9CiAKLSAgICBjaGVja1JlY3Vyc2l2ZWx5KG1hcE1hcFRlc3RPdXRwdXQsIG1hcE1hcFRlc3RFeHBlY3RlZFJlc3VsdCk7CisgICAgY2hlY2tSZWN1cnNpdmVseShhc3NlcnQsIG1hcE1hcFRlc3RPdXRwdXQsIG1hcE1hcFRlc3RFeHBlY3RlZFJlc3VsdCk7CiAgIH0pOwogCiAKLW1vZHVsZSgiRXhjZXB0aW9uIik7CitRVW5pdC5tb2R1bGUoJ0V4Y2VwdGlvbicpOwogCi0gIHRlc3QoIlhjZXB0aW9uIiwgZnVuY3Rpb24oKSB7Ci0gICAgZXhwZWN0KDIpOwotICAgIHRyeXsKLSAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCJYY2VwdGlvbiIpOwotICAgIH1jYXRjaChlKXsKLSAgICAgIGVxdWFsKGUuZXJyb3JDb2RlLCAxMDAxKTsKLSAgICAgIGVxdWFsKGUubWVzc2FnZSwgIlhjZXB0aW9uIik7CisgIFFVbml0LnRlc3QoJ1hjZXB0aW9uJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgyKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgdHJ5IHsKKyAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCdYY2VwdGlvbicpOworICAgICAgYXNzZXJ0Lm9rKGZhbHNlKTsKKyAgICB9Y2F0Y2ggKGUpIHsKKyAgICAgIGFzc2VydC5lcXVhbChlLmVycm9yQ29kZSwgMTAwMSk7CisgICAgICBhc3NlcnQuZXF1YWwoZS5tZXNzYWdlLCAnWGNlcHRpb24nKTsKKyAgICAgIGRvbmUoKTsKICAgICB9CiAgIH0pOwogCi0gIHRlc3QoIm5vIEV4Y2VwdGlvbiIsIDAsIGZ1bmN0aW9uKCkgewotICAgIHRyeXsKLSAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCJubyBFeGNlcHRpb24iKTsKLSAgICB9Y2F0Y2goZSl7Ci0gICAgICBvayhmYWxzZSk7CisgIFFVbml0LnRlc3QoJ25vIEV4Y2VwdGlvbicsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMSk7CisgICAgdHJ5IHsKKyAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCdubyBFeGNlcHRpb24nKTsKKyAgICAgIGFzc2VydC5vayh0cnVlKTsKKyAgICB9Y2F0Y2ggKGUpIHsKKyAgICAgIGFzc2VydC5vayhmYWxzZSk7CiAgICAgfQogICB9KTsKIAotICB0ZXN0KCJURXhjZXB0aW9uIiwgZnVuY3Rpb24oKSB7CisgIFFVbml0LnRlc3QoJ1RFeGNlcHRpb24nLCBmdW5jdGlvbihhc3NlcnQpIHsKICAgICAvL1RocmlmdFRlc3QgZG9lcyBub3QgbGlzdCBURXhjZXB0aW9uIGFzIGEgbGVnYWwgZXhjZXB0aW9uIHNvIGl0IHdpbGwKICAgICAvLyBnZW5lcmF0ZSBhbiBleGNlcHRpb24gb24gdGhlIHNlcnZlciB0aGF0IGRvZXMgbm90IHByb3BhZ2F0ZSBiYWNrIHRvCiAgICAgLy8gdGhlIGNsaWVudC4gVGhpcyB0ZXN0IGhhcyBiZWVuIG1vZGlmaWVkIHRvIGVxdWF0ZSB0byAibm8gZXhjZXB0aW9uIgotICAgIGV4cGVjdCgxKTsKLSAgICB0cnl7Ci0gICAgICBjbGllbnQudGVzdEV4Y2VwdGlvbigiVEV4Y2VwdGlvbiIpOwotICAgIH0gY2F0Y2goZSkgewotICAgICAgLy9vayhmYWxzZSk7CisgICAgYXNzZXJ0LmV4cGVjdCgxKTsKKyAgICB0cnkgeworICAgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oJ1RFeGNlcHRpb24nKTsKKyAgICB9IGNhdGNoIChlKSB7CisgICAgICAvL2Fzc2VydC5vayhmYWxzZSk7CiAgICAgfQotICAgIG9rKHRydWUpOworICAgIGFzc2VydC5vayh0cnVlKTsKICAgfSk7CiAKIAotbW9kdWxlKCJJbnNhbml0eSIpOworUVVuaXQubW9kdWxlKCdJbnNhbml0eScpOwogCi0gIHRlc3QoInRlc3RJbnNhbml0eSIsIGZ1bmN0aW9uKCkgewotICAgIHZhciBpbnNhbml0eSA9IHsKLSAgICAgICIxIjp7Ci0gICAgICAgICIyIjp7Ci0gICAgICAgICAgInVzZXJNYXAiOnsgIjUiOjUsICI4Ijo4IH0sCi0gICAgICAgICAgInh0cnVjdHMiOlt7Ci0gICAgICAgICAgICAgICJzdHJpbmdfdGhpbmciOiJHb29kYnllNCIsCi0gICAgICAgICAgICAgICJieXRlX3RoaW5nIjo0LAotICAgICAgICAgICAgICAiaTMyX3RoaW5nIjo0LAotICAgICAgICAgICAgICAiaTY0X3RoaW5nIjo0Ci0gICAgICAgICAgICB9LAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAic3RyaW5nX3RoaW5nIjoiSGVsbG8yIiwKLSAgICAgICAgICAgICAgImJ5dGVfdGhpbmciOjIsCi0gICAgICAgICAgICAgICJpMzJfdGhpbmciOjIsCi0gICAgICAgICAgICAgICJpNjRfdGhpbmciOjIKLSAgICAgICAgICAgIH0KLSAgICAgICAgICBdCi0gICAgICAgIH0sCi0gICAgICAgICIzIjp7Ci0gICAgICAgICAgInVzZXJNYXAiOnsgIjUiOjUsICI4Ijo4IH0sCi0gICAgICAgICAgInh0cnVjdHMiOlt7Ci0gICAgICAgICAgICAgICJzdHJpbmdfdGhpbmciOiJHb29kYnllNCIsCi0gICAgICAgICAgICAgICJieXRlX3RoaW5nIjo0LAotICAgICAgICAgICAgICAiaTMyX3RoaW5nIjo0LAotICAgICAgICAgICAgICAiaTY0X3RoaW5nIjo0Ci0gICAgICAgICAgICB9LAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAic3RyaW5nX3RoaW5nIjoiSGVsbG8yIiwKLSAgICAgICAgICAgICAgImJ5dGVfdGhpbmciOjIsCi0gICAgICAgICAgICAgICJpMzJfdGhpbmciOjIsCi0gICAgICAgICAgICAgICJpNjRfdGhpbmciOjIKLSAgICAgICAgICAgIH0KLSAgICAgICAgICBdCi0gICAgICAgIH0KKyAgY29uc3QgY3JhenkgPSB7CisgICAgJ3VzZXJNYXAnOiB7ICc1JzogNSwgJzgnOiA4IH0sCisgICAgJ3h0cnVjdHMnOiBbeworICAgICAgJ3N0cmluZ190aGluZyc6ICdHb29kYnllNCcsCisgICAgICAnYnl0ZV90aGluZyc6IDQsCisgICAgICAnaTMyX3RoaW5nJzogNCwKKyAgICAgICdpNjRfdGhpbmcnOiA0CisgICAgfSwKKyAgICB7CisgICAgICAnc3RyaW5nX3RoaW5nJzogJ0hlbGxvMicsCisgICAgICAnYnl0ZV90aGluZyc6IDIsCisgICAgICAnaTMyX3RoaW5nJzogMiwKKyAgICAgICdpNjRfdGhpbmcnOiAyCisgICAgfV0KKyAgfTsKKyAgUVVuaXQudGVzdCgndGVzdEluc2FuaXR5JywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgY29uc3QgaW5zYW5pdHkgPSB7CisgICAgICAnMSc6IHsKKyAgICAgICAgJzInOiBjcmF6eSwKKyAgICAgICAgJzMnOiBjcmF6eQogICAgICAgfSwKLSAgICAgICIyIjp7ICI2Ijp7ICJ1c2VyTWFwIjpudWxsLCAieHRydWN0cyI6bnVsbCB9IH0KKyAgICAgICcyJzogeyAnNic6IHsgJ3VzZXJNYXAnOiBudWxsLCAneHRydWN0cyc6IG51bGwgfSB9CiAgICAgfTsKLSAgICB2YXIgcmVzID0gY2xpZW50LnRlc3RJbnNhbml0eShuZXcgVGhyaWZ0VGVzdC5JbnNhbml0eSgpKTsKLSAgICBvayhyZXMsIEpTT04uc3RyaW5naWZ5KHJlcykpOwotICAgIG9rKGluc2FuaXR5LCBKU09OLnN0cmluZ2lmeShpbnNhbml0eSkpOworICAgIGNvbnN0IHJlcyA9IGNsaWVudC50ZXN0SW5zYW5pdHkobmV3IFRocmlmdFRlc3QuSW5zYW5pdHkoY3JhenkpKTsKKyAgICBhc3NlcnQub2socmVzLCBKU09OLnN0cmluZ2lmeShyZXMpKTsKKyAgICBhc3NlcnQub2soaW5zYW5pdHksIEpTT04uc3RyaW5naWZ5KGluc2FuaXR5KSk7CiAKLSAgICBjaGVja1JlY3Vyc2l2ZWx5KHJlcywgaW5zYW5pdHkpOworICAgIGNoZWNrUmVjdXJzaXZlbHkoYXNzZXJ0LCByZXMsIGluc2FuaXR5KTsKICAgfSk7CiAKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy9SdW4gc2FtZSB0ZXN0cyBhc3luY2hyb25vdXNseQogCi1tb2R1bGUoIkFzeW5jIik7CitRVW5pdC5tb2R1bGUoJ0FzeW5jJyk7CiAKLSAgdGVzdCgiRG91YmxlIiwgZnVuY3Rpb24oKSB7Ci0gICAgZXhwZWN0KCAxICk7CisgIFFVbml0LnRlc3QoJ0RvdWJsZScsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMSk7CiAKLSAgICBRVW5pdC5zdG9wKCk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOwogICAgIGNsaWVudC50ZXN0RG91YmxlKDMuMTQxNTkyNjUsIGZ1bmN0aW9uKHJlc3VsdCkgewotICAgICAgZXF1YWwocmVzdWx0LCAzLjE0MTU5MjY1KTsKLSAgICAgIFFVbml0LnN0YXJ0KCk7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCAzLjE0MTU5MjY1KTsKKyAgICAgIGRvbmUoKTsKICAgICB9KTsKICAgfSk7CiAKLSAgdGVzdCgiQnl0ZSIsIGZ1bmN0aW9uKCkgewotICAgIGV4cGVjdCggMSApOworICBRVW5pdC50ZXN0KCdCeXRlJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgxKTsKIAotICAgIFFVbml0LnN0b3AoKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CiAgICAgY2xpZW50LnRlc3RCeXRlKDB4MDEsIGZ1bmN0aW9uKHJlc3VsdCkgewotICAgICAgZXF1YWwocmVzdWx0LCAweDAxKTsKLSAgICAgIFFVbml0LnN0YXJ0KCk7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCAweDAxKTsKKyAgICAgIGRvbmUoKTsKICAgICB9KTsKICAgfSk7CiAKLSAgdGVzdCgiSTMyIiwgZnVuY3Rpb24oKSB7Ci0gICAgZXhwZWN0KCAyICk7CisgIFFVbml0LnRlc3QoJ0kzMicsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMik7CiAKLSAgICBRVW5pdC5zdG9wKCk7Ci0gICAgY2xpZW50LnRlc3RJMzIoTWF0aC5wb3coMiwzMCksIGZ1bmN0aW9uKHJlc3VsdCkgewotICAgICAgZXF1YWwocmVzdWx0LCBNYXRoLnBvdygyLDMwKSk7Ci0gICAgICBRVW5pdC5zdGFydCgpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoMik7CisgICAgY2xpZW50LnRlc3RJMzIoTWF0aC5wb3coMiwgMzApLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIE1hdGgucG93KDIsIDMwKSk7CisgICAgICBkb25lKCk7CiAgICAgfSk7CiAKLSAgICBRVW5pdC5zdG9wKCk7Ci0gICAgY2xpZW50LnRlc3RJMzIoTWF0aC5wb3coLTIsMzEpLCBmdW5jdGlvbihyZXN1bHQpIHsKLSAgICAgIGVxdWFsKHJlc3VsdCwgTWF0aC5wb3coLTIsMzEpKTsKLSAgICAgIFFVbml0LnN0YXJ0KCk7CisgICAgY2xpZW50LnRlc3RJMzIoTWF0aC5wb3coLTIsIDMxKSwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBNYXRoLnBvdygtMiwgMzEpKTsKKyAgICAgIGRvbmUoKTsKICAgICB9KTsKICAgfSk7CiAKLSAgdGVzdCgiSTY0IiwgZnVuY3Rpb24oKSB7Ci0gICAgZXhwZWN0KCAyICk7CisgIFFVbml0LnRlc3QoJ0k2NCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMik7CiAKLSAgICBRVW5pdC5zdG9wKCk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygyKTsKICAgICAvL1RoaXMgaXMgdXN1YWxseSAyXjYwIGJ1dCBKUyBjYW5ub3QgcmVwcmVzZW50IGFueXRoaW5nIG92ZXIgMl41MiBhY2N1cmF0ZWx5Ci0gICAgY2xpZW50LnRlc3RJNjQoTWF0aC5wb3coMiw1MiksIGZ1bmN0aW9uKHJlc3VsdCkgewotICAgICAgZXF1YWwocmVzdWx0LCBNYXRoLnBvdygyLDUyKSk7Ci0gICAgICBRVW5pdC5zdGFydCgpOworICAgIGNsaWVudC50ZXN0STY0KE1hdGgucG93KDIsIDUyKSwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBNYXRoLnBvdygyLCA1MikpOworICAgICAgZG9uZSgpOwogICAgIH0pOwogCi0gICAgUVVuaXQuc3RvcCgpOwogICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjAgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKLSAgICBjbGllbnQudGVzdEk2NChNYXRoLnBvdygtMiw1MiksIGZ1bmN0aW9uKHJlc3VsdCkgewotICAgICAgZXF1YWwocmVzdWx0LCBNYXRoLnBvdygtMiw1MikpOwotICAgICAgUVVuaXQuc3RhcnQoKTsKKyAgICBjbGllbnQudGVzdEk2NChNYXRoLnBvdygtMiwgNTIpLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIE1hdGgucG93KC0yLCA1MikpOworICAgICAgZG9uZSgpOwogICAgIH0pOwogICB9KTsKZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3Rlc3RfaGFuZGxlci5qcyBiL2xpYi9qcy90ZXN0L3Rlc3RfaGFuZGxlci5qcwppbmRleCBlMWZhNzRmLi5hZjVmN2JkIDEwMDY0NAotLS0gYS9saWIvanMvdGVzdC90ZXN0X2hhbmRsZXIuanMKKysrIGIvbGliL2pzL3Rlc3QvdGVzdF9oYW5kbGVyLmpzCkBAIC0xNywxMyArMTcsMTUgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8vVGhpcyBpcyB0aGUgc2VydmVyIHNpZGUgTm9kZSB0ZXN0IGhhbmRsZXIgZm9yIHRoZSBzdGFuZGFyZCAKKy8vVGhpcyBpcyB0aGUgc2VydmVyIHNpZGUgTm9kZSB0ZXN0IGhhbmRsZXIgZm9yIHRoZSBzdGFuZGFyZAogLy8gIEFwYWNoZSBUaHJpZnQgdGVzdCBzZXJ2aWNlLgogCi12YXIgdHR5cGVzID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL1RocmlmdFRlc3RfdHlwZXMnKTsKLXZhciBURXhjZXB0aW9uID0gcmVxdWlyZSgnLi4vLi4vbm9kZWpzL2xpYi90aHJpZnQnKS5URXhjZXB0aW9uOworY29uc3QgZXM2TW9kZSA9IHByb2Nlc3MuYXJndi5pbmNsdWRlcygnLS1lczYnKTsKK2NvbnN0IGdlbkZvbGRlciA9IGVzNk1vZGUgPyAnZ2VuLW5vZGVqcy1lczYnIDogJ2dlbi1ub2RlanMnOworY29uc3QgdHR5cGVzID0gcmVxdWlyZShgLi8ke2dlbkZvbGRlcn0vVGhyaWZ0VGVzdF90eXBlc2ApOworY29uc3QgVEV4Y2VwdGlvbiA9IHJlcXVpcmUoJy4uLy4uL25vZGVqcy9saWIvdGhyaWZ0JykuVEV4Y2VwdGlvbjsKIAotdmFyIFRocmlmdFRlc3RIYW5kbGVyID0gZXhwb3J0cy5UaHJpZnRUZXN0SGFuZGxlciA9IHsKK2V4cG9ydHMuVGhyaWZ0VGVzdEhhbmRsZXIgPSB7CiAgIHRlc3RWb2lkOiBmdW5jdGlvbihyZXN1bHQpIHsKICAgICBjb25zb2xlLmxvZygndGVzdFZvaWQoKScpOwogICAgIHJlc3VsdChudWxsKTsKQEAgLTk5LDEwICsxMDEsMTAgQEAKICAgdGVzdE1hcE1hcDogZnVuY3Rpb24oaGVsbG8sIHJlc3VsdCkgewogICAgIGNvbnNvbGUubG9nKCd0ZXN0TWFwTWFwKCcgKyBoZWxsbyArICcpJyk7CiAKLSAgICB2YXIgbWFwbWFwID0gW107Ci0gICAgdmFyIHBvcyA9IFtdOwotICAgIHZhciBuZWcgPSBbXTsKLSAgICBmb3IgKHZhciBpID0gMTsgaSA8IDU7IGkrKykgeworICAgIGNvbnN0IG1hcG1hcCA9IFtdOworICAgIGNvbnN0IHBvcyA9IFtdOworICAgIGNvbnN0IG5lZyA9IFtdOworICAgIGZvciAobGV0IGkgPSAxOyBpIDwgNTsgaSsrKSB7CiAgICAgICBwb3NbaV0gPSBpOwogICAgICAgbmVnWy1pXSA9IC1pOwogICAgIH0KQEAgLTExNiwzNCArMTE4LDM0IEBACiAgICAgY29uc29sZS5sb2coYXJndW1lbnQpOwogICAgIGNvbnNvbGUubG9nKCcpJyk7CiAKLSAgICB2YXIgaGVsbG8gPSBuZXcgdHR5cGVzLlh0cnVjdCgpOworICAgIGNvbnN0IGhlbGxvID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTsKICAgICBoZWxsby5zdHJpbmdfdGhpbmcgPSAnSGVsbG8yJzsKICAgICBoZWxsby5ieXRlX3RoaW5nID0gMjsKICAgICBoZWxsby5pMzJfdGhpbmcgPSAyOwogICAgIGhlbGxvLmk2NF90aGluZyA9IDI7CiAKLSAgICB2YXIgZ29vZGJ5ZSA9IG5ldyB0dHlwZXMuWHRydWN0KCk7CisgICAgY29uc3QgZ29vZGJ5ZSA9IG5ldyB0dHlwZXMuWHRydWN0KCk7CiAgICAgZ29vZGJ5ZS5zdHJpbmdfdGhpbmcgPSAnR29vZGJ5ZTQnOwogICAgIGdvb2RieWUuYnl0ZV90aGluZyA9IDQ7CiAgICAgZ29vZGJ5ZS5pMzJfdGhpbmcgPSA0OwogICAgIGdvb2RieWUuaTY0X3RoaW5nID0gNDsKIAotICAgIHZhciBjcmF6eSA9IG5ldyB0dHlwZXMuSW5zYW5pdHkoKTsKKyAgICBjb25zdCBjcmF6eSA9IG5ldyB0dHlwZXMuSW5zYW5pdHkoKTsKICAgICBjcmF6eS51c2VyTWFwID0gW107CiAgICAgY3JhenkudXNlck1hcFt0dHlwZXMuTnVtYmVyei5FSUdIVF0gPSA4OwogICAgIGNyYXp5LnVzZXJNYXBbdHR5cGVzLk51bWJlcnouRklWRV0gPSA1OwogICAgIGNyYXp5Lnh0cnVjdHMgPSBbZ29vZGJ5ZSwgaGVsbG9dOwogCi0gICAgdmFyIGZpcnN0X21hcCA9IFtdOwotICAgIHZhciBzZWNvbmRfbWFwID0gW107CisgICAgY29uc3QgZmlyc3RfbWFwID0gW107CisgICAgY29uc3Qgc2Vjb25kX21hcCA9IFtdOwogCiAgICAgZmlyc3RfbWFwW3R0eXBlcy5OdW1iZXJ6LlRXT10gPSBjcmF6eTsKICAgICBmaXJzdF9tYXBbdHR5cGVzLk51bWJlcnouVEhSRUVdID0gY3Jhenk7CiAKLSAgICB2YXIgbG9vbmV5ID0gbmV3IHR0eXBlcy5JbnNhbml0eSgpOworICAgIGNvbnN0IGxvb25leSA9IG5ldyB0dHlwZXMuSW5zYW5pdHkoKTsKICAgICBzZWNvbmRfbWFwW3R0eXBlcy5OdW1iZXJ6LlNJWF0gPSBsb29uZXk7CiAKLSAgICB2YXIgaW5zYW5lID0gW107CisgICAgY29uc3QgaW5zYW5lID0gW107CiAgICAgaW5zYW5lWzFdID0gZmlyc3RfbWFwOwogICAgIGluc2FuZVsyXSA9IHNlY29uZF9tYXA7CiAKQEAgLTE1NCw3ICsxNTYsNyBAQAogICB0ZXN0TXVsdGk6IGZ1bmN0aW9uKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUsIHJlc3VsdCkgewogICAgIGNvbnNvbGUubG9nKCd0ZXN0TXVsdGkoKScpOwogCi0gICAgdmFyIGhlbGxvID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTsKKyAgICBjb25zdCBoZWxsbyA9IG5ldyB0dHlwZXMuWHRydWN0KCk7CiAgICAgaGVsbG8uc3RyaW5nX3RoaW5nID0gJ0hlbGxvMic7CiAgICAgaGVsbG8uYnl0ZV90aGluZyA9IGFyZzA7CiAgICAgaGVsbG8uaTMyX3RoaW5nID0gYXJnMTsKQEAgLTE2Miw5ICsxNjQsOSBAQAogICAgIHJlc3VsdChudWxsLCBoZWxsbyk7CiAgIH0sCiAgIHRlc3RFeGNlcHRpb246IGZ1bmN0aW9uKGFyZywgcmVzdWx0KSB7Ci0gICAgY29uc29sZS5sb2coJ3Rlc3RFeGNlcHRpb24oJythcmcrJyknKTsKKyAgICBjb25zb2xlLmxvZygndGVzdEV4Y2VwdGlvbignICsgYXJnICsgJyknKTsKICAgICBpZiAoYXJnID09PSAnWGNlcHRpb24nKSB7Ci0gICAgICB2YXIgeCA9IG5ldyB0dHlwZXMuWGNlcHRpb24oKTsKKyAgICAgIGNvbnN0IHggPSBuZXcgdHR5cGVzLlhjZXB0aW9uKCk7CiAgICAgICB4LmVycm9yQ29kZSA9IDEwMDE7CiAgICAgICB4Lm1lc3NhZ2UgPSBhcmc7CiAgICAgICByZXN1bHQoeCk7CkBAIC0xNzcsMTkgKzE3OSwxOSBAQAogICB0ZXN0TXVsdGlFeGNlcHRpb246IGZ1bmN0aW9uKGFyZzAsIGFyZzEsIHJlc3VsdCkgewogICAgIGNvbnNvbGUubG9nKCd0ZXN0TXVsdGlFeGNlcHRpb24oJyArIGFyZzAgKyAnLCAnICsgYXJnMSArICcpJyk7CiAgICAgaWYgKGFyZzAgPT09ICgnWGNlcHRpb24nKSkgewotICAgICAgdmFyIHggPSBuZXcgdHR5cGVzLlhjZXB0aW9uKCk7CisgICAgICBjb25zdCB4ID0gbmV3IHR0eXBlcy5YY2VwdGlvbigpOwogICAgICAgeC5lcnJvckNvZGUgPSAxMDAxOwogICAgICAgeC5tZXNzYWdlID0gJ1RoaXMgaXMgYW4gWGNlcHRpb24nOwogICAgICAgcmVzdWx0KHgpOwogICAgIH0gZWxzZSBpZiAoYXJnMCA9PT0gKCdYY2VwdGlvbjInKSkgewotICAgICAgdmFyIHgyID0gbmV3IHR0eXBlcy5YY2VwdGlvbjIoKTsKKyAgICAgIGNvbnN0IHgyID0gbmV3IHR0eXBlcy5YY2VwdGlvbjIoKTsKICAgICAgIHgyLmVycm9yQ29kZSA9IDIwMDI7CiAgICAgICB4Mi5zdHJ1Y3RfdGhpbmcgPSBuZXcgdHR5cGVzLlh0cnVjdCgpOwogICAgICAgeDIuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZyA9ICdUaGlzIGlzIGFuIFhjZXB0aW9uMic7CiAgICAgICByZXN1bHQoeDIpOwogICAgIH0KIAotICAgIHZhciByZXMgPSBuZXcgdHR5cGVzLlh0cnVjdCgpOworICAgIGNvbnN0IHJlcyA9IG5ldyB0dHlwZXMuWHRydWN0KCk7CiAgICAgcmVzLnN0cmluZ190aGluZyA9IGFyZzE7CiAgICAgcmVzdWx0KG51bGwsIHJlcyk7CiAgIH0sCmRpZmYgLS1naXQgYS9saWIvanMvdGVzdC90ZXN0d3MuaHRtbCBiL2xpYi9qcy90ZXN0L3Rlc3R3cy5odG1sCmluZGV4IGY5OWExNDYuLjE4NDUwMGYgMTAwNjQ0Ci0tLSBhL2xpYi9qcy90ZXN0L3Rlc3R3cy5odG1sCisrKyBiL2xpYi9qcy90ZXN0L3Rlc3R3cy5odG1sCkBAIC0zNSwxOCArMzUsMTggQEAKIAogICA8IS0tIHRoZSBUZXN0IFN1aXRlLS0+CiAgIDxzY3JpcHQ+Ci0gICAgdmFyIGxvYyA9IHdpbmRvdy5sb2NhdGlvbjsKLSAgICB2YXIgd3NfdXJpID0gKChsb2MucHJvdG9jb2wgPT09ICJodHRwczoiKSA/ICJ3c3M6Ly8iIDogIndzOi8vIikgKworICAgIGNvbnN0IGxvYyA9IHdpbmRvdy5sb2NhdGlvbjsKKyAgICBjb25zdCB3c191cmkgPSAoKGxvYy5wcm90b2NvbCA9PT0gImh0dHBzOiIpID8gIndzczovLyIgOiAid3M6Ly8iKSArCiAgICAgICAgICAgICAgICAgICAgbG9jLmhvc3RuYW1lICsgIjoiICsgbG9jLnBvcnQgKyBsb2MucGF0aG5hbWU7Ci0gICAgdmFyIHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVFdlYlNvY2tldFRyYW5zcG9ydCh3c191cmkpOwotICAgIHZhciBwcm90b2NvbCAgPSBuZXcgVGhyaWZ0LlByb3RvY29sKHRyYW5zcG9ydCk7Ci0gICAgdmFyIGNsaWVudCAgICA9IG5ldyBUaHJpZnRUZXN0LlRocmlmdFRlc3RDbGllbnQocHJvdG9jb2wpOworICAgIGNvbnN0IHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVFdlYlNvY2tldFRyYW5zcG9ydCh3c191cmkpOworICAgIGNvbnN0IHByb3RvY29sICA9IG5ldyBUaHJpZnQuUHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICBjb25zdCBjbGllbnQgICAgPSBuZXcgVGhyaWZ0VGVzdC5UaHJpZnRUZXN0Q2xpZW50KHByb3RvY29sKTsKICAgICB0cmFuc3BvcnQub3BlbigpOwogICA8L3NjcmlwdD4KICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idGVzdC1hc3luYy5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgogPC9oZWFkPgogPGJvZHk+Ci0gIDxoMSBpZD0icXVuaXQtaGVhZGVyIj5UaHJpZnQgSmF2YXNjcmlwdCBCaW5kaW5nczogVW5pdCBUZXN0ICg8YSBocmVmPSJodHRwczovL2dpdC13aXAtdXMuYXBhY2hlLm9yZy9yZXBvcy9hc2Y/cD10aHJpZnQuZ2l0O2E9YmxvYjtmPXRlc3QvVGhyaWZ0VGVzdC50aHJpZnQ7aGI9SEVBRCI+VGhyaWZ0VGVzdC50aHJpZnQ8L2E+KTwvaDE+CisgIDxoMSBpZD0icXVuaXQtaGVhZGVyIj5UaHJpZnQgSmF2YXNjcmlwdCBCaW5kaW5nczogVW5pdCBUZXN0ICg8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC9ibG9iL21hc3Rlci90ZXN0L1RocmlmdFRlc3QudGhyaWZ0Ij5UaHJpZnRUZXN0LnRocmlmdDwvYT4pPC9oMT4KICAgPGgyIGlkPSJxdW5pdC1iYW5uZXIiPjwvaDI+CiAgIDxkaXYgaWQ9InF1bml0LXRlc3RydW5uZXItdG9vbGJhciI+PC9kaXY+CiAgIDxoMiBpZD0icXVuaXQtdXNlckFnZW50Ij48L2gyPgpkaWZmIC0tZ2l0IGEvbGliL2pzb24vTWFrZWZpbGUuYW0gYi9saWIvanNvbi9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDUxYjliCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzb24vTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwyOSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK1NVQkRJUlMgPQorCitpZiBXSVRIX0pBVkEKKyMgU2NoZW1hIHZhbGlkYXRpb24gdGVzdCBkZXBlbmRzIG9uIGphdmEKK1NVQkRJUlMgKz0gdGVzdAorZW5kaWYKKworRVhUUkFfRElTVCA9IFwKKyAgICBzY2hlbWEuanNvbiBcCisgICAgdGVzdApkaWZmIC0tZ2l0IGEvbGliL2pzb24vc2NoZW1hLmpzb24gYi9saWIvanNvbi9zY2hlbWEuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDU4YTdjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzb24vc2NoZW1hLmpzb24KQEAgLTAsMCArMSwzNDQgQEAKK3sKKyAgIiRzY2hlbWEiOiAiaHR0cDovL2pzb24tc2NoZW1hLm9yZy9kcmFmdC0wNC9zY2hlbWEjIiwKKworICAiaWQiOiAiaHR0cDovL3RocmlmdC5hcGFjaGUub3JnL3NjaGVtYS5qc29uIyIsCisgICJkZXNjcmlwdGlvbiI6ICJTY2hlbWEgZm9yIEFwYWNoZSBUaHJpZnQgcHJvdG9jb2wgZGVzY3JpcHRvcnMiLAorCisgICJkZWZpbml0aW9ucyI6IHsKKyAgICAidHlwZS1pZCI6IHsKKyAgICAgICJ0aXRsZSI6ICJBbnkgdHlwZSBpZCAobmFtZSkiLAorICAgICAgImVudW0iOiBbCisgICAgICAgICJ2b2lkIiwKKyAgICAgICAgInN0cmluZyIsCisgICAgICAgICJib29sIiwKKyAgICAgICAgImJ5dGUiLAorICAgICAgICAiaTgiLAorICAgICAgICAiaTE2IiwKKyAgICAgICAgImkzMiIsCisgICAgICAgICJpNjQiLAorICAgICAgICAiZG91YmxlIiwKKyAgICAgICAgImxpc3QiLAorICAgICAgICAic2V0IiwKKyAgICAgICAgIm1hcCIsCisgICAgICAgICJ1bmlvbiIsCisgICAgICAgICJzdHJ1Y3QiLAorICAgICAgICAiYmluYXJ5IgorICAgICAgXQorICAgIH0sCisgICAgImJhc2UtdHlwZSI6IHsKKyAgICAgICJ0aXRsZSI6ICJCYXNlIHR5cGUgc2NoZW1hIiwKKyAgICAgICJ0eXBlIjogIm9iamVjdCIsCisgICAgICAicHJvcGVydGllcyI6IHsKKyAgICAgICAgInR5cGVJZCI6IHsKKyAgICAgICAgICAiZW51bSI6IFsidm9pZCIsICJzdHJpbmciLCAiYm9vbCIsICJieXRlIiwgImk4IiwgImkxNiIsICJpMzIiLCAiaTY0IiwgImRvdWJsZSIsICJiaW5hcnkiIF0KKyAgICAgICAgfQorICAgICAgfSwKKyAgICAgICJyZXF1aXJlZCI6IFsgInR5cGVJZCIgXQorICAgIH0sCisgICAgImxpc3QtdHlwZSI6IHsKKyAgICAgICJ0aXRsZSI6ICJMaXN0IGFuZCBzZXQgc2NoZW1hIiwKKyAgICAgICJ0eXBlIjogIm9iamVjdCIsCisgICAgICAicHJvcGVydGllcyI6IHsKKyAgICAgICAgInR5cGVJZCI6IHsKKyAgICAgICAgICAiZW51bSI6IFsgImxpc3QiLCAic2V0IiBdCisgICAgICAgIH0sCisgICAgICAgICJlbGVtVHlwZUlkIjogIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy90eXBlLWlkIiB9LAorICAgICAgICAiZWxlbVR5cGUiOiAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvdHlwZS1kZXNjIiB9CisgICAgICB9LAorICAgICAgInJlcXVpcmVkIjogWyAidHlwZUlkIiwgImVsZW1UeXBlSWQiIF0KKyAgICB9LAorICAgICJtYXAtdHlwZSI6IHsKKyAgICAgICJ0aXRsZSI6ICJNYXAgc2NoZW1hIiwKKyAgICAgICJ0eXBlIjogIm9iamVjdCIsCisgICAgICAicHJvcGVydGllcyI6IHsKKyAgICAgICAgInR5cGVJZCI6IHsKKyAgICAgICAgICAiZW51bSI6IFsgIm1hcCIgXQorICAgICAgICB9LAorICAgICAgICAia2V5VHlwZUlkIjogICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvdHlwZS1pZCIgfSwKKyAgICAgICAgImtleVR5cGUiOiAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3R5cGUtZGVzYyIgfSwKKyAgICAgICAgInZhbHVlVHlwZUlkIjogeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3R5cGUtaWQiIH0sCisgICAgICAgICJ2YWx1ZVR5cGUiOiAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy90eXBlLWRlc2MiIH0KKyAgICAgIH0sCisgICAgICAicmVxdWlyZWQiOiBbICJ0eXBlSWQiLCAia2V5VHlwZUlkIiwgInZhbHVlVHlwZUlkIiBdCisgICAgfSwKKyAgICAic3RydWN0LXR5cGUiOiB7CisgICAgICAidGl0bGUiOiAiU3RydWN0LCB1bmlvbiBhbmQgZXhjZXB0aW9uIHNjaGVtYSIsCisgICAgICAidHlwZSI6ICJvYmplY3QiLAorICAgICAgInByb3BlcnRpZXMiOiB7CisgICAgICAgICJ0eXBlSWQiOiB7CisgICAgICAgICAgImVudW0iOiBbICJ1bmlvbiIsICJzdHJ1Y3QiLCAiZXhjZXB0aW9uIiBdCisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICAicmVxdWlyZWQiOiBbICJ0eXBlSWQiLCAiY2xhc3MiIF0KKyAgICB9LAorICAgICJ0eXBlLWRlc2MiOiB7CisgICAgICAidGl0bGUiOiAiVHlwZSBkZXNjcmlwdG9yIHNjaGVtYSIsCisgICAgICAiYWxsT2YiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCisgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKKyAgICAgICAgICAgICAgICAidHlwZUlkIjogICAgICB7ICJ0eXBlIjogInN0cmluZyIgfSwKKyAgICAgICAgICAgICAgICAiY2xhc3MiOiAgICAgICB7ICJ0eXBlIjogInN0cmluZyIgfQorICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgIm9uZU9mIjoKKyAgICAgICAgICBbCisgICAgICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvYmFzZS10eXBlIiB9LAorICAgICAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2xpc3QtdHlwZSIgfSwKKyAgICAgICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9tYXAtdHlwZSIgfSwKKyAgICAgICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9zdHJ1Y3QtdHlwZSIgfQorICAgICAgICAgIF0KKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgIm5hbWUtYW5kLWRvYyI6IHsKKyAgICAgICJ0aXRsZSI6ICJOYW1lIGFuZCBkb2N1bWVudGF0aW9uIHN1Yi1zY2hlbWEiLAorICAgICAgInR5cGUiOiAib2JqZWN0IiwKKyAgICAgICJwcm9wZXJ0aWVzIjogeworICAgICAgICAibmFtZSI6IHsgInR5cGUiOiAic3RyaW5nIiB9LAorICAgICAgICAiZG9jIjogeyAidHlwZSI6ICJzdHJpbmciIH0KKyAgICAgIH0sCisgICAgICAicmVxdWlyZWQiOiBbICJuYW1lIiBdCisgICAgfSwKKyAgICAiZW51bSI6IHsKKyAgICAgICJ0aXRsZSI6ICJUaHJpZnQgJ2VudW0nIGRlZmluaXRpb24gc2NoZW1hIiwKKyAgICAgICJ0eXBlIjogIm9iamVjdCIsCisgICAgICAiYWxsT2YiOiBbCisgICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9uYW1lLWFuZC1kb2MiIH0sCisgICAgICAgIHsKKyAgICAgICAgICAicmVxdWlyZWQiOiBbICJtZW1iZXJzIiBdLAorICAgICAgICAgICJwcm9wZXJ0aWVzIjogeworICAgICAgICAgICAgIm1lbWJlcnMiOiB7CisgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKKyAgICAgICAgICAgICAgIml0ZW1zIjogeworICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCisgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CisgICAgICAgICAgICAgICAgICAibmFtZSI6IHsgInR5cGUiOiAic3RyaW5nIiB9LAorICAgICAgICAgICAgICAgICAgInZhbHVlIjogeyAidHlwZSI6ICJpbnRlZ2VyIiB9CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAicmVxdWlyZWQiOiBbICJuYW1lIiwgInZhbHVlIiBdCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ0eXBlZGVmIjogeworICAgICAgInRpdGxlIjogIlRocmlmdCB0eXBlZGVmIGRlZmluaXRpb24gc2NoZW1hIiwKKyAgICAgICJ0eXBlIjogIm9iamVjdCIsCisgICAgICAiYWxsT2YiOiBbCisgICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9uYW1lLWFuZC1kb2MiIH0sCisgICAgICAgIHsKKyAgICAgICAgICAicHJvcGVydGllcyI6IHsKKyAgICAgICAgICAgICJ0eXBlSWQiOiB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvdHlwZS1pZCIgfSwKKyAgICAgICAgICAgICJ0eXBlIjogeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3R5cGUtZGVzYyIgfQorICAgICAgICAgIH0sCisgICAgICAgICAgInJlcXVpcmVkIjogWyAidHlwZUlkIiBdCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJjb25zdGFudCI6IHsKKyAgICAgICJ0aXRsZSI6ICJUaHJpZnQgY29uc3RhbnQgZGVmaW5pdGlvbiBzY2hlbWEiLAorICAgICAgInR5cGUiOiAib2JqZWN0IiwKKyAgICAgICJhbGxPZiI6IFsKKyAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL25hbWUtYW5kLWRvYyIgfSwKKyAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3R5cGUtZGVzYyIgfSwKKyAgICAgICAgeworICAgICAgICAgICJwcm9wZXJ0aWVzIjogeworICAgICAgICAgICAgInZhbHVlIjogeworICAgICAgICAgICAgICAib25lT2YiOiBbCisgICAgICAgICAgICAgICAgeyAidHlwZSI6ICJzdHJpbmciIH0sCisgICAgICAgICAgICAgICAgeyAidHlwZSI6ICJudW1iZXIiIH0sCisgICAgICAgICAgICAgICAgeyAidHlwZSI6ICJhcnJheSIgfSwKKyAgICAgICAgICAgICAgICB7ICJ0eXBlIjogIm9iamVjdCIgfQorICAgICAgICAgICAgICBdCisgICAgICAgICAgICB9CisgICAgICAgICAgfSwKKyAgICAgICAgICAicmVxdWlyZWQiOiBbICJ2YWx1ZSIgXQorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiZmllbGQiOiB7CisgICAgICAidGl0bGUiOiAiVGhyaWZ0IHN0cnVjdCBmaWVsZCBkZWZpbml0aW9uIHNjaGVtYSIsCisgICAgICAidHlwZSI6ICJvYmplY3QiLAorICAgICAgImFsbE9mIjogWworICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvbmFtZS1hbmQtZG9jIiB9LAorICAgICAgICB7CisgICAgICAgICAgInByb3BlcnRpZXMiOiB7CisgICAgICAgICAgICAia2V5IjogeworICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIiwKKyAgICAgICAgICAgICAgIm1pbmltdW0iOiAxLAorICAgICAgICAgICAgICAibWF4aW11bSI6IDY1NTM1CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgInJlcXVpcmVkIjogeworICAgICAgICAgICAgICAiZW51bSI6IFsgInJlcXVpcmVkIiwgIm9wdGlvbmFsIiwgInJlcV9vdXQiIF0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAidHlwZUlkIjogeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3R5cGUtaWQiIH0sCisgICAgICAgICAgICAidHlwZSI6IHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy90eXBlLWRlc2MiIH0sCisgICAgICAgICAgICAiZGVmYXVsdCI6IHsKKyAgICAgICAgICAgICAgIm9uZU9mIjogWworICAgICAgICAgICAgICAgIHsgInR5cGUiOiAic3RyaW5nIiB9LAorICAgICAgICAgICAgICAgIHsgInR5cGUiOiAibnVtYmVyIiB9LAorICAgICAgICAgICAgICAgIHsgInR5cGUiOiAiYXJyYXkiIH0sCisgICAgICAgICAgICAgICAgeyAidHlwZSI6ICJvYmplY3QiIH0KKyAgICAgICAgICAgICAgXQorICAgICAgICAgICAgfQorICAgICAgICAgIH0sCisgICAgICAgICAgInJlcXVpcmVkIjogWyAia2V5IiwgInJlcXVpcmVkIiBdCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJzdHJ1Y3QiOiB7CisgICAgICAidGl0bGUiOiAiVGhyaWZ0IHN0cnVjdCBkZWZpbml0aW9uIHNjaGVtYSIsCisgICAgICAidHlwZSI6ICJvYmplY3QiLAorICAgICAgImFsbE9mIjogWworICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvbmFtZS1hbmQtZG9jIiB9LAorICAgICAgICB7CisgICAgICAgICAgInByb3BlcnRpZXMiOiB7CisgICAgICAgICAgICAiaXNFeGNlcHRpb24iOiB7ICJ0eXBlIjogImJvb2xlYW4iIH0sCisgICAgICAgICAgICAiaXNVbmlvbiI6IHsgInR5cGUiOiAiYm9vbGVhbiIgfSwKKyAgICAgICAgICAgICJmaWVsZHMiOiB7CisgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKKyAgICAgICAgICAgICAgIml0ZW1zIjogeworICAgICAgICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvZmllbGQiCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9LAorICAgICAgICAgICJyZXF1aXJlZCI6IFsgImlzRXhjZXB0aW9uIiwgImlzVW5pb24iLCAiZmllbGRzIiBdCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJ1bmlvbiI6IHsKKyAgICAgICJ0aXRsZSI6ICJUaHJpZnQgdW5pb24gZGVmaW5pdGlvbiBzY2hlbWEiLAorICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9zdHJ1Y3QiCisgICAgfSwKKyAgICAiZXhjZXB0aW9uIjogeworICAgICAgInRpdGxlIjogIlRocmlmdCBleGNlcHRpb24gZGVmaW5pdGlvbiBzY2hlbWEiLAorICAgICAgInR5cGUiOiAib2JqZWN0IiwKKyAgICAgICJwcm9wZXJ0aWVzIjogeworICAgICAgICAia2V5IjogeworICAgICAgICAgICJ0eXBlIjogImludGVnZXIiLAorICAgICAgICAgICJtaW5pbXVtIjogMSwKKyAgICAgICAgICAibWF4aW11bSI6IDY1NTM1CisgICAgICAgIH0sCisgICAgICAgICJuYW1lIjogeyAidHlwZSI6ICJzdHJpbmciIH0sCisgICAgICAgICJ0eXBlSWQiOiB7ICJlbnVtIjogWyAiZXhjZXB0aW9uIiBdIH0sCisgICAgICAgICJ0eXBlIjogeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3N0cnVjdC10eXBlIiB9CisgICAgICB9LAorICAgICAgInJlcXVpcmVkIjogWyAia2V5IiwgIm5hbWUiLCAidHlwZUlkIiBdCisgICAgfSwKKyAgICAiZnVuY3Rpb24iOiB7CisgICAgICAidGl0bGUiOiAiVGhyaWZ0IHNlcnZpY2UgZnVuY3Rpb24gZGVmaW5pdGlvbiBzY2hlbWEiLAorICAgICAgInR5cGUiOiAib2JqZWN0IiwKKyAgICAgICJhbGxPZiI6IFsKKyAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL25hbWUtYW5kLWRvYyIgfSwKKyAgICAgICAgeworICAgICAgICAgICJwcm9wZXJ0aWVzIjogeworICAgICAgICAgICAgIm9uZXdheSI6IHsKKyAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAicmV0dXJuVHlwZSI6IHsKKyAgICAgICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy90eXBlLWRlc2MiCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImFyZ3VtZW50cyI6IHsKKyAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAorICAgICAgICAgICAgICAiaXRlbXMiOiB7CisgICAgICAgICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9maWVsZCIKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJleGNlcHRpb25zIjogeworICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCisgICAgICAgICAgICAgICJpdGVtcyI6IHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9leGNlcHRpb24iIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9LAorICAgICAgICAgICJyZXF1aXJlZCI6IFsgIm9uZXdheSIsICJhcmd1bWVudHMiLCAiZXhjZXB0aW9ucyIgXQorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAic2VydmljZSI6IHsKKyAgICAgICJ0aXRsZSI6ICJUaHJpZnQgc2VydmljZSBkZWZpbml0aW9uIHNjaGVtYSIsCisgICAgICAidHlwZSI6ICJvYmplY3QiLAorICAgICAgImFsbE9mIjogWworICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvbmFtZS1hbmQtZG9jIiB9LAorICAgICAgICB7CisgICAgICAgICAgInByb3BlcnRpZXMiOiB7CisgICAgICAgICAgICAiZnVuY3Rpb25zIjogeworICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCisgICAgICAgICAgICAgICJpdGVtcyI6IHsKKyAgICAgICAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2Z1bmN0aW9uIgorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfSwKKyAgICAgICAgICAicmVxdWlyZWQiOiBbICJmdW5jdGlvbnMiIF0KKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgImFubm90YXRpb25zIjogeworICAgICAgInRpdGxlIjogIk1hcCBvZiBhbm5vdGF0aW9uIG5hbWVzIHRvIHZhbHVlcyIsCisgICAgICAidHlwZSI6ICJvYmplY3QiLAorICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogeworICAgICAgICAidHlwZSI6ICJzdHJpbmciCisgICAgICB9CisgICAgfQorICB9LAorCisgICJ0eXBlIjogIm9iamVjdCIsCisgICJyZXF1aXJlZCI6IFsKKyAgICAibmFtZSIsCisgICAgImVudW1zIiwKKyAgICAidHlwZWRlZnMiLAorICAgICJzdHJ1Y3RzIiwKKyAgICAiY29uc3RhbnRzIiwKKyAgICAic2VydmljZXMiCisgIF0sCisgICJwcm9wZXJ0aWVzIjogeworICAgICJuYW1lIjogeworICAgICAgInR5cGUiOiAic3RyaW5nIgorICAgIH0sCisgICAgImluY2x1ZGVzIjogeworICAgICAgInR5cGUiOiAiYXJyYXkiLAorICAgICAgIml0ZW1zIjogeworICAgICAgICAidHlwZSI6ICJzdHJpbmciCisgICAgICB9LAorICAgICAgInVuaXF1ZUl0ZW1zIjogdHJ1ZQorICAgIH0sCisgICAgIm5hbWVzcGFjZXMiOiB7CisgICAgICAidHlwZSI6ICJvYmplY3QiLAorICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogeworICAgICAgICAidHlwZSI6ICJzdHJpbmciCisgICAgICB9CisgICAgfSwKKyAgICAiZW51bXMiOiB7CisgICAgICAidHlwZSI6ICJhcnJheSIsCisgICAgICAiaXRlbXMiOiB7CisgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvZW51bSIKKyAgICAgIH0KKyAgICB9LAorICAgICJ0eXBlZGVmcyI6IHsKKyAgICAgICJ0eXBlIjogImFycmF5IiwKKyAgICAgICJpdGVtcyI6IHsKKyAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy90eXBlZGVmIgorICAgICAgfQorICAgIH0sCisgICAgInN0cnVjdHMiOiB7CisgICAgICAidHlwZSI6ICJhcnJheSIsCisgICAgICAiaXRlbXMiOiB7CisgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvc3RydWN0IgorICAgICAgfQorICAgIH0sCisgICAgImNvbnN0YW50cyI6IHsKKyAgICAgICJ0eXBlIjogImFycmF5IiwKKyAgICAgICJpdGVtcyI6IHsKKyAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9jb25zdGFudCIKKyAgICAgIH0KKyAgICB9LAorICAgICJzZXJ2aWNlcyI6IHsKKyAgICAgICJ0eXBlIjogImFycmF5IiwKKyAgICAgICJpdGVtcyI6IHsKKyAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9zZXJ2aWNlIgorICAgICAgfQorICAgIH0KKyAgfSwKKyAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogZmFsc2UKK30KZGlmZiAtLWdpdCBhL2xpYi9qc29uL3Rlc3QvTWFrZWZpbGUuYW0gYi9saWIvanNvbi90ZXN0L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiODdhNTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanNvbi90ZXN0L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMjYgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitjaGVjazoKKwkkKEFOVCkgJChBTlRfRkxBR1MpIHRlc3QKKworIyBNYWtlIHN1cmUgdGhpcyBkb2Vzbid0IGZhaWwgaWYgYW50IGlzIG5vdCBjb25maWd1cmVkLgorY2xlYW4tbG9jYWw6CisJQU5UPSQoQU5UKSA7IGlmIHRlc3QgLXogIiQkQU5UIiA7IHRoZW4gQU5UPTogOyBmaSA7IFwKKwkkJEFOVCAkKEFOVF9GTEFHUykgY2xlYW4KZGlmZiAtLWdpdCBhL2xpYi9qc29uL3Rlc3QvYnVpbGQucHJvcGVydGllcyBiL2xpYi9qc29uL3Rlc3QvYnVpbGQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzVmNjQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzb24vdGVzdC9idWlsZC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTAgQEAKKyMgSmFyIHZlcnNpb25zCittdm4uYW50LnRhc2sudmVyc2lvbj0yLjEuMworCisjIERlcGVuZGVuY3kgdmVyc2lvbnMKK2pzb24tc2NoZW1hLXZhbGlkYXRvci52ZXJzaW9uPTIuMi42CisKKyMgTWF2ZW4gZGVwZW5kZW5jeSBkb3dubG9hZCBsb2NhdGlvbnMKK212bi5yZXBvPWh0dHA6Ly9yZXBvMS5tYXZlbi5vcmcvbWF2ZW4yCittdm4uYW50LnRhc2sudXJsPSR7bXZuLnJlcG99L29yZy9hcGFjaGUvbWF2ZW4vbWF2ZW4tYW50LXRhc2tzLyR7bXZuLmFudC50YXNrLnZlcnNpb259Cittdm4uYW50LnRhc2suamFyPW1hdmVuLWFudC10YXNrcy0ke212bi5hbnQudGFzay52ZXJzaW9ufS5qYXIKZGlmZiAtLWdpdCBhL2xpYi9qc29uL3Rlc3QvYnVpbGQueG1sIGIvbGliL2pzb24vdGVzdC9idWlsZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU2YTIzOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qc29uL3Rlc3QvYnVpbGQueG1sCkBAIC0wLDAgKzEsMTQ0IEBACis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgbmFtZT0iSlNPTiBTY2hlbWEgVGVzdCIgZGVmYXVsdD0idGVzdCIgYmFzZWRpcj0iLiIKKyAgeG1sbnM6YXJ0aWZhY3Q9ImFudGxpYjpvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LmFudCI+CisKKyAgPGRlc2NyaXB0aW9uPkpTT04gU2NoZW1hIFZhbGlkYXRpb24gVGVzdDwvZGVzY3JpcHRpb24+CisKKyAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmRpciIgbG9jYXRpb249IiR7YmFzZWRpcn0vYnVpbGQiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJqc29uLmRpciIgbG9jYXRpb249IiR7YmFzZWRpcn0vLi4iIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJnZW4uanNvbi5kaXIiIGxvY2F0aW9uPSIke2J1aWxkLmRpcn0vZ2VuLWpzb24iIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJqc29uLnNjaGVtYSIgbG9jYXRpb249IiR7anNvbi5kaXJ9L3NjaGVtYS5qc29uIiAvPgorICA8cHJvcGVydHkgbmFtZT0iYnVpbGQudG9vbHMuZGlyIiBsb2NhdGlvbj0iJHtidWlsZC5kaXJ9L3Rvb2xzIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5saWIuZGlyIiBsb2NhdGlvbj0iJHtidWlsZC5kaXJ9L2xpYiIvPgorCisgIDwhLS0gdGhlIHJvb3QgZGlyZWN0b3J5LCB3aGVyZSB5b3UgdW5wYWNrIHRocmlmdCBkaXN0aWJ1dGlvbiAoZS5nLiB0aHJpZnQtMC54LngudGFyLmd6KSAtLT4KKyAgPHByb3BlcnR5IG5hbWU9InRocmlmdC5kaXIiIGxvY2F0aW9uPSIuLi8uLi8uLi8iIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJ0aHJpZnQudGVzdC5kaXIiIGxvY2F0aW9uPSIke3RocmlmdC5kaXJ9L3Rlc3QiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJ0aHJpZnQuY29tcGlsZXIiIGxvY2F0aW9uPSIke3RocmlmdC5kaXJ9L2NvbXBpbGVyL2NwcC90aHJpZnQiIC8+CisKKyAgPCEtLSBHZXQgbWF2ZW4gZGVwZW5kZW5jeSB2ZXJzaW9ucyBmcm9tIGhlcmUgLS0+CisgIDxwcm9wZXJ0eSBmaWxlPSIke2Jhc2VkaXJ9L2J1aWxkLnByb3BlcnRpZXMiIC8+CisKKyAgPHBhdGggaWQ9InRlc3QuY2xhc3NwYXRoIj4KKyAgICA8ZmlsZXNldCBkaXI9IiR7YnVpbGQubGliLmRpcn0iPgorICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiIC8+CisgICAgPC9maWxlc2V0PgorICA8L3BhdGg+CisKKyAgPHRhcmdldCBuYW1lPSJjb21waWxlci5jaGVjayI+CisgICAgPGZhaWw+CisgICAgICA8Y29uZGl0aW9uPgorICAgICAgICA8bm90PgorICAgICAgICAgIDxyZXNvdXJjZWNvdW50IGNvdW50PSIxIj4KKyAgICAgICAgICAgIDxmaWxlc2V0IGlkPSJmcyIgZmlsZT0iJHt0aHJpZnQuY29tcGlsZXJ9Ii8+CisgICAgICAgICAgPC9yZXNvdXJjZWNvdW50PgorICAgICAgICA8L25vdD4KKyAgICAgIDwvY29uZGl0aW9uPgorICAgICAgVGhyaWZ0IGNvbXBpbGVyIGlzIG1pc3NpbmcgIQorICAgIDwvZmFpbD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJpbml0IiBkZXBlbmRzPSJjb21waWxlci5jaGVjaywgbWtkaXJzLCBtdm4uaW5pdCI+CisgICAgPHRzdGFtcCAvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Im1rZGlycyI+CisgICAgPG1rZGlyIGRpcj0iJHtidWlsZC5kaXJ9Ii8+CisgICAgPG1rZGlyIGRpcj0iJHtidWlsZC5saWIuZGlyfSIvPgorICAgIDxta2RpciBkaXI9IiR7YnVpbGQudG9vbHMuZGlyfSIvPgorICAgIDxta2RpciBkaXI9IiR7Z2VuLmpzb24uZGlyfSIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImdlbmVyYXRlIiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8ZXhlYyBleGVjdXRhYmxlPSIke3RocmlmdC5jb21waWxlcn0iIGZhaWxvbmVycm9yPSJ0cnVlIj4KKyAgICAgIDxhcmcgbGluZT0iLS1nZW4ganNvbiIvPgorICAgICAgPGFyZyBsaW5lPSItb3V0ICR7Z2VuLmpzb24uZGlyfSIvPgorICAgICAgPGFyZyBsaW5lPSIke3RocmlmdC50ZXN0LmRpcn0vVGhyaWZ0VGVzdC50aHJpZnQiLz4KKyAgICA8L2V4ZWM+CisgICAgPGV4ZWMgZXhlY3V0YWJsZT0iJHt0aHJpZnQuY29tcGlsZXJ9IiBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICA8YXJnIGxpbmU9Ii0tZ2VuIGpzb246bWVyZ2UiLz4KKyAgICAgIDxhcmcgbGluZT0iLW91dCAke2dlbi5qc29uLmRpcn0iLz4KKyAgICAgIDxhcmcgbGluZT0iJHt0aHJpZnQudGVzdC5kaXJ9L0luY2x1ZGUudGhyaWZ0Ii8+CisgICAgPC9leGVjPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3QiIGRlc2NyaXB0aW9uPSJydW4gc2NoZW1hIHZhbGlkYXRpb24iCisgICAgICAgICAgZGVwZW5kcz0idmFsaWRhdGUtc2NoZW1hLCB2YWxpZGF0ZS1nZW5lcmF0ZWQtanNvbiIvPgorCisgIDx0YXJnZXQgbmFtZT0idmFsaWRhdGUtc2NoZW1hIiBkZXBlbmRzPSJpbml0Ij4KKyAgICA8amF2YSBjbGFzc25hbWU9ImNvbS5naXRodWIuZmdlLmpzb25zY2hlbWEubWFpbi5jbGkuTWFpbiIKKyAgICAgICAgICBjbGFzc3BhdGhyZWY9InRlc3QuY2xhc3NwYXRoIiBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICA8YXJnIHZhbHVlPSItLXN5bnRheCIvPgorICAgICAgPGFyZyB2YWx1ZT0iJHtqc29uLnNjaGVtYX0iLz4KKyAgICA8L2phdmE+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idmFsaWRhdGUtZ2VuZXJhdGVkLWpzb24iIGRlcGVuZHM9ImluaXQsIGdlbmVyYXRlIj4KKyAgICA8dmFsaWRhdGUtanNvbiBmaWxlPSIke2dlbi5qc29uLmRpcn0vVGhyaWZ0VGVzdC5qc29uIi8+CisgICAgPHZhbGlkYXRlLWpzb24gZmlsZT0iJHtnZW4uanNvbi5kaXJ9L0luY2x1ZGUuanNvbiIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImNsZWFuIj4KKyAgICA8ZGVsZXRlIGRpcj0iJHtidWlsZC5kaXJ9IiAvPgorICAgIDxkZWxldGUgZGlyPSIke2dlbi5qc29uLmRpcn0iIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibXZuLmFudC50YXNrcy5kb3dubG9hZCIgZGVwZW5kcz0ibWtkaXJzLG12bi5hbnQudGFza3MuY2hlY2siIHVubGVzcz0ibXZuLmFudC50YXNrcy5mb3VuZCI+CisgICAgPGdldCBzcmM9IiR7bXZuLmFudC50YXNrLnVybH0vJHttdm4uYW50LnRhc2suamFyfSIgZGVzdD0iJHtidWlsZC50b29scy5kaXJ9LyR7bXZuLmFudC50YXNrLmphcn0iIHVzZXRpbWVzdGFtcD0idHJ1ZSIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Im12bi5hbnQudGFza3MuY2hlY2siPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9Im12bi5hbnQudGFza3MuZm91bmQiPgorICAgICAgPHR5cGVmb3VuZCB1cmk9ImFudGxpYjpvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LmFudCIgbmFtZT0iYXJ0aWZhY3QiLz4KKyAgICA8L2NvbmRpdGlvbj4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJtdm4uaW5pdCIgZGVwZW5kcz0ibXZuLmFudC50YXNrcy5kb3dubG9hZCIgdW5sZXNzPSJtdm4uZmluaXNoZWQiPgorICAgIDx0eXBlZGVmIHVyaT0iYW50bGliOm9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuYW50IiBjbGFzc3BhdGg9IiR7YnVpbGQudG9vbHMuZGlyfS8ke212bi5hbnQudGFzay5qYXJ9Ii8+CisKKyAgICA8YXJ0aWZhY3Q6ZGVwZW5kZW5jaWVzIGZpbGVzZXRJZD0idGVzdC5kZXBlbmRlbmN5LmphcnMiPgorICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iY29tLmdpdGh1Yi5mZ2UiIGFydGlmYWN0SWQ9Impzb24tc2NoZW1hLXZhbGlkYXRvciIgdmVyc2lvbj0iJHtqc29uLXNjaGVtYS12YWxpZGF0b3IudmVyc2lvbn0iLz4KKyAgICA8L2FydGlmYWN0OmRlcGVuZGVuY2llcz4KKworICAgIDwhLS0gQ29weSB0aGUgZGVwZW5kZW5jaWVzIHRvIHRoZSBidWlsZC9saWIgZGlyIC0tPgorICAgIDxjb3B5IHRvZGlyPSIke2J1aWxkLmxpYi5kaXJ9Ij4KKyAgICAgIDxmaWxlc2V0IHJlZmlkPSJ0ZXN0LmRlcGVuZGVuY3kuamFycyIvPgorICAgICAgPG1hcHBlciB0eXBlPSJmbGF0dGVuIi8+CisgICAgPC9jb3B5PgorCisgICAgPHByb3BlcnR5IG5hbWU9Im12bi5maW5pc2hlZCIgdmFsdWU9InRydWUiLz4KKyAgPC90YXJnZXQ+CisKKyAgPG1hY3JvZGVmIG5hbWU9InZhbGlkYXRlLWpzb24iPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmlsZSIgZGVmYXVsdD0iIi8+CisgICAgPHNlcXVlbnRpYWw+CisgICAgICA8amF2YSBmYWlsb25lcnJvcj0idHJ1ZSIKKyAgICAgICAgICAgIGZvcms9InRydWUiCisgICAgICAgICAgICBkaXI9IiR7anNvbi5kaXJ9IgorICAgICAgICAgICAgY2xhc3NuYW1lPSJjb20uZ2l0aHViLmZnZS5qc29uc2NoZW1hLm1haW4uY2xpLk1haW4iCisgICAgICAgICAgICBjbGFzc3BhdGhyZWY9InRlc3QuY2xhc3NwYXRoIj4KKyAgICAgICAgPGFyZyBsaW5lPSItLWZha2Vyb290IGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy8iLz4KKyAgICAgICAgPGFyZyB2YWx1ZT0iJHtqc29uLnNjaGVtYX0iLz4KKyAgICAgICAgPGFyZyB2YWx1ZT0iQHtmaWxlfSIvPgorICAgICAgPC9qYXZhPgorICAgIDwvc2VxdWVudGlhbD4KKyAgPC9tYWNyb2RlZj4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbGliL2x1YS9NYWtlZmlsZS5hbSBiL2xpYi9sdWEvTWFrZWZpbGUuYW0KaW5kZXggNGU3ZjQ3Mi4uNWIwZjE3YSAxMDA2NDQKLS0tIGEvbGliL2x1YS9NYWtlZmlsZS5hbQorKysgYi9saWIvbHVhL01ha2VmaWxlLmFtCkBAIC0yMyw5ICsyMyw5IEBACiAKIGxpYl9MVExJQlJBUklFUyA9IFwKIAkJCWxpYmx1YXNvY2tldC5sYSBcCisJCQlsaWJsdWFsb25nbnVtYmVyLmxhIFwKIAkJCWxpYmx1YWJwYWNrLmxhIFwKLQkJCWxpYmx1YWJpdHdpc2UubGEgXAotCQkJbGlibHVhbG9uZ251bWJlci5sYQorCQkJbGlibHVhYml0d2lzZS5sYQogCiBsaWJsdWFzb2NrZXRfbGFfU09VUkNFUyA9IFwKIAkJCXNyYy9sdWFzb2NrZXQuYyBcCkBAIC0zMywzMyArMzMsMzkgQEAKIAogbm9iYXNlX2luY2x1ZGVfSEVBREVSUyA9IHNyYy9zb2NrZXQuaAogCi1saWJsdWFzb2NrZXRfbGFfQ1BQRkxBR1MgPSAkKEFNX0NQUEZMQUdTKSAtSS91c3IvaW5jbHVkZS9sdWE1LjIgLURMVUFfQ09NUEFUX01PRFVMRQotbGlibHVhc29ja2V0X2xhX0xERkxBR1MgPSAkKEFNX0xERkxBR1MpICQoTFVBX0xJQikgLWxtCitsaWJsdWFzb2NrZXRfbGFfQ1BQRkxBR1MgPSAkKEFNX0NQUEZMQUdTKSAkKExVQV9JTkNMVURFKSAtRExVQV9DT01QQVRfTU9EVUxFCitsaWJsdWFzb2NrZXRfbGFfTERGTEFHUyA9ICQoQU1fTERGTEFHUykKK2xpYmx1YXNvY2tldF9sYV9MSUJBREQgPSAkKExVQV9MSUIpIC1sbQogCiBsaWJsdWFicGFja19sYV9TT1VSQ0VTID0gc3JjL2x1YWJwYWNrLmMKIAotbGlibHVhYnBhY2tfbGFfQ1BQRkxBR1MgPSAkKEFNX0NQUEZMQUdTKSAtSS91c3IvaW5jbHVkZS9sdWE1LjIgLURMVUFfQ09NUEFUX01PRFVMRQotbGlibHVhYnBhY2tfbGFfTERGTEFHUyA9ICQoQU1fTERGTEFHUykgJChMVUFfTElCKSAtbG0KLWxpYmx1YWJwYWNrX2xhX0xJQkFERCA9IGxpYmx1YWxvbmdudW1iZXIubGEKK2xpYmx1YWJwYWNrX2xhX0NQUEZMQUdTID0gJChBTV9DUFBGTEFHUykgJChMVUFfSU5DTFVERSkgLURMVUFfQ09NUEFUX01PRFVMRQorbGlibHVhYnBhY2tfbGFfTERGTEFHUyA9ICQoQU1fTERGTEFHUykKK2xpYmx1YWJwYWNrX2xhX0xJQkFERCA9IGxpYmx1YWxvbmdudW1iZXIubGEgJChMVUFfTElCKSAtbG0KIAogbGlibHVhYml0d2lzZV9sYV9TT1VSQ0VTID0gc3JjL2x1YWJpdHdpc2UuYwogCi1saWJsdWFiaXR3aXNlX2xhX0NQUEZMQUdTID0gJChBTV9DUFBGTEFHUykgLUkvdXNyL2luY2x1ZGUvbHVhNS4yIC1ETFVBX0NPTVBBVF9NT0RVTEUKLWxpYmx1YWJpdHdpc2VfbGFfTERGTEFHUyA9ICQoQU1fTERGTEFHUykgJChMVUFfTElCKSAtbG0KK2xpYmx1YWJpdHdpc2VfbGFfQ1BQRkxBR1MgPSAkKEFNX0NQUEZMQUdTKSAkKExVQV9JTkNMVURFKSAtRExVQV9DT01QQVRfTU9EVUxFCitsaWJsdWFiaXR3aXNlX2xhX0xERkxBR1MgPSAkKEFNX0xERkxBR1MpCitsaWJsdWFiaXR3aXNlX2xhX0xJQkFERCA9ICQoTFVBX0xJQikgLWxtCiAKIGxpYmx1YWxvbmdudW1iZXJfbGFfU09VUkNFUyA9IFwKIAkJc3JjL2x1YWxvbmdudW1iZXIuYyBcCiAJCXNyYy9sb25nbnVtYmVydXRpbHMuYwogCi1saWJsdWFsb25nbnVtYmVyX2xhX0NQUEZMQUdTID0gJChBTV9DUFBGTEFHUykgLUkvdXNyL2luY2x1ZGUvbHVhNS4yIC1ETFVBX0NPTVBBVF9NT0RVTEUKLWxpYmx1YWxvbmdudW1iZXJfbGFfTERGTEFHUyA9ICQoQU1fTERGTEFHUykgJChMVUFfTElCKSAtbG0KK2xpYmx1YWxvbmdudW1iZXJfbGFfQ1BQRkxBR1MgPSAkKEFNX0NQUEZMQUdTKSAkKExVQV9JTkNMVURFKSAtRExVQV9DT01QQVRfTU9EVUxFCitsaWJsdWFsb25nbnVtYmVyX2xhX0xERkxBR1MgPSAkKEFNX0xERkxBR1MpCitsaWJsdWFsb25nbnVtYmVyX2xhX0xJQkFERCA9ICQoTFVBX0xJQikgLWxtCiAKIEVYVFJBX0RJU1QgPSBcCiAJCWNvZGluZ19zdGFuZGFyZHMubWQgXAogCQlUQmluYXJ5UHJvdG9jb2wubHVhIFwKIAkJVEJ1ZmZlcmVkVHJhbnNwb3J0Lmx1YSBcCisJCVRDb21wYWN0UHJvdG9jb2wubHVhIFwKIAkJVEZyYW1lZFRyYW5zcG9ydC5sdWEgXAogCQlUaHJpZnQubHVhIFwKKwkJVEh0dHBUcmFuc3BvcnQubHVhIFwKKwkJVEpzb25Qcm90b2NvbC5sdWEgXAogCQlUTWVtb3J5QnVmZmVyLmx1YSBcCiAJCVRQcm90b2NvbC5sdWEgXAogCQlUU2VydmVyLmx1YSBcCmRpZmYgLS1naXQgYS9saWIvbHVhL1RCdWZmZXJlZFRyYW5zcG9ydC5sdWEgYi9saWIvbHVhL1RCdWZmZXJlZFRyYW5zcG9ydC5sdWEKaW5kZXggMmIwYjk0Ni4uNDVlZjRiMSAxMDA2NDQKLS0tIGEvbGliL2x1YS9UQnVmZmVyZWRUcmFuc3BvcnQubHVhCisrKyBiL2xpYi9sdWEvVEJ1ZmZlcmVkVHJhbnNwb3J0Lmx1YQpAQCAtMzcsNyArMzcsNyBAQAogICAgIGVycm9yKCdZb3UgbXVzdCBwcm92aWRlICcgLi4gdHR5cGUoc2VsZikgLi4gJyB3aXRoIGEgdHJhbnMnKQogICBlbmQKIAotICByZXR1cm4gVFRyYW5zcG9ydEJhc2U6bmV3KG9iaikKKyAgcmV0dXJuIFRUcmFuc3BvcnRCYXNlLm5ldyhzZWxmLCBvYmopCiBlbmQKIAogZnVuY3Rpb24gVEJ1ZmZlcmVkVHJhbnNwb3J0OmlzT3BlbigpCmRpZmYgLS1naXQgYS9saWIvbHVhL1RDb21wYWN0UHJvdG9jb2wubHVhIGIvbGliL2x1YS9UQ29tcGFjdFByb3RvY29sLmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Nzc1OTVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2x1YS9UQ29tcGFjdFByb3RvY29sLmx1YQpAQCAtMCwwICsxLDQ1NyBAQAorLS0KKy0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCistLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCistLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCistLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCistLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy0tCistLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLS0KKy0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCistLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCistLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCistLSB1bmRlciB0aGUgTGljZW5zZS4KKy0tCisKK3JlcXVpcmUgJ1RQcm90b2NvbCcKK3JlcXVpcmUgJ2xpYmx1YWJwYWNrJworcmVxdWlyZSAnbGlibHVhYml0d2lzZScKK3JlcXVpcmUgJ2xpYmx1YWxvbmdudW1iZXInCisKK1RDb21wYWN0UHJvdG9jb2wgPSBfX1RPYmplY3QubmV3KFRQcm90b2NvbEJhc2UsIHsKKyAgX190eXBlID0gJ1RDb21wYWN0UHJvdG9jb2wnLAorICBDT01QQUNUX1BST1RPQ09MX0lEICAgICAgID0gMHg4MiwKKyAgQ09NUEFDVF9WRVJTSU9OICAgICAgICAgICA9IDEsCisgIENPTVBBQ1RfVkVSU0lPTl9NQVNLICAgICAgPSAweDFmLAorICBDT01QQUNUX1RZUEVfTUFTSyAgICAgICAgID0gMHhFMCwKKyAgQ09NUEFDVF9UWVBFX0JJVFMgICAgICAgICA9IDB4MDcsCisgIENPTVBBQ1RfVFlQRV9TSElGVF9BTU9VTlQgPSA1LAorCisgIC0tIFVzZWQgdG8ga2VlcCB0cmFjayBvZiB0aGUgbGFzdCBmaWVsZCBmb3IgdGhlIGN1cnJlbnQgYW5kIHByZXZpb3VzIHN0cnVjdHMsCisgIC0tIHNvIHdlIGNhbiBkbyB0aGUgZGVsdGEgc3R1ZmYuCisgIGxhc3RGaWVsZCA9IHt9LAorICBsYXN0RmllbGRJZCA9IDAsCisgIGxhc3RGaWVsZEluZGV4ID0gMSwKKworICAtLSBJZiB3ZSBlbmNvdW50ZXIgYSBib29sZWFuIGZpZWxkIGJlZ2luLCBzYXZlIHRoZSBURmllbGQgaGVyZSBzbyBpdCBjYW4KKyAgLS0gaGF2ZSB0aGUgdmFsdWUgaW5jb3Jwb3JhdGVkLgorICBib29sZWFuRmllbGROYW1lICAgID0gIiIsCisgIGJvb2xlYW5GaWVsZElkICAgICAgPSAwLAorICBib29sZWFuRmllbGRQZW5kaW5nID0gZmFsc2UsCisKKyAgLS0gSWYgd2UgcmVhZCBhIGZpZWxkIGhlYWRlciwgYW5kIGl0J3MgYSBib29sZWFuIGZpZWxkLCBzYXZlIHRoZSBib29sZWFuCisgIC0tIHZhbHVlIGhlcmUgc28gdGhhdCByZWFkQm9vbCBjYW4gdXNlIGl0LgorICBib29sVmFsdWUgICAgICAgICAgPSBmYWxzZSwKKyAgYm9vbFZhbHVlSXNOb3ROdWxsID0gZmFsc2UsCit9KQorCitUQ29tcGFjdFR5cGUgPSB7CisgIENPTVBBQ1RfQk9PTEVBTl9UUlVFICA9IDB4MDEsCisgIENPTVBBQ1RfQk9PTEVBTl9GQUxTRSA9IDB4MDIsCisgIENPTVBBQ1RfQllURSAgICAgICAgICA9IDB4MDMsCisgIENPTVBBQ1RfSTE2ICAgICAgICAgICA9IDB4MDQsCisgIENPTVBBQ1RfSTMyICAgICAgICAgICA9IDB4MDUsCisgIENPTVBBQ1RfSTY0ICAgICAgICAgICA9IDB4MDYsCisgIENPTVBBQ1RfRE9VQkxFICAgICAgICA9IDB4MDcsCisgIENPTVBBQ1RfQklOQVJZICAgICAgICA9IDB4MDgsCisgIENPTVBBQ1RfTElTVCAgICAgICAgICA9IDB4MDksCisgIENPTVBBQ1RfU0VUICAgICAgICAgICA9IDB4MEEsCisgIENPTVBBQ1RfTUFQICAgICAgICAgICA9IDB4MEIsCisgIENPTVBBQ1RfU1RSVUNUICAgICAgICA9IDB4MEMKK30KKworVFR5cGVUb0NvbXBhY3RUeXBlID0ge30KK1RUeXBlVG9Db21wYWN0VHlwZVtUVHlwZS5TVE9QXSAgID0gVFR5cGUuU1RPUAorVFR5cGVUb0NvbXBhY3RUeXBlW1RUeXBlLkJPT0xdICAgPSBUQ29tcGFjdFR5cGUuQ09NUEFDVF9CT09MRUFOX1RSVUUKK1RUeXBlVG9Db21wYWN0VHlwZVtUVHlwZS5CWVRFXSAgID0gVENvbXBhY3RUeXBlLkNPTVBBQ1RfQllURQorVFR5cGVUb0NvbXBhY3RUeXBlW1RUeXBlLkkxNl0gICAgPSBUQ29tcGFjdFR5cGUuQ09NUEFDVF9JMTYKK1RUeXBlVG9Db21wYWN0VHlwZVtUVHlwZS5JMzJdICAgID0gVENvbXBhY3RUeXBlLkNPTVBBQ1RfSTMyCitUVHlwZVRvQ29tcGFjdFR5cGVbVFR5cGUuSTY0XSAgICA9IFRDb21wYWN0VHlwZS5DT01QQUNUX0k2NAorVFR5cGVUb0NvbXBhY3RUeXBlW1RUeXBlLkRPVUJMRV0gPSBUQ29tcGFjdFR5cGUuQ09NUEFDVF9ET1VCTEUKK1RUeXBlVG9Db21wYWN0VHlwZVtUVHlwZS5TVFJJTkddID0gVENvbXBhY3RUeXBlLkNPTVBBQ1RfQklOQVJZCitUVHlwZVRvQ29tcGFjdFR5cGVbVFR5cGUuTElTVF0gICA9IFRDb21wYWN0VHlwZS5DT01QQUNUX0xJU1QKK1RUeXBlVG9Db21wYWN0VHlwZVtUVHlwZS5TRVRdICAgID0gVENvbXBhY3RUeXBlLkNPTVBBQ1RfU0VUCitUVHlwZVRvQ29tcGFjdFR5cGVbVFR5cGUuTUFQXSAgICA9IFRDb21wYWN0VHlwZS5DT01QQUNUX01BUAorVFR5cGVUb0NvbXBhY3RUeXBlW1RUeXBlLlNUUlVDVF0gPSBUQ29tcGFjdFR5cGUuQ09NUEFDVF9TVFJVQ1QKKworQ29tcGFjdFR5cGVUb1RUeXBlID0ge30KK0NvbXBhY3RUeXBlVG9UVHlwZVtUVHlwZS5TVE9QXSAgICAgICAgICAgICAgICAgICAgICAgID0gVFR5cGUuU1RPUAorQ29tcGFjdFR5cGVUb1RUeXBlW1RDb21wYWN0VHlwZS5DT01QQUNUX0JPT0xFQU5fVFJVRV0gPSBUVHlwZS5CT09MCitDb21wYWN0VHlwZVRvVFR5cGVbVENvbXBhY3RUeXBlLkNPTVBBQ1RfQk9PTEVBTl9GQUxTRV0gPSBUVHlwZS5CT09MCitDb21wYWN0VHlwZVRvVFR5cGVbVENvbXBhY3RUeXBlLkNPTVBBQ1RfQllURV0gICAgICAgICA9IFRUeXBlLkJZVEUKK0NvbXBhY3RUeXBlVG9UVHlwZVtUQ29tcGFjdFR5cGUuQ09NUEFDVF9JMTZdICAgICAgICAgID0gVFR5cGUuSTE2CitDb21wYWN0VHlwZVRvVFR5cGVbVENvbXBhY3RUeXBlLkNPTVBBQ1RfSTMyXSAgICAgICAgICA9IFRUeXBlLkkzMgorQ29tcGFjdFR5cGVUb1RUeXBlW1RDb21wYWN0VHlwZS5DT01QQUNUX0k2NF0gICAgICAgICAgPSBUVHlwZS5JNjQKK0NvbXBhY3RUeXBlVG9UVHlwZVtUQ29tcGFjdFR5cGUuQ09NUEFDVF9ET1VCTEVdICAgICAgID0gVFR5cGUuRE9VQkxFCitDb21wYWN0VHlwZVRvVFR5cGVbVENvbXBhY3RUeXBlLkNPTVBBQ1RfQklOQVJZXSAgICAgICA9IFRUeXBlLlNUUklORworQ29tcGFjdFR5cGVUb1RUeXBlW1RDb21wYWN0VHlwZS5DT01QQUNUX0xJU1RdICAgICAgICAgPSBUVHlwZS5MSVNUCitDb21wYWN0VHlwZVRvVFR5cGVbVENvbXBhY3RUeXBlLkNPTVBBQ1RfU0VUXSAgICAgICAgICA9IFRUeXBlLlNFVAorQ29tcGFjdFR5cGVUb1RUeXBlW1RDb21wYWN0VHlwZS5DT01QQUNUX01BUF0gICAgICAgICAgPSBUVHlwZS5NQVAKK0NvbXBhY3RUeXBlVG9UVHlwZVtUQ29tcGFjdFR5cGUuQ09NUEFDVF9TVFJVQ1RdICAgICAgID0gVFR5cGUuU1RSVUNUCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6cmVzZXRMYXN0RmllbGQoKQorICBzZWxmLmxhc3RGaWVsZCA9IHt9CisgIHNlbGYubGFzdEZpZWxkSWQgPSAwCisgIHNlbGYubGFzdEZpZWxkSW5kZXggPSAxCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpwYWNrQ29tcGFjdFR5cGUoa3R5cGUsIHZ0eXBlKQorICByZXR1cm4gbGlibHVhYml0d2lzZS5ib3IobGlibHVhYml0d2lzZS5zaGlmdGwoa3R5cGUsIDQpLCB2dHlwZSkKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOndyaXRlTWVzc2FnZUJlZ2luKG5hbWUsIHR0eXBlLCBzZXFpZCkKKyAgc2VsZjp3cml0ZUJ5dGUoVENvbXBhY3RQcm90b2NvbC5DT01QQUNUX1BST1RPQ09MX0lEKQorICBzZWxmOndyaXRlQnl0ZShsaWJsdWFicGFjay5wYWNrTWVzZ1R5cGUoVENvbXBhY3RQcm90b2NvbC5DT01QQUNUX1ZFUlNJT04sCisgICAgVENvbXBhY3RQcm90b2NvbC5DT01QQUNUX1ZFUlNJT05fTUFTSyx0dHlwZSwKKyAgICBUQ29tcGFjdFByb3RvY29sLkNPTVBBQ1RfVFlQRV9TSElGVF9BTU9VTlQsCisgICAgVENvbXBhY3RQcm90b2NvbC5DT01QQUNUX1RZUEVfTUFTSykpCisgIHNlbGY6d3JpdGVWYXJpbnQzMihzZXFpZCkKKyAgc2VsZjp3cml0ZVN0cmluZyhuYW1lKQorICBzZWxmOnJlc2V0TGFzdEZpZWxkKCkKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOndyaXRlTWVzc2FnZUVuZCgpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDp3cml0ZVN0cnVjdEJlZ2luKG5hbWUpCisgIHNlbGYubGFzdEZpZWxkSW5kZXggPSBzZWxmLmxhc3RGaWVsZEluZGV4ICsgMQorICBzZWxmLmxhc3RGaWVsZFtzZWxmLmxhc3RGaWVsZEluZGV4XSA9IHNlbGYubGFzdEZpZWxkSWQKKyAgc2VsZi5sYXN0RmllbGRJZCA9IDAKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOndyaXRlU3RydWN0RW5kKCkKKyAgc2VsZi5sYXN0RmllbGRJbmRleCA9IHNlbGYubGFzdEZpZWxkSW5kZXggLSAxCisgIHNlbGYubGFzdEZpZWxkSWQgPSBzZWxmLmxhc3RGaWVsZFtzZWxmLmxhc3RGaWVsZEluZGV4XQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6d3JpdGVGaWVsZEJlZ2luKG5hbWUsIHR0eXBlLCBpZCkKKyAgaWYgdHR5cGUgPT0gVFR5cGUuQk9PTCB0aGVuCisgICAgc2VsZi5ib29sZWFuRmllbGROYW1lID0gbmFtZQorICAgIHNlbGYuYm9vbGVhbkZpZWxkSWQgICA9IGlkCisgICAgc2VsZi5ib29sZWFuRmllbGRQZW5kaW5nID0gdHJ1ZQorICBlbHNlCisgICAgc2VsZjp3cml0ZUZpZWxkQmVnaW5JbnRlcm5hbChuYW1lLCB0dHlwZSwgaWQsIC0xKQorICBlbmQKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOndyaXRlRmllbGRFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6d3JpdGVGaWVsZFN0b3AoKQorICBzZWxmOndyaXRlQnl0ZShUVHlwZS5TVE9QKTsKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOndyaXRlTWFwQmVnaW4oa3R5cGUsIHZ0eXBlLCBzaXplKQorICBpZiBzaXplID09IDAgdGhlbgorICAgIHNlbGY6d3JpdGVCeXRlKDApCisgIGVsc2UKKyAgICBzZWxmOndyaXRlVmFyaW50MzIoc2l6ZSkKKyAgICBzZWxmOndyaXRlQnl0ZShzZWxmOnBhY2tDb21wYWN0VHlwZShUVHlwZVRvQ29tcGFjdFR5cGVba3R5cGVdLCBUVHlwZVRvQ29tcGFjdFR5cGVbdnR5cGVdKSkKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDp3cml0ZU1hcEVuZCgpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDp3cml0ZUxpc3RCZWdpbihldHlwZSwgc2l6ZSkKKyAgc2VsZjp3cml0ZUNvbGxlY3Rpb25CZWdpbihldHlwZSwgc2l6ZSkKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOndyaXRlTGlzdEVuZCgpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDp3cml0ZVNldEJlZ2luKGV0eXBlLCBzaXplKQorICBzZWxmOndyaXRlQ29sbGVjdGlvbkJlZ2luKGV0eXBlLCBzaXplKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6d3JpdGVTZXRFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6d3JpdGVCb29sKGJvb2wpCisgIGxvY2FsIHZhbHVlID0gVENvbXBhY3RUeXBlLkNPTVBBQ1RfQk9PTEVBTl9GQUxTRQorICBpZiBib29sIHRoZW4KKyAgICB2YWx1ZSA9IFRDb21wYWN0VHlwZS5DT01QQUNUX0JPT0xFQU5fVFJVRQorICBlbmQKKyAgcHJpbnQodmFsdWUsc2VsZi5ib29sZWFuRmllbGRQZW5kaW5nLHNlbGYuYm9vbGVhbkZpZWxkSWQpCisgIGlmIHNlbGYuYm9vbGVhbkZpZWxkUGVuZGluZyB0aGVuCisgICAgc2VsZjp3cml0ZUZpZWxkQmVnaW5JbnRlcm5hbChzZWxmLmJvb2xlYW5GaWVsZE5hbWUsIFRUeXBlLkJPT0wsIHNlbGYuYm9vbGVhbkZpZWxkSWQsIHZhbHVlKQorICAgIHNlbGYuYm9vbGVhbkZpZWxkUGVuZGluZyA9IGZhbHNlCisgIGVsc2UKKyAgICBzZWxmOndyaXRlQnl0ZSh2YWx1ZSkKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDp3cml0ZUJ5dGUoYnl0ZSkKKyAgbG9jYWwgYnVmZiA9IGxpYmx1YWJwYWNrLmJwYWNrKCdjJywgYnl0ZSkKKyAgc2VsZi50cmFuczp3cml0ZShidWZmKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6d3JpdGVJMTYoaTE2KQorICBzZWxmOndyaXRlVmFyaW50MzIobGlibHVhYnBhY2suaTMyVG9aaWd6YWcoaTE2KSkKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOndyaXRlSTMyKGkzMikKKyAgc2VsZjp3cml0ZVZhcmludDMyKGxpYmx1YWJwYWNrLmkzMlRvWmlnemFnKGkzMikpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDp3cml0ZUk2NChpNjQpCisgIHNlbGY6d3JpdGVWYXJpbnQ2NChsaWJsdWFicGFjay5pNjRUb1ppZ3phZyhpNjQpKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6d3JpdGVEb3VibGUoZHViKQorICBsb2NhbCBidWZmID0gbGlibHVhYnBhY2suYnBhY2soJ2QnLCBkdWIpCisgIHNlbGYudHJhbnM6d3JpdGUoYnVmZikKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOndyaXRlU3RyaW5nKHN0cikKKyAgLS0gU2hvdWxkIGJlIHV0Zi04CisgIHNlbGY6d3JpdGVCaW5hcnkoc3RyKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6d3JpdGVCaW5hcnkoc3RyKQorICAtLSBTaG91bGQgYmUgdXRmLTgKKyAgc2VsZjp3cml0ZVZhcmludDMyKHN0cmluZy5sZW4oc3RyKSkKKyAgc2VsZi50cmFuczp3cml0ZShzdHIpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDp3cml0ZUZpZWxkQmVnaW5JbnRlcm5hbChuYW1lLCB0dHlwZSwgaWQsIHR5cGVPdmVycmlkZSkKKyAgaWYgdHlwZU92ZXJyaWRlID09IC0xIHRoZW4KKyAgICB0eXBlT3ZlcnJpZGUgPSBUVHlwZVRvQ29tcGFjdFR5cGVbdHR5cGVdCisgIGVuZAorICBsb2NhbCBvZmZzZXQgPSBpZCAtIHNlbGYubGFzdEZpZWxkSWQKKyAgaWYgaWQgPiBzZWxmLmxhc3RGaWVsZElkIGFuZCBvZmZzZXQgPD0gMTUgdGhlbgorICAgIHNlbGY6d3JpdGVCeXRlKGxpYmx1YWJpdHdpc2UuYm9yKGxpYmx1YWJpdHdpc2Uuc2hpZnRsKG9mZnNldCwgNCksIHR5cGVPdmVycmlkZSkpCisgIGVsc2UKKyAgICBzZWxmOndyaXRlQnl0ZSh0eXBlT3ZlcnJpZGUpCisgICAgc2VsZjp3cml0ZUkxNihpZCkKKyAgZW5kCisgIHNlbGYubGFzdEZpZWxkSWQgPSBpZAorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6d3JpdGVDb2xsZWN0aW9uQmVnaW4oZXR5cGUsIHNpemUpCisgIGlmIHNpemUgPD0gMTQgdGhlbgorICAgIHNlbGY6d3JpdGVCeXRlKGxpYmx1YWJpdHdpc2UuYm9yKGxpYmx1YWJpdHdpc2Uuc2hpZnRsKHNpemUsIDQpLCBUVHlwZVRvQ29tcGFjdFR5cGVbZXR5cGVdKSkKKyAgZWxzZQorICAgIHNlbGY6d3JpdGVCeXRlKGxpYmx1YWJpdHdpc2UuYm9yKDB4ZjAsIFRUeXBlVG9Db21wYWN0VHlwZVtldHlwZV0pKQorICAgIHNlbGY6d3JpdGVWYXJpbnQzMihzaXplKQorICBlbmQKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOndyaXRlVmFyaW50MzIoaTMyKQorICAtLSBTaG91bGQgYmUgdXRmLTgKKyAgbG9jYWwgc3RyID0gbGlibHVhYnBhY2sudG9WYXJpbnQzMihpMzIpCisgIHNlbGYudHJhbnM6d3JpdGUoc3RyKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6d3JpdGVWYXJpbnQ2NChpNjQpCisgIC0tIFNob3VsZCBiZSB1dGYtOAorICBsb2NhbCBzdHIgPSBsaWJsdWFicGFjay50b1ZhcmludDY0KGk2NCkKKyAgc2VsZi50cmFuczp3cml0ZShzdHIpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpyZWFkTWVzc2FnZUJlZ2luKCkKKyAgbG9jYWwgcHJvdG9jb2xJZCA9IHNlbGY6cmVhZFNpZ25CeXRlKCkKKyAgaWYgcHJvdG9jb2xJZCB+PSBzZWxmLkNPTVBBQ1RfUFJPVE9DT0xfSUQgdGhlbgorICAgIHRlcnJvcihUUHJvdG9jb2xFeGNlcHRpb246bmV3eworICAgICAgbWVzc2FnZSA9ICJFeHBlY3RlZCBwcm90b2NvbCBpZCAiIC4uIHNlbGYuQ09NUEFDVF9QUk9UT0NPTF9JRCAuLiAiIGJ1dCBnb3QgIiAuLiBwcm90b2NvbElkfSkKKyAgZW5kCisgIGxvY2FsIHZlcnNpb25BbmRUeXBlID0gc2VsZjpyZWFkU2lnbkJ5dGUoKQorICBsb2NhbCB2ZXJzaW9uID0gbGlibHVhYml0d2lzZS5iYW5kKHZlcnNpb25BbmRUeXBlLCBzZWxmLkNPTVBBQ1RfVkVSU0lPTl9NQVNLKQorICBsb2NhbCB0dHlwZSA9IGxpYmx1YWJpdHdpc2UuYmFuZChsaWJsdWFiaXR3aXNlLnNoaWZ0cih2ZXJzaW9uQW5kVHlwZSwKKyAgICBzZWxmLkNPTVBBQ1RfVFlQRV9TSElGVF9BTU9VTlQpLCBzZWxmLkNPTVBBQ1RfVFlQRV9CSVRTKQorICBpZiB2ZXJzaW9uIH49IHNlbGYuQ09NUEFDVF9WRVJTSU9OIHRoZW4KKyAgICB0ZXJyb3IoVFByb3RvY29sRXhjZXB0aW9uOm5ld3sKKyAgICAgIG1lc3NhZ2UgPSAiRXhwZWN0ZWQgdmVyc2lvbiAiIC4uIHNlbGYuQ09NUEFDVF9WRVJTSU9OIC4uICIgYnV0IGdvdCAiIC4uIHZlcnNpb259KQorICBlbmQKKyAgbG9jYWwgc2VxaWQgPSBzZWxmOnJlYWRWYXJpbnQzMigpCisgIGxvY2FsIG5hbWUgPSBzZWxmOnJlYWRTdHJpbmcoKQorICByZXR1cm4gbmFtZSwgdHR5cGUsIHNlcWlkCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpyZWFkTWVzc2FnZUVuZCgpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpyZWFkU3RydWN0QmVnaW4oKQorICBzZWxmLmxhc3RGaWVsZFtzZWxmLmxhc3RGaWVsZEluZGV4XSA9IHNlbGYubGFzdEZpZWxkSWQKKyAgc2VsZi5sYXN0RmllbGRJbmRleCA9IHNlbGYubGFzdEZpZWxkSW5kZXggKyAxCisgIHNlbGYubGFzdEZpZWxkSWQgPSAwCisgIHJldHVybiBuaWwKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOnJlYWRTdHJ1Y3RFbmQoKQorICBzZWxmLmxhc3RGaWVsZEluZGV4ID0gc2VsZi5sYXN0RmllbGRJbmRleCAtIDEKKyAgc2VsZi5sYXN0RmllbGRJZCA9IHNlbGYubGFzdEZpZWxkW3NlbGYubGFzdEZpZWxkSW5kZXhdCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpyZWFkRmllbGRCZWdpbigpCisgIGxvY2FsIGZpZWxkX2FuZF90dHlwZSA9IHNlbGY6cmVhZFNpZ25CeXRlKCkKKyAgbG9jYWwgdHR5cGUgPSBzZWxmOmdldFRUeXBlKGZpZWxkX2FuZF90dHlwZSkKKyAgaWYgdHR5cGUgPT0gVFR5cGUuU1RPUCB0aGVuCisgICAgcmV0dXJuIG5pbCwgdHR5cGUsIDAKKyAgZW5kCisgIC0tIG1hc2sgb2ZmIHRoZSA0IE1TQiBvZiB0aGUgdHlwZSBoZWFkZXIuIGl0IGNvdWxkIGNvbnRhaW4gYSBmaWVsZCBpZCBkZWx0YS4KKyAgbG9jYWwgbW9kaWZpZXIgPSBsaWJsdWFiaXR3aXNlLnNoaWZ0cihsaWJsdWFiaXR3aXNlLmJhbmQoZmllbGRfYW5kX3R0eXBlLCAweGYwKSwgNCkKKyAgbG9jYWwgaWQgPSAwCisgIGlmIG1vZGlmaWVyID09IDAgdGhlbgorICAgIGlkID0gc2VsZjpyZWFkSTE2KCkKKyAgZWxzZQorICAgIGlkID0gc2VsZi5sYXN0RmllbGRJZCArIG1vZGlmaWVyCisgIGVuZAorICBpZiB0dHlwZSA9PSBUVHlwZS5CT09MIHRoZW4KKyAgICBib29sVmFsdWUgPSBsaWJsdWFiaXR3aXNlLmJhbmQoZmllbGRfYW5kX3R0eXBlLCAweDBmKSA9PSBUQ29tcGFjdFR5cGUuQ09NUEFDVF9CT09MRUFOX1RSVUUKKyAgICBib29sVmFsdWVJc05vdE51bGwgPSB0cnVlCisgIGVuZAorICBzZWxmLmxhc3RGaWVsZElkID0gaWQKKyAgcmV0dXJuIG5pbCwgdHR5cGUsIGlkCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpyZWFkRmllbGRFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6cmVhZE1hcEJlZ2luKCkKKyAgbG9jYWwgc2l6ZSA9IHNlbGY6cmVhZFZhcmludDMyKCkKKyAgaWYgc2l6ZSA8IDAgdGhlbgorICAgIHJldHVybiBuaWwsbmlsLG5pbAorICBlbmQKKyAgbG9jYWwga3Z0eXBlID0gc2VsZjpyZWFkU2lnbkJ5dGUoKQorICBsb2NhbCBrdHlwZSA9IHNlbGY6Z2V0VFR5cGUobGlibHVhYml0d2lzZS5zaGlmdHIoa3Z0eXBlLCA0KSkKKyAgbG9jYWwgdnR5cGUgPSBzZWxmOmdldFRUeXBlKGt2dHlwZSkKKyAgcmV0dXJuIGt0eXBlLCB2dHlwZSwgc2l6ZQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6cmVhZE1hcEVuZCgpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpyZWFkTGlzdEJlZ2luKCkKKyAgbG9jYWwgc2l6ZV9hbmRfdHlwZSA9IHNlbGY6cmVhZFNpZ25CeXRlKCkKKyAgbG9jYWwgc2l6ZSA9IGxpYmx1YWJpdHdpc2UuYmFuZChsaWJsdWFiaXR3aXNlLnNoaWZ0cihzaXplX2FuZF90eXBlLCA0KSwgMHgwZikKKyAgaWYgc2l6ZSA9PSAxNSB0aGVuCisgICAgc2l6ZSA9IHNlbGY6cmVhZFZhcmludDMyKCkKKyAgZW5kCisgIGlmIHNpemUgPCAwIHRoZW4KKyAgICByZXR1cm4gbmlsLG5pbAorICBlbmQKKyAgbG9jYWwgZXR5cGUgPSBzZWxmOmdldFRUeXBlKGxpYmx1YWJpdHdpc2UuYmFuZChzaXplX2FuZF90eXBlLCAweDBmKSkKKyAgcmV0dXJuIGV0eXBlLCBzaXplCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpyZWFkTGlzdEVuZCgpCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpyZWFkU2V0QmVnaW4oKQorICByZXR1cm4gc2VsZjpyZWFkTGlzdEJlZ2luKCkKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOnJlYWRTZXRFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6cmVhZEJvb2woKQorICBpZiBib29sVmFsdWVJc05vdE51bGwgdGhlbgorICAgIGJvb2xWYWx1ZUlzTm90TnVsbCA9IHRydWUKKyAgICByZXR1cm4gYm9vbFZhbHVlCisgIGVuZAorICBsb2NhbCB2YWwgPSBzZWxmOnJlYWRTaWduQnl0ZSgpCisgIGlmIHZhbCA9PSBUQ29tcGFjdFR5cGUuQ09NUEFDVF9CT09MRUFOX1RSVUUgdGhlbgorICAgIHJldHVybiB0cnVlCisgIGVuZAorICByZXR1cm4gZmFsc2UKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOnJlYWRCeXRlKCkKKyAgbG9jYWwgYnVmZiA9IHNlbGYudHJhbnM6cmVhZEFsbCgxKQorICBsb2NhbCB2YWwgPSBsaWJsdWFicGFjay5idW5wYWNrKCdjJywgYnVmZikKKyAgcmV0dXJuIHZhbAorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6cmVhZFNpZ25CeXRlKCkKKyAgbG9jYWwgYnVmZiA9IHNlbGYudHJhbnM6cmVhZEFsbCgxKQorICBsb2NhbCB2YWwgPSBsaWJsdWFicGFjay5idW5wYWNrKCdDJywgYnVmZikKKyAgcmV0dXJuIHZhbAorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6cmVhZEkxNigpCisgIHJldHVybiBzZWxmOnJlYWRJMzIoKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6cmVhZEkzMigpCisgIGxvY2FsIHYgPSBzZWxmOnJlYWRWYXJpbnQzMigpCisgIGxvY2FsIHZhbHVlID0gbGlibHVhYnBhY2suemlnemFnVG9JMzIodikKKyAgcmV0dXJuIHZhbHVlCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpyZWFkSTY0KCkKKyAgbG9jYWwgdmFsdWUgPSBzZWxmOnJlYWRWYXJpbnQ2NCgpCisgIHJldHVybiB2YWx1ZQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6cmVhZERvdWJsZSgpCisgIGxvY2FsIGJ1ZmYgPSBzZWxmLnRyYW5zOnJlYWRBbGwoOCkKKyAgbG9jYWwgdmFsID0gbGlibHVhYnBhY2suYnVucGFjaygnZCcsIGJ1ZmYpCisgIHJldHVybiB2YWwKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOnJlYWRTdHJpbmcoKQorICByZXR1cm4gc2VsZjpyZWFkQmluYXJ5KCkKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOnJlYWRCaW5hcnkoKQorICBsb2NhbCBzaXplID0gc2VsZjpyZWFkVmFyaW50MzIoKQorICBpZiBzaXplIDw9IDAgdGhlbgorICAgIHJldHVybiAiIgorICBlbmQKKyAgcmV0dXJuIHNlbGYudHJhbnM6cmVhZEFsbChzaXplKQorZW5kCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2w6cmVhZFZhcmludDMyKCkKKyAgbG9jYWwgc2hpZnRsID0gMAorICBsb2NhbCByZXN1bHQgPSAwCisgIHdoaWxlIHRydWUgZG8KKyAgICBiID0gc2VsZjpyZWFkQnl0ZSgpCisgICAgcmVzdWx0ID0gbGlibHVhYml0d2lzZS5ib3IocmVzdWx0LAorICAgICAgICAgICAgIGxpYmx1YWJpdHdpc2Uuc2hpZnRsKGxpYmx1YWJpdHdpc2UuYmFuZChiLCAweDdmKSwgc2hpZnRsKSkKKyAgICBpZiBsaWJsdWFiaXR3aXNlLmJhbmQoYiwgMHg4MCkgfj0gMHg4MCB0aGVuCisgICAgICBicmVhaworICAgIGVuZAorICAgIHNoaWZ0bCA9IHNoaWZ0bCArIDcKKyAgZW5kCisgIHJldHVybiByZXN1bHQKK2VuZAorCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sOnJlYWRWYXJpbnQ2NCgpCisgIGxvY2FsIHJlc3VsdCA9IGxpYmx1YWxvbmdudW1iZXIubmV3CisgIGxvY2FsIGRhdGEgPSByZXN1bHQoMCkKKyAgbG9jYWwgc2hpZnRsID0gMAorICB3aGlsZSB0cnVlIGRvCisgICAgYiA9IHNlbGY6cmVhZEJ5dGUoKQorICAgIGVuZEZsYWcsIGRhdGEgPSBsaWJsdWFicGFjay5mcm9tVmFyaW50NjQoYiwgc2hpZnRsLCBkYXRhKQorICAgIHNoaWZ0bCA9IHNoaWZ0bCArIDcKKyAgICBpZiBlbmRGbGFnID09IDAgdGhlbgorICAgICAgYnJlYWsKKyAgICBlbmQKKyAgZW5kCisgIHJldHVybiBkYXRhCitlbmQKKworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbDpnZXRUVHlwZShjdHlwZSkKKyAgcmV0dXJuIENvbXBhY3RUeXBlVG9UVHlwZVtsaWJsdWFiaXR3aXNlLmJhbmQoY3R5cGUsIDB4MGYpXQorZW5kCisKK1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5ID0gVFByb3RvY29sRmFjdG9yeTpuZXd7CisgIF9fdHlwZSA9ICdUQ29tcGFjdFByb3RvY29sRmFjdG9yeScsCit9CisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5OmdldFByb3RvY29sKHRyYW5zKQorICAtLSBUT0RPIEVuZm9yY2UgdGhhdCB0aGlzIG11c3QgYmUgYSB0cmFuc3BvcnQgY2xhc3MgKGllIG5vdCBhIGJvb2wpCisgIGlmIG5vdCB0cmFucyB0aGVuCisgICAgdGVycm9yKFRQcm90b2NvbEV4Y2VwdGlvbjpuZXd7CisgICAgICBtZXNzYWdlID0gJ011c3Qgc3VwcGx5IGEgdHJhbnNwb3J0IHRvICcgLi4gdHR5cGUoc2VsZikKKyAgICB9KQorICBlbmQKKyAgcmV0dXJuIFRDb21wYWN0UHJvdG9jb2w6bmV3eworICAgIHRyYW5zID0gdHJhbnMKKyAgfQorZW5kCmRpZmYgLS1naXQgYS9saWIvbHVhL1RGcmFtZWRUcmFuc3BvcnQubHVhIGIvbGliL2x1YS9URnJhbWVkVHJhbnNwb3J0Lmx1YQppbmRleCA0MzdiNzAxLi43NjhlMmQ5IDEwMDY0NAotLS0gYS9saWIvbHVhL1RGcmFtZWRUcmFuc3BvcnQubHVhCisrKyBiL2xpYi9sdWEvVEZyYW1lZFRyYW5zcG9ydC5sdWEKQEAgLTEwMCw3ICsxMDAsNyBAQAogICBsb2NhbCB0bXAgPSBzZWxmLndCdWYKICAgc2VsZi53QnVmID0gJycKICAgbG9jYWwgZnJhbWVfbGVuX2J1ZiA9IGxpYmx1YWJwYWNrLmJwYWNrKCJpIiwgc3RyaW5nLmxlbih0bXApKQotICBzZWxmLnRyYW5zOndyaXRlKGZyYW1lX2xlbl9idWYpCisgIHRtcCA9IGZyYW1lX2xlbl9idWYgLi4gdG1wCiAgIHNlbGYudHJhbnM6d3JpdGUodG1wKQogICBzZWxmLnRyYW5zOmZsdXNoKCkKIGVuZApkaWZmIC0tZ2l0IGEvbGliL2x1YS9USHR0cFRyYW5zcG9ydC5sdWEgYi9saWIvbHVhL1RIdHRwVHJhbnNwb3J0Lmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTUxZGI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2x1YS9USHR0cFRyYW5zcG9ydC5sdWEKQEAgLTAsMCArMSwxODIgQEAKKy0tCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCityZXF1aXJlICdUVHJhbnNwb3J0JworCitUSHR0cFRyYW5zcG9ydCA9IFRUcmFuc3BvcnRCYXNlOm5ld3sKKyAgX190eXBlID0gJ1RIdHRwVHJhbnNwb3J0JywKKyAgcGF0aCA9ICcvJywKKyAgd0J1ZiA9ICcnLAorICByQnVmID0gJycsCisgIENSTEYgPSAnXHJcbicsCisgIFZFUlNJT04gPSB2ZXJzaW9uLAorICBpc1NlcnZlciA9IHRydWUKK30KKworZnVuY3Rpb24gVEh0dHBUcmFuc3BvcnQ6bmV3KG9iaikKKyAgaWYgdHR5cGUob2JqKSB+PSAndGFibGUnIHRoZW4KKyAgICBlcnJvcih0dHlwZShzZWxmKSAuLiAnbXVzdCBiZSBpbml0aWFsaXplZCB3aXRoIGEgdGFibGUnKQorICBlbmQKKworICAtLSBFbnN1cmUgYSB0cmFuc3BvcnQgaXMgcHJvdmlkZWQKKyAgaWYgbm90IG9iai50cmFucyB0aGVuCisgICAgZXJyb3IoJ1lvdSBtdXN0IHByb3ZpZGUgJyAuLiB0dHlwZShzZWxmKSAuLiAnIHdpdGggYSB0cmFucycpCisgIGVuZAorCisgIHJldHVybiBUVHJhbnNwb3J0QmFzZS5uZXcoc2VsZiwgb2JqKQorZW5kCisKK2Z1bmN0aW9uIFRIdHRwVHJhbnNwb3J0OmlzT3BlbigpCisgIHJldHVybiBzZWxmLnRyYW5zOmlzT3BlbigpCitlbmQKKworZnVuY3Rpb24gVEh0dHBUcmFuc3BvcnQ6b3BlbigpCisgIHJldHVybiBzZWxmLnRyYW5zOm9wZW4oKQorZW5kCisKK2Z1bmN0aW9uIFRIdHRwVHJhbnNwb3J0OmNsb3NlKCkKKyAgcmV0dXJuIHNlbGYudHJhbnM6Y2xvc2UoKQorZW5kCisKK2Z1bmN0aW9uIFRIdHRwVHJhbnNwb3J0OnJlYWRBbGwobGVuKQorICByZXR1cm4gc2VsZjpyZWFkKGxlbikKK2VuZAorCitmdW5jdGlvbiBUSHR0cFRyYW5zcG9ydDpyZWFkKGxlbikKKyAgaWYgc3RyaW5nLmxlbihzZWxmLnJCdWYpID09IDAgdGhlbgorICAgIHNlbGY6X3JlYWRNc2coKQorICBlbmQKKyAgaWYgbGVuID4gc3RyaW5nLmxlbihzZWxmLnJCdWYpIHRoZW4KKyAgICBsb2NhbCB2YWwgPSBzZWxmLnJCdWYKKyAgICBzZWxmLnJCdWYgPSAnJworICAgIHJldHVybiB2YWwKKyAgZW5kCisKKyAgbG9jYWwgdmFsID0gc3RyaW5nLnN1YihzZWxmLnJCdWYsIDAsIGxlbikKKyAgc2VsZi5yQnVmID0gc3RyaW5nLnN1YihzZWxmLnJCdWYsIGxlbisxKQorICByZXR1cm4gdmFsCitlbmQKKworZnVuY3Rpb24gVEh0dHBUcmFuc3BvcnQ6X3JlYWRNc2coKQorICB3aGlsZSB0cnVlIGRvCisgICAgc2VsZi5yQnVmID0gc2VsZi5yQnVmIC4uIHNlbGYudHJhbnM6cmVhZCg0KQorICAgIGlmIHN0cmluZy5maW5kKHNlbGYuckJ1Ziwgc2VsZi5DUkxGIC4uIHNlbGYuQ1JMRikgdGhlbgorICAgICAgYnJlYWsKKyAgICBlbmQKKyAgZW5kCisgIGlmIG5vdCBzZWxmLnJCdWYgdGhlbgorICAgIHNlbGYuckJ1ZiA9ICIiCisgICAgcmV0dXJuCisgIGVuZAorICBzZWxmOmdldExpbmUoKQorICBsb2NhbCBoZWFkZXJzID0gc2VsZjpfcGFyc2VIZWFkZXJzKCkKKyAgaWYgbm90IGhlYWRlcnMgdGhlbgorICAgIHNlbGYuckJ1ZiA9ICIiCisgICAgcmV0dXJuCisgIGVuZAorCisgIGxvY2FsIGxlbmd0aCA9IHRvbnVtYmVyKGhlYWRlcnNbIkNvbnRlbnQtTGVuZ3RoIl0pCisgIGlmIGxlbmd0aCB0aGVuCisgICAgbGVuZ3RoID0gbGVuZ3RoIC0gc3RyaW5nLmxlbihzZWxmLnJCdWYpCisgICAgc2VsZi5yQnVmID0gc2VsZi5yQnVmIC4uIHNlbGYudHJhbnM6cmVhZEFsbChsZW5ndGgpCisgIGVuZAorICBpZiBzZWxmLnJCdWYgPT0gbmlsIHRoZW4KKyAgICBzZWxmLnJCdWYgPSAiIgorICBlbmQKK2VuZAorCitmdW5jdGlvbiBUSHR0cFRyYW5zcG9ydDpnZXRMaW5lKCkKKyAgbG9jYWwgYSxiID0gc3RyaW5nLmZpbmQoc2VsZi5yQnVmLCBzZWxmLkNSTEYpCisgIGxvY2FsIGxpbmUgPSAiIgorICBpZiBhIGFuZCBiIHRoZW4KKyAgICBsaW5lID0gc3RyaW5nLnN1YihzZWxmLnJCdWYsIDAsIGEtMSkKKyAgICBzZWxmLnJCdWYgPSBzdHJpbmcuc3ViKHNlbGYuckJ1ZiwgYisxKQorICBlbmQKKyAgcmV0dXJuIGxpbmUKK2VuZAorCitmdW5jdGlvbiBUSHR0cFRyYW5zcG9ydDpfcGFyc2VIZWFkZXJzKCkKKyAgbG9jYWwgaGVhZGVycyA9IHt9CisKKyAgcmVwZWF0CisgICAgbG9jYWwgbGluZSA9IHNlbGY6Z2V0TGluZSgpCisgICAgZm9yIGtleSwgdmFsIGluIHN0cmluZy5nbWF0Y2gobGluZSwgIihbJXclLV0rKSVzKjolcyooLispIikgZG8KKyAgICAgIGlmIGhlYWRlcnNba2V5XSB0aGVuCisgICAgICAgIGxvY2FsIGRlbGltaXRlciA9ICIsICIKKyAgICAgICAgaWYga2V5ID09ICJTZXQtQ29va2llIiB0aGVuCisgICAgICAgICAgZGVsaW1pdGVyID0gIjsgIgorICAgICAgICBlbmQKKyAgICAgICAgaGVhZGVyc1trZXldID0gaGVhZGVyc1trZXldIC4uIGRlbGltaXRlciAuLiB0b3N0cmluZyh2YWwpCisgICAgICBlbHNlCisgICAgICAgIGhlYWRlcnNba2V5XSA9IHRvc3RyaW5nKHZhbCkKKyAgICAgIGVuZAorICAgIGVuZAorICB1bnRpbCBzdHJpbmcuZmluZChsaW5lLCAiXiVzKiQiKQorCisgIHJldHVybiBoZWFkZXJzCitlbmQKKworZnVuY3Rpb24gVEh0dHBUcmFuc3BvcnQ6d3JpdGUoYnVmLCBsZW4pCisgIGlmIGxlbiBhbmQgbGVuIDwgc3RyaW5nLmxlbihidWYpIHRoZW4KKyAgICBidWYgPSBzdHJpbmcuc3ViKGJ1ZiwgMCwgbGVuKQorICBlbmQKKyAgc2VsZi53QnVmID0gc2VsZi53QnVmIC4uIGJ1ZgorZW5kCisKK2Z1bmN0aW9uIFRIdHRwVHJhbnNwb3J0OndyaXRlSHR0cEhlYWRlcihjb250ZW50X2xlbikKKyAgaWYgc2VsZi5pc1NlcnZlciB0aGVuCisgICAgbG9jYWwgaGVhZGVyID0gICJIVFRQLzEuMSAyMDAgT0siIC4uIHNlbGYuQ1JMRgorICAgICAgLi4gIlNlcnZlcjogVGhyaWZ0LyIgLi4gc2VsZi5WRVJTSU9OIC4uIHNlbGYuQ1JMRgorICAgICAgLi4gIkFjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbjogKiIgLi4gc2VsZi5DUkxGCisgICAgICAuLiAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXRocmlmdCIgLi4gc2VsZi5DUkxGCisgICAgICAuLiAiQ29udGVudC1MZW5ndGg6ICIgLi4gY29udGVudF9sZW4gLi4gc2VsZi5DUkxGCisgICAgICAuLiAiQ29ubmVjdGlvbjogS2VlcC1BbGl2ZSIgLi4gc2VsZi5DUkxGIC4uIHNlbGYuQ1JMRgorICAgIHNlbGYudHJhbnM6d3JpdGUoaGVhZGVyKQorICBlbHNlCisgICAgbG9jYWwgaGVhZGVyID0gIlBPU1QgIiAuLiBzZWxmLnBhdGggLi4gIiBIVFRQLzEuMSIgLi4gc2VsZi5DUkxGCisgICAgICAuLiAiSG9zdDogIiAuLiBzZWxmLnRyYW5zLmhvc3QgLi4gc2VsZi5DUkxGCisgICAgICAuLiAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXRocmlmdCIgLi4gc2VsZi5DUkxGCisgICAgICAuLiAiQ29udGVudC1MZW5ndGg6ICIgLi4gY29udGVudF9sZW4gLi4gc2VsZi5DUkxGCisgICAgICAuLiAiQWNjZXB0OiBhcHBsaWNhdGlvbi94LXRocmlmdCAiIC4uIHNlbGYuQ1JMRgorICAgICAgLi4gIlVzZXItQWdlbnQ6IFRocmlmdC8iIC4uIHNlbGYuVkVSU0lPTiAuLiAiIChMdWEvVEh0dHBDbGllbnQpIgorICAgICAgLi4gc2VsZi5DUkxGIC4uIHNlbGYuQ1JMRgorICAgIHNlbGYudHJhbnM6d3JpdGUoaGVhZGVyKQorICBlbmQKK2VuZAorCitmdW5jdGlvbiBUSHR0cFRyYW5zcG9ydDpmbHVzaCgpCisgIC0tIElmIHRoZSB3cml0ZSBmYWlscyB3ZSBzdGlsbCB3YW50IHdCdWYgdG8gYmUgY2xlYXIKKyAgbG9jYWwgdG1wID0gc2VsZi53QnVmCisgIHNlbGYud0J1ZiA9ICcnCisgIHNlbGY6d3JpdGVIdHRwSGVhZGVyKHN0cmluZy5sZW4odG1wKSkKKyAgc2VsZi50cmFuczp3cml0ZSh0bXApCisgIHNlbGYudHJhbnM6Zmx1c2goKQorZW5kCisKK1RIdHRwVHJhbnNwb3J0RmFjdG9yeSA9IFRUcmFuc3BvcnRGYWN0b3J5QmFzZTpuZXd7CisgIF9fdHlwZSA9ICdUSHR0cFRyYW5zcG9ydEZhY3RvcnknCit9CitmdW5jdGlvbiBUSHR0cFRyYW5zcG9ydEZhY3Rvcnk6Z2V0VHJhbnNwb3J0KHRyYW5zKQorICBpZiBub3QgdHJhbnMgdGhlbgorICAgIHRlcnJvcihUUHJvdG9jb2xFeGNlcHRpb246bmV3eworICAgICAgbWVzc2FnZSA9ICdNdXN0IHN1cHBseSBhIHRyYW5zcG9ydCB0byAnIC4uIHR0eXBlKHNlbGYpCisgICAgfSkKKyAgZW5kCisgIHJldHVybiBUSHR0cFRyYW5zcG9ydDpuZXd7dHJhbnMgPSB0cmFuc30KK2VuZApkaWZmIC0tZ2l0IGEvbGliL2x1YS9USnNvblByb3RvY29sLmx1YSBiL2xpYi9sdWEvVEpzb25Qcm90b2NvbC5sdWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIwOGVlYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9sdWEvVEpzb25Qcm90b2NvbC5sdWEKQEAgLTAsMCArMSw3MjcgQEAKKy0tCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKSwgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCityZXF1aXJlICdUUHJvdG9jb2wnCityZXF1aXJlICdsaWJsdWFicGFjaycKK3JlcXVpcmUgJ2xpYmx1YWJpdHdpc2UnCisKK1RKU09OUHJvdG9jb2wgPSBfX1RPYmplY3QubmV3KFRQcm90b2NvbEJhc2UsIHsKKyAgX190eXBlID0gJ1RKU09OUHJvdG9jb2wnLAorICBUSFJJRlRfSlNPTl9QUk9UT0NPTF9WRVJTSU9OID0gMSwKKyAganNvbkNvbnRleHQgPSB7fSwKKyAganNvbkNvbnRleHRWYWwgPSB7Zmlyc3QgPSB0cnVlLCBjb2xvbiA9IHRydWUsIHR0eXBlID0gMiwgbnVsbCA9IHRydWV9LAorICBqc29uQ29udGV4dEluZGV4ID0gMSwKKyAgaGFzUmVhZEJ5dGUgPSAiIgorfSkKKworVFR5cGVUb1N0cmluZyA9IHt9CitUVHlwZVRvU3RyaW5nW1RUeXBlLkJPT0xdICAgPSAidGYiCitUVHlwZVRvU3RyaW5nW1RUeXBlLkJZVEVdICAgPSAiaTgiCitUVHlwZVRvU3RyaW5nW1RUeXBlLkkxNl0gICAgPSAiaTE2IgorVFR5cGVUb1N0cmluZ1tUVHlwZS5JMzJdICAgID0gImkzMiIKK1RUeXBlVG9TdHJpbmdbVFR5cGUuSTY0XSAgICA9ICJpNjQiCitUVHlwZVRvU3RyaW5nW1RUeXBlLkRPVUJMRV0gPSAiZGJsIgorVFR5cGVUb1N0cmluZ1tUVHlwZS5TVFJJTkddID0gInN0ciIKK1RUeXBlVG9TdHJpbmdbVFR5cGUuU1RSVUNUXSA9ICJyZWMiCitUVHlwZVRvU3RyaW5nW1RUeXBlLkxJU1RdICAgPSAibHN0IgorVFR5cGVUb1N0cmluZ1tUVHlwZS5TRVRdICAgID0gInNldCIKK1RUeXBlVG9TdHJpbmdbVFR5cGUuTUFQXSAgICA9ICJtYXAiCisKK1N0cmluZ1RvVFR5cGUgPSB7CisgIHRmICA9IFRUeXBlLkJPT0wsCisgIGk4ICA9IFRUeXBlLkJZVEUsCisgIGkxNiA9IFRUeXBlLkkxNiwKKyAgaTMyID0gVFR5cGUuSTMyLAorICBpNjQgPSBUVHlwZS5JNjQsCisgIGRibCA9IFRUeXBlLkRPVUJMRSwKKyAgc3RyID0gVFR5cGUuU1RSSU5HLAorICByZWMgPSBUVHlwZS5TVFJVQ1QsCisgIG1hcCA9IFRUeXBlLk1BUCwKKyAgc2V0ID0gVFR5cGUuU0VULAorICBsc3QgPSBUVHlwZS5MSVNUCit9CisKK0pTT05Ob2RlID0geworICBPYmplY3RCZWdpbiA9ICd7JywKKyAgT2JqZWN0RW5kID0gJ30nLAorICBBcnJheUJlZ2luID0gJ1snLAorICBBcnJheUVuZCA9ICddJywKKyAgUGFpclNlcGFyYXRvciA9ICc6JywKKyAgRWxlbVNlcGFyYXRvciA9ICcsJywKKyAgQmFja3NsYXNoID0gJ1xcJywKKyAgU3RyaW5nRGVsaW1pdGVyID0gJyInLAorICBaZXJvQ2hhciA9ICcwJywKKyAgRXNjYXBlQ2hhciA9ICd1JywKKyAgTmFuID0gJ05hTicsCisgIEluZmluaXR5ID0gJ0luZmluaXR5JywKKyAgTmVnYXRpdmVJbmZpbml0eSA9ICctSW5maW5pdHknLAorICBFc2NhcGVDaGFycyA9ICJcIlxcYmZucnQiLAorICBFc2NhcGVQcmVmaXggPSAiXFx1MDAiCit9CisKK0VzY2FwZUNoYXJWYWxzID0geworICAnIicsICdcXCcsICdcYicsICdcZicsICdcbicsICdccicsICdcdCcKK30KKworSlNPTkNoYXJUYWJsZSA9IHsKKyAgLS0wICAgMSAgIDIgICAzICAgNCAgIDUgICA2ICAgNyAgIDggICA5ICAgQSAgIEIgICBDICAgRCAgIEUgICBGCisgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDk4LDExNiwxMTAsICAwLDEwMiwxMTQsICAwLCAgMCwKKyAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgIDEsICAxLDM0LCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKK30KKworLS0gY2hhcmFjdGVyIHRhYmxlIHN0cmluZworbG9jYWwgYj0nQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLycKKworLS0gZW5jb2RpbmcKK2Z1bmN0aW9uIGJhc2U2NF9lbmNvZGUoZGF0YSkKKyAgICByZXR1cm4gKChkYXRhOmdzdWIoJy4nLCBmdW5jdGlvbih4KSAKKyAgICAgICAgbG9jYWwgcixiPScnLHg6Ynl0ZSgpCisgICAgICAgIGZvciBpPTgsMSwtMSBkbyByPXIuLihiJTJeaS1iJTJeKGktMSk+MCBhbmQgJzEnIG9yICcwJykgZW5kCisgICAgICAgIHJldHVybiByOworICAgIGVuZCkuLicwMDAwJyk6Z3N1YignJWQlZCVkPyVkPyVkPyVkPycsIGZ1bmN0aW9uKHgpCisgICAgICAgIGlmICgjeCA8IDYpIHRoZW4gcmV0dXJuICcnIGVuZAorICAgICAgICBsb2NhbCBjPTAKKyAgICAgICAgZm9yIGk9MSw2IGRvIGM9YysoeDpzdWIoaSxpKT09JzEnIGFuZCAyXig2LWkpIG9yIDApIGVuZAorICAgICAgICByZXR1cm4gYjpzdWIoYysxLGMrMSkKKyAgICBlbmQpLi4oeyAnJywgJz09JywgJz0nIH0pWyNkYXRhJTMrMV0pCitlbmQKKworLS0gZGVjb2RpbmcKK2Z1bmN0aW9uIGJhc2U2NF9kZWNvZGUoZGF0YSkKKyAgICBkYXRhID0gc3RyaW5nLmdzdWIoZGF0YSwgJ1teJy4uYi4uJz1dJywgJycpCisgICAgcmV0dXJuIChkYXRhOmdzdWIoJy4nLCBmdW5jdGlvbih4KQorICAgICAgICBpZiAoeCA9PSAnPScpIHRoZW4gcmV0dXJuICcnIGVuZAorICAgICAgICBsb2NhbCByLGY9JycsKGI6ZmluZCh4KS0xKQorICAgICAgICBmb3IgaT02LDEsLTEgZG8gcj1yLi4oZiUyXmktZiUyXihpLTEpPjAgYW5kICcxJyBvciAnMCcpIGVuZAorICAgICAgICByZXR1cm4gcjsKKyAgICBlbmQpOmdzdWIoJyVkJWQlZD8lZD8lZD8lZD8lZD8lZD8nLCBmdW5jdGlvbih4KQorICAgICAgICBpZiAoI3ggfj0gOCkgdGhlbiByZXR1cm4gJycgZW5kCisgICAgICAgIGxvY2FsIGM9MAorICAgICAgICBmb3IgaT0xLDggZG8gYz1jKyh4OnN1YihpLGkpPT0nMScgYW5kIDJeKDgtaSkgb3IgMCkgZW5kCisgICAgICAgIHJldHVybiBzdHJpbmcuY2hhcihjKQorICAgIGVuZCkpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZXNldENvbnRleHQoKQorICBzZWxmLmpzb25Db250ZXh0ID0ge30KKyAgc2VsZi5qc29uQ29udGV4dFZhbCA9IHtmaXJzdCA9IHRydWUsIGNvbG9uID0gdHJ1ZSwgdHR5cGUgPSAyLCBudWxsID0gdHJ1ZX0KKyAgc2VsZi5qc29uQ29udGV4dEluZGV4ID0gMQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6Y29udGV4dFB1c2goY29udGV4dCkKKyAgc2VsZi5qc29uQ29udGV4dEluZGV4ID0gc2VsZi5qc29uQ29udGV4dEluZGV4ICsgMQorICBzZWxmLmpzb25Db250ZXh0W3NlbGYuanNvbkNvbnRleHRJbmRleF0gPSBzZWxmLmpzb25Db250ZXh0VmFsCisgIHNlbGYuanNvbkNvbnRleHRWYWwgPSBjb250ZXh0CitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpjb250ZXh0UG9wKCkKKyAgc2VsZi5qc29uQ29udGV4dFZhbCA9IHNlbGYuanNvbkNvbnRleHRbc2VsZi5qc29uQ29udGV4dEluZGV4XQorICBzZWxmLmpzb25Db250ZXh0SW5kZXggPSBzZWxmLmpzb25Db250ZXh0SW5kZXggLSAxCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDplc2NhcGVOdW0oKQorICBpZiBzZWxmLmpzb25Db250ZXh0VmFsLnR0eXBlID09IDEgdGhlbgorICAgIHJldHVybiBzZWxmLmpzb25Db250ZXh0VmFsLmNvbG9uCisgIGVsc2UKKyAgICByZXR1cm4gZmFsc2UKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZUVsZW1TZXBhcmF0b3IoKQorICBpZiBzZWxmLmpzb25Db250ZXh0VmFsLm51bGwgdGhlbgorICAgIHJldHVybgorICBlbmQKKyAgaWYgc2VsZi5qc29uQ29udGV4dFZhbC5maXJzdCB0aGVuCisgICAgc2VsZi5qc29uQ29udGV4dFZhbC5maXJzdCA9IGZhbHNlCisgIGVsc2UKKyAgICBpZiBzZWxmLmpzb25Db250ZXh0VmFsLnR0eXBlID09IDEgdGhlbgorICAgICAgaWYgc2VsZi5qc29uQ29udGV4dFZhbC5jb2xvbiB0aGVuCisgICAgICAgIHNlbGYudHJhbnM6d3JpdGUoSlNPTk5vZGUuUGFpclNlcGFyYXRvcikKKyAgICAgICAgc2VsZi5qc29uQ29udGV4dFZhbC5jb2xvbiA9IGZhbHNlCisgICAgICBlbHNlCisgICAgICAgIHNlbGYudHJhbnM6d3JpdGUoSlNPTk5vZGUuRWxlbVNlcGFyYXRvcikKKyAgICAgICAgc2VsZi5qc29uQ29udGV4dFZhbC5jb2xvbiA9IHRydWUKKyAgICAgIGVuZAorICAgIGVsc2UKKyAgICAgIHNlbGYudHJhbnM6d3JpdGUoSlNPTk5vZGUuRWxlbVNlcGFyYXRvcikKKyAgICBlbmQKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpoZXhDaGFyKHZhbCkKKyAgdmFsID0gbGlibHVhYml0d2lzZS5iYW5kKHZhbCwgMHgwZikKKyAgaWYgdmFsIDwgMTAgdGhlbgorICAgIHJldHVybiB2YWwgKyA0OAorICBlbHNlCisgICAgcmV0dXJuIHZhbCArIDg3CisgIGVuZAorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVKU09ORXNjYXBlQ2hhcihjaCkKKyAgc2VsZi50cmFuczp3cml0ZShKU09OTm9kZS5Fc2NhcGVQcmVmaXgpCisgIGxvY2FsIG91dENoID0gaGV4Q2hhcihsaWJsdWFiaXR3aXNlLnNoaWZ0cihjaCwgNCkpCisgIGxvY2FsIGJ1ZmYgPSBsaWJsdWFicGFjay5icGFjaygnYycsIG91dENoKQorICBzZWxmLnRyYW5zOndyaXRlKGJ1ZmYpCisgIG91dENoID0gaGV4Q2hhcihjaCkKKyAgYnVmZiA9IGxpYmx1YWJwYWNrLmJwYWNrKCdjJywgb3V0Q2gpCisgIHNlbGYudHJhbnM6d3JpdGUoYnVmZikKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlSlNPTkNoYXIoYnl0ZSkKKyAgY2ggPSBzdHJpbmcuYnl0ZShieXRlKQorICBpZiBjaCA+PSAweDMwIHRoZW4KKyAgICBpZiBjaCA9PSBKU09OTm9kZS5CYWNrc2xhc2ggdGhlbgorICAgICAgc2VsZi50cmFuczp3cml0ZShKU09OTm9kZS5CYWNrc2xhc2gpCisgICAgICBzZWxmLnRyYW5zOndyaXRlKEpTT05Ob2RlLkJhY2tzbGFzaCkKKyAgICBlbHNlCisgICAgICBzZWxmLnRyYW5zOndyaXRlKGJ5dGUpCisgICAgZW5kCisgIGVsc2UKKyAgICBsb2NhbCBvdXRDaCA9IEpTT05DaGFyVGFibGVbY2grMV0KKyAgICBpZiBvdXRDaCA9PSAxIHRoZW4KKyAgICAgIHNlbGYudHJhbnM6d3JpdGUoYnl0ZSkKKyAgICBlbHNlaWYgb3V0Q2ggPiAxIHRoZW4KKyAgICAgIHNlbGYudHJhbnM6d3JpdGUoSlNPTk5vZGUuQmFja3NsYXNoKQorICAgICAgbG9jYWwgYnVmZiA9IGxpYmx1YWJwYWNrLmJwYWNrKCdjJywgb3V0Q2gpCisgICAgICBzZWxmLnRyYW5zOndyaXRlKGJ1ZmYpCisgICAgZWxzZQorICAgICAgc2VsZjp3cml0ZUpTT05Fc2NhcGVDaGFyKGNoKQorICAgIGVuZAorICBlbmQKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlSlNPTlN0cmluZyhzdHIpCisgIHNlbGY6d3JpdGVFbGVtU2VwYXJhdG9yKCkKKyAgc2VsZi50cmFuczp3cml0ZShKU09OTm9kZS5TdHJpbmdEZWxpbWl0ZXIpCisgIC0tIFRPRE8gZXNjYXBlIHNwZWNpYWwgY2hhcmFjdGVycworICBsb2NhbCBsZW5ndGggPSBzdHJpbmcubGVuKHN0cikKKyAgbG9jYWwgaWkgPSAxCisgIHdoaWxlIGlpIDw9IGxlbmd0aCBkbworICAgIHNlbGY6d3JpdGVKU09OQ2hhcihzdHJpbmcuc3ViKHN0ciwgaWksIGlpKSkKKyAgICBpaSA9IGlpICsgMQorICBlbmQKKyAgc2VsZi50cmFuczp3cml0ZShKU09OTm9kZS5TdHJpbmdEZWxpbWl0ZXIpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZUpTT05CYXNlNjQoc3RyKQorICBzZWxmOndyaXRlRWxlbVNlcGFyYXRvcigpCisgIHNlbGYudHJhbnM6d3JpdGUoSlNPTk5vZGUuU3RyaW5nRGVsaW1pdGVyKQorICBsb2NhbCBsZW5ndGggPSBzdHJpbmcubGVuKHN0cikKKyAgbG9jYWwgb2Zmc2V0ID0gMQorICB3aGlsZSBsZW5ndGggPj0gMyBkbworICAgIC0tIEVuY29kZSAzIGJ5dGVzIGF0IGEgdGltZQorICAgIGxvY2FsIGJ5dGVzID0gYmFzZTY0X2VuY29kZShzdHJpbmcuc3ViKHN0ciwgb2Zmc2V0LCBvZmZzZXQrMykpCisgICAgc2VsZi50cmFuczp3cml0ZShieXRlcykKKyAgICBsZW5ndGggPSBsZW5ndGggLSAzCisgICAgb2Zmc2V0ID0gb2Zmc2V0ICsgMworICBlbmQKKyAgaWYgbGVuZ3RoID4gMCB0aGVuCisgICAgbG9jYWwgYnl0ZXMgPSBiYXNlNjRfZW5jb2RlKHN0cmluZy5zdWIoc3RyLCBvZmZzZXQsIG9mZnNldCtsZW5ndGgpKQorICAgIHNlbGYudHJhbnM6d3JpdGUoYnl0ZXMpCisgIGVuZAorICBzZWxmLnRyYW5zOndyaXRlKEpTT05Ob2RlLlN0cmluZ0RlbGltaXRlcikKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlSlNPTkludGVnZXIobnVtKQorICBzZWxmOndyaXRlRWxlbVNlcGFyYXRvcigpCisgIGlmIHNlbGY6ZXNjYXBlTnVtKCkgdGhlbgorICAgIHNlbGYudHJhbnM6d3JpdGUoSlNPTk5vZGUuU3RyaW5nRGVsaW1pdGVyKQorICBlbmQKKyAgbG9jYWwgbnVtc3RyID0gIiIgLi4gbnVtCisgIG51bXN0ciA9IHN0cmluZy5zdWIobnVtc3RyLCBzdHJpbmcuZmluZChudW1zdHIsICJeWystXT8lZCsiKSkKKyAgc2VsZi50cmFuczp3cml0ZShudW1zdHIpCisgIGlmIHNlbGY6ZXNjYXBlTnVtKCkgdGhlbgorICAgIHNlbGYudHJhbnM6d3JpdGUoSlNPTk5vZGUuU3RyaW5nRGVsaW1pdGVyKQorICBlbmQKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlSlNPTkRvdWJsZShkdWIpCisgIHNlbGY6d3JpdGVFbGVtU2VwYXJhdG9yKCkKKyAgbG9jYWwgdmFsID0gIiIgLi4gZHViCisgIGxvY2FsIHByZWZpeCA9IHN0cmluZy5zdWIodmFsLCAxLCAxKQorICBsb2NhbCBzcGVjaWFsID0gZmFsc2UKKyAgaWYgcHJlZml4ID09ICdOJyBvciBwcmVmaXggPT0gJ24nIHRoZW4KKyAgICB2YWwgPSBKU09OTm9kZS5OYW4KKyAgICBzcGVjaWFsID0gdHJ1ZQorICBlbHNlaWYgcHJlZml4ID09ICdJJyBvciBwcmVmaXggPT0gJ2knIHRoZW4KKyAgICB2YWwgPSBKU09OTm9kZS5JbmZpbml0eQorICAgIHNwZWNpYWwgPSB0cnVlCisgIGVsc2VpZiBwcmVmaXggPT0gJy0nIHRoZW4KKyAgICBsb2NhbCBzZWNvbmRCeXRlID0gc3RyaW5nLnN1Yih2YWwsIDIsIDIpCisgICAgaWYgc2Vjb25kQnl0ZSA9PSAnSScgb3Igc2Vjb25kQnl0ZSA9PSAnaScgdGhlbgorICAgICAgdmFsID0gSlNPTk5vZGUuTmVnYXRpdmVJbmZpbml0eQorICAgICAgc3BlY2lhbCA9IHRydWUKKyAgICBlbmQKKyAgZW5kCisKKyAgaWYgc3BlY2lhbCBvciBzZWxmOmVzY2FwZU51bSgpIHRoZW4KKyAgICBzZWxmLnRyYW5zOndyaXRlKEpTT05Ob2RlLlN0cmluZ0RlbGltaXRlcikKKyAgZW5kCisgIHNlbGYudHJhbnM6d3JpdGUodmFsKQorICBpZiBzcGVjaWFsIG9yIHNlbGY6ZXNjYXBlTnVtKCkgdGhlbgorICAgIHNlbGYudHJhbnM6d3JpdGUoSlNPTk5vZGUuU3RyaW5nRGVsaW1pdGVyKQorICBlbmQKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlSlNPTk9iamVjdEJlZ2luKCkKKyAgc2VsZjp3cml0ZUVsZW1TZXBhcmF0b3IoKQorICBzZWxmLnRyYW5zOndyaXRlKEpTT05Ob2RlLk9iamVjdEJlZ2luKQorICBzZWxmOmNvbnRleHRQdXNoKHtmaXJzdCA9IHRydWUsIGNvbG9uID0gdHJ1ZSwgdHR5cGUgPSAxLCBudWxsID0gZmFsc2V9KQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVKU09OT2JqZWN0RW5kKCkKKyAgc2VsZjpjb250ZXh0UG9wKCkKKyAgc2VsZi50cmFuczp3cml0ZShKU09OTm9kZS5PYmplY3RFbmQpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZUpTT05BcnJheUJlZ2luKCkKKyAgc2VsZjp3cml0ZUVsZW1TZXBhcmF0b3IoKQorICBzZWxmLnRyYW5zOndyaXRlKEpTT05Ob2RlLkFycmF5QmVnaW4pCisgIHNlbGY6Y29udGV4dFB1c2goe2ZpcnN0ID0gdHJ1ZSwgY29sb24gPSB0cnVlLCB0dHlwZSA9IDIsIG51bGwgPSBmYWxzZX0pCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZUpTT05BcnJheUVuZCgpCisgIHNlbGY6Y29udGV4dFBvcCgpCisgIHNlbGYudHJhbnM6d3JpdGUoSlNPTk5vZGUuQXJyYXlFbmQpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZU1lc3NhZ2VCZWdpbihuYW1lLCB0dHlwZSwgc2VxaWQpCisgIHNlbGY6cmVzZXRDb250ZXh0KCkKKyAgc2VsZjp3cml0ZUpTT05BcnJheUJlZ2luKCkKKyAgc2VsZjp3cml0ZUpTT05JbnRlZ2VyKFRKU09OUHJvdG9jb2wuVEhSSUZUX0pTT05fUFJPVE9DT0xfVkVSU0lPTikKKyAgc2VsZjp3cml0ZUpTT05TdHJpbmcobmFtZSkKKyAgc2VsZjp3cml0ZUpTT05JbnRlZ2VyKHR0eXBlKQorICBzZWxmOndyaXRlSlNPTkludGVnZXIoc2VxaWQpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZU1lc3NhZ2VFbmQoKQorICBzZWxmOndyaXRlSlNPTkFycmF5RW5kKCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlU3RydWN0QmVnaW4obmFtZSkKKyAgc2VsZjp3cml0ZUpTT05PYmplY3RCZWdpbigpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZVN0cnVjdEVuZCgpCisgIHNlbGY6d3JpdGVKU09OT2JqZWN0RW5kKCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlRmllbGRCZWdpbihuYW1lLCB0dHlwZSwgaWQpCisgIHNlbGY6d3JpdGVKU09OSW50ZWdlcihpZCkKKyAgc2VsZjp3cml0ZUpTT05PYmplY3RCZWdpbigpCisgIHNlbGY6d3JpdGVKU09OU3RyaW5nKFRUeXBlVG9TdHJpbmdbdHR5cGVdKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVGaWVsZEVuZCgpCisgIHNlbGY6d3JpdGVKU09OT2JqZWN0RW5kKCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlRmllbGRTdG9wKCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlTWFwQmVnaW4oa3R5cGUsIHZ0eXBlLCBzaXplKQorICBzZWxmOndyaXRlSlNPTkFycmF5QmVnaW4oKQorICBzZWxmOndyaXRlSlNPTlN0cmluZyhUVHlwZVRvU3RyaW5nW2t0eXBlXSkKKyAgc2VsZjp3cml0ZUpTT05TdHJpbmcoVFR5cGVUb1N0cmluZ1t2dHlwZV0pCisgIHNlbGY6d3JpdGVKU09OSW50ZWdlcihzaXplKQorICByZXR1cm4gc2VsZjp3cml0ZUpTT05PYmplY3RCZWdpbigpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZU1hcEVuZCgpCisgIHNlbGY6d3JpdGVKU09OT2JqZWN0RW5kKCkKKyAgc2VsZjp3cml0ZUpTT05BcnJheUVuZCgpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZUxpc3RCZWdpbihldHlwZSwgc2l6ZSkKKyAgc2VsZjp3cml0ZUpTT05BcnJheUJlZ2luKCkKKyAgc2VsZjp3cml0ZUpTT05TdHJpbmcoVFR5cGVUb1N0cmluZ1tldHlwZV0pCisgIHNlbGY6d3JpdGVKU09OSW50ZWdlcihzaXplKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVMaXN0RW5kKCkKKyAgc2VsZjp3cml0ZUpTT05BcnJheUVuZCgpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZVNldEJlZ2luKGV0eXBlLCBzaXplKQorICBzZWxmOndyaXRlSlNPTkFycmF5QmVnaW4oKQorICBzZWxmOndyaXRlSlNPTlN0cmluZyhUVHlwZVRvU3RyaW5nW2V0eXBlXSkKKyAgc2VsZjp3cml0ZUpTT05JbnRlZ2VyKHNpemUpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZVNldEVuZCgpCisgIHNlbGY6d3JpdGVKU09OQXJyYXlFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVCb29sKGJvb2wpCisgIGlmIGJvb2wgdGhlbgorICAgIHNlbGY6d3JpdGVKU09OSW50ZWdlcigxKQorICBlbHNlCisgICAgc2VsZjp3cml0ZUpTT05JbnRlZ2VyKDApCisgIGVuZAorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVCeXRlKGJ5dGUpCisgIGxvY2FsIGJ1ZmYgPSBsaWJsdWFicGFjay5icGFjaygnYycsIGJ5dGUpCisgIGxvY2FsIHZhbCA9IGxpYmx1YWJwYWNrLmJ1bnBhY2soJ2MnLCBidWZmKQorICBzZWxmOndyaXRlSlNPTkludGVnZXIodmFsKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVJMTYoaTE2KQorICBsb2NhbCBidWZmID0gbGlibHVhYnBhY2suYnBhY2soJ3MnLCBpMTYpCisgIGxvY2FsIHZhbCA9IGxpYmx1YWJwYWNrLmJ1bnBhY2soJ3MnLCBidWZmKQorICBzZWxmOndyaXRlSlNPTkludGVnZXIodmFsKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVJMzIoaTMyKQorICBsb2NhbCBidWZmID0gbGlibHVhYnBhY2suYnBhY2soJ2knLCBpMzIpCisgIGxvY2FsIHZhbCA9IGxpYmx1YWJwYWNrLmJ1bnBhY2soJ2knLCBidWZmKQorICBzZWxmOndyaXRlSlNPTkludGVnZXIodmFsKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVJNjQoaTY0KQorICBsb2NhbCBidWZmID0gbGlibHVhYnBhY2suYnBhY2soJ2wnLCBpNjQpCisgIGxvY2FsIHZhbCA9IGxpYmx1YWJwYWNrLmJ1bnBhY2soJ2wnLCBidWZmKQorICBzZWxmOndyaXRlSlNPTkludGVnZXIodG9zdHJpbmcodmFsKSkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOndyaXRlRG91YmxlKGR1YikKKyAgc2VsZjp3cml0ZUpTT05Eb3VibGUoc3RyaW5nLmZvcm1hdCgiJS4xNmYiLCBkdWIpKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6d3JpdGVTdHJpbmcoc3RyKQorICBzZWxmOndyaXRlSlNPTlN0cmluZyhzdHIpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDp3cml0ZUJpbmFyeShzdHIpCisgIC0tIFNob3VsZCBiZSB1dGYtOAorICBzZWxmOndyaXRlSlNPTkJhc2U2NChzdHIpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkSlNPTlN5bnRheENoYXIoY2gpCisgIGxvY2FsIGNoMiA9ICIiCisgIGlmIHNlbGYuaGFzUmVhZEJ5dGUgfj0gIiIgdGhlbgorICAgIGNoMiA9IHNlbGYuaGFzUmVhZEJ5dGUKKyAgICBzZWxmLmhhc1JlYWRCeXRlID0gIiIKKyAgZWxzZQorICAgIGNoMiA9IHNlbGYudHJhbnM6cmVhZEFsbCgxKQorICBlbmQKKyAgaWYgY2gyIH49IGNoIHRoZW4KKyAgICB0ZXJyb3IoVFByb3RvY29sRXhjZXB0aW9uOm5ld3ttZXNzYWdlID0gIkV4cGVjdGVkICIuLiBjaCAuLiAiLCBnb3QgIiAuLiBjaDJ9KQorICBlbmQKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRFbGVtU2VwYXJhdG9yKCkKKyAgaWYgc2VsZi5qc29uQ29udGV4dFZhbC5udWxsIHRoZW4KKyAgICByZXR1cm4KKyAgZW5kCisgIGlmIHNlbGYuanNvbkNvbnRleHRWYWwuZmlyc3QgdGhlbgorICAgIHNlbGYuanNvbkNvbnRleHRWYWwuZmlyc3QgPSBmYWxzZQorICBlbHNlCisgICAgaWYgc2VsZi5qc29uQ29udGV4dFZhbC50dHlwZSA9PSAxIHRoZW4KKyAgICAgIGlmIHNlbGYuanNvbkNvbnRleHRWYWwuY29sb24gdGhlbgorICAgICAgICBzZWxmOnJlYWRKU09OU3ludGF4Q2hhcihKU09OTm9kZS5QYWlyU2VwYXJhdG9yKQorICAgICAgICBzZWxmLmpzb25Db250ZXh0VmFsLmNvbG9uID0gZmFsc2UKKyAgICAgIGVsc2UKKyAgICAgICAgc2VsZjpyZWFkSlNPTlN5bnRheENoYXIoSlNPTk5vZGUuRWxlbVNlcGFyYXRvcikKKyAgICAgICAgc2VsZi5qc29uQ29udGV4dFZhbC5jb2xvbiA9IHRydWUKKyAgICAgIGVuZAorICAgIGVsc2UKKyAgICAgIHNlbGY6cmVhZEpTT05TeW50YXhDaGFyKEpTT05Ob2RlLkVsZW1TZXBhcmF0b3IpCisgICAgZW5kCisgIGVuZAorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6aGV4VmFsKGNoKQorICBsb2NhbCB2YWwgPSBzdHJpbmcuYnl0ZShjaCkKKyAgaWYgdmFsID49IDQ4IGFuZCB2YWwgPD0gNTcgdGhlbgorICAgIHJldHVybiB2YWwgLSA0OAorICBlbHNlaWYgdmFsID49IDk3IGFuZCB2YWwgPD0gMTAyIHRoZW4KKyAgICByZXR1cm4gdmFsIC0gODcKKyAgZWxzZQorICAgIHRlcnJvcihUUHJvdG9jb2xFeGNlcHRpb246bmV3e21lc3NhZ2UgPSAiRXhwZWN0ZWQgaGV4IHZhbCAoWzAtOWEtZl0pOyBnb3QgIiAuLiBjaH0pCisgIGVuZAorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZEpTT05Fc2NhcGVDaGFyKGNoKQorICBzZWxmOnJlYWRKU09OU3ludGF4Q2hhcihKU09OTm9kZS5aZXJvQ2hhcikKKyAgc2VsZjpyZWFkSlNPTlN5bnRheENoYXIoSlNPTk5vZGUuWmVyb0NoYXIpCisgIGxvY2FsIGIxID0gc2VsZi50cmFuczpyZWFkQWxsKDEpCisgIGxvY2FsIGIyID0gc2VsZi50cmFuczpyZWFkQWxsKDEpCisgIHJldHVybiBsaWJsdWFiaXR3aXNlLnNoaWZ0bChzZWxmOmhleFZhbChiMSksIDQpICsgc2VsZjpoZXhWYWwoYjIpCitlbmQKKworCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRKU09OU3RyaW5nKCkKKyAgc2VsZjpyZWFkRWxlbVNlcGFyYXRvcigpCisgIHNlbGY6cmVhZEpTT05TeW50YXhDaGFyKEpTT05Ob2RlLlN0cmluZ0RlbGltaXRlcikKKyAgbG9jYWwgcmVzdWx0ID0gIiIKKyAgd2hpbGUgdHJ1ZSBkbworICAgIGxvY2FsIGNoID0gc2VsZi50cmFuczpyZWFkQWxsKDEpCisgICAgaWYgY2ggPT0gSlNPTk5vZGUuU3RyaW5nRGVsaW1pdGVyIHRoZW4KKyAgICAgIGJyZWFrCisgICAgZW5kCisgICAgaWYgY2ggPT0gSlNPTk5vZGUuQmFja3NsYXNoIHRoZW4KKyAgICAgIGNoID0gc2VsZi50cmFuczpyZWFkQWxsKDEpCisgICAgICBpZiBjaCA9PSBKU09OTm9kZS5Fc2NhcGVDaGFyIHRoZW4KKyAgICAgICAgc2VsZjpyZWFkSlNPTkVzY2FwZUNoYXIoY2gpCisgICAgICBlbHNlCisgICAgICAgIGxvY2FsIHBvcywgXyA9IHN0cmluZy5maW5kKEpTT05Ob2RlLkVzY2FwZUNoYXJzLCBjaCkKKyAgICAgICAgaWYgcG9zID09IG5pbCB0aGVuCisgICAgICAgICAgdGVycm9yKFRQcm90b2NvbEV4Y2VwdGlvbjpuZXd7bWVzc2FnZSA9ICJFeHBlY3RlZCBjb250cm9sIGNoYXIsIGdvdCAiIC4uIGNofSkKKyAgICAgICAgZW5kCisgICAgICAgIGNoID0gRXNjYXBlQ2hhclZhbHNbcG9zXQorICAgICAgZW5kCisgICAgZW5kCisgICAgcmVzdWx0ID0gcmVzdWx0IC4uIGNoCisgIGVuZAorICByZXR1cm4gcmVzdWx0CitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkSlNPTkJhc2U2NCgpCisgIGxvY2FsIHJlc3VsdCA9IHNlbGY6cmVhZEpTT05TdHJpbmcoKQorICBsb2NhbCBsZW5ndGggPSBzdHJpbmcubGVuKHJlc3VsdCkKKyAgbG9jYWwgc3RyID0gIiIKKyAgbG9jYWwgb2Zmc2V0ID0gMQorICB3aGlsZSBsZW5ndGggPj0gNCBkbworICAgIGxvY2FsIGJ5dGVzID0gc3RyaW5nLnN1YihyZXN1bHQsIG9mZnNldCwgb2Zmc2V0KzQpCisgICAgc3RyID0gc3RyIC4uIGJhc2U2NF9kZWNvZGUoYnl0ZXMpCisgICAgb2Zmc2V0ID0gb2Zmc2V0ICsgNAorICAgIGxlbmd0aCA9IGxlbmd0aCAtIDQKKyAgZW5kCisgIGlmIGxlbmd0aCA+PSAwIHRoZW4KKyAgICBzdHIgPSBzdHIgLi4gYmFzZTY0X2RlY29kZShzdHJpbmcuc3ViKHJlc3VsdCwgb2Zmc2V0LCBvZmZzZXQgKyBsZW5ndGgpKQorICBlbmQKKyAgcmV0dXJuIHN0cgorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZEpTT05OdW1lcmljQ2hhcnMoKQorICBsb2NhbCByZXN1bHQgPSAiIgorICB3aGlsZSB0cnVlIGRvCisgICAgbG9jYWwgY2ggPSBzZWxmLnRyYW5zOnJlYWRBbGwoMSkKKyAgICBpZiBzdHJpbmcuZmluZChjaCwgJ1stKzAtOS5FZV0nKSB0aGVuCisgICAgICByZXN1bHQgPSByZXN1bHQgLi4gY2gKKyAgICBlbHNlCisgICAgICBzZWxmLmhhc1JlYWRCeXRlID0gY2gKKyAgICAgIGJyZWFrCisgICAgZW5kCisgIGVuZAorICByZXR1cm4gcmVzdWx0CitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkSlNPTkxvbmdJbnRlZ2VyKCkKKyAgc2VsZjpyZWFkRWxlbVNlcGFyYXRvcigpCisgIGlmIHNlbGY6ZXNjYXBlTnVtKCkgdGhlbgorICAgIHNlbGY6cmVhZEpTT05TeW50YXhDaGFyKEpTT05Ob2RlLlN0cmluZ0RlbGltaXRlcikKKyAgZW5kCisgIGxvY2FsIHJlc3VsdCA9IHNlbGY6cmVhZEpTT05OdW1lcmljQ2hhcnMoKQorICBpZiBzZWxmOmVzY2FwZU51bSgpIHRoZW4KKyAgICBzZWxmOnJlYWRKU09OU3ludGF4Q2hhcihKU09OTm9kZS5TdHJpbmdEZWxpbWl0ZXIpCisgIGVuZAorICByZXR1cm4gcmVzdWx0CitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkSlNPTkludGVnZXIoKQorICByZXR1cm4gdG9udW1iZXIoc2VsZjpyZWFkSlNPTkxvbmdJbnRlZ2VyKCkpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkSlNPTkRvdWJsZSgpCisgIHNlbGY6cmVhZEVsZW1TZXBhcmF0b3IoKQorICBsb2NhbCBkZWxpbWl0ZXIgPSBzZWxmLnRyYW5zOnJlYWRBbGwoMSkKKyAgbG9jYWwgbnVtID0gMC4wCisgIGlmIGRlbGltaXRlciA9PSBKU09OTm9kZS5TdHJpbmdEZWxpbWl0ZXIgdGhlbgorICAgIGxvY2FsIHN0ciA9IHNlbGY6cmVhZEpTT05TdHJpbmcoKQorICAgIGlmIHN0ciA9PSBKU09OTm9kZS5OYW4gdGhlbgorICAgICAgbnVtID0gMS4wCisgICAgZWxzZWlmIHN0ciA9PSBKU09OTm9kZS5JbmZpbml0eSB0aGVuCisgICAgICBudW0gPSBtYXRoLm1heGludGVnZXIKKyAgICBlbHNlaWYgc3RyID09IEpTT05Ob2RlLk5lZ2F0aXZlSW5maW5pdHkgdGhlbgorICAgICAgbnVtID0gbWF0aC5taW5pbnRlZ2VyCisgICAgZWxzZQorICAgICAgbnVtID0gdG9udW1iZXIoc3RyKQorICAgIGVuZAorICBlbHNlCisgICAgaWYgc2VsZjplc2NhcGVOdW0oKSB0aGVuCisgICAgICBzZWxmOnJlYWRKU09OU3ludGF4Q2hhcihKU09OTm9kZS5TdHJpbmdEZWxpbWl0ZXIpCisgICAgZW5kCisgICAgbG9jYWwgcmVzdWx0ID0gc2VsZjpyZWFkSlNPTk51bWVyaWNDaGFycygpCisgICAgbnVtID0gdG9udW1iZXIoZGVsaW1pdGVyLi4gcmVzdWx0KQorICBlbmQKKyAgcmV0dXJuIG51bQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZEpTT05PYmplY3RCZWdpbigpCisgIHNlbGY6cmVhZEVsZW1TZXBhcmF0b3IoKQorICBzZWxmOnJlYWRKU09OU3ludGF4Q2hhcihKU09OTm9kZS5PYmplY3RCZWdpbikKKyAgc2VsZjpjb250ZXh0UHVzaCh7Zmlyc3QgPSB0cnVlLCBjb2xvbiA9IHRydWUsIHR0eXBlID0gMSwgbnVsbCA9IGZhbHNlfSkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRKU09OT2JqZWN0RW5kKCkKKyAgc2VsZjpyZWFkSlNPTlN5bnRheENoYXIoSlNPTk5vZGUuT2JqZWN0RW5kKQorICBzZWxmOmNvbnRleHRQb3AoKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZEpTT05BcnJheUJlZ2luKCkKKyAgc2VsZjpyZWFkRWxlbVNlcGFyYXRvcigpCisgIHNlbGY6cmVhZEpTT05TeW50YXhDaGFyKEpTT05Ob2RlLkFycmF5QmVnaW4pCisgIHNlbGY6Y29udGV4dFB1c2goe2ZpcnN0ID0gdHJ1ZSwgY29sb24gPSB0cnVlLCB0dHlwZSA9IDIsIG51bGwgPSBmYWxzZX0pCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkSlNPTkFycmF5RW5kKCkKKyAgc2VsZjpyZWFkSlNPTlN5bnRheENoYXIoSlNPTk5vZGUuQXJyYXlFbmQpCisgIHNlbGY6Y29udGV4dFBvcCgpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkTWVzc2FnZUJlZ2luKCkKKyAgc2VsZjpyZXNldENvbnRleHQoKQorICBzZWxmOnJlYWRKU09OQXJyYXlCZWdpbigpCisgIGxvY2FsIHZlcnNpb24gPSBzZWxmOnJlYWRKU09OSW50ZWdlcigpCisgIGlmIHZlcnNpb24gfj0gc2VsZi5USFJJRlRfSlNPTl9QUk9UT0NPTF9WRVJTSU9OIHRoZW4KKyAgICB0ZXJyb3IoVFByb3RvY29sRXhjZXB0aW9uOm5ld3ttZXNzYWdlID0gIk1lc3NhZ2UgY29udGFpbmVkIGJhZCB2ZXJzaW9uLiJ9KQorICBlbmQKKyAgbG9jYWwgbmFtZSA9IHNlbGY6cmVhZEpTT05TdHJpbmcoKQorICBsb2NhbCB0dHlwZSA9IHNlbGY6cmVhZEpTT05JbnRlZ2VyKCkKKyAgbG9jYWwgc2VxaWQgPSBzZWxmOnJlYWRKU09OSW50ZWdlcigpCisgIHJldHVybiBuYW1lLCB0dHlwZSwgc2VxaWQKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRNZXNzYWdlRW5kKCkKKyAgc2VsZjpyZWFkSlNPTkFycmF5RW5kKCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRTdHJ1Y3RCZWdpbigpCisgIHNlbGY6cmVhZEpTT05PYmplY3RCZWdpbigpCisgIHJldHVybiBuaWwKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRTdHJ1Y3RFbmQoKQorICBzZWxmOnJlYWRKU09OT2JqZWN0RW5kKCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRGaWVsZEJlZ2luKCkKKyAgbG9jYWwgdHR5cGUgPSBUVHlwZS5TVE9QCisgIGxvY2FsIGlkID0gMAorICBsb2NhbCBjaCA9IHNlbGYudHJhbnM6cmVhZEFsbCgxKQorICBzZWxmLmhhc1JlYWRCeXRlID0gY2gKKyAgaWYgY2ggfj0gSlNPTk5vZGUuT2JqZWN0RW5kIHRoZW4KKyAgICBpZCA9IHNlbGY6cmVhZEpTT05JbnRlZ2VyKCkKKyAgICBzZWxmOnJlYWRKU09OT2JqZWN0QmVnaW4oKQorICAgIGxvY2FsIHR5cGVOYW1lID0gc2VsZjpyZWFkSlNPTlN0cmluZygpCisgICAgdHR5cGUgPSBTdHJpbmdUb1RUeXBlW3R5cGVOYW1lXQorICBlbmQKKyAgcmV0dXJuIG5pbCwgdHR5cGUsIGlkCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkRmllbGRFbmQoKQorICBzZWxmOnJlYWRKU09OT2JqZWN0RW5kKCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRNYXBCZWdpbigpCisgIHNlbGY6cmVhZEpTT05BcnJheUJlZ2luKCkKKyAgbG9jYWwgdHlwZU5hbWUgPSBzZWxmOnJlYWRKU09OU3RyaW5nKCkKKyAgbG9jYWwga3R5cGUgPSBTdHJpbmdUb1RUeXBlW3R5cGVOYW1lXQorICB0eXBlTmFtZSA9IHNlbGY6cmVhZEpTT05TdHJpbmcoKQorICBsb2NhbCB2dHlwZSA9IFN0cmluZ1RvVFR5cGVbdHlwZU5hbWVdCisgIGxvY2FsIHNpemUgPSBzZWxmOnJlYWRKU09OSW50ZWdlcigpCisgIHNlbGY6cmVhZEpTT05PYmplY3RCZWdpbigpCisgIHJldHVybiBrdHlwZSwgdnR5cGUsIHNpemUKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRNYXBFbmQoKQorICBzZWxmOnJlYWRKU09OT2JqZWN0RW5kKCkKKyAgc2VsZjpyZWFkSlNPTkFycmF5RW5kKCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRMaXN0QmVnaW4oKQorICBzZWxmOnJlYWRKU09OQXJyYXlCZWdpbigpCisgIGxvY2FsIHR5cGVOYW1lID0gc2VsZjpyZWFkSlNPTlN0cmluZygpCisgIGxvY2FsIGV0eXBlID0gU3RyaW5nVG9UVHlwZVt0eXBlTmFtZV0KKyAgbG9jYWwgc2l6ZSA9IHNlbGY6cmVhZEpTT05JbnRlZ2VyKCkKKyAgcmV0dXJuIGV0eXBlLCBzaXplCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkTGlzdEVuZCgpCisgIHJldHVybiBzZWxmOnJlYWRKU09OQXJyYXlFbmQoKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZFNldEJlZ2luKCkKKyAgcmV0dXJuIHNlbGY6cmVhZExpc3RCZWdpbigpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkU2V0RW5kKCkKKyAgcmV0dXJuIHNlbGY6cmVhZEpTT05BcnJheUVuZCgpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkQm9vbCgpCisgIGxvY2FsIHJlc3VsdCA9IHNlbGY6cmVhZEpTT05JbnRlZ2VyKCkKKyAgaWYgcmVzdWx0ID09IDEgdGhlbgorICAgIHJldHVybiB0cnVlCisgIGVsc2UKKyAgICByZXR1cm4gZmFsc2UKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkQnl0ZSgpCisgIGxvY2FsIHJlc3VsdCA9IHNlbGY6cmVhZEpTT05JbnRlZ2VyKCkKKyAgaWYgcmVzdWx0ID49IDI1NiB0aGVuCisgICAgdGVycm9yKFRQcm90b2NvbEV4Y2VwdGlvbjpuZXd7bWVzc2FnZSA9ICJVbkV4cGVjdGVkIEJ5dGUgIiAuLiByZXN1bHR9KQorICBlbmQKKyAgcmV0dXJuIHJlc3VsdAorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZEkxNigpCisgIHJldHVybiBzZWxmOnJlYWRKU09OSW50ZWdlcigpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkSTMyKCkKKyAgcmV0dXJuIHNlbGY6cmVhZEpTT05JbnRlZ2VyKCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRJNjQoKQorICBsb2NhbCBsb25nID0gbGlibHVhbG9uZ251bWJlci5uZXcKKyAgcmV0dXJuIGxvbmcoc2VsZjpyZWFkSlNPTkxvbmdJbnRlZ2VyKCkpCitlbmQKKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbDpyZWFkRG91YmxlKCkKKyAgcmV0dXJuIHNlbGY6cmVhZEpTT05Eb3VibGUoKQorZW5kCisKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2w6cmVhZFN0cmluZygpCisgIHJldHVybiBzZWxmOnJlYWRKU09OU3RyaW5nKCkKK2VuZAorCitmdW5jdGlvbiBUSlNPTlByb3RvY29sOnJlYWRCaW5hcnkoKQorICByZXR1cm4gc2VsZjpyZWFkSlNPTkJhc2U2NCgpCitlbmQKKworVEpTT05Qcm90b2NvbEZhY3RvcnkgPSBUUHJvdG9jb2xGYWN0b3J5Om5ld3sKKyAgX190eXBlID0gJ1RKU09OUHJvdG9jb2xGYWN0b3J5JywKK30KKworZnVuY3Rpb24gVEpTT05Qcm90b2NvbEZhY3Rvcnk6Z2V0UHJvdG9jb2wodHJhbnMpCisgIC0tIFRPRE8gRW5mb3JjZSB0aGF0IHRoaXMgbXVzdCBiZSBhIHRyYW5zcG9ydCBjbGFzcyAoaWUgbm90IGEgYm9vbCkKKyAgaWYgbm90IHRyYW5zIHRoZW4KKyAgICB0ZXJyb3IoVFByb3RvY29sRXhjZXB0aW9uOm5ld3sKKyAgICAgIG1lc3NhZ2UgPSAnTXVzdCBzdXBwbHkgYSB0cmFuc3BvcnQgdG8gJyAuLiB0dHlwZShzZWxmKQorICAgIH0pCisgIGVuZAorICByZXR1cm4gVEpTT05Qcm90b2NvbDpuZXd7CisgICAgdHJhbnMgPSB0cmFucworICB9CitlbmQKZGlmZiAtLWdpdCBhL2xpYi9sdWEvVFNlcnZlci5sdWEgYi9saWIvbHVhL1RTZXJ2ZXIubHVhCmluZGV4IGQ2YjljZDAuLjRlMzdkNTggMTAwNjQ0Ci0tLSBhL2xpYi9sdWEvVFNlcnZlci5sdWEKKysrIGIvbGliL2x1YS9UU2VydmVyLmx1YQpAQCAtOTMsMTUgKzkzLDE2IEBACiAKIGZ1bmN0aW9uIFRTZXJ2ZXI6c2VydmUoKSBlbmQKIGZ1bmN0aW9uIFRTZXJ2ZXI6aGFuZGxlKGNsaWVudCkKLSAgbG9jYWwgaXRyYW5zLCBvdHJhbnMsIGlwcm90LCBvcHJvdCwgcmV0LCBlcnIgPQorICBsb2NhbCBpdHJhbnMsIG90cmFucyA9CiAgICAgc2VsZi5pbnB1dFRyYW5zcG9ydEZhY3Rvcnk6Z2V0VHJhbnNwb3J0KGNsaWVudCksCi0gICAgc2VsZi5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5OmdldFRyYW5zcG9ydChjbGllbnQpLAotICAgIHNlbGYuaW5wdXRQcm90b2NvbEZhY3Rvcnk6Z2V0UHJvdG9jb2woY2xpZW50KSwKLSAgICBzZWxmLm91dHB1dFByb3RvY29sRmFjdG9yeTpnZXRQcm90b2NvbChjbGllbnQpCisgICAgc2VsZi5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5OmdldFRyYW5zcG9ydChjbGllbnQpCisgIGxvY2FsIGlwcm90LCBvcHJvdCA9CisgICAgc2VsZi5pbnB1dFByb3RvY29sRmFjdG9yeTpnZXRQcm90b2NvbChpdHJhbnMpLAorICAgIHNlbGYub3V0cHV0UHJvdG9jb2xGYWN0b3J5OmdldFByb3RvY29sKG90cmFucykKIAogICBzZWxmOl9jbGllbnRCZWdpbihpcHJvdCwgb3Byb3QpCiAgIHdoaWxlIHRydWUgZG8KLSAgICByZXQsIGVyciA9IHBjYWxsKHNlbGYucHJvY2Vzc29yLnByb2Nlc3MsIHNlbGYucHJvY2Vzc29yLCBpcHJvdCwgb3Byb3QpCisgICAgbG9jYWwgcmV0LCBlcnIgPSBwY2FsbChzZWxmLnByb2Nlc3Nvci5wcm9jZXNzLCBzZWxmLnByb2Nlc3NvciwgaXByb3QsIG9wcm90KQogICAgIGlmIHJldCA9PSBmYWxzZSBhbmQgZXJyIHRoZW4KICAgICAgIGlmIG5vdCBzdHJpbmcuZmluZChlcnIsICJUVHJhbnNwb3J0RXhjZXB0aW9uIikgdGhlbgogICAgICAgICBzZWxmOl9oYW5kbGVFeGNlcHRpb24oZXJyKQpkaWZmIC0tZ2l0IGEvbGliL2x1YS9UaHJpZnQubHVhIGIvbGliL2x1YS9UaHJpZnQubHVhCmluZGV4IDliOGViMmYuLjY4ZDRiYTggMTAwNjQ0Ci0tLSBhL2xpYi9sdWEvVGhyaWZ0Lmx1YQorKysgYi9saWIvbHVhL1RocmlmdC5sdWEKQEAgLTQ4LDcgKzQ4LDcgQEAKICAgcmV0dXJuIGNvdW50CiBlbmQKIAotdmVyc2lvbiA9IDAuOS4zCit2ZXJzaW9uID0gJzEuMC4wJwogCiBUVHlwZSA9IHsKICAgU1RPUCAgID0gMCwKZGlmZiAtLWdpdCBhL2xpYi9sdWEvc3JjL2x1YWJwYWNrLmMgYi9saWIvbHVhL3NyYy9sdWFicGFjay5jCmluZGV4IGM5MzY0MjguLjA3N2I2YWEgMTAwNjQ0Ci0tLSBhL2xpYi9sdWEvc3JjL2x1YWJwYWNrLmMKKysrIGIvbGliL2x1YS9zcmMvbHVhYnBhY2suYwpAQCAtOTQsNiArOTQsNyBAQAogLyoqCiAgKiBidW5wYWNrKHR5cGUsIGRhdGEpCiAgKiAgYyAtIFNpZ25lZCBCeXRlCisgKiAgQyAtIFVuc2lnbmVkIEJ5dGUKICAqICBzIC0gU2lnbmVkIFNob3J0CiAgKiAgaSAtIFNpZ25lZCBJbnQKICAqICBsIC0gU2lnbmVkIExvbmcKQEAgLTEwMyw3ICsxMDQsMTEgQEAKICAgY29uc3QgY2hhciAqY29kZSA9IGx1YUxfY2hlY2tzdHJpbmcoTCwgMSk7CiAgIGx1YUxfYXJnY2hlY2soTCwgY29kZVsxXSA9PSAnXDAnLCAwLCAiRm9ybWF0IGNvZGUgbXVzdCBiZSBvbmUgY2hhcmFjdGVyLiIpOwogICBjb25zdCBjaGFyICpkYXRhID0gbHVhTF9jaGVja3N0cmluZyhMLCAyKTsKKyNpZiBMVUFfVkVSU0lPTl9OVU0gPj0gNTAyCiAgIHNpemVfdCBsZW4gPSBsdWFfcmF3bGVuKEwsIDIpOworI2Vsc2UKKyAgc2l6ZV90IGxlbiA9IGx1YV9vYmpsZW4oTCwgMik7CisjZW5kaWYKIAogICBzd2l0Y2ggKGNvZGVbMF0pIHsKICAgICBjYXNlICdjJzogewpAQCAtMTEzLDYgKzExOCwxNiBAQAogICAgICAgbHVhX3B1c2hudW1iZXIoTCwgdmFsKTsKICAgICAgIGJyZWFrOwogICAgIH0KKyAgICAvKioKKyAgICAgKiB1bnBhY2sgdW5zaWduZWQgQnl0ZS4KKyAgICAgKi8KKyAgICBjYXNlICdDJzogeworICAgICAgdWludDhfdCB2YWw7CisgICAgICBsdWFMX2FyZ2NoZWNrKEwsIGxlbiA9PSBzaXplb2YodmFsKSwgMSwgIkludmFsaWQgaW5wdXQgc3RyaW5nIHNpemUuIik7CisgICAgICBtZW1jcHkoJnZhbCwgZGF0YSwgc2l6ZW9mKHZhbCkpOworICAgICAgbHVhX3B1c2hudW1iZXIoTCwgdmFsKTsKKyAgICAgIGJyZWFrOworICAgIH0KICAgICBjYXNlICdzJzogewogICAgICAgaW50MTZfdCB2YWw7CiAgICAgICBsdWFMX2FyZ2NoZWNrKEwsIGxlbiA9PSBzaXplb2YodmFsKSwgMSwgIkludmFsaWQgaW5wdXQgc3RyaW5nIHNpemUuIik7CkBAIC0xNTAsOSArMTY1LDE0MCBAQAogICByZXR1cm4gMTsKIH0KIAorLyoqCisgKiBDb252ZXJ0IGwgaW50byBhIHppZ3phZyBsb25nLiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlCisgKiByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCisgKi8KK3N0YXRpYyBpbnQgbF9pNjRUb1ppZ3phZyhsdWFfU3RhdGUgKkwpIHsKKyAgaW50NjRfdCBuID0gbHVhbG9uZ251bWJlcl9jaGVja2xvbmcoTCwgMSk7CisgIGludDY0X3QgcmVzdWx0ID0gKG4gPDwgMSkgXiAobiA+PiA2Myk7CisgIGx1YWxvbmdudW1iZXJfcHVzaGxvbmcoTCwgJnJlc3VsdCk7CisgIHJldHVybiAxOworfQorLyoqCisgKiBDb252ZXJ0IG4gaW50byBhIHppZ3phZyBpbnQuIFRoaXMgYWxsb3dzIG5lZ2F0aXZlIG51bWJlcnMgdG8gYmUKKyAqIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludC4KKyAqLworc3RhdGljIGludCBsX2kzMlRvWmlnemFnKGx1YV9TdGF0ZSAqTCkgeworICBpbnQzMl90IG4gPSBsdWFMX2NoZWNraW50ZWdlcihMLCAxKTsKKyAgdWludDMyX3QgcmVzdWx0ID0gKHVpbnQzMl90KShuIDw8IDEpIF4gKG4gPj4gMzEpOworICBsdWFfcHVzaG51bWJlcihMLCByZXN1bHQpOworICByZXR1cm4gMTsKK30KKworLyoqCisgKiBDb252ZXJ0IGZyb20gemlnemFnIGludCB0byBpbnQuCisgKi8KK3N0YXRpYyBpbnQgbF96aWd6YWdUb0kzMihsdWFfU3RhdGUgKkwpIHsKKyAgdWludDMyX3QgbiA9IGx1YUxfY2hlY2tpbnRlZ2VyKEwsIDEpOworICBpbnQzMl90IHJlc3VsdCA9IChpbnQzMl90KShuID4+IDEpIF4gKHVpbnQzMl90KSgtKGludDMyX3QpKG4gJiAxKSk7CisgIGx1YV9wdXNobnVtYmVyKEwsIHJlc3VsdCk7CisgIHJldHVybiAxOworfQorCisvKioKKyAqIENvbnZlcnQgZnJvbSB6aWd6YWcgbG9uZyB0byBsb25nLgorICovCitzdGF0aWMgaW50IGxfemlnemFnVG9JNjQobHVhX1N0YXRlICpMKSB7CisgIGludDY0X3QgbiA9IGx1YWxvbmdudW1iZXJfY2hlY2tsb25nKEwsIDEpOworICBpbnQ2NF90IHJlc3VsdCA9IChpbnQ2NF90KShuID4+IDEpIF4gKHVpbnQ2NF90KSgtKGludDY0X3QpKG4gJiAxKSk7CisgIGx1YWxvbmdudW1iZXJfcHVzaGxvbmcoTCwgJnJlc3VsdCk7CisgIHJldHVybiAxOworfQorCisvKioKKyAqIENvbnZlcnQgYW4gaTMyIHRvIGEgdmFyaW50LiBSZXN1bHRzIGluIDEtNSBieXRlcyBvbiB0aGUgYnVmZmVyLgorICovCitzdGF0aWMgaW50IGxfdG9WYXJpbnQzMihsdWFfU3RhdGUgKkwpIHsKKyAgdWludDhfdCBidWZbNV07CisgIHVpbnQzMl90IG4gPSBsdWFMX2NoZWNraW50ZWdlcihMLCAxKTsKKyAgdWludDMyX3Qgd3NpemUgPSAwOworCisgIHdoaWxlICgxKSB7CisgICAgaWYgKChuICYgfjB4N0YpID09IDApIHsKKyAgICAgIGJ1Zlt3c2l6ZSsrXSA9IChpbnQ4X3QpbjsKKyAgICAgIGJyZWFrOworICAgIH0gZWxzZSB7CisgICAgICBidWZbd3NpemUrK10gPSAoaW50OF90KSgobiAmIDB4N0YpIHwgMHg4MCk7CisgICAgICBuID4+PSA3OworICAgIH0KKyAgfQorICBsdWFfcHVzaGxzdHJpbmcoTCwgYnVmLCB3c2l6ZSk7CisgIHJldHVybiAxOworfQorCisvKioKKyAqIENvbnZlcnQgYW4gaTY0IHRvIGEgdmFyaW50LiBSZXN1bHRzIGluIDEtMTAgYnl0ZXMgb24gdGhlIGJ1ZmZlci4KKyAqLworc3RhdGljIGludCBsX3RvVmFyaW50NjQobHVhX1N0YXRlICpMKSB7CisgIHVpbnQ4X3QgZGF0YVsxMF07CisgIHVpbnQ2NF90IG4gPSBsdWFsb25nbnVtYmVyX2NoZWNrbG9uZyhMLCAxKTsKKyAgdWludDMyX3Qgd3NpemUgPSAwOworICBsdWFMX0J1ZmZlciBidWY7CisgIGx1YUxfYnVmZmluaXQoTCwgJmJ1Zik7CisKKyAgd2hpbGUgKDEpIHsKKyAgICBpZiAoKG4gJiB+MHg3RkwpID09IDApIHsKKyAgICAgIGRhdGFbd3NpemUrK10gPSAoaW50OF90KW47CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgeworICAgICAgZGF0YVt3c2l6ZSsrXSA9IChpbnQ4X3QpKChuICYgMHg3RikgfCAweDgwKTsKKyAgICAgIG4gPj49IDc7CisgICAgfQorICB9CisKKyAgbHVhTF9hZGRsc3RyaW5nKCZidWYsICh2b2lkKikmZGF0YSwgd3NpemUpOworICBsdWFMX3B1c2hyZXN1bHQoJmJ1Zik7CisgIHJldHVybiAxOworfQorCisvKioKKyAqIENvbnZlcnQgYSB2YXJpbnQgdG8gaTY0LgorICovCitzdGF0aWMgaW50IGxfZnJvbVZhcmludDY0KGx1YV9TdGF0ZSAqTCkgeworICBpbnQ2NF90IHJlc3VsdDsKKyAgdWludDhfdCBieXRlID0gbHVhTF9jaGVja251bWJlcihMLCAxKTsKKyAgaW50MzJfdCBzaGlmdCA9IGx1YUxfY2hlY2tudW1iZXIoTCwgMik7CisgIHVpbnQ2NF90IG4gPSAodWludDY0X3QpbHVhbG9uZ251bWJlcl9jaGVja2xvbmcoTCwgMyk7CisgIG4gfD0gKHVpbnQ2NF90KShieXRlICYgMHg3ZikgPDwgc2hpZnQ7CisKKyAgaWYgKCEoYnl0ZSAmIDB4ODApKSB7CisgICAgcmVzdWx0ID0gKGludDY0X3QpKG4gPj4gMSkgXiAodWludDY0X3QpKC0oaW50NjRfdCkobiAmIDEpKTsKKyAgICBsdWFfcHVzaG51bWJlcihMLCAwKTsKKyAgfSBlbHNlIHsKKyAgICByZXN1bHQgPSBuOworICAgIGx1YV9wdXNobnVtYmVyKEwsIDEpOworICB9CisgIGx1YWxvbmdudW1iZXJfcHVzaGxvbmcoTCwgJnJlc3VsdCk7CisgIHJldHVybiAyOworfQorCisvKioKKyAqIFRvIHBhY2sgbWVzc2FnZSB0eXBlIG9mIGNvbXBhY3QgcHJvdG9jb2wuCisgKi8KK3N0YXRpYyBpbnQgbF9wYWNrTWVzZ1R5cGUobHVhX1N0YXRlICpMKSB7CisgIGludDMyX3QgdmVyc2lvbl9uID0gbHVhTF9jaGVja2ludGVnZXIoTCwgMSk7CisgIGludDMyX3QgdmVyc2lvbl9tYXNrID0gbHVhTF9jaGVja2ludGVnZXIoTCwgMik7CisgIGludDMyX3QgbWVzc2FnZXR5cGUgPSBsdWFMX2NoZWNraW50ZWdlcihMLCAzKTsKKyAgaW50MzJfdCB0eXBlX3NoaWZ0X2Ftb3VudCA9IGx1YUxfY2hlY2tpbnRlZ2VyKEwsIDQpOworICBpbnQzMl90IHR5cGVfbWFzayA9IGx1YUxfY2hlY2tpbnRlZ2VyKEwsIDUpOworICBpbnQzMl90IHRvX21lc2dfdHlwZSA9ICh2ZXJzaW9uX24gJiB2ZXJzaW9uX21hc2spIHwKKyAgICAoKChpbnQzMl90KW1lc3NhZ2V0eXBlIDw8IHR5cGVfc2hpZnRfYW1vdW50KSAmIHR5cGVfbWFzayk7CisgIGx1YV9wdXNobnVtYmVyKEwsIHRvX21lc2dfdHlwZSk7CisgIHJldHVybiAxOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IGx1YUxfUmVnIGx1YV9icGFja1tdID0gewogICB7ImJwYWNrIiwgbF9icGFja30sCiAgIHsiYnVucGFjayIsIGxfYnVucGFja30sCisgIHsiaTMyVG9aaWd6YWciLCBsX2kzMlRvWmlnemFnfSwKKyAgeyJpNjRUb1ppZ3phZyIsIGxfaTY0VG9aaWd6YWd9LAorICB7InppZ3phZ1RvSTMyIiwgbF96aWd6YWdUb0kzMn0sCisgIHsiemlnemFnVG9JNjQiLCBsX3ppZ3phZ1RvSTY0fSwKKyAgeyJ0b1ZhcmludDMyIiwgbF90b1ZhcmludDMyfSwKKyAgeyJ0b1ZhcmludDY0IiwgbF90b1ZhcmludDY0fSwKKyAgeyJmcm9tVmFyaW50NjQiLCBsX2Zyb21WYXJpbnQ2NH0sCisgIHsicGFja01lc2dUeXBlIiwgbF9wYWNrTWVzZ1R5cGV9LAogICB7TlVMTCwgTlVMTH0KIH07CiAKZGlmZiAtLWdpdCBhL2xpYi9sdWEvc3JjL3NvY2tldC5oIGIvbGliL2x1YS9zcmMvc29ja2V0LmgKaW5kZXggODAxOWZmZS4uYWZiODI3ZSAxMDA2NDQKLS0tIGEvbGliL2x1YS9zcmMvc29ja2V0LmgKKysrIGIvbGliL2x1YS9zcmMvc29ja2V0LmgKQEAgLTUxLDggKzUxLDggQEAKIFRfRVJSQ09ERSBzb2NrZXRfcmVjdihwX3NvY2tldCBzb2NrLCBjaGFyICpkYXRhLCBzaXplX3QgbGVuLCBpbnQgdGltZW91dCwKICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnJlY2VpdmVkKTsKIAotdm9pZCBzb2NrZXRfc2V0YmxvY2tpbmcocF9zb2NrZXQgc29jayk7Ci12b2lkIHNvY2tldF9zZXRub25ibG9ja2luZyhwX3NvY2tldCBzb2NrKTsKK1RfRVJSQ09ERSBzb2NrZXRfc2V0YmxvY2tpbmcocF9zb2NrZXQgc29jayk7CitUX0VSUkNPREUgc29ja2V0X3NldG5vbmJsb2NraW5nKHBfc29ja2V0IHNvY2spOwogCiBUX0VSUkNPREUgc29ja2V0X2FjY2VwdChwX3NvY2tldCBzb2NrLCBwX3NvY2tldCBzaWJsaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgcF9zYSBhZGRyLCBzb2NrbGVuX3QgKmFkZHJfbGVuLCBpbnQgdGltZW91dCk7CmRpZmYgLS1naXQgYS9saWIvbHVhL3NyYy91c29ja2V0LmMgYi9saWIvbHVhL3NyYy91c29ja2V0LmMKaW5kZXggYmU2OTZlMC4uMWExYjU0OSAxMDA2NDQKLS0tIGEvbGliL2x1YS9zcmMvdXNvY2tldC5jCisrKyBiL2xpYi9sdWEvc3JjL3Vzb2NrZXQuYwpAQCAtNTgsMTMgKzU4LDE0IEBACiAKICAgZW5kID0gX19nZXR0aW1lKCkgKyB0aW1lb3V0LzEwMDA7CiAgIGRvIHsKKyAgICBGRF9aRVJPKCZyZmRzKTsKKyAgICBGRF9aRVJPKCZ3ZmRzKTsKKwogICAgIC8vIFNwZWNpZnkgd2hhdCBJL08gb3BlcmF0aW9ucyB3ZSBjYXJlIGFib3V0CiAgICAgaWYgKG1vZGUgJiBXQUlUX01PREVfUikgewotICAgICAgRkRfWkVSTygmcmZkcyk7CiAgICAgICBGRF9TRVQoKnNvY2ssICZyZmRzKTsKICAgICB9CiAgICAgaWYgKG1vZGUgJiBXQUlUX01PREVfVykgewotICAgICAgRkRfWkVSTygmd2Zkcyk7CiAgICAgICBGRF9TRVQoKnNvY2ssICZ3ZmRzKTsKICAgICB9CiAKQEAgLTExMiw3ICsxMTMsNyBAQAogVF9FUlJDT0RFIHNvY2tldF9kZXN0cm95KHBfc29ja2V0IHNvY2spIHsKICAgLy8gVE9ETyBGaWd1cmUgb3V0IGlmIEkgc2hvdWxkIGJlIGZyZWUtaW5nIHRoaXMKICAgaWYgKCpzb2NrID4gMCkgewotICAgIHNvY2tldF9zZXRibG9ja2luZyhzb2NrKTsKKyAgICAodm9pZClzb2NrZXRfc2V0YmxvY2tpbmcoc29jayk7CiAgICAgY2xvc2UoKnNvY2spOwogICAgICpzb2NrID0gLTE7CiAgIH0KQEAgLTEyMCwzMCArMTIxLDM5IEBACiB9CiAKIFRfRVJSQ09ERSBzb2NrZXRfYmluZChwX3NvY2tldCBzb2NrLCBwX3NhIGFkZHIsIGludCBhZGRyX2xlbikgewotICBpbnQgcmV0ID0gU1VDQ0VTUzsKLSAgc29ja2V0X3NldGJsb2NraW5nKHNvY2spOworICBpbnQgcmV0ID0gc29ja2V0X3NldGJsb2NraW5nKHNvY2spOworICBpZiAocmV0ICE9IFNVQ0NFU1MpIHsKKyAgICByZXR1cm4gcmV0OworICB9CiAgIGlmIChiaW5kKCpzb2NrLCBhZGRyLCBhZGRyX2xlbikpIHsKICAgICByZXQgPSBlcnJubzsKICAgfQotICBzb2NrZXRfc2V0bm9uYmxvY2tpbmcoc29jayk7Ci0gIHJldHVybiByZXQ7CisgIGludCByZXQyID0gc29ja2V0X3NldG5vbmJsb2NraW5nKHNvY2spOworICByZXR1cm4gcmV0ID09IFNVQ0NFU1MgPyByZXQyIDogcmV0OwogfQogCiBUX0VSUkNPREUgc29ja2V0X2dldF9pbmZvKHBfc29ja2V0IHNvY2ssIHNob3J0ICpwb3J0LCBjaGFyICpidWYsIHNpemVfdCBsZW4pIHsKLSAgc3RydWN0IHNvY2thZGRyX2luIHNhOwotICBzb2NrbGVuX3QgYWRkcmxlbjsKKyAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2Ugc2E7CiAgIG1lbXNldCgmc2EsIDAsIHNpemVvZihzYSkpOworICBzb2NrbGVuX3QgYWRkcmxlbiA9IHNpemVvZihzYSk7CiAgIGludCByYyA9IGdldHNvY2tuYW1lKCpzb2NrLCAoc3RydWN0IHNvY2thZGRyKikmc2EsICZhZGRybGVuKTsKICAgaWYgKCFyYykgewotICAgIGNoYXIgKmFkZHIgPSBpbmV0X250b2Eoc2Euc2luX2FkZHIpOwotICAgICpwb3J0ID0gbnRvaHMoc2Euc2luX3BvcnQpOwotICAgIGlmIChzdHJsZW4oYWRkcikgPCBsZW4pIHsKLSAgICAgIGxlbiA9IHN0cmxlbihhZGRyKTsKKyAgICBpZiAoc2Euc3NfZmFtaWx5ID09IEFGX0lORVQ2KSB7CisgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW42KiBzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luNiopKCZzYSk7CisgICAgICBpZiAoIWluZXRfbnRvcChBRl9JTkVUNiwgJnNpbi0+c2luNl9hZGRyLCBidWYsIGxlbikpIHsKKyAgICAgICAgcmV0dXJuIGVycm5vOworICAgICAgfQorICAgICAgKnBvcnQgPSBudG9ocyhzaW4tPnNpbjZfcG9ydCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiogc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiopKCZzYSk7CisgICAgICBpZiAoIWluZXRfbnRvcChBRl9JTkVULCAmc2luLT5zaW5fYWRkciwgYnVmLCBsZW4pKSB7CisgICAgICAgIHJldHVybiBlcnJubzsKKyAgICAgIH0KKyAgICAgICpwb3J0ID0gbnRvaHMoc2luLT5zaW5fcG9ydCk7CiAgICAgfQotICAgIG1lbWNweShidWYsIGFkZHIsIGxlbik7CiAgICAgcmV0dXJuIFNVQ0NFU1M7CiAgIH0KLSAgcmV0dXJuIHJjOworICByZXR1cm4gZXJybm87CiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkBAIC0xNjAsMjIgKzE3MCwyNSBAQAogICAgIGlmICgqY2xpZW50ID4gMCkgewogICAgICAgcmV0dXJuIFNVQ0NFU1M7CiAgICAgfQotICAgIGVyciA9IGVycm5vOwotICB9IHdoaWxlIChlcnIgIT0gRUlOVFIpOworICB9IHdoaWxlICgoZXJyID0gZXJybm8pID09IEVJTlRSKTsKKwogICBpZiAoZXJyID09IEVBR0FJTiB8fCBlcnIgPT0gRUNPTk5BQk9SVEVEKSB7CiAgICAgcmV0dXJuIHNvY2tldF93YWl0KHNvY2ssIFdBSVRfTU9ERV9SLCB0aW1lb3V0KTsKICAgfQorCiAgIHJldHVybiBlcnI7CiB9CiAKIFRfRVJSQ09ERSBzb2NrZXRfbGlzdGVuKHBfc29ja2V0IHNvY2ssIGludCBiYWNrbG9nKSB7Ci0gIGludCByZXQgPSBTVUNDRVNTOwotICBzb2NrZXRfc2V0YmxvY2tpbmcoc29jayk7CisgIGludCByZXQgPSBzb2NrZXRfc2V0YmxvY2tpbmcoc29jayk7CisgIGlmIChyZXQgIT0gU1VDQ0VTUykgeworICAgIHJldHVybiByZXQ7CisgIH0KICAgaWYgKGxpc3Rlbigqc29jaywgYmFja2xvZykpIHsKICAgICByZXQgPSBlcnJubzsKICAgfQotICBzb2NrZXRfc2V0bm9uYmxvY2tpbmcoc29jayk7Ci0gIHJldHVybiByZXQ7CisgIGludCByZXQyID0gc29ja2V0X3NldG5vbmJsb2NraW5nKHNvY2spOworICByZXR1cm4gcmV0ID09IFNVQ0NFU1MgPyByZXQyIDogcmV0OwogfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpAQCAtMjA5LDEyICsyMjIsMTIgQEAKICAgICBpZiAocHV0ID4gMCkgewogICAgICAgcmV0dXJuIFNVQ0NFU1M7CiAgICAgfQotICAgIGVyciA9IGVycm5vOwotICB9IHdoaWxlIChlcnIgIT0gRUlOVFIpOworICB9IHdoaWxlICgoZXJyID0gZXJybm8pID09IEVJTlRSKTsKIAogICBpZiAoZXJyID09IEVBR0FJTikgewogICAgIHJldHVybiBzb2NrZXRfd2FpdChzb2NrLCBXQUlUX01PREVfVywgdGltZW91dCk7CiAgIH0KKwogICByZXR1cm4gZXJyOwogfQogCkBAIC0yMjQsOCArMjM3LDggQEAKICAgaWYgKCpzb2NrIDwgMCkgewogICAgIHJldHVybiBDTE9TRUQ7CiAgIH0KKyAgKnJlY2VpdmVkID0gMDsKIAotICBpbnQgZmxhZ3MgPSBmY250bCgqc29jaywgRl9HRVRGTCwgMCk7CiAgIGRvIHsKICAgICBnb3QgPSByZWN2KCpzb2NrLCBkYXRhLCBsZW4sIDApOwogICAgIGlmIChnb3QgPiAwKSB7CkBAIC0yMzgsMjcgKzI1MSwyOCBAQAogICAgIGlmIChnb3QgPT0gMCkgewogICAgICAgcmV0dXJuIENMT1NFRDsKICAgICB9Ci0gIH0gd2hpbGUgKGVyciAhPSBFSU5UUik7CisgIH0gd2hpbGUgKGVyciA9PSBFSU5UUik7CiAKICAgaWYgKGVyciA9PSBFQUdBSU4pIHsKICAgICByZXR1cm4gc29ja2V0X3dhaXQoc29jaywgV0FJVF9NT0RFX1IsIHRpbWVvdXQpOwogICB9CisKICAgcmV0dXJuIGVycjsKIH0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vIFV0aWwKIAotdm9pZCBzb2NrZXRfc2V0bm9uYmxvY2tpbmcocF9zb2NrZXQgc29jaykgeworVF9FUlJDT0RFIHNvY2tldF9zZXRub25ibG9ja2luZyhwX3NvY2tldCBzb2NrKSB7CiAgIGludCBmbGFncyA9IGZjbnRsKCpzb2NrLCBGX0dFVEZMLCAwKTsKICAgZmxhZ3MgfD0gT19OT05CTE9DSzsKLSAgZmNudGwoKnNvY2ssIEZfU0VURkwsIGZsYWdzKTsKKyAgcmV0dXJuIGZjbnRsKCpzb2NrLCBGX1NFVEZMLCBmbGFncykgIT0gLTEgPyBTVUNDRVNTIDogZXJybm87CiB9CiAKLXZvaWQgc29ja2V0X3NldGJsb2NraW5nKHBfc29ja2V0IHNvY2spIHsKK1RfRVJSQ09ERSBzb2NrZXRfc2V0YmxvY2tpbmcocF9zb2NrZXQgc29jaykgewogICBpbnQgZmxhZ3MgPSBmY250bCgqc29jaywgRl9HRVRGTCwgMCk7CiAgIGZsYWdzICY9ICh+KE9fTk9OQkxPQ0spKTsKLSAgZmNudGwoKnNvY2ssIEZfU0VURkwsIGZsYWdzKTsKKyAgcmV0dXJuIGZjbnRsKCpzb2NrLCBGX1NFVEZMLCBmbGFncykgIT0gLTEgPyBTVUNDRVNTIDogZXJybm87CiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9NYWtlZmlsZS5hbSBiL2xpYi9uZXRjb3JlL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZjNmMzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQxIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworU1VCRElSUyA9IC4gCisKK2FsbC1sb2NhbDoKKwkkKERPVE5FVENPUkUpIGJ1aWxkCisKK2NoZWNrLWxvY2FsOgorCSQoRE9UTkVUQ09SRSkgdGVzdCBUZXN0cy9UaHJpZnQuVGVzdHMvVGhyaWZ0LlRlc3RzLmNzcHJvagorCSR7RE9UTkVUQ09SRX0gdGVzdCBUZXN0cy9UaHJpZnQuSW50ZWdyYXRpb25UZXN0cy9UaHJpZnQuSW50ZWdyYXRpb25UZXN0cy5jc3Byb2oKKworY2xlYW4tbG9jYWw6CisJJChSTSkgLXIgVGhyaWZ0L2JpbgorCSQoUk0pIC1yIFRocmlmdC9vYmoKKworRVhUUkFfRElTVCA9IFwKKwlSRUFETUUubWQgXAorCVRlc3RzIFwKKwlUaHJpZnQgXAorCVRocmlmdC5zbG4gXAorCWJ1aWxkLmNtZCBcCisJYnVpbGQuc2ggXAorCXJ1bnRlc3RzLmNtZCBcCisJcnVudGVzdHMuc2gKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1JFQURNRS5tZCBiL2xpYi9uZXRjb3JlL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGIwNDdmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMjQgQEAKKyMgQXBhY2hlIFRocmlmdCBuZXRjb3JlCisKK1RocmlmdCBjbGllbnQgbGlicmFyeSBwb3J0ZWQgdG8gTWljcm9zb2Z0IC5OZXQgQ29yZSAKKworIyBDb250ZW50CistIFRlc3RzL1RocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHMgLSBwcm9qZWN0IGZvciBjaGVja2luZyBwdWJsaWMgaW50ZXJmYWNlcyBkdXJpbmcgYWRkaW5nIGNoYW5nZXMgdG8gVGhyaWZ0IGxpYnJhcnkKKy0gVGhyaWZ0IC0gVGhyaWZ0IGxpYnJhcnkgCisKKyMgUmV1c2VkIGNvbXBvbmVudHMgCistIC5ORVQgU3RhbmRhcmQgMS42IChTREsgMi4wLjApCisKKyMgSG93IHRvIGJ1aWxkIG9uIFdpbmRvd3MKKy0gR2V0IFRocmlmdCBJREwgY29tcGlsZXIgZXhlY3V0YWJsZSwgYWRkIHRvIHNvbWUgZm9sZGVyIGFuZCBhZGQgcGF0aCB0byB0aGlzIGZvbGRlciBpbnRvIFBBVEggdmFyaWFibGUKKy0gT3BlbiB0aGUgVGhyaWZ0LnNsbiBwcm9qZWN0IHdpdGggVmlzdWFsIFN0dWRpbyBhbmQgYnVpbGQuCitvciAKKy0gQnVpbGQgd2l0aCBzY3JpcHRzCisKKyMgSG93IHRvIGJ1aWxkIG9uIFVuaXgKKy0gRW5zdXJlIHlvdSBoYXZlIC5ORVQgQ29yZSAyLjAuMCBTREsgaW5zdGFsbGVkIG9yIHVzZSB0aGUgVWJ1bnR1IFhlbmlhbCBkb2NrZXIgaW1hZ2UKKy0gRm9sbG93IGNvbW1vbiBidWlsZCBwcmFjdGljZSBmb3IgVGhyaWZ0OiBib290c3RyYXAsIGNvbmZpZ3VyZSwgYW5kIG1ha2UKKworIyBLbm93biBpc3N1ZXMKKy0gSW4gdHJhY2UgbG9nZ2luZyBtb2RlIHlvdSBjYW4gc2VlIHNvbWUgbm90IGltcG9ydGFudCBpbnRlcm5hbCBleGNlcHRpb25zCisKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5JbnRlZ3JhdGlvblRlc3RzLy5naXRpZ25vcmUgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuSW50ZWdyYXRpb25UZXN0cy8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNTRjMzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuSW50ZWdyYXRpb25UZXN0cy8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsMiBAQAorIyBpZ25vcmUgZm9yIGF1dG9nZW5lcmF0ZWQgZmlsZXMKKy9BcGFjaGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5JbnRlZ3JhdGlvblRlc3RzL1Byb3RvY29scy9Qcm90b2NvbHNPcGVyYXRpb25zVGVzdHMuY3MgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuSW50ZWdyYXRpb25UZXN0cy9Qcm90b2NvbHMvUHJvdG9jb2xzT3BlcmF0aW9uc1Rlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNGFmYTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuSW50ZWdyYXRpb25UZXN0cy9Qcm90b2NvbHMvUHJvdG9jb2xzT3BlcmF0aW9uc1Rlc3RzLmNzCkBAIC0wLDAgKzEsNTAyIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBLZWxsZXJtYW5Tb2Z0d2FyZS5Db21wYXJlTmV0T2JqZWN0czsKK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwordXNpbmcgVGhyaWZ0LlByb3RvY29sczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHMuRW50aXRpZXM7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0cy5DbGllbnQ7CisKK25hbWVzcGFjZSBUaHJpZnQuSW50ZWdyYXRpb25UZXN0cy5Qcm90b2NvbHMKK3sKKyAgICBbVGVzdENsYXNzXQorICAgIHB1YmxpYyBjbGFzcyBQcm90b2NvbHNPcGVyYXRpb25zVGVzdHMKKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgQ29tcGFyZUxvZ2ljIF9jb21wYXJlTG9naWMgPSBuZXcgQ29tcGFyZUxvZ2ljKCk7CisKKyAgICAgICAgW0RhdGFUZXN0TWV0aG9kXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEJpbmFyeVByb3RvY29sKSwgVE1lc3NhZ2VUeXBlLkNhbGwpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEJpbmFyeVByb3RvY29sKSwgVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbildCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQmluYXJ5UHJvdG9jb2wpLCBUTWVzc2FnZVR5cGUuT25ld2F5KV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRCaW5hcnlQcm90b2NvbCksIFRNZXNzYWdlVHlwZS5SZXBseSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQ29tcGFjdFByb3RvY29sKSwgVE1lc3NhZ2VUeXBlLkNhbGwpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVENvbXBhY3RQcm90b2NvbCksIFRNZXNzYWdlVHlwZS5FeGNlcHRpb24pXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVENvbXBhY3RQcm90b2NvbCksIFRNZXNzYWdlVHlwZS5PbmV3YXkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVENvbXBhY3RQcm90b2NvbCksIFRNZXNzYWdlVHlwZS5SZXBseSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUSnNvblByb3RvY29sKSwgVE1lc3NhZ2VUeXBlLkNhbGwpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEpzb25Qcm90b2NvbCksIFRNZXNzYWdlVHlwZS5FeGNlcHRpb24pXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEpzb25Qcm90b2NvbCksIFRNZXNzYWdlVHlwZS5PbmV3YXkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEpzb25Qcm90b2NvbCksIFRNZXNzYWdlVHlwZS5SZXBseSldCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIFdyaXRlUmVhZE1lc3NhZ2VfVGVzdChUeXBlIHByb3RvY29sVHlwZSwgVE1lc3NhZ2VUeXBlIG1lc3NhZ2VUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWQgPSBuZXcgVE1lc3NhZ2UobmFtZW9mKFRNZXNzYWdlKSwgbWVzc2FnZVR5cGUsIDEpOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdHVwbGUgPSBHZXRQcm90b2NvbEluc3RhbmNlKHByb3RvY29sVHlwZSk7CisgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBzdHJlYW0gPSB0dXBsZS5JdGVtMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBwcm90b2NvbCA9IHR1cGxlLkl0ZW0yOworCisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLldyaXRlTWVzc2FnZUJlZ2luQXN5bmMoZXhwZWN0ZWQpOworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZU1lc3NhZ2VFbmRBc3luYygpOworCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOworCisgICAgICAgICAgICAgICAgICAgIHZhciBhY3R1YWxNZXNzYWdlID0gYXdhaXQgcHJvdG9jb2wuUmVhZE1lc3NhZ2VCZWdpbkFzeW5jKCk7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLlJlYWRNZXNzYWdlRW5kQXN5bmMoKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2NvbXBhcmVMb2dpYy5Db21wYXJlKGV4cGVjdGVkLCBhY3R1YWxNZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQuQXJlRXF1YWwsIHJlc3VsdC5EaWZmZXJlbmNlc1N0cmluZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJCJFeGNlcHRpb24gZHVyaW5nIHRlc3Rpbmcgb2YgcHJvdG9jb2w6IHtwcm90b2NvbFR5cGUuRnVsbE5hbWV9IiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbRGF0YVRlc3RNZXRob2RdCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQmluYXJ5UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRDb21wYWN0UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRKc29uUHJvdG9jb2wpKV0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihFeGNlcHRpb24pKV0KKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgV3JpdGVSZWFkU3RydWN0X1Rlc3QoVHlwZSBwcm90b2NvbFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleHBlY3RlZCA9IG5ldyBUU3RydWN0KG5hbWVvZihUU3RydWN0KSk7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB0dXBsZSA9IEdldFByb3RvY29sSW5zdGFuY2UocHJvdG9jb2xUeXBlKTsKKyAgICAgICAgICAgICAgICB1c2luZyAodmFyIHN0cmVhbSA9IHR1cGxlLkl0ZW0xKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHByb3RvY29sID0gdHVwbGUuSXRlbTI7CisKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuV3JpdGVTdHJ1Y3RCZWdpbkFzeW5jKGV4cGVjdGVkKTsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuV3JpdGVTdHJ1Y3RFbmRBc3luYygpOworCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbT8uU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgYWN0dWFsID0gYXdhaXQgcHJvdG9jb2wuUmVhZFN0cnVjdEJlZ2luQXN5bmMoKTsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuUmVhZFN0cnVjdEVuZEFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9jb21wYXJlTG9naWMuQ29tcGFyZShleHBlY3RlZCwgYWN0dWFsKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQuQXJlRXF1YWwsIHJlc3VsdC5EaWZmZXJlbmNlc1N0cmluZyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigkIkV4Y2VwdGlvbiBkdXJpbmcgdGVzdGluZyBvZiBwcm90b2NvbDoge3Byb3RvY29sVHlwZS5GdWxsTmFtZX0iLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtEYXRhVGVzdE1ldGhvZF0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRCaW5hcnlQcm90b2NvbCkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVENvbXBhY3RQcm90b2NvbCkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEpzb25Qcm90b2NvbCkpXQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEV4Y2VwdGlvbikpXQorICAgICAgICBwdWJsaWMgYXN5bmMgVGFzayBXcml0ZVJlYWRGaWVsZF9UZXN0KFR5cGUgcHJvdG9jb2xUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWQgPSBuZXcgVEZpZWxkKG5hbWVvZihURmllbGQpLCBUVHlwZS5TdHJpbmcsIDEpOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdHVwbGUgPSBHZXRQcm90b2NvbEluc3RhbmNlKHByb3RvY29sVHlwZSk7CisgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBzdHJlYW0gPSB0dXBsZS5JdGVtMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBwcm90b2NvbCA9IHR1cGxlLkl0ZW0yOworCisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLldyaXRlRmllbGRCZWdpbkFzeW5jKGV4cGVjdGVkKTsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuV3JpdGVGaWVsZEVuZEFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtPy5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOworCisgICAgICAgICAgICAgICAgICAgIHZhciBhY3R1YWwgPSBhd2FpdCBwcm90b2NvbC5SZWFkRmllbGRCZWdpbkFzeW5jKCk7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLlJlYWRGaWVsZEVuZEFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9jb21wYXJlTG9naWMuQ29tcGFyZShleHBlY3RlZCwgYWN0dWFsKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQuQXJlRXF1YWwsIHJlc3VsdC5EaWZmZXJlbmNlc1N0cmluZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJCJFeGNlcHRpb24gZHVyaW5nIHRlc3Rpbmcgb2YgcHJvdG9jb2w6IHtwcm90b2NvbFR5cGUuRnVsbE5hbWV9IiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbRGF0YVRlc3RNZXRob2RdCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQmluYXJ5UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRDb21wYWN0UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRKc29uUHJvdG9jb2wpKV0KKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgV3JpdGVSZWFkTWFwX1Rlc3QoVHlwZSBwcm90b2NvbFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleHBlY3RlZCA9IG5ldyBUTWFwKFRUeXBlLlN0cmluZywgVFR5cGUuU3RyaW5nLCAxKTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHR1cGxlID0gR2V0UHJvdG9jb2xJbnN0YW5jZShwcm90b2NvbFR5cGUpOworICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgc3RyZWFtID0gdHVwbGUuSXRlbTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcHJvdG9jb2wgPSB0dXBsZS5JdGVtMjsKKworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZU1hcEJlZ2luQXN5bmMoZXhwZWN0ZWQpOworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZU1hcEVuZEFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtPy5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOworCisgICAgICAgICAgICAgICAgICAgIHZhciBhY3R1YWwgPSBhd2FpdCBwcm90b2NvbC5SZWFkTWFwQmVnaW5Bc3luYygpOworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5SZWFkTWFwRW5kQXN5bmMoKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2NvbXBhcmVMb2dpYy5Db21wYXJlKGV4cGVjdGVkLCBhY3R1YWwpOworICAgICAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdC5BcmVFcXVhbCwgcmVzdWx0LkRpZmZlcmVuY2VzU3RyaW5nKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigkIkV4Y2VwdGlvbiBkdXJpbmcgdGVzdGluZyBvZiBwcm90b2NvbDoge3Byb3RvY29sVHlwZS5GdWxsTmFtZX0iLCBlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgW0RhdGFUZXN0TWV0aG9kXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEJpbmFyeVByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQ29tcGFjdFByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUSnNvblByb3RvY29sKSldCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIFdyaXRlUmVhZExpc3RfVGVzdChUeXBlIHByb3RvY29sVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGV4cGVjdGVkID0gbmV3IFRMaXN0KFRUeXBlLlN0cmluZywgMSk7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB0dXBsZSA9IEdldFByb3RvY29sSW5zdGFuY2UocHJvdG9jb2xUeXBlKTsKKyAgICAgICAgICAgICAgICB1c2luZyAodmFyIHN0cmVhbSA9IHR1cGxlLkl0ZW0xKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHByb3RvY29sID0gdHVwbGUuSXRlbTI7CisKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuV3JpdGVMaXN0QmVnaW5Bc3luYyhleHBlY3RlZCk7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLldyaXRlTGlzdEVuZEFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtPy5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOworCisgICAgICAgICAgICAgICAgICAgIHZhciBhY3R1YWwgPSBhd2FpdCBwcm90b2NvbC5SZWFkTGlzdEJlZ2luQXN5bmMoKTsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuUmVhZExpc3RFbmRBc3luYygpOworCisgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBfY29tcGFyZUxvZ2ljLkNvbXBhcmUoZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0LkFyZUVxdWFsLCByZXN1bHQuRGlmZmVyZW5jZXNTdHJpbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCQiRXhjZXB0aW9uIGR1cmluZyB0ZXN0aW5nIG9mIHByb3RvY29sOiB7cHJvdG9jb2xUeXBlLkZ1bGxOYW1lfSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW0RhdGFUZXN0TWV0aG9kXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEJpbmFyeVByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQ29tcGFjdFByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUSnNvblByb3RvY29sKSldCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIFdyaXRlUmVhZFNldF9UZXN0KFR5cGUgcHJvdG9jb2xUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWQgPSBuZXcgVFNldChUVHlwZS5TdHJpbmcsIDEpOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdHVwbGUgPSBHZXRQcm90b2NvbEluc3RhbmNlKHByb3RvY29sVHlwZSk7CisgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBzdHJlYW0gPSB0dXBsZS5JdGVtMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBwcm90b2NvbCA9IHR1cGxlLkl0ZW0yOworCisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLldyaXRlU2V0QmVnaW5Bc3luYyhleHBlY3RlZCk7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLldyaXRlU2V0RW5kQXN5bmMoKTsKKworICAgICAgICAgICAgICAgICAgICBzdHJlYW0/LlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGFjdHVhbCA9IGF3YWl0IHByb3RvY29sLlJlYWRTZXRCZWdpbkFzeW5jKCk7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLlJlYWRTZXRFbmRBc3luYygpOworCisgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBfY29tcGFyZUxvZ2ljLkNvbXBhcmUoZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0LkFyZUVxdWFsLCByZXN1bHQuRGlmZmVyZW5jZXNTdHJpbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCQiRXhjZXB0aW9uIGR1cmluZyB0ZXN0aW5nIG9mIHByb3RvY29sOiB7cHJvdG9jb2xUeXBlLkZ1bGxOYW1lfSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW0RhdGFUZXN0TWV0aG9kXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEJpbmFyeVByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQ29tcGFjdFByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUSnNvblByb3RvY29sKSldCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIFdyaXRlUmVhZEJvb2xfVGVzdChUeXBlIHByb3RvY29sVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGV4cGVjdGVkID0gdHJ1ZTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHR1cGxlID0gR2V0UHJvdG9jb2xJbnN0YW5jZShwcm90b2NvbFR5cGUpOworICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgc3RyZWFtID0gdHVwbGUuSXRlbTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcHJvdG9jb2wgPSB0dXBsZS5JdGVtMjsKKworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZUJvb2xBc3luYyhleHBlY3RlZCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtPy5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOworCisgICAgICAgICAgICAgICAgICAgIHZhciBhY3R1YWwgPSBhd2FpdCBwcm90b2NvbC5SZWFkQm9vbEFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9jb21wYXJlTG9naWMuQ29tcGFyZShleHBlY3RlZCwgYWN0dWFsKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQuQXJlRXF1YWwsIHJlc3VsdC5EaWZmZXJlbmNlc1N0cmluZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJCJFeGNlcHRpb24gZHVyaW5nIHRlc3Rpbmcgb2YgcHJvdG9jb2w6IHtwcm90b2NvbFR5cGUuRnVsbE5hbWV9IiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbRGF0YVRlc3RNZXRob2RdCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQmluYXJ5UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRDb21wYWN0UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRKc29uUHJvdG9jb2wpKV0KKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgV3JpdGVSZWFkQnl0ZV9UZXN0KFR5cGUgcHJvdG9jb2xUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWQgPSBzYnl0ZS5NYXhWYWx1ZTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHR1cGxlID0gR2V0UHJvdG9jb2xJbnN0YW5jZShwcm90b2NvbFR5cGUpOworICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgc3RyZWFtID0gdHVwbGUuSXRlbTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcHJvdG9jb2wgPSB0dXBsZS5JdGVtMjsKKworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZUJ5dGVBc3luYyhleHBlY3RlZCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtPy5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOworCisgICAgICAgICAgICAgICAgICAgIHZhciBhY3R1YWwgPSBhd2FpdCBwcm90b2NvbC5SZWFkQnl0ZUFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9jb21wYXJlTG9naWMuQ29tcGFyZShleHBlY3RlZCwgYWN0dWFsKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQuQXJlRXF1YWwsIHJlc3VsdC5EaWZmZXJlbmNlc1N0cmluZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJCJFeGNlcHRpb24gZHVyaW5nIHRlc3Rpbmcgb2YgcHJvdG9jb2w6IHtwcm90b2NvbFR5cGUuRnVsbE5hbWV9IiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbRGF0YVRlc3RNZXRob2RdCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQmluYXJ5UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRDb21wYWN0UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRKc29uUHJvdG9jb2wpKV0KKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgV3JpdGVSZWFkSTE2X1Rlc3QoVHlwZSBwcm90b2NvbFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleHBlY3RlZCA9IHNob3J0Lk1heFZhbHVlOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdHVwbGUgPSBHZXRQcm90b2NvbEluc3RhbmNlKHByb3RvY29sVHlwZSk7CisgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBzdHJlYW0gPSB0dXBsZS5JdGVtMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBwcm90b2NvbCA9IHR1cGxlLkl0ZW0yOworCisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLldyaXRlSTE2QXN5bmMoZXhwZWN0ZWQpOworCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbT8uU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgYWN0dWFsID0gYXdhaXQgcHJvdG9jb2wuUmVhZEkxNkFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9jb21wYXJlTG9naWMuQ29tcGFyZShleHBlY3RlZCwgYWN0dWFsKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQuQXJlRXF1YWwsIHJlc3VsdC5EaWZmZXJlbmNlc1N0cmluZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJCJFeGNlcHRpb24gZHVyaW5nIHRlc3Rpbmcgb2YgcHJvdG9jb2w6IHtwcm90b2NvbFR5cGUuRnVsbE5hbWV9IiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbRGF0YVRlc3RNZXRob2RdCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQmluYXJ5UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRDb21wYWN0UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRKc29uUHJvdG9jb2wpKV0KKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgV3JpdGVSZWFkSTMyX1Rlc3QoVHlwZSBwcm90b2NvbFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleHBlY3RlZCA9IGludC5NYXhWYWx1ZTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHR1cGxlID0gR2V0UHJvdG9jb2xJbnN0YW5jZShwcm90b2NvbFR5cGUpOworICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgc3RyZWFtID0gdHVwbGUuSXRlbTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcHJvdG9jb2wgPSB0dXBsZS5JdGVtMjsKKworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZUkzMkFzeW5jKGV4cGVjdGVkKTsKKworICAgICAgICAgICAgICAgICAgICBzdHJlYW0/LlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGFjdHVhbCA9IGF3YWl0IHByb3RvY29sLlJlYWRJMzJBc3luYygpOworCisgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBfY29tcGFyZUxvZ2ljLkNvbXBhcmUoZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0LkFyZUVxdWFsLCByZXN1bHQuRGlmZmVyZW5jZXNTdHJpbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCQiRXhjZXB0aW9uIGR1cmluZyB0ZXN0aW5nIG9mIHByb3RvY29sOiB7cHJvdG9jb2xUeXBlLkZ1bGxOYW1lfSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW0RhdGFUZXN0TWV0aG9kXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEJpbmFyeVByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQ29tcGFjdFByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUSnNvblByb3RvY29sKSldCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIFdyaXRlUmVhZEk2NF9UZXN0KFR5cGUgcHJvdG9jb2xUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWQgPSBsb25nLk1heFZhbHVlOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdHVwbGUgPSBHZXRQcm90b2NvbEluc3RhbmNlKHByb3RvY29sVHlwZSk7CisgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBzdHJlYW0gPSB0dXBsZS5JdGVtMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBwcm90b2NvbCA9IHR1cGxlLkl0ZW0yOworCisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLldyaXRlSTY0QXN5bmMoZXhwZWN0ZWQpOworCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbT8uU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgYWN0dWFsID0gYXdhaXQgcHJvdG9jb2wuUmVhZEk2NEFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9jb21wYXJlTG9naWMuQ29tcGFyZShleHBlY3RlZCwgYWN0dWFsKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQuQXJlRXF1YWwsIHJlc3VsdC5EaWZmZXJlbmNlc1N0cmluZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJCJFeGNlcHRpb24gZHVyaW5nIHRlc3Rpbmcgb2YgcHJvdG9jb2w6IHtwcm90b2NvbFR5cGUuRnVsbE5hbWV9IiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbRGF0YVRlc3RNZXRob2RdCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQmluYXJ5UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRDb21wYWN0UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRKc29uUHJvdG9jb2wpKV0KKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgV3JpdGVSZWFkRG91YmxlX1Rlc3QoVHlwZSBwcm90b2NvbFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleHBlY3RlZCA9IGRvdWJsZS5NYXhWYWx1ZTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHR1cGxlID0gR2V0UHJvdG9jb2xJbnN0YW5jZShwcm90b2NvbFR5cGUpOworICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgc3RyZWFtID0gdHVwbGUuSXRlbTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcHJvdG9jb2wgPSB0dXBsZS5JdGVtMjsKKworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZURvdWJsZUFzeW5jKGV4cGVjdGVkKTsKKworICAgICAgICAgICAgICAgICAgICBzdHJlYW0/LlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGFjdHVhbCA9IGF3YWl0IHByb3RvY29sLlJlYWREb3VibGVBc3luYygpOworCisgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBfY29tcGFyZUxvZ2ljLkNvbXBhcmUoZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0LkFyZUVxdWFsLCByZXN1bHQuRGlmZmVyZW5jZXNTdHJpbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCQiRXhjZXB0aW9uIGR1cmluZyB0ZXN0aW5nIG9mIHByb3RvY29sOiB7cHJvdG9jb2xUeXBlLkZ1bGxOYW1lfSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW0RhdGFUZXN0TWV0aG9kXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEJpbmFyeVByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQ29tcGFjdFByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUSnNvblByb3RvY29sKSldCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIFdyaXRlUmVhZFN0cmluZ19UZXN0KFR5cGUgcHJvdG9jb2xUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWQgPSBuYW1lb2YoU3RyaW5nKTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHR1cGxlID0gR2V0UHJvdG9jb2xJbnN0YW5jZShwcm90b2NvbFR5cGUpOworICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgc3RyZWFtID0gdHVwbGUuSXRlbTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcHJvdG9jb2wgPSB0dXBsZS5JdGVtMjsKKworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZVN0cmluZ0FzeW5jKGV4cGVjdGVkKTsKKworICAgICAgICAgICAgICAgICAgICBzdHJlYW0/LlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGFjdHVhbCA9IGF3YWl0IHByb3RvY29sLlJlYWRTdHJpbmdBc3luYygpOworCisgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBfY29tcGFyZUxvZ2ljLkNvbXBhcmUoZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0LkFyZUVxdWFsLCByZXN1bHQuRGlmZmVyZW5jZXNTdHJpbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCQiRXhjZXB0aW9uIGR1cmluZyB0ZXN0aW5nIG9mIHByb3RvY29sOiB7cHJvdG9jb2xUeXBlLkZ1bGxOYW1lfSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW0RhdGFUZXN0TWV0aG9kXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEJpbmFyeVByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQ29tcGFjdFByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUSnNvblByb3RvY29sKSldCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIFdyaXRlUmVhZEJpbmFyeV9UZXN0KFR5cGUgcHJvdG9jb2xUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWQgPSBFbmNvZGluZy5VVEY4LkdldEJ5dGVzKG5hbWVvZihTdHJpbmcpKTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHR1cGxlID0gR2V0UHJvdG9jb2xJbnN0YW5jZShwcm90b2NvbFR5cGUpOworICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgc3RyZWFtID0gdHVwbGUuSXRlbTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcHJvdG9jb2wgPSB0dXBsZS5JdGVtMjsKKworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZUJpbmFyeUFzeW5jKGV4cGVjdGVkKTsKKworICAgICAgICAgICAgICAgICAgICBzdHJlYW0/LlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGFjdHVhbCA9IGF3YWl0IHByb3RvY29sLlJlYWRCaW5hcnlBc3luYygpOworCisgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBfY29tcGFyZUxvZ2ljLkNvbXBhcmUoZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0LkFyZUVxdWFsLCByZXN1bHQuRGlmZmVyZW5jZXNTdHJpbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCQiRXhjZXB0aW9uIGR1cmluZyB0ZXN0aW5nIG9mIHByb3RvY29sOiB7cHJvdG9jb2xUeXBlLkZ1bGxOYW1lfSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgVHVwbGU8U3RyZWFtLCBUUHJvdG9jb2w+IEdldFByb3RvY29sSW5zdGFuY2UoVHlwZSBwcm90b2NvbFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBtZW1vcnlTdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCk7CisgICAgICAgICAgICB2YXIgc3RyZWFtQ2xpZW50VHJhbnNwb3J0ID0gbmV3IFRTdHJlYW1DbGllbnRUcmFuc3BvcnQobWVtb3J5U3RyZWFtLCBtZW1vcnlTdHJlYW0pOworICAgICAgICAgICAgdmFyIHByb3RvY29sID0gKFRQcm90b2NvbCkgQWN0aXZhdG9yLkNyZWF0ZUluc3RhbmNlKHByb3RvY29sVHlwZSwgc3RyZWFtQ2xpZW50VHJhbnNwb3J0KTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVHVwbGU8U3RyZWFtLCBUUHJvdG9jb2w+KG1lbW9yeVN0cmVhbSwgcHJvdG9jb2wpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LkludGVncmF0aW9uVGVzdHMvVGhyaWZ0LkludGVncmF0aW9uVGVzdHMuY3Nwcm9qIGIvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LkludGVncmF0aW9uVGVzdHMvVGhyaWZ0LkludGVncmF0aW9uVGVzdHMuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNWRhYzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuSW50ZWdyYXRpb25UZXN0cy9UaHJpZnQuSW50ZWdyYXRpb25UZXN0cy5jc3Byb2oKQEAgLTAsMCArMSwyOSBAQAor77u/PFByb2plY3QgU2RrPSJNaWNyb3NvZnQuTkVULlNkayI+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxUYXJnZXRGcmFtZXdvcms+bmV0Y29yZWFwcDIuMDwvVGFyZ2V0RnJhbWV3b3JrPgorICAgIDxBc3NlbWJseU5hbWU+VGhyaWZ0LkludGVncmF0aW9uVGVzdHM8L0Fzc2VtYmx5TmFtZT4KKyAgICA8UGFja2FnZUlkPlRocmlmdC5JbnRlZ3JhdGlvblRlc3RzPC9QYWNrYWdlSWQ+CisgICAgPE91dHB1dFR5cGU+RXhlPC9PdXRwdXRUeXBlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5VGl0bGVBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlUaXRsZUF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseURlc2NyaXB0aW9uQXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5RGVzY3JpcHRpb25BdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb25maWd1cmF0aW9uQXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29uZmlndXJhdGlvbkF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvbXBhbnlBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb21wYW55QXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5UHJvZHVjdEF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseVByb2R1Y3RBdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb3B5cmlnaHRBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb3B5cmlnaHRBdHRyaWJ1dGU+CisgIDwvUHJvcGVydHlHcm91cD4KKworICA8SXRlbUdyb3VwPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9IkNvbXBhcmVORVRPYmplY3RzIiBWZXJzaW9uPSI0LjMuMCIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuTkVULlRlc3QuU2RrIiBWZXJzaW9uPSIxNS41LjAiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iTVNUZXN0LlRlc3RBZGFwdGVyIiBWZXJzaW9uPSIxLjIuMCIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJNU1Rlc3QuVGVzdEZyYW1ld29yayIgVmVyc2lvbj0iMS4yLjAiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlNlcnZpY2VNb2RlbC5QcmltaXRpdmVzIiBWZXJzaW9uPSI0LjQuMCIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cVGhyaWZ0XFRocmlmdC5jc3Byb2oiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxTZXJ2aWNlIEluY2x1ZGU9Ins4MmE3ZjQ4ZC0zYjUwLTRiMWUtYjgyZS0zYWRhODIxMGMzNTh9IiAvPgorICA8L0l0ZW1Hcm91cD4KKworPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHMvLmdpdGlnbm9yZSBiL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHMvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTkyOWEzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LlB1YmxpY0ludGVyZmFjZXMuQ29tcGlsZS5UZXN0cy8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsNCBAQAorIyBpZ25vcmUgZm9yIGF1dG9nZW5lcmF0ZWQgZmlsZXMKKy9UaHJpZnRUZXN0CisvQXBhY2hlCisvRmFjZWJvb2sKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHMvQ2Fzc2FuZHJhVGVzdC50aHJpZnQgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuUHVibGljSW50ZXJmYWNlcy5Db21waWxlLlRlc3RzL0Nhc3NhbmRyYVRlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiOTI3MjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuUHVibGljSW50ZXJmYWNlcy5Db21waWxlLlRlc3RzL0Nhc3NhbmRyYVRlc3QudGhyaWZ0CkBAIC0wLDAgKzEsNzA1IEBACisjIS91c3IvbG9jYWwvYmluL3RocmlmdCAtLWphdmEgLS1waHAgLS1weQorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKyMgKioqIFBMRUFTRSBSRU1FTUJFUiBUTyBFRElUIFRIRSBWRVJTSU9OIENPTlNUQU5UIFdIRU4gTUFLSU5HIENIQU5HRVMgKioqCisjIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCisjCisjIEludGVyZmFjZSBkZWZpbml0aW9uIGZvciBDYXNzYW5kcmEgU2VydmljZQorIworCituYW1lc3BhY2UgbmV0Y29yZSBBcGFjaGUuQ2Fzc2FuZHJhLlRlc3QKKworIyBUaHJpZnQucmIgaGFzIGEgYnVnIHdoZXJlIHRvcC1sZXZlbCBtb2R1bGVzIHRoYXQgaW5jbHVkZSBtb2R1bGVzIAorIyB3aXRoIHRoZSBzYW1lIG5hbWUgYXJlIG5vdCBwcm9wZXJseSByZWZlcmVuY2VkLCBzbyB3ZSBjYW4ndCBkbworIyBDYXNzYW5kcmE6OkNhc3NhbmRyYTo6Q2xpZW50LgorbmFtZXNwYWNlIHJiIENhc3NhbmRyYVRocmlmdAorCisjIFRoZSBBUEkgdmVyc2lvbiAoTk9UIHRoZSBwcm9kdWN0IHZlcnNpb24pLCBjb21wb3NlZCBhcyBhIGRvdCBkZWxpbWl0ZWQKKyMgc3RyaW5nIHdpdGggbWFqb3IsIG1pbm9yLCBhbmQgcGF0Y2ggbGV2ZWwgY29tcG9uZW50cy4KKyMKKyMgIC0gTWFqb3I6IEluY3JlbWVudGVkIGZvciBiYWNrd2FyZCBpbmNvbXBhdGlibGUgY2hhbmdlcy4gQW4gZXhhbXBsZSB3b3VsZAorIyAgICAgICAgICAgYmUgY2hhbmdlcyB0byB0aGUgbnVtYmVyIG9yIGRpc3Bvc2l0aW9uIG9mIG1ldGhvZCBhcmd1bWVudHMuCisjICAtIE1pbm9yOiBJbmNyZW1lbnRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJsZSBjaGFuZ2VzLiBBbiBleGFtcGxlIHdvdWxkCisjICAgICAgICAgICBiZSB0aGUgYWRkaXRpb24gb2YgYSBuZXcgKG9wdGlvbmFsKSBtZXRob2QuCisjICAtIFBhdGNoOiBJbmNyZW1lbnRlZCBmb3IgYnVnIGZpeGVzLiBUaGUgcGF0Y2ggbGV2ZWwgc2hvdWxkIGJlIGluY3JlYXNlZAorIyAgICAgICAgICAgZm9yIGV2ZXJ5IGVkaXQgdGhhdCBkb2Vzbid0IHJlc3VsdCBpbiBhIGNoYW5nZSB0byBtYWpvci9taW5vci4KKyMKKyMgU2VlIHRoZSBTZW1hbnRpYyBWZXJzaW9uaW5nIFNwZWNpZmljYXRpb24gKFNlbVZlcikgaHR0cDovL3NlbXZlci5vcmcuCitjb25zdCBzdHJpbmcgVkVSU0lPTiA9ICIxOS4yNC4wIgorCisKKyMKKyMgZGF0YSBzdHJ1Y3R1cmVzCisjCisKKy8qKiBCYXNpYyB1bml0IG9mIGRhdGEgd2l0aGluIGEgQ29sdW1uRmFtaWx5LgorICogQHBhcmFtIG5hbWUsIHRoZSBuYW1lIGJ5IHdoaWNoIHRoaXMgY29sdW1uIGlzIHNldCBhbmQgcmV0cmlldmVkLiAgTWF4aW11bSA2NEtCIGxvbmcuCisgKiBAcGFyYW0gdmFsdWUuIFRoZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmFtZS4gIE1heGltdW0gMkdCIGxvbmcsIGJ1dCBpbiBwcmFjdGljZSB5b3Ugc2hvdWxkIGxpbWl0IGl0IHRvIHNtYWxsIG51bWJlcnMgb2YgTUIgKHNpbmNlIFRocmlmdCBtdXN0IHJlYWQgdGhlIGZ1bGwgdmFsdWUgaW50byBtZW1vcnkgdG8gb3BlcmF0ZSBvbiBpdCkuCisgKiBAcGFyYW0gdGltZXN0YW1wLiBUaGUgdGltZXN0YW1wIGlzIHVzZWQgZm9yIGNvbmZsaWN0IGRldGVjdGlvbi9yZXNvbHV0aW9uIHdoZW4gdHdvIGNvbHVtbnMgd2l0aCBzYW1lIG5hbWUgbmVlZCB0byBiZSBjb21wYXJlZC4KKyAqIEBwYXJhbSB0dGwuIEFuIG9wdGlvbmFsLCBwb3NpdGl2ZSBkZWxheSAoaW4gc2Vjb25kcykgYWZ0ZXIgd2hpY2ggdGhlIGNvbHVtbiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZGVsZXRlZC4gCisgKi8KK3N0cnVjdCBDb2x1bW4geworICAgMTogcmVxdWlyZWQgYmluYXJ5IG5hbWUsCisgICAyOiBvcHRpb25hbCBiaW5hcnkgdmFsdWUsCisgICAzOiBvcHRpb25hbCBpNjQgdGltZXN0YW1wLAorICAgNDogb3B0aW9uYWwgaTMyIHR0bCwKK30KKworLyoqIEEgbmFtZWQgbGlzdCBvZiBjb2x1bW5zLgorICogQHBhcmFtIG5hbWUuIHNlZSBDb2x1bW4ubmFtZS4KKyAqIEBwYXJhbSBjb2x1bW5zLiBBIGNvbGxlY3Rpb24gb2Ygc3RhbmRhcmQgQ29sdW1ucy4gIFRoZSBjb2x1bW5zIHdpdGhpbiBhIHN1cGVyIGNvbHVtbiBhcmUgZGVmaW5lZCBpbiBhbiBhZGhvYyBtYW5uZXIuCisgKiAgICAgICAgICAgICAgICAgQ29sdW1ucyB3aXRoaW4gYSBzdXBlciBjb2x1bW4gZG8gbm90IGhhdmUgdG8gaGF2ZSBtYXRjaGluZyBzdHJ1Y3R1cmVzIChzaW1pbGFybHkgbmFtZWQgY2hpbGQgY29sdW1ucykuCisgKi8KK3N0cnVjdCBTdXBlckNvbHVtbiB7CisgICAxOiByZXF1aXJlZCBiaW5hcnkgbmFtZSwKKyAgIDI6IHJlcXVpcmVkIGxpc3Q8Q29sdW1uPiBjb2x1bW5zLAorfQorCitzdHJ1Y3QgQ291bnRlckNvbHVtbiB7CisgICAgMTogcmVxdWlyZWQgYmluYXJ5IG5hbWUsCisgICAgMjogcmVxdWlyZWQgaTY0IHZhbHVlCit9CisKK3N0cnVjdCBDb3VudGVyU3VwZXJDb2x1bW4geworICAgIDE6IHJlcXVpcmVkIGJpbmFyeSBuYW1lLAorICAgIDI6IHJlcXVpcmVkIGxpc3Q8Q291bnRlckNvbHVtbj4gY29sdW1ucworfQorCisvKioKKyAgICBNZXRob2RzIGZvciBmZXRjaGluZyByb3dzL3JlY29yZHMgZnJvbSBDYXNzYW5kcmEgd2lsbCByZXR1cm4gZWl0aGVyIGEgc2luZ2xlIGluc3RhbmNlIG9mIENvbHVtbk9yU3VwZXJDb2x1bW4gb3IgYSBsaXN0CisgICAgb2YgQ29sdW1uT3JTdXBlckNvbHVtbnMgKGdldF9zbGljZSgpKS4gSWYgeW91J3JlIGxvb2tpbmcgdXAgYSBTdXBlckNvbHVtbiAob3IgbGlzdCBvZiBTdXBlckNvbHVtbnMpIHRoZW4gdGhlIHJlc3VsdGluZworICAgIGluc3RhbmNlcyBvZiBDb2x1bW5PclN1cGVyQ29sdW1uIHdpbGwgaGF2ZSB0aGUgcmVxdWVzdGVkIFN1cGVyQ29sdW1uIGluIHRoZSBhdHRyaWJ1dGUgc3VwZXJfY29sdW1uLiBGb3IgcXVlcmllcyByZXN1bHRpbmcKKyAgICBpbiBDb2x1bW5zLCB0aG9zZSB2YWx1ZXMgd2lsbCBiZSBpbiB0aGUgYXR0cmlidXRlIGNvbHVtbi4gVGhpcyBjaGFuZ2Ugd2FzIG1hZGUgYmV0d2VlbiAwLjMgYW5kIDAuNCB0byBzdGFuZGFyZGl6ZSBvbgorICAgIHNpbmdsZSBxdWVyeSBtZXRob2RzIHRoYXQgbWF5IHJldHVybiBlaXRoZXIgYSBTdXBlckNvbHVtbiBvciBDb2x1bW4uCisKKyAgICBJZiB0aGUgcXVlcnkgd2FzIG9uIGEgY291bnRlciBjb2x1bW4gZmFtaWx5LCB5b3Ugd2lsbCBlaXRoZXIgZ2V0IGEgY291bnRlcl9jb2x1bW4gKGluc3RlYWQgb2YgYSBjb2x1bW4pIG9yIGEgCisgICAgY291bnRlcl9zdXBlcl9jb2x1bW4gKGluc3RlYWQgb2YgYSBzdXBlcl9jb2x1bW4pCisKKyAgICBAcGFyYW0gY29sdW1uLiBUaGUgQ29sdW1uIHJldHVybmVkIGJ5IGdldCgpIG9yIGdldF9zbGljZSgpLgorICAgIEBwYXJhbSBzdXBlcl9jb2x1bW4uIFRoZSBTdXBlckNvbHVtbiByZXR1cm5lZCBieSBnZXQoKSBvciBnZXRfc2xpY2UoKS4KKyAgICBAcGFyYW0gY291bnRlcl9jb2x1bW4uIFRoZSBDb3VudGVyb2x1bW4gcmV0dXJuZWQgYnkgZ2V0KCkgb3IgZ2V0X3NsaWNlKCkuCisgICAgQHBhcmFtIGNvdW50ZXJfc3VwZXJfY29sdW1uLiBUaGUgQ291bnRlclN1cGVyQ29sdW1uIHJldHVybmVkIGJ5IGdldCgpIG9yIGdldF9zbGljZSgpLgorICovCitzdHJ1Y3QgQ29sdW1uT3JTdXBlckNvbHVtbiB7CisgICAgMTogb3B0aW9uYWwgQ29sdW1uIGNvbHVtbiwKKyAgICAyOiBvcHRpb25hbCBTdXBlckNvbHVtbiBzdXBlcl9jb2x1bW4sCisgICAgMzogb3B0aW9uYWwgQ291bnRlckNvbHVtbiBjb3VudGVyX2NvbHVtbiwKKyAgICA0OiBvcHRpb25hbCBDb3VudGVyU3VwZXJDb2x1bW4gY291bnRlcl9zdXBlcl9jb2x1bW4KK30KKworCisjCisjIEV4Y2VwdGlvbnMKKyMgKG5vdGUgdGhhdCBpbnRlcm5hbCBzZXJ2ZXIgZXJyb3JzIHdpbGwgcmFpc2UgYSBUQXBwbGljYXRpb25FeGNlcHRpb24sIGNvdXJ0ZXN5IG9mIFRocmlmdCkKKyMKKworLyoqIEEgc3BlY2lmaWMgY29sdW1uIHdhcyByZXF1ZXN0ZWQgdGhhdCBkb2VzIG5vdCBleGlzdC4gKi8KK2V4Y2VwdGlvbiBOb3RGb3VuZEV4Y2VwdGlvbiB7Cit9CisKKy8qKiBJbnZhbGlkIHJlcXVlc3QgY291bGQgbWVhbiBrZXlzcGFjZSBvciBjb2x1bW4gZmFtaWx5IGRvZXMgbm90IGV4aXN0LCByZXF1aXJlZCBwYXJhbWV0ZXJzIGFyZSBtaXNzaW5nLCBvciBhIHBhcmFtZXRlciBpcyBtYWxmb3JtZWQuIAorICAgIHdoeSBjb250YWlucyBhbiBhc3NvY2lhdGVkIGVycm9yIG1lc3NhZ2UuCisqLworZXhjZXB0aW9uIEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIHsKKyAgICAxOiByZXF1aXJlZCBzdHJpbmcgd2h5Cit9CisKKy8qKiBOb3QgYWxsIHRoZSByZXBsaWNhcyByZXF1aXJlZCBjb3VsZCBiZSBjcmVhdGVkIGFuZC9vciByZWFkLiAqLworZXhjZXB0aW9uIFVuYXZhaWxhYmxlRXhjZXB0aW9uIHsKK30KKworLyoqIFJQQyB0aW1lb3V0IHdhcyBleGNlZWRlZC4gIGVpdGhlciBhIG5vZGUgZmFpbGVkIG1pZC1vcGVyYXRpb24sIG9yIGxvYWQgd2FzIHRvbyBoaWdoLCBvciB0aGUgcmVxdWVzdGVkIG9wIHdhcyB0b28gbGFyZ2UuICovCitleGNlcHRpb24gVGltZWRPdXRFeGNlcHRpb24geworfQorCisvKiogaW52YWxpZCBhdXRoZW50aWNhdGlvbiByZXF1ZXN0IChpbnZhbGlkIGtleXNwYWNlLCB1c2VyIGRvZXMgbm90IGV4aXN0LCBvciBjcmVkZW50aWFscyBpbnZhbGlkKSAqLworZXhjZXB0aW9uIEF1dGhlbnRpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAxOiByZXF1aXJlZCBzdHJpbmcgd2h5Cit9CisKKy8qKiBpbnZhbGlkIGF1dGhvcml6YXRpb24gcmVxdWVzdCAodXNlciBkb2VzIG5vdCBoYXZlIGFjY2VzcyB0byBrZXlzcGFjZSkgKi8KK2V4Y2VwdGlvbiBBdXRob3JpemF0aW9uRXhjZXB0aW9uIHsKKyAgICAxOiByZXF1aXJlZCBzdHJpbmcgd2h5Cit9CisKKy8qKiBzY2hlbWFzIGFyZSBub3QgaW4gYWdyZWVtZW50IGFjcm9zcyBhbGwgbm9kZXMgKi8KK2V4Y2VwdGlvbiBTY2hlbWFEaXNhZ3JlZW1lbnRFeGNlcHRpb24geworfQorCisKKyMKKyMgc2VydmljZSBhcGkKKyMKKy8qKiAKKyAqIFRoZSBDb25zaXN0ZW5jeUxldmVsIGlzIGFuIGVudW0gdGhhdCBjb250cm9scyBib3RoIHJlYWQgYW5kIHdyaXRlCisgKiBiZWhhdmlvciBiYXNlZCBvbiB0aGUgUmVwbGljYXRpb25GYWN0b3Igb2YgdGhlIGtleXNwYWNlLiAgVGhlCisgKiBkaWZmZXJlbnQgY29uc2lzdGVuY3kgbGV2ZWxzIGhhdmUgZGlmZmVyZW50IG1lYW5pbmdzLCBkZXBlbmRpbmcgb24KKyAqIGlmIHlvdSdyZSBkb2luZyBhIHdyaXRlIG9yIHJlYWQgb3BlcmF0aW9uLiAKKyAqCisgKiBJZiBXICsgUiA+IFJlcGxpY2F0aW9uRmFjdG9yLCB3aGVyZSBXIGlzIHRoZSBudW1iZXIgb2Ygbm9kZXMgdG8KKyAqIGJsb2NrIGZvciBvbiB3cml0ZSwgYW5kIFIgdGhlIG51bWJlciB0byBibG9jayBmb3Igb24gcmVhZHMsIHlvdQorICogd2lsbCBoYXZlIHN0cm9uZ2x5IGNvbnNpc3RlbnQgYmVoYXZpb3I7IHRoYXQgaXMsIHJlYWRlcnMgd2lsbAorICogYWx3YXlzIHNlZSB0aGUgbW9zdCByZWNlbnQgd3JpdGUuIE9mIHRoZXNlLCB0aGUgbW9zdCBpbnRlcmVzdGluZyBpcworICogdG8gZG8gUVVPUlVNIHJlYWRzIGFuZCB3cml0ZXMsIHdoaWNoIGdpdmVzIHlvdSBjb25zaXN0ZW5jeSB3aGlsZQorICogc3RpbGwgYWxsb3dpbmcgYXZhaWxhYmlsaXR5IGluIHRoZSBmYWNlIG9mIG5vZGUgZmFpbHVyZXMgdXAgdG8gaGFsZgorICogb2YgPFJlcGxpY2F0aW9uRmFjdG9yPi4gT2YgY291cnNlIGlmIGxhdGVuY3kgaXMgbW9yZSBpbXBvcnRhbnQgdGhhbgorICogY29uc2lzdGVuY3kgdGhlbiB5b3UgY2FuIHVzZSBsb3dlciB2YWx1ZXMgZm9yIGVpdGhlciBvciBib3RoLgorICogCisgKiBTb21lIENvbnNpc3RlbmN5TGV2ZWxzIChPTkUsIFRXTywgVEhSRUUpIHJlZmVyIHRvIGEgc3BlY2lmaWMgbnVtYmVyCisgKiBvZiByZXBsaWNhcyByYXRoZXIgdGhhbiBhIGxvZ2ljYWwgY29uY2VwdCB0aGF0IGFkanVzdHMKKyAqIGF1dG9tYXRpY2FsbHkgd2l0aCB0aGUgcmVwbGljYXRpb24gZmFjdG9yLiAgT2YgdGhlc2UsIG9ubHkgT05FIGlzCisgKiBjb21tb25seSB1c2VkOyBUV08gYW5kIChldmVuIG1vcmUgcmFyZWx5KSBUSFJFRSBhcmUgb25seSB1c2VmdWwKKyAqIHdoZW4geW91IGNhcmUgbW9yZSBhYm91dCBndWFyYW50ZWVpbmcgYSBjZXJ0YWluIGxldmVsIG9mCisgKiBkdXJhYmlsaXR5LCB0aGFuIGNvbnNpc3RlbmN5LgorICogCisgKiBXcml0ZSBjb25zaXN0ZW5jeSBsZXZlbHMgbWFrZSB0aGUgZm9sbG93aW5nIGd1YXJhbnRlZXMgYmVmb3JlIHJlcG9ydGluZyBzdWNjZXNzIHRvIHRoZSBjbGllbnQ6CisgKiAgIEFOWSAgICAgICAgICBFbnN1cmUgdGhhdCB0aGUgd3JpdGUgaGFzIGJlZW4gd3JpdHRlbiBvbmNlIHNvbWV3aGVyZSwgaW5jbHVkaW5nIHBvc3NpYmx5IGJlaW5nIGhpbnRlZCBpbiBhIG5vbi10YXJnZXQgbm9kZS4KKyAqICAgT05FICAgICAgICAgIEVuc3VyZSB0aGF0IHRoZSB3cml0ZSBoYXMgYmVlbiB3cml0dGVuIHRvIGF0IGxlYXN0IDEgbm9kZSdzIGNvbW1pdCBsb2cgYW5kIG1lbW9yeSB0YWJsZQorICogICBUV08gICAgICAgICAgRW5zdXJlIHRoYXQgdGhlIHdyaXRlIGhhcyBiZWVuIHdyaXR0ZW4gdG8gYXQgbGVhc3QgMiBub2RlJ3MgY29tbWl0IGxvZyBhbmQgbWVtb3J5IHRhYmxlCisgKiAgIFRIUkVFICAgICAgICBFbnN1cmUgdGhhdCB0aGUgd3JpdGUgaGFzIGJlZW4gd3JpdHRlbiB0byBhdCBsZWFzdCAzIG5vZGUncyBjb21taXQgbG9nIGFuZCBtZW1vcnkgdGFibGUKKyAqICAgUVVPUlVNICAgICAgIEVuc3VyZSB0aGF0IHRoZSB3cml0ZSBoYXMgYmVlbiB3cml0dGVuIHRvIDxSZXBsaWNhdGlvbkZhY3Rvcj4gLyAyICsgMSBub2RlcworICogICBMT0NBTF9RVU9SVU0gRW5zdXJlIHRoYXQgdGhlIHdyaXRlIGhhcyBiZWVuIHdyaXR0ZW4gdG8gPFJlcGxpY2F0aW9uRmFjdG9yPiAvIDIgKyAxIG5vZGVzLCB3aXRoaW4gdGhlIGxvY2FsIGRhdGFjZW50ZXIgKHJlcXVpcmVzIE5ldHdvcmtUb3BvbG9neVN0cmF0ZWd5KQorICogICBFQUNIX1FVT1JVTSAgRW5zdXJlIHRoYXQgdGhlIHdyaXRlIGhhcyBiZWVuIHdyaXR0ZW4gdG8gPFJlcGxpY2F0aW9uRmFjdG9yPiAvIDIgKyAxIG5vZGVzIGluIGVhY2ggZGF0YWNlbnRlciAocmVxdWlyZXMgTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3kpCisgKiAgIEFMTCAgICAgICAgICBFbnN1cmUgdGhhdCB0aGUgd3JpdGUgaXMgd3JpdHRlbiB0byA8Y29kZT4mbHQ7UmVwbGljYXRpb25GYWN0b3ImZ3Q7PC9jb2RlPiBub2RlcyBiZWZvcmUgcmVzcG9uZGluZyB0byB0aGUgY2xpZW50LgorICogCisgKiBSZWFkIGNvbnNpc3RlbmN5IGxldmVscyBtYWtlIHRoZSBmb2xsb3dpbmcgZ3VhcmFudGVlcyBiZWZvcmUgcmV0dXJuaW5nIHN1Y2Nlc3NmdWwgcmVzdWx0cyB0byB0aGUgY2xpZW50OgorICogICBBTlkgICAgICAgICAgTm90IHN1cHBvcnRlZC4gWW91IHByb2JhYmx5IHdhbnQgT05FIGluc3RlYWQuCisgKiAgIE9ORSAgICAgICAgICBSZXR1cm5zIHRoZSByZWNvcmQgb2J0YWluZWQgZnJvbSBhIHNpbmdsZSByZXBsaWNhLgorICogICBUV08gICAgICAgICAgUmV0dXJucyB0aGUgcmVjb3JkIHdpdGggdGhlIG1vc3QgcmVjZW50IHRpbWVzdGFtcCBvbmNlIHR3byByZXBsaWNhcyBoYXZlIHJlcGxpZWQuCisgKiAgIFRIUkVFICAgICAgICBSZXR1cm5zIHRoZSByZWNvcmQgd2l0aCB0aGUgbW9zdCByZWNlbnQgdGltZXN0YW1wIG9uY2UgdGhyZWUgcmVwbGljYXMgaGF2ZSByZXBsaWVkLgorICogICBRVU9SVU0gICAgICAgUmV0dXJucyB0aGUgcmVjb3JkIHdpdGggdGhlIG1vc3QgcmVjZW50IHRpbWVzdGFtcCBvbmNlIGEgbWFqb3JpdHkgb2YgcmVwbGljYXMgaGF2ZSByZXBsaWVkLgorICogICBMT0NBTF9RVU9SVU0gUmV0dXJucyB0aGUgcmVjb3JkIHdpdGggdGhlIG1vc3QgcmVjZW50IHRpbWVzdGFtcCBvbmNlIGEgbWFqb3JpdHkgb2YgcmVwbGljYXMgd2l0aGluIHRoZSBsb2NhbCBkYXRhY2VudGVyIGhhdmUgcmVwbGllZC4KKyAqICAgRUFDSF9RVU9SVU0gIFJldHVybnMgdGhlIHJlY29yZCB3aXRoIHRoZSBtb3N0IHJlY2VudCB0aW1lc3RhbXAgb25jZSBhIG1ham9yaXR5IG9mIHJlcGxpY2FzIHdpdGhpbiBlYWNoIGRhdGFjZW50ZXIgaGF2ZSByZXBsaWVkLgorICogICBBTEwgICAgICAgICAgUmV0dXJucyB0aGUgcmVjb3JkIHdpdGggdGhlIG1vc3QgcmVjZW50IHRpbWVzdGFtcCBvbmNlIGFsbCByZXBsaWNhcyBoYXZlIHJlcGxpZWQgKGltcGxpZXMgbm8gcmVwbGljYSBtYXkgYmUgZG93bikuLgorKi8KK2VudW0gQ29uc2lzdGVuY3lMZXZlbCB7CisgICAgT05FID0gMSwKKyAgICBRVU9SVU0gPSAyLAorICAgIExPQ0FMX1FVT1JVTSA9IDMsCisgICAgRUFDSF9RVU9SVU0gPSA0LAorICAgIEFMTCA9IDUsCisgICAgQU5ZID0gNiwKKyAgICBUV08gPSA3LAorICAgIFRIUkVFID0gOCwKK30KKworLyoqCisgICAgQ29sdW1uUGFyZW50IGlzIHVzZWQgd2hlbiBzZWxlY3RpbmcgZ3JvdXBzIG9mIGNvbHVtbnMgZnJvbSB0aGUgc2FtZSBDb2x1bW5GYW1pbHkuIEluIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgdGVybXMsIGltYWdpbmUKKyAgICBDb2x1bW5QYXJlbnQgYXMgQ29sdW1uUGF0aCArICcvLi4vJy4KKworICAgIFNlZSBhbHNvIDxhIGhyZWY9ImNhc3NhbmRyYS5odG1sI1N0cnVjdF9Db2x1bW5QYXRoIj5Db2x1bW5QYXRoPC9hPgorICovCitzdHJ1Y3QgQ29sdW1uUGFyZW50IHsKKyAgICAzOiByZXF1aXJlZCBzdHJpbmcgY29sdW1uX2ZhbWlseSwKKyAgICA0OiBvcHRpb25hbCBiaW5hcnkgc3VwZXJfY29sdW1uLAorfQorCisvKiogVGhlIENvbHVtblBhdGggaXMgdGhlIHBhdGggdG8gYSBzaW5nbGUgY29sdW1uIGluIENhc3NhbmRyYS4gSXQgbWlnaHQgbWFrZSBzZW5zZSB0byB0aGluayBvZiBDb2x1bW5QYXRoIGFuZAorICogQ29sdW1uUGFyZW50IGluIHRlcm1zIG9mIGEgZGlyZWN0b3J5IHN0cnVjdHVyZS4KKyAqCisgKiBDb2x1bW5QYXRoIGlzIHVzZWQgdG8gbG9va2luZyB1cCBhIHNpbmdsZSBjb2x1bW4uCisgKgorICogQHBhcmFtIGNvbHVtbl9mYW1pbHkuIFRoZSBuYW1lIG9mIHRoZSBDRiBvZiB0aGUgY29sdW1uIGJlaW5nIGxvb2tlZCB1cC4KKyAqIEBwYXJhbSBzdXBlcl9jb2x1bW4uIFRoZSBzdXBlciBjb2x1bW4gbmFtZS4KKyAqIEBwYXJhbSBjb2x1bW4uIFRoZSBjb2x1bW4gbmFtZS4KKyAqLworc3RydWN0IENvbHVtblBhdGggeworICAgIDM6IHJlcXVpcmVkIHN0cmluZyBjb2x1bW5fZmFtaWx5LAorICAgIDQ6IG9wdGlvbmFsIGJpbmFyeSBzdXBlcl9jb2x1bW4sCisgICAgNTogb3B0aW9uYWwgYmluYXJ5IGNvbHVtbiwKK30KKworLyoqCisgICAgQSBzbGljZSByYW5nZSBpcyBhIHN0cnVjdHVyZSB0aGF0IHN0b3JlcyBiYXNpYyByYW5nZSwgb3JkZXJpbmcgYW5kIGxpbWl0IGluZm9ybWF0aW9uIGZvciBhIHF1ZXJ5IHRoYXQgd2lsbCByZXR1cm4KKyAgICBtdWx0aXBsZSBjb2x1bW5zLiBJdCBjb3VsZCBiZSB0aG91Z2h0IG9mIGFzIENhc3NhbmRyYSdzIHZlcnNpb24gb2YgTElNSVQgYW5kIE9SREVSIEJZCisKKyAgICBAcGFyYW0gc3RhcnQuIFRoZSBjb2x1bW4gbmFtZSB0byBzdGFydCB0aGUgc2xpY2Ugd2l0aC4gVGhpcyBhdHRyaWJ1dGUgaXMgbm90IHJlcXVpcmVkLCB0aG91Z2ggdGhlcmUgaXMgbm8gZGVmYXVsdCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgIGFuZCBjYW4gYmUgc2FmZWx5IHNldCB0byAnJywgaS5lLiwgYW4gZW1wdHkgYnl0ZSBhcnJheSwgdG8gc3RhcnQgd2l0aCB0aGUgZmlyc3QgY29sdW1uIG5hbWUuIE90aGVyd2lzZSwgaXQKKyAgICAgICAgICAgICAgICAgIG11c3QgYSB2YWxpZCB2YWx1ZSB1bmRlciB0aGUgcnVsZXMgb2YgdGhlIENvbXBhcmF0b3IgZGVmaW5lZCBmb3IgdGhlIGdpdmVuIENvbHVtbkZhbWlseS4KKyAgICBAcGFyYW0gZmluaXNoLiBUaGUgY29sdW1uIG5hbWUgdG8gc3RvcCB0aGUgc2xpY2UgYXQuIFRoaXMgYXR0cmlidXRlIGlzIG5vdCByZXF1aXJlZCwgdGhvdWdoIHRoZXJlIGlzIG5vIGRlZmF1bHQgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgYW5kIGNhbiBiZSBzYWZlbHkgc2V0IHRvIGFuIGVtcHR5IGJ5dGUgYXJyYXkgdG8gbm90IHN0b3AgdW50aWwgJ2NvdW50JyByZXN1bHRzIGFyZSBzZWVuLiBPdGhlcndpc2UsIGl0CisgICAgICAgICAgICAgICAgICAgbXVzdCBhbHNvIGJlIGEgdmFsaWQgdmFsdWUgdG8gdGhlIENvbHVtbkZhbWlseSBDb21wYXJhdG9yLgorICAgIEBwYXJhbSByZXZlcnNlZC4gV2hldGhlciB0aGUgcmVzdWx0cyBzaG91bGQgYmUgb3JkZXJlZCBpbiByZXZlcnNlZCBvcmRlci4gU2ltaWxhciB0byBPUkRFUiBCWSBibGFoIERFU0MgaW4gU1FMLgorICAgIEBwYXJhbSBjb3VudC4gSG93IG1hbnkgY29sdW1ucyB0byByZXR1cm4uIFNpbWlsYXIgdG8gTElNSVQgaW4gU1FMLiBNYXkgYmUgYXJiaXRyYXJpbHkgbGFyZ2UsIGJ1dCBUaHJpZnQgd2lsbAorICAgICAgICAgICAgICAgICAgbWF0ZXJpYWxpemUgdGhlIHdob2xlIHJlc3VsdCBpbnRvIG1lbW9yeSBiZWZvcmUgcmV0dXJuaW5nIGl0IHRvIHRoZSBjbGllbnQsIHNvIGJlIGF3YXJlIHRoYXQgeW91IG1heQorICAgICAgICAgICAgICAgICAgYmUgYmV0dGVyIHNlcnZlZCBieSBpdGVyYXRpbmcgdGhyb3VnaCBzbGljZXMgYnkgcGFzc2luZyB0aGUgbGFzdCB2YWx1ZSBvZiBvbmUgY2FsbCBpbiBhcyB0aGUgJ3N0YXJ0JworICAgICAgICAgICAgICAgICAgb2YgdGhlIG5leHQgaW5zdGVhZCBvZiBpbmNyZWFzaW5nICdjb3VudCcgYXJiaXRyYXJpbHkgbGFyZ2UuCisgKi8KK3N0cnVjdCBTbGljZVJhbmdlIHsKKyAgICAxOiByZXF1aXJlZCBiaW5hcnkgc3RhcnQsCisgICAgMjogcmVxdWlyZWQgYmluYXJ5IGZpbmlzaCwKKyAgICAzOiByZXF1aXJlZCBib29sIHJldmVyc2VkPTAsCisgICAgNDogcmVxdWlyZWQgaTMyIGNvdW50PTEwMCwKK30KKworLyoqCisgICAgQSBTbGljZVByZWRpY2F0ZSBpcyBzaW1pbGFyIHRvIGEgbWF0aGVtYXRpYyBwcmVkaWNhdGUgKHNlZSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1ByZWRpY2F0ZV8obWF0aGVtYXRpY2FsX2xvZ2ljKSksCisgICAgd2hpY2ggaXMgZGVzY3JpYmVkIGFzICJhIHByb3BlcnR5IHRoYXQgdGhlIGVsZW1lbnRzIG9mIGEgc2V0IGhhdmUgaW4gY29tbW9uLiIKKworICAgIFNsaWNlUHJlZGljYXRlJ3MgaW4gQ2Fzc2FuZHJhIGFyZSBkZXNjcmliZWQgd2l0aCBlaXRoZXIgYSBsaXN0IG9mIGNvbHVtbl9uYW1lcyBvciBhIFNsaWNlUmFuZ2UuICBJZiBjb2x1bW5fbmFtZXMgaXMKKyAgICBzcGVjaWZpZWQsIHNsaWNlX3JhbmdlIGlzIGlnbm9yZWQuCisKKyAgICBAcGFyYW0gY29sdW1uX25hbWUuIEEgbGlzdCBvZiBjb2x1bW4gbmFtZXMgdG8gcmV0cmlldmUuIFRoaXMgY2FuIGJlIHVzZWQgc2ltaWxhciB0byBNZW1jYWNoZWQncyAibXVsdGktZ2V0IiBmZWF0dXJlCisgICAgICAgICAgICAgICAgICAgICAgICB0byBmZXRjaCBOIGtub3duIGNvbHVtbiBuYW1lcy4gRm9yIGluc3RhbmNlLCBpZiB5b3Uga25vdyB5b3Ugd2lzaCB0byBmZXRjaCBjb2x1bW5zICdKb2UnLCAnSmFjaycsCisgICAgICAgICAgICAgICAgICAgICAgICBhbmQgJ0ppbScgeW91IGNhbiBwYXNzIHRob3NlIGNvbHVtbiBuYW1lcyBhcyBhIGxpc3QgdG8gZmV0Y2ggYWxsIHRocmVlIGF0IG9uY2UuCisgICAgQHBhcmFtIHNsaWNlX3JhbmdlLiBBIFNsaWNlUmFuZ2UgZGVzY3JpYmluZyBob3cgdG8gcmFuZ2UsIG9yZGVyLCBhbmQvb3IgbGltaXQgdGhlIHNsaWNlLgorICovCitzdHJ1Y3QgU2xpY2VQcmVkaWNhdGUgeworICAgIDE6IG9wdGlvbmFsIGxpc3Q8YmluYXJ5PiBjb2x1bW5fbmFtZXMsCisgICAgMjogb3B0aW9uYWwgU2xpY2VSYW5nZSAgIHNsaWNlX3JhbmdlLAorfQorCitlbnVtIEluZGV4T3BlcmF0b3IgeworICAgIEVRLAorICAgIEdURSwKKyAgICBHVCwKKyAgICBMVEUsCisgICAgTFQKK30KKworc3RydWN0IEluZGV4RXhwcmVzc2lvbiB7CisgICAgMTogcmVxdWlyZWQgYmluYXJ5IGNvbHVtbl9uYW1lLAorICAgIDI6IHJlcXVpcmVkIEluZGV4T3BlcmF0b3Igb3AsCisgICAgMzogcmVxdWlyZWQgYmluYXJ5IHZhbHVlLAorfQorCitzdHJ1Y3QgSW5kZXhDbGF1c2UgeworICAgIDE6IHJlcXVpcmVkIGxpc3Q8SW5kZXhFeHByZXNzaW9uPiBleHByZXNzaW9ucworICAgIDI6IHJlcXVpcmVkIGJpbmFyeSBzdGFydF9rZXksCisgICAgMzogcmVxdWlyZWQgaTMyIGNvdW50PTEwMCwKK30KKworLyoqCitUaGUgc2VtYW50aWNzIG9mIHN0YXJ0IGtleXMgYW5kIHRva2VucyBhcmUgc2xpZ2h0bHkgZGlmZmVyZW50LgorS2V5cyBhcmUgc3RhcnQtaW5jbHVzaXZlOyB0b2tlbnMgYXJlIHN0YXJ0LWV4Y2x1c2l2ZS4gIFRva2VuCityYW5nZXMgbWF5IGFsc28gd3JhcCAtLSB0aGF0IGlzLCB0aGUgZW5kIHRva2VuIG1heSBiZSBsZXNzCit0aGFuIHRoZSBzdGFydCBvbmUuICBUaHVzLCBhIHJhbmdlIGZyb20ga2V5WCB0byBrZXlYIGlzIGEKK29uZS1lbGVtZW50IHJhbmdlLCBidXQgYSByYW5nZSBmcm9tIHRva2VuWSB0byB0b2tlblkgaXMgdGhlCitmdWxsIHJpbmcuCisqLworc3RydWN0IEtleVJhbmdlIHsKKyAgICAxOiBvcHRpb25hbCBiaW5hcnkgc3RhcnRfa2V5LAorICAgIDI6IG9wdGlvbmFsIGJpbmFyeSBlbmRfa2V5LAorICAgIDM6IG9wdGlvbmFsIHN0cmluZyBzdGFydF90b2tlbiwKKyAgICA0OiBvcHRpb25hbCBzdHJpbmcgZW5kX3Rva2VuLAorICAgIDU6IHJlcXVpcmVkIGkzMiBjb3VudD0xMDAKK30KKworLyoqCisgICAgQSBLZXlTbGljZSBpcyBrZXkgZm9sbG93ZWQgYnkgdGhlIGRhdGEgaXQgbWFwcyB0by4gQSBjb2xsZWN0aW9uIG9mIEtleVNsaWNlIGlzIHJldHVybmVkIGJ5IHRoZSBnZXRfcmFuZ2Vfc2xpY2Ugb3BlcmF0aW9uLgorCisgICAgQHBhcmFtIGtleS4gYSByb3cga2V5CisgICAgQHBhcmFtIGNvbHVtbnMuIExpc3Qgb2YgZGF0YSByZXByZXNlbnRlZCBieSB0aGUga2V5LiBUeXBpY2FsbHksIHRoZSBsaXN0IGlzIHBhcmVkIGRvd24gdG8gb25seSB0aGUgY29sdW1ucyBzcGVjaWZpZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgYSBTbGljZVByZWRpY2F0ZS4KKyAqLworc3RydWN0IEtleVNsaWNlIHsKKyAgICAxOiByZXF1aXJlZCBiaW5hcnkga2V5LAorICAgIDI6IHJlcXVpcmVkIGxpc3Q8Q29sdW1uT3JTdXBlckNvbHVtbj4gY29sdW1ucywKK30KKworc3RydWN0IEtleUNvdW50IHsKKyAgICAxOiByZXF1aXJlZCBiaW5hcnkga2V5LAorICAgIDI6IHJlcXVpcmVkIGkzMiBjb3VudAorfQorCisvKioKKyAqIE5vdGUgdGhhdCB0aGUgdGltZXN0YW1wIGlzIG9ubHkgb3B0aW9uYWwgaW4gY2FzZSBvZiBjb3VudGVyIGRlbGV0aW9uLgorICovCitzdHJ1Y3QgRGVsZXRpb24geworICAgIDE6IG9wdGlvbmFsIGk2NCB0aW1lc3RhbXAsCisgICAgMjogb3B0aW9uYWwgYmluYXJ5IHN1cGVyX2NvbHVtbiwKKyAgICAzOiBvcHRpb25hbCBTbGljZVByZWRpY2F0ZSBwcmVkaWNhdGUsCit9CisKKy8qKgorICAgIEEgTXV0YXRpb24gaXMgZWl0aGVyIGFuIGluc2VydCAocmVwcmVzZW50ZWQgYnkgZmlsbGluZyBjb2x1bW5fb3Jfc3VwZXJjb2x1bW4pIG9yIGEgZGVsZXRpb24gKHJlcHJlc2VudGVkIGJ5IGZpbGxpbmcgdGhlIGRlbGV0aW9uIGF0dHJpYnV0ZSkuCisgICAgQHBhcmFtIGNvbHVtbl9vcl9zdXBlcmNvbHVtbi4gQW4gaW5zZXJ0IHRvIGEgY29sdW1uIG9yIHN1cGVyY29sdW1uIChwb3NzaWJseSBjb3VudGVyIGNvbHVtbiBvciBzdXBlcmNvbHVtbikKKyAgICBAcGFyYW0gZGVsZXRpb24uIEEgZGVsZXRpb24gb2YgYSBjb2x1bW4gb3Igc3VwZXJjb2x1bW4KKyovCitzdHJ1Y3QgTXV0YXRpb24geworICAgIDE6IG9wdGlvbmFsIENvbHVtbk9yU3VwZXJDb2x1bW4gY29sdW1uX29yX3N1cGVyY29sdW1uLAorICAgIDI6IG9wdGlvbmFsIERlbGV0aW9uIGRlbGV0aW9uLAorfQorCitzdHJ1Y3QgRW5kcG9pbnREZXRhaWxzIHsKKyAgICAxOiBzdHJpbmcgaG9zdCwKKyAgICAyOiBzdHJpbmcgZGF0YWNlbnRlciwKKyAgICAzOiBvcHRpb25hbCBzdHJpbmcgcmFjaworfQorCisvKioKKyAgICBBIFRva2VuUmFuZ2UgZGVzY3JpYmVzIHBhcnQgb2YgdGhlIENhc3NhbmRyYSByaW5nLCBpdCBpcyBhIG1hcHBpbmcgZnJvbSBhIHJhbmdlIHRvCisgICAgZW5kcG9pbnRzIHJlc3BvbnNpYmxlIGZvciB0aGF0IHJhbmdlLgorICAgIEBwYXJhbSBzdGFydF90b2tlbiBUaGUgZmlyc3QgdG9rZW4gaW4gdGhlIHJhbmdlCisgICAgQHBhcmFtIGVuZF90b2tlbiBUaGUgbGFzdCB0b2tlbiBpbiB0aGUgcmFuZ2UKKyAgICBAcGFyYW0gZW5kcG9pbnRzIFRoZSBlbmRwb2ludHMgcmVzcG9uc2libGUgZm9yIHRoZSByYW5nZSAobGlzdGVkIGJ5IHRoZWlyIGNvbmZpZ3VyZWQgbGlzdGVuX2FkZHJlc3MpCisgICAgQHBhcmFtIHJwY19lbmRwb2ludHMgVGhlIGVuZHBvaW50cyByZXNwb25zaWJsZSBmb3IgdGhlIHJhbmdlIChsaXN0ZWQgYnkgdGhlaXIgY29uZmlndXJlZCBycGNfYWRkcmVzcykKKyovCitzdHJ1Y3QgVG9rZW5SYW5nZSB7CisgICAgMTogcmVxdWlyZWQgc3RyaW5nIHN0YXJ0X3Rva2VuLAorICAgIDI6IHJlcXVpcmVkIHN0cmluZyBlbmRfdG9rZW4sCisgICAgMzogcmVxdWlyZWQgbGlzdDxzdHJpbmc+IGVuZHBvaW50cywKKyAgICA0OiBvcHRpb25hbCBsaXN0PHN0cmluZz4gcnBjX2VuZHBvaW50cworICAgIDU6IG9wdGlvbmFsIGxpc3Q8RW5kcG9pbnREZXRhaWxzPiBlbmRwb2ludF9kZXRhaWxzLAorfQorCisvKioKKyAgICBBdXRoZW50aWNhdGlvbiByZXF1ZXN0cyBjYW4gY29udGFpbiBhbnkgZGF0YSwgZGVwZW5kZW50IG9uIHRoZSBJQXV0aGVudGljYXRvciB1c2VkCisqLworc3RydWN0IEF1dGhlbnRpY2F0aW9uUmVxdWVzdCB7CisgICAgMTogcmVxdWlyZWQgbWFwPHN0cmluZywgc3RyaW5nPiBjcmVkZW50aWFscworfQorCitlbnVtIEluZGV4VHlwZSB7CisgICAgS0VZUywKKyAgICBDVVNUT00KK30KKworLyogZGVzY3JpYmVzIGEgY29sdW1uIGluIGEgY29sdW1uIGZhbWlseS4gKi8KK3N0cnVjdCBDb2x1bW5EZWYgeworICAgIDE6IHJlcXVpcmVkIGJpbmFyeSBuYW1lLAorICAgIDI6IHJlcXVpcmVkIHN0cmluZyB2YWxpZGF0aW9uX2NsYXNzLAorICAgIDM6IG9wdGlvbmFsIEluZGV4VHlwZSBpbmRleF90eXBlLAorICAgIDQ6IG9wdGlvbmFsIHN0cmluZyBpbmRleF9uYW1lLAorICAgIDU6IG9wdGlvbmFsIG1hcDxzdHJpbmcsc3RyaW5nPiBpbmRleF9vcHRpb25zCit9CisKKworLyogZGVzY3JpYmVzIGEgY29sdW1uIGZhbWlseS4gKi8KK3N0cnVjdCBDZkRlZiB7CisgICAgMTogcmVxdWlyZWQgc3RyaW5nIGtleXNwYWNlLAorICAgIDI6IHJlcXVpcmVkIHN0cmluZyBuYW1lLAorICAgIDM6IG9wdGlvbmFsIHN0cmluZyBjb2x1bW5fdHlwZT0iU3RhbmRhcmQiLAorICAgIDU6IG9wdGlvbmFsIHN0cmluZyBjb21wYXJhdG9yX3R5cGU9IkJ5dGVzVHlwZSIsCisgICAgNjogb3B0aW9uYWwgc3RyaW5nIHN1YmNvbXBhcmF0b3JfdHlwZSwKKyAgICA4OiBvcHRpb25hbCBzdHJpbmcgY29tbWVudCwKKyAgICAxMjogb3B0aW9uYWwgZG91YmxlIHJlYWRfcmVwYWlyX2NoYW5jZT0xLjAsCisgICAgMTM6IG9wdGlvbmFsIGxpc3Q8Q29sdW1uRGVmPiBjb2x1bW5fbWV0YWRhdGEsCisgICAgMTQ6IG9wdGlvbmFsIGkzMiBnY19ncmFjZV9zZWNvbmRzLAorICAgIDE1OiBvcHRpb25hbCBzdHJpbmcgZGVmYXVsdF92YWxpZGF0aW9uX2NsYXNzLAorICAgIDE2OiBvcHRpb25hbCBpMzIgaWQsCisgICAgMTc6IG9wdGlvbmFsIGkzMiBtaW5fY29tcGFjdGlvbl90aHJlc2hvbGQsCisgICAgMTg6IG9wdGlvbmFsIGkzMiBtYXhfY29tcGFjdGlvbl90aHJlc2hvbGQsCisgICAgMjQ6IG9wdGlvbmFsIGJvb2wgcmVwbGljYXRlX29uX3dyaXRlLAorICAgIDI1OiBvcHRpb25hbCBkb3VibGUgbWVyZ2Vfc2hhcmRzX2NoYW5jZSwKKyAgICAyNjogb3B0aW9uYWwgc3RyaW5nIGtleV92YWxpZGF0aW9uX2NsYXNzLAorICAgIDI4OiBvcHRpb25hbCBiaW5hcnkga2V5X2FsaWFzLAorICAgIDI5OiBvcHRpb25hbCBzdHJpbmcgY29tcGFjdGlvbl9zdHJhdGVneSwKKyAgICAzMDogb3B0aW9uYWwgbWFwPHN0cmluZyxzdHJpbmc+IGNvbXBhY3Rpb25fc3RyYXRlZ3lfb3B0aW9ucywKKyAgICAzMjogb3B0aW9uYWwgbWFwPHN0cmluZyxzdHJpbmc+IGNvbXByZXNzaW9uX29wdGlvbnMsCisgICAgMzM6IG9wdGlvbmFsIGRvdWJsZSBibG9vbV9maWx0ZXJfZnBfY2hhbmNlLAorfQorCisvKiBkZXNjcmliZXMgYSBrZXlzcGFjZS4gKi8KK3N0cnVjdCBLc0RlZiB7CisgICAgMTogcmVxdWlyZWQgc3RyaW5nIG5hbWUsCisgICAgMjogcmVxdWlyZWQgc3RyaW5nIHN0cmF0ZWd5X2NsYXNzLAorICAgIDM6IG9wdGlvbmFsIG1hcDxzdHJpbmcsc3RyaW5nPiBzdHJhdGVneV9vcHRpb25zLAorCisgICAgLyoqIEBkZXByZWNhdGVkICovCisgICAgNDogb3B0aW9uYWwgaTMyIHJlcGxpY2F0aW9uX2ZhY3RvciwgCisKKyAgICA1OiByZXF1aXJlZCBsaXN0PENmRGVmPiBjZl9kZWZzLAorICAgIDY6IG9wdGlvbmFsIGJvb2wgZHVyYWJsZV93cml0ZXM9MSwKK30KKworLyoqIENRTCBxdWVyeSBjb21wcmVzc2lvbiAqLworZW51bSBDb21wcmVzc2lvbiB7CisgICAgR1pJUCA9IDEsCisgICAgTk9ORSA9IDIKK30KKworZW51bSBDcWxSZXN1bHRUeXBlIHsKKyAgICBST1dTID0gMSwKKyAgICBWT0lEID0gMiwKKyAgICBJTlQgPSAzCit9CisKKy8qKiBSb3cgcmV0dXJuZWQgZnJvbSBhIENRTCBxdWVyeSAqLworc3RydWN0IENxbFJvdyB7CisgICAgMTogcmVxdWlyZWQgYmluYXJ5IGtleSwKKyAgICAyOiByZXF1aXJlZCBsaXN0PENvbHVtbj4gY29sdW1ucworfQorCitzdHJ1Y3QgQ3FsTWV0YWRhdGEgeworICAgIDE6IHJlcXVpcmVkIG1hcDxiaW5hcnksc3RyaW5nPiBuYW1lX3R5cGVzLAorICAgIDI6IHJlcXVpcmVkIG1hcDxiaW5hcnksc3RyaW5nPiB2YWx1ZV90eXBlcywKKyAgICAzOiByZXF1aXJlZCBzdHJpbmcgZGVmYXVsdF9uYW1lX3R5cGUsCisgICAgNDogcmVxdWlyZWQgc3RyaW5nIGRlZmF1bHRfdmFsdWVfdHlwZQorfQorCitzdHJ1Y3QgQ3FsUmVzdWx0IHsKKyAgICAxOiByZXF1aXJlZCBDcWxSZXN1bHRUeXBlIHR5cGUsCisgICAgMjogb3B0aW9uYWwgbGlzdDxDcWxSb3c+IHJvd3MsCisgICAgMzogb3B0aW9uYWwgaTMyIG51bSwKKyAgICA0OiBvcHRpb25hbCBDcWxNZXRhZGF0YSBzY2hlbWEKK30KKworc3RydWN0IENxbFByZXBhcmVkUmVzdWx0IHsKKyAgICAxOiByZXF1aXJlZCBpMzIgaXRlbUlkLAorICAgIDI6IHJlcXVpcmVkIGkzMiBjb3VudAorfQorCisKK3NlcnZpY2UgQ2Fzc2FuZHJhIHsKKyAgIyBhdXRoIG1ldGhvZHMKKyAgdm9pZCBsb2dpbigxOiByZXF1aXJlZCBBdXRoZW50aWNhdGlvblJlcXVlc3QgYXV0aF9yZXF1ZXN0KSB0aHJvd3MgKDE6QXV0aGVudGljYXRpb25FeGNlcHRpb24gYXV0aG54LCAyOkF1dGhvcml6YXRpb25FeGNlcHRpb24gYXV0aHp4KSwKKyAKKyAgIyBzZXQga2V5c3BhY2UKKyAgdm9pZCBzZXRfa2V5c3BhY2UoMTogcmVxdWlyZWQgc3RyaW5nIGtleXNwYWNlKSB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlKSwKKyAgCisgICMgcmV0cmlldmFsIG1ldGhvZHMKKworICAvKioKKyAgICBHZXQgdGhlIENvbHVtbiBvciBTdXBlckNvbHVtbiBhdCB0aGUgZ2l2ZW4gY29sdW1uX3BhdGguIElmIG5vIHZhbHVlIGlzIHByZXNlbnQsIE5vdEZvdW5kRXhjZXB0aW9uIGlzIHRocm93bi4gKFRoaXMgaXMKKyAgICB0aGUgb25seSBtZXRob2QgdGhhdCBjYW4gdGhyb3cgYW4gZXhjZXB0aW9uIHVuZGVyIG5vbi1mYWlsdXJlIGNvbmRpdGlvbnMuKQorICAgKi8KKyAgQ29sdW1uT3JTdXBlckNvbHVtbiBnZXQoMTpyZXF1aXJlZCBiaW5hcnkga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAyOnJlcXVpcmVkIENvbHVtblBhdGggY29sdW1uX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDM6cmVxdWlyZWQgQ29uc2lzdGVuY3lMZXZlbCBjb25zaXN0ZW5jeV9sZXZlbD1Db25zaXN0ZW5jeUxldmVsLk9ORSkKKyAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlLCAyOk5vdEZvdW5kRXhjZXB0aW9uIG5mZSwgMzpVbmF2YWlsYWJsZUV4Y2VwdGlvbiB1ZSwgNDpUaW1lZE91dEV4Y2VwdGlvbiB0ZSksCisKKyAgLyoqCisgICAgR2V0IHRoZSBncm91cCBvZiBjb2x1bW5zIGNvbnRhaW5lZCBieSBjb2x1bW5fcGFyZW50IChlaXRoZXIgYSBDb2x1bW5GYW1pbHkgbmFtZSBvciBhIENvbHVtbkZhbWlseS9TdXBlckNvbHVtbiBuYW1lCisgICAgcGFpcikgc3BlY2lmaWVkIGJ5IHRoZSBnaXZlbiBTbGljZVByZWRpY2F0ZS4gSWYgbm8gbWF0Y2hpbmcgdmFsdWVzIGFyZSBmb3VuZCwgYW4gZW1wdHkgbGlzdCBpcyByZXR1cm5lZC4KKyAgICovCisgIGxpc3Q8Q29sdW1uT3JTdXBlckNvbHVtbj4gZ2V0X3NsaWNlKDE6cmVxdWlyZWQgYmluYXJ5IGtleSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI6cmVxdWlyZWQgQ29sdW1uUGFyZW50IGNvbHVtbl9wYXJlbnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOnJlcXVpcmVkIFNsaWNlUHJlZGljYXRlIHByZWRpY2F0ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ6cmVxdWlyZWQgQ29uc2lzdGVuY3lMZXZlbCBjb25zaXN0ZW5jeV9sZXZlbD1Db25zaXN0ZW5jeUxldmVsLk9ORSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlLCAyOlVuYXZhaWxhYmxlRXhjZXB0aW9uIHVlLCAzOlRpbWVkT3V0RXhjZXB0aW9uIHRlKSwKKworICAvKioKKyAgICByZXR1cm5zIHRoZSBudW1iZXIgb2YgY29sdW1ucyBtYXRjaGluZyA8Y29kZT5wcmVkaWNhdGU8L2NvZGU+IGZvciBhIHBhcnRpY3VsYXIgPGNvZGU+a2V5PC9jb2RlPiwgCisgICAgPGNvZGU+Q29sdW1uRmFtaWx5PC9jb2RlPiBhbmQgb3B0aW9uYWxseSA8Y29kZT5TdXBlckNvbHVtbjwvY29kZT4uCisgICovCisgIGkzMiBnZXRfY291bnQoMTpyZXF1aXJlZCBiaW5hcnkga2V5LCAKKyAgICAgICAgICAgICAgICAyOnJlcXVpcmVkIENvbHVtblBhcmVudCBjb2x1bW5fcGFyZW50LCAKKyAgICAgICAgICAgICAgICAzOnJlcXVpcmVkIFNsaWNlUHJlZGljYXRlIHByZWRpY2F0ZSwKKyAgICAgICAgICAgICAgICA0OnJlcXVpcmVkIENvbnNpc3RlbmN5TGV2ZWwgY29uc2lzdGVuY3lfbGV2ZWw9Q29uc2lzdGVuY3lMZXZlbC5PTkUpCisgICAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlLCAyOlVuYXZhaWxhYmxlRXhjZXB0aW9uIHVlLCAzOlRpbWVkT3V0RXhjZXB0aW9uIHRlKSwKKworICAvKioKKyAgICBQZXJmb3JtcyBhIGdldF9zbGljZSBmb3IgY29sdW1uX3BhcmVudCBhbmQgcHJlZGljYXRlIGZvciB0aGUgZ2l2ZW4ga2V5cyBpbiBwYXJhbGxlbC4KKyAgKi8KKyAgbWFwPGJpbmFyeSxsaXN0PENvbHVtbk9yU3VwZXJDb2x1bW4+PiBtdWx0aWdldF9zbGljZSgxOnJlcXVpcmVkIGxpc3Q8YmluYXJ5PiBrZXlzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOnJlcXVpcmVkIENvbHVtblBhcmVudCBjb2x1bW5fcGFyZW50LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOnJlcXVpcmVkIFNsaWNlUHJlZGljYXRlIHByZWRpY2F0ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDpyZXF1aXJlZCBDb25zaXN0ZW5jeUxldmVsIGNvbnNpc3RlbmN5X2xldmVsPUNvbnNpc3RlbmN5TGV2ZWwuT05FKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsIDI6VW5hdmFpbGFibGVFeGNlcHRpb24gdWUsIDM6VGltZWRPdXRFeGNlcHRpb24gdGUpLAorCisgIC8qKgorICAgIFBlcmZvcm0gYSBnZXRfY291bnQgaW4gcGFyYWxsZWwgb24gdGhlIGdpdmVuIGxpc3Q8YmluYXJ5PiBrZXlzLiBUaGUgcmV0dXJuIHZhbHVlIG1hcHMga2V5cyB0byB0aGUgY291bnQgZm91bmQuCisgICovCisgIG1hcDxiaW5hcnksIGkzMj4gbXVsdGlnZXRfY291bnQoMTpyZXF1aXJlZCBsaXN0PGJpbmFyeT4ga2V5cywKKyAgICAgICAgICAgICAgICAyOnJlcXVpcmVkIENvbHVtblBhcmVudCBjb2x1bW5fcGFyZW50LAorICAgICAgICAgICAgICAgIDM6cmVxdWlyZWQgU2xpY2VQcmVkaWNhdGUgcHJlZGljYXRlLAorICAgICAgICAgICAgICAgIDQ6cmVxdWlyZWQgQ29uc2lzdGVuY3lMZXZlbCBjb25zaXN0ZW5jeV9sZXZlbD1Db25zaXN0ZW5jeUxldmVsLk9ORSkKKyAgICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsIDI6VW5hdmFpbGFibGVFeGNlcHRpb24gdWUsIDM6VGltZWRPdXRFeGNlcHRpb24gdGUpLAorCisgIC8qKgorICAgcmV0dXJucyBhIHN1YnNldCBvZiBjb2x1bW5zIGZvciBhIGNvbnRpZ3VvdXMgcmFuZ2Ugb2Yga2V5cy4KKyAgKi8KKyAgbGlzdDxLZXlTbGljZT4gZ2V0X3JhbmdlX3NsaWNlcygxOnJlcXVpcmVkIENvbHVtblBhcmVudCBjb2x1bW5fcGFyZW50LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOnJlcXVpcmVkIFNsaWNlUHJlZGljYXRlIHByZWRpY2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOnJlcXVpcmVkIEtleVJhbmdlIHJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ6cmVxdWlyZWQgQ29uc2lzdGVuY3lMZXZlbCBjb25zaXN0ZW5jeV9sZXZlbD1Db25zaXN0ZW5jeUxldmVsLk9ORSkKKyAgICAgICAgICAgICAgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSwgMjpVbmF2YWlsYWJsZUV4Y2VwdGlvbiB1ZSwgMzpUaW1lZE91dEV4Y2VwdGlvbiB0ZSksCisKKyAgLyoqIFJldHVybnMgdGhlIHN1YnNldCBvZiBjb2x1bW5zIHNwZWNpZmllZCBpbiBTbGljZVByZWRpY2F0ZSBmb3IgdGhlIHJvd3MgbWF0Y2hpbmcgdGhlIEluZGV4Q2xhdXNlICovCisgIGxpc3Q8S2V5U2xpY2U+IGdldF9pbmRleGVkX3NsaWNlcygxOnJlcXVpcmVkIENvbHVtblBhcmVudCBjb2x1bW5fcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjpyZXF1aXJlZCBJbmRleENsYXVzZSBpbmRleF9jbGF1c2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOnJlcXVpcmVkIFNsaWNlUHJlZGljYXRlIGNvbHVtbl9wcmVkaWNhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0OnJlcXVpcmVkIENvbnNpc3RlbmN5TGV2ZWwgY29uc2lzdGVuY3lfbGV2ZWw9Q29uc2lzdGVuY3lMZXZlbC5PTkUpCisgICAgICAgICAgICAgICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsIDI6VW5hdmFpbGFibGVFeGNlcHRpb24gdWUsIDM6VGltZWRPdXRFeGNlcHRpb24gdGUpLAorCisgICMgbW9kaWZpY2F0aW9uIG1ldGhvZHMKKworICAvKioKKyAgICogSW5zZXJ0IGEgQ29sdW1uIGF0IHRoZSBnaXZlbiBjb2x1bW5fcGFyZW50LmNvbHVtbl9mYW1pbHkgYW5kIG9wdGlvbmFsIGNvbHVtbl9wYXJlbnQuc3VwZXJfY29sdW1uLgorICAgKi8KKyAgdm9pZCBpbnNlcnQoMTpyZXF1aXJlZCBiaW5hcnkga2V5LCAKKyAgICAgICAgICAgICAgMjpyZXF1aXJlZCBDb2x1bW5QYXJlbnQgY29sdW1uX3BhcmVudCwKKyAgICAgICAgICAgICAgMzpyZXF1aXJlZCBDb2x1bW4gY29sdW1uLAorICAgICAgICAgICAgICA0OnJlcXVpcmVkIENvbnNpc3RlbmN5TGV2ZWwgY29uc2lzdGVuY3lfbGV2ZWw9Q29uc2lzdGVuY3lMZXZlbC5PTkUpCisgICAgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSwgMjpVbmF2YWlsYWJsZUV4Y2VwdGlvbiB1ZSwgMzpUaW1lZE91dEV4Y2VwdGlvbiB0ZSksCisKKyAgLyoqCisgICAqIEluY3JlbWVudCBvciBkZWNyZW1lbnQgYSBjb3VudGVyLgorICAgKi8KKyAgdm9pZCBhZGQoMTpyZXF1aXJlZCBiaW5hcnkga2V5LAorICAgICAgICAgICAyOnJlcXVpcmVkIENvbHVtblBhcmVudCBjb2x1bW5fcGFyZW50LAorICAgICAgICAgICAzOnJlcXVpcmVkIENvdW50ZXJDb2x1bW4gY29sdW1uLAorICAgICAgICAgICA0OnJlcXVpcmVkIENvbnNpc3RlbmN5TGV2ZWwgY29uc2lzdGVuY3lfbGV2ZWw9Q29uc2lzdGVuY3lMZXZlbC5PTkUpCisgICAgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSwgMjpVbmF2YWlsYWJsZUV4Y2VwdGlvbiB1ZSwgMzpUaW1lZE91dEV4Y2VwdGlvbiB0ZSksCisKKyAgLyoqCisgICAgUmVtb3ZlIGRhdGEgZnJvbSB0aGUgcm93IHNwZWNpZmllZCBieSBrZXkgYXQgdGhlIGdyYW51bGFyaXR5IHNwZWNpZmllZCBieSBjb2x1bW5fcGF0aCwgYW5kIHRoZSBnaXZlbiB0aW1lc3RhbXAuIE5vdGUKKyAgICB0aGF0IGFsbCB0aGUgdmFsdWVzIGluIGNvbHVtbl9wYXRoIGJlc2lkZXMgY29sdW1uX3BhdGguY29sdW1uX2ZhbWlseSBhcmUgdHJ1bHkgb3B0aW9uYWw6IHlvdSBjYW4gcmVtb3ZlIHRoZSBlbnRpcmUKKyAgICByb3cgYnkganVzdCBzcGVjaWZ5aW5nIHRoZSBDb2x1bW5GYW1pbHksIG9yIHlvdSBjYW4gcmVtb3ZlIGEgU3VwZXJDb2x1bW4gb3IgYSBzaW5nbGUgQ29sdW1uIGJ5IHNwZWNpZnlpbmcgdGhvc2UgbGV2ZWxzIHRvby4KKyAgICovCisgIHZvaWQgcmVtb3ZlKDE6cmVxdWlyZWQgYmluYXJ5IGtleSwKKyAgICAgICAgICAgICAgMjpyZXF1aXJlZCBDb2x1bW5QYXRoIGNvbHVtbl9wYXRoLAorICAgICAgICAgICAgICAzOnJlcXVpcmVkIGk2NCB0aW1lc3RhbXAsCisgICAgICAgICAgICAgIDQ6Q29uc2lzdGVuY3lMZXZlbCBjb25zaXN0ZW5jeV9sZXZlbD1Db25zaXN0ZW5jeUxldmVsLk9ORSkKKyAgICAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlLCAyOlVuYXZhaWxhYmxlRXhjZXB0aW9uIHVlLCAzOlRpbWVkT3V0RXhjZXB0aW9uIHRlKSwKKworICAvKioKKyAgICogUmVtb3ZlIGEgY291bnRlciBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLgorICAgKiBOb3RlIHRoYXQgY291bnRlcnMgaGF2ZSBsaW1pdGVkIHN1cHBvcnQgZm9yIGRlbGV0ZXM6IGlmIHlvdSByZW1vdmUgYSBjb3VudGVyLCB5b3UgbXVzdCB3YWl0IHRvIGlzc3VlIGFueSBmb2xsb3dpbmcgdXBkYXRlCisgICAqIHVudGlsIHRoZSBkZWxldGUgaGFzIHJlYWNoZWQgYWxsIHRoZSBub2RlcyBhbmQgYWxsIG9mIHRoZW0gaGF2ZSBiZWVuIGZ1bGx5IGNvbXBhY3RlZC4KKyAgICovCisgIHZvaWQgcmVtb3ZlX2NvdW50ZXIoMTpyZXF1aXJlZCBiaW5hcnkga2V5LAorICAgICAgICAgICAgICAgICAgICAgIDI6cmVxdWlyZWQgQ29sdW1uUGF0aCBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgIDM6cmVxdWlyZWQgQ29uc2lzdGVuY3lMZXZlbCBjb25zaXN0ZW5jeV9sZXZlbD1Db25zaXN0ZW5jeUxldmVsLk9ORSkKKyAgICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsIDI6VW5hdmFpbGFibGVFeGNlcHRpb24gdWUsIDM6VGltZWRPdXRFeGNlcHRpb24gdGUpLAorCisKKyAgLyoqCisgICAgTXV0YXRlIG1hbnkgY29sdW1ucyBvciBzdXBlciBjb2x1bW5zIGZvciBtYW55IHJvdyBrZXlzLiBTZWUgYWxzbzogTXV0YXRpb24uCisKKyAgICBtdXRhdGlvbl9tYXAgbWFwcyBrZXkgdG8gY29sdW1uIGZhbWlseSB0byBhIGxpc3Qgb2YgTXV0YXRpb24gb2JqZWN0cyB0byB0YWtlIHBsYWNlIGF0IHRoYXQgc2NvcGUuCisgICoqLworICB2b2lkIGJhdGNoX211dGF0ZSgxOnJlcXVpcmVkIG1hcDxiaW5hcnksIG1hcDxzdHJpbmcsIGxpc3Q8TXV0YXRpb24+Pj4gbXV0YXRpb25fbWFwLAorICAgICAgICAgICAgICAgICAgICAyOnJlcXVpcmVkIENvbnNpc3RlbmN5TGV2ZWwgY29uc2lzdGVuY3lfbGV2ZWw9Q29uc2lzdGVuY3lMZXZlbC5PTkUpCisgICAgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSwgMjpVbmF2YWlsYWJsZUV4Y2VwdGlvbiB1ZSwgMzpUaW1lZE91dEV4Y2VwdGlvbiB0ZSksCisgICAgICAgCisgIC8qKgorICAgVHJ1bmNhdGUgd2lsbCBtYXJrIGFuZCBlbnRpcmUgY29sdW1uIGZhbWlseSBhcyBkZWxldGVkLgorICAgRnJvbSB0aGUgdXNlcidzIHBlcnNwZWN0aXZlIGEgc3VjY2Vzc2Z1bCBjYWxsIHRvIHRydW5jYXRlIHdpbGwgcmVzdWx0IGNvbXBsZXRlIGRhdGEgZGVsZXRpb24gZnJvbSBjZm5hbWUuCisgICBJbnRlcm5hbGx5LCBob3dldmVyLCBkaXNrIHNwYWNlIHdpbGwgbm90IGJlIGltbWVkaWF0aWx5IHJlbGVhc2VkLCBhcyB3aXRoIGFsbCBkZWxldGVzIGluIGNhc3NhbmRyYSwgdGhpcyBvbmUKKyAgIG9ubHkgbWFya3MgdGhlIGRhdGEgYXMgZGVsZXRlZC4KKyAgIFRoZSBvcGVyYXRpb24gc3VjY2VlZHMgb25seSBpZiBhbGwgaG9zdHMgaW4gdGhlIGNsdXN0ZXIgYXQgYXZhaWxhYmxlIGFuZCB3aWxsIHRocm93IGFuIFVuYXZhaWxhYmxlRXhjZXB0aW9uIGlmIAorICAgc29tZSBob3N0cyBhcmUgZG93bi4KKyAgKi8KKyAgdm9pZCB0cnVuY2F0ZSgxOnJlcXVpcmVkIHN0cmluZyBjZm5hbWUpCisgICAgICAgdGhyb3dzICgxOiBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsIDI6IFVuYXZhaWxhYmxlRXhjZXB0aW9uIHVlLCAzOiBUaW1lZE91dEV4Y2VwdGlvbiB0ZSksCisKKworICAgIAorICAvLyBNZXRhLUFQSXMgLS0gQVBJcyB0byBnZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG5vZGUgb3IgY2x1c3RlciwKKyAgLy8gcmF0aGVyIHRoYW4gdXNlciBkYXRhLiAgVGhlIG5vZGVwcm9iZSBwcm9ncmFtIHByb3ZpZGVzIHVzYWdlIGV4YW1wbGVzLgorICAKKyAgLyoqIAorICAgKiBmb3IgZWFjaCBzY2hlbWEgdmVyc2lvbiBwcmVzZW50IGluIHRoZSBjbHVzdGVyLCByZXR1cm5zIGEgbGlzdCBvZiBub2RlcyBhdCB0aGF0IHZlcnNpb24uCisgICAqIGhvc3RzIHRoYXQgZG8gbm90IHJlc3BvbmQgd2lsbCBiZSB1bmRlciB0aGUga2V5IERhdGFiYXNlRGVzY3JpcHRvci5JTklUSUFMX1ZFUlNJT04uIAorICAgKiB0aGUgY2x1c3RlciBpcyBhbGwgb24gdGhlIHNhbWUgdmVyc2lvbiBpZiB0aGUgc2l6ZSBvZiB0aGUgbWFwIGlzIDEuIAorICAgKi8KKyAgbWFwPHN0cmluZywgbGlzdDxzdHJpbmc+PiBkZXNjcmliZV9zY2hlbWFfdmVyc2lvbnMoKQorICAgICAgIHRocm93cyAoMTogSW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlKSwKKworICAvKiogbGlzdCB0aGUgZGVmaW5lZCBrZXlzcGFjZXMgaW4gdGhpcyBjbHVzdGVyICovCisgIGxpc3Q8S3NEZWY+IGRlc2NyaWJlX2tleXNwYWNlcygpCisgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSksCisKKyAgLyoqIGdldCB0aGUgY2x1c3RlciBuYW1lICovCisgIHN0cmluZyBkZXNjcmliZV9jbHVzdGVyX25hbWUoKSwKKworICAvKiogZ2V0IHRoZSB0aHJpZnQgYXBpIHZlcnNpb24gKi8KKyAgc3RyaW5nIGRlc2NyaWJlX3ZlcnNpb24oKSwKKworICAvKiogZ2V0IHRoZSB0b2tlbiByaW5nOiBhIG1hcCBvZiByYW5nZXMgdG8gaG9zdCBhZGRyZXNzZXMsCisgICAgICByZXByZXNlbnRlZCBhcyBhIHNldCBvZiBUb2tlblJhbmdlIGluc3RlYWQgb2YgYSBtYXAgZnJvbSByYW5nZQorICAgICAgdG8gbGlzdCBvZiBlbmRwb2ludHMsIGJlY2F1c2UgeW91IGNhbid0IHVzZSBUaHJpZnQgc3RydWN0cyBhcworICAgICAgbWFwIGtleXM6CisgICAgICBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNjIgCisKKyAgICAgIGZvciB0aGUgc2FtZSByZWFzb24sIHdlIGNhbid0IHJldHVybiBhIHNldCBoZXJlLCBldmVuIHRob3VnaAorICAgICAgb3JkZXIgaXMgbmVpdGhlciBpbXBvcnRhbnQgbm9yIHByZWRpY3RhYmxlLiAqLworICBsaXN0PFRva2VuUmFuZ2U+IGRlc2NyaWJlX3JpbmcoMTpyZXF1aXJlZCBzdHJpbmcga2V5c3BhY2UpCisgICAgICAgICAgICAgICAgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSksCisKKyAgLyoqIHJldHVybnMgdGhlIHBhcnRpdGlvbmVyIHVzZWQgYnkgdGhpcyBjbHVzdGVyICovCisgIHN0cmluZyBkZXNjcmliZV9wYXJ0aXRpb25lcigpLAorCisgIC8qKiByZXR1cm5zIHRoZSBzbml0Y2ggdXNlZCBieSB0aGlzIGNsdXN0ZXIgKi8KKyAgc3RyaW5nIGRlc2NyaWJlX3NuaXRjaCgpLAorCisgIC8qKiBkZXNjcmliZSBzcGVjaWZpZWQga2V5c3BhY2UgKi8KKyAgS3NEZWYgZGVzY3JpYmVfa2V5c3BhY2UoMTpyZXF1aXJlZCBzdHJpbmcga2V5c3BhY2UpCisgICAgdGhyb3dzICgxOk5vdEZvdW5kRXhjZXB0aW9uIG5mZSwgMjpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUpLAorCisgIC8qKiBleHBlcmltZW50YWwgQVBJIGZvciBoYWRvb3AvcGFyYWxsZWwgcXVlcnkgc3VwcG9ydC4gIAorICAgICAgbWF5IGNoYW5nZSB2aW9sZW50bHkgYW5kIHdpdGhvdXQgd2FybmluZy4gCisKKyAgICAgIHJldHVybnMgbGlzdCBvZiB0b2tlbiBzdHJpbmdzIHN1Y2ggdGhhdCBmaXJzdCBzdWJyYW5nZSBpcyAobGlzdFswXSwgbGlzdFsxXV0sCisgICAgICBuZXh0IGlzIChsaXN0WzFdLCBsaXN0WzJdXSwgZXRjLiAqLworICBsaXN0PHN0cmluZz4gZGVzY3JpYmVfc3BsaXRzKDE6cmVxdWlyZWQgc3RyaW5nIGNmTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOnJlcXVpcmVkIHN0cmluZyBzdGFydF90b2tlbiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzpyZXF1aXJlZCBzdHJpbmcgZW5kX3Rva2VuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ6cmVxdWlyZWQgaTMyIGtleXNfcGVyX3NwbGl0KQorICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUpLAorCisgIC8qKiBhZGRzIGEgY29sdW1uIGZhbWlseS4gcmV0dXJucyB0aGUgbmV3IHNjaGVtYSBpZC4gKi8KKyAgc3RyaW5nIHN5c3RlbV9hZGRfY29sdW1uX2ZhbWlseSgxOnJlcXVpcmVkIENmRGVmIGNmX2RlZikKKyAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlLCAyOlNjaGVtYURpc2FncmVlbWVudEV4Y2VwdGlvbiBzZGUpLAorICAgIAorICAvKiogZHJvcHMgYSBjb2x1bW4gZmFtaWx5LiByZXR1cm5zIHRoZSBuZXcgc2NoZW1hIGlkLiAqLworICBzdHJpbmcgc3lzdGVtX2Ryb3BfY29sdW1uX2ZhbWlseSgxOnJlcXVpcmVkIHN0cmluZyBjb2x1bW5fZmFtaWx5KQorICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsIDI6U2NoZW1hRGlzYWdyZWVtZW50RXhjZXB0aW9uIHNkZSksIAorICAKKyAgLyoqIGFkZHMgYSBrZXlzcGFjZSBhbmQgYW55IGNvbHVtbiBmYW1pbGllcyB0aGF0IGFyZSBwYXJ0IG9mIGl0LiByZXR1cm5zIHRoZSBuZXcgc2NoZW1hIGlkLiAqLworICBzdHJpbmcgc3lzdGVtX2FkZF9rZXlzcGFjZSgxOnJlcXVpcmVkIEtzRGVmIGtzX2RlZikKKyAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlLCAyOlNjaGVtYURpc2FncmVlbWVudEV4Y2VwdGlvbiBzZGUpLAorICAKKyAgLyoqIGRyb3BzIGEga2V5c3BhY2UgYW5kIGFueSBjb2x1bW4gZmFtaWxpZXMgdGhhdCBhcmUgcGFydCBvZiBpdC4gcmV0dXJucyB0aGUgbmV3IHNjaGVtYSBpZC4gKi8KKyAgc3RyaW5nIHN5c3RlbV9kcm9wX2tleXNwYWNlKDE6cmVxdWlyZWQgc3RyaW5nIGtleXNwYWNlKQorICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsIDI6U2NoZW1hRGlzYWdyZWVtZW50RXhjZXB0aW9uIHNkZSksCisgIAorICAvKiogdXBkYXRlcyBwcm9wZXJ0aWVzIG9mIGEga2V5c3BhY2UuIHJldHVybnMgdGhlIG5ldyBzY2hlbWEgaWQuICovCisgIHN0cmluZyBzeXN0ZW1fdXBkYXRlX2tleXNwYWNlKDE6cmVxdWlyZWQgS3NEZWYga3NfZGVmKQorICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsIDI6U2NoZW1hRGlzYWdyZWVtZW50RXhjZXB0aW9uIHNkZSksCisgICAgICAgIAorICAvKiogdXBkYXRlcyBwcm9wZXJ0aWVzIG9mIGEgY29sdW1uIGZhbWlseS4gcmV0dXJucyB0aGUgbmV3IHNjaGVtYSBpZC4gKi8KKyAgc3RyaW5nIHN5c3RlbV91cGRhdGVfY29sdW1uX2ZhbWlseSgxOnJlcXVpcmVkIENmRGVmIGNmX2RlZikKKyAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlLCAyOlNjaGVtYURpc2FncmVlbWVudEV4Y2VwdGlvbiBzZGUpLAorICAKKyAgLyoqCisgICAqIEV4ZWN1dGVzIGEgQ1FMIChDYXNzYW5kcmEgUXVlcnkgTGFuZ3VhZ2UpIHN0YXRlbWVudCBhbmQgcmV0dXJucyBhCisgICAqIENxbFJlc3VsdCBjb250YWluaW5nIHRoZSByZXN1bHRzLgorICAgKi8KKyAgQ3FsUmVzdWx0IGV4ZWN1dGVfY3FsX3F1ZXJ5KDE6cmVxdWlyZWQgYmluYXJ5IHF1ZXJ5LCAyOnJlcXVpcmVkIENvbXByZXNzaW9uIGNvbXByZXNzaW9uKQorICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsCisgICAgICAgICAgICAyOlVuYXZhaWxhYmxlRXhjZXB0aW9uIHVlLAorICAgICAgICAgICAgMzpUaW1lZE91dEV4Y2VwdGlvbiB0ZSwKKyAgICAgICAgICAgIDQ6U2NoZW1hRGlzYWdyZWVtZW50RXhjZXB0aW9uIHNkZSkKKyAgICAgICAgICAgIAorICAgICAgICAgICAgCisgIC8qKgorICAgKiBQcmVwYXJlIGEgQ1FMIChDYXNzYW5kcmEgUXVlcnkgTGFuZ3VhZ2UpIHN0YXRlbWVudCBieSBjb21waWxpbmcgYW5kIHJldHVybmluZworICAgKiAtIHRoZSB0eXBlIG9mIENRTCBzdGF0ZW1lbnQKKyAgICogLSBhbiBpZCB0b2tlbiBvZiB0aGUgY29tcGlsZWQgQ1FMIHN0b3JlZCBvbiB0aGUgc2VydmVyIHNpZGUuCisgICAqIC0gYSBjb3VudCBvZiB0aGUgZGlzY292ZXJlZCBib3VuZCBtYXJrZXJzIGluIHRoZSBzdGF0ZW1lbnQgCisgICAqLworICBDcWxQcmVwYXJlZFJlc3VsdCBwcmVwYXJlX2NxbF9xdWVyeSgxOnJlcXVpcmVkIGJpbmFyeSBxdWVyeSwgMjpyZXF1aXJlZCBDb21wcmVzc2lvbiBjb21wcmVzc2lvbikKKyAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlKQorCisgICAgICAgICAgICAgCisgIC8qKgorICAgKiBFeGVjdXRlcyBhIHByZXBhcmVkIENRTCAoQ2Fzc2FuZHJhIFF1ZXJ5IExhbmd1YWdlKSBzdGF0ZW1lbnQgYnkgcGFzc2luZyBhbiBpZCB0b2tlbiBhbmQgIGEgbGlzdCBvZiB2YXJpYWJsZXMKKyAgICogdG8gYmluZCBhbmQgcmV0dXJucyBhIENxbFJlc3VsdCBjb250YWluaW5nIHRoZSByZXN1bHRzLgorICAgKi8KKyAgQ3FsUmVzdWx0IGV4ZWN1dGVfcHJlcGFyZWRfY3FsX3F1ZXJ5KDE6cmVxdWlyZWQgaTMyIGl0ZW1JZCwgMjpyZXF1aXJlZCBsaXN0PHN0cmluZz4gdmFsdWVzKQorICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsCisgICAgICAgICAgICAyOlVuYXZhaWxhYmxlRXhjZXB0aW9uIHVlLAorICAgICAgICAgICAgMzpUaW1lZE91dEV4Y2VwdGlvbiB0ZSwKKyAgICAgICAgICAgIDQ6U2NoZW1hRGlzYWdyZWVtZW50RXhjZXB0aW9uIHNkZSkKKyAgICAgICAgICAgCisKK30KZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuUHVibGljSW50ZXJmYWNlcy5Db21waWxlLlRlc3RzL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiYjQ2MGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuUHVibGljSW50ZXJmYWNlcy5Db21waWxlLlRlc3RzL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCkBAIC0wLDAgKzEsNDAgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKKworLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZworLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KKworW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIlRocmlmdCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KKworLy8gU2V0dGluZyBDb21WaXNpYmxlIHRvIGZhbHNlIG1ha2VzIHRoZSB0eXBlcyBpbiB0aGlzIGFzc2VtYmx5IG5vdCB2aXNpYmxlCisvLyB0byBDT00gY29tcG9uZW50cy4gIElmIHlvdSBuZWVkIHRvIGFjY2VzcyBhIHR5cGUgaW4gdGhpcyBhc3NlbWJseSBmcm9tCisvLyBDT00sIHNldCB0aGUgQ29tVmlzaWJsZSBhdHRyaWJ1dGUgdG8gdHJ1ZSBvbiB0aGF0IHR5cGUuCisKK1thc3NlbWJseTogQ29tVmlzaWJsZShmYWxzZSldCisKKy8vIFRoZSBmb2xsb3dpbmcgR1VJRCBpcyBmb3IgdGhlIElEIG9mIHRoZSB0eXBlbGliIGlmIHRoaXMgcHJvamVjdCBpcyBleHBvc2VkIHRvIENPTQorCitbYXNzZW1ibHk6IEd1aWQoImQwZDM3MDZiLWZlZDUtNGNmNS1iOTg0LTA0ZjQ0OGRlOWQ3YiIpXQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHMvVGhyaWZ0LlB1YmxpY0ludGVyZmFjZXMuQ29tcGlsZS5UZXN0cy5jc3Byb2ogYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuUHVibGljSW50ZXJmYWNlcy5Db21waWxlLlRlc3RzL1RocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHMuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0YTg0YTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuUHVibGljSW50ZXJmYWNlcy5Db21waWxlLlRlc3RzL1RocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHMuY3Nwcm9qCkBAIC0wLDAgKzEsMzYgQEAKKzxQcm9qZWN0IFNkaz0iTWljcm9zb2Z0Lk5FVC5TZGsiPgorCisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxUYXJnZXRGcmFtZXdvcms+bmV0Y29yZWFwcDIuMDwvVGFyZ2V0RnJhbWV3b3JrPgorICAgIDxBc3NlbWJseU5hbWU+VGhyaWZ0LlB1YmxpY0ludGVyZmFjZXMuQ29tcGlsZS5UZXN0czwvQXNzZW1ibHlOYW1lPgorICAgIDxQYWNrYWdlSWQ+VGhyaWZ0LlB1YmxpY0ludGVyZmFjZXMuQ29tcGlsZS5UZXN0czwvUGFja2FnZUlkPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5Q29uZmlndXJhdGlvbkF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUNvbmZpZ3VyYXRpb25BdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb21wYW55QXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29tcGFueUF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseVByb2R1Y3RBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlQcm9kdWN0QXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5Q29weXJpZ2h0QXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29weXJpZ2h0QXR0cmlidXRlPgorICA8L1Byb3BlcnR5R3JvdXA+CisKKyAgPEl0ZW1Hcm91cD4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLi8uLi9UaHJpZnQvVGhyaWZ0LmNzcHJvaiIgLz4KKyAgPC9JdGVtR3JvdXA+CisKKyAgPEl0ZW1Hcm91cD4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uU2VydmljZU1vZGVsLlByaW1pdGl2ZXMiIFZlcnNpb249Ils0LjEuMCwpIiAvPgorICA8L0l0ZW1Hcm91cD4KKworICA8VGFyZ2V0IE5hbWU9IlByZUJ1aWxkIiBCZWZvcmVUYXJnZXRzPSJfR2VuZXJhdGVSZXN0b3JlUHJvamVjdFNwZWM7UmVzdG9yZTtDb21waWxlIj4KKyAgICA8RXhlYyBDb25kaXRpb249IickKE9TKScgPT0gJ1dpbmRvd3NfTlQnIiBDb21tYW5kPSJ3aGVyZSB0aHJpZnQiIENvbnNvbGVUb01TQnVpbGQ9InRydWUiPgorICAgICAgPE91dHB1dCBUYXNrUGFyYW1ldGVyPSJDb25zb2xlT3V0cHV0IiBQcm9wZXJ0eU5hbWU9IlBhdGhUb1RocmlmdCIgLz4KKyAgICA8L0V4ZWM+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSJFeGlzdHMoJyQoUGF0aFRvVGhyaWZ0KScpIiBDb21tYW5kPSIkKFBhdGhUb1RocmlmdCkgLW91dCAkKFByb2plY3REaXIpIC1nZW4gbmV0Y29yZTp3Y2YsdW5pb24sc2VyaWFsLGhhc2hjb2RlIC1yIC4vQ2Fzc2FuZHJhVGVzdC50aHJpZnQiIC8+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSJFeGlzdHMoJ3RocmlmdCcpIiBDb21tYW5kPSJ0aHJpZnQgLW91dCAkKFByb2plY3REaXIpIC1nZW4gbmV0Y29yZTp3Y2YsdW5pb24sc2VyaWFsLGhhc2hjb2RlIC1yIC4vQ2Fzc2FuZHJhVGVzdC50aHJpZnQiIC8+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSJFeGlzdHMoJyQoUHJvamVjdERpcikvLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCcpIiBDb21tYW5kPSIkKFByb2plY3REaXIpLy4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLW91dCAkKFByb2plY3REaXIpIC1nZW4gbmV0Y29yZTp3Y2YsdW5pb24sc2VyaWFsLGhhc2hjb2RlIC1yIC4vQ2Fzc2FuZHJhVGVzdC50aHJpZnQiIC8+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSJFeGlzdHMoJyQoUGF0aFRvVGhyaWZ0KScpIiBDb21tYW5kPSIkKFBhdGhUb1RocmlmdCkgLW91dCAkKFByb2plY3REaXIpIC1nZW4gbmV0Y29yZTp3Y2YsdW5pb24sc2VyaWFsLGhhc2hjb2RlIC1yIC4vLi4vLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCIgLz4KKyAgICA8RXhlYyBDb25kaXRpb249IkV4aXN0cygndGhyaWZ0JykiIENvbW1hbmQ9InRocmlmdCAtb3V0ICQoUHJvamVjdERpcikgLWdlbiBuZXRjb3JlOndjZix1bmlvbixzZXJpYWwsaGFzaGNvZGUgLXIgLi8uLi8uLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0IiAvPgorICAgIDxFeGVjIENvbmRpdGlvbj0iRXhpc3RzKCckKFByb2plY3REaXIpLy4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQnKSIgQ29tbWFuZD0iJChQcm9qZWN0RGlyKS8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1vdXQgJChQcm9qZWN0RGlyKSAtZ2VuIG5ldGNvcmU6d2NmLHVuaW9uLHNlcmlhbCxoYXNoY29kZSAtciAuLy4uLy4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQiIC8+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSJFeGlzdHMoJyQoUGF0aFRvVGhyaWZ0KScpIiBDb21tYW5kPSIkKFBhdGhUb1RocmlmdCkgLW91dCAkKFByb2plY3REaXIpIC1nZW4gbmV0Y29yZTp3Y2YsdW5pb24sc2VyaWFsLGhhc2hjb2RlIC1yIC4vLi4vLi4vLi4vLi4vY29udHJpYi9mYjMwMy9pZi9mYjMwMy50aHJpZnQiIC8+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSJFeGlzdHMoJ3RocmlmdCcpIiBDb21tYW5kPSJ0aHJpZnQgLW91dCAkKFByb2plY3REaXIpIC1nZW4gbmV0Y29yZTp3Y2YsdW5pb24sc2VyaWFsLGhhc2hjb2RlIC1yIC4vLi4vLi4vLi4vLi4vY29udHJpYi9mYjMwMy9pZi9mYjMwMy50aHJpZnQiIC8+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSJFeGlzdHMoJyQoUHJvamVjdERpcikvLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCcpIiBDb21tYW5kPSIkKFByb2plY3REaXIpLy4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLW91dCAkKFByb2plY3REaXIpIC1nZW4gbmV0Y29yZTp3Y2YsdW5pb24sc2VyaWFsLGhhc2hjb2RlIC1yIC4vLi4vLi4vLi4vLi4vY29udHJpYi9mYjMwMy9pZi9mYjMwMy50aHJpZnQiIC8+CisgIDwvVGFyZ2V0PgorCis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuVGVzdHMvQ29sbGVjdGlvbnMvVENvbGxlY3Rpb25zVGVzdHMuY3MgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuVGVzdHMvQ29sbGVjdGlvbnMvVENvbGxlY3Rpb25zVGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJlOTliNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5UZXN0cy9Db2xsZWN0aW9ucy9UQ29sbGVjdGlvbnNUZXN0cy5jcwpAQCAtMCwwICsxLDgzIEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Cit1c2luZyBUaHJpZnQuQ29sbGVjdGlvbnM7CisKK25hbWVzcGFjZSBUaHJpZnQuVGVzdHMuQ29sbGVjdGlvbnMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIFtUZXN0Q2xhc3NdCisgICAgcHVibGljIGNsYXNzIFRDb2xsZWN0aW9uc1Rlc3RzCisgICAgeworICAgICAgICAvL1RPRE86IEFkZCB0ZXN0cyBmb3IgSUVudW1lcmFibGUgd2l0aCBvYmplY3RzIGFuZCBwcmltaXRpdmUgdmFsdWVzIGluc2lkZQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBUQ29sbGVjdGlvbl9FcXVhbHNfUHJpbWl0aXZlX1Rlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgY29sbGVjdGlvbjEgPSBuZXcgTGlzdDxpbnQ+IHsxLDIsM307CisgICAgICAgICAgICB2YXIgY29sbGVjdGlvbjIgPSBuZXcgTGlzdDxpbnQ+IHsxLDIsM307CisKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBUQ29sbGVjdGlvbnMuRXF1YWxzKGNvbGxlY3Rpb24xLCBjb2xsZWN0aW9uMik7CisKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBUQ29sbGVjdGlvbl9FcXVhbHNfUHJpbWl0aXZlX0RpZmZlcmVudF9UZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGNvbGxlY3Rpb24xID0gbmV3IExpc3Q8aW50PiB7IDEsIDIsIDMgfTsKKyAgICAgICAgICAgIHZhciBjb2xsZWN0aW9uMiA9IG5ldyBMaXN0PGludD4geyAxLCAyIH07CisKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBUQ29sbGVjdGlvbnMuRXF1YWxzKGNvbGxlY3Rpb24xLCBjb2xsZWN0aW9uMik7CisKKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgVENvbGxlY3Rpb25fRXF1YWxzX09iamVjdHNfVGVzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBjb2xsZWN0aW9uMSA9IG5ldyBMaXN0PEV4YW1wbGVDbGFzcz4geyBuZXcgRXhhbXBsZUNsYXNzIHsgWCA9IDEgfSwgbmV3IEV4YW1wbGVDbGFzcyB7IFggPSAyIH0gfTsKKyAgICAgICAgICAgIHZhciBjb2xsZWN0aW9uMiA9IG5ldyBMaXN0PEV4YW1wbGVDbGFzcz4geyBuZXcgRXhhbXBsZUNsYXNzIHsgWCA9IDEgfSwgbmV3IEV4YW1wbGVDbGFzcyB7IFggPSAyIH0gfTsKKworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFRDb2xsZWN0aW9ucy5FcXVhbHMoY29sbGVjdGlvbjEsIGNvbGxlY3Rpb24yKTsKKworICAgICAgICAgICAgLy8gcmVmZXJlbmNlcyB0byBkaWZmZXJlbnQgY29sbGVjdGlvbnMKKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgVENvbGxlY3Rpb25fRXF1YWxzX09uZUFuZFRoZVNhbWVPYmplY3RfVGVzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBjb2xsZWN0aW9uMSA9IG5ldyBMaXN0PEV4YW1wbGVDbGFzcz4geyBuZXcgRXhhbXBsZUNsYXNzIHsgWCA9IDEgfSwgbmV3IEV4YW1wbGVDbGFzcyB7IFggPSAyIH0gfTsKKyAgICAgICAgICAgIHZhciBjb2xsZWN0aW9uMiA9IGNvbGxlY3Rpb24xOworCisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gVENvbGxlY3Rpb25zLkVxdWFscyhjb2xsZWN0aW9uMSwgY29sbGVjdGlvbjIpOworCisgICAgICAgICAgICAvLyByZWZlcmVuY2VzIHRvIG9uZSBhbmQgdGhlIHNhbWUgY29sbGVjdGlvbgorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBFeGFtcGxlQ2xhc3MKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIGludCBYIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5UZXN0cy9Db2xsZWN0aW9ucy9USGFzaFNldFRlc3RzLmNzIGIvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LlRlc3RzL0NvbGxlY3Rpb25zL1RIYXNoU2V0VGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRlNTczZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5UZXN0cy9Db2xsZWN0aW9ucy9USGFzaFNldFRlc3RzLmNzCkBAIC0wLDAgKzEsNzEgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwordXNpbmcgVGhyaWZ0LkNvbGxlY3Rpb25zOworCituYW1lc3BhY2UgVGhyaWZ0LlRlc3RzLkNvbGxlY3Rpb25zCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBbVGVzdENsYXNzXQorICAgIHB1YmxpYyBjbGFzcyBUSGFzaFNldFRlc3RzCisgICAgeworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgVEhhc2hTZXRfRXF1YWxzX1ByaW1pdGl2ZV9UZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgaW50IHZhbHVlID0gMTsKKworICAgICAgICAgICAgdmFyIGhhc2hTZXQgPSBuZXcgVEhhc2hTZXQ8aW50PiB7dmFsdWV9OworICAgICAgICAgICAgCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGhhc2hTZXQuQ29udGFpbnModmFsdWUpKTsKKworICAgICAgICAgICAgaGFzaFNldC5SZW1vdmUodmFsdWUpOworCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGhhc2hTZXQuQ291bnQgPT0gMCk7CisKKyAgICAgICAgICAgIGhhc2hTZXQuQWRkKHZhbHVlKTsKKworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShoYXNoU2V0LkNvbnRhaW5zKHZhbHVlKSk7CisKKyAgICAgICAgICAgIGhhc2hTZXQuQ2xlYXIoKTsKKworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShoYXNoU2V0LkNvdW50ID09IDApOworCisgICAgICAgICAgICB2YXIgbmV3QXJyID0gbmV3IGludFsxXTsKKyAgICAgICAgICAgIGhhc2hTZXQuQWRkKHZhbHVlKTsKKyAgICAgICAgICAgIGhhc2hTZXQuQ29weVRvKG5ld0FyciwgMCk7CisKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobmV3QXJyLkNvbnRhaW5zKHZhbHVlKSk7CisKKyAgICAgICAgICAgIHZhciBlbiA9IGhhc2hTZXQuR2V0RW51bWVyYXRvcigpOworICAgICAgICAgICAgZW4uTW92ZU5leHQoKTsKKworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSgoaW50KWVuLkN1cnJlbnQgPT0gdmFsdWUpOworICAgICAgICAgICAgCisgICAgICAgICAgICB1c2luZyAodmFyIGllbiA9ICgoSUVudW1lcmFibGU8aW50PiloYXNoU2V0KS5HZXRFbnVtZXJhdG9yKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWVuLk1vdmVOZXh0KCk7CisKKyAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGllbi5DdXJyZW50ID09IHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5UZXN0cy9Qcm90b2NvbHMvVEpzb25Qcm90b2NvbEhlbHBlclRlc3RzLmNzIGIvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LlRlc3RzL1Byb3RvY29scy9USnNvblByb3RvY29sSGVscGVyVGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RjODMxNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5UZXN0cy9Qcm90b2NvbHMvVEpzb25Qcm90b2NvbEhlbHBlclRlc3RzLmNzCkBAIC0wLDAgKzEsMTcyIEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzOwordXNpbmcgVGhyaWZ0LlByb3RvY29scy5FbnRpdGllczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHMuVXRpbGl0aWVzOworCituYW1lc3BhY2UgVGhyaWZ0LlRlc3RzLlByb3RvY29scworeworICAgIFtUZXN0Q2xhc3NdCisgICAgcHVibGljIGNsYXNzIFRKU09OUHJvdG9jb2xIZWxwZXJUZXN0cworICAgIHsKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEdldFR5cGVOYW1lRm9yVHlwZUlkX1Rlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBpbnB1dC9vdXRwdXQKKyAgICAgICAgICAgIHZhciBzZXRzID0gbmV3IExpc3Q8VHVwbGU8VFR5cGUsIGJ5dGVbXT4+CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV3IFR1cGxlPFRUeXBlLCBieXRlW10+KFRUeXBlLkJvb2wsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVCb29sKSwKKyAgICAgICAgICAgICAgICBuZXcgVHVwbGU8VFR5cGUsIGJ5dGVbXT4oVFR5cGUuQnl0ZSwgVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZUJ5dGUpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5JMTYsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVJMTYpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5JMzIsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVJMzIpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5JNjQsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVJNjQpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5Eb3VibGUsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVEb3VibGUpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5TdHJpbmcsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVTdHJpbmcpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5TdHJ1Y3QsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVTdHJ1Y3QpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5NYXAsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVNYXApLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5TZXQsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVTZXQpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5MaXN0LCBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlR5cGVOYW1lcy5OYW1lTGlzdCksCisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBmb3JlYWNoICh2YXIgdCBpbiBzZXRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoVEpTT05Qcm90b2NvbEhlbHBlci5HZXRUeXBlTmFtZUZvclR5cGVJZCh0Lkl0ZW0xKSA9PSB0Lkl0ZW0yLCAkIldyb25nIG1hcHBpbmcgb2YgVHlwZU5hbWUge3QuSXRlbTJ9IHRvIFRUeXBlOiB7dC5JdGVtMX0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKFRQcm90b2NvbEV4Y2VwdGlvbikpXQorICAgICAgICBwdWJsaWMgdm9pZCBHZXRUeXBlTmFtZUZvclR5cGVJZF9UU3RvcF9UZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgVEpTT05Qcm90b2NvbEhlbHBlci5HZXRUeXBlTmFtZUZvclR5cGVJZChUVHlwZS5TdG9wKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKFRQcm90b2NvbEV4Y2VwdGlvbikpXQorICAgICAgICBwdWJsaWMgdm9pZCBHZXRUeXBlTmFtZUZvclR5cGVJZF9Ob25FeGlzdGluZ1RUeXBlX1Rlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICBUSlNPTlByb3RvY29sSGVscGVyLkdldFR5cGVOYW1lRm9yVHlwZUlkKChUVHlwZSkxMDApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEdldFR5cGVJZEZvclR5cGVOYW1lX1Rlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBpbnB1dC9vdXRwdXQKKyAgICAgICAgICAgIHZhciBzZXRzID0gbmV3IExpc3Q8VHVwbGU8VFR5cGUsIGJ5dGVbXT4+CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV3IFR1cGxlPFRUeXBlLCBieXRlW10+KFRUeXBlLkJvb2wsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVCb29sKSwKKyAgICAgICAgICAgICAgICBuZXcgVHVwbGU8VFR5cGUsIGJ5dGVbXT4oVFR5cGUuQnl0ZSwgVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZUJ5dGUpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5JMTYsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVJMTYpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5JMzIsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVJMzIpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5JNjQsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVJNjQpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5Eb3VibGUsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVEb3VibGUpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5TdHJpbmcsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVTdHJpbmcpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5TdHJ1Y3QsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVTdHJ1Y3QpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5NYXAsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVNYXApLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5TZXQsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVTZXQpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5MaXN0LCBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlR5cGVOYW1lcy5OYW1lTGlzdCksCisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBmb3JlYWNoICh2YXIgdCBpbiBzZXRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoVEpTT05Qcm90b2NvbEhlbHBlci5HZXRUeXBlSWRGb3JUeXBlTmFtZSh0Lkl0ZW0yKSA9PSB0Lkl0ZW0xLCAkIldyb25nIG1hcHBpbmcgb2YgVHlwZU5hbWUge3QuSXRlbTJ9IHRvIFRUeXBlOiB7dC5JdGVtMX0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKFRQcm90b2NvbEV4Y2VwdGlvbikpXQorICAgICAgICBwdWJsaWMgdm9pZCBHZXRUeXBlSWRGb3JUeXBlTmFtZV9UU3RvcFR5cGVOYW1lX1Rlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICBUSlNPTlByb3RvY29sSGVscGVyLkdldFR5cGVJZEZvclR5cGVOYW1lKG5ldyBbXXsoYnl0ZSlUVHlwZS5TdG9wLCAoYnl0ZSlUVHlwZS5TdG9wfSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihUUHJvdG9jb2xFeGNlcHRpb24pKV0KKyAgICAgICAgcHVibGljIHZvaWQgR2V0VHlwZUlkRm9yVHlwZU5hbWVfTm9uRXhpc3RpbmdUeXBlTmFtZV9UZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgVEpTT05Qcm90b2NvbEhlbHBlci5HZXRUeXBlSWRGb3JUeXBlTmFtZShuZXcgYnl0ZVtdezEwMH0pOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoVFByb3RvY29sRXhjZXB0aW9uKSldCisgICAgICAgIHB1YmxpYyB2b2lkIEdldFR5cGVJZEZvclR5cGVOYW1lX0VtcHR5TmFtZV9UZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgVEpTT05Qcm90b2NvbEhlbHBlci5HZXRUeXBlSWRGb3JUeXBlTmFtZShuZXcgYnl0ZVtdIHt9KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBJc0pzb25OdW1lcmljX1Rlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBpbnB1dC9vdXRwdXQKKyAgICAgICAgICAgIHZhciBjb3JyZWN0SnNvbk51bWVyaWMgPSAiKy0uMDEyMzQ1Njc4OUVlIjsKKyAgICAgICAgICAgIHZhciBpbmNvcnJlY3RKc29uTnVtZXJpYyA9ICJBYUJjRGQvKlxcIjsKKworICAgICAgICAgICAgdmFyIHNldHMgPSBjb3JyZWN0SnNvbk51bWVyaWMuU2VsZWN0KGNoID0+IG5ldyBUdXBsZTxieXRlLCBib29sPigoYnl0ZSkgY2gsIHRydWUpKS5Ub0xpc3QoKTsKKyAgICAgICAgICAgIHNldHMuQWRkUmFuZ2UoaW5jb3JyZWN0SnNvbk51bWVyaWMuU2VsZWN0KGNoID0+IG5ldyBUdXBsZTxieXRlLCBib29sPigoYnl0ZSkgY2gsIGZhbHNlKSkpOworCisgICAgICAgICAgICBmb3JlYWNoICh2YXIgdCBpbiBzZXRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoVEpTT05Qcm90b2NvbEhlbHBlci5Jc0pzb25OdW1lcmljKHQuSXRlbTEpID09IHQuSXRlbTIsICQiV3JvbmcgbWFwcGluZyBvZiBDaGFyIHt0Lkl0ZW0xfSB0byBib29sOiB7dC5JdGVtMn0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBUb0hleFZhbF9UZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gaW5wdXQvb3V0cHV0CisgICAgICAgICAgICB2YXIgY2hhcnMgPSAiMDEyMzQ1Njc4OWFiY2RlZiI7CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWRIZXhWYWx1ZXMgPSBuZXcgYnl0ZVtdIHswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1fTsKKworICAgICAgICAgICAgdmFyIHNldHMgPSBjaGFycy5TZWxlY3QoKGNoLCBpKSA9PiBuZXcgVHVwbGU8Y2hhciwgYnl0ZT4oY2gsIGV4cGVjdGVkSGV4VmFsdWVzW2ldKSkuVG9MaXN0KCk7CisKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciB0IGluIHNldHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGFjdHVhbFJlc3VsdCA9IFRKU09OUHJvdG9jb2xIZWxwZXIuVG9IZXhWYWwoKGJ5dGUpdC5JdGVtMSk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShhY3R1YWxSZXN1bHQgPT0gdC5JdGVtMiwgJCJXcm9uZyBtYXBwaW5nIG9mIGNoYXIgYnl0ZSB7dC5JdGVtMX0gdG8gaXQgZXhwZWN0ZWQgaGV4IHZhbHVlOiB7dC5JdGVtMn0uIEFjdHVhbCBoZXggdmFsdWU6IHthY3R1YWxSZXN1bHR9Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihUUHJvdG9jb2xFeGNlcHRpb24pKV0KKyAgICAgICAgcHVibGljIHZvaWQgVG9IZXhWYWxfV3JvbmdJbnB1dENoYXJfVGVzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xIZWxwZXIuVG9IZXhWYWwoKGJ5dGUpJ3MnKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBUb0hleENoYXJfVGVzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGlucHV0L291dHB1dAorICAgICAgICAgICAgdmFyIGhleFZhbHVlcyA9IG5ldyBieXRlW10geyAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1IH07CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWRDaGFycyA9ICIwMTIzNDU2Nzg5YWJjZGVmIjsKKyAgICAgICAgICAgIAorCisgICAgICAgICAgICB2YXIgc2V0cyA9IGhleFZhbHVlcy5TZWxlY3QoKGh2LCBpKSA9PiBuZXcgVHVwbGU8Ynl0ZSwgY2hhcj4oaHYsIGV4cGVjdGVkQ2hhcnNbaV0pKS5Ub0xpc3QoKTsKKworICAgICAgICAgICAgZm9yZWFjaCAodmFyIHQgaW4gc2V0cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgYWN0dWFsUmVzdWx0ID0gVEpTT05Qcm90b2NvbEhlbHBlci5Ub0hleENoYXIodC5JdGVtMSk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShhY3R1YWxSZXN1bHQgPT0gdC5JdGVtMiwgJCJXcm9uZyBtYXBwaW5nIG9mIGhleCB2YWx1ZSB7dC5JdGVtMX0gdG8gaXQgZXhwZWN0ZWQgY2hhcjoge3QuSXRlbTJ9LiBBY3R1YWwgaGV4IHZhbHVlOiB7YWN0dWFsUmVzdWx0fSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5UZXN0cy9Qcm90b2NvbHMvVEpzb25Qcm90b2NvbFRlc3RzLmNzIGIvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LlRlc3RzL1Byb3RvY29scy9USnNvblByb3RvY29sVGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIzNzM2MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5UZXN0cy9Qcm90b2NvbHMvVEpzb25Qcm90b2NvbFRlc3RzLmNzCkBAIC0wLDAgKzEsNjcgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwordXNpbmcgTlN1YnN0aXR1dGU7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzOwordXNpbmcgVGhyaWZ0LlByb3RvY29scy5FbnRpdGllczsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnRzOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHMuQ2xpZW50OworCituYW1lc3BhY2UgVGhyaWZ0LlRlc3RzLlByb3RvY29scworeworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgW1Rlc3RDbGFzc10KKyAgICBwdWJsaWMgY2xhc3MgVEpTT05Qcm90b2NvbFRlc3RzCisgICAgeworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgVEpTT05Qcm90b2NvbF9DYW5fQ3JlYXRlX0luc3RhbmNlX1Rlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgaHR0cENsaWVudFRyYW5zcG9ydCA9IFN1YnN0aXR1dGUuRm9yPFRIdHRwQ2xpZW50VHJhbnNwb3J0PihuZXcgVXJpKCJodHRwOi8vbG9jYWxob3N0IiksIG51bGwpOworCisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IFRKU09OUHJvdG9jb2xXcmFwcGVyKGh0dHBDbGllbnRUcmFuc3BvcnQpOworCisgICAgICAgICAgICBBc3NlcnQuSXNOb3ROdWxsKHJlc3VsdCk7CisgICAgICAgICAgICBBc3NlcnQuSXNOb3ROdWxsKHJlc3VsdC5XcmFwcGVkQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuSXNOb3ROdWxsKHJlc3VsdC5XcmFwcGVkUmVhZGVyKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc05vdE51bGwocmVzdWx0LlRyYW5zcG9ydCk7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdC5XcmFwcGVkUmVjdXJzaW9uRGVwdGggPT0gMCk7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdC5XcmFwcGVkUmVjdXJzaW9uTGltaXQgPT0gVFByb3RvY29sLkRlZmF1bHRSZWN1cnNpb25EZXB0aCk7CisKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0LlRyYW5zcG9ydC5FcXVhbHMoaHR0cENsaWVudFRyYW5zcG9ydCkpOworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQuV3JhcHBlZENvbnRleHQuR2V0VHlwZSgpLk5hbWUuRXF1YWxzKCJKU09OQmFzZUNvbnRleHQiLCBTdHJpbmdDb21wYXJpc29uLk9yZGluYWxJZ25vcmVDYXNlKSk7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdC5XcmFwcGVkUmVhZGVyLkdldFR5cGUoKS5OYW1lLkVxdWFscygiTG9va2FoZWFkUmVhZGVyIiwgU3RyaW5nQ29tcGFyaXNvbi5PcmRpbmFsSWdub3JlQ2FzZSkpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBUSlNPTlByb3RvY29sV3JhcHBlciA6IFRKc29uUHJvdG9jb2wKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIFRKU09OUHJvdG9jb2xXcmFwcGVyKFRDbGllbnRUcmFuc3BvcnQgdHJhbnMpIDogYmFzZSh0cmFucykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIG9iamVjdCBXcmFwcGVkQ29udGV4dCA9PiBDb250ZXh0OworICAgICAgICAgICAgcHVibGljIG9iamVjdCBXcmFwcGVkUmVhZGVyID0+IFJlYWRlcjsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgV3JhcHBlZFJlY3Vyc2lvbkRlcHRoID0+IFJlY3Vyc2lvbkRlcHRoOworICAgICAgICAgICAgcHVibGljIGludCBXcmFwcGVkUmVjdXJzaW9uTGltaXQgPT4gUmVjdXJzaW9uTGltaXQ7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuVGVzdHMvVGhyaWZ0LlRlc3RzLmNzcHJvaiBiL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5UZXN0cy9UaHJpZnQuVGVzdHMuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NmYxNjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuVGVzdHMvVGhyaWZ0LlRlc3RzLmNzcHJvagpAQCAtMCwwICsxLDE4IEBACivvu788UHJvamVjdCBTZGs9Ik1pY3Jvc29mdC5ORVQuU2RrIj4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPFRhcmdldEZyYW1ld29yaz5uZXRjb3JlYXBwMi4wPC9UYXJnZXRGcmFtZXdvcms+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJDb21wYXJlTkVUT2JqZWN0cyIgVmVyc2lvbj0iNC4zLjAiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5FVC5UZXN0LlNkayIgVmVyc2lvbj0iMTUuNS4wIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9Ik1TVGVzdC5UZXN0QWRhcHRlciIgVmVyc2lvbj0iMS4yLjAiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iTVNUZXN0LlRlc3RGcmFtZXdvcmsiIFZlcnNpb249IjEuMi4wIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9Ik5TdWJzdGl0dXRlIiBWZXJzaW9uPSIzLjEuMCIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cVGhyaWZ0XFRocmlmdC5jc3Byb2oiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxTZXJ2aWNlIEluY2x1ZGU9Ins4MmE3ZjQ4ZC0zYjUwLTRiMWUtYjgyZS0zYWRhODIxMGMzNTh9IiAvPgorICA8L0l0ZW1Hcm91cD4KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQuc2xuIGIvbGliL25ldGNvcmUvVGhyaWZ0LnNsbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTMwYWE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0LnNsbgpAQCAtMCwwICsxLDg1IEBACitNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiAxMi4wMAorIyBWaXN1YWwgU3R1ZGlvIDE1CitWaXN1YWxTdHVkaW9WZXJzaW9uID0gMTUuMC4yNjczMC4xMgorTWluaW11bVZpc3VhbFN0dWRpb1ZlcnNpb24gPSAxMC4wLjQwMjE5LjEKK1Byb2plY3QoInsyMTUwRTMzMy04RkRDLTQyQTMtOTQ3NC0xQTM5NTZENDZERTh9IikgPSAiVGVzdHMiLCAiVGVzdHMiLCAie0Y1MUZDNERBLUNBQzAtNDhCMS1BMDY5LUIxNzEyQkNBQTVCRX0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OUExOTEwM0YtMTZGNy00NjY4LUJFNTQtOUExRTdBNEY3NTU2fSIpID0gIlRocmlmdCIsICJUaHJpZnRcVGhyaWZ0LmNzcHJvaiIsICJ7RDg1RjU3MkYtN0Q4MC00MEE0LTlBOUItMjczMUVEMTg3QzI0fSIKK0VuZFByb2plY3QKK1Byb2plY3QoIns5QTE5MTAzRi0xNkY3LTQ2NjgtQkU1NC05QTFFN0E0Rjc1NTZ9IikgPSAiVGhyaWZ0LkludGVncmF0aW9uVGVzdHMiLCAiVGVzdHNcVGhyaWZ0LkludGVncmF0aW9uVGVzdHNcVGhyaWZ0LkludGVncmF0aW9uVGVzdHMuY3Nwcm9qIiwgIns5RjlBMTFCRi0zQzk1LTRFODAtQUZCRi03Njg1NDE5OTY4NDR9IgorRW5kUHJvamVjdAorUHJvamVjdCgiezlBMTkxMDNGLTE2RjctNDY2OC1CRTU0LTlBMUU3QTRGNzU1Nn0iKSA9ICJUaHJpZnQuVGVzdHMiLCAiVGVzdHNcVGhyaWZ0LlRlc3RzXFRocmlmdC5UZXN0cy5jc3Byb2oiLCAiezc1QzJGOURDLTM1NDYtNEQwQS1BMkRGLTMxQzkzNTE2QjZDMX0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OUExOTEwM0YtMTZGNy00NjY4LUJFNTQtOUExRTdBNEY3NTU2fSIpID0gIlRocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHMiLCAiVGVzdHNcVGhyaWZ0LlB1YmxpY0ludGVyZmFjZXMuQ29tcGlsZS5UZXN0c1xUaHJpZnQuUHVibGljSW50ZXJmYWNlcy5Db21waWxlLlRlc3RzLmNzcHJvaiIsICJ7QTQyOUYwNUItRjUxMS00NUVGLUFFN0ItMDRFMUFFOUM5MzY3fSIKK0VuZFByb2plY3QKK0dsb2JhbAorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Db25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHByZVNvbHV0aW9uCisJCURlYnVnfEFueSBDUFUgPSBEZWJ1Z3xBbnkgQ1BVCisJCURlYnVnfHg2NCA9IERlYnVnfHg2NAorCQlEZWJ1Z3x4ODYgPSBEZWJ1Z3x4ODYKKwkJUmVsZWFzZXxBbnkgQ1BVID0gUmVsZWFzZXxBbnkgQ1BVCisJCVJlbGVhc2V8eDY0ID0gUmVsZWFzZXx4NjQKKwkJUmVsZWFzZXx4ODYgPSBSZWxlYXNlfHg4NgorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHBvc3RTb2x1dGlvbgorCQl7RDg1RjU3MkYtN0Q4MC00MEE0LTlBOUItMjczMUVEMTg3QzI0fS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0Q4NUY1NzJGLTdEODAtNDBBNC05QTlCLTI3MzFFRDE4N0MyNH0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7RDg1RjU3MkYtN0Q4MC00MEE0LTlBOUItMjczMUVEMTg3QzI0fS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7RDg1RjU3MkYtN0Q4MC00MEE0LTlBOUItMjczMUVEMTg3QzI0fS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0Q4NUY1NzJGLTdEODAtNDBBNC05QTlCLTI3MzFFRDE4N0MyNH0uRGVidWd8eDg2LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0Q4NUY1NzJGLTdEODAtNDBBNC05QTlCLTI3MzFFRDE4N0MyNH0uRGVidWd8eDg2LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtEODVGNTcyRi03RDgwLTQwQTQtOUE5Qi0yNzMxRUQxODdDMjR9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0Q4NUY1NzJGLTdEODAtNDBBNC05QTlCLTI3MzFFRDE4N0MyNH0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0Q4NUY1NzJGLTdEODAtNDBBNC05QTlCLTI3MzFFRDE4N0MyNH0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtEODVGNTcyRi03RDgwLTQwQTQtOUE5Qi0yNzMxRUQxODdDMjR9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0Q4NUY1NzJGLTdEODAtNDBBNC05QTlCLTI3MzFFRDE4N0MyNH0uUmVsZWFzZXx4ODYuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtEODVGNTcyRi03RDgwLTQwQTQtOUE5Qi0yNzMxRUQxODdDMjR9LlJlbGVhc2V8eDg2LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJezlGOUExMUJGLTNDOTUtNEU4MC1BRkJGLTc2ODU0MTk5Njg0NH0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs5RjlBMTFCRi0zQzk1LTRFODAtQUZCRi03Njg1NDE5OTY4NDR9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezlGOUExMUJGLTNDOTUtNEU4MC1BRkJGLTc2ODU0MTk5Njg0NH0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezlGOUExMUJGLTNDOTUtNEU4MC1BRkJGLTc2ODU0MTk5Njg0NH0uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs5RjlBMTFCRi0zQzk1LTRFODAtQUZCRi03Njg1NDE5OTY4NDR9LkRlYnVnfHg4Ni5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs5RjlBMTFCRi0zQzk1LTRFODAtQUZCRi03Njg1NDE5OTY4NDR9LkRlYnVnfHg4Ni5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7OUY5QTExQkYtM0M5NS00RTgwLUFGQkYtNzY4NTQxOTk2ODQ0fS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs5RjlBMTFCRi0zQzk1LTRFODAtQUZCRi03Njg1NDE5OTY4NDR9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs5RjlBMTFCRi0zQzk1LTRFODAtQUZCRi03Njg1NDE5OTY4NDR9LlJlbGVhc2V8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7OUY5QTExQkYtM0M5NS00RTgwLUFGQkYtNzY4NTQxOTk2ODQ0fS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs5RjlBMTFCRi0zQzk1LTRFODAtQUZCRi03Njg1NDE5OTY4NDR9LlJlbGVhc2V8eDg2LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7OUY5QTExQkYtM0M5NS00RTgwLUFGQkYtNzY4NTQxOTk2ODQ0fS5SZWxlYXNlfHg4Ni5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs3NUMyRjlEQy0zNTQ2LTREMEEtQTJERi0zMUM5MzUxNkI2QzF9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7NzVDMkY5REMtMzU0Ni00RDBBLUEyREYtMzFDOTM1MTZCNkMxfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs3NUMyRjlEQy0zNTQ2LTREMEEtQTJERi0zMUM5MzUxNkI2QzF9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs3NUMyRjlEQy0zNTQ2LTREMEEtQTJERi0zMUM5MzUxNkI2QzF9LkRlYnVnfHg2NC5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7NzVDMkY5REMtMzU0Ni00RDBBLUEyREYtMzFDOTM1MTZCNkMxfS5EZWJ1Z3x4ODYuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7NzVDMkY5REMtMzU0Ni00RDBBLUEyREYtMzFDOTM1MTZCNkMxfS5EZWJ1Z3x4ODYuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezc1QzJGOURDLTM1NDYtNEQwQS1BMkRGLTMxQzkzNTE2QjZDMX0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7NzVDMkY5REMtMzU0Ni00RDBBLUEyREYtMzFDOTM1MTZCNkMxfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7NzVDMkY5REMtMzU0Ni00RDBBLUEyREYtMzFDOTM1MTZCNkMxfS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezc1QzJGOURDLTM1NDYtNEQwQS1BMkRGLTMxQzkzNTE2QjZDMX0uUmVsZWFzZXx4NjQuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7NzVDMkY5REMtMzU0Ni00RDBBLUEyREYtMzFDOTM1MTZCNkMxfS5SZWxlYXNlfHg4Ni5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezc1QzJGOURDLTM1NDYtNEQwQS1BMkRGLTMxQzkzNTE2QjZDMX0uUmVsZWFzZXx4ODYuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7QTQyOUYwNUItRjUxMS00NUVGLUFFN0ItMDRFMUFFOUM5MzY3fS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0E0MjlGMDVCLUY1MTEtNDVFRi1BRTdCLTA0RTFBRTlDOTM2N30uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7QTQyOUYwNUItRjUxMS00NUVGLUFFN0ItMDRFMUFFOUM5MzY3fS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7QTQyOUYwNUItRjUxMS00NUVGLUFFN0ItMDRFMUFFOUM5MzY3fS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0E0MjlGMDVCLUY1MTEtNDVFRi1BRTdCLTA0RTFBRTlDOTM2N30uRGVidWd8eDg2LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0E0MjlGMDVCLUY1MTEtNDVFRi1BRTdCLTA0RTFBRTlDOTM2N30uRGVidWd8eDg2LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtBNDI5RjA1Qi1GNTExLTQ1RUYtQUU3Qi0wNEUxQUU5QzkzNjd9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0E0MjlGMDVCLUY1MTEtNDVFRi1BRTdCLTA0RTFBRTlDOTM2N30uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0E0MjlGMDVCLUY1MTEtNDVFRi1BRTdCLTA0RTFBRTlDOTM2N30uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtBNDI5RjA1Qi1GNTExLTQ1RUYtQUU3Qi0wNEUxQUU5QzkzNjd9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0E0MjlGMDVCLUY1MTEtNDVFRi1BRTdCLTA0RTFBRTlDOTM2N30uUmVsZWFzZXx4ODYuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtBNDI5RjA1Qi1GNTExLTQ1RUYtQUU3Qi0wNEUxQUU5QzkzNjd9LlJlbGVhc2V8eDg2LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvblByb3BlcnRpZXMpID0gcHJlU29sdXRpb24KKwkJSGlkZVNvbHV0aW9uTm9kZSA9IEZBTFNFCisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oTmVzdGVkUHJvamVjdHMpID0gcHJlU29sdXRpb24KKwkJezlGOUExMUJGLTNDOTUtNEU4MC1BRkJGLTc2ODU0MTk5Njg0NH0gPSB7RjUxRkM0REEtQ0FDMC00OEIxLUEwNjktQjE3MTJCQ0FBNUJFfQorCQl7NzVDMkY5REMtMzU0Ni00RDBBLUEyREYtMzFDOTM1MTZCNkMxfSA9IHtGNTFGQzREQS1DQUMwLTQ4QjEtQTA2OS1CMTcxMkJDQUE1QkV9CisJCXtBNDI5RjA1Qi1GNTExLTQ1RUYtQUU3Qi0wNEUxQUU5QzkzNjd9ID0ge0Y1MUZDNERBLUNBQzAtNDhCMS1BMDY5LUIxNzEyQkNBQTVCRX0KKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihFeHRlbnNpYmlsaXR5R2xvYmFscykgPSBwb3N0U29sdXRpb24KKwkJU29sdXRpb25HdWlkID0ge0ZEMjBCQzRBLTAxMDktNDFEOC04QzBDLTg5M0U3ODREN0VGOX0KKwlFbmRHbG9iYWxTZWN0aW9uCitFbmRHbG9iYWwKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9Db2xsZWN0aW9ucy9UQ29sbGVjdGlvbnMuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvQ29sbGVjdGlvbnMvVENvbGxlY3Rpb25zLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0N2JmYzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvQ29sbGVjdGlvbnMvVENvbGxlY3Rpb25zLmNzCkBAIC0wLDAgKzEsMTAxIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnM7CisKK25hbWVzcGFjZSBUaHJpZnQuQ29sbGVjdGlvbnMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBUQ29sbGVjdGlvbnMKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBUaGlzIHdpbGwgcmV0dXJuIHRydWUgaWYgdGhlIHR3byBjb2xsZWN0aW9ucyBhcmUgdmFsdWUtd2lzZSB0aGUgc2FtZS4KKyAgICAgICAgLy8vICAgICBJZiB0aGUgY29sbGVjdGlvbiBjb250YWlucyBhIGNvbGxlY3Rpb24sIHRoZSBjb2xsZWN0aW9ucyB3aWxsIGJlIGNvbXBhcmVkIHVzaW5nIHRoaXMgbWV0aG9kLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2wgRXF1YWxzKElFbnVtZXJhYmxlIGZpcnN0LCBJRW51bWVyYWJsZSBzZWNvbmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChmaXJzdCA9PSBudWxsICYmIHNlY29uZCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZmlyc3QgPT0gbnVsbCB8fCBzZWNvbmQgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBmaXRlciA9IGZpcnN0LkdldEVudW1lcmF0b3IoKTsKKyAgICAgICAgICAgIHZhciBzaXRlciA9IHNlY29uZC5HZXRFbnVtZXJhdG9yKCk7CisKKyAgICAgICAgICAgIHZhciBmbmV4dCA9IGZpdGVyLk1vdmVOZXh0KCk7CisgICAgICAgICAgICB2YXIgc25leHQgPSBzaXRlci5Nb3ZlTmV4dCgpOworCisgICAgICAgICAgICB3aGlsZSAoZm5leHQgJiYgc25leHQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGZlbnVtID0gZml0ZXIuQ3VycmVudCBhcyBJRW51bWVyYWJsZTsKKyAgICAgICAgICAgICAgICB2YXIgc2VudW0gPSBzaXRlci5DdXJyZW50IGFzIElFbnVtZXJhYmxlOworCisgICAgICAgICAgICAgICAgaWYgKGZlbnVtICE9IG51bGwgJiYgc2VudW0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghRXF1YWxzKGZlbnVtLCBzZW51bSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChmZW51bSA9PSBudWxsIF4gc2VudW0gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIUVxdWFscyhmaXRlci5DdXJyZW50LCBzaXRlci5DdXJyZW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmbmV4dCA9IGZpdGVyLk1vdmVOZXh0KCk7CisgICAgICAgICAgICAgICAgc25leHQgPSBzaXRlci5Nb3ZlTmV4dCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZm5leHQgPT0gc25leHQ7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgVGhpcyByZXR1cm5zIGEgaGFzaGNvZGUgYmFzZWQgb24gdGhlIHZhbHVlIG9mIHRoZSBlbnVtZXJhYmxlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgc3RhdGljIGludCBHZXRIYXNoQ29kZShJRW51bWVyYWJsZSBlbnVtZXJhYmxlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZW51bWVyYWJsZSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgaGFzaGNvZGUgPSAwOworCisgICAgICAgICAgICBmb3JlYWNoICh2YXIgb2JqIGluIGVudW1lcmFibGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGVudW0yID0gb2JqIGFzIElFbnVtZXJhYmxlOworICAgICAgICAgICAgICAgIHZhciBvYmpIYXNoID0gZW51bTIgPT0gbnVsbCA/IG9iai5HZXRIYXNoQ29kZSgpIDogR2V0SGFzaENvZGUoZW51bTIpOworCisgICAgICAgICAgICAgICAgdW5jaGVja2VkCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBoYXNoY29kZSA9IChoYXNoY29kZSozOTcpIF4gKG9iakhhc2gpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGhhc2hjb2RlOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9Db2xsZWN0aW9ucy9USGFzaFNldC5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Db2xsZWN0aW9ucy9USGFzaFNldC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTFmMGEwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L0NvbGxlY3Rpb25zL1RIYXNoU2V0LmNzCkBAIC0wLDAgKzEsNjcgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9uczsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOworCituYW1lc3BhY2UgVGhyaWZ0LkNvbGxlY3Rpb25zCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVEhhc2hTZXQ8VD4gOiBJQ29sbGVjdGlvbjxUPgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBIYXNoU2V0PFQ+IF9zZXQgPSBuZXcgSGFzaFNldDxUPigpOworCisgICAgICAgIHB1YmxpYyBpbnQgQ291bnQgPT4gX3NldC5Db3VudDsKKworICAgICAgICBwdWJsaWMgYm9vbCBJc1JlYWRPbmx5ID0+IGZhbHNlOworCisgICAgICAgIHB1YmxpYyB2b2lkIEFkZChUIGl0ZW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIF9zZXQuQWRkKGl0ZW0pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgQ2xlYXIoKQorICAgICAgICB7CisgICAgICAgICAgICBfc2V0LkNsZWFyKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbCBDb250YWlucyhUIGl0ZW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfc2V0LkNvbnRhaW5zKGl0ZW0pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgQ29weVRvKFRbXSBhcnJheSwgaW50IGFycmF5SW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9zZXQuQ29weVRvKGFycmF5LCBhcnJheUluZGV4KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJRW51bWVyYXRvciBHZXRFbnVtZXJhdG9yKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9zZXQuR2V0RW51bWVyYXRvcigpOworICAgICAgICB9CisKKyAgICAgICAgSUVudW1lcmF0b3I8VD4gSUVudW1lcmFibGU8VD4uR2V0RW51bWVyYXRvcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoKElFbnVtZXJhYmxlPFQ+KSBfc2V0KS5HZXRFbnVtZXJhdG9yKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbCBSZW1vdmUoVCBpdGVtKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX3NldC5SZW1vdmUoaXRlbSk7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L0lUQXN5bmNQcm9jZXNzb3IuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvSVRBc3luY1Byb2Nlc3Nvci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjhlNDBhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L0lUQXN5bmNQcm9jZXNzb3IuY3MKQEAgLTAsMCArMSwyOSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzOworCituYW1lc3BhY2UgVGhyaWZ0Cit7CisgICAgcHVibGljIGludGVyZmFjZSBJVEFzeW5jUHJvY2Vzc29yCisgICAgeworICAgICAgICBUYXNrPGJvb2w+IFByb2Nlc3NBc3luYyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCk7CisgICAgICAgIFRhc2s8Ym9vbD4gUHJvY2Vzc0FzeW5jKFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9JVFByb2Nlc3NvckZhY3RvcnkuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvSVRQcm9jZXNzb3JGYWN0b3J5LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxMzNlNWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvSVRQcm9jZXNzb3JGYWN0b3J5LmNzCkBAIC0wLDAgKzEsMjggQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFRocmlmdC5TZXJ2ZXI7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0czsKKworbmFtZXNwYWNlIFRocmlmdAoreworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGludGVyZmFjZSBJVFByb2Nlc3NvckZhY3RvcnkKKyAgICB7CisgICAgICAgIElUQXN5bmNQcm9jZXNzb3IgR2V0QXN5bmNQcm9jZXNzb3IoVENsaWVudFRyYW5zcG9ydCB0cmFucywgVEJhc2VTZXJ2ZXIgYmFzZVNlcnZlciA9IG51bGwpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM0MTcyMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMCwwICsxLDU2IEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKKworLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZworLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KKworW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJUaHJpZnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiQyMgLk5FVCBDb3JlIGJpbmRpbmdzIGZvciB0aGUgQXBhY2hlIFRocmlmdCBSUEMgc3lzdGVtIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiVGhyaWZ0IildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoIiIpXQorLy9AVE9ETyB3aGVyZSB0byBwdXQgTGljZW5zZSBpbmZvcm1hdGlvbj8KKworLy8gU2V0dGluZyBDb21WaXNpYmxlIHRvIGZhbHNlIG1ha2VzIHRoZSB0eXBlcyBpbiB0aGlzIGFzc2VtYmx5IG5vdCB2aXNpYmxlCisvLyB0byBDT00gY29tcG9uZW50cy4gIElmIHlvdSBuZWVkIHRvIGFjY2VzcyBhIGV4VHlwZSBpbiB0aGlzIGFzc2VtYmx5IGZyb20KKy8vIENPTSwgc2V0IHRoZSBDb21WaXNpYmxlIGF0dHJpYnV0ZSB0byB0cnVlIG9uIHRoYXQgZXhUeXBlLgorCitbYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQorCisvLyBUaGUgZm9sbG93aW5nIEdVSUQgaXMgZm9yIHRoZSBJRCBvZiB0aGUgdHlwZWxpYiBpZiB0aGlzIHByb2plY3QgaXMgZXhwb3NlZCB0byBDT00KKworW2Fzc2VtYmx5OiBHdWlkKCJkZjNmOGVmMC1lMGEzLTRjODYtYTY1Yi04ZWM4NGUwMTZiMWQiKV0KKworLy8gVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgYW4gYXNzZW1ibHkgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBmb3VyIHZhbHVlczoKKy8vCisvLyAgICAgIE1ham9yIFZlcnNpb24KKy8vICAgICAgTWlub3IgVmVyc2lvbgorLy8gICAgICBCdWlsZCBOdW1iZXIKKy8vICAgICAgUmV2aXNpb24KKy8vCisvLyBZb3UgY2FuIHNwZWNpZnkgYWxsIHRoZSB2YWx1ZXMgb3IgeW91IGNhbiBkZWZhdWx0IHRoZSBCdWlsZCBhbmQgUmV2aXNpb24gTnVtYmVycworLy8gYnkgdXNpbmcgdGhlICcqJyBhcyBzaG93biBiZWxvdzoKKworW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4wLjAiKV0KK1thc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMS4wLjAuMCIpXQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9URmllbGQuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0VudGl0aWVzL1RGaWVsZC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzExNTM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9URmllbGQuY3MKQEAgLTAsMCArMSwzNyBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbHMuRW50aXRpZXMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBzdHJ1Y3QgVEZpZWxkCisgICAgeworICAgICAgICBwdWJsaWMgVEZpZWxkKHN0cmluZyBuYW1lLCBUVHlwZSB0eXBlLCBzaG9ydCBpZCkKKyAgICAgICAgeworICAgICAgICAgICAgTmFtZSA9IG5hbWU7CisgICAgICAgICAgICBUeXBlID0gdHlwZTsKKyAgICAgICAgICAgIElEID0gaWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RyaW5nIE5hbWUgeyBnZXQ7IHNldDsgfQorCisgICAgICAgIHB1YmxpYyBUVHlwZSBUeXBlIHsgZ2V0OyBzZXQ7IH0KKworICAgICAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZyAtIGRvIG5vdCByZW5hbWUgLSBpdCB1c2VkIGZvciBnZW5lcmF0aW9uIAorICAgICAgICBwdWJsaWMgc2hvcnQgSUQgeyBnZXQ7IHNldDsgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0VudGl0aWVzL1RMaXN0LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9UTGlzdC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTIzMjIwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9UTGlzdC5jcwpAQCAtMCwwICsxLDMzIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCituYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29scy5FbnRpdGllcworeworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIHN0cnVjdCBUTGlzdAorICAgIHsKKyAgICAgICAgcHVibGljIFRMaXN0KFRUeXBlIGVsZW1lbnRUeXBlLCBpbnQgY291bnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEVsZW1lbnRUeXBlID0gZWxlbWVudFR5cGU7CisgICAgICAgICAgICBDb3VudCA9IGNvdW50OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRUeXBlIEVsZW1lbnRUeXBlIHsgZ2V0OyBzZXQ7IH0KKworICAgICAgICBwdWJsaWMgaW50IENvdW50IHsgZ2V0OyBzZXQ7IH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9UTWFwLmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9UTWFwLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxOTU1OTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0VudGl0aWVzL1RNYXAuY3MKQEAgLTAsMCArMSwzNiBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbHMuRW50aXRpZXMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBzdHJ1Y3QgVE1hcAorICAgIHsKKyAgICAgICAgcHVibGljIFRNYXAoVFR5cGUga2V5VHlwZSwgVFR5cGUgdmFsdWVUeXBlLCBpbnQgY291bnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEtleVR5cGUgPSBrZXlUeXBlOworICAgICAgICAgICAgVmFsdWVUeXBlID0gdmFsdWVUeXBlOworICAgICAgICAgICAgQ291bnQgPSBjb3VudDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUVHlwZSBLZXlUeXBlIHsgZ2V0OyBzZXQ7IH0KKworICAgICAgICBwdWJsaWMgVFR5cGUgVmFsdWVUeXBlIHsgZ2V0OyBzZXQ7IH0KKworICAgICAgICBwdWJsaWMgaW50IENvdW50IHsgZ2V0OyBzZXQ7IH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9UTWVzc2FnZS5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvRW50aXRpZXMvVE1lc3NhZ2UuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdmNDkyOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvRW50aXRpZXMvVE1lc3NhZ2UuY3MKQEAgLTAsMCArMSwzNyBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbHMuRW50aXRpZXMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBzdHJ1Y3QgVE1lc3NhZ2UKKyAgICB7CisgICAgICAgIHB1YmxpYyBUTWVzc2FnZShzdHJpbmcgbmFtZSwgVE1lc3NhZ2VUeXBlIHR5cGUsIGludCBzZXFpZCkKKyAgICAgICAgeworICAgICAgICAgICAgTmFtZSA9IG5hbWU7CisgICAgICAgICAgICBUeXBlID0gdHlwZTsKKyAgICAgICAgICAgIFNlcUlEID0gc2VxaWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RyaW5nIE5hbWUgeyBnZXQ7IHNldDsgfQorCisgICAgICAgIHB1YmxpYyBUTWVzc2FnZVR5cGUgVHlwZSB7IGdldDsgc2V0OyB9CisKKyAgICAgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcgLSBkbyBub3QgcmVuYW1lIC0gaXQgdXNlZCBmb3IgZ2VuZXJhdGlvbiAKKyAgICAgICAgcHVibGljIGludCBTZXFJRCB7IGdldDsgc2V0OyB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvRW50aXRpZXMvVE1lc3NhZ2VUeXBlLmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9UTWVzc2FnZVR5cGUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdiOWEyMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvRW50aXRpZXMvVE1lc3NhZ2VUeXBlLmNzCkBAIC0wLDAgKzEsMjggQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2xzLkVudGl0aWVzCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgZW51bSBUTWVzc2FnZVR5cGUKKyAgICB7CisgICAgICAgIENhbGwgPSAxLAorICAgICAgICBSZXBseSA9IDIsCisgICAgICAgIEV4Y2VwdGlvbiA9IDMsCisgICAgICAgIE9uZXdheSA9IDQKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9UU2V0LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9UU2V0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ODNiNTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0VudGl0aWVzL1RTZXQuY3MKQEAgLTAsMCArMSwzOCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbHMuRW50aXRpZXMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBzdHJ1Y3QgVFNldAorICAgIHsKKyAgICAgICAgcHVibGljIFRTZXQoVFR5cGUgZWxlbWVudFR5cGUsIGludCBjb3VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRWxlbWVudFR5cGUgPSBlbGVtZW50VHlwZTsKKyAgICAgICAgICAgIENvdW50ID0gY291bnQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFNldChUTGlzdCBsaXN0KQorICAgICAgICAgICAgOiB0aGlzKGxpc3QuRWxlbWVudFR5cGUsIGxpc3QuQ291bnQpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUVHlwZSBFbGVtZW50VHlwZSB7IGdldDsgc2V0OyB9CisKKyAgICAgICAgcHVibGljIGludCBDb3VudCB7IGdldDsgc2V0OyB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvRW50aXRpZXMvVFN0cnVjdC5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvRW50aXRpZXMvVFN0cnVjdC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjhkY2MzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9UU3RydWN0LmNzCkBAIC0wLDAgKzEsMzAgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2xzLkVudGl0aWVzCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgc3RydWN0IFRTdHJ1Y3QKKyAgICB7CisgICAgICAgIHB1YmxpYyBUU3RydWN0KHN0cmluZyBuYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBOYW1lID0gbmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdHJpbmcgTmFtZSB7IGdldDsgc2V0OyB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvRW50aXRpZXMvVFR5cGUuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0VudGl0aWVzL1RUeXBlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZTc4MWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0VudGl0aWVzL1RUeXBlLmNzCkBAIC0wLDAgKzEsMzcgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2xzLkVudGl0aWVzCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgZW51bSBUVHlwZSA6IGJ5dGUKKyAgICB7CisgICAgICAgIFN0b3AgPSAwLAorICAgICAgICBWb2lkID0gMSwKKyAgICAgICAgQm9vbCA9IDIsCisgICAgICAgIEJ5dGUgPSAzLAorICAgICAgICBEb3VibGUgPSA0LAorICAgICAgICBJMTYgPSA2LAorICAgICAgICBJMzIgPSA4LAorICAgICAgICBJNjQgPSAxMCwKKyAgICAgICAgU3RyaW5nID0gMTEsCisgICAgICAgIFN0cnVjdCA9IDEyLAorICAgICAgICBNYXAgPSAxMywKKyAgICAgICAgU2V0ID0gMTQsCisgICAgICAgIExpc3QgPSAxNQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0lUUHJvdG9jb2xGYWN0b3J5LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9JVFByb3RvY29sRmFjdG9yeS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2M1Y2M0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9JVFByb3RvY29sRmFjdG9yeS5jcwpAQCAtMCwwICsxLDI3IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBUaHJpZnQuVHJhbnNwb3J0czsKKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbHMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBpbnRlcmZhY2UgSVRQcm90b2NvbEZhY3RvcnkKKyAgICB7CisgICAgICAgIFRQcm90b2NvbCBHZXRQcm90b2NvbChUQ2xpZW50VHJhbnNwb3J0IHRyYW5zKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9UQWJzdHJhY3RCYXNlLmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9UQWJzdHJhY3RCYXNlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMTg2ODEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RBYnN0cmFjdEJhc2UuY3MKQEAgLTAsMCArMSwyOCBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2xzCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgaW50ZXJmYWNlIFRBYnN0cmFjdEJhc2UKKyAgICB7CisgICAgICAgIFRhc2sgV3JpdGVBc3luYyhUUHJvdG9jb2wgdFByb3RvY29sLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVEJhc2UuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RCYXNlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNGUxYWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RCYXNlLmNzCkBAIC0wLDAgKzEsMjggQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOworCituYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29scworeworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGludGVyZmFjZSBUQmFzZSA6IFRBYnN0cmFjdEJhc2UKKyAgICB7CisgICAgICAgIFRhc2sgUmVhZEFzeW5jKFRQcm90b2NvbCB0UHJvdG9jb2wsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9UQmluYXJ5UHJvdG9jb2wuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RCaW5hcnlQcm90b2NvbC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWVjODVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9UQmluYXJ5UHJvdG9jb2wuY3MKQEAgLTAsMCArMSw2MTMgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzLkVudGl0aWVzOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHM7CisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2xzCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVEJpbmFyeVByb3RvY29sIDogVFByb3RvY29sCisgICAgeworICAgICAgICAvL1RPRE86IFVuaXQgdGVzdHMKKyAgICAgICAgLy9UT0RPOiBMb2NhbGl6YXRpb24KKyAgICAgICAgLy9UT0RPOiBwcmFnbWEKKworICAgICAgICBwcm90ZWN0ZWQgY29uc3QgdWludCBWZXJzaW9uTWFzayA9IDB4ZmZmZjAwMDA7CisgICAgICAgIHByb3RlY3RlZCBjb25zdCB1aW50IFZlcnNpb24xID0gMHg4MDAxMDAwMDsKKworICAgICAgICBwcm90ZWN0ZWQgYm9vbCBTdHJpY3RSZWFkOworICAgICAgICBwcm90ZWN0ZWQgYm9vbCBTdHJpY3RXcml0ZTsKKworICAgICAgICBwdWJsaWMgVEJpbmFyeVByb3RvY29sKFRDbGllbnRUcmFuc3BvcnQgdHJhbnMpCisgICAgICAgICAgICA6IHRoaXModHJhbnMsIGZhbHNlLCB0cnVlKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVEJpbmFyeVByb3RvY29sKFRDbGllbnRUcmFuc3BvcnQgdHJhbnMsIGJvb2wgc3RyaWN0UmVhZCwgYm9vbCBzdHJpY3RXcml0ZSkKKyAgICAgICAgICAgIDogYmFzZSh0cmFucykKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaWN0UmVhZCA9IHN0cmljdFJlYWQ7CisgICAgICAgICAgICBTdHJpY3RXcml0ZSA9IHN0cmljdFdyaXRlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVNZXNzYWdlQmVnaW5Bc3luYyhUTWVzc2FnZSBtZXNzYWdlLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKFN0cmljdFdyaXRlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB2ZXJzaW9uID0gVmVyc2lvbjEgfCAodWludCkgbWVzc2FnZS5UeXBlOworICAgICAgICAgICAgICAgIGF3YWl0IFdyaXRlSTMyQXN5bmMoKGludCkgdmVyc2lvbiwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIGF3YWl0IFdyaXRlU3RyaW5nQXN5bmMobWVzc2FnZS5OYW1lLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgYXdhaXQgV3JpdGVJMzJBc3luYyhtZXNzYWdlLlNlcUlELCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgV3JpdGVTdHJpbmdBc3luYyhtZXNzYWdlLk5hbWUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICBhd2FpdCBXcml0ZUJ5dGVBc3luYygoc2J5dGUpIG1lc3NhZ2UuVHlwZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIGF3YWl0IFdyaXRlSTMyQXN5bmMobWVzc2FnZS5TZXFJRCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVNZXNzYWdlRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZVN0cnVjdEJlZ2luQXN5bmMoVFN0cnVjdCBAc3RydWN0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlU3RydWN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUZpZWxkQmVnaW5Bc3luYyhURmllbGQgZmllbGQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhd2FpdCBXcml0ZUJ5dGVBc3luYygoc2J5dGUpIGZpZWxkLlR5cGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSTE2QXN5bmMoZmllbGQuSUQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlRmllbGRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlRmllbGRTdG9wQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlQnl0ZUFzeW5jKChzYnl0ZSkgVFR5cGUuU3RvcCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVNYXBCZWdpbkFzeW5jKFRNYXAgbWFwLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgV3JpdGVCeXRlQXN5bmMoKHNieXRlKSBtYXAuS2V5VHlwZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgV3JpdGVCeXRlQXN5bmMoKHNieXRlKSBtYXAuVmFsdWVUeXBlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUkzMkFzeW5jKG1hcC5Db3VudCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVNYXBFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlTGlzdEJlZ2luQXN5bmMoVExpc3QgbGlzdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlQnl0ZUFzeW5jKChzYnl0ZSkgbGlzdC5FbGVtZW50VHlwZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgV3JpdGVJMzJBc3luYyhsaXN0LkNvdW50LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUxpc3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlU2V0QmVnaW5Bc3luYyhUU2V0IHNldCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlQnl0ZUFzeW5jKChzYnl0ZSkgc2V0LkVsZW1lbnRUeXBlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUkzMkFzeW5jKHNldC5Db3VudCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVTZXRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlQm9vbEFzeW5jKGJvb2wgYiwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlQnl0ZUFzeW5jKGIgPyAoc2J5dGUpIDEgOiAoc2J5dGUpIDAsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBzdGF0aWMgYnl0ZVtdIENyZWF0ZVdyaXRlQnl0ZShzYnl0ZSBiKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgYm91dCA9IG5ldyBieXRlWzFdOworCisgICAgICAgICAgICBib3V0WzBdID0gKGJ5dGUpIGI7CisKKyAgICAgICAgICAgIHJldHVybiBib3V0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVCeXRlQXN5bmMoc2J5dGUgYiwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBib3V0ID0gQ3JlYXRlV3JpdGVCeXRlKGIpOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhib3V0LCAwLCAxLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgaW50ZXJuYWwgc3RhdGljIGJ5dGVbXSBDcmVhdGVXcml0ZUkxNihzaG9ydCBzKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgaTE2T3V0ID0gbmV3IGJ5dGVbMl07CisKKyAgICAgICAgICAgIGkxNk91dFswXSA9IChieXRlKSAoMHhmZiAmIChzID4+IDgpKTsKKyAgICAgICAgICAgIGkxNk91dFsxXSA9IChieXRlKSAoMHhmZiAmIHMpOworCisgICAgICAgICAgICByZXR1cm4gaTE2T3V0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVJMTZBc3luYyhzaG9ydCBpMTYsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgaTE2T3V0ID0gQ3JlYXRlV3JpdGVJMTYoaTE2KTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoaTE2T3V0LCAwLCAyLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgaW50ZXJuYWwgc3RhdGljIGJ5dGVbXSBDcmVhdGVXcml0ZUkzMihpbnQgaTMyKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgaTMyT3V0ID0gbmV3IGJ5dGVbNF07CisKKyAgICAgICAgICAgIGkzMk91dFswXSA9IChieXRlKSAoMHhmZiAmIChpMzIgPj4gMjQpKTsKKyAgICAgICAgICAgIGkzMk91dFsxXSA9IChieXRlKSAoMHhmZiAmIChpMzIgPj4gMTYpKTsKKyAgICAgICAgICAgIGkzMk91dFsyXSA9IChieXRlKSAoMHhmZiAmIChpMzIgPj4gOCkpOworICAgICAgICAgICAgaTMyT3V0WzNdID0gKGJ5dGUpICgweGZmICYgaTMyKTsKKworICAgICAgICAgICAgcmV0dXJuIGkzMk91dDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlSTMyQXN5bmMoaW50IGkzMiwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBpMzJPdXQgPSBDcmVhdGVXcml0ZUkzMihpMzIpOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhpMzJPdXQsIDAsIDQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBzdGF0aWMgYnl0ZVtdIENyZWF0ZVdyaXRlSTY0KGxvbmcgaTY0KQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgaTY0T3V0ID0gbmV3IGJ5dGVbOF07CisKKyAgICAgICAgICAgIGk2NE91dFswXSA9IChieXRlKSAoMHhmZiAmIChpNjQgPj4gNTYpKTsKKyAgICAgICAgICAgIGk2NE91dFsxXSA9IChieXRlKSAoMHhmZiAmIChpNjQgPj4gNDgpKTsKKyAgICAgICAgICAgIGk2NE91dFsyXSA9IChieXRlKSAoMHhmZiAmIChpNjQgPj4gNDApKTsKKyAgICAgICAgICAgIGk2NE91dFszXSA9IChieXRlKSAoMHhmZiAmIChpNjQgPj4gMzIpKTsKKyAgICAgICAgICAgIGk2NE91dFs0XSA9IChieXRlKSAoMHhmZiAmIChpNjQgPj4gMjQpKTsKKyAgICAgICAgICAgIGk2NE91dFs1XSA9IChieXRlKSAoMHhmZiAmIChpNjQgPj4gMTYpKTsKKyAgICAgICAgICAgIGk2NE91dFs2XSA9IChieXRlKSAoMHhmZiAmIChpNjQgPj4gOCkpOworICAgICAgICAgICAgaTY0T3V0WzddID0gKGJ5dGUpICgweGZmICYgaTY0KTsKKworICAgICAgICAgICAgcmV0dXJuIGk2NE91dDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlSTY0QXN5bmMobG9uZyBpNjQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgaTY0T3V0ID0gQ3JlYXRlV3JpdGVJNjQoaTY0KTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoaTY0T3V0LCAwLCA4LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZURvdWJsZUFzeW5jKGRvdWJsZSBkLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgV3JpdGVJNjRBc3luYyhCaXRDb252ZXJ0ZXIuRG91YmxlVG9JbnQ2NEJpdHMoZCksIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlQmluYXJ5QXN5bmMoYnl0ZVtdIGJ5dGVzLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgV3JpdGVJMzJBc3luYyhieXRlcy5MZW5ndGgsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoYnl0ZXMsIDAsIGJ5dGVzLkxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VE1lc3NhZ2U+IFJlYWRNZXNzYWdlQmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxUTWVzc2FnZT4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgbWVzc2FnZSA9IG5ldyBUTWVzc2FnZSgpOworICAgICAgICAgICAgdmFyIHNpemUgPSBhd2FpdCBSZWFkSTMyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgaWYgKHNpemUgPCAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB2ZXJzaW9uID0gKHVpbnQpIHNpemUgJiBWZXJzaW9uTWFzazsKKyAgICAgICAgICAgICAgICBpZiAodmVyc2lvbiAhPSBWZXJzaW9uMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLkJBRF9WRVJTSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgJCJCYWQgdmVyc2lvbiBpbiBSZWFkTWVzc2FnZUJlZ2luOiB7dmVyc2lvbn0iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWVzc2FnZS5UeXBlID0gKFRNZXNzYWdlVHlwZSkgKHNpemUgJiAweDAwMDAwMGZmKTsKKyAgICAgICAgICAgICAgICBtZXNzYWdlLk5hbWUgPSBhd2FpdCBSZWFkU3RyaW5nQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIG1lc3NhZ2UuU2VxSUQgPSBhd2FpdCBSZWFkSTMyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChTdHJpY3RSZWFkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uQkFEX1ZFUlNJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAiTWlzc2luZyB2ZXJzaW9uIGluIFJlYWRNZXNzYWdlQmVnaW4sIG9sZCBjbGllbnQ/Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1lc3NhZ2UuTmFtZSA9IGF3YWl0IFJlYWRTdHJpbmdCb2R5QXN5bmMoc2l6ZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIG1lc3NhZ2UuVHlwZSA9IChUTWVzc2FnZVR5cGUpIGF3YWl0IFJlYWRCeXRlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIG1lc3NhZ2UuU2VxSUQgPSBhd2FpdCBSZWFkSTMyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkTWVzc2FnZUVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VFN0cnVjdD4gUmVhZFN0cnVjdEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vVE9ETzogbm8gcmVhZCBmcm9tIGludGVybmFsIHRyYW5zcG9ydD8KKyAgICAgICAgICAgIHJldHVybiBuZXcgVFN0cnVjdCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgUmVhZFN0cnVjdEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VEZpZWxkPiBSZWFkRmllbGRCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPFRGaWVsZD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgZmllbGQgPSBuZXcgVEZpZWxkCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVHlwZSA9IChUVHlwZSkgYXdhaXQgUmVhZEJ5dGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIGlmIChmaWVsZC5UeXBlICE9IFRUeXBlLlN0b3ApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmllbGQuSUQgPSBhd2FpdCBSZWFkSTE2QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZmllbGQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkRmllbGRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRNYXA+IFJlYWRNYXBCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPFRNYXA+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIG1hcCA9IG5ldyBUTWFwCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgS2V5VHlwZSA9IChUVHlwZSkgYXdhaXQgUmVhZEJ5dGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbiksCisgICAgICAgICAgICAgICAgVmFsdWVUeXBlID0gKFRUeXBlKSBhd2FpdCBSZWFkQnl0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKSwKKyAgICAgICAgICAgICAgICBDb3VudCA9IGF3YWl0IFJlYWRJMzJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHJldHVybiBtYXA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkTWFwRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxUTGlzdD4gUmVhZExpc3RCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPFRMaXN0PihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBsaXN0ID0gbmV3IFRMaXN0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRWxlbWVudFR5cGUgPSAoVFR5cGUpIGF3YWl0IFJlYWRCeXRlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pLAorICAgICAgICAgICAgICAgIENvdW50ID0gYXdhaXQgUmVhZEkzMkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgcmV0dXJuIGxpc3Q7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkTGlzdEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VFNldD4gUmVhZFNldEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8VFNldD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgc2V0ID0gbmV3IFRTZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFbGVtZW50VHlwZSA9IChUVHlwZSkgYXdhaXQgUmVhZEJ5dGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbiksCisgICAgICAgICAgICAgICAgQ291bnQgPSBhd2FpdCBSZWFkSTMyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB9OworCisgICAgICAgICAgICByZXR1cm4gc2V0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgUmVhZFNldEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8Ym9vbD4gUmVhZEJvb2xBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxib29sPihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkQnl0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKSA9PSAxOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8c2J5dGU+IFJlYWRCeXRlQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8c2J5dGU+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGJpbiA9IG5ldyBieXRlWzFdOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuUmVhZEFsbEFzeW5jKGJpbiwgMCwgMSwgY2FuY2VsbGF0aW9uVG9rZW4pOyAvL1RPRE86IHdoeSByZWFkYWxsID8KKyAgICAgICAgICAgIHJldHVybiAoc2J5dGUpIGJpblswXTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPHNob3J0PiBSZWFkSTE2QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8c2hvcnQ+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGkxNkluID0gbmV3IGJ5dGVbMl07CisgICAgICAgICAgICBhd2FpdCBUcmFucy5SZWFkQWxsQXN5bmMoaTE2SW4sIDAsIDIsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSAoc2hvcnQpICgoKGkxNkluWzBdICYgMHhmZikgPDwgOCkgfCBpMTZJblsxXSAmIDB4ZmYpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGludD4gUmVhZEkzMkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPGludD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgaTMySW4gPSBuZXcgYnl0ZVs0XTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLlJlYWRBbGxBc3luYyhpMzJJbiwgMCwgNCwgY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gCisgICAgICAgICAgICAgICAgKChpMzJJblswXSAmIDB4ZmYpIDw8IDI0KSB8IAorICAgICAgICAgICAgICAgICgoaTMySW5bMV0gJiAweGZmKSA8PCAxNikgfCAKKyAgICAgICAgICAgICAgICAoKGkzMkluWzJdICYgMHhmZikgPDwgOCkgfAorICAgICAgICAgICAgICAgIGkzMkluWzNdICYgMHhmZjsKKworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisjcHJhZ21hIHdhcm5pbmcgZGlzYWJsZSA2NzUKKworICAgICAgICBwcm90ZWN0ZWQgaW50ZXJuYWwgbG9uZyBDcmVhdGVSZWFkSTY0KGJ5dGVbXSBidWYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPQorICAgICAgICAgICAgICAgICgobG9uZykgKGJ1ZlswXSAmIDB4ZmYpIDw8IDU2KSB8CisgICAgICAgICAgICAgICAgKChsb25nKSAoYnVmWzFdICYgMHhmZikgPDwgNDgpIHwKKyAgICAgICAgICAgICAgICAoKGxvbmcpIChidWZbMl0gJiAweGZmKSA8PCA0MCkgfAorICAgICAgICAgICAgICAgICgobG9uZykgKGJ1ZlszXSAmIDB4ZmYpIDw8IDMyKSB8CisgICAgICAgICAgICAgICAgKChsb25nKSAoYnVmWzRdICYgMHhmZikgPDwgMjQpIHwKKyAgICAgICAgICAgICAgICAoKGxvbmcpIChidWZbNV0gJiAweGZmKSA8PCAxNikgfAorICAgICAgICAgICAgICAgICgobG9uZykgKGJ1Zls2XSAmIDB4ZmYpIDw8IDgpIHwKKyAgICAgICAgICAgICAgICBidWZbN10gJiAweGZmOworCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyNwcmFnbWEgd2FybmluZyByZXN0b3JlIDY3NQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGxvbmc+IFJlYWRJNjRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxsb25nPihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBpNjRJbiA9IG5ldyBieXRlWzhdOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuUmVhZEFsbEFzeW5jKGk2NEluLCAwLCA4LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVhZEk2NChpNjRJbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxkb3VibGU+IFJlYWREb3VibGVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxkb3VibGU+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGQgPSBhd2FpdCBSZWFkSTY0QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgcmV0dXJuIEJpdENvbnZlcnRlci5JbnQ2NEJpdHNUb0RvdWJsZShkKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGJ5dGVbXT4gUmVhZEJpbmFyeUFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPGJ5dGVbXT4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgc2l6ZSA9IGF3YWl0IFJlYWRJMzJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB2YXIgYnVmID0gbmV3IGJ5dGVbc2l6ZV07CisgICAgICAgICAgICBhd2FpdCBUcmFucy5SZWFkQWxsQXN5bmMoYnVmLCAwLCBzaXplLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICByZXR1cm4gYnVmOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrPHN0cmluZz4gUmVhZFN0cmluZ0JvZHlBc3luYyhpbnQgc2l6ZSwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxzdHJpbmc+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGJ1ZiA9IG5ldyBieXRlW3NpemVdOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuUmVhZEFsbEFzeW5jKGJ1ZiwgMCwgc2l6ZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgcmV0dXJuIEVuY29kaW5nLlVURjguR2V0U3RyaW5nKGJ1ZiwgMCwgYnVmLkxlbmd0aCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgY2xhc3MgRmFjdG9yeSA6IElUUHJvdG9jb2xGYWN0b3J5CisgICAgICAgIHsKKyAgICAgICAgICAgIHByb3RlY3RlZCBib29sIFN0cmljdFJlYWQ7CisgICAgICAgICAgICBwcm90ZWN0ZWQgYm9vbCBTdHJpY3RXcml0ZTsKKworICAgICAgICAgICAgcHVibGljIEZhY3RvcnkoKQorICAgICAgICAgICAgICAgIDogdGhpcyhmYWxzZSwgdHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIEZhY3RvcnkoYm9vbCBzdHJpY3RSZWFkLCBib29sIHN0cmljdFdyaXRlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0cmljdFJlYWQgPSBzdHJpY3RSZWFkOworICAgICAgICAgICAgICAgIFN0cmljdFdyaXRlID0gc3RyaWN0V3JpdGU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUUHJvdG9jb2wgR2V0UHJvdG9jb2woVENsaWVudFRyYW5zcG9ydCB0cmFucykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFucywgU3RyaWN0UmVhZCwgU3RyaWN0V3JpdGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVENvbXBhY3RQcm90b2NvbC5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVENvbXBhY3RQcm90b2NvbC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWNkZjAzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9UQ29tcGFjdFByb3RvY29sLmNzCkBAIC0wLDAgKzEsOTIyIEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzLkVudGl0aWVzOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHM7CisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2xzCit7CisgICAgLy9UT0RPOiBpbXBsZW1lbnRhdGlvbiBvZiBUUHJvdG9jb2wKKworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIFRDb21wYWN0UHJvdG9jb2wgOiBUUHJvdG9jb2wKKyAgICB7CisgICAgICAgIHByaXZhdGUgY29uc3QgYnl0ZSBQcm90b2NvbElkID0gMHg4MjsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBieXRlIFZlcnNpb24gPSAxOworICAgICAgICBwcml2YXRlIGNvbnN0IGJ5dGUgVmVyc2lvbk1hc2sgPSAweDFmOyAvLyAwMDAxIDExMTEKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBieXRlIFR5cGVNYXNrID0gMHhFMDsgLy8gMTExMCAwMDAwCisgICAgICAgIHByaXZhdGUgY29uc3QgYnl0ZSBUeXBlQml0cyA9IDB4MDc7IC8vIDAwMDAgMDExMQorICAgICAgICBwcml2YXRlIGNvbnN0IGludCBUeXBlU2hpZnRBbW91bnQgPSA1OworICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUU3RydWN0IEFub255bW91c1N0cnVjdCA9IG5ldyBUU3RydWN0KHN0cmluZy5FbXB0eSk7CisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRGaWVsZCBUc3RvcCA9IG5ldyBURmllbGQoc3RyaW5nLkVtcHR5LCBUVHlwZS5TdG9wLCAwKTsKKworICAgICAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBieXRlW10gVFR5cGVUb0NvbXBhY3RUeXBlID0gbmV3IGJ5dGVbMTZdOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBVc2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGxhc3QgZmllbGQgZm9yIHRoZSBjdXJyZW50IGFuZCBwcmV2aW91cyBzdHJ1Y3RzLCBzbyB3ZSBjYW4gZG8gdGhlIGRlbHRhIHN0dWZmLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFN0YWNrPHNob3J0PiBfbGFzdEZpZWxkID0gbmV3IFN0YWNrPHNob3J0PigxNSk7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIElmIHdlIGVuY291bnRlciBhIGJvb2xlYW4gZmllbGQgYmVnaW4sIHNhdmUgdGhlIFRGaWVsZCBoZXJlIHNvIGl0IGNhbiBoYXZlIHRoZSB2YWx1ZSBpbmNvcnBvcmF0ZWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgVEZpZWxkPyBfYm9vbGVhbkZpZWxkOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBJZiB3ZSBSZWFkIGEgZmllbGQgaGVhZGVyLCBhbmQgaXQncyBhIGJvb2xlYW4gZmllbGQsIHNhdmUgdGhlIGJvb2xlYW4gdmFsdWUgaGVyZSBzbyB0aGF0IFJlYWRCb29sIGNhbiB1c2UgaXQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgYm9vbD8gX2Jvb2xWYWx1ZTsKKworICAgICAgICBwcml2YXRlIHNob3J0IF9sYXN0RmllbGRJZDsKKworICAgICAgICBwdWJsaWMgVENvbXBhY3RQcm90b2NvbChUQ2xpZW50VHJhbnNwb3J0IHRyYW5zKQorICAgICAgICAgICAgOiBiYXNlKHRyYW5zKQorICAgICAgICB7CisgICAgICAgICAgICBUVHlwZVRvQ29tcGFjdFR5cGVbKGludCkgVFR5cGUuU3RvcF0gPSBUeXBlcy5TdG9wOworICAgICAgICAgICAgVFR5cGVUb0NvbXBhY3RUeXBlWyhpbnQpIFRUeXBlLkJvb2xdID0gVHlwZXMuQm9vbGVhblRydWU7CisgICAgICAgICAgICBUVHlwZVRvQ29tcGFjdFR5cGVbKGludCkgVFR5cGUuQnl0ZV0gPSBUeXBlcy5CeXRlOworICAgICAgICAgICAgVFR5cGVUb0NvbXBhY3RUeXBlWyhpbnQpIFRUeXBlLkkxNl0gPSBUeXBlcy5JMTY7CisgICAgICAgICAgICBUVHlwZVRvQ29tcGFjdFR5cGVbKGludCkgVFR5cGUuSTMyXSA9IFR5cGVzLkkzMjsKKyAgICAgICAgICAgIFRUeXBlVG9Db21wYWN0VHlwZVsoaW50KSBUVHlwZS5JNjRdID0gVHlwZXMuSTY0OworICAgICAgICAgICAgVFR5cGVUb0NvbXBhY3RUeXBlWyhpbnQpIFRUeXBlLkRvdWJsZV0gPSBUeXBlcy5Eb3VibGU7CisgICAgICAgICAgICBUVHlwZVRvQ29tcGFjdFR5cGVbKGludCkgVFR5cGUuU3RyaW5nXSA9IFR5cGVzLkJpbmFyeTsKKyAgICAgICAgICAgIFRUeXBlVG9Db21wYWN0VHlwZVsoaW50KSBUVHlwZS5MaXN0XSA9IFR5cGVzLkxpc3Q7CisgICAgICAgICAgICBUVHlwZVRvQ29tcGFjdFR5cGVbKGludCkgVFR5cGUuU2V0XSA9IFR5cGVzLlNldDsKKyAgICAgICAgICAgIFRUeXBlVG9Db21wYWN0VHlwZVsoaW50KSBUVHlwZS5NYXBdID0gVHlwZXMuTWFwOworICAgICAgICAgICAgVFR5cGVUb0NvbXBhY3RUeXBlWyhpbnQpIFRUeXBlLlN0cnVjdF0gPSBUeXBlcy5TdHJ1Y3Q7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBSZXNldCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9sYXN0RmllbGQuQ2xlYXIoKTsKKyAgICAgICAgICAgIF9sYXN0RmllbGRJZCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZU1lc3NhZ2VCZWdpbkFzeW5jKFRNZXNzYWdlIG1lc3NhZ2UsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKG5ld1tdIHtQcm90b2NvbElkfSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQKKyAgICAgICAgICAgICAgICBUcmFucy5Xcml0ZUFzeW5jKAorICAgICAgICAgICAgICAgICAgICBuZXdbXSB7KGJ5dGUpICgoVmVyc2lvbiAmIFZlcnNpb25NYXNrKSB8ICgoKHVpbnQpIG1lc3NhZ2UuVHlwZSA8PCBUeXBlU2hpZnRBbW91bnQpICYgVHlwZU1hc2spKX0sCisgICAgICAgICAgICAgICAgICAgIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgdmFyIGJ1ZmZlclR1cGxlID0gQ3JlYXRlV3JpdGVWYXJJbnQzMigodWludCkgbWVzc2FnZS5TZXFJRCk7CisgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKGJ1ZmZlclR1cGxlLkl0ZW0xLCAwLCBidWZmZXJUdXBsZS5JdGVtMiwgY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICBhd2FpdCBXcml0ZVN0cmluZ0FzeW5jKG1lc3NhZ2UuTmFtZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVNZXNzYWdlRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgV3JpdGUgYSBzdHJ1Y3QgYmVnaW4uIFRoaXMgZG9lc24ndCBhY3R1YWxseSBwdXQgYW55dGhpbmcgb24gdGhlIHdpcmUuIFdlCisgICAgICAgIC8vLyAgICAgdXNlIGl0IGFzIGFuIG9wcG9ydHVuaXR5IHRvIHB1dCBzcGVjaWFsIHBsYWNlaG9sZGVyIG1hcmtlcnMgb24gdGhlIGZpZWxkCisgICAgICAgIC8vLyAgICAgc3RhY2sgc28gd2UgY2FuIGdldCB0aGUgZmllbGQgaWQgZGVsdGFzIGNvcnJlY3QuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlU3RydWN0QmVnaW5Bc3luYyhUU3RydWN0IEBzdHJ1Y3QsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfbGFzdEZpZWxkLlB1c2goX2xhc3RGaWVsZElkKTsKKyAgICAgICAgICAgIF9sYXN0RmllbGRJZCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZVN0cnVjdEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfbGFzdEZpZWxkSWQgPSBfbGFzdEZpZWxkLlBvcCgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrIFdyaXRlRmllbGRCZWdpbkludGVybmFsQXN5bmMoVEZpZWxkIGZpZWxkLCBieXRlIHR5cGVPdmVycmlkZSwKKyAgICAgICAgICAgIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBpZiB0aGVyZSdzIGEgZXhUeXBlIG92ZXJyaWRlLCB1c2UgdGhhdC4KKyAgICAgICAgICAgIHZhciB0eXBlVG9Xcml0ZSA9IHR5cGVPdmVycmlkZSA9PSAweEZGID8gR2V0Q29tcGFjdFR5cGUoZmllbGQuVHlwZSkgOiB0eXBlT3ZlcnJpZGU7CisKKyAgICAgICAgICAgIC8vIGNoZWNrIGlmIHdlIGNhbiB1c2UgZGVsdGEgZW5jb2RpbmcgZm9yIHRoZSBmaWVsZCBpZAorICAgICAgICAgICAgaWYgKChmaWVsZC5JRCA+IF9sYXN0RmllbGRJZCkgJiYgKGZpZWxkLklEIC0gX2xhc3RGaWVsZElkIDw9IDE1KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgYiA9IChieXRlKSAoKChmaWVsZC5JRCAtIF9sYXN0RmllbGRJZCkgPDwgNCkgfCB0eXBlVG9Xcml0ZSk7CisgICAgICAgICAgICAgICAgLy8gV3JpdGUgdGhlbSB0b2dldGhlcgorICAgICAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMobmV3W10ge2J9LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gV3JpdGUgdGhlbSBzZXBhcmF0ZQorICAgICAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMobmV3W10ge3R5cGVUb1dyaXRlfSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIGF3YWl0IFdyaXRlSTE2QXN5bmMoZmllbGQuSUQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX2xhc3RGaWVsZElkID0gZmllbGQuSUQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUZpZWxkQmVnaW5Bc3luYyhURmllbGQgZmllbGQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZmllbGQuVHlwZSA9PSBUVHlwZS5Cb29sKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9ib29sZWFuRmllbGQgPSBmaWVsZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBXcml0ZUZpZWxkQmVnaW5JbnRlcm5hbEFzeW5jKGZpZWxkLCAweEZGLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUZpZWxkRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUZpZWxkU3RvcEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKG5ld1tdIHtUeXBlcy5TdG9wfSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIGFzeW5jIFRhc2sgV3JpdGVDb2xsZWN0aW9uQmVnaW5Bc3luYyhUVHlwZSBlbGVtVHlwZSwgaW50IHNpemUsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgQWJzdHJhY3QgbWV0aG9kIGZvciB3cml0aW5nIHRoZSBzdGFydCBvZiBsaXN0cyBhbmQgc2V0cy4gTGlzdCBhbmQgc2V0cyBvbgorICAgICAgICAgICAgIHRoZSB3aXJlIGRpZmZlciBvbmx5IGJ5IHRoZSBleFR5cGUgaW5kaWNhdG9yLgorICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgaWYgKHNpemUgPD0gMTQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhuZXdbXSB7KGJ5dGUpICgoc2l6ZSA8PCA0KSB8IEdldENvbXBhY3RUeXBlKGVsZW1UeXBlKSl9LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhuZXdbXSB7KGJ5dGUpICgweGYwIHwgR2V0Q29tcGFjdFR5cGUoZWxlbVR5cGUpKX0sIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgICAgIHZhciBidWZmZXJUdXBsZSA9IENyZWF0ZVdyaXRlVmFySW50MzIoKHVpbnQpIHNpemUpOworICAgICAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoYnVmZmVyVHVwbGUuSXRlbTEsIDAsIGJ1ZmZlclR1cGxlLkl0ZW0yLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUxpc3RCZWdpbkFzeW5jKFRMaXN0IGxpc3QsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUNvbGxlY3Rpb25CZWdpbkFzeW5jKGxpc3QuRWxlbWVudFR5cGUsIGxpc3QuQ291bnQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlTGlzdEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVTZXRCZWdpbkFzeW5jKFRTZXQgc2V0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgV3JpdGVDb2xsZWN0aW9uQmVnaW5Bc3luYyhzZXQuRWxlbWVudFR5cGUsIHNldC5Db3VudCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVTZXRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlQm9vbEFzeW5jKGJvb2wgYiwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICBXcml0ZSBhIGJvb2xlYW4gdmFsdWUuIFBvdGVudGlhbGx5LCB0aGlzIGNvdWxkIGJlIGEgYm9vbGVhbiBmaWVsZCwgaW4KKyAgICAgICAgICAgIHdoaWNoIGNhc2UgdGhlIGZpZWxkIGhlYWRlciBpbmZvIGlzbid0IHdyaXR0ZW4geWV0LiBJZiBzbywgZGVjaWRlIHdoYXQgdGhlCisgICAgICAgICAgICByaWdodCBleFR5cGUgaGVhZGVyIGlzIGZvciB0aGUgdmFsdWUgYW5kIHRoZW4gV3JpdGUgdGhlIGZpZWxkIGhlYWRlci4KKyAgICAgICAgICAgIE90aGVyd2lzZSwgV3JpdGUgYSBzaW5nbGUgYnl0ZS4KKyAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIGlmIChfYm9vbGVhbkZpZWxkICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gd2UgaGF2ZW4ndCB3cml0dGVuIHRoZSBmaWVsZCBoZWFkZXIgeWV0CisgICAgICAgICAgICAgICAgYXdhaXQKKyAgICAgICAgICAgICAgICAgICAgV3JpdGVGaWVsZEJlZ2luSW50ZXJuYWxBc3luYyhfYm9vbGVhbkZpZWxkLlZhbHVlLCBiID8gVHlwZXMuQm9vbGVhblRydWUgOiBUeXBlcy5Cb29sZWFuRmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgX2Jvb2xlYW5GaWVsZCA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gd2UncmUgbm90IHBhcnQgb2YgYSBmaWVsZCwgc28ganVzdCBXcml0ZSB0aGUgdmFsdWUuCisgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhuZXdbXSB7YiA/IFR5cGVzLkJvb2xlYW5UcnVlIDogVHlwZXMuQm9vbGVhbkZhbHNlfSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVCeXRlQXN5bmMoc2J5dGUgYiwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMobmV3W10geyhieXRlKSBifSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVJMTZBc3luYyhzaG9ydCBpMTYsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgYnVmZmVyVHVwbGUgPSBDcmVhdGVXcml0ZVZhckludDMyKEludFRvWmlnemFnKGkxNikpOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhidWZmZXJUdXBsZS5JdGVtMSwgMCwgYnVmZmVyVHVwbGUuSXRlbTIsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBUdXBsZTxieXRlW10sIGludD4gQ3JlYXRlV3JpdGVWYXJJbnQzMih1aW50IG4pCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFdyaXRlIGFuIGkzMiBhcyBhIHZhcmludC5SZXN1bHRzIGluIDEgLSA1IGJ5dGVzIG9uIHRoZSB3aXJlLgorICAgICAgICAgICAgdmFyIGkzMkJ1ZiA9IG5ldyBieXRlWzVdOworICAgICAgICAgICAgdmFyIGlkeCA9IDA7CisKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgobiAmIH4weDdGKSA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaTMyQnVmW2lkeCsrXSA9IChieXRlKSBuOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpMzJCdWZbaWR4KytdID0gKGJ5dGUpICgobiAmIDB4N0YpIHwgMHg4MCk7CisgICAgICAgICAgICAgICAgbiA+Pj0gNzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG5ldyBUdXBsZTxieXRlW10sIGludD4oaTMyQnVmLCBpZHgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVJMzJBc3luYyhpbnQgaTMyLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGJ1ZmZlclR1cGxlID0gQ3JlYXRlV3JpdGVWYXJJbnQzMihJbnRUb1ppZ3phZyhpMzIpKTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoYnVmZmVyVHVwbGUuSXRlbTEsIDAsIGJ1ZmZlclR1cGxlLkl0ZW0yLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgaW50ZXJuYWwgVHVwbGU8Ynl0ZVtdLCBpbnQ+IENyZWF0ZVdyaXRlVmFySW50NjQodWxvbmcgbikKKyAgICAgICAgeworICAgICAgICAgICAgLy8gV3JpdGUgYW4gaTY0IGFzIGEgdmFyaW50LiBSZXN1bHRzIGluIDEtMTAgYnl0ZXMgb24gdGhlIHdpcmUuCisgICAgICAgICAgICB2YXIgYnVmID0gbmV3IGJ5dGVbMTBdOworICAgICAgICAgICAgdmFyIGlkeCA9IDA7CisKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgobiAmIH4odWxvbmcpIDB4N0ZMKSA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmW2lkeCsrXSA9IChieXRlKSBuOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnVmW2lkeCsrXSA9IChieXRlKSAoKG4gJiAweDdGKSB8IDB4ODApOworICAgICAgICAgICAgICAgIG4gPj49IDc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgVHVwbGU8Ynl0ZVtdLCBpbnQ+KGJ1ZiwgaWR4KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlSTY0QXN5bmMobG9uZyBpNjQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgYnVmZmVyVHVwbGUgPSBDcmVhdGVXcml0ZVZhckludDY0KExvbmdUb1ppZ3phZyhpNjQpKTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoYnVmZmVyVHVwbGUuSXRlbTEsIDAsIGJ1ZmZlclR1cGxlLkl0ZW0yLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZURvdWJsZUFzeW5jKGRvdWJsZSBkLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGRhdGEgPSBuZXcgYnl0ZVs4XTsKKyAgICAgICAgICAgIEZpeGVkTG9uZ1RvQnl0ZXMoQml0Q29udmVydGVyLkRvdWJsZVRvSW50NjRCaXRzKGQpLCBkYXRhLCAwKTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoZGF0YSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVTdHJpbmdBc3luYyhzdHJpbmcgc3RyLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGJ5dGVzID0gRW5jb2RpbmcuVVRGOC5HZXRCeXRlcyhzdHIpOworCisgICAgICAgICAgICB2YXIgYnVmZmVyVHVwbGUgPSBDcmVhdGVXcml0ZVZhckludDMyKCh1aW50KSBieXRlcy5MZW5ndGgpOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhidWZmZXJUdXBsZS5JdGVtMSwgMCwgYnVmZmVyVHVwbGUuSXRlbTIsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoYnl0ZXMsIDAsIGJ5dGVzLkxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVCaW5hcnlBc3luYyhieXRlW10gYnl0ZXMsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgYnVmZmVyVHVwbGUgPSBDcmVhdGVXcml0ZVZhckludDMyKCh1aW50KSBieXRlcy5MZW5ndGgpOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhidWZmZXJUdXBsZS5JdGVtMSwgMCwgYnVmZmVyVHVwbGUuSXRlbTIsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoYnl0ZXMsIDAsIGJ5dGVzLkxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVNYXBCZWdpbkFzeW5jKFRNYXAgbWFwLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1hcC5Db3VudCA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMobmV3W10geyhieXRlKSAwfSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBidWZmZXJUdXBsZSA9IENyZWF0ZVdyaXRlVmFySW50MzIoKHVpbnQpIG1hcC5Db3VudCk7CisgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhidWZmZXJUdXBsZS5JdGVtMSwgMCwgYnVmZmVyVHVwbGUuSXRlbTIsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICBhd2FpdAorICAgICAgICAgICAgICAgICAgICBUcmFucy5Xcml0ZUFzeW5jKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3W10geyhieXRlKSAoKEdldENvbXBhY3RUeXBlKG1hcC5LZXlUeXBlKSA8PCA0KSB8IEdldENvbXBhY3RUeXBlKG1hcC5WYWx1ZVR5cGUpKX0sCisgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZU1hcEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VE1lc3NhZ2U+IFJlYWRNZXNzYWdlQmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxUTWVzc2FnZT4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgcHJvdG9jb2xJZCA9IChieXRlKSBhd2FpdCBSZWFkQnl0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGlmIChwcm90b2NvbElkICE9IFByb3RvY29sSWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigkIkV4cGVjdGVkIHByb3RvY29sIGlkIHtQcm90b2NvbElkOlh9IGJ1dCBnb3Qge3Byb3RvY29sSWQ6WH0iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHZlcnNpb25BbmRUeXBlID0gKGJ5dGUpIGF3YWl0IFJlYWRCeXRlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgdmFyIHZlcnNpb24gPSAoYnl0ZSkgKHZlcnNpb25BbmRUeXBlICYgVmVyc2lvbk1hc2spOworCisgICAgICAgICAgICBpZiAodmVyc2lvbiAhPSBWZXJzaW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oJCJFeHBlY3RlZCB2ZXJzaW9uIHtWZXJzaW9ufSBidXQgZ290IHt2ZXJzaW9ufSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgdHlwZSA9IChieXRlKSAoKHZlcnNpb25BbmRUeXBlID4+IFR5cGVTaGlmdEFtb3VudCkgJiBUeXBlQml0cyk7CisgICAgICAgICAgICB2YXIgc2VxaWQgPSAoaW50KSBhd2FpdCBSZWFkVmFySW50MzJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB2YXIgbWVzc2FnZU5hbWUgPSBhd2FpdCBSZWFkU3RyaW5nQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICByZXR1cm4gbmV3IFRNZXNzYWdlKG1lc3NhZ2VOYW1lLCAoVE1lc3NhZ2VUeXBlKSB0eXBlLCBzZXFpZCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkTWVzc2FnZUVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VFN0cnVjdD4gUmVhZFN0cnVjdEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8VFN0cnVjdD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBzb21lIG1hZ2ljIGlzIGhlcmUgKQorCisgICAgICAgICAgICBfbGFzdEZpZWxkLlB1c2goX2xhc3RGaWVsZElkKTsKKyAgICAgICAgICAgIF9sYXN0RmllbGRJZCA9IDA7CisKKyAgICAgICAgICAgIHJldHVybiBBbm9ueW1vdXNTdHJ1Y3Q7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkU3RydWN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICBEb2Vzbid0IGFjdHVhbGx5IGNvbnN1bWUgYW55IHdpcmUgZGF0YSwganVzdCByZW1vdmVzIHRoZSBsYXN0IGZpZWxkIGZvcgorICAgICAgICAgICAgdGhpcyBzdHJ1Y3QgZnJvbSB0aGUgZmllbGQgc3RhY2suCisgICAgICAgICAgICAqLworCisgICAgICAgICAgICAvLyBjb25zdW1lIHRoZSBsYXN0IGZpZWxkIHdlIFJlYWQgb2ZmIHRoZSB3aXJlLgorICAgICAgICAgICAgX2xhc3RGaWVsZElkID0gX2xhc3RGaWVsZC5Qb3AoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRGaWVsZD4gUmVhZEZpZWxkQmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgLy8gUmVhZCBhIGZpZWxkIGhlYWRlciBvZmYgdGhlIHdpcmUuCisgICAgICAgICAgICB2YXIgdHlwZSA9IChieXRlKSBhd2FpdCBSZWFkQnl0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIC8vIGlmIGl0J3MgYSBzdG9wLCB0aGVuIHdlIGNhbiByZXR1cm4gaW1tZWRpYXRlbHksIGFzIHRoZSBzdHJ1Y3QgaXMgb3Zlci4KKyAgICAgICAgICAgIGlmICh0eXBlID09IFR5cGVzLlN0b3ApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRzdG9wOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzaG9ydCBmaWVsZElkOworICAgICAgICAgICAgLy8gbWFzayBvZmYgdGhlIDQgTVNCIG9mIHRoZSBleFR5cGUgaGVhZGVyLiBpdCBjb3VsZCBjb250YWluIGEgZmllbGQgaWQgZGVsdGEuCisgICAgICAgICAgICB2YXIgbW9kaWZpZXIgPSAoc2hvcnQpICgodHlwZSAmIDB4ZjApID4+IDQpOworICAgICAgICAgICAgaWYgKG1vZGlmaWVyID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmllbGRJZCA9IGF3YWl0IFJlYWRJMTZBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmllbGRJZCA9IChzaG9ydCkgKF9sYXN0RmllbGRJZCArIG1vZGlmaWVyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGZpZWxkID0gbmV3IFRGaWVsZChzdHJpbmcuRW1wdHksIEdldFRUeXBlKChieXRlKSAodHlwZSAmIDB4MGYpKSwgZmllbGRJZCk7CisgICAgICAgICAgICAvLyBpZiB0aGlzIGhhcHBlbnMgdG8gYmUgYSBib29sZWFuIGZpZWxkLCB0aGUgdmFsdWUgaXMgZW5jb2RlZCBpbiB0aGUgZXhUeXBlCisgICAgICAgICAgICBpZiAoSXNCb29sVHlwZSh0eXBlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfYm9vbFZhbHVlID0gKGJ5dGUpICh0eXBlICYgMHgwZikgPT0gVHlwZXMuQm9vbGVhblRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHB1c2ggdGhlIG5ldyBmaWVsZCBvbnRvIHRoZSBmaWVsZCBzdGFjayBzbyB3ZSBjYW4ga2VlcCB0aGUgZGVsdGFzIGdvaW5nLgorICAgICAgICAgICAgX2xhc3RGaWVsZElkID0gZmllbGQuSUQ7CisgICAgICAgICAgICByZXR1cm4gZmllbGQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkRmllbGRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRNYXA+IFJlYWRNYXBCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8VE1hcD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgUmVhZCBhIG1hcCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgc2l6ZSBpcyB6ZXJvLCBza2lwIFJlYWRpbmcgdGhlIGtleQorICAgICAgICAgICAgYW5kIHZhbHVlIGV4VHlwZS4gVGhpcyBtZWFucyB0aGF0IDAtbGVuZ3RoIG1hcHMgd2lsbCB5aWVsZCBUTWFwcyB3aXRob3V0IHRoZQorICAgICAgICAgICAgImNvcnJlY3QiIHR5cGVzLgorICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgdmFyIHNpemUgPSAoaW50KSBhd2FpdCBSZWFkVmFySW50MzJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB2YXIga2V5QW5kVmFsdWVUeXBlID0gc2l6ZSA9PSAwID8gKGJ5dGUpIDAgOiAoYnl0ZSkgYXdhaXQgUmVhZEJ5dGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICByZXR1cm4gbmV3IFRNYXAoR2V0VFR5cGUoKGJ5dGUpIChrZXlBbmRWYWx1ZVR5cGUgPj4gNCkpLCBHZXRUVHlwZSgoYnl0ZSkgKGtleUFuZFZhbHVlVHlwZSAmIDB4ZikpLCBzaXplKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRNYXBFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRTZXQ+IFJlYWRTZXRCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgUmVhZCBhIHNldCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgc2V0IHNpemUgaXMgMC0xNCwgdGhlIHNpemUgd2lsbAorICAgICAgICAgICAgYmUgcGFja2VkIGludG8gdGhlIGVsZW1lbnQgZXhUeXBlIGhlYWRlci4gSWYgaXQncyBhIGxvbmdlciBzZXQsIHRoZSA0IE1TQgorICAgICAgICAgICAgb2YgdGhlIGVsZW1lbnQgZXhUeXBlIGhlYWRlciB3aWxsIGJlIDB4RiwgYW5kIGEgdmFyaW50IHdpbGwgZm9sbG93IHdpdGggdGhlCisgICAgICAgICAgICB0cnVlIHNpemUuCisgICAgICAgICAgICAqLworCisgICAgICAgICAgICByZXR1cm4gbmV3IFRTZXQoYXdhaXQgUmVhZExpc3RCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxib29sPiBSZWFkQm9vbEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPGJvb2w+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgIFJlYWQgYSBib29sZWFuIG9mZiB0aGUgd2lyZS4gSWYgdGhpcyBpcyBhIGJvb2xlYW4gZmllbGQsIHRoZSB2YWx1ZSBzaG91bGQKKyAgICAgICAgICAgIGFscmVhZHkgaGF2ZSBiZWVuIFJlYWQgZHVyaW5nIFJlYWRGaWVsZEJlZ2luLCBzbyB3ZSdsbCBqdXN0IGNvbnN1bWUgdGhlCisgICAgICAgICAgICBwcmUtc3RvcmVkIHZhbHVlLiBPdGhlcndpc2UsIFJlYWQgYSBieXRlLgorICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgaWYgKF9ib29sVmFsdWUgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2Jvb2xWYWx1ZS5WYWx1ZTsKKyAgICAgICAgICAgICAgICBfYm9vbFZhbHVlID0gbnVsbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gYXdhaXQgUmVhZEJ5dGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbikgPT0gVHlwZXMuQm9vbGVhblRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxzYnl0ZT4gUmVhZEJ5dGVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxzYnl0ZT4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBSZWFkIGEgc2luZ2xlIGJ5dGUgb2ZmIHRoZSB3aXJlLiBOb3RoaW5nIGludGVyZXN0aW5nIGhlcmUuCisgICAgICAgICAgICB2YXIgYnVmID0gbmV3IGJ5dGVbMV07CisgICAgICAgICAgICBhd2FpdCBUcmFucy5SZWFkQWxsQXN5bmMoYnVmLCAwLCAxLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICByZXR1cm4gKHNieXRlKSBidWZbMF07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxzaG9ydD4gUmVhZEkxNkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPHNob3J0PihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiAoc2hvcnQpIFppZ3phZ1RvSW50KGF3YWl0IFJlYWRWYXJJbnQzMkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxpbnQ+IFJlYWRJMzJBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxpbnQ+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIFppZ3phZ1RvSW50KGF3YWl0IFJlYWRWYXJJbnQzMkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxsb25nPiBSZWFkSTY0QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8bG9uZz4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gWmlnemFnVG9Mb25nKGF3YWl0IFJlYWRWYXJJbnQ2NEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxkb3VibGU+IFJlYWREb3VibGVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxkb3VibGU+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGxvbmdCaXRzID0gbmV3IGJ5dGVbOF07CisgICAgICAgICAgICBhd2FpdCBUcmFucy5SZWFkQWxsQXN5bmMobG9uZ0JpdHMsIDAsIDgsIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgcmV0dXJuIEJpdENvbnZlcnRlci5JbnQ2NEJpdHNUb0RvdWJsZShCeXRlc1RvTG9uZyhsb25nQml0cykpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8c3RyaW5nPiBSZWFkU3RyaW5nQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxzdHJpbmc+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUmVhZHMgYSBieXRlW10gKHZpYSBSZWFkQmluYXJ5KSwgYW5kIHRoZW4gVVRGLTggZGVjb2RlcyBpdC4KKyAgICAgICAgICAgIHZhciBsZW5ndGggPSAoaW50KSBhd2FpdCBSZWFkVmFySW50MzJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgIGlmIChsZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nLkVtcHR5OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgYnVmID0gbmV3IGJ5dGVbbGVuZ3RoXTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLlJlYWRBbGxBc3luYyhidWYsIDAsIGxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICByZXR1cm4gRW5jb2RpbmcuVVRGOC5HZXRTdHJpbmcoYnVmKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGJ5dGVbXT4gUmVhZEJpbmFyeUFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPGJ5dGVbXT4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBSZWFkIGEgYnl0ZVtdIGZyb20gdGhlIHdpcmUuCisgICAgICAgICAgICB2YXIgbGVuZ3RoID0gKGludCkgYXdhaXQgUmVhZFZhckludDMyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgaWYgKGxlbmd0aCA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgYnl0ZVswXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGJ1ZiA9IG5ldyBieXRlW2xlbmd0aF07CisgICAgICAgICAgICBhd2FpdCBUcmFucy5SZWFkQWxsQXN5bmMoYnVmLCAwLCBsZW5ndGgsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHJldHVybiBidWY7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxUTGlzdD4gUmVhZExpc3RCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8VExpc3Q+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgIFJlYWQgYSBsaXN0IGhlYWRlciBvZmYgdGhlIHdpcmUuIElmIHRoZSBsaXN0IHNpemUgaXMgMC0xNCwgdGhlIHNpemUgd2lsbAorICAgICAgICAgICAgYmUgcGFja2VkIGludG8gdGhlIGVsZW1lbnQgZXhUeXBlIGhlYWRlci4gSWYgaXQncyBhIGxvbmdlciBsaXN0LCB0aGUgNCBNU0IKKyAgICAgICAgICAgIG9mIHRoZSBlbGVtZW50IGV4VHlwZSBoZWFkZXIgd2lsbCBiZSAweEYsIGFuZCBhIHZhcmludCB3aWxsIGZvbGxvdyB3aXRoIHRoZQorICAgICAgICAgICAgdHJ1ZSBzaXplLgorICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgdmFyIHNpemVBbmRUeXBlID0gKGJ5dGUpIGF3YWl0IFJlYWRCeXRlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgdmFyIHNpemUgPSAoc2l6ZUFuZFR5cGUgPj4gNCkgJiAweDBmOworICAgICAgICAgICAgaWYgKHNpemUgPT0gMTUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2l6ZSA9IChpbnQpIGF3YWl0IFJlYWRWYXJJbnQzMkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHR5cGUgPSBHZXRUVHlwZShzaXplQW5kVHlwZSk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFRMaXN0KHR5cGUsIHNpemUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgUmVhZExpc3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRTZXRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGUgR2V0Q29tcGFjdFR5cGUoVFR5cGUgdHR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEdpdmVuIGEgVFR5cGUgdmFsdWUsIGZpbmQgdGhlIGFwcHJvcHJpYXRlIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMgY29uc3RhbnQuCisgICAgICAgICAgICByZXR1cm4gVFR5cGVUb0NvbXBhY3RUeXBlWyhpbnQpIHR0eXBlXTsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrPHVpbnQ+IFJlYWRWYXJJbnQzMkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPHVpbnQ+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgIFJlYWQgYW4gaTMyIGZyb20gdGhlIHdpcmUgYXMgYSB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorICAgICAgICAgICAgaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gUmVhZCB1cCB0byA1IGJ5dGVzLgorICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgdWludCByZXN1bHQgPSAwOworICAgICAgICAgICAgdmFyIHNoaWZ0ID0gMDsKKworICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGIgPSAoYnl0ZSkgYXdhaXQgUmVhZEJ5dGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgcmVzdWx0IHw9ICh1aW50KSAoYiAmIDB4N2YpIDw8IHNoaWZ0OworICAgICAgICAgICAgICAgIGlmICgoYiAmIDB4ODApICE9IDB4ODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2hpZnQgKz0gNzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYXN5bmMgVGFzazx1bG9uZz4gUmVhZFZhckludDY0QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8dWludD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgUmVhZCBhbiBpNjQgZnJvbSB0aGUgd2lyZSBhcyBhIHByb3BlciB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorICAgICAgICAgICAgaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gUmVhZCB1cCB0byAxMCBieXRlcy4KKyAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIHZhciBzaGlmdCA9IDA7CisgICAgICAgICAgICB1bG9uZyByZXN1bHQgPSAwOworICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGIgPSAoYnl0ZSkgYXdhaXQgUmVhZEJ5dGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgcmVzdWx0IHw9ICh1bG9uZykgKGIgJiAweDdmKSA8PCBzaGlmdDsKKyAgICAgICAgICAgICAgICBpZiAoKGIgJiAweDgwKSAhPSAweDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNoaWZ0ICs9IDc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgWmlnemFnVG9JbnQodWludCBuKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKGludCkgKG4gPj4gMSkgXiAtKGludCkgKG4gJiAxKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGxvbmcgWmlnemFnVG9Mb25nKHVsb25nIG4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAobG9uZykgKG4gPj4gMSkgXiAtKGxvbmcpIChuICYgMSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBsb25nIEJ5dGVzVG9Mb25nKGJ5dGVbXSBieXRlcykKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgIE5vdGUgdGhhdCBpdCdzIGltcG9ydGFudCB0aGF0IHRoZSBtYXNrIGJ5dGVzIGFyZSBsb25nIGxpdGVyYWxzLAorICAgICAgICAgICAgb3RoZXJ3aXNlIHRoZXknbGwgZGVmYXVsdCB0byBpbnRzLCBhbmQgd2hlbiB5b3Ugc2hpZnQgYW4gaW50IGxlZnQgNTYgYml0cywKKyAgICAgICAgICAgIHlvdSBqdXN0IGdldCBhIG1lc3NlZCB1cCBpbnQuCisgICAgICAgICAgICAqLworCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICAoKGJ5dGVzWzddICYgMHhmZkwpIDw8IDU2KSB8CisgICAgICAgICAgICAgICAgKChieXRlc1s2XSAmIDB4ZmZMKSA8PCA0OCkgfAorICAgICAgICAgICAgICAgICgoYnl0ZXNbNV0gJiAweGZmTCkgPDwgNDApIHwKKyAgICAgICAgICAgICAgICAoKGJ5dGVzWzRdICYgMHhmZkwpIDw8IDMyKSB8CisgICAgICAgICAgICAgICAgKChieXRlc1szXSAmIDB4ZmZMKSA8PCAyNCkgfAorICAgICAgICAgICAgICAgICgoYnl0ZXNbMl0gJiAweGZmTCkgPDwgMTYpIHwKKyAgICAgICAgICAgICAgICAoKGJ5dGVzWzFdICYgMHhmZkwpIDw8IDgpIHwKKyAgICAgICAgICAgICAgICAoYnl0ZXNbMF0gJiAweGZmTCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sIElzQm9vbFR5cGUoYnl0ZSBiKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgbG93ZXJOaWJibGUgPSBiICYgMHgwZjsKKyAgICAgICAgICAgIHJldHVybiAobG93ZXJOaWJibGUgPT0gVHlwZXMuQm9vbGVhblRydWUpIHx8IChsb3dlck5pYmJsZSA9PSBUeXBlcy5Cb29sZWFuRmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgVFR5cGUgR2V0VFR5cGUoYnl0ZSB0eXBlKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBHaXZlbiBhIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMgY29uc3RhbnQsIGNvbnZlcnQgaXQgdG8gaXRzIGNvcnJlc3BvbmRpbmcgVFR5cGUgdmFsdWUuCisgICAgICAgICAgICBzd2l0Y2ggKChieXRlKSAodHlwZSAmIDB4MGYpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuU3RvcDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRUeXBlLlN0b3A7CisgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5Cb29sZWFuRmFsc2U6CisgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5Cb29sZWFuVHJ1ZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRUeXBlLkJvb2w7CisgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5CeXRlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFR5cGUuQnl0ZTsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkkxNjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRUeXBlLkkxNjsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkkzMjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRUeXBlLkkzMjsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkk2NDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRUeXBlLkk2NDsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkRvdWJsZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRUeXBlLkRvdWJsZTsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkJpbmFyeToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRUeXBlLlN0cmluZzsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkxpc3Q6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUVHlwZS5MaXN0OworICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuU2V0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFR5cGUuU2V0OworICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuTWFwOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFR5cGUuTWFwOworICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuU3RydWN0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFR5cGUuU3RydWN0OworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oJCJEb24ndCBrbm93IHdoYXQgZXhUeXBlOiB7KGJ5dGUpICh0eXBlICYgMHgwZil9Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB1bG9uZyBMb25nVG9aaWd6YWcobG9uZyBuKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBDb252ZXJ0IGwgaW50byBhIHppZ3phZyBsb25nLiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludAorICAgICAgICAgICAgcmV0dXJuICh1bG9uZykgKG4gPDwgMSkgXiAodWxvbmcpIChuID4+IDYzKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHVpbnQgSW50VG9aaWd6YWcoaW50IG4pCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIENvbnZlcnQgbiBpbnRvIGEgemlnemFnIGludC4gVGhpcyBhbGxvd3MgbmVnYXRpdmUgbnVtYmVycyB0byBiZSByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQKKyAgICAgICAgICAgIHJldHVybiAodWludCkgKG4gPDwgMSkgXiAodWludCkgKG4gPj4gMzEpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBGaXhlZExvbmdUb0J5dGVzKGxvbmcgbiwgYnl0ZVtdIGJ1ZiwgaW50IG9mZikKKyAgICAgICAgeworICAgICAgICAgICAgLy8gQ29udmVydCBhIGxvbmcgaW50byBsaXR0bGUtZW5kaWFuIGJ5dGVzIGluIGJ1ZiBzdGFydGluZyBhdCBvZmYgYW5kIGdvaW5nIHVudGlsIG9mZis3LgorICAgICAgICAgICAgYnVmW29mZiArIDBdID0gKGJ5dGUpIChuICYgMHhmZik7CisgICAgICAgICAgICBidWZbb2ZmICsgMV0gPSAoYnl0ZSkgKChuID4+IDgpICYgMHhmZik7CisgICAgICAgICAgICBidWZbb2ZmICsgMl0gPSAoYnl0ZSkgKChuID4+IDE2KSAmIDB4ZmYpOworICAgICAgICAgICAgYnVmW29mZiArIDNdID0gKGJ5dGUpICgobiA+PiAyNCkgJiAweGZmKTsKKyAgICAgICAgICAgIGJ1ZltvZmYgKyA0XSA9IChieXRlKSAoKG4gPj4gMzIpICYgMHhmZik7CisgICAgICAgICAgICBidWZbb2ZmICsgNV0gPSAoYnl0ZSkgKChuID4+IDQwKSAmIDB4ZmYpOworICAgICAgICAgICAgYnVmW29mZiArIDZdID0gKGJ5dGUpICgobiA+PiA0OCkgJiAweGZmKTsKKyAgICAgICAgICAgIGJ1ZltvZmYgKyA3XSA9IChieXRlKSAoKG4gPj4gNTYpICYgMHhmZik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgY2xhc3MgRmFjdG9yeSA6IElUUHJvdG9jb2xGYWN0b3J5CisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBUUHJvdG9jb2wgR2V0UHJvdG9jb2woVENsaWVudFRyYW5zcG9ydCB0cmFucykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRDb21wYWN0UHJvdG9jb2wodHJhbnMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIEFsbCBvZiB0aGUgb24td2lyZSBleFR5cGUgY29kZXMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFR5cGVzCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBjb25zdCBieXRlIFN0b3AgPSAweDAwOworICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgQm9vbGVhblRydWUgPSAweDAxOworICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgQm9vbGVhbkZhbHNlID0gMHgwMjsKKyAgICAgICAgICAgIHB1YmxpYyBjb25zdCBieXRlIEJ5dGUgPSAweDAzOworICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgSTE2ID0gMHgwNDsKKyAgICAgICAgICAgIHB1YmxpYyBjb25zdCBieXRlIEkzMiA9IDB4MDU7CisgICAgICAgICAgICBwdWJsaWMgY29uc3QgYnl0ZSBJNjQgPSAweDA2OworICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgRG91YmxlID0gMHgwNzsKKyAgICAgICAgICAgIHB1YmxpYyBjb25zdCBieXRlIEJpbmFyeSA9IDB4MDg7CisgICAgICAgICAgICBwdWJsaWMgY29uc3QgYnl0ZSBMaXN0ID0gMHgwOTsKKyAgICAgICAgICAgIHB1YmxpYyBjb25zdCBieXRlIFNldCA9IDB4MEE7CisgICAgICAgICAgICBwdWJsaWMgY29uc3QgYnl0ZSBNYXAgPSAweDBCOworICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgU3RydWN0ID0gMHgwQzsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RKU09OUHJvdG9jb2wuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RKU09OUHJvdG9jb2wuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQzM2YwMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVEpTT05Qcm90b2NvbC5jcwpAQCAtMCwwICsxLDk4MSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHMuRW50aXRpZXM7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzLlV0aWxpdGllczsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnRzOworCituYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29scworeworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gICAgIEpTT04gcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gZm9yIHRocmlmdC4KKyAgICAvLy8gICAgIFRoaXMgaXMgYSBmdWxsLWZlYXR1cmVkIHByb3RvY29sIHN1cHBvcnRpbmcgV3JpdGUgYW5kIFJlYWQuCisgICAgLy8vICAgICBQbGVhc2Ugc2VlIHRoZSBDKysgY2xhc3MgaGVhZGVyIGZvciBhIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZQorICAgIC8vLyAgICAgcHJvdG9jb2wncyB3aXJlIGZvcm1hdC4KKyAgICAvLy8gICAgIEFkYXB0ZWQgZnJvbSB0aGUgSmF2YSB2ZXJzaW9uLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVEpzb25Qcm90b2NvbCA6IFRQcm90b2NvbAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBsb25nIFZlcnNpb24gPSAxOworCisgICAgICAgIC8vIFRlbXBvcmFyeSBidWZmZXIgdXNlZCBieSBzZXZlcmFsIG1ldGhvZHMKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBieXRlW10gX3RlbXBCdWZmZXIgPSBuZXcgYnl0ZVs0XTsKKworICAgICAgICAvLyBDdXJyZW50IGNvbnRleHQgdGhhdCB3ZSBhcmUgaW4KKyAgICAgICAgcHJvdGVjdGVkIEpTT05CYXNlQ29udGV4dCBDb250ZXh0OworCisgICAgICAgIC8vIFN0YWNrIG9mIG5lc3RlZCBjb250ZXh0cyB0aGF0IHdlIG1heSBiZSBpbgorICAgICAgICBwcm90ZWN0ZWQgU3RhY2s8SlNPTkJhc2VDb250ZXh0PiBDb250ZXh0U3RhY2sgPSBuZXcgU3RhY2s8SlNPTkJhc2VDb250ZXh0PigpOworCisgICAgICAgIC8vIFJlYWRlciB0aGF0IG1hbmFnZXMgYSAxLWJ5dGUgYnVmZmVyCisgICAgICAgIHByb3RlY3RlZCBMb29rYWhlYWRSZWFkZXIgUmVhZGVyOworCisgICAgICAgIC8vIERlZmF1bHQgZW5jb2RpbmcKKyAgICAgICAgcHJvdGVjdGVkIEVuY29kaW5nIFV0ZjhFbmNvZGluZyA9IEVuY29kaW5nLlVURjg7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIFRKc29uUHJvdG9jb2wgQ29uc3RydWN0b3IKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIFRKc29uUHJvdG9jb2woVENsaWVudFRyYW5zcG9ydCB0cmFucykKKyAgICAgICAgICAgIDogYmFzZSh0cmFucykKKyAgICAgICAgeworICAgICAgICAgICAgQ29udGV4dCA9IG5ldyBKU09OQmFzZUNvbnRleHQodGhpcyk7CisgICAgICAgICAgICBSZWFkZXIgPSBuZXcgTG9va2FoZWFkUmVhZGVyKHRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIFB1c2ggYSBuZXcgSlNPTiBjb250ZXh0IG9udG8gdGhlIHN0YWNrLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBQdXNoQ29udGV4dChKU09OQmFzZUNvbnRleHQgYykKKyAgICAgICAgeworICAgICAgICAgICAgQ29udGV4dFN0YWNrLlB1c2goQ29udGV4dCk7CisgICAgICAgICAgICBDb250ZXh0ID0gYzsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBQb3AgdGhlIGxhc3QgSlNPTiBjb250ZXh0IG9mZiB0aGUgc3RhY2sKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgUG9wQ29udGV4dCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbnRleHQgPSBDb250ZXh0U3RhY2suUG9wKCk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgUmVhZCBhIGJ5dGUgdGhhdCBtdXN0IG1hdGNoIGJbMF07IG90aGVyd2lzZSBhbiBleGNlcHRpb24gaXMgdGhyb3duLgorICAgICAgICAvLy8gICAgIE1hcmtlZCBwcm90ZWN0ZWQgdG8gYXZvaWQgc3ludGhldGljIGFjY2Vzc29yIGluIEpTT05MaXN0Q29udGV4dC5SZWFkCisgICAgICAgIC8vLyAgICAgYW5kIEpTT05QYWlyQ29udGV4dC5SZWFkCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByb3RlY3RlZCBhc3luYyBUYXNrIFJlYWRKc29uU3ludGF4Q2hhckFzeW5jKGJ5dGVbXSBieXRlcywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBjaCA9IGF3YWl0IFJlYWRlci5SZWFkQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgaWYgKGNoICE9IGJ5dGVzWzBdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgJCJVbmV4cGVjdGVkIGNoYXJhY3RlcjogeyhjaGFyKSBjaH0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBXcml0ZSB0aGUgYnl0ZXMgaW4gYXJyYXkgYnVmIGFzIGEgSlNPTiBjaGFyYWN0ZXJzLCBlc2NhcGluZyBhcyBuZWVkZWQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrIFdyaXRlSnNvblN0cmluZ0FzeW5jKGJ5dGVbXSBieXRlcywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IENvbnRleHQuV3JpdGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuUXVvdGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgdmFyIGxlbiA9IGJ5dGVzLkxlbmd0aDsKKyAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKChieXRlc1tpXSAmIDB4MDBGRikgPj0gMHgzMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChieXRlc1tpXSA9PSBUSlNPTlByb3RvY29sQ29uc3RhbnRzLkJhY2tzbGFzaFswXSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhUSlNPTlByb3RvY29sQ29uc3RhbnRzLkJhY2tzbGFzaCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhUSlNPTlByb3RvY29sQ29uc3RhbnRzLkJhY2tzbGFzaCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhieXRlcy5Ub0FycmF5KCksIGksIDEsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfdGVtcEJ1ZmZlclswXSA9IFRKU09OUHJvdG9jb2xDb25zdGFudHMuSnNvbkNoYXJUYWJsZVtieXRlc1tpXV07CisgICAgICAgICAgICAgICAgICAgIGlmIChfdGVtcEJ1ZmZlclswXSA9PSAxKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKGJ5dGVzLCBpLCAxLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoX3RlbXBCdWZmZXJbMF0gPiAxKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuQmFja3NsYXNoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKF90ZW1wQnVmZmVyLCAwLCAxLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuRXNjU2VxdWVuY2VzLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBfdGVtcEJ1ZmZlclswXSA9IFRKU09OUHJvdG9jb2xIZWxwZXIuVG9IZXhDaGFyKChieXRlKSAoYnl0ZXNbaV0gPj4gNCkpOworICAgICAgICAgICAgICAgICAgICAgICAgX3RlbXBCdWZmZXJbMV0gPSBUSlNPTlByb3RvY29sSGVscGVyLlRvSGV4Q2hhcihieXRlc1tpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKF90ZW1wQnVmZmVyLCAwLCAyLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuUXVvdGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBXcml0ZSBvdXQgbnVtYmVyIGFzIGEgSlNPTiB2YWx1ZS4gSWYgdGhlIGNvbnRleHQgZGljdGF0ZXMgc28sIGl0IHdpbGwgYmUKKyAgICAgICAgLy8vICAgICB3cmFwcGVkIGluIHF1b3RlcyB0byBvdXRwdXQgYXMgYSBKU09OIHN0cmluZy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrIFdyaXRlSnNvbkludGVnZXJBc3luYyhsb25nIG51bSwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IENvbnRleHQuV3JpdGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB2YXIgc3RyID0gbnVtLlRvU3RyaW5nKCk7CisKKyAgICAgICAgICAgIHZhciBlc2NhcGVOdW0gPSBDb250ZXh0LkVzY2FwZU51bWJlcnMoKTsKKyAgICAgICAgICAgIGlmIChlc2NhcGVOdW0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhUSlNPTlByb3RvY29sQ29uc3RhbnRzLlF1b3RlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBieXRlcyA9IFV0ZjhFbmNvZGluZy5HZXRCeXRlcyhzdHIpOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhieXRlcywgY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICBpZiAoZXNjYXBlTnVtKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoVEpTT05Qcm90b2NvbENvbnN0YW50cy5RdW90ZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIFdyaXRlIG91dCBhIGRvdWJsZSBhcyBhIEpTT04gdmFsdWUuIElmIGl0IGlzIE5hTiBvciBpbmZpbml0eSBvciBpZiB0aGUKKyAgICAgICAgLy8vICAgICBjb250ZXh0IGRpY3RhdGVzIGVzY2FwaW5nLCBXcml0ZSBvdXQgYXMgSlNPTiBzdHJpbmcuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgYXN5bmMgVGFzayBXcml0ZUpzb25Eb3VibGVBc3luYyhkb3VibGUgbnVtLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgQ29udGV4dC5Xcml0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHZhciBzdHIgPSBudW0uVG9TdHJpbmcoIkcxNyIsIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOworICAgICAgICAgICAgdmFyIHNwZWNpYWwgPSBmYWxzZTsKKworICAgICAgICAgICAgc3dpdGNoIChzdHJbMF0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAnTic6IC8vIE5hTgorICAgICAgICAgICAgICAgIGNhc2UgJ0knOiAvLyBJbmZpbml0eQorICAgICAgICAgICAgICAgICAgICBzcGVjaWFsID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnLSc6CisgICAgICAgICAgICAgICAgICAgIGlmIChzdHJbMV0gPT0gJ0knKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyAtSW5maW5pdHkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpYWwgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgZXNjYXBlTnVtID0gc3BlY2lhbCB8fCBDb250ZXh0LkVzY2FwZU51bWJlcnMoKTsKKworICAgICAgICAgICAgaWYgKGVzY2FwZU51bSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuUXVvdGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhVdGY4RW5jb2RpbmcuR2V0Qnl0ZXMoc3RyKSwgY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICBpZiAoZXNjYXBlTnVtKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoVEpTT05Qcm90b2NvbENvbnN0YW50cy5RdW90ZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIFdyaXRlIG91dCBjb250ZW50cyBvZiBieXRlIGFycmF5IGIgYXMgYSBKU09OIHN0cmluZyB3aXRoIGJhc2UtNjQgZW5jb2RlZAorICAgICAgICAvLy8gICAgIGRhdGEKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrIFdyaXRlSnNvbkJhc2U2NEFzeW5jKGJ5dGVbXSBieXRlcywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IENvbnRleHQuV3JpdGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuUXVvdGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgdmFyIGxlbiA9IGJ5dGVzLkxlbmd0aDsKKyAgICAgICAgICAgIHZhciBvZmYgPSAwOworCisgICAgICAgICAgICB3aGlsZSAobGVuID49IDMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gRW5jb2RlIDMgYnl0ZXMgYXQgYSB0aW1lCisgICAgICAgICAgICAgICAgVEJhc2U2NEhlbHBlci5FbmNvZGUoYnl0ZXMsIG9mZiwgMywgX3RlbXBCdWZmZXIsIDApOworICAgICAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoX3RlbXBCdWZmZXIsIDAsIDQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICBvZmYgKz0gMzsKKyAgICAgICAgICAgICAgICBsZW4gLT0gMzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGxlbiA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gRW5jb2RlIHJlbWFpbmRlcgorICAgICAgICAgICAgICAgIFRCYXNlNjRIZWxwZXIuRW5jb2RlKGJ5dGVzLCBvZmYsIGxlbiwgX3RlbXBCdWZmZXIsIDApOworICAgICAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoX3RlbXBCdWZmZXIsIDAsIGxlbiArIDEsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhUSlNPTlByb3RvY29sQ29uc3RhbnRzLlF1b3RlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2sgV3JpdGVKc29uT2JqZWN0U3RhcnRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgQ29udGV4dC5Xcml0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoVEpTT05Qcm90b2NvbENvbnN0YW50cy5MZWZ0QnJhY2UsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIFB1c2hDb250ZXh0KG5ldyBKU09OUGFpckNvbnRleHQodGhpcykpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrIFdyaXRlSnNvbk9iamVjdEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBQb3BDb250ZXh0KCk7CisgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuUmlnaHRCcmFjZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrIFdyaXRlSnNvbkFycmF5U3RhcnRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgQ29udGV4dC5Xcml0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoVEpTT05Qcm90b2NvbENvbnN0YW50cy5MZWZ0QnJhY2tldCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgUHVzaENvbnRleHQobmV3IEpTT05MaXN0Q29udGV4dCh0aGlzKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2sgV3JpdGVKc29uQXJyYXlFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgUG9wQ29udGV4dCgpOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhUSlNPTlByb3RvY29sQ29uc3RhbnRzLlJpZ2h0QnJhY2tldCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVNZXNzYWdlQmVnaW5Bc3luYyhUTWVzc2FnZSBtZXNzYWdlLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uQXJyYXlTdGFydEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvbkludGVnZXJBc3luYyhWZXJzaW9uLCBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgIHZhciBiID0gVXRmOEVuY29kaW5nLkdldEJ5dGVzKG1lc3NhZ2UuTmFtZSk7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25TdHJpbmdBc3luYyhiLCBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvbkludGVnZXJBc3luYygobG9uZykgbWVzc2FnZS5UeXBlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25JbnRlZ2VyQXN5bmMobWVzc2FnZS5TZXFJRCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVNZXNzYWdlRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvbkFycmF5RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVTdHJ1Y3RCZWdpbkFzeW5jKFRTdHJ1Y3QgQHN0cnVjdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvbk9iamVjdFN0YXJ0QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVTdHJ1Y3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uT2JqZWN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVGaWVsZEJlZ2luQXN5bmMoVEZpZWxkIGZpZWxkLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uSW50ZWdlckFzeW5jKGZpZWxkLklELCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25PYmplY3RTdGFydEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvblN0cmluZ0FzeW5jKFRKU09OUHJvdG9jb2xIZWxwZXIuR2V0VHlwZU5hbWVGb3JUeXBlSWQoZmllbGQuVHlwZSksIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlRmllbGRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uT2JqZWN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVGaWVsZFN0b3BBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlTWFwQmVnaW5Bc3luYyhUTWFwIG1hcCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvbkFycmF5U3RhcnRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25TdHJpbmdBc3luYyhUSlNPTlByb3RvY29sSGVscGVyLkdldFR5cGVOYW1lRm9yVHlwZUlkKG1hcC5LZXlUeXBlKSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uU3RyaW5nQXN5bmMoVEpTT05Qcm90b2NvbEhlbHBlci5HZXRUeXBlTmFtZUZvclR5cGVJZChtYXAuVmFsdWVUeXBlKSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uSW50ZWdlckFzeW5jKG1hcC5Db3VudCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uT2JqZWN0U3RhcnRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZU1hcEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25PYmplY3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25BcnJheUVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlTGlzdEJlZ2luQXN5bmMoVExpc3QgbGlzdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvbkFycmF5U3RhcnRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25TdHJpbmdBc3luYyhUSlNPTlByb3RvY29sSGVscGVyLkdldFR5cGVOYW1lRm9yVHlwZUlkKGxpc3QuRWxlbWVudFR5cGUpLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25JbnRlZ2VyQXN5bmMobGlzdC5Db3VudCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVMaXN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvbkFycmF5RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVTZXRCZWdpbkFzeW5jKFRTZXQgc2V0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uQXJyYXlTdGFydEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvblN0cmluZ0FzeW5jKFRKU09OUHJvdG9jb2xIZWxwZXIuR2V0VHlwZU5hbWVGb3JUeXBlSWQoc2V0LkVsZW1lbnRUeXBlKSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uSW50ZWdlckFzeW5jKHNldC5Db3VudCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVTZXRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uQXJyYXlFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUJvb2xBc3luYyhib29sIGIsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25JbnRlZ2VyQXN5bmMoYiA/IDEgOiAwLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUJ5dGVBc3luYyhzYnl0ZSBiLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uSW50ZWdlckFzeW5jKGIsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlSTE2QXN5bmMoc2hvcnQgaTE2LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uSW50ZWdlckFzeW5jKGkxNiwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVJMzJBc3luYyhpbnQgaTMyLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uSW50ZWdlckFzeW5jKGkzMiwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVJNjRBc3luYyhsb25nIGk2NCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvbkludGVnZXJBc3luYyhpNjQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlRG91YmxlQXN5bmMoZG91YmxlIGQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25Eb3VibGVBc3luYyhkLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZVN0cmluZ0FzeW5jKHN0cmluZyBzLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGIgPSBVdGY4RW5jb2RpbmcuR2V0Qnl0ZXMocyk7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25TdHJpbmdBc3luYyhiLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUJpbmFyeUFzeW5jKGJ5dGVbXSBieXRlcywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvbkJhc2U2NEFzeW5jKGJ5dGVzLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgUmVhZCBpbiBhIEpTT04gc3RyaW5nLCB1bmVzY2FwaW5nIGFzIGFwcHJvcHJpYXRlLi4gU2tpcCBSZWFkaW5nIGZyb20gdGhlCisgICAgICAgIC8vLyAgICAgY29udGV4dCBpZiBza2lwQ29udGV4dCBpcyB0cnVlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2s8Ynl0ZVtdPiBSZWFkSnNvblN0cmluZ0FzeW5jKGJvb2wgc2tpcENvbnRleHQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAodmFyIGJ1ZmZlciA9IG5ldyBNZW1vcnlTdHJlYW0oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgY29kZXVuaXRzID0gbmV3IExpc3Q8Y2hhcj4oKTsKKworCisgICAgICAgICAgICAgICAgaWYgKCFza2lwQ29udGV4dCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IENvbnRleHQuUmVhZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBhd2FpdCBSZWFkSnNvblN5bnRheENoYXJBc3luYyhUSlNPTlByb3RvY29sQ29uc3RhbnRzLlF1b3RlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBjaCA9IGF3YWl0IFJlYWRlci5SZWFkQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gVEpTT05Qcm90b2NvbENvbnN0YW50cy5RdW90ZVswXSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBlc2NhcGVkPworICAgICAgICAgICAgICAgICAgICBpZiAoY2ggIT0gVEpTT05Qcm90b2NvbENvbnN0YW50cy5Fc2NTZXF1ZW5jZXNbMF0pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGJ1ZmZlci5Xcml0ZUFzeW5jKG5ld1tdIHtjaH0sIDAsIDEsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBcdVhYWFggYW5kIFw/CisgICAgICAgICAgICAgICAgICAgIGNoID0gYXdhaXQgUmVhZGVyLlJlYWRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaCAhPSBUSlNPTlByb3RvY29sQ29uc3RhbnRzLkVzY1NlcXVlbmNlc1sxXSkgLy8gY29udHJvbCBjaGFycyBsaWtlIFxuCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvZmYgPSBBcnJheS5JbmRleE9mKFRKU09OUHJvdG9jb2xDb25zdGFudHMuRXNjYXBlQ2hhcnMsIChjaGFyKSBjaCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2ZmID09IC0xKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgIkV4cGVjdGVkIGNvbnRyb2wgY2hhciIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSBUSlNPTlByb3RvY29sQ29uc3RhbnRzLkVzY2FwZUNoYXJWYWx1ZXNbb2ZmXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGJ1ZmZlci5Xcml0ZUFzeW5jKG5ld1tdIHtjaH0sIDAsIDEsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gaXQncyBcdVhYWFgKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuUmVhZEFsbEFzeW5jKF90ZW1wQnVmZmVyLCAwLCA0LCBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHdjaCA9IChzaG9ydCkgKChUSlNPTlByb3RvY29sSGVscGVyLlRvSGV4VmFsKF90ZW1wQnVmZmVyWzBdKSA8PCAxMikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFRKU09OUHJvdG9jb2xIZWxwZXIuVG9IZXhWYWwoX3RlbXBCdWZmZXJbMV0pIDw8IDgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChUSlNPTlByb3RvY29sSGVscGVyLlRvSGV4VmFsKF90ZW1wQnVmZmVyWzJdKSA8PCA0KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSlNPTlByb3RvY29sSGVscGVyLlRvSGV4VmFsKF90ZW1wQnVmZmVyWzNdKSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoYXIuSXNIaWdoU3Vycm9nYXRlKChjaGFyKSB3Y2gpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZXVuaXRzLkNvdW50ID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsICJFeHBlY3RlZCBsb3cgc3Vycm9nYXRlIGNoYXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGV1bml0cy5BZGQoKGNoYXIpIHdjaCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2hhci5Jc0xvd1N1cnJvZ2F0ZSgoY2hhcikgd2NoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGV1bml0cy5Db3VudCA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgIkV4cGVjdGVkIGhpZ2ggc3Vycm9nYXRlIGNoYXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgY29kZXVuaXRzLkFkZCgoY2hhcikgd2NoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0bXAgPSBVdGY4RW5jb2RpbmcuR2V0Qnl0ZXMoY29kZXVuaXRzLlRvQXJyYXkoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBidWZmZXIuV3JpdGVBc3luYyh0bXAsIDAsIHRtcC5MZW5ndGgsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGV1bml0cy5DbGVhcigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRtcCA9IFV0ZjhFbmNvZGluZy5HZXRCeXRlcyhuZXdbXSB7KGNoYXIpIHdjaH0pOworICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgYnVmZmVyLldyaXRlQXN5bmModG1wLCAwLCB0bXAuTGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoY29kZXVuaXRzLkNvdW50ID4gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgIkV4cGVjdGVkIGxvdyBzdXJyb2dhdGUgY2hhciIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBidWZmZXIuVG9BcnJheSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIFJlYWQgaW4gYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIHRoYXQgYXJlIGFsbCB2YWxpZCBpbiBKU09OIG51bWJlcnMuIERvZXMKKyAgICAgICAgLy8vICAgICBub3QgZG8gYSBjb21wbGV0ZSByZWdleCBjaGVjayB0byB2YWxpZGF0ZSB0aGF0IHRoaXMgaXMgYWN0dWFsbHkgYSBudW1iZXIuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgYXN5bmMgVGFzazxzdHJpbmc+IFJlYWRKc29uTnVtZXJpY0NoYXJzQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBzdHJibGQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9UT0RPOiB3b3JrYXJvdW5kIGZvciBwcmltaXRpdmUgdHlwZXMgd2l0aCBUSnNvblByb3RvY29sLCB0aGluayAtIGhvdyB0byByZXdyaXRlIGludG8gbW9yZSBlYXN5IGZvcm0gd2l0aG91dCBleGNlcHRpb25zCisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgY2ggPSBhd2FpdCBSZWFkZXIuUGVla0FzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFUSlNPTlByb3RvY29sSGVscGVyLklzSnNvbk51bWVyaWMoY2gpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IChjaGFyKWF3YWl0IFJlYWRlci5SZWFkQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICBzdHJibGQuQXBwZW5kKGMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzdHJibGQuVG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBSZWFkIGluIGEgSlNPTiBudW1iZXIuIElmIHRoZSBjb250ZXh0IGRpY3RhdGVzLCBSZWFkIGluIGVuY2xvc2luZyBxdW90ZXMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgYXN5bmMgVGFzazxsb25nPiBSZWFkSnNvbkludGVnZXJBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgQ29udGV4dC5SZWFkQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgaWYgKENvbnRleHQuRXNjYXBlTnVtYmVycygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFJlYWRKc29uU3ludGF4Q2hhckFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuUXVvdGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHN0ciA9IGF3YWl0IFJlYWRKc29uTnVtZXJpY0NoYXJzQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgaWYgKENvbnRleHQuRXNjYXBlTnVtYmVycygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFJlYWRKc29uU3ludGF4Q2hhckFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuUXVvdGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxvbmcuUGFyc2Uoc3RyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChGb3JtYXRFeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAiQmFkIGRhdGEgZW5jb3VudGVkIGluIG51bWVyaWMgZGF0YSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIFJlYWQgaW4gYSBKU09OIGRvdWJsZSB2YWx1ZS4gVGhyb3cgaWYgdGhlIHZhbHVlIGlzIG5vdCB3cmFwcGVkIGluIHF1b3RlcworICAgICAgICAvLy8gICAgIHdoZW4gZXhwZWN0ZWQgb3IgaWYgd3JhcHBlZCBpbiBxdW90ZXMgd2hlbiBub3QgZXhwZWN0ZWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgYXN5bmMgVGFzazxkb3VibGU+IFJlYWRKc29uRG91YmxlQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IENvbnRleHQuUmVhZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGlmIChhd2FpdCBSZWFkZXIuUGVla0FzeW5jKGNhbmNlbGxhdGlvblRva2VuKSA9PSBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlF1b3RlWzBdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBhcnIgPSBhd2FpdCBSZWFkSnNvblN0cmluZ0FzeW5jKHRydWUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICB2YXIgZHViID0gZG91YmxlLlBhcnNlKFV0ZjhFbmNvZGluZy5HZXRTdHJpbmcoYXJyLCAwLCBhcnIuTGVuZ3RoKSwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CisKKyAgICAgICAgICAgICAgICBpZiAoIUNvbnRleHQuRXNjYXBlTnVtYmVycygpICYmICFkb3VibGUuSXNOYU4oZHViKSAmJiAhZG91YmxlLklzSW5maW5pdHkoZHViKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRocm93IGV4Y2VwdGlvbiAtLSB3ZSBzaG91bGQgbm90IGJlIGluIGEgc3RyaW5nIGluIHRoaXMgY2FzZQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsICJOdW1lcmljIGRhdGEgdW5leHBlY3RlZGx5IHF1b3RlZCIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBkdWI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChDb250ZXh0LkVzY2FwZU51bWJlcnMoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIHdpbGwgdGhyb3cgLSB3ZSBzaG91bGQgaGF2ZSBoYWQgYSBxdW90ZSBpZiBlc2NhcGVOdW0gPT0gdHJ1ZQorICAgICAgICAgICAgICAgIGF3YWl0IFJlYWRKc29uU3ludGF4Q2hhckFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuUXVvdGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRvdWJsZS5QYXJzZShhd2FpdCBSZWFkSnNvbk51bWVyaWNDaGFyc0FzeW5jKGNhbmNlbGxhdGlvblRva2VuKSwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRm9ybWF0RXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgIkJhZCBkYXRhIGVuY291bnRlZCBpbiBudW1lcmljIGRhdGEiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBSZWFkIGluIGEgSlNPTiBzdHJpbmcgY29udGFpbmluZyBiYXNlLTY0IGVuY29kZWQgZGF0YSBhbmQgZGVjb2RlIGl0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2s8Ynl0ZVtdPiBSZWFkSnNvbkJhc2U2NEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgYiA9IGF3YWl0IFJlYWRKc29uU3RyaW5nQXN5bmMoZmFsc2UsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHZhciBsZW4gPSBiLkxlbmd0aDsKKyAgICAgICAgICAgIHZhciBvZmYgPSAwOworICAgICAgICAgICAgdmFyIHNpemUgPSAwOworCisgICAgICAgICAgICAvLyByZWR1Y2UgbGVuIHRvIGlnbm9yZSBmaWxsIGJ5dGVzCisgICAgICAgICAgICB3aGlsZSAoKGxlbiA+IDApICYmIChiW2xlbiAtIDFdID09ICc9JykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLS1sZW47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHJlYWQgJiBkZWNvZGUgZnVsbCBieXRlIHRyaXBsZXRzID0gNCBzb3VyY2UgYnl0ZXMKKyAgICAgICAgICAgIHdoaWxlIChsZW4gPiA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIERlY29kZSA0IGJ5dGVzIGF0IGEgdGltZQorICAgICAgICAgICAgICAgIFRCYXNlNjRIZWxwZXIuRGVjb2RlKGIsIG9mZiwgNCwgYiwgc2l6ZSk7IC8vIE5COiBkZWNvZGVkIGluIHBsYWNlCisgICAgICAgICAgICAgICAgb2ZmICs9IDQ7CisgICAgICAgICAgICAgICAgbGVuIC09IDQ7CisgICAgICAgICAgICAgICAgc2l6ZSArPSAzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBEb24ndCBkZWNvZGUgaWYgd2UgaGl0IHRoZSBlbmQgb3IgZ290IGEgc2luZ2xlIGxlZnRvdmVyIGJ5dGUgKGludmFsaWQKKyAgICAgICAgICAgIC8vIGJhc2U2NCBidXQgbGVnYWwgZm9yIHNraXAgb2YgcmVndWxhciBzdHJpbmcgZXhUeXBlKQorICAgICAgICAgICAgaWYgKGxlbiA+IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gRGVjb2RlIHJlbWFpbmRlcgorICAgICAgICAgICAgICAgIFRCYXNlNjRIZWxwZXIuRGVjb2RlKGIsIG9mZiwgbGVuLCBiLCBzaXplKTsgLy8gTkI6IGRlY29kZWQgaW4gcGxhY2UKKyAgICAgICAgICAgICAgICBzaXplICs9IGxlbiAtIDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFNhZGx5IHdlIG11c3QgY29weSB0aGUgYnl0ZVtdIChhbnkgd2F5IGFyb3VuZCB0aGlzPykKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBuZXcgYnl0ZVtzaXplXTsKKyAgICAgICAgICAgIEFycmF5LkNvcHkoYiwgMCwgcmVzdWx0LCAwLCBzaXplKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2sgUmVhZEpzb25PYmplY3RTdGFydEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBDb250ZXh0LlJlYWRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBSZWFkSnNvblN5bnRheENoYXJBc3luYyhUSlNPTlByb3RvY29sQ29uc3RhbnRzLkxlZnRCcmFjZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgUHVzaENvbnRleHQobmV3IEpTT05QYWlyQ29udGV4dCh0aGlzKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2sgUmVhZEpzb25PYmplY3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25TeW50YXhDaGFyQXN5bmMoVEpTT05Qcm90b2NvbENvbnN0YW50cy5SaWdodEJyYWNlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBQb3BDb250ZXh0KCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2sgUmVhZEpzb25BcnJheVN0YXJ0QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IENvbnRleHQuUmVhZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFJlYWRKc29uU3ludGF4Q2hhckFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuTGVmdEJyYWNrZXQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIFB1c2hDb250ZXh0KG5ldyBKU09OTGlzdENvbnRleHQodGhpcykpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrIFJlYWRKc29uQXJyYXlFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25TeW50YXhDaGFyQXN5bmMoVEpTT05Qcm90b2NvbENvbnN0YW50cy5SaWdodEJyYWNrZXQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIFBvcENvbnRleHQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRNZXNzYWdlPiBSZWFkTWVzc2FnZUJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBtZXNzYWdlID0gbmV3IFRNZXNzYWdlKCk7CisgICAgICAgICAgICBhd2FpdCBSZWFkSnNvbkFycmF5U3RhcnRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBpZiAoYXdhaXQgUmVhZEpzb25JbnRlZ2VyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pICE9IFZlcnNpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uQkFEX1ZFUlNJT04sICJNZXNzYWdlIGNvbnRhaW5lZCBiYWQgdmVyc2lvbi4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGJ1ZiA9IGF3YWl0IFJlYWRKc29uU3RyaW5nQXN5bmMoZmFsc2UsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIG1lc3NhZ2UuTmFtZSA9IFV0ZjhFbmNvZGluZy5HZXRTdHJpbmcoYnVmLCAwLCBidWYuTGVuZ3RoKTsKKyAgICAgICAgICAgIG1lc3NhZ2UuVHlwZSA9IChUTWVzc2FnZVR5cGUpIGF3YWl0IFJlYWRKc29uSW50ZWdlckFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIG1lc3NhZ2UuU2VxSUQgPSAoaW50KSBhd2FpdCBSZWFkSnNvbkludGVnZXJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICByZXR1cm4gbWVzc2FnZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRNZXNzYWdlRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFJlYWRKc29uQXJyYXlFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxUU3RydWN0PiBSZWFkU3RydWN0QmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25PYmplY3RTdGFydEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVFN0cnVjdCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgUmVhZFN0cnVjdEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBSZWFkSnNvbk9iamVjdEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRGaWVsZD4gUmVhZEZpZWxkQmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZpZWxkID0gbmV3IFRGaWVsZCgpOworICAgICAgICAgICAgdmFyIGNoID0gYXdhaXQgUmVhZGVyLlBlZWtBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBpZiAoY2ggPT0gVEpTT05Qcm90b2NvbENvbnN0YW50cy5SaWdodEJyYWNlWzBdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpZWxkLlR5cGUgPSBUVHlwZS5TdG9wOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpZWxkLklEID0gKHNob3J0KSBhd2FpdCBSZWFkSnNvbkludGVnZXJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25PYmplY3RTdGFydEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICBmaWVsZC5UeXBlID0gVEpTT05Qcm90b2NvbEhlbHBlci5HZXRUeXBlSWRGb3JUeXBlTmFtZShhd2FpdCBSZWFkSnNvblN0cmluZ0FzeW5jKGZhbHNlLCBjYW5jZWxsYXRpb25Ub2tlbikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZpZWxkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgUmVhZEZpZWxkRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFJlYWRKc29uT2JqZWN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VE1hcD4gUmVhZE1hcEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBtYXAgPSBuZXcgVE1hcCgpOworICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25BcnJheVN0YXJ0QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgbWFwLktleVR5cGUgPSBUSlNPTlByb3RvY29sSGVscGVyLkdldFR5cGVJZEZvclR5cGVOYW1lKGF3YWl0IFJlYWRKc29uU3RyaW5nQXN5bmMoZmFsc2UsIGNhbmNlbGxhdGlvblRva2VuKSk7CisgICAgICAgICAgICBtYXAuVmFsdWVUeXBlID0gVEpTT05Qcm90b2NvbEhlbHBlci5HZXRUeXBlSWRGb3JUeXBlTmFtZShhd2FpdCBSZWFkSnNvblN0cmluZ0FzeW5jKGZhbHNlLCBjYW5jZWxsYXRpb25Ub2tlbikpOworICAgICAgICAgICAgbWFwLkNvdW50ID0gKGludCkgYXdhaXQgUmVhZEpzb25JbnRlZ2VyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25PYmplY3RTdGFydEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHJldHVybiBtYXA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkTWFwRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFJlYWRKc29uT2JqZWN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25BcnJheUVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRMaXN0PiBSZWFkTGlzdEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBsaXN0ID0gbmV3IFRMaXN0KCk7CisgICAgICAgICAgICBhd2FpdCBSZWFkSnNvbkFycmF5U3RhcnRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBsaXN0LkVsZW1lbnRUeXBlID0gVEpTT05Qcm90b2NvbEhlbHBlci5HZXRUeXBlSWRGb3JUeXBlTmFtZShhd2FpdCBSZWFkSnNvblN0cmluZ0FzeW5jKGZhbHNlLCBjYW5jZWxsYXRpb25Ub2tlbikpOworICAgICAgICAgICAgbGlzdC5Db3VudCA9IChpbnQpIGF3YWl0IFJlYWRKc29uSW50ZWdlckFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHJldHVybiBsaXN0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgUmVhZExpc3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25BcnJheUVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRTZXQ+IFJlYWRTZXRCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgc2V0ID0gbmV3IFRTZXQoKTsKKyAgICAgICAgICAgIGF3YWl0IFJlYWRKc29uQXJyYXlTdGFydEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHNldC5FbGVtZW50VHlwZSA9IFRKU09OUHJvdG9jb2xIZWxwZXIuR2V0VHlwZUlkRm9yVHlwZU5hbWUoYXdhaXQgUmVhZEpzb25TdHJpbmdBc3luYyhmYWxzZSwgY2FuY2VsbGF0aW9uVG9rZW4pKTsKKyAgICAgICAgICAgIHNldC5Db3VudCA9IChpbnQpIGF3YWl0IFJlYWRKc29uSW50ZWdlckFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHJldHVybiBzZXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkU2V0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFJlYWRKc29uQXJyYXlFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxib29sPiBSZWFkQm9vbEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgUmVhZEpzb25JbnRlZ2VyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pICE9IDA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxzYnl0ZT4gUmVhZEJ5dGVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChzYnl0ZSkgYXdhaXQgUmVhZEpzb25JbnRlZ2VyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8c2hvcnQ+IFJlYWRJMTZBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChzaG9ydCkgYXdhaXQgUmVhZEpzb25JbnRlZ2VyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8aW50PiBSZWFkSTMyQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoaW50KSBhd2FpdCBSZWFkSnNvbkludGVnZXJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxsb25nPiBSZWFkSTY0QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkSnNvbkludGVnZXJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxkb3VibGU+IFJlYWREb3VibGVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFJlYWRKc29uRG91YmxlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8c3RyaW5nPiBSZWFkU3RyaW5nQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBidWYgPSBhd2FpdCBSZWFkSnNvblN0cmluZ0FzeW5jKGZhbHNlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICByZXR1cm4gVXRmOEVuY29kaW5nLkdldFN0cmluZyhidWYsIDAsIGJ1Zi5MZW5ndGgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8Ynl0ZVtdPiBSZWFkQmluYXJ5QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkSnNvbkJhc2U2NEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBGYWN0b3J5IGZvciBKU09OIHByb3RvY29sIG9iamVjdHMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGNsYXNzIEZhY3RvcnkgOiBJVFByb3RvY29sRmFjdG9yeQorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgVFByb3RvY29sIEdldFByb3RvY29sKFRDbGllbnRUcmFuc3BvcnQgdHJhbnMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUSnNvblByb3RvY29sKHRyYW5zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBCYXNlIGNsYXNzIGZvciB0cmFja2luZyBKU09OIGNvbnRleHRzIHRoYXQgbWF5IHJlcXVpcmUKKyAgICAgICAgLy8vICAgICBpbnNlcnRpbmcvUmVhZGluZyBhZGRpdGlvbmFsIEpTT04gc3ludGF4IGNoYXJhY3RlcnMKKyAgICAgICAgLy8vICAgICBUaGlzIGJhc2UgY29udGV4dCBkb2VzIG5vdGhpbmcuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByb3RlY3RlZCBjbGFzcyBKU09OQmFzZUNvbnRleHQKKyAgICAgICAgeworICAgICAgICAgICAgcHJvdGVjdGVkIFRKc29uUHJvdG9jb2wgUHJvdG87CisKKyAgICAgICAgICAgIHB1YmxpYyBKU09OQmFzZUNvbnRleHQoVEpzb25Qcm90b2NvbCBwcm90bykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQcm90byA9IHByb3RvOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBSZWFkQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZpcnR1YWwgYm9vbCBFc2NhcGVOdW1iZXJzKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgQ29udGV4dCBmb3IgSlNPTiBsaXN0cy4gV2lsbCBpbnNlcnQvUmVhZCBjb21tYXMgYmVmb3JlIGVhY2ggaXRlbSBleGNlcHQKKyAgICAgICAgLy8vICAgICBmb3IgdGhlIGZpcnN0IG9uZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcm90ZWN0ZWQgY2xhc3MgSlNPTkxpc3RDb250ZXh0IDogSlNPTkJhc2VDb250ZXh0CisgICAgICAgIHsKKyAgICAgICAgICAgIHByaXZhdGUgYm9vbCBfZmlyc3QgPSB0cnVlOworCisgICAgICAgICAgICBwdWJsaWMgSlNPTkxpc3RDb250ZXh0KFRKc29uUHJvdG9jb2wgcHJvdG9jb2wpCisgICAgICAgICAgICAgICAgOiBiYXNlKHByb3RvY29sKQorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfZmlyc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgUHJvdG8uVHJhbnMuV3JpdGVBc3luYyhUSlNPTlByb3RvY29sQ29uc3RhbnRzLkNvbW1hLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9maXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9maXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhd2FpdCBQcm90by5SZWFkSnNvblN5bnRheENoYXJBc3luYyhUSlNPTlByb3RvY29sQ29uc3RhbnRzLkNvbW1hLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIENvbnRleHQgZm9yIEpTT04gcmVjb3Jkcy4gV2lsbCBpbnNlcnQvUmVhZCBjb2xvbnMgYmVmb3JlIHRoZSB2YWx1ZSBwb3J0aW9uCisgICAgICAgIC8vLyAgICAgb2YgZWFjaCByZWNvcmQgcGFpciwgYW5kIGNvbW1hcyBiZWZvcmUgZWFjaCBrZXkgZXhjZXB0IHRoZSBmaXJzdC4gSW4KKyAgICAgICAgLy8vICAgICBhZGRpdGlvbiwgd2lsbCBpbmRpY2F0ZSB0aGF0IG51bWJlcnMgaW4gdGhlIGtleSBwb3NpdGlvbiBuZWVkIHRvIGJlCisgICAgICAgIC8vLyAgICAgZXNjYXBlZCBpbiBxdW90ZXMgKHNpbmNlIEpTT04ga2V5cyBtdXN0IGJlIHN0cmluZ3MpLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgICAgICBwcm90ZWN0ZWQgY2xhc3MgSlNPTlBhaXJDb250ZXh0IDogSlNPTkJhc2VDb250ZXh0CisgICAgICAgIHsKKyAgICAgICAgICAgIHByaXZhdGUgYm9vbCBfY29sb24gPSB0cnVlOworCisgICAgICAgICAgICBwcml2YXRlIGJvb2wgX2ZpcnN0ID0gdHJ1ZTsKKworICAgICAgICAgICAgcHVibGljIEpTT05QYWlyQ29udGV4dChUSnNvblByb3RvY29sIHByb3RvKQorICAgICAgICAgICAgICAgIDogYmFzZShwcm90bykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2ZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2ZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIF9jb2xvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IFByb3RvLlRyYW5zLldyaXRlQXN5bmMoX2NvbG9uID8gVEpTT05Qcm90b2NvbENvbnN0YW50cy5Db2xvbiA6IFRKU09OUHJvdG9jb2xDb25zdGFudHMuQ29tbWEsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgX2NvbG9uID0gIV9jb2xvbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2ZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2ZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIF9jb2xvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IFByb3RvLlJlYWRKc29uU3ludGF4Q2hhckFzeW5jKF9jb2xvbiA/IFRKU09OUHJvdG9jb2xDb25zdGFudHMuQ29sb24gOiBUSlNPTlByb3RvY29sQ29uc3RhbnRzLkNvbW1hLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgIF9jb2xvbiA9ICFfY29sb247CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFc2NhcGVOdW1iZXJzKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbG9uOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIEhvbGRzIHVwIHRvIG9uZSBieXRlIGZyb20gdGhlIHRyYW5zcG9ydAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcm90ZWN0ZWQgY2xhc3MgTG9va2FoZWFkUmVhZGVyCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYnl0ZVtdIF9kYXRhID0gbmV3IGJ5dGVbMV07CisKKyAgICAgICAgICAgIHByaXZhdGUgYm9vbCBfaGFzRGF0YTsKKyAgICAgICAgICAgIHByb3RlY3RlZCBUSnNvblByb3RvY29sIFByb3RvOworCisgICAgICAgICAgICBwdWJsaWMgTG9va2FoZWFkUmVhZGVyKFRKc29uUHJvdG9jb2wgcHJvdG8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUHJvdG8gPSBwcm90bzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAgICAgLy8vICAgICBSZXR1cm4gYW5kIGNvbnN1bWUgdGhlIG5leHQgYnl0ZSB0byBiZSBSZWFkLCBlaXRoZXIgdGFraW5nIGl0IGZyb20gdGhlCisgICAgICAgICAgICAvLy8gICAgIGRhdGEgYnVmZmVyIGlmIHByZXNlbnQgb3IgZ2V0dGluZyBpdCBmcm9tIHRoZSB0cmFuc3BvcnQgb3RoZXJ3aXNlLgorICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrPGJ5dGU+IFJlYWRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8Ynl0ZT4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChfaGFzRGF0YSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9oYXNEYXRhID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgbW9yZSBlYXN5IHdheSB0byBhdm9pZCBleGNlcHRpb24gb24gcmVhZGluZyBwcmltaXRpdmUgdHlwZXMKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgUHJvdG8uVHJhbnMuUmVhZEFsbEFzeW5jKF9kYXRhLCAwLCAxLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBfZGF0YVswXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAgICAgLy8vICAgICBSZXR1cm4gdGhlIG5leHQgYnl0ZSB0byBiZSBSZWFkIHdpdGhvdXQgY29uc3VtaW5nLCBmaWxsaW5nIHRoZSBkYXRhCisgICAgICAgICAgICAvLy8gICAgIGJ1ZmZlciBpZiBpdCBoYXMgbm90IGJlZW4gZmlsbGVkIGFsUmVhZHkuCisgICAgICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAgICAgcHVibGljIGFzeW5jIFRhc2s8Ynl0ZT4gUGVla0FzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxieXRlPihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFfaGFzRGF0YSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgbW9yZSBlYXN5IHdheSB0byBhdm9pZCBleGNlcHRpb24gb24gcmVhZGluZyBwcmltaXRpdmUgdHlwZXMKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgUHJvdG8uVHJhbnMuUmVhZEFsbEFzeW5jKF9kYXRhLCAwLCAxLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9oYXNEYXRhID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2RhdGFbMF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RNdWx0aXBsZXhlZFByb3RvY29sLmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9UTXVsdGlwbGV4ZWRQcm90b2NvbC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjdlNGU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9UTXVsdGlwbGV4ZWRQcm90b2NvbC5jcwpAQCAtMCwwICsxLDkxIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHMuRW50aXRpZXM7CisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2xzCit7CisgICAgLyoqCisgICAgKiBUTXVsdGlwbGV4ZWRQcm90b2NvbCBpcyBhIHByb3RvY29sLWluZGVwZW5kZW50IGNvbmNyZXRlIGRlY29yYXRvciB0aGF0IGFsbG93cyBhIFRocmlmdAorICAgICogY2xpZW50IHRvIGNvbW11bmljYXRlIHdpdGggYSBtdWx0aXBsZXhpbmcgVGhyaWZ0IHNlcnZlciwgYnkgcHJlcGVuZGluZyB0aGUgc2VydmljZSBuYW1lCisgICAgKiB0byB0aGUgZnVuY3Rpb24gbmFtZSBkdXJpbmcgZnVuY3Rpb24gY2FsbHMuCisgICAgKgorICAgICogTk9URTogVEhJUyBJUyBOT1QgVE8gQkUgVVNFRCBCWSBTRVJWRVJTLgorICAgICogT24gdGhlIHNlcnZlciwgdXNlIFRNdWx0aXBsZXhlZFByb2Nlc3NvciB0byBoYW5kbGUgcmVxdWVzdHMgZnJvbSBhIG11bHRpcGxleGluZyBjbGllbnQuCisgICAgKgorICAgICogVGhpcyBleGFtcGxlIHVzZXMgYSBzaW5nbGUgc29ja2V0IHRyYW5zcG9ydCB0byBpbnZva2UgdHdvIHNlcnZpY2VzOgorICAgICoKKyAgICAqICAgICBUU29ja2V0Q2xpZW50VHJhbnNwb3J0IHRyYW5zcG9ydCA9IG5ldyBUU29ja2V0Q2xpZW50VHJhbnNwb3J0KCJsb2NhbGhvc3QiLCA5MDkwKTsKKyAgICAqICAgICB0cmFuc3BvcnQub3BlbigpOworICAgICoKKyAgICAqICAgICBUQmluYXJ5UHJvdG9jb2wgcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCk7CisgICAgKgorICAgICogICAgIFRNdWx0aXBsZXhlZFByb3RvY29sIG1wID0gbmV3IFRNdWx0aXBsZXhlZFByb3RvY29sKHByb3RvY29sLCAiQ2FsY3VsYXRvciIpOworICAgICogICAgIENhbGN1bGF0b3IuQ2xpZW50IHNlcnZpY2UgPSBuZXcgQ2FsY3VsYXRvci5DbGllbnQobXApOworICAgICoKKyAgICAqICAgICBUTXVsdGlwbGV4ZWRQcm90b2NvbCBtcDIgPSBuZXcgVE11bHRpcGxleGVkUHJvdG9jb2wocHJvdG9jb2wsICJXZWF0aGVyUmVwb3J0Iik7CisgICAgKiAgICAgV2VhdGhlclJlcG9ydC5DbGllbnQgc2VydmljZTIgPSBuZXcgV2VhdGhlclJlcG9ydC5DbGllbnQobXAyKTsKKyAgICAqCisgICAgKiAgICAgU3lzdGVtLm91dC5wcmludGxuKHNlcnZpY2UuYWRkKDIsMikpOworICAgICogICAgIFN5c3RlbS5vdXQucHJpbnRsbihzZXJ2aWNlMi5nZXRUZW1wZXJhdHVyZSgpKTsKKyAgICAqCisgICAgKi8KKworICAgIC8vVE9ETzogaW1wbGVtZW50YXRpb24gb2YgVFByb3RvY29sCisKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBUTXVsdGlwbGV4ZWRQcm90b2NvbCA6IFRQcm90b2NvbERlY29yYXRvcgorICAgIHsKKyAgICAgICAgLyoqIFVzZWQgdG8gZGVsaW1pdCB0aGUgc2VydmljZSBuYW1lIGZyb20gdGhlIGZ1bmN0aW9uIG5hbWUgKi8KKyAgICAgICAgcHVibGljIGNvbnN0IHN0cmluZyBTZXBhcmF0b3IgPSAiOiI7CisKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBzdHJpbmcgX3NlcnZpY2VOYW1lOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBXcmFwIHRoZSBzcGVjaWZpZWQgcHJvdG9jb2wsIGFsbG93aW5nIGl0IHRvIGJlIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCBhCisgICAgICAgICAqIG11bHRpcGxleGluZyBzZXJ2ZXIuICBUaGUgPGNvZGU+c2VydmljZU5hbWU8L2NvZGU+IGlzIHJlcXVpcmVkIGFzIGl0IGlzCisgICAgICAgICAqIHByZXBlbmRlZCB0byB0aGUgbWVzc2FnZSBoZWFkZXIgc28gdGhhdCB0aGUgbXVsdGlwbGV4aW5nIHNlcnZlciBjYW4gYnJva2VyCisgICAgICAgICAqIHRoZSBmdW5jdGlvbiBjYWxsIHRvIHRoZSBwcm9wZXIgc2VydmljZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQXJnczoKKyAgICAgICAgICogIHByb3RvY29sICAgICAgICBZb3VyIGNvbW11bmljYXRpb24gcHJvdG9jb2wgb2YgY2hvaWNlLCBlLmcuIFRCaW5hcnlQcm90b2NvbAorICAgICAgICAgKiAgc2VydmljZU5hbWUgICAgIFRoZSBzZXJ2aWNlIG5hbWUgb2YgdGhlIHNlcnZpY2UgY29tbXVuaWNhdGluZyB2aWEgdGhpcyBwcm90b2NvbC4KKyAgICAgICAgICovCisKKyAgICAgICAgcHVibGljIFRNdWx0aXBsZXhlZFByb3RvY29sKFRQcm90b2NvbCBwcm90b2NvbCwgc3RyaW5nIHNlcnZpY2VOYW1lKQorICAgICAgICAgICAgOiBiYXNlKHByb3RvY29sKQorICAgICAgICB7CisgICAgICAgICAgICBfc2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlTWVzc2FnZUJlZ2luQXN5bmMoVE1lc3NhZ2UgbWVzc2FnZSwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZS5UeXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgVE1lc3NhZ2VUeXBlLkNhbGw6CisgICAgICAgICAgICAgICAgY2FzZSBUTWVzc2FnZVR5cGUuT25ld2F5OgorICAgICAgICAgICAgICAgICAgICBhd2FpdCBiYXNlLldyaXRlTWVzc2FnZUJlZ2luQXN5bmMobmV3IFRNZXNzYWdlKCQie19zZXJ2aWNlTmFtZX17U2VwYXJhdG9yfXttZXNzYWdlLk5hbWV9IiwgbWVzc2FnZS5UeXBlLCBtZXNzYWdlLlNlcUlEKSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhd2FpdCBiYXNlLldyaXRlTWVzc2FnZUJlZ2luQXN5bmMobWVzc2FnZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVFByb3RvY29sLmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9UUHJvdG9jb2wuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFlMDA5ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVFByb3RvY29sLmNzCkBAIC0wLDAgKzEsMzc2IEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgVGhyaWZ0LlByb3RvY29scy5FbnRpdGllczsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnRzOworCituYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29scworeworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGFic3RyYWN0IGNsYXNzIFRQcm90b2NvbCA6IElEaXNwb3NhYmxlCisgICAgeworICAgICAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRSZWN1cnNpb25EZXB0aCA9IDY0OworICAgICAgICBwcml2YXRlIGJvb2wgX2lzRGlzcG9zZWQ7CisgICAgICAgIHByb3RlY3RlZCBpbnQgUmVjdXJzaW9uRGVwdGg7CisKKyAgICAgICAgcHJvdGVjdGVkIFRDbGllbnRUcmFuc3BvcnQgVHJhbnM7CisKKyAgICAgICAgcHJvdGVjdGVkIFRQcm90b2NvbChUQ2xpZW50VHJhbnNwb3J0IHRyYW5zKQorICAgICAgICB7CisgICAgICAgICAgICBUcmFucyA9IHRyYW5zOworICAgICAgICAgICAgUmVjdXJzaW9uTGltaXQgPSBEZWZhdWx0UmVjdXJzaW9uRGVwdGg7CisgICAgICAgICAgICBSZWN1cnNpb25EZXB0aCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVENsaWVudFRyYW5zcG9ydCBUcmFuc3BvcnQgPT4gVHJhbnM7CisKKyAgICAgICAgcHJvdGVjdGVkIGludCBSZWN1cnNpb25MaW1pdCB7IGdldDsgc2V0OyB9CisKKyAgICAgICAgcHVibGljIHZvaWQgRGlzcG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIERpc3Bvc2UodHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBJbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChSZWN1cnNpb25EZXB0aCA8IFJlY3Vyc2lvbkxpbWl0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICsrUmVjdXJzaW9uRGVwdGg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uREVQVEhfTElNSVQsICJEZXB0aCBsaW1pdCBleGNlZWRlZCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKQorICAgICAgICB7CisgICAgICAgICAgICAtLVJlY3Vyc2lvbkRlcHRoOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIV9pc0Rpc3Bvc2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkaXNwb3NpbmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAoVHJhbnMgYXMgSURpc3Bvc2FibGUpPy5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX2lzRGlzcG9zZWQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBXcml0ZU1lc3NhZ2VCZWdpbkFzeW5jKFRNZXNzYWdlIG1lc3NhZ2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlTWVzc2FnZUJlZ2luQXN5bmMobWVzc2FnZSwgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBXcml0ZU1lc3NhZ2VCZWdpbkFzeW5jKFRNZXNzYWdlIG1lc3NhZ2UsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlTWVzc2FnZUVuZEFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVNZXNzYWdlRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBXcml0ZU1lc3NhZ2VFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBXcml0ZVN0cnVjdEJlZ2luQXN5bmMoVFN0cnVjdCBAc3RydWN0KQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZVN0cnVjdEJlZ2luQXN5bmMoQHN0cnVjdCwgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBXcml0ZVN0cnVjdEJlZ2luQXN5bmMoVFN0cnVjdCBAc3RydWN0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBXcml0ZVN0cnVjdEVuZEFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVTdHJ1Y3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlU3RydWN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgV3JpdGVGaWVsZEJlZ2luQXN5bmMoVEZpZWxkIGZpZWxkKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUZpZWxkQmVnaW5Bc3luYyhmaWVsZCwgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBXcml0ZUZpZWxkQmVnaW5Bc3luYyhURmllbGQgZmllbGQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlRmllbGRFbmRBc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlRmllbGRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlRmllbGRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBXcml0ZUZpZWxkU3RvcEFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVGaWVsZFN0b3BBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlRmllbGRTdG9wQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgV3JpdGVNYXBCZWdpbkFzeW5jKFRNYXAgbWFwKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZU1hcEJlZ2luQXN5bmMobWFwLCBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlTWFwQmVnaW5Bc3luYyhUTWFwIG1hcCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgV3JpdGVNYXBFbmRBc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlTWFwRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBXcml0ZU1hcEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlTGlzdEJlZ2luQXN5bmMoVExpc3QgbGlzdCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVMaXN0QmVnaW5Bc3luYyhsaXN0LCBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlTGlzdEJlZ2luQXN5bmMoVExpc3QgbGlzdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgV3JpdGVMaXN0RW5kQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUxpc3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlTGlzdEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlU2V0QmVnaW5Bc3luYyhUU2V0IHNldCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVTZXRCZWdpbkFzeW5jKHNldCwgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBXcml0ZVNldEJlZ2luQXN5bmMoVFNldCBzZXQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlU2V0RW5kQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZVNldEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2sgV3JpdGVTZXRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBXcml0ZUJvb2xBc3luYyhib29sIGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlQm9vbEFzeW5jKGIsIENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2sgV3JpdGVCb29sQXN5bmMoYm9vbCBiLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBXcml0ZUJ5dGVBc3luYyhzYnl0ZSBiKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUJ5dGVBc3luYyhiLCBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlQnl0ZUFzeW5jKHNieXRlIGIsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlSTE2QXN5bmMoc2hvcnQgaTE2KQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUkxNkFzeW5jKGkxNiwgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBXcml0ZUkxNkFzeW5jKHNob3J0IGkxNiwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgV3JpdGVJMzJBc3luYyhpbnQgaTMyKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUkzMkFzeW5jKGkzMiwgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBXcml0ZUkzMkFzeW5jKGludCBpMzIsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlSTY0QXN5bmMobG9uZyBpNjQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSTY0QXN5bmMoaTY0LCBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlSTY0QXN5bmMobG9uZyBpNjQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlRG91YmxlQXN5bmMoZG91YmxlIGQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlRG91YmxlQXN5bmMoZCwgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBXcml0ZURvdWJsZUFzeW5jKGRvdWJsZSBkLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBXcml0ZVN0cmluZ0FzeW5jKHN0cmluZyBzKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZVN0cmluZ0FzeW5jKHMsIENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBXcml0ZVN0cmluZ0FzeW5jKHN0cmluZyBzLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGJ5dGVzID0gRW5jb2RpbmcuVVRGOC5HZXRCeXRlcyhzKTsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlQmluYXJ5QXN5bmMoYnl0ZXMsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgV3JpdGVCaW5hcnlBc3luYyhieXRlW10gYnl0ZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlQmluYXJ5QXN5bmMoYnl0ZXMsIENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2sgV3JpdGVCaW5hcnlBc3luYyhieXRlW10gYnl0ZXMsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrPFRNZXNzYWdlPiBSZWFkTWVzc2FnZUJlZ2luQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgUmVhZE1lc3NhZ2VCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2s8VE1lc3NhZ2U+IFJlYWRNZXNzYWdlQmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBSZWFkTWVzc2FnZUVuZEFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgUmVhZE1lc3NhZ2VFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFJlYWRNZXNzYWdlRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2s8VFN0cnVjdD4gUmVhZFN0cnVjdEJlZ2luQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgUmVhZFN0cnVjdEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzazxUU3RydWN0PiBSZWFkU3RydWN0QmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBSZWFkU3RydWN0RW5kQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBSZWFkU3RydWN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBSZWFkU3RydWN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2s8VEZpZWxkPiBSZWFkRmllbGRCZWdpbkFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFJlYWRGaWVsZEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzazxURmllbGQ+IFJlYWRGaWVsZEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgUmVhZEZpZWxkRW5kQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBSZWFkRmllbGRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFJlYWRGaWVsZEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrPFRNYXA+IFJlYWRNYXBCZWdpbkFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFJlYWRNYXBCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2s8VE1hcD4gUmVhZE1hcEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgUmVhZE1hcEVuZEFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgUmVhZE1hcEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2sgUmVhZE1hcEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrPFRMaXN0PiBSZWFkTGlzdEJlZ2luQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgUmVhZExpc3RCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2s8VExpc3Q+IFJlYWRMaXN0QmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBSZWFkTGlzdEVuZEFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgUmVhZExpc3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFJlYWRMaXN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2s8VFNldD4gUmVhZFNldEJlZ2luQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgUmVhZFNldEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzazxUU2V0PiBSZWFkU2V0QmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBSZWFkU2V0RW5kQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBSZWFkU2V0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBSZWFkU2V0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2s8Ym9vbD4gUmVhZEJvb2xBc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkQm9vbEFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2s8Ym9vbD4gUmVhZEJvb2xBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzazxzYnl0ZT4gUmVhZEJ5dGVBc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkQnl0ZUFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2s8c2J5dGU+IFJlYWRCeXRlQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2s8c2hvcnQ+IFJlYWRJMTZBc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkSTE2QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzazxzaG9ydD4gUmVhZEkxNkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrPGludD4gUmVhZEkzMkFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFJlYWRJMzJBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrPGludD4gUmVhZEkzMkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrPGxvbmc+IFJlYWRJNjRBc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkSTY0QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzazxsb25nPiBSZWFkSTY0QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2s8ZG91YmxlPiBSZWFkRG91YmxlQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgUmVhZERvdWJsZUFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2s8ZG91YmxlPiBSZWFkRG91YmxlQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2s8c3RyaW5nPiBSZWFkU3RyaW5nQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgUmVhZFN0cmluZ0FzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzazxzdHJpbmc+IFJlYWRTdHJpbmdBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGJ1ZiA9IGF3YWl0IFJlYWRCaW5hcnlBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICByZXR1cm4gRW5jb2RpbmcuVVRGOC5HZXRTdHJpbmcoYnVmLCAwLCBidWYuTGVuZ3RoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2s8Ynl0ZVtdPiBSZWFkQmluYXJ5QXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgUmVhZEJpbmFyeUFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2s8Ynl0ZVtdPiBSZWFkQmluYXJ5QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RQcm90b2NvbERlY29yYXRvci5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVFByb3RvY29sRGVjb3JhdG9yLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMjI3NTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RQcm90b2NvbERlY29yYXRvci5jcwpAQCAtMCwwICsxLDI0NyBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzLkVudGl0aWVzOworCituYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29scworeworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAgICAgVFByb3RvY29sRGVjb3JhdG9yIGZvcndhcmRzIGFsbCByZXF1ZXN0cyB0byBhbiBlbmNsb3NlZCBUUHJvdG9jb2wgaW5zdGFuY2UsCisgICAgLy8vICAgICBwcm92aWRpbmcgYSB3YXkgdG8gYXV0aG9yIGNvbmNpc2UgY29uY3JldGUgZGVjb3JhdG9yIHN1YmNsYXNzZXMuV2hpbGUgaXQgaGFzCisgICAgLy8vICAgICBubyBhYnN0cmFjdCBtZXRob2RzLCBpdCBpcyBtYXJrZWQgYWJzdHJhY3QgYXMgYSByZW1pbmRlciB0aGF0IGJ5IGl0c2VsZiwKKyAgICAvLy8gICAgIGl0IGRvZXMgbm90IG1vZGlmeSB0aGUgYmVoYXZpb3VyIG9mIHRoZSBlbmNsb3NlZCBUUHJvdG9jb2wuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVFByb3RvY29sRGVjb3JhdG9yIDogVFByb3RvY29sCisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFRQcm90b2NvbCBfd3JhcHBlZFByb3RvY29sOworCisgICAgICAgIHByb3RlY3RlZCBUUHJvdG9jb2xEZWNvcmF0b3IoVFByb3RvY29sIHByb3RvY29sKQorICAgICAgICAgICAgOiBiYXNlKHByb3RvY29sLlRyYW5zcG9ydCkKKyAgICAgICAgeworICAgICAgICAgICAgX3dyYXBwZWRQcm90b2NvbCA9IHByb3RvY29sID8/IHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKHByb3RvY29sKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZU1lc3NhZ2VCZWdpbkFzeW5jKFRNZXNzYWdlIG1lc3NhZ2UsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLldyaXRlTWVzc2FnZUJlZ2luQXN5bmMobWVzc2FnZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVNZXNzYWdlRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVNZXNzYWdlRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVTdHJ1Y3RCZWdpbkFzeW5jKFRTdHJ1Y3QgQHN0cnVjdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVTdHJ1Y3RCZWdpbkFzeW5jKEBzdHJ1Y3QsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlU3RydWN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVTdHJ1Y3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUZpZWxkQmVnaW5Bc3luYyhURmllbGQgZmllbGQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLldyaXRlRmllbGRCZWdpbkFzeW5jKGZpZWxkLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUZpZWxkRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVGaWVsZEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlRmllbGRTdG9wQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVGaWVsZFN0b3BBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZU1hcEJlZ2luQXN5bmMoVE1hcCBtYXAsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLldyaXRlTWFwQmVnaW5Bc3luYyhtYXAsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlTWFwRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVNYXBFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUxpc3RCZWdpbkFzeW5jKFRMaXN0IGxpc3QsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLldyaXRlTGlzdEJlZ2luQXN5bmMobGlzdCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVMaXN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVMaXN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVTZXRCZWdpbkFzeW5jKFRTZXQgc2V0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5Xcml0ZVNldEJlZ2luQXN5bmMoc2V0LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZVNldEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLldyaXRlU2V0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVCb29sQXN5bmMoYm9vbCBiLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5Xcml0ZUJvb2xBc3luYyhiLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUJ5dGVBc3luYyhzYnl0ZSBiLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5Xcml0ZUJ5dGVBc3luYyhiLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUkxNkFzeW5jKHNob3J0IGkxNiwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVJMTZBc3luYyhpMTYsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlSTMyQXN5bmMoaW50IGkzMiwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVJMzJBc3luYyhpMzIsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlSTY0QXN5bmMobG9uZyBpNjQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLldyaXRlSTY0QXN5bmMoaTY0LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZURvdWJsZUFzeW5jKGRvdWJsZSBkLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5Xcml0ZURvdWJsZUFzeW5jKGQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlU3RyaW5nQXN5bmMoc3RyaW5nIHMsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLldyaXRlU3RyaW5nQXN5bmMocywgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVCaW5hcnlBc3luYyhieXRlW10gYnl0ZXMsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLldyaXRlQmluYXJ5QXN5bmMoYnl0ZXMsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRNZXNzYWdlPiBSZWFkTWVzc2FnZUJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBfd3JhcHBlZFByb3RvY29sLlJlYWRNZXNzYWdlQmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkTWVzc2FnZUVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLlJlYWRNZXNzYWdlRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VFN0cnVjdD4gUmVhZFN0cnVjdEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBfd3JhcHBlZFByb3RvY29sLlJlYWRTdHJ1Y3RCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRTdHJ1Y3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5SZWFkU3RydWN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VEZpZWxkPiBSZWFkRmllbGRCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5SZWFkRmllbGRCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRGaWVsZEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLlJlYWRGaWVsZEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRNYXA+IFJlYWRNYXBCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5SZWFkTWFwQmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkTWFwRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuUmVhZE1hcEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRMaXN0PiBSZWFkTGlzdEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBfd3JhcHBlZFByb3RvY29sLlJlYWRMaXN0QmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkTGlzdEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLlJlYWRMaXN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VFNldD4gUmVhZFNldEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBfd3JhcHBlZFByb3RvY29sLlJlYWRTZXRCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRTZXRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5SZWFkU2V0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8Ym9vbD4gUmVhZEJvb2xBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuUmVhZEJvb2xBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxzYnl0ZT4gUmVhZEJ5dGVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuUmVhZEJ5dGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxzaG9ydD4gUmVhZEkxNkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5SZWFkSTE2QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8aW50PiBSZWFkSTMyQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBfd3JhcHBlZFByb3RvY29sLlJlYWRJMzJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxsb25nPiBSZWFkSTY0QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBfd3JhcHBlZFByb3RvY29sLlJlYWRJNjRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxkb3VibGU+IFJlYWREb3VibGVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuUmVhZERvdWJsZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPHN0cmluZz4gUmVhZFN0cmluZ0FzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5SZWFkU3RyaW5nQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8Ynl0ZVtdPiBSZWFkQmluYXJ5QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBfd3JhcHBlZFByb3RvY29sLlJlYWRCaW5hcnlBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9UUHJvdG9jb2xFeGNlcHRpb24uY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RQcm90b2NvbEV4Y2VwdGlvbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzY3YzNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9UUHJvdG9jb2xFeGNlcHRpb24uY3MKQEAgLTAsMCArMSw1OSBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gUmVTaGFycGVyIGRpc2FibGUgSW5jb25zaXN0ZW50TmFtaW5nCituYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29scworeworICAgIHB1YmxpYyBjbGFzcyBUUHJvdG9jb2xFeGNlcHRpb24gOiBURXhjZXB0aW9uCisgICAgeworICAgICAgICAvLyBkbyBub3QgcmVuYW1lIHB1YmxpYyBjb25zdGFudHMgLSB0aGV5IHVzZWQgaW4gZ2VuZXJhdGVkIGZpbGVzCisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgVU5LTk9XTiA9IDA7CisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgSU5WQUxJRF9EQVRBID0gMTsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBORUdBVElWRV9TSVpFID0gMjsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBTSVpFX0xJTUlUID0gMzsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBCQURfVkVSU0lPTiA9IDQ7CisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgTk9UX0lNUExFTUVOVEVEID0gNTsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBERVBUSF9MSU1JVCA9IDY7CisKKyAgICAgICAgcHJvdGVjdGVkIGludCBUeXBlID0gVU5LTk9XTjsKKworICAgICAgICBwdWJsaWMgVFByb3RvY29sRXhjZXB0aW9uKCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRQcm90b2NvbEV4Y2VwdGlvbihpbnQgdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgVHlwZSA9IHR5cGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFByb3RvY29sRXhjZXB0aW9uKGludCB0eXBlLCBzdHJpbmcgbWVzc2FnZSkKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlKQorICAgICAgICB7CisgICAgICAgICAgICBUeXBlID0gdHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUUHJvdG9jb2xFeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UpCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBHZXRFeGNlcHRpb25UeXBlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFR5cGU7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9VdGlsaXRpZXMvVEJhc2U2NEhlbHBlci5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVXRpbGl0aWVzL1RCYXNlNjRIZWxwZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VmZjVlMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVXRpbGl0aWVzL1RCYXNlNjRIZWxwZXIuY3MKQEAgLTAsMCArMSwxMDEgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbHMuVXRpbGl0aWVzCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBpbnRlcm5hbCBzdGF0aWMgY2xhc3MgVEJhc2U2NEhlbHBlcgorICAgIHsKKyAgICAgICAgLy9UT0RPOiBDb25zdGFudHMKKyAgICAgICAgLy9UT0RPOiBDaGVjayBmb3IgYXJncworICAgICAgICAvL1RPRE86IFVuaXRlc3RzCisKKyAgICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIEVuY29kZVRhYmxlID0gIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iOworCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGludFtdIERlY29kZVRhYmxlID0KKyAgICAgICAgeworICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgNjIsIC0xLCAtMSwgLTEsIDYzLAorICAgICAgICAgICAgNTIsIDUzLCA1NCwgNTUsIDU2LCA1NywgNTgsIDU5LCA2MCwgNjEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAtMSwgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LAorICAgICAgICAgICAgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAtMSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMSwgMzIsIDMzLCAzNCwgMzUsIDM2LCAzNywgMzgsIDM5LCA0MCwKKyAgICAgICAgICAgIDQxLCA0MiwgNDMsIDQ0LCA0NSwgNDYsIDQ3LCA0OCwgNDksIDUwLCA1MSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMQorICAgICAgICB9OworCisgICAgICAgIGludGVybmFsIHN0YXRpYyB2b2lkIEVuY29kZShieXRlW10gc3JjLCBpbnQgc3JjT2ZmLCBpbnQgbGVuLCBieXRlW10gZHN0LCBpbnQgZHN0T2ZmKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3JjID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbihuYW1lb2Yoc3JjKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRzdFtkc3RPZmZdID0gKGJ5dGUpIEVuY29kZVRhYmxlWyhzcmNbc3JjT2ZmXSA+PiAyKSAmIDB4M0ZdOworCisgICAgICAgICAgICBpZiAobGVuID09IDMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZHN0W2RzdE9mZiArIDFdID0gKGJ5dGUpIEVuY29kZVRhYmxlWygoc3JjW3NyY09mZl0gPDwgNCkgJiAweDMwKSB8ICgoc3JjW3NyY09mZiArIDFdID4+IDQpICYgMHgwRildOworICAgICAgICAgICAgICAgIGRzdFtkc3RPZmYgKyAyXSA9IChieXRlKSBFbmNvZGVUYWJsZVsoKHNyY1tzcmNPZmYgKyAxXSA8PCAyKSAmIDB4M0MpIHwgKChzcmNbc3JjT2ZmICsgMl0gPj4gNikgJiAweDAzKV07CisgICAgICAgICAgICAgICAgZHN0W2RzdE9mZiArIDNdID0gKGJ5dGUpIEVuY29kZVRhYmxlW3NyY1tzcmNPZmYgKyAyXSAmIDB4M0ZdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobGVuID09IDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZHN0W2RzdE9mZiArIDFdID0gKGJ5dGUpIEVuY29kZVRhYmxlWygoc3JjW3NyY09mZl0gPDwgNCkgJiAweDMwKSB8ICgoc3JjW3NyY09mZiArIDFdID4+IDQpICYgMHgwRildOworICAgICAgICAgICAgICAgIGRzdFtkc3RPZmYgKyAyXSA9IChieXRlKSBFbmNvZGVUYWJsZVsoc3JjW3NyY09mZiArIDFdIDw8IDIpICYgMHgzQ107CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gbGVuID09IDEKKyAgICAgICAgICAgICAgICBkc3RbZHN0T2ZmICsgMV0gPSAoYnl0ZSkgRW5jb2RlVGFibGVbKHNyY1tzcmNPZmZdIDw8IDQpICYgMHgzMF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCBzdGF0aWMgdm9pZCBEZWNvZGUoYnl0ZVtdIHNyYywgaW50IHNyY09mZiwgaW50IGxlbiwgYnl0ZVtdIGRzdCwgaW50IGRzdE9mZikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHNyYyA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKHNyYykpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkc3RbZHN0T2ZmXSA9IChieXRlKSAoKERlY29kZVRhYmxlW3NyY1tzcmNPZmZdICYgMHgwRkZdIDw8IDIpIHwgKERlY29kZVRhYmxlW3NyY1tzcmNPZmYgKyAxXSAmIDB4MEZGXSA+PiA0KSk7CisKKyAgICAgICAgICAgIGlmIChsZW4gPiAyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRzdFtkc3RPZmYgKyAxXSA9CisgICAgICAgICAgICAgICAgICAgIChieXRlKQorICAgICAgICAgICAgICAgICAgICAoKChEZWNvZGVUYWJsZVtzcmNbc3JjT2ZmICsgMV0gJiAweDBGRl0gPDwgNCkgJiAweEYwKSB8IChEZWNvZGVUYWJsZVtzcmNbc3JjT2ZmICsgMl0gJiAweDBGRl0gPj4gMikpOworICAgICAgICAgICAgICAgIGlmIChsZW4gPiAzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZHN0W2RzdE9mZiArIDJdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChieXRlKQorICAgICAgICAgICAgICAgICAgICAgICAgKCgoRGVjb2RlVGFibGVbc3JjW3NyY09mZiArIDJdICYgMHgwRkZdIDw8IDYpICYgMHhDMCkgfCBEZWNvZGVUYWJsZVtzcmNbc3JjT2ZmICsgM10gJiAweDBGRl0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1V0aWxpdGllcy9UQmFzZTY0VXRpbHMuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1V0aWxpdGllcy9UQmFzZTY0VXRpbHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVmZDQ1YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVXRpbGl0aWVzL1RCYXNlNjRVdGlscy5jcwpAQCAtMCwwICsxLDEwMSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOworCituYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29scy5VdGlsaXRpZXMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIGludGVybmFsIHN0YXRpYyBjbGFzcyBUQmFzZTY0VXRpbHMKKyAgICB7CisgICAgICAgIC8vVE9ETzogQ29uc3RhbnRzCisgICAgICAgIC8vVE9ETzogQ2hlY2sgZm9yIGFyZ3MKKyAgICAgICAgLy9UT0RPOiBVbml0ZXN0cworCisgICAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBFbmNvZGVUYWJsZSA9ICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIjsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBpbnRbXSBEZWNvZGVUYWJsZSA9CisgICAgICAgIHsKKyAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDYyLCAtMSwgLTEsIC0xLCA2MywKKyAgICAgICAgICAgIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgLTEsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwKKyAgICAgICAgICAgIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgLTEsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1LCAzNiwgMzcsIDM4LCAzOSwgNDAsCisgICAgICAgICAgICA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsIDQ5LCA1MCwgNTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEKKyAgICAgICAgfTsKKworICAgICAgICBpbnRlcm5hbCBzdGF0aWMgdm9pZCBFbmNvZGUoYnl0ZVtdIHNyYywgaW50IHNyY09mZiwgaW50IGxlbiwgYnl0ZVtdIGRzdCwgaW50IGRzdE9mZikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHNyYyA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKHNyYykpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkc3RbZHN0T2ZmXSA9IChieXRlKSBFbmNvZGVUYWJsZVsoc3JjW3NyY09mZl0gPj4gMikgJiAweDNGXTsKKworICAgICAgICAgICAgaWYgKGxlbiA9PSAzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRzdFtkc3RPZmYgKyAxXSA9IChieXRlKSBFbmNvZGVUYWJsZVsoKHNyY1tzcmNPZmZdIDw8IDQpICYgMHgzMCkgfCAoKHNyY1tzcmNPZmYgKyAxXSA+PiA0KSAmIDB4MEYpXTsKKyAgICAgICAgICAgICAgICBkc3RbZHN0T2ZmICsgMl0gPSAoYnl0ZSkgRW5jb2RlVGFibGVbKChzcmNbc3JjT2ZmICsgMV0gPDwgMikgJiAweDNDKSB8ICgoc3JjW3NyY09mZiArIDJdID4+IDYpICYgMHgwMyldOworICAgICAgICAgICAgICAgIGRzdFtkc3RPZmYgKyAzXSA9IChieXRlKSBFbmNvZGVUYWJsZVtzcmNbc3JjT2ZmICsgMl0gJiAweDNGXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGxlbiA9PSAyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRzdFtkc3RPZmYgKyAxXSA9IChieXRlKSBFbmNvZGVUYWJsZVsoKHNyY1tzcmNPZmZdIDw8IDQpICYgMHgzMCkgfCAoKHNyY1tzcmNPZmYgKyAxXSA+PiA0KSAmIDB4MEYpXTsKKyAgICAgICAgICAgICAgICBkc3RbZHN0T2ZmICsgMl0gPSAoYnl0ZSkgRW5jb2RlVGFibGVbKHNyY1tzcmNPZmYgKyAxXSA8PCAyKSAmIDB4M0NdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGxlbiA9PSAxCisgICAgICAgICAgICAgICAgZHN0W2RzdE9mZiArIDFdID0gKGJ5dGUpIEVuY29kZVRhYmxlWyhzcmNbc3JjT2ZmXSA8PCA0KSAmIDB4MzBdOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIHZvaWQgRGVjb2RlKGJ5dGVbXSBzcmMsIGludCBzcmNPZmYsIGludCBsZW4sIGJ5dGVbXSBkc3QsIGludCBkc3RPZmYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzcmMgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKG5hbWVvZihzcmMpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZHN0W2RzdE9mZl0gPSAoYnl0ZSkgKChEZWNvZGVUYWJsZVtzcmNbc3JjT2ZmXSAmIDB4MEZGXSA8PCAyKSB8IChEZWNvZGVUYWJsZVtzcmNbc3JjT2ZmICsgMV0gJiAweDBGRl0gPj4gNCkpOworCisgICAgICAgICAgICBpZiAobGVuID4gMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkc3RbZHN0T2ZmICsgMV0gPQorICAgICAgICAgICAgICAgICAgICAoYnl0ZSkKKyAgICAgICAgICAgICAgICAgICAgKCgoRGVjb2RlVGFibGVbc3JjW3NyY09mZiArIDFdICYgMHgwRkZdIDw8IDQpICYgMHhGMCkgfCAoRGVjb2RlVGFibGVbc3JjW3NyY09mZiArIDJdICYgMHgwRkZdID4+IDIpKTsKKyAgICAgICAgICAgICAgICBpZiAobGVuID4gMykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRzdFtkc3RPZmYgKyAyXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAoYnl0ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICgoKERlY29kZVRhYmxlW3NyY1tzcmNPZmYgKyAyXSAmIDB4MEZGXSA8PCA2KSAmIDB4QzApIHwgRGVjb2RlVGFibGVbc3JjW3NyY09mZiArIDNdICYgMHgwRkZdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9VdGlsaXRpZXMvVEpzb25Qcm90b2NvbENvbnN0YW50cy5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVXRpbGl0aWVzL1RKc29uUHJvdG9jb2xDb25zdGFudHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNlZmY3OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVXRpbGl0aWVzL1RKc29uUHJvdG9jb2xDb25zdGFudHMuY3MKQEAgLTAsMCArMSw2MSBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbHMuVXRpbGl0aWVzCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRKU09OUHJvdG9jb2xDb25zdGFudHMKKyAgICB7CisgICAgICAgIC8vVE9ETyBDaGVjayBmb3IgcGVyZm9ybWFuY2UgZm9yIHJldXNpbmcgSW1tdXRhYmxlQXJyYXkgZnJvbSBTeXN0ZW0uQ29sbGVjdGlvbnMuSW1tdXRhYmxlIChodHRwczovL2Jsb2dzLm1zZG4ubWljcm9zb2Z0LmNvbS9kb3RuZXQvMjAxMy8wNi8yNC9wbGVhc2Utd2VsY29tZS1pbW11dGFibGVhcnJheXQvKQorICAgICAgICAvLyBjYW4gYmUgcG9zc2libGUgdG8gZ2V0IGJldHRlciBwZXJmb3JtYW5jZSBhbmQgYWxzbyBiZXR0ZXIgR0MKKworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGJ5dGVbXSBDb21tYSA9IHsoYnl0ZSkgJywnfTsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBieXRlW10gQ29sb24gPSB7KGJ5dGUpICc6J307CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIExlZnRCcmFjZSA9IHsoYnl0ZSkgJ3snfTsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBieXRlW10gUmlnaHRCcmFjZSA9IHsoYnl0ZSkgJ30nfTsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBieXRlW10gTGVmdEJyYWNrZXQgPSB7KGJ5dGUpICdbJ307CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIFJpZ2h0QnJhY2tldCA9IHsoYnl0ZSkgJ10nfTsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBieXRlW10gUXVvdGUgPSB7KGJ5dGUpICciJ307CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIEJhY2tzbGFzaCA9IHsoYnl0ZSkgJ1xcJ307CisKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBieXRlW10gSnNvbkNoYXJUYWJsZSA9CisgICAgICAgIHsKKyAgICAgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIChieXRlKSAnYicsIChieXRlKSAndCcsIChieXRlKSAnbicsIDAsIChieXRlKSAnZicsIChieXRlKSAncicsIDAsIDAsCisgICAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgICAgICAgICAgMSwgMSwgKGJ5dGUpICciJywgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMQorICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgY2hhcltdIEVzY2FwZUNoYXJzID0gIlwiXFwvYmZucnQiLlRvQ2hhckFycmF5KCk7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIEVzY2FwZUNoYXJWYWx1ZXMgPSB7KGJ5dGUpICciJywgKGJ5dGUpICdcXCcsIChieXRlKSAnLycsIChieXRlKSAnXGInLCAoYnl0ZSkgJ1xmJywgKGJ5dGUpICdcbicsIChieXRlKSAnXHInLCAoYnl0ZSkgJ1x0J307CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIEVzY1NlcXVlbmNlcyA9IHsoYnl0ZSkgJ1xcJywgKGJ5dGUpICd1JywgKGJ5dGUpICcwJywgKGJ5dGUpICcwJ307CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUeXBlTmFtZXMKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBieXRlW10gTmFtZUJvb2wgPSB7IChieXRlKSd0JywgKGJ5dGUpJ2YnIH07CisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGJ5dGVbXSBOYW1lQnl0ZSA9IHsgKGJ5dGUpJ2knLCAoYnl0ZSknOCcgfTsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIE5hbWVJMTYgPSB7IChieXRlKSdpJywgKGJ5dGUpJzEnLCAoYnl0ZSknNicgfTsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIE5hbWVJMzIgPSB7IChieXRlKSdpJywgKGJ5dGUpJzMnLCAoYnl0ZSknMicgfTsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIE5hbWVJNjQgPSB7IChieXRlKSdpJywgKGJ5dGUpJzYnLCAoYnl0ZSknNCcgfTsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIE5hbWVEb3VibGUgPSB7IChieXRlKSdkJywgKGJ5dGUpJ2InLCAoYnl0ZSknbCcgfTsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIE5hbWVTdHJ1Y3QgPSB7IChieXRlKSdyJywgKGJ5dGUpJ2UnLCAoYnl0ZSknYycgfTsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIE5hbWVTdHJpbmcgPSB7IChieXRlKSdzJywgKGJ5dGUpJ3QnLCAoYnl0ZSkncicgfTsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIE5hbWVNYXAgPSB7IChieXRlKSdtJywgKGJ5dGUpJ2EnLCAoYnl0ZSkncCcgfTsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIE5hbWVMaXN0ID0geyAoYnl0ZSknbCcsIChieXRlKSdzJywgKGJ5dGUpJ3QnIH07CisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGJ5dGVbXSBOYW1lU2V0ID0geyAoYnl0ZSkncycsIChieXRlKSdlJywgKGJ5dGUpJ3QnIH07CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9VdGlsaXRpZXMvVEpzb25Qcm90b2NvbEhlbHBlci5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVXRpbGl0aWVzL1RKc29uUHJvdG9jb2xIZWxwZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRjMjZhOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVXRpbGl0aWVzL1RKc29uUHJvdG9jb2xIZWxwZXIuY3MKQEAgLTAsMCArMSwxNzYgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHMuRW50aXRpZXM7CisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2xzLlV0aWxpdGllcworeworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUSlNPTlByb3RvY29sSGVscGVyCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBHZXRUeXBlTmFtZUZvclR5cGVJZChUVHlwZSB0eXBlSWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAodHlwZUlkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuQm9vbDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVCb29sOworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuQnl0ZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVCeXRlOworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuSTE2OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZUkxNjsKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkkzMjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVJMzI7CisgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5JNjQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlR5cGVOYW1lcy5OYW1lSTY0OworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuRG91YmxlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZURvdWJsZTsKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLlN0cmluZzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVTdHJpbmc7CisgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5TdHJ1Y3Q6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlR5cGVOYW1lcy5OYW1lU3RydWN0OworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuTWFwOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZU1hcDsKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLlNldDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVTZXQ7CisgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5MaXN0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZUxpc3Q7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uTk9UX0lNUExFTUVOVEVELCAiVW5yZWNvZ25pemVkIGV4VHlwZSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBUVHlwZSBHZXRUeXBlSWRGb3JUeXBlTmFtZShieXRlW10gbmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFRUeXBlLlN0b3A7CisgICAgICAgICAgICBpZiAobmFtZS5MZW5ndGggPiAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaCAobmFtZVswXSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpICdkJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLkRvdWJsZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIChieXRlKSAnaSc6CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG5hbWVbMV0pCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSkgJzgnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBUVHlwZS5CeXRlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIChieXRlKSAnMSc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLkkxNjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSkgJzMnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBUVHlwZS5JMzI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpICc2JzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuSTY0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIChieXRlKSAnbCc6CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBUVHlwZS5MaXN0OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpICdtJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLk1hcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIChieXRlKSAncic6CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBUVHlwZS5TdHJ1Y3Q7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSkgJ3MnOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVbMV0gPT0gKGJ5dGUpICd0JykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBUVHlwZS5TdHJpbmc7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChuYW1lWzFdID09IChieXRlKSAnZScpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuU2V0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpICd0JzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLkJvb2w7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmVzdWx0ID09IFRUeXBlLlN0b3ApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uTk9UX0lNUExFTUVOVEVELCAiVW5yZWNvZ25pemVkIGV4VHlwZSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gYnl0ZSBjb3VsZCBiZSBhIHZhbGlkIHBhcnQgb2YgYSBKU09OIG51bWJlci4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sIElzSnNvbk51bWVyaWMoYnl0ZSBiKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKGIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknKyc6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknLSc6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknLic6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknMCc6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknMSc6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknMic6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknMyc6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknNCc6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknNSc6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknNic6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknNyc6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknOCc6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknOSc6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknRSc6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknZSc6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBDb252ZXJ0IGEgYnl0ZSBjb250YWluaW5nIGEgaGV4IGNoYXIgKCcwJy0nOScgb3IgJ2EnLSdmJykgaW50byBpdHMKKyAgICAgICAgLy8vICAgICBjb3JyZXNwb25kaW5nIGhleCB2YWx1ZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgc3RhdGljIGJ5dGUgVG9IZXhWYWwoYnl0ZSBjaCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChieXRlKSgoY2hhciljaCAtICcwJyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjaCA+PSAnYScgJiYgY2ggPD0gJ2YnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNoICs9IDEwOworICAgICAgICAgICAgICAgIHJldHVybiAoYnl0ZSkoKGNoYXIpY2ggLSAnYScpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsICJFeHBlY3RlZCBoZXggY2hhcmFjdGVyIik7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgQ29udmVydCBhIGJ5dGUgY29udGFpbmluZyBhIGhleCB2YWx1ZSB0byBpdHMgY29ycmVzcG9uZGluZyBoZXggY2hhcmFjdGVyCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdGF0aWMgYnl0ZSBUb0hleENoYXIoYnl0ZSB2YWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbCAmPSAweDBGOworICAgICAgICAgICAgaWYgKHZhbCA8IDEwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAoYnl0ZSkoKGNoYXIpdmFsICsgJzAnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhbCAtPSAxMDsKKyAgICAgICAgICAgIHJldHVybiAoYnl0ZSkoKGNoYXIpdmFsICsgJ2EnKTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1V0aWxpdGllcy9UUHJvdG9jb2xVdGlsLmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9VdGlsaXRpZXMvVFByb3RvY29sVXRpbC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGIwMzg1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9VdGlsaXRpZXMvVFByb3RvY29sVXRpbC5jcwpAQCAtMCwwICsxLDExMCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzLkVudGl0aWVzOworCituYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29scy5VdGlsaXRpZXMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVFByb3RvY29sVXRpbAorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBhc3luYyBUYXNrIFNraXBBc3luYyhUUHJvdG9jb2wgcHJvdG9jb2wsIFRUeXBlIHR5cGUsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcm90b2NvbC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5Cb29sOgorICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuUmVhZEJvb2xBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5CeXRlOgorICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuUmVhZEJ5dGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5JMTY6CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5SZWFkSTE2QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuSTMyOgorICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuUmVhZEkzMkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkk2NDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLlJlYWRJNjRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5Eb3VibGU6CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5SZWFkRG91YmxlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuU3RyaW5nOgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgdHJ5IHRvIGRlY29kZSB0aGUgc3RyaW5nLCBqdXN0IHNraXAgaXQuCisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5SZWFkQmluYXJ5QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuU3RydWN0OgorICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuUmVhZFN0cnVjdEJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpZWxkID0gYXdhaXQgcHJvdG9jb2wuUmVhZEZpZWxkQmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLlR5cGUgPT0gVFR5cGUuU3RvcCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBTa2lwQXN5bmMocHJvdG9jb2wsIGZpZWxkLlR5cGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5SZWFkRmllbGRFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5SZWFkU3RydWN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuTWFwOgorICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hcCA9IGF3YWl0IHByb3RvY29sLlJlYWRNYXBCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFwLkNvdW50OyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgU2tpcEFzeW5jKHByb3RvY29sLCBtYXAuS2V5VHlwZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFNraXBBc3luYyhwcm90b2NvbCwgbWFwLlZhbHVlVHlwZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuUmVhZE1hcEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLlNldDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZXQgPSBhd2FpdCBwcm90b2NvbC5SZWFkU2V0QmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNldC5Db3VudDsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFNraXBBc3luYyhwcm90b2NvbCwgc2V0LkVsZW1lbnRUeXBlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5SZWFkU2V0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuTGlzdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsaXN0ID0gYXdhaXQgcHJvdG9jb2wuUmVhZExpc3RCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdC5Db3VudDsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFNraXBBc3luYyhwcm90b2NvbCwgbGlzdC5FbGVtZW50VHlwZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuUmVhZExpc3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgIlVua25vd24gZGF0YSB0eXBlICIgKyB0eXBlLlRvU3RyaW5nKCJkIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcm90b2NvbC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1NlcnZlci9Bc3luY0Jhc2VTZXJ2ZXIuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvU2VydmVyL0FzeW5jQmFzZVNlcnZlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjVjMzljCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1NlcnZlci9Bc3luY0Jhc2VTZXJ2ZXIuY3MKQEAgLTAsMCArMSwxODMgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgTWljcm9zb2Z0LkV4dGVuc2lvbnMuTG9nZ2luZzsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHM7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0czsKKworbmFtZXNwYWNlIFRocmlmdC5TZXJ2ZXIKK3sKKyAgICAvL1RPRE86IHVuaGFuZGxlZCBleGNlcHRpb25zLCBldGMuCisKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBBc3luY0Jhc2VTZXJ2ZXIgOiBUQmFzZVNlcnZlcgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbnQgX2NsaWVudFdhaXRpbmdEZWxheTsKKyAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBUYXNrIF9zZXJ2ZXJUYXNrOworCisgICAgICAgIHB1YmxpYyBBc3luY0Jhc2VTZXJ2ZXIoSVRBc3luY1Byb2Nlc3NvciBwcm9jZXNzb3IsIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgSVRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksIElUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgIElMb2dnZXJGYWN0b3J5IGxvZ2dlckZhY3RvcnksIGludCBjbGllbnRXYWl0aW5nRGVsYXkgPSAxMCkKKyAgICAgICAgICAgIDogdGhpcyhuZXcgU2luZ2xldG9uVFByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSwgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwKKyAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgIGxvZ2dlckZhY3RvcnkuQ3JlYXRlTG9nZ2VyKG5hbWVvZihBc3luY0Jhc2VTZXJ2ZXIpKSwgY2xpZW50V2FpdGluZ0RlbGF5KQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQXN5bmNCYXNlU2VydmVyKElUUHJvY2Vzc29yRmFjdG9yeSBpdFByb2Nlc3NvckZhY3RvcnksIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LCBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgSVRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksIElUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgIElMb2dnZXIgbG9nZ2VyLCBpbnQgY2xpZW50V2FpdGluZ0RlbGF5ID0gMTApCisgICAgICAgICAgICA6IGJhc2UoaXRQcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LCBsb2dnZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9jbGllbnRXYWl0aW5nRGVsYXkgPSBjbGllbnRXYWl0aW5nRGVsYXk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBTZXJ2ZUFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBjYW5jZWxhdGlvbiB0b2tlbgorICAgICAgICAgICAgICAgIF9zZXJ2ZXJUYXNrID0gVGFzay5GYWN0b3J5LlN0YXJ0TmV3KCgpID0+IFN0YXJ0TGlzdGVuaW5nKGNhbmNlbGxhdGlvblRva2VuKSwgVGFza0NyZWF0aW9uT3B0aW9ucy5Mb25nUnVubmluZyk7CisgICAgICAgICAgICAgICAgYXdhaXQgX3NlcnZlclRhc2s7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dFcnJvcihleC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYXN5bmMgVGFzayBTdGFydExpc3RlbmluZyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgU2VydmVyVHJhbnNwb3J0Lkxpc3RlbigpOworCisgICAgICAgICAgICBMb2dnZXIuTG9nVHJhY2UoIlN0YXJ0ZWQgbGlzdGVuaW5nIGF0IHNlcnZlciIpOworCisgICAgICAgICAgICBpZiAoU2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgU2VydmVyRXZlbnRIYW5kbGVyLlByZVNlcnZlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3aGlsZSAoIWNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChTZXJ2ZXJUcmFuc3BvcnQuSXNDbGllbnRQZW5kaW5nKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBMb2dnZXIuTG9nVHJhY2UoIldhaXRpbmcgZm9yIGNsaWVudCBjb25uZWN0aW9uIik7CisKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjbGllbnQgPSBhd2FpdCBTZXJ2ZXJUcmFuc3BvcnQuQWNjZXB0QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5GYWN0b3J5LlN0YXJ0TmV3KCgpID0+IEV4ZWN1dGUoY2xpZW50LCBjYW5jZWxsYXRpb25Ub2tlbiksIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dUcmFjZSgkIlRyYW5zcG9ydCBleGNlcHRpb246IHt0dHh9Iik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0dHguVHlwZSAhPSBUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW50ZXJydXB0ZWQpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ0Vycm9yKHR0eC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5EZWxheShUaW1lU3Bhbi5Gcm9tTWlsbGlzZWNvbmRzKF9jbGllbnRXYWl0aW5nRGVsYXkpLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2goVGFza0NhbmNlbGVkRXhjZXB0aW9uKSB7IH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNlcnZlclRyYW5zcG9ydC5DbG9zZSgpOworCisgICAgICAgICAgICBMb2dnZXIuTG9nVHJhY2UoIkNvbXBsZXRlZCBsaXN0ZW5pbmcgYXQgc2VydmVyIik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTdG9wKCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrIEV4ZWN1dGUoVENsaWVudFRyYW5zcG9ydCBjbGllbnQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBMb2dnZXIuTG9nVHJhY2UoIlN0YXJ0ZWQgY2xpZW50IHJlcXVlc3QgcHJvY2Vzc2luZyIpOworCisgICAgICAgICAgICB2YXIgcHJvY2Vzc29yID0gSXRQcm9jZXNzb3JGYWN0b3J5LkdldEFzeW5jUHJvY2Vzc29yKGNsaWVudCwgdGhpcyk7CisKKyAgICAgICAgICAgIFRDbGllbnRUcmFuc3BvcnQgaW5wdXRUcmFuc3BvcnQgPSBudWxsOworICAgICAgICAgICAgVENsaWVudFRyYW5zcG9ydCBvdXRwdXRUcmFuc3BvcnQgPSBudWxsOworICAgICAgICAgICAgVFByb3RvY29sIGlucHV0UHJvdG9jb2wgPSBudWxsOworICAgICAgICAgICAgVFByb3RvY29sIG91dHB1dFByb3RvY29sID0gbnVsbDsKKyAgICAgICAgICAgIG9iamVjdCBjb25uZWN0aW9uQ29udGV4dCA9IG51bGw7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlucHV0VHJhbnNwb3J0ID0gSW5wdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpOworICAgICAgICAgICAgICAgIG91dHB1dFRyYW5zcG9ydCA9IE91dHB1dFRyYW5zcG9ydEZhY3RvcnkuR2V0VHJhbnNwb3J0KGNsaWVudCk7CisKKyAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sID0gSW5wdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2woaW5wdXRUcmFuc3BvcnQpOworICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sID0gT3V0cHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKG91dHB1dFRyYW5zcG9ydCk7CisKKyAgICAgICAgICAgICAgICBpZiAoU2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uQ29udGV4dCA9IGF3YWl0IFNlcnZlckV2ZW50SGFuZGxlci5DcmVhdGVDb250ZXh0QXN5bmMoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoIWNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFhd2FpdCBpbnB1dFRyYW5zcG9ydC5QZWVrQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChTZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgU2VydmVyRXZlbnRIYW5kbGVyLlByb2Nlc3NDb250ZXh0QXN5bmMoY29ubmVjdGlvbkNvbnRleHQsIGlucHV0VHJhbnNwb3J0LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoIWF3YWl0IHByb2Nlc3Nvci5Qcm9jZXNzQXN5bmMoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wsIGNhbmNlbGxhdGlvblRva2VuKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ1RyYWNlKCQiVHJhbnNwb3J0IGV4Y2VwdGlvbjoge3R0eH0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24geCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMb2dnZXIuTG9nRXJyb3IoJCJFcnJvcjoge3h9Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChTZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBTZXJ2ZXJFdmVudEhhbmRsZXIuRGVsZXRlQ29udGV4dEFzeW5jKGNvbm5lY3Rpb25Db250ZXh0LCBpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnB1dFRyYW5zcG9ydD8uQ2xvc2UoKTsKKyAgICAgICAgICAgIG91dHB1dFRyYW5zcG9ydD8uQ2xvc2UoKTsKKworICAgICAgICAgICAgTG9nZ2VyLkxvZ1RyYWNlKCJDb21wbGV0ZWQgY2xpZW50IHJlcXVlc3QgcHJvY2Vzc2luZyIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1NlcnZlci9UQmFzZVNlcnZlci5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9TZXJ2ZXIvVEJhc2VTZXJ2ZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQxZGQ1YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9TZXJ2ZXIvVEJhc2VTZXJ2ZXIuY3MKQEAgLTAsMCArMSw3OSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBNaWNyb3NvZnQuRXh0ZW5zaW9ucy5Mb2dnaW5nOwordXNpbmcgVGhyaWZ0LlByb3RvY29sczsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnRzOworCituYW1lc3BhY2UgVGhyaWZ0LlNlcnZlcgoreworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGFic3RyYWN0IGNsYXNzIFRCYXNlU2VydmVyCisgICAgeworICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgSUxvZ2dlciBMb2dnZXI7CisgICAgICAgIHByb3RlY3RlZCBJVFByb3RvY29sRmFjdG9yeSBJbnB1dFByb3RvY29sRmFjdG9yeTsKKyAgICAgICAgcHJvdGVjdGVkIFRUcmFuc3BvcnRGYWN0b3J5IElucHV0VHJhbnNwb3J0RmFjdG9yeTsKKyAgICAgICAgcHJvdGVjdGVkIElUUHJvY2Vzc29yRmFjdG9yeSBJdFByb2Nlc3NvckZhY3Rvcnk7CisgICAgICAgIHByb3RlY3RlZCBJVFByb3RvY29sRmFjdG9yeSBPdXRwdXRQcm90b2NvbEZhY3Rvcnk7CisgICAgICAgIHByb3RlY3RlZCBUVHJhbnNwb3J0RmFjdG9yeSBPdXRwdXRUcmFuc3BvcnRGYWN0b3J5OworCisgICAgICAgIHByb3RlY3RlZCBUU2VydmVyRXZlbnRIYW5kbGVyIFNlcnZlckV2ZW50SGFuZGxlcjsKKyAgICAgICAgcHJvdGVjdGVkIFRTZXJ2ZXJUcmFuc3BvcnQgU2VydmVyVHJhbnNwb3J0OworCisgICAgICAgIHByb3RlY3RlZCBUQmFzZVNlcnZlcihJVFByb2Nlc3NvckZhY3RvcnkgaXRQcm9jZXNzb3JGYWN0b3J5LCBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IGlucHV0VHJhbnNwb3J0RmFjdG9yeSwgVFRyYW5zcG9ydEZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgIElUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5LCBJVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICBJTG9nZ2VyIGxvZ2dlcikKKyAgICAgICAgeworICAgICAgICAgICAgSXRQcm9jZXNzb3JGYWN0b3J5ID0gaXRQcm9jZXNzb3JGYWN0b3J5ID8/IHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKGl0UHJvY2Vzc29yRmFjdG9yeSkpOworICAgICAgICAgICAgU2VydmVyVHJhbnNwb3J0ID0gc2VydmVyVHJhbnNwb3J0OworICAgICAgICAgICAgSW5wdXRUcmFuc3BvcnRGYWN0b3J5ID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5ID8/IHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKGlucHV0VHJhbnNwb3J0RmFjdG9yeSkpOworICAgICAgICAgICAgT3V0cHV0VHJhbnNwb3J0RmFjdG9yeSA9IG91dHB1dFRyYW5zcG9ydEZhY3RvcnkgPz8gdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbihuYW1lb2Yob3V0cHV0VHJhbnNwb3J0RmFjdG9yeSkpOworICAgICAgICAgICAgSW5wdXRQcm90b2NvbEZhY3RvcnkgPSBpbnB1dFByb3RvY29sRmFjdG9yeSA/PyB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKG5hbWVvZihpbnB1dFByb3RvY29sRmFjdG9yeSkpOworICAgICAgICAgICAgT3V0cHV0UHJvdG9jb2xGYWN0b3J5ID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5ID8/IHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKG91dHB1dFByb3RvY29sRmFjdG9yeSkpOworICAgICAgICAgICAgTG9nZ2VyID0gbG9nZ2VyID8/IHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKGxvZ2dlcikpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgU2V0RXZlbnRIYW5kbGVyKFRTZXJ2ZXJFdmVudEhhbmRsZXIgc2VoKQorICAgICAgICB7CisgICAgICAgICAgICBTZXJ2ZXJFdmVudEhhbmRsZXIgPSBzZWg7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFNlcnZlckV2ZW50SGFuZGxlciBHZXRFdmVudEhhbmRsZXIoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gU2VydmVyRXZlbnRIYW5kbGVyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgU3RvcCgpOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgU3RhcnQoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBkbyBub3RoaW5nCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFNlcnZlQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1NlcnZlci9UU2VydmVyRXZlbnRIYW5kbGVyLmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1NlcnZlci9UU2VydmVyRXZlbnRIYW5kbGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczM2JiNGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvU2VydmVyL1RTZXJ2ZXJFdmVudEhhbmRsZXIuY3MKQEAgLTAsMCArMSw1NCBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHM7CisKK25hbWVzcGFjZSBUaHJpZnQuU2VydmVyCit7CisgICAgLy9UT0RPOiByZXBsYWNlbWVudCBieSBldmVudD8KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gICAgIEludGVyZmFjZSBpbXBsZW1lbnRlZCBieSBzZXJ2ZXIgdXNlcnMgdG8gaGFuZGxlIGV2ZW50cyBmcm9tIHRoZSBzZXJ2ZXIKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGludGVyZmFjZSBUU2VydmVyRXZlbnRIYW5kbGVyCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgQ2FsbGVkIGJlZm9yZSB0aGUgc2VydmVyIGJlZ2lucyAqLworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBUYXNrIFByZVNlcnZlQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBDYWxsZWQgd2hlbiBhIG5ldyBjbGllbnQgaGFzIGNvbm5lY3RlZCBhbmQgaXMgYWJvdXQgdG8gYmVpbmcgcHJvY2Vzc2luZyAqLworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBUYXNrPG9iamVjdD4gQ3JlYXRlQ29udGV4dEFzeW5jKFRQcm90b2NvbCBpbnB1dCwgVFByb3RvY29sIG91dHB1dCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBDYWxsZWQgd2hlbiBhIGNsaWVudCBoYXMgZmluaXNoZWQgcmVxdWVzdC1oYW5kbGluZyB0byBkZWxldGUgc2VydmVyIGNvbnRleHQgKi8KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgVGFzayBEZWxldGVDb250ZXh0QXN5bmMob2JqZWN0IHNlcnZlckNvbnRleHQsIFRQcm90b2NvbCBpbnB1dCwgVFByb3RvY29sIG91dHB1dCwKKyAgICAgICAgICAgIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgQ2FsbGVkIHdoZW4gYSBjbGllbnQgaXMgYWJvdXQgdG8gY2FsbCB0aGUgcHJvY2Vzc29yICovCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFRhc2sgUHJvY2Vzc0NvbnRleHRBc3luYyhvYmplY3Qgc2VydmVyQ29udGV4dCwgVENsaWVudFRyYW5zcG9ydCB0cmFuc3BvcnQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1NpbmdsZXRvblRQcm9jZXNzb3JGYWN0b3J5LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1NpbmdsZXRvblRQcm9jZXNzb3JGYWN0b3J5LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNTEyMzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvU2luZ2xldG9uVFByb2Nlc3NvckZhY3RvcnkuY3MKQEAgLTAsMCArMSwzOCBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgVGhyaWZ0LlNlcnZlcjsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnRzOworCituYW1lc3BhY2UgVGhyaWZ0Cit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgU2luZ2xldG9uVFByb2Nlc3NvckZhY3RvcnkgOiBJVFByb2Nlc3NvckZhY3RvcnkKKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgSVRBc3luY1Byb2Nlc3NvciBfdEFzeW5jUHJvY2Vzc29yOworCisgICAgICAgIHB1YmxpYyBTaW5nbGV0b25UUHJvY2Vzc29yRmFjdG9yeShJVEFzeW5jUHJvY2Vzc29yIHRBc3luY1Byb2Nlc3NvcikKKyAgICAgICAgeworICAgICAgICAgICAgX3RBc3luY1Byb2Nlc3NvciA9IHRBc3luY1Byb2Nlc3NvcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJVEFzeW5jUHJvY2Vzc29yIEdldEFzeW5jUHJvY2Vzc29yKFRDbGllbnRUcmFuc3BvcnQgdHJhbnMsIFRCYXNlU2VydmVyIGJhc2VTZXJ2ZXIgPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX3RBc3luY1Byb2Nlc3NvcjsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWMxNDVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jcwpAQCAtMCwwICsxLDE1MCBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzOwordXNpbmcgVGhyaWZ0LlByb3RvY29scy5FbnRpdGllczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHMuVXRpbGl0aWVzOworCituYW1lc3BhY2UgVGhyaWZ0Cit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIDogVEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIGVudW0gRXhjZXB0aW9uVHlwZQorICAgICAgICB7CisgICAgICAgICAgICBVbmtub3duLAorICAgICAgICAgICAgVW5rbm93bk1ldGhvZCwKKyAgICAgICAgICAgIEludmFsaWRNZXNzYWdlVHlwZSwKKyAgICAgICAgICAgIFdyb25nTWV0aG9kTmFtZSwKKyAgICAgICAgICAgIEJhZFNlcXVlbmNlSWQsCisgICAgICAgICAgICBNaXNzaW5nUmVzdWx0LAorICAgICAgICAgICAgSW50ZXJuYWxFcnJvciwKKyAgICAgICAgICAgIFByb3RvY29sRXJyb3IsCisgICAgICAgICAgICBJbnZhbGlkVHJhbnNmb3JtLAorICAgICAgICAgICAgSW52YWxpZFByb3RvY29sLAorICAgICAgICAgICAgVW5zdXBwb3J0ZWRDbGllbnRUeXBlCisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGNvbnN0IGludCBNZXNzYWdlVHlwZUZpZWxkSWQgPSAxOworICAgICAgICBwcml2YXRlIGNvbnN0IGludCBFeFR5cGVGaWVsZElkID0gMjsKKworICAgICAgICBwcm90ZWN0ZWQgRXhjZXB0aW9uVHlwZSBUeXBlOworCisgICAgICAgIHB1YmxpYyBUQXBwbGljYXRpb25FeGNlcHRpb24oKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKEV4Y2VwdGlvblR5cGUgdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgVHlwZSA9IHR5cGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKEV4Y2VwdGlvblR5cGUgdHlwZSwgc3RyaW5nIG1lc3NhZ2UpCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSkKKyAgICAgICAgeworICAgICAgICAgICAgVHlwZSA9IHR5cGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGFzeW5jIFRhc2s8VEFwcGxpY2F0aW9uRXhjZXB0aW9uPiBSZWFkQXN5bmMoVFByb3RvY29sIGlucHV0UHJvdG9jb2wsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgbWVzc2FnZSA9IG51bGw7CisgICAgICAgICAgICB2YXIgdHlwZSA9IEV4Y2VwdGlvblR5cGUuVW5rbm93bjsKKworICAgICAgICAgICAgYXdhaXQgaW5wdXRQcm90b2NvbC5SZWFkU3RydWN0QmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgZmllbGQgPSBhd2FpdCBpbnB1dFByb3RvY29sLlJlYWRGaWVsZEJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIGlmIChmaWVsZC5UeXBlID09IFRUeXBlLlN0b3ApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGZpZWxkLklEKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBNZXNzYWdlVHlwZUZpZWxkSWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuVHlwZSA9PSBUVHlwZS5TdHJpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IGF3YWl0IGlucHV0UHJvdG9jb2wuUmVhZFN0cmluZ0FzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBUUHJvdG9jb2xVdGlsLlNraXBBc3luYyhpbnB1dFByb3RvY29sLCBmaWVsZC5UeXBlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBFeFR5cGVGaWVsZElkOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLlR5cGUgPT0gVFR5cGUuSTMyKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAoRXhjZXB0aW9uVHlwZSkgYXdhaXQgaW5wdXRQcm90b2NvbC5SZWFkSTMyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFRQcm90b2NvbFV0aWwuU2tpcEFzeW5jKGlucHV0UHJvdG9jb2wsIGZpZWxkLlR5cGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgVFByb3RvY29sVXRpbC5Ta2lwQXN5bmMoaW5wdXRQcm90b2NvbCwgZmllbGQuVHlwZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYXdhaXQgaW5wdXRQcm90b2NvbC5SZWFkRmllbGRFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF3YWl0IGlucHV0UHJvdG9jb2wuUmVhZFN0cnVjdEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgcmV0dXJuIG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24odHlwZSwgbWVzc2FnZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYXN5bmMgVGFzayBXcml0ZUFzeW5jKFRQcm90b2NvbCBvdXRwdXRQcm90b2NvbCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbnN0IHN0cmluZyBtZXNzYWdlVHlwZUZpZWxkTmFtZSA9ICJtZXNzYWdlIjsKKyAgICAgICAgICAgIGNvbnN0IHN0cmluZyBleFR5cGVGaWVsZE5hbWUgPSAiZXhUeXBlIjsKKyAgICAgICAgICAgIGNvbnN0IHN0cmluZyBzdHJ1Y3RBcHBsaWNhdGlvbkV4Y2VwdGlvbk5hbWUgPSAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIjsKKworICAgICAgICAgICAgdmFyIHN0cnVjID0gbmV3IFRTdHJ1Y3Qoc3RydWN0QXBwbGljYXRpb25FeGNlcHRpb25OYW1lKTsKKyAgICAgICAgICAgIHZhciBmaWVsZCA9IG5ldyBURmllbGQoKTsKKworICAgICAgICAgICAgYXdhaXQgb3V0cHV0UHJvdG9jb2wuV3JpdGVTdHJ1Y3RCZWdpbkFzeW5jKHN0cnVjLCBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoTWVzc2FnZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmllbGQuTmFtZSA9IG1lc3NhZ2VUeXBlRmllbGROYW1lOworICAgICAgICAgICAgICAgIGZpZWxkLlR5cGUgPSBUVHlwZS5TdHJpbmc7CisgICAgICAgICAgICAgICAgZmllbGQuSUQgPSBNZXNzYWdlVHlwZUZpZWxkSWQ7CisgICAgICAgICAgICAgICAgYXdhaXQgb3V0cHV0UHJvdG9jb2wuV3JpdGVGaWVsZEJlZ2luQXN5bmMoZmllbGQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICBhd2FpdCBvdXRwdXRQcm90b2NvbC5Xcml0ZVN0cmluZ0FzeW5jKE1lc3NhZ2UsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICBhd2FpdCBvdXRwdXRQcm90b2NvbC5Xcml0ZUZpZWxkRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaWVsZC5OYW1lID0gZXhUeXBlRmllbGROYW1lOworICAgICAgICAgICAgZmllbGQuVHlwZSA9IFRUeXBlLkkzMjsKKyAgICAgICAgICAgIGZpZWxkLklEID0gRXhUeXBlRmllbGRJZDsKKworICAgICAgICAgICAgYXdhaXQgb3V0cHV0UHJvdG9jb2wuV3JpdGVGaWVsZEJlZ2luQXN5bmMoZmllbGQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IG91dHB1dFByb3RvY29sLldyaXRlSTMyQXN5bmMoKGludCkgVHlwZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgb3V0cHV0UHJvdG9jb2wuV3JpdGVGaWVsZEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IG91dHB1dFByb3RvY29sLldyaXRlRmllbGRTdG9wQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgb3V0cHV0UHJvdG9jb2wuV3JpdGVTdHJ1Y3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1RCYXNlQ2xpZW50LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RCYXNlQ2xpZW50LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMTkyNTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVEJhc2VDbGllbnQuY3MKQEAgLTAsMCArMSw5MSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzOworCituYW1lc3BhY2UgVGhyaWZ0Cit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vICAgICBUQmFzZUNsaWVudC4KKyAgICAvLy8gICAgIEJhc2UgY2xpZW50IGZvciBnZW5lcmF0ZWQgY2xpZW50cy4KKyAgICAvLy8gICAgIERvIG5vdCBjaGFuZ2UgdGhpcyBjbGFzcyB3aXRob3V0IGNoZWNraW5nIGdlbmVyYXRlZCBjb2RlIChuYW1pbmdzLCBldGMuKQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGFic3RyYWN0IGNsYXNzIFRCYXNlQ2xpZW50CisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFRQcm90b2NvbCBfaW5wdXRQcm90b2NvbDsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBUUHJvdG9jb2wgX291dHB1dFByb3RvY29sOworICAgICAgICBwcml2YXRlIGJvb2wgX2lzRGlzcG9zZWQ7CisgICAgICAgIHByaXZhdGUgaW50IF9zZXFJZDsKKyAgICAgICAgcHVibGljIHJlYWRvbmx5IEd1aWQgQ2xpZW50SWQgPSBHdWlkLk5ld0d1aWQoKTsKKworICAgICAgICBwcm90ZWN0ZWQgVEJhc2VDbGllbnQoVFByb3RvY29sIGlucHV0UHJvdG9jb2wsIFRQcm90b2NvbCBvdXRwdXRQcm90b2NvbCkKKyAgICAgICAgeworICAgICAgICAgICAgX2lucHV0UHJvdG9jb2wgPSBpbnB1dFByb3RvY29sID8/IHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKGlucHV0UHJvdG9jb2wpKTsKKyAgICAgICAgICAgIF9vdXRwdXRQcm90b2NvbCA9IG91dHB1dFByb3RvY29sID8/IHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKG91dHB1dFByb3RvY29sKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFByb3RvY29sIElucHV0UHJvdG9jb2wgPT4gX2lucHV0UHJvdG9jb2w7CisKKyAgICAgICAgcHVibGljIFRQcm90b2NvbCBPdXRwdXRQcm90b2NvbCA9PiBfb3V0cHV0UHJvdG9jb2w7CisKKyAgICAgICAgcHVibGljIGludCBTZXFJZAorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gKytfc2VxSWQ7IH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgT3BlblRyYW5zcG9ydEFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgT3BlblRyYW5zcG9ydEFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBPcGVuVHJhbnNwb3J0QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghX2lucHV0UHJvdG9jb2wuVHJhbnNwb3J0LklzT3BlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBfaW5wdXRQcm90b2NvbC5UcmFuc3BvcnQuT3BlbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFfaW5wdXRQcm90b2NvbC5UcmFuc3BvcnQuSXNPcGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IF9vdXRwdXRQcm90b2NvbC5UcmFuc3BvcnQuT3BlbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIERpc3Bvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBEaXNwb3NlKHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIV9pc0Rpc3Bvc2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkaXNwb3NpbmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfaW5wdXRQcm90b2NvbD8uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICBfb3V0cHV0UHJvdG9jb2w/LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9pc0Rpc3Bvc2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9URXhjZXB0aW9uLmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RFeGNlcHRpb24uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFhNTg4ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9URXhjZXB0aW9uLmNzCkBAIC0wLDAgKzEsMzQgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKKworbmFtZXNwYWNlIFRocmlmdAoreworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIFRFeGNlcHRpb24gOiBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBURXhjZXB0aW9uKCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRFeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UpCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSkKKyAgICAgICAgeworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvVE11bHRpcGxleGVkUHJvY2Vzc29yLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMGU3NDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVE11bHRpcGxleGVkUHJvY2Vzc29yLmNzCkBAIC0wLDAgKzEsMTQzIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgVGhyaWZ0LlByb3RvY29sczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHMuRW50aXRpZXM7CisKK25hbWVzcGFjZSBUaHJpZnQKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgOiBJVEFzeW5jUHJvY2Vzc29yCisgICAgeworICAgICAgICAvL1RPRE86IExvY2FsaXphdGlvbgorCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRGljdGlvbmFyeTxzdHJpbmcsIElUQXN5bmNQcm9jZXNzb3I+IF9zZXJ2aWNlUHJvY2Vzc29yTWFwID0KKyAgICAgICAgICAgIG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgSVRBc3luY1Byb2Nlc3Nvcj4oKTsKKworICAgICAgICBwdWJsaWMgYXN5bmMgVGFzazxib29sPiBQcm9jZXNzQXN5bmMoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBQcm9jZXNzQXN5bmMoaXByb3QsIG9wcm90LCBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrPGJvb2w+IFByb2Nlc3NBc3luYyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8Ym9vbD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgbWVzc2FnZSA9IGF3YWl0IGlwcm90LlJlYWRNZXNzYWdlQmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgICAgICBpZiAoKG1lc3NhZ2UuVHlwZSAhPSBUTWVzc2FnZVR5cGUuQ2FsbCkgJiYgKG1lc3NhZ2UuVHlwZSAhPSBUTWVzc2FnZVR5cGUuT25ld2F5KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IEZhaWxBc3luYyhvcHJvdCwgbWVzc2FnZSwgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW52YWxpZE1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIk1lc3NhZ2UgZXhUeXBlIENBTEwgb3IgT05FV0FZIGV4cGVjdGVkIiwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gRXh0cmFjdCB0aGUgc2VydmljZSBuYW1lCisgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gbWVzc2FnZS5OYW1lLkluZGV4T2YoVE11bHRpcGxleGVkUHJvdG9jb2wuU2VwYXJhdG9yLCBTdHJpbmdDb21wYXJpc29uLk9yZGluYWwpOworICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhd2FpdCBGYWlsQXN5bmMob3Byb3QsIG1lc3NhZ2UsIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkludmFsaWRQcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICQiU2VydmljZSBuYW1lIG5vdCBmb3VuZCBpbiBtZXNzYWdlIG5hbWU6IHttZXNzYWdlLk5hbWV9LiBEaWQgeW91IGZvcmdldCB0byB1c2UgYSBUTXVsdGlwbGV4UHJvdG9jb2wgaW4geW91ciBjbGllbnQ/IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBUTWVzc2FnZSwgc29tZXRoaW5nIHRoYXQgY2FuIGJlIGNvbnN1bWVkIGJ5IGFueSBUUHJvdG9jb2wKKyAgICAgICAgICAgICAgICB2YXIgc2VydmljZU5hbWUgPSBtZXNzYWdlLk5hbWUuU3Vic3RyaW5nKDAsIGluZGV4KTsKKyAgICAgICAgICAgICAgICBJVEFzeW5jUHJvY2Vzc29yIGFjdHVhbFByb2Nlc3NvcjsKKyAgICAgICAgICAgICAgICBpZiAoIV9zZXJ2aWNlUHJvY2Vzc29yTWFwLlRyeUdldFZhbHVlKHNlcnZpY2VOYW1lLCBvdXQgYWN0dWFsUHJvY2Vzc29yKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IEZhaWxBc3luYyhvcHJvdCwgbWVzc2FnZSwgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW50ZXJuYWxFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICQiU2VydmljZSBuYW1lIG5vdCBmb3VuZDoge3NlcnZpY2VOYW1lfS4gRGlkIHlvdSBmb3JnZXQgdG8gY2FsbCBSZWdpc3RlclByb2Nlc3NvcigpPyIsCisgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgVE1lc3NhZ2UsIHJlbW92aW5nIHRoZSBzZXJ2aWNlIG5hbWUKKyAgICAgICAgICAgICAgICB2YXIgbmV3TWVzc2FnZSA9IG5ldyBUTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5OYW1lLlN1YnN0cmluZyhzZXJ2aWNlTmFtZS5MZW5ndGggKyBUTXVsdGlwbGV4ZWRQcm90b2NvbC5TZXBhcmF0b3IuTGVuZ3RoKSwKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5UeXBlLAorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLlNlcUlEKTsKKworICAgICAgICAgICAgICAgIC8vIERpc3BhdGNoIHByb2Nlc3NpbmcgdG8gdGhlIHN0b3JlZCBwcm9jZXNzb3IKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICAgICAgYXdhaXQKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbFByb2Nlc3Nvci5Qcm9jZXNzQXN5bmMobmV3IFN0b3JlZE1lc3NhZ2VQcm90b2NvbChpcHJvdCwgbmV3TWVzc2FnZSksIG9wcm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIHNpbWlsYXIgdG8gYWxsIG90aGVyIHByb2Nlc3NvcnMKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIFJlZ2lzdGVyUHJvY2Vzc29yKHN0cmluZyBzZXJ2aWNlTmFtZSwgSVRBc3luY1Byb2Nlc3NvciBwcm9jZXNzb3IpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfc2VydmljZVByb2Nlc3Nvck1hcC5Db250YWluc0tleShzZXJ2aWNlTmFtZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICQiUHJvY2Vzc29yIG1hcCBhbHJlYWR5IGNvbnRhaW5zIHByb2Nlc3NvciB3aXRoIG5hbWU6ICd7c2VydmljZU5hbWV9JyIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfc2VydmljZVByb2Nlc3Nvck1hcC5BZGQoc2VydmljZU5hbWUsIHByb2Nlc3Nvcik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2sgRmFpbEFzeW5jKFRQcm90b2NvbCBvcHJvdCwgVE1lc3NhZ2UgbWVzc2FnZSwgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUgZXh0eXBlLAorICAgICAgICAgICAgc3RyaW5nIGV0eHQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgYXBwZXggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKGV4dHlwZSwgZXR4dCk7CisKKyAgICAgICAgICAgIHZhciBuZXdNZXNzYWdlID0gbmV3IFRNZXNzYWdlKG1lc3NhZ2UuTmFtZSwgVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbiwgbWVzc2FnZS5TZXFJRCk7CisKKyAgICAgICAgICAgIGF3YWl0IG9wcm90LldyaXRlTWVzc2FnZUJlZ2luQXN5bmMobmV3TWVzc2FnZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgYXBwZXguV3JpdGVBc3luYyhvcHJvdCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgb3Byb3QuV3JpdGVNZXNzYWdlRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgb3Byb3QuVHJhbnNwb3J0LkZsdXNoQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBTdG9yZWRNZXNzYWdlUHJvdG9jb2wgOiBUUHJvdG9jb2xEZWNvcmF0b3IKKyAgICAgICAgeworICAgICAgICAgICAgcmVhZG9ubHkgVE1lc3NhZ2UgX21zZ0JlZ2luOworCisgICAgICAgICAgICBwdWJsaWMgU3RvcmVkTWVzc2FnZVByb3RvY29sKFRQcm90b2NvbCBwcm90b2NvbCwgVE1lc3NhZ2UgbWVzc2FnZUJlZ2luKQorICAgICAgICAgICAgICAgIDogYmFzZShwcm90b2NvbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfbXNnQmVnaW4gPSBtZXNzYWdlQmVnaW47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRNZXNzYWdlPiBSZWFkTWVzc2FnZUJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPFRNZXNzYWdlPihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIF9tc2dCZWdpbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvVGhyaWZ0LmNzcHJvaiBiL2xpYi9uZXRjb3JlL1RocmlmdC9UaHJpZnQuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MDZmZWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVGhyaWZ0LmNzcHJvagpAQCAtMCwwICsxLDMxIEBACis8UHJvamVjdCBTZGs9Ik1pY3Jvc29mdC5ORVQuU2RrIj4KKworICA8UHJvcGVydHlHcm91cD4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrPm5ldHN0YW5kYXJkMi4wPC9UYXJnZXRGcmFtZXdvcms+CisgICAgPEFzc2VtYmx5TmFtZT5UaHJpZnQ8L0Fzc2VtYmx5TmFtZT4KKyAgICA8UGFja2FnZUlkPlRocmlmdDwvUGFja2FnZUlkPgorICAgIDxBdXRvR2VuZXJhdGVCaW5kaW5nUmVkaXJlY3RzPnRydWU8L0F1dG9HZW5lcmF0ZUJpbmRpbmdSZWRpcmVjdHM+CisgICAgPEdlbmVyYXRlQmluZGluZ1JlZGlyZWN0c091dHB1dFR5cGU+dHJ1ZTwvR2VuZXJhdGVCaW5kaW5nUmVkaXJlY3RzT3V0cHV0VHlwZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseVRpdGxlQXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5VGl0bGVBdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlEZXNjcmlwdGlvbkF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseURlc2NyaXB0aW9uQXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5Q29uZmlndXJhdGlvbkF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUNvbmZpZ3VyYXRpb25BdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb21wYW55QXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29tcGFueUF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseVByb2R1Y3RBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlQcm9kdWN0QXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5Q29weXJpZ2h0QXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29weXJpZ2h0QXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5VmVyc2lvbkF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseVZlcnNpb25BdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlGaWxlVmVyc2lvbkF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUZpbGVWZXJzaW9uQXR0cmlidXRlPgorICA8L1Byb3BlcnR5R3JvdXA+CisKKyAgPEl0ZW1Hcm91cD4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuQXNwTmV0Q29yZSIgVmVyc2lvbj0iWzIuMCwpIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5FeHRlbnNpb25zLkxvZ2dpbmciIFZlcnNpb249IlsyLjAsKSIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuRXh0ZW5zaW9ucy5Mb2dnaW5nLkNvbnNvbGUiIFZlcnNpb249IlsyLjAsKSIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuRXh0ZW5zaW9ucy5Mb2dnaW5nLkRlYnVnIiBWZXJzaW9uPSJbMi4wLCkiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLklPLlBpcGVzIiBWZXJzaW9uPSJbNC4zLCkiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLk5ldC5IdHRwLldpbkh0dHBIYW5kbGVyIiBWZXJzaW9uPSI0LjQuMCIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uTmV0Lk5hbWVSZXNvbHV0aW9uIiBWZXJzaW9uPSJbNC4zLCkiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLk5ldC5SZXF1ZXN0cyIgVmVyc2lvbj0iWzQuMywpIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5OZXQuU2VjdXJpdHkiIFZlcnNpb249Ils0LjMsKSIgLz4KKyAgPC9JdGVtR3JvdXA+CisKKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9UQnVmZmVyZWRDbGllbnRUcmFuc3BvcnQuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVEJ1ZmZlcmVkQ2xpZW50VHJhbnNwb3J0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MWYxYWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVEJ1ZmZlcmVkQ2xpZW50VHJhbnNwb3J0LmNzCkBAIC0wLDAgKzEsMjA2IEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKKworbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnRzLkNsaWVudAoreworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIFRCdWZmZXJlZENsaWVudFRyYW5zcG9ydCA6IFRDbGllbnRUcmFuc3BvcnQKKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IF9idWZTaXplOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IE1lbW9yeVN0cmVhbSBfaW5wdXRCdWZmZXIgPSBuZXcgTWVtb3J5U3RyZWFtKDApOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IE1lbW9yeVN0cmVhbSBfb3V0cHV0QnVmZmVyID0gbmV3IE1lbW9yeVN0cmVhbSgwKTsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBUQ2xpZW50VHJhbnNwb3J0IF90cmFuc3BvcnQ7CisgICAgICAgIHByaXZhdGUgYm9vbCBfaXNEaXNwb3NlZDsKKworICAgICAgICAvL1RPRE86IHNob3VsZCBzdXBwb3J0IG9ubHkgc3BlY2lmaWVkIGlucHV0IHRyYW5zcG9ydD8KKyAgICAgICAgcHVibGljIFRCdWZmZXJlZENsaWVudFRyYW5zcG9ydChUQ2xpZW50VHJhbnNwb3J0IHRyYW5zcG9ydCwgaW50IGJ1ZlNpemUgPSAxMDI0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYnVmU2l6ZSA8PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24obmFtZW9mKGJ1ZlNpemUpLCAiQnVmZmVyIHNpemUgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlci4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX3RyYW5zcG9ydCA9IHRyYW5zcG9ydCA/PyB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKG5hbWVvZih0cmFuc3BvcnQpKTsKKyAgICAgICAgICAgIF9idWZTaXplID0gYnVmU2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUQ2xpZW50VHJhbnNwb3J0IFVuZGVybHlpbmdUcmFuc3BvcnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIF90cmFuc3BvcnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc09wZW4gPT4gIV9pc0Rpc3Bvc2VkICYmIF90cmFuc3BvcnQuSXNPcGVuOworCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIE9wZW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworCisgICAgICAgICAgICBhd2FpdCBfdHJhbnNwb3J0Lk9wZW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKKworICAgICAgICAgICAgX3RyYW5zcG9ydC5DbG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8aW50PiBSZWFkQXN5bmMoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwKKyAgICAgICAgICAgIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICAvL1RPRE86IGludmVzdGlnYXRlIGhvdyBpdCBzaG91bGQgd29yayBjb3JyZWN0bHkKKyAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKKworICAgICAgICAgICAgVmFsaWRhdGVCdWZmZXJBcmdzKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgpOworCisgICAgICAgICAgICBpZiAoIUlzT3BlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChfaW5wdXRCdWZmZXIuQ2FwYWNpdHkgPCBfYnVmU2l6ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfaW5wdXRCdWZmZXIuQ2FwYWNpdHkgPSBfYnVmU2l6ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGdvdCA9IGF3YWl0IF9pbnB1dEJ1ZmZlci5SZWFkQXN5bmMoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgaWYgKGdvdCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdvdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX2lucHV0QnVmZmVyLlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisgICAgICAgICAgICBfaW5wdXRCdWZmZXIuU2V0TGVuZ3RoKF9pbnB1dEJ1ZmZlci5DYXBhY2l0eSk7CisKKyAgICAgICAgICAgIEFycmF5U2VnbWVudDxieXRlPiBidWZTZWdtZW50OworICAgICAgICAgICAgX2lucHV0QnVmZmVyLlRyeUdldEJ1ZmZlcihvdXQgYnVmU2VnbWVudCk7CisKKyAgICAgICAgICAgIC8vIGludmVzdGlnYXRlCisgICAgICAgICAgICB2YXIgZmlsbGVkID0gYXdhaXQgX3RyYW5zcG9ydC5SZWFkQXN5bmMoYnVmU2VnbWVudC5BcnJheSwgMCwgKGludCkgX2lucHV0QnVmZmVyLkxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgX2lucHV0QnVmZmVyLlNldExlbmd0aChmaWxsZWQpOworCisgICAgICAgICAgICBpZiAoZmlsbGVkID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkQXN5bmMoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworCisgICAgICAgICAgICBWYWxpZGF0ZUJ1ZmZlckFyZ3MoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCk7CisKKyAgICAgICAgICAgIGlmICghSXNPcGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUmVsYXRpdmUgb2Zmc2V0IGZyb20gIm9mZiIgYXJndW1lbnQKKyAgICAgICAgICAgIHZhciB3cml0dGVuQ291bnQgPSAwOworICAgICAgICAgICAgaWYgKF9vdXRwdXRCdWZmZXIuTGVuZ3RoID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgY2FwYSA9IChpbnQpIChfb3V0cHV0QnVmZmVyLkNhcGFjaXR5IC0gX291dHB1dEJ1ZmZlci5MZW5ndGgpOworICAgICAgICAgICAgICAgIHZhciB3cml0ZVNpemUgPSBjYXBhIDw9IGxlbmd0aCA/IGNhcGEgOiBsZW5ndGg7CisgICAgICAgICAgICAgICAgYXdhaXQgX291dHB1dEJ1ZmZlci5Xcml0ZUFzeW5jKGJ1ZmZlciwgb2Zmc2V0LCB3cml0ZVNpemUsIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgICAgIHdyaXR0ZW5Db3VudCArPSB3cml0ZVNpemU7CisgICAgICAgICAgICAgICAgaWYgKHdyaXRlU2l6ZSA9PSBjYXBhKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy9BcnJheVNlZ21lbnQ8Ynl0ZT4gYnVmU2VnbWVudDsKKyAgICAgICAgICAgICAgICAgICAgLy9fb3V0cHV0QnVmZmVyLlRyeUdldEJ1ZmZlcihvdXQgYnVmU2VnbWVudCk7CisgICAgICAgICAgICAgICAgICAgIHZhciBkYXRhID0gX291dHB1dEJ1ZmZlci5Ub0FycmF5KCk7CisgICAgICAgICAgICAgICAgICAgIC8vYXdhaXQgX3RyYW5zcG9ydC5Xcml0ZUFzeW5jKGJ1ZlNlZ21lbnQuQXJyYXksIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgX3RyYW5zcG9ydC5Xcml0ZUFzeW5jKGRhdGEsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgX291dHB1dEJ1ZmZlci5TZXRMZW5ndGgoMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3aGlsZSAobGVuZ3RoIC0gd3JpdHRlbkNvdW50ID49IF9idWZTaXplKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IF90cmFuc3BvcnQuV3JpdGVBc3luYyhidWZmZXIsIG9mZnNldCArIHdyaXR0ZW5Db3VudCwgX2J1ZlNpemUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICB3cml0dGVuQ291bnQgKz0gX2J1ZlNpemU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciByZW1haW4gPSBsZW5ndGggLSB3cml0dGVuQ291bnQ7CisgICAgICAgICAgICBpZiAocmVtYWluID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX291dHB1dEJ1ZmZlci5DYXBhY2l0eSA8IF9idWZTaXplKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX291dHB1dEJ1ZmZlci5DYXBhY2l0eSA9IF9idWZTaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhd2FpdCBfb3V0cHV0QnVmZmVyLldyaXRlQXN5bmMoYnVmZmVyLCBvZmZzZXQgKyB3cml0dGVuQ291bnQsIHJlbWFpbiwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgRmx1c2hBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworCisgICAgICAgICAgICBpZiAoIUlzT3BlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChfb3V0cHV0QnVmZmVyLkxlbmd0aCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9BcnJheVNlZ21lbnQ8Ynl0ZT4gYnVmU2VnbWVudDsKKyAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IF9vdXRwdXRCdWZmZXIuVG9BcnJheSgpOyAvLyBUcnlHZXRCdWZmZXIob3V0IGJ1ZlNlZ21lbnQpOworCisgICAgICAgICAgICAgICAgYXdhaXQgX3RyYW5zcG9ydC5Xcml0ZUFzeW5jKGRhdGEgLypidWZTZWdtZW50LkFycmF5Ki8sIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICBfb3V0cHV0QnVmZmVyLlNldExlbmd0aCgwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgX3RyYW5zcG9ydC5GbHVzaEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBDaGVja05vdERpc3Bvc2VkKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9pc0Rpc3Bvc2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBPYmplY3REaXNwb3NlZEV4Y2VwdGlvbihuYW1lb2YoX3RyYW5zcG9ydCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gSURpc3Bvc2FibGUKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFfaXNEaXNwb3NlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlzcG9zaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2lucHV0QnVmZmVyPy5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIF9vdXRwdXRCdWZmZXI/LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgX3RyYW5zcG9ydD8uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9pc0Rpc3Bvc2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVEZyYW1lZENsaWVudFRyYW5zcG9ydC5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9URnJhbWVkQ2xpZW50VHJhbnNwb3J0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMWJiOTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVEZyYW1lZENsaWVudFRyYW5zcG9ydC5jcwpAQCAtMCwwICsxLDIwMSBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0cy5DbGllbnQKK3sKKyAgICAvL1RPRE86IGNoZWNrIGZvciBjb3JyZWN0IGltcGxlbWVudGF0aW9uIAorCisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVEZyYW1lZENsaWVudFRyYW5zcG9ydCA6IFRDbGllbnRUcmFuc3BvcnQKKyAgICB7CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IEhlYWRlclNpemUgPSA0OworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGJ5dGVbXSBfaGVhZGVyQnVmID0gbmV3IGJ5dGVbSGVhZGVyU2l6ZV07CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgTWVtb3J5U3RyZWFtIF9yZWFkQnVmZmVyID0gbmV3IE1lbW9yeVN0cmVhbSgxMDI0KTsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBUQ2xpZW50VHJhbnNwb3J0IF90cmFuc3BvcnQ7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgTWVtb3J5U3RyZWFtIF93cml0ZUJ1ZmZlciA9IG5ldyBNZW1vcnlTdHJlYW0oMTAyNCk7CisKKyAgICAgICAgcHJpdmF0ZSBib29sIF9pc0Rpc3Bvc2VkOworCisgICAgICAgIHB1YmxpYyBURnJhbWVkQ2xpZW50VHJhbnNwb3J0KFRDbGllbnRUcmFuc3BvcnQgdHJhbnNwb3J0KQorICAgICAgICB7CisgICAgICAgICAgICBfdHJhbnNwb3J0ID0gdHJhbnNwb3J0ID8/IHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKHRyYW5zcG9ydCkpOworCisgICAgICAgICAgICBJbml0V3JpdGVCdWZmZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbiA9PiAhX2lzRGlzcG9zZWQgJiYgX3RyYW5zcG9ydC5Jc09wZW47CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgT3BlbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisKKyAgICAgICAgICAgIGF3YWl0IF90cmFuc3BvcnQuT3BlbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworCisgICAgICAgICAgICBfdHJhbnNwb3J0LkNsb3NlKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxpbnQ+IFJlYWRBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKKworICAgICAgICAgICAgVmFsaWRhdGVCdWZmZXJBcmdzKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgpOworCisgICAgICAgICAgICBpZiAoIUlzT3BlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBnb3QgPSBhd2FpdCBfcmVhZEJ1ZmZlci5SZWFkQXN5bmMoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgaWYgKGdvdCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdvdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUmVhZCBhbm90aGVyIGZyYW1lIG9mIGRhdGEKKyAgICAgICAgICAgIGF3YWl0IFJlYWRGcmFtZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF9yZWFkQnVmZmVyLlJlYWRBc3luYyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2sgUmVhZEZyYW1lQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF90cmFuc3BvcnQuUmVhZEFsbEFzeW5jKF9oZWFkZXJCdWYsIDAsIEhlYWRlclNpemUsIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgdmFyIHNpemUgPSBEZWNvZGVGcmFtZVNpemUoX2hlYWRlckJ1Zik7CisKKyAgICAgICAgICAgIF9yZWFkQnVmZmVyLlNldExlbmd0aChzaXplKTsKKyAgICAgICAgICAgIF9yZWFkQnVmZmVyLlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisKKyAgICAgICAgICAgIEFycmF5U2VnbWVudDxieXRlPiBidWZTZWdtZW50OworICAgICAgICAgICAgX3JlYWRCdWZmZXIuVHJ5R2V0QnVmZmVyKG91dCBidWZTZWdtZW50KTsKKworICAgICAgICAgICAgdmFyIGJ1ZmYgPSBidWZTZWdtZW50LkFycmF5OworCisgICAgICAgICAgICBhd2FpdCBfdHJhbnNwb3J0LlJlYWRBbGxBc3luYyhidWZmLCAwLCBzaXplLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUFzeW5jKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisKKyAgICAgICAgICAgIFZhbGlkYXRlQnVmZmVyQXJncyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoKTsKKworICAgICAgICAgICAgaWYgKCFJc09wZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoX3dyaXRlQnVmZmVyLkxlbmd0aCArIGxlbmd0aCA+IGludC5NYXhWYWx1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBGbHVzaEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgX3dyaXRlQnVmZmVyLldyaXRlQXN5bmMoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgRmx1c2hBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworCisgICAgICAgICAgICBpZiAoIUlzT3BlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vQXJyYXlTZWdtZW50PGJ5dGU+IGJ1ZlNlZ21lbnQ7CisgICAgICAgICAgICAvL193cml0ZUJ1ZmZlci5UcnlHZXRCdWZmZXIob3V0IGJ1ZlNlZ21lbnQpOworICAgICAgICAgICAgLy92YXIgYnVmID0gYnVmU2VnbWVudC5BcnJheTsKKyAgICAgICAgICAgIHZhciBidWYgPSBfd3JpdGVCdWZmZXIuVG9BcnJheSgpOworCisgICAgICAgICAgICAvL3ZhciBsZW4gPSAoaW50KV93cml0ZUJ1ZmZlci5MZW5ndGg7CisgICAgICAgICAgICB2YXIgZGF0YUxlbiA9IChpbnQpIF93cml0ZUJ1ZmZlci5MZW5ndGggLSBIZWFkZXJTaXplOworICAgICAgICAgICAgaWYgKGRhdGFMZW4gPCAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCk7IC8vIGxvZ2ljIGVycm9yIGFjdHVhbGx5CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEluamVjdCBtZXNzYWdlIGhlYWRlciBpbnRvIHRoZSByZXNlcnZlZCBidWZmZXIgc3BhY2UKKyAgICAgICAgICAgIEVuY29kZUZyYW1lU2l6ZShkYXRhTGVuLCBidWYpOworCisgICAgICAgICAgICAvLyBTZW5kIHRoZSBlbnRpcmUgbWVzc2FnZSBhdCBvbmNlCisgICAgICAgICAgICBhd2FpdCBfdHJhbnNwb3J0LldyaXRlQXN5bmMoYnVmLCBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgIEluaXRXcml0ZUJ1ZmZlcigpOworCisgICAgICAgICAgICBhd2FpdCBfdHJhbnNwb3J0LkZsdXNoQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIEluaXRXcml0ZUJ1ZmZlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFJlc2VydmUgc3BhY2UgZm9yIG1lc3NhZ2UgaGVhZGVyIHRvIGJlIHB1dCByaWdodCBiZWZvcmUgc2VuZGluZyBpdCBvdXQKKyAgICAgICAgICAgIF93cml0ZUJ1ZmZlci5TZXRMZW5ndGgoSGVhZGVyU2l6ZSk7CisgICAgICAgICAgICBfd3JpdGVCdWZmZXIuU2VlaygwLCBTZWVrT3JpZ2luLkVuZCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEVuY29kZUZyYW1lU2l6ZShpbnQgZnJhbWVTaXplLCBieXRlW10gYnVmKQorICAgICAgICB7CisgICAgICAgICAgICBidWZbMF0gPSAoYnl0ZSkgKDB4ZmYgJiAoZnJhbWVTaXplID4+IDI0KSk7CisgICAgICAgICAgICBidWZbMV0gPSAoYnl0ZSkgKDB4ZmYgJiAoZnJhbWVTaXplID4+IDE2KSk7CisgICAgICAgICAgICBidWZbMl0gPSAoYnl0ZSkgKDB4ZmYgJiAoZnJhbWVTaXplID4+IDgpKTsKKyAgICAgICAgICAgIGJ1ZlszXSA9IChieXRlKSAoMHhmZiAmIChmcmFtZVNpemUpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGludCBEZWNvZGVGcmFtZVNpemUoYnl0ZVtdIGJ1ZikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgKChidWZbMF0gJiAweGZmKSA8PCAyNCkgfAorICAgICAgICAgICAgICAgICgoYnVmWzFdICYgMHhmZikgPDwgMTYpIHwKKyAgICAgICAgICAgICAgICAoKGJ1ZlsyXSAmIDB4ZmYpIDw8IDgpIHwKKyAgICAgICAgICAgICAgICAoYnVmWzNdICYgMHhmZik7CisgICAgICAgIH0KKworCisgICAgICAgIHByaXZhdGUgdm9pZCBDaGVja05vdERpc3Bvc2VkKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9pc0Rpc3Bvc2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBPYmplY3REaXNwb3NlZEV4Y2VwdGlvbigiVEZyYW1lZENsaWVudFRyYW5zcG9ydCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gSURpc3Bvc2FibGUKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFfaXNEaXNwb3NlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlzcG9zaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX3JlYWRCdWZmZXI/LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgX3dyaXRlQnVmZmVyPy5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIF90cmFuc3BvcnQ/LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfaXNEaXNwb3NlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvQ2xpZW50L1RIdHRwQ2xpZW50VHJhbnNwb3J0LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvQ2xpZW50L1RIdHRwQ2xpZW50VHJhbnNwb3J0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5N2QzODAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVEh0dHBDbGllbnRUcmFuc3BvcnQuY3MKQEAgLTAsMCArMSwyMjYgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uTmV0Lkh0dHA7Cit1c2luZyBTeXN0ZW0uTmV0Lkh0dHAuSGVhZGVyczsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHkuWDUwOUNlcnRpZmljYXRlczsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOworCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydHMuQ2xpZW50Cit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVEh0dHBDbGllbnRUcmFuc3BvcnQgOiBUQ2xpZW50VHJhbnNwb3J0CisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFg1MDlDZXJ0aWZpY2F0ZVtdIF9jZXJ0aWZpY2F0ZXM7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVXJpIF91cmk7CisKKyAgICAgICAgLy8gVGltZW91dHMgaW4gbWlsbGlzZWNvbmRzCisgICAgICAgIHByaXZhdGUgaW50IF9jb25uZWN0VGltZW91dCA9IDMwMDAwOworICAgICAgICBwcml2YXRlIEh0dHBDbGllbnQgX2h0dHBDbGllbnQ7CisgICAgICAgIHByaXZhdGUgU3RyZWFtIF9pbnB1dFN0cmVhbTsKKworICAgICAgICBwcml2YXRlIGJvb2wgX2lzRGlzcG9zZWQ7CisgICAgICAgIHByaXZhdGUgTWVtb3J5U3RyZWFtIF9vdXRwdXRTdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCk7CisKKyAgICAgICAgcHVibGljIFRIdHRwQ2xpZW50VHJhbnNwb3J0KFVyaSB1LCBJRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4gY3VzdG9tSGVhZGVycykKKyAgICAgICAgICAgIDogdGhpcyh1LCBFbnVtZXJhYmxlLkVtcHR5PFg1MDlDZXJ0aWZpY2F0ZT4oKSwgY3VzdG9tSGVhZGVycykKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRIdHRwQ2xpZW50VHJhbnNwb3J0KFVyaSB1LCBJRW51bWVyYWJsZTxYNTA5Q2VydGlmaWNhdGU+IGNlcnRpZmljYXRlcywKKyAgICAgICAgICAgIElEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPiBjdXN0b21IZWFkZXJzKQorICAgICAgICB7CisgICAgICAgICAgICBfdXJpID0gdTsKKyAgICAgICAgICAgIF9jZXJ0aWZpY2F0ZXMgPSAoY2VydGlmaWNhdGVzID8/IEVudW1lcmFibGUuRW1wdHk8WDUwOUNlcnRpZmljYXRlPigpKS5Ub0FycmF5KCk7CisgICAgICAgICAgICBDdXN0b21IZWFkZXJzID0gY3VzdG9tSGVhZGVyczsKKworICAgICAgICAgICAgLy8gZHVlIHRvIGN1cnJlbnQgYnVnIHdpdGggcGVyZm9ybWFuY2Ugb2YgRGlzcG9zZSBpbiBuZXRjb3JlIGh0dHBzOi8vZ2l0aHViLmNvbS9kb3RuZXQvY29yZWZ4L2lzc3Vlcy84ODA5CisgICAgICAgICAgICAvLyB0aGlzIGNhbiBiZSBzd2l0Y2hlZCB0byBkZWZhdWx0IHdheSAoY3JlYXRlIGNsaWVudC0+dXNlLT5kaXNwb3NlIHBlciBmbHVzaCkgbGF0ZXIKKyAgICAgICAgICAgIF9odHRwQ2xpZW50ID0gQ3JlYXRlQ2xpZW50KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSURpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+IEN1c3RvbUhlYWRlcnMgeyBnZXQ7IH0KKworICAgICAgICBwdWJsaWMgaW50IENvbm5lY3RUaW1lb3V0CisgICAgICAgIHsKKyAgICAgICAgICAgIHNldCB7IF9jb25uZWN0VGltZW91dCA9IHZhbHVlOyB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc09wZW4gPT4gdHJ1ZTsKKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBPcGVuQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfaW5wdXRTdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfaW5wdXRTdHJlYW0uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIF9pbnB1dFN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChfb3V0cHV0U3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX291dHB1dFN0cmVhbS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgX291dHB1dFN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChfaHR0cENsaWVudCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9odHRwQ2xpZW50LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICBfaHR0cENsaWVudCA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxpbnQ+IFJlYWRBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8aW50PihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChfaW5wdXRTdHJlYW0gPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIk5vIHJlcXVlc3QgaGFzIGJlZW4gc2VudCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgcmV0ID0gYXdhaXQgX2lucHV0U3RyZWFtLlJlYWRBc3luYyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgICAgICBpZiAocmV0ID09IC0xKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkVuZE9mRmlsZSwgIk5vIG1vcmUgZGF0YSBhdmFpbGFibGUiKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuVW5rbm93biwgaW94LlRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgX291dHB1dFN0cmVhbS5Xcml0ZUFzeW5jKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgSHR0cENsaWVudCBDcmVhdGVDbGllbnQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgaGFuZGxlciA9IG5ldyBIdHRwQ2xpZW50SGFuZGxlcigpOworICAgICAgICAgICAgaGFuZGxlci5DbGllbnRDZXJ0aWZpY2F0ZXMuQWRkUmFuZ2UoX2NlcnRpZmljYXRlcyk7CisKKyAgICAgICAgICAgIHZhciBodHRwQ2xpZW50ID0gbmV3IEh0dHBDbGllbnQoaGFuZGxlcik7CisKKyAgICAgICAgICAgIGlmIChfY29ubmVjdFRpbWVvdXQgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGh0dHBDbGllbnQuVGltZW91dCA9IFRpbWVTcGFuLkZyb21TZWNvbmRzKF9jb25uZWN0VGltZW91dCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGh0dHBDbGllbnQuRGVmYXVsdFJlcXVlc3RIZWFkZXJzLkFjY2VwdC5BZGQobmV3IE1lZGlhVHlwZVdpdGhRdWFsaXR5SGVhZGVyVmFsdWUoImFwcGxpY2F0aW9uL3gtdGhyaWZ0IikpOworICAgICAgICAgICAgaHR0cENsaWVudC5EZWZhdWx0UmVxdWVzdEhlYWRlcnMuVXNlckFnZW50LkFkZChuZXcgUHJvZHVjdEluZm9IZWFkZXJWYWx1ZSgiVEh0dHBDbGllbnRUcmFuc3BvcnQiLCAiMS4wLjAiKSk7CisKKyAgICAgICAgICAgIGlmIChDdXN0b21IZWFkZXJzICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGl0ZW0gaW4gQ3VzdG9tSGVhZGVycykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGh0dHBDbGllbnQuRGVmYXVsdFJlcXVlc3RIZWFkZXJzLkFkZChpdGVtLktleSwgaXRlbS5WYWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gaHR0cENsaWVudDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIEZsdXNoQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9vdXRwdXRTdHJlYW0uQ2FuU2VlaykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgX291dHB1dFN0cmVhbS5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBvdXRTdHJlYW0gPSBuZXcgU3RyZWFtQ29udGVudChfb3V0cHV0U3RyZWFtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1zZyA9IGF3YWl0IF9odHRwQ2xpZW50LlBvc3RBc3luYyhfdXJpLCBvdXRTdHJlYW0sIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgbXNnLkVuc3VyZVN1Y2Nlc3NTdGF0dXNDb2RlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfaW5wdXRTdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfaW5wdXRTdHJlYW0uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9pbnB1dFN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIF9pbnB1dFN0cmVhbSA9IGF3YWl0IG1zZy5Db250ZW50LlJlYWRBc1N0cmVhbUFzeW5jKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2lucHV0U3RyZWFtLkNhblNlZWspCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2lucHV0U3RyZWFtLlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Vbmtub3duLCBpb3guVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChIdHRwUmVxdWVzdEV4Y2VwdGlvbiB3eCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Vbmtub3duLAorICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkbid0IGNvbm5lY3QgdG8gc2VydmVyOiAiICsgd3gpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfb3V0cHV0U3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gSURpc3Bvc2FibGUKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFfaXNEaXNwb3NlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlzcG9zaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2lucHV0U3RyZWFtPy5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIF9vdXRwdXRTdHJlYW0/LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgX2h0dHBDbGllbnQ/LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfaXNEaXNwb3NlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVE1lbW9yeUJ1ZmZlckNsaWVudFRyYW5zcG9ydC5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9UTWVtb3J5QnVmZmVyQ2xpZW50VHJhbnNwb3J0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2YTU1YTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVE1lbW9yeUJ1ZmZlckNsaWVudFRyYW5zcG9ydC5jcwpAQCAtMCwwICsxLDk3IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKKworbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnRzLkNsaWVudAoreworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIFRNZW1vcnlCdWZmZXJDbGllbnRUcmFuc3BvcnQgOiBUQ2xpZW50VHJhbnNwb3J0CisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IE1lbW9yeVN0cmVhbSBfYnl0ZVN0cmVhbTsKKyAgICAgICAgcHJpdmF0ZSBib29sIF9pc0Rpc3Bvc2VkOworCisgICAgICAgIHB1YmxpYyBUTWVtb3J5QnVmZmVyQ2xpZW50VHJhbnNwb3J0KCkKKyAgICAgICAgeworICAgICAgICAgICAgX2J5dGVTdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVE1lbW9yeUJ1ZmZlckNsaWVudFRyYW5zcG9ydChieXRlW10gYnVmKQorICAgICAgICB7CisgICAgICAgICAgICBfYnl0ZVN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oYnVmKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbiA9PiB0cnVlOworCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIE9wZW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgLyoqIGRvIG5vdGhpbmcgKiovCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxpbnQ+IFJlYWRBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBfYnl0ZVN0cmVhbS5SZWFkQXN5bmMoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVBc3luYyhieXRlW10gYnVmZmVyLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX2J5dGVTdHJlYW0uV3JpdGVBc3luYyhidWZmZXIsIDAsIGJ1ZmZlci5MZW5ndGgsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlQXN5bmMoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF9ieXRlU3RyZWFtLldyaXRlQXN5bmMoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgRmx1c2hBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBieXRlW10gR2V0QnVmZmVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9ieXRlU3RyZWFtLlRvQXJyYXkoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElEaXNwb3NhYmxlCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIERpc3Bvc2UoYm9vbCBkaXNwb3NpbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghX2lzRGlzcG9zZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGRpc3Bvc2luZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9ieXRlU3RyZWFtPy5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX2lzRGlzcG9zZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9UTmFtZWRQaXBlQ2xpZW50VHJhbnNwb3J0LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvQ2xpZW50L1ROYW1lZFBpcGVDbGllbnRUcmFuc3BvcnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVlNGJhZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9UTmFtZWRQaXBlQ2xpZW50VHJhbnNwb3J0LmNzCkBAIC0wLDAgKzEsOTUgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbS5JTy5QaXBlczsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOworCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydHMuQ2xpZW50Cit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVE5hbWVkUGlwZUNsaWVudFRyYW5zcG9ydCA6IFRDbGllbnRUcmFuc3BvcnQKKyAgICB7CisgICAgICAgIHByaXZhdGUgTmFtZWRQaXBlQ2xpZW50U3RyZWFtIF9jbGllbnQ7CisKKyAgICAgICAgcHVibGljIFROYW1lZFBpcGVDbGllbnRUcmFuc3BvcnQoc3RyaW5nIHBpcGUpIDogdGhpcygiLiIsIHBpcGUpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUTmFtZWRQaXBlQ2xpZW50VHJhbnNwb3J0KHN0cmluZyBzZXJ2ZXIsIHN0cmluZyBwaXBlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgc2VydmVyTmFtZSA9IHN0cmluZy5Jc051bGxPcldoaXRlU3BhY2Uoc2VydmVyKSA/IHNlcnZlciA6ICIuIjsKKworICAgICAgICAgICAgX2NsaWVudCA9IG5ldyBOYW1lZFBpcGVDbGllbnRTdHJlYW0oc2VydmVyTmFtZSwgcGlwZSwgUGlwZURpcmVjdGlvbi5Jbk91dCwgUGlwZU9wdGlvbnMuTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc09wZW4gPT4gX2NsaWVudCAhPSBudWxsICYmIF9jbGllbnQuSXNDb25uZWN0ZWQ7CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgT3BlbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoSXNPcGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5BbHJlYWR5T3Blbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF3YWl0IF9jbGllbnQuQ29ubmVjdEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9jbGllbnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfY2xpZW50LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICBfY2xpZW50ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGludD4gUmVhZEFzeW5jKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgsCisgICAgICAgICAgICBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9jbGllbnQgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBfY2xpZW50LlJlYWRBc3luYyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUFzeW5jKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX2NsaWVudCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgX2NsaWVudC5Xcml0ZUFzeW5jKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIEZsdXNoQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBfY2xpZW50LkRpc3Bvc2UoKTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVFNvY2tldENsaWVudFRyYW5zcG9ydC5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9UU29ja2V0Q2xpZW50VHJhbnNwb3J0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NjlkMTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVFNvY2tldENsaWVudFRyYW5zcG9ydC5jcwpAQCAtMCwwICsxLDEzOSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLk5ldDsKK3VzaW5nIFN5c3RlbS5OZXQuU29ja2V0czsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOworCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydHMuQ2xpZW50Cit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVFNvY2tldENsaWVudFRyYW5zcG9ydCA6IFRTdHJlYW1DbGllbnRUcmFuc3BvcnQKKyAgICB7CisgICAgICAgIHByaXZhdGUgYm9vbCBfaXNEaXNwb3NlZDsKKworICAgICAgICBwdWJsaWMgVFNvY2tldENsaWVudFRyYW5zcG9ydChUY3BDbGllbnQgY2xpZW50KQorICAgICAgICB7CisgICAgICAgICAgICBUY3BDbGllbnQgPSBjbGllbnQgPz8gdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbihuYW1lb2YoY2xpZW50KSk7CisKKyAgICAgICAgICAgIGlmIChJc09wZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gPSBjbGllbnQuR2V0U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtID0gY2xpZW50LkdldFN0cmVhbSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRTb2NrZXRDbGllbnRUcmFuc3BvcnQoSVBBZGRyZXNzIGhvc3QsIGludCBwb3J0KQorICAgICAgICAgICAgOiB0aGlzKGhvc3QsIHBvcnQsIDApCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUU29ja2V0Q2xpZW50VHJhbnNwb3J0KElQQWRkcmVzcyBob3N0LCBpbnQgcG9ydCwgaW50IHRpbWVvdXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEhvc3QgPSBob3N0OworICAgICAgICAgICAgUG9ydCA9IHBvcnQ7CisKKyAgICAgICAgICAgIFRjcENsaWVudCA9IG5ldyBUY3BDbGllbnQoKTsKKyAgICAgICAgICAgIFRjcENsaWVudC5SZWNlaXZlVGltZW91dCA9IFRjcENsaWVudC5TZW5kVGltZW91dCA9IHRpbWVvdXQ7CisgICAgICAgICAgICBUY3BDbGllbnQuQ2xpZW50Lk5vRGVsYXkgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRjcENsaWVudCBUY3BDbGllbnQgeyBnZXQ7IHByaXZhdGUgc2V0OyB9CisgICAgICAgIHB1YmxpYyBJUEFkZHJlc3MgSG9zdCB7IGdldDsgfQorICAgICAgICBwdWJsaWMgaW50IFBvcnQgeyBnZXQ7IH0KKworICAgICAgICBwdWJsaWMgaW50IFRpbWVvdXQKKyAgICAgICAgeworICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKFRjcENsaWVudCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVGNwQ2xpZW50LlJlY2VpdmVUaW1lb3V0ID0gVGNwQ2xpZW50LlNlbmRUaW1lb3V0ID0gdmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNPcGVuCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChUY3BDbGllbnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gVGNwQ2xpZW50LkNvbm5lY3RlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIE9wZW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKElzT3BlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuQWxyZWFkeU9wZW4sICJTb2NrZXQgYWxyZWFkeSBjb25uZWN0ZWQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKFBvcnQgPD0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIkNhbm5vdCBvcGVuIHdpdGhvdXQgcG9ydCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoVGNwQ2xpZW50ID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIkludmFsaWQgb3Igbm90IGluaXRpYWxpemVkIHRjcCBjbGllbnQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgVGNwQ2xpZW50LkNvbm5lY3RBc3luYyhIb3N0LCBQb3J0KTsKKworICAgICAgICAgICAgSW5wdXRTdHJlYW0gPSBUY3BDbGllbnQuR2V0U3RyZWFtKCk7CisgICAgICAgICAgICBPdXRwdXRTdHJlYW0gPSBUY3BDbGllbnQuR2V0U3RyZWFtKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJhc2UuQ2xvc2UoKTsKKworICAgICAgICAgICAgaWYgKFRjcENsaWVudCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRjcENsaWVudC5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgVGNwQ2xpZW50ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIElEaXNwb3NhYmxlCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIERpc3Bvc2UoYm9vbCBkaXNwb3NpbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghX2lzRGlzcG9zZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGRpc3Bvc2luZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFRjcENsaWVudD8uRGlzcG9zZSgpOworCisgICAgICAgICAgICAgICAgICAgIGJhc2UuRGlzcG9zZShkaXNwb3NpbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9pc0Rpc3Bvc2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVFN0cmVhbUNsaWVudFRyYW5zcG9ydC5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9UU3RyZWFtQ2xpZW50VHJhbnNwb3J0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MTY0ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVFN0cmVhbUNsaWVudFRyYW5zcG9ydC5jcwpAQCAtMCwwICsxLDExMCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0cy5DbGllbnQKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBUU3RyZWFtQ2xpZW50VHJhbnNwb3J0IDogVENsaWVudFRyYW5zcG9ydAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBib29sIF9pc0Rpc3Bvc2VkOworCisgICAgICAgIHByb3RlY3RlZCBUU3RyZWFtQ2xpZW50VHJhbnNwb3J0KCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRTdHJlYW1DbGllbnRUcmFuc3BvcnQoU3RyZWFtIGlucHV0U3RyZWFtLCBTdHJlYW0gb3V0cHV0U3RyZWFtKQorICAgICAgICB7CisgICAgICAgICAgICBJbnB1dFN0cmVhbSA9IGlucHV0U3RyZWFtOworICAgICAgICAgICAgT3V0cHV0U3RyZWFtID0gb3V0cHV0U3RyZWFtOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIFN0cmVhbSBPdXRwdXRTdHJlYW0geyBnZXQ7IHNldDsgfQorCisgICAgICAgIHByb3RlY3RlZCBTdHJlYW0gSW5wdXRTdHJlYW0geyBnZXQ7IHNldDsgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbiA9PiB0cnVlOworCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIE9wZW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKElucHV0U3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIElucHV0U3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKE91dHB1dFN0cmVhbSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGludD4gUmVhZEFzeW5jKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgsCisgICAgICAgICAgICBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKElucHV0U3RyZWFtID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4sCisgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgcmVhZCBmcm9tIG51bGwgaW5wdXRzdHJlYW0iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IElucHV0U3RyZWFtLlJlYWRBc3luYyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUFzeW5jKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoT3V0cHV0U3RyZWFtID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4sCisgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgcmVhZCBmcm9tIG51bGwgaW5wdXRzdHJlYW0iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgT3V0cHV0U3RyZWFtLldyaXRlQXN5bmMoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgRmx1c2hBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgT3V0cHV0U3RyZWFtLkZsdXNoQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgLy8gSURpc3Bvc2FibGUKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFfaXNEaXNwb3NlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlzcG9zaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0/LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtPy5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX2lzRGlzcG9zZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9UVGxzU29ja2V0Q2xpZW50VHJhbnNwb3J0LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvQ2xpZW50L1RUbHNTb2NrZXRDbGllbnRUcmFuc3BvcnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhiZTRlZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9UVGxzU29ja2V0Q2xpZW50VHJhbnNwb3J0LmNzCkBAIC0wLDAgKzEsMjM3IEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uTmV0OwordXNpbmcgU3lzdGVtLk5ldC5TZWN1cml0eTsKK3VzaW5nIFN5c3RlbS5OZXQuU29ja2V0czsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5BdXRoZW50aWNhdGlvbjsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHkuWDUwOUNlcnRpZmljYXRlczsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOworCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydHMuQ2xpZW50Cit7CisgICAgLy9UT0RPOiBjaGVjayBmb3IgY29ycmVjdCB3b3JrCisKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBUVGxzU29ja2V0Q2xpZW50VHJhbnNwb3J0IDogVFN0cmVhbUNsaWVudFRyYW5zcG9ydAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBYNTA5Q2VydGlmaWNhdGUyIF9jZXJ0aWZpY2F0ZTsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBSZW1vdGVDZXJ0aWZpY2F0ZVZhbGlkYXRpb25DYWxsYmFjayBfY2VydFZhbGlkYXRvcjsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBJUEFkZHJlc3MgX2hvc3Q7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYm9vbCBfaXNTZXJ2ZXI7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgTG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrIF9sb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2s7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IF9wb3J0OworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFNzbFByb3RvY29scyBfc3NsUHJvdG9jb2xzOworICAgICAgICBwcml2YXRlIFRjcENsaWVudCBfY2xpZW50OworICAgICAgICBwcml2YXRlIFNzbFN0cmVhbSBfc2VjdXJlU3RyZWFtOworICAgICAgICBwcml2YXRlIGludCBfdGltZW91dDsKKworICAgICAgICBwdWJsaWMgVFRsc1NvY2tldENsaWVudFRyYW5zcG9ydChUY3BDbGllbnQgY2xpZW50LCBYNTA5Q2VydGlmaWNhdGUyIGNlcnRpZmljYXRlLCBib29sIGlzU2VydmVyID0gZmFsc2UsCisgICAgICAgICAgICBSZW1vdGVDZXJ0aWZpY2F0ZVZhbGlkYXRpb25DYWxsYmFjayBjZXJ0VmFsaWRhdG9yID0gbnVsbCwKKyAgICAgICAgICAgIExvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgPSBudWxsLAorICAgICAgICAgICAgU3NsUHJvdG9jb2xzIHNzbFByb3RvY29scyA9IFNzbFByb3RvY29scy5UbHMxMikKKyAgICAgICAgeworICAgICAgICAgICAgX2NsaWVudCA9IGNsaWVudDsKKyAgICAgICAgICAgIF9jZXJ0aWZpY2F0ZSA9IGNlcnRpZmljYXRlOworICAgICAgICAgICAgX2NlcnRWYWxpZGF0b3IgPSBjZXJ0VmFsaWRhdG9yOworICAgICAgICAgICAgX2xvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayA9IGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjazsKKyAgICAgICAgICAgIF9zc2xQcm90b2NvbHMgPSBzc2xQcm90b2NvbHM7CisgICAgICAgICAgICBfaXNTZXJ2ZXIgPSBpc1NlcnZlcjsKKworICAgICAgICAgICAgaWYgKGlzU2VydmVyICYmIGNlcnRpZmljYXRlID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJUVGxzU29ja2V0Q2xpZW50VHJhbnNwb3J0IG5lZWRzIGNlcnRpZmljYXRlIHRvIGJlIHVzZWQgZm9yIHNlcnZlciIsCisgICAgICAgICAgICAgICAgICAgIG5hbWVvZihjZXJ0aWZpY2F0ZSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoSXNPcGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElucHV0U3RyZWFtID0gY2xpZW50LkdldFN0cmVhbSgpOworICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSA9IGNsaWVudC5HZXRTdHJlYW0oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUVGxzU29ja2V0Q2xpZW50VHJhbnNwb3J0KElQQWRkcmVzcyBob3N0LCBpbnQgcG9ydCwgc3RyaW5nIGNlcnRpZmljYXRlUGF0aCwKKyAgICAgICAgICAgIFJlbW90ZUNlcnRpZmljYXRlVmFsaWRhdGlvbkNhbGxiYWNrIGNlcnRWYWxpZGF0b3IgPSBudWxsLAorICAgICAgICAgICAgTG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrIGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayA9IG51bGwsCisgICAgICAgICAgICBTc2xQcm90b2NvbHMgc3NsUHJvdG9jb2xzID0gU3NsUHJvdG9jb2xzLlRsczEyKQorICAgICAgICAgICAgOiB0aGlzKGhvc3QsIHBvcnQsIDAsCisgICAgICAgICAgICAgICAgbmV3IFg1MDlDZXJ0aWZpY2F0ZTIoY2VydGlmaWNhdGVQYXRoKSwKKyAgICAgICAgICAgICAgICBjZXJ0VmFsaWRhdG9yLAorICAgICAgICAgICAgICAgIGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjaywKKyAgICAgICAgICAgICAgICBzc2xQcm90b2NvbHMpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUVGxzU29ja2V0Q2xpZW50VHJhbnNwb3J0KElQQWRkcmVzcyBob3N0LCBpbnQgcG9ydCwKKyAgICAgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZTIgY2VydGlmaWNhdGUgPSBudWxsLAorICAgICAgICAgICAgUmVtb3RlQ2VydGlmaWNhdGVWYWxpZGF0aW9uQ2FsbGJhY2sgY2VydFZhbGlkYXRvciA9IG51bGwsCisgICAgICAgICAgICBMb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrID0gbnVsbCwKKyAgICAgICAgICAgIFNzbFByb3RvY29scyBzc2xQcm90b2NvbHMgPSBTc2xQcm90b2NvbHMuVGxzMTIpCisgICAgICAgICAgICA6IHRoaXMoaG9zdCwgcG9ydCwgMCwKKyAgICAgICAgICAgICAgICBjZXJ0aWZpY2F0ZSwKKyAgICAgICAgICAgICAgICBjZXJ0VmFsaWRhdG9yLAorICAgICAgICAgICAgICAgIGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjaywKKyAgICAgICAgICAgICAgICBzc2xQcm90b2NvbHMpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUVGxzU29ja2V0Q2xpZW50VHJhbnNwb3J0KElQQWRkcmVzcyBob3N0LCBpbnQgcG9ydCwgaW50IHRpbWVvdXQsCisgICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGUyIGNlcnRpZmljYXRlLAorICAgICAgICAgICAgUmVtb3RlQ2VydGlmaWNhdGVWYWxpZGF0aW9uQ2FsbGJhY2sgY2VydFZhbGlkYXRvciA9IG51bGwsCisgICAgICAgICAgICBMb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrID0gbnVsbCwKKyAgICAgICAgICAgIFNzbFByb3RvY29scyBzc2xQcm90b2NvbHMgPSBTc2xQcm90b2NvbHMuVGxzMTIpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9ob3N0ID0gaG9zdDsKKyAgICAgICAgICAgIF9wb3J0ID0gcG9ydDsKKyAgICAgICAgICAgIF90aW1lb3V0ID0gdGltZW91dDsKKyAgICAgICAgICAgIF9jZXJ0aWZpY2F0ZSA9IGNlcnRpZmljYXRlOworICAgICAgICAgICAgX2NlcnRWYWxpZGF0b3IgPSBjZXJ0VmFsaWRhdG9yOworICAgICAgICAgICAgX2xvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayA9IGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjazsKKyAgICAgICAgICAgIF9zc2xQcm90b2NvbHMgPSBzc2xQcm90b2NvbHM7CisKKyAgICAgICAgICAgIEluaXRTb2NrZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgVGltZW91dAorICAgICAgICB7CisgICAgICAgICAgICBzZXQgeyBfY2xpZW50LlJlY2VpdmVUaW1lb3V0ID0gX2NsaWVudC5TZW5kVGltZW91dCA9IF90aW1lb3V0ID0gdmFsdWU7IH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUY3BDbGllbnQgVGNwQ2xpZW50ID0+IF9jbGllbnQ7CisKKyAgICAgICAgcHVibGljIElQQWRkcmVzcyBIb3N0ID0+IF9ob3N0OworCisgICAgICAgIHB1YmxpYyBpbnQgUG9ydCA9PiBfcG9ydDsKKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc09wZW4KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9jbGllbnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NsaWVudC5Db25uZWN0ZWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgSW5pdFNvY2tldCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9jbGllbnQgPSBuZXcgVGNwQ2xpZW50KCk7CisgICAgICAgICAgICBfY2xpZW50LlJlY2VpdmVUaW1lb3V0ID0gX2NsaWVudC5TZW5kVGltZW91dCA9IF90aW1lb3V0OworICAgICAgICAgICAgX2NsaWVudC5DbGllbnQuTm9EZWxheSA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGJvb2wgRGVmYXVsdENlcnRpZmljYXRlVmFsaWRhdG9yKG9iamVjdCBzZW5kZXIsIFg1MDlDZXJ0aWZpY2F0ZSBjZXJ0aWZpY2F0ZSwgWDUwOUNoYWluIGNoYWluLAorICAgICAgICAgICAgU3NsUG9saWN5RXJyb3JzIHNzbFZhbGlkYXRpb25FcnJvcnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzc2xWYWxpZGF0aW9uRXJyb3JzID09IFNzbFBvbGljeUVycm9ycy5Ob25lOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgT3BlbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoSXNPcGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5BbHJlYWR5T3BlbiwgIlNvY2tldCBhbHJlYWR5IGNvbm5lY3RlZCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoX2hvc3QgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIkNhbm5vdCBvcGVuIG51bGwgaG9zdCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoX3BvcnQgPD0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIkNhbm5vdCBvcGVuIHdpdGhvdXQgcG9ydCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoX2NsaWVudCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEluaXRTb2NrZXQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKF9jbGllbnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBfY2xpZW50LkNvbm5lY3RBc3luYyhfaG9zdCwgX3BvcnQpOworICAgICAgICAgICAgICAgIGF3YWl0IFNldHVwVGxzQXN5bmMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIFNldHVwVGxzQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgdmFsaWRhdG9yID0gX2NlcnRWYWxpZGF0b3IgPz8gRGVmYXVsdENlcnRpZmljYXRlVmFsaWRhdG9yOworCisgICAgICAgICAgICBpZiAoX2xvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9zZWN1cmVTdHJlYW0gPSBuZXcgU3NsU3RyZWFtKF9jbGllbnQuR2V0U3RyZWFtKCksIGZhbHNlLCB2YWxpZGF0b3IsIF9sb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9zZWN1cmVTdHJlYW0gPSBuZXcgU3NsU3RyZWFtKF9jbGllbnQuR2V0U3RyZWFtKCksIGZhbHNlLCB2YWxpZGF0b3IpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2lzU2VydmVyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU2VydmVyIGF1dGhlbnRpY2F0aW9uCisgICAgICAgICAgICAgICAgICAgIGF3YWl0CisgICAgICAgICAgICAgICAgICAgICAgICBfc2VjdXJlU3RyZWFtLkF1dGhlbnRpY2F0ZUFzU2VydmVyQXN5bmMoX2NlcnRpZmljYXRlLCBfY2VydFZhbGlkYXRvciAhPSBudWxsLCBfc3NsUHJvdG9jb2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBDbGllbnQgYXV0aGVudGljYXRpb24KKyAgICAgICAgICAgICAgICAgICAgdmFyIGNlcnRzID0gX2NlcnRpZmljYXRlICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3IFg1MDlDZXJ0aWZpY2F0ZUNvbGxlY3Rpb24ge19jZXJ0aWZpY2F0ZX0KKyAgICAgICAgICAgICAgICAgICAgICAgIDogbmV3IFg1MDlDZXJ0aWZpY2F0ZUNvbGxlY3Rpb24oKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0SG9zdCA9IF9ob3N0LlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IF9zZWN1cmVTdHJlYW0uQXV0aGVudGljYXRlQXNDbGllbnRBc3luYyh0YXJnZXRIb3N0LCBjZXJ0cywgX3NzbFByb3RvY29scywgdHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDbG9zZSgpOworICAgICAgICAgICAgICAgIHRocm93OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBJbnB1dFN0cmVhbSA9IF9zZWN1cmVTdHJlYW07CisgICAgICAgICAgICBPdXRwdXRTdHJlYW0gPSBfc2VjdXJlU3RyZWFtOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBiYXNlLkNsb3NlKCk7CisgICAgICAgICAgICBpZiAoX2NsaWVudCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9jbGllbnQuRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIF9jbGllbnQgPSBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoX3NlY3VyZVN0cmVhbSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9zZWN1cmVTdHJlYW0uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIF9zZWN1cmVTdHJlYW0gPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1NlcnZlci9USHR0cFNlcnZlclRyYW5zcG9ydC5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1NlcnZlci9USHR0cFNlcnZlclRyYW5zcG9ydC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzIwNjNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvU2VydmVyL1RIdHRwU2VydmVyVHJhbnNwb3J0LmNzCkBAIC0wLDAgKzEsOTggQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBNaWNyb3NvZnQuQXNwTmV0Q29yZS5IdHRwOwordXNpbmcgTWljcm9zb2Z0LkV4dGVuc2lvbnMuTG9nZ2luZzsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHM7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0cy5DbGllbnQ7CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0cy5TZXJ2ZXIKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBUSHR0cFNlcnZlclRyYW5zcG9ydAorICAgIHsKKyAgICAgICAgcHJvdGVjdGVkIGNvbnN0IHN0cmluZyBDb250ZW50VHlwZSA9ICJhcHBsaWNhdGlvbi94LXRocmlmdCI7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgSUxvZ2dlciBfbG9nZ2VyOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFJlcXVlc3REZWxlZ2F0ZSBfbmV4dDsKKyAgICAgICAgcHJvdGVjdGVkIEVuY29kaW5nIEVuY29kaW5nID0gRW5jb2RpbmcuVVRGODsKKworICAgICAgICBwcm90ZWN0ZWQgSVRQcm90b2NvbEZhY3RvcnkgSW5wdXRQcm90b2NvbEZhY3Rvcnk7CisgICAgICAgIHByb3RlY3RlZCBJVFByb3RvY29sRmFjdG9yeSBPdXRwdXRQcm90b2NvbEZhY3Rvcnk7CisKKyAgICAgICAgcHJvdGVjdGVkIElUQXN5bmNQcm9jZXNzb3IgUHJvY2Vzc29yOworCisgICAgICAgIHB1YmxpYyBUSHR0cFNlcnZlclRyYW5zcG9ydChJVEFzeW5jUHJvY2Vzc29yIHByb2Nlc3NvciwgUmVxdWVzdERlbGVnYXRlIG5leHQsIElMb2dnZXJGYWN0b3J5IGxvZ2dlckZhY3RvcnkpCisgICAgICAgICAgICA6IHRoaXMocHJvY2Vzc29yLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgbmV4dCwgbG9nZ2VyRmFjdG9yeSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRIdHRwU2VydmVyVHJhbnNwb3J0KElUQXN5bmNQcm9jZXNzb3IgcHJvY2Vzc29yLCBJVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnksIFJlcXVlc3REZWxlZ2F0ZSBuZXh0LAorICAgICAgICAgICAgSUxvZ2dlckZhY3RvcnkgbG9nZ2VyRmFjdG9yeSkKKyAgICAgICAgICAgIDogdGhpcyhwcm9jZXNzb3IsIHByb3RvY29sRmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5LCBuZXh0LCBsb2dnZXJGYWN0b3J5KQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVEh0dHBTZXJ2ZXJUcmFuc3BvcnQoSVRBc3luY1Byb2Nlc3NvciBwcm9jZXNzb3IsIElUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgSVRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LCBSZXF1ZXN0RGVsZWdhdGUgbmV4dCwgSUxvZ2dlckZhY3RvcnkgbG9nZ2VyRmFjdG9yeSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGxvZ2dlckZhY3RvcnkgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKG5hbWVvZihsb2dnZXJGYWN0b3J5KSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFByb2Nlc3NvciA9IHByb2Nlc3NvciA/PyB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKG5hbWVvZihwcm9jZXNzb3IpKTsKKyAgICAgICAgICAgIElucHV0UHJvdG9jb2xGYWN0b3J5ID0gaW5wdXRQcm90b2NvbEZhY3RvcnkgPz8gdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbihuYW1lb2YoaW5wdXRQcm90b2NvbEZhY3RvcnkpKTsKKyAgICAgICAgICAgIE91dHB1dFByb3RvY29sRmFjdG9yeSA9IG91dHB1dFByb3RvY29sRmFjdG9yeSA/PyB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKG5hbWVvZihvdXRwdXRQcm90b2NvbEZhY3RvcnkpKTsKKworICAgICAgICAgICAgX25leHQgPSBuZXh0OworICAgICAgICAgICAgX2xvZ2dlciA9IGxvZ2dlckZhY3RvcnkuQ3JlYXRlTG9nZ2VyPFRIdHRwU2VydmVyVHJhbnNwb3J0PigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgSW52b2tlKEh0dHBDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnRleHQuUmVzcG9uc2UuQ29udGVudFR5cGUgPSBDb250ZW50VHlwZTsKKyAgICAgICAgICAgIGF3YWl0IFByb2Nlc3NSZXF1ZXN0QXN5bmMoY29udGV4dCwgY29udGV4dC5SZXF1ZXN0QWJvcnRlZCk7IC8vVE9ETzogY2hlY2sgZm9yIGNvcnJlY3QgbG9naWMKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIFByb2Nlc3NSZXF1ZXN0QXN5bmMoSHR0cENvbnRleHQgY29udGV4dCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB0cmFuc3BvcnQgPSBuZXcgVFN0cmVhbUNsaWVudFRyYW5zcG9ydChjb250ZXh0LlJlcXVlc3QuQm9keSwgY29udGV4dC5SZXNwb25zZS5Cb2R5KTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gSW5wdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICB2YXIgb3V0cHV0ID0gT3V0cHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zcG9ydCk7CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoYXdhaXQgUHJvY2Vzc29yLlByb2Nlc3NBc3luYyhpbnB1dCwgb3V0cHV0LCBjYW5jZWxsYXRpb25Ub2tlbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIENsaWVudCBkaWVkLCBqdXN0IG1vdmUgb24KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cmFuc3BvcnQuQ2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9TZXJ2ZXIvVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydC5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1NlcnZlci9UTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4Njc4NmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9TZXJ2ZXIvVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydC5jcwpAQCAtMCwwICsxLDE5MSBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLklPLlBpcGVzOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0cy5TZXJ2ZXIKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBUTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0IDogVFNlcnZlclRyYW5zcG9ydAorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIFRoaXMgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIFBpcGUgb24gdGhlIGxvY2FsaG9zdC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBzdHJpbmcgX3BpcGVBZGRyZXNzOworCisgICAgICAgIHByaXZhdGUgYm9vbCBfYXN5bmNNb2RlID0gdHJ1ZTsKKyAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sIF9pc1BlbmRpbmcgPSB0cnVlOworCisgICAgICAgIHByaXZhdGUgTmFtZWRQaXBlU2VydmVyU3RyZWFtIF9zdHJlYW0gPSBudWxsOworCisgICAgICAgIHB1YmxpYyBUTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0KHN0cmluZyBwaXBlQWRkcmVzcykKKyAgICAgICAgeworICAgICAgICAgICAgX3BpcGVBZGRyZXNzID0gcGlwZUFkZHJlc3M7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBMaXN0ZW4oKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvIGhlcmUKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9zdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vVE9ETzogY2hlY2sgZm9yIGRpc2NvbmVjdGlvbiAKKyAgICAgICAgICAgICAgICAgICAgX3N0cmVhbS5EaXNjb25uZWN0KCk7CisgICAgICAgICAgICAgICAgICAgIF9zdHJlYW0uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmaW5hbGx5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfc3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgX2lzUGVuZGluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzQ2xpZW50UGVuZGluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfaXNQZW5kaW5nOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIEVuc3VyZVBpcGVJbnN0YW5jZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfc3RyZWFtID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGRpcmVjdGlvbiA9IFBpcGVEaXJlY3Rpb24uSW5PdXQ7CisgICAgICAgICAgICAgICAgdmFyIG1heGNvbm4gPSAyNTQ7CisgICAgICAgICAgICAgICAgdmFyIG1vZGUgPSBQaXBlVHJhbnNtaXNzaW9uTW9kZS5CeXRlOworICAgICAgICAgICAgICAgIHZhciBvcHRpb25zID0gX2FzeW5jTW9kZSA/IFBpcGVPcHRpb25zLkFzeW5jaHJvbm91cyA6IFBpcGVPcHRpb25zLk5vbmU7CisgICAgICAgICAgICAgICAgdmFyIGluYnVmID0gNDA5NjsKKyAgICAgICAgICAgICAgICB2YXIgb3V0YnVmID0gNDA5NjsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBzZWN1cml0eQorCisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfc3RyZWFtID0gbmV3IE5hbWVkUGlwZVNlcnZlclN0cmVhbShfcGlwZUFkZHJlc3MsIGRpcmVjdGlvbiwgbWF4Y29ubiwgbW9kZSwgb3B0aW9ucywgaW5idWYsIG91dGJ1Zik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbikgLy8gTW9ubyBzdGlsbCBkb2VzIG5vdCBzdXBwb3J0IGFzeW5jLCBmYWxsYmFjayB0byBzeW5jCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoX2FzeW5jTW9kZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyAmPSAoflBpcGVPcHRpb25zLkFzeW5jaHJvbm91cyk7CisgICAgICAgICAgICAgICAgICAgICAgICBfc3RyZWFtID0gbmV3IE5hbWVkUGlwZVNlcnZlclN0cmVhbShfcGlwZUFkZHJlc3MsIGRpcmVjdGlvbiwgbWF4Y29ubiwgbW9kZSwgb3B0aW9ucywgaW5idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0YnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9hc3luY01vZGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIFRhc2s8VENsaWVudFRyYW5zcG9ydD4gQWNjZXB0SW1wbGVtZW50YXRpb25Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRW5zdXJlUGlwZUluc3RhbmNlKCk7CisKKyAgICAgICAgICAgICAgICBhd2FpdCBfc3RyZWFtLldhaXRGb3JDb25uZWN0aW9uQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICAgICAgdmFyIHRyYW5zID0gbmV3IFNlcnZlclRyYW5zcG9ydChfc3RyZWFtKTsKKyAgICAgICAgICAgICAgICBfc3RyZWFtID0gbnVsbDsgLy8gcGFzcyBvd25lcnNoaXAgdG8gU2VydmVyVHJhbnNwb3J0CisKKyAgICAgICAgICAgICAgICAvL19pc1BlbmRpbmcgPSBmYWxzZTsKKworICAgICAgICAgICAgICAgIHJldHVybiB0cmFuczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENsb3NlKCk7CisgICAgICAgICAgICAgICAgdGhyb3c7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgZS5NZXNzYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgY2xhc3MgU2VydmVyVHJhbnNwb3J0IDogVENsaWVudFRyYW5zcG9ydAorICAgICAgICB7CisgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IE5hbWVkUGlwZVNlcnZlclN0cmVhbSBfc3RyZWFtOworCisgICAgICAgICAgICBwdWJsaWMgU2VydmVyVHJhbnNwb3J0KE5hbWVkUGlwZVNlcnZlclN0cmVhbSBzdHJlYW0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3N0cmVhbSA9IHN0cmVhbTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNPcGVuID0+IF9zdHJlYW0gIT0gbnVsbCAmJiBfc3RyZWFtLklzQ29ubmVjdGVkOworCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBPcGVuQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9zdHJlYW0/LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8aW50PiBSZWFkQXN5bmMoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX3N0cmVhbSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBfc3RyZWFtLlJlYWRBc3luYyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlQXN5bmMoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX3N0cmVhbSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGF3YWl0IF9zdHJlYW0uV3JpdGVBc3luYyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIEZsdXNoQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfc3RyZWFtPy5EaXNwb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvU2VydmVyL1RTZXJ2ZXJGcmFtZWRUcmFuc3BvcnQuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9TZXJ2ZXIvVFNlcnZlckZyYW1lZFRyYW5zcG9ydC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjg2ZTllCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvU2VydmVyL1RTZXJ2ZXJGcmFtZWRUcmFuc3BvcnQuY3MKQEAgLTAsMCArMSwxNTAgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5OZXQ7Cit1c2luZyBTeXN0ZW0uTmV0LlNvY2tldHM7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnRzLkNsaWVudDsKKworbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnRzLlNlcnZlcgoreworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIFRTZXJ2ZXJGcmFtZWRUcmFuc3BvcnQgOiBUU2VydmVyVHJhbnNwb3J0CisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGludCBfY2xpZW50VGltZW91dDsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbnQgX3BvcnQ7CisgICAgICAgIHByaXZhdGUgVGNwTGlzdGVuZXIgX3NlcnZlcjsKKworICAgICAgICBwdWJsaWMgVFNlcnZlckZyYW1lZFRyYW5zcG9ydChUY3BMaXN0ZW5lciBsaXN0ZW5lcikKKyAgICAgICAgICAgIDogdGhpcyhsaXN0ZW5lciwgMCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRTZXJ2ZXJGcmFtZWRUcmFuc3BvcnQoVGNwTGlzdGVuZXIgbGlzdGVuZXIsIGludCBjbGllbnRUaW1lb3V0KQorICAgICAgICB7CisgICAgICAgICAgICBfc2VydmVyID0gbGlzdGVuZXI7CisgICAgICAgICAgICBfY2xpZW50VGltZW91dCA9IGNsaWVudFRpbWVvdXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFNlcnZlckZyYW1lZFRyYW5zcG9ydChpbnQgcG9ydCkKKyAgICAgICAgICAgIDogdGhpcyhwb3J0LCAwKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFNlcnZlckZyYW1lZFRyYW5zcG9ydChpbnQgcG9ydCwgaW50IGNsaWVudFRpbWVvdXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9wb3J0ID0gcG9ydDsKKyAgICAgICAgICAgIF9jbGllbnRUaW1lb3V0ID0gY2xpZW50VGltZW91dDsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIE1ha2Ugc2VydmVyIHNvY2tldAorICAgICAgICAgICAgICAgIF9zZXJ2ZXIgPSBuZXcgVGNwTGlzdGVuZXIoSVBBZGRyZXNzLkFueSwgX3BvcnQpOworICAgICAgICAgICAgICAgIF9zZXJ2ZXIuU2VydmVyLk5vRGVsYXkgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfc2VydmVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSBTZXJ2ZXJTb2NrZXQgb24gcG9ydCAiICsgcG9ydCArICIuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBMaXN0ZW4oKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgbm90IHRvIGJsb2NrIG9uIGFjY2VwdAorICAgICAgICAgICAgaWYgKF9zZXJ2ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9zZXJ2ZXIuU3RhcnQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBzeCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDb3VsZCBub3QgYWNjZXB0IG9uIGxpc3RlbmluZyBzb2NrZXQ6ICIgKyBzeC5NZXNzYWdlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0NsaWVudFBlbmRpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX3NlcnZlci5QZW5kaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgVGFzazxUQ2xpZW50VHJhbnNwb3J0PiBBY2NlcHRJbXBsZW1lbnRhdGlvbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPFRDbGllbnRUcmFuc3BvcnQ+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKF9zZXJ2ZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIk5vIHVuZGVybHlpbmcgc2VydmVyIHNvY2tldC4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVEZyYW1lZENsaWVudFRyYW5zcG9ydCB0U29ja2V0VHJhbnNwb3J0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICB2YXIgdGNwQ2xpZW50ID0gYXdhaXQgX3NlcnZlci5BY2NlcHRUY3BDbGllbnRBc3luYygpOworCisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0U29ja2V0VHJhbnNwb3J0ID0gbmV3IFRGcmFtZWRDbGllbnRUcmFuc3BvcnQobmV3IFRTb2NrZXRDbGllbnRUcmFuc3BvcnQodGNwQ2xpZW50KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBUaW1lb3V0ID0gX2NsaWVudFRpbWVvdXQKKyAgICAgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRTb2NrZXRUcmFuc3BvcnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAodFNvY2tldFRyYW5zcG9ydCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0U29ja2V0VHJhbnNwb3J0LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIC8vICBPdGhlcndpc2UsIGNsZWFuIGl0IHVwIG91cnNlbHZlcy4KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgKChJRGlzcG9zYWJsZSkgdGNwQ2xpZW50KS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB0aHJvdzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGV4LlRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX3NlcnZlciAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX3NlcnZlci5TdG9wKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiV0FSTklORzogQ291bGQgbm90IGNsb3NlIHNlcnZlciBzb2NrZXQ6ICIgKyBleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9zZXJ2ZXIgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1NlcnZlci9UU2VydmVyU29ja2V0VHJhbnNwb3J0LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvU2VydmVyL1RTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E5ZDhhMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1NlcnZlci9UU2VydmVyU29ja2V0VHJhbnNwb3J0LmNzCkBAIC0wLDAgKzEsMTc0IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uTmV0OwordXNpbmcgU3lzdGVtLk5ldC5Tb2NrZXRzOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0cy5DbGllbnQ7CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0cy5TZXJ2ZXIKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBUU2VydmVyU29ja2V0VHJhbnNwb3J0IDogVFNlcnZlclRyYW5zcG9ydAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbnQgX2NsaWVudFRpbWVvdXQ7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IF9wb3J0OworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGJvb2wgX3VzZUJ1ZmZlcmVkU29ja2V0czsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBib29sIF91c2VGcmFtZWRUcmFuc3BvcnQ7CisgICAgICAgIHByaXZhdGUgVGNwTGlzdGVuZXIgX3NlcnZlcjsKKworICAgICAgICBwdWJsaWMgVFNlcnZlclNvY2tldFRyYW5zcG9ydChUY3BMaXN0ZW5lciBsaXN0ZW5lcikKKyAgICAgICAgICAgIDogdGhpcyhsaXN0ZW5lciwgMCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQoVGNwTGlzdGVuZXIgbGlzdGVuZXIsIGludCBjbGllbnRUaW1lb3V0KQorICAgICAgICB7CisgICAgICAgICAgICBfc2VydmVyID0gbGlzdGVuZXI7CisgICAgICAgICAgICBfY2xpZW50VGltZW91dCA9IGNsaWVudFRpbWVvdXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFNlcnZlclNvY2tldFRyYW5zcG9ydChpbnQgcG9ydCkKKyAgICAgICAgICAgIDogdGhpcyhwb3J0LCAwKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFNlcnZlclNvY2tldFRyYW5zcG9ydChpbnQgcG9ydCwgaW50IGNsaWVudFRpbWVvdXQpCisgICAgICAgICAgICA6IHRoaXMocG9ydCwgY2xpZW50VGltZW91dCwgZmFsc2UpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUU2VydmVyU29ja2V0VHJhbnNwb3J0KGludCBwb3J0LCBpbnQgY2xpZW50VGltZW91dCwgYm9vbCB1c2VCdWZmZXJlZFNvY2tldHMpOgorICAgICAgICAgICAgdGhpcyhwb3J0LCBjbGllbnRUaW1lb3V0LCB1c2VCdWZmZXJlZFNvY2tldHMsIGZhbHNlKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBUU2VydmVyU29ja2V0VHJhbnNwb3J0KGludCBwb3J0LCBpbnQgY2xpZW50VGltZW91dCwgYm9vbCB1c2VCdWZmZXJlZFNvY2tldHMsIGJvb2wgdXNlRnJhbWVkVHJhbnNwb3J0KQorICAgICAgICB7CisgICAgICAgICAgICBfcG9ydCA9IHBvcnQ7CisgICAgICAgICAgICBfY2xpZW50VGltZW91dCA9IGNsaWVudFRpbWVvdXQ7CisgICAgICAgICAgICBfdXNlQnVmZmVyZWRTb2NrZXRzID0gdXNlQnVmZmVyZWRTb2NrZXRzOworICAgICAgICAgICAgX3VzZUZyYW1lZFRyYW5zcG9ydCA9IHVzZUZyYW1lZFRyYW5zcG9ydDsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIE1ha2Ugc2VydmVyIHNvY2tldAorICAgICAgICAgICAgICAgIF9zZXJ2ZXIgPSBuZXcgVGNwTGlzdGVuZXIoSVBBZGRyZXNzLkFueSwgX3BvcnQpOworICAgICAgICAgICAgICAgIF9zZXJ2ZXIuU2VydmVyLk5vRGVsYXkgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfc2VydmVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSBTZXJ2ZXJTb2NrZXQgb24gcG9ydCAiICsgcG9ydCArICIuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBMaXN0ZW4oKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgbm90IHRvIGJsb2NrIG9uIGFjY2VwdAorICAgICAgICAgICAgaWYgKF9zZXJ2ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9zZXJ2ZXIuU3RhcnQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBzeCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDb3VsZCBub3QgYWNjZXB0IG9uIGxpc3RlbmluZyBzb2NrZXQ6ICIgKyBzeC5NZXNzYWdlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0NsaWVudFBlbmRpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX3NlcnZlci5QZW5kaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgVGFzazxUQ2xpZW50VHJhbnNwb3J0PiBBY2NlcHRJbXBsZW1lbnRhdGlvbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPFRDbGllbnRUcmFuc3BvcnQ+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKF9zZXJ2ZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIk5vIHVuZGVybHlpbmcgc2VydmVyIHNvY2tldC4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVENsaWVudFRyYW5zcG9ydCB0U29ja2V0VHJhbnNwb3J0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICB2YXIgdGNwQ2xpZW50ID0gYXdhaXQgX3NlcnZlci5BY2NlcHRUY3BDbGllbnRBc3luYygpOworCisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0U29ja2V0VHJhbnNwb3J0ID0gbmV3IFRTb2NrZXRDbGllbnRUcmFuc3BvcnQodGNwQ2xpZW50KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBUaW1lb3V0ID0gX2NsaWVudFRpbWVvdXQKKyAgICAgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoX3VzZUJ1ZmZlcmVkU29ja2V0cykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdFNvY2tldFRyYW5zcG9ydCA9IG5ldyBUQnVmZmVyZWRDbGllbnRUcmFuc3BvcnQodFNvY2tldFRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoX3VzZUZyYW1lZFRyYW5zcG9ydCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdFNvY2tldFRyYW5zcG9ydCA9IG5ldyBURnJhbWVkQ2xpZW50VHJhbnNwb3J0KHRTb2NrZXRUcmFuc3BvcnQpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRTb2NrZXRUcmFuc3BvcnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAodFNvY2tldFRyYW5zcG9ydCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0U29ja2V0VHJhbnNwb3J0LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIC8vICBPdGhlcndpc2UsIGNsZWFuIGl0IHVwIG91cnNlbHZlcy4KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgKChJRGlzcG9zYWJsZSkgdGNwQ2xpZW50KS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB0aHJvdzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGV4LlRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX3NlcnZlciAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX3NlcnZlci5TdG9wKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiV0FSTklORzogQ291bGQgbm90IGNsb3NlIHNlcnZlciBzb2NrZXQ6ICIgKyBleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9zZXJ2ZXIgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1NlcnZlci9UVGxzU2VydmVyU29ja2V0VHJhbnNwb3J0LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvU2VydmVyL1RUbHNTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU5ZmVlZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1NlcnZlci9UVGxzU2VydmVyU29ja2V0VHJhbnNwb3J0LmNzCkBAIC0wLDAgKzEsMTc3IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uTmV0OwordXNpbmcgU3lzdGVtLk5ldC5TZWN1cml0eTsKK3VzaW5nIFN5c3RlbS5OZXQuU29ja2V0czsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5BdXRoZW50aWNhdGlvbjsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHkuWDUwOUNlcnRpZmljYXRlczsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHMuQ2xpZW50OworCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydHMuU2VydmVyCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVFRsc1NlcnZlclNvY2tldFRyYW5zcG9ydCA6IFRTZXJ2ZXJUcmFuc3BvcnQKKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgUmVtb3RlQ2VydGlmaWNhdGVWYWxpZGF0aW9uQ2FsbGJhY2sgX2NsaWVudENlcnRWYWxpZGF0b3I7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IF9jbGllbnRUaW1lb3V0ID0gMDsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBMb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgX2xvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjazsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbnQgX3BvcnQ7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgWDUwOUNlcnRpZmljYXRlMiBfc2VydmVyQ2VydGlmaWNhdGU7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgU3NsUHJvdG9jb2xzIF9zc2xQcm90b2NvbHM7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYm9vbCBfdXNlQnVmZmVyZWRTb2NrZXRzOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGJvb2wgX3VzZUZyYW1lZFRyYW5zcG9ydDsKKyAgICAgICAgcHJpdmF0ZSBUY3BMaXN0ZW5lciBfc2VydmVyOworCisgICAgICAgIHB1YmxpYyBUVGxzU2VydmVyU29ja2V0VHJhbnNwb3J0KGludCBwb3J0LCBYNTA5Q2VydGlmaWNhdGUyIGNlcnRpZmljYXRlKQorICAgICAgICAgICAgOiB0aGlzKHBvcnQsIGZhbHNlLCBjZXJ0aWZpY2F0ZSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRUbHNTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQoCisgICAgICAgICAgICBpbnQgcG9ydCwKKyAgICAgICAgICAgIGJvb2wgdXNlQnVmZmVyZWRTb2NrZXRzLAorICAgICAgICAgICAgWDUwOUNlcnRpZmljYXRlMiBjZXJ0aWZpY2F0ZSwKKyAgICAgICAgICAgIFJlbW90ZUNlcnRpZmljYXRlVmFsaWRhdGlvbkNhbGxiYWNrIGNsaWVudENlcnRWYWxpZGF0b3IgPSBudWxsLAorICAgICAgICAgICAgTG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrIGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayA9IG51bGwsCisgICAgICAgICAgICBTc2xQcm90b2NvbHMgc3NsUHJvdG9jb2xzID0gU3NsUHJvdG9jb2xzLlRsczEyKSAKKyAgICAgICAgICAgIDogdGhpcyhwb3J0LCB1c2VCdWZmZXJlZFNvY2tldHMsIGZhbHNlLCBjZXJ0aWZpY2F0ZSwKKyAgICAgICAgICAgICAgICBjbGllbnRDZXJ0VmFsaWRhdG9yLCBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2ssIHNzbFByb3RvY29scykKKyAgICAgICAgeworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgVFRsc1NlcnZlclNvY2tldFRyYW5zcG9ydCgKKyAgICAgICAgICAgIGludCBwb3J0LAorICAgICAgICAgICAgYm9vbCB1c2VCdWZmZXJlZFNvY2tldHMsCisgICAgICAgICAgICBib29sIHVzZUZyYW1lZFRyYW5zcG9ydCwKKyAgICAgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZTIgY2VydGlmaWNhdGUsCisgICAgICAgICAgICBSZW1vdGVDZXJ0aWZpY2F0ZVZhbGlkYXRpb25DYWxsYmFjayBjbGllbnRDZXJ0VmFsaWRhdG9yID0gbnVsbCwKKyAgICAgICAgICAgIExvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgPSBudWxsLAorICAgICAgICAgICAgU3NsUHJvdG9jb2xzIHNzbFByb3RvY29scyA9IFNzbFByb3RvY29scy5UbHMxMikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFjZXJ0aWZpY2F0ZS5IYXNQcml2YXRlS2V5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Vbmtub3duLAorICAgICAgICAgICAgICAgICAgICAiWW91ciBzZXJ2ZXItY2VydGlmaWNhdGUgbmVlZHMgdG8gaGF2ZSBhIHByaXZhdGUga2V5Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9wb3J0ID0gcG9ydDsKKyAgICAgICAgICAgIF9zZXJ2ZXJDZXJ0aWZpY2F0ZSA9IGNlcnRpZmljYXRlOworICAgICAgICAgICAgX3VzZUJ1ZmZlcmVkU29ja2V0cyA9IHVzZUJ1ZmZlcmVkU29ja2V0czsKKyAgICAgICAgICAgIF91c2VGcmFtZWRUcmFuc3BvcnQgPSB1c2VGcmFtZWRUcmFuc3BvcnQ7CisgICAgICAgICAgICBfY2xpZW50Q2VydFZhbGlkYXRvciA9IGNsaWVudENlcnRWYWxpZGF0b3I7CisgICAgICAgICAgICBfbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrID0gbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrOworICAgICAgICAgICAgX3NzbFByb3RvY29scyA9IHNzbFByb3RvY29sczsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHNlcnZlciBzb2NrZXQKKyAgICAgICAgICAgICAgICBfc2VydmVyID0gbmV3IFRjcExpc3RlbmVyKElQQWRkcmVzcy5BbnksIF9wb3J0KTsKKyAgICAgICAgICAgICAgICBfc2VydmVyLlNlcnZlci5Ob0RlbGF5ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3NlcnZlciA9IG51bGw7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJCJDb3VsZCBub3QgY3JlYXRlIFNlcnZlclNvY2tldCBvbiBwb3J0IHtwb3J0fS4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIExpc3RlbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBhY2NlcHQgaXMgbm90IGJsb2NraW5nCisgICAgICAgICAgICBpZiAoX3NlcnZlciAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX3NlcnZlci5TdGFydCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIHN4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJCJDb3VsZCBub3QgYWNjZXB0IG9uIGxpc3RlbmluZyBzb2NrZXQ6IHtzeC5NZXNzYWdlfSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzQ2xpZW50UGVuZGluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfc2VydmVyLlBlbmRpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBUYXNrPFRDbGllbnRUcmFuc3BvcnQ+IEFjY2VwdEltcGxlbWVudGF0aW9uQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8VENsaWVudFRyYW5zcG9ydD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoX3NlcnZlciA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAiTm8gdW5kZXJseWluZyBzZXJ2ZXIgc29ja2V0LiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgY2xpZW50ID0gYXdhaXQgX3NlcnZlci5BY2NlcHRUY3BDbGllbnRBc3luYygpOworICAgICAgICAgICAgICAgIGNsaWVudC5TZW5kVGltZW91dCA9IGNsaWVudC5SZWNlaXZlVGltZW91dCA9IF9jbGllbnRUaW1lb3V0OworCisgICAgICAgICAgICAgICAgLy93cmFwIHRoZSBjbGllbnQgaW4gYW4gU1NMIFNvY2tldCBwYXNzaW5nIGluIHRoZSBTU0wgY2VydAorICAgICAgICAgICAgICAgIHZhciB0VGxzU29ja2V0ID0gbmV3IFRUbHNTb2NrZXRDbGllbnRUcmFuc3BvcnQoY2xpZW50LCBfc2VydmVyQ2VydGlmaWNhdGUsIHRydWUsIF9jbGllbnRDZXJ0VmFsaWRhdG9yLAorICAgICAgICAgICAgICAgICAgICBfbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrLCBfc3NsUHJvdG9jb2xzKTsKKworICAgICAgICAgICAgICAgIGF3YWl0IHRUbHNTb2NrZXQuU2V0dXBUbHNBc3luYygpOworCisgICAgICAgICAgICAgICAgVENsaWVudFRyYW5zcG9ydCB0cmFucyA9IHRUbHNTb2NrZXQ7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKF91c2VCdWZmZXJlZFNvY2tldHMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUQnVmZmVyZWRDbGllbnRUcmFuc3BvcnQodHJhbnMpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChfdXNlRnJhbWVkVHJhbnNwb3J0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVEZyYW1lZENsaWVudFRyYW5zcG9ydCh0cmFucyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHJldHVybiB0cmFuczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oZXguVG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfc2VydmVyICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfc2VydmVyLlN0b3AoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCQiV0FSTklORzogQ291bGQgbm90IGNsb3NlIHNlcnZlciBzb2NrZXQ6IHtleH0iKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBfc2VydmVyID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9UQ2xpZW50VHJhbnNwb3J0LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvVENsaWVudFRyYW5zcG9ydC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGQ5NmNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvVENsaWVudFRyYW5zcG9ydC5jcwpAQCAtMCwwICsxLDE3OSBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0cworeworICAgIC8vVE9ETzogdGhpbmsgYWJvdXQgY2xpZW50IGluZm8gCisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVENsaWVudFRyYW5zcG9ydCA6IElEaXNwb3NhYmxlCisgICAgeworICAgICAgICAvL1RPRE86IHRoaW5rIGhvdyB0byBhdm9pZCBwZWVrIGJ5dGUKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBieXRlW10gX3BlZWtCdWZmZXIgPSBuZXcgYnl0ZVsxXTsKKyAgICAgICAgcHJpdmF0ZSBib29sIF9oYXNQZWVrQnl0ZTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IGJvb2wgSXNPcGVuIHsgZ2V0OyB9CisKKyAgICAgICAgcHVibGljIHZvaWQgRGlzcG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIERpc3Bvc2UodHJ1ZSk7CisgICAgICAgICAgICBHQy5TdXBwcmVzc0ZpbmFsaXplKHRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2s8Ym9vbD4gUGVla0FzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICAvL0lmIHdlIGFscmVhZHkgaGF2ZSBhIGJ5dGUgcmVhZCBidXQgbm90IGNvbnN1bWVkLCBkbyBub3RoaW5nLgorICAgICAgICAgICAgaWYgKF9oYXNQZWVrQnl0ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9JZiB0cmFuc3BvcnQgY2xvc2VkIHdlIGNhbid0IHBlZWsuCisgICAgICAgICAgICBpZiAoIUlzT3BlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vVHJ5IHRvIHJlYWQgb25lIGJ5dGUuIElmIHN1Y2NlZWRzIHdlIHdpbGwgbmVlZCB0byBzdG9yZSBpdCBmb3IgdGhlIG5leHQgcmVhZC4KKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBieXRlcyA9IGF3YWl0IFJlYWRBc3luYyhfcGVla0J1ZmZlciwgMCwgMSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIGlmIChieXRlcyA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9oYXNQZWVrQnl0ZSA9IHRydWU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgT3BlbkFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgT3BlbkFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2sgT3BlbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBDbG9zZSgpOworCisgICAgICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBWYWxpZGF0ZUJ1ZmZlckFyZ3MoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGJ1ZmZlciA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKGJ1ZmZlcikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKG5hbWVvZihvZmZzZXQpLCAiQnVmZmVyIG9mZnNldCBpcyBzbWFsbGVyIHRoYW4gemVyby4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGxlbmd0aCA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbihuYW1lb2YobGVuZ3RoKSwgIkJ1ZmZlciBsZW5ndGggaXMgc21hbGxlciB0aGFuIHplcm8uIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChvZmZzZXQgKyBsZW5ndGggPiBidWZmZXIuTGVuZ3RoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24obmFtZW9mKGJ1ZmZlciksICJOb3QgZW5vdWdoIGRhdGEuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrPGludD4gUmVhZEFzeW5jKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkQXN5bmMoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzazxpbnQ+IFJlYWRBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzazxpbnQ+IFJlYWRBbGxBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgUmVhZEFsbEFzeW5jKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzazxpbnQ+IFJlYWRBbGxBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbGlkYXRlQnVmZmVyQXJncyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoKTsKKworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxpbnQ+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHJldHJpZXZlZCA9IDA7CisKKyAgICAgICAgICAgIC8vSWYgd2UgcHJldmlvdXNseSBwZWVrZWQgYSBieXRlLCB3ZSBuZWVkIHRvIHVzZSB0aGF0IGZpcnN0LgorICAgICAgICAgICAgaWYgKF9oYXNQZWVrQnl0ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBidWZmZXJbb2Zmc2V0ICsgcmV0cmlldmVkKytdID0gX3BlZWtCdWZmZXJbMF07CisgICAgICAgICAgICAgICAgX2hhc1BlZWtCeXRlID0gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdoaWxlIChyZXRyaWV2ZWQgPCBsZW5ndGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPGludD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZhciByZXR1cm5lZENvdW50ID0gYXdhaXQgUmVhZEFzeW5jKGJ1ZmZlciwgb2Zmc2V0ICsgcmV0cmlldmVkLCBsZW5ndGggLSByZXRyaWV2ZWQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0dXJuZWRDb3VudCA8PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkVuZE9mRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgcmVhZCwgUmVtb3RlIHNpZGUgaGFzIGNsb3NlZCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXRyaWV2ZWQgKz0gcmV0dXJuZWRDb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXRyaWV2ZWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlQXN5bmMoYnl0ZVtdIGJ1ZmZlcikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVBc3luYyhidWZmZXIsIENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBXcml0ZUFzeW5jKGJ5dGVbXSBidWZmZXIsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUFzeW5jKGJ1ZmZlciwgMCwgYnVmZmVyLkxlbmd0aCwgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlQXN5bmMoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVBc3luYyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlQXN5bmMoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgRmx1c2hBc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IEZsdXNoQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBGbHVzaEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvVFNlcnZlclRyYW5zcG9ydC5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1RTZXJ2ZXJUcmFuc3BvcnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ0NWE1NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1RTZXJ2ZXJUcmFuc3BvcnQuY3MKQEAgLTAsMCArMSw1NCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0cworeworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGFic3RyYWN0IGNsYXNzIFRTZXJ2ZXJUcmFuc3BvcnQKKyAgICB7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIExpc3RlbigpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBDbG9zZSgpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbCBJc0NsaWVudFBlbmRpbmcoKTsKKworICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCBhc3luYyBUYXNrPFRDbGllbnRUcmFuc3BvcnQ+IEFjY2VwdEltcGxlbWVudGF0aW9uQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgQWNjZXB0SW1wbGVtZW50YXRpb25Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBhYnN0cmFjdCBUYXNrPFRDbGllbnRUcmFuc3BvcnQ+IEFjY2VwdEltcGxlbWVudGF0aW9uQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrPFRDbGllbnRUcmFuc3BvcnQ+IEFjY2VwdEFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IEFjY2VwdEFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2s8VENsaWVudFRyYW5zcG9ydD4gQWNjZXB0QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB0cmFuc3BvcnQgPSBhd2FpdCBBY2NlcHRJbXBsZW1lbnRhdGlvbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgaWYgKHRyYW5zcG9ydCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCQie25hbWVvZihBY2NlcHRJbXBsZW1lbnRhdGlvbkFzeW5jKX0gc2hvdWxkIG5vdCByZXR1cm4gbnVsbCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdHJhbnNwb3J0OworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1RUcmFuc3BvcnRFeGNlcHRpb24uY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9UVHJhbnNwb3J0RXhjZXB0aW9uLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3YzQyZTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9UVHJhbnNwb3J0RXhjZXB0aW9uLmNzCkBAIC0wLDAgKzEsNTggQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0cworeworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIFRUcmFuc3BvcnRFeGNlcHRpb24gOiBURXhjZXB0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgZW51bSBFeGNlcHRpb25UeXBlCisgICAgICAgIHsKKyAgICAgICAgICAgIFVua25vd24sCisgICAgICAgICAgICBOb3RPcGVuLAorICAgICAgICAgICAgQWxyZWFkeU9wZW4sCisgICAgICAgICAgICBUaW1lZE91dCwKKyAgICAgICAgICAgIEVuZE9mRmlsZSwKKyAgICAgICAgICAgIEludGVycnVwdGVkCisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgRXhjZXB0aW9uVHlwZSBFeFR5cGU7CisKKyAgICAgICAgcHVibGljIFRUcmFuc3BvcnRFeGNlcHRpb24oKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFRyYW5zcG9ydEV4Y2VwdGlvbihFeGNlcHRpb25UeXBlIGV4VHlwZSkKKyAgICAgICAgICAgIDogdGhpcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIEV4VHlwZSA9IGV4VHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUVHJhbnNwb3J0RXhjZXB0aW9uKEV4Y2VwdGlvblR5cGUgZXhUeXBlLCBzdHJpbmcgbWVzc2FnZSkKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlKQorICAgICAgICB7CisgICAgICAgICAgICBFeFR5cGUgPSBleFR5cGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFRyYW5zcG9ydEV4Y2VwdGlvbihzdHJpbmcgbWVzc2FnZSkKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRXhjZXB0aW9uVHlwZSBUeXBlID0+IEV4VHlwZTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvVFRyYW5zcG9ydEZhY3RvcnkuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9UVHJhbnNwb3J0RmFjdG9yeS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmMzY2M0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvVFRyYW5zcG9ydEZhY3RvcnkuY3MKQEAgLTAsMCArMSwzNSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnRzCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAgICAgRnJvbSBNYXJrIFNsZWUgJiBBZGl0eWEgQWdhcndhbCBvZiBGYWNlYm9vazoKKyAgICAvLy8gICAgIEZhY3RvcnkgY2xhc3MgdXNlZCB0byBjcmVhdGUgd3JhcHBlZCBpbnN0YW5jZSBvZiBUcmFuc3BvcnRzLgorICAgIC8vLyAgICAgVGhpcyBpcyB1c2VkIHByaW1hcmlseSBpbiBzZXJ2ZXJzLCB3aGljaCBnZXQgVHJhbnNwb3J0cyBmcm9tCisgICAgLy8vICAgICBhIFNlcnZlclRyYW5zcG9ydCBhbmQgdGhlbiBtYXkgd2FudCB0byBtdXRhdGUgdGhlbSAoaS5lLiBjcmVhdGUKKyAgICAvLy8gICAgIGEgQnVmZmVyZWRUcmFuc3BvcnQgZnJvbSB0aGUgdW5kZXJseWluZyBiYXNlIHRyYW5zcG9ydCkKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIFRUcmFuc3BvcnRGYWN0b3J5CisgICAgeworICAgICAgICBwdWJsaWMgdmlydHVhbCBUQ2xpZW50VHJhbnNwb3J0IEdldFRyYW5zcG9ydChUQ2xpZW50VHJhbnNwb3J0IHRyYW5zKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdHJhbnM7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvYnVpbGQuY21kIGIvbGliL25ldGNvcmUvYnVpbGQuY21kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2M2M0YjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9idWlsZC5jbWQKQEAgLTAsMCArMSwyNyBAQAorQGVjaG8gb2ZmCityZW0gLyoKK3JlbSAgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCityZW0gICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK3JlbSAgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVtICAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorcmVtICAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKK3JlbSAgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCityZW0gICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CityZW0gICoKK3JlbSAgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorcmVtICAqCityZW0gICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorcmVtICAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCityZW0gICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCityZW0gICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3JlbSAgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCityZW0gICogdW5kZXIgdGhlIExpY2Vuc2UuCityZW0gICovCisKK3NldGxvY2FsCisKK3RocmlmdCAtdmVyc2lvbgorZG90bmV0IC0taW5mbworZG90bmV0IGJ1aWxkIAorCis6ZW9mCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9idWlsZC5zaCBiL2xpYi9uZXRjb3JlL2J1aWxkLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMThiY2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9idWlsZC5zaApAQCAtMCwwICsxLDMyIEBACisjIS91c3IvYmluL2VudiBiYXNoCisKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjZXhpdCBpZiBhbnkgY29tbWFuZCBmYWlscworI3NldCAtZQorCit0aHJpZnQgLS12ZXJzaW9uCitkb3RuZXQgLS1pbmZvCitkb3RuZXQgYnVpbGQgCisKKyNyZXZpc2lvbj0ke1RSQVZJU19KT0JfSUQ6PTF9ICAKKyNyZXZpc2lvbj0kKHByaW50ZiAiJTA0ZCIgJHJldmlzaW9uKSAKKworI2RvdG5ldCBwYWNrIC4vc3JjL1BST0pFQ1RfTkFNRSAtYyBSZWxlYXNlIC1vIC4vYXJ0aWZhY3RzIC0tdmVyc2lvbi1zdWZmaXg9JHJldmlzaW9uICAKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL3J1bnRlc3RzLmNtZCBiL2xpYi9uZXRjb3JlL3J1bnRlc3RzLmNtZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTE0YmM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvcnVudGVzdHMuY21kCkBAIC0wLDAgKzEsMjggQEAKK0BlY2hvIG9mZgorcmVtIC8qCityZW0gICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorcmVtICAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCityZW0gICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlbSAgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3JlbSAgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCityZW0gICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorcmVtICAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorcmVtICAqCityZW0gICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKK3JlbSAgKgorcmVtICAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3JlbSAgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorcmVtICAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorcmVtICAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCityZW0gICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworcmVtICAqIHVuZGVyIHRoZSBMaWNlbnNlLgorcmVtICAqLworc2V0bG9jYWwKKwordGhyaWZ0IC12ZXJzaW9uCitkb3RuZXQgLS1pbmZvCisKK2RvdG5ldCB0ZXN0IFRlc3RzXFRocmlmdC5JbnRlZ3JhdGlvblRlc3RzXFRocmlmdC5JbnRlZ3JhdGlvblRlc3RzLmNzcHJvagorZG90bmV0IHRlc3QgVGVzdHNcVGhyaWZ0LlRlc3RzXFRocmlmdC5UZXN0cy5jc3Byb2oKKworOmVvZgpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvcnVudGVzdHMuc2ggYi9saWIvbmV0Y29yZS9ydW50ZXN0cy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjZjYzM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvcnVudGVzdHMuc2gKQEAgLTAsMCArMSwyNiBAQAorIyEvdXNyL2Jpbi9lbnYgYmFzaAorCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKwordGhyaWZ0IC12ZXJzaW9uCitkb3RuZXQgLS1pbmZvCisKK2RvdG5ldCB0ZXN0IFRlc3RzXFRocmlmdC5JbnRlZ3JhdGlvblRlc3RzXFRocmlmdC5JbnRlZ3JhdGlvblRlc3RzLmNzcHJvagorZG90bmV0IHRlc3QgVGVzdHNcVGhyaWZ0LlRlc3RzXFRocmlmdC5UZXN0cy5jc3Byb2oKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL01ha2VmaWxlLmFtIGIvbGliL25vZGVqcy9NYWtlZmlsZS5hbQppbmRleCA2ZDc4NWJlLi42OGVhM2VhIDEwMDc1NQotLS0gYS9saWIvbm9kZWpzL01ha2VmaWxlLmFtCisrKyBiL2xpYi9ub2RlanMvTWFrZWZpbGUuYW0KQEAgLTE1LDIxICsxNSwyMSBAQAogIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogCi0KLVRIUklGVCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0CisjIFdlIGNhbGwgbnBtIHR3aWNlIHRvIHdvcmsgYXJvdW5kIG5wbSBpc3N1ZXMKIAogc3R1YnM6ICQodG9wX3NyY2RpcikvdGVzdC9UaHJpZnRUZXN0LnRocmlmdAogCSQoVEhSSUZUKSAtLWdlbiBqczpub2RlIC1vIHRlc3QvICQodG9wX3NyY2RpcikvdGVzdC9UaHJpZnRUZXN0LnRocmlmdAogCiBkZXBzOiAkKHRvcF9zcmNkaXIpL3BhY2thZ2UuanNvbgotCSQoTlBNKSBpbnN0YWxsIC0tbm8tYmluLWxpbmtzICQodG9wX3NyY2RpcikvCisJJChOUE0pIGluc3RhbGwgJCh0b3Bfc3JjZGlyKS8gfHwgJChOUE0pIGluc3RhbGwgJCh0b3Bfc3JjZGlyKS8KIAogYWxsLWxvY2FsOiBkZXBzCiAKIHByZWNyb3NzOiBkZXBzIHN0dWJzCiAKKyMgVE9ETzogTGludCBub2RlanMgbGliIGFuZCBnZW4tY29kZSBhcyBwYXJ0IG9mIGJ1aWxkCiBjaGVjazogZGVwcwotCWNkICQodG9wX3NyY2RpcikgJiYgJChOUE0pIHRlc3QgJiYgY2QgbGliL25vZGVqcworCWNkICQodG9wX3NyY2RpcikgJiYgJChOUE0pIHRlc3QgJiYgJChOUE0pIHJ1biBsaW50LXRlc3RzICYmIGNkIGxpYi9ub2RlanMKIAogY2xlYW4tbG9jYWw6CiAJJChSTSkgLXIgdGVzdC9nZW4tbm9kZWpzCmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL1JFQURNRS5tZCBiL2xpYi9ub2RlanMvUkVBRE1FLm1kCmluZGV4IDg4NDk5ZjcuLjUwYWNmYmQgMTAwNjQ0Ci0tLSBhL2xpYi9ub2RlanMvUkVBRE1FLm1kCisrKyBiL2xpYi9ub2RlanMvUkVBRE1FLm1kCkBAIC0yMCw2ICsyMCw5IEBACiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiB1bmRlciB0aGUgTGljZW5zZS4KIAorIyMgQ29tcGF0aWJpbGl0eQorCitub2RlIHZlcnNpb24gNiBvciBsYXRlciBpcyByZXF1aXJlZAogCiAjIyBJbnN0YWxsCiAKQEAgLTM1LDMwICszOCwzMiBAQAogCiBIZXJlIGlzIGEgQ2Fzc2FuZHJhIGV4YW1wbGU6CiAKLSAgICB2YXIgdGhyaWZ0ID0gcmVxdWlyZSgndGhyaWZ0JyksCi0gICAgICAgIENhc3NhbmRyYSA9IHJlcXVpcmUoJy4vZ2VuLW5vZGVqcy9DYXNzYW5kcmEnKQotICAgICAgICB0dHlwZXMgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvY2Fzc2FuZHJhX3R5cGVzJyk7CitgYGBqcwordmFyIHRocmlmdCA9IHJlcXVpcmUoJ3RocmlmdCcpLAorICAgIENhc3NhbmRyYSA9IHJlcXVpcmUoJy4vZ2VuLW5vZGVqcy9DYXNzYW5kcmEnKQorICAgIHR0eXBlcyA9IHJlcXVpcmUoJy4vZ2VuLW5vZGVqcy9jYXNzYW5kcmFfdHlwZXMnKTsKIAotICAgIHZhciBjb25uZWN0aW9uID0gdGhyaWZ0LmNyZWF0ZUNvbm5lY3Rpb24oImxvY2FsaG9zdCIsIDkxNjApLAotICAgICAgICBjbGllbnQgPSB0aHJpZnQuY3JlYXRlQ2xpZW50KENhc3NhbmRyYSwgY29ubmVjdGlvbik7Cit2YXIgY29ubmVjdGlvbiA9IHRocmlmdC5jcmVhdGVDb25uZWN0aW9uKCJsb2NhbGhvc3QiLCA5MTYwKSwKKyAgICBjbGllbnQgPSB0aHJpZnQuY3JlYXRlQ2xpZW50KENhc3NhbmRyYSwgY29ubmVjdGlvbik7CiAKLSAgICBjb25uZWN0aW9uLm9uKCdlcnJvcicsIGZ1bmN0aW9uKGVycikgewotICAgICAgY29uc29sZS5lcnJvcihlcnIpOwotICAgIH0pOworY29ubmVjdGlvbi5vbignZXJyb3InLCBmdW5jdGlvbihlcnIpIHsKKyAgY29uc29sZS5lcnJvcihlcnIpOworfSk7CiAKLSAgICBjbGllbnQuZ2V0X3NsaWNlKCJLZXlzcGFjZSIsICJrZXkiLCBuZXcgdHR5cGVzLkNvbHVtblBhcmVudCh7Y29sdW1uX2ZhbWlseTogIkV4YW1wbGVDRiJ9KSwgbmV3IHR0eXBlcy5TbGljZVByZWRpY2F0ZSh7c2xpY2VfcmFuZ2U6IG5ldyB0dHlwZXMuU2xpY2VSYW5nZSh7c3RhcnQ6ICcnLCBmaW5pc2g6ICcnfSl9KSwgdHR5cGVzLkNvbnNpc3RlbmN5TGV2ZWwuT05FLCBmdW5jdGlvbihlcnIsIGRhdGEpIHsKLSAgICAgIGlmIChlcnIpIHsKLSAgICAgICAgLy8gaGFuZGxlIGVycgotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gZGF0YSA9PSBbdHR5cGVzLkNvbHVtbk9yU3VwZXJDb2x1bW4sIC4uLl0KLSAgICAgIH0KLSAgICAgIGNvbm5lY3Rpb24uZW5kKCk7Ci0gICAgfSk7CitjbGllbnQuZ2V0X3NsaWNlKCJLZXlzcGFjZSIsICJrZXkiLCBuZXcgdHR5cGVzLkNvbHVtblBhcmVudCh7Y29sdW1uX2ZhbWlseTogIkV4YW1wbGVDRiJ9KSwgbmV3IHR0eXBlcy5TbGljZVByZWRpY2F0ZSh7c2xpY2VfcmFuZ2U6IG5ldyB0dHlwZXMuU2xpY2VSYW5nZSh7c3RhcnQ6ICcnLCBmaW5pc2g6ICcnfSl9KSwgdHR5cGVzLkNvbnNpc3RlbmN5TGV2ZWwuT05FLCBmdW5jdGlvbihlcnIsIGRhdGEpIHsKKyAgaWYgKGVycikgeworICAgIC8vIGhhbmRsZSBlcnIKKyAgfSBlbHNlIHsKKyAgICAvLyBkYXRhID09IFt0dHlwZXMuQ29sdW1uT3JTdXBlckNvbHVtbiwgLi4uXQorICB9CisgIGNvbm5lY3Rpb24uZW5kKCk7Cit9KTsKK2BgYAogCiA8YSBuYW1lPSJpbnQ2NCI+PC9hPgogIyMgSW50NjQKIAotU2luY2UgSmF2YVNjcmlwdCByZXByZXNlbnRzIGFsbCBudW1iZXJzIGFzIGRvdWJsZXMsIGludDY0IHZhbHVlcyBjYW5ub3QgYmUgYWNjdXJhdGVseSByZXByZXNlbnRlZCBuYXR1cmFsbHkuIFRvIHNvbHZlIHRoaXMsIGludDY0IHZhbHVlcyBpbiByZXNwb25zZXMgd2lsbCBiZSB3cmFwcGVkIHdpdGggVGhpcmZ0LkludDY0IG9iamVjdHMuIFRoZSBJbnQ2NCBpbXBsZW1lbnRhdGlvbiB1c2VkIGlzIFticm9vZmEvbm9kZS1pbnQ2NF0oaHR0cHM6Ly9naXRodWIuY29tL2Jyb29mYS9ub2RlLWludDY0KS4KK1NpbmNlIEphdmFTY3JpcHQgcmVwcmVzZW50cyBhbGwgbnVtYmVycyBhcyBkb3VibGVzLCBpbnQ2NCB2YWx1ZXMgY2Fubm90IGJlIGFjY3VyYXRlbHkgcmVwcmVzZW50ZWQgbmF0dXJhbGx5LiBUbyBzb2x2ZSB0aGlzLCBpbnQ2NCB2YWx1ZXMgaW4gcmVzcG9uc2VzIHdpbGwgYmUgd3JhcHBlZCB3aXRoIFRocmlmdC5JbnQ2NCBvYmplY3RzLiBUaGUgSW50NjQgaW1wbGVtZW50YXRpb24gdXNlZCBpcyBbYnJvb2ZhL25vZGUtaW50NjRdKGh0dHBzOi8vZ2l0aHViLmNvbS9icm9vZmEvbm9kZS1pbnQ2NCkuCiAKICMjIENsaWVudCBhbmQgc2VydmVyIGV4YW1wbGVzCiAKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvZXhhbXBsZXMvaHR0cFNlcnZlci5weSBiL2xpYi9ub2RlanMvZXhhbXBsZXMvaHR0cFNlcnZlci5weQppbmRleCBiOGJhNTg2Li5iNzEyZmNkIDEwMDY0NAotLS0gYS9saWIvbm9kZWpzL2V4YW1wbGVzL2h0dHBTZXJ2ZXIucHkKKysrIGIvbGliL25vZGVqcy9leGFtcGxlcy9odHRwU2VydmVyLnB5CkBAIC03LDcgKzcsNyBAQAogCiBjbGFzcyBIZWxsb1N2Y0hhbmRsZXI6CiAgIGRlZiBoZWxsb19mdW5jKHNlbGYpOgotICAgIHByaW50ICJIZWxsbyBDYWxsZWQiCisgICAgcHJpbnQoIkhlbGxvIENhbGxlZCIpCiAgICAgcmV0dXJuICJoZWxsbyBmcm9tIFB5dGhvbiIKIAogcHJvY2Vzc29yID0gSGVsbG9TdmMuUHJvY2Vzc29yKEhlbGxvU3ZjSGFuZGxlcigpKQpAQCAtMTYsNCArMTYsMyBAQAogc2VydmVyID0gVEh0dHBTZXJ2ZXIuVEh0dHBTZXJ2ZXIocHJvY2Vzc29yLCAoImxvY2FsaG9zdCIsIHBvcnQpLCBwcm90b0ZhY3RvcnkpCiBwcmludCAiUHl0aG9uIHNlcnZlciBydW5uaW5nIG9uIHBvcnQgIiArIHN0cihwb3J0KQogc2VydmVyLnNlcnZlKCkKLQpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L2JpbmFyeV9wcm90b2NvbC5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9iaW5hcnlfcHJvdG9jb2wuanMKaW5kZXggYTIzMDI5MS4uYjU3YzhjNSAxMDA2NDQKLS0tIGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L2JpbmFyeV9wcm90b2NvbC5qcworKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvYmluYXJ5X3Byb3RvY29sLmpzCkBAIC0zNyw2ICszNyw3IEBACiAgIHRoaXMudHJhbnMgPSB0cmFuczsKICAgdGhpcy5zdHJpY3RSZWFkID0gKHN0cmljdFJlYWQgIT09IHVuZGVmaW5lZCA/IHN0cmljdFJlYWQgOiBmYWxzZSk7CiAgIHRoaXMuc3RyaWN0V3JpdGUgPSAoc3RyaWN0V3JpdGUgIT09IHVuZGVmaW5lZCA/IHN0cmljdFdyaXRlIDogdHJ1ZSk7CisgIHRoaXMuX3NlcWlkID0gbnVsbDsKIH07CiAKIFRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUuZmx1c2ggPSBmdW5jdGlvbigpIHsKQEAgLTU0LDggKzU1LDcgQEAKICAgICAgIHRoaXMud3JpdGVJMzIoc2VxaWQpOwogICAgIH0KICAgICAvLyBSZWNvcmQgY2xpZW50IHNlcWlkIHRvIGZpbmQgY2FsbGJhY2sgYWdhaW4KLSAgICBpZiAodGhpcy5fc2VxaWQpIHsKLSAgICAgIC8vIFRPRE8gYmV0dGVyIGxvZ2dpbmcgbG9nIHdhcm5pbmcKKyAgICBpZiAodGhpcy5fc2VxaWQgIT09IG51bGwpIHsKICAgICAgIGxvZy53YXJuaW5nKCdTZXFJZCBhbHJlYWR5IHNldCcsIHsgJ25hbWUnOiBuYW1lIH0pOwogICAgIH0gZWxzZSB7CiAgICAgICB0aGlzLl9zZXFpZCA9IHNlcWlkOwpAQCAtNjQsNyArNjQsNyBAQAogfTsKIAogVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZU1lc3NhZ2VFbmQgPSBmdW5jdGlvbigpIHsKLSAgICBpZiAodGhpcy5fc2VxaWQpIHsKKyAgICBpZiAodGhpcy5fc2VxaWQgIT09IG51bGwpIHsKICAgICAgICAgdGhpcy5fc2VxaWQgPSBudWxsOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGxvZy53YXJuaW5nKCdObyBzZXFpZCB0byB1bnNldCcpOwpAQCAtMTQ2LDIyICsxNDYsMTAgQEAKICAgdGhpcy50cmFucy53cml0ZShiaW5hcnkud3JpdGVEb3VibGUobmV3IEJ1ZmZlcig4KSwgZHViKSk7CiB9OwogCi1UQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlU3RyaW5nID0gZnVuY3Rpb24oYXJnKSB7CitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlU3RyaW5nT3JCaW5hcnkgPSBmdW5jdGlvbihuYW1lLCBlbmNvZGluZywgYXJnKSB7CiAgIGlmICh0eXBlb2YoYXJnKSA9PT0gJ3N0cmluZycpIHsKLSAgICB0aGlzLndyaXRlSTMyKEJ1ZmZlci5ieXRlTGVuZ3RoKGFyZywgJ3V0ZjgnKSk7Ci0gICAgdGhpcy50cmFucy53cml0ZShhcmcsICd1dGY4Jyk7Ci0gIH0gZWxzZSBpZiAoYXJnIGluc3RhbmNlb2YgQnVmZmVyKSB7Ci0gICAgdGhpcy53cml0ZUkzMihhcmcubGVuZ3RoKTsKLSAgICB0aGlzLnRyYW5zLndyaXRlKGFyZyk7Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgbmV3IEVycm9yKCd3cml0ZVN0cmluZyBjYWxsZWQgd2l0aG91dCBhIHN0cmluZy9CdWZmZXIgYXJndW1lbnQ6ICcgKyBhcmcpOwotICB9Ci19OwotCi1UQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlQmluYXJ5ID0gZnVuY3Rpb24oYXJnKSB7Ci0gIGlmICh0eXBlb2YoYXJnKSA9PT0gJ3N0cmluZycpIHsKLSAgICB0aGlzLndyaXRlSTMyKEJ1ZmZlci5ieXRlTGVuZ3RoKGFyZywgJ3V0ZjgnKSk7Ci0gICAgdGhpcy50cmFucy53cml0ZShhcmcsICd1dGY4Jyk7CisgICAgdGhpcy53cml0ZUkzMihCdWZmZXIuYnl0ZUxlbmd0aChhcmcsIGVuY29kaW5nKSk7CisgICAgdGhpcy50cmFucy53cml0ZShuZXcgQnVmZmVyKGFyZywgZW5jb2RpbmcpKTsKICAgfSBlbHNlIGlmICgoYXJnIGluc3RhbmNlb2YgQnVmZmVyKSB8fAogICAgICAgICAgICAgIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYXJnKSA9PSAnW29iamVjdCBVaW50OEFycmF5XScpKSB7CiAgICAgLy8gQnVmZmVycyBpbiBOb2RlLmpzIHVuZGVyIEJyb3dzZXJpZnkgbWF5IGV4dGVuZCBVSW50OEFycmF5IGluc3RlYWQgb2YKQEAgLTE3MCwxMCArMTU4LDE4IEBACiAgICAgdGhpcy53cml0ZUkzMihhcmcubGVuZ3RoKTsKICAgICB0aGlzLnRyYW5zLndyaXRlKGFyZyk7CiAgIH0gZWxzZSB7Ci0gICAgdGhyb3cgbmV3IEVycm9yKCd3cml0ZUJpbmFyeSBjYWxsZWQgd2l0aG91dCBhIHN0cmluZy9CdWZmZXIgYXJndW1lbnQ6ICcgKyBhcmcpOworICAgIHRocm93IG5ldyBFcnJvcihuYW1lICsgJyBjYWxsZWQgd2l0aG91dCBhIHN0cmluZy9CdWZmZXIgYXJndW1lbnQ6ICcgKyBhcmcpOwogICB9CiB9OwogCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlU3RyaW5nID0gZnVuY3Rpb24oYXJnKSB7CisgIHRoaXMud3JpdGVTdHJpbmdPckJpbmFyeSgnd3JpdGVTdHJpbmcnLCAndXRmOCcsIGFyZyk7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlQmluYXJ5ID0gZnVuY3Rpb24oYXJnKSB7CisgIHRoaXMud3JpdGVTdHJpbmdPckJpbmFyeSgnd3JpdGVCaW5hcnknLCAnYmluYXJ5JywgYXJnKTsKK307CisKIFRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZE1lc3NhZ2VCZWdpbiA9IGZ1bmN0aW9uKCkgewogICB2YXIgc3ogPSB0aGlzLnJlYWRJMzIoKTsKICAgdmFyIHR5cGUsIG5hbWUsIHNlcWlkOwpAQCAtMTgxLDcgKzE3Nyw2IEBACiAgIGlmIChzeiA8IDApIHsKICAgICB2YXIgdmVyc2lvbiA9IHN6ICYgVkVSU0lPTl9NQVNLOwogICAgIGlmICh2ZXJzaW9uICE9IFZFUlNJT05fMSkgewotICAgICAgY29uc29sZS5sb2coIkJBRDogIiArIHZlcnNpb24pOwogICAgICAgdGhyb3cgbmV3IFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24oVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvblR5cGUuQkFEX1ZFUlNJT04sICJCYWQgdmVyc2lvbiBpbiByZWFkTWVzc2FnZUJlZ2luOiAiICsgc3opOwogICAgIH0KICAgICB0eXBlID0gc3ogJiBUWVBFX01BU0s7CkBAIC0yNzksMTEgKzI3NCwyNSBAQAogCiBUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRCaW5hcnkgPSBmdW5jdGlvbigpIHsKICAgdmFyIGxlbiA9IHRoaXMucmVhZEkzMigpOworICBpZiAobGVuID09PSAwKSB7CisgICAgcmV0dXJuIG5ldyBCdWZmZXIoMCk7CisgIH0KKworICBpZiAobGVuIDwgMCkgeworICAgIHRocm93IG5ldyBUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uKFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb25UeXBlLk5FR0FUSVZFX1NJWkUsICJOZWdhdGl2ZSBiaW5hcnkgc2l6ZSIpOworICB9CiAgIHJldHVybiB0aGlzLnRyYW5zLnJlYWQobGVuKTsKIH07CiAKIFRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZFN0cmluZyA9IGZ1bmN0aW9uKCkgewogICB2YXIgbGVuID0gdGhpcy5yZWFkSTMyKCk7CisgIGlmIChsZW4gPT09IDApIHsKKyAgICByZXR1cm4gIiI7CisgIH0KKworICBpZiAobGVuIDwgMCkgeworICAgIHRocm93IG5ldyBUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uKFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb25UeXBlLk5FR0FUSVZFX1NJWkUsICJOZWdhdGl2ZSBzdHJpbmcgc2l6ZSIpOworICB9CiAgIHJldHVybiB0aGlzLnRyYW5zLnJlYWRTdHJpbmcobGVuKTsKIH07CiAKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9icm93c2VyLmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2Jyb3dzZXIuanMKaW5kZXggNDU5M2E4Zi4uNjdjZTg1MyAxMDA2NDQKLS0tIGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L2Jyb3dzZXIuanMKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2Jyb3dzZXIuanMKQEAgLTMyLDMgKzMyLDUgQEAKIGV4cG9ydHMuUHJvdG9jb2wgPSBleHBvcnRzLlRKU09OUHJvdG9jb2wgPSByZXF1aXJlKCcuL2pzb25fcHJvdG9jb2wnKTsKIGV4cG9ydHMuVEJpbmFyeVByb3RvY29sID0gcmVxdWlyZSgnLi9iaW5hcnlfcHJvdG9jb2wnKTsKIGV4cG9ydHMuVENvbXBhY3RQcm90b2NvbCA9IHJlcXVpcmUoJy4vY29tcGFjdF9wcm90b2NvbCcpOworCitleHBvcnRzLkludDY0ID0gcmVxdWlyZSgnbm9kZS1pbnQ2NCcpOwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L2J1ZmZlcmVkX3RyYW5zcG9ydC5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9idWZmZXJlZF90cmFuc3BvcnQuanMKaW5kZXggMTM2MzZiNS4uYTllMDA2ZSAxMDA2NDQKLS0tIGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L2J1ZmZlcmVkX3RyYW5zcG9ydC5qcworKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvYnVmZmVyZWRfdHJhbnNwb3J0LmpzCkBAIC0zMyw2ICszMywxNCBAQAogICB0aGlzLm9uRmx1c2ggPSBjYWxsYmFjazsKIH07CiAKK1RCdWZmZXJlZFRyYW5zcG9ydC5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbigpIHsKKyAgdGhpcy5pbkJ1ZiA9IG5ldyBCdWZmZXIodGhpcy5kZWZhdWx0UmVhZEJ1ZmZlclNpemUpOworICB0aGlzLnJlYWRDdXJzb3IgPSAwOworICB0aGlzLndyaXRlQ3Vyc29yID0gMDsKKyAgdGhpcy5vdXRCdWZmZXJzID0gW107CisgIHRoaXMub3V0Q291bnQgPSAwOworfQorCiBUQnVmZmVyZWRUcmFuc3BvcnQucmVjZWl2ZXIgPSBmdW5jdGlvbihjYWxsYmFjaywgc2VxaWQpIHsKICAgdmFyIHJlYWRlciA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoKTsKIApkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L2NvbXBhY3RfcHJvdG9jb2wuanMgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvY29tcGFjdF9wcm90b2NvbC5qcwppbmRleCA4YWVlODA4Li41YzUzMWU1IDEwMDY0NAotLS0gYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvY29tcGFjdF9wcm90b2NvbC5qcworKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvY29tcGFjdF9wcm90b2NvbC5qcwpAQCAtMjQ5LDcgKzI0OSw2IEBACiAKICAgLy8gUmVjb3JkIGNsaWVudCBzZXFpZCB0byBmaW5kIGNhbGxiYWNrIGFnYWluCiAgIGlmICh0aGlzLl9zZXFpZCkgewotICAgIC8vIFRPRE8gYmV0dGVyIGxvZ2dpbmcgbG9nIHdhcm5pbmcKICAgICBsb2cud2FybmluZygnU2VxSWQgYWxyZWFkeSBzZXQnLCB7ICduYW1lJzogbmFtZSB9KTsKICAgfSBlbHNlIHsKICAgICB0aGlzLl9zZXFpZCA9IHNlcWlkOwpAQCAtNDI5LDIyICs0MjgsMzAgQEAKICAgdGhpcy50cmFucy53cml0ZShidWZmKTsKIH07CiAKLVRDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlU3RyaW5nID0gZnVuY3Rpb24oYXJnKSB7Ci0gIHRoaXMud3JpdGVCaW5hcnkoYXJnKTsKLX07Ci0KLVRDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlQmluYXJ5ID0gZnVuY3Rpb24oYXJnKSB7CitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZVN0cmluZ09yQmluYXJ5ID0gZnVuY3Rpb24obmFtZSwgZW5jb2RpbmcsIGFyZykgewogICBpZiAodHlwZW9mIGFyZyA9PT0gJ3N0cmluZycpIHsKLSAgICB0aGlzLndyaXRlVmFyaW50MzIoQnVmZmVyLmJ5dGVMZW5ndGgoYXJnLCAndXRmOCcpKSA7Ci0gICAgdGhpcy50cmFucy53cml0ZShhcmcsICd1dGY4Jyk7Ci0gIH0gZWxzZSBpZiAoYXJnIGluc3RhbmNlb2YgQnVmZmVyKSB7CisgICAgdGhpcy53cml0ZVZhcmludDMyKEJ1ZmZlci5ieXRlTGVuZ3RoKGFyZywgZW5jb2RpbmcpKSA7CisgICAgdGhpcy50cmFucy53cml0ZShuZXcgQnVmZmVyKGFyZywgZW5jb2RpbmcpKTsKKyAgfSBlbHNlIGlmIChhcmcgaW5zdGFuY2VvZiBCdWZmZXIgfHwKKyAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYXJnKSA9PSAnW29iamVjdCBVaW50OEFycmF5XScpIHsKKyAgICAvLyBCdWZmZXJzIGluIE5vZGUuanMgdW5kZXIgQnJvd3NlcmlmeSBtYXkgZXh0ZW5kIFVJbnQ4QXJyYXkgaW5zdGVhZCBvZgorICAgIC8vIGRlZmluaW5nIGEgbmV3IG9iamVjdC4gV2UgZGV0ZWN0IHRoZW0gaGVyZSBzbyB3ZSBjYW4gd3JpdGUgdGhlbQorICAgIC8vIGNvcnJlY3RseQogICAgIHRoaXMud3JpdGVWYXJpbnQzMihhcmcubGVuZ3RoKTsKICAgICB0aGlzLnRyYW5zLndyaXRlKGFyZyk7CiAgIH0gZWxzZSB7Ci0gICAgdGhyb3cgbmV3IEVycm9yKCd3cml0ZVN0cmluZy93cml0ZUJpbmFyeSBjYWxsZWQgd2l0aG91dCBhIHN0cmluZy9CdWZmZXIgYXJndW1lbnQ6ICcgKyBhcmcpOworICAgIHRocm93IG5ldyBFcnJvcihuYW1lICsgJyBjYWxsZWQgd2l0aG91dCBhIHN0cmluZy9CdWZmZXIgYXJndW1lbnQ6ICcgKyBhcmcpOwogICB9CiB9OwogCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZVN0cmluZyA9IGZ1bmN0aW9uKGFyZykgeworICB0aGlzLndyaXRlU3RyaW5nT3JCaW5hcnkoJ3dyaXRlU3RyaW5nJywgJ3V0ZjgnLCBhcmcpOworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUud3JpdGVCaW5hcnkgPSBmdW5jdGlvbihhcmcpIHsKKyAgdGhpcy53cml0ZVN0cmluZ09yQmluYXJ5KCd3cml0ZUJpbmFyeScsICdiaW5hcnknLCBhcmcpOworfTsKKwogCiAvLwogLy8gQ29tcGFjdCBQcm90b2NvbCBpbnRlcm5hbCB3cml0ZSBtZXRob2RzCkBAIC03NTIsNiArNzU5LDE4IEBACiAKIFRDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLnJlYWRCaW5hcnkgPSBmdW5jdGlvbigpIHsKICAgdmFyIHNpemUgPSB0aGlzLnJlYWRWYXJpbnQzMigpOworICBpZiAoc2l6ZSA9PT0gMCkgeworICAgIHJldHVybiBuZXcgQnVmZmVyKDApOworICB9CisKKyAgaWYgKHNpemUgPCAwKSB7CisgICAgdGhyb3cgbmV3IFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24oVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvblR5cGUuTkVHQVRJVkVfU0laRSwgIk5lZ2F0aXZlIGJpbmFyeSBzaXplIik7CisgIH0KKyAgcmV0dXJuIHRoaXMudHJhbnMucmVhZChzaXplKTsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLnJlYWRTdHJpbmcgPSBmdW5jdGlvbigpIHsKKyAgdmFyIHNpemUgPSB0aGlzLnJlYWRWYXJpbnQzMigpOwogICAvLyBDYXRjaCBlbXB0eSBzdHJpbmcgY2FzZQogICBpZiAoc2l6ZSA9PT0gMCkgewogICAgIHJldHVybiAiIjsKQEAgLTc1OSwxNSArNzc4LDkgQEAKIAogICAvLyBDYXRjaCBlcnJvciBjYXNlcwogICBpZiAoc2l6ZSA8IDApIHsKLSAgICB0aHJvdyBuZXcgVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbihUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uVHlwZS5ORUdBVElWRV9TSVpFLCAiTmVnYXRpdmUgYmluYXJ5L3N0cmluZyBzaXplIik7CisgICAgdGhyb3cgbmV3IFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24oVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvblR5cGUuTkVHQVRJVkVfU0laRSwgIk5lZ2F0aXZlIHN0cmluZyBzaXplIik7CiAgIH0KLSAgdmFyIHZhbHVlID0gdGhpcy50cmFucy5yZWFkU3RyaW5nKHNpemUpOwotCi0gIHJldHVybiB2YWx1ZTsKLX07Ci0KLVRDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLnJlYWRTdHJpbmcgPSBmdW5jdGlvbigpIHsKLSAgcmV0dXJuIHRoaXMucmVhZEJpbmFyeSgpOworICByZXR1cm4gdGhpcy50cmFucy5yZWFkU3RyaW5nKHNpemUpOwogfTsKIAogCmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvY29ubmVjdGlvbi5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9jb25uZWN0aW9uLmpzCmluZGV4IDRiODRiNzYuLjllNWMwNjMgMTAwNjQ0Ci0tLSBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9jb25uZWN0aW9uLmpzCisrKyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9jb25uZWN0aW9uLmpzCkBAIC0xNywxMCArMTcsMTIgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiB2YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTsKLXZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCJldmVudHMiKS5FdmVudEVtaXR0ZXI7Cit2YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyOwordmFyIGNvbnN0YW50cyA9IHJlcXVpcmUoJ2NvbnN0YW50cycpOwogdmFyIG5ldCA9IHJlcXVpcmUoJ25ldCcpOwogdmFyIHRscyA9IHJlcXVpcmUoJ3RscycpOwogdmFyIHRocmlmdCA9IHJlcXVpcmUoJy4vdGhyaWZ0Jyk7Cit2YXIgbG9nID0gcmVxdWlyZSgnLi9sb2cnKTsKIAogdmFyIFRCdWZmZXJlZFRyYW5zcG9ydCA9IHJlcXVpcmUoJy4vYnVmZmVyZWRfdHJhbnNwb3J0Jyk7CiB2YXIgVEJpbmFyeVByb3RvY29sID0gcmVxdWlyZSgnLi9iaW5hcnlfcHJvdG9jb2wnKTsKQEAgLTM2LDYgKzM4LDcgQEAKIAogICB0aGlzLnNlcUlkMlNlcnZpY2UgPSB7fTsKICAgdGhpcy5jb25uZWN0aW9uID0gc3RyZWFtOworICB0aGlzLnNzbCA9IChzdHJlYW0uZW5jcnlwdGVkKTsKICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKICAgdGhpcy50cmFuc3BvcnQgPSB0aGlzLm9wdGlvbnMudHJhbnNwb3J0IHx8IFRCdWZmZXJlZFRyYW5zcG9ydDsKICAgdGhpcy5wcm90b2NvbCA9IHRoaXMub3B0aW9ucy5wcm90b2NvbCB8fCBUQmluYXJ5UHJvdG9jb2w7CkBAIC02MSw3ICs2NCw4IEBACiAgICAgICB0aGlzLm9wdGlvbnMuY29ubmVjdF90aW1lb3V0ID4gMCkgewogICAgICB0aGlzLmNvbm5lY3RfdGltZW91dCA9ICt0aGlzLm9wdGlvbnMuY29ubmVjdF90aW1lb3V0OwogICB9Ci0gIHRoaXMuY29ubmVjdGlvbi5hZGRMaXN0ZW5lcigiY29ubmVjdCIsIGZ1bmN0aW9uKCkgeworCisgIHRoaXMuY29ubmVjdGlvbi5hZGRMaXN0ZW5lcih0aGlzLnNzbCA/ICJzZWN1cmVDb25uZWN0IiA6ICJjb25uZWN0IiwgZnVuY3Rpb24oKSB7CiAgICAgc2VsZi5jb25uZWN0ZWQgPSB0cnVlOwogCiAgICAgdGhpcy5zZXRUaW1lb3V0KHNlbGYub3B0aW9ucy50aW1lb3V0IHx8IDApOwpAQCAtNzgsMzQgKzgyLDE0IEBACiAgICAgc2VsZi5lbWl0KCJjb25uZWN0Iik7CiAgIH0pOwogCi0gIHRoaXMuY29ubmVjdGlvbi5hZGRMaXN0ZW5lcigic2VjdXJlQ29ubmVjdCIsIGZ1bmN0aW9uKCkgewotICAgIHNlbGYuY29ubmVjdGVkID0gdHJ1ZTsKLQotICAgIHRoaXMuc2V0VGltZW91dChzZWxmLm9wdGlvbnMudGltZW91dCB8fCAwKTsKLSAgICB0aGlzLnNldE5vRGVsYXkoKTsKLSAgICB0aGlzLmZyYW1lTGVmdCA9IDA7Ci0gICAgdGhpcy5mcmFtZVBvcyA9IDA7Ci0gICAgdGhpcy5mcmFtZSA9IG51bGw7Ci0gICAgc2VsZi5pbml0aWFsaXplX3JldHJ5X3ZhcnMoKTsKLQotICAgIHNlbGYub2ZmbGluZV9xdWV1ZS5mb3JFYWNoKGZ1bmN0aW9uKGRhdGEpIHsKLSAgICAgIHNlbGYuY29ubmVjdGlvbi53cml0ZShkYXRhKTsKLSAgICB9KTsKLQotICAgIHNlbGYuZW1pdCgiY29ubmVjdCIpOwotICB9KTsKLQotCiAgIHRoaXMuY29ubmVjdGlvbi5hZGRMaXN0ZW5lcigiZXJyb3IiLCBmdW5jdGlvbihlcnIpIHsKICAgICAvLyBPbmx5IGVtaXQgdGhlIGVycm9yIGlmIG5vLW9uZSBlbHNlIGlzIGxpc3RlbmluZyBvbiB0aGUgY29ubmVjdGlvbgotICAgIC8vIG9yIGlmIHNvbWVvbmUgaXMgbGlzdGVuaW5nIG9uIHVzCisgICAgLy8gb3IgaWYgc29tZW9uZSBpcyBsaXN0ZW5pbmcgb24gdXMsIGJlY2F1c2UgTm9kZSB0dXJucyB1bmhhbmRsZWQKKyAgICAvLyAnZXJyb3InIGV2ZW50cyBpbnRvIGV4Y2VwdGlvbnMuCiAgICAgaWYgKHNlbGYuY29ubmVjdGlvbi5saXN0ZW5lcnMoJ2Vycm9yJykubGVuZ3RoID09PSAxIHx8CiAgICAgICAgIHNlbGYubGlzdGVuZXJzKCdlcnJvcicpLmxlbmd0aCA+IDApIHsKICAgICAgIHNlbGYuZW1pdCgiZXJyb3IiLCBlcnIpOwogICAgIH0KLSAgICAvLyAiZXJyb3IiIGV2ZW50cyBnZXQgdHVybmVkIGludG8gZXhjZXB0aW9ucyBpZiB0aGV5IGFyZW4ndCBsaXN0ZW5lZCBmb3IuICBJZiB0aGUgdXNlciBoYW5kbGVkIHRoaXMgZXJyb3IKLSAgICAvLyB0aGVuIHdlIHNob3VsZCB0cnkgdG8gcmVjb25uZWN0LgotICAgIHNlbGYuY29ubmVjdGlvbl9nb25lKCk7CiAgIH0pOwogCiAgIC8vIEFkZCBhIGNsb3NlIGxpc3RlbmVyCkBAIC0xMzksNyArMTIzLDYgQEAKICAgICAgICAgdmFyIHNlcnZpY2VfbmFtZSA9IHNlbGYuc2VxSWQyU2VydmljZVtoZWFkZXIucnNlcWlkXTsKICAgICAgICAgaWYgKHNlcnZpY2VfbmFtZSkgewogICAgICAgICAgIGNsaWVudCA9IHNlbGYuY2xpZW50W3NlcnZpY2VfbmFtZV07Ci0gICAgICAgICAgZGVsZXRlIHNlbGYuc2VxSWQyU2VydmljZVtoZWFkZXIucnNlcWlkXTsKICAgICAgICAgfQogICAgICAgICAvKmpzaGludCAtVzA4MyAqLwogICAgICAgICBjbGllbnQuX3JlcXNbZHVtbXlfc2VxaWRdID0gZnVuY3Rpb24oZXJyLCBzdWNjZXNzKXsKQEAgLTE0Nyw2ICsxMzAsOSBAQAogCiAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gY2xpZW50Ll9yZXFzW2hlYWRlci5yc2VxaWRdOwogICAgICAgICAgIGRlbGV0ZSBjbGllbnQuX3JlcXNbaGVhZGVyLnJzZXFpZF07CisgICAgICAgICAgaWYgKHNlcnZpY2VfbmFtZSkgeworICAgICAgICAgICAgZGVsZXRlIHNlbGYuc2VxSWQyU2VydmljZVtoZWFkZXIucnNlcWlkXTsKKyAgICAgICAgICB9CiAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHN1Y2Nlc3MpOwogICAgICAgICAgIH0KQEAgLTE2OCw3ICsxNTQsNyBAQAogICAgICAgICB0cmFuc3BvcnRfd2l0aF9kYXRhLnJvbGxiYWNrUG9zaXRpb24oKTsKICAgICAgIH0KICAgICAgIGVsc2UgewotICAgICAgICB0aHJvdyBlOworICAgICAgICBzZWxmLmVtaXQoJ2Vycm9yJywgZSk7CiAgICAgICB9CiAgICAgfQogICB9KSk7CkBAIC0xNzksNiArMTY1LDEwIEBACiAgIHRoaXMuY29ubmVjdGlvbi5lbmQoKTsKIH07CiAKK0Nvbm5lY3Rpb24ucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbigpIHsKKyAgdGhpcy5jb25uZWN0aW9uLmRlc3Ryb3koKTsKK307CisKIENvbm5lY3Rpb24ucHJvdG90eXBlLmluaXRpYWxpemVfcmV0cnlfdmFycyA9IGZ1bmN0aW9uICgpIHsKICAgdGhpcy5yZXRyeV90aW1lciA9IG51bGw7CiAgIHRoaXMucmV0cnlfdG90YWx0aW1lID0gMDsKQEAgLTE5NywyOCArMTg3LDI1IEBACiAKIENvbm5lY3Rpb24ucHJvdG90eXBlLmNvbm5lY3Rpb25fZ29uZSA9IGZ1bmN0aW9uICgpIHsKICAgdmFyIHNlbGYgPSB0aGlzOworICB0aGlzLmNvbm5lY3RlZCA9IGZhbHNlOwogCiAgIC8vIElmIGEgcmV0cnkgaXMgYWxyZWFkeSBpbiBwcm9ncmVzcywganVzdCBsZXQgdGhhdCBoYXBwZW4KICAgaWYgKHRoaXMucmV0cnlfdGltZXIpIHsKICAgICByZXR1cm47CiAgIH0KLSAgaWYgKCF0aGlzLm1heF9hdHRlbXB0cykgeworICAvLyBXZSBjYW5ub3QgcmVjb25uZWN0IGEgc2VjdXJlIHNvY2tldC4KKyAgaWYgKCF0aGlzLm1heF9hdHRlbXB0cyB8fCB0aGlzLnNzbCkgewogICAgIHNlbGYuZW1pdCgiY2xvc2UiKTsKICAgICByZXR1cm47CiAgIH0KIAotICB0aGlzLmNvbm5lY3RlZCA9IGZhbHNlOwotICB0aGlzLnJlYWR5ID0gZmFsc2U7Ci0KICAgaWYgKHRoaXMucmV0cnlfbWF4X2RlbGF5ICE9PSBudWxsICYmIHRoaXMucmV0cnlfZGVsYXkgPj0gdGhpcy5yZXRyeV9tYXhfZGVsYXkpIHsKICAgICB0aGlzLnJldHJ5X2RlbGF5ID0gdGhpcy5yZXRyeV9tYXhfZGVsYXk7CiAgIH0gZWxzZSB7CiAgICAgdGhpcy5yZXRyeV9kZWxheSA9IE1hdGguZmxvb3IodGhpcy5yZXRyeV9kZWxheSAqIHRoaXMucmV0cnlfYmFja29mZik7CiAgIH0KIAotICBpZiAoc2VsZi5fZGVidWcpIHsKLSAgICBjb25zb2xlLmxvZygiUmV0cnkgY29ubmVjdGlvbiBpbiAiICsgdGhpcy5yZXRyeV9kZWxheSArICIgbXMiKTsKLSAgfQorICBsb2cuZGVidWcoIlJldHJ5IGNvbm5lY3Rpb24gaW4gIiArIHRoaXMucmV0cnlfZGVsYXkgKyAiIG1zIik7CiAKICAgaWYgKHRoaXMubWF4X2F0dGVtcHRzICYmIHRoaXMuYXR0ZW1wdHMgPj0gdGhpcy5tYXhfYXR0ZW1wdHMpIHsKICAgICB0aGlzLnJldHJ5X3RpbWVyID0gbnVsbDsKQEAgLTIzNCw5ICsyMjEsMTIgQEAKICAgfSk7CiAKICAgdGhpcy5yZXRyeV90aW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewotICAgIGlmIChzZWxmLl9kZWJ1ZykgewotICAgICAgIGNvbnNvbGUubG9nKCJSZXRyeWluZyBjb25uZWN0aW9uLi4uIik7Ci0JfQorICAgIGlmIChzZWxmLmNvbm5lY3Rpb24uZGVzdHJveWVkKSB7CisgICAgICBzZWxmLnJldHJ5X3RpbWVyID0gbnVsbDsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBsb2cuZGVidWcoIlJldHJ5aW5nIGNvbm5lY3Rpb24uLi4iKTsKIAogICAgIHNlbGYucmV0cnlfdG90YWx0aW1lICs9IHNlbGYucmV0cnlfZGVsYXk7CiAKQEAgLTI0Nyw3ICsyMzcsMTEgQEAKICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgc2VsZi5jb25uZWN0aW9uLmNvbm5lY3Qoc2VsZi5wb3J0LCBzZWxmLmhvc3QpOworICAgIGlmIChzZWxmLnBhdGggIT09IHVuZGVmaW5lZCkgeworICAgICAgc2VsZi5jb25uZWN0aW9uLmNvbm5lY3Qoc2VsZi5wYXRoKTsKKyAgICB9IGVsc2UgeworICAgICAgc2VsZi5jb25uZWN0aW9uLmNvbm5lY3Qoc2VsZi5wb3J0LCBzZWxmLmhvc3QpOworICAgIH0KICAgICBzZWxmLnJldHJ5X3RpbWVyID0gbnVsbDsKICAgfSwgdGhpcy5yZXRyeV9kZWxheSk7CiB9OwpAQCAtMjYxLDcgKzI1NSwyMCBAQAogICByZXR1cm4gY29ubmVjdGlvbjsKIH07CiAKK2V4cG9ydHMuY3JlYXRlVURTQ29ubmVjdGlvbiA9IGZ1bmN0aW9uKHBhdGgsIG9wdGlvbnMpIHsKKyAgdmFyIHN0cmVhbSA9IG5ldC5jcmVhdGVDb25uZWN0aW9uKHBhdGgpOworICB2YXIgY29ubmVjdGlvbiA9IG5ldyBDb25uZWN0aW9uKHN0cmVhbSwgb3B0aW9ucyk7CisgIGNvbm5lY3Rpb24ucGF0aCA9IHBhdGg7CisKKyAgcmV0dXJuIGNvbm5lY3Rpb247Cit9OworCiBleHBvcnRzLmNyZWF0ZVNTTENvbm5lY3Rpb24gPSBmdW5jdGlvbihob3N0LCBwb3J0LCBvcHRpb25zKSB7CisgIGlmICghKCdzZWN1cmVQcm90b2NvbCcgaW4gb3B0aW9ucykgJiYgISgnc2VjdXJlT3B0aW9ucycgaW4gb3B0aW9ucykpIHsKKyAgICBvcHRpb25zLnNlY3VyZVByb3RvY29sID0gIlNTTHYyM19tZXRob2QiOworICAgIG9wdGlvbnMuc2VjdXJlT3B0aW9ucyA9IGNvbnN0YW50cy5TU0xfT1BfTk9fU1NMdjIgfCBjb25zdGFudHMuU1NMX09QX05PX1NTTHYzOworICB9CisKICAgdmFyIHN0cmVhbSA9IHRscy5jb25uZWN0KHBvcnQsIGhvc3QsIG9wdGlvbnMpOwogICB2YXIgY29ubmVjdGlvbiA9IG5ldyBDb25uZWN0aW9uKHN0cmVhbSwgb3B0aW9ucyk7CiAgIGNvbm5lY3Rpb24uaG9zdCA9IGhvc3Q7CkBAIC0yODMsMjAgKzI5MCwxOSBAQAogICB2YXIgc2VsZiA9IHRoaXM7CiAgIEV2ZW50RW1pdHRlci5jYWxsKHRoaXMpOwogCi0gIHRoaXMuX2RlYnVnID0gb3B0aW9ucy5kZWJ1ZyB8fCBmYWxzZTsKICAgdGhpcy5jb25uZWN0aW9uID0gY2hpbGQuc3RkaW47CiAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307CiAgIHRoaXMudHJhbnNwb3J0ID0gdGhpcy5vcHRpb25zLnRyYW5zcG9ydCB8fCBUQnVmZmVyZWRUcmFuc3BvcnQ7CiAgIHRoaXMucHJvdG9jb2wgPSB0aGlzLm9wdGlvbnMucHJvdG9jb2wgfHwgVEJpbmFyeVByb3RvY29sOwogICB0aGlzLm9mZmxpbmVfcXVldWUgPSBbXTsKIAotICBpZih0aGlzLl9kZWJ1ZyA9PT0gdHJ1ZSl7Ci0gICAgdGhpcy5jaGlsZC5zdGRlcnIub24oJ2RhdGEnLGZ1bmN0aW9uKGVycil7Ci0gICAgICBjb25zb2xlLmxvZyhlcnIudG9TdHJpbmcoKSwnQ0hJTEQgRVJST1InKTsKKyAgaWYgKGxvZy5nZXRMb2dMZXZlbCgpID09PSAnZGVidWcnKSB7CisgICAgdGhpcy5jaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoZXJyKSB7CisgICAgICBsb2cuZGVidWcoZXJyLnRvU3RyaW5nKCksICdDSElMRCBFUlJPUicpOwogICAgIH0pOwogCi0gICAgdGhpcy5jaGlsZC5vbignZXhpdCcsZnVuY3Rpb24oY29kZSxzaWduYWwpewotICAgICAgY29uc29sZS5sb2coY29kZSsnOicrc2lnbmFsLCdDSElMRCBFWElURUQnKTsKKyAgICB0aGlzLmNoaWxkLm9uKCdleGl0JywgZnVuY3Rpb24gKGNvZGUsc2lnbmFsKSB7CisgICAgICBsb2cuZGVidWcoY29kZSArICc6JyArIHNpZ25hbCwgJ0NISUxEIEVYSVRFRCcpOwogICAgIH0pOwogICB9CiAKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9odHRwX2Nvbm5lY3Rpb24uanMgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvaHR0cF9jb25uZWN0aW9uLmpzCmluZGV4IGYzZmNkNzQuLjNjMmFiMGYgMTAwNjQ0Ci0tLSBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9odHRwX2Nvbm5lY3Rpb24uanMKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2h0dHBfY29ubmVjdGlvbi5qcwpAQCAtNTksOCArNTksNiBAQAogICogSW5pdGlhbGl6ZXMgYSBUaHJpZnQgSHR0cENvbm5lY3Rpb24gaW5zdGFuY2UgKHVzZSBjcmVhdGVIdHRwQ29ubmVjdGlvbigpIHJhdGhlciB0aGFuCiAgKiAgICBpbnN0YW50aWF0aW5nIGRpcmVjdGx5KS4KICAqIEBjb25zdHJ1Y3RvcgotICogQHBhcmFtIHtzdHJpbmd9IGhvc3QgLSBUaGUgaG9zdCBuYW1lIG9yIElQIHRvIGNvbm5lY3QgdG8uCi0gKiBAcGFyYW0ge251bWJlcn0gcG9ydCAtIFRoZSBUQ1AgcG9ydCB0byBjb25uZWN0IHRvLgogICogQHBhcmFtIHtDb25uZWN0T3B0aW9uc30gb3B0aW9ucyAtIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdXNlLgogICogQHRocm93cyB7ZXJyb3J9IEV4Y2VwdGlvbnMgb3RoZXIgdGhhbiBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IgYXJlIHJldGhyb3duCiAgKiBAZXZlbnQge2Vycm9yfSBUaGUgImVycm9yIiBldmVudCBpcyBmaXJlZCB3aGVuIGEgTm9kZS5qcyBlcnJvciBldmVudCBvY2N1cnMgZHVyaW5nCkBAIC03MSwxNSArNjksMTYgQEAKICAqICAgICBzZW1hbnRpY3MgaW1wbGVtZW50ZWQgb3ZlciB0aGUgTm9kZS5qcyBodHRwLnJlcXVlc3QoKSBtZXRob2QuCiAgKiBAc2VlIHtAbGluayBjcmVhdGVIdHRwQ29ubmVjdGlvbn0KICAqLwotdmFyIEh0dHBDb25uZWN0aW9uID0gZXhwb3J0cy5IdHRwQ29ubmVjdGlvbiA9IGZ1bmN0aW9uKGhvc3QsIHBvcnQsIG9wdGlvbnMpIHsKK3ZhciBIdHRwQ29ubmVjdGlvbiA9IGV4cG9ydHMuSHR0cENvbm5lY3Rpb24gPSBmdW5jdGlvbihvcHRpb25zKSB7CiAgIC8vSW5pdGlhbGl6ZSB0aGUgZW1pdHRlciBiYXNlIG9iamVjdAogICBFdmVudEVtaXR0ZXIuY2FsbCh0aGlzKTsKIAogICAvL1NldCBjb25maWd1cmF0aW9uCiAgIHZhciBzZWxmID0gdGhpczsKICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKLSAgdGhpcy5ob3N0ID0gaG9zdDsKLSAgdGhpcy5wb3J0ID0gcG9ydDsKKyAgdGhpcy5ob3N0ID0gdGhpcy5vcHRpb25zLmhvc3Q7CisgIHRoaXMucG9ydCA9IHRoaXMub3B0aW9ucy5wb3J0OworICB0aGlzLnNvY2tldFBhdGggPSB0aGlzLm9wdGlvbnMuc29ja2V0UGF0aDsKICAgdGhpcy5odHRwcyA9IHRoaXMub3B0aW9ucy5odHRwcyB8fCBmYWxzZTsKICAgdGhpcy50cmFuc3BvcnQgPSB0aGlzLm9wdGlvbnMudHJhbnNwb3J0IHx8IFRCdWZmZXJlZFRyYW5zcG9ydDsKICAgdGhpcy5wcm90b2NvbCA9IHRoaXMub3B0aW9ucy5wcm90b2NvbCB8fCBUQmluYXJ5UHJvdG9jb2w7CkBAIC04Nyw3ICs4Niw4IEBACiAgIC8vUHJlcGFyZSBOb2RlLmpzIG9wdGlvbnMKICAgdGhpcy5ub2RlT3B0aW9ucyA9IHsKICAgICBob3N0OiB0aGlzLmhvc3QsCi0gICAgcG9ydDogdGhpcy5wb3J0IHx8IDgwLAorICAgIHBvcnQ6IHRoaXMucG9ydCwKKyAgICBzb2NrZXRQYXRoOiB0aGlzLnNvY2tldFBhdGgsCiAgICAgcGF0aDogdGhpcy5vcHRpb25zLnBhdGggfHwgJy8nLAogICAgIG1ldGhvZDogJ1BPU1QnLAogICAgIGhlYWRlcnM6IHRoaXMub3B0aW9ucy5oZWFkZXJzIHx8IHt9LApAQCAtMTU3LDcgKzE1Nyw3IEBACiAgICAgICBpZiAoZSBpbnN0YW5jZW9mIElucHV0QnVmZmVyVW5kZXJydW5FcnJvcikgewogICAgICAgICB0cmFuc3BvcnRfd2l0aF9kYXRhLnJvbGxiYWNrUG9zaXRpb24oKTsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRocm93IGU7CisgICAgICAgIHNlbGYuZW1pdCgnZXJyb3InLCBlKTsKICAgICAgIH0KICAgICB9CiAgIH0KQEAgLTE2OSw2ICsxNjksMTAgQEAKICAgICB2YXIgZGF0YSA9IFtdOwogICAgIHZhciBkYXRhTGVuID0gMDsKIAorICAgIGlmIChyZXNwb25zZS5zdGF0dXNDb2RlICE9PSAyMDApIHsKKyAgICAgIHRoaXMuZW1pdCgiZXJyb3IiLCBuZXcgVEhUVFBFeGNlcHRpb24ocmVzcG9uc2UpKTsKKyAgICB9CisKICAgICByZXNwb25zZS5vbignZXJyb3InLCBmdW5jdGlvbiAoZSkgewogICAgICAgc2VsZi5lbWl0KCJlcnJvciIsIGUpOwogICAgIH0pOwpAQCAtMjEwLDEwICsyMTQsMTMgQEAKICAqLwogSHR0cENvbm5lY3Rpb24ucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oZGF0YSkgewogICB2YXIgc2VsZiA9IHRoaXM7Ci0gIHNlbGYubm9kZU9wdGlvbnMuaGVhZGVyc1siQ29udGVudC1sZW5ndGgiXSA9IGRhdGEubGVuZ3RoOworICB2YXIgb3B0cyA9IHNlbGYubm9kZU9wdGlvbnM7CisgIG9wdHMuaGVhZGVyc1siQ29udGVudC1sZW5ndGgiXSA9IGRhdGEubGVuZ3RoOworICBpZiAoIW9wdHMuaGVhZGVyc1siQ29udGVudC1UeXBlIl0pCisgICAgb3B0cy5oZWFkZXJzWyJDb250ZW50LVR5cGUiXSA9ICJhcHBsaWNhdGlvbi94LXRocmlmdCI7ICAKICAgdmFyIHJlcSA9IChzZWxmLmh0dHBzKSA/Ci0gICAgICBodHRwcy5yZXF1ZXN0KHNlbGYubm9kZU9wdGlvbnMsIHNlbGYucmVzcG9uc2VDYWxsYmFjaykgOgotICAgICAgaHR0cC5yZXF1ZXN0KHNlbGYubm9kZU9wdGlvbnMsIHNlbGYucmVzcG9uc2VDYWxsYmFjayk7CisgICAgICBodHRwcy5yZXF1ZXN0KG9wdHMsIHNlbGYucmVzcG9uc2VDYWxsYmFjaykgOgorICAgICAgaHR0cC5yZXF1ZXN0KG9wdHMsIHNlbGYucmVzcG9uc2VDYWxsYmFjayk7CiAgIHJlcS5vbignZXJyb3InLCBmdW5jdGlvbihlcnIpIHsKICAgICBzZWxmLmVtaXQoImVycm9yIiwgZXJyKTsKICAgfSk7CkBAIC0yMzEsOCArMjM4LDI2IEBACiAgKiBAc2VlIHtAbGluayBDb25uZWN0T3B0aW9uc30KICAqLwogZXhwb3J0cy5jcmVhdGVIdHRwQ29ubmVjdGlvbiA9IGZ1bmN0aW9uKGhvc3QsIHBvcnQsIG9wdGlvbnMpIHsKLSAgcmV0dXJuIG5ldyBIdHRwQ29ubmVjdGlvbihob3N0LCBwb3J0LCBvcHRpb25zKTsKKyAgb3B0aW9ucy5ob3N0ID0gaG9zdDsKKyAgb3B0aW9ucy5wb3J0ID0gcG9ydCB8fCA4MDsKKyAgcmV0dXJuIG5ldyBIdHRwQ29ubmVjdGlvbihvcHRpb25zKTsKK307CisKK2V4cG9ydHMuY3JlYXRlSHR0cFVEU0Nvbm5lY3Rpb24gPSBmdW5jdGlvbihwYXRoLCBvcHRpb25zKSB7CisgIG9wdGlvbnMuc29ja2V0UGF0aCA9IHBhdGg7CisgIHJldHVybiBuZXcgSHR0cENvbm5lY3Rpb24ob3B0aW9ucyk7CiB9OwogCiBleHBvcnRzLmNyZWF0ZUh0dHBDbGllbnQgPSBjcmVhdGVDbGllbnQKIAorCitmdW5jdGlvbiBUSFRUUEV4Y2VwdGlvbihyZXNwb25zZSkgeworICB0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNhbGwodGhpcyk7CisgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpOworICB0aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7CisgIHRoaXMuc3RhdHVzQ29kZSA9IHJlc3BvbnNlLnN0YXR1c0NvZGU7CisgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTsKKyAgdGhpcy50eXBlID0gdGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUuUFJPVE9DT0xfRVJST1I7CisgIHRoaXMubWVzc2FnZSA9ICJSZWNlaXZlZCBhIHJlc3BvbnNlIHdpdGggYSBiYWQgSFRUUCBzdGF0dXMgY29kZTogIiArIHJlc3BvbnNlLnN0YXR1c0NvZGU7Cit9Cit1dGlsLmluaGVyaXRzKFRIVFRQRXhjZXB0aW9uLCB0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9pbmRleC5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9pbmRleC5qcwppbmRleCA2MWU1Y2JkLi5iMDk5NTNkIDEwMDY0NAotLS0gYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvaW5kZXguanMKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2luZGV4LmpzCkBAIC0xOCwxMCArMTgsMTYgQEAKICAqLwogZXhwb3J0cy5UaHJpZnQgPSByZXF1aXJlKCcuL3RocmlmdCcpOwogCit2YXIgbG9nID0gcmVxdWlyZSgnLi9sb2cnKTsKK2V4cG9ydHMuc2V0TG9nRnVuYyA9IGxvZy5zZXRMb2dGdW5jOworZXhwb3J0cy5zZXRMb2dMZXZlbCA9IGxvZy5zZXRMb2dMZXZlbDsKK2V4cG9ydHMuZ2V0TG9nTGV2ZWwgPSBsb2cuZ2V0TG9nTGV2ZWw7CisKIHZhciBjb25uZWN0aW9uID0gcmVxdWlyZSgnLi9jb25uZWN0aW9uJyk7CiBleHBvcnRzLkNvbm5lY3Rpb24gPSBjb25uZWN0aW9uLkNvbm5lY3Rpb247CiBleHBvcnRzLmNyZWF0ZUNsaWVudCA9IGNvbm5lY3Rpb24uY3JlYXRlQ2xpZW50OwogZXhwb3J0cy5jcmVhdGVDb25uZWN0aW9uID0gY29ubmVjdGlvbi5jcmVhdGVDb25uZWN0aW9uOworZXhwb3J0cy5jcmVhdGVVRFNDb25uZWN0aW9uID0gY29ubmVjdGlvbi5jcmVhdGVVRFNDb25uZWN0aW9uOwogZXhwb3J0cy5jcmVhdGVTU0xDb25uZWN0aW9uID0gY29ubmVjdGlvbi5jcmVhdGVTU0xDb25uZWN0aW9uOwogZXhwb3J0cy5jcmVhdGVTdGRJT0NsaWVudCA9IGNvbm5lY3Rpb24uY3JlYXRlU3RkSU9DbGllbnQ7CiBleHBvcnRzLmNyZWF0ZVN0ZElPQ29ubmVjdGlvbiA9IGNvbm5lY3Rpb24uY3JlYXRlU3RkSU9Db25uZWN0aW9uOwpAQCAtMjksNiArMzUsNyBAQAogdmFyIGh0dHBDb25uZWN0aW9uID0gcmVxdWlyZSgnLi9odHRwX2Nvbm5lY3Rpb24nKTsKIGV4cG9ydHMuSHR0cENvbm5lY3Rpb24gPSBodHRwQ29ubmVjdGlvbi5IdHRwQ29ubmVjdGlvbjsKIGV4cG9ydHMuY3JlYXRlSHR0cENvbm5lY3Rpb24gPSBodHRwQ29ubmVjdGlvbi5jcmVhdGVIdHRwQ29ubmVjdGlvbjsKK2V4cG9ydHMuY3JlYXRlSHR0cFVEU0Nvbm5lY3Rpb24gPSBodHRwQ29ubmVjdGlvbi5jcmVhdGVIdHRwVURTQ29ubmVjdGlvbjsKIGV4cG9ydHMuY3JlYXRlSHR0cENsaWVudCA9IGh0dHBDb25uZWN0aW9uLmNyZWF0ZUh0dHBDbGllbnQ7CiAKIHZhciB3c0Nvbm5lY3Rpb24gPSByZXF1aXJlKCcuL3dzX2Nvbm5lY3Rpb24nKTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9pbnQ2NF91dGlsLmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2ludDY0X3V0aWwuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThkNzA3ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9pbnQ2NF91dGlsLmpzCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordmFyIEludDY0ID0gcmVxdWlyZSgnbm9kZS1pbnQ2NCcpOworCit2YXIgSW50NjRVdGlsID0gbW9kdWxlLmV4cG9ydHMgPSB7fTsKKwordmFyIFBPVzJfMjQgPSBNYXRoLnBvdygyLCAyNCk7Cit2YXIgUE9XMl8zMSA9IE1hdGgucG93KDIsIDMxKTsKK3ZhciBQT1cyXzMyID0gTWF0aC5wb3coMiwgMzIpOwordmFyIFBPVzEwXzExID0gTWF0aC5wb3coMTAsIDExKTsKKworSW50NjRVdGlsLnRvRGVjaW1hbFN0cmluZyA9IGZ1bmN0aW9uKGk2NCkgeworICB2YXIgYiA9IGk2NC5idWZmZXI7CisgIHZhciBvID0gaTY0Lm9mZnNldDsKKyAgaWYgKCghYltvXSAmJiAhKGJbbyArIDFdICYgMHhlMCkpIHx8CisgICAgICAoIX5iW29dICYmICF+KGJbbyArIDFdICYgMHhlMCkpKSB7CisgICAgLy8gVGhlIG1hZ25pdHVkZSBpcyBzbWFsbCBlbm91Z2guCisgICAgcmV0dXJuIGk2NC50b1N0cmluZygpOworICB9IGVsc2UgeworICAgIHZhciBuZWdhdGl2ZSA9IGJbb10gJiAweDgwOworICAgIGlmIChuZWdhdGl2ZSkgeworICAgICAgLy8gMidzIGNvbXBsZW1lbnQKKyAgICAgIHZhciBpbmNyZW1lbnRlZCA9IGZhbHNlOworICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBCdWZmZXIoOCk7CisgICAgICBmb3IgKHZhciBpID0gNzsgaSA+PSAwOyAtLWkpIHsKKyAgICAgICAgYnVmZmVyW2ldID0gKH5iW28gKyBpXSArIChpbmNyZW1lbnRlZCA/IDAgOiAxKSkgJiAweGZmOworICAgICAgICBpbmNyZW1lbnRlZCB8PSBiW28gKyBpXTsKKyAgICAgIH0KKyAgICAgIGIgPSBidWZmZXI7CisgICAgfQorICAgIHZhciBoaWdoMiA9IGJbbyArIDFdICsgKGJbb10gPDwgOCk7CisgICAgLy8gTGVzc2VyIDExIGRpZ2l0cyB3aXRoIGV4Y2VlZGluZyB2YWx1ZXMgYnV0IGlzIHVuZGVyIDUzIGJpdHMgY2FwYWNpdHkuCisgICAgdmFyIGxvdyA9IGJbbyArIDddICsgKGJbbyArIDZdIDw8IDgpICsgKGJbbyArIDVdIDw8IDE2KQorICAgICAgICArIGJbbyArIDRdICogUE9XMl8yNCAgLy8gQml0IHNoaWZ0IHJlbmRlcnMgMzJ0aCBiaXQgYXMgc2lnbiwgc28gdXNlIG11bHRpcGxpY2F0aW9uCisgICAgICAgICsgKGJbbyArIDNdICsgKGJbbyArIDJdIDw8IDgpKSAqIFBPVzJfMzIgKyBoaWdoMiAqIDc0OTc2NzEwNjU2OyAgLy8gVGhlIGxpdGVyYWwgaXMgMl40OCAlIDEwXjExCisgICAgLy8gMTJ0aCBkaWdpdCBhbmQgZ3JlYXRlci4KKyAgICB2YXIgaGlnaCA9IE1hdGguZmxvb3IobG93IC8gUE9XMTBfMTEpICsgaGlnaDIgKiAyODE0OyAgLy8gVGhlIGxpdGVyYWwgaXMgMl40OCAvIDEwXjExCisgICAgLy8gTWFrZSBpdCBleGFjdGx5IDExIHdpdGggbGVhZGluZyB6ZXJvcy4KKyAgICBsb3cgPSAoJzAwMDAwMDAwMDAwJyArIFN0cmluZyhsb3cgJSBQT1cxMF8xMSkpLnNsaWNlKC0xMSk7CisgICAgcmV0dXJuIChuZWdhdGl2ZSA/ICctJyA6ICcnKSArIFN0cmluZyhoaWdoKSArIGxvdzsKKyAgfQorfTsKKworSW50NjRVdGlsLmZyb21EZWNpbWFsU3RyaW5nID0gZnVuY3Rpb24odGV4dCkgeworICB2YXIgbmVnYXRpdmUgPSB0ZXh0LmNoYXJBdCgwKSA9PT0gJy0nOworICBpZiAodGV4dC5sZW5ndGggPCAobmVnYXRpdmUgPyAxNyA6IDE2KSkgeworICAgIC8vIFRoZSBtYWduaXR1ZGUgaXMgc21hbGxlciB0aGFuIDJeNTMuCisgICAgcmV0dXJuIG5ldyBJbnQ2NCgrdGV4dCk7CisgIH0gZWxzZSBpZiAodGV4dC5sZW5ndGggPiAobmVnYXRpdmUgPyAyMCA6IDE5KSkgeworICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUb28gbWFueSBkaWdpdHMgZm9yIEludDY0OiAnICsgdGV4dCk7CisgIH0gZWxzZSB7CisgICAgLy8gTW9zdCBzaWduaWZpY2FudCAodXAgdG8gNSkgZGlnaXRzCisgICAgdmFyIGhpZ2g1ID0gK3RleHQuc2xpY2UobmVnYXRpdmUgPyAxIDogMCwgLTE1KTsKKyAgICB2YXIgbG93ID0gK3RleHQuc2xpY2UoLTE1KSArIGhpZ2g1ICogMjc2NDQ3MjMyMDsgIC8vIFRoZSBsaXRlcmFsIGlzIDEwXjE1ICUgMl4zMgorICAgIHZhciBoaWdoID0gTWF0aC5mbG9vcihsb3cgLyBQT1cyXzMyKSArIGhpZ2g1ICogMjMyODMwOyAgLy8gVGhlIGxpdGVyYWwgaXMgMTBeMTUgLyAyXiYzMgorICAgIGxvdyA9IGxvdyAlIFBPVzJfMzI7CisgICAgaWYgKGhpZ2ggPj0gUE9XMl8zMSAmJgorICAgICAgICAhKG5lZ2F0aXZlICYmIGhpZ2ggPT0gUE9XMl8zMSAmJiBsb3cgPT0gMCkgIC8vIEFsbG93IG1pbmltdW0gSW50NjQKKyAgICAgICApIHsKKyAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgbWFnbml0dWRlIGlzIHRvbyBsYXJnZSBmb3IgSW50NjQuJyk7CisgICAgfQorICAgIGlmIChuZWdhdGl2ZSkgeworICAgICAgLy8gMidzIGNvbXBsZW1lbnQKKyAgICAgIGhpZ2ggPSB+aGlnaDsKKyAgICAgIGlmIChsb3cgPT09IDApIHsKKyAgICAgICAgaGlnaCA9IChoaWdoICsgMSkgJiAweGZmZmZmZmZmOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbG93ID0gfmxvdyArIDE7CisgICAgICB9CisgICAgICBoaWdoID0gMHg4MDAwMDAwMCB8IGhpZ2g7CisgICAgfQorICAgIHJldHVybiBuZXcgSW50NjQoaGlnaCwgbG93KTsKKyAgfQorfTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9qc29uX3BhcnNlLmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2pzb25fcGFyc2UuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNiMGJmMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9qc29uX3BhcnNlLmpzCkBAIC0wLDAgKzEsMjk5IEBACisvKgorICogSW1wb3J0ZWQgZnJvbSBEb3VnbGFzIENyb2NrZm9yZCdzIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiB3aXRoIG1pbmltdW0gbW9kaWZpY2F0aW9uCisgKiB0byBoYW5kbGUgSW50NjQuCisgKgorICogaHR0cHM6Ly9naXRodWIuY29tL2RvdWdsYXNjcm9ja2ZvcmQvSlNPTi1qcy9ibG9iL2M5ODk0OGFlMTk0NGEyOGUyZThlYmMzNzE3ODk0ZTU4MGFlYWFhMDUvanNvbl9wYXJzZS5qcworICoKKyAqIE9yaWdpbmFsIGxpY2Vuc2UgaGVhZGVyOgorICoKKyAqIGpzb25fcGFyc2UuanMKKyAqIDIwMTUtMDUtMDIKKyAqIFB1YmxpYyBEb21haW4uCisgKiBOTyBXQVJSQU5UWSBFWFBSRVNTRUQgT1IgSU1QTElFRC4gVVNFIEFUIFlPVVIgT1dOIFJJU0suCisgKi8KKworCisvKmpzbGludCBmb3IgKi8KKworLypwcm9wZXJ0eQorICAgIGF0LCBiLCBjYWxsLCBjaGFyQXQsIGYsIGZyb21DaGFyQ29kZSwgaGFzT3duUHJvcGVydHksIG1lc3NhZ2UsIG4sIG5hbWUsCisgICAgcHJvdG90eXBlLCBwdXNoLCByLCB0LCB0ZXh0CisqLworCit2YXIgSW50NjQgPSByZXF1aXJlKCdub2RlLWludDY0Jyk7Cit2YXIgSW50NjRVdGlsID0gcmVxdWlyZSgnLi9pbnQ2NF91dGlsJyk7CisKK3ZhciBqc29uX3BhcnNlID0gbW9kdWxlLmV4cG9ydHMgPSAoZnVuY3Rpb24gKCkgeworICAgICJ1c2Ugc3RyaWN0IjsKKworLy8gVGhpcyBpcyBhIGZ1bmN0aW9uIHRoYXQgY2FuIHBhcnNlIGEgSlNPTiB0ZXh0LCBwcm9kdWNpbmcgYSBKYXZhU2NyaXB0CisvLyBkYXRhIHN0cnVjdHVyZS4gSXQgaXMgYSBzaW1wbGUsIHJlY3Vyc2l2ZSBkZXNjZW50IHBhcnNlci4gSXQgZG9lcyBub3QgdXNlCisvLyBldmFsIG9yIHJlZ3VsYXIgZXhwcmVzc2lvbnMsIHNvIGl0IGNhbiBiZSB1c2VkIGFzIGEgbW9kZWwgZm9yIGltcGxlbWVudGluZworLy8gYSBKU09OIHBhcnNlciBpbiBvdGhlciBsYW5ndWFnZXMuCisKKy8vIFdlIGFyZSBkZWZpbmluZyB0aGUgZnVuY3Rpb24gaW5zaWRlIG9mIGFub3RoZXIgZnVuY3Rpb24gdG8gYXZvaWQgY3JlYXRpbmcKKy8vIGdsb2JhbCB2YXJpYWJsZXMuCisKKyAgICB2YXIgYXQsICAgICAvLyBUaGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgY2hhcmFjdGVyCisgICAgICAgIGNoLCAgICAgLy8gVGhlIGN1cnJlbnQgY2hhcmFjdGVyCisgICAgICAgIGVzY2FwZWUgPSB7CisgICAgICAgICAgICAnIic6ICciJywKKyAgICAgICAgICAgICdcXCc6ICdcXCcsCisgICAgICAgICAgICAnLyc6ICcvJywKKyAgICAgICAgICAgIGI6ICdcYicsCisgICAgICAgICAgICBmOiAnXGYnLAorICAgICAgICAgICAgbjogJ1xuJywKKyAgICAgICAgICAgIHI6ICdccicsCisgICAgICAgICAgICB0OiAnXHQnCisgICAgICAgIH0sCisgICAgICAgIHRleHQsCisKKyAgICAgICAgZXJyb3IgPSBmdW5jdGlvbiAobSkgeworCisvLyBDYWxsIGVycm9yIHdoZW4gc29tZXRoaW5nIGlzIHdyb25nLgorCisgICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IobSk7CisgICAgICAgIH0sCisKKyAgICAgICAgbmV4dCA9IGZ1bmN0aW9uIChjKSB7CisKKy8vIElmIGEgYyBwYXJhbWV0ZXIgaXMgcHJvdmlkZWQsIHZlcmlmeSB0aGF0IGl0IG1hdGNoZXMgdGhlIGN1cnJlbnQgY2hhcmFjdGVyLgorCisgICAgICAgICAgICBpZiAoYyAmJiBjICE9PSBjaCkgeworICAgICAgICAgICAgICAgIGVycm9yKCJFeHBlY3RlZCAnIiArIGMgKyAiJyBpbnN0ZWFkIG9mICciICsgY2ggKyAiJyIpOworICAgICAgICAgICAgfQorCisvLyBHZXQgdGhlIG5leHQgY2hhcmFjdGVyLiBXaGVuIHRoZXJlIGFyZSBubyBtb3JlIGNoYXJhY3RlcnMsCisvLyByZXR1cm4gdGhlIGVtcHR5IHN0cmluZy4KKworICAgICAgICAgICAgY2ggPSB0ZXh0LmNoYXJBdChhdCk7CisgICAgICAgICAgICBhdCArPSAxOworICAgICAgICAgICAgcmV0dXJuIGNoOworICAgICAgICB9LAorCisgICAgICAgIG51bWJlciA9IGZ1bmN0aW9uICgpIHsKKworLy8gUGFyc2UgYSBudW1iZXIgdmFsdWUuCisKKyAgICAgICAgICAgIHZhciBudW1iZXIsCisgICAgICAgICAgICAgICAgc3RyaW5nID0gJyc7CisKKyAgICAgICAgICAgIGlmIChjaCA9PT0gJy0nKSB7CisgICAgICAgICAgICAgICAgc3RyaW5nID0gJy0nOworICAgICAgICAgICAgICAgIG5leHQoJy0nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB7CisgICAgICAgICAgICAgICAgc3RyaW5nICs9IGNoOworICAgICAgICAgICAgICAgIG5leHQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjaCA9PT0gJy4nKSB7CisgICAgICAgICAgICAgICAgc3RyaW5nICs9ICcuJzsKKyAgICAgICAgICAgICAgICB3aGlsZSAobmV4dCgpICYmIGNoID49ICcwJyAmJiBjaCA8PSAnOScpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nICs9IGNoOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjaCA9PT0gJ2UnIHx8IGNoID09PSAnRScpIHsKKyAgICAgICAgICAgICAgICBzdHJpbmcgKz0gY2g7CisgICAgICAgICAgICAgICAgbmV4dCgpOworICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJy0nIHx8IGNoID09PSAnKycpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nICs9IGNoOworICAgICAgICAgICAgICAgICAgICBuZXh0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdoaWxlIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZyArPSBjaDsKKyAgICAgICAgICAgICAgICAgICAgbmV4dCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG51bWJlciA9ICtzdHJpbmc7CisgICAgICAgICAgICBpZiAoIWlzRmluaXRlKG51bWJlcikpIHsKKyAgICAgICAgICAgICAgICBlcnJvcigiQmFkIG51bWJlciIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgPj0gSW50NjQuTUFYX0lOVCB8fCBudW1iZXIgPD0gSW50NjQuTUlOX0lOVCkgeworICAgICAgICAgICAgICAgIC8vIFJldHVybiByYXcgc3RyaW5nIGZvciBmdXJ0aGVyIHByb2Nlc3MgaW4gVEpTT05Qcm90b2NvbAorICAgICAgICAgICAgICAgIHJldHVybiBzdHJpbmc7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisKKyAgICAgICAgc3RyaW5nID0gZnVuY3Rpb24gKCkgeworCisvLyBQYXJzZSBhIHN0cmluZyB2YWx1ZS4KKworICAgICAgICAgICAgdmFyIGhleCwKKyAgICAgICAgICAgICAgICBpLAorICAgICAgICAgICAgICAgIHN0cmluZyA9ICcnLAorICAgICAgICAgICAgICAgIHVmZmZmOworCisvLyBXaGVuIHBhcnNpbmcgZm9yIHN0cmluZyB2YWx1ZXMsIHdlIG11c3QgbG9vayBmb3IgIiBhbmQgXCBjaGFyYWN0ZXJzLgorCisgICAgICAgICAgICBpZiAoY2ggPT09ICciJykgeworICAgICAgICAgICAgICAgIHdoaWxlIChuZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09PSAnIicpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHJpbmc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09PSAnXFwnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICd1JykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVmZmZmID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSArPSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhleCA9IHBhcnNlSW50KG5leHQoKSwgMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzRmluaXRlKGhleCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVmZmZmID0gdWZmZmYgKiAxNiArIGhleDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodWZmZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZXNjYXBlZVtjaF0gPT09ICdzdHJpbmcnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nICs9IGVzY2FwZWVbY2hdOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyArPSBjaDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVycm9yKCJCYWQgc3RyaW5nIik7CisgICAgICAgIH0sCisKKyAgICAgICAgd2hpdGUgPSBmdW5jdGlvbiAoKSB7CisKKy8vIFNraXAgd2hpdGVzcGFjZS4KKworICAgICAgICAgICAgd2hpbGUgKGNoICYmIGNoIDw9ICcgJykgeworICAgICAgICAgICAgICAgIG5leHQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKworICAgICAgICB3b3JkID0gZnVuY3Rpb24gKCkgeworCisvLyB0cnVlLCBmYWxzZSwgb3IgbnVsbC4KKworICAgICAgICAgICAgc3dpdGNoIChjaCkgeworICAgICAgICAgICAgY2FzZSAndCc6CisgICAgICAgICAgICAgICAgbmV4dCgndCcpOworICAgICAgICAgICAgICAgIG5leHQoJ3InKTsKKyAgICAgICAgICAgICAgICBuZXh0KCd1Jyk7CisgICAgICAgICAgICAgICAgbmV4dCgnZScpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSAnZic6CisgICAgICAgICAgICAgICAgbmV4dCgnZicpOworICAgICAgICAgICAgICAgIG5leHQoJ2EnKTsKKyAgICAgICAgICAgICAgICBuZXh0KCdsJyk7CisgICAgICAgICAgICAgICAgbmV4dCgncycpOworICAgICAgICAgICAgICAgIG5leHQoJ2UnKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBjYXNlICduJzoKKyAgICAgICAgICAgICAgICBuZXh0KCduJyk7CisgICAgICAgICAgICAgICAgbmV4dCgndScpOworICAgICAgICAgICAgICAgIG5leHQoJ2wnKTsKKyAgICAgICAgICAgICAgICBuZXh0KCdsJyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlcnJvcigiVW5leHBlY3RlZCAnIiArIGNoICsgIiciKTsKKyAgICAgICAgfSwKKworICAgICAgICB2YWx1ZSwgIC8vIFBsYWNlIGhvbGRlciBmb3IgdGhlIHZhbHVlIGZ1bmN0aW9uLgorCisgICAgICAgIGFycmF5ID0gZnVuY3Rpb24gKCkgeworCisvLyBQYXJzZSBhbiBhcnJheSB2YWx1ZS4KKworICAgICAgICAgICAgdmFyIGFycmF5ID0gW107CisKKyAgICAgICAgICAgIGlmIChjaCA9PT0gJ1snKSB7CisgICAgICAgICAgICAgICAgbmV4dCgnWycpOworICAgICAgICAgICAgICAgIHdoaXRlKCk7CisgICAgICAgICAgICAgICAgaWYgKGNoID09PSAnXScpIHsKKyAgICAgICAgICAgICAgICAgICAgbmV4dCgnXScpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXk7ICAgLy8gZW1wdHkgYXJyYXkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd2hpbGUgKGNoKSB7CisgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2godmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgIHdoaXRlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ10nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0KCddJyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbmV4dCgnLCcpOworICAgICAgICAgICAgICAgICAgICB3aGl0ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVycm9yKCJCYWQgYXJyYXkiKTsKKyAgICAgICAgfSwKKworICAgICAgICBvYmplY3QgPSBmdW5jdGlvbiAoKSB7CisKKy8vIFBhcnNlIGFuIG9iamVjdCB2YWx1ZS4KKworICAgICAgICAgICAgdmFyIGtleSwKKyAgICAgICAgICAgICAgICBvYmplY3QgPSB7fTsKKworICAgICAgICAgICAgaWYgKGNoID09PSAneycpIHsKKyAgICAgICAgICAgICAgICBuZXh0KCd7Jyk7CisgICAgICAgICAgICAgICAgd2hpdGUoKTsKKyAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICd9JykgeworICAgICAgICAgICAgICAgICAgICBuZXh0KCd9Jyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3Q7ICAgLy8gZW1wdHkgb2JqZWN0CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdoaWxlIChjaCkgeworICAgICAgICAgICAgICAgICAgICBrZXkgPSBzdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgd2hpdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgbmV4dCgnOicpOworICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcignRHVwbGljYXRlIGtleSAiJyArIGtleSArICciJyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb2JqZWN0W2tleV0gPSB2YWx1ZSgpOworICAgICAgICAgICAgICAgICAgICB3aGl0ZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICd9JykgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCgnfScpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBuZXh0KCcsJyk7CisgICAgICAgICAgICAgICAgICAgIHdoaXRlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZXJyb3IoIkJhZCBvYmplY3QiKTsKKyAgICAgICAgfTsKKworICAgIHZhbHVlID0gZnVuY3Rpb24gKCkgeworCisvLyBQYXJzZSBhIEpTT04gdmFsdWUuIEl0IGNvdWxkIGJlIGFuIG9iamVjdCwgYW4gYXJyYXksIGEgc3RyaW5nLCBhIG51bWJlciwKKy8vIG9yIGEgd29yZC4KKworICAgICAgICB3aGl0ZSgpOworICAgICAgICBzd2l0Y2ggKGNoKSB7CisgICAgICAgIGNhc2UgJ3snOgorICAgICAgICAgICAgcmV0dXJuIG9iamVjdCgpOworICAgICAgICBjYXNlICdbJzoKKyAgICAgICAgICAgIHJldHVybiBhcnJheSgpOworICAgICAgICBjYXNlICciJzoKKyAgICAgICAgICAgIHJldHVybiBzdHJpbmcoKTsKKyAgICAgICAgY2FzZSAnLSc6CisgICAgICAgICAgICByZXR1cm4gbnVtYmVyKCk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gY2ggPj0gJzAnICYmIGNoIDw9ICc5JworICAgICAgICAgICAgICAgID8gbnVtYmVyKCkKKyAgICAgICAgICAgICAgICA6IHdvcmQoKTsKKyAgICAgICAgfQorICAgIH07CisKKy8vIFJldHVybiB0aGUganNvbl9wYXJzZSBmdW5jdGlvbi4gSXQgd2lsbCBoYXZlIGFjY2VzcyB0byBhbGwgb2YgdGhlIGFib3ZlCisvLyBmdW5jdGlvbnMgYW5kIHZhcmlhYmxlcy4KKworICAgIHJldHVybiBmdW5jdGlvbiAoc291cmNlKSB7CisgICAgICAgIHZhciByZXN1bHQ7CisKKyAgICAgICAgdGV4dCA9IHNvdXJjZTsKKyAgICAgICAgYXQgPSAwOworICAgICAgICBjaCA9ICcgJzsKKyAgICAgICAgcmVzdWx0ID0gdmFsdWUoKTsKKyAgICAgICAgd2hpdGUoKTsKKyAgICAgICAgaWYgKGNoKSB7CisgICAgICAgICAgICBlcnJvcigiU3ludGF4IGVycm9yIik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH07Cit9KCkpOwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L2pzb25fcHJvdG9jb2wuanMgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvanNvbl9wcm90b2NvbC5qcwppbmRleCBlOTg2NTBjLi43MjdhM2IyIDEwMDY0NAotLS0gYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvanNvbl9wcm90b2NvbC5qcworKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvanNvbl9wcm90b2NvbC5qcwpAQCAtMTcsMTMgKzE3LDE0IEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi12YXIgbG9nID0gcmVxdWlyZSgnLi9sb2cnKTsKIHZhciBJbnQ2NCA9IHJlcXVpcmUoJ25vZGUtaW50NjQnKTsKLXZhciBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IgPSByZXF1aXJlKCcuL3RyYW5zcG9ydCcpLklucHV0QnVmZmVyVW5kZXJydW5FcnJvcjsKIHZhciBUaHJpZnQgPSByZXF1aXJlKCcuL3RocmlmdCcpOwogdmFyIFR5cGUgPSBUaHJpZnQuVHlwZTsKIHZhciB1dGlsID0gcmVxdWlyZSgidXRpbCIpOwogCit2YXIgSW50NjRVdGlsID0gcmVxdWlyZSgnLi9pbnQ2NF91dGlsJyk7Cit2YXIganNvbl9wYXJzZSA9IHJlcXVpcmUoJy4vanNvbl9wYXJzZScpOworCiB2YXIgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yID0gcmVxdWlyZSgnLi9pbnB1dF9idWZmZXJfdW5kZXJydW5fZXJyb3InKTsKIAogbW9kdWxlLmV4cG9ydHMgPSBUSlNPTlByb3RvY29sOwpAQCAtODksOSArOTAsMTYgQEAKIFRKU09OUHJvdG9jb2wuVmVyc2lvbiA9IDE7CiAKIFRKU09OUHJvdG9jb2wucHJvdG90eXBlLmZsdXNoID0gZnVuY3Rpb24oKSB7CisgIHRoaXMud3JpdGVUb1RyYW5zcG9ydElmU3RhY2tJc0ZsdXNoYWJsZSgpOwogICByZXR1cm4gdGhpcy50cmFucy5mbHVzaCgpOwogfTsKIAorVEpTT05Qcm90b2NvbC5wcm90b3R5cGUud3JpdGVUb1RyYW5zcG9ydElmU3RhY2tJc0ZsdXNoYWJsZSA9IGZ1bmN0aW9uKCkgeworICBpZiAodGhpcy50c3RhY2subGVuZ3RoID09PSAxKSB7CisgICAgdGhpcy50cmFucy53cml0ZSh0aGlzLnRzdGFjay5wb3AoKSk7CisgIH0KK307CisKIC8qKgogICogU2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgVGhyaWZ0IFJQQyBtZXNzYWdlLgogICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgc2VydmljZSBtZXRob2QgdG8gY2FsbC4KQEAgLTk5LDkgKzEwNyw2IEBACiAgKiBAcGFyYW0ge251bWJlcn0gc2VxaWQgLSBUaGUgc2VxdWVuY2UgbnVtYmVyIG9mIHRoaXMgY2FsbCAoYWx3YXlzIDAgaW4gQXBhY2hlIFRocmlmdCkuCiAgKi8KIFRKU09OUHJvdG9jb2wucHJvdG90eXBlLndyaXRlTWVzc2FnZUJlZ2luID0gZnVuY3Rpb24obmFtZSwgbWVzc2FnZVR5cGUsIHNlcWlkKSB7Ci0gIHRoaXMudHN0YWNrID0gW107Ci0gIHRoaXMudHBvcyA9IFtdOwotCiAgIHRoaXMudHN0YWNrLnB1c2goW1RKU09OUHJvdG9jb2wuVmVyc2lvbiwgJyInICsgbmFtZSArICciJywgbWVzc2FnZVR5cGUsIHNlcWlkXSk7CiB9OwogCkBAIC0xMTYsNiArMTIxLDcgQEAKIAogICB0aGlzLndidWYgPSAnWycgKyB0aGlzLndvYmouam9pbignLCcpICsgJ10nOwogCisgIC8vIHdlIGFzc3VtZSB0aGVyZSBpcyBub3RoaW5nIG1vcmUgdG8gY29tZSBzbyB3ZSB3cml0ZQogICB0aGlzLnRyYW5zLndyaXRlKHRoaXMud2J1Zik7CiB9OwogCkBAIC0xNDgsNiArMTU0LDggQEAKIAogICBzdHIgKz0gJ30nOwogICB0aGlzLnRzdGFja1twXSA9IHN0cjsKKworICB0aGlzLndyaXRlVG9UcmFuc3BvcnRJZlN0YWNrSXNGbHVzaGFibGUoKTsKIH07CiAKIC8qKgpAQCAtMTc4LDYgKzE4Niw4IEBACiAgICAgICBmaWVsZEluZm8uZmllbGRUeXBlICsgJzonICsgdmFsdWUgKyAnfSc7CiAgIH0KICAgdGhpcy50cG9zLnBvcCgpOworCisgIHRoaXMud3JpdGVUb1RyYW5zcG9ydElmU3RhY2tJc0ZsdXNoYWJsZSgpOwogfTsKIAogLyoqCkBAIC0yMzQsNiArMjQ0LDggQEAKIAogICB0aGlzLnRzdGFja1twXS5wdXNoKG1hcCk7CiAgIHRoaXMudHN0YWNrW3BdID0gJ1snICsgdGhpcy50c3RhY2tbcF0uam9pbignLCcpICsgJ10nOworCisgIHRoaXMud3JpdGVUb1RyYW5zcG9ydElmU3RhY2tJc0ZsdXNoYWJsZSgpOwogfTsKIAogLyoqCkBAIC0yNTksNiArMjcxLDggQEAKICAgfQogCiAgIHRoaXMudHN0YWNrW3BdID0gJ1snICsgdGhpcy50c3RhY2tbcF0uam9pbignLCcpICsgJ10nOworCisgIHRoaXMud3JpdGVUb1RyYW5zcG9ydElmU3RhY2tJc0ZsdXNoYWJsZSgpOwogfTsKIAogLyoqCkBAIC0yODQsNiArMjk4LDggQEAKICAgfQogCiAgIHRoaXMudHN0YWNrW3BdID0gJ1snICsgdGhpcy50c3RhY2tbcF0uam9pbignLCcpICsgJ10nOworCisgIHRoaXMud3JpdGVUb1RyYW5zcG9ydElmU3RhY2tJc0ZsdXNoYWJsZSgpOwogfTsKIAogLyoqIFNlcmlhbGl6ZXMgYSBib29sZWFuICovCkBAIC0zMDgsNyArMzI0LDExIEBACiAKIC8qKiBTZXJpYWxpemVzIGEgbnVtYmVyICovCiBUSlNPTlByb3RvY29sLnByb3RvdHlwZS53cml0ZUk2NCA9IGZ1bmN0aW9uKGk2NCkgewotICB0aGlzLnRzdGFjay5wdXNoKGk2NCk7CisgIGlmIChpNjQgaW5zdGFuY2VvZiBJbnQ2NCkgeworICAgIHRoaXMudHN0YWNrLnB1c2goSW50NjRVdGlsLnRvRGVjaW1hbFN0cmluZyhpNjQpKTsKKyAgfSBlbHNlIHsKKyAgICB0aGlzLnRzdGFjay5wdXNoKGk2NCk7CisgIH0KIH07CiAKIC8qKiBTZXJpYWxpemVzIGEgbnVtYmVyICovCkBAIC0zMTcsMTEgKzMzNywxOSBAQAogfTsKIAogLyoqIFNlcmlhbGl6ZXMgYSBzdHJpbmcgKi8KLVRKU09OUHJvdG9jb2wucHJvdG90eXBlLndyaXRlU3RyaW5nID0gZnVuY3Rpb24oc3RyKSB7CitUSlNPTlByb3RvY29sLnByb3RvdHlwZS53cml0ZVN0cmluZyA9IGZ1bmN0aW9uKGFyZykgewogICAvLyBXZSBkbyBub3QgZW5jb2RlIHVyaSBjb21wb25lbnRzIGZvciB3aXJlIHRyYW5zZmVyOgotICBpZiAoc3RyID09PSBudWxsKSB7CisgIGlmIChhcmcgPT09IG51bGwpIHsKICAgICAgIHRoaXMudHN0YWNrLnB1c2gobnVsbCk7CiAgIH0gZWxzZSB7CisgICAgICBpZiAodHlwZW9mIGFyZyA9PT0gJ3N0cmluZycpIHsKKyAgICAgICAgdmFyIHN0ciA9IGFyZzsKKyAgICAgIH0gZWxzZSBpZiAoYXJnIGluc3RhbmNlb2YgQnVmZmVyKSB7CisgICAgICAgIHZhciBzdHIgPSBhcmcudG9TdHJpbmcoJ3V0ZjgnKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcignd3JpdGVTdHJpbmcgY2FsbGVkIHdpdGhvdXQgYSBzdHJpbmcvQnVmZmVyIGFyZ3VtZW50OiAnICsgYXJnKTsKKyAgICAgIH0KKwogICAgICAgLy8gY29uY2F0IG1heSBiZSBzbG93ZXIgdGhhbiBidWlsZGluZyBhIGJ5dGUgYnVmZmVyCiAgICAgICB2YXIgZXNjYXBlZFN0cmluZyA9ICcnOwogICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHsKQEAgLTM1OCw3ICszODYsMTUgQEAKIAogLyoqIFNlcmlhbGl6ZXMgYSBzdHJpbmcgKi8KIFRKU09OUHJvdG9jb2wucHJvdG90eXBlLndyaXRlQmluYXJ5ID0gZnVuY3Rpb24oYXJnKSB7Ci0gIHRoaXMud3JpdGVTdHJpbmcoYXJnKTsKKyAgaWYgKHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnKSB7CisgICAgdmFyIGJ1ZiA9IG5ldyBCdWZmZXIoYXJnLCAnYmluYXJ5Jyk7CisgIH0gZWxzZSBpZiAoYXJnIGluc3RhbmNlb2YgQnVmZmVyIHx8CisgICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGFyZykgPT0gJ1tvYmplY3QgVWludDhBcnJheV0nKSAgeworICAgIHZhciBidWYgPSBhcmc7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgbmV3IEVycm9yKCd3cml0ZUJpbmFyeSBjYWxsZWQgd2l0aG91dCBhIHN0cmluZy9CdWZmZXIgYXJndW1lbnQ6ICcgKyBhcmcpOworICB9CisgIHRoaXMudHN0YWNrLnB1c2goJyInICsgYnVmLnRvU3RyaW5nKCdiYXNlNjQnKSArICciJyk7CiB9OwogCiAvKioKQEAgLTQxOCwxNyArNDU0LDE4IEBACiAgIH0KIAogICBpZiAob3BlbkJyYWNrZXRDb3VudCAhPT0gMCkgewotICAgIHRocm93IG5ldyBFcnJvcigiTWFsZm9ybWVkIEpTT04gaW5wdXQsIG1pc21hdGNoZWQgYmFja2V0cyIpOworICAgIC8vIE1pc3NpbmcgY2xvc2luZyBicmFja2V0LiBDYW4gYmUgYnVmZmVyIHVuZGVycnVuLgorICAgIHRocm93IG5ldyBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IoKTsKICAgfQogCiAgIC8vUmVjb25zdGl0dXRlIHRoZSBKU09OIG9iamVjdCBhbmQgY29udW1lIHRoZSBuZWNlc3NhcnkgYnl0ZXMKLSAgdGhpcy5yb2JqID0gSlNPTi5wYXJzZSh0cmFuc0J1Zi5idWYuc2xpY2UodHJhbnNCdWYucmVhZEluZGV4LCBjdXJzb3IrMSkpOworICB0aGlzLnJvYmogPSBqc29uX3BhcnNlKHRyYW5zQnVmLmJ1Zi5zbGljZSh0cmFuc0J1Zi5yZWFkSW5kZXgsIGN1cnNvcisxKS50b1N0cmluZygpKTsKICAgdGhpcy50cmFucy5jb25zdW1lKGN1cnNvciArIDEgLSB0cmFuc0J1Zi5yZWFkSW5kZXgpOwogCiAgIC8vVmVyaWZ5IHRoZSBwcm90b2NvbCB2ZXJzaW9uCiAgIHZhciB2ZXJzaW9uID0gdGhpcy5yb2JqLnNoaWZ0KCk7CiAgIGlmICh2ZXJzaW9uICE9IFRKU09OUHJvdG9jb2wuVmVyc2lvbikgewotICAgIHRocm93ICdXcm9uZyB0aHJpZnQgcHJvdG9jb2wgdmVyc2lvbjogJyArIHZlcnNpb247CisgICAgdGhyb3cgbmV3IEVycm9yKCdXcm9uZyB0aHJpZnQgcHJvdG9jb2wgdmVyc2lvbjogJyArIHZlcnNpb24pOwogICB9CiAKICAgLy9PYmplY3RpZnkgdGhlIHRocmlmdCBtZXNzYWdlIHtuYW1lL3R5cGUvc2VxdWVuY2UtbnVtYmVyfSBmb3IgcmV0dXJuCkBAIC01OTUsNyArNjMyLDEyIEBACiAKIC8qKiBEZXNlcmlhbGl6ZXMgdGhlIGVuZCBvZiBhIGxpc3QuICovCiBUSlNPTlByb3RvY29sLnByb3RvdHlwZS5yZWFkTGlzdEVuZCA9IGZ1bmN0aW9uKCkgewotICB0aGlzLnJlYWRGaWVsZEVuZCgpOworICB2YXIgcG9zID0gdGhpcy5ycG9zLnBvcCgpIC0gMjsKKyAgdmFyIHN0ID0gdGhpcy5yc3RhY2s7CisgIHN0LnBvcCgpOworICBpZiAoc3QgaW5zdGFuY2VvZiBBcnJheSAmJiBzdC5sZW5ndGggPiBwb3MgJiYgc3RbcG9zXS5sZW5ndGggPiAwKSB7CisgICAgc3QucHVzaChzdFtwb3NdLnNoaWZ0KCkpOworICB9CiB9OwogCiAvKioKQEAgLTYxMSwyOCArNjUzLDI0IEBACiAgIHJldHVybiB0aGlzLnJlYWRMaXN0RW5kKCk7CiB9OwogCi0vKiogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBhIHZhbHVlIHByb3BlcnR5IHNldCB0bwotICogIEZhbHNlIHVubGVzcyB0aGUgbmV4dCBudW1iZXIgaW4gdGhlIHByb3RvY29sIGJ1ZmZlcgotICogIGlzIDEsIGluIHdoaWNoIGNhc2UgdGhlIHZhbHVlIHByb3BlcnR5IGlzIFRydWUgKi8KIFRKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRCb29sID0gZnVuY3Rpb24oKSB7Ci0gIHJldHVybiB0aGlzLnJlYWRJMzIoKSA9PSAnMSc7CisgIHJldHVybiB0aGlzLnJlYWRWYWx1ZSgpID09ICcxJzsKIH07CiAKLS8qKiBSZXR1cm5zIHRoZSBhbiBvYmplY3Qgd2l0aCBhIHZhbHVlIHByb3BlcnR5IHNldCB0byB0aGUKLSAgICBuZXh0IHZhbHVlIGZvdW5kIGluIHRoZSBwcm90b2NvbCBidWZmZXIgKi8KIFRKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRCeXRlID0gZnVuY3Rpb24oKSB7CiAgIHJldHVybiB0aGlzLnJlYWRJMzIoKTsKIH07CiAKLS8qKiBSZXR1cm5zIHRoZSBhbiBvYmplY3Qgd2l0aCBhIHZhbHVlIHByb3BlcnR5IHNldCB0byB0aGUKLSAgICBuZXh0IHZhbHVlIGZvdW5kIGluIHRoZSBwcm90b2NvbCBidWZmZXIgKi8KIFRKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRJMTYgPSBmdW5jdGlvbigpIHsKICAgcmV0dXJuIHRoaXMucmVhZEkzMigpOwogfTsKIAotLyoqIFJldHVybnMgdGhlIGFuIG9iamVjdCB3aXRoIGEgdmFsdWUgcHJvcGVydHkgc2V0IHRvIHRoZQotICAgIG5leHQgdmFsdWUgZm91bmQgaW4gdGhlIHByb3RvY29sIGJ1ZmZlciAqLwogVEpTT05Qcm90b2NvbC5wcm90b3R5cGUucmVhZEkzMiA9IGZ1bmN0aW9uKGYpIHsKKyAgcmV0dXJuICt0aGlzLnJlYWRWYWx1ZSgpOworfQorCisvKiogUmV0dXJucyB0aGUgbmV4dCB2YWx1ZSBmb3VuZCBpbiB0aGUgcHJvdG9jb2wgYnVmZmVyICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS5yZWFkVmFsdWUgPSBmdW5jdGlvbihmKSB7CiAgIGlmIChmID09PSB1bmRlZmluZWQpIHsKICAgICBmID0gdGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMV07CiAgIH0KQEAgLTY0NSw3ICs2ODMsNyBAQAogICAgIH0gZWxzZSB7CiAgICAgICByLnZhbHVlID0gZi5zaGlmdCgpOwogICAgIH0KLSAgfSBlbHNlIGlmIChmIGluc3RhbmNlb2YgT2JqZWN0KSB7CisgIH0gZWxzZSBpZiAoIShmIGluc3RhbmNlb2YgSW50NjQpICYmIGYgaW5zdGFuY2VvZiBPYmplY3QpIHsKICAgICBmb3IgKHZhciBpIGluIGYpIHsKICAgICAgIGlmIChpID09PSBudWxsKSB7CiAgICAgICAgIGNvbnRpbnVlOwpAQCAtNjY0LDI4ICs3MDIsMjYgQEAKICAgcmV0dXJuIHIudmFsdWU7CiB9OwogCi0vKiogUmV0dXJucyB0aGUgYW4gb2JqZWN0IHdpdGggYSB2YWx1ZSBwcm9wZXJ0eSBzZXQgdG8gdGhlCi0gICAgbmV4dCB2YWx1ZSBmb3VuZCBpbiB0aGUgcHJvdG9jb2wgYnVmZmVyICovCiBUSlNPTlByb3RvY29sLnByb3RvdHlwZS5yZWFkSTY0ID0gZnVuY3Rpb24oKSB7Ci0gIHJldHVybiBuZXcgSW50NjQodGhpcy5yZWFkSTMyKCkpOworICB2YXIgbiA9IHRoaXMucmVhZFZhbHVlKCkKKyAgaWYgKHR5cGVvZiBuID09PSAnc3RyaW5nJykgeworICAgIC8vIEFzc3VtaW5nIG5vIG9uZSBpcyBzZW5kaW5nIGluIDEuMTExMTFlKzMzIGZvcm1hdAorICAgIHJldHVybiBJbnQ2NFV0aWwuZnJvbURlY2ltYWxTdHJpbmcobik7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIG5ldyBJbnQ2NChuKTsKKyAgfQogfTsKIAotLyoqIFJldHVybnMgdGhlIGFuIG9iamVjdCB3aXRoIGEgdmFsdWUgcHJvcGVydHkgc2V0IHRvIHRoZQotICAgIG5leHQgdmFsdWUgZm91bmQgaW4gdGhlIHByb3RvY29sIGJ1ZmZlciAqLwogVEpTT05Qcm90b2NvbC5wcm90b3R5cGUucmVhZERvdWJsZSA9IGZ1bmN0aW9uKCkgewogICByZXR1cm4gdGhpcy5yZWFkSTMyKCk7CiB9OwogCi0vKiogUmV0dXJucyB0aGUgYW4gb2JqZWN0IHdpdGggYSB2YWx1ZSBwcm9wZXJ0eSBzZXQgdG8gdGhlCi0gICAgbmV4dCB2YWx1ZSBmb3VuZCBpbiB0aGUgcHJvdG9jb2wgYnVmZmVyICovCiBUSlNPTlByb3RvY29sLnByb3RvdHlwZS5yZWFkQmluYXJ5ID0gZnVuY3Rpb24oKSB7Ci0gIHJldHVybiB0aGlzLnJlYWRTdHJpbmcoKTsKKyAgcmV0dXJuIG5ldyBCdWZmZXIodGhpcy5yZWFkVmFsdWUoKSwgJ2Jhc2U2NCcpOwogfTsKIAotLyoqIFJldHVybnMgdGhlIGFuIG9iamVjdCB3aXRoIGEgdmFsdWUgcHJvcGVydHkgc2V0IHRvIHRoZQotICAgIG5leHQgdmFsdWUgZm91bmQgaW4gdGhlIHByb3RvY29sIGJ1ZmZlciAqLwogVEpTT05Qcm90b2NvbC5wcm90b3R5cGUucmVhZFN0cmluZyA9IGZ1bmN0aW9uKCkgewotICByZXR1cm4gdGhpcy5yZWFkSTMyKCk7CisgIHJldHVybiB0aGlzLnJlYWRWYWx1ZSgpOwogfTsKIAogLyoqCkBAIC03MDEsNSArNzM3LDY1IEBACiAgKiBNZXRob2QgdG8gYXJiaXRyYXJpbHkgc2tpcCBvdmVyIGRhdGEKICAqLwogVEpTT05Qcm90b2NvbC5wcm90b3R5cGUuc2tpcCA9IGZ1bmN0aW9uKHR5cGUpIHsKLSAgdGhyb3cgJ3NraXAgbm90IHN1cHBvcnRlZCB5ZXQnOworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgVHlwZS5TVE9QOgorICAgICAgcmV0dXJuOworICAgIGNhc2UgVHlwZS5CT09MOgorICAgICAgdGhpcy5yZWFkQm9vbCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLkJZVEU6CisgICAgICB0aGlzLnJlYWRCeXRlKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuSTE2OgorICAgICAgdGhpcy5yZWFkSTE2KCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuSTMyOgorICAgICAgdGhpcy5yZWFkSTMyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuSTY0OgorICAgICAgdGhpcy5yZWFkSTY0KCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuRE9VQkxFOgorICAgICAgdGhpcy5yZWFkRG91YmxlKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuU1RSSU5HOgorICAgICAgdGhpcy5yZWFkU3RyaW5nKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuU1RSVUNUOgorICAgICAgdGhpcy5yZWFkU3RydWN0QmVnaW4oKTsKKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIHZhciByID0gdGhpcy5yZWFkRmllbGRCZWdpbigpOworICAgICAgICBpZiAoci5mdHlwZSA9PT0gVHlwZS5TVE9QKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5za2lwKHIuZnR5cGUpOworICAgICAgICB0aGlzLnJlYWRGaWVsZEVuZCgpOworICAgICAgfQorICAgICAgdGhpcy5yZWFkU3RydWN0RW5kKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuTUFQOgorICAgICAgdmFyIG1hcEJlZ2luID0gdGhpcy5yZWFkTWFwQmVnaW4oKTsKKyAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFwQmVnaW4uc2l6ZTsgKytpKSB7CisgICAgICAgIHRoaXMuc2tpcChtYXBCZWdpbi5rdHlwZSk7CisgICAgICAgIHRoaXMuc2tpcChtYXBCZWdpbi52dHlwZSk7CisgICAgICB9CisgICAgICB0aGlzLnJlYWRNYXBFbmQoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5TRVQ6CisgICAgICB2YXIgc2V0QmVnaW4gPSB0aGlzLnJlYWRTZXRCZWdpbigpOworICAgICAgZm9yICh2YXIgaTIgPSAwOyBpMiA8IHNldEJlZ2luLnNpemU7ICsraTIpIHsKKyAgICAgICAgdGhpcy5za2lwKHNldEJlZ2luLmV0eXBlKTsKKyAgICAgIH0KKyAgICAgIHRoaXMucmVhZFNldEVuZCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLkxJU1Q6CisgICAgICB2YXIgbGlzdEJlZ2luID0gdGhpcy5yZWFkTGlzdEJlZ2luKCk7CisgICAgICBmb3IgKHZhciBpMyA9IDA7IGkzIDwgbGlzdEJlZ2luLnNpemU7ICsraTMpIHsKKyAgICAgICAgdGhpcy5za2lwKGxpc3RCZWdpbi5ldHlwZSk7CisgICAgICB9CisgICAgICB0aGlzLnJlYWRMaXN0RW5kKCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgbmV3ICBFcnJvcigiSW52YWxpZCB0eXBlOiAiICsgdHlwZSk7CisgIH0KIH07CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvbG9nLmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2xvZy5qcwppbmRleCAwZTEzZWE4Li4wNTNlODEzIDEwMDY0NAotLS0gYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvbG9nLmpzCisrKyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9sb2cuanMKQEAgLTE3LDEwICsxNyw3MSBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotbW9kdWxlLmV4cG9ydHMgPSB7Ci0gICdpbmZvJyA6IGZ1bmN0aW9uIGxvZ0luZm8oKSB7fSwKLSAgJ3dhcm5pbmcnIDogZnVuY3Rpb24gbG9nV2FybmluZygpIHt9LAotICAnZXJyb3InIDogZnVuY3Rpb24gbG9nRXJyb3IoKSB7fSwKLSAgJ2RlYnVnJyA6IGZ1bmN0aW9uIGxvZ0RlYnVnKCkge30sCi0gICd0cmFjZScgOiBmdW5jdGlvbiBsb2dUcmFjZSgpIHt9Cit2YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTsKKwordmFyIGRpc2FibGVkID0gZnVuY3Rpb24gKCkge307Cit2YXIgbG9nRnVuYyA9IGNvbnNvbGUubG9nOwordmFyIGxvZ0xldmVsID0gJ2Vycm9yJzsgLy8gZGVmYXVsdCBsZXZlbAorCitmdW5jdGlvbiBmYWN0b3J5KGxldmVsKSB7CisgIHJldHVybiBmdW5jdGlvbiAoKSB7CisgICAgLy8gYmV0dGVyIHVzZSBzcHJlYWQgc3ludGF4LCBidXQgZHVlIHRvIGNvbXBhdGliaWxpdHksCisgICAgLy8gdXNlIGxlZ2FjeSBtZXRob2QgaGVyZS4KKyAgICB2YXIgYXJncyA9IFsndGhyaWZ0OiBbJyArIGxldmVsICsgJ10gJ10uY29uY2F0KEFycmF5LmZyb20oYXJndW1lbnRzKSk7CisgICAgcmV0dXJuIGxvZ0Z1bmModXRpbC5mb3JtYXQuYXBwbHkobnVsbCwgYXJncykpOworICB9OworfQorCit2YXIgdHJhY2UgPSBkaXNhYmxlZDsKK3ZhciBkZWJ1ZyA9IGRpc2FibGVkOwordmFyIGVycm9yID0gZGlzYWJsZWQ7Cit2YXIgd2FybmluZyA9IGRpc2FibGVkOwordmFyIGluZm8gPSBkaXNhYmxlZDsKKworZXhwb3J0cy5zZXRMb2dGdW5jID0gZnVuY3Rpb24gKGZ1bmMpIHsKKyAgbG9nRnVuYyA9IGZ1bmM7Cit9OworCit2YXIgc2V0TG9nTGV2ZWwgPSBleHBvcnRzLnNldExvZ0xldmVsID0gZnVuY3Rpb24gKGxldmVsKSB7CisgIHRyYWNlID0gZGVidWcgPSBlcnJvciA9IHdhcm5pbmcgPSBpbmZvID0gZGlzYWJsZWQ7CisgIGxvZ0xldmVsID0gbGV2ZWw7CisgIHN3aXRjaCAobG9nTGV2ZWwpIHsKKyAgY2FzZSAndHJhY2UnOgorICAgIHRyYWNlID0gZmFjdG9yeSgnVFJBQ0UnKTsKKyAgY2FzZSAnZGVidWcnOgorICAgIGRlYnVnID0gZmFjdG9yeSgnREVCVUcnKTsKKyAgY2FzZSAnZXJyb3InOgorICAgIGVycm9yID0gZmFjdG9yeSgnRVJST1InKTsKKyAgY2FzZSAnd2FybmluZyc6CisgICAgd2FybmluZyA9IGZhY3RvcnkoJ1dBUk4nKTsKKyAgY2FzZSAnaW5mbyc6CisgICAgaW5mbyA9IGZhY3RvcnkoJ0lORk8nKTsKKyAgfQorfTsKKworLy8gc2V0IGRlZmF1bHQKK3NldExvZ0xldmVsKGxvZ0xldmVsKTsKKworZXhwb3J0cy5nZXRMb2dMZXZlbCA9IGZ1bmN0aW9uICgpIHsKKyAgcmV0dXJuIGxvZ0xldmVsOworfTsKKworZXhwb3J0cy50cmFjZSA9IGZ1bmN0aW9uICgpIHsKKyAgcmV0dXJuIHRyYWNlLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7Cit9OworCitleHBvcnRzLmRlYnVnID0gZnVuY3Rpb24gKCkgeworICByZXR1cm4gZGVidWcuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKK307CisKK2V4cG9ydHMuZXJyb3IgPSBmdW5jdGlvbiAoKSB7CisgIHJldHVybiBlcnJvci5hcHBseShudWxsLCBhcmd1bWVudHMpOworfTsKKworZXhwb3J0cy53YXJuaW5nID0gZnVuY3Rpb24gKCkgeworICByZXR1cm4gd2FybmluZy5hcHBseShudWxsLCBhcmd1bWVudHMpOworfTsKKworZXhwb3J0cy5pbmZvID0gZnVuY3Rpb24gKCkgeworICByZXR1cm4gaW5mby5hcHBseShudWxsLCBhcmd1bWVudHMpOwogfTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9tdWx0aXBsZXhlZF9wcm90b2NvbC5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9tdWx0aXBsZXhlZF9wcm90b2NvbC5qcwppbmRleCA5Y2FmNmFiLi5kMDc4YWEyIDEwMDY0NAotLS0gYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvbXVsdGlwbGV4ZWRfcHJvdG9jb2wuanMKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L211bHRpcGxleGVkX3Byb3RvY29sLmpzCkBAIC01MiwxNyArNTIsMTcgQEAKICAgaWYgKFNlcnZpY2VDbGllbnQuQ2xpZW50KSB7CiAgICAgU2VydmljZUNsaWVudCA9IFNlcnZpY2VDbGllbnQuQ2xpZW50OwogICB9Ci0gIHZhciBzZWxmID0gdGhpczsKLSAgU2VydmljZUNsaWVudC5wcm90b3R5cGUubmV3X3NlcWlkID0gZnVuY3Rpb24oKSB7Ci0gICAgc2VsZi5zZXFpZCArPSAxOwotICAgIHJldHVybiBzZWxmLnNlcWlkOwotICB9OwogICB2YXIgd3JpdGVDYiA9IGZ1bmN0aW9uKGJ1Ziwgc2VxaWQpIHsKICAgICBjb25uZWN0aW9uLndyaXRlKGJ1ZixzZXFpZCk7CiAgIH07CiAgIHZhciB0cmFuc3BvcnQgPSBuZXcgY29ubmVjdGlvbi50cmFuc3BvcnQodW5kZWZpbmVkLCB3cml0ZUNiKTsKICAgdmFyIHByb3RvY29sV3JhcHBlciA9IG5ldyBXcmFwcGVyKHNlcnZpY2VOYW1lLCBjb25uZWN0aW9uLnByb3RvY29sLCBjb25uZWN0aW9uKTsKICAgdmFyIGNsaWVudCA9IG5ldyBTZXJ2aWNlQ2xpZW50KHRyYW5zcG9ydCwgcHJvdG9jb2xXcmFwcGVyKTsKKyAgdmFyIHNlbGYgPSB0aGlzOworICBjbGllbnQubmV3X3NlcWlkID0gZnVuY3Rpb24oKSB7CisgICAgc2VsZi5zZXFpZCArPSAxOworICAgIHJldHVybiBzZWxmLnNlcWlkOworICB9OwogCiAgIGlmICh0eXBlb2YgY29ubmVjdGlvbi5jbGllbnQgIT09ICdvYmplY3QnKSB7CiAgICAgY29ubmVjdGlvbi5jbGllbnQgPSB7fTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9zZXJ2ZXIuanMgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvc2VydmVyLmpzCmluZGV4IDkyMWJiODYuLmUxMjRhY2MgMTAwNjQ0Ci0tLSBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9zZXJ2ZXIuanMKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L3NlcnZlci5qcwpAQCAtMTYsNiArMTYsOCBAQAogICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KKwordmFyIGNvbnN0YW50cyA9IHJlcXVpcmUoJ2NvbnN0YW50cycpOwogdmFyIG5ldCA9IHJlcXVpcmUoJ25ldCcpOwogdmFyIHRscyA9IHJlcXVpcmUoJ3RscycpOwogCkBAIC04Nyw2ICs4OSwxMCBAQAogICB9CiAKICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy50bHMpIHsKKyAgICBpZiAoISgnc2VjdXJlUHJvdG9jb2wnIGluIG9wdGlvbnMudGxzKSAmJiAhKCdzZWN1cmVPcHRpb25zJyBpbiBvcHRpb25zLnRscykpIHsKKyAgICAgIG9wdGlvbnMudGxzLnNlY3VyZVByb3RvY29sID0gIlNTTHYyM19tZXRob2QiOworICAgICAgb3B0aW9ucy50bHMuc2VjdXJlT3B0aW9ucyA9IGNvbnN0YW50cy5TU0xfT1BfTk9fU1NMdjIgfCBjb25zdGFudHMuU1NMX09QX05PX1NTTHYzOworICAgIH0KICAgICByZXR1cm4gdGxzLmNyZWF0ZVNlcnZlcihvcHRpb25zLnRscywgc2VydmVySW1wbCk7CiAgIH0gZWxzZSB7CiAgICAgcmV0dXJuIG5ldC5jcmVhdGVTZXJ2ZXIoc2VydmVySW1wbCk7CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvd2ViX3NlcnZlci5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC93ZWJfc2VydmVyLmpzCmluZGV4IDM3MTU5ZWEuLmEzM2Y0N2EgMTAwNjQ0Ci0tLSBhL2xpYi9ub2RlanMvbGliL3RocmlmdC93ZWJfc2VydmVyLmpzCisrKyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC93ZWJfc2VydmVyLmpzCkBAIC0yMiw2ICsyMiw3IEBACiB2YXIgcGF0aCA9IHJlcXVpcmUoInBhdGgiKTsKIHZhciBmcyA9IHJlcXVpcmUoImZzIik7CiB2YXIgY3J5cHRvID0gcmVxdWlyZSgiY3J5cHRvIik7Cit2YXIgbG9nID0gcmVxdWlyZSgnLi9sb2cnKTsKIAogdmFyIE11bHRpcGxleGVkUHJvY2Vzc29yID0gcmVxdWlyZSgnLi9tdWx0aXBsZXhlZF9wcm9jZXNzb3InKS5NdWx0aXBsZXhlZFByb2Nlc3NvcjsKIApAQCAtMjg0LDcgKzI4NSw3IEBACiAgICAgJy5qcGVnJzogJ2ltYWdlL2pwZWcnLAogICAgICcuZ2lmJzogJ2ltYWdlL2dpZicsCiAgICAgJy5wbmcnOiAnaW1hZ2UvcG5nJywKLSAgwqAgJy5zdmcnOiAnaW1hZ2Uvc3ZnK3htbCcKKyAgICAnLnN2Zyc6ICdpbWFnZS9zdmcreG1sJwogICB9OwogCiAgIC8vU2V0dXAgYWxsIG9mIHRoZSBzZXJ2aWNlcwpAQCAtNDE0LDcgKzQxNSwxNSBAQAogCiAgICAgLy9Mb2NhdGUgdGhlIGZpbGUgcmVxdWVzdGVkIGFuZCBzZW5kIGl0CiAgICAgdmFyIHVyaSA9IHVybC5wYXJzZShyZXF1ZXN0LnVybCkucGF0aG5hbWU7Ci0gICAgdmFyIGZpbGVuYW1lID0gcGF0aC5qb2luKGJhc2VEaXIsIHVyaSk7CisgICAgdmFyIGZpbGVuYW1lID0gcGF0aC5yZXNvbHZlKHBhdGguam9pbihiYXNlRGlyLCB1cmkpKTsKKworICAgIC8vRW5zdXJlIHRoZSBiYXNlZGlyIHBhdGggaXMgbm90IGFibGUgdG8gYmUgZXNjYXBlZAorICAgIGlmIChmaWxlbmFtZS5pbmRleE9mKGJhc2VEaXIpICE9IDApIHsKKyAgICAgIHJlc3BvbnNlLndyaXRlSGVhZCg0MDAsICJJbnZhbGlkIHJlcXVlc3QgcGF0aCIsIHt9KTsKKyAgICAgIHJlc3BvbnNlLmVuZCgpOworICAgICAgcmV0dXJuOworICAgIH0KKwogICAgIGZzLmV4aXN0cyhmaWxlbmFtZSwgZnVuY3Rpb24oZXhpc3RzKSB7CiAgICAgICBpZighZXhpc3RzKSB7CiAgICAgICAgIHJlc3BvbnNlLndyaXRlSGVhZCg0MDQpOwpAQCAtNTQ3LDcgKzU1Niw3IEBACiAgICAgICAgICAgZnJhbWUgPSByZXN1bHQubmV4dEZyYW1lOwogICAgICAgICB9CiAgICAgICB9IGNhdGNoKGUpIHsKLSAgICAgICAgY29uc29sZS5sb2coIlRXZWJTb2NrZXRUcmFuc3BvcnQgRXhjZXB0aW9uOiAiICsgZSk7CisgICAgICAgIGxvZy5lcnJvcignVFdlYlNvY2tldFRyYW5zcG9ydCBFeGNlcHRpb246ICcgKyBlKTsKICAgICAgICAgc29ja2V0LmRlc3Ryb3koKTsKICAgICAgIH0KICAgICB9KTsKQEAgLTU1Niw5ICs1NjUsMyBAQAogICAvL1JldHVybiB0aGUgc2VydmVyCiAgIHJldHVybiBzZXJ2ZXI7CiB9OwotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L3dzX3RyYW5zcG9ydC5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC93c190cmFuc3BvcnQuanMKaW5kZXggOGU3NTBlMi4uMzUxM2I4NCAxMDA2NDQKLS0tIGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L3dzX3RyYW5zcG9ydC5qcworKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvd3NfdHJhbnNwb3J0LmpzCkBAIC0xNyw2ICsxNyw4IEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCit2YXIgbG9nID0gcmVxdWlyZSgnLi9sb2cnKTsKKwogbW9kdWxlLmV4cG9ydHMgPSBUV2ViU29ja2V0VHJhbnNwb3J0OwogCiAvKioKQEAgLTEwNSw3ICsxMDcsNyBAQAogfTsKIAogVFdlYlNvY2tldFRyYW5zcG9ydC5wcm90b3R5cGUuX19vbkVycm9yID0gZnVuY3Rpb24oZXZ0KSB7Ci0gIGNvbnNvbGUubG9nKCJUaHJpZnQgV2ViU29ja2V0IEVycm9yOiAiICsgZXZ0LnRvU3RyaW5nKCkpOworICBsb2cuZXJyb3IoJ3dlYnNvY2tldDogJyArIGV2dC50b1N0cmluZygpKTsKICAgdGhpcy5zb2NrZXQuY2xvc2UoKTsKIH07CiAKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvdGVzdC9iaW5hcnkudGVzdC5qcyBiL2xpYi9ub2RlanMvdGVzdC9iaW5hcnkudGVzdC5qcwppbmRleCAzOGJhNjM0Li4xODdjZDE4IDEwMDY0NAotLS0gYS9saWIvbm9kZWpzL3Rlc3QvYmluYXJ5LnRlc3QuanMKKysrIGIvbGliL25vZGVqcy90ZXN0L2JpbmFyeS50ZXN0LmpzCkBAIC0xNywxOSArMTcsMTkgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLXZhciB0ZXN0ID0gcmVxdWlyZSgndGFwZScpOwotdmFyIGJpbmFyeSA9IHJlcXVpcmUoJ3RocmlmdC9iaW5hcnknKTsKK2NvbnN0IHRlc3QgPSByZXF1aXJlKCJ0YXBlIik7Citjb25zdCBiaW5hcnkgPSByZXF1aXJlKCJ0aHJpZnQvYmluYXJ5Iik7CiAKLXZhciBjYXNlcyA9IHsKLSAgIlNob3VsZCByZWFkIHNpZ25lZCBieXRlIjogZnVuY3Rpb24oYXNzZXJ0KXsKK2NvbnN0IGNhc2VzID0geworICAiU2hvdWxkIHJlYWQgc2lnbmVkIGJ5dGUiOiBmdW5jdGlvbihhc3NlcnQpIHsKICAgICBhc3NlcnQuZXF1YWwoMSwgYmluYXJ5LnJlYWRCeXRlKDB4MDEpKTsKLSAgICBhc3NlcnQuZXF1YWwoLTEsIGJpbmFyeS5yZWFkQnl0ZSgweEZGKSk7CisgICAgYXNzZXJ0LmVxdWFsKC0xLCBiaW5hcnkucmVhZEJ5dGUoMHhmZikpOwogCi0gICAgYXNzZXJ0LmVxdWFsKDEyNywgYmluYXJ5LnJlYWRCeXRlKDB4N0YpKTsKKyAgICBhc3NlcnQuZXF1YWwoMTI3LCBiaW5hcnkucmVhZEJ5dGUoMHg3ZikpOwogICAgIGFzc2VydC5lcXVhbCgtMTI4LCBiaW5hcnkucmVhZEJ5dGUoMHg4MCkpOwogICAgIGFzc2VydC5lbmQoKTsKICAgfSwKLSAgIlNob3VsZCB3cml0ZSBieXRlIjogZnVuY3Rpb24oYXNzZXJ0KXsKKyAgIlNob3VsZCB3cml0ZSBieXRlIjogZnVuY3Rpb24oYXNzZXJ0KSB7CiAgICAgLy9Qcm90b2NvbCBzaW1wbHkgd3JpdGVzIHRvIHRoZSBidWZmZXIuIE5vdGhpbmcgdG8gdGVzdC4uIHlldC4KICAgICBhc3NlcnQub2sodHJ1ZSk7CiAgICAgYXNzZXJ0LmVuZCgpOwpAQCAtNzYsNTggKzc2LDEzNSBAQAogICAgIGFzc2VydC5kZWVwRXF1YWwoWzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZdLCBiaW5hcnkud3JpdGVJMzIoW10sIC0xKSk7CiAKICAgICAvLyBNaW4gSTMyCi0gICAgYXNzZXJ0LmRlZXBFcXVhbChbMHg4MCwgMHgwMCwgMHgwMCwgMHgwMF0sIGJpbmFyeS53cml0ZUkzMihbXSwgLTIxNDc0ODM2NDgpKTsKKyAgICBhc3NlcnQuZGVlcEVxdWFsKAorICAgICAgWzB4ODAsIDB4MDAsIDB4MDAsIDB4MDBdLAorICAgICAgYmluYXJ5LndyaXRlSTMyKFtdLCAtMjE0NzQ4MzY0OCkKKyAgICApOwogICAgIC8vIE1heCBJMzIKICAgICBhc3NlcnQuZGVlcEVxdWFsKFsweDdmLCAweGZmLCAweGZmLCAweGZmXSwgYmluYXJ5LndyaXRlSTMyKFtdLCAyMTQ3NDgzNjQ3KSk7CiAgICAgYXNzZXJ0LmVuZCgpOwogICB9LAogCiAgICJTaG91bGQgcmVhZCBkb3VibGVzIjogZnVuY3Rpb24oYXNzZXJ0KSB7Ci0gICAgYXNzZXJ0LmVxdWFsKDAsIGJpbmFyeS5yZWFkRG91YmxlKFsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSkpCi0gICAgYXNzZXJ0LmVxdWFsKDAsIGJpbmFyeS5yZWFkRG91YmxlKFsweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSkpCi0gICAgYXNzZXJ0LmVxdWFsKDEsIGJpbmFyeS5yZWFkRG91YmxlKFsweDNmLCAweGYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSkpCi0gICAgYXNzZXJ0LmVxdWFsKDIsIGJpbmFyeS5yZWFkRG91YmxlKFsweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSkpCi0gICAgYXNzZXJ0LmVxdWFsKC0yLCBiaW5hcnkucmVhZERvdWJsZShbMHhjMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0pKQorICAgIGFzc2VydC5lcXVhbCgKKyAgICAgIDAsCisgICAgICBiaW5hcnkucmVhZERvdWJsZShbMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0pCisgICAgKTsKKyAgICBhc3NlcnQuZXF1YWwoCisgICAgICAwLAorICAgICAgYmluYXJ5LnJlYWREb3VibGUoWzB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdKQorICAgICk7CisgICAgYXNzZXJ0LmVxdWFsKAorICAgICAgMSwKKyAgICAgIGJpbmFyeS5yZWFkRG91YmxlKFsweDNmLCAweGYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSkKKyAgICApOworICAgIGFzc2VydC5lcXVhbCgKKyAgICAgIDIsCisgICAgICBiaW5hcnkucmVhZERvdWJsZShbMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0pCisgICAgKTsKKyAgICBhc3NlcnQuZXF1YWwoCisgICAgICAtMiwKKyAgICAgIGJpbmFyeS5yZWFkRG91YmxlKFsweGMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSkKKyAgICApOwogCi0gICAgYXNzZXJ0LmVxdWFsKE1hdGguUEksIGJpbmFyeS5yZWFkRG91YmxlKFsweDQwLCAweDksIDB4MjEsIDB4ZmIsIDB4NTQsIDB4NDQsIDB4MmQsIDB4MThdKSkKKyAgICBhc3NlcnQuZXF1YWwoCisgICAgICBNYXRoLlBJLAorICAgICAgYmluYXJ5LnJlYWREb3VibGUoWzB4NDAsIDB4OSwgMHgyMSwgMHhmYiwgMHg1NCwgMHg0NCwgMHgyZCwgMHgxOF0pCisgICAgKTsKIAotICAgIGFzc2VydC5lcXVhbChJbmZpbml0eSwgYmluYXJ5LnJlYWREb3VibGUoWzB4N2YsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdKSkKLSAgICBhc3NlcnQuZXF1YWwoLUluZmluaXR5LCBiaW5hcnkucmVhZERvdWJsZShbMHhmZiwgMHhmMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0pKQorICAgIGFzc2VydC5lcXVhbCgKKyAgICAgIEluZmluaXR5LAorICAgICAgYmluYXJ5LnJlYWREb3VibGUoWzB4N2YsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdKQorICAgICk7CisgICAgYXNzZXJ0LmVxdWFsKAorICAgICAgLUluZmluaXR5LAorICAgICAgYmluYXJ5LnJlYWREb3VibGUoWzB4ZmYsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdKQorICAgICk7CiAKLSAgICBhc3NlcnQub2soaXNOYU4oYmluYXJ5LnJlYWREb3VibGUoWzB4N2YsIDB4ZjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdKSkpCisgICAgYXNzZXJ0Lm9rKAorICAgICAgaXNOYU4oYmluYXJ5LnJlYWREb3VibGUoWzB4N2YsIDB4ZjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdKSkKKyAgICApOwogCi0gICAgYXNzZXJ0LmVxdWFsKDEvMywgYmluYXJ5LnJlYWREb3VibGUoWzB4M2YsIDB4ZDUsIDB4NTUsIDB4NTUsIDB4NTUsIDB4NTUsIDB4NTUsIDB4NTVdKSkKKyAgICBhc3NlcnQuZXF1YWwoCisgICAgICAxIC8gMywKKyAgICAgIGJpbmFyeS5yZWFkRG91YmxlKFsweDNmLCAweGQ1LCAweDU1LCAweDU1LCAweDU1LCAweDU1LCAweDU1LCAweDU1XSkKKyAgICApOwogCiAgICAgLy8gTWluIHN1Ym5vcm1hbCBwb3NpdGl2ZSBkb3VibGUKLSAgICBhc3NlcnQuZXF1YWwoNC45NDA2NTY0NTg0MTI0NjU0ZS0zMjQsIGJpbmFyeS5yZWFkRG91YmxlKFsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxXSkpCisgICAgYXNzZXJ0LmVxdWFsKAorICAgICAgNC45NDA2NTY0NTg0MTI0NjU0ZS0zMjQsCisgICAgICBiaW5hcnkucmVhZERvdWJsZShbMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMV0pCisgICAgKTsKICAgICAvLyBNaW4gbm9ybWFsIHBvc2l0aXZlIGRvdWJsZQotICAgIGFzc2VydC5lcXVhbCgyLjIyNTA3Mzg1ODUwNzIwMTRlLTMwOCwgYmluYXJ5LnJlYWREb3VibGUoWzB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdKSkKKyAgICBhc3NlcnQuZXF1YWwoCisgICAgICAyLjIyNTA3Mzg1ODUwNzIwMTRlLTMwOCwKKyAgICAgIGJpbmFyeS5yZWFkRG91YmxlKFsweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSkKKyAgICApOwogICAgIC8vIE1heCBwb3NpdGl2ZSBkb3VibGUKLSAgICBhc3NlcnQuZXF1YWwoMS43OTc2OTMxMzQ4NjIzMTU3ZTMwOCwgYmluYXJ5LnJlYWREb3VibGUoWzB4N2YsIDB4ZWYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZdKSkKKyAgICBhc3NlcnQuZXF1YWwoCisgICAgICAxLjc5NzY5MzEzNDg2MjMxNTdlMzA4LAorICAgICAgYmluYXJ5LnJlYWREb3VibGUoWzB4N2YsIDB4ZWYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZdKQorICAgICk7CiAgICAgYXNzZXJ0LmVuZCgpOwogICB9LAogCiAgICJTaG91bGQgd3JpdGUgZG91YmxlcyI6IGZ1bmN0aW9uKGFzc2VydCkgewotICAgIGFzc2VydC5kZWVwRXF1YWwoWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdLCBiaW5hcnkud3JpdGVEb3VibGUoW10sIDApKTsKLSAgICBhc3NlcnQuZGVlcEVxdWFsKFsweDNmLCAweGYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSwgYmluYXJ5LndyaXRlRG91YmxlKFtdLCAxKSk7Ci0gICAgYXNzZXJ0LmRlZXBFcXVhbChbMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0sIGJpbmFyeS53cml0ZURvdWJsZShbXSwgMikpOwotICAgIGFzc2VydC5kZWVwRXF1YWwoWzB4YzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdLCBiaW5hcnkud3JpdGVEb3VibGUoW10sIC0yKSk7CisgICAgYXNzZXJ0LmRlZXBFcXVhbCgKKyAgICAgIFsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSwKKyAgICAgIGJpbmFyeS53cml0ZURvdWJsZShbXSwgMCkKKyAgICApOworICAgIGFzc2VydC5kZWVwRXF1YWwoCisgICAgICBbMHgzZiwgMHhmMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0sCisgICAgICBiaW5hcnkud3JpdGVEb3VibGUoW10sIDEpCisgICAgKTsKKyAgICBhc3NlcnQuZGVlcEVxdWFsKAorICAgICAgWzB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdLAorICAgICAgYmluYXJ5LndyaXRlRG91YmxlKFtdLCAyKQorICAgICk7CisgICAgYXNzZXJ0LmRlZXBFcXVhbCgKKyAgICAgIFsweGMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSwKKyAgICAgIGJpbmFyeS53cml0ZURvdWJsZShbXSwgLTIpCisgICAgKTsKIAotICAgIGFzc2VydC5kZWVwRXF1YWwoWzB4NDAsIDB4OSwgMHgyMSwgMHhmYiwgMHg1NCwgMHg0NCwgMHgyZCwgMHgxOF0sIGJpbmFyeS53cml0ZURvdWJsZShbXSwgTWF0aC5QSSkpOworICAgIGFzc2VydC5kZWVwRXF1YWwoCisgICAgICBbMHg0MCwgMHg5LCAweDIxLCAweGZiLCAweDU0LCAweDQ0LCAweDJkLCAweDE4XSwKKyAgICAgIGJpbmFyeS53cml0ZURvdWJsZShbXSwgTWF0aC5QSSkKKyAgICApOwogCi0gICAgYXNzZXJ0LmRlZXBFcXVhbChbMHg3ZiwgMHhmMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0sIGJpbmFyeS53cml0ZURvdWJsZShbXSwgSW5maW5pdHkpKTsKLSAgICBhc3NlcnQuZGVlcEVxdWFsKFsweGZmLCAweGYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSwgYmluYXJ5LndyaXRlRG91YmxlKFtdLCAtSW5maW5pdHkpKTsKKyAgICBhc3NlcnQuZGVlcEVxdWFsKAorICAgICAgWzB4N2YsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdLAorICAgICAgYmluYXJ5LndyaXRlRG91YmxlKFtdLCBJbmZpbml0eSkKKyAgICApOworICAgIGFzc2VydC5kZWVwRXF1YWwoCisgICAgICBbMHhmZiwgMHhmMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0sCisgICAgICBiaW5hcnkud3JpdGVEb3VibGUoW10sIC1JbmZpbml0eSkKKyAgICApOwogCi0gICAgYXNzZXJ0LmRlZXBFcXVhbChbMHg3ZiwgMHhmOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0sIGJpbmFyeS53cml0ZURvdWJsZShbXSwgTmFOKSk7CisgICAgYXNzZXJ0LmRlZXBFcXVhbCgKKyAgICAgIFsweDdmLCAweGY4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSwKKyAgICAgIGJpbmFyeS53cml0ZURvdWJsZShbXSwgTmFOKQorICAgICk7CiAKLSAgICBhc3NlcnQuZGVlcEVxdWFsKFsweDNmLCAweGQ1LCAweDU1LCAweDU1LCAweDU1LCAweDU1LCAweDU1LCAweDU1XSwgYmluYXJ5LndyaXRlRG91YmxlKFtdLCAxLzMpKTsKKyAgICBhc3NlcnQuZGVlcEVxdWFsKAorICAgICAgWzB4M2YsIDB4ZDUsIDB4NTUsIDB4NTUsIDB4NTUsIDB4NTUsIDB4NTUsIDB4NTVdLAorICAgICAgYmluYXJ5LndyaXRlRG91YmxlKFtdLCAxIC8gMykKKyAgICApOwogCiAgICAgLy8gTWluIHN1Ym5vcm1hbCBwb3NpdGl2ZSBkb3VibGUKLSAgICBhc3NlcnQuZGVlcEVxdWFsKFsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxXSwgYmluYXJ5LndyaXRlRG91YmxlKFtdLCA0Ljk0MDY1NjQ1ODQxMjQ2NTRlLTMyNCkpOworICAgIGFzc2VydC5kZWVwRXF1YWwoCisgICAgICBbMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMV0sCisgICAgICBiaW5hcnkud3JpdGVEb3VibGUoW10sIDQuOTQwNjU2NDU4NDEyNDY1NGUtMzI0KQorICAgICk7CiAgICAgLy8gTWluIG5vcm1hbCBwb3NpdGl2ZSBkb3VibGUKLSAgICBhc3NlcnQuZGVlcEVxdWFsKFsweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSwgYmluYXJ5LndyaXRlRG91YmxlKFtdLCAyLjIyNTA3Mzg1ODUwNzIwMTRlLTMwOCkpOworICAgIGFzc2VydC5kZWVwRXF1YWwoCisgICAgICBbMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0sCisgICAgICBiaW5hcnkud3JpdGVEb3VibGUoW10sIDIuMjI1MDczODU4NTA3MjAxNGUtMzA4KQorICAgICk7CiAgICAgLy8gTWF4IHBvc2l0aXZlIGRvdWJsZQotICAgIGFzc2VydC5kZWVwRXF1YWwoWzB4N2YsIDB4ZWYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZdLCBiaW5hcnkud3JpdGVEb3VibGUoW10sIDEuNzk3NjkzMTM0ODYyMzE1N2UzMDgpKTsKKyAgICBhc3NlcnQuZGVlcEVxdWFsKAorICAgICAgWzB4N2YsIDB4ZWYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZdLAorICAgICAgYmluYXJ5LndyaXRlRG91YmxlKFtdLCAxLjc5NzY5MzEzNDg2MjMxNTdlMzA4KQorICAgICk7CiAgICAgYXNzZXJ0LmVuZCgpOwogICB9CiB9OwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy90ZXN0L2Jyb3dzZXJfY2xpZW50LmpzIGIvbGliL25vZGVqcy90ZXN0L2Jyb3dzZXJfY2xpZW50LmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2RiNTQzLi4wMDAwMDAwCi0tLSBhL2xpYi9ub2RlanMvdGVzdC9icm93c2VyX2NsaWVudC5qcworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLQotdmFyIGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpOwotdmFyIHRocmlmdCA9IHJlcXVpcmUoJ3RocmlmdCcpOwotdmFyIGhlbHBlcnMgPSByZXF1aXJlKCcuL2hlbHBlcnMnKTsKLXZhciBUaHJpZnRUZXN0ID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL1RocmlmdFRlc3QnKTsKLXZhciBUaHJpZnRUZXN0RHJpdmVyID0gcmVxdWlyZSgnLi90ZXN0X2RyaXZlcicpLlRocmlmdFRlc3REcml2ZXI7Ci0KLS8vIGNyZWF0ZVhIUkNvbm5lY3Rpb24gY3JlYXRlV1NDb25uZWN0aW9uCi12YXIgY29ubmVjdGlvbiA9IHRocmlmdC5jcmVhdGVYSFJDb25uZWN0aW9uKCJsb2NhbGhvc3QiLCA5MDkwLCB7Ci0gICAgdHJhbnNwb3J0OiBoZWxwZXJzLnRyYW5zcG9ydHNbJ2J1ZmZlcmVkJ10sCi0gICAgcHJvdG9jb2w6IGhlbHBlcnMucHJvdG9jb2xzWydqc29uJ10sCi0gICAgcGF0aDogJy90ZXN0JwotfSk7Ci0KLWNvbm5lY3Rpb24ub24oJ2Vycm9yJywgZnVuY3Rpb24oZXJyKSB7Ci0gICAgYXNzZXJ0KGZhbHNlLCBlcnIpOwotfSk7Ci0KLS8vIFVuY29tbWVudCB0aGUgZm9sbG93aW5nIGxpbmUgdG8gc3RhcnQgYSB3ZWJzb2NrZXRzIGNvbm5lY3Rpb24KLS8vIGNvbm5lY3Rpb24ub3BlbigpOwotCi0vLyBjcmVhdGVXU0NsaWVudCBjcmVhdGVYSFJDbGllbnQKLXZhciBjbGllbnQgPSB0aHJpZnQuY3JlYXRlWEhSQ2xpZW50KFRocmlmdFRlc3QsIGNvbm5lY3Rpb24pOwotCi1UaHJpZnRUZXN0RHJpdmVyKGNsaWVudCwgZnVuY3Rpb24gKHN0YXR1cykgewotICAgIGNvbnNvbGUubG9nKCdCcm93c2VyOicsIHN0YXR1cyk7Ci19KTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvdGVzdC9jbGllbnQuanMgYi9saWIvbm9kZWpzL3Rlc3QvY2xpZW50LmpzCmluZGV4IDkxMzY1ZmMuLjQ5ZTNhNWUgMTAwNjQ0Ci0tLSBhL2xpYi9ub2RlanMvdGVzdC9jbGllbnQuanMKKysrIGIvbGliL25vZGVqcy90ZXN0L2NsaWVudC5qcwpAQCAtMTksMTEwICsxOSwxNTEgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLXZhciBmcyA9IHJlcXVpcmUoJ2ZzJyk7Ci12YXIgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0Jyk7Ci12YXIgdGhyaWZ0ID0gcmVxdWlyZSgndGhyaWZ0Jyk7Ci12YXIgaGVscGVycyA9IHJlcXVpcmUoJy4vaGVscGVycycpOwotdmFyIFRocmlmdFRlc3QgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvVGhyaWZ0VGVzdCcpOwotdmFyIFRocmlmdFRlc3REcml2ZXIgPSByZXF1aXJlKCcuL3Rlc3RfZHJpdmVyJykuVGhyaWZ0VGVzdERyaXZlcjsKLXZhciBUaHJpZnRUZXN0RHJpdmVyUHJvbWlzZSA9IHJlcXVpcmUoJy4vdGVzdF9kcml2ZXInKS5UaHJpZnRUZXN0RHJpdmVyUHJvbWlzZTsKLXZhciBTZWNvbmRTZXJ2aWNlID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL1NlY29uZFNlcnZpY2UnKTsKLXZhciB0dHlwZXMgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvVGhyaWZ0VGVzdF90eXBlcycpOworY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgiYXNzZXJ0Iik7Citjb25zdCB0aHJpZnQgPSByZXF1aXJlKCJ0aHJpZnQiKTsKK2NvbnN0IGhlbHBlcnMgPSByZXF1aXJlKCIuL2hlbHBlcnMiKTsKIAotdmFyIHByb2dyYW0gPSByZXF1aXJlKCdjb21tYW5kZXInKTsKK2NvbnN0IFRocmlmdFRlc3QgPSByZXF1aXJlKGAuLyR7aGVscGVycy5nZW5QYXRofS9UaHJpZnRUZXN0YCk7Citjb25zdCBUaHJpZnRUZXN0RHJpdmVyID0gcmVxdWlyZSgiLi90ZXN0X2RyaXZlciIpLlRocmlmdFRlc3REcml2ZXI7Citjb25zdCBUaHJpZnRUZXN0RHJpdmVyUHJvbWlzZSA9IHJlcXVpcmUoIi4vdGVzdF9kcml2ZXIiKQorICAuVGhyaWZ0VGVzdERyaXZlclByb21pc2U7Citjb25zdCBTZWNvbmRTZXJ2aWNlID0gcmVxdWlyZShgLi8ke2hlbHBlcnMuZ2VuUGF0aH0vU2Vjb25kU2VydmljZWApOworCitjb25zdCBwcm9ncmFtID0gcmVxdWlyZSgiY29tbWFuZGVyIik7CiAKIHByb2dyYW0KLSAgLm9wdGlvbignLXAsIC0tcHJvdG9jb2wgPHByb3RvY29sPicsICdTZXQgdGhyaWZ0IHByb3RvY29sIChiaW5hcnl8anNvbikgW3Byb3RvY29sXScpCi0gIC5vcHRpb24oJy10LCAtLXRyYW5zcG9ydCA8dHJhbnNwb3J0PicsICdTZXQgdGhyaWZ0IHRyYW5zcG9ydCAoYnVmZmVyZWR8ZnJhbWVkKSBbdHJhbnNwb3J0XScpCi0gIC5vcHRpb24oJy0tcG9ydCA8cG9ydD4nLCAnU2V0IHRocmlmdCBzZXJ2ZXIgcG9ydCBudW1iZXIgdG8gY29ubmVjdCcsIDkwOTApCi0gIC5vcHRpb24oJy0taG9zdCA8aG9zdD4nLCAnU2V0IHRocmlmdCBzZXJ2ZXIgaG9zdCB0byBjb25uZWN0JywgJ2xvY2FsaG9zdCcpCi0gIC5vcHRpb24oJy0tc3NsJywgJ3VzZSBTU0wgdHJhbnNwb3J0JykKLSAgLm9wdGlvbignLS1wcm9taXNlJywgJ3Rlc3Qgd2l0aCBwcm9taXNlIHN0eWxlIGZ1bmN0aW9ucycpCi0gIC5vcHRpb24oJy10LCAtLXR5cGUgPHR5cGU+JywgJ1NlbGVjdCBzZXJ2ZXIgdHlwZSAodGNwfG11bHRpcGxleHxodHRwKScsICd0Y3AnKQorICAub3B0aW9uKAorICAgICItcCwgLS1wcm90b2NvbCA8cHJvdG9jb2w+IiwKKyAgICAiU2V0IHRocmlmdCBwcm90b2NvbCAoYmluYXJ5fGNvbXBhY3R8anNvbikgW3Byb3RvY29sXSIKKyAgKQorICAub3B0aW9uKAorICAgICItdCwgLS10cmFuc3BvcnQgPHRyYW5zcG9ydD4iLAorICAgICJTZXQgdGhyaWZ0IHRyYW5zcG9ydCAoYnVmZmVyZWR8ZnJhbWVkfGh0dHApIFt0cmFuc3BvcnRdIgorICApCisgIC5vcHRpb24oIi0tcG9ydCA8cG9ydD4iLCAiU2V0IHRocmlmdCBzZXJ2ZXIgcG9ydCBudW1iZXIgdG8gY29ubmVjdCIsIDkwOTApCisgIC5vcHRpb24oIi0taG9zdCA8aG9zdD4iLCAiU2V0IHRocmlmdCBzZXJ2ZXIgaG9zdCB0byBjb25uZWN0IiwgImxvY2FsaG9zdCIpCisgIC5vcHRpb24oCisgICAgIi0tZG9tYWluLXNvY2tldCA8cGF0aD4iLAorICAgICJTZXQgdGhyaWZ0IHNlcnZlciB1bml4IGRvbWFpbiBzb2NrZXQgdG8gY29ubmVjdCIKKyAgKQorICAub3B0aW9uKCItLXNzbCIsICJ1c2UgU1NMIHRyYW5zcG9ydCIpCisgIC5vcHRpb24oIi0tY2FsbGJhY2siLCAidGVzdCB3aXRoIGNhbGxiYWNrIHN0eWxlIGZ1bmN0aW9ucyIpCisgIC5vcHRpb24oCisgICAgIi10LCAtLXR5cGUgPHR5cGU+IiwKKyAgICAiU2VsZWN0IHNlcnZlciB0eXBlIChodHRwfG11bHRpcGxleHx0Y3B8d2Vic29ja2V0KSIsCisgICAgInRjcCIKKyAgKQorICAub3B0aW9uKCItLWVzNiIsICJVc2UgZXM2IGNvZGUiKQorICAub3B0aW9uKCItLWVzNSIsICJVc2UgZXM1IGNvZGUiKQogICAucGFyc2UocHJvY2Vzcy5hcmd2KTsKIAotdmFyIGhvc3QgPSBwcm9ncmFtLmhvc3Q7Ci12YXIgcG9ydCA9IHByb2dyYW0ucG9ydDsKLXZhciB0eXBlID0gcHJvZ3JhbS50eXBlOwotdmFyIHNzbCA9IHByb2dyYW0uc3NsOwotdmFyIHByb21pc2UgPSBwcm9ncmFtLnByb21pc2U7Citjb25zdCBob3N0ID0gcHJvZ3JhbS5ob3N0OworY29uc3QgcG9ydCA9IHByb2dyYW0ucG9ydDsKK2NvbnN0IGRvbWFpblNvY2tldCA9IHByb2dyYW0uZG9tYWluU29ja2V0OworY29uc3Qgc3NsID0gcHJvZ3JhbS5zc2w7CitsZXQgdHlwZSA9IHByb2dyYW0udHlwZTsKIAotdmFyIG9wdGlvbnMgPSB7CisvKiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGNyb3NzIHRlc3QgaW52b2NhdGlvbiBmb3IgaHR0cCB0cmFuc3BvcnQgdGVzdGluZyAqLworaWYgKHByb2dyYW0udHJhbnNwb3J0ID09PSAiaHR0cCIpIHsKKyAgcHJvZ3JhbS50cmFuc3BvcnQgPSAiYnVmZmVyZWQiOworICB0eXBlID0gImh0dHAiOworfQorCitjb25zdCBvcHRpb25zID0gewogICB0cmFuc3BvcnQ6IGhlbHBlcnMudHJhbnNwb3J0c1twcm9ncmFtLnRyYW5zcG9ydF0sCiAgIHByb3RvY29sOiBoZWxwZXJzLnByb3RvY29sc1twcm9ncmFtLnByb3RvY29sXQogfTsKIAotaWYgKHR5cGUgPT09ICdodHRwJyB8fCB0eXBlID09PSAnd2Vic29ja2V0JykgewotICBvcHRpb25zLnBhdGggPSAnL3Rlc3QnOworaWYgKHR5cGUgPT09ICJodHRwIiB8fCB0eXBlID09PSAid2Vic29ja2V0IikgeworICBvcHRpb25zLnBhdGggPSAiL3Rlc3QiOwogfQogCi1pZiAodHlwZSA9PT0gJ2h0dHAnKSB7Ci0gIG9wdGlvbnMuaGVhZGVycyA9IHsiQ29ubmVjdGlvbiI6ICJjbG9zZSJ9OworaWYgKHR5cGUgPT09ICJodHRwIikgeworICBvcHRpb25zLmhlYWRlcnMgPSB7IENvbm5lY3Rpb246ICJjbG9zZSIgfTsKIH0KIAogaWYgKHNzbCkgewotICBpZiAodHlwZSA9PT0gJ3RjcCcgfHwgdHlwZSA9PT0gJ211bHRpcGxleCcpIHsKKyAgaWYgKHR5cGUgPT09ICJ0Y3AiIHx8IHR5cGUgPT09ICJtdWx0aXBsZXgiKSB7CiAgICAgb3B0aW9ucy5yZWplY3RVbmF1dGhvcml6ZWQgPSBmYWxzZTsKLSAgfSBlbHNlIGlmICh0eXBlID09PSAnaHR0cCcpIHsKKyAgfSBlbHNlIGlmICh0eXBlID09PSAiaHR0cCIpIHsKICAgICBvcHRpb25zLm5vZGVPcHRpb25zID0geyByZWplY3RVbmF1dGhvcml6ZWQ6IGZhbHNlIH07CiAgICAgb3B0aW9ucy5odHRwcyA9IHRydWU7Ci0gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3dlYnNvY2tldCcpIHsKKyAgfSBlbHNlIGlmICh0eXBlID09PSAid2Vic29ja2V0IikgewogICAgIG9wdGlvbnMud3NPcHRpb25zID0geyByZWplY3RVbmF1dGhvcml6ZWQ6IGZhbHNlIH07CiAgICAgb3B0aW9ucy5zZWN1cmUgPSB0cnVlOwogICB9CiB9CiAKLXZhciBjb25uZWN0aW9uOwotdmFyIGNsaWVudDsKLXZhciB0ZXN0RHJpdmVyID0gcHJvbWlzZSA/IFRocmlmdFRlc3REcml2ZXJQcm9taXNlIDogVGhyaWZ0VGVzdERyaXZlcjsKK2xldCBjb25uZWN0aW9uOworbGV0IGNsaWVudDsKK2NvbnN0IHRlc3REcml2ZXIgPSBwcm9ncmFtLmNhbGxiYWNrCisgID8gVGhyaWZ0VGVzdERyaXZlcgorICA6IFRocmlmdFRlc3REcml2ZXJQcm9taXNlOworaWYgKGhlbHBlcnMuZWNtYU1vZGUgPT09ICJlczYiICYmIHByb2dyYW0uY2FsbGJhY2spIHsKKyAgY29uc29sZS5sb2coIkVTNiBkb2VzIG5vdCBzdXBwb3J0IGNhbGxiYWNrIHN0eWxlIik7CisgIHByb2Nlc3MuZXhpdCgwKTsKK30KIAotaWYgKHR5cGUgPT09ICd0Y3AnIHx8IHR5cGUgPT09ICdtdWx0aXBsZXgnKSB7Ci0gIGNvbm5lY3Rpb24gPSBzc2wgPwotICAgIHRocmlmdC5jcmVhdGVTU0xDb25uZWN0aW9uKGhvc3QsIHBvcnQsIG9wdGlvbnMpIDoKLSAgICB0aHJpZnQuY3JlYXRlQ29ubmVjdGlvbihob3N0LCBwb3J0LCBvcHRpb25zKTsKLX0gZWxzZSBpZiAodHlwZSA9PT0gJ2h0dHAnKSB7Ci0gIGNvbm5lY3Rpb24gPSB0aHJpZnQuY3JlYXRlSHR0cENvbm5lY3Rpb24oaG9zdCwgcG9ydCwgb3B0aW9ucyk7Ci19IGVsc2UgaWYgKHR5cGUgPT09ICd3ZWJzb2NrZXQnKSB7CitpZiAodHlwZSA9PT0gInRjcCIgfHwgdHlwZSA9PT0gIm11bHRpcGxleCIpIHsKKyAgaWYgKGRvbWFpblNvY2tldCkgeworICAgIGNvbm5lY3Rpb24gPSB0aHJpZnQuY3JlYXRlVURTQ29ubmVjdGlvbihkb21haW5Tb2NrZXQsIG9wdGlvbnMpOworICB9IGVsc2UgeworICAgIGNvbm5lY3Rpb24gPSBzc2wKKyAgICAgID8gdGhyaWZ0LmNyZWF0ZVNTTENvbm5lY3Rpb24oaG9zdCwgcG9ydCwgb3B0aW9ucykKKyAgICAgIDogdGhyaWZ0LmNyZWF0ZUNvbm5lY3Rpb24oaG9zdCwgcG9ydCwgb3B0aW9ucyk7CisgIH0KK30gZWxzZSBpZiAodHlwZSA9PT0gImh0dHAiKSB7CisgIGlmIChkb21haW5Tb2NrZXQpIHsKKyAgICBjb25uZWN0aW9uID0gdGhyaWZ0LmNyZWF0ZUh0dHBVRFNDb25uZWN0aW9uKGRvbWFpblNvY2tldCwgb3B0aW9ucyk7CisgIH0gZWxzZSB7CisgICAgY29ubmVjdGlvbiA9IHRocmlmdC5jcmVhdGVIdHRwQ29ubmVjdGlvbihob3N0LCBwb3J0LCBvcHRpb25zKTsKKyAgfQorfSBlbHNlIGlmICh0eXBlID09PSAid2Vic29ja2V0IikgewogICBjb25uZWN0aW9uID0gdGhyaWZ0LmNyZWF0ZVdTQ29ubmVjdGlvbihob3N0LCBwb3J0LCBvcHRpb25zKTsKICAgY29ubmVjdGlvbi5vcGVuKCk7CiB9CiAKLWNvbm5lY3Rpb24ub24oJ2Vycm9yJywgZnVuY3Rpb24oZXJyKSB7Ci0gICAgYXNzZXJ0KGZhbHNlLCBlcnIpOworY29ubmVjdGlvbi5vbigiZXJyb3IiLCBmdW5jdGlvbihlcnIpIHsKKyAgYXNzZXJ0KGZhbHNlLCBlcnIpOwogfSk7CiAKLWlmICh0eXBlID09PSAndGNwJykgeworaWYgKHR5cGUgPT09ICJ0Y3AiKSB7CiAgIGNsaWVudCA9IHRocmlmdC5jcmVhdGVDbGllbnQoVGhyaWZ0VGVzdCwgY29ubmVjdGlvbik7CiAgIHJ1blRlc3RzKCk7Ci19IGVsc2UgaWYgKHR5cGUgPT09ICdtdWx0aXBsZXgnKSB7Ci0gIHZhciBtcCA9IG5ldyB0aHJpZnQuTXVsdGlwbGV4ZXIoKTsKK30gZWxzZSBpZiAodHlwZSA9PT0gIm11bHRpcGxleCIpIHsKKyAgY29uc3QgbXAgPSBuZXcgdGhyaWZ0Lk11bHRpcGxleGVyKCk7CiAgIGNsaWVudCA9IG1wLmNyZWF0ZUNsaWVudCgiVGhyaWZ0VGVzdCIsIFRocmlmdFRlc3QsIGNvbm5lY3Rpb24pOwotICBzZWNvbmRjbGllbnQgPSBtcC5jcmVhdGVDbGllbnQoIlNlY29uZFNlcnZpY2UiLCBTZWNvbmRTZXJ2aWNlLCBjb25uZWN0aW9uKTsKKyAgY29uc3Qgc2Vjb25kY2xpZW50ID0gbXAuY3JlYXRlQ2xpZW50KAorICAgICJTZWNvbmRTZXJ2aWNlIiwKKyAgICBTZWNvbmRTZXJ2aWNlLAorICAgIGNvbm5lY3Rpb24KKyAgKTsKIAotICBjb25uZWN0aW9uLm9uKCdjb25uZWN0JywgZnVuY3Rpb24oKSB7CisgIGNvbm5lY3Rpb24ub24oImNvbm5lY3QiLCBmdW5jdGlvbigpIHsKICAgICBzZWNvbmRjbGllbnQuc2Vjb25kdGVzdFN0cmluZygiVGVzdCIsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKICAgICAgIGFzc2VydCghZXJyKTsKLSAgICAgIGFzc2VydC5lcXVhbCgiVGVzdCIsIHJlc3BvbnNlKTsKKyAgICAgIGFzc2VydC5lcXVhbCgndGVzdFN0cmluZygiVGVzdCIpJywgcmVzcG9uc2UpOwogICAgIH0pOwogCiAgICAgcnVuVGVzdHMoKTsKICAgfSk7Ci19IGVsc2UgaWYgKHR5cGUgPT09ICdodHRwJykgeworfSBlbHNlIGlmICh0eXBlID09PSAiaHR0cCIpIHsKICAgY2xpZW50ID0gdGhyaWZ0LmNyZWF0ZUh0dHBDbGllbnQoVGhyaWZ0VGVzdCwgY29ubmVjdGlvbik7CiAgIHJ1blRlc3RzKCk7Ci19IGVsc2UgaWYgKHR5cGUgPT09ICd3ZWJzb2NrZXQnKSB7Cit9IGVsc2UgaWYgKHR5cGUgPT09ICJ3ZWJzb2NrZXQiKSB7CiAgIGNsaWVudCA9IHRocmlmdC5jcmVhdGVXU0NsaWVudChUaHJpZnRUZXN0LCBjb25uZWN0aW9uKTsKICAgcnVuVGVzdHMoKTsKIH0KIAogZnVuY3Rpb24gcnVuVGVzdHMoKSB7Ci0gIHRlc3REcml2ZXIoY2xpZW50LCBmdW5jdGlvbiAoc3RhdHVzKSB7CisgIHRlc3REcml2ZXIoY2xpZW50LCBmdW5jdGlvbihzdGF0dXMpIHsKICAgICBjb25zb2xlLmxvZyhzdGF0dXMpOwotICAgIGlmICh0eXBlID09PSAnaHR0cCcgfHwgdHlwZSA9PT0gJ3dlYnNvY2tldCcpIHsKLSAgICAgIHByb2Nlc3MuZXhpdCgwKTsKLSAgICB9IGVsc2UgeworICAgIGlmICh0eXBlICE9PSAiaHR0cCIgJiYgdHlwZSAhPT0gIndlYnNvY2tldCIpIHsKICAgICAgIGNvbm5lY3Rpb24uZW5kKCk7CiAgICAgfQorICAgIGlmICh0eXBlICE9PSAibXVsdGlwbGV4IikgeworICAgICAgcHJvY2Vzcy5leGl0KDApOworICAgIH0KICAgfSk7CiB9CiAKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvdGVzdC9kZWVwLWNvbnN0cnVjdG9yLnRlc3QuanMgYi9saWIvbm9kZWpzL3Rlc3QvZGVlcC1jb25zdHJ1Y3Rvci50ZXN0LmpzCmluZGV4IDhkZDI5ZWUuLjUwNGRhY2YgMTAwNjQ0Ci0tLSBhL2xpYi9ub2RlanMvdGVzdC9kZWVwLWNvbnN0cnVjdG9yLnRlc3QuanMKKysrIGIvbGliL25vZGVqcy90ZXN0L2RlZXAtY29uc3RydWN0b3IudGVzdC5qcwpAQCAtMSwzNiArMSw1MiBAQAotdmFyIHR0eXBlcyA9IHJlcXVpcmUoJy4vZ2VuLW5vZGVqcy9Kc0RlZXBDb25zdHJ1Y3RvclRlc3RfdHlwZXMnKTsKLXZhciB0aHJpZnQgPSByZXF1aXJlKCd0aHJpZnQnKTsKLXZhciB0ZXN0ID0gcmVxdWlyZSgndGFwZScpOwotdmFyIGJ1ZmZlckVxdWFscyA9IHJlcXVpcmUoJ2J1ZmZlci1lcXVhbHMnKTsKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworY29uc3QgdHR5cGVzID0gcmVxdWlyZSgiLi9nZW4tbm9kZWpzL0pzRGVlcENvbnN0cnVjdG9yVGVzdF90eXBlcyIpOworY29uc3QgdGhyaWZ0ID0gcmVxdWlyZSgidGhyaWZ0Iik7Citjb25zdCB0ZXN0ID0gcmVxdWlyZSgidGFwZSIpOworY29uc3QgYnVmZmVyRXF1YWxzID0gcmVxdWlyZSgiYnVmZmVyLWVxdWFscyIpOwogCiBmdW5jdGlvbiBzZXJpYWxpemVCaW5hcnkoZGF0YSkgewotICB2YXIgYnVmZjsKLSAgdmFyIHRyYW5zcG9ydCA9IG5ldyB0aHJpZnQuVEJ1ZmZlcmVkVHJhbnNwb3J0KG51bGwsIGZ1bmN0aW9uKG1zZyl7CisgIGxldCBidWZmOworICBjb25zdCB0cmFuc3BvcnQgPSBuZXcgdGhyaWZ0LlRCdWZmZXJlZFRyYW5zcG9ydChudWxsLCBmdW5jdGlvbihtc2cpIHsKICAgICBidWZmID0gbXNnOwogICB9KTsKLSAgdmFyIHByb3QgPSBuZXcgdGhyaWZ0LlRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpOworICBjb25zdCBwcm90ID0gbmV3IHRocmlmdC5UQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KTsKICAgZGF0YS53cml0ZShwcm90KTsKICAgcHJvdC5mbHVzaCgpOwogICByZXR1cm4gYnVmZjsKLQogfQogCi0KIGZ1bmN0aW9uIGRlc2VyaWFsaXplQmluYXJ5KHNlcmlhbGl6ZWQsIHR5cGUpIHsKLSAgdmFyIHQgPSBuZXcgdGhyaWZ0LlRGcmFtZWRUcmFuc3BvcnQoc2VyaWFsaXplZCk7Ci0gIHZhciBwID0gbmV3IHRocmlmdC5UQmluYXJ5UHJvdG9jb2wodCk7Ci0gIHZhciBkYXRhID0gbmV3IHR5cGUoKTsKKyAgY29uc3QgdCA9IG5ldyB0aHJpZnQuVEZyYW1lZFRyYW5zcG9ydChzZXJpYWxpemVkKTsKKyAgY29uc3QgcCA9IG5ldyB0aHJpZnQuVEJpbmFyeVByb3RvY29sKHQpOworICBjb25zdCBkYXRhID0gbmV3IHR5cGUoKTsKICAgZGF0YS5yZWFkKHApOwogICByZXR1cm4gZGF0YTsKIH0KIAotCiBmdW5jdGlvbiBzZXJpYWxpemVKU09OKGRhdGEpIHsKLSAgdmFyIGJ1ZmY7Ci0gIHZhciB0cmFuc3BvcnQgPSBuZXcgdGhyaWZ0LlRCdWZmZXJlZFRyYW5zcG9ydChudWxsLCBmdW5jdGlvbihtc2cpeworICBsZXQgYnVmZjsKKyAgY29uc3QgdHJhbnNwb3J0ID0gbmV3IHRocmlmdC5UQnVmZmVyZWRUcmFuc3BvcnQobnVsbCwgZnVuY3Rpb24obXNnKSB7CiAgICAgYnVmZiA9IG1zZzsKICAgfSk7Ci0gIHZhciBwcm90b2NvbCAgPSBuZXcgdGhyaWZ0LlRKU09OUHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgY29uc3QgcHJvdG9jb2wgPSBuZXcgdGhyaWZ0LlRKU09OUHJvdG9jb2wodHJhbnNwb3J0KTsKICAgcHJvdG9jb2wud3JpdGVNZXNzYWdlQmVnaW4oIiIsIDAsIDApOwogICBkYXRhLndyaXRlKHByb3RvY29sKTsKICAgcHJvdG9jb2wud3JpdGVNZXNzYWdlRW5kKCk7CkBAIC0zOCw0NSArNTQsNDEgQEAKICAgcmV0dXJuIGJ1ZmY7CiB9CiAKLQogZnVuY3Rpb24gZGVzZXJpYWxpemVKU09OKHNlcmlhbGl6ZWQsIHR5cGUpIHsKLSAgdmFyIHRyYW5zcG9ydCA9IG5ldyB0aHJpZnQuVEZyYW1lZFRyYW5zcG9ydChzZXJpYWxpemVkKTsKLSAgdmFyIHByb3RvY29sICA9IG5ldyB0aHJpZnQuVEpTT05Qcm90b2NvbCh0cmFuc3BvcnQpOworICBjb25zdCB0cmFuc3BvcnQgPSBuZXcgdGhyaWZ0LlRGcmFtZWRUcmFuc3BvcnQoc2VyaWFsaXplZCk7CisgIGNvbnN0IHByb3RvY29sID0gbmV3IHRocmlmdC5USlNPTlByb3RvY29sKHRyYW5zcG9ydCk7CiAgIHByb3RvY29sLnJlYWRNZXNzYWdlQmVnaW4oKTsKLSAgdmFyIGRhdGEgPSBuZXcgdHlwZSgpOworICBjb25zdCBkYXRhID0gbmV3IHR5cGUoKTsKICAgZGF0YS5yZWFkKHByb3RvY29sKTsKICAgcHJvdG9jb2wucmVhZE1lc3NhZ2VFbmQoKTsKICAgcmV0dXJuIGRhdGE7CiB9CiAKLQogZnVuY3Rpb24gY3JlYXRlVGhyaWZ0T2JqKCkgewotCiAgIHJldHVybiBuZXcgdHR5cGVzLkNvbXBsZXgoewotCi0gICAgc3RydWN0X2ZpZWxkOiBuZXcgdHR5cGVzLlNpbXBsZSh7dmFsdWU6ICdhJ30pLAorICAgIHN0cnVjdF9maWVsZDogbmV3IHR0eXBlcy5TaW1wbGUoeyB2YWx1ZTogImEiIH0pLAogCiAgICAgc3RydWN0X2xpc3RfZmllbGQ6IFsKLSAgICAgIG5ldyB0dHlwZXMuU2ltcGxlKHt2YWx1ZTogJ2InfSksCi0gICAgICBuZXcgdHR5cGVzLlNpbXBsZSh7dmFsdWU6ICdjJ30pLAorICAgICAgbmV3IHR0eXBlcy5TaW1wbGUoeyB2YWx1ZTogImIiIH0pLAorICAgICAgbmV3IHR0eXBlcy5TaW1wbGUoeyB2YWx1ZTogImMiIH0pCiAgICAgXSwKIAogICAgIHN0cnVjdF9zZXRfZmllbGQ6IFsKLSAgICAgIG5ldyB0dHlwZXMuU2ltcGxlKHt2YWx1ZTogJ2QnfSksCi0gICAgICBuZXcgdHR5cGVzLlNpbXBsZSh7dmFsdWU6ICdlJ30pLAorICAgICAgbmV3IHR0eXBlcy5TaW1wbGUoeyB2YWx1ZTogImQiIH0pLAorICAgICAgbmV3IHR0eXBlcy5TaW1wbGUoeyB2YWx1ZTogImUiIH0pCiAgICAgXSwKIAogICAgIHN0cnVjdF9tYXBfZmllbGQ6IHsKLSAgICAgIEE6IG5ldyB0dHlwZXMuU2ltcGxlKHt2YWx1ZTogJ2YnfSksCi0gICAgICBCOiBuZXcgdHR5cGVzLlNpbXBsZSh7dmFsdWU6ICdnJ30pCisgICAgICBBOiBuZXcgdHR5cGVzLlNpbXBsZSh7IHZhbHVlOiAiZiIgfSksCisgICAgICBCOiBuZXcgdHR5cGVzLlNpbXBsZSh7IHZhbHVlOiAiZyIgfSkKICAgICB9LAogCiAgICAgc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkOiBbCiAgICAgICBbCiAgICAgICAgIHsKICAgICAgICAgICBDOiBbCi0gICAgICAgICAgICBuZXcgdHR5cGVzLlNpbXBsZSh7dmFsdWU6ICdoJ30pLAotICAgICAgICAgICAgbmV3IHR0eXBlcy5TaW1wbGUoe3ZhbHVlOiAnaSd9KQorICAgICAgICAgICAgbmV3IHR0eXBlcy5TaW1wbGUoeyB2YWx1ZTogImgiIH0pLAorICAgICAgICAgICAgbmV3IHR0eXBlcy5TaW1wbGUoeyB2YWx1ZTogImkiIH0pCiAgICAgICAgICAgXQogICAgICAgICB9CiAgICAgICBdCkBAIC04NSw0NiArOTcsNTcgQEAKICAgICBzdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQyOiB7CiAgICAgICBEOiBbCiAgICAgICAgIHsKLSAgICAgICAgICBEQTogbmV3IHR0eXBlcy5TaW1wbGUoe3ZhbHVlOiAnaid9KQorICAgICAgICAgIERBOiBuZXcgdHR5cGVzLlNpbXBsZSh7IHZhbHVlOiAiaiIgfSkKICAgICAgICAgfSwKICAgICAgICAgewotICAgICAgICAgIERCOiBuZXcgdHR5cGVzLlNpbXBsZSh7dmFsdWU6ICdrJ30pCisgICAgICAgICAgREI6IG5ldyB0dHlwZXMuU2ltcGxlKHsgdmFsdWU6ICJrIiB9KQogICAgICAgICB9CiAgICAgICBdCi0gICAgfQotICB9Ci0gICk7CisgICAgfSwKKworICAgIGxpc3Rfb2ZfbGlzdF9maWVsZDogWworICAgICAgWyJsMDAiLCAibDAxIiwgImwwMiJdLAorICAgICAgWyJsMTAiLCAibDExIiwgImwxMiJdLAorICAgICAgWyJsMjAiLCAibDIxIiwgImwyMiJdCisgICAgXSwKKworICAgIGxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkOiBbCisgICAgICBbCisgICAgICAgIFsibTAwMCIsICJtMDAxIiwgIm0wMDIiXSwKKyAgICAgICAgWyJtMDEwIiwgIm0wMTEiLCAibTAxMiJdLAorICAgICAgICBbIm0wMjAiLCAibTAyMSIsICJtMDIyIl0KKyAgICAgIF0sCisgICAgICBbCisgICAgICAgIFsibTEwMCIsICJtMTAxIiwgIm0xMDIiXSwKKyAgICAgICAgWyJtMTEwIiwgIm0xMTEiLCAibTExMiJdLAorICAgICAgICBbIm0xMjAiLCAibTEyMSIsICJtMTIyIl0KKyAgICAgIF0sCisgICAgICBbCisgICAgICAgIFsibTIwMCIsICJtMjAxIiwgIm0yMDIiXSwKKyAgICAgICAgWyJtMjEwIiwgIm0yMTEiLCAibTIxMiJdLAorICAgICAgICBbIm0yMjAiLCAibTIyMSIsICJtMjIyIl0KKyAgICAgIF0KKyAgICBdCisgIH0pOwogfQogCi0KIGZ1bmN0aW9uIGNyZWF0ZUpzT2JqKCkgewotCiAgIHJldHVybiB7CisgICAgc3RydWN0X2ZpZWxkOiB7IHZhbHVlOiAiYSIgfSwKIAotICAgIHN0cnVjdF9maWVsZDoge3ZhbHVlOiAnYSd9LAorICAgIHN0cnVjdF9saXN0X2ZpZWxkOiBbeyB2YWx1ZTogImIiIH0sIHsgdmFsdWU6ICJjIiB9XSwKIAotICAgIHN0cnVjdF9saXN0X2ZpZWxkOiBbCi0gICAgICB7dmFsdWU6ICdiJ30sCi0gICAgICB7dmFsdWU6ICdjJ30sCi0gICAgXSwKLQotICAgIHN0cnVjdF9zZXRfZmllbGQ6IFsKLSAgICAgIHt2YWx1ZTogJ2QnfSwKLSAgICAgIHt2YWx1ZTogJ2UnfSwKLSAgICBdLAorICAgIHN0cnVjdF9zZXRfZmllbGQ6IFt7IHZhbHVlOiAiZCIgfSwgeyB2YWx1ZTogImUiIH1dLAogCiAgICAgc3RydWN0X21hcF9maWVsZDogewotICAgICAgQToge3ZhbHVlOiAnZid9LAotICAgICAgQjoge3ZhbHVlOiAnZyd9CisgICAgICBBOiB7IHZhbHVlOiAiZiIgfSwKKyAgICAgIEI6IHsgdmFsdWU6ICJnIiB9CiAgICAgfSwKIAogICAgIHN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZDogWwogICAgICAgWwogICAgICAgICB7Ci0gICAgICAgICAgQzogWwotICAgICAgICAgICAge3ZhbHVlOiAnaCd9LAotICAgICAgICAgICAge3ZhbHVlOiAnaSd9Ci0gICAgICAgICAgXQorICAgICAgICAgIEM6IFt7IHZhbHVlOiAiaCIgfSwgeyB2YWx1ZTogImkiIH1dCiAgICAgICAgIH0KICAgICAgIF0KICAgICBdLApAQCAtMTMyLDc5ICsxNTUsMTQyIEBACiAgICAgc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkMjogewogICAgICAgRDogWwogICAgICAgICB7Ci0gICAgICAgICAgREE6IHt2YWx1ZTogJ2onfQorICAgICAgICAgIERBOiB7IHZhbHVlOiAiaiIgfQogICAgICAgICB9LAogICAgICAgICB7Ci0gICAgICAgICAgREI6IHt2YWx1ZTogJ2snfQorICAgICAgICAgIERCOiB7IHZhbHVlOiAiayIgfQogICAgICAgICB9CiAgICAgICBdCi0gICAgfQorICAgIH0sCisKKyAgICBsaXN0X29mX2xpc3RfZmllbGQ6IFsKKyAgICAgIFsibDAwIiwgImwwMSIsICJsMDIiXSwKKyAgICAgIFsibDEwIiwgImwxMSIsICJsMTIiXSwKKyAgICAgIFsibDIwIiwgImwyMSIsICJsMjIiXQorICAgIF0sCisKKyAgICBsaXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZDogWworICAgICAgWworICAgICAgICBbIm0wMDAiLCAibTAwMSIsICJtMDAyIl0sCisgICAgICAgIFsibTAxMCIsICJtMDExIiwgIm0wMTIiXSwKKyAgICAgICAgWyJtMDIwIiwgIm0wMjEiLCAibTAyMiJdCisgICAgICBdLAorICAgICAgWworICAgICAgICBbIm0xMDAiLCAibTEwMSIsICJtMTAyIl0sCisgICAgICAgIFsibTExMCIsICJtMTExIiwgIm0xMTIiXSwKKyAgICAgICAgWyJtMTIwIiwgIm0xMjEiLCAibTEyMiJdCisgICAgICBdLAorICAgICAgWworICAgICAgICBbIm0yMDAiLCAibTIwMSIsICJtMjAyIl0sCisgICAgICAgIFsibTIxMCIsICJtMjExIiwgIm0yMTIiXSwKKyAgICAgICAgWyJtMjIwIiwgIm0yMjEiLCAibTIyMiJdCisgICAgICBdCisgICAgXQogICB9OwogfQogCi0KIGZ1bmN0aW9uIGFzc2VydFZhbHVlcyhvYmosIGFzc2VydCkgewotICAgIGFzc2VydC5lcXVhbHMob2JqLnN0cnVjdF9maWVsZC52YWx1ZSwgJ2EnKTsKLSAgICBhc3NlcnQuZXF1YWxzKG9iai5zdHJ1Y3RfbGlzdF9maWVsZFswXS52YWx1ZSwgJ2InKTsKLSAgICBhc3NlcnQuZXF1YWxzKG9iai5zdHJ1Y3RfbGlzdF9maWVsZFsxXS52YWx1ZSwgJ2MnKTsKLSAgICBhc3NlcnQuZXF1YWxzKG9iai5zdHJ1Y3Rfc2V0X2ZpZWxkWzBdLnZhbHVlLCAnZCcpOwotICAgIGFzc2VydC5lcXVhbHMob2JqLnN0cnVjdF9zZXRfZmllbGRbMV0udmFsdWUsICdlJyk7Ci0gICAgYXNzZXJ0LmVxdWFscyhvYmouc3RydWN0X21hcF9maWVsZC5BLnZhbHVlLCAnZicpOwotICAgIGFzc2VydC5lcXVhbHMob2JqLnN0cnVjdF9tYXBfZmllbGQuQi52YWx1ZSwgJ2cnKTsKLSAgICBhc3NlcnQuZXF1YWxzKG9iai5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGRbMF1bMF0uQ1swXS52YWx1ZSwgJ2gnKTsKLSAgICBhc3NlcnQuZXF1YWxzKG9iai5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGRbMF1bMF0uQ1sxXS52YWx1ZSwgJ2knKTsKLSAgICBhc3NlcnQuZXF1YWxzKG9iai5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQyLkRbMF0uREEudmFsdWUsICdqJyk7Ci0gICAgYXNzZXJ0LmVxdWFscyhvYmouc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkMi5EWzFdLkRCLnZhbHVlLCAnaycpOworICBhc3NlcnQuZXF1YWxzKG9iai5zdHJ1Y3RfZmllbGQudmFsdWUsICJhIik7CisgIGFzc2VydC5lcXVhbHMob2JqLnN0cnVjdF9saXN0X2ZpZWxkWzBdLnZhbHVlLCAiYiIpOworICBhc3NlcnQuZXF1YWxzKG9iai5zdHJ1Y3RfbGlzdF9maWVsZFsxXS52YWx1ZSwgImMiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmouc3RydWN0X3NldF9maWVsZFswXS52YWx1ZSwgImQiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmouc3RydWN0X3NldF9maWVsZFsxXS52YWx1ZSwgImUiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmouc3RydWN0X21hcF9maWVsZC5BLnZhbHVlLCAiZiIpOworICBhc3NlcnQuZXF1YWxzKG9iai5zdHJ1Y3RfbWFwX2ZpZWxkLkIudmFsdWUsICJnIik7CisgIGFzc2VydC5lcXVhbHMob2JqLnN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZFswXVswXS5DWzBdLnZhbHVlLCAiaCIpOworICBhc3NlcnQuZXF1YWxzKG9iai5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGRbMF1bMF0uQ1sxXS52YWx1ZSwgImkiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmouc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkMi5EWzBdLkRBLnZhbHVlLCAiaiIpOworICBhc3NlcnQuZXF1YWxzKG9iai5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQyLkRbMV0uREIudmFsdWUsICJrIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9maWVsZFswXVswXSwgImwwMCIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3RfZmllbGRbMF1bMV0sICJsMDEiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X2ZpZWxkWzBdWzJdLCAibDAyIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9maWVsZFsxXVswXSwgImwxMCIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3RfZmllbGRbMV1bMV0sICJsMTEiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X2ZpZWxkWzFdWzJdLCAibDEyIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9maWVsZFsyXVswXSwgImwyMCIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3RfZmllbGRbMl1bMV0sICJsMjEiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X2ZpZWxkWzJdWzJdLCAibDIyIik7CisKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMF1bMF1bMF0sICJtMDAwIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzBdWzBdWzFdLCAibTAwMSIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFswXVswXVsyXSwgIm0wMDIiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMF1bMV1bMF0sICJtMDEwIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzBdWzFdWzFdLCAibTAxMSIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFswXVsxXVsyXSwgIm0wMTIiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMF1bMl1bMF0sICJtMDIwIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzBdWzJdWzFdLCAibTAyMSIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFswXVsyXVsyXSwgIm0wMjIiKTsKKworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFsxXVswXVswXSwgIm0xMDAiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMV1bMF1bMV0sICJtMTAxIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzFdWzBdWzJdLCAibTEwMiIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFsxXVsxXVswXSwgIm0xMTAiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMV1bMV1bMV0sICJtMTExIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzFdWzFdWzJdLCAibTExMiIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFsxXVsyXVswXSwgIm0xMjAiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMV1bMl1bMV0sICJtMTIxIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzFdWzJdWzJdLCAibTEyMiIpOworCisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzJdWzBdWzBdLCAibTIwMCIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFsyXVswXVsxXSwgIm0yMDEiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMl1bMF1bMl0sICJtMjAyIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzJdWzFdWzBdLCAibTIxMCIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFsyXVsxXVsxXSwgIm0yMTEiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMl1bMV1bMl0sICJtMjEyIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzJdWzJdWzBdLCAibTIyMCIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFsyXVsyXVsxXSwgIm0yMjEiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMl1bMl1bMl0sICJtMjIyIik7CiB9CiAKIGZ1bmN0aW9uIGNyZWF0ZVRlc3RDYXNlcyhzZXJpYWxpemUsIGRlc2VyaWFsaXplKSB7Ci0KLSAgdmFyIGNhc2VzID0gewotCi0gICAgIlNlcmlhbGl6ZS9kZXNlcmlhbGl6ZSBzaG91bGQgcmV0dXJuIGVxdWFsIG9iamVjdCI6IGZ1bmN0aW9uKGFzc2VydCl7Ci0gICAgICB2YXIgdE9iaiA9IGNyZWF0ZVRocmlmdE9iaigpOwotICAgICAgdmFyIHJlY2VpdmVkID0gZGVzZXJpYWxpemUoc2VyaWFsaXplKHRPYmopLCB0dHlwZXMuQ29tcGxleCk7Ci0gICAgICBhc3NlcnQub2sodE9iaiAhPT0gcmVjZWl2ZWQsICdub3QgdGhlIHNhbWUgb2JqZWN0Jyk7CisgIGNvbnN0IGNhc2VzID0geworICAgICJTZXJpYWxpemUvZGVzZXJpYWxpemUgc2hvdWxkIHJldHVybiBlcXVhbCBvYmplY3QiOiBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICAgIGNvbnN0IHRPYmogPSBjcmVhdGVUaHJpZnRPYmooKTsKKyAgICAgIGNvbnN0IHJlY2VpdmVkID0gZGVzZXJpYWxpemUoc2VyaWFsaXplKHRPYmopLCB0dHlwZXMuQ29tcGxleCk7CisgICAgICBhc3NlcnQub2sodE9iaiAhPT0gcmVjZWl2ZWQsICJub3QgdGhlIHNhbWUgb2JqZWN0Iik7CiAgICAgICBhc3NlcnQuZGVlcEVxdWFsKHRPYmosIHJlY2VpdmVkKTsKICAgICAgIGFzc2VydC5lbmQoKTsKICAgICB9LAogCi0gICAgIk5lc3RlZCBzdHJ1Y3RzIGFuZCBjb250YWluZXJzIGluaXRpYWxpemVkIGZyb20gcGxhaW4ganMgb2JqZWN0cyBzaG91bGQgc2VyaWFsaXplIHNhbWUgYXMgaWYgaW5pdGlhbGl6ZWQgZnJvbSB0aHJpZnQgb2JqZWN0cyI6IGZ1bmN0aW9uKGFzc2VydCkgewotICAgICAgdmFyIHRPYmoxID0gY3JlYXRlVGhyaWZ0T2JqKCk7Ci0gICAgICB2YXIgdE9iajIgPSBuZXcgdHR5cGVzLkNvbXBsZXgoY3JlYXRlSnNPYmooKSk7CisgICAgIk5lc3RlZCBzdHJ1Y3RzIGFuZCBjb250YWluZXJzIGluaXRpYWxpemVkIGZyb20gcGxhaW4ganMgb2JqZWN0cyBzaG91bGQgc2VyaWFsaXplIHNhbWUgYXMgaWYgaW5pdGlhbGl6ZWQgZnJvbSB0aHJpZnQgb2JqZWN0cyI6IGZ1bmN0aW9uKAorICAgICAgYXNzZXJ0CisgICAgKSB7CisgICAgICBjb25zdCB0T2JqMSA9IGNyZWF0ZVRocmlmdE9iaigpOworICAgICAgY29uc3QgdE9iajIgPSBuZXcgdHR5cGVzLkNvbXBsZXgoY3JlYXRlSnNPYmooKSk7CiAgICAgICBhc3NlcnRWYWx1ZXModE9iajIsIGFzc2VydCk7Ci0gICAgICB2YXIgczEgPSBzZXJpYWxpemUodE9iajEpOwotICAgICAgdmFyIHMyID0gc2VyaWFsaXplKHRPYmoyKTsKKyAgICAgIGNvbnN0IHMxID0gc2VyaWFsaXplKHRPYmoxKTsKKyAgICAgIGNvbnN0IHMyID0gc2VyaWFsaXplKHRPYmoyKTsKICAgICAgIGFzc2VydC5vayhidWZmZXJFcXVhbHMoczEsIHMyKSk7CiAgICAgICBhc3NlcnQuZW5kKCk7CiAgICAgfSwKIAotICAgICJNb2RpZmljYXRpb25zIHRvIGFyZ3Mgb2JqZWN0IHNob3VsZCBub3QgYWZmZWN0IGNvbnN0cnVjdGVkIFRocmlmdCBvYmplY3QiOiBmdW5jdGlvbiAoYXNzZXJ0KSB7Ci0KLSAgICAgIHZhciBhcmdzID0gY3JlYXRlSnNPYmooKTsKKyAgICAiTW9kaWZpY2F0aW9ucyB0byBhcmdzIG9iamVjdCBzaG91bGQgbm90IGFmZmVjdCBjb25zdHJ1Y3RlZCBUaHJpZnQgb2JqZWN0IjogZnVuY3Rpb24oCisgICAgICBhc3NlcnQKKyAgICApIHsKKyAgICAgIGNvbnN0IGFyZ3MgPSBjcmVhdGVKc09iaigpOwogICAgICAgYXNzZXJ0VmFsdWVzKGFyZ3MsIGFzc2VydCk7CiAKLSAgICAgIHZhciB0T2JqID0gbmV3IHR0eXBlcy5Db21wbGV4KGFyZ3MpOworICAgICAgY29uc3QgdE9iaiA9IG5ldyB0dHlwZXMuQ29tcGxleChhcmdzKTsKICAgICAgIGFzc2VydFZhbHVlcyh0T2JqLCBhc3NlcnQpOwogCi0gICAgICBhcmdzLnN0cnVjdF9maWVsZC52YWx1ZSA9ICdaWlonOwotICAgICAgYXJncy5zdHJ1Y3RfbGlzdF9maWVsZFswXS52YWx1ZSA9ICdaWlonOwotICAgICAgYXJncy5zdHJ1Y3RfbGlzdF9maWVsZFsxXS52YWx1ZSA9ICdaWlonOwotICAgICAgYXJncy5zdHJ1Y3Rfc2V0X2ZpZWxkWzBdLnZhbHVlID0gJ1paWic7Ci0gICAgICBhcmdzLnN0cnVjdF9zZXRfZmllbGRbMV0udmFsdWUgPSAnWlpaJzsKLSAgICAgIGFyZ3Muc3RydWN0X21hcF9maWVsZC5BLnZhbHVlID0gJ1paWic7Ci0gICAgICBhcmdzLnN0cnVjdF9tYXBfZmllbGQuQi52YWx1ZSA9ICdaWlonOwotICAgICAgYXJncy5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGRbMF1bMF0uQ1swXSA9ICdaWlonOwotICAgICAgYXJncy5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGRbMF1bMF0uQ1sxXSA9ICdaWlonOwotICAgICAgYXJncy5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQyLkRbMF0uREEgPSAnWlpaJzsKLSAgICAgIGFyZ3Muc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkMi5EWzBdLkRCID0gJ1paWic7CisgICAgICBhcmdzLnN0cnVjdF9maWVsZC52YWx1ZSA9ICJaWloiOworICAgICAgYXJncy5zdHJ1Y3RfbGlzdF9maWVsZFswXS52YWx1ZSA9ICJaWloiOworICAgICAgYXJncy5zdHJ1Y3RfbGlzdF9maWVsZFsxXS52YWx1ZSA9ICJaWloiOworICAgICAgYXJncy5zdHJ1Y3Rfc2V0X2ZpZWxkWzBdLnZhbHVlID0gIlpaWiI7CisgICAgICBhcmdzLnN0cnVjdF9zZXRfZmllbGRbMV0udmFsdWUgPSAiWlpaIjsKKyAgICAgIGFyZ3Muc3RydWN0X21hcF9maWVsZC5BLnZhbHVlID0gIlpaWiI7CisgICAgICBhcmdzLnN0cnVjdF9tYXBfZmllbGQuQi52YWx1ZSA9ICJaWloiOworICAgICAgYXJncy5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGRbMF1bMF0uQ1swXSA9ICJaWloiOworICAgICAgYXJncy5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGRbMF1bMF0uQ1sxXSA9ICJaWloiOworICAgICAgYXJncy5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQyLkRbMF0uREEgPSAiWlpaIjsKKyAgICAgIGFyZ3Muc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkMi5EWzBdLkRCID0gIlpaWiI7CiAKICAgICAgIGFzc2VydFZhbHVlcyh0T2JqLCBhc3NlcnQpOwogICAgICAgYXNzZXJ0LmVuZCgpOwogICAgIH0sCiAKICAgICAibnVsbHMgYXJlIG9rIjogZnVuY3Rpb24oYXNzZXJ0KSB7Ci0gICAgICB2YXIgdE9iaiA9IG5ldyB0dHlwZXMuQ29tcGxleCh7CisgICAgICBjb25zdCB0T2JqID0gbmV3IHR0eXBlcy5Db21wbGV4KHsKICAgICAgICAgc3RydWN0X2ZpZWxkOiBudWxsLAogICAgICAgICBzdHJ1Y3RfbGlzdF9maWVsZDogbnVsbCwKICAgICAgICAgc3RydWN0X3NldF9maWVsZDogbnVsbCwKQEAgLTIxMiw3ICsyOTgsNyBAQAogICAgICAgICBzdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQ6IG51bGwsCiAgICAgICAgIHN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZDI6IG51bGwKICAgICAgIH0pOwotICAgICAgdmFyIHJlY2VpdmVkID0gZGVzZXJpYWxpemUoc2VyaWFsaXplKHRPYmopLCB0dHlwZXMuQ29tcGxleCk7CisgICAgICBjb25zdCByZWNlaXZlZCA9IGRlc2VyaWFsaXplKHNlcmlhbGl6ZSh0T2JqKSwgdHR5cGVzLkNvbXBsZXgpOwogICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHRPYmouc3RydWN0X2ZpZWxkLCBudWxsKTsKICAgICAgIGFzc2VydC5vayh0T2JqICE9PSByZWNlaXZlZCk7CiAgICAgICBhc3NlcnQuZGVlcEVxdWFsKHRPYmosIHJlY2VpdmVkKTsKQEAgLTIyMCwxMSArMzA2LDExIEBACiAgICAgfSwKIAogICAgICJDYW4gbWFrZSBsaXN0IHdpdGggb2JqZWN0cyI6IGZ1bmN0aW9uKGFzc2VydCkgewotICAgICAgdmFyIHRPYmogPSBuZXcgdHR5cGVzLkNvbXBsZXhMaXN0KHsKLQkgICAgICAic3RydWN0X2xpc3RfZmllbGQiOiBbbmV3IHR0eXBlcy5Db21wbGV4KHt9KV0KKyAgICAgIGNvbnN0IHRPYmogPSBuZXcgdHR5cGVzLkNvbXBsZXhMaXN0KHsKKyAgICAgICAgc3RydWN0X2xpc3RfZmllbGQ6IFtuZXcgdHR5cGVzLkNvbXBsZXgoe30pXQogICAgICAgfSk7Ci0gICAgICB2YXIgaW5uZXJPYmogPSB0T2JqLnN0cnVjdF9saXN0X2ZpZWxkWzBdOwotICAgICAgYXNzZXJ0Lm9rKGlubmVyT2JqIGluc3RhbmNlb2YgdHR5cGVzLkNvbXBsZXgpCisgICAgICBjb25zdCBpbm5lck9iaiA9IHRPYmouc3RydWN0X2xpc3RfZmllbGRbMF07CisgICAgICBhc3NlcnQub2soaW5uZXJPYmogaW5zdGFuY2VvZiB0dHlwZXMuQ29tcGxleCk7CiAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoaW5uZXJPYmouc3RydWN0X2ZpZWxkLCBudWxsKTsKICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChpbm5lck9iai5zdHJ1Y3RfbGlzdF9maWVsZCwgbnVsbCk7CiAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoaW5uZXJPYmouc3RydWN0X3NldF9maWVsZCwgbnVsbCk7CkBAIC0yMzMsMTcgKzMxOSwxNSBAQAogICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGlubmVyT2JqLnN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZDIsIG51bGwpOwogICAgICAgYXNzZXJ0LmVuZCgpOwogICAgIH0KLQogICB9OwogICByZXR1cm4gY2FzZXM7CiB9CiAKLQotZnVuY3Rpb24gcnVuKG5hbWUsIGNhc2VzKXsKK2Z1bmN0aW9uIHJ1bihuYW1lLCBjYXNlcykgewogICBPYmplY3Qua2V5cyhjYXNlcykuZm9yRWFjaChmdW5jdGlvbihjYXNlTmFtZSkgewotICAgIHRlc3QobmFtZSArICc6ICcgKyBjYXNlTmFtZSwgY2FzZXNbY2FzZU5hbWVdKTsKKyAgICB0ZXN0KG5hbWUgKyAiOiAiICsgY2FzZU5hbWUsIGNhc2VzW2Nhc2VOYW1lXSk7CiAgIH0pOwogfQogCi1ydW4oJ2JpbmFyeScsIGNyZWF0ZVRlc3RDYXNlcyhzZXJpYWxpemVCaW5hcnksIGRlc2VyaWFsaXplQmluYXJ5KSk7Ci1ydW4oJ2pzb24nLCBjcmVhdGVUZXN0Q2FzZXMoc2VyaWFsaXplSlNPTiwgZGVzZXJpYWxpemVKU09OKSk7CitydW4oImJpbmFyeSIsIGNyZWF0ZVRlc3RDYXNlcyhzZXJpYWxpemVCaW5hcnksIGRlc2VyaWFsaXplQmluYXJ5KSk7CitydW4oImpzb24iLCBjcmVhdGVUZXN0Q2FzZXMoc2VyaWFsaXplSlNPTiwgZGVzZXJpYWxpemVKU09OKSk7CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL3Rlc3QvZXhjZXB0aW9ucy5qcyBiL2xpYi9ub2RlanMvdGVzdC9leGNlcHRpb25zLmpzCmluZGV4IGM2ZjJlNGQuLmFiMjc5OGEgMTAwNjQ0Ci0tLSBhL2xpYi9ub2RlanMvdGVzdC9leGNlcHRpb25zLmpzCisrKyBiL2xpYi9ub2RlanMvdGVzdC9leGNlcHRpb25zLmpzCkBAIC0xLDU1ICsxLDE0NiBAQAotJ3VzZSBzdHJpY3QnOwotdmFyIHRlc3QgPSByZXF1aXJlKCd0YXBlJyk7Ci12YXIgdGhyaWZ0ID0gcmVxdWlyZSgnLi4vbGliL3RocmlmdC90aHJpZnQuanMnKTsKLXZhciBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IgPSByZXF1aXJlKCcuLi9saWIvdGhyaWZ0L2lucHV0X2J1ZmZlcl91bmRlcnJ1bl9lcnJvcicpOworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLwogCi10ZXN0KCdUQXBwbGljYXRpb25FeGNlcHRpb24nLCBmdW5jdGlvbiB0KGFzc2VydCkgewotICB2YXIgZSA9IG5ldyB0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKDEsICdmb28nKTsKLSAgYXNzZXJ0Lm9rKGUgaW5zdGFuY2VvZiB0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uLCAnaXMgaW5zdGFuY2VvZiBUQXBwbGljYXRpb25FeGNlcHRpb24nKTsKLSAgYXNzZXJ0Lm9rKGUgaW5zdGFuY2VvZiB0aHJpZnQuVEV4Y2VwdGlvbiwgJ2lzIGluc3RhbmNlb2YgVEV4Y2VwdGlvbicpOwotICBhc3NlcnQub2soZSBpbnN0YW5jZW9mIEVycm9yLCAnaXMgaW5zdGFuY2VvZiBFcnJvcicpOwotICBhc3NlcnQuZXF1YWwodHlwZW9mIGUuc3RhY2ssICdzdHJpbmcnLCAnaGFzIHN0YWNrIHRyYWNlJyk7Ci0gIGFzc2VydC5vaygvXlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjogZm9vLy50ZXN0KGUuc3RhY2spLCAnU3RhY2sgdHJhY2UgaGFzIGNvcnJlY3QgZXJyb3IgbmFtZSBhbmQgbWVzc2FnZScpOwotICBhc3NlcnQub2soZS5zdGFjay5pbmRleE9mKCd0ZXN0L2V4Y2VwdGlvbnMuanM6NzoxMScpICE9PSAtMSwgJ3N0YWNrIHRyYWNlIHN0YXJ0cyBvbiBjb3JyZWN0IGxpbmUgYW5kIGNvbHVtbicpOwotICBhc3NlcnQuZXF1YWwoZS5uYW1lLCAnVEFwcGxpY2F0aW9uRXhjZXB0aW9uJywgJ2hhcyBmdW5jdGlvbiBuYW1lIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbicpOwotICBhc3NlcnQuZXF1YWwoZS5tZXNzYWdlLCAnZm9vJywgJ2hhcyBlcnJvciBtZXNzYWdlICJmb28iJyk7Ci0gIGFzc2VydC5lcXVhbChlLnR5cGUsIDEsICdoYXMgdHlwZSAxJyk7CisidXNlIHN0cmljdCI7Citjb25zdCB0ZXN0ID0gcmVxdWlyZSgidGFwZSIpOworY29uc3QgdGhyaWZ0ID0gcmVxdWlyZSgiLi4vbGliL3RocmlmdC90aHJpZnQuanMiKTsKK2NvbnN0IElucHV0QnVmZmVyVW5kZXJydW5FcnJvciA9IHJlcXVpcmUoIi4uL2xpYi90aHJpZnQvaW5wdXRfYnVmZmVyX3VuZGVycnVuX2Vycm9yIik7CisKK3Rlc3QoIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIsIGZ1bmN0aW9uIHQoYXNzZXJ0KSB7CisgIGNvbnN0IGUgPSBuZXcgdGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbigxLCAiZm9vIik7CisgIGFzc2VydC5vaygKKyAgICBlIGluc3RhbmNlb2YgdGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiwKKyAgICAiaXMgaW5zdGFuY2VvZiBUQXBwbGljYXRpb25FeGNlcHRpb24iCisgICk7CisgIGFzc2VydC5vayhlIGluc3RhbmNlb2YgdGhyaWZ0LlRFeGNlcHRpb24sICJpcyBpbnN0YW5jZW9mIFRFeGNlcHRpb24iKTsKKyAgYXNzZXJ0Lm9rKGUgaW5zdGFuY2VvZiBFcnJvciwgImlzIGluc3RhbmNlb2YgRXJyb3IiKTsKKyAgYXNzZXJ0LmVxdWFsKHR5cGVvZiBlLnN0YWNrLCAic3RyaW5nIiwgImhhcyBzdGFjayB0cmFjZSIpOworICBhc3NlcnQub2soCisgICAgL15UQXBwbGljYXRpb25FeGNlcHRpb246IGZvby8udGVzdChlLnN0YWNrKSwKKyAgICAiU3RhY2sgdHJhY2UgaGFzIGNvcnJlY3QgZXJyb3IgbmFtZSBhbmQgbWVzc2FnZSIKKyAgKTsKKyAgYXNzZXJ0Lm9rKAorICAgIGUuc3RhY2suaW5kZXhPZigidGVzdC9leGNlcHRpb25zLmpzOjc6MTEiKSAhPT0gLTEsCisgICAgInN0YWNrIHRyYWNlIHN0YXJ0cyBvbiBjb3JyZWN0IGxpbmUgYW5kIGNvbHVtbiIKKyAgKTsKKyAgYXNzZXJ0LmVxdWFsKAorICAgIGUubmFtZSwKKyAgICAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIiwKKyAgICAiaGFzIGZ1bmN0aW9uIG5hbWUgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIgorICApOworICBhc3NlcnQuZXF1YWwoZS5tZXNzYWdlLCAiZm9vIiwgJ2hhcyBlcnJvciBtZXNzYWdlICJmb28iJyk7CisgIGFzc2VydC5lcXVhbChlLnR5cGUsIDEsICJoYXMgdHlwZSAxIik7CiAgIGFzc2VydC5lbmQoKTsKIH0pOwogCi10ZXN0KCdURXhjZXB0aW9uJywgZnVuY3Rpb24gdChhc3NlcnQpIHsKLSAgdmFyIGUgPSBuZXcgdGhyaWZ0LlRFeGNlcHRpb24oJ2ZvbycpOwotICBhc3NlcnQub2soZSBpbnN0YW5jZW9mIHRocmlmdC5URXhjZXB0aW9uLCAnaXMgaW5zdGFuY2VvZiBURXhjZXB0aW9uJyk7Ci0gIGFzc2VydC5vayhlIGluc3RhbmNlb2YgRXJyb3IsICdpcyBpbnN0YW5jZW9mIEVycm9yJyk7Ci0gIGFzc2VydC5lcXVhbCh0eXBlb2YgZS5zdGFjaywgJ3N0cmluZycsICdoYXMgc3RhY2sgdHJhY2UnKTsKLSAgYXNzZXJ0Lm9rKC9eVEV4Y2VwdGlvbjogZm9vLy50ZXN0KGUuc3RhY2spLCAnU3RhY2sgdHJhY2UgaGFzIGNvcnJlY3QgZXJyb3IgbmFtZSBhbmQgbWVzc2FnZScpOwotICBhc3NlcnQub2soZS5zdGFjay5pbmRleE9mKCd0ZXN0L2V4Y2VwdGlvbnMuanM6MjE6MTEnKSAhPT0gLTEsICdzdGFjayB0cmFjZSBzdGFydHMgb24gY29ycmVjdCBsaW5lIGFuZCBjb2x1bW4nKTsKLSAgYXNzZXJ0LmVxdWFsKGUubmFtZSwgJ1RFeGNlcHRpb24nLCAnaGFzIGZ1bmN0aW9uIG5hbWUgVEV4Y2VwdGlvbicpOwotICBhc3NlcnQuZXF1YWwoZS5tZXNzYWdlLCAnZm9vJywgJ2hhcyBlcnJvciBtZXNzYWdlICJmb28iJyk7Cit0ZXN0KCJ1bmV4cGVjdGVkIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiAiLCBmdW5jdGlvbiB0KGFzc2VydCkgeworICBjb25zdCBlID0gbmV3IHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24oMSwgMTAwKTsKKyAgYXNzZXJ0Lm9rKAorICAgIGUgaW5zdGFuY2VvZiB0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uLAorICAgICJpcyBpbnN0YW5jZW9mIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIKKyAgKTsKKyAgYXNzZXJ0Lm9rKGUgaW5zdGFuY2VvZiB0aHJpZnQuVEV4Y2VwdGlvbiwgImlzIGluc3RhbmNlb2YgVEV4Y2VwdGlvbiIpOworICBhc3NlcnQub2soZSBpbnN0YW5jZW9mIEVycm9yLCAiaXMgaW5zdGFuY2VvZiBFcnJvciIpOworICBhc3NlcnQuZXF1YWwodHlwZW9mIGUuc3RhY2ssICJzdHJpbmciLCAiaGFzIHN0YWNrIHRyYWNlIik7CisgIGFzc2VydC5vaygKKyAgICAvXlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjogMTAwLy50ZXN0KGUuc3RhY2spLAorICAgICJTdGFjayB0cmFjZSBoYXMgY29ycmVjdCBlcnJvciBuYW1lIGFuZCBtZXNzYWdlIgorICApOworICBhc3NlcnQub2soCisgICAgZS5zdGFjay5pbmRleE9mKCJ0ZXN0L2V4Y2VwdGlvbnMuanM6NzoxMSIpICE9PSAtMSwKKyAgICAic3RhY2sgdHJhY2Ugc3RhcnRzIG9uIGNvcnJlY3QgbGluZSBhbmQgY29sdW1uIgorICApOworICBhc3NlcnQuZXF1YWwoCisgICAgZS5uYW1lLAorICAgICJUQXBwbGljYXRpb25FeGNlcHRpb24iLAorICAgICJoYXMgZnVuY3Rpb24gbmFtZSBUQXBwbGljYXRpb25FeGNlcHRpb24iCisgICk7CisgIGFzc2VydC5lcXVhbChlLm1lc3NhZ2UsIDEwMCwgImhhcyBlcnJvciBtZXNzYWdlIDEwMCIpOworICBhc3NlcnQuZXF1YWwoZS50eXBlLCAxLCAiaGFzIHR5cGUgMSIpOwogICBhc3NlcnQuZW5kKCk7CiB9KTsKIAotdGVzdCgnVFByb3RvY29sRXhjZXB0aW9uJywgZnVuY3Rpb24gdChhc3NlcnQpIHsKLSAgdmFyIGUgPSBuZXcgdGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbigxLCAnZm9vJyk7Ci0gIGFzc2VydC5vayhlIGluc3RhbmNlb2YgdGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbiwgJ2lzIGluc3RhbmNlb2YgVFByb3RvY29sRXhjZXB0aW9uJyk7Ci0gIGFzc2VydC5vayhlIGluc3RhbmNlb2YgRXJyb3IsICdpcyBpbnN0YW5jZW9mIEVycm9yJyk7Ci0gIGFzc2VydC5lcXVhbCh0eXBlb2YgZS5zdGFjaywgJ3N0cmluZycsICdoYXMgc3RhY2sgdHJhY2UnKTsKLSAgYXNzZXJ0Lm9rKC9eVFByb3RvY29sRXhjZXB0aW9uOiBmb28vLnRlc3QoZS5zdGFjayksICdTdGFjayB0cmFjZSBoYXMgY29ycmVjdCBlcnJvciBuYW1lIGFuZCBtZXNzYWdlJyk7Ci0gIGFzc2VydC5vayhlLnN0YWNrLmluZGV4T2YoJ3Rlc3QvZXhjZXB0aW9ucy5qczozMzoxMScpICE9PSAtMSwgJ3N0YWNrIHRyYWNlIHN0YXJ0cyBvbiBjb3JyZWN0IGxpbmUgYW5kIGNvbHVtbicpOwotICBhc3NlcnQuZXF1YWwoZS5uYW1lLCAnVFByb3RvY29sRXhjZXB0aW9uJywgJ2hhcyBmdW5jdGlvbiBuYW1lIFRQcm90b2NvbEV4Y2VwdGlvbicpOwotICBhc3NlcnQuZXF1YWwoZS5tZXNzYWdlLCAnZm9vJywgJ2hhcyBlcnJvciBtZXNzYWdlICJmb28iJyk7Ci0gIGFzc2VydC5lcXVhbChlLnR5cGUsIDEsICdoYXMgdHlwZSAxJyk7Cit0ZXN0KCJURXhjZXB0aW9uIiwgZnVuY3Rpb24gdChhc3NlcnQpIHsKKyAgY29uc3QgZSA9IG5ldyB0aHJpZnQuVEV4Y2VwdGlvbigiZm9vIik7CisgIGFzc2VydC5vayhlIGluc3RhbmNlb2YgdGhyaWZ0LlRFeGNlcHRpb24sICJpcyBpbnN0YW5jZW9mIFRFeGNlcHRpb24iKTsKKyAgYXNzZXJ0Lm9rKGUgaW5zdGFuY2VvZiBFcnJvciwgImlzIGluc3RhbmNlb2YgRXJyb3IiKTsKKyAgYXNzZXJ0LmVxdWFsKHR5cGVvZiBlLnN0YWNrLCAic3RyaW5nIiwgImhhcyBzdGFjayB0cmFjZSIpOworICBhc3NlcnQub2soCisgICAgL15URXhjZXB0aW9uOiBmb28vLnRlc3QoZS5zdGFjayksCisgICAgIlN0YWNrIHRyYWNlIGhhcyBjb3JyZWN0IGVycm9yIG5hbWUgYW5kIG1lc3NhZ2UiCisgICk7CisgIGFzc2VydC5vaygKKyAgICBlLnN0YWNrLmluZGV4T2YoInRlc3QvZXhjZXB0aW9ucy5qczoyMToxMSIpICE9PSAtMSwKKyAgICAic3RhY2sgdHJhY2Ugc3RhcnRzIG9uIGNvcnJlY3QgbGluZSBhbmQgY29sdW1uIgorICApOworICBhc3NlcnQuZXF1YWwoZS5uYW1lLCAiVEV4Y2VwdGlvbiIsICJoYXMgZnVuY3Rpb24gbmFtZSBURXhjZXB0aW9uIik7CisgIGFzc2VydC5lcXVhbChlLm1lc3NhZ2UsICJmb28iLCAnaGFzIGVycm9yIG1lc3NhZ2UgImZvbyInKTsKICAgYXNzZXJ0LmVuZCgpOwogfSk7CiAKLXRlc3QoJ0lucHV0QnVmZmVyVW5kZXJydW5FcnJvcicsIGZ1bmN0aW9uIHQoYXNzZXJ0KSB7Ci0gIHZhciBlID0gbmV3IElucHV0QnVmZmVyVW5kZXJydW5FcnJvcignZm9vJyk7Ci0gIGFzc2VydC5vayhlIGluc3RhbmNlb2YgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yLCAnaXMgaW5zdGFuY2VvZiBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3InKTsKLSAgYXNzZXJ0Lm9rKGUgaW5zdGFuY2VvZiBFcnJvciwgJ2lzIGluc3RhbmNlb2YgRXJyb3InKTsKLSAgYXNzZXJ0LmVxdWFsKHR5cGVvZiBlLnN0YWNrLCAnc3RyaW5nJywgJ2hhcyBzdGFjayB0cmFjZScpOwotICBhc3NlcnQub2soL15JbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3I6IGZvby8udGVzdChlLnN0YWNrKSwgJ1N0YWNrIHRyYWNlIGhhcyBjb3JyZWN0IGVycm9yIG5hbWUgYW5kIG1lc3NhZ2UnKTsKLSAgYXNzZXJ0Lm9rKGUuc3RhY2suaW5kZXhPZigndGVzdC9leGNlcHRpb25zLmpzOjQ2OjExJykgIT09IC0xLCAnc3RhY2sgdHJhY2Ugc3RhcnRzIG9uIGNvcnJlY3QgbGluZSBhbmQgY29sdW1uJyk7Ci0gIGFzc2VydC5lcXVhbChlLm5hbWUsICdJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3InLCAnaGFzIGZ1bmN0aW9uIG5hbWUgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yJyk7Ci0gIGFzc2VydC5lcXVhbChlLm1lc3NhZ2UsICdmb28nLCAnaGFzIGVycm9yIG1lc3NhZ2UgImZvbyInKTsKK3Rlc3QoIlRQcm90b2NvbEV4Y2VwdGlvbiIsIGZ1bmN0aW9uIHQoYXNzZXJ0KSB7CisgIGNvbnN0IGUgPSBuZXcgdGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbigxLCAiZm9vIik7CisgIGFzc2VydC5vaygKKyAgICBlIGluc3RhbmNlb2YgdGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbiwKKyAgICAiaXMgaW5zdGFuY2VvZiBUUHJvdG9jb2xFeGNlcHRpb24iCisgICk7CisgIGFzc2VydC5vayhlIGluc3RhbmNlb2YgRXJyb3IsICJpcyBpbnN0YW5jZW9mIEVycm9yIik7CisgIGFzc2VydC5lcXVhbCh0eXBlb2YgZS5zdGFjaywgInN0cmluZyIsICJoYXMgc3RhY2sgdHJhY2UiKTsKKyAgYXNzZXJ0Lm9rKAorICAgIC9eVFByb3RvY29sRXhjZXB0aW9uOiBmb28vLnRlc3QoZS5zdGFjayksCisgICAgIlN0YWNrIHRyYWNlIGhhcyBjb3JyZWN0IGVycm9yIG5hbWUgYW5kIG1lc3NhZ2UiCisgICk7CisgIGFzc2VydC5vaygKKyAgICBlLnN0YWNrLmluZGV4T2YoInRlc3QvZXhjZXB0aW9ucy5qczozMzoxMSIpICE9PSAtMSwKKyAgICAic3RhY2sgdHJhY2Ugc3RhcnRzIG9uIGNvcnJlY3QgbGluZSBhbmQgY29sdW1uIgorICApOworICBhc3NlcnQuZXF1YWwoCisgICAgZS5uYW1lLAorICAgICJUUHJvdG9jb2xFeGNlcHRpb24iLAorICAgICJoYXMgZnVuY3Rpb24gbmFtZSBUUHJvdG9jb2xFeGNlcHRpb24iCisgICk7CisgIGFzc2VydC5lcXVhbChlLm1lc3NhZ2UsICJmb28iLCAnaGFzIGVycm9yIG1lc3NhZ2UgImZvbyInKTsKKyAgYXNzZXJ0LmVxdWFsKGUudHlwZSwgMSwgImhhcyB0eXBlIDEiKTsKKyAgYXNzZXJ0LmVuZCgpOworfSk7CisKK3Rlc3QoIklucHV0QnVmZmVyVW5kZXJydW5FcnJvciIsIGZ1bmN0aW9uIHQoYXNzZXJ0KSB7CisgIGNvbnN0IGUgPSBuZXcgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yKCJmb28iKTsKKyAgYXNzZXJ0Lm9rKAorICAgIGUgaW5zdGFuY2VvZiBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IsCisgICAgImlzIGluc3RhbmNlb2YgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yIgorICApOworICBhc3NlcnQub2soZSBpbnN0YW5jZW9mIEVycm9yLCAiaXMgaW5zdGFuY2VvZiBFcnJvciIpOworICBhc3NlcnQuZXF1YWwodHlwZW9mIGUuc3RhY2ssICJzdHJpbmciLCAiaGFzIHN0YWNrIHRyYWNlIik7CisgIGFzc2VydC5vaygKKyAgICAvXklucHV0QnVmZmVyVW5kZXJydW5FcnJvcjogZm9vLy50ZXN0KGUuc3RhY2spLAorICAgICJTdGFjayB0cmFjZSBoYXMgY29ycmVjdCBlcnJvciBuYW1lIGFuZCBtZXNzYWdlIgorICApOworICBhc3NlcnQub2soCisgICAgZS5zdGFjay5pbmRleE9mKCJ0ZXN0L2V4Y2VwdGlvbnMuanM6NDY6MTEiKSAhPT0gLTEsCisgICAgInN0YWNrIHRyYWNlIHN0YXJ0cyBvbiBjb3JyZWN0IGxpbmUgYW5kIGNvbHVtbiIKKyAgKTsKKyAgYXNzZXJ0LmVxdWFsKAorICAgIGUubmFtZSwKKyAgICAiSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yIiwKKyAgICAiaGFzIGZ1bmN0aW9uIG5hbWUgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yIgorICApOworICBhc3NlcnQuZXF1YWwoZS5tZXNzYWdlLCAiZm9vIiwgJ2hhcyBlcnJvciBtZXNzYWdlICJmb28iJyk7CiAgIGFzc2VydC5lbmQoKTsKIH0pOwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy90ZXN0L2hlbHBlcnMuanMgYi9saWIvbm9kZWpzL3Rlc3QvaGVscGVycy5qcwppbmRleCBjODUwYzQ2Li43MmQxMjhkIDEwMDY0NAotLS0gYS9saWIvbm9kZWpzL3Rlc3QvaGVscGVycy5qcworKysgYi9saWIvbm9kZWpzL3Rlc3QvaGVscGVycy5qcwpAQCAtMSwxMyArMSwzNyBAQAotJ3VzZSBzdHJpY3QnOwotdmFyIHRocmlmdCA9IHJlcXVpcmUoJy4uL2xpYi90aHJpZnQnKTsKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworInVzZSBzdHJpY3QiOworY29uc3QgdGhyaWZ0ID0gcmVxdWlyZSgiLi4vbGliL3RocmlmdCIpOwogCiBtb2R1bGUuZXhwb3J0cy50cmFuc3BvcnRzID0gewotICAnYnVmZmVyZWQnOiB0aHJpZnQuVEJ1ZmZlcmVkVHJhbnNwb3J0LAotICAnZnJhbWVkJzogdGhyaWZ0LlRGcmFtZWRUcmFuc3BvcnQKKyAgYnVmZmVyZWQ6IHRocmlmdC5UQnVmZmVyZWRUcmFuc3BvcnQsCisgIGZyYW1lZDogdGhyaWZ0LlRGcmFtZWRUcmFuc3BvcnQKIH07CiAKIG1vZHVsZS5leHBvcnRzLnByb3RvY29scyA9IHsKLSAgJ2pzb24nOiB0aHJpZnQuVEpTT05Qcm90b2NvbCwKLSAgJ2JpbmFyeSc6IHRocmlmdC5UQmluYXJ5UHJvdG9jb2wsCi0gICdjb21wYWN0JzogdGhyaWZ0LlRDb21wYWN0UHJvdG9jb2wKKyAganNvbjogdGhyaWZ0LlRKU09OUHJvdG9jb2wsCisgIGJpbmFyeTogdGhyaWZ0LlRCaW5hcnlQcm90b2NvbCwKKyAgY29tcGFjdDogdGhyaWZ0LlRDb21wYWN0UHJvdG9jb2wKIH07CisKK21vZHVsZS5leHBvcnRzLmVjbWFNb2RlID0gcHJvY2Vzcy5hcmd2LmluY2x1ZGVzKCItLWVzNiIpID8gImVzNiIgOiAiZXM1IjsKK21vZHVsZS5leHBvcnRzLmdlblBhdGggPSBwcm9jZXNzLmFyZ3YuaW5jbHVkZXMoIi0tZXM2IikKKyAgPyAiZ2VuLW5vZGVqcy1lczYiCisgIDogImdlbi1ub2RlanMiOwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy90ZXN0L3NlcnZlci5qcyBiL2xpYi9ub2RlanMvdGVzdC9zZXJ2ZXIuanMKaW5kZXggNmU1Y2RmYS4uNzQwMjA5NCAxMDA2NDQKLS0tIGEvbGliL25vZGVqcy90ZXN0L3NlcnZlci5qcworKysgYi9saWIvbm9kZWpzL3Rlc3Qvc2VydmVyLmpzCkBAIC0xOSw4MyArMTksMTE5IEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi12YXIgZnMgPSByZXF1aXJlKCdmcycpOwotdmFyIHBhdGggPSByZXF1aXJlKCdwYXRoJyk7Ci12YXIgdGhyaWZ0ID0gcmVxdWlyZSgnLi4vbGliL3RocmlmdCcpOwotdmFyIHByb2dyYW0gPSByZXF1aXJlKCdjb21tYW5kZXInKTsKLXZhciBoZWxwZXJzID0gcmVxdWlyZSgnLi9oZWxwZXJzJyk7Ci0KLXZhciBUaHJpZnRUZXN0ID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL1RocmlmdFRlc3QnKTsKLXZhciBTZWNvbmRTZXJ2aWNlID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL1NlY29uZFNlcnZpY2UnKTsKLXZhciBUaHJpZnRUZXN0SGFuZGxlciA9IHJlcXVpcmUoJy4vdGVzdF9oYW5kbGVyJykuQXN5bmNUaHJpZnRUZXN0SGFuZGxlcjsKLXZhciBUaHJpZnRUZXN0SGFuZGxlclByb21pc2UgPSByZXF1aXJlKCcuL3Rlc3RfaGFuZGxlcicpLlN5bmNUaHJpZnRUZXN0SGFuZGxlcjsKLXZhciB0dHlwZXMgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvVGhyaWZ0VGVzdF90eXBlcycpOworY29uc3QgZnMgPSByZXF1aXJlKCJmcyIpOworY29uc3QgcGF0aCA9IHJlcXVpcmUoInBhdGgiKTsKK2NvbnN0IHRocmlmdCA9IHJlcXVpcmUoIi4uL2xpYi90aHJpZnQiKTsKK2NvbnN0IHByb2dyYW0gPSByZXF1aXJlKCJjb21tYW5kZXIiKTsKK2NvbnN0IGhlbHBlcnMgPSByZXF1aXJlKCIuL2hlbHBlcnMiKTsKIAogcHJvZ3JhbQotICAub3B0aW9uKCctcCwgLS1wcm90b2NvbCA8cHJvdG9jb2w+JywgJ1NldCB0aHJpZnQgcHJvdG9jb2wgKGJpbmFyeXxqc29ufGNvbXBhY3QpJywgJ2JpbmFyeScpCi0gIC5vcHRpb24oJy10LCAtLXRyYW5zcG9ydCA8dHJhbnNwb3J0PicsICdTZXQgdGhyaWZ0IHRyYW5zcG9ydCAoYnVmZmVyZWR8ZnJhbWVkKScsICdidWZmZXJlZCcpCi0gIC5vcHRpb24oJy0tc3NsJywgJ3VzZSBzc2wgdHJhbnNwb3J0JykKLSAgLm9wdGlvbignLS1wb3J0IDxwb3J0PicsICdTZXQgdGhyaWZ0IHNlcnZlciBwb3J0JywgOTA5MCkKLSAgLm9wdGlvbignLS1wcm9taXNlJywgJ3Rlc3Qgd2l0aCBwcm9taXNlIHN0eWxlIGZ1bmN0aW9ucycpCi0gIC5vcHRpb24oJy10LCAtLXR5cGUgPHR5cGU+JywgJ1NlbGVjdCBzZXJ2ZXIgdHlwZSAodGNwfG11bHRpcGxleHxodHRwKScsICd0Y3AnKQorICAub3B0aW9uKAorICAgICItcCwgLS1wcm90b2NvbCA8cHJvdG9jb2w+IiwKKyAgICAiU2V0IHRocmlmdCBwcm90b2NvbCAoYmluYXJ5fGNvbXBhY3R8anNvbikiLAorICAgICJiaW5hcnkiCisgICkKKyAgLm9wdGlvbigKKyAgICAiLXQsIC0tdHJhbnNwb3J0IDx0cmFuc3BvcnQ+IiwKKyAgICAiU2V0IHRocmlmdCB0cmFuc3BvcnQgKGJ1ZmZlcmVkfGZyYW1lZHxodHRwKSIsCisgICAgImJ1ZmZlcmVkIgorICApCisgIC5vcHRpb24oIi0tc3NsIiwgInVzZSBzc2wgdHJhbnNwb3J0IikKKyAgLm9wdGlvbigiLS1wb3J0IDxwb3J0PiIsICJTZXQgdGhyaWZ0IHNlcnZlciBwb3J0IiwgOTA5MCkKKyAgLm9wdGlvbigiLS1kb21haW4tc29ja2V0IDxwYXRoPiIsICJTZXQgdGhpZnQgc2VydmVyIHVuaXggZG9tYWluIHNvY2tldCIpCisgIC5vcHRpb24oCisgICAgIi10LCAtLXR5cGUgPHR5cGU+IiwKKyAgICAiU2VsZWN0IHNlcnZlciB0eXBlIChodHRwfG11bHRpcGxleHx0Y3B8d2Vic29ja2V0KSIsCisgICAgInRjcCIKKyAgKQorICAub3B0aW9uKCItLWNhbGxiYWNrIiwgInRlc3Qgd2l0aCBjYWxsYmFjayBzdHlsZSBmdW5jdGlvbnMiKQorICAub3B0aW9uKCItLWVzNiIsICJVc2UgZXM2IGNvZGUiKQorICAub3B0aW9uKCItLWVzNSIsICJVc2UgZXM1IGNvZGUiKQogICAucGFyc2UocHJvY2Vzcy5hcmd2KTsKIAotdmFyIHBvcnQgPSBwcm9ncmFtLnBvcnQ7Ci12YXIgdHlwZSA9IHByb2dyYW0udHlwZTsKLXZhciBzc2wgPSBwcm9ncmFtLnNzbDsKLXZhciBwcm9taXNlID0gcHJvZ3JhbS5wcm9taXNlOworY29uc3QgVGhyaWZ0VGVzdCA9IHJlcXVpcmUoYC4vJHtoZWxwZXJzLmdlblBhdGh9L1RocmlmdFRlc3RgKTsKK2NvbnN0IFNlY29uZFNlcnZpY2UgPSByZXF1aXJlKGAuLyR7aGVscGVycy5nZW5QYXRofS9TZWNvbmRTZXJ2aWNlYCk7Citjb25zdCB7IFRocmlmdFRlc3RIYW5kbGVyIH0gPSByZXF1aXJlKCIuL3Rlc3RfaGFuZGxlciIpOwogCi12YXIgaGFuZGxlciA9IHByb2dyYW0ucHJvbWlzZSA/IFRocmlmdFRlc3RIYW5kbGVyIDogVGhyaWZ0VGVzdEhhbmRsZXJQcm9taXNlOworY29uc3QgcG9ydCA9IHByb2dyYW0ucG9ydDsKK2NvbnN0IGRvbWFpblNvY2tldCA9IHByb2dyYW0uZG9tYWluU29ja2V0OworY29uc3Qgc3NsID0gcHJvZ3JhbS5zc2w7CiAKLXZhciBvcHRpb25zID0geworbGV0IHR5cGUgPSBwcm9ncmFtLnR5cGU7CitpZiAocHJvZ3JhbS50cmFuc3BvcnQgPT09ICJodHRwIikgeworICBwcm9ncmFtLnRyYW5zcG9ydCA9ICJidWZmZXJlZCI7CisgIHR5cGUgPSAiaHR0cCI7Cit9CisKK2xldCBvcHRpb25zID0gewogICB0cmFuc3BvcnQ6IGhlbHBlcnMudHJhbnNwb3J0c1twcm9ncmFtLnRyYW5zcG9ydF0sCiAgIHByb3RvY29sOiBoZWxwZXJzLnByb3RvY29sc1twcm9ncmFtLnByb3RvY29sXQogfTsKIAotaWYgKHR5cGUgPT09ICdodHRwJyB8fCB0eXBlID09PSd3ZWJzb2NrZXQnKSB7Ci0gIG9wdGlvbnMuaGFuZGxlciA9IGhhbmRsZXI7CitpZiAodHlwZSA9PT0gImh0dHAiIHx8IHR5cGUgPT09ICJ3ZWJzb2NrZXQiKSB7CisgIG9wdGlvbnMuaGFuZGxlciA9IFRocmlmdFRlc3RIYW5kbGVyOwogICBvcHRpb25zLnByb2Nlc3NvciA9IFRocmlmdFRlc3Q7CiAKICAgb3B0aW9ucyA9IHsKICAgICBzZXJ2aWNlczogeyAiL3Rlc3QiOiBvcHRpb25zIH0sCiAgICAgY29yczogewotICAgICAgJyonOiB0cnVlCisgICAgICAiKiI6IHRydWUKICAgICB9Ci0gIH0KKyAgfTsKIH0KIAotaWYgKHR5cGUgPT09ICdtdWx0aXBsZXgnKSB7Ci0gIHZhciBTZWNvbmRTZXJ2aWNlSGFuZGxlciA9IHsKK2xldCBwcm9jZXNzb3I7CitpZiAodHlwZSA9PT0gIm11bHRpcGxleCIpIHsKKyAgY29uc3QgU2Vjb25kU2VydmljZUhhbmRsZXIgPSB7CiAgICAgc2Vjb25kdGVzdFN0cmluZzogZnVuY3Rpb24odGhpbmcsIHJlc3VsdCkgewotICAgICAgY29uc29sZS5sb2coJ3Rlc3RTdHJpbmcoXCcnICsgdGhpbmcgKyAnXCcpJyk7Ci0gICAgICByZXN1bHQobnVsbCwgdGhpbmcpOworICAgICAgY29uc29sZS5sb2coJ3Rlc3RTdHJpbmcoIicgKyB0aGluZyArICciKScpOworICAgICAgcmVzdWx0KG51bGwsICd0ZXN0U3RyaW5nKCInICsgdGhpbmcgKyAnIiknKTsKICAgICB9CiAgIH07CiAKLSAgdmFyIHByb2Nlc3NvciA9IG5ldyB0aHJpZnQuTXVsdGlwbGV4ZWRQcm9jZXNzb3IoKTsKKyAgcHJvY2Vzc29yID0gbmV3IHRocmlmdC5NdWx0aXBsZXhlZFByb2Nlc3NvcigpOwogCi0gIHByb2Nlc3Nvci5yZWdpc3RlclByb2Nlc3NvcigiVGhyaWZ0VGVzdCIsCi0gICAgbmV3IFRocmlmdFRlc3QuUHJvY2Vzc29yKFRocmlmdFRlc3RIYW5kbGVyKSk7CisgIHByb2Nlc3Nvci5yZWdpc3RlclByb2Nlc3NvcigKKyAgICAiVGhyaWZ0VGVzdCIsCisgICAgbmV3IFRocmlmdFRlc3QuUHJvY2Vzc29yKFRocmlmdFRlc3RIYW5kbGVyKQorICApOwogCi0gIHByb2Nlc3Nvci5yZWdpc3RlclByb2Nlc3NvcigiU2Vjb25kU2VydmljZSIsCi0gICAgbmV3IFNlY29uZFNlcnZpY2UuUHJvY2Vzc29yKFNlY29uZFNlcnZpY2VIYW5kbGVyKSk7Ci0KKyAgcHJvY2Vzc29yLnJlZ2lzdGVyUHJvY2Vzc29yKAorICAgICJTZWNvbmRTZXJ2aWNlIiwKKyAgICBuZXcgU2Vjb25kU2VydmljZS5Qcm9jZXNzb3IoU2Vjb25kU2VydmljZUhhbmRsZXIpCisgICk7CiB9CiAKIGlmIChzc2wpIHsKLSAgb3B0aW9ucy50bHMgPSB7Ci0gICAga2V5OiBmcy5yZWFkRmlsZVN5bmMocGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJ3NlcnZlci5rZXknKSksCi0gICAgY2VydDogZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICdzZXJ2ZXIuY3J0JykpCi0gIH07CisgIGlmICgKKyAgICB0eXBlID09PSAidGNwIiB8fAorICAgIHR5cGUgPT09ICJtdWx0aXBsZXgiIHx8CisgICAgdHlwZSA9PT0gImh0dHAiIHx8CisgICAgdHlwZSA9PT0gIndlYnNvY2tldCIKKyAgKSB7CisgICAgb3B0aW9ucy50bHMgPSB7CisgICAgICBrZXk6IGZzLnJlYWRGaWxlU3luYyhwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAic2VydmVyLmtleSIpKSwKKyAgICAgIGNlcnQ6IGZzLnJlYWRGaWxlU3luYyhwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAic2VydmVyLmNydCIpKQorICAgIH07CisgIH0KIH0KIAotdmFyIHNlcnZlcjsKLWlmICh0eXBlID09PSAndGNwJykgewotICBzZXJ2ZXIgPSB0aHJpZnQuY3JlYXRlU2VydmVyKFRocmlmdFRlc3QsIGhhbmRsZXIsIG9wdGlvbnMpOwotfSBlbHNlIGlmICh0eXBlID09PSAnbXVsdGlwbGV4JykgeworbGV0IHNlcnZlcjsKK2lmICh0eXBlID09PSAidGNwIikgeworICBzZXJ2ZXIgPSB0aHJpZnQuY3JlYXRlU2VydmVyKFRocmlmdFRlc3QsIFRocmlmdFRlc3RIYW5kbGVyLCBvcHRpb25zKTsKK30gZWxzZSBpZiAodHlwZSA9PT0gIm11bHRpcGxleCIpIHsKICAgc2VydmVyID0gdGhyaWZ0LmNyZWF0ZU11bHRpcGxleFNlcnZlcihwcm9jZXNzb3IsIG9wdGlvbnMpOwotfSBlbHNlIGlmICh0eXBlID09PSAnaHR0cCcgfHwgdHlwZSA9PT0gJ3dlYnNvY2tldCcpIHsKK30gZWxzZSBpZiAodHlwZSA9PT0gImh0dHAiIHx8IHR5cGUgPT09ICJ3ZWJzb2NrZXQiKSB7CiAgIHNlcnZlciA9IHRocmlmdC5jcmVhdGVXZWJTZXJ2ZXIob3B0aW9ucyk7CiB9CiAKLXNlcnZlci5saXN0ZW4ocG9ydCk7CitpZiAoZG9tYWluU29ja2V0KSB7CisgIHNlcnZlci5saXN0ZW4oZG9tYWluU29ja2V0KTsKK30gZWxzZSBpZiAoCisgIHR5cGUgPT09ICJ0Y3AiIHx8CisgIHR5cGUgPT09ICJtdWx0aXBsZXgiIHx8CisgIHR5cGUgPT09ICJodHRwIiB8fAorICB0eXBlID09PSAid2Vic29ja2V0IgorKSB7CisgIHNlcnZlci5saXN0ZW4ocG9ydCk7Cit9CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL3Rlc3QvdGVzdC1jYXNlcy5qcyBiL2xpYi9ub2RlanMvdGVzdC90ZXN0LWNhc2VzLmpzCmluZGV4IDIzODQyMjEuLjAyYzU2NmYgMTAwNjQ0Ci0tLSBhL2xpYi9ub2RlanMvdGVzdC90ZXN0LWNhc2VzLmpzCisrKyBiL2xpYi9ub2RlanMvdGVzdC90ZXN0LWNhc2VzLmpzCkBAIC0xLDEzOCArMSwxNzcgQEAKLSd1c2Ugc3RyaWN0JzsKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KIAotdmFyIHR0eXBlcyA9IHJlcXVpcmUoJy4vZ2VuLW5vZGVqcy9UaHJpZnRUZXN0X3R5cGVzJyk7CisidXNlIHN0cmljdCI7CisKK2NvbnN0IGhlbHBlcnMgPSByZXF1aXJlKCIuL2hlbHBlcnMiKTsKK2NvbnN0IHR0eXBlcyA9IHJlcXVpcmUoYC4vJHtoZWxwZXJzLmdlblBhdGh9L1RocmlmdFRlc3RfdHlwZXNgKTsKK2NvbnN0IEludDY0ID0gcmVxdWlyZSgibm9kZS1pbnQ2NCIpOwogCiAvL2FsbCBMYW5ndWFnZXMgaW4gVVRGLTgKIC8qanNoaW50IC1XMTAwICovCi12YXIgc3RyaW5nVGVzdCA9IG1vZHVsZS5leHBvcnRzLnN0cmluZ1Rlc3QgPSAiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uw6lzLCDYp9mE2LnYsdio2YrYqSwg2YXYtdix2YksICIgKwotICAgICJBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXrJmXJiYXljYW4sINCR0LDRiNKh0L7RgNGCLCBCb2FyaXNjaCwgxb1lbWFpdMSXxaFrYSwgIiArCi0gICAgItCR0LXQu9Cw0YDRg9GB0LrQsNGPLCDQkdC10LvQsNGA0YPRgdC60LDRjyAo0YLQsNGA0LDRiNC60LXQstGW0YbQsCksINCR0YrQu9Cz0LDRgNGB0LrQuCwgQmFtYW5hbmthbiwgIiArCi0gICAgIuCmrOCmvuCmguCmsuCmviwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWzDoCwgTcOsbmctZMSVzKRuZy1uZ+G5s8yELCDQndC+0YXRh9C40LnQvSwgIiArCi0gICAgIkNlYnVhbm8sIOGPo+GOs+GOqSwgxIxlc2t5LCDQodC70L7QstGjzIHQvdGM0YHQutGKIC8g4rCU4rCO4rCR4rCC4rCh4rCQ4rCg4rCU4rCN4rCfLCDQp9OR0LLQsNGI0LvQsCwgQ3ltcmFlZywgIiArCi0gICAgIkRhbnNrLCBaYXpha2ksIN6L3qjeiN6s3oDeqN6E3qbekN6wLCDOlc67zrvOt869zrnOus6sLCBFbWlsacOgbiBlIHJ1bWFnbsOybCwgRW5nbGlzaCwgIiArCi0gICAgIkVzcGVyYW50bywgRXNwYcOxb2wsIEVlc3RpLCBFdXNrYXJhLCDZgdin2LHYs9uMLCBTdW9taSwgVsO1cm8sIEbDuHJveXNrdCwgIiArCi0gICAgIkZyYW7Dp2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwg6LSb6KqeLCBHw6BpZGhsaWcsIEdhbGVnbywgIiArCi0gICAgIkF2YcOxZSfhur0sIOCql+CrgeCqnOCqsOCqvuCqpOCrgCwgR2FlbGcsINei15HXqNeZ16osIOCkueCkv+CkqOCljeCkpuClgCwgRmlqaSBIaW5kaSwgSHJ2YXRza2ksICIgKwotICAgICJLcmV5w7JsIGF5aXN5ZW4sIE1hZ3lhciwg1YDVodW11aXWgNWl1bYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCAiICsKLSAgICAiSWxva2FubywgSWRvLCDDjXNsZW5za2EsIEl0YWxpYW5vLCDml6XmnKzoqp4sIExvamJhbiwgQmFzYSBKYXdhLCAiICsKLSAgICAi4YOl4YOQ4YOg4YOX4YOj4YOa4YOYLCBLb25nbywgS2FsYWFsbGlzdXQsIOCyleCyqOCzjeCyqOCyoSwg7ZWc6rWt7Ja0LCDQmtGK0LDRgNCw0YfQsNC5LdCc0LDQu9C60YrQsNGALCAiICsKLSAgICAiUmlwb2FyaXNjaCwgS3VyZMOuLCDQmtC+0LzQuCwgS2VybmV3ZWssINCa0YvRgNCz0YvQt9GH0LAsIExhdGluYSwgTGFkaW5vLCAiICsKLSAgICAiTMOrdHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ8OhbGEsIOC6peC6suC6pywgTGlldHV2acWzLCBMYXR2aWXFoXUsIEJhc2EgIiArCi0gICAgIkJhbnl1bWFzYW4sIE1hbGFnYXN5LCDQnNCw0LrQtdC00L7QvdGB0LrQuCwg4LSu4LSy4LSv4LS+4LSz4LSCLCDgpK7gpLDgpL7gpKDgpYAsINmF2KfYstmQ2LHZiNmG24wsIEJhaGFzYSAiICsKLSAgICAiTWVsYXl1LCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwg4KSo4KWH4KSq4KS+4KSyIOCkreCkvuCkt+CkviwgTmVkZXJsYW5kcywg4oCqIiArCi0gICAgIk5vcnNrIChueW5vcnNrKeKArCwg4oCqTm9yc2sgKGJva23DpWwp4oCsLCBOb3Vvcm1hbmQsIERpbsOpIGJpemFhZCwgIiArCi0gICAgIk9jY2l0YW4sINCY0YDQvtC90LDRgywgUGFwaWFtZW50dSwgRGVpdHNjaCwgUG9sc2tpLCDZvtmG2KzYp9io24wsINm+2prYqtmILCAiICsKLSAgICAiTm9yZnVrIC8gUGl0a2VybiwgUG9ydHVndcOqcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tw6JuxIMsICIgKwotICAgICLQoNGD0YHRgdC60LjQuSwg0KHQsNGF0LAg0YLRi9C70LAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTw6FtZWdpZWxsYSwgU2ltcGxlICIgKwotICAgICJFbmdsaXNoLCBTbG92ZW7EjWluYSwgU2xvdmVuxaHEjWluYSwg0KHRgNC/0YHQutC4IC8gU3Jwc2tpLCBTZWVsdGVyc2ssICIgKwotICAgICJTdmVuc2thLCBLaXN3YWhpbGksIOCupOCuruCuv+CutOCvjSwg4LCk4LGG4LCy4LGB4LCX4LGBLCDQotC+0rfQuNC606MsIOC5hOC4l+C4oiwgVMO8cmttZW7Dp2UsIFRhZ2Fsb2csICIgKwotICAgICJUw7xya8OnZSwg0KLQsNGC0LDRgNGH0LAvVGF0YXLDp2EsINCj0LrRgNCw0ZfQvdGB0YzQutCwLCDYp9ix2K/ZiCwgVGnhur9uZyBWaeG7h3QsIFZvbGFww7xrLCAiICsKLSAgICAiV2Fsb24sIFdpbmFyYXksIOWQtOivrSwgaXNpWGhvc2EsINeZ15nWtNeT15nXqSwgWW9yw7liw6EsIFplw6p1d3MsIOS4reaWhywgIiArCi0gICAgIkLDom4tbMOibS1nw7osIOeyteiqniI7Citjb25zdCBzdHJpbmdUZXN0ID0gKG1vZHVsZS5leHBvcnRzLnN0cmluZ1Rlc3QgPQorICAiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uw6lzLCDYp9mE2LnYsdio2YrYqSwg2YXYtdix2YksICIgKworICAiQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6yZlyYmF5Y2FuLCDQkdCw0YjSodC+0YDRgiwgQm9hcmlzY2gsIMW9ZW1haXTEl8Wha2EsICIgKworICAi0JHQtdC70LDRgNGD0YHQutCw0Y8sINCR0LXQu9Cw0YDRg9GB0LrQsNGPICjRgtCw0YDQsNGI0LrQtdCy0ZbRhtCwKSwg0JHRitC70LPQsNGA0YHQutC4LCBCYW1hbmFua2FuLCAiICsKKyAgIuCmrOCmvuCmguCmsuCmviwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWzDoCwgTcOsbmctZMSVzKRuZy1uZ+G5s8yELCDQndC+0YXRh9C40LnQvSwgIiArCisgICJDZWJ1YW5vLCDhj6PhjrPhjqksIMSMZXNreSwg0KHQu9C+0LLRo8yB0L3RjNGB0LrRiiAvIOKwlOKwjuKwkeKwguKwoeKwkOKwoOKwlOKwjeKwnywg0KfTkdCy0LDRiNC70LAsIEN5bXJhZWcsICIgKworICAiRGFuc2ssIFphemFraSwg3oveqN6I3qzegN6o3oTept6Q3rAsIM6VzrvOu863zr3Ouc66zqwsIEVtaWxpw6BuIGUgcnVtYWduw7JsLCBFbmdsaXNoLCAiICsKKyAgIkVzcGVyYW50bywgRXNwYcOxb2wsIEVlc3RpLCBFdXNrYXJhLCDZgdin2LHYs9uMLCBTdW9taSwgVsO1cm8sIEbDuHJveXNrdCwgIiArCisgICJGcmFuw6dhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIOi0m+iqniwgR8OgaWRobGlnLCBHYWxlZ28sICIgKworICAiQXZhw7FlJ+G6vSwg4KqX4KuB4Kqc4Kqw4Kq+4Kqk4KuALCBHYWVsZywg16LXkdeo15nXqiwg4KS54KS/4KSo4KWN4KSm4KWALCBGaWppIEhpbmRpLCBIcnZhdHNraSwgIiArCisgICJLcmV5w7JsIGF5aXN5ZW4sIE1hZ3lhciwg1YDVodW11aXWgNWl1bYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCAiICsKKyAgIklsb2thbm8sIElkbywgw41zbGVuc2thLCBJdGFsaWFubywg5pel5pys6KqeLCBMb2piYW4sIEJhc2EgSmF3YSwgIiArCisgICLhg6Xhg5Dhg6Dhg5fhg6Phg5rhg5gsIEtvbmdvLCBLYWxhYWxsaXN1dCwg4LKV4LKo4LON4LKo4LKhLCDtlZzqta3slrQsINCa0YrQsNGA0LDRh9Cw0Lkt0JzQsNC70LrRitCw0YAsICIgKworICAiUmlwb2FyaXNjaCwgS3VyZMOuLCDQmtC+0LzQuCwgS2VybmV3ZWssINCa0YvRgNCz0YvQt9GH0LAsIExhdGluYSwgTGFkaW5vLCAiICsKKyAgIkzDq3R6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmfDoWxhLCDguqXgurLguqcsIExpZXR1dmnFsywgTGF0dmllxaF1LCBCYXNhICIgKworICAiQmFueXVtYXNhbiwgTWFsYWdhc3ksINCc0LDQutC10LTQvtC90YHQutC4LCDgtK7gtLLgtK/gtL7gtLPgtIIsIOCkruCksOCkvuCkoOClgCwg2YXYp9iy2ZDYsdmI2YbbjCwgQmFoYXNhICIgKworICAiTWVsYXl1LCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwg4KSo4KWH4KSq4KS+4KSyIOCkreCkvuCkt+CkviwgTmVkZXJsYW5kcywg4oCqIiArCisgICJOb3JzayAobnlub3JzaynigKwsIOKAqk5vcnNrIChib2ttw6VsKeKArCwgTm91b3JtYW5kLCBEaW7DqSBiaXphYWQsICIgKworICAiT2NjaXRhbiwg0JjRgNC+0L3QsNGDLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBQb2xza2ksINm+2YbYrNin2KjbjCwg2b7amtiq2YgsICIgKworICAiTm9yZnVrIC8gUGl0a2VybiwgUG9ydHVndcOqcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tw6JuxIMsICIgKworICAi0KDRg9GB0YHQutC40LksINCh0LDRhdCwINGC0YvQu9CwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU8OhbWVnaWVsbGEsIFNpbXBsZSAiICsKKyAgIkVuZ2xpc2gsIFNsb3ZlbsSNaW5hLCBTbG92ZW7FocSNaW5hLCDQodGA0L/RgdC60LggLyBTcnBza2ksIFNlZWx0ZXJzaywgIiArCisgICJTdmVuc2thLCBLaXN3YWhpbGksIOCupOCuruCuv+CutOCvjSwg4LCk4LGG4LCy4LGB4LCX4LGBLCDQotC+0rfQuNC606MsIOC5hOC4l+C4oiwgVMO8cmttZW7Dp2UsIFRhZ2Fsb2csICIgKworICAiVMO8cmvDp2UsINCi0LDRgtCw0YDRh9CwL1RhdGFyw6dhLCDQo9C60YDQsNGX0L3RgdGM0LrQsCwg2KfYsdiv2YgsIFRp4bq/bmcgVmnhu4d0LCBWb2xhcMO8aywgIiArCisgICJXYWxvbiwgV2luYXJheSwg5ZC06K+tLCBpc2lYaG9zYSwg15nXmda015PXmdepLCBZb3LDuWLDoSwgWmXDqnV3cywg5Lit5paHLCAiICsKKyAgIkLDom4tbMOibS1nw7osIOeyteiqniIpOwogLypqc2hpbnQgK1cxMDAgKi8KIAotdmFyIHNwZWNpYWxDaGFyYWN0ZXJzID0gbW9kdWxlLmV4cG9ydHMuc3BlY2lhbENoYXJhY3RlcnMgPSAncXVvdGU6IFwiIGJhY2tzbGFzaDonICsKLSAgICAnIGZvcndhcmRzbGFzaC1lc2NhcGVkOiBcLyAnICsKLSAgICAnIGJhY2tzcGFjZTogXGIgZm9ybWZlZWQ6IFxmIG5ld2xpbmU6IFxuIHJldHVybjogXHIgdGFiOiAnICsKLSAgICAnIG5vdy1hbGwtb2YtdGhlbS10b2dldGhlcjogIlxcXC9cYlxuXHJcdCcgKwotICAgICcgbm93LWEtYnVuY2gtb2YtanVuazogIUAjJCUmKCkoJiUkI3t9e308Pjw+PCcgKwotICAgICcgY2hhci10by10ZXN0LWpzb24tcGFyc2luZzogXV0gXCJdXSBcXCIgfX19eyBbW1sgJzsKK2NvbnN0IHNwZWNpYWxDaGFyYWN0ZXJzID0gKG1vZHVsZS5leHBvcnRzLnNwZWNpYWxDaGFyYWN0ZXJzID0KKyAgJ3F1b3RlOiAiIGJhY2tzbGFzaDonICsKKyAgIiBmb3J3YXJkc2xhc2gtZXNjYXBlZDogLyAiICsKKyAgIiBiYWNrc3BhY2U6IFxiIGZvcm1mZWVkOiBcZiBuZXdsaW5lOiBcbiByZXR1cm46IFxyIHRhYjogIiArCisgICcgbm93LWFsbC1vZi10aGVtLXRvZ2V0aGVyOiAiXFwvXGJcblxyXHQnICsKKyAgIiBub3ctYS1idW5jaC1vZi1qdW5rOiAhQCMkJSYoKSgmJSQje317fTw+PD48IiArCisgICcgY2hhci10by10ZXN0LWpzb24tcGFyc2luZzogXV0gIl1dIFxcIiB9fX17IFtbWyAnKTsKIAotdmFyIG1hcFRlc3RJbnB1dCA9IG1vZHVsZS5leHBvcnRzLm1hcFRlc3RJbnB1dCA9IHsKLSAgImEiOiIxMjMiLCAiYSBiIjoid2l0aCBzcGFjZXMgIiwgInNhbWUiOiJzYW1lIiwgIjAiOiJudW1lcmljIGtleSIsCi0gICJsb25nVmFsdWUiOnN0cmluZ1Rlc3QsIHN0cmluZ1Rlc3Q6Imxvbmcga2V5IgotfTsKK2NvbnN0IG1hcFRlc3RJbnB1dCA9IChtb2R1bGUuZXhwb3J0cy5tYXBUZXN0SW5wdXQgPSB7CisgIGE6ICIxMjMiLAorICAiYSBiIjogIndpdGggc3BhY2VzICIsCisgIHNhbWU6ICJzYW1lIiwKKyAgIjAiOiAibnVtZXJpYyBrZXkiLAorICBsb25nVmFsdWU6IHN0cmluZ1Rlc3QsCisgIHN0cmluZ1Rlc3Q6ICJsb25nIGtleSIKK30pOwogCi12YXIgc2ltcGxlID0gWwotICBbJ3Rlc3RWb2lkJywgdW5kZWZpbmVkXSwKLSAgWyd0ZXN0U3RyaW5nJywgJ1Rlc3QnXSwKLSAgWyd0ZXN0U3RyaW5nJywgJyddLAotICBbJ3Rlc3RTdHJpbmcnLCBzdHJpbmdUZXN0XSwKLSAgWyd0ZXN0U3RyaW5nJywgc3BlY2lhbENoYXJhY3RlcnNdLAotICBbJ3Rlc3RCb29sJywgdHJ1ZV0sCi0gIFsndGVzdEJvb2wnLCBmYWxzZV0sCi0gIFsndGVzdEJ5dGUnLCAxXSwKLSAgWyd0ZXN0Qnl0ZScsIDBdLAotICBbJ3Rlc3RCeXRlJywgLTFdLAotICBbJ3Rlc3RCeXRlJywgLTEyN10sCi0gIFsndGVzdEkzMicsIC0xXSwKLSAgWyd0ZXN0RG91YmxlJywgLTUuMjA5ODUyM10sCi0gIFsndGVzdERvdWJsZScsIDcuMDEyMDUyMTc1MjE1MDQ0XSwKLSAgWyd0ZXN0RW51bScsIHR0eXBlcy5OdW1iZXJ6Lk9ORV0KK2NvbnN0IHNpbXBsZSA9IFsKKyAgWyJ0ZXN0Vm9pZCIsIHVuZGVmaW5lZF0sCisgIFsidGVzdFN0cmluZyIsICJUZXN0Il0sCisgIFsidGVzdFN0cmluZyIsICIiXSwKKyAgWyJ0ZXN0U3RyaW5nIiwgc3RyaW5nVGVzdF0sCisgIFsidGVzdFN0cmluZyIsIHNwZWNpYWxDaGFyYWN0ZXJzXSwKKyAgWyJ0ZXN0Qm9vbCIsIHRydWVdLAorICBbInRlc3RCb29sIiwgZmFsc2VdLAorICBbInRlc3RCeXRlIiwgMV0sCisgIFsidGVzdEJ5dGUiLCAwXSwKKyAgWyJ0ZXN0Qnl0ZSIsIC0xXSwKKyAgWyJ0ZXN0Qnl0ZSIsIC0xMjddLAorICBbInRlc3RJMzIiLCAtMV0sCisgIFsidGVzdERvdWJsZSIsIC01LjIwOTg1MjNdLAorICBbInRlc3REb3VibGUiLCA3LjAxMjA1MjE3NTIxNTA0NF0sCisgIFsidGVzdEVudW0iLCB0dHlwZXMuTnVtYmVyei5PTkVdLAorICBbInRlc3RJNjQiLCA1XSwKKyAgWyJ0ZXN0STY0IiwgLTVdLAorICBbInRlc3RJNjQiLCA3MzQzNTk3MzgzNjhdLAorICBbInRlc3RJNjQiLCAtNzM0MzU5NzM4MzY4XSwKKyAgWyJ0ZXN0STY0IiwgbmV3IEludDY0KG5ldyBCdWZmZXIoWzAsIDB4MjAsIDAsIDAsIDAsIDAsIDAsIDFdKSldLCAvLyAyXjUzKzEKKyAgWworICAgICJ0ZXN0STY0IiwKKyAgICBuZXcgSW50NjQobmV3IEJ1ZmZlcihbMHhmZiwgMHhkZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZl0pKQorICBdLCAvLyAtMl41My0xCisgIFsidGVzdFR5cGVkZWYiLCA2OV0KIF07CiAKLXZhciBzaW1wbGVMb29zZSA9IFsKLSAgWyd0ZXN0STY0JywgNV0sCi0gIFsndGVzdEk2NCcsIC01XSwKLSAgWyd0ZXN0STY0JywgNzM0MzU5NzM4MzY4XSwKLSAgWyd0ZXN0STY0JywgLTM0MzU5NzM4MzY4XSwKLSAgWyd0ZXN0STY0JywgLTczNDM1OTczODM2OF0sCi0gIFsndGVzdFR5cGVkZWYnLCA2OV0KLV0KLQotdmFyIG1hcG91dCA9IHt9OwotZm9yICh2YXIgaSA9IDA7IGkgPCA1OyArK2kpIHsKLSAgbWFwb3V0W2ldID0gaS0xMDsKK2NvbnN0IG1hcG91dCA9IHt9OworZm9yIChsZXQgaSA9IDA7IGkgPCA1OyArK2kpIHsKKyAgbWFwb3V0W2ldID0gaSAtIDEwOwogfQogCi12YXIgZGVlcCA9IFsKLSAgWyd0ZXN0TWFwJywgbWFwb3V0XSwKLSAgWyd0ZXN0U2V0JywgWzEsMiwzXV0sCi0gIFsndGVzdExpc3QnLCBbMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTksMjBdXSwKLSAgWyd0ZXN0U3RyaW5nTWFwJywgbWFwVGVzdElucHV0XQorY29uc3QgZGVlcCA9IFsKKyAgWworICAgICJ0ZXN0TGlzdCIsCisgICAgWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMF0KKyAgXQogXTsKIAotdmFyIG91dCA9IG5ldyB0dHlwZXMuWHRydWN0KHsKLSAgc3RyaW5nX3RoaW5nOiAnWmVybycsCitjb25zdCBkZWVwVW5vcmRlcmVkID0gWworICBbInRlc3RNYXAiLCBtYXBvdXRdLAorICBbInRlc3RTZXQiLCBbMSwgMiwgM11dLAorICBbInRlc3RTdHJpbmdNYXAiLCBtYXBUZXN0SW5wdXRdCitdOworCitjb25zdCBvdXQgPSBuZXcgdHR5cGVzLlh0cnVjdCh7CisgIHN0cmluZ190aGluZzogIlplcm8iLAogICBieXRlX3RoaW5nOiAxLAogICBpMzJfdGhpbmc6IC0zLAogICBpNjRfdGhpbmc6IDEwMDAwMDAKIH0pOwogCi12YXIgb3V0MiA9IG5ldyB0dHlwZXMuWHRydWN0MigpOworY29uc3Qgb3V0MiA9IG5ldyB0dHlwZXMuWHRydWN0MigpOwogb3V0Mi5ieXRlX3RoaW5nID0gMTsKIG91dDIuc3RydWN0X3RoaW5nID0gb3V0Owogb3V0Mi5pMzJfdGhpbmcgPSA1OwogCi12YXIgY3JhenkgPSBuZXcgdHR5cGVzLkluc2FuaXR5KHsKLSAgInVzZXJNYXAiOnsgIjUiOjUsICI4Ijo4IH0sCi0gICJ4dHJ1Y3RzIjpbbmV3IHR0eXBlcy5YdHJ1Y3QoewotICAgICAgInN0cmluZ190aGluZyI6Ikdvb2RieWU0IiwKLSAgICAgICJieXRlX3RoaW5nIjo0LAotICAgICAgImkzMl90aGluZyI6NCwKLSAgICAgICJpNjRfdGhpbmciOjQKLSAgICB9KSwgbmV3IHR0eXBlcy5YdHJ1Y3QoewotICAgICAgInN0cmluZ190aGluZyI6IkhlbGxvMiIsCi0gICAgICAiYnl0ZV90aGluZyI6MiwKLSAgICAgICJpMzJfdGhpbmciOjIsCi0gICAgICAiaTY0X3RoaW5nIjoyCi0gICAgfSldCitjb25zdCBjcmF6eSA9IG5ldyB0dHlwZXMuSW5zYW5pdHkoeworICB1c2VyTWFwOiB7ICI1IjogNSwgIjgiOiA4IH0sCisgIHh0cnVjdHM6IFsKKyAgICBuZXcgdHR5cGVzLlh0cnVjdCh7CisgICAgICBzdHJpbmdfdGhpbmc6ICJHb29kYnllNCIsCisgICAgICBieXRlX3RoaW5nOiA0LAorICAgICAgaTMyX3RoaW5nOiA0LAorICAgICAgaTY0X3RoaW5nOiA0CisgICAgfSksCisgICAgbmV3IHR0eXBlcy5YdHJ1Y3QoeworICAgICAgc3RyaW5nX3RoaW5nOiAiSGVsbG8yIiwKKyAgICAgIGJ5dGVfdGhpbmc6IDIsCisgICAgICBpMzJfdGhpbmc6IDIsCisgICAgICBpNjRfdGhpbmc6IDIKKyAgICB9KQorICBdCiB9KTsKIAotdmFyIGNyYXp5MiA9IG5ldyB0dHlwZXMuSW5zYW5pdHkoewotICAidXNlck1hcCI6eyAiNSI6NSwgIjgiOjggfSwKLSAgInh0cnVjdHMiOlt7Ci0gICAgICAic3RyaW5nX3RoaW5nIjoiR29vZGJ5ZTQiLAotICAgICAgImJ5dGVfdGhpbmciOjQsCi0gICAgICAiaTMyX3RoaW5nIjo0LAotICAgICAgImk2NF90aGluZyI6NAotICAgIH0sIHsKLSAgICAgICJzdHJpbmdfdGhpbmciOiJIZWxsbzIiLAotICAgICAgImJ5dGVfdGhpbmciOjIsCi0gICAgICAiaTMyX3RoaW5nIjoyLAotICAgICAgImk2NF90aGluZyI6MgotICAgIH1dCitjb25zdCBjcmF6eTIgPSBuZXcgdHR5cGVzLkluc2FuaXR5KHsKKyAgdXNlck1hcDogeyAiNSI6IDUsICI4IjogOCB9LAorICB4dHJ1Y3RzOiBbCisgICAgeworICAgICAgc3RyaW5nX3RoaW5nOiAiR29vZGJ5ZTQiLAorICAgICAgYnl0ZV90aGluZzogNCwKKyAgICAgIGkzMl90aGluZzogNCwKKyAgICAgIGk2NF90aGluZzogNAorICAgIH0sCisgICAgeworICAgICAgc3RyaW5nX3RoaW5nOiAiSGVsbG8yIiwKKyAgICAgIGJ5dGVfdGhpbmc6IDIsCisgICAgICBpMzJfdGhpbmc6IDIsCisgICAgICBpNjRfdGhpbmc6IDIKKyAgICB9CisgIF0KIH0pOwogCi0KLXZhciBpbnNhbml0eSA9IHsKLSAgIjEiOnsgIjIiOiBjcmF6eSwgIjMiOiBjcmF6eSB9LAotICAiMiI6eyAiNiI6eyAidXNlck1hcCI6e30sICJ4dHJ1Y3RzIjpbXSB9IH0KK2NvbnN0IGluc2FuaXR5ID0geworICAiMSI6IHsgIjIiOiBjcmF6eSwgIjMiOiBjcmF6eSB9LAorICAiMiI6IHsgIjYiOiB7IHVzZXJNYXA6IHt9LCB4dHJ1Y3RzOiBbXSB9IH0KIH07CiAKIG1vZHVsZS5leHBvcnRzLnNpbXBsZSA9IHNpbXBsZTsKLW1vZHVsZS5leHBvcnRzLnNpbXBsZUxvb3NlID0gc2ltcGxlTG9vc2U7CiBtb2R1bGUuZXhwb3J0cy5kZWVwID0gZGVlcDsKK21vZHVsZS5leHBvcnRzLmRlZXBVbm9yZGVyZWQgPSBkZWVwVW5vcmRlcmVkOwogCiBtb2R1bGUuZXhwb3J0cy5vdXQgPSBvdXQ7CiBtb2R1bGUuZXhwb3J0cy5vdXQyID0gb3V0MjsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvdGVzdC90ZXN0QWxsLnNoIGIvbGliL25vZGVqcy90ZXN0L3Rlc3RBbGwuc2gKaW5kZXggMzhiMjg0YS4uMjRmMWYyZSAxMDA3NTUKLS0tIGEvbGliL25vZGVqcy90ZXN0L3Rlc3RBbGwuc2gKKysrIGIvbGliL25vZGVqcy90ZXN0L3Rlc3RBbGwuc2gKQEAgLTI0LDcgKzI0LDYgQEAKIERJUj0iJCggY2QgIiQoIGRpcm5hbWUgIiQwIiApIiAmJiBwd2QgKSIKIAogSVNUQU5CVUw9IiRESVIvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2lzdGFuYnVsL2xpYi9jbGkuanMiCi1SVU5CUk9XU0VSPSIkRElSLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9ydW4tYnJvd3Nlci9iaW4vY2xpLmpzIgogCiBSRVBPUlRfUFJFRklYPSIke0RJUn0vLi4vY292ZXJhZ2UvcmVwb3J0IgogCkBAIC0zNCwzNyArMzMsMjcgQEAKIAogdGVzdFNlcnZlcigpCiB7Ci0gIGVjaG8gIiAgIFRlc3RpbmcgJDEgQ2xpZW50L1NlcnZlciB3aXRoIHByb3RvY29sICQyIGFuZCB0cmFuc3BvcnQgJDMgJDQiOworICBlY2hvICIgIFtFQ01BICQxXSBUZXN0aW5nICQyIENsaWVudC9TZXJ2ZXIgd2l0aCBwcm90b2NvbCAkMyBhbmQgdHJhbnNwb3J0ICQ0ICQ1IjsKICAgUkVUPTAKICAgaWYgWyAtbiAiJHtDT1ZFUn0iIF07IHRoZW4KLSAgICAke0lTVEFOQlVMfSBjb3ZlciAke0RJUn0vc2VydmVyLmpzIC0tZGlyICR7UkVQT1JUX1BSRUZJWH0ke0NPVU5UfSAtLWhhbmRsZS1zaWdpbnQgLS0gLS10eXBlICQxIC1wICQyIC10ICQzICQ0ICYKKyAgICAke0lTVEFOQlVMfSBjb3ZlciAke0RJUn0vc2VydmVyLmpzIC0tZGlyICR7UkVQT1JUX1BSRUZJWH0ke0NPVU5UfSAtLWhhbmRsZS1zaWdpbnQgLS0gLS10eXBlICQyIC1wICQzIC10ICQ0ICQ1ICYKICAgICBDT1VOVD0kKChDT1VOVCsxKSkKICAgZWxzZQotICAgIG5vZGUgJHtESVJ9L3NlcnZlci5qcyAtLXR5cGUgJDEgLXAgJDIgLXQgJDMgJDQgJgorICAgIG5vZGUgJHtESVJ9L3NlcnZlci5qcyAtLSR7MX0gLS10eXBlICQyIC1wICQzIC10ICQ0ICQ1ICYKICAgZmkKICAgU0VSVkVSUElEPSQhCi0gIHNsZWVwIDEKKyAgc2xlZXAgMC4xCiAgIGlmIFsgLW4gIiR7Q09WRVJ9IiBdOyB0aGVuCi0gICAgJHtJU1RBTkJVTH0gY292ZXIgJHtESVJ9L2NsaWVudC5qcyAtLWRpciAke1JFUE9SVF9QUkVGSVh9JHtDT1VOVH0gLS0gLS10eXBlICQxIC1wICQyIC10ICQzICQ0IHx8IFJFVD0xCisgICAgJHtJU1RBTkJVTH0gY292ZXIgJHtESVJ9L2NsaWVudC5qcyAtLWRpciAke1JFUE9SVF9QUkVGSVh9JHtDT1VOVH0gLS0gLS0kezF9IC0tdHlwZSAkMiAtcCAkMyAtdCAkNCAkNSB8fCBSRVQ9MQogICAgIENPVU5UPSQoKENPVU5UKzEpKQogICBlbHNlCi0gICAgbm9kZSAke0RJUn0vY2xpZW50LmpzIC0tdHlwZSAkMSAtcCAkMiAtdCAkMyAkNCB8fCBSRVQ9MQorICAgIG5vZGUgJHtESVJ9L2NsaWVudC5qcyAtLSR7MX0gLS10eXBlICQyIC1wICQzIC10ICQ0ICQ1IHx8IFJFVD0xCiAgIGZpCiAgIGtpbGwgLTIgJFNFUlZFUlBJRCB8fCBSRVQ9MQorICB3YWl0ICRTRVJWRVJQSUQKICAgcmV0dXJuICRSRVQKIH0KIAotdGVzdEJyb3dzZXIoKQotewotICBlY2hvICIgICBUZXN0aW5nIGJyb3dzZXIgY2xpZW50IHdpdGggaHR0cCBzZXJ2ZXIgd2l0aCBqc29uIHByb3RvY29sIGFuZCBidWZmZXJlZCB0cmFuc3BvcnQiOwotICBSRVQ9MAotICBub2RlICR7RElSfS9zZXJ2ZXIuanMgLS10eXBlIGh0dHAgLXAganNvbiAtdCBidWZmZXJlZCAmCi0gIFNFUlZFUlBJRD0kIQotICBzbGVlcCAxCi0gICR7UlVOQlJPV1NFUn0gJHtESVJ9L2Jyb3dzZXJfY2xpZW50LmpzIC0tcGhhbnRvbSB8fCBSRVQ9MQotICBraWxsIC0yICRTRVJWRVJQSUQgfHwgUkVUPTEKLSAgcmV0dXJuICRSRVQKLX0KIAogVEVTVE9LPTAKIApAQCAtNzIsNiArNjEsOSBAQAogCiAke0RJUn0vLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtbyAke0RJUn0gLS1nZW4ganM6bm9kZSAke0RJUn0vLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAogJHtESVJ9Ly4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLW8gJHtESVJ9IC0tZ2VuIGpzOm5vZGUgJHtESVJ9Ly4uLy4uLy4uL3Rlc3QvSnNEZWVwQ29uc3RydWN0b3JUZXN0LnRocmlmdAorbWtkaXIgJHtESVJ9L2dlbi1ub2RlanMtZXM2Ciske0RJUn0vLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtb3V0ICR7RElSfS9nZW4tbm9kZWpzLWVzNiAtLWdlbiBqczpub2RlLGVzNiAke0RJUn0vLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorJHtESVJ9Ly4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLW91dCAke0RJUn0vZ2VuLW5vZGVqcy1lczYgLS1nZW4ganM6bm9kZSxlczYgJHtESVJ9Ly4uLy4uLy4uL3Rlc3QvSnNEZWVwQ29uc3RydWN0b3JUZXN0LnRocmlmdAogCiAjdW5pdCB0ZXN0cwogCkBAIC04MiwyMSArNzQsMjAgQEAKIAogZm9yIHR5cGUgaW4gdGNwIG11bHRpcGxleCB3ZWJzb2NrZXQgaHR0cAogZG8KLQogICBmb3IgcHJvdG9jb2wgaW4gY29tcGFjdCBiaW5hcnkganNvbgogICBkbwotCiAgICAgZm9yIHRyYW5zcG9ydCBpbiBidWZmZXJlZCBmcmFtZWQKICAgICBkbwotICAgICAgdGVzdFNlcnZlciAkdHlwZSAkcHJvdG9jb2wgJHRyYW5zcG9ydCB8fCBURVNUT0s9MQotICAgICAgdGVzdFNlcnZlciAkdHlwZSAkcHJvdG9jb2wgJHRyYW5zcG9ydCAtLXNzbCB8fCBURVNUT0s9MQotICAgICAgdGVzdFNlcnZlciAkdHlwZSAkcHJvdG9jb2wgJHRyYW5zcG9ydCAtLXByb21pc2UgfHwgVEVTVE9LPTEKKyAgICAgIGZvciBlY21hX3ZlcnNpb24gaW4gZXM1IGVzNgorICAgICAgZG8KKyAgICAgICAgdGVzdFNlcnZlciAkZWNtYV92ZXJzaW9uICR0eXBlICRwcm90b2NvbCAkdHJhbnNwb3J0IHx8IFRFU1RPSz0xCisgICAgICAgIHRlc3RTZXJ2ZXIgJGVjbWFfdmVyc2lvbiAkdHlwZSAkcHJvdG9jb2wgJHRyYW5zcG9ydCAtLXNzbCB8fCBURVNUT0s9MQorICAgICAgICB0ZXN0U2VydmVyICRlY21hX3ZlcnNpb24gJHR5cGUgJHByb3RvY29sICR0cmFuc3BvcnQgLS1jYWxsYmFjayB8fCBURVNUT0s9MQorICAgICAgZG9uZQogICAgIGRvbmUKICAgZG9uZQogZG9uZQogCi0jIFhIUiBvbmx5IHVudGlsIHBoYW50b21qcyAyIGlzIHJlbGVhc2VkLgotdGVzdEJyb3dzZXIKIAogaWYgWyAtbiAiJHtDT1ZFUn0iIF07IHRoZW4KICAgJHtJU1RBTkJVTH0gcmVwb3J0IC0tZGlyICIke0RJUn0vLi4vY292ZXJhZ2UiIC0taW5jbHVkZSAiJHtESVJ9Ly4uL2NvdmVyYWdlL3JlcG9ydCovY292ZXJhZ2UuanNvbiIgbGNvdiBjb2JlcnR1cmEgaHRtbApkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy90ZXN0L3Rlc3RfZHJpdmVyLmpzIGIvbGliL25vZGVqcy90ZXN0L3Rlc3RfZHJpdmVyLmpzCmluZGV4IDI3ZmZkNjMuLjdjOWE5MTkgMTAwNjQ0Ci0tLSBhL2xpYi9ub2RlanMvdGVzdC90ZXN0X2RyaXZlci5qcworKysgYi9saWIvbm9kZWpzL3Rlc3QvdGVzdF9kcml2ZXIuanMKQEAgLTE3LDIyMCArMTcsMjc5IEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0gLy8gVGhpcyBpcyB0aGUgTm9kZS5qcyB0ZXN0IGRyaXZlciBmb3IgdGhlIHN0YW5kYXJkIEFwYWNoZSBUaHJpZnQKLSAvLyB0ZXN0IHNlcnZpY2UuIFRoZSBkcml2ZXIgaW52b2tlcyBldmVyeSBmdW5jdGlvbiBkZWZpbmVkIGluIHRoZQotIC8vIFRocmlmdCBUZXN0IHNlcnZpY2Ugd2l0aCBhIHJlcHJlc2VudGF0aXZlIHJhbmdlIG9mIHBhcmFtZXRlcnMuCi0gLy8KLSAvLyBUaGUgVGhyaWZ0VGVzdERyaXZlciBmdW5jdGlvbiByZXF1aXJlcyBhIGNsaWVudCBvYmplY3QKLSAvLyBjb25uZWN0ZWQgdG8gYSBzZXJ2ZXIgaG9zdGluZyB0aGUgVGhyaWZ0IFRlc3Qgc2VydmljZSBhbmQKLSAvLyBzdXBwb3J0cyBhbiBvcHRpb25hbCBjYWxsYmFjayBmdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQgd2l0aAotIC8vIGEgc3RhdHVzIG1lc3NhZ2Ugd2hlbiB0aGUgdGVzdCBpcyBjb21wbGV0ZS4KKy8vIFRoaXMgaXMgdGhlIE5vZGUuanMgdGVzdCBkcml2ZXIgZm9yIHRoZSBzdGFuZGFyZCBBcGFjaGUgVGhyaWZ0CisvLyB0ZXN0IHNlcnZpY2UuIFRoZSBkcml2ZXIgaW52b2tlcyBldmVyeSBmdW5jdGlvbiBkZWZpbmVkIGluIHRoZQorLy8gVGhyaWZ0IFRlc3Qgc2VydmljZSB3aXRoIGEgcmVwcmVzZW50YXRpdmUgcmFuZ2Ugb2YgcGFyYW1ldGVycy4KKy8vCisvLyBUaGUgVGhyaWZ0VGVzdERyaXZlciBmdW5jdGlvbiByZXF1aXJlcyBhIGNsaWVudCBvYmplY3QKKy8vIGNvbm5lY3RlZCB0byBhIHNlcnZlciBob3N0aW5nIHRoZSBUaHJpZnQgVGVzdCBzZXJ2aWNlIGFuZAorLy8gc3VwcG9ydHMgYW4gb3B0aW9uYWwgY2FsbGJhY2sgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIHdpdGgKKy8vIGEgc3RhdHVzIG1lc3NhZ2Ugd2hlbiB0aGUgdGVzdCBpcyBjb21wbGV0ZS4KIAotdmFyIHRlc3QgPSByZXF1aXJlKCd0YXBlJyk7Ci0vL3ZhciBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKTsKLXZhciB0dHlwZXMgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvVGhyaWZ0VGVzdF90eXBlcycpOwotdmFyIFRFeGNlcHRpb24gPSByZXF1aXJlKCd0aHJpZnQnKS5UaHJpZnQuVEV4Y2VwdGlvbjsKLXZhciBJbnQ2NCA9IHJlcXVpcmUoJ25vZGUtaW50NjQnKTsKLXZhciB0ZXN0Q2FzZXMgPSByZXF1aXJlKCcuL3Rlc3QtY2FzZXMnKTsKK2NvbnN0IHRlc3QgPSByZXF1aXJlKCJ0YXBlIik7CisKK2NvbnN0IGhlbHBlcnMgPSByZXF1aXJlKCIuL2hlbHBlcnMiKTsKK2NvbnN0IHR0eXBlcyA9IHJlcXVpcmUoYC4vJHtoZWxwZXJzLmdlblBhdGh9L1RocmlmdFRlc3RfdHlwZXNgKTsKK2NvbnN0IFRFeGNlcHRpb24gPSByZXF1aXJlKCJ0aHJpZnQiKS5UaHJpZnQuVEV4Y2VwdGlvbjsKK2NvbnN0IEludDY0ID0gcmVxdWlyZSgibm9kZS1pbnQ2NCIpOworY29uc3QgdGVzdENhc2VzID0gcmVxdWlyZSgiLi90ZXN0LWNhc2VzIik7CiAKIGV4cG9ydHMuVGhyaWZ0VGVzdERyaXZlciA9IGZ1bmN0aW9uKGNsaWVudCwgY2FsbGJhY2spIHsKKyAgdGVzdCgKKyAgICAiTm9kZUpTIFN0eWxlIENhbGxiYWNrIENsaWVudCBUZXN0cyIsCisgICAgeyBza2lwOiBoZWxwZXJzLmVjbWFNb2RlID09PSAiZXM2IiB9LAorICAgIGZ1bmN0aW9uKGFzc2VydCkgeworICAgICAgY29uc3QgY2hlY2tSZWN1cnNpdmVseSA9IG1ha2VSZWN1cnNpdmVDaGVjayhhc3NlcnQpOwogCi0gIHRlc3QoJ05vZGVKUyBTdHlsZSBDYWxsYmFjayBDbGllbnQgVGVzdHMnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICAgIGZ1bmN0aW9uIG1ha2VBc3NlcnRlcihhc3NlcnRpb25GbikgeworICAgICAgICByZXR1cm4gZnVuY3Rpb24oYykgeworICAgICAgICAgIGNvbnN0IGZuTmFtZSA9IGNbMF07CisgICAgICAgICAgY29uc3QgZXhwZWN0ZWQgPSBjWzFdOworICAgICAgICAgIGNsaWVudFtmbk5hbWVdKGV4cGVjdGVkLCBmdW5jdGlvbihlcnIsIGFjdHVhbCkgeworICAgICAgICAgICAgYXNzZXJ0LmVycm9yKGVyciwgZm5OYW1lICsgIjogbm8gY2FsbGJhY2sgZXJyb3IiKTsKKyAgICAgICAgICAgIGFzc2VydGlvbkZuKGFjdHVhbCwgZXhwZWN0ZWQsIGZuTmFtZSk7CisgICAgICAgICAgfSk7CisgICAgICAgIH07CisgICAgICB9CiAKLSAgICB2YXIgY2hlY2tSZWN1cnNpdmVseSA9IG1ha2VSZWN1cnNpdmVDaGVjayhhc3NlcnQpOwotCi0gICAgZnVuY3Rpb24gbWFrZUFzc2VydGVyKGFzc2VydGlvbkZuKSB7Ci0gICAgICByZXR1cm4gZnVuY3Rpb24oYykgewotICAgICAgICB2YXIgZm5OYW1lID0gY1swXTsKLSAgICAgICAgdmFyIGV4cGVjdGVkID0gY1sxXTsKLSAgICAgICAgY2xpZW50W2ZuTmFtZV0oZXhwZWN0ZWQsIGZ1bmN0aW9uKGVyciwgYWN0dWFsKSB7Ci0gICAgICAgICAgYXNzZXJ0LmVycm9yKGVyciwgZm5OYW1lICsgJzogbm8gY2FsbGJhY2sgZXJyb3InKTsKLSAgICAgICAgICBhc3NlcnRpb25GbihhY3R1YWwsIGV4cGVjdGVkLCBmbk5hbWUpOworICAgICAgdGVzdENhc2VzLnNpbXBsZS5mb3JFYWNoKAorICAgICAgICBtYWtlQXNzZXJ0ZXIoZnVuY3Rpb24oYSwgZSwgbSkgeworICAgICAgICAgIGlmIChhIGluc3RhbmNlb2YgSW50NjQpIHsKKyAgICAgICAgICAgIGNvbnN0IGU2NCA9IGUgaW5zdGFuY2VvZiBJbnQ2NCA/IGUgOiBuZXcgSW50NjQoZSk7CisgICAgICAgICAgICBhc3NlcnQuZGVlcEVxdWFsKGEuYnVmZmVyLCBlNjQuYnVmZmVyLCBtKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0LmVxdWFsKGEsIGUsIG0pOworICAgICAgICAgIH0KICAgICAgICAgfSkKLSAgICAgIH07Ci0gICAgfQorICAgICAgKTsKKyAgICAgIHRlc3RDYXNlcy5kZWVwLmZvckVhY2gobWFrZUFzc2VydGVyKGFzc2VydC5kZWVwRXF1YWwpKTsKKyAgICAgIHRlc3RDYXNlcy5kZWVwVW5vcmRlcmVkLmZvckVhY2goCisgICAgICAgIG1ha2VBc3NlcnRlcihtYWtlVW5vcmRlcmVkRGVlcEVxdWFsKGFzc2VydCkpCisgICAgICApOwogCi0gICAgdGVzdENhc2VzLnNpbXBsZS5mb3JFYWNoKG1ha2VBc3NlcnRlcihhc3NlcnQuZXF1YWwpKTsKLSAgICB0ZXN0Q2FzZXMuc2ltcGxlTG9vc2UuZm9yRWFjaChtYWtlQXNzZXJ0ZXIoZnVuY3Rpb24oYSwgZSwgbSl7Ci0gICAgICBhc3NlcnQub2soYSA9PSBlLCBtKTsKLSAgICB9KSk7Ci0gICAgdGVzdENhc2VzLmRlZXAuZm9yRWFjaChtYWtlQXNzZXJ0ZXIoYXNzZXJ0LmRlZXBFcXVhbCkpOwotCi0gICAgY2xpZW50LnRlc3RNYXBNYXAoNDIsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKLSAgICAgIHZhciBleHBlY3RlZCA9IHsKLSAgICAgICAgIjQiOiB7IjEiOjEsICIyIjoyLCAiMyI6MywgIjQiOjR9LAotICAgICAgICAiLTQiOiB7Ii00IjotNCwgIi0zIjotMywgIi0yIjotMiwgIi0xIjotMX0KLSAgICAgIH07Ci0gICAgICBhc3NlcnQuZXJyb3IoZXJyLCAndGVzdE1hcE1hcDogbm8gY2FsbGJhY2sgZXJyb3InKTsKLSAgICAgIGFzc2VydC5kZWVwRXF1YWwoZXhwZWN0ZWQsIHJlc3BvbnNlLCAndGVzdE1hcE1hcCcpOwotICAgIH0pOwotCi0gICAgY2xpZW50LnRlc3RTdHJ1Y3QodGVzdENhc2VzLm91dCwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgewotICAgICAgYXNzZXJ0LmVycm9yKGVyciwgJ3Rlc3RTdHJ1Y3Q6IG5vIGNhbGxiYWNrIGVycm9yJyk7Ci0gICAgICBjaGVja1JlY3Vyc2l2ZWx5KHRlc3RDYXNlcy5vdXQsIHJlc3BvbnNlLCAndGVzdFN0cnVjdCcpOwotICAgIH0pOwotCi0gICAgY2xpZW50LnRlc3ROZXN0KHRlc3RDYXNlcy5vdXQyLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7Ci0gICAgICBhc3NlcnQuZXJyb3IoZXJyLCAndGVzdE5lc3Q6IG5vIGNhbGxiYWNrIGVycm9yJyk7Ci0gICAgICBjaGVja1JlY3Vyc2l2ZWx5KHRlc3RDYXNlcy5vdXQyLCByZXNwb25zZSwgJ3Rlc3ROZXN0Jyk7Ci0gICAgfSk7Ci0KLSAgICBjbGllbnQudGVzdEluc2FuaXR5KHRlc3RDYXNlcy5jcmF6eSwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgewotICAgICAgYXNzZXJ0LmVycm9yKGVyciwgJ3Rlc3RJbnNhbml0eTogbm8gY2FsbGJhY2sgZXJyb3InKTsKLSAgICAgIGNoZWNrUmVjdXJzaXZlbHkodGVzdENhc2VzLmluc2FuaXR5LCByZXNwb25zZSwgJ3Rlc3RJbnNhbml0eScpOwotICAgIH0pOwotCi0gICAgY2xpZW50LnRlc3RJbnNhbml0eSh0ZXN0Q2FzZXMuY3JhenkyLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7Ci0gICAgICBhc3NlcnQuZXJyb3IoZXJyLCAndGVzdEluc2FuaXR5Mjogbm8gY2FsbGJhY2sgZXJyb3InKTsKLSAgICAgIGNoZWNrUmVjdXJzaXZlbHkodGVzdENhc2VzLmluc2FuaXR5LCByZXNwb25zZSwgJ3Rlc3RJbnNhbml0eTInKTsKLSAgICB9KTsKLQotICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCdURXhjZXB0aW9uJywgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgewotICAgICAgYXNzZXJ0Lm9rKGVyciBpbnN0YW5jZW9mIFRFeGNlcHRpb24sICd0ZXN0RXhjZXB0aW9uOiBjb3JyZWN0IGVycm9yIHR5cGUnKTsKLSAgICAgIGFzc2VydC5vayghcmVzcG9uc2UsICd0ZXN0RXhjZXB0aW9uOiBubyByZXNwb25zZScpOwotICAgIH0pOwotCi0gICAgY2xpZW50LnRlc3RFeGNlcHRpb24oJ1hjZXB0aW9uJywgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgewotICAgICAgYXNzZXJ0Lm9rKGVyciBpbnN0YW5jZW9mIHR0eXBlcy5YY2VwdGlvbiwgJ3Rlc3RFeGNlcHRpb246IGNvcnJlY3QgZXJyb3IgdHlwZScpOwotICAgICAgYXNzZXJ0Lm9rKCFyZXNwb25zZSwgJ3Rlc3RFeGNlcHRpb246IG5vIHJlc3BvbnNlJyk7Ci0gICAgICBhc3NlcnQuZXF1YWwoZXJyLmVycm9yQ29kZSwgMTAwMSwgJ3Rlc3RFeGNlcHRpb246IGNvcnJlY3QgZXJyb3IgY29kZScpOwotICAgICAgYXNzZXJ0LmVxdWFsKCdYY2VwdGlvbicsIGVyci5tZXNzYWdlLCAndGVzdEV4Y2VwdGlvbjogY29ycmVjdCBlcnJvciBtZXNzYWdlJyk7Ci0gICAgfSk7Ci0KLSAgICBjbGllbnQudGVzdEV4Y2VwdGlvbignbm8gRXhjZXB0aW9uJywgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgewotICAgICAgYXNzZXJ0LmVycm9yKGVyciwgJ3Rlc3RFeGNlcHRpb246IG5vIGNhbGxiYWNrIGVycm9yJyk7Ci0gICAgICBhc3NlcnQub2soIXJlc3BvbnNlLCAndGVzdEV4Y2VwdGlvbjogbm8gcmVzcG9uc2UnKTsKLSAgICB9KTsKLQotICAgIGNsaWVudC50ZXN0T25ld2F5KDAsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKLSAgICAgIGFzc2VydC5mYWlsKCd0ZXN0T25ld2F5IHNob3VsZCBub3QgYW5zd2VyJyk7Ci0gICAgfSk7Ci0KLSAgICBjaGVja09mZkJ5T25lKGZ1bmN0aW9uKGRvbmUpIHsKLSAgICAgIGNsaWVudC50ZXN0STMyKC0xLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7Ci0gICAgICAgIGFzc2VydC5lcnJvcihlcnIsICdjaGVja09mZkJ5T25lOiBubyBjYWxsYmFjayBlcnJvcicpOwotICAgICAgICBhc3NlcnQuZXF1YWwoLTEsIHJlc3BvbnNlKTsKLSAgICAgICAgYXNzZXJ0LmVuZCgpOwotICAgICAgICBkb25lKCk7CisgICAgICBjb25zdCBhcnIgPSBbXTsKKyAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjU2OyArK2kpIHsKKyAgICAgICAgYXJyW2ldID0gMjU1IC0gaTsKKyAgICAgIH0KKyAgICAgIGxldCBidWYgPSBuZXcgQnVmZmVyKGFycik7CisgICAgICBjbGllbnQudGVzdEJpbmFyeShidWYsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgICAgICAgYXNzZXJ0LmVycm9yKGVyciwgInRlc3RCaW5hcnk6IG5vIGNhbGxiYWNrIGVycm9yIik7CisgICAgICAgIGFzc2VydC5lcXVhbChyZXNwb25zZS5sZW5ndGgsIDI1NiwgInRlc3RCaW5hcnkiKTsKKyAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChyZXNwb25zZSwgYnVmLCAidGVzdEJpbmFyeShCdWZmZXIpIik7CiAgICAgICB9KTsKLSAgICB9LCBjYWxsYmFjayk7CisgICAgICBidWYgPSBuZXcgQnVmZmVyKGFycik7CisgICAgICBjbGllbnQudGVzdEJpbmFyeShidWYudG9TdHJpbmcoImJpbmFyeSIpLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7CisgICAgICAgIGFzc2VydC5lcnJvcihlcnIsICJ0ZXN0QmluYXJ5OiBubyBjYWxsYmFjayBlcnJvciIpOworICAgICAgICBhc3NlcnQuZXF1YWwocmVzcG9uc2UubGVuZ3RoLCAyNTYsICJ0ZXN0QmluYXJ5Iik7CisgICAgICAgIGFzc2VydC5kZWVwRXF1YWwocmVzcG9uc2UsIGJ1ZiwgInRlc3RCaW5hcnkoc3RyaW5nKSIpOworICAgICAgfSk7CiAKLSAgfSk7CisgICAgICBjbGllbnQudGVzdE1hcE1hcCg0MiwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICAgICAgICBjb25zdCBleHBlY3RlZCA9IHsKKyAgICAgICAgICAiNCI6IHsgIjEiOiAxLCAiMiI6IDIsICIzIjogMywgIjQiOiA0IH0sCisgICAgICAgICAgIi00IjogeyAiLTQiOiAtNCwgIi0zIjogLTMsICItMiI6IC0yLCAiLTEiOiAtMSB9CisgICAgICAgIH07CisgICAgICAgIGFzc2VydC5lcnJvcihlcnIsICJ0ZXN0TWFwTWFwOiBubyBjYWxsYmFjayBlcnJvciIpOworICAgICAgICBhc3NlcnQuZGVlcEVxdWFsKGV4cGVjdGVkLCByZXNwb25zZSwgInRlc3RNYXBNYXAiKTsKKyAgICAgIH0pOworCisgICAgICBjbGllbnQudGVzdFN0cnVjdCh0ZXN0Q2FzZXMub3V0LCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7CisgICAgICAgIGFzc2VydC5lcnJvcihlcnIsICJ0ZXN0U3RydWN0OiBubyBjYWxsYmFjayBlcnJvciIpOworICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5KHRlc3RDYXNlcy5vdXQsIHJlc3BvbnNlLCAidGVzdFN0cnVjdCIpOworICAgICAgfSk7CisKKyAgICAgIGNsaWVudC50ZXN0TmVzdCh0ZXN0Q2FzZXMub3V0MiwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICAgICAgICBhc3NlcnQuZXJyb3IoZXJyLCAidGVzdE5lc3Q6IG5vIGNhbGxiYWNrIGVycm9yIik7CisgICAgICAgIGNoZWNrUmVjdXJzaXZlbHkodGVzdENhc2VzLm91dDIsIHJlc3BvbnNlLCAidGVzdE5lc3QiKTsKKyAgICAgIH0pOworCisgICAgICBjbGllbnQudGVzdEluc2FuaXR5KHRlc3RDYXNlcy5jcmF6eSwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICAgICAgICBhc3NlcnQuZXJyb3IoZXJyLCAidGVzdEluc2FuaXR5OiBubyBjYWxsYmFjayBlcnJvciIpOworICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5KHRlc3RDYXNlcy5pbnNhbml0eSwgcmVzcG9uc2UsICJ0ZXN0SW5zYW5pdHkiKTsKKyAgICAgIH0pOworCisgICAgICBjbGllbnQudGVzdEluc2FuaXR5KHRlc3RDYXNlcy5jcmF6eTIsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgICAgICAgYXNzZXJ0LmVycm9yKGVyciwgInRlc3RJbnNhbml0eTI6IG5vIGNhbGxiYWNrIGVycm9yIik7CisgICAgICAgIGNoZWNrUmVjdXJzaXZlbHkodGVzdENhc2VzLmluc2FuaXR5LCByZXNwb25zZSwgInRlc3RJbnNhbml0eTIiKTsKKyAgICAgIH0pOworCisgICAgICBjbGllbnQudGVzdEV4Y2VwdGlvbigiVEV4Y2VwdGlvbiIsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgICAgICAgYXNzZXJ0Lm9rKAorICAgICAgICAgIGVyciBpbnN0YW5jZW9mIFRFeGNlcHRpb24sCisgICAgICAgICAgInRlc3RFeGNlcHRpb246IGNvcnJlY3QgZXJyb3IgdHlwZSIKKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0Lm9rKCFyZXNwb25zZSwgInRlc3RFeGNlcHRpb246IG5vIHJlc3BvbnNlIik7CisgICAgICB9KTsKKworICAgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oIlhjZXB0aW9uIiwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICAgICAgICBhc3NlcnQub2soCisgICAgICAgICAgZXJyIGluc3RhbmNlb2YgdHR5cGVzLlhjZXB0aW9uLAorICAgICAgICAgICJ0ZXN0RXhjZXB0aW9uOiBjb3JyZWN0IGVycm9yIHR5cGUiCisgICAgICAgICk7CisgICAgICAgIGFzc2VydC5vayghcmVzcG9uc2UsICJ0ZXN0RXhjZXB0aW9uOiBubyByZXNwb25zZSIpOworICAgICAgICBhc3NlcnQuZXF1YWwoZXJyLmVycm9yQ29kZSwgMTAwMSwgInRlc3RFeGNlcHRpb246IGNvcnJlY3QgZXJyb3IgY29kZSIpOworICAgICAgICBhc3NlcnQuZXF1YWwoCisgICAgICAgICAgIlhjZXB0aW9uIiwKKyAgICAgICAgICBlcnIubWVzc2FnZSwKKyAgICAgICAgICAidGVzdEV4Y2VwdGlvbjogY29ycmVjdCBlcnJvciBtZXNzYWdlIgorICAgICAgICApOworICAgICAgfSk7CisKKyAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCJubyBFeGNlcHRpb24iLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7CisgICAgICAgIGFzc2VydC5lcnJvcihlcnIsICJ0ZXN0RXhjZXB0aW9uOiBubyBjYWxsYmFjayBlcnJvciIpOworICAgICAgICBhc3NlcnQub2soIXJlc3BvbnNlLCAidGVzdEV4Y2VwdGlvbjogbm8gcmVzcG9uc2UiKTsKKyAgICAgIH0pOworCisgICAgICBjbGllbnQudGVzdE9uZXdheSgwLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7CisgICAgICAgIGFzc2VydC5lcnJvcihlcnIsICJ0ZXN0T25ld2F5OiBubyBjYWxsYmFjayBlcnJvciIpOworICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzcG9uc2UsIHVuZGVmaW5lZCwgInRlc3RPbmV3YXk6IHZvaWQgcmVzcG9uc2UiKTsKKyAgICAgIH0pOworCisgICAgICBjaGVja09mZkJ5T25lKGZ1bmN0aW9uKGRvbmUpIHsKKyAgICAgICAgY2xpZW50LnRlc3RJMzIoLTEsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgICAgICAgICBhc3NlcnQuZXJyb3IoZXJyLCAiY2hlY2tPZmZCeU9uZTogbm8gY2FsbGJhY2sgZXJyb3IiKTsKKyAgICAgICAgICBhc3NlcnQuZXF1YWwoLTEsIHJlc3BvbnNlKTsKKyAgICAgICAgICBhc3NlcnQuZW5kKCk7CisgICAgICAgICAgZG9uZSgpOworICAgICAgICB9KTsKKyAgICAgIH0sIGNhbGxiYWNrKTsKKyAgICB9CisgICk7CisKKyAgLy8gRVM2IGRvZXMgbm90IHN1cHBvcnQgY2FsbGJhY2sgc3R5bGUKKyAgaWYgKGhlbHBlcnMuZWNtYU1vZGUgPT09ICJlczYiKSB7CisgICAgY2hlY2tPZmZCeU9uZShkb25lID0+IGRvbmUoKSwgY2FsbGJhY2spOworICB9CiB9OwogCiBleHBvcnRzLlRocmlmdFRlc3REcml2ZXJQcm9taXNlID0gZnVuY3Rpb24oY2xpZW50LCBjYWxsYmFjaykgewotCi0gIHRlc3QoJ1EgUHJvbWlzZSBDbGllbnQgVGVzdHMnLCBmdW5jdGlvbihhc3NlcnQpIHsKLQotICAgIHZhciBjaGVja1JlY3Vyc2l2ZWx5ID0gbWFrZVJlY3Vyc2l2ZUNoZWNrKGFzc2VydCk7Ci0KLSAgICBmdW5jdGlvbiBmYWlsKG1zZykgewotICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewotICAgICAgICBhc3NlcnQuZmFpbChtc2cpOwotICAgICAgfQotICAgIH0KKyAgdGVzdCgiUHJvbWlzZSBDbGllbnQgVGVzdHMiLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBjb25zdCBjaGVja1JlY3Vyc2l2ZWx5ID0gbWFrZVJlY3Vyc2l2ZUNoZWNrKGFzc2VydCk7CiAKICAgICBmdW5jdGlvbiBtYWtlQXNzZXJ0ZXIoYXNzZXJ0aW9uRm4pIHsKICAgICAgIHJldHVybiBmdW5jdGlvbihjKSB7Ci0gICAgICAgIHZhciBmbk5hbWUgPSBjWzBdOwotICAgICAgICB2YXIgZXhwZWN0ZWQgPSBjWzFdOworICAgICAgICBjb25zdCBmbk5hbWUgPSBjWzBdOworICAgICAgICBjb25zdCBleHBlY3RlZCA9IGNbMV07CiAgICAgICAgIGNsaWVudFtmbk5hbWVdKGV4cGVjdGVkKQogICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKGFjdHVhbCkgewogICAgICAgICAgICAgYXNzZXJ0aW9uRm4oYWN0dWFsLCBleHBlY3RlZCwgZm5OYW1lKTsKICAgICAgICAgICB9KQotICAgICAgICAgIC5mYWlsKGZhaWwoJ2ZuTmFtZScpKTsKKyAgICAgICAgICAuY2F0Y2goKCkgPT4gYXNzZXJ0LmZhaWwoImZuTmFtZSIpKTsKICAgICAgIH07CiAgICAgfQogCi0gICAgdGVzdENhc2VzLnNpbXBsZS5mb3JFYWNoKG1ha2VBc3NlcnRlcihhc3NlcnQuZXF1YWwpKTsKLSAgICB0ZXN0Q2FzZXMuc2ltcGxlTG9vc2UuZm9yRWFjaChtYWtlQXNzZXJ0ZXIoZnVuY3Rpb24oYSwgZSwgbSl7Ci0gICAgICBhc3NlcnQub2soYSA9PSBlLCBtKTsKLSAgICB9KSk7CisgICAgdGVzdENhc2VzLnNpbXBsZS5mb3JFYWNoKAorICAgICAgbWFrZUFzc2VydGVyKGZ1bmN0aW9uKGEsIGUsIG0pIHsKKyAgICAgICAgaWYgKGEgaW5zdGFuY2VvZiBJbnQ2NCkgeworICAgICAgICAgIGNvbnN0IGU2NCA9IGUgaW5zdGFuY2VvZiBJbnQ2NCA/IGUgOiBuZXcgSW50NjQoZSk7CisgICAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChhLmJ1ZmZlciwgZTY0LmJ1ZmZlciwgbSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYXNzZXJ0LmVxdWFsKGEsIGUsIG0pOworICAgICAgICB9CisgICAgICB9KQorICAgICk7CiAgICAgdGVzdENhc2VzLmRlZXAuZm9yRWFjaChtYWtlQXNzZXJ0ZXIoYXNzZXJ0LmRlZXBFcXVhbCkpOworICAgIHRlc3RDYXNlcy5kZWVwVW5vcmRlcmVkLmZvckVhY2goCisgICAgICBtYWtlQXNzZXJ0ZXIobWFrZVVub3JkZXJlZERlZXBFcXVhbChhc3NlcnQpKQorICAgICk7CiAKLSAgICBjbGllbnQudGVzdFN0cnVjdCh0ZXN0Q2FzZXMub3V0KQorICAgIGNsaWVudAorICAgICAgLnRlc3RTdHJ1Y3QodGVzdENhc2VzLm91dCkKICAgICAgIC50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7Ci0gICAgICAgIGNoZWNrUmVjdXJzaXZlbHkodGVzdENhc2VzLm91dCwgcmVzcG9uc2UsICd0ZXN0U3RydWN0Jyk7CisgICAgICAgIGNoZWNrUmVjdXJzaXZlbHkodGVzdENhc2VzLm91dCwgcmVzcG9uc2UsICJ0ZXN0U3RydWN0Iik7CiAgICAgICB9KQotICAgICAgLmZhaWwoZmFpbCgndGVzdFN0cnVjdCcpKTsKKyAgICAgIC5jYXRjaCgoKSA9PiBhc3NlcnQuZmFpbCgidGVzdFN0cnVjdCIpKTsKIAotICAgIGNsaWVudC50ZXN0TmVzdCh0ZXN0Q2FzZXMub3V0MikKKyAgICBjbGllbnQKKyAgICAgIC50ZXN0TmVzdCh0ZXN0Q2FzZXMub3V0MikKICAgICAgIC50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7Ci0gICAgICAgIGNoZWNrUmVjdXJzaXZlbHkodGVzdENhc2VzLm91dDIsIHJlc3BvbnNlLCAndGVzdE5lc3QnKTsKKyAgICAgICAgY2hlY2tSZWN1cnNpdmVseSh0ZXN0Q2FzZXMub3V0MiwgcmVzcG9uc2UsICJ0ZXN0TmVzdCIpOwogICAgICAgfSkKLSAgICAgIC5mYWlsKGZhaWwoJ3Rlc3ROZXN0JykpOworICAgICAgLmNhdGNoKCgpID0+IGFzc2VydC5mYWlsKCJ0ZXN0TmVzdCIpKTsKIAotICAgIGNsaWVudC50ZXN0SW5zYW5pdHkodGVzdENhc2VzLmNyYXp5KQorICAgIGNsaWVudAorICAgICAgLnRlc3RJbnNhbml0eSh0ZXN0Q2FzZXMuY3JhenkpCiAgICAgICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkgewotICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5KHRlc3RDYXNlcy5pbnNhbml0eSwgcmVzcG9uc2UsICd0ZXN0SW5zYW5pdHknKTsKKyAgICAgICAgY2hlY2tSZWN1cnNpdmVseSh0ZXN0Q2FzZXMuaW5zYW5pdHksIHJlc3BvbnNlLCAidGVzdEluc2FuaXR5Iik7CiAgICAgICB9KQotICAgICAgLmZhaWwoZmFpbCgndGVzdEluc2FuaXR5JykpOworICAgICAgLmNhdGNoKCgpID0+IGFzc2VydC5mYWlsKCJ0ZXN0SW5zYW5pdHkiKSk7CiAKLSAgICBjbGllbnQudGVzdEluc2FuaXR5KHRlc3RDYXNlcy5jcmF6eTIpCisgICAgY2xpZW50CisgICAgICAudGVzdEluc2FuaXR5KHRlc3RDYXNlcy5jcmF6eTIpCiAgICAgICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkgewotICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5KHRlc3RDYXNlcy5pbnNhbml0eSwgcmVzcG9uc2UsICd0ZXN0SW5zYW5pdHkyJyk7CisgICAgICAgIGNoZWNrUmVjdXJzaXZlbHkodGVzdENhc2VzLmluc2FuaXR5LCByZXNwb25zZSwgInRlc3RJbnNhbml0eTIiKTsKICAgICAgIH0pCi0gICAgICAuZmFpbChmYWlsKCd0ZXN0SW5zYW5pdHkyJykpOworICAgICAgLmNhdGNoKCgpID0+IGFzc2VydC5mYWlsKCJ0ZXN0SW5zYW5pdHkyIikpOwogCi0gICAgY2xpZW50LnRlc3RFeGNlcHRpb24oJ1RFeGNlcHRpb24nKQotICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKLSAgICAgICAgZmFpbCgndGVzdEV4Y2VwdGlvbjogVEV4Y2VwdGlvbicpOworICAgIGNsaWVudAorICAgICAgLnRlc3RFeGNlcHRpb24oIlRFeGNlcHRpb24iKQorICAgICAgLnRoZW4oZnVuY3Rpb24oKSB7CisgICAgICAgIGFzc2VydC5mYWlsKCJ0ZXN0RXhjZXB0aW9uOiBURXhjZXB0aW9uIik7CiAgICAgICB9KQotICAgICAgLmZhaWwoZnVuY3Rpb24oZXJyKSB7CisgICAgICAuY2F0Y2goZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgIGFzc2VydC5vayhlcnIgaW5zdGFuY2VvZiBURXhjZXB0aW9uKTsKICAgICAgIH0pOwogCi0gICAgY2xpZW50LnRlc3RFeGNlcHRpb24oJ1hjZXB0aW9uJykKLSAgICAgIC50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7Ci0gICAgICAgIGZhaWwoJ3Rlc3RFeGNlcHRpb246IFhjZXB0aW9uJyk7CisgICAgY2xpZW50CisgICAgICAudGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iKQorICAgICAgLnRoZW4oZnVuY3Rpb24oKSB7CisgICAgICAgIGFzc2VydC5mYWlsKCJ0ZXN0RXhjZXB0aW9uOiBYY2VwdGlvbiIpOwogICAgICAgfSkKLSAgICAgIC5mYWlsKGZ1bmN0aW9uKGVycikgeworICAgICAgLmNhdGNoKGZ1bmN0aW9uKGVycikgewogICAgICAgICBhc3NlcnQub2soZXJyIGluc3RhbmNlb2YgdHR5cGVzLlhjZXB0aW9uKTsKICAgICAgICAgYXNzZXJ0LmVxdWFsKGVyci5lcnJvckNvZGUsIDEwMDEpOwotICAgICAgICBhc3NlcnQuZXF1YWwoJ1hjZXB0aW9uJywgZXJyLm1lc3NhZ2UpOworICAgICAgICBhc3NlcnQuZXF1YWwoIlhjZXB0aW9uIiwgZXJyLm1lc3NhZ2UpOwogICAgICAgfSk7CiAKLSAgICBjbGllbnQudGVzdEV4Y2VwdGlvbignbm8gRXhjZXB0aW9uJykKKyAgICBjbGllbnQKKyAgICAgIC50ZXN0RXhjZXB0aW9uKCJubyBFeGNlcHRpb24iKQogICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgICAgYXNzZXJ0LmVxdWFsKHVuZGVmaW5lZCwgcmVzcG9uc2UpOyAvL3ZvaWQKICAgICAgIH0pCi0gICAgICAuZmFpbChmYWlsKCd0ZXN0RXhjZXB0aW9uJykpOworICAgICAgLmNhdGNoKCgpID0+IGFzc2VydC5mYWlsKCJ0ZXN0RXhjZXB0aW9uIikpOwogCi0gICAgY2xpZW50LnRlc3RPbmV3YXkoMCwgZmFpbCgndGVzdE9uZXdheTogc2hvdWxkIG5vdCBhbnN3ZXInKSk7CisgICAgY2xpZW50CisgICAgICAudGVzdE9uZXdheSgwKQorICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKKyAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3BvbnNlLCB1bmRlZmluZWQsICJ0ZXN0T25ld2F5OiB2b2lkIHJlc3BvbnNlIik7CisgICAgICB9KQorICAgICAgLmNhdGNoKCgpID0+IGFzc2VydC5mYWlsKCJ0ZXN0T25ld2F5OiBzaG91bGQgbm90IHJlamVjdCIpKTsKIAogICAgIGNoZWNrT2ZmQnlPbmUoZnVuY3Rpb24oZG9uZSkgewotICAgICAgY2xpZW50LnRlc3RJMzIoLTEpCisgICAgICBjbGllbnQKKyAgICAgICAgLnRlc3RJMzIoLTEpCiAgICAgICAgIC50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7Ci0gICAgICAgICAgICBhc3NlcnQuZXF1YWwoLTEsIHJlc3BvbnNlKTsKLSAgICAgICAgICAgIGFzc2VydC5lbmQoKTsKLSAgICAgICAgICAgIGRvbmUoKTsKKyAgICAgICAgICBhc3NlcnQuZXF1YWwoLTEsIHJlc3BvbnNlKTsKKyAgICAgICAgICBhc3NlcnQuZW5kKCk7CisgICAgICAgICAgZG9uZSgpOwogICAgICAgICB9KQotICAgICAgICAuZmFpbChmYWlsKCdjaGVja09mZkJ5T25lJykpOworICAgICAgICAuY2F0Y2goKCkgPT4gYXNzZXJ0LmZhaWwoImNoZWNrT2ZmQnlPbmUiKSk7CiAgICAgfSwgY2FsbGJhY2spOwogICB9KTsKIH07CiAKLQogLy8gSGVscGVyIEZ1bmN0aW9ucwogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIGZ1bmN0aW9uIG1ha2VSZWN1cnNpdmVDaGVjayhhc3NlcnQpIHsKLQotICByZXR1cm4gZnVuY3Rpb24gKG1hcDEsIG1hcDIsIG1zZykgewotICAgIHZhciBlcXVhbCA9IHRydWU7Ci0KLSAgICB2YXIgZXF1YWwgPSBjaGVja1JlY3Vyc2l2ZWx5KG1hcDEsIG1hcDIpOworICByZXR1cm4gZnVuY3Rpb24obWFwMSwgbWFwMiwgbXNnKSB7CisgICAgY29uc3QgZXF1YWwgPSBjaGVja1JlY3Vyc2l2ZWx5KG1hcDEsIG1hcDIpOwogCiAgICAgYXNzZXJ0Lm9rKGVxdWFsLCBtc2cpOwogCiAgICAgLy8gZGVlcEVxdWFsIGRvZXNuJ3Qgd29yayB3aXRoIGZpZWxkcyB1c2luZyBub2RlLWludDY0CiAgICAgZnVuY3Rpb24gY2hlY2tSZWN1cnNpdmVseShtYXAxLCBtYXAyKSB7Ci0gICAgICBpZiAodHlwZW9mIG1hcDEgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIG1hcDIgIT09ICdmdW5jdGlvbicpIHsKLSAgICAgICAgaWYgKCFtYXAxIHx8IHR5cGVvZiBtYXAxICE9PSAnb2JqZWN0JykgeworICAgICAgaWYgKHR5cGVvZiBtYXAxICE9PSAiZnVuY3Rpb24iICYmIHR5cGVvZiBtYXAyICE9PSAiZnVuY3Rpb24iKSB7CisgICAgICAgIGlmICghbWFwMSB8fCB0eXBlb2YgbWFwMSAhPT0gIm9iamVjdCIpIHsKICAgICAgICAgICAvL0hhbmRsZSBpbnQ2NCB0eXBlcyAod2hpY2ggdXNlIG5vZGUtaW50NjQgaW4gTm9kZS5qcyBKYXZhU2NyaXB0KQotICAgICAgICAgIGlmICgodHlwZW9mIG1hcDEgPT09ICJudW1iZXIiKSAmJiAodHlwZW9mIG1hcDIgPT09ICJvYmplY3QiKSAmJgotICAgICAgICAgICAgICAobWFwMi5idWZmZXIpICYmIChtYXAyLmJ1ZmZlciBpbnN0YW5jZW9mIEJ1ZmZlcikgJiYgKG1hcDIuYnVmZmVyLmxlbmd0aCA9PT0gOCkpIHsKLSAgICAgICAgICAgIHZhciBuID0gbmV3IEludDY0KG1hcDIuYnVmZmVyKTsKKyAgICAgICAgICBpZiAoCisgICAgICAgICAgICB0eXBlb2YgbWFwMSA9PT0gIm51bWJlciIgJiYKKyAgICAgICAgICAgIHR5cGVvZiBtYXAyID09PSAib2JqZWN0IiAmJgorICAgICAgICAgICAgbWFwMi5idWZmZXIgJiYKKyAgICAgICAgICAgIG1hcDIuYnVmZmVyIGluc3RhbmNlb2YgQnVmZmVyICYmCisgICAgICAgICAgICBtYXAyLmJ1ZmZlci5sZW5ndGggPT09IDgKKyAgICAgICAgICApIHsKKyAgICAgICAgICAgIGNvbnN0IG4gPSBuZXcgSW50NjQobWFwMi5idWZmZXIpOwogICAgICAgICAgICAgcmV0dXJuIG1hcDEgPT09IG4udG9OdW1iZXIoKTsKICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcmV0dXJuIG1hcDEgPT0gbWFwMjsKQEAgLTI0MiwxNSArMzAxLDE0IEBACiAgICAgICAgIH0KICAgICAgIH0KICAgICB9Ci0gIH0KKyAgfTsKIH0KIAogZnVuY3Rpb24gY2hlY2tPZmZCeU9uZShkb25lLCBjYWxsYmFjaykgewotCi0gIHZhciByZXRyeV9saW1pdCA9IDMwOwotICB2YXIgcmV0cnlfaW50ZXJ2YWwgPSAxMDA7Ci0gIHZhciB0ZXN0X2NvbXBsZXRlID0gZmFsc2U7Ci0gIHZhciByZXRyeXMgPSAwOworICBjb25zdCByZXRyeV9saW1pdCA9IDMwOworICBjb25zdCByZXRyeV9pbnRlcnZhbCA9IDEwMDsKKyAgbGV0IHRlc3RfY29tcGxldGUgPSBmYWxzZTsKKyAgbGV0IHJldHJ5cyA9IDA7CiAKICAgLyoqCiAgICAqIHJlZG8gYSBzaW1wbGUgdGVzdCBhZnRlciB0aGUgb25ld2F5IHRvIG1ha2Ugc3VyZSB3ZSBhcmVuJ3QgIm9mZiBieSBvbmUiIC0tCkBAIC0yNjcsMTcgKzMyNSwzNyBAQAogCiAgIC8vV2Ugd2FpdCB1cCB0byByZXRyeV9saW1pdCAqIHJldHJ5X2ludGVydmFsIGZvciB0aGUgdGVzdCBzdWl0ZSB0byBjb21wbGV0ZQogICBmdW5jdGlvbiBUZXN0Rm9yQ29tcGxldGlvbigpIHsKLSAgICBpZih0ZXN0X2NvbXBsZXRlICYmIGNhbGxiYWNrKSB7CisgICAgaWYgKHRlc3RfY29tcGxldGUgJiYgY2FsbGJhY2spIHsKICAgICAgIGNhbGxiYWNrKCJTZXJ2ZXIgc3VjY2Vzc2Z1bGx5IHRlc3RlZCEiKTsKICAgICB9IGVsc2UgewogICAgICAgaWYgKCsrcmV0cnlzIDwgcmV0cnlfbGltaXQpIHsKICAgICAgICAgc2V0VGltZW91dChUZXN0Rm9yQ29tcGxldGlvbiwgcmV0cnlfaW50ZXJ2YWwpOwogICAgICAgfSBlbHNlIGlmIChjYWxsYmFjaykgewotICAgICAgICBjYWxsYmFjaygiU2VydmVyIHRlc3QgZmFpbGVkIHRvIGNvbXBsZXRlIGFmdGVyICIgKwotICAgICAgICAgICAgICAgICAocmV0cnlfbGltaXQgKiByZXRyeV9pbnRlcnZhbCAvIDEwMDApICsgIiBzZWNvbmRzIik7CisgICAgICAgIGNhbGxiYWNrKAorICAgICAgICAgICJTZXJ2ZXIgdGVzdCBmYWlsZWQgdG8gY29tcGxldGUgYWZ0ZXIgIiArCisgICAgICAgICAgICAocmV0cnlfbGltaXQgKiByZXRyeV9pbnRlcnZhbCkgLyAxMDAwICsKKyAgICAgICAgICAgICIgc2Vjb25kcyIKKyAgICAgICAgKTsKICAgICAgIH0KICAgICB9CiAgIH0KIAogICBzZXRUaW1lb3V0KFRlc3RGb3JDb21wbGV0aW9uLCByZXRyeV9pbnRlcnZhbCk7CiB9CisKK2Z1bmN0aW9uIG1ha2VVbm9yZGVyZWREZWVwRXF1YWwoYXNzZXJ0KSB7CisgIHJldHVybiBmdW5jdGlvbihhY3R1YWwsIGV4cGVjdGVkLCBuYW1lKSB7CisgICAgYXNzZXJ0LmVxdWFsKGFjdHVhbC5sZW5ndGgsIGV4cGVjdGVkLmxlbmd0aCwgbmFtZSk7CisgICAgZm9yIChjb25zdCBrIGluIGFjdHVhbCkgeworICAgICAgbGV0IGZvdW5kID0gZmFsc2U7CisgICAgICBmb3IgKGNvbnN0IGsyIGluIGV4cGVjdGVkKSB7CisgICAgICAgIGlmIChhY3R1YWxba10gPT09IGV4cGVjdGVkW2syXSkgeworICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICBhc3NlcnQuZmFpbCgiVW5leHBlY3RlZCB2YWx1ZSAiICsgYWN0dWFsW2tdICsgIiB3aXRoIGtleSAiICsgayk7CisgICAgICB9CisgICAgfQorICB9OworfQpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy90ZXN0L3Rlc3RfaGFuZGxlci5qcyBiL2xpYi9ub2RlanMvdGVzdC90ZXN0X2hhbmRsZXIuanMKaW5kZXggMjExMzI1My4uMzE3YTdjOCAxMDA2NDQKLS0tIGEvbGliL25vZGVqcy90ZXN0L3Rlc3RfaGFuZGxlci5qcworKysgYi9saWIvbm9kZWpzL3Rlc3QvdGVzdF9oYW5kbGVyLmpzCkBAIC0xOSwxOCArMTksMTcgQEAKIAogLy9UaGlzIGlzIHRoZSBzZXJ2ZXIgc2lkZSBOb2RlIHRlc3QgaGFuZGxlciBmb3IgdGhlIHN0YW5kYXJkCiAvLyAgQXBhY2hlIFRocmlmdCB0ZXN0IHNlcnZpY2UuCitjb25zdCBoZWxwZXJzID0gcmVxdWlyZSgiLi9oZWxwZXJzIik7Citjb25zdCB0dHlwZXMgPSByZXF1aXJlKGAuLyR7aGVscGVycy5nZW5QYXRofS9UaHJpZnRUZXN0X3R5cGVzYCk7Citjb25zdCBURXhjZXB0aW9uID0gcmVxdWlyZSgidGhyaWZ0IikuVGhyaWZ0LlRFeGNlcHRpb247CiAKLXZhciB0dHlwZXMgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvVGhyaWZ0VGVzdF90eXBlcycpOwotdmFyIFRFeGNlcHRpb24gPSByZXF1aXJlKCd0aHJpZnQnKS5UaHJpZnQuVEV4Y2VwdGlvbjsKLQotZnVuY3Rpb24gbWFrZVN5bmNIYW5kbGVyKGxhYmVsKSB7CitmdW5jdGlvbiBtYWtlU3luY0hhbmRsZXIoKSB7CiAgIHJldHVybiBmdW5jdGlvbih0aGluZykgewotICAgIC8vY29uc29sZS5sb2cobGFiZWwgKyAnKFwnJyArIHRoaW5nICsgJ1wnKScpOwogICAgIHJldHVybiB0aGluZzsKLSAgfQorICB9OwogfQogCi12YXIgc3luY0hhbmRsZXJzID0geworY29uc3Qgc3luY0hhbmRsZXJzID0gewogICB0ZXN0Vm9pZDogdGVzdFZvaWQsCiAgIHRlc3RNYXBNYXA6IHRlc3RNYXBNYXAsCiAgIHRlc3RJbnNhbml0eTogdGVzdEluc2FuaXR5LApAQCAtNDQsMTAgKzQzLDEwIEBACiAgIHJldHVybiBmdW5jdGlvbih0aGluZywgcmVzdWx0KSB7CiAgICAgdGhpbmcgPSBzeW5jSGFuZGxlcnNbbGFiZWxdKHRoaW5nKTsKICAgICByZXN1bHQobnVsbCwgdGhpbmcpOwotICB9CisgIH07CiB9CiAKLXZhciBhc3luY0hhbmRsZXJzID0geworY29uc3QgYXN5bmNIYW5kbGVycyA9IHsKICAgdGVzdFZvaWQ6IHRlc3RWb2lkQXN5bmMsCiAgIHRlc3RNdWx0aTogdGVzdE11bHRpQXN5bmMsCiAgIHRlc3RFeGNlcHRpb246IHRlc3RFeGNlcHRpb25Bc3luYywKQEAgLTU1LDIxICs1NCwyMiBAQAogICB0ZXN0T25ld2F5OiB0ZXN0T25ld2F5QXN5bmMKIH07CiAKLXZhciBpZGVudGl0eUhhbmRsZXJzID0gWwotICAndGVzdFN0cmluZycsCi0gICd0ZXN0Qm9vbCcsCi0gICd0ZXN0Qnl0ZScsCi0gICd0ZXN0STMyJywKLSAgJ3Rlc3RJNjQnLAotICAndGVzdERvdWJsZScsCi0gICd0ZXN0U3RydWN0JywKLSAgJ3Rlc3ROZXN0JywKLSAgJ3Rlc3RNYXAnLAotICAndGVzdFN0cmluZ01hcCcsCi0gICd0ZXN0U2V0JywKLSAgJ3Rlc3RMaXN0JywKLSAgJ3Rlc3RFbnVtJywKLSAgJ3Rlc3RUeXBlZGVmJworY29uc3QgaWRlbnRpdHlIYW5kbGVycyA9IFsKKyAgInRlc3RTdHJpbmciLAorICAidGVzdEJvb2wiLAorICAidGVzdEJ5dGUiLAorICAidGVzdEkzMiIsCisgICJ0ZXN0STY0IiwKKyAgInRlc3REb3VibGUiLAorICAidGVzdEJpbmFyeSIsCisgICJ0ZXN0U3RydWN0IiwKKyAgInRlc3ROZXN0IiwKKyAgInRlc3RNYXAiLAorICAidGVzdFN0cmluZ01hcCIsCisgICJ0ZXN0U2V0IiwKKyAgInRlc3RMaXN0IiwKKyAgInRlc3RFbnVtIiwKKyAgInRlc3RUeXBlZGVmIgogXTsKIAogZnVuY3Rpb24gdGVzdFZvaWQoKSB7CkBAIC04MCwxMyArODAsMTEgQEAKICAgcmVzdWx0KHRlc3RWb2lkKCkpOwogfQogCi1mdW5jdGlvbiB0ZXN0TWFwTWFwKGhlbGxvKSB7Ci0gIC8vY29uc29sZS5sb2coJ3Rlc3RNYXBNYXAoJyArIGhlbGxvICsgJyknKTsKLQotICB2YXIgbWFwbWFwID0gW107Ci0gIHZhciBwb3MgPSBbXTsKLSAgdmFyIG5lZyA9IFtdOwotICBmb3IgKHZhciBpID0gMTsgaSA8IDU7IGkrKykgeworZnVuY3Rpb24gdGVzdE1hcE1hcCgpIHsKKyAgY29uc3QgbWFwbWFwID0gW107CisgIGNvbnN0IHBvcyA9IFtdOworICBjb25zdCBuZWcgPSBbXTsKKyAgZm9yIChsZXQgaSA9IDE7IGkgPCA1OyBpKyspIHsKICAgICBwb3NbaV0gPSBpOwogICAgIG5lZ1staV0gPSAtaTsKICAgfQpAQCAtMTAxLDI4ICs5OSwxNiBAQAogICAvL2NvbnNvbGUubG9nKGFyZ3VtZW50KTsKICAgLy9jb25zb2xlLmxvZygnKScpOwogCi0gIHZhciBoZWxsbyA9IG5ldyB0dHlwZXMuWHRydWN0KCk7Ci0gIGhlbGxvLnN0cmluZ190aGluZyA9ICdIZWxsbzInOwotICBoZWxsby5ieXRlX3RoaW5nID0gMjsKLSAgaGVsbG8uaTMyX3RoaW5nID0gMjsKLSAgaGVsbG8uaTY0X3RoaW5nID0gMjsKLQotICB2YXIgZ29vZGJ5ZSA9IG5ldyB0dHlwZXMuWHRydWN0KCk7Ci0gIGdvb2RieWUuc3RyaW5nX3RoaW5nID0gJ0dvb2RieWU0JzsKLSAgZ29vZGJ5ZS5ieXRlX3RoaW5nID0gNDsKLSAgZ29vZGJ5ZS5pMzJfdGhpbmcgPSA0OwotICBnb29kYnllLmk2NF90aGluZyA9IDQ7Ci0KLSAgdmFyIGZpcnN0X21hcCA9IFtdOwotICB2YXIgc2Vjb25kX21hcCA9IFtdOworICBjb25zdCBmaXJzdF9tYXAgPSBbXTsKKyAgY29uc3Qgc2Vjb25kX21hcCA9IFtdOwogCiAgIGZpcnN0X21hcFt0dHlwZXMuTnVtYmVyei5UV09dID0gYXJndW1lbnQ7CiAgIGZpcnN0X21hcFt0dHlwZXMuTnVtYmVyei5USFJFRV0gPSBhcmd1bWVudDsKIAotICB2YXIgbG9vbmV5ID0gbmV3IHR0eXBlcy5JbnNhbml0eSgpOworICBjb25zdCBsb29uZXkgPSBuZXcgdHR5cGVzLkluc2FuaXR5KCk7CiAgIHNlY29uZF9tYXBbdHR5cGVzLk51bWJlcnouU0lYXSA9IGxvb25leTsKIAotICB2YXIgaW5zYW5lID0gW107CisgIGNvbnN0IGluc2FuZSA9IFtdOwogICBpbnNhbmVbMV0gPSBmaXJzdF9tYXA7CiAgIGluc2FuZVsyXSA9IHNlY29uZF9tYXA7CiAKQEAgLTEzMSwxMSArMTE3LDExIEBACiAgIHJldHVybiBpbnNhbmU7CiB9CiAKLWZ1bmN0aW9uIHRlc3RNdWx0aShhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1KSB7CitmdW5jdGlvbiB0ZXN0TXVsdGkoYXJnMCwgYXJnMSwgYXJnMikgewogICAvL2NvbnNvbGUubG9nKCd0ZXN0TXVsdGkoKScpOwogCi0gIHZhciBoZWxsbyA9IG5ldyB0dHlwZXMuWHRydWN0KCk7Ci0gIGhlbGxvLnN0cmluZ190aGluZyA9ICdIZWxsbzInOworICBjb25zdCBoZWxsbyA9IG5ldyB0dHlwZXMuWHRydWN0KCk7CisgIGhlbGxvLnN0cmluZ190aGluZyA9ICJIZWxsbzIiOwogICBoZWxsby5ieXRlX3RoaW5nID0gYXJnMDsKICAgaGVsbG8uaTMyX3RoaW5nID0gYXJnMTsKICAgaGVsbG8uaTY0X3RoaW5nID0gYXJnMjsKQEAgLTE0MywxOCArMTI5LDE4IEBACiB9CiAKIGZ1bmN0aW9uIHRlc3RNdWx0aUFzeW5jKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUsIHJlc3VsdCkgewotICB2YXIgaGVsbG8gPSB0ZXN0TXVsdGkoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSk7CisgIGNvbnN0IGhlbGxvID0gdGVzdE11bHRpKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpOwogICByZXN1bHQobnVsbCwgaGVsbG8pOwogfQogCiBmdW5jdGlvbiB0ZXN0RXhjZXB0aW9uKGFyZykgewogICAvL2NvbnNvbGUubG9nKCd0ZXN0RXhjZXB0aW9uKCcrYXJnKycpJyk7Ci0gIGlmIChhcmcgPT09ICdYY2VwdGlvbicpIHsKLSAgICB2YXIgeCA9IG5ldyB0dHlwZXMuWGNlcHRpb24oKTsKKyAgaWYgKGFyZyA9PT0gIlhjZXB0aW9uIikgeworICAgIGNvbnN0IHggPSBuZXcgdHR5cGVzLlhjZXB0aW9uKCk7CiAgICAgeC5lcnJvckNvZGUgPSAxMDAxOwogICAgIHgubWVzc2FnZSA9IGFyZzsKICAgICB0aHJvdyB4OwotICB9IGVsc2UgaWYgKGFyZyA9PT0gJ1RFeGNlcHRpb24nKSB7CisgIH0gZWxzZSBpZiAoYXJnID09PSAiVEV4Y2VwdGlvbiIpIHsKICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbihhcmcpOwogICB9IGVsc2UgewogICAgIHJldHVybjsKQEAgLTE2MywxMiArMTQ5LDEyIEBACiAKIGZ1bmN0aW9uIHRlc3RFeGNlcHRpb25Bc3luYyhhcmcsIHJlc3VsdCkgewogICAvL2NvbnNvbGUubG9nKCd0ZXN0RXhjZXB0aW9uKCcrYXJnKycpJyk7Ci0gIGlmIChhcmcgPT09ICdYY2VwdGlvbicpIHsKLSAgICB2YXIgeCA9IG5ldyB0dHlwZXMuWGNlcHRpb24oKTsKKyAgaWYgKGFyZyA9PT0gIlhjZXB0aW9uIikgeworICAgIGNvbnN0IHggPSBuZXcgdHR5cGVzLlhjZXB0aW9uKCk7CiAgICAgeC5lcnJvckNvZGUgPSAxMDAxOwogICAgIHgubWVzc2FnZSA9IGFyZzsKICAgICByZXN1bHQoeCk7Ci0gIH0gZWxzZSBpZiAoYXJnID09PSAnVEV4Y2VwdGlvbicpIHsKKyAgfSBlbHNlIGlmIChhcmcgPT09ICJURXhjZXB0aW9uIikgewogICAgIHJlc3VsdChuZXcgVEV4Y2VwdGlvbihhcmcpKTsKICAgfSBlbHNlIHsKICAgICByZXN1bHQobnVsbCk7CkBAIC0xNzcsNDkgKzE2Myw0OCBAQAogCiBmdW5jdGlvbiB0ZXN0TXVsdGlFeGNlcHRpb24oYXJnMCwgYXJnMSkgewogICAvL2NvbnNvbGUubG9nKCd0ZXN0TXVsdGlFeGNlcHRpb24oJyArIGFyZzAgKyAnLCAnICsgYXJnMSArICcpJyk7Ci0gIGlmIChhcmcwID09PSAoJ1hjZXB0aW9uJykpIHsKLSAgICB2YXIgeCA9IG5ldyB0dHlwZXMuWGNlcHRpb24oKTsKKyAgaWYgKGFyZzAgPT09ICJYY2VwdGlvbiIpIHsKKyAgICBjb25zdCB4ID0gbmV3IHR0eXBlcy5YY2VwdGlvbigpOwogICAgIHguZXJyb3JDb2RlID0gMTAwMTsKLSAgICB4Lm1lc3NhZ2UgPSAnVGhpcyBpcyBhbiBYY2VwdGlvbic7CisgICAgeC5tZXNzYWdlID0gIlRoaXMgaXMgYW4gWGNlcHRpb24iOwogICAgIHRocm93IHg7Ci0gIH0gZWxzZSBpZiAoYXJnMCA9PT0gKCdYY2VwdGlvbjInKSkgewotICAgIHZhciB4MiA9IG5ldyB0dHlwZXMuWGNlcHRpb24yKCk7CisgIH0gZWxzZSBpZiAoYXJnMCA9PT0gIlhjZXB0aW9uMiIpIHsKKyAgICBjb25zdCB4MiA9IG5ldyB0dHlwZXMuWGNlcHRpb24yKCk7CiAgICAgeDIuZXJyb3JDb2RlID0gMjAwMjsKICAgICB4Mi5zdHJ1Y3RfdGhpbmcgPSBuZXcgdHR5cGVzLlh0cnVjdCgpOwotICAgIHgyLnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcgPSAnVGhpcyBpcyBhbiBYY2VwdGlvbjInOworICAgIHgyLnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbjIiOwogICAgIHRocm93IHgyOwogICB9CiAKLSAgdmFyIHJlcyA9IG5ldyB0dHlwZXMuWHRydWN0KCk7CisgIGNvbnN0IHJlcyA9IG5ldyB0dHlwZXMuWHRydWN0KCk7CiAgIHJlcy5zdHJpbmdfdGhpbmcgPSBhcmcxOwogICByZXR1cm4gcmVzOwogfQogCiBmdW5jdGlvbiB0ZXN0TXVsdGlFeGNlcHRpb25Bc3luYyhhcmcwLCBhcmcxLCByZXN1bHQpIHsKICAgLy9jb25zb2xlLmxvZygndGVzdE11bHRpRXhjZXB0aW9uKCcgKyBhcmcwICsgJywgJyArIGFyZzEgKyAnKScpOwotICBpZiAoYXJnMCA9PT0gKCdYY2VwdGlvbicpKSB7Ci0gICAgdmFyIHggPSBuZXcgdHR5cGVzLlhjZXB0aW9uKCk7CisgIGlmIChhcmcwID09PSAiWGNlcHRpb24iKSB7CisgICAgY29uc3QgeCA9IG5ldyB0dHlwZXMuWGNlcHRpb24oKTsKICAgICB4LmVycm9yQ29kZSA9IDEwMDE7Ci0gICAgeC5tZXNzYWdlID0gJ1RoaXMgaXMgYW4gWGNlcHRpb24nOworICAgIHgubWVzc2FnZSA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uIjsKICAgICByZXN1bHQoeCk7Ci0gIH0gZWxzZSBpZiAoYXJnMCA9PT0gKCdYY2VwdGlvbjInKSkgewotICAgIHZhciB4MiA9IG5ldyB0dHlwZXMuWGNlcHRpb24yKCk7CisgIH0gZWxzZSBpZiAoYXJnMCA9PT0gIlhjZXB0aW9uMiIpIHsKKyAgICBjb25zdCB4MiA9IG5ldyB0dHlwZXMuWGNlcHRpb24yKCk7CiAgICAgeDIuZXJyb3JDb2RlID0gMjAwMjsKICAgICB4Mi5zdHJ1Y3RfdGhpbmcgPSBuZXcgdHR5cGVzLlh0cnVjdCgpOwotICAgIHgyLnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcgPSAnVGhpcyBpcyBhbiBYY2VwdGlvbjInOworICAgIHgyLnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbjIiOwogICAgIHJlc3VsdCh4Mik7CiAgIH0gZWxzZSB7Ci0gICAgdmFyIHJlcyA9IG5ldyB0dHlwZXMuWHRydWN0KCk7CisgICAgY29uc3QgcmVzID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTsKICAgICByZXMuc3RyaW5nX3RoaW5nID0gYXJnMTsKICAgICByZXN1bHQobnVsbCwgcmVzKTsKICAgfQogfQogCi1mdW5jdGlvbiB0ZXN0T25ld2F5KHNsZWVwRm9yKSB7Ci0gIC8vY29uc29sZS5sb2coJ3Rlc3RPbmV3YXkoJyArIHNsZWVwRm9yICsgJykgPT4gSmF2YVNjcmlwdCAobGlrZSBSdXN0KSBuZXZlciBzbGVlcHMhJyk7Ci19CisvL2NvbnNvbGUubG9nKCd0ZXN0T25ld2F5KCcgKyBzbGVlcEZvciArICcpID0+IEphdmFTY3JpcHQgKGxpa2UgUnVzdCkgbmV2ZXIgc2xlZXBzIScpOworZnVuY3Rpb24gdGVzdE9uZXdheSgpIHt9CiAKLWZ1bmN0aW9uIHRlc3RPbmV3YXlBc3luYyhzbGVlcEZvciwgcmVzdWx0KSB7CitmdW5jdGlvbiB0ZXN0T25ld2F5QXN5bmMoc2xlZXBGb3IpIHsKICAgdGVzdE9uZXdheShzbGVlcEZvcik7CiB9CiAKQEAgLTIyOCwxMSArMjEzLDggQEAKICAgYXN5bmNIYW5kbGVyc1tsYWJlbF0gPSBtYWtlQXN5bmNIYW5kbGVyKGxhYmVsKTsKIH0pOwogCi1bJ3Rlc3RNYXBNYXAnLCAndGVzdEluc2FuaXR5J10uZm9yRWFjaChmdW5jdGlvbihsYWJlbCkgeworWyJ0ZXN0TWFwTWFwIiwgInRlc3RJbnNhbml0eSJdLmZvckVhY2goZnVuY3Rpb24obGFiZWwpIHsKICAgYXN5bmNIYW5kbGVyc1tsYWJlbF0gPSBtYWtlQXN5bmNIYW5kbGVyKGxhYmVsKTsKIH0pOwogCiBleHBvcnRzLlRocmlmdFRlc3RIYW5kbGVyID0gYXN5bmNIYW5kbGVyczsKLQotZXhwb3J0cy5Bc3luY1RocmlmdFRlc3RIYW5kbGVyID0gYXN5bmNIYW5kbGVyczsKLWV4cG9ydHMuU3luY1RocmlmdFRlc3RIYW5kbGVyID0gYXN5bmNIYW5kbGVyczsKZGlmZiAtLWdpdCBhL2xpYi9ub2RldHMvLmdpdGlnbm9yZSBiL2xpYi9ub2RldHMvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2FiYTg5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGV0cy8uZ2l0aWdub3JlCkBAIC0wLDAgKzEgQEAKK3Rlc3QtY29tcGlsZWQvCmRpZmYgLS1naXQgYS9saWIvbm9kZXRzL01ha2VmaWxlLmFtIGIvbGliL25vZGV0cy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lYTY0MGNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGV0cy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQ1IEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBXZSBjYWxsIG5wbSB0d2ljZSB0byB3b3JrIGFyb3VuZCBucG0gaXNzdWVzCisKK3N0dWJzOiAkKHRvcF9zcmNkaXIpL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKwlta2RpciAtcCB0ZXN0LWNvbXBpbGVkCisJJChUSFJJRlQpIC0tZ2VuIGpzOm5vZGUsdHMgLW8gdGVzdC8gJCh0b3Bfc3JjZGlyKS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0ICYmICQoVEhSSUZUKSAtLWdlbiBqczpub2RlLHRzIC1vIHRlc3QtY29tcGlsZWQgJCh0b3Bfc3JjZGlyKS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CisKK3RzLWNvbXBpbGU6IHN0dWJzCisJbWtkaXIgLXAgdGVzdC1jb21waWxlZAorCS4uLy4uL25vZGVfbW9kdWxlcy90eXBlc2NyaXB0L2Jpbi90c2MgLS1vdXREaXIgdGVzdC1jb21waWxlZC8gLS1wcm9qZWN0IHRlc3QvdHNjb25maWcuanNvbgorCitkZXBzOiAkKHRvcF9zcmNkaXIpL3BhY2thZ2UuanNvbgorCSQoTlBNKSBpbnN0YWxsICQodG9wX3NyY2RpcikvIHx8ICQoTlBNKSBpbnN0YWxsICQodG9wX3NyY2RpcikvCisKK2FsbC1sb2NhbDogZGVwcyB0cy1jb21waWxlCisKK3ByZWNyb3NzOiBkZXBzIHN0dWJzIHRzLWNvbXBpbGUKKworY2hlY2s6IGRlcHMgdHMtY29tcGlsZQorCWNkICQodG9wX3NyY2RpcikgJiYgJChOUE0pIHJ1biB0ZXN0LXRzICYmIGNkIGxpYi9ub2RldHMKKworY2xlYW4tbG9jYWw6CisJJChSTSkgLXIgdGVzdC9nZW4tbm9kZWpzCisJJChSTSkgLXIgJCh0b3Bfc3JjZGlyKS9ub2RlX21vZHVsZXMKKwkkKFJNKSAtciB0ZXN0LWNvbXBpbGVkCisKK0VYVFJBX0RJU1QgPSBcCisJdGVzdCBcCisJY29kaW5nX3N0YW5kYXJkcy5tZApkaWZmIC0tZ2l0IGEvbGliL25vZGV0cy9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvbGliL25vZGV0cy9jb2Rpbmdfc3RhbmRhcmRzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMDM5MGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZXRzL2NvZGluZ19zdGFuZGFyZHMubWQKQEAgLTAsMCArMSBAQAorUGxlYXNlIGZvbGxvdyBbR2VuZXJhbCBDb2RpbmcgU3RhbmRhcmRzXSgvZG9jL2NvZGluZ19zdGFuZGFyZHMubWQpCmRpZmYgLS1naXQgYS9saWIvbm9kZXRzL3Rlc3QvY2xpZW50LnRzIGIvbGliL25vZGV0cy90ZXN0L2NsaWVudC50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmEzYzI4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGV0cy90ZXN0L2NsaWVudC50cwpAQCAtMCwwICsxLDYzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBhc3NlcnQgPSByZXF1aXJlKCJhc3NlcnQiKTsKK2ltcG9ydCB0aHJpZnQgPSByZXF1aXJlKCJ0aHJpZnQiKTsKK2ltcG9ydCBUaHJpZnQgPSB0aHJpZnQuVGhyaWZ0OworaW1wb3J0IFRocmlmdFRlc3QgPSByZXF1aXJlKCIuL2dlbi1ub2RlanMvVGhyaWZ0VGVzdCIpOworaW1wb3J0IHRlc3RfZHJpdmVyID0gcmVxdWlyZSgiLi90ZXN0X2RyaXZlciIpOworaW1wb3J0IFRocmlmdFRlc3REcml2ZXIgPSB0ZXN0X2RyaXZlci5UaHJpZnRUZXN0RHJpdmVyOworaW1wb3J0IFRocmlmdFRlc3REcml2ZXJQcm9taXNlID0gdGVzdF9kcml2ZXIuVGhyaWZ0VGVzdERyaXZlclByb21pc2U7CisKKy8vIHZhciBwcm9ncmFtID0gcmVxdWlyZSgiY29tbWFuZGVyIik7CitpbXBvcnQgKiBhcyBwcm9ncmFtIGZyb20gImNvbW1hbmRlciI7CisKK3Byb2dyYW0KKyAgLm9wdGlvbigiLS1wb3J0IDxwb3J0PiIsICJTZXQgdGhyaWZ0IHNlcnZlciBwb3J0IG51bWJlciB0byBjb25uZWN0IiwgOTA5MCkKKyAgLm9wdGlvbigiLS1wcm9taXNlIiwgInRlc3Qgd2l0aCBwcm9taXNlIHN0eWxlIGZ1bmN0aW9ucyIpCisgIC5vcHRpb24oIi0tcHJvdG9jb2wiLCAiU2V0IHRocmlmdCBwcm90b2NvbCAoYmluYXJ5KSBbcHJvdG9jb2xdIikKKyAgLnBhcnNlKHByb2Nlc3MuYXJndik7CisKK3ZhciBwb3J0OiBudW1iZXIgPSBwcm9ncmFtLnBvcnQ7Cit2YXIgcHJvbWlzZSA9IHByb2dyYW0ucHJvbWlzZTsKKwordmFyIG9wdGlvbnMgPSB7CisgIHRyYW5zcG9ydDogVGhyaWZ0LlRCdWZmZXJlZFRyYW5zcG9ydCwKKyAgcHJvdG9jb2w6IFRocmlmdC5UQmluYXJ5UHJvdG9jb2wKK307CisKK3ZhciB0ZXN0RHJpdmVyID0gcHJvbWlzZSA/IFRocmlmdFRlc3REcml2ZXJQcm9taXNlIDogVGhyaWZ0VGVzdERyaXZlcjsKKwordmFyIGNvbm5lY3Rpb24gPSB0aHJpZnQuY3JlYXRlQ29ubmVjdGlvbigibG9jYWxob3N0IiwgcG9ydCwgb3B0aW9ucyk7CisKK2Nvbm5lY3Rpb24ub24oImVycm9yIiwgZnVuY3Rpb24oZXJyOiBzdHJpbmcpIHsKKyAgICBhc3NlcnQoZmFsc2UsIGVycik7Cit9KTsKKwordmFyIGNsaWVudCA9IHRocmlmdC5jcmVhdGVDbGllbnQoVGhyaWZ0VGVzdC5DbGllbnQsIGNvbm5lY3Rpb24pOworcnVuVGVzdHMoKTsKKworZnVuY3Rpb24gcnVuVGVzdHMoKSB7CisgIHRlc3REcml2ZXIoY2xpZW50LCBmdW5jdGlvbiAoc3RhdHVzOiBzdHJpbmcpIHsKKyAgICBjb25zb2xlLmxvZyhzdGF0dXMpOworICAgIHByb2Nlc3MuZXhpdCgwKTsKKyAgfSk7Cit9CisKK2V4cG9ydHMuZXhwcmVzc29UZXN0ID0gZnVuY3Rpb24oKSB7fTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RldHMvdGVzdC9ydW5DbGllbnQuc2ggYi9saWIvbm9kZXRzL3Rlc3QvcnVuQ2xpZW50LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhkNWU5YTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZXRzL3Rlc3QvcnVuQ2xpZW50LnNoCkBAIC0wLDAgKzEsMTggQEAKKyMhIC9iaW4vc2gKKworRElSPSIkKCBjZCAiJCggZGlybmFtZSAiJDAiICkiICYmIHB3ZCApIgorCitta2RpciAtcCAkRElSLy4uL3Rlc3QtY29tcGlsZWQKKworQ09NUElMRURESVI9IiQoY2QgJERJUiAmJiBjZCAuLi90ZXN0LWNvbXBpbGVkICYmIHB3ZCkiCitleHBvcnQgTk9ERV9QQVRIPSIke0RJUn06JHtESVJ9Ly4uLy4uL25vZGVqcy9saWI6JHtOT0RFX1BBVEh9IgorCitjb21waWxlKCkKK3sKKyAgI2dlbmVyYXRpbmcgdGhyaWZ0IGNvZGUKKyAgJHtESVJ9Ly4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLW8gJHtESVJ9IC0tZ2VuIGpzOm5vZGUsdHMgJHtESVJ9Ly4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKyAgJHtESVJ9Ly4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLW8gJHtDT01QSUxFRERJUn0gLS1nZW4ganM6bm9kZSx0cyAke0RJUn0vLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorfQorY29tcGlsZQorCitub2RlICR7Q09NUElMRURESVJ9L2NsaWVudC5qcyAkKgpkaWZmIC0tZ2l0IGEvbGliL25vZGV0cy90ZXN0L3J1blNlcnZlci5zaCBiL2xpYi9ub2RldHMvdGVzdC9ydW5TZXJ2ZXIuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGVlZTkyNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RldHMvdGVzdC9ydW5TZXJ2ZXIuc2gKQEAgLTAsMCArMSwyMCBAQAorIyEgL2Jpbi9zaAorCitESVI9IiQoIGNkICIkKCBkaXJuYW1lICIkMCIgKSIgJiYgcHdkICkiCisKK21rZGlyIC1wICRESVIvLi4vdGVzdC1jb21waWxlZAorCitDT01QSUxFRERJUj0iJChjZCAkRElSICYmIGNkIC4uL3Rlc3QtY29tcGlsZWQgJiYgcHdkKSIKK2V4cG9ydCBOT0RFX1BBVEg9IiR7RElSfToke0RJUn0vLi4vLi4vbm9kZWpzL2xpYjoke05PREVfUEFUSH0iCisKK2NvbXBpbGUoKQoreworICAjZ2VuZXJhdGluZyB0aHJpZnQgY29kZQorICAke0RJUn0vLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtbyAke0RJUn0gLS1nZW4ganM6bm9kZSx0cyAke0RJUn0vLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorICAke0RJUn0vLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtbyAke0NPTVBJTEVERElSfSAtLWdlbiBqczpub2RlLHRzICR7RElSfS8uLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0Cit9Citjb21waWxlCisKK25vZGUgJHtDT01QSUxFRERJUn0vc2VydmVyLmpzICQqCisKKwpkaWZmIC0tZ2l0IGEvbGliL25vZGV0cy90ZXN0L3NlcnZlci50cyBiL2xpYi9ub2RldHMvdGVzdC9zZXJ2ZXIudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRhNTNhZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RldHMvdGVzdC9zZXJ2ZXIudHMKQEAgLTAsMCArMSwyNiBAQAoraW1wb3J0IHRocmlmdCA9IHJlcXVpcmUoInRocmlmdCIpOwordmFyIHByb2dyYW0gPSByZXF1aXJlKCdjb21tYW5kZXInKTsKK2ltcG9ydCBUaHJpZnRUZXN0ID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL1RocmlmdFRlc3QnKTsKK2ltcG9ydCB0ZXN0X2hhbmRsZXIgPSByZXF1aXJlKCcuL3Rlc3RfaGFuZGxlcicpOworCisKK3Byb2dyYW0KKyAgLm9wdGlvbignLS1wb3J0IDxwb3J0PicsICdTZXQgdGhyaWZ0IHNlcnZlciBwb3J0JywgOTA5MCkKKyAgLm9wdGlvbignLS1wcm9taXNlJywgJ3Rlc3Qgd2l0aCBwcm9taXNlIHN0eWxlIGZ1bmN0aW9ucycpCisgIC5vcHRpb24oJy0tcHJvdG9jb2wnLCAnIlNldCB0aHJpZnQgcHJvdG9jb2wgKGJpbmFyeSkgW3Byb3RvY29sXSInKQorICAucGFyc2UocHJvY2Vzcy5hcmd2KTsKKwordmFyIHBvcnQ6IG51bWJlciA9IHByb2dyYW0ucG9ydDsKKwordmFyIG9wdGlvbnM6IHRocmlmdC5TZXJ2ZXJPcHRpb25zID0geworICB0cmFuc3BvcnQ6IHRocmlmdC5UQnVmZmVyZWRUcmFuc3BvcnQsCisgIHByb3RvY29sOiB0aHJpZnQuVEJpbmFyeVByb3RvY29sCit9OworCit2YXIgc2VydmVyOiB0aHJpZnQuU2VydmVyOworaWYgKHByb2dyYW0ucHJvbWlzZSkgeworICBzZXJ2ZXIgPSB0aHJpZnQuY3JlYXRlU2VydmVyKFRocmlmdFRlc3QuUHJvY2Vzc29yLCBuZXcgdGVzdF9oYW5kbGVyLkFzeW5jVGhyaWZ0VGVzdEhhbmRsZXIoKSwgb3B0aW9ucyk7Cit9IGVsc2UgeworICBzZXJ2ZXIgPSB0aHJpZnQuY3JlYXRlU2VydmVyKFRocmlmdFRlc3QuUHJvY2Vzc29yLCBuZXcgdGVzdF9oYW5kbGVyLlN5bmNUaHJpZnRUZXN0SGFuZGxlcigpLCBvcHRpb25zKTsKK30KK3NlcnZlci5saXN0ZW4ocG9ydCk7CmRpZmYgLS1naXQgYS9saWIvbm9kZXRzL3Rlc3QvdGVzdC1jYXNlcy50cyBiL2xpYi9ub2RldHMvdGVzdC90ZXN0LWNhc2VzLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNzQwZWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZXRzL3Rlc3QvdGVzdC1jYXNlcy50cwpAQCAtMCwwICsxLDExMyBAQAorJ3VzZSBzdHJpY3QnOworCitpbXBvcnQgdHR5cGVzID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL1RocmlmdFRlc3RfdHlwZXMnKTsKKworLy9hbGwgTGFuZ3VhZ2VzIGluIFVURi04CisvKmpzaGludCAtVzEwMCAqLworZXhwb3J0IHZhciBzdHJpbmdUZXN0ID0gIkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvbsOpcywg2KfZhNi52LHYqNmK2KksINmF2LXYsdmJLCAiICsKKyAgICAiQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6yZlyYmF5Y2FuLCDQkdCw0YjSodC+0YDRgiwgQm9hcmlzY2gsIMW9ZW1haXTEl8Wha2EsICIgKworICAgICLQkdC10LvQsNGA0YPRgdC60LDRjywg0JHQtdC70LDRgNGD0YHQutCw0Y8gKNGC0LDRgNCw0YjQutC10LLRltGG0LApLCDQkdGK0LvQs9Cw0YDRgdC60LgsIEJhbWFuYW5rYW4sICIgKworICAgICLgpqzgpr7gpoLgprLgpr4sIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsw6AsIE3DrG5nLWTElcykbmctbmfhubPMhCwg0J3QvtGF0YfQuNC50L0sICIgKworICAgICJDZWJ1YW5vLCDhj6PhjrPhjqksIMSMZXNreSwg0KHQu9C+0LLRo8yB0L3RjNGB0LrRiiAvIOKwlOKwjuKwkeKwguKwoeKwkOKwoOKwlOKwjeKwnywg0KfTkdCy0LDRiNC70LAsIEN5bXJhZWcsICIgKworICAgICJEYW5zaywgWmF6YWtpLCDei96o3ojerN6A3qjehN6m3pDesCwgzpXOu867zrfOvc65zrrOrCwgRW1pbGnDoG4gZSBydW1hZ27DsmwsIEVuZ2xpc2gsICIgKworICAgICJFc3BlcmFudG8sIEVzcGHDsW9sLCBFZXN0aSwgRXVza2FyYSwg2YHYp9ix2LPbjCwgU3VvbWksIFbDtXJvLCBGw7hyb3lza3QsICIgKworICAgICJGcmFuw6dhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIOi0m+iqniwgR8OgaWRobGlnLCBHYWxlZ28sICIgKworICAgICJBdmHDsWUn4bq9LCDgqpfgq4HgqpzgqrDgqr7gqqTgq4AsIEdhZWxnLCDXoteR16jXmdeqLCDgpLngpL/gpKjgpY3gpKbgpYAsIEZpamkgSGluZGksIEhydmF0c2tpLCAiICsKKyAgICAiS3JlecOybCBheWlzeWVuLCBNYWd5YXIsINWA1aHVtdWl1oDVpdW2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwgIiArCisgICAgIklsb2thbm8sIElkbywgw41zbGVuc2thLCBJdGFsaWFubywg5pel5pys6KqeLCBMb2piYW4sIEJhc2EgSmF3YSwgIiArCisgICAgIuGDpeGDkOGDoOGDl+GDo+GDmuGDmCwgS29uZ28sIEthbGFhbGxpc3V0LCDgspXgsqjgs43gsqjgsqEsIO2VnOq1reyWtCwg0JrRitCw0YDQsNGH0LDQuS3QnNCw0LvQutGK0LDRgCwgIiArCisgICAgIlJpcG9hcmlzY2gsIEt1cmTDriwg0JrQvtC80LgsIEtlcm5ld2VrLCDQmtGL0YDQs9GL0LfRh9CwLCBMYXRpbmEsIExhZGlubywgIiArCisgICAgIkzDq3R6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmfDoWxhLCDguqXgurLguqcsIExpZXR1dmnFsywgTGF0dmllxaF1LCBCYXNhICIgKworICAgICJCYW55dW1hc2FuLCBNYWxhZ2FzeSwg0JzQsNC60LXQtNC+0L3RgdC60LgsIOC0ruC0suC0r+C0vuC0s+C0giwg4KSu4KSw4KS+4KSg4KWALCDZhdin2LLZkNix2YjZhtuMLCBCYWhhc2EgIiArCisgICAgIk1lbGF5dSwgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIOCkqOClh+CkquCkvuCksiDgpK3gpL7gpLfgpL4sIE5lZGVybGFuZHMsIOKAqiIgKworICAgICJOb3JzayAobnlub3JzaynigKwsIOKAqk5vcnNrIChib2ttw6VsKeKArCwgTm91b3JtYW5kLCBEaW7DqSBiaXphYWQsICIgKworICAgICJPY2NpdGFuLCDQmNGA0L7QvdCw0YMsIFBhcGlhbWVudHUsIERlaXRzY2gsIFBvbHNraSwg2b7Zhtis2KfYqNuMLCDZvtqa2KrZiCwgIiArCisgICAgIk5vcmZ1ayAvIFBpdGtlcm4sIFBvcnR1Z3XDqnMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbcOibsSDLCAiICsKKyAgICAi0KDRg9GB0YHQutC40LksINCh0LDRhdCwINGC0YvQu9CwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU8OhbWVnaWVsbGEsIFNpbXBsZSAiICsKKyAgICAiRW5nbGlzaCwgU2xvdmVuxI1pbmEsIFNsb3ZlbsWhxI1pbmEsINCh0YDQv9GB0LrQuCAvIFNycHNraSwgU2VlbHRlcnNrLCAiICsKKyAgICAiU3ZlbnNrYSwgS2lzd2FoaWxpLCDgrqTgrq7grr/grrTgr40sIOCwpOCxhuCwsuCxgeCwl+CxgSwg0KLQvtK30LjQutOjLCDguYTguJfguKIsIFTDvHJrbWVuw6dlLCBUYWdhbG9nLCAiICsKKyAgICAiVMO8cmvDp2UsINCi0LDRgtCw0YDRh9CwL1RhdGFyw6dhLCDQo9C60YDQsNGX0L3RgdGM0LrQsCwg2KfYsdiv2YgsIFRp4bq/bmcgVmnhu4d0LCBWb2xhcMO8aywgIiArCisgICAgIldhbG9uLCBXaW5hcmF5LCDlkLTor60sIGlzaVhob3NhLCDXmdeZ1rTXk9eZ16ksIFlvcsO5YsOhLCBaZcOqdXdzLCDkuK3mlocsICIgKworICAgICJCw6JuLWzDom0tZ8O6LCDnsrXoqp4iOworLypqc2hpbnQgK1cxMDAgKi8KKworZXhwb3J0IHZhciBzcGVjaWFsQ2hhcmFjdGVycyA9ICdxdW90ZTogXCIgYmFja3NsYXNoOicgKworICAgICcgZm9yd2FyZHNsYXNoLWVzY2FwZWQ6IFwvICcgKworICAgICcgYmFja3NwYWNlOiBcYiBmb3JtZmVlZDogXGYgbmV3bGluZTogXG4gcmV0dXJuOiBcciB0YWI6ICcgKworICAgICcgbm93LWFsbC1vZi10aGVtLXRvZ2V0aGVyOiAiXFxcL1xiXG5cclx0JyArCisgICAgJyBub3ctYS1idW5jaC1vZi1qdW5rOiAhQCMkJSYoKSgmJSQje317fTw+PD48JyArCisgICAgJyBjaGFyLXRvLXRlc3QtanNvbi1wYXJzaW5nOiBdXSBcIl1dIFxcIiB9fX17IFtbWyAnOworCitleHBvcnQgdmFyIG1hcFRlc3RJbnB1dCA9IHsKKyAgImEiOiIxMjMiLCAiYSBiIjoid2l0aCBzcGFjZXMgIiwgInNhbWUiOiJzYW1lIiwgIjAiOiJudW1lcmljIGtleSIsCisgICJsb25nVmFsdWUiOnN0cmluZ1Rlc3QsIHN0cmluZ1Rlc3Q6Imxvbmcga2V5IgorfTsKKworZXhwb3J0IHZhciBzaW1wbGUgPSBbCisgIFsndGVzdFZvaWQnLCB1bmRlZmluZWRdLAorICBbJ3Rlc3RTdHJpbmcnLCAnVGVzdCddLAorICBbJ3Rlc3RTdHJpbmcnLCAnJ10sCisgIFsndGVzdFN0cmluZycsIHN0cmluZ1Rlc3RdLAorICBbJ3Rlc3RTdHJpbmcnLCBzcGVjaWFsQ2hhcmFjdGVyc10sCisgIFsndGVzdEJ5dGUnLCAxXSwKKyAgWyd0ZXN0Qnl0ZScsIDBdLAorICBbJ3Rlc3RCeXRlJywgLTFdLAorICBbJ3Rlc3RCeXRlJywgLTEyN10sCisgIFsndGVzdEkzMicsIC0xXSwKKyAgWyd0ZXN0RG91YmxlJywgLTUuMjA5ODUyM10sCisgIFsndGVzdERvdWJsZScsIDcuMDEyMDUyMTc1MjE1MDQ0XSwKKyAgWyd0ZXN0RW51bScsIHR0eXBlcy5OdW1iZXJ6Lk9ORV0KK107CisKK2V4cG9ydCB2YXIgc2ltcGxlTG9vc2UgPSBbCisgIFsndGVzdEk2NCcsIDVdLAorICBbJ3Rlc3RJNjQnLCAtNV0sCisgIFsndGVzdEk2NCcsIDczNDM1OTczODM2OF0sCisgIFsndGVzdEk2NCcsIC0zNDM1OTczODM2OF0sCisgIFsndGVzdEk2NCcsIC03MzQzNTk3MzgzNjhdLAorICBbJ3Rlc3RUeXBlZGVmJywgNjldCitdCisKK3ZhciBtYXBvdXQ6IHtba2V5OiBudW1iZXJdOiBudW1iZXI7IH0gPSB7fTsKK2ZvciAodmFyIGkgPSAwOyBpIDwgNTsgKytpKSB7CisgIG1hcG91dFtpXSA9IGktMTA7Cit9CisKK2V4cG9ydCB2YXIgZGVlcCA9IFsKKyAgWyd0ZXN0TWFwJywgbWFwb3V0XSwKKyAgWyd0ZXN0U2V0JywgWzEsMiwzXV0sCisgIFsndGVzdExpc3QnLCBbMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTksMjBdXSwKKyAgWyd0ZXN0U3RyaW5nTWFwJywgbWFwVGVzdElucHV0XQorXTsKKworZXhwb3J0IHZhciBvdXQgPSBuZXcgdHR5cGVzLlh0cnVjdCh7CisgIHN0cmluZ190aGluZzogJ1plcm8nLAorICBieXRlX3RoaW5nOiAxLAorICBpMzJfdGhpbmc6IC0zLAorICBpNjRfdGhpbmc6IDEwMDAwMDAKK30pOworCitleHBvcnQgdmFyIG91dDIgPSBuZXcgdHR5cGVzLlh0cnVjdDIoKTsKK291dDIuYnl0ZV90aGluZyA9IDE7CitvdXQyLnN0cnVjdF90aGluZyA9IG91dDsKK291dDIuaTMyX3RoaW5nID0gNTsKKworZXhwb3J0IHZhciBjcmF6eSA9IG5ldyB0dHlwZXMuSW5zYW5pdHkoeworICAidXNlck1hcCI6eyAiNSI6NSwgIjgiOjggfSwKKyAgInh0cnVjdHMiOltuZXcgdHR5cGVzLlh0cnVjdCh7CisgICAgICAic3RyaW5nX3RoaW5nIjoiR29vZGJ5ZTQiLAorICAgICAgImJ5dGVfdGhpbmciOjQsCisgICAgICAiaTMyX3RoaW5nIjo0LAorICAgICAgImk2NF90aGluZyI6NAorICAgIH0pLCBuZXcgdHR5cGVzLlh0cnVjdCh7CisgICAgICAic3RyaW5nX3RoaW5nIjoiSGVsbG8yIiwKKyAgICAgICJieXRlX3RoaW5nIjoyLAorICAgICAgImkzMl90aGluZyI6MiwKKyAgICAgICJpNjRfdGhpbmciOjIKKyAgICB9KV0KK30pOworCitleHBvcnQgdmFyIGluc2FuaXR5OiBhbnkgPSB7CisgICIxIjp7ICIyIjogY3JhenksICIzIjogY3JhenkgfSwKKyAgIjIiOnsgIjYiOnsgInVzZXJNYXAiOnt9LCAieHRydWN0cyI6W10gfSB9Cit9OwpkaWZmIC0tZ2l0IGEvbGliL25vZGV0cy90ZXN0L3Rlc3RBbGwuc2ggYi9saWIvbm9kZXRzL3Rlc3QvdGVzdEFsbC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hN2MwMGJmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGV0cy90ZXN0L3Rlc3RBbGwuc2gKQEAgLTAsMCArMSwzOCBAQAorIyEgL2Jpbi9zaAorCitESVI9IiQoIGNkICIkKCBkaXJuYW1lICIkMCIgKSIgJiYgcHdkICkiCisKK21rZGlyIC1wICRESVIvLi4vdGVzdC1jb21waWxlZAorCitDT01QSUxFRERJUj0iJChjZCAkRElSICYmIGNkIC4uL3Rlc3QtY29tcGlsZWQgJiYgcHdkKSIKK2V4cG9ydCBOT0RFX1BBVEg9IiR7RElSfToke0RJUn0vLi4vLi4vbm9kZWpzL2xpYjoke05PREVfUEFUSH0iCisKK2NvbXBpbGUoKQoreworICAjZ2VuZXJhdGluZyB0aHJpZnQgY29kZQorICAke0RJUn0vLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtbyAke0RJUn0gLS1nZW4ganM6bm9kZSx0cyAke0RJUn0vLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorICAke0RJUn0vLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtbyAke0NPTVBJTEVERElSfSAtLWdlbiBqczpub2RlLHRzICR7RElSfS8uLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CisKKyAgdHNjIC0tb3V0RGlyICRDT01QSUxFRERJUiAtLXByb2plY3QgJERJUi90c2NvbmZpZy5qc29uCit9Citjb21waWxlCisKK3Rlc3RTZXJ2ZXIoKQoreworICBlY2hvICJzdGFydCBzZXJ2ZXIgJDEiCisgIFJFVD0wCisgIG5vZGUgJHtDT01QSUxFRERJUn0vc2VydmVyLmpzICQxICYKKyAgU0VSVkVSUElEPSQhCisgIHNsZWVwIDEKKyAgZWNobyAic3RhcnQgY2xpZW50ICQxIgorICBub2RlICR7Q09NUElMRURESVJ9L2NsaWVudC5qcyAkMSB8fCBSRVQ9MQorICBraWxsIC0yICRTRVJWRVJQSUQgfHwgUkVUPTEKKyAgcmV0dXJuICRSRVQKK30KKworI2ludGVncmF0aW9uIHRlc3RzCisKK3Rlc3RTZXJ2ZXIgfHwgVEVTVE9LPTEKK3Rlc3RTZXJ2ZXIgLS1wcm9taXNlIHx8IFRFU1RPSz0xCisKK2V4aXQgJFRFU1RPSwpkaWZmIC0tZ2l0IGEvbGliL25vZGV0cy90ZXN0L3Rlc3RfZHJpdmVyLnRzIGIvbGliL25vZGV0cy90ZXN0L3Rlc3RfZHJpdmVyLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNDE1MjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZXRzL3Rlc3QvdGVzdF9kcml2ZXIudHMKQEAgLTAsMCArMSwyNzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogJ0xpY2Vuc2UnKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogJ0FTIElTJyBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworIC8vIFRoaXMgaXMgdGhlIE5vZGUuanMgdGVzdCBkcml2ZXIgZm9yIHRoZSBzdGFuZGFyZCBBcGFjaGUgVGhyaWZ0CisgLy8gdGVzdCBzZXJ2aWNlLiBUaGUgZHJpdmVyIGludm9rZXMgZXZlcnkgZnVuY3Rpb24gZGVmaW5lZCBpbiB0aGUKKyAvLyBUaHJpZnQgVGVzdCBzZXJ2aWNlIHdpdGggYSByZXByZXNlbnRhdGl2ZSByYW5nZSBvZiBwYXJhbWV0ZXJzLgorIC8vCisgLy8gVGhlIFRocmlmdFRlc3REcml2ZXIgZnVuY3Rpb24gcmVxdWlyZXMgYSBjbGllbnQgb2JqZWN0CisgLy8gY29ubmVjdGVkIHRvIGEgc2VydmVyIGhvc3RpbmcgdGhlIFRocmlmdCBUZXN0IHNlcnZpY2UgYW5kCisgLy8gc3VwcG9ydHMgYW4gb3B0aW9uYWwgY2FsbGJhY2sgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIHdpdGgKKyAvLyBhIHN0YXR1cyBtZXNzYWdlIHdoZW4gdGhlIHRlc3QgaXMgY29tcGxldGUuCisKK2ltcG9ydCB0ZXN0ID0gcmVxdWlyZSgidGFwZSIpOworaW1wb3J0IHR0eXBlcyA9IHJlcXVpcmUoIi4vZ2VuLW5vZGVqcy9UaHJpZnRUZXN0X3R5cGVzIik7CitpbXBvcnQgVGhyaWZ0VGVzdCA9IHJlcXVpcmUoIi4vZ2VuLW5vZGVqcy9UaHJpZnRUZXN0Iik7CitpbXBvcnQgdGhyaWZ0ID0gcmVxdWlyZSgidGhyaWZ0Iik7CitpbXBvcnQgUSA9IHRocmlmdC5ROworaW1wb3J0IFRFeGNlcHRpb24gPSB0aHJpZnQuVGhyaWZ0LlRFeGNlcHRpb247Cit2YXIgSW50NjQgPSByZXF1aXJlKCJub2RlLWludDY0Iik7CitpbXBvcnQgdGVzdENhc2VzID0gcmVxdWlyZSgiLi90ZXN0LWNhc2VzIik7CisKK2V4cG9ydCBmdW5jdGlvbiBUaHJpZnRUZXN0RHJpdmVyKGNsaWVudDogVGhyaWZ0VGVzdC5DbGllbnQsIGNhbGxiYWNrOiAoc3RhdHVzOiBzdHJpbmcpID0+IHZvaWQpIHsKKworICB0ZXN0KCJOb2RlSlMgU3R5bGUgQ2FsbGJhY2sgQ2xpZW50IFRlc3RzIiwgZnVuY3Rpb24oYXNzZXJ0KSB7CisKKyAgICB2YXIgY2hlY2tSZWN1cnNpdmVseSA9IG1ha2VSZWN1cnNpdmVDaGVjayhhc3NlcnQpOworCisgICAgZnVuY3Rpb24gbWFrZUFzc2VydGVyKGFzc2VydGlvbkZuOiAoYTogYW55LCBiOiBhbnksIG1zZz86IHN0cmluZykgPT4gdm9pZCkgeworICAgICAgcmV0dXJuIGZ1bmN0aW9uKGM6IChzdHJpbmcgfCBhbnkpW10pIHsKKyAgICAgICAgdmFyIGZuTmFtZSA9IGNbMF07CisgICAgICAgIHZhciBleHBlY3RlZCA9IGNbMV07CisgICAgICAgICg8YW55PmNsaWVudClbZm5OYW1lXShleHBlY3RlZCwgZnVuY3Rpb24oZXJyOiBhbnksIGFjdHVhbDogYW55KSB7CisgICAgICAgICAgYXNzZXJ0LmVycm9yKGVyciwgZm5OYW1lICsgIjogbm8gY2FsbGJhY2sgZXJyb3IiKTsKKyAgICAgICAgICBhc3NlcnRpb25GbihhY3R1YWwsIGV4cGVjdGVkLCBmbk5hbWUpOworICAgICAgICB9KQorICAgICAgfTsKKyAgICB9CisKKyAgICB0ZXN0Q2FzZXMuc2ltcGxlLmZvckVhY2gobWFrZUFzc2VydGVyKGFzc2VydC5lcXVhbCkpOworICAgIHRlc3RDYXNlcy5zaW1wbGVMb29zZS5mb3JFYWNoKG1ha2VBc3NlcnRlcihmdW5jdGlvbihhLCBlLCBtKXsKKyAgICAgIGFzc2VydC5vayhhID09IGUsIG0pOworICAgIH0pKTsKKyAgICB0ZXN0Q2FzZXMuZGVlcC5mb3JFYWNoKG1ha2VBc3NlcnRlcihhc3NlcnQuZGVlcEVxdWFsKSk7CisKKyAgICBjbGllbnQudGVzdE1hcE1hcCg0MiwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICAgICAgdmFyIGV4cGVjdGVkOiB0eXBlb2YgcmVzcG9uc2UgPSB7CisgICAgICAgICI0IjogeyIxIjoxLCAiMiI6MiwgIjMiOjMsICI0Ijo0fSwKKyAgICAgICAgIi00IjogeyItNCI6LTQsICItMyI6LTMsICItMiI6LTIsICItMSI6LTF9CisgICAgICB9OworICAgICAgYXNzZXJ0LmVycm9yKGVyciwgJ3Rlc3RNYXBNYXA6IG5vIGNhbGxiYWNrIGVycm9yJyk7CisgICAgICBhc3NlcnQuZGVlcEVxdWFsKGV4cGVjdGVkLCByZXNwb25zZSwgInRlc3RNYXBNYXAiKTsKKyAgICB9KTsKKworICAgIGNsaWVudC50ZXN0U3RydWN0KHRlc3RDYXNlcy5vdXQsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgICAgIGFzc2VydC5lcnJvcihlcnIsICJ0ZXN0U3RydWN0OiBubyBjYWxsYmFjayBlcnJvciIpOworICAgICAgY2hlY2tSZWN1cnNpdmVseSh0ZXN0Q2FzZXMub3V0LCByZXNwb25zZSwgInRlc3RTdHJ1Y3QiKTsKKyAgICB9KTsKKworICAgIGNsaWVudC50ZXN0TmVzdCh0ZXN0Q2FzZXMub3V0MiwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICAgICAgYXNzZXJ0LmVycm9yKGVyciwgInRlc3ROZXN0OiBubyBjYWxsYmFjayBlcnJvciIpOworICAgICAgY2hlY2tSZWN1cnNpdmVseSh0ZXN0Q2FzZXMub3V0MiwgcmVzcG9uc2UsICJ0ZXN0TmVzdCIpOworICAgIH0pOworCisgICAgY2xpZW50LnRlc3RJbnNhbml0eSh0ZXN0Q2FzZXMuY3JhenksIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgICAgIGFzc2VydC5lcnJvcihlcnIsICJ0ZXN0SW5zYW5pdHk6IG5vIGNhbGxiYWNrIGVycm9yIik7CisgICAgICBjaGVja1JlY3Vyc2l2ZWx5KHRlc3RDYXNlcy5pbnNhbml0eSwgcmVzcG9uc2UsICJ0ZXN0SW5zYW5pdHkiKTsKKyAgICB9KTsKKworICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCJURXhjZXB0aW9uIiwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICAgICAgYXNzZXJ0Lm9rKGVyciBpbnN0YW5jZW9mIFRFeGNlcHRpb24sICd0ZXN0RXhjZXB0aW9uOiBjb3JyZWN0IGVycm9yIHR5cGUnKTsKKyAgICAgIGFzc2VydC5vayghQm9vbGVhbihyZXNwb25zZSksICd0ZXN0RXhjZXB0aW9uOiBubyByZXNwb25zZScpOworICAgIH0pOworCisgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oIlhjZXB0aW9uIiwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICAgICAgYXNzZXJ0Lm9rKGVyciBpbnN0YW5jZW9mIHR0eXBlcy5YY2VwdGlvbiwgJ3Rlc3RFeGNlcHRpb246IGNvcnJlY3QgZXJyb3IgdHlwZScpOworICAgICAgYXNzZXJ0Lm9rKCFCb29sZWFuKHJlc3BvbnNlKSwgJ3Rlc3RFeGNlcHRpb246IG5vIHJlc3BvbnNlJyk7CisgICAgICBhc3NlcnQuZXF1YWwoZXJyLmVycm9yQ29kZSwgMTAwMSwgJ3Rlc3RFeGNlcHRpb246IGNvcnJlY3QgZXJyb3IgY29kZScpOworICAgICAgYXNzZXJ0LmVxdWFsKCdYY2VwdGlvbicsIGVyci5tZXNzYWdlLCAndGVzdEV4Y2VwdGlvbjogY29ycmVjdCBlcnJvciBtZXNzYWdlJyk7CisgICAgfSk7CisKKyAgICBjbGllbnQudGVzdEV4Y2VwdGlvbigibm8gRXhjZXB0aW9uIiwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICAgICAgYXNzZXJ0LmVycm9yKGVyciwgJ3Rlc3RFeGNlcHRpb246IG5vIGNhbGxiYWNrIGVycm9yJyk7CisgICAgICBhc3NlcnQub2soIUJvb2xlYW4ocmVzcG9uc2UpLCAndGVzdEV4Y2VwdGlvbjogbm8gcmVzcG9uc2UnKTsKKyAgICB9KTsKKworICAgIGNsaWVudC50ZXN0T25ld2F5KDAsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgICAgIGFzc2VydC5lcnJvcihlcnIsICd0ZXN0T25ld2F5OiBubyBjYWxsYmFjayBlcnJvcicpOworICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3BvbnNlLCB1bmRlZmluZWQsICd0ZXN0T25ld2F5OiB2b2lkIHJlc3BvbnNlJyk7CisgICAgfSk7CisKKyAgICBjaGVja09mZkJ5T25lKGZ1bmN0aW9uKGRvbmUpIHsKKyAgICAgIGNsaWVudC50ZXN0STMyKC0xLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7CisgICAgICAgIGFzc2VydC5lcnJvcihlcnIsICJjaGVja09mZkJ5T25lOiBubyBjYWxsYmFjayBlcnJvciIpOworICAgICAgICBhc3NlcnQuZXF1YWwoLTEsIHJlc3BvbnNlKTsKKyAgICAgICAgYXNzZXJ0LmVuZCgpOworICAgICAgICBkb25lKCk7CisgICAgICB9KTsKKyAgICB9LCBjYWxsYmFjayk7CisKKyAgfSk7Cit9OworCitleHBvcnQgZnVuY3Rpb24gVGhyaWZ0VGVzdERyaXZlclByb21pc2UoY2xpZW50OiBUaHJpZnRUZXN0LkNsaWVudCwgY2FsbGJhY2s6IChzdGF0dXM6IHN0cmluZykgPT4gdm9pZCkgeworCisgIHRlc3QoIlEgUHJvbWlzZSBDbGllbnQgVGVzdHMiLCBmdW5jdGlvbihhc3NlcnQpIHsKKworICAgIHZhciBjaGVja1JlY3Vyc2l2ZWx5ID0gbWFrZVJlY3Vyc2l2ZUNoZWNrKGFzc2VydCk7CisKKyAgICBmdW5jdGlvbiBmYWlsKG1zZzogc3RyaW5nKSB7CisgICAgICByZXR1cm4gZnVuY3Rpb24oZXJyb3IsIHJlc3BvbnNlKSB7CisgICAgICAgIGlmIChlcnJvciAhPT0gbnVsbCkgeworICAgICAgICAgIGFzc2VydC5mYWlsKG1zZyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBmdW5jdGlvbiBtYWtlQXNzZXJ0ZXIoYXNzZXJ0aW9uRm46IChhOiBhbnksIGI6IGFueSwgbXNnPzogc3RyaW5nKSA9PiB2b2lkKSB7CisgICAgICByZXR1cm4gZnVuY3Rpb24oYzogKHN0cmluZyB8IGFueSlbXSkgeworICAgICAgICB2YXIgZm5OYW1lID0gY1swXTsKKyAgICAgICAgdmFyIGV4cGVjdGVkID0gY1sxXTsKKyAgICAgICAgKDxhbnk+Y2xpZW50KVtmbk5hbWVdKGV4cGVjdGVkKQorICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKGFjdHVhbDogYW55KSB7CisgICAgICAgICAgICBhc3NlcnRpb25GbihhY3R1YWwsIGV4cGVjdGVkLCBmbk5hbWUpOworICAgICAgICAgIH0pCisgICAgICAgICAgLmZhaWwoZmFpbCgiZm5OYW1lIikpOworICAgICAgfTsKKyAgICB9CisKKyAgICB0ZXN0Q2FzZXMuc2ltcGxlLmZvckVhY2gobWFrZUFzc2VydGVyKGFzc2VydC5lcXVhbCkpOworICAgIHRlc3RDYXNlcy5zaW1wbGVMb29zZS5mb3JFYWNoKG1ha2VBc3NlcnRlcihmdW5jdGlvbihhLCBlLCBtKXsKKyAgICAgIGFzc2VydC5vayhhID09IGUsIG0pOworICAgIH0pKTsKKyAgICB0ZXN0Q2FzZXMuZGVlcC5mb3JFYWNoKG1ha2VBc3NlcnRlcihhc3NlcnQuZGVlcEVxdWFsKSk7CisKKyAgICBRLnJlc29sdmUoY2xpZW50LnRlc3RTdHJ1Y3QodGVzdENhc2VzLm91dCkpCisgICAgICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkgeworICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5KHRlc3RDYXNlcy5vdXQsIHJlc3BvbnNlLCAidGVzdFN0cnVjdCIpOworICAgICAgfSkKKyAgICAgIC5mYWlsKGZhaWwoInRlc3RTdHJ1Y3QiKSk7CisKKyAgICBRLnJlc29sdmUoY2xpZW50LnRlc3ROZXN0KHRlc3RDYXNlcy5vdXQyKSkKKyAgICAgIC50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CisgICAgICAgIGNoZWNrUmVjdXJzaXZlbHkodGVzdENhc2VzLm91dDIsIHJlc3BvbnNlLCAidGVzdE5lc3QiKTsKKyAgICAgIH0pCisgICAgICAuZmFpbChmYWlsKCJ0ZXN0TmVzdCIpKTsKKworICAgIFEucmVzb2x2ZShjbGllbnQudGVzdEluc2FuaXR5KHRlc3RDYXNlcy5jcmF6eSkpCisgICAgICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkgeworICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5KHRlc3RDYXNlcy5pbnNhbml0eSwgcmVzcG9uc2UsICJ0ZXN0SW5zYW5pdHkiKTsKKyAgICAgIH0pCisgICAgICAuZmFpbChmYWlsKCJ0ZXN0SW5zYW5pdHkiKSk7CisKKyAgICBRLnJlc29sdmUoY2xpZW50LnRlc3RFeGNlcHRpb24oIlRFeGNlcHRpb24iKSkKKyAgICAgIC50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CisgICAgICAgIGZhaWwoInRlc3RFeGNlcHRpb246IFRFeGNlcHRpb24iKTsKKyAgICAgIH0pCisgICAgICAuZmFpbChmdW5jdGlvbihlcnIpIHsKKyAgICAgICAgYXNzZXJ0Lm9rKGVyciBpbnN0YW5jZW9mIFRFeGNlcHRpb24pOworICAgICAgfSk7CisKKyAgICBRLnJlc29sdmUoY2xpZW50LnRlc3RFeGNlcHRpb24oIlhjZXB0aW9uIikpCisgICAgICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkgeworICAgICAgICBmYWlsKCJ0ZXN0RXhjZXB0aW9uOiBYY2VwdGlvbiIpOworICAgICAgfSkKKyAgICAgIC5mYWlsKGZ1bmN0aW9uKGVycikgeworICAgICAgICBhc3NlcnQub2soZXJyIGluc3RhbmNlb2YgdHR5cGVzLlhjZXB0aW9uKTsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKGVyci5lcnJvckNvZGUsIDEwMDEpOworICAgICAgICBhc3NlcnQuZXF1YWwoIlhjZXB0aW9uIiwgZXJyLm1lc3NhZ2UpOworICAgICAgfSk7CisKKyAgICBRLnJlc29sdmUoY2xpZW50LnRlc3RFeGNlcHRpb24oIm5vIEV4Y2VwdGlvbiIpKQorICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKHVuZGVmaW5lZCwgcmVzcG9uc2UpOyAvL3ZvaWQKKyAgICAgIH0pCisgICAgICAuZmFpbChmYWlsKCJ0ZXN0RXhjZXB0aW9uIikpOworCisgICAgY2xpZW50LnRlc3RPbmV3YXkoMCwgZmFpbCgidGVzdE9uZXdheTogc2hvdWxkIG5vdCBhbnN3ZXIiKSk7CisKKyAgICBjaGVja09mZkJ5T25lKGZ1bmN0aW9uKGRvbmUpIHsKKyAgICAgIFEucmVzb2x2ZShjbGllbnQudGVzdEkzMigtMSkpCisgICAgICAgIC50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CisgICAgICAgICAgICBhc3NlcnQuZXF1YWwoLTEsIHJlc3BvbnNlKTsKKyAgICAgICAgICAgIGFzc2VydC5lbmQoKTsKKyAgICAgICAgICAgIGRvbmUoKTsKKyAgICAgICAgfSkKKyAgICAgICAgLmZhaWwoZmFpbCgiY2hlY2tPZmZCeU9uZSIpKTsKKyAgICB9LCBjYWxsYmFjayk7CisgIH0pOworfTsKKworCisvLyBIZWxwZXIgRnVuY3Rpb25zCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworZnVuY3Rpb24gbWFrZVJlY3Vyc2l2ZUNoZWNrKGFzc2VydDogdGVzdC5UZXN0KSB7CisKKyAgcmV0dXJuIGZ1bmN0aW9uIChtYXAxOiBhbnksIG1hcDI6IGFueSwgbXNnOiBzdHJpbmcpIHsKKyAgICB2YXIgZXF1YWwgPSB0cnVlOworCisgICAgdmFyIGVxdWFsID0gY2hlY2tSZWN1cnNpdmVseShtYXAxLCBtYXAyKTsKKworICAgIGFzc2VydC5vayhlcXVhbCwgbXNnKTsKKworICAgIC8vIGRlZXBFcXVhbCBkb2Vzbid0IHdvcmsgd2l0aCBmaWVsZHMgdXNpbmcgbm9kZS1pbnQ2NAorICAgIGZ1bmN0aW9uIGNoZWNrUmVjdXJzaXZlbHkobWFwMTogYW55LCBtYXAyOiBhbnkpIDogYm9vbGVhbiB7CisgICAgICBpZiAoISh0eXBlb2YgbWFwMSAhPT0gImZ1bmN0aW9uIiAmJiB0eXBlb2YgbWFwMiAhPT0gImZ1bmN0aW9uIikpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgaWYgKCFtYXAxIHx8IHR5cGVvZiBtYXAxICE9PSAib2JqZWN0IikgeworICAgICAgICAvL0hhbmRsZSBpbnQ2NCB0eXBlcyAod2hpY2ggdXNlIG5vZGUtaW50NjQgaW4gTm9kZS5qcyBKYXZhU2NyaXB0KQorICAgICAgICBpZiAoKHR5cGVvZiBtYXAxID09PSAibnVtYmVyIikgJiYgKHR5cGVvZiBtYXAyID09PSAib2JqZWN0IikgJiYKKyAgICAgICAgICAgIChtYXAyLmJ1ZmZlcikgJiYgKG1hcDIuYnVmZmVyIGluc3RhbmNlb2YgQnVmZmVyKSAmJiAobWFwMi5idWZmZXIubGVuZ3RoID09PSA4KSkgeworICAgICAgICAgIHZhciBuID0gbmV3IEludDY0KG1hcDIuYnVmZmVyKTsKKyAgICAgICAgICByZXR1cm4gbWFwMSA9PT0gbi50b051bWJlcigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJldHVybiBtYXAxID09IG1hcDI7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhtYXAxKS5ldmVyeShmdW5jdGlvbihrZXkpIHsKKyAgICAgICAgICByZXR1cm4gY2hlY2tSZWN1cnNpdmVseShtYXAxW2tleV0sIG1hcDJba2V5XSk7CisgICAgICAgIH0pOworICAgICAgfQorICAgIH0KKyAgfQorfQorCitmdW5jdGlvbiBjaGVja09mZkJ5T25lKGRvbmU6IChjYWxsYmFjazogKCkgPT4gdm9pZCkgPT4gdm9pZCwgY2FsbGJhY2s6IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWQpIHsKKworICB2YXIgcmV0cnlfbGltaXQgPSAzMDsKKyAgdmFyIHJldHJ5X2ludGVydmFsID0gMTAwOworICB2YXIgdGVzdF9jb21wbGV0ZSA9IGZhbHNlOworICB2YXIgcmV0cnlzID0gMDsKKworICAvKioKKyAgICogcmVkbyBhIHNpbXBsZSB0ZXN0IGFmdGVyIHRoZSBvbmV3YXkgdG8gbWFrZSBzdXJlIHdlIGFyZW4ndCAib2ZmIGJ5IG9uZSIgLS0KKyAgICogaWYgdGhlIHNlcnZlciB0cmVhdGVkIG9uZXdheSB2b2lkIGxpa2Ugbm9ybWFsIHZvaWQsIHRoaXMgbmV4dCB0ZXN0IHdpbGwKKyAgICogZmFpbCBzaW5jZSBpdCB3aWxsIGdldCB0aGUgdm9pZCBjb25maXJtYXRpb24gcmF0aGVyIHRoYW4gdGhlIGNvcnJlY3QKKyAgICogcmVzdWx0LiBJbiB0aGlzIGNpcmN1bXN0YW5jZSwgdGhlIGNsaWVudCB3aWxsIHRocm93IHRoZSBleGNlcHRpb246CisgICAqCisgICAqIEJlY2F1c2UgdGhpcyBpcyB0aGUgbGFzdCB0ZXN0IGFnYWluc3QgdGhlIHNlcnZlciwgd2hlbiBpdCBjb21wbGV0ZXMKKyAgICogdGhlIGVudGlyZSBzdWl0ZSBpcyBjb21wbGV0ZSBieSBkZWZpbml0aW9uICh0aGUgdGVzdHMgcnVuIHNlcmlhbGx5KS4KKyAgICovCisgIGRvbmUoZnVuY3Rpb24oKSB7CisgICAgdGVzdF9jb21wbGV0ZSA9IHRydWU7CisgIH0pOworCisgIC8vV2Ugd2FpdCB1cCB0byByZXRyeV9saW1pdCAqIHJldHJ5X2ludGVydmFsIGZvciB0aGUgdGVzdCBzdWl0ZSB0byBjb21wbGV0ZQorICBmdW5jdGlvbiBUZXN0Rm9yQ29tcGxldGlvbigpIHsKKyAgICBpZih0ZXN0X2NvbXBsZXRlICYmIGNhbGxiYWNrKSB7CisgICAgICBjYWxsYmFjaygiU2VydmVyIHN1Y2Nlc3NmdWxseSB0ZXN0ZWQhIik7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICgrK3JldHJ5cyA8IHJldHJ5X2xpbWl0KSB7CisgICAgICAgIHNldFRpbWVvdXQoVGVzdEZvckNvbXBsZXRpb24sIHJldHJ5X2ludGVydmFsKTsKKyAgICAgIH0gZWxzZSBpZiAoY2FsbGJhY2spIHsKKyAgICAgICAgY2FsbGJhY2soIlNlcnZlciB0ZXN0IGZhaWxlZCB0byBjb21wbGV0ZSBhZnRlciAiICsKKyAgICAgICAgICAgICAgICAgKHJldHJ5X2xpbWl0ICogcmV0cnlfaW50ZXJ2YWwgLyAxMDAwKSArICIgc2Vjb25kcyIpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHNldFRpbWVvdXQoVGVzdEZvckNvbXBsZXRpb24sIHJldHJ5X2ludGVydmFsKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9ub2RldHMvdGVzdC90ZXN0X2hhbmRsZXIudHMgYi9saWIvbm9kZXRzL3Rlc3QvdGVzdF9oYW5kbGVyLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiYzg1NWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZXRzL3Rlc3QvdGVzdF9oYW5kbGVyLnRzCkBAIC0wLDAgKzEsMjk5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICdMaWNlbnNlJyk7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICdBUyBJUycgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vVGhpcyBpcyB0aGUgc2VydmVyIHNpZGUgTm9kZSB0ZXN0IGhhbmRsZXIgZm9yIHRoZSBzdGFuZGFyZAorLy8gIEFwYWNoZSBUaHJpZnQgdGVzdCBzZXJ2aWNlLgorCitpbXBvcnQgdHR5cGVzID0gcmVxdWlyZSgiLi9nZW4tbm9kZWpzL1RocmlmdFRlc3RfdHlwZXMiKTsKK2ltcG9ydCB0aHJpZnQgPSByZXF1aXJlKCJ0aHJpZnQiKTsKK2ltcG9ydCBUaHJpZnQgPSB0aHJpZnQuVGhyaWZ0OworaW1wb3J0IFEgPSByZXF1aXJlKCJxIik7CisKKworZXhwb3J0IGNsYXNzIFN5bmNUaHJpZnRUZXN0SGFuZGxlciB7CisgIHRlc3RWb2lkKCk6IFEuSVByb21pc2U8dm9pZD4geworICAgIC8vY29uc29sZS5sb2coJ3Rlc3RWb2lkKCknKTsKKyAgICByZXR1cm4gUS5yZXNvbHZlPHZvaWQ+KHVuZGVmaW5lZCk7CisgIH0KKyAgdGVzdE1hcE1hcChoZWxsbzogbnVtYmVyKSB7CisgICAgLy9jb25zb2xlLmxvZygndGVzdE1hcE1hcCgnICsgaGVsbG8gKyAnKScpOworCisgICAgdmFyIG1hcG1hcDoge1trZXk6IG51bWJlcl06IHtba2V5OiBudW1iZXJdOiBudW1iZXI7IH19ID0gW107CisgICAgdmFyIHBvczoge1trZXk6IG51bWJlcl06IG51bWJlcjsgfSA9IFtdOworICAgIHZhciBuZWc6IHtba2V5OiBudW1iZXJdOiBudW1iZXI7IH0gPSBbXTsKKyAgICBmb3IgKHZhciBpID0gMTsgaSA8IDU7IGkrKykgeworICAgICAgcG9zW2ldID0gaTsKKyAgICAgIG5lZ1staV0gPSAtaTsKKyAgICB9CisgICAgbWFwbWFwWzRdID0gcG9zOworICAgIG1hcG1hcFstNF0gPSBuZWc7CisKKyAgICByZXR1cm4gUS5yZXNvbHZlKG1hcG1hcCk7CisgIH0KKyAgdGVzdEluc2FuaXR5KGFyZ3VtZW50OiB0dHlwZXMuSW5zYW5pdHkpOiBRLklQcm9taXNlPHsgW2s6IG51bWJlcl06IGFueTsgfT4geworICAgIGNvbnN0IGZpcnN0X21hcDogeyBbazogbnVtYmVyXTogYW55OyB9ID0gW107CisgICAgY29uc3Qgc2Vjb25kX21hcDogeyBbazogbnVtYmVyXTogYW55OyB9ID0gW107CisgIAorICAgIGZpcnN0X21hcFt0dHlwZXMuTnVtYmVyei5UV09dID0gYXJndW1lbnQ7CisgICAgZmlyc3RfbWFwW3R0eXBlcy5OdW1iZXJ6LlRIUkVFXSA9IGFyZ3VtZW50OworICAKKyAgICBjb25zdCBsb29uZXkgPSBuZXcgdHR5cGVzLkluc2FuaXR5KCk7CisgICAgc2Vjb25kX21hcFt0dHlwZXMuTnVtYmVyei5TSVhdID0gbG9vbmV5OworICAKKyAgICBjb25zdCBpbnNhbmU6IHsgW2s6IG51bWJlcl06IGFueTsgfSA9IFtdOworICAgIGluc2FuZVsxXSA9IGZpcnN0X21hcDsKKyAgICBpbnNhbmVbMl0gPSBzZWNvbmRfbWFwOworCisgICAgcmV0dXJuIFEucmVzb2x2ZShpbnNhbmUpOworICB9CisgIHRlc3RNdWx0aShhcmcwOiBhbnksIGFyZzE6IG51bWJlciwgYXJnMjogbnVtYmVyLCBhcmczOiB7IFtrOiBudW1iZXJdOiBzdHJpbmc7IH0sIGFyZzQ6IHR0eXBlcy5OdW1iZXJ6LCBhcmc1OiBudW1iZXIpIHsKKyAgICB2YXIgaGVsbG8gPSBuZXcgdHR5cGVzLlh0cnVjdCgpOworICAgIGhlbGxvLnN0cmluZ190aGluZyA9ICdIZWxsbzInOworICAgIGhlbGxvLmJ5dGVfdGhpbmcgPSBhcmcwOworICAgIGhlbGxvLmkzMl90aGluZyA9IGFyZzE7CisgICAgaGVsbG8uaTY0X3RoaW5nID0gYXJnMjsKKyAgICByZXR1cm4gUS5yZXNvbHZlKGhlbGxvKTsKKyAgfQorICB0ZXN0RXhjZXB0aW9uKGFyZzogc3RyaW5nKTogUS5JUHJvbWlzZTx2b2lkPiB7CisgICAgaWYgKGFyZyA9PT0gJ1hjZXB0aW9uJykgeworICAgICAgdmFyIHggPSBuZXcgdHR5cGVzLlhjZXB0aW9uKCk7CisgICAgICB4LmVycm9yQ29kZSA9IDEwMDE7CisgICAgICB4Lm1lc3NhZ2UgPSBhcmc7CisgICAgICB0aHJvdyB4OworICAgIH0gZWxzZSBpZiAoYXJnID09PSAnVEV4Y2VwdGlvbicpIHsKKyAgICAgIHRocm93IG5ldyBUaHJpZnQuVEV4Y2VwdGlvbihhcmcpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gUS5yZXNvbHZlKCk7CisgICAgfQorICB9CisgIHRlc3RNdWx0aUV4Y2VwdGlvbihhcmcwOiBzdHJpbmcsIGFyZzE6IHN0cmluZykgeworICAgIGlmIChhcmcwID09PSAoJ1hjZXB0aW9uJykpIHsKKyAgICAgIHZhciB4ID0gbmV3IHR0eXBlcy5YY2VwdGlvbigpOworICAgICAgeC5lcnJvckNvZGUgPSAxMDAxOworICAgICAgeC5tZXNzYWdlID0gJ1RoaXMgaXMgYW4gWGNlcHRpb24nOworICAgICAgdGhyb3cgeDsKKyAgICB9IGVsc2UgaWYgKGFyZzAgPT09ICgnWGNlcHRpb24yJykpIHsKKyAgICAgIHZhciB4MiA9IG5ldyB0dHlwZXMuWGNlcHRpb24yKCk7CisgICAgICB4Mi5lcnJvckNvZGUgPSAyMDAyOworICAgICAgeDIuc3RydWN0X3RoaW5nID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTsKKyAgICAgIHgyLnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcgPSAnVGhpcyBpcyBhbiBYY2VwdGlvbjInOworICAgICAgdGhyb3cgeDI7CisgICAgfQorCisgICAgdmFyIHJlcyA9IG5ldyB0dHlwZXMuWHRydWN0KCk7CisgICAgcmVzLnN0cmluZ190aGluZyA9IGFyZzE7CisgICAgcmV0dXJuIFEucmVzb2x2ZShyZXMpOworICB9CisgIHRlc3RPbmV3YXkoc2xlZXBGb3I6IG51bWJlcikgeworICB9CisKKyAgdGVzdFN0cmluZyh0aGluZzogc3RyaW5nKSB7CisgICAgcmV0dXJuIFEucmVzb2x2ZSh0aGluZyk7CisgIH0KKyAgdGVzdEJvb2wodGhpbmc6IGJvb2xlYW4pIHsKKyAgICByZXR1cm4gUS5yZXNvbHZlKHRoaW5nKTsKKyAgfQorICB0ZXN0Qnl0ZSh0aGluZzogbnVtYmVyKSB7CisgICAgcmV0dXJuIFEucmVzb2x2ZSh0aGluZyk7CisgIH0KKyAgdGVzdEkzMih0aGluZzogbnVtYmVyKSB7CisgICAgcmV0dXJuIFEucmVzb2x2ZSh0aGluZyk7CisgIH0KKyAgdGVzdEk2NCh0aGluZzogbnVtYmVyKSB7CisgICAgcmV0dXJuIFEucmVzb2x2ZSh0aGluZyk7CisgIH0KKyAgdGVzdERvdWJsZSh0aGluZzogbnVtYmVyKSB7CisgICAgcmV0dXJuIFEucmVzb2x2ZSh0aGluZyk7CisgIH0KKyAgdGVzdEJpbmFyeSh0aGluZzogQnVmZmVyKSB7CisgICAgcmV0dXJuIFEucmVzb2x2ZSh0aGluZyk7CisgIH0KKyAgdGVzdFN0cnVjdCh0aGluZzogdHR5cGVzLlh0cnVjdCkgeworICAgIHJldHVybiBRLnJlc29sdmUodGhpbmcpOworICB9CisgIHRlc3ROZXN0KHRoaW5nOiB0dHlwZXMuWHRydWN0MikgeworICAgIHJldHVybiBRLnJlc29sdmUodGhpbmcpOworICB9CisgIHRlc3RNYXAodGhpbmc6IHsgW2s6IG51bWJlcl06IG51bWJlcjsgfSkgeworICAgIHJldHVybiBRLnJlc29sdmUodGhpbmcpOworICB9CisgIHRlc3RTdHJpbmdNYXAodGhpbmc6IHsgW2s6IHN0cmluZ106IHN0cmluZzsgfSkgeworICAgIHJldHVybiBRLnJlc29sdmUodGhpbmcpOworICB9CisgIHRlc3RTZXQodGhpbmc6IG51bWJlcltdKSB7CisgICAgcmV0dXJuIFEucmVzb2x2ZSh0aGluZyk7CisgIH0KKyAgdGVzdExpc3QodGhpbmc6IG51bWJlcltdKSB7CisgICAgcmV0dXJuIFEucmVzb2x2ZSh0aGluZyk7CisgIH0KKyAgdGVzdEVudW0odGhpbmc6IHR0eXBlcy5OdW1iZXJ6KSB7CisgICAgcmV0dXJuIFEucmVzb2x2ZSh0aGluZyk7CisgIH0KKyAgdGVzdFR5cGVkZWYodGhpbmc6IG51bWJlcikgeworICAgIHJldHVybiBRLnJlc29sdmUodGhpbmcpOworICB9Cit9CisKK2V4cG9ydCBjbGFzcyBBc3luY1RocmlmdFRlc3RIYW5kbGVyIHsKKyAgcHJpdmF0ZSBzeW5jSGFuZGxlcjogU3luY1RocmlmdFRlc3RIYW5kbGVyOworICBjb25zdHJ1Y3RvcigpIHsKKyAgICB0aGlzLnN5bmNIYW5kbGVyID0gbmV3IFN5bmNUaHJpZnRUZXN0SGFuZGxlcigpOworICB9CisKKyAgdGVzdFZvaWQoY2FsbGJhY2s6IChyZXN1bHQ6IHZvaWQpID0+IHZvaWQpOiBRLklQcm9taXNlPHZvaWQ+IHsKKyAgICBjYWxsYmFjayh1bmRlZmluZWQpOworICAgIHJldHVybiBRLnJlc29sdmUoKTsKKyAgfQorICB0ZXN0TWFwTWFwKGhlbGxvOiBudW1iZXIsCisgICAgY2FsbGJhY2s6IChlcnI6IGFueSwgcmVzdWx0OiB7IFtrOiBudW1iZXJdOiB7IFtrOiBudW1iZXJdOiBudW1iZXI7IH07IH0pID0+IHZvaWQpOgorICAgICBRLklQcm9taXNlPHsgW2s6IG51bWJlcl06IHsgW2s6IG51bWJlcl06IG51bWJlcjsgfTsgfT4geworCisgICAgdmFyIG1hcG1hcDoge1trZXk6IG51bWJlcl06IHtba2V5OiBudW1iZXJdOiBudW1iZXI7IH19ID0gW107CisgICAgdmFyIHBvczoge1trZXk6IG51bWJlcl06IG51bWJlcjsgfSA9IFtdOworICAgIHZhciBuZWc6IHtba2V5OiBudW1iZXJdOiBudW1iZXI7IH0gPSBbXTsKKyAgICBmb3IgKHZhciBpID0gMTsgaSA8IDU7IGkrKykgeworICAgICAgcG9zW2ldID0gaTsKKyAgICAgIG5lZ1staV0gPSAtaTsKKyAgICB9CisgICAgbWFwbWFwWzRdID0gcG9zOworICAgIG1hcG1hcFstNF0gPSBuZWc7CisKKyAgICBjYWxsYmFjayhudWxsLCBtYXBtYXApOworICAgIHJldHVybiBRLnJlc29sdmUoKTsKKyAgfQorICB0ZXN0SW5zYW5pdHkoYXJndW1lbnQ6IHR0eXBlcy5JbnNhbml0eSwgY2FsbGJhY2s/OiAoZXJyOiBhbnksIHJlc3VsdDogeyBbazogbnVtYmVyXTogYW55OyB9KSA9PiB2b2lkKTogUS5JUHJvbWlzZTx7IFtrOiBudW1iZXJdOiBhbnk7IH0+IHsKKyAgICBjb25zdCBmaXJzdF9tYXA6IHsgW2s6IG51bWJlcl06IGFueTsgfSA9IFtdOworICAgIGNvbnN0IHNlY29uZF9tYXA6IHsgW2s6IG51bWJlcl06IGFueTsgfSA9IFtdOworICAKKyAgICBmaXJzdF9tYXBbdHR5cGVzLk51bWJlcnouVFdPXSA9IGFyZ3VtZW50OworICAgIGZpcnN0X21hcFt0dHlwZXMuTnVtYmVyei5USFJFRV0gPSBhcmd1bWVudDsKKyAgCisgICAgY29uc3QgbG9vbmV5ID0gbmV3IHR0eXBlcy5JbnNhbml0eSgpOworICAgIHNlY29uZF9tYXBbdHR5cGVzLk51bWJlcnouU0lYXSA9IGxvb25leTsKKyAgCisgICAgY29uc3QgaW5zYW5lOiB7IFtrOiBudW1iZXJdOiBhbnk7IH0gPSBbXTsKKyAgICBpbnNhbmVbMV0gPSBmaXJzdF9tYXA7CisgICAgaW5zYW5lWzJdID0gc2Vjb25kX21hcDsKKworICAgIGlmIChjYWxsYmFjayAhPT0gdW5kZWZpbmVkKXsKKyAgICAgIGNhbGxiYWNrKG51bGwsIGluc2FuZSk7CisgICAgfQorICAgIHJldHVybiBRLnJlc29sdmUoKTsKKyAgfQorICB0ZXN0TXVsdGkoYXJnMDogYW55LCBhcmcxOiBudW1iZXIsIGFyZzI6IG51bWJlciwgYXJnMzogeyBbazogbnVtYmVyXTogc3RyaW5nOyB9LCBhcmc0OiB0dHlwZXMuTnVtYmVyeiwgYXJnNTogbnVtYmVyLCByZXN1bHQ6IEZ1bmN0aW9uKTogUS5JUHJvbWlzZTx0dHlwZXMuWHRydWN0PiB7CisgICAgdmFyIGhlbGxvID0gdGhpcy5zeW5jSGFuZGxlci50ZXN0TXVsdGkoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSk7CisgICAgaGVsbG8udGhlbihoZWxsbyA9PiByZXN1bHQobnVsbCwgaGVsbG8pKTsKKyAgICByZXR1cm4gUS5yZXNvbHZlKCk7CisgIH0KKyAgdGVzdEV4Y2VwdGlvbihhcmc6IHN0cmluZywgcmVzdWx0OiAoZXJyOiBhbnkpID0+IHZvaWQpOiBRLklQcm9taXNlPHZvaWQ+IHsKKyAgICBpZiAoYXJnID09PSAnWGNlcHRpb24nKSB7CisgICAgICB2YXIgeCA9IG5ldyB0dHlwZXMuWGNlcHRpb24oKTsKKyAgICAgIHguZXJyb3JDb2RlID0gMTAwMTsKKyAgICAgIHgubWVzc2FnZSA9IGFyZzsKKyAgICAgIHJlc3VsdCh4KTsKKyAgICB9IGVsc2UgaWYgKGFyZyA9PT0gJ1RFeGNlcHRpb24nKSB7CisgICAgICByZXN1bHQobmV3IFRocmlmdC5URXhjZXB0aW9uKGFyZykpOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQobnVsbCk7CisgICAgfQorICAgIHJldHVybiBRLnJlc29sdmUoKTsKKyAgfQorICB0ZXN0TXVsdGlFeGNlcHRpb24oYXJnMDogc3RyaW5nLCBhcmcxOiBzdHJpbmcsIHJlc3VsdDogKGVycjogYW55LCByZXM/OiB0dHlwZXMuWHRydWN0KSA9PiB2b2lkKTogUS5JUHJvbWlzZTx0dHlwZXMuWHRydWN0PiB7CisgICAgaWYgKGFyZzAgPT09ICgnWGNlcHRpb24nKSkgeworICAgICAgdmFyIHggPSBuZXcgdHR5cGVzLlhjZXB0aW9uKCk7CisgICAgICB4LmVycm9yQ29kZSA9IDEwMDE7CisgICAgICB4Lm1lc3NhZ2UgPSAnVGhpcyBpcyBhbiBYY2VwdGlvbic7CisgICAgICByZXN1bHQoeCk7CisgICAgfSBlbHNlIGlmIChhcmcwID09PSAoJ1hjZXB0aW9uMicpKSB7CisgICAgICB2YXIgeDIgPSBuZXcgdHR5cGVzLlhjZXB0aW9uMigpOworICAgICAgeDIuZXJyb3JDb2RlID0gMjAwMjsKKyAgICAgIHgyLnN0cnVjdF90aGluZyA9IG5ldyB0dHlwZXMuWHRydWN0KCk7CisgICAgICB4Mi5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nID0gJ1RoaXMgaXMgYW4gWGNlcHRpb24yJzsKKyAgICAgIHJlc3VsdCh4Mik7CisgICAgfSBlbHNlIHsKKyAgICAgIHZhciByZXMgPSBuZXcgdHR5cGVzLlh0cnVjdCgpOworICAgICAgcmVzLnN0cmluZ190aGluZyA9IGFyZzE7CisgICAgICByZXN1bHQobnVsbCwgcmVzKTsKKyAgICB9CisgICAgcmV0dXJuIFEucmVzb2x2ZSgpOworICB9CisgIHRlc3RPbmV3YXkoc2xlZXBGb3I6IG51bWJlciwgcmVzdWx0OiBGdW5jdGlvbikgeworICAgIHRoaXMuc3luY0hhbmRsZXIudGVzdE9uZXdheShzbGVlcEZvcik7CisgIH0KKyAgdGVzdFN0cmluZyh0aGluZzogc3RyaW5nLCBjYWxsYmFjazogKGVycjogYW55LCByZXN1bHQ6IHN0cmluZykgPT4gdm9pZCk6IFEuSVByb21pc2U8c3RyaW5nPiB7CisgICAgY2FsbGJhY2sobnVsbCwgdGhpbmcpOworICAgIHJldHVybiBRLnJlc29sdmUoKTsKKyAgfQorICB0ZXN0Qnl0ZSh0aGluZzogbnVtYmVyLCBjYWxsYmFjazogKGVycjogYW55LCByZXN1bHQ6IG51bWJlcikgPT4gdm9pZCk6IFEuSVByb21pc2U8bnVtYmVyPiB7CisgICAgY2FsbGJhY2sobnVsbCwgdGhpbmcpOworICAgIHJldHVybiBRLnJlc29sdmUoKTsKKyAgfQorICB0ZXN0Qm9vbCh0aGluZzogYm9vbGVhbiwgY2FsbGJhY2s6IChlcnI6IGFueSwgcmVzdWx0OiBib29sZWFuKSA9PiB2b2lkICk6IFEuSVByb21pc2U8Ym9vbGVhbj4geworICAgIGNhbGxiYWNrKG51bGwsIHRoaW5nKTsKKyAgICByZXR1cm4gUS5yZXNvbHZlKCk7CisgIH0KKyAgdGVzdEkzMih0aGluZzogbnVtYmVyLCBjYWxsYmFjazogKGVycjogYW55LCByZXN1bHQ6IG51bWJlcikgPT4gdm9pZCk6IFEuSVByb21pc2U8bnVtYmVyPiAgeworICAgIGNhbGxiYWNrKG51bGwsIHRoaW5nKTsKKyAgICByZXR1cm4gUS5yZXNvbHZlKCk7CisgIH0KKyAgdGVzdEk2NCh0aGluZzogbnVtYmVyLCBjYWxsYmFjazogKGVycjogYW55LCByZXN1bHQ6IG51bWJlcikgPT4gdm9pZCk6IFEuSVByb21pc2U8bnVtYmVyPiAgeworICAgIGNhbGxiYWNrKG51bGwsIHRoaW5nKTsKKyAgICByZXR1cm4gUS5yZXNvbHZlKCk7CisgIH0KKyAgdGVzdERvdWJsZSh0aGluZzogbnVtYmVyLCBjYWxsYmFjazogKGVycjogYW55LCByZXN1bHQ6IG51bWJlcikgPT4gdm9pZCk6IFEuSVByb21pc2U8bnVtYmVyPiAgeworICAgIGNhbGxiYWNrKG51bGwsIHRoaW5nKTsKKyAgICByZXR1cm4gUS5yZXNvbHZlKCk7CisgIH0KKyAgdGVzdEJpbmFyeSh0aGluZzogQnVmZmVyLCBjYWxsYmFjazogKGVycjogYW55LCByZXN1bHQ6IEJ1ZmZlcikgPT4gdm9pZCk6IFEuSVByb21pc2U8QnVmZmVyPiB7CisgICAgY2FsbGJhY2sobnVsbCwgdGhpbmcpOworICAgIHJldHVybiBRLnJlc29sdmUoKTsKKyAgfQorICB0ZXN0U3RydWN0KHRoaW5nOiB0dHlwZXMuWHRydWN0LCBjYWxsYmFjazogKGVycjogYW55LCByZXN1bHQ6IHR0eXBlcy5YdHJ1Y3QpID0+IHZvaWQpOiBRLklQcm9taXNlPHR0eXBlcy5YdHJ1Y3Q+IHsKKyAgICBjYWxsYmFjayhudWxsLCB0aGluZyk7CisgICAgcmV0dXJuIFEucmVzb2x2ZSgpOworICB9CisgIHRlc3ROZXN0KHRoaW5nOiB0dHlwZXMuWHRydWN0MiwgY2FsbGJhY2s6IChlcnI6IGFueSwgcmVzdWx0OiB0dHlwZXMuWHRydWN0MikgPT4gdm9pZCk6IFEuSVByb21pc2U8dHR5cGVzLlh0cnVjdDI+IHsKKyAgICBjYWxsYmFjayhudWxsLCB0aGluZyk7CisgICAgcmV0dXJuIFEucmVzb2x2ZSgpOworICB9CisgIHRlc3RNYXAodGhpbmc6IHsgW2s6IG51bWJlcl06IG51bWJlcjsgfSwgY2FsbGJhY2s6IChlcnI6IGFueSwgcmVzdWx0OiB7IFtrOiBudW1iZXJdOiBudW1iZXI7IH0pID0+IHZvaWQpOiBRLklQcm9taXNlPHsgW2s6IG51bWJlcl06IG51bWJlcjsgfT4geworICAgIGNhbGxiYWNrKG51bGwsIHRoaW5nKTsKKyAgICByZXR1cm4gUS5yZXNvbHZlKCk7CisgIH0KKyAgdGVzdFN0cmluZ01hcCh0aGluZzogeyBbazogc3RyaW5nXTogc3RyaW5nOyB9LCBjYWxsYmFjazogKGVycjogYW55LCByZXN1bHQ6IHsgW2s6IHN0cmluZ106IHN0cmluZzsgfSkgPT4gdm9pZCk6IFEuSVByb21pc2U8eyBbazogc3RyaW5nXTogc3RyaW5nOyB9PiB7CisgICAgY2FsbGJhY2sobnVsbCwgdGhpbmcpOworICAgIHJldHVybiBRLnJlc29sdmUoKTsKKyAgfQorICB0ZXN0U2V0KHRoaW5nOiBudW1iZXJbXSwgY2FsbGJhY2s6IChlcnI6IGFueSwgcmVzdWx0OiBudW1iZXJbXSkgPT4gdm9pZCk6IFEuSVByb21pc2U8bnVtYmVyW10+IHsKKyAgICBjYWxsYmFjayhudWxsLCB0aGluZyk7CisgICAgcmV0dXJuIFEucmVzb2x2ZSgpOworICB9CisgIHRlc3RMaXN0KHRoaW5nOiBudW1iZXJbXSwgY2FsbGJhY2s6IChlcnI6IGFueSwgcmVzdWx0OiBudW1iZXJbXSkgPT4gdm9pZCk6IFEuSVByb21pc2U8bnVtYmVyW10+IHsKKyAgICBjYWxsYmFjayhudWxsLCB0aGluZyk7CisgICAgcmV0dXJuIFEucmVzb2x2ZSgpOworICB9CisgIHRlc3RFbnVtKHRoaW5nOiB0dHlwZXMuTnVtYmVyeiwgY2FsbGJhY2s6IChlcnI6IGFueSwgcmVzdWx0OiB0dHlwZXMuTnVtYmVyeikgPT4gdm9pZCk6IFEuSVByb21pc2U8dHR5cGVzLk51bWJlcno+IHsKKyAgICBjYWxsYmFjayhudWxsLCB0aGluZyk7CisgICAgcmV0dXJuIFEucmVzb2x2ZSgpOworICB9CisgIHRlc3RUeXBlZGVmKHRoaW5nOiBudW1iZXIsIGNhbGxiYWNrOiAoZXJyOiBhbnksIHJlc3VsdDogbnVtYmVyKSA9PiB2b2lkKTogUS5JUHJvbWlzZTxudW1iZXI+IHsKKyAgICBjYWxsYmFjayhudWxsLCB0aGluZyk7CisgICAgcmV0dXJuIFEucmVzb2x2ZSgpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvbm9kZXRzL3Rlc3QvdHNjb25maWcuanNvbiBiL2xpYi9ub2RldHMvdGVzdC90c2NvbmZpZy5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyOWQwNmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZXRzL3Rlc3QvdHNjb25maWcuanNvbgpAQCAtMCwwICsxLDIyIEBACit7CisgICAgImNvbXBpbGVyT3B0aW9ucyI6IHsKKyAgICAgICAgImFsbG93SnMiOiBmYWxzZSwKKyAgICAgICAgImFsd2F5c1N0cmljdCI6IHRydWUsCisgICAgICAgICJiYXNlVXJsIjogIi4iLAorICAgICAgICAiZGVjbGFyYXRpb24iOiB0cnVlLAorICAgICAgICAiZW1pdERlY29yYXRvck1ldGFkYXRhIjogdHJ1ZSwKKyAgICAgICAgImV4cGVyaW1lbnRhbERlY29yYXRvcnMiOiB0cnVlLAorICAgICAgICAibW9kdWxlIjogImNvbW1vbmpzIiwKKyAgICAgICAgIm1vZHVsZVJlc29sdXRpb24iOiAibm9kZSIsCisgICAgICAgICJub0ltcGxpY2l0VGhpcyI6IHRydWUsCisgICAgICAgICJub1VudXNlZExvY2FscyI6IHRydWUsCisgICAgICAgICJwcmVzZXJ2ZUNvbnN0RW51bXMiOiB0cnVlLAorICAgICAgICAicmVtb3ZlQ29tbWVudHMiOiB0cnVlLAorICAgICAgICAic3RyaWN0RnVuY3Rpb25UeXBlcyI6IHRydWUsCisgICAgICAgICJzdHJpY3ROdWxsQ2hlY2tzIjogdHJ1ZSwKKyAgICAgICAgInRhcmdldCI6ICJlczYiLAorICAgICAgICAicGF0aHMiOiB7CisgICAgICAgICAgICAidGhyaWZ0IjogWyIuLi8uLi9ub2RlanMvbGliL3RocmlmdCJdCisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvb2NhbWwvLmdpdGlnbm9yZSBiL2xpYi9vY2FtbC8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkOWE2YWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb2NhbWwvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDExIEBACitfYnVpbGQvCitfdGFncworY29uZmlndXJlCitzZXR1cC5kYXRhCitzZXR1cC5tbAorbXlvY2FtbGJ1aWxkLm1sCisqL01FVEEKKyovKi5tbGxpYgorKi8qLm1sZHlsaWIKK01ha2VmaWxlCitPQ2FtbE1ha2VmaWxlCmRpZmYgLS1naXQgYS9saWIvb2NhbWwvREVWRUxPUE1FTlQgYi9saWIvb2NhbWwvREVWRUxPUE1FTlQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q1YTAzYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vY2FtbC9ERVZFTE9QTUVOVApAQCAtMCwwICsxLDc2IEBACitUaHJpZnQgT0NhbWwgRGV2ZWxvcG1lbnQKKz09PT09PT09PT09PT09PT09PT09PT09PQorCitQcmVyZXF1aXNpdGVzCistLS0tLS0tLS0tLS0tCisKK0luIG9yZGVyIHRvIGJ1aWxkIHRoaXMgbGlicmFyeSwgeW91IG11c3QgaGF2ZSB0aGUgZm9sbG93aW5nIGluc3RhbGxlZDoKKworICAqIFRoZSBPQ2FtbCBjb21waWxlciwgcHJlZmVyYWJseSA+NC4wMAorICAqIFRoZSBPYXNpcyBidWlsZCB0b29sCisKK0luIGFkZGl0aW9uIHlvdSBtYXkgd2FudCB0byBpbnN0YWxsIE9QQU0sIHdoaWNoIHdpbGwgYWxsb3cgeW91IHRvIHNldHVwIGFuCitPQ2FtbCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCB0aGF0J3MgaXNvbGF0ZWQgZnJvbSB5b3VyIHN5c3RlbSBpbnN0YWxsYXRpb24sCittdWNoIGxpa2UgdmlydXRhbGVudiBmb3IgUHl0aG9uIG9yIHRoZSBteXJpYWQgc3lzdGVtcyBhdmFpbGFibGUgZm9yIFJ1YnkuIElmCit5b3UgaGF2ZSBPUEFNIGluc3RhbGxlZCwgdGhlbiBpbnN0YWxsaW5nIE9hc2lzIGlzIGFzIHNpbXBsZSBhcyBydW5uaW5nOgorCisgICQgb3BhbSBpbnN0YWxsIG9hc2lzCisKK0J1aWxkaW5nCistLS0tLS0tLQorCitPbmNlIGFsbCB0aGUgcHJlcmVxdWlzaXRlcyBoYXZlIGJlZW4gaW5zdGFsbGVkLCBydW4gdGhlIGZvbGxvd2luZyBjb21tYW5kczoKKworICAkIG9hc2lzIHNldHVwCisgICQgLi9jb25maWd1cmUKKyAgJCBtYWtlCisKK1RoZSBgb2FzaXMgc2V0dXBgIGNvbW1hbmQgd2lsbCBnZW5lcmF0ZSB0aGUgY29uZmlndXJlIHNjcmlwdCBhbmQgTWFrZWZpbGUsCithbG9uZyB3aXRoIG90aGVyIGZpbGVzIHRoYXQgb3BhbSB3aWxsIHVzZSB0byBjcmVhdGUgYW4gaW5zdGFsbGFibGUgbGlicmFyeS4KK1RoZSBjb2ZpZ3VyZSBzY3JpcHQgd2lsbCBlbnN1cmUgdGhhdCBhbGwgYnVpbGQgZGVwZW5kZW5jaWVzIGFyZSBpbnN0YWxsZWQsIGFuZAorbWFrZSB3aWxsIGFjdHVhbGx5IGJ1aWxkIHRoZSBsaWJyYXJ5LgorCitUbyByZW1vdmUgZmlsZXMgdGhhdCB0aGUgY29tcGlsZXIgZ2VuZWF0ZXMsIHJ1bjoKKworICAkIG1ha2UgY2xlYW4KKworVG8gcmVtb3ZlIHRob3NlIGZpbGVzIF9hcyB3ZWxsIGFzXyBmaWxlcyB0aGF0IHRoZSBzZXR1cCBhbmQgY29uZmlndXJlIHByb2Nlc3MKK2dlbmVyYXRlcywgcnVuOgorCisgICQgcm0gYGNhdCAuZ2l0aWdub3JlYAorCitJbnN0YWxsaW5nCistLS0tLS0tLS0tCisKK0lmIHlvdSdyZSB1c2luZyBvcGFtLCBzaW1wbHkgcnVuIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKKworICAkIG1ha2UgaW5zdGFsbAorCitXaGlsZSBkZXZlbG9wbWVudCwgeW91IG1heSB3YW50IHRvIGluc3RhbGwgeW91ciBsYXRlc3QgYnVpbGQgb24gdGhlIHN5c3RlbSB0bwordGVzdCBhZ2FpbnN0IG90aGVyIGxpYnJhcmllcyBvciBwcm9ncmFtcy4gVG8gZG8gdGhpcywgdXNlOgorCisgICQgbWFrZSByZWluc3RhbGwKKworRGlzdHJpYnV0aW9uCistLS0tLS0tLS0tLS0KKworVGhlIGRlIGZhY3RvIHByZWZlcnJlZCBtZXRob2QgZm9yIGRpc3RyaWJ1dGluZyBPQ2FtbCBsaWJyYXJpZXMgaXMgdGhyb3VnaCB0aGUKK09QQU0gcGFja2FnZSByZXBvc2l0b3J5LiBUbyBwdWJsaXNoIHRoZSBsYXRlc3QgcGFja2FnZSwgaXNzdWUgYSBwdWxsIHJlcXVlc3QKK2FnYWluc3QgdGhlIGZvbGxvd2luZyBnaXRodWIgcmVwb3NpdG9yeToKKworICBodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb3BhbS1yZXBvc2l0b3J5CisKK1RoZSBwdWxsIHJlcXVlc3Rpb24gc2hvdWxkIGFkZCB0aGUgZm9sbG93aW5nIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgYW5kIGZpbGVzOgorCisgIHBhY2thZ2UKKyAgICB8X190aHJpZnQKKyAgICAgICB8X190aHJpZnQuPFZFUlNJT04+CisgICAgICAgICAgfF9fIGRlc2NyCisgICAgICAgICAgfF9fIG9wYW0KKyAgICAgICAgICB8X18gdXJsCisKK1RlbXBsYXRlcyBmb3IgdGhlIGZvbGxvd2luZyBmaWxlcyBjYW4gYmUgZm91bmQgaW4gdGhlIG9wYW0vIHN1YmRpcmVjdG9yeSBvZgordGhpcyBsaWJyYXJ5J3Mgcm9vdCwgd2l0aCBYWFgoLi4uKSBpbmRpY2F0aW5nIGZpZWxkcyB0aGF0IG5lZWQgdG8gYmUgZmlsbGVkCitvdXQuIFlvdSBjYW4gZmluZCBmdXJ0aGVyIGRvY3VtZW50YXRpb24gaGVyZToKKworICBodHRwOi8vb3BhbS5vY2FtbC5vcmcvZG9jL1BhY2thZ2luZy5odG1sCmRpZmYgLS1naXQgYS9saWIvb2NhbWwvTWFrZWZpbGUgYi9saWIvb2NhbWwvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhYmVlZTcuLjAwMDAwMDAKLS0tIGEvbGliL29jYW1sL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLWFsbDoKLQljZCBzcmM7IG1ha2U7IGNkIC4uCi1jbGVhbjoKLQljZCBzcmM7IG1ha2UgY2xlYW47IGNkIC4uCmRpZmYgLS1naXQgYS9saWIvb2NhbWwvT0NhbWxNYWtlZmlsZSBiL2xpYi9vY2FtbC9PQ2FtbE1ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGI5MjUyLi4wMDAwMDAwCi0tLSBhL2xpYi9vY2FtbC9PQ2FtbE1ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMTIzMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ2FtbE1ha2VmaWxlCi0jICAgICAgICAgICAgICAgICAgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDcgIE1hcmt1cyBNb3R0bAotIwotIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIHVwZGF0ZXMgc2VlOgotIyAgICAgICAgICAgICAgICBodHRwOi8vd3d3Lm9jYW1sLmluZm8vaG9tZS9vY2FtbF9zb3VyY2VzLmh0bWwKLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIE1vZGlmaWVkIGJ5IGRhbWllbiBmb3IgLmdsYWRlLm1sIGNvbXBpbGF0aW9uCi0KLSMgU2V0IHRoZXNlIHZhcmlhYmxlcyB0byB0aGUgbmFtZXMgb2YgdGhlIHNvdXJjZXMgdG8gYmUgcHJvY2Vzc2VkIGFuZAotIyB0aGUgcmVzdWx0IHZhcmlhYmxlLiBPcmRlciBtYXR0ZXJzIGR1cmluZyBsaW5rYWdlIQotCi1pZm5kZWYgU09VUkNFUwotICBTT1VSQ0VTIDo9IGZvby5tbAotZW5kaWYKLWV4cG9ydCBTT1VSQ0VTCi0KLWlmbmRlZiBSRVNfQ0xJQl9TVUYKLSAgUkVTX0NMSUJfU1VGIDo9IF9zdHVicwotZW5kaWYKLWV4cG9ydCBSRVNfQ0xJQl9TVUYKLQotaWZuZGVmIFJFU1VMVAotICBSRVNVTFQgOj0gZm9vCi1lbmRpZgotZXhwb3J0IFJFU1VMVCA6PSAkKHN0cmlwICQoUkVTVUxUKSkKLQotZXhwb3J0IExJQl9QQUNLX05BTUUKLQotaWZuZGVmIERPQ19GSUxFUwotICBET0NfRklMRVMgOj0gJChmaWx0ZXIgJS5tbGksICQoU09VUkNFUykpCi1lbmRpZgotZXhwb3J0IERPQ19GSUxFUwotRklSU1RfRE9DX0ZJTEUgOj0gJChmaXJzdHdvcmQgJChET0NfRklMRVMpKQotCi1leHBvcnQgQkNTVUZGSVgKLWV4cG9ydCBOQ1NVRkZJWAotCi1pZm5kZWYgVE9QU1VGRklYCi0gIFRPUFNVRkZJWCA6PSAudG9wCi1lbmRpZgotZXhwb3J0IFRPUFNVRkZJWAotCi0jIEV2ZW50dWFsbHkgc2V0IGluY2x1ZGUtIGFuZCBsaWJyYXJ5LXBhdGhzLCBsaWJyYXJpZXMgdG8gbGluaywKLSMgYWRkaXRpb25hbCBjb21waWxhdGlvbi0sIGxpbmstIGFuZCBvY2FtbHlhY2MtZmxhZ3MKLSMgUGF0aC0gYW5kIGxpYnJhcnkgaW5mb3JtYXRpb24gbmVlZHMgbm90IGJlIHdyaXR0ZW4gd2l0aCAiLUkiIGFuZCBzdWNoLi4uCi0jIERlZmluZSBUSFJFQURTIGlmIHlvdSBuZWVkIGl0LCBvdGhlcndpc2UgbGVhdmUgaXQgdW5zZXQgKHNhbWUgZm9yCi0jIFVTRV9DQU1MUDQpIQotCi1leHBvcnQgVEhSRUFEUwotZXhwb3J0IFZNVEhSRUFEUwotZXhwb3J0IEFOTk9UQVRFCi1leHBvcnQgVVNFX0NBTUxQNAotCi1leHBvcnQgSU5DRElSUwotZXhwb3J0IExJQkRJUlMKLWV4cG9ydCBFWFRMSUJESVJTCi1leHBvcnQgUkVTVUxUREVQUwotZXhwb3J0IE9DQU1MX0RFRkFVTFRfRElSUwotCi1leHBvcnQgTElCUwotZXhwb3J0IENMSUJTCi1leHBvcnQgQ0ZSQU1FV09SS1MKLQotZXhwb3J0IE9DQU1MRkxBR1MKLWV4cG9ydCBPQ0FNTE5DRkxBR1MKLWV4cG9ydCBPQ0FNTEJDRkxBR1MKLQotZXhwb3J0IE9DQU1MTERGTEFHUwotZXhwb3J0IE9DQU1MTkxERkxBR1MKLWV4cG9ydCBPQ0FNTEJMREZMQUdTCi0KLWV4cG9ydCBPQ0FNTE1LTElCX0ZMQUdTCi0KLWlmbmRlZiBPQ0FNTENQRkxBR1MKLSAgT0NBTUxDUEZMQUdTIDo9IGEKLWVuZGlmCi1leHBvcnQgT0NBTUxDUEZMQUdTCi0KLWlmbmRlZiBET0NfRElSCi0gIERPQ19ESVIgOj0gZG9jCi1lbmRpZgotZXhwb3J0IERPQ19ESVIKLQotZXhwb3J0IFBQRkxBR1MKLQotZXhwb3J0IExGTEFHUwotZXhwb3J0IFlGTEFHUwotZXhwb3J0IElETEZMQUdTCi0KLWV4cG9ydCBPQ0FNTERPQ0ZMQUdTCi0KLWV4cG9ydCBPQ0FNTEZJTkRfSU5TVEZMQUdTCi0KLWV4cG9ydCBEVklQU0ZMQUdTCi0KLWV4cG9ydCBTVEFUSUMKLQotIyBBZGQgYSBsaXN0IG9mIG9wdGlvbmFsIHRyYXNoIGZpbGVzIHRoYXQgc2hvdWxkIGJlIGRlbGV0ZWQgYnkgIm1ha2UgY2xlYW4iCi1leHBvcnQgVFJBU0gKLQotRUNITyA6PSBlY2hvCi0KLWlmZGVmIFJFQUxMWV9RVUlFVAotICBleHBvcnQgUkVBTExZX1FVSUVUCi0gIEVDSE8gOj0gdHJ1ZQotICBMRkxBR1MgOj0gJChMRkxBR1MpIC1xCi0gIFlGTEFHUyA6PSAkKFlGTEFHUykgLXEKLWVuZGlmCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjICB2YXJpYWJsZXMgZGVwZW5kaW5nIG9uIHlvdXIgT0NhbWwtaW5zdGFsbGF0aW9uCi0KLWlmZGVmIE1JTkdXCi0gIGV4cG9ydCBNSU5HVwotICBXSU4zMiAgIDo9IDEKLSAgQ0ZMQUdTX1dJTjMyIDo9IC1tbm8tY3lnd2luCi1lbmRpZgotaWZkZWYgTVNWQwotICBleHBvcnQgTVNWQwotICBXSU4zMiAgIDo9IDEKLSAgaWZuZGVmIFNUQVRJQwotICAgIENQUEZMQUdTX1dJTjMyIDo9IC1EQ0FNTF9ETEwKLSAgZW5kaWYKLSAgQ0ZMQUdTX1dJTjMyICs9IC1ub2xvZ28KLSAgRVhUX09CSiA6PSBvYmoKLSAgRVhUX0xJQiA6PSBsaWIKLSAgaWZlcSAoJChDQyksZ2NjKQotICAgICMgd29yayBhcm91bmQgR05VIE1ha2UgZGVmYXVsdCB2YWx1ZQotICAgIGlmZGVmIFRIUkVBRFMKLSAgICAgIENDIDo9IGNsIC1NVAotICAgIGVsc2UKLSAgICAgIENDIDo9IGNsCi0gICAgZW5kaWYKLSAgZW5kaWYKLSAgaWZlcSAoJChDWFgpLGcrKykKLSAgICAjIHdvcmsgYXJvdW5kIEdOVSBNYWtlIGRlZmF1bHQgdmFsdWUKLSAgICBDWFggOj0gJChDQykKLSAgZW5kaWYKLSAgQ0ZMQUdfTyA6PSAtRm8KLWVuZGlmCi1pZmRlZiBXSU4zMgotICBFWFRfQ1hYIDo9IGNwcAotICBFWEUgICAgIDo9IC5leGUKLWVuZGlmCi0KLWlmbmRlZiBFWFRfT0JKCi0gIEVYVF9PQkogOj0gbwotZW5kaWYKLWlmbmRlZiBFWFRfTElCCi0gIEVYVF9MSUIgOj0gYQotZW5kaWYKLWlmbmRlZiBFWFRfQ1hYCi0gIEVYVF9DWFggOj0gY2MKLWVuZGlmCi1pZm5kZWYgRVhFCi0gIEVYRSA6PSAjIGVtcHR5Ci1lbmRpZgotaWZuZGVmIENGTEFHX08KLSAgQ0ZMQUdfTyA6PSAtbyAjIGRvIG5vdCBkZWxldGUgdGhpcyBjb21tZW50IChwcmVzZXJ2ZXMgdHJhaWxpbmcgd2hpdGVzcGFjZSkhCi1lbmRpZgotCi1leHBvcnQgQ0MKLWV4cG9ydCBDWFgKLWV4cG9ydCBDRkxBR1MKLWV4cG9ydCBDWFhGTEFHUwotZXhwb3J0IExERkxBR1MKLWV4cG9ydCBDUFBGTEFHUwotCi1pZm5kZWYgUlBBVEhfRkxBRwotICBpZmRlZiBFTEZfUlBBVEhfRkxBRwotICAgIFJQQVRIX0ZMQUcgOj0gJChFTEZfUlBBVEhfRkxBRykKLSAgZWxzZQotICAgIFJQQVRIX0ZMQUcgOj0gLVIKLSAgZW5kaWYKLWVuZGlmCi1leHBvcnQgUlBBVEhfRkxBRwotCi1pZm5kZWYgTVNWQwotaWZuZGVmIFBJQ19DRkxBR1MKLSAgUElDX0NGTEFHUyA6PSAtZlBJQwotZW5kaWYKLWlmbmRlZiBQSUNfQ1BQRkxBR1MKLSAgUElDX0NQUEZMQUdTIDo9IC1EUElDCi1lbmRpZgotZW5kaWYKLQotZXhwb3J0IFBJQ19DRkxBR1MKLWV4cG9ydCBQSUNfQ1BQRkxBR1MKLQotQkNSRVNVTFQgIDo9ICQoYWRkc3VmZml4ICQoQkNTVUZGSVgpLCAkKFJFU1VMVCkpCi1OQ1JFU1VMVCAgOj0gJChhZGRzdWZmaXggJChOQ1NVRkZJWCksICQoUkVTVUxUKSkKLVRPUFJFU1VMVCA6PSAkKGFkZHN1ZmZpeCAkKFRPUFNVRkZJWCksICQoUkVTVUxUKSkKLQotaWZuZGVmIE9DQU1MRklORAotICBPQ0FNTEZJTkQgOj0gb2NhbWxmaW5kCi1lbmRpZgotZXhwb3J0IE9DQU1MRklORAotCi1pZm5kZWYgT0NBTUxDCi0gIE9DQU1MQyA6PSBvY2FtbGMKLWVuZGlmCi1leHBvcnQgT0NBTUxDCi0KLWlmbmRlZiBPQ0FNTE9QVAotICBPQ0FNTE9QVCA6PSBvY2FtbG9wdAotZW5kaWYKLWV4cG9ydCBPQ0FNTE9QVAotCi1pZm5kZWYgT0NBTUxNS1RPUAotICBPQ0FNTE1LVE9QIDo9IG9jYW1sbWt0b3AKLWVuZGlmCi1leHBvcnQgT0NBTUxNS1RPUAotCi1pZm5kZWYgT0NBTUxDUAotICBPQ0FNTENQIDo9IG9jYW1sY3AKLWVuZGlmCi1leHBvcnQgT0NBTUxDUAotCi1pZm5kZWYgT0NBTUxERVAKLSAgT0NBTUxERVAgOj0gb2NhbWxkZXAKLWVuZGlmCi1leHBvcnQgT0NBTUxERVAKLQotaWZuZGVmIE9DQU1MTEVYCi0gIE9DQU1MTEVYIDo9IG9jYW1sbGV4Ci1lbmRpZgotZXhwb3J0IE9DQU1MTEVYCi0KLWlmbmRlZiBPQ0FNTFlBQ0MKLSAgT0NBTUxZQUNDIDo9IG9jYW1seWFjYwotZW5kaWYKLWV4cG9ydCBPQ0FNTFlBQ0MKLQotaWZuZGVmIE9DQU1MTUtMSUIKLSAgT0NBTUxNS0xJQiA6PSBvY2FtbG1rbGliCi1lbmRpZgotZXhwb3J0IE9DQU1MTUtMSUIKLQotaWZuZGVmIE9DQU1MX0dMQURFQ0MKLSAgT0NBTUxfR0xBREVDQyA6PSBsYWJsZ2xhZGVjYzIKLWVuZGlmCi1leHBvcnQgT0NBTUxfR0xBREVDQwotCi1pZm5kZWYgT0NBTUxfR0xBREVDQ19GTEFHUwotICBPQ0FNTF9HTEFERUNDX0ZMQUdTIDo9Ci1lbmRpZgotZXhwb3J0IE9DQU1MX0dMQURFQ0NfRkxBR1MKLQotaWZuZGVmIENBTUVMRU9OX1JFUE9SVAotICBDQU1FTEVPTl9SRVBPUlQgOj0gcmVwb3J0Ci1lbmRpZgotZXhwb3J0IENBTUVMRU9OX1JFUE9SVAotCi1pZm5kZWYgQ0FNRUxFT05fUkVQT1JUX0ZMQUdTCi0gIENBTUVMRU9OX1JFUE9SVF9GTEFHUyA6PQotZW5kaWYKLWV4cG9ydCBDQU1FTEVPTl9SRVBPUlRfRkxBR1MKLQotaWZuZGVmIENBTUVMRU9OX1pPR0dZCi0gIENBTUVMRU9OX1pPR0dZIDo9IGNhbWxwNG8gcGFfem9nLmNtYSBwcl9vLmNtbwotZW5kaWYKLWV4cG9ydCBDQU1FTEVPTl9aT0dHWQotCi1pZm5kZWYgQ0FNRUxFT05fWk9HR1lfRkxBR1MKLSAgQ0FNRUxFT05fWk9HR1lfRkxBR1MgOj0KLWVuZGlmCi1leHBvcnQgQ0FNRUxFT05fWk9HR1lfRkxBR1MKLQotaWZuZGVmIE9YUklETAotICBPWFJJREwgOj0gb3hyaWRsCi1lbmRpZgotZXhwb3J0IE9YUklETAotCi1pZm5kZWYgQ0FNTElETAotICBDQU1MSURMIDo9IGNhbWxpZGwKLWVuZGlmCi1leHBvcnQgQ0FNTElETAotCi1pZm5kZWYgQ0FNTElETERMTAotICBDQU1MSURMRExMIDo9IGNhbWxpZGxkbGwKLWVuZGlmCi1leHBvcnQgQ0FNTElETERMTAotCi1pZm5kZWYgTk9JRExIRUFERVIKLSAgTUFZQkVfSURMX0hFQURFUiA6PSAtaGVhZGVyCi1lbmRpZgotZXhwb3J0IE5PSURMSEVBREVSCi0KLWV4cG9ydCBOT19DVVNUT00KLQotaWZuZGVmIENBTUxQNAotICBDQU1MUDQgOj0gY2FtbHA0Ci1lbmRpZgotZXhwb3J0IENBTUxQNAotCi1pZm5kZWYgUkVBTF9PQ0FNTEZJTkQKLSAgaWZkZWYgUEFDS1MKLSAgICBpZm5kZWYgQ1JFQVRFX0xJQgotICAgICAgaWZkZWYgVEhSRUFEUwotCVBBQ0tTICs9IHRocmVhZHMKLSAgICAgIGVuZGlmCi0gICAgZW5kaWYKLSAgICBlbXB0eSA6PQotICAgIHNwYWNlIDo9ICQoZW1wdHkpICQoZW1wdHkpCi0gICAgY29tbWEgOj0gLAotICAgIGlmZGVmIFBSRURTCi0gICAgICBQUkVfT0NBTUxfRklORF9QUkVESUNBVEVTIDo9ICQoc3Vic3QgJChzcGFjZSksJChjb21tYSksJChQUkVEUykpCi0gICAgICBQUkVfT0NBTUxfRklORF9QQUNLQUdFUyA6PSAkKHN1YnN0ICQoc3BhY2UpLCQoY29tbWEpLCQoUEFDS1MpKQotICAgICAgT0NBTUxfRklORF9QUkVESUNBVEVTIDo9IC1wcmVkaWNhdGVzICQoUFJFX09DQU1MX0ZJTkRfUFJFRElDQVRFUykKLSAgIyAgICBPQ0FNTF9ERVBfUFJFRElDQVRFUyA6PSAtc3ludGF4ICQoUFJFX09DQU1MX0ZJTkRfUFJFRElDQVRFUykKLSAgICAgIE9DQU1MX0ZJTkRfUEFDS0FHRVMgOj0gJChPQ0FNTF9GSU5EX1BSRURJQ0FURVMpIC1wYWNrYWdlICQoUFJFX09DQU1MX0ZJTkRfUEFDS0FHRVMpCi0gICAgICBPQ0FNTF9ERVBfUEFDS0FHRVMgOj0gJChPQ0FNTF9ERVBfUFJFRElDQVRFUykgLXBhY2thZ2UgJChQUkVfT0NBTUxfRklORF9QQUNLQUdFUykKLSAgICBlbHNlCi0gICAgICBPQ0FNTF9GSU5EX1BBQ0tBR0VTIDo9IC1wYWNrYWdlICQoc3Vic3QgJChzcGFjZSksJChjb21tYSksJChQQUNLUykpCi0gICAgICBPQ0FNTF9ERVBfUEFDS0FHRVMgOj0KLSAgICBlbmRpZgotICAgIE9DQU1MX0ZJTkRfTElOS1BLRyA6PSAtbGlua3BrZwotICAgIFJFQUxfT0NBTUxGSU5EIDo9ICQoT0NBTUxGSU5EKQotICBlbmRpZgotZW5kaWYKLQotZXhwb3J0IE9DQU1MX0ZJTkRfUEFDS0FHRVMKLWV4cG9ydCBPQ0FNTF9ERVBfUEFDS0FHRVMKLWV4cG9ydCBPQ0FNTF9GSU5EX0xJTktQS0cKLWV4cG9ydCBSRUFMX09DQU1MRklORAotCi1pZm5kZWYgT0NBTUxET0MKLSAgT0NBTUxET0MgOj0gb2NhbWxkb2MKLWVuZGlmCi1leHBvcnQgT0NBTUxET0MKLQotaWZuZGVmIExBVEVYCi0gIExBVEVYIDo9IGxhdGV4Ci1lbmRpZgotZXhwb3J0IExBVEVYCi0KLWlmbmRlZiBEVklQUwotICBEVklQUyA6PSBkdmlwcwotZW5kaWYKLWV4cG9ydCBEVklQUwotCi1pZm5kZWYgUFMyUERGCi0gIFBTMlBERiA6PSBwczJwZGYKLWVuZGlmCi1leHBvcnQgUFMyUERGCi0KLWlmbmRlZiBPQ0FNTE1BS0VGSUxFCi0gIE9DQU1MTUFLRUZJTEUgOj0gT0NhbWxNYWtlZmlsZQotZW5kaWYKLWV4cG9ydCBPQ0FNTE1BS0VGSUxFCi0KLWlmbmRlZiBPQ0FNTExJQlBBVEgKLSAgT0NBTUxMSUJQQVRIIDo9IFwKLSAgICAkKHNoZWxsICQoT0NBTUxDKSAyPi9kZXYvbnVsbCAtd2hlcmUgfHwgZWNobyAvdXNyL2xvY2FsL2xpYi9vY2FtbCkKLWVuZGlmCi1leHBvcnQgT0NBTUxMSUJQQVRICi0KLWlmbmRlZiBPQ0FNTF9MSUJfSU5TVEFMTAotICBPQ0FNTF9MSUJfSU5TVEFMTCA6PSAkKE9DQU1MTElCUEFUSCkvY29udHJpYgotZW5kaWYKLWV4cG9ydCBPQ0FNTF9MSUJfSU5TVEFMTAotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMgIGNoYW5nZSBmb2xsb3dpbmcgc2VjdGlvbnMgb25seSBpZgotIyMjIyMjIyMjIyMjIyMjIyMjIyMgICAgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nIQotCi0jIGRlbGV0ZSB0YXJnZXQgZmlsZXMgd2hlbiBhIGJ1aWxkIGNvbW1hbmQgZmFpbHMKLS5QSE9OWTogLkRFTEVURV9PTl9FUlJPUgotLkRFTEVURV9PTl9FUlJPUjoKLQotIyBmb3IgcGVkYW50cyB1c2luZyAiLS13YXJuLXVuZGVmaW5lZC12YXJpYWJsZXMiCi1leHBvcnQgTUFZQkVfSURMCi1leHBvcnQgUkVBTF9SRVNVTFQKLWV4cG9ydCBDQU1MSURMRkxBR1MKLWV4cG9ydCBUSFJFQURfRkxBRwotZXhwb3J0IFJFU19DTElCCi1leHBvcnQgTUFLRURMTAotZXhwb3J0IEFOTk9UX0ZMQUcKLWV4cG9ydCBDX09YUklETAotZXhwb3J0IFNVQlBST0pTCi1leHBvcnQgQ0ZMQUdTX1dJTjMyCi1leHBvcnQgQ1BQRkxBR1NfV0lOMzIKLQotSU5DRkxBR1MgOj0KLQotU0hFTEwgOj0gL2Jpbi9zaAotCi1NTERFUERJUiA6PSAuX2QKLUJDRElESVIgIDo9IC5fYmNkaQotTkNESURJUiAgOj0gLl9uY2RpCi0KLUZJTFRFUl9FWFROUyA6PSAlLm1saSAlLm1sICUubWxsICUubWx5ICUuaWRsICUub3hyaWRsICUuYyAlLm0gJS4kKEVYVF9DWFgpICUucmVwICUuem9nICUuZ2xhZGUKLQotRklMVEVSRUQgICAgIDo9ICQoZmlsdGVyICQoRklMVEVSX0VYVE5TKSwgJChTT1VSQ0VTKSkKLVNPVVJDRV9ESVJTICA6PSAkKGZpbHRlci1vdXQgLi8sICQoc29ydCAkKGRpciAkKEZJTFRFUkVEKSkpKQotCi1GSUxURVJFRF9SRVAgOj0gJChmaWx0ZXIgJS5yZXAsICQoRklMVEVSRUQpKQotREVQX1JFUCAgICAgIDo9ICQoRklMVEVSRURfUkVQOiUucmVwPSQoTUxERVBESVIpLyUuZCkKLUFVVE9fUkVQICAgICA6PSAkKEZJTFRFUkVEX1JFUDoucmVwPS5tbCkKLQotRklMVEVSRURfWk9HIDo9ICQoZmlsdGVyICUuem9nLCAkKEZJTFRFUkVEKSkKLURFUF9aT0cgICAgICA6PSAkKEZJTFRFUkVEX1pPRzolLnpvZz0kKE1MREVQRElSKS8lLmQpCi1BVVRPX1pPRyAgICAgOj0gJChGSUxURVJFRF9aT0c6LnpvZz0ubWwpCi0KLUZJTFRFUkVEX0dMQURFIDo9ICQoZmlsdGVyICUuZ2xhZGUsICQoRklMVEVSRUQpKQotREVQX0dMQURFICAgICAgOj0gJChGSUxURVJFRF9HTEFERTolLmdsYWRlPSQoTUxERVBESVIpLyUuZCkKLUFVVE9fR0xBREUgICAgIDo9ICQoRklMVEVSRURfR0xBREU6LmdsYWRlPS5tbCkKLQotRklMVEVSRURfTUwgIDo9ICQoZmlsdGVyICUubWwsICQoRklMVEVSRUQpKQotREVQX01MICAgICAgIDo9ICQoRklMVEVSRURfTUw6JS5tbD0kKE1MREVQRElSKS8lLmQpCi0KLUZJTFRFUkVEX01MSSA6PSAkKGZpbHRlciAlLm1saSwgJChGSUxURVJFRCkpCi1ERVBfTUxJICAgICAgOj0gJChGSUxURVJFRF9NTEk6Lm1saT0uZGkpCi0KLUZJTFRFUkVEX01MTCA6PSAkKGZpbHRlciAlLm1sbCwgJChGSUxURVJFRCkpCi1ERVBfTUxMICAgICAgOj0gJChGSUxURVJFRF9NTEw6JS5tbGw9JChNTERFUERJUikvJS5kKQotQVVUT19NTEwgICAgIDo9ICQoRklMVEVSRURfTUxMOi5tbGw9Lm1sKQotCi1GSUxURVJFRF9NTFkgOj0gJChmaWx0ZXIgJS5tbHksICQoRklMVEVSRUQpKQotREVQX01MWSAgICAgIDo9ICQoRklMVEVSRURfTUxZOiUubWx5PSQoTUxERVBESVIpLyUuZCkgJChGSUxURVJFRF9NTFk6Lm1seT0uZGkpCi1BVVRPX01MWSAgICAgOj0gJChGSUxURVJFRF9NTFk6Lm1seT0ubWxpKSAkKEZJTFRFUkVEX01MWToubWx5PS5tbCkKLQotRklMVEVSRURfSURMIDo9ICQoZmlsdGVyICUuaWRsLCAkKEZJTFRFUkVEKSkKLURFUF9JREwgICAgICA6PSAkKEZJTFRFUkVEX0lETDolLmlkbD0kKE1MREVQRElSKS8lLmQpICQoRklMVEVSRURfSURMOi5pZGw9LmRpKQotQ19JREwgICAgICAgIDo9ICQoRklMVEVSRURfSURMOiUuaWRsPSVfc3R1YnMuYykKLWlmbmRlZiBOT0lETEhFQURFUgotIENfSURMICs9ICQoRklMVEVSRURfSURMOi5pZGw9LmgpCi1lbmRpZgotT0JKX0NfSURMICAgIDo9ICQoRklMVEVSRURfSURMOiUuaWRsPSVfc3R1YnMuJChFWFRfT0JKKSkKLUFVVE9fSURMICAgICA6PSAkKEZJTFRFUkVEX0lETDouaWRsPS5tbGkpICQoRklMVEVSRURfSURMOi5pZGw9Lm1sKSAkKENfSURMKQotCi1GSUxURVJFRF9PWFJJREwgOj0gJChmaWx0ZXIgJS5veHJpZGwsICQoRklMVEVSRUQpKQotREVQX09YUklETCAgICAgIDo9ICQoRklMVEVSRURfT1hSSURMOiUub3hyaWRsPSQoTUxERVBESVIpLyUuZCkgJChGSUxURVJFRF9PWFJJREw6Lm94cmlkbD0uZGkpCi1BVVRPX09YUklETCAgICAgOj0gJChGSUxURVJFRF9PWFJJREw6Lm94cmlkbD0ubWxpKSAkKEZJTFRFUkVEX09YUklETDoub3hyaWRsPS5tbCkgJChDX09YUklETCkKLQotRklMVEVSRURfQ19DWFggOj0gJChmaWx0ZXIgJS5jICUubSAlLiQoRVhUX0NYWCksICQoRklMVEVSRUQpKQotT0JKX0NfQ1hYICAgICAgOj0gJChGSUxURVJFRF9DX0NYWDouYz0uJChFWFRfT0JKKSkKLU9CSl9DX0NYWCAgICAgIDo9ICQoT0JKX0NfQ1hYOi5tPS4kKEVYVF9PQkopKQotT0JKX0NfQ1hYICAgICAgOj0gJChPQkpfQ19DWFg6LiQoRVhUX0NYWCk9LiQoRVhUX09CSikpCi0KLVBSRV9UQVJHRVRTICArPSAkKEFVVE9fTUxMKSAkKEFVVE9fTUxZKSAkKEFVVE9fSURMKSAkKEFVVE9fT1hSSURMKSAkKEFVVE9fWk9HKSAkKEFVVE9fUkVQKSAkKEFVVE9fR0xBREUpCi0KLUFMTF9ERVBTICAgICA6PSAkKERFUF9NTCkgJChERVBfTUxJKSAkKERFUF9NTEwpICQoREVQX01MWSkgJChERVBfSURMKSAkKERFUF9PWFJJREwpICQoREVQX1pPRykgJChERVBfUkVQKSAkKERFUF9HTEFERSkKLQotTUxERVBTICAgICAgIDo9ICQoZmlsdGVyICUuZCwgJChBTExfREVQUykpCi1NTElERVBTICAgICAgOj0gJChmaWx0ZXIgJS5kaSwgJChBTExfREVQUykpCi1CQ0RFUElTICAgICAgOj0gJChNTElERVBTOiUuZGk9JChCQ0RJRElSKS8lLmRpKQotTkNERVBJUyAgICAgIDo9ICQoTUxJREVQUzolLmRpPSQoTkNESURJUikvJS5kaSkKLQotQUxMTUwgICAgICAgIDo9ICQoZmlsdGVyICUubWxpICUubWwgJS5tbGwgJS5tbHkgJS5pZGwgJS5veHJpZGwgJS5yZXAgJS56b2cgJS5nbGFkZSwgJChGSUxURVJFRCkpCi0KLUlNUExPX0lOVEYgICA6PSAkKEFMTE1MOiUubWxpPSUubWxpLl9fKQotSU1QTE9fSU5URiAgIDo9ICQoZm9yZWFjaCBmaWxlLCAkKElNUExPX0lOVEYpLCBcCi0gICAgICAgICAgICAgICAgICAkKGJhc2VuYW1lICQoZmlsZSkpLmNtaSAkKGJhc2VuYW1lICQoZmlsZSkpLmNtbykKLUlNUExPX0lOVEYgICA6PSAkKGZpbHRlci1vdXQgJS5tbGkuY21vLCAkKElNUExPX0lOVEYpKQotSU1QTE9fSU5URiAgIDo9ICQoSU1QTE9fSU5URjolLm1saS5jbWk9JS5jbWkpCi0KLUlNUExYX0lOVEYgICA6PSAkKElNUExPX0lOVEY6LmNtbz0uY214KQotCi1JTlRGICAgICAgICAgOj0gJChmaWx0ZXIgJS5jbWksICQoSU1QTE9fSU5URikpCi1JTVBMX0NNTyAgICAgOj0gJChmaWx0ZXIgJS5jbW8sICQoSU1QTE9fSU5URikpCi1JTVBMX0NNWCAgICAgOj0gJChJTVBMX0NNTzouY21vPS5jbXgpCi1JTVBMX0FTTSAgICAgOj0gJChJTVBMX0NNTzouY21vPS5hc20pCi1JTVBMX1MgICAgICAgOj0gJChJTVBMX0NNTzouY21vPS5zKQotCi1PQkpfTElOSyAgICAgOj0gJChPQkpfQ19JREwpICQoT0JKX0NfQ1hYKQotT0JKX0ZJTEVTICAgIDo9ICQoSU1QTF9DTU86LmNtbz0uJChFWFRfT0JKKSkgJChPQkpfTElOSykKLQotRVhFQ1MgICAgICAgIDo9ICQoYWRkc3VmZml4ICQoRVhFKSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoc29ydCAkKFRPUFJFU1VMVCkgJChCQ1JFU1VMVCkgJChOQ1JFU1VMVCkpKQotaWZkZWYgV0lOMzIKLSAgRVhFQ1MgICAgICArPSAkKEJDUkVTVUxUKS5kbGwgJChOQ1JFU1VMVCkuZGxsCi1lbmRpZgotCi1DTElCX0JBU0UgICAgOj0gJChSRVNVTFQpJChSRVNfQ0xJQl9TVUYpCi1pZm5lcSAoJChzdHJpcCAkKE9CSl9MSU5LKSksKQotICBSRVNfQ0xJQiAgICAgOj0gbGliJChDTElCX0JBU0UpLiQoRVhUX0xJQikKLWVuZGlmCi0KLWlmZGVmIFdJTjMyCi1ETExTT05BTUUgOj0gJChDTElCX0JBU0UpLmRsbAotZWxzZQotRExMU09OQU1FIDo9IGRsbCQoQ0xJQl9CQVNFKS5zbwotZW5kaWYKLQotTk9ORVhFQ1MgICAgIDo9ICQoSU5URikgJChJTVBMX0NNTykgJChJTVBMX0NNWCkgJChJTVBMX0FTTSkgJChJTVBMX1MpIFwKLQkJJChPQkpfRklMRVMpICQoUFJFX1RBUkdFVFMpICQoQkNSRVNVTFQpLmNtYSAkKE5DUkVTVUxUKS5jbXhhIFwKLQkJJChOQ1JFU1VMVCkuJChFWFRfTElCKSAkKEJDUkVTVUxUKS5jbWkgJChCQ1JFU1VMVCkuY21vIFwKLQkJJChOQ1JFU1VMVCkuY21pICQoTkNSRVNVTFQpLmNteCAkKE5DUkVTVUxUKS5vIFwKLQkJJChSRVNfQ0xJQikgJChJTVBMX0NNTzouY21vPS5hbm5vdCkgXAotCQkkKExJQl9QQUNLX05BTUUpLmNtaSAkKExJQl9QQUNLX05BTUUpLmNtbyAkKExJQl9QQUNLX05BTUUpLmNteCAkKExJQl9QQUNLX05BTUUpLm8KLQotaWZuZGVmIFNUQVRJQwotICBOT05FWEVDUyArPSAkKERMTFNPTkFNRSkKLWVuZGlmCi0KLWlmbmRlZiBMSUJJTlNUQUxMX0ZJTEVTCi0gIExJQklOU1RBTExfRklMRVMgOj0gJChSRVNVTFQpLm1saSAkKFJFU1VMVCkuY21pICQoUkVTVUxUKS5jbWEgXAotCQkgICAgICAkKFJFU1VMVCkuY214YSAkKFJFU1VMVCkuJChFWFRfTElCKSAkKFJFU19DTElCKQotICBpZm5kZWYgU1RBVElDCi0gICAgaWZuZXEgKCQoc3RyaXAgJChPQkpfTElOSykpLCkKLSAgICAgIExJQklOU1RBTExfRklMRVMgKz0gJChETExTT05BTUUpCi0gICAgZW5kaWYKLSAgZW5kaWYKLWVuZGlmCi0KLWV4cG9ydCBMSUJJTlNUQUxMX0ZJTEVTCi0KLWlmZGVmIFdJTjMyCi0gICMgc29tZSBleHRyYSBzdHVmZiBpcyBjcmVhdGVkIHdoaWxlIGxpbmtpbmcgRExMcwotICBOT05FWEVDUyAgICs9ICQoQkNSRVNVTFQpLiQoRVhUX0xJQikgJChCQ1JFU1VMVCkuZXhwICQoTkNSRVNVTFQpLmV4cCAkKENMSUJfQkFTRSkuZXhwICQoQ0xJQl9CQVNFKS5saWIKLWVuZGlmCi0KLVRBUkdFVFMgICAgICA6PSAkKEVYRUNTKSAkKE5PTkVYRUNTKQotCi0jIElmIHRoZXJlIGFyZSBJREwtZmlsZXMKLWlmbmVxICgkKHN0cmlwICQoRklMVEVSRURfSURMKSksKQotICBNQVlCRV9JREwgOj0gLWNjbGliIC1sY2FtbGlkbAotZW5kaWYKLQotaWZkZWYgVVNFX0NBTUxQNAotICBDQU1MUDRQQVRIIDo9IFwKLSAgICAkKHNoZWxsICQoQ0FNTFA0KSAtd2hlcmUgMj4vZGV2L251bGwgfHwgZWNobyAvdXNyL2xvY2FsL2xpYi9jYW1scDQpCi0gIElOQ0ZMQUdTIDo9IC1JICQoQ0FNTFA0UEFUSCkKLSAgQ0lOQ0ZMQUdTIDo9IC1JJChDQU1MUDRQQVRIKQotZW5kaWYKLQotRElOQ0ZMQUdTIDo9ICQoSU5DRkxBR1MpICQoU09VUkNFX0RJUlM6JT0tSSAlKSAkKE9DQU1MX0RFRkFVTFRfRElSUzolPS1JICUpCi1JTkNGTEFHUyA6PSAkKERJTkNGTEFHUykgJChJTkNESVJTOiU9LUkgJSkKLUNJTkNGTEFHUyArPSAkKFNPVVJDRV9ESVJTOiU9LUklKSAkKElOQ0RJUlM6JT0tSSUpICQoT0NBTUxfREVGQVVMVF9ESVJTOiU9LUklKQotCi1pZm5kZWYgTVNWQwotICBDTElCRkxBR1MgKz0gJChTT1VSQ0VfRElSUzolPS1MJSkgJChMSUJESVJTOiU9LUwlKSBcCi0gICAgICAgICAgICAgICAkKEVYVExJQkRJUlM6JT0tTCUpICQoT0NBTUxfREVGQVVMVF9ESVJTOiU9LUwlKQotCi0gIGlmZXEgKCQoRUxGX1JQQVRIKSwgeWVzKQotICAgIENMSUJGTEFHUyArPSAkKEVYVExJQkRJUlM6JT0tV2wsJChSUEFUSF9GTEFHKSUpCi0gIGVuZGlmCi1lbmRpZgotCi1pZm5kZWYgUFJPRklMSU5HCi0gIElOVEZfT0NBTUxDIDo9ICQoT0NBTUxDKQotZWxzZQotICBpZm5kZWYgVEhSRUFEUwotICAgIElOVEZfT0NBTUxDIDo9ICQoT0NBTUxDUCkgLXAgJChPQ0FNTENQRkxBR1MpCi0gIGVsc2UKLSAgICAjIE9DYW1sIGRvZXMgbm90IHN1cHBvcnQgcHJvZmlsaW5nIGJ5dGUgY29kZQotICAgICMgd2l0aCB0aHJlYWRzICh5ZXQpLCB0aGVyZWZvcmUgd2UgZm9yY2UgYW4gZXJyb3IuCi0gICAgaWZuZGVmIFJFQUxfT0NBTUxDCi0gICAgICAkKGVycm9yIFByb2ZpbGluZyBvZiBtdWx0aXRocmVhZGVkIGJ5dGUgY29kZSBub3QgeWV0IHN1cHBvcnRlZCBieSBPQ2FtbCkKLSAgICBlbmRpZgotICAgIElOVEZfT0NBTUxDIDo9ICQoT0NBTUxDKQotICBlbmRpZgotZW5kaWYKLQotaWZuZGVmIE1TVkMKLSAgQ09NTU9OX0xERkxBR1MgOj0gJChMREZMQUdTOiU9LWNjb3B0ICUpICQoU09VUkNFX0RJUlM6JT0tY2NvcHQgLUwlKSBcCi0JCSAgICAkKExJQkRJUlM6JT0tY2NvcHQgLUwlKSAkKEVYVExJQkRJUlM6JT0tY2NvcHQgLUwlKSBcCi0JCSAgICAkKEVYVExJQkRJUlM6JT0tY2NvcHQgLVdsICQoT0NBTUxfREVGQVVMVF9ESVJTOiU9LWNjb3B0IC1MJSkpCi0KLSAgaWZlcSAoJChFTEZfUlBBVEgpLHllcykKLSAgICBDT01NT05fTERGTEFHUyArPSAkKEVYVExJQkRJUlM6JT0tY2NvcHQgLVdsLCQoUlBBVEhfRkxBRyklKQotICBlbmRpZgotZWxzZQotICBDT01NT05fTERGTEFHUyA6PSAtY2NvcHQgIi9saW5rIC1OT0RFRkFVTFRMSUI6TElCQyAkKExERkxBR1M6JT0lKSAkKFNPVVJDRV9ESVJTOiU9LUxJQlBBVEg6JSkgXAotCQkgICAgJChMSUJESVJTOiU9LUxJQlBBVEg6JSkgJChFWFRMSUJESVJTOiU9LUxJQlBBVEg6JSkgXAotCQkgICAgJChPQ0FNTF9ERUZBVUxUX0RJUlM6JT0tTElCUEFUSDolKSAiCi1lbmRpZgotCi1DTElCU19PUFRTIDo9ICQoQ0xJQlM6JT0tY2NsaWIgLWwlKSAkKENGUkFNRVdPUktTOiU9LWNjbGliICctZnJhbWV3b3JrICUnKQotaWZkZWYgTVNWQwotICBpZm5kZWYgU1RBVElDCi0gICMgTVNWQyBsaWJyYXJpZXMgZG8gbm90IGhhdmUgJ2xpYicgcHJlZml4Ci0gIENMSUJTX09QVFMgOj0gJChDTElCUzolPS1jY2xpYiAlLmxpYikKLSAgZW5kaWYKLWVuZGlmCi0KLWlmbmVxICgkKHN0cmlwICQoT0JKX0xJTkspKSwpCi0gIGlmZGVmIENSRUFURV9MSUIKLSAgICBPQkpTX0xJQlMgOj0gLWNjbGliIC1sJChDTElCX0JBU0UpICQoQ0xJQlNfT1BUUykgJChNQVlCRV9JREwpCi0gIGVsc2UKLSAgICBPQkpTX0xJQlMgOj0gJChPQkpfTElOSykgJChDTElCU19PUFRTKSAkKE1BWUJFX0lETCkKLSAgZW5kaWYKLWVsc2UKLSAgT0JKU19MSUJTIDo9ICQoQ0xJQlNfT1BUUykgJChNQVlCRV9JREwpCi1lbmRpZgotCi0jIElmIHdlIGhhdmUgdG8gbWFrZSBieXRlLWNvZGUKLWlmbmRlZiBSRUFMX09DQU1MQwotICBCWVRFX09DQU1MIDo9IHkKLQotICAjIEVYVFJBREVQUyBpcyBhZGRlZCBkZXBlbmRlbmNpZXMgd2UgaGF2ZSB0byBpbnNlcnQgZm9yIGFsbAotICAjIGV4ZWN1dGFibGUgZmlsZXMgd2UgZ2VuZXJhdGUuICBJZGVhbGx5IGl0IHNob3VsZCBiZSBhbGwgb2YgdGhlCi0gICMgbGlicmFyaWVzIHdlIHVzZSwgYnV0IGl0J3MgaGFyZCB0byBmaW5kIHRoZSBvbmVzIHRoYXQgZ2V0IHNlYXJjaGVkIG9uCi0gICMgdGhlIHBhdGggc2luY2UgSSBkb24ndCBrbm93IHRoZSBwYXRocyBidWlsdCBpbnRvIHRoZSBjb21waWxlciwgc28KLSAgIyBqdXN0IGluY2x1ZGUgdGhlIG9uZXMgd2l0aCBzbGFzaGVzIGluIHRoZWlyIG5hbWVzLgotICBFWFRSQURFUFMgOj0gJChhZGRzdWZmaXggLmNtYSwkKGZvcmVhY2ggaSwkKExJQlMpLCQoaWYgJChmaW5kc3RyaW5nIC8sJChpKSksJChpKSkpKQotICBTUEVDSUFMX09DQU1MRkxBR1MgOj0gJChPQ0FNTEJDRkxBR1MpCi0KLSAgUkVBTF9PQ0FNTEMgOj0gJChJTlRGX09DQU1MQykKLQotICBSRUFMX0lNUEwgOj0gJChJTVBMX0NNTykKLSAgUkVBTF9JTVBMX0lOVEYgOj0gJChJTVBMT19JTlRGKQotICBJTVBMX1NVRiA6PSAuY21vCi0KLSAgREVQRkxBR1MgIDo9Ci0gIE1BS0VfREVQUyA6PSAkKE1MREVQUykgJChCQ0RFUElTKQotCi0gIGlmZGVmIENSRUFURV9MSUIKLSAgICBvdmVycmlkZSBDRkxBR1MgOj0gJChQSUNfQ0ZMQUdTKSAkKENGTEFHUykKLSAgICBvdmVycmlkZSBDUFBGTEFHUyA6PSAkKFBJQ19DUFBGTEFHUykgJChDUFBGTEFHUykKLSAgICBpZm5kZWYgU1RBVElDCi0gICAgICBpZm5lcSAoJChzdHJpcCAkKE9CSl9MSU5LKSksKQotCU1BS0VETEwgOj0gJChETExTT05BTUUpCi0JQUxMX0xERkxBR1MgOj0gLWRsbGliICQoRExMU09OQU1FKQotICAgICAgZW5kaWYKLSAgICBlbmRpZgotICBlbmRpZgotCi0gIGlmbmRlZiBOT19DVVNUT00KLSAgICBpZm5lcSAiJChzdHJpcCAkKE9CSl9MSU5LKSAkKFRIUkVBRFMpICQoTUFZQkVfSURMKSAkKENMSUJTKSAkKENGUkFNRVdPUktTKSkiICIiCi0gICAgICBBTExfTERGTEFHUyArPSAtY3VzdG9tCi0gICAgZW5kaWYKLSAgZW5kaWYKLQotICBBTExfTERGTEFHUyArPSAkKElOQ0ZMQUdTKSAkKE9DQU1MTERGTEFHUykgJChPQ0FNTEJMREZMQUdTKSBcCi0gICAgICAgICAgICAgICAgICQoQ09NTU9OX0xERkxBR1MpICQoTElCUzolPSUuY21hKQotICBDQU1MSURMRExMRkxBR1MgOj0KLQotICBpZmRlZiBUSFJFQURTCi0gICAgaWZkZWYgVk1USFJFQURTCi0gICAgICBUSFJFQURfRkxBRyA6PSAtdm10aHJlYWQKLSAgICBlbHNlCi0gICAgICBUSFJFQURfRkxBRyA6PSAtdGhyZWFkCi0gICAgZW5kaWYKLSAgICBBTExfTERGTEFHUyA6PSAkKFRIUkVBRF9GTEFHKSAkKEFMTF9MREZMQUdTKQotICAgIGlmbmRlZiBDUkVBVEVfTElCCi0gICAgICBpZm5kZWYgUkVBTF9PQ0FNTEZJTkQKLSAgICAgICAgQUxMX0xERkxBR1MgOj0gdW5peC5jbWEgdGhyZWFkcy5jbWEgJChBTExfTERGTEFHUykKLSAgICAgIGVuZGlmCi0gICAgZW5kaWYKLSAgZW5kaWYKLQotIyB3ZSBoYXZlIHRvIG1ha2UgbmF0aXZlLWNvZGUKLWVsc2UKLSAgRVhUUkFERVBTIDo9ICQoYWRkc3VmZml4IC5jbXhhLCQoZm9yZWFjaCBpLCQoTElCUyksJChpZiAkKGZpbmRzdHJpbmcgLywkKGkpKSwkKGkpKSkpCi0gIGlmbmRlZiBQUk9GSUxJTkcKLSAgICBTUEVDSUFMX09DQU1MRkxBR1MgOj0gJChPQ0FNTE5DRkxBR1MpCi0gICAgUExERkxBR1MgOj0KLSAgZWxzZQotICAgIFNQRUNJQUxfT0NBTUxGTEFHUyA6PSAtcCAkKE9DQU1MTkNGTEFHUykKLSAgICBQTERGTEFHUyA6PSAtcAotICBlbmRpZgotCi0gIFJFQUxfSU1QTCA6PSAkKElNUExfQ01YKQotICBSRUFMX0lNUExfSU5URiA6PSAkKElNUExYX0lOVEYpCi0gIElNUExfU1VGIDo9IC5jbXgKLQotICBvdmVycmlkZSBDUFBGTEFHUyA6PSAtRE5BVElWRV9DT0RFICQoQ1BQRkxBR1MpCi0KLSAgREVQRkxBR1MgIDo9IC1uYXRpdmUKLSAgTUFLRV9ERVBTIDo9ICQoTUxERVBTKSAkKE5DREVQSVMpCi0KLSAgQUxMX0xERkxBR1MgOj0gJChQTERGTEFHUykgJChJTkNGTEFHUykgJChPQ0FNTExERkxBR1MpIFwKLSAgICAgICAgICAgICAgICAgJChPQ0FNTE5MREZMQUdTKSAkKENPTU1PTl9MREZMQUdTKQotICBDQU1MSURMRExMRkxBR1MgOj0gLW9wdAotCi0gIGlmbmRlZiBDUkVBVEVfTElCCi0gICAgQUxMX0xERkxBR1MgKz0gJChMSUJTOiU9JS5jbXhhKQotICBlbHNlCi0gICAgb3ZlcnJpZGUgQ0ZMQUdTIDo9ICQoUElDX0NGTEFHUykgJChDRkxBR1MpCi0gICAgb3ZlcnJpZGUgQ1BQRkxBR1MgOj0gJChQSUNfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpCi0gIGVuZGlmCi0KLSAgaWZkZWYgVEhSRUFEUwotICAgIFRIUkVBRF9GTEFHIDo9IC10aHJlYWQKLSAgICBBTExfTERGTEFHUyA6PSAkKFRIUkVBRF9GTEFHKSAkKEFMTF9MREZMQUdTKQotICAgIGlmbmRlZiBDUkVBVEVfTElCCi0gICAgICBpZm5kZWYgUkVBTF9PQ0FNTEZJTkQKLSAgICAgICAgQUxMX0xERkxBR1MgOj0gdW5peC5jbXhhIHRocmVhZHMuY214YSAkKEFMTF9MREZMQUdTKQotICAgICAgZW5kaWYKLSAgICBlbmRpZgotICBlbmRpZgotZW5kaWYKLQotZXhwb3J0IE1BS0VfREVQUwotCi1pZmRlZiBBTk5PVEFURQotICBBTk5PVF9GTEFHIDo9IC1kdHlwZXMKLWVsc2UKLWVuZGlmCi0KLUFMTF9PQ0FNTENGTEFHUyA6PSAkKFRIUkVBRF9GTEFHKSAkKEFOTk9UX0ZMQUcpICQoT0NBTUxGTEFHUykgXAotICAgICAgICAgICAgICAgICAgICQoSU5DRkxBR1MpICQoU1BFQ0lBTF9PQ0FNTEZMQUdTKQotCi1pZmRlZiBtYWtlX2RlcHMKLSAgLWluY2x1ZGUgJChNQUtFX0RFUFMpCi0gIFBSRV9UQVJHRVRTIDo9Ci1lbmRpZgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgVVNFUiBSVUxFUwotCi0jIENhbGwgIk9DYW1sTWFrZWZpbGUgUVVJRVQ9IiB0byBnZXQgcmlkIG9mIGFsbCBvZiB0aGUgQCdzLgotUVVJRVQ9QAotCi0jIGdlbmVyYXRlcyBieXRlLWNvZGUgKGRlZmF1bHQpCi1ieXRlLWNvZGU6CQkkKFBSRV9UQVJHRVRTKQotCQkJJChRVUlFVCkkKE1BS0UpIC1yIC1mICQoT0NBTUxNQUtFRklMRSkgJChCQ1JFU1VMVCkgXAotCQkJCVJFQUxfUkVTVUxUPSIkKEJDUkVTVUxUKSIgbWFrZV9kZXBzPXllcwotYmM6CWJ5dGUtY29kZQotCi1ieXRlLWNvZGUtbm9saW5rOgkkKFBSRV9UQVJHRVRTKQotCQkJJChRVUlFVCkkKE1BS0UpIC1yIC1mICQoT0NBTUxNQUtFRklMRSkgbm9saW5rIFwKLQkJCQlSRUFMX1JFU1VMVD0iJChCQ1JFU1VMVCkiIG1ha2VfZGVwcz15ZXMKLWJjbmw6CWJ5dGUtY29kZS1ub2xpbmsKLQotdG9wOgkJCSQoUFJFX1RBUkdFVFMpCi0JCQkkKFFVSUVUKSQoTUFLRSkgLXIgLWYgJChPQ0FNTE1BS0VGSUxFKSAkKFRPUFJFU1VMVCkgXAotCQkJCVJFQUxfUkVTVUxUPSIkKEJDUkVTVUxUKSIgbWFrZV9kZXBzPXllcwotCi0jIGdlbmVyYXRlcyBuYXRpdmUtY29kZQotCi1uYXRpdmUtY29kZToJCSQoUFJFX1RBUkdFVFMpCi0JCQkkKFFVSUVUKSQoTUFLRSkgLXIgLWYgJChPQ0FNTE1BS0VGSUxFKSAkKE5DUkVTVUxUKSBcCi0JCQkJUkVBTF9SRVNVTFQ9IiQoTkNSRVNVTFQpIiBcCi0JCQkJUkVBTF9PQ0FNTEM9IiQoT0NBTUxPUFQpIiBcCi0JCQkJbWFrZV9kZXBzPXllcwotbmM6CW5hdGl2ZS1jb2RlCi0KLW5hdGl2ZS1jb2RlLW5vbGluazoJJChQUkVfVEFSR0VUUykKLQkJCSQoUVVJRVQpJChNQUtFKSAtciAtZiAkKE9DQU1MTUFLRUZJTEUpIG5vbGluayBcCi0JCQkJUkVBTF9SRVNVTFQ9IiQoTkNSRVNVTFQpIiBcCi0JCQkJUkVBTF9PQ0FNTEM9IiQoT0NBTUxPUFQpIiBcCi0JCQkJbWFrZV9kZXBzPXllcwotbmNubDoJbmF0aXZlLWNvZGUtbm9saW5rCi0KLSMgZ2VuZXJhdGVzIGJ5dGUtY29kZSBsaWJyYXJpZXMKLWJ5dGUtY29kZS1saWJyYXJ5OgkkKFBSRV9UQVJHRVRTKQotCQkJJChRVUlFVCkkKE1BS0UpIC1yIC1mICQoT0NBTUxNQUtFRklMRSkgXAotCQkJCSQoUkVTX0NMSUIpICQoQkNSRVNVTFQpLmNtYSBcCi0JCQkJUkVBTF9SRVNVTFQ9IiQoQkNSRVNVTFQpIiBcCi0JCQkJQ1JFQVRFX0xJQj15ZXMgXAotCQkJCW1ha2VfZGVwcz15ZXMKLWJjbDoJYnl0ZS1jb2RlLWxpYnJhcnkKLQotIyBnZW5lcmF0ZXMgbmF0aXZlLWNvZGUgbGlicmFyaWVzCi1uYXRpdmUtY29kZS1saWJyYXJ5OgkkKFBSRV9UQVJHRVRTKQotCQkJJChRVUlFVCkkKE1BS0UpIC1yIC1mICQoT0NBTUxNQUtFRklMRSkgXAotCQkJCSQoUkVTX0NMSUIpICQoTkNSRVNVTFQpLmNteGEgXAotCQkJCVJFQUxfUkVTVUxUPSIkKE5DUkVTVUxUKSIgXAotCQkJCVJFQUxfT0NBTUxDPSIkKE9DQU1MT1BUKSIgXAotCQkJCUNSRUFURV9MSUI9eWVzIFwKLQkJCQltYWtlX2RlcHM9eWVzCi1uY2w6CW5hdGl2ZS1jb2RlLWxpYnJhcnkKLQotaWZkZWYgV0lOMzIKLSMgZ2VuZXJhdGVzIGJ5dGUtY29kZSBkbGwKLWJ5dGUtY29kZS1kbGw6CQkkKFBSRV9UQVJHRVRTKQotCQkJJChRVUlFVCkkKE1BS0UpIC1yIC1mICQoT0NBTUxNQUtFRklMRSkgXAotCQkJCSQoUkVTX0NMSUIpICQoQkNSRVNVTFQpLmRsbCBcCi0JCQkJUkVBTF9SRVNVTFQ9IiQoQkNSRVNVTFQpIiBcCi0JCQkJbWFrZV9kZXBzPXllcwotYmNkOglieXRlLWNvZGUtZGxsCi0KLSMgZ2VuZXJhdGVzIG5hdGl2ZS1jb2RlIGRsbAotbmF0aXZlLWNvZGUtZGxsOgkkKFBSRV9UQVJHRVRTKQotCQkJJChRVUlFVCkkKE1BS0UpIC1yIC1mICQoT0NBTUxNQUtFRklMRSkgXAotCQkJCSQoUkVTX0NMSUIpICQoTkNSRVNVTFQpLmRsbCBcCi0JCQkJUkVBTF9SRVNVTFQ9IiQoTkNSRVNVTFQpIiBcCi0JCQkJUkVBTF9PQ0FNTEM9IiQoT0NBTUxPUFQpIiBcCi0JCQkJbWFrZV9kZXBzPXllcwotbmNkOgluYXRpdmUtY29kZS1kbGwKLWVuZGlmCi0KLSMgZ2VuZXJhdGVzIGJ5dGUtY29kZSB3aXRoIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgotZGVidWctY29kZToJCSQoUFJFX1RBUkdFVFMpCi0JCQkkKFFVSUVUKSQoTUFLRSkgLXIgLWYgJChPQ0FNTE1BS0VGSUxFKSAkKEJDUkVTVUxUKSBcCi0JCQkJUkVBTF9SRVNVTFQ9IiQoQkNSRVNVTFQpIiBtYWtlX2RlcHM9eWVzIFwKLQkJCQlPQ0FNTEZMQUdTPSItZyAkKE9DQU1MRkxBR1MpIiBcCi0JCQkJT0NBTUxMREZMQUdTPSItZyAkKE9DQU1MTERGTEFHUykiCi1kYzoJZGVidWctY29kZQotCi1kZWJ1Zy1jb2RlLW5vbGluazoJJChQUkVfVEFSR0VUUykKLQkJCSQoUVVJRVQpJChNQUtFKSAtciAtZiAkKE9DQU1MTUFLRUZJTEUpIG5vbGluayBcCi0JCQkJUkVBTF9SRVNVTFQ9IiQoQkNSRVNVTFQpIiBtYWtlX2RlcHM9eWVzIFwKLQkJCQlPQ0FNTEZMQUdTPSItZyAkKE9DQU1MRkxBR1MpIiBcCi0JCQkJT0NBTUxMREZMQUdTPSItZyAkKE9DQU1MTERGTEFHUykiCi1kY25sOglkZWJ1Zy1jb2RlLW5vbGluawotCi0jIGdlbmVyYXRlcyBieXRlLWNvZGUgd2l0aCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gKG5hdGl2ZSBjb2RlKQotZGVidWctbmF0aXZlLWNvZGU6CSQoUFJFX1RBUkdFVFMpCi0JCQkkKFFVSUVUKSQoTUFLRSkgLXIgLWYgJChPQ0FNTE1BS0VGSUxFKSAkKE5DUkVTVUxUKSBcCi0JCQkJUkVBTF9SRVNVTFQ9IiQoTkNSRVNVTFQpIiBtYWtlX2RlcHM9eWVzIFwKLQkJCQlSRUFMX09DQU1MQz0iJChPQ0FNTE9QVCkiIFwKLQkJCQlPQ0FNTEZMQUdTPSItZyAkKE9DQU1MRkxBR1MpIiBcCi0JCQkJT0NBTUxMREZMQUdTPSItZyAkKE9DQU1MTERGTEFHUykiCi1kbmM6CWRlYnVnLW5hdGl2ZS1jb2RlCi0KLWRlYnVnLW5hdGl2ZS1jb2RlLW5vbGluazoJJChQUkVfVEFSR0VUUykKLQkJCSQoUVVJRVQpJChNQUtFKSAtciAtZiAkKE9DQU1MTUFLRUZJTEUpIG5vbGluayBcCi0JCQkJUkVBTF9SRVNVTFQ9IiQoTkNSRVNVTFQpIiBtYWtlX2RlcHM9eWVzIFwKLQkJCQlSRUFMX09DQU1MQz0iJChPQ0FNTE9QVCkiIFwKLQkJCQlPQ0FNTEZMQUdTPSItZyAkKE9DQU1MRkxBR1MpIiBcCi0JCQkJT0NBTUxMREZMQUdTPSItZyAkKE9DQU1MTERGTEFHUykiCi1kbmNubDoJZGVidWctbmF0aXZlLWNvZGUtbm9saW5rCi0KLSMgZ2VuZXJhdGVzIGJ5dGUtY29kZSBsaWJyYXJpZXMgd2l0aCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KLWRlYnVnLWNvZGUtbGlicmFyeToJJChQUkVfVEFSR0VUUykKLQkJCSQoUVVJRVQpJChNQUtFKSAtciAtZiAkKE9DQU1MTUFLRUZJTEUpIFwKLQkJCQkkKFJFU19DTElCKSAkKEJDUkVTVUxUKS5jbWEgXAotCQkJCVJFQUxfUkVTVUxUPSIkKEJDUkVTVUxUKSIgbWFrZV9kZXBzPXllcyBcCi0JCQkJQ1JFQVRFX0xJQj15ZXMgXAotCQkJCU9DQU1MRkxBR1M9Ii1nICQoT0NBTUxGTEFHUykiIFwKLQkJCQlPQ0FNTExERkxBR1M9Ii1nICQoT0NBTUxMREZMQUdTKSIKLWRjbDoJZGVidWctY29kZS1saWJyYXJ5Ci0KLSMgZ2VuZXJhdGVzIGJ5dGUtY29kZSBsaWJyYXJpZXMgd2l0aCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gKG5hdGl2ZSBjb2RlKQotZGVidWctbmF0aXZlLWNvZGUtbGlicmFyeToJJChQUkVfVEFSR0VUUykKLQkJCSQoUVVJRVQpJChNQUtFKSAtciAtZiAkKE9DQU1MTUFLRUZJTEUpIFwKLQkJCQkkKFJFU19DTElCKSAkKE5DUkVTVUxUKS5jbWEgXAotCQkJCVJFQUxfUkVTVUxUPSIkKE5DUkVTVUxUKSIgbWFrZV9kZXBzPXllcyBcCi0JCQkJUkVBTF9PQ0FNTEM9IiQoT0NBTUxPUFQpIiBcCi0JCQkJQ1JFQVRFX0xJQj15ZXMgXAotCQkJCU9DQU1MRkxBR1M9Ii1nICQoT0NBTUxGTEFHUykiIFwKLQkJCQlPQ0FNTExERkxBR1M9Ii1nICQoT0NBTUxMREZMQUdTKSIKLWRuY2w6CWRlYnVnLW5hdGl2ZS1jb2RlLWxpYnJhcnkKLQotIyBnZW5lcmF0ZXMgYnl0ZS1jb2RlIGZvciBwcm9maWxpbmcKLXByb2ZpbGluZy1ieXRlLWNvZGU6CQkkKFBSRV9UQVJHRVRTKQotCQkJJChRVUlFVCkkKE1BS0UpIC1yIC1mICQoT0NBTUxNQUtFRklMRSkgJChCQ1JFU1VMVCkgXAotCQkJCVJFQUxfUkVTVUxUPSIkKEJDUkVTVUxUKSIgUFJPRklMSU5HPSJ5IiBcCi0JCQkJbWFrZV9kZXBzPXllcwotcGJjOglwcm9maWxpbmctYnl0ZS1jb2RlCi0KLSMgZ2VuZXJhdGVzIG5hdGl2ZS1jb2RlCi0KLXByb2ZpbGluZy1uYXRpdmUtY29kZToJCSQoUFJFX1RBUkdFVFMpCi0JCQkkKFFVSUVUKSQoTUFLRSkgLXIgLWYgJChPQ0FNTE1BS0VGSUxFKSAkKE5DUkVTVUxUKSBcCi0JCQkJUkVBTF9SRVNVTFQ9IiQoTkNSRVNVTFQpIiBcCi0JCQkJUkVBTF9PQ0FNTEM9IiQoT0NBTUxPUFQpIiBcCi0JCQkJUFJPRklMSU5HPSJ5IiBcCi0JCQkJbWFrZV9kZXBzPXllcwotcG5jOglwcm9maWxpbmctbmF0aXZlLWNvZGUKLQotIyBnZW5lcmF0ZXMgYnl0ZS1jb2RlIGxpYnJhcmllcwotcHJvZmlsaW5nLWJ5dGUtY29kZS1saWJyYXJ5OgkkKFBSRV9UQVJHRVRTKQotCQkJJChRVUlFVCkkKE1BS0UpIC1yIC1mICQoT0NBTUxNQUtFRklMRSkgXAotCQkJCSQoUkVTX0NMSUIpICQoQkNSRVNVTFQpLmNtYSBcCi0JCQkJUkVBTF9SRVNVTFQ9IiQoQkNSRVNVTFQpIiBQUk9GSUxJTkc9InkiIFwKLQkJCQlDUkVBVEVfTElCPXllcyBcCi0JCQkJbWFrZV9kZXBzPXllcwotcGJjbDoJcHJvZmlsaW5nLWJ5dGUtY29kZS1saWJyYXJ5Ci0KLSMgZ2VuZXJhdGVzIG5hdGl2ZS1jb2RlIGxpYnJhcmllcwotcHJvZmlsaW5nLW5hdGl2ZS1jb2RlLWxpYnJhcnk6CSQoUFJFX1RBUkdFVFMpCi0JCQkkKFFVSUVUKSQoTUFLRSkgLXIgLWYgJChPQ0FNTE1BS0VGSUxFKSBcCi0JCQkJJChSRVNfQ0xJQikgJChOQ1JFU1VMVCkuY214YSBcCi0JCQkJUkVBTF9SRVNVTFQ9IiQoTkNSRVNVTFQpIiBQUk9GSUxJTkc9InkiIFwKLQkJCQlSRUFMX09DQU1MQz0iJChPQ0FNTE9QVCkiIFwKLQkJCQlDUkVBVEVfTElCPXllcyBcCi0JCQkJbWFrZV9kZXBzPXllcwotcG5jbDoJcHJvZmlsaW5nLW5hdGl2ZS1jb2RlLWxpYnJhcnkKLQotIyBwYWNrcyBieXRlLWNvZGUgb2JqZWN0cwotcGFjay1ieXRlLWNvZGU6CQkJJChQUkVfVEFSR0VUUykKLQkJCSQoUVVJRVQpJChNQUtFKSAtciAtZiAkKE9DQU1MTUFLRUZJTEUpICQoQkNSRVNVTFQpLmNtbyBcCi0JCQkJUkVBTF9SRVNVTFQ9IiQoQkNSRVNVTFQpIiBcCi0JCQkJUEFDS19MSUI9eWVzIG1ha2VfZGVwcz15ZXMKLXBhYmM6CXBhY2stYnl0ZS1jb2RlCi0KLSMgcGFja3MgbmF0aXZlLWNvZGUgb2JqZWN0cwotcGFjay1uYXRpdmUtY29kZToJCSQoUFJFX1RBUkdFVFMpCi0JCQkkKFFVSUVUKSQoTUFLRSkgLXIgLWYgJChPQ0FNTE1BS0VGSUxFKSBcCi0JCQkJJChOQ1JFU1VMVCkuY214ICQoTkNSRVNVTFQpLm8gXAotCQkJCVJFQUxfUkVTVUxUPSIkKE5DUkVTVUxUKSIgXAotCQkJCVJFQUxfT0NBTUxDPSIkKE9DQU1MT1BUKSIgXAotCQkJCVBBQ0tfTElCPXllcyBtYWtlX2RlcHM9eWVzCi1wYW5jOglwYWNrLW5hdGl2ZS1jb2RlCi0KLSMgZ2VuZXJhdGVzIEhUTUwtZG9jdW1lbnRhdGlvbgotaHRkb2M6CSQoRE9DX0RJUikvJChSRVNVTFQpL2h0bWwvaW5kZXguaHRtbAotCi0jIGdlbmVyYXRlcyBMYXRleC1kb2N1bWVudGF0aW9uCi1sYWRvYzoJJChET0NfRElSKS8kKFJFU1VMVCkvbGF0ZXgvZG9jLnRleAotCi0jIGdlbmVyYXRlcyBQb3N0U2NyaXB0LWRvY3VtZW50YXRpb24KLXBzZG9jOgkkKERPQ19ESVIpLyQoUkVTVUxUKS9sYXRleC9kb2MucHMKLQotIyBnZW5lcmF0ZXMgUERGLWRvY3VtZW50YXRpb24KLXBkZmRvYzoJJChET0NfRElSKS8kKFJFU1VMVCkvbGF0ZXgvZG9jLnBkZgotCi0jIGdlbmVyYXRlcyBhbGwgc3VwcG9ydGVkIGZvcm1zIG9mIGRvY3VtZW50YXRpb24KLWRvYzogaHRkb2MgbGFkb2MgcHNkb2MgcGRmZG9jCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBMT1cgTEVWRUwgUlVMRVMKLQotJChSRUFMX1JFU1VMVCk6CQkkKFJFQUxfSU1QTF9JTlRGKSAkKE9CSl9MSU5LKSAkKEVYVFJBREVQUykgJChSRVNVTFRERVBTKQotCQkJJChSRUFMX09DQU1MRklORCkgJChSRUFMX09DQU1MQykgXAotCQkJCSQoT0NBTUxfRklORF9QQUNLQUdFUykgJChPQ0FNTF9GSU5EX0xJTktQS0cpIFwKLQkJCQkkKEFMTF9MREZMQUdTKSAkKE9CSlNfTElCUykgLW8gJEAkKEVYRSkgXAotCQkJCSQoUkVBTF9JTVBMKQotCi1ub2xpbms6CQkJJChSRUFMX0lNUExfSU5URikgJChPQkpfTElOSykKLQotaWZkZWYgV0lOMzIKLSQoUkVBTF9SRVNVTFQpLmRsbDoJJChSRUFMX0lNUExfSU5URikgJChPQkpfTElOSykKLQkJCSQoQ0FNTElETERMTCkgJChDQU1MSURMRExMRkxBR1MpICQoT0JKX0xJTkspICQoQ0xJQlMpIFwKLQkJCQktbyAkQCAkKFJFQUxfSU1QTCkKLWVuZGlmCi0KLSUkKFRPUFNVRkZJWCk6CQkkKFJFQUxfSU1QTF9JTlRGKSAkKE9CSl9MSU5LKSAkKEVYVFJBREVQUykKLQkJCSQoUkVBTF9PQ0FNTEZJTkQpICQoT0NBTUxNS1RPUCkgXAotCQkJCSQoT0NBTUxfRklORF9QQUNLQUdFUykgJChPQ0FNTF9GSU5EX0xJTktQS0cpIFwKLQkJCQkkKEFMTF9MREZMQUdTKSAkKE9CSlNfTElCUykgLW8gJEAkKEVYRSkgXAotCQkJCSQoUkVBTF9JTVBMKQotCi0uU1VGRklYRVM6CQkubWxpIC5tbCAuY21pIC5jbW8gLmNteCAuY21hIC5jbXhhIC4kKEVYVF9PQkopIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5tbHkgLmRpIC5kIC4kKEVYVF9MSUIpIC5pZGwgJS5veHJpZGwgLmMgLm0gLiQoRVhUX0NYWCkgLmggLnNvIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIC5yZXAgLnpvZyAuZ2xhZGUKLQotaWZuZGVmIFNUQVRJQwotaWZkZWYgTUlOR1cKLSQoRExMU09OQU1FKToJCSQoT0JKX0xJTkspCi0JCQkkKENDKSAkKENGTEFHUykgJChDRkxBR1NfV0lOMzIpICQoT0JKX0xJTkspIC1zaGFyZWQgLW8gJEAgXAotCQkJLVdsLC0td2hvbGUtYXJjaGl2ZSAkKHdpbGRjYXJkICQoZm9yZWFjaCBkaXIsJChMSUJESVJTKSwkKENMSUJTOiU9JChkaXIpL2xpYiUuYSkpKSBcCi0JCQkgJChPQ0FNTExJQlBBVEgpL29jYW1scnVuLmEgXAotCQkJLVdsLC0tZXhwb3J0LWFsbC1zeW1ib2xzIFwKLQkJCS1XbCwtLW5vLXdob2xlLWFyY2hpdmUKLWVsc2UKLWlmZGVmIE1TVkMKLSQoRExMU09OQU1FKToJCSQoT0JKX0xJTkspCi0JCQlsaW5rIC9OT0xPR08gL0RMTCAvT1VUOiRAICQoT0JKX0xJTkspIFwKLQkJCSAkKHdpbGRjYXJkICQoZm9yZWFjaCBkaXIsJChMSUJESVJTKSwkKENMSUJTOiU9JChkaXIpLyUubGliKSkpIFwKLQkJCSAkKE9DQU1MTElCUEFUSCkvb2NhbWxydW4ubGliCi0KLWVsc2UKLSQoRExMU09OQU1FKToJCSQoT0JKX0xJTkspCi0JCQkkKE9DQU1MTUtMSUIpICQoSU5DRkxBR1MpICQoQ0xJQkZMQUdTKSBcCi0JCQkJLW8gJChDTElCX0JBU0UpICQoT0JKX0xJTkspICQoQ0xJQlM6JT0tbCUpICQoQ0ZSQU1FV09SS1M6JT0tZnJhbWV3b3JrICUpIFwKLQkJCQkkKE9DQU1MTUtMSUJfRkxBR1MpCi1lbmRpZgotZW5kaWYKLWVuZGlmCi0KLWlmbmRlZiBMSUJfUEFDS19OQU1FCi0kKFJFU1VMVCkuY21hOgkJJChSRUFMX0lNUExfSU5URikgJChNQUtFRExMKSAkKEVYVFJBREVQUykgJChSRVNVTFRERVBTKQotCQkJJChSRUFMX09DQU1MRklORCkgJChSRUFMX09DQU1MQykgLWEgJChBTExfTERGTEFHUykgJChPQkpTX0xJQlMpIC1vICRAICQoUkVBTF9JTVBMKQotCi0kKFJFU1VMVCkuY214YSAkKFJFU1VMVCkuJChFWFRfTElCKToJJChSRUFMX0lNUExfSU5URikgJChFWFRSQURFUFMpICQoUkVTVUxUREVQUykKLQkJCSQoUkVBTF9PQ0FNTEZJTkQpICQoT0NBTUxPUFQpIC1hICQoQUxMX0xERkxBR1MpICQoT0JKU19MSUJTKSAtbyAkQCAkKFJFQUxfSU1QTCkKLWVsc2UKLWlmZGVmIEJZVEVfT0NBTUwKLSQoTElCX1BBQ0tfTkFNRSkuY21pICQoTElCX1BBQ0tfTkFNRSkuY21vOiAkKFJFQUxfSU1QTF9JTlRGKQotCQkJJChSRUFMX09DQU1MRklORCkgJChSRUFMX09DQU1MQykgLXBhY2sgLW8gJChMSUJfUEFDS19OQU1FKS5jbW8gJChPQ0FNTExERkxBR1MpICQoUkVBTF9JTVBMKQotZWxzZQotJChMSUJfUEFDS19OQU1FKS5jbWkgJChMSUJfUEFDS19OQU1FKS5jbXg6ICQoUkVBTF9JTVBMX0lOVEYpCi0JCQkkKFJFQUxfT0NBTUxGSU5EKSAkKE9DQU1MT1BUKSAtcGFjayAtbyAkKExJQl9QQUNLX05BTUUpLmNteCAgJChPQ0FNTExERkxBR1MpICQoUkVBTF9JTVBMKQotZW5kaWYKLQotJChSRVNVTFQpLmNtYToJCSQoTElCX1BBQ0tfTkFNRSkuY21pICQoTElCX1BBQ0tfTkFNRSkuY21vICQoTUFLRURMTCkgJChFWFRSQURFUFMpICQoUkVTVUxUREVQUykKLQkJCSQoUkVBTF9PQ0FNTEZJTkQpICQoUkVBTF9PQ0FNTEMpIC1hICQoQUxMX0xERkxBR1MpICQoT0JKU19MSUJTKSAtbyAkQCAkKExJQl9QQUNLX05BTUUpLmNtbwotCi0kKFJFU1VMVCkuY214YSAkKFJFU1VMVCkuJChFWFRfTElCKToJJChMSUJfUEFDS19OQU1FKS5jbWkgJChMSUJfUEFDS19OQU1FKS5jbXggJChFWFRSQURFUFMpICQoUkVTVUxUREVQUykKLQkJCSQoUkVBTF9PQ0FNTEZJTkQpICQoT0NBTUxPUFQpIC1hICQoZmlsdGVyLW91dCAtY3VzdG9tLCAkKEFMTF9MREZMQUdTKSkgJChPQkpTX0xJQlMpIC1vICRAICQoTElCX1BBQ0tfTkFNRSkuY214Ci1lbmRpZgotCi0kKFJFU19DTElCKTogCQkkKE9CSl9MSU5LKQotaWZuZGVmIE1TVkMKLSAgaWZuZXEgKCQoc3RyaXAgJChPQkpfTElOSykpLCkKLQkJICAgICAgJChBUikgcmNzICRAICQoT0JKX0xJTkspCi0gIGVuZGlmCi1lbHNlCi0gIGlmbmVxICgkKHN0cmlwICQoT0JKX0xJTkspKSwpCi0JCQlsaWIgLW5vbG9nbyAtZGVidWd0eXBlOmN2IC1vdXQ6JChSRVNfQ0xJQikgJChPQkpfTElOSykKLSAgZW5kaWYKLWVuZGlmCi0KLS5tbGkuY21pOiAkKEVYVFJBREVQUykKLQkJCSQoUVVJRVQpcHA9YHNlZCAtbiAtZSAnL14jL2QnIC1lICdzLyhcKnBwIFwoW14qXSpcKSBcKikvXDEvcDtxJyAkPGA7IFwKLQkJCWlmIFsgLXogIiQkcHAiIF07IHRoZW4gXAotCQkJICAkKEVDSE8pICQoUkVBTF9PQ0FNTEZJTkQpICQoSU5URl9PQ0FNTEMpICQoT0NBTUxfRklORF9QQUNLQUdFUykgXAotCQkJCS1jICQoVEhSRUFEX0ZMQUcpICQoQU5OT1RfRkxBRykgXAotCQkJCSQoT0NBTUxGTEFHUykgJChJTkNGTEFHUykgJDw7IFwKLQkJCSAgJChSRUFMX09DQU1MRklORCkgJChJTlRGX09DQU1MQykgJChPQ0FNTF9GSU5EX1BBQ0tBR0VTKSBcCi0JCQkJLWMgJChUSFJFQURfRkxBRykgJChBTk5PVF9GTEFHKSBcCi0JCQkJJChPQ0FNTEZMQUdTKSAkKElOQ0ZMQUdTKSAkPDsgXAotCQkJZWxzZSBcCi0JCQkgICAgJChFQ0hPKSAkKFJFQUxfT0NBTUxGSU5EKSAkKElOVEZfT0NBTUxDKSAkKE9DQU1MX0ZJTkRfUEFDS0FHRVMpIFwKLQkJCQktYyAtcHAgXCIkJHBwICQoUFBGTEFHUylcIiAkKFRIUkVBRF9GTEFHKSAkKEFOTk9UX0ZMQUcpIFwKLQkJCQkkKE9DQU1MRkxBR1MpICQoSU5DRkxBR1MpICQ8OyBcCi0JCQkgICAgJChSRUFMX09DQU1MRklORCkgJChJTlRGX09DQU1MQykgJChPQ0FNTF9GSU5EX1BBQ0tBR0VTKSBcCi0JCQkJLWMgLXBwICIkJHBwICQoUFBGTEFHUykiICQoVEhSRUFEX0ZMQUcpICQoQU5OT1RfRkxBRykgXAotCQkJCSQoT0NBTUxGTEFHUykgJChJTkNGTEFHUykgJDw7IFwKLQkJCWZpCi0KLS5tbC5jbWkgLm1sLiQoRVhUX09CSikgLm1sLmNteCAubWwuY21vOiAkKEVYVFJBREVQUykKLQkJCSQoUVVJRVQpcHA9YHNlZCAtbiAtZSAnL14jL2QnIC1lICdzLyhcKnBwIFwoW14qXSpcKSBcKikvXDEvcDtxJyAkPGA7IFwKLQkJCWlmIFsgLXogIiQkcHAiIF07IHRoZW4gXAotCQkJICAkKEVDSE8pICQoUkVBTF9PQ0FNTEZJTkQpICQoUkVBTF9PQ0FNTEMpICQoT0NBTUxfRklORF9QQUNLQUdFUykgXAotCQkJCS1jICQoQUxMX09DQU1MQ0ZMQUdTKSAkPDsgXAotCQkJICAkKFJFQUxfT0NBTUxGSU5EKSAkKFJFQUxfT0NBTUxDKSAkKE9DQU1MX0ZJTkRfUEFDS0FHRVMpIFwKLQkJCQktYyAkKEFMTF9PQ0FNTENGTEFHUykgJDw7IFwKLQkJCWVsc2UgXAotCQkJICAkKEVDSE8pICQoUkVBTF9PQ0FNTEZJTkQpICQoUkVBTF9PQ0FNTEMpICQoT0NBTUxfRklORF9QQUNLQUdFUykgXAotCQkJCS1jIC1wcCBcIiQkcHAgJChQUEZMQUdTKVwiICQoQUxMX09DQU1MQ0ZMQUdTKSAkPDsgXAotCQkJICAkKFJFQUxfT0NBTUxGSU5EKSAkKFJFQUxfT0NBTUxDKSAkKE9DQU1MX0ZJTkRfUEFDS0FHRVMpIFwKLQkJCQktYyAtcHAgIiQkcHAgJChQUEZMQUdTKSIgJChBTExfT0NBTUxDRkxBR1MpICQ8OyBcCi0JCQlmaQotCi1pZmRlZiBQQUNLX0xJQgotJChSRUFMX1JFU1VMVCkuY21vICQoUkVBTF9SRVNVTFQpLmNteCAkKFJFQUxfUkVTVUxUKS5vOiAkKFJFQUxfSU1QTF9JTlRGKSAkKE9CSl9MSU5LKSAkKEVYVFJBREVQUykKLQkJCSQoUkVBTF9PQ0FNTEZJTkQpICQoUkVBTF9PQ0FNTEMpIC1wYWNrICQoQUxMX0xERkxBR1MpIFwKLQkJCQkkKE9CSlNfTElCUykgLW8gJEAgJChSRUFMX0lNUEwpCi1lbmRpZgotCi0uUFJFQ0lPVVM6CQklLm1sCi0lLm1sOgkJCSUubWxsCi0JCQkkKE9DQU1MTEVYKSAkKExGTEFHUykgJDwKLQotLlBSRUNJT1VTOiAgICAgICAgICAgICAgJS5tbCAlLm1saQotJS5tbCAlLm1saTogICAgICAgICAgICAgJS5tbHkKLQkJCSQoT0NBTUxZQUNDKSAkKFlGTEFHUykgJDwKLQkJCSQoUVVJRVQpcHA9YHNlZCAtbiAtZSAncy8uKihcKnBwIFwoW14qXSpcKSBcKikuKi9cMS9wO3EnICQ8YDsgXAotCQkJaWYgWyAhIC16ICIkJHBwIiBdOyB0aGVuIFwKLQkJCSAgbXYgJCoubWwgJCoubWwudGVtcG9yYXJ5OyBcCi0JCQkgIGVjaG8gIigqcHAgJCRwcCAkKFBQRkxBR1MpKikiID4gJCoubWw7IFwKLQkJCSAgY2F0ICQqLm1sLnRlbXBvcmFyeSA+PiAkKi5tbDsgXAotCQkJICBybSAkKi5tbC50ZW1wb3Jhcnk7IFwKLQkJCSAgbXYgJCoubWxpICQqLm1saS50ZW1wb3Jhcnk7IFwKLQkJCSAgZWNobyAiKCpwcCAkJHBwICQoUFBGTEFHUykqKSIgPiAkKi5tbGk7IFwKLQkJCSAgY2F0ICQqLm1saS50ZW1wb3JhcnkgPj4gJCoubWxpOyBcCi0JCQkgIHJtICQqLm1saS50ZW1wb3Jhcnk7IFwKLQkJCWZpCi0KLQotLlBSRUNJT1VTOgkJJS5tbAotJS5tbDoJCQklLnJlcAotCQkJJChDQU1FTEVPTl9SRVBPUlQpICQoQ0FNRUxFT05fUkVQT1JUX0ZMQUdTKSAtZ2VuICQ8Ci0KLS5QUkVDSU9VUzoJCSUubWwKLSUubWw6CQkJJS56b2cKLQkJCSQoQ0FNRUxFT05fWk9HR1kpICAkKENBTUVMRU9OX1pPR0dZX0ZMQUdTKSAtaW1wbCAkPCA+ICRACi0KLS5QUkVDSU9VUzoJCSUubWwKLSUubWw6CQkJJS5nbGFkZQotCQkJJChPQ0FNTF9HTEFERUNDKSAgJChPQ0FNTF9HTEFERUNDX0ZMQUdTKSAkPCA+ICRACi0KLS5QUkVDSU9VUzoJCSUubWwgJS5tbGkKLSUubWwgJS5tbGk6CQklLm94cmlkbAotCQkJJChPWFJJREwpICQ8Ci0KLS5QUkVDSU9VUzoJCSUubWwgJS5tbGkgJV9zdHVicy5jICUuaAotJS5tbCAlLm1saSAlX3N0dWJzLmMgJS5oOgkJJS5pZGwKLQkJCSQoQ0FNTElETCkgJChNQVlCRV9JRExfSEVBREVSKSAkKElETEZMQUdTKSBcCi0JCQkJJChDQU1MSURMRkxBR1MpICQ8Ci0JCQkkKFFVSUVUKWlmIFsgJChOT0lETEhFQURFUikgXTsgdGhlbiB0b3VjaCAkKi5oOyBmaQotCi0uYy4kKEVYVF9PQkopOgotCQkJJChPQ0FNTEMpIC1jIC1jYyAiJChDQykiIC1jY29wdCAiJChDRkxBR1MpIFwKLQkJCQkkKENQUEZMQUdTKSAkKENQUEZMQUdTX1dJTjMyKSBcCi0JCQkJJChDRkxBR1NfV0lOMzIpICQoQ0lOQ0ZMQUdTKSAkKENGTEFHX08pJEAgIiAkPAotCi0ubS4kKEVYVF9PQkopOgotCQkJJChDQykgLWMgJChDRkxBR1MpICQoQ0lOQ0ZMQUdTKSAkKENQUEZMQUdTKSBcCi0JCQkJLUknJChPQ0FNTExJQlBBVEgpJyBcCi0JCQkJJDwgJChDRkxBR19PKSRACi0KLS4kKEVYVF9DWFgpLiQoRVhUX09CSik6Ci0JCQkkKENYWCkgLWMgJChDWFhGTEFHUykgJChDSU5DRkxBR1MpICQoQ1BQRkxBR1MpIFwKLQkJCQktSSckKE9DQU1MTElCUEFUSCknIFwKLQkJCQkkPCAkKENGTEFHX08pJEAKLQotJChNTERFUERJUikvJS5kOgklLm1sCi0JCQkkKFFVSUVUKWlmIFsgISAtZCAkKEBEKSBdOyB0aGVuIG1rZGlyIC1wICQoQEQpOyBmaQotCQkJJChRVUlFVClwcD1gc2VkIC1uIC1lICcvXiMvZCcgLWUgJ3MvKFwqcHAgXChbXipdKlwpIFwqKS9cMS9wO3EnICQ8YDsgXAotCQkJaWYgWyAteiAiJCRwcCIgXTsgdGhlbiBcCi0JCQkgICQoRUNITykgJChSRUFMX09DQU1MRklORCkgJChPQ0FNTERFUCkgJChPQ0FNTF9ERVBfUEFDS0FHRVMpIFwKLQkJCQkkKERJTkNGTEFHUykgJDwgXD4gJEA7IFwKLQkJCSAgJChSRUFMX09DQU1MRklORCkgJChPQ0FNTERFUCkgJChPQ0FNTF9ERVBfUEFDS0FHRVMpIFwKLQkJCQkkKERJTkNGTEFHUykgJDwgPiAkQDsgXAotCQkJZWxzZSBcCi0JCQkgICQoRUNITykgJChSRUFMX09DQU1MRklORCkgJChPQ0FNTERFUCkgJChPQ0FNTF9ERVBfUEFDS0FHRVMpIFwKLQkJCQktcHAgXCIkJHBwICQoUFBGTEFHUylcIiAkKERJTkNGTEFHUykgJDwgXD4gJEA7IFwKLQkJCSAgJChSRUFMX09DQU1MRklORCkgJChPQ0FNTERFUCkgJChPQ0FNTF9ERVBfUEFDS0FHRVMpIFwKLQkJCQktcHAgIiQkcHAgJChQUEZMQUdTKSIgJChESU5DRkxBR1MpICQ8ID4gJEA7IFwKLQkJCWZpCi0KLSQoQkNESURJUikvJS5kaSAkKE5DRElESVIpLyUuZGk6CSUubWxpCi0JCQkkKFFVSUVUKWlmIFsgISAtZCAkKEBEKSBdOyB0aGVuIG1rZGlyIC1wICQoQEQpOyBmaQotCQkJJChRVUlFVClwcD1gc2VkIC1uIC1lICcvXiMvZCcgLWUgJ3MvKFwqcHAgXChbXipdKlwpIFwqKS9cMS9wO3EnICQ8YDsgXAotCQkJaWYgWyAteiAiJCRwcCIgXTsgdGhlbiBcCi0JCQkgICQoRUNITykgJChSRUFMX09DQU1MRklORCkgJChPQ0FNTERFUCkgJChERVBGTEFHUykgJChESU5DRkxBR1MpICQ8IFw+ICRAOyBcCi0JCQkgICQoUkVBTF9PQ0FNTEZJTkQpICQoT0NBTUxERVApICQoREVQRkxBR1MpICQoRElOQ0ZMQUdTKSAkPCA+ICRAOyBcCi0JCQllbHNlIFwKLQkJCSAgJChFQ0hPKSAkKFJFQUxfT0NBTUxGSU5EKSAkKE9DQU1MREVQKSAkKERFUEZMQUdTKSBcCi0JCQkgICAgLXBwIFwiJCRwcCAkKFBQRkxBR1MpXCIgJChESU5DRkxBR1MpICQ8IFw+ICRAOyBcCi0JCQkgICQoUkVBTF9PQ0FNTEZJTkQpICQoT0NBTUxERVApICQoREVQRkxBR1MpIFwKLQkJCSAgICAtcHAgIiQkcHAgJChQUEZMQUdTKSIgJChESU5DRkxBR1MpICQ8ID4gJEA7IFwKLQkJCWZpCi0KLSQoRE9DX0RJUikvJChSRVNVTFQpL2h0bWw6Ci0JbWtkaXIgLXAgJEAKLQotJChET0NfRElSKS8kKFJFU1VMVCkvaHRtbC9pbmRleC5odG1sOiAkKERPQ19ESVIpLyQoUkVTVUxUKS9odG1sICQoRE9DX0ZJTEVTKQotCXJtIC1yZiAkPC8qCi0JJChRVUlFVClwcD1gc2VkIC1uIC1lICcvXiMvZCcgLWUgJ3MvKFwqcHAgXChbXipdKlwpIFwqKS9cMS9wO3EnICQoRklSU1RfRE9DX0ZJTEUpYDsgXAotCWlmIFsgLXogIiQkcHAiIF07IHRoZW4gXAotCSAgJChFQ0hPKSAkKFJFQUxfT0NBTUxGSU5EKSAkKE9DQU1MRE9DKSAkKE9DQU1MX0ZJTkRfUEFDS0FHRVMpIC1odG1sIC1kICQ8ICQoT0NBTUxET0NGTEFHUykgJChJTkNGTEFHUykgJChET0NfRklMRVMpOyBcCi0JICAkKFJFQUxfT0NBTUxGSU5EKSAkKE9DQU1MRE9DKSAkKE9DQU1MX0ZJTkRfUEFDS0FHRVMpIC1odG1sIC1kICQ8ICQoT0NBTUxET0NGTEFHUykgJChJTkNGTEFHUykgJChET0NfRklMRVMpOyBcCi0JZWxzZSBcCi0JICAkKEVDSE8pICQoUkVBTF9PQ0FNTEZJTkQpICQoT0NBTUxET0MpICQoT0NBTUxfRklORF9QQUNLQUdFUykgLXBwIFwiJCRwcCAkKFBQRkxBR1MpXCIgLWh0bWwgLWQgJDwgJChPQ0FNTERPQ0ZMQUdTKSBcCi0JICAJJChJTkNGTEFHUykgJChET0NfRklMRVMpOyBcCi0JICAkKFJFQUxfT0NBTUxGSU5EKSAkKE9DQU1MRE9DKSAkKE9DQU1MX0ZJTkRfUEFDS0FHRVMpIC1wcCAiJCRwcCAkKFBQRkxBR1MpIiAtaHRtbCAtZCAkPCAkKE9DQU1MRE9DRkxBR1MpIFwKLQkgIAkkKElOQ0ZMQUdTKSAkKERPQ19GSUxFUyk7IFwKLQlmaQotCi0kKERPQ19ESVIpLyQoUkVTVUxUKS9sYXRleDoKLQlta2RpciAtcCAkQAotCi0kKERPQ19ESVIpLyQoUkVTVUxUKS9sYXRleC9kb2MudGV4OiAkKERPQ19ESVIpLyQoUkVTVUxUKS9sYXRleCAkKERPQ19GSUxFUykKLQlybSAtcmYgJDwvKgotCSQoUVVJRVQpcHA9YHNlZCAtbiAtZSAnL14jL2QnIC1lICdzLyhcKnBwIFwoW14qXSpcKSBcKikvXDEvcDtxJyAkKEZJUlNUX0RPQ19GSUxFKWA7IFwKLQlpZiBbIC16ICIkJHBwIiBdOyB0aGVuIFwKLQkgICQoRUNITykgJChSRUFMX09DQU1MRklORCkgJChPQ0FNTERPQykgJChPQ0FNTF9GSU5EX1BBQ0tBR0VTKSAtbGF0ZXggJChPQ0FNTERPQ0ZMQUdTKSAkKElOQ0ZMQUdTKSBcCi0JICAJJChET0NfRklMRVMpIC1vICRAOyBcCi0JICAkKFJFQUxfT0NBTUxGSU5EKSAkKE9DQU1MRE9DKSAkKE9DQU1MX0ZJTkRfUEFDS0FHRVMpIC1sYXRleCAkKE9DQU1MRE9DRkxBR1MpICQoSU5DRkxBR1MpICQoRE9DX0ZJTEVTKSBcCi0JICAJLW8gJEA7IFwKLQllbHNlIFwKLQkgICQoRUNITykgJChSRUFMX09DQU1MRklORCkgJChPQ0FNTERPQykgJChPQ0FNTF9GSU5EX1BBQ0tBR0VTKSAtcHAgXCIkJHBwICQoUFBGTEFHUylcIiAtbGF0ZXggJChPQ0FNTERPQ0ZMQUdTKSBcCi0JICAJJChJTkNGTEFHUykgJChET0NfRklMRVMpIC1vICRAOyBcCi0JICAkKFJFQUxfT0NBTUxGSU5EKSAkKE9DQU1MRE9DKSAkKE9DQU1MX0ZJTkRfUEFDS0FHRVMpIC1wcCAiJCRwcCAkKFBQRkxBR1MpIiAtbGF0ZXggJChPQ0FNTERPQ0ZMQUdTKSBcCi0JICAJJChJTkNGTEFHUykgJChET0NfRklMRVMpIC1vICRAOyBcCi0JZmkKLQotJChET0NfRElSKS8kKFJFU1VMVCkvbGF0ZXgvZG9jLnBzOiAkKERPQ19ESVIpLyQoUkVTVUxUKS9sYXRleC9kb2MudGV4Ci0JY2QgJChET0NfRElSKS8kKFJFU1VMVCkvbGF0ZXggJiYgXAotCSAgJChMQVRFWCkgZG9jLnRleCAmJiBcCi0JICAkKExBVEVYKSBkb2MudGV4ICYmIFwKLQkgICQoRFZJUFMpICQoRFZJUFNGTEFHUykgZG9jLmR2aSAtbyAkKEBGKQotCi0kKERPQ19ESVIpLyQoUkVTVUxUKS9sYXRleC9kb2MucGRmOiAkKERPQ19ESVIpLyQoUkVTVUxUKS9sYXRleC9kb2MucHMKLQljZCAkKERPQ19ESVIpLyQoUkVTVUxUKS9sYXRleCAmJiAkKFBTMlBERikgJCg8RikKLQotZGVmaW5lIG1ha2Vfc3VicHJvagotLlBIT05ZOgotc3VicHJval8kKDEpOgotCSQkKGV2YWwgJCQoY2FsbCBQUk9KXyQoMSkpKQotCSQoUVVJRVQpaWYgWyAiJChTVUJUQVJHRVQpIiAhPSAiYWxsIiBdOyB0aGVuIFwKLQkgICQoTUFLRSkgLWYgJChPQ0FNTE1BS0VGSUxFKSAkKFNVQlRBUkdFVCk7IFwKLQlmaQotZW5kZWYKLQotJChmb3JlYWNoIHN1YnByb2osJChTVUJQUk9KUyksJChldmFsICQoY2FsbCBtYWtlX3N1YnByb2osJChzdWJwcm9qKSkpKQotCi0uUEhPTlk6Ci1zdWJwcm9qczogJChTVUJQUk9KUzolPXN1YnByb2pfJSkKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIChVTilJTlNUQUxMIFJVTEVTIEZPUiBMSUJSQVJJRVMKLQotLlBIT05ZOiBsaWJpbnN0YWxsCi1saWJpbnN0YWxsOglhbGwKLQkkKFFVSUVUKXByaW50ZiAiXG5JbnN0YWxsaW5nIGxpYnJhcnkgd2l0aCBvY2FtbGZpbmRcbiIKLQkkKE9DQU1MRklORCkgaW5zdGFsbCAkKE9DQU1MRklORF9JTlNURkxBR1MpICQoUkVTVUxUKSBNRVRBICQoTElCSU5TVEFMTF9GSUxFUykKLQkkKFFVSUVUKXByaW50ZiAiXG5JbnN0YWxsYXRpb24gc3VjY2Vzc2Z1bC5cbiIKLQotLlBIT05ZOiBsaWJpbnN0YWxsLWJ5dGUtY29kZQotbGliaW5zdGFsbC1ieXRlLWNvZGU6CWFsbAotCSQoUVVJRVQpcHJpbnRmICJcbkluc3RhbGxpbmcgYnl0ZS1jb2RlIGxpYnJhcnkgd2l0aCBvY2FtbGZpbmRcbiIKLQkkKE9DQU1MRklORCkgaW5zdGFsbCAkKE9DQU1MRklORF9JTlNURkxBR1MpICQoUkVTVUxUKSBNRVRBIFwKLQkgICQoZmlsdGVyLW91dCAkKFJFU1VMVCkuJChFWFRfTElCKSAkKFJFU1VMVCkuY214YSwgJChMSUJJTlNUQUxMX0ZJTEVTKSkKLQkkKFFVSUVUKXByaW50ZiAiXG5JbnN0YWxsYXRpb24gc3VjY2Vzc2Z1bC5cbiIKLQotLlBIT05ZOiBsaWJpbnN0YWxsLW5hdGl2ZS1jb2RlCi1saWJpbnN0YWxsLW5hdGl2ZS1jb2RlOglhbGwKLQkkKFFVSUVUKXByaW50ZiAiXG5JbnN0YWxsaW5nIG5hdGl2ZS1jb2RlIGxpYnJhcnkgd2l0aCBvY2FtbGZpbmRcbiIKLQkkKE9DQU1MRklORCkgaW5zdGFsbCAkKE9DQU1MRklORF9JTlNURkxBR1MpICQoUkVTVUxUKSBNRVRBIFwKLQkgICQoZmlsdGVyLW91dCAkKERMTFNPTkFNRSkgJChSRVNVTFQpLmNtYSwgJChMSUJJTlNUQUxMX0ZJTEVTKSkKLQkkKFFVSUVUKXByaW50ZiAiXG5JbnN0YWxsYXRpb24gc3VjY2Vzc2Z1bC5cbiIKLQotLlBIT05ZOiBsaWJ1bmluc3RhbGwKLWxpYnVuaW5zdGFsbDoKLQkkKFFVSUVUKXByaW50ZiAiXG5Vbmluc3RhbGxpbmcgbGlicmFyeSB3aXRoIG9jYW1sZmluZFxuIgotCSQoT0NBTUxGSU5EKSByZW1vdmUgJChPQ0FNTEZJTkRfSU5TVEZMQUdTKSAkKFJFU1VMVCkKLQkkKFFVSUVUKXByaW50ZiAiXG5Vbmluc3RhbGxhdGlvbiBzdWNjZXNzZnVsLlxuIgotCi0uUEhPTlk6IHJhd2luc3RhbGwKLXJhd2luc3RhbGw6CWFsbAotCSQoUVVJRVQpcHJpbnRmICJcbkluc3RhbGxpbmcgbGlicmFyeSB0bzogJChPQ0FNTF9MSUJfSU5TVEFMTClcbiIKLQktaW5zdGFsbCAtZCAkKE9DQU1MX0xJQl9JTlNUQUxMKQotCWZvciBpIGluICQoTElCSU5TVEFMTF9GSUxFUyk7IGRvIFwKLQkgIGlmIFsgLWYgJCRpIF07IHRoZW4gXAotCSAgICBpbnN0YWxsIC1jIC1tIDA2NDQgJCRpICQoT0NBTUxfTElCX0lOU1RBTEwpOyBcCi0JICBmaTsgXAotCWRvbmUKLQkkKFFVSUVUKXByaW50ZiAiXG5JbnN0YWxsYXRpb24gc3VjY2Vzc2Z1bC5cbiIKLQotLlBIT05ZOiByYXd1bmluc3RhbGwKLXJhd3VuaW5zdGFsbDoKLQkkKFFVSUVUKXByaW50ZiAiXG5Vbmluc3RhbGxpbmcgbGlicmFyeSBmcm9tOiAkKE9DQU1MX0xJQl9JTlNUQUxMKVxuIgotCWNkICQoT0NBTUxfTElCX0lOU1RBTEwpICYmIHJtICQobm90ZGlyICQoTElCSU5TVEFMTF9GSUxFUykpCi0JJChRVUlFVClwcmludGYgIlxuVW5pbnN0YWxsYXRpb24gc3VjY2Vzc2Z1bC5cbiIKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIE1BSU5URU5BTkNFIFJVTEVTCi0KLS5QSE9OWToJY2xlYW4KLWNsZWFuOjoKLQlybSAtZiAkKFRBUkdFVFMpICQoVFJBU0gpCi0Jcm0gLXJmICQoQkNESURJUikgJChOQ0RJRElSKSAkKE1MREVQRElSKQotCi0uUEhPTlk6CWNsZWFudXAKLWNsZWFudXA6OgotCXJtIC1mICQoTk9ORVhFQ1MpICQoVFJBU0gpCi0Jcm0gLXJmICQoQkNESURJUikgJChOQ0RJRElSKSAkKE1MREVQRElSKQotCi0uUEhPTlk6IGNsZWFuLWRvYwotY2xlYW4tZG9jOjoKLQlybSAtcmYgJChET0NfRElSKS8kKFJFU1VMVCkKLQotLlBIT05ZOiBjbGVhbi1hbGwKLWNsZWFuLWFsbDo6IGNsZWFuIGNsZWFuLWRvYwotCi0uUEhPTlk6IG5vYmFja3VwCi1ub2JhY2t1cDoKLQlybSAtZiAqLmJhayAqfiAqLmR1cApkaWZmIC0tZ2l0IGEvbGliL29jYW1sL1JFQURNRS1PQ2FtbE1ha2VmaWxlIGIvbGliL29jYW1sL1JFQURNRS1PQ2FtbE1ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2VmMDE5Li4wMDAwMDAwCi0tLSBhL2xpYi9vY2FtbC9SRUFETUUtT0NhbWxNYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDY0MyArMCwwIEBACi1OT1RFIChicnlhbmR1eGJ1cnkpOiBPQ2FtbE1ha2VmaWxlIGlzIHNhZmUgdG8gaW5jbHVkZSBpbiB0aGUgcHJvamVjdCBhZnRlcgotaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9MRUdBTC01OC4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIERpc3RyaWJ1dGlvbiBvZiAib2NhbWxfbWFrZSIKLSAgICAgQ29weXJpZ2h0IChDKSAxOTk5IC0gMjAwNiAgTWFya3VzIE1vdHRsIC0gZnJlZSB0byBjb3B5IGFuZCBtb2RpZnkhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBVU0UgQVQgWU9VUiBPV04gUklTSyEKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUkVSRVFVSVNJVEVTCi0KLSAgICAgICAgICAgICAqKiogWU9VIFdJTEwgTkVFRCBHTlUtTUFLRSBWRVJTSU9OID4zLjgwICoqKgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgICAgICAgICAgICBDb250ZW50cyBvZiB0aGlzIGRpc3RyaWJ1dGlvbgotCi1DaGFuZ2VzICAgICAgICAtIGd1ZXNzIHdoYXQ/IDstKQotCi1PQ2FtbE1ha2VmaWxlICAtIE1ha2VmaWxlIGZvciBlYXN5IGhhbmRsaW5nIG9mIGNvbXBpbGF0aW9uIG9mIG5vdCBzbyBlYXN5Ci0gICAgICAgICAgICAgICAgIE9DYW1sLXByb2plY3RzLiAgSXQgZ2VuZXJhdGVzIGRlcGVuZGVuY2llcyBvZiBPQ2FtbC1maWxlcwotICAgICAgICAgICAgICAgICBhdXRvbWF0aWNhbGx5LCBpcyBhYmxlIHRvIGhhbmRsZSAib2NhbWxsZXgiLSwKLSAgICAgICAgICAgICAgICAgIm9jYW1seWFjYyItLCBJREwtIGFuZCBDLWZpbGVzLCBrbm93cyBob3cgdG8gcnVuCi0gICAgICAgICAgICAgICAgIHByZXByb2Nlc3NvcnMgYW5kIGdlbmVyYXRlcyBuYXRpdmUtIG9yIGJ5dGUtY29kZSwgYXMKLSAgICAgICAgICAgICAgICAgZXhlY3V0YWJsZSBvciBhcyBsaWJyYXJ5IC0gd2l0aCB0aHJlYWQtc3VwcG9ydCBpZiB5b3UKLSAgICAgICAgICAgICAgICAgd2FudCEgUHJvZmlsaW5nIGFuZCBkZWJ1Z2dpbmcgc3VwcG9ydCBjYW4gYmUgYWRkZWQgb24KLSAgICAgICAgICAgICAgICAgdGhlIGZseSEgIFRoZXJlIGlzIGFsc28gc3VwcG9ydCBmb3IgaW5zdGFsbGluZyBsaWJyYXJpZXMuCi0gICAgICAgICAgICAgICAgIEFoLCB5ZXMsIGFuZCB5b3UgY2FuIGFsc28gY3JlYXRlIHRvcGxldmVscyBmcm9tIGFueQotICAgICAgICAgICAgICAgICBzb3VyY2VzOiB0aGlzIGFsbG93cyB5b3UgaW1tZWRpYXRlIGludGVyYWN0aXZlIHRlc3RpbmcuCi0gICAgICAgICAgICAgICAgIEF1dG9tYXRpYyBnZW5lcmF0aW9uIG9mIGRvY3VtZW50YXRpb24gaXMgZWFzeSBkdWUgdG8KLSAgICAgICAgICAgICAgICAgaW50ZWdyYXRpb24gb2Ygc3VwcG9ydCBmb3IgT0NhbWxkb2MuCi0KLVJFQURNRSAgICAgICAgIC0gdGhpcyBmaWxlCi0KLWNhbGMvICAgICAgICAgIC0gRGlyZWN0b3J5IGNvbnRhaW5pbmcgYSBxdWl0ZSBmdWxseS1mZWF0dXJlZCBleGFtcGxlCi0gICAgICAgICAgICAgICAgIG9mIHdoYXQgIk9DYW1sTWFrZWZpbGUiIGNhbiBkbyBmb3IgeW91LiBUaGlzIGV4YW1wbGUKLSAgICAgICAgICAgICAgICAgbWFrZXMgdXNlIG9mICJvY2FtbGxleCIsICJvY2FtbHlhY2MiLCBJREwgKyBDIGFuZAotICAgICAgICAgICAgICAgICB0aHJlYWRzLgotCi1jYW1scDQvICAgICAgICAtIFRoaXMgc2ltcGxlIGV4YW1wbGUgZGVtb25zdHJhdGVzIGhvdyB0byBhdXRvbWF0aWNhbGx5Ci0gICAgICAgICAgICAgICAgIHByZXByb2Nlc3MgZmlsZXMgd2l0aCB0aGUgY2FtbHA0LXByZXByb2Nlc3Nvci4KLQotZ3RrLyAgICAgICAgICAgLSBEZW1vbnN0cmF0aW9uIG9mIGhvdyB0byB1c2UgT0NhbWxNYWtlZmlsZSB3aXRoIEdUSwotICAgICAgICAgICAgICAgICBhbmQgdGhyZWFkcy4gQ291cnRlc3kgb2YgVGltIEZyZWVtYW4gPHRpbUBmdW5naWJsZS5jb20+LgotCi1pZGwvICAgICAgICAgICAtIENvbnRhaW5zIGEgdmVyeSBzbWFsbCBleGFtcGxlIG9mIGhvdyB0byB1c2UKLSAgICAgICAgICAgICAgICAgImNhbWxpZGwiIHRvZ2V0aGVyIHdpdGggIk9DYW1sTWFrZWZpbGUiLiBBbHNvIGludGVuZGVkCi0gICAgICAgICAgICAgICAgIHRvIHNob3csIGhvdyBlYXN5IGl0IGlzIHRvIGludGVyZmFjZSBPQ2FtbCBhbmQgQy4KLQotdGhyZWFkcy8gICAgICAgLSBUd28gZXhhbXBsZXMgb2YgaG93IHRvIHVzZSB0aHJlYWRzIChvcmlnaW5hbGx5Ci0gICAgICAgICAgICAgICAgIHBvc3RlZCBieSBYYXZpZXIgTGVyb3kgc29tZSB0aW1lIGFnbykuIFNob3dzIHRoZSB1c2Ugb2YKLSAgICAgICAgICAgICAgICAgIk9DYW1sTWFrZWZpbGUiIGluIGFuIGVudmlyb25tZW50IG9mIG11bHRpcGxlIGNvbXBpbGF0aW9uCi0gICAgICAgICAgICAgICAgIHRhcmdldHMuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICAgICAgICAgICAgICAgV2h5IHNob3VsZCB5b3UgdXNlIGl0PwotCi1Gb3Igc2V2ZXJhbCByZWFzb25zOgotCi0gICogSXQgaXMgd2VsbC10ZXN0ZWQgKEkgdXNlIGl0IGluIGFsbCBvZiBteSBwcm9qZWN0cykuCi0KLSAgKiBJbiBjb250cmFzdCB0byBtb3N0IG90aGVyIGFwcHJvYWNoZXMgaXQgZ2VuZXJhdGVzIGRlcGVuZGVuY2llcwotICAgIGNvcnJlY3RseSBieSBlbnN1cmluZyB0aGF0IGFsbCBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBPQ2FtbC1maWxlcwotICAgIGV4aXN0IGJlZm9yZSBkZXBlbmRlbmN5IGNhbGN1bGF0aW9uLiAgVGhpcyBpcyB0aGUgb25seSB3YXkgdG8KLSAgICBndWFyYW50ZWUgdGhhdCAib2NhbWxkZXAiIHdvcmtzIGNvcnJlY3RseS4KLQotICAqIEl0IGlzIGV4dHJlbWVseSBjb252ZW5pZW50IChhdCBsZWFzdCBJIHRoaW5rIHNvIDstKS4KLSAgICBFdmVuIHF1aXRlIGNvbXBsZXggY29tcGlsYXRpb24gcHJvY2Vzc2VzIChzZWUgZXhhbXBsZSAiY2FsYy5tbCIpCi0gICAgbmVlZCB2ZXJ5IGxpdHRsZSBpbmZvcm1hdGlvbiB0byB3b3JrIGNvcnJlY3RseSAtIGFjdHVhbGx5IGp1c3QgYWJvdXQKLSAgICB0aGUgbWluaW11bSAoZmlsZSBuYW1lcyBvZiBzb3VyY2VzKS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgICAgICAgICAgICAgIFdoZW4geW91IHNob3VsZG4ndCB1c2UgaXQuLi4KLQotSW4gcHJvamVjdHMgd2hlcmUgZXZlcnkgY29tcGlsYXRpb24gdW5pdCBuZWVkcyBkaWZmZXJlbnQgZmxhZ3MgLSBidXQKLWluIHN1Y2ggY29tcGxpY2F0ZWQgY2FzZXMgeW91IHdpbGwgYmUgb24geW91ciBvd24gYW55d2F5LiBMdWNraWx5LAotdGhpcyBkb2Vzbid0IGhhcHBlbiB0b28gZnJlcXVlbnRseS4uLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgICAgIEhvdyB0byB1c2UgIk9DYW1sTWFrZWZpbGUiIGluIHlvdXIgb3duIHByb2plY3QKLSAgICAgICAgIChUYWtlIGEgbG9vayBhdCB0aGUgZXhhbXBsZXMgZm9yIGEgcXVpY2sgaW50cm9kdWN0aW9uISkKLQotQ3JlYXRlIHlvdXIgcHJvamVjdC1zcGVjaWZpYyAiTWFrZWZpbGUiIGluIHRoZSBhcHByb3ByaWF0ZSBkaXJlY3RvcnkuCi0KLU5vdyB0aGVyZSBhcmUgdHdvIHdheXMgb2YgbWFraW5nIHVzZSBvZiAiT0NhbWxNYWtlZmlsZSI6Ci0KLSAgMSkgSGF2ZSBhIGxvb2sgYXQgdGhlIGRlZmF1bHQgc2V0dGluZ3MgaW4gIk9DYW1sTWFrZWZpbGUiIGFuZCBzZXQKLSAgICAgdGhlbSB0byB0aGUgdmFsdWVzIHRoYXQgYXJlIHZhaWxkIG9uIHlvdXIgc3lzdGVtIC0gd2hldGhlciB0aGUKLSAgICAgcGF0aCB0byB0aGUgc3RhbmRhcmQgbGlicmFyaWVzIGlzIG9rLCB3aGF0IGV4ZWN1dGFibGVzIHNoYWxsIGJlCi0gICAgIHVzZWQsIGV0Yy4uLgotCi0gIDIpIENvcHkgaXQgaW50byB0aGUgZGlyZWN0b3J5IG9mIHRoZSBwcm9qZWN0IHRvIGJlIGNvbXBpbGVkLgotICAgICBBZGQgIi1pbmNsdWRlIE9DYW1sTWFrZWZpbGUiIGFzIGEgbGFzdCBsaW5lIG9mIHlvdXIgIk1ha2VmaWxlIi4KLQotICAzKSBQdXQgaXQgc29tZXdoZXJlIGVsc2Ugb24gdGhlIHN5c3RlbS4gSW4gdGhpcyBjYXNlIHlvdSB3aWxsIGhhdmUgdG8KLSAgICAgc2V0IGEgdmFyaWFibGUgIk9DQU1MTUFLRUZJTEUiIGluIHlvdXIgcHJvamVjdC1zcGVjaWZpYyAiTWFrZWZpbGUiLgotICAgICBUaGlzIGlzIHRoZSB3YXkgaW4gd2hpY2ggdGhlIGV4YW1wbGVzIGFyZSB3cml0dGVuOiBzbyB5b3UgbmVlZAotICAgICBvbmx5IG9uZSB2ZXJzaW9uIG9mICJPQ2FtbE1ha2VmaWxlIiB0byBtYW5hZ2UgYWxsIHlvdXIgcHJvamVjdHMhCi0gICAgIFNlZSB0aGUgZXhhbXBsZXMgZm9yIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgdXN1YWxseSBzcGVjaWZ5IHR3byBmdXJ0aGVyIHZhcmlhYmxlcyBmb3IgeW91ciBwcm9qZWN0OgotCi0gICogU09VUkNFUyAgKGRlZmF1bHQ6IGZvby5tbCkKLSAgKiBSRVNVTFQgICAoZGVmYXVsdDogZm9vKQotCi1QdXQgYWxsIHRoZSBzb3VyY2VzIG5lY2Vzc2FyeSBmb3IgYSB0YXJnZXQgaW50byB2YXJpYWJsZSAiU09VUkNFUyIuCi1UaGVuIHNldCAiUkVTVUxUIiB0byB0aGUgbmFtZSBvZiB0aGUgdGFyZ2V0LiBJZiB5b3Ugd2FudCB0byBnZW5lcmF0ZQotbGlicmFyaWVzLCB5b3Ugc2hvdWxkICpub3QqIHNwZWNpZnkgdGhlIHN1ZmZpeCAoIi5jbWEiLCAiLmNteGEiLCAiLmEiKQotLSBpdCB3aWxsIGJlIGFkZGVkIGF1dG9tYXRpY2FsbHkgaWYgeW91IHNwZWNpZnkgdGhhdCB5b3Ugd2FudCB0byBidWlsZAotYSBsaWJyYXJ5LgotCi0gICAgICAqKiAgICAgIERvbid0IGZvcmdldCB0byBhZGQgdGhlICIubWxpIi1maWxlcywgdG9vISAgICAgICAgKioKLSAgICAgICoqICBEb24ndCBmb3JnZXQgdGhhdCBvcmRlciBvZiB0aGUgc291cmNlIGZpbGVzIG1hdHRlcnMhICAqKgotCi1UaGUgb3JkZXIgaXMgaW1wb3J0YW50LCBiZWNhdXNlIGl0IG1hdHRlcnMgZHVyaW5nIGxpbmtpbmcgYW55d2F5Ci1kdWUgdG8gcG90ZW50aWFsIHNpZGUgZWZmZWN0cyBjYXVzZWQgYXQgcHJvZ3JhbSBzdGFydHVwLiBUaGlzIGlzCi13aHkgT0NhbWxNYWtlZmlsZSBkb2VzIG5vdCBhdHRlbXB0IHRvIHBhcnRpYWxseSBvcmRlciBkZXBlbmRlbmNpZXMgYnkKLWl0c2VsZiwgd2hpY2ggbWlnaHQgY29uZnVzZSB1c2VycyBldmVuIG1vcmUuIEl0IGp1c3QgY29tcGlsZXMgYW5kIGxpbmtzCi1PQ2FtbC1zb3VyY2VzIGluIHRoZSBvcmRlciBzcGVjaWZpZWQgYnkgdGhlIHVzZXIsIGV2ZW4gaWYgaXQgY291bGQKLWRldGVybWluZSBhdXRvbWF0aWNhbGx5IHRoYXQgdGhlIG9yZGVyIGNhbm5vdCBiZSBjb3JyZWN0LgotCi1UaGUgbWluaW11bSBvZiB5b3VyICJNYWtlZmlsZSIgbG9va3MgbGlrZSB0aGlzIChhc3N1bWluZyB0aGF0Ci0iT0NhbWxNYWtlZmlsZSIgaXMgaW4gdGhlIHNlYXJjaCBwYXRoIG9mICJtYWtlIik6Ci0KLSAgLWluY2x1ZGUgT0NhbWxNYWtlZmlsZQotCi1UaGlzIHdpbGwgYXNzdW1lIHRoYXQgeW91IHdhbnQgdG8gY29tcGlsZSBhIGZpbGUgImZvby5tbCIgdG8gYSBiaW5hcnkKLSJmb28iLgotCi1PdGhlcndpc2UsIHlvdXIgTWFrZWZpbGUgd2lsbCBwcm9iYWJseSBjb250YWluIHNvbWV0aGluZyBsaWtlIHRoaXM6Ci0KLSAgU09VUkNFUyA9IGZvby5tbAotICBSRVNVTFQgID0gZm9vCi0gIC1pbmNsdWRlIE9DYW1sTWFrZWZpbGUKLQotQmUgY2FyZWZ1bCB3aXRoIHRoZSBuYW1lcyB5b3UgcHV0IGludG8gdGhlc2UgdmFyaWFibGVzOiBpZiB0aGV5IGFyZSB3cm9uZywKLWEgIm1ha2UgY2xlYW4iIG1pZ2h0IGVyYXNlIHRoZSB3cm9uZyBmaWxlcyAtIGJ1dCBJIGtub3cgeW91IHdpbGwgbm90IGRvCi10aGF0IDstKQotCi1BIHNpbXBsZSAibWFrZSIgd2lsbCBnZW5lcmF0ZSBhIGJ5dGUtY29kZSBleGVjdXRhYmxlLiBJZiB5b3Ugd2FudCB0bwotY2hhbmdlIHRoaXMsIHlvdSBtYXkgYWRkIGFuICJhbGwiLXJ1bGUgdGhhdCBnZW5lcmF0ZXMgc29tZXRoaW5nIGVsc2UuCi0KLUUuZy46Ci0KLSAgU09VUkNFUyA9IGZvby5tbAotICBSRVNVTFQgID0gZm9vCi0gIGFsbDogbmF0aXZlLWNvZGUtbGlicmFyeQotICAtaW5jbHVkZSBPQ2FtbE1ha2VmaWxlCi0KLVRoaXMgd2lsbCBidWlsZCBhIG5hdGl2ZS1jb2RlIGxpYnJhcnkgImZvby5jbXhhIiAoKyAiZm9vLmEiKSBmcm9tIGZpbGUKLSJmb28ubWwiLgotCi1Zb3UgbWF5IGV2ZW4gYnVpbGQgc2V2ZXJhbCB0YXJnZXRzIGF0IG9uY2UuIFRvIHByb2R1Y2UgYnl0ZS0gYW5kIG5hdGl2ZS1jb2RlCi1leGVjdXRhYmxlcyB3aXRoIG9uZSAibWFrZSIsIGFkZCB0aGUgZm9sbG93aW5nIHJ1bGU6Ci0KLSAgICBhbGw6IGJ5dGUtY29kZSBuYXRpdmUtY29kZQotCi1Zb3Ugd2lsbCBwcm9iYWJseSB3YW50IHRvIHVzZSBhIGRpZmZlcmVudCBzdWZmaXggZm9yIGVhY2ggb2YgdGhlc2UgdGFyZ2V0cwotc28gdGhhdCB0aGUgcmVzdWx0IHdpbGwgbm90IGJlIG92ZXJ3cml0dGVuIChzZWUgb3B0aW9uYWwgdmFyaWFibGVzIGJlbG93Ci1mb3IgZGV0YWlscykuCi0KLVlvdSBtYXkgYWxzbyB0ZWxsICJtYWtlIiBhdCB0aGUgY29tbWFuZC1saW5lIHdoYXQga2luZCBvZiB0YXJnZXQgdG8KLXByb2R1Y2UgKGUuZy4gIm1ha2UgbmMiKS4gIEhlcmUgYWxsIHRoZSBwb3NzaWJpbGl0aWVzIHdpdGggc2hvcnRjdXRzCi1iZXR3ZWVuIHBhcmVudGhlc2lzOgotCi0gICAqIGJ5dGUtY29kZSAgICAgICAgICAgICAgICAgICAgIChiYykKLSAgICogYnl0ZS1jb2RlLW5vbGluayAgICAgICAgICAgICAgKGJjbmwpICAgLSBubyBsaW5raW5nIHN0YWdlCi0gICAqIGJ5dGUtY29kZS1saWJyYXJ5ICAgICAgICAgICAgIChiY2wpCi0gICAqIG5hdGl2ZS1jb2RlICAgICAgICAgICAgICAgICAgIChuYykKLSAgICogbmF0aXZlLWNvZGUtbm9saW5rICAgICAgICAgICAgKG5jbmwpICAgLSBubyBsaW5raW5nIHN0YWdlCi0gICAqIG5hdGl2ZS1jb2RlLWxpYnJhcnkgICAgICAgICAgIChuY2wpCi0gICAqIGRlYnVnLWNvZGUgICAgICAgICAgICAgICAgICAgIChkYykKLSAgICogZGVidWctY29kZS1ub2xpbmsgICAgICAgICAgICAgKGRjbmwpICAgLSBubyBsaW5raW5nIHN0YWdlCi0gICAqIGRlYnVnLWNvZGUtbGlicmFyeSAgICAgICAgICAgIChkY2wpCi0gICAqIHByb2ZpbGluZy1ieXRlLWNvZGUgICAgICAgICAgIChwYmMpCi0gICAqIHByb2ZpbGluZy1ieXRlLWNvZGUtbGlicmFyeSAgIChwYmNsKQotICAgKiBwcm9maWxpbmctbmF0aXZlLWNvZGUgICAgICAgICAocG5jKQotICAgKiBwcm9maWxpbmctbmF0aXZlLWNvZGUtbGlicmFyeSAocG5jbCkKLSAgICogYnl0ZS1jb2RlLWRsbCAgICAgICAgICAgICAgICAgKGJjZCkKLSAgICogbmF0aXZlLWNvZGUtZGxsICAgICAgICAgICAgICAgKG5jZCkKLSAgICogcGFjay1ieXRlLWNvZGUgICAgICAgICAgICAgICAgKHBhYmMpCi0gICAqIHBhY2stbmF0aXZlLWNvZGUgICAgICAgICAgICAgIChwYW5jKQotICAgKiB0b3BsZXZlbCBpbnRlcnByZXRlciAgICAgICAgICAodG9wKQotICAgKiBzdWJwcm9qcwotCi1IZXJlIGEgc2hvcnQgbm90ZSBjb25jZXJuaW5nIGJ1aWxkaW5nIGFuZCBsaW5raW5nIGJ5dGUgY29kZSBsaWJyYXJpZXMKLXdpdGggQy1maWxlczoKLQotICBPQ2FtbCBsaW5rcyBDLW9iamVjdCBmaWxlcyBvbmx5IHdoZW4gdGhleSBhcmUgdXNlZCBpbiBhbiBleGVjdXRhYmxlLgotICBBZnRlciBjb21waWxhdGlvbiB0aGV5IHNob3VsZCBiZSBwbGFjZWQgaW4gc29tZSBkaXJlY3RvcnkgdGhhdCBpcyBpbgotICB5b3VyIGluY2x1ZGUgcGF0aCBpZiB5b3UgbGluayB5b3VyIGxpYnJhcnkgYWdhaW5zdCBhbiBleGVjdXRhYmxlLgotCi0gIEl0IGlzIHNvbWV0aW1lcyBtb3JlIGNvbnZlbmllbnQgdG8gbGluayBhbGwgQy1vYmplY3QgZmlsZXMgaW50byBhCi0gIHNpbmdsZSBDLWxpYnJhcnkuIFRoZW4geW91IGhhdmUgdG8gb3ZlcnJpZGUgdGhlIGF1dG9tYXRpYyBsaW5rIGZsYWdzCi0gIG9mIHlvdXIgbGlicmFyeSB1c2luZyAiLW5vYXV0b2xpbmsiIGFuZCBhZGQgYW5vdGhlciBsaW5rZmxhZyB0aGF0Ci0gIGxpbmtzIGluIHlvdXIgQy1saWJyYXJ5IGV4cGxpY2l0bHkuCi0KLVdoYXQgY29uY2VybnMgbWFpbnRlbmFuY2U6Ci0KLSAgIm1ha2UgY2xlYW4iIHJlbW92ZXMgYWxsIChhbGwhKSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmaWxlcyAtIHNvCi0gIGFnYWluOiBtYWtlIHN1cmUgeW91ciB2YXJpYWJsZXMgYXJlIG9rIQotCi0gICJtYWtlIGNsZWFudXAiIGlzIHNpbWlsYXIgdG8gIm1ha2UgY2xlYW4iIGJ1dCBsZWF2ZXMgZXhlY3V0YWJsZXMuCi0KLUFub3RoZXIgd2F5IHRvIGRlc3Ryb3kgc29tZSBpbXBvcnRhbnQgZmlsZXMgaXMgYnkgaGF2aW5nICJPQ2FtbE1ha2VmaWxlIgotYXV0b21hdGljYWxseSBnZW5lcmF0ZSBmaWxlcyB3aXRoIHRoZSBzYW1lIG5hbWUuIFJlYWQgdGhlIGRvY3VtZW50YXRpb24KLWFib3V0IHRoZSB0b29scyBpbiB0aGUgT0NhbWwtZGlzdHJpYnV0aW9uIHRvIHNlZSB3aGF0IGtpbmQgb2YgZmlsZXMgYXJlCi1nZW5lcmF0ZWQuICJPQ2FtbE1ha2VmaWxlIiBhZGRpdGlvbmFsbHkgZ2VuZXJhdGVzICgnJScgaXMgYmFzZW5hbWUgb2YKLXNvdXJjZSBmaWxlKToKLQotICAlX2lkbC5jICAtICJjYW1saWRsIiBnZW5lcmF0ZXMgYSBmaWxlICIlLmMiIGZyb20gIiUuaWRsIiwgYnV0IHRoaXMgaXMKLSAgICAgICAgICAgICBub3Qgc3VjaCBhIGdvb2QgaWRlYSwgYmVjYXVzZSB3aGVuIGdlbmVyYXRpbmcgbmF0aXZlLWNvZGUsCi0gICAgICAgICAgICAgYm90aCB0aGUgZmlsZSAiJS5jIiBhbmQgIiUubWwiIHdvdWxkIGdlbmVyYXRlIGZpbGVzICIlLm8iCi0gICAgICAgICAgICAgd2hpY2ggd291bGQgb3ZlcndyaXRlIGVhY2ggb3RoZXIuIFRodXMsICJPQ2FtbE1ha2VmaWxlIgotICAgICAgICAgICAgIHJlbmFtZXMgIiUuYyIgdG8gIiVfaWRsLmMiIHRvIHdvcmsgYXJvdW5kIHRoaXMgcHJvYmxlbS4KLQotVGhlIGRlcGVuZGVuY2llcyBhcmUgc3RvcmVkIGluIHRocmVlIGRpZmZlcmVudCBzdWJkaXJlY3RvcmllcyAoZG90IGRpcnMpOgotCi0gIC5fZCAgICAtIGNvbnRhaW5zIGRlcGVuZGVuY2llcyBmb3IgLm1sLWZpbGVzCi0gIC5fYmNkaSAtIGNvbnRhaW5zIGJ5dGUgY29kZSBkZXBlbmRlbmNpZXMgZm9yIC5tbGktZmlsZXMKLSAgLl9uY2RpIC0gY29udGFpbnMgbmF0aXZlIGNvZGUgZGVwZW5kZW5jaWVzIGZvciAubWxpLWZpbGVzCi0KLVRoZSBlbmRpbmdzIG9mIHRoZSBkZXBlbmRlbmN5IGZpbGVzIGFyZTogIiUuZCIgZm9yIHRob3NlIGdlbmVyYXRlZCBmcm9tCi0iJS5tbCItZmlsZXMsICIlLmRpIiBmb3Igb25lcyBkZXJpdmVkIGZyb20gIiUubWxpIi1maWxlcy4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnZ2luZwotCi0gIFRoaXMgaXMgZWFzeTogaWYgeW91IGRpc2NvdmVyIGEgYnVnLCBqdXN0IGRvIGEgIm1ha2UgY2xlYW47IG1ha2UgZGMiCi0gIHRvIHJlY29tcGlsZSB5b3VyIHByb2plY3Qgd2l0aCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uIFRoZW4geW91IGNhbgotICBpbW1lZGlhdGVseSBhcHBseSAib2NhbWxkZWJ1ZyIgdG8gdGhlIGV4ZWN1dGFibGUuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9maWxpbmcKLQotICBGb3IgZ2VuZXJhdGluZyBjb2RlIHRoYXQgY2FuIGJlIHByb2ZpbGVkIHdpdGggIm9jYW1scHJvZiIgKGJ5dGUgY29kZSkKLSAgb3IgImdwcm9mIiAobmF0aXZlIGNvZGUpLCBjb21waWxlIHlvdXIgcHJvamVjdCB3aXRoIG9uZSBvZiB0aGUgcHJvZmlsaW5nCi0gIHRhcmdldHMgKHNlZSB0YXJnZXRzIGFib3ZlKS4gRS5nLjoKLQotICAgICogIm1ha2UgcGJjIiB3aWxsIGJ1aWxkIGJ5dGUgY29kZSB0aGF0IGNhbiBiZSBwcm9maWxlZCB3aXRoCi0gICAgICAib2NhbWxwcm9mIi4KLQotICAgICogIm1ha2UgcG5jIiB3aWxsIGJ1aWxkIG5hdGl2ZSBjb2RlIHRoYXQgY2FuIGJlIHByb2ZpbGVkIHdpdGgKLSAgICAgICJncHJvZiIuCi0KLSAgUGxlYXNlIG5vdGUgdGhhdCBpdCBpcyBub3QgY3VycmVudGx5IHBvc3NpYmxlIHRvIHByb2ZpbGUgYnl0ZSBjb2RlIHdpdGgKLSAgdGhyZWFkcy4gT0NhbWxNYWtlZmlsZSB3aWxsIGZvcmNlIGFuIGVycm9yIGlmIHlvdSB0cnkgdG8gZG8gdGhpcy4KLQotICBBIHNob3J0IGhpbnQgZm9yIERFQyBBbHBoYS11c2VycyAodW5kZXIgRGlnaXRhbCBVbml4KTogeW91IG1heSBhbHNvCi0gIGNvbXBpbGUgeW91ciBzb3VyY2VzIHRvIG5hdGl2ZSBjb2RlIHdpdGhvdXQgYW55IGZ1cnRoZXIgcHJvZmlsaW5nCi0gIG9wdGlvbnMvdGFyZ2V0cy4gVGhlbiBjYWxsICJwaXhpZSBteV9leGVjIiwgIm15X2V4ZWMiIGJlaW5nIHlvdXIKLSAgZXhlY3V0YWJsZS4gVGhpcyB3aWxsIHByb2R1Y2UgKGFtb25nIG90aGVyIGZpbGVzKSBhbiBleGVjdXRhYmxlCi0gICJteV9leGVjLnBpeGllIi4gQ2FsbCBpdCBhbmQgaXQgd2lsbCBwcm9kdWNlIHByb2ZpbGluZyBpbmZvcm1hdGlvbiB3aGljaAotICBjYW4gYmUgYW5hbHlzZWQgdXNpbmcgInByb2YgLXBpeGllIG15X2V4ZWMiLiBUaGUgcmVzdWx0aW5nIGluZm9ybWF0aW9uCi0gIGlzIGV4dHJlbWVseSBkZXRhaWxlZCBhbmQgYWxsb3dzIGFuYWx5c2lzIHVwIHRvIHRoZSBjbG9jayBjeWNsZSBsZXZlbC4uLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2luZyBQcmVwcm9jZXNzb3JzCi0KLSAgQmVjYXVzZSBvbmUgY291bGQgZW1wbG95IGFueSBraW5kIG9mIHByb2dyYW0gdGhhdCByZWFkcyBmcm9tIHN0YW5kYXJkCi0gIGlucHV0IGFuZCBwcmludHMgdG8gc3RhbmRhcmQgb3V0cHV0IGFzIHByZXByb2Nlc3NvciwgdGhlcmUgY2Fubm90IGJlIGFueQotICBkZWZhdWx0IHdheSB0byBoYW5kbGUgYWxsIG9mIHRoZW0gY29ycmVjdGx5IHdpdGhvdXQgZnVydGhlciBrbm93bGVkZ2UuCi0KLSAgVGhlcmVmb3JlIHlvdSBoYXZlIHRvIGNvb3BlcmF0ZSBhIGJpdCB3aXRoIE9DYW1sTWFrZWZpbGUgdG8gbGV0Ci0gIHByZXByb2Nlc3NpbmcgaGFwcGVuIGF1dG9tYXRpY2FsbHkuIEJhc2ljYWxseSwgdGhpcyBvbmx5IHJlcXVpcmVzCi0gIHRoYXQgeW91IHB1dCBhIGNvbW1lbnQgaW50byB0aGUgZmlyc3QgbGluZSBvZiBmaWxlcyB0aGF0IHNob3VsZCBiZQotICBwcmVwcm9jZXNzZWQsIGUuZy46Ci0KLSAgICAoKnBwIGNhdCAqKQotICAgIC4uLiByZXN0IG9mIHByb2dyYW0gLi4uCi0KLSAgT0NhbWxNYWtlZmlsZSBsb29rcyBhdCB0aGUgZmlyc3QgbGluZSBvZiB5b3VyIGZpbGVzLCBhbmQgaWYgaXQgZmluZHMKLSAgYSBjb21tZW50IHRoYXQgc3RhcnRzIHdpdGggIigqcHAiLCB0aGVuIGl0IHdpbGwgYXNzdW1lIHRoYXQgdGhlCi0gIHJlc3Qgb2YgdGhlIGNvbW1lbnQgdGVsbHMgaXQgaG93IHRvIGNvcnJlY3RseSBjYWxsIHRoZSBhcHByb3ByaWF0ZQotICBwcmVwcm9jZXNzb3IuIEluIHRoaXMgY2FzZSB0aGUgcHJvZ3JhbSAiY2F0IiB3aWxsIGJlIGNhbGxlZCwgd2hpY2ggd2lsbCwKLSAgb2YgY291cnNlLCBqdXN0IG91dHB1dCB0aGUgc291cmNlIHRleHQgYWdhaW4gd2l0aG91dCBjaGFuZ2luZyBpdC4KLQotICBJZiB5b3UgYXJlLCBmb3IgZXhhbXBsZSwgYW4gYWR2b2NhdGUgb2YgdGhlIG5ldyAicmV2aXNlZCBzeW50YXgiLAotICB3aGljaCBpcyBzdXBwb3J0ZWQgYnkgdGhlIGNhbWxwNCBwcmVwcm9jZXNzb3IsIHlvdSBjb3VsZCBzaW1wbHkgd3JpdGU6Ci0KLSAgICAoKnBwIGNhbWxwNHIgKikKLSAgICAuLi4gcmVzdCBvZiBwcm9ncmFtIGluIHJldmlzZWQgc3ludGF4IC4uLgotCi0gIFNpbXBsZSwgaXNuJ3QgaXQ/Ci0KLSAgSWYgeW91IHdhbnQgdG8gd3JpdGUgeW91ciBvd24gc3ludGF4IGV4dGVuc2lvbnMsIGp1c3QgdGFrZSBhIGxvb2sgYXQgdGhlCi0gIGV4YW1wbGUgaW4gdGhlIGRpcmVjdG9yeSAiY2FtbHA0IjogaXQgaW1wbGVtZW50cyB0aGUgInJlcGVhdCAuLi4gdW50aWwiCi0gIGV4dGVuc2lvbiBhcyBkZXNjcmliZWQgaW4gdGhlIGNhbWxwNC10dXRvcmlhbC4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgICAgICAgICAgICAgIExpYnJhcnkgKFVuLSlJbnN0YWxsYXRpb24gU3VwcG9ydAotCi0gIE9DYW1sTWFrZWZpbGUgY29udGFpbnMgdHdvIHRhcmdldHMgdXNpbmcgIm9jYW1sZmluZCIgZm9yIHRoaXMgcHVycG9zZToKLQotICAgICogbGliaW5zdGFsbAotICAgICogbGlidW5pbnN0YWxsCi0KLSAgVGhlc2UgdHdvIHRhcmdldHMgcmVxdWlyZSB0aGUgZXhpc3RlbmNlIG9mIHRoZSB2YXJpYWJsZQotICAiTElCSU5TVEFMTF9GSUxFUyIsIHdoaWNoIHNob3VsZCBiZSBzZXQgdG8gYWxsIHRoZSBmaWxlcyB0aGF0IHlvdQotICB3YW50IHRvIGluc3RhbGwgaW4gdGhlIGxpYnJhcnkgZGlyZWN0b3J5ICh1c3VhbGx5ICUubWxpLCAlLmNtaSwgJS5jbWEsCi0gICUuY214YSwgJS5hIGFuZCBwb3NzaWJseSBmdXJ0aGVyIEMtbGlicmFyaWVzKS4gVGhlIHRhcmdldCAibGliaW5zdGFsbCIKLSAgaGFzIHRoZSBkZXBlbmRlbmN5ICJhbGwiIHRvIGZvcmNlIGNvbXBpbGF0aW9uIG9mIHRoZSBsaWJyYXJ5IHNvIG1ha2UKLSAgc3VyZSB5b3UgZGVmaW5lIHRhcmdldCAiYWxsIiBpbiB5b3VyIE1ha2VmaWxlIGFwcHJvcHJpYXRlbHkuCi0KLSAgVGhlIHRhcmdldHMgaW5mb3JtIHRoZSB1c2VyIGFib3V0IHRoZSBjb25maWd1cmVkIGluc3RhbGwgcGF0aCBhbmQgYXNrCi0gIGZvciBjb25maXJtYXRpb24gdG8gKHVuKWluc3RhbGwgdGhlcmUuIElmIHlvdSB3YW50IHRvIHVzZSB0aGVtLCBpdAotICBpcyBvZnRlbiBhIGdvb2QgaWRlYSB0byBqdXN0IGFsaWFzIHRoZW0gaW4geW91ciBNYWtlZmlsZSB0byAiaW5zdGFsbCIKLSAgYW5kICJ1bmluc3RhbGwiIHJlc3BlY3RpdmVseS4KLQotICBUd28gb3RoZXIgdGFyZ2V0cyBhbGxvdyBpbnN0YWxsYXRpb24gb2YgZmlsZXMgaW50byBhIHBhcnRpY3VsYXIKLSAgZGlyZWN0b3J5ICh3aXRob3V0IHVzaW5nIG9jYW1sZmluZCk6Ci0KLSAgICAqIHJhd2luc3RhbGwKLSAgICAqIHJhd3VuaW5zdGFsbAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWxkaW5nIHRvcGxldmVscwotCi0gIFRoZXJlIGlzIGp1c3Qgb25lIHRhcmdldCBmb3IgdGhpczoKLQotICAgICogdG9wCi0KLSAgVGhlIGdlbmVyYXRlZCBmaWxlIGNhbiBiZSB1c2VkIGltbWVkaWF0ZWx5IGZvciBpbnRlcmFjdGl2ZSBzZXNzaW9ucyAtCi0gIGV2ZW4gd2l0aCBzY2FubmVycywgcGFyc2VycywgQy1maWxlcywgZXRjLiEKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0aW5nIGRvY3VtZW50YXRpb24KLQotICBUaGUgZm9sbG93aW5nIHRhcmdldHMgYXJlIHN1cHBvcnRlZDoKLQotICAgKiBodGRvYyAgICAgIC0gZ2VuZXJhdGVzIEhUTUwtZG9jdW1lbnRhdGlvbgotICAgKiBsYWRvYyAgICAgIC0gZ2VuZXJhdGVzIExhdGV4LWRvY3VtZW50YXRpb24KLSAgICogcHNkb2MgICAgICAtIGdlbmVyYXRlcyBQb3N0U2NyaXB0LWRvY3VtZW50YXRpb24KLSAgICogcGRmZG9jICAgICAtIGdlbmVyYXRlcyBQREYtZG9jdW1lbnRhdGlvbgotICAgKiBkb2MgICAgICAgIC0gZ2VuZXJhdGVzIGFsbCBzdXBwb3J0ZWQgZm9ybXMgb2YgZG9jdW1lbnRhdGlvbgotICAgKiBjbGVhbi1kb2MgIC0gZ2VuZXJhdGVzIGFsbCBzdXBwb3J0ZWQgZm9ybXMgb2YgZG9jdW1lbnRhdGlvbgotCi0gIEFsbCBvZiB0aGVtIGdlbmVyYXRlIGEgc3ViLWRpcmVjdG9yeSAiZG9jIi4gTW9yZSBwcmVjaXNlbHksIGZvciBIVE1MIGl0Ci0gIGlzICJkb2MvJChSRVNVTFQpL2h0bWwiIGFuZCBmb3IgTGF0ZXgsIFBvc3RTY3JpcHQgYW5kIFBERiB0aGUgZGlyZWN0b3J5Ci0gICJkb2MvJChSRVNVTFQpL2xhdGV4Ii4gU2VlIHRoZSBPQ2FtbGRvYy1tYW51YWwgZm9yIGRldGFpbHMgYW5kIHRoZQotICBvcHRpb25hbCB2YXJpYWJsZXMgYmVsb3cgZm9yIHNldHRpbmdzIHlvdSBjYW4gY29udHJvbC4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsaW5nIHN1YnByb2plY3RzCi0KLSAgWW91IGNhbiBoYXZlIHNldmVyYWwgdGFyZ2V0cyBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYW5kIG1hbmFnZSB0aGVtCi0gIGZyb20gd2l0aGluIGFuIHNpbmdsZSBNYWtlZmlsZS4KLQotICBHaXZlIGVhY2ggc3VicHJvamVjdCBhIG5hbWUsIGUuZy4gInAxIiwgInAyIiwgZXRjLiBUaGVuIHlvdSBleHBvcnQKLSAgc2V0dGluZ3Mgc3BlY2lmaWMgdG8gZWFjaCBwcm9qZWN0IGJ5IHVzaW5nIHZhcmlhYmxlcyBvZiB0aGUgZm9ybQotICAiUFJPSl9wMSIsICJQUk9KX3AyIiwgZXRjLiAgRS5nLjoKLQotICAgIGRlZmluZSBQUk9KX3AxCi0gICAgICBTT1VSQ0VTPSJmb28ubWwgbWFpbi5tbCIKLSAgICAgIFJFU1VMVD0icDEiCi0gICAgICBPQ0FNTEZMQUdTPSItdW5zYWZlIgotICAgIGVuZGVmCi0gICAgZXhwb3J0IFBST0pfcDEKLQotICAgIGRlZmluZSBQUk9KX3AyCi0gICAgICAuLi4KLSAgICBlbmRlZgotICAgIGV4cG9ydCBQUk9KX3AyCi0KLSAgWW91IG1heSBhbHNvIGV4cG9ydCBjb21tb24gc2V0dGluZ3MgdXNlZCBieSBhbGwgcHJvamVjdHMgZGlyZWN0bHksIGUuZy4KLSAgImV4cG9ydCBUSFJFQURTID0geSIuCi0KLSAgTm93IGl0IGlzIGEgZ29vZCBpZGVhIHRvIGRlZmluZSwgd2hpY2ggcHJvamVjdHMgc2hvdWxkIGJlIGFmZmVjdGVkIGJ5Ci0gIGNvbW1hbmRzIGJ5IGRlZmF1bHQuICBFLmcuOgotCi0gICAgaWZuZGVmIFNVQlBST0pTCi0gICAgICBleHBvcnQgU1VCUFJPSlMgPSBwMSBwMgotICAgIGVuZGlmCi0KLSAgVGhpcyB3aWxsIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgYSBnaXZlbiB0YXJnZXQgZm9yIGFsbCB0aG9zZQotICBzdWJwcm9qZWN0cyBpZiB0aGlzIHZhcmlhYmxlIGhhcyBub3QgYmVlbiBkZWZpbmVkIGluIHRoZSBzaGVsbAotICBlbnZpcm9ubWVudCBvciBpbiB0aGUgY29tbWFuZCBsaW5lIG9mIHRoZSBtYWtlLWludm9jYXRpb24gYnkgdGhlIHVzZXIuCi0gIEUuZy4sICJtYWtlIGRjIiB3aWxsIGdlbmVyYXRlIGRlYnVnIGNvZGUgZm9yIGFsbCBzdWJwcm9qZWN0cy4KLQotICBUaGVuIHlvdSBuZWVkIHRvIGRlZmluZSBhIGRlZmF1bHQgYWN0aW9uIGZvciB5b3VyIHN1YnByb2plY3RzIGlmICJtYWtlIgotICBoYXMgYmVlbiBjYWxsZWQgd2l0aG91dCBhcmd1bWVudHM6Ci0KLSAgICBhbGw6IGJjCi0KLSAgVGhpcyB3aWxsIGJ1aWxkIGJ5dGUgY29kZSBieSBkZWZhdWx0IGZvciBhbGwgc3VicHJvamVjdHMuCi0KLSAgRmluYWxseSwgeW91J2xsIGhhdmUgdG8gZGVmaW5lIGEgY2F0Y2gtYWxsIHRhcmdldCB0aGF0IHVzZXMgdGhlIHRhcmdldAotICBwcm92aWRlZCBieSB0aGUgdXNlciBmb3IgYWxsIHN1YnByb2plY3RzLiBKdXN0IGFkZCAoYXNzdW1pbmcgdGhhdAotICBPQ0FNTE1BS0VGSUxFIGhhcyBiZWVuIGRlZmluZWQgYXBwcm9wcmlhdGVseSk6Ci0KLSAgICAlOgotICAgICAgICAgICAgQG1ha2UgLWYgJChPQ0FNTE1BS0VGSUxFKSBzdWJwcm9qcyBTVUJUQVJHRVQ9JEAKLQotICBTZWUgdGhlICJ0aHJlYWRzIi1kaXJlY3RvcnkgaW4gdGhlIGRpc3RyaWJ1dGlvbiBmb3IgYSBzaG9ydCBleGFtcGxlIQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgT3B0aW9uYWwgdmFyaWFibGVzIHRoYXQgbWF5IGJlIHBhc3NlZCB0byAiT0NhbWxNYWtlZmlsZSIKLQotICAqIExJQl9QQUNLX05BTUUgLSBwYWNrcyBhbGwgbW9kdWxlcyBvZiBhIGxpYnJhcnkgaW50byBhIG1vZHVsZSB3aG9zZQotICAgICAgICAgICAgICAgICAgICBuYW1lIGlzIGdpdmVuIGluIHZhcmlhYmxlICJMSUJfUEFDS19OQU1FIi4KLQotICAqIFJFU19DTElCX1NVRiAgLSB3aGVuIGJ1aWxkaW5nIGEgbGlicmFyeSB0aGF0IGNvbnRhaW5zIEMtc3R1YnMsIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgY29udHJvbHMgdGhlIHN1ZmZpeCBhcHBlbmRlZCB0byB0aGUgbmFtZQotICAgICAgICAgICAgICAgICAgICBvZiB0aGUgQy1saWJyYXJ5IChkZWZhdWx0OiAiX3N0dWJzIikuCi0KLSAgKiBUSFJFQURTICAgICAgIC0gc2F5ICJUSFJFQURTID0geWVzIiBpZiB5b3UgbmVlZCB0aHJlYWQgc3VwcG9ydCBjb21waWxlZCBpbiwKLSAgICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlIGxlYXZlIGl0IGF3YXkuCi0KLSAgKiBWTVRIUkVBRFMgICAgIC0gc2F5ICJWTVRIUkVBRFMgPSB5ZXMiIGlmIHlvdSB3YW50IHRvIGZvcmNlIFZNLWxldmVsCi0gICAgICAgICAgICAgICAgICAgIHNjaGVkdWxpbmcgb2YgdGhyZWFkcyAoYnl0ZS1jb2RlIG9ubHkpLgotCi0gICogQU5OT1RBVEUgICAgICAtIHNheSAiQU5OT1RBVEUgPSB5ZXMiIHRvIGdlbmVyYXRlIHR5cGUgYW5ub3RhdGlvbiBmaWxlcwotICAgICAgICAgICAgICAgICAgICAoLmFubm90KSB0byBzdXBwb3J0IGRpc3BsYXlpbmcgb2YgdHlwZSBpbmZvcm1hdGlvbgotICAgICAgICAgICAgICAgICAgICBpbiBlZGl0b3JzLgotCi0gICogVVNFX0NBTUxQNCAgICAtIHNheSAiVVNFX0NBTUxQNCA9IHllcyIgaW4geW91ciAiTWFrZWZpbGUiIGlmIHlvdQotICAgICAgICAgICAgICAgICAgICB3YW50IHRvIGluY2x1ZGUgdGhlIGNhbWxwNCBkaXJlY3RvcnkgZHVyaW5nIHRoZQotICAgICAgICAgICAgICAgICAgICBidWlsZCBwcm9jZXNzLCBvdGhlcndpc2UgbGVhdmUgaXQgYXdheS4KLQotICAqIElOQ0RJUlMgICAgICAgLSBkaXJlY3RvcmllcyB0aGF0IHNob3VsZCBiZSBzZWFyY2hlZCBmb3IgIi5jbWkiLSBhbmQKLSAgICAgICAgICAgICAgICAgICAgIi5jbW8iLWZpbGVzLiAgWW91IG5lZWQgbm90IHdyaXRlICItSSAuLi4iIC0ganVzdCB0aGUKLSAgICAgICAgICAgICAgICAgICAgcGxhaW4gbmFtZXMuCi0gICogTElCRElSUyAgICAgICAtIGRpcmVjdG9yaWVzIHRoYXQgc2hvdWxkIGJlIHNlYXJjaGVkIGZvciBsaWJyYXJpZXMKLSAgICAgICAgICAgICAgICAgICAgQWxzbyBqdXN0IHB1dCB0aGUgcGxhaW4gcGF0aHMgaW50byB0aGlzIHZhcmlhYmxlCi0gICogRVhUTElCRElSUyAgICAtIFNhbWUgYXMgIkxJQkRJUlMiLCBidXQgcGF0aHMgaW4gdGhpcyB2YXJpYWJsZSBhcmUKLSAgICAgICAgICAgICAgICAgICAgYWxzbyBhZGRlZCB0byB0aGUgYmluYXJ5IHZpYSB0aGUgIi1SIi1mbGFnIHNvIHRoYXQKLSAgICAgICAgICAgICAgICAgICAgZHluYW1pYyBsaWJyYXJpZXMgaW4gbm9uLXN0YW5kYXJkIHBsYWNlcyBjYW4gYmUgZm91bmQuCi0gICogUkVTVUxUREVQUyAgICAtIFRhcmdldHMgb24gd2hpY2ggcmVzdWx0cyAoZXhlY3V0YWJsZXMgb3IgbGlicmFyaWVzKQotICAgICAgICAgICAgICAgICAgICBzaG91bGQgYWRkaXRpb25hbGx5IGRlcGVuZC4KLQotICAqIFBBQ0tTICAgICAgICAgLSBhZGRzIHBhY2thZ2VzIHVuZGVyIGNvbnRyb2wgb2YgImZpbmRsaWIiLgotCi0gICogUFJFRFMgICAgICAgICAtIHNwZWNpZmllcyAiZmluZGxpYiItcHJlZGljYXRlcy4KLQotICAqIExJQlMgICAgICAgICAgLSBPQ2FtbC1saWJyYXJpZXMgdGhhdCBzaG91bGQgYmUgbGlua2VkIChqdXN0IHBsYWluIG5hbWVzKS4KLSAgICAgICAgICAgICAgICAgICAgRS5nLiBpZiB5b3Ugd2FudCB0byBsaW5rIHRoZSBTdHItbGlicmFyeSwganVzdCB3cml0ZQotICAgICAgICAgICAgICAgICAgICAic3RyIiAod2l0aG91dCBxdW90ZXMpLgotICAgICAgICAgICAgICAgICAgICBUaGUgbmV3IE9DYW1sLWNvbXBpbGVyIGhhbmRsZXMgbGlicmFyaWVzIGluIHN1Y2gKLSAgICAgICAgICAgICAgICAgICAgYSB3YXkgdGhhdCB0aGV5ICJyZW1lbWJlciIgd2hldGhlciB0aGV5IGhhdmUgdG8KLSAgICAgICAgICAgICAgICAgICAgYmUgbGlua2VkIGFnYWluc3QgYSBDLWxpYnJhcnkgYW5kIGl0IGdldHMgbGlua2VkCi0gICAgICAgICAgICAgICAgICAgIGluIGF1dG9tYXRpY2FsbHkuCi0gICAgICAgICAgICAgICAgICAgIElmIHRoZXJlIGlzIGEgc2xhc2ggaW4gdGhlIGxpYnJhcnkgbmFtZSAoc3VjaCBhcwotICAgICAgICAgICAgICAgICAgICAiLi9zdHIiIG9yICJsaWIvZm9vIikgdGhlbiBtYWtlIGlzIHRvbGQgdGhhdCB0aGUKLSAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkIGZpbGVzIGRlcGVuZCBvbiB0aGUgbGlicmFyeS4gIFRoaXMKLSAgICAgICAgICAgICAgICAgICAgaGVscHMgdG8gZW5zdXJlIHRoYXQgY2hhbmdlcyB0byB5b3VyIGxpYnJhcmllcyBhcmUKLSAgICAgICAgICAgICAgICAgICAgdGFrZW4gaW50byBhY2NvdW50LCB3aGljaCBpcyBpbXBvcnRhbnQgaWYgeW91IGFyZQotICAgICAgICAgICAgICAgICAgICByZWdlbmVyYXRpbmcgeW91ciBsaWJyYXJpZXMgZnJlcXVlbnRseS4KLSAgKiBDTElCUyAgICAgICAgIC0gQy1saWJyYXJpZXMgdGhhdCBzaG91bGQgYmUgbGlua2VkIChqdXN0IHBsYWluIG5hbWVzKS4KLQotICAqIFBSRV9UQVJHRVRTICAgLSBzZXQgdGhpcyB0byBhIGxpc3Qgb2YgdGFyZ2V0IGZpbGVzIHRoYXQgeW91IHdhbnQKLSAgICAgICAgICAgICAgICAgICAgdG8gaGF2ZSBidWlsZHQgYmVmb3JlIGRlcGVuZGVuY3kgY2FsY3VsYXRpb24gYWN0dWFsbHkKLSAgICAgICAgICAgICAgICAgICAgdGFrZXMgcGxhY2UuIEUuZy4gdXNlIHRoaXMgdG8gYXV0b21hdGljYWxseSBjb21waWxlCi0gICAgICAgICAgICAgICAgICAgIG1vZHVsZXMgbmVlZGVkIGJ5IGNhbWxwNCwgd2hpY2ggaGF2ZSB0byBiZSBhdmFpbGFibGUKLSAgICAgICAgICAgICAgICAgICAgYmVmb3JlIG90aGVyIG1vZHVsZXMgY2FuIGJlIHBhcnNlZCBhdCBhbGwuCi0KLSAgICAgICAgICAgICAgICAgICAgKiogV0FSTklORyAqKjogdGhlIGZpbGVzIG1lbnRpb25lZCBpbiB0aGlzIHZhcmlhYmxlCi0gICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgcmVtb3ZlZCB3aGVuICJtYWtlIGNsZWFuIiBpcyBleGVjdXRlZCEKLQotICAqIExJQklOU1RBTExfRklMRVMgLSB0aGUgZmlsZXMgb2YgYSBsaWJyYXJ5IHRoYXQgc2hvdWxkIGJlIGluc3RhbGxlZAotICAgICAgICAgICAgICAgICAgICAgICB1c2luZyAiZmluZGxpYiIuIERlZmF1bHQ6Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAkKFJFU1VMVCkubWxpICQoUkVTVUxUKS5jbWkgJChSRVNVTFQpLmNtYQotICAgICAgICAgICAgICAgICAgICAgICAgICQoUkVTVUxUKS5jbXhhICQoUkVTVUxUKS5hIGxpYiQoUkVTVUxUKS5hCi0KLSAgKiBPQ0FNTF9MSUJfSU5TVEFMTCAtIHRhcmdldCBkaXJlY3RvcnkgZm9yICJyYXdpbnN0YWxsL3Jhd3VuaW5zdGFsbCIuCi0gICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdDogJChPQ0FNTExJQlBBVEgpL2NvbnRyaWIpCi0KLSAgKiBET0NfRklMRVMgICAgIC0gbmFtZXMgb2YgZmlsZXMgZnJvbSB3aGljaCBkb2N1bWVudGF0aW9uIGlzIGdlbmVyYXRlZC4KLSAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQ6IGFsbCAubWxpLWZpbGVzIGluIHlvdXIgJChTT1VSQ0VTKSkuCi0KLSAgKiBET0NfRElSICAgICAgIC0gbmFtZSBvZiBkaXJlY3Rvcnkgd2hlcmUgZG9jdW1lbnRhdGlvbiBzaG91bGQgYmUgc3RvcmVkLgotCi0gICogT0NBTUxGTEFHUyAgICAtIGZsYWdzIHBhc3NlZCB0byB0aGUgY29tcGlsZXJzCi0gICogT0NBTUxCQ0ZMQUdTICAtIGZsYWdzIHBhc3NlZCB0byB0aGUgYnl0ZSBjb2RlIGNvbXBpbGVyIG9ubHkKLSAgKiBPQ0FNTE5DRkxBR1MgIC0gZmxhZ3MgcGFzc2VkIHRvIHRoZSBuYXRpdmUgY29kZSBjb21waWxlciBvbmx5Ci0KLSAgKiBPQ0FNTExERkxBR1MgIC0gZmxhZ3MgcGFzc2VkIHRvIHRoZSBPQ2FtbC1saW5rZXIKLSAgKiBPQ0FNTEJMREZMQUdTIC0gZmxhZ3MgcGFzc2VkIHRvIHRoZSBPQ2FtbC1saW5rZXIgd2hlbiBsaW5raW5nIGJ5dGUgY29kZQotICAqIE9DQU1MTkxERkxBR1MgLSBmbGFncyBwYXNzZWQgdG8gdGhlIE9DYW1sLWxpbmtlciB3aGVuIGxpbmtpbmcKLSAgICAgICAgICAgICAgICAgICAgbmF0aXZlIGNvZGUKLQotICAqIE9DQU1MTUtMSUJfRkxBR1MgLSBmbGFncyBwYXNzZWQgdG8gdGhlIE9DYW1sIGxpYnJhcnkgdG9vbAotCi0gICogT0NBTUxDUEZMQUdTICAtIHByb2ZpbGluZyBmbGFncyBwYXNzZWQgdG8gIm9jYW1sY3AiIChkZWZhdWx0OiAiYSIpCi0KLSAgKiBQUEZMQUdTICAgICAgIC0gYWRkaXRpb25hbCBmbGFncyBwYXNzZWQgdG8gdGhlIHByZXByb2Nlc3NvciAoZGVmYXVsdDogbm9uZSkKLQotICAqIExGTEFHUyAgICAgICAgLSBmbGFncyBwYXNzZWQgdG8gIm9jYW1sbGV4IgotICAqIFlGTEFHUyAgICAgICAgLSBmbGFncyBwYXNzZWQgdG8gIm9jYW1seWFjYyIKLSAgKiBJRExGTEFHUyAgICAgIC0gZmxhZ3MgcGFzc2VkIHRvICJjYW1saWRsIgotCi0gICogT0NBTUxET0NGTEFHUyAtIGZsYWdzIHBhc3NlZCB0byAib2NhbWxkb2MiCi0KLSAgKiBPQ0FNTEZJTkRfSU5TVEZMQUdTIC0gZmxhZ3MgcGFzc2VkIHRvICJvY2FtbGZpbmQiIGR1cmluZyBpbnN0YWxsYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQ6IG5vbmUpCi0KLSAgKiBEVklQU0ZMQUdTICAgIC0gZmxhZ3MgcGFzc2VkIHRvIGR2aXBzCi0gICAgICAgICAgICAgICAgICAgICh3aGVuIGdlbmVyYXRpbmcgZG9jdW1lbnRhdGlvbiBpbiBQb3N0U2NyaXB0KS4KLQotICAqIFNUQVRJQyAgICAgICAgLSBzZXQgdGhpcyB2YXJpYWJsZSBpZiB5b3Ugd2FudCB0byBmb3JjZSBjcmVhdGlvbgotICAgICAgICAgICAgICAgICAgICBvZiBzdGF0aWMgbGlicmFyaWVzCi0KLSAgKiBDQyAgICAgICAgICAgIC0gdGhlIEMtY29tcGlsZXIgdG8gYmUgdXNlZAotICAqIENYWCAgICAgICAgICAgLSB0aGUgQysrLWNvbXBpbGVyIHRvIGJlIHVzZWQKLQotICAqIENGTEFHUyAgICAgICAgLSBhZGRpdGlvbmFsIGZsYWdzIHBhc3NlZCB0byB0aGUgQy1jb21waWxlci4KLSAgICAgICAgICAgICAgICAgICAgVGhlIGZsYWcgIi1ETkFUSVZFX0NPREUiIHdpbGwgYmUgcGFzc2VkIGF1dG9tYXRpY2FsbHkKLSAgICAgICAgICAgICAgICAgICAgaWYgeW91IGNob29zZSB0byBidWlsZCBuYXRpdmUgY29kZS4gVGhpcyBhbGxvd3MgeW91Ci0gICAgICAgICAgICAgICAgICAgIHRvIGNvbXBpbGUgeW91ciBDLWZpbGVzIGNvbmRpdGlvbmFsbHkuIEJ1dCBwbGVhc2UKLSAgICAgICAgICAgICAgICAgICAgbm90ZTogWW91IHNob3VsZCBkbyBhICJtYWtlIGNsZWFuIiBvciByZW1vdmUgdGhlCi0gICAgICAgICAgICAgICAgICAgIG9iamVjdCBmaWxlcyBtYW51YWxseSBvciB0b3VjaCB0aGUgJS5jLWZpbGVzOgotICAgICAgICAgICAgICAgICAgICBvdGhlcndpc2UsIHRoZXkgbWF5IG5vdCBiZSBjb3JyZWN0bHkgcmVjb21waWxlZAotICAgICAgICAgICAgICAgICAgICBiZXR3ZWVuIGRpZmZlcmVudCBidWlsZHMuCi0KLSAgKiBDWFhGTEFHUyAgICAgIC0gYWRkaXRpb25hbCBmbGFncyBwYXNzZWQgdG8gdGhlIEMrKy1jb21waWxlci4KLQotICAqIENQUEZMQUdTICAgICAgLSBhZGRpdGlvbmFsIGZsYWdzIHBhc3NlZCB0byB0aGUgQy1wcmVwcm9jZXNzb3IuCi0KLSAgKiBDRlJBTUVXT1JLUyAgIC0gT2JqZWN0aXZlLUMgZnJhbWV3b3JrIHRvIHBhc3MgdG8gbGlua2VyIG9uIE1hY09TIFguCi0KLSAgKiBMREZMQUdTICAgICAgIC0gYWRkaXRpb25hbCBmbGFncyBwYXNzZWQgdG8gdGhlIEMtbGlua2VyCi0KLSAgKiBSUEFUSF9GTEFHICAgIC0gZmxhZyBwYXNzZWQgdGhyb3VnaCB0byB0aGUgQy1saW5rZXIgdG8gc2V0IGEgcGF0aCBmb3IKLSAgICAgICAgICAgICAgICAgICAgZHluYW1pYyBsaWJyYXJpZXMuICBNYXkgbmVlZCB0byBiZSBzZXQgYnkgdXNlciBvbgotICAgICAgICAgICAgICAgICAgICBleG90aWMgcGxhdGZvcm1zLiAgKGRlZmF1bHQ6ICItUiIpLgotCi0gICogRUxGX1JQQVRIX0ZMQUcgLSB0aGlzIGZsYWcgaXMgdXNlZCB0byBzZXQgdGhlIHJwYXRoIG9uIEVMRi1wbGF0Zm9ybXMuCi0gICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdDogIi1SIikKLQotICAqIEVMRl9SUEFUSCAgICAgLSBpZiB0aGlzIGZsYWcgaXMgInllcyIsIHRoZW4gdGhlIFJQQVRIX0ZMQUcgd2lsbCBiZQotICAgICAgICAgICAgICAgICAgICBwYXNzZWQgYnkgIi1XbCIgdG8gdGhlIGxpbmtlciBhcyBub3JtYWwgb24KLSAgICAgICAgICAgICAgICAgICAgRUxGLXBsYXRmb3Jtcy4KLQotICAqIE9DQU1MTElCUEFUSCAgLSBwYXRoIHRvIHRoZSBPQ2FtbC1zdGFuZGFyZC1saWJyYXJpZXMKLSAgICAgICAgICAgICAgICAgICAgKGZpcnN0IGRlZmF1bHQ6IGAkKE9DQU1MQykgLXdoZXJlYCkKLSAgICAgICAgICAgICAgICAgICAgKHNlY29uZCBkZWZhdWx0OiAiL3Vzci9sb2NhbC9saWIvb2NhbWwiKQotCi0gICogT0NBTUxfREVGQVVMVF9ESVJTIC0gYWRkaXRpb25hbCBwYXRoIGluIHdoaWNoIHRoZSB1c2VyIGNhbiBzdXBwbHkKLSAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IGRpcmVjdG9yaWVzIHRvIGhpcyBvd24gY29sbGVjdGlvbiBvZgotICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnJhcmllcy4gIFRoZSBpZGVhIGlzIHRvIHBhc3MgdGhpcyBhcyBhbiBlbnZpcm9ubWVudAotICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlIHNvIHRoYXQgdGhlIE1ha2VmaWxlcyBkbyBub3QgaGF2ZSB0byBjb250YWluCi0gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBwYXRoIGFsbCB0aGUgdGltZS4KLQotICAqIE9DQU1MRklORCAgICAgLSBvY2FtbGZpbmQgZnJvbSBmaW5kbGliICAgICAgIChkZWZhdWx0OiAib2NhbWxmaW5kIikKLSAgKiBPQ0FNTEMgICAgICAgIC0gYnl0ZS1jb2RlIGNvbXBpbGVyICAgICAgICAgICAoZGVmYXVsdDogIm9jYW1sYyIpCi0gICogT0NBTUxPUFQgICAgICAtIG5hdGl2ZS1jb2RlIGNvbXBpbGVyICAgICAgICAgKGRlZmF1bHQ6ICJvY2FtbG9wdCIpCi0gICogT0NBTUxNS1RPUCAgICAtIHRvcC1sZXZlbCBjb21waWxlciAgICAgICAgICAgKGRlZmF1bHQ6ICJvY2FtbG1rdG9wIikKLSAgKiBPQ0FNTENQICAgICAgIC0gcHJvZmlsaW5nIGJ5dGUtY29kZSBjb21waWxlciAoZGVmYXVsdDogIm9jYW1sY3AiKQotICAqIE9DQU1MREVQICAgICAgLSBkZXBlbmRlbmN5IGdlbmVyYXRvciAgICAgICAgIChkZWZhdWx0OiAib2NhbWxkZXAiKQotICAqIE9DQU1MTEVYICAgICAgLSBzY2FubmVyIGdlbmVyYXRvciAgICAgICAgICAgIChkZWZhdWx0OiAib2NhbWxsZXgiKQotICAqIE9DQU1MWUFDQyAgICAgLSBwYXJzZXIgZ2VuZXJhdG9yICAgICAgICAgICAgIChkZWZhdWx0OiAib2NhbWx5YWNjIikKLSAgKiBPQ0FNTE1LTElCICAgIC0gdG9vbCB0byBjcmVhdGUgbGlicmFyaWVzICAgICAoZGVmYXVsdDogIm9jYW1sbWtsaWIiKQotICAqIENBTUxJREwgICAgICAgLSBJREwtY29kZSBnZW5lcmF0b3IgICAgICAgICAgIChkZWZhdWx0OiAiY2FtbGlkbCIpCi0gICogQ0FNTElETERMTCAgICAtIElETC11dGlsaXR5ICAgICAgICAgICAgICAgICAgKGRlZmF1bHQ6ICJjYW1saWRsZGxsIikKLSAgKiBDQU1MUDQgICAgICAgIC0gY2FtbHA0IHByZXByb2Nlc3NvciAgICAgICAgICAoZGVmYXVsdDogImNhbWxwNCIpCi0gICogT0NBTUxET0MgICAgICAtIE9DYW1sZG9jLWNvbW1hbmQgICAgICAgICAgICAgKGRlZmF1bHQ6ICJvY2FtbGRvYyIpCi0KLSAgKiBMQVRFWCAgICAgICAgIC0gTGF0ZXgtcHJvY2Vzc29yICAgICAgICAgICAgICAoZGVmYXVsdDogImxhdGV4IikKLSAgKiBEVklQUyAgICAgICAgIC0gZHZpcHMtY29tbWFuZCAgICAgICAgICAgICAgICAoZGVmYXVsdDogImR2aXBzIikKLSAgKiBQUzJQREYgICAgICAgIC0gUG9zdFNjcmlwdC10by1QREYgY29udmVydGVyICAoZGVmYXVsdDogInBzMnBkZiIpCi0KLSAgKiBDQU1FTEVPTl9SRVBPUlQgLSByZXBvcnQgdG9vbCBvZiBDYW1lbGVvbiAgKGRlZmF1bHQ6ICJyZXBvcnQiKQotICAqIENBTUVMRU9OX1JFUE9SVF9GTEFHUyAtIGZsYWdzIGZvciB0aGUgcmVwb3J0IHRvb2wgb2YgQ2FtZWxlb24KLQotICAqIENBTUVMRU9OX1pPR0dZIC0gem9nZ3kgdG9vbCBvZiBDYW1lbGVvbgotICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQ6ICJjYW1scDRvIHBhX3pvZy5jbWEgcHJfby5jbW8iKQotICAqIENBTUVMRU9OX1pPR0dZX0ZMQUdTIC0gZmxhZ3MgZm9yIHRoZSB6b2dneSB0b29sIG9mIENhbWVsZW9uCi0KLSAgKiBPQ0FNTF9HTEFERUNDIC0gR2xhZGUgY29tcGlsZXIgZm9yIE9DYW1sICAgICAoZGVmYXVsdDogImxhYmxnbGFkZWNjMiIpCi0gICogT0NBTUxfR0xBREVDQ19GTEFHUyAtIGZsYWdzIGZvciB0aGUgR2xhZGUgY29tcGlsZXIKLQotICAqIE9YUklETCAgICAgICAgLSBPWFJJREwtZ2VuZXJhdG9yICAoZGVmYXVsdDogIm94cmlkbCIpCi0KLSAgKiBOT0lETEhFQURFUiAgIC0gc2V0IHRvICJ5ZXMiIHRvIHByb2hpYml0ICJPQ2FtbE1ha2VmaWxlIiBmcm9tIHVzaW5nCi0gICAgICAgICAgICAgICAgICAgIHRoZSBkZWZhdWx0IGNhbWxpZGwtZmxhZyAiLWhlYWRlciIuCi0KLSAgKiBOT19DVVNUT00gICAgIC0gUHJldmVudCBsaW5raW5nIGluIGN1c3RvbSBtb2RlLgotCi0gICogUVVJRVQgICAgICAgICAtIHVuc2V0dGluZyB0aGlzIHZhcmlhYmxlIChlLmcuICJtYWtlIFFVSUVUPSIpCi0gICAgICAgICAgICAgICAgICAgIHdpbGwgcHJpbnQgYWxsIGV4ZWN1dGVkIGNvbW1hbmRzLCBpbmNsdWRpbmcKLSAgICAgICAgICAgICAgICAgICAgaW50ZXJtZWRpYXRlIG9uZXMuIFRoaXMgYWxsb3dzIG1vcmUgY29tZm9ydGFibGUKLSAgICAgICAgICAgICAgICAgICAgZGVidWdnaW5nIHdoZW4gdGhpbmdzIGdvIHdyb25nIGR1cmluZyBhIGJ1aWxkLgotCi0gICogUkVBTExZX1FVSUVUICAtIHdoZW4gc2V0IHRoaXMgZmxhZyB0dXJucyBvZmYgb3V0cHV0IGZyb20gc29tZSBjb21tYW5kcy4KLQotICAqIE9DQU1MTUFLRUZJTEUgLSBsb2NhdGlvbiBvZiAoPXBhdGggdG8pIHRoaXMgIk9DYW1sTWFrZWZpbGUiLgotICAgICAgICAgICAgICAgICAgICBCZWNhdXNlIGl0IGNhbGxlcyBpdHNlbGYgcmVjdXJzaXZlbHksIGl0IGhhcyB0bwotICAgICAgICAgICAgICAgICAgICBrbm93IHdoZXJlIGl0IGlzLiAoZGVmYXVsdDogIk9DYW1sTWFrZWZpbGUiID0KLSAgICAgICAgICAgICAgICAgICAgbG9jYWwgZGlyZWN0b3J5KQotCi0gICogQkNTVUZGSVggICAgICAtIFN1ZmZpeCBmb3IgYWxsIGJ5dGUtY29kZSBmaWxlcy4gRS5nLjoKLQotICAgICAgICAgICAgICAgICAgICAgIFJFU1VMVCAgID0gZm9vCi0gICAgICAgICAgICAgICAgICAgICAgQkNTVUZGSVggPSBfYmMKLQotICAgICAgICAgICAgICAgICAgICBUaGlzIHdpbGwgcHJvZHVjZSBieXRlLWNvZGUgZXhlY3V0YWJsZXMvbGlicmFyaWVzCi0gICAgICAgICAgICAgICAgICAgIHdpdGggYmFzZW5hbWUgImZvb19iYyIuCi0KLSAgKiBOQ1NVRkZJWCAgICAgIC0gU2ltaWxhciB0byAiQkNTVUZGSVgiLCBidXQgZm9yIG5hdGl2ZS1jb2RlIGZpbGVzLgotICAqIFRPUFNVRkZJWCAgICAgLSBTdWZmaXggYWRkZWQgdG8gdG9wbGV2ZWwgaW50ZXJwcmV0ZXJzIChkZWZhdWx0OiAiLnRvcCIpCi0KLSAgKiBTVUJQUk9KUyAgICAgIC0gdmFyaWFibGUgY29udGFpbmluZyB0aGUgbmFtZXMgb2Ygc3VicHJvamVjdHMgdG8gYmUKLSAgICAgICAgICAgICAgICAgICAgY29tcGlsZWQuCi0KLSAgKiBTVUJUQVJHRVQgICAgIC0gdGFyZ2V0IHRvIGJlIGJ1aWx0IGZvciBhbGwgcHJvamVjdHMgaW4gdmFyaWFibGUKLSAgICAgICAgICAgICAgICAgICAgU1VCUFJPSlMuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsIHZhcmlhYmxlcyBmb3IgV2luZG93cyB1c2VycwotCi0gICogTUlOR1cgICAgICAgICAtIHZhcmlhYmxlIHRvIGRldGVjdCB0aGUgTUlOR1ctZW52aXJvbm1lbnQKLSAgKiBNU1ZDICAgICAgICAgIC0gdmFyaWFibGUgdG8gZGV0ZWN0IHRoZSBNU1ZDLWNvbXBpbGVyCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1VcC10by1kYXRlIGluZm9ybWF0aW9uIChuZXdlc3QgcmVsZWFzZSBvZiBkaXN0cmlidXRpb24pIGNhbiBhbHdheXMgYmUKLWZvdW5kIGF0OgotCi0gIGh0dHA6Ly93d3cub2NhbWwuaW5mby9ob21lL29jYW1sX3NvdXJjZXMuaHRtbAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotRW5qb3khCi0KLU5ldyBZb3JrLCAyMDA3LTA0LTIyCi1NYXJrdXMgTW90dGwKLQotZS1tYWlsOiBtYXJrdXMubW90dGxAZ21haWwuY29tCi1XV1c6ICAgIGh0dHA6Ly93d3cub2NhbWwuaW5mbwpkaWZmIC0tZ2l0IGEvbGliL29jYW1sL19vYXNpcyBiL2xpYi9vY2FtbC9fb2FzaXMKaW5kZXggY2JmYTdkMS4uNWFkOTBkZiAxMDA2NDQKLS0tIGEvbGliL29jYW1sL19vYXNpcworKysgYi9saWIvb2NhbWwvX29hc2lzCkBAIC0xLDUgKzEsNSBAQAogTmFtZTogbGlidGhyaWZ0LW9jYW1sCi1WZXJzaW9uOiAwLjkuMworVmVyc2lvbjogMS4wLjAKIE9BU0lTRm9ybWF0OiAwLjMKIFN5bm9wc2lzOiBPQ2FtbCBiaW5kaW5ncyBmb3IgdGhlIEFwYWNoZSBUaHJpZnQgUlBDIHN5c3RlbQogQXV0aG9yczogQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+CmRpZmYgLS1naXQgYS9saWIvb2NhbWwvZGVzY3IgYi9saWIvb2NhbWwvZGVzY3IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQxNzQ5ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vY2FtbC9kZXNjcgpAQCAtMCwwICsxIEBACitPQ2FtbCBiaW5kaW5ncyBmb3IgdGhlIEFwYWNoZSBUaHJpZnQgUlBDIHN5c3RlbQpkaWZmIC0tZ2l0IGEvbGliL29jYW1sL29wYW0gYi9saWIvb2NhbWwvb3BhbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGJjM2Q5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29jYW1sL29wYW0KQEAgLTAsMCArMSw4IEBACitvcGFtLXZlcnNpb246ICIxIgorbWFpbnRhaW5lcjogIlhYWChGSUxMIE1FIElOIFdJVEggRU1BSUwpIgorYnVpbGQ6IFsKKyAgW21ha2VdCisgIFttYWtlICJpbnN0YWxsIl0KK10KK3JlbW92ZTogW1sib2NhbWxmaW5kIiAicmVtb3ZlIiAidGhyaWZ0Il1dCitkZXBlbmRzOiBbIm9jYW1sZmluZCJdCmRpZmYgLS1naXQgYS9saWIvb2NhbWwvdXJsIGIvbGliL29jYW1sL3VybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTRkNjA0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29jYW1sL3VybApAQCAtMCwwICsxLDIgQEAKK2FyY2hpdmU6ICJYWFgoRklMTCBNRSBJTiBXSVRIIFVSTCkiCitjaGVja3N1bTogIlhYWChGSUxMIE1FIElOIFdJVEggTUQ1KSIKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL01BTklGRVNULlNLSVAgYi9saWIvcGVybC9NQU5JRkVTVC5TS0lQCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NjNiNDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGVybC9NQU5JRkVTVC5TS0lQCkBAIC0wLDAgKzEsMTMgQEAKK2JsaWIvLiokCitidWlsZC1jcGFuLWRpc3Quc2gKK0ZpeHVwRGlzdC5wbAorTUFOSUZFU1QuYmFrCitNQU5JRkVTVC5TS0lQCitNWU1FVEEuanNvbgorTWFrZWZpbGUKK01ha2VmaWxlLmFtCitNYWtlZmlsZS5pbgorcG1fdG9fYmxpYgordGVzdC9NYWtlZmlsZS5hbQordGVzdC9NYWtlZmlsZS5pbgordG9vbHMvRml4dXBEaXN0LnBsCmRpZmYgLS1naXQgYS9saWIvcGVybC9NYWtlZmlsZS5QTCBiL2xpYi9wZXJsL01ha2VmaWxlLlBMCmluZGV4IGNlY2E4NmYuLmJkZWFhZDIgMTAwNjQ0Ci0tLSBhL2xpYi9wZXJsL01ha2VmaWxlLlBMCisrKyBiL2xpYi9wZXJsL01ha2VmaWxlLlBMCkBAIC0xNywxMyArMTcsMjAgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKK3VzZSA1LjEwLjA7Cit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCiB1c2UgRXh0VXRpbHM6Ok1ha2VNYWtlcjsKLVdyaXRlTWFrZWZpbGUoICdOQU1FJyA9PiAnVGhyaWZ0JywKLSAgICAgICAgICAgICAgICdWRVJTSU9OX0ZST00nID0+ICdsaWIvVGhyaWZ0LnBtJywKLSAgICAgICAgICAgICAgICdQUkVSRVFfUE0nICAgICAgICAgICAgICA9PiB7Ci0gICAgICAgICAgICAgICAgICAgJ0JpdDo6VmVjdG9yJyA9PiAwLAorCitXcml0ZU1ha2VmaWxlKCBBQlNUUkFDVCA9PiAnQXBhY2hlIFRocmlmdCBpcyBhIHNvZnR3YXJlIGZyYW1ld29yayBmb3Igc2NhbGFibGUgY3Jvc3MtbGFuZ3VhZ2Ugc2VydmljZXMgZGV2ZWxvcG1lbnQuJywKKyAgICAgICAgICAgICAgIEFVVEhPUiA9PiAnQXBhY2hlIFRocmlmdCA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPicsCisgICAgICAgICAgICAgICBMSUNFTlNFID0+ICdhcGFjaGVfMl8wJywKKyAgICAgICAgICAgICAgIE1JTl9QRVJMX1ZFUlNJT04gPT4gJzUuMDEwMDAwJywKKyAgICAgICAgICAgICAgIE5BTUUgPT4gJ1RocmlmdCcsCisgICAgICAgICAgICAgICBORUVEU19MSU5LSU5HID0+IDAsCisgICAgICAgICAgICAgICBQUkVSRVFfUE0gPT4geworICAgICAgICAgICAgICAgICAgICdCaXQ6OlZlY3RvcicgICAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgJ0NsYXNzOjpBY2Nlc3NvcicgPT4gMAogICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICgkXSA+PSA1LjAwNSA/Ci0gKCAgICAgICAgICAgICAgICBBVVRIT1IgICAgID0+ICdBcGFjaGUgVGhyaWZ0IDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+JykgOiAoKSksCi0gICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgVkVSU0lPTl9GUk9NID0+ICdsaWIvVGhyaWZ0LnBtJyApOwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvTWFrZWZpbGUuYW0gYi9saWIvcGVybC9NYWtlZmlsZS5hbQppbmRleCA2YjBmOWRkLi5mYTBmMTZiIDEwMDY0NAotLS0gYS9saWIvcGVybC9NYWtlZmlsZS5hbQorKysgYi9saWIvcGVybC9NYWtlZmlsZS5hbQpAQCAtMjMsMzIgKzIzLDI5IEBACiAJJChQRVJMKSBNYWtlZmlsZS5QTCBNQUtFRklMRT1NYWtlZmlsZS1wZXJsLm1rIElOU1RBTExESVJTPSQoSU5TVEFMTERJUlMpIElOU1RBTExfQkFTRT0kKFBFUkxfUFJFRklYKQogCiBhbGwtbG9jYWw6IE1ha2VmaWxlLXBlcmwubWsKLQkkKE1BS0UpIC1mIE1ha2VmaWxlLXBlcmwubWsKKwkkKE1BS0UpIC1mICQ8CiAJZmluZCBibGliIC1uYW1lICdNYWtlZmlsZSonIC1leGVjIHJtIC1mIHt9IFw7CiAKLWNoZWNrLWxvY2FsOgotCSQoUEVSTCkgLUlibGliL2xpYiAtSUBhYnNfc3JjZGlyQCAtSUBidWlsZGRpckAvdGVzdC9nZW4tcGVybCBcCi0JCS1JQGJ1aWxkZGlyQC90ZXN0L2dlbi1wZXJsL0JlbmNobWFya1Rlc3QgXAotCQktSUBidWlsZGRpckAvdGVzdC9nZW4tcGVybC9BZ2dyIFwKLQkJQGFic19zcmNkaXJAL3Rlc3QucGwgQGFic19zcmNkaXJAL3Rlc3QvKi50Ci0KIGluc3RhbGwtZXhlYy1sb2NhbDogTWFrZWZpbGUtcGVybC5tawotCSQoTUFLRSkgLWYgTWFrZWZpbGUtcGVybC5tayBpbnN0YWxsIERFU1RESVI9JChERVNURElSKS8KKwkkKE1BS0UpIC1mICQ8IGluc3RhbGwgREVTVERJUj0kKERFU1RESVIpLwogCiBjbGVhbi1sb2NhbDoKIAlpZiB0ZXN0IC1mIE1ha2VmaWxlLXBlcmwubWsgOyB0aGVuIFwKIAkJJChNQUtFKSAtZiBNYWtlZmlsZS1wZXJsLm1rIGNsZWFuIDsgXAogCWZpCi0Jcm0gLWYgTWFrZWZpbGUtcGVybC5tay5vbGQKKwkkKFJNKSBNYWtlZmlsZS1wZXJsLm1rLm9sZAorCSQoUk0pIC1yIGdlbi1wZXJsIGdlbi1wZXJsMgogCiBFWFRSQV9ESVNUID0gXAogCWNvZGluZ19zdGFuZGFyZHMubWQgXAorCWJ1aWxkLWNwYW4tZGlzdC5zaCBcCiAJTWFrZWZpbGUuUEwgXAogCXRlc3QucGwgXAogCWxpYi9UaHJpZnQucG0gXAogCWxpYi9UaHJpZnQucG0gXAogCWxpYi9UaHJpZnQvQmluYXJ5UHJvdG9jb2wucG0gXAogCWxpYi9UaHJpZnQvQnVmZmVyZWRUcmFuc3BvcnQucG0gXAorCWxpYi9UaHJpZnQvRXhjZXB0aW9uLnBtIFwKIAlsaWIvVGhyaWZ0L0ZyYW1lZFRyYW5zcG9ydC5wbSBcCiAJbGliL1RocmlmdC9IdHRwQ2xpZW50LnBtIFwKIAlsaWIvVGhyaWZ0L01lbW9yeUJ1ZmZlci5wbSBcCkBAIC02Miw1ICs1OSw1MCBAQAogCWxpYi9UaHJpZnQvU29ja2V0LnBtIFwKIAlsaWIvVGhyaWZ0L1NTTFNvY2tldC5wbSBcCiAJbGliL1RocmlmdC9TU0xTZXJ2ZXJTb2NrZXQucG0gXAorCWxpYi9UaHJpZnQvVW5peFNlcnZlclNvY2tldC5wbSBcCisJbGliL1RocmlmdC9Vbml4U29ja2V0LnBtIFwKKwlsaWIvVGhyaWZ0L1R5cGUucG0gXAogCWxpYi9UaHJpZnQvVHJhbnNwb3J0LnBtIFwKIAlSRUFETUUubWQKKworVEhSSUZUID0gQHRvcF9idWlsZGRpckAvY29tcGlsZXIvY3BwL3RocmlmdAorVEhSSUZUX0lGID0gQHRvcF9zcmNkaXJAL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKK05BTUVfQkVOQ0hNQVJLU0VSVklDRSA9ICBAdG9wX3NyY2RpckAvbGliL3JiL2JlbmNobWFyay9CZW5jaG1hcmsudGhyaWZ0CitOQU1FX0FHR1IgPSBAdG9wX3NyY2RpckAvY29udHJpYi9hc3luYy10ZXN0L2FnZ3IudGhyaWZ0CisKK1RIUklGVFRFU1RfR0VOID0gXAorCWdlbi1wZXJsL1RocmlmdFRlc3QvQ29uc3RhbnRzLnBtIFwKKwlnZW4tcGVybC9UaHJpZnRUZXN0L1NlY29uZFNlcnZpY2UucG0gXAorCWdlbi1wZXJsL1RocmlmdFRlc3QvVGhyaWZ0VGVzdC5wbSBcCisJZ2VuLXBlcmwvVGhyaWZ0VGVzdC9UeXBlcy5wbQorCitCRU5DSE1BUktfR0VOID0gXAorCWdlbi1wZXJsL0JlbmNobWFya1NlcnZpY2UucG0gXAorCWdlbi1wZXJsL0NvbnN0YW50cy5wbSBcCisJZ2VuLXBlcmwvVHlwZXMucG0KKworQUdHUl9HRU4gPSBcCisJZ2VuLXBlcmwyL0FnZ3IucG0gXAorCWdlbi1wZXJsMi9Db25zdGFudHMucG0gXAorCWdlbi1wZXJsMi9UeXBlcy5wbQorCitQRVJMX0dFTiA9IFwKKwkkKFRIUklGVFRFU1RfR0VOKSBcCisJJChCRU5DSE1BUktfR0VOKSBcCisJJChBR0dSX0dFTikKKworQlVJTFRfU09VUkNFUyA9ICQoUEVSTF9HRU4pCisKK2NoZWNrLWxvY2FsOiAkKFBFUkxfR0VOKQorCSQoUEVSTCkgLUlibGliL2xpYiAtSUBhYnNfc3JjZGlyQCAtSUBidWlsZGRpckAvZ2VuLXBlcmwyIC1JQGJ1aWxkZGlyQC9nZW4tcGVybCBcCisJCUBhYnNfc3JjZGlyQC90ZXN0LnBsIEBhYnNfc3JjZGlyQC90ZXN0LyoudAorCiskKFRIUklGVFRFU1RfR0VOKTogJChUSFJJRlRfSUYpICQoVEhSSUZUKQorCSQoVEhSSUZUKSAtLWdlbiBwZXJsICQ8CisKKyQoQkVOQ0hNQVJLX0dFTik6ICQoTkFNRV9CRU5DSE1BUktTRVJWSUNFKSAkKFRIUklGVCkKKwkkKFRIUklGVCkgLS1nZW4gcGVybCAkPAorCiskKEFHR1JfR0VOKTogJChOQU1FX0FHR1IpICQoVEhSSUZUKQorCSQoTUtESVJfUCkgZ2VuLXBlcmwyCisJJChUSFJJRlQpIC1vdXQgZ2VuLXBlcmwyIC0tZ2VuIHBlcmwgJDwKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL1JFQURNRS5tZCBiL2xpYi9wZXJsL1JFQURNRS5tZAppbmRleCA1MTI0N2UwLi5iZDFlNWIyIDEwMDY0NAotLS0gYS9saWIvcGVybC9SRUFETUUubWQKKysrIGIvbGliL3BlcmwvUkVBRE1FLm1kCkBAIC0xLDcgKzEsMTMgQEAKIFRocmlmdCBQZXJsIFNvZnR3YXJlIExpYnJhcnkKIAotTGljZW5zZQotPT09PT09PQorIyBTdW1tYXJ5CisKK0FwYWNoZSBUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzIGRldmVsb3BtZW50LgorSXQgY29tYmluZXMgYSBzb2Z0d2FyZSBzdGFjayB3aXRoIGEgY29kZSBnZW5lcmF0aW9uIGVuZ2luZSB0byBidWlsZCBzZXJ2aWNlcyB0aGF0IHdvcmsKK2VmZmljaWVudGx5IGFuZCBzZWFtbGVzc2x5IGJldHdlZW4gbWFueSBwcm9ncmFtbWluZyBsYW5ndWFnZXMuICBBIGxhbmd1YWdlLW5ldXRyYWwgSURMCitpcyB1c2VkIHRvIGdlbmVyYXRlIGZ1bmN0aW9uaW5nIGNsaWVudCBsaWJyYXJpZXMgYW5kIHNlcnZlci1zaWRlIGhhbmRsaW5nIGZyYW1ld29ya3MuCisKKyMgTGljZW5zZQogCiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQpAQCAtMjAsMTAgKzI2LDEzIEBACiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiB1bmRlciB0aGUgTGljZW5zZS4KIAotVXNpbmcgVGhyaWZ0IHdpdGggUGVybAotPT09PT09PT09PT09PT09PT09PT09CisjIEZvciBNb3JlIEluZm9ybWF0aW9uCiAKLVRocmlmdCByZXF1aXJlcyBQZXJsID49IDUuNi4wCitTZWUgdGhlIFtBcGFjaGUgVGhyaWZ0IFdlYiBTaXRlXShodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworIyBVc2luZyBUaHJpZnQgd2l0aCBQZXJsCisKK1RocmlmdCByZXF1aXJlcyBQZXJsID49IDUuMTAuMAogCiBVbmV4cGVjdGVkIGV4Y2VwdGlvbnMgaW4gYSBzZXJ2aWNlIGhhbmRsZXIgYXJlIGNvbnZlcnRlZCB0bwogVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHdpdGggdHlwZSBJTlRFUk5BTCBFUlJPUiBhbmQgdGhlIHN0cmluZwpAQCAtMzQsMTIgKzQzLDgyIEBACiAKIFBsZWFzZSBzZWUgdHV0b3JhbCBhbmQgdGVzdCBkaXJzIGZvciBleGFtcGxlcy4KIAotRGVwZW5kZW5jaWVzCi09PT09PT09PT09PT0KK1RoZSBQZXJsIEZvcmtpbmdTZXJ2ZXIgaWdub3JlcyBTSUdDSExEIGFsbG93aW5nIHRoZSBmb3JrcyB0byBiZQorcmVhcGVkIGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtIG5hdHVyYWxseSB3aGVuIHRoZXkgZXhpdC4gIFRoaXMgbWVhbnMKK29uZSBjYW5ub3QgdXNlIGEgY3VzdG9tIFNJR0NITEQgaGFuZGxlciBpbiB0aGUgY29uc3VtaW5nIHBlcmwKK2ltcGxlbWVudGF0aW9uIHRoYXQgY2FsbHMgc2VydmUoKS4gIEl0IGlzIGFjY2VwdGFibGUgdG8gdXNlCithIGN1c3RvbSBTSUdDSExEIGhhbmRsZXIgd2l0aGluIGEgdGhyaWZ0IGhhbmRsZXIgaW1wbGVtZW50YXRpb24KK2FzIHRoZSBGb3JraW5nU2VydmVyIHJlc2V0cyB0aGUgZm9ya2VkIGNoaWxkIHByb2Nlc3MgdG8gdXNlCitkZWZhdWx0IHNpZ25hbCBoYW5kbGluZy4KIAotQml0OjpWZWN0b3IgICAgICAgLSBjb21lcyB3aXRoIG1vZGVybiBwZXJsIGluc3RhbGxhdGlvbnMuCi1DbGFzczo6QWNjZXNzb3IKLUlPOjpTb2NrZXQ6OklORVQgIC0gY29tZXMgd2l0aCBtb2Rlcm4gcGVybCBpbnN0YWxsYXRpb25zLgotSU86OlNvY2tldDo6U1NMICAgLSByZXF1aXJlZCBpZiB1c2luZyBTU0wvVExTLgotTkVUOjpTU0xlYXkKLUNyeXB0OjpTU0xlYXkgICAgIC0gZm9yIG1ha2UgY3Jvc3MKKyMgRGVwZW5kZW5jaWVzCisKK1RoZSBmb2xsb3dpbmcgbW9kdWxlcyBhcmUgbm90IHByb3ZpZGVkIGJ5IFBlcmwgNS4xMC4wIGJ1dCBhcmUgcmVxdWlyZWQKK3RvIHVzZSBUaHJpZnQuCisKKyMjIFJ1bnRpbWUKKworICAqIEJpdDo6VmVjdG9yCisgICogQ2xhc3M6OkFjY2Vzc29yCisKKyMjIyBIdHRwQ2xpZW50IFRyYW5zcG9ydAorCitUaGVzZSBhcmUgb25seSByZXF1aXJlZCBpZiB1c2luZyBUaHJpZnQ6Okh0dHBDbGllbnQ6CisKKyAgKiBIVFRQOjpSZXF1ZXN0CisgICogSU86OlN0cmluZworICAqIExXUDo6VXNlckFnZW50CisKKyMjIyBTU0wvVExTCisKK1RoZXNlIGFyZSBvbmx5IHJlcXVpcmVkIGlmIHVzaW5nIFRocmlmdDo6U1NMU29ja2V0IG9yIFRocmlmdDo6U1NMU2VydmVyU29ja2V0OgorCisgICogSU86OlNvY2tldDo6U1NMCisKKyMgQnJlYWtpbmcgQ2hhbmdlcworCisjIyAwLjEwLjAKKworVGhlIHNvY2tldCBjbGFzc2VzIHdlcmUgcmVmYWN0b3JlZCBpbiAwLjEwLjAgc28gdGhhdCB0aGVyZSBpcyBvbmUgcGFja2FnZSBwZXIKK2ZpbGUuICBUaGlzIG1lYW5zIGB1c2UgU29ja2V0O2Agbm8gbG9uZ2VyIGRlZmluZXMgU1NMU29ja2V0LiAgWW91IGNhbiB1c2UgdGhpcwordGVjaG5pcXVlIHRvIG1ha2UgeW91ciBhcHBsaWNhdGlvbiBydW4gYWdhaW5zdCAwLjEwLjAgYXMgd2VsbCBhcyBlYXJsaWVyIHZlcnNpb25zOgorCitgZXZhbCB7IHJlcXVpcmUgVGhyaWZ0OjpTU0xTb2NrZXQ7IH0gb3IgZG8geyByZXF1aXJlIFRocmlmdDo6U29ja2V0OyB9YAorCisjIyAwLjExLjAKKworICAqIE5hbWVzcGFjZXMgb2YgcGFja2FnZXMgdGhhdCB3ZXJlIG5vdCBzY29wZWQgd2l0aGluIFRocmlmdCBoYXZlIGJlZW4gZml4ZWQuCisgICoqIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBpcyBub3cgVGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb24KKyAgKiogVEV4Y2VwdGlvbiBpcyBub3cgVGhyaWZ0OjpURXhjZXB0aW9uCisgICoqIFRNZXNzYWdlVHlwZSBpcyBub3cgVGhyaWZ0OjpUTWVzc2FnZVR5cGUKKyAgKiogVFByb3RvY29sRXhjZXB0aW9uIGlzIG5vdyBUaHJpZnQ6OlRQcm90b2NvbEV4Y2VwdGlvbgorICAqKiBUUHJvdG9jb2xGYWN0b3J5IGlzIG5vdyBUaHJpZnQ6OlRQcm90b2NvbEZhY3RvcnkKKyAgKiogVFRyYW5zcG9ydEV4Y2VwdGlvbiBpcyBub3cgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uCisgICoqIFRUeXBlIGlzIG5vdyBUaHJpZnQ6OlRUeXBlCisKK0lmIHlvdSBuZWVkIGEgc2luZ2xlIHZlcnNpb24gb2YgeW91ciBjb2RlIHRvIHdvcmsgd2l0aCBib3RoIG9sZGVyIGFuZCBuZXdlciB0aHJpZnQKK25hbWVzcGFjZSBjaGFuZ2VzLCB5b3UgY2FuIG1ha2UgdGhlIG5ldywgY29ycmVjdCBuYW1lc3BhY2VzIGJlaGF2ZSBsaWtlIHRoZSBvbGQgb25lcworaW4geW91ciBmaWxlcyB3aXRoIHRoaXMgdGVjaG5pcXVlIHRvIGNyZWF0ZSBhbiBhbGlhcywgd2hpY2ggd2lsbCBhbGxvdyB5b3UgY29kZSB0bworcnVuIGFnYWluc3QgZWl0aGVyIHZlcnNpb24gb2YgdGhlIHBlcmwgcnVudGltZSBmb3IgdGhyaWZ0OgorCitgQkVHSU4geypUVHlwZTo6ID0gKlRocmlmdDo6VFR5cGU6On1gCisKKyAgKiBQYWNrYWdlcyBmb3VuZCBpbiBUaHJpZnQucG0gd2VyZSBtb3ZlZCBpbnRvIHRoZSBUaHJpZnQvIGRpcmVjdG9yeSBpbiBzZXBhcmF0ZSBmaWxlczoKKyAgKiogVGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb24gaXMgbm93IGluIFRocmlmdC9FeGNlcHRpb24ucG0KKyAgKiogVGhyaWZ0OjpURXhjZXB0aW9uIGlzIG5vdyBpbiBUaHJpZnQvRXhjZXB0aW9uLnBtCisgICoqIFRocmlmdDo6VE1lc3NhZ2VUeXBlIGlzIG5vdyBpbiBUaHJpZnQvTWVzc2FnZVR5cGUucG0KKyAgKiogVGhyaWZ0OjpUVHlwZSBpcyBub3cgaW4gVGhyaWZ0L1R5cGUucG0KKworSWYgeW91IG5lZWQgdG8gbW9kaWZ5IHlvdXIgY29kZSB0byB3b3JrIGFnYWluc3QgYm90aCBvbGRlciBvciBuZXdlciB0aHJpZnQgdmVyc2lvbnMsCit5b3UgY2FuIGRlYWwgd2l0aCB0aGVzZSBjaGFuZ2VzIGluIGEgYmFja3dhcmRzIGNvbXBhdGlibGUgd2F5IGluIHlvdXIgcHJvamVjdHMgdXNpbmcgZXZhbDoKKworYGV2YWwgIHsgcmVxdWlyZSBUaHJpZnQ6OkV4Y2VwdGlvbjsgcmVxdWlyZSBUaHJpZnQ6Ok1lc3NhZ2VUeXBlOyByZXF1aXJlIFRocmlmdDo6VHlwZTsgfQorIG9yIGRvIHsgcmVxdWlyZSBUaHJpZnQ7IH1gCisKKyMgRGVwcmVjYXRpb25zCisKKyMjIDAuMTEuMAorCitUaHJpZnQ6Okh0dHBDbGllbnQgc2V0UmVjdlRpbWVvdXQoKSBhbmQgc2V0U2VuZFRpbWVvdXQoKSBhcmUgZGVwcmVjYXRlZC4gCitVc2Ugc2V0VGltZW91dCBpbnN0ZWFkLgorCmRpZmYgLS1naXQgYS9saWIvcGVybC9idWlsZC1jcGFuLWRpc3Quc2ggYi9saWIvcGVybC9idWlsZC1jcGFuLWRpc3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWUyMmU3ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9wZXJsL2J1aWxkLWNwYW4tZGlzdC5zaApAQCAtMCwwICsxLDUzIEBACisjIS9iaW4vYmFzaAorIworIyBUaGlzIHNjcmlwdCBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGFmdGVyIHRhZ2dpbmcgdGhlIHJlcG9zaXRvcnkgYW5kIHVwZGF0aW5nCisjIHRoZSB2ZXJzaW9uIGZpbGVzIGZvciBhIHJlbGVhc2UuICBJdCB3aWxsIGNyZWF0ZSBhIENQQU4gYXJjaGl2ZS4gIFJ1biB0aGlzCisjIGZyb20gaW5zaWRlIGEgZG9ja2VyIGltYWdlIGxpa2UgdWJ1bnR1LXhlbmlhbC4KKyMKKworc2V0IC1lCisKK3JtIC1mIE1BTklGRVNUCitybSAtcmYgVGhyaWZ0LSoKKworIyBzZXR1cCBjcGFuIHdpdGhvdXQgYSBwcm9tcHQKK2VjaG8gfCBjcGFuCitjcGFuIGluc3RhbGwgSFRUUDo6RGF0ZQorY3BhbiBpbnN0YWxsIENQQU4KK2NwYW4gaW5zdGFsbCBDUEFOOjpNZXRhIEV4dFV0aWxzOjpNYWtlTWFrZXIgSlNPTjo6UFAKKworcGVybCBNYWtlZmlsZS5QTAorcm0gTVlNRVRBLnltbAorbWFrZSBtYW5pZmVzdAorbWFrZSBkaXN0CisKKyMKKyMgV2UgdW5wYWNrIHRoZSBhcmNoaXZlIHNvIHdlIGNhbiBhZGQgdmVyc2lvbiBtZXRhZGF0YSBmb3IgQ1BBTgorIyBzbyB0aGF0IGl0IHByb3Blcmx5IGluZGV4ZXMgVGhyaWZ0IGFuZCByZW1vdmUgdW5uZWNlc3NhcnkgZmlsZXMuCisjCisKK2VjaG8gJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJworc2V0IC14CisKK0RJU1RGSUxFPSQobHMgVGhyaWZ0Ki5neikKK05FV0ZJTEU9JHtESVNURklMRS90LXYvdC19CitpZiBbWyAiJERJU1RGSUxFIiAhPSAiJE5FV0ZJTEUiIF1dOyB0aGVuCisgICAgbXYgJERJU1RGSUxFICRORVdGSUxFCisgICAgRElTVEZJTEU9IiRORVdGSUxFIgorZmkKK3RhciB4emYgJERJU1RGSUxFCitybSAkRElTVEZJTEUKK0RJU1RESVI9JChscyAtZCBUaHJpZnQqKQorIyBjcGFuIGRvZXNuJ3QgbGlrZSAiVGhyaWZ0LXYwLm5uLjAgYXMgYSBkaXJlY3RvcnkgbmFtZQorIyBuZWVkcyB0byBiZSBUaHJpZnQtMC5ubi4wCitORVdESVI9JHtESVNURElSL3Qtdi90LX0KK2lmIFtbICIkRElTVERJUiIgIT0gIiRORVdESVIiIF1dOyB0aGVuCisgICAgbXYgJERJU1RESVIgJE5FV0RJUgorICAgIERJU1RESVI9IiRORVdESVIiCitmaQorY2QgJERJU1RESVIKK2NwIC1wIC4uL01ha2VmaWxlLlBMIC4KK3BlcmwgLi4vdG9vbHMvRml4dXBEaXN0LnBsCitjZCAuLgordGFyIGN2emYgJERJU1RGSUxFICRESVNURElSCitybSAtciAkRElTVERJUgpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvY29kaW5nX3N0YW5kYXJkcy5tZCBiL2xpYi9wZXJsL2NvZGluZ19zdGFuZGFyZHMubWQKaW5kZXggZmEwMzkwYi4uZTRlODI1NSAxMDA2NDQKLS0tIGEvbGliL3BlcmwvY29kaW5nX3N0YW5kYXJkcy5tZAorKysgYi9saWIvcGVybC9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0xICsxLDIgQEAKLVBsZWFzZSBmb2xsb3cgW0dlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKQorUGxlYXNlIGZvbGxvdyBbR2VuZXJhbCBDb2RpbmcgU3RhbmRhcmRzXSgvZG9jL2NvZGluZ19zdGFuZGFyZHMubWQpLgorQWRkaXRpb25hbCBwZXJsIGNvZGluZyBzdGFuZGFyZHMgY2FuIGJlIGZvdW5kIGluIFtwZXJsc3R5bGVdKGh0dHA6Ly9wZXJsZG9jLnBlcmwub3JnL3BlcmxzdHlsZS5odG1sKS4KZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0LnBtCmluZGV4IDJlNzBkY2QuLmFiNDA5MzAgMTAwNjQ0Ci0tLSBhL2xpYi9wZXJsL2xpYi9UaHJpZnQucG0KKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC5wbQpAQCAtMTcsMTY2ICsxNywyMCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotb3VyICRWRVJTSU9OID0gJzAuOS4zJzsKLQotcmVxdWlyZSA1LjYuMDsKK3VzZSA1LjEwLjA7CiB1c2Ugc3RyaWN0OwogdXNlIHdhcm5pbmdzOwogCiAjCi0jIERhdGEgdHlwZXMgdGhhdCBjYW4gYmUgc2VudCB2aWEgVGhyaWZ0CisjIFZlcnNpb25pbmcKICMKLXBhY2thZ2UgVFR5cGU7Ci11c2UgY29uc3RhbnQgU1RPUCAgID0+IDA7Ci11c2UgY29uc3RhbnQgVk9JRCAgID0+IDE7Ci11c2UgY29uc3RhbnQgQk9PTCAgID0+IDI7Ci11c2UgY29uc3RhbnQgQllURSAgID0+IDM7Ci11c2UgY29uc3RhbnQgSTA4ICAgID0+IDM7Ci11c2UgY29uc3RhbnQgRE9VQkxFID0+IDQ7Ci11c2UgY29uc3RhbnQgSTE2ICAgID0+IDY7Ci11c2UgY29uc3RhbnQgSTMyICAgID0+IDg7Ci11c2UgY29uc3RhbnQgSTY0ICAgID0+IDEwOwotdXNlIGNvbnN0YW50IFNUUklORyA9PiAxMTsKLXVzZSBjb25zdGFudCBVVEY3ICAgPT4gMTE7Ci11c2UgY29uc3RhbnQgU1RSVUNUID0+IDEyOwotdXNlIGNvbnN0YW50IE1BUCAgICA9PiAxMzsKLXVzZSBjb25zdGFudCBTRVQgICAgPT4gMTQ7Ci11c2UgY29uc3RhbnQgTElTVCAgID0+IDE1OwotdXNlIGNvbnN0YW50IFVURjggICA9PiAxNjsKLXVzZSBjb25zdGFudCBVVEYxNiAgPT4gMTc7Ci0xOwotCisjIEV2ZXJ5IHBlcmwgbW9kdWxlIGZvciBUaHJpZnQgd2lsbCBoYXZlIHRoZSBzYW1lIHZlcnNpb24KKyMgZGVjbGFyYXRpb24uICBGb3IgYSBwcm9kdWN0aW9uIGJ1aWxkLCBjaGFuZ2UgaXQgYmVsb3cgdG8KKyMgc29tZXRoaW5nIGxpa2UgInYwLjExLjAiIGFuZCBhbGwgb2YgdGhlIHBhY2thZ2VzIGluIGFsbAorIyBvZiB0aGUgZmlsZXMgd2lsbCBwaWNrIGl0IHVwIGZyb20gaGVyZS4KICMKLSMgTWVzc2FnZSB0eXBlcyBmb3IgUlBDCi0jCi1wYWNrYWdlIFRNZXNzYWdlVHlwZTsKLXVzZSBjb25zdGFudCBDQUxMICAgICAgPT4gMTsKLXVzZSBjb25zdGFudCBSRVBMWSAgICAgPT4gMjsKLXVzZSBjb25zdGFudCBFWENFUFRJT04gPT4gMzsKLXVzZSBjb25zdGFudCBPTkVXQVkgICAgPT4gNDsKLTE7CiAKLXBhY2thZ2UgVGhyaWZ0OjpURXhjZXB0aW9uOwotCi1zdWIgbmV3IHsKLSAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7Ci0gICAgbXkgJHNlbGYgPSB7bWVzc2FnZSA9PiBzaGlmdCwgY29kZSA9PiBzaGlmdCB8fCAwfTsKLQotICAgIHJldHVybiBibGVzcygkc2VsZiwkY2xhc3NuYW1lKTsKLX0KLTE7Ci0KLXBhY2thZ2UgVEFwcGxpY2F0aW9uRXhjZXB0aW9uOwotdXNlIGJhc2UoJ1RocmlmdDo6VEV4Y2VwdGlvbicpOwotCi11c2UgY29uc3RhbnQgVU5LTk9XTiAgICAgICAgICAgICAgICAgPT4gMDsKLXVzZSBjb25zdGFudCBVTktOT1dOX01FVEhPRCAgICAgICAgICA9PiAxOwotdXNlIGNvbnN0YW50IElOVkFMSURfTUVTU0FHRV9UWVBFICAgID0+IDI7Ci11c2UgY29uc3RhbnQgV1JPTkdfTUVUSE9EX05BTUUgICAgICAgPT4gMzsKLXVzZSBjb25zdGFudCBCQURfU0VRVUVOQ0VfSUQgICAgICAgICA9PiA0OwotdXNlIGNvbnN0YW50IE1JU1NJTkdfUkVTVUxUICAgICAgICAgID0+IDU7Ci11c2UgY29uc3RhbnQgSU5URVJOQUxfRVJST1IgICAgICAgICAgPT4gNjsKLXVzZSBjb25zdGFudCBQUk9UT0NPTF9FUlJPUiAgICAgICAgICA9PiA3OwotdXNlIGNvbnN0YW50IElOVkFMSURfVFJBTlNGT1JNICAgICAgID0+IDg7Ci11c2UgY29uc3RhbnQgSU5WQUxJRF9QUk9UT0NPTCAgICAgICAgPT4gOTsKLXVzZSBjb25zdGFudCBVTlNVUFBPUlRFRF9DTElFTlRfVFlQRSA9PiAxMDsKLQotc3ViIG5ldyB7Ci0gICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OwotCi0gICAgbXkgJHNlbGYgPSAkY2xhc3NuYW1lLT5TVVBFUjo6bmV3KEBfKTsKLQotICAgIHJldHVybiBibGVzcygkc2VsZiwkY2xhc3NuYW1lKTsKLX0KLQotc3ViIHJlYWQgewotICAgIG15ICRzZWxmICA9IHNoaWZ0OwotICAgIG15ICRpbnB1dCA9IHNoaWZ0OwotCi0gICAgbXkgJHhmZXIgID0gMDsKLSAgICBteSAkZm5hbWUgPSB1bmRlZjsKLSAgICBteSAkZnR5cGUgPSAwOwotICAgIG15ICRmaWQgICA9IDA7Ci0KLSAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRTdHJ1Y3RCZWdpbihcJGZuYW1lKTsKLQotICAgIHdoaWxlICgxKQotICAgIHsKLSAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkRmllbGRCZWdpbihcJGZuYW1lLCBcJGZ0eXBlLCBcJGZpZCk7Ci0gICAgICAgIGlmICgkZnR5cGUgPT0gVFR5cGU6OlNUT1ApIHsKLSAgICAgICAgICAgIGxhc3Q7IG5leHQ7Ci0gICAgICAgIH0KLQotICAgICAgU1dJVENIOiBmb3IoJGZpZCkKLSAgICAgIHsKLSAgICAgICAgICAvMS8gJiYgZG97Ci0KLSAgICAgICAgICAgICAgaWYgKCRmdHlwZSA9PSBUVHlwZTo6U1RSSU5HKSB7Ci0gICAgICAgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRTdHJpbmcoXCRzZWxmLT57bWVzc2FnZX0pOwotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5za2lwKCRmdHlwZSk7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICBsYXN0OwotICAgICAgICAgIH07Ci0KLSAgICAgICAgICAvMi8gJiYgZG97Ci0gICAgICAgICAgICAgIGlmICgkZnR5cGUgPT0gVFR5cGU6OkkzMikgewotICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkSTMyKFwkc2VsZi0+e2NvZGV9KTsKLSAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGxhc3Q7Ci0gICAgICAgICAgfTsKLQotICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOwotICAgICAgfQotCi0gICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRGaWVsZEVuZCgpOwotICAgIH0KLSAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRTdHJ1Y3RFbmQoKTsKLQotICAgIHJldHVybiAkeGZlcjsKLX0KLQotc3ViIHdyaXRlIHsKLSAgICBteSAkc2VsZiAgID0gc2hpZnQ7Ci0gICAgbXkgJG91dHB1dCA9IHNoaWZ0OwotCi0gICAgbXkgJHhmZXIgICA9IDA7Ci0KLSAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEJlZ2luKCdUQXBwbGljYXRpb25FeGNlcHRpb24nKTsKLQotICAgIGlmICgkc2VsZi0+Z2V0TWVzc2FnZSgpKSB7Ci0gICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRCZWdpbignbWVzc2FnZScsIFRUeXBlOjpTVFJJTkcsIDEpOwotICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cmluZygkc2VsZi0+Z2V0TWVzc2FnZSgpKTsKLSAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEVuZCgpOwotICAgIH0KLQotICAgIGlmICgkc2VsZi0+Z2V0Q29kZSgpKSB7Ci0gICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRCZWdpbigndHlwZScsIFRUeXBlOjpJMzIsIDIpOwotICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUkzMigkc2VsZi0+Z2V0Q29kZSgpKTsKLSAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEVuZCgpOwotICAgIH0KLQotICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRTdG9wKCk7Ci0gICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RFbmQoKTsKLQotICAgIHJldHVybiAkeGZlcjsKLX0KLQotc3ViIGdldE1lc3NhZ2UKLXsKLSAgICBteSAkc2VsZiA9IHNoaWZ0OwotCi0gICAgcmV0dXJuICRzZWxmLT57bWVzc2FnZX07Ci19Ci0KLXN1YiBnZXRDb2RlCi17Ci0gICAgbXkgJHNlbGYgPSBzaGlmdDsKLQotICAgIHJldHVybiAkc2VsZi0+e2NvZGV9OwotfQorcGFja2FnZSBUaHJpZnQ7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCJ2MS4wLjAiKTsKIAogMTsKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvQmluYXJ5UHJvdG9jb2wucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0L0JpbmFyeVByb3RvY29sLnBtCmluZGV4IGM2MzhlYWQuLmQ2MjUwOWEgMTAwNjQ0Ci0tLSBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvQmluYXJ5UHJvdG9jb2wucG0KKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9CaW5hcnlQcm90b2NvbC5wbQpAQCAtMTcsMjggKzE3LDI5IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1yZXF1aXJlIDUuNi4wOwotCit1c2UgNS4xMC4wOwogdXNlIHN0cmljdDsKIHVzZSB3YXJuaW5nczsKIAotdXNlIHV0Zjg7Ci11c2UgRW5jb2RlOwotCi11c2UgVGhyaWZ0OwotdXNlIFRocmlmdDo6UHJvdG9jb2w7Ci0KIHVzZSBCaXQ6OlZlY3RvcjsKK3VzZSBFbmNvZGU7Cit1c2UgVGhyaWZ0OwordXNlIFRocmlmdDo6RXhjZXB0aW9uOwordXNlIFRocmlmdDo6TWVzc2FnZVR5cGU7Cit1c2UgVGhyaWZ0OjpQcm90b2NvbDsKK3VzZSBUaHJpZnQ6OlR5cGU7Cit1c2UgdXRmODsKIAogIwogIyBCaW5hcnkgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRocmlmdCBwcm90b2NvbC4KICMKIHBhY2thZ2UgVGhyaWZ0OjpCaW5hcnlQcm90b2NvbDsKIHVzZSBiYXNlKCdUaHJpZnQ6OlByb3RvY29sJyk7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKIHVzZSBjb25zdGFudCBWRVJTSU9OX01BU0sgICA9PiAweGZmZmYwMDAwOwogdXNlIGNvbnN0YW50IFZFUlNJT05fMSAgICAgID0+IDB4ODAwMTAwMDA7Ci11c2UgY29uc3RhbnQgSVNfQklHX0VORElBTiAgPT4gdW5wYWNrKCJoKiIsIHBhY2soInMiLCAxKSkgPX4gLzAxLzsKK3VzZSBjb25zdGFudCBJU19CSUdfRU5ESUFOICA9PiB1bnBhY2soJ2gqJywgcGFjaygncycsIDEpKSA9fiBtLzAxLzsKIAogc3ViIG5ldwogewpAQCAtNjYsNyArNjcsOCBAQAogICAgIHJldHVybiAwOwogfQogCi1zdWIgd3JpdGVTdHJ1Y3RCZWdpbnsKK3N1YiB3cml0ZVN0cnVjdEJlZ2luCit7CiAgICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgICBteSAkbmFtZSA9IHNoaWZ0OwogICAgIHJldHVybiAwOwpAQCAtOTcsNyArOTksNyBAQAogc3ViIHdyaXRlRmllbGRTdG9wCiB7CiAgICAgbXkgJHNlbGYgPSBzaGlmdDsKLSAgICByZXR1cm4gJHNlbGYtPndyaXRlQnl0ZShUVHlwZTo6U1RPUCk7CisgICAgcmV0dXJuICRzZWxmLT53cml0ZUJ5dGUoVGhyaWZ0OjpUVHlwZTo6U1RPUCk7CiB9CiAKIHN1YiB3cml0ZU1hcEJlZ2luCkBAIC0yNTIsMTQgKzI1NCwxNiBAQAogICAgIG15ICRyZXN1bHQgPSAkc2VsZi0+cmVhZEkzMihcJHZlcnNpb24pOwogICAgIGlmICgoJHZlcnNpb24gJiBWRVJTSU9OX01BU0spID4gMCkgewogICAgICAgaWYgKCgkdmVyc2lvbiAmIFZFUlNJT05fTUFTSykgIT0gVkVSU0lPTl8xKSB7Ci0gICAgICAgIGRpZSBuZXcgVGhyaWZ0OjpURXhjZXB0aW9uKCdNaXNzaW5nIHZlcnNpb24gaWRlbnRpZmllcicpCisgICAgICAgIGRpZSBUaHJpZnQ6OlRQcm90b2NvbEV4Y2VwdGlvbi0+bmV3KCdNaXNzaW5nIHZlcnNpb24gaWRlbnRpZmllcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0OjpUUHJvdG9jb2xFeGNlcHRpb246OkJBRF9WRVJTSU9OKTsKICAgICAgIH0KICAgICAgICQkdHlwZSA9ICR2ZXJzaW9uICYgMHgwMDAwMDBmZjsKICAgICAgIHJldHVybgogICAgICAgICAgICRyZXN1bHQgKwogICAgICAgICAgICRzZWxmLT5yZWFkU3RyaW5nKCRuYW1lKSArCiAgICAgICAgICAgJHNlbGYtPnJlYWRJMzIoJHNlcWlkKTsKLSAgICB9IGVsc2UgeyAjIG9sZCBjbGllbnQgc3VwcG9ydCBjb2RlCisgICAgfQorICAgIGVsc2UgeyAjIG9sZCBjbGllbnQgc3VwcG9ydCBjb2RlCiAgICAgICByZXR1cm4KICAgICAgICAgJHJlc3VsdCArCiAgICAgICAgICRzZWxmLT5yZWFkU3RyaW5nQm9keSgkbmFtZSwgJHZlcnNpb24pICsgIyB2ZXJzaW9uIGhlcmUgaG9sZHMgdGhlIHNpemUgb2YgdGhlIHN0cmluZwpAQCAtMjk3LDcgKzMwMSw3IEBACiAKICAgICBteSAkcmVzdWx0ID0gJHNlbGYtPnJlYWRCeXRlKCRmaWVsZFR5cGUpOwogCi0gICAgaWYgKCQkZmllbGRUeXBlID09IFRUeXBlOjpTVE9QKSB7CisgICAgaWYgKCQkZmllbGRUeXBlID09IFRocmlmdDo6VFR5cGU6OlNUT1ApIHsKICAgICAgICQkZmllbGRJZCA9IDA7CiAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgICB9CkBAIC00MjUsNyArNDI5LDcgQEAKIAogICAgIG15ICgkaGksJGxvKT11bnBhY2soJ05OJywkZGF0YSk7CiAKLSAgICBteSAkdmVjID0gbmV3IEJpdDo6VmVjdG9yKDY0KTsKKyAgICBteSAkdmVjID0gQml0OjpWZWN0b3ItPm5ldyg2NCk7CiAKICAgICAkdmVjLT5DaHVua19TdG9yZSgzMiwzMiwkaGkpOwogICAgICR2ZWMtPkNodW5rX1N0b3JlKDMyLDAsJGxvKTsKQEAgLTQ0Nyw3ICs0NTEsNyBAQAogICAgIGVsc2UgewogICAgICAgJGRhdGEgPSBzY2FsYXIgcmV2ZXJzZSgkc2VsZi0+e3RyYW5zfS0+cmVhZEFsbCg4KSk7CiAgICAgfQotICAgIAorCiAgICAgbXkgQGFyciA9IHVucGFjaygnZCcsICRkYXRhKTsKIAogICAgICQkdmFsdWUgPSAkYXJyWzBdOwpAQCAtNDY1LDcgKzQ2OSw4IEBACiAKICAgICBpZiAoJGxlbikgewogICAgICAgJCR2YWx1ZSA9ICRzZWxmLT57dHJhbnN9LT5yZWFkQWxsKCRsZW4pOwotICAgIH0gZWxzZSB7CisgICAgfQorICAgIGVsc2UgewogICAgICAgJCR2YWx1ZSA9ICcnOwogICAgIH0KIApAQCAtNDgwLDcgKzQ4NSw4IEBACiAKICAgICBpZiAoJGxlbikgewogICAgICAgJCR2YWx1ZSA9ICRzZWxmLT57dHJhbnN9LT5yZWFkQWxsKCRsZW4pOwotICAgIH0gZWxzZSB7CisgICAgfQorICAgIGVsc2UgewogICAgICAgJCR2YWx1ZSA9ICcnOwogICAgIH0KIApAQCAtNDkxLDcgKzQ5Nyw4IEBACiAjIEJpbmFyeSBQcm90b2NvbCBGYWN0b3J5CiAjCiBwYWNrYWdlIFRocmlmdDo6QmluYXJ5UHJvdG9jb2xGYWN0b3J5OwotdXNlIGJhc2UoJ1RQcm90b2NvbEZhY3RvcnknKTsKK3VzZSBiYXNlKCdUaHJpZnQ6OlRQcm90b2NvbEZhY3RvcnknKTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKIAogc3ViIG5ldwogewpAQCAtNTA1LDcgKzUxMiw3IEBACiAgICAgbXkgJHNlbGYgID0gc2hpZnQ7CiAgICAgbXkgJHRyYW5zID0gc2hpZnQ7CiAKLSAgICByZXR1cm4gbmV3IFRocmlmdDo6QmluYXJ5UHJvdG9jb2woJHRyYW5zKTsKKyAgICByZXR1cm4gVGhyaWZ0OjpCaW5hcnlQcm90b2NvbC0+bmV3KCR0cmFucyk7CiB9CiAKIDE7CmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L0J1ZmZlcmVkVHJhbnNwb3J0LnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC9CdWZmZXJlZFRyYW5zcG9ydC5wbQppbmRleCAzODY4Y2EyLi42YjViZjdhIDEwMDY0NAotLS0gYS9saWIvcGVybC9saWIvVGhyaWZ0L0J1ZmZlcmVkVHJhbnNwb3J0LnBtCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvQnVmZmVyZWRUcmFuc3BvcnQucG0KQEAgLTE3LDE1ICsxNywxNyBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotcmVxdWlyZSA1LjYuMDsKK3VzZSA1LjEwLjA7CiB1c2Ugc3RyaWN0OwogdXNlIHdhcm5pbmdzOwogCiB1c2UgVGhyaWZ0OwordXNlIFRocmlmdDo6RXhjZXB0aW9uOwogdXNlIFRocmlmdDo6VHJhbnNwb3J0OwogCiBwYWNrYWdlIFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQ7CiB1c2UgYmFzZSgnVGhyaWZ0OjpUcmFuc3BvcnQnKTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKIAogc3ViIG5ldwogewpAQCAtMTEwLDYgKzExMiw3IEBACiAjIEJ1ZmZlcmVkVHJhbnNwb3J0IGZhY3RvcnkgY3JlYXRlcyBidWZmZXJlZCB0cmFuc3BvcnQgb2JqZWN0cyBmcm9tIHRyYW5zcG9ydHMKICMKIHBhY2thZ2UgVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydEZhY3Rvcnk7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKIHN1YiBuZXcgewogICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvRXhjZXB0aW9uLnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC9FeGNlcHRpb24ucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQwNDA2OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvRXhjZXB0aW9uLnBtCkBAIC0wLDAgKzEsMTYxIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKwordXNlIDUuMTAuMDsKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSBUaHJpZnQ7Cit1c2UgVGhyaWZ0OjpUeXBlOworCitwYWNrYWdlIFRocmlmdDo6VEV4Y2VwdGlvbjsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKKwordXNlIG92ZXJsb2FkICciIicgPT4gc3ViIHsKKyAgICByZXR1cm4KKyAgICAgICAgc3ByaW50ZiAnJXMgZXJyb3I6ICVzIChjb2RlICVzKScsCisgICAgICAgICAgcmVmKCAkX1swXSApLAorICAgICAgICAgICggJF9bMF0tPnttZXNzYWdlfSB8fCAnZW1wdHkgbWVzc2FnZScgKSwKKyAgICAgICAgICAoIGRlZmluZWQgJF9bMF0tPntjb2RlfSA/ICRfWzBdLT57Y29kZX0gOiAndW5kZWZpbmVkJyApOworICAgIH07CisKK3N1YiBuZXcgeworICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKKyAgICBteSAkc2VsZiA9IHttZXNzYWdlID0+IHNoaWZ0LCBjb2RlID0+IHNoaWZ0IHx8IDB9OworCisgICAgcmV0dXJuIGJsZXNzKCRzZWxmLCRjbGFzc25hbWUpOworfQorCitwYWNrYWdlIFRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uOwordXNlIHBhcmVudCAtbm9yZXF1aXJlLCAnVGhyaWZ0OjpURXhjZXB0aW9uJzsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKKwordXNlIGNvbnN0YW50IFVOS05PV04gICAgICAgICAgICAgICAgID0+IDA7Cit1c2UgY29uc3RhbnQgVU5LTk9XTl9NRVRIT0QgICAgICAgICAgPT4gMTsKK3VzZSBjb25zdGFudCBJTlZBTElEX01FU1NBR0VfVFlQRSAgICA9PiAyOwordXNlIGNvbnN0YW50IFdST05HX01FVEhPRF9OQU1FICAgICAgID0+IDM7Cit1c2UgY29uc3RhbnQgQkFEX1NFUVVFTkNFX0lEICAgICAgICAgPT4gNDsKK3VzZSBjb25zdGFudCBNSVNTSU5HX1JFU1VMVCAgICAgICAgICA9PiA1OwordXNlIGNvbnN0YW50IElOVEVSTkFMX0VSUk9SICAgICAgICAgID0+IDY7Cit1c2UgY29uc3RhbnQgUFJPVE9DT0xfRVJST1IgICAgICAgICAgPT4gNzsKK3VzZSBjb25zdGFudCBJTlZBTElEX1RSQU5TRk9STSAgICAgICA9PiA4OwordXNlIGNvbnN0YW50IElOVkFMSURfUFJPVE9DT0wgICAgICAgID0+IDk7Cit1c2UgY29uc3RhbnQgVU5TVVBQT1JURURfQ0xJRU5UX1RZUEUgPT4gMTA7CisKK3N1YiBuZXcgeworICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKKworICAgIG15ICRzZWxmID0gJGNsYXNzbmFtZS0+U1VQRVI6Om5ldyhAXyk7CisKKyAgICByZXR1cm4gYmxlc3MoJHNlbGYsJGNsYXNzbmFtZSk7Cit9CisKK3N1YiByZWFkIHsKKyAgICBteSAkc2VsZiAgPSBzaGlmdDsKKyAgICBteSAkaW5wdXQgPSBzaGlmdDsKKworICAgIG15ICR4ZmVyICA9IDA7CisgICAgbXkgJGZuYW1lID0gdW5kZWY7CisgICAgbXkgJGZ0eXBlID0gMDsKKyAgICBteSAkZmlkICAgPSAwOworCisgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RydWN0QmVnaW4oXCRmbmFtZSk7CisKKyAgICB3aGlsZSAoMSkKKyAgICB7CisgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZEZpZWxkQmVnaW4oXCRmbmFtZSwgXCRmdHlwZSwgXCRmaWQpOworICAgICAgICBpZiAoJGZ0eXBlID09IFRocmlmdDo6VFR5cGU6OlNUT1ApIHsKKyAgICAgICAgICAgIGxhc3Q7IG5leHQ7CisgICAgICAgIH0KKworICAgICAgU1dJVENIOiBmb3IoJGZpZCkKKyAgICAgIHsKKyAgICAgICAgICAvMS8gJiYgZG97CisKKyAgICAgICAgICAgICAgaWYgKCRmdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpTVFJJTkcpIHsKKyAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZFN0cmluZyhcJHNlbGYtPnttZXNzYWdlfSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnNraXAoJGZ0eXBlKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGxhc3Q7CisgICAgICAgICAgfTsKKworICAgICAgICAgIC8yLyAmJiBkb3sKKyAgICAgICAgICAgICAgaWYgKCRmdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpJMzIpIHsKKyAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZEkzMihcJHNlbGYtPntjb2RlfSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnNraXAoJGZ0eXBlKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBsYXN0OworICAgICAgICAgIH07CisKKyAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnNraXAoJGZ0eXBlKTsKKyAgICAgIH0KKworICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkRmllbGRFbmQoKTsKKyAgICB9CisgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RydWN0RW5kKCk7CisKKyAgICByZXR1cm4gJHhmZXI7Cit9CisKK3N1YiB3cml0ZSB7CisgICAgbXkgJHNlbGYgICA9IHNoaWZ0OworICAgIG15ICRvdXRwdXQgPSBzaGlmdDsKKworICAgIG15ICR4ZmVyICAgPSAwOworCisgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RCZWdpbignVEFwcGxpY2F0aW9uRXhjZXB0aW9uJyk7CisKKyAgICBpZiAoJHNlbGYtPmdldE1lc3NhZ2UoKSkgeworICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkQmVnaW4oJ21lc3NhZ2UnLCBUaHJpZnQ6OlRUeXBlOjpTVFJJTkcsIDEpOworICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cmluZygkc2VsZi0+Z2V0TWVzc2FnZSgpKTsKKyAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEVuZCgpOworICAgIH0KKworICAgIGlmICgkc2VsZi0+Z2V0Q29kZSgpKSB7CisgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRCZWdpbigndHlwZScsIFRocmlmdDo6VFR5cGU6OkkzMiwgMik7CisgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlSTMyKCRzZWxmLT5nZXRDb2RlKCkpOworICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkRW5kKCk7CisgICAgfQorCisgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZFN0b3AoKTsKKyAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEVuZCgpOworCisgICAgcmV0dXJuICR4ZmVyOworfQorCitzdWIgZ2V0TWVzc2FnZQoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPnttZXNzYWdlfTsKK30KKworc3ViIGdldENvZGUKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Y29kZX07Cit9CisKKzE7CmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L0ZyYW1lZFRyYW5zcG9ydC5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvRnJhbWVkVHJhbnNwb3J0LnBtCmluZGV4IDZmMmQyY2YuLmJhODliYTMgMTAwNjQ0Ci0tLSBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvRnJhbWVkVHJhbnNwb3J0LnBtCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvRnJhbWVkVHJhbnNwb3J0LnBtCkBAIC0xNyw2ICsxNyw3IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCit1c2UgNS4xMC4wOwogdXNlIHN0cmljdDsKIHVzZSB3YXJuaW5nczsKIApAQCAtMzAsOCArMzEsOCBAQAogIyBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CiAjCiBwYWNrYWdlIFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0OwotCiB1c2UgYmFzZSgnVGhyaWZ0OjpUcmFuc3BvcnQnKTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKIAogc3ViIG5ldwogewpAQCAtNjksNyArNzAsNyBAQAogICAgIG15ICRzZWxmID0gc2hpZnQ7CiAKICAgICBpZiAoZGVmaW5lZCAkc2VsZi0+e3RyYW5zcG9ydH0pIHsKLSAgICAgICRzZWxmLT57dHJhbnNwb3J0fS0+Y2xvc2UoKTsKKyAgICAgICAgJHNlbGYtPnt0cmFuc3BvcnR9LT5jbG9zZSgpOwogICAgIH0KIH0KIApAQCAtMTY3LDYgKzE2OCw3IEBACiAjIEZyYW1lZFRyYW5zcG9ydCBmYWN0b3J5IGNyZWF0ZXMgZnJhbWVkIHRyYW5zcG9ydCBvYmplY3RzIGZyb20gdHJhbnNwb3J0cwogIwogcGFja2FnZSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydEZhY3Rvcnk7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKIHN1YiBuZXcgewogICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKQEAgLTE4OSw1ICsxOTEsNCBAQAogICAgIHJldHVybiAkYnVmZmVyZWQ7CiB9CiAKLQogMTsKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvSHR0cENsaWVudC5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvSHR0cENsaWVudC5wbQppbmRleCBkNmZjOGJlLi40MGVjOWNlIDEwMDY0NAotLS0gYS9saWIvcGVybC9saWIvVGhyaWZ0L0h0dHBDbGllbnQucG0KKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9IdHRwQ2xpZW50LnBtCkBAIC0xNywyNiArMTcsMjUgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgNS42LjA7Cit1c2UgNS4xMC4wOwogdXNlIHN0cmljdDsKIHVzZSB3YXJuaW5nczsKIAordXNlIEhUVFA6OlJlcXVlc3Q7Cit1c2UgSU86OlN0cmluZzsKK3VzZSBMV1A6OlVzZXJBZ2VudDsKIHVzZSBUaHJpZnQ7Cit1c2UgVGhyaWZ0OjpFeGNlcHRpb247CiB1c2UgVGhyaWZ0OjpUcmFuc3BvcnQ7CiAKLXVzZSBIVFRQOjpSZXF1ZXN0OwotdXNlIExXUDo6VXNlckFnZW50OwotdXNlIElPOjpTdHJpbmc7Ci0KIHBhY2thZ2UgVGhyaWZ0OjpIdHRwQ2xpZW50OwotCiB1c2UgYmFzZSgnVGhyaWZ0OjpUcmFuc3BvcnQnKTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKIAogc3ViIG5ldwogewogICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKICAgICBteSAkdXJsICAgICAgID0gc2hpZnQgfHwgJ2h0dHA6Ly9sb2NhbGhvc3Q6OTA5MCc7Ci0gICAgbXkgJGRlYnVnSGFuZGxlciA9IHNoaWZ0OwogCiAgICAgbXkgJG91dCA9IElPOjpTdHJpbmctPm5ldzsKICAgICBiaW5tb2RlKCRvdXQpOwpAQCAtNDQsNDQgKzQzLDQ0IEBACiAgICAgbXkgJHNlbGYgPSB7CiAgICAgICAgIHVybCAgICAgICAgICA9PiAkdXJsLAogICAgICAgICBvdXQgICAgICAgICAgPT4gJG91dCwKLSAgICAgICAgZGVidWdIYW5kbGVyID0+ICRkZWJ1Z0hhbmRsZXIsCi0gICAgICAgIGRlYnVnICAgICAgICA9PiAwLAotICAgICAgICBzZW5kVGltZW91dCAgPT4gMTAwLAotICAgICAgICByZWN2VGltZW91dCAgPT4gNzUwLAorICAgICAgICB0aW1lb3V0ICAgICAgPT4gMTAwLAogICAgICAgICBoYW5kbGUgICAgICAgPT4gdW5kZWYsCisgICAgICAgIGhlYWRlcnMgICAgICA9PiB7fSwKICAgICB9OwogCiAgICAgcmV0dXJuIGJsZXNzKCRzZWxmLCRjbGFzc25hbWUpOwogfQogCitzdWIgc2V0VGltZW91dAoreworICAgIG15ICRzZWxmICAgID0gc2hpZnQ7CisgICAgbXkgJHRpbWVvdXQgPSBzaGlmdDsKKworICAgICRzZWxmLT57dGltZW91dH0gPSAkdGltZW91dDsKK30KKworc3ViIHNldFJlY3ZUaW1lb3V0Cit7CisgICAgd2FybiAnc2V0UmVjdlRpbWVvdXQgaXMgZGVwcmVjYXRlZCAtIHVzZSBzZXRUaW1lb3V0IGluc3RlYWQnOworICAgICMgbm90ZTogcmVjdlRpbWVvdXQgd2FzIG5ldmVyIHVzZWQgc28gd2UgZG8gbm90IG5lZWQgdG8gZG8gYW55dGhpbmcgaGVyZQorfQorCiBzdWIgc2V0U2VuZFRpbWVvdXQKIHsKICAgICBteSAkc2VsZiAgICA9IHNoaWZ0OwogICAgIG15ICR0aW1lb3V0ID0gc2hpZnQ7CiAKLSAgICAkc2VsZi0+e3NlbmRUaW1lb3V0fSA9ICR0aW1lb3V0OworICAgIHdhcm4gJ3NldFNlbmRUaW1lb3V0IGlzIGRlcHJlY2F0ZWQgLSB1c2Ugc2V0VGltZW91dCBpbnN0ZWFkJzsKKworICAgICRzZWxmLT5zZXRUaW1lb3V0KCR0aW1lb3V0KTsKIH0KIAotc3ViIHNldFJlY3ZUaW1lb3V0CitzdWIgc2V0SGVhZGVyCiB7Ci0gICAgbXkgJHNlbGYgICAgPSBzaGlmdDsKLSAgICBteSAkdGltZW91dCA9IHNoaWZ0OworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgKCRuYW1lLCAkdmFsdWUpID0gQF87CiAKLSAgICAkc2VsZi0+e3JlY3ZUaW1lb3V0fSA9ICR0aW1lb3V0OwotfQotCi0KLSMKLSNTZXRzIGRlYnVnZ2luZyBvdXRwdXQgb24gb3Igb2ZmCi0jCi0jIEBwYXJhbSBib29sICRkZWJ1ZwotIwotc3ViIHNldERlYnVnCi17Ci0gICAgbXkgJHNlbGYgID0gc2hpZnQ7Ci0gICAgbXkgJGRlYnVnID0gc2hpZnQ7Ci0KLSAgICAkc2VsZi0+e2RlYnVnfSA9ICRkZWJ1ZzsKKyAgICAkc2VsZi0+e2hlYWRlcnN9LT57JG5hbWV9ID0gJHZhbHVlOwogfQogCiAjCkBAIC0xMDMsOCArMTAyLDggQEAKIHsKICAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgIGlmIChkZWZpbmVkKCRzZWxmLT57aW99KSkgewotICAgICAgY2xvc2UoJHNlbGYtPntpb30pOwotICAgICAgJHNlbGYtPntpb30gPSB1bmRlZjsKKyAgICAgICAgY2xvc2UoJHNlbGYtPntpb30pOworICAgICAgICAkc2VsZi0+e2lvfSA9IHVuZGVmOwogICAgIH0KIH0KIApAQCAtMTIyLDcgKzEyMSw4IEBACiAgICAgbXkgJGJ1ZiA9ICRzZWxmLT5yZWFkKCRsZW4pOwogCiAgICAgaWYgKCFkZWZpbmVkKCRidWYpKSB7Ci0gICAgICBkaWUgbmV3IFRocmlmdDo6VEV4Y2VwdGlvbignVFNvY2tldDogQ291bGQgbm90IHJlYWQgJy4kbGVuLicgYnl0ZXMgZnJvbSBpbnB1dCBidWZmZXInKTsKKyAgICAgICAgZGllIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbi0+bmV3KCJUU29ja2V0OiBDb3VsZCBub3QgcmVhZCAkbGVuIGJ5dGVzIGZyb20gaW5wdXQgYnVmZmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjo6RU5EX09GX0ZJTEUpOwogICAgIH0KICAgICByZXR1cm4gJGJ1ZjsKIH0KQEAgLTE0MCwxNSArMTQwLDE4IEBACiAgICAgbXkgJGluID0gJHNlbGYtPntpbn07CiAKICAgICBpZiAoIWRlZmluZWQoJGluKSkgewotICAgICAgZGllIG5ldyBUaHJpZnQ6OlRFeGNlcHRpb24oIlJlc3BvbnNlIGJ1ZmZlciBpcyBlbXB0eSwgbm8gcmVxdWVzdC4iKTsKKyAgICAgICAgZGllIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbi0+bmV3KCdSZXNwb25zZSBidWZmZXIgaXMgZW1wdHksIG5vIHJlcXVlc3QuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjo6RU5EX09GX0ZJTEUpOwogICAgIH0KICAgICBldmFsIHsKLSAgICAgIG15ICRyZXQgPSBzeXNyZWFkKCRpbiwgJGJ1ZiwgJGxlbik7Ci0gICAgICBpZiAoISBkZWZpbmVkKCRyZXQpKSB7Ci0gICAgICAgIGRpZSBuZXcgVGhyaWZ0OjpURXhjZXB0aW9uKCJObyBtb3JlIGRhdGEgYXZhaWxhYmxlLiIpOwotICAgICAgfQotICAgIH07IGlmKCRAKXsKLSAgICAgIGRpZSBuZXcgVGhyaWZ0OjpURXhjZXB0aW9uKCRAKTsKKyAgICAgICAgbXkgJHJldCA9IHN5c3JlYWQoJGluLCAkYnVmLCAkbGVuKTsKKyAgICAgICAgaWYgKCEgZGVmaW5lZCgkcmV0KSkgeworICAgICAgICAgICAgZGllIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbi0+bmV3KCdObyBtb3JlIGRhdGEgYXZhaWxhYmxlLicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VUKTsKKyAgICAgICAgfQorICAgIH07CisgICAgaWYoJEApeworICAgICAgICBkaWUgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uLT5uZXcoIiRAIiwgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOKTsKICAgICB9CiAKICAgICByZXR1cm4gJGJ1ZjsKQEAgLTE3MSw4ICsxNzQsOSBAQAogewogICAgIG15ICRzZWxmID0gc2hpZnQ7CiAKLSAgICBteSAkdWEgPSBMV1A6OlVzZXJBZ2VudC0+bmV3KCd0aW1lb3V0JyA9PiAoJHNlbGYtPntzZW5kVGltZW91dH0gLyAxMDAwKSwKLSAgICAgICdhZ2VudCcgPT4gJ1BlcmwvVEh0dHBDbGllbnQnCisgICAgbXkgJHVhID0gTFdQOjpVc2VyQWdlbnQtPm5ldygKKyAgICAgICAgJ3RpbWVvdXQnID0+ICgkc2VsZi0+e3RpbWVvdXR9IC8gMTAwMCksCisgICAgICAgICdhZ2VudCcgICA9PiAnUGVybC9USHR0cENsaWVudCcKICAgICAgKTsKICAgICAkdWEtPmRlZmF1bHRfaGVhZGVyKCdBY2NlcHQnID0+ICdhcHBsaWNhdGlvbi94LXRocmlmdCcpOwogICAgICR1YS0+ZGVmYXVsdF9oZWFkZXIoJ0NvbnRlbnQtVHlwZScgPT4gJ2FwcGxpY2F0aW9uL3gtdGhyaWZ0Jyk7CkBAIC0xODIsNyArMTg2LDcgQEAKICAgICAkb3V0LT5zZXRwb3MoMCk7ICMgcmV3aW5kCiAgICAgbXkgJGJ1ZiA9IGpvaW4oJycsIDwkb3V0Pik7CiAKLSAgICBteSAkcmVxdWVzdCA9IG5ldyBIVFRQOjpSZXF1ZXN0KFBPU1QgPT4gJHNlbGYtPnt1cmx9LCB1bmRlZiwgJGJ1Zik7CisgICAgbXkgJHJlcXVlc3QgPSBIVFRQOjpSZXF1ZXN0LT5uZXcoUE9TVCA9PiAkc2VsZi0+e3VybH0sICgkc2VsZi0+e2hlYWRlcnN9IHx8IHVuZGVmKSwgJGJ1Zik7CiAgICAgbXkgJHJlc3BvbnNlID0gJHVhLT5yZXF1ZXN0KCRyZXF1ZXN0KTsKICAgICBteSAkY29udGVudF9yZWYgPSAkcmVzcG9uc2UtPmNvbnRlbnRfcmVmOwogCmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L01lbW9yeUJ1ZmZlci5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvTWVtb3J5QnVmZmVyLnBtCmluZGV4IDBiMjg2ODcuLmJlOTdjZTQgMTAwNjQ0Ci0tLSBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvTWVtb3J5QnVmZmVyLnBtCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvTWVtb3J5QnVmZmVyLnBtCkBAIC0xNyw3ICsxNyw3IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1yZXF1aXJlIDUuNi4wOwordXNlIDUuMTAuMDsKIHVzZSBzdHJpY3Q7CiB1c2Ugd2FybmluZ3M7CiAKQEAgLTI2LDYgKzI2LDcgQEAKIAogcGFja2FnZSBUaHJpZnQ6Ok1lbW9yeUJ1ZmZlcjsKIHVzZSBiYXNlKCdUaHJpZnQ6OlRyYW5zcG9ydCcpOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCiBzdWIgbmV3CiB7CkBAIC0zNCwxMCArMzUsMTAgQEAKICAgICBteSAkYnVmZmVyU2l6ZT0gc2hpZnQgfHwgMTAyNDsKIAogICAgIG15ICRzZWxmID0gewotICAgICAgICBidWZmZXIgICAgPT4gJycsCi0gICAgICAgIGJ1ZmZlclNpemU9PiAkYnVmZmVyU2l6ZSwKLSAgICAgICAgd1BvcyAgICAgID0+IDAsCi0gICAgICAgIHJQb3MgICAgICA9PiAwLAorICAgICAgICBidWZmZXIgICAgID0+ICcnLAorICAgICAgICBidWZmZXJTaXplID0+ICRidWZmZXJTaXplLAorICAgICAgICB3UG9zICAgICAgID0+IDAsCisgICAgICAgIHJQb3MgICAgICAgPT4gMCwKICAgICB9OwogCiAgICAgcmV0dXJuIGJsZXNzKCRzZWxmLCRjbGFzc25hbWUpOwpAQCAtMTE2LDcgKzExNyw4IEBACiAKICAgICBteSAkYXZhaWwgPSAoJHNlbGYtPnt3UG9zfSAtICRzZWxmLT57clBvc30pOwogICAgIGlmICgkYXZhaWwgPCAkbGVuKSB7Ci0gICAgICAgIGRpZSBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQXR0ZW1wdCB0byByZWFkQWxsKCRsZW4pIGZvdW5kIG9ubHkgJGF2YWlsIGF2YWlsYWJsZSIpOworICAgICAgICBkaWUgVFRyYW5zcG9ydEV4Y2VwdGlvbi0+bmV3KCJBdHRlbXB0IHRvIHJlYWRBbGwoJGxlbikgZm91bmQgb25seSAkYXZhaWwgYXZhaWxhYmxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjo6RU5EX09GX0ZJTEUpOwogICAgIH0KIAogICAgIG15ICRkYXRhID0gJyc7CmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L01lc3NhZ2VUeXBlLnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC9NZXNzYWdlVHlwZS5wbQppbmRleCBjODkwMmNjLi5kMjVjMmY3IDEwMDY0NAotLS0gYS9saWIvcGVybC9saWIvVGhyaWZ0L01lc3NhZ2VUeXBlLnBtCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvTWVzc2FnZVR5cGUucG0KQEAgLTE3LDE2ICsxNywyMSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAordXNlIDUuMTAuMDsKIHVzZSBzdHJpY3Q7CiB1c2Ugd2FybmluZ3M7CiAKLXBhY2thZ2UgVGhyaWZ0OjpNZXNzYWdlVHlwZTsKK3VzZSBUaHJpZnQ7CiAKLXVzZSBzdHJpY3Q7CisjCisjIE1lc3NhZ2UgdHlwZXMgZm9yIFJQQworIworcGFja2FnZSBUaHJpZnQ6OlRNZXNzYWdlVHlwZTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKIAotdXNlIGNvbnN0YW50IENBTEwgCT0+IDE7Ci11c2UgY29uc3RhbnQgUkVQTFkJPT4gMjsKLXVzZSBjb25zdGFudCBFWENFUFRJT04JPT4gMzsKLXVzZSBjb25zdGFudCBPTkVXQVkgCT0+IDQ7Cit1c2UgY29uc3RhbnQgQ0FMTCAgICAgID0+IDE7Cit1c2UgY29uc3RhbnQgUkVQTFkgICAgID0+IDI7Cit1c2UgY29uc3RhbnQgRVhDRVBUSU9OID0+IDM7Cit1c2UgY29uc3RhbnQgT05FV0FZICAgID0+IDQ7CiAKLTE7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorMTsKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvTXVsdGlwbGV4ZWRQcm9jZXNzb3IucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0L011bHRpcGxleGVkUHJvY2Vzc29yLnBtCmluZGV4IDQyMWJmNzMuLmFlOTI1ZDcgMTAwNjQ0Ci0tLSBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvTXVsdGlwbGV4ZWRQcm9jZXNzb3IucG0KKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9NdWx0aXBsZXhlZFByb2Nlc3Nvci5wbQpAQCAtMTcsMTkgKzE3LDE5IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCit1c2UgNS4xMC4wOwogdXNlIHN0cmljdDsKIHVzZSB3YXJuaW5nczsKIAogdXNlIFRocmlmdDsKLXVzZSBUaHJpZnQ6OlByb3RvY29sOwotdXNlIFRocmlmdDo6TXVsdGlwbGV4ZWRQcm90b2NvbDsKLXVzZSBUaHJpZnQ6OlByb3RvY29sRGVjb3JhdG9yOwogdXNlIFRocmlmdDo6TWVzc2FnZVR5cGU7Cit1c2UgVGhyaWZ0OjpNdWx0aXBsZXhlZFByb3RvY29sOwordXNlIFRocmlmdDo6UHJvdG9jb2w7Cit1c2UgVGhyaWZ0OjpQcm90b2NvbERlY29yYXRvcjsKIAogcGFja2FnZSBUaHJpZnQ6OlN0b3JlZE1lc3NhZ2VQcm90b2NvbDsKIHVzZSBiYXNlIHF3KFRocmlmdDo6UHJvdG9jb2xEZWNvcmF0b3IpOwotCi11c2Ugc3RyaWN0OwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCiBzdWIgbmV3IHsKICAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CkBAIC00Niw3ICs0Niw3IEBACiAgICAgcmV0dXJuIGJsZXNzKCRzZWxmLCRjbGFzc25hbWUpOwogfQogCi1zdWIgcmVhZE1lc3NhZ2VCZWdpbiAKK3N1YiByZWFkTWVzc2FnZUJlZ2luCiB7CiAgICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgICBteSAkbmFtZSA9IHNoaWZ0OwpAQCAtNTksMjcgKzU5LDM0IEBACiB9CiAKIHBhY2thZ2UgVGhyaWZ0OjpNdWx0aXBsZXhlZFByb2Nlc3NvcjsKLQotdXNlIHN0cmljdDsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKIAogc3ViIG5ldyB7CiAgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OwogICAgIG15ICRzZWxmICAgICAgPSB7fTsKLSAgICAKKwogICAgICRzZWxmLT57c2VydmljZVByb2Nlc3Nvck1hcH0gPSB7fTsKKyAgICAkc2VsZi0+e2RlZmF1bHRQcm9jZXNzb3J9ID0gdW5kZWY7CiAKICAgICByZXR1cm4gYmxlc3MoJHNlbGYsJGNsYXNzbmFtZSk7CiB9CiAKK3N1YiBkZWZhdWx0UHJvY2Vzc29yIHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRwcm9jZXNzb3IgPSBzaGlmdDsKKworICAgICRzZWxmLT57ZGVmYXVsdFByb2Nlc3Nvcn0gPSAkcHJvY2Vzc29yOworfQorCiBzdWIgcmVnaXN0ZXJQcm9jZXNzb3IgewogICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICAgbXkgJHNlcnZpY2VOYW1lID0gc2hpZnQ7CiAgICAgbXkgJHByb2Nlc3NvciA9IHNoaWZ0OwotICAKKwogICAgICAkc2VsZi0+e3NlcnZpY2VQcm9jZXNzb3JNYXB9LT57JHNlcnZpY2VOYW1lfSA9ICRwcm9jZXNzb3I7CiB9CiAKLXN1YiBwcm9jZXNzeworc3ViIHByb2Nlc3MgewogICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICAgbXkgJGlucHV0ID0gc2hpZnQ7CiAgICAgbXkgJG91dHB1dCA9IHNoaWZ0OwpAQCAtOTIsMzAgKzk5LDM1IEBACiAKICAgICBteSAoJGZuYW1lLCAkbXR5cGUsICRyc2VxaWQpOwogICAgICRpbnB1dC0+cmVhZE1lc3NhZ2VCZWdpbihcJGZuYW1lLCBcJG10eXBlLCBcJHJzZXFpZCk7Ci0gICAJCiAKLSAgICBpZiAoJG10eXBlIG5lIFRocmlmdDo6TWVzc2FnZVR5cGU6OkNBTEwgJiYgJG10eXBlIG5lIFRocmlmdDo6TWVzc2FnZVR5cGU6Ok9ORVdBWSkgewotICAJICAgIGRpZSBuZXcgVGhyaWZ0OjpURXhjZXB0aW9uKCJUaGlzIHNob3VsZCBub3QgaGF2ZSBoYXBwZW5lZCE/Iik7CisgICAgaWYgKCRtdHlwZSBuZSBUaHJpZnQ6OlRNZXNzYWdlVHlwZTo6Q0FMTCAmJiAkbXR5cGUgbmUgVGhyaWZ0OjpUTWVzc2FnZVR5cGU6Ok9ORVdBWSkgeworICAgICAgICBkaWUgVGhyaWZ0OjpURXhjZXB0aW9uLT5uZXcoJ1RoaXMgc2hvdWxkIG5vdCBoYXZlIGhhcHBlbmVkIT8nKTsKICAgICB9Ci0gIAorCiAgICAgIyBFeHRyYWN0IHRoZSBzZXJ2aWNlIG5hbWUgYW5kIHRoZSBuZXcgTWVzc2FnZSBuYW1lLgogICAgIGlmIChpbmRleCgkZm5hbWUsIFRocmlmdDo6TXVsdGlwbGV4ZWRQcm90b2NvbDo6U0VQQVJBVE9SKSA9PSAtMSkgewotICAJICAgIGRpZSBuZXcgVGhyaWZ0OjpURXhjZXB0aW9uKCJTZXJ2aWNlIG5hbWUgbm90IGZvdW5kIGluIG1lc3NhZ2UgbmFtZTogeyRmbmFtZX0uIERpZCB5b3UgIiAuCi0gICAgICAgICAgICAiZm9yZ2V0IHRvIHVzZSBhIE11bHRpcGxleFByb3RvY29sIGluIHlvdXIgY2xpZW50PyIpOworICAgICAgICBpZiAoZGVmaW5lZCAkc2VsZi0+e2RlZmF1bHRQcm9jZXNzb3J9KSB7CisgICAgICAgICAgICByZXR1cm4gJHNlbGYtPntkZWZhdWx0UHJvY2Vzc29yfS0+cHJvY2VzcygKKyAgICAgICAgICAgICAgICBUaHJpZnQ6OlN0b3JlZE1lc3NhZ2VQcm90b2NvbC0+bmV3KCRpbnB1dCwgJGZuYW1lLCAkbXR5cGUsICRyc2VxaWQpLCAkb3V0cHV0CisgICAgICAgICAgICApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGllIFRocmlmdDo6VEV4Y2VwdGlvbi0+bmV3KCJTZXJ2aWNlIG5hbWUgbm90IGZvdW5kIGluIG1lc3NhZ2UgbmFtZTogeyRmbmFtZX0gYW5kIG5vIGRlZmF1bHQgcHJvY2Vzc29yIGRlZmluZWQuIERpZCB5b3UgIiAuCisgICAgICAgICAgICAgICAgJ2ZvcmdldCB0byB1c2UgYSBNdWx0aXBsZXhQcm90b2NvbCBpbiB5b3VyIGNsaWVudD8nKTsKKyAgICAgICAgfQogICAgIH0KLSAgCisKICAgICAobXkgJHNlcnZpY2VOYW1lLCBteSAkbWVzc2FnZU5hbWUpID0gc3BsaXQoJzonLCAkZm5hbWUsIDIpOwotICAKKwogICAgIGlmICghZXhpc3RzKCRzZWxmLT57c2VydmljZVByb2Nlc3Nvck1hcH0tPnskc2VydmljZU5hbWV9KSkgewotICAJICAgIGRpZSBuZXcgVGhyaWZ0OjpURXhjZXB0aW9uKCJTZXJ2aWNlIG5hbWUgbm90IGZvdW5kOiB7JHNlcnZpY2VOYW1lfS4gIERpZCB5b3UgZm9yZ2V0ICIgLgotICAgICAgICAgICAgInRvIGNhbGwgcmVnaXN0ZXJQcm9jZXNzb3IoKT8iKTsKKyAgICAgICAgZGllIFRocmlmdDo6VEV4Y2VwdGlvbi0+bmV3KCJTZXJ2aWNlIG5hbWUgbm90IGZvdW5kOiB7JHNlcnZpY2VOYW1lfS4gIERpZCB5b3UgZm9yZ2V0ICIgLgorICAgICAgICAgICAgJ3RvIGNhbGwgcmVnaXN0ZXJQcm9jZXNzb3IoKT8nKTsKICAgICB9Ci0gIAotICAgICAjRGlzcGF0Y2ggcHJvY2Vzc2luZyB0byB0aGUgc3RvcmVkIHByb2Nlc3NvcgotICAgICBteSAkcHJvY2Vzc29yID0gJHNlbGYtPntzZXJ2aWNlUHJvY2Vzc29yTWFwfS0+eyRzZXJ2aWNlTmFtZX07Ci0gICAgIHJldHVybiAkcHJvY2Vzc29yLT5wcm9jZXNzKAotICAgICAgICBuZXcgVGhyaWZ0OjpTdG9yZWRNZXNzYWdlUHJvdG9jb2woJGlucHV0LCAkbWVzc2FnZU5hbWUsICRtdHlwZSwgJHJzZXFpZCksICRvdXRwdXQKLSAgICAgKTsKKworICAgICMgRGlzcGF0Y2ggcHJvY2Vzc2luZyB0byB0aGUgc3RvcmVkIHByb2Nlc3NvcgorICAgIG15ICRwcm9jZXNzb3IgPSAkc2VsZi0+e3NlcnZpY2VQcm9jZXNzb3JNYXB9LT57JHNlcnZpY2VOYW1lfTsKKyAgICByZXR1cm4gJHByb2Nlc3Nvci0+cHJvY2VzcygKKyAgICAgICAgVGhyaWZ0OjpTdG9yZWRNZXNzYWdlUHJvdG9jb2wtPm5ldygkaW5wdXQsICRtZXNzYWdlTmFtZSwgJG10eXBlLCAkcnNlcWlkKSwgJG91dHB1dAorICAgICk7CiB9CiAKLTE7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorMTsKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvTXVsdGlwbGV4ZWRQcm90b2NvbC5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvTXVsdGlwbGV4ZWRQcm90b2NvbC5wbQppbmRleCA4M2E0ZWFmLi41YjViNjBiIDEwMDY0NAotLS0gYS9saWIvcGVybC9saWIvVGhyaWZ0L011bHRpcGxleGVkUHJvdG9jb2wucG0KKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9NdWx0aXBsZXhlZFByb3RvY29sLnBtCkBAIC0xNywyNiArMTcsMjcgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKK3VzZSA1LjEwLjA7CiB1c2Ugc3RyaWN0OwogdXNlIHdhcm5pbmdzOwogCit1c2UgVGhyaWZ0OwordXNlIFRocmlmdDo6TWVzc2FnZVR5cGU7CiB1c2UgVGhyaWZ0OjpQcm90b2NvbDsKIHVzZSBUaHJpZnQ6OlByb3RvY29sRGVjb3JhdG9yOwotdXNlIFRocmlmdDo6TWVzc2FnZVR5cGU7CiAKIHBhY2thZ2UgVGhyaWZ0OjpNdWx0aXBsZXhlZFByb3RvY29sOwogdXNlIGJhc2UgcXcoVGhyaWZ0OjpQcm90b2NvbERlY29yYXRvcik7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKLXVzZSBzdHJpY3Q7Ci0KLXVzZSBjb25zdGFudCBTRVBBUkFUT1IgCT0+ICc6JzsKK3VzZSBjb25zdGFudCBTRVBBUkFUT1IgID0+ICc6JzsKIAogc3ViIG5ldyB7CiAgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OwogICAgIG15ICRwcm90b2NvbCAgPSBzaGlmdDsKICAgICBteSAkc2VydmljZU5hbWUgID0gc2hpZnQ7CiAgICAgbXkgJHNlbGYgICAgICA9ICRjbGFzc25hbWUtPlNVUEVSOjpuZXcoJHByb3RvY29sKTsKLSAgICAKKwogICAgICRzZWxmLT57c2VydmljZU5hbWV9ID0gJHNlcnZpY2VOYW1lOwogCiAgICAgcmV0dXJuIGJsZXNzKCRzZWxmLCRjbGFzc25hbWUpOwpAQCAtNTAsMTggKzUxLDE4IEBACiAjIEBwYXJhbSBpbnQgICAgJHR5cGUgIE1lc3NhZ2UgdHlwZS4KICMgQHBhcmFtIGludCAgICAkc2VxaWQgVGhlIHNlcXVlbmNlIGlkIG9mIHRoaXMgbWVzc2FnZS4KICMKLXN1YiB3cml0ZU1lc3NhZ2VCZWdpbiAKK3N1YiB3cml0ZU1lc3NhZ2VCZWdpbgogewotCW15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgICBteSAoJG5hbWUsICR0eXBlLCAkc2VxaWQpID0gQF87CiAKLSAgICBpZiAoJHR5cGUgPT0gVGhyaWZ0OjpNZXNzYWdlVHlwZTo6Q0FMTCB8fCAkdHlwZSA9PSBUaHJpZnQ6Ok1lc3NhZ2VUeXBlOjpPTkVXQVkpIHsKKyAgICBpZiAoJHR5cGUgPT0gVGhyaWZ0OjpUTWVzc2FnZVR5cGU6OkNBTEwgfHwgJHR5cGUgPT0gVGhyaWZ0OjpUTWVzc2FnZVR5cGU6Ok9ORVdBWSkgewogICAgICAgICBteSAkbmFtZVdpdGhTZXJ2aWNlID0gJHNlbGYtPntzZXJ2aWNlTmFtZX0uU0VQQVJBVE9SLiRuYW1lOwogICAgICAgICAkc2VsZi0+U1VQRVI6OndyaXRlTWVzc2FnZUJlZ2luKCRuYW1lV2l0aFNlcnZpY2UsICR0eXBlLCAkc2VxaWQpOwogICAgIH0KICAgICBlbHNlIHsKLSAgICAgICAgJHNlbGYtPlNVUEVSOjp3cml0ZU1lc3NhZ2VCZWdpbigkbmFtZSwgJHR5cGUsICRzZXFpZCk7CQorICAgICAgICAkc2VsZi0+U1VQRVI6OndyaXRlTWVzc2FnZUJlZ2luKCRuYW1lLCAkdHlwZSwgJHNlcWlkKTsKICAgICB9CiB9CiAKLTE7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorMTsKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvUHJvdG9jb2wucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0L1Byb3RvY29sLnBtCmluZGV4IDNlOWYwZGQuLjI2ZWY0NmEgMTAwNjQ0Ci0tLSBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvUHJvdG9jb2wucG0KKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9Qcm90b2NvbC5wbQpAQCAtMTcsMjYgKzE3LDI4IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1yZXF1aXJlIDUuNi4wOwordXNlIDUuMTAuMDsKIHVzZSBzdHJpY3Q7CiB1c2Ugd2FybmluZ3M7CiAKIHVzZSBUaHJpZnQ7Cit1c2UgVGhyaWZ0OjpFeGNlcHRpb247Cit1c2UgVGhyaWZ0OjpUeXBlOwogCiAjCiAjIFByb3RvY29sIGV4Y2VwdGlvbnMKICMKLXBhY2thZ2UgVFByb3RvY29sRXhjZXB0aW9uOworcGFja2FnZSBUaHJpZnQ6OlRQcm90b2NvbEV4Y2VwdGlvbjsKIHVzZSBiYXNlKCdUaHJpZnQ6OlRFeGNlcHRpb24nKTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKIAotdXNlIGNvbnN0YW50IFVOS05PV04gICAgICAgPT4gMDsKLXVzZSBjb25zdGFudCBJTlZBTElEX0RBVEEgID0+IDE7Ci11c2UgY29uc3RhbnQgTkVHQVRJVkVfU0laRSA9PiAyOwotdXNlIGNvbnN0YW50IFNJWkVfTElNSVQgICAgPT4gMzsKLXVzZSBjb25zdGFudCBCQURfVkVSU0lPTiAgID0+IDQ7Cit1c2UgY29uc3RhbnQgVU5LTk9XTiAgICAgICAgID0+IDA7Cit1c2UgY29uc3RhbnQgSU5WQUxJRF9EQVRBICAgID0+IDE7Cit1c2UgY29uc3RhbnQgTkVHQVRJVkVfU0laRSAgID0+IDI7Cit1c2UgY29uc3RhbnQgU0laRV9MSU1JVCAgICAgID0+IDM7Cit1c2UgY29uc3RhbnQgQkFEX1ZFUlNJT04gICAgID0+IDQ7CiB1c2UgY29uc3RhbnQgTk9UX0lNUExFTUVOVEVEID0+IDU7Ci11c2UgY29uc3RhbnQgREVQVEhfTElNSVQgICA9PiA2OwotCit1c2UgY29uc3RhbnQgREVQVEhfTElNSVQgICAgID0+IDY7CiAKIHN1YiBuZXcgewogICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKQEAgLTUwLDYgKzUyLDcgQEAKICMgUHJvdG9jb2wgYmFzZSBjbGFzcyBtb2R1bGUuCiAjCiBwYWNrYWdlIFRocmlmdDo6UHJvdG9jb2w7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKIHN1YiBuZXcgewogICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKQEAgLTc4LDM3ICs4MSwzNyBAQAogc3ViIHdyaXRlTWVzc2FnZUJlZ2luCiB7CiAgICAgbXkgKCRuYW1lLCAkdHlwZSwgJHNlcWlkKTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogIwogIyBDbG9zZSB0aGUgbWVzc2FnZQogIwogc3ViIHdyaXRlTWVzc2FnZUVuZCB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKICMKICMgV3JpdGVzIGEgc3RydWN0IGhlYWRlci4KICMKICMgQHBhcmFtIHN0cmluZyAgICAgJG5hbWUgU3RydWN0IG5hbWUKLSMgQHRocm93cyBURXhjZXB0aW9uIG9uIHdyaXRlIGVycm9yCisjIEB0aHJvd3MgVFByb3RvY29sRXhjZXB0aW9uIG9uIHdyaXRlIGVycm9yCiAjIEByZXR1cm4gaW50IEhvdyBtYW55IGJ5dGVzIHdyaXR0ZW4KICMKIHN1YiB3cml0ZVN0cnVjdEJlZ2luIHsKICAgICBteSAoJG5hbWUpOwogCi0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKICMKICMgQ2xvc2UgYSBzdHJ1Y3QuCiAjCi0jIEB0aHJvd3MgVEV4Y2VwdGlvbiBvbiB3cml0ZSBlcnJvcgorIyBAdGhyb3dzIFRQcm90b2NvbEV4Y2VwdGlvbiBvbiB3cml0ZSBlcnJvcgogIyBAcmV0dXJuIGludCBIb3cgbWFueSBieXRlcyB3cml0dGVuCiAjCiBzdWIgd3JpdGVTdHJ1Y3RFbmQgewotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiAjCkBAIC0xMTcsODUgKzEyMCw4NSBAQAogIyBAcGFyYW0gc3RyaW5nICAgICAkbmFtZSBGaWVsZCBuYW1lCiAjIEBwYXJhbSBpbnQgICAgICAgICR0eXBlIEZpZWxkIHR5cGUKICMgQHBhcmFtIGludCAgICAgICAgJGZpZCAgRmllbGQgaWQKLSMgQHRocm93cyBURXhjZXB0aW9uIG9uIHdyaXRlIGVycm9yCisjIEB0aHJvd3MgVFByb3RvY29sRXhjZXB0aW9uIG9uIHdyaXRlIGVycm9yCiAjIEByZXR1cm4gaW50IEhvdyBtYW55IGJ5dGVzIHdyaXR0ZW4KICMKIHN1YiB3cml0ZUZpZWxkQmVnaW4gewogICAgIG15ICgkZmllbGROYW1lLCAkZmllbGRUeXBlLCAkZmllbGRJZCk7CiAKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHdyaXRlRmllbGRFbmQgewotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgd3JpdGVGaWVsZFN0b3AgewotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgd3JpdGVNYXBCZWdpbiB7CiAgICAgbXkgKCRrZXlUeXBlLCAkdmFsVHlwZSwgJHNpemUpOwogCi0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiB3cml0ZU1hcEVuZCB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiB3cml0ZUxpc3RCZWdpbiB7CiAgICAgbXkgKCRlbGVtVHlwZSwgJHNpemUpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgd3JpdGVMaXN0RW5kIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHdyaXRlU2V0QmVnaW4gewogICAgIG15ICgkZWxlbVR5cGUsICRzaXplKTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHdyaXRlU2V0RW5kIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHdyaXRlQm9vbCB7CiAgICAgbXkgKCRib29sKTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHdyaXRlQnl0ZSB7CiAgICAgbXkgKCRieXRlKTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHdyaXRlSTE2IHsKICAgICBteSAoJGkxNik7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiB3cml0ZUkzMiB7CiAgICAgbXkgKCRpMzIpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgd3JpdGVJNjQgewogICAgIG15ICgkaTY0KTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHdyaXRlRG91YmxlIHsKICAgICBteSAoJGR1Yik7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiB3cml0ZVN0cmluZwogewogICAgIG15ICgkc3RyKTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogIwpAQCAtMjA4LDcgKzIxMSw3IEBACiBzdWIgcmVhZE1lc3NhZ2VCZWdpbgogewogICAgIG15ICgkbmFtZSwgJHR5cGUsICRzZXFpZCk7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKICMKQEAgLTIxNiwxMDUgKzIxOSwxMDUgQEAKICMKIHN1YiByZWFkTWVzc2FnZUVuZAogewotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgcmVhZFN0cnVjdEJlZ2luCiB7CiAgICAgbXkoJG5hbWUpOwogCi0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiByZWFkU3RydWN0RW5kCiB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiByZWFkRmllbGRCZWdpbgogewogICAgIG15ICgkbmFtZSwgJGZpZWxkVHlwZSwgJGZpZWxkSWQpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgcmVhZEZpZWxkRW5kCiB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiByZWFkTWFwQmVnaW4KIHsKICAgICBteSAoJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSk7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiByZWFkTWFwRW5kCiB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiByZWFkTGlzdEJlZ2luCiB7CiAgICAgbXkgKCRlbGVtVHlwZSwgJHNpemUpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgcmVhZExpc3RFbmQKIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHJlYWRTZXRCZWdpbgogewogICAgIG15ICgkZWxlbVR5cGUsICRzaXplKTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHJlYWRTZXRFbmQKIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHJlYWRCb29sCiB7CiAgICAgbXkgKCRib29sKTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHJlYWRCeXRlCiB7CiAgICAgbXkgKCRieXRlKTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHJlYWRJMTYKIHsKICAgICBteSAoJGkxNik7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiByZWFkSTMyCiB7CiAgICAgbXkgKCRpMzIpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgcmVhZEk2NAogewogICAgIG15ICgkaTY0KTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHJlYWREb3VibGUKIHsKICAgICBteSAoJGR1Yik7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiByZWFkU3RyaW5nCiB7CiAgICAgbXkgKCRzdHIpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiAjCkBAIC0zMzIsMzYgKzMzNSwzNiBAQAogICAgIG15ICRyZXN1bHQ7CiAgICAgbXkgJGk7CiAKLSAgICBpZigkdHlwZSA9PSBUVHlwZTo6Qk9PTCkKKyAgICBpZigkdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpCT09MKQogICAgIHsKICAgICAgICAgcmV0dXJuICRzZWxmLT5yZWFkQm9vbChcJHJlZik7CiAgICAgfQotICAgIGVsc2lmKCR0eXBlID09IFRUeXBlOjpCWVRFKXsKKyAgICBlbHNpZigkdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpCWVRFKXsKICAgICAgICAgcmV0dXJuICRzZWxmLT5yZWFkQnl0ZShcJHJlZik7CiAgICAgfQotICAgIGVsc2lmKCR0eXBlID09IFRUeXBlOjpJMTYpeworICAgIGVsc2lmKCR0eXBlID09IFRocmlmdDo6VFR5cGU6OkkxNil7CiAgICAgICAgIHJldHVybiAkc2VsZi0+cmVhZEkxNihcJHJlZik7CiAgICAgfQotICAgIGVsc2lmKCR0eXBlID09IFRUeXBlOjpJMzIpeworICAgIGVsc2lmKCR0eXBlID09IFRocmlmdDo6VFR5cGU6OkkzMil7CiAgICAgICAgIHJldHVybiAkc2VsZi0+cmVhZEkzMihcJHJlZik7CiAgICAgfQotICAgIGVsc2lmKCR0eXBlID09IFRUeXBlOjpJNjQpeworICAgIGVsc2lmKCR0eXBlID09IFRocmlmdDo6VFR5cGU6Okk2NCl7CiAgICAgICAgIHJldHVybiAkc2VsZi0+cmVhZEk2NChcJHJlZik7CiAgICAgfQotICAgIGVsc2lmKCR0eXBlID09IFRUeXBlOjpET1VCTEUpeworICAgIGVsc2lmKCR0eXBlID09IFRocmlmdDo6VFR5cGU6OkRPVUJMRSl7CiAgICAgICAgIHJldHVybiAkc2VsZi0+cmVhZERvdWJsZShcJHJlZik7CiAgICAgfQotICAgIGVsc2lmKCR0eXBlID09IFRUeXBlOjpTVFJJTkcpCisgICAgZWxzaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6U1RSSU5HKQogICAgIHsKICAgICAgICAgcmV0dXJuICRzZWxmLT5yZWFkU3RyaW5nKFwkcmVmKTsKICAgICB9Ci0gICAgZWxzaWYoJHR5cGUgPT0gVFR5cGU6OlNUUlVDVCkKKyAgICBlbHNpZigkdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpTVFJVQ1QpCiAgICAgewogICAgICAgICAkcmVzdWx0ID0gJHNlbGYtPnJlYWRTdHJ1Y3RCZWdpbihcJHJlZik7CiAgICAgICAgIHdoaWxlICgxKSB7CiAgICAgICAgICAgICBteSAoJGZ0eXBlLCRmaWQpOwogICAgICAgICAgICAgJHJlc3VsdCArPSAkc2VsZi0+cmVhZEZpZWxkQmVnaW4oXCRyZWYsIFwkZnR5cGUsIFwkZmlkKTsKLSAgICAgICAgICAgIGlmICgkZnR5cGUgPT0gVFR5cGU6OlNUT1ApIHsKKyAgICAgICAgICAgIGlmICgkZnR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6U1RPUCkgewogICAgICAgICAgICAgICAgIGxhc3Q7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAkcmVzdWx0ICs9ICRzZWxmLT5za2lwKCRmdHlwZSk7CkBAIC0zNzAsNyArMzczLDcgQEAKICAgICAgICAgJHJlc3VsdCArPSAkc2VsZi0+cmVhZFN0cnVjdEVuZCgpOwogICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgICB9Ci0gICAgZWxzaWYoJHR5cGUgPT0gVFR5cGU6Ok1BUCkKKyAgICBlbHNpZigkdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpNQVApCiAgICAgewogICAgICAgICBteSgka2V5VHlwZSwkdmFsVHlwZSwkc2l6ZSk7CiAgICAgICAgICRyZXN1bHQgPSAkc2VsZi0+cmVhZE1hcEJlZ2luKFwka2V5VHlwZSwgXCR2YWxUeXBlLCBcJHNpemUpOwpAQCAtMzgxLDcgKzM4NCw3IEBACiAgICAgICAgICRyZXN1bHQgKz0gJHNlbGYtPnJlYWRNYXBFbmQoKTsKICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICAgfQotICAgIGVsc2lmKCR0eXBlID09IFRUeXBlOjpTRVQpCisgICAgZWxzaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6U0VUKQogICAgIHsKICAgICAgICAgbXkgKCRlbGVtVHlwZSwkc2l6ZSk7CiAgICAgICAgICRyZXN1bHQgPSAkc2VsZi0+cmVhZFNldEJlZ2luKFwkZWxlbVR5cGUsIFwkc2l6ZSk7CkBAIC0zOTEsNyArMzk0LDcgQEAKICAgICAgICAgJHJlc3VsdCArPSAkc2VsZi0+cmVhZFNldEVuZCgpOwogICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgICB9Ci0gICAgZWxzaWYoJHR5cGUgPT0gVFR5cGU6OkxJU1QpCisgICAgZWxzaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6TElTVCkKICAgICB7CiAgICAgICAgIG15ICgkZWxlbVR5cGUsJHNpemUpOwogICAgICAgICAkcmVzdWx0ID0gJHNlbGYtPnJlYWRMaXN0QmVnaW4oXCRlbGVtVHlwZSwgXCRzaXplKTsKQEAgLTQwMiw3ICs0MDUsOCBAQAogICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgICB9CiAKLSAgICBkaWUgbmV3IFRocmlmdDo6VEV4Y2VwdGlvbigiVHlwZSAkdHlwZSBub3QgcmVjb2duaXNlZCAtLS0gY29ycnVwdCBkYXRhPyIpOworICAgIGRpZSBUaHJpZnQ6OlRQcm90b2NvbEV4Y2VwdGlvbi0+bmV3KCJUeXBlICR0eXBlIG5vdCByZWNvZ25pemVkIC0tLSBjb3JydXB0IGRhdGE/IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdDo6VFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOwogCiAgIH0KIApAQCAtNDE4LDMxICs0MjIsMzEgQEAKICAgICBteSAkaXRyYW5zID0gc2hpZnQ7CiAgICAgbXkgJHR5cGUgICA9IHNoaWZ0OwogCi0gICAgaWYoJHR5cGUgPT0gVFR5cGU6OkJPT0wpCi0gICAgewotICAgICAgcmV0dXJuICRpdHJhbnMtPnJlYWRBbGwoMSk7Ci0gICAgfQotICAgIGVsc2lmKCR0eXBlID09IFRUeXBlOjpCWVRFKQorICAgIGlmKCR0eXBlID09IFRocmlmdDo6VFR5cGU6OkJPT0wpCiAgICAgewogICAgICAgICByZXR1cm4gJGl0cmFucy0+cmVhZEFsbCgxKTsKICAgICB9Ci0gICAgZWxzaWYoJHR5cGUgPT0gVFR5cGU6OkkxNikKKyAgICBlbHNpZigkdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpCWVRFKQorICAgIHsKKyAgICAgICAgcmV0dXJuICRpdHJhbnMtPnJlYWRBbGwoMSk7CisgICAgfQorICAgIGVsc2lmKCR0eXBlID09IFRocmlmdDo6VFR5cGU6OkkxNikKICAgICB7CiAgICAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDIpOwogICAgIH0KLSAgICBlbHNpZigkdHlwZSA9PSBUVHlwZTo6STMyKQorICAgIGVsc2lmKCR0eXBlID09IFRocmlmdDo6VFR5cGU6OkkzMikKICAgICB7CiAgICAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDQpOwogICAgIH0KLSAgICBlbHNpZigkdHlwZSA9PSBUVHlwZTo6STY0KQorICAgIGVsc2lmKCR0eXBlID09IFRocmlmdDo6VFR5cGU6Okk2NCkKICAgICB7CiAgICAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDgpOwogICAgIH0KLSAgICBlbHNpZigkdHlwZSA9PSBUVHlwZTo6RE9VQkxFKQorICAgIGVsc2lmKCR0eXBlID09IFRocmlmdDo6VFR5cGU6OkRPVUJMRSkKICAgICB7CiAgICAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDgpOwogICAgIH0KLSAgICBlbHNpZiggJHR5cGUgPT0gVFR5cGU6OlNUUklORyApCisgICAgZWxzaWYoICR0eXBlID09IFRocmlmdDo6VFR5cGU6OlNUUklORyApCiAgICAgewogICAgICAgICBteSBAbGVuID0gdW5wYWNrKCdOJywgJGl0cmFucy0+cmVhZEFsbCg0KSk7CiAgICAgICAgIG15ICRsZW4gPSAkbGVuWzBdOwpAQCAtNDUxLDI1ICs0NTUsMjUgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gNCArICRpdHJhbnMtPnJlYWRBbGwoJGxlbik7CiAgICAgfQotICAgIGVsc2lmKCAkdHlwZSA9PSBUVHlwZTo6U1RSVUNUICkKKyAgICBlbHNpZiggJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6U1RSVUNUICkKICAgICB7CiAgICAgICAgIG15ICRyZXN1bHQgPSAwOwogICAgICAgICB3aGlsZSAoMSkgewotICAgICAgICAgIG15ICRmdHlwZSA9IDA7Ci0gICAgICAgICAgbXkgJGZpZCA9IDA7Ci0gICAgICAgICAgbXkgJGRhdGEgPSAkaXRyYW5zLT5yZWFkQWxsKDEpOwotICAgICAgICAgIG15IEBhcnIgPSB1bnBhY2soJ2MnLCAkZGF0YSk7Ci0gICAgICAgICAgJGZ0eXBlID0gJGFyclswXTsKLSAgICAgICAgICBpZiAoJGZ0eXBlID09IFRUeXBlOjpTVE9QKSB7Ci0gICAgICAgICAgICBsYXN0OwotICAgICAgICAgIH0KLSAgICAgICAgICAjIEkxNiBmaWVsZCBpZAotICAgICAgICAgICRyZXN1bHQgKz0gJGl0cmFucy0+cmVhZEFsbCgyKTsKLSAgICAgICAgICAkcmVzdWx0ICs9ICRzZWxmLT5za2lwQmluYXJ5KCRpdHJhbnMsICRmdHlwZSk7CisgICAgICAgICAgICBteSAkZnR5cGUgPSAwOworICAgICAgICAgICAgbXkgJGZpZCA9IDA7CisgICAgICAgICAgICBteSAkZGF0YSA9ICRpdHJhbnMtPnJlYWRBbGwoMSk7CisgICAgICAgICAgICBteSBAYXJyID0gdW5wYWNrKCdjJywgJGRhdGEpOworICAgICAgICAgICAgJGZ0eXBlID0gJGFyclswXTsKKyAgICAgICAgICAgIGlmICgkZnR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6U1RPUCkgeworICAgICAgICAgICAgICAgIGxhc3Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAjIEkxNiBmaWVsZCBpZAorICAgICAgICAgICAgJHJlc3VsdCArPSAkaXRyYW5zLT5yZWFkQWxsKDIpOworICAgICAgICAgICAgJHJlc3VsdCArPSAkc2VsZi0+c2tpcEJpbmFyeSgkaXRyYW5zLCAkZnR5cGUpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgIH0KLSAgICBlbHNpZigkdHlwZSA9PSBUVHlwZTo6TUFQKQorICAgIGVsc2lmKCR0eXBlID09IFRocmlmdDo6VFR5cGU6Ok1BUCkKICAgICB7CiAgICAgICAgICMgS3R5cGUKICAgICAgICAgbXkgJGRhdGEgPSAkaXRyYW5zLT5yZWFkQWxsKDEpOwpAQCAtNDkzLDcgKzQ5Nyw3IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICAgfQotICAgIGVsc2lmKCR0eXBlID09IFRUeXBlOjpTRVQgfHwgJHR5cGUgPT0gVFR5cGU6OkxJU1QpCisgICAgZWxzaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6U0VUIHx8ICR0eXBlID09IFRocmlmdDo6VFR5cGU6OkxJU1QpCiAgICAgewogICAgICAgICAjIFZ0eXBlCiAgICAgICAgIG15ICRkYXRhID0gJGl0cmFucy0+cmVhZEFsbCgxKTsKQEAgLTUxMywxNCArNTE3LDE1IEBACiAgICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgIH0KIAotICAgIGRpZSBuZXcgVGhyaWZ0OjpURXhjZXB0aW9uKCJUeXBlICR0eXBlIG5vdCByZWNvZ25pc2VkIC0tLSBjb3JydXB0IGRhdGE/Iik7CisgICAgZGllIFRocmlmdDo6VFByb3RvY29sRXhjZXB0aW9uLT5uZXcoIlR5cGUgJHR5cGUgbm90IHJlY29nbml6ZWQgLS0tIGNvcnJ1cHQgZGF0YT8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0OjpUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7CiB9CiAKICMKICMgUHJvdG9jb2wgZmFjdG9yeSBjcmVhdGVzIHByb3RvY29sIG9iamVjdHMgZnJvbSB0cmFuc3BvcnRzCiAjCi1wYWNrYWdlIFRQcm90b2NvbEZhY3Rvcnk7Ci0KK3BhY2thZ2UgVGhyaWZ0OjpUUHJvdG9jb2xGYWN0b3J5OwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCiBzdWIgbmV3IHsKICAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CkBAIC01MzcsNyArNTQyLDcgQEAKIHN1YiBnZXRQcm90b2NvbAogewogICAgIG15ICgkdHJhbnMpOwotICAgIGRpZSAiaW50ZXJmYWNlIjsKKyAgICBkaWUgJ2ludGVyZmFjZSc7CiB9CiAKIApkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9Qcm90b2NvbERlY29yYXRvci5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvUHJvdG9jb2xEZWNvcmF0b3IucG0KaW5kZXggODEyMDIwMC4uY2M1YzlkYSAxMDA2NDQKLS0tIGEvbGliL3BlcmwvbGliL1RocmlmdC9Qcm90b2NvbERlY29yYXRvci5wbQorKysgYi9saWIvcGVybC9saWIvVGhyaWZ0L1Byb3RvY29sRGVjb3JhdG9yLnBtCkBAIC0xNywxOSArMTcsMjIgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKK3VzZSA1LjEwLjA7CiB1c2Ugc3RyaWN0OwogdXNlIHdhcm5pbmdzOwogCit1c2UgVGhyaWZ0OwogdXNlIFRocmlmdDo6UHJvdG9jb2w7CiAKIHBhY2thZ2UgVGhyaWZ0OjpQcm90b2NvbERlY29yYXRvcjsKIHVzZSBiYXNlIHF3KFRocmlmdDo6UHJvdG9jb2wpOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCiBzdWIgbmV3IHsKICAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CiAgICAgbXkgJHByb3RvY29sICA9IHNoaWZ0OwogICAgIG15ICRzZWxmICAgICAgPSAkY2xhc3NuYW1lLT5TVVBFUjo6bmV3KCRwcm90b2NvbC0+Z2V0VHJhbnNwb3J0KCkpOwotICAgIAorCiAgICAgJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfSA9ICRwcm90b2NvbDsKIAogICAgIHJldHVybiBibGVzcygkc2VsZiwkY2xhc3NuYW1lKTsKQEAgLTQ1LDcgKzQ4LDcgQEAKIHN1YiB3cml0ZU1lc3NhZ2VCZWdpbiB7CiAgICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgICBteSAoJG5hbWUsICR0eXBlLCAkc2VxaWQpID0gQF87Ci0gICAgIAorCiAgICAgICByZXR1cm4gICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPndyaXRlTWVzc2FnZUJlZ2luKCRuYW1lLCAkdHlwZSwgJHNlcWlkKTsKIH0KIApAQCAtNTQsNyArNTcsNyBAQAogIwogc3ViIHdyaXRlTWVzc2FnZUVuZCB7CiAgICAgIG15ICRzZWxmID0gc2hpZnQ7Ci0gICAgIAorCiAgICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT53cml0ZU1lc3NhZ2VFbmQoKTsKIH0KIApAQCAtNzksNyArODIsNyBAQAogIyBAcmV0dXJuIGludCBIb3cgbWFueSBieXRlcyB3cml0dGVuCiAjCiBzdWIgd3JpdGVTdHJ1Y3RFbmQgewotICAgIG15ICRzZWxmID0gc2hpZnQ7ICAgIAorICAgIG15ICRzZWxmID0gc2hpZnQ7CiAKICAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+d3JpdGVTdHJ1Y3RFbmQoKTsKIH0KQEAgLTEwMSwxMyArMTA0LDEzIEBACiB9CiAKIHN1YiB3cml0ZUZpZWxkRW5kIHsKLSAgICBteSAkc2VsZiA9IHNoaWZ0OyAgICAKKyAgICBteSAkc2VsZiA9IHNoaWZ0OwogCiAgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPndyaXRlRmllbGRFbmQoKTsKIH0KIAogc3ViIHdyaXRlRmllbGRTdG9wIHsKLSAgICBteSAkc2VsZiA9IHNoaWZ0OyAgICAKKyAgICBteSAkc2VsZiA9IHNoaWZ0OwogCiAgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPndyaXRlRmllbGRTdG9wKCk7CiB9CkBAIC0xMjEsNyArMTI0LDcgQEAKIAogc3ViIHdyaXRlTWFwRW5kIHsKICAgICBteSAkc2VsZiA9IHNoaWZ0OwotICAgIAorCiAgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPndyaXRlTWFwRW5kKCk7CiB9CiAKQEAgLTEzNCw3ICsxMzcsNyBAQAogCiBzdWIgd3JpdGVMaXN0RW5kIHsKICAgICBteSAkc2VsZiA9IHNoaWZ0OwotICAgIAorCiAgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPndyaXRlTGlzdEVuZCgpOwogfQogCkBAIC0xNDcsNyArMTUwLDcgQEAKIAogc3ViIHdyaXRlU2V0RW5kIHsKICAgICBteSAkc2VsZiA9IHNoaWZ0OwotICAgIAorCiAgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPndyaXRlTGlzdEVuZCgpOwogfQogCkBAIC0xNzcsNyArMTgwLDcgQEAKICAgICBteSAoJGkzMikgPSBAXzsKIAogICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT53cml0ZUkzMigkaTMyKTsKLSAKKwogfQogCiBzdWIgd3JpdGVJNjQgewpAQCAtMjIxLDcgKzIyNCw3IEBACiAjCiBzdWIgcmVhZE1lc3NhZ2VFbmQKIHsKLSAgICBteSAkc2VsZiA9IHNoaWZ0OyAgICAKKyAgICBteSAkc2VsZiA9IHNoaWZ0OwogCiAgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPnJlYWRNZXNzYWdlRW5kKCk7CiB9CkBAIC0yMzYsNyArMjM5LDcgQEAKIAogc3ViIHJlYWRTdHJ1Y3RFbmQKIHsKLSAgICBteSAkc2VsZiA9IHNoaWZ0OyAgICAKKyAgICBteSAkc2VsZiA9IHNoaWZ0OwogCiAgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPnJlYWRTdHJ1Y3RFbmQoKTsKIH0KQEAgLTI1MSw3ICsyNTQsNyBAQAogCiBzdWIgcmVhZEZpZWxkRW5kCiB7Ci0gICAgbXkgJHNlbGYgPSBzaGlmdDsgICAgCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKIAogICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT5yZWFkRmllbGRFbmQoKTsKIH0KQEAgLTI2Niw3ICsyNjksNyBAQAogCiBzdWIgcmVhZE1hcEVuZAogewotICAgIG15ICRzZWxmID0gc2hpZnQ7ICAgIAorICAgIG15ICRzZWxmID0gc2hpZnQ7CiAKICAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+cmVhZE1hcEVuZCgpOwogfQpAQCAtMjgxLDcgKzI4NCw3IEBACiAKIHN1YiByZWFkTGlzdEVuZAogewotICAgIG15ICRzZWxmID0gc2hpZnQ7ICAgIAorICAgIG15ICRzZWxmID0gc2hpZnQ7CiAKICAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+cmVhZExpc3RFbmQoKTsKIH0KQEAgLTI5Niw3ICsyOTksNyBAQAogCiBzdWIgcmVhZFNldEVuZAogewotICAgIG15ICRzZWxmID0gc2hpZnQ7ICAgIAorICAgIG15ICRzZWxmID0gc2hpZnQ7CiAKICAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+cmVhZFNldEVuZCgpOwogfQpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9TU0xTZXJ2ZXJTb2NrZXQucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0L1NTTFNlcnZlclNvY2tldC5wbQppbmRleCAyZWZkZmZmLi43YjA2NDMxIDEwMDY0NAotLS0gYS9saWIvcGVybC9saWIvVGhyaWZ0L1NTTFNlcnZlclNvY2tldC5wbQorKysgYi9saWIvcGVybC9saWIvVGhyaWZ0L1NTTFNlcnZlclNvY2tldC5wbQpAQCAtMTcsMjQgKzE3LDI0IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1yZXF1aXJlIDUuNi4wOwordXNlIDUuMTAuMDsKIHVzZSBzdHJpY3Q7CiB1c2Ugd2FybmluZ3M7CiAKIHVzZSBUaHJpZnQ7CiB1c2UgVGhyaWZ0OjpTU0xTb2NrZXQ7Cit1c2UgVGhyaWZ0OjpTZXJ2ZXJTb2NrZXQ7CiAKIHVzZSBJTzo6U29ja2V0OjpTU0w7Ci11c2UgSU86OlNlbGVjdDsKIAogcGFja2FnZSBUaHJpZnQ6OlNTTFNlcnZlclNvY2tldDsKLQogdXNlIGJhc2UgcXcoIFRocmlmdDo6U2VydmVyU29ja2V0ICk7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKICMKICMgQ29uc3RydWN0b3IuCiAjIFRha2VzIGEgaGFzaDoKLSMgU2VlIFRoaXJmdDo6U29ja2V0IGZvciBiYXNlIGNsYXNzIHBhcmFtZXRlcnMuCisjIFNlZSBUaHJpZnQ6OlNvY2tldCBmb3IgYmFzZSBjbGFzcyBwYXJhbWV0ZXJzLgogIyBAcGFyYW1baW5dICBjYSAgICAgY2VydGlmaWNhdGUgYXV0aG9yaXR5IGZpbGVuYW1lIC0gbm90IHJlcXVpcmVkCiAjIEBwYXJhbVtpbl0gIGNlcnQgICBjZXJ0aWZpY2F0ZSBmaWxlbmFtZTsgbWF5IGNvbnRhaW4ga2V5IGluIHdoaWNoIGNhc2Uga2V5IGlzIG5vdCByZXF1aXJlZAogIyBAcGFyYW1baW5dICBrZXkgICAgcHJpdmF0ZSBrZXkgZmlsZW5hbWUgZm9yIHRoZSBjZXJ0aWZpY2F0ZSBpZiBpdCBpcyBub3QgaW5zaWRlIHRoZSBjZXJ0IGZpbGUKQEAgLTQ4LDIxICs0OCwyOSBAQAogCiBzdWIgX19jbGllbnQKIHsKLQlyZXR1cm4gbmV3IFRocmlmdDo6U1NMU29ja2V0KCk7CisgIHJldHVybiBUaHJpZnQ6OlNTTFNvY2tldC0+bmV3KCk7CiB9CiAKIHN1YiBfX2xpc3RlbgogewogICAgIG15ICRzZWxmID0gc2hpZnQ7Ci0gICAgcmV0dXJuIElPOjpTb2NrZXQ6OlNTTC0+bmV3KExvY2FsQWRkciAgICAgPT4gJHNlbGYtPntob3N0fSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxQb3J0ICAgICA9PiAkc2VsZi0+e3BvcnR9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90byAgICAgICAgID0+ICd0Y3AnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0ZW4gICAgICAgID0+ICRzZWxmLT57cXVldWV9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXVzZUFkZHIgICAgID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTTF9jZXJ0X2ZpbGUgPT4gJHNlbGYtPntjZXJ0fSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NMX2tleV9maWxlICA9PiAkc2VsZi0+e2tleX0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTTF9jYV9maWxlICAgPT4gJHNlbGYtPntjYX0pOwotfQorICAgIG15ICRvcHRzID0ge0xpc3RlbiAgICAgICAgPT4gJHNlbGYtPntxdWV1ZX0sCisgICAgICAgICAgICAgICAgTG9jYWxBZGRyICAgICA9PiAkc2VsZi0+e2hvc3R9LAorICAgICAgICAgICAgICAgIExvY2FsUG9ydCAgICAgPT4gJHNlbGYtPntwb3J0fSwKKyAgICAgICAgICAgICAgICBQcm90byAgICAgICAgID0+ICd0Y3AnLAorICAgICAgICAgICAgICAgIFJldXNlQWRkciAgICAgPT4gMX07CiAKKyAgICBteSAkdmVyaWZ5ID0gSU86OlNvY2tldDo6U1NMOjpTU0xfVkVSSUZZX1BFRVIgfCBJTzo6U29ja2V0OjpTU0w6OlNTTF9WRVJJRllfRkFJTF9JRl9OT19QRUVSX0NFUlQgfCBJTzo6U29ja2V0OjpTU0w6OlNTTF9WRVJJRllfQ0xJRU5UX09OQ0U7CisKKyAgICAkb3B0cy0+e1NTTF9jYV9maWxlfSAgICAgID0gJHNlbGYtPntjYX0gICAgICBpZiBkZWZpbmVkICRzZWxmLT57Y2F9OworICAgICRvcHRzLT57U1NMX2NlcnRfZmlsZX0gICAgPSAkc2VsZi0+e2NlcnR9ICAgIGlmIGRlZmluZWQgJHNlbGYtPntjZXJ0fTsKKyAgICAkb3B0cy0+e1NTTF9jaXBoZXJfbGlzdH0gID0gJHNlbGYtPntjaXBoZXJzfSBpZiBkZWZpbmVkICRzZWxmLT57Y2lwaGVyc307CisgICAgJG9wdHMtPntTU0xfa2V5X2ZpbGV9ICAgICA9ICRzZWxmLT57a2V5fSAgICAgaWYgZGVmaW5lZCAkc2VsZi0+e2tleX07CisgICAgJG9wdHMtPntTU0xfdXNlX2NlcnR9ICAgICA9IChkZWZpbmVkICRzZWxmLT57Y2VydH0pID8gMSA6IDA7CisgICAgJG9wdHMtPntTU0xfdmVyaWZ5X21vZGV9ICA9IChkZWZpbmVkICRzZWxmLT57Y2F9KSA/ICR2ZXJpZnkgOiBJTzo6U29ja2V0OjpTU0w6OlNTTF9WRVJJRllfTk9ORTsKKyAgICAkb3B0cy0+e1NTTF92ZXJzaW9ufSAgICAgID0gKGRlZmluZWQgJHNlbGYtPnt2ZXJzaW9ufSkgPyAkc2VsZi0+e3ZlcnNpb259IDogJ1NTTHYyMzohU1NMdjM6IVNTTHYyJzsKKworICAgIHJldHVybiBJTzo6U29ja2V0OjpTU0wtPm5ldyglJG9wdHMpOworfQogCiAxOwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9TU0xTb2NrZXQucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0L1NTTFNvY2tldC5wbQppbmRleCBiNzBkNDZmLi5lMzQ5MjRkIDEwMDY0NAotLS0gYS9saWIvcGVybC9saWIvVGhyaWZ0L1NTTFNvY2tldC5wbQorKysgYi9saWIvcGVybC9saWIvVGhyaWZ0L1NTTFNvY2tldC5wbQpAQCAtMTcsMjEgKzE3LDQyIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1yZXF1aXJlIDUuNi4wOwordXNlIDUuMTAuMDsKIHVzZSBzdHJpY3Q7CiB1c2Ugd2FybmluZ3M7CiAKIHVzZSBUaHJpZnQ7Ci11c2UgVGhyaWZ0OjpUcmFuc3BvcnQ7Cit1c2UgVGhyaWZ0OjpTb2NrZXQ7CiAKIHVzZSBJTzo6U29ja2V0OjpTU0w7Ci11c2UgSU86OlNlbGVjdDsKIAogcGFja2FnZSBUaHJpZnQ6OlNTTFNvY2tldDsKLQotIyBUT0RPOiBEb2VzIG5vdCBwcm92aWRlIGNpcGhlciBzZWxlY3Rpb24gb3IgYXV0aGVudGljYXRpb24gaG9va3MgeWV0LgotCiB1c2UgYmFzZSBxdyggVGhyaWZ0OjpTb2NrZXQgKTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKKworIworIyBDb25zdHJ1Y3Rpb24gYW5kIHVzYWdlCisjCisjIG15ICRvcHRzID0ge30KKyMgbXkgJHNvY2tldCA9IFRocmlmdDo6U1NMU29ja2V0LT5uZXcoXCVvcHRzKTsKKyMKKyMgb3B0aW9uczoKKyMKKyMgQW55IG9wdGlvbiBmcm9tIFNvY2tldC5wbSBpcyB2YWxpZCwgYW5kIHRoZW46CisjCisjIGNhICAgICAgICAgID0+IGNlcnRpZmljYXRlIGF1dGhvcml0eSBmaWxlIChQRU0gZmlsZSkgdG8gYXV0aGVudGljYXRlIHRoZQorIyAgICAgICAgICAgICAgICBzZXJ2ZXIgYWdhaW5zdDsgaWYgbm90IHNwZWNpZmllZCB0aGVuIHRoZSBzZXJ2ZXIgaXMgbm90CisjICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0ZWQKKyMgY2VydCAgICAgICAgPT4gY2VydGlmaWNhdGUgdG8gdXNlIGFzIHRoZSBjbGllbnQ7IGlmIG5vdCBzcGVjaWZpZWQgdGhlbgorIyAgICAgICAgICAgICAgICB0aGUgY2xpZW50IGRvZXMgbm90IHByZXNlbnQgb25lIGJ1dCBzdGlsbCBjb25uZWN0cyB1c2luZworIyAgICAgICAgICAgICAgICBzZWN1cmUgcHJvdG9jb2wKKyMgY2lwaGVycyAgICAgPT4gYWxsb3dlZCBjaXBoZXIgbGlzdAorIyAgICAgICAgICAgICAgICAoc2VlIGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvZG9jcy9hcHBzL2NpcGhlcnMuaHRtbCNDSVBIRVJfU1RSSU5HUykKKyMga2V5ICAgICAgICAgPT4gY2VydGlmaWNhdGUga2V5IGZvciAiY2VydCIgb3B0aW9uCisjIHZlcnNpb24gICAgID0+IGFjY2VwdGFibGUgU1NML1RMUyB2ZXJzaW9ucyAtIGlmIG5vdCBzcGVjaWZpZWQgdGhlbiB0aGUKKyMgICAgICAgICAgICAgICAgZGVmYXVsdCBpcyB0byB1c2UgU1NMdjIzIGhhbmRzaGFrZSBidXQgb25seSBuZWdvdGlhdGUKKyMgICAgICAgICAgICAgICAgYXQgVExTdjEuMCBvciBsYXRlcgorIwogCiBzdWIgbmV3CiB7CkBAIC00NCwyNyArNjUsNDMgQEAKIHN1YiBfX29wZW4KIHsKICAgICBteSAkc2VsZiA9IHNoaWZ0OwotICAgIHJldHVybiBJTzo6U29ja2V0OjpTU0wtPm5ldyhQZWVyQWRkciA9PiAkc2VsZi0+e2hvc3R9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZWVyUG9ydCA9PiAkc2VsZi0+e3BvcnR9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90byAgICA9PiAndGNwJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZW91dCAgPT4gJHNlbGYtPntzZW5kVGltZW91dH0gLyAxMDAwKTsKKyAgICBteSAkb3B0cyA9IHtQZWVyQWRkciAgICAgID0+ICRzZWxmLT57aG9zdH0sCisgICAgICAgICAgICAgICAgUGVlclBvcnQgICAgICA9PiAkc2VsZi0+e3BvcnR9LAorICAgICAgICAgICAgICAgIFByb3RvICAgICAgICAgPT4gJ3RjcCcsCisgICAgICAgICAgICAgICAgVGltZW91dCAgICAgICA9PiAkc2VsZi0+e3NlbmRUaW1lb3V0fSAvIDEwMDB9OworCisgICAgbXkgJHZlcmlmeSA9IElPOjpTb2NrZXQ6OlNTTDo6U1NMX1ZFUklGWV9QRUVSIHwgSU86OlNvY2tldDo6U1NMOjpTU0xfVkVSSUZZX0ZBSUxfSUZfTk9fUEVFUl9DRVJUIHwgSU86OlNvY2tldDo6U1NMOjpTU0xfVkVSSUZZX0NMSUVOVF9PTkNFOworCisgICAgJG9wdHMtPntTU0xfY2FfZmlsZX0gICAgICA9ICRzZWxmLT57Y2F9ICAgICAgaWYgZGVmaW5lZCAkc2VsZi0+e2NhfTsKKyAgICAkb3B0cy0+e1NTTF9jZXJ0X2ZpbGV9ICAgID0gJHNlbGYtPntjZXJ0fSAgICBpZiBkZWZpbmVkICRzZWxmLT57Y2VydH07CisgICAgJG9wdHMtPntTU0xfY2lwaGVyX2xpc3R9ICA9ICRzZWxmLT57Y2lwaGVyc30gaWYgZGVmaW5lZCAkc2VsZi0+e2NpcGhlcnN9OworICAgICRvcHRzLT57U1NMX2tleV9maWxlfSAgICAgPSAkc2VsZi0+e2tleX0gICAgIGlmIGRlZmluZWQgJHNlbGYtPntrZXl9OworICAgICRvcHRzLT57U1NMX3VzZV9jZXJ0fSAgICAgPSAoZGVmaW5lZCAkc2VsZi0+e2NlcnR9KSA/IDEgOiAwOworICAgICRvcHRzLT57U1NMX3ZlcmlmeV9tb2RlfSAgPSAoZGVmaW5lZCAkc2VsZi0+e2NhfSkgPyAkdmVyaWZ5IDogSU86OlNvY2tldDo6U1NMOjpTU0xfVkVSSUZZX05PTkU7CisgICAgJG9wdHMtPntTU0xfdmVyc2lvbn0gICAgICA9IChkZWZpbmVkICRzZWxmLT57dmVyc2lvbn0pID8gJHNlbGYtPnt2ZXJzaW9ufSA6ICdTU0x2MjM6IVNTTHYzOiFTU0x2Mic7CisKKyAgICByZXR1cm4gSU86OlNvY2tldDo6U1NMLT5uZXcoJSRvcHRzKTsKIH0KIAogc3ViIF9fY2xvc2UKIHsKICAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgIG15ICRzb2NrID0gKCRzZWxmLT57aGFuZGxlfS0+aGFuZGxlcygpKVswXTsKLSAgICAkc29jay0+Y2xvc2UoU1NMX25vX3NodXRkb3duID0+IDEpOworICAgIGlmICgkc29jaykgeworICAgICAgJHNvY2stPmNsb3NlKFNTTF9ub19zaHV0ZG93biA9PiAxKTsKKyAgICB9CiB9CiAKIHN1YiBfX3JlY3YKIHsKLQlteSAkc2VsZiA9IHNoaWZ0OwotCW15ICRzb2NrID0gc2hpZnQ7Ci0JbXkgJGxlbiA9IHNoaWZ0OwotCW15ICRidWYgPSB1bmRlZjsKKyAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgbXkgJHNvY2sgPSBzaGlmdDsKKyAgbXkgJGxlbiA9IHNoaWZ0OworICBteSAkYnVmID0gdW5kZWY7CisgIGlmICgkc29jaykgewogICAgIHN5c3JlYWQoJHNvY2ssICRidWYsICRsZW4pOwotICAgIHJldHVybiAkYnVmOworICB9CisgIHJldHVybiAkYnVmOwogfQogCiBzdWIgX19zZW5kCkBAIC03OSw3ICsxMTYsNyBAQAogewogICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICAgbXkgJHNvY2sgPSAoJHNlbGYtPntoYW5kbGV9LT5oYW5kbGVzKCkpWzBdOwotICAgIGlmICgkc29jay0+cGVuZGluZygpIGVxIDApIHsKKyAgICBpZiAoJHNvY2sgYW5kICRzb2NrLT5wZW5kaW5nKCkgZXEgMCkgewogICAgICAgICByZXR1cm4gJHNlbGYtPlNVUEVSOjpfX3dhaXQoKTsKICAgICB9CiAgICAgcmV0dXJuICRzb2NrOwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9TZXJ2ZXIucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0L1NlcnZlci5wbQppbmRleCA5N2U2NjIwLi4yODgyMmU4IDEwMDY0NAotLS0gYS9saWIvcGVybC9saWIvVGhyaWZ0L1NlcnZlci5wbQorKysgYi9saWIvcGVybC9saWIvVGhyaWZ0L1NlcnZlci5wbQpAQCAtMTcsMjUgKzE3LDMxIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1yZXF1aXJlIDUuNi4wOwordXNlIDUuMTAuMDsKIHVzZSBzdHJpY3Q7CiB1c2Ugd2FybmluZ3M7CiAKIHVzZSBUaHJpZnQ7Ci11c2UgVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydDsKIHVzZSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sOwordXNlIFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQ7Cit1c2UgVGhyaWZ0OjpFeGNlcHRpb247CiAKICMKICMgU2VydmVyIGJhc2UgY2xhc3MgbW9kdWxlCiAjCiBwYWNrYWdlIFRocmlmdDo6U2VydmVyOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCisjCiAjIDMgcG9zc2libGUgY29uc3RydWN0b3JzOgogIyAgIDEuICAocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQpCisjICAgICAgIFVzZXMgYSBCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkgYW5kIGEgQmluYXJ5UHJvdG9jb2xGYWN0b3J5LgogIyAgIDIuICAocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSkKKyMgICAgICAgVXNlcyB0aGUgc2FtZSBmYWN0b3J5IGZvciBpbnB1dCBhbmQgb3V0cHV0IG9mIGVhY2ggdHlwZS4KICMgICAzLiAgKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LAogIyAgICAgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LCBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAogIyAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSkKKyMKIHN1YiBuZXcKIHsKICAgICBteSAkY2xhc3NuYW1lICAgID0gc2hpZnQ7CkBAIC00NSw3ICs1MSw3IEBACiAKICAgICBpZiAoc2NhbGFyIEBhcmdzID09IDIpCiAgICAgewotICAgICAgJHNlbGYgPSBfaW5pdCgkYXJnc1swXSwgJGFyZ3NbMV0sCisgICAgICAgICRzZWxmID0gX2luaXQoJGFyZ3NbMF0sICRhcmdzWzFdLAogICAgICAgICAgICAgICAgICAgICBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeS0+bmV3KCksCiAgICAgICAgICAgICAgICAgICAgIFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5LT5uZXcoKSwKICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEZhY3RvcnktPm5ldygpLApAQCAtNjEsNyArNjcsNyBAQAogICAgIH0KICAgICBlbHNlCiAgICAgewotICAgICAgZGllICJUaHJpZnQ6OlNlcnZlciBleHBlY3RzIGV4YWN0bHkgMiwgNCwgb3IgNiBhcmdzIjsKKyAgICAgIGRpZSBUaHJpZnQ6OlRFeGNlcHRpb24tPm5ldygnVGhyaWZ0OjpTZXJ2ZXIgZXhwZWN0cyBleGFjdGx5IDIsIDQsIG9yIDYgYXJncycpOwogICAgIH0KIAogICAgIHJldHVybiBibGVzcygkc2VsZiwkY2xhc3NuYW1lKTsKQEAgLTg4LDcgKzk0LDcgQEAKIAogc3ViIHNlcnZlCiB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiBfY2xpZW50QmVnaW4KQEAgLTEwOSw3ICsxMTUsNyBAQAogICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICAgbXkgJGUgICAgPSBzaGlmdDsKIAotICAgIGlmICgkZSA9fiBtL1RFeGNlcHRpb24vIGFuZCBleGlzdHMgJGUtPnttZXNzYWdlfSkgeworICAgIGlmICgkZS0+aXNhKCdUaHJpZnQ6OlRFeGNlcHRpb24nKSBhbmQgZXhpc3RzICRlLT57bWVzc2FnZX0pIHsKICAgICAgICAgbXkgJG1lc3NhZ2UgPSAkZS0+e21lc3NhZ2V9OwogICAgICAgICBteSAkY29kZSAgICA9ICRlLT57Y29kZX07CiAgICAgICAgIG15ICRvdXQgICAgID0gJGNvZGUgLiAnOicgLiAkbWVzc2FnZTsKQEAgLTExNyw1NCArMTIzLDYwIEBACiAgICAgICAgICRtZXNzYWdlID1+IG0vVFRyYW5zcG9ydEV4Y2VwdGlvbi8gYW5kIGRpZSAkb3V0OwogICAgICAgICBpZiAoJG1lc3NhZ2UgPX4gbS9Tb2NrZXQvKSB7CiAgICAgICAgICAgICAjIHN1cHByZXNzIFNvY2tldCBtZXNzYWdlcwotICAgICAgICB9IGVsc2UgeworICAgICAgICB9CisgICAgICAgIGVsc2UgewogICAgICAgICAgICAgd2FybiAkb3V0OwogICAgICAgICB9Ci0gICAgfSBlbHNlIHsKKyAgICB9CisgICAgZWxzZSB7CiAgICAgICAgIHdhcm4gJGU7CiAgICAgfQogfQogCi0KICMKICMgU2ltcGxlU2VydmVyIGZyb20gdGhlIFNlcnZlciBiYXNlIGNsYXNzIHRoYXQgaGFuZGxlcyBvbmUgY29ubmVjdGlvbiBhdCBhIHRpbWUKICMKIHBhY2thZ2UgVGhyaWZ0OjpTaW1wbGVTZXJ2ZXI7Ci11c2UgYmFzZSBxdyggVGhyaWZ0OjpTZXJ2ZXIgKTsKK3VzZSBwYXJlbnQgLW5vcmVxdWlyZSwgJ1RocmlmdDo6U2VydmVyJzsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKIAogc3ViIG5ldwogewogICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKLSAgICBteSBAYXJncyAgICAgID0gQF87CiAKLSAgICBteSAkc2VsZiAgICAgID0gJGNsYXNzbmFtZS0+U1VQRVI6Om5ldyhAYXJncyk7CisgICAgbXkgJHNlbGYgICAgICA9ICRjbGFzc25hbWUtPlNVUEVSOjpuZXcoQF8pOworCiAgICAgcmV0dXJuIGJsZXNzKCRzZWxmLCRjbGFzc25hbWUpOwogfQogCiBzdWIgc2VydmUKIHsKICAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRzdG9wID0gMDsKIAogICAgICRzZWxmLT57c2VydmVyVHJhbnNwb3J0fS0+bGlzdGVuKCk7Ci0gICAgd2hpbGUgKDEpCi0gICAgeworICAgIHdoaWxlICghJHN0b3ApIHsKICAgICAgICAgbXkgJGNsaWVudCA9ICRzZWxmLT57c2VydmVyVHJhbnNwb3J0fS0+YWNjZXB0KCk7Ci0gICAgICAgIG15ICRpdHJhbnMgPSAkc2VsZi0+e2lucHV0VHJhbnNwb3J0RmFjdG9yeX0tPmdldFRyYW5zcG9ydCgkY2xpZW50KTsKLSAgICAgICAgbXkgJG90cmFucyA9ICRzZWxmLT57b3V0cHV0VHJhbnNwb3J0RmFjdG9yeX0tPmdldFRyYW5zcG9ydCgkY2xpZW50KTsKLSAgICAgICAgbXkgJGlwcm90ICA9ICRzZWxmLT57aW5wdXRQcm90b2NvbEZhY3Rvcnl9LT5nZXRQcm90b2NvbCgkaXRyYW5zKTsKLSAgICAgICAgbXkgJG9wcm90ICA9ICRzZWxmLT57b3V0cHV0UHJvdG9jb2xGYWN0b3J5fS0+Z2V0UHJvdG9jb2woJG90cmFucyk7Ci0gICAgICAgIGV2YWwgewotICAgICAgICAgICAgJHNlbGYtPl9jbGllbnRCZWdpbigkaXByb3QsICRvcHJvdCk7Ci0gICAgICAgICAgICB3aGlsZSAoMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAkc2VsZi0+e3Byb2Nlc3Nvcn0tPnByb2Nlc3MoJGlwcm90LCAkb3Byb3QpOworICAgICAgICBpZiAoZGVmaW5lZCAkY2xpZW50KSB7CisgICAgICAgICAgICBteSAkaXRyYW5zID0gJHNlbGYtPntpbnB1dFRyYW5zcG9ydEZhY3Rvcnl9LT5nZXRUcmFuc3BvcnQoJGNsaWVudCk7CisgICAgICAgICAgICBteSAkb3RyYW5zID0gJHNlbGYtPntvdXRwdXRUcmFuc3BvcnRGYWN0b3J5fS0+Z2V0VHJhbnNwb3J0KCRjbGllbnQpOworICAgICAgICAgICAgbXkgJGlwcm90ICA9ICRzZWxmLT57aW5wdXRQcm90b2NvbEZhY3Rvcnl9LT5nZXRQcm90b2NvbCgkaXRyYW5zKTsKKyAgICAgICAgICAgIG15ICRvcHJvdCAgPSAkc2VsZi0+e291dHB1dFByb3RvY29sRmFjdG9yeX0tPmdldFByb3RvY29sKCRvdHJhbnMpOworICAgICAgICAgICAgZXZhbCB7CisgICAgICAgICAgICAgICAgJHNlbGYtPl9jbGllbnRCZWdpbigkaXByb3QsICRvcHJvdCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e3Byb2Nlc3Nvcn0tPnByb2Nlc3MoJGlwcm90LCAkb3Byb3QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBpZigkQCkgeworICAgICAgICAgICAgICAgICRzZWxmLT5faGFuZGxlRXhjZXB0aW9uKCRAKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfTsgaWYoJEApIHsKLSAgICAgICAgICAgICRzZWxmLT5faGFuZGxlRXhjZXB0aW9uKCRAKTsKKyAgICAgICAgICAgICRpdHJhbnMtPmNsb3NlKCk7CisgICAgICAgICAgICAkb3RyYW5zLT5jbG9zZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHN0b3AgPSAxOwogICAgICAgICB9Ci0KLSAgICAgICAgJGl0cmFucy0+Y2xvc2UoKTsKLSAgICAgICAgJG90cmFucy0+Y2xvc2UoKTsKICAgICB9CiB9CiAKQEAgLTE3Myw5ICsxODUsOSBAQAogIyBGb3JraW5nU2VydmVyIHRoYXQgZm9ya3MgYSBuZXcgcHJvY2VzcyBmb3IgZWFjaCByZXF1ZXN0CiAjCiBwYWNrYWdlIFRocmlmdDo6Rm9ya2luZ1NlcnZlcjsKLXVzZSBiYXNlIHF3KCBUaHJpZnQ6OlNlcnZlciApOwotCi11c2UgUE9TSVggIjpzeXNfd2FpdF9oIjsKK3VzZSBwYXJlbnQgLW5vcmVxdWlyZSwgJ1RocmlmdDo6U2VydmVyJzsKK3VzZSBQT1NJWCAnOnN5c193YWl0X2gnOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCiBzdWIgbmV3CiB7CkBAIC0xOTEsNiArMjAzLDkgQEAKIHsKICAgICBteSAkc2VsZiA9IHNoaWZ0OwogCisgICAgIyBUSFJJRlQtMzg0ODogd2l0aG91dCBpZ25vcmluZyBTSUdDSExELCBwZXJsIEZvcmtpbmdTZXJ2ZXIgZ29lcyBpbnRvIGEgdGlnaHQgbG9vcAorICAgICRTSUd7Q0hMRH0gPSAnSUdOT1JFJzsKKwogICAgICRzZWxmLT57c2VydmVyVHJhbnNwb3J0fS0+bGlzdGVuKCk7CiAgICAgd2hpbGUgKDEpCiAgICAgewpAQCAtMjE1LDEzICsyMzAsMTUgQEAKIAogICAgICAgICBteSAkcGlkID0gZm9yaygpOwogCi0gICAgICAgIGlmICgkcGlkKSAjcGFyZW50CisgICAgICAgIGlmICgkcGlkKQogICAgICAgICB7CiAgICAgICAgICAgICAkc2VsZi0+X3BhcmVudCgkcGlkLCAkaXRyYW5zLCAkb3RyYW5zKTsKLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICRzZWxmLT5fY2hpbGQoJGl0cmFucywgJG90cmFucywgJGlwcm90LCAkb3Byb3QpOwogICAgICAgICB9Ci0gICAgfTsgaWYoJEApIHsKKyAgICB9OworICAgIGlmKCRAKSB7CiAgICAgICAgICRzZWxmLT5faGFuZGxlRXhjZXB0aW9uKCRAKTsKICAgICB9CiB9CkBAIC0yMzMsMTAgKzI1MCw2IEBACiAgICAgbXkgJGl0cmFucyA9IHNoaWZ0OwogICAgIG15ICRvdHJhbnMgPSBzaGlmdDsKIAotICAgICMgYWRkIGJlZm9yZSBjb2xsZWN0LCBvdGhlcndpc2UgeW91IHJhY2Ugdy8gd2FpdHBpZAotICAgICRzZWxmLT57Y2hpbGRyZW59LT57JHBpZH0gPSAxOwotICAgICRzZWxmLT5fY29sbGVjdENoaWxkcmVuKCk7Ci0KICAgICAjIFBhcmVudCBtdXN0IGNsb3NlIHNvY2tldCBvciB0aGUgY29ubmVjdGlvbiBtYXkgbm90IGdldCBjbG9zZWQgcHJvbXB0bHkKICAgICAkc2VsZi0+dHJ5Q2xvc2UoJGl0cmFucyk7CiAgICAgJHNlbGYtPnRyeUNsb3NlKCRvdHJhbnMpOwpAQCAtMjUyLDExICsyNjUsMTQgQEAKIAogICAgIG15ICRlY29kZSA9IDA7CiAgICAgZXZhbCB7CisgICAgICAgICMgVEhSSUZULTQwNjUgZW5zdXJlIGNoaWxkIHByb2Nlc3MgaGFzIG5vcm1hbCBzaWduYWwgaGFuZGxpbmcgaW4gY2FzZSB0aHJpZnQgaGFuZGxlciB1c2VzIGl0CisgICAgICAgICRTSUd7Q0hMRH0gPSAnREVGQVVMVCc7CiAgICAgICAgIHdoaWxlICgxKQogICAgICAgICB7CiAgICAgICAgICAgICAkc2VsZi0+e3Byb2Nlc3Nvcn0tPnByb2Nlc3MoJGlwcm90LCAkb3Byb3QpOwogICAgICAgICB9Ci0gICAgfTsgaWYoJEApIHsKKyAgICB9OworICAgIGlmKCRAKSB7CiAgICAgICAgICRlY29kZSA9IDE7CiAgICAgICAgICRzZWxmLT5faGFuZGxlRXhjZXB0aW9uKCRAKTsKICAgICB9CkBAIC0yNzcsMzcgKzI5MywxOSBAQAogICAgICAgICB7CiAgICAgICAgICAgJGZpbGUtPmNsb3NlKCk7CiAgICAgICAgIH0KLSAgICB9OyBpZigkQCkgewotICAgICAgICBpZiAoJEAgPX4gbS9URXhjZXB0aW9uLyBhbmQgZXhpc3RzICRALT57bWVzc2FnZX0pIHsKKyAgICB9OworICAgIGlmKCRAKSB7CisgICAgICAgIGlmICgkQC0+aXNhKCdUaHJpZnQ6OlRFeGNlcHRpb24nKSBhbmQgZXhpc3RzICRALT57bWVzc2FnZX0pIHsKICAgICAgICAgICAgIG15ICRtZXNzYWdlID0gJEAtPnttZXNzYWdlfTsKICAgICAgICAgICAgIG15ICRjb2RlICAgID0gJEAtPntjb2RlfTsKICAgICAgICAgICAgIG15ICRvdXQgICAgID0gJGNvZGUgLiAnOicgLiAkbWVzc2FnZTsKIAogICAgICAgICAgICAgd2FybiAkb3V0OwotICAgICAgICB9IGVsc2UgeworICAgICAgICB9CisgICAgICAgIGVsc2UgewogICAgICAgICAgICAgd2FybiAkQDsKICAgICAgICAgfQogICAgIH0KIH0KIAotc3ViIF9jb2xsZWN0Q2hpbGRyZW4KLXsKLSAgICBteSAkc2VsZiA9IHNoaWZ0OwotCi0gICAgd2hpbGUgKHNjYWxhciBrZXlzICV7JHNlbGYtPntjaGlsZHJlbn19KQotICAgIHsKLSAgICAgICAgbXkgJHBpZCAgICA9IHdhaXRwaWQoLTEsIFdOT0hBTkcpOwotCi0gICAgICAgIGlmICgkcGlkPjApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRlbGV0ZSAkc2VsZi0+e2NoaWxkcmVufS0+eyRwaWR9OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgbGFzdDsKLSAgICAgICAgfQotICAgIH0KLX0KLQotCiAxOwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9TZXJ2ZXJTb2NrZXQucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0L1NlcnZlclNvY2tldC5wbQppbmRleCBhNDFiMzE5Li4zOTcyNjQzIDEwMDY0NAotLS0gYS9saWIvcGVybC9saWIvVGhyaWZ0L1NlcnZlclNvY2tldC5wbQorKysgYi9saWIvcGVybC9saWIvVGhyaWZ0L1NlcnZlclNvY2tldC5wbQpAQCAtMTcsMTggKzE3LDE5IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1yZXF1aXJlIDUuNi4wOwordXNlIDUuMTAuMDsKIHVzZSBzdHJpY3Q7CiB1c2Ugd2FybmluZ3M7CiAKIHVzZSBJTzo6U29ja2V0OjpJTkVUOwogdXNlIElPOjpTZWxlY3Q7CiB1c2UgVGhyaWZ0OwordXNlIFRocmlmdDo6VHJhbnNwb3J0OwogdXNlIFRocmlmdDo6U29ja2V0OwogCiBwYWNrYWdlIFRocmlmdDo6U2VydmVyU29ja2V0OwotCiB1c2UgYmFzZSBxdyggVGhyaWZ0OjpTZXJ2ZXJUcmFuc3BvcnQgKTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKIAogIwogIyBDb25zdHJ1Y3Rvci4KQEAgLTM3LDI4ICszOCwyNiBAQAogIyBAcGFyYW1baW5dICBob3N0ICAgaG9zdCBpbnRlcmZhY2UgdG8gbGlzdGVuIG9uICh1bmRlZiA9IGFsbCBpbnRlcmZhY2VzKQogIyBAcGFyYW1baW5dICBwb3J0ICAgcG9ydCBudW1iZXIgdG8gbGlzdGVuIG9uIChyZXF1aXJlZCkKICMgQHBhcmFtW2luXSAgcXVldWUgIHRoZSBsaXN0ZW4gcXVldWUgc2l6ZSAoZGVmYXVsdCBpZiBub3Qgc3BlY2lmaWVkIGlzIDEyOCkKLSMgQGV4YW1wbGUgICAgbXkgJHNlcnZlcnNvY2sgPSBuZXcgVGhyaWZ0OjpTZXJ2ZXJTb2NrZXQoaG9zdCA9PiB1bmRlZiwgcG9ydCA9PiBwb3J0KQorIyBAZXhhbXBsZSAgICBteSAkc2VydmVyc29jayA9IFRocmlmdDo6U2VydmVyU29ja2V0LT5uZXcoaG9zdCA9PiB1bmRlZiwgcG9ydCA9PiBwb3J0KQogIwogc3ViIG5ldwogewogICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKICAgICBteSAkYXJncyAgICAgID0gc2hpZnQ7CiAgICAgbXkgJHNlbGY7Ci0gICAgCisKICAgICAjIFN1cHBvcnQgYm90aCBvbGQtc3R5bGUgInBvcnQgbnVtYmVyIiBjb25zdHJ1Y3Rpb24gYW5kIG5ld2VyLi4uCiAgICAgaWYgKHJlZigkYXJncykgZXEgJ0hBU0gnKSB7CiAgICAgICAgICRzZWxmID0gJGFyZ3M7Ci0gICAgfSBlbHNlIHsKKyAgICB9CisgICAgZWxzZSB7CiAgICAgICAgICRzZWxmID0geyBwb3J0ID0+ICRhcmdzIH07CiAgICAgfQogCi0gICAgaWYgKG5vdCBkZWZpbmVkICRzZWxmLT57cG9ydH0pIHsKLSAgICAgICAgZGllKCJwb3J0IG51bWJlciBub3Qgc3BlY2lmaWVkIik7Ci0gICAgfQogICAgIGlmIChub3QgZGVmaW5lZCAkc2VsZi0+e3F1ZXVlfSkgewogICAgICAgICAkc2VsZi0+e3F1ZXVlfSA9IDEyODsKICAgICB9Ci0gICAgCisKICAgICByZXR1cm4gYmxlc3MoJHNlbGYsICRjbGFzc25hbWUpOwogfQogCkBAIC03Myw3ICs3Miw3IEBACiAgICAgICAgICAgICAkc2VsZi0+e2RlYnVnSGFuZGxlcn0tPigkZXJyb3IpOwogICAgICAgICB9CiAKLSAgICAgICAgZGllIG5ldyBUaHJpZnQ6OlRFeGNlcHRpb24oJGVycm9yKTsKKyAgICAgICAgZGllIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbi0+bmV3KCRlcnJvciwgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTik7CiAgICAgfTsKIAogICAgICRzZWxmLT57aGFuZGxlfSA9ICRzb2NrOwpAQCAtODMsMTUgKzgyLDI0IEBACiB7CiAgICAgbXkgJHNlbGYgPSBzaGlmdDsKIAotICAgIGlmICggZXhpc3RzICRzZWxmLT57aGFuZGxlfSBhbmQgZGVmaW5lZCAkc2VsZi0+e2hhbmRsZX0gKQotICAgIHsKKyAgICBpZiAoIGV4aXN0cyAkc2VsZi0+e2hhbmRsZX0gYW5kIGRlZmluZWQgJHNlbGYtPntoYW5kbGV9ICkgewogICAgICAgICBteSAkY2xpZW50ICAgICAgICA9ICRzZWxmLT57aGFuZGxlfS0+YWNjZXB0KCk7CiAgICAgICAgIG15ICRyZXN1bHQgICAgICAgID0gJHNlbGYtPl9fY2xpZW50KCk7Ci0gICAgICAgICRyZXN1bHQtPntoYW5kbGV9ID0gbmV3IElPOjpTZWxlY3QoJGNsaWVudCk7CisgICAgICAgICRyZXN1bHQtPntoYW5kbGV9ID0gSU86OlNlbGVjdC0+bmV3KCRjbGllbnQpOwogICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgICB9CiAKLSAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gdW5kZWY7Cit9CisKK3N1YiBjbG9zZQoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBpZiAoIGV4aXN0cyAkc2VsZi0+e2hhbmRsZX0gYW5kIGRlZmluZWQgJHNlbGYtPntoYW5kbGV9ICkKKyAgICB7CisgICAgICAgICRzZWxmLT57aGFuZGxlfS0+Y2xvc2UoKTsKKyAgICB9CiB9CiAKICMjIwpAQCAtMTAwLDcgKzEwOCw3IEBACiAKIHN1YiBfX2NsaWVudAogewotCXJldHVybiBuZXcgVGhyaWZ0OjpTb2NrZXQoKTsKKyAgcmV0dXJuIFRocmlmdDo6U29ja2V0LT5uZXcoKTsKIH0KIAogc3ViIF9fbGlzdGVuCmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L1NvY2tldC5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvU29ja2V0LnBtCmluZGV4IGVhZjhiOWUuLmJhMGRiNWUgMTAwNjQ0Ci0tLSBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvU29ja2V0LnBtCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvU29ja2V0LnBtCkBAIC0xNywzNyArMTcsNjMgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgNS42LjA7Cit1c2UgNS4xMC4wOwogdXNlIHN0cmljdDsKIHVzZSB3YXJuaW5nczsKIAogdXNlIFRocmlmdDsKK3VzZSBUaHJpZnQ6OkV4Y2VwdGlvbjsKIHVzZSBUaHJpZnQ6OlRyYW5zcG9ydDsKIAogdXNlIElPOjpTb2NrZXQ6OklORVQ7CiB1c2UgSU86OlNlbGVjdDsKIAogcGFja2FnZSBUaHJpZnQ6OlNvY2tldDsKLQogdXNlIGJhc2UgcXcoIFRocmlmdDo6VHJhbnNwb3J0ICk7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CisKKyMKKyMgQ29uc3RydWN0aW9uIGFuZCB1c2FnZQorIworIyBteSAkb3B0cyA9IHt9CisjIG15ICRzb2NrZXQgPSBUaHJpZnQ6OlNvY2tldC0+bmV3KFwlb3B0cyk7CisjCisjIG9wdGlvbnM6CisjCisjIGhvc3QgICAgICAgID0+IGhvc3QgdG8gY29ubmVjdCB0bworIyBwb3J0ICAgICAgICA9PiBwb3J0IHRvIGNvbm5lY3QgdG8KKyMgc2VuZFRpbWVvdXQgPT4gdGltZW91dCB1c2VkIGZvciBzZW5kIGFuZCBmb3IgY29ubmVjdAorIyByZWN2VGltZW91dCA9PiB0aW1lb3V0IHVzZWQgZm9yIHJlY3YKKyMKIAogc3ViIG5ldwogewotICAgIG15ICRjbGFzc25hbWUgICAgPSBzaGlmdDsKLSAgICBteSAkaG9zdCAgICAgICAgID0gc2hpZnQgfHwgImxvY2FsaG9zdCI7Ci0gICAgbXkgJHBvcnQgICAgICAgICA9IHNoaWZ0IHx8IDkwOTA7Ci0gICAgbXkgJGRlYnVnSGFuZGxlciA9IHNoaWZ0OworICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKKyAgICBteSAkb3B0cyAgICAgID0gc2hpZnQ7CiAKKyAgICAjIGRlZmF1bHQgc2V0dGluZ3M6CiAgICAgbXkgJHNlbGYgPSB7Ci0gICAgICAgIGhvc3QgICAgICAgICA9PiAkaG9zdCwKLSAgICAgICAgcG9ydCAgICAgICAgID0+ICRwb3J0LAotICAgICAgICBkZWJ1Z0hhbmRsZXIgPT4gJGRlYnVnSGFuZGxlciwKLSAgICAgICAgZGVidWcgICAgICAgID0+IDAsCi0gICAgICAgIHNlbmRUaW1lb3V0ICA9PiAxMDAwMCwKKyAgICAgICAgaG9zdCAgICAgICAgID0+ICdsb2NhbGhvc3QnLAorICAgICAgICBwb3J0ICAgICAgICAgPT4gOTA5MCwKICAgICAgICAgcmVjdlRpbWVvdXQgID0+IDEwMDAwLAotICAgICAgICBoYW5kbGUgICAgICAgPT4gdW5kZWYsCisgICAgICAgIHNlbmRUaW1lb3V0ICA9PiAxMDAwMCwKKworICAgICAgICBoYW5kbGUgICAgICAgPT4gdW5kZWYKICAgICB9OwogCisgICAgaWYgKGRlZmluZWQgJG9wdHMgYW5kIHJlZiAkb3B0cyBlcSByZWYge30pIHsKKworICAgICAgIyBhcmd1bWVudCBpcyBhIGhhc2ggb2Ygb3B0aW9ucyBzbyBvdmVycmlkZSB0aGUgZGVmYXVsdHMKKyAgICAgICRzZWxmLT57JF99ID0gJG9wdHMtPnskX30gZm9yIGtleXMgJSRvcHRzOworCisgICAgfSBlbHNlIHsKKworICAgICAgIyBvbGRlciBzdHlsZSBjb25zdHJ1Y3RvciB0YWtlcyAzIGFyZ3VtZW50cywgbm9uZSBvZiB3aGljaCBhcmUgcmVxdWlyZWQKKyAgICAgICRzZWxmLT57aG9zdH0gPSAkb3B0cyB8fCAnbG9jYWxob3N0JzsKKyAgICAgICRzZWxmLT57cG9ydH0gPSBzaGlmdCB8fCA5MDkwOworCisgICAgfQorCiAgICAgcmV0dXJuIGJsZXNzKCRzZWxmLCRjbGFzc25hbWUpOwogfQogCkBAIC03MCwxOSArOTYsNiBAQAogCiAKICMKLSNTZXRzIGRlYnVnZ2luZyBvdXRwdXQgb24gb3Igb2ZmCi0jCi0jIEBwYXJhbSBib29sICRkZWJ1ZwotIwotc3ViIHNldERlYnVnCi17Ci0gICAgbXkgJHNlbGYgID0gc2hpZnQ7Ci0gICAgbXkgJGRlYnVnID0gc2hpZnQ7Ci0KLSAgICAkc2VsZi0+e2RlYnVnfSA9ICRkZWJ1ZzsKLX0KLQotIwogIyBUZXN0cyB3aGV0aGVyIHRoaXMgaXMgb3BlbgogIwogIyBAcmV0dXJuIGJvb2wgdHJ1ZSBpZiB0aGUgc29ja2V0IGlzIG9wZW4KQEAgLTEwNywxNSArMTIwLDEwIEBACiAKICAgICBteSAkc29jayA9ICRzZWxmLT5fX29wZW4oKSB8fCBkbyB7CiAgICAgICAgIG15ICRlcnJvciA9IHJlZigkc2VsZikuJzogQ291bGQgbm90IGNvbm5lY3QgdG8gJy4kc2VsZi0+e2hvc3R9Lic6Jy4kc2VsZi0+e3BvcnR9LicgKCcuJCEuJyknOwotCi0gICAgICAgIGlmICgkc2VsZi0+e2RlYnVnfSkgewotICAgICAgICAgICAgJHNlbGYtPntkZWJ1Z0hhbmRsZXJ9LT4oJGVycm9yKTsKLSAgICAgICAgfQotCi0gICAgICAgIGRpZSBuZXcgVGhyaWZ0OjpURXhjZXB0aW9uKCRlcnJvcik7CisgICAgICAgIGRpZSBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb24tPm5ldygkZXJyb3IsIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pOwogICAgIH07CiAKLSAgICAkc2VsZi0+e2hhbmRsZX0gPSBuZXcgSU86OlNlbGVjdCggJHNvY2sgKTsKKyAgICAkc2VsZi0+e2hhbmRsZX0gPSBJTzo6U2VsZWN0LT5uZXcoICRzb2NrICk7CiB9CiAKICMKQEAgLTEyNSw3ICsxMzMsNyBAQAogewogICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICAgaWYoIGRlZmluZWQgJHNlbGYtPntoYW5kbGV9ICkgewotICAgIAkkc2VsZi0+X19jbG9zZSgpOworICAgICAgJHNlbGYtPl9fY2xvc2UoKTsKICAgICB9CiB9CiAKQEAgLTE1MSwxNSArMTU5LDE3IEBACiAKICAgICAgICAgaWYgKCFkZWZpbmVkICRidWYgfHwgJGJ1ZiBlcSAnJykgewogCi0gICAgICAgICAgICBkaWUgbmV3IFRocmlmdDo6VEV4Y2VwdGlvbihyZWYoJHNlbGYpLic6IENvdWxkIG5vdCByZWFkICcuJGxlbi4nIGJ5dGVzIGZyb20gJy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e2hvc3R9Lic6Jy4kc2VsZi0+e3BvcnR9KTsKKyAgICAgICAgICAgIGRpZSBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb24tPm5ldyhyZWYoJHNlbGYpLic6IENvdWxkIG5vdCByZWFkICcuJGxlbi4nIGJ5dGVzIGZyb20gJy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e2hvc3R9Lic6Jy4kc2VsZi0+e3BvcnR9LCBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb246OkVORF9PRl9GSUxFKTsKIAotICAgICAgICB9IGVsc2lmICgobXkgJHN6ID0gbGVuZ3RoKCRidWYpKSA8ICRsZW4pIHsKKyAgICAgICAgfQorICAgICAgICBlbHNpZiAoKG15ICRzeiA9IGxlbmd0aCgkYnVmKSkgPCAkbGVuKSB7CiAKICAgICAgICAgICAgICRwcmUgLj0gJGJ1ZjsKICAgICAgICAgICAgICRsZW4gLT0gJHN6OwogCi0gICAgICAgIH0gZWxzZSB7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICByZXR1cm4gJHByZS4kYnVmOwogICAgICAgICB9CiAgICAgfQpAQCAtMTgzLDggKzE5Myw4IEBACiAKICAgICBpZiAoIWRlZmluZWQgJGJ1ZiB8fCAkYnVmIGVxICcnKSB7CiAKLSAgICAgICAgZGllIG5ldyBURXhjZXB0aW9uKHJlZigkc2VsZikuJzogQ291bGQgbm90IHJlYWQgJy4kbGVuLicgYnl0ZXMgZnJvbSAnLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntob3N0fS4nOicuJHNlbGYtPntwb3J0fSk7CisgICAgICAgIGRpZSBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb24tPm5ldyhyZWYoJHNlbGYpLic6IENvdWxkIG5vdCByZWFkICcuJGxlbi4nIGJ5dGVzIGZyb20gJy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT57aG9zdH0uJzonLiRzZWxmLT57cG9ydH0sIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjo6RU5EX09GX0ZJTEUpOwogCiAgICAgfQogCkBAIC0yMDksMTYgKzIxOSwxNiBAQAogICAgICAgICBteSBAc29ja2V0cyA9ICRzZWxmLT57aGFuZGxlfS0+Y2FuX3dyaXRlKCAkc2VsZi0+e3NlbmRUaW1lb3V0fSAvIDEwMDAgKTsKIAogICAgICAgICBpZihAc29ja2V0cyA9PSAwKXsKLSAgICAgICAgICAgIGRpZSBuZXcgVGhyaWZ0OjpURXhjZXB0aW9uKHJlZigkc2VsZikuJzogdGltZWQgb3V0IHdyaXRpbmcgdG8gYnl0ZXMgZnJvbSAnLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntob3N0fS4nOicuJHNlbGYtPntwb3J0fSk7CisgICAgICAgICAgICBkaWUgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uLT5uZXcocmVmKCRzZWxmKS4nOiB0aW1lZCBvdXQgd3JpdGluZyB0byBieXRlcyBmcm9tICcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e2hvc3R9Lic6Jy4kc2VsZi0+e3BvcnR9LCBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCk7CiAgICAgICAgIH0KIAogICAgICAgICBteSAkc2VudCA9ICRzZWxmLT5fX3NlbmQoJHNvY2tldHNbMF0sICRidWYpOwogCiAgICAgICAgIGlmICghZGVmaW5lZCAkc2VudCB8fCAkc2VudCA9PSAwICkgewotICAgICAgICAgICAgCi0gICAgICAgICAgICBkaWUgbmV3IFRocmlmdDo6VEV4Y2VwdGlvbihyZWYoJHNlbGYpLic6IENvdWxkIG5vdCB3cml0ZSAnLmxlbmd0aCgkYnVmKS4nIGJ5dGVzICcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e2hvc3R9Lic6Jy4kc2VsZi0+e2hvc3R9KTsKKworICAgICAgICAgICAgZGllIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbi0+bmV3KHJlZigkc2VsZikuJzogQ291bGQgbm90IHdyaXRlICcubGVuZ3RoKCRidWYpLicgYnl0ZXMgJy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT57aG9zdH0uJzonLiRzZWxmLT57aG9zdH0sIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjo6RU5EX09GX0ZJTEUpOwogCiAgICAgICAgIH0KIApAQCAtMjU5LDcgKzI2OSw3IEBACiAjCiBzdWIgX19jbG9zZQogewotCW15ICRzZWxmID0gc2hpZnQ7CisgIG15ICRzZWxmID0gc2hpZnQ7CiAgICAgQ09SRTo6Y2xvc2UoKCRzZWxmLT57aGFuZGxlfS0+aGFuZGxlcygpKVswXSk7CiB9CiAKQEAgLTI3MiwxMiArMjgyLDEyIEBACiAjCiBzdWIgX19yZWN2CiB7Ci0JbXkgJHNlbGYgPSBzaGlmdDsKLQlteSAkc29jayA9IHNoaWZ0OwotCW15ICRsZW4gPSBzaGlmdDsKLQlteSAkYnVmID0gdW5kZWY7Ci0JJHNvY2stPnJlY3YoJGJ1ZiwgJGxlbik7Ci0JcmV0dXJuICRidWY7CisgIG15ICRzZWxmID0gc2hpZnQ7CisgIG15ICRzb2NrID0gc2hpZnQ7CisgIG15ICRsZW4gPSBzaGlmdDsKKyAgbXkgJGJ1ZiA9IHVuZGVmOworICAkc29jay0+cmVjdigkYnVmLCAkbGVuKTsKKyAgcmV0dXJuICRidWY7CiB9CiAKICMKQEAgLTMwNiw4ICszMTYsOCBAQAogICAgIG15IEBzb2NrZXRzID0gJHNlbGYtPntoYW5kbGV9LT5jYW5fcmVhZCggJHNlbGYtPntyZWN2VGltZW91dH0gLyAxMDAwICk7CiAKICAgICBpZiAoQHNvY2tldHMgPT0gMCkgewotICAgICAgICBkaWUgbmV3IFRocmlmdDo6VEV4Y2VwdGlvbihyZWYoJHNlbGYpLic6IHRpbWVkIG91dCByZWFkaW5nIGZyb20gJy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntob3N0fS4nOicuJHNlbGYtPntwb3J0fSk7CisgICAgICAgIGRpZSBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb24tPm5ldyhyZWYoJHNlbGYpLic6IHRpbWVkIG91dCByZWFkaW5nIGZyb20gJy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntob3N0fS4nOicuJHNlbGYtPntwb3J0fSwgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOjpUSU1FRF9PVVQpOwogICAgIH0KIAogICAgIHJldHVybiAkc29ja2V0c1swXTsKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvVHJhbnNwb3J0LnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC9UcmFuc3BvcnQucG0KaW5kZXggNWVjNmZlZS4uNDFiN2UxNSAxMDA2NDQKLS0tIGEvbGliL3BlcmwvbGliL1RocmlmdC9UcmFuc3BvcnQucG0KKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9UcmFuc3BvcnQucG0KQEAgLTE3LDE3ICsxNywxOSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotcmVxdWlyZSA1LjYuMDsKK3VzZSA1LjEwLjA7CiB1c2Ugc3RyaWN0OwogdXNlIHdhcm5pbmdzOwogCiB1c2UgVGhyaWZ0OwordXNlIFRocmlmdDo6RXhjZXB0aW9uOwogCiAjCiAjIFRyYW5zcG9ydCBleGNlcHRpb25zCiAjCi1wYWNrYWdlIFRUcmFuc3BvcnRFeGNlcHRpb247CitwYWNrYWdlIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKIHVzZSBiYXNlKCdUaHJpZnQ6OlRFeGNlcHRpb24nKTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKIAogdXNlIGNvbnN0YW50IFVOS05PV04gICAgICA9PiAwOwogdXNlIGNvbnN0YW50IE5PVF9PUEVOICAgICA9PiAxOwpAQCAtMzUsNyArMzcsNyBAQAogdXNlIGNvbnN0YW50IFRJTUVEX09VVCAgICA9PiAzOwogdXNlIGNvbnN0YW50IEVORF9PRl9GSUxFICA9PiA0OwogCi1zdWIgbmV3eworc3ViIG5ldyB7CiAgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OwogICAgIG15ICRzZWxmICAgICAgPSAkY2xhc3NuYW1lLT5TVVBFUjo6bmV3KEBfKTsKIApAQCAtNDMsNiArNDUsNyBAQAogfQogCiBwYWNrYWdlIFRocmlmdDo6VHJhbnNwb3J0OwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCiAjCiAjIFdoZXRoZXIgdGhpcyB0cmFuc3BvcnQgaXMgb3Blbi4KQEAgLTUxLDcgKzU0LDcgQEAKICMKIHN1YiBpc09wZW4KIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogIwpAQCAtNjEsNyArNjQsNyBAQAogIwogc3ViIG9wZW4KIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogIwpAQCAtNjksNyArNzIsNyBAQAogIwogc3ViIGNsb3NlCiB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKICMKQEAgLTgxLDggKzg0LDcgQEAKICMKIHN1YiByZWFkCiB7Ci0gICAgbXkgKCRsZW4pOwotICAgIGRpZSgiYWJzdHJhY3QiKTsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogIwpAQCAtMTE0LDggKzExNiw3IEBACiAjCiBzdWIgd3JpdGUKIHsKLSAgICBteSAoJGJ1Zik7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKICMKQEAgLTEzMCw2ICsxMzEsNyBAQAogIyBUcmFuc3BvcnRGYWN0b3J5IGNyZWF0ZXMgdHJhbnNwb3J0IG9iamVjdHMgZnJvbSB0cmFuc3BvcnRzCiAjCiBwYWNrYWdlIFRocmlmdDo6VHJhbnNwb3J0RmFjdG9yeTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKIAogc3ViIG5ldyB7CiAgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OwpAQCAtMTU2LDIwICsxNTgsMjEgQEAKICMgIFNlcnZlclRyYW5zcG9ydCBiYXNlIGNsYXNzIG1vZHVsZQogIwogcGFja2FnZSBUaHJpZnQ6OlNlcnZlclRyYW5zcG9ydDsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKIAogc3ViIGxpc3RlbgogewotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgYWNjZXB0CiB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiBjbG9zZQogewotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiAKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvVHlwZS5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvVHlwZS5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDhkYTNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9UeXBlLnBtCkBAIC0wLDAgKzEsNTAgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCit1c2UgNS4xMC4wOwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIFRocmlmdDsKKworIworIyBEYXRhIHR5cGVzIHRoYXQgY2FuIGJlIHNlbnQgdmlhIFRocmlmdAorIworcGFja2FnZSBUaHJpZnQ6OlRUeXBlOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOworCit1c2UgY29uc3RhbnQgU1RPUCAgID0+IDA7Cit1c2UgY29uc3RhbnQgVk9JRCAgID0+IDE7Cit1c2UgY29uc3RhbnQgQk9PTCAgID0+IDI7Cit1c2UgY29uc3RhbnQgQllURSAgID0+IDM7Cit1c2UgY29uc3RhbnQgSTA4ICAgID0+IDM7Cit1c2UgY29uc3RhbnQgRE9VQkxFID0+IDQ7Cit1c2UgY29uc3RhbnQgSTE2ICAgID0+IDY7Cit1c2UgY29uc3RhbnQgSTMyICAgID0+IDg7Cit1c2UgY29uc3RhbnQgSTY0ICAgID0+IDEwOwordXNlIGNvbnN0YW50IFNUUklORyA9PiAxMTsKK3VzZSBjb25zdGFudCBVVEY3ICAgPT4gMTE7Cit1c2UgY29uc3RhbnQgU1RSVUNUID0+IDEyOwordXNlIGNvbnN0YW50IE1BUCAgICA9PiAxMzsKK3VzZSBjb25zdGFudCBTRVQgICAgPT4gMTQ7Cit1c2UgY29uc3RhbnQgTElTVCAgID0+IDE1OwordXNlIGNvbnN0YW50IFVURjggICA9PiAxNjsKK3VzZSBjb25zdGFudCBVVEYxNiAgPT4gMTc7CisKKzE7CmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L1VuaXhTZXJ2ZXJTb2NrZXQucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0L1VuaXhTZXJ2ZXJTb2NrZXQucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc1ZTgwNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvVW5peFNlcnZlclNvY2tldC5wbQpAQCAtMCwwICsxLDg0IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKwordXNlIDUuMTAuMDsKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSBUaHJpZnQ7Cit1c2UgVGhyaWZ0OjpTZXJ2ZXJTb2NrZXQ7Cit1c2UgVGhyaWZ0OjpVbml4U29ja2V0OworCit1c2UgSU86OlNvY2tldDo6VU5JWDsKKworcGFja2FnZSBUaHJpZnQ6OlVuaXhTZXJ2ZXJTb2NrZXQ7Cit1c2UgYmFzZSBxdyggVGhyaWZ0OjpTZXJ2ZXJTb2NrZXQgKTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKKworIworIyBDb25zdHJ1Y3Rvci4KKyMgSWYgYSBzaW5nbGUgYXJndW1lbnQgaXMgZ2l2ZW4gdGhhdCBpcyBub3QgYSBoYXNoLCB0aGF0IGlzIHRoZSB1bml4IGRvbWFpbiBzb2NrZXQgcGF0aC4KKyMgSWYgYSBzaW5nbGUgYXJndW1lbnQgaXMgZ2l2ZW4gdGhhdCBpcyBhIGhhc2g6CisjIEBwYXJhbVtpbl0gIHBhdGggICB1bml4IGRvbWFpbiBzb2NrZXQgZmlsZSBuYW1lCisjIEBwYXJhbVtpbl0gIHF1ZXVlICB0aGUgbGlzdGVuIHF1ZXVlIHNpemUgKGRlZmF1bHQgaXMgbm90IHNwZWNpZmllZCBpcyBzdXBwbGllZCBieSBTZXJ2ZXJTb2NrZXQpCisjIEBleGFtcGxlICAgIG15ICRzZXJ2ZXJzb2NrID0gVGhyaWZ0OjpVbml4U2VydmVyU29ja2V0LT5uZXcoJHBhdGgpOworIyBAZXhhbXBsZSAgICBteSAkc2VydmVyc29jayA9IFRocmlmdDo6VW5peFNlcnZlclNvY2tldC0+bmV3KHBhdGggPT4gInNvbWVwYXRoIiwgcXVldWUgPT4gNjQpOworIworc3ViIG5ldworeworICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKKyAgICBteSAkYXJncyAgICAgID0gc2hpZnQ7CisgICAgbXkgJHNlbGY7CisKKyAgICBpZiAocmVmKCRhcmdzKSBlcSAnSEFTSCcpIHsKKyAgICAgICAgJHNlbGYgPSAkY2xhc3NuYW1lLT5TVVBFUjo6bmV3KCRhcmdzKTsKKyAgICB9IGVsc2UgeworICAgICAgICAkc2VsZiA9ICRjbGFzc25hbWUtPlNVUEVSOjpuZXcoKTsKKyAgICAgICAgJHNlbGYtPntwYXRofSA9ICRhcmdzOworICAgIH0KKworICAgIHJldHVybiBibGVzcygkc2VsZiwgJGNsYXNzbmFtZSk7Cit9CisKK3N1YiBfX2NsaWVudAoreworICByZXR1cm4gVGhyaWZ0OjpVbml4U29ja2V0LT5uZXcoKTsKK30KKworc3ViIF9fbGlzdGVuCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRzb2NrID0gSU86OlNvY2tldDo6VU5JWC0+bmV3KAorICAgICAgICBUeXBlICAgICAgPT4gSU86OlNvY2tldDo6U09DS19TVFJFQU0sCisgICAgICAgIExvY2FsICAgICA9PiAkc2VsZi0+e3BhdGh9LAorICAgICAgICBMaXN0ZW4gICAgPT4gJHNlbGYtPntxdWV1ZX0pCisgICAgfHwgZG8geworICAgICAgICBteSAkZXJyb3IgPSAnVW5peFNlcnZlclNvY2tldDogQ291bGQgbm90IGJpbmQgdG8gJyAuCisgICAgICAgICAgICAgICAgICAgICRzZWxmLT57cGF0aH0gLiAnICgnIC4gJCEgLiAnKSc7CisgICAgICAgIGlmICgkc2VsZi0+e2RlYnVnfSkgeworICAgICAgICAgICAgJHNlbGYtPntkZWJ1Z0hhbmRsZXJ9LT4oJGVycm9yKTsKKyAgICAgICAgfQorICAgICAgICBkaWUgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uLT5uZXcoJGVycm9yLCBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKTsKKyAgICB9OworCisgICAgcmV0dXJuICRzb2NrOworfQorCisxOwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9Vbml4U29ja2V0LnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC9Vbml4U29ja2V0LnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMzg2ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGVybC9saWIvVGhyaWZ0L1VuaXhTb2NrZXQucG0KQEAgLTAsMCArMSw2NyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3VzZSA1LjEwLjA7Cit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgVGhyaWZ0OwordXNlIFRocmlmdDo6U29ja2V0OworCit1c2UgSU86OlNvY2tldDo6VU5JWDsKKworcGFja2FnZSBUaHJpZnQ6OlVuaXhTb2NrZXQ7Cit1c2UgYmFzZSBxdyggVGhyaWZ0OjpTb2NrZXQgKTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKKworIworIyBDb25zdHJ1Y3Rvci4KKyMgVGFrZXMgYSB1bml4IGRvbWFpbiBzb2NrZXQgZmlsZW5hbWUuCisjIFNlZSBUaHJpZnQ6OlNvY2tldCBmb3IgYmFzZSBjbGFzcyBwYXJhbWV0ZXJzLgorIyBAcGFyYW1baW5dICBwYXRoICAgcGF0aCB0byB1bml4IHNvY2tldCBmaWxlCisjIEBleGFtcGxlICAgIG15ICRzb2NrID0gVGhyaWZ0OjpVbml4U29ja2V0LT5uZXcoJHBhdGgpOworIworc3ViIG5ldworeworICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKKyAgICBteSAkc2VsZiAgICAgID0gJGNsYXNzbmFtZS0+U1VQRVI6Om5ldygpOworICAgICRzZWxmLT57cGF0aH0gPSBzaGlmdDsKKyAgICByZXR1cm4gYmxlc3MoJHNlbGYsICRjbGFzc25hbWUpOworfQorCitzdWIgX19vcGVuCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRzb2NrID0gSU86OlNvY2tldDo6VU5JWC0+bmV3KAorICAgICAgICBUeXBlICAgICAgPT4gSU86OlNvY2tldDo6U09DS19TVFJFQU0sCisgICAgICAgIFBlZXIgICAgICA9PiAkc2VsZi0+e3BhdGh9KQorICAgIHx8IGRvIHsKKyAgICAgICAgbXkgJGVycm9yID0gJ1VuaXhTb2NrZXQ6IENvdWxkIG5vdCBjb25uZWN0IHRvICcgLgorICAgICAgICAgICAgJHNlbGYtPntwYXRofSAuICcgKCcgLiAkISAuICcpJzsKKyAgICAgICAgaWYgKCRzZWxmLT57ZGVidWd9KSB7CisgICAgICAgICAgICAkc2VsZi0+e2RlYnVnSGFuZGxlcn0tPigkZXJyb3IpOworICAgICAgICB9CisgICAgICAgIGRpZSBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb24tPm5ldygkZXJyb3IsIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pOworICAgIH07CisKKyAgICByZXR1cm4gJHNvY2s7Cit9CisKKzE7CmRpZmYgLS1naXQgYS9saWIvcGVybC90ZXN0L01ha2VmaWxlLmFtIGIvbGliL3BlcmwvdGVzdC9NYWtlZmlsZS5hbQppbmRleCAyYzljZTJhLi5kZTAzOTcxIDEwMDY0NAotLS0gYS9saWIvcGVybC90ZXN0L01ha2VmaWxlLmFtCisrKyBiL2xpYi9wZXJsL3Rlc3QvTWFrZWZpbGUuYW0KQEAgLTE3LDI2ICsxNyw0IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1USFJJRlQgPSBAdG9wX2J1aWxkZGlyQC9jb21waWxlci9jcHAvdGhyaWZ0Ci1USFJJRlRfSUYgPSBAdG9wX3NyY2RpckAvdGVzdC9UaHJpZnRUZXN0LnRocmlmdAotTkFNRV9CRU5DSE1BUktTRVJWSUNFID0gIEB0b3Bfc3JjZGlyQC9saWIvcmIvYmVuY2htYXJrL0JlbmNobWFyay50aHJpZnQKLU5BTUVfQUdHUiA9IEB0b3Bfc3JjZGlyQC9jb250cmliL2FzeW5jLXRlc3QvYWdnci50aHJpZnQKLQotY2hlY2stbG9jYWw6IFwKLQlnZW4tcGVybC9UaHJpZnRUZXN0L1R5cGVzLnBtIFwKLQlnZW4tcGVybC9CZW5jaG1hcmtUZXN0L0JlbmNobWFya1NlcnZpY2UucG0gXAotCWdlbi1wZXJsL0FnZ3IvQWdnci5wbQotCi1nZW4tcGVybC9UaHJpZnRUZXN0L1R5cGVzLnBtOiAkKFRIUklGVF9JRikKLQkkKFRIUklGVCkgLS1nZW4gcGVybCAkKFRIUklGVF9JRikKLQotY2xlYW4tbG9jYWw6Ci0Jcm0gLXJmIGdlbi1wZXJsCi0JCi1nZW4tcGVybC9CZW5jaG1hcmtUZXN0L0JlbmNobWFya1NlcnZpY2UucG06ICQoTkFNRV9CRU5DSE1BUktTRVJWSUNFKQotCSQoVEhSSUZUKSAtLWdlbiBwZXJsICQoTkFNRV9CRU5DSE1BUktTRVJWSUNFKQotCQotZ2VuLXBlcmwvQWdnci9BZ2dyLnBtOiAkKE5BTUVfQUdHUikKLQkkKFRIUklGVCkgLS1nZW4gcGVybCAkKE5BTUVfQUdHUikKLQogRVhUUkFfRElTVCA9IG1lbW9yeV9idWZmZXIudCBwcm9jZXNzb3IudCBtdWx0aXBsZXgudApkaWZmIC0tZ2l0IGEvbGliL3BlcmwvdGVzdC9tdWx0aXBsZXgudCBiL2xpYi9wZXJsL3Rlc3QvbXVsdGlwbGV4LnQKaW5kZXggNzZmMjcwNi4uOTBhOWI0ZCAxMDA2NDQKLS0tIGEvbGliL3BlcmwvdGVzdC9tdWx0aXBsZXgudAorKysgYi9saWIvcGVybC90ZXN0L211bHRpcGxleC50CkBAIC0yMiwxNSArMjIsMTMgQEAKIHVzZSBzdHJpY3Q7CiB1c2Ugd2FybmluZ3M7CiAKLXVzZSBUaHJpZnQ7Ci11c2UgVGhyaWZ0OjpTb2NrZXQ7Ci11c2UgVGhyaWZ0OjpTZXJ2ZXI7Ci11c2UgVGhyaWZ0OjpNdWx0aXBsZXhlZFByb2Nlc3NvcjsKIHVzZSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sOwotdXNlIFRocmlmdDo6TWVtb3J5QnVmZmVyOwogdXNlIFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0OwogdXNlIFRocmlmdDo6TWVtb3J5QnVmZmVyOwotCit1c2UgVGhyaWZ0OjpNZXNzYWdlVHlwZTsKK3VzZSBUaHJpZnQ6Ok11bHRpcGxleGVkUHJvY2Vzc29yOwordXNlIFRocmlmdDo6U2VydmVyOwordXNlIFRocmlmdDo6U29ja2V0OwogCiB1c2UgQmVuY2htYXJrU2VydmljZTsKIHVzZSBBZ2dyOwpAQCAtMTAzLDcgKzEwMSw3IEBACiAKICAgICAkYWdncl9wcm90b2NvbC0+cmVhZE1lc3NhZ2VCZWdpbihcJGZ1bmN0aW9uX25hbWUsIFwkbWVzc2FnZV90eXBlLCBcJHNlcXVlbmNlX2lkKTsKIAotICAgIGlmICgkbWVzc2FnZV90eXBlID09IFRNZXNzYWdlVHlwZTo6RVhDRVBUSU9OKSB7CisgICAgaWYgKCRtZXNzYWdlX3R5cGUgPT0gVGhyaWZ0OjpUTWVzc2FnZVR5cGU6OkVYQ0VQVElPTikgewogICAgICAgIGRpZTsKICAgICB9CiAgICAgCkBAIC0xMTYsNyArMTE0LDcgQEAKIAogJGFnZ3JfcHJvdG9jb2wtPnJlYWRNZXNzYWdlQmVnaW4oXCRmdW5jdGlvbl9uYW1lLCBcJG1lc3NhZ2VfdHlwZSwgXCRzZXF1ZW5jZV9pZCk7CiAKLWlmICgkbWVzc2FnZV90eXBlID09IFRNZXNzYWdlVHlwZTo6RVhDRVBUSU9OKSB7CitpZiAoJG1lc3NhZ2VfdHlwZSA9PSBUaHJpZnQ6OlRNZXNzYWdlVHlwZTo6RVhDRVBUSU9OKSB7CiAgICAgZGllOwogfQogICAgIApAQCAtMTMyLDcgKzEzMCw3IEBACiAKICAgICAkYmVuY2htYXJrX3Byb3RvY29sLT5yZWFkTWVzc2FnZUJlZ2luKFwkZnVuY3Rpb25fbmFtZSwgXCRtZXNzYWdlX3R5cGUsIFwkc2VxdWVuY2VfaWQpOwogCi0gICAgaWYgKCRtZXNzYWdlX3R5cGUgPT0gVE1lc3NhZ2VUeXBlOjpFWENFUFRJT04pIHsKKyAgICBpZiAoJG1lc3NhZ2VfdHlwZSA9PSBUaHJpZnQ6OlRNZXNzYWdlVHlwZTo6RVhDRVBUSU9OKSB7CiAgICAgICAgIGRpZTsKICAgICB9CiAgICAgbXkgJGJlbmNobWFya19yZXN1bHQgPSBCZW5jaG1hcmtTZXJ2aWNlX2ZpYm9uYWNjaV9yZXN1bHQtPm5ldygpOwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvdGVzdC9wcm9jZXNzb3IudCBiL2xpYi9wZXJsL3Rlc3QvcHJvY2Vzc29yLnQKaW5kZXggMWQ4YmU3My4uZjgzMzAzNSAxMDA2NDQKLS0tIGEvbGliL3BlcmwvdGVzdC9wcm9jZXNzb3IudAorKysgYi9saWIvcGVybC90ZXN0L3Byb2Nlc3Nvci50CkBAIC0yMiw5ICsyMiw5IEBACiB1c2Ugc3RyaWN0OwogdXNlIHdhcm5pbmdzOwogCi11c2UgVGhyaWZ0OwogdXNlIFRocmlmdDo6QmluYXJ5UHJvdG9jb2w7CiB1c2UgVGhyaWZ0OjpNZW1vcnlCdWZmZXI7Cit1c2UgVGhyaWZ0OjpNZXNzYWdlVHlwZTsKIAogdXNlIFRocmlmdFRlc3Q6OlRocmlmdFRlc3Q7CiB1c2UgVGhyaWZ0VGVzdDo6VHlwZXM7CkBAIC03Miw3ICs3Miw3IEBACiAgICAgJHByb3RvY29sLT5yZWFkTWVzc2FnZUJlZ2luKFwkZnVuY3Rpb25fbmFtZSwgXCRtZXNzYWdlX3R5cGUsIFwkc2VxdWVuY2VfaWQpOwogICAgIHByaW50ICIgICRmdW5jdGlvbl9uYW1lLCAkbWVzc2FnZV90eXBlLCAkc2VxdWVuY2VfaWRcbiI7CiAKLSAgICBpZiAoJG1lc3NhZ2VfdHlwZSA9PSBUTWVzc2FnZVR5cGU6OkVYQ0VQVElPTikgeworICAgIGlmICgkbWVzc2FnZV90eXBlID09IFRocmlmdDo6VE1lc3NhZ2VUeXBlOjpFWENFUFRJT04pIHsKICAgICAgICAgZGllOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbGliL3BlcmwvdG9vbHMvRml4dXBEaXN0LnBsIGIvbGliL3BlcmwvdG9vbHMvRml4dXBEaXN0LnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0YTJiMjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGVybC90b29scy9GaXh1cERpc3QucGwKQEAgLTAsMCArMSwzNSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMKKyMgVGhpcyB3aWxsIGZpeCB1cCB0aGUgZGlzdHJpYnV0aW9uIHNvIHRoYXQgQ1BBTiBwcm9wZXJseQorIyBpbmRleGVzIFRocmlmdC4KKyMKKwordXNlIDUuMTAuMDsKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7Cit1c2UgdXRmODsKKwordXNlIERhdGE6OkR1bXBlcjsKK3VzZSBDUEFOOjpNZXRhOworCitteSAkbWV0YSA9IENQQU46Ok1ldGEtPmxvYWRfZmlsZSgnTUVUQS5qc29uJyk7CiskbWV0YS0+eydwcm92aWRlcyd9ID0geyAnVGhyaWZ0JyA9PiB7ICdmaWxlJyA9PiAnbGliL1RocmlmdC5wbScsICd2ZXJzaW9uJyA9PiAkbWV0YS0+dmVyc2lvbigpIH0gfTsKKyRtZXRhLT5zYXZlKCdNRVRBLmpzb24nKTsKZGlmZiAtLWdpdCBhL2xpYi9waHAvTWFrZWZpbGUuYW0gYi9saWIvcGhwL01ha2VmaWxlLmFtCmluZGV4IGZiZjcwZjkuLjhkOTA1MGEgMTAwNzU1Ci0tLSBhL2xpYi9waHAvTWFrZWZpbGUuYW0KKysrIGIvbGliL3BocC9NYWtlZmlsZS5hbQpAQCAtMzcsODYgKzM3LDEwMSBAQAogCiBlbmRpZgogCi1waHBkaXIgPSAkKFBIUF9QUkVGSVgpL1RocmlmdAorcGhwZGlyID0gJChQSFBfUFJFRklYKS8KK3BocF9EQVRBID0gXAorICBsaWIvVE11bHRpcGxleGVkUHJvY2Vzc29yLnBocAogCiBwaHBiYXNlZGlyID0gJChwaHBkaXIpL0Jhc2UKIHBocGJhc2VfREFUQSA9IFwKLSAgbGliL1RocmlmdC9CYXNlL1RCYXNlLnBocAorICBsaWIvQmFzZS9UQmFzZS5waHAKIAogcGhwY2xhc3Nsb2FkZXJkaXIgPSAkKHBocGRpcikvQ2xhc3NMb2FkZXIKIHBocGNsYXNzbG9hZGVyX0RBVEEgPSBcCi0gIGxpYi9UaHJpZnQvQ2xhc3NMb2FkZXIvVGhyaWZ0Q2xhc3NMb2FkZXIucGhwCisgIGxpYi9DbGFzc0xvYWRlci9UaHJpZnRDbGFzc0xvYWRlci5waHAKIAogcGhwZXhjZXB0aW9uZGlyID0gJChwaHBkaXIpL0V4Y2VwdGlvbgogcGhwZXhjZXB0aW9uX0RBVEEgPSBcCi0gIGxpYi9UaHJpZnQvRXhjZXB0aW9uL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5waHAgXAotICBsaWIvVGhyaWZ0L0V4Y2VwdGlvbi9URXhjZXB0aW9uLnBocCBcCi0gIGxpYi9UaHJpZnQvRXhjZXB0aW9uL1RQcm90b2NvbEV4Y2VwdGlvbi5waHAgXAotICBsaWIvVGhyaWZ0L0V4Y2VwdGlvbi9UVHJhbnNwb3J0RXhjZXB0aW9uLnBocAorICBsaWIvRXhjZXB0aW9uL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5waHAgXAorICBsaWIvRXhjZXB0aW9uL1RFeGNlcHRpb24ucGhwIFwKKyAgbGliL0V4Y2VwdGlvbi9UUHJvdG9jb2xFeGNlcHRpb24ucGhwIFwKKyAgbGliL0V4Y2VwdGlvbi9UVHJhbnNwb3J0RXhjZXB0aW9uLnBocAogCiBwaHBmYWN0b3J5ZGlyID0gJChwaHBkaXIpL0ZhY3RvcnkKIHBocGZhY3RvcnlfREFUQSA9IFwKLSAgbGliL1RocmlmdC9GYWN0b3J5L1RCaW5hcnlQcm90b2NvbEZhY3RvcnkucGhwIFwKLSAgbGliL1RocmlmdC9GYWN0b3J5L1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5LnBocCBcCi0gIGxpYi9UaHJpZnQvRmFjdG9yeS9USlNPTlByb3RvY29sRmFjdG9yeS5waHAgXAotICBsaWIvVGhyaWZ0L0ZhY3RvcnkvVFByb3RvY29sRmFjdG9yeS5waHAgXAotICBsaWIvVGhyaWZ0L0ZhY3RvcnkvVFN0cmluZ0Z1bmNGYWN0b3J5LnBocCBcCi0gIGxpYi9UaHJpZnQvRmFjdG9yeS9UVHJhbnNwb3J0RmFjdG9yeS5waHAKKyAgbGliL0ZhY3RvcnkvVEJpbmFyeVByb3RvY29sRmFjdG9yeS5waHAgXAorICBsaWIvRmFjdG9yeS9UQ29tcGFjdFByb3RvY29sRmFjdG9yeS5waHAgXAorICBsaWIvRmFjdG9yeS9USlNPTlByb3RvY29sRmFjdG9yeS5waHAgXAorICBsaWIvRmFjdG9yeS9UUHJvdG9jb2xGYWN0b3J5LnBocCBcCisgIGxpYi9GYWN0b3J5L1RTdHJpbmdGdW5jRmFjdG9yeS5waHAgXAorICBsaWIvRmFjdG9yeS9UVHJhbnNwb3J0RmFjdG9yeS5waHAKIAogcGhwcHJvdG9jb2xkaXIgPSAkKHBocGRpcikvUHJvdG9jb2wKIHBocHByb3RvY29sX0RBVEEgPSBcCi0gIGxpYi9UaHJpZnQvUHJvdG9jb2wvVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQucGhwIFwKLSAgbGliL1RocmlmdC9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wucGhwIFwKLSAgbGliL1RocmlmdC9Qcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLnBocCBcCi0gIGxpYi9UaHJpZnQvUHJvdG9jb2wvVEpTT05Qcm90b2NvbC5waHAgXAotICBsaWIvVGhyaWZ0L1Byb3RvY29sL1RQcm90b2NvbC5waHAKKyAgbGliL1Byb3RvY29sL1RCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkLnBocCBcCisgIGxpYi9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wucGhwIFwKKyAgbGliL1Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wucGhwIFwKKyAgbGliL1Byb3RvY29sL1RKU09OUHJvdG9jb2wucGhwIFwKKyAgbGliL1Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLnBocCBcCisgIGxpYi9Qcm90b2NvbC9UUHJvdG9jb2wucGhwIFwKKyAgbGliL1Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5waHAgXAorICBsaWIvUHJvdG9jb2wvVFNpbXBsZUpTT05Qcm90b2NvbC5waHAKIAogcGhwcHJvdG9jb2xqc29uZGlyID0gJChwaHBwcm90b2NvbGRpcikvSlNPTgogcGhwcHJvdG9jb2xqc29uX0RBVEEgPSBcCi0gIGxpYi9UaHJpZnQvUHJvdG9jb2wvSlNPTi9CYXNlQ29udGV4dC5waHAgXAotICBsaWIvVGhyaWZ0L1Byb3RvY29sL0pTT04vTGlzdENvbnRleHQucGhwIFwKLSAgbGliL1RocmlmdC9Qcm90b2NvbC9KU09OL0xvb2thaGVhZFJlYWRlci5waHAgXAotICBsaWIvVGhyaWZ0L1Byb3RvY29sL0pTT04vUGFpckNvbnRleHQucGhwCisgIGxpYi9Qcm90b2NvbC9KU09OL0Jhc2VDb250ZXh0LnBocCBcCisgIGxpYi9Qcm90b2NvbC9KU09OL0xpc3RDb250ZXh0LnBocCBcCisgIGxpYi9Qcm90b2NvbC9KU09OL0xvb2thaGVhZFJlYWRlci5waHAgXAorICBsaWIvUHJvdG9jb2wvSlNPTi9QYWlyQ29udGV4dC5waHAKKworcGhwcHJvdG9jb2xzaW1wbGVqc29uZGlyID0gJChwaHBwcm90b2NvbGRpcikvU2ltcGxlSlNPTgorcGhwcHJvdG9jb2xzaW1wbGVqc29uX0RBVEEgPSBcCisgIGxpYi9Qcm90b2NvbC9TaW1wbGVKU09OL0NvbGxlY3Rpb25NYXBLZXlFeGNlcHRpb24ucGhwIFwKKyAgbGliL1Byb3RvY29sL1NpbXBsZUpTT04vQ29udGV4dC5waHAgXAorICBsaWIvUHJvdG9jb2wvU2ltcGxlSlNPTi9MaXN0Q29udGV4dC5waHAgXAorICBsaWIvUHJvdG9jb2wvU2ltcGxlSlNPTi9NYXBDb250ZXh0LnBocCBcCisgIGxpYi9Qcm90b2NvbC9TaW1wbGVKU09OL1N0cnVjdENvbnRleHQucGhwCiAKIHBocHNlcmlhbGl6ZXJkaXIgPSAkKHBocGRpcikvU2VyaWFsaXplcgogcGhwc2VyaWFsaXplcl9EQVRBID0gXAotICBsaWIvVGhyaWZ0L1NlcmlhbGl6ZXIvVEJpbmFyeVNlcmlhbGl6ZXIucGhwCisgIGxpYi9TZXJpYWxpemVyL1RCaW5hcnlTZXJpYWxpemVyLnBocAogCiBwaHBzZXJ2ZXJkaXIgPSAkKHBocGRpcikvU2VydmVyCiBwaHBzZXJ2ZXJfREFUQSA9IFwKLSAgbGliL1RocmlmdC9TZXJ2ZXIvVFNlcnZlclNvY2tldC5waHAgXAotICBsaWIvVGhyaWZ0L1NlcnZlci9URm9ya2luZ1NlcnZlci5waHAgXAotICBsaWIvVGhyaWZ0L1NlcnZlci9UU2VydmVyLnBocCBcCi0gIGxpYi9UaHJpZnQvU2VydmVyL1RTZXJ2ZXJUcmFuc3BvcnQucGhwIFwKLSAgbGliL1RocmlmdC9TZXJ2ZXIvVFNpbXBsZVNlcnZlci5waHAKKyAgbGliL1NlcnZlci9UU2VydmVyU29ja2V0LnBocCBcCisgIGxpYi9TZXJ2ZXIvVEZvcmtpbmdTZXJ2ZXIucGhwIFwKKyAgbGliL1NlcnZlci9UU2VydmVyLnBocCBcCisgIGxpYi9TZXJ2ZXIvVFNlcnZlclRyYW5zcG9ydC5waHAgXAorICBsaWIvU2VydmVyL1RTaW1wbGVTZXJ2ZXIucGhwCiAKIHBocHN0cmluZ2Z1bmNkaXIgPSAkKHBocGRpcikvU3RyaW5nRnVuYwogcGhwc3RyaW5nZnVuY19EQVRBID0gXAotICBsaWIvVGhyaWZ0L1N0cmluZ0Z1bmMvTWJzdHJpbmcucGhwIFwKLSAgbGliL1RocmlmdC9TdHJpbmdGdW5jL0NvcmUucGhwIFwKLSAgbGliL1RocmlmdC9TdHJpbmdGdW5jL1RTdHJpbmdGdW5jLnBocAorICBsaWIvU3RyaW5nRnVuYy9NYnN0cmluZy5waHAgXAorICBsaWIvU3RyaW5nRnVuYy9Db3JlLnBocCBcCisgIGxpYi9TdHJpbmdGdW5jL1RTdHJpbmdGdW5jLnBocAogCiBwaHB0cmFuc3BvcnRkaXIgPSAkKHBocGRpcikvVHJhbnNwb3J0CiBwaHB0cmFuc3BvcnRfREFUQSA9IFwKLSAgbGliL1RocmlmdC9UcmFuc3BvcnQvVEJ1ZmZlcmVkVHJhbnNwb3J0LnBocCBcCi0gIGxpYi9UaHJpZnQvVHJhbnNwb3J0L1RDdXJsQ2xpZW50LnBocCBcCi0gIGxpYi9UaHJpZnQvVHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQucGhwIFwKLSAgbGliL1RocmlmdC9UcmFuc3BvcnQvVEh0dHBDbGllbnQucGhwIFwKLSAgbGliL1RocmlmdC9UcmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5waHAgXAotICBsaWIvVGhyaWZ0L1RyYW5zcG9ydC9UTnVsbFRyYW5zcG9ydC5waHAgXAotICBsaWIvVGhyaWZ0L1RyYW5zcG9ydC9UUGhwU3RyZWFtLnBocCBcCi0gIGxpYi9UaHJpZnQvVHJhbnNwb3J0L1RTb2NrZXQucGhwIFwKLSAgbGliL1RocmlmdC9UcmFuc3BvcnQvVFNvY2tldFBvb2wucGhwIFwKLSAgbGliL1RocmlmdC9UcmFuc3BvcnQvVFRyYW5zcG9ydC5waHAKKyAgbGliL1RyYW5zcG9ydC9UQnVmZmVyZWRUcmFuc3BvcnQucGhwIFwKKyAgbGliL1RyYW5zcG9ydC9UQ3VybENsaWVudC5waHAgXAorICBsaWIvVHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQucGhwIFwKKyAgbGliL1RyYW5zcG9ydC9USHR0cENsaWVudC5waHAgXAorICBsaWIvVHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIucGhwIFwKKyAgbGliL1RyYW5zcG9ydC9UTnVsbFRyYW5zcG9ydC5waHAgXAorICBsaWIvVHJhbnNwb3J0L1RQaHBTdHJlYW0ucGhwIFwKKyAgbGliL1RyYW5zcG9ydC9UU29ja2V0LnBocCBcCisgIGxpYi9UcmFuc3BvcnQvVFNvY2tldFBvb2wucGhwIFwKKyAgbGliL1RyYW5zcG9ydC9UVHJhbnNwb3J0LnBocAogCiBwaHB0eXBlZGlyID0gJChwaHBkaXIpL1R5cGUKIHBocHR5cGVfREFUQSA9IFwKLSAgbGliL1RocmlmdC9UeXBlL1RNZXNzYWdlVHlwZS5waHAgXAotICBsaWIvVGhyaWZ0L1R5cGUvVFR5cGUucGhwCisgIGxpYi9UeXBlL1RNZXNzYWdlVHlwZS5waHAgXAorICBsaWIvVHlwZS9UVHlwZS5waHAgXAorICBsaWIvVHlwZS9UQ29uc3RhbnQucGhwCiAKIEVYVFJBX0RJU1QgPSBcCiAgIGxpYiBcCiAgIHNyYy9hdXRvbG9hZC5waHAgXAorICBzcmMvZXh0L3RocmlmdF9wcm90b2NvbC9jb25maWcubTQgXAogICBzcmMvZXh0L3RocmlmdF9wcm90b2NvbC9jb25maWcudzMyIFwKICAgc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvcGhwX3RocmlmdF9wcm90b2NvbC5jcHAgXAogICBzcmMvZXh0L3RocmlmdF9wcm90b2NvbC9waHBfdGhyaWZ0X3Byb3RvY29sLmggXApkaWZmIC0tZ2l0IGEvbGliL3BocC9SRUFETUUubWQgYi9saWIvcGhwL1JFQURNRS5tZAppbmRleCBjMjRlZTJjLi43MTcwMTA0IDEwMDY0NAotLS0gYS9saWIvcGhwL1JFQURNRS5tZAorKysgYi9saWIvcGhwL1JFQURNRS5tZApAQCAtMSw3ICsxLDYgQEAKIFRocmlmdCBQSFAgU29mdHdhcmUgTGlicmFyeQogCi1MaWNlbnNlCi09PT09PT09CisjIExpY2Vuc2UKIAogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKQEAgLTIwLDggKzE5LDcgQEAKIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKIHVuZGVyIHRoZSBMaWNlbnNlLgogCi1Vc2luZyBUaHJpZnQgd2l0aCBQSFAKLT09PT09PT09PT09PT09PT09PT09PQorIyBVc2luZyBUaHJpZnQgd2l0aCBQSFAKIAogVGhyaWZ0IHJlcXVpcmVzIFBIUCA1LiBUaHJpZnQgbWFrZXMgYXMgZmV3IGFzc3VtcHRpb25zIGFib3V0IHlvdXIgUEhQCiBlbnZpcm9ubWVudCBhcyBwb3NzaWJsZSB3aGlsZSB0cnlpbmcgdG8gbWFrZSBzb21lIG1vcmUgYWR2YW5jZWQgUEhQCkBAIC0yOSwyNSArMjcsMzQgQEAKIAogVG8gdXNlIFRocmlmdCBpbiB5b3VyIFBIUCBjb2RlYmFzZSwgdGFrZSB0aGUgZm9sbG93aW5nIHN0ZXBzOgogCi0jMSkgQ29weSBhbGwgb2YgdGhyaWZ0L2xpYi9waHAvbGliIGludG8geW91ciBQSFAgY29kZWJhc2UKLSMyKSBDb25maWd1cmUgU3ltZm9ueSBBdXRvbG9hZGVyIChvciB3aGF0ZXZlciB5b3UgdXN1YWxseSB1c2UpCisxLiBDb3B5IGFsbCBvZiB0aHJpZnQvbGliL3BocC9saWIgaW50byB5b3VyIFBIUCBjb2RlYmFzZQorMi4gQ29uZmlndXJlIFN5bWZvbnkgQXV0b2xvYWRlciAob3Igd2hhdGV2ZXIgeW91IHVzdWFsbHkgdXNlKQogCiBBZnRlciB0aGF0LCB5b3UgaGF2ZSB0byBtYW51YWxseSBpbmNsdWRlIHRoZSBUaHJpZnQgcGFja2FnZQogY3JlYXRlZCBieSB0aGUgY29tcGlsZXI6CiAKK2BgYAogcmVxdWlyZV9vbmNlICdwYWNrYWdlcy9TZXJ2aWNlL1NlcnZpY2UucGhwJzsKIHJlcXVpcmVfb25jZSAncGFja2FnZXMvU2VydmljZS9UeXBlcy5waHAnOworYGBgCiAKLURlcGVuZGVuY2llcwotPT09PT09PT09PT09CisjIERlcGVuZGVuY2llcwogCiBQSFBfSU5UX1NJWkUKIAotICBUaGlzIGJ1aWx0LWluIHNpZ25hbHMgd2hldGhlciB5b3VyIGFyY2hpdGVjdHVyZSBpcyAzMiBvciA2NCBiaXQgYW5kIGlzCi0gIHVzZWQgYnkgdGhlIFRCaW5hcnlQcm90b2NvbCB0byBwcm9wZXJseSB1c2UgcGFjaygpIGFuZCB1bnBhY2soKSB0bwotICBzZXJpYWxpemUgZGF0YS4KKyAgICBUaGlzIGJ1aWx0LWluIHNpZ25hbHMgd2hldGhlciB5b3VyIGFyY2hpdGVjdHVyZSBpcyAzMiBvciA2NCBiaXQgYW5kIGlzCisgICAgdXNlZCBieSB0aGUgVEJpbmFyeVByb3RvY29sIHRvIHByb3Blcmx5IHVzZSBwYWNrKCkgYW5kIHVucGFjaygpIHRvCisgICAgc2VyaWFsaXplIGRhdGEuCiAKIGFwY19mZXRjaCgpLCBhcGNfc3RvcmUoKQogCi0gIEFQQyBjYWNoZSBpcyB1c2VkIGJ5IHRoZSBUU29ja2V0UG9vbCBjbGFzcy4gSWYgeW91IGRvIG5vdCBoYXZlIEFQQyBpbnN0YWxsZWQsCi0gIFRocmlmdCB3aWxsIGZpbGwgaW4gbnVsbCBzdHViIGZ1bmN0aW9uIGRlZmluaXRpb25zLgorICAgIEFQQyBjYWNoZSBpcyB1c2VkIGJ5IHRoZSBUU29ja2V0UG9vbCBjbGFzcy4gSWYgeW91IGRvIG5vdCBoYXZlIEFQQyBpbnN0YWxsZWQsCisgICAgVGhyaWZ0IHdpbGwgZmlsbCBpbiBudWxsIHN0dWIgZnVuY3Rpb24gZGVmaW5pdGlvbnMuCisKKyMgQnJlYWtpbmcgQ2hhbmdlcworCisjIyAwLjEyLjAKKworMS4gW1BTUi00XShodHRwczovL3d3dy5waHAtZmlnLm9yZy9wc3IvcHNyLTQvKSBsb2FkZXIgaXMgbm93IHRoZSBkZWZhdWx0LiBJZiB5b3Ugd2FudCB0byB1c2UgY2xhc3MgbWFwcyBpbnN0ZWFkLCB1c2UgYC1nZW4gcGhwOmNsYXNzbWFwYC4KKworMi4gSWYgdXNpbmcgUFNSLTQsIHVzZSBgJHRocmlmdENsYXNzTG9hZGVyLT5yZWdpc3Rlck5hbWVzcGFjZSgnbmFtZXNwYWNlJywgJzxwYXRoPicpYCBpbnN0ZWFkIG9mIGAkdGhyaWZ0Q2xhc3NMb2FkZXItPnJlZ2lzdGVyRGVmaW5pdGlvbignbmFtZXNwYWNlJywgJzxwYXRoPicpYC4KZGlmZiAtLWdpdCBhL2xpYi9waHAvY29kaW5nX3N0YW5kYXJkcy5tZCBiL2xpYi9waHAvY29kaW5nX3N0YW5kYXJkcy5tZAppbmRleCBmYTAzOTBiLi5lMjE3NTM5IDEwMDY0NAotLS0gYS9saWIvcGhwL2NvZGluZ19zdGFuZGFyZHMubWQKKysrIGIvbGliL3BocC9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0xICsxLDUgQEAKLVBsZWFzZSBmb2xsb3cgW0dlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKQorIyMgUEhQIENvZGluZyBTdGFuZGFyZHMKKworUGxlYXNlIGZvbGxvdzoKKyAqIFtUaHJpZnQgR2VuZXJhbCBDb2RpbmcgU3RhbmRhcmRzXSgvZG9jL2NvZGluZ19zdGFuZGFyZHMubWQpCisgKiBbUFNSLTJdKGh0dHA6Ly93d3cucGhwLWZpZy5vcmcvcHNyL3Bzci0yLykKZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL0Jhc2UvVEJhc2UucGhwIGIvbGliL3BocC9saWIvQmFzZS9UQmFzZS5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYxYjYzMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL0Jhc2UvVEJhc2UucGhwCkBAIC0wLDAgKzEsMzgyIEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XEJhc2U7CisKK3VzZSBUaHJpZnRcVHlwZVxUVHlwZTsKKworLyoqCisgKiBCYXNlIGNsYXNzIGZyb20gd2hpY2ggb3RoZXIgVGhyaWZ0IHN0cnVjdHMgZXh0ZW5kLiBUaGlzIGlzIHNvIHRoYXQgd2UgY2FuCisgKiBjdXQgYmFjayBvbiB0aGUgc2l6ZSBvZiB0aGUgZ2VuZXJhdGVkIGNvZGUgd2hpY2ggaXMgdHVybmluZyBvdXQgdG8gaGF2ZSBhCisgKiBub250cml2aWFsIGNvc3QganVzdCB0byBsb2FkIHRoYW5rcyB0byB0aGUgd29uZHJvdXNseSBhYnlzbWFsIGltcGxlbWVudGF0aW9uCisgKiBvZiBQSFAuIE5vdGUgdGhhdCBjb2RlIGlzIGludGVudGlvbmFsbHkgZHVwbGljYXRlZCBpbiBoZXJlIHRvIGF2b2lkIG1ha2luZworICogZnVuY3Rpb24gY2FsbHMgZm9yIGV2ZXJ5IGZpZWxkIG9yIG1lbWJlciBvZiBhIGNvbnRhaW5lci4uCisgKi8KK2Fic3RyYWN0IGNsYXNzIFRCYXNlCit7CisgICAgcHVibGljIHN0YXRpYyAkdG1ldGhvZCA9IGFycmF5KAorICAgICAgICBUVHlwZTo6Qk9PTCA9PiAnQm9vbCcsCisgICAgICAgIFRUeXBlOjpCWVRFID0+ICdCeXRlJywKKyAgICAgICAgVFR5cGU6OkkxNiA9PiAnSTE2JywKKyAgICAgICAgVFR5cGU6OkkzMiA9PiAnSTMyJywKKyAgICAgICAgVFR5cGU6Okk2NCA9PiAnSTY0JywKKyAgICAgICAgVFR5cGU6OkRPVUJMRSA9PiAnRG91YmxlJywKKyAgICAgICAgVFR5cGU6OlNUUklORyA9PiAnU3RyaW5nJworICAgICk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkaW5wdXQpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCRvdXRwdXQpOworCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRzcGVjID0gbnVsbCwgJHZhbHMgPSBudWxsKQorICAgIHsKKyAgICAgICAgaWYgKGlzX2FycmF5KCRzcGVjKSAmJiBpc19hcnJheSgkdmFscykpIHsKKyAgICAgICAgICAgIGZvcmVhY2ggKCRzcGVjIGFzICRmaWQgPT4gJGZzcGVjKSB7CisgICAgICAgICAgICAgICAgJHZhciA9ICRmc3BlY1sndmFyJ107CisgICAgICAgICAgICAgICAgaWYgKGlzc2V0KCR2YWxzWyR2YXJdKSkgeworICAgICAgICAgICAgICAgICAgICAkdGhpcy0+JHZhciA9ICR2YWxzWyR2YXJdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBfX3dha2V1cCgpCisgICAgeworICAgICAgICAkdGhpcy0+X19jb25zdHJ1Y3QoZ2V0X29iamVjdF92YXJzKCR0aGlzKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZE1hcCgmJHZhciwgJHNwZWMsICRpbnB1dCkKKyAgICB7CisgICAgICAgICR4ZmVyID0gMDsKKyAgICAgICAgJGt0eXBlID0gJHNwZWNbJ2t0eXBlJ107CisgICAgICAgICR2dHlwZSA9ICRzcGVjWyd2dHlwZSddOworICAgICAgICAka3JlYWQgPSAkdnJlYWQgPSBudWxsOworICAgICAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyRrdHlwZV0pKSB7CisgICAgICAgICAgICAka3JlYWQgPSAncmVhZCcgLiBUQmFzZTo6JHRtZXRob2RbJGt0eXBlXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRrc3BlYyA9ICRzcGVjWydrZXknXTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyR2dHlwZV0pKSB7CisgICAgICAgICAgICAkdnJlYWQgPSAncmVhZCcgLiBUQmFzZTo6JHRtZXRob2RbJHZ0eXBlXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR2c3BlYyA9ICRzcGVjWyd2YWwnXTsKKyAgICAgICAgfQorICAgICAgICAkdmFyID0gYXJyYXkoKTsKKyAgICAgICAgJF9rdHlwZSA9ICRfdnR5cGUgPSAkc2l6ZSA9IDA7CisgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZE1hcEJlZ2luKCRfa3R5cGUsICRfdnR5cGUsICRzaXplKTsKKyAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJHNpemU7ICsrJGkpIHsKKyAgICAgICAgICAgICRrZXkgPSAkdmFsID0gbnVsbDsKKyAgICAgICAgICAgIGlmICgka3JlYWQgIT09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPiRrcmVhZCgka2V5KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3dpdGNoICgka3R5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJGNsYXNzID0gJGtzcGVjWydjbGFzcyddOworICAgICAgICAgICAgICAgICAgICAgICAgJGtleSA9IG5ldyAkY2xhc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICRrZXktPnJlYWQoJGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpNQVA6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRNYXAoJGtleSwgJGtzcGVjLCAkaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZExpc3QoJGtleSwgJGtzcGVjLCAkaW5wdXQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCRrZXksICRrc3BlYywgJGlucHV0LCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgkdnJlYWQgIT09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPiR2cmVhZCgkdmFsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3dpdGNoICgkdnR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJGNsYXNzID0gJHZzcGVjWydjbGFzcyddOworICAgICAgICAgICAgICAgICAgICAgICAgJHZhbCA9IG5ldyAkY2xhc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR2YWwtPnJlYWQoJGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpNQVA6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRNYXAoJHZhbCwgJHZzcGVjLCAkaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZExpc3QoJHZhbCwgJHZzcGVjLCAkaW5wdXQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCR2YWwsICR2c3BlYywgJGlucHV0LCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICR2YXJbJGtleV0gPSAkdmFsOworICAgICAgICB9CisgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZE1hcEVuZCgpOworCisgICAgICAgIHJldHVybiAkeGZlcjsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIF9yZWFkTGlzdCgmJHZhciwgJHNwZWMsICRpbnB1dCwgJHNldCA9IGZhbHNlKQorICAgIHsKKyAgICAgICAgJHhmZXIgPSAwOworICAgICAgICAkZXR5cGUgPSAkc3BlY1snZXR5cGUnXTsKKyAgICAgICAgJGVyZWFkID0gJHZyZWFkID0gbnVsbDsKKyAgICAgICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFskZXR5cGVdKSkgeworICAgICAgICAgICAgJGVyZWFkID0gJ3JlYWQnIC4gVEJhc2U6OiR0bWV0aG9kWyRldHlwZV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkZXNwZWMgPSAkc3BlY1snZWxlbSddOworICAgICAgICB9CisgICAgICAgICR2YXIgPSBhcnJheSgpOworICAgICAgICAkX2V0eXBlID0gJHNpemUgPSAwOworICAgICAgICBpZiAoJHNldCkgeworICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkU2V0QmVnaW4oJF9ldHlwZSwgJHNpemUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkTGlzdEJlZ2luKCRfZXR5cGUsICRzaXplKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkc2l6ZTsgKyskaSkgeworICAgICAgICAgICAgJGVsZW0gPSBudWxsOworICAgICAgICAgICAgaWYgKCRlcmVhZCAhPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+JGVyZWFkKCRlbGVtKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgJGVzcGVjID0gJHNwZWNbJ2VsZW0nXTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCRldHlwZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAkY2xhc3MgPSAkZXNwZWNbJ2NsYXNzJ107CisgICAgICAgICAgICAgICAgICAgICAgICAkZWxlbSA9IG5ldyAkY2xhc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICRlbGVtLT5yZWFkKCRpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTWFwKCRlbGVtLCAkZXNwZWMsICRpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTGlzdCgkZWxlbSwgJGVzcGVjLCAkaW5wdXQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCRlbGVtLCAkZXNwZWMsICRpbnB1dCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoJHNldCkgeworICAgICAgICAgICAgICAgICR2YXJbJGVsZW1dID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgJHZhciBbXSA9ICRlbGVtOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgkc2V0KSB7CisgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRTZXRFbmQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZExpc3RFbmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkeGZlcjsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gX3JlYWQoJGNsYXNzLCAkc3BlYywgJGlucHV0KQorICAgIHsKKyAgICAgICAgJHhmZXIgPSAwOworICAgICAgICAkZm5hbWUgPSBudWxsOworICAgICAgICAkZnR5cGUgPSAwOworICAgICAgICAkZmlkID0gMDsKKyAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RydWN0QmVnaW4oJGZuYW1lKTsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZEZpZWxkQmVnaW4oJGZuYW1lLCAkZnR5cGUsICRmaWQpOworICAgICAgICAgICAgaWYgKCRmdHlwZSA9PSBUVHlwZTo6U1RPUCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGlzc2V0KCRzcGVjWyRmaWRdKSkgeworICAgICAgICAgICAgICAgICRmc3BlYyA9ICRzcGVjWyRmaWRdOworICAgICAgICAgICAgICAgICR2YXIgPSAkZnNwZWNbJ3ZhciddOworICAgICAgICAgICAgICAgIGlmICgkZnR5cGUgPT0gJGZzcGVjWyd0eXBlJ10pIHsKKyAgICAgICAgICAgICAgICAgICAgJHhmZXIgPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyRmdHlwZV0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAkZnVuYyA9ICdyZWFkJyAuIFRCYXNlOjokdG1ldGhvZFskZnR5cGVdOworICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT4kZnVuYygkdGhpcy0+JHZhcik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKCRmdHlwZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNsYXNzID0gJGZzcGVjWydjbGFzcyddOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+JHZhciA9IG5ldyAkY2xhc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPiR2YXItPnJlYWQoJGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRNYXAoJHRoaXMtPiR2YXIsICRmc3BlYywgJGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCR0aGlzLT4kdmFyLCAkZnNwZWMsICRpbnB1dCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZExpc3QoJHRoaXMtPiR2YXIsICRmc3BlYywgJGlucHV0LCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnNraXAoJGZ0eXBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkRmllbGRFbmQoKTsKKyAgICAgICAgfQorICAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRTdHJ1Y3RFbmQoKTsKKworICAgICAgICByZXR1cm4gJHhmZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVNYXAoJHZhciwgJHNwZWMsICRvdXRwdXQpCisgICAgeworICAgICAgICAkeGZlciA9IDA7CisgICAgICAgICRrdHlwZSA9ICRzcGVjWydrdHlwZSddOworICAgICAgICAkdnR5cGUgPSAkc3BlY1sndnR5cGUnXTsKKyAgICAgICAgJGt3cml0ZSA9ICR2d3JpdGUgPSBudWxsOworICAgICAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyRrdHlwZV0pKSB7CisgICAgICAgICAgICAka3dyaXRlID0gJ3dyaXRlJyAuIFRCYXNlOjokdG1ldGhvZFska3R5cGVdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJGtzcGVjID0gJHNwZWNbJ2tleSddOworICAgICAgICB9CisgICAgICAgIGlmIChpc3NldChUQmFzZTo6JHRtZXRob2RbJHZ0eXBlXSkpIHsKKyAgICAgICAgICAgICR2d3JpdGUgPSAnd3JpdGUnIC4gVEJhc2U6OiR0bWV0aG9kWyR2dHlwZV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkdnNwZWMgPSAkc3BlY1sndmFsJ107CisgICAgICAgIH0KKyAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVNYXBCZWdpbigka3R5cGUsICR2dHlwZSwgY291bnQoJHZhcikpOworICAgICAgICBmb3JlYWNoICgkdmFyIGFzICRrZXkgPT4gJHZhbCkgeworICAgICAgICAgICAgaWYgKGlzc2V0KCRrd3JpdGUpKSB7CisgICAgICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+JGt3cml0ZSgka2V5KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3dpdGNoICgka3R5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGtleS0+d3JpdGUoJG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZU1hcCgka2V5LCAka3NwZWMsICRvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCRrZXksICRrc3BlYywgJG91dHB1dCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCRrZXksICRrc3BlYywgJG91dHB1dCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaXNzZXQoJHZ3cml0ZSkpIHsKKyAgICAgICAgICAgICAgICAkeGZlciArPSAkb3V0cHV0LT4kdndyaXRlKCR2YWwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCR2dHlwZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdmFsLT53cml0ZSgkb3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpNQVA6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTWFwKCR2YWwsICR2c3BlYywgJG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJHZhbCwgJHZzcGVjLCAkb3V0cHV0LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJHZhbCwgJHZzcGVjLCAkb3V0cHV0LCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZU1hcEVuZCgpOworCisgICAgICAgIHJldHVybiAkeGZlcjsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIF93cml0ZUxpc3QoJHZhciwgJHNwZWMsICRvdXRwdXQsICRzZXQgPSBmYWxzZSkKKyAgICB7CisgICAgICAgICR4ZmVyID0gMDsKKyAgICAgICAgJGV0eXBlID0gJHNwZWNbJ2V0eXBlJ107CisgICAgICAgICRld3JpdGUgPSBudWxsOworICAgICAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyRldHlwZV0pKSB7CisgICAgICAgICAgICAkZXdyaXRlID0gJ3dyaXRlJyAuIFRCYXNlOjokdG1ldGhvZFskZXR5cGVdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJGVzcGVjID0gJHNwZWNbJ2VsZW0nXTsKKyAgICAgICAgfQorICAgICAgICBpZiAoJHNldCkgeworICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTZXRCZWdpbigkZXR5cGUsIGNvdW50KCR2YXIpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlTGlzdEJlZ2luKCRldHlwZSwgY291bnQoJHZhcikpOworICAgICAgICB9CisgICAgICAgIGZvcmVhY2ggKCR2YXIgYXMgJGtleSA9PiAkdmFsKSB7CisgICAgICAgICAgICAkZWxlbSA9ICRzZXQgPyAka2V5IDogJHZhbDsKKyAgICAgICAgICAgIGlmIChpc3NldCgkZXdyaXRlKSkgeworICAgICAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPiRld3JpdGUoJGVsZW0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCRldHlwZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkZWxlbS0+d3JpdGUoJG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZU1hcCgkZWxlbSwgJGVzcGVjLCAkb3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgkZWxlbSwgJGVzcGVjLCAkb3V0cHV0LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJGVsZW0sICRlc3BlYywgJG91dHB1dCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCRzZXQpIHsKKyAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU2V0RW5kKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUxpc3RFbmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkeGZlcjsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gX3dyaXRlKCRjbGFzcywgJHNwZWMsICRvdXRwdXQpCisgICAgeworICAgICAgICAkeGZlciA9IDA7CisgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0QmVnaW4oJGNsYXNzKTsKKyAgICAgICAgZm9yZWFjaCAoJHNwZWMgYXMgJGZpZCA9PiAkZnNwZWMpIHsKKyAgICAgICAgICAgICR2YXIgPSAkZnNwZWNbJ3ZhciddOworICAgICAgICAgICAgaWYgKCR0aGlzLT4kdmFyICE9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgJGZ0eXBlID0gJGZzcGVjWyd0eXBlJ107CisgICAgICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEJlZ2luKCR2YXIsICRmdHlwZSwgJGZpZCk7CisgICAgICAgICAgICAgICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFskZnR5cGVdKSkgeworICAgICAgICAgICAgICAgICAgICAkZnVuYyA9ICd3cml0ZScgLiBUQmFzZTo6JHRtZXRob2RbJGZ0eXBlXTsKKyAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+JGZ1bmMoJHRoaXMtPiR2YXIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoJGZ0eXBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPiR2YXItPndyaXRlKCRvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVNYXAoJHRoaXMtPiR2YXIsICRmc3BlYywgJG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJHRoaXMtPiR2YXIsICRmc3BlYywgJG91dHB1dCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCR0aGlzLT4kdmFyLCAkZnNwZWMsICRvdXRwdXQsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRFbmQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkU3RvcCgpOworICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEVuZCgpOworCisgICAgICAgIHJldHVybiAkeGZlcjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9DbGFzc0xvYWRlci9UaHJpZnRDbGFzc0xvYWRlci5waHAgYi9saWIvcGhwL2xpYi9DbGFzc0xvYWRlci9UaHJpZnRDbGFzc0xvYWRlci5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM2MWJkOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL0NsYXNzTG9hZGVyL1RocmlmdENsYXNzTG9hZGVyLnBocApAQCAtMCwwICsxLDIwNiBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ2xhc3NMb2FkZXIgdG8gbG9hZCBUaHJpZnQgbGlicmFyeSBhbmQgZGVmaW5pdGlvbnMKKyAqIEluc3BpcmVkIGZyb20gVW5pdmVyc2FsQ2xhc3NMb2FkZXIgZnJvbSBTeW1mb255IDIKKyAqCisgKiBAcGFja2FnZSB0aHJpZnQuY2xhc3Nsb2FkZXIKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XENsYXNzTG9hZGVyOworCitjbGFzcyBUaHJpZnRDbGFzc0xvYWRlcgoreworICAgIC8qKgorICAgICAqIE5hbWVzcGFjZXMgcGF0aAorICAgICAqIEB2YXIgYXJyYXkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJG5hbWVzcGFjZXMgPSBhcnJheSgpOworCisgICAgLyoqCisgICAgICogVGhyaWZ0IGRlZmluaXRpb24gcGF0aHMKKyAgICAgKiBAdmFyIHR5cGUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJGRlZmluaXRpb25zID0gYXJyYXkoKTsKKworICAgIC8qKgorICAgICAqIERvIHdlIHVzZSBBUEMgY2FjaGUgPworICAgICAqIEB2YXIgYm9vbGVhbgorICAgICAqLworICAgIHByb3RlY3RlZCAkYXBjID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBBUEMgQ2FjaGUgcHJlZml4CisgICAgICogQHZhciBzdHJpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJGFwY19wcmVmaXg7CisKKyAgICAvKioKKyAgICAgKiBTZXQgYXV0b2xvYWRlciB0byB1c2UgQVBDIGNhY2hlCisgICAgICogQHBhcmFtIGJvb2xlYW4gJGFwYworICAgICAqIEBwYXJhbSBzdHJpbmcgJGFwY19wcmVmaXgKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGFwYyA9IGZhbHNlLCAkYXBjX3ByZWZpeCA9IG51bGwpCisgICAgeworICAgICAgICAkdGhpcy0+YXBjID0gJGFwYzsKKyAgICAgICAgJHRoaXMtPmFwY19wcmVmaXggPSAkYXBjX3ByZWZpeDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlcnMgYSBuYW1lc3BhY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lc3BhY2UgVGhlIG5hbWVzcGFjZQorICAgICAqIEBwYXJhbSBhcnJheXxzdHJpbmcgJHBhdGhzIFRoZSBsb2NhdGlvbihzKSBvZiB0aGUgbmFtZXNwYWNlCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlZ2lzdGVyTmFtZXNwYWNlKCRuYW1lc3BhY2UsICRwYXRocykKKyAgICB7CisgICAgICAgICR0aGlzLT5uYW1lc3BhY2VzWyRuYW1lc3BhY2VdID0gKGFycmF5KSRwYXRoczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlcnMgYSBUaHJpZnQgZGVmaW5pdGlvbiBuYW1lc3BhY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lc3BhY2UgVGhlIGRlZmluaXRpb24gbmFtZXNwYWNlCisgICAgICogQHBhcmFtIGFycmF5fHN0cmluZyAkcGF0aHMgVGhlIGxvY2F0aW9uKHMpIG9mIHRoZSBkZWZpbml0aW9uIG5hbWVzcGFjZQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWdpc3RlckRlZmluaXRpb24oJG5hbWVzcGFjZSwgJHBhdGhzKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmRlZmluaXRpb25zWyRuYW1lc3BhY2VdID0gKGFycmF5KSRwYXRoczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlcnMgdGhpcyBpbnN0YW5jZSBhcyBhbiBhdXRvbG9hZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIEJvb2xlYW4gJHByZXBlbmQgV2hldGhlciB0byBwcmVwZW5kIHRoZSBhdXRvbG9hZGVyIG9yIG5vdAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWdpc3RlcigkcHJlcGVuZCA9IGZhbHNlKQorICAgIHsKKyAgICAgICAgc3BsX2F1dG9sb2FkX3JlZ2lzdGVyKGFycmF5KCR0aGlzLCAnbG9hZENsYXNzJyksIHRydWUsICRwcmVwZW5kKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkcyB0aGUgZ2l2ZW4gY2xhc3MsIGRlZmluaXRpb24gb3IgaW50ZXJmYWNlLgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkY2xhc3MgVGhlIG5hbWUgb2YgdGhlIGNsYXNzCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGxvYWRDbGFzcygkY2xhc3MpCisgICAgeworICAgICAgICBpZiAoKHRydWUgPT09ICR0aGlzLT5hcGMgJiYgKCRmaWxlID0gJHRoaXMtPmZpbmRGaWxlSW5BcGMoJGNsYXNzKSkpIG9yCisgICAgICAgICAgICAoJGZpbGUgPSAkdGhpcy0+ZmluZEZpbGUoJGNsYXNzKSkKKyAgICAgICAgKSB7CisgICAgICAgICAgICByZXF1aXJlX29uY2UgJGZpbGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkcyB0aGUgZ2l2ZW4gY2xhc3Mgb3IgaW50ZXJmYWNlIGluIEFQQy4KKyAgICAgKiBAcGFyYW0gIHN0cmluZyAkY2xhc3MgVGhlIG5hbWUgb2YgdGhlIGNsYXNzCisgICAgICogQHJldHVybiBzdHJpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZmluZEZpbGVJbkFwYygkY2xhc3MpCisgICAgeworICAgICAgICBpZiAoZmFsc2UgPT09ICRmaWxlID0gYXBjX2ZldGNoKCR0aGlzLT5hcGNfcHJlZml4IC4gJGNsYXNzKSkgeworICAgICAgICAgICAgYXBjX3N0b3JlKCR0aGlzLT5hcGNfcHJlZml4IC4gJGNsYXNzLCAkZmlsZSA9ICR0aGlzLT5maW5kRmlsZSgkY2xhc3MpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkZmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kIGNsYXNzIGluIG5hbWVzcGFjZXMgb3IgZGVmaW5pdGlvbnMgZGlyZWN0b3JpZXMKKyAgICAgKiBAcGFyYW0gIHN0cmluZyAkY2xhc3MKKyAgICAgKiBAcmV0dXJuIHN0cmluZworICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBmaW5kRmlsZSgkY2xhc3MpCisgICAgeworICAgICAgICAvLyBSZW1vdmUgZmlyc3QgYmFja3NsYXNoCisgICAgICAgIGlmICgnXFwnID09ICRjbGFzc1swXSkgeworICAgICAgICAgICAgJGNsYXNzID0gc3Vic3RyKCRjbGFzcywgMSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZmFsc2UgIT09ICRwb3MgPSBzdHJycG9zKCRjbGFzcywgJ1xcJykpIHsKKyAgICAgICAgICAgIC8vIE5hbWVzcGFjZWQgY2xhc3MgbmFtZQorICAgICAgICAgICAgJG5hbWVzcGFjZSA9IHN1YnN0cigkY2xhc3MsIDAsICRwb3MpOworCisgICAgICAgICAgICAvLyBJdGVyYXRlIGluIG5vcm1hbCBuYW1lc3BhY2VzCisgICAgICAgICAgICBmb3JlYWNoICgkdGhpcy0+bmFtZXNwYWNlcyBhcyAkbnMgPT4gJGRpcnMpIHsKKyAgICAgICAgICAgICAgICAvL0Rvbid0IGludGVyZmVyZSB3aXRoIG90aGVyIGF1dG9sb2FkZXJzCisgICAgICAgICAgICAgICAgaWYgKDAgIT09IHN0cnBvcygkbmFtZXNwYWNlLCAkbnMpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRkaXJzIGFzICRkaXIpIHsKKyAgICAgICAgICAgICAgICAgICAgJGNsYXNzTmFtZSA9IHN1YnN0cigkY2xhc3MsICRwb3MgKyAxKTsKKworICAgICAgICAgICAgICAgICAgICAkZmlsZSA9ICRkaXIgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9yZXBsYWNlKCdcXCcsIERJUkVDVE9SWV9TRVBBUkFUT1IsICRuYW1lc3BhY2UpIC4KKyAgICAgICAgICAgICAgICAgICAgICAgIERJUkVDVE9SWV9TRVBBUkFUT1IgLgorICAgICAgICAgICAgICAgICAgICAgICAgJGNsYXNzTmFtZSAuICcucGhwJzsKKworICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZV9leGlzdHMoJGZpbGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJGZpbGU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEl0ZXJhdGUgaW4gVGhyaWZ0IG5hbWVzcGFjZXMKKworICAgICAgICAgICAgLy8gUmVtb3ZlIGZpcnN0IHBhcnQgb2YgbmFtZXNwYWNlCisgICAgICAgICAgICAkbSA9IGV4cGxvZGUoJ1xcJywgJGNsYXNzKTsKKworICAgICAgICAgICAgLy8gSWdub3JlIHdyb25nIGNhbGwKKyAgICAgICAgICAgIGlmIChjb3VudCgkbSkgPD0gMSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgJGNsYXNzID0gYXJyYXlfcG9wKCRtKTsKKyAgICAgICAgICAgICRuYW1lc3BhY2UgPSBpbXBsb2RlKCdcXCcsICRtKTsKKworICAgICAgICAgICAgZm9yZWFjaCAoJHRoaXMtPmRlZmluaXRpb25zIGFzICRucyA9PiAkZGlycykgeworICAgICAgICAgICAgICAgIC8vRG9uJ3QgaW50ZXJmZXJlIHdpdGggb3RoZXIgYXV0b2xvYWRlcnMKKyAgICAgICAgICAgICAgICBpZiAoMCAhPT0gc3RycG9zKCRuYW1lc3BhY2UsICRucykpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yZWFjaCAoJGRpcnMgYXMgJGRpcikgeworICAgICAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgICAgICogQXZhaWxhYmxlIGluIHNlcnZpY2U6IEludGVyZmFjZSwgQ2xpZW50LCBQcm9jZXNzb3IsIFJlc3QKKyAgICAgICAgICAgICAgICAgICAgICogQW5kIGV2ZXJ5IHNlcnZpY2UgbWV0aG9kcyAoXy4rKQorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKDAgPT09IHByZWdfbWF0Y2goJyMoLispKGlmfGNsaWVudHxwcm9jZXNzb3J8cmVzdCkkI2knLCAkY2xhc3MsICRuKSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgIDAgPT09IHByZWdfbWF0Y2goJyMoLispX1thLXowLTldK18oYXJnc3xyZXN1bHQpJCNpJywgJGNsYXNzLCAkbikKKyAgICAgICAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAkY2xhc3NOYW1lID0gJ1R5cGVzJzsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICRjbGFzc05hbWUgPSAkblsxXTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICRmaWxlID0gJGRpciAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLgorICAgICAgICAgICAgICAgICAgICAgICAgc3RyX3JlcGxhY2UoJ1xcJywgRElSRUNUT1JZX1NFUEFSQVRPUiwgJG5hbWVzcGFjZSkgLgorICAgICAgICAgICAgICAgICAgICAgICAgRElSRUNUT1JZX1NFUEFSQVRPUiAuCisgICAgICAgICAgICAgICAgICAgICAgICAkY2xhc3NOYW1lIC4gJy5waHAnOworCisgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlX2V4aXN0cygkZmlsZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkZmlsZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL0V4Y2VwdGlvbi9UQXBwbGljYXRpb25FeGNlcHRpb24ucGhwIGIvbGliL3BocC9saWIvRXhjZXB0aW9uL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJiNmE2YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL0V4Y2VwdGlvbi9UQXBwbGljYXRpb25FeGNlcHRpb24ucGhwCkBAIC0wLDAgKzEsNzYgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcRXhjZXB0aW9uOworCit1c2UgVGhyaWZ0XFR5cGVcVFR5cGU7CisKK2NsYXNzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIFRFeGNlcHRpb24KK3sKKyAgICBwdWJsaWMgc3RhdGljICRfVFNQRUMgPQorICAgICAgICBhcnJheSgxID0+IGFycmF5KCd2YXInID0+ICdtZXNzYWdlJywKKyAgICAgICAgICAgICd0eXBlJyA9PiBUVHlwZTo6U1RSSU5HKSwKKyAgICAgICAgICAgIDIgPT4gYXJyYXkoJ3ZhcicgPT4gJ2NvZGUnLAorICAgICAgICAgICAgICAgICd0eXBlJyA9PiBUVHlwZTo6STMyKSk7CisKKyAgICBjb25zdCBVTktOT1dOID0gMDsKKyAgICBjb25zdCBVTktOT1dOX01FVEhPRCA9IDE7CisgICAgY29uc3QgSU5WQUxJRF9NRVNTQUdFX1RZUEUgPSAyOworICAgIGNvbnN0IFdST05HX01FVEhPRF9OQU1FID0gMzsKKyAgICBjb25zdCBCQURfU0VRVUVOQ0VfSUQgPSA0OworICAgIGNvbnN0IE1JU1NJTkdfUkVTVUxUID0gNTsKKyAgICBjb25zdCBJTlRFUk5BTF9FUlJPUiA9IDY7CisgICAgY29uc3QgUFJPVE9DT0xfRVJST1IgPSA3OworICAgIGNvbnN0IElOVkFMSURfVFJBTlNGT1JNID0gODsKKyAgICBjb25zdCBJTlZBTElEX1BST1RPQ09MID0gOTsKKyAgICBjb25zdCBVTlNVUFBPUlRFRF9DTElFTlRfVFlQRSA9IDEwOworCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRtZXNzYWdlID0gbnVsbCwgJGNvZGUgPSAwKQorICAgIHsKKyAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkbWVzc2FnZSwgJGNvZGUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkKCRvdXRwdXQpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPl9yZWFkKCdUQXBwbGljYXRpb25FeGNlcHRpb24nLCBzZWxmOjokX1RTUEVDLCAkb3V0cHV0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJG91dHB1dCkKKyAgICB7CisgICAgICAgICR4ZmVyID0gMDsKKyAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RCZWdpbignVEFwcGxpY2F0aW9uRXhjZXB0aW9uJyk7CisgICAgICAgIGlmICgkbWVzc2FnZSA9ICR0aGlzLT5nZXRNZXNzYWdlKCkpIHsKKyAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRCZWdpbignbWVzc2FnZScsIFRUeXBlOjpTVFJJTkcsIDEpOworICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJpbmcoJG1lc3NhZ2UpOworICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEVuZCgpOworICAgICAgICB9CisgICAgICAgIGlmICgkY29kZSA9ICR0aGlzLT5nZXRDb2RlKCkpIHsKKyAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRCZWdpbigndHlwZScsIFRUeXBlOjpJMzIsIDIpOworICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVJMzIoJGNvZGUpOworICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEVuZCgpOworICAgICAgICB9CisgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRTdG9wKCk7CisgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0RW5kKCk7CisKKyAgICAgICAgcmV0dXJuICR4ZmVyOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL0V4Y2VwdGlvbi9URXhjZXB0aW9uLnBocCBiL2xpYi9waHAvbGliL0V4Y2VwdGlvbi9URXhjZXB0aW9uLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGJmODMyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvRXhjZXB0aW9uL1RFeGNlcHRpb24ucGhwCkBAIC0wLDAgKzEsMzg0IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XEV4Y2VwdGlvbjsKKwordXNlIFRocmlmdFxUeXBlXFRUeXBlOwordXNlIFRocmlmdFxCYXNlXFRCYXNlOworCisvKioKKyAqIE5PVEUobWNzbGVlKTogVGhpcyBjdXJyZW50bHkgY29udGFpbnMgYSB0b24gb2YgZHVwbGljYXRlZCBjb2RlIGZyb20gVEJhc2UKKyAqIGJlY2F1c2Ugd2UgbmVlZCB0byBzYXZlIENQVSBjeWNsZXMgYW5kIHRoaXMgaXMgbm90IHlldCBpbiBhbiBleHRlbnNpb24uCisgKiBJZGVhbGx5IHdlJ2QgbXVsdGlwbHktaW5oZXJpdCBURXhjZXB0aW9uIGZyb20gYm90aCBFeGNlcHRpb24gYW5kIEJhc2UsIGJ1dAorICogdGhhdCdzIG5vdCBwb3NzaWJsZSBpbiBQSFAgYW5kIHRoZXJlIGFyZSBubyBtb2R1bGVzIGVpdGhlciwgc28gZm9yIG5vdyB3ZQorICogYXBvbG9nZXRpY2FsbHkgdGFrZSBhIHRyaXAgdG8gSGFja1Rvd24uCisgKgorICogQ2FuIGJlIGNhbGxlZCB3aXRoIHN0YW5kYXJkIEV4Y2VwdGlvbiBjb25zdHJ1Y3RvciAobWVzc2FnZSwgY29kZSkgb3Igd2l0aAorICogVGhyaWZ0IEJhc2Ugb2JqZWN0IGNvbnN0cnVjdG9yIChzcGVjLCB2YWxzKS4KKyAqCisgKiBAcGFyYW0gbWl4ZWQgJHAxIE1lc3NhZ2UgKHN0cmluZykgb3IgdHlwZS1zcGVjIChhcnJheSkKKyAqIEBwYXJhbSBtaXhlZCAkcDIgQ29kZSAoaW50ZWdlcikgb3IgdmFsdWVzIChhcnJheSkKKyAqLworY2xhc3MgVEV4Y2VwdGlvbiBleHRlbmRzIFxFeGNlcHRpb24KK3sKKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHAxID0gbnVsbCwgJHAyID0gMCkKKyAgICB7CisgICAgICAgIGlmIChpc19hcnJheSgkcDEpICYmIGlzX2FycmF5KCRwMikpIHsKKyAgICAgICAgICAgICRzcGVjID0gJHAxOworICAgICAgICAgICAgJHZhbHMgPSAkcDI7CisgICAgICAgICAgICBmb3JlYWNoICgkc3BlYyBhcyAkZmlkID0+ICRmc3BlYykgeworICAgICAgICAgICAgICAgICR2YXIgPSAkZnNwZWNbJ3ZhciddOworICAgICAgICAgICAgICAgIGlmIChpc3NldCgkdmFsc1skdmFyXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgJHRoaXMtPiR2YXIgPSAkdmFsc1skdmFyXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRwMSwgJHAyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgJHRtZXRob2QgPSBhcnJheSgKKyAgICAgICAgVFR5cGU6OkJPT0wgPT4gJ0Jvb2wnLAorICAgICAgICBUVHlwZTo6QllURSA9PiAnQnl0ZScsCisgICAgICAgIFRUeXBlOjpJMTYgPT4gJ0kxNicsCisgICAgICAgIFRUeXBlOjpJMzIgPT4gJ0kzMicsCisgICAgICAgIFRUeXBlOjpJNjQgPT4gJ0k2NCcsCisgICAgICAgIFRUeXBlOjpET1VCTEUgPT4gJ0RvdWJsZScsCisgICAgICAgIFRUeXBlOjpTVFJJTkcgPT4gJ1N0cmluZycKKyAgICApOworCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZE1hcCgmJHZhciwgJHNwZWMsICRpbnB1dCkKKyAgICB7CisgICAgICAgICR4ZmVyID0gMDsKKyAgICAgICAgJGt0eXBlID0gJHNwZWNbJ2t0eXBlJ107CisgICAgICAgICR2dHlwZSA9ICRzcGVjWyd2dHlwZSddOworICAgICAgICAka3JlYWQgPSAkdnJlYWQgPSBudWxsOworICAgICAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyRrdHlwZV0pKSB7CisgICAgICAgICAgICAka3JlYWQgPSAncmVhZCcgLiBUQmFzZTo6JHRtZXRob2RbJGt0eXBlXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRrc3BlYyA9ICRzcGVjWydrZXknXTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyR2dHlwZV0pKSB7CisgICAgICAgICAgICAkdnJlYWQgPSAncmVhZCcgLiBUQmFzZTo6JHRtZXRob2RbJHZ0eXBlXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR2c3BlYyA9ICRzcGVjWyd2YWwnXTsKKyAgICAgICAgfQorICAgICAgICAkdmFyID0gYXJyYXkoKTsKKyAgICAgICAgJF9rdHlwZSA9ICRfdnR5cGUgPSAkc2l6ZSA9IDA7CisgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZE1hcEJlZ2luKCRfa3R5cGUsICRfdnR5cGUsICRzaXplKTsKKyAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJHNpemU7ICsrJGkpIHsKKyAgICAgICAgICAgICRrZXkgPSAkdmFsID0gbnVsbDsKKyAgICAgICAgICAgIGlmICgka3JlYWQgIT09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPiRrcmVhZCgka2V5KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3dpdGNoICgka3R5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJGNsYXNzID0gJGtzcGVjWydjbGFzcyddOworICAgICAgICAgICAgICAgICAgICAgICAgJGtleSA9IG5ldyAkY2xhc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICRrZXktPnJlYWQoJGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpNQVA6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRNYXAoJGtleSwgJGtzcGVjLCAkaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZExpc3QoJGtleSwgJGtzcGVjLCAkaW5wdXQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCRrZXksICRrc3BlYywgJGlucHV0LCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgkdnJlYWQgIT09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPiR2cmVhZCgkdmFsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3dpdGNoICgkdnR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJGNsYXNzID0gJHZzcGVjWydjbGFzcyddOworICAgICAgICAgICAgICAgICAgICAgICAgJHZhbCA9IG5ldyAkY2xhc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR2YWwtPnJlYWQoJGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpNQVA6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRNYXAoJHZhbCwgJHZzcGVjLCAkaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZExpc3QoJHZhbCwgJHZzcGVjLCAkaW5wdXQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCR2YWwsICR2c3BlYywgJGlucHV0LCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICR2YXJbJGtleV0gPSAkdmFsOworICAgICAgICB9CisgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZE1hcEVuZCgpOworCisgICAgICAgIHJldHVybiAkeGZlcjsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIF9yZWFkTGlzdCgmJHZhciwgJHNwZWMsICRpbnB1dCwgJHNldCA9IGZhbHNlKQorICAgIHsKKyAgICAgICAgJHhmZXIgPSAwOworICAgICAgICAkZXR5cGUgPSAkc3BlY1snZXR5cGUnXTsKKyAgICAgICAgJGVyZWFkID0gJHZyZWFkID0gbnVsbDsKKyAgICAgICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFskZXR5cGVdKSkgeworICAgICAgICAgICAgJGVyZWFkID0gJ3JlYWQnIC4gVEJhc2U6OiR0bWV0aG9kWyRldHlwZV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkZXNwZWMgPSAkc3BlY1snZWxlbSddOworICAgICAgICB9CisgICAgICAgICR2YXIgPSBhcnJheSgpOworICAgICAgICAkX2V0eXBlID0gJHNpemUgPSAwOworICAgICAgICBpZiAoJHNldCkgeworICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkU2V0QmVnaW4oJF9ldHlwZSwgJHNpemUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkTGlzdEJlZ2luKCRfZXR5cGUsICRzaXplKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkc2l6ZTsgKyskaSkgeworICAgICAgICAgICAgJGVsZW0gPSBudWxsOworICAgICAgICAgICAgaWYgKCRlcmVhZCAhPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+JGVyZWFkKCRlbGVtKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgJGVzcGVjID0gJHNwZWNbJ2VsZW0nXTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCRldHlwZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAkY2xhc3MgPSAkZXNwZWNbJ2NsYXNzJ107CisgICAgICAgICAgICAgICAgICAgICAgICAkZWxlbSA9IG5ldyAkY2xhc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICRlbGVtLT5yZWFkKCRpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTWFwKCRlbGVtLCAkZXNwZWMsICRpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTGlzdCgkZWxlbSwgJGVzcGVjLCAkaW5wdXQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCRlbGVtLCAkZXNwZWMsICRpbnB1dCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoJHNldCkgeworICAgICAgICAgICAgICAgICR2YXJbJGVsZW1dID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgJHZhciBbXSA9ICRlbGVtOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgkc2V0KSB7CisgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRTZXRFbmQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZExpc3RFbmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkeGZlcjsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gX3JlYWQoJGNsYXNzLCAkc3BlYywgJGlucHV0KQorICAgIHsKKyAgICAgICAgJHhmZXIgPSAwOworICAgICAgICAkZm5hbWUgPSBudWxsOworICAgICAgICAkZnR5cGUgPSAwOworICAgICAgICAkZmlkID0gMDsKKyAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RydWN0QmVnaW4oJGZuYW1lKTsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZEZpZWxkQmVnaW4oJGZuYW1lLCAkZnR5cGUsICRmaWQpOworICAgICAgICAgICAgaWYgKCRmdHlwZSA9PSBUVHlwZTo6U1RPUCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGlzc2V0KCRzcGVjWyRmaWRdKSkgeworICAgICAgICAgICAgICAgICRmc3BlYyA9ICRzcGVjWyRmaWRdOworICAgICAgICAgICAgICAgICR2YXIgPSAkZnNwZWNbJ3ZhciddOworICAgICAgICAgICAgICAgIGlmICgkZnR5cGUgPT0gJGZzcGVjWyd0eXBlJ10pIHsKKyAgICAgICAgICAgICAgICAgICAgJHhmZXIgPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyRmdHlwZV0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAkZnVuYyA9ICdyZWFkJyAuIFRCYXNlOjokdG1ldGhvZFskZnR5cGVdOworICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT4kZnVuYygkdGhpcy0+JHZhcik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKCRmdHlwZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNsYXNzID0gJGZzcGVjWydjbGFzcyddOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+JHZhciA9IG5ldyAkY2xhc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPiR2YXItPnJlYWQoJGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRNYXAoJHRoaXMtPiR2YXIsICRmc3BlYywgJGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCR0aGlzLT4kdmFyLCAkZnNwZWMsICRpbnB1dCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZExpc3QoJHRoaXMtPiR2YXIsICRmc3BlYywgJGlucHV0LCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnNraXAoJGZ0eXBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkRmllbGRFbmQoKTsKKyAgICAgICAgfQorICAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRTdHJ1Y3RFbmQoKTsKKworICAgICAgICByZXR1cm4gJHhmZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVNYXAoJHZhciwgJHNwZWMsICRvdXRwdXQpCisgICAgeworICAgICAgICAkeGZlciA9IDA7CisgICAgICAgICRrdHlwZSA9ICRzcGVjWydrdHlwZSddOworICAgICAgICAkdnR5cGUgPSAkc3BlY1sndnR5cGUnXTsKKyAgICAgICAgJGt3cml0ZSA9ICR2d3JpdGUgPSBudWxsOworICAgICAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyRrdHlwZV0pKSB7CisgICAgICAgICAgICAka3dyaXRlID0gJ3dyaXRlJyAuIFRCYXNlOjokdG1ldGhvZFska3R5cGVdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJGtzcGVjID0gJHNwZWNbJ2tleSddOworICAgICAgICB9CisgICAgICAgIGlmIChpc3NldChUQmFzZTo6JHRtZXRob2RbJHZ0eXBlXSkpIHsKKyAgICAgICAgICAgICR2d3JpdGUgPSAnd3JpdGUnIC4gVEJhc2U6OiR0bWV0aG9kWyR2dHlwZV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkdnNwZWMgPSAkc3BlY1sndmFsJ107CisgICAgICAgIH0KKyAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVNYXBCZWdpbigka3R5cGUsICR2dHlwZSwgY291bnQoJHZhcikpOworICAgICAgICBmb3JlYWNoICgkdmFyIGFzICRrZXkgPT4gJHZhbCkgeworICAgICAgICAgICAgaWYgKGlzc2V0KCRrd3JpdGUpKSB7CisgICAgICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+JGt3cml0ZSgka2V5KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3dpdGNoICgka3R5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGtleS0+d3JpdGUoJG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZU1hcCgka2V5LCAka3NwZWMsICRvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCRrZXksICRrc3BlYywgJG91dHB1dCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCRrZXksICRrc3BlYywgJG91dHB1dCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaXNzZXQoJHZ3cml0ZSkpIHsKKyAgICAgICAgICAgICAgICAkeGZlciArPSAkb3V0cHV0LT4kdndyaXRlKCR2YWwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCR2dHlwZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdmFsLT53cml0ZSgkb3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpNQVA6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTWFwKCR2YWwsICR2c3BlYywgJG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJHZhbCwgJHZzcGVjLCAkb3V0cHV0LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJHZhbCwgJHZzcGVjLCAkb3V0cHV0LCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZU1hcEVuZCgpOworCisgICAgICAgIHJldHVybiAkeGZlcjsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIF93cml0ZUxpc3QoJHZhciwgJHNwZWMsICRvdXRwdXQsICRzZXQgPSBmYWxzZSkKKyAgICB7CisgICAgICAgICR4ZmVyID0gMDsKKyAgICAgICAgJGV0eXBlID0gJHNwZWNbJ2V0eXBlJ107CisgICAgICAgICRld3JpdGUgPSBudWxsOworICAgICAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyRldHlwZV0pKSB7CisgICAgICAgICAgICAkZXdyaXRlID0gJ3dyaXRlJyAuIFRCYXNlOjokdG1ldGhvZFskZXR5cGVdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJGVzcGVjID0gJHNwZWNbJ2VsZW0nXTsKKyAgICAgICAgfQorICAgICAgICBpZiAoJHNldCkgeworICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTZXRCZWdpbigkZXR5cGUsIGNvdW50KCR2YXIpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlTGlzdEJlZ2luKCRldHlwZSwgY291bnQoJHZhcikpOworICAgICAgICB9CisgICAgICAgIGZvcmVhY2ggKCR2YXIgYXMgJGtleSA9PiAkdmFsKSB7CisgICAgICAgICAgICAkZWxlbSA9ICRzZXQgPyAka2V5IDogJHZhbDsKKyAgICAgICAgICAgIGlmIChpc3NldCgkZXdyaXRlKSkgeworICAgICAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPiRld3JpdGUoJGVsZW0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKCRldHlwZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkZWxlbS0+d3JpdGUoJG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZU1hcCgkZWxlbSwgJGVzcGVjLCAkb3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgkZWxlbSwgJGVzcGVjLCAkb3V0cHV0LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJGVsZW0sICRlc3BlYywgJG91dHB1dCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCRzZXQpIHsKKyAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU2V0RW5kKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUxpc3RFbmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkeGZlcjsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gX3dyaXRlKCRjbGFzcywgJHNwZWMsICRvdXRwdXQpCisgICAgeworICAgICAgICAkeGZlciA9IDA7CisgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0QmVnaW4oJGNsYXNzKTsKKyAgICAgICAgZm9yZWFjaCAoJHNwZWMgYXMgJGZpZCA9PiAkZnNwZWMpIHsKKyAgICAgICAgICAgICR2YXIgPSAkZnNwZWNbJ3ZhciddOworICAgICAgICAgICAgaWYgKCR0aGlzLT4kdmFyICE9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgJGZ0eXBlID0gJGZzcGVjWyd0eXBlJ107CisgICAgICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEJlZ2luKCR2YXIsICRmdHlwZSwgJGZpZCk7CisgICAgICAgICAgICAgICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFskZnR5cGVdKSkgeworICAgICAgICAgICAgICAgICAgICAkZnVuYyA9ICd3cml0ZScgLiBUQmFzZTo6JHRtZXRob2RbJGZ0eXBlXTsKKyAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+JGZ1bmMoJHRoaXMtPiR2YXIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoJGZ0eXBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPiR2YXItPndyaXRlKCRvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVNYXAoJHRoaXMtPiR2YXIsICRmc3BlYywgJG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJHRoaXMtPiR2YXIsICRmc3BlYywgJG91dHB1dCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCR0aGlzLT4kdmFyLCAkZnNwZWMsICRvdXRwdXQsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRFbmQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkU3RvcCgpOworICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEVuZCgpOworCisgICAgICAgIHJldHVybiAkeGZlcjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9FeGNlcHRpb24vVFByb3RvY29sRXhjZXB0aW9uLnBocCBiL2xpYi9waHAvbGliL0V4Y2VwdGlvbi9UUHJvdG9jb2xFeGNlcHRpb24ucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNTVkNDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9FeGNlcHRpb24vVFByb3RvY29sRXhjZXB0aW9uLnBocApAQCAtMCwwICsxLDUwIEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKKyAqIEBhdXRob3I6IHJtYXJpbiAobWFyaW4ucmFkdUBmYWNlYm9vay5jb20pCisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxFeGNlcHRpb247CisKKy8qKgorICogUHJvdG9jb2wgbW9kdWxlLiBDb250YWlucyBhbGwgdGhlIHR5cGVzIGFuZCBkZWZpbml0aW9ucyBuZWVkZWQgdG8gaW1wbGVtZW50CisgKiBhIHByb3RvY29sIGVuY29kZXIvZGVjb2Rlci4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKKyAqLworCisvKioKKyAqIFByb3RvY29sIGV4Y2VwdGlvbnMKKyAqLworY2xhc3MgVFByb3RvY29sRXhjZXB0aW9uIGV4dGVuZHMgVEV4Y2VwdGlvbgoreworICAgIGNvbnN0IFVOS05PV04gPSAwOworICAgIGNvbnN0IElOVkFMSURfREFUQSA9IDE7CisgICAgY29uc3QgTkVHQVRJVkVfU0laRSA9IDI7CisgICAgY29uc3QgU0laRV9MSU1JVCA9IDM7CisgICAgY29uc3QgQkFEX1ZFUlNJT04gPSA0OworICAgIGNvbnN0IE5PVF9JTVBMRU1FTlRFRCA9IDU7CisgICAgY29uc3QgREVQVEhfTElNSVQgPSA2OworCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRtZXNzYWdlID0gbnVsbCwgJGNvZGUgPSAwKQorICAgIHsKKyAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkbWVzc2FnZSwgJGNvZGUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL0V4Y2VwdGlvbi9UVHJhbnNwb3J0RXhjZXB0aW9uLnBocCBiL2xpYi9waHAvbGliL0V4Y2VwdGlvbi9UVHJhbnNwb3J0RXhjZXB0aW9uLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDhkNTY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvRXhjZXB0aW9uL1RUcmFuc3BvcnRFeGNlcHRpb24ucGhwCkBAIC0wLDAgKzEsNDAgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XEV4Y2VwdGlvbjsKKworLyoqCisgKiBUcmFuc3BvcnQgZXhjZXB0aW9ucworICovCitjbGFzcyBUVHJhbnNwb3J0RXhjZXB0aW9uIGV4dGVuZHMgVEV4Y2VwdGlvbgoreworICAgIGNvbnN0IFVOS05PV04gPSAwOworICAgIGNvbnN0IE5PVF9PUEVOID0gMTsKKyAgICBjb25zdCBBTFJFQURZX09QRU4gPSAyOworICAgIGNvbnN0IFRJTUVEX09VVCA9IDM7CisgICAgY29uc3QgRU5EX09GX0ZJTEUgPSA0OworCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRtZXNzYWdlID0gbnVsbCwgJGNvZGUgPSAwKQorICAgIHsKKyAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkbWVzc2FnZSwgJGNvZGUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL0ZhY3RvcnkvVEJpbmFyeVByb3RvY29sRmFjdG9yeS5waHAgYi9saWIvcGhwL2xpYi9GYWN0b3J5L1RCaW5hcnlQcm90b2NvbEZhY3RvcnkucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MTkxODMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9GYWN0b3J5L1RCaW5hcnlQcm90b2NvbEZhY3RvcnkucGhwCkBAIC0wLDAgKzEsNDUgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcRmFjdG9yeTsKKwordXNlIFRocmlmdFxQcm90b2NvbFxUQmluYXJ5UHJvdG9jb2w7CisKKy8qKgorICogQmluYXJ5IFByb3RvY29sIEZhY3RvcnkKKyAqLworY2xhc3MgVEJpbmFyeVByb3RvY29sRmFjdG9yeSBpbXBsZW1lbnRzIFRQcm90b2NvbEZhY3RvcnkKK3sKKyAgICBwcml2YXRlICRzdHJpY3RSZWFkXyA9IGZhbHNlOworICAgIHByaXZhdGUgJHN0cmljdFdyaXRlXyA9IGZhbHNlOworCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRzdHJpY3RSZWFkID0gZmFsc2UsICRzdHJpY3RXcml0ZSA9IGZhbHNlKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnN0cmljdFJlYWRfID0gJHN0cmljdFJlYWQ7CisgICAgICAgICR0aGlzLT5zdHJpY3RXcml0ZV8gPSAkc3RyaWN0V3JpdGU7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGdldFByb3RvY29sKCR0cmFucykKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgVEJpbmFyeVByb3RvY29sKCR0cmFucywgJHRoaXMtPnN0cmljdFJlYWRfLCAkdGhpcy0+c3RyaWN0V3JpdGVfKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9GYWN0b3J5L1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5LnBocCBiL2xpYi9waHAvbGliL0ZhY3RvcnkvVENvbXBhY3RQcm90b2NvbEZhY3RvcnkucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZmI4ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9GYWN0b3J5L1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5LnBocApAQCAtMCwwICsxLDQwIEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XEZhY3Rvcnk7CisKK3VzZSBUaHJpZnRcUHJvdG9jb2xcVENvbXBhY3RQcm90b2NvbDsKKworLyoqCisgKiBDb21wYWN0IFByb3RvY29sIEZhY3RvcnkKKyAqLworY2xhc3MgVENvbXBhY3RQcm90b2NvbEZhY3RvcnkgaW1wbGVtZW50cyBUUHJvdG9jb2xGYWN0b3J5Cit7CisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkKKyAgICB7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGdldFByb3RvY29sKCR0cmFucykKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgVENvbXBhY3RQcm90b2NvbCgkdHJhbnMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9GYWN0b3J5L1RKU09OUHJvdG9jb2xGYWN0b3J5LnBocCBiL2xpYi9waHAvbGliL0ZhY3RvcnkvVEpTT05Qcm90b2NvbEZhY3RvcnkucGhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWIvcGhwL2xpYi9UaHJpZnQvRmFjdG9yeS9USlNPTlByb3RvY29sRmFjdG9yeS5waHAKcmVuYW1lIHRvIGxpYi9waHAvbGliL0ZhY3RvcnkvVEpTT05Qcm90b2NvbEZhY3RvcnkucGhwCmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9GYWN0b3J5L1RQcm90b2NvbEZhY3RvcnkucGhwIGIvbGliL3BocC9saWIvRmFjdG9yeS9UUHJvdG9jb2xGYWN0b3J5LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzA2NmM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvRmFjdG9yeS9UUHJvdG9jb2xGYWN0b3J5LnBocApAQCAtMCwwICsxLDM2IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XEZhY3Rvcnk7CisKKy8qKgorICogUHJvdG9jb2wgZmFjdG9yeSBjcmVhdGVzIHByb3RvY29sIG9iamVjdHMgZnJvbSB0cmFuc3BvcnRzCisgKi8KK2ludGVyZmFjZSBUUHJvdG9jb2xGYWN0b3J5Cit7CisgICAgLyoqCisgICAgICogQnVpbGQgYSBwcm90b2NvbCBmcm9tIHRoZSBiYXNlIHRyYW5zcG9ydAorICAgICAqCisgICAgICogQHJldHVybiBUaHJpZnRcUHJvdG9jb2xcVFByb3RvY29sIHByb3RvY29sCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGdldFByb3RvY29sKCR0cmFucyk7Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9GYWN0b3J5L1RTdHJpbmdGdW5jRmFjdG9yeS5waHAgYi9saWIvcGhwL2xpYi9GYWN0b3J5L1RTdHJpbmdGdW5jRmFjdG9yeS5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBkZTRkNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL0ZhY3RvcnkvVFN0cmluZ0Z1bmNGYWN0b3J5LnBocApAQCAtMCwwICsxLDY2IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxGYWN0b3J5OworCit1c2UgVGhyaWZ0XFN0cmluZ0Z1bmNcQ29yZTsKK3VzZSBUaHJpZnRcU3RyaW5nRnVuY1xNYnN0cmluZzsKK3VzZSBUaHJpZnRcU3RyaW5nRnVuY1xUU3RyaW5nRnVuYzsKKworY2xhc3MgVFN0cmluZ0Z1bmNGYWN0b3J5Cit7CisgICAgcHJpdmF0ZSBzdGF0aWMgJF9pbnN0YW5jZTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgU2luZ2xldG9uIGluc3RhbmNlIG9mIFRTdHJpbmdGdW5jIGltcGxlbWVudGF0aW9uIHRoYXQgaXMKKyAgICAgKiBjb21wYXRpYmxlIHdpdGggdGhlIGN1cnJlbnQgc3lzdGVtJ3MgbWJzdHJpbmcuZnVuY19vdmVybG9hZCBzZXR0aW5ncy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVFN0cmluZ0Z1bmMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNyZWF0ZSgpCisgICAgeworICAgICAgICBpZiAoIXNlbGY6OiRfaW5zdGFuY2UpIHsKKyAgICAgICAgICAgIHNlbGY6Ol9zZXRJbnN0YW5jZSgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHNlbGY6OiRfaW5zdGFuY2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gX3NldEluc3RhbmNlKCkKKyAgICB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDYW5ub3QgdXNlIHN0ciogZnVuY3Rpb25zIGZvciBieXRlIGNvdW50aW5nIGJlY2F1c2UgbXVsdGlieXRlCisgICAgICAgICAqIGNoYXJhY3RlcnMgd2lsbCBiZSByZWFkIGEgc2luZ2xlIGJ5dGVzLgorICAgICAgICAgKgorICAgICAgICAgKiBTZWU6IGh0dHA6Ly9waHAubmV0L21hbnVhbC9lbi9tYnN0cmluZy5vdmVybG9hZC5waHAKKyAgICAgICAgICovCisgICAgICAgIGlmIChpbmlfZ2V0KCdtYnN0cmluZy5mdW5jX292ZXJsb2FkJykgJiAyKSB7CisgICAgICAgICAgICBzZWxmOjokX2luc3RhbmNlID0gbmV3IE1ic3RyaW5nKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIG1ic3RyaW5nIGlzIG5vdCBpbnN0YWxsZWQgb3IgZG9lcyBub3QgaGF2ZSBmdW5jdGlvbiBvdmVybG9hZGluZworICAgICAgICAgICAgICogb2YgdGhlIHN0ciogZnVuY3Rpb25zIGVuYWJsZWQgc28gdXNlIFBIUCBjb3JlIHN0ciogZnVuY3Rpb25zIGZvcgorICAgICAgICAgICAgICogYnl0ZSBjb3VudGluZy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgc2VsZjo6JF9pbnN0YW5jZSA9IG5ldyBDb3JlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9GYWN0b3J5L1RUcmFuc3BvcnRGYWN0b3J5LnBocCBiL2xpYi9waHAvbGliL0ZhY3RvcnkvVFRyYW5zcG9ydEZhY3RvcnkucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZjJlZWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9GYWN0b3J5L1RUcmFuc3BvcnRGYWN0b3J5LnBocApAQCAtMCwwICsxLDE4IEBACis8P3BocAorCituYW1lc3BhY2UgVGhyaWZ0XEZhY3Rvcnk7CisKK3VzZSBUaHJpZnRcVHJhbnNwb3J0XFRUcmFuc3BvcnQ7CisKK2NsYXNzIFRUcmFuc3BvcnRGYWN0b3J5Cit7CisgICAgLyoqCisgICAgICogQHN0YXRpYworICAgICAqIEBwYXJhbSBUVHJhbnNwb3J0ICR0cmFuc3BvcnQKKyAgICAgKiBAcmV0dXJuIFRUcmFuc3BvcnQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFRyYW5zcG9ydChUVHJhbnNwb3J0ICR0cmFuc3BvcnQpCisgICAgeworICAgICAgICByZXR1cm4gJHRyYW5zcG9ydDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvUHJvdG9jb2wvSlNPTi9CYXNlQ29udGV4dC5waHAgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9KU09OL0Jhc2VDb250ZXh0LnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbGliL3BocC9saWIvVGhyaWZ0L1Byb3RvY29sL0pTT04vQmFzZUNvbnRleHQucGhwCnJlbmFtZSB0byBsaWIvcGhwL2xpYi9Qcm90b2NvbC9KU09OL0Jhc2VDb250ZXh0LnBocApkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L1Byb3RvY29sL0pTT04vTGlzdENvbnRleHQucGhwIGIvbGliL3BocC9saWIvUHJvdG9jb2wvSlNPTi9MaXN0Q29udGV4dC5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9KU09OL0xpc3RDb250ZXh0LnBocApyZW5hbWUgdG8gbGliL3BocC9saWIvUHJvdG9jb2wvSlNPTi9MaXN0Q29udGV4dC5waHAKZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9KU09OL0xvb2thaGVhZFJlYWRlci5waHAgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9KU09OL0xvb2thaGVhZFJlYWRlci5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9KU09OL0xvb2thaGVhZFJlYWRlci5waHAKcmVuYW1lIHRvIGxpYi9waHAvbGliL1Byb3RvY29sL0pTT04vTG9va2FoZWFkUmVhZGVyLnBocApkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L1Byb3RvY29sL0pTT04vUGFpckNvbnRleHQucGhwIGIvbGliL3BocC9saWIvUHJvdG9jb2wvSlNPTi9QYWlyQ29udGV4dC5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9KU09OL1BhaXJDb250ZXh0LnBocApyZW5hbWUgdG8gbGliL3BocC9saWIvUHJvdG9jb2wvSlNPTi9QYWlyQ29udGV4dC5waHAKZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1Byb3RvY29sL1NpbXBsZUpTT04vQ29sbGVjdGlvbk1hcEtleUV4Y2VwdGlvbi5waHAgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9TaW1wbGVKU09OL0NvbGxlY3Rpb25NYXBLZXlFeGNlcHRpb24ucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMmI4NWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9TaW1wbGVKU09OL0NvbGxlY3Rpb25NYXBLZXlFeGNlcHRpb24ucGhwCkBAIC0wLDAgKzEsMzMgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2xcU2ltcGxlSlNPTjsKKwordXNlIFRocmlmdFxFeGNlcHRpb25cVEV4Y2VwdGlvbjsKKworY2xhc3MgQ29sbGVjdGlvbk1hcEtleUV4Y2VwdGlvbiBleHRlbmRzIFRFeGNlcHRpb24KK3sKKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJG1lc3NhZ2UpCisgICAgeworICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRtZXNzYWdlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9Qcm90b2NvbC9TaW1wbGVKU09OL0NvbnRleHQucGhwIGIvbGliL3BocC9saWIvUHJvdG9jb2wvU2ltcGxlSlNPTi9Db250ZXh0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmQxNmZhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvUHJvdG9jb2wvU2ltcGxlSlNPTi9Db250ZXh0LnBocApAQCAtMCwwICsxLDM1IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFByb3RvY29sXFNpbXBsZUpTT047CisKK2NsYXNzIENvbnRleHQKK3sKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoKQorICAgIHsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gaXNNYXBLZXkoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1Byb3RvY29sL1NpbXBsZUpTT04vTGlzdENvbnRleHQucGhwIGIvbGliL3BocC9saWIvUHJvdG9jb2wvU2ltcGxlSlNPTi9MaXN0Q29udGV4dC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYzNDZkOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1Byb3RvY29sL1NpbXBsZUpTT04vTGlzdENvbnRleHQucGhwCkBAIC0wLDAgKzEsNDUgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2xcU2ltcGxlSlNPTjsKKwordXNlIFRocmlmdFxQcm90b2NvbFxUU2ltcGxlSlNPTlByb3RvY29sOworCitjbGFzcyBMaXN0Q29udGV4dCBleHRlbmRzIENvbnRleHQKK3sKKyAgICBwcm90ZWN0ZWQgJGZpcnN0XyA9IHRydWU7CisgICAgcHJpdmF0ZSAkcF87CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHApCisgICAgeworICAgICAgICAkdGhpcy0+cF8gPSAkcDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoKQorICAgIHsKKyAgICAgICAgaWYgKCR0aGlzLT5maXJzdF8pIHsKKyAgICAgICAgICAgICR0aGlzLT5maXJzdF8gPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR0aGlzLT5wXy0+Z2V0VHJhbnNwb3J0KCktPndyaXRlKFRTaW1wbGVKU09OUHJvdG9jb2w6OkNPTU1BKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1Byb3RvY29sL1NpbXBsZUpTT04vTWFwQ29udGV4dC5waHAgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9TaW1wbGVKU09OL01hcENvbnRleHQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxYzA2MGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9TaW1wbGVKU09OL01hcENvbnRleHQucGhwCkBAIC0wLDAgKzEsNDcgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2xcU2ltcGxlSlNPTjsKKworY2xhc3MgTWFwQ29udGV4dCBleHRlbmRzIFN0cnVjdENvbnRleHQKK3sKKyAgICBwcm90ZWN0ZWQgJGlzS2V5ID0gdHJ1ZTsKKyAgICBwcml2YXRlICRwXzsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkcCkKKyAgICB7CisgICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJHApOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgpCisgICAgeworICAgICAgICBwYXJlbnQ6OndyaXRlKCk7CisgICAgICAgICR0aGlzLT5pc0tleSA9ICEkdGhpcy0+aXNLZXk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGlzTWFwS2V5KCkKKyAgICB7CisgICAgICAgIC8vIHdlIHdhbnQgdG8gY29lcmNlIG1hcCBrZXlzIHRvIGpzb24gc3RyaW5ncyByZWdhcmRsZXNzCisgICAgICAgIC8vIG9mIHRoZWlyIHR5cGUKKyAgICAgICAgcmV0dXJuICR0aGlzLT5pc0tleTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9Qcm90b2NvbC9TaW1wbGVKU09OL1N0cnVjdENvbnRleHQucGhwIGIvbGliL3BocC9saWIvUHJvdG9jb2wvU2ltcGxlSlNPTi9TdHJ1Y3RDb250ZXh0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGE2MmQxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvUHJvdG9jb2wvU2ltcGxlSlNPTi9TdHJ1Y3RDb250ZXh0LnBocApAQCAtMCwwICsxLDUyIEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFByb3RvY29sXFNpbXBsZUpTT047CisKK3VzZSBUaHJpZnRcUHJvdG9jb2xcVFNpbXBsZUpTT05Qcm90b2NvbDsKKworY2xhc3MgU3RydWN0Q29udGV4dCBleHRlbmRzIENvbnRleHQKK3sKKyAgICBwcm90ZWN0ZWQgJGZpcnN0XyA9IHRydWU7CisgICAgcHJvdGVjdGVkICRjb2xvbl8gPSB0cnVlOworICAgIHByaXZhdGUgJHBfOworCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRwKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnBfID0gJHA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCkKKyAgICB7CisgICAgICAgIGlmICgkdGhpcy0+Zmlyc3RfKSB7CisgICAgICAgICAgICAkdGhpcy0+Zmlyc3RfID0gZmFsc2U7CisgICAgICAgICAgICAkdGhpcy0+Y29sb25fID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR0aGlzLT5wXy0+Z2V0VHJhbnNwb3J0KCktPndyaXRlKAorICAgICAgICAgICAgICAgICR0aGlzLT5jb2xvbl8gPworICAgICAgICAgICAgICAgICAgICBUU2ltcGxlSlNPTlByb3RvY29sOjpDT0xPTiA6CisgICAgICAgICAgICAgICAgICAgIFRTaW1wbGVKU09OUHJvdG9jb2w6OkNPTU1BCisgICAgICAgICAgICApOworICAgICAgICAgICAgJHRoaXMtPmNvbG9uXyA9ICEkdGhpcy0+Y29sb25fOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvUHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLnBocCBiL2xpYi9waHAvbGliL1Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RhNWMwZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5waHAKQEAgLTAsMCArMSw0NTMgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2w7CisKK3VzZSBUaHJpZnRcVHlwZVxUVHlwZTsKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRQcm90b2NvbEV4Y2VwdGlvbjsKK3VzZSBUaHJpZnRcRmFjdG9yeVxUU3RyaW5nRnVuY0ZhY3Rvcnk7CisKKy8qKgorICogQmluYXJ5IGltcGxlbWVudGF0aW9uIG9mIHRoZSBUaHJpZnQgcHJvdG9jb2wuCisgKgorICovCitjbGFzcyBUQmluYXJ5UHJvdG9jb2wgZXh0ZW5kcyBUUHJvdG9jb2wKK3sKKyAgICBjb25zdCBWRVJTSU9OX01BU0sgPSAweGZmZmYwMDAwOworICAgIGNvbnN0IFZFUlNJT05fMSA9IDB4ODAwMTAwMDA7CisKKyAgICBwcm90ZWN0ZWQgJHN0cmljdFJlYWRfID0gZmFsc2U7CisgICAgcHJvdGVjdGVkICRzdHJpY3RXcml0ZV8gPSB0cnVlOworCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCR0cmFucywgJHN0cmljdFJlYWQgPSBmYWxzZSwgJHN0cmljdFdyaXRlID0gdHJ1ZSkKKyAgICB7CisgICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJHRyYW5zKTsKKyAgICAgICAgJHRoaXMtPnN0cmljdFJlYWRfID0gJHN0cmljdFJlYWQ7CisgICAgICAgICR0aGlzLT5zdHJpY3RXcml0ZV8gPSAkc3RyaWN0V3JpdGU7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUJlZ2luKCRuYW1lLCAkdHlwZSwgJHNlcWlkKQorICAgIHsKKyAgICAgICAgaWYgKCR0aGlzLT5zdHJpY3RXcml0ZV8pIHsKKyAgICAgICAgICAgICR2ZXJzaW9uID0gc2VsZjo6VkVSU0lPTl8xIHwgJHR5cGU7CisKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgICR0aGlzLT53cml0ZUkzMigkdmVyc2lvbikgKworICAgICAgICAgICAgICAgICR0aGlzLT53cml0ZVN0cmluZygkbmFtZSkgKworICAgICAgICAgICAgICAgICR0aGlzLT53cml0ZUkzMigkc2VxaWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgJHRoaXMtPndyaXRlU3RyaW5nKCRuYW1lKSArCisgICAgICAgICAgICAgICAgJHRoaXMtPndyaXRlQnl0ZSgkdHlwZSkgKworICAgICAgICAgICAgICAgICR0aGlzLT53cml0ZUkzMigkc2VxaWQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RCZWdpbigkbmFtZSkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEJlZ2luKCRmaWVsZE5hbWUsICRmaWVsZFR5cGUsICRmaWVsZElkKQorICAgIHsKKyAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAkdGhpcy0+d3JpdGVCeXRlKCRmaWVsZFR5cGUpICsKKyAgICAgICAgICAgICR0aGlzLT53cml0ZUkxNigkZmllbGRJZCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRTdG9wKCkKKyAgICB7CisgICAgICAgIHJldHVybgorICAgICAgICAgICAgJHRoaXMtPndyaXRlQnl0ZShUVHlwZTo6U1RPUCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwQmVnaW4oJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybgorICAgICAgICAgICAgJHRoaXMtPndyaXRlQnl0ZSgka2V5VHlwZSkgKworICAgICAgICAgICAgJHRoaXMtPndyaXRlQnl0ZSgkdmFsVHlwZSkgKworICAgICAgICAgICAgJHRoaXMtPndyaXRlSTMyKCRzaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpCisgICAgeworICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICR0aGlzLT53cml0ZUJ5dGUoJGVsZW1UeXBlKSArCisgICAgICAgICAgICAkdGhpcy0+d3JpdGVJMzIoJHNpemUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUxpc3RFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybgorICAgICAgICAgICAgJHRoaXMtPndyaXRlQnl0ZSgkZWxlbVR5cGUpICsKKyAgICAgICAgICAgICR0aGlzLT53cml0ZUkzMigkc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0RW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJvb2woJHZhbHVlKQorICAgIHsKKyAgICAgICAgJGRhdGEgPSBwYWNrKCdjJywgJHZhbHVlID8gMSA6IDApOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkZGF0YSwgMSk7CisKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQnl0ZSgkdmFsdWUpCisgICAgeworICAgICAgICAkZGF0YSA9IHBhY2soJ2MnLCAkdmFsdWUpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkZGF0YSwgMSk7CisKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTE2KCR2YWx1ZSkKKyAgICB7CisgICAgICAgICRkYXRhID0gcGFjaygnbicsICR2YWx1ZSk7CisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKCRkYXRhLCAyKTsKKworICAgICAgICByZXR1cm4gMjsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMzIoJHZhbHVlKQorICAgIHsKKyAgICAgICAgJGRhdGEgPSBwYWNrKCdOJywgJHZhbHVlKTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJGRhdGEsIDQpOworCisgICAgICAgIHJldHVybiA0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUk2NCgkdmFsdWUpCisgICAgeworICAgICAgICAvLyBJZiB3ZSBhcmUgb24gYSAzMmJpdCBhcmNoaXRlY3R1cmUgd2UgaGF2ZSB0byBleHBsaWNpdGx5IGRlYWwgd2l0aAorICAgICAgICAvLyA2NC1iaXQgdHdvcy1jb21wbGVtZW50IGFyaXRobWV0aWMgc2luY2UgUEhQIHdhbnRzIHRvIHRyZWF0IGFsbCBpbnRzCisgICAgICAgIC8vIGFzIHNpZ25lZCBhbmQgYW55IGludCBvdmVyIDJeMzEgLSAxIGFzIGEgZmxvYXQKKyAgICAgICAgaWYgKFBIUF9JTlRfU0laRSA9PSA0KSB7CisgICAgICAgICAgICAkbmVnID0gJHZhbHVlIDwgMDsKKworICAgICAgICAgICAgaWYgKCRuZWcpIHsKKyAgICAgICAgICAgICAgICAkdmFsdWUgKj0gLTE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICRoaSA9IChpbnQpKCR2YWx1ZSAvIDQyOTQ5NjcyOTYpOworICAgICAgICAgICAgJGxvID0gKGludCkkdmFsdWU7CisKKyAgICAgICAgICAgIGlmICgkbmVnKSB7CisgICAgICAgICAgICAgICAgJGhpID0gfiRoaTsKKyAgICAgICAgICAgICAgICAkbG8gPSB+JGxvOworICAgICAgICAgICAgICAgIGlmICgoJGxvICYgKGludCkweGZmZmZmZmZmKSA9PSAoaW50KTB4ZmZmZmZmZmYpIHsKKyAgICAgICAgICAgICAgICAgICAgJGxvID0gMDsKKyAgICAgICAgICAgICAgICAgICAgJGhpKys7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJGxvKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgJGRhdGEgPSBwYWNrKCdOMicsICRoaSwgJGxvKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRoaSA9ICR2YWx1ZSA+PiAzMjsKKyAgICAgICAgICAgICRsbyA9ICR2YWx1ZSAmIDB4RkZGRkZGRkY7CisgICAgICAgICAgICAkZGF0YSA9IHBhY2soJ04yJywgJGhpLCAkbG8pOworICAgICAgICB9CisKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJGRhdGEsIDgpOworCisgICAgICAgIHJldHVybiA4OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZURvdWJsZSgkdmFsdWUpCisgICAgeworICAgICAgICAkZGF0YSA9IHBhY2soJ2QnLCAkdmFsdWUpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzdHJyZXYoJGRhdGEpLCA4KTsKKworICAgICAgICByZXR1cm4gODsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJpbmcoJHZhbHVlKQorICAgIHsKKyAgICAgICAgJGxlbiA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdmFsdWUpOworICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPndyaXRlSTMyKCRsZW4pOworICAgICAgICBpZiAoJGxlbikgeworICAgICAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJHZhbHVlLCAkbGVuKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkcmVzdWx0ICsgJGxlbjsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1lc3NhZ2VCZWdpbigmJG5hbWUsICYkdHlwZSwgJiRzZXFpZCkKKyAgICB7CisgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZEkzMigkc3opOworICAgICAgICBpZiAoJHN6IDwgMCkgeworICAgICAgICAgICAgJHZlcnNpb24gPSAoaW50KSgkc3ogJiBzZWxmOjpWRVJTSU9OX01BU0spOworICAgICAgICAgICAgaWYgKCR2ZXJzaW9uICE9IChpbnQpc2VsZjo6VkVSU0lPTl8xKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbignQmFkIHZlcnNpb24gaWRlbnRpZmllcjogJyAuICRzeiwgVFByb3RvY29sRXhjZXB0aW9uOjpCQURfVkVSU0lPTik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAkdHlwZSA9ICRzeiAmIDB4MDAwMDAwZmY7CisgICAgICAgICAgICAkcmVzdWx0ICs9CisgICAgICAgICAgICAgICAgJHRoaXMtPnJlYWRTdHJpbmcoJG5hbWUpICsKKyAgICAgICAgICAgICAgICAkdGhpcy0+cmVhZEkzMigkc2VxaWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCR0aGlzLT5zdHJpY3RSZWFkXykgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICdObyB2ZXJzaW9uIGlkZW50aWZpZXIsIG9sZCBwcm90b2NvbCBjbGllbnQ/JywKKyAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRXhjZXB0aW9uOjpCQURfVkVSU0lPTgorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBwcmUtdmVyc2lvbmVkIGlucHV0CisgICAgICAgICAgICAgICAgJG5hbWUgPSAkdGhpcy0+dHJhbnNfLT5yZWFkQWxsKCRzeik7CisgICAgICAgICAgICAgICAgJHJlc3VsdCArPQorICAgICAgICAgICAgICAgICAgICAkc3ogKworICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cmVhZEJ5dGUoJHR5cGUpICsKKyAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnJlYWRJMzIoJHNlcWlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cnVjdEJlZ2luKCYkbmFtZSkKKyAgICB7CisgICAgICAgICRuYW1lID0gJyc7CisKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRGaWVsZEJlZ2luKCYkbmFtZSwgJiRmaWVsZFR5cGUsICYkZmllbGRJZCkKKyAgICB7CisgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZEJ5dGUoJGZpZWxkVHlwZSk7CisgICAgICAgIGlmICgkZmllbGRUeXBlID09IFRUeXBlOjpTVE9QKSB7CisgICAgICAgICAgICAkZmllbGRJZCA9IDA7CisKKyAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OworICAgICAgICB9CisgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnJlYWRJMTYoJGZpZWxkSWQpOworCisgICAgICAgIHJldHVybiAkcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNYXBCZWdpbigmJGtleVR5cGUsICYkdmFsVHlwZSwgJiRzaXplKQorICAgIHsKKyAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAkdGhpcy0+cmVhZEJ5dGUoJGtleVR5cGUpICsKKyAgICAgICAgICAgICR0aGlzLT5yZWFkQnl0ZSgkdmFsVHlwZSkgKworICAgICAgICAgICAgJHRoaXMtPnJlYWRJMzIoJHNpemUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwRW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEJlZ2luKCYkZWxlbVR5cGUsICYkc2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybgorICAgICAgICAgICAgJHRoaXMtPnJlYWRCeXRlKCRlbGVtVHlwZSkgKworICAgICAgICAgICAgJHRoaXMtPnJlYWRJMzIoJHNpemUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEJlZ2luKCYkZWxlbVR5cGUsICYkc2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybgorICAgICAgICAgICAgJHRoaXMtPnJlYWRCeXRlKCRlbGVtVHlwZSkgKworICAgICAgICAgICAgJHRoaXMtPnJlYWRJMzIoJHNpemUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU2V0RW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQm9vbCgmJHZhbHVlKQorICAgIHsKKyAgICAgICAgJGRhdGEgPSAkdGhpcy0+dHJhbnNfLT5yZWFkQWxsKDEpOworICAgICAgICAkYXJyID0gdW5wYWNrKCdjJywgJGRhdGEpOworICAgICAgICAkdmFsdWUgPSAkYXJyWzFdID09IDE7CisKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRCeXRlKCYkdmFsdWUpCisgICAgeworICAgICAgICAkZGF0YSA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoMSk7CisgICAgICAgICRhcnIgPSB1bnBhY2soJ2MnLCAkZGF0YSk7CisgICAgICAgICR2YWx1ZSA9ICRhcnJbMV07CisKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJMTYoJiR2YWx1ZSkKKyAgICB7CisgICAgICAgICRkYXRhID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCgyKTsKKyAgICAgICAgJGFyciA9IHVucGFjaygnbicsICRkYXRhKTsKKyAgICAgICAgJHZhbHVlID0gJGFyclsxXTsKKyAgICAgICAgaWYgKCR2YWx1ZSA+IDB4N2ZmZikgeworICAgICAgICAgICAgJHZhbHVlID0gMCAtICgoJHZhbHVlIC0gMSkgXiAweGZmZmYpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJMzIoJiR2YWx1ZSkKKyAgICB7CisgICAgICAgICRkYXRhID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCg0KTsKKyAgICAgICAgJGFyciA9IHVucGFjaygnTicsICRkYXRhKTsKKyAgICAgICAgJHZhbHVlID0gJGFyclsxXTsKKyAgICAgICAgaWYgKCR2YWx1ZSA+IDB4N2ZmZmZmZmYpIHsKKyAgICAgICAgICAgICR2YWx1ZSA9IDAgLSAoKCR2YWx1ZSAtIDEpIF4gMHhmZmZmZmZmZik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gNDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEk2NCgmJHZhbHVlKQorICAgIHsKKyAgICAgICAgJGRhdGEgPSAkdGhpcy0+dHJhbnNfLT5yZWFkQWxsKDgpOworCisgICAgICAgICRhcnIgPSB1bnBhY2soJ04yJywgJGRhdGEpOworCisgICAgICAgIC8vIElmIHdlIGFyZSBvbiBhIDMyYml0IGFyY2hpdGVjdHVyZSB3ZSBoYXZlIHRvIGV4cGxpY2l0bHkgZGVhbCB3aXRoCisgICAgICAgIC8vIDY0LWJpdCB0d29zLWNvbXBsZW1lbnQgYXJpdGhtZXRpYyBzaW5jZSBQSFAgd2FudHMgdG8gdHJlYXQgYWxsIGludHMKKyAgICAgICAgLy8gYXMgc2lnbmVkIGFuZCBhbnkgaW50IG92ZXIgMl4zMSAtIDEgYXMgYSBmbG9hdAorICAgICAgICBpZiAoUEhQX0lOVF9TSVpFID09IDQpIHsKKyAgICAgICAgICAgICRoaSA9ICRhcnJbMV07CisgICAgICAgICAgICAkbG8gPSAkYXJyWzJdOworICAgICAgICAgICAgJGlzTmVnID0gJGhpIDwgMDsKKworICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGEgbmVnYXRpdmUKKyAgICAgICAgICAgIGlmICgkaXNOZWcpIHsKKyAgICAgICAgICAgICAgICAkaGkgPSB+JGhpICYgKGludCkweGZmZmZmZmZmOworICAgICAgICAgICAgICAgICRsbyA9IH4kbG8gJiAoaW50KTB4ZmZmZmZmZmY7CisKKyAgICAgICAgICAgICAgICBpZiAoJGxvID09IChpbnQpMHhmZmZmZmZmZikgeworICAgICAgICAgICAgICAgICAgICAkaGkrKzsKKyAgICAgICAgICAgICAgICAgICAgJGxvID0gMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkbG8rKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEZvcmNlIDMyYml0IHdvcmRzIGluIGV4Y2VzcyBvZiAyRyB0byBwZSBwb3NpdGl2ZSAtIHdlIGRlYWwgd2lnaCBzaWduCisgICAgICAgICAgICAvLyBleHBsaWNpdGx5IGJlbG93CisKKyAgICAgICAgICAgIGlmICgkaGkgJiAoaW50KTB4ODAwMDAwMDApIHsKKyAgICAgICAgICAgICAgICAkaGkgJj0gKGludCkweDdmZmZmZmZmOworICAgICAgICAgICAgICAgICRoaSArPSAweDgwMDAwMDAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoJGxvICYgKGludCkweDgwMDAwMDAwKSB7CisgICAgICAgICAgICAgICAgJGxvICY9IChpbnQpMHg3ZmZmZmZmZjsKKyAgICAgICAgICAgICAgICAkbG8gKz0gMHg4MDAwMDAwMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgJHZhbHVlID0gJGhpICogNDI5NDk2NzI5NiArICRsbzsKKworICAgICAgICAgICAgaWYgKCRpc05lZykgeworICAgICAgICAgICAgICAgICR2YWx1ZSA9IDAgLSAkdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBVcGNhc3QgbmVnYXRpdmVzIGluIExTQiBiaXQKKyAgICAgICAgICAgIGlmICgkYXJyWzJdICYgMHg4MDAwMDAwMCkgeworICAgICAgICAgICAgICAgICRhcnJbMl0gPSAkYXJyWzJdICYgMHhmZmZmZmZmZjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGEgbmVnYXRpdmUKKyAgICAgICAgICAgIGlmICgkYXJyWzFdICYgMHg4MDAwMDAwMCkgeworICAgICAgICAgICAgICAgICRhcnJbMV0gPSAkYXJyWzFdICYgMHhmZmZmZmZmZjsKKyAgICAgICAgICAgICAgICAkYXJyWzFdID0gJGFyclsxXSBeIDB4ZmZmZmZmZmY7CisgICAgICAgICAgICAgICAgJGFyclsyXSA9ICRhcnJbMl0gXiAweGZmZmZmZmZmOworICAgICAgICAgICAgICAgICR2YWx1ZSA9IDAgLSAkYXJyWzFdICogNDI5NDk2NzI5NiAtICRhcnJbMl0gLSAxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAkdmFsdWUgPSAkYXJyWzFdICogNDI5NDk2NzI5NiArICRhcnJbMl07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gODsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZERvdWJsZSgmJHZhbHVlKQorICAgIHsKKyAgICAgICAgJGRhdGEgPSBzdHJyZXYoJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCg4KSk7CisgICAgICAgICRhcnIgPSB1bnBhY2soJ2QnLCAkZGF0YSk7CisgICAgICAgICR2YWx1ZSA9ICRhcnJbMV07CisKKyAgICAgICAgcmV0dXJuIDg7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJpbmcoJiR2YWx1ZSkKKyAgICB7CisgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZEkzMigkbGVuKTsKKyAgICAgICAgaWYgKCRsZW4pIHsKKyAgICAgICAgICAgICR2YWx1ZSA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoJGxlbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkdmFsdWUgPSAnJzsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkcmVzdWx0ICsgJGxlbjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZC5waHAgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY3OTlhNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1Byb3RvY29sL1RCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkLnBocApAQCAtMCwwICsxLDY3IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFByb3RvY29sOworCit1c2UgVGhyaWZ0XFRyYW5zcG9ydFxUQnVmZmVyZWRUcmFuc3BvcnQ7CisKKy8qKgorICogQWNjZWxlcmF0ZWQgYmluYXJ5IHByb3RvY29sOiB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIHRocmlmdF9wcm90b2NvbAorICogZXh0ZW5zaW9uIGZvciBmYXN0ZXIgZGVzZXJpYWxpemF0aW9uCisgKi8KK2NsYXNzIFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIGV4dGVuZHMgVEJpbmFyeVByb3RvY29sCit7CisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCR0cmFucywgJHN0cmljdFJlYWQgPSBmYWxzZSwgJHN0cmljdFdyaXRlID0gdHJ1ZSkKKyAgICB7CisgICAgICAgIC8vIElmIHRoZSB0cmFuc3BvcnQgZG9lc24ndCBpbXBsZW1lbnQgcHV0QmFjaywgd3JhcCBpdCBpbiBhCisgICAgICAgIC8vIFRCdWZmZXJlZFRyYW5zcG9ydCAod2hpY2ggZG9lcykKKworICAgICAgICAvLyBOT1RFICh0LmhlaW50eik6IFRoaXMgaXMgdmVyeSBldmlsIHRvIGRvLCBiZWNhdXNlIHRoZSBUQnVmZmVyZWRUcmFuc3BvcnQgbWF5IHN3YWxsb3cgYnl0ZXMsIHdoaWNoCisgICAgICAgIC8vIGFyZSB0aGVuIG5ldmVyIHdyaXR0ZW4gdG8gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LiBUaGlzIGhhcHBlbnMgcHJlY2lzZWx5IHdoZW4gYSBudW1iZXIgb2YgYnl0ZXMKKyAgICAgICAgLy8gbGVzcyB0aGFuIHRoZSBtYXggYnVmZmVyIHNpemUgKDUxMiBieSBkZWZhdWx0KSBpcyB3cml0dGVuIHRvIHRoZSB0cmFuc3BvcnQgYW5kIHRoZW4gZmx1c2goKSBpcyBOT1QKKyAgICAgICAgLy8gY2FsbGVkLiBJbiB0aGF0IGNhc2UgdGhlIGRhdGEgc3RheXMgaW4gdGhlIHdyaXRlQnVmZmVyIG9mIHRoZSB0cmFuc3BvcnQsIGZyb20gd2hlcmUgaXQgY2FuIG5ldmVyIGJlCisgICAgICAgIC8vIGFjY2Vzc2VkIGFnYWluIChmb3IgZXhhbXBsZSB0aHJvdWdoIHJlYWQoKSkuCisgICAgICAgIC8vCisgICAgICAgIC8vIFNpbmNlIHRoZSBjYWxsZXIgb2YgdGhpcyBtZXRob2QgZG9lcyBub3Qga25vdyBhYm91dCB0aGUgd3JhcHBpbmcgdHJhbnNwb3J0LCB0aGlzIGNyZWF0ZXMgYnVncyB3aGljaAorICAgICAgICAvLyBhcmUgdmVyeSBkaWZmaWN1bHQgdG8gZmluZC4gSGVuY2UgdGhlIHdyYXBwaW5nIG9mIGEgdHJhbnNwb3J0IGluIGEgYnVmZmVyIHNob3VsZCBiZSBsZWZ0IHRvIHRoZQorICAgICAgICAvLyBjYWxsaW5nIGNvZGUuIEFuIGludGVyZmFjZSBjb3VsZCB1c2VkIHRvIG1hbmRhdGUgdGhlIHByZXNlbmNlIG9mIHRoZSBwdXRCYWNrKCkgbWV0aG9kIGluIHRoZSB0cmFuc3BvcnQuCisgICAgICAgIC8vCisgICAgICAgIC8vIEkgYW0gbGVhdmluZyB0aGlzIGNvZGUgaW4gbm9uZXRoZWxlc3MsIGJlY2F1c2UgdGhlcmUgbWF5IGJlIGFwcGxpY2F0aW9ucyBkZXBlbmRpbmcgb24gdGhpcyBiZWhhdmlvci4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gQHNlZSBUSFJJRlQtMTU3OQorCisgICAgICAgIGlmICghbWV0aG9kX2V4aXN0cygkdHJhbnMsICdwdXRCYWNrJykpIHsKKyAgICAgICAgICAgICR0cmFucyA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoJHRyYW5zKTsKKyAgICAgICAgfQorICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCR0cmFucywgJHN0cmljdFJlYWQsICRzdHJpY3RXcml0ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGlzU3RyaWN0UmVhZCgpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPnN0cmljdFJlYWRfOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBpc1N0cmljdFdyaXRlKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+c3RyaWN0V3JpdGVfOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wucGhwIGIvbGliL3BocC9saWIvUHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFmMmEyNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wucGhwCkBAIC0wLDAgKzEsNzM5IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFByb3RvY29sOworCit1c2UgVGhyaWZ0XFR5cGVcVFR5cGU7Cit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxUUHJvdG9jb2xFeGNlcHRpb247Cit1c2UgVGhyaWZ0XEZhY3RvcnlcVFN0cmluZ0Z1bmNGYWN0b3J5OworCisvKioKKyAqIENvbXBhY3QgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRocmlmdCBwcm90b2NvbC4KKyAqCisgKi8KK2NsYXNzIFRDb21wYWN0UHJvdG9jb2wgZXh0ZW5kcyBUUHJvdG9jb2wKK3sKKyAgICBjb25zdCBDT01QQUNUX1NUT1AgPSAweDAwOworICAgIGNvbnN0IENPTVBBQ1RfVFJVRSA9IDB4MDE7CisgICAgY29uc3QgQ09NUEFDVF9GQUxTRSA9IDB4MDI7CisgICAgY29uc3QgQ09NUEFDVF9CWVRFID0gMHgwMzsKKyAgICBjb25zdCBDT01QQUNUX0kxNiA9IDB4MDQ7CisgICAgY29uc3QgQ09NUEFDVF9JMzIgPSAweDA1OworICAgIGNvbnN0IENPTVBBQ1RfSTY0ID0gMHgwNjsKKyAgICBjb25zdCBDT01QQUNUX0RPVUJMRSA9IDB4MDc7CisgICAgY29uc3QgQ09NUEFDVF9CSU5BUlkgPSAweDA4OworICAgIGNvbnN0IENPTVBBQ1RfTElTVCA9IDB4MDk7CisgICAgY29uc3QgQ09NUEFDVF9TRVQgPSAweDBBOworICAgIGNvbnN0IENPTVBBQ1RfTUFQID0gMHgwQjsKKyAgICBjb25zdCBDT01QQUNUX1NUUlVDVCA9IDB4MEM7CisKKyAgICBjb25zdCBTVEFURV9DTEVBUiA9IDA7CisgICAgY29uc3QgU1RBVEVfRklFTERfV1JJVEUgPSAxOworICAgIGNvbnN0IFNUQVRFX1ZBTFVFX1dSSVRFID0gMjsKKyAgICBjb25zdCBTVEFURV9DT05UQUlORVJfV1JJVEUgPSAzOworICAgIGNvbnN0IFNUQVRFX0JPT0xfV1JJVEUgPSA0OworICAgIGNvbnN0IFNUQVRFX0ZJRUxEX1JFQUQgPSA1OworICAgIGNvbnN0IFNUQVRFX0NPTlRBSU5FUl9SRUFEID0gNjsKKyAgICBjb25zdCBTVEFURV9WQUxVRV9SRUFEID0gNzsKKyAgICBjb25zdCBTVEFURV9CT09MX1JFQUQgPSA4OworCisgICAgY29uc3QgVkVSU0lPTl9NQVNLID0gMHgxZjsKKyAgICBjb25zdCBWRVJTSU9OID0gMTsKKyAgICBjb25zdCBQUk9UT0NPTF9JRCA9IDB4ODI7CisgICAgY29uc3QgVFlQRV9NQVNLID0gMHhlMDsKKyAgICBjb25zdCBUWVBFX0JJVFMgPSAweDA3OworICAgIGNvbnN0IFRZUEVfU0hJRlRfQU1PVU5UID0gNTsKKworICAgIHByb3RlY3RlZCBzdGF0aWMgJGN0eXBlcyA9IGFycmF5KAorICAgICAgICBUVHlwZTo6U1RPUCA9PiBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX1NUT1AsCisgICAgICAgIFRUeXBlOjpCT09MID0+IFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfVFJVRSwgLy8gdXNlZCBmb3IgY29sbGVjdGlvbgorICAgICAgICBUVHlwZTo6QllURSA9PiBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX0JZVEUsCisgICAgICAgIFRUeXBlOjpJMTYgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9JMTYsCisgICAgICAgIFRUeXBlOjpJMzIgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9JMzIsCisgICAgICAgIFRUeXBlOjpJNjQgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9JNjQsCisgICAgICAgIFRUeXBlOjpET1VCTEUgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9ET1VCTEUsCisgICAgICAgIFRUeXBlOjpTVFJJTkcgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9CSU5BUlksCisgICAgICAgIFRUeXBlOjpTVFJVQ1QgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9TVFJVQ1QsCisgICAgICAgIFRUeXBlOjpMU1QgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9MSVNULAorICAgICAgICBUVHlwZTo6U0VUID0+IFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfU0VULAorICAgICAgICBUVHlwZTo6TUFQID0+IFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfTUFQLAorICAgICk7CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljICR0dHlwZXMgPSBhcnJheSgKKyAgICAgICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9TVE9QID0+IFRUeXBlOjpTVE9QLAorICAgICAgICBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX1RSVUUgPT4gVFR5cGU6OkJPT0wsIC8vIHVzZWQgZm9yIGNvbGxlY3Rpb24KKyAgICAgICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9GQUxTRSA9PiBUVHlwZTo6Qk9PTCwKKyAgICAgICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9CWVRFID0+IFRUeXBlOjpCWVRFLAorICAgICAgICBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX0kxNiA9PiBUVHlwZTo6STE2LAorICAgICAgICBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX0kzMiA9PiBUVHlwZTo6STMyLAorICAgICAgICBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX0k2NCA9PiBUVHlwZTo6STY0LAorICAgICAgICBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX0RPVUJMRSA9PiBUVHlwZTo6RE9VQkxFLAorICAgICAgICBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX0JJTkFSWSA9PiBUVHlwZTo6U1RSSU5HLAorICAgICAgICBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX1NUUlVDVCA9PiBUVHlwZTo6U1RSVUNULAorICAgICAgICBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX0xJU1QgPT4gVFR5cGU6OkxTVCwKKyAgICAgICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9TRVQgPT4gVFR5cGU6OlNFVCwKKyAgICAgICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9NQVAgPT4gVFR5cGU6Ok1BUCwKKyAgICApOworCisgICAgcHJvdGVjdGVkICRzdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0NMRUFSOworICAgIHByb3RlY3RlZCAkbGFzdEZpZCA9IDA7CisgICAgcHJvdGVjdGVkICRib29sRmlkID0gbnVsbDsKKyAgICBwcm90ZWN0ZWQgJGJvb2xWYWx1ZSA9IG51bGw7CisgICAgcHJvdGVjdGVkICRzdHJ1Y3RzID0gYXJyYXkoKTsKKyAgICBwcm90ZWN0ZWQgJGNvbnRhaW5lcnMgPSBhcnJheSgpOworCisgICAgLy8gU29tZSB2YXJpbnQgLyB6aWd6YWcgaGVscGVyIG1ldGhvZHMKKyAgICBwdWJsaWMgZnVuY3Rpb24gdG9aaWdaYWcoJG4sICRiaXRzKQorICAgIHsKKyAgICAgICAgcmV0dXJuICgkbiA8PCAxKSBeICgkbiA+PiAoJGJpdHMgLSAxKSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGZyb21aaWdaYWcoJG4pCisgICAgeworICAgICAgICByZXR1cm4gKCRuID4+IDEpIF4gLSgkbiAmIDEpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRWYXJpbnQoJGRhdGEpCisgICAgeworICAgICAgICAkb3V0ID0gIiI7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBpZiAoKCRkYXRhICYgfjB4N2YpID09PSAwKSB7CisgICAgICAgICAgICAgICAgJG91dCAuPSBjaHIoJGRhdGEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAkb3V0IC49IGNocigoJGRhdGEgJiAweGZmKSB8IDB4ODApOworICAgICAgICAgICAgICAgICRkYXRhID0gJGRhdGEgPj4gNzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkb3V0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVZhcmludCgkZGF0YSkKKyAgICB7CisgICAgICAgICRvdXQgPSAkdGhpcy0+Z2V0VmFyaW50KCRkYXRhKTsKKyAgICAgICAgJHJlc3VsdCA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkb3V0KTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJG91dCwgJHJlc3VsdCk7CisKKyAgICAgICAgcmV0dXJuICRyZXN1bHQ7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRWYXJpbnQoJiRyZXN1bHQpCisgICAgeworICAgICAgICAkaWR4ID0gMDsKKyAgICAgICAgJHNoaWZ0ID0gMDsKKyAgICAgICAgJHJlc3VsdCA9IDA7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAkeCA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoMSk7CisgICAgICAgICAgICAkYXJyID0gdW5wYWNrKCdDJywgJHgpOworICAgICAgICAgICAgJGJ5dGUgPSAkYXJyWzFdOworICAgICAgICAgICAgJGlkeCArPSAxOworICAgICAgICAgICAgJHJlc3VsdCB8PSAoJGJ5dGUgJiAweDdmKSA8PCAkc2hpZnQ7CisgICAgICAgICAgICBpZiAoKCRieXRlID4+IDcpID09PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICRpZHg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAkc2hpZnQgKz0gNzsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkaWR4OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdHJhbnMpCisgICAgeworICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCR0cmFucyk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUJlZ2luKCRuYW1lLCAkdHlwZSwgJHNlcWlkKQorICAgIHsKKyAgICAgICAgJHdyaXR0ZW4gPQorICAgICAgICAgICAgJHRoaXMtPndyaXRlVUJ5dGUoVENvbXBhY3RQcm90b2NvbDo6UFJPVE9DT0xfSUQpICsKKyAgICAgICAgICAgICR0aGlzLT53cml0ZVVCeXRlKFRDb21wYWN0UHJvdG9jb2w6OlZFUlNJT04gfAorICAgICAgICAgICAgICAgICgkdHlwZSA8PCBUQ29tcGFjdFByb3RvY29sOjpUWVBFX1NISUZUX0FNT1VOVCkpICsKKyAgICAgICAgICAgICR0aGlzLT53cml0ZVZhcmludCgkc2VxaWQpICsKKyAgICAgICAgICAgICR0aGlzLT53cml0ZVN0cmluZygkbmFtZSk7CisgICAgICAgICR0aGlzLT5zdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX1ZBTFVFX1dSSVRFOworCisgICAgICAgIHJldHVybiAkd3JpdHRlbjsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlRW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5zdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0NMRUFSOworCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEJlZ2luKCRuYW1lKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnN0cnVjdHNbXSA9IGFycmF5KCR0aGlzLT5zdGF0ZSwgJHRoaXMtPmxhc3RGaWQpOworICAgICAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9GSUVMRF9XUklURTsKKyAgICAgICAgJHRoaXMtPmxhc3RGaWQgPSAwOworCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEVuZCgpCisgICAgeworICAgICAgICAkb2xkX3ZhbHVlcyA9IGFycmF5X3BvcCgkdGhpcy0+c3RydWN0cyk7CisgICAgICAgICR0aGlzLT5zdGF0ZSA9ICRvbGRfdmFsdWVzWzBdOworICAgICAgICAkdGhpcy0+bGFzdEZpZCA9ICRvbGRfdmFsdWVzWzFdOworCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkU3RvcCgpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPndyaXRlQnl0ZSgwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEhlYWRlcigkdHlwZSwgJGZpZCkKKyAgICB7CisgICAgICAgICR3cml0dGVuID0gMDsKKyAgICAgICAgJGRlbHRhID0gJGZpZCAtICR0aGlzLT5sYXN0RmlkOworICAgICAgICBpZiAoMCA8ICRkZWx0YSAmJiAkZGVsdGEgPD0gMTUpIHsKKyAgICAgICAgICAgICR3cml0dGVuID0gJHRoaXMtPndyaXRlVUJ5dGUoKCRkZWx0YSA8PCA0KSB8ICR0eXBlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR3cml0dGVuID0gJHRoaXMtPndyaXRlQnl0ZSgkdHlwZSkgKworICAgICAgICAgICAgICAgICR0aGlzLT53cml0ZUkxNigkZmlkKTsKKyAgICAgICAgfQorICAgICAgICAkdGhpcy0+bGFzdEZpZCA9ICRmaWQ7CisKKyAgICAgICAgcmV0dXJuICR3cml0dGVuOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkQmVnaW4oJGZpZWxkX25hbWUsICRmaWVsZF90eXBlLCAkZmllbGRfaWQpCisgICAgeworICAgICAgICBpZiAoJGZpZWxkX3R5cGUgPT0gVFRZUEU6OkJPT0wpIHsKKyAgICAgICAgICAgICR0aGlzLT5zdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0JPT0xfV1JJVEU7CisgICAgICAgICAgICAkdGhpcy0+Ym9vbEZpZCA9ICRmaWVsZF9pZDsKKworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9WQUxVRV9XUklURTsKKworICAgICAgICAgICAgcmV0dXJuICR0aGlzLT53cml0ZUZpZWxkSGVhZGVyKHNlbGY6OiRjdHlwZXNbJGZpZWxkX3R5cGVdLCAkZmllbGRfaWQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRFbmQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnN0YXRlID0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfRklFTERfV1JJVEU7CisKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQ29sbGVjdGlvbkJlZ2luKCRldHlwZSwgJHNpemUpCisgICAgeworICAgICAgICAkd3JpdHRlbiA9IDA7CisgICAgICAgIGlmICgkc2l6ZSA8PSAxNCkgeworICAgICAgICAgICAgJHdyaXR0ZW4gPSAkdGhpcy0+d3JpdGVVQnl0ZSgkc2l6ZSA8PCA0IHwKKyAgICAgICAgICAgICAgICBzZWxmOjokY3R5cGVzWyRldHlwZV0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHdyaXR0ZW4gPSAkdGhpcy0+d3JpdGVVQnl0ZSgweGYwIHwKKyAgICAgICAgICAgICAgICAgICAgc2VsZjo6JGN0eXBlc1skZXR5cGVdKSArCisgICAgICAgICAgICAgICAgJHRoaXMtPndyaXRlVmFyaW50KCRzaXplKTsKKyAgICAgICAgfQorICAgICAgICAkdGhpcy0+Y29udGFpbmVyc1tdID0gJHRoaXMtPnN0YXRlOworICAgICAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9DT05UQUlORVJfV1JJVEU7CisKKyAgICAgICAgcmV0dXJuICR3cml0dGVuOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEJlZ2luKCRrZXlfdHlwZSwgJHZhbF90eXBlLCAkc2l6ZSkKKyAgICB7CisgICAgICAgICR3cml0dGVuID0gMDsKKyAgICAgICAgaWYgKCRzaXplID09IDApIHsKKyAgICAgICAgICAgICR3cml0dGVuID0gJHRoaXMtPndyaXRlQnl0ZSgwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR3cml0dGVuID0gJHRoaXMtPndyaXRlVmFyaW50KCRzaXplKSArCisgICAgICAgICAgICAgICAgJHRoaXMtPndyaXRlVUJ5dGUoc2VsZjo6JGN0eXBlc1ska2V5X3R5cGVdIDw8IDQgfAorICAgICAgICAgICAgICAgICAgICBzZWxmOjokY3R5cGVzWyR2YWxfdHlwZV0pOworICAgICAgICB9CisgICAgICAgICR0aGlzLT5jb250YWluZXJzW10gPSAkdGhpcy0+c3RhdGU7CisKKyAgICAgICAgcmV0dXJuICR3cml0dGVuOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUNvbGxlY3Rpb25FbmQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnN0YXRlID0gYXJyYXlfcG9wKCR0aGlzLT5jb250YWluZXJzKTsKKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT53cml0ZUNvbGxlY3Rpb25FbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0QmVnaW4oJGVsZW1fdHlwZSwgJHNpemUpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPndyaXRlQ29sbGVjdGlvbkJlZ2luKCRlbGVtX3R5cGUsICRzaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0RW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+d3JpdGVDb2xsZWN0aW9uRW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0QmVnaW4oJGVsZW1fdHlwZSwgJHNpemUpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPndyaXRlQ29sbGVjdGlvbkJlZ2luKCRlbGVtX3R5cGUsICRzaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT53cml0ZUNvbGxlY3Rpb25FbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCb29sKCR2YWx1ZSkKKyAgICB7CisgICAgICAgIGlmICgkdGhpcy0+c3RhdGUgPT0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfQk9PTF9XUklURSkgeworICAgICAgICAgICAgJGN0eXBlID0gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9GQUxTRTsKKyAgICAgICAgICAgIGlmICgkdmFsdWUpIHsKKyAgICAgICAgICAgICAgICAkY3R5cGUgPSBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX1RSVUU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiAkdGhpcy0+d3JpdGVGaWVsZEhlYWRlcigkY3R5cGUsICR0aGlzLT5ib29sRmlkKTsKKyAgICAgICAgfSBlbHNlaWYgKCR0aGlzLT5zdGF0ZSA9PSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9DT05UQUlORVJfV1JJVEUpIHsKKyAgICAgICAgICAgIHJldHVybiAkdGhpcy0+d3JpdGVCeXRlKCR2YWx1ZSA/IDEgOiAwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oJ0ludmFsaWQgc3RhdGUgaW4gY29tcGFjdCBwcm90b2NvbCcpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQnl0ZSgkdmFsdWUpCisgICAgeworICAgICAgICAkZGF0YSA9IHBhY2soJ2MnLCAkdmFsdWUpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkZGF0YSwgMSk7CisKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlVUJ5dGUoJGJ5dGUpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShwYWNrKCdDJywgJGJ5dGUpLCAxKTsKKworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMTYoJHZhbHVlKQorICAgIHsKKyAgICAgICAgJHRoaW5nID0gJHRoaXMtPnRvWmlnWmFnKCR2YWx1ZSwgMTYpOworCisgICAgICAgIHJldHVybiAkdGhpcy0+d3JpdGVWYXJpbnQoJHRoaW5nKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMzIoJHZhbHVlKQorICAgIHsKKyAgICAgICAgJHRoaW5nID0gJHRoaXMtPnRvWmlnWmFnKCR2YWx1ZSwgMzIpOworCisgICAgICAgIHJldHVybiAkdGhpcy0+d3JpdGVWYXJpbnQoJHRoaW5nKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVEb3VibGUoJHZhbHVlKQorICAgIHsKKyAgICAgICAgJGRhdGEgPSBwYWNrKCdkJywgJHZhbHVlKTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJGRhdGEsIDgpOworCisgICAgICAgIHJldHVybiA4OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cmluZygkdmFsdWUpCisgICAgeworICAgICAgICAkbGVuID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR2YWx1ZSk7CisgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+d3JpdGVWYXJpbnQoJGxlbik7CisgICAgICAgIGlmICgkbGVuKSB7CisgICAgICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkdmFsdWUsICRsZW4pOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICRyZXN1bHQgKyAkbGVuOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRCZWdpbigmJG5hbWUsICYkZmllbGRfdHlwZSwgJiRmaWVsZF9pZCkKKyAgICB7CisgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZFVCeXRlKCRjb21wYWN0X3R5cGVfYW5kX2RlbHRhKTsKKworICAgICAgICAkY29tcGFjdF90eXBlID0gJGNvbXBhY3RfdHlwZV9hbmRfZGVsdGEgJiAweDBmOworCisgICAgICAgIGlmICgkY29tcGFjdF90eXBlID09IFRUeXBlOjpTVE9QKSB7CisgICAgICAgICAgICAkZmllbGRfdHlwZSA9ICRjb21wYWN0X3R5cGU7CisgICAgICAgICAgICAkZmllbGRfaWQgPSAwOworCisgICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICAkZGVsdGEgPSAkY29tcGFjdF90eXBlX2FuZF9kZWx0YSA+PiA0OworICAgICAgICBpZiAoJGRlbHRhID09IDApIHsKKyAgICAgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnJlYWRJMTYoJGZpZWxkX2lkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRmaWVsZF9pZCA9ICR0aGlzLT5sYXN0RmlkICsgJGRlbHRhOworICAgICAgICB9CisgICAgICAgICR0aGlzLT5sYXN0RmlkID0gJGZpZWxkX2lkOworICAgICAgICAkZmllbGRfdHlwZSA9ICR0aGlzLT5nZXRUVHlwZSgkY29tcGFjdF90eXBlKTsKKworICAgICAgICBpZiAoJGNvbXBhY3RfdHlwZSA9PSBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX1RSVUUpIHsKKyAgICAgICAgICAgICR0aGlzLT5zdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0JPT0xfUkVBRDsKKyAgICAgICAgICAgICR0aGlzLT5ib29sVmFsdWUgPSB0cnVlOworICAgICAgICB9IGVsc2VpZiAoJGNvbXBhY3RfdHlwZSA9PSBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX0ZBTFNFKSB7CisgICAgICAgICAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9CT09MX1JFQUQ7CisgICAgICAgICAgICAkdGhpcy0+Ym9vbFZhbHVlID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9WQUxVRV9SRUFEOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICRyZXN1bHQ7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRGaWVsZEVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9GSUVMRF9SRUFEOworCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkVUJ5dGUoJiR2YWx1ZSkKKyAgICB7CisgICAgICAgICRkYXRhID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCgxKTsKKyAgICAgICAgJGFyciA9IHVucGFjaygnQycsICRkYXRhKTsKKyAgICAgICAgJHZhbHVlID0gJGFyclsxXTsKKworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJ5dGUoJiR2YWx1ZSkKKyAgICB7CisgICAgICAgICRkYXRhID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCgxKTsKKyAgICAgICAgJGFyciA9IHVucGFjaygnYycsICRkYXRhKTsKKyAgICAgICAgJHZhbHVlID0gJGFyclsxXTsKKworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFppZ1phZygmJHZhbHVlKQorICAgIHsKKyAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5yZWFkVmFyaW50KCR2YWx1ZSk7CisgICAgICAgICR2YWx1ZSA9ICR0aGlzLT5mcm9tWmlnWmFnKCR2YWx1ZSk7CisKKyAgICAgICAgcmV0dXJuICRyZXN1bHQ7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlQmVnaW4oJiRuYW1lLCAmJHR5cGUsICYkc2VxaWQpCisgICAgeworICAgICAgICAkcHJvdG9JZCA9IDA7CisgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZFVCeXRlKCRwcm90b0lkKTsKKyAgICAgICAgaWYgKCRwcm90b0lkICE9IFRDb21wYWN0UHJvdG9jb2w6OlBST1RPQ09MX0lEKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCdCYWQgcHJvdG9jb2wgaWQgaW4gVENvbXBhY3QgbWVzc2FnZScpOworICAgICAgICB9CisgICAgICAgICR2ZXJUeXBlID0gMDsKKyAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZFVCeXRlKCR2ZXJUeXBlKTsKKyAgICAgICAgJHR5cGUgPSAoJHZlclR5cGUgPj4gVENvbXBhY3RQcm90b2NvbDo6VFlQRV9TSElGVF9BTU9VTlQpICYgVENvbXBhY3RQcm90b2NvbDo6VFlQRV9CSVRTOworICAgICAgICAkdmVyc2lvbiA9ICR2ZXJUeXBlICYgVENvbXBhY3RQcm90b2NvbDo6VkVSU0lPTl9NQVNLOworICAgICAgICBpZiAoJHZlcnNpb24gIT0gVENvbXBhY3RQcm90b2NvbDo6VkVSU0lPTikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbignQmFkIHZlcnNpb24gaW4gVENvbXBhY3QgbWVzc2FnZScpOworICAgICAgICB9CisgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnJlYWRWYXJpbnQoJHNlcWlkKTsKKyAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZFN0cmluZygkbmFtZSk7CisKKyAgICAgICAgcmV0dXJuICRyZXN1bHQ7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlRW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0QmVnaW4oJiRuYW1lKQorICAgIHsKKyAgICAgICAgJG5hbWUgPSAnJzsgLy8gdW51c2VkCisgICAgICAgICR0aGlzLT5zdHJ1Y3RzW10gPSBhcnJheSgkdGhpcy0+c3RhdGUsICR0aGlzLT5sYXN0RmlkKTsKKyAgICAgICAgJHRoaXMtPnN0YXRlID0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfRklFTERfUkVBRDsKKyAgICAgICAgJHRoaXMtPmxhc3RGaWQgPSAwOworCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0RW5kKCkKKyAgICB7CisgICAgICAgICRsYXN0ID0gYXJyYXlfcG9wKCR0aGlzLT5zdHJ1Y3RzKTsKKyAgICAgICAgJHRoaXMtPnN0YXRlID0gJGxhc3RbMF07CisgICAgICAgICR0aGlzLT5sYXN0RmlkID0gJGxhc3RbMV07CisKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRDb2xsZWN0aW9uQmVnaW4oJiR0eXBlLCAmJHNpemUpCisgICAgeworICAgICAgICAkc2l6ZVR5cGUgPSAwOworICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRVQnl0ZSgkc2l6ZVR5cGUpOworICAgICAgICAkc2l6ZSA9ICRzaXplVHlwZSA+PiA0OworICAgICAgICAkdHlwZSA9ICR0aGlzLT5nZXRUVHlwZSgkc2l6ZVR5cGUpOworICAgICAgICBpZiAoJHNpemUgPT0gMTUpIHsKKyAgICAgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnJlYWRWYXJpbnQoJHNpemUpOworICAgICAgICB9CisgICAgICAgICR0aGlzLT5jb250YWluZXJzW10gPSAkdGhpcy0+c3RhdGU7CisgICAgICAgICR0aGlzLT5zdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0NPTlRBSU5FUl9SRUFEOworCisgICAgICAgIHJldHVybiAkcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwQmVnaW4oJiRrZXlfdHlwZSwgJiR2YWxfdHlwZSwgJiRzaXplKQorICAgIHsKKyAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5yZWFkVmFyaW50KCRzaXplKTsKKyAgICAgICAgJHR5cGVzID0gMDsKKyAgICAgICAgaWYgKCRzaXplID4gMCkgeworICAgICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZFVCeXRlKCR0eXBlcyk7CisgICAgICAgIH0KKyAgICAgICAgJHZhbF90eXBlID0gJHRoaXMtPmdldFRUeXBlKCR0eXBlcyk7CisgICAgICAgICRrZXlfdHlwZSA9ICR0aGlzLT5nZXRUVHlwZSgkdHlwZXMgPj4gNCk7CisgICAgICAgICR0aGlzLT5jb250YWluZXJzW10gPSAkdGhpcy0+c3RhdGU7CisgICAgICAgICR0aGlzLT5zdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0NPTlRBSU5FUl9SRUFEOworCisgICAgICAgIHJldHVybiAkcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQ29sbGVjdGlvbkVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+c3RhdGUgPSBhcnJheV9wb3AoJHRoaXMtPmNvbnRhaW5lcnMpOworCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwRW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+cmVhZENvbGxlY3Rpb25FbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RCZWdpbigmJGVsZW1fdHlwZSwgJiRzaXplKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5yZWFkQ29sbGVjdGlvbkJlZ2luKCRlbGVtX3R5cGUsICRzaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5yZWFkQ29sbGVjdGlvbkVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU2V0QmVnaW4oJiRlbGVtX3R5cGUsICYkc2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+cmVhZENvbGxlY3Rpb25CZWdpbigkZWxlbV90eXBlLCAkc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5yZWFkQ29sbGVjdGlvbkVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQm9vbCgmJHZhbHVlKQorICAgIHsKKyAgICAgICAgaWYgKCR0aGlzLT5zdGF0ZSA9PSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9CT09MX1JFQUQpIHsKKyAgICAgICAgICAgICR2YWx1ZSA9ICR0aGlzLT5ib29sVmFsdWU7CisKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2VpZiAoJHRoaXMtPnN0YXRlID09IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0NPTlRBSU5FUl9SRUFEKSB7CisgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJlYWRCeXRlKCR2YWx1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCdJbnZhbGlkIHN0YXRlIGluIGNvbXBhY3QgcHJvdG9jb2wnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTE2KCYkdmFsdWUpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPnJlYWRaaWdaYWcoJHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEkzMigmJHZhbHVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5yZWFkWmlnWmFnKCR2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWREb3VibGUoJiR2YWx1ZSkKKyAgICB7CisgICAgICAgICRkYXRhID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCg4KTsKKyAgICAgICAgJGFyciA9IHVucGFjaygnZCcsICRkYXRhKTsKKyAgICAgICAgJHZhbHVlID0gJGFyclsxXTsKKworICAgICAgICByZXR1cm4gODsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cmluZygmJHZhbHVlKQorICAgIHsKKyAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5yZWFkVmFyaW50KCRsZW4pOworICAgICAgICBpZiAoJGxlbikgeworICAgICAgICAgICAgJHZhbHVlID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCgkbGVuKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR2YWx1ZSA9ICcnOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICRyZXN1bHQgKyAkbGVuOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRUVHlwZSgkYnl0ZSkKKyAgICB7CisgICAgICAgIHJldHVybiBzZWxmOjokdHR5cGVzWyRieXRlICYgMHgwZl07CisgICAgfQorCisgICAgLy8gSWYgd2UgYXJlIG9uIGEgMzJiaXQgYXJjaGl0ZWN0dXJlIHdlIGhhdmUgdG8gZXhwbGljaXRseSBkZWFsIHdpdGgKKyAgICAvLyA2NC1iaXQgdHdvcy1jb21wbGVtZW50IGFyaXRobWV0aWMgc2luY2UgUEhQIHdhbnRzIHRvIHRyZWF0IGFsbCBpbnRzCisgICAgLy8gYXMgc2lnbmVkIGFuZCBhbnkgaW50IG92ZXIgMl4zMSAtIDEgYXMgYSBmbG9hdAorCisgICAgLy8gUmVhZCBhbmQgd3JpdGUgSTY0IGFzIHR3byAzMiBiaXQgbnVtYmVycyAkaGkgYW5kICRsbworCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJNjQoJiR2YWx1ZSkKKyAgICB7CisgICAgICAgIC8vIFJlYWQgdmFyaW50IGZyb20gd2lyZQorICAgICAgICAkaGkgPSAwOworICAgICAgICAkbG8gPSAwOworCisgICAgICAgICRpZHggPSAwOworICAgICAgICAkc2hpZnQgPSAwOworCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAkeCA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoMSk7CisgICAgICAgICAgICAkYXJyID0gdW5wYWNrKCdDJywgJHgpOworICAgICAgICAgICAgJGJ5dGUgPSAkYXJyWzFdOworICAgICAgICAgICAgJGlkeCArPSAxOworICAgICAgICAgICAgLy8gU2hpZnQgaGkgYW5kIGxvIHRvZ2V0aGVyLgorICAgICAgICAgICAgaWYgKCRzaGlmdCA8IDI4KSB7CisgICAgICAgICAgICAgICAgJGxvIHw9ICgoJGJ5dGUgJiAweDdmKSA8PCAkc2hpZnQpOworICAgICAgICAgICAgfSBlbHNlaWYgKCRzaGlmdCA9PSAyOCkgeworICAgICAgICAgICAgICAgICRsbyB8PSAoKCRieXRlICYgMHgwZikgPDwgMjgpOworICAgICAgICAgICAgICAgICRoaSB8PSAoKCRieXRlICYgMHg3MCkgPj4gNCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICRoaSB8PSAoKCRieXRlICYgMHg3ZikgPDwgKCRzaGlmdCAtIDMyKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKCRieXRlID4+IDcpID09PSAwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAkc2hpZnQgKz0gNzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vdywgdW56aWcgaXQuCisgICAgICAgICR4b3JlciA9IDA7CisgICAgICAgIGlmICgkbG8gJiAxKSB7CisgICAgICAgICAgICAkeG9yZXIgPSAweGZmZmZmZmZmOworICAgICAgICB9CisgICAgICAgICRsbyA9ICgkbG8gPj4gMSkgJiAweDdmZmZmZmZmOworICAgICAgICAkbG8gPSAkbG8gfCAoKCRoaSAmIDEpIDw8IDMxKTsKKyAgICAgICAgJGhpID0gKCRoaSA+PiAxKSBeICR4b3JlcjsKKyAgICAgICAgJGxvID0gJGxvIF4gJHhvcmVyOworCisgICAgICAgIC8vIE5vdyBwdXQgJGhpIGFuZCAkbG8gYmFjayB0b2dldGhlcgorICAgICAgICAkaXNOZWcgPSAkaGkgPCAwIHx8ICRoaSAmIDB4ODAwMDAwMDA7CisKKyAgICAgICAgLy8gQ2hlY2sgZm9yIGEgbmVnYXRpdmUKKyAgICAgICAgaWYgKCRpc05lZykgeworICAgICAgICAgICAgJGhpID0gfiRoaSAmIChpbnQpMHhmZmZmZmZmZjsKKyAgICAgICAgICAgICRsbyA9IH4kbG8gJiAoaW50KTB4ZmZmZmZmZmY7CisKKyAgICAgICAgICAgIGlmICgkbG8gPT0gKGludCkweGZmZmZmZmZmKSB7CisgICAgICAgICAgICAgICAgJGhpKys7CisgICAgICAgICAgICAgICAgJGxvID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgJGxvKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBGb3JjZSAzMmJpdCB3b3JkcyBpbiBleGNlc3Mgb2YgMkcgdG8gYmUgcG9zaXRpdmUgLSB3ZSBkZWFsIHdpdGggc2lnbgorICAgICAgICAvLyBleHBsaWNpdGx5IGJlbG93CisKKyAgICAgICAgaWYgKCRoaSAmIChpbnQpMHg4MDAwMDAwMCkgeworICAgICAgICAgICAgJGhpICY9IChpbnQpMHg3ZmZmZmZmZjsKKyAgICAgICAgICAgICRoaSArPSAweDgwMDAwMDAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCRsbyAmIChpbnQpMHg4MDAwMDAwMCkgeworICAgICAgICAgICAgJGxvICY9IChpbnQpMHg3ZmZmZmZmZjsKKyAgICAgICAgICAgICRsbyArPSAweDgwMDAwMDAwOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ3JlYXRlIGFzIG5lZ2F0aXZlIHZhbHVlIGZpcnN0LCBzaW5jZSB3ZSBjYW4gc3RvcmUgLTJeNjMgYnV0IG5vdCAyXjYzCisgICAgICAgICR2YWx1ZSA9IC0kaGkgKiA0Mjk0OTY3Mjk2IC0gJGxvOworCisgICAgICAgIGlmICghJGlzTmVnKSB7CisgICAgICAgICAgICAkdmFsdWUgPSAtJHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICRpZHg7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTY0KCR2YWx1ZSkKKyAgICB7CisgICAgICAgIC8vIElmIHdlIGFyZSBpbiBhbiBJMzIgcmFuZ2UsIHVzZSB0aGUgZWFzeSBtZXRob2QgYmVsb3cuCisgICAgICAgIGlmICgoJHZhbHVlID4gNDI5NDk2NzI5NikgfHwgKCR2YWx1ZSA8IC00Mjk0OTY3Mjk2KSkgeworICAgICAgICAgICAgLy8gQ29udmVydCAkdmFsdWUgdG8gJGhpIGFuZCAkbG8KKyAgICAgICAgICAgICRuZWcgPSAkdmFsdWUgPCAwOworCisgICAgICAgICAgICBpZiAoJG5lZykgeworICAgICAgICAgICAgICAgICR2YWx1ZSAqPSAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgJGhpID0gKGludCkkdmFsdWUgPj4gMzI7CisgICAgICAgICAgICAkbG8gPSAoaW50KSR2YWx1ZSAmIDB4ZmZmZmZmZmY7CisKKyAgICAgICAgICAgIGlmICgkbmVnKSB7CisgICAgICAgICAgICAgICAgJGhpID0gfiRoaTsKKyAgICAgICAgICAgICAgICAkbG8gPSB+JGxvOworICAgICAgICAgICAgICAgIGlmICgoJGxvICYgKGludCkweGZmZmZmZmZmKSA9PSAoaW50KTB4ZmZmZmZmZmYpIHsKKyAgICAgICAgICAgICAgICAgICAgJGxvID0gMDsKKyAgICAgICAgICAgICAgICAgICAgJGhpKys7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJGxvKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBOb3cgZG8gdGhlIHppZ2dpbmcgYW5kIHphZ2dpbmcuCisgICAgICAgICAgICAkeG9yZXIgPSAwOworICAgICAgICAgICAgaWYgKCRuZWcpIHsKKyAgICAgICAgICAgICAgICAkeG9yZXIgPSAweGZmZmZmZmZmOworICAgICAgICAgICAgfQorICAgICAgICAgICAgJGxvd2JpdCA9ICgkbG8gPj4gMzEpICYgMTsKKyAgICAgICAgICAgICRoaSA9ICgkaGkgPDwgMSkgfCAkbG93Yml0OworICAgICAgICAgICAgJGxvID0gKCRsbyA8PCAxKTsKKyAgICAgICAgICAgICRsbyA9ICgkbG8gXiAkeG9yZXIpICYgMHhmZmZmZmZmZjsKKyAgICAgICAgICAgICRoaSA9ICgkaGkgXiAkeG9yZXIpICYgMHhmZmZmZmZmZjsKKworICAgICAgICAgICAgLy8gbm93IHdyaXRlIG91dCB0aGUgdmFyaW50LCBlbnN1cmluZyB3ZSBzaGlmdCBib3RoIGhpIGFuZCBsbworICAgICAgICAgICAgJG91dCA9ICIiOworICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICBpZiAoKCRsbyAmIH4weDdmKSA9PT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAkaGkgPT09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgJG91dCAuPSBjaHIoJGxvKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJG91dCAuPSBjaHIoKCRsbyAmIDB4ZmYpIHwgMHg4MCk7CisgICAgICAgICAgICAgICAgICAgICRsbyA9ICRsbyA+PiA3OworICAgICAgICAgICAgICAgICAgICAkbG8gPSAkbG8gfCAoJGhpIDw8IDI1KTsKKyAgICAgICAgICAgICAgICAgICAgJGhpID0gJGhpID4+IDc7CisgICAgICAgICAgICAgICAgICAgIC8vIFJpZ2h0IHNoaWZ0IGNhcnJpZXMgc2lnbiwgYnV0IHdlIGRvbid0IHdhbnQgaXQgdG8uCisgICAgICAgICAgICAgICAgICAgICRoaSA9ICRoaSAmICgxMjcgPDwgMjUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgJHJldCA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkb3V0KTsKKyAgICAgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKCRvdXQsICRyZXQpOworCisgICAgICAgICAgICByZXR1cm4gJHJldDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAkdGhpcy0+d3JpdGVWYXJpbnQoJHRoaXMtPnRvWmlnWmFnKCR2YWx1ZSwgNjQpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1Byb3RvY29sL1RKU09OUHJvdG9jb2wucGhwIGIvbGliL3BocC9saWIvUHJvdG9jb2wvVEpTT05Qcm90b2NvbC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE0NDg4NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1Byb3RvY29sL1RKU09OUHJvdG9jb2wucGhwCkBAIC0wLDAgKzEsODE1IEBACis8P3BocAorCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2w7CisKK3VzZSBUaHJpZnRcVHlwZVxUVHlwZTsKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRQcm90b2NvbEV4Y2VwdGlvbjsKK3VzZSBUaHJpZnRcUHJvdG9jb2xcSlNPTlxCYXNlQ29udGV4dDsKK3VzZSBUaHJpZnRcUHJvdG9jb2xcSlNPTlxMb29rYWhlYWRSZWFkZXI7Cit1c2UgVGhyaWZ0XFByb3RvY29sXEpTT05cUGFpckNvbnRleHQ7Cit1c2UgVGhyaWZ0XFByb3RvY29sXEpTT05cTGlzdENvbnRleHQ7CisKKy8qKgorICogSlNPTiBpbXBsZW1lbnRhdGlvbiBvZiB0aHJpZnQgcHJvdG9jb2wsIHBvcnRlZCBmcm9tIEphdmEuCisgKi8KK2NsYXNzIFRKU09OUHJvdG9jb2wgZXh0ZW5kcyBUUHJvdG9jb2wKK3sKKyAgICBjb25zdCBDT01NQSA9ICcsJzsKKyAgICBjb25zdCBDT0xPTiA9ICc6JzsKKyAgICBjb25zdCBMQlJBQ0UgPSAneyc7CisgICAgY29uc3QgUkJSQUNFID0gJ30nOworICAgIGNvbnN0IExCUkFDS0VUID0gJ1snOworICAgIGNvbnN0IFJCUkFDS0VUID0gJ10nOworICAgIGNvbnN0IFFVT1RFID0gJyInOworICAgIGNvbnN0IEJBQ0tTTEFTSCA9ICdcXCc7CisgICAgY29uc3QgWkVSTyA9ICcwJzsKKyAgICBjb25zdCBFU0NTRVEgPSAnXFwnOworICAgIGNvbnN0IERPVUJMRUVTQyA9ICdfX0RPVUJMRV9FU0NBUEVfU0VRVUVOQ0VfXyc7CisKKyAgICBjb25zdCBWRVJTSU9OID0gMTsKKworICAgIHB1YmxpYyBzdGF0aWMgJEpTT05fQ0hBUl9UQUJMRSA9IGFycmF5KAorICAgICAgICAvKiAgMCAgIDEgICAyICAgMyAgIDQgICA1ICAgNiAgIDcgICA4ICAgOSAgIEEgICBCICAgQyAgIEQgICBFICAgRiAqLworICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAnYicsICd0JywgJ24nLCAwLCAnZicsICdyJywgMCwgMCwgLy8gMAorICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAvLyAxCisgICAgICAgIDEsIDEsICciJywgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgLy8gMgorICAgICk7CisKKyAgICBwdWJsaWMgc3RhdGljICRFU0NBUEVfQ0hBUlMgPSBhcnJheSgnIicsICdcXCcsICcvJywgImIiLCAiZiIsICJuIiwgInIiLCAidCIpOworCisgICAgcHVibGljIHN0YXRpYyAkRVNDQVBFX0NIQVJfVkFMUyA9IGFycmF5KAorICAgICAgICAnIicsICdcXCcsICcvJywgIlx4MDgiLCAiXGYiLCAiXG4iLCAiXHIiLCAiXHQiLAorICAgICk7CisKKyAgICBjb25zdCBOQU1FX0JPT0wgPSAidGYiOworICAgIGNvbnN0IE5BTUVfQllURSA9ICJpOCI7CisgICAgY29uc3QgTkFNRV9JMTYgPSAiaTE2IjsKKyAgICBjb25zdCBOQU1FX0kzMiA9ICJpMzIiOworICAgIGNvbnN0IE5BTUVfSTY0ID0gImk2NCI7CisgICAgY29uc3QgTkFNRV9ET1VCTEUgPSAiZGJsIjsKKyAgICBjb25zdCBOQU1FX1NUUlVDVCA9ICJyZWMiOworICAgIGNvbnN0IE5BTUVfU1RSSU5HID0gInN0ciI7CisgICAgY29uc3QgTkFNRV9NQVAgPSAibWFwIjsKKyAgICBjb25zdCBOQU1FX0xJU1QgPSAibHN0IjsKKyAgICBjb25zdCBOQU1FX1NFVCA9ICJzZXQiOworCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBnZXRUeXBlTmFtZUZvclR5cGVJRCgkdHlwZUlEKQorICAgIHsKKyAgICAgICAgc3dpdGNoICgkdHlwZUlEKSB7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpCT09MOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOjpOQU1FX0JPT0w7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpCWVRFOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOjpOQU1FX0JZVEU7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpJMTY6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY6Ok5BTUVfSTE2OworICAgICAgICAgICAgY2FzZSBUVHlwZTo6STMyOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOjpOQU1FX0kzMjsKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6Okk2NDoKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6TkFNRV9JNjQ7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpET1VCTEU6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY6Ok5BTUVfRE9VQkxFOworICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOjpOQU1FX1NUUklORzsKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6TkFNRV9TVFJVQ1Q7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpNQVA6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY6Ok5BTUVfTUFQOworICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOjpOQU1FX1NFVDsKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6TkFNRV9MSVNUOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJVbnJlY29nbml6ZWQgdHlwZSIsIFRQcm90b2NvbEV4Y2VwdGlvbjo6VU5LTk9XTik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIGdldFR5cGVJREZvclR5cGVOYW1lKCRuYW1lKQorICAgIHsKKyAgICAgICAgJHJlc3VsdCA9IFRUeXBlOjpTVE9QOworCisgICAgICAgIGlmIChzdHJsZW4oJG5hbWUpID4gMSkgeworICAgICAgICAgICAgc3dpdGNoIChzdWJzdHIoJG5hbWUsIDAsIDEpKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnZCc6CisgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgPSBUVHlwZTo6RE9VQkxFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdpJzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdWJzdHIoJG5hbWUsIDEsIDEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICc4JzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ID0gVFR5cGU6OkJZVEU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcxJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ID0gVFR5cGU6OkkxNjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzMnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgPSBUVHlwZTo6STMyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnNic6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCA9IFRUeXBlOjpJNjQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnbCc6CisgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgPSBUVHlwZTo6TFNUOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdtJzoKKyAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCA9IFRUeXBlOjpNQVA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ3InOgorICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ID0gVFR5cGU6OlNUUlVDVDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAncyc6CisgICAgICAgICAgICAgICAgICAgIGlmIChzdWJzdHIoJG5hbWUsIDEsIDEpID09ICd0JykgeworICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCA9IFRUeXBlOjpTVFJJTkc7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZWlmIChzdWJzdHIoJG5hbWUsIDEsIDEpID09ICdlJykgeworICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCA9IFRUeXBlOjpTRVQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAndCc6CisgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgPSBUVHlwZTo6Qk9PTDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCRyZXN1bHQgPT0gVFR5cGU6OlNUT1ApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIlVucmVjb2duaXplZCB0eXBlIiwgVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICRyZXN1bHQ7CisgICAgfQorCisgICAgcHVibGljICRjb250ZXh0U3RhY2tfID0gYXJyYXkoKTsKKyAgICBwdWJsaWMgJGNvbnRleHRfOworICAgIHB1YmxpYyAkcmVhZGVyXzsKKworICAgIHByaXZhdGUgZnVuY3Rpb24gcHVzaENvbnRleHQoJGMpCisgICAgeworICAgICAgICBhcnJheV9wdXNoKCR0aGlzLT5jb250ZXh0U3RhY2tfLCAkdGhpcy0+Y29udGV4dF8pOworICAgICAgICAkdGhpcy0+Y29udGV4dF8gPSAkYzsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHBvcENvbnRleHQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmNvbnRleHRfID0gYXJyYXlfcG9wKCR0aGlzLT5jb250ZXh0U3RhY2tfKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHRyYW5zKQorICAgIHsKKyAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkdHJhbnMpOworICAgICAgICAkdGhpcy0+Y29udGV4dF8gPSBuZXcgQmFzZUNvbnRleHQoKTsKKyAgICAgICAgJHRoaXMtPnJlYWRlcl8gPSBuZXcgTG9va2FoZWFkUmVhZGVyKCR0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVzZXQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmNvbnRleHRTdGFja18gPSBhcnJheSgpOworICAgICAgICAkdGhpcy0+Y29udGV4dF8gPSBuZXcgQmFzZUNvbnRleHQoKTsKKyAgICAgICAgJHRoaXMtPnJlYWRlcl8gPSBuZXcgTG9va2FoZWFkUmVhZGVyKCR0aGlzKTsKKyAgICB9CisKKyAgICBwcml2YXRlICR0bXBidWZfID0gYXJyYXkoNCk7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEpTT05TeW50YXhDaGFyKCRiKQorICAgIHsKKyAgICAgICAgJGNoID0gJHRoaXMtPnJlYWRlcl8tPnJlYWQoKTsKKworICAgICAgICBpZiAoc3Vic3RyKCRjaCwgMCwgMSkgIT0gJGIpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIlVuZXhwZWN0ZWQgY2hhcmFjdGVyOiAiIC4gJGNoLCBUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIGhleFZhbCgkcykKKyAgICB7CisgICAgICAgIGZvciAoJGkgPSAwOyAkaSA8IHN0cmxlbigkcyk7ICRpKyspIHsKKyAgICAgICAgICAgICRjaCA9IHN1YnN0cigkcywgJGksIDEpOworCisgICAgICAgICAgICBpZiAoISgkY2ggPj0gImEiICYmICRjaCA8PSAiZiIpICYmICEoJGNoID49ICIwIiAmJiAkY2ggPD0gIjkiKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIkV4cGVjdGVkIGhleCBjaGFyYWN0ZXIgIiAuICRjaCwgVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGhleGRlYygkcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBoZXhDaGFyKCR2YWwpCisgICAgeworICAgICAgICByZXR1cm4gZGVjaGV4KCR2YWwpOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gaGFzSlNPTlVuZXNjYXBlZFVuaWNvZGUoKQorICAgIHsKKyAgICAgICAgaWYgKFBIUF9NQUpPUl9WRVJTSU9OID4gNSB8fCAoUEhQX01BSk9SX1ZFUlNJT04gPT0gNSAmJiBQSFBfTUlOT1JfVkVSU0lPTiA+PSA0KSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiB1bmVzY2FwZWRVbmljb2RlKCRzdHIpCisgICAgeworICAgICAgICBpZiAoJHRoaXMtPmhhc0pTT05VbmVzY2FwZWRVbmljb2RlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBqc29uX2VuY29kZSgkc3RyLCBKU09OX1VORVNDQVBFRF9VTklDT0RFKTsKKyAgICAgICAgfQorCisgICAgICAgICRqc29uID0ganNvbl9lbmNvZGUoJHN0cik7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVW5lc2NhcGVkIGNoYXJhY3RlciBvdXRzaWRlIHRoZSBCYXNpYyBNdWx0aWxpbmd1YWwgUGxhbmUKKyAgICAgICAgICogSGlnaCBzdXJyb2dhdGU6IDB4RDgwMCAtIDB4REJGRgorICAgICAgICAgKiBMb3cgc3Vycm9nYXRlOiAweERDMDAgLSAweERGRkYKKyAgICAgICAgICovCisgICAgICAgICRqc29uID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKAorICAgICAgICAgICAgJy9cXFxcdShkWzg5YWJdWzAtOWEtZl17Mn0pXFxcXHUoZFtjZGVmXVswLTlhLWZdezJ9KS9pJywKKyAgICAgICAgICAgIGZ1bmN0aW9uICgkbWF0Y2hlcykgeworICAgICAgICAgICAgICAgIHJldHVybiBtYl9jb252ZXJ0X2VuY29kaW5nKHBhY2soJ0gqJywgJG1hdGNoZXNbMV0gLiAkbWF0Y2hlc1syXSksICdVVEYtOCcsICdVVEYtMTZCRScpOworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICRqc29uCisgICAgICAgICk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVW5lc2NhcGVkIGNoYXJhY3RlcnMgd2l0aGluIHRoZSBCYXNpYyBNdWx0aWxpbmd1YWwgUGxhbmUKKyAgICAgICAgICovCisgICAgICAgICRqc29uID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKAorICAgICAgICAgICAgJy9cXFxcdShbMC05YS1mXXs0fSkvaScsCisgICAgICAgICAgICBmdW5jdGlvbiAoJG1hdGNoZXMpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbWJfY29udmVydF9lbmNvZGluZyhwYWNrKCdIKicsICRtYXRjaGVzWzFdKSwgJ1VURi04JywgJ1VURi0xNkJFJyk7CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgJGpzb24KKyAgICAgICAgKTsKKworICAgICAgICByZXR1cm4gJGpzb247CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZUpTT05TdHJpbmcoJGIpCisgICAgeworICAgICAgICAkdGhpcy0+Y29udGV4dF8tPndyaXRlKCk7CisKKyAgICAgICAgaWYgKGlzX251bWVyaWMoJGIpICYmICR0aGlzLT5jb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKKyAgICAgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlFVT1RFKTsKKyAgICAgICAgfQorCisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKCR0aGlzLT51bmVzY2FwZWRVbmljb2RlKCRiKSk7CisKKyAgICAgICAgaWYgKGlzX251bWVyaWMoJGIpICYmICR0aGlzLT5jb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKKyAgICAgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlFVT1RFKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gd3JpdGVKU09OSW50ZWdlcigkbnVtKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmNvbnRleHRfLT53cml0ZSgpOworCisgICAgICAgIGlmICgkdGhpcy0+Y29udGV4dF8tPmVzY2FwZU51bSgpKSB7CisgICAgICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpRVU9URSk7CisgICAgICAgIH0KKworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkbnVtKTsKKworICAgICAgICBpZiAoJHRoaXMtPmNvbnRleHRfLT5lc2NhcGVOdW0oKSkgeworICAgICAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UVVPVEUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZUpTT05Eb3VibGUoJG51bSkKKyAgICB7CisgICAgICAgICR0aGlzLT5jb250ZXh0Xy0+d3JpdGUoKTsKKworICAgICAgICBpZiAoJHRoaXMtPmNvbnRleHRfLT5lc2NhcGVOdW0oKSkgeworICAgICAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UVVPVEUpOworICAgICAgICB9CisKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoanNvbl9lbmNvZGUoJG51bSkpOworCisgICAgICAgIGlmICgkdGhpcy0+Y29udGV4dF8tPmVzY2FwZU51bSgpKSB7CisgICAgICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpRVU9URSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHdyaXRlSlNPTkJhc2U2NCgkZGF0YSkKKyAgICB7CisgICAgICAgICR0aGlzLT5jb250ZXh0Xy0+d3JpdGUoKTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UVVPVEUpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShqc29uX2VuY29kZShiYXNlNjRfZW5jb2RlKCRkYXRhKSkpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpRVU9URSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZUpTT05PYmplY3RTdGFydCgpCisgICAgeworICAgICAgICAkdGhpcy0+Y29udGV4dF8tPndyaXRlKCk7CisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OkxCUkFDRSk7CisgICAgICAgICR0aGlzLT5wdXNoQ29udGV4dChuZXcgUGFpckNvbnRleHQoJHRoaXMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHdyaXRlSlNPTk9iamVjdEVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+cG9wQ29udGV4dCgpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpSQlJBQ0UpOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gd3JpdGVKU09OQXJyYXlTdGFydCgpCisgICAgeworICAgICAgICAkdGhpcy0+Y29udGV4dF8tPndyaXRlKCk7CisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OkxCUkFDS0VUKTsKKyAgICAgICAgJHRoaXMtPnB1c2hDb250ZXh0KG5ldyBMaXN0Q29udGV4dCgkdGhpcykpOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gd3JpdGVKU09OQXJyYXlFbmQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnBvcENvbnRleHQoKTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UkJSQUNLRVQpOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gcmVhZEpTT05TdHJpbmcoJHNraXBDb250ZXh0KQorICAgIHsKKyAgICAgICAgaWYgKCEkc2tpcENvbnRleHQpIHsKKyAgICAgICAgICAgICR0aGlzLT5jb250ZXh0Xy0+cmVhZCgpOworICAgICAgICB9CisKKyAgICAgICAgJGpzb25TdHJpbmcgPSAnJzsKKyAgICAgICAgJGxhc3RDaGFyID0gbnVsbDsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICRjaCA9ICR0aGlzLT5yZWFkZXJfLT5yZWFkKCk7CisgICAgICAgICAgICAkanNvblN0cmluZyAuPSAkY2g7CisgICAgICAgICAgICBpZiAoJGNoID09IHNlbGY6OlFVT1RFICYmCisgICAgICAgICAgICAgICAgJGxhc3RDaGFyICE9PSBudWxsICYmCisgICAgICAgICAgICAgICAgJGxhc3RDaGFyICE9PSBzZWxmOjpFU0NTRVEpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgkY2ggPT0gc2VsZjo6RVNDU0VRICYmICRsYXN0Q2hhciA9PSBzZWxmOjpFU0NTRVEpIHsKKyAgICAgICAgICAgICAgICAkbGFzdENoYXIgPSBzZWxmOjpET1VCTEVFU0M7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICRsYXN0Q2hhciA9ICRjaDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBqc29uX2RlY29kZSgkanNvblN0cmluZyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBpc0pTT05OdW1lcmljKCRiKQorICAgIHsKKyAgICAgICAgc3dpdGNoICgkYikgeworICAgICAgICAgICAgY2FzZSAnKyc6CisgICAgICAgICAgICBjYXNlICctJzoKKyAgICAgICAgICAgIGNhc2UgJy4nOgorICAgICAgICAgICAgY2FzZSAnMCc6CisgICAgICAgICAgICBjYXNlICcxJzoKKyAgICAgICAgICAgIGNhc2UgJzInOgorICAgICAgICAgICAgY2FzZSAnMyc6CisgICAgICAgICAgICBjYXNlICc0JzoKKyAgICAgICAgICAgIGNhc2UgJzUnOgorICAgICAgICAgICAgY2FzZSAnNic6CisgICAgICAgICAgICBjYXNlICc3JzoKKyAgICAgICAgICAgIGNhc2UgJzgnOgorICAgICAgICAgICAgY2FzZSAnOSc6CisgICAgICAgICAgICBjYXNlICdFJzoKKyAgICAgICAgICAgIGNhc2UgJ2UnOgorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gcmVhZEpTT05OdW1lcmljQ2hhcnMoKQorICAgIHsKKyAgICAgICAgJHN0cmJsZCA9IGFycmF5KCk7CisKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICRjaCA9ICR0aGlzLT5yZWFkZXJfLT5wZWVrKCk7CisKKyAgICAgICAgICAgIGlmICghJHRoaXMtPmlzSlNPTk51bWVyaWMoJGNoKSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAkc3RyYmxkW10gPSAkdGhpcy0+cmVhZGVyXy0+cmVhZCgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGltcGxvZGUoIiIsICRzdHJibGQpOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gcmVhZEpTT05JbnRlZ2VyKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5jb250ZXh0Xy0+cmVhZCgpOworCisgICAgICAgIGlmICgkdGhpcy0+Y29udGV4dF8tPmVzY2FwZU51bSgpKSB7CisgICAgICAgICAgICAkdGhpcy0+cmVhZEpTT05TeW50YXhDaGFyKHNlbGY6OlFVT1RFKTsKKyAgICAgICAgfQorCisgICAgICAgICRzdHIgPSAkdGhpcy0+cmVhZEpTT05OdW1lcmljQ2hhcnMoKTsKKworICAgICAgICBpZiAoJHRoaXMtPmNvbnRleHRfLT5lc2NhcGVOdW0oKSkgeworICAgICAgICAgICAgJHRoaXMtPnJlYWRKU09OU3ludGF4Q2hhcihzZWxmOjpRVU9URSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWlzX251bWVyaWMoJHN0cikpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIkludmFsaWQgZGF0YSBpbiBudW1lcmljOiAiIC4gJHN0ciwgVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGludHZhbCgkc3RyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZGVudGljYWwgdG8gcmVhZEpTT05JbnRlZ2VyIGJ1dCB3aXRob3V0IHRoZSBmaW5hbCBjYXN0LgorICAgICAqIE5lZWRlZCBmb3IgcHJvcGVyIGhhbmRsaW5nIG9mIGk2NCBvbiAzMiBiaXQgbWFjaGluZXMuICBXaHkgYQorICAgICAqIHNlcGFyYXRlIGZ1bmN0aW9uPyAgU28gd2UgZG9uJ3QgaGF2ZSB0byBmb3JjZSB0aGUgcmVzdCBvZiB0aGUKKyAgICAgKiB1c2UgY2FzZXMgdGhyb3VnaCB0aGUgZXh0cmEgY29uZGl0aW9uYWwuCisgICAgICovCisgICAgcHJpdmF0ZSBmdW5jdGlvbiByZWFkSlNPTkludGVnZXJBc1N0cmluZygpCisgICAgeworICAgICAgICAkdGhpcy0+Y29udGV4dF8tPnJlYWQoKTsKKworICAgICAgICBpZiAoJHRoaXMtPmNvbnRleHRfLT5lc2NhcGVOdW0oKSkgeworICAgICAgICAgICAgJHRoaXMtPnJlYWRKU09OU3ludGF4Q2hhcihzZWxmOjpRVU9URSk7CisgICAgICAgIH0KKworICAgICAgICAkc3RyID0gJHRoaXMtPnJlYWRKU09OTnVtZXJpY0NoYXJzKCk7CisKKyAgICAgICAgaWYgKCR0aGlzLT5jb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKKyAgICAgICAgICAgICR0aGlzLT5yZWFkSlNPTlN5bnRheENoYXIoc2VsZjo6UVVPVEUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFpc19udW1lcmljKCRzdHIpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJJbnZhbGlkIGRhdGEgaW4gbnVtZXJpYzogIiAuICRzdHIsIFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkc3RyOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gcmVhZEpTT05Eb3VibGUoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmNvbnRleHRfLT5yZWFkKCk7CisKKyAgICAgICAgaWYgKHN1YnN0cigkdGhpcy0+cmVhZGVyXy0+cGVlaygpLCAwLCAxKSA9PSBzZWxmOjpRVU9URSkgeworICAgICAgICAgICAgJGFyciA9ICR0aGlzLT5yZWFkSlNPTlN0cmluZyh0cnVlKTsKKworICAgICAgICAgICAgaWYgKCRhcnIgPT0gIk5hTiIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTkFOOworICAgICAgICAgICAgfSBlbHNlaWYgKCRhcnIgPT0gIkluZmluaXR5IikgeworICAgICAgICAgICAgICAgIHJldHVybiBJTkY7CisgICAgICAgICAgICB9IGVsc2VpZiAoISR0aGlzLT5jb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiTnVtZXJpYyBkYXRhIHVuZXhwZWN0ZWRseSBxdW90ZWQgIiAuICRhcnIsCisgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGZsb2F0dmFsKCRhcnIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCR0aGlzLT5jb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKKyAgICAgICAgICAgICAgICAkdGhpcy0+cmVhZEpTT05TeW50YXhDaGFyKHNlbGY6OlFVT1RFKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGZsb2F0dmFsKCR0aGlzLT5yZWFkSlNPTk51bWVyaWNDaGFycygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gcmVhZEpTT05CYXNlNjQoKQorICAgIHsKKyAgICAgICAgJGFyciA9ICR0aGlzLT5yZWFkSlNPTlN0cmluZyhmYWxzZSk7CisgICAgICAgICRkYXRhID0gYmFzZTY0X2RlY29kZSgkYXJyLCB0cnVlKTsKKworICAgICAgICBpZiAoJGRhdGEgPT09IGZhbHNlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJJbnZhbGlkIGJhc2U2NCBkYXRhICIgLiAkYXJyLCBUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJGRhdGE7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiByZWFkSlNPTk9iamVjdFN0YXJ0KCkKKyAgICB7CisgICAgICAgICR0aGlzLT5jb250ZXh0Xy0+cmVhZCgpOworICAgICAgICAkdGhpcy0+cmVhZEpTT05TeW50YXhDaGFyKHNlbGY6OkxCUkFDRSk7CisgICAgICAgICR0aGlzLT5wdXNoQ29udGV4dChuZXcgUGFpckNvbnRleHQoJHRoaXMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHJlYWRKU09OT2JqZWN0RW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5yZWFkSlNPTlN5bnRheENoYXIoc2VsZjo6UkJSQUNFKTsKKyAgICAgICAgJHRoaXMtPnBvcENvbnRleHQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHJlYWRKU09OQXJyYXlTdGFydCgpCisgICAgeworICAgICAgICAkdGhpcy0+Y29udGV4dF8tPnJlYWQoKTsKKyAgICAgICAgJHRoaXMtPnJlYWRKU09OU3ludGF4Q2hhcihzZWxmOjpMQlJBQ0tFVCk7CisgICAgICAgICR0aGlzLT5wdXNoQ29udGV4dChuZXcgTGlzdENvbnRleHQoJHRoaXMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHJlYWRKU09OQXJyYXlFbmQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnJlYWRKU09OU3ludGF4Q2hhcihzZWxmOjpSQlJBQ0tFVCk7CisgICAgICAgICR0aGlzLT5wb3BDb250ZXh0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIHRoZSBtZXNzYWdlIGhlYWRlcgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkbmFtZSBGdW5jdGlvbiBuYW1lCisgICAgICogQHBhcmFtIGludCAkdHlwZSBtZXNzYWdlIHR5cGUgVE1lc3NhZ2VUeXBlOjpDQUxMIG9yIFRNZXNzYWdlVHlwZTo6UkVQTFkKKyAgICAgKiBAcGFyYW0gaW50ICRzZXFpZCBUaGUgc2VxdWVuY2UgaWQgb2YgdGhpcyBtZXNzYWdlCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUJlZ2luKCRuYW1lLCAkdHlwZSwgJHNlcWlkKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkFycmF5U3RhcnQoKTsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoc2VsZjo6VkVSU0lPTik7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05TdHJpbmcoJG5hbWUpOworICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkdHlwZSk7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRzZXFpZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2UgdGhlIG1lc3NhZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlRW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05BcnJheUVuZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyBhIHN0cnVjdCBoZWFkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gIHN0cmluZyAkbmFtZSBTdHJ1Y3QgbmFtZQorICAgICAqIEB0aHJvd3MgVEV4Y2VwdGlvbiBvbiB3cml0ZSBlcnJvcgorICAgICAqIEByZXR1cm4gaW50ICAgICAgICBIb3cgbWFueSBieXRlcyB3cml0dGVuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RydWN0QmVnaW4oJG5hbWUpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKU09OT2JqZWN0U3RhcnQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZSBhIHN0cnVjdC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgVEV4Y2VwdGlvbiBvbiB3cml0ZSBlcnJvcgorICAgICAqIEByZXR1cm4gaW50ICAgICAgICBIb3cgbWFueSBieXRlcyB3cml0dGVuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RydWN0RW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05PYmplY3RFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEJlZ2luKCRmaWVsZE5hbWUsICRmaWVsZFR5cGUsICRmaWVsZElkKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJGZpZWxkSWQpOworICAgICAgICAkdGhpcy0+d3JpdGVKU09OT2JqZWN0U3RhcnQoKTsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTlN0cmluZygkdGhpcy0+Z2V0VHlwZU5hbWVGb3JUeXBlSUQoJGZpZWxkVHlwZSkpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkRW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpzb25PYmplY3RFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZFN0b3AoKQorICAgIHsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBCZWdpbigka2V5VHlwZSwgJHZhbFR5cGUsICRzaXplKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkFycmF5U3RhcnQoKTsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTlN0cmluZygkdGhpcy0+Z2V0VHlwZU5hbWVGb3JUeXBlSUQoJGtleVR5cGUpKTsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTlN0cmluZygkdGhpcy0+Z2V0VHlwZU5hbWVGb3JUeXBlSUQoJHZhbFR5cGUpKTsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJHNpemUpOworICAgICAgICAkdGhpcy0+d3JpdGVKU09OT2JqZWN0U3RhcnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBFbmQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTk9iamVjdEVuZCgpOworICAgICAgICAkdGhpcy0+d3JpdGVKU09OQXJyYXlFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSkKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05BcnJheVN0YXJ0KCk7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05TdHJpbmcoJHRoaXMtPmdldFR5cGVOYW1lRm9yVHlwZUlEKCRlbGVtVHlwZSkpOworICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKU09OQXJyYXlFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRCZWdpbigkZWxlbVR5cGUsICRzaXplKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkFycmF5U3RhcnQoKTsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTlN0cmluZygkdGhpcy0+Z2V0VHlwZU5hbWVGb3JUeXBlSUQoJGVsZW1UeXBlKSk7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRzaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRFbmQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkFycmF5RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQm9vbCgkYm9vbCkKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRib29sID8gMSA6IDApOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJ5dGUoJGJ5dGUpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkYnl0ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTE2KCRpMTYpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkaTE2KTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMzIoJGkzMikKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRpMzIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUk2NCgkaTY0KQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJGk2NCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRG91YmxlKCRkdWIpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKU09ORG91YmxlKCRkdWIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cmluZygkc3RyKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTlN0cmluZygkc3RyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyB0aGUgbWVzc2FnZSBoZWFkZXIKKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgRnVuY3Rpb24gbmFtZQorICAgICAqIEBwYXJhbSBpbnQgJHR5cGUgbWVzc2FnZSB0eXBlIFRNZXNzYWdlVHlwZTo6Q0FMTCBvciBUTWVzc2FnZVR5cGU6OlJFUExZCisgICAgICogQHBhcmVtIGludCAkc2VxaWQgVGhlIHNlcXVlbmNlIGlkIG9mIHRoaXMgbWVzc2FnZQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUJlZ2luKCYkbmFtZSwgJiR0eXBlLCAmJHNlcWlkKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnJlYWRKU09OQXJyYXlTdGFydCgpOworCisgICAgICAgIGlmICgkdGhpcy0+cmVhZEpTT05JbnRlZ2VyKCkgIT0gc2VsZjo6VkVSU0lPTikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiTWVzc2FnZSBjb250YWluZWQgYmFkIHZlcnNpb24iLCBUUHJvdG9jb2xFeGNlcHRpb246OkJBRF9WRVJTSU9OKTsKKyAgICAgICAgfQorCisgICAgICAgICRuYW1lID0gJHRoaXMtPnJlYWRKU09OU3RyaW5nKGZhbHNlKTsKKyAgICAgICAgJHR5cGUgPSAkdGhpcy0+cmVhZEpTT05JbnRlZ2VyKCk7CisgICAgICAgICRzZXFpZCA9ICR0aGlzLT5yZWFkSlNPTkludGVnZXIoKTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIHRoZSBjbG9zZSBvZiBtZXNzYWdlCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlRW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5yZWFkSlNPTkFycmF5RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RCZWdpbigmJG5hbWUpCisgICAgeworICAgICAgICAkdGhpcy0+cmVhZEpTT05PYmplY3RTdGFydCgpOworCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0RW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5yZWFkSlNPTk9iamVjdEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRCZWdpbigmJG5hbWUsICYkZmllbGRUeXBlLCAmJGZpZWxkSWQpCisgICAgeworICAgICAgICAkY2ggPSAkdGhpcy0+cmVhZGVyXy0+cGVlaygpOworICAgICAgICAkbmFtZSA9ICIiOworCisgICAgICAgIGlmIChzdWJzdHIoJGNoLCAwLCAxKSA9PSBzZWxmOjpSQlJBQ0UpIHsKKyAgICAgICAgICAgICRmaWVsZFR5cGUgPSBUVHlwZTo6U1RPUDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRmaWVsZElkID0gJHRoaXMtPnJlYWRKU09OSW50ZWdlcigpOworICAgICAgICAgICAgJHRoaXMtPnJlYWRKU09OT2JqZWN0U3RhcnQoKTsKKyAgICAgICAgICAgICRmaWVsZFR5cGUgPSAkdGhpcy0+Z2V0VHlwZUlERm9yVHlwZU5hbWUoJHRoaXMtPnJlYWRKU09OU3RyaW5nKGZhbHNlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkRW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5yZWFkSlNPTk9iamVjdEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwQmVnaW4oJiRrZXlUeXBlLCAmJHZhbFR5cGUsICYkc2l6ZSkKKyAgICB7CisgICAgICAgICR0aGlzLT5yZWFkSlNPTkFycmF5U3RhcnQoKTsKKyAgICAgICAgJGtleVR5cGUgPSAkdGhpcy0+Z2V0VHlwZUlERm9yVHlwZU5hbWUoJHRoaXMtPnJlYWRKU09OU3RyaW5nKGZhbHNlKSk7CisgICAgICAgICR2YWxUeXBlID0gJHRoaXMtPmdldFR5cGVJREZvclR5cGVOYW1lKCR0aGlzLT5yZWFkSlNPTlN0cmluZyhmYWxzZSkpOworICAgICAgICAkc2l6ZSA9ICR0aGlzLT5yZWFkSlNPTkludGVnZXIoKTsKKyAgICAgICAgJHRoaXMtPnJlYWRKU09OT2JqZWN0U3RhcnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+cmVhZEpTT05PYmplY3RFbmQoKTsKKyAgICAgICAgJHRoaXMtPnJlYWRKU09OQXJyYXlFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RCZWdpbigmJGVsZW1UeXBlLCAmJHNpemUpCisgICAgeworICAgICAgICAkdGhpcy0+cmVhZEpTT05BcnJheVN0YXJ0KCk7CisgICAgICAgICRlbGVtVHlwZSA9ICR0aGlzLT5nZXRUeXBlSURGb3JUeXBlTmFtZSgkdGhpcy0+cmVhZEpTT05TdHJpbmcoZmFsc2UpKTsKKyAgICAgICAgJHNpemUgPSAkdGhpcy0+cmVhZEpTT05JbnRlZ2VyKCk7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0RW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5yZWFkSlNPTkFycmF5RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRCZWdpbigmJGVsZW1UeXBlLCAmJHNpemUpCisgICAgeworICAgICAgICAkdGhpcy0+cmVhZEpTT05BcnJheVN0YXJ0KCk7CisgICAgICAgICRlbGVtVHlwZSA9ICR0aGlzLT5nZXRUeXBlSURGb3JUeXBlTmFtZSgkdGhpcy0+cmVhZEpTT05TdHJpbmcoZmFsc2UpKTsKKyAgICAgICAgJHNpemUgPSAkdGhpcy0+cmVhZEpTT05JbnRlZ2VyKCk7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRFbmQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnJlYWRKU09OQXJyYXlFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJvb2woJiRib29sKQorICAgIHsKKyAgICAgICAgJGJvb2wgPSAkdGhpcy0+cmVhZEpTT05JbnRlZ2VyKCkgPT0gMCA/IGZhbHNlIDogdHJ1ZTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJ5dGUoJiRieXRlKQorICAgIHsKKyAgICAgICAgJGJ5dGUgPSAkdGhpcy0+cmVhZEpTT05JbnRlZ2VyKCk7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJMTYoJiRpMTYpCisgICAgeworICAgICAgICAkaTE2ID0gJHRoaXMtPnJlYWRKU09OSW50ZWdlcigpOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTMyKCYkaTMyKQorICAgIHsKKyAgICAgICAgJGkzMiA9ICR0aGlzLT5yZWFkSlNPTkludGVnZXIoKTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEk2NCgmJGk2NCkKKyAgICB7CisgICAgICAgIGlmIChQSFBfSU5UX1NJWkUgPT09IDQpIHsKKyAgICAgICAgICAgICRpNjQgPSAkdGhpcy0+cmVhZEpTT05JbnRlZ2VyQXNTdHJpbmcoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRpNjQgPSAkdGhpcy0+cmVhZEpTT05JbnRlZ2VyKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZERvdWJsZSgmJGR1YikKKyAgICB7CisgICAgICAgICRkdWIgPSAkdGhpcy0+cmVhZEpTT05Eb3VibGUoKTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cmluZygmJHN0cikKKyAgICB7CisgICAgICAgICRzdHIgPSAkdGhpcy0+cmVhZEpTT05TdHJpbmcoZmFsc2UpOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5waHAgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5waHAKcmVuYW1lIHRvIGxpYi9waHAvbGliL1Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLnBocApkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvUHJvdG9jb2wvVFByb3RvY29sLnBocCBiL2xpYi9waHAvbGliL1Byb3RvY29sL1RQcm90b2NvbC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFhY2ViNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1Byb3RvY29sL1RQcm90b2NvbC5waHAKQEAgLTAsMCArMSwzNTAgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2w7CisKK3VzZSBUaHJpZnRcVHlwZVxUVHlwZTsKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRQcm90b2NvbEV4Y2VwdGlvbjsKKworLyoqCisgKiBQcm90b2NvbCBiYXNlIGNsYXNzIG1vZHVsZS4KKyAqLworYWJzdHJhY3QgY2xhc3MgVFByb3RvY29sCit7CisgICAgLyoqCisgICAgICogVW5kZXJseWluZyB0cmFuc3BvcnQKKyAgICAgKgorICAgICAqIEB2YXIgVFRyYW5zcG9ydAorICAgICAqLworICAgIHByb3RlY3RlZCAkdHJhbnNfOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHRyYW5zKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zXyA9ICR0cmFuczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBY2Nlc3NvciBmb3IgdHJhbnNwb3J0CisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRUcmFuc3BvcnQKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VHJhbnNwb3J0KCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+dHJhbnNfOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyB0aGUgbWVzc2FnZSBoZWFkZXIKKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgRnVuY3Rpb24gbmFtZQorICAgICAqIEBwYXJhbSBpbnQgJHR5cGUgbWVzc2FnZSB0eXBlIFRNZXNzYWdlVHlwZTo6Q0FMTCBvciBUTWVzc2FnZVR5cGU6OlJFUExZCisgICAgICogQHBhcmFtIGludCAkc2VxaWQgVGhlIHNlcXVlbmNlIGlkIG9mIHRoaXMgbWVzc2FnZQorICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VCZWdpbigkbmFtZSwgJHR5cGUsICRzZXFpZCk7CisKKyAgICAvKioKKyAgICAgKiBDbG9zZSB0aGUgbWVzc2FnZQorICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VFbmQoKTsKKworICAgIC8qKgorICAgICAqIFdyaXRlcyBhIHN0cnVjdCBoZWFkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lIFN0cnVjdCBuYW1lCisgICAgICogQHRocm93cyBURXhjZXB0aW9uIG9uIHdyaXRlIGVycm9yCisgICAgICogQHJldHVybiBpbnQgSG93IG1hbnkgYnl0ZXMgd3JpdHRlbgorICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEJlZ2luKCRuYW1lKTsKKworICAgIC8qKgorICAgICAqIENsb3NlIGEgc3RydWN0LgorICAgICAqCisgICAgICogQHRocm93cyBURXhjZXB0aW9uIG9uIHdyaXRlIGVycm9yCisgICAgICogQHJldHVybiBpbnQgSG93IG1hbnkgYnl0ZXMgd3JpdHRlbgorICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEVuZCgpOworCisgICAgLyoKKyAgICAgKiBTdGFydHMgYSBmaWVsZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgICAgICRuYW1lIEZpZWxkIG5hbWUKKyAgICAgKiBAcGFyYW0gaW50ICAgICAgICAkdHlwZSBGaWVsZCB0eXBlCisgICAgICogQHBhcmFtIGludCAgICAgICAgJGZpZCAgRmllbGQgaWQKKyAgICAgKiBAdGhyb3dzIFRFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKKyAgICAgKiBAcmV0dXJuIGludCBIb3cgbWFueSBieXRlcyB3cml0dGVuCisgICAgICovCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRCZWdpbigkZmllbGROYW1lLCAkZmllbGRUeXBlLCAkZmllbGRJZCk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEVuZCgpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRTdG9wKCk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBCZWdpbigka2V5VHlwZSwgJHZhbFR5cGUsICRzaXplKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEVuZCgpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEVuZCgpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRFbmQoKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJvb2woJGJvb2wpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlQnl0ZSgkYnl0ZSk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMTYoJGkxNik7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMzIoJGkzMik7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJNjQoJGk2NCk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVEb3VibGUoJGR1Yik7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJpbmcoJHN0cik7CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyB0aGUgbWVzc2FnZSBoZWFkZXIKKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgRnVuY3Rpb24gbmFtZQorICAgICAqIEBwYXJhbSBpbnQgJHR5cGUgbWVzc2FnZSB0eXBlIFRNZXNzYWdlVHlwZTo6Q0FMTCBvciBUTWVzc2FnZVR5cGU6OlJFUExZCisgICAgICogQHBhcmVtIGludCAkc2VxaWQgVGhlIHNlcXVlbmNlIGlkIG9mIHRoaXMgbWVzc2FnZQorICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUJlZ2luKCYkbmFtZSwgJiR0eXBlLCAmJHNlcWlkKTsKKworICAgIC8qKgorICAgICAqIFJlYWQgdGhlIGNsb3NlIG9mIG1lc3NhZ2UKKyAgICAgKi8KKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZE1lc3NhZ2VFbmQoKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0QmVnaW4oJiRuYW1lKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0RW5kKCk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkQmVnaW4oJiRuYW1lLCAmJGZpZWxkVHlwZSwgJiRmaWVsZElkKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRFbmQoKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwQmVnaW4oJiRrZXlUeXBlLCAmJHZhbFR5cGUsICYkc2l6ZSk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEVuZCgpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0QmVnaW4oJiRlbGVtVHlwZSwgJiRzaXplKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEVuZCgpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRCZWdpbigmJGVsZW1UeXBlLCAmJHNpemUpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRFbmQoKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkQm9vbCgmJGJvb2wpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWRCeXRlKCYkYnl0ZSk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZEkxNigmJGkxNik7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZEkzMigmJGkzMik7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZEk2NCgmJGk2NCk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZERvdWJsZSgmJGR1Yik7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cmluZygmJHN0cik7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc2tpcCBmdW5jdGlvbiBpcyBhIHV0aWxpdHkgdG8gcGFyc2Ugb3ZlciB1bnJlY29nbml6ZWQgZGF0ZSB3aXRob3V0CisgICAgICogY2F1c2luZyBjb3JydXB0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIFRUeXBlICR0eXBlIFdoYXQgdHlwZSBpcyBpdAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBza2lwKCR0eXBlKQorICAgIHsKKyAgICAgICAgc3dpdGNoICgkdHlwZSkgeworICAgICAgICAgICAgY2FzZSBUVHlwZTo6Qk9PTDoKKyAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJlYWRCb29sKCRib29sKTsKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6OkJZVEU6CisgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yZWFkQnl0ZSgkYnl0ZSk7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpJMTY6CisgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yZWFkSTE2KCRpMTYpOworICAgICAgICAgICAgY2FzZSBUVHlwZTo6STMyOgorICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cmVhZEkzMigkaTMyKTsKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6Okk2NDoKKyAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJlYWRJNjQoJGk2NCk7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpET1VCTEU6CisgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yZWFkRG91YmxlKCRkdWIpOworICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSSU5HOgorICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cmVhZFN0cmluZygkc3RyKTsKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKKyAgICAgICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRTdHJ1Y3RCZWdpbigkbmFtZSk7CisgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZEZpZWxkQmVnaW4oJG5hbWUsICRmdHlwZSwgJGZpZCk7CisgICAgICAgICAgICAgICAgICAgIGlmICgkZnR5cGUgPT0gVFR5cGU6OlNUT1ApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnNraXAoJGZ0eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZEZpZWxkRW5kKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnJlYWRTdHJ1Y3RFbmQoKTsKKworICAgICAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OworCisgICAgICAgICAgICBjYXNlIFRUeXBlOjpNQVA6CisgICAgICAgICAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5yZWFkTWFwQmVnaW4oJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSk7CisgICAgICAgICAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJHNpemU7ICRpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+c2tpcCgka2V5VHlwZSk7CisgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnNraXAoJHZhbFR5cGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkTWFwRW5kKCk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKKworICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZFNldEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpOworICAgICAgICAgICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRzaXplOyAkaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnNraXAoJGVsZW1UeXBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZFNldEVuZCgpOworCisgICAgICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CisKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKKyAgICAgICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRMaXN0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSk7CisgICAgICAgICAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJHNpemU7ICRpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+c2tpcCgkZWxlbVR5cGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkTGlzdEVuZCgpOworCisgICAgICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgJ1Vua25vd24gZmllbGQgdHlwZTogJyAuICR0eXBlLAorICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQQorICAgICAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVdGlsaXR5IGZvciBza2lwcGluZyBiaW5hcnkgZGF0YQorICAgICAqCisgICAgICogQHBhcmFtIFRUcmFuc3BvcnQgJGl0cmFucyBUVHJhbnNwb3J0IG9iamVjdAorICAgICAqIEBwYXJhbSBpbnQgJHR5cGUgRmllbGQgdHlwZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2tpcEJpbmFyeSgkaXRyYW5zLCAkdHlwZSkKKyAgICB7CisgICAgICAgIHN3aXRjaCAoJHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6OkJPT0w6CisgICAgICAgICAgICAgICAgcmV0dXJuICRpdHJhbnMtPnJlYWRBbGwoMSk7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpCWVRFOgorICAgICAgICAgICAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDEpOworICAgICAgICAgICAgY2FzZSBUVHlwZTo6STE2OgorICAgICAgICAgICAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDIpOworICAgICAgICAgICAgY2FzZSBUVHlwZTo6STMyOgorICAgICAgICAgICAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDQpOworICAgICAgICAgICAgY2FzZSBUVHlwZTo6STY0OgorICAgICAgICAgICAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDgpOworICAgICAgICAgICAgY2FzZSBUVHlwZTo6RE9VQkxFOgorICAgICAgICAgICAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDgpOworICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSSU5HOgorICAgICAgICAgICAgICAgICRsZW4gPSB1bnBhY2soJ04nLCAkaXRyYW5zLT5yZWFkQWxsKDQpKTsKKyAgICAgICAgICAgICAgICAkbGVuID0gJGxlblsxXTsKKyAgICAgICAgICAgICAgICBpZiAoJGxlbiA+IDB4N2ZmZmZmZmYpIHsKKyAgICAgICAgICAgICAgICAgICAgJGxlbiA9IDAgLSAoKCRsZW4gLSAxKSBeIDB4ZmZmZmZmZmYpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiA0ICsgJGl0cmFucy0+cmVhZEFsbCgkbGVuKTsKKworICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgorICAgICAgICAgICAgICAgICRyZXN1bHQgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgICAgICRmdHlwZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICRmaWQgPSAwOworICAgICAgICAgICAgICAgICAgICAkZGF0YSA9ICRpdHJhbnMtPnJlYWRBbGwoMSk7CisgICAgICAgICAgICAgICAgICAgICRhcnIgPSB1bnBhY2soJ2MnLCAkZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICRmdHlwZSA9ICRhcnJbMV07CisgICAgICAgICAgICAgICAgICAgIGlmICgkZnR5cGUgPT0gVFR5cGU6OlNUT1ApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIEkxNiBmaWVsZCBpZAorICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ICs9ICRpdHJhbnMtPnJlYWRBbGwoMik7CisgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgKz0gc2VsZjo6c2tpcEJpbmFyeSgkaXRyYW5zLCAkZnR5cGUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OworCisgICAgICAgICAgICBjYXNlIFRUeXBlOjpNQVA6CisgICAgICAgICAgICAgICAgLy8gS3R5cGUKKyAgICAgICAgICAgICAgICAkZGF0YSA9ICRpdHJhbnMtPnJlYWRBbGwoMSk7CisgICAgICAgICAgICAgICAgJGFyciA9IHVucGFjaygnYycsICRkYXRhKTsKKyAgICAgICAgICAgICAgICAka3R5cGUgPSAkYXJyWzFdOworICAgICAgICAgICAgICAgIC8vIFZ0eXBlCisgICAgICAgICAgICAgICAgJGRhdGEgPSAkaXRyYW5zLT5yZWFkQWxsKDEpOworICAgICAgICAgICAgICAgICRhcnIgPSB1bnBhY2soJ2MnLCAkZGF0YSk7CisgICAgICAgICAgICAgICAgJHZ0eXBlID0gJGFyclsxXTsKKyAgICAgICAgICAgICAgICAvLyBTaXplCisgICAgICAgICAgICAgICAgJGRhdGEgPSAkaXRyYW5zLT5yZWFkQWxsKDQpOworICAgICAgICAgICAgICAgICRhcnIgPSB1bnBhY2soJ04nLCAkZGF0YSk7CisgICAgICAgICAgICAgICAgJHNpemUgPSAkYXJyWzFdOworICAgICAgICAgICAgICAgIGlmICgkc2l6ZSA+IDB4N2ZmZmZmZmYpIHsKKyAgICAgICAgICAgICAgICAgICAgJHNpemUgPSAwIC0gKCgkc2l6ZSAtIDEpIF4gMHhmZmZmZmZmZik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICRyZXN1bHQgPSA2OworICAgICAgICAgICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRzaXplOyAkaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgKz0gc2VsZjo6c2tpcEJpbmFyeSgkaXRyYW5zLCAka3R5cGUpOworICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ICs9IHNlbGY6OnNraXBCaW5hcnkoJGl0cmFucywgJHZ0eXBlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKKworICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgorICAgICAgICAgICAgICAgIC8vIFZ0eXBlCisgICAgICAgICAgICAgICAgJGRhdGEgPSAkaXRyYW5zLT5yZWFkQWxsKDEpOworICAgICAgICAgICAgICAgICRhcnIgPSB1bnBhY2soJ2MnLCAkZGF0YSk7CisgICAgICAgICAgICAgICAgJHZ0eXBlID0gJGFyclsxXTsKKyAgICAgICAgICAgICAgICAvLyBTaXplCisgICAgICAgICAgICAgICAgJGRhdGEgPSAkaXRyYW5zLT5yZWFkQWxsKDQpOworICAgICAgICAgICAgICAgICRhcnIgPSB1bnBhY2soJ04nLCAkZGF0YSk7CisgICAgICAgICAgICAgICAgJHNpemUgPSAkYXJyWzFdOworICAgICAgICAgICAgICAgIGlmICgkc2l6ZSA+IDB4N2ZmZmZmZmYpIHsKKyAgICAgICAgICAgICAgICAgICAgJHNpemUgPSAwIC0gKCgkc2l6ZSAtIDEpIF4gMHhmZmZmZmZmZik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICRyZXN1bHQgPSA1OworICAgICAgICAgICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRzaXplOyAkaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgKz0gc2VsZjo6c2tpcEJpbmFyeSgkaXRyYW5zLCAkdnR5cGUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICdVbmtub3duIGZpZWxkIHR5cGU6ICcgLiAkdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEKKyAgICAgICAgICAgICAgICApOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvUHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLnBocCBiL2xpYi9waHAvbGliL1Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg1ZTBiOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5waHAKQEAgLTAsMCArMSwyODUgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2w7CisKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRFeGNlcHRpb247CisKKy8qKgorICogPGNvZGU+VFByb3RvY29sRGVjb3JhdG9yPC9jb2RlPiBmb3J3YXJkcyBhbGwgcmVxdWVzdHMgdG8gYW4gZW5jbG9zZWQKKyAqIDxjb2RlPlRQcm90b2NvbDwvY29kZT4gaW5zdGFuY2UsIHByb3ZpZGluZyBhIHdheSB0byBhdXRob3IgY29uY2lzZQorICogY29uY3JldGUgZGVjb3JhdG9yIHN1YmNsYXNzZXMuIFdoaWxlIGl0IGhhcyBubyBhYnN0cmFjdCBtZXRob2RzLCBpdAorICogaXMgbWFya2VkIGFic3RyYWN0IGFzIGEgcmVtaW5kZXIgdGhhdCBieSBpdHNlbGYsIGl0IGRvZXMgbm90IG1vZGlmeQorICogdGhlIGJlaGF2aW91ciBvZiB0aGUgZW5jbG9zZWQgPGNvZGU+VFByb3RvY29sPC9jb2RlPi4KKyAqCisgKiBAcGFja2FnZSBUaHJpZnRcUHJvdG9jb2wKKyAqLworYWJzdHJhY3QgY2xhc3MgVFByb3RvY29sRGVjb3JhdG9yIGV4dGVuZHMgVFByb3RvY29sCit7CisgICAgLyoqCisgICAgICogSW5zdGFuY2Ugb2YgcHJvdG9jb2wsIHRvIHdoaWNoIGFsbCBvcGVyYXRpb25zIHdpbGwgYmUgZm9yd2FyZGVkLgorICAgICAqCisgICAgICogQHZhciBUUHJvdG9jb2wKKyAgICAgKi8KKyAgICBwcml2YXRlICRjb25jcmV0ZVByb3RvY29sXzsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIG9mIDxjb2RlPlRQcm90b2NvbERlY29yYXRvcjwvY29kZT4gY2xhc3MuCisgICAgICogRW5jbG9zZXMgdGhlIHNwZWNpZmllZCBwcm90b2NvbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBUUHJvdG9jb2wgJHByb3RvY29sIEFsbCBvcGVyYXRpb25zIHdpbGwgYmUgZm9yd2FyZCB0byB0aGlzIGluc3RhbmNlLiBNdXN0IGJlIG5vbi1udWxsLgorICAgICAqLworICAgIHByb3RlY3RlZCBmdW5jdGlvbiBfX2NvbnN0cnVjdChUUHJvdG9jb2wgJHByb3RvY29sKQorICAgIHsKKyAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkcHJvdG9jb2wtPmdldFRyYW5zcG9ydCgpKTsKKyAgICAgICAgJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfID0gJHByb3RvY29sOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyB0aGUgbWVzc2FnZSBoZWFkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lICBGdW5jdGlvbiBuYW1lCisgICAgICogQHBhcmFtIGludCAgICAkdHlwZSAgbWVzc2FnZSB0eXBlIFRNZXNzYWdlVHlwZTo6Q0FMTCBvciBUTWVzc2FnZVR5cGU6OlJFUExZCisgICAgICogQHBhcmFtIGludCAgICAkc2VxaWQgVGhlIHNlcXVlbmNlIGlkIG9mIHRoaXMgbWVzc2FnZQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VCZWdpbigkbmFtZSwgJHR5cGUsICRzZXFpZCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlTWVzc2FnZUJlZ2luKCRuYW1lLCAkdHlwZSwgJHNlcWlkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhlIG1lc3NhZ2UuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZU1lc3NhZ2VFbmQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgYSBzdHJ1Y3QgaGVhZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkbmFtZSBTdHJ1Y3QgbmFtZQorICAgICAqCisgICAgICogQHRocm93cyBURXhjZXB0aW9uIG9uIHdyaXRlIGVycm9yCisgICAgICogQHJldHVybiBpbnQgICAgICAgIEhvdyBtYW55IGJ5dGVzIHdyaXR0ZW4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RCZWdpbigkbmFtZSkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlU3RydWN0QmVnaW4oJG5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlIGEgc3RydWN0LgorICAgICAqCisgICAgICogQHRocm93cyBURXhjZXB0aW9uIG9uIHdyaXRlIGVycm9yCisgICAgICogQHJldHVybiBpbnQgICAgICAgIEhvdyBtYW55IGJ5dGVzIHdyaXR0ZW4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVTdHJ1Y3RFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEJlZ2luKCRmaWVsZE5hbWUsICRmaWVsZFR5cGUsICRmaWVsZElkKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVGaWVsZEJlZ2luKCRmaWVsZE5hbWUsICRmaWVsZFR5cGUsICRmaWVsZElkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZUZpZWxkRW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRTdG9wKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlRmllbGRTdG9wKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwQmVnaW4oJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlTWFwQmVnaW4oJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwRW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlTWFwRW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZUxpc3RCZWdpbigkZWxlbVR5cGUsICRzaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0RW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlTGlzdEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVNldEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZVNldEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVNldEVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZVNldEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJvb2woJGJvb2wpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZUJvb2woJGJvb2wpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJ5dGUoJGJ5dGUpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZUJ5dGUoJGJ5dGUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkxNigkaTE2KQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVJMTYoJGkxNik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTMyKCRpMzIpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZUkzMigkaTMyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJNjQoJGk2NCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlSTY0KCRpNjQpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZURvdWJsZSgkZHViKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVEb3VibGUoJGR1Yik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RyaW5nKCRzdHIpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZVN0cmluZygkc3RyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyB0aGUgbWVzc2FnZSBoZWFkZXIKKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgIEZ1bmN0aW9uIG5hbWUKKyAgICAgKiBAcGFyYW0gaW50ICAgICR0eXBlICBtZXNzYWdlIHR5cGUgVE1lc3NhZ2VUeXBlOjpDQUxMIG9yIFRNZXNzYWdlVHlwZTo6UkVQTFkKKyAgICAgKiBAcGFyYW0gaW50ICAgICRzZXFpZCBUaGUgc2VxdWVuY2UgaWQgb2YgdGhpcyBtZXNzYWdlCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlQmVnaW4oJiRuYW1lLCAmJHR5cGUsICYkc2VxaWQpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkTWVzc2FnZUJlZ2luKCRuYW1lLCAkdHlwZSwgJHNlcWlkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIHRoZSBjbG9zZSBvZiBtZXNzYWdlCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlRW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRNZXNzYWdlRW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RCZWdpbigmJG5hbWUpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkU3RydWN0QmVnaW4oJG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0RW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRTdHJ1Y3RFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkQmVnaW4oJiRuYW1lLCAmJGZpZWxkVHlwZSwgJiRmaWVsZElkKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZEZpZWxkQmVnaW4oJG5hbWUsICRmaWVsZFR5cGUsICRmaWVsZElkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkRW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRGaWVsZEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwQmVnaW4oJiRrZXlUeXBlLCAmJHZhbFR5cGUsICYkc2l6ZSkKKyAgICB7CisgICAgICAgICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZE1hcEJlZ2luKCRrZXlUeXBlLCAkdmFsVHlwZSwgJHNpemUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwRW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRNYXBFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RCZWdpbigmJGVsZW1UeXBlLCAmJHNpemUpCisgICAgeworICAgICAgICAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRMaXN0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0RW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRMaXN0RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRCZWdpbigmJGVsZW1UeXBlLCAmJHNpemUpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkU2V0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZFNldEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQm9vbCgmJGJvb2wpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkQm9vbCgkYm9vbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRCeXRlKCYkYnl0ZSkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRCeXRlKCRieXRlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEkxNigmJGkxNikKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRJMTYoJGkxNik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJMzIoJiRpMzIpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkSTMyKCRpMzIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTY0KCYkaTY0KQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZEk2NCgkaTY0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZERvdWJsZSgmJGR1YikKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWREb3VibGUoJGR1Yik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJpbmcoJiRzdHIpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkU3RyaW5nKCRzdHIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1Byb3RvY29sL1RTaW1wbGVKU09OUHJvdG9jb2wucGhwIGIvbGliL3BocC9saWIvUHJvdG9jb2wvVFNpbXBsZUpTT05Qcm90b2NvbC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNmMWY2NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1Byb3RvY29sL1RTaW1wbGVKU09OUHJvdG9jb2wucGhwCkBAIC0wLDAgKzEsMzc0IEBACis8P3BocAorCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2w7CisKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRFeGNlcHRpb247Cit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxUUHJvdG9jb2xFeGNlcHRpb247Cit1c2UgVGhyaWZ0XFByb3RvY29sXFNpbXBsZUpTT05cQ29udGV4dDsKK3VzZSBUaHJpZnRcUHJvdG9jb2xcU2ltcGxlSlNPTlxMaXN0Q29udGV4dDsKK3VzZSBUaHJpZnRcUHJvdG9jb2xcU2ltcGxlSlNPTlxTdHJ1Y3RDb250ZXh0OwordXNlIFRocmlmdFxQcm90b2NvbFxTaW1wbGVKU09OXE1hcENvbnRleHQ7Cit1c2UgVGhyaWZ0XFByb3RvY29sXFNpbXBsZUpTT05cQ29sbGVjdGlvbk1hcEtleUV4Y2VwdGlvbjsKKworLyoqCisgKiBTaW1wbGVKU09OIGltcGxlbWVudGF0aW9uIG9mIHRocmlmdCBwcm90b2NvbCwgcG9ydGVkIGZyb20gSmF2YS4KKyAqLworY2xhc3MgVFNpbXBsZUpTT05Qcm90b2NvbCBleHRlbmRzIFRQcm90b2NvbAoreworICAgIGNvbnN0IENPTU1BID0gJywnOworICAgIGNvbnN0IENPTE9OID0gJzonOworICAgIGNvbnN0IExCUkFDRSA9ICd7JzsKKyAgICBjb25zdCBSQlJBQ0UgPSAnfSc7CisgICAgY29uc3QgTEJSQUNLRVQgPSAnWyc7CisgICAgY29uc3QgUkJSQUNLRVQgPSAnXSc7CisgICAgY29uc3QgUVVPVEUgPSAnIic7CisKKyAgICBjb25zdCBOQU1FX01BUCA9ICJtYXAiOworICAgIGNvbnN0IE5BTUVfTElTVCA9ICJsc3QiOworICAgIGNvbnN0IE5BTUVfU0VUID0gInNldCI7CisKKyAgICBwcm90ZWN0ZWQgJHdyaXRlQ29udGV4dF8gPSBudWxsOworICAgIHByb3RlY3RlZCAkd3JpdGVDb250ZXh0U3RhY2tfID0gW107CisKKyAgICAvKioKKyAgICAgKiBQdXNoIGEgbmV3IHdyaXRlIGNvbnRleHQgb250byB0aGUgc3RhY2suCisgICAgICovCisgICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHB1c2hXcml0ZUNvbnRleHQoQ29udGV4dCAkYykKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUNvbnRleHRTdGFja19bXSA9ICR0aGlzLT53cml0ZUNvbnRleHRfOworICAgICAgICAkdGhpcy0+d3JpdGVDb250ZXh0XyA9ICRjOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBvcCB0aGUgbGFzdCB3cml0ZSBjb250ZXh0IG9mZiB0aGUgc3RhY2sKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gcG9wV3JpdGVDb250ZXh0KCkKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUNvbnRleHRfID0gYXJyYXlfcG9wKCR0aGlzLT53cml0ZUNvbnRleHRTdGFja18pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVzZWQgdG8gbWFrZSBzdXJlIHRoYXQgd2UgYXJlIG5vdCBlbmNvdW50ZXJpbmcgYSBtYXAgd2hvc2Uga2V5cyBhcmUgY29udGFpbmVycworICAgICAqLworICAgIHByb3RlY3RlZCBmdW5jdGlvbiBhc3NlcnRDb250ZXh0SXNOb3RNYXBLZXkoJGludmFsaWRLZXlUeXBlKQorICAgIHsKKyAgICAgICAgaWYgKCR0aGlzLT53cml0ZUNvbnRleHRfLT5pc01hcEtleSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ29sbGVjdGlvbk1hcEtleUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiQ2Fubm90IHNlcmlhbGl6ZSBhIG1hcCB3aXRoIGtleXMgdGhhdCBhcmUgb2YgdHlwZSAiIC4KKyAgICAgICAgICAgICAgICAkaW52YWxpZEtleVR5cGUKKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHdyaXRlSlNPTlN0cmluZygkYikKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUNvbnRleHRfLT53cml0ZSgpOworCisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKGpzb25fZW5jb2RlKChzdHJpbmcpJGIpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHdyaXRlSlNPTkludGVnZXIoJG51bSkKKyAgICB7CisgICAgICAgICRpc01hcEtleSA9ICR0aGlzLT53cml0ZUNvbnRleHRfLT5pc01hcEtleSgpOworCisgICAgICAgICR0aGlzLT53cml0ZUNvbnRleHRfLT53cml0ZSgpOworCisgICAgICAgIGlmICgkaXNNYXBLZXkpIHsKKyAgICAgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlFVT1RFKTsKKyAgICAgICAgfQorCisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKChpbnQpJG51bSk7CisKKyAgICAgICAgaWYgKCRpc01hcEtleSkgeworICAgICAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UVVPVEUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZUpTT05Eb3VibGUoJG51bSkKKyAgICB7CisgICAgICAgICRpc01hcEtleSA9ICR0aGlzLT53cml0ZUNvbnRleHRfLT5pc01hcEtleSgpOworCisgICAgICAgICR0aGlzLT53cml0ZUNvbnRleHRfLT53cml0ZSgpOworCisgICAgICAgIGlmICgkaXNNYXBLZXkpIHsKKyAgICAgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlFVT1RFKTsKKyAgICAgICAgfQorCisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKGpzb25fZW5jb2RlKChmbG9hdCkkbnVtKSk7CisKKyAgICAgICAgaWYgKCRpc01hcEtleSkgeworICAgICAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UVVPVEUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHRyYW5zKQorICAgIHsKKyAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkdHJhbnMpOworICAgICAgICAkdGhpcy0+d3JpdGVDb250ZXh0XyA9IG5ldyBDb250ZXh0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIHRoZSBtZXNzYWdlIGhlYWRlcgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkbmFtZSAgRnVuY3Rpb24gbmFtZQorICAgICAqIEBwYXJhbSBpbnQgICAgJHR5cGUgIG1lc3NhZ2UgdHlwZSBUTWVzc2FnZVR5cGU6OkNBTEwgb3IgVE1lc3NhZ2VUeXBlOjpSRVBMWQorICAgICAqIEBwYXJhbSBpbnQgICAgJHNlcWlkIFRoZSBzZXF1ZW5jZSBpZCBvZiB0aGlzIG1lc3NhZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlQmVnaW4oJG5hbWUsICR0eXBlLCAkc2VxaWQpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpMQlJBQ0tFVCk7CisgICAgICAgICR0aGlzLT5wdXNoV3JpdGVDb250ZXh0KG5ldyBMaXN0Q29udGV4dCgkdGhpcykpOworICAgICAgICAkdGhpcy0+d3JpdGVKU09OU3RyaW5nKCRuYW1lKTsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJHR5cGUpOworICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkc2VxaWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlIHRoZSBtZXNzYWdlCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+cG9wV3JpdGVDb250ZXh0KCk7CisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlJCUkFDS0VUKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgYSBzdHJ1Y3QgaGVhZGVyLgorICAgICAqCisgICAgICogQHBhcmFtICBzdHJpbmcgICAgICRuYW1lIFN0cnVjdCBuYW1lCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RydWN0QmVnaW4oJG5hbWUpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVDb250ZXh0Xy0+d3JpdGUoKTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6TEJSQUNFKTsKKyAgICAgICAgJHRoaXMtPnB1c2hXcml0ZUNvbnRleHQobmV3IFN0cnVjdENvbnRleHQoJHRoaXMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZSBhIHN0cnVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RFbmQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnBvcFdyaXRlQ29udGV4dCgpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpSQlJBQ0UpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkQmVnaW4oJGZpZWxkTmFtZSwgJGZpZWxkVHlwZSwgJGZpZWxkSWQpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKU09OU3RyaW5nKCRmaWVsZE5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkRW5kKCkKKyAgICB7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRTdG9wKCkKKyAgICB7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwQmVnaW4oJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSkKKyAgICB7CisgICAgICAgICR0aGlzLT5hc3NlcnRDb250ZXh0SXNOb3RNYXBLZXkoc2VsZjo6TkFNRV9NQVApOworICAgICAgICAkdGhpcy0+d3JpdGVDb250ZXh0Xy0+d3JpdGUoKTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6TEJSQUNFKTsKKyAgICAgICAgJHRoaXMtPnB1c2hXcml0ZUNvbnRleHQobmV3IE1hcENvbnRleHQoJHRoaXMpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBFbmQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnBvcFdyaXRlQ29udGV4dCgpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpSQlJBQ0UpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUxpc3RCZWdpbigkZWxlbVR5cGUsICRzaXplKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmFzc2VydENvbnRleHRJc05vdE1hcEtleShzZWxmOjpOQU1FX0xJU1QpOworICAgICAgICAkdGhpcy0+d3JpdGVDb250ZXh0Xy0+d3JpdGUoKTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6TEJSQUNLRVQpOworICAgICAgICAkdGhpcy0+cHVzaFdyaXRlQ29udGV4dChuZXcgTGlzdENvbnRleHQoJHRoaXMpKTsKKyAgICAgICAgLy8gTm8gbWV0YWRhdGEhCisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+cG9wV3JpdGVDb250ZXh0KCk7CisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlJCUkFDS0VUKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRCZWdpbigkZWxlbVR5cGUsICRzaXplKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmFzc2VydENvbnRleHRJc05vdE1hcEtleShzZWxmOjpOQU1FX1NFVCk7CisgICAgICAgICR0aGlzLT53cml0ZUNvbnRleHRfLT53cml0ZSgpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpMQlJBQ0tFVCk7CisgICAgICAgICR0aGlzLT5wdXNoV3JpdGVDb250ZXh0KG5ldyBMaXN0Q29udGV4dCgkdGhpcykpOworICAgICAgICAvLyBObyBtZXRhZGF0YSEKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRFbmQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnBvcFdyaXRlQ29udGV4dCgpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpSQlJBQ0tFVCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQm9vbCgkYm9vbCkKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRib29sID8gMSA6IDApOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJ5dGUoJGJ5dGUpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkYnl0ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTE2KCRpMTYpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkaTE2KTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMzIoJGkzMikKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRpMzIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUk2NCgkaTY0KQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJGk2NCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRG91YmxlKCRkdWIpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKU09ORG91YmxlKCRkdWIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cmluZygkc3RyKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTlN0cmluZygkc3RyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkaW5nIG1ldGhvZHMuCisgICAgICoKKyAgICAgKiBzaW1wbGVqc29uIGlzIG5vdCBtZWFudCB0byBiZSByZWFkIGJhY2sgaW50byB0aHJpZnQKKyAgICAgKiAtIHNlZSBodHRwOi8vd2lraS5hcGFjaGUub3JnL3RocmlmdC9UaHJpZnRVc2FnZUphdmEKKyAgICAgKiAtIHVzZSBKU09OIGluc3RlYWQKKyAgICAgKi8KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUJlZ2luKCYkbmFtZSwgJiR0eXBlLCAmJHNlcWlkKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUVuZCgpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RCZWdpbigmJG5hbWUpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RFbmQoKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRCZWdpbigmJG5hbWUsICYkZmllbGRUeXBlLCAmJGZpZWxkSWQpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRGaWVsZEVuZCgpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNYXBCZWdpbigmJGtleVR5cGUsICYkdmFsVHlwZSwgJiRzaXplKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwRW5kKCkKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RCZWdpbigmJGVsZW1UeXBlLCAmJHNpemUpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0RW5kKCkKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEJlZ2luKCYkZWxlbVR5cGUsICYkc2l6ZSkKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEVuZCgpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRCb29sKCYkYm9vbCkKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJ5dGUoJiRieXRlKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTE2KCYkaTE2KQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTMyKCYkaTMyKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTY0KCYkaTY0KQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRG91YmxlKCYkZHViKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RyaW5nKCYkc3RyKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1NlcmlhbGl6ZXIvVEJpbmFyeVNlcmlhbGl6ZXIucGhwIGIvbGliL3BocC9saWIvU2VyaWFsaXplci9UQmluYXJ5U2VyaWFsaXplci5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQyYjE0NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1NlcmlhbGl6ZXIvVEJpbmFyeVNlcmlhbGl6ZXIucGhwCkBAIC0wLDAgKzEsODcgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAorICogQGF1dGhvcjogcm1hcmluIChtYXJpbi5yYWR1QGZhY2Vib29rLmNvbSkKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFNlcmlhbGl6ZXI7CisKK3VzZSBUaHJpZnRcVHJhbnNwb3J0XFRNZW1vcnlCdWZmZXI7Cit1c2UgVGhyaWZ0XFByb3RvY29sXFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkOwordXNlIFRocmlmdFxUeXBlXFRNZXNzYWdlVHlwZTsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIGZvciBzZXJpYWxpemluZyBhbmQgZGVzZXJpYWxpemluZworICogYSB0aHJpZnQgb2JqZWN0IHVzaW5nIFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkLgorICovCitjbGFzcyBUQmluYXJ5U2VyaWFsaXplcgoreworICAgIC8vIE5PVEUocm1hcmluKTogQmVjYXVzZSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5CisgICAgLy8gYWRkcyBhIGJlZ2luIG1lc3NhZ2UgcHJlZml4LCB5b3UgY2Fubm90IHNwZWNpZnkKKyAgICAvLyBhIHRyYW5zcG9ydCBpbiB3aGljaCB0byBzZXJpYWxpemUgYW4gb2JqZWN0LiBJdCBoYXMgdG8KKyAgICAvLyBiZSBhIHN0cmluZy4gT3RoZXJ3aXNlIHdlIHdpbGwgYnJlYWsgdGhlIGNvbXBhdGliaWxpdHkgd2l0aAorICAgIC8vIG5vcm1hbCBkZXNlcmlhbGl6YXRpb24uCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZXJpYWxpemUoJG9iamVjdCkKKyAgICB7CisgICAgICAgICR0cmFuc3BvcnQgPSBuZXcgVE1lbW9yeUJ1ZmZlcigpOworICAgICAgICAkcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQoJHRyYW5zcG9ydCk7CisgICAgICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ3RocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnknKSkgeworICAgICAgICAgICAgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSgKKyAgICAgICAgICAgICAgICAkcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgJG9iamVjdC0+Z2V0TmFtZSgpLAorICAgICAgICAgICAgICAgIFRNZXNzYWdlVHlwZTo6UkVQTFksCisgICAgICAgICAgICAgICAgJG9iamVjdCwKKyAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICRwcm90b2NvbC0+aXNTdHJpY3RXcml0ZSgpCisgICAgICAgICAgICApOworCisgICAgICAgICAgICAkcHJvdG9jb2wtPnJlYWRNZXNzYWdlQmVnaW4oJHVudXNlZF9uYW1lLCAkdW51c2VkX3R5cGUsICR1bnVzZWRfc2VxaWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJG9iamVjdC0+d3JpdGUoJHByb3RvY29sKTsKKyAgICAgICAgfQorICAgICAgICAkcHJvdG9jb2wtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOworCisgICAgICAgIHJldHVybiAkdHJhbnNwb3J0LT5nZXRCdWZmZXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGRlc2VyaWFsaXplKCRzdHJpbmdfb2JqZWN0LCAkY2xhc3NfbmFtZSwgJGJ1ZmZlcl9zaXplID0gODE5MikKKyAgICB7CisgICAgICAgICR0cmFuc3BvcnQgPSBuZXcgVE1lbW9yeUJ1ZmZlcigpOworICAgICAgICAkcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQoJHRyYW5zcG9ydCk7CisgICAgICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ3RocmlmdF9wcm90b2NvbF9yZWFkX2JpbmFyeScpKSB7CisgICAgICAgICAgICAvLyBOT1RFICh0LmhlaW50eikgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgaW50ZXJuYWxseSB3cmFwcyBvdXIgVE1lbW9yeUJ1ZmZlciBpbiBhCisgICAgICAgICAgICAvLyBUQnVmZmVyZWRUcmFuc3BvcnQsIHNvIHdlIGhhdmUgdG8gcmV0cmlldmUgaXQgYWdhaW4gb3IgcmlzayBsb3NpbmcgZGF0YSB3aGVuIHdyaXRpbmcKKyAgICAgICAgICAgIC8vIGxlc3MgdGhhbiA1MTIgYnl0ZXMgdG8gdGhlIHRyYW5zcG9ydCAoc2VlIHRoZSBjb21tZW50IHRoZXJlIGFzIHdlbGwpLgorICAgICAgICAgICAgLy8gQHNlZSBUSFJJRlQtMTU3OQorICAgICAgICAgICAgJHByb3RvY29sLT53cml0ZU1lc3NhZ2VCZWdpbignJywgVE1lc3NhZ2VUeXBlOjpSRVBMWSwgMCk7CisgICAgICAgICAgICAkcHJvdG9jb2xUcmFuc3BvcnQgPSAkcHJvdG9jb2wtPmdldFRyYW5zcG9ydCgpOworICAgICAgICAgICAgJHByb3RvY29sVHJhbnNwb3J0LT53cml0ZSgkc3RyaW5nX29iamVjdCk7CisgICAgICAgICAgICAkcHJvdG9jb2xUcmFuc3BvcnQtPmZsdXNoKCk7CisKKyAgICAgICAgICAgIHJldHVybiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnkoJHByb3RvY29sLCAkY2xhc3NfbmFtZSwgJHByb3RvY29sLT5pc1N0cmljdFJlYWQoKSwgJGJ1ZmZlcl9zaXplKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR0cmFuc3BvcnQtPndyaXRlKCRzdHJpbmdfb2JqZWN0KTsKKyAgICAgICAgICAgICRvYmplY3QgPSBuZXcgJGNsYXNzX25hbWUoKTsKKyAgICAgICAgICAgICRvYmplY3QtPnJlYWQoJHByb3RvY29sKTsKKworICAgICAgICAgICAgcmV0dXJuICRvYmplY3Q7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9TZXJ2ZXIvVEZvcmtpbmdTZXJ2ZXIucGhwIGIvbGliL3BocC9saWIvU2VydmVyL1RGb3JraW5nU2VydmVyLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmI2ZTkxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvU2VydmVyL1RGb3JraW5nU2VydmVyLnBocApAQCAtMCwwICsxLDEyNSBAQAorPD9waHAKKworbmFtZXNwYWNlIFRocmlmdFxTZXJ2ZXI7CisKK3VzZSBUaHJpZnRcVHJhbnNwb3J0XFRUcmFuc3BvcnQ7Cit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxURXhjZXB0aW9uOwordXNlIFRocmlmdFxFeGNlcHRpb25cVFRyYW5zcG9ydEV4Y2VwdGlvbjsKKworLyoqCisgKiBBIGZvcmtpbmcgaW1wbGVtZW50YXRpb24gb2YgYSBUaHJpZnQgc2VydmVyLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5zZXJ2ZXIKKyAqLworY2xhc3MgVEZvcmtpbmdTZXJ2ZXIgZXh0ZW5kcyBUU2VydmVyCit7CisgICAgLyoqCisgICAgICogRmxhZyBmb3IgdGhlIG1haW4gc2VydmluZyBsb29wCisgICAgICoKKyAgICAgKiBAdmFyIGJvb2wKKyAgICAgKi8KKyAgICBwcml2YXRlICRzdG9wXyA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogTGlzdCBvZiBjaGlsZHJlbi4KKyAgICAgKgorICAgICAqIEB2YXIgYXJyYXkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJGNoaWxkcmVuXyA9IGFycmF5KCk7CisKKyAgICAvKioKKyAgICAgKiBMaXN0ZW5zIGZvciBuZXcgY2xpZW50IHVzaW5nIHRoZSBzdXBwbGllZAorICAgICAqIHRyYW5zcG9ydC4gV2UgZm9yayB3aGVuIGEgbmV3IGNvbm5lY3Rpb24KKyAgICAgKiBhcnJpdmVzLgorICAgICAqCisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHNlcnZlKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnRfLT5saXN0ZW4oKTsKKworICAgICAgICB3aGlsZSAoISR0aGlzLT5zdG9wXykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAkdHJhbnNwb3J0ID0gJHRoaXMtPnRyYW5zcG9ydF8tPmFjY2VwdCgpOworCisgICAgICAgICAgICAgICAgaWYgKCR0cmFuc3BvcnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAkcGlkID0gcGNudGxfZm9yaygpOworCisgICAgICAgICAgICAgICAgICAgIGlmICgkcGlkID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmhhbmRsZVBhcmVudCgkdHJhbnNwb3J0LCAkcGlkKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlaWYgKCRwaWQgPT09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5oYW5kbGVDaGlsZCgkdHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCdGYWlsZWQgdG8gZm9yaycpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiAkZSkgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAkdGhpcy0+Y29sbGVjdENoaWxkcmVuKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb2RlIHJ1biBieSB0aGUgcGFyZW50CisgICAgICoKKyAgICAgKiBAcGFyYW0gVFRyYW5zcG9ydCAkdHJhbnNwb3J0CisgICAgICogQHBhcmFtIGludCAkcGlkCisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBoYW5kbGVQYXJlbnQoVFRyYW5zcG9ydCAkdHJhbnNwb3J0LCAkcGlkKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmNoaWxkcmVuX1skcGlkXSA9ICR0cmFuc3BvcnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29kZSBydW4gYnkgdGhlIGNoaWxkLgorICAgICAqCisgICAgICogQHBhcmFtIFRUcmFuc3BvcnQgJHRyYW5zcG9ydAorICAgICAqIEByZXR1cm4gdm9pZAorICAgICAqLworICAgIHByaXZhdGUgZnVuY3Rpb24gaGFuZGxlQ2hpbGQoVFRyYW5zcG9ydCAkdHJhbnNwb3J0KQorICAgIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICRpbnB1dFRyYW5zcG9ydCA9ICR0aGlzLT5pbnB1dFRyYW5zcG9ydEZhY3RvcnlfLT5nZXRUcmFuc3BvcnQoJHRyYW5zcG9ydCk7CisgICAgICAgICAgICAkb3V0cHV0VHJhbnNwb3J0ID0gJHRoaXMtPm91dHB1dFRyYW5zcG9ydEZhY3RvcnlfLT5nZXRUcmFuc3BvcnQoJHRyYW5zcG9ydCk7CisgICAgICAgICAgICAkaW5wdXRQcm90b2NvbCA9ICR0aGlzLT5pbnB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKCRpbnB1dFRyYW5zcG9ydCk7CisgICAgICAgICAgICAkb3V0cHV0UHJvdG9jb2wgPSAkdGhpcy0+b3V0cHV0UHJvdG9jb2xGYWN0b3J5Xy0+Z2V0UHJvdG9jb2woJG91dHB1dFRyYW5zcG9ydCk7CisgICAgICAgICAgICB3aGlsZSAoJHRoaXMtPnByb2Nlc3Nvcl8tPnByb2Nlc3MoJGlucHV0UHJvdG9jb2wsICRvdXRwdXRQcm90b2NvbCkpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEAkdHJhbnNwb3J0LT5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uICRlKSB7CisgICAgICAgIH0KKworICAgICAgICBleGl0KDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbGxlY3RzIGFueSBjaGlsZHJlbiB3ZSBtYXkgaGF2ZQorICAgICAqCisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBjb2xsZWN0Q2hpbGRyZW4oKQorICAgIHsKKyAgICAgICAgZm9yZWFjaCAoJHRoaXMtPmNoaWxkcmVuXyBhcyAkcGlkID0+ICR0cmFuc3BvcnQpIHsKKyAgICAgICAgICAgIGlmIChwY250bF93YWl0cGlkKCRwaWQsICRzdGF0dXMsIFdOT0hBTkcpID4gMCkgeworICAgICAgICAgICAgICAgIHVuc2V0KCR0aGlzLT5jaGlsZHJlbl9bJHBpZF0pOworICAgICAgICAgICAgICAgIGlmICgkdHJhbnNwb3J0KSB7CisgICAgICAgICAgICAgICAgICAgIEAkdHJhbnNwb3J0LT5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFN0b3BzIHRoZSBzZXJ2ZXIgcnVubmluZy4gS2lsbHMgdGhlIHRyYW5zcG9ydAorICAgICAqIGFuZCB0aGVuIHN0b3BzIHRoZSBtYWluIHNlcnZpbmcgbG9vcAorICAgICAqCisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHN0b3AoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydF8tPmNsb3NlKCk7CisgICAgICAgICR0aGlzLT5zdG9wXyA9IHRydWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvU2VydmVyL1RTU0xTZXJ2ZXJTb2NrZXQucGhwIGIvbGliL3BocC9saWIvU2VydmVyL1RTU0xTZXJ2ZXJTb2NrZXQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNTg5YjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9TZXJ2ZXIvVFNTTFNlcnZlclNvY2tldC5waHAKQEAgLTAsMCArMSw5NyBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK25hbWVzcGFjZSBUaHJpZnRcU2VydmVyOworCit1c2UgVGhyaWZ0XFRyYW5zcG9ydFxUU1NMU29ja2V0OworCisvKioKKyAqIFNvY2tldCBpbXBsZW1lbnRhdGlvbiBvZiBhIHNlcnZlciBhZ2VudC4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KK2NsYXNzIFRTU0xTZXJ2ZXJTb2NrZXQgZXh0ZW5kcyBUU2VydmVyU29ja2V0Cit7CisgICAgLyoqCisgICAgICogUmVtb3RlIHBvcnQKKyAgICAgKgorICAgICAqIEB2YXIgcmVzb3VyY2UKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJGNvbnRleHRfID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFNlcnZlclNvY2tldCBjb25zdHJ1Y3RvcgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkaG9zdCBIb3N0IHRvIGxpc3RlbiBvbgorICAgICAqIEBwYXJhbSBpbnQgJHBvcnQgUG9ydCB0byBsaXN0ZW4gb24KKyAgICAgKiBAcGFyYW0gcmVzb3VyY2UgJGNvbnRleHQgU3RyZWFtIGNvbnRleHQKKyAgICAgKiBAcmV0dXJuIHZvaWQKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGhvc3QgPSAnbG9jYWxob3N0JywgJHBvcnQgPSA5MDkwLCAkY29udGV4dCA9IG51bGwpCisgICAgeworICAgICAgICAkc3NsX2hvc3QgPSAkdGhpcy0+Z2V0U1NMSG9zdCgkaG9zdCk7CisgICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJHNzbF9ob3N0LCAkcG9ydCk7CisgICAgICAgICR0aGlzLT5jb250ZXh0XyA9ICRjb250ZXh0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTU0xIb3N0KCRob3N0KQorICAgIHsKKyAgICAgICAgJHRyYW5zcG9ydF9wcm90b2NvbF9sb2MgPSBzdHJwb3MoJGhvc3QsICI6Ly8iKTsKKyAgICAgICAgaWYgKCR0cmFuc3BvcnRfcHJvdG9jb2xfbG9jID09PSBmYWxzZSkgeworICAgICAgICAgICAgJGhvc3QgPSAnc3NsOi8vJyAuICRob3N0OworICAgICAgICB9CisgICAgICAgIHJldHVybiAkaG9zdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPcGVucyBhIG5ldyBzb2NrZXQgc2VydmVyIGhhbmRsZQorICAgICAqCisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGxpc3RlbigpCisgICAgeworICAgICAgICAkdGhpcy0+bGlzdGVuZXJfID0gQHN0cmVhbV9zb2NrZXRfc2VydmVyKAorICAgICAgICAgICAgJHRoaXMtPmhvc3RfIC4gJzonIC4gJHRoaXMtPnBvcnRfLAorICAgICAgICAgICAgJGVycm5vLAorICAgICAgICAgICAgJGVycnN0ciwKKyAgICAgICAgICAgIFNUUkVBTV9TRVJWRVJfQklORCB8IFNUUkVBTV9TRVJWRVJfTElTVEVOLAorICAgICAgICAgICAgJHRoaXMtPmNvbnRleHRfCisgICAgICAgICk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50YXRpb24gb2YgYWNjZXB0LiBJZiBub3QgY2xpZW50IGlzIGFjY2VwdGVkIGluIHRoZSBnaXZlbiB0aW1lCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRTb2NrZXQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYWNjZXB0SW1wbCgpCisgICAgeworICAgICAgICAkaGFuZGxlID0gQHN0cmVhbV9zb2NrZXRfYWNjZXB0KCR0aGlzLT5saXN0ZW5lcl8sICR0aGlzLT5hY2NlcHRUaW1lb3V0XyAvIDEwMDAuMCk7CisgICAgICAgIGlmICghJGhhbmRsZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICAkc29ja2V0ID0gbmV3IFRTU0xTb2NrZXQoKTsKKyAgICAgICAgJHNvY2tldC0+c2V0SGFuZGxlKCRoYW5kbGUpOworCisgICAgICAgIHJldHVybiAkc29ja2V0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1NlcnZlci9UU2VydmVyLnBocCBiL2xpYi9waHAvbGliL1NlcnZlci9UU2VydmVyLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjhjMzc4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvU2VydmVyL1RTZXJ2ZXIucGhwCkBAIC0wLDAgKzEsMTAyIEBACis8P3BocAorCituYW1lc3BhY2UgVGhyaWZ0XFNlcnZlcjsKKwordXNlIFRocmlmdFxGYWN0b3J5XFRUcmFuc3BvcnRGYWN0b3J5OwordXNlIFRocmlmdFxGYWN0b3J5XFRQcm90b2NvbEZhY3Rvcnk7CisKKy8qKgorICogR2VuZXJpYyBjbGFzcyBmb3IgYSBUaHJpZnQgc2VydmVyLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5zZXJ2ZXIKKyAqLworYWJzdHJhY3QgY2xhc3MgVFNlcnZlcgoreworICAgIC8qKgorICAgICAqIFByb2Nlc3NvciB0byBoYW5kbGUgbmV3IGNsaWVudHMKKyAgICAgKgorICAgICAqIEB2YXIgVFByb2Nlc3NvcgorICAgICAqLworICAgIHByb3RlY3RlZCAkcHJvY2Vzc29yXzsKKworICAgIC8qKgorICAgICAqIFNlcnZlciB0cmFuc3BvcnQgdG8gYmUgdXNlZCBmb3IgbGlzdGVuaW5nCisgICAgICogYW5kIGFjY2VwdGluZyBuZXcgY2xpZW50cworICAgICAqCisgICAgICogQHZhciBUU2VydmVyVHJhbnNwb3J0CisgICAgICovCisgICAgcHJvdGVjdGVkICR0cmFuc3BvcnRfOworCisgICAgLyoqCisgICAgICogSW5wdXQgdHJhbnNwb3J0IGZhY3RvcnkKKyAgICAgKgorICAgICAqIEB2YXIgVFRyYW5zcG9ydEZhY3RvcnkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJGlucHV0VHJhbnNwb3J0RmFjdG9yeV87CisKKyAgICAvKioKKyAgICAgKiBPdXRwdXQgdHJhbnNwb3J0IGZhY3RvcnkKKyAgICAgKgorICAgICAqIEB2YXIgVFRyYW5zcG9ydEZhY3RvcnkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJG91dHB1dFRyYW5zcG9ydEZhY3RvcnlfOworCisgICAgLyoqCisgICAgICogSW5wdXQgcHJvdG9jb2wgZmFjdG9yeQorICAgICAqCisgICAgICogQHZhciBUUHJvdG9jb2xGYWN0b3J5CisgICAgICovCisgICAgcHJvdGVjdGVkICRpbnB1dFByb3RvY29sRmFjdG9yeV87CisKKyAgICAvKioKKyAgICAgKiBPdXRwdXQgcHJvdG9jb2wgZmFjdG9yeQorICAgICAqCisgICAgICogQHZhciBUUHJvdG9jb2xGYWN0b3J5CisgICAgICovCisgICAgcHJvdGVjdGVkICRvdXRwdXRQcm90b2NvbEZhY3RvcnlfOworCisgICAgLyoqCisgICAgICogU2V0cyB1cCBhbGwgdGhlIGZhY3RvcmllcywgZXRjCisgICAgICoKKyAgICAgKiBAcGFyYW0gb2JqZWN0ICRwcm9jZXNzb3IKKyAgICAgKiBAcGFyYW0gVFNlcnZlclRyYW5zcG9ydCAkdHJhbnNwb3J0CisgICAgICogQHBhcmFtIFRUcmFuc3BvcnRGYWN0b3J5ICRpbnB1dFRyYW5zcG9ydEZhY3RvcnkKKyAgICAgKiBAcGFyYW0gVFRyYW5zcG9ydEZhY3RvcnkgJG91dHB1dFRyYW5zcG9ydEZhY3RvcnkKKyAgICAgKiBAcGFyYW0gVFByb3RvY29sRmFjdG9yeSAkaW5wdXRQcm90b2NvbEZhY3RvcnkKKyAgICAgKiBAcGFyYW0gVFByb3RvY29sRmFjdG9yeSAkb3V0cHV0UHJvdG9jb2xGYWN0b3J5CisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KAorICAgICAgICAkcHJvY2Vzc29yLAorICAgICAgICBUU2VydmVyVHJhbnNwb3J0ICR0cmFuc3BvcnQsCisgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5ICRpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5ICRvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICBUUHJvdG9jb2xGYWN0b3J5ICRpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgVFByb3RvY29sRmFjdG9yeSAkb3V0cHV0UHJvdG9jb2xGYWN0b3J5CisgICAgKSB7CisgICAgICAgICR0aGlzLT5wcm9jZXNzb3JfID0gJHByb2Nlc3NvcjsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydF8gPSAkdHJhbnNwb3J0OworICAgICAgICAkdGhpcy0+aW5wdXRUcmFuc3BvcnRGYWN0b3J5XyA9ICRpbnB1dFRyYW5zcG9ydEZhY3Rvcnk7CisgICAgICAgICR0aGlzLT5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5XyA9ICRvdXRwdXRUcmFuc3BvcnRGYWN0b3J5OworICAgICAgICAkdGhpcy0+aW5wdXRQcm90b2NvbEZhY3RvcnlfID0gJGlucHV0UHJvdG9jb2xGYWN0b3J5OworICAgICAgICAkdGhpcy0+b3V0cHV0UHJvdG9jb2xGYWN0b3J5XyA9ICRvdXRwdXRQcm90b2NvbEZhY3Rvcnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VydmVzIHRoZSBzZXJ2ZXIuIFRoaXMgc2hvdWxkIG5ldmVyIHJldHVybgorICAgICAqIHVubGVzcyBhIHByb2JsZW0gcGVybWl0cyBpdCB0byBkbyBzbyBvciBpdAorICAgICAqIGlzIGludGVycnVwdGVkIGludGVudGlvbmFsbHkKKyAgICAgKgorICAgICAqIEBhYnN0cmFjdAorICAgICAqIEByZXR1cm4gdm9pZAorICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBzZXJ2ZSgpOworCisgICAgLyoqCisgICAgICogU3RvcHMgdGhlIHNlcnZlciBzZXJ2aW5nCisgICAgICoKKyAgICAgKiBAYWJzdHJhY3QKKyAgICAgKiBAcmV0dXJuIHZvaWQKKyAgICAgKi8KKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gc3RvcCgpOworfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvU2VydmVyL1RTZXJ2ZXJTb2NrZXQucGhwIGIvbGliL3BocC9saWIvU2VydmVyL1RTZXJ2ZXJTb2NrZXQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMzhmYjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9TZXJ2ZXIvVFNlcnZlclNvY2tldC5waHAKQEAgLTAsMCArMSwxMjQgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFNlcnZlcjsKKwordXNlIFRocmlmdFxUcmFuc3BvcnRcVFNvY2tldDsKKworLyoqCisgKiBTb2NrZXQgaW1wbGVtZW50YXRpb24gb2YgYSBzZXJ2ZXIgYWdlbnQuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCitjbGFzcyBUU2VydmVyU29ja2V0IGV4dGVuZHMgVFNlcnZlclRyYW5zcG9ydAoreworICAgIC8qKgorICAgICAqIEhhbmRsZSBmb3IgdGhlIGxpc3RlbmVyIHNvY2tldAorICAgICAqCisgICAgICogQHZhciByZXNvdXJjZQorICAgICAqLworICAgIHByb3RlY3RlZCAkbGlzdGVuZXJfOworCisgICAgLyoqCisgICAgICogUG9ydCBmb3IgdGhlIGxpc3RlbmVyIHRvIGxpc3RlbiBvbgorICAgICAqCisgICAgICogQHZhciBpbnQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHBvcnRfOworCisgICAgLyoqCisgICAgICogVGltZW91dCB3aGVuIGxpc3RlbmluZyBmb3IgYSBuZXcgY2xpZW50CisgICAgICoKKyAgICAgKiBAdmFyIGludAorICAgICAqLworICAgIHByb3RlY3RlZCAkYWNjZXB0VGltZW91dF8gPSAzMDAwMDsKKworICAgIC8qKgorICAgICAqIEhvc3QgdG8gbGlzdGVuIG9uCisgICAgICoKKyAgICAgKiBAdmFyIHN0cmluZworICAgICAqLworICAgIHByb3RlY3RlZCAkaG9zdF87CisKKyAgICAvKioKKyAgICAgKiBTZXJ2ZXJTb2NrZXQgY29uc3RydWN0b3IKKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJGhvc3QgSG9zdCB0byBsaXN0ZW4gb24KKyAgICAgKiBAcGFyYW0gaW50ICRwb3J0IFBvcnQgdG8gbGlzdGVuIG9uCisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRob3N0ID0gJ2xvY2FsaG9zdCcsICRwb3J0ID0gOTA5MCkKKyAgICB7CisgICAgICAgICR0aGlzLT5ob3N0XyA9ICRob3N0OworICAgICAgICAkdGhpcy0+cG9ydF8gPSAkcG9ydDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBhY2NlcHQgdGltZW91dAorICAgICAqCisgICAgICogQHBhcmFtIGludCAkYWNjZXB0VGltZW91dAorICAgICAqIEByZXR1cm4gdm9pZAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRBY2NlcHRUaW1lb3V0KCRhY2NlcHRUaW1lb3V0KQorICAgIHsKKyAgICAgICAgJHRoaXMtPmFjY2VwdFRpbWVvdXRfID0gJGFjY2VwdFRpbWVvdXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3BlbnMgYSBuZXcgc29ja2V0IHNlcnZlciBoYW5kbGUKKyAgICAgKgorICAgICAqIEByZXR1cm4gdm9pZAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBsaXN0ZW4oKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmxpc3RlbmVyXyA9IHN0cmVhbV9zb2NrZXRfc2VydmVyKCd0Y3A6Ly8nIC4gJHRoaXMtPmhvc3RfIC4gJzonIC4gJHRoaXMtPnBvcnRfKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhlIHNvY2tldCBzZXJ2ZXIgaGFuZGxlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHZvaWQKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKQorICAgIHsKKyAgICAgICAgQGZjbG9zZSgkdGhpcy0+bGlzdGVuZXJfKTsKKyAgICAgICAgJHRoaXMtPmxpc3RlbmVyXyA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50YXRpb24gb2YgYWNjZXB0LiBJZiBub3QgY2xpZW50IGlzIGFjY2VwdGVkIGluIHRoZSBnaXZlbiB0aW1lCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRTb2NrZXQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYWNjZXB0SW1wbCgpCisgICAgeworICAgICAgICAkaGFuZGxlID0gQHN0cmVhbV9zb2NrZXRfYWNjZXB0KCR0aGlzLT5saXN0ZW5lcl8sICR0aGlzLT5hY2NlcHRUaW1lb3V0XyAvIDEwMDAuMCk7CisgICAgICAgIGlmICghJGhhbmRsZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICAkc29ja2V0ID0gbmV3IFRTb2NrZXQoKTsKKyAgICAgICAgJHNvY2tldC0+c2V0SGFuZGxlKCRoYW5kbGUpOworCisgICAgICAgIHJldHVybiAkc29ja2V0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1NlcnZlci9UU2VydmVyVHJhbnNwb3J0LnBocCBiL2xpYi9waHAvbGliL1NlcnZlci9UU2VydmVyVHJhbnNwb3J0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWEyN2FmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvU2VydmVyL1RTZXJ2ZXJUcmFuc3BvcnQucGhwCkBAIC0wLDAgKzEsNTYgQEAKKzw/cGhwCisKK25hbWVzcGFjZSBUaHJpZnRcU2VydmVyOworCit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxUVHJhbnNwb3J0RXhjZXB0aW9uOworCisvKioKKyAqIEdlbmVyaWMgY2xhc3MgZm9yIFNlcnZlciBhZ2VudC4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KK2Fic3RyYWN0IGNsYXNzIFRTZXJ2ZXJUcmFuc3BvcnQKK3sKKyAgICAvKioKKyAgICAgKiBMaXN0IGZvciBuZXcgY2xpZW50cworICAgICAqCisgICAgICogQGFic3RyYWN0CisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIGxpc3RlbigpOworCisgICAgLyoqCisgICAgICogQ2xvc2UgdGhlIHNlcnZlcgorICAgICAqCisgICAgICogQGFic3RyYWN0CisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCk7CisKKyAgICAvKioKKyAgICAgKiBTdWJjbGFzc2VzIHNob3VsZCB1c2UgdGhpcyB0byBpbXBsZW1lbnQKKyAgICAgKiBhY2NlcHQuCisgICAgICoKKyAgICAgKiBAYWJzdHJhY3QKKyAgICAgKiBAcmV0dXJuIFRUcmFuc3BvcnQKKyAgICAgKi8KKyAgICBhYnN0cmFjdCBwcm90ZWN0ZWQgZnVuY3Rpb24gYWNjZXB0SW1wbCgpOworCisgICAgLyoqCisgICAgICogVXNlcyB0aGUgYWNjZXB0IGltcGxlbXRhdGlvbi4gSWYgbnVsbCBpcyByZXR1cm5lZCwgYW4KKyAgICAgKiBleGNlcHRpb24gaXMgdGhyb3duLgorICAgICAqCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uCisgICAgICogQHJldHVybiBUVHJhbnNwb3J0CisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGFjY2VwdCgpCisgICAgeworICAgICAgICAkdHJhbnNwb3J0ID0gJHRoaXMtPmFjY2VwdEltcGwoKTsKKworICAgICAgICBpZiAoJHRyYW5zcG9ydCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiYWNjZXB0KCkgbWF5IG5vdCByZXR1cm4gTlVMTCIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICR0cmFuc3BvcnQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvU2VydmVyL1RTaW1wbGVTZXJ2ZXIucGhwIGIvbGliL3BocC9saWIvU2VydmVyL1RTaW1wbGVTZXJ2ZXIucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMWRkYTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9TZXJ2ZXIvVFNpbXBsZVNlcnZlci5waHAKQEAgLTAsMCArMSw2MCBAQAorPD9waHAKKworbmFtZXNwYWNlIFRocmlmdFxTZXJ2ZXI7CisKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRUcmFuc3BvcnRFeGNlcHRpb247CisKKy8qKgorICogU2ltcGxlIGltcGxlbXRhdGlvbiBvZiBhIFRocmlmdCBzZXJ2ZXIuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnNlcnZlcgorICovCitjbGFzcyBUU2ltcGxlU2VydmVyIGV4dGVuZHMgVFNlcnZlcgoreworICAgIC8qKgorICAgICAqIEZsYWcgZm9yIHRoZSBtYWluIHNlcnZpbmcgbG9vcAorICAgICAqCisgICAgICogQHZhciBib29sCisgICAgICovCisgICAgcHJpdmF0ZSAkc3RvcF8gPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIExpc3RlbnMgZm9yIG5ldyBjbGllbnQgdXNpbmcgdGhlIHN1cHBsaWVkCisgICAgICogdHJhbnNwb3J0LiBJdCBoYW5kbGVzIFRUcmFuc3BvcnRFeGNlcHRpb25zCisgICAgICogdG8gYXZvaWQgdGltZW91dHMgZXRjIGtpbGxpbmcgaXQKKyAgICAgKgorICAgICAqIEByZXR1cm4gdm9pZAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXJ2ZSgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+bGlzdGVuKCk7CisKKyAgICAgICAgd2hpbGUgKCEkdGhpcy0+c3RvcF8pIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgJHRyYW5zcG9ydCA9ICR0aGlzLT50cmFuc3BvcnRfLT5hY2NlcHQoKTsKKworICAgICAgICAgICAgICAgIGlmICgkdHJhbnNwb3J0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgJGlucHV0VHJhbnNwb3J0ID0gJHRoaXMtPmlucHV0VHJhbnNwb3J0RmFjdG9yeV8tPmdldFRyYW5zcG9ydCgkdHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgJG91dHB1dFRyYW5zcG9ydCA9ICR0aGlzLT5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5Xy0+Z2V0VHJhbnNwb3J0KCR0cmFuc3BvcnQpOworICAgICAgICAgICAgICAgICAgICAkaW5wdXRQcm90b2NvbCA9ICR0aGlzLT5pbnB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKCRpbnB1dFRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgICAgICRvdXRwdXRQcm90b2NvbCA9ICR0aGlzLT5vdXRwdXRQcm90b2NvbEZhY3RvcnlfLT5nZXRQcm90b2NvbCgkb3V0cHV0VHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCR0aGlzLT5wcm9jZXNzb3JfLT5wcm9jZXNzKCRpbnB1dFByb3RvY29sLCAkb3V0cHV0UHJvdG9jb2wpKSB7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uICRlKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdG9wcyB0aGUgc2VydmVyIHJ1bm5pbmcuIEtpbGxzIHRoZSB0cmFuc3BvcnQKKyAgICAgKiBhbmQgdGhlbiBzdG9wcyB0aGUgbWFpbiBzZXJ2aW5nIGxvb3AKKyAgICAgKgorICAgICAqIEByZXR1cm4gdm9pZAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBzdG9wKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnRfLT5jbG9zZSgpOworICAgICAgICAkdGhpcy0+c3RvcF8gPSB0cnVlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1N0b3JlZE1lc3NhZ2VQcm90b2NvbC5waHAgYi9saWIvcGhwL2xpYi9TdG9yZWRNZXNzYWdlUHJvdG9jb2wucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0YWFhYTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9TdG9yZWRNZXNzYWdlUHJvdG9jb2wucGhwCkBAIC0wLDAgKzEsNTMgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5wcm9jZXNzb3IKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0OworCit1c2UgVGhyaWZ0XFByb3RvY29sXFRQcm90b2NvbDsKK3VzZSBUaHJpZnRcUHJvdG9jb2xcVFByb3RvY29sRGVjb3JhdG9yOworCisvKioKKyAqICBPdXIgZ29hbCB3YXMgdG8gd29yayB3aXRoIGFueSBwcm90b2NvbC4gSW4gb3JkZXIgdG8gZG8gdGhhdCwgd2UgbmVlZGVkCisgKiAgdG8gYWxsb3cgdGhlbSB0byBjYWxsIHJlYWRNZXNzYWdlQmVnaW4oKSBhbmQgZ2V0IHRoZSBNZXNzYWdlIGluIGV4YWN0bHkKKyAqICB0aGUgc3RhbmRhcmQgZm9ybWF0LCB3aXRob3V0IHRoZSBzZXJ2aWNlIG5hbWUgcHJlcGVuZGVkIHRvIHRoZSBNZXNzYWdlIG5hbWUuCisgKi8KK2NsYXNzIFN0b3JlZE1lc3NhZ2VQcm90b2NvbCBleHRlbmRzIFRQcm90b2NvbERlY29yYXRvcgoreworICAgIHByaXZhdGUgJGZuYW1lXzsKKyAgICBwcml2YXRlICRtdHlwZV87CisgICAgcHJpdmF0ZSAkcnNlcWlkXzsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChUUHJvdG9jb2wgJHByb3RvY29sLCAkZm5hbWUsICRtdHlwZSwgJHJzZXFpZCkKKyAgICB7CisgICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJHByb3RvY29sKTsKKyAgICAgICAgJHRoaXMtPmZuYW1lXyAgPSAkZm5hbWU7CisgICAgICAgICR0aGlzLT5tdHlwZV8gID0gJG10eXBlOworICAgICAgICAkdGhpcy0+cnNlcWlkXyA9ICRyc2VxaWQ7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlQmVnaW4oJiRuYW1lLCAmJHR5cGUsICYkc2VxaWQpCisgICAgeworICAgICAgICAkbmFtZSAgPSAkdGhpcy0+Zm5hbWVfOworICAgICAgICAkdHlwZSAgPSAkdGhpcy0+bXR5cGVfOworICAgICAgICAkc2VxaWQgPSAkdGhpcy0+cnNlcWlkXzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvU3RyaW5nRnVuYy9Db3JlLnBocCBiL2xpYi9waHAvbGliL1N0cmluZ0Z1bmMvQ29yZS5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYi9waHAvbGliL1RocmlmdC9TdHJpbmdGdW5jL0NvcmUucGhwCnJlbmFtZSB0byBsaWIvcGhwL2xpYi9TdHJpbmdGdW5jL0NvcmUucGhwCmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvU3RyaW5nRnVuYy9NYnN0cmluZy5waHAgYi9saWIvcGhwL2xpYi9TdHJpbmdGdW5jL01ic3RyaW5nLnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbGliL3BocC9saWIvVGhyaWZ0L1N0cmluZ0Z1bmMvTWJzdHJpbmcucGhwCnJlbmFtZSB0byBsaWIvcGhwL2xpYi9TdHJpbmdGdW5jL01ic3RyaW5nLnBocApkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L1N0cmluZ0Z1bmMvVFN0cmluZ0Z1bmMucGhwIGIvbGliL3BocC9saWIvU3RyaW5nRnVuYy9UU3RyaW5nRnVuYy5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYi9waHAvbGliL1RocmlmdC9TdHJpbmdGdW5jL1RTdHJpbmdGdW5jLnBocApyZW5hbWUgdG8gbGliL3BocC9saWIvU3RyaW5nRnVuYy9UU3RyaW5nRnVuYy5waHAKZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5waHAgYi9saWIvcGhwL2xpYi9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NGE5NjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IucGhwCkBAIC0wLDAgKzEsMTE4IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvY2Vzc29yCisgKi8KKworbmFtZXNwYWNlIFRocmlmdDsKKwordXNlIFRocmlmdFxFeGNlcHRpb25cVEV4Y2VwdGlvbjsKK3VzZSBUaHJpZnRcUHJvdG9jb2xcVFByb3RvY29sOwordXNlIFRocmlmdFxQcm90b2NvbFxUTXVsdGlwbGV4ZWRQcm90b2NvbDsKK3VzZSBUaHJpZnRcVHlwZVxUTWVzc2FnZVR5cGU7CisKKy8qKgorICogPGNvZGU+VE11bHRpcGxleGVkUHJvY2Vzc29yPC9jb2RlPiBpcyBhIFByb2Nlc3NvciBhbGxvd2luZworICogYSBzaW5nbGUgPGNvZGU+VFNlcnZlcjwvY29kZT4gdG8gcHJvdmlkZSBtdWx0aXBsZSBzZXJ2aWNlcy4KKyAqCisgKiA8cD5UbyBkbyBzbywgeW91IGluc3RhbnRpYXRlIHRoZSBwcm9jZXNzb3IgYW5kIHRoZW4gcmVnaXN0ZXIgYWRkaXRpb25hbAorICogcHJvY2Vzc29ycyB3aXRoIGl0LCBhcyBzaG93biBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6PC9wPgorICoKKyAqIDxibG9ja3F1b3RlPjxjb2RlPgorICogICAgICRwcm9jZXNzb3IgPSBuZXcgVE11bHRpcGxleGVkUHJvY2Vzc29yKCk7CisgKgorICogICAgIHByb2Nlc3Nvci0+cmVnaXN0ZXJQcm9jZXNzb3IoCisgKiAgICAgICAgICJDYWxjdWxhdG9yIiwKKyAqICAgICAgICAgbmV3IFx0dXRvcmlhbFxDYWxjdWxhdG9yUHJvY2Vzc29yKG5ldyBDYWxjdWxhdG9ySGFuZGxlcigpKSk7CisgKgorICogICAgIHByb2Nlc3Nvci0+cmVnaXN0ZXJQcm9jZXNzb3IoCisgKiAgICAgICAgICJXZWF0aGVyUmVwb3J0IiwKKyAqICAgICAgICAgbmV3IFx0dXRvcmlhbFxXZWF0aGVyUmVwb3J0UHJvY2Vzc29yKG5ldyBXZWF0aGVyUmVwb3J0SGFuZGxlcigpKSk7CisgKgorICogICAgICRwcm9jZXNzb3ItPnByb2Nlc3MoJHByb3RvY29sLCAkcHJvdG9jb2wpOworICogPC9jb2RlPjwvYmxvY2txdW90ZT4KKyAqLworCitjbGFzcyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IKK3sKKyAgICBwcml2YXRlICRzZXJ2aWNlUHJvY2Vzc29yTWFwXzsKKworICAgIC8qKgorICAgICAqICdSZWdpc3RlcicgYSBzZXJ2aWNlIHdpdGggdGhpcyA8Y29kZT5UTXVsdGlwbGV4ZWRQcm9jZXNzb3I8L2NvZGU+LiAgVGhpcworICAgICAqIGFsbG93cyB1cyB0byBicm9rZXIgcmVxdWVzdHMgdG8gaW5kaXZpZHVhbCBzZXJ2aWNlcyBieSB1c2luZyB0aGUgc2VydmljZQorICAgICAqIG5hbWUgdG8gc2VsZWN0IHRoZW0gYXQgcmVxdWVzdCB0aW1lLgorICAgICAqCisgICAgICogQHBhcmFtIHNlcnZpY2VOYW1lIE5hbWUgb2YgYSBzZXJ2aWNlLCBoYXMgdG8gYmUgaWRlbnRpY2FsIHRvIHRoZSBuYW1lCisgICAgICogZGVjbGFyZWQgaW4gdGhlIFRocmlmdCBJREwsIGUuZy4gIldlYXRoZXJSZXBvcnQiLgorICAgICAqIEBwYXJhbSBwcm9jZXNzb3IgSW1wbGVtZW50YXRpb24gb2YgYSBzZXJ2aWNlLCB1c3VhbGx5IHJlZmVycmVkIHRvCisgICAgICogYXMgImhhbmRsZXJzIiwgZS5nLiBXZWF0aGVyUmVwb3J0SGFuZGxlciBpbXBsZW1lbnRpbmcgV2VhdGhlclJlcG9ydC5JZmFjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVnaXN0ZXJQcm9jZXNzb3IoJHNlcnZpY2VOYW1lLCAkcHJvY2Vzc29yKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnNlcnZpY2VQcm9jZXNzb3JNYXBfWyRzZXJ2aWNlTmFtZV0gPSAkcHJvY2Vzc29yOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgPGNvZGU+cHJvY2VzczwvY29kZT4gcGVyZm9ybXMgdGhlIGZvbGxvd2luZyBzdGVwczoKKyAgICAgKgorICAgICAqIDxvbD4KKyAgICAgKiAgICAgPGxpPlJlYWQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbWVzc2FnZS48L2xpPgorICAgICAqICAgICA8bGk+RXh0cmFjdCB0aGUgc2VydmljZSBuYW1lIGZyb20gdGhlIG1lc3NhZ2UuPC9saT4KKyAgICAgKiAgICAgPGxpPlVzaW5nIHRoZSBzZXJ2aWNlIG5hbWUgdG8gbG9jYXRlIHRoZSBhcHByb3ByaWF0ZSBwcm9jZXNzb3IuPC9saT4KKyAgICAgKiAgICAgPGxpPkRpc3BhdGNoIHRvIHRoZSBwcm9jZXNzb3IsIHdpdGggYSBkZWNvcmF0ZWQgaW5zdGFuY2Ugb2YgVFByb3RvY29sCisgICAgICogICAgICAgICB0aGF0IGFsbG93cyByZWFkTWVzc2FnZUJlZ2luKCkgdG8gcmV0dXJuIHRoZSBvcmlnaW5hbCBNZXNzYWdlLjwvbGk+CisgICAgICogPC9vbD4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgVEV4Y2VwdGlvbiBJZiB0aGUgbWVzc2FnZSB0eXBlIGlzIG5vdCBDQUxMIG9yIE9ORVdBWSwgaWYKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgdGhlIHNlcnZpY2UgbmFtZSB3YXMgbm90IGZvdW5kIGluIHRoZSBtZXNzYWdlLCBvciBpZiB0aGUgc2VydmljZQorICAgICAqICAgICAgICAgICAgICAgICAgICBuYW1lIHdhcyBub3QgZm91bmQgaW4gdGhlIHNlcnZpY2UgbWFwLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBwcm9jZXNzKFRQcm90b2NvbCAkaW5wdXQsIFRQcm90b2NvbCAkb3V0cHV0KQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICAgIFVzZSB0aGUgYWN0dWFsIHVuZGVybHlpbmcgcHJvdG9jb2wgKGUuZy4gVEJpbmFyeVByb3RvY29sKSB0byByZWFkIHRoZQorICAgICAgICAgICAgbWVzc2FnZSBoZWFkZXIuIFRoaXMgcHVsbHMgdGhlIG1lc3NhZ2UgIm9mZiB0aGUgd2lyZSIsIHdoaWNoIHdlJ2xsCisgICAgICAgICAgICBkZWFsIHdpdGggYXQgdGhlIGVuZCBvZiB0aGlzIG1ldGhvZC4KKyAgICAgICAgKi8KKyAgICAgICAgJGlucHV0LT5yZWFkTWVzc2FnZUJlZ2luKCRmbmFtZSwgJG10eXBlLCAkcnNlcWlkKTsKKworICAgICAgICBpZiAoJG10eXBlICE9PSBUTWVzc2FnZVR5cGU6OkNBTEwgJiYgJG10eXBlICE9IFRNZXNzYWdlVHlwZTo6T05FV0FZKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiVGhpcyBzaG91bGQgbm90IGhhdmUgaGFwcGVuZWQhPyIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRXh0cmFjdCB0aGUgc2VydmljZSBuYW1lIGFuZCB0aGUgbmV3IE1lc3NhZ2UgbmFtZS4KKyAgICAgICAgaWYgKHN0cnBvcygkZm5hbWUsIFRNdWx0aXBsZXhlZFByb3RvY29sOjpTRVBBUkFUT1IpID09PSBmYWxzZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIlNlcnZpY2UgbmFtZSBub3QgZm91bmQgaW4gbWVzc2FnZSBuYW1lOiB7JGZuYW1lfS4gRGlkIHlvdSAiIC4KKyAgICAgICAgICAgICAgICAiZm9yZ2V0IHRvIHVzZSBhIFRNdWx0aXBsZXhQcm90b2NvbCBpbiB5b3VyIGNsaWVudD8iKTsKKyAgICAgICAgfQorICAgICAgICBsaXN0KCRzZXJ2aWNlTmFtZSwgJG1lc3NhZ2VOYW1lKSA9IGV4cGxvZGUoJzonLCAkZm5hbWUsIDIpOworICAgICAgICBpZiAoIWFycmF5X2tleV9leGlzdHMoJHNlcnZpY2VOYW1lLCAkdGhpcy0+c2VydmljZVByb2Nlc3Nvck1hcF8pKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiU2VydmljZSBuYW1lIG5vdCBmb3VuZDogeyRzZXJ2aWNlTmFtZX0uICBEaWQgeW91IGZvcmdldCAiIC4KKyAgICAgICAgICAgICAgICAidG8gY2FsbCByZWdpc3RlclByb2Nlc3NvcigpPyIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRGlzcGF0Y2ggcHJvY2Vzc2luZyB0byB0aGUgc3RvcmVkIHByb2Nlc3NvcgorICAgICAgICAkcHJvY2Vzc29yID0gJHRoaXMtPnNlcnZpY2VQcm9jZXNzb3JNYXBfWyRzZXJ2aWNlTmFtZV07CisKKyAgICAgICAgcmV0dXJuICRwcm9jZXNzb3ItPnByb2Nlc3MoCisgICAgICAgICAgICBuZXcgU3RvcmVkTWVzc2FnZVByb3RvY29sKCRpbnB1dCwgJG1lc3NhZ2VOYW1lLCAkbXR5cGUsICRyc2VxaWQpLAorICAgICAgICAgICAgJG91dHB1dAorICAgICAgICApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9CYXNlL1RCYXNlLnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9CYXNlL1RCYXNlLnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE5NWY3NS4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvQmFzZS9UQmFzZS5waHAKKysrIC9kZXYvbnVsbApAQCAtMSwzODAgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0Ci0gKi8KLQotbmFtZXNwYWNlIFRocmlmdFxCYXNlOwotCi11c2UgVGhyaWZ0XFR5cGVcVFR5cGU7Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmcm9tIHdoaWNoIG90aGVyIFRocmlmdCBzdHJ1Y3RzIGV4dGVuZC4gVGhpcyBpcyBzbyB0aGF0IHdlIGNhbgotICogY3V0IGJhY2sgb24gdGhlIHNpemUgb2YgdGhlIGdlbmVyYXRlZCBjb2RlIHdoaWNoIGlzIHR1cm5pbmcgb3V0IHRvIGhhdmUgYQotICogbm9udHJpdmlhbCBjb3N0IGp1c3QgdG8gbG9hZCB0aGFua3MgdG8gdGhlIHdvbmRyb3VzbHkgYWJ5c21hbCBpbXBsZW1lbnRhdGlvbgotICogb2YgUEhQLiBOb3RlIHRoYXQgY29kZSBpcyBpbnRlbnRpb25hbGx5IGR1cGxpY2F0ZWQgaW4gaGVyZSB0byBhdm9pZCBtYWtpbmcKLSAqIGZ1bmN0aW9uIGNhbGxzIGZvciBldmVyeSBmaWVsZCBvciBtZW1iZXIgb2YgYSBjb250YWluZXIuLgotICovCi1hYnN0cmFjdCBjbGFzcyBUQmFzZQotewotICBzdGF0aWMgJHRtZXRob2QgPSBhcnJheShUVHlwZTo6Qk9PTCAgID0+ICdCb29sJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGU6OkJZVEUgICA9PiAnQnl0ZScsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlOjpJMTYgICAgPT4gJ0kxNicsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlOjpJMzIgICAgPT4gJ0kzMicsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlOjpJNjQgICAgPT4gJ0k2NCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlOjpET1VCTEUgPT4gJ0RvdWJsZScsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlOjpTVFJJTkcgPT4gJ1N0cmluZycpOwotCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkKCRpbnB1dCk7Ci0KLSAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCRvdXRwdXQpOwotCi0gIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkc3BlYz1udWxsLCAkdmFscz1udWxsKQotICB7Ci0gICAgaWYgKGlzX2FycmF5KCRzcGVjKSAmJiBpc19hcnJheSgkdmFscykpIHsKLSAgICAgIGZvcmVhY2ggKCRzcGVjIGFzICRmaWQgPT4gJGZzcGVjKSB7Ci0gICAgICAgICR2YXIgPSAkZnNwZWNbJ3ZhciddOwotICAgICAgICBpZiAoaXNzZXQoJHZhbHNbJHZhcl0pKSB7Ci0gICAgICAgICAgJHRoaXMtPiR2YXIgPSAkdmFsc1skdmFyXTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiBfX3dha2V1cCgpCi0gIHsKLSAgICAkdGhpcy0+X19jb25zdHJ1Y3QoZ2V0X29iamVjdF92YXJzKCR0aGlzKSk7Ci0gIH0KLQotICBwcml2YXRlIGZ1bmN0aW9uIF9yZWFkTWFwKCYkdmFyLCAkc3BlYywgJGlucHV0KQotICB7Ci0gICAgJHhmZXIgPSAwOwotICAgICRrdHlwZSA9ICRzcGVjWydrdHlwZSddOwotICAgICR2dHlwZSA9ICRzcGVjWyd2dHlwZSddOwotICAgICRrcmVhZCA9ICR2cmVhZCA9IG51bGw7Ci0gICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFska3R5cGVdKSkgewotICAgICAgJGtyZWFkID0gJ3JlYWQnLlRCYXNlOjokdG1ldGhvZFska3R5cGVdOwotICAgIH0gZWxzZSB7Ci0gICAgICAka3NwZWMgPSAkc3BlY1sna2V5J107Ci0gICAgfQotICAgIGlmIChpc3NldChUQmFzZTo6JHRtZXRob2RbJHZ0eXBlXSkpIHsKLSAgICAgICR2cmVhZCA9ICdyZWFkJy5UQmFzZTo6JHRtZXRob2RbJHZ0eXBlXTsKLSAgICB9IGVsc2UgewotICAgICAgJHZzcGVjID0gJHNwZWNbJ3ZhbCddOwotICAgIH0KLSAgICAkdmFyID0gYXJyYXkoKTsKLSAgICAkX2t0eXBlID0gJF92dHlwZSA9ICRzaXplID0gMDsKLSAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRNYXBCZWdpbigkX2t0eXBlLCAkX3Z0eXBlLCAkc2l6ZSk7Ci0gICAgZm9yICgkaSA9IDA7ICRpIDwgJHNpemU7ICsrJGkpIHsKLSAgICAgICRrZXkgPSAkdmFsID0gbnVsbDsKLSAgICAgIGlmICgka3JlYWQgIT09IG51bGwpIHsKLSAgICAgICAgJHhmZXIgKz0gJGlucHV0LT4ka3JlYWQoJGtleSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzd2l0Y2ggKCRrdHlwZSkgewotICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6Ci0gICAgICAgICAgJGNsYXNzID0gJGtzcGVjWydjbGFzcyddOwotICAgICAgICAgICRrZXkgPSBuZXcgJGNsYXNzKCk7Ci0gICAgICAgICAgJHhmZXIgKz0gJGtleS0+cmVhZCgkaW5wdXQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpNQVA6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTWFwKCRrZXksICRrc3BlYywgJGlucHV0KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgotICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZExpc3QoJGtleSwgJGtzcGVjLCAkaW5wdXQsIGZhbHNlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgotICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZExpc3QoJGtleSwgJGtzcGVjLCAkaW5wdXQsIHRydWUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoJHZyZWFkICE9PSBudWxsKSB7Ci0gICAgICAgICR4ZmVyICs9ICRpbnB1dC0+JHZyZWFkKCR2YWwpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3dpdGNoICgkdnR5cGUpIHsKLSAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgotICAgICAgICAgICRjbGFzcyA9ICR2c3BlY1snY2xhc3MnXTsKLSAgICAgICAgICAkdmFsID0gbmV3ICRjbGFzcygpOwotICAgICAgICAgICR4ZmVyICs9ICR2YWwtPnJlYWQoJGlucHV0KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgotICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZE1hcCgkdmFsLCAkdnNwZWMsICRpbnB1dCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCR2YWwsICR2c3BlYywgJGlucHV0LCBmYWxzZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCR2YWwsICR2c3BlYywgJGlucHV0LCB0cnVlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgJHZhclska2V5XSA9ICR2YWw7Ci0gICAgfQotICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZE1hcEVuZCgpOwotCi0gICAgcmV0dXJuICR4ZmVyOwotICB9Ci0KLSAgcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZExpc3QoJiR2YXIsICRzcGVjLCAkaW5wdXQsICRzZXQ9ZmFsc2UpCi0gIHsKLSAgICAkeGZlciA9IDA7Ci0gICAgJGV0eXBlID0gJHNwZWNbJ2V0eXBlJ107Ci0gICAgJGVyZWFkID0gJHZyZWFkID0gbnVsbDsKLSAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyRldHlwZV0pKSB7Ci0gICAgICAkZXJlYWQgPSAncmVhZCcuVEJhc2U6OiR0bWV0aG9kWyRldHlwZV07Ci0gICAgfSBlbHNlIHsKLSAgICAgICRlc3BlYyA9ICRzcGVjWydlbGVtJ107Ci0gICAgfQotICAgICR2YXIgPSBhcnJheSgpOwotICAgICRfZXR5cGUgPSAkc2l6ZSA9IDA7Ci0gICAgaWYgKCRzZXQpIHsKLSAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZFNldEJlZ2luKCRfZXR5cGUsICRzaXplKTsKLSAgICB9IGVsc2UgewotICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkTGlzdEJlZ2luKCRfZXR5cGUsICRzaXplKTsKLSAgICB9Ci0gICAgZm9yICgkaSA9IDA7ICRpIDwgJHNpemU7ICsrJGkpIHsKLSAgICAgICRlbGVtID0gbnVsbDsKLSAgICAgIGlmICgkZXJlYWQgIT09IG51bGwpIHsKLSAgICAgICAgJHhmZXIgKz0gJGlucHV0LT4kZXJlYWQoJGVsZW0pOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgJGVzcGVjID0gJHNwZWNbJ2VsZW0nXTsKLSAgICAgICAgc3dpdGNoICgkZXR5cGUpIHsKLSAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgotICAgICAgICAgICRjbGFzcyA9ICRlc3BlY1snY2xhc3MnXTsKLSAgICAgICAgICAkZWxlbSA9IG5ldyAkY2xhc3MoKTsKLSAgICAgICAgICAkeGZlciArPSAkZWxlbS0+cmVhZCgkaW5wdXQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpNQVA6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTWFwKCRlbGVtLCAkZXNwZWMsICRpbnB1dCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCRlbGVtLCAkZXNwZWMsICRpbnB1dCwgZmFsc2UpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTGlzdCgkZWxlbSwgJGVzcGVjLCAkaW5wdXQsIHRydWUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoJHNldCkgewotICAgICAgICAkdmFyWyRlbGVtXSA9IHRydWU7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAkdmFyIFtdPSAkZWxlbTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCRzZXQpIHsKLSAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZFNldEVuZCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRMaXN0RW5kKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuICR4ZmVyOwotICB9Ci0KLSAgcHJvdGVjdGVkIGZ1bmN0aW9uIF9yZWFkKCRjbGFzcywgJHNwZWMsICRpbnB1dCkKLSAgewotICAgICR4ZmVyID0gMDsKLSAgICAkZm5hbWUgPSBudWxsOwotICAgICRmdHlwZSA9IDA7Ci0gICAgJGZpZCA9IDA7Ci0gICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RydWN0QmVnaW4oJGZuYW1lKTsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkRmllbGRCZWdpbigkZm5hbWUsICRmdHlwZSwgJGZpZCk7Ci0gICAgICBpZiAoJGZ0eXBlID09IFRUeXBlOjpTVE9QKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgaWYgKGlzc2V0KCRzcGVjWyRmaWRdKSkgewotICAgICAgICAkZnNwZWMgPSAkc3BlY1skZmlkXTsKLSAgICAgICAgJHZhciA9ICRmc3BlY1sndmFyJ107Ci0gICAgICAgIGlmICgkZnR5cGUgPT0gJGZzcGVjWyd0eXBlJ10pIHsKLSAgICAgICAgICAkeGZlciA9IDA7Ci0gICAgICAgICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFskZnR5cGVdKSkgewotICAgICAgICAgICAgJGZ1bmMgPSAncmVhZCcuVEJhc2U6OiR0bWV0aG9kWyRmdHlwZV07Ci0gICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPiRmdW5jKCR0aGlzLT4kdmFyKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3dpdGNoICgkZnR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKLSAgICAgICAgICAgICAgJGNsYXNzID0gJGZzcGVjWydjbGFzcyddOwotICAgICAgICAgICAgICAkdGhpcy0+JHZhciA9IG5ldyAkY2xhc3MoKTsKLSAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPiR2YXItPnJlYWQoJGlucHV0KTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFRUeXBlOjpNQVA6Ci0gICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZE1hcCgkdGhpcy0+JHZhciwgJGZzcGVjLCAkaW5wdXQpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKLSAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTGlzdCgkdGhpcy0+JHZhciwgJGZzcGVjLCAkaW5wdXQsIGZhbHNlKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6Ci0gICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZExpc3QoJHRoaXMtPiR2YXIsICRmc3BlYywgJGlucHV0LCB0cnVlKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICAkeGZlciArPSAkaW5wdXQtPnNraXAoJGZ0eXBlKTsKLSAgICAgIH0KLSAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZEZpZWxkRW5kKCk7Ci0gICAgfQotICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZFN0cnVjdEVuZCgpOwotCi0gICAgcmV0dXJuICR4ZmVyOwotICB9Ci0KLSAgcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVNYXAoJHZhciwgJHNwZWMsICRvdXRwdXQpCi0gIHsKLSAgICAkeGZlciA9IDA7Ci0gICAgJGt0eXBlID0gJHNwZWNbJ2t0eXBlJ107Ci0gICAgJHZ0eXBlID0gJHNwZWNbJ3Z0eXBlJ107Ci0gICAgJGt3cml0ZSA9ICR2d3JpdGUgPSBudWxsOwotICAgIGlmIChpc3NldChUQmFzZTo6JHRtZXRob2RbJGt0eXBlXSkpIHsKLSAgICAgICRrd3JpdGUgPSAnd3JpdGUnLlRCYXNlOjokdG1ldGhvZFska3R5cGVdOwotICAgIH0gZWxzZSB7Ci0gICAgICAka3NwZWMgPSAkc3BlY1sna2V5J107Ci0gICAgfQotICAgIGlmIChpc3NldChUQmFzZTo6JHRtZXRob2RbJHZ0eXBlXSkpIHsKLSAgICAgICR2d3JpdGUgPSAnd3JpdGUnLlRCYXNlOjokdG1ldGhvZFskdnR5cGVdOwotICAgIH0gZWxzZSB7Ci0gICAgICAkdnNwZWMgPSAkc3BlY1sndmFsJ107Ci0gICAgfQotICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlTWFwQmVnaW4oJGt0eXBlLCAkdnR5cGUsIGNvdW50KCR2YXIpKTsKLSAgICBmb3JlYWNoICgkdmFyIGFzICRrZXkgPT4gJHZhbCkgewotICAgICAgaWYgKGlzc2V0KCRrd3JpdGUpKSB7Ci0gICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPiRrd3JpdGUoJGtleSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzd2l0Y2ggKCRrdHlwZSkgewotICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6Ci0gICAgICAgICAgJHhmZXIgKz0gJGtleS0+d3JpdGUoJG91dHB1dCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6Ok1BUDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTWFwKCRrZXksICRrc3BlYywgJG91dHB1dCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgka2V5LCAka3NwZWMsICRvdXRwdXQsIGZhbHNlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgotICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCRrZXksICRrc3BlYywgJG91dHB1dCwgdHJ1ZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChpc3NldCgkdndyaXRlKSkgewotICAgICAgICAkeGZlciArPSAkb3V0cHV0LT4kdndyaXRlKCR2YWwpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3dpdGNoICgkdnR5cGUpIHsKLSAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgotICAgICAgICAgICR4ZmVyICs9ICR2YWwtPndyaXRlKCRvdXRwdXQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpNQVA6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZU1hcCgkdmFsLCAkdnNwZWMsICRvdXRwdXQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJHZhbCwgJHZzcGVjLCAkb3V0cHV0LCBmYWxzZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgkdmFsLCAkdnNwZWMsICRvdXRwdXQsIHRydWUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlTWFwRW5kKCk7Ci0KLSAgICByZXR1cm4gJHhmZXI7Ci0gIH0KLQotICBwcml2YXRlIGZ1bmN0aW9uIF93cml0ZUxpc3QoJHZhciwgJHNwZWMsICRvdXRwdXQsICRzZXQ9ZmFsc2UpCi0gIHsKLSAgICAkeGZlciA9IDA7Ci0gICAgJGV0eXBlID0gJHNwZWNbJ2V0eXBlJ107Ci0gICAgJGV3cml0ZSA9IG51bGw7Ci0gICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFskZXR5cGVdKSkgewotICAgICAgJGV3cml0ZSA9ICd3cml0ZScuVEJhc2U6OiR0bWV0aG9kWyRldHlwZV07Ci0gICAgfSBlbHNlIHsKLSAgICAgICRlc3BlYyA9ICRzcGVjWydlbGVtJ107Ci0gICAgfQotICAgIGlmICgkc2V0KSB7Ci0gICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVNldEJlZ2luKCRldHlwZSwgY291bnQoJHZhcikpOwotICAgIH0gZWxzZSB7Ci0gICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUxpc3RCZWdpbigkZXR5cGUsIGNvdW50KCR2YXIpKTsKLSAgICB9Ci0gICAgZm9yZWFjaCAoJHZhciBhcyAka2V5ID0+ICR2YWwpIHsKLSAgICAgICRlbGVtID0gJHNldCA/ICRrZXkgOiAkdmFsOwotICAgICAgaWYgKGlzc2V0KCRld3JpdGUpKSB7Ci0gICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPiRld3JpdGUoJGVsZW0pOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3dpdGNoICgkZXR5cGUpIHsKLSAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgotICAgICAgICAgICR4ZmVyICs9ICRlbGVtLT53cml0ZSgkb3V0cHV0KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgotICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVNYXAoJGVsZW0sICRlc3BlYywgJG91dHB1dCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgkZWxlbSwgJGVzcGVjLCAkb3V0cHV0LCBmYWxzZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgkZWxlbSwgJGVzcGVjLCAkb3V0cHV0LCB0cnVlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBpZiAoJHNldCkgewotICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTZXRFbmQoKTsKLSAgICB9IGVsc2UgewotICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVMaXN0RW5kKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuICR4ZmVyOwotICB9Ci0KLSAgcHJvdGVjdGVkIGZ1bmN0aW9uIF93cml0ZSgkY2xhc3MsICRzcGVjLCAkb3V0cHV0KQotICB7Ci0gICAgJHhmZXIgPSAwOwotICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0QmVnaW4oJGNsYXNzKTsKLSAgICBmb3JlYWNoICgkc3BlYyBhcyAkZmlkID0+ICRmc3BlYykgewotICAgICAgJHZhciA9ICRmc3BlY1sndmFyJ107Ci0gICAgICBpZiAoJHRoaXMtPiR2YXIgIT09IG51bGwpIHsKLSAgICAgICAgJGZ0eXBlID0gJGZzcGVjWyd0eXBlJ107Ci0gICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRCZWdpbigkdmFyLCAkZnR5cGUsICRmaWQpOwotICAgICAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyRmdHlwZV0pKSB7Ci0gICAgICAgICAgJGZ1bmMgPSAnd3JpdGUnLlRCYXNlOjokdG1ldGhvZFskZnR5cGVdOwotICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPiRmdW5jKCR0aGlzLT4kdmFyKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBzd2l0Y2ggKCRmdHlwZSkgewotICAgICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKLSAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT4kdmFyLT53cml0ZSgkb3V0cHV0KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgVFR5cGU6Ok1BUDoKLSAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVNYXAoJHRoaXMtPiR2YXIsICRmc3BlYywgJG91dHB1dCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6Ci0gICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgkdGhpcy0+JHZhciwgJGZzcGVjLCAkb3V0cHV0LCBmYWxzZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6Ci0gICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgkdGhpcy0+JHZhciwgJGZzcGVjLCAkb3V0cHV0LCB0cnVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkRW5kKCk7Ci0gICAgICB9Ci0gICAgfQotICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRTdG9wKCk7Ci0gICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RFbmQoKTsKLQotICAgIHJldHVybiAkeGZlcjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L0NsYXNzTG9hZGVyL1RocmlmdENsYXNzTG9hZGVyLnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9DbGFzc0xvYWRlci9UaHJpZnRDbGFzc0xvYWRlci5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NTc1Y2UuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L0NsYXNzTG9hZGVyL1RocmlmdENsYXNzTG9hZGVyLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBDbGFzc0xvYWRlciB0byBsb2FkIFRocmlmdCBsaWJyYXJ5IGFuZCBkZWZpbml0aW9ucwotICogSW5zcGlyZWQgZnJvbSBVbml2ZXJzYWxDbGFzc0xvYWRlciBmcm9tIFN5bWZvbnkgMgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC5jbGFzc2xvYWRlcgotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcQ2xhc3NMb2FkZXI7Ci0KLWNsYXNzIFRocmlmdENsYXNzTG9hZGVyCi17Ci0gICAgLyoqCi0gICAgICogTmFtZXNwYWNlcyBwYXRoCi0gICAgICogQHZhciBhcnJheQotICAgICAqLwotICAgIHByb3RlY3RlZCAkbmFtZXNwYWNlcyA9IGFycmF5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBUaHJpZnQgZGVmaW5pdGlvbiBwYXRocwotICAgICAqIEB2YXIgdHlwZQotICAgICAqLwotICAgIHByb3RlY3RlZCAkZGVmaW5pdGlvbnMgPSBhcnJheSgpOwotCi0gICAgLyoqCi0gICAgICogRG8gd2UgdXNlIEFQQyBjYWNoZSA/Ci0gICAgICogQHZhciBib29sZWFuCi0gICAgICovCi0gICAgcHJvdGVjdGVkICRhcGMgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIEFQQyBDYWNoZSBwcmVmaXgKLSAgICAgKiBAdmFyIHN0cmluZwotICAgICAqLwotICAgIHByb3RlY3RlZCAkYXBjX3ByZWZpeDsKLQotICAgIC8qKgotICAgICAqIFNldCBhdXRvbG9hZGVyIHRvIHVzZSBBUEMgY2FjaGUKLSAgICAgKiBAcGFyYW0gYm9vbGVhbiAkYXBjCi0gICAgICogQHBhcmFtIHN0cmluZyAgJGFwY19wcmVmaXgKLSAgICAgKi8KLSAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGFwYyA9IGZhbHNlLCAkYXBjX3ByZWZpeCA9IG51bGwpCi0gICAgewotICAgICAgICAkdGhpcy0+YXBjID0gJGFwYzsKLSAgICAgICAgJHRoaXMtPmFwY19wcmVmaXggPSAkYXBjX3ByZWZpeDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWdpc3RlcnMgYSBuYW1lc3BhY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RyaW5nICAgICAgICRuYW1lc3BhY2UgVGhlIG5hbWVzcGFjZQotICAgICAqIEBwYXJhbSBhcnJheXxzdHJpbmcgJHBhdGhzICAgICBUaGUgbG9jYXRpb24ocykgb2YgdGhlIG5hbWVzcGFjZQotICAgICAqLwotICAgIHB1YmxpYyBmdW5jdGlvbiByZWdpc3Rlck5hbWVzcGFjZSgkbmFtZXNwYWNlLCAkcGF0aHMpCi0gICAgewotICAgICAgICAkdGhpcy0+bmFtZXNwYWNlc1skbmFtZXNwYWNlXSA9IChhcnJheSkgJHBhdGhzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlZ2lzdGVycyBhIFRocmlmdCBkZWZpbml0aW9uIG5hbWVzcGFjZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdHJpbmcgICAgICAgJG5hbWVzcGFjZSBUaGUgZGVmaW5pdGlvbiBuYW1lc3BhY2UKLSAgICAgKiBAcGFyYW0gYXJyYXl8c3RyaW5nICRwYXRocyAgICAgVGhlIGxvY2F0aW9uKHMpIG9mIHRoZSBkZWZpbml0aW9uIG5hbWVzcGFjZQotICAgICAqLwotICAgIHB1YmxpYyBmdW5jdGlvbiByZWdpc3RlckRlZmluaXRpb24oJG5hbWVzcGFjZSwgJHBhdGhzKQotICAgIHsKLSAgICAgICAgJHRoaXMtPmRlZmluaXRpb25zWyRuYW1lc3BhY2VdID0gKGFycmF5KSAkcGF0aHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVnaXN0ZXJzIHRoaXMgaW5zdGFuY2UgYXMgYW4gYXV0b2xvYWRlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBCb29sZWFuICRwcmVwZW5kIFdoZXRoZXIgdG8gcHJlcGVuZCB0aGUgYXV0b2xvYWRlciBvciBub3QKLSAgICAgKi8KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVnaXN0ZXIoJHByZXBlbmQgPSBmYWxzZSkKLSAgICB7Ci0gICAgICAgIHNwbF9hdXRvbG9hZF9yZWdpc3RlcihhcnJheSgkdGhpcywgJ2xvYWRDbGFzcycpLCB0cnVlLCAkcHJlcGVuZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9hZHMgdGhlIGdpdmVuIGNsYXNzLCBkZWZpbml0aW9uIG9yIGludGVyZmFjZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdHJpbmcgJGNsYXNzIFRoZSBuYW1lIG9mIHRoZSBjbGFzcwotICAgICAqLwotICAgIHB1YmxpYyBmdW5jdGlvbiBsb2FkQ2xhc3MoJGNsYXNzKQotICAgIHsKLSAgICAgICAgaWYgKAotICAgICAgICAgICAgKHRydWUgPT09ICR0aGlzLT5hcGMgJiYgKCRmaWxlID0gJHRoaXMtPmZpbmRGaWxlSW5BcGMoJGNsYXNzKSkpIG9yCi0gICAgICAgICAgICAoJGZpbGUgPSAkdGhpcy0+ZmluZEZpbGUoJGNsYXNzKSkKLSAgICAgICAgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXF1aXJlX29uY2UgJGZpbGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb2FkcyB0aGUgZ2l2ZW4gY2xhc3Mgb3IgaW50ZXJmYWNlIGluIEFQQy4KLSAgICAgKiBAcGFyYW0gIHN0cmluZyAkY2xhc3MgVGhlIG5hbWUgb2YgdGhlIGNsYXNzCi0gICAgICogQHJldHVybiBzdHJpbmcKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZmluZEZpbGVJbkFwYygkY2xhc3MpCi0gICAgewotICAgICAgICBpZiAoZmFsc2UgPT09ICRmaWxlID0gYXBjX2ZldGNoKCR0aGlzLT5hcGNfcHJlZml4LiRjbGFzcykpIHsKLSAgICAgICAgICAgIGFwY19zdG9yZSgkdGhpcy0+YXBjX3ByZWZpeC4kY2xhc3MsICRmaWxlID0gJHRoaXMtPmZpbmRGaWxlKCRjbGFzcykpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuICRmaWxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbmQgY2xhc3MgaW4gbmFtZXNwYWNlcyBvciBkZWZpbml0aW9ucyBkaXJlY3RvcmllcwotICAgICAqIEBwYXJhbSAgc3RyaW5nICRjbGFzcwotICAgICAqIEByZXR1cm4gc3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIGZ1bmN0aW9uIGZpbmRGaWxlKCRjbGFzcykKLSAgICB7Ci0gICAgICAgIC8vIFJlbW92ZSBmaXJzdCBiYWNrc2xhc2gKLSAgICAgICAgaWYgKCdcXCcgPT0gJGNsYXNzWzBdKSB7Ci0gICAgICAgICAgICAkY2xhc3MgPSBzdWJzdHIoJGNsYXNzLCAxKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChmYWxzZSAhPT0gJHBvcyA9IHN0cnJwb3MoJGNsYXNzLCAnXFwnKSkgewotICAgICAgICAgICAgLy8gTmFtZXNwYWNlZCBjbGFzcyBuYW1lCi0gICAgICAgICAgICAkbmFtZXNwYWNlID0gc3Vic3RyKCRjbGFzcywgMCwgJHBvcyk7Ci0KLSAgICAgICAgICAgIC8vIEl0ZXJhdGUgaW4gbm9ybWFsIG5hbWVzcGFjZXMKLSAgICAgICAgICAgIGZvcmVhY2ggKCR0aGlzLT5uYW1lc3BhY2VzIGFzICRucyA9PiAkZGlycykgewotICAgICAgICAgICAgICAgIC8vRG9uJ3QgaW50ZXJmZXJlIHdpdGggb3RoZXIgYXV0b2xvYWRlcnMKLSAgICAgICAgICAgICAgICBpZiAoMCAhPT0gc3RycG9zKCRuYW1lc3BhY2UsICRucykpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZm9yZWFjaCAoJGRpcnMgYXMgJGRpcikgewotICAgICAgICAgICAgICAgICAgICAkY2xhc3NOYW1lID0gc3Vic3RyKCRjbGFzcywgJHBvcyArIDEpOwotCi0gICAgICAgICAgICAgICAgICAgICRmaWxlID0gJGRpci5ESVJFQ1RPUllfU0VQQVJBVE9SLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX3JlcGxhY2UoJ1xcJywgRElSRUNUT1JZX1NFUEFSQVRPUiwgJG5hbWVzcGFjZSkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESVJFQ1RPUllfU0VQQVJBVE9SLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNsYXNzTmFtZS4nLnBocCc7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVfZXhpc3RzKCRmaWxlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRmaWxlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBJdGVyYXRlIGluIFRocmlmdCBuYW1lc3BhY2VzCi0KLSAgICAgICAgICAgIC8vIFJlbW92ZSBmaXJzdCBwYXJ0IG9mIG5hbWVzcGFjZQotICAgICAgICAgICAgJG0gPSBleHBsb2RlKCdcXCcsICRjbGFzcyk7Ci0KLSAgICAgICAgICAgIC8vIElnbm9yZSB3cm9uZyBjYWxsCi0gICAgICAgICAgICBpZiAoY291bnQoJG0pIDw9IDEpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICRjbGFzcyA9IGFycmF5X3BvcCgkbSk7Ci0gICAgICAgICAgICAkbmFtZXNwYWNlID0gaW1wbG9kZSgnXFwnLCAkbSk7Ci0KLSAgICAgICAgICAgIGZvcmVhY2ggKCR0aGlzLT5kZWZpbml0aW9ucyBhcyAkbnMgPT4gJGRpcnMpIHsKLSAgICAgICAgICAgICAgICAvL0Rvbid0IGludGVyZmVyZSB3aXRoIG90aGVyIGF1dG9sb2FkZXJzCi0gICAgICAgICAgICAgICAgaWYgKDAgIT09IHN0cnBvcygkbmFtZXNwYWNlLCAkbnMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRkaXJzIGFzICRkaXIpIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICAgICAqIEF2YWlsYWJsZSBpbiBzZXJ2aWNlOiBJbnRlcmZhY2UsIENsaWVudCwgUHJvY2Vzc29yLCBSZXN0Ci0gICAgICAgICAgICAgICAgICAgICAqIEFuZCBldmVyeSBzZXJ2aWNlIG1ldGhvZHMgKF8uKykKLSAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIGlmKAotICAgICAgICAgICAgICAgICAgICAgICAgMCA9PT0gcHJlZ19tYXRjaCgnIyguKykoaWZ8Y2xpZW50fHByb2Nlc3NvcnxyZXN0KSQjaScsICRjbGFzcywgJG4pIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgMCA9PT0gcHJlZ19tYXRjaCgnIyguKylfW2EtejAtOV0rXyhhcmdzfHJlc3VsdCkkI2knLCAkY2xhc3MsICRuKQotICAgICAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICRjbGFzc05hbWUgPSAnVHlwZXMnOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgJGNsYXNzTmFtZSA9ICRuWzFdOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgJGZpbGUgPSAkZGlyLkRJUkVDVE9SWV9TRVBBUkFUT1IgLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX3JlcGxhY2UoJ1xcJywgRElSRUNUT1JZX1NFUEFSQVRPUiwgJG5hbWVzcGFjZSkgLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElSRUNUT1JZX1NFUEFSQVRPUiAuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY2xhc3NOYW1lIC4gJy5waHAnOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChmaWxlX2V4aXN0cygkZmlsZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkZmlsZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9FeGNlcHRpb24vVEFwcGxpY2F0aW9uRXhjZXB0aW9uLnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9FeGNlcHRpb24vVEFwcGxpY2F0aW9uRXhjZXB0aW9uLnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE2ODlmYy4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvRXhjZXB0aW9uL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5waHAKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQKLSAqLwotCi1uYW1lc3BhY2UgVGhyaWZ0XEV4Y2VwdGlvbjsKLQotdXNlIFRocmlmdFxUeXBlXFRUeXBlOwotCi1jbGFzcyBUQXBwbGljYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBURXhjZXB0aW9uCi17Ci0gIHN0YXRpYyAkX1RTUEVDID0KLSAgICBhcnJheSgxID0+IGFycmF5KCd2YXInID0+ICdtZXNzYWdlJywKLSAgICAgICAgICAgICAgICAgICAgICd0eXBlJyA9PiBUVHlwZTo6U1RSSU5HKSwKLSAgICAgICAgICAyID0+IGFycmF5KCd2YXInID0+ICdjb2RlJywKLSAgICAgICAgICAgICAgICAgICAgICd0eXBlJyA9PiBUVHlwZTo6STMyKSk7Ci0KLSAgY29uc3QgVU5LTk9XTiA9IDA7Ci0gIGNvbnN0IFVOS05PV05fTUVUSE9EID0gMTsKLSAgY29uc3QgSU5WQUxJRF9NRVNTQUdFX1RZUEUgPSAyOwotICBjb25zdCBXUk9OR19NRVRIT0RfTkFNRSA9IDM7Ci0gIGNvbnN0IEJBRF9TRVFVRU5DRV9JRCA9IDQ7Ci0gIGNvbnN0IE1JU1NJTkdfUkVTVUxUID0gNTsKLSAgY29uc3QgSU5URVJOQUxfRVJST1IgPSA2OwotICBjb25zdCBQUk9UT0NPTF9FUlJPUiA9IDc7Ci0gIGNvbnN0IElOVkFMSURfVFJBTlNGT1JNID0gODsKLSAgY29uc3QgSU5WQUxJRF9QUk9UT0NPTCA9IDk7Ci0gIGNvbnN0IFVOU1VQUE9SVEVEX0NMSUVOVF9UWVBFID0gMTA7Ci0KLSAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRtZXNzYWdlPW51bGwsICRjb2RlPTApCi0gIHsKLSAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRtZXNzYWdlLCAkY29kZSk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkb3V0cHV0KQotICB7Ci0gICAgcmV0dXJuICR0aGlzLT5fcmVhZCgnVEFwcGxpY2F0aW9uRXhjZXB0aW9uJywgc2VsZjo6JF9UU1BFQywgJG91dHB1dCk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJG91dHB1dCkKLSAgewotICAgICR4ZmVyID0gMDsKLSAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEJlZ2luKCdUQXBwbGljYXRpb25FeGNlcHRpb24nKTsKLSAgICBpZiAoJG1lc3NhZ2UgPSAkdGhpcy0+Z2V0TWVzc2FnZSgpKSB7Ci0gICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkQmVnaW4oJ21lc3NhZ2UnLCBUVHlwZTo6U1RSSU5HLCAxKTsKLSAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RyaW5nKCRtZXNzYWdlKTsKLSAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRFbmQoKTsKLSAgICB9Ci0gICAgaWYgKCRjb2RlID0gJHRoaXMtPmdldENvZGUoKSkgewotICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEJlZ2luKCd0eXBlJywgVFR5cGU6OkkzMiwgMik7Ci0gICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUkzMigkY29kZSk7Ci0gICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkRW5kKCk7Ci0gICAgfQotICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRTdG9wKCk7Ci0gICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RFbmQoKTsKLQotICAgIHJldHVybiAkeGZlcjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L0V4Y2VwdGlvbi9URXhjZXB0aW9uLnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9FeGNlcHRpb24vVEV4Y2VwdGlvbi5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMDY4NDMuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L0V4Y2VwdGlvbi9URXhjZXB0aW9uLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDM4MyArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQKLSAqLwotCi1uYW1lc3BhY2UgVGhyaWZ0XEV4Y2VwdGlvbjsKLQotdXNlIFRocmlmdFxUeXBlXFRUeXBlOwotdXNlIFRocmlmdFxCYXNlXFRCYXNlOwotCi0vKioKLSAqIE5PVEUobWNzbGVlKTogVGhpcyBjdXJyZW50bHkgY29udGFpbnMgYSB0b24gb2YgZHVwbGljYXRlZCBjb2RlIGZyb20gVEJhc2UKLSAqIGJlY2F1c2Ugd2UgbmVlZCB0byBzYXZlIENQVSBjeWNsZXMgYW5kIHRoaXMgaXMgbm90IHlldCBpbiBhbiBleHRlbnNpb24uCi0gKiBJZGVhbGx5IHdlJ2QgbXVsdGlwbHktaW5oZXJpdCBURXhjZXB0aW9uIGZyb20gYm90aCBFeGNlcHRpb24gYW5kIEJhc2UsIGJ1dAotICogdGhhdCdzIG5vdCBwb3NzaWJsZSBpbiBQSFAgYW5kIHRoZXJlIGFyZSBubyBtb2R1bGVzIGVpdGhlciwgc28gZm9yIG5vdyB3ZQotICogYXBvbG9nZXRpY2FsbHkgdGFrZSBhIHRyaXAgdG8gSGFja1Rvd24uCi0gKgotICogQ2FuIGJlIGNhbGxlZCB3aXRoIHN0YW5kYXJkIEV4Y2VwdGlvbiBjb25zdHJ1Y3RvciAobWVzc2FnZSwgY29kZSkgb3Igd2l0aAotICogVGhyaWZ0IEJhc2Ugb2JqZWN0IGNvbnN0cnVjdG9yIChzcGVjLCB2YWxzKS4KLSAqCi0gKiBAcGFyYW0gbWl4ZWQgJHAxIE1lc3NhZ2UgKHN0cmluZykgb3IgdHlwZS1zcGVjIChhcnJheSkKLSAqIEBwYXJhbSBtaXhlZCAkcDIgQ29kZSAoaW50ZWdlcikgb3IgdmFsdWVzIChhcnJheSkKLSAqLwotY2xhc3MgVEV4Y2VwdGlvbiBleHRlbmRzIFxFeGNlcHRpb24KLXsKLSAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRwMT1udWxsLCAkcDI9MCkKLSAgewotICAgIGlmIChpc19hcnJheSgkcDEpICYmIGlzX2FycmF5KCRwMikpIHsKLSAgICAgICRzcGVjID0gJHAxOwotICAgICAgJHZhbHMgPSAkcDI7Ci0gICAgICBmb3JlYWNoICgkc3BlYyBhcyAkZmlkID0+ICRmc3BlYykgewotICAgICAgICAkdmFyID0gJGZzcGVjWyd2YXInXTsKLSAgICAgICAgaWYgKGlzc2V0KCR2YWxzWyR2YXJdKSkgewotICAgICAgICAgICR0aGlzLT4kdmFyID0gJHZhbHNbJHZhcl07Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkcDEsICRwMik7Ci0gICAgfQotICB9Ci0KLSAgc3RhdGljICR0bWV0aG9kID0gYXJyYXkoVFR5cGU6OkJPT0wgICA9PiAnQm9vbCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlOjpCWVRFICAgPT4gJ0J5dGUnLAotICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZTo6STE2ICAgID0+ICdJMTYnLAotICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZTo6STMyICAgID0+ICdJMzInLAotICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZTo6STY0ICAgID0+ICdJNjQnLAotICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZTo6RE9VQkxFID0+ICdEb3VibGUnLAotICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZTo6U1RSSU5HID0+ICdTdHJpbmcnKTsKLQotICBwcml2YXRlIGZ1bmN0aW9uIF9yZWFkTWFwKCYkdmFyLCAkc3BlYywgJGlucHV0KQotICB7Ci0gICAgJHhmZXIgPSAwOwotICAgICRrdHlwZSA9ICRzcGVjWydrdHlwZSddOwotICAgICR2dHlwZSA9ICRzcGVjWyd2dHlwZSddOwotICAgICRrcmVhZCA9ICR2cmVhZCA9IG51bGw7Ci0gICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFska3R5cGVdKSkgewotICAgICAgJGtyZWFkID0gJ3JlYWQnLlRCYXNlOjokdG1ldGhvZFska3R5cGVdOwotICAgIH0gZWxzZSB7Ci0gICAgICAka3NwZWMgPSAkc3BlY1sna2V5J107Ci0gICAgfQotICAgIGlmIChpc3NldChUQmFzZTo6JHRtZXRob2RbJHZ0eXBlXSkpIHsKLSAgICAgICR2cmVhZCA9ICdyZWFkJy5UQmFzZTo6JHRtZXRob2RbJHZ0eXBlXTsKLSAgICB9IGVsc2UgewotICAgICAgJHZzcGVjID0gJHNwZWNbJ3ZhbCddOwotICAgIH0KLSAgICAkdmFyID0gYXJyYXkoKTsKLSAgICAkX2t0eXBlID0gJF92dHlwZSA9ICRzaXplID0gMDsKLSAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRNYXBCZWdpbigkX2t0eXBlLCAkX3Z0eXBlLCAkc2l6ZSk7Ci0gICAgZm9yICgkaSA9IDA7ICRpIDwgJHNpemU7ICsrJGkpIHsKLSAgICAgICRrZXkgPSAkdmFsID0gbnVsbDsKLSAgICAgIGlmICgka3JlYWQgIT09IG51bGwpIHsKLSAgICAgICAgJHhmZXIgKz0gJGlucHV0LT4ka3JlYWQoJGtleSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzd2l0Y2ggKCRrdHlwZSkgewotICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6Ci0gICAgICAgICAgJGNsYXNzID0gJGtzcGVjWydjbGFzcyddOwotICAgICAgICAgICRrZXkgPSBuZXcgJGNsYXNzKCk7Ci0gICAgICAgICAgJHhmZXIgKz0gJGtleS0+cmVhZCgkaW5wdXQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpNQVA6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTWFwKCRrZXksICRrc3BlYywgJGlucHV0KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgotICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZExpc3QoJGtleSwgJGtzcGVjLCAkaW5wdXQsIGZhbHNlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgotICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZExpc3QoJGtleSwgJGtzcGVjLCAkaW5wdXQsIHRydWUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoJHZyZWFkICE9PSBudWxsKSB7Ci0gICAgICAgICR4ZmVyICs9ICRpbnB1dC0+JHZyZWFkKCR2YWwpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3dpdGNoICgkdnR5cGUpIHsKLSAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgotICAgICAgICAgICRjbGFzcyA9ICR2c3BlY1snY2xhc3MnXTsKLSAgICAgICAgICAkdmFsID0gbmV3ICRjbGFzcygpOwotICAgICAgICAgICR4ZmVyICs9ICR2YWwtPnJlYWQoJGlucHV0KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgotICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZE1hcCgkdmFsLCAkdnNwZWMsICRpbnB1dCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCR2YWwsICR2c3BlYywgJGlucHV0LCBmYWxzZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCR2YWwsICR2c3BlYywgJGlucHV0LCB0cnVlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgJHZhclska2V5XSA9ICR2YWw7Ci0gICAgfQotICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZE1hcEVuZCgpOwotCi0gICAgcmV0dXJuICR4ZmVyOwotICB9Ci0KLSAgcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZExpc3QoJiR2YXIsICRzcGVjLCAkaW5wdXQsICRzZXQ9ZmFsc2UpCi0gIHsKLSAgICAkeGZlciA9IDA7Ci0gICAgJGV0eXBlID0gJHNwZWNbJ2V0eXBlJ107Ci0gICAgJGVyZWFkID0gJHZyZWFkID0gbnVsbDsKLSAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyRldHlwZV0pKSB7Ci0gICAgICAkZXJlYWQgPSAncmVhZCcuVEJhc2U6OiR0bWV0aG9kWyRldHlwZV07Ci0gICAgfSBlbHNlIHsKLSAgICAgICRlc3BlYyA9ICRzcGVjWydlbGVtJ107Ci0gICAgfQotICAgICR2YXIgPSBhcnJheSgpOwotICAgICRfZXR5cGUgPSAkc2l6ZSA9IDA7Ci0gICAgaWYgKCRzZXQpIHsKLSAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZFNldEJlZ2luKCRfZXR5cGUsICRzaXplKTsKLSAgICB9IGVsc2UgewotICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkTGlzdEJlZ2luKCRfZXR5cGUsICRzaXplKTsKLSAgICB9Ci0gICAgZm9yICgkaSA9IDA7ICRpIDwgJHNpemU7ICsrJGkpIHsKLSAgICAgICRlbGVtID0gbnVsbDsKLSAgICAgIGlmICgkZXJlYWQgIT09IG51bGwpIHsKLSAgICAgICAgJHhmZXIgKz0gJGlucHV0LT4kZXJlYWQoJGVsZW0pOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgJGVzcGVjID0gJHNwZWNbJ2VsZW0nXTsKLSAgICAgICAgc3dpdGNoICgkZXR5cGUpIHsKLSAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgotICAgICAgICAgICRjbGFzcyA9ICRlc3BlY1snY2xhc3MnXTsKLSAgICAgICAgICAkZWxlbSA9IG5ldyAkY2xhc3MoKTsKLSAgICAgICAgICAkeGZlciArPSAkZWxlbS0+cmVhZCgkaW5wdXQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpNQVA6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTWFwKCRlbGVtLCAkZXNwZWMsICRpbnB1dCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCRlbGVtLCAkZXNwZWMsICRpbnB1dCwgZmFsc2UpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTGlzdCgkZWxlbSwgJGVzcGVjLCAkaW5wdXQsIHRydWUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoJHNldCkgewotICAgICAgICAkdmFyWyRlbGVtXSA9IHRydWU7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAkdmFyIFtdPSAkZWxlbTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCRzZXQpIHsKLSAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZFNldEVuZCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRMaXN0RW5kKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuICR4ZmVyOwotICB9Ci0KLSAgcHJvdGVjdGVkIGZ1bmN0aW9uIF9yZWFkKCRjbGFzcywgJHNwZWMsICRpbnB1dCkKLSAgewotICAgICR4ZmVyID0gMDsKLSAgICAkZm5hbWUgPSBudWxsOwotICAgICRmdHlwZSA9IDA7Ci0gICAgJGZpZCA9IDA7Ci0gICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RydWN0QmVnaW4oJGZuYW1lKTsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkRmllbGRCZWdpbigkZm5hbWUsICRmdHlwZSwgJGZpZCk7Ci0gICAgICBpZiAoJGZ0eXBlID09IFRUeXBlOjpTVE9QKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgaWYgKGlzc2V0KCRzcGVjWyRmaWRdKSkgewotICAgICAgICAkZnNwZWMgPSAkc3BlY1skZmlkXTsKLSAgICAgICAgJHZhciA9ICRmc3BlY1sndmFyJ107Ci0gICAgICAgIGlmICgkZnR5cGUgPT0gJGZzcGVjWyd0eXBlJ10pIHsKLSAgICAgICAgICAkeGZlciA9IDA7Ci0gICAgICAgICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFskZnR5cGVdKSkgewotICAgICAgICAgICAgJGZ1bmMgPSAncmVhZCcuVEJhc2U6OiR0bWV0aG9kWyRmdHlwZV07Ci0gICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPiRmdW5jKCR0aGlzLT4kdmFyKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3dpdGNoICgkZnR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKLSAgICAgICAgICAgICAgJGNsYXNzID0gJGZzcGVjWydjbGFzcyddOwotICAgICAgICAgICAgICAkdGhpcy0+JHZhciA9IG5ldyAkY2xhc3MoKTsKLSAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPiR2YXItPnJlYWQoJGlucHV0KTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFRUeXBlOjpNQVA6Ci0gICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZE1hcCgkdGhpcy0+JHZhciwgJGZzcGVjLCAkaW5wdXQpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKLSAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTGlzdCgkdGhpcy0+JHZhciwgJGZzcGVjLCAkaW5wdXQsIGZhbHNlKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6Ci0gICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZExpc3QoJHRoaXMtPiR2YXIsICRmc3BlYywgJGlucHV0LCB0cnVlKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICAkeGZlciArPSAkaW5wdXQtPnNraXAoJGZ0eXBlKTsKLSAgICAgIH0KLSAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZEZpZWxkRW5kKCk7Ci0gICAgfQotICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZFN0cnVjdEVuZCgpOwotCi0gICAgcmV0dXJuICR4ZmVyOwotICB9Ci0KLSAgcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVNYXAoJHZhciwgJHNwZWMsICRvdXRwdXQpCi0gIHsKLSAgICAkeGZlciA9IDA7Ci0gICAgJGt0eXBlID0gJHNwZWNbJ2t0eXBlJ107Ci0gICAgJHZ0eXBlID0gJHNwZWNbJ3Z0eXBlJ107Ci0gICAgJGt3cml0ZSA9ICR2d3JpdGUgPSBudWxsOwotICAgIGlmIChpc3NldChUQmFzZTo6JHRtZXRob2RbJGt0eXBlXSkpIHsKLSAgICAgICRrd3JpdGUgPSAnd3JpdGUnLlRCYXNlOjokdG1ldGhvZFska3R5cGVdOwotICAgIH0gZWxzZSB7Ci0gICAgICAka3NwZWMgPSAkc3BlY1sna2V5J107Ci0gICAgfQotICAgIGlmIChpc3NldChUQmFzZTo6JHRtZXRob2RbJHZ0eXBlXSkpIHsKLSAgICAgICR2d3JpdGUgPSAnd3JpdGUnLlRCYXNlOjokdG1ldGhvZFskdnR5cGVdOwotICAgIH0gZWxzZSB7Ci0gICAgICAkdnNwZWMgPSAkc3BlY1sndmFsJ107Ci0gICAgfQotICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlTWFwQmVnaW4oJGt0eXBlLCAkdnR5cGUsIGNvdW50KCR2YXIpKTsKLSAgICBmb3JlYWNoICgkdmFyIGFzICRrZXkgPT4gJHZhbCkgewotICAgICAgaWYgKGlzc2V0KCRrd3JpdGUpKSB7Ci0gICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPiRrd3JpdGUoJGtleSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzd2l0Y2ggKCRrdHlwZSkgewotICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6Ci0gICAgICAgICAgJHhmZXIgKz0gJGtleS0+d3JpdGUoJG91dHB1dCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6Ok1BUDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTWFwKCRrZXksICRrc3BlYywgJG91dHB1dCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgka2V5LCAka3NwZWMsICRvdXRwdXQsIGZhbHNlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgotICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCRrZXksICRrc3BlYywgJG91dHB1dCwgdHJ1ZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChpc3NldCgkdndyaXRlKSkgewotICAgICAgICAkeGZlciArPSAkb3V0cHV0LT4kdndyaXRlKCR2YWwpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3dpdGNoICgkdnR5cGUpIHsKLSAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgotICAgICAgICAgICR4ZmVyICs9ICR2YWwtPndyaXRlKCRvdXRwdXQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpNQVA6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZU1hcCgkdmFsLCAkdnNwZWMsICRvdXRwdXQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJHZhbCwgJHZzcGVjLCAkb3V0cHV0LCBmYWxzZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgkdmFsLCAkdnNwZWMsICRvdXRwdXQsIHRydWUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlTWFwRW5kKCk7Ci0KLSAgICByZXR1cm4gJHhmZXI7Ci0gIH0KLQotICBwcml2YXRlIGZ1bmN0aW9uIF93cml0ZUxpc3QoJHZhciwgJHNwZWMsICRvdXRwdXQsICRzZXQ9ZmFsc2UpCi0gIHsKLSAgICAkeGZlciA9IDA7Ci0gICAgJGV0eXBlID0gJHNwZWNbJ2V0eXBlJ107Ci0gICAgJGV3cml0ZSA9IG51bGw7Ci0gICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFskZXR5cGVdKSkgewotICAgICAgJGV3cml0ZSA9ICd3cml0ZScuVEJhc2U6OiR0bWV0aG9kWyRldHlwZV07Ci0gICAgfSBlbHNlIHsKLSAgICAgICRlc3BlYyA9ICRzcGVjWydlbGVtJ107Ci0gICAgfQotICAgIGlmICgkc2V0KSB7Ci0gICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVNldEJlZ2luKCRldHlwZSwgY291bnQoJHZhcikpOwotICAgIH0gZWxzZSB7Ci0gICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUxpc3RCZWdpbigkZXR5cGUsIGNvdW50KCR2YXIpKTsKLSAgICB9Ci0gICAgZm9yZWFjaCAoJHZhciBhcyAka2V5ID0+ICR2YWwpIHsKLSAgICAgICRlbGVtID0gJHNldCA/ICRrZXkgOiAkdmFsOwotICAgICAgaWYgKGlzc2V0KCRld3JpdGUpKSB7Ci0gICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPiRld3JpdGUoJGVsZW0pOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3dpdGNoICgkZXR5cGUpIHsKLSAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgotICAgICAgICAgICR4ZmVyICs9ICRlbGVtLT53cml0ZSgkb3V0cHV0KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgotICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVNYXAoJGVsZW0sICRlc3BlYywgJG91dHB1dCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgkZWxlbSwgJGVzcGVjLCAkb3V0cHV0LCBmYWxzZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgkZWxlbSwgJGVzcGVjLCAkb3V0cHV0LCB0cnVlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBpZiAoJHNldCkgewotICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTZXRFbmQoKTsKLSAgICB9IGVsc2UgewotICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVMaXN0RW5kKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuICR4ZmVyOwotICB9Ci0KLSAgcHJvdGVjdGVkIGZ1bmN0aW9uIF93cml0ZSgkY2xhc3MsICRzcGVjLCAkb3V0cHV0KQotICB7Ci0gICAgJHhmZXIgPSAwOwotICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0QmVnaW4oJGNsYXNzKTsKLSAgICBmb3JlYWNoICgkc3BlYyBhcyAkZmlkID0+ICRmc3BlYykgewotICAgICAgJHZhciA9ICRmc3BlY1sndmFyJ107Ci0gICAgICBpZiAoJHRoaXMtPiR2YXIgIT09IG51bGwpIHsKLSAgICAgICAgJGZ0eXBlID0gJGZzcGVjWyd0eXBlJ107Ci0gICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRCZWdpbigkdmFyLCAkZnR5cGUsICRmaWQpOwotICAgICAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyRmdHlwZV0pKSB7Ci0gICAgICAgICAgJGZ1bmMgPSAnd3JpdGUnLlRCYXNlOjokdG1ldGhvZFskZnR5cGVdOwotICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPiRmdW5jKCR0aGlzLT4kdmFyKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBzd2l0Y2ggKCRmdHlwZSkgewotICAgICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKLSAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT4kdmFyLT53cml0ZSgkb3V0cHV0KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgVFR5cGU6Ok1BUDoKLSAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVNYXAoJHRoaXMtPiR2YXIsICRmc3BlYywgJG91dHB1dCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6Ci0gICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgkdGhpcy0+JHZhciwgJGZzcGVjLCAkb3V0cHV0LCBmYWxzZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6Ci0gICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgkdGhpcy0+JHZhciwgJGZzcGVjLCAkb3V0cHV0LCB0cnVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkRW5kKCk7Ci0gICAgICB9Ci0gICAgfQotICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRTdG9wKCk7Ci0gICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RFbmQoKTsKLQotICAgIHJldHVybiAkeGZlcjsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvRXhjZXB0aW9uL1RQcm90b2NvbEV4Y2VwdGlvbi5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvRXhjZXB0aW9uL1RQcm90b2NvbEV4Y2VwdGlvbi5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNzEzNWMuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L0V4Y2VwdGlvbi9UUHJvdG9jb2xFeGNlcHRpb24ucGhwCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCi0gKiBAYXV0aG9yOiBybWFyaW4gKG1hcmluLnJhZHVAZmFjZWJvb2suY29tKQotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcRXhjZXB0aW9uOwotCi0vKioKLSAqIFByb3RvY29sIG1vZHVsZS4gQ29udGFpbnMgYWxsIHRoZSB0eXBlcyBhbmQgZGVmaW5pdGlvbnMgbmVlZGVkIHRvIGltcGxlbWVudAotICogYSBwcm90b2NvbCBlbmNvZGVyL2RlY29kZXIuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCi0gKi8KLQotLyoqCi0gKiBQcm90b2NvbCBleGNlcHRpb25zCi0gKi8KLWNsYXNzIFRQcm90b2NvbEV4Y2VwdGlvbiBleHRlbmRzIFRFeGNlcHRpb24KLXsKLSAgY29uc3QgVU5LTk9XTiA9IDA7Ci0gIGNvbnN0IElOVkFMSURfREFUQSA9IDE7Ci0gIGNvbnN0IE5FR0FUSVZFX1NJWkUgPSAyOwotICBjb25zdCBTSVpFX0xJTUlUID0gMzsKLSAgY29uc3QgQkFEX1ZFUlNJT04gPSA0OwotICBjb25zdCBOT1RfSU1QTEVNRU5URUQgPSA1OwotICBjb25zdCBERVBUSF9MSU1JVCA9IDY7Ci0KLSAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRtZXNzYWdlPW51bGwsICRjb2RlPTApCi0gIHsKLSAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRtZXNzYWdlLCAkY29kZSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9FeGNlcHRpb24vVFRyYW5zcG9ydEV4Y2VwdGlvbi5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvRXhjZXB0aW9uL1RUcmFuc3BvcnRFeGNlcHRpb24ucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDc0NDY3Li4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9FeGNlcHRpb24vVFRyYW5zcG9ydEV4Y2VwdGlvbi5waHAKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0Ci0gKi8KLQotbmFtZXNwYWNlIFRocmlmdFxFeGNlcHRpb247Ci0KLS8qKgotICogVHJhbnNwb3J0IGV4Y2VwdGlvbnMKLSAqLwotY2xhc3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBleHRlbmRzIFRFeGNlcHRpb24KLXsKLSAgY29uc3QgVU5LTk9XTiA9IDA7Ci0gIGNvbnN0IE5PVF9PUEVOID0gMTsKLSAgY29uc3QgQUxSRUFEWV9PUEVOID0gMjsKLSAgY29uc3QgVElNRURfT1VUID0gMzsKLSAgY29uc3QgRU5EX09GX0ZJTEUgPSA0OwotCi0gIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkbWVzc2FnZT1udWxsLCAkY29kZT0wKQotICB7Ci0gICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkbWVzc2FnZSwgJGNvZGUpOwotICB9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvRmFjdG9yeS9UQmluYXJ5UHJvdG9jb2xGYWN0b3J5LnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9GYWN0b3J5L1RCaW5hcnlQcm90b2NvbEZhY3RvcnkucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzFjNGE3Li4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9GYWN0b3J5L1RCaW5hcnlQcm90b2NvbEZhY3RvcnkucGhwCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCi0gKi8KLQotbmFtZXNwYWNlIFRocmlmdFxGYWN0b3J5OwotCi11c2UgVGhyaWZ0XFByb3RvY29sXFRCaW5hcnlQcm90b2NvbDsKLQotLyoqCi0gKiBCaW5hcnkgUHJvdG9jb2wgRmFjdG9yeQotICovCi1jbGFzcyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5IGltcGxlbWVudHMgVFByb3RvY29sRmFjdG9yeQotewotICBwcml2YXRlICRzdHJpY3RSZWFkXyA9IGZhbHNlOwotICBwcml2YXRlICRzdHJpY3RXcml0ZV8gPSBmYWxzZTsKLQotICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHN0cmljdFJlYWQ9ZmFsc2UsICRzdHJpY3RXcml0ZT1mYWxzZSkKLSAgewotICAgICR0aGlzLT5zdHJpY3RSZWFkXyA9ICRzdHJpY3RSZWFkOwotICAgICR0aGlzLT5zdHJpY3RXcml0ZV8gPSAkc3RyaWN0V3JpdGU7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvdG9jb2woJHRyYW5zKQotICB7Ci0gICAgcmV0dXJuIG5ldyBUQmluYXJ5UHJvdG9jb2woJHRyYW5zLCAkdGhpcy0+c3RyaWN0UmVhZF8sICR0aGlzLT5zdHJpY3RXcml0ZV8pOwotICB9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvRmFjdG9yeS9UQ29tcGFjdFByb3RvY29sRmFjdG9yeS5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvRmFjdG9yeS9UQ29tcGFjdFByb3RvY29sRmFjdG9yeS5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0YjRmZTMuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L0ZhY3RvcnkvVENvbXBhY3RQcm90b2NvbEZhY3RvcnkucGhwCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCi0gKi8KLQotbmFtZXNwYWNlIFRocmlmdFxGYWN0b3J5OwotCi11c2UgVGhyaWZ0XFByb3RvY29sXFRDb21wYWN0UHJvdG9jb2w7Ci0KLS8qKgotICogQ29tcGFjdCBQcm90b2NvbCBGYWN0b3J5Ci0gKi8KLWNsYXNzIFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5IGltcGxlbWVudHMgVFByb3RvY29sRmFjdG9yeQotewotICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQotICB7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvdG9jb2woJHRyYW5zKQotICB7Ci0gICAgcmV0dXJuIG5ldyBUQ29tcGFjdFByb3RvY29sKCR0cmFucyk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9GYWN0b3J5L1RQcm90b2NvbEZhY3RvcnkucGhwIGIvbGliL3BocC9saWIvVGhyaWZ0L0ZhY3RvcnkvVFByb3RvY29sRmFjdG9yeS5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjOTU2MmQuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L0ZhY3RvcnkvVFByb3RvY29sRmFjdG9yeS5waHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKLSAqLwotCi1uYW1lc3BhY2UgVGhyaWZ0XEZhY3Rvcnk7Ci0KLS8qKgotICogUHJvdG9jb2wgZmFjdG9yeSBjcmVhdGVzIHByb3RvY29sIG9iamVjdHMgZnJvbSB0cmFuc3BvcnRzCi0gKi8KLWludGVyZmFjZSBUUHJvdG9jb2xGYWN0b3J5Ci17Ci0gIC8qKgotICAgKiBCdWlsZCBhIHByb3RvY29sIGZyb20gdGhlIGJhc2UgdHJhbnNwb3J0Ci0gICAqCi0gICAqIEByZXR1cm4gVGhyaWZ0XFByb3RvY29sXFRQcm90b2NvbCBwcm90b2NvbAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIGdldFByb3RvY29sKCR0cmFucyk7Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvRmFjdG9yeS9UU3RyaW5nRnVuY0ZhY3RvcnkucGhwIGIvbGliL3BocC9saWIvVGhyaWZ0L0ZhY3RvcnkvVFN0cmluZ0Z1bmNGYWN0b3J5LnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFkNjgzOS4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvRmFjdG9yeS9UU3RyaW5nRnVuY0ZhY3RvcnkucGhwCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcRmFjdG9yeTsKLQotdXNlIFRocmlmdFxTdHJpbmdGdW5jXE1ic3RyaW5nOwotdXNlIFRocmlmdFxTdHJpbmdGdW5jXENvcmU7Ci0KLWNsYXNzIFRTdHJpbmdGdW5jRmFjdG9yeQotewotICAgIHByaXZhdGUgc3RhdGljICRfaW5zdGFuY2U7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIFNpbmdsZXRvbiBpbnN0YW5jZSBvZiBUU3RyaW5nRnVuYyBpbXBsZW1lbnRhdGlvbiB0aGF0IGlzCi0gICAgICogY29tcGF0aWJsZSB3aXRoIHRoZSBjdXJyZW50IHN5c3RlbSdzIG1ic3RyaW5nLmZ1bmNfb3ZlcmxvYWQgc2V0dGluZ3MuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRTdHJpbmdGdW5jCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjcmVhdGUoKQotICAgIHsKLSAgICAgICAgaWYgKCFzZWxmOjokX2luc3RhbmNlKSB7Ci0gICAgICAgICAgICBzZWxmOjpfc2V0SW5zdGFuY2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzZWxmOjokX2luc3RhbmNlOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF9zZXRJbnN0YW5jZSgpCi0gICAgewotICAgICAgICAvKioKLSAgICAgICAgICogQ2Fubm90IHVzZSBzdHIqIGZ1bmN0aW9ucyBmb3IgYnl0ZSBjb3VudGluZyBiZWNhdXNlIG11bHRpYnl0ZQotICAgICAgICAgKiBjaGFyYWN0ZXJzIHdpbGwgYmUgcmVhZCBhIHNpbmdsZSBieXRlcy4KLSAgICAgICAgICoKLSAgICAgICAgICogU2VlOiBodHRwOi8vdXMucGhwLm5ldC9tYW51YWwvZW4vbWJzdHJpbmcub3ZlcmxvYWQucGhwCi0gICAgICAgICAqLwotICAgICAgICBpZiAoaW5pX2dldCgnbWJzdHJpbmcuZnVuY19vdmVybG9hZCcpICYgMikgewotICAgICAgICAgICAgc2VsZjo6JF9pbnN0YW5jZSA9IG5ldyBNYnN0cmluZygpOwotICAgICAgICB9Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBtYnN0cmluZyBpcyBub3QgaW5zdGFsbGVkIG9yIGRvZXMgbm90IGhhdmUgZnVuY3Rpb24gb3ZlcmxvYWRpbmcKLSAgICAgICAgICogb2YgdGhlIHN0ciogZnVuY3Rpb25zIGVuYWJsZWQgc28gdXNlIFBIUCBjb3JlIHN0ciogZnVuY3Rpb25zIGZvcgotICAgICAgICAgKiBieXRlIGNvdW50aW5nLgotICAgICAgICAgKi8KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBzZWxmOjokX2luc3RhbmNlID0gbmV3IENvcmUoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9GYWN0b3J5L1RUcmFuc3BvcnRGYWN0b3J5LnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9GYWN0b3J5L1RUcmFuc3BvcnRGYWN0b3J5LnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMyYjVmNC4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvRmFjdG9yeS9UVHJhbnNwb3J0RmFjdG9yeS5waHAKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi08P3BocAotCi1uYW1lc3BhY2UgVGhyaWZ0XEZhY3Rvcnk7Ci0KLXVzZSBUaHJpZnRcVHJhbnNwb3J0XFRUcmFuc3BvcnQ7Ci0KLWNsYXNzIFRUcmFuc3BvcnRGYWN0b3J5Ci17Ci0gIC8qKgotICAgKiBAc3RhdGljCi0gICAqIEBwYXJhbSBUVHJhbnNwb3J0ICR0cmFuc3BvcnQKLSAgICogQHJldHVybiBUVHJhbnNwb3J0Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFRyYW5zcG9ydChUVHJhbnNwb3J0ICR0cmFuc3BvcnQpCi0gIHsKLSAgICByZXR1cm4gJHRyYW5zcG9ydDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L1Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvUHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU2YTEwMy4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvUHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDQ1MyArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKLSAqLwotCi1uYW1lc3BhY2UgVGhyaWZ0XFByb3RvY29sOwotCi11c2UgVGhyaWZ0XFR5cGVcVFR5cGU7Ci11c2UgVGhyaWZ0XEV4Y2VwdGlvblxUUHJvdG9jb2xFeGNlcHRpb247Ci11c2UgVGhyaWZ0XEZhY3RvcnlcVFN0cmluZ0Z1bmNGYWN0b3J5OwotCi0vKioKLSAqIEJpbmFyeSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGhyaWZ0IHByb3RvY29sLgotICoKLSAqLwotY2xhc3MgVEJpbmFyeVByb3RvY29sIGV4dGVuZHMgVFByb3RvY29sCi17Ci0gIGNvbnN0IFZFUlNJT05fTUFTSyA9IDB4ZmZmZjAwMDA7Ci0gIGNvbnN0IFZFUlNJT05fMSA9IDB4ODAwMTAwMDA7Ci0KLSAgcHJvdGVjdGVkICRzdHJpY3RSZWFkXyA9IGZhbHNlOwotICBwcm90ZWN0ZWQgJHN0cmljdFdyaXRlXyA9IHRydWU7Ci0KLSAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCR0cmFucywgJHN0cmljdFJlYWQ9ZmFsc2UsICRzdHJpY3RXcml0ZT10cnVlKQotICB7Ci0gICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkdHJhbnMpOwotICAgICR0aGlzLT5zdHJpY3RSZWFkXyA9ICRzdHJpY3RSZWFkOwotICAgICR0aGlzLT5zdHJpY3RXcml0ZV8gPSAkc3RyaWN0V3JpdGU7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlQmVnaW4oJG5hbWUsICR0eXBlLCAkc2VxaWQpCi0gIHsKLSAgICBpZiAoJHRoaXMtPnN0cmljdFdyaXRlXykgewotICAgICAgJHZlcnNpb24gPSBzZWxmOjpWRVJTSU9OXzEgfCAkdHlwZTsKLQotICAgICAgcmV0dXJuCi0gICAgICAgICR0aGlzLT53cml0ZUkzMigkdmVyc2lvbikgKwotICAgICAgICAkdGhpcy0+d3JpdGVTdHJpbmcoJG5hbWUpICsKLSAgICAgICAgJHRoaXMtPndyaXRlSTMyKCRzZXFpZCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybgotICAgICAgICAkdGhpcy0+d3JpdGVTdHJpbmcoJG5hbWUpICsKLSAgICAgICAgJHRoaXMtPndyaXRlQnl0ZSgkdHlwZSkgKwotICAgICAgICAkdGhpcy0+d3JpdGVJMzIoJHNlcWlkKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlRW5kKCkKLSAgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RydWN0QmVnaW4oJG5hbWUpCi0gIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEVuZCgpCi0gIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkQmVnaW4oJGZpZWxkTmFtZSwgJGZpZWxkVHlwZSwgJGZpZWxkSWQpCi0gIHsKLSAgICByZXR1cm4KLSAgICAgICR0aGlzLT53cml0ZUJ5dGUoJGZpZWxkVHlwZSkgKwotICAgICAgJHRoaXMtPndyaXRlSTE2KCRmaWVsZElkKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkRW5kKCkKLSAgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRTdG9wKCkKLSAgewotICAgIHJldHVybgotICAgICAgJHRoaXMtPndyaXRlQnl0ZShUVHlwZTo6U1RPUCk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBCZWdpbigka2V5VHlwZSwgJHZhbFR5cGUsICRzaXplKQotICB7Ci0gICAgcmV0dXJuCi0gICAgICAkdGhpcy0+d3JpdGVCeXRlKCRrZXlUeXBlKSArCi0gICAgICAkdGhpcy0+d3JpdGVCeXRlKCR2YWxUeXBlKSArCi0gICAgICAkdGhpcy0+d3JpdGVJMzIoJHNpemUpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwRW5kKCkKLSAgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpCi0gIHsKLSAgICByZXR1cm4KLSAgICAgICR0aGlzLT53cml0ZUJ5dGUoJGVsZW1UeXBlKSArCi0gICAgICAkdGhpcy0+d3JpdGVJMzIoJHNpemUpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEVuZCgpCi0gIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVNldEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpCi0gIHsKLSAgICByZXR1cm4KLSAgICAgICR0aGlzLT53cml0ZUJ5dGUoJGVsZW1UeXBlKSArCi0gICAgICAkdGhpcy0+d3JpdGVJMzIoJHNpemUpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0RW5kKCkKLSAgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQm9vbCgkdmFsdWUpCi0gIHsKLSAgICAkZGF0YSA9IHBhY2soJ2MnLCAkdmFsdWUgPyAxIDogMCk7Ci0gICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJGRhdGEsIDEpOwotCi0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCeXRlKCR2YWx1ZSkKLSAgewotICAgICRkYXRhID0gcGFjaygnYycsICR2YWx1ZSk7Ci0gICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJGRhdGEsIDEpOwotCi0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMTYoJHZhbHVlKQotICB7Ci0gICAgJGRhdGEgPSBwYWNrKCduJywgJHZhbHVlKTsKLSAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkZGF0YSwgMik7Ci0KLSAgICByZXR1cm4gMjsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkzMigkdmFsdWUpCi0gIHsKLSAgICAkZGF0YSA9IHBhY2soJ04nLCAkdmFsdWUpOwotICAgICR0aGlzLT50cmFuc18tPndyaXRlKCRkYXRhLCA0KTsKLQotICAgIHJldHVybiA0OwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTY0KCR2YWx1ZSkKLSAgewotICAgIC8vIElmIHdlIGFyZSBvbiBhIDMyYml0IGFyY2hpdGVjdHVyZSB3ZSBoYXZlIHRvIGV4cGxpY2l0bHkgZGVhbCB3aXRoCi0gICAgLy8gNjQtYml0IHR3b3MtY29tcGxlbWVudCBhcml0aG1ldGljIHNpbmNlIFBIUCB3YW50cyB0byB0cmVhdCBhbGwgaW50cwotICAgIC8vIGFzIHNpZ25lZCBhbmQgYW55IGludCBvdmVyIDJeMzEgLSAxIGFzIGEgZmxvYXQKLSAgICBpZiAoUEhQX0lOVF9TSVpFID09IDQpIHsKLSAgICAgICRuZWcgPSAkdmFsdWUgPCAwOwotCi0gICAgICBpZiAoJG5lZykgewotICAgICAgICAkdmFsdWUgKj0gLTE7Ci0gICAgICB9Ci0KLSAgICAgICRoaSA9IChpbnQpICgkdmFsdWUgLyA0Mjk0OTY3Mjk2KTsKLSAgICAgICRsbyA9IChpbnQpICR2YWx1ZTsKLQotICAgICAgaWYgKCRuZWcpIHsKLSAgICAgICAgJGhpID0gfiRoaTsKLSAgICAgICAgJGxvID0gfiRsbzsKLSAgICAgICAgaWYgKCgkbG8gJiAoaW50KSAweGZmZmZmZmZmKSA9PSAoaW50KSAweGZmZmZmZmZmKSB7Ci0gICAgICAgICAgJGxvID0gMDsKLSAgICAgICAgICAkaGkrKzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAkbG8rKzsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgJGRhdGEgPSBwYWNrKCdOMicsICRoaSwgJGxvKTsKLQotICAgIH0gZWxzZSB7Ci0gICAgICAkaGkgPSAkdmFsdWUgPj4gMzI7Ci0gICAgICAkbG8gPSAkdmFsdWUgJiAweEZGRkZGRkZGOwotICAgICAgJGRhdGEgPSBwYWNrKCdOMicsICRoaSwgJGxvKTsKLSAgICB9Ci0KLSAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkZGF0YSwgOCk7Ci0KLSAgICByZXR1cm4gODsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZURvdWJsZSgkdmFsdWUpCi0gIHsKLSAgICAkZGF0YSA9IHBhY2soJ2QnLCAkdmFsdWUpOwotICAgICR0aGlzLT50cmFuc18tPndyaXRlKHN0cnJldigkZGF0YSksIDgpOwotCi0gICAgcmV0dXJuIDg7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJpbmcoJHZhbHVlKQotICB7Ci0gICAgJGxlbiA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdmFsdWUpOwotICAgICRyZXN1bHQgPSAkdGhpcy0+d3JpdGVJMzIoJGxlbik7Ci0gICAgaWYgKCRsZW4pIHsKLSAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKCR2YWx1ZSwgJGxlbik7Ci0gICAgfQotCi0gICAgcmV0dXJuICRyZXN1bHQgKyAkbGVuOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlQmVnaW4oJiRuYW1lLCAmJHR5cGUsICYkc2VxaWQpCi0gIHsKLSAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRJMzIoJHN6KTsKLSAgICBpZiAoJHN6IDwgMCkgewotICAgICAgJHZlcnNpb24gPSAoaW50KSAoJHN6ICYgc2VsZjo6VkVSU0lPTl9NQVNLKTsKLSAgICAgIGlmICgkdmVyc2lvbiAhPSAoaW50KSBzZWxmOjpWRVJTSU9OXzEpIHsKLSAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbignQmFkIHZlcnNpb24gaWRlbnRpZmllcjogJy4kc3osIFRQcm90b2NvbEV4Y2VwdGlvbjo6QkFEX1ZFUlNJT04pOwotICAgICAgfQotICAgICAgJHR5cGUgPSAkc3ogJiAweDAwMDAwMGZmOwotICAgICAgJHJlc3VsdCArPQotICAgICAgICAkdGhpcy0+cmVhZFN0cmluZygkbmFtZSkgKwotICAgICAgICAkdGhpcy0+cmVhZEkzMigkc2VxaWQpOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoJHRoaXMtPnN0cmljdFJlYWRfKSB7Ci0gICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oJ05vIHZlcnNpb24gaWRlbnRpZmllciwgb2xkIHByb3RvY29sIGNsaWVudD8nLCBUUHJvdG9jb2xFeGNlcHRpb246OkJBRF9WRVJTSU9OKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIEhhbmRsZSBwcmUtdmVyc2lvbmVkIGlucHV0Ci0gICAgICAgICRuYW1lID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCgkc3opOwotICAgICAgICAkcmVzdWx0ICs9Ci0gICAgICAgICAgJHN6ICsKLSAgICAgICAgICAkdGhpcy0+cmVhZEJ5dGUoJHR5cGUpICsKLSAgICAgICAgICAkdGhpcy0+cmVhZEkzMigkc2VxaWQpOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAkcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlRW5kKCkKLSAgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RCZWdpbigmJG5hbWUpCi0gIHsKLSAgICAkbmFtZSA9ICcnOwotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cnVjdEVuZCgpCi0gIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRCZWdpbigmJG5hbWUsICYkZmllbGRUeXBlLCAmJGZpZWxkSWQpCi0gIHsKLSAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRCeXRlKCRmaWVsZFR5cGUpOwotICAgIGlmICgkZmllbGRUeXBlID09IFRUeXBlOjpTVE9QKSB7Ci0gICAgICAkZmllbGRJZCA9IDA7Ci0KLSAgICAgIHJldHVybiAkcmVzdWx0OwotICAgIH0KLSAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkSTE2KCRmaWVsZElkKTsKLQotICAgIHJldHVybiAkcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRGaWVsZEVuZCgpCi0gIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwQmVnaW4oJiRrZXlUeXBlLCAmJHZhbFR5cGUsICYkc2l6ZSkKLSAgewotICAgIHJldHVybgotICAgICAgJHRoaXMtPnJlYWRCeXRlKCRrZXlUeXBlKSArCi0gICAgICAkdGhpcy0+cmVhZEJ5dGUoJHZhbFR5cGUpICsKLSAgICAgICR0aGlzLT5yZWFkSTMyKCRzaXplKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwRW5kKCkKLSAgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0QmVnaW4oJiRlbGVtVHlwZSwgJiRzaXplKQotICB7Ci0gICAgcmV0dXJuCi0gICAgICAkdGhpcy0+cmVhZEJ5dGUoJGVsZW1UeXBlKSArCi0gICAgICAkdGhpcy0+cmVhZEkzMigkc2l6ZSk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RFbmQoKQotICB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEJlZ2luKCYkZWxlbVR5cGUsICYkc2l6ZSkKLSAgewotICAgIHJldHVybgotICAgICAgJHRoaXMtPnJlYWRCeXRlKCRlbGVtVHlwZSkgKwotICAgICAgJHRoaXMtPnJlYWRJMzIoJHNpemUpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRFbmQoKQotICB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJvb2woJiR2YWx1ZSkKLSAgewotICAgICRkYXRhID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCgxKTsKLSAgICAkYXJyID0gdW5wYWNrKCdjJywgJGRhdGEpOwotICAgICR2YWx1ZSA9ICRhcnJbMV0gPT0gMTsKLQotICAgIHJldHVybiAxOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRCeXRlKCYkdmFsdWUpCi0gIHsKLSAgICAkZGF0YSA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoMSk7Ci0gICAgJGFyciA9IHVucGFjaygnYycsICRkYXRhKTsKLSAgICAkdmFsdWUgPSAkYXJyWzFdOwotCi0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZEkxNigmJHZhbHVlKQotICB7Ci0gICAgJGRhdGEgPSAkdGhpcy0+dHJhbnNfLT5yZWFkQWxsKDIpOwotICAgICRhcnIgPSB1bnBhY2soJ24nLCAkZGF0YSk7Ci0gICAgJHZhbHVlID0gJGFyclsxXTsKLSAgICBpZiAoJHZhbHVlID4gMHg3ZmZmKSB7Ci0gICAgICAkdmFsdWUgPSAwIC0gKCgkdmFsdWUgLSAxKSBeIDB4ZmZmZik7Ci0gICAgfQotCi0gICAgcmV0dXJuIDI7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZEkzMigmJHZhbHVlKQotICB7Ci0gICAgJGRhdGEgPSAkdGhpcy0+dHJhbnNfLT5yZWFkQWxsKDQpOwotICAgICRhcnIgPSB1bnBhY2soJ04nLCAkZGF0YSk7Ci0gICAgJHZhbHVlID0gJGFyclsxXTsKLSAgICBpZiAoJHZhbHVlID4gMHg3ZmZmZmZmZikgewotICAgICAgJHZhbHVlID0gMCAtICgoJHZhbHVlIC0gMSkgXiAweGZmZmZmZmZmKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gNDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkSTY0KCYkdmFsdWUpCi0gIHsKLSAgICAkZGF0YSA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoOCk7Ci0KLSAgICAkYXJyID0gdW5wYWNrKCdOMicsICRkYXRhKTsKLQotICAgIC8vIElmIHdlIGFyZSBvbiBhIDMyYml0IGFyY2hpdGVjdHVyZSB3ZSBoYXZlIHRvIGV4cGxpY2l0bHkgZGVhbCB3aXRoCi0gICAgLy8gNjQtYml0IHR3b3MtY29tcGxlbWVudCBhcml0aG1ldGljIHNpbmNlIFBIUCB3YW50cyB0byB0cmVhdCBhbGwgaW50cwotICAgIC8vIGFzIHNpZ25lZCBhbmQgYW55IGludCBvdmVyIDJeMzEgLSAxIGFzIGEgZmxvYXQKLSAgICBpZiAoUEhQX0lOVF9TSVpFID09IDQpIHsKLQotICAgICAgJGhpID0gJGFyclsxXTsKLSAgICAgICRsbyA9ICRhcnJbMl07Ci0gICAgICAkaXNOZWcgPSAkaGkgIDwgMDsKLQotICAgICAgLy8gQ2hlY2sgZm9yIGEgbmVnYXRpdmUKLSAgICAgIGlmICgkaXNOZWcpIHsKLSAgICAgICAgJGhpID0gfiRoaSAmIChpbnQpIDB4ZmZmZmZmZmY7Ci0gICAgICAgICRsbyA9IH4kbG8gJiAoaW50KSAweGZmZmZmZmZmOwotCi0gICAgICAgIGlmICgkbG8gPT0gKGludCkgMHhmZmZmZmZmZikgewotICAgICAgICAgICRoaSsrOwotICAgICAgICAgICRsbyA9IDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgJGxvKys7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gRm9yY2UgMzJiaXQgd29yZHMgaW4gZXhjZXNzIG9mIDJHIHRvIHBlIHBvc2l0aXZlIC0gd2UgZGVhbCB3aWdoIHNpZ24KLSAgICAgIC8vIGV4cGxpY2l0bHkgYmVsb3cKLQotICAgICAgaWYgKCRoaSAmIChpbnQpIDB4ODAwMDAwMDApIHsKLSAgICAgICAgJGhpICY9IChpbnQpIDB4N2ZmZmZmZmY7Ci0gICAgICAgICRoaSArPSAweDgwMDAwMDAwOwotICAgICAgfQotCi0gICAgICBpZiAoJGxvICYgKGludCkgMHg4MDAwMDAwMCkgewotICAgICAgICAkbG8gJj0gKGludCkgMHg3ZmZmZmZmZjsKLSAgICAgICAgJGxvICs9IDB4ODAwMDAwMDA7Ci0gICAgICB9Ci0KLSAgICAgICR2YWx1ZSA9ICRoaSAqIDQyOTQ5NjcyOTYgKyAkbG87Ci0KLSAgICAgIGlmICgkaXNOZWcpIHsKLSAgICAgICAgJHZhbHVlID0gMCAtICR2YWx1ZTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotCi0gICAgICAvLyBVcGNhc3QgbmVnYXRpdmVzIGluIExTQiBiaXQKLSAgICAgIGlmICgkYXJyWzJdICYgMHg4MDAwMDAwMCkgewotICAgICAgICAkYXJyWzJdID0gJGFyclsyXSAmIDB4ZmZmZmZmZmY7Ci0gICAgICB9Ci0KLSAgICAgIC8vIENoZWNrIGZvciBhIG5lZ2F0aXZlCi0gICAgICBpZiAoJGFyclsxXSAmIDB4ODAwMDAwMDApIHsKLSAgICAgICAgJGFyclsxXSA9ICRhcnJbMV0gJiAweGZmZmZmZmZmOwotICAgICAgICAkYXJyWzFdID0gJGFyclsxXSBeIDB4ZmZmZmZmZmY7Ci0gICAgICAgICRhcnJbMl0gPSAkYXJyWzJdIF4gMHhmZmZmZmZmZjsKLSAgICAgICAgJHZhbHVlID0gMCAtICRhcnJbMV0qNDI5NDk2NzI5NiAtICRhcnJbMl0gLSAxOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgJHZhbHVlID0gJGFyclsxXSo0Mjk0OTY3Mjk2ICsgJGFyclsyXTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gODsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkRG91YmxlKCYkdmFsdWUpCi0gIHsKLSAgICAkZGF0YSA9IHN0cnJldigkdGhpcy0+dHJhbnNfLT5yZWFkQWxsKDgpKTsKLSAgICAkYXJyID0gdW5wYWNrKCdkJywgJGRhdGEpOwotICAgICR2YWx1ZSA9ICRhcnJbMV07Ci0KLSAgICByZXR1cm4gODsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RyaW5nKCYkdmFsdWUpCi0gIHsKLSAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRJMzIoJGxlbik7Ci0gICAgaWYgKCRsZW4pIHsKLSAgICAgICR2YWx1ZSA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoJGxlbik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICR2YWx1ZSA9ICcnOwotICAgIH0KLQotICAgIHJldHVybiAkcmVzdWx0ICsgJGxlbjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L1Byb3RvY29sL1RCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkLnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZC5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZTBiYjkuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L1Byb3RvY29sL1RCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2w7Ci0KLXVzZSBUaHJpZnRcVHJhbnNwb3J0XFRCdWZmZXJlZFRyYW5zcG9ydDsKLQotLyoqCi0gKiBBY2NlbGVyYXRlZCBiaW5hcnkgcHJvdG9jb2w6IHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgdGhyaWZ0X3Byb3RvY29sCi0gKiBleHRlbnNpb24gZm9yIGZhc3RlciBkZXNlcmlhbGl6YXRpb24KLSAqLwotY2xhc3MgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgZXh0ZW5kcyBUQmluYXJ5UHJvdG9jb2wKLXsKLSAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCR0cmFucywgJHN0cmljdFJlYWQ9ZmFsc2UsICRzdHJpY3RXcml0ZT10cnVlKQotICB7Ci0gICAgLy8gSWYgdGhlIHRyYW5zcG9ydCBkb2Vzbid0IGltcGxlbWVudCBwdXRCYWNrLCB3cmFwIGl0IGluIGEKLSAgICAvLyBUQnVmZmVyZWRUcmFuc3BvcnQgKHdoaWNoIGRvZXMpCi0KLSAgICAvLyBOT1RFICh0LmhlaW50eik6IFRoaXMgaXMgdmVyeSBldmlsIHRvIGRvLCBiZWNhdXNlIHRoZSBUQnVmZmVyZWRUcmFuc3BvcnQgbWF5IHN3YWxsb3cgYnl0ZXMsIHdoaWNoCi0gICAgLy8gYXJlIHRoZW4gbmV2ZXIgd3JpdHRlbiB0byB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQuIFRoaXMgaGFwcGVucyBwcmVjaXNlbHkgd2hlbiBhIG51bWJlciBvZiBieXRlcwotICAgIC8vIGxlc3MgdGhhbiB0aGUgbWF4IGJ1ZmZlciBzaXplICg1MTIgYnkgZGVmYXVsdCkgaXMgd3JpdHRlbiB0byB0aGUgdHJhbnNwb3J0IGFuZCB0aGVuIGZsdXNoKCkgaXMgTk9UCi0gICAgLy8gY2FsbGVkLiBJbiB0aGF0IGNhc2UgdGhlIGRhdGEgc3RheXMgaW4gdGhlIHdyaXRlQnVmZmVyIG9mIHRoZSB0cmFuc3BvcnQsIGZyb20gd2hlcmUgaXQgY2FuIG5ldmVyIGJlCi0gICAgLy8gYWNjZXNzZWQgYWdhaW4gKGZvciBleGFtcGxlIHRocm91Z2ggcmVhZCgpKS4KLSAgICAvLwotICAgIC8vIFNpbmNlIHRoZSBjYWxsZXIgb2YgdGhpcyBtZXRob2QgZG9lcyBub3Qga25vdyBhYm91dCB0aGUgd3JhcHBpbmcgdHJhbnNwb3J0LCB0aGlzIGNyZWF0ZXMgYnVncyB3aGljaAotICAgIC8vIGFyZSB2ZXJ5IGRpZmZpY3VsdCB0byBmaW5kLiBIZW5jZSB0aGUgd3JhcHBpbmcgb2YgYSB0cmFuc3BvcnQgaW4gYSBidWZmZXIgc2hvdWxkIGJlIGxlZnQgdG8gdGhlCi0gICAgLy8gY2FsbGluZyBjb2RlLiBBbiBpbnRlcmZhY2UgY291bGQgdXNlZCB0byBtYW5kYXRlIHRoZSBwcmVzZW5jZSBvZiB0aGUgcHV0QmFjaygpIG1ldGhvZCBpbiB0aGUgdHJhbnNwb3J0LgotICAgIC8vCi0gICAgLy8gSSBhbSBsZWF2aW5nIHRoaXMgY29kZSBpbiBub25ldGhlbGVzcywgYmVjYXVzZSB0aGVyZSBtYXkgYmUgYXBwbGljYXRpb25zIGRlcGVuZGluZyBvbiB0aGlzIGJlaGF2aW9yLgotICAgIC8vCi0gICAgLy8gQHNlZSBUSFJJRlQtMTU3OQotCi0gICAgaWYgKCFtZXRob2RfZXhpc3RzKCR0cmFucywgJ3B1dEJhY2snKSkgewotICAgICAgJHRyYW5zID0gbmV3IFRCdWZmZXJlZFRyYW5zcG9ydCgkdHJhbnMpOwotICAgIH0KLSAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCR0cmFucywgJHN0cmljdFJlYWQsICRzdHJpY3RXcml0ZSk7Ci0gIH0KLSAgcHVibGljIGZ1bmN0aW9uIGlzU3RyaWN0UmVhZCgpCi0gIHsKLSAgICByZXR1cm4gJHRoaXMtPnN0cmljdFJlYWRfOwotICB9Ci0gIHB1YmxpYyBmdW5jdGlvbiBpc1N0cmljdFdyaXRlKCkKLSAgewotICAgIHJldHVybiAkdGhpcy0+c3RyaWN0V3JpdGVfOwotICB9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvUHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvUHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4NzAzNTEuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L1Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wucGhwCisrKyAvZGV2L251bGwKQEAgLTEsNzUzICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2w7Ci0KLXVzZSBUaHJpZnRcVHlwZVxUVHlwZTsKLXVzZSBUaHJpZnRcRXhjZXB0aW9uXFRQcm90b2NvbEV4Y2VwdGlvbjsKLXVzZSBUaHJpZnRcRmFjdG9yeVxUU3RyaW5nRnVuY0ZhY3Rvcnk7Ci0KLS8qKgotICogQ29tcGFjdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGhyaWZ0IHByb3RvY29sLgotICoKLSAqLwotY2xhc3MgVENvbXBhY3RQcm90b2NvbCBleHRlbmRzIFRQcm90b2NvbAotewotICBjb25zdCBDT01QQUNUX1NUT1AgPSAweDAwOwotICBjb25zdCBDT01QQUNUX1RSVUUgPSAweDAxOwotICBjb25zdCBDT01QQUNUX0ZBTFNFID0gMHgwMjsKLSAgY29uc3QgQ09NUEFDVF9CWVRFID0gMHgwMzsKLSAgY29uc3QgQ09NUEFDVF9JMTYgPSAweDA0OwotICBjb25zdCBDT01QQUNUX0kzMiA9IDB4MDU7Ci0gIGNvbnN0IENPTVBBQ1RfSTY0ID0gMHgwNjsKLSAgY29uc3QgQ09NUEFDVF9ET1VCTEUgPSAweDA3OwotICBjb25zdCBDT01QQUNUX0JJTkFSWSA9IDB4MDg7Ci0gIGNvbnN0IENPTVBBQ1RfTElTVCA9IDB4MDk7Ci0gIGNvbnN0IENPTVBBQ1RfU0VUID0gMHgwQTsKLSAgY29uc3QgQ09NUEFDVF9NQVAgPSAweDBCOwotICBjb25zdCBDT01QQUNUX1NUUlVDVCA9IDB4MEM7Ci0KLSAgY29uc3QgU1RBVEVfQ0xFQVIgPSAwOwotICBjb25zdCBTVEFURV9GSUVMRF9XUklURSA9IDE7Ci0gIGNvbnN0IFNUQVRFX1ZBTFVFX1dSSVRFID0gMjsKLSAgY29uc3QgU1RBVEVfQ09OVEFJTkVSX1dSSVRFID0gMzsKLSAgY29uc3QgU1RBVEVfQk9PTF9XUklURSA9IDQ7Ci0gIGNvbnN0IFNUQVRFX0ZJRUxEX1JFQUQgPSA1OwotICBjb25zdCBTVEFURV9DT05UQUlORVJfUkVBRCA9IDY7Ci0gIGNvbnN0IFNUQVRFX1ZBTFVFX1JFQUQgPSA3OwotICBjb25zdCBTVEFURV9CT09MX1JFQUQgPSA4OwotCi0gIGNvbnN0IFZFUlNJT05fTUFTSyA9IDB4MWY7Ci0gIGNvbnN0IFZFUlNJT04gPSAxOwotICBjb25zdCBQUk9UT0NPTF9JRCA9IDB4ODI7Ci0gIGNvbnN0IFRZUEVfTUFTSyA9IDB4ZTA7Ci0gIGNvbnN0IFRZUEVfQklUUyA9IDB4MDc7Ci0gIGNvbnN0IFRZUEVfU0hJRlRfQU1PVU5UID0gNTsKLQotICBwcm90ZWN0ZWQgc3RhdGljICRjdHlwZXMgPSBhcnJheSgKLSAgICBUVHlwZTo6U1RPUCA9PiBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX1NUT1AsCi0gICAgVFR5cGU6OkJPT0wgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9UUlVFLCAvLyB1c2VkIGZvciBjb2xsZWN0aW9uCi0gICAgVFR5cGU6OkJZVEUgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9CWVRFLAotICAgIFRUeXBlOjpJMTYgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9JMTYsCi0gICAgVFR5cGU6OkkzMiA9PiBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX0kzMiwKLSAgICBUVHlwZTo6STY0ID0+IFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfSTY0LAotICAgIFRUeXBlOjpET1VCTEUgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9ET1VCTEUsCi0gICAgVFR5cGU6OlNUUklORyA9PiBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX0JJTkFSWSwKLSAgICBUVHlwZTo6U1RSVUNUID0+IFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfU1RSVUNULAotICAgIFRUeXBlOjpMU1QgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9MSVNULAotICAgIFRUeXBlOjpTRVQgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9TRVQsCi0gICAgVFR5cGU6Ok1BUCA9PiBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX01BUCwKLSAgKTsKLQotICBwcm90ZWN0ZWQgc3RhdGljICR0dHlwZXMgPSBhcnJheSgKLSAgICBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX1NUT1AgPT4gVFR5cGU6OlNUT1AgLAotICAgIFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfVFJVRSA9PiBUVHlwZTo6Qk9PTCwgLy8gdXNlZCBmb3IgY29sbGVjdGlvbgotICAgIFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfRkFMU0UgPT4gVFR5cGU6OkJPT0wsCi0gICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9CWVRFID0+IFRUeXBlOjpCWVRFLAotICAgIFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfSTE2ID0+IFRUeXBlOjpJMTYsCi0gICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9JMzIgPT4gVFR5cGU6OkkzMiwKLSAgICBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX0k2NCA9PiBUVHlwZTo6STY0LAotICAgIFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfRE9VQkxFID0+IFRUeXBlOjpET1VCTEUsCi0gICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9CSU5BUlkgPT4gVFR5cGU6OlNUUklORywKLSAgICBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX1NUUlVDVCA9PiBUVHlwZTo6U1RSVUNULAotICAgIFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfTElTVCA9PiBUVHlwZTo6TFNULAotICAgIFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfU0VUID0+IFRUeXBlOjpTRVQsCi0gICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9NQVAgPT4gVFR5cGU6Ok1BUCwKLSAgKTsKLQotICBwcm90ZWN0ZWQgJHN0YXRlID0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfQ0xFQVI7Ci0gIHByb3RlY3RlZCAkbGFzdEZpZCA9IDA7Ci0gIHByb3RlY3RlZCAkYm9vbEZpZCA9IG51bGw7Ci0gIHByb3RlY3RlZCAkYm9vbFZhbHVlID0gbnVsbDsKLSAgcHJvdGVjdGVkICRzdHJ1Y3RzID0gYXJyYXkoKTsKLSAgcHJvdGVjdGVkICRjb250YWluZXJzID0gYXJyYXkoKTsKLQotICAvLyBTb21lIHZhcmludCAvIHppZ3phZyBoZWxwZXIgbWV0aG9kcwotICBwdWJsaWMgZnVuY3Rpb24gdG9aaWdaYWcoJG4sICRiaXRzKQotICB7Ci0gICAgcmV0dXJuICgkbiA8PCAxKSBeICgkbiA+PiAoJGJpdHMgLSAxKSk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gZnJvbVppZ1phZygkbikKLSAgewotICAgIHJldHVybiAoJG4gPj4gMSkgXiAtKCRuICYgMSk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gZ2V0VmFyaW50KCRkYXRhKQotICB7Ci0gICAgJG91dCA9ICIiOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICBpZiAoKCRkYXRhICYgfjB4N2YpID09PSAwKSB7Ci0gICAgICAgICRvdXQgLj0gY2hyKCRkYXRhKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAkb3V0IC49IGNocigoJGRhdGEgJiAweGZmKSB8IDB4ODApOwotICAgICAgICAkZGF0YSA9ICRkYXRhID4+IDc7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuICRvdXQ7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVWYXJpbnQoJGRhdGEpCi0gIHsKLSAgICAkb3V0ID0gJHRoaXMtPmdldFZhcmludCgkZGF0YSk7Ci0gICAgJHJlc3VsdCA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkb3V0KTsKLSAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkb3V0LCAkcmVzdWx0KTsKLQotICAgIHJldHVybiAkcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRWYXJpbnQoJiRyZXN1bHQpCi0gIHsKLSAgICAkaWR4ID0gMDsKLSAgICAkc2hpZnQgPSAwOwotICAgICRyZXN1bHQgPSAwOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAkeCA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoMSk7Ci0gICAgICAkYXJyID0gdW5wYWNrKCdDJywgJHgpOwotICAgICAgJGJ5dGUgPSAkYXJyWzFdOwotICAgICAgJGlkeCArPSAxOwotICAgICAgJHJlc3VsdCB8PSAoJGJ5dGUgJiAweDdmKSA8PCAkc2hpZnQ7Ci0gICAgICBpZiAoKCRieXRlID4+IDcpID09PSAwKSB7Ci0gICAgICAgIHJldHVybiAkaWR4OwotICAgICAgfQotICAgICAgJHNoaWZ0ICs9IDc7Ci0gICAgfQotCi0gICAgcmV0dXJuICRpZHg7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHRyYW5zKQotICB7Ci0gICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkdHJhbnMpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUJlZ2luKCRuYW1lLCAkdHlwZSwgJHNlcWlkKQotICB7Ci0gICAgJHdyaXR0ZW4gPQotICAgICAgJHRoaXMtPndyaXRlVUJ5dGUoVENvbXBhY3RQcm90b2NvbDo6UFJPVE9DT0xfSUQpICsKLSAgICAgICR0aGlzLT53cml0ZVVCeXRlKFRDb21wYWN0UHJvdG9jb2w6OlZFUlNJT04gfAotICAgICAgICAgICAgICAgICAgICAgICAgKCR0eXBlIDw8IFRDb21wYWN0UHJvdG9jb2w6OlRZUEVfU0hJRlRfQU1PVU5UKSkgKwotICAgICAgJHRoaXMtPndyaXRlVmFyaW50KCRzZXFpZCkgKwotICAgICAgJHRoaXMtPndyaXRlU3RyaW5nKCRuYW1lKTsKLSAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9WQUxVRV9XUklURTsKLQotICAgIHJldHVybiAkd3JpdHRlbjsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VFbmQoKQotICB7Ci0gICAgJHRoaXMtPnN0YXRlID0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfQ0xFQVI7Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEJlZ2luKCRuYW1lKQotICB7Ci0gICAgJHRoaXMtPnN0cnVjdHNbXSA9IGFycmF5KCR0aGlzLT5zdGF0ZSwgJHRoaXMtPmxhc3RGaWQpOwotICAgICR0aGlzLT5zdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0ZJRUxEX1dSSVRFOwotICAgICR0aGlzLT5sYXN0RmlkID0gMDsKLQotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RydWN0RW5kKCkKLSAgewotICAgICRvbGRfdmFsdWVzID0gYXJyYXlfcG9wKCR0aGlzLT5zdHJ1Y3RzKTsKLSAgICAkdGhpcy0+c3RhdGUgPSAkb2xkX3ZhbHVlc1swXTsKLSAgICAkdGhpcy0+bGFzdEZpZCA9ICRvbGRfdmFsdWVzWzFdOwotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZFN0b3AoKQotICB7Ci0gICAgcmV0dXJuICR0aGlzLT53cml0ZUJ5dGUoMCk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEhlYWRlcigkdHlwZSwgJGZpZCkKLSAgewotICAgICR3cml0dGVuID0gMDsKLSAgICAkZGVsdGEgPSAkZmlkIC0gJHRoaXMtPmxhc3RGaWQ7Ci0gICAgaWYgKDAgPCAkZGVsdGEgJiYgJGRlbHRhIDw9IDE1KSB7Ci0gICAgICAkd3JpdHRlbiA9ICR0aGlzLT53cml0ZVVCeXRlKCgkZGVsdGEgPDwgNCkgfCAkdHlwZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICR3cml0dGVuID0gJHRoaXMtPndyaXRlQnl0ZSgkdHlwZSkgKwotICAgICAgICAkdGhpcy0+d3JpdGVJMTYoJGZpZCk7Ci0gICAgfQotICAgICR0aGlzLT5sYXN0RmlkID0gJGZpZDsKLQotICAgIHJldHVybiAkd3JpdHRlbjsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkQmVnaW4oJGZpZWxkX25hbWUsICRmaWVsZF90eXBlLCAkZmllbGRfaWQpCi0gIHsKLSAgICBpZiAoJGZpZWxkX3R5cGUgPT0gVFRZUEU6OkJPT0wpIHsKLSAgICAgICR0aGlzLT5zdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0JPT0xfV1JJVEU7Ci0gICAgICAkdGhpcy0+Ym9vbEZpZCA9ICRmaWVsZF9pZDsKLQotICAgICAgcmV0dXJuIDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICR0aGlzLT5zdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX1ZBTFVFX1dSSVRFOwotCi0gICAgICByZXR1cm4gJHRoaXMtPndyaXRlRmllbGRIZWFkZXIoc2VsZjo6JGN0eXBlc1skZmllbGRfdHlwZV0sICRmaWVsZF9pZCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRFbmQoKQotICB7Ci0gICAgJHRoaXMtPnN0YXRlID0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfRklFTERfV1JJVEU7Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUNvbGxlY3Rpb25CZWdpbigkZXR5cGUsICRzaXplKQotICB7Ci0gICAgJHdyaXR0ZW4gPSAwOwotICAgIGlmICgkc2l6ZSA8PSAxNCkgewotICAgICAgJHdyaXR0ZW4gPSAkdGhpcy0+d3JpdGVVQnl0ZSgkc2l6ZSA8PCA0IHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGY6OiRjdHlwZXNbJGV0eXBlXSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICR3cml0dGVuID0gJHRoaXMtPndyaXRlVUJ5dGUoMHhmMCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGY6OiRjdHlwZXNbJGV0eXBlXSkgKwotICAgICAgICAkdGhpcy0+d3JpdGVWYXJpbnQoJHNpemUpOwotICAgIH0KLSAgICAkdGhpcy0+Y29udGFpbmVyc1tdID0gJHRoaXMtPnN0YXRlOwotICAgICR0aGlzLT5zdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0NPTlRBSU5FUl9XUklURTsKLQotICAgIHJldHVybiAkd3JpdHRlbjsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEJlZ2luKCRrZXlfdHlwZSwgJHZhbF90eXBlLCAkc2l6ZSkKLSAgewotICAgICR3cml0dGVuID0gMDsKLSAgICBpZiAoJHNpemUgPT0gMCkgewotICAgICAgJHdyaXR0ZW4gPSAkdGhpcy0+d3JpdGVCeXRlKDApOwotICAgIH0gZWxzZSB7Ci0gICAgICAkd3JpdHRlbiA9ICR0aGlzLT53cml0ZVZhcmludCgkc2l6ZSkgKwotICAgICAgICAkdGhpcy0+d3JpdGVVQnl0ZShzZWxmOjokY3R5cGVzWyRrZXlfdHlwZV0gPDwgNCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGY6OiRjdHlwZXNbJHZhbF90eXBlXSk7Ci0gICAgfQotICAgICR0aGlzLT5jb250YWluZXJzW10gPSAkdGhpcy0+c3RhdGU7Ci0KLSAgICByZXR1cm4gJHdyaXR0ZW47Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVDb2xsZWN0aW9uRW5kKCkKLSAgewotICAgICR0aGlzLT5zdGF0ZSA9IGFycmF5X3BvcCgkdGhpcy0+Y29udGFpbmVycyk7Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEVuZCgpCi0gIHsKLSAgICByZXR1cm4gJHRoaXMtPndyaXRlQ29sbGVjdGlvbkVuZCgpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEJlZ2luKCRlbGVtX3R5cGUsICRzaXplKQotICB7Ci0gICAgcmV0dXJuICR0aGlzLT53cml0ZUNvbGxlY3Rpb25CZWdpbigkZWxlbV90eXBlLCAkc2l6ZSk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0RW5kKCkKLSAgewotICAgIHJldHVybiAkdGhpcy0+d3JpdGVDb2xsZWN0aW9uRW5kKCk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRCZWdpbigkZWxlbV90eXBlLCAkc2l6ZSkKLSAgewotICAgIHJldHVybiAkdGhpcy0+d3JpdGVDb2xsZWN0aW9uQmVnaW4oJGVsZW1fdHlwZSwgJHNpemUpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0RW5kKCkKLSAgewotICAgIHJldHVybiAkdGhpcy0+d3JpdGVDb2xsZWN0aW9uRW5kKCk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCb29sKCR2YWx1ZSkKLSAgewotICAgIGlmICgkdGhpcy0+c3RhdGUgPT0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfQk9PTF9XUklURSkgewotICAgICAgJGN0eXBlID0gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9GQUxTRTsKLSAgICAgIGlmICgkdmFsdWUpIHsKLSAgICAgICAgJGN0eXBlID0gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9UUlVFOwotICAgICAgfQotCi0gICAgICByZXR1cm4gJHRoaXMtPndyaXRlRmllbGRIZWFkZXIoJGN0eXBlLCAkdGhpcy0+Ym9vbEZpZCk7Ci0gICAgfSBlbHNlaWYgKCR0aGlzLT5zdGF0ZSA9PSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9DT05UQUlORVJfV1JJVEUpIHsKLSAgICAgIHJldHVybiAkdGhpcy0+d3JpdGVCeXRlKCR2YWx1ZSA/IDEgOiAwKTsKLSAgICB9IGVsc2UgewotICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbignSW52YWxpZCBzdGF0ZSBpbiBjb21wYWN0IHByb3RvY29sJyk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQnl0ZSgkdmFsdWUpCi0gIHsKLSAgICAkZGF0YSA9IHBhY2soJ2MnLCAkdmFsdWUpOwotICAgICR0aGlzLT50cmFuc18tPndyaXRlKCRkYXRhLCAxKTsKLQotICAgIHJldHVybiAxOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlVUJ5dGUoJGJ5dGUpCi0gIHsKLSAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShwYWNrKCdDJywgJGJ5dGUpLCAxKTsKLQotICAgIHJldHVybiAxOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTE2KCR2YWx1ZSkKLSAgewotICAgICR0aGluZyA9ICR0aGlzLT50b1ppZ1phZygkdmFsdWUsIDE2KTsKLQotICAgIHJldHVybiAkdGhpcy0+d3JpdGVWYXJpbnQoJHRoaW5nKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkzMigkdmFsdWUpCi0gIHsKLSAgICAkdGhpbmcgPSAkdGhpcy0+dG9aaWdaYWcoJHZhbHVlLCAzMik7Ci0KLSAgICByZXR1cm4gJHRoaXMtPndyaXRlVmFyaW50KCR0aGluZyk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVEb3VibGUoJHZhbHVlKQotICB7Ci0gICAgJGRhdGEgPSBwYWNrKCdkJywgJHZhbHVlKTsKLSAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkZGF0YSwgOCk7Ci0KLSAgICByZXR1cm4gODsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cmluZygkdmFsdWUpCi0gIHsKLSAgICAkbGVuID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR2YWx1ZSk7Ci0gICAgJHJlc3VsdCA9ICR0aGlzLT53cml0ZVZhcmludCgkbGVuKTsKLSAgICBpZiAoJGxlbikgewotICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJHZhbHVlLCAkbGVuKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gJHJlc3VsdCArICRsZW47Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkQmVnaW4oJiRuYW1lLCAmJGZpZWxkX3R5cGUsICYkZmllbGRfaWQpCi0gIHsKLSAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRVQnl0ZSgkZmllbGRfdHlwZSk7Ci0KLSAgICBpZiAoKCRmaWVsZF90eXBlICYgMHgwZikgPT0gVFR5cGU6OlNUT1ApIHsKLSAgICAgICRmaWVsZF9pZCA9IDA7Ci0KLSAgICAgIHJldHVybiAkcmVzdWx0OwotICAgIH0KLSAgICAkZGVsdGEgPSAkZmllbGRfdHlwZSA+PiA0OwotICAgIGlmICgkZGVsdGEgPT0gMCkgewotICAgICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZEkxNigkZmllbGRfaWQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAkZmllbGRfaWQgPSAkdGhpcy0+bGFzdEZpZCArICRkZWx0YTsKLSAgICB9Ci0gICAgJHRoaXMtPmxhc3RGaWQgPSAkZmllbGRfaWQ7Ci0gICAgJGZpZWxkX3R5cGUgPSAkdGhpcy0+Z2V0VFR5cGUoJGZpZWxkX3R5cGUgJiAweDBmKTsKLSAgICBpZiAoJGZpZWxkX3R5cGUgPT0gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9UUlVFKSB7Ci0gICAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9CT09MX1JFQUQ7Ci0gICAgICAkdGhpcy0+Ym9vbFZhbHVlID0gdHJ1ZTsKLSAgICB9IGVsc2VpZiAoJGZpZWxkX3R5cGUgPT0gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9GQUxTRSkgewotICAgICAgJHRoaXMtPnN0YXRlID0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfQk9PTF9SRUFEOwotICAgICAgJHRoaXMtPmJvb2xWYWx1ZSA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9WQUxVRV9SRUFEOwotICAgIH0KLQotICAgIHJldHVybiAkcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRGaWVsZEVuZCgpCi0gIHsKLSAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9GSUVMRF9SRUFEOwotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZFVCeXRlKCYkdmFsdWUpCi0gIHsKLSAgICAkZGF0YSA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoMSk7Ci0gICAgJGFyciA9IHVucGFjaygnQycsICRkYXRhKTsKLSAgICAkdmFsdWUgPSAkYXJyWzFdOwotCi0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJ5dGUoJiR2YWx1ZSkKLSAgewotICAgICRkYXRhID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCgxKTsKLSAgICAkYXJyID0gdW5wYWNrKCdjJywgJGRhdGEpOwotICAgICR2YWx1ZSA9ICRhcnJbMV07Ci0KLSAgICByZXR1cm4gMTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkWmlnWmFnKCYkdmFsdWUpCi0gIHsKLSAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRWYXJpbnQoJHZhbHVlKTsKLSAgICAkdmFsdWUgPSAkdGhpcy0+ZnJvbVppZ1phZygkdmFsdWUpOwotCi0gICAgcmV0dXJuICRyZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1lc3NhZ2VCZWdpbigmJG5hbWUsICYkdHlwZSwgJiRzZXFpZCkKLSAgewotICAgICRwcm90b0lkID0gMDsKLSAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRVQnl0ZSgkcHJvdG9JZCk7Ci0gICAgaWYgKCRwcm90b0lkICE9IFRDb21wYWN0UHJvdG9jb2w6OlBST1RPQ09MX0lEKSB7Ci0gICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCdCYWQgcHJvdG9jb2wgaWQgaW4gVENvbXBhY3QgbWVzc2FnZScpOwotICAgIH0KLSAgICAkdmVyVHlwZSA9IDA7Ci0gICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZFVCeXRlKCR2ZXJUeXBlKTsKLSAgICAkdHlwZSA9ICgkdmVyVHlwZSA+PiBUQ29tcGFjdFByb3RvY29sOjpUWVBFX1NISUZUX0FNT1VOVCkgJiBUQ29tcGFjdFByb3RvY29sOjpUWVBFX0JJVFM7Ci0gICAgJHZlcnNpb24gPSAkdmVyVHlwZSAmIFRDb21wYWN0UHJvdG9jb2w6OlZFUlNJT05fTUFTSzsKLSAgICBpZiAoJHZlcnNpb24gIT0gVENvbXBhY3RQcm90b2NvbDo6VkVSU0lPTikgewotICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbignQmFkIHZlcnNpb24gaW4gVENvbXBhY3QgbWVzc2FnZScpOwotICAgIH0KLSAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkVmFyaW50KCRzZXFpZCk7Ci0gICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZFN0cmluZygkbmFtZSk7Ci0KLSAgICByZXR1cm4gJHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUVuZCgpCi0gIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0QmVnaW4oJiRuYW1lKQotICB7Ci0gICAgJG5hbWUgPSAnJzsgLy8gdW51c2VkCi0gICAgJHRoaXMtPnN0cnVjdHNbXSA9IGFycmF5KCR0aGlzLT5zdGF0ZSwgJHRoaXMtPmxhc3RGaWQpOwotICAgICR0aGlzLT5zdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0ZJRUxEX1JFQUQ7Ci0gICAgJHRoaXMtPmxhc3RGaWQgPSAwOwotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cnVjdEVuZCgpCi0gIHsKLSAgICAkbGFzdCA9IGFycmF5X3BvcCgkdGhpcy0+c3RydWN0cyk7Ci0gICAgJHRoaXMtPnN0YXRlID0gJGxhc3RbMF07Ci0gICAgJHRoaXMtPmxhc3RGaWQgPSAkbGFzdFsxXTsKLQotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRDb2xsZWN0aW9uQmVnaW4oJiR0eXBlLCAmJHNpemUpCi0gIHsKLSAgICAkc2l6ZVR5cGUgPSAwOwotICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZFVCeXRlKCRzaXplVHlwZSk7Ci0gICAgJHNpemUgPSAkc2l6ZVR5cGUgPj4gNDsKLSAgICAkdHlwZSA9ICR0aGlzLT5nZXRUVHlwZSgkc2l6ZVR5cGUpOwotICAgIGlmICgkc2l6ZSA9PSAxNSkgewotICAgICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZFZhcmludCgkc2l6ZSk7Ci0gICAgfQotICAgICR0aGlzLT5jb250YWluZXJzW10gPSAkdGhpcy0+c3RhdGU7Ci0gICAgJHRoaXMtPnN0YXRlID0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfQ09OVEFJTkVSX1JFQUQ7Ci0KLSAgICByZXR1cm4gJHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwQmVnaW4oJiRrZXlfdHlwZSwgJiR2YWxfdHlwZSwgJiRzaXplKQotICB7Ci0gICAgJHJlc3VsdCA9ICR0aGlzLT5yZWFkVmFyaW50KCRzaXplKTsKLSAgICAkdHlwZXMgPSAwOwotICAgIGlmICgkc2l6ZSA+IDApIHsKLSAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnJlYWRVQnl0ZSgkdHlwZXMpOwotICAgIH0KLSAgICAkdmFsX3R5cGUgPSAkdGhpcy0+Z2V0VFR5cGUoJHR5cGVzKTsKLSAgICAka2V5X3R5cGUgPSAkdGhpcy0+Z2V0VFR5cGUoJHR5cGVzID4+IDQpOwotICAgICR0aGlzLT5jb250YWluZXJzW10gPSAkdGhpcy0+c3RhdGU7Ci0gICAgJHRoaXMtPnN0YXRlID0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfQ09OVEFJTkVSX1JFQUQ7Ci0KLSAgICByZXR1cm4gJHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkQ29sbGVjdGlvbkVuZCgpCi0gIHsKLSAgICAkdGhpcy0+c3RhdGUgPSBhcnJheV9wb3AoJHRoaXMtPmNvbnRhaW5lcnMpOwotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEVuZCgpCi0gIHsKLSAgICByZXR1cm4gJHRoaXMtPnJlYWRDb2xsZWN0aW9uRW5kKCk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RCZWdpbigmJGVsZW1fdHlwZSwgJiRzaXplKQotICB7Ci0gICAgcmV0dXJuICR0aGlzLT5yZWFkQ29sbGVjdGlvbkJlZ2luKCRlbGVtX3R5cGUsICRzaXplKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEVuZCgpCi0gIHsKLSAgICByZXR1cm4gJHRoaXMtPnJlYWRDb2xsZWN0aW9uRW5kKCk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEJlZ2luKCYkZWxlbV90eXBlLCAmJHNpemUpCi0gIHsKLSAgICByZXR1cm4gJHRoaXMtPnJlYWRDb2xsZWN0aW9uQmVnaW4oJGVsZW1fdHlwZSwgJHNpemUpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRFbmQoKQotICB7Ci0gICAgcmV0dXJuICR0aGlzLT5yZWFkQ29sbGVjdGlvbkVuZCgpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRCb29sKCYkdmFsdWUpCi0gIHsKLSAgICBpZiAoJHRoaXMtPnN0YXRlID09IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0JPT0xfUkVBRCkgewotICAgICAgJHZhbHVlID0gJHRoaXMtPmJvb2xWYWx1ZTsKLQotICAgICAgcmV0dXJuIDA7Ci0gICAgfSBlbHNlaWYgKCR0aGlzLT5zdGF0ZSA9PSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9DT05UQUlORVJfUkVBRCkgewotICAgICAgcmV0dXJuICR0aGlzLT5yZWFkQnl0ZSgkdmFsdWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCdJbnZhbGlkIHN0YXRlIGluIGNvbXBhY3QgcHJvdG9jb2wnKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZEkxNigmJHZhbHVlKQotICB7Ci0gICAgcmV0dXJuICR0aGlzLT5yZWFkWmlnWmFnKCR2YWx1ZSk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZEkzMigmJHZhbHVlKQotICB7Ci0gICAgcmV0dXJuICR0aGlzLT5yZWFkWmlnWmFnKCR2YWx1ZSk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZERvdWJsZSgmJHZhbHVlKQotICB7Ci0gICAgJGRhdGEgPSAkdGhpcy0+dHJhbnNfLT5yZWFkQWxsKDgpOwotICAgICRhcnIgPSB1bnBhY2soJ2QnLCAkZGF0YSk7Ci0gICAgJHZhbHVlID0gJGFyclsxXTsKLQotICAgIHJldHVybiA4OwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJpbmcoJiR2YWx1ZSkKLSAgewotICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZFZhcmludCgkbGVuKTsKLSAgICBpZiAoJGxlbikgewotICAgICAgJHZhbHVlID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCgkbGVuKTsKLSAgICB9IGVsc2UgewotICAgICAgJHZhbHVlID0gJyc7Ci0gICAgfQotCi0gICAgcmV0dXJuICRyZXN1bHQgKyAkbGVuOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIGdldFRUeXBlKCRieXRlKQotICB7Ci0gICAgcmV0dXJuIHNlbGY6OiR0dHlwZXNbJGJ5dGUgJiAweDBmXTsKLSAgfQotCi0gIC8vIElmIHdlIGFyZSBvbiBhIDMyYml0IGFyY2hpdGVjdHVyZSB3ZSBoYXZlIHRvIGV4cGxpY2l0bHkgZGVhbCB3aXRoCi0gIC8vIDY0LWJpdCB0d29zLWNvbXBsZW1lbnQgYXJpdGhtZXRpYyBzaW5jZSBQSFAgd2FudHMgdG8gdHJlYXQgYWxsIGludHMKLSAgLy8gYXMgc2lnbmVkIGFuZCBhbnkgaW50IG92ZXIgMl4zMSAtIDEgYXMgYSBmbG9hdAotCi0gIC8vIFJlYWQgYW5kIHdyaXRlIEk2NCBhcyB0d28gMzIgYml0IG51bWJlcnMgJGhpIGFuZCAkbG8KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZEk2NCgmJHZhbHVlKQotICB7Ci0gICAgLy8gUmVhZCB2YXJpbnQgZnJvbSB3aXJlCi0gICAgJGhpID0gMDsKLSAgICAkbG8gPSAwOwotCi0gICAgJGlkeCA9IDA7Ci0gICAgJHNoaWZ0ID0gMDsKLQotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAkeCA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoMSk7Ci0gICAgICAkYXJyID0gdW5wYWNrKCdDJywgJHgpOwotICAgICAgJGJ5dGUgPSAkYXJyWzFdOwotICAgICAgJGlkeCArPSAxOwotICAgICAgaWYgKCRzaGlmdCA8IDMyKSB7Ci0gICAgICAgICRsbyB8PSAoKCRieXRlICYgMHg3ZikgPDwgJHNoaWZ0KSAmCi0gICAgICAgICAgMHgwMDAwMDAwMGZmZmZmZmZmOwotICAgICAgfQotICAgICAgLy8gU2hpZnQgaGkgYW5kIGxvIHRvZ2V0aGVyLgotICAgICAgaWYgKCRzaGlmdCA+PSAzMikgewotICAgICAgICAkaGkgfD0gKCgkYnl0ZSAmIDB4N2YpIDw8ICgkc2hpZnQgLSAzMikpOwotICAgICAgfSBlbHNlaWYgKCRzaGlmdCA+IDI1KSB7Ci0gICAgICAgICRoaSB8PSAoKCRieXRlICYgMHg3ZikgPj4gKCRzaGlmdCAtIDI1KSk7Ci0gICAgICB9Ci0gICAgICBpZiAoKCRieXRlID4+IDcpID09PSAwKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgJHNoaWZ0ICs9IDc7Ci0gICAgfQotCi0gICAgLy8gTm93LCB1bnppZyBpdC4KLSAgICAkeG9yZXIgPSAwOwotICAgIGlmICgkbG8gJiAxKSB7Ci0gICAgICAkeG9yZXIgPSAweGZmZmZmZmZmOwotICAgIH0KLSAgICAkbG8gPSAoJGxvID4+IDEpICYgMHg3ZmZmZmZmZjsKLSAgICAkbG8gPSAkbG8gfCAoKCRoaSAmIDEpIDw8IDMxKTsKLSAgICAkaGkgPSAoJGhpID4+IDEpIF4gJHhvcmVyOwotICAgICRsbyA9ICRsbyBeICR4b3JlcjsKLQotICAgIC8vIE5vdyBwdXQgJGhpIGFuZCAkbG8gYmFjayB0b2dldGhlcgotICAgIGlmICh0cnVlKSB7Ci0gICAgICAkaXNOZWcgPSAkaGkgIDwgMDsKLQotICAgICAgLy8gQ2hlY2sgZm9yIGEgbmVnYXRpdmUKLSAgICAgIGlmICgkaXNOZWcpIHsKLSAgICAgICAgJGhpID0gfiRoaSAmIChpbnQpIDB4ZmZmZmZmZmY7Ci0gICAgICAgICRsbyA9IH4kbG8gJiAoaW50KSAweGZmZmZmZmZmOwotCi0gICAgICAgIGlmICgkbG8gPT0gKGludCkgMHhmZmZmZmZmZikgewotICAgICAgICAgICRoaSsrOwotICAgICAgICAgICRsbyA9IDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgJGxvKys7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gRm9yY2UgMzJiaXQgd29yZHMgaW4gZXhjZXNzIG9mIDJHIHRvIGJlIHBvc2l0aXZlIC0gd2UgZGVhbCB3aXRoIHNpZ24KLSAgICAgIC8vIGV4cGxpY2l0bHkgYmVsb3cKLQotICAgICAgaWYgKCRoaSAmIChpbnQpIDB4ODAwMDAwMDApIHsKLSAgICAgICAgJGhpICY9IChpbnQpIDB4N2ZmZmZmZmY7Ci0gICAgICAgICRoaSArPSAweDgwMDAwMDAwOwotICAgICAgfQotCi0gICAgICBpZiAoJGxvICYgKGludCkgMHg4MDAwMDAwMCkgewotICAgICAgICAkbG8gJj0gKGludCkgMHg3ZmZmZmZmZjsKLSAgICAgICAgJGxvICs9IDB4ODAwMDAwMDA7Ci0gICAgICB9Ci0KLSAgICAgICR2YWx1ZSA9ICRoaSAqIDQyOTQ5NjcyOTYgKyAkbG87Ci0KLSAgICAgIGlmICgkaXNOZWcpIHsKLSAgICAgICAgJHZhbHVlID0gMCAtICR2YWx1ZTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotCi0gICAgICAvLyBVcGNhc3QgbmVnYXRpdmVzIGluIExTQiBiaXQKLSAgICAgIGlmICgkYXJyWzJdICYgMHg4MDAwMDAwMCkgewotICAgICAgICAkYXJyWzJdID0gJGFyclsyXSAmIDB4ZmZmZmZmZmY7Ci0gICAgICB9Ci0KLSAgICAgIC8vIENoZWNrIGZvciBhIG5lZ2F0aXZlCi0gICAgICBpZiAoJGFyclsxXSAmIDB4ODAwMDAwMDApIHsKLSAgICAgICAgJGFyclsxXSA9ICRhcnJbMV0gJiAweGZmZmZmZmZmOwotICAgICAgICAkYXJyWzFdID0gJGFyclsxXSBeIDB4ZmZmZmZmZmY7Ci0gICAgICAgICRhcnJbMl0gPSAkYXJyWzJdIF4gMHhmZmZmZmZmZjsKLSAgICAgICAgJHZhbHVlID0gMCAtICRhcnJbMV0gKiA0Mjk0OTY3Mjk2IC0gJGFyclsyXSAtIDE7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAkdmFsdWUgPSAkYXJyWzFdICogNDI5NDk2NzI5NiArICRhcnJbMl07Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuICRpZHg7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJNjQoJHZhbHVlKQotICB7Ci0gICAgLy8gSWYgd2UgYXJlIGluIGFuIEkzMiByYW5nZSwgdXNlIHRoZSBlYXN5IG1ldGhvZCBiZWxvdy4KLSAgICBpZiAoKCR2YWx1ZSA+IDQyOTQ5NjcyOTYpIHx8ICgkdmFsdWUgPCAtNDI5NDk2NzI5NikpIHsKLSAgICAgIC8vIENvbnZlcnQgJHZhbHVlIHRvICRoaSBhbmQgJGxvCi0gICAgICAkbmVnID0gJHZhbHVlIDwgMDsKLQotICAgICAgaWYgKCRuZWcpIHsKLSAgICAgICAgJHZhbHVlICo9IC0xOwotICAgICAgfQotCi0gICAgICAkaGkgPSAoaW50KSAkdmFsdWUgPj4gMzI7Ci0gICAgICAkbG8gPSAoaW50KSAkdmFsdWUgJiAweGZmZmZmZmZmOwotCi0gICAgICBpZiAoJG5lZykgewotICAgICAgICAkaGkgPSB+JGhpOwotICAgICAgICAkbG8gPSB+JGxvOwotICAgICAgICBpZiAoKCRsbyAmIChpbnQpIDB4ZmZmZmZmZmYpID09IChpbnQpIDB4ZmZmZmZmZmYpIHsKLSAgICAgICAgICAkbG8gPSAwOwotICAgICAgICAgICRoaSsrOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICRsbysrOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIE5vdyBkbyB0aGUgemlnZ2luZyBhbmQgemFnZ2luZy4KLSAgICAgICR4b3JlciA9IDA7Ci0gICAgICBpZiAoJG5lZykgewotICAgICAgICAkeG9yZXIgPSAweGZmZmZmZmZmOwotICAgICAgfQotICAgICAgJGxvd2JpdCA9ICgkbG8gPj4gMzEpICYgMTsKLSAgICAgICRoaSA9ICgkaGkgPDwgMSkgfCAkbG93Yml0OwotICAgICAgJGxvID0gKCRsbyA8PCAxKTsKLSAgICAgICRsbyA9ICgkbG8gXiAkeG9yZXIpICYgMHhmZmZmZmZmZjsKLSAgICAgICRoaSA9ICgkaGkgXiAkeG9yZXIpICYgMHhmZmZmZmZmZjsKLQotICAgICAgLy8gbm93IHdyaXRlIG91dCB0aGUgdmFyaW50LCBlbnN1cmluZyB3ZSBzaGlmdCBib3RoIGhpIGFuZCBsbwotICAgICAgJG91dCA9ICIiOwotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgaWYgKCgkbG8gJiB+MHg3ZikgPT09IDAgJiYKLSAgICAgICAgICAgJGhpID09PSAwKSB7Ci0gICAgICAgICAgJG91dCAuPSBjaHIoJGxvKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAkb3V0IC49IGNocigoJGxvICYgMHhmZikgfCAweDgwKTsKLSAgICAgICAgICAkbG8gPSAkbG8gPj4gNzsKLSAgICAgICAgICAkbG8gPSAkbG8gfCAoJGhpIDw8IDI1KTsKLSAgICAgICAgICAkaGkgPSAkaGkgPj4gNzsKLSAgICAgICAgICAvLyBSaWdodCBzaGlmdCBjYXJyaWVzIHNpZ24sIGJ1dCB3ZSBkb24ndCB3YW50IGl0IHRvLgotICAgICAgICAgICRoaSA9ICRoaSAmICgxMjcgPDwgMjUpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgICRyZXQgPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJG91dCk7Ci0gICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkb3V0LCAkcmV0KTsKLQotICAgICAgcmV0dXJuICRyZXQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAkdGhpcy0+d3JpdGVWYXJpbnQoJHRoaXMtPnRvWmlnWmFnKCR2YWx1ZSwgNjQpKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9USlNPTlByb3RvY29sLnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9USlNPTlByb3RvY29sLnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM5M2IwOS4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvUHJvdG9jb2wvVEpTT05Qcm90b2NvbC5waHAKKysrIC9kZXYvbnVsbApAQCAtMSw3NjkgKzAsMCBAQAotPD9waHAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKLSAqLwotCi1uYW1lc3BhY2UgVGhyaWZ0XFByb3RvY29sOwotCi11c2UgVGhyaWZ0XFR5cGVcVFR5cGU7Ci11c2UgVGhyaWZ0XEV4Y2VwdGlvblxUUHJvdG9jb2xFeGNlcHRpb247Ci11c2UgVGhyaWZ0XFByb3RvY29sXEpTT05cQmFzZUNvbnRleHQ7Ci11c2UgVGhyaWZ0XFByb3RvY29sXEpTT05cTG9va2FoZWFkUmVhZGVyOwotdXNlIFRocmlmdFxQcm90b2NvbFxKU09OXFBhaXJDb250ZXh0OwotdXNlIFRocmlmdFxQcm90b2NvbFxKU09OXExpc3RDb250ZXh0OwotCi0vKioKLSAqIEpTT04gaW1wbGVtZW50YXRpb24gb2YgdGhyaWZ0IHByb3RvY29sLCBwb3J0ZWQgZnJvbSBKYXZhLgotICovCi1jbGFzcyBUSlNPTlByb3RvY29sIGV4dGVuZHMgVFByb3RvY29sCi17Ci0gICAgY29uc3QgQ09NTUEgPSAnLCc7Ci0gICAgY29uc3QgQ09MT04gPSAnOic7Ci0gICAgY29uc3QgTEJSQUNFID0gJ3snOwotICAgIGNvbnN0IFJCUkFDRSA9ICd9JzsKLSAgICBjb25zdCBMQlJBQ0tFVCA9ICdbJzsKLSAgICBjb25zdCBSQlJBQ0tFVCA9ICddJzsKLSAgICBjb25zdCBRVU9URSA9ICciJzsKLSAgICBjb25zdCBCQUNLU0xBU0ggPSAnXFwnOwotICAgIGNvbnN0IFpFUk8gPSAnMCc7Ci0gICAgY29uc3QgRVNDU0VRID0gJ1xcJzsKLSAgICBjb25zdCBET1VCTEVFU0MgPSAnX19ET1VCTEVfRVNDQVBFX1NFUVVFTkNFX18nOwotCi0gICAgY29uc3QgVkVSU0lPTiA9IDE7Ci0KLSAgICBwdWJsaWMgc3RhdGljICRKU09OX0NIQVJfVEFCTEUgPSBhcnJheSgKLSAgICAgICAgLyogIDAgICAxICAgMiAgIDMgICA0ICAgNSAgIDYgICA3ICAgOCAgIDkgICBBICAgQiAgIEMgICBEICAgRSAgIEYgKi8KLSAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgJ2InLCAndCcsICduJywgMCwgJ2YnLCAncicsIDAsIDAsIC8vIDAKLSAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgLy8gMQotICAgICAgICAxLCAxLCAnIicsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIC8vIDIKLSAgICApOwotCi0gICAgcHVibGljIHN0YXRpYyAkRVNDQVBFX0NIQVJTID0gYXJyYXkoJyInLCAnXFwnLCAnLycsICJiIiwgImYiLCAibiIsICJyIiwgInQiKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgJEVTQ0FQRV9DSEFSX1ZBTFMgPSBhcnJheSgKLSAgICAgICAgJyInLCAnXFwnLCAnLycsICJceDA4IiwgIlxmIiwgIlxuIiwgIlxyIiwgIlx0IiwKLSAgICApOwotCi0gICAgY29uc3QgTkFNRV9CT09MID0gInRmIjsKLSAgICBjb25zdCBOQU1FX0JZVEUgPSAiaTgiOwotICAgIGNvbnN0IE5BTUVfSTE2ID0gImkxNiI7Ci0gICAgY29uc3QgTkFNRV9JMzIgPSAiaTMyIjsKLSAgICBjb25zdCBOQU1FX0k2NCA9ICJpNjQiOwotICAgIGNvbnN0IE5BTUVfRE9VQkxFID0gImRibCI7Ci0gICAgY29uc3QgTkFNRV9TVFJVQ1QgPSAicmVjIjsKLSAgICBjb25zdCBOQU1FX1NUUklORyA9ICJzdHIiOwotICAgIGNvbnN0IE5BTUVfTUFQID0gIm1hcCI7Ci0gICAgY29uc3QgTkFNRV9MSVNUID0gImxzdCI7Ci0gICAgY29uc3QgTkFNRV9TRVQgPSAic2V0IjsKLQotICAgIHByaXZhdGUgZnVuY3Rpb24gZ2V0VHlwZU5hbWVGb3JUeXBlSUQoJHR5cGVJRCkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAoJHR5cGVJRCkgewotICAgICAgICAgICAgY2FzZSBUVHlwZTo6Qk9PTDoKLSAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6TkFNRV9CT09MOwotICAgICAgICAgICAgY2FzZSBUVHlwZTo6QllURToKLSAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6TkFNRV9CWVRFOwotICAgICAgICAgICAgY2FzZSBUVHlwZTo6STE2OgotICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOjpOQU1FX0kxNjsKLSAgICAgICAgICAgIGNhc2UgVFR5cGU6OkkzMjoKLSAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6TkFNRV9JMzI7Ci0gICAgICAgICAgICBjYXNlIFRUeXBlOjpJNjQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY6Ok5BTUVfSTY0OwotICAgICAgICAgICAgY2FzZSBUVHlwZTo6RE9VQkxFOgotICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOjpOQU1FX0RPVUJMRTsKLSAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNUUklORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6TkFNRV9TVFJJTkc7Ci0gICAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY6Ok5BTUVfU1RSVUNUOwotICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgotICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOjpOQU1FX01BUDsKLSAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6TkFNRV9TRVQ7Ci0gICAgICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY6Ok5BTUVfTElTVDsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiVW5yZWNvZ25pemVkIHR5cGUiLCBUUHJvdG9jb2xFeGNlcHRpb246OlVOS05PV04pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmdW5jdGlvbiBnZXRUeXBlSURGb3JUeXBlTmFtZSgkbmFtZSkKLSAgICB7Ci0gICAgICAgICRyZXN1bHQgPSBUVHlwZTo6U1RPUDsKLQotICAgICAgICBpZiAoc3RybGVuKCRuYW1lKSA+IDEpIHsKLSAgICAgICAgICAgIHN3aXRjaCAoc3Vic3RyKCRuYW1lLCAwLCAxKSkgewotICAgICAgICAgICAgICAgIGNhc2UgJ2QnOgotICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ID0gVFR5cGU6OkRPVUJMRTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAnaSc6Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3Vic3RyKCRuYW1lLCAxLCAxKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnOCc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCA9IFRUeXBlOjpCWVRFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnMSc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCA9IFRUeXBlOjpJMTY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICczJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ID0gVFR5cGU6OkkzMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzYnOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgPSBUVHlwZTo6STY0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgJ2wnOgotICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ID0gVFR5cGU6OkxTVDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAnbSc6Ci0gICAgICAgICAgICAgICAgICAgICRyZXN1bHQgPSBUVHlwZTo6TUFQOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICdyJzoKLSAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCA9IFRUeXBlOjpTVFJVQ1Q7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgJ3MnOgotICAgICAgICAgICAgICAgICAgICBpZiAoc3Vic3RyKCRuYW1lLCAxLCAxKSA9PSAndCcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgPSBUVHlwZTo6U1RSSU5HOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2VpZiAoc3Vic3RyKCRuYW1lLCAxLCAxKSA9PSAnZScpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgPSBUVHlwZTo6U0VUOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgJ3QnOgotICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ID0gVFR5cGU6OkJPT0w7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICgkcmVzdWx0ID09IFRUeXBlOjpTVE9QKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJVbnJlY29nbml6ZWQgdHlwZSIsIFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAkcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyAkY29udGV4dFN0YWNrXyA9IGFycmF5KCk7Ci0gICAgcHVibGljICRjb250ZXh0XzsKLSAgICBwdWJsaWMgJHJlYWRlcl87Ci0KLSAgICBwcml2YXRlIGZ1bmN0aW9uIHB1c2hDb250ZXh0KCRjKQotICAgIHsKLSAgICAgICAgYXJyYXlfcHVzaCgkdGhpcy0+Y29udGV4dFN0YWNrXywgJHRoaXMtPmNvbnRleHRfKTsKLSAgICAgICAgJHRoaXMtPmNvbnRleHRfID0gJGM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmdW5jdGlvbiBwb3BDb250ZXh0KCkKLSAgICB7Ci0gICAgICAgICR0aGlzLT5jb250ZXh0XyA9IGFycmF5X3BvcCgkdGhpcy0+Y29udGV4dFN0YWNrXyk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCR0cmFucykKLSAgICB7Ci0gICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJHRyYW5zKTsKLSAgICAgICAgJHRoaXMtPmNvbnRleHRfID0gbmV3IEJhc2VDb250ZXh0KCk7Ci0gICAgICAgICR0aGlzLT5yZWFkZXJfID0gbmV3IExvb2thaGVhZFJlYWRlcigkdGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlc2V0KCkKLSAgICB7Ci0gICAgICAgICR0aGlzLT5jb250ZXh0U3RhY2tfID0gYXJyYXkoKTsKLSAgICAgICAgJHRoaXMtPmNvbnRleHRfID0gbmV3IEJhc2VDb250ZXh0KCk7Ci0gICAgICAgICR0aGlzLT5yZWFkZXJfID0gbmV3IExvb2thaGVhZFJlYWRlcigkdGhpcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSAkdG1wYnVmXyA9IGFycmF5KDQpOwotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRKU09OU3ludGF4Q2hhcigkYikKLSAgICB7Ci0gICAgICAgICRjaCA9ICR0aGlzLT5yZWFkZXJfLT5yZWFkKCk7Ci0KLSAgICAgICAgaWYgKHN1YnN0cigkY2gsIDAsIDEpICE9ICRiKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJVbmV4cGVjdGVkIGNoYXJhY3RlcjogIiAuICRjaCwgVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmdW5jdGlvbiBoZXhWYWwoJHMpCi0gICAgewotICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCBzdHJsZW4oJHMpOyAkaSsrKSB7Ci0gICAgICAgICAgICAkY2ggPSBzdWJzdHIoJHMsICRpLCAxKTsKLQotICAgICAgICAgICAgaWYgKCEoJGNoID49ICJhIiAmJiAkY2ggPD0gImYiKSAmJiAhKCRjaCA+PSAiMCIgJiYgJGNoIDw9ICI5IikpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJFeHBlY3RlZCBoZXggY2hhcmFjdGVyICIgLiAkY2gsIFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBoZXhkZWMoJHMpOwotICAgIH0KLQotICAgIHByaXZhdGUgZnVuY3Rpb24gaGV4Q2hhcigkdmFsKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRlY2hleCgkdmFsKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZ1bmN0aW9uIHdyaXRlSlNPTlN0cmluZygkYikKLSAgICB7Ci0gICAgICAgICR0aGlzLT5jb250ZXh0Xy0+d3JpdGUoKTsKLQotICAgICAgICBpZiAoaXNfbnVtZXJpYygkYikgJiYgJHRoaXMtPmNvbnRleHRfLT5lc2NhcGVOdW0oKSkgewotICAgICAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UVVPVEUpOwotICAgICAgICB9Ci0KLSAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoanNvbl9lbmNvZGUoJGIpKTsKLQotICAgICAgICBpZiAoaXNfbnVtZXJpYygkYikgJiYgJHRoaXMtPmNvbnRleHRfLT5lc2NhcGVOdW0oKSkgewotICAgICAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UVVPVEUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZUpTT05JbnRlZ2VyKCRudW0pCi0gICAgewotICAgICAgICAkdGhpcy0+Y29udGV4dF8tPndyaXRlKCk7Ci0KLSAgICAgICAgaWYgKCR0aGlzLT5jb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKLSAgICAgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlFVT1RFKTsKLSAgICAgICAgfQotCi0gICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKCRudW0pOwotCi0gICAgICAgIGlmICgkdGhpcy0+Y29udGV4dF8tPmVzY2FwZU51bSgpKSB7Ci0gICAgICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpRVU9URSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZ1bmN0aW9uIHdyaXRlSlNPTkRvdWJsZSgkbnVtKQotICAgIHsKLSAgICAgICAgJHRoaXMtPmNvbnRleHRfLT53cml0ZSgpOwotCi0gICAgICAgIGlmICgkdGhpcy0+Y29udGV4dF8tPmVzY2FwZU51bSgpKSB7Ci0gICAgICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpRVU9URSk7Ci0gICAgICAgIH0KLQotICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShqc29uX2VuY29kZSgkbnVtKSk7Ci0KLSAgICAgICAgaWYgKCR0aGlzLT5jb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKLSAgICAgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlFVT1RFKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZnVuY3Rpb24gd3JpdGVKU09OQmFzZTY0KCRkYXRhKQotICAgIHsKLSAgICAgICAgJHRoaXMtPmNvbnRleHRfLT53cml0ZSgpOwotICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpRVU9URSk7Ci0gICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKGpzb25fZW5jb2RlKGJhc2U2NF9lbmNvZGUoJGRhdGEpKSk7Ci0gICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlFVT1RFKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZ1bmN0aW9uIHdyaXRlSlNPTk9iamVjdFN0YXJ0KCkKLSAgICB7Ci0gICAgICAkdGhpcy0+Y29udGV4dF8tPndyaXRlKCk7Ci0gICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpMQlJBQ0UpOwotICAgICAgJHRoaXMtPnB1c2hDb250ZXh0KG5ldyBQYWlyQ29udGV4dCgkdGhpcykpOwotICAgIH0KLQotICAgIHByaXZhdGUgZnVuY3Rpb24gd3JpdGVKU09OT2JqZWN0RW5kKCkKLSAgICB7Ci0gICAgICAkdGhpcy0+cG9wQ29udGV4dCgpOwotICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UkJSQUNFKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZ1bmN0aW9uIHdyaXRlSlNPTkFycmF5U3RhcnQoKQotICAgIHsKLSAgICAgICR0aGlzLT5jb250ZXh0Xy0+d3JpdGUoKTsKLSAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OkxCUkFDS0VUKTsKLSAgICAgICR0aGlzLT5wdXNoQ29udGV4dChuZXcgTGlzdENvbnRleHQoJHRoaXMpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZ1bmN0aW9uIHdyaXRlSlNPTkFycmF5RW5kKCkKLSAgICB7Ci0gICAgICAkdGhpcy0+cG9wQ29udGV4dCgpOwotICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UkJSQUNLRVQpOwotICAgIH0KLQotICAgIHByaXZhdGUgZnVuY3Rpb24gcmVhZEpTT05TdHJpbmcoJHNraXBDb250ZXh0KQotICAgIHsKLSAgICAgIGlmICghJHNraXBDb250ZXh0KSB7Ci0gICAgICAgICR0aGlzLT5jb250ZXh0Xy0+cmVhZCgpOwotICAgICAgfQotCi0gICAgICAkanNvblN0cmluZyA9ICcnOwotICAgICAgJGxhc3RDaGFyID0gbnVsbDsKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICRjaCA9ICR0aGlzLT5yZWFkZXJfLT5yZWFkKCk7Ci0gICAgICAgICRqc29uU3RyaW5nIC49ICRjaDsKLSAgICAgICAgaWYgKCRjaCA9PSBzZWxmOjpRVU9URSAmJgotICAgICAgICAgICRsYXN0Q2hhciAhPT0gTlVMTCAmJgotICAgICAgICAgICAgJGxhc3RDaGFyICE9PSBzZWxmOjpFU0NTRVEpIHsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAoJGNoID09IHNlbGY6OkVTQ1NFUSAmJiAkbGFzdENoYXIgPT0gc2VsZjo6RVNDU0VRKSB7Ci0gICAgICAgICAgJGxhc3RDaGFyID0gc2VsZjo6RE9VQkxFRVNDOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICRsYXN0Q2hhciA9ICRjaDsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICByZXR1cm4ganNvbl9kZWNvZGUoJGpzb25TdHJpbmcpOwotICAgIH0KLQotICAgIHByaXZhdGUgZnVuY3Rpb24gaXNKU09OTnVtZXJpYygkYikKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAoJGIpIHsKLSAgICAgICAgICAgIGNhc2UgJysnOgotICAgICAgICAgICAgY2FzZSAnLSc6Ci0gICAgICAgICAgICBjYXNlICcuJzoKLSAgICAgICAgICAgIGNhc2UgJzAnOgotICAgICAgICAgICAgY2FzZSAnMSc6Ci0gICAgICAgICAgICBjYXNlICcyJzoKLSAgICAgICAgICAgIGNhc2UgJzMnOgotICAgICAgICAgICAgY2FzZSAnNCc6Ci0gICAgICAgICAgICBjYXNlICc1JzoKLSAgICAgICAgICAgIGNhc2UgJzYnOgotICAgICAgICAgICAgY2FzZSAnNyc6Ci0gICAgICAgICAgICBjYXNlICc4JzoKLSAgICAgICAgICAgIGNhc2UgJzknOgotICAgICAgICAgICAgY2FzZSAnRSc6Ci0gICAgICAgICAgICBjYXNlICdlJzoKLSAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgZnVuY3Rpb24gcmVhZEpTT05OdW1lcmljQ2hhcnMoKQotICAgIHsKLSAgICAgICAgJHN0cmJsZCA9IGFycmF5KCk7Ci0KLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgICRjaCA9ICR0aGlzLT5yZWFkZXJfLT5wZWVrKCk7Ci0KLSAgICAgICAgICAgIGlmICghJHRoaXMtPmlzSlNPTk51bWVyaWMoJGNoKSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAkc3RyYmxkW10gPSAkdGhpcy0+cmVhZGVyXy0+cmVhZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGltcGxvZGUoIiIsICRzdHJibGQpOwotICAgIH0KLQotICAgIHByaXZhdGUgZnVuY3Rpb24gcmVhZEpTT05JbnRlZ2VyKCkKLSAgICB7Ci0gICAgICAgICR0aGlzLT5jb250ZXh0Xy0+cmVhZCgpOwotCi0gICAgICAgIGlmICgkdGhpcy0+Y29udGV4dF8tPmVzY2FwZU51bSgpKSB7Ci0gICAgICAgICAgICAkdGhpcy0+cmVhZEpTT05TeW50YXhDaGFyKHNlbGY6OlFVT1RFKTsKLSAgICAgICAgfQotCi0gICAgICAgICRzdHIgPSAkdGhpcy0+cmVhZEpTT05OdW1lcmljQ2hhcnMoKTsKLQotICAgICAgICBpZiAoJHRoaXMtPmNvbnRleHRfLT5lc2NhcGVOdW0oKSkgewotICAgICAgICAgICAgJHRoaXMtPnJlYWRKU09OU3ludGF4Q2hhcihzZWxmOjpRVU9URSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWlzX251bWVyaWMoJHN0cikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIkludmFsaWQgZGF0YSBpbiBudW1lcmljOiAiIC4gJHN0ciwgVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGludHZhbCgkc3RyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZGVudGljYWwgdG8gcmVhZEpTT05JbnRlZ2VyIGJ1dCB3aXRob3V0IHRoZSBmaW5hbCBjYXN0LgotICAgICAqIE5lZWRlZCBmb3IgcHJvcGVyIGhhbmRsaW5nIG9mIGk2NCBvbiAzMiBiaXQgbWFjaGluZXMuICBXaHkgYQotICAgICAqIHNlcGFyYXRlIGZ1bmN0aW9uPyAgU28gd2UgZG9uJ3QgaGF2ZSB0byBmb3JjZSB0aGUgcmVzdCBvZiB0aGUKLSAgICAgKiB1c2UgY2FzZXMgdGhyb3VnaCB0aGUgZXh0cmEgY29uZGl0aW9uYWwuCi0gICAgICovCi0gICAgcHJpdmF0ZSBmdW5jdGlvbiByZWFkSlNPTkludGVnZXJBc1N0cmluZygpCi0gICAgewotICAgICAgICAkdGhpcy0+Y29udGV4dF8tPnJlYWQoKTsKLQotICAgICAgICBpZiAoJHRoaXMtPmNvbnRleHRfLT5lc2NhcGVOdW0oKSkgewotICAgICAgICAgICAgJHRoaXMtPnJlYWRKU09OU3ludGF4Q2hhcihzZWxmOjpRVU9URSk7Ci0gICAgICAgIH0KLQotICAgICAgICAkc3RyID0gJHRoaXMtPnJlYWRKU09OTnVtZXJpY0NoYXJzKCk7Ci0KLSAgICAgICAgaWYgKCR0aGlzLT5jb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKLSAgICAgICAgICAgICR0aGlzLT5yZWFkSlNPTlN5bnRheENoYXIoc2VsZjo6UVVPVEUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFpc19udW1lcmljKCRzdHIpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJJbnZhbGlkIGRhdGEgaW4gbnVtZXJpYzogIiAuICRzdHIsIFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAkc3RyOwotICAgIH0KLQotICAgIHByaXZhdGUgZnVuY3Rpb24gcmVhZEpTT05Eb3VibGUoKQotICAgIHsKLSAgICAgICAgJHRoaXMtPmNvbnRleHRfLT5yZWFkKCk7Ci0KLSAgICAgICAgaWYgKHN1YnN0cigkdGhpcy0+cmVhZGVyXy0+cGVlaygpLCAwLCAxKSA9PSBzZWxmOjpRVU9URSkgewotICAgICAgICAgICAgJGFyciA9ICR0aGlzLT5yZWFkSlNPTlN0cmluZyh0cnVlKTsKLQotICAgICAgICAgICAgaWYgKCRhcnIgPT0gIk5hTiIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTkFOOwotICAgICAgICAgICAgfSBlbHNlaWYgKCRhcnIgPT0gIkluZmluaXR5IikgewotICAgICAgICAgICAgICAgIHJldHVybiBJTkY7Ci0gICAgICAgICAgICB9IGVsc2VpZiAoISR0aGlzLT5jb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJOdW1lcmljIGRhdGEgdW5leHBlY3RlZGx5IHF1b3RlZCAiIC4gJGFyciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBmbG9hdHZhbCgkYXJyKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICgkdGhpcy0+Y29udGV4dF8tPmVzY2FwZU51bSgpKSB7Ci0gICAgICAgICAgICAgICAgJHRoaXMtPnJlYWRKU09OU3ludGF4Q2hhcihzZWxmOjpRVU9URSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBmbG9hdHZhbCgkdGhpcy0+cmVhZEpTT05OdW1lcmljQ2hhcnMoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZ1bmN0aW9uIHJlYWRKU09OQmFzZTY0KCkKLSAgICB7Ci0gICAgICAgICRhcnIgPSAkdGhpcy0+cmVhZEpTT05TdHJpbmcoZmFsc2UpOwotICAgICAgICAkZGF0YSA9IGJhc2U2NF9kZWNvZGUoJGFyciwgdHJ1ZSk7Ci0KLSAgICAgICAgaWYgKCRkYXRhID09PSBmYWxzZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiSW52YWxpZCBiYXNlNjQgZGF0YSAiIC4gJGFyciwgVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuICRkYXRhOwotICAgIH0KLQotICAgIHByaXZhdGUgZnVuY3Rpb24gcmVhZEpTT05PYmplY3RTdGFydCgpCi0gICAgewotICAgICAgICAkdGhpcy0+Y29udGV4dF8tPnJlYWQoKTsKLSAgICAgICAgJHRoaXMtPnJlYWRKU09OU3ludGF4Q2hhcihzZWxmOjpMQlJBQ0UpOwotICAgICAgICAkdGhpcy0+cHVzaENvbnRleHQobmV3IFBhaXJDb250ZXh0KCR0aGlzKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmdW5jdGlvbiByZWFkSlNPTk9iamVjdEVuZCgpCi0gICAgewotICAgICAgICAkdGhpcy0+cmVhZEpTT05TeW50YXhDaGFyKHNlbGY6OlJCUkFDRSk7Ci0gICAgICAgICR0aGlzLT5wb3BDb250ZXh0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmdW5jdGlvbiByZWFkSlNPTkFycmF5U3RhcnQoKQotICAgIHsKLSAgICAgICAgJHRoaXMtPmNvbnRleHRfLT5yZWFkKCk7Ci0gICAgICAgICR0aGlzLT5yZWFkSlNPTlN5bnRheENoYXIoc2VsZjo6TEJSQUNLRVQpOwotICAgICAgICAkdGhpcy0+cHVzaENvbnRleHQobmV3IExpc3RDb250ZXh0KCR0aGlzKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmdW5jdGlvbiByZWFkSlNPTkFycmF5RW5kKCkKLSAgICB7Ci0gICAgICAgICR0aGlzLT5yZWFkSlNPTlN5bnRheENoYXIoc2VsZjo6UkJSQUNLRVQpOwotICAgICAgICAkdGhpcy0+cG9wQ29udGV4dCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyB0aGUgbWVzc2FnZSBoZWFkZXIKLSAgICAgKgotICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgIEZ1bmN0aW9uIG5hbWUKLSAgICAgKiBAcGFyYW0gaW50ICAgICR0eXBlICBtZXNzYWdlIHR5cGUgVE1lc3NhZ2VUeXBlOjpDQUxMIG9yIFRNZXNzYWdlVHlwZTo6UkVQTFkKLSAgICAgKiBAcGFyYW0gaW50ICAgICRzZXFpZCBUaGUgc2VxdWVuY2UgaWQgb2YgdGhpcyBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUJlZ2luKCRuYW1lLCAkdHlwZSwgJHNlcWlkKQotICAgIHsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTkFycmF5U3RhcnQoKTsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoc2VsZjo6VkVSU0lPTik7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05TdHJpbmcoJG5hbWUpOwotICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkdHlwZSk7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRzZXFpZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xvc2UgdGhlIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlRW5kKCkKLSAgICB7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05BcnJheUVuZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyBhIHN0cnVjdCBoZWFkZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gIHN0cmluZyAgICAgJG5hbWUgU3RydWN0IG5hbWUKLSAgICAgKiBAdGhyb3dzIFRFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKLSAgICAgKiBAcmV0dXJuIGludCAgICAgICAgSG93IG1hbnkgYnl0ZXMgd3JpdHRlbgotICAgICAqLwotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEJlZ2luKCRuYW1lKQotICAgIHsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTk9iamVjdFN0YXJ0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xvc2UgYSBzdHJ1Y3QuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIFRFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKLSAgICAgKiBAcmV0dXJuIGludCAgICAgICAgSG93IG1hbnkgYnl0ZXMgd3JpdHRlbgotICAgICAqLwotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEVuZCgpCi0gICAgewotICAgICAgICAkdGhpcy0+d3JpdGVKU09OT2JqZWN0RW5kKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRCZWdpbigkZmllbGROYW1lLCAkZmllbGRUeXBlLCAkZmllbGRJZCkKLSAgICB7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRmaWVsZElkKTsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTk9iamVjdFN0YXJ0KCk7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05TdHJpbmcoJHRoaXMtPmdldFR5cGVOYW1lRm9yVHlwZUlEKCRmaWVsZFR5cGUpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEVuZCgpCi0gICAgewotICAgICAgICAkdGhpcy0+d3JpdGVKc29uT2JqZWN0RW5kKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRTdG9wKCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwQmVnaW4oJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSkKLSAgICB7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05BcnJheVN0YXJ0KCk7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05TdHJpbmcoJHRoaXMtPmdldFR5cGVOYW1lRm9yVHlwZUlEKCRrZXlUeXBlKSk7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05TdHJpbmcoJHRoaXMtPmdldFR5cGVOYW1lRm9yVHlwZUlEKCR2YWxUeXBlKSk7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRzaXplKTsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTk9iamVjdFN0YXJ0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwRW5kKCkKLSAgICB7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05PYmplY3RFbmQoKTsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTkFycmF5RW5kKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpCi0gICAgewotICAgICAgICAkdGhpcy0+d3JpdGVKU09OQXJyYXlTdGFydCgpOwotICAgICAgICAkdGhpcy0+d3JpdGVKU09OU3RyaW5nKCR0aGlzLT5nZXRUeXBlTmFtZUZvclR5cGVJRCgkZWxlbVR5cGUpKTsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJHNpemUpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUxpc3RFbmQoKQotICAgIHsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTkFycmF5RW5kKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSkKLSAgICB7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05BcnJheVN0YXJ0KCk7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05TdHJpbmcoJHRoaXMtPmdldFR5cGVOYW1lRm9yVHlwZUlEKCRlbGVtVHlwZSkpOwotICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkc2l6ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0RW5kKCkKLSAgICB7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05BcnJheUVuZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJvb2woJGJvb2wpCi0gICAgewotICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkYm9vbCA/IDEgOiAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCeXRlKCRieXRlKQotICAgIHsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJGJ5dGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkxNigkaTE2KQotICAgIHsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJGkxNik7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTMyKCRpMzIpCi0gICAgewotICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkaTMyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJNjQoJGk2NCkKLSAgICB7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRpNjQpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZURvdWJsZSgkZHViKQotICAgIHsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTkRvdWJsZSgkZHViKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJpbmcoJHN0cikKLSAgICB7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05TdHJpbmcoJHN0cik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZHMgdGhlIG1lc3NhZ2UgaGVhZGVyCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lIEZ1bmN0aW9uIG5hbWUKLSAgICAgKiBAcGFyYW0gaW50ICAgICR0eXBlIG1lc3NhZ2UgdHlwZSBUTWVzc2FnZVR5cGU6OkNBTEwgb3IgVE1lc3NhZ2VUeXBlOjpSRVBMWQotICAgICAqIEBwYXJlbSBpbnQgJHNlcWlkIFRoZSBzZXF1ZW5jZSBpZCBvZiB0aGlzIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1lc3NhZ2VCZWdpbigmJG5hbWUsICYkdHlwZSwgJiRzZXFpZCkKLSAgICB7Ci0gICAgICAgICR0aGlzLT5yZWFkSlNPTkFycmF5U3RhcnQoKTsKLQotICAgICAgICBpZiAoJHRoaXMtPnJlYWRKU09OSW50ZWdlcigpICE9IHNlbGY6OlZFUlNJT04pIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIk1lc3NhZ2UgY29udGFpbmVkIGJhZCB2ZXJzaW9uIiwgVFByb3RvY29sRXhjZXB0aW9uOjpCQURfVkVSU0lPTik7Ci0gICAgICAgIH0KLQotICAgICAgICAkbmFtZSA9ICR0aGlzLT5yZWFkSlNPTlN0cmluZyhmYWxzZSk7Ci0gICAgICAgICR0eXBlID0gJHRoaXMtPnJlYWRKU09OSW50ZWdlcigpOwotICAgICAgICAkc2VxaWQgPSAkdGhpcy0+cmVhZEpTT05JbnRlZ2VyKCk7Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZCB0aGUgY2xvc2Ugb2YgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUVuZCgpCi0gICAgewotICAgICAgICAkdGhpcy0+cmVhZEpTT05BcnJheUVuZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0QmVnaW4oJiRuYW1lKQotICAgIHsKLSAgICAgICAgJHRoaXMtPnJlYWRKU09OT2JqZWN0U3RhcnQoKTsKLQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cnVjdEVuZCgpCi0gICAgewotICAgICAgICAkdGhpcy0+cmVhZEpTT05PYmplY3RFbmQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkQmVnaW4oJiRuYW1lLCAmJGZpZWxkVHlwZSwgJiRmaWVsZElkKQotICAgIHsKLSAgICAgICAgJGNoID0gJHRoaXMtPnJlYWRlcl8tPnBlZWsoKTsKLSAgICAgICAgJG5hbWUgPSAiIjsKLQotICAgICAgICBpZiAoc3Vic3RyKCRjaCwgMCwgMSkgPT0gc2VsZjo6UkJSQUNFKSB7Ci0gICAgICAgICAgICAkZmllbGRUeXBlID0gVFR5cGU6OlNUT1A7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAkZmllbGRJZCA9ICR0aGlzLT5yZWFkSlNPTkludGVnZXIoKTsKLSAgICAgICAgICAgICR0aGlzLT5yZWFkSlNPTk9iamVjdFN0YXJ0KCk7Ci0gICAgICAgICAgICAkZmllbGRUeXBlID0gJHRoaXMtPmdldFR5cGVJREZvclR5cGVOYW1lKCR0aGlzLT5yZWFkSlNPTlN0cmluZyhmYWxzZSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRGaWVsZEVuZCgpCi0gICAgewotICAgICAgICAkdGhpcy0+cmVhZEpTT05PYmplY3RFbmQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEJlZ2luKCYka2V5VHlwZSwgJiR2YWxUeXBlLCAmJHNpemUpCi0gICAgewotICAgICAgICAkdGhpcy0+cmVhZEpTT05BcnJheVN0YXJ0KCk7Ci0gICAgICAgICRrZXlUeXBlID0gJHRoaXMtPmdldFR5cGVJREZvclR5cGVOYW1lKCR0aGlzLT5yZWFkSlNPTlN0cmluZyhmYWxzZSkpOwotICAgICAgICAkdmFsVHlwZSA9ICR0aGlzLT5nZXRUeXBlSURGb3JUeXBlTmFtZSgkdGhpcy0+cmVhZEpTT05TdHJpbmcoZmFsc2UpKTsKLSAgICAgICAgJHNpemUgPSAkdGhpcy0+cmVhZEpTT05JbnRlZ2VyKCk7Ci0gICAgICAgICR0aGlzLT5yZWFkSlNPTk9iamVjdFN0YXJ0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNYXBFbmQoKQotICAgIHsKLSAgICAgICAgJHRoaXMtPnJlYWRKU09OT2JqZWN0RW5kKCk7Ci0gICAgICAgICR0aGlzLT5yZWFkSlNPTkFycmF5RW5kKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0QmVnaW4oJiRlbGVtVHlwZSwgJiRzaXplKQotICAgIHsKLSAgICAgICAgJHRoaXMtPnJlYWRKU09OQXJyYXlTdGFydCgpOwotICAgICAgICAkZWxlbVR5cGUgPSAkdGhpcy0+Z2V0VHlwZUlERm9yVHlwZU5hbWUoJHRoaXMtPnJlYWRKU09OU3RyaW5nKGZhbHNlKSk7Ci0gICAgICAgICRzaXplID0gJHRoaXMtPnJlYWRKU09OSW50ZWdlcigpOwotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEVuZCgpCi0gICAgewotICAgICAgICAkdGhpcy0+cmVhZEpTT05BcnJheUVuZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU2V0QmVnaW4oJiRlbGVtVHlwZSwgJiRzaXplKQotICAgIHsKLSAgICAgICAgJHRoaXMtPnJlYWRKU09OQXJyYXlTdGFydCgpOwotICAgICAgICAkZWxlbVR5cGUgPSAkdGhpcy0+Z2V0VHlwZUlERm9yVHlwZU5hbWUoJHRoaXMtPnJlYWRKU09OU3RyaW5nKGZhbHNlKSk7Ci0gICAgICAgICRzaXplID0gJHRoaXMtPnJlYWRKU09OSW50ZWdlcigpOwotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU2V0RW5kKCkKLSAgICB7Ci0gICAgICAgICR0aGlzLT5yZWFkSlNPTkFycmF5RW5kKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRCb29sKCYkYm9vbCkKLSAgICB7Ci0gICAgICAgICRib29sID0gJHRoaXMtPnJlYWRKU09OSW50ZWdlcigpID09IDAgPyBmYWxzZSA6IHRydWU7Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRCeXRlKCYkYnl0ZSkKLSAgICB7Ci0gICAgICAgICRieXRlID0gJHRoaXMtPnJlYWRKU09OSW50ZWdlcigpOwotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTE2KCYkaTE2KQotICAgIHsKLSAgICAgICAgJGkxNiA9ICR0aGlzLT5yZWFkSlNPTkludGVnZXIoKTsKLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEkzMigmJGkzMikKLSAgICB7Ci0gICAgICAgICRpMzIgPSAkdGhpcy0+cmVhZEpTT05JbnRlZ2VyKCk7Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJNjQoJiRpNjQpCi0gICAgewotICAgICAgICBpZiAoUEhQX0lOVF9TSVpFID09PSA0KSB7Ci0gICAgICAgICAgICAkaTY0ID0gJHRoaXMtPnJlYWRKU09OSW50ZWdlckFzU3RyaW5nKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAkaTY0ID0gJHRoaXMtPnJlYWRKU09OSW50ZWdlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWREb3VibGUoJiRkdWIpCi0gICAgewotICAgICAgICAkZHViID0gJHRoaXMtPnJlYWRKU09ORG91YmxlKCk7Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJpbmcoJiRzdHIpCi0gICAgewotICAgICAgICAkc3RyID0gJHRoaXMtPnJlYWRKU09OU3RyaW5nKGZhbHNlKTsKLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvUHJvdG9jb2wvVFByb3RvY29sLnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9UUHJvdG9jb2wucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTNiYzBkLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9UUHJvdG9jb2wucGhwCisrKyAvZGV2L251bGwKQEAgLTEsMzUyICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2w7Ci0KLXVzZSBUaHJpZnRcVHlwZVxUVHlwZTsKLXVzZSBUaHJpZnRcRXhjZXB0aW9uXFRQcm90b2NvbEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBQcm90b2NvbCBiYXNlIGNsYXNzIG1vZHVsZS4KLSAqLwotYWJzdHJhY3QgY2xhc3MgVFByb3RvY29sCi17Ci0gIC8qKgotICAgKiBVbmRlcmx5aW5nIHRyYW5zcG9ydAotICAgKgotICAgKiBAdmFyIFRUcmFuc3BvcnQKLSAgICovCi0gIHByb3RlY3RlZCAkdHJhbnNfOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RvcgotICAgKi8KLSAgcHJvdGVjdGVkIGZ1bmN0aW9uIF9fY29uc3RydWN0KCR0cmFucykKLSAgewotICAgICR0aGlzLT50cmFuc18gPSAkdHJhbnM7Ci0gIH0KLQotICAvKioKLSAgICogQWNjZXNzb3IgZm9yIHRyYW5zcG9ydAotICAgKgotICAgKiBAcmV0dXJuIFRUcmFuc3BvcnQKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBnZXRUcmFuc3BvcnQoKQotICB7Ci0gICAgcmV0dXJuICR0aGlzLT50cmFuc187Ci0gIH0KLQotICAvKioKLSAgICogV3JpdGVzIHRoZSBtZXNzYWdlIGhlYWRlcgotICAgKgotICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lIEZ1bmN0aW9uIG5hbWUKLSAgICogQHBhcmFtIGludCAkdHlwZSBtZXNzYWdlIHR5cGUgVE1lc3NhZ2VUeXBlOjpDQUxMIG9yIFRNZXNzYWdlVHlwZTo6UkVQTFkKLSAgICogQHBhcmFtIGludCAkc2VxaWQgVGhlIHNlcXVlbmNlIGlkIG9mIHRoaXMgbWVzc2FnZQotICAgKi8KLSAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUJlZ2luKCRuYW1lLCAkdHlwZSwgJHNlcWlkKTsKLQotICAvKioKLSAgICogQ2xvc2UgdGhlIG1lc3NhZ2UKLSAgICovCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VFbmQoKTsKLQotICAvKioKLSAgICogV3JpdGVzIGEgc3RydWN0IGhlYWRlci4KLSAgICoKLSAgICogQHBhcmFtIHN0cmluZyAgICAgJG5hbWUgU3RydWN0IG5hbWUKLSAgICogQHRocm93cyBURXhjZXB0aW9uIG9uIHdyaXRlIGVycm9yCi0gICAqIEByZXR1cm4gaW50IEhvdyBtYW55IGJ5dGVzIHdyaXR0ZW4KLSAgICovCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEJlZ2luKCRuYW1lKTsKLQotICAvKioKLSAgICogQ2xvc2UgYSBzdHJ1Y3QuCi0gICAqCi0gICAqIEB0aHJvd3MgVEV4Y2VwdGlvbiBvbiB3cml0ZSBlcnJvcgotICAgKiBAcmV0dXJuIGludCBIb3cgbWFueSBieXRlcyB3cml0dGVuCi0gICAqLwotICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RFbmQoKTsKLQotICAvKgotICAgKiBTdGFydHMgYSBmaWVsZC4KLSAgICoKLSAgICogQHBhcmFtIHN0cmluZyAgICAgJG5hbWUgRmllbGQgbmFtZQotICAgKiBAcGFyYW0gaW50ICAgICAgICAkdHlwZSBGaWVsZCB0eXBlCi0gICAqIEBwYXJhbSBpbnQgICAgICAgICRmaWQgIEZpZWxkIGlkCi0gICAqIEB0aHJvd3MgVEV4Y2VwdGlvbiBvbiB3cml0ZSBlcnJvcgotICAgKiBAcmV0dXJuIGludCBIb3cgbWFueSBieXRlcyB3cml0dGVuCi0gICAqLwotICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEJlZ2luKCRmaWVsZE5hbWUsICRmaWVsZFR5cGUsICRmaWVsZElkKTsKLQotICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEVuZCgpOwotCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkU3RvcCgpOwotCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEJlZ2luKCRrZXlUeXBlLCAkdmFsVHlwZSwgJHNpemUpOwotCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEVuZCgpOwotCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZUxpc3RCZWdpbigkZWxlbVR5cGUsICRzaXplKTsKLQotICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0RW5kKCk7Ci0KLSAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSk7Ci0KLSAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0RW5kKCk7Ci0KLSAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlQm9vbCgkYm9vbCk7Ci0KLSAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlQnl0ZSgkYnl0ZSk7Ci0KLSAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTE2KCRpMTYpOwotCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkzMigkaTMyKTsKLQotICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJNjQoJGk2NCk7Ci0KLSAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlRG91YmxlKCRkdWIpOwotCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cmluZygkc3RyKTsKLQotICAvKioKLSAgICogUmVhZHMgdGhlIG1lc3NhZ2UgaGVhZGVyCi0gICAqCi0gICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgRnVuY3Rpb24gbmFtZQotICAgKiBAcGFyYW0gaW50ICR0eXBlIG1lc3NhZ2UgdHlwZSBUTWVzc2FnZVR5cGU6OkNBTEwgb3IgVE1lc3NhZ2VUeXBlOjpSRVBMWQotICAgKiBAcGFyZW0gaW50ICRzZXFpZCBUaGUgc2VxdWVuY2UgaWQgb2YgdGhpcyBtZXNzYWdlCi0gICAqLwotICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZE1lc3NhZ2VCZWdpbigmJG5hbWUsICYkdHlwZSwgJiRzZXFpZCk7Ci0KLSAgLyoqCi0gICAqIFJlYWQgdGhlIGNsb3NlIG9mIG1lc3NhZ2UKLSAgICovCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUVuZCgpOwotCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0QmVnaW4oJiRuYW1lKTsKLQotICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cnVjdEVuZCgpOwotCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRCZWdpbigmJG5hbWUsICYkZmllbGRUeXBlLCAmJGZpZWxkSWQpOwotCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRFbmQoKTsKLQotICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEJlZ2luKCYka2V5VHlwZSwgJiR2YWxUeXBlLCAmJHNpemUpOwotCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwRW5kKCk7Ci0KLSAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0QmVnaW4oJiRlbGVtVHlwZSwgJiRzaXplKTsKLQotICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RFbmQoKTsKLQotICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEJlZ2luKCYkZWxlbVR5cGUsICYkc2l6ZSk7Ci0KLSAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRFbmQoKTsKLQotICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZEJvb2woJiRib29sKTsKLQotICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZEJ5dGUoJiRieXRlKTsKLQotICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZEkxNigmJGkxNik7Ci0KLSAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWRJMzIoJiRpMzIpOwotCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkSTY0KCYkaTY0KTsKLQotICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZERvdWJsZSgmJGR1Yik7Ci0KLSAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJpbmcoJiRzdHIpOwotCi0gIC8qKgotICAgKiBUaGUgc2tpcCBmdW5jdGlvbiBpcyBhIHV0aWxpdHkgdG8gcGFyc2Ugb3ZlciB1bnJlY29nbml6ZWQgZGF0ZSB3aXRob3V0Ci0gICAqIGNhdXNpbmcgY29ycnVwdGlvbi4KLSAgICoKLSAgICogQHBhcmFtIFRUeXBlICR0eXBlIFdoYXQgdHlwZSBpcyBpdAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHNraXAoJHR5cGUpCi0gIHsKLSAgICBzd2l0Y2ggKCR0eXBlKSB7Ci0gICAgY2FzZSBUVHlwZTo6Qk9PTDoKLSAgICAgIHJldHVybiAkdGhpcy0+cmVhZEJvb2woJGJvb2wpOwotICAgIGNhc2UgVFR5cGU6OkJZVEU6Ci0gICAgICByZXR1cm4gJHRoaXMtPnJlYWRCeXRlKCRieXRlKTsKLSAgICBjYXNlIFRUeXBlOjpJMTY6Ci0gICAgICByZXR1cm4gJHRoaXMtPnJlYWRJMTYoJGkxNik7Ci0gICAgY2FzZSBUVHlwZTo6STMyOgotICAgICAgcmV0dXJuICR0aGlzLT5yZWFkSTMyKCRpMzIpOwotICAgIGNhc2UgVFR5cGU6Okk2NDoKLSAgICAgIHJldHVybiAkdGhpcy0+cmVhZEk2NCgkaTY0KTsKLSAgICBjYXNlIFRUeXBlOjpET1VCTEU6Ci0gICAgICByZXR1cm4gJHRoaXMtPnJlYWREb3VibGUoJGR1Yik7Ci0gICAgY2FzZSBUVHlwZTo6U1RSSU5HOgotICAgICAgcmV0dXJuICR0aGlzLT5yZWFkU3RyaW5nKCRzdHIpOwotICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKLSAgICAgIHsKLSAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5yZWFkU3RydWN0QmVnaW4oJG5hbWUpOwotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnJlYWRGaWVsZEJlZ2luKCRuYW1lLCAkZnR5cGUsICRmaWQpOwotICAgICAgICAgIGlmICgkZnR5cGUgPT0gVFR5cGU6OlNUT1ApIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5za2lwKCRmdHlwZSk7Ci0gICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZEZpZWxkRW5kKCk7Ci0gICAgICAgIH0KLSAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZFN0cnVjdEVuZCgpOwotCi0gICAgICAgIHJldHVybiAkcmVzdWx0OwotICAgICAgfQotICAgIGNhc2UgVFR5cGU6Ok1BUDoKLSAgICAgIHsKLSAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5yZWFkTWFwQmVnaW4oJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSk7Ci0gICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRzaXplOyAkaSsrKSB7Ci0gICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+c2tpcCgka2V5VHlwZSk7Ci0gICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+c2tpcCgkdmFsVHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZE1hcEVuZCgpOwotCi0gICAgICAgIHJldHVybiAkcmVzdWx0OwotICAgICAgfQotICAgIGNhc2UgVFR5cGU6OlNFVDoKLSAgICAgIHsKLSAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5yZWFkU2V0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSk7Ci0gICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRzaXplOyAkaSsrKSB7Ci0gICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+c2tpcCgkZWxlbVR5cGUpOwotICAgICAgICB9Ci0gICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnJlYWRTZXRFbmQoKTsKLQotICAgICAgICByZXR1cm4gJHJlc3VsdDsKLSAgICAgIH0KLSAgICBjYXNlIFRUeXBlOjpMU1Q6Ci0gICAgICB7Ci0gICAgICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZExpc3RCZWdpbigkZWxlbVR5cGUsICRzaXplKTsKLSAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJHNpemU7ICRpKyspIHsKLSAgICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5za2lwKCRlbGVtVHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZExpc3RFbmQoKTsKLQotICAgICAgICByZXR1cm4gJHJlc3VsdDsKLSAgICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbignVW5rbm93biBmaWVsZCB0eXBlOiAnLiR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFV0aWxpdHkgZm9yIHNraXBwaW5nIGJpbmFyeSBkYXRhCi0gICAqCi0gICAqIEBwYXJhbSBUVHJhbnNwb3J0ICRpdHJhbnMgVFRyYW5zcG9ydCBvYmplY3QKLSAgICogQHBhcmFtIGludCAgICAgICAgJHR5cGUgICBGaWVsZCB0eXBlCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNraXBCaW5hcnkoJGl0cmFucywgJHR5cGUpCi0gIHsKLSAgICBzd2l0Y2ggKCR0eXBlKSB7Ci0gICAgY2FzZSBUVHlwZTo6Qk9PTDoKLSAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDEpOwotICAgIGNhc2UgVFR5cGU6OkJZVEU6Ci0gICAgICByZXR1cm4gJGl0cmFucy0+cmVhZEFsbCgxKTsKLSAgICBjYXNlIFRUeXBlOjpJMTY6Ci0gICAgICByZXR1cm4gJGl0cmFucy0+cmVhZEFsbCgyKTsKLSAgICBjYXNlIFRUeXBlOjpJMzI6Ci0gICAgICByZXR1cm4gJGl0cmFucy0+cmVhZEFsbCg0KTsKLSAgICBjYXNlIFRUeXBlOjpJNjQ6Ci0gICAgICByZXR1cm4gJGl0cmFucy0+cmVhZEFsbCg4KTsKLSAgICBjYXNlIFRUeXBlOjpET1VCTEU6Ci0gICAgICByZXR1cm4gJGl0cmFucy0+cmVhZEFsbCg4KTsKLSAgICBjYXNlIFRUeXBlOjpTVFJJTkc6Ci0gICAgICAkbGVuID0gdW5wYWNrKCdOJywgJGl0cmFucy0+cmVhZEFsbCg0KSk7Ci0gICAgICAkbGVuID0gJGxlblsxXTsKLSAgICAgIGlmICgkbGVuID4gMHg3ZmZmZmZmZikgewotICAgICAgICAkbGVuID0gMCAtICgoJGxlbiAtIDEpIF4gMHhmZmZmZmZmZik7Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiA0ICsgJGl0cmFucy0+cmVhZEFsbCgkbGVuKTsKLSAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6Ci0gICAgICB7Ci0gICAgICAgICRyZXN1bHQgPSAwOwotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICRmdHlwZSA9IDA7Ci0gICAgICAgICAgJGZpZCA9IDA7Ci0gICAgICAgICAgJGRhdGEgPSAkaXRyYW5zLT5yZWFkQWxsKDEpOwotICAgICAgICAgICRhcnIgPSB1bnBhY2soJ2MnLCAkZGF0YSk7Ci0gICAgICAgICAgJGZ0eXBlID0gJGFyclsxXTsKLSAgICAgICAgICBpZiAoJGZ0eXBlID09IFRUeXBlOjpTVE9QKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgLy8gSTE2IGZpZWxkIGlkCi0gICAgICAgICAgJHJlc3VsdCArPSAkaXRyYW5zLT5yZWFkQWxsKDIpOwotICAgICAgICAgICRyZXN1bHQgKz0gc2VsZjo6c2tpcEJpbmFyeSgkaXRyYW5zLCAkZnR5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuICRyZXN1bHQ7Ci0gICAgICB9Ci0gICAgY2FzZSBUVHlwZTo6TUFQOgotICAgICAgewotICAgICAgICAvLyBLdHlwZQotICAgICAgICAkZGF0YSA9ICRpdHJhbnMtPnJlYWRBbGwoMSk7Ci0gICAgICAgICRhcnIgPSB1bnBhY2soJ2MnLCAkZGF0YSk7Ci0gICAgICAgICRrdHlwZSA9ICRhcnJbMV07Ci0gICAgICAgIC8vIFZ0eXBlCi0gICAgICAgICRkYXRhID0gJGl0cmFucy0+cmVhZEFsbCgxKTsKLSAgICAgICAgJGFyciA9IHVucGFjaygnYycsICRkYXRhKTsKLSAgICAgICAgJHZ0eXBlID0gJGFyclsxXTsKLSAgICAgICAgLy8gU2l6ZQotICAgICAgICAkZGF0YSA9ICRpdHJhbnMtPnJlYWRBbGwoNCk7Ci0gICAgICAgICRhcnIgPSB1bnBhY2soJ04nLCAkZGF0YSk7Ci0gICAgICAgICRzaXplID0gJGFyclsxXTsKLSAgICAgICAgaWYgKCRzaXplID4gMHg3ZmZmZmZmZikgewotICAgICAgICAgICRzaXplID0gMCAtICgoJHNpemUgLSAxKSBeIDB4ZmZmZmZmZmYpOwotICAgICAgICB9Ci0gICAgICAgICRyZXN1bHQgPSA2OwotICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkc2l6ZTsgJGkrKykgewotICAgICAgICAgICRyZXN1bHQgKz0gc2VsZjo6c2tpcEJpbmFyeSgkaXRyYW5zLCAka3R5cGUpOwotICAgICAgICAgICRyZXN1bHQgKz0gc2VsZjo6c2tpcEJpbmFyeSgkaXRyYW5zLCAkdnR5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuICRyZXN1bHQ7Ci0gICAgICB9Ci0gICAgY2FzZSBUVHlwZTo6U0VUOgotICAgIGNhc2UgVFR5cGU6OkxTVDoKLSAgICAgIHsKLSAgICAgICAgLy8gVnR5cGUKLSAgICAgICAgJGRhdGEgPSAkaXRyYW5zLT5yZWFkQWxsKDEpOwotICAgICAgICAkYXJyID0gdW5wYWNrKCdjJywgJGRhdGEpOwotICAgICAgICAkdnR5cGUgPSAkYXJyWzFdOwotICAgICAgICAvLyBTaXplCi0gICAgICAgICRkYXRhID0gJGl0cmFucy0+cmVhZEFsbCg0KTsKLSAgICAgICAgJGFyciA9IHVucGFjaygnTicsICRkYXRhKTsKLSAgICAgICAgJHNpemUgPSAkYXJyWzFdOwotICAgICAgICBpZiAoJHNpemUgPiAweDdmZmZmZmZmKSB7Ci0gICAgICAgICAgJHNpemUgPSAwIC0gKCgkc2l6ZSAtIDEpIF4gMHhmZmZmZmZmZik7Ci0gICAgICAgIH0KLSAgICAgICAgJHJlc3VsdCA9IDU7Ci0gICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRzaXplOyAkaSsrKSB7Ci0gICAgICAgICAgJHJlc3VsdCArPSBzZWxmOjpza2lwQmluYXJ5KCRpdHJhbnMsICR2dHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gJHJlc3VsdDsKLSAgICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbignVW5rbm93biBmaWVsZCB0eXBlOiAnLiR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvUHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDhjNGQ1Li4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IucGhwCisrKyAvZGV2L251bGwKQEAgLTEsMjg0ICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2w7Ci11c2UgVGhyaWZ0XEV4Y2VwdGlvblxURXhjZXB0aW9uOwotCi0vKioKLSAqIDxjb2RlPlRQcm90b2NvbERlY29yYXRvcjwvY29kZT4gZm9yd2FyZHMgYWxsIHJlcXVlc3RzIHRvIGFuIGVuY2xvc2VkCi0gKiA8Y29kZT5UUHJvdG9jb2w8L2NvZGU+IGluc3RhbmNlLCBwcm92aWRpbmcgYSB3YXkgdG8gYXV0aG9yIGNvbmNpc2UKLSAqIGNvbmNyZXRlIGRlY29yYXRvciBzdWJjbGFzc2VzLiBXaGlsZSBpdCBoYXMgbm8gYWJzdHJhY3QgbWV0aG9kcywgaXQKLSAqIGlzIG1hcmtlZCBhYnN0cmFjdCBhcyBhIHJlbWluZGVyIHRoYXQgYnkgaXRzZWxmLCBpdCBkb2VzIG5vdCBtb2RpZnkKLSAqIHRoZSBiZWhhdmlvdXIgb2YgdGhlIGVuY2xvc2VkIDxjb2RlPlRQcm90b2NvbDwvY29kZT4uCi0gKgotICogQHBhY2thZ2UgVGhyaWZ0XFByb3RvY29sCi0gKi8KLWFic3RyYWN0IGNsYXNzIFRQcm90b2NvbERlY29yYXRvciBleHRlbmRzIFRQcm90b2NvbAotewotICAgIC8qKgotICAgICAqIEluc3RhbmNlIG9mIHByb3RvY29sLCB0byB3aGljaCBhbGwgb3BlcmF0aW9ucyB3aWxsIGJlIGZvcndhcmRlZC4KLSAgICAgKgotICAgICAqIEB2YXIgVFByb3RvY29sCi0gICAgICovCi0gICAgcHJpdmF0ZSAkY29uY3JldGVQcm90b2NvbF87Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBvZiA8Y29kZT5UUHJvdG9jb2xEZWNvcmF0b3I8L2NvZGU+IGNsYXNzLgotICAgICAqIEVuY2xvc2VzIHRoZSBzcGVjaWZpZWQgcHJvdG9jb2wuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gVFByb3RvY29sICRwcm90b2NvbCBBbGwgb3BlcmF0aW9ucyB3aWxsIGJlIGZvcndhcmQgdG8gdGhpcyBpbnN0YW5jZS4gTXVzdCBiZSBub24tbnVsbC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gX19jb25zdHJ1Y3QoVFByb3RvY29sICRwcm90b2NvbCkKLSAgICB7Ci0gICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJHByb3RvY29sLT5nZXRUcmFuc3BvcnQoKSk7Ci0gICAgICAgICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXyA9ICRwcm90b2NvbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIG1lc3NhZ2UgaGVhZGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIHN0cmluZyAkbmFtZSAgRnVuY3Rpb24gbmFtZQotICAgICAqIEBwYXJhbSBpbnQgICAgJHR5cGUgIG1lc3NhZ2UgdHlwZSBUTWVzc2FnZVR5cGU6OkNBTEwgb3IgVE1lc3NhZ2VUeXBlOjpSRVBMWQotICAgICAqIEBwYXJhbSBpbnQgICAgJHNlcWlkIFRoZSBzZXF1ZW5jZSBpZCBvZiB0aGlzIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlQmVnaW4oJG5hbWUsICR0eXBlLCAkc2VxaWQpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZU1lc3NhZ2VCZWdpbigkbmFtZSwgJHR5cGUsICRzZXFpZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xvc2VzIHRoZSBtZXNzYWdlLgotICAgICAqLwotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VFbmQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVNZXNzYWdlRW5kKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIGEgc3RydWN0IGhlYWRlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgU3RydWN0IG5hbWUKLSAgICAgKgotICAgICAqIEB0aHJvd3MgVEV4Y2VwdGlvbiBvbiB3cml0ZSBlcnJvcgotICAgICAqIEByZXR1cm4gaW50ICAgICAgICBIb3cgbWFueSBieXRlcyB3cml0dGVuCi0gICAgICovCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RydWN0QmVnaW4oJG5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZVN0cnVjdEJlZ2luKCRuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbG9zZSBhIHN0cnVjdC4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgVEV4Y2VwdGlvbiBvbiB3cml0ZSBlcnJvcgotICAgICAqIEByZXR1cm4gaW50ICAgICAgICBIb3cgbWFueSBieXRlcyB3cml0dGVuCi0gICAgICovCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RydWN0RW5kKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlU3RydWN0RW5kKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRCZWdpbigkZmllbGROYW1lLCAkZmllbGRUeXBlLCAkZmllbGRJZCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlRmllbGRCZWdpbigkZmllbGROYW1lLCAkZmllbGRUeXBlLCAkZmllbGRJZCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRFbmQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVGaWVsZEVuZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkU3RvcCgpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZUZpZWxkU3RvcCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEJlZ2luKCRrZXlUeXBlLCAkdmFsVHlwZSwgJHNpemUpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZU1hcEJlZ2luKCRrZXlUeXBlLCAkdmFsVHlwZSwgJHNpemUpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEVuZCgpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZU1hcEVuZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUxpc3RCZWdpbigkZWxlbVR5cGUsICRzaXplKQotICAgIHsKLSAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVMaXN0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEVuZCgpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZUxpc3RFbmQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRCZWdpbigkZWxlbVR5cGUsICRzaXplKQotICAgIHsKLSAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVTZXRCZWdpbigkZWxlbVR5cGUsICRzaXplKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRFbmQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVTZXRFbmQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCb29sKCRib29sKQotICAgIHsKLSAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVCb29sKCRib29sKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCeXRlKCRieXRlKQotICAgIHsKLSAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVCeXRlKCRieXRlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMTYoJGkxNikKLSAgICB7Ci0gICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlSTE2KCRpMTYpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkzMigkaTMyKQotICAgIHsKLSAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVJMzIoJGkzMik7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTY0KCRpNjQpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZUk2NCgkaTY0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVEb3VibGUoJGR1YikKLSAgICB7Ci0gICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlRG91YmxlKCRkdWIpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cmluZygkc3RyKQotICAgIHsKLSAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVTdHJpbmcoJHN0cik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZHMgdGhlIG1lc3NhZ2UgaGVhZGVyCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lICBGdW5jdGlvbiBuYW1lCi0gICAgICogQHBhcmFtIGludCAgICAkdHlwZSAgbWVzc2FnZSB0eXBlIFRNZXNzYWdlVHlwZTo6Q0FMTCBvciBUTWVzc2FnZVR5cGU6OlJFUExZCi0gICAgICogQHBhcmFtIGludCAgICAkc2VxaWQgVGhlIHNlcXVlbmNlIGlkIG9mIHRoaXMgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUJlZ2luKCYkbmFtZSwgJiR0eXBlLCAmJHNlcWlkKQotICAgIHsKLSAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZE1lc3NhZ2VCZWdpbigkbmFtZSwgJHR5cGUsICRzZXFpZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZCB0aGUgY2xvc2Ugb2YgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUVuZCgpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkTWVzc2FnZUVuZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0QmVnaW4oJiRuYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZFN0cnVjdEJlZ2luKCRuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cnVjdEVuZCgpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkU3RydWN0RW5kKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRGaWVsZEJlZ2luKCYkbmFtZSwgJiRmaWVsZFR5cGUsICYkZmllbGRJZCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRGaWVsZEJlZ2luKCRuYW1lLCAkZmllbGRUeXBlLCAkZmllbGRJZCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRGaWVsZEVuZCgpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkRmllbGRFbmQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEJlZ2luKCYka2V5VHlwZSwgJiR2YWxUeXBlLCAmJHNpemUpCi0gICAgewotICAgICAgICAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRNYXBCZWdpbigka2V5VHlwZSwgJHZhbFR5cGUsICRzaXplKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEVuZCgpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkTWFwRW5kKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0QmVnaW4oJiRlbGVtVHlwZSwgJiRzaXplKQotICAgIHsKLSAgICAgICAgJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkTGlzdEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEVuZCgpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkTGlzdEVuZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU2V0QmVnaW4oJiRlbGVtVHlwZSwgJiRzaXplKQotICAgIHsKLSAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZFNldEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU2V0RW5kKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRTZXRFbmQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJvb2woJiRib29sKQotICAgIHsKLSAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZEJvb2woJGJvb2wpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQnl0ZSgmJGJ5dGUpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkQnl0ZSgkYnl0ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJMTYoJiRpMTYpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkSTE2KCRpMTYpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTMyKCYkaTMyKQotICAgIHsKLSAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZEkzMigkaTMyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEk2NCgmJGk2NCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRJNjQoJGk2NCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWREb3VibGUoJiRkdWIpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkRG91YmxlKCRkdWIpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RyaW5nKCYkc3RyKQotICAgIHsKLSAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZFN0cmluZygkc3RyKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvU2VyaWFsaXplci9UQmluYXJ5U2VyaWFsaXplci5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvU2VyaWFsaXplci9UQmluYXJ5U2VyaWFsaXplci5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMGNmOGIuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L1NlcmlhbGl6ZXIvVEJpbmFyeVNlcmlhbGl6ZXIucGhwCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCi0gKiBAYXV0aG9yOiBybWFyaW4gKG1hcmluLnJhZHVAZmFjZWJvb2suY29tKQotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcU2VyaWFsaXplcjsKLQotdXNlIFRocmlmdFxUcmFuc3BvcnRcVE1lbW9yeUJ1ZmZlcjsKLXVzZSBUaHJpZnRcUHJvdG9jb2xcVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQ7Ci11c2UgVGhyaWZ0XFR5cGVcVE1lc3NhZ2VUeXBlOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIHNlcmlhbGl6aW5nIGFuZCBkZXNlcmlhbGl6aW5nCi0gKiBhIHRocmlmdCBvYmplY3QgdXNpbmcgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQuCi0gKi8KLWNsYXNzIFRCaW5hcnlTZXJpYWxpemVyCi17Ci0gIC8vIE5PVEUocm1hcmluKTogQmVjYXVzZSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5Ci0gIC8vIGFkZHMgYSBiZWdpbiBtZXNzYWdlIHByZWZpeCwgeW91IGNhbm5vdCBzcGVjaWZ5Ci0gIC8vIGEgdHJhbnNwb3J0IGluIHdoaWNoIHRvIHNlcmlhbGl6ZSBhbiBvYmplY3QuIEl0IGhhcyB0bwotICAvLyBiZSBhIHN0cmluZy4gT3RoZXJ3aXNlIHdlIHdpbGwgYnJlYWsgdGhlIGNvbXBhdGliaWxpdHkgd2l0aAotICAvLyBub3JtYWwgZGVzZXJpYWxpemF0aW9uLgotICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNlcmlhbGl6ZSgkb2JqZWN0KQotICB7Ci0gICAgJHRyYW5zcG9ydCA9IG5ldyBUTWVtb3J5QnVmZmVyKCk7Ci0gICAgJHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKCR0cmFuc3BvcnQpOwotICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ3RocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnknKSkgewotICAgICAgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSgkcHJvdG9jb2wsICRvYmplY3QtPmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE1lc3NhZ2VUeXBlOjpSRVBMWSwgJG9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgJHByb3RvY29sLT5pc1N0cmljdFdyaXRlKCkpOwotCi0gICAgICAkcHJvdG9jb2wtPnJlYWRNZXNzYWdlQmVnaW4oJHVudXNlZF9uYW1lLCAkdW51c2VkX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHVudXNlZF9zZXFpZCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICRvYmplY3QtPndyaXRlKCRwcm90b2NvbCk7Ci0gICAgfQotICAgICRwcm90b2NvbC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7Ci0KLSAgICByZXR1cm4gJHRyYW5zcG9ydC0+Z2V0QnVmZmVyKCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGRlc2VyaWFsaXplKCRzdHJpbmdfb2JqZWN0LCAkY2xhc3NfbmFtZSkKLSAgewotICAgICAkdHJhbnNwb3J0ID0gbmV3IFRNZW1vcnlCdWZmZXIoKTsKLSAgICAgJHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKCR0cmFuc3BvcnQpOwotICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCd0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnknKSkgewotICAgICAgIC8vIE5PVEUgKHQuaGVpbnR6KSBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBpbnRlcm5hbGx5IHdyYXBzIG91ciBUTWVtb3J5QnVmZmVyIGluIGEKLSAgICAgICAvLyBUQnVmZmVyZWRUcmFuc3BvcnQsIHNvIHdlIGhhdmUgdG8gcmV0cmlldmUgaXQgYWdhaW4gb3IgcmlzayBsb3NpbmcgZGF0YSB3aGVuIHdyaXRpbmcKLSAgICAgICAvLyBsZXNzIHRoYW4gNTEyIGJ5dGVzIHRvIHRoZSB0cmFuc3BvcnQgKHNlZSB0aGUgY29tbWVudCB0aGVyZSBhcyB3ZWxsKS4KLSAgICAgICAvLyBAc2VlIFRIUklGVC0xNTc5Ci0gICAgICAgJHByb3RvY29sLT53cml0ZU1lc3NhZ2VCZWdpbignJywgVE1lc3NhZ2VUeXBlOjpSRVBMWSwgMCk7Ci0gICAgICAgJHByb3RvY29sVHJhbnNwb3J0ID0gJHByb3RvY29sLT5nZXRUcmFuc3BvcnQoKTsKLSAgICAgICAkcHJvdG9jb2xUcmFuc3BvcnQtPndyaXRlKCRzdHJpbmdfb2JqZWN0KTsKLSAgICAgICAkcHJvdG9jb2xUcmFuc3BvcnQtPmZsdXNoKCk7Ci0KLSAgICAgICByZXR1cm4gdGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5KCRwcm90b2NvbCwgJGNsYXNzX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcHJvdG9jb2wtPmlzU3RyaWN0UmVhZCgpKTsKLSAgICAgfSBlbHNlIHsKLSAgICAgICAkdHJhbnNwb3J0LT53cml0ZSgkc3RyaW5nX29iamVjdCk7Ci0gICAgICAgJG9iamVjdCA9IG5ldyAkY2xhc3NfbmFtZSgpOwotICAgICAgICRvYmplY3QtPnJlYWQoJHByb3RvY29sKTsKLQotICAgICAgIHJldHVybiAkb2JqZWN0OwotICAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9TZXJ2ZXIvVEZvcmtpbmdTZXJ2ZXIucGhwIGIvbGliL3BocC9saWIvVGhyaWZ0L1NlcnZlci9URm9ya2luZ1NlcnZlci5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNmU1NDEuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L1NlcnZlci9URm9ya2luZ1NlcnZlci5waHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotPD9waHAKLQotbmFtZXNwYWNlIFRocmlmdFxTZXJ2ZXI7Ci0KLXVzZSBUaHJpZnRcVHJhbnNwb3J0XFRUcmFuc3BvcnQ7Ci11c2UgVGhyaWZ0XEV4Y2VwdGlvblxURXhjZXB0aW9uOwotdXNlIFRocmlmdFxFeGNlcHRpb25cVFRyYW5zcG9ydEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBBIGZvcmtpbmcgaW1wbGVtZW50YXRpb24gb2YgYSBUaHJpZnQgc2VydmVyLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC5zZXJ2ZXIKLSAqLwotY2xhc3MgVEZvcmtpbmdTZXJ2ZXIgZXh0ZW5kcyBUU2VydmVyCi17Ci0gIC8qKgotICAgKiBGbGFnIGZvciB0aGUgbWFpbiBzZXJ2aW5nIGxvb3AKLSAgICoKLSAgICogQHZhciBib29sCi0gICAqLwotICBwcml2YXRlICRzdG9wXyA9IGZhbHNlOwotCi0gIC8qKgotICAgKiBMaXN0IG9mIGNoaWxkcmVuLgotICAgKgotICAgKiBAdmFyIGFycmF5Ci0gICAqLwotICBwcm90ZWN0ZWQgJGNoaWxkcmVuXyA9IGFycmF5KCk7Ci0KLSAgLyoqCi0gICAqIExpc3RlbnMgZm9yIG5ldyBjbGllbnQgdXNpbmcgdGhlIHN1cHBsaWVkCi0gICAqIHRyYW5zcG9ydC4gV2UgZm9yayB3aGVuIGEgbmV3IGNvbm5lY3Rpb24KLSAgICogYXJyaXZlcy4KLSAgICoKLSAgICogQHJldHVybiB2b2lkCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gc2VydmUoKQotICB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydF8tPmxpc3RlbigpOwotCi0gICAgd2hpbGUgKCEkdGhpcy0+c3RvcF8pIHsKLSAgICAgIHRyeSB7Ci0gICAgICAgICR0cmFuc3BvcnQgPSAkdGhpcy0+dHJhbnNwb3J0Xy0+YWNjZXB0KCk7Ci0KLSAgICAgICAgaWYgKCR0cmFuc3BvcnQgIT0gbnVsbCkgewotICAgICAgICAgICRwaWQgPSBwY250bF9mb3JrKCk7Ci0KLSAgICAgICAgICBpZiAoJHBpZCA+IDApIHsKLSAgICAgICAgICAgICR0aGlzLT5oYW5kbGVQYXJlbnQoJHRyYW5zcG9ydCwgJHBpZCk7Ci0gICAgICAgICAgfSBlbHNlaWYgKCRwaWQgPT09IDApIHsKLSAgICAgICAgICAgICR0aGlzLT5oYW5kbGVDaGlsZCgkdHJhbnNwb3J0KTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oJ0ZhaWxlZCB0byBmb3JrJyk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uICRlKSB7IH0KLQotICAgICAgJHRoaXMtPmNvbGxlY3RDaGlsZHJlbigpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBDb2RlIHJ1biBieSB0aGUgcGFyZW50Ci0gICAqCi0gICAqIEBwYXJhbSBUVHJhbnNwb3J0ICR0cmFuc3BvcnQKLSAgICogQHBhcmFtIGludCAkcGlkCi0gICAqIEByZXR1cm4gdm9pZAotICAgKi8KLSAgcHJpdmF0ZSBmdW5jdGlvbiBoYW5kbGVQYXJlbnQoVFRyYW5zcG9ydCAkdHJhbnNwb3J0LCAkcGlkKQotICB7Ci0gICAgJHRoaXMtPmNoaWxkcmVuX1skcGlkXSA9ICR0cmFuc3BvcnQ7Ci0gIH0KLQotICAvKioKLSAgICogQ29kZSBydW4gYnkgdGhlIGNoaWxkLgotICAgKgotICAgKiBAcGFyYW0gVFRyYW5zcG9ydCAkdHJhbnNwb3J0Ci0gICAqIEByZXR1cm4gdm9pZAotICAgKi8KLSAgcHJpdmF0ZSBmdW5jdGlvbiBoYW5kbGVDaGlsZChUVHJhbnNwb3J0ICR0cmFuc3BvcnQpCi0gIHsKLSAgICB0cnkgewotICAgICAgJGlucHV0VHJhbnNwb3J0ID0gJHRoaXMtPmlucHV0VHJhbnNwb3J0RmFjdG9yeV8tPmdldFRyYW5zcG9ydCgkdHJhbnNwb3J0KTsKLSAgICAgICRvdXRwdXRUcmFuc3BvcnQgPSAkdGhpcy0+b3V0cHV0VHJhbnNwb3J0RmFjdG9yeV8tPmdldFRyYW5zcG9ydCgkdHJhbnNwb3J0KTsKLSAgICAgICRpbnB1dFByb3RvY29sID0gJHRoaXMtPmlucHV0UHJvdG9jb2xGYWN0b3J5Xy0+Z2V0UHJvdG9jb2woJGlucHV0VHJhbnNwb3J0KTsKLSAgICAgICRvdXRwdXRQcm90b2NvbCA9ICR0aGlzLT5vdXRwdXRQcm90b2NvbEZhY3RvcnlfLT5nZXRQcm90b2NvbCgkb3V0cHV0VHJhbnNwb3J0KTsKLSAgICAgIHdoaWxlICgkdGhpcy0+cHJvY2Vzc29yXy0+cHJvY2VzcygkaW5wdXRQcm90b2NvbCwgJG91dHB1dFByb3RvY29sKSkgeyB9Ci0gICAgICBAJHRyYW5zcG9ydC0+Y2xvc2UoKTsKLSAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uICRlKSB7IH0KLQotICAgIGV4aXQoMCk7Ci0gIH0KLQotICAvKioKLSAgICogQ29sbGVjdHMgYW55IGNoaWxkcmVuIHdlIG1heSBoYXZlCi0gICAqCi0gICAqIEByZXR1cm4gdm9pZAotICAgKi8KLSAgcHJpdmF0ZSBmdW5jdGlvbiBjb2xsZWN0Q2hpbGRyZW4oKQotICB7Ci0gICAgZm9yZWFjaCAoJHRoaXMtPmNoaWxkcmVuXyBhcyAkcGlkID0+ICR0cmFuc3BvcnQpIHsKLSAgICAgIGlmIChwY250bF93YWl0cGlkKCRwaWQsICRzdGF0dXMsIFdOT0hBTkcpID4gMCkgewotICAgICAgICB1bnNldCgkdGhpcy0+Y2hpbGRyZW5fWyRwaWRdKTsKLSAgICAgICAgaWYgKCR0cmFuc3BvcnQpIEAkdHJhbnNwb3J0LT5jbG9zZSgpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBTdG9wcyB0aGUgc2VydmVyIHJ1bm5pbmcuIEtpbGxzIHRoZSB0cmFuc3BvcnQKLSAgICogYW5kIHRoZW4gc3RvcHMgdGhlIG1haW4gc2VydmluZyBsb29wCi0gICAqCi0gICAqIEByZXR1cm4gdm9pZAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHN0b3AoKQotICB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydF8tPmNsb3NlKCk7Ci0gICAgJHRoaXMtPnN0b3BfID0gdHJ1ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L1NlcnZlci9UU2VydmVyLnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9TZXJ2ZXIvVFNlcnZlci5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ZDc2Y2MuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L1NlcnZlci9UU2VydmVyLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi08P3BocAotCi1uYW1lc3BhY2UgVGhyaWZ0XFNlcnZlcjsKLQotdXNlIFRocmlmdFxGYWN0b3J5XFRUcmFuc3BvcnRGYWN0b3J5OwotdXNlIFRocmlmdFxGYWN0b3J5XFRQcm90b2NvbEZhY3Rvcnk7Ci0KLS8qKgotICogR2VuZXJpYyBjbGFzcyBmb3IgYSBUaHJpZnQgc2VydmVyLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC5zZXJ2ZXIKLSAqLwotYWJzdHJhY3QgY2xhc3MgVFNlcnZlcgotewotICAvKioKLSAgICogUHJvY2Vzc29yIHRvIGhhbmRsZSBuZXcgY2xpZW50cwotICAgKgotICAgKiBAdmFyIFRQcm9jZXNzb3IKLSAgICovCi0gIHByb3RlY3RlZCAkcHJvY2Vzc29yXzsKLQotICAvKioKLSAgICogU2VydmVyIHRyYW5zcG9ydCB0byBiZSB1c2VkIGZvciBsaXN0ZW5pbmcKLSAgICogYW5kIGFjY2VwdGluZyBuZXcgY2xpZW50cwotICAgKgotICAgKiBAdmFyIFRTZXJ2ZXJUcmFuc3BvcnQKLSAgICovCi0gIHByb3RlY3RlZCAkdHJhbnNwb3J0XzsKLQotICAvKioKLSAgICogSW5wdXQgdHJhbnNwb3J0IGZhY3RvcnkKLSAgICoKLSAgICogQHZhciBUVHJhbnNwb3J0RmFjdG9yeQotICAgKi8KLSAgcHJvdGVjdGVkICRpbnB1dFRyYW5zcG9ydEZhY3RvcnlfOwotCi0gIC8qKgotICAgKiBPdXRwdXQgdHJhbnNwb3J0IGZhY3RvcnkKLSAgICoKLSAgICogQHZhciBUVHJhbnNwb3J0RmFjdG9yeQotICAgKi8KLSAgcHJvdGVjdGVkICRvdXRwdXRUcmFuc3BvcnRGYWN0b3J5XzsKLQotICAvKioKLSAgICogSW5wdXQgcHJvdG9jb2wgZmFjdG9yeQotICAgKgotICAgKiBAdmFyIFRQcm90b2NvbEZhY3RvcnkKLSAgICovCi0gIHByb3RlY3RlZCAkaW5wdXRQcm90b2NvbEZhY3RvcnlfOwotCi0gIC8qKgotICAgKiBPdXRwdXQgcHJvdG9jb2wgZmFjdG9yeQotICAgKgotICAgKiBAdmFyIFRQcm90b2NvbEZhY3RvcnkKLSAgICovCi0gIHByb3RlY3RlZCAkb3V0cHV0UHJvdG9jb2xGYWN0b3J5XzsKLQotICAvKioKLSAgICogU2V0cyB1cCBhbGwgdGhlIGZhY3RvcmllcywgZXRjCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgJHByb2Nlc3NvcgotICAgKiBAcGFyYW0gVFNlcnZlclRyYW5zcG9ydCAkdHJhbnNwb3J0Ci0gICAqIEBwYXJhbSBUVHJhbnNwb3J0RmFjdG9yeSAkaW5wdXRUcmFuc3BvcnRGYWN0b3J5Ci0gICAqIEBwYXJhbSBUVHJhbnNwb3J0RmFjdG9yeSAkb3V0cHV0VHJhbnNwb3J0RmFjdG9yeQotICAgKiBAcGFyYW0gVFByb3RvY29sRmFjdG9yeSAkaW5wdXRQcm90b2NvbEZhY3RvcnkKLSAgICogQHBhcmFtIFRQcm90b2NvbEZhY3RvcnkgJG91dHB1dFByb3RvY29sRmFjdG9yeQotICAgKiBAcmV0dXJuIHZvaWQKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCAkdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgJGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5ICRvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSAkaW5wdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5ICRvdXRwdXRQcm90b2NvbEZhY3RvcnkpIHsKLSAgICAkdGhpcy0+cHJvY2Vzc29yXyA9ICRwcm9jZXNzb3I7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydF8gPSAkdHJhbnNwb3J0OwotICAgICR0aGlzLT5pbnB1dFRyYW5zcG9ydEZhY3RvcnlfID0gJGlucHV0VHJhbnNwb3J0RmFjdG9yeTsKLSAgICAkdGhpcy0+b3V0cHV0VHJhbnNwb3J0RmFjdG9yeV8gPSAkb3V0cHV0VHJhbnNwb3J0RmFjdG9yeTsKLSAgICAkdGhpcy0+aW5wdXRQcm90b2NvbEZhY3RvcnlfID0gJGlucHV0UHJvdG9jb2xGYWN0b3J5OwotICAgICR0aGlzLT5vdXRwdXRQcm90b2NvbEZhY3RvcnlfID0gJG91dHB1dFByb3RvY29sRmFjdG9yeTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXJ2ZXMgdGhlIHNlcnZlci4gVGhpcyBzaG91bGQgbmV2ZXIgcmV0dXJuCi0gICAqIHVubGVzcyBhIHByb2JsZW0gcGVybWl0cyBpdCB0byBkbyBzbyBvciBpdAotICAgKiBpcyBpbnRlcnJ1cHRlZCBpbnRlbnRpb25hbGx5Ci0gICAqCi0gICAqIEBhYnN0cmFjdAotICAgKiBAcmV0dXJuIHZvaWQKLSAgICovCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBzZXJ2ZSgpOwotCi0gIC8qKgotICAgKiBTdG9wcyB0aGUgc2VydmVyIHNlcnZpbmcKLSAgICoKLSAgICogQGFic3RyYWN0Ci0gICAqIEByZXR1cm4gdm9pZAotICAgKi8KLSAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHN0b3AoKTsKLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9TZXJ2ZXIvVFNlcnZlclNvY2tldC5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvU2VydmVyL1RTZXJ2ZXJTb2NrZXQucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWZmMjljLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9TZXJ2ZXIvVFNlcnZlclNvY2tldC5waHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotPD9waHAKLQotbmFtZXNwYWNlIFRocmlmdFxTZXJ2ZXI7Ci0KLXVzZSBUaHJpZnRcVHJhbnNwb3J0XFRTb2NrZXQ7Ci0KLS8qKgotICogU29ja2V0IGltcGxlbWVudGF0aW9uIG9mIGEgc2VydmVyIGFnZW50LgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotY2xhc3MgVFNlcnZlclNvY2tldCBleHRlbmRzIFRTZXJ2ZXJUcmFuc3BvcnQKLXsKLSAgLyoqCi0gICAqIEhhbmRsZSBmb3IgdGhlIGxpc3RlbmVyIHNvY2tldAotICAgKgotICAgKiBAdmFyIHJlc291cmNlCi0gICAqLwotICBwcml2YXRlICRsaXN0ZW5lcl87Ci0KLSAgLyoqCi0gICAqIFBvcnQgZm9yIHRoZSBsaXN0ZW5lciB0byBsaXN0ZW4gb24KLSAgICoKLSAgICogQHZhciBpbnQKLSAgICovCi0gIHByaXZhdGUgJHBvcnRfOwotCi0gIC8qKgotICAgKiBUaW1lb3V0IHdoZW4gbGlzdGVuaW5nIGZvciBhIG5ldyBjbGllbnQKLSAgICoKLSAgICogQHZhciBpbnQKLSAgICovCi0gIHByaXZhdGUgJGFjY2VwdFRpbWVvdXRfID0gMzAwMDA7Ci0KLSAgLyoqCi0gICAqIEhvc3QgdG8gbGlzdGVuIG9uCi0gICAqCi0gICAqIEB2YXIgc3RyaW5nCi0gICAqLwotICBwcml2YXRlICRob3N0XzsKLQotICAvKioKLSAgICogU2VydmVyU29ja2V0IGNvbnN0cnVjdG9yCi0gICAqCi0gICAqIEBwYXJhbSBzdHJpbmcgJGhvc3QgICAgICAgIEhvc3QgdG8gbGlzdGVuIG9uCi0gICAqIEBwYXJhbSBpbnQgJHBvcnQgICAgICAgICAgIFBvcnQgdG8gbGlzdGVuIG9uCi0gICAqIEByZXR1cm4gdm9pZAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRob3N0ID0gJ2xvY2FsaG9zdCcsICRwb3J0ID0gOTA5MCkKLSAgewotICAgICR0aGlzLT5ob3N0XyA9ICRob3N0OwotICAgICR0aGlzLT5wb3J0XyA9ICRwb3J0OwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGFjY2VwdCB0aW1lb3V0Ci0gICAqCi0gICAqIEBwYXJhbSBpbnQgJGFjY2VwdFRpbWVvdXQKLSAgICogQHJldHVybiB2b2lkCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gc2V0QWNjZXB0VGltZW91dCgkYWNjZXB0VGltZW91dCkKLSAgewotICAgICR0aGlzLT5hY2NlcHRUaW1lb3V0XyA9ICRhY2NlcHRUaW1lb3V0OwotICB9Ci0KLSAgLyoqCi0gICAqIE9wZW5zIGEgbmV3IHNvY2tldCBzZXJ2ZXIgaGFuZGxlCi0gICAqCi0gICAqIEByZXR1cm4gdm9pZAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIGxpc3RlbigpCi0gIHsKLSAgICAkdGhpcy0+bGlzdGVuZXJfID0gc3RyZWFtX3NvY2tldF9zZXJ2ZXIoJ3RjcDovLycgLiAkdGhpcy0+aG9zdF8gLiAnOicgLiAkdGhpcy0+cG9ydF8pOwotICB9Ci0KLSAgLyoqCi0gICAqIENsb3NlcyB0aGUgc29ja2V0IHNlcnZlciBoYW5kbGUKLSAgICoKLSAgICogQHJldHVybiB2b2lkCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKQotICB7Ci0gICAgQGZjbG9zZSgkdGhpcy0+bGlzdGVuZXJfKTsKLSAgICAkdGhpcy0+bGlzdGVuZXJfID0gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBhY2NlcHQuIElmIG5vdCBjbGllbnQgaXMgYWNjZXB0ZWQgaW4gdGhlIGdpdmVuIHRpbWUKLSAgICoKLSAgICogQHJldHVybiBUU29ja2V0Ci0gICAqLwotICBwcm90ZWN0ZWQgZnVuY3Rpb24gYWNjZXB0SW1wbCgpCi0gIHsKLSAgICAkaGFuZGxlID0gQHN0cmVhbV9zb2NrZXRfYWNjZXB0KCR0aGlzLT5saXN0ZW5lcl8sICR0aGlzLT5hY2NlcHRUaW1lb3V0XyAvIDEwMDAuMCk7Ci0gICAgaWYoISRoYW5kbGUpIHJldHVybiBudWxsOwotCi0gICAgJHNvY2tldCA9IG5ldyBUU29ja2V0KCk7Ci0gICAgJHNvY2tldC0+c2V0SGFuZGxlKCRoYW5kbGUpOwotCi0gICAgcmV0dXJuICRzb2NrZXQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9TZXJ2ZXIvVFNlcnZlclRyYW5zcG9ydC5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvU2VydmVyL1RTZXJ2ZXJUcmFuc3BvcnQucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODJkMDZkLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9TZXJ2ZXIvVFNlcnZlclRyYW5zcG9ydC5waHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi08P3BocAotCi1uYW1lc3BhY2UgVGhyaWZ0XFNlcnZlcjsKLQotdXNlIFRocmlmdFxFeGNlcHRpb25cVFRyYW5zcG9ydEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBHZW5lcmljIGNsYXNzIGZvciBTZXJ2ZXIgYWdlbnQuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi1hYnN0cmFjdCBjbGFzcyBUU2VydmVyVHJhbnNwb3J0Ci17Ci0gIC8qKgotICAgKiBMaXN0IGZvciBuZXcgY2xpZW50cwotICAgKgotICAgKiBAYWJzdHJhY3QKLSAgICogQHJldHVybiB2b2lkCi0gICAqLwotICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gbGlzdGVuKCk7Ci0KLSAgLyoqCi0gICAqIENsb3NlIHRoZSBzZXJ2ZXIKLSAgICoKLSAgICogQGFic3RyYWN0Ci0gICAqIEByZXR1cm4gdm9pZAotICAgKi8KLSAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCk7Ci0KLSAgLyoqCi0gICAqIFN1YmNsYXNzZXMgc2hvdWxkIHVzZSB0aGlzIHRvIGltcGxlbWVudAotICAgKiBhY2NlcHQuCi0gICAqCi0gICAqIEBhYnN0cmFjdAotICAgKiBAcmV0dXJuIFRUcmFuc3BvcnQKLSAgICovCi0gIGFic3RyYWN0IHByb3RlY3RlZCBmdW5jdGlvbiBhY2NlcHRJbXBsKCk7Ci0KLSAgLyoqCi0gICAqIFVzZXMgdGhlIGFjY2VwdCBpbXBsZW10YXRpb24uIElmIG51bGwgaXMgcmV0dXJuZWQsIGFuCi0gICAqIGV4Y2VwdGlvbiBpcyB0aHJvd24uCi0gICAqCi0gICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbgotICAgKiBAcmV0dXJuIFRUcmFuc3BvcnQKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoKQotICB7Ci0gICAgJHRyYW5zcG9ydCA9ICR0aGlzLT5hY2NlcHRJbXBsKCk7Ci0KLSAgICBpZiAoJHRyYW5zcG9ydCA9PSBudWxsKSB7Ci0gICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiYWNjZXB0KCkgbWF5IG5vdCByZXR1cm4gTlVMTCIpOwotICAgIH0KLQotICAgIHJldHVybiAkdHJhbnNwb3J0OwotICB9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvU2VydmVyL1RTaW1wbGVTZXJ2ZXIucGhwIGIvbGliL3BocC9saWIvVGhyaWZ0L1NlcnZlci9UU2ltcGxlU2VydmVyLnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI3NzcwMC4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvU2VydmVyL1RTaW1wbGVTZXJ2ZXIucGhwCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotPD9waHAKLQotbmFtZXNwYWNlIFRocmlmdFxTZXJ2ZXI7Ci0KLXVzZSBUaHJpZnRcRXhjZXB0aW9uXFRUcmFuc3BvcnRFeGNlcHRpb247Ci0KLS8qKgotICogU2ltcGxlIGltcGxlbXRhdGlvbiBvZiBhIFRocmlmdCBzZXJ2ZXIuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnNlcnZlcgotICovCi1jbGFzcyBUU2ltcGxlU2VydmVyIGV4dGVuZHMgVFNlcnZlcgotewotICAvKioKLSAgICogRmxhZyBmb3IgdGhlIG1haW4gc2VydmluZyBsb29wCi0gICAqCi0gICAqIEB2YXIgYm9vbAotICAgKi8KLSAgcHJpdmF0ZSAkc3RvcF8gPSBmYWxzZTsKLQotICAvKioKLSAgICogTGlzdGVucyBmb3IgbmV3IGNsaWVudCB1c2luZyB0aGUgc3VwcGxpZWQKLSAgICogdHJhbnNwb3J0LiBJdCBoYW5kbGVzIFRUcmFuc3BvcnRFeGNlcHRpb25zCi0gICAqIHRvIGF2b2lkIHRpbWVvdXRzIGV0YyBraWxsaW5nIGl0Ci0gICAqCi0gICAqIEByZXR1cm4gdm9pZAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHNlcnZlKCkKLSAgewotICAgICR0aGlzLT50cmFuc3BvcnRfLT5saXN0ZW4oKTsKLQotICAgIHdoaWxlICghJHRoaXMtPnN0b3BfKSB7Ci0gICAgICB0cnkgewotICAgICAgICAkdHJhbnNwb3J0ID0gJHRoaXMtPnRyYW5zcG9ydF8tPmFjY2VwdCgpOwotCi0gICAgICAgIGlmICgkdHJhbnNwb3J0ICE9IG51bGwpIHsKLSAgICAgICAgICAkaW5wdXRUcmFuc3BvcnQgPSAkdGhpcy0+aW5wdXRUcmFuc3BvcnRGYWN0b3J5Xy0+Z2V0VHJhbnNwb3J0KCR0cmFuc3BvcnQpOwotICAgICAgICAgICRvdXRwdXRUcmFuc3BvcnQgPSAkdGhpcy0+b3V0cHV0VHJhbnNwb3J0RmFjdG9yeV8tPmdldFRyYW5zcG9ydCgkdHJhbnNwb3J0KTsKLSAgICAgICAgICAkaW5wdXRQcm90b2NvbCA9ICR0aGlzLT5pbnB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKCRpbnB1dFRyYW5zcG9ydCk7Ci0gICAgICAgICAgJG91dHB1dFByb3RvY29sID0gJHRoaXMtPm91dHB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKCRvdXRwdXRUcmFuc3BvcnQpOwotICAgICAgICAgIHdoaWxlICgkdGhpcy0+cHJvY2Vzc29yXy0+cHJvY2VzcygkaW5wdXRQcm90b2NvbCwgJG91dHB1dFByb3RvY29sKSkgeyB9Ci0gICAgICAgIH0KLSAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gJGUpIHsgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBTdG9wcyB0aGUgc2VydmVyIHJ1bm5pbmcuIEtpbGxzIHRoZSB0cmFuc3BvcnQKLSAgICogYW5kIHRoZW4gc3RvcHMgdGhlIG1haW4gc2VydmluZyBsb29wCi0gICAqCi0gICAqIEByZXR1cm4gdm9pZAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHN0b3AoKQotICB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydF8tPmNsb3NlKCk7Ci0gICAgJHRoaXMtPnN0b3BfID0gdHJ1ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvVE11bHRpcGxleGVkUHJvY2Vzc29yLnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM4Zjk1Yi4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvVE11bHRpcGxleGVkUHJvY2Vzc29yLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQucHJvY2Vzc29yCi0gKi8KLQotbmFtZXNwYWNlIFRocmlmdDsKLQotdXNlIFRocmlmdFxFeGNlcHRpb25cVEV4Y2VwdGlvbjsKLXVzZSBUaHJpZnRcUHJvdG9jb2xcVFByb3RvY29sOwotdXNlIFRocmlmdFxQcm90b2NvbFxUTXVsdGlwbGV4ZWRQcm90b2NvbDsKLXVzZSBUaHJpZnRcUHJvdG9jb2xcVFByb3RvY29sRGVjb3JhdG9yOwotdXNlIFRocmlmdFxUeXBlXFRNZXNzYWdlVHlwZTsKLQotLyoqCi0gKiA8Y29kZT5UTXVsdGlwbGV4ZWRQcm9jZXNzb3I8L2NvZGU+IGlzIGEgUHJvY2Vzc29yIGFsbG93aW5nCi0gKiBhIHNpbmdsZSA8Y29kZT5UU2VydmVyPC9jb2RlPiB0byBwcm92aWRlIG11bHRpcGxlIHNlcnZpY2VzLgotICoKLSAqIDxwPlRvIGRvIHNvLCB5b3UgaW5zdGFudGlhdGUgdGhlIHByb2Nlc3NvciBhbmQgdGhlbiByZWdpc3RlciBhZGRpdGlvbmFsCi0gKiBwcm9jZXNzb3JzIHdpdGggaXQsIGFzIHNob3duIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZTo8L3A+Ci0gKgotICogPGJsb2NrcXVvdGU+PGNvZGU+Ci0gKiAgICAgJHByb2Nlc3NvciA9IG5ldyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IoKTsKLSAqCi0gKiAgICAgcHJvY2Vzc29yLT5yZWdpc3RlclByb2Nlc3NvcigKLSAqICAgICAgICAgIkNhbGN1bGF0b3IiLAotICogICAgICAgICBuZXcgXHR1dG9yaWFsXENhbGN1bGF0b3JQcm9jZXNzb3IobmV3IENhbGN1bGF0b3JIYW5kbGVyKCkpKTsKLSAqCi0gKiAgICAgcHJvY2Vzc29yLT5yZWdpc3RlclByb2Nlc3NvcigKLSAqICAgICAgICAgIldlYXRoZXJSZXBvcnQiLAotICogICAgICAgICBuZXcgXHR1dG9yaWFsXFdlYXRoZXJSZXBvcnRQcm9jZXNzb3IobmV3IFdlYXRoZXJSZXBvcnRIYW5kbGVyKCkpKTsKLSAqCi0gKiAgICAgJHByb2Nlc3Nvci0+cHJvY2VzcygkcHJvdG9jb2wsICRwcm90b2NvbCk7Ci0gKiA8L2NvZGU+PC9ibG9ja3F1b3RlPgotICovCi0KLWNsYXNzIFRNdWx0aXBsZXhlZFByb2Nlc3NvcgotewotICAgIHByaXZhdGUgJHNlcnZpY2VQcm9jZXNzb3JNYXBfOwotCi0gICAgLyoqCi0gICAgICogJ1JlZ2lzdGVyJyBhIHNlcnZpY2Ugd2l0aCB0aGlzIDxjb2RlPlRNdWx0aXBsZXhlZFByb2Nlc3NvcjwvY29kZT4uICBUaGlzCi0gICAgICogYWxsb3dzIHVzIHRvIGJyb2tlciByZXF1ZXN0cyB0byBpbmRpdmlkdWFsIHNlcnZpY2VzIGJ5IHVzaW5nIHRoZSBzZXJ2aWNlCi0gICAgICogbmFtZSB0byBzZWxlY3QgdGhlbSBhdCByZXF1ZXN0IHRpbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VydmljZU5hbWUgTmFtZSBvZiBhIHNlcnZpY2UsIGhhcyB0byBiZSBpZGVudGljYWwgdG8gdGhlIG5hbWUKLSAgICAgKiBkZWNsYXJlZCBpbiB0aGUgVGhyaWZ0IElETCwgZS5nLiAiV2VhdGhlclJlcG9ydCIuCi0gICAgICogQHBhcmFtIHByb2Nlc3NvciBJbXBsZW1lbnRhdGlvbiBvZiBhIHNlcnZpY2UsIHVzdWFsbHkgcmVmZXJyZWQgdG8KLSAgICAgKiBhcyAiaGFuZGxlcnMiLCBlLmcuIFdlYXRoZXJSZXBvcnRIYW5kbGVyIGltcGxlbWVudGluZyBXZWF0aGVyUmVwb3J0LklmYWNlLgotICAgICAqLwotICAgIHB1YmxpYyBmdW5jdGlvbiByZWdpc3RlclByb2Nlc3Nvcigkc2VydmljZU5hbWUsICRwcm9jZXNzb3IpCi0gICAgewotICAgICAgICAkdGhpcy0+c2VydmljZVByb2Nlc3Nvck1hcF9bJHNlcnZpY2VOYW1lXSA9ICRwcm9jZXNzb3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5wcm9jZXNzPC9jb2RlPiBwZXJmb3JtcyB0aGUgZm9sbG93aW5nIHN0ZXBzOgotICAgICAqCi0gICAgICogPG9sPgotICAgICAqICAgICA8bGk+UmVhZCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtZXNzYWdlLjwvbGk+Ci0gICAgICogICAgIDxsaT5FeHRyYWN0IHRoZSBzZXJ2aWNlIG5hbWUgZnJvbSB0aGUgbWVzc2FnZS48L2xpPgotICAgICAqICAgICA8bGk+VXNpbmcgdGhlIHNlcnZpY2UgbmFtZSB0byBsb2NhdGUgdGhlIGFwcHJvcHJpYXRlIHByb2Nlc3Nvci48L2xpPgotICAgICAqICAgICA8bGk+RGlzcGF0Y2ggdG8gdGhlIHByb2Nlc3Nvciwgd2l0aCBhIGRlY29yYXRlZCBpbnN0YW5jZSBvZiBUUHJvdG9jb2wKLSAgICAgKiAgICAgICAgIHRoYXQgYWxsb3dzIHJlYWRNZXNzYWdlQmVnaW4oKSB0byByZXR1cm4gdGhlIG9yaWdpbmFsIE1lc3NhZ2UuPC9saT4KLSAgICAgKiA8L29sPgotICAgICAqCi0gICAgICogQHRocm93cyBURXhjZXB0aW9uIElmIHRoZSBtZXNzYWdlIHR5cGUgaXMgbm90IENBTEwgb3IgT05FV0FZLCBpZgotICAgICAqICAgICAgICAgICAgICAgICAgICB0aGUgc2VydmljZSBuYW1lIHdhcyBub3QgZm91bmQgaW4gdGhlIG1lc3NhZ2UsIG9yIGlmIHRoZSBzZXJ2aWNlCi0gICAgICogICAgICAgICAgICAgICAgICAgIG5hbWUgd2FzIG5vdCBmb3VuZCBpbiB0aGUgc2VydmljZSBtYXAuCi0gICAgICovCi0gICAgcHVibGljIGZ1bmN0aW9uIHByb2Nlc3MoVFByb3RvY29sICRpbnB1dCwgVFByb3RvY29sICRvdXRwdXQpCi0gICAgewotICAgICAgICAvKgotICAgICAgICAgICAgVXNlIHRoZSBhY3R1YWwgdW5kZXJseWluZyBwcm90b2NvbCAoZS5nLiBUQmluYXJ5UHJvdG9jb2wpIHRvIHJlYWQgdGhlCi0gICAgICAgICAgICBtZXNzYWdlIGhlYWRlci4gVGhpcyBwdWxscyB0aGUgbWVzc2FnZSAib2ZmIHRoZSB3aXJlIiwgd2hpY2ggd2UnbGwKLSAgICAgICAgICAgIGRlYWwgd2l0aCBhdCB0aGUgZW5kIG9mIHRoaXMgbWV0aG9kLgotICAgICAgICAqLwotICAgICAgICAkaW5wdXQtPnJlYWRNZXNzYWdlQmVnaW4oJGZuYW1lLCAkbXR5cGUsICRyc2VxaWQpOwotCi0gICAgICAgIGlmICgkbXR5cGUgIT09IFRNZXNzYWdlVHlwZTo6Q0FMTCAmJiAkbXR5cGUgIT0gVE1lc3NhZ2VUeXBlOjpPTkVXQVkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJUaGlzIHNob3VsZCBub3QgaGF2ZSBoYXBwZW5lZCE/Iik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBFeHRyYWN0IHRoZSBzZXJ2aWNlIG5hbWUgYW5kIHRoZSBuZXcgTWVzc2FnZSBuYW1lLgotICAgICAgICBpZiAoc3RycG9zKCRmbmFtZSwgVE11bHRpcGxleGVkUHJvdG9jb2w6OlNFUEFSQVRPUikgPT09IGZhbHNlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiU2VydmljZSBuYW1lIG5vdCBmb3VuZCBpbiBtZXNzYWdlIG5hbWU6IHskZm5hbWV9LiBEaWQgeW91ICIgLgotICAgICAgICAgICAgICAgICJmb3JnZXQgdG8gdXNlIGEgVE11bHRpcGxleFByb3RvY29sIGluIHlvdXIgY2xpZW50PyIpOwotICAgICAgICB9Ci0gICAgICAgIGxpc3QoJHNlcnZpY2VOYW1lLCAkbWVzc2FnZU5hbWUpID0gZXhwbG9kZSgnOicsICRmbmFtZSwgMik7Ci0gICAgICAgIGlmICghYXJyYXlfa2V5X2V4aXN0cygkc2VydmljZU5hbWUsICR0aGlzLT5zZXJ2aWNlUHJvY2Vzc29yTWFwXykpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJTZXJ2aWNlIG5hbWUgbm90IGZvdW5kOiB7JHNlcnZpY2VOYW1lfS4gIERpZCB5b3UgZm9yZ2V0ICIgLgotICAgICAgICAgICAgICAgICJ0byBjYWxsIHJlZ2lzdGVyUHJvY2Vzc29yKCk/Iik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBEaXNwYXRjaCBwcm9jZXNzaW5nIHRvIHRoZSBzdG9yZWQgcHJvY2Vzc29yCi0gICAgICAgICRwcm9jZXNzb3IgPSAkdGhpcy0+c2VydmljZVByb2Nlc3Nvck1hcF9bJHNlcnZpY2VOYW1lXTsKLQotICAgICAgICByZXR1cm4gJHByb2Nlc3Nvci0+cHJvY2VzcygKLSAgICAgICAgICAgIG5ldyBTdG9yZWRNZXNzYWdlUHJvdG9jb2woJGlucHV0LCAkbWVzc2FnZU5hbWUsICRtdHlwZSwgJHJzZXFpZCksICRvdXRwdXQKLSAgICAgICAgKTsKLSAgICB9Ci19Ci0KLS8qKgotICogIE91ciBnb2FsIHdhcyB0byB3b3JrIHdpdGggYW55IHByb3RvY29sLiBJbiBvcmRlciB0byBkbyB0aGF0LCB3ZSBuZWVkZWQKLSAqICB0byBhbGxvdyB0aGVtIHRvIGNhbGwgcmVhZE1lc3NhZ2VCZWdpbigpIGFuZCBnZXQgdGhlIE1lc3NhZ2UgaW4gZXhhY3RseQotICogIHRoZSBzdGFuZGFyZCBmb3JtYXQsIHdpdGhvdXQgdGhlIHNlcnZpY2UgbmFtZSBwcmVwZW5kZWQgdG8gdGhlIE1lc3NhZ2UgbmFtZS4KLSAqLwotY2xhc3MgU3RvcmVkTWVzc2FnZVByb3RvY29sIGV4dGVuZHMgVFByb3RvY29sRGVjb3JhdG9yCi17Ci0gICAgcHJpdmF0ZSAkZm5hbWVfLCAkbXR5cGVfLCAkcnNlcWlkXzsKLQotICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChUUHJvdG9jb2wgJHByb3RvY29sLCAkZm5hbWUsICRtdHlwZSwgJHJzZXFpZCkKLSAgICB7Ci0gICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJHByb3RvY29sKTsKLSAgICAgICAgJHRoaXMtPmZuYW1lXyAgPSAkZm5hbWU7Ci0gICAgICAgICR0aGlzLT5tdHlwZV8gID0gJG10eXBlOwotICAgICAgICAkdGhpcy0+cnNlcWlkXyA9ICRyc2VxaWQ7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlQmVnaW4oJiRuYW1lLCAmJHR5cGUsICYkc2VxaWQpCi0gICAgewotICAgICAgICAkbmFtZSAgPSAkdGhpcy0+Zm5hbWVfOwotICAgICAgICAkdHlwZSAgPSAkdGhpcy0+bXR5cGVfOwotICAgICAgICAkc2VxaWQgPSAkdGhpcy0+cnNlcWlkXzsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvVHJhbnNwb3J0L1RCdWZmZXJlZFRyYW5zcG9ydC5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvVHJhbnNwb3J0L1RCdWZmZXJlZFRyYW5zcG9ydC5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2NTRhZDMuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L1RyYW5zcG9ydC9UQnVmZmVyZWRUcmFuc3BvcnQucGhwCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotCi1uYW1lc3BhY2UgVGhyaWZ0XFRyYW5zcG9ydDsKLQotdXNlIFRocmlmdFxGYWN0b3J5XFRTdHJpbmdGdW5jRmFjdG9yeTsKLQotLyoqCi0gKiBCdWZmZXJlZCB0cmFuc3BvcnQuIFN0b3JlcyBkYXRhIHRvIGFuIGludGVybmFsIGJ1ZmZlciB0aGF0IGl0IGRvZXNuJ3QKLSAqIGFjdHVhbGx5IHdyaXRlIG91dCB1bnRpbCBmbHVzaCBpcyBjYWxsZWQuIEZvciByZWFkaW5nLCB3ZSBkbyBhIGdyZWVkeQotICogcmVhZCBhbmQgdGhlbiBzZXJ2ZSBkYXRhIG91dCBvZiB0aGUgaW50ZXJuYWwgYnVmZmVyLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotY2xhc3MgVEJ1ZmZlcmVkVHJhbnNwb3J0IGV4dGVuZHMgVFRyYW5zcG9ydAotewotICAvKioKLSAgICogQ29uc3RydWN0b3IuIENyZWF0ZXMgYSBidWZmZXJlZCB0cmFuc3BvcnQgYXJvdW5kIGFuIHVuZGVybHlpbmcgdHJhbnNwb3J0Ci0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHRyYW5zcG9ydD1udWxsLCAkckJ1ZlNpemU9NTEyLCAkd0J1ZlNpemU9NTEyKQotICB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydF8gPSAkdHJhbnNwb3J0OwotICAgICR0aGlzLT5yQnVmU2l6ZV8gPSAkckJ1ZlNpemU7Ci0gICAgJHRoaXMtPndCdWZTaXplXyA9ICR3QnVmU2l6ZTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGUgdW5kZXJseWluZyB0cmFuc3BvcnQKLSAgICoKLSAgICogQHZhciBUVHJhbnNwb3J0Ci0gICAqLwotICBwcm90ZWN0ZWQgJHRyYW5zcG9ydF8gPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgcmVjZWl2ZSBidWZmZXIgc2l6ZQotICAgKgotICAgKiBAdmFyIGludAotICAgKi8KLSAgcHJvdGVjdGVkICRyQnVmU2l6ZV8gPSA1MTI7Ci0KLSAgLyoqCi0gICAqIFRoZSB3cml0ZSBidWZmZXIgc2l6ZQotICAgKgotICAgKiBAdmFyIGludAotICAgKi8KLSAgcHJvdGVjdGVkICR3QnVmU2l6ZV8gPSA1MTI7Ci0KLSAgLyoqCi0gICAqIFRoZSB3cml0ZSBidWZmZXIuCi0gICAqCi0gICAqIEB2YXIgc3RyaW5nCi0gICAqLwotICBwcm90ZWN0ZWQgJHdCdWZfID0gJyc7Ci0KLSAgLyoqCi0gICAqIFRoZSByZWFkIGJ1ZmZlci4KLSAgICoKLSAgICogQHZhciBzdHJpbmcKLSAgICovCi0gIHByb3RlY3RlZCAkckJ1Zl8gPSAnJzsKLQotICBwdWJsaWMgZnVuY3Rpb24gaXNPcGVuKCkKLSAgewotICAgIHJldHVybiAkdGhpcy0+dHJhbnNwb3J0Xy0+aXNPcGVuKCk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gb3BlbigpCi0gIHsKLSAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+b3BlbigpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkKLSAgewotICAgICR0aGlzLT50cmFuc3BvcnRfLT5jbG9zZSgpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHB1dEJhY2soJGRhdGEpCi0gIHsKLSAgICBpZiAoVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR0aGlzLT5yQnVmXykgPT09IDApIHsKLSAgICAgICR0aGlzLT5yQnVmXyA9ICRkYXRhOwotICAgIH0gZWxzZSB7Ci0gICAgICAkdGhpcy0+ckJ1Zl8gPSAoJGRhdGEgLiAkdGhpcy0+ckJ1Zl8pOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBUaGUgcmVhc29uIHRoYXQgd2UgY3VzdG9taXplIHJlYWRBbGwgaGVyZSBpcyB0aGF0IHRoZSBtYWpvcml0eSBvZiBQSFAKLSAgICogc3RyZWFtcyBhcmUgYWxyZWFkeSBpbnRlcm5hbGx5IGJ1ZmZlcmVkIGJ5IFBIUC4gVGhlIHNvY2tldCBzdHJlYW0sIGZvcgotICAgKiBleGFtcGxlLCBidWZmZXJzIGludGVybmFsbHkgYW5kIGJsb2NrcyBpZiB5b3UgY2FsbCByZWFkIHdpdGggJGxlbiBncmVhdGVyCi0gICAqIHRoYW4gdGhlIGFtb3VudCBvZiBkYXRhIGF2YWlsYWJsZSwgdW5saWtlIHJlY3YoKSBpbiBDLgotICAgKgotICAgKiBUaGVyZWZvcmUsIHVzZSB0aGUgcmVhZEFsbCBtZXRob2Qgb2YgdGhlIHdyYXBwZWQgdHJhbnNwb3J0IGluc2lkZQotICAgKiB0aGUgYnVmZmVyZWQgcmVhZEFsbC4KLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkQWxsKCRsZW4pCi0gIHsKLSAgICAkaGF2ZSA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+ckJ1Zl8pOwotICAgIGlmICgkaGF2ZSA9PSAwKSB7Ci0gICAgICAkZGF0YSA9ICR0aGlzLT50cmFuc3BvcnRfLT5yZWFkQWxsKCRsZW4pOwotICAgIH0gZWxzZWlmICgkaGF2ZSA8ICRsZW4pIHsKLSAgICAgICRkYXRhID0gJHRoaXMtPnJCdWZfOwotICAgICAgJHRoaXMtPnJCdWZfID0gJyc7Ci0gICAgICAkZGF0YSAuPSAkdGhpcy0+dHJhbnNwb3J0Xy0+cmVhZEFsbCgkbGVuIC0gJGhhdmUpOwotICAgIH0gZWxzZWlmICgkaGF2ZSA9PSAkbGVuKSB7Ci0gICAgICAkZGF0YSA9ICR0aGlzLT5yQnVmXzsKLSAgICAgICR0aGlzLT5yQnVmXyA9ICcnOwotICAgIH0gZWxzZWlmICgkaGF2ZSA+ICRsZW4pIHsKLSAgICAgICRkYXRhID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCR0aGlzLT5yQnVmXywgMCwgJGxlbik7Ci0gICAgICAkdGhpcy0+ckJ1Zl8gPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdWJzdHIoJHRoaXMtPnJCdWZfLCAkbGVuKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gJGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkbGVuKQotICB7Ci0gICAgaWYgKFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+ckJ1Zl8pID09PSAwKSB7Ci0gICAgICAkdGhpcy0+ckJ1Zl8gPSAkdGhpcy0+dHJhbnNwb3J0Xy0+cmVhZCgkdGhpcy0+ckJ1ZlNpemVfKTsKLSAgICB9Ci0KLSAgICBpZiAoVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR0aGlzLT5yQnVmXykgPD0gJGxlbikgewotICAgICAgJHJldCA9ICR0aGlzLT5yQnVmXzsKLSAgICAgICR0aGlzLT5yQnVmXyA9ICcnOwotCi0gICAgICByZXR1cm4gJHJldDsKLSAgICB9Ci0KLSAgICAkcmV0ID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCR0aGlzLT5yQnVmXywgMCwgJGxlbik7Ci0gICAgJHRoaXMtPnJCdWZfID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCR0aGlzLT5yQnVmXywgJGxlbik7Ci0KLSAgICByZXR1cm4gJHJldDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkYnVmKQotICB7Ci0gICAgJHRoaXMtPndCdWZfIC49ICRidWY7Ci0gICAgaWYgKFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+d0J1Zl8pID49ICR0aGlzLT53QnVmU2l6ZV8pIHsKLSAgICAgICRvdXQgPSAkdGhpcy0+d0J1Zl87Ci0KLSAgICAgIC8vIE5vdGUgdGhhdCB3ZSBjbGVhciB0aGUgaW50ZXJuYWwgd0J1Zl8gcHJpb3IgdG8gdGhlIHVuZGVybHlpbmcgd3JpdGUKLSAgICAgIC8vIHRvIGVuc3VyZSB3ZSdyZSBpbiBhIHNhbmUgc3RhdGUgKGkuZS4gaW50ZXJuYWwgYnVmZmVyIGNsZWFuZWQpCi0gICAgICAvLyBpZiB0aGUgdW5kZXJseWluZyB3cml0ZSB0aHJvd3MgdXAgYW4gZXhjZXB0aW9uCi0gICAgICAkdGhpcy0+d0J1Zl8gPSAnJzsKLSAgICAgICR0aGlzLT50cmFuc3BvcnRfLT53cml0ZSgkb3V0KTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gZmx1c2goKQotICB7Ci0gICAgaWYgKFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+d0J1Zl8pID4gMCkgewotICAgICAgJG91dCA9ICR0aGlzLT53QnVmXzsKLQotICAgICAgLy8gTm90ZSB0aGF0IHdlIGNsZWFyIHRoZSBpbnRlcm5hbCB3QnVmXyBwcmlvciB0byB0aGUgdW5kZXJseWluZyB3cml0ZQotICAgICAgLy8gdG8gZW5zdXJlIHdlJ3JlIGluIGEgc2FuZSBzdGF0ZSAoaS5lLiBpbnRlcm5hbCBidWZmZXIgY2xlYW5lZCkKLSAgICAgIC8vIGlmIHRoZSB1bmRlcmx5aW5nIHdyaXRlIHRocm93cyB1cCBhbiBleGNlcHRpb24KLSAgICAgICR0aGlzLT53QnVmXyA9ICcnOwotICAgICAgJHRoaXMtPnRyYW5zcG9ydF8tPndyaXRlKCRvdXQpOwotICAgIH0KLSAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+Zmx1c2goKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvVHJhbnNwb3J0L1RDdXJsQ2xpZW50LnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9UcmFuc3BvcnQvVEN1cmxDbGllbnQucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjNlNjk0Li4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9UcmFuc3BvcnQvVEN1cmxDbGllbnQucGhwCisrKyAvZGV2L251bGwKQEAgLTEsMjMxICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotCi1uYW1lc3BhY2UgVGhyaWZ0XFRyYW5zcG9ydDsKLQotdXNlIFRocmlmdFxFeGNlcHRpb25cVFRyYW5zcG9ydEV4Y2VwdGlvbjsKLXVzZSBUaHJpZnRcRmFjdG9yeVxUU3RyaW5nRnVuY0ZhY3Rvcnk7Ci0KLS8qKgotICogSFRUUCBjbGllbnQgZm9yIFRocmlmdAotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotY2xhc3MgVEN1cmxDbGllbnQgZXh0ZW5kcyBUVHJhbnNwb3J0Ci17Ci0gIHByaXZhdGUgc3RhdGljICRjdXJsSGFuZGxlOwotCi0gIC8qKgotICAgKiBUaGUgaG9zdCB0byBjb25uZWN0IHRvCi0gICAqCi0gICAqIEB2YXIgc3RyaW5nCi0gICAqLwotICBwcm90ZWN0ZWQgJGhvc3RfOwotCi0gIC8qKgotICAgKiBUaGUgcG9ydCB0byBjb25uZWN0IG9uCi0gICAqCi0gICAqIEB2YXIgaW50Ci0gICAqLwotICBwcm90ZWN0ZWQgJHBvcnRfOwotCi0gIC8qKgotICAgKiBUaGUgVVJJIHRvIHJlcXVlc3QKLSAgICoKLSAgICogQHZhciBzdHJpbmcKLSAgICovCi0gIHByb3RlY3RlZCAkdXJpXzsKLQotICAvKioKLSAgICogVGhlIHNjaGVtZSB0byB1c2UgZm9yIHRoZSByZXF1ZXN0LCBpLmUuIGh0dHAsIGh0dHBzCi0gICAqCi0gICAqIEB2YXIgc3RyaW5nCi0gICAqLwotICBwcm90ZWN0ZWQgJHNjaGVtZV87Ci0KLSAgLyoqCi0gICAqIEJ1ZmZlciBmb3IgdGhlIEhUVFAgcmVxdWVzdCBkYXRhCi0gICAqCi0gICAqIEB2YXIgc3RyaW5nCi0gICAqLwotICBwcm90ZWN0ZWQgJHJlcXVlc3RfOwotCi0gIC8qKgotICAgKiBCdWZmZXIgZm9yIHRoZSBIVFRQIHJlc3BvbnNlIGRhdGEuCi0gICAqCi0gICAqIEB2YXIgYmluYXJ5IHN0cmluZwotICAgKi8KLSAgcHJvdGVjdGVkICRyZXNwb25zZV87Ci0KLSAgLyoqCi0gICAqIFJlYWQgdGltZW91dAotICAgKgotICAgKiBAdmFyIGZsb2F0Ci0gICAqLwotICBwcm90ZWN0ZWQgJHRpbWVvdXRfOwotCi0gIC8qKgotICAgKiBNYWtlIGEgbmV3IEhUVFAgY2xpZW50LgotICAgKgotICAgKiBAcGFyYW0gc3RyaW5nICRob3N0Ci0gICAqIEBwYXJhbSBpbnQgICAgJHBvcnQKLSAgICogQHBhcmFtIHN0cmluZyAkdXJpCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGhvc3QsICRwb3J0PTgwLCAkdXJpPScnLCAkc2NoZW1lID0gJ2h0dHAnKQotICB7Ci0gICAgaWYgKChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHVyaSkgPiAwKSAmJiAoJHVyaXswfSAhPSAnLycpKSB7Ci0gICAgICAkdXJpID0gJy8nLiR1cmk7Ci0gICAgfQotICAgICR0aGlzLT5zY2hlbWVfID0gJHNjaGVtZTsKLSAgICAkdGhpcy0+aG9zdF8gPSAkaG9zdDsKLSAgICAkdGhpcy0+cG9ydF8gPSAkcG9ydDsKLSAgICAkdGhpcy0+dXJpXyA9ICR1cmk7Ci0gICAgJHRoaXMtPnJlcXVlc3RfID0gJyc7Ci0gICAgJHRoaXMtPnJlc3BvbnNlXyA9IG51bGw7Ci0gICAgJHRoaXMtPnRpbWVvdXRfID0gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgcmVhZCB0aW1lb3V0Ci0gICAqCi0gICAqIEBwYXJhbSBmbG9hdCAkdGltZW91dAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHNldFRpbWVvdXRTZWNzKCR0aW1lb3V0KQotICB7Ci0gICAgJHRoaXMtPnRpbWVvdXRfID0gJHRpbWVvdXQ7Ci0gIH0KLQotICAvKioKLSAgICogV2hldGhlciB0aGlzIHRyYW5zcG9ydCBpcyBvcGVuLgotICAgKgotICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBvcGVuCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gaXNPcGVuKCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIE9wZW4gdGhlIHRyYW5zcG9ydCBmb3IgcmVhZGluZy93cml0aW5nCi0gICAqCi0gICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBjYW5ub3Qgb3BlbgotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIG9wZW4oKQotICB7Ci0gIH0KLQotICAvKioKLSAgICogQ2xvc2UgdGhlIHRyYW5zcG9ydC4KLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBjbG9zZSgpCi0gIHsKLSAgICAkdGhpcy0+cmVxdWVzdF8gPSAnJzsKLSAgICAkdGhpcy0+cmVzcG9uc2VfID0gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZWFkIHNvbWUgZGF0YSBpbnRvIHRoZSBhcnJheS4KLSAgICoKLSAgICogQHBhcmFtIGludCAgICAkbGVuIEhvdyBtdWNoIHRvIHJlYWQKLSAgICogQHJldHVybiBzdHJpbmcgVGhlIGRhdGEgdGhhdCBoYXMgYmVlbiByZWFkCi0gICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBjYW5ub3QgcmVhZCBhbnkgbW9yZSBkYXRhCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkbGVuKQotICB7Ci0gICAgaWYgKCRsZW4gPj0gc3RybGVuKCR0aGlzLT5yZXNwb25zZV8pKSB7Ci0gICAgICByZXR1cm4gJHRoaXMtPnJlc3BvbnNlXzsKLSAgICB9IGVsc2UgewotICAgICAgJHJldCA9IHN1YnN0cigkdGhpcy0+cmVzcG9uc2VfLCAwLCAkbGVuKTsKLSAgICAgICR0aGlzLT5yZXNwb25zZV8gPSBzdWJzdHIoJHRoaXMtPnJlc3BvbnNlXywgJGxlbik7Ci0KLSAgICAgIHJldHVybiAkcmV0OwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBXcml0ZXMgc29tZSBkYXRhIGludG8gdGhlIHBlbmRpbmcgYnVmZmVyCi0gICAqCi0gICAqIEBwYXJhbSBzdHJpbmcgJGJ1ZiAgVGhlIGRhdGEgdG8gd3JpdGUKLSAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIHdyaXRpbmcgZmFpbHMKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkYnVmKQotICB7Ci0gICAgJHRoaXMtPnJlcXVlc3RfIC49ICRidWY7Ci0gIH0KLQotICAvKioKLSAgICogT3BlbnMgYW5kIHNlbmRzIHRoZSBhY3R1YWwgcmVxdWVzdCBvdmVyIHRoZSBIVFRQIGNvbm5lY3Rpb24KLSAgICoKLSAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGEgd3JpdGluZyBlcnJvciBvY2N1cnMKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBmbHVzaCgpCi0gIHsKLSAgICBpZiAoIXNlbGY6OiRjdXJsSGFuZGxlKSB7Ci0gICAgICByZWdpc3Rlcl9zaHV0ZG93bl9mdW5jdGlvbihhcnJheSgnVGhyaWZ0XFxUcmFuc3BvcnRcXFRDdXJsQ2xpZW50JywgJ2Nsb3NlQ3VybEhhbmRsZScpKTsKLSAgICAgIHNlbGY6OiRjdXJsSGFuZGxlID0gY3VybF9pbml0KCk7Ci0gICAgICBjdXJsX3NldG9wdChzZWxmOjokY3VybEhhbmRsZSwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgdHJ1ZSk7Ci0gICAgICBjdXJsX3NldG9wdChzZWxmOjokY3VybEhhbmRsZSwgQ1VSTE9QVF9CSU5BUllUUkFOU0ZFUiwgdHJ1ZSk7Ci0gICAgICBjdXJsX3NldG9wdChzZWxmOjokY3VybEhhbmRsZSwgQ1VSTE9QVF9VU0VSQUdFTlQsICdQSFAvVEN1cmxDbGllbnQnKTsKLSAgICAgIGN1cmxfc2V0b3B0KHNlbGY6OiRjdXJsSGFuZGxlLCBDVVJMT1BUX0NVU1RPTVJFUVVFU1QsICdQT1NUJyk7Ci0gICAgICBjdXJsX3NldG9wdChzZWxmOjokY3VybEhhbmRsZSwgQ1VSTE9QVF9GT0xMT1dMT0NBVElPTiwgdHJ1ZSk7Ci0gICAgICBjdXJsX3NldG9wdChzZWxmOjokY3VybEhhbmRsZSwgQ1VSTE9QVF9NQVhSRURJUlMsIDEpOwotICAgIH0KLSAgICAvLyBHb2QsIFBIUCByZWFsbHkgaGFzIHNvbWUgZXNvdGVyaWMgd2F5cyBvZiBkb2luZyBzaW1wbGUgdGhpbmdzLgotICAgICRob3N0ID0gJHRoaXMtPmhvc3RfLigkdGhpcy0+cG9ydF8gIT0gODAgPyAnOicuJHRoaXMtPnBvcnRfIDogJycpOwotICAgICRmdWxsVXJsID0gJHRoaXMtPnNjaGVtZV8uIjovLyIuJGhvc3QuJHRoaXMtPnVyaV87Ci0KLSAgICAkaGVhZGVycyA9IGFycmF5KCdBY2NlcHQ6IGFwcGxpY2F0aW9uL3gtdGhyaWZ0JywKLSAgICAgICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtdGhyaWZ0JywKLSAgICAgICAgICAgICAgICAgICAgICdDb250ZW50LUxlbmd0aDogJy5UU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPnJlcXVlc3RfKSk7Ci0gICAgY3VybF9zZXRvcHQoc2VsZjo6JGN1cmxIYW5kbGUsIENVUkxPUFRfSFRUUEhFQURFUiwgJGhlYWRlcnMpOwotCi0gICAgaWYgKCR0aGlzLT50aW1lb3V0XyA+IDApIHsKLSAgICAgIGN1cmxfc2V0b3B0KHNlbGY6OiRjdXJsSGFuZGxlLCBDVVJMT1BUX1RJTUVPVVQsICR0aGlzLT50aW1lb3V0Xyk7Ci0gICAgfQotICAgIGN1cmxfc2V0b3B0KHNlbGY6OiRjdXJsSGFuZGxlLCBDVVJMT1BUX1BPU1RGSUVMRFMsICR0aGlzLT5yZXF1ZXN0Xyk7Ci0gICAgJHRoaXMtPnJlcXVlc3RfID0gJyc7Ci0KLSAgICBjdXJsX3NldG9wdChzZWxmOjokY3VybEhhbmRsZSwgQ1VSTE9QVF9VUkwsICRmdWxsVXJsKTsKLSAgICAkdGhpcy0+cmVzcG9uc2VfID0gY3VybF9leGVjKHNlbGY6OiRjdXJsSGFuZGxlKTsKLQotICAgIC8vIENvbm5lY3QgZmFpbGVkPwotICAgIGlmICghJHRoaXMtPnJlc3BvbnNlXykgewotICAgICAgY3VybF9jbG9zZShzZWxmOjokY3VybEhhbmRsZSk7Ci0gICAgICBzZWxmOjokY3VybEhhbmRsZSA9IG51bGw7Ci0gICAgICAkZXJyb3IgPSAnVEN1cmxDbGllbnQ6IENvdWxkIG5vdCBjb25uZWN0IHRvICcuJGZ1bGxVcmw7Ci0gICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigkZXJyb3IsIFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNsb3NlQ3VybEhhbmRsZSgpCi0gIHsKLSAgICB0cnkgewotICAgICAgaWYgKHNlbGY6OiRjdXJsSGFuZGxlKSB7Ci0gICAgICAgIGN1cmxfY2xvc2Uoc2VsZjo6JGN1cmxIYW5kbGUpOwotICAgICAgICBzZWxmOjokY3VybEhhbmRsZSA9IG51bGw7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoXEV4Y2VwdGlvbiAkeCkgewotICAgICAgZXJyb3JfbG9nKCdUaGVyZSB3YXMgYW4gZXJyb3IgY2xvc2luZyB0aGUgY3VybCBoYW5kbGU6ICcgLiAkeC0+Z2V0TWVzc2FnZSgpKTsKLSAgICB9Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L1RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9UcmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4YTY0YTkuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L1RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LnBocAorKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0Ci0gKi8KLQotbmFtZXNwYWNlIFRocmlmdFxUcmFuc3BvcnQ7Ci0KLXVzZSBUaHJpZnRcRmFjdG9yeVxUU3RyaW5nRnVuY0ZhY3Rvcnk7Ci0KLS8qKgotICogRnJhbWVkIHRyYW5zcG9ydC4gV3JpdGVzIGFuZCByZWFkcyBkYXRhIGluIGNodW5rcyB0aGF0IGFyZSBzdGFtcGVkIHdpdGgKLSAqIHRoZWlyIGxlbmd0aC4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0Ci0gKi8KLWNsYXNzIFRGcmFtZWRUcmFuc3BvcnQgZXh0ZW5kcyBUVHJhbnNwb3J0Ci17Ci0gIC8qKgotICAgKiBVbmRlcmx5aW5nIHRyYW5zcG9ydCBvYmplY3QuCi0gICAqCi0gICAqIEB2YXIgVFRyYW5zcG9ydAotICAgKi8KLSAgcHJpdmF0ZSAkdHJhbnNwb3J0XzsKLQotICAvKioKLSAgICogQnVmZmVyIGZvciByZWFkIGRhdGEuCi0gICAqCi0gICAqIEB2YXIgc3RyaW5nCi0gICAqLwotICBwcml2YXRlICRyQnVmXzsKLQotICAvKioKLSAgICogQnVmZmVyIGZvciBxdWV1ZWQgb3V0cHV0IGRhdGEKLSAgICoKLSAgICogQHZhciBzdHJpbmcKLSAgICovCi0gIHByaXZhdGUgJHdCdWZfOwotCi0gIC8qKgotICAgKiBXaGV0aGVyIHRvIGZyYW1lIHJlYWRzCi0gICAqCi0gICAqIEB2YXIgYm9vbAotICAgKi8KLSAgcHJpdmF0ZSAkcmVhZF87Ci0KLSAgLyoqCi0gICAqIFdoZXRoZXIgdG8gZnJhbWUgd3JpdGVzCi0gICAqCi0gICAqIEB2YXIgYm9vbAotICAgKi8KLSAgcHJpdmF0ZSAkd3JpdGVfOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtIFRUcmFuc3BvcnQgJHRyYW5zcG9ydCBVbmRlcmx5aW5nIHRyYW5zcG9ydAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCR0cmFuc3BvcnQ9bnVsbCwgJHJlYWQ9dHJ1ZSwgJHdyaXRlPXRydWUpCi0gIHsKLSAgICAkdGhpcy0+dHJhbnNwb3J0XyA9ICR0cmFuc3BvcnQ7Ci0gICAgJHRoaXMtPnJlYWRfID0gJHJlYWQ7Ci0gICAgJHRoaXMtPndyaXRlXyA9ICR3cml0ZTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiBpc09wZW4oKQotICB7Ci0gICAgcmV0dXJuICR0aGlzLT50cmFuc3BvcnRfLT5pc09wZW4oKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiBvcGVuKCkKLSAgewotICAgICR0aGlzLT50cmFuc3BvcnRfLT5vcGVuKCk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKQotICB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydF8tPmNsb3NlKCk7Ci0gIH0KLQotICAvKioKLSAgICogUmVhZHMgZnJvbSB0aGUgYnVmZmVyLiBXaGVuIG1vcmUgZGF0YSBpcyByZXF1aXJlZCByZWFkcyBhbm90aGVyIGVudGlyZQotICAgKiBjaHVuayBhbmQgc2VydmVzIGZ1dHVyZSByZWFkcyBvdXQgb2YgdGhhdC4KLSAgICoKLSAgICogQHBhcmFtIGludCAkbGVuIEhvdyBtdWNoIGRhdGEKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkKCRsZW4pCi0gIHsKLSAgICBpZiAoISR0aGlzLT5yZWFkXykgewotICAgICAgcmV0dXJuICR0aGlzLT50cmFuc3BvcnRfLT5yZWFkKCRsZW4pOwotICAgIH0KLQotICAgIGlmIChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPnJCdWZfKSA9PT0gMCkgewotICAgICAgJHRoaXMtPnJlYWRGcmFtZSgpOwotICAgIH0KLQotICAgIC8vIEp1c3QgcmV0dXJuIGZ1bGwgYnVmZgotICAgIGlmICgkbGVuID49IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+ckJ1Zl8pKSB7Ci0gICAgICAkb3V0ID0gJHRoaXMtPnJCdWZfOwotICAgICAgJHRoaXMtPnJCdWZfID0gbnVsbDsKLQotICAgICAgcmV0dXJuICRvdXQ7Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN1YnN0cgotICAgICRvdXQgPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdWJzdHIoJHRoaXMtPnJCdWZfLCAwLCAkbGVuKTsKLSAgICAkdGhpcy0+ckJ1Zl8gPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdWJzdHIoJHRoaXMtPnJCdWZfLCAkbGVuKTsKLQotICAgIHJldHVybiAkb3V0OwotICB9Ci0KLSAgLyoqCi0gICAqIFB1dCBwcmV2aW91c2x5IHJlYWQgZGF0YSBiYWNrIGludG8gdGhlIGJ1ZmZlcgotICAgKgotICAgKiBAcGFyYW0gc3RyaW5nICRkYXRhIGRhdGEgdG8gcmV0dXJuCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gcHV0QmFjaygkZGF0YSkKLSAgewotICAgIGlmIChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPnJCdWZfKSA9PT0gMCkgewotICAgICAgJHRoaXMtPnJCdWZfID0gJGRhdGE7Ci0gICAgfSBlbHNlIHsKLSAgICAgICR0aGlzLT5yQnVmXyA9ICgkZGF0YSAuICR0aGlzLT5yQnVmXyk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWRzIGEgY2h1bmsgb2YgZGF0YSBpbnRvIHRoZSBpbnRlcm5hbCByZWFkIGJ1ZmZlci4KLSAgICovCi0gIHByaXZhdGUgZnVuY3Rpb24gcmVhZEZyYW1lKCkKLSAgewotICAgICRidWYgPSAkdGhpcy0+dHJhbnNwb3J0Xy0+cmVhZEFsbCg0KTsKLSAgICAkdmFsID0gdW5wYWNrKCdOJywgJGJ1Zik7Ci0gICAgJHN6ID0gJHZhbFsxXTsKLQotICAgICR0aGlzLT5yQnVmXyA9ICR0aGlzLT50cmFuc3BvcnRfLT5yZWFkQWxsKCRzeik7Ci0gIH0KLQotICAvKioKLSAgICogV3JpdGVzIHNvbWUgZGF0YSB0byB0aGUgcGVuZGluZyBvdXRwdXQgYnVmZmVyLgotICAgKgotICAgKiBAcGFyYW0gc3RyaW5nICRidWYgVGhlIGRhdGEKLSAgICogQHBhcmFtIGludCAgICAkbGVuIExpbWl0IG9mIGJ5dGVzIHRvIHdyaXRlCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGJ1ZiwgJGxlbj1udWxsKQotICB7Ci0gICAgaWYgKCEkdGhpcy0+d3JpdGVfKSB7Ci0gICAgICByZXR1cm4gJHRoaXMtPnRyYW5zcG9ydF8tPndyaXRlKCRidWYsICRsZW4pOwotICAgIH0KLQotICAgIGlmICgkbGVuICE9PSBudWxsICYmICRsZW4gPCBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJGJ1ZikpIHsKLSAgICAgICRidWYgPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdWJzdHIoJGJ1ZiwgMCwgJGxlbik7Ci0gICAgfQotICAgICR0aGlzLT53QnVmXyAuPSAkYnVmOwotICB9Ci0KLSAgLyoqCi0gICAqIFdyaXRlcyB0aGUgb3V0cHV0IGJ1ZmZlciB0byB0aGUgc3RyZWFtIGluIHRoZSBmb3JtYXQgb2YgYSA0LWJ5dGUgbGVuZ3RoCi0gICAqIGZvbGxvd2VkIGJ5IHRoZSBhY3R1YWwgZGF0YS4KLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBmbHVzaCgpCi0gIHsKLSAgICBpZiAoISR0aGlzLT53cml0ZV8gfHwgVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR0aGlzLT53QnVmXykgPT0gMCkgewotICAgICAgcmV0dXJuICR0aGlzLT50cmFuc3BvcnRfLT5mbHVzaCgpOwotICAgIH0KLQotICAgICRvdXQgPSBwYWNrKCdOJywgVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR0aGlzLT53QnVmXykpOwotICAgICRvdXQgLj0gJHRoaXMtPndCdWZfOwotCi0gICAgLy8gTm90ZSB0aGF0IHdlIGNsZWFyIHRoZSBpbnRlcm5hbCB3QnVmXyBwcmlvciB0byB0aGUgdW5kZXJseWluZyB3cml0ZQotICAgIC8vIHRvIGVuc3VyZSB3ZSdyZSBpbiBhIHNhbmUgc3RhdGUgKGkuZS4gaW50ZXJuYWwgYnVmZmVyIGNsZWFuZWQpCi0gICAgLy8gaWYgdGhlIHVuZGVybHlpbmcgd3JpdGUgdGhyb3dzIHVwIGFuIGV4Y2VwdGlvbgotICAgICR0aGlzLT53QnVmXyA9ICcnOwotICAgICR0aGlzLT50cmFuc3BvcnRfLT53cml0ZSgkb3V0KTsKLSAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+Zmx1c2goKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvVHJhbnNwb3J0L1RIdHRwQ2xpZW50LnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9UcmFuc3BvcnQvVEh0dHBDbGllbnQucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzcyYWI3Li4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9UcmFuc3BvcnQvVEh0dHBDbGllbnQucGhwCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotCi1uYW1lc3BhY2UgVGhyaWZ0XFRyYW5zcG9ydDsKLQotdXNlIFRocmlmdFxFeGNlcHRpb25cVFRyYW5zcG9ydEV4Y2VwdGlvbjsKLXVzZSBUaHJpZnRcRmFjdG9yeVxUU3RyaW5nRnVuY0ZhY3Rvcnk7Ci0KLS8qKgotICogSFRUUCBjbGllbnQgZm9yIFRocmlmdAotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotY2xhc3MgVEh0dHBDbGllbnQgZXh0ZW5kcyBUVHJhbnNwb3J0Ci17Ci0gIC8qKgotICAgKiBUaGUgaG9zdCB0byBjb25uZWN0IHRvCi0gICAqCi0gICAqIEB2YXIgc3RyaW5nCi0gICAqLwotICBwcm90ZWN0ZWQgJGhvc3RfOwotCi0gIC8qKgotICAgKiBUaGUgcG9ydCB0byBjb25uZWN0IG9uCi0gICAqCi0gICAqIEB2YXIgaW50Ci0gICAqLwotICBwcm90ZWN0ZWQgJHBvcnRfOwotCi0gIC8qKgotICAgKiBUaGUgVVJJIHRvIHJlcXVlc3QKLSAgICoKLSAgICogQHZhciBzdHJpbmcKLSAgICovCi0gIHByb3RlY3RlZCAkdXJpXzsKLQotICAvKioKLSAgICogVGhlIHNjaGVtZSB0byB1c2UgZm9yIHRoZSByZXF1ZXN0LCBpLmUuIGh0dHAsIGh0dHBzCi0gICAqCi0gICAqIEB2YXIgc3RyaW5nCi0gICAqLwotICBwcm90ZWN0ZWQgJHNjaGVtZV87Ci0KLSAgLyoqCi0gICAqIEJ1ZmZlciBmb3IgdGhlIEhUVFAgcmVxdWVzdCBkYXRhCi0gICAqCi0gICAqIEB2YXIgc3RyaW5nCi0gICAqLwotICBwcm90ZWN0ZWQgJGJ1Zl87Ci0KLSAgLyoqCi0gICAqIElucHV0IHNvY2tldCBzdHJlYW0uCi0gICAqCi0gICAqIEB2YXIgcmVzb3VyY2UKLSAgICovCi0gIHByb3RlY3RlZCAkaGFuZGxlXzsKLQotICAvKioKLSAgICogUmVhZCB0aW1lb3V0Ci0gICAqCi0gICAqIEB2YXIgZmxvYXQKLSAgICovCi0gIHByb3RlY3RlZCAkdGltZW91dF87Ci0KLSAgLyoqCi0gICAqIGh0dHAgaGVhZGVycwotICAgKgotICAgKiBAdmFyIGFycmF5Ci0gICAqLwotICBwcm90ZWN0ZWQgJGhlYWRlcnNfOwotCi0gIC8qKgotICAgKiBNYWtlIGEgbmV3IEhUVFAgY2xpZW50LgotICAgKgotICAgKiBAcGFyYW0gc3RyaW5nICRob3N0Ci0gICAqIEBwYXJhbSBpbnQgICAgJHBvcnQKLSAgICogQHBhcmFtIHN0cmluZyAkdXJpCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGhvc3QsICRwb3J0PTgwLCAkdXJpPScnLCAkc2NoZW1lID0gJ2h0dHAnKQotICB7Ci0gICAgaWYgKChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHVyaSkgPiAwKSAmJiAoJHVyaXswfSAhPSAnLycpKSB7Ci0gICAgICAkdXJpID0gJy8nLiR1cmk7Ci0gICAgfQotICAgICR0aGlzLT5zY2hlbWVfID0gJHNjaGVtZTsKLSAgICAkdGhpcy0+aG9zdF8gPSAkaG9zdDsKLSAgICAkdGhpcy0+cG9ydF8gPSAkcG9ydDsKLSAgICAkdGhpcy0+dXJpXyA9ICR1cmk7Ci0gICAgJHRoaXMtPmJ1Zl8gPSAnJzsKLSAgICAkdGhpcy0+aGFuZGxlXyA9IG51bGw7Ci0gICAgJHRoaXMtPnRpbWVvdXRfID0gbnVsbDsKLSAgICAkdGhpcy0+aGVhZGVyc18gPSBhcnJheSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCByZWFkIHRpbWVvdXQKLSAgICoKLSAgICogQHBhcmFtIGZsb2F0ICR0aW1lb3V0Ci0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gc2V0VGltZW91dFNlY3MoJHRpbWVvdXQpCi0gIHsKLSAgICAkdGhpcy0+dGltZW91dF8gPSAkdGltZW91dDsKLSAgfQotCi0gIC8qKgotICAgKiBXaGV0aGVyIHRoaXMgdHJhbnNwb3J0IGlzIG9wZW4uCi0gICAqCi0gICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIG9wZW4KLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBpc09wZW4oKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogT3BlbiB0aGUgdHJhbnNwb3J0IGZvciByZWFkaW5nL3dyaXRpbmcKLSAgICoKLSAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGNhbm5vdCBvcGVuCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gb3BlbigpIHt9Ci0KLSAgLyoqCi0gICAqIENsb3NlIHRoZSB0cmFuc3BvcnQuCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKQotICB7Ci0gICAgaWYgKCR0aGlzLT5oYW5kbGVfKSB7Ci0gICAgICBAZmNsb3NlKCR0aGlzLT5oYW5kbGVfKTsKLSAgICAgICR0aGlzLT5oYW5kbGVfID0gbnVsbDsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmVhZCBzb21lIGRhdGEgaW50byB0aGUgYXJyYXkuCi0gICAqCi0gICAqIEBwYXJhbSBpbnQgICAgJGxlbiBIb3cgbXVjaCB0byByZWFkCi0gICAqIEByZXR1cm4gc3RyaW5nIFRoZSBkYXRhIHRoYXQgaGFzIGJlZW4gcmVhZAotICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgY2Fubm90IHJlYWQgYW55IG1vcmUgZGF0YQotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWQoJGxlbikKLSAgewotICAgICRkYXRhID0gQGZyZWFkKCR0aGlzLT5oYW5kbGVfLCAkbGVuKTsKLSAgICBpZiAoJGRhdGEgPT09IEZBTFNFIHx8ICRkYXRhID09PSAnJykgewotICAgICAgJG1kID0gc3RyZWFtX2dldF9tZXRhX2RhdGEoJHRoaXMtPmhhbmRsZV8pOwotICAgICAgaWYgKCRtZFsndGltZWRfb3V0J10pIHsKLSAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1RIdHRwQ2xpZW50OiB0aW1lZCBvdXQgcmVhZGluZyAnLiRsZW4uJyBieXRlcyBmcm9tICcuJHRoaXMtPmhvc3RfLic6Jy4kdGhpcy0+cG9ydF8uJHRoaXMtPnVyaV8sIFRUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignVEh0dHBDbGllbnQ6IENvdWxkIG5vdCByZWFkICcuJGxlbi4nIGJ5dGVzIGZyb20gJy4kdGhpcy0+aG9zdF8uJzonLiR0aGlzLT5wb3J0Xy4kdGhpcy0+dXJpXywgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuICRkYXRhOwotICB9Ci0KLSAgLyoqCi0gICAqIFdyaXRlcyBzb21lIGRhdGEgaW50byB0aGUgcGVuZGluZyBidWZmZXIKLSAgICoKLSAgICogQHBhcmFtIHN0cmluZyAkYnVmICBUaGUgZGF0YSB0byB3cml0ZQotICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgd3JpdGluZyBmYWlscwotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCRidWYpCi0gIHsKLSAgICAkdGhpcy0+YnVmXyAuPSAkYnVmOwotICB9Ci0KLSAgLyoqCi0gICAqIE9wZW5zIGFuZCBzZW5kcyB0aGUgYWN0dWFsIHJlcXVlc3Qgb3ZlciB0aGUgSFRUUCBjb25uZWN0aW9uCi0gICAqCi0gICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBhIHdyaXRpbmcgZXJyb3Igb2NjdXJzCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gZmx1c2goKQotICB7Ci0gICAgLy8gR29kLCBQSFAgcmVhbGx5IGhhcyBzb21lIGVzb3RlcmljIHdheXMgb2YgZG9pbmcgc2ltcGxlIHRoaW5ncy4KLSAgICAkaG9zdCA9ICR0aGlzLT5ob3N0Xy4oJHRoaXMtPnBvcnRfICE9IDgwID8gJzonLiR0aGlzLT5wb3J0XyA6ICcnKTsKLQotICAgICRoZWFkZXJzID0gYXJyYXkoKTsKLSAgICAkZGVmYXVsdEhlYWRlcnMgPSBhcnJheSgnSG9zdCcgPT4gJGhvc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FjY2VwdCcgPT4gJ2FwcGxpY2F0aW9uL3gtdGhyaWZ0JywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVXNlci1BZ2VudCcgPT4gJ1BIUC9USHR0cENsaWVudCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZScgPT4gJ2FwcGxpY2F0aW9uL3gtdGhyaWZ0JywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1MZW5ndGgnID0+IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+YnVmXykpOwotICAgIGZvcmVhY2ggKGFycmF5X21lcmdlKCRkZWZhdWx0SGVhZGVycywgJHRoaXMtPmhlYWRlcnNfKSBhcyAka2V5ID0+ICR2YWx1ZSkgewotICAgICAgICAkaGVhZGVyc1tdID0gIiRrZXk6ICR2YWx1ZSI7Ci0gICAgfQotCi0gICAgJG9wdGlvbnMgPSBhcnJheSgnbWV0aG9kJyA9PiAnUE9TVCcsCi0gICAgICAgICAgICAgICAgICAgICAnaGVhZGVyJyA9PiBpbXBsb2RlKCJcclxuIiwgJGhlYWRlcnMpLAotICAgICAgICAgICAgICAgICAgICAgJ21heF9yZWRpcmVjdHMnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAnY29udGVudCcgPT4gJHRoaXMtPmJ1Zl8pOwotICAgIGlmICgkdGhpcy0+dGltZW91dF8gPiAwKSB7Ci0gICAgICAkb3B0aW9uc1sndGltZW91dCddID0gJHRoaXMtPnRpbWVvdXRfOwotICAgIH0KLSAgICAkdGhpcy0+YnVmXyA9ICcnOwotCi0gICAgJGNvbnRleHRpZCA9IHN0cmVhbV9jb250ZXh0X2NyZWF0ZShhcnJheSgnaHR0cCcgPT4gJG9wdGlvbnMpKTsKLSAgICAkdGhpcy0+aGFuZGxlXyA9IEBmb3BlbigkdGhpcy0+c2NoZW1lXy4nOi8vJy4kaG9zdC4kdGhpcy0+dXJpXywgJ3InLCBmYWxzZSwgJGNvbnRleHRpZCk7Ci0KLSAgICAvLyBDb25uZWN0IGZhaWxlZD8KLSAgICBpZiAoJHRoaXMtPmhhbmRsZV8gPT09IEZBTFNFKSB7Ci0gICAgICAkdGhpcy0+aGFuZGxlXyA9IG51bGw7Ci0gICAgICAkZXJyb3IgPSAnVEh0dHBDbGllbnQ6IENvdWxkIG5vdCBjb25uZWN0IHRvICcuJGhvc3QuJHRoaXMtPnVyaV87Ci0gICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigkZXJyb3IsIFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gYWRkSGVhZGVycygkaGVhZGVycykKLSAgewotICAgICR0aGlzLT5oZWFkZXJzXyA9IGFycmF5X21lcmdlKCR0aGlzLT5oZWFkZXJzXywgJGhlYWRlcnMpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9UcmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvVHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmMyNmJmLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9UcmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5waHAKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0Ci0gKi8KLQotbmFtZXNwYWNlIFRocmlmdFxUcmFuc3BvcnQ7Ci0KLXVzZSBUaHJpZnRcRXhjZXB0aW9uXFRUcmFuc3BvcnRFeGNlcHRpb247Ci11c2UgVGhyaWZ0XEZhY3RvcnlcVFN0cmluZ0Z1bmNGYWN0b3J5OwotCi0vKioKLSAqIEEgbWVtb3J5IGJ1ZmZlciBpcyBhIHRyYW5wc29ydCB0aGF0IHNpbXBseSByZWFkcyBmcm9tIGFuZCB3cml0ZXMgdG8gYW4KLSAqIGluLW1lbW9yeSBzdHJpbmcgYnVmZmVyLiBBbnl0aW1lIHlvdSBjYWxsIHdyaXRlIG9uIGl0LCB0aGUgZGF0YSBpcyBzaW1wbHkKLSAqIHBsYWNlZCBpbnRvIGEgYnVmZmVyLCBhbmQgYW55dGltZSB5b3UgY2FsbCByZWFkLCBkYXRhIGlzIHJlYWQgZnJvbSB0aGF0Ci0gKiBidWZmZXIuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi1jbGFzcyBUTWVtb3J5QnVmZmVyIGV4dGVuZHMgVFRyYW5zcG9ydAotewotICAvKioKLSAgICogQ29uc3RydWN0b3IuIE9wdGlvbmFsbHkgcGFzcyBhbiBpbml0aWFsIHZhbHVlCi0gICAqIGZvciB0aGUgYnVmZmVyLgotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRidWYgPSAnJykKLSAgewotICAgICR0aGlzLT5idWZfID0gJGJ1ZjsKLSAgfQotCi0gIHByb3RlY3RlZCAkYnVmXyA9ICcnOwotCi0gIHB1YmxpYyBmdW5jdGlvbiBpc09wZW4oKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gb3BlbigpIHt9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkge30KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGJ1ZikKLSAgewotICAgICR0aGlzLT5idWZfIC49ICRidWY7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkbGVuKQotICB7Ci0gICAgJGJ1Zkxlbmd0aCA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+YnVmXyk7Ci0KLSAgICBpZiAoJGJ1Zkxlbmd0aCA9PT0gMCkgewotICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1RNZW1vcnlCdWZmZXI6IENvdWxkIG5vdCByZWFkICcgLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGxlbiAuICcgYnl0ZXMgZnJvbSBidWZmZXIuJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04pOwotICAgIH0KLQotICAgIGlmICgkYnVmTGVuZ3RoIDw9ICRsZW4pIHsKLSAgICAgICRyZXQgPSAkdGhpcy0+YnVmXzsKLSAgICAgICR0aGlzLT5idWZfID0gJyc7Ci0KLSAgICAgIHJldHVybiAkcmV0OwotICAgIH0KLQotICAgICRyZXQgPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdWJzdHIoJHRoaXMtPmJ1Zl8sIDAsICRsZW4pOwotICAgICR0aGlzLT5idWZfID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCR0aGlzLT5idWZfLCAkbGVuKTsKLQotICAgIHJldHVybiAkcmV0OwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIGdldEJ1ZmZlcigpCi0gIHsKLSAgICByZXR1cm4gJHRoaXMtPmJ1Zl87Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gYXZhaWxhYmxlKCkKLSAgewotICAgIHJldHVybiBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPmJ1Zl8pOwotICB9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvVHJhbnNwb3J0L1ROdWxsVHJhbnNwb3J0LnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9UcmFuc3BvcnQvVE51bGxUcmFuc3BvcnQucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWViN2E0Li4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9UcmFuc3BvcnQvVE51bGxUcmFuc3BvcnQucGhwCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcVHJhbnNwb3J0OwotCi11c2UgVGhyaWZ0XEV4Y2VwdGlvblxUVHJhbnNwb3J0RXhjZXB0aW9uOwotCi0vKioKLSAqIFRyYW5zcG9ydCB0aGF0IG9ubHkgYWNjZXB0cyB3cml0ZXMgYW5kIGlnbm9yZXMgdGhlbS4KLSAqIFRoaXMgaXMgdXNlZnVsIGZvciBtZWFzdXJpbmcgdGhlIHNlcmlhbGl6ZWQgc2l6ZSBvZiBzdHJ1Y3R1cmVzLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotY2xhc3MgVE51bGxUcmFuc3BvcnQgZXh0ZW5kcyBUVHJhbnNwb3J0Ci17Ci0gIHB1YmxpYyBmdW5jdGlvbiBpc09wZW4oKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gb3BlbigpIHt9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkge30KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkbGVuKQotICB7Ci0gICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNhbid0IHJlYWQgZnJvbSBUTnVsbFRyYW5zcG9ydC4iKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkYnVmKSB7fQotCi19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvVHJhbnNwb3J0L1RQaHBTdHJlYW0ucGhwIGIvbGliL3BocC9saWIvVGhyaWZ0L1RyYW5zcG9ydC9UUGhwU3RyZWFtLnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMxNGNkZi4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvVHJhbnNwb3J0L1RQaHBTdHJlYW0ucGhwCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotCi1uYW1lc3BhY2UgVGhyaWZ0XFRyYW5zcG9ydDsKLQotdXNlIFRocmlmdFxFeGNlcHRpb25cVEV4Y2VwdGlvbjsKLXVzZSBUaHJpZnRcRmFjdG9yeVxUU3RyaW5nRnVuY0ZhY3Rvcnk7Ci0KLS8qKgotICogUGhwIHN0cmVhbSB0cmFuc3BvcnQuIFJlYWRzIHRvIGFuZCB3cml0ZXMgZnJvbSB0aGUgcGhwIHN0YW5kYXJkIHN0cmVhbXMKLSAqIHBocDovL2lucHV0IGFuZCBwaHA6Ly9vdXRwdXQKLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0Ci0gKi8KLWNsYXNzIFRQaHBTdHJlYW0gZXh0ZW5kcyBUVHJhbnNwb3J0Ci17Ci0gIGNvbnN0IE1PREVfUiA9IDE7Ci0gIGNvbnN0IE1PREVfVyA9IDI7Ci0KLSAgcHJpdmF0ZSAkaW5TdHJlYW1fID0gbnVsbDsKLQotICBwcml2YXRlICRvdXRTdHJlYW1fID0gbnVsbDsKLQotICBwcml2YXRlICRyZWFkXyA9IGZhbHNlOwotCi0gIHByaXZhdGUgJHdyaXRlXyA9IGZhbHNlOwotCi0gIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkbW9kZSkKLSAgewotICAgICR0aGlzLT5yZWFkXyA9ICRtb2RlICYgc2VsZjo6TU9ERV9SOwotICAgICR0aGlzLT53cml0ZV8gPSAkbW9kZSAmIHNlbGY6Ok1PREVfVzsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiBvcGVuKCkKLSAgewotICAgIGlmICgkdGhpcy0+cmVhZF8pIHsKLSAgICAgICR0aGlzLT5pblN0cmVhbV8gPSBAZm9wZW4oc2VsZjo6aW5TdHJlYW1OYW1lKCksICdyJyk7Ci0gICAgICBpZiAoIWlzX3Jlc291cmNlKCR0aGlzLT5pblN0cmVhbV8pKSB7Ci0gICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCdUUGhwU3RyZWFtOiBDb3VsZCBub3Qgb3BlbiBwaHA6Ly9pbnB1dCcpOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoJHRoaXMtPndyaXRlXykgewotICAgICAgJHRoaXMtPm91dFN0cmVhbV8gPSBAZm9wZW4oJ3BocDovL291dHB1dCcsICd3Jyk7Ci0gICAgICBpZiAoIWlzX3Jlc291cmNlKCR0aGlzLT5vdXRTdHJlYW1fKSkgewotICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbignVFBocFN0cmVhbTogQ291bGQgbm90IG9wZW4gcGhwOi8vb3V0cHV0Jyk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkKLSAgewotICAgIGlmICgkdGhpcy0+cmVhZF8pIHsKLSAgICAgIEBmY2xvc2UoJHRoaXMtPmluU3RyZWFtXyk7Ci0gICAgICAkdGhpcy0+aW5TdHJlYW1fID0gbnVsbDsKLSAgICB9Ci0gICAgaWYgKCR0aGlzLT53cml0ZV8pIHsKLSAgICAgIEBmY2xvc2UoJHRoaXMtPm91dFN0cmVhbV8pOwotICAgICAgJHRoaXMtPm91dFN0cmVhbV8gPSBudWxsOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiBpc09wZW4oKQotICB7Ci0gICAgcmV0dXJuCi0gICAgICAoISR0aGlzLT5yZWFkXyB8fCBpc19yZXNvdXJjZSgkdGhpcy0+aW5TdHJlYW1fKSkgJiYKLSAgICAgICghJHRoaXMtPndyaXRlXyB8fCBpc19yZXNvdXJjZSgkdGhpcy0+b3V0U3RyZWFtXykpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWQoJGxlbikKLSAgewotICAgICRkYXRhID0gQGZyZWFkKCR0aGlzLT5pblN0cmVhbV8sICRsZW4pOwotICAgIGlmICgkZGF0YSA9PT0gRkFMU0UgfHwgJGRhdGEgPT09ICcnKSB7Ci0gICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbignVFBocFN0cmVhbTogQ291bGQgbm90IHJlYWQgJy4kbGVuLicgYnl0ZXMnKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gJGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGJ1ZikKLSAgewotICAgIHdoaWxlIChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJGJ1ZikgPiAwKSB7Ci0gICAgICAkZ290ID0gQGZ3cml0ZSgkdGhpcy0+b3V0U3RyZWFtXywgJGJ1Zik7Ci0gICAgICBpZiAoJGdvdCA9PT0gMCB8fCAkZ290ID09PSBGQUxTRSkgewotICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbignVFBocFN0cmVhbTogQ291bGQgbm90IHdyaXRlICcuVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCRidWYpLicgYnl0ZXMnKTsKLSAgICAgIH0KLSAgICAgICRidWYgPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdWJzdHIoJGJ1ZiwgJGdvdCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIGZsdXNoKCkKLSAgewotICAgIEBmZmx1c2goJHRoaXMtPm91dFN0cmVhbV8pOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaW5TdHJlYW1OYW1lKCkKLSAgewotICAgIGlmIChwaHBfc2FwaV9uYW1lKCkgPT0gJ2NsaScpIHsKLSAgICAgIHJldHVybiAncGhwOi8vc3RkaW4nOwotICAgIH0KLQotICAgIHJldHVybiAncGhwOi8vaW5wdXQnOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9UcmFuc3BvcnQvVFNvY2tldC5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvVHJhbnNwb3J0L1RTb2NrZXQucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjkzNWQ0Li4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9UcmFuc3BvcnQvVFNvY2tldC5waHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMzcgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcVHJhbnNwb3J0OwotCi11c2UgVGhyaWZ0XEV4Y2VwdGlvblxURXhjZXB0aW9uOwotdXNlIFRocmlmdFxFeGNlcHRpb25cVFRyYW5zcG9ydEV4Y2VwdGlvbjsKLXVzZSBUaHJpZnRcRmFjdG9yeVxUU3RyaW5nRnVuY0ZhY3Rvcnk7Ci0KLS8qKgotICogU29ja2V0cyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVFRyYW5zcG9ydCBpbnRlcmZhY2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi1jbGFzcyBUU29ja2V0IGV4dGVuZHMgVFRyYW5zcG9ydAotewotICAvKioKLSAgICogSGFuZGxlIHRvIFBIUCBzb2NrZXQKLSAgICoKLSAgICogQHZhciByZXNvdXJjZQotICAgKi8KLSAgcHJpdmF0ZSAkaGFuZGxlXyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFJlbW90ZSBob3N0bmFtZQotICAgKgotICAgKiBAdmFyIHN0cmluZwotICAgKi8KLSAgcHJvdGVjdGVkICRob3N0XyA9ICdsb2NhbGhvc3QnOwotCi0gIC8qKgotICAgKiBSZW1vdGUgcG9ydAotICAgKgotICAgKiBAdmFyIGludAotICAgKi8KLSAgcHJvdGVjdGVkICRwb3J0XyA9ICc5MDkwJzsKLQotICAvKioKLSAgICogU2VuZCB0aW1lb3V0IGluIHNlY29uZHMuCi0gICAqCi0gICAqIENvbWJpbmVkIHdpdGggc2VuZFRpbWVvdXRVc2VjIHRoaXMgaXMgdXNlZCBmb3Igc2VuZCB0aW1lb3V0cy4KLSAgICoKLSAgICogQHZhciBpbnQKLSAgICovCi0gIHByaXZhdGUgJHNlbmRUaW1lb3V0U2VjXyA9IDA7Ci0KLSAgLyoqCi0gICAqIFNlbmQgdGltZW91dCBpbiBtaWNyb3NlY29uZHMuCi0gICAqCi0gICAqIENvbWJpbmVkIHdpdGggc2VuZFRpbWVvdXRTZWMgdGhpcyBpcyB1c2VkIGZvciBzZW5kIHRpbWVvdXRzLgotICAgKgotICAgKiBAdmFyIGludAotICAgKi8KLSAgcHJpdmF0ZSAkc2VuZFRpbWVvdXRVc2VjXyA9IDEwMDAwMDsKLQotICAvKioKLSAgICogUmVjdiB0aW1lb3V0IGluIHNlY29uZHMKLSAgICoKLSAgICogQ29tYmluZWQgd2l0aCByZWN2VGltZW91dFVzZWMgdGhpcyBpcyB1c2VkIGZvciByZWN2IHRpbWVvdXRzLgotICAgKgotICAgKiBAdmFyIGludAotICAgKi8KLSAgcHJpdmF0ZSAkcmVjdlRpbWVvdXRTZWNfID0gMDsKLQotICAvKioKLSAgICogUmVjdiB0aW1lb3V0IGluIG1pY3Jvc2Vjb25kcwotICAgKgotICAgKiBDb21iaW5lZCB3aXRoIHJlY3ZUaW1lb3V0U2VjIHRoaXMgaXMgdXNlZCBmb3IgcmVjdiB0aW1lb3V0cy4KLSAgICoKLSAgICogQHZhciBpbnQKLSAgICovCi0gIHByaXZhdGUgJHJlY3ZUaW1lb3V0VXNlY18gPSA3NTAwMDA7Ci0KLSAgLyoqCi0gICAqIFBlcnNpc3RlbnQgc29ja2V0IG9yIHBsYWluPwotICAgKgotICAgKiBAdmFyIGJvb2wKLSAgICovCi0gIHByb3RlY3RlZCAkcGVyc2lzdF8gPSBmYWxzZTsKLQotICAvKioKLSAgICogRGVidWdnaW5nIG9uPwotICAgKgotICAgKiBAdmFyIGJvb2wKLSAgICovCi0gIHByb3RlY3RlZCAkZGVidWdfID0gZmFsc2U7Ci0KLSAgLyoqCi0gICAqIERlYnVnIGhhbmRsZXIKLSAgICoKLSAgICogQHZhciBtaXhlZAotICAgKi8KLSAgcHJvdGVjdGVkICRkZWJ1Z0hhbmRsZXJfID0gbnVsbDsKLQotICAvKioKLSAgICogU29ja2V0IGNvbnN0cnVjdG9yCi0gICAqCi0gICAqIEBwYXJhbSBzdHJpbmcgJGhvc3QgICAgICAgICBSZW1vdGUgaG9zdG5hbWUKLSAgICogQHBhcmFtIGludCAgICAkcG9ydCAgICAgICAgIFJlbW90ZSBwb3J0Ci0gICAqIEBwYXJhbSBib29sICAgJHBlcnNpc3QgICAgICBXaGV0aGVyIHRvIHVzZSBhIHBlcnNpc3RlbnQgc29ja2V0Ci0gICAqIEBwYXJhbSBzdHJpbmcgJGRlYnVnSGFuZGxlciBGdW5jdGlvbiB0byBjYWxsIGZvciBlcnJvciBsb2dnaW5nCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGhvc3Q9J2xvY2FsaG9zdCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcG9ydD05MDkwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBlcnNpc3Q9ZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZGVidWdIYW5kbGVyPW51bGwpIHsKLSAgICAkdGhpcy0+aG9zdF8gPSAkaG9zdDsKLSAgICAkdGhpcy0+cG9ydF8gPSAkcG9ydDsKLSAgICAkdGhpcy0+cGVyc2lzdF8gPSAkcGVyc2lzdDsKLSAgICAkdGhpcy0+ZGVidWdIYW5kbGVyXyA9ICRkZWJ1Z0hhbmRsZXIgPyAkZGVidWdIYW5kbGVyIDogJ2Vycm9yX2xvZyc7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHJlc291cmNlICRoYW5kbGUKLSAgICogQHJldHVybiB2b2lkCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gc2V0SGFuZGxlKCRoYW5kbGUpCi0gIHsKLSAgICAkdGhpcy0+aGFuZGxlXyA9ICRoYW5kbGU7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgc2VuZCB0aW1lb3V0LgotICAgKgotICAgKiBAcGFyYW0gaW50ICR0aW1lb3V0ICBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcy4KLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBzZXRTZW5kVGltZW91dCgkdGltZW91dCkKLSAgewotICAgICR0aGlzLT5zZW5kVGltZW91dFNlY18gPSBmbG9vcigkdGltZW91dCAvIDEwMDApOwotICAgICR0aGlzLT5zZW5kVGltZW91dFVzZWNfID0KLSAgICAgICAgICAgICgkdGltZW91dCAtICgkdGhpcy0+c2VuZFRpbWVvdXRTZWNfICogMTAwMCkpICogMTAwMDsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSByZWNlaXZlIHRpbWVvdXQuCi0gICAqCi0gICAqIEBwYXJhbSBpbnQgJHRpbWVvdXQgIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLgotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHNldFJlY3ZUaW1lb3V0KCR0aW1lb3V0KQotICB7Ci0gICAgJHRoaXMtPnJlY3ZUaW1lb3V0U2VjXyA9IGZsb29yKCR0aW1lb3V0IC8gMTAwMCk7Ci0gICAgJHRoaXMtPnJlY3ZUaW1lb3V0VXNlY18gPQotICAgICAgICAgICAgKCR0aW1lb3V0IC0gKCR0aGlzLT5yZWN2VGltZW91dFNlY18gKiAxMDAwKSkgKiAxMDAwOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgZGVidWdnaW5nIG91dHB1dCBvbiBvciBvZmYKLSAgICoKLSAgICogQHBhcmFtIGJvb2wgJGRlYnVnCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gc2V0RGVidWcoJGRlYnVnKQotICB7Ci0gICAgJHRoaXMtPmRlYnVnXyA9ICRkZWJ1ZzsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGhvc3QgdGhhdCB0aGlzIHNvY2tldCBpcyBjb25uZWN0ZWQgdG8KLSAgICoKLSAgICogQHJldHVybiBzdHJpbmcgaG9zdAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIGdldEhvc3QoKQotICB7Ci0gICAgcmV0dXJuICR0aGlzLT5ob3N0XzsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIHJlbW90ZSBwb3J0IHRoYXQgdGhpcyBzb2NrZXQgaXMgY29ubmVjdGVkIHRvCi0gICAqCi0gICAqIEByZXR1cm4gaW50IHBvcnQKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBnZXRQb3J0KCkKLSAgewotICAgIHJldHVybiAkdGhpcy0+cG9ydF87Ci0gIH0KLQotICAvKioKLSAgICogVGVzdHMgd2hldGhlciB0aGlzIGlzIG9wZW4KLSAgICoKLSAgICogQHJldHVybiBib29sIHRydWUgaWYgdGhlIHNvY2tldCBpcyBvcGVuCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gaXNPcGVuKCkKLSAgewotICAgIHJldHVybiBpc19yZXNvdXJjZSgkdGhpcy0+aGFuZGxlXyk7Ci0gIH0KLQotICAvKioKLSAgICogQ29ubmVjdHMgdGhlIHNvY2tldC4KLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBvcGVuKCkKLSAgewotICAgIGlmICgkdGhpcy0+aXNPcGVuKCkpIHsKLSAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCdTb2NrZXQgYWxyZWFkeSBjb25uZWN0ZWQnLCBUVHJhbnNwb3J0RXhjZXB0aW9uOjpBTFJFQURZX09QRU4pOwotICAgIH0KLQotICAgIGlmIChlbXB0eSgkdGhpcy0+aG9zdF8pKSB7Ci0gICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignQ2Fubm90IG9wZW4gbnVsbCBob3N0JywgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pOwotICAgIH0KLQotICAgIGlmICgkdGhpcy0+cG9ydF8gPD0gMCkgewotICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ0Nhbm5vdCBvcGVuIHdpdGhvdXQgcG9ydCcsIFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKTsKLSAgICB9Ci0KLSAgICBpZiAoJHRoaXMtPnBlcnNpc3RfKSB7Ci0gICAgICAkdGhpcy0+aGFuZGxlXyA9IEBwZnNvY2tvcGVuKCR0aGlzLT5ob3N0XywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnBvcnRfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZXJybm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRlcnJzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5zZW5kVGltZW91dFNlY18gKyAoJHRoaXMtPnNlbmRUaW1lb3V0VXNlY18gLyAxMDAwMDAwKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICR0aGlzLT5oYW5kbGVfID0gQGZzb2Nrb3BlbigkdGhpcy0+aG9zdF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnBvcnRfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRlcnJubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZXJyc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5zZW5kVGltZW91dFNlY18gKyAoJHRoaXMtPnNlbmRUaW1lb3V0VXNlY18gLyAxMDAwMDAwKSk7Ci0gICAgfQotCi0gICAgLy8gQ29ubmVjdCBmYWlsZWQ/Ci0gICAgaWYgKCR0aGlzLT5oYW5kbGVfID09PSBGQUxTRSkgewotICAgICAgJGVycm9yID0gJ1RTb2NrZXQ6IENvdWxkIG5vdCBjb25uZWN0IHRvICcuJHRoaXMtPmhvc3RfLic6Jy4kdGhpcy0+cG9ydF8uJyAoJy4kZXJyc3RyLicgWycuJGVycm5vLiddKSc7Ci0gICAgICBpZiAoJHRoaXMtPmRlYnVnXykgewotICAgICAgICBjYWxsX3VzZXJfZnVuYygkdGhpcy0+ZGVidWdIYW5kbGVyXywgJGVycm9yKTsKLSAgICAgIH0KLSAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCRlcnJvcik7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIENsb3NlcyB0aGUgc29ja2V0LgotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkKLSAgewotICAgIGlmICghJHRoaXMtPnBlcnNpc3RfKSB7Ci0gICAgICBAZmNsb3NlKCR0aGlzLT5oYW5kbGVfKTsKLSAgICAgICR0aGlzLT5oYW5kbGVfID0gbnVsbDsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmVhZCBmcm9tIHRoZSBzb2NrZXQgYXQgbW9zdCAkbGVuIGJ5dGVzLgotICAgKgotICAgKiBUaGlzIG1ldGhvZCB3aWxsIG5vdCB3YWl0IGZvciBhbGwgdGhlIHJlcXVlc3RlZCBkYXRhLCBpdCB3aWxsIHJldHVybiBhcwotICAgKiBzb29uIGFzIGFueSBkYXRhIGlzIHJlY2VpdmVkLgotICAgKgotICAgKiBAcGFyYW0gaW50ICRsZW4gTWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC4KLSAgICogQHJldHVybiBzdHJpbmcgQmluYXJ5IGRhdGEKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkKCRsZW4pCi0gIHsKLSAgICAkbnVsbCA9IG51bGw7Ci0gICAgJHJlYWQgPSBhcnJheSgkdGhpcy0+aGFuZGxlXyk7Ci0gICAgJHJlYWRhYmxlID0gQHN0cmVhbV9zZWxlY3QoJHJlYWQsICRudWxsLCAkbnVsbCwgJHRoaXMtPnJlY3ZUaW1lb3V0U2VjXywgJHRoaXMtPnJlY3ZUaW1lb3V0VXNlY18pOwotCi0gICAgaWYgKCRyZWFkYWJsZSA+IDApIHsKLSAgICAgICRkYXRhID0gQHN0cmVhbV9zb2NrZXRfcmVjdmZyb20oJHRoaXMtPmhhbmRsZV8sICRsZW4pOwotICAgICAgaWYgKCRkYXRhID09PSBmYWxzZSkgewotICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCdUU29ja2V0OiBDb3VsZCBub3QgcmVhZCAnLiRsZW4uJyBieXRlcyBmcm9tICcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfLic6Jy4kdGhpcy0+cG9ydF8pOwotICAgICAgfSBlbHNlaWYgKCRkYXRhID09ICcnICYmIGZlb2YoJHRoaXMtPmhhbmRsZV8pKSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1RTb2NrZXQgcmVhZCAwIGJ5dGVzJyk7Ci0gICAgICAgIH0KLQotICAgICAgcmV0dXJuICRkYXRhOwotICAgIH0gZWxzZWlmICgkcmVhZGFibGUgPT09IDApIHsKLSAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1RTb2NrZXQ6IHRpbWVkIG91dCByZWFkaW5nICcuJGxlbi4nIGJ5dGVzIGZyb20gJy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfLic6Jy4kdGhpcy0+cG9ydF8pOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1RTb2NrZXQ6IENvdWxkIG5vdCByZWFkICcuJGxlbi4nIGJ5dGVzIGZyb20gJy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfLic6Jy4kdGhpcy0+cG9ydF8pOwotICAgICAgfQotICAgIH0KLQotICAvKioKLSAgICogV3JpdGUgdG8gdGhlIHNvY2tldC4KLSAgICoKLSAgICogQHBhcmFtIHN0cmluZyAkYnVmIFRoZSBkYXRhIHRvIHdyaXRlCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGJ1ZikKLSAgewotICAgICRudWxsID0gbnVsbDsKLSAgICAkd3JpdGUgPSBhcnJheSgkdGhpcy0+aGFuZGxlXyk7Ci0KLSAgICAvLyBrZWVwIHdyaXRpbmcgdW50aWwgYWxsIHRoZSBkYXRhIGhhcyBiZWVuIHdyaXR0ZW4KLSAgICB3aGlsZSAoVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCRidWYpID4gMCkgewotICAgICAgLy8gd2FpdCBmb3Igc3RyZWFtIHRvIGJlY29tZSBhdmFpbGFibGUgZm9yIHdyaXRpbmcKLSAgICAgICR3cml0YWJsZSA9IEBzdHJlYW1fc2VsZWN0KCRudWxsLCAkd3JpdGUsICRudWxsLCAkdGhpcy0+c2VuZFRpbWVvdXRTZWNfLCAkdGhpcy0+c2VuZFRpbWVvdXRVc2VjXyk7Ci0gICAgICBpZiAoJHdyaXRhYmxlID4gMCkgewotICAgICAgICAvLyB3cml0ZSBidWZmZXIgdG8gc3RyZWFtCi0gICAgICAgICR3cml0dGVuID0gQHN0cmVhbV9zb2NrZXRfc2VuZHRvKCR0aGlzLT5oYW5kbGVfLCAkYnVmKTsKLSAgICAgICAgaWYgKCR3cml0dGVuID09PSAtMSB8fCAkd3JpdHRlbiA9PT0gZmFsc2UpIHsKLSAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignVFNvY2tldDogQ291bGQgbm90IHdyaXRlICcuVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCRidWYpLicgYnl0ZXMgJy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfLic6Jy4kdGhpcy0+cG9ydF8pOwotICAgICAgICB9Ci0gICAgICAgIC8vIGRldGVybWluZSBob3cgbXVjaCBvZiB0aGUgYnVmZmVyIGlzIGxlZnQgdG8gd3JpdGUKLSAgICAgICAgJGJ1ZiA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN1YnN0cigkYnVmLCAkd3JpdHRlbik7Ci0gICAgICB9IGVsc2VpZiAoJHdyaXRhYmxlID09PSAwKSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1RTb2NrZXQ6IHRpbWVkIG91dCB3cml0aW5nICcuVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCRidWYpLicgYnl0ZXMgZnJvbSAnLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5ob3N0Xy4nOicuJHRoaXMtPnBvcnRfKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCdUU29ja2V0OiBDb3VsZCBub3Qgd3JpdGUgJy5UU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJGJ1ZikuJyBieXRlcyAnLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfLic6Jy4kdGhpcy0+cG9ydF8pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gIC8qKgotICAgKiBGbHVzaCBvdXRwdXQgdG8gdGhlIHNvY2tldC4KLSAgICoKLSAgICogU2luY2UgcmVhZCgpLCByZWFkQWxsKCkgYW5kIHdyaXRlKCkgb3BlcmF0ZSBvbiB0aGUgc29ja2V0cyBkaXJlY3RseSwKLSAgICogdGhpcyBpcyBhIG5vLW9wCi0gICAqCi0gICAqIElmIHlvdSB3aXNoIHRvIGhhdmUgZmx1c2hhYmxlIGJ1ZmZlcmluZyBiZWhhdmlvdXIsIHdyYXAgdGhpcyBUU29ja2V0Ci0gICAqIGluIGEgVEJ1ZmZlcmVkVHJhbnNwb3J0LgotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIGZsdXNoKCkKLSAgewotICAgIC8vIG5vLW9wCi0gICAgfQotICB9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvVHJhbnNwb3J0L1RTb2NrZXRQb29sLnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9UcmFuc3BvcnQvVFNvY2tldFBvb2wucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGZmZDhkLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9UcmFuc3BvcnQvVFNvY2tldFBvb2wucGhwCisrKyAvZGV2L251bGwKQEAgLTEsMzAwICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotCi1uYW1lc3BhY2UgVGhyaWZ0XFRyYW5zcG9ydDsKLQotdXNlIFRocmlmdFxFeGNlcHRpb25cVEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBUaGlzIGxpYnJhcnkgbWFrZXMgdXNlIG9mIEFQQyBjYWNoZSB0byBtYWtlIGhvc3RzIGFzIGRvd24gaW4gYSB3ZWIKLSAqIGVudmlyb25tZW50LiBJZiB5b3UgYXJlIHJ1bm5pbmcgZnJvbSB0aGUgQ0xJIG9yIG9uIGEgc3lzdGVtIHdpdGhvdXQgQVBDCi0gKiBpbnN0YWxsZWQsIHRoZW4gdGhlc2UgbnVsbCBmdW5jdGlvbnMgd2lsbCBzdGVwIGluIGFuZCBhY3QgbGlrZSBjYWNoZQotICogbWlzc2VzLgotICovCi1pZiAoIWZ1bmN0aW9uX2V4aXN0cygnYXBjX2ZldGNoJykpIHsKLSAgZnVuY3Rpb24gYXBjX2ZldGNoKCRrZXkpIHsgcmV0dXJuIEZBTFNFOyB9Ci0gIGZ1bmN0aW9uIGFwY19zdG9yZSgka2V5LCAkdmFyLCAkdHRsPTApIHsgcmV0dXJuIEZBTFNFOyB9Ci19Ci0KLS8qKgotICogU29ja2V0cyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVFRyYW5zcG9ydCBpbnRlcmZhY2UgdGhhdCBhbGxvd3MgY29ubmVjdGlvbgotICogdG8gYSBwb29sIG9mIHNlcnZlcnMuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi1jbGFzcyBUU29ja2V0UG9vbCBleHRlbmRzIFRTb2NrZXQKLXsKLSAgLyoqCi0gICAqIFJlbW90ZSBzZXJ2ZXJzLiBBcnJheSBvZiBhc3NvY2lhdGl2ZSBhcnJheXMgd2l0aCAnaG9zdCcgYW5kICdwb3J0JyBrZXlzCi0gICAqLwotICBwcml2YXRlICRzZXJ2ZXJzXyA9IGFycmF5KCk7Ci0KLSAgLyoqCi0gICAqIEhvdyBtYW55IHRpbWVzIHRvIHJldHJ5IGVhY2ggaG9zdCBpbiBjb25uZWN0Ci0gICAqCi0gICAqIEB2YXIgaW50Ci0gICAqLwotICBwcml2YXRlICRudW1SZXRyaWVzXyA9IDE7Ci0KLSAgLyoqCi0gICAqIFJldHJ5IGludGVydmFsIGluIHNlY29uZHMsIGhvdyBsb25nIHRvIG5vdCB0cnkgYSBob3N0IGlmIGl0IGhhcyBiZWVuCi0gICAqIG1hcmtlZCBhcyBkb3duLgotICAgKgotICAgKiBAdmFyIGludAotICAgKi8KLSAgcHJpdmF0ZSAkcmV0cnlJbnRlcnZhbF8gPSA2MDsKLQotICAvKioKLSAgICogTWF4IGNvbnNlY3V0aXZlIGZhaWx1cmVzIGJlZm9yZSBtYXJraW5nIGEgaG9zdCBkb3duLgotICAgKgotICAgKiBAdmFyIGludAotICAgKi8KLSAgcHJpdmF0ZSAkbWF4Q29uc2VjdXRpdmVGYWlsdXJlc18gPSAxOwotCi0gIC8qKgotICAgKiBUcnkgaG9zdHMgaW4gb3JkZXI/IG9yIFJhbmRvbWl6ZWQ/Ci0gICAqCi0gICAqIEB2YXIgYm9vbAotICAgKi8KLSAgcHJpdmF0ZSAkcmFuZG9taXplXyA9IHRydWU7Ci0KLSAgLyoqCi0gICAqIEFsd2F5cyB0cnkgbGFzdCBob3N0LCBldmVuIGlmIG1hcmtlZCBkb3duPwotICAgKgotICAgKiBAdmFyIGJvb2wKLSAgICovCi0gIHByaXZhdGUgJGFsd2F5c1RyeUxhc3RfID0gdHJ1ZTsKLQotICAvKioKLSAgICogU29ja2V0IHBvb2wgY29uc3RydWN0b3IKLSAgICoKLSAgICogQHBhcmFtIGFycmF5ICAkaG9zdHMgICAgICAgIExpc3Qgb2YgcmVtb3RlIGhvc3RuYW1lcwotICAgKiBAcGFyYW0gbWl4ZWQgICRwb3J0cyAgICAgICAgQXJyYXkgb2YgcmVtb3RlIHBvcnRzLCBvciBhIHNpbmdsZSBjb21tb24gcG9ydAotICAgKiBAcGFyYW0gYm9vbCAgICRwZXJzaXN0ICAgICAgV2hldGhlciB0byB1c2UgYSBwZXJzaXN0ZW50IHNvY2tldAotICAgKiBAcGFyYW0gbWl4ZWQgICRkZWJ1Z0hhbmRsZXIgRnVuY3Rpb24gZm9yIGVycm9yIGxvZ2dpbmcKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkaG9zdHM9YXJyYXkoJ2xvY2FsaG9zdCcpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBvcnRzPWFycmF5KDkwOTApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBlcnNpc3Q9ZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZGVidWdIYW5kbGVyPW51bGwpIHsKLSAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KG51bGwsIDAsICRwZXJzaXN0LCAkZGVidWdIYW5kbGVyKTsKLQotICAgIGlmICghaXNfYXJyYXkoJHBvcnRzKSkgewotICAgICAgJHBvcnQgPSAkcG9ydHM7Ci0gICAgICAkcG9ydHMgPSBhcnJheSgpOwotICAgICAgZm9yZWFjaCAoJGhvc3RzIGFzICRrZXkgPT4gJHZhbCkgewotICAgICAgICAkcG9ydHNbJGtleV0gPSAkcG9ydDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3JlYWNoICgkaG9zdHMgYXMgJGtleSA9PiAkaG9zdCkgewotICAgICAgJHRoaXMtPnNlcnZlcnNfIFtdPSBhcnJheSgnaG9zdCcgPT4gJGhvc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwb3J0JyA9PiAkcG9ydHNbJGtleV0pOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBBZGQgYSBzZXJ2ZXIgdG8gdGhlIHBvb2wKLSAgICoKLSAgICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBwcmV2ZW50IHlvdSBmcm9tIGFkZGluZyBhIGR1cGxpY2F0ZSBzZXJ2ZXIgZW50cnkuCi0gICAqCi0gICAqIEBwYXJhbSBzdHJpbmcgJGhvc3QgaG9zdG5hbWUgb3IgSVAKLSAgICogQHBhcmFtIGludCAkcG9ydCBwb3J0Ci0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gYWRkU2VydmVyKCRob3N0LCAkcG9ydCkKLSAgewotICAgICR0aGlzLT5zZXJ2ZXJzX1tdID0gYXJyYXkoJ2hvc3QnID0+ICRob3N0LCAncG9ydCcgPT4gJHBvcnQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgaG93IG1hbnkgdGltZSB0byBrZWVwIHJldHJ5aW5nIGEgaG9zdCBpbiB0aGUgY29ubmVjdCBmdW5jdGlvbi4KLSAgICoKLSAgICogQHBhcmFtIGludCAkbnVtUmV0cmllcwotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHNldE51bVJldHJpZXMoJG51bVJldHJpZXMpCi0gIHsKLSAgICAkdGhpcy0+bnVtUmV0cmllc18gPSAkbnVtUmV0cmllczsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIGhvdyBsb25nIHRvIHdhaXQgdW50aWwgcmV0cnlpbmcgYSBob3N0IGlmIGl0IHdhcyBtYXJrZWQgZG93bgotICAgKgotICAgKiBAcGFyYW0gaW50ICRudW1SZXRyaWVzCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gc2V0UmV0cnlJbnRlcnZhbCgkcmV0cnlJbnRlcnZhbCkKLSAgewotICAgICR0aGlzLT5yZXRyeUludGVydmFsXyA9ICRyZXRyeUludGVydmFsOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgaG93IG1hbnkgdGltZSB0byBrZWVwIHJldHJ5aW5nIGEgaG9zdCBiZWZvcmUgbWFya2luZyBpdCBhcyBkb3duLgotICAgKgotICAgKiBAcGFyYW0gaW50ICRudW1SZXRyaWVzCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gc2V0TWF4Q29uc2VjdXRpdmVGYWlsdXJlcygkbWF4Q29uc2VjdXRpdmVGYWlsdXJlcykKLSAgewotICAgICR0aGlzLT5tYXhDb25zZWN1dGl2ZUZhaWx1cmVzXyA9ICRtYXhDb25zZWN1dGl2ZUZhaWx1cmVzOwotICB9Ci0KLSAgLyoqCi0gICAqIFR1cm5zIHJhbmRvbWl6YXRpb24gaW4gY29ubmVjdCBvcmRlciBvbiBvciBvZmYuCi0gICAqCi0gICAqIEBwYXJhbSBib29sICRyYW5kb21pemUKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBzZXRSYW5kb21pemUoJHJhbmRvbWl6ZSkKLSAgewotICAgICR0aGlzLT5yYW5kb21pemVfID0gJHJhbmRvbWl6ZTsKLSAgfQotCi0gIC8qKgotICAgKiBXaGV0aGVyIHRvIGFsd2F5cyB0cnkgdGhlIGxhc3Qgc2VydmVyLgotICAgKgotICAgKiBAcGFyYW0gYm9vbCAkYWx3YXlzVHJ5TGFzdAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHNldEFsd2F5c1RyeUxhc3QoJGFsd2F5c1RyeUxhc3QpCi0gIHsKLSAgICAkdGhpcy0+YWx3YXlzVHJ5TGFzdF8gPSAkYWx3YXlzVHJ5TGFzdDsKLSAgfQotCi0gIC8qKgotICAgKiBDb25uZWN0cyB0aGUgc29ja2V0IGJ5IGl0ZXJhdGluZyB0aHJvdWdoIGFsbCB0aGUgc2VydmVycyBpbiB0aGUgcG9vbAotICAgKiBhbmQgdHJ5aW5nIHRvIGZpbmQgb25lIHRoYXQgd29ya3MuCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gb3BlbigpCi0gIHsKLSAgICAvLyBDaGVjayBpZiB3ZSB3YW50IG9yZGVyIHJhbmRvbWl6YXRpb24KLSAgICBpZiAoJHRoaXMtPnJhbmRvbWl6ZV8pIHsKLSAgICAgIHNodWZmbGUoJHRoaXMtPnNlcnZlcnNfKTsKLSAgICB9Ci0KLSAgICAvLyBDb3VudCBzZXJ2ZXJzIHRvIGlkZW50aWZ5IHRoZSAibGFzdCIgb25lCi0gICAgJG51bVNlcnZlcnMgPSBjb3VudCgkdGhpcy0+c2VydmVyc18pOwotCi0gICAgZm9yICgkaSA9IDA7ICRpIDwgJG51bVNlcnZlcnM7ICsrJGkpIHsKLQotICAgICAgLy8gVGhpcyBleHRyYWN0cyB0aGUgJGhvc3QgYW5kICRwb3J0IHZhcmlhYmxlcwotICAgICAgZXh0cmFjdCgkdGhpcy0+c2VydmVyc19bJGldKTsKLQotICAgICAgLy8gQ2hlY2sgQVBDIGNhY2hlIGZvciBhIHJlY29yZCBvZiB0aGlzIHNlcnZlciBiZWluZyBkb3duCi0gICAgICAkZmFpbHRpbWVLZXkgPSAndGhyaWZ0X2ZhaWx0aW1lOicuJGhvc3QuJzonLiRwb3J0Lid+JzsKLQotICAgICAgLy8gQ2FjaGUgbWlzcz8gQXNzdW1lIGl0J3MgT0sKLSAgICAgICRsYXN0RmFpbHRpbWUgPSBhcGNfZmV0Y2goJGZhaWx0aW1lS2V5KTsKLSAgICAgIGlmICgkbGFzdEZhaWx0aW1lID09PSBGQUxTRSkgewotICAgICAgICAkbGFzdEZhaWx0aW1lID0gMDsKLSAgICAgIH0KLQotICAgICAgJHJldHJ5SW50ZXJ2YWxQYXNzZWQgPSBmYWxzZTsKLQotICAgICAgLy8gQ2FjaGUgaGl0Li4ubWFrZSBzdXJlIGVub3VnaCB0aGUgcmV0cnkgaW50ZXJ2YWwgaGFzIGVsYXBzZWQKLSAgICAgIGlmICgkbGFzdEZhaWx0aW1lID4gMCkgewotICAgICAgICAkZWxhcHNlZCA9IHRpbWUoKSAtICRsYXN0RmFpbHRpbWU7Ci0gICAgICAgIGlmICgkZWxhcHNlZCA+ICR0aGlzLT5yZXRyeUludGVydmFsXykgewotICAgICAgICAgICRyZXRyeUludGVydmFsUGFzc2VkID0gdHJ1ZTsKLSAgICAgICAgICBpZiAoJHRoaXMtPmRlYnVnXykgewotICAgICAgICAgICAgY2FsbF91c2VyX2Z1bmMoJHRoaXMtPmRlYnVnSGFuZGxlcl8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAnVFNvY2tldFBvb2w6IHJldHJ5SW50ZXJ2YWwgJy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICcoJy4kdGhpcy0+cmV0cnlJbnRlcnZhbF8uJykgJy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICdoYXMgcGFzc2VkIGZvciBob3N0ICcuJGhvc3QuJzonLiRwb3J0KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gT25seSBjb25uZWN0IGlmIG5vdCBpbiB0aGUgbWlkZGxlIG9mIGEgZmFpbCBpbnRlcnZhbCwgT1IgaWYgdGhpcwotICAgICAgLy8gaXMgdGhlIExBU1Qgc2VydmVyIHdlIGFyZSB0cnlpbmcsIGp1c3QgaGFtbWVyIGF3YXkgb24gaXQKLSAgICAgICRpc0xhc3RTZXJ2ZXIgPSBmYWxzZTsKLSAgICAgIGlmICgkdGhpcy0+YWx3YXlzVHJ5TGFzdF8pIHsKLSAgICAgICAgJGlzTGFzdFNlcnZlciA9ICgkaSA9PSAoJG51bVNlcnZlcnMgLSAxKSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmICgoJGxhc3RGYWlsdGltZSA9PT0gMCkgfHwKLSAgICAgICAgICAoJGlzTGFzdFNlcnZlcikgfHwKLSAgICAgICAgICAoJGxhc3RGYWlsdGltZSA+IDAgJiYgJHJldHJ5SW50ZXJ2YWxQYXNzZWQpKSB7Ci0KLSAgICAgICAgLy8gU2V0IHVuZGVybHlpbmcgVFNvY2tldCBwYXJhbXMgdG8gdGhpcyBvbmUKLSAgICAgICAgJHRoaXMtPmhvc3RfID0gJGhvc3Q7Ci0gICAgICAgICR0aGlzLT5wb3J0XyA9ICRwb3J0OwotCi0gICAgICAgIC8vIFRyeSB1cCB0byBudW1SZXRyaWVzXyBjb25uZWN0aW9ucyBwZXIgc2VydmVyCi0gICAgICAgIGZvciAoJGF0dGVtcHQgPSAwOyAkYXR0ZW1wdCA8ICR0aGlzLT5udW1SZXRyaWVzXzsgJGF0dGVtcHQrKykgewotICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBVc2UgdGhlIHVuZGVybHlpbmcgVFNvY2tldCBvcGVuIGZ1bmN0aW9uCi0gICAgICAgICAgICBwYXJlbnQ6Om9wZW4oKTsKLQotICAgICAgICAgICAgLy8gT25seSBjbGVhciB0aGUgZmFpbHVyZSBjb3VudHMgaWYgcmVxdWlyZWQgdG8gZG8gc28KLSAgICAgICAgICAgIGlmICgkbGFzdEZhaWx0aW1lID4gMCkgewotICAgICAgICAgICAgICBhcGNfc3RvcmUoJGZhaWx0aW1lS2V5LCAwKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gU3VjY2Vzc2Z1bCBjb25uZWN0aW9uLCByZXR1cm4gbm93Ci0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICB9IGNhdGNoIChURXhjZXB0aW9uICR0eCkgewotICAgICAgICAgICAgLy8gQ29ubmVjdGlvbiBmYWlsZWQKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBNYXJrIGZhaWx1cmUgb2YgdGhpcyBob3N0IGluIHRoZSBjYWNoZQotICAgICAgICAkY29uc2VjZmFpbHNLZXkgPSAndGhyaWZ0X2NvbnNlY2ZhaWxzOicuJGhvc3QuJzonLiRwb3J0Lid+JzsKLQotICAgICAgICAvLyBJZ25vcmUgY2FjaGUgbWlzc2VzCi0gICAgICAgICRjb25zZWNmYWlscyA9IGFwY19mZXRjaCgkY29uc2VjZmFpbHNLZXkpOwotICAgICAgICBpZiAoJGNvbnNlY2ZhaWxzID09PSBGQUxTRSkgewotICAgICAgICAgICRjb25zZWNmYWlscyA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJbmNyZW1lbnQgYnkgb25lCi0gICAgICAgICRjb25zZWNmYWlscysrOwotCi0gICAgICAgIC8vIExvZyBhbmQgY2FjaGUgdGhpcyBmYWlsdXJlCi0gICAgICAgIGlmICgkY29uc2VjZmFpbHMgPj0gJHRoaXMtPm1heENvbnNlY3V0aXZlRmFpbHVyZXNfKSB7Ci0gICAgICAgICAgaWYgKCR0aGlzLT5kZWJ1Z18pIHsKLSAgICAgICAgICAgIGNhbGxfdXNlcl9mdW5jKCR0aGlzLT5kZWJ1Z0hhbmRsZXJfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RTb2NrZXRQb29sOiBtYXJraW5nICcuJGhvc3QuJzonLiRwb3J0LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgJyBhcyBkb3duIGZvciAnLiR0aGlzLT5yZXRyeUludGVydmFsXy4nIHNlY3MgJy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICdhZnRlciAnLiRjb25zZWNmYWlscy4nIGZhaWxlZCBhdHRlbXB0cy4nKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgLy8gU3RvcmUgdGhlIGZhaWx1cmUgdGltZQotICAgICAgICAgIGFwY19zdG9yZSgkZmFpbHRpbWVLZXksIHRpbWUoKSk7Ci0KLSAgICAgICAgICAvLyBDbGVhciB0aGUgY291bnQgb2YgY29uc2VjdXRpdmUgZmFpbHVyZXMKLSAgICAgICAgICBhcGNfc3RvcmUoJGNvbnNlY2ZhaWxzS2V5LCAwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBhcGNfc3RvcmUoJGNvbnNlY2ZhaWxzS2V5LCAkY29uc2VjZmFpbHMpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gT2ggbm87IHdlIGZhaWxlZCB0aGVtIGFsbC4gVGhlIHN5c3RlbSBpcyB0b3RhbGx5IGlsbCEKLSAgICAkZXJyb3IgPSAnVFNvY2tldFBvb2w6IEFsbCBob3N0cyBpbiBwb29sIGFyZSBkb3duLiAnOwotICAgICRob3N0cyA9IGFycmF5KCk7Ci0gICAgZm9yZWFjaCAoJHRoaXMtPnNlcnZlcnNfIGFzICRzZXJ2ZXIpIHsKLSAgICAgICRob3N0cyBbXT0gJHNlcnZlclsnaG9zdCddLic6Jy4kc2VydmVyWydwb3J0J107Ci0gICAgfQotICAgICRob3N0bGlzdCA9IGltcGxvZGUoJywnLCAkaG9zdHMpOwotICAgICRlcnJvciAuPSAnKCcuJGhvc3RsaXN0LicpJzsKLSAgICBpZiAoJHRoaXMtPmRlYnVnXykgewotICAgICAgY2FsbF91c2VyX2Z1bmMoJHRoaXMtPmRlYnVnSGFuZGxlcl8sICRlcnJvcik7Ci0gICAgfQotICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCRlcnJvcik7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9UcmFuc3BvcnQvVFRyYW5zcG9ydC5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvVHJhbnNwb3J0L1RUcmFuc3BvcnQucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWMzOWZmLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9UcmFuc3BvcnQvVFRyYW5zcG9ydC5waHAKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0Ci0gKi8KLQotbmFtZXNwYWNlIFRocmlmdFxUcmFuc3BvcnQ7Ci0KLXVzZSBUaHJpZnRcRmFjdG9yeVxUU3RyaW5nRnVuY0ZhY3Rvcnk7Ci0KLS8qKgotICogQmFzZSBpbnRlcmZhY2UgZm9yIGEgdHJhbnNwb3J0IGFnZW50LgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotYWJzdHJhY3QgY2xhc3MgVFRyYW5zcG9ydAotewotICAvKioKLSAgICogV2hldGhlciB0aGlzIHRyYW5zcG9ydCBpcyBvcGVuLgotICAgKgotICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBvcGVuCi0gICAqLwotICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gaXNPcGVuKCk7Ci0KLSAgLyoqCi0gICAqIE9wZW4gdGhlIHRyYW5zcG9ydCBmb3IgcmVhZGluZy93cml0aW5nCi0gICAqCi0gICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBjYW5ub3Qgb3BlbgotICAgKi8KLSAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIG9wZW4oKTsKLQotICAvKioKLSAgICogQ2xvc2UgdGhlIHRyYW5zcG9ydC4KLSAgICovCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBjbG9zZSgpOwotCi0gIC8qKgotICAgKiBSZWFkIHNvbWUgZGF0YSBpbnRvIHRoZSBhcnJheS4KLSAgICoKLSAgICogQHBhcmFtIGludCAgICAkbGVuIEhvdyBtdWNoIHRvIHJlYWQKLSAgICogQHJldHVybiBzdHJpbmcgVGhlIGRhdGEgdGhhdCBoYXMgYmVlbiByZWFkCi0gICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBjYW5ub3QgcmVhZCBhbnkgbW9yZSBkYXRhCi0gICAqLwotICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkbGVuKTsKLQotICAvKioKLSAgICogR3VhcmFudGVlcyB0aGF0IHRoZSBmdWxsIGFtb3VudCBvZiBkYXRhIGlzIHJlYWQuCi0gICAqCi0gICAqIEByZXR1cm4gc3RyaW5nIFRoZSBkYXRhLCBvZiBleGFjdCBsZW5ndGgKLSAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGNhbm5vdCByZWFkIGRhdGEKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkQWxsKCRsZW4pCi0gIHsKLSAgICAvLyByZXR1cm4gJHRoaXMtPnJlYWQoJGxlbik7Ci0KLSAgICAkZGF0YSA9ICcnOwotICAgICRnb3QgPSAwOwotICAgIHdoaWxlICgoJGdvdCA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkZGF0YSkpIDwgJGxlbikgewotICAgICAgJGRhdGEgLj0gJHRoaXMtPnJlYWQoJGxlbiAtICRnb3QpOwotICAgIH0KLQotICAgIHJldHVybiAkZGF0YTsKLSAgfQotCi0gIC8qKgotICAgKiBXcml0ZXMgdGhlIGdpdmVuIGRhdGEgb3V0LgotICAgKgotICAgKiBAcGFyYW0gc3RyaW5nICRidWYgIFRoZSBkYXRhIHRvIHdyaXRlCi0gICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiB3cml0aW5nIGZhaWxzCi0gICAqLwotICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGJ1Zik7Ci0KLSAgLyoqCi0gICAqIEZsdXNoZXMgYW55IHBlbmRpbmcgZGF0YSBvdXQgb2YgYSBidWZmZXIKLSAgICoKLSAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGEgd3JpdGluZyBlcnJvciBvY2N1cnMKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBmbHVzaCgpIHt9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvVHlwZS9UQ29uc3RhbnQucGhwIGIvbGliL3BocC9saWIvVGhyaWZ0L1R5cGUvVENvbnN0YW50LnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M4ZWNlYi4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvVHlwZS9UQ29uc3RhbnQucGhwCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0Ci0gKi8KLQotbmFtZXNwYWNlIFRocmlmdFxUeXBlOwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIGNvbnN0YW50IE1hbmFnZW1lbnQKLSAqLwotYWJzdHJhY3QgY2xhc3MgVENvbnN0YW50Ci17Ci0gICAgLyoqCi0gICAgICogRG9uJ3QgaW5zdGFuY2lhdGUgdGhpcyBjbGFzcwotICAgICAqLwotICAgIHByb3RlY3RlZCBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpIHt9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBjb25zdGFudCB2YWx1ZQotICAgICAqIEBwYXJhbSAgc3RyaW5nICRjb25zdGFudAotICAgICAqIEByZXR1cm4gbWl4ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldCgkY29uc3RhbnQpCi0gICAgewotICAgICAgICBpZiAoaXNfbnVsbChzdGF0aWM6OiQkY29uc3RhbnQpKSB7Ci0gICAgICAgICAgICBzdGF0aWM6OiQkY29uc3RhbnQgPSBjYWxsX3VzZXJfZnVuYygKLSAgICAgICAgICAgICAgICAgICAgc3ByaW50Zignc3RhdGljOjppbml0XyVzJywgJGNvbnN0YW50KQotICAgICAgICAgICAgICAgICk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3RhdGljOjokJGNvbnN0YW50OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9UeXBlL1RNZXNzYWdlVHlwZS5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvVHlwZS9UTWVzc2FnZVR5cGUucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmYyMjRmLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9UeXBlL1RNZXNzYWdlVHlwZS5waHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQKLSAqLwotCi1uYW1lc3BhY2UgVGhyaWZ0XFR5cGU7Ci0KLS8qKgotICogTWVzc2FnZSB0eXBlcyBmb3IgUlBDCi0gKi8KLWNsYXNzIFRNZXNzYWdlVHlwZQotewotICBjb25zdCBDQUxMICA9IDE7Ci0gIGNvbnN0IFJFUExZID0gMjsKLSAgY29uc3QgRVhDRVBUSU9OID0gMzsKLSAgY29uc3QgT05FV0FZID0gNDsKLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9UeXBlL1RUeXBlLnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9UeXBlL1RUeXBlLnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzEyMTljMi4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvVHlwZS9UVHlwZS5waHAKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQKLSAqLwotCi1uYW1lc3BhY2UgVGhyaWZ0XFR5cGU7Ci0KLS8qKgotICogRGF0YSB0eXBlcyB0aGF0IGNhbiBiZSBzZW50IHZpYSBUaHJpZnQKLSAqLwotY2xhc3MgVFR5cGUKLXsKLSAgY29uc3QgU1RPUCAgID0gMDsKLSAgY29uc3QgVk9JRCAgID0gMTsKLSAgY29uc3QgQk9PTCAgID0gMjsKLSAgY29uc3QgQllURSAgID0gMzsKLSAgY29uc3QgSTA4ICAgID0gMzsKLSAgY29uc3QgRE9VQkxFID0gNDsKLSAgY29uc3QgSTE2ICAgID0gNjsKLSAgY29uc3QgSTMyICAgID0gODsKLSAgY29uc3QgSTY0ICAgID0gMTA7Ci0gIGNvbnN0IFNUUklORyA9IDExOwotICBjb25zdCBVVEY3ICAgPSAxMTsKLSAgY29uc3QgU1RSVUNUID0gMTI7Ci0gIGNvbnN0IE1BUCAgICA9IDEzOwotICBjb25zdCBTRVQgICAgPSAxNDsKLSAgY29uc3QgTFNUICAgID0gMTU7ICAgIC8vIE4uQi4gY2Fubm90IHVzZSBMSVNUIGtleXdvcmQgaW4gUEhQIQotICBjb25zdCBVVEY4ICAgPSAxNjsKLSAgY29uc3QgVVRGMTYgID0gMTc7Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVEJ1ZmZlcmVkVHJhbnNwb3J0LnBocCBiL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UQnVmZmVyZWRUcmFuc3BvcnQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1M2M1YWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVEJ1ZmZlcmVkVHJhbnNwb3J0LnBocApAQCAtMCwwICsxLDIwNiBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcVHJhbnNwb3J0OworCit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNlIFRocmlmdFxGYWN0b3J5XFRTdHJpbmdGdW5jRmFjdG9yeTsKKworLyoqCisgKiBCdWZmZXJlZCB0cmFuc3BvcnQuIFN0b3JlcyBkYXRhIHRvIGFuIGludGVybmFsIGJ1ZmZlciB0aGF0IGl0IGRvZXNuJ3QKKyAqIGFjdHVhbGx5IHdyaXRlIG91dCB1bnRpbCBmbHVzaCBpcyBjYWxsZWQuIEZvciByZWFkaW5nLCB3ZSBkbyBhIGdyZWVkeQorICogcmVhZCBhbmQgdGhlbiBzZXJ2ZSBkYXRhIG91dCBvZiB0aGUgaW50ZXJuYWwgYnVmZmVyLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworY2xhc3MgVEJ1ZmZlcmVkVHJhbnNwb3J0IGV4dGVuZHMgVFRyYW5zcG9ydAoreworICAgIC8qKgorICAgICAqIFRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydAorICAgICAqCisgICAgICogQHZhciBUVHJhbnNwb3J0CisgICAgICovCisgICAgcHJvdGVjdGVkICR0cmFuc3BvcnRfOworCisgICAgLyoqCisgICAgICogVGhlIHJlY2VpdmUgYnVmZmVyIHNpemUKKyAgICAgKgorICAgICAqIEB2YXIgaW50CisgICAgICovCisgICAgcHJvdGVjdGVkICRyQnVmU2l6ZV8gPSA1MTI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgd3JpdGUgYnVmZmVyIHNpemUKKyAgICAgKgorICAgICAqIEB2YXIgaW50CisgICAgICovCisgICAgcHJvdGVjdGVkICR3QnVmU2l6ZV8gPSA1MTI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgd3JpdGUgYnVmZmVyLgorICAgICAqCisgICAgICogQHZhciBzdHJpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHdCdWZfID0gJyc7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVhZCBidWZmZXIuCisgICAgICoKKyAgICAgKiBAdmFyIHN0cmluZworICAgICAqLworICAgIHByb3RlY3RlZCAkckJ1Zl8gPSAnJzsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLiBDcmVhdGVzIGEgYnVmZmVyZWQgdHJhbnNwb3J0IGFyb3VuZCBhbiB1bmRlcmx5aW5nIHRyYW5zcG9ydAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdHJhbnNwb3J0LCAkckJ1ZlNpemUgPSA1MTIsICR3QnVmU2l6ZSA9IDUxMikKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnRfID0gJHRyYW5zcG9ydDsKKyAgICAgICAgJHRoaXMtPnJCdWZTaXplXyA9ICRyQnVmU2l6ZTsKKyAgICAgICAgJHRoaXMtPndCdWZTaXplXyA9ICR3QnVmU2l6ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gaXNPcGVuKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+dHJhbnNwb3J0Xy0+aXNPcGVuKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGluaGVyaXRkb2MKKyAgICAgKgorICAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBvcGVuKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnRfLT5vcGVuKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnRfLT5jbG9zZSgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBwdXRCYWNrKCRkYXRhKQorICAgIHsKKyAgICAgICAgaWYgKFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+ckJ1Zl8pID09PSAwKSB7CisgICAgICAgICAgICAkdGhpcy0+ckJ1Zl8gPSAkZGF0YTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR0aGlzLT5yQnVmXyA9ICgkZGF0YSAuICR0aGlzLT5yQnVmXyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVhc29uIHRoYXQgd2UgY3VzdG9taXplIHJlYWRBbGwgaGVyZSBpcyB0aGF0IHRoZSBtYWpvcml0eSBvZiBQSFAKKyAgICAgKiBzdHJlYW1zIGFyZSBhbHJlYWR5IGludGVybmFsbHkgYnVmZmVyZWQgYnkgUEhQLiBUaGUgc29ja2V0IHN0cmVhbSwgZm9yCisgICAgICogZXhhbXBsZSwgYnVmZmVycyBpbnRlcm5hbGx5IGFuZCBibG9ja3MgaWYgeW91IGNhbGwgcmVhZCB3aXRoICRsZW4gZ3JlYXRlcgorICAgICAqIHRoYW4gdGhlIGFtb3VudCBvZiBkYXRhIGF2YWlsYWJsZSwgdW5saWtlIHJlY3YoKSBpbiBDLgorICAgICAqCisgICAgICogVGhlcmVmb3JlLCB1c2UgdGhlIHJlYWRBbGwgbWV0aG9kIG9mIHRoZSB3cmFwcGVkIHRyYW5zcG9ydCBpbnNpZGUKKyAgICAgKiB0aGUgYnVmZmVyZWQgcmVhZEFsbC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQWxsKCRsZW4pCisgICAgeworICAgICAgICAkaGF2ZSA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+ckJ1Zl8pOworICAgICAgICBpZiAoJGhhdmUgPT0gMCkgeworICAgICAgICAgICAgJGRhdGEgPSAkdGhpcy0+dHJhbnNwb3J0Xy0+cmVhZEFsbCgkbGVuKTsKKyAgICAgICAgfSBlbHNlaWYgKCRoYXZlIDwgJGxlbikgeworICAgICAgICAgICAgJGRhdGEgPSAkdGhpcy0+ckJ1Zl87CisgICAgICAgICAgICAkdGhpcy0+ckJ1Zl8gPSAnJzsKKyAgICAgICAgICAgICRkYXRhIC49ICR0aGlzLT50cmFuc3BvcnRfLT5yZWFkQWxsKCRsZW4gLSAkaGF2ZSk7CisgICAgICAgIH0gZWxzZWlmICgkaGF2ZSA9PSAkbGVuKSB7CisgICAgICAgICAgICAkZGF0YSA9ICR0aGlzLT5yQnVmXzsKKyAgICAgICAgICAgICR0aGlzLT5yQnVmXyA9ICcnOworICAgICAgICB9IGVsc2VpZiAoJGhhdmUgPiAkbGVuKSB7CisgICAgICAgICAgICAkZGF0YSA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN1YnN0cigkdGhpcy0+ckJ1Zl8sIDAsICRsZW4pOworICAgICAgICAgICAgJHRoaXMtPnJCdWZfID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCR0aGlzLT5yQnVmXywgJGxlbik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJGRhdGE7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGluaGVyaXRkb2MKKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnQgJGxlbgorICAgICAqIEByZXR1cm4gc3RyaW5nCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWQoJGxlbikKKyAgICB7CisgICAgICAgIGlmIChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPnJCdWZfKSA9PT0gMCkgeworICAgICAgICAgICAgJHRoaXMtPnJCdWZfID0gJHRoaXMtPnRyYW5zcG9ydF8tPnJlYWQoJHRoaXMtPnJCdWZTaXplXyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR0aGlzLT5yQnVmXykgPD0gJGxlbikgeworICAgICAgICAgICAgJHJldCA9ICR0aGlzLT5yQnVmXzsKKyAgICAgICAgICAgICR0aGlzLT5yQnVmXyA9ICcnOworCisgICAgICAgICAgICByZXR1cm4gJHJldDsKKyAgICAgICAgfQorCisgICAgICAgICRyZXQgPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdWJzdHIoJHRoaXMtPnJCdWZfLCAwLCAkbGVuKTsKKyAgICAgICAgJHRoaXMtPnJCdWZfID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCR0aGlzLT5yQnVmXywgJGxlbik7CisKKyAgICAgICAgcmV0dXJuICRyZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGluaGVyaXRkb2MKKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJGJ1ZgorICAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkYnVmKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndCdWZfIC49ICRidWY7CisgICAgICAgIGlmIChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPndCdWZfKSA+PSAkdGhpcy0+d0J1ZlNpemVfKSB7CisgICAgICAgICAgICAkb3V0ID0gJHRoaXMtPndCdWZfOworCisgICAgICAgICAgICAvLyBOb3RlIHRoYXQgd2UgY2xlYXIgdGhlIGludGVybmFsIHdCdWZfIHByaW9yIHRvIHRoZSB1bmRlcmx5aW5nIHdyaXRlCisgICAgICAgICAgICAvLyB0byBlbnN1cmUgd2UncmUgaW4gYSBzYW5lIHN0YXRlIChpLmUuIGludGVybmFsIGJ1ZmZlciBjbGVhbmVkKQorICAgICAgICAgICAgLy8gaWYgdGhlIHVuZGVybHlpbmcgd3JpdGUgdGhyb3dzIHVwIGFuIGV4Y2VwdGlvbgorICAgICAgICAgICAgJHRoaXMtPndCdWZfID0gJyc7CisgICAgICAgICAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+d3JpdGUoJG91dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAaW5oZXJpdGRvYworICAgICAqCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGZsdXNoKCkKKyAgICB7CisgICAgICAgIGlmIChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPndCdWZfKSA+IDApIHsKKyAgICAgICAgICAgICRvdXQgPSAkdGhpcy0+d0J1Zl87CisKKyAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBjbGVhciB0aGUgaW50ZXJuYWwgd0J1Zl8gcHJpb3IgdG8gdGhlIHVuZGVybHlpbmcgd3JpdGUKKyAgICAgICAgICAgIC8vIHRvIGVuc3VyZSB3ZSdyZSBpbiBhIHNhbmUgc3RhdGUgKGkuZS4gaW50ZXJuYWwgYnVmZmVyIGNsZWFuZWQpCisgICAgICAgICAgICAvLyBpZiB0aGUgdW5kZXJseWluZyB3cml0ZSB0aHJvd3MgdXAgYW4gZXhjZXB0aW9uCisgICAgICAgICAgICAkdGhpcy0+d0J1Zl8gPSAnJzsKKyAgICAgICAgICAgICR0aGlzLT50cmFuc3BvcnRfLT53cml0ZSgkb3V0KTsKKyAgICAgICAgfQorICAgICAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+Zmx1c2goKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVEN1cmxDbGllbnQucGhwIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1RDdXJsQ2xpZW50LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODJiNDNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1RDdXJsQ2xpZW50LnBocApAQCAtMCwwICsxLDI3NiBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcVHJhbnNwb3J0OworCit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNlIFRocmlmdFxGYWN0b3J5XFRTdHJpbmdGdW5jRmFjdG9yeTsKKworLyoqCisgKiBIVFRQIGNsaWVudCBmb3IgVGhyaWZ0CisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCitjbGFzcyBUQ3VybENsaWVudCBleHRlbmRzIFRUcmFuc3BvcnQKK3sKKyAgICBwcml2YXRlIHN0YXRpYyAkY3VybEhhbmRsZTsKKworICAgIC8qKgorICAgICAqIFRoZSBob3N0IHRvIGNvbm5lY3QgdG8KKyAgICAgKgorICAgICAqIEB2YXIgc3RyaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkICRob3N0XzsKKworICAgIC8qKgorICAgICAqIFRoZSBwb3J0IHRvIGNvbm5lY3Qgb24KKyAgICAgKgorICAgICAqIEB2YXIgaW50CisgICAgICovCisgICAgcHJvdGVjdGVkICRwb3J0XzsKKworICAgIC8qKgorICAgICAqIFRoZSBVUkkgdG8gcmVxdWVzdAorICAgICAqCisgICAgICogQHZhciBzdHJpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHVyaV87CisKKyAgICAvKioKKyAgICAgKiBUaGUgc2NoZW1lIHRvIHVzZSBmb3IgdGhlIHJlcXVlc3QsIGkuZS4gaHR0cCwgaHR0cHMKKyAgICAgKgorICAgICAqIEB2YXIgc3RyaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkICRzY2hlbWVfOworCisgICAgLyoqCisgICAgICogQnVmZmVyIGZvciB0aGUgSFRUUCByZXF1ZXN0IGRhdGEKKyAgICAgKgorICAgICAqIEB2YXIgc3RyaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkICRyZXF1ZXN0XzsKKworICAgIC8qKgorICAgICAqIEJ1ZmZlciBmb3IgdGhlIEhUVFAgcmVzcG9uc2UgZGF0YS4KKyAgICAgKgorICAgICAqIEB2YXIgYmluYXJ5IHN0cmluZworICAgICAqLworICAgIHByb3RlY3RlZCAkcmVzcG9uc2VfOworCisgICAgLyoqCisgICAgICogUmVhZCB0aW1lb3V0CisgICAgICoKKyAgICAgKiBAdmFyIGZsb2F0CisgICAgICovCisgICAgcHJvdGVjdGVkICR0aW1lb3V0XzsKKworICAgIC8qKgorICAgICAqIGh0dHAgaGVhZGVycworICAgICAqCisgICAgICogQHZhciBhcnJheQorICAgICAqLworICAgIHByb3RlY3RlZCAkaGVhZGVyc187CisKKyAgICAvKioKKyAgICAgKiBNYWtlIGEgbmV3IEhUVFAgY2xpZW50LgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkaG9zdAorICAgICAqIEBwYXJhbSBpbnQgJHBvcnQKKyAgICAgKiBAcGFyYW0gc3RyaW5nICR1cmkKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGhvc3QsICRwb3J0ID0gODAsICR1cmkgPSAnJywgJHNjaGVtZSA9ICdodHRwJykKKyAgICB7CisgICAgICAgIGlmICgoVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR1cmkpID4gMCkgJiYgKCR1cml7MH0gIT0gJy8nKSkgeworICAgICAgICAgICAgJHVyaSA9ICcvJyAuICR1cmk7CisgICAgICAgIH0KKyAgICAgICAgJHRoaXMtPnNjaGVtZV8gPSAkc2NoZW1lOworICAgICAgICAkdGhpcy0+aG9zdF8gPSAkaG9zdDsKKyAgICAgICAgJHRoaXMtPnBvcnRfID0gJHBvcnQ7CisgICAgICAgICR0aGlzLT51cmlfID0gJHVyaTsKKyAgICAgICAgJHRoaXMtPnJlcXVlc3RfID0gJyc7CisgICAgICAgICR0aGlzLT5yZXNwb25zZV8gPSBudWxsOworICAgICAgICAkdGhpcy0+dGltZW91dF8gPSBudWxsOworICAgICAgICAkdGhpcy0+aGVhZGVyc18gPSBhcnJheSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCByZWFkIHRpbWVvdXQKKyAgICAgKgorICAgICAqIEBwYXJhbSBmbG9hdCAkdGltZW91dAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRUaW1lb3V0U2VjcygkdGltZW91dCkKKyAgICB7CisgICAgICAgICR0aGlzLT50aW1lb3V0XyA9ICR0aW1lb3V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhpcyB0cmFuc3BvcnQgaXMgb3Blbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIG9wZW4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gaXNPcGVuKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIE9wZW4gdGhlIHRyYW5zcG9ydCBmb3IgcmVhZGluZy93cml0aW5nCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgY2Fubm90IG9wZW4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gb3BlbigpCisgICAgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlIHRoZSB0cmFuc3BvcnQuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5yZXF1ZXN0XyA9ICcnOworICAgICAgICAkdGhpcy0+cmVzcG9uc2VfID0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIHNvbWUgZGF0YSBpbnRvIHRoZSBhcnJheS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnQgJGxlbiBIb3cgbXVjaCB0byByZWFkCisgICAgICogQHJldHVybiBzdHJpbmcgVGhlIGRhdGEgdGhhdCBoYXMgYmVlbiByZWFkCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGNhbm5vdCByZWFkIGFueSBtb3JlIGRhdGEKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkbGVuKQorICAgIHsKKyAgICAgICAgaWYgKCRsZW4gPj0gc3RybGVuKCR0aGlzLT5yZXNwb25zZV8pKSB7CisgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJlc3BvbnNlXzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRyZXQgPSBzdWJzdHIoJHRoaXMtPnJlc3BvbnNlXywgMCwgJGxlbik7CisgICAgICAgICAgICAkdGhpcy0+cmVzcG9uc2VfID0gc3Vic3RyKCR0aGlzLT5yZXNwb25zZV8sICRsZW4pOworCisgICAgICAgICAgICByZXR1cm4gJHJldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEd1YXJhbnRlZXMgdGhhdCB0aGUgZnVsbCBhbW91bnQgb2YgZGF0YSBpcyByZWFkLiBTaW5jZSBUQ3VybENsaWVudCBnZXRzIGVudGlyZSBwYXlsb2FkIGF0CisgICAgICogb25jZSwgcGFyZW50IHJlYWRBbGwgY2Fubm90IGJlIHVzZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHN0cmluZyBUaGUgZGF0YSwgb2YgZXhhY3QgbGVuZ3RoCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGNhbm5vdCByZWFkIGRhdGEKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEFsbCgkbGVuKQorICAgIHsKKyAgICAgICAgJGRhdGEgPSAkdGhpcy0+cmVhZCgkbGVuKTsKKworICAgICAgICBpZiAoVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCRkYXRhKSAhPT0gJGxlbikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1RDdXJsQ2xpZW50IGNvdWxkIG5vdCByZWFkICcuJGxlbi4nIGJ5dGVzJyk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJGRhdGE7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIHNvbWUgZGF0YSBpbnRvIHRoZSBwZW5kaW5nIGJ1ZmZlcgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkYnVmIFRoZSBkYXRhIHRvIHdyaXRlCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIHdyaXRpbmcgZmFpbHMKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGJ1ZikKKyAgICB7CisgICAgICAgICR0aGlzLT5yZXF1ZXN0XyAuPSAkYnVmOworICAgIH0KKworICAgIC8qKgorICAgICAqIE9wZW5zIGFuZCBzZW5kcyB0aGUgYWN0dWFsIHJlcXVlc3Qgb3ZlciB0aGUgSFRUUCBjb25uZWN0aW9uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgYSB3cml0aW5nIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBmbHVzaCgpCisgICAgeworICAgICAgICBpZiAoIXNlbGY6OiRjdXJsSGFuZGxlKSB7CisgICAgICAgICAgICByZWdpc3Rlcl9zaHV0ZG93bl9mdW5jdGlvbihhcnJheSgnVGhyaWZ0XFxUcmFuc3BvcnRcXFRDdXJsQ2xpZW50JywgJ2Nsb3NlQ3VybEhhbmRsZScpKTsKKyAgICAgICAgICAgIHNlbGY6OiRjdXJsSGFuZGxlID0gY3VybF9pbml0KCk7CisgICAgICAgICAgICBjdXJsX3NldG9wdChzZWxmOjokY3VybEhhbmRsZSwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgdHJ1ZSk7CisgICAgICAgICAgICBjdXJsX3NldG9wdChzZWxmOjokY3VybEhhbmRsZSwgQ1VSTE9QVF9CSU5BUllUUkFOU0ZFUiwgdHJ1ZSk7CisgICAgICAgICAgICBjdXJsX3NldG9wdChzZWxmOjokY3VybEhhbmRsZSwgQ1VSTE9QVF9VU0VSQUdFTlQsICdQSFAvVEN1cmxDbGllbnQnKTsKKyAgICAgICAgICAgIGN1cmxfc2V0b3B0KHNlbGY6OiRjdXJsSGFuZGxlLCBDVVJMT1BUX0NVU1RPTVJFUVVFU1QsICdQT1NUJyk7CisgICAgICAgICAgICBjdXJsX3NldG9wdChzZWxmOjokY3VybEhhbmRsZSwgQ1VSTE9QVF9GT0xMT1dMT0NBVElPTiwgdHJ1ZSk7CisgICAgICAgICAgICBjdXJsX3NldG9wdChzZWxmOjokY3VybEhhbmRsZSwgQ1VSTE9QVF9NQVhSRURJUlMsIDEpOworICAgICAgICB9CisgICAgICAgIC8vIEdvZCwgUEhQIHJlYWxseSBoYXMgc29tZSBlc290ZXJpYyB3YXlzIG9mIGRvaW5nIHNpbXBsZSB0aGluZ3MuCisgICAgICAgICRob3N0ID0gJHRoaXMtPmhvc3RfIC4gKCR0aGlzLT5wb3J0XyAhPSA4MCA/ICc6JyAuICR0aGlzLT5wb3J0XyA6ICcnKTsKKyAgICAgICAgJGZ1bGxVcmwgPSAkdGhpcy0+c2NoZW1lXyAuICI6Ly8iIC4gJGhvc3QgLiAkdGhpcy0+dXJpXzsKKworICAgICAgICAkaGVhZGVycyA9IGFycmF5KCk7CisgICAgICAgICRkZWZhdWx0SGVhZGVycyA9IGFycmF5KCdBY2NlcHQnID0+ICdhcHBsaWNhdGlvbi94LXRocmlmdCcsCisgICAgICAgICAgICAnQ29udGVudC1UeXBlJyA9PiAnYXBwbGljYXRpb24veC10aHJpZnQnLAorICAgICAgICAgICAgJ0NvbnRlbnQtTGVuZ3RoJyA9PiBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPnJlcXVlc3RfKSk7CisgICAgICAgIGZvcmVhY2ggKGFycmF5X21lcmdlKCRkZWZhdWx0SGVhZGVycywgJHRoaXMtPmhlYWRlcnNfKSBhcyAka2V5ID0+ICR2YWx1ZSkgeworICAgICAgICAgICAgJGhlYWRlcnNbXSA9ICIka2V5OiAkdmFsdWUiOworICAgICAgICB9CisKKyAgICAgICAgY3VybF9zZXRvcHQoc2VsZjo6JGN1cmxIYW5kbGUsIENVUkxPUFRfSFRUUEhFQURFUiwgJGhlYWRlcnMpOworCisgICAgICAgIGlmICgkdGhpcy0+dGltZW91dF8gPiAwKSB7CisgICAgICAgICAgICBjdXJsX3NldG9wdChzZWxmOjokY3VybEhhbmRsZSwgQ1VSTE9QVF9USU1FT1VULCAkdGhpcy0+dGltZW91dF8pOworICAgICAgICB9CisgICAgICAgIGN1cmxfc2V0b3B0KHNlbGY6OiRjdXJsSGFuZGxlLCBDVVJMT1BUX1BPU1RGSUVMRFMsICR0aGlzLT5yZXF1ZXN0Xyk7CisgICAgICAgICR0aGlzLT5yZXF1ZXN0XyA9ICcnOworCisgICAgICAgIGN1cmxfc2V0b3B0KHNlbGY6OiRjdXJsSGFuZGxlLCBDVVJMT1BUX1VSTCwgJGZ1bGxVcmwpOworICAgICAgICAkdGhpcy0+cmVzcG9uc2VfID0gY3VybF9leGVjKHNlbGY6OiRjdXJsSGFuZGxlKTsKKyAgICAgICAgJHJlc3BvbnNlRXJyb3IgPSBjdXJsX2Vycm9yKHNlbGY6OiRjdXJsSGFuZGxlKTsKKworICAgICAgICAkY29kZSA9IGN1cmxfZ2V0aW5mbyhzZWxmOjokY3VybEhhbmRsZSwgQ1VSTElORk9fSFRUUF9DT0RFKTsKKworICAgICAgICAvLyBIYW5kbGUgbm9uIDIwMCBzdGF0dXMgY29kZSAvIGNvbm5lY3QgZmFpbHVyZQorICAgICAgICBpZiAoJHRoaXMtPnJlc3BvbnNlXyA9PT0gZmFsc2UgfHwgJGNvZGUgIT09IDIwMCkgeworICAgICAgICAgICAgY3VybF9jbG9zZShzZWxmOjokY3VybEhhbmRsZSk7CisgICAgICAgICAgICBzZWxmOjokY3VybEhhbmRsZSA9IG51bGw7CisgICAgICAgICAgICAkdGhpcy0+cmVzcG9uc2VfID0gbnVsbDsKKyAgICAgICAgICAgICRlcnJvciA9ICdUQ3VybENsaWVudDogQ291bGQgbm90IGNvbm5lY3QgdG8gJyAuICRmdWxsVXJsOworICAgICAgICAgICAgaWYgKCRyZXNwb25zZUVycm9yKSB7CisgICAgICAgICAgICAgICAgJGVycm9yIC49ICcsICcgLiAkcmVzcG9uc2VFcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgkY29kZSkgeworICAgICAgICAgICAgICAgICRlcnJvciAuPSAnLCBIVFRQIHN0YXR1cyBjb2RlOiAnIC4gJGNvZGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigkZXJyb3IsIFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04pOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjbG9zZUN1cmxIYW5kbGUoKQorICAgIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChzZWxmOjokY3VybEhhbmRsZSkgeworICAgICAgICAgICAgICAgIGN1cmxfY2xvc2Uoc2VsZjo6JGN1cmxIYW5kbGUpOworICAgICAgICAgICAgICAgIHNlbGY6OiRjdXJsSGFuZGxlID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoXEV4Y2VwdGlvbiAkeCkgeworICAgICAgICAgICAgZXJyb3JfbG9nKCdUaGVyZSB3YXMgYW4gZXJyb3IgY2xvc2luZyB0aGUgY3VybCBoYW5kbGU6ICcgLiAkeC0+Z2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRIZWFkZXJzKCRoZWFkZXJzKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmhlYWRlcnNfID0gYXJyYXlfbWVyZ2UoJHRoaXMtPmhlYWRlcnNfLCAkaGVhZGVycyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQucGhwIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZDE4NjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5waHAKQEAgLTAsMCArMSwxOTIgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFRyYW5zcG9ydDsKKwordXNlIFRocmlmdFxGYWN0b3J5XFRTdHJpbmdGdW5jRmFjdG9yeTsKKworLyoqCisgKiBGcmFtZWQgdHJhbnNwb3J0LiBXcml0ZXMgYW5kIHJlYWRzIGRhdGEgaW4gY2h1bmtzIHRoYXQgYXJlIHN0YW1wZWQgd2l0aAorICogdGhlaXIgbGVuZ3RoLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworY2xhc3MgVEZyYW1lZFRyYW5zcG9ydCBleHRlbmRzIFRUcmFuc3BvcnQKK3sKKyAgICAvKioKKyAgICAgKiBVbmRlcmx5aW5nIHRyYW5zcG9ydCBvYmplY3QuCisgICAgICoKKyAgICAgKiBAdmFyIFRUcmFuc3BvcnQKKyAgICAgKi8KKyAgICBwcml2YXRlICR0cmFuc3BvcnRfOworCisgICAgLyoqCisgICAgICogQnVmZmVyIGZvciByZWFkIGRhdGEuCisgICAgICoKKyAgICAgKiBAdmFyIHN0cmluZworICAgICAqLworICAgIHByaXZhdGUgJHJCdWZfOworCisgICAgLyoqCisgICAgICogQnVmZmVyIGZvciBxdWV1ZWQgb3V0cHV0IGRhdGEKKyAgICAgKgorICAgICAqIEB2YXIgc3RyaW5nCisgICAgICovCisgICAgcHJpdmF0ZSAkd0J1Zl87CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIGZyYW1lIHJlYWRzCisgICAgICoKKyAgICAgKiBAdmFyIGJvb2wKKyAgICAgKi8KKyAgICBwcml2YXRlICRyZWFkXzsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gZnJhbWUgd3JpdGVzCisgICAgICoKKyAgICAgKiBAdmFyIGJvb2wKKyAgICAgKi8KKyAgICBwcml2YXRlICR3cml0ZV87CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBUVHJhbnNwb3J0ICR0cmFuc3BvcnQgVW5kZXJseWluZyB0cmFuc3BvcnQKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHRyYW5zcG9ydCA9IG51bGwsICRyZWFkID0gdHJ1ZSwgJHdyaXRlID0gdHJ1ZSkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnRfID0gJHRyYW5zcG9ydDsKKyAgICAgICAgJHRoaXMtPnJlYWRfID0gJHJlYWQ7CisgICAgICAgICR0aGlzLT53cml0ZV8gPSAkd3JpdGU7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGlzT3BlbigpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPnRyYW5zcG9ydF8tPmlzT3BlbigpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBvcGVuKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnRfLT5vcGVuKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnRfLT5jbG9zZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWRzIGZyb20gdGhlIGJ1ZmZlci4gV2hlbiBtb3JlIGRhdGEgaXMgcmVxdWlyZWQgcmVhZHMgYW5vdGhlciBlbnRpcmUKKyAgICAgKiBjaHVuayBhbmQgc2VydmVzIGZ1dHVyZSByZWFkcyBvdXQgb2YgdGhhdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnQgJGxlbiBIb3cgbXVjaCBkYXRhCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWQoJGxlbikKKyAgICB7CisgICAgICAgIGlmICghJHRoaXMtPnJlYWRfKSB7CisgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnRyYW5zcG9ydF8tPnJlYWQoJGxlbik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR0aGlzLT5yQnVmXykgPT09IDApIHsKKyAgICAgICAgICAgICR0aGlzLT5yZWFkRnJhbWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEp1c3QgcmV0dXJuIGZ1bGwgYnVmZgorICAgICAgICBpZiAoJGxlbiA+PSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPnJCdWZfKSkgeworICAgICAgICAgICAgJG91dCA9ICR0aGlzLT5yQnVmXzsKKyAgICAgICAgICAgICR0aGlzLT5yQnVmXyA9IG51bGw7CisKKyAgICAgICAgICAgIHJldHVybiAkb3V0OworICAgICAgICB9CisKKyAgICAgICAgLy8gUmV0dXJuIFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN1YnN0cgorICAgICAgICAkb3V0ID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCR0aGlzLT5yQnVmXywgMCwgJGxlbik7CisgICAgICAgICR0aGlzLT5yQnVmXyA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN1YnN0cigkdGhpcy0+ckJ1Zl8sICRsZW4pOworCisgICAgICAgIHJldHVybiAkb3V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFB1dCBwcmV2aW91c2x5IHJlYWQgZGF0YSBiYWNrIGludG8gdGhlIGJ1ZmZlcgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkZGF0YSBkYXRhIHRvIHJldHVybgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBwdXRCYWNrKCRkYXRhKQorICAgIHsKKyAgICAgICAgaWYgKFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+ckJ1Zl8pID09PSAwKSB7CisgICAgICAgICAgICAkdGhpcy0+ckJ1Zl8gPSAkZGF0YTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR0aGlzLT5yQnVmXyA9ICgkZGF0YSAuICR0aGlzLT5yQnVmXyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyBhIGNodW5rIG9mIGRhdGEgaW50byB0aGUgaW50ZXJuYWwgcmVhZCBidWZmZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBmdW5jdGlvbiByZWFkRnJhbWUoKQorICAgIHsKKyAgICAgICAgJGJ1ZiA9ICR0aGlzLT50cmFuc3BvcnRfLT5yZWFkQWxsKDQpOworICAgICAgICAkdmFsID0gdW5wYWNrKCdOJywgJGJ1Zik7CisgICAgICAgICRzeiA9ICR2YWxbMV07CisKKyAgICAgICAgJHRoaXMtPnJCdWZfID0gJHRoaXMtPnRyYW5zcG9ydF8tPnJlYWRBbGwoJHN6KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgc29tZSBkYXRhIHRvIHRoZSBwZW5kaW5nIG91dHB1dCBidWZmZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRidWYgVGhlIGRhdGEKKyAgICAgKiBAcGFyYW0gaW50ICRsZW4gTGltaXQgb2YgYnl0ZXMgdG8gd3JpdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGJ1ZiwgJGxlbiA9IG51bGwpCisgICAgeworICAgICAgICBpZiAoISR0aGlzLT53cml0ZV8pIHsKKyAgICAgICAgICAgIHJldHVybiAkdGhpcy0+dHJhbnNwb3J0Xy0+d3JpdGUoJGJ1ZiwgJGxlbik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoJGxlbiAhPT0gbnVsbCAmJiAkbGVuIDwgVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCRidWYpKSB7CisgICAgICAgICAgICAkYnVmID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCRidWYsIDAsICRsZW4pOworICAgICAgICB9CisgICAgICAgICR0aGlzLT53QnVmXyAuPSAkYnVmOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyB0aGUgb3V0cHV0IGJ1ZmZlciB0byB0aGUgc3RyZWFtIGluIHRoZSBmb3JtYXQgb2YgYSA0LWJ5dGUgbGVuZ3RoCisgICAgICogZm9sbG93ZWQgYnkgdGhlIGFjdHVhbCBkYXRhLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBmbHVzaCgpCisgICAgeworICAgICAgICBpZiAoISR0aGlzLT53cml0ZV8gfHwgVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR0aGlzLT53QnVmXykgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuICR0aGlzLT50cmFuc3BvcnRfLT5mbHVzaCgpOworICAgICAgICB9CisKKyAgICAgICAgJG91dCA9IHBhY2soJ04nLCBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPndCdWZfKSk7CisgICAgICAgICRvdXQgLj0gJHRoaXMtPndCdWZfOworCisgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBjbGVhciB0aGUgaW50ZXJuYWwgd0J1Zl8gcHJpb3IgdG8gdGhlIHVuZGVybHlpbmcgd3JpdGUKKyAgICAgICAgLy8gdG8gZW5zdXJlIHdlJ3JlIGluIGEgc2FuZSBzdGF0ZSAoaS5lLiBpbnRlcm5hbCBidWZmZXIgY2xlYW5lZCkKKyAgICAgICAgLy8gaWYgdGhlIHVuZGVybHlpbmcgd3JpdGUgdGhyb3dzIHVwIGFuIGV4Y2VwdGlvbgorICAgICAgICAkdGhpcy0+d0J1Zl8gPSAnJzsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydF8tPndyaXRlKCRvdXQpOworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+Zmx1c2goKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVEh0dHBDbGllbnQucGhwIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1RIdHRwQ2xpZW50LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTU4ODA5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1RIdHRwQ2xpZW50LnBocApAQCAtMCwwICsxLDI1OCBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcVHJhbnNwb3J0OworCit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNlIFRocmlmdFxGYWN0b3J5XFRTdHJpbmdGdW5jRmFjdG9yeTsKKworLyoqCisgKiBIVFRQIGNsaWVudCBmb3IgVGhyaWZ0CisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCitjbGFzcyBUSHR0cENsaWVudCBleHRlbmRzIFRUcmFuc3BvcnQKK3sKKyAgICAvKioKKyAgICAgKiBUaGUgaG9zdCB0byBjb25uZWN0IHRvCisgICAgICoKKyAgICAgKiBAdmFyIHN0cmluZworICAgICAqLworICAgIHByb3RlY3RlZCAkaG9zdF87CisKKyAgICAvKioKKyAgICAgKiBUaGUgcG9ydCB0byBjb25uZWN0IG9uCisgICAgICoKKyAgICAgKiBAdmFyIGludAorICAgICAqLworICAgIHByb3RlY3RlZCAkcG9ydF87CisKKyAgICAvKioKKyAgICAgKiBUaGUgVVJJIHRvIHJlcXVlc3QKKyAgICAgKgorICAgICAqIEB2YXIgc3RyaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkICR1cmlfOworCisgICAgLyoqCisgICAgICogVGhlIHNjaGVtZSB0byB1c2UgZm9yIHRoZSByZXF1ZXN0LCBpLmUuIGh0dHAsIGh0dHBzCisgICAgICoKKyAgICAgKiBAdmFyIHN0cmluZworICAgICAqLworICAgIHByb3RlY3RlZCAkc2NoZW1lXzsKKworICAgIC8qKgorICAgICAqIEJ1ZmZlciBmb3IgdGhlIEhUVFAgcmVxdWVzdCBkYXRhCisgICAgICoKKyAgICAgKiBAdmFyIHN0cmluZworICAgICAqLworICAgIHByb3RlY3RlZCAkYnVmXzsKKworICAgIC8qKgorICAgICAqIElucHV0IHNvY2tldCBzdHJlYW0uCisgICAgICoKKyAgICAgKiBAdmFyIHJlc291cmNlCisgICAgICovCisgICAgcHJvdGVjdGVkICRoYW5kbGVfOworCisgICAgLyoqCisgICAgICogUmVhZCB0aW1lb3V0CisgICAgICoKKyAgICAgKiBAdmFyIGZsb2F0CisgICAgICovCisgICAgcHJvdGVjdGVkICR0aW1lb3V0XzsKKworICAgIC8qKgorICAgICAqIGh0dHAgaGVhZGVycworICAgICAqCisgICAgICogQHZhciBhcnJheQorICAgICAqLworICAgIHByb3RlY3RlZCAkaGVhZGVyc187CisKKyAgICAvKioKKyAgICAgKiBDb250ZXh0IGFkZGl0aW9uYWwgb3B0aW9ucworICAgICAqCisgICAgICogQHZhciBhcnJheQorICAgICAqLworICAgIHByb3RlY3RlZCAkY29udGV4dF87CisKKyAgICAvKioKKyAgICAgKiBNYWtlIGEgbmV3IEhUVFAgY2xpZW50LgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkaG9zdAorICAgICAqIEBwYXJhbSBpbnQgICAgJHBvcnQKKyAgICAgKiBAcGFyYW0gc3RyaW5nICR1cmkKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRzY2hlbWUKKyAgICAgKiBAcGFyYW0gYXJyYXkgICRjb250ZXh0CisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRob3N0LCAkcG9ydCA9IDgwLCAkdXJpID0gJycsICRzY2hlbWUgPSAnaHR0cCcsIGFycmF5ICRjb250ZXh0ID0gYXJyYXkoKSkKKyAgICB7CisgICAgICAgIGlmICgoVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR1cmkpID4gMCkgJiYgKCR1cml7MH0gIT0gJy8nKSkgeworICAgICAgICAgICAgJHVyaSA9ICcvJyAuICR1cmk7CisgICAgICAgIH0KKyAgICAgICAgJHRoaXMtPnNjaGVtZV8gPSAkc2NoZW1lOworICAgICAgICAkdGhpcy0+aG9zdF8gPSAkaG9zdDsKKyAgICAgICAgJHRoaXMtPnBvcnRfID0gJHBvcnQ7CisgICAgICAgICR0aGlzLT51cmlfID0gJHVyaTsKKyAgICAgICAgJHRoaXMtPmJ1Zl8gPSAnJzsKKyAgICAgICAgJHRoaXMtPmhhbmRsZV8gPSBudWxsOworICAgICAgICAkdGhpcy0+dGltZW91dF8gPSBudWxsOworICAgICAgICAkdGhpcy0+aGVhZGVyc18gPSBhcnJheSgpOworICAgICAgICAkdGhpcy0+Y29udGV4dF8gPSAkY29udGV4dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgcmVhZCB0aW1lb3V0CisgICAgICoKKyAgICAgKiBAcGFyYW0gZmxvYXQgJHRpbWVvdXQKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gc2V0VGltZW91dFNlY3MoJHRpbWVvdXQpCisgICAgeworICAgICAgICAkdGhpcy0+dGltZW91dF8gPSAkdGltZW91dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoaXMgdHJhbnNwb3J0IGlzIG9wZW4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBvcGVuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGlzT3BlbigpCisgICAgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPcGVuIHRoZSB0cmFuc3BvcnQgZm9yIHJlYWRpbmcvd3JpdGluZworICAgICAqCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGNhbm5vdCBvcGVuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIG9wZW4oKQorICAgIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZSB0aGUgdHJhbnNwb3J0LgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBjbG9zZSgpCisgICAgeworICAgICAgICBpZiAoJHRoaXMtPmhhbmRsZV8pIHsKKyAgICAgICAgICAgIEBmY2xvc2UoJHRoaXMtPmhhbmRsZV8pOworICAgICAgICAgICAgJHRoaXMtPmhhbmRsZV8gPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCBzb21lIGRhdGEgaW50byB0aGUgYXJyYXkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW50ICRsZW4gSG93IG11Y2ggdG8gcmVhZAorICAgICAqIEByZXR1cm4gc3RyaW5nIFRoZSBkYXRhIHRoYXQgaGFzIGJlZW4gcmVhZAorICAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBjYW5ub3QgcmVhZCBhbnkgbW9yZSBkYXRhCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWQoJGxlbikKKyAgICB7CisgICAgICAgICRkYXRhID0gQGZyZWFkKCR0aGlzLT5oYW5kbGVfLCAkbGVuKTsKKyAgICAgICAgaWYgKCRkYXRhID09PSBmYWxzZSB8fCAkZGF0YSA9PT0gJycpIHsKKyAgICAgICAgICAgICRtZCA9IHN0cmVhbV9nZXRfbWV0YV9kYXRhKCR0aGlzLT5oYW5kbGVfKTsKKyAgICAgICAgICAgIGlmICgkbWRbJ3RpbWVkX291dCddKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICdUSHR0cENsaWVudDogdGltZWQgb3V0IHJlYWRpbmcgJyAuICRsZW4gLiAnIGJ5dGVzIGZyb20gJyAuCisgICAgICAgICAgICAgICAgICAgICR0aGlzLT5ob3N0XyAuICc6JyAuICR0aGlzLT5wb3J0XyAuICR0aGlzLT51cmlfLAorICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uOjpUSU1FRF9PVVQKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgJ1RIdHRwQ2xpZW50OiBDb3VsZCBub3QgcmVhZCAnIC4gJGxlbiAuICcgYnl0ZXMgZnJvbSAnIC4KKyAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfIC4gJzonIC4gJHRoaXMtPnBvcnRfIC4gJHRoaXMtPnVyaV8sCisgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04KKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICRkYXRhOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyBzb21lIGRhdGEgaW50byB0aGUgcGVuZGluZyBidWZmZXIKKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJGJ1ZiBUaGUgZGF0YSB0byB3cml0ZQorICAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiB3cml0aW5nIGZhaWxzCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCRidWYpCisgICAgeworICAgICAgICAkdGhpcy0+YnVmXyAuPSAkYnVmOworICAgIH0KKworICAgIC8qKgorICAgICAqIE9wZW5zIGFuZCBzZW5kcyB0aGUgYWN0dWFsIHJlcXVlc3Qgb3ZlciB0aGUgSFRUUCBjb25uZWN0aW9uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgYSB3cml0aW5nIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBmbHVzaCgpCisgICAgeworICAgICAgICAvLyBHb2QsIFBIUCByZWFsbHkgaGFzIHNvbWUgZXNvdGVyaWMgd2F5cyBvZiBkb2luZyBzaW1wbGUgdGhpbmdzLgorICAgICAgICAkaG9zdCA9ICR0aGlzLT5ob3N0XyAuICgkdGhpcy0+cG9ydF8gIT0gODAgPyAnOicgLiAkdGhpcy0+cG9ydF8gOiAnJyk7CisKKyAgICAgICAgJGhlYWRlcnMgPSBhcnJheSgpOworICAgICAgICAkZGVmYXVsdEhlYWRlcnMgPSBhcnJheSgnSG9zdCcgPT4gJGhvc3QsCisgICAgICAgICAgICAnQWNjZXB0JyA9PiAnYXBwbGljYXRpb24veC10aHJpZnQnLAorICAgICAgICAgICAgJ1VzZXItQWdlbnQnID0+ICdQSFAvVEh0dHBDbGllbnQnLAorICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZScgPT4gJ2FwcGxpY2F0aW9uL3gtdGhyaWZ0JywKKyAgICAgICAgICAgICdDb250ZW50LUxlbmd0aCcgPT4gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR0aGlzLT5idWZfKSk7CisgICAgICAgIGZvcmVhY2ggKGFycmF5X21lcmdlKCRkZWZhdWx0SGVhZGVycywgJHRoaXMtPmhlYWRlcnNfKSBhcyAka2V5ID0+ICR2YWx1ZSkgeworICAgICAgICAgICAgJGhlYWRlcnNbXSA9ICIka2V5OiAkdmFsdWUiOworICAgICAgICB9CisKKyAgICAgICAgJG9wdGlvbnMgPSAkdGhpcy0+Y29udGV4dF87CisKKyAgICAgICAgJGJhc2VIdHRwT3B0aW9ucyA9IGlzc2V0KCRvcHRpb25zWyJodHRwIl0pID8gJG9wdGlvbnNbImh0dHAiXSA6IGFycmF5KCk7CisKKyAgICAgICAgJGh0dHBPcHRpb25zID0gJGJhc2VIdHRwT3B0aW9ucyArIGFycmF5KCdtZXRob2QnID0+ICdQT1NUJywKKyAgICAgICAgICAgICdoZWFkZXInID0+IGltcGxvZGUoIlxyXG4iLCAkaGVhZGVycyksCisgICAgICAgICAgICAnbWF4X3JlZGlyZWN0cycgPT4gMSwKKyAgICAgICAgICAgICdjb250ZW50JyA9PiAkdGhpcy0+YnVmXyk7CisgICAgICAgIGlmICgkdGhpcy0+dGltZW91dF8gPiAwKSB7CisgICAgICAgICAgICAkaHR0cE9wdGlvbnNbJ3RpbWVvdXQnXSA9ICR0aGlzLT50aW1lb3V0XzsKKyAgICAgICAgfQorICAgICAgICAkdGhpcy0+YnVmXyA9ICcnOworCisgICAgICAgICRvcHRpb25zWyJodHRwIl0gPSAkaHR0cE9wdGlvbnM7CisgICAgICAgICRjb250ZXh0aWQgPSBzdHJlYW1fY29udGV4dF9jcmVhdGUoJG9wdGlvbnMpOworICAgICAgICAkdGhpcy0+aGFuZGxlXyA9IEBmb3BlbigKKyAgICAgICAgICAgICR0aGlzLT5zY2hlbWVfIC4gJzovLycgLiAkaG9zdCAuICR0aGlzLT51cmlfLAorICAgICAgICAgICAgJ3InLAorICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICAgICAkY29udGV4dGlkCisgICAgICAgICk7CisKKyAgICAgICAgLy8gQ29ubmVjdCBmYWlsZWQ/CisgICAgICAgIGlmICgkdGhpcy0+aGFuZGxlXyA9PT0gZmFsc2UpIHsKKyAgICAgICAgICAgICR0aGlzLT5oYW5kbGVfID0gbnVsbDsKKyAgICAgICAgICAgICRlcnJvciA9ICdUSHR0cENsaWVudDogQ291bGQgbm90IGNvbm5lY3QgdG8gJyAuICRob3N0IC4gJHRoaXMtPnVyaV87CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigkZXJyb3IsIFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRIZWFkZXJzKCRoZWFkZXJzKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmhlYWRlcnNfID0gYXJyYXlfbWVyZ2UoJHRoaXMtPmhlYWRlcnNfLCAkaGVhZGVycyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIucGhwIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZTAzYTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5waHAKQEAgLTAsMCArMSwxMDYgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFRyYW5zcG9ydDsKKwordXNlIFRocmlmdFxFeGNlcHRpb25cVFRyYW5zcG9ydEV4Y2VwdGlvbjsKK3VzZSBUaHJpZnRcRmFjdG9yeVxUU3RyaW5nRnVuY0ZhY3Rvcnk7CisKKy8qKgorICogQSBtZW1vcnkgYnVmZmVyIGlzIGEgdHJhbnBzb3J0IHRoYXQgc2ltcGx5IHJlYWRzIGZyb20gYW5kIHdyaXRlcyB0byBhbgorICogaW4tbWVtb3J5IHN0cmluZyBidWZmZXIuIEFueXRpbWUgeW91IGNhbGwgd3JpdGUgb24gaXQsIHRoZSBkYXRhIGlzIHNpbXBseQorICogcGxhY2VkIGludG8gYSBidWZmZXIsIGFuZCBhbnl0aW1lIHlvdSBjYWxsIHJlYWQsIGRhdGEgaXMgcmVhZCBmcm9tIHRoYXQKKyAqIGJ1ZmZlci4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KK2NsYXNzIFRNZW1vcnlCdWZmZXIgZXh0ZW5kcyBUVHJhbnNwb3J0Cit7CisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuIE9wdGlvbmFsbHkgcGFzcyBhbiBpbml0aWFsIHZhbHVlCisgICAgICogZm9yIHRoZSBidWZmZXIuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRidWYgPSAnJykKKyAgICB7CisgICAgICAgICR0aGlzLT5idWZfID0gJGJ1ZjsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgJGJ1Zl8gPSAnJzsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBpc09wZW4oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIG9wZW4oKQorICAgIHsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKQorICAgIHsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGJ1ZikKKyAgICB7CisgICAgICAgICR0aGlzLT5idWZfIC49ICRidWY7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWQoJGxlbikKKyAgICB7CisgICAgICAgICRidWZMZW5ndGggPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPmJ1Zl8pOworCisgICAgICAgIGlmICgkYnVmTGVuZ3RoID09PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAnVE1lbW9yeUJ1ZmZlcjogQ291bGQgbm90IHJlYWQgJyAuCisgICAgICAgICAgICAgICAgJGxlbiAuICcgYnl0ZXMgZnJvbSBidWZmZXIuJywKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOCisgICAgICAgICAgICApOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCRidWZMZW5ndGggPD0gJGxlbikgeworICAgICAgICAgICAgJHJldCA9ICR0aGlzLT5idWZfOworICAgICAgICAgICAgJHRoaXMtPmJ1Zl8gPSAnJzsKKworICAgICAgICAgICAgcmV0dXJuICRyZXQ7CisgICAgICAgIH0KKworICAgICAgICAkcmV0ID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCR0aGlzLT5idWZfLCAwLCAkbGVuKTsKKyAgICAgICAgJHRoaXMtPmJ1Zl8gPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdWJzdHIoJHRoaXMtPmJ1Zl8sICRsZW4pOworCisgICAgICAgIHJldHVybiAkcmV0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRCdWZmZXIoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5idWZfOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBhdmFpbGFibGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+YnVmXyk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHB1dEJhY2soJGRhdGEpCisgICAgeworICAgICAgICAkdGhpcy0+YnVmXyA9ICRkYXRhIC4gJHRoaXMtPmJ1Zl87CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVHJhbnNwb3J0L1ROdWxsVHJhbnNwb3J0LnBocCBiL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UTnVsbFRyYW5zcG9ydC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UwODZiNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UTnVsbFRyYW5zcG9ydC5waHAKQEAgLTAsMCArMSw1NiBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcVHJhbnNwb3J0OworCit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxUVHJhbnNwb3J0RXhjZXB0aW9uOworCisvKioKKyAqIFRyYW5zcG9ydCB0aGF0IG9ubHkgYWNjZXB0cyB3cml0ZXMgYW5kIGlnbm9yZXMgdGhlbS4KKyAqIFRoaXMgaXMgdXNlZnVsIGZvciBtZWFzdXJpbmcgdGhlIHNlcmlhbGl6ZWQgc2l6ZSBvZiBzdHJ1Y3R1cmVzLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworY2xhc3MgVE51bGxUcmFuc3BvcnQgZXh0ZW5kcyBUVHJhbnNwb3J0Cit7CisgICAgcHVibGljIGZ1bmN0aW9uIGlzT3BlbigpCisgICAgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gb3BlbigpCisgICAgeworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBjbG9zZSgpCisgICAgeworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkKCRsZW4pCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ2FuJ3QgcmVhZCBmcm9tIFROdWxsVHJhbnNwb3J0LiIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkYnVmKQorICAgIHsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVFBocFN0cmVhbS5waHAgYi9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVFBocFN0cmVhbS5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI4MjNmZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UUGhwU3RyZWFtLnBocApAQCAtMCwwICsxLDEyNCBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcVHJhbnNwb3J0OworCit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxURXhjZXB0aW9uOwordXNlIFRocmlmdFxGYWN0b3J5XFRTdHJpbmdGdW5jRmFjdG9yeTsKKworLyoqCisgKiBQaHAgc3RyZWFtIHRyYW5zcG9ydC4gUmVhZHMgdG8gYW5kIHdyaXRlcyBmcm9tIHRoZSBwaHAgc3RhbmRhcmQgc3RyZWFtcworICogcGhwOi8vaW5wdXQgYW5kIHBocDovL291dHB1dAorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworY2xhc3MgVFBocFN0cmVhbSBleHRlbmRzIFRUcmFuc3BvcnQKK3sKKyAgICBjb25zdCBNT0RFX1IgPSAxOworICAgIGNvbnN0IE1PREVfVyA9IDI7CisKKyAgICBwcml2YXRlICRpblN0cmVhbV8gPSBudWxsOworCisgICAgcHJpdmF0ZSAkb3V0U3RyZWFtXyA9IG51bGw7CisKKyAgICBwcml2YXRlICRyZWFkXyA9IGZhbHNlOworCisgICAgcHJpdmF0ZSAkd3JpdGVfID0gZmFsc2U7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJG1vZGUpCisgICAgeworICAgICAgICAkdGhpcy0+cmVhZF8gPSAkbW9kZSAmIHNlbGY6Ok1PREVfUjsKKyAgICAgICAgJHRoaXMtPndyaXRlXyA9ICRtb2RlICYgc2VsZjo6TU9ERV9XOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBvcGVuKCkKKyAgICB7CisgICAgICAgIGlmICgkdGhpcy0+cmVhZF8pIHsKKyAgICAgICAgICAgICR0aGlzLT5pblN0cmVhbV8gPSBAZm9wZW4oc2VsZjo6aW5TdHJlYW1OYW1lKCksICdyJyk7CisgICAgICAgICAgICBpZiAoIWlzX3Jlc291cmNlKCR0aGlzLT5pblN0cmVhbV8pKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oJ1RQaHBTdHJlYW06IENvdWxkIG5vdCBvcGVuIHBocDovL2lucHV0Jyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCR0aGlzLT53cml0ZV8pIHsKKyAgICAgICAgICAgICR0aGlzLT5vdXRTdHJlYW1fID0gQGZvcGVuKCdwaHA6Ly9vdXRwdXQnLCAndycpOworICAgICAgICAgICAgaWYgKCFpc19yZXNvdXJjZSgkdGhpcy0+b3V0U3RyZWFtXykpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbignVFBocFN0cmVhbTogQ291bGQgbm90IG9wZW4gcGhwOi8vb3V0cHV0Jyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKQorICAgIHsKKyAgICAgICAgaWYgKCR0aGlzLT5yZWFkXykgeworICAgICAgICAgICAgQGZjbG9zZSgkdGhpcy0+aW5TdHJlYW1fKTsKKyAgICAgICAgICAgICR0aGlzLT5pblN0cmVhbV8gPSBudWxsOworICAgICAgICB9CisgICAgICAgIGlmICgkdGhpcy0+d3JpdGVfKSB7CisgICAgICAgICAgICBAZmNsb3NlKCR0aGlzLT5vdXRTdHJlYW1fKTsKKyAgICAgICAgICAgICR0aGlzLT5vdXRTdHJlYW1fID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBpc09wZW4oKQorICAgIHsKKyAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAoISR0aGlzLT5yZWFkXyB8fCBpc19yZXNvdXJjZSgkdGhpcy0+aW5TdHJlYW1fKSkgJiYKKyAgICAgICAgICAgICghJHRoaXMtPndyaXRlXyB8fCBpc19yZXNvdXJjZSgkdGhpcy0+b3V0U3RyZWFtXykpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkKCRsZW4pCisgICAgeworICAgICAgICAkZGF0YSA9IEBmcmVhZCgkdGhpcy0+aW5TdHJlYW1fLCAkbGVuKTsKKyAgICAgICAgaWYgKCRkYXRhID09PSBmYWxzZSB8fCAkZGF0YSA9PT0gJycpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCdUUGhwU3RyZWFtOiBDb3VsZCBub3QgcmVhZCAnIC4gJGxlbiAuICcgYnl0ZXMnKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkZGF0YTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGJ1ZikKKyAgICB7CisgICAgICAgIHdoaWxlIChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJGJ1ZikgPiAwKSB7CisgICAgICAgICAgICAkZ290ID0gQGZ3cml0ZSgkdGhpcy0+b3V0U3RyZWFtXywgJGJ1Zik7CisgICAgICAgICAgICBpZiAoJGdvdCA9PT0gMCB8fCAkZ290ID09PSBmYWxzZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAnVFBocFN0cmVhbTogQ291bGQgbm90IHdyaXRlICcgLiBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJGJ1ZikgLiAnIGJ5dGVzJworICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAkYnVmID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCRidWYsICRnb3QpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGZsdXNoKCkKKyAgICB7CisgICAgICAgIEBmZmx1c2goJHRoaXMtPm91dFN0cmVhbV8pOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGluU3RyZWFtTmFtZSgpCisgICAgeworICAgICAgICBpZiAocGhwX3NhcGlfbmFtZSgpID09ICdjbGknKSB7CisgICAgICAgICAgICByZXR1cm4gJ3BocDovL3N0ZGluJzsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAncGhwOi8vaW5wdXQnOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UU1NMU29ja2V0LnBocCBiL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UU1NMU29ja2V0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGEwYWRiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1RTU0xTb2NrZXQucGhwCkBAIC0wLDAgKzEsMTE3IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxUcmFuc3BvcnQ7CisKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRFeGNlcHRpb247Cit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNlIFRocmlmdFxGYWN0b3J5XFRTdHJpbmdGdW5jRmFjdG9yeTsKKworLyoqCisgKiBTb2NrZXRzIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUVHJhbnNwb3J0IGludGVyZmFjZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KK2NsYXNzIFRTU0xTb2NrZXQgZXh0ZW5kcyBUU29ja2V0Cit7CisgICAgLyoqCisgICAgICogUmVtb3RlIHBvcnQKKyAgICAgKgorICAgICAqIEB2YXIgcmVzb3VyY2UKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJGNvbnRleHRfID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFNvY2tldCBjb25zdHJ1Y3RvcgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkaG9zdCBSZW1vdGUgaG9zdG5hbWUKKyAgICAgKiBAcGFyYW0gaW50ICRwb3J0IFJlbW90ZSBwb3J0CisgICAgICogQHBhcmFtIHJlc291cmNlICRjb250ZXh0IFN0cmVhbSBjb250ZXh0CisgICAgICogQHBhcmFtIGJvb2wgJHBlcnNpc3QgV2hldGhlciB0byB1c2UgYSBwZXJzaXN0ZW50IHNvY2tldAorICAgICAqIEBwYXJhbSBzdHJpbmcgJGRlYnVnSGFuZGxlciBGdW5jdGlvbiB0byBjYWxsIGZvciBlcnJvciBsb2dnaW5nCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KAorICAgICAgICAkaG9zdCA9ICdsb2NhbGhvc3QnLAorICAgICAgICAkcG9ydCA9IDkwOTAsCisgICAgICAgICRjb250ZXh0ID0gbnVsbCwKKyAgICAgICAgJGRlYnVnSGFuZGxlciA9IG51bGwKKyAgICApIHsKKyAgICAgICAgJHRoaXMtPmhvc3RfID0gJHRoaXMtPmdldFNTTEhvc3QoJGhvc3QpOworICAgICAgICAkdGhpcy0+cG9ydF8gPSAkcG9ydDsKKyAgICAgICAgJHRoaXMtPmNvbnRleHRfID0gJGNvbnRleHQ7CisgICAgICAgICR0aGlzLT5kZWJ1Z0hhbmRsZXJfID0gJGRlYnVnSGFuZGxlciA/ICRkZWJ1Z0hhbmRsZXIgOiAnZXJyb3JfbG9nJzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgaG9zdCBuYW1lIHdpdGggU1NMIHRyYW5zcG9ydCBwcm90b2NvbAorICAgICAqIGlmIG5vIHRyYW5zcG9ydCBwcm90b2NvbCBhbHJlYWR5IHNwZWNpZmllZCBpbgorICAgICAqIHRoZSBob3N0IG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRob3N0IEhvc3QgdG8gbGlzdGVuIG9uCisgICAgICogQHJldHVybiBzdHJpbmcgJGhvc3QgICBIb3N0IG5hbWUgd2l0aCB0cmFuc3BvcnQgcHJvdG9jb2wKKyAgICAgKi8KKyAgICBwcml2YXRlIGZ1bmN0aW9uIGdldFNTTEhvc3QoJGhvc3QpCisgICAgeworICAgICAgICAkdHJhbnNwb3J0X3Byb3RvY29sX2xvYyA9IHN0cnBvcygkaG9zdCwgIjovLyIpOworICAgICAgICBpZiAoJHRyYW5zcG9ydF9wcm90b2NvbF9sb2MgPT09IGZhbHNlKSB7CisgICAgICAgICAgICAkaG9zdCA9ICdzc2w6Ly8nIC4gJGhvc3Q7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICRob3N0OworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbm5lY3RzIHRoZSBzb2NrZXQuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIG9wZW4oKQorICAgIHsKKyAgICAgICAgaWYgKCR0aGlzLT5pc09wZW4oKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1NvY2tldCBhbHJlYWR5IGNvbm5lY3RlZCcsIFRUcmFuc3BvcnRFeGNlcHRpb246OkFMUkVBRFlfT1BFTik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZW1wdHkoJHRoaXMtPmhvc3RfKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ0Nhbm5vdCBvcGVuIG51bGwgaG9zdCcsIFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgkdGhpcy0+cG9ydF8gPD0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ0Nhbm5vdCBvcGVuIHdpdGhvdXQgcG9ydCcsIFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKTsKKyAgICAgICAgfQorCisgICAgICAgICR0aGlzLT5oYW5kbGVfID0gQHN0cmVhbV9zb2NrZXRfY2xpZW50KAorICAgICAgICAgICAgJHRoaXMtPmhvc3RfIC4gJzonIC4gJHRoaXMtPnBvcnRfLAorICAgICAgICAgICAgJGVycm5vLAorICAgICAgICAgICAgJGVycnN0ciwKKyAgICAgICAgICAgICR0aGlzLT5zZW5kVGltZW91dFNlY18gKyAoJHRoaXMtPnNlbmRUaW1lb3V0VXNlY18gLyAxMDAwMDAwKSwKKyAgICAgICAgICAgIFNUUkVBTV9DTElFTlRfQ09OTkVDVCwKKyAgICAgICAgICAgICR0aGlzLT5jb250ZXh0XworICAgICAgICApOworCisgICAgICAgIC8vIENvbm5lY3QgZmFpbGVkPworICAgICAgICBpZiAoJHRoaXMtPmhhbmRsZV8gPT09IGZhbHNlKSB7CisgICAgICAgICAgICAkZXJyb3IgPSAnVFNvY2tldDogQ291bGQgbm90IGNvbm5lY3QgdG8gJyAuCisgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfIC4gJzonIC4gJHRoaXMtPnBvcnRfIC4gJyAoJyAuICRlcnJzdHIgLiAnIFsnIC4gJGVycm5vIC4gJ10pJzsKKyAgICAgICAgICAgIGlmICgkdGhpcy0+ZGVidWdfKSB7CisgICAgICAgICAgICAgICAgY2FsbF91c2VyX2Z1bmMoJHRoaXMtPmRlYnVnSGFuZGxlcl8sICRlcnJvcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigkZXJyb3IpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVHJhbnNwb3J0L1RTb2NrZXQucGhwIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1RTb2NrZXQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNDdlZmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVFNvY2tldC5waHAKQEAgLTAsMCArMSwzNjYgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFRyYW5zcG9ydDsKKwordXNlIFRocmlmdFxFeGNlcHRpb25cVEV4Y2VwdGlvbjsKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRUcmFuc3BvcnRFeGNlcHRpb247Cit1c2UgVGhyaWZ0XEZhY3RvcnlcVFN0cmluZ0Z1bmNGYWN0b3J5OworCisvKioKKyAqIFNvY2tldHMgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRUcmFuc3BvcnQgaW50ZXJmYWNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworY2xhc3MgVFNvY2tldCBleHRlbmRzIFRUcmFuc3BvcnQKK3sKKyAgICAvKioKKyAgICAgKiBIYW5kbGUgdG8gUEhQIHNvY2tldAorICAgICAqCisgICAgICogQHZhciByZXNvdXJjZQorICAgICAqLworICAgIHByb3RlY3RlZCAkaGFuZGxlXyA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdGUgaG9zdG5hbWUKKyAgICAgKgorICAgICAqIEB2YXIgc3RyaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkICRob3N0XyA9ICdsb2NhbGhvc3QnOworCisgICAgLyoqCisgICAgICogUmVtb3RlIHBvcnQKKyAgICAgKgorICAgICAqIEB2YXIgaW50CisgICAgICovCisgICAgcHJvdGVjdGVkICRwb3J0XyA9ICc5MDkwJzsKKworICAgIC8qKgorICAgICAqIFNlbmQgdGltZW91dCBpbiBzZWNvbmRzLgorICAgICAqCisgICAgICogQ29tYmluZWQgd2l0aCBzZW5kVGltZW91dFVzZWMgdGhpcyBpcyB1c2VkIGZvciBzZW5kIHRpbWVvdXRzLgorICAgICAqCisgICAgICogQHZhciBpbnQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHNlbmRUaW1lb3V0U2VjXyA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTZW5kIHRpbWVvdXQgaW4gbWljcm9zZWNvbmRzLgorICAgICAqCisgICAgICogQ29tYmluZWQgd2l0aCBzZW5kVGltZW91dFNlYyB0aGlzIGlzIHVzZWQgZm9yIHNlbmQgdGltZW91dHMuCisgICAgICoKKyAgICAgKiBAdmFyIGludAorICAgICAqLworICAgIHByb3RlY3RlZCAkc2VuZFRpbWVvdXRVc2VjXyA9IDEwMDAwMDsKKworICAgIC8qKgorICAgICAqIFJlY3YgdGltZW91dCBpbiBzZWNvbmRzCisgICAgICoKKyAgICAgKiBDb21iaW5lZCB3aXRoIHJlY3ZUaW1lb3V0VXNlYyB0aGlzIGlzIHVzZWQgZm9yIHJlY3YgdGltZW91dHMuCisgICAgICoKKyAgICAgKiBAdmFyIGludAorICAgICAqLworICAgIHByb3RlY3RlZCAkcmVjdlRpbWVvdXRTZWNfID0gMDsKKworICAgIC8qKgorICAgICAqIFJlY3YgdGltZW91dCBpbiBtaWNyb3NlY29uZHMKKyAgICAgKgorICAgICAqIENvbWJpbmVkIHdpdGggcmVjdlRpbWVvdXRTZWMgdGhpcyBpcyB1c2VkIGZvciByZWN2IHRpbWVvdXRzLgorICAgICAqCisgICAgICogQHZhciBpbnQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHJlY3ZUaW1lb3V0VXNlY18gPSA3NTAwMDA7CisKKyAgICAvKioKKyAgICAgKiBQZXJzaXN0ZW50IHNvY2tldCBvciBwbGFpbj8KKyAgICAgKgorICAgICAqIEB2YXIgYm9vbAorICAgICAqLworICAgIHByb3RlY3RlZCAkcGVyc2lzdF8gPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIERlYnVnZ2luZyBvbj8KKyAgICAgKgorICAgICAqIEB2YXIgYm9vbAorICAgICAqLworICAgIHByb3RlY3RlZCAkZGVidWdfID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBEZWJ1ZyBoYW5kbGVyCisgICAgICoKKyAgICAgKiBAdmFyIG1peGVkCisgICAgICovCisgICAgcHJvdGVjdGVkICRkZWJ1Z0hhbmRsZXJfID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFNvY2tldCBjb25zdHJ1Y3RvcgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkaG9zdCBSZW1vdGUgaG9zdG5hbWUKKyAgICAgKiBAcGFyYW0gaW50ICRwb3J0IFJlbW90ZSBwb3J0CisgICAgICogQHBhcmFtIGJvb2wgJHBlcnNpc3QgV2hldGhlciB0byB1c2UgYSBwZXJzaXN0ZW50IHNvY2tldAorICAgICAqIEBwYXJhbSBzdHJpbmcgJGRlYnVnSGFuZGxlciBGdW5jdGlvbiB0byBjYWxsIGZvciBlcnJvciBsb2dnaW5nCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KAorICAgICAgICAkaG9zdCA9ICdsb2NhbGhvc3QnLAorICAgICAgICAkcG9ydCA9IDkwOTAsCisgICAgICAgICRwZXJzaXN0ID0gZmFsc2UsCisgICAgICAgICRkZWJ1Z0hhbmRsZXIgPSBudWxsCisgICAgKSB7CisgICAgICAgICR0aGlzLT5ob3N0XyA9ICRob3N0OworICAgICAgICAkdGhpcy0+cG9ydF8gPSAkcG9ydDsKKyAgICAgICAgJHRoaXMtPnBlcnNpc3RfID0gJHBlcnNpc3Q7CisgICAgICAgICR0aGlzLT5kZWJ1Z0hhbmRsZXJfID0gJGRlYnVnSGFuZGxlciA/ICRkZWJ1Z0hhbmRsZXIgOiAnZXJyb3JfbG9nJzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2UgJGhhbmRsZQorICAgICAqIEByZXR1cm4gdm9pZAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRIYW5kbGUoJGhhbmRsZSkKKyAgICB7CisgICAgICAgICR0aGlzLT5oYW5kbGVfID0gJGhhbmRsZTsKKyAgICAgICAgc3RyZWFtX3NldF9ibG9ja2luZygkdGhpcy0+aGFuZGxlXywgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHNlbmQgdGltZW91dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnQgJHRpbWVvdXQgVGltZW91dCBpbiBtaWxsaXNlY29uZHMuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHNldFNlbmRUaW1lb3V0KCR0aW1lb3V0KQorICAgIHsKKyAgICAgICAgJHRoaXMtPnNlbmRUaW1lb3V0U2VjXyA9IGZsb29yKCR0aW1lb3V0IC8gMTAwMCk7CisgICAgICAgICR0aGlzLT5zZW5kVGltZW91dFVzZWNfID0KKyAgICAgICAgICAgICgkdGltZW91dCAtICgkdGhpcy0+c2VuZFRpbWVvdXRTZWNfICogMTAwMCkpICogMTAwMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSByZWNlaXZlIHRpbWVvdXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW50ICR0aW1lb3V0IFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRSZWN2VGltZW91dCgkdGltZW91dCkKKyAgICB7CisgICAgICAgICR0aGlzLT5yZWN2VGltZW91dFNlY18gPSBmbG9vcigkdGltZW91dCAvIDEwMDApOworICAgICAgICAkdGhpcy0+cmVjdlRpbWVvdXRVc2VjXyA9CisgICAgICAgICAgICAoJHRpbWVvdXQgLSAoJHRoaXMtPnJlY3ZUaW1lb3V0U2VjXyAqIDEwMDApKSAqIDEwMDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBkZWJ1Z2dpbmcgb3V0cHV0IG9uIG9yIG9mZgorICAgICAqCisgICAgICogQHBhcmFtIGJvb2wgJGRlYnVnCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHNldERlYnVnKCRkZWJ1ZykKKyAgICB7CisgICAgICAgICR0aGlzLT5kZWJ1Z18gPSAkZGVidWc7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBob3N0IHRoYXQgdGhpcyBzb2NrZXQgaXMgY29ubmVjdGVkIHRvCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHN0cmluZyBob3N0CisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGdldEhvc3QoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5ob3N0XzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHJlbW90ZSBwb3J0IHRoYXQgdGhpcyBzb2NrZXQgaXMgY29ubmVjdGVkIHRvCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGludCBwb3J0CisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGdldFBvcnQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5wb3J0XzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB3aGV0aGVyIHRoaXMgaXMgb3BlbgorICAgICAqCisgICAgICogQHJldHVybiBib29sIHRydWUgaWYgdGhlIHNvY2tldCBpcyBvcGVuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGlzT3BlbigpCisgICAgeworICAgICAgICByZXR1cm4gaXNfcmVzb3VyY2UoJHRoaXMtPmhhbmRsZV8pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbm5lY3RzIHRoZSBzb2NrZXQuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIG9wZW4oKQorICAgIHsKKyAgICAgICAgaWYgKCR0aGlzLT5pc09wZW4oKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1NvY2tldCBhbHJlYWR5IGNvbm5lY3RlZCcsIFRUcmFuc3BvcnRFeGNlcHRpb246OkFMUkVBRFlfT1BFTik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZW1wdHkoJHRoaXMtPmhvc3RfKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ0Nhbm5vdCBvcGVuIG51bGwgaG9zdCcsIFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgkdGhpcy0+cG9ydF8gPD0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ0Nhbm5vdCBvcGVuIHdpdGhvdXQgcG9ydCcsIFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgkdGhpcy0+cGVyc2lzdF8pIHsKKyAgICAgICAgICAgICR0aGlzLT5oYW5kbGVfID0gQHBmc29ja29wZW4oCisgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfLAorICAgICAgICAgICAgICAgICR0aGlzLT5wb3J0XywKKyAgICAgICAgICAgICAgICAkZXJybm8sCisgICAgICAgICAgICAgICAgJGVycnN0ciwKKyAgICAgICAgICAgICAgICAkdGhpcy0+c2VuZFRpbWVvdXRTZWNfICsgKCR0aGlzLT5zZW5kVGltZW91dFVzZWNfIC8gMTAwMDAwMCkKKyAgICAgICAgICAgICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkdGhpcy0+aGFuZGxlXyA9IEBmc29ja29wZW4oCisgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfLAorICAgICAgICAgICAgICAgICR0aGlzLT5wb3J0XywKKyAgICAgICAgICAgICAgICAkZXJybm8sCisgICAgICAgICAgICAgICAgJGVycnN0ciwKKyAgICAgICAgICAgICAgICAkdGhpcy0+c2VuZFRpbWVvdXRTZWNfICsgKCR0aGlzLT5zZW5kVGltZW91dFVzZWNfIC8gMTAwMDAwMCkKKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDb25uZWN0IGZhaWxlZD8KKyAgICAgICAgaWYgKCR0aGlzLT5oYW5kbGVfID09PSBmYWxzZSkgeworICAgICAgICAgICAgJGVycm9yID0gJ1RTb2NrZXQ6IENvdWxkIG5vdCBjb25uZWN0IHRvICcgLgorICAgICAgICAgICAgICAgICR0aGlzLT5ob3N0XyAuICc6JyAuICR0aGlzLT5wb3J0XyAuICcgKCcgLiAkZXJyc3RyIC4gJyBbJyAuICRlcnJubyAuICddKSc7CisgICAgICAgICAgICBpZiAoJHRoaXMtPmRlYnVnXykgeworICAgICAgICAgICAgICAgIGNhbGxfdXNlcl9mdW5jKCR0aGlzLT5kZWJ1Z0hhbmRsZXJfLCAkZXJyb3IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oJGVycm9yKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ3NvY2tldF9pbXBvcnRfc3RyZWFtJykgJiYgZnVuY3Rpb25fZXhpc3RzKCdzb2NrZXRfc2V0X29wdGlvbicpKSB7CisgICAgICAgICAgICAkc29ja2V0ID0gc29ja2V0X2ltcG9ydF9zdHJlYW0oJHRoaXMtPmhhbmRsZV8pOworICAgICAgICAgICAgc29ja2V0X3NldF9vcHRpb24oJHNvY2tldCwgU09MX1RDUCwgVENQX05PREVMQVksIDEpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2VzIHRoZSBzb2NrZXQuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkKKyAgICB7CisgICAgICAgIEBmY2xvc2UoJHRoaXMtPmhhbmRsZV8pOworICAgICAgICAkdGhpcy0+aGFuZGxlXyA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCBmcm9tIHRoZSBzb2NrZXQgYXQgbW9zdCAkbGVuIGJ5dGVzLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2Qgd2lsbCBub3Qgd2FpdCBmb3IgYWxsIHRoZSByZXF1ZXN0ZWQgZGF0YSwgaXQgd2lsbCByZXR1cm4gYXMKKyAgICAgKiBzb29uIGFzIGFueSBkYXRhIGlzIHJlY2VpdmVkLgorICAgICAqCisgICAgICogQHBhcmFtIGludCAkbGVuIE1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQuCisgICAgICogQHJldHVybiBzdHJpbmcgQmluYXJ5IGRhdGEKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkbGVuKQorICAgIHsKKyAgICAgICAgJG51bGwgPSBudWxsOworICAgICAgICAkcmVhZCA9IGFycmF5KCR0aGlzLT5oYW5kbGVfKTsKKyAgICAgICAgJHJlYWRhYmxlID0gQHN0cmVhbV9zZWxlY3QoCisgICAgICAgICAgICAkcmVhZCwKKyAgICAgICAgICAgICRudWxsLAorICAgICAgICAgICAgJG51bGwsCisgICAgICAgICAgICAkdGhpcy0+cmVjdlRpbWVvdXRTZWNfLAorICAgICAgICAgICAgJHRoaXMtPnJlY3ZUaW1lb3V0VXNlY18KKyAgICAgICAgKTsKKworICAgICAgICBpZiAoJHJlYWRhYmxlID4gMCkgeworICAgICAgICAgICAgJGRhdGEgPSBmcmVhZCgkdGhpcy0+aGFuZGxlXywgJGxlbik7CisgICAgICAgICAgICBpZiAoJGRhdGEgPT09IGZhbHNlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1RTb2NrZXQ6IENvdWxkIG5vdCByZWFkICcgLiAkbGVuIC4gJyBieXRlcyBmcm9tICcgLgorICAgICAgICAgICAgICAgICAgICAkdGhpcy0+aG9zdF8gLiAnOicgLiAkdGhpcy0+cG9ydF8pOworICAgICAgICAgICAgfSBlbHNlaWYgKCRkYXRhID09ICcnICYmIGZlb2YoJHRoaXMtPmhhbmRsZV8pKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1RTb2NrZXQgcmVhZCAwIGJ5dGVzJyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiAkZGF0YTsKKyAgICAgICAgfSBlbHNlaWYgKCRyZWFkYWJsZSA9PT0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1RTb2NrZXQ6IHRpbWVkIG91dCByZWFkaW5nICcgLiAkbGVuIC4gJyBieXRlcyBmcm9tICcgLgorICAgICAgICAgICAgICAgICR0aGlzLT5ob3N0XyAuICc6JyAuICR0aGlzLT5wb3J0Xyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignVFNvY2tldDogQ291bGQgbm90IHJlYWQgJyAuICRsZW4gLiAnIGJ5dGVzIGZyb20gJyAuCisgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfIC4gJzonIC4gJHRoaXMtPnBvcnRfKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIHRvIHRoZSBzb2NrZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRidWYgVGhlIGRhdGEgdG8gd3JpdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGJ1ZikKKyAgICB7CisgICAgICAgICRudWxsID0gbnVsbDsKKyAgICAgICAgJHdyaXRlID0gYXJyYXkoJHRoaXMtPmhhbmRsZV8pOworCisgICAgICAgIC8vIGtlZXAgd3JpdGluZyB1bnRpbCBhbGwgdGhlIGRhdGEgaGFzIGJlZW4gd3JpdHRlbgorICAgICAgICB3aGlsZSAoVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCRidWYpID4gMCkgeworICAgICAgICAgICAgLy8gd2FpdCBmb3Igc3RyZWFtIHRvIGJlY29tZSBhdmFpbGFibGUgZm9yIHdyaXRpbmcKKyAgICAgICAgICAgICR3cml0YWJsZSA9IEBzdHJlYW1fc2VsZWN0KAorICAgICAgICAgICAgICAgICRudWxsLAorICAgICAgICAgICAgICAgICR3cml0ZSwKKyAgICAgICAgICAgICAgICAkbnVsbCwKKyAgICAgICAgICAgICAgICAkdGhpcy0+c2VuZFRpbWVvdXRTZWNfLAorICAgICAgICAgICAgICAgICR0aGlzLT5zZW5kVGltZW91dFVzZWNfCisgICAgICAgICAgICApOworICAgICAgICAgICAgaWYgKCR3cml0YWJsZSA+IDApIHsKKyAgICAgICAgICAgICAgICAvLyB3cml0ZSBidWZmZXIgdG8gc3RyZWFtCisgICAgICAgICAgICAgICAgJHdyaXR0ZW4gPSBmd3JpdGUoJHRoaXMtPmhhbmRsZV8sICRidWYpOworICAgICAgICAgICAgICAgIGlmICgkd3JpdHRlbiA9PT0gLTEgfHwgJHdyaXR0ZW4gPT09IGZhbHNlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgJ1RTb2NrZXQ6IENvdWxkIG5vdCB3cml0ZSAnIC4gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCRidWYpIC4gJyBieXRlcyAnIC4KKyAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5ob3N0XyAuICc6JyAuICR0aGlzLT5wb3J0XworICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBkZXRlcm1pbmUgaG93IG11Y2ggb2YgdGhlIGJ1ZmZlciBpcyBsZWZ0IHRvIHdyaXRlCisgICAgICAgICAgICAgICAgJGJ1ZiA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN1YnN0cigkYnVmLCAkd3JpdHRlbik7CisgICAgICAgICAgICB9IGVsc2VpZiAoJHdyaXRhYmxlID09PSAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICdUU29ja2V0OiB0aW1lZCBvdXQgd3JpdGluZyAnIC4gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCRidWYpIC4gJyBieXRlcyBmcm9tICcgLgorICAgICAgICAgICAgICAgICAgICAkdGhpcy0+aG9zdF8gLiAnOicgLiAkdGhpcy0+cG9ydF8KKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgJ1RTb2NrZXQ6IENvdWxkIG5vdCB3cml0ZSAnIC4gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCRidWYpIC4gJyBieXRlcyAnIC4KKyAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfIC4gJzonIC4gJHRoaXMtPnBvcnRfCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZsdXNoIG91dHB1dCB0byB0aGUgc29ja2V0LgorICAgICAqCisgICAgICogU2luY2UgcmVhZCgpLCByZWFkQWxsKCkgYW5kIHdyaXRlKCkgb3BlcmF0ZSBvbiB0aGUgc29ja2V0cyBkaXJlY3RseSwKKyAgICAgKiB0aGlzIGlzIGEgbm8tb3AKKyAgICAgKgorICAgICAqIElmIHlvdSB3aXNoIHRvIGhhdmUgZmx1c2hhYmxlIGJ1ZmZlcmluZyBiZWhhdmlvdXIsIHdyYXAgdGhpcyBUU29ja2V0CisgICAgICogaW4gYSBUQnVmZmVyZWRUcmFuc3BvcnQuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGZsdXNoKCkKKyAgICB7CisgICAgICAgIC8vIG5vLW9wCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVHJhbnNwb3J0L1RTb2NrZXRQb29sLnBocCBiL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UU29ja2V0UG9vbC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I5ZThkZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UU29ja2V0UG9vbC5waHAKQEAgLTAsMCArMSwzMTAgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFRyYW5zcG9ydDsKKwordXNlIFRocmlmdFxFeGNlcHRpb25cVEV4Y2VwdGlvbjsKKworLyoqCisgKiBUaGlzIGxpYnJhcnkgbWFrZXMgdXNlIG9mIEFQQyBjYWNoZSB0byBtYWtlIGhvc3RzIGFzIGRvd24gaW4gYSB3ZWIKKyAqIGVudmlyb25tZW50LiBJZiB5b3UgYXJlIHJ1bm5pbmcgZnJvbSB0aGUgQ0xJIG9yIG9uIGEgc3lzdGVtIHdpdGhvdXQgQVBDCisgKiBpbnN0YWxsZWQsIHRoZW4gdGhlc2UgbnVsbCBmdW5jdGlvbnMgd2lsbCBzdGVwIGluIGFuZCBhY3QgbGlrZSBjYWNoZQorICogbWlzc2VzLgorICovCitpZiAoIWZ1bmN0aW9uX2V4aXN0cygnYXBjX2ZldGNoJykpIHsKKyAgICBmdW5jdGlvbiBhcGNfZmV0Y2goJGtleSkKKyAgICB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBhcGNfc3RvcmUoJGtleSwgJHZhciwgJHR0bCA9IDApCisgICAgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCisvKioKKyAqIFNvY2tldHMgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRUcmFuc3BvcnQgaW50ZXJmYWNlIHRoYXQgYWxsb3dzIGNvbm5lY3Rpb24KKyAqIHRvIGEgcG9vbCBvZiBzZXJ2ZXJzLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworY2xhc3MgVFNvY2tldFBvb2wgZXh0ZW5kcyBUU29ja2V0Cit7CisgICAgLyoqCisgICAgICogUmVtb3RlIHNlcnZlcnMuIEFycmF5IG9mIGFzc29jaWF0aXZlIGFycmF5cyB3aXRoICdob3N0JyBhbmQgJ3BvcnQnIGtleXMKKyAgICAgKi8KKyAgICBwcml2YXRlICRzZXJ2ZXJzXyA9IGFycmF5KCk7CisKKyAgICAvKioKKyAgICAgKiBIb3cgbWFueSB0aW1lcyB0byByZXRyeSBlYWNoIGhvc3QgaW4gY29ubmVjdAorICAgICAqCisgICAgICogQHZhciBpbnQKKyAgICAgKi8KKyAgICBwcml2YXRlICRudW1SZXRyaWVzXyA9IDE7CisKKyAgICAvKioKKyAgICAgKiBSZXRyeSBpbnRlcnZhbCBpbiBzZWNvbmRzLCBob3cgbG9uZyB0byBub3QgdHJ5IGEgaG9zdCBpZiBpdCBoYXMgYmVlbgorICAgICAqIG1hcmtlZCBhcyBkb3duLgorICAgICAqCisgICAgICogQHZhciBpbnQKKyAgICAgKi8KKyAgICBwcml2YXRlICRyZXRyeUludGVydmFsXyA9IDYwOworCisgICAgLyoqCisgICAgICogTWF4IGNvbnNlY3V0aXZlIGZhaWx1cmVzIGJlZm9yZSBtYXJraW5nIGEgaG9zdCBkb3duLgorICAgICAqCisgICAgICogQHZhciBpbnQKKyAgICAgKi8KKyAgICBwcml2YXRlICRtYXhDb25zZWN1dGl2ZUZhaWx1cmVzXyA9IDE7CisKKyAgICAvKioKKyAgICAgKiBUcnkgaG9zdHMgaW4gb3JkZXI/IG9yIFJhbmRvbWl6ZWQ/CisgICAgICoKKyAgICAgKiBAdmFyIGJvb2wKKyAgICAgKi8KKyAgICBwcml2YXRlICRyYW5kb21pemVfID0gdHJ1ZTsKKworICAgIC8qKgorICAgICAqIEFsd2F5cyB0cnkgbGFzdCBob3N0LCBldmVuIGlmIG1hcmtlZCBkb3duPworICAgICAqCisgICAgICogQHZhciBib29sCisgICAgICovCisgICAgcHJpdmF0ZSAkYWx3YXlzVHJ5TGFzdF8gPSB0cnVlOworCisgICAgLyoqCisgICAgICogU29ja2V0IHBvb2wgY29uc3RydWN0b3IKKyAgICAgKgorICAgICAqIEBwYXJhbSBhcnJheSAkaG9zdHMgTGlzdCBvZiByZW1vdGUgaG9zdG5hbWVzCisgICAgICogQHBhcmFtIG1peGVkICRwb3J0cyBBcnJheSBvZiByZW1vdGUgcG9ydHMsIG9yIGEgc2luZ2xlIGNvbW1vbiBwb3J0CisgICAgICogQHBhcmFtIGJvb2wgJHBlcnNpc3QgV2hldGhlciB0byB1c2UgYSBwZXJzaXN0ZW50IHNvY2tldAorICAgICAqIEBwYXJhbSBtaXhlZCAkZGVidWdIYW5kbGVyIEZ1bmN0aW9uIGZvciBlcnJvciBsb2dnaW5nCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KAorICAgICAgICAkaG9zdHMgPSBhcnJheSgnbG9jYWxob3N0JyksCisgICAgICAgICRwb3J0cyA9IGFycmF5KDkwOTApLAorICAgICAgICAkcGVyc2lzdCA9IGZhbHNlLAorICAgICAgICAkZGVidWdIYW5kbGVyID0gbnVsbAorICAgICkgeworICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KG51bGwsIDAsICRwZXJzaXN0LCAkZGVidWdIYW5kbGVyKTsKKworICAgICAgICBpZiAoIWlzX2FycmF5KCRwb3J0cykpIHsKKyAgICAgICAgICAgICRwb3J0ID0gJHBvcnRzOworICAgICAgICAgICAgJHBvcnRzID0gYXJyYXkoKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKCRob3N0cyBhcyAka2V5ID0+ICR2YWwpIHsKKyAgICAgICAgICAgICAgICAkcG9ydHNbJGtleV0gPSAkcG9ydDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvcmVhY2ggKCRob3N0cyBhcyAka2V5ID0+ICRob3N0KSB7CisgICAgICAgICAgICAkdGhpcy0+c2VydmVyc18gW10gPSBhcnJheSgnaG9zdCcgPT4gJGhvc3QsCisgICAgICAgICAgICAgICAgJ3BvcnQnID0+ICRwb3J0c1ska2V5XSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBzZXJ2ZXIgdG8gdGhlIHBvb2wKKyAgICAgKgorICAgICAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcHJldmVudCB5b3UgZnJvbSBhZGRpbmcgYSBkdXBsaWNhdGUgc2VydmVyIGVudHJ5LgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkaG9zdCBob3N0bmFtZSBvciBJUAorICAgICAqIEBwYXJhbSBpbnQgJHBvcnQgcG9ydAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRTZXJ2ZXIoJGhvc3QsICRwb3J0KQorICAgIHsKKyAgICAgICAgJHRoaXMtPnNlcnZlcnNfW10gPSBhcnJheSgnaG9zdCcgPT4gJGhvc3QsICdwb3J0JyA9PiAkcG9ydCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBob3cgbWFueSB0aW1lIHRvIGtlZXAgcmV0cnlpbmcgYSBob3N0IGluIHRoZSBjb25uZWN0IGZ1bmN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGludCAkbnVtUmV0cmllcworICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXROdW1SZXRyaWVzKCRudW1SZXRyaWVzKQorICAgIHsKKyAgICAgICAgJHRoaXMtPm51bVJldHJpZXNfID0gJG51bVJldHJpZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBob3cgbG9uZyB0byB3YWl0IHVudGlsIHJldHJ5aW5nIGEgaG9zdCBpZiBpdCB3YXMgbWFya2VkIGRvd24KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnQgJG51bVJldHJpZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gc2V0UmV0cnlJbnRlcnZhbCgkcmV0cnlJbnRlcnZhbCkKKyAgICB7CisgICAgICAgICR0aGlzLT5yZXRyeUludGVydmFsXyA9ICRyZXRyeUludGVydmFsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgaG93IG1hbnkgdGltZSB0byBrZWVwIHJldHJ5aW5nIGEgaG9zdCBiZWZvcmUgbWFya2luZyBpdCBhcyBkb3duLgorICAgICAqCisgICAgICogQHBhcmFtIGludCAkbnVtUmV0cmllcworICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRNYXhDb25zZWN1dGl2ZUZhaWx1cmVzKCRtYXhDb25zZWN1dGl2ZUZhaWx1cmVzKQorICAgIHsKKyAgICAgICAgJHRoaXMtPm1heENvbnNlY3V0aXZlRmFpbHVyZXNfID0gJG1heENvbnNlY3V0aXZlRmFpbHVyZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogVHVybnMgcmFuZG9taXphdGlvbiBpbiBjb25uZWN0IG9yZGVyIG9uIG9yIG9mZi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBib29sICRyYW5kb21pemUKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gc2V0UmFuZG9taXplKCRyYW5kb21pemUpCisgICAgeworICAgICAgICAkdGhpcy0+cmFuZG9taXplXyA9ICRyYW5kb21pemU7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0byBhbHdheXMgdHJ5IHRoZSBsYXN0IHNlcnZlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBib29sICRhbHdheXNUcnlMYXN0CisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHNldEFsd2F5c1RyeUxhc3QoJGFsd2F5c1RyeUxhc3QpCisgICAgeworICAgICAgICAkdGhpcy0+YWx3YXlzVHJ5TGFzdF8gPSAkYWx3YXlzVHJ5TGFzdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25uZWN0cyB0aGUgc29ja2V0IGJ5IGl0ZXJhdGluZyB0aHJvdWdoIGFsbCB0aGUgc2VydmVycyBpbiB0aGUgcG9vbAorICAgICAqIGFuZCB0cnlpbmcgdG8gZmluZCBvbmUgdGhhdCB3b3Jrcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gb3BlbigpCisgICAgeworICAgICAgICAvLyBDaGVjayBpZiB3ZSB3YW50IG9yZGVyIHJhbmRvbWl6YXRpb24KKyAgICAgICAgaWYgKCR0aGlzLT5yYW5kb21pemVfKSB7CisgICAgICAgICAgICBzaHVmZmxlKCR0aGlzLT5zZXJ2ZXJzXyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDb3VudCBzZXJ2ZXJzIHRvIGlkZW50aWZ5IHRoZSAibGFzdCIgb25lCisgICAgICAgICRudW1TZXJ2ZXJzID0gY291bnQoJHRoaXMtPnNlcnZlcnNfKTsKKworICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkbnVtU2VydmVyczsgKyskaSkgeworICAgICAgICAgICAgLy8gVGhpcyBleHRyYWN0cyB0aGUgJGhvc3QgYW5kICRwb3J0IHZhcmlhYmxlcworICAgICAgICAgICAgZXh0cmFjdCgkdGhpcy0+c2VydmVyc19bJGldKTsKKworICAgICAgICAgICAgLy8gQ2hlY2sgQVBDIGNhY2hlIGZvciBhIHJlY29yZCBvZiB0aGlzIHNlcnZlciBiZWluZyBkb3duCisgICAgICAgICAgICAkZmFpbHRpbWVLZXkgPSAndGhyaWZ0X2ZhaWx0aW1lOicgLiAkaG9zdCAuICc6JyAuICRwb3J0IC4gJ34nOworCisgICAgICAgICAgICAvLyBDYWNoZSBtaXNzPyBBc3N1bWUgaXQncyBPSworICAgICAgICAgICAgJGxhc3RGYWlsdGltZSA9IGFwY19mZXRjaCgkZmFpbHRpbWVLZXkpOworICAgICAgICAgICAgaWYgKCRsYXN0RmFpbHRpbWUgPT09IGZhbHNlKSB7CisgICAgICAgICAgICAgICAgJGxhc3RGYWlsdGltZSA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICRyZXRyeUludGVydmFsUGFzc2VkID0gZmFsc2U7CisKKyAgICAgICAgICAgIC8vIENhY2hlIGhpdC4uLm1ha2Ugc3VyZSBlbm91Z2ggdGhlIHJldHJ5IGludGVydmFsIGhhcyBlbGFwc2VkCisgICAgICAgICAgICBpZiAoJGxhc3RGYWlsdGltZSA+IDApIHsKKyAgICAgICAgICAgICAgICAkZWxhcHNlZCA9IHRpbWUoKSAtICRsYXN0RmFpbHRpbWU7CisgICAgICAgICAgICAgICAgaWYgKCRlbGFwc2VkID4gJHRoaXMtPnJldHJ5SW50ZXJ2YWxfKSB7CisgICAgICAgICAgICAgICAgICAgICRyZXRyeUludGVydmFsUGFzc2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5kZWJ1Z18pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxfdXNlcl9mdW5jKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5kZWJ1Z0hhbmRsZXJfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUU29ja2V0UG9vbDogcmV0cnlJbnRlcnZhbCAnIC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnKCcgLiAkdGhpcy0+cmV0cnlJbnRlcnZhbF8gLiAnKSAnIC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaGFzIHBhc3NlZCBmb3IgaG9zdCAnIC4gJGhvc3QgLiAnOicgLiAkcG9ydAorICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gT25seSBjb25uZWN0IGlmIG5vdCBpbiB0aGUgbWlkZGxlIG9mIGEgZmFpbCBpbnRlcnZhbCwgT1IgaWYgdGhpcworICAgICAgICAgICAgLy8gaXMgdGhlIExBU1Qgc2VydmVyIHdlIGFyZSB0cnlpbmcsIGp1c3QgaGFtbWVyIGF3YXkgb24gaXQKKyAgICAgICAgICAgICRpc0xhc3RTZXJ2ZXIgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmICgkdGhpcy0+YWx3YXlzVHJ5TGFzdF8pIHsKKyAgICAgICAgICAgICAgICAkaXNMYXN0U2VydmVyID0gKCRpID09ICgkbnVtU2VydmVycyAtIDEpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCgkbGFzdEZhaWx0aW1lID09PSAwKSB8fAorICAgICAgICAgICAgICAgICgkaXNMYXN0U2VydmVyKSB8fAorICAgICAgICAgICAgICAgICgkbGFzdEZhaWx0aW1lID4gMCAmJiAkcmV0cnlJbnRlcnZhbFBhc3NlZCkpIHsKKyAgICAgICAgICAgICAgICAvLyBTZXQgdW5kZXJseWluZyBUU29ja2V0IHBhcmFtcyB0byB0aGlzIG9uZQorICAgICAgICAgICAgICAgICR0aGlzLT5ob3N0XyA9ICRob3N0OworICAgICAgICAgICAgICAgICR0aGlzLT5wb3J0XyA9ICRwb3J0OworCisgICAgICAgICAgICAgICAgLy8gVHJ5IHVwIHRvIG51bVJldHJpZXNfIGNvbm5lY3Rpb25zIHBlciBzZXJ2ZXIKKyAgICAgICAgICAgICAgICBmb3IgKCRhdHRlbXB0ID0gMDsgJGF0dGVtcHQgPCAkdGhpcy0+bnVtUmV0cmllc187ICRhdHRlbXB0KyspIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgdW5kZXJseWluZyBUU29ja2V0IG9wZW4gZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudDo6b3BlbigpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGNsZWFyIHRoZSBmYWlsdXJlIGNvdW50cyBpZiByZXF1aXJlZCB0byBkbyBzbworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRsYXN0RmFpbHRpbWUgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBjX3N0b3JlKCRmYWlsdGltZUtleSwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN1Y2Nlc3NmdWwgY29ubmVjdGlvbiwgcmV0dXJuIG5vdworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChURXhjZXB0aW9uICR0eCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29ubmVjdGlvbiBmYWlsZWQKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIE1hcmsgZmFpbHVyZSBvZiB0aGlzIGhvc3QgaW4gdGhlIGNhY2hlCisgICAgICAgICAgICAgICAgJGNvbnNlY2ZhaWxzS2V5ID0gJ3RocmlmdF9jb25zZWNmYWlsczonIC4gJGhvc3QgLiAnOicgLiAkcG9ydCAuICd+JzsKKworICAgICAgICAgICAgICAgIC8vIElnbm9yZSBjYWNoZSBtaXNzZXMKKyAgICAgICAgICAgICAgICAkY29uc2VjZmFpbHMgPSBhcGNfZmV0Y2goJGNvbnNlY2ZhaWxzS2V5KTsKKyAgICAgICAgICAgICAgICBpZiAoJGNvbnNlY2ZhaWxzID09PSBmYWxzZSkgeworICAgICAgICAgICAgICAgICAgICAkY29uc2VjZmFpbHMgPSAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIEluY3JlbWVudCBieSBvbmUKKyAgICAgICAgICAgICAgICAkY29uc2VjZmFpbHMrKzsKKworICAgICAgICAgICAgICAgIC8vIExvZyBhbmQgY2FjaGUgdGhpcyBmYWlsdXJlCisgICAgICAgICAgICAgICAgaWYgKCRjb25zZWNmYWlscyA+PSAkdGhpcy0+bWF4Q29uc2VjdXRpdmVGYWlsdXJlc18pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5kZWJ1Z18pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxfdXNlcl9mdW5jKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5kZWJ1Z0hhbmRsZXJfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUU29ja2V0UG9vbDogbWFya2luZyAnIC4gJGhvc3QgLiAnOicgLiAkcG9ydCAuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyBhcyBkb3duIGZvciAnIC4gJHRoaXMtPnJldHJ5SW50ZXJ2YWxfIC4gJyBzZWNzICcgLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhZnRlciAnIC4gJGNvbnNlY2ZhaWxzIC4gJyBmYWlsZWQgYXR0ZW1wdHMuJworICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBTdG9yZSB0aGUgZmFpbHVyZSB0aW1lCisgICAgICAgICAgICAgICAgICAgIGFwY19zdG9yZSgkZmFpbHRpbWVLZXksIHRpbWUoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIGNvdW50IG9mIGNvbnNlY3V0aXZlIGZhaWx1cmVzCisgICAgICAgICAgICAgICAgICAgIGFwY19zdG9yZSgkY29uc2VjZmFpbHNLZXksIDApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGFwY19zdG9yZSgkY29uc2VjZmFpbHNLZXksICRjb25zZWNmYWlscyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gT2ggbm87IHdlIGZhaWxlZCB0aGVtIGFsbC4gVGhlIHN5c3RlbSBpcyB0b3RhbGx5IGlsbCEKKyAgICAgICAgJGVycm9yID0gJ1RTb2NrZXRQb29sOiBBbGwgaG9zdHMgaW4gcG9vbCBhcmUgZG93bi4gJzsKKyAgICAgICAgJGhvc3RzID0gYXJyYXkoKTsKKyAgICAgICAgZm9yZWFjaCAoJHRoaXMtPnNlcnZlcnNfIGFzICRzZXJ2ZXIpIHsKKyAgICAgICAgICAgICRob3N0cyBbXSA9ICRzZXJ2ZXJbJ2hvc3QnXSAuICc6JyAuICRzZXJ2ZXJbJ3BvcnQnXTsKKyAgICAgICAgfQorICAgICAgICAkaG9zdGxpc3QgPSBpbXBsb2RlKCcsJywgJGhvc3RzKTsKKyAgICAgICAgJGVycm9yIC49ICcoJyAuICRob3N0bGlzdCAuICcpJzsKKyAgICAgICAgaWYgKCR0aGlzLT5kZWJ1Z18pIHsKKyAgICAgICAgICAgIGNhbGxfdXNlcl9mdW5jKCR0aGlzLT5kZWJ1Z0hhbmRsZXJfLCAkZXJyb3IpOworICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCRlcnJvcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVHJhbnNwb3J0L1RUcmFuc3BvcnQucGhwIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1RUcmFuc3BvcnQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1OTIxYzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVFRyYW5zcG9ydC5waHAKQEAgLTAsMCArMSw5OCBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcVHJhbnNwb3J0OworCit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNlIFRocmlmdFxGYWN0b3J5XFRTdHJpbmdGdW5jRmFjdG9yeTsKKworLyoqCisgKiBCYXNlIGludGVyZmFjZSBmb3IgYSB0cmFuc3BvcnQgYWdlbnQuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCithYnN0cmFjdCBjbGFzcyBUVHJhbnNwb3J0Cit7CisgICAgLyoqCisgICAgICogV2hldGhlciB0aGlzIHRyYW5zcG9ydCBpcyBvcGVuLgorICAgICAqCisgICAgICogQHJldHVybiBib29sZWFuIHRydWUgaWYgb3BlbgorICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBpc09wZW4oKTsKKworICAgIC8qKgorICAgICAqIE9wZW4gdGhlIHRyYW5zcG9ydCBmb3IgcmVhZGluZy93cml0aW5nCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgY2Fubm90IG9wZW4KKyAgICAgKi8KKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gb3BlbigpOworCisgICAgLyoqCisgICAgICogQ2xvc2UgdGhlIHRyYW5zcG9ydC4KKyAgICAgKi8KKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKTsKKworICAgIC8qKgorICAgICAqIFJlYWQgc29tZSBkYXRhIGludG8gdGhlIGFycmF5LgorICAgICAqCisgICAgICogQHBhcmFtIGludCAkbGVuIEhvdyBtdWNoIHRvIHJlYWQKKyAgICAgKiBAcmV0dXJuIHN0cmluZyBUaGUgZGF0YSB0aGF0IGhhcyBiZWVuIHJlYWQKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgY2Fubm90IHJlYWQgYW55IG1vcmUgZGF0YQorICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkKCRsZW4pOworCisgICAgLyoqCisgICAgICogR3VhcmFudGVlcyB0aGF0IHRoZSBmdWxsIGFtb3VudCBvZiBkYXRhIGlzIHJlYWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHN0cmluZyBUaGUgZGF0YSwgb2YgZXhhY3QgbGVuZ3RoCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGNhbm5vdCByZWFkIGRhdGEKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEFsbCgkbGVuKQorICAgIHsKKyAgICAgICAgLy8gcmV0dXJuICR0aGlzLT5yZWFkKCRsZW4pOworCisgICAgICAgICRkYXRhID0gJyc7CisgICAgICAgICRnb3QgPSAwOworICAgICAgICB3aGlsZSAoKCRnb3QgPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJGRhdGEpKSA8ICRsZW4pIHsKKyAgICAgICAgICAgICRkYXRhIC49ICR0aGlzLT5yZWFkKCRsZW4gLSAkZ290KTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkZGF0YTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgdGhlIGdpdmVuIGRhdGEgb3V0LgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkYnVmIFRoZSBkYXRhIHRvIHdyaXRlCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIHdyaXRpbmcgZmFpbHMKKyAgICAgKi8KKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGJ1Zik7CisKKyAgICAvKioKKyAgICAgKiBGbHVzaGVzIGFueSBwZW5kaW5nIGRhdGEgb3V0IG9mIGEgYnVmZmVyCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgYSB3cml0aW5nIGVycm9yIG9jY3VycworICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBmbHVzaCgpCisgICAgeworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1R5cGUvVENvbnN0YW50LnBocCBiL2xpYi9waHAvbGliL1R5cGUvVENvbnN0YW50LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTVkYTRhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvVHlwZS9UQ29uc3RhbnQucGhwCkBAIC0wLDAgKzEsNTIgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcVHlwZTsKKworLyoqCisgKiBCYXNlIGNsYXNzIGZvciBjb25zdGFudCBNYW5hZ2VtZW50CisgKi8KK2Fic3RyYWN0IGNsYXNzIFRDb25zdGFudAoreworICAgIC8qKgorICAgICAqIERvbid0IGluc3RhbmNpYXRlIHRoaXMgY2xhc3MKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQorICAgIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBjb25zdGFudCB2YWx1ZQorICAgICAqIEBwYXJhbSAgc3RyaW5nICRjb25zdGFudAorICAgICAqIEByZXR1cm4gbWl4ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldCgkY29uc3RhbnQpCisgICAgeworICAgICAgICBpZiAoaXNfbnVsbChzdGF0aWM6OiQkY29uc3RhbnQpKSB7CisgICAgICAgICAgICBzdGF0aWM6OiQkY29uc3RhbnQgPSBjYWxsX3VzZXJfZnVuYygKKyAgICAgICAgICAgICAgICBzcHJpbnRmKCdzdGF0aWM6OmluaXRfJXMnLCAkY29uc3RhbnQpCisgICAgICAgICAgICApOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHN0YXRpYzo6JCRjb25zdGFudDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UeXBlL1RNZXNzYWdlVHlwZS5waHAgYi9saWIvcGhwL2xpYi9UeXBlL1RNZXNzYWdlVHlwZS5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM5YWU2MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1R5cGUvVE1lc3NhZ2VUeXBlLnBocApAQCAtMCwwICsxLDM0IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFR5cGU7CisKKy8qKgorICogTWVzc2FnZSB0eXBlcyBmb3IgUlBDCisgKi8KK2NsYXNzIFRNZXNzYWdlVHlwZQoreworICAgIGNvbnN0IENBTEwgID0gMTsKKyAgICBjb25zdCBSRVBMWSA9IDI7CisgICAgY29uc3QgRVhDRVBUSU9OID0gMzsKKyAgICBjb25zdCBPTkVXQVkgPSA0OworfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVHlwZS9UVHlwZS5waHAgYi9saWIvcGhwL2xpYi9UeXBlL1RUeXBlLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmRiMTVmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvVHlwZS9UVHlwZS5waHAKQEAgLTAsMCArMSw0NyBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0CisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxUeXBlOworCisvKioKKyAqIERhdGEgdHlwZXMgdGhhdCBjYW4gYmUgc2VudCB2aWEgVGhyaWZ0CisgKi8KK2NsYXNzIFRUeXBlCit7CisgICAgY29uc3QgU1RPUCAgID0gMDsKKyAgICBjb25zdCBWT0lEICAgPSAxOworICAgIGNvbnN0IEJPT0wgICA9IDI7CisgICAgY29uc3QgQllURSAgID0gMzsKKyAgICBjb25zdCBJMDggICAgPSAzOworICAgIGNvbnN0IERPVUJMRSA9IDQ7CisgICAgY29uc3QgSTE2ICAgID0gNjsKKyAgICBjb25zdCBJMzIgICAgPSA4OworICAgIGNvbnN0IEk2NCAgICA9IDEwOworICAgIGNvbnN0IFNUUklORyA9IDExOworICAgIGNvbnN0IFVURjcgICA9IDExOworICAgIGNvbnN0IFNUUlVDVCA9IDEyOworICAgIGNvbnN0IE1BUCAgICA9IDEzOworICAgIGNvbnN0IFNFVCAgICA9IDE0OworICAgIGNvbnN0IExTVCAgICA9IDE1OyAgICAvLyBOLkIuIGNhbm5vdCB1c2UgTElTVCBrZXl3b3JkIGluIFBIUCEKKyAgICBjb25zdCBVVEY4ICAgPSAxNjsKKyAgICBjb25zdCBVVEYxNiAgPSAxNzsKK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvY29uZmlnLm00IGIvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9jb25maWcubTQKaW5kZXggMmMzMzhhMC4uZTIxMzhjOCAxMDA2NDQKLS0tIGEvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9jb25maWcubTQKKysrIGIvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9jb25maWcubTQKQEAgLTIsMTQgKzIsMzMgQEAKIGRubCBDb3B5aW5nIGFuZCBkaXN0cmlidXRpb24gb2YgdGhpcyBmaWxlLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAogZG5sIGFyZSBwZXJtaXR0ZWQgaW4gYW55IG1lZGl1bSB3aXRob3V0IHJveWFsdHkgcHJvdmlkZWQgdGhlIGNvcHlyaWdodAogZG5sIG5vdGljZSBhbmQgdGhpcyBub3RpY2UgYXJlIHByZXNlcnZlZC4KK2RubAorZG5sIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK2RubCBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorZG5sIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCitkbmwgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCitkbmwgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorZG5sICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK2RubCB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK2RubAorZG5sICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKK2RubAorZG5sIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK2RubCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorZG5sICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorZG5sIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitkbmwgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworZG5sIHVuZGVyIHRoZSBMaWNlbnNlLgogCiBQSFBfQVJHX0VOQUJMRSh0aHJpZnRfcHJvdG9jb2wsIHdoZXRoZXIgdG8gZW5hYmxlIHRoZSB0aHJpZnRfcHJvdG9jb2wgZXh0ZW5zaW9uLAotWyAgLS1lbmFibGUtdGhyaWZ0X3Byb3RvY29sCUVuYWJsZSB0aGUgZmJ0aHJpZnRfcHJvdG9jb2wgZXh0ZW5zaW9uXSkKK1sgIC0tZW5hYmxlLXRocmlmdF9wcm90b2NvbAlFbmFibGUgdGhlIHRocmlmdF9wcm90b2NvbCBleHRlbnNpb25dKQogCiBpZiB0ZXN0ICIkUEhQX1RIUklGVF9QUk9UT0NPTCIgIT0gIm5vIjsgdGhlbgogICBQSFBfUkVRVUlSRV9DWFgoKQogICBQSFBfQUREX0xJQlJBUllfV0lUSF9QQVRIKHN0ZGMrKywgIiIsIFRIUklGVF9QUk9UT0NPTF9TSEFSRURfTElCQUREKQogICBQSFBfU1VCU1QoVEhSSUZUX1BST1RPQ09MX1NIQVJFRF9MSUJBREQpCisgIENYWEZMQUdTPSIkQ1hYRkxBR1MgLXN0ZD1jKysxMSIKKwogICBQSFBfTkVXX0VYVEVOU0lPTih0aHJpZnRfcHJvdG9jb2wsIHBocF90aHJpZnRfcHJvdG9jb2wuY3BwLCAkZXh0X3NoYXJlZCkKIGZpCiAKZGlmZiAtLWdpdCBhL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvcGhwX3RocmlmdF9wcm90b2NvbC5jcHAgYi9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL3BocF90aHJpZnRfcHJvdG9jb2wuY3BwCmluZGV4IDE3YTczMjQuLjYzYzg5MDUgMTAwNjQ0Ci0tLSBhL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvcGhwX3RocmlmdF9wcm90b2NvbC5jcHAKKysrIGIvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9waHBfdGhyaWZ0X3Byb3RvY29sLmNwcApAQCAtMTYsMjUgKzE2LDIzIEBACiAgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwotCiAjaWZkZWYgSEFWRV9DT05GSUdfSAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2VuZGlmCiAKKyNpbmNsdWRlICJwaHAuaCIKKyNpbmNsdWRlICJ6ZW5kX2ludGVyZmFjZXMuaCIKKyNpbmNsdWRlICJ6ZW5kX2V4Y2VwdGlvbnMuaCIKKyNpbmNsdWRlICJwaHBfdGhyaWZ0X3Byb3RvY29sLmgiCisKKyNpZiBQSFBfVkVSU0lPTl9JRCA+PSA3MDAwMAorCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWYgZGVmaW5lZCggV0lOMzIgKSB8fCBkZWZpbmVkKCBfV0lONjQgKQotdHlwZWRlZiBpbnQgIGludDMyX3Q7IAotdHlwZWRlZiBzaWduZWQgY2hhciBpbnQ4X3Q7Ci10eXBlZGVmIHVuc2lnbmVkIGNoYXIgICB1aW50OF90OwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgdWludDE2X3Q7Ci10eXBlZGVmIGxvbmcgbG9uZyAgaW50NjRfdDsKLXR5cGVkZWYgdW5zaWduZWQgICB1aW50MzJfdDsgCi10eXBlZGVmIHNob3J0ICBpbnQxNl90OyAKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nICAgdWludDY0X3Q7Ci0jZWxzZQotI2luY2x1ZGUgPGFycGEvaW5ldC5oPiAKLSNlbmRpZgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjaW5jbHVkZSA8Y3N0ZGludD4KICNpbmNsdWRlIDxzdGRleGNlcHQ+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgogCiAjaWZuZGVmIGJzd2FwXzY0CiAjZGVmaW5lCWJzd2FwXzY0KHgpICAgICAoKCh1aW50NjRfdCkoeCkgPDwgNTYpIHwgXApAQCAtODcsMjYgKzg1LDIyIEBACiBjb25zdCBpbnQgSU5WQUxJRF9EQVRBID0gMTsKIGNvbnN0IGludCBCQURfVkVSU0lPTiA9IDQ7CiAKLSNpbmNsdWRlICJwaHAuaCIKLSNpbmNsdWRlICJ6ZW5kX2ludGVyZmFjZXMuaCIKLSNpbmNsdWRlICJ6ZW5kX2V4Y2VwdGlvbnMuaCIKLSNpbmNsdWRlICJwaHBfdGhyaWZ0X3Byb3RvY29sLmgiCi0KIHN0YXRpYyB6ZW5kX2Z1bmN0aW9uX2VudHJ5IHRocmlmdF9wcm90b2NvbF9mdW5jdGlvbnNbXSA9IHsKLSAgUEhQX0ZFKHRocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnksIE5VTEwpCi0gIFBIUF9GRSh0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnksIE5VTEwpCi0gIHtOVUxMLCBOVUxMLCBOVUxMfQotfSA7CisgIFBIUF9GRSh0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5LCBudWxscHRyKQorICBQSFBfRkUodGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5LCBudWxscHRyKQorICBQSFBfRkUodGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5X2FmdGVyX21lc3NhZ2VfYmVnaW4sIG51bGxwdHIpCisgIHtudWxscHRyLCBudWxscHRyLCBudWxscHRyfQorfTsKIAogemVuZF9tb2R1bGVfZW50cnkgdGhyaWZ0X3Byb3RvY29sX21vZHVsZV9lbnRyeSA9IHsKICAgU1RBTkRBUkRfTU9EVUxFX0hFQURFUiwKICAgInRocmlmdF9wcm90b2NvbCIsCiAgIHRocmlmdF9wcm90b2NvbF9mdW5jdGlvbnMsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCisgIG51bGxwdHIsCisgIG51bGxwdHIsCisgIG51bGxwdHIsCisgIG51bGxwdHIsCisgIG51bGxwdHIsCiAgICIxLjAiLAogICBTVEFOREFSRF9NT0RVTEVfUFJPUEVSVElFUwogfTsKQEAgLTExNyw0MiArMTExLDYxIEBACiAKIGNsYXNzIFBIUEV4Y2VwdGlvbldyYXBwZXIgOiBwdWJsaWMgc3RkOjpleGNlcHRpb24gewogcHVibGljOgotICBQSFBFeGNlcHRpb25XcmFwcGVyKHp2YWwqIF9leCkgdGhyb3coKSA6IGV4KF9leCkgewotICAgIHNucHJpbnRmKF93aGF0LCA0MCwgIlBIUCBleGNlcHRpb24genZhbD0lcCIsIGV4KTsKKyAgUEhQRXhjZXB0aW9uV3JhcHBlcih6dmFsKiBfZXgpIHRocm93KCkgeworICAgIFpWQUxfQ09QWSgmZXgsIF9leCk7CisgICAgc25wcmludGYoX3doYXQsIDQwLCAiUEhQIGV4Y2VwdGlvbiB6dmFsPSVwIiwgX2V4KTsKICAgfQotICBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3QgdGhyb3coKSB7IHJldHVybiBfd2hhdDsgfQotICB+UEhQRXhjZXB0aW9uV3JhcHBlcigpIHRocm93KCkge30KLSAgb3BlcmF0b3IgenZhbCooKSBjb25zdCB0aHJvdygpIHsgcmV0dXJuIGNvbnN0X2Nhc3Q8enZhbCo+KGV4KTsgfSAvLyBaZW5kIEFQSSBkb2Vzbid0IGRvICdjb25zdCcuLi4KKworICBQSFBFeGNlcHRpb25XcmFwcGVyKHplbmRfb2JqZWN0KiBfZXhvYmopIHRocm93KCkgeworICAgIFpWQUxfT0JKKCZleCwgX2V4b2JqKTsKKyAgICBzbnByaW50Zihfd2hhdCwgNDAsICJQSFAgZXhjZXB0aW9uIHp2YWw9JXAiLCBfZXhvYmopOworICB9CisgIH5QSFBFeGNlcHRpb25XcmFwcGVyKCkgdGhyb3coKSB7CisgICAgenZhbF9kdG9yKCZleCk7CisgIH0KKworICBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3QgdGhyb3coKSB7CisgICAgcmV0dXJuIF93aGF0OworICB9CisgIG9wZXJhdG9yIHp2YWwqKCkgY29uc3QgdGhyb3coKSB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8enZhbCo+KCZleCk7CisgIH0gLy8gWmVuZCBBUEkgZG9lc24ndCBkbyAnY29uc3QnLi4uCiBwcm90ZWN0ZWQ6Ci0gIHp2YWwqIGV4OworICB6dmFsIGV4OwogICBjaGFyIF93aGF0WzQwXTsKIH0gOwogCiBjbGFzcyBQSFBUcmFuc3BvcnQgewotcHVibGljOgotICB6dmFsKiBwcm90b2NvbCgpIHsgcmV0dXJuIHA7IH0KLSAgenZhbCogdHJhbnNwb3J0KCkgeyByZXR1cm4gdDsgfQogcHJvdGVjdGVkOgotICBQSFBUcmFuc3BvcnQoKSB7fQorICBQSFBUcmFuc3BvcnQoenZhbCogX3AsIHNpemVfdCBfYnVmZmVyX3NpemUpIHsKKyAgICBhc3NlcnQoWl9UWVBFX1AoX3ApID09IElTX09CSkVDVCk7CiAKLSAgdm9pZCBjb25zdHJ1Y3Rfd2l0aF96dmFsKHp2YWwqIF9wLCBzaXplX3QgX2J1ZmZlcl9zaXplKSB7CisgICAgWlZBTF9VTkRFRigmdCk7CisKICAgICBidWZmZXIgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihlbWFsbG9jKF9idWZmZXJfc2l6ZSkpOwogICAgIGJ1ZmZlcl9wdHIgPSBidWZmZXI7CiAgICAgYnVmZmVyX3VzZWQgPSAwOwogICAgIGJ1ZmZlcl9zaXplID0gX2J1ZmZlcl9zaXplOwotICAgIHAgPSBfcDsKIAogICAgIC8vIEdldCB0aGUgdHJhbnNwb3J0IGZvciB0aGUgcGFzc2VkIHByb3RvY29sCiAgICAgenZhbCBnZXR0cmFuc3BvcnQ7Ci0gICAgWlZBTF9TVFJJTkcoJmdldHRyYW5zcG9ydCwgImdldFRyYW5zcG9ydCIsIDApOwotICAgIE1BS0VfU1REX1pWQUwodCk7Ci0gICAgWlZBTF9OVUxMKHQpOwotICAgIFRTUk1MU19GRVRDSCgpOwotICAgIGNhbGxfdXNlcl9mdW5jdGlvbihFRyhmdW5jdGlvbl90YWJsZSksICZwLCAmZ2V0dHJhbnNwb3J0LCB0LCAwLCBOVUxMIFRTUk1MU19DQyk7CisgICAgWlZBTF9TVFJJTkcoJmdldHRyYW5zcG9ydCwgImdldFRyYW5zcG9ydCIpOworICAgIGNhbGxfdXNlcl9mdW5jdGlvbihudWxscHRyLCBfcCwgJmdldHRyYW5zcG9ydCwgJnQsIDAsIG51bGxwdHIpOworCisgICAgenZhbF9kdG9yKCZnZXR0cmFuc3BvcnQpOworCisgICAgaWYgKEVHKGV4Y2VwdGlvbikpIHsKKyAgICAgIHplbmRfb2JqZWN0ICpleCA9IEVHKGV4Y2VwdGlvbik7CisgICAgICBFRyhleGNlcHRpb24pID0gbnVsbHB0cjsKKyAgICAgIHRocm93IFBIUEV4Y2VwdGlvbldyYXBwZXIoZXgpOworICAgIH0KKworICAgIGFzc2VydChaX1RZUEUodCkgPT0gSVNfT0JKRUNUKTsKICAgfQorCiAgIH5QSFBUcmFuc3BvcnQoKSB7CiAgICAgZWZyZWUoYnVmZmVyKTsKLSAgICB6dmFsX3B0cl9kdG9yKCZ0KTsKKyAgICB6dmFsX2R0b3IoJnQpOwogICB9CiAKICAgY2hhciogYnVmZmVyOwpAQCAtMTYwLDIwICsxNzMsMTQgQEAKICAgc2l6ZV90IGJ1ZmZlcl91c2VkOwogICBzaXplX3QgYnVmZmVyX3NpemU7CiAKLSAgenZhbCogcDsKLSAgenZhbCogdDsKKyAgenZhbCB0OwogfTsKIAogCiBjbGFzcyBQSFBPdXRwdXRUcmFuc3BvcnQgOiBwdWJsaWMgUEhQVHJhbnNwb3J0IHsKIHB1YmxpYzoKLSAgUEhQT3V0cHV0VHJhbnNwb3J0KHp2YWwqIF9wLCBzaXplX3QgX2J1ZmZlcl9zaXplID0gODE5MikgewotICAgIGNvbnN0cnVjdF93aXRoX3p2YWwoX3AsIF9idWZmZXJfc2l6ZSk7Ci0gIH0KLQotICB+UEhQT3V0cHV0VHJhbnNwb3J0KCkgewotICAgIC8vZmx1c2goKTsKLSAgfQorICBQSFBPdXRwdXRUcmFuc3BvcnQoenZhbCogX3AsIHNpemVfdCBfYnVmZmVyX3NpemUgPSA4MTkyKSA6IFBIUFRyYW5zcG9ydChfcCwgX2J1ZmZlcl9zaXplKSB7IH0KKyAgflBIUE91dHB1dFRyYW5zcG9ydCgpIHsgfQogCiAgIHZvaWQgd3JpdGUoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IGxlbikgewogICAgIGlmICgobGVuICsgYnVmZmVyX3VzZWQpID4gYnVmZmVyX3NpemUpIHsKQEAgLTIzMSwzMiArMjM4LDM1IEBACiAgICAgfQogICB9CiAgIHZvaWQgZGlyZWN0Rmx1c2goKSB7Ci0gICAgenZhbCByZXQ7CisgICAgenZhbCByZXQsIGZsdXNoZm47CiAgICAgWlZBTF9OVUxMKCZyZXQpOwotICAgIHp2YWwgZmx1c2hmbjsKLSAgICBaVkFMX1NUUklORygmZmx1c2hmbiwgImZsdXNoIiwgMCk7Ci0gICAgVFNSTUxTX0ZFVENIKCk7Ci0gICAgY2FsbF91c2VyX2Z1bmN0aW9uKEVHKGZ1bmN0aW9uX3RhYmxlKSwgJnQsICZmbHVzaGZuLCAmcmV0LCAwLCBOVUxMIFRTUk1MU19DQyk7Ci0gICAgenZhbF9kdG9yKCZyZXQpOwotICB9Ci0gIHZvaWQgZGlyZWN0V3JpdGUoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IGxlbikgewotICAgIHp2YWwgd3JpdGVmbjsKLSAgICBaVkFMX1NUUklORygmd3JpdGVmbiwgIndyaXRlIiwgMCk7Ci0gICAgY2hhciogbmV3YnVmID0gKGNoYXIqKWVtYWxsb2MobGVuICsgMSk7Ci0gICAgbWVtY3B5KG5ld2J1ZiwgZGF0YSwgbGVuKTsKLSAgICBuZXdidWZbbGVuXSA9ICdcMCc7Ci0gICAgenZhbCAqYXJnc1sxXTsKLSAgICBNQUtFX1NURF9aVkFMKGFyZ3NbMF0pOwotICAgIFpWQUxfU1RSSU5HTChhcmdzWzBdLCBuZXdidWYsIGxlbiwgMCk7Ci0gICAgVFNSTUxTX0ZFVENIKCk7Ci0gICAgenZhbCByZXQ7Ci0gICAgWlZBTF9OVUxMKCZyZXQpOwotICAgIGNhbGxfdXNlcl9mdW5jdGlvbihFRyhmdW5jdGlvbl90YWJsZSksICZ0LCAmd3JpdGVmbiwgJnJldCwgMSwgYXJncyBUU1JNTFNfQ0MpOwotICAgIHp2YWxfcHRyX2R0b3IoYXJncyk7CisgICAgWlZBTF9TVFJJTkcoJmZsdXNoZm4sICJmbHVzaCIpOworCisgICAgY2FsbF91c2VyX2Z1bmN0aW9uKEVHKGZ1bmN0aW9uX3RhYmxlKSwgJih0aGlzLT50KSwgJmZsdXNoZm4sICZyZXQsIDAsIG51bGxwdHIpOworICAgIHp2YWxfZHRvcigmZmx1c2hmbik7CiAgICAgenZhbF9kdG9yKCZyZXQpOwogICAgIGlmIChFRyhleGNlcHRpb24pKSB7Ci0gICAgICB6dmFsKiBleCA9IEVHKGV4Y2VwdGlvbik7Ci0gICAgICBFRyhleGNlcHRpb24pID0gTlVMTDsKKyAgICAgIHplbmRfb2JqZWN0ICpleCA9IEVHKGV4Y2VwdGlvbik7CisgICAgICBFRyhleGNlcHRpb24pID0gbnVsbHB0cjsKKyAgICAgIHRocm93IFBIUEV4Y2VwdGlvbldyYXBwZXIoZXgpOworICAgIH0KKyAgfQorICB2b2lkIGRpcmVjdFdyaXRlKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBsZW4pIHsKKyAgICB6dmFsIGFyZ3NbMV0sIHJldCwgd3JpdGVmbjsKKworICAgIFpWQUxfU1RSSU5HKCZ3cml0ZWZuLCAid3JpdGUiKTsKKyAgICBaVkFMX1NUUklOR0woJmFyZ3NbMF0sIGRhdGEsIGxlbik7CisKKyAgICBaVkFMX05VTEwoJnJldCk7CisgICAgY2FsbF91c2VyX2Z1bmN0aW9uKEVHKGZ1bmN0aW9uX3RhYmxlKSwgJih0aGlzLT50KSwgJndyaXRlZm4sICZyZXQsIDEsIGFyZ3MpOworCisgICAgenZhbF9kdG9yKCZ3cml0ZWZuKTsKKyAgICB6dmFsX2R0b3IoJnJldCk7CisgICAgenZhbF9kdG9yKCZhcmdzWzBdKTsKKworICAgIGlmIChFRyhleGNlcHRpb24pKSB7CisgICAgICB6ZW5kX29iamVjdCAqZXggPSBFRyhleGNlcHRpb24pOworICAgICAgRUcoZXhjZXB0aW9uKSA9IG51bGxwdHI7CiAgICAgICB0aHJvdyBQSFBFeGNlcHRpb25XcmFwcGVyKGV4KTsKICAgICB9CiAgIH0KQEAgLTI2NCw4ICsyNzQsNyBAQAogCiBjbGFzcyBQSFBJbnB1dFRyYW5zcG9ydCA6IHB1YmxpYyBQSFBUcmFuc3BvcnQgewogcHVibGljOgotICBQSFBJbnB1dFRyYW5zcG9ydCh6dmFsKiBfcCwgc2l6ZV90IF9idWZmZXJfc2l6ZSA9IDgxOTIpIHsKLSAgICBjb25zdHJ1Y3Rfd2l0aF96dmFsKF9wLCBfYnVmZmVyX3NpemUpOworICBQSFBJbnB1dFRyYW5zcG9ydCh6dmFsKiBfcCwgc2l6ZV90IF9idWZmZXJfc2l6ZSA9IDgxOTIpIDogUEhQVHJhbnNwb3J0KF9wLCBfYnVmZmVyX3NpemUpIHsKICAgfQogCiAgIH5QSFBJbnB1dFRyYW5zcG9ydCgpIHsKQEAgLTI3NCwyNCArMjgzLDIxIEBACiAKICAgdm9pZCBwdXRfYmFjaygpIHsKICAgICBpZiAoYnVmZmVyX3VzZWQpIHsKLSAgICAgIHp2YWwgcHV0YmFja2ZuOwotICAgICAgWlZBTF9TVFJJTkcoJnB1dGJhY2tmbiwgInB1dEJhY2siLCAwKTsKLQotICAgICAgY2hhciogbmV3YnVmID0gKGNoYXIqKWVtYWxsb2MoYnVmZmVyX3VzZWQgKyAxKTsKLSAgICAgIG1lbWNweShuZXdidWYsIGJ1ZmZlcl9wdHIsIGJ1ZmZlcl91c2VkKTsKLSAgICAgIG5ld2J1ZltidWZmZXJfdXNlZF0gPSAnXDAnOwotCi0gICAgICB6dmFsICphcmdzWzFdOwotICAgICAgTUFLRV9TVERfWlZBTChhcmdzWzBdKTsKLSAgICAgIFpWQUxfU1RSSU5HTChhcmdzWzBdLCBuZXdidWYsIGJ1ZmZlcl91c2VkLCAwKTsKLQotICAgICAgVFNSTUxTX0ZFVENIKCk7Ci0KLSAgICAgIHp2YWwgcmV0OworICAgICAgenZhbCBhcmdzWzFdLCByZXQsIHB1dGJhY2tmbjsKKyAgICAgIFpWQUxfU1RSSU5HTCgmYXJnc1swXSwgYnVmZmVyX3B0ciwgYnVmZmVyX3VzZWQpOworICAgICAgWlZBTF9TVFJJTkcoJnB1dGJhY2tmbiwgInB1dEJhY2siKTsKICAgICAgIFpWQUxfTlVMTCgmcmV0KTsKLSAgICAgIGNhbGxfdXNlcl9mdW5jdGlvbihFRyhmdW5jdGlvbl90YWJsZSksICZ0LCAmcHV0YmFja2ZuLCAmcmV0LCAxLCBhcmdzIFRTUk1MU19DQyk7Ci0gICAgICB6dmFsX3B0cl9kdG9yKGFyZ3MpOworCisgICAgICBjYWxsX3VzZXJfZnVuY3Rpb24oRUcoZnVuY3Rpb25fdGFibGUpLCAmKHRoaXMtPnQpLCAmcHV0YmFja2ZuLCAmcmV0LCAxLCBhcmdzKTsKKworICAgICAgenZhbF9kdG9yKCZwdXRiYWNrZm4pOwogICAgICAgenZhbF9kdG9yKCZyZXQpOworICAgICAgenZhbF9kdG9yKCZhcmdzWzBdKTsKKyAgICAgIGlmIChFRyhleGNlcHRpb24pKSB7CisgICAgICAgIHplbmRfb2JqZWN0ICpleCA9IEVHKGV4Y2VwdGlvbik7CisgICAgICAgIEVHKGV4Y2VwdGlvbikgPSBudWxscHRyOworICAgICAgICB0aHJvdyBQSFBFeGNlcHRpb25XcmFwcGVyKGV4KTsKKyAgICAgIH0KICAgICB9CiAgICAgYnVmZmVyX3VzZWQgPSAwOwogICAgIGJ1ZmZlcl9wdHIgPSBidWZmZXI7CkBAIC0yOTksNyArMzA1LDcgQEAKIAogICB2b2lkIHNraXAoc2l6ZV90IGxlbikgewogICAgIHdoaWxlIChsZW4pIHsKLSAgICAgIHNpemVfdCBjaHVua19zaXplID0gTUlOKGxlbiwgYnVmZmVyX3VzZWQpOworICAgICAgc2l6ZV90IGNodW5rX3NpemUgPSAoc3RkOjptaW4pKGxlbiwgYnVmZmVyX3VzZWQpOwogICAgICAgaWYgKGNodW5rX3NpemUpIHsKICAgICAgICAgYnVmZmVyX3B0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGJ1ZmZlcl9wdHIpICsgY2h1bmtfc2l6ZTsKICAgICAgICAgYnVmZmVyX3VzZWQgLT0gY2h1bmtfc2l6ZTsKQEAgLTMxMiw3ICszMTgsNyBAQAogCiAgIHZvaWQgcmVhZEJ5dGVzKHZvaWQqIGJ1Ziwgc2l6ZV90IGxlbikgewogICAgIHdoaWxlIChsZW4pIHsKLSAgICAgIHNpemVfdCBjaHVua19zaXplID0gTUlOKGxlbiwgYnVmZmVyX3VzZWQpOworICAgICAgc2l6ZV90IGNodW5rX3NpemUgPSAoc3RkOjptaW4pKGxlbiwgYnVmZmVyX3VzZWQpOwogICAgICAgaWYgKGNodW5rX3NpemUpIHsKICAgICAgICAgbWVtY3B5KGJ1ZiwgYnVmZmVyX3B0ciwgY2h1bmtfc2l6ZSk7CiAgICAgICAgIGJ1ZmZlcl9wdHIgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihidWZmZXJfcHRyKSArIGNodW5rX3NpemU7CkBAIC0zNTMsMjkgKzM1OSwyOSBAQAogICB2b2lkIHJlZmlsbCgpIHsKICAgICBhc3NlcnQoYnVmZmVyX3VzZWQgPT0gMCk7CiAgICAgenZhbCByZXR2YWw7Ci0gICAgWlZBTF9OVUxMKCZyZXR2YWwpOwotCi0gICAgenZhbCAqYXJnc1sxXTsKLSAgICBNQUtFX1NURF9aVkFMKGFyZ3NbMF0pOwotICAgIFpWQUxfTE9ORyhhcmdzWzBdLCBidWZmZXJfc2l6ZSk7Ci0KLSAgICBUU1JNTFNfRkVUQ0goKTsKLQorICAgIHp2YWwgYXJnc1sxXTsKICAgICB6dmFsIGZ1bmNuYW1lOwotICAgIFpWQUxfU1RSSU5HKCZmdW5jbmFtZSwgInJlYWQiLCAwKTsKIAotICAgIGNhbGxfdXNlcl9mdW5jdGlvbihFRyhmdW5jdGlvbl90YWJsZSksICZ0LCAmZnVuY25hbWUsICZyZXR2YWwsIDEsIGFyZ3MgVFNSTUxTX0NDKTsKLSAgICB6dmFsX3B0cl9kdG9yKGFyZ3MpOworICAgIFpWQUxfTlVMTCgmcmV0dmFsKTsKKyAgICBaVkFMX0xPTkcoJmFyZ3NbMF0sIGJ1ZmZlcl9zaXplKTsKKworICAgIFpWQUxfU1RSSU5HKCZmdW5jbmFtZSwgInJlYWQiKTsKKworICAgIGNhbGxfdXNlcl9mdW5jdGlvbihFRyhmdW5jdGlvbl90YWJsZSksICYodGhpcy0+dCksICZmdW5jbmFtZSwgJnJldHZhbCwgMSwgYXJncyk7CisgICAgenZhbF9kdG9yKCZhcmdzWzBdKTsKKyAgICB6dmFsX2R0b3IoJmZ1bmNuYW1lKTsKIAogICAgIGlmIChFRyhleGNlcHRpb24pKSB7CiAgICAgICB6dmFsX2R0b3IoJnJldHZhbCk7Ci0gICAgICB6dmFsKiBleCA9IEVHKGV4Y2VwdGlvbik7Ci0gICAgICBFRyhleGNlcHRpb24pID0gTlVMTDsKKworICAgICAgemVuZF9vYmplY3QgKmV4ID0gRUcoZXhjZXB0aW9uKTsKKyAgICAgIEVHKGV4Y2VwdGlvbikgPSBudWxscHRyOwogICAgICAgdGhyb3cgUEhQRXhjZXB0aW9uV3JhcHBlcihleCk7CiAgICAgfQogCiAgICAgYnVmZmVyX3VzZWQgPSBaX1NUUkxFTihyZXR2YWwpOwogICAgIG1lbWNweShidWZmZXIsIFpfU1RSVkFMKHJldHZhbCksIGJ1ZmZlcl91c2VkKTsKKwogICAgIHp2YWxfZHRvcigmcmV0dmFsKTsKIAogICAgIGJ1ZmZlcl9wdHIgPSBidWZmZXI7CkBAIC0zODMsMjIyICszODksNjMgQEAKIAogfTsKIAorc3RhdGljCiB2b2lkIGJpbmFyeV9kZXNlcmlhbGl6ZV9zcGVjKHp2YWwqIHp0aGlzLCBQSFBJbnB1dFRyYW5zcG9ydCYgdHJhbnNwb3J0LCBIYXNoVGFibGUqIHNwZWMpOworc3RhdGljCiB2b2lkIGJpbmFyeV9zZXJpYWxpemVfc3BlYyh6dmFsKiB6dGhpcywgUEhQT3V0cHV0VHJhbnNwb3J0JiB0cmFuc3BvcnQsIEhhc2hUYWJsZSogc3BlYyk7Ci12b2lkIGJpbmFyeV9zZXJpYWxpemUoaW50OF90IHRocmlmdF90eXBlSUQsIFBIUE91dHB1dFRyYW5zcG9ydCYgdHJhbnNwb3J0LCB6dmFsKiogdmFsdWUsIEhhc2hUYWJsZSogZmllbGRzcGVjKTsKLXZvaWQgc2tpcF9lbGVtZW50KGxvbmcgdGhyaWZ0X3R5cGVJRCwgUEhQSW5wdXRUcmFuc3BvcnQmIHRyYW5zcG9ydCk7Ci12b2lkIHByb3RvY29sX3dyaXRlTWVzc2FnZUJlZ2luKHp2YWwgKnRyYW5zcG9ydCwgY29uc3QgY2hhciogbWV0aG9kX25hbWUsIGludDMyX3QgbXNndHlwZSwgaW50MzJfdCBzZXFJRCk7Ci0KK3N0YXRpYwordm9pZCBiaW5hcnlfc2VyaWFsaXplKGludDhfdCB0aHJpZnRfdHlwZUlELCBQSFBPdXRwdXRUcmFuc3BvcnQmIHRyYW5zcG9ydCwgenZhbCogdmFsdWUsIEhhc2hUYWJsZSogZmllbGRzcGVjKTsKK3N0YXRpYyBpbmxpbmUKK2Jvb2wgdHR5cGVfaXNfc2NhbGFyKGludDhfdCB0KTsKIAogLy8gQ3JlYXRlIGEgUEhQIG9iamVjdCBnaXZlbiBhIHR5cGVuYW1lIGFuZCBjYWxsIHRoZSBjdG9yLCBvcHRpb25hbGx5IHBhc3NpbmcgdXAgdG8gMiBhcmd1bWVudHMKLXZvaWQgY3JlYXRlT2JqZWN0KGNoYXIqIG9ial90eXBlbmFtZSwgenZhbCogcmV0dXJuX3ZhbHVlLCBpbnQgbmFyZ3MgPSAwLCB6dmFsKiBhcmcxID0gTlVMTCwgenZhbCogYXJnMiA9IE5VTEwpIHsKLSAgVFNSTUxTX0ZFVENIKCk7Ci0gIHNpemVfdCBvYmpfdHlwZW5hbWVfbGVuID0gc3RybGVuKG9ial90eXBlbmFtZSk7Ci0gIHplbmRfY2xhc3NfZW50cnkqIGNlID0gemVuZF9mZXRjaF9jbGFzcyhvYmpfdHlwZW5hbWUsIG9ial90eXBlbmFtZV9sZW4sIFpFTkRfRkVUQ0hfQ0xBU1NfREVGQVVMVCBUU1JNTFNfQ0MpOworc3RhdGljCit2b2lkIGNyZWF0ZU9iamVjdChjb25zdCBjaGFyKiBvYmpfdHlwZW5hbWUsIHp2YWwqIHJldHVybl92YWx1ZSwgaW50IG5hcmdzID0gMCwgenZhbCogYXJnMSA9IG51bGxwdHIsIHp2YWwqIGFyZzIgPSBudWxscHRyKSB7CisgIC8qIGlzIHRoZXJlIGEgYmV0dGVyIHdheSB0byBkbyB0aGF0IG9uIHRoZSBzdGFjayA/ICovCisgIHplbmRfc3RyaW5nICpvYmpfbmFtZSA9IHplbmRfc3RyaW5nX2luaXQob2JqX3R5cGVuYW1lLCBzdHJsZW4ob2JqX3R5cGVuYW1lKSwgMCk7CisgIHplbmRfY2xhc3NfZW50cnkqIGNlID0gemVuZF9mZXRjaF9jbGFzcyhvYmpfbmFtZSwgWkVORF9GRVRDSF9DTEFTU19ERUZBVUxUKTsKKyAgemVuZF9zdHJpbmdfcmVsZWFzZShvYmpfbmFtZSk7CisKICAgaWYgKCEgY2UpIHsKLSAgICBwaHBfZXJyb3JfZG9jcmVmKE5VTEwgVFNSTUxTX0NDLCBFX0VSUk9SLCAiQ2xhc3MgJXMgZG9lcyBub3QgZXhpc3QiLCBvYmpfdHlwZW5hbWUpOworICAgIHBocF9lcnJvcl9kb2NyZWYobnVsbHB0ciwgRV9FUlJPUiwgIkNsYXNzICVzIGRvZXMgbm90IGV4aXN0Iiwgb2JqX3R5cGVuYW1lKTsKICAgICBSRVRVUk5fTlVMTCgpOwogICB9CiAKLSAgb2JqZWN0X2FuZF9wcm9wZXJ0aWVzX2luaXQocmV0dXJuX3ZhbHVlLCBjZSwgTlVMTCk7Ci0gIHplbmRfZnVuY3Rpb24qIGNvbnN0cnVjdG9yID0gemVuZF9zdGRfZ2V0X2NvbnN0cnVjdG9yKHJldHVybl92YWx1ZSBUU1JNTFNfQ0MpOwotICB6dmFsKiBjdG9yX3J2ID0gTlVMTDsKLSAgemVuZF9jYWxsX21ldGhvZCgmcmV0dXJuX3ZhbHVlLCBjZSwgJmNvbnN0cnVjdG9yLCBOVUxMLCAwLCAmY3Rvcl9ydiwgbmFyZ3MsIGFyZzEsIGFyZzIgVFNSTUxTX0NDKTsKLSAgenZhbF9wdHJfZHRvcigmY3Rvcl9ydik7CisgIG9iamVjdF9hbmRfcHJvcGVydGllc19pbml0KHJldHVybl92YWx1ZSwgY2UsIG51bGxwdHIpOworICB6ZW5kX2Z1bmN0aW9uKiBjb25zdHJ1Y3RvciA9IHplbmRfc3RkX2dldF9jb25zdHJ1Y3RvcihaX09CSl9QKHJldHVybl92YWx1ZSkpOworICB6dmFsIGN0b3JfcnY7CisgIHplbmRfY2FsbF9tZXRob2QocmV0dXJuX3ZhbHVlLCBjZSwgJmNvbnN0cnVjdG9yLCBOVUxMLCAwLCAmY3Rvcl9ydiwgbmFyZ3MsIGFyZzEsIGFyZzIpOworICB6dmFsX2R0b3IoJmN0b3JfcnYpOworICBpZiAoRUcoZXhjZXB0aW9uKSkgeworICAgIHplbmRfb2JqZWN0ICpleCA9IEVHKGV4Y2VwdGlvbik7CisgICAgRUcoZXhjZXB0aW9uKSA9IG51bGxwdHI7CisgICAgdGhyb3cgUEhQRXhjZXB0aW9uV3JhcHBlcihleCk7CisgIH0KIH0KIAotdm9pZCB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oY2hhciogd2hhdCwgbG9uZyBlcnJvcmNvZGUpIHsKLSAgVFNSTUxTX0ZFVENIKCk7CitzdGF0aWMKK3ZvaWQgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKGNvbnN0IGNoYXIqIHdoYXQsIGxvbmcgZXJyb3Jjb2RlKSB7CisgIHp2YWwgendoYXQsIHplcnJvcmNvZGU7CiAKLSAgenZhbCAqendoYXQsICp6ZXJyb3Jjb2RlOwotICBNQUtFX1NURF9aVkFMKHp3aGF0KTsKLSAgTUFLRV9TVERfWlZBTCh6ZXJyb3Jjb2RlKTsKKyAgWlZBTF9TVFJJTkcoJnp3aGF0LCB3aGF0KTsKKyAgWlZBTF9MT05HKCZ6ZXJyb3Jjb2RlLCBlcnJvcmNvZGUpOwogCi0gIFpWQUxfU1RSSU5HKHp3aGF0LCB3aGF0LCAxKTsKLSAgWlZBTF9MT05HKHplcnJvcmNvZGUsIGVycm9yY29kZSk7CisgIHp2YWwgZXg7CisgIGNyZWF0ZU9iamVjdCgiXFxUaHJpZnRcXEV4Y2VwdGlvblxcVFByb3RvY29sRXhjZXB0aW9uIiwgJmV4LCAyLCAmendoYXQsICZ6ZXJyb3Jjb2RlKTsKIAotICB6dmFsKiBleDsKLSAgTUFLRV9TVERfWlZBTChleCk7Ci0gIGNyZWF0ZU9iamVjdCgiXFxUaHJpZnRcXEV4Y2VwdGlvblxcVFByb3RvY29sRXhjZXB0aW9uIiwgZXgsIDIsIHp3aGF0LCB6ZXJyb3Jjb2RlKTsKLSAgenZhbF9wdHJfZHRvcigmendoYXQpOwotICB6dmFsX3B0cl9kdG9yKCZ6ZXJyb3Jjb2RlKTsKLSAgdGhyb3cgUEhQRXhjZXB0aW9uV3JhcHBlcihleCk7CisgIHp2YWxfZHRvcigmendoYXQpOworICB6dmFsX2R0b3IoJnplcnJvcmNvZGUpOworCisgIHRocm93IFBIUEV4Y2VwdGlvbldyYXBwZXIoJmV4KTsKIH0KIAogLy8gU2V0cyBFRyhleGNlcHRpb24pLCBjYWxsIHRoaXMgYW5kIHRoZW4gUkVUVVJOX05VTEwoKTsKLXZvaWQgdGhyb3dfemVuZF9leGNlcHRpb25fZnJvbV9zdGRfZXhjZXB0aW9uKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uJiBleCBUU1JNTFNfREMpIHsKLSAgemVuZF90aHJvd19leGNlcHRpb24oemVuZF9leGNlcHRpb25fZ2V0X2RlZmF1bHQoVFNSTUxTX0MpLCBjb25zdF9jYXN0PGNoYXIqPihleC53aGF0KCkpLCAwIFRTUk1MU19DQyk7CitzdGF0aWMKK3ZvaWQgdGhyb3dfemVuZF9leGNlcHRpb25fZnJvbV9zdGRfZXhjZXB0aW9uKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uJiBleCkgeworICB6ZW5kX3Rocm93X2V4Y2VwdGlvbih6ZW5kX2V4Y2VwdGlvbl9nZXRfZGVmYXVsdCgpLCBjb25zdF9jYXN0PGNoYXIqPihleC53aGF0KCkpLCAwKTsKIH0KIAotCi12b2lkIGJpbmFyeV9kZXNlcmlhbGl6ZShpbnQ4X3QgdGhyaWZ0X3R5cGVJRCwgUEhQSW5wdXRUcmFuc3BvcnQmIHRyYW5zcG9ydCwgenZhbCogcmV0dXJuX3ZhbHVlLCBIYXNoVGFibGUqIGZpZWxkc3BlYykgewotICB6dmFsKiogdmFsX3B0cjsKLSAgWl9UWVBFX1AocmV0dXJuX3ZhbHVlKSA9IElTX05VTEw7IC8vIGp1c3QgaW4gY2FzZQotCi0gIHN3aXRjaCAodGhyaWZ0X3R5cGVJRCkgewotICAgIGNhc2UgVF9TVE9QOgotICAgIGNhc2UgVF9WT0lEOgotICAgICAgUkVUVVJOX05VTEwoKTsKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIFRfU1RSVUNUOiB7Ci0gICAgICBpZiAoemVuZF9oYXNoX2ZpbmQoZmllbGRzcGVjLCAiY2xhc3MiLCA2LCAodm9pZCoqKSZ2YWxfcHRyKSAhPSBTVUNDRVNTKSB7Ci0gICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbigibm8gY2xhc3MgdHlwZSBpbiBzcGVjIiwgSU5WQUxJRF9EQVRBKTsKLSAgICAgICAgc2tpcF9lbGVtZW50KFRfU1RSVUNULCB0cmFuc3BvcnQpOwotICAgICAgICBSRVRVUk5fTlVMTCgpOwotICAgICAgfQotICAgICAgY2hhciogc3RydWN0VHlwZSA9IFpfU1RSVkFMX1BQKHZhbF9wdHIpOwotICAgICAgY3JlYXRlT2JqZWN0KHN0cnVjdFR5cGUsIHJldHVybl92YWx1ZSk7Ci0gICAgICBpZiAoWl9UWVBFX1AocmV0dXJuX3ZhbHVlKSA9PSBJU19OVUxMKSB7Ci0gICAgICAgIC8vIHVuYWJsZSB0byBjcmVhdGUgY2xhc3MgZW50cnkKLSAgICAgICAgc2tpcF9lbGVtZW50KFRfU1RSVUNULCB0cmFuc3BvcnQpOwotICAgICAgICBSRVRVUk5fTlVMTCgpOwotICAgICAgfQotICAgICAgVFNSTUxTX0ZFVENIKCk7Ci0gICAgICB6dmFsKiBzcGVjID0gemVuZF9yZWFkX3N0YXRpY19wcm9wZXJ0eSh6ZW5kX2dldF9jbGFzc19lbnRyeShyZXR1cm5fdmFsdWUgVFNSTUxTX0NDKSwgIl9UU1BFQyIsIDYsIGZhbHNlIFRTUk1MU19DQyk7Ci0gICAgICBpZiAoWl9UWVBFX1Aoc3BlYykgIT0gSVNfQVJSQVkpIHsKLSAgICAgICAgY2hhciBlcnJidWZbMTI4XTsKLSAgICAgICAgc25wcmludGYoZXJyYnVmLCAxMjgsICJzcGVjIGZvciAlcyBpcyB3cm9uZyB0eXBlOiAlZFxuIiwgc3RydWN0VHlwZSwgWl9UWVBFX1Aoc3BlYykpOwotICAgICAgICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oZXJyYnVmLCBJTlZBTElEX0RBVEEpOwotICAgICAgICBSRVRVUk5fTlVMTCgpOwotICAgICAgfQotICAgICAgYmluYXJ5X2Rlc2VyaWFsaXplX3NwZWMocmV0dXJuX3ZhbHVlLCB0cmFuc3BvcnQsIFpfQVJSVkFMX1Aoc3BlYykpOwotICAgICAgcmV0dXJuOwotICAgIH0gYnJlYWs7Ci0gICAgY2FzZSBUX0JPT0w6IHsKLSAgICAgIHVpbnQ4X3QgYzsKLSAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXMoJmMsIDEpOwotICAgICAgUkVUVVJOX0JPT0woYyAhPSAwKTsKLSAgICB9Ci0gIC8vY2FzZSBUX0kwODogLy8gc2FtZSBudW1lcmljIHZhbHVlIGFzIFRfQllURQotICAgIGNhc2UgVF9CWVRFOiB7Ci0gICAgICB1aW50OF90IGM7Ci0gICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCZjLCAxKTsKLSAgICAgIFJFVFVSTl9MT05HKChpbnQ4X3QpYyk7Ci0gICAgfQotICAgIGNhc2UgVF9JMTY6IHsKLSAgICAgIHVpbnQxNl90IGM7Ci0gICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCZjLCAyKTsKLSAgICAgIFJFVFVSTl9MT05HKChpbnQxNl90KW50b2hzKGMpKTsKLSAgICB9Ci0gICAgY2FzZSBUX0kzMjogewotICAgICAgdWludDMyX3QgYzsKLSAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXMoJmMsIDQpOwotICAgICAgUkVUVVJOX0xPTkcoKGludDMyX3QpbnRvaGwoYykpOwotICAgIH0KLSAgICBjYXNlIFRfVTY0OgotICAgIGNhc2UgVF9JNjQ6IHsKLSAgICAgIHVpbnQ2NF90IGM7Ci0gICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCZjLCA4KTsKLSAgICAgIFJFVFVSTl9MT05HKChpbnQ2NF90KW50b2hsbChjKSk7Ci0gICAgfQotICAgIGNhc2UgVF9ET1VCTEU6IHsKLSAgICAgIHVuaW9uIHsKLSAgICAgICAgdWludDY0X3QgYzsKLSAgICAgICAgZG91YmxlIGQ7Ci0gICAgICB9IGE7Ci0gICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCYoYS5jKSwgOCk7Ci0gICAgICBhLmMgPSBudG9obGwoYS5jKTsKLSAgICAgIFJFVFVSTl9ET1VCTEUoYS5kKTsKLSAgICB9Ci0gICAgLy9jYXNlIFRfVVRGNzogLy8gYWxpYXNlcyBUX1NUUklORwotICAgIGNhc2UgVF9VVEY4OgotICAgIGNhc2UgVF9VVEYxNjoKLSAgICBjYXNlIFRfU1RSSU5HOiB7Ci0gICAgICB1aW50MzJfdCBzaXplID0gdHJhbnNwb3J0LnJlYWRVMzIoKTsKLSAgICAgIGlmIChzaXplKSB7Ci0gICAgICAgIGNoYXIqIHN0cmJ1ZiA9IChjaGFyKikgZW1hbGxvYyhzaXplICsgMSk7Ci0gICAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXMoc3RyYnVmLCBzaXplKTsKLSAgICAgICAgc3RyYnVmW3NpemVdID0gJ1wwJzsKLSAgICAgICAgWlZBTF9TVFJJTkdMKHJldHVybl92YWx1ZSwgc3RyYnVmLCBzaXplLCAwKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIFpWQUxfRU1QVFlfU1RSSU5HKHJldHVybl92YWx1ZSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGNhc2UgVF9NQVA6IHsgLy8gYXJyYXkgb2Yga2V5IC0+IHZhbHVlCi0gICAgICB1aW50OF90IHR5cGVzWzJdOwotICAgICAgdHJhbnNwb3J0LnJlYWRCeXRlcyh0eXBlcywgMik7Ci0gICAgICB1aW50MzJfdCBzaXplID0gdHJhbnNwb3J0LnJlYWRVMzIoKTsKLSAgICAgIGFycmF5X2luaXQocmV0dXJuX3ZhbHVlKTsKLQotICAgICAgemVuZF9oYXNoX2ZpbmQoZmllbGRzcGVjLCAia2V5IiwgNCwgKHZvaWQqKikmdmFsX3B0cik7Ci0gICAgICBIYXNoVGFibGUqIGtleXNwZWMgPSBaX0FSUlZBTF9QUCh2YWxfcHRyKTsKLSAgICAgIHplbmRfaGFzaF9maW5kKGZpZWxkc3BlYywgInZhbCIsIDQsICh2b2lkKiopJnZhbF9wdHIpOwotICAgICAgSGFzaFRhYmxlKiB2YWxzcGVjID0gWl9BUlJWQUxfUFAodmFsX3B0cik7Ci0KLSAgICAgIGZvciAodWludDMyX3QgcyA9IDA7IHMgPCBzaXplOyArK3MpIHsKLSAgICAgICAgenZhbCAqdmFsdWU7Ci0gICAgICAgIE1BS0VfU1REX1pWQUwodmFsdWUpOwotCi0gICAgICAgIHp2YWwqIGtleTsKLSAgICAgICAgTUFLRV9TVERfWlZBTChrZXkpOwotCi0gICAgICAgIGJpbmFyeV9kZXNlcmlhbGl6ZSh0eXBlc1swXSwgdHJhbnNwb3J0LCBrZXksIGtleXNwZWMpOwotICAgICAgICBiaW5hcnlfZGVzZXJpYWxpemUodHlwZXNbMV0sIHRyYW5zcG9ydCwgdmFsdWUsIHZhbHNwZWMpOwotICAgICAgICBpZiAoWl9UWVBFX1Aoa2V5KSA9PSBJU19MT05HKSB7Ci0gICAgICAgICAgemVuZF9oYXNoX2luZGV4X3VwZGF0ZShyZXR1cm5fdmFsdWUtPnZhbHVlLmh0LCBaX0xWQUxfUChrZXkpLCAmdmFsdWUsIHNpemVvZih6dmFsICopLCBOVUxMKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICBpZiAoWl9UWVBFX1Aoa2V5KSAhPSBJU19TVFJJTkcpIGNvbnZlcnRfdG9fc3RyaW5nKGtleSk7Ci0gICAgICAgICAgemVuZF9oYXNoX3VwZGF0ZShyZXR1cm5fdmFsdWUtPnZhbHVlLmh0LCBaX1NUUlZBTF9QKGtleSksIFpfU1RSTEVOX1Aoa2V5KSArIDEsICZ2YWx1ZSwgc2l6ZW9mKHp2YWwgKiksIE5VTEwpOwotICAgICAgICB9Ci0gICAgICAgIHp2YWxfcHRyX2R0b3IoJmtleSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm47IC8vIHJldHVybl92YWx1ZSBhbHJlYWR5IHBvcHVsYXRlZAotICAgIH0KLSAgICBjYXNlIFRfTElTVDogeyAvLyBhcnJheSB3aXRoIGF1dG9nZW5lcmF0ZWQgbnVtZXJpYyBrZXlzCi0gICAgICBpbnQ4X3QgdHlwZSA9IHRyYW5zcG9ydC5yZWFkSTgoKTsKLSAgICAgIHVpbnQzMl90IHNpemUgPSB0cmFuc3BvcnQucmVhZFUzMigpOwotICAgICAgemVuZF9oYXNoX2ZpbmQoZmllbGRzcGVjLCAiZWxlbSIsIDUsICh2b2lkKiopJnZhbF9wdHIpOwotICAgICAgSGFzaFRhYmxlKiBlbGVtc3BlYyA9IFpfQVJSVkFMX1BQKHZhbF9wdHIpOwotCi0gICAgICBhcnJheV9pbml0KHJldHVybl92YWx1ZSk7Ci0gICAgICBmb3IgKHVpbnQzMl90IHMgPSAwOyBzIDwgc2l6ZTsgKytzKSB7Ci0gICAgICAgIHp2YWwgKnZhbHVlOwotICAgICAgICBNQUtFX1NURF9aVkFMKHZhbHVlKTsKLSAgICAgICAgYmluYXJ5X2Rlc2VyaWFsaXplKHR5cGUsIHRyYW5zcG9ydCwgdmFsdWUsIGVsZW1zcGVjKTsKLSAgICAgICAgemVuZF9oYXNoX25leHRfaW5kZXhfaW5zZXJ0KHJldHVybl92YWx1ZS0+dmFsdWUuaHQsICZ2YWx1ZSwgc2l6ZW9mKHp2YWwgKiksIE5VTEwpOwotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjYXNlIFRfU0VUOiB7IC8vIGFycmF5IG9mIGtleSAtPiBUUlVFCi0gICAgICB1aW50OF90IHR5cGU7Ci0gICAgICB1aW50MzJfdCBzaXplOwotICAgICAgdHJhbnNwb3J0LnJlYWRCeXRlcygmdHlwZSwgMSk7Ci0gICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCZzaXplLCA0KTsKLSAgICAgIHNpemUgPSBudG9obChzaXplKTsKLSAgICAgIHplbmRfaGFzaF9maW5kKGZpZWxkc3BlYywgImVsZW0iLCA1LCAodm9pZCoqKSZ2YWxfcHRyKTsKLSAgICAgIEhhc2hUYWJsZSogZWxlbXNwZWMgPSBaX0FSUlZBTF9QUCh2YWxfcHRyKTsKLQotICAgICAgYXJyYXlfaW5pdChyZXR1cm5fdmFsdWUpOwotCi0gICAgICBmb3IgKHVpbnQzMl90IHMgPSAwOyBzIDwgc2l6ZTsgKytzKSB7Ci0gICAgICAgIHp2YWwqIGtleTsKLSAgICAgICAgenZhbCogdmFsdWU7Ci0gICAgICAgIE1BS0VfU1REX1pWQUwoa2V5KTsKLSAgICAgICAgTUFLRV9TVERfWlZBTCh2YWx1ZSk7Ci0gICAgICAgIFpWQUxfVFJVRSh2YWx1ZSk7Ci0KLSAgICAgICAgYmluYXJ5X2Rlc2VyaWFsaXplKHR5cGUsIHRyYW5zcG9ydCwga2V5LCBlbGVtc3BlYyk7Ci0KLSAgICAgICAgaWYgKFpfVFlQRV9QKGtleSkgPT0gSVNfTE9ORykgewotICAgICAgICAgIHplbmRfaGFzaF9pbmRleF91cGRhdGUocmV0dXJuX3ZhbHVlLT52YWx1ZS5odCwgWl9MVkFMX1Aoa2V5KSwgJnZhbHVlLCBzaXplb2YoenZhbCAqKSwgTlVMTCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgaWYgKFpfVFlQRV9QKGtleSkgIT0gSVNfU1RSSU5HKSBjb252ZXJ0X3RvX3N0cmluZyhrZXkpOwotICAgICAgICAgIHplbmRfaGFzaF91cGRhdGUocmV0dXJuX3ZhbHVlLT52YWx1ZS5odCwgWl9TVFJWQUxfUChrZXkpLCBaX1NUUkxFTl9QKGtleSkgKyAxLCAmdmFsdWUsIHNpemVvZih6dmFsICopLCBOVUxMKTsKLSAgICAgICAgfQotICAgICAgICB6dmFsX3B0cl9kdG9yKCZrZXkpOwotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfTsKLQotICBjaGFyIGVycmJ1ZlsxMjhdOwotICBzcHJpbnRmKGVycmJ1ZiwgIlVua25vd24gdGhyaWZ0IHR5cGVJRCAlZCIsIHRocmlmdF90eXBlSUQpOwotICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oZXJyYnVmLCBJTlZBTElEX0RBVEEpOwotfQotCitzdGF0aWMKIHZvaWQgc2tpcF9lbGVtZW50KGxvbmcgdGhyaWZ0X3R5cGVJRCwgUEhQSW5wdXRUcmFuc3BvcnQmIHRyYW5zcG9ydCkgewogICBzd2l0Y2ggKHRocmlmdF90eXBlSUQpIHsKICAgICBjYXNlIFRfU1RPUDoKQEAgLTY1OCwxMDEgKzUwNSw0NzIgQEAKICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKGVycmJ1ZiwgSU5WQUxJRF9EQVRBKTsKIH0KIAotdm9pZCBwcm90b2NvbF93cml0ZU1lc3NhZ2VCZWdpbih6dmFsKiB0cmFuc3BvcnQsIGNvbnN0IGNoYXIqIG1ldGhvZF9uYW1lLCBpbnQzMl90IG1zZ3R5cGUsIGludDMyX3Qgc2VxSUQpIHsKLSAgVFNSTUxTX0ZFVENIKCk7Ci0gIHp2YWwgKmFyZ3NbM107Ci0KLSAgTUFLRV9TVERfWlZBTChhcmdzWzBdKTsKLSAgWlZBTF9TVFJJTkdMKGFyZ3NbMF0sIChjaGFyKiltZXRob2RfbmFtZSwgc3RybGVuKG1ldGhvZF9uYW1lKSwgMSk7Ci0KLSAgTUFLRV9TVERfWlZBTChhcmdzWzFdKTsKLSAgWlZBTF9MT05HKGFyZ3NbMV0sIG1zZ3R5cGUpOwotCi0gIE1BS0VfU1REX1pWQUwoYXJnc1syXSk7Ci0gIFpWQUxfTE9ORyhhcmdzWzJdLCBzZXFJRCk7Ci0KLSAgenZhbCByZXQ7Ci0gIFpWQUxfTlVMTCgmcmV0KTsKLQotICB6dmFsIHdyaXRlTWVzc2FnZWZuOwotICBaVkFMX1NUUklORygmd3JpdGVNZXNzYWdlZm4sICJ3cml0ZU1lc3NhZ2VCZWdpbiIsIDApOwotCi0gIGNhbGxfdXNlcl9mdW5jdGlvbihFRyhmdW5jdGlvbl90YWJsZSksICZ0cmFuc3BvcnQsICZ3cml0ZU1lc3NhZ2VmbiwgJnJldCwgMywgYXJncyBUU1JNTFNfQ0MpOwotCi0gIHp2YWxfcHRyX2R0b3IoJmFyZ3NbMF0pOwotICB6dmFsX3B0cl9kdG9yKCZhcmdzWzFdKTsKLSAgenZhbF9wdHJfZHRvcigmYXJnc1syXSk7Ci0gIHp2YWxfZHRvcigmcmV0KTsKK3N0YXRpYyBpbmxpbmUKK2Jvb2wgenZhbF9pc19ib29sKHp2YWwqIHYpIHsKKyAgcmV0dXJuIFpfVFlQRV9QKHYpID09IElTX1RSVUUgfHwgWl9UWVBFX1AodikgPT0gSVNfRkFMU0U7CiB9CiAKLXZvaWQgYmluYXJ5X3NlcmlhbGl6ZV9oYXNodGFibGVfa2V5KGludDhfdCBrZXl0eXBlLCBQSFBPdXRwdXRUcmFuc3BvcnQmIHRyYW5zcG9ydCwgSGFzaFRhYmxlKiBodCwgSGFzaFBvc2l0aW9uJiBodF9wb3MpIHsKK3N0YXRpYwordm9pZCBiaW5hcnlfZGVzZXJpYWxpemUoaW50OF90IHRocmlmdF90eXBlSUQsIFBIUElucHV0VHJhbnNwb3J0JiB0cmFuc3BvcnQsIHp2YWwqIHJldHVybl92YWx1ZSwgSGFzaFRhYmxlKiBmaWVsZHNwZWMpIHsKKyAgWlZBTF9OVUxMKHJldHVybl92YWx1ZSk7CisKKyAgc3dpdGNoICh0aHJpZnRfdHlwZUlEKSB7CisgICAgY2FzZSBUX1NUT1A6CisgICAgY2FzZSBUX1ZPSUQ6CisgICAgICBSRVRVUk5fTlVMTCgpOworICAgICAgcmV0dXJuOworICAgIGNhc2UgVF9TVFJVQ1Q6IHsKKyAgICAgIHp2YWwqIHZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAiY2xhc3MiLCBzaXplb2YoImNsYXNzIiktMSk7CisgICAgICBpZiAodmFsX3B0ciA9PSBudWxscHRyKSB7CisgICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbigibm8gY2xhc3MgdHlwZSBpbiBzcGVjIiwgSU5WQUxJRF9EQVRBKTsKKyAgICAgICAgc2tpcF9lbGVtZW50KFRfU1RSVUNULCB0cmFuc3BvcnQpOworICAgICAgICBSRVRVUk5fTlVMTCgpOworICAgICAgfQorCisgICAgICBjaGFyKiBzdHJ1Y3RUeXBlID0gWl9TVFJWQUxfUCh2YWxfcHRyKTsKKyAgICAgIC8vIENyZWF0ZSBhbiBvYmplY3QgaW4gUEhQIHVzZXJsYW5kIGJhc2VkIG9uIG91ciBzcGVjCisgICAgICBjcmVhdGVPYmplY3Qoc3RydWN0VHlwZSwgcmV0dXJuX3ZhbHVlKTsKKyAgICAgIGlmIChaX1RZUEVfUChyZXR1cm5fdmFsdWUpID09IElTX05VTEwpIHsKKyAgICAgICAgLy8gdW5hYmxlIHRvIGNyZWF0ZSBjbGFzcyBlbnRyeQorICAgICAgICBza2lwX2VsZW1lbnQoVF9TVFJVQ1QsIHRyYW5zcG9ydCk7CisgICAgICAgIFJFVFVSTl9OVUxMKCk7CisgICAgICB9CisKKyAgICAgIHp2YWwqIHNwZWMgPSB6ZW5kX3JlYWRfc3RhdGljX3Byb3BlcnR5KFpfT0JKQ0VfUChyZXR1cm5fdmFsdWUpLCAiX1RTUEVDIiwgc2l6ZW9mKCJfVFNQRUMiKS0xLCBmYWxzZSk7CisgICAgICBaVkFMX0RFUkVGKHNwZWMpOworICAgICAgaWYgKEVHKGV4Y2VwdGlvbikpIHsKKyAgICAgICAgemVuZF9vYmplY3QgKmV4ID0gRUcoZXhjZXB0aW9uKTsKKyAgICAgICAgRUcoZXhjZXB0aW9uKSA9IG51bGxwdHI7CisgICAgICAgIHRocm93IFBIUEV4Y2VwdGlvbldyYXBwZXIoZXgpOworICAgICAgfQorICAgICAgaWYgKFpfVFlQRV9QKHNwZWMpICE9IElTX0FSUkFZKSB7CisgICAgICAgIGNoYXIgZXJyYnVmWzEyOF07CisgICAgICAgIHNucHJpbnRmKGVycmJ1ZiwgMTI4LCAic3BlYyBmb3IgJXMgaXMgd3JvbmcgdHlwZTogJWRcbiIsIHN0cnVjdFR5cGUsIFpfVFlQRV9QKHNwZWMpKTsKKyAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKGVycmJ1ZiwgSU5WQUxJRF9EQVRBKTsKKyAgICAgICAgUkVUVVJOX05VTEwoKTsKKyAgICAgIH0KKyAgICAgIGJpbmFyeV9kZXNlcmlhbGl6ZV9zcGVjKHJldHVybl92YWx1ZSwgdHJhbnNwb3J0LCBaX0FSUlZBTF9QKHNwZWMpKTsKKyAgICAgIHJldHVybjsKKyAgICB9IGJyZWFrOworICAgIGNhc2UgVF9CT09MOiB7CisgICAgICB1aW50OF90IGM7CisgICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCZjLCAxKTsKKyAgICAgIFJFVFVSTl9CT09MKGMgIT0gMCk7CisgICAgfQorICAvL2Nhc2UgVF9JMDg6IC8vIHNhbWUgbnVtZXJpYyB2YWx1ZSBhcyBUX0JZVEUKKyAgICBjYXNlIFRfQllURTogeworICAgICAgdWludDhfdCBjOworICAgICAgdHJhbnNwb3J0LnJlYWRCeXRlcygmYywgMSk7CisgICAgICBSRVRVUk5fTE9ORygoaW50OF90KWMpOworICAgIH0KKyAgICBjYXNlIFRfSTE2OiB7CisgICAgICB1aW50MTZfdCBjOworICAgICAgdHJhbnNwb3J0LnJlYWRCeXRlcygmYywgMik7CisgICAgICBSRVRVUk5fTE9ORygoaW50MTZfdCludG9ocyhjKSk7CisgICAgfQorICAgIGNhc2UgVF9JMzI6IHsKKyAgICAgIHVpbnQzMl90IGM7CisgICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCZjLCA0KTsKKyAgICAgIFJFVFVSTl9MT05HKChpbnQzMl90KW50b2hsKGMpKTsKKyAgICB9CisgICAgY2FzZSBUX1U2NDoKKyAgICBjYXNlIFRfSTY0OiB7CisgICAgICB1aW50NjRfdCBjOworICAgICAgdHJhbnNwb3J0LnJlYWRCeXRlcygmYywgOCk7CisgICAgICBSRVRVUk5fTE9ORygoaW50NjRfdCludG9obGwoYykpOworICAgIH0KKyAgICBjYXNlIFRfRE9VQkxFOiB7CisgICAgICB1bmlvbiB7CisgICAgICAgIHVpbnQ2NF90IGM7CisgICAgICAgIGRvdWJsZSBkOworICAgICAgfSBhOworICAgICAgdHJhbnNwb3J0LnJlYWRCeXRlcygmKGEuYyksIDgpOworICAgICAgYS5jID0gbnRvaGxsKGEuYyk7CisgICAgICBSRVRVUk5fRE9VQkxFKGEuZCk7CisgICAgfQorICAgIC8vY2FzZSBUX1VURjc6IC8vIGFsaWFzZXMgVF9TVFJJTkcKKyAgICBjYXNlIFRfVVRGODoKKyAgICBjYXNlIFRfVVRGMTY6CisgICAgY2FzZSBUX1NUUklORzogeworICAgICAgdWludDMyX3Qgc2l6ZSA9IHRyYW5zcG9ydC5yZWFkVTMyKCk7CisgICAgICBpZiAoc2l6ZSkgeworICAgICAgICBjaGFyIHN0cmJ1ZltzaXplKzFdOworICAgICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKHN0cmJ1Ziwgc2l6ZSk7CisgICAgICAgIHN0cmJ1ZltzaXplXSA9ICdcMCc7CisgICAgICAgIFpWQUxfU1RSSU5HTChyZXR1cm5fdmFsdWUsIHN0cmJ1Ziwgc2l6ZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBaVkFMX0VNUFRZX1NUUklORyhyZXR1cm5fdmFsdWUpOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjYXNlIFRfTUFQOiB7IC8vIGFycmF5IG9mIGtleSAtPiB2YWx1ZQorICAgICAgdWludDhfdCB0eXBlc1syXTsKKyAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXModHlwZXMsIDIpOworICAgICAgdWludDMyX3Qgc2l6ZSA9IHRyYW5zcG9ydC5yZWFkVTMyKCk7CisgICAgICBhcnJheV9pbml0KHJldHVybl92YWx1ZSk7CisKKyAgICAgIHp2YWwgKnZhbF9wdHI7CisgICAgICB2YWxfcHRyID0gemVuZF9oYXNoX3N0cl9maW5kKGZpZWxkc3BlYywgImtleSIsIHNpemVvZigia2V5IiktMSk7CisgICAgICBIYXNoVGFibGUqIGtleXNwZWMgPSBaX0FSUlZBTF9QKHZhbF9wdHIpOworICAgICAgdmFsX3B0ciA9IHplbmRfaGFzaF9zdHJfZmluZChmaWVsZHNwZWMsICJ2YWwiLCBzaXplb2YoInZhbCIpLTEpOworICAgICAgSGFzaFRhYmxlKiB2YWxzcGVjID0gWl9BUlJWQUxfUCh2YWxfcHRyKTsKKworICAgICAgZm9yICh1aW50MzJfdCBzID0gMDsgcyA8IHNpemU7ICsrcykgeworICAgICAgICB6dmFsIGtleSwgdmFsdWU7CisKKyAgICAgICAgYmluYXJ5X2Rlc2VyaWFsaXplKHR5cGVzWzBdLCB0cmFuc3BvcnQsICZrZXksIGtleXNwZWMpOworICAgICAgICBiaW5hcnlfZGVzZXJpYWxpemUodHlwZXNbMV0sIHRyYW5zcG9ydCwgJnZhbHVlLCB2YWxzcGVjKTsKKyAgICAgICAgaWYgKFpfVFlQRShrZXkpID09IElTX0xPTkcpIHsKKyAgICAgICAgICB6ZW5kX2hhc2hfaW5kZXhfdXBkYXRlKFpfQVJSX1AocmV0dXJuX3ZhbHVlKSwgWl9MVkFMKGtleSksICZ2YWx1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKFpfVFlQRShrZXkpICE9IElTX1NUUklORykgY29udmVydF90b19zdHJpbmcoJmtleSk7CisgICAgICAgICAgemVuZF9zeW10YWJsZV91cGRhdGUoWl9BUlJfUChyZXR1cm5fdmFsdWUpLCBaX1NUUihrZXkpLCAmdmFsdWUpOworICAgICAgICB9CisgICAgICAgIHp2YWxfZHRvcigma2V5KTsKKyAgICAgIH0KKyAgICAgIHJldHVybjsgLy8gcmV0dXJuX3ZhbHVlIGFscmVhZHkgcG9wdWxhdGVkCisgICAgfQorICAgIGNhc2UgVF9MSVNUOiB7IC8vIGFycmF5IHdpdGggYXV0b2dlbmVyYXRlZCBudW1lcmljIGtleXMKKyAgICAgIGludDhfdCB0eXBlID0gdHJhbnNwb3J0LnJlYWRJOCgpOworICAgICAgdWludDMyX3Qgc2l6ZSA9IHRyYW5zcG9ydC5yZWFkVTMyKCk7CisgICAgICB6dmFsICp2YWxfcHRyID0gemVuZF9oYXNoX3N0cl9maW5kKGZpZWxkc3BlYywgImVsZW0iLCBzaXplb2YoImVsZW0iKS0xKTsKKyAgICAgIEhhc2hUYWJsZSogZWxlbXNwZWMgPSBaX0FSUlZBTF9QKHZhbF9wdHIpOworCisgICAgICBhcnJheV9pbml0KHJldHVybl92YWx1ZSk7CisgICAgICBmb3IgKHVpbnQzMl90IHMgPSAwOyBzIDwgc2l6ZTsgKytzKSB7CisgICAgICAgIHp2YWwgdmFsdWU7CisgICAgICAgIGJpbmFyeV9kZXNlcmlhbGl6ZSh0eXBlLCB0cmFuc3BvcnQsICZ2YWx1ZSwgZWxlbXNwZWMpOworICAgICAgICB6ZW5kX2hhc2hfbmV4dF9pbmRleF9pbnNlcnQoWl9BUlJfUChyZXR1cm5fdmFsdWUpLCAmdmFsdWUpOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjYXNlIFRfU0VUOiB7IC8vIGFycmF5IG9mIGtleSAtPiBUUlVFCisgICAgICB1aW50OF90IHR5cGU7CisgICAgICB1aW50MzJfdCBzaXplOworICAgICAgdHJhbnNwb3J0LnJlYWRCeXRlcygmdHlwZSwgMSk7CisgICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCZzaXplLCA0KTsKKyAgICAgIHNpemUgPSBudG9obChzaXplKTsKKyAgICAgIHp2YWwgKnZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAiZWxlbSIsIHNpemVvZigiZWxlbSIpLTEpOworICAgICAgSGFzaFRhYmxlKiBlbGVtc3BlYyA9IFpfQVJSVkFMX1AodmFsX3B0cik7CisKKyAgICAgIGFycmF5X2luaXQocmV0dXJuX3ZhbHVlKTsKKworICAgICAgZm9yICh1aW50MzJfdCBzID0gMDsgcyA8IHNpemU7ICsrcykgeworICAgICAgICB6dmFsIGtleSwgdmFsdWU7CisgICAgICAgIFpWQUxfVFJVRSgmdmFsdWUpOworCisgICAgICAgIGJpbmFyeV9kZXNlcmlhbGl6ZSh0eXBlLCB0cmFuc3BvcnQsICZrZXksIGVsZW1zcGVjKTsKKworICAgICAgICBpZiAoWl9UWVBFKGtleSkgPT0gSVNfTE9ORykgeworICAgICAgICAgIHplbmRfaGFzaF9pbmRleF91cGRhdGUoWl9BUlJfUChyZXR1cm5fdmFsdWUpLCBaX0xWQUwoa2V5KSwgJnZhbHVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoWl9UWVBFKGtleSkgIT0gSVNfU1RSSU5HKSBjb252ZXJ0X3RvX3N0cmluZygma2V5KTsKKyAgICAgICAgICB6ZW5kX3N5bXRhYmxlX3VwZGF0ZShaX0FSUl9QKHJldHVybl92YWx1ZSksIFpfU1RSKGtleSksICZ2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgenZhbF9kdG9yKCZrZXkpOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgfTsKKworICBjaGFyIGVycmJ1ZlsxMjhdOworICBzcHJpbnRmKGVycmJ1ZiwgIlVua25vd24gdGhyaWZ0IHR5cGVJRCAlZCIsIHRocmlmdF90eXBlSUQpOworICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oZXJyYnVmLCBJTlZBTElEX0RBVEEpOworfQorCitzdGF0aWMKK3ZvaWQgYmluYXJ5X3NlcmlhbGl6ZV9oYXNodGFibGVfa2V5KGludDhfdCBrZXl0eXBlLCBQSFBPdXRwdXRUcmFuc3BvcnQmIHRyYW5zcG9ydCwgSGFzaFRhYmxlKiBodCwgSGFzaFBvc2l0aW9uJiBodF9wb3MsIEhhc2hUYWJsZSogc3BlYykgewogICBib29sIGtleXR5cGVfaXNfbnVtZXJpYyA9ICghKChrZXl0eXBlID09IFRfU1RSSU5HKSB8fCAoa2V5dHlwZSA9PSBUX1VURjgpIHx8IChrZXl0eXBlID09IFRfVVRGMTYpKSk7CiAKLSAgY2hhcioga2V5OworICB6ZW5kX3N0cmluZyoga2V5OwogICB1aW50IGtleV9sZW47CiAgIGxvbmcgaW5kZXggPSAwOwogCi0gIHp2YWwqIHo7Ci0gIE1BS0VfU1REX1pWQUwoeik7CisgIHp2YWwgejsKIAotICBpbnQgcmVzID0gemVuZF9oYXNoX2dldF9jdXJyZW50X2tleV9leChodCwgJmtleSwgJmtleV9sZW4sICh1bG9uZyopJmluZGV4LCAwLCAmaHRfcG9zKTsKLSAgaWYgKGtleXR5cGVfaXNfbnVtZXJpYykgewotICAgIGlmIChyZXMgPT0gSEFTSF9LRVlfSVNfU1RSSU5HKSB7Ci0gICAgICBpbmRleCA9IHN0cnRvbChrZXksIE5VTEwsIDEwKTsKLSAgICB9Ci0gICAgWlZBTF9MT05HKHosIGluZGV4KTsKKyAgaW50IHJlcyA9IHplbmRfaGFzaF9nZXRfY3VycmVudF9rZXlfZXgoaHQsICZrZXksICh6ZW5kX3Vsb25nKikmaW5kZXgsICZodF9wb3MpOworICBpZiAocmVzID09IEhBU0hfS0VZX0lTX1NUUklORykgeworICAgIFpWQUxfU1RSX0NPUFkoJnosIGtleSk7CiAgIH0gZWxzZSB7Ci0gICAgY2hhciBidWZbNjRdOwotICAgIGlmIChyZXMgPT0gSEFTSF9LRVlfSVNfU1RSSU5HKSB7Ci0gICAgICBrZXlfbGVuIC09IDE7IC8vIHNraXAgdGhlIG51bGwgdGVybWluYXRvcgotICAgIH0gZWxzZSB7Ci0gICAgICBzcHJpbnRmKGJ1ZiwgIiVsZCIsIGluZGV4KTsKLSAgICAgIGtleSA9IGJ1Zjsga2V5X2xlbiA9IHN0cmxlbihidWYpOwotICAgIH0KLSAgICBaVkFMX1NUUklOR0woeiwga2V5LCBrZXlfbGVuLCAxKTsKKyAgICBaVkFMX0xPTkcoJnosIGluZGV4KTsKICAgfQotICBiaW5hcnlfc2VyaWFsaXplKGtleXR5cGUsIHRyYW5zcG9ydCwgJnosIE5VTEwpOwotICB6dmFsX3B0cl9kdG9yKCZ6KTsKKyAgYmluYXJ5X3NlcmlhbGl6ZShrZXl0eXBlLCB0cmFuc3BvcnQsICZ6LCBzcGVjKTsKKyAgenZhbF9kdG9yKCZ6KTsKIH0KIAotaW5saW5lIGJvb2wgdHR5cGVfaXNfaW50KGludDhfdCB0KSB7CitzdGF0aWMKK3ZvaWQgYmluYXJ5X3NlcmlhbGl6ZShpbnQ4X3QgdGhyaWZ0X3R5cGVJRCwgUEhQT3V0cHV0VHJhbnNwb3J0JiB0cmFuc3BvcnQsIHp2YWwqIHZhbHVlLCBIYXNoVGFibGUqIGZpZWxkc3BlYykgeworICBpZiAodmFsdWUpIHsKKyAgICBaVkFMX0RFUkVGKHZhbHVlKTsKKyAgfQorICAvLyBBdCB0aGlzIHBvaW50IHRoZSB0eXBlSUQgKGFuZCBmaWVsZCBudW0sIGlmIGFwcGxpY2FibGUpIHNob3VsZCd2ZSBhbHJlYWR5IGJlZW4gd3JpdHRlbiB0byB0aGUgb3V0cHV0IHNvIGFsbCB3ZSBuZWVkIHRvIGRvIGlzIHdyaXRlIHRoZSBwYXlsb2FkLgorICBzd2l0Y2ggKHRocmlmdF90eXBlSUQpIHsKKyAgICBjYXNlIFRfU1RPUDoKKyAgICBjYXNlIFRfVk9JRDoKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIFRfU1RSVUNUOiB7CisgICAgICBpZiAoWl9UWVBFX1AodmFsdWUpICE9IElTX09CSkVDVCkgeworICAgICAgICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oIkF0dGVtcHQgdG8gc2VuZCBub24tb2JqZWN0IHR5cGUgYXMgYSBUX1NUUlVDVCIsIElOVkFMSURfREFUQSk7CisgICAgICB9CisgICAgICB6dmFsKiBzcGVjID0gemVuZF9yZWFkX3N0YXRpY19wcm9wZXJ0eShaX09CSkNFX1AodmFsdWUpLCAiX1RTUEVDIiwgc2l6ZW9mKCJfVFNQRUMiKS0xLCB0cnVlKTsKKyAgICAgIGlmIChzcGVjICYmIFpfVFlQRV9QKHNwZWMpID09IElTX1JFRkVSRU5DRSkgeworICAgICAgICBaVkFMX0RFUkVGKHNwZWMpOworICAgICAgfQorICAgICAgaWYgKCFzcGVjIHx8IFpfVFlQRV9QKHNwZWMpICE9IElTX0FSUkFZKSB7CisgICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbigiQXR0ZW1wdCB0byBzZW5kIG5vbi1UaHJpZnQgb2JqZWN0IGFzIGEgVF9TVFJVQ1QiLCBJTlZBTElEX0RBVEEpOworICAgICAgfQorICAgICAgYmluYXJ5X3NlcmlhbGl6ZV9zcGVjKHZhbHVlLCB0cmFuc3BvcnQsIFpfQVJSVkFMX1Aoc3BlYykpOworICAgIH0gcmV0dXJuOworICAgIGNhc2UgVF9CT09MOgorICAgICAgaWYgKCF6dmFsX2lzX2Jvb2wodmFsdWUpKSBjb252ZXJ0X3RvX2Jvb2xlYW4odmFsdWUpOworICAgICAgdHJhbnNwb3J0LndyaXRlSTgoWl9UWVBFX0lORk9fUCh2YWx1ZSkgPT0gSVNfVFJVRSA/IDEgOiAwKTsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIFRfQllURToKKyAgICAgIGlmIChaX1RZUEVfUCh2YWx1ZSkgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKHZhbHVlKTsKKyAgICAgIHRyYW5zcG9ydC53cml0ZUk4KFpfTFZBTF9QKHZhbHVlKSk7CisgICAgICByZXR1cm47CisgICAgY2FzZSBUX0kxNjoKKyAgICAgIGlmIChaX1RZUEVfUCh2YWx1ZSkgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKHZhbHVlKTsKKyAgICAgIHRyYW5zcG9ydC53cml0ZUkxNihaX0xWQUxfUCh2YWx1ZSkpOworICAgICAgcmV0dXJuOworICAgIGNhc2UgVF9JMzI6CisgICAgICBpZiAoWl9UWVBFX1AodmFsdWUpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZyh2YWx1ZSk7CisgICAgICB0cmFuc3BvcnQud3JpdGVJMzIoWl9MVkFMX1AodmFsdWUpKTsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIFRfSTY0OgorICAgIGNhc2UgVF9VNjQ6IHsKKyAgICAgIGludDY0X3QgbF9kYXRhOworI2lmIGRlZmluZWQoX0xQNjQpIHx8IGRlZmluZWQoX1dJTjY0KQorICAgICAgaWYgKFpfVFlQRV9QKHZhbHVlKSAhPSBJU19MT05HKSBjb252ZXJ0X3RvX2xvbmcodmFsdWUpOworICAgICAgbF9kYXRhID0gWl9MVkFMX1AodmFsdWUpOworI2Vsc2UKKyAgICAgIGlmIChaX1RZUEVfUCh2YWx1ZSkgIT0gSVNfRE9VQkxFKSBjb252ZXJ0X3RvX2RvdWJsZSh2YWx1ZSk7CisgICAgICBsX2RhdGEgPSAoaW50NjRfdClaX0RWQUxfUCh2YWx1ZSk7CisjZW5kaWYKKyAgICAgIHRyYW5zcG9ydC53cml0ZUk2NChsX2RhdGEpOworICAgIH0gcmV0dXJuOworICAgIGNhc2UgVF9ET1VCTEU6IHsKKyAgICAgIHVuaW9uIHsKKyAgICAgICAgaW50NjRfdCBjOworICAgICAgICBkb3VibGUgZDsKKyAgICAgIH0gYTsKKyAgICAgIGlmIChaX1RZUEVfUCh2YWx1ZSkgIT0gSVNfRE9VQkxFKSBjb252ZXJ0X3RvX2RvdWJsZSh2YWx1ZSk7CisgICAgICBhLmQgPSBaX0RWQUxfUCh2YWx1ZSk7CisgICAgICB0cmFuc3BvcnQud3JpdGVJNjQoYS5jKTsKKyAgICB9IHJldHVybjsKKyAgICBjYXNlIFRfVVRGODoKKyAgICBjYXNlIFRfVVRGMTY6CisgICAgY2FzZSBUX1NUUklORzoKKyAgICAgIGlmIChaX1RZUEVfUCh2YWx1ZSkgIT0gSVNfU1RSSU5HKSBjb252ZXJ0X3RvX3N0cmluZyh2YWx1ZSk7CisgICAgICB0cmFuc3BvcnQud3JpdGVTdHJpbmcoWl9TVFJWQUxfUCh2YWx1ZSksIFpfU1RSTEVOX1AodmFsdWUpKTsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIFRfTUFQOiB7CisgICAgICBpZiAoWl9UWVBFX1AodmFsdWUpICE9IElTX0FSUkFZKSBjb252ZXJ0X3RvX2FycmF5KHZhbHVlKTsKKyAgICAgIGlmIChaX1RZUEVfUCh2YWx1ZSkgIT0gSVNfQVJSQVkpIHsKKyAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJBdHRlbXB0IHRvIHNlbmQgYW4gaW5jb21wYXRpYmxlIHR5cGUgYXMgYW4gYXJyYXkgKFRfTUFQKSIsIElOVkFMSURfREFUQSk7CisgICAgICB9CisgICAgICBIYXNoVGFibGUqIGh0ID0gWl9BUlJWQUxfUCh2YWx1ZSk7CisgICAgICB6dmFsKiB2YWxfcHRyOworCisgICAgICB2YWxfcHRyID0gemVuZF9oYXNoX3N0cl9maW5kKGZpZWxkc3BlYywgImt0eXBlIiwgc2l6ZW9mKCJrdHlwZSIpLTEpOworICAgICAgaWYgKFpfVFlQRV9QKHZhbF9wdHIpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZyh2YWxfcHRyKTsKKyAgICAgIHVpbnQ4X3Qga2V5dHlwZSA9IFpfTFZBTF9QKHZhbF9wdHIpOworICAgICAgdHJhbnNwb3J0LndyaXRlSTgoa2V5dHlwZSk7CisgICAgICB2YWxfcHRyID0gemVuZF9oYXNoX3N0cl9maW5kKGZpZWxkc3BlYywgInZ0eXBlIiwgc2l6ZW9mKCJ2dHlwZSIpLTEpOworICAgICAgaWYgKFpfVFlQRV9QKHZhbF9wdHIpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZyh2YWxfcHRyKTsKKyAgICAgIHVpbnQ4X3QgdmFsdHlwZSA9IFpfTFZBTF9QKHZhbF9wdHIpOworICAgICAgdHJhbnNwb3J0LndyaXRlSTgodmFsdHlwZSk7CisKKyAgICAgIHZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAidmFsIiwgc2l6ZW9mKCJ2YWwiKS0xKTsKKyAgICAgIEhhc2hUYWJsZSogdmFsc3BlYyA9IFpfQVJSVkFMX1AodmFsX3B0cik7CisgICAgICBIYXNoVGFibGUqIGtleXNwZWMgPSBaX0FSUlZBTF9QKHplbmRfaGFzaF9zdHJfZmluZChmaWVsZHNwZWMsICJrZXkiLCBzaXplb2YoImtleSIpLTEpKTsKKworICAgICAgdHJhbnNwb3J0LndyaXRlSTMyKHplbmRfaGFzaF9udW1fZWxlbWVudHMoaHQpKTsKKyAgICAgIEhhc2hQb3NpdGlvbiBrZXlfcHRyOworICAgICAgZm9yICh6ZW5kX2hhc2hfaW50ZXJuYWxfcG9pbnRlcl9yZXNldF9leChodCwgJmtleV9wdHIpOworICAgICAgICAgICAodmFsX3B0ciA9IHplbmRfaGFzaF9nZXRfY3VycmVudF9kYXRhX2V4KGh0LCAma2V5X3B0cikpICE9IG51bGxwdHI7CisgICAgICAgICAgIHplbmRfaGFzaF9tb3ZlX2ZvcndhcmRfZXgoaHQsICZrZXlfcHRyKSkgeworICAgICAgICBiaW5hcnlfc2VyaWFsaXplX2hhc2h0YWJsZV9rZXkoa2V5dHlwZSwgdHJhbnNwb3J0LCBodCwga2V5X3B0ciwga2V5c3BlYyk7CisgICAgICAgIGJpbmFyeV9zZXJpYWxpemUodmFsdHlwZSwgdHJhbnNwb3J0LCB2YWxfcHRyLCB2YWxzcGVjKTsKKyAgICAgIH0KKyAgICB9IHJldHVybjsKKyAgICBjYXNlIFRfTElTVDogeworICAgICAgaWYgKFpfVFlQRV9QKHZhbHVlKSAhPSBJU19BUlJBWSkgY29udmVydF90b19hcnJheSh2YWx1ZSk7CisgICAgICBpZiAoWl9UWVBFX1AodmFsdWUpICE9IElTX0FSUkFZKSB7CisgICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbigiQXR0ZW1wdCB0byBzZW5kIGFuIGluY29tcGF0aWJsZSB0eXBlIGFzIGFuIGFycmF5IChUX0xJU1QpIiwgSU5WQUxJRF9EQVRBKTsKKyAgICAgIH0KKyAgICAgIEhhc2hUYWJsZSogaHQgPSBaX0FSUlZBTF9QKHZhbHVlKTsKKyAgICAgIHp2YWwqIHZhbF9wdHI7CisKKyAgICAgIHZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAiZXR5cGUiLCBzaXplb2YoImV0eXBlIiktMSk7CisgICAgICBpZiAoWl9UWVBFX1AodmFsX3B0cikgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKHZhbF9wdHIpOworICAgICAgdWludDhfdCB2YWx0eXBlID0gWl9MVkFMX1AodmFsX3B0cik7CisgICAgICB0cmFuc3BvcnQud3JpdGVJOCh2YWx0eXBlKTsKKworICAgICAgdmFsX3B0ciA9IHplbmRfaGFzaF9zdHJfZmluZChmaWVsZHNwZWMsICJlbGVtIiwgc2l6ZW9mKCJlbGVtIiktMSk7CisgICAgICBIYXNoVGFibGUqIHZhbHNwZWMgPSBaX0FSUlZBTF9QKHZhbF9wdHIpOworCisgICAgICB0cmFuc3BvcnQud3JpdGVJMzIoemVuZF9oYXNoX251bV9lbGVtZW50cyhodCkpOworICAgICAgSGFzaFBvc2l0aW9uIGtleV9wdHI7CisgICAgICBmb3IgKHplbmRfaGFzaF9pbnRlcm5hbF9wb2ludGVyX3Jlc2V0X2V4KGh0LCAma2V5X3B0cik7CisgICAgICAgICAgICh2YWxfcHRyID0gemVuZF9oYXNoX2dldF9jdXJyZW50X2RhdGFfZXgoaHQsICZrZXlfcHRyKSkgIT0gbnVsbHB0cjsKKyAgICAgICAgICAgemVuZF9oYXNoX21vdmVfZm9yd2FyZF9leChodCwgJmtleV9wdHIpKSB7CisgICAgICAgIGJpbmFyeV9zZXJpYWxpemUodmFsdHlwZSwgdHJhbnNwb3J0LCB2YWxfcHRyLCB2YWxzcGVjKTsKKyAgICAgIH0KKyAgICB9IHJldHVybjsKKyAgICBjYXNlIFRfU0VUOiB7CisgICAgICBpZiAoWl9UWVBFX1AodmFsdWUpICE9IElTX0FSUkFZKSBjb252ZXJ0X3RvX2FycmF5KHZhbHVlKTsKKyAgICAgIGlmIChaX1RZUEVfUCh2YWx1ZSkgIT0gSVNfQVJSQVkpIHsKKyAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJBdHRlbXB0IHRvIHNlbmQgYW4gaW5jb21wYXRpYmxlIHR5cGUgYXMgYW4gYXJyYXkgKFRfU0VUKSIsIElOVkFMSURfREFUQSk7CisgICAgICB9CisgICAgICBIYXNoVGFibGUqIGh0ID0gWl9BUlJWQUxfUCh2YWx1ZSk7CisgICAgICB6dmFsKiB2YWxfcHRyOworCisgICAgICB2YWxfcHRyID0gemVuZF9oYXNoX3N0cl9maW5kKGZpZWxkc3BlYywgImV0eXBlIiwgc2l6ZW9mKCJldHlwZSIpLTEpOworICAgICAgSGFzaFRhYmxlKiBzcGVjID0gWl9BUlJWQUxfUCh6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAiZWxlbSIsIHNpemVvZigiZWxlbSIpLTEpKTsKKyAgICAgIGlmIChaX1RZUEVfUCh2YWxfcHRyKSAhPSBJU19MT05HKSBjb252ZXJ0X3RvX2xvbmcodmFsX3B0cik7CisgICAgICB1aW50OF90IGtleXR5cGUgPSBaX0xWQUxfUCh2YWxfcHRyKTsKKyAgICAgIHRyYW5zcG9ydC53cml0ZUk4KGtleXR5cGUpOworCisgICAgICB0cmFuc3BvcnQud3JpdGVJMzIoemVuZF9oYXNoX251bV9lbGVtZW50cyhodCkpOworICAgICAgSGFzaFBvc2l0aW9uIGtleV9wdHI7CisgICAgICBpZih0dHlwZV9pc19zY2FsYXIoa2V5dHlwZSkpeworICAgICAgICBmb3IgKHplbmRfaGFzaF9pbnRlcm5hbF9wb2ludGVyX3Jlc2V0X2V4KGh0LCAma2V5X3B0cik7CisgICAgICAgICAgICAgKHZhbF9wdHIgPSB6ZW5kX2hhc2hfZ2V0X2N1cnJlbnRfZGF0YV9leChodCwgJmtleV9wdHIpKSAhPSBudWxscHRyOworICAgICAgICAgICAgIHplbmRfaGFzaF9tb3ZlX2ZvcndhcmRfZXgoaHQsICZrZXlfcHRyKSkgeworICAgICAgICAgIGJpbmFyeV9zZXJpYWxpemVfaGFzaHRhYmxlX2tleShrZXl0eXBlLCB0cmFuc3BvcnQsIGh0LCBrZXlfcHRyLCBzcGVjKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yICh6ZW5kX2hhc2hfaW50ZXJuYWxfcG9pbnRlcl9yZXNldF9leChodCwgJmtleV9wdHIpOworICAgICAgICAgICAgICh2YWxfcHRyID0gemVuZF9oYXNoX2dldF9jdXJyZW50X2RhdGFfZXgoaHQsICZrZXlfcHRyKSkgIT0gbnVsbHB0cjsKKyAgICAgICAgICAgICB6ZW5kX2hhc2hfbW92ZV9mb3J3YXJkX2V4KGh0LCAma2V5X3B0cikpIHsKKyAgICAgICAgICBiaW5hcnlfc2VyaWFsaXplKGtleXR5cGUsIHRyYW5zcG9ydCwgdmFsX3B0ciwgc3BlYyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IHJldHVybjsKKyAgfTsKKworICBjaGFyIGVycmJ1ZlsxMjhdOworICBzbnByaW50ZihlcnJidWYsIDEyOCwgIlVua25vd24gdGhyaWZ0IHR5cGVJRCAlZCIsIHRocmlmdF90eXBlSUQpOworICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oZXJyYnVmLCBJTlZBTElEX0RBVEEpOworfQorCitzdGF0aWMKK3ZvaWQgcHJvdG9jb2xfd3JpdGVNZXNzYWdlQmVnaW4oenZhbCogdHJhbnNwb3J0LCB6ZW5kX3N0cmluZyogbWV0aG9kX25hbWUsIGludDMyX3QgbXNndHlwZSwgaW50MzJfdCBzZXFJRCkgeworICB6dmFsIGFyZ3NbM107CisgIHp2YWwgcmV0OworICB6dmFsIHdyaXRlTWVzc2FnZWZuOworCisgIFpWQUxfU1RSX0NPUFkoJmFyZ3NbMF0sIG1ldGhvZF9uYW1lKTsKKyAgWlZBTF9MT05HKCZhcmdzWzFdLCBtc2d0eXBlKTsKKyAgWlZBTF9MT05HKCZhcmdzWzJdLCBzZXFJRCk7CisgIFpWQUxfTlVMTCgmcmV0KTsKKyAgWlZBTF9TVFJJTkcoJndyaXRlTWVzc2FnZWZuLCAid3JpdGVNZXNzYWdlQmVnaW4iKTsKKworICBjYWxsX3VzZXJfZnVuY3Rpb24oRUcoZnVuY3Rpb25fdGFibGUpLCB0cmFuc3BvcnQsICZ3cml0ZU1lc3NhZ2VmbiwgJnJldCwgMywgYXJncyk7CisKKyAgenZhbF9kdG9yKCZ3cml0ZU1lc3NhZ2Vmbik7CisgIHp2YWxfZHRvcigmYXJnc1syXSk7IHp2YWxfZHRvcigmYXJnc1sxXSk7IHp2YWxfZHRvcigmYXJnc1swXSk7CisgIHp2YWxfZHRvcigmcmV0KTsKKyAgaWYgKEVHKGV4Y2VwdGlvbikpIHsKKyAgICB6ZW5kX29iamVjdCAqZXggPSBFRyhleGNlcHRpb24pOworICAgIEVHKGV4Y2VwdGlvbikgPSBudWxscHRyOworICAgIHRocm93IFBIUEV4Y2VwdGlvbldyYXBwZXIoZXgpOworICB9Cit9CisKK3N0YXRpYyBpbmxpbmUKK2Jvb2wgdHR5cGVfaXNfaW50KGludDhfdCB0KSB7CiAgIHJldHVybiAoKHQgPT0gVF9CWVRFKSB8fCAoKHQgPj0gVF9JMTYpICAmJiAodCA8PSBUX0k2NCkpKTsKIH0KK3N0YXRpYyBpbmxpbmUKK2Jvb2wgdHR5cGVfaXNfc2NhbGFyKGludDhfdCB0KSB7CisgIHJldHVybiAhKCh0ID09IFRfU1RSVUNUKSB8fCAoIHQ9PSBUX01BUCkgIHx8ICh0ID09IFRfU0VUKSB8fCAodCA9PSBUX0xJU1QpKTsKK30KIAotaW5saW5lIGJvb2wgdHR5cGVzX2FyZV9jb21wYXRpYmxlKGludDhfdCB0MSwgaW50OF90IHQyKSB7CitzdGF0aWMgaW5saW5lCitib29sIHR0eXBlc19hcmVfY29tcGF0aWJsZShpbnQ4X3QgdDEsIGludDhfdCB0MikgewogICAvLyBJbnRlZ2VyIHR5cGVzIG9mIGRpZmZlcmVudCB3aWR0aHMgYXJlIGNvbnNpZGVyZWQgY29tcGF0aWJsZTsKICAgLy8gb3RoZXJ3aXNlIHRoZSB0eXBlSUQgbXVzdCBtYXRjaC4KICAgcmV0dXJuICgodDEgPT0gdDIpIHx8ICh0dHlwZV9pc19pbnQodDEpICYmIHR0eXBlX2lzX2ludCh0MikpKTsKIH0KIAorLy9pcyB1c2VkIHRvIHZhbGlkYXRlIG9iamVjdHMgYmVmb3JlIHNlcmlhbGl6YXRpb24gYW5kIGFmdGVyIGRlc2VyaWFsaXphdGlvbi4gRm9yIG5vdywgb25seSByZXF1aXJlZCBmaWVsZHMgYXJlIHZhbGlkYXRlZC4KK3N0YXRpYwordm9pZCB2YWxpZGF0ZV90aHJpZnRfb2JqZWN0KHp2YWwqIG9iamVjdCkgeworICAgIHplbmRfY2xhc3NfZW50cnkqIG9iamVjdF9jbGFzc19lbnRyeSA9IFpfT0JKQ0VfUChvYmplY3QpOworICAgIHp2YWwqIGlzX3ZhbGlkYXRlID0gemVuZF9yZWFkX3N0YXRpY19wcm9wZXJ0eShvYmplY3RfY2xhc3NfZW50cnksICJpc1ZhbGlkYXRlIiwgc2l6ZW9mKCJpc1ZhbGlkYXRlIiktMSwgdHJ1ZSk7CisgICAgaWYgKGlzX3ZhbGlkYXRlKSB7CisgICAgICBaVkFMX0RFUkVGKGlzX3ZhbGlkYXRlKTsKKyAgICB9CisgICAgenZhbCogc3BlYyA9IHplbmRfcmVhZF9zdGF0aWNfcHJvcGVydHkob2JqZWN0X2NsYXNzX2VudHJ5LCAiX1RTUEVDIiwgc2l6ZW9mKCJfVFNQRUMiKS0xLCB0cnVlKTsKKyAgICBpZiAoc3BlYykgeworICAgICAgWlZBTF9ERVJFRihzcGVjKTsKKyAgICB9CisgICAgSGFzaFBvc2l0aW9uIGtleV9wdHI7CisgICAgenZhbCogdmFsX3B0cjsKKworICAgIGlmIChpc192YWxpZGF0ZSAmJiBaX1RZUEVfSU5GT19QKGlzX3ZhbGlkYXRlKSA9PSBJU19UUlVFKSB7CisgICAgICAgIGZvciAoemVuZF9oYXNoX2ludGVybmFsX3BvaW50ZXJfcmVzZXRfZXgoWl9BUlJWQUxfUChzcGVjKSwgJmtleV9wdHIpOworICAgICAgICAgICAodmFsX3B0ciA9IHplbmRfaGFzaF9nZXRfY3VycmVudF9kYXRhX2V4KFpfQVJSVkFMX1Aoc3BlYyksICZrZXlfcHRyKSkgIT0gbnVsbHB0cjsKKyAgICAgICAgICAgemVuZF9oYXNoX21vdmVfZm9yd2FyZF9leChaX0FSUlZBTF9QKHNwZWMpLCAma2V5X3B0cikpIHsKKworICAgICAgICAgICAgemVuZF91bG9uZyBmaWVsZG5vOworICAgICAgICAgICAgaWYgKHplbmRfaGFzaF9nZXRfY3VycmVudF9rZXlfZXgoWl9BUlJWQUxfUChzcGVjKSwgbnVsbHB0ciwgJmZpZWxkbm8sICZrZXlfcHRyKSAhPSBIQVNIX0tFWV9JU19MT05HKSB7CisgICAgICAgICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbigiQmFkIGtleXR5cGUgaW4gVFNQRUMgKGV4cGVjdGVkICdsb25nJykiLCBJTlZBTElEX0RBVEEpOworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBIYXNoVGFibGUqIGZpZWxkc3BlYyA9IFpfQVJSVkFMX1AodmFsX3B0cik7CisKKyAgICAgICAgICAgIC8vIGZpZWxkIG5hbWUKKyAgICAgICAgICAgIHp2YWwqIHp2YXJuYW1lID0gemVuZF9oYXNoX3N0cl9maW5kKGZpZWxkc3BlYywgInZhciIsIHNpemVvZigidmFyIiktMSk7CisgICAgICAgICAgICBjaGFyKiB2YXJuYW1lID0gWl9TVFJWQUxfUCh6dmFybmFtZSk7CisKKyAgICAgICAgICAgIHp2YWwqIGlzX3JlcXVpcmVkID0gemVuZF9oYXNoX3N0cl9maW5kKGZpZWxkc3BlYywgImlzUmVxdWlyZWQiLCBzaXplb2YoImlzUmVxdWlyZWQiKS0xKTsKKyAgICAgICAgICAgIHp2YWwgcnY7CisgICAgICAgICAgICB6dmFsKiBwcm9wID0gemVuZF9yZWFkX3Byb3BlcnR5KG9iamVjdF9jbGFzc19lbnRyeSwgb2JqZWN0LCB2YXJuYW1lLCBzdHJsZW4odmFybmFtZSksIGZhbHNlLCAmcnYpOworCisgICAgICAgICAgICBpZiAoWl9UWVBFX0lORk9fUChpc19yZXF1aXJlZCkgPT0gSVNfVFJVRSAmJiBaX1RZUEVfUChwcm9wKSA9PSBJU19OVUxMKSB7CisgICAgICAgICAgICAgICAgY2hhciBlcnJidWZbMTI4XTsKKyAgICAgICAgICAgICAgICBzbnByaW50ZihlcnJidWYsIDEyOCwgIlJlcXVpcmVkIGZpZWxkICVzLiVzIGlzIHVuc2V0ISIsIFpTVFJfVkFMKG9iamVjdF9jbGFzc19lbnRyeS0+bmFtZSksIHZhcm5hbWUpOworICAgICAgICAgICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbihlcnJidWYsIElOVkFMSURfREFUQSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYwogdm9pZCBiaW5hcnlfZGVzZXJpYWxpemVfc3BlYyh6dmFsKiB6dGhpcywgUEhQSW5wdXRUcmFuc3BvcnQmIHRyYW5zcG9ydCwgSGFzaFRhYmxlKiBzcGVjKSB7CiAgIC8vIFNFVCBhbmQgTElTVCBoYXZlICdlbGVtJyA9PiBhcnJheSgndHlwZScsIFtvcHRpb25hbF0gJ2NsYXNzJykKICAgLy8gTUFQIGhhcyAndmFsJyA9PiBhcnJheSgndHlwZScsIFtvcHRpb25hXSAnY2xhc3MnKQotICBUU1JNTFNfRkVUQ0goKTsKLSAgemVuZF9jbGFzc19lbnRyeSogY2UgPSB6ZW5kX2dldF9jbGFzc19lbnRyeSh6dGhpcyBUU1JNTFNfQ0MpOworICB6ZW5kX2NsYXNzX2VudHJ5KiBjZSA9IFpfT0JKQ0VfUCh6dGhpcyk7CiAgIHdoaWxlICh0cnVlKSB7Ci0gICAgenZhbCoqIHZhbF9wdHIgPSBOVUxMOwotCiAgICAgaW50OF90IHR0eXBlID0gdHJhbnNwb3J0LnJlYWRJOCgpOwotICAgIGlmICh0dHlwZSA9PSBUX1NUT1ApIHJldHVybjsKKyAgICBpZiAodHR5cGUgPT0gVF9TVE9QKSB7CisgICAgICB2YWxpZGF0ZV90aHJpZnRfb2JqZWN0KHp0aGlzKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKICAgICBpbnQxNl90IGZpZWxkbm8gPSB0cmFuc3BvcnQucmVhZEkxNigpOwotICAgIGlmICh6ZW5kX2hhc2hfaW5kZXhfZmluZChzcGVjLCBmaWVsZG5vLCAodm9pZCoqKSZ2YWxfcHRyKSA9PSBTVUNDRVNTKSB7Ci0gICAgICBIYXNoVGFibGUqIGZpZWxkc3BlYyA9IFpfQVJSVkFMX1BQKHZhbF9wdHIpOworICAgIHp2YWwqIHZhbF9wdHIgPSB6ZW5kX2hhc2hfaW5kZXhfZmluZChzcGVjLCBmaWVsZG5vKTsKKyAgICBpZiAodmFsX3B0ciAhPSBudWxscHRyKSB7CisgICAgICBIYXNoVGFibGUqIGZpZWxkc3BlYyA9IFpfQVJSVkFMX1AodmFsX3B0cik7CiAgICAgICAvLyBwdWxsIHRoZSBmaWVsZCBuYW1lCi0gICAgICAvLyB6ZW5kIGhhc2ggdGFibGVzIHVzZSB0aGUgbnVsbCBhdCB0aGUgZW5kIGluIHRoZSBsZW5ndGguLi4gc28gc3RybGVuKGhhc2gga2V5KSArIDEuCi0gICAgICB6ZW5kX2hhc2hfZmluZChmaWVsZHNwZWMsICJ2YXIiLCA0LCAodm9pZCoqKSZ2YWxfcHRyKTsKLSAgICAgIGNoYXIqIHZhcm5hbWUgPSBaX1NUUlZBTF9QUCh2YWxfcHRyKTsKKyAgICAgIHZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAidmFyIiwgc2l6ZW9mKCJ2YXIiKS0xKTsKKyAgICAgIGNoYXIqIHZhcm5hbWUgPSBaX1NUUlZBTF9QKHZhbF9wdHIpOwogCiAgICAgICAvLyBhbmQgdGhlIHR5cGUKLSAgICAgIHplbmRfaGFzaF9maW5kKGZpZWxkc3BlYywgInR5cGUiLCA1LCAodm9pZCoqKSZ2YWxfcHRyKTsKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsX3B0cikgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKCp2YWxfcHRyKTsKLSAgICAgIGludDhfdCBleHBlY3RlZF90dHlwZSA9IFpfTFZBTF9QUCh2YWxfcHRyKTsKKyAgICAgIHZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAidHlwZSIsIHNpemVvZigidHlwZSIpLTEpOworICAgICAgaWYgKFpfVFlQRV9QKHZhbF9wdHIpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZyh2YWxfcHRyKTsKKyAgICAgIGludDhfdCBleHBlY3RlZF90dHlwZSA9IFpfTFZBTF9QKHZhbF9wdHIpOwogCiAgICAgICBpZiAodHR5cGVzX2FyZV9jb21wYXRpYmxlKHR0eXBlLCBleHBlY3RlZF90dHlwZSkpIHsKLSAgICAgICAgenZhbCogcnYgPSBOVUxMOwotICAgICAgICBNQUtFX1NURF9aVkFMKHJ2KTsKLSAgICAgICAgYmluYXJ5X2Rlc2VyaWFsaXplKHR0eXBlLCB0cmFuc3BvcnQsIHJ2LCBmaWVsZHNwZWMpOwotICAgICAgICB6ZW5kX3VwZGF0ZV9wcm9wZXJ0eShjZSwgenRoaXMsIHZhcm5hbWUsIHN0cmxlbih2YXJuYW1lKSwgcnYgVFNSTUxTX0NDKTsKKyAgICAgICAgenZhbCBydjsKKyAgICAgICAgWlZBTF9VTkRFRigmcnYpOworCisgICAgICAgIGJpbmFyeV9kZXNlcmlhbGl6ZSh0dHlwZSwgdHJhbnNwb3J0LCAmcnYsIGZpZWxkc3BlYyk7CisgICAgICAgIHplbmRfdXBkYXRlX3Byb3BlcnR5KGNlLCB6dGhpcywgdmFybmFtZSwgc3RybGVuKHZhcm5hbWUpLCAmcnYpOworCiAgICAgICAgIHp2YWxfcHRyX2R0b3IoJnJ2KTsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIHNraXBfZWxlbWVudCh0dHlwZSwgdHJhbnNwb3J0KTsKQEAgLTc2MywxNzEgKzk4MSw0NCBAQAogICB9CiB9CiAKLXZvaWQgYmluYXJ5X3NlcmlhbGl6ZShpbnQ4X3QgdGhyaWZ0X3R5cGVJRCwgUEhQT3V0cHV0VHJhbnNwb3J0JiB0cmFuc3BvcnQsIHp2YWwqKiB2YWx1ZSwgSGFzaFRhYmxlKiBmaWVsZHNwZWMpIHsKLSAgLy8gQXQgdGhpcyBwb2ludCB0aGUgdHlwZUlEIChhbmQgZmllbGQgbnVtLCBpZiBhcHBsaWNhYmxlKSBzaG91bGQndmUgYWxyZWFkeSBiZWVuIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBzbyBhbGwgd2UgbmVlZCB0byBkbyBpcyB3cml0ZSB0aGUgcGF5bG9hZC4KLSAgc3dpdGNoICh0aHJpZnRfdHlwZUlEKSB7Ci0gICAgY2FzZSBUX1NUT1A6Ci0gICAgY2FzZSBUX1ZPSUQ6Ci0gICAgICByZXR1cm47Ci0gICAgY2FzZSBUX1NUUlVDVDogewotICAgICAgVFNSTUxTX0ZFVENIKCk7Ci0gICAgICBpZiAoWl9UWVBFX1BQKHZhbHVlKSAhPSBJU19PQkpFQ1QpIHsKLSAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJBdHRlbXB0IHRvIHNlbmQgbm9uLW9iamVjdCB0eXBlIGFzIGEgVF9TVFJVQ1QiLCBJTlZBTElEX0RBVEEpOwotICAgICAgfQotICAgICAgenZhbCogc3BlYyA9IHplbmRfcmVhZF9zdGF0aWNfcHJvcGVydHkoemVuZF9nZXRfY2xhc3NfZW50cnkoKnZhbHVlIFRTUk1MU19DQyksICJfVFNQRUMiLCA2LCBmYWxzZSBUU1JNTFNfQ0MpOwotICAgICAgaWYgKFpfVFlQRV9QKHNwZWMpICE9IElTX0FSUkFZKSB7Ci0gICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbigiQXR0ZW1wdCB0byBzZW5kIG5vbi1UaHJpZnQgb2JqZWN0IGFzIGEgVF9TVFJVQ1QiLCBJTlZBTElEX0RBVEEpOwotICAgICAgfQotICAgICAgYmluYXJ5X3NlcmlhbGl6ZV9zcGVjKCp2YWx1ZSwgdHJhbnNwb3J0LCBaX0FSUlZBTF9QKHNwZWMpKTsKLSAgICB9IHJldHVybjsKLSAgICBjYXNlIFRfQk9PTDoKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsdWUpICE9IElTX0JPT0wpIGNvbnZlcnRfdG9fYm9vbGVhbigqdmFsdWUpOwotICAgICAgdHJhbnNwb3J0LndyaXRlSTgoWl9CVkFMX1BQKHZhbHVlKSA/IDEgOiAwKTsKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIFRfQllURToKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsdWUpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZygqdmFsdWUpOwotICAgICAgdHJhbnNwb3J0LndyaXRlSTgoWl9MVkFMX1BQKHZhbHVlKSk7Ci0gICAgICByZXR1cm47Ci0gICAgY2FzZSBUX0kxNjoKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsdWUpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZygqdmFsdWUpOwotICAgICAgdHJhbnNwb3J0LndyaXRlSTE2KFpfTFZBTF9QUCh2YWx1ZSkpOwotICAgICAgcmV0dXJuOwotICAgIGNhc2UgVF9JMzI6Ci0gICAgICBpZiAoWl9UWVBFX1BQKHZhbHVlKSAhPSBJU19MT05HKSBjb252ZXJ0X3RvX2xvbmcoKnZhbHVlKTsKLSAgICAgIHRyYW5zcG9ydC53cml0ZUkzMihaX0xWQUxfUFAodmFsdWUpKTsKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIFRfSTY0OgotICAgIGNhc2UgVF9VNjQ6IHsKLSAgICAgIGludDY0X3QgbF9kYXRhOwotI2lmIGRlZmluZWQoX0xQNjQpIHx8IGRlZmluZWQoX1dJTjY0KQotICAgICAgaWYgKFpfVFlQRV9QUCh2YWx1ZSkgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKCp2YWx1ZSk7Ci0gICAgICBsX2RhdGEgPSBaX0xWQUxfUFAodmFsdWUpOwotI2Vsc2UKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsdWUpICE9IElTX0RPVUJMRSkgY29udmVydF90b19kb3VibGUoKnZhbHVlKTsKLSAgICAgIGxfZGF0YSA9IChpbnQ2NF90KVpfRFZBTF9QUCh2YWx1ZSk7Ci0jZW5kaWYKLSAgICAgIHRyYW5zcG9ydC53cml0ZUk2NChsX2RhdGEpOwotICAgIH0gcmV0dXJuOwotICAgIGNhc2UgVF9ET1VCTEU6IHsKLSAgICAgIHVuaW9uIHsKLSAgICAgICAgaW50NjRfdCBjOwotICAgICAgICBkb3VibGUgZDsKLSAgICAgIH0gYTsKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsdWUpICE9IElTX0RPVUJMRSkgY29udmVydF90b19kb3VibGUoKnZhbHVlKTsKLSAgICAgIGEuZCA9IFpfRFZBTF9QUCh2YWx1ZSk7Ci0gICAgICB0cmFuc3BvcnQud3JpdGVJNjQoYS5jKTsKLSAgICB9IHJldHVybjsKLSAgICAvL2Nhc2UgVF9VVEY3OgotICAgIGNhc2UgVF9VVEY4OgotICAgIGNhc2UgVF9VVEYxNjoKLSAgICBjYXNlIFRfU1RSSU5HOgotICAgICAgaWYgKFpfVFlQRV9QUCh2YWx1ZSkgIT0gSVNfU1RSSU5HKSBjb252ZXJ0X3RvX3N0cmluZygqdmFsdWUpOwotICAgICAgdHJhbnNwb3J0LndyaXRlU3RyaW5nKFpfU1RSVkFMX1BQKHZhbHVlKSwgWl9TVFJMRU5fUFAodmFsdWUpKTsKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIFRfTUFQOiB7Ci0gICAgICBpZiAoWl9UWVBFX1BQKHZhbHVlKSAhPSBJU19BUlJBWSkgY29udmVydF90b19hcnJheSgqdmFsdWUpOwotICAgICAgaWYgKFpfVFlQRV9QUCh2YWx1ZSkgIT0gSVNfQVJSQVkpIHsKLSAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJBdHRlbXB0IHRvIHNlbmQgYW4gaW5jb21wYXRpYmxlIHR5cGUgYXMgYW4gYXJyYXkgKFRfTUFQKSIsIElOVkFMSURfREFUQSk7Ci0gICAgICB9Ci0gICAgICBIYXNoVGFibGUqIGh0ID0gWl9BUlJWQUxfUFAodmFsdWUpOwotICAgICAgenZhbCoqIHZhbF9wdHI7Ci0KLSAgICAgIHplbmRfaGFzaF9maW5kKGZpZWxkc3BlYywgImt0eXBlIiwgNiwgKHZvaWQqKikmdmFsX3B0cik7Ci0gICAgICBpZiAoWl9UWVBFX1BQKHZhbF9wdHIpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZygqdmFsX3B0cik7Ci0gICAgICB1aW50OF90IGtleXR5cGUgPSBaX0xWQUxfUFAodmFsX3B0cik7Ci0gICAgICB0cmFuc3BvcnQud3JpdGVJOChrZXl0eXBlKTsKLSAgICAgIHplbmRfaGFzaF9maW5kKGZpZWxkc3BlYywgInZ0eXBlIiwgNiwgKHZvaWQqKikmdmFsX3B0cik7Ci0gICAgICBpZiAoWl9UWVBFX1BQKHZhbF9wdHIpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZygqdmFsX3B0cik7Ci0gICAgICB1aW50OF90IHZhbHR5cGUgPSBaX0xWQUxfUFAodmFsX3B0cik7Ci0gICAgICB0cmFuc3BvcnQud3JpdGVJOCh2YWx0eXBlKTsKLQotICAgICAgemVuZF9oYXNoX2ZpbmQoZmllbGRzcGVjLCAidmFsIiwgNCwgKHZvaWQqKikmdmFsX3B0cik7Ci0gICAgICBIYXNoVGFibGUqIHZhbHNwZWMgPSBaX0FSUlZBTF9QUCh2YWxfcHRyKTsKLQotICAgICAgdHJhbnNwb3J0LndyaXRlSTMyKHplbmRfaGFzaF9udW1fZWxlbWVudHMoaHQpKTsKLSAgICAgIEhhc2hQb3NpdGlvbiBrZXlfcHRyOwotICAgICAgZm9yICh6ZW5kX2hhc2hfaW50ZXJuYWxfcG9pbnRlcl9yZXNldF9leChodCwgJmtleV9wdHIpOyB6ZW5kX2hhc2hfZ2V0X2N1cnJlbnRfZGF0YV9leChodCwgKHZvaWQqKikmdmFsX3B0ciwgJmtleV9wdHIpID09IFNVQ0NFU1M7IHplbmRfaGFzaF9tb3ZlX2ZvcndhcmRfZXgoaHQsICZrZXlfcHRyKSkgewotICAgICAgICBiaW5hcnlfc2VyaWFsaXplX2hhc2h0YWJsZV9rZXkoa2V5dHlwZSwgdHJhbnNwb3J0LCBodCwga2V5X3B0cik7Ci0gICAgICAgIGJpbmFyeV9zZXJpYWxpemUodmFsdHlwZSwgdHJhbnNwb3J0LCB2YWxfcHRyLCB2YWxzcGVjKTsKLSAgICAgIH0KLSAgICB9IHJldHVybjsKLSAgICBjYXNlIFRfTElTVDogewotICAgICAgaWYgKFpfVFlQRV9QUCh2YWx1ZSkgIT0gSVNfQVJSQVkpIGNvbnZlcnRfdG9fYXJyYXkoKnZhbHVlKTsKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsdWUpICE9IElTX0FSUkFZKSB7Ci0gICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbigiQXR0ZW1wdCB0byBzZW5kIGFuIGluY29tcGF0aWJsZSB0eXBlIGFzIGFuIGFycmF5IChUX0xJU1QpIiwgSU5WQUxJRF9EQVRBKTsKLSAgICAgIH0KLSAgICAgIEhhc2hUYWJsZSogaHQgPSBaX0FSUlZBTF9QUCh2YWx1ZSk7Ci0gICAgICB6dmFsKiogdmFsX3B0cjsKLQotICAgICAgemVuZF9oYXNoX2ZpbmQoZmllbGRzcGVjLCAiZXR5cGUiLCA2LCAodm9pZCoqKSZ2YWxfcHRyKTsKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsX3B0cikgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKCp2YWxfcHRyKTsKLSAgICAgIHVpbnQ4X3QgdmFsdHlwZSA9IFpfTFZBTF9QUCh2YWxfcHRyKTsKLSAgICAgIHRyYW5zcG9ydC53cml0ZUk4KHZhbHR5cGUpOwotCi0gICAgICB6ZW5kX2hhc2hfZmluZChmaWVsZHNwZWMsICJlbGVtIiwgNSwgKHZvaWQqKikmdmFsX3B0cik7Ci0gICAgICBIYXNoVGFibGUqIHZhbHNwZWMgPSBaX0FSUlZBTF9QUCh2YWxfcHRyKTsKLQotICAgICAgdHJhbnNwb3J0LndyaXRlSTMyKHplbmRfaGFzaF9udW1fZWxlbWVudHMoaHQpKTsKLSAgICAgIEhhc2hQb3NpdGlvbiBrZXlfcHRyOwotICAgICAgZm9yICh6ZW5kX2hhc2hfaW50ZXJuYWxfcG9pbnRlcl9yZXNldF9leChodCwgJmtleV9wdHIpOyB6ZW5kX2hhc2hfZ2V0X2N1cnJlbnRfZGF0YV9leChodCwgKHZvaWQqKikmdmFsX3B0ciwgJmtleV9wdHIpID09IFNVQ0NFU1M7IHplbmRfaGFzaF9tb3ZlX2ZvcndhcmRfZXgoaHQsICZrZXlfcHRyKSkgewotICAgICAgICBiaW5hcnlfc2VyaWFsaXplKHZhbHR5cGUsIHRyYW5zcG9ydCwgdmFsX3B0ciwgdmFsc3BlYyk7Ci0gICAgICB9Ci0gICAgfSByZXR1cm47Ci0gICAgY2FzZSBUX1NFVDogewotICAgICAgaWYgKFpfVFlQRV9QUCh2YWx1ZSkgIT0gSVNfQVJSQVkpIGNvbnZlcnRfdG9fYXJyYXkoKnZhbHVlKTsKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsdWUpICE9IElTX0FSUkFZKSB7Ci0gICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbigiQXR0ZW1wdCB0byBzZW5kIGFuIGluY29tcGF0aWJsZSB0eXBlIGFzIGFuIGFycmF5IChUX1NFVCkiLCBJTlZBTElEX0RBVEEpOwotICAgICAgfQotICAgICAgSGFzaFRhYmxlKiBodCA9IFpfQVJSVkFMX1BQKHZhbHVlKTsKLSAgICAgIHp2YWwqKiB2YWxfcHRyOwotCi0gICAgICB6ZW5kX2hhc2hfZmluZChmaWVsZHNwZWMsICJldHlwZSIsIDYsICh2b2lkKiopJnZhbF9wdHIpOwotICAgICAgaWYgKFpfVFlQRV9QUCh2YWxfcHRyKSAhPSBJU19MT05HKSBjb252ZXJ0X3RvX2xvbmcoKnZhbF9wdHIpOwotICAgICAgdWludDhfdCBrZXl0eXBlID0gWl9MVkFMX1BQKHZhbF9wdHIpOwotICAgICAgdHJhbnNwb3J0LndyaXRlSTgoa2V5dHlwZSk7Ci0KLSAgICAgIHRyYW5zcG9ydC53cml0ZUkzMih6ZW5kX2hhc2hfbnVtX2VsZW1lbnRzKGh0KSk7Ci0gICAgICBIYXNoUG9zaXRpb24ga2V5X3B0cjsKLSAgICAgIGZvciAoemVuZF9oYXNoX2ludGVybmFsX3BvaW50ZXJfcmVzZXRfZXgoaHQsICZrZXlfcHRyKTsgemVuZF9oYXNoX2dldF9jdXJyZW50X2RhdGFfZXgoaHQsICh2b2lkKiopJnZhbF9wdHIsICZrZXlfcHRyKSA9PSBTVUNDRVNTOyB6ZW5kX2hhc2hfbW92ZV9mb3J3YXJkX2V4KGh0LCAma2V5X3B0cikpIHsKLSAgICAgICAgYmluYXJ5X3NlcmlhbGl6ZV9oYXNodGFibGVfa2V5KGtleXR5cGUsIHRyYW5zcG9ydCwgaHQsIGtleV9wdHIpOwotICAgICAgfQotICAgIH0gcmV0dXJuOwotICB9OwotICBjaGFyIGVycmJ1ZlsxMjhdOwotICBzcHJpbnRmKGVycmJ1ZiwgIlVua25vd24gdGhyaWZ0IHR5cGVJRCAlZCIsIHRocmlmdF90eXBlSUQpOwotICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oZXJyYnVmLCBJTlZBTElEX0RBVEEpOwotfQotCi0KK3N0YXRpYwogdm9pZCBiaW5hcnlfc2VyaWFsaXplX3NwZWMoenZhbCogenRoaXMsIFBIUE91dHB1dFRyYW5zcG9ydCYgdHJhbnNwb3J0LCBIYXNoVGFibGUqIHNwZWMpIHsKKworICB2YWxpZGF0ZV90aHJpZnRfb2JqZWN0KHp0aGlzKTsKKwogICBIYXNoUG9zaXRpb24ga2V5X3B0cjsKLSAgenZhbCoqIHZhbF9wdHI7CisgIHp2YWwqIHZhbF9wdHI7CiAKLSAgVFNSTUxTX0ZFVENIKCk7Ci0gIHplbmRfY2xhc3NfZW50cnkqIGNlID0gemVuZF9nZXRfY2xhc3NfZW50cnkoenRoaXMgVFNSTUxTX0NDKTsKKyAgZm9yICh6ZW5kX2hhc2hfaW50ZXJuYWxfcG9pbnRlcl9yZXNldF9leChzcGVjLCAma2V5X3B0cik7CisgICAgICAgKHZhbF9wdHIgPSB6ZW5kX2hhc2hfZ2V0X2N1cnJlbnRfZGF0YV9leChzcGVjLCAma2V5X3B0cikpICE9IG51bGxwdHI7CisgICAgICAgemVuZF9oYXNoX21vdmVfZm9yd2FyZF9leChzcGVjLCAma2V5X3B0cikpIHsKIAotICBmb3IgKHplbmRfaGFzaF9pbnRlcm5hbF9wb2ludGVyX3Jlc2V0X2V4KHNwZWMsICZrZXlfcHRyKTsgemVuZF9oYXNoX2dldF9jdXJyZW50X2RhdGFfZXgoc3BlYywgKHZvaWQqKikmdmFsX3B0ciwgJmtleV9wdHIpID09IFNVQ0NFU1M7IHplbmRfaGFzaF9tb3ZlX2ZvcndhcmRfZXgoc3BlYywgJmtleV9wdHIpKSB7Ci0gICAgdWxvbmcgZmllbGRubzsKLSAgICBpZiAoemVuZF9oYXNoX2dldF9jdXJyZW50X2tleV9leChzcGVjLCBOVUxMLCBOVUxMLCAmZmllbGRubywgMCwgJmtleV9wdHIpICE9IEhBU0hfS0VZX0lTX0xPTkcpIHsKKyAgICB6ZW5kX3Vsb25nIGZpZWxkbm87CisgICAgaWYgKHplbmRfaGFzaF9nZXRfY3VycmVudF9rZXlfZXgoc3BlYywgbnVsbHB0ciwgJmZpZWxkbm8sICZrZXlfcHRyKSAhPSBIQVNIX0tFWV9JU19MT05HKSB7CiAgICAgICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oIkJhZCBrZXl0eXBlIGluIFRTUEVDIChleHBlY3RlZCAnbG9uZycpIiwgSU5WQUxJRF9EQVRBKTsKICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgSGFzaFRhYmxlKiBmaWVsZHNwZWMgPSBaX0FSUlZBTF9QUCh2YWxfcHRyKTsKKyAgICBIYXNoVGFibGUqIGZpZWxkc3BlYyA9IFpfQVJSVkFMX1AodmFsX3B0cik7CiAKICAgICAvLyBmaWVsZCBuYW1lCi0gICAgemVuZF9oYXNoX2ZpbmQoZmllbGRzcGVjLCAidmFyIiwgNCwgKHZvaWQqKikmdmFsX3B0cik7Ci0gICAgY2hhciogdmFybmFtZSA9IFpfU1RSVkFMX1BQKHZhbF9wdHIpOworICAgIHZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAidmFyIiwgc2l6ZW9mKCJ2YXIiKS0xKTsKKyAgICBjaGFyKiB2YXJuYW1lID0gWl9TVFJWQUxfUCh2YWxfcHRyKTsKIAogICAgIC8vIHRocmlmdCB0eXBlCi0gICAgemVuZF9oYXNoX2ZpbmQoZmllbGRzcGVjLCAidHlwZSIsIDUsICh2b2lkKiopJnZhbF9wdHIpOwotICAgIGlmIChaX1RZUEVfUFAodmFsX3B0cikgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKCp2YWxfcHRyKTsKLSAgICBpbnQ4X3QgdHR5cGUgPSBaX0xWQUxfUFAodmFsX3B0cik7CisgICAgdmFsX3B0ciA9IHplbmRfaGFzaF9zdHJfZmluZChmaWVsZHNwZWMsICJ0eXBlIiwgc2l6ZW9mKCJ0eXBlIiktMSk7CisgICAgaWYgKFpfVFlQRV9QKHZhbF9wdHIpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZyh2YWxfcHRyKTsKKyAgICBpbnQ4X3QgdHR5cGUgPSBaX0xWQUxfUCh2YWxfcHRyKTsKIAotICAgIHp2YWwqIHByb3AgPSB6ZW5kX3JlYWRfcHJvcGVydHkoY2UsIHp0aGlzLCB2YXJuYW1lLCBzdHJsZW4odmFybmFtZSksIGZhbHNlIFRTUk1MU19DQyk7CisgICAgenZhbCBydjsKKyAgICB6dmFsKiBwcm9wID0gemVuZF9yZWFkX3Byb3BlcnR5KFpfT0JKQ0VfUCh6dGhpcyksIHp0aGlzLCB2YXJuYW1lLCBzdHJsZW4odmFybmFtZSksIGZhbHNlLCAmcnYpOworCisgICAgaWYgKFpfVFlQRV9QKHByb3ApID09IElTX1JFRkVSRU5DRSl7CisgICAgICBaVkFMX1VOUkVGKHByb3ApOworICAgIH0KICAgICBpZiAoWl9UWVBFX1AocHJvcCkgIT0gSVNfTlVMTCkgewogICAgICAgdHJhbnNwb3J0LndyaXRlSTgodHR5cGUpOwogICAgICAgdHJhbnNwb3J0LndyaXRlSTE2KGZpZWxkbm8pOwotICAgICAgYmluYXJ5X3NlcmlhbGl6ZSh0dHlwZSwgdHJhbnNwb3J0LCAmcHJvcCwgZmllbGRzcGVjKTsKKyAgICAgIGJpbmFyeV9zZXJpYWxpemUodHR5cGUsIHRyYW5zcG9ydCwgcHJvcCwgZmllbGRzcGVjKTsKICAgICB9CiAgIH0KICAgdHJhbnNwb3J0LndyaXRlSTgoVF9TVE9QKTsgLy8gc3RydWN0IGVuZApAQCAtOTM1LDkzICsxMDI2LDU5IEBACiAKIC8vIDYgcGFyYW1zOiAkdHJhbnNwb3J0ICRtZXRob2RfbmFtZSAkdHR5cGUgJHJlcXVlc3Rfc3RydWN0ICRzZXFJRCAkc3RyaWN0X3dyaXRlCiBQSFBfRlVOQ1RJT04odGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSkgewotICBpbnQgYXJnYyA9IFpFTkRfTlVNX0FSR1MoKTsKLSAgaWYgKGFyZ2MgPCA2KSB7Ci0gICAgV1JPTkdfUEFSQU1fQ09VTlQ7CisgIHp2YWwgKnByb3RvY29sOworICB6dmFsICpyZXF1ZXN0X3N0cnVjdDsKKyAgemVuZF9zdHJpbmcgKm1ldGhvZF9uYW1lOworICBsb25nIG1zZ3R5cGUsIHNlcUlEOworICB6ZW5kX2Jvb2wgc3RyaWN0X3dyaXRlOworCisgIGlmICh6ZW5kX3BhcnNlX3BhcmFtZXRlcnNfZXgoWkVORF9QQVJTRV9QQVJBTVNfUVVJRVQsIFpFTkRfTlVNX0FSR1MoKSwgIm9TbG9sYiIsCisgICAgJnByb3RvY29sLCAmbWV0aG9kX25hbWUsICZtc2d0eXBlLAorICAgICZyZXF1ZXN0X3N0cnVjdCwgJnNlcUlELCAmc3RyaWN0X3dyaXRlKSA9PSBGQUlMVVJFKSB7CisgICAgICByZXR1cm47CiAgIH0KIAotICB6dmFsICoqKmFyZ3MgPSAoenZhbCoqKikgZW1hbGxvYyhhcmdjICogc2l6ZW9mKHp2YWwqKikpOwotICB6ZW5kX2dldF9wYXJhbWV0ZXJzX2FycmF5X2V4KGFyZ2MsIGFyZ3MpOwotCi0gIGlmIChaX1RZUEVfUFAoYXJnc1swXSkgIT0gSVNfT0JKRUNUKSB7Ci0gICAgcGhwX2Vycm9yX2RvY3JlZihOVUxMIFRTUk1MU19DQywgRV9FUlJPUiwgIjFzdCBwYXJhbWV0ZXIgaXMgbm90IGFuIG9iamVjdCAodHJhbnNwb3J0KSIpOwotICAgIGVmcmVlKGFyZ3MpOwotICAgIFJFVFVSTl9OVUxMKCk7Ci0gIH0KLQotICBpZiAoWl9UWVBFX1BQKGFyZ3NbMV0pICE9IElTX1NUUklORykgewotICAgIHBocF9lcnJvcl9kb2NyZWYoTlVMTCBUU1JNTFNfQ0MsIEVfRVJST1IsICIybmQgcGFyYW1ldGVyIGlzIG5vdCBhIHN0cmluZyAobWV0aG9kIG5hbWUpIik7Ci0gICAgZWZyZWUoYXJncyk7Ci0gICAgUkVUVVJOX05VTEwoKTsKLSAgfQotCi0gIGlmIChaX1RZUEVfUFAoYXJnc1szXSkgIT0gSVNfT0JKRUNUKSB7Ci0gICAgcGhwX2Vycm9yX2RvY3JlZihOVUxMIFRTUk1MU19DQywgRV9FUlJPUiwgIjR0aCBwYXJhbWV0ZXIgaXMgbm90IGFuIG9iamVjdCAocmVxdWVzdCBzdHJ1Y3QpIik7Ci0gICAgZWZyZWUoYXJncyk7Ci0gICAgUkVUVVJOX05VTEwoKTsKLSAgfQotCi0KICAgdHJ5IHsKLSAgICBQSFBPdXRwdXRUcmFuc3BvcnQgdHJhbnNwb3J0KCphcmdzWzBdKTsKLSAgICB6dmFsICpwcm90b2NvbCA9ICphcmdzWzBdOwotICAgIGNvbnN0IGNoYXIqIG1ldGhvZF9uYW1lID0gWl9TVFJWQUxfUFAoYXJnc1sxXSk7Ci0gICAgY29udmVydF90b19sb25nKCphcmdzWzJdKTsKLSAgICBpbnQzMl90IG1zZ3R5cGUgPSBaX0xWQUxfUFAoYXJnc1syXSk7Ci0gICAgenZhbCogcmVxdWVzdF9zdHJ1Y3QgPSAqYXJnc1szXTsKLSAgICBjb252ZXJ0X3RvX2xvbmcoKmFyZ3NbNF0pOwotICAgIGludDMyX3Qgc2VxSUQgPSBaX0xWQUxfUFAoYXJnc1s0XSk7Ci0gICAgY29udmVydF90b19ib29sZWFuKCphcmdzWzVdKTsKLSAgICBib29sIHN0cmljdFdyaXRlID0gWl9CVkFMX1BQKGFyZ3NbNV0pOwotICAgIGVmcmVlKGFyZ3MpOwotICAgIGFyZ3MgPSBOVUxMOwotICAgIHByb3RvY29sX3dyaXRlTWVzc2FnZUJlZ2luKHByb3RvY29sLCBtZXRob2RfbmFtZSwgbXNndHlwZSwgc2VxSUQpOwotICAgIHp2YWwqIHNwZWMgPSB6ZW5kX3JlYWRfc3RhdGljX3Byb3BlcnR5KHplbmRfZ2V0X2NsYXNzX2VudHJ5KHJlcXVlc3Rfc3RydWN0IFRTUk1MU19DQyksICJfVFNQRUMiLCA2LCBmYWxzZSBUU1JNTFNfQ0MpOwotICAgIGlmIChaX1RZUEVfUChzcGVjKSAhPSBJU19BUlJBWSkgewotICAgICAgICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oIkF0dGVtcHQgdG8gc2VuZCBub24tVGhyaWZ0IG9iamVjdCIsIElOVkFMSURfREFUQSk7CisgICAgenZhbCogc3BlYyA9IHplbmRfcmVhZF9zdGF0aWNfcHJvcGVydHkoWl9PQkpDRV9QKHJlcXVlc3Rfc3RydWN0KSwgIl9UU1BFQyIsIHNpemVvZigiX1RTUEVDIiktMSwgdHJ1ZSk7CisgICAgaWYgKHNwZWMpIHsKKyAgICAgIFpWQUxfREVSRUYoc3BlYyk7CiAgICAgfQorCisgICAgaWYgKCFzcGVjIHx8IFpfVFlQRV9QKHNwZWMpICE9IElTX0FSUkFZKSB7CisgICAgICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oIkF0dGVtcHQgc2VyaWFsaXplIGZyb20gbm9uLVRocmlmdCBvYmplY3QiLCBJTlZBTElEX0RBVEEpOworICAgIH0KKworICAgIFBIUE91dHB1dFRyYW5zcG9ydCB0cmFuc3BvcnQocHJvdG9jb2wpOworICAgIHByb3RvY29sX3dyaXRlTWVzc2FnZUJlZ2luKHByb3RvY29sLCBtZXRob2RfbmFtZSwgKGludDMyX3QpIG1zZ3R5cGUsIChpbnQzMl90KSBzZXFJRCk7CiAgICAgYmluYXJ5X3NlcmlhbGl6ZV9zcGVjKHJlcXVlc3Rfc3RydWN0LCB0cmFuc3BvcnQsIFpfQVJSVkFMX1Aoc3BlYykpOwogICAgIHRyYW5zcG9ydC5mbHVzaCgpOworCiAgIH0gY2F0Y2ggKGNvbnN0IFBIUEV4Y2VwdGlvbldyYXBwZXImIGV4KSB7Ci0gICAgemVuZF90aHJvd19leGNlcHRpb25fb2JqZWN0KGV4IFRTUk1MU19DQyk7CisgICAgLy8gZXggd2lsbCBiZSBkZXN0cnVjdGVkLCBzbyBjb3B5IHRvIGEgenZhbCB0aGF0IHplbmRfdGhyb3dfZXhjZXB0aW9uX29iamVjdCBjYW4gdGFrZSBvd25lcnNoaXAgb2YKKyAgICB6dmFsIG15ZXg7CisgICAgWlZBTF9DT1BZKCZteWV4LCBleCk7CisgICAgemVuZF90aHJvd19leGNlcHRpb25fb2JqZWN0KCZteWV4KTsKICAgICBSRVRVUk5fTlVMTCgpOwogICB9IGNhdGNoIChjb25zdCBzdGQ6OmV4Y2VwdGlvbiYgZXgpIHsKLSAgICB0aHJvd196ZW5kX2V4Y2VwdGlvbl9mcm9tX3N0ZF9leGNlcHRpb24oZXggVFNSTUxTX0NDKTsKKyAgICB0aHJvd196ZW5kX2V4Y2VwdGlvbl9mcm9tX3N0ZF9leGNlcHRpb24oZXgpOwogICAgIFJFVFVSTl9OVUxMKCk7CiAgIH0KIH0KIAotLy8gMyBwYXJhbXM6ICR0cmFuc3BvcnQgJHJlc3BvbnNlX1R5cGVuYW1lICRzdHJpY3RfcmVhZAorCisvLyA0IHBhcmFtczogJHRyYW5zcG9ydCAkcmVzcG9uc2VfVHlwZW5hbWUgJHN0cmljdF9yZWFkICRidWZmZXJfc2l6ZQogUEhQX0ZVTkNUSU9OKHRocmlmdF9wcm90b2NvbF9yZWFkX2JpbmFyeSkgewotICBpbnQgYXJnYyA9IFpFTkRfTlVNX0FSR1MoKTsKKyAgenZhbCAqcHJvdG9jb2w7CisgIHplbmRfc3RyaW5nICpvYmpfdHlwZW5hbWU7CisgIHplbmRfYm9vbCBzdHJpY3RfcmVhZDsKKyAgc2l6ZV90IGJ1ZmZlcl9zaXplID0gODE5MjsKIAotICBpZiAoYXJnYyA8IDMpIHsKLSAgICBXUk9OR19QQVJBTV9DT1VOVDsKLSAgfQotCi0gIHp2YWwgKioqYXJncyA9ICh6dmFsKioqKSBlbWFsbG9jKGFyZ2MgKiBzaXplb2YoenZhbCoqKSk7Ci0gIHplbmRfZ2V0X3BhcmFtZXRlcnNfYXJyYXlfZXgoYXJnYywgYXJncyk7Ci0KLSAgaWYgKFpfVFlQRV9QUChhcmdzWzBdKSAhPSBJU19PQkpFQ1QpIHsKLSAgICBwaHBfZXJyb3JfZG9jcmVmKE5VTEwgVFNSTUxTX0NDLCBFX0VSUk9SLCAiMXN0IHBhcmFtZXRlciBpcyBub3QgYW4gb2JqZWN0ICh0cmFuc3BvcnQpIik7Ci0gICAgZWZyZWUoYXJncyk7Ci0gICAgUkVUVVJOX05VTEwoKTsKLSAgfQotCi0gIGlmIChaX1RZUEVfUFAoYXJnc1sxXSkgIT0gSVNfU1RSSU5HKSB7Ci0gICAgcGhwX2Vycm9yX2RvY3JlZihOVUxMIFRTUk1MU19DQywgRV9FUlJPUiwgIjJuZCBwYXJhbWV0ZXIgaXMgbm90IGEgc3RyaW5nICh0eXBlbmFtZSBvZiBleHBlY3RlZCByZXNwb25zZSBzdHJ1Y3QpIik7Ci0gICAgZWZyZWUoYXJncyk7Ci0gICAgUkVUVVJOX05VTEwoKTsKKyAgaWYgKHplbmRfcGFyc2VfcGFyYW1ldGVycyhaRU5EX05VTV9BUkdTKCksICJvU2J8bCIsICZwcm90b2NvbCwgJm9ial90eXBlbmFtZSwgJnN0cmljdF9yZWFkLCAmYnVmZmVyX3NpemUpID09IEZBSUxVUkUpIHsKKyAgICByZXR1cm47CiAgIH0KIAogICB0cnkgewotICAgIFBIUElucHV0VHJhbnNwb3J0IHRyYW5zcG9ydCgqYXJnc1swXSk7Ci0gICAgY2hhciogb2JqX3R5cGVuYW1lID0gWl9TVFJWQUxfUFAoYXJnc1sxXSk7Ci0gICAgY29udmVydF90b19ib29sZWFuKCphcmdzWzJdKTsKLSAgICBib29sIHN0cmljdF9yZWFkID0gWl9CVkFMX1BQKGFyZ3NbMl0pOwotICAgIGVmcmVlKGFyZ3MpOwotICAgIGFyZ3MgPSBOVUxMOwotCisgICAgUEhQSW5wdXRUcmFuc3BvcnQgdHJhbnNwb3J0KHByb3RvY29sLCBidWZmZXJfc2l6ZSk7CiAgICAgaW50OF90IG1lc3NhZ2VUeXBlID0gMDsKICAgICBpbnQzMl90IHN6ID0gdHJhbnNwb3J0LnJlYWRJMzIoKTsKIApAQCAtMTA0NywyMyArMTEwNCw2OSBAQAogICAgIH0KIAogICAgIGlmIChtZXNzYWdlVHlwZSA9PSBUX0VYQ0VQVElPTikgewotICAgICAgenZhbCogZXg7Ci0gICAgICBNQUtFX1NURF9aVkFMKGV4KTsKLSAgICAgIGNyZWF0ZU9iamVjdCgiXFxUaHJpZnRcXEV4Y2VwdGlvblxcVEFwcGxpY2F0aW9uRXhjZXB0aW9uIiwgZXgpOwotICAgICAgenZhbCogc3BlYyA9IHplbmRfcmVhZF9zdGF0aWNfcHJvcGVydHkoemVuZF9nZXRfY2xhc3NfZW50cnkoZXggVFNSTUxTX0NDKSwgIl9UU1BFQyIsIDYsIGZhbHNlIFRTUk1MU19DQyk7Ci0gICAgICBiaW5hcnlfZGVzZXJpYWxpemVfc3BlYyhleCwgdHJhbnNwb3J0LCBaX0FSUlZBTF9QKHNwZWMpKTsKLSAgICAgIHRocm93IFBIUEV4Y2VwdGlvbldyYXBwZXIoZXgpOworICAgICAgenZhbCBleDsKKyAgICAgIGNyZWF0ZU9iamVjdCgiXFxUaHJpZnRcXEV4Y2VwdGlvblxcVEFwcGxpY2F0aW9uRXhjZXB0aW9uIiwgJmV4KTsKKyAgICAgIHp2YWwqIHNwZWMgPSB6ZW5kX3JlYWRfc3RhdGljX3Byb3BlcnR5KFpfT0JKQ0UoZXgpLCAiX1RTUEVDIiwgc2l6ZW9mKCJfVFBTRUMiKS0xLCBmYWxzZSk7CisgICAgICBaVkFMX0RFUkVGKHNwZWMpOworICAgICAgaWYgKEVHKGV4Y2VwdGlvbikpIHsKKyAgICAgICAgemVuZF9vYmplY3QgKmV4ID0gRUcoZXhjZXB0aW9uKTsKKyAgICAgICAgRUcoZXhjZXB0aW9uKSA9IG51bGxwdHI7CisgICAgICAgIHRocm93IFBIUEV4Y2VwdGlvbldyYXBwZXIoZXgpOworICAgICAgfQorICAgICAgYmluYXJ5X2Rlc2VyaWFsaXplX3NwZWMoJmV4LCB0cmFuc3BvcnQsIFpfQVJSVkFMX1Aoc3BlYykpOworICAgICAgdGhyb3cgUEhQRXhjZXB0aW9uV3JhcHBlcigmZXgpOwogICAgIH0KIAotICAgIGNyZWF0ZU9iamVjdChvYmpfdHlwZW5hbWUsIHJldHVybl92YWx1ZSk7Ci0gICAgenZhbCogc3BlYyA9IHplbmRfcmVhZF9zdGF0aWNfcHJvcGVydHkoemVuZF9nZXRfY2xhc3NfZW50cnkocmV0dXJuX3ZhbHVlIFRTUk1MU19DQyksICJfVFNQRUMiLCA2LCBmYWxzZSBUU1JNTFNfQ0MpOworICAgIGNyZWF0ZU9iamVjdChaU1RSX1ZBTChvYmpfdHlwZW5hbWUpLCByZXR1cm5fdmFsdWUpOworICAgIHp2YWwqIHNwZWMgPSB6ZW5kX3JlYWRfc3RhdGljX3Byb3BlcnR5KFpfT0JKQ0VfUChyZXR1cm5fdmFsdWUpLCAiX1RTUEVDIiwgc2l6ZW9mKCJfVFNQRUMiKS0xLCB0cnVlKTsKKyAgICBpZiAoc3BlYykgeworICAgICAgWlZBTF9ERVJFRihzcGVjKTsKKyAgICB9CisgICAgaWYgKCFzcGVjIHx8IFpfVFlQRV9QKHNwZWMpICE9IElTX0FSUkFZKSB7CisgICAgICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oIkF0dGVtcHQgZGVzZXJpYWxpemUgdG8gbm9uLVRocmlmdCBvYmplY3QiLCBJTlZBTElEX0RBVEEpOworICAgIH0KICAgICBiaW5hcnlfZGVzZXJpYWxpemVfc3BlYyhyZXR1cm5fdmFsdWUsIHRyYW5zcG9ydCwgWl9BUlJWQUxfUChzcGVjKSk7CiAgIH0gY2F0Y2ggKGNvbnN0IFBIUEV4Y2VwdGlvbldyYXBwZXImIGV4KSB7Ci0gICAgemVuZF90aHJvd19leGNlcHRpb25fb2JqZWN0KGV4IFRTUk1MU19DQyk7CisgICAgLy8gZXggd2lsbCBiZSBkZXN0cnVjdGVkLCBzbyBjb3B5IHRvIGEgenZhbCB0aGF0IHplbmRfdGhyb3dfZXhjZXB0aW9uX29iamVjdCBjYW4gb3duZXJzaGlwIG9mCisgICAgenZhbCBteWV4OworICAgIFpWQUxfQ09QWSgmbXlleCwgZXgpOworICAgIHp2YWxfZHRvcihyZXR1cm5fdmFsdWUpOworICAgIHplbmRfdGhyb3dfZXhjZXB0aW9uX29iamVjdCgmbXlleCk7CiAgICAgUkVUVVJOX05VTEwoKTsKICAgfSBjYXRjaCAoY29uc3Qgc3RkOjpleGNlcHRpb24mIGV4KSB7Ci0gICAgdGhyb3dfemVuZF9leGNlcHRpb25fZnJvbV9zdGRfZXhjZXB0aW9uKGV4IFRTUk1MU19DQyk7CisgICAgdGhyb3dfemVuZF9leGNlcHRpb25fZnJvbV9zdGRfZXhjZXB0aW9uKGV4KTsKICAgICBSRVRVUk5fTlVMTCgpOwogICB9CiB9CiAKKy8vIDQgcGFyYW1zOiAkdHJhbnNwb3J0ICRyZXNwb25zZV9UeXBlbmFtZSAkc3RyaWN0X3JlYWQgJGJ1ZmZlcl9zaXplCitQSFBfRlVOQ1RJT04odGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5X2FmdGVyX21lc3NhZ2VfYmVnaW4pIHsKKyAgenZhbCAqcHJvdG9jb2w7CisgIHplbmRfc3RyaW5nICpvYmpfdHlwZW5hbWU7CisgIHplbmRfYm9vbCBzdHJpY3RfcmVhZDsKKyAgc2l6ZV90IGJ1ZmZlcl9zaXplID0gODE5MjsKKworICBpZiAoemVuZF9wYXJzZV9wYXJhbWV0ZXJzKFpFTkRfTlVNX0FSR1MoKSwgIm9TYnxsIiwgJnByb3RvY29sLCAmb2JqX3R5cGVuYW1lLCAmc3RyaWN0X3JlYWQsICZidWZmZXJfc2l6ZSkgPT0gRkFJTFVSRSkgeworICAgIHJldHVybjsKKyAgfQorCisgIHRyeSB7CisgICAgUEhQSW5wdXRUcmFuc3BvcnQgdHJhbnNwb3J0KHByb3RvY29sLCBidWZmZXJfc2l6ZSk7CisKKyAgICBjcmVhdGVPYmplY3QoWlNUUl9WQUwob2JqX3R5cGVuYW1lKSwgcmV0dXJuX3ZhbHVlKTsKKyAgICB6dmFsKiBzcGVjID0gemVuZF9yZWFkX3N0YXRpY19wcm9wZXJ0eShaX09CSkNFX1AocmV0dXJuX3ZhbHVlKSwgIl9UU1BFQyIsIHNpemVvZigiX1RTUEVDIiktMSwgZmFsc2UpOworICAgIFpWQUxfREVSRUYoc3BlYyk7CisgICAgYmluYXJ5X2Rlc2VyaWFsaXplX3NwZWMocmV0dXJuX3ZhbHVlLCB0cmFuc3BvcnQsIFpfQVJSVkFMX1Aoc3BlYykpOworICB9IGNhdGNoIChjb25zdCBQSFBFeGNlcHRpb25XcmFwcGVyJiBleCkgeworICAgIC8vIGV4IHdpbGwgYmUgZGVzdHJ1Y3RlZCwgc28gY29weSB0byBhIHp2YWwgdGhhdCB6ZW5kX3Rocm93X2V4Y2VwdGlvbl9vYmplY3QgY2FuIHRha2Ugb3duZXJzaGlwIG9mCisgICAgenZhbCBteWV4OworICAgIFpWQUxfQ09QWSgmbXlleCwgZXgpOworICAgIHplbmRfdGhyb3dfZXhjZXB0aW9uX29iamVjdCgmbXlleCk7CisgICAgUkVUVVJOX05VTEwoKTsKKyAgfSBjYXRjaCAoY29uc3Qgc3RkOjpleGNlcHRpb24mIGV4KSB7CisgICAgdGhyb3dfemVuZF9leGNlcHRpb25fZnJvbV9zdGRfZXhjZXB0aW9uKGV4KTsKKyAgICBSRVRVUk5fTlVMTCgpOworICB9Cit9CisKKyNlbmRpZiAvKiBQSFBfVkVSU0lPTl9JRCA+PSA3MDAwMCAqLwpkaWZmIC0tZ2l0IGEvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9waHBfdGhyaWZ0X3Byb3RvY29sLmggYi9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL3BocF90aHJpZnRfcHJvdG9jb2wuaAppbmRleCA0NGQwM2NjLi4wNDIwOTk3IDEwMDY0NAotLS0gYS9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL3BocF90aHJpZnRfcHJvdG9jb2wuaAorKysgYi9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL3BocF90aHJpZnRfcHJvdG9jb2wuaApAQCAtMjEsNiArMjEsNyBAQAogCiBQSFBfRlVOQ1RJT04odGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSk7CiBQSFBfRlVOQ1RJT04odGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5KTsKK1BIUF9GVU5DVElPTih0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnlfYWZ0ZXJfbWVzc2FnZV9iZWdpbik7CiAKIGV4dGVybiB6ZW5kX21vZHVsZV9lbnRyeSB0aHJpZnRfcHJvdG9jb2xfbW9kdWxlX2VudHJ5OwogI2RlZmluZSBwaHBleHRfdGhyaWZ0X3Byb3RvY29sX3B0ciAmdGhyaWZ0X3Byb3RvY29sX21vZHVsZV9lbnRyeQpkaWZmIC0tZ2l0IGEvbGliL3BocC90ZXN0L0ZpeHR1cmVzLnBocCBiL2xpYi9waHAvdGVzdC9GaXh0dXJlcy5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ1N2Q4MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvdGVzdC9GaXh0dXJlcy5waHAKQEAgLTAsMCArMSwxOTQgQEAKKzw/cGhwCisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRlc3QKKyAqLworCituYW1lc3BhY2UgVGVzdFxUaHJpZnQ7CisKK3VzZSBUaHJpZnRUZXN0XFh0cnVjdDsKK3VzZSBUaHJpZnRUZXN0XFh0cnVjdDI7Cit1c2UgVGhyaWZ0VGVzdFxOdW1iZXJ6OwordXNlIFRocmlmdFRlc3RcSW5zYW5pdHk7CisKK2NsYXNzIEZpeHR1cmVzCit7CisgICAgcHVibGljIHN0YXRpYyAkYnVmc2l6ZSA9IDgxOTI7IC8vYmlnIGVub3VnaCB0byByZWFkIGJpZ2dlc3Qgc2VyaWFsaXplZCBGaXh0dXJlIGFyZy4KKyAgICBwdWJsaWMgc3RhdGljICR0ZXN0QXJncyA9IGFycmF5KCk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHBvcHVsYXRlVGVzdEFyZ3MoKQorICAgIHsKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nMSddID0gIkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvbsOpcywg2KfZhNi52LHYqNmK2KksINmF2LXYsdmJLCBBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXrJmXJiYXljYW4sINCR0LDRiNKh0L7RgNGCLCBCb2FyaXNjaCwgxb1lbWFpdMSXxaFrYSwg0JHQtdC70LDRgNGD0YHQutCw0Y8sINCR0LXQu9Cw0YDRg9GB0LrQsNGPICjRgtCw0YDQsNGI0LrQtdCy0ZbRhtCwKSwg0JHRitC70LPQsNGA0YHQutC4LCBCYW1hbmFua2FuLCDgpqzgpr7gpoLgprLgpr4sIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsw6AsIE3DrG5nLWTElcykbmctbmfhubPMhCwg0J3QvtGF0YfQuNC50L0sIENlYnVhbm8sIOGPo+GOs+GOqSwgxIxlc2t5LCDQodC70L7QstGjzIHQvdGM0YHQutGKIC8g4rCU4rCO4rCR4rCC4rCh4rCQ4rCg4rCU4rCN4rCfLCDQp9OR0LLQsNGI0LvQsCwgQ3ltcmFlZywgRGFuc2ssIFphemFraSwg3oveqN6I3qzegN6o3oTept6Q3rAsIM6VzrvOu863zr3Ouc66zqwsIEVtaWxpw6BuIGUgcnVtYWduw7JsLCBFbmdsaXNoLCBFc3BlcmFudG8sIEVzcGHDsW9sLCBFZXN0aSwgRXVza2FyYSwg2YHYp9ix2LPbjCwgU3VvbWksIFbDtXJvLCBGw7hyb3lza3QsIEZyYW7Dp2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwg6LSb6KqeLCBHw6BpZGhsaWcsIEdhbGVnbywgQXZhw7FlJ+G6vSwg4KqX4KuB4Kqc4Kqw4Kq+4Kqk4KuALCBHYWVsZywg16LXkdeo15nXqiwg4KS54KS/4KSo4KWN4KSm4KWALCBGaWppIEhpbmRpLCBIcnZhdHNraSwgS3JlecOybCBheWlzeWVuLCBNYWd5YXIsINWA1aHVtdWl1oDVpdW2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwgSWxva2FubywgSWRvLCDDjXNsZW5za2EsIEl0YWxpYW5vLCDml6XmnKzoqp4sIExvamJhbiwgQmFzYSBKYXdhLCDhg6Xhg5Dhg6Dhg5fhg6Phg5rhg5gsIEtvbmdvLCBLYWxhYWxsaXN1dCwg4LKV4LKo4LON4LKo4LKhLCDtlZzqta3slrQsINCa0YrQsNGA0LDRh9Cw0Lkt0JzQsNC70LrRitCw0YAsIFJpcG9hcmlzY2gsIEt1cmTDriwg0JrQvtC80LgsIEtlcm5ld2VrLCDQmtGL0YDQs9GL0LfRh9CwLCBMYXRpbmEsIExhZGlubywgTMOrdHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ8OhbGEsIOC6peC6suC6pywgTGlldHV2acWzLCBMYXR2aWXFoXUsIEJhc2EgQmFueXVtYXNhbiwgTWFsYWdhc3ksINCc0LDQutC10LTQvtC90YHQutC4LCDgtK7gtLLgtK/gtL7gtLPgtIIsIOCkruCksOCkvuCkoOClgCwgQmFoYXNhIE1lbGF5dSwg2YXYp9iy2ZDYsdmI2YbbjCwgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIOCkqOClh+CkquCkvuCksiDgpK3gpL7gpLfgpL4sIE5lZGVybGFuZHMsIOKAqk5vcnNrIChueW5vcnNrKeKArCwg4oCqTm9yc2sgKGJva23DpWwp4oCsLCBOb3Vvcm1hbmQsIERpbsOpIGJpemFhZCwgT2NjaXRhbiwg0JjRgNC+0L3QsNGDLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBOb3JmdWsgLyBQaXRrZXJuLCBQb2xza2ksINm+2YbYrNin2KjbjCwg2b7amtiq2YgsIFBvcnR1Z3XDqnMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbcOibsSDLCDQoNGD0YHRgdC60LjQuSwg0KHQsNGF0LAg0YLRi9C70LAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTw6FtZWdpZWxsYSwgU2ltcGxlIEVuZ2xpc2gsIFNsb3ZlbsSNaW5hLCBTbG92ZW7FocSNaW5hLCDQodGA0L/RgdC60LggLyBTcnBza2ksIFNlZWx0ZXJzaywgU3ZlbnNrYSwgS2lzd2FoaWxpLCDgrqTgrq7grr/grrTgr40sIOCwpOCxhuCwsuCxgeCwl+CxgSwg0KLQvtK30LjQutOjLCDguYTguJfguKIsIFTDvHJrbWVuw6dlLCBUYWdhbG9nLCBUw7xya8OnZSwg0KLQsNGC0LDRgNGH0LAvVGF0YXLDp2EsINCj0LrRgNCw0ZfQvdGB0YzQutCwLCDYp9ix2K/ZiCwgVGnhur9uZyBWaeG7h3QsIFZvbGFww7xrLCBXYWxvbiwgV2luYXJheSwg5ZC06K+tLCBpc2lYaG9zYSwg15nXmda015PXmdepLCBZb3LDuWLDoSwgWmXDqnV3cywg5Lit5paHLCBCw6JuLWzDom0tZ8O6LCDnsrXoqp4iOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdFN0cmluZzInXSA9CisgICAgICAgICAgICAicXVvdGU6IFxcXCIgYmFja3NsYXNoOiIgLgorICAgICAgICAgICAgIiBmb3J3YXJkc2xhc2gtZXNjYXBlZDogXFwvICIgLgorICAgICAgICAgICAgIiBiYWNrc3BhY2U6IFxiIGZvcm1mZWVkOiBcZiBuZXdsaW5lOiBcbiByZXR1cm46IFxyIHRhYjogIiAuCisgICAgICAgICAgICAiIG5vdy1hbGwtb2YtdGhlbS10b2dldGhlcjogXCJcXFwvXGJcblxyXHQiIC4KKyAgICAgICAgICAgICIgbm93LWEtYnVuY2gtb2YtanVuazogIUAjXCQlJigpKCYlJCN7fXt9PD48PjwiOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdFN0cmluZzMnXSA9CisgICAgICAgICAgICAic3RyaW5nIHRoYXQgZW5kcyBpbiBkb3VibGUtYmFja3NsYXNoIFxcXFwiOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdFVuaWNvZGVTdHJpbmdXaXRoTm9uQk1QJ10gPQorICAgICAgICAgICAgIuC4quC4p+C4seC4quC4lOC4tS/wnZKvIjsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3REb3VibGUnXSA9IDMuMTQxNTkyNjUzNTg5ODsKKworICAgICAgICAvLyBUT0RPOiBhZGQgdGVzdEJpbmFyeSgpIGNhbGwKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RCeXRlJ10gPSAweDAxOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdEkzMiddID0gcG93KDIsIDMwKTsKKworICAgICAgICBpZiAoUEhQX0lOVF9TSVpFID09IDgpIHsKKyAgICAgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdEk2NCddID0gcG93KDIsIDYwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdEk2NCddID0gIjExNTI5MjE1MDQ2MDY4NDcwMDAiOworICAgICAgICB9CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0U3RydWN0J10gPQorICAgICAgICAgICAgbmV3IFh0cnVjdCgKKyAgICAgICAgICAgICAgICBhcnJheSgKKyAgICAgICAgICAgICAgICAgICAgJ3N0cmluZ190aGluZycgPT4gJ3dvcmtlZCcsCisgICAgICAgICAgICAgICAgICAgICdieXRlX3RoaW5nJyA9PiAweDAxLAorICAgICAgICAgICAgICAgICAgICAnaTMyX3RoaW5nJyA9PiBwb3coMiwgMzApLAorICAgICAgICAgICAgICAgICAgICAnaTY0X3RoaW5nJyA9PiBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RJNjQnXQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0TmVzdE5lc3RlZCddID0KKyAgICAgICAgICAgIG5ldyBYdHJ1Y3QoCisgICAgICAgICAgICAgICAgYXJyYXkoCisgICAgICAgICAgICAgICAgICAgICdzdHJpbmdfdGhpbmcnID0+ICd3b3JrZWQnLAorICAgICAgICAgICAgICAgICAgICAnYnl0ZV90aGluZycgPT4gMHgwMSwKKyAgICAgICAgICAgICAgICAgICAgJ2kzMl90aGluZycgPT4gcG93KDIsIDMwKSwKKyAgICAgICAgICAgICAgICAgICAgJ2k2NF90aGluZycgPT4gc2VsZjo6JHRlc3RBcmdzWyd0ZXN0STY0J10KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICApOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdE5lc3QnXSA9CisgICAgICAgICAgICBuZXcgWHRydWN0MigKKyAgICAgICAgICAgICAgICBhcnJheSgKKyAgICAgICAgICAgICAgICAgICAgJ2J5dGVfdGhpbmcnID0+IDB4MDEsCisgICAgICAgICAgICAgICAgICAgICdzdHJ1Y3RfdGhpbmcnID0+IHNlbGY6OiR0ZXN0QXJnc1sndGVzdE5lc3ROZXN0ZWQnXSwKKyAgICAgICAgICAgICAgICAgICAgJ2kzMl90aGluZycgPT4gcG93KDIsIDE1KQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0TWFwJ10gPQorICAgICAgICAgICAgYXJyYXkoCisgICAgICAgICAgICAgICAgNyA9PiA3NywKKyAgICAgICAgICAgICAgICA4ID0+IDg4LAorICAgICAgICAgICAgICAgIDkgPT4gOTkKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nTWFwJ10gPQorICAgICAgICAgICAgYXJyYXkoCisgICAgICAgICAgICAgICAgImEiID0+ICIxMjMiLAorICAgICAgICAgICAgICAgICJhIGIiID0+ICJ3aXRoIHNwYWNlcyAiLAorICAgICAgICAgICAgICAgICJzYW1lIiA9PiAic2FtZSIsCisgICAgICAgICAgICAgICAgIjAiID0+ICJudW1lcmljIGtleSIsCisgICAgICAgICAgICAgICAgImxvbmdWYWx1ZSIgPT4gc2VsZjo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nMSddLAorICAgICAgICAgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdFN0cmluZzEnXSA9PiAibG9uZyBrZXkiCisgICAgICAgICAgICApOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdFNldCddID0gYXJyYXkoMSA9PiB0cnVlLCA1ID0+IHRydWUsIDYgPT4gdHJ1ZSk7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0TGlzdCddID0gYXJyYXkoMSwgMiwgMyk7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0RW51bSddID0gTnVtYmVyejo6T05FOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdFR5cGVkZWYnXSA9IDY5OworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdE1hcE1hcEV4cGVjdGVkUmVzdWx0J10gPQorICAgICAgICAgICAgYXJyYXkoCisgICAgICAgICAgICAgICAgNCA9PiBhcnJheSgKKyAgICAgICAgICAgICAgICAgICAgMSA9PiAxLAorICAgICAgICAgICAgICAgICAgICAyID0+IDIsCisgICAgICAgICAgICAgICAgICAgIDMgPT4gMywKKyAgICAgICAgICAgICAgICAgICAgNCA9PiA0LAorICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgLTQgPT4gYXJyYXkoCisgICAgICAgICAgICAgICAgICAgIC00ID0+IC00LAorICAgICAgICAgICAgICAgICAgICAtMyA9PiAtMywKKyAgICAgICAgICAgICAgICAgICAgLTIgPT4gLTIsCisgICAgICAgICAgICAgICAgICAgIC0xID0+IC0xCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgKTsKKworICAgICAgICAvLyB0ZXN0SW5zYW5pdHkgLi4uIHRha2VzIGEgZmV3IHN0ZXBzIHRvIHNldCB1cCEKKworICAgICAgICAkeHRydWN0MSA9CisgICAgICAgICAgICBuZXcgWHRydWN0KAorICAgICAgICAgICAgICAgIGFycmF5KAorICAgICAgICAgICAgICAgICAgICAnc3RyaW5nX3RoaW5nJyA9PiAnR29vZGJ5ZTQnLAorICAgICAgICAgICAgICAgICAgICAnYnl0ZV90aGluZycgPT4gNCwKKyAgICAgICAgICAgICAgICAgICAgJ2kzMl90aGluZycgPT4gNCwKKyAgICAgICAgICAgICAgICAgICAgJ2k2NF90aGluZycgPT4gNAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgJHh0cnVjdDIgPQorICAgICAgICAgICAgbmV3IFh0cnVjdCgKKyAgICAgICAgICAgICAgICBhcnJheSgKKyAgICAgICAgICAgICAgICAgICAgJ3N0cmluZ190aGluZycgPT4gJ0hlbGxvMicsCisgICAgICAgICAgICAgICAgICAgICdieXRlX3RoaW5nJyA9PiAyLAorICAgICAgICAgICAgICAgICAgICAnaTMyX3RoaW5nJyA9PiAyLAorICAgICAgICAgICAgICAgICAgICAnaTY0X3RoaW5nJyA9PiAyCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgKTsKKworICAgICAgICAkdXNlck1hcCA9CisgICAgICAgICAgICBhcnJheSgKKyAgICAgICAgICAgICAgICBOdW1iZXJ6OjpGSVZFID0+IDUsCisgICAgICAgICAgICAgICAgTnVtYmVyejo6RUlHSFQgPT4gOAorICAgICAgICAgICAgKTsKKworICAgICAgICAkaW5zYW5pdHkyID0KKyAgICAgICAgICAgIG5ldyBJbnNhbml0eSgKKyAgICAgICAgICAgICAgICBhcnJheSgKKyAgICAgICAgICAgICAgICAgICAgJ3VzZXJNYXAnID0+ICR1c2VyTWFwLAorICAgICAgICAgICAgICAgICAgICAneHRydWN0cycgPT4gYXJyYXkoJHh0cnVjdDEsICR4dHJ1Y3QyKQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgJGluc2FuaXR5MyA9ICRpbnNhbml0eTI7CisKKyAgICAgICAgJGluc2FuaXR5NiA9CisgICAgICAgICAgICBuZXcgSW5zYW5pdHkoCisgICAgICAgICAgICAgICAgYXJyYXkoCisgICAgICAgICAgICAgICAgICAgICd1c2VyTWFwJyA9PiBudWxsLAorICAgICAgICAgICAgICAgICAgICAneHRydWN0cycgPT4gbnVsbAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0SW5zYW5pdHlFeHBlY3RlZFJlc3VsdCddID0KKyAgICAgICAgICAgIGFycmF5KAorICAgICAgICAgICAgICAgICIxIiA9PiBhcnJheSgKKyAgICAgICAgICAgICAgICAgICAgTnVtYmVyejo6VFdPID0+ICRpbnNhbml0eTIsCisgICAgICAgICAgICAgICAgICAgIE51bWJlcno6OlRIUkVFID0+ICRpbnNhbml0eTMKKyAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICAgICIyIiA9PiBhcnJheSgKKyAgICAgICAgICAgICAgICAgICAgTnVtYmVyejo6U0lYID0+ICRpbnNhbml0eTYKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvdGVzdC9Kc29uU2VyaWFsaXplL0pzb25TZXJpYWxpemVUZXN0LnBocCBiL2xpYi9waHAvdGVzdC9Kc29uU2VyaWFsaXplL0pzb25TZXJpYWxpemVUZXN0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjY4NjUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC90ZXN0L0pzb25TZXJpYWxpemUvSnNvblNlcmlhbGl6ZVRlc3QucGhwCkBAIC0wLDAgKzEsMTE2IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCituYW1lc3BhY2UgVGVzdFxUaHJpZnRcSnNvblNlcmlhbGl6ZTsKKwordXNlIFBIUFVuaXRcRnJhbWV3b3JrXFRlc3RDYXNlOwordXNlIHN0ZENsYXNzOworCityZXF1aXJlIF9fRElSX18gLiAnLy4uLy4uLy4uLy4uL3ZlbmRvci9hdXRvbG9hZC5waHAnOworCisvKioKKyAqIEBydW5UZXN0c0luU2VwYXJhdGVQcm9jZXNzZXMKKyAqLworY2xhc3MgSnNvblNlcmlhbGl6ZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZQoreworICAgIHByb3RlY3RlZCBmdW5jdGlvbiBzZXRVcCgpCisgICAgeworICAgICAgICBpZiAodmVyc2lvbl9jb21wYXJlKHBocHZlcnNpb24oKSwgJzUuNCcsICc8JykpIHsKKyAgICAgICAgICAgICR0aGlzLT5tYXJrVGVzdFNraXBwZWQoJ1JlcXVpcmVzIFBIUCA1LjQgb3IgbmV3ZXIhJyk7CisgICAgICAgIH0KKyAgICAgICAgLyoqIEB2YXIgXENvbXBvc2VyXEF1dG9sb2FkXENsYXNzTG9hZGVyICRsb2FkZXIgKi8KKyAgICAgICAgJGxvYWRlciA9IHJlcXVpcmUgX19ESVJfXyAuICcvLi4vLi4vLi4vLi4vdmVuZG9yL2F1dG9sb2FkLnBocCc7CisgICAgICAgICRsb2FkZXItPmFkZFBzcjQoJycsIF9fRElSX18gLiAnLy4uL3BhY2thZ2VzL3BocGpzJyk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RFbXB0eVN0cnVjdCgpCisgICAgeworICAgICAgICAkZW1wdHkgPSBuZXcgXFRocmlmdFRlc3RcRW1wdHlTdHJ1Y3QoYXJyYXkoJ25vbl9leGlzdGluZ19rZXknID0+ICdiYXInKSk7CisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMobmV3IHN0ZENsYXNzKCksIGpzb25fZGVjb2RlKGpzb25fZW5jb2RlKCRlbXB0eSkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cmluZ3NBbmRJbnRzKCkKKyAgICB7CisgICAgICAgICRpbnB1dCA9IGFycmF5KAorICAgICAgICAgICAgJ3N0cmluZ190aGluZycgPT4gJ2ZvbycsCisgICAgICAgICAgICAnaTY0X3RoaW5nJyA9PiAxMjM0NTY3ODkwLAorICAgICAgICApOworICAgICAgICAkeHRydWN0ID0gbmV3IFxUaHJpZnRUZXN0XFh0cnVjdCgkaW5wdXQpOworCisgICAgICAgIC8vIFh0cnVjdCdzICdpMzJfdGhpbmcnIGFuZCAnYnl0ZV90aGluZycgZmllbGRzIHNob3VsZCBub3QgYmUgcHJlc2VudCBoZXJlIQorICAgICAgICAkZXhwZWN0ZWQgPSBuZXcgc3RkQ2xhc3MoKTsKKyAgICAgICAgJGV4cGVjdGVkLT5zdHJpbmdfdGhpbmcgPSAkaW5wdXRbJ3N0cmluZ190aGluZyddOworICAgICAgICAkZXhwZWN0ZWQtPmk2NF90aGluZyA9ICRpbnB1dFsnaTY0X3RoaW5nJ107CisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCBqc29uX2RlY29kZShqc29uX2VuY29kZSgkeHRydWN0KSkpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TmVzdGVkU3RydWN0cygpCisgICAgeworICAgICAgICAkeHRydWN0MiA9IG5ldyBcVGhyaWZ0VGVzdFxYdHJ1Y3QyKGFycmF5KAorICAgICAgICAgICAgJ2J5dGVfdGhpbmcnID0+IDQyLAorICAgICAgICAgICAgJ3N0cnVjdF90aGluZycgPT4gbmV3IFxUaHJpZnRUZXN0XFh0cnVjdChhcnJheSgKKyAgICAgICAgICAgICAgICAnaTMyX3RoaW5nJyA9PiAxMjM0NTYsCisgICAgICAgICAgICApKSwKKyAgICAgICAgKSk7CisKKyAgICAgICAgJGV4cGVjdGVkID0gbmV3IHN0ZENsYXNzKCk7CisgICAgICAgICRleHBlY3RlZC0+Ynl0ZV90aGluZyA9ICR4dHJ1Y3QyLT5ieXRlX3RoaW5nOworICAgICAgICAkZXhwZWN0ZWQtPnN0cnVjdF90aGluZyA9IG5ldyBzdGRDbGFzcygpOworICAgICAgICAkZXhwZWN0ZWQtPnN0cnVjdF90aGluZy0+aTMyX3RoaW5nID0gJHh0cnVjdDItPnN0cnVjdF90aGluZy0+aTMyX3RoaW5nOworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwganNvbl9kZWNvZGUoanNvbl9lbmNvZGUoJHh0cnVjdDIpKSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RJbnNhbml0eSgpCisgICAgeworICAgICAgICAkeGlucHV0ID0gYXJyYXkoJ3N0cmluZ190aGluZycgPT4gJ2ZvbycpOworICAgICAgICAkeHRydWN0ID0gbmV3IFxUaHJpZnRUZXN0XFh0cnVjdCgkeGlucHV0KTsKKyAgICAgICAgJGluc2FuaXR5ID0gbmV3IFxUaHJpZnRUZXN0XEluc2FuaXR5KGFycmF5KAorICAgICAgICAgICAgJ3h0cnVjdHMnID0+IGFycmF5KCR4dHJ1Y3QsICR4dHJ1Y3QsICR4dHJ1Y3QpCisgICAgICAgICkpOworICAgICAgICAkZXhwZWN0ZWQgPSBuZXcgc3RkQ2xhc3MoKTsKKyAgICAgICAgJGV4cGVjdGVkLT54dHJ1Y3RzID0gYXJyYXkoKG9iamVjdCkkeGlucHV0LCAob2JqZWN0KSR4aW5wdXQsIChvYmplY3QpJHhpbnB1dCk7CisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCBqc29uX2RlY29kZShqc29uX2VuY29kZSgkaW5zYW5pdHkpKSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3ROZXN0ZWRMaXN0cygpCisgICAgeworICAgICAgICAkYm9uayA9IG5ldyBcVGhyaWZ0VGVzdFxCb25rKGFycmF5KCdtZXNzYWdlJyA9PiAnZm9vJykpOworICAgICAgICAkbmVzdGVkID0gbmV3IFxUaHJpZnRUZXN0XE5lc3RlZExpc3RzQm9uayhhcnJheSgnYm9uaycgPT4gYXJyYXkoYXJyYXkoYXJyYXkoJGJvbmspKSkpKTsKKyAgICAgICAgJGV4cGVjdGVkID0gbmV3IHN0ZENsYXNzKCk7CisgICAgICAgICRleHBlY3RlZC0+Ym9uayA9IGFycmF5KGFycmF5KGFycmF5KChvYmplY3QpYXJyYXkoJ21lc3NhZ2UnID0+ICdmb28nKSkpKTsKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsIGpzb25fZGVjb2RlKGpzb25fZW5jb2RlKCRuZXN0ZWQpKSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RNYXBzKCkKKyAgICB7CisgICAgICAgICRpbnRtYXAgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0TWFwX2FyZ3MoWyd0aGluZycgPT4gWzAgPT4gJ3plcm8nXV0pOworICAgICAgICAkZW1wdHltYXAgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0TWFwX2FyZ3MoW10pOworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCd7InRoaW5nIjp7IjAiOiJ6ZXJvIn19JywganNvbl9lbmNvZGUoJGludG1hcCkpOworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCd7fScsIGpzb25fZW5jb2RlKCRlbXB0eW1hcCkpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U2NhbGFyVHlwZXMoKQorICAgIHsKKyAgICAgICAgJGIgPSBuZXcgXFRocmlmdFRlc3RcQm9vbHMoWydpbV90cnVlJyA9PiAnMScsICdpbV9mYWxzZScgPT4gJzAnXSk7CisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJ3siaW1fdHJ1ZSI6dHJ1ZSwiaW1fZmFsc2UiOmZhbHNlfScsIGpzb25fZW5jb2RlKCRiKSk7CisgICAgICAgICRzID0gbmV3IFxUaHJpZnRUZXN0XFN0cnVjdEEoWydzJyA9PiA0Ml0pOworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCd7InMiOiI0MiJ9JywganNvbl9lbmNvZGUoJHMpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL3Rlc3QvTWFrZWZpbGUuYW0gYi9saWIvcGhwL3Rlc3QvTWFrZWZpbGUuYW0KaW5kZXggNmU5YTI3Yy4uNDgyNDY4OCAxMDA3NTUKLS0tIGEvbGliL3BocC90ZXN0L01ha2VmaWxlLmFtCisrKyBiL2xpYi9waHAvdGVzdC9NYWtlZmlsZS5hbQpAQCAtMTcsMTEgKzE3LDExIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1USFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAorUEhQVU5JVD1waHAgJCh0b3Bfc3JjZGlyKS92ZW5kb3IvYmluL3BocHVuaXQKIAogc3R1YnM6IC4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQgIFRlc3RWYWxpZGF0b3JzLnRocmlmdAotCW1rZGlyIC1wIC4vcGFja2FnZXMKLQkkKFRIUklGVCkgLS1nZW4gcGhwIC1yIC0tb3V0IC4vcGFja2FnZXMgLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorCW1rZGlyIC1wIC4vcGFja2FnZXMvcGhwCisJJChUSFJJRlQpIC0tZ2VuIHBocCAtciAtLW91dCAuL3BhY2thZ2VzL3BocCAuLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CiAJbWtkaXIgLXAgLi9wYWNrYWdlcy9waHB2CiAJbWtkaXIgLXAgLi9wYWNrYWdlcy9waHB2bwogCW1rZGlyIC1wIC4vcGFja2FnZXMvcGhwanMKQEAgLTI5LDIyICsyOSwyMSBAQAogCSQoVEhSSUZUKSAtLWdlbiBwaHA6dmFsaWRhdGUsb29wIC1yIC0tb3V0IC4vcGFja2FnZXMvcGhwdm8gIFRlc3RWYWxpZGF0b3JzLnRocmlmdAogCSQoVEhSSUZUKSAtLWdlbiBwaHA6anNvbiAgICAgICAgIC1yIC0tb3V0IC4vcGFja2FnZXMvcGhwanMgIFRlc3RWYWxpZGF0b3JzLnRocmlmdAogCi1jaGVjay1qc29uLXNlcmlhbGl6ZXI6IHN0dWJzCi1pZiBIQVZFX1BIUFVOSVQKLQkkKFBIUFVOSVQpIC0tbG9nLWp1bml0PVRFU1QtanNvbi1zZXJpYWxpemVyLnhtbCBUZXN0L1RocmlmdC9Kc29uU2VyaWFsaXplLwotZW5kaWYKK2RlcHM6ICQodG9wX3NyY2RpcikvY29tcG9zZXIuanNvbgorCWNvbXBvc2VyIGluc3RhbGwgLS13b3JraW5nLWRpcj0kKHRvcF9zcmNkaXIpCiAKLWNoZWNrLXZhbGlkYXRvcjogc3R1YnMKLQlwaHAgVGVzdC9UaHJpZnQvVGVzdFZhbGlkYXRvcnMucGhwCi0JcGhwIFRlc3QvVGhyaWZ0L1Rlc3RWYWxpZGF0b3JzLnBocCAtb29wCithbGwtbG9jYWw6IGRlcHMKIAotY2hlY2stcHJvdG9jb2w6CXN0dWJzCi1pZiBIQVZFX1BIUFVOSVQKLQkkKFBIUFVOSVQpIC0tbG9nLWp1bml0PVRFU1QtbG9nLWpzb24tcHJvdG9jb2wueG1sIFRlc3QvVGhyaWZ0L1Byb3RvY29sL1Rlc3RUSlNPTlByb3RvY29sLnBocAotCSQoUEhQVU5JVCkgLS1sb2ctanVuaXQ9VEVTVC1iaW5hcnktc2VyaWFsaXplci54bWwgVGVzdC9UaHJpZnQvUHJvdG9jb2wvVGVzdEJpbmFyeVNlcmlhbGl6ZXIucGhwCi1lbmRpZgorY2hlY2stanNvbi1zZXJpYWxpemVyOiBkZXBzIHN0dWJzCisJJChQSFBVTklUKSAtLWxvZy1qdW5pdD1URVNULWxvZy1qc29uLXNlcmlhbGl6ZXIueG1sIEpzb25TZXJpYWxpemUvCiAKLWNoZWNrOiBzdHVicyBcCitjaGVjay12YWxpZGF0b3I6IGRlcHMgc3R1YnMKKwkkKFBIUFVOSVQpIC0tbG9nLWp1bml0PVRFU1QtbG9nLXZhbGlkYXRvci54bWwgVmFsaWRhdG9yLworCitjaGVjay1wcm90b2NvbDoJZGVwcyBzdHVicworCSQoUEhQVU5JVCkgLS1sb2ctanVuaXQ9VEVTVC1sb2ctcHJvdG9jb2wueG1sIFByb3RvY29sLworCitjaGVjazogZGVwcyBzdHVicyBcCiAgIGNoZWNrLXByb3RvY29sIFwKICAgY2hlY2stdmFsaWRhdG9yIFwKICAgY2hlY2stanNvbi1zZXJpYWxpemVyCkBAIC01Miw5ICs1MSwzIEBACiBjbGVhbi1sb2NhbDoKIAkkKFJNKSAtciAuL3BhY2thZ2VzCiAJJChSTSkgVEVTVC0qLnhtbAotCi1FWFRSQV9ESVNUID0gXAotCVRlc3QgXAotCVRlc3RWYWxpZGF0b3JzLnRocmlmdAotCi0KZGlmZiAtLWdpdCBhL2xpYi9waHAvdGVzdC9Qcm90b2NvbC9CaW5hcnlTZXJpYWxpemVyVGVzdC5waHAgYi9saWIvcGhwL3Rlc3QvUHJvdG9jb2wvQmluYXJ5U2VyaWFsaXplclRlc3QucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxYjBiYjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL3Rlc3QvUHJvdG9jb2wvQmluYXJ5U2VyaWFsaXplclRlc3QucGhwCkBAIC0wLDAgKzEsNjAgQEAKKzw/cGhwCisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRlc3QKKyAqLworCituYW1lc3BhY2UgVGVzdFxUaHJpZnRcUHJvdG9jb2w7CisKK3VzZSBQSFBVbml0XEZyYW1ld29ya1xUZXN0Q2FzZTsKK3VzZSBUaHJpZnRcU2VyaWFsaXplclxUQmluYXJ5U2VyaWFsaXplcjsKKworcmVxdWlyZSBfX0RJUl9fIC4gJy8uLi8uLi8uLi8uLi92ZW5kb3IvYXV0b2xvYWQucGhwJzsKKworLyoqKgorICogVGhpcyB0ZXN0IHN1aXRlIGRlcGVuZHMgb24gcnVubmluZyB0aGUgY29tcGlsZXIgYWdhaW5zdCB0aGUKKyAqIHN0YW5kYXJkIFRocmlmdFRlc3QudGhyaWZ0IGZpbGU6CisgKgorICogbGliL3BocC90ZXN0JCAuLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC0tZ2VuIHBocCAtciBcCisgKiAgIC0tb3V0IC4vcGFja2FnZXMgLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorICoKKyAqIEBydW5UZXN0c0luU2VwYXJhdGVQcm9jZXNzZXMKKyAqLworY2xhc3MgQmluYXJ5U2VyaWFsaXplclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZQoreworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRVcCgpCisgICAgeworICAgICAgICAvKiogQHZhciBcQ29tcG9zZXJcQXV0b2xvYWRcQ2xhc3NMb2FkZXIgJGxvYWRlciAqLworICAgICAgICAkbG9hZGVyID0gcmVxdWlyZSBfX0RJUl9fIC4gJy8uLi8uLi8uLi8uLi92ZW5kb3IvYXV0b2xvYWQucGhwJzsKKyAgICAgICAgJGxvYWRlci0+YWRkUHNyNCgnJywgX19ESVJfXyAuICcvLi4vcGFja2FnZXMvcGhwJyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2UgdHJ5IHRvIHNlcmlhbGl6ZSBhbmQgZGVzZXJpYWxpemUgYSByYW5kb20gb2JqZWN0IHRvIG1ha2Ugc3VyZSBubyBleGNlcHRpb25zIGFyZSB0aHJvd24uCisgICAgICogQHNlZSBUSFJJRlQtMTU3OQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0QmluYXJ5U2VyaWFsaXplcigpCisgICAgeworICAgICAgICAkc3RydWN0ID0gbmV3IFxUaHJpZnRUZXN0XFh0cnVjdChhcnJheSgnc3RyaW5nX3RoaW5nJyA9PiAnYWJjJykpOworICAgICAgICAkc2VyaWFsaXplZCA9IFRCaW5hcnlTZXJpYWxpemVyOjpzZXJpYWxpemUoJHN0cnVjdCwgJ1RocmlmdFRlc3RcXFh0cnVjdCcpOworICAgICAgICAkZGVzZXJpYWxpemVkID0gVEJpbmFyeVNlcmlhbGl6ZXI6OmRlc2VyaWFsaXplKCRzZXJpYWxpemVkLCAnVGhyaWZ0VGVzdFxcWHRydWN0Jyk7CisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJHN0cnVjdCwgJGRlc2VyaWFsaXplZCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC90ZXN0L1Byb3RvY29sL1RKU09OUHJvdG9jb2xGaXh0dXJlcy5waHAgYi9saWIvcGhwL3Rlc3QvUHJvdG9jb2wvVEpTT05Qcm90b2NvbEZpeHR1cmVzLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDkwMzlmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC90ZXN0L1Byb3RvY29sL1RKU09OUHJvdG9jb2xGaXh0dXJlcy5waHAKQEAgLTAsMCArMSw3NCBAQAorPD9waHAKKworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudGVzdAorICovCisKK25hbWVzcGFjZSBUZXN0XFRocmlmdFxQcm90b2NvbDsKKworY2xhc3MgVEpTT05Qcm90b2NvbEZpeHR1cmVzCit7CisgICAgcHVibGljIHN0YXRpYyAkdGVzdEFyZ3NKU09OID0gYXJyYXkoKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcG9wdWxhdGVUZXN0QXJnc0pTT04oKQorICAgIHsKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFZvaWQnXSA9ICd7fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZzEnXSA9ICd7IjEiOnsic3RyIjoiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uw6lzLCDYp9mE2LnYsdio2YrYqSwg2YXYtdix2YksIEFzdHVyaWFudSwgQXltYXIgYXJ1LCBBesmZcmJheWNhbiwg0JHQsNGI0qHQvtGA0YIsIEJvYXJpc2NoLCDFvWVtYWl0xJfFoWthLCDQkdC10LvQsNGA0YPRgdC60LDRjywg0JHQtdC70LDRgNGD0YHQutCw0Y8gKNGC0LDRgNCw0YjQutC10LLRltGG0LApLCDQkdGK0LvQs9Cw0YDRgdC60LgsIEJhbWFuYW5rYW4sIOCmrOCmvuCmguCmsuCmviwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWzDoCwgTcOsbmctZMSVzKRuZy1uZ+G5s8yELCDQndC+0YXRh9C40LnQvSwgQ2VidWFubywg4Y+j4Y6z4Y6pLCDEjGVza3ksINCh0LvQvtCy0aPMgdC90YzRgdC60YogXC8g4rCU4rCO4rCR4rCC4rCh4rCQ4rCg4rCU4rCN4rCfLCDQp9OR0LLQsNGI0LvQsCwgQ3ltcmFlZywgRGFuc2ssIFphemFraSwg3oveqN6I3qzegN6o3oTept6Q3rAsIM6VzrvOu863zr3Ouc66zqwsIEVtaWxpw6BuIGUgcnVtYWduw7JsLCBFbmdsaXNoLCBFc3BlcmFudG8sIEVzcGHDsW9sLCBFZXN0aSwgRXVza2FyYSwg2YHYp9ix2LPbjCwgU3VvbWksIFbDtXJvLCBGw7hyb3lza3QsIEZyYW7Dp2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwg6LSb6KqeLCBHw6BpZGhsaWcsIEdhbGVnbywgQXZhw7FlXCfhur0sIOCql+CrgeCqnOCqsOCqvuCqpOCrgCwgR2FlbGcsINei15HXqNeZ16osIOCkueCkv+CkqOCljeCkpuClgCwgRmlqaSBIaW5kaSwgSHJ2YXRza2ksIEtyZXnDsmwgYXlpc3llbiwgTWFneWFyLCDVgNWh1bXVpdaA1aXVtiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsIElsb2thbm8sIElkbywgw41zbGVuc2thLCBJdGFsaWFubywg5pel5pys6KqeLCBMb2piYW4sIEJhc2EgSmF3YSwg4YOl4YOQ4YOg4YOX4YOj4YOa4YOYLCBLb25nbywgS2FsYWFsbGlzdXQsIOCyleCyqOCzjeCyqOCyoSwg7ZWc6rWt7Ja0LCDQmtGK0LDRgNCw0YfQsNC5LdCc0LDQu9C60YrQsNGALCBSaXBvYXJpc2NoLCBLdXJkw64sINCa0L7QvNC4LCBLZXJuZXdlaywg0JrRi9GA0LPRi9C30YfQsCwgTGF0aW5hLCBMYWRpbm8sIEzDq3R6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmfDoWxhLCDguqXgurLguqcsIExpZXR1dmnFsywgTGF0dmllxaF1LCBCYXNhIEJhbnl1bWFzYW4sIE1hbGFnYXN5LCDQnNCw0LrQtdC00L7QvdGB0LrQuCwg4LSu4LSy4LSv4LS+4LSz4LSCLCDgpK7gpLDgpL7gpKDgpYAsIEJhaGFzYSBNZWxheXUsINmF2KfYstmQ2LHZiNmG24wsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCDgpKjgpYfgpKrgpL7gpLIg4KSt4KS+4KS34KS+LCBOZWRlcmxhbmRzLCDigKpOb3JzayAobnlub3JzaynigKwsIOKAqk5vcnNrIChib2ttw6VsKeKArCwgTm91b3JtYW5kLCBEaW7DqSBiaXphYWQsIE9jY2l0YW4sINCY0YDQvtC90LDRgywgUGFwaWFtZW50dSwgRGVpdHNjaCwgTm9yZnVrIFwvIFBpdGtlcm4sIFBvbHNraSwg2b7Zhtis2KfYqNuMLCDZvtqa2KrZiCwgUG9ydHVndcOqcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tw6JuxIMsINCg0YPRgdGB0LrQuNC5LCDQodCw0YXQsCDRgtGL0LvQsCwgU2FyZHUsIFNpY2lsaWFudSwgU2NvdHMsIFPDoW1lZ2llbGxhLCBTaW1wbGUgRW5nbGlzaCwgU2xvdmVuxI1pbmEsIFNsb3ZlbsWhxI1pbmEsINCh0YDQv9GB0LrQuCBcLyBTcnBza2ksIFNlZWx0ZXJzaywgU3ZlbnNrYSwgS2lzd2FoaWxpLCDgrqTgrq7grr/grrTgr40sIOCwpOCxhuCwsuCxgeCwl+CxgSwg0KLQvtK30LjQutOjLCDguYTguJfguKIsIFTDvHJrbWVuw6dlLCBUYWdhbG9nLCBUw7xya8OnZSwg0KLQsNGC0LDRgNGH0LBcL1RhdGFyw6dhLCDQo9C60YDQsNGX0L3RgdGM0LrQsCwg2KfYsdiv2YgsIFRp4bq/bmcgVmnhu4d0LCBWb2xhcMO8aywgV2Fsb24sIFdpbmFyYXksIOWQtOivrSwgaXNpWGhvc2EsINeZ15nWtNeT15nXqSwgWW9yw7liw6EsIFplw6p1d3MsIOS4reaWhywgQsOibi1sw6JtLWfDuiwg57K16KqeIn19JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nMiddID0gJ3siMSI6eyJzdHIiOiJxdW90ZTogXFxcXFwiIGJhY2tzbGFzaDogZm9yd2FyZHNsYXNoLWVzY2FwZWQ6IFxcXFxcLyAgYmFja3NwYWNlOiBcXFxcYiBmb3JtZmVlZDogXGYgbmV3bGluZTogXG4gcmV0dXJuOiBcciB0YWI6ICBub3ctYWxsLW9mLXRoZW0tdG9nZXRoZXI6IFwiXFxcXFxcXFxcL1xcXFxiXG5cclx0IG5vdy1hLWJ1bmNoLW9mLWp1bms6ICFAIyQlJigpKCYlJCN7fXt9PD48PjwifX0nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmczJ10gPSAneyIxIjp7InN0ciI6InN0cmluZyB0aGF0IGVuZHMgaW4gZG91YmxlLWJhY2tzbGFzaCBcXFxcXFxcXCJ9fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFVuaWNvZGVTdHJpbmdXaXRoTm9uQk1QJ10gPSAneyIxIjp7InN0ciI6IuC4quC4p+C4seC4quC4lOC4tVwv8J2SryJ9fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdERvdWJsZSddID0gJ3siMSI6eyJkYmwiOjMuMTQxNTkyNjUzNTg5OH19JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0Qnl0ZSddID0gJ3siMSI6eyJpOCI6MX19JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0STMyJ10gPSAneyIxIjp7ImkzMiI6MTA3Mzc0MTgyNH19JzsKKworICAgICAgICBpZiAoUEhQX0lOVF9TSVpFID09IDgpIHsKKyAgICAgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RJNjQnXSA9ICd7IjEiOnsiaTY0IjonIC4gcG93KDIsIDYwKSAuICd9fSc7CisgICAgICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RydWN0J10gPSAneyIxIjp7InJlYyI6eyIxIjp7InN0ciI6IndvcmtlZCJ9LCI0Ijp7Imk4IjoxfSwiOSI6eyJpMzIiOjEwNzM3NDE4MjR9LCIxMSI6eyJpNjQiOicgLiBwb3coMiwgNjApIC4gJ319fX0nOworICAgICAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdE5lc3QnXSA9ICd7IjEiOnsicmVjIjp7IjEiOnsiaTgiOjF9LCIyIjp7InJlYyI6eyIxIjp7InN0ciI6IndvcmtlZCJ9LCI0Ijp7Imk4IjoxfSwiOSI6eyJpMzIiOjEwNzM3NDE4MjR9LCIxMSI6eyJpNjQiOicgLiBwb3coMiwgNjApIC4gJ319fSwiMyI6eyJpMzIiOjMyNzY4fX19fSc7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0STY0J10gPSAneyIxIjp7Imk2NCI6MTE1MjkyMTUwNDYwNjg0NzAwMH19JzsKKyAgICAgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJ1Y3QnXSA9ICd7IjEiOnsicmVjIjp7IjEiOnsic3RyIjoid29ya2VkIn0sIjQiOnsiaTgiOjF9LCI5Ijp7ImkzMiI6MTA3Mzc0MTgyNH0sIjExIjp7Imk2NCI6MTE1MjkyMTUwNDYwNjg0NzAwMH19fX0nOworICAgICAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdE5lc3QnXSA9ICd7IjEiOnsicmVjIjp7IjEiOnsiaTgiOjF9LCIyIjp7InJlYyI6eyIxIjp7InN0ciI6IndvcmtlZCJ9LCI0Ijp7Imk4IjoxfSwiOSI6eyJpMzIiOjEwNzM3NDE4MjR9LCIxMSI6eyJpNjQiOjExNTI5MjE1MDQ2MDY4NDcwMDB9fX0sIjMiOnsiaTMyIjozMjc2OH19fX0nOworICAgICAgICB9CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdE1hcCddID0gJ3siMSI6eyJtYXAiOlsiaTMyIiwiaTMyIiwzLHsiNyI6NzcsIjgiOjg4LCI5Ijo5OX1dfX0nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmdNYXAnXSA9ICd7IjEiOnsibWFwIjpbInN0ciIsInN0ciIsNix7ImEiOiIxMjMiLCJhIGIiOiJ3aXRoIHNwYWNlcyAiLCJzYW1lIjoic2FtZSIsIjAiOiJudW1lcmljIGtleSIsImxvbmdWYWx1ZSI6IkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvblx1MDBlOXMsIFx1MDYyN1x1MDY0NFx1MDYzOVx1MDYzMVx1MDYyOFx1MDY0YVx1MDYyOSwgXHUwNjQ1XHUwNjM1XHUwNjMxXHUwNjQ5LCBBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXpcdTAyNTlyYmF5Y2FuLCBcdTA0MTFcdTA0MzBcdTA0NDhcdTA0YTFcdTA0M2VcdTA0NDBcdTA0NDIsIEJvYXJpc2NoLCBcdTAxN2RlbWFpdFx1MDExN1x1MDE2MWthLCBcdTA0MTFcdTA0MzVcdTA0M2JcdTA0MzBcdTA0NDBcdTA0NDNcdTA0NDFcdTA0M2FcdTA0MzBcdTA0NGYsIFx1MDQxMVx1MDQzNVx1MDQzYlx1MDQzMFx1MDQ0MFx1MDQ0M1x1MDQ0MVx1MDQzYVx1MDQzMFx1MDQ0ZiAoXHUwNDQyXHUwNDMwXHUwNDQwXHUwNDMwXHUwNDQ4XHUwNDNhXHUwNDM1XHUwNDMyXHUwNDU2XHUwNDQ2XHUwNDMwKSwgXHUwNDExXHUwNDRhXHUwNDNiXHUwNDMzXHUwNDMwXHUwNDQwXHUwNDQxXHUwNDNhXHUwNDM4LCBCYW1hbmFua2FuLCBcdTA5YWNcdTA5YmVcdTA5ODJcdTA5YjJcdTA5YmUsIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsXHUwMGUwLCBNXHUwMGVjbmctZFx1MDExNVx1MDMyNG5nLW5nXHUxZTczXHUwMzA0LCBcdTA0MWRcdTA0M2VcdTA0NDVcdTA0NDdcdTA0MzhcdTA0MzlcdTA0M2QsIENlYnVhbm8sIFx1MTNlM1x1MTNiM1x1MTNhOSwgXHUwMTBjZXNreSwgXHUwNDIxXHUwNDNiXHUwNDNlXHUwNDMyXHUwNDYzXHUwMzAxXHUwNDNkXHUwNDRjXHUwNDQxXHUwNDNhXHUwNDRhIFwvIFx1MmMxNFx1MmMwZVx1MmMxMVx1MmMwMlx1MmMyMVx1MmMxMFx1MmMyMFx1MmMxNFx1MmMwZFx1MmMxZiwgXHUwNDI3XHUwNGQxXHUwNDMyXHUwNDMwXHUwNDQ4XHUwNDNiXHUwNDMwLCBDeW1yYWVnLCBEYW5zaywgWmF6YWtpLCBcdTA3OGJcdTA3YThcdTA3ODhcdTA3YWNcdTA3ODBcdTA3YThcdTA3ODRcdTA3YTZcdTA3OTBcdTA3YjAsIFx1MDM5NVx1MDNiYlx1MDNiYlx1MDNiN1x1MDNiZFx1MDNiOVx1MDNiYVx1MDNhYywgRW1pbGlcdTAwZTBuIGUgcnVtYWduXHUwMGYybCwgRW5nbGlzaCwgRXNwZXJhbnRvLCBFc3BhXHUwMGYxb2wsIEVlc3RpLCBFdXNrYXJhLCBcdTA2NDFcdTA2MjdcdTA2MzFcdTA2MzNcdTA2Y2MsIFN1b21pLCBWXHUwMGY1cm8sIEZcdTAwZjhyb3lza3QsIEZyYW5cdTAwZTdhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIFx1OGQxYlx1OGE5ZSwgR1x1MDBlMGlkaGxpZywgR2FsZWdvLCBBdmFcdTAwZjFlXCdcdTFlYmQsIFx1MGE5N1x1MGFjMVx1MGE5Y1x1MGFiMFx1MGFiZVx1MGFhNFx1MGFjMCwgR2FlbGcsIFx1MDVlMlx1MDVkMVx1MDVlOFx1MDVkOVx1MDVlYSwgXHUwOTM5XHUwOTNmXHUwOTI4XHUwOTRkXHUwOTI2XHUwOTQwLCBGaWppIEhpbmRpLCBIcnZhdHNraSwgS3JleVx1MDBmMmwgYXlpc3llbiwgTWFneWFyLCBcdTA1NDBcdTA1NjFcdTA1NzVcdTA1NjVcdTA1ODBcdTA1NjVcdTA1NzYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCBJbG9rYW5vLCBJZG8sIFx1MDBjZHNsZW5za2EsIEl0YWxpYW5vLCBcdTY1ZTVcdTY3MmNcdThhOWUsIExvamJhbiwgQmFzYSBKYXdhLCBcdTEwZTVcdTEwZDBcdTEwZTBcdTEwZDdcdTEwZTNcdTEwZGFcdTEwZDgsIEtvbmdvLCBLYWxhYWxsaXN1dCwgXHUwYzk1XHUwY2E4XHUwY2NkXHUwY2E4XHUwY2ExLCBcdWQ1NWNcdWFkNmRcdWM1YjQsIFx1MDQxYVx1MDQ0YVx1MDQzMFx1MDQ0MFx1MDQzMFx1MDQ0N1x1MDQzMFx1MDQzOS1cdTA0MWNcdTA0MzBcdTA0M2JcdTA0M2FcdTA0NGFcdTA0MzBcdTA0NDAsIFJpcG9hcmlzY2gsIEt1cmRcdTAwZWUsIFx1MDQxYVx1MDQzZVx1MDQzY1x1MDQzOCwgS2VybmV3ZWssIFx1MDQxYVx1MDQ0Ylx1MDQ0MFx1MDQzM1x1MDQ0Ylx1MDQzN1x1MDQ0N1x1MDQzMCwgTGF0aW5hLCBMYWRpbm8sIExcdTAwZWJ0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nXHUwMGUxbGEsIFx1MGVhNVx1MGViMlx1MGVhNywgTGlldHV2aVx1MDE3MywgTGF0dmllXHUwMTYxdSwgQmFzYSBCYW55dW1hc2FuLCBNYWxhZ2FzeSwgXHUwNDFjXHUwNDMwXHUwNDNhXHUwNDM1XHUwNDM0XHUwNDNlXHUwNDNkXHUwNDQxXHUwNDNhXHUwNDM4LCBcdTBkMmVcdTBkMzJcdTBkMmZcdTBkM2VcdTBkMzNcdTBkMDIsIFx1MDkyZVx1MDkzMFx1MDkzZVx1MDkyMFx1MDk0MCwgQmFoYXNhIE1lbGF5dSwgXHUwNjQ1XHUwNjI3XHUwNjMyXHUwNjUwXHUwNjMxXHUwNjQ4XHUwNjQ2XHUwNmNjLCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwgXHUwOTI4XHUwOTQ3XHUwOTJhXHUwOTNlXHUwOTMyIFx1MDkyZFx1MDkzZVx1MDkzN1x1MDkzZSwgTmVkZXJsYW5kcywgXHUyMDJhTm9yc2sgKG55bm9yc2spXHUyMDJjLCBcdTIwMmFOb3JzayAoYm9rbVx1MDBlNWwpXHUyMDJjLCBOb3Vvcm1hbmQsIERpblx1MDBlOSBiaXphYWQsIE9jY2l0YW4sIFx1MDQxOFx1MDQ0MFx1MDQzZVx1MDQzZFx1MDQzMFx1MDQ0MywgUGFwaWFtZW50dSwgRGVpdHNjaCwgTm9yZnVrIFwvIFBpdGtlcm4sIFBvbHNraSwgXHUwNjdlXHUwNjQ2XHUwNjJjXHUwNjI3XHUwNjI4XHUwNmNjLCBcdTA2N2VcdTA2OWFcdTA2MmFcdTA2NDgsIFBvcnR1Z3VcdTAwZWFzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb21cdTAwZTJuXHUwMTAzLCBcdTA0MjBcdTA0NDNcdTA0NDFcdTA0NDFcdTA0M2FcdTA0MzhcdTA0MzksIFx1MDQyMVx1MDQzMFx1MDQ0NVx1MDQzMCBcdTA0NDJcdTA0NGJcdTA0M2JcdTA0MzAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTXHUwMGUxbWVnaWVsbGEsIFNpbXBsZSBFbmdsaXNoLCBTbG92ZW5cdTAxMGRpbmEsIFNsb3Zlblx1MDE2MVx1MDEwZGluYSwgXHUwNDIxXHUwNDQwXHUwNDNmXHUwNDQxXHUwNDNhXHUwNDM4IFwvIFNycHNraSwgU2VlbHRlcnNrLCBTdmVuc2thLCBLaXN3YWhpbGksIFx1MGJhNFx1MGJhZVx1MGJiZlx1MGJiNFx1MGJjZCwgXHUwYzI0XHUwYzQ2XHUwYzMyXHUwYzQxXHUwYzE3XHUwYzQxLCBcdTA0MjJcdTA0M2VcdTA0YjdcdTA0MzhcdTA0M2FcdTA0ZTMsIFx1MGU0NFx1MGUxN1x1MGUyMiwgVFx1MDBmY3JrbWVuXHUwMGU3ZSwgVGFnYWxvZywgVFx1MDBmY3JrXHUwMGU3ZSwgXHUwNDIyXHUwNDMwXHUwNDQyXHUwNDMwXHUwNDQwXHUwNDQ3XHUwNDMwXC9UYXRhclx1MDBlN2EsIFx1MDQyM1x1MDQzYVx1MDQ0MFx1MDQzMFx1MDQ1N1x1MDQzZFx1MDQ0MVx1MDQ0Y1x1MDQzYVx1MDQzMCwgXHUwNjI3XHUwNjMxXHUwNjJmXHUwNjQ4LCBUaVx1MWViZm5nIFZpXHUxZWM3dCwgVm9sYXBcdTAwZmNrLCBXYWxvbiwgV2luYXJheSwgXHU1NDM0XHU4YmVkLCBpc2lYaG9zYSwgXHUwNWQ5XHUwNWQ5XHUwNWI0XHUwNWQzXHUwNWQ5XHUwNWU5LCBZb3JcdTAwZjliXHUwMGUxLCBaZVx1MDBlYXV3cywgXHU0ZTJkXHU2NTg3LCBCXHUwMGUybi1sXHUwMGUybS1nXHUwMGZhLCBcdTdjYjVcdThhOWUiLCJBZnJpa2FhbnMsIEFsZW1hbm5pc2NoLCBBcmFnb25cdTAwZTlzLCBcdTA2MjdcdTA2NDRcdTA2MzlcdTA2MzFcdTA2MjhcdTA2NGFcdTA2MjksIFx1MDY0NVx1MDYzNVx1MDYzMVx1MDY0OSwgQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6XHUwMjU5cmJheWNhbiwgXHUwNDExXHUwNDMwXHUwNDQ4XHUwNGExXHUwNDNlXHUwNDQwXHUwNDQyLCBCb2FyaXNjaCwgXHUwMTdkZW1haXRcdTAxMTdcdTAxNjFrYSwgXHUwNDExXHUwNDM1XHUwNDNiXHUwNDMwXHUwNDQwXHUwNDQzXHUwNDQxXHUwNDNhXHUwNDMwXHUwNDRmLCBcdTA0MTFcdTA0MzVcdTA0M2JcdTA0MzBcdTA0NDBcdTA0NDNcdTA0NDFcdTA0M2FcdTA0MzBcdTA0NGYgKFx1MDQ0Mlx1MDQzMFx1MDQ0MFx1MDQzMFx1MDQ0OFx1MDQzYVx1MDQzNVx1MDQzMlx1MDQ1Nlx1MDQ0Nlx1MDQzMCksIFx1MDQxMVx1MDQ0YVx1MDQzYlx1MDQzM1x1MDQzMFx1MDQ0MFx1MDQ0MVx1MDQzYVx1MDQzOCwgQmFtYW5hbmthbiwgXHUwOWFjXHUwOWJlXHUwOTgyXHUwOWIyXHUwOWJlLCBCcmV6aG9uZWcsIEJvc2Fuc2tpLCBDYXRhbFx1MDBlMCwgTVx1MDBlY25nLWRcdTAxMTVcdTAzMjRuZy1uZ1x1MWU3M1x1MDMwNCwgXHUwNDFkXHUwNDNlXHUwNDQ1XHUwNDQ3XHUwNDM4XHUwNDM5XHUwNDNkLCBDZWJ1YW5vLCBcdTEzZTNcdTEzYjNcdTEzYTksIFx1MDEwY2Vza3ksIFx1MDQyMVx1MDQzYlx1MDQzZVx1MDQzMlx1MDQ2M1x1MDMwMVx1MDQzZFx1MDQ0Y1x1MDQ0MVx1MDQzYVx1MDQ0YSBcLyBcdTJjMTRcdTJjMGVcdTJjMTFcdTJjMDJcdTJjMjFcdTJjMTBcdTJjMjBcdTJjMTRcdTJjMGRcdTJjMWYsIFx1MDQyN1x1MDRkMVx1MDQzMlx1MDQzMFx1MDQ0OFx1MDQzYlx1MDQzMCwgQ3ltcmFlZywgRGFuc2ssIFphemFraSwgXHUwNzhiXHUwN2E4XHUwNzg4XHUwN2FjXHUwNzgwXHUwN2E4XHUwNzg0XHUwN2E2XHUwNzkwXHUwN2IwLCBcdTAzOTVcdTAzYmJcdTAzYmJcdTAzYjdcdTAzYmRcdTAzYjlcdTAzYmFcdTAzYWMsIEVtaWxpXHUwMGUwbiBlIHJ1bWFnblx1MDBmMmwsIEVuZ2xpc2gsIEVzcGVyYW50bywgRXNwYVx1MDBmMW9sLCBFZXN0aSwgRXVza2FyYSwgXHUwNjQxXHUwNjI3XHUwNjMxXHUwNjMzXHUwNmNjLCBTdW9taSwgVlx1MDBmNXJvLCBGXHUwMGY4cm95c2t0LCBGcmFuXHUwMGU3YWlzLCBBcnBldGFuLCBGdXJsYW4sIEZyeXNrLCBHYWVpbGdlLCBcdThkMWJcdThhOWUsIEdcdTAwZTBpZGhsaWcsIEdhbGVnbywgQXZhXHUwMGYxZVwnXHUxZWJkLCBcdTBhOTdcdTBhYzFcdTBhOWNcdTBhYjBcdTBhYmVcdTBhYTRcdTBhYzAsIEdhZWxnLCBcdTA1ZTJcdTA1ZDFcdTA1ZThcdTA1ZDlcdTA1ZWEsIFx1MDkzOVx1MDkzZlx1MDkyOFx1MDk0ZFx1MDkyNlx1MDk0MCwgRmlqaSBIaW5kaSwgSHJ2YXRza2ksIEtyZXlcdTAwZjJsIGF5aXN5ZW4sIE1hZ3lhciwgXHUwNTQwXHUwNTYxXHUwNTc1XHUwNTY1XHUwNTgwXHUwNTY1XHUwNTc2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwgSWxva2FubywgSWRvLCBcdTAwY2RzbGVuc2thLCBJdGFsaWFubywgXHU2NWU1XHU2NzJjXHU4YTllLCBMb2piYW4sIEJhc2EgSmF3YSwgXHUxMGU1XHUxMGQwXHUxMGUwXHUxMGQ3XHUxMGUzXHUxMGRhXHUxMGQ4LCBLb25nbywgS2FsYWFsbGlzdXQsIFx1MGM5NVx1MGNhOFx1MGNjZFx1MGNhOFx1MGNhMSwgXHVkNTVjXHVhZDZkXHVjNWI0LCBcdTA0MWFcdTA0NGFcdTA0MzBcdTA0NDBcdTA0MzBcdTA0NDdcdTA0MzBcdTA0MzktXHUwNDFjXHUwNDMwXHUwNDNiXHUwNDNhXHUwNDRhXHUwNDMwXHUwNDQwLCBSaXBvYXJpc2NoLCBLdXJkXHUwMGVlLCBcdTA0MWFcdTA0M2VcdTA0M2NcdTA0MzgsIEtlcm5ld2VrLCBcdTA0MWFcdTA0NGJcdTA0NDBcdTA0MzNcdTA0NGJcdTA0MzdcdTA0NDdcdTA0MzAsIExhdGluYSwgTGFkaW5vLCBMXHUwMGVidHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ1x1MDBlMWxhLCBcdTBlYTVcdTBlYjJcdTBlYTcsIExpZXR1dmlcdTAxNzMsIExhdHZpZVx1MDE2MXUsIEJhc2EgQmFueXVtYXNhbiwgTWFsYWdhc3ksIFx1MDQxY1x1MDQzMFx1MDQzYVx1MDQzNVx1MDQzNFx1MDQzZVx1MDQzZFx1MDQ0MVx1MDQzYVx1MDQzOCwgXHUwZDJlXHUwZDMyXHUwZDJmXHUwZDNlXHUwZDMzXHUwZDAyLCBcdTA5MmVcdTA5MzBcdTA5M2VcdTA5MjBcdTA5NDAsIEJhaGFzYSBNZWxheXUsIFx1MDY0NVx1MDYyN1x1MDYzMlx1MDY1MFx1MDYzMVx1MDY0OFx1MDY0Nlx1MDZjYywgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIFx1MDkyOFx1MDk0N1x1MDkyYVx1MDkzZVx1MDkzMiBcdTA5MmRcdTA5M2VcdTA5MzdcdTA5M2UsIE5lZGVybGFuZHMsIFx1MjAyYU5vcnNrIChueW5vcnNrKVx1MjAyYywgXHUyMDJhTm9yc2sgKGJva21cdTAwZTVsKVx1MjAyYywgTm91b3JtYW5kLCBEaW5cdTAwZTkgYml6YWFkLCBPY2NpdGFuLCBcdTA0MThcdTA0NDBcdTA0M2VcdTA0M2RcdTA0MzBcdTA0NDMsIFBhcGlhbWVudHUsIERlaXRzY2gsIE5vcmZ1ayBcLyBQaXRrZXJuLCBQb2xza2ksIFx1MDY3ZVx1MDY0Nlx1MDYyY1x1MDYyN1x1MDYyOFx1MDZjYywgXHUwNjdlXHUwNjlhXHUwNjJhXHUwNjQ4LCBQb3J0dWd1XHUwMGVhcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tXHUwMGUyblx1MDEwMywgXHUwNDIwXHUwNDQzXHUwNDQxXHUwNDQxXHUwNDNhXHUwNDM4XHUwNDM5LCBcdTA0MjFcdTA0MzBcdTA0NDVcdTA0MzAgXHUwNDQyXHUwNDRiXHUwNDNiXHUwNDMwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU1x1MDBlMW1lZ2llbGxhLCBTaW1wbGUgRW5nbGlzaCwgU2xvdmVuXHUwMTBkaW5hLCBTbG92ZW5cdTAxNjFcdTAxMGRpbmEsIFx1MDQyMVx1MDQ0MFx1MDQzZlx1MDQ0MVx1MDQzYVx1MDQzOCBcLyBTcnBza2ksIFNlZWx0ZXJzaywgU3ZlbnNrYSwgS2lzd2FoaWxpLCBcdTBiYTRcdTBiYWVcdTBiYmZcdTBiYjRcdTBiY2QsIFx1MGMyNFx1MGM0Nlx1MGMzMlx1MGM0MVx1MGMxN1x1MGM0MSwgXHUwNDIyXHUwNDNlXHUwNGI3XHUwNDM4XHUwNDNhXHUwNGUzLCBcdTBlNDRcdTBlMTdcdTBlMjIsIFRcdTAwZmNya21lblx1MDBlN2UsIFRhZ2Fsb2csIFRcdTAwZmNya1x1MDBlN2UsIFx1MDQyMlx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQ0MFx1MDQ0N1x1MDQzMFwvVGF0YXJcdTAwZTdhLCBcdTA0MjNcdTA0M2FcdTA0NDBcdTA0MzBcdTA0NTdcdTA0M2RcdTA0NDFcdTA0NGNcdTA0M2FcdTA0MzAsIFx1MDYyN1x1MDYzMVx1MDYyZlx1MDY0OCwgVGlcdTFlYmZuZyBWaVx1MWVjN3QsIFZvbGFwXHUwMGZjaywgV2Fsb24sIFdpbmFyYXksIFx1NTQzNFx1OGJlZCwgaXNpWGhvc2EsIFx1MDVkOVx1MDVkOVx1MDViNFx1MDVkM1x1MDVkOVx1MDVlOSwgWW9yXHUwMGY5Ylx1MDBlMSwgWmVcdTAwZWF1d3MsIFx1NGUyZFx1NjU4NywgQlx1MDBlMm4tbFx1MDBlMm0tZ1x1MDBmYSwgXHU3Y2I1XHU4YTllIjoibG9uZyBrZXkifV19fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFNldCddID0gJ3siMSI6eyJzZXQiOlsiaTMyIiwzLDEsNSw2XX19JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0TGlzdCddID0gJ3siMSI6eyJsc3QiOlsiaTMyIiwzLDEsMiwzXX19JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0RW51bSddID0gJ3siMSI6eyJpMzIiOjF9fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFR5cGVkZWYnXSA9ICd7IjEiOnsiaTY0Ijo2OX19JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0TWFwTWFwJ10gPSAneyIwIjp7Im1hcCI6WyJpMzIiLCJtYXAiLDIseyI0IjpbImkzMiIsImkzMiIsNCx7IjEiOjEsIjIiOjIsIjMiOjMsIjQiOjR9XSwiLTQiOlsiaTMyIiwiaTMyIiw0LHsiLTQiOi00LCItMyI6LTMsIi0yIjotMiwiLTEiOi0xfV19XX19JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0SW5zYW5pdHknXSA9ICd7IjAiOnsibWFwIjpbImk2NCIsIm1hcCIsMix7IjEiOlsiaTMyIiwicmVjIiwyLHsiMiI6eyIxIjp7Im1hcCI6WyJpMzIiLCJpNjQiLDIseyI1Ijo1LCI4Ijo4fV19LCIyIjp7ImxzdCI6WyJyZWMiLDIseyIxIjp7InN0ciI6Ikdvb2RieWU0In0sIjQiOnsiaTgiOjR9LCI5Ijp7ImkzMiI6NH0sIjExIjp7Imk2NCI6NH19LHsiMSI6eyJzdHIiOiJIZWxsbzIifSwiNCI6eyJpOCI6Mn0sIjkiOnsiaTMyIjoyfSwiMTEiOnsiaTY0IjoyfX1dfX0sIjMiOnsiMSI6eyJtYXAiOlsiaTMyIiwiaTY0IiwyLHsiNSI6NSwiOCI6OH1dfSwiMiI6eyJsc3QiOlsicmVjIiwyLHsiMSI6eyJzdHIiOiJHb29kYnllNCJ9LCI0Ijp7Imk4Ijo0fSwiOSI6eyJpMzIiOjR9LCIxMSI6eyJpNjQiOjR9fSx7IjEiOnsic3RyIjoiSGVsbG8yIn0sIjQiOnsiaTgiOjJ9LCI5Ijp7ImkzMiI6Mn0sIjExIjp7Imk2NCI6Mn19XX19fV0sIjIiOlsiaTMyIiwicmVjIiwxLHsiNiI6e319XX1dfX0nOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvdGVzdC9Qcm90b2NvbC9USlNPTlByb3RvY29sVGVzdC5waHAgYi9saWIvcGhwL3Rlc3QvUHJvdG9jb2wvVEpTT05Qcm90b2NvbFRlc3QucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMGVjY2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL3Rlc3QvUHJvdG9jb2wvVEpTT05Qcm90b2NvbFRlc3QucGhwCkBAIC0wLDAgKzEsNTE4IEBACis8P3BocAorCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50ZXN0CisgKi8KKworbmFtZXNwYWNlIFRlc3RcVGhyaWZ0XFByb3RvY29sOworCit1c2UgUEhQVW5pdFxGcmFtZXdvcmtcVGVzdENhc2U7Cit1c2UgVGVzdFxUaHJpZnRcRml4dHVyZXM7Cit1c2UgVGhyaWZ0XFByb3RvY29sXFRKU09OUHJvdG9jb2w7Cit1c2UgVGhyaWZ0XFRyYW5zcG9ydFxUTWVtb3J5QnVmZmVyOworCityZXF1aXJlIF9fRElSX18gLiAnLy4uLy4uLy4uLy4uL3ZlbmRvci9hdXRvbG9hZC5waHAnOworCisvKioqCisgKiBUaGlzIHRlc3Qgc3VpdGUgZGVwZW5kcyBvbiBydW5uaW5nIHRoZSBjb21waWxlciBhZ2FpbnN0IHRoZQorICogc3RhbmRhcmQgVGhyaWZ0VGVzdC50aHJpZnQgZmlsZToKKyAqCisgKiBsaWIvcGhwL3Rlc3QkIC4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLS1nZW4gcGhwIC1yIFwKKyAqICAgLS1vdXQgLi9wYWNrYWdlcyAuLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CisgKgorICogQHJ1blRlc3RzSW5TZXBhcmF0ZVByb2Nlc3NlcworICovCitjbGFzcyBUSlNPTlByb3RvY29sVGVzdCBleHRlbmRzIFRlc3RDYXNlCit7CisgICAgcHJpdmF0ZSAkdHJhbnNwb3J0OworICAgIHByaXZhdGUgJHByb3RvY29sOworCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZXRVcEJlZm9yZUNsYXNzKCkKKyAgICB7CisgICAgICAgIC8qKiBAdmFyIFxDb21wb3NlclxBdXRvbG9hZFxDbGFzc0xvYWRlciAkbG9hZGVyICovCisgICAgICAgICRsb2FkZXIgPSByZXF1aXJlIF9fRElSX18gLiAnLy4uLy4uLy4uLy4uL3ZlbmRvci9hdXRvbG9hZC5waHAnOworICAgICAgICAkbG9hZGVyLT5hZGRQc3I0KCcnLCBfX0RJUl9fIC4gJy8uLi9wYWNrYWdlcy9waHAnKTsKKworICAgICAgICBGaXh0dXJlczo6cG9wdWxhdGVUZXN0QXJncygpOworICAgICAgICBUSlNPTlByb3RvY29sRml4dHVyZXM6OnBvcHVsYXRlVGVzdEFyZ3NKU09OKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHNldFVwKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQgPSBuZXcgVE1lbW9yeUJ1ZmZlcigpOworICAgICAgICAkdGhpcy0+cHJvdG9jb2wgPSBuZXcgVEpTT05Qcm90b2NvbCgkdGhpcy0+dHJhbnNwb3J0KTsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydC0+b3BlbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdSSVRFIFRFU1RTCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RWb2lkV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0Vm9pZF9hcmdzKCk7CisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFZvaWQnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJpbmcxV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U3RyaW5nX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFN0cmluZzEnXTsKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nMSddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cmluZzJXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTdHJpbmdfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nMiddOworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmcyJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0RG91YmxlV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0RG91YmxlX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdERvdWJsZSddOworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3REb3VibGUnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RCeXRlV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0Qnl0ZV9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RCeXRlJ107CisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEJ5dGUnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RJMzJXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RJMzJfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0STMyJ107CisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEkzMiddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEk2NFdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEk2NF9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RJNjQnXTsKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0STY0J107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RydWN0V3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U3RydWN0X2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFN0cnVjdCddOworCisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cnVjdCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdE5lc3RXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3ROZXN0X2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdE5lc3QnXTsKKworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3ROZXN0J107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TWFwV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0TWFwX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdE1hcCddOworCisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdE1hcCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cmluZ01hcFdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cmluZ01hcF9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmdNYXAnXTsKKworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmdNYXAnXTsKKworICAgICAgICAvKgorICAgICAgICAgKiBUaGUgJGFjdHVhbCByZXR1cm5zIHVuZXNjYXBlZCBzdHJpbmcuCisgICAgICAgICAqIEl0IGlzIHJlcXVpcmVkIHRvIHRvIGRlY29kZSB0aGVuIGVuY29kZSBpdCBhZ2FpbgorICAgICAgICAgKiB0byBnZXQgdGhlIGV4cGVjdGVkIGVzY2FwZWQgdW5pY29kZS4KKyAgICAgICAgICovCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCBqc29uX2VuY29kZShqc29uX2RlY29kZSgkYWN0dWFsKSkpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U2V0V3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U2V0X2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFNldCddOworCisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFNldCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdExpc3RXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RMaXN0X2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdExpc3QnXTsKKworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RMaXN0J107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0RW51bVdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEVudW1fYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0RW51bSddOworCisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEVudW0nXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RUeXBlZGVmV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0VHlwZWRlZl9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RUeXBlZGVmJ107CisKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0VHlwZWRlZiddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSRUFEIFRFU1RTCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RWb2lkUmVhZCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFZvaWQnXQorICAgICAgICApOworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RWb2lkX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnJlYWQoJHRoaXMtPnByb3RvY29sKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cmluZzFSZWFkKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAorICAgICAgICAgICAgVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nMSddCisgICAgICAgICk7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cmluZ19hcmdzKCk7CisgICAgICAgICRhcmdzLT5yZWFkKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKKyAgICAgICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFN0cmluZzEnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJpbmcyUmVhZCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZzInXQorICAgICAgICApOworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTdHJpbmdfYXJncygpOworICAgICAgICAkYXJncy0+cmVhZCgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7CisgICAgICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmcyJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RyaW5nM1dyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cmluZ19hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmczJ107CisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZzMnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJpbmc0V3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U3RyaW5nX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFVuaWNvZGVTdHJpbmdXaXRoTm9uQk1QJ107CisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFVuaWNvZGVTdHJpbmdXaXRoTm9uQk1QJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0RG91YmxlUmVhZCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdERvdWJsZSddCisgICAgICAgICk7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdERvdWJsZV9hcmdzKCk7CisgICAgICAgICRhcmdzLT5yZWFkKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKKyAgICAgICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdERvdWJsZSddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEJ5dGVSZWFkKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAorICAgICAgICAgICAgVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0Qnl0ZSddCisgICAgICAgICk7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEJ5dGVfYXJncygpOworICAgICAgICAkYXJncy0+cmVhZCgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7CisgICAgICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RCeXRlJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0STMyUmVhZCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEkzMiddCisgICAgICAgICk7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEkzMl9hcmdzKCk7CisgICAgICAgICRhcmdzLT5yZWFkKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKKyAgICAgICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdEkzMiddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEk2NFJlYWQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCisgICAgICAgICAgICBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RJNjQnXQorICAgICAgICApOworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RJNjRfYXJncygpOworICAgICAgICAkYXJncy0+cmVhZCgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7CisgICAgICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RJNjQnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJ1Y3RSZWFkKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAorICAgICAgICAgICAgVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RydWN0J10KKyAgICAgICAgKTsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U3RydWN0X2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnJlYWQoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOworICAgICAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U3RydWN0J107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TmVzdFJlYWQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCisgICAgICAgICAgICBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3ROZXN0J10KKyAgICAgICAgKTsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0TmVzdF9hcmdzKCk7CisgICAgICAgICRhcmdzLT5yZWFkKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKKyAgICAgICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdE5lc3QnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RNYXBSZWFkKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAorICAgICAgICAgICAgVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0TWFwJ10KKyAgICAgICAgKTsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0TWFwX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnJlYWQoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOworICAgICAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0TWFwJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RyaW5nTWFwUmVhZCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZ01hcCddCisgICAgICAgICk7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cmluZ01hcF9hcmdzKCk7CisgICAgICAgICRhcmdzLT5yZWFkKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKKyAgICAgICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFN0cmluZ01hcCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFNldFJlYWQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCisgICAgICAgICAgICBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTZXQnXQorICAgICAgICApOworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTZXRfYXJncygpOworICAgICAgICAkYXJncy0+cmVhZCgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7CisgICAgICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTZXQnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RMaXN0UmVhZCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdExpc3QnXQorICAgICAgICApOworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RMaXN0X2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnJlYWQoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOworICAgICAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0TGlzdCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEVudW1SZWFkKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAorICAgICAgICAgICAgVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0RW51bSddCisgICAgICAgICk7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEVudW1fYXJncygpOworICAgICAgICAkYXJncy0+cmVhZCgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7CisgICAgICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RFbnVtJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0VHlwZWRlZlJlYWQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCisgICAgICAgICAgICBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RUeXBlZGVmJ10KKyAgICAgICAgKTsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0VHlwZWRlZl9hcmdzKCk7CisgICAgICAgICRhcmdzLT5yZWFkKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKKyAgICAgICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFR5cGVkZWYnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RNYXBNYXBSZWFkKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAorICAgICAgICAgICAgVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0TWFwTWFwJ10KKyAgICAgICAgKTsKKyAgICAgICAgJHJlc3VsdCA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RNYXBNYXBfcmVzdWx0KCk7CisgICAgICAgICRyZXN1bHQtPnJlYWQoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHJlc3VsdC0+c3VjY2VzczsKKyAgICAgICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdE1hcE1hcEV4cGVjdGVkUmVzdWx0J107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0SW5zYW5pdHlSZWFkKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAorICAgICAgICAgICAgVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0SW5zYW5pdHknXQorICAgICAgICApOworICAgICAgICAkcmVzdWx0ID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEluc2FuaXR5X3Jlc3VsdCgpOworICAgICAgICAkcmVzdWx0LT5yZWFkKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICRyZXN1bHQtPnN1Y2Nlc3M7CisgICAgICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RJbnNhbml0eUV4cGVjdGVkUmVzdWx0J107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvdGVzdC9Qcm90b2NvbC9UU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXMucGhwIGIvbGliL3BocC90ZXN0L1Byb3RvY29sL1RTaW1wbGVKU09OUHJvdG9jb2xGaXh0dXJlcy5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ3ZmQ4NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvdGVzdC9Qcm90b2NvbC9UU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXMucGhwCkBAIC0wLDAgKzEsNjcgQEAKKzw/cGhwCisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRlc3QKKyAqLworCituYW1lc3BhY2UgdGVzdFxUaHJpZnRcUHJvdG9jb2w7CisKK2NsYXNzIFRTaW1wbGVKU09OUHJvdG9jb2xGaXh0dXJlcworeworICAgIHB1YmxpYyBzdGF0aWMgJHRlc3RBcmdzSlNPTiA9IGFycmF5KCk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHBvcHVsYXRlVGVzdEFyZ3NTaW1wbGVKU09OKCkKKyAgICB7CisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RWb2lkJ10gPSAne30nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmcxJ10gPSAneyJ0aGluZyI6IkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvblx1MDBlOXMsIFx1MDYyN1x1MDY0NFx1MDYzOVx1MDYzMVx1MDYyOFx1MDY0YVx1MDYyOSwgXHUwNjQ1XHUwNjM1XHUwNjMxXHUwNjQ5LCBBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXpcdTAyNTlyYmF5Y2FuLCBcdTA0MTFcdTA0MzBcdTA0NDhcdTA0YTFcdTA0M2VcdTA0NDBcdTA0NDIsIEJvYXJpc2NoLCBcdTAxN2RlbWFpdFx1MDExN1x1MDE2MWthLCBcdTA0MTFcdTA0MzVcdTA0M2JcdTA0MzBcdTA0NDBcdTA0NDNcdTA0NDFcdTA0M2FcdTA0MzBcdTA0NGYsIFx1MDQxMVx1MDQzNVx1MDQzYlx1MDQzMFx1MDQ0MFx1MDQ0M1x1MDQ0MVx1MDQzYVx1MDQzMFx1MDQ0ZiAoXHUwNDQyXHUwNDMwXHUwNDQwXHUwNDMwXHUwNDQ4XHUwNDNhXHUwNDM1XHUwNDMyXHUwNDU2XHUwNDQ2XHUwNDMwKSwgXHUwNDExXHUwNDRhXHUwNDNiXHUwNDMzXHUwNDMwXHUwNDQwXHUwNDQxXHUwNDNhXHUwNDM4LCBCYW1hbmFua2FuLCBcdTA5YWNcdTA5YmVcdTA5ODJcdTA5YjJcdTA5YmUsIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsXHUwMGUwLCBNXHUwMGVjbmctZFx1MDExNVx1MDMyNG5nLW5nXHUxZTczXHUwMzA0LCBcdTA0MWRcdTA0M2VcdTA0NDVcdTA0NDdcdTA0MzhcdTA0MzlcdTA0M2QsIENlYnVhbm8sIFx1MTNlM1x1MTNiM1x1MTNhOSwgXHUwMTBjZXNreSwgXHUwNDIxXHUwNDNiXHUwNDNlXHUwNDMyXHUwNDYzXHUwMzAxXHUwNDNkXHUwNDRjXHUwNDQxXHUwNDNhXHUwNDRhIFwvIFx1MmMxNFx1MmMwZVx1MmMxMVx1MmMwMlx1MmMyMVx1MmMxMFx1MmMyMFx1MmMxNFx1MmMwZFx1MmMxZiwgXHUwNDI3XHUwNGQxXHUwNDMyXHUwNDMwXHUwNDQ4XHUwNDNiXHUwNDMwLCBDeW1yYWVnLCBEYW5zaywgWmF6YWtpLCBcdTA3OGJcdTA3YThcdTA3ODhcdTA3YWNcdTA3ODBcdTA3YThcdTA3ODRcdTA3YTZcdTA3OTBcdTA3YjAsIFx1MDM5NVx1MDNiYlx1MDNiYlx1MDNiN1x1MDNiZFx1MDNiOVx1MDNiYVx1MDNhYywgRW1pbGlcdTAwZTBuIGUgcnVtYWduXHUwMGYybCwgRW5nbGlzaCwgRXNwZXJhbnRvLCBFc3BhXHUwMGYxb2wsIEVlc3RpLCBFdXNrYXJhLCBcdTA2NDFcdTA2MjdcdTA2MzFcdTA2MzNcdTA2Y2MsIFN1b21pLCBWXHUwMGY1cm8sIEZcdTAwZjhyb3lza3QsIEZyYW5cdTAwZTdhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIFx1OGQxYlx1OGE5ZSwgR1x1MDBlMGlkaGxpZywgR2FsZWdvLCBBdmFcdTAwZjFlXCdcdTFlYmQsIFx1MGE5N1x1MGFjMVx1MGE5Y1x1MGFiMFx1MGFiZVx1MGFhNFx1MGFjMCwgR2FlbGcsIFx1MDVlMlx1MDVkMVx1MDVlOFx1MDVkOVx1MDVlYSwgXHUwOTM5XHUwOTNmXHUwOTI4XHUwOTRkXHUwOTI2XHUwOTQwLCBGaWppIEhpbmRpLCBIcnZhdHNraSwgS3JleVx1MDBmMmwgYXlpc3llbiwgTWFneWFyLCBcdTA1NDBcdTA1NjFcdTA1NzVcdTA1NjVcdTA1ODBcdTA1NjVcdTA1NzYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCBJbG9rYW5vLCBJZG8sIFx1MDBjZHNsZW5za2EsIEl0YWxpYW5vLCBcdTY1ZTVcdTY3MmNcdThhOWUsIExvamJhbiwgQmFzYSBKYXdhLCBcdTEwZTVcdTEwZDBcdTEwZTBcdTEwZDdcdTEwZTNcdTEwZGFcdTEwZDgsIEtvbmdvLCBLYWxhYWxsaXN1dCwgXHUwYzk1XHUwY2E4XHUwY2NkXHUwY2E4XHUwY2ExLCBcdWQ1NWNcdWFkNmRcdWM1YjQsIFx1MDQxYVx1MDQ0YVx1MDQzMFx1MDQ0MFx1MDQzMFx1MDQ0N1x1MDQzMFx1MDQzOS1cdTA0MWNcdTA0MzBcdTA0M2JcdTA0M2FcdTA0NGFcdTA0MzBcdTA0NDAsIFJpcG9hcmlzY2gsIEt1cmRcdTAwZWUsIFx1MDQxYVx1MDQzZVx1MDQzY1x1MDQzOCwgS2VybmV3ZWssIFx1MDQxYVx1MDQ0Ylx1MDQ0MFx1MDQzM1x1MDQ0Ylx1MDQzN1x1MDQ0N1x1MDQzMCwgTGF0aW5hLCBMYWRpbm8sIExcdTAwZWJ0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nXHUwMGUxbGEsIFx1MGVhNVx1MGViMlx1MGVhNywgTGlldHV2aVx1MDE3MywgTGF0dmllXHUwMTYxdSwgQmFzYSBCYW55dW1hc2FuLCBNYWxhZ2FzeSwgXHUwNDFjXHUwNDMwXHUwNDNhXHUwNDM1XHUwNDM0XHUwNDNlXHUwNDNkXHUwNDQxXHUwNDNhXHUwNDM4LCBcdTBkMmVcdTBkMzJcdTBkMmZcdTBkM2VcdTBkMzNcdTBkMDIsIFx1MDkyZVx1MDkzMFx1MDkzZVx1MDkyMFx1MDk0MCwgQmFoYXNhIE1lbGF5dSwgXHUwNjQ1XHUwNjI3XHUwNjMyXHUwNjUwXHUwNjMxXHUwNjQ4XHUwNjQ2XHUwNmNjLCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwgXHUwOTI4XHUwOTQ3XHUwOTJhXHUwOTNlXHUwOTMyIFx1MDkyZFx1MDkzZVx1MDkzN1x1MDkzZSwgTmVkZXJsYW5kcywgXHUyMDJhTm9yc2sgKG55bm9yc2spXHUyMDJjLCBcdTIwMmFOb3JzayAoYm9rbVx1MDBlNWwpXHUyMDJjLCBOb3Vvcm1hbmQsIERpblx1MDBlOSBiaXphYWQsIE9jY2l0YW4sIFx1MDQxOFx1MDQ0MFx1MDQzZVx1MDQzZFx1MDQzMFx1MDQ0MywgUGFwaWFtZW50dSwgRGVpdHNjaCwgTm9yZnVrIFwvIFBpdGtlcm4sIFBvbHNraSwgXHUwNjdlXHUwNjQ2XHUwNjJjXHUwNjI3XHUwNjI4XHUwNmNjLCBcdTA2N2VcdTA2OWFcdTA2MmFcdTA2NDgsIFBvcnR1Z3VcdTAwZWFzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb21cdTAwZTJuXHUwMTAzLCBcdTA0MjBcdTA0NDNcdTA0NDFcdTA0NDFcdTA0M2FcdTA0MzhcdTA0MzksIFx1MDQyMVx1MDQzMFx1MDQ0NVx1MDQzMCBcdTA0NDJcdTA0NGJcdTA0M2JcdTA0MzAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTXHUwMGUxbWVnaWVsbGEsIFNpbXBsZSBFbmdsaXNoLCBTbG92ZW5cdTAxMGRpbmEsIFNsb3Zlblx1MDE2MVx1MDEwZGluYSwgXHUwNDIxXHUwNDQwXHUwNDNmXHUwNDQxXHUwNDNhXHUwNDM4IFwvIFNycHNraSwgU2VlbHRlcnNrLCBTdmVuc2thLCBLaXN3YWhpbGksIFx1MGJhNFx1MGJhZVx1MGJiZlx1MGJiNFx1MGJjZCwgXHUwYzI0XHUwYzQ2XHUwYzMyXHUwYzQxXHUwYzE3XHUwYzQxLCBcdTA0MjJcdTA0M2VcdTA0YjdcdTA0MzhcdTA0M2FcdTA0ZTMsIFx1MGU0NFx1MGUxN1x1MGUyMiwgVFx1MDBmY3JrbWVuXHUwMGU3ZSwgVGFnYWxvZywgVFx1MDBmY3JrXHUwMGU3ZSwgXHUwNDIyXHUwNDMwXHUwNDQyXHUwNDMwXHUwNDQwXHUwNDQ3XHUwNDMwXC9UYXRhclx1MDBlN2EsIFx1MDQyM1x1MDQzYVx1MDQ0MFx1MDQzMFx1MDQ1N1x1MDQzZFx1MDQ0MVx1MDQ0Y1x1MDQzYVx1MDQzMCwgXHUwNjI3XHUwNjMxXHUwNjJmXHUwNjQ4LCBUaVx1MWViZm5nIFZpXHUxZWM3dCwgVm9sYXBcdTAwZmNrLCBXYWxvbiwgV2luYXJheSwgXHU1NDM0XHU4YmVkLCBpc2lYaG9zYSwgXHUwNWQ5XHUwNWQ5XHUwNWI0XHUwNWQzXHUwNWQ5XHUwNWU5LCBZb3JcdTAwZjliXHUwMGUxLCBaZVx1MDBlYXV3cywgXHU0ZTJkXHU2NTg3LCBCXHUwMGUybi1sXHUwMGUybS1nXHUwMGZhLCBcdTdjYjVcdThhOWUifSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZzInXSA9ICd7InRoaW5nIjoicXVvdGU6IFxcXFxcIiBiYWNrc2xhc2g6IGZvcndhcmRzbGFzaC1lc2NhcGVkOiBcXFxcXC8gIGJhY2tzcGFjZTogXFxcXGIgZm9ybWZlZWQ6IFxmIG5ld2xpbmU6IFxuIHJldHVybjogXHIgdGFiOiAgbm93LWFsbC1vZi10aGVtLXRvZ2V0aGVyOiBcIlxcXFxcXFxcXC9cXFxcYlxuXHJcdCBub3ctYS1idW5jaC1vZi1qdW5rOiAhQCMkJSYoKSgmJSQje317fTw+PD48In0nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3REb3VibGUnXSA9ICd7InRoaW5nIjozLjE0MTU5MjY1MzU4OTh9JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0Qnl0ZSddID0gJ3sidGhpbmciOjF9JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0STMyJ10gPSAneyJ0aGluZyI6MTA3Mzc0MTgyNH0nOworCisgICAgICAgIGlmIChQSFBfSU5UX1NJWkUgPT0gOCkgeworICAgICAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdEk2NCddID0gJ3sidGhpbmciOicgLiBwb3coMiwgNjApIC4gJ30nOworICAgICAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cnVjdCddID0gJ3sidGhpbmciOnsic3RyaW5nX3RoaW5nIjoid29ya2VkIiwiYnl0ZV90aGluZyI6MSwiaTMyX3RoaW5nIjoxMDczNzQxODI0LCJpNjRfdGhpbmciOicgLiBwb3coMiwgNjApIC4gJ319JzsKKyAgICAgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3ROZXN0J10gPSAneyJ0aGluZyI6eyJieXRlX3RoaW5nIjoxLCJzdHJ1Y3RfdGhpbmciOnsic3RyaW5nX3RoaW5nIjoid29ya2VkIiwiYnl0ZV90aGluZyI6MSwiaTMyX3RoaW5nIjoxMDczNzQxODI0LCJpNjRfdGhpbmciOicgLiBwb3coMiwgNjApIC4gJ30sImkzMl90aGluZyI6MzI3Njh9fSc7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0STY0J10gPSAneyJ0aGluZyI6MTE1MjkyMTUwNDYwNjg0NzAwMH0nOworCisgICAgICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RydWN0J10gPSAneyJ0aGluZyI6eyJzdHJpbmdfdGhpbmciOiJ3b3JrZWQiLCJieXRlX3RoaW5nIjoxLCJpMzJfdGhpbmciOjEwNzM3NDE4MjQsImk2NF90aGluZyI6MTE1MjkyMTUwNDYwNjg0NzAwMH19JzsKKyAgICAgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3ROZXN0J10gPSAneyJ0aGluZyI6eyJieXRlX3RoaW5nIjoxLCJzdHJ1Y3RfdGhpbmciOnsic3RyaW5nX3RoaW5nIjoid29ya2VkIiwiYnl0ZV90aGluZyI6MSwiaTMyX3RoaW5nIjoxMDczNzQxODI0LCJpNjRfdGhpbmciOjExNTI5MjE1MDQ2MDY4NDcwMDB9LCJpMzJfdGhpbmciOjMyNzY4fX0nOworICAgICAgICB9CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdE1hcCddID0gJ3sidGhpbmciOnsiNyI6NzcsIjgiOjg4LCI5Ijo5OX19JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nTWFwJ10gPSAneyJ0aGluZyI6eyJhIjoiMTIzIiwiYSBiIjoid2l0aCBzcGFjZXMgIiwic2FtZSI6InNhbWUiLCIwIjoibnVtZXJpYyBrZXkiLCJsb25nVmFsdWUiOiJBZnJpa2FhbnMsIEFsZW1hbm5pc2NoLCBBcmFnb25cdTAwZTlzLCBcdTA2MjdcdTA2NDRcdTA2MzlcdTA2MzFcdTA2MjhcdTA2NGFcdTA2MjksIFx1MDY0NVx1MDYzNVx1MDYzMVx1MDY0OSwgQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6XHUwMjU5cmJheWNhbiwgXHUwNDExXHUwNDMwXHUwNDQ4XHUwNGExXHUwNDNlXHUwNDQwXHUwNDQyLCBCb2FyaXNjaCwgXHUwMTdkZW1haXRcdTAxMTdcdTAxNjFrYSwgXHUwNDExXHUwNDM1XHUwNDNiXHUwNDMwXHUwNDQwXHUwNDQzXHUwNDQxXHUwNDNhXHUwNDMwXHUwNDRmLCBcdTA0MTFcdTA0MzVcdTA0M2JcdTA0MzBcdTA0NDBcdTA0NDNcdTA0NDFcdTA0M2FcdTA0MzBcdTA0NGYgKFx1MDQ0Mlx1MDQzMFx1MDQ0MFx1MDQzMFx1MDQ0OFx1MDQzYVx1MDQzNVx1MDQzMlx1MDQ1Nlx1MDQ0Nlx1MDQzMCksIFx1MDQxMVx1MDQ0YVx1MDQzYlx1MDQzM1x1MDQzMFx1MDQ0MFx1MDQ0MVx1MDQzYVx1MDQzOCwgQmFtYW5hbmthbiwgXHUwOWFjXHUwOWJlXHUwOTgyXHUwOWIyXHUwOWJlLCBCcmV6aG9uZWcsIEJvc2Fuc2tpLCBDYXRhbFx1MDBlMCwgTVx1MDBlY25nLWRcdTAxMTVcdTAzMjRuZy1uZ1x1MWU3M1x1MDMwNCwgXHUwNDFkXHUwNDNlXHUwNDQ1XHUwNDQ3XHUwNDM4XHUwNDM5XHUwNDNkLCBDZWJ1YW5vLCBcdTEzZTNcdTEzYjNcdTEzYTksIFx1MDEwY2Vza3ksIFx1MDQyMVx1MDQzYlx1MDQzZVx1MDQzMlx1MDQ2M1x1MDMwMVx1MDQzZFx1MDQ0Y1x1MDQ0MVx1MDQzYVx1MDQ0YSBcLyBcdTJjMTRcdTJjMGVcdTJjMTFcdTJjMDJcdTJjMjFcdTJjMTBcdTJjMjBcdTJjMTRcdTJjMGRcdTJjMWYsIFx1MDQyN1x1MDRkMVx1MDQzMlx1MDQzMFx1MDQ0OFx1MDQzYlx1MDQzMCwgQ3ltcmFlZywgRGFuc2ssIFphemFraSwgXHUwNzhiXHUwN2E4XHUwNzg4XHUwN2FjXHUwNzgwXHUwN2E4XHUwNzg0XHUwN2E2XHUwNzkwXHUwN2IwLCBcdTAzOTVcdTAzYmJcdTAzYmJcdTAzYjdcdTAzYmRcdTAzYjlcdTAzYmFcdTAzYWMsIEVtaWxpXHUwMGUwbiBlIHJ1bWFnblx1MDBmMmwsIEVuZ2xpc2gsIEVzcGVyYW50bywgRXNwYVx1MDBmMW9sLCBFZXN0aSwgRXVza2FyYSwgXHUwNjQxXHUwNjI3XHUwNjMxXHUwNjMzXHUwNmNjLCBTdW9taSwgVlx1MDBmNXJvLCBGXHUwMGY4cm95c2t0LCBGcmFuXHUwMGU3YWlzLCBBcnBldGFuLCBGdXJsYW4sIEZyeXNrLCBHYWVpbGdlLCBcdThkMWJcdThhOWUsIEdcdTAwZTBpZGhsaWcsIEdhbGVnbywgQXZhXHUwMGYxZVwnXHUxZWJkLCBcdTBhOTdcdTBhYzFcdTBhOWNcdTBhYjBcdTBhYmVcdTBhYTRcdTBhYzAsIEdhZWxnLCBcdTA1ZTJcdTA1ZDFcdTA1ZThcdTA1ZDlcdTA1ZWEsIFx1MDkzOVx1MDkzZlx1MDkyOFx1MDk0ZFx1MDkyNlx1MDk0MCwgRmlqaSBIaW5kaSwgSHJ2YXRza2ksIEtyZXlcdTAwZjJsIGF5aXN5ZW4sIE1hZ3lhciwgXHUwNTQwXHUwNTYxXHUwNTc1XHUwNTY1XHUwNTgwXHUwNTY1XHUwNTc2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwgSWxva2FubywgSWRvLCBcdTAwY2RzbGVuc2thLCBJdGFsaWFubywgXHU2NWU1XHU2NzJjXHU4YTllLCBMb2piYW4sIEJhc2EgSmF3YSwgXHUxMGU1XHUxMGQwXHUxMGUwXHUxMGQ3XHUxMGUzXHUxMGRhXHUxMGQ4LCBLb25nbywgS2FsYWFsbGlzdXQsIFx1MGM5NVx1MGNhOFx1MGNjZFx1MGNhOFx1MGNhMSwgXHVkNTVjXHVhZDZkXHVjNWI0LCBcdTA0MWFcdTA0NGFcdTA0MzBcdTA0NDBcdTA0MzBcdTA0NDdcdTA0MzBcdTA0MzktXHUwNDFjXHUwNDMwXHUwNDNiXHUwNDNhXHUwNDRhXHUwNDMwXHUwNDQwLCBSaXBvYXJpc2NoLCBLdXJkXHUwMGVlLCBcdTA0MWFcdTA0M2VcdTA0M2NcdTA0MzgsIEtlcm5ld2VrLCBcdTA0MWFcdTA0NGJcdTA0NDBcdTA0MzNcdTA0NGJcdTA0MzdcdTA0NDdcdTA0MzAsIExhdGluYSwgTGFkaW5vLCBMXHUwMGVidHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ1x1MDBlMWxhLCBcdTBlYTVcdTBlYjJcdTBlYTcsIExpZXR1dmlcdTAxNzMsIExhdHZpZVx1MDE2MXUsIEJhc2EgQmFueXVtYXNhbiwgTWFsYWdhc3ksIFx1MDQxY1x1MDQzMFx1MDQzYVx1MDQzNVx1MDQzNFx1MDQzZVx1MDQzZFx1MDQ0MVx1MDQzYVx1MDQzOCwgXHUwZDJlXHUwZDMyXHUwZDJmXHUwZDNlXHUwZDMzXHUwZDAyLCBcdTA5MmVcdTA5MzBcdTA5M2VcdTA5MjBcdTA5NDAsIEJhaGFzYSBNZWxheXUsIFx1MDY0NVx1MDYyN1x1MDYzMlx1MDY1MFx1MDYzMVx1MDY0OFx1MDY0Nlx1MDZjYywgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIFx1MDkyOFx1MDk0N1x1MDkyYVx1MDkzZVx1MDkzMiBcdTA5MmRcdTA5M2VcdTA5MzdcdTA5M2UsIE5lZGVybGFuZHMsIFx1MjAyYU5vcnNrIChueW5vcnNrKVx1MjAyYywgXHUyMDJhTm9yc2sgKGJva21cdTAwZTVsKVx1MjAyYywgTm91b3JtYW5kLCBEaW5cdTAwZTkgYml6YWFkLCBPY2NpdGFuLCBcdTA0MThcdTA0NDBcdTA0M2VcdTA0M2RcdTA0MzBcdTA0NDMsIFBhcGlhbWVudHUsIERlaXRzY2gsIE5vcmZ1ayBcLyBQaXRrZXJuLCBQb2xza2ksIFx1MDY3ZVx1MDY0Nlx1MDYyY1x1MDYyN1x1MDYyOFx1MDZjYywgXHUwNjdlXHUwNjlhXHUwNjJhXHUwNjQ4LCBQb3J0dWd1XHUwMGVhcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tXHUwMGUyblx1MDEwMywgXHUwNDIwXHUwNDQzXHUwNDQxXHUwNDQxXHUwNDNhXHUwNDM4XHUwNDM5LCBcdTA0MjFcdTA0MzBcdTA0NDVcdTA0MzAgXHUwNDQyXHUwNDRiXHUwNDNiXHUwNDMwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU1x1MDBlMW1lZ2llbGxhLCBTaW1wbGUgRW5nbGlzaCwgU2xvdmVuXHUwMTBkaW5hLCBTbG92ZW5cdTAxNjFcdTAxMGRpbmEsIFx1MDQyMVx1MDQ0MFx1MDQzZlx1MDQ0MVx1MDQzYVx1MDQzOCBcLyBTcnBza2ksIFNlZWx0ZXJzaywgU3ZlbnNrYSwgS2lzd2FoaWxpLCBcdTBiYTRcdTBiYWVcdTBiYmZcdTBiYjRcdTBiY2QsIFx1MGMyNFx1MGM0Nlx1MGMzMlx1MGM0MVx1MGMxN1x1MGM0MSwgXHUwNDIyXHUwNDNlXHUwNGI3XHUwNDM4XHUwNDNhXHUwNGUzLCBcdTBlNDRcdTBlMTdcdTBlMjIsIFRcdTAwZmNya21lblx1MDBlN2UsIFRhZ2Fsb2csIFRcdTAwZmNya1x1MDBlN2UsIFx1MDQyMlx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQ0MFx1MDQ0N1x1MDQzMFwvVGF0YXJcdTAwZTdhLCBcdTA0MjNcdTA0M2FcdTA0NDBcdTA0MzBcdTA0NTdcdTA0M2RcdTA0NDFcdTA0NGNcdTA0M2FcdTA0MzAsIFx1MDYyN1x1MDYzMVx1MDYyZlx1MDY0OCwgVGlcdTFlYmZuZyBWaVx1MWVjN3QsIFZvbGFwXHUwMGZjaywgV2Fsb24sIFdpbmFyYXksIFx1NTQzNFx1OGJlZCwgaXNpWGhvc2EsIFx1MDVkOVx1MDVkOVx1MDViNFx1MDVkM1x1MDVkOVx1MDVlOSwgWW9yXHUwMGY5Ylx1MDBlMSwgWmVcdTAwZWF1d3MsIFx1NGUyZFx1NjU4NywgQlx1MDBlMm4tbFx1MDBlMm0tZ1x1MDBmYSwgXHU3Y2I1XHU4YTllIiwiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uXHUwMGU5cywgXHUwNjI3XHUwNjQ0XHUwNjM5XHUwNjMxXHUwNjI4XHUwNjRhXHUwNjI5LCBcdTA2NDVcdTA2MzVcdTA2MzFcdTA2NDksIEFzdHVyaWFudSwgQXltYXIgYXJ1LCBBelx1MDI1OXJiYXljYW4sIFx1MDQxMVx1MDQzMFx1MDQ0OFx1MDRhMVx1MDQzZVx1MDQ0MFx1MDQ0MiwgQm9hcmlzY2gsIFx1MDE3ZGVtYWl0XHUwMTE3XHUwMTYxa2EsIFx1MDQxMVx1MDQzNVx1MDQzYlx1MDQzMFx1MDQ0MFx1MDQ0M1x1MDQ0MVx1MDQzYVx1MDQzMFx1MDQ0ZiwgXHUwNDExXHUwNDM1XHUwNDNiXHUwNDMwXHUwNDQwXHUwNDQzXHUwNDQxXHUwNDNhXHUwNDMwXHUwNDRmIChcdTA0NDJcdTA0MzBcdTA0NDBcdTA0MzBcdTA0NDhcdTA0M2FcdTA0MzVcdTA0MzJcdTA0NTZcdTA0NDZcdTA0MzApLCBcdTA0MTFcdTA0NGFcdTA0M2JcdTA0MzNcdTA0MzBcdTA0NDBcdTA0NDFcdTA0M2FcdTA0MzgsIEJhbWFuYW5rYW4sIFx1MDlhY1x1MDliZVx1MDk4Mlx1MDliMlx1MDliZSwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWxcdTAwZTAsIE1cdTAwZWNuZy1kXHUwMTE1XHUwMzI0bmctbmdcdTFlNzNcdTAzMDQsIFx1MDQxZFx1MDQzZVx1MDQ0NVx1MDQ0N1x1MDQzOFx1MDQzOVx1MDQzZCwgQ2VidWFubywgXHUxM2UzXHUxM2IzXHUxM2E5LCBcdTAxMGNlc2t5LCBcdTA0MjFcdTA0M2JcdTA0M2VcdTA0MzJcdTA0NjNcdTAzMDFcdTA0M2RcdTA0NGNcdTA0NDFcdTA0M2FcdTA0NGEgXC8gXHUyYzE0XHUyYzBlXHUyYzExXHUyYzAyXHUyYzIxXHUyYzEwXHUyYzIwXHUyYzE0XHUyYzBkXHUyYzFmLCBcdTA0MjdcdTA0ZDFcdTA0MzJcdTA0MzBcdTA0NDhcdTA0M2JcdTA0MzAsIEN5bXJhZWcsIERhbnNrLCBaYXpha2ksIFx1MDc4Ylx1MDdhOFx1MDc4OFx1MDdhY1x1MDc4MFx1MDdhOFx1MDc4NFx1MDdhNlx1MDc5MFx1MDdiMCwgXHUwMzk1XHUwM2JiXHUwM2JiXHUwM2I3XHUwM2JkXHUwM2I5XHUwM2JhXHUwM2FjLCBFbWlsaVx1MDBlMG4gZSBydW1hZ25cdTAwZjJsLCBFbmdsaXNoLCBFc3BlcmFudG8sIEVzcGFcdTAwZjFvbCwgRWVzdGksIEV1c2thcmEsIFx1MDY0MVx1MDYyN1x1MDYzMVx1MDYzM1x1MDZjYywgU3VvbWksIFZcdTAwZjVybywgRlx1MDBmOHJveXNrdCwgRnJhblx1MDBlN2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwgXHU4ZDFiXHU4YTllLCBHXHUwMGUwaWRobGlnLCBHYWxlZ28sIEF2YVx1MDBmMWVcJ1x1MWViZCwgXHUwYTk3XHUwYWMxXHUwYTljXHUwYWIwXHUwYWJlXHUwYWE0XHUwYWMwLCBHYWVsZywgXHUwNWUyXHUwNWQxXHUwNWU4XHUwNWQ5XHUwNWVhLCBcdTA5MzlcdTA5M2ZcdTA5MjhcdTA5NGRcdTA5MjZcdTA5NDAsIEZpamkgSGluZGksIEhydmF0c2tpLCBLcmV5XHUwMGYybCBheWlzeWVuLCBNYWd5YXIsIFx1MDU0MFx1MDU2MVx1MDU3NVx1MDU2NVx1MDU4MFx1MDU2NVx1MDU3NiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsIElsb2thbm8sIElkbywgXHUwMGNkc2xlbnNrYSwgSXRhbGlhbm8sIFx1NjVlNVx1NjcyY1x1OGE5ZSwgTG9qYmFuLCBCYXNhIEphd2EsIFx1MTBlNVx1MTBkMFx1MTBlMFx1MTBkN1x1MTBlM1x1MTBkYVx1MTBkOCwgS29uZ28sIEthbGFhbGxpc3V0LCBcdTBjOTVcdTBjYThcdTBjY2RcdTBjYThcdTBjYTEsIFx1ZDU1Y1x1YWQ2ZFx1YzViNCwgXHUwNDFhXHUwNDRhXHUwNDMwXHUwNDQwXHUwNDMwXHUwNDQ3XHUwNDMwXHUwNDM5LVx1MDQxY1x1MDQzMFx1MDQzYlx1MDQzYVx1MDQ0YVx1MDQzMFx1MDQ0MCwgUmlwb2FyaXNjaCwgS3VyZFx1MDBlZSwgXHUwNDFhXHUwNDNlXHUwNDNjXHUwNDM4LCBLZXJuZXdlaywgXHUwNDFhXHUwNDRiXHUwNDQwXHUwNDMzXHUwNDRiXHUwNDM3XHUwNDQ3XHUwNDMwLCBMYXRpbmEsIExhZGlubywgTFx1MDBlYnR6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmdcdTAwZTFsYSwgXHUwZWE1XHUwZWIyXHUwZWE3LCBMaWV0dXZpXHUwMTczLCBMYXR2aWVcdTAxNjF1LCBCYXNhIEJhbnl1bWFzYW4sIE1hbGFnYXN5LCBcdTA0MWNcdTA0MzBcdTA0M2FcdTA0MzVcdTA0MzRcdTA0M2VcdTA0M2RcdTA0NDFcdTA0M2FcdTA0MzgsIFx1MGQyZVx1MGQzMlx1MGQyZlx1MGQzZVx1MGQzM1x1MGQwMiwgXHUwOTJlXHUwOTMwXHUwOTNlXHUwOTIwXHUwOTQwLCBCYWhhc2EgTWVsYXl1LCBcdTA2NDVcdTA2MjdcdTA2MzJcdTA2NTBcdTA2MzFcdTA2NDhcdTA2NDZcdTA2Y2MsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCBcdTA5MjhcdTA5NDdcdTA5MmFcdTA5M2VcdTA5MzIgXHUwOTJkXHUwOTNlXHUwOTM3XHUwOTNlLCBOZWRlcmxhbmRzLCBcdTIwMmFOb3JzayAobnlub3JzaylcdTIwMmMsIFx1MjAyYU5vcnNrIChib2ttXHUwMGU1bClcdTIwMmMsIE5vdW9ybWFuZCwgRGluXHUwMGU5IGJpemFhZCwgT2NjaXRhbiwgXHUwNDE4XHUwNDQwXHUwNDNlXHUwNDNkXHUwNDMwXHUwNDQzLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBOb3JmdWsgXC8gUGl0a2VybiwgUG9sc2tpLCBcdTA2N2VcdTA2NDZcdTA2MmNcdTA2MjdcdTA2MjhcdTA2Y2MsIFx1MDY3ZVx1MDY5YVx1MDYyYVx1MDY0OCwgUG9ydHVndVx1MDBlYXMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbVx1MDBlMm5cdTAxMDMsIFx1MDQyMFx1MDQ0M1x1MDQ0MVx1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzOSwgXHUwNDIxXHUwNDMwXHUwNDQ1XHUwNDMwIFx1MDQ0Mlx1MDQ0Ylx1MDQzYlx1MDQzMCwgU2FyZHUsIFNpY2lsaWFudSwgU2NvdHMsIFNcdTAwZTFtZWdpZWxsYSwgU2ltcGxlIEVuZ2xpc2gsIFNsb3Zlblx1MDEwZGluYSwgU2xvdmVuXHUwMTYxXHUwMTBkaW5hLCBcdTA0MjFcdTA0NDBcdTA0M2ZcdTA0NDFcdTA0M2FcdTA0MzggXC8gU3Jwc2tpLCBTZWVsdGVyc2ssIFN2ZW5za2EsIEtpc3dhaGlsaSwgXHUwYmE0XHUwYmFlXHUwYmJmXHUwYmI0XHUwYmNkLCBcdTBjMjRcdTBjNDZcdTBjMzJcdTBjNDFcdTBjMTdcdTBjNDEsIFx1MDQyMlx1MDQzZVx1MDRiN1x1MDQzOFx1MDQzYVx1MDRlMywgXHUwZTQ0XHUwZTE3XHUwZTIyLCBUXHUwMGZjcmttZW5cdTAwZTdlLCBUYWdhbG9nLCBUXHUwMGZjcmtcdTAwZTdlLCBcdTA0MjJcdTA0MzBcdTA0NDJcdTA0MzBcdTA0NDBcdTA0NDdcdTA0MzBcL1RhdGFyXHUwMGU3YSwgXHUwNDIzXHUwNDNhXHUwNDQwXHUwNDMwXHUwNDU3XHUwNDNkXHUwNDQxXHUwNDRjXHUwNDNhXHUwNDMwLCBcdTA2MjdcdTA2MzFcdTA2MmZcdTA2NDgsIFRpXHUxZWJmbmcgVmlcdTFlYzd0LCBWb2xhcFx1MDBmY2ssIFdhbG9uLCBXaW5hcmF5LCBcdTU0MzRcdThiZWQsIGlzaVhob3NhLCBcdTA1ZDlcdTA1ZDlcdTA1YjRcdTA1ZDNcdTA1ZDlcdTA1ZTksIFlvclx1MDBmOWJcdTAwZTEsIFplXHUwMGVhdXdzLCBcdTRlMmRcdTY1ODcsIEJcdTAwZTJuLWxcdTAwZTJtLWdcdTAwZmEsIFx1N2NiNVx1OGE5ZSI6Imxvbmcga2V5In19JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0U2V0J10gPSAneyJ0aGluZyI6WzEsNSw2XX0nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RMaXN0J10gPSAneyJ0aGluZyI6WzEsMiwzXX0nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RFbnVtJ10gPSAneyJ0aGluZyI6MX0nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RUeXBlZGVmJ10gPSAneyJ0aGluZyI6Njl9JzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL3Rlc3QvUHJvdG9jb2wvVFNpbXBsZUpTT05Qcm90b2NvbFRlc3QucGhwIGIvbGliL3BocC90ZXN0L1Byb3RvY29sL1RTaW1wbGVKU09OUHJvdG9jb2xUZXN0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGExMzczCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC90ZXN0L1Byb3RvY29sL1RTaW1wbGVKU09OUHJvdG9jb2xUZXN0LnBocApAQCAtMCwwICsxLDI1NCBAQAorPD9waHAKKworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudGVzdAorICovCisKK25hbWVzcGFjZSBUZXN0XFRocmlmdFxQcm90b2NvbDsKKwordXNlIFBIUFVuaXRcRnJhbWV3b3JrXFRlc3RDYXNlOwordXNlIFRlc3RcVGhyaWZ0XEZpeHR1cmVzOwordXNlIFRocmlmdFxQcm90b2NvbFxUU2ltcGxlSlNPTlByb3RvY29sOwordXNlIFRocmlmdFxUcmFuc3BvcnRcVE1lbW9yeUJ1ZmZlcjsKKworcmVxdWlyZSBfX0RJUl9fIC4gJy8uLi8uLi8uLi8uLi92ZW5kb3IvYXV0b2xvYWQucGhwJzsKKworLyoqKgorICogVGhpcyB0ZXN0IHN1aXRlIGRlcGVuZHMgb24gcnVubmluZyB0aGUgY29tcGlsZXIgYWdhaW5zdCB0aGUKKyAqIHN0YW5kYXJkIFRocmlmdFRlc3QudGhyaWZ0IGZpbGU6CisgKgorICogbGliL3BocC90ZXN0JCAuLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC0tZ2VuIHBocCAtciBcCisgKiAgIC0tb3V0IC4vcGFja2FnZXMgLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorICoKKyAqIEBydW5UZXN0c0luU2VwYXJhdGVQcm9jZXNzZXMKKyAqLworY2xhc3MgVFNpbXBsZUpTT05Qcm90b2NvbFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZQoreworICAgIHByaXZhdGUgJHRyYW5zcG9ydDsKKyAgICBwcml2YXRlICRwcm90b2NvbDsKKworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2V0VXBCZWZvcmVDbGFzcygpCisgICAgeworCisgICAgICAgIC8qKiBAdmFyIFxDb21wb3NlclxBdXRvbG9hZFxDbGFzc0xvYWRlciAkbG9hZGVyICovCisgICAgICAgICRsb2FkZXIgPSByZXF1aXJlIF9fRElSX18gLiAnLy4uLy4uLy4uLy4uL3ZlbmRvci9hdXRvbG9hZC5waHAnOworICAgICAgICAkbG9hZGVyLT5hZGRQc3I0KCcnLCBfX0RJUl9fIC4gJy8uLi9wYWNrYWdlcy9waHAnKTsKKworICAgICAgICBGaXh0dXJlczo6cG9wdWxhdGVUZXN0QXJncygpOworICAgICAgICBUU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXM6OnBvcHVsYXRlVGVzdEFyZ3NTaW1wbGVKU09OKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHNldFVwKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQgPSBuZXcgVE1lbW9yeUJ1ZmZlcigpOworICAgICAgICAkdGhpcy0+cHJvdG9jb2wgPSBuZXcgVFNpbXBsZUpTT05Qcm90b2NvbCgkdGhpcy0+dHJhbnNwb3J0KTsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydC0+b3BlbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdSSVRFIFRFU1RTCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RWb2lkV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0Vm9pZF9hcmdzKCk7CisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRTaW1wbGVKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFZvaWQnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJpbmcxV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U3RyaW5nX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFN0cmluZzEnXTsKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVFNpbXBsZUpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nMSddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cmluZzJXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTdHJpbmdfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nMiddOworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmcyJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0RG91YmxlV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0RG91YmxlX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdERvdWJsZSddOworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3REb3VibGUnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RCeXRlV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0Qnl0ZV9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RCeXRlJ107CisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRTaW1wbGVKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEJ5dGUnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RJMzJXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RJMzJfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0STMyJ107CisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRTaW1wbGVKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEkzMiddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEk2NFdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEk2NF9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RJNjQnXTsKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVFNpbXBsZUpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0STY0J107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RydWN0V3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U3RydWN0X2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFN0cnVjdCddOworCisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRTaW1wbGVKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cnVjdCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdE5lc3RXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3ROZXN0X2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdE5lc3QnXTsKKworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3ROZXN0J107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TWFwV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0TWFwX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdE1hcCddOworCisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRTaW1wbGVKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdE1hcCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cmluZ01hcFdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cmluZ01hcF9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmdNYXAnXTsKKworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmdNYXAnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTZXRXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTZXRfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U2V0J107CisKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVFNpbXBsZUpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U2V0J107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TGlzdFdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdExpc3RfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0TGlzdCddOworCisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRTaW1wbGVKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdExpc3QnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RFbnVtV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0RW51bV9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RFbnVtJ107CisKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVFNpbXBsZUpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0RW51bSddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFR5cGVkZWZXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RUeXBlZGVmX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFR5cGVkZWYnXTsKKworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RUeXBlZGVmJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvdGVzdC9UZXN0L1RocmlmdC9GaXh0dXJlcy5waHAgYi9saWIvcGhwL3Rlc3QvVGVzdC9UaHJpZnQvRml4dHVyZXMucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWQ0ODdmLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvdGVzdC9UZXN0L1RocmlmdC9GaXh0dXJlcy5waHAKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotPD9waHAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudGVzdAotICovCi0KLW5hbWVzcGFjZSBUZXN0XFRocmlmdDsKLQotdXNlIFRocmlmdFRlc3RcWHRydWN0OwotdXNlIFRocmlmdFRlc3RcWHRydWN0MjsKLXVzZSBUaHJpZnRUZXN0XE51bWJlcno7Ci11c2UgVGhyaWZ0VGVzdFxJbnNhbml0eTsKLQotY2xhc3MgRml4dHVyZXMKLXsKLSAgcHVibGljIHN0YXRpYyAkdGVzdEFyZ3MgPSBhcnJheSgpOwotCi0gIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcG9wdWxhdGVUZXN0QXJncygpCi0gIHsKLSAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmcxJ10gPSAiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uw6lzLCDYp9mE2LnYsdio2YrYqSwg2YXYtdix2YksIEFzdHVyaWFudSwgQXltYXIgYXJ1LCBBesmZcmJheWNhbiwg0JHQsNGI0qHQvtGA0YIsIEJvYXJpc2NoLCDFvWVtYWl0xJfFoWthLCDQkdC10LvQsNGA0YPRgdC60LDRjywg0JHQtdC70LDRgNGD0YHQutCw0Y8gKNGC0LDRgNCw0YjQutC10LLRltGG0LApLCDQkdGK0LvQs9Cw0YDRgdC60LgsIEJhbWFuYW5rYW4sIOCmrOCmvuCmguCmsuCmviwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWzDoCwgTcOsbmctZMSVzKRuZy1uZ+G5s8yELCDQndC+0YXRh9C40LnQvSwgQ2VidWFubywg4Y+j4Y6z4Y6pLCDEjGVza3ksINCh0LvQvtCy0aPMgdC90YzRgdC60YogLyDisJTisI7isJHisILisKHisJDisKDisJTisI3isJ8sINCn05HQstCw0YjQu9CwLCBDeW1yYWVnLCBEYW5zaywgWmF6YWtpLCDei96o3ojerN6A3qjehN6m3pDesCwgzpXOu867zrfOvc65zrrOrCwgRW1pbGnDoG4gZSBydW1hZ27DsmwsIEVuZ2xpc2gsIEVzcGVyYW50bywgRXNwYcOxb2wsIEVlc3RpLCBFdXNrYXJhLCDZgdin2LHYs9uMLCBTdW9taSwgVsO1cm8sIEbDuHJveXNrdCwgRnJhbsOnYWlzLCBBcnBldGFuLCBGdXJsYW4sIEZyeXNrLCBHYWVpbGdlLCDotJvoqp4sIEfDoGlkaGxpZywgR2FsZWdvLCBBdmHDsWUn4bq9LCDgqpfgq4HgqpzgqrDgqr7gqqTgq4AsIEdhZWxnLCDXoteR16jXmdeqLCDgpLngpL/gpKjgpY3gpKbgpYAsIEZpamkgSGluZGksIEhydmF0c2tpLCBLcmV5w7JsIGF5aXN5ZW4sIE1hZ3lhciwg1YDVodW11aXWgNWl1bYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCBJbG9rYW5vLCBJZG8sIMONc2xlbnNrYSwgSXRhbGlhbm8sIOaXpeacrOiqniwgTG9qYmFuLCBCYXNhIEphd2EsIOGDpeGDkOGDoOGDl+GDo+GDmuGDmCwgS29uZ28sIEthbGFhbGxpc3V0LCDgspXgsqjgs43gsqjgsqEsIO2VnOq1reyWtCwg0JrRitCw0YDQsNGH0LDQuS3QnNCw0LvQutGK0LDRgCwgUmlwb2FyaXNjaCwgS3VyZMOuLCDQmtC+0LzQuCwgS2VybmV3ZWssINCa0YvRgNCz0YvQt9GH0LAsIExhdGluYSwgTGFkaW5vLCBMw6t0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nw6FsYSwg4Lql4Lqy4LqnLCBMaWV0dXZpxbMsIExhdHZpZcWhdSwgQmFzYSBCYW55dW1hc2FuLCBNYWxhZ2FzeSwg0JzQsNC60LXQtNC+0L3RgdC60LgsIOC0ruC0suC0r+C0vuC0s+C0giwg4KSu4KSw4KS+4KSg4KWALCBCYWhhc2EgTWVsYXl1LCDZhdin2LLZkNix2YjZhtuMLCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwg4KSo4KWH4KSq4KS+4KSyIOCkreCkvuCkt+CkviwgTmVkZXJsYW5kcywg4oCqTm9yc2sgKG55bm9yc2sp4oCsLCDigKpOb3JzayAoYm9rbcOlbCnigKwsIE5vdW9ybWFuZCwgRGluw6kgYml6YWFkLCBPY2NpdGFuLCDQmNGA0L7QvdCw0YMsIFBhcGlhbWVudHUsIERlaXRzY2gsIE5vcmZ1ayAvIFBpdGtlcm4sIFBvbHNraSwg2b7Zhtis2KfYqNuMLCDZvtqa2KrZiCwgUG9ydHVndcOqcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tw6JuxIMsINCg0YPRgdGB0LrQuNC5LCDQodCw0YXQsCDRgtGL0LvQsCwgU2FyZHUsIFNpY2lsaWFudSwgU2NvdHMsIFPDoW1lZ2llbGxhLCBTaW1wbGUgRW5nbGlzaCwgU2xvdmVuxI1pbmEsIFNsb3ZlbsWhxI1pbmEsINCh0YDQv9GB0LrQuCAvIFNycHNraSwgU2VlbHRlcnNrLCBTdmVuc2thLCBLaXN3YWhpbGksIOCupOCuruCuv+CutOCvjSwg4LCk4LGG4LCy4LGB4LCX4LGBLCDQotC+0rfQuNC606MsIOC5hOC4l+C4oiwgVMO8cmttZW7Dp2UsIFRhZ2Fsb2csIFTDvHJrw6dlLCDQotCw0YLQsNGA0YfQsC9UYXRhcsOnYSwg0KPQutGA0LDRl9C90YHRjNC60LAsINin2LHYr9mILCBUaeG6v25nIFZp4buHdCwgVm9sYXDDvGssIFdhbG9uLCBXaW5hcmF5LCDlkLTor60sIGlzaVhob3NhLCDXmdeZ1rTXk9eZ16ksIFlvcsO5YsOhLCBaZcOqdXdzLCDkuK3mlocsIELDom4tbMOibS1nw7osIOeyteiqniI7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmcyJ10gPQotICAgICAgInF1b3RlOiBcXFwiIGJhY2tzbGFzaDoiIC4KLSAgICAgICIgZm9yd2FyZHNsYXNoLWVzY2FwZWQ6IFxcLyAiIC4KLSAgICAgICIgYmFja3NwYWNlOiBcYiBmb3JtZmVlZDogXGYgbmV3bGluZTogXG4gcmV0dXJuOiBcciB0YWI6ICIgLgotICAgICAgIiBub3ctYWxsLW9mLXRoZW0tdG9nZXRoZXI6IFwiXFxcL1xiXG5cclx0IiAuCi0gICAgICAiIG5vdy1hLWJ1bmNoLW9mLWp1bms6ICFAI1wkJSYoKSgmJSQje317fTw+PD48IjsKLQotICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdFN0cmluZzMnXSA9Ci0gICAgICAic3RyaW5nIHRoYXQgZW5kcyBpbiBkb3VibGUtYmFja3NsYXNoIFxcXFwiOwotCi0gICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0RG91YmxlJ10gPSAzLjE0MTU5MjY1MzU4OTg7Ci0KLQkvLyBUT0RPOiBhZGQgdGVzdEJpbmFyeSgpIGNhbGwKLQkKLSAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RCeXRlJ10gPSAweDAxOwotCi0gICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0STMyJ10gPSBwb3coIDIsIDMwICk7Ci0KLSAgICBpZiAoUEhQX0lOVF9TSVpFID09IDgpIHsKLSAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdEk2NCddID0gcG93KCAyLCA2MCApOwotICAgIH0gZWxzZSB7Ci0gICAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RJNjQnXSA9ICIxMTUyOTIxNTA0NjA2ODQ3MDAwIjsKLSAgICB9Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RTdHJ1Y3QnXSA9Ci0gICAgICBuZXcgWHRydWN0KAotICAgICAgICAgICAgYXJyYXkoCi0gICAgICAgICAgICAgICAgICAgICdzdHJpbmdfdGhpbmcnID0+ICd3b3JrZWQnLAotICAgICAgICAgICAgICAgICAgICAnYnl0ZV90aGluZycgPT4gMHgwMSwKLSAgICAgICAgICAgICAgICAgICAgJ2kzMl90aGluZycgPT4gcG93KCAyLCAzMCApLAotICAgICAgICAgICAgICAgICAgICAnaTY0X3RoaW5nJyA9PiBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RJNjQnXQotICAgICAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICApOwotCi0gICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0TmVzdE5lc3RlZCddID0KLSAgICAgIG5ldyBYdHJ1Y3QoCi0gICAgICAgICAgICBhcnJheSgKLSAgICAgICAgICAgICAgICAgICAgJ3N0cmluZ190aGluZycgPT4gJ3dvcmtlZCcsCi0gICAgICAgICAgICAgICAgICAgICdieXRlX3RoaW5nJyA9PiAweDAxLAotICAgICAgICAgICAgICAgICAgICAnaTMyX3RoaW5nJyA9PiBwb3coIDIsIDMwICksCi0gICAgICAgICAgICAgICAgICAgICdpNjRfdGhpbmcnID0+IHNlbGY6OiR0ZXN0QXJnc1sndGVzdEk2NCddCi0gICAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICk7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3ROZXN0J10gPQotICAgICAgbmV3IFh0cnVjdDIoCi0gICAgICAgICAgICBhcnJheSgKLSAgICAgICAgICAgICAgICAnYnl0ZV90aGluZycgPT4gMHgwMSwKLSAgICAgICAgICAgICAgICAnc3RydWN0X3RoaW5nJyA9PiBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3ROZXN0TmVzdGVkJ10sCi0gICAgICAgICAgICAgICAgJ2kzMl90aGluZycgPT4gcG93KCAyLCAxNSApCi0gICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgKTsKLQotICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdE1hcCddID0KLSAgICAgIGFycmF5KAotICAgICAgICAgICAgNyA9PiA3NywKLSAgICAgICAgICAgIDggPT4gODgsCi0gICAgICAgICAgICA5ID0+IDk5Ci0gICAgICAgICAgICApOwotCi0gICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nTWFwJ10gPQotICAgICAgYXJyYXkoCi0gICAgICAgICAgICAiYSIgPT4gIjEyMyIsCi0gICAgICAgICAgICAiYSBiIiA9PiAid2l0aCBzcGFjZXMgIiwKLSAgICAgICAgICAgICJzYW1lIiA9PiAic2FtZSIsCi0gICAgICAgICAgICAiMCIgPT4gIm51bWVyaWMga2V5IiwKLSAgICAgICAgICAgICJsb25nVmFsdWUiID0+IHNlbGY6OiR0ZXN0QXJnc1sndGVzdFN0cmluZzEnXSwKLSAgICAgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdFN0cmluZzEnXSA9PiAibG9uZyBrZXkiCi0gICAgICAgICAgICApOwotCi0gICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0U2V0J10gPSBhcnJheSggMSA9PiB0cnVlLCA1ID0+IHRydWUsIDYgPT4gdHJ1ZSApOwotCi0gICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0TGlzdCddID0gYXJyYXkoIDEsIDIsIDMgKTsKLQotICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdEVudW0nXSA9IE51bWJlcno6Ok9ORTsKLQotICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdFR5cGVkZWYnXSA9IDY5OwotCi0gICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0TWFwTWFwRXhwZWN0ZWRSZXN1bHQnXSA9Ci0gICAgICBhcnJheSgKLSAgICAgICAgICAgIDQgPT4gYXJyYXkoCi0gICAgICAgICAgICAgICAgICAgICAgIDEgPT4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgMiA9PiAyLAotICAgICAgICAgICAgICAgICAgICAgICAzID0+IDMsCi0gICAgICAgICAgICAgICAgICAgICAgIDQgPT4gNCwKLSAgICAgICAgICAgICAgICAgICAgICAgKSwKLSAgICAgICAgICAgIC00ID0+IGFycmF5KAotICAgICAgICAgICAgICAgICAgICAgICAgLTQgPT4gLTQsCi0gICAgICAgICAgICAgICAgICAgICAgICAtMyA9PiAtMywKLSAgICAgICAgICAgICAgICAgICAgICAgIC0yID0+IC0yLAotICAgICAgICAgICAgICAgICAgICAgICAgLTEgPT4gLTEKLSAgICAgICAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICk7Ci0KLSAgICAvLyB0ZXN0SW5zYW5pdHkgLi4uIHRha2VzIGEgZmV3IHN0ZXBzIHRvIHNldCB1cCEKLQotICAgICR4dHJ1Y3QxID0KLSAgICAgIG5ldyBYdHJ1Y3QoCi0gICAgICAgICAgICBhcnJheSgKLSAgICAgICAgICAgICAgICAnc3RyaW5nX3RoaW5nJyA9PiAnR29vZGJ5ZTQnLAotICAgICAgICAgICAgICAgICdieXRlX3RoaW5nJyA9PiA0LAotICAgICAgICAgICAgICAgICdpMzJfdGhpbmcnID0+IDQsCi0gICAgICAgICAgICAgICAgJ2k2NF90aGluZycgPT4gNAotICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICk7Ci0KLSAgICAkeHRydWN0MiA9Ci0gICAgICBuZXcgWHRydWN0KAotICAgICAgICAgICAgYXJyYXkoCi0gICAgICAgICAgICAgICAgJ3N0cmluZ190aGluZycgPT4gJ0hlbGxvMicsCi0gICAgICAgICAgICAgICAgJ2J5dGVfdGhpbmcnID0+MiwKLSAgICAgICAgICAgICAgICAnaTMyX3RoaW5nJyA9PiAyLAotICAgICAgICAgICAgICAgICdpNjRfdGhpbmcnID0+IDIKLSAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICApOwotCi0gICAgJHVzZXJNYXAgPQotICAgICAgYXJyYXkoCi0gICAgICAgICAgICBOdW1iZXJ6OjpGSVZFID0+IDUsCi0gICAgICAgICAgICBOdW1iZXJ6OjpFSUdIVCA9PiA4Ci0gICAgICAgICAgICApOwotCi0gICAgJGluc2FuaXR5MiA9Ci0gICAgICBuZXcgSW5zYW5pdHkoCi0gICAgICAgICAgICBhcnJheSgKLSAgICAgICAgICAgICAgICAndXNlck1hcCcgPT4gJHVzZXJNYXAsCi0gICAgICAgICAgICAgICAgJ3h0cnVjdHMnID0+IGFycmF5KCR4dHJ1Y3QxLCR4dHJ1Y3QyKQotICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICk7Ci0KLSAgICAkaW5zYW5pdHkzID0gJGluc2FuaXR5MjsKLQotICAgICRpbnNhbml0eTYgPQotICAgICAgbmV3IEluc2FuaXR5KAotICAgICAgICAgICAgYXJyYXkoCi0gICAgICAgICAgICAgICAgJ3VzZXJNYXAnID0+IG51bGwsCi0gICAgICAgICAgICAgICAgJ3h0cnVjdHMnID0+IG51bGwKLSAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICApOwotCi0gICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0SW5zYW5pdHlFeHBlY3RlZFJlc3VsdCddID0KLSAgICAgIGFycmF5KAotICAgICAgICAgICAgIjEiID0+IGFycmF5KAotICAgICAgICAgICAgICAgICAgICAgICAgIE51bWJlcno6OlRXTyA9PiAkaW5zYW5pdHkyLAotICAgICAgICAgICAgICAgICAgICAgICAgIE51bWJlcno6OlRIUkVFID0+ICRpbnNhbml0eTMKLSAgICAgICAgICAgICAgICAgICAgKSwKLSAgICAgICAgICAgICIyIiA9PiBhcnJheSgKLSAgICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXJ6OjpTSVggPT4gJGluc2FuaXR5NgotICAgICAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICApOwotCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvdGVzdC9UZXN0L1RocmlmdC9Kc29uU2VyaWFsaXplL0pzb25TZXJpYWxpemVUZXN0LnBocCBiL2xpYi9waHAvdGVzdC9UZXN0L1RocmlmdC9Kc29uU2VyaWFsaXplL0pzb25TZXJpYWxpemVUZXN0LnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAwMDNlZC4uMDAwMDAwMAotLS0gYS9saWIvcGhwL3Rlc3QvVGVzdC9UaHJpZnQvSnNvblNlcmlhbGl6ZS9Kc29uU2VyaWFsaXplVGVzdC5waHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotbmFtZXNwYWNlIFRlc3RcVGhyaWZ0XEpzb25TZXJpYWxpemU7Ci0KLXVzZSBzdGRDbGFzczsKLXVzZSBUaHJpZnRcQ2xhc3NMb2FkZXJcVGhyaWZ0Q2xhc3NMb2FkZXI7Ci0KLXJlcXVpcmVfb25jZSBfX0RJUl9fLicvLi4vLi4vLi4vLi4vbGliL1RocmlmdC9DbGFzc0xvYWRlci9UaHJpZnRDbGFzc0xvYWRlci5waHAnOwotCi0kbG9hZGVyID0gbmV3IFRocmlmdENsYXNzTG9hZGVyKCk7Ci0kbG9hZGVyLT5yZWdpc3Rlck5hbWVzcGFjZSgnVGhyaWZ0JywgX19ESVJfXyAuICcvLi4vLi4vLi4vLi4vbGliJyk7Ci0kbG9hZGVyLT5yZWdpc3Rlck5hbWVzcGFjZSgnVGVzdCcsIF9fRElSX18gLiAnLy4uLy4uLy4uJyk7Ci0kbG9hZGVyLT5yZWdpc3RlckRlZmluaXRpb24oJ1RocmlmdFRlc3QnLCBfX0RJUl9fIC4gJy8uLi8uLi8uLi9wYWNrYWdlcy9waHBqcycpOwotJGxvYWRlci0+cmVnaXN0ZXIoKTsKLQotY2xhc3MgSnNvblNlcmlhbGl6ZVRlc3QgZXh0ZW5kcyBcUEhQVW5pdF9GcmFtZXdvcmtfVGVzdENhc2UKLXsKLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdEVtcHR5U3RydWN0KCkKLSAgewotICAgICRlbXB0eSA9IG5ldyBcVGhyaWZ0VGVzdFxFbXB0eVN0cnVjdChhcnJheSgnbm9uX2V4aXN0aW5nX2tleScgPT4gJ2JhcicpKTsKLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKG5ldyBzdGRDbGFzcygpLCBqc29uX2RlY29kZShqc29uX2VuY29kZSgkZW1wdHkpKSk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cmluZ3NBbmRJbnRzKCkKLSAgewotICAgICRpbnB1dCA9IGFycmF5KAotICAgICAgJ3N0cmluZ190aGluZycgPT4gJ2ZvbycsCi0gICAgICAnaTY0X3RoaW5nJyA9PiAxMjM0NTY3ODkwLAotICAgICk7Ci0gICAgJHh0cnVjdCA9IG5ldyBcVGhyaWZ0VGVzdFxYdHJ1Y3QoJGlucHV0KTsKLQotICAgIC8vIFh0cnVjdCdzICdpMzJfdGhpbmcnIGFuZCAnYnl0ZV90aGluZycgZmllbGRzIHNob3VsZCBub3QgYmUgcHJlc2VudCBoZXJlIQotICAgICRleHBlY3RlZCA9IG5ldyBzdGRDbGFzcygpOwotICAgICRleHBlY3RlZC0+c3RyaW5nX3RoaW5nID0gJGlucHV0WydzdHJpbmdfdGhpbmcnXTsKLSAgICAkZXhwZWN0ZWQtPmk2NF90aGluZyA9ICRpbnB1dFsnaTY0X3RoaW5nJ107Ci0gICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsIGpzb25fZGVjb2RlKGpzb25fZW5jb2RlKCR4dHJ1Y3QpKSk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdE5lc3RlZFN0cnVjdHMoKQotICB7Ci0gICAgJHh0cnVjdDIgPSBuZXcgXFRocmlmdFRlc3RcWHRydWN0MihhcnJheSgKLSAgICAgICdieXRlX3RoaW5nJyA9PiA0MiwKLSAgICAgICdzdHJ1Y3RfdGhpbmcnID0+IG5ldyBcVGhyaWZ0VGVzdFxYdHJ1Y3QoYXJyYXkoCi0gICAgICAgICdpMzJfdGhpbmcnID0+IDEyMzQ1NiwKLSAgICAgICkpLAotICAgICkpOwotCi0gICAgJGV4cGVjdGVkID0gbmV3IHN0ZENsYXNzKCk7Ci0gICAgJGV4cGVjdGVkLT5ieXRlX3RoaW5nID0gJHh0cnVjdDItPmJ5dGVfdGhpbmc7Ci0gICAgJGV4cGVjdGVkLT5zdHJ1Y3RfdGhpbmcgPSBuZXcgc3RkQ2xhc3MoKTsKLSAgICAkZXhwZWN0ZWQtPnN0cnVjdF90aGluZy0+aTMyX3RoaW5nID0gJHh0cnVjdDItPnN0cnVjdF90aGluZy0+aTMyX3RoaW5nOwotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCBqc29uX2RlY29kZShqc29uX2VuY29kZSgkeHRydWN0MikpKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0SW5zYW5pdHkoKQotICB7Ci0gICAgJHhpbnB1dCA9IGFycmF5KCdzdHJpbmdfdGhpbmcnID0+ICdmb28nKTsKLSAgICAkeHRydWN0ID0gbmV3IFxUaHJpZnRUZXN0XFh0cnVjdCgkeGlucHV0KTsKLSAgICAkaW5zYW5pdHkgPSBuZXcgXFRocmlmdFRlc3RcSW5zYW5pdHkoYXJyYXkoCi0gICAgICAneHRydWN0cycgPT4gYXJyYXkoJHh0cnVjdCwgJHh0cnVjdCwgJHh0cnVjdCkKLSAgICApKTsKLSAgICAkZXhwZWN0ZWQgPSBuZXcgc3RkQ2xhc3MoKTsKLSAgICAkZXhwZWN0ZWQtPnh0cnVjdHMgPSBhcnJheSgob2JqZWN0KSAkeGlucHV0LCAob2JqZWN0KSAkeGlucHV0LCAob2JqZWN0KSAkeGlucHV0KTsKLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwganNvbl9kZWNvZGUoanNvbl9lbmNvZGUoJGluc2FuaXR5KSkpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3ROZXN0ZWRMaXN0cygpCi0gIHsKLSAgICAkYm9uayA9IG5ldyBcVGhyaWZ0VGVzdFxCb25rKGFycmF5KCdtZXNzYWdlJyA9PiAnZm9vJykpOwotICAgICRuZXN0ZWQgPSBuZXcgXFRocmlmdFRlc3RcTmVzdGVkTGlzdHNCb25rKGFycmF5KCdib25rJyA9PiBhcnJheShhcnJheShhcnJheSgkYm9uaykpKSkpOwotICAgICRleHBlY3RlZCA9IG5ldyBzdGRDbGFzcygpOwotICAgICRleHBlY3RlZC0+Ym9uayA9IGFycmF5KGFycmF5KGFycmF5KChvYmplY3QpIGFycmF5KCdtZXNzYWdlJyA9PiAnZm9vJykpKSk7Ci0gICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsIGpzb25fZGVjb2RlKGpzb25fZW5jb2RlKCRuZXN0ZWQpKSk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdE1hcHMoKQotICB7Ci0gICAgJGludG1hcCA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RNYXBfYXJncyhbJ3RoaW5nJyA9PiBbMCA9PiAnemVybyddXSk7Ci0gICAgJGVtcHR5bWFwID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdE1hcF9hcmdzKFtdKTsKLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCd7InRoaW5nIjp7IjAiOiJ6ZXJvIn19JywganNvbl9lbmNvZGUoJGludG1hcCkpOwotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJ3t9JywganNvbl9lbmNvZGUoJGVtcHR5bWFwKSk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC90ZXN0L1Rlc3QvVGhyaWZ0L1Byb3RvY29sL1Rlc3RCaW5hcnlTZXJpYWxpemVyLnBocCBiL2xpYi9waHAvdGVzdC9UZXN0L1RocmlmdC9Qcm90b2NvbC9UZXN0QmluYXJ5U2VyaWFsaXplci5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ODMyMTYuLjAwMDAwMDAKLS0tIGEvbGliL3BocC90ZXN0L1Rlc3QvVGhyaWZ0L1Byb3RvY29sL1Rlc3RCaW5hcnlTZXJpYWxpemVyLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLTw/cGhwCi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRlc3QKLSAqLwotCi1uYW1lc3BhY2UgVGVzdFxUaHJpZnRcUHJvdG9jb2w7Ci0KLXVzZSBUaHJpZnRcQ2xhc3NMb2FkZXJcVGhyaWZ0Q2xhc3NMb2FkZXI7Ci11c2UgVGhyaWZ0XFNlcmlhbGl6ZXJcVEJpbmFyeVNlcmlhbGl6ZXI7Ci0KLXJlcXVpcmVfb25jZSBfX0RJUl9fLicvLi4vLi4vLi4vLi4vbGliL1RocmlmdC9DbGFzc0xvYWRlci9UaHJpZnRDbGFzc0xvYWRlci5waHAnOwotCi0kbG9hZGVyID0gbmV3IFRocmlmdENsYXNzTG9hZGVyKCk7Ci0kbG9hZGVyLT5yZWdpc3Rlck5hbWVzcGFjZSgnVGhyaWZ0JywgX19ESVJfXyAuICcvLi4vLi4vLi4vLi4vbGliJyk7Ci0kbG9hZGVyLT5yZWdpc3Rlck5hbWVzcGFjZSgnVGVzdCcsIF9fRElSX18gLiAnLy4uLy4uLy4uJyk7Ci0kbG9hZGVyLT5yZWdpc3RlckRlZmluaXRpb24oJ1RocmlmdFRlc3QnLCBfX0RJUl9fIC4gJy8uLi8uLi8uLi9wYWNrYWdlcycpOwotJGxvYWRlci0+cmVnaXN0ZXIoKTsKLQotLyoqKgotICogVGhpcyB0ZXN0IHN1aXRlIGRlcGVuZHMgb24gcnVubmluZyB0aGUgY29tcGlsZXIgYWdhaW5zdCB0aGUKLSAqIHN0YW5kYXJkIFRocmlmdFRlc3QudGhyaWZ0IGZpbGU6Ci0gKgotICogbGliL3BocC90ZXN0JCAuLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC0tZ2VuIHBocCAtciBcCi0gKiAgIC0tb3V0IC4vcGFja2FnZXMgLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAotICovCi0KLWNsYXNzIFRlc3RCaW5hcnlTZXJpYWxpemVyIGV4dGVuZHMgXFBIUFVuaXRfRnJhbWV3b3JrX1Rlc3RDYXNlCi17Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHNldFVwKCkKLSAgewotICB9Ci0KLSAgLyoqCi0gICAgKiBXZSB0cnkgdG8gc2VyaWFsaXplIGFuZCBkZXNlcmlhbGl6ZSBhIHJhbmRvbSBvYmplY3QgdG8gbWFrZSBzdXJlIG5vIGV4Y2VwdGlvbnMgYXJlIHRocm93bi4KLSAgICAqIEBzZWUgVEhSSUZULTE1NzkKLSAgICAqLwotICBwdWJsaWMgZnVuY3Rpb24gdGVzdEJpbmFyeVNlcmlhbGl6ZXIoKQotICB7Ci0gICAgJHN0cnVjdCA9IG5ldyBcVGhyaWZ0VGVzdFxYdHJ1Y3QoYXJyYXkoJ3N0cmluZ190aGluZycgPT4gJ2FiYycpKTsKLSAgICAkc2VyaWFsaXplZCA9IFRCaW5hcnlTZXJpYWxpemVyOjpzZXJpYWxpemUoJHN0cnVjdCwgJ1RocmlmdFRlc3RcXFh0cnVjdCcpOwotICAgICRkZXNlcmlhbGl6ZWQgPSBUQmluYXJ5U2VyaWFsaXplcjo6ZGVzZXJpYWxpemUoJHNlcmlhbGl6ZWQsICdUaHJpZnRUZXN0XFxYdHJ1Y3QnKTsKLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRzdHJ1Y3QsICRkZXNlcmlhbGl6ZWQpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvdGVzdC9UZXN0L1RocmlmdC9Qcm90b2NvbC9UZXN0VEpTT05Qcm90b2NvbC5waHAgYi9saWIvcGhwL3Rlc3QvVGVzdC9UaHJpZnQvUHJvdG9jb2wvVGVzdFRKU09OUHJvdG9jb2wucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3YmEzNDQxLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvdGVzdC9UZXN0L1RocmlmdC9Qcm90b2NvbC9UZXN0VEpTT05Qcm90b2NvbC5waHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NjQgKzAsMCBAQAotPD9waHAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudGVzdAotICovCi0KLW5hbWVzcGFjZSB0ZXN0XFRocmlmdFxQcm90b2NvbDsKLQotdXNlIFRocmlmdFxDbGFzc0xvYWRlclxUaHJpZnRDbGFzc0xvYWRlcjsKLXVzZSBUZXN0XFRocmlmdFxGaXh0dXJlczsKLXVzZSBUaHJpZnRcVHJhbnNwb3J0XFRNZW1vcnlCdWZmZXI7Ci11c2UgVGhyaWZ0XFByb3RvY29sXFRKU09OUHJvdG9jb2w7Ci0KLWRlZmluZSggJ0JVRlNJWicsIDgxOTIgKTsgLy9iaWcgZW5vdWdoIHRvIHJlYWQgYmlnZ2VzdCBzZXJpYWxpemVkIEZpeHR1cmUgYXJnLgotCi1yZXF1aXJlX29uY2UgX19ESVJfXy4nLy4uLy4uLy4uLy4uL2xpYi9UaHJpZnQvQ2xhc3NMb2FkZXIvVGhyaWZ0Q2xhc3NMb2FkZXIucGhwJzsKLQotJGxvYWRlciA9IG5ldyBUaHJpZnRDbGFzc0xvYWRlcigpOwotJGxvYWRlci0+cmVnaXN0ZXJOYW1lc3BhY2UoJ1RocmlmdCcsIF9fRElSX18gLiAnLy4uLy4uLy4uLy4uL2xpYicpOwotJGxvYWRlci0+cmVnaXN0ZXJOYW1lc3BhY2UoJ1Rlc3QnLCBfX0RJUl9fIC4gJy8uLi8uLi8uLicpOwotJGxvYWRlci0+cmVnaXN0ZXJEZWZpbml0aW9uKCdUaHJpZnRUZXN0JywgX19ESVJfXyAuICcvLi4vLi4vLi4vcGFja2FnZXMnKTsKLSRsb2FkZXItPnJlZ2lzdGVyKCk7Ci0KLS8qKioKLSAqIFRoaXMgdGVzdCBzdWl0ZSBkZXBlbmRzIG9uIHJ1bm5pbmcgdGhlIGNvbXBpbGVyIGFnYWluc3QgdGhlCi0gKiBzdGFuZGFyZCBUaHJpZnRUZXN0LnRocmlmdCBmaWxlOgotICoKLSAqIGxpYi9waHAvdGVzdCQgLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtLWdlbiBwaHAgLXIgXAotICogICAtLW91dCAuL3BhY2thZ2VzIC4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKLSAqLwotCi1jbGFzcyBUZXN0VEpTT05Qcm90b2NvbCBleHRlbmRzIFxQSFBVbml0X0ZyYW1ld29ya19UZXN0Q2FzZQotewotICBwcml2YXRlICR0cmFuc3BvcnQ7Ci0gIHByaXZhdGUgJHByb3RvY29sOwotCi0gIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2V0VXBCZWZvcmVDbGFzcygpCi0gIHsKLSAgICBGaXh0dXJlczo6cG9wdWxhdGVUZXN0QXJncygpOwotICAgIFRlc3RUSlNPTlByb3RvY29sX0ZpeHR1cmVzOjpwb3B1bGF0ZVRlc3RBcmdzSlNPTigpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHNldFVwKCkKLSAgewotICAgICR0aGlzLT50cmFuc3BvcnQgPSBuZXcgVE1lbW9yeUJ1ZmZlcigpOwotICAgICR0aGlzLT5wcm90b2NvbCA9IG5ldyBUSlNPTlByb3RvY29sKCR0aGlzLT50cmFuc3BvcnQpOwotICAgICR0aGlzLT50cmFuc3BvcnQtPm9wZW4oKTsKLSAgfQotCi0gIC8qKioKLSAgICogV1JJVEUgVEVTVFMKLSAgICovCi0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3RWb2lkX1dyaXRlKCkKLSAgewotICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFZvaWRfYXJncygpOwotICAgICRhcmdzLT53cml0ZSggJHRoaXMtPnByb3RvY29sICk7Ci0KLSAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZCggQlVGU0laICk7Ci0gICAgJGV4cGVjdGVkID0gVGVzdFRKU09OUHJvdG9jb2xfRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RWb2lkJ107Ci0KLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCAkZXhwZWN0ZWQsICRhY3R1YWwgKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RyaW5nMV9Xcml0ZSgpCi0gIHsKLSAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTdHJpbmdfYXJncygpOwotICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmcxJ107Ci0gICAgJGFyZ3MtPndyaXRlKCAkdGhpcy0+cHJvdG9jb2wgKTsKLQotICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKCBCVUZTSVogKTsKLSAgICAkZXhwZWN0ZWQgPSBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZzEnXTsKLQotICAgICMkdGhpcy0+YXNzZXJ0RXF1YWxzKCAkZXhwZWN0ZWQsICRhY3R1YWwgKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RyaW5nMl9Xcml0ZSgpCi0gIHsKLSAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTdHJpbmdfYXJncygpOwotICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmcyJ107Ci0gICAgJGFyZ3MtPndyaXRlKCAkdGhpcy0+cHJvdG9jb2wgKTsKLQotICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKCBCVUZTSVogKTsKLSAgICAkZXhwZWN0ZWQgPSBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZzInXTsKLQotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoICRleHBlY3RlZCwgJGFjdHVhbCApOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3REb3VibGVfV3JpdGUoKQotICB7Ci0gICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0RG91YmxlX2FyZ3MoKTsKLSAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0RG91YmxlJ107Ci0gICAgJGFyZ3MtPndyaXRlKCAkdGhpcy0+cHJvdG9jb2wgKTsKLQotICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKCBCVUZTSVogKTsKLSAgICAkZXhwZWN0ZWQgPSBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdERvdWJsZSddOwotCi0gICAgJHRoaXMtPmFzc2VydEVxdWFscyggJGV4cGVjdGVkLCAkYWN0dWFsICk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdEJ5dGVfV3JpdGUoKQotICB7Ci0gICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0Qnl0ZV9hcmdzKCk7Ci0gICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdEJ5dGUnXTsKLSAgICAkYXJncy0+d3JpdGUoICR0aGlzLT5wcm90b2NvbCApOwotCi0gICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoIEJVRlNJWiApOwotICAgICRleHBlY3RlZCA9IFRlc3RUSlNPTlByb3RvY29sX0ZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0Qnl0ZSddOwotCi0gICAgJHRoaXMtPmFzc2VydEVxdWFscyggJGV4cGVjdGVkLCAkYWN0dWFsICk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdEkzMl9Xcml0ZSgpCi0gIHsKLSAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RJMzJfYXJncygpOwotICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RJMzInXTsKLSAgICAkYXJncy0+d3JpdGUoICR0aGlzLT5wcm90b2NvbCApOwotCi0gICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoIEJVRlNJWiApOwotICAgICRleHBlY3RlZCA9IFRlc3RUSlNPTlByb3RvY29sX0ZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0STMyJ107Ci0KLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCAkZXhwZWN0ZWQsICRhY3R1YWwgKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0STY0X1dyaXRlKCkKLSAgewotICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEk2NF9hcmdzKCk7Ci0gICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdEk2NCddOwotICAgICRhcmdzLT53cml0ZSggJHRoaXMtPnByb3RvY29sICk7Ci0KLSAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZCggQlVGU0laICk7Ci0gICAgJGV4cGVjdGVkID0gVGVzdFRKU09OUHJvdG9jb2xfRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RJNjQnXTsKLQotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoICRleHBlY3RlZCwgJGFjdHVhbCApOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJ1Y3RfV3JpdGUoKQotICB7Ci0gICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U3RydWN0X2FyZ3MoKTsKLSAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U3RydWN0J107Ci0KLSAgICAkYXJncy0+d3JpdGUoICR0aGlzLT5wcm90b2NvbCApOwotCi0gICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoIEJVRlNJWiApOwotICAgICRleHBlY3RlZCA9IFRlc3RUSlNPTlByb3RvY29sX0ZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RydWN0J107Ci0KLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCAkZXhwZWN0ZWQsICRhY3R1YWwgKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TmVzdF9Xcml0ZSgpCi0gIHsKLSAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3ROZXN0X2FyZ3MoKTsKLSAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0TmVzdCddOwotCi0gICAgJGFyZ3MtPndyaXRlKCAkdGhpcy0+cHJvdG9jb2wgKTsKLQotICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKCBCVUZTSVogKTsKLSAgICAkZXhwZWN0ZWQgPSBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdE5lc3QnXTsKLQotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoICRleHBlY3RlZCwgJGFjdHVhbCApOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3RNYXBfV3JpdGUoKQotICB7Ci0gICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0TWFwX2FyZ3MoKTsKLSAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0TWFwJ107Ci0KLSAgICAkYXJncy0+d3JpdGUoICR0aGlzLT5wcm90b2NvbCApOwotCi0gICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoIEJVRlNJWiApOwotICAgICRleHBlY3RlZCA9IFRlc3RUSlNPTlByb3RvY29sX0ZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0TWFwJ107Ci0KLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCAkZXhwZWN0ZWQsICRhY3R1YWwgKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RyaW5nTWFwX1dyaXRlKCkKLSAgewotICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cmluZ01hcF9hcmdzKCk7Ci0gICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFN0cmluZ01hcCddOwotCi0gICAgJGFyZ3MtPndyaXRlKCAkdGhpcy0+cHJvdG9jb2wgKTsKLQotICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKCBCVUZTSVogKTsKLSAgICAkZXhwZWN0ZWQgPSBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZ01hcCddOwotCi0gICAgJHRoaXMtPmFzc2VydEVxdWFscyggJGV4cGVjdGVkLCAkYWN0dWFsICk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdFNldF9Xcml0ZSgpCi0gIHsKLSAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTZXRfYXJncygpOwotICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTZXQnXTsKLQotICAgICRhcmdzLT53cml0ZSggJHRoaXMtPnByb3RvY29sICk7Ci0KLSAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZCggQlVGU0laICk7Ci0gICAgJGV4cGVjdGVkID0gVGVzdFRKU09OUHJvdG9jb2xfRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTZXQnXTsKLQotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoICRleHBlY3RlZCwgJGFjdHVhbCApOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3RMaXN0X1dyaXRlKCkKLSAgewotICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdExpc3RfYXJncygpOwotICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RMaXN0J107Ci0KLSAgICAkYXJncy0+d3JpdGUoICR0aGlzLT5wcm90b2NvbCApOwotCi0gICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoIEJVRlNJWiApOwotICAgICRleHBlY3RlZCA9IFRlc3RUSlNPTlByb3RvY29sX0ZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0TGlzdCddOwotCi0gICAgJHRoaXMtPmFzc2VydEVxdWFscyggJGV4cGVjdGVkLCAkYWN0dWFsICk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdEVudW1fV3JpdGUoKQotICB7Ci0gICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0RW51bV9hcmdzKCk7Ci0gICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdEVudW0nXTsKLQotICAgICRhcmdzLT53cml0ZSggJHRoaXMtPnByb3RvY29sICk7Ci0KLSAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZCggQlVGU0laICk7Ci0gICAgJGV4cGVjdGVkID0gVGVzdFRKU09OUHJvdG9jb2xfRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RFbnVtJ107Ci0KLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCAkZXhwZWN0ZWQsICRhY3R1YWwgKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0VHlwZWRlZl9Xcml0ZSgpCi0gIHsKLSAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RUeXBlZGVmX2FyZ3MoKTsKLSAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0VHlwZWRlZiddOwotCi0gICAgJGFyZ3MtPndyaXRlKCAkdGhpcy0+cHJvdG9jb2wgKTsKLQotICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKCBCVUZTSVogKTsKLSAgICAkZXhwZWN0ZWQgPSBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFR5cGVkZWYnXTsKLQotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoICRleHBlY3RlZCwgJGFjdHVhbCApOwotICB9Ci0KLSAgLyoqKgotICAgKiBSRUFEIFRFU1RTCi0gICAqLwotCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0Vm9pZF9SZWFkKCkKLSAgewotICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAotICAgICAgICAgICAgICAgIFRlc3RUSlNPTlByb3RvY29sX0ZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0Vm9pZCddCi0gICAgICAgICAgICAgICAgKTsKLSAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RWb2lkX2FyZ3MoKTsKLSAgICAkYXJncy0+cmVhZCggJHRoaXMtPnByb3RvY29sICk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cmluZzFfUmVhZCgpCi0gIHsKLSAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKLSAgICAgICAgICAgICAgICBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZzEnXQotICAgICAgICAgICAgICAgICk7Ci0gICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U3RyaW5nX2FyZ3MoKTsKLSAgICAkYXJncy0+cmVhZCggJHRoaXMtPnByb3RvY29sICk7Ci0KLSAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOwotICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmcxJ107Ci0KLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCAkZXhwZWN0ZWQsICRhY3R1YWwgKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RyaW5nMl9SZWFkKCkKLSAgewotICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAotICAgICAgICAgICAgICAgIFRlc3RUSlNPTlByb3RvY29sX0ZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nMiddCi0gICAgICAgICAgICAgICAgKTsKLSAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTdHJpbmdfYXJncygpOwotICAgICRhcmdzLT5yZWFkKCAkdGhpcy0+cHJvdG9jb2wgKTsKLQotICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7Ci0gICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFN0cmluZzInXTsKLQotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoICRleHBlY3RlZCwgJGFjdHVhbCApOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJpbmczX1dyaXRlKCkKLSAgewotICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cmluZ19hcmdzKCk7Ci0gICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFN0cmluZzMnXTsKLSAgICAkYXJncy0+d3JpdGUoICR0aGlzLT5wcm90b2NvbCApOwotCi0gICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoIEJVRlNJWiApOwotICAgICRleHBlY3RlZCA9IFRlc3RUSlNPTlByb3RvY29sX0ZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nMyddOwotCi0gICAgJHRoaXMtPmFzc2VydEVxdWFscyggJGV4cGVjdGVkLCAkYWN0dWFsICk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdERvdWJsZV9SZWFkKCkKLSAgewotICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAotICAgICAgICAgICAgICAgIFRlc3RUSlNPTlByb3RvY29sX0ZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0RG91YmxlJ10KLSAgICAgICAgICAgICAgICApOwotICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdERvdWJsZV9hcmdzKCk7Ci0gICAgJGFyZ3MtPnJlYWQoICR0aGlzLT5wcm90b2NvbCApOwotCi0gICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKLSAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0RG91YmxlJ107Ci0KLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCAkZXhwZWN0ZWQsICRhY3R1YWwgKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0Qnl0ZV9SZWFkKCkKLSAgewotICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAotICAgICAgICAgICAgICAgIFRlc3RUSlNPTlByb3RvY29sX0ZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0Qnl0ZSddCi0gICAgICAgICAgICAgICAgKTsKLSAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RCeXRlX2FyZ3MoKTsKLSAgICAkYXJncy0+cmVhZCggJHRoaXMtPnByb3RvY29sICk7Ci0KLSAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOwotICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RCeXRlJ107Ci0KLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCAkZXhwZWN0ZWQsICRhY3R1YWwgKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0STMyX1JlYWQoKQotICB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCi0gICAgICAgICAgICAgICAgVGVzdFRKU09OUHJvdG9jb2xfRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RJMzInXQotICAgICAgICAgICAgICAgICk7Ci0gICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0STMyX2FyZ3MoKTsKLSAgICAkYXJncy0+cmVhZCggJHRoaXMtPnByb3RvY29sICk7Ci0KLSAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOwotICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RJMzInXTsKLQotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoICRleHBlY3RlZCwgJGFjdHVhbCApOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3RJNjRfUmVhZCgpCi0gIHsKLSAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKLSAgICAgICAgICAgICAgICBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEk2NCddCi0gICAgICAgICAgICAgICAgKTsKLSAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RJNjRfYXJncygpOwotICAgICRhcmdzLT5yZWFkKCAkdGhpcy0+cHJvdG9jb2wgKTsKLQotICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7Ci0gICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdEk2NCddOwotCi0gICAgJHRoaXMtPmFzc2VydEVxdWFscyggJGV4cGVjdGVkLCAkYWN0dWFsICk7Ci0KLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RydWN0X1JlYWQoKQotICB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCi0gICAgICAgICAgICAgICAgVGVzdFRKU09OUHJvdG9jb2xfRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJ1Y3QnXQotICAgICAgICAgICAgICAgICk7Ci0gICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U3RydWN0X2FyZ3MoKTsKLSAgICAkYXJncy0+cmVhZCggJHRoaXMtPnByb3RvY29sICk7Ci0KLSAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOwotICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJ1Y3QnXTsKLQotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoICRleHBlY3RlZCwgJGFjdHVhbCApOwotCi0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdE5lc3RfUmVhZCgpCi0gIHsKLSAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKLSAgICAgICAgICAgICAgICBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdE5lc3QnXQotICAgICAgICAgICAgICAgICk7Ci0gICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0TmVzdF9hcmdzKCk7Ci0gICAgJGFyZ3MtPnJlYWQoICR0aGlzLT5wcm90b2NvbCApOwotCi0gICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKLSAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0TmVzdCddOwotCi0gICAgJHRoaXMtPmFzc2VydEVxdWFscyggJGV4cGVjdGVkLCAkYWN0dWFsICk7Ci0KLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TWFwX1JlYWQoKQotICB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCi0gICAgICAgICAgICAgICAgVGVzdFRKU09OUHJvdG9jb2xfRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RNYXAnXQotICAgICAgICAgICAgICAgICk7Ci0gICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0TWFwX2FyZ3MoKTsKLSAgICAkYXJncy0+cmVhZCggJHRoaXMtPnByb3RvY29sICk7Ci0KLSAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOwotICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RNYXAnXTsKLQotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoICRleHBlY3RlZCwgJGFjdHVhbCApOwotCi0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cmluZ01hcF9SZWFkKCkKLSAgewotICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAotICAgICAgICAgICAgICAgIFRlc3RUSlNPTlByb3RvY29sX0ZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nTWFwJ10KLSAgICAgICAgICAgICAgICApOwotICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cmluZ01hcF9hcmdzKCk7Ci0gICAgJGFyZ3MtPnJlYWQoICR0aGlzLT5wcm90b2NvbCApOwotCi0gICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKLSAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nTWFwJ107Ci0KLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCAkZXhwZWN0ZWQsICRhY3R1YWwgKTsKLQotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3RTZXRfUmVhZCgpCi0gIHsKLSAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKLSAgICAgICAgICAgICAgICBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFNldCddCi0gICAgICAgICAgICAgICAgKTsKLSAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTZXRfYXJncygpOwotICAgICRhcmdzLT5yZWFkKCAkdGhpcy0+cHJvdG9jb2wgKTsKLQotICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7Ci0gICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFNldCddOwotCi0gICAgJHRoaXMtPmFzc2VydEVxdWFscyggJGV4cGVjdGVkLCAkYWN0dWFsICk7Ci0KLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TGlzdF9SZWFkKCkKLSAgewotICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAotICAgICAgICAgICAgICAgIFRlc3RUSlNPTlByb3RvY29sX0ZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0TGlzdCddCi0gICAgICAgICAgICAgICAgKTsKLSAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RMaXN0X2FyZ3MoKTsKLSAgICAkYXJncy0+cmVhZCggJHRoaXMtPnByb3RvY29sICk7Ci0KLSAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOwotICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RMaXN0J107Ci0KLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCAkZXhwZWN0ZWQsICRhY3R1YWwgKTsKLQotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3RFbnVtX1JlYWQoKQotICB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCi0gICAgICAgICAgICAgICAgVGVzdFRKU09OUHJvdG9jb2xfRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RFbnVtJ10KLSAgICAgICAgICAgICAgICApOwotICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEVudW1fYXJncygpOwotICAgICRhcmdzLT5yZWFkKCAkdGhpcy0+cHJvdG9jb2wgKTsKLQotICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7Ci0gICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdEVudW0nXTsKLQotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoICRleHBlY3RlZCwgJGFjdHVhbCApOwotCi0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdFR5cGVkZWZfUmVhZCgpCi0gIHsKLSAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKLSAgICAgICAgICAgICAgICBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFR5cGVkZWYnXQotICAgICAgICAgICAgICAgICk7Ci0gICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0VHlwZWRlZl9hcmdzKCk7Ci0gICAgJGFyZ3MtPnJlYWQoICR0aGlzLT5wcm90b2NvbCApOwotCi0gICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKLSAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0VHlwZWRlZiddOwotCi0gICAgJHRoaXMtPmFzc2VydEVxdWFscyggJGV4cGVjdGVkLCAkYWN0dWFsICk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdE1hcE1hcF9SZWFkKCkKLSAgewotICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAotICAgICAgICAgICAgICAgIFRlc3RUSlNPTlByb3RvY29sX0ZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0TWFwTWFwJ10KLSAgICAgICAgICAgICAgICApOwotICAgICRyZXN1bHQgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0TWFwTWFwX3Jlc3VsdCgpOwotICAgICRyZXN1bHQtPnJlYWQoICR0aGlzLT5wcm90b2NvbCApOwotCi0gICAgJGFjdHVhbCA9ICRyZXN1bHQtPnN1Y2Nlc3M7Ci0gICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdE1hcE1hcEV4cGVjdGVkUmVzdWx0J107Ci0KLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCAkZXhwZWN0ZWQsICRhY3R1YWwgKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0SW5zYW5pdHlfUmVhZCgpCi0gIHsKLSAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKLSAgICAgICAgICAgICAgICBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEluc2FuaXR5J10KLSAgICAgICAgICAgICAgICApOwotICAgICRyZXN1bHQgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0SW5zYW5pdHlfcmVzdWx0KCk7Ci0gICAgJHJlc3VsdC0+cmVhZCggJHRoaXMtPnByb3RvY29sICk7Ci0KLSAgICAkYWN0dWFsID0gJHJlc3VsdC0+c3VjY2VzczsKLSAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0SW5zYW5pdHlFeHBlY3RlZFJlc3VsdCddOwotCi0gICAgJHRoaXMtPmFzc2VydEVxdWFscyggJGV4cGVjdGVkLCAkYWN0dWFsICk7Ci0gIH0KLQotfQotCi1jbGFzcyBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlcwotewotICBwdWJsaWMgc3RhdGljICR0ZXN0QXJnc0pTT04gPSBhcnJheSgpOwotCi0gIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcG9wdWxhdGVUZXN0QXJnc0pTT04oKQotICB7Ci0gICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFZvaWQnXSA9ICd7fSc7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nMSddID0gJ3siMSI6eyJzdHIiOiJBZnJpa2FhbnMsIEFsZW1hbm5pc2NoLCBBcmFnb25cdTAwZTlzLCBcdTA2MjdcdTA2NDRcdTA2MzlcdTA2MzFcdTA2MjhcdTA2NGFcdTA2MjksIFx1MDY0NVx1MDYzNVx1MDYzMVx1MDY0OSwgQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6XHUwMjU5cmJheWNhbiwgXHUwNDExXHUwNDMwXHUwNDQ4XHUwNGExXHUwNDNlXHUwNDQwXHUwNDQyLCBCb2FyaXNjaCwgXHUwMTdkZW1haXRcdTAxMTdcdTAxNjFrYSwgXHUwNDExXHUwNDM1XHUwNDNiXHUwNDMwXHUwNDQwXHUwNDQzXHUwNDQxXHUwNDNhXHUwNDMwXHUwNDRmLCBcdTA0MTFcdTA0MzVcdTA0M2JcdTA0MzBcdTA0NDBcdTA0NDNcdTA0NDFcdTA0M2FcdTA0MzBcdTA0NGYgKFx1MDQ0Mlx1MDQzMFx1MDQ0MFx1MDQzMFx1MDQ0OFx1MDQzYVx1MDQzNVx1MDQzMlx1MDQ1Nlx1MDQ0Nlx1MDQzMCksIFx1MDQxMVx1MDQ0YVx1MDQzYlx1MDQzM1x1MDQzMFx1MDQ0MFx1MDQ0MVx1MDQzYVx1MDQzOCwgQmFtYW5hbmthbiwgXHUwOWFjXHUwOWJlXHUwOTgyXHUwOWIyXHUwOWJlLCBCcmV6aG9uZWcsIEJvc2Fuc2tpLCBDYXRhbFx1MDBlMCwgTVx1MDBlY25nLWRcdTAxMTVcdTAzMjRuZy1uZ1x1MWU3M1x1MDMwNCwgXHUwNDFkXHUwNDNlXHUwNDQ1XHUwNDQ3XHUwNDM4XHUwNDM5XHUwNDNkLCBDZWJ1YW5vLCBcdTEzZTNcdTEzYjNcdTEzYTksIFx1MDEwY2Vza3ksIFx1MDQyMVx1MDQzYlx1MDQzZVx1MDQzMlx1MDQ2M1x1MDMwMVx1MDQzZFx1MDQ0Y1x1MDQ0MVx1MDQzYVx1MDQ0YSBcLyBcdTJjMTRcdTJjMGVcdTJjMTFcdTJjMDJcdTJjMjFcdTJjMTBcdTJjMjBcdTJjMTRcdTJjMGRcdTJjMWYsIFx1MDQyN1x1MDRkMVx1MDQzMlx1MDQzMFx1MDQ0OFx1MDQzYlx1MDQzMCwgQ3ltcmFlZywgRGFuc2ssIFphemFraSwgXHUwNzhiXHUwN2E4XHUwNzg4XHUwN2FjXHUwNzgwXHUwN2E4XHUwNzg0XHUwN2E2XHUwNzkwXHUwN2IwLCBcdTAzOTVcdTAzYmJcdTAzYmJcdTAzYjdcdTAzYmRcdTAzYjlcdTAzYmFcdTAzYWMsIEVtaWxpXHUwMGUwbiBlIHJ1bWFnblx1MDBmMmwsIEVuZ2xpc2gsIEVzcGVyYW50bywgRXNwYVx1MDBmMW9sLCBFZXN0aSwgRXVza2FyYSwgXHUwNjQxXHUwNjI3XHUwNjMxXHUwNjMzXHUwNmNjLCBTdW9taSwgVlx1MDBmNXJvLCBGXHUwMGY4cm95c2t0LCBGcmFuXHUwMGU3YWlzLCBBcnBldGFuLCBGdXJsYW4sIEZyeXNrLCBHYWVpbGdlLCBcdThkMWJcdThhOWUsIEdcdTAwZTBpZGhsaWcsIEdhbGVnbywgQXZhXHUwMGYxZVwnXHUxZWJkLCBcdTBhOTdcdTBhYzFcdTBhOWNcdTBhYjBcdTBhYmVcdTBhYTRcdTBhYzAsIEdhZWxnLCBcdTA1ZTJcdTA1ZDFcdTA1ZThcdTA1ZDlcdTA1ZWEsIFx1MDkzOVx1MDkzZlx1MDkyOFx1MDk0ZFx1MDkyNlx1MDk0MCwgRmlqaSBIaW5kaSwgSHJ2YXRza2ksIEtyZXlcdTAwZjJsIGF5aXN5ZW4sIE1hZ3lhciwgXHUwNTQwXHUwNTYxXHUwNTc1XHUwNTY1XHUwNTgwXHUwNTY1XHUwNTc2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwgSWxva2FubywgSWRvLCBcdTAwY2RzbGVuc2thLCBJdGFsaWFubywgXHU2NWU1XHU2NzJjXHU4YTllLCBMb2piYW4sIEJhc2EgSmF3YSwgXHUxMGU1XHUxMGQwXHUxMGUwXHUxMGQ3XHUxMGUzXHUxMGRhXHUxMGQ4LCBLb25nbywgS2FsYWFsbGlzdXQsIFx1MGM5NVx1MGNhOFx1MGNjZFx1MGNhOFx1MGNhMSwgXHVkNTVjXHVhZDZkXHVjNWI0LCBcdTA0MWFcdTA0NGFcdTA0MzBcdTA0NDBcdTA0MzBcdTA0NDdcdTA0MzBcdTA0MzktXHUwNDFjXHUwNDMwXHUwNDNiXHUwNDNhXHUwNDRhXHUwNDMwXHUwNDQwLCBSaXBvYXJpc2NoLCBLdXJkXHUwMGVlLCBcdTA0MWFcdTA0M2VcdTA0M2NcdTA0MzgsIEtlcm5ld2VrLCBcdTA0MWFcdTA0NGJcdTA0NDBcdTA0MzNcdTA0NGJcdTA0MzdcdTA0NDdcdTA0MzAsIExhdGluYSwgTGFkaW5vLCBMXHUwMGVidHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ1x1MDBlMWxhLCBcdTBlYTVcdTBlYjJcdTBlYTcsIExpZXR1dmlcdTAxNzMsIExhdHZpZVx1MDE2MXUsIEJhc2EgQmFueXVtYXNhbiwgTWFsYWdhc3ksIFx1MDQxY1x1MDQzMFx1MDQzYVx1MDQzNVx1MDQzNFx1MDQzZVx1MDQzZFx1MDQ0MVx1MDQzYVx1MDQzOCwgXHUwZDJlXHUwZDMyXHUwZDJmXHUwZDNlXHUwZDMzXHUwZDAyLCBcdTA5MmVcdTA5MzBcdTA5M2VcdTA5MjBcdTA5NDAsIEJhaGFzYSBNZWxheXUsIFx1MDY0NVx1MDYyN1x1MDYzMlx1MDY1MFx1MDYzMVx1MDY0OFx1MDY0Nlx1MDZjYywgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIFx1MDkyOFx1MDk0N1x1MDkyYVx1MDkzZVx1MDkzMiBcdTA5MmRcdTA5M2VcdTA5MzdcdTA5M2UsIE5lZGVybGFuZHMsIFx1MjAyYU5vcnNrIChueW5vcnNrKVx1MjAyYywgXHUyMDJhTm9yc2sgKGJva21cdTAwZTVsKVx1MjAyYywgTm91b3JtYW5kLCBEaW5cdTAwZTkgYml6YWFkLCBPY2NpdGFuLCBcdTA0MThcdTA0NDBcdTA0M2VcdTA0M2RcdTA0MzBcdTA0NDMsIFBhcGlhbWVudHUsIERlaXRzY2gsIE5vcmZ1ayBcLyBQaXRrZXJuLCBQb2xza2ksIFx1MDY3ZVx1MDY0Nlx1MDYyY1x1MDYyN1x1MDYyOFx1MDZjYywgXHUwNjdlXHUwNjlhXHUwNjJhXHUwNjQ4LCBQb3J0dWd1XHUwMGVhcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tXHUwMGUyblx1MDEwMywgXHUwNDIwXHUwNDQzXHUwNDQxXHUwNDQxXHUwNDNhXHUwNDM4XHUwNDM5LCBcdTA0MjFcdTA0MzBcdTA0NDVcdTA0MzAgXHUwNDQyXHUwNDRiXHUwNDNiXHUwNDMwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU1x1MDBlMW1lZ2llbGxhLCBTaW1wbGUgRW5nbGlzaCwgU2xvdmVuXHUwMTBkaW5hLCBTbG92ZW5cdTAxNjFcdTAxMGRpbmEsIFx1MDQyMVx1MDQ0MFx1MDQzZlx1MDQ0MVx1MDQzYVx1MDQzOCBcLyBTcnBza2ksIFNlZWx0ZXJzaywgU3ZlbnNrYSwgS2lzd2FoaWxpLCBcdTBiYTRcdTBiYWVcdTBiYmZcdTBiYjRcdTBiY2QsIFx1MGMyNFx1MGM0Nlx1MGMzMlx1MGM0MVx1MGMxN1x1MGM0MSwgXHUwNDIyXHUwNDNlXHUwNGI3XHUwNDM4XHUwNDNhXHUwNGUzLCBcdTBlNDRcdTBlMTdcdTBlMjIsIFRcdTAwZmNya21lblx1MDBlN2UsIFRhZ2Fsb2csIFRcdTAwZmNya1x1MDBlN2UsIFx1MDQyMlx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQ0MFx1MDQ0N1x1MDQzMFwvVGF0YXJcdTAwZTdhLCBcdTA0MjNcdTA0M2FcdTA0NDBcdTA0MzBcdTA0NTdcdTA0M2RcdTA0NDFcdTA0NGNcdTA0M2FcdTA0MzAsIFx1MDYyN1x1MDYzMVx1MDYyZlx1MDY0OCwgVGlcdTFlYmZuZyBWaVx1MWVjN3QsIFZvbGFwXHUwMGZjaywgV2Fsb24sIFdpbmFyYXksIFx1NTQzNFx1OGJlZCwgaXNpWGhvc2EsIFx1MDVkOVx1MDVkOVx1MDViNFx1MDVkM1x1MDVkOVx1MDVlOSwgWW9yXHUwMGY5Ylx1MDBlMSwgWmVcdTAwZWF1d3MsIFx1NGUyZFx1NjU4NywgQlx1MDBlMm4tbFx1MDBlMm0tZ1x1MDBmYSwgXHU3Y2I1XHU4YTllIn19JzsKLQotICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmcyJ10gPSAneyIxIjp7InN0ciI6InF1b3RlOiBcXFxcXCIgYmFja3NsYXNoOiBmb3J3YXJkc2xhc2gtZXNjYXBlZDogXFxcXFwvICBiYWNrc3BhY2U6IFxcXFxiIGZvcm1mZWVkOiBcZiBuZXdsaW5lOiBcbiByZXR1cm46IFxyIHRhYjogIG5vdy1hbGwtb2YtdGhlbS10b2dldGhlcjogXCJcXFxcXFxcXFwvXFxcXGJcblxyXHQgbm93LWEtYnVuY2gtb2YtanVuazogIUAjJCUmKCkoJiUkI3t9e308Pjw+PCJ9fSc7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nMyddID0gJ3siMSI6eyJzdHIiOiJzdHJpbmcgdGhhdCBlbmRzIGluIGRvdWJsZS1iYWNrc2xhc2ggXFxcXFxcXFwifX0nOwotCi0gICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdERvdWJsZSddID0gJ3siMSI6eyJkYmwiOjMuMTQxNTkyNjUzNTg5OH19JzsKLQotICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RCeXRlJ10gPSAneyIxIjp7Imk4IjoxfX0nOwotCi0gICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdEkzMiddID0gJ3siMSI6eyJpMzIiOjEwNzM3NDE4MjR9fSc7Ci0KLSAgICBpZiAoUEhQX0lOVF9TSVpFID09IDgpIHsKLSAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RJNjQnXSA9ICd7IjEiOnsiaTY0IjonLnBvdyggMiwgNjAgKS4nfX0nOwotICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cnVjdCddID0gJ3siMSI6eyJyZWMiOnsiMSI6eyJzdHIiOiJ3b3JrZWQifSwiNCI6eyJpOCI6MX0sIjkiOnsiaTMyIjoxMDczNzQxODI0fSwiMTEiOnsiaTY0IjonLnBvdyggMiwgNjAgKS4nfX19fSc7Ci0gICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0TmVzdCddID0gJ3siMSI6eyJyZWMiOnsiMSI6eyJpOCI6MX0sIjIiOnsicmVjIjp7IjEiOnsic3RyIjoid29ya2VkIn0sIjQiOnsiaTgiOjF9LCI5Ijp7ImkzMiI6MTA3Mzc0MTgyNH0sIjExIjp7Imk2NCI6Jy5wb3coIDIsIDYwICkuJ319fSwiMyI6eyJpMzIiOjMyNzY4fX19fSc7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RJNjQnXSA9ICd7IjEiOnsiaTY0IjoxMTUyOTIxNTA0NjA2ODQ3MDAwfX0nOwotICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cnVjdCddID0gJ3siMSI6eyJyZWMiOnsiMSI6eyJzdHIiOiJ3b3JrZWQifSwiNCI6eyJpOCI6MX0sIjkiOnsiaTMyIjoxMDczNzQxODI0fSwiMTEiOnsiaTY0IjoxMTUyOTIxNTA0NjA2ODQ3MDAwfX19fSc7Ci0gICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0TmVzdCddID0gJ3siMSI6eyJyZWMiOnsiMSI6eyJpOCI6MX0sIjIiOnsicmVjIjp7IjEiOnsic3RyIjoid29ya2VkIn0sIjQiOnsiaTgiOjF9LCI5Ijp7ImkzMiI6MTA3Mzc0MTgyNH0sIjExIjp7Imk2NCI6MTE1MjkyMTUwNDYwNjg0NzAwMH19fSwiMyI6eyJpMzIiOjMyNzY4fX19fSc7Ci0gICAgfQotCi0gICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdE1hcCddID0gJ3siMSI6eyJtYXAiOlsiaTMyIiwiaTMyIiwzLHsiNyI6NzcsIjgiOjg4LCI5Ijo5OX1dfX0nOwotCi0gICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZ01hcCddID0gJ3siMSI6eyJtYXAiOlsic3RyIiwic3RyIiw2LHsiYSI6IjEyMyIsImEgYiI6IndpdGggc3BhY2VzICIsInNhbWUiOiJzYW1lIiwiMCI6Im51bWVyaWMga2V5IiwibG9uZ1ZhbHVlIjoiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uXHUwMGU5cywgXHUwNjI3XHUwNjQ0XHUwNjM5XHUwNjMxXHUwNjI4XHUwNjRhXHUwNjI5LCBcdTA2NDVcdTA2MzVcdTA2MzFcdTA2NDksIEFzdHVyaWFudSwgQXltYXIgYXJ1LCBBelx1MDI1OXJiYXljYW4sIFx1MDQxMVx1MDQzMFx1MDQ0OFx1MDRhMVx1MDQzZVx1MDQ0MFx1MDQ0MiwgQm9hcmlzY2gsIFx1MDE3ZGVtYWl0XHUwMTE3XHUwMTYxa2EsIFx1MDQxMVx1MDQzNVx1MDQzYlx1MDQzMFx1MDQ0MFx1MDQ0M1x1MDQ0MVx1MDQzYVx1MDQzMFx1MDQ0ZiwgXHUwNDExXHUwNDM1XHUwNDNiXHUwNDMwXHUwNDQwXHUwNDQzXHUwNDQxXHUwNDNhXHUwNDMwXHUwNDRmIChcdTA0NDJcdTA0MzBcdTA0NDBcdTA0MzBcdTA0NDhcdTA0M2FcdTA0MzVcdTA0MzJcdTA0NTZcdTA0NDZcdTA0MzApLCBcdTA0MTFcdTA0NGFcdTA0M2JcdTA0MzNcdTA0MzBcdTA0NDBcdTA0NDFcdTA0M2FcdTA0MzgsIEJhbWFuYW5rYW4sIFx1MDlhY1x1MDliZVx1MDk4Mlx1MDliMlx1MDliZSwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWxcdTAwZTAsIE1cdTAwZWNuZy1kXHUwMTE1XHUwMzI0bmctbmdcdTFlNzNcdTAzMDQsIFx1MDQxZFx1MDQzZVx1MDQ0NVx1MDQ0N1x1MDQzOFx1MDQzOVx1MDQzZCwgQ2VidWFubywgXHUxM2UzXHUxM2IzXHUxM2E5LCBcdTAxMGNlc2t5LCBcdTA0MjFcdTA0M2JcdTA0M2VcdTA0MzJcdTA0NjNcdTAzMDFcdTA0M2RcdTA0NGNcdTA0NDFcdTA0M2FcdTA0NGEgXC8gXHUyYzE0XHUyYzBlXHUyYzExXHUyYzAyXHUyYzIxXHUyYzEwXHUyYzIwXHUyYzE0XHUyYzBkXHUyYzFmLCBcdTA0MjdcdTA0ZDFcdTA0MzJcdTA0MzBcdTA0NDhcdTA0M2JcdTA0MzAsIEN5bXJhZWcsIERhbnNrLCBaYXpha2ksIFx1MDc4Ylx1MDdhOFx1MDc4OFx1MDdhY1x1MDc4MFx1MDdhOFx1MDc4NFx1MDdhNlx1MDc5MFx1MDdiMCwgXHUwMzk1XHUwM2JiXHUwM2JiXHUwM2I3XHUwM2JkXHUwM2I5XHUwM2JhXHUwM2FjLCBFbWlsaVx1MDBlMG4gZSBydW1hZ25cdTAwZjJsLCBFbmdsaXNoLCBFc3BlcmFudG8sIEVzcGFcdTAwZjFvbCwgRWVzdGksIEV1c2thcmEsIFx1MDY0MVx1MDYyN1x1MDYzMVx1MDYzM1x1MDZjYywgU3VvbWksIFZcdTAwZjVybywgRlx1MDBmOHJveXNrdCwgRnJhblx1MDBlN2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwgXHU4ZDFiXHU4YTllLCBHXHUwMGUwaWRobGlnLCBHYWxlZ28sIEF2YVx1MDBmMWVcJ1x1MWViZCwgXHUwYTk3XHUwYWMxXHUwYTljXHUwYWIwXHUwYWJlXHUwYWE0XHUwYWMwLCBHYWVsZywgXHUwNWUyXHUwNWQxXHUwNWU4XHUwNWQ5XHUwNWVhLCBcdTA5MzlcdTA5M2ZcdTA5MjhcdTA5NGRcdTA5MjZcdTA5NDAsIEZpamkgSGluZGksIEhydmF0c2tpLCBLcmV5XHUwMGYybCBheWlzeWVuLCBNYWd5YXIsIFx1MDU0MFx1MDU2MVx1MDU3NVx1MDU2NVx1MDU4MFx1MDU2NVx1MDU3NiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsIElsb2thbm8sIElkbywgXHUwMGNkc2xlbnNrYSwgSXRhbGlhbm8sIFx1NjVlNVx1NjcyY1x1OGE5ZSwgTG9qYmFuLCBCYXNhIEphd2EsIFx1MTBlNVx1MTBkMFx1MTBlMFx1MTBkN1x1MTBlM1x1MTBkYVx1MTBkOCwgS29uZ28sIEthbGFhbGxpc3V0LCBcdTBjOTVcdTBjYThcdTBjY2RcdTBjYThcdTBjYTEsIFx1ZDU1Y1x1YWQ2ZFx1YzViNCwgXHUwNDFhXHUwNDRhXHUwNDMwXHUwNDQwXHUwNDMwXHUwNDQ3XHUwNDMwXHUwNDM5LVx1MDQxY1x1MDQzMFx1MDQzYlx1MDQzYVx1MDQ0YVx1MDQzMFx1MDQ0MCwgUmlwb2FyaXNjaCwgS3VyZFx1MDBlZSwgXHUwNDFhXHUwNDNlXHUwNDNjXHUwNDM4LCBLZXJuZXdlaywgXHUwNDFhXHUwNDRiXHUwNDQwXHUwNDMzXHUwNDRiXHUwNDM3XHUwNDQ3XHUwNDMwLCBMYXRpbmEsIExhZGlubywgTFx1MDBlYnR6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmdcdTAwZTFsYSwgXHUwZWE1XHUwZWIyXHUwZWE3LCBMaWV0dXZpXHUwMTczLCBMYXR2aWVcdTAxNjF1LCBCYXNhIEJhbnl1bWFzYW4sIE1hbGFnYXN5LCBcdTA0MWNcdTA0MzBcdTA0M2FcdTA0MzVcdTA0MzRcdTA0M2VcdTA0M2RcdTA0NDFcdTA0M2FcdTA0MzgsIFx1MGQyZVx1MGQzMlx1MGQyZlx1MGQzZVx1MGQzM1x1MGQwMiwgXHUwOTJlXHUwOTMwXHUwOTNlXHUwOTIwXHUwOTQwLCBCYWhhc2EgTWVsYXl1LCBcdTA2NDVcdTA2MjdcdTA2MzJcdTA2NTBcdTA2MzFcdTA2NDhcdTA2NDZcdTA2Y2MsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCBcdTA5MjhcdTA5NDdcdTA5MmFcdTA5M2VcdTA5MzIgXHUwOTJkXHUwOTNlXHUwOTM3XHUwOTNlLCBOZWRlcmxhbmRzLCBcdTIwMmFOb3JzayAobnlub3JzaylcdTIwMmMsIFx1MjAyYU5vcnNrIChib2ttXHUwMGU1bClcdTIwMmMsIE5vdW9ybWFuZCwgRGluXHUwMGU5IGJpemFhZCwgT2NjaXRhbiwgXHUwNDE4XHUwNDQwXHUwNDNlXHUwNDNkXHUwNDMwXHUwNDQzLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBOb3JmdWsgXC8gUGl0a2VybiwgUG9sc2tpLCBcdTA2N2VcdTA2NDZcdTA2MmNcdTA2MjdcdTA2MjhcdTA2Y2MsIFx1MDY3ZVx1MDY5YVx1MDYyYVx1MDY0OCwgUG9ydHVndVx1MDBlYXMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbVx1MDBlMm5cdTAxMDMsIFx1MDQyMFx1MDQ0M1x1MDQ0MVx1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzOSwgXHUwNDIxXHUwNDMwXHUwNDQ1XHUwNDMwIFx1MDQ0Mlx1MDQ0Ylx1MDQzYlx1MDQzMCwgU2FyZHUsIFNpY2lsaWFudSwgU2NvdHMsIFNcdTAwZTFtZWdpZWxsYSwgU2ltcGxlIEVuZ2xpc2gsIFNsb3Zlblx1MDEwZGluYSwgU2xvdmVuXHUwMTYxXHUwMTBkaW5hLCBcdTA0MjFcdTA0NDBcdTA0M2ZcdTA0NDFcdTA0M2FcdTA0MzggXC8gU3Jwc2tpLCBTZWVsdGVyc2ssIFN2ZW5za2EsIEtpc3dhaGlsaSwgXHUwYmE0XHUwYmFlXHUwYmJmXHUwYmI0XHUwYmNkLCBcdTBjMjRcdTBjNDZcdTBjMzJcdTBjNDFcdTBjMTdcdTBjNDEsIFx1MDQyMlx1MDQzZVx1MDRiN1x1MDQzOFx1MDQzYVx1MDRlMywgXHUwZTQ0XHUwZTE3XHUwZTIyLCBUXHUwMGZjcmttZW5cdTAwZTdlLCBUYWdhbG9nLCBUXHUwMGZjcmtcdTAwZTdlLCBcdTA0MjJcdTA0MzBcdTA0NDJcdTA0MzBcdTA0NDBcdTA0NDdcdTA0MzBcL1RhdGFyXHUwMGU3YSwgXHUwNDIzXHUwNDNhXHUwNDQwXHUwNDMwXHUwNDU3XHUwNDNkXHUwNDQxXHUwNDRjXHUwNDNhXHUwNDMwLCBcdTA2MjdcdTA2MzFcdTA2MmZcdTA2NDgsIFRpXHUxZWJmbmcgVmlcdTFlYzd0LCBWb2xhcFx1MDBmY2ssIFdhbG9uLCBXaW5hcmF5LCBcdTU0MzRcdThiZWQsIGlzaVhob3NhLCBcdTA1ZDlcdTA1ZDlcdTA1YjRcdTA1ZDNcdTA1ZDlcdTA1ZTksIFlvclx1MDBmOWJcdTAwZTEsIFplXHUwMGVhdXdzLCBcdTRlMmRcdTY1ODcsIEJcdTAwZTJuLWxcdTAwZTJtLWdcdTAwZmEsIFx1N2NiNVx1OGE5ZSIsIkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvblx1MDBlOXMsIFx1MDYyN1x1MDY0NFx1MDYzOVx1MDYzMVx1MDYyOFx1MDY0YVx1MDYyOSwgXHUwNjQ1XHUwNjM1XHUwNjMxXHUwNjQ5LCBBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXpcdTAyNTlyYmF5Y2FuLCBcdTA0MTFcdTA0MzBcdTA0NDhcdTA0YTFcdTA0M2VcdTA0NDBcdTA0NDIsIEJvYXJpc2NoLCBcdTAxN2RlbWFpdFx1MDExN1x1MDE2MWthLCBcdTA0MTFcdTA0MzVcdTA0M2JcdTA0MzBcdTA0NDBcdTA0NDNcdTA0NDFcdTA0M2FcdTA0MzBcdTA0NGYsIFx1MDQxMVx1MDQzNVx1MDQzYlx1MDQzMFx1MDQ0MFx1MDQ0M1x1MDQ0MVx1MDQzYVx1MDQzMFx1MDQ0ZiAoXHUwNDQyXHUwNDMwXHUwNDQwXHUwNDMwXHUwNDQ4XHUwNDNhXHUwNDM1XHUwNDMyXHUwNDU2XHUwNDQ2XHUwNDMwKSwgXHUwNDExXHUwNDRhXHUwNDNiXHUwNDMzXHUwNDMwXHUwNDQwXHUwNDQxXHUwNDNhXHUwNDM4LCBCYW1hbmFua2FuLCBcdTA5YWNcdTA5YmVcdTA5ODJcdTA5YjJcdTA5YmUsIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsXHUwMGUwLCBNXHUwMGVjbmctZFx1MDExNVx1MDMyNG5nLW5nXHUxZTczXHUwMzA0LCBcdTA0MWRcdTA0M2VcdTA0NDVcdTA0NDdcdTA0MzhcdTA0MzlcdTA0M2QsIENlYnVhbm8sIFx1MTNlM1x1MTNiM1x1MTNhOSwgXHUwMTBjZXNreSwgXHUwNDIxXHUwNDNiXHUwNDNlXHUwNDMyXHUwNDYzXHUwMzAxXHUwNDNkXHUwNDRjXHUwNDQxXHUwNDNhXHUwNDRhIFwvIFx1MmMxNFx1MmMwZVx1MmMxMVx1MmMwMlx1MmMyMVx1MmMxMFx1MmMyMFx1MmMxNFx1MmMwZFx1MmMxZiwgXHUwNDI3XHUwNGQxXHUwNDMyXHUwNDMwXHUwNDQ4XHUwNDNiXHUwNDMwLCBDeW1yYWVnLCBEYW5zaywgWmF6YWtpLCBcdTA3OGJcdTA3YThcdTA3ODhcdTA3YWNcdTA3ODBcdTA3YThcdTA3ODRcdTA3YTZcdTA3OTBcdTA3YjAsIFx1MDM5NVx1MDNiYlx1MDNiYlx1MDNiN1x1MDNiZFx1MDNiOVx1MDNiYVx1MDNhYywgRW1pbGlcdTAwZTBuIGUgcnVtYWduXHUwMGYybCwgRW5nbGlzaCwgRXNwZXJhbnRvLCBFc3BhXHUwMGYxb2wsIEVlc3RpLCBFdXNrYXJhLCBcdTA2NDFcdTA2MjdcdTA2MzFcdTA2MzNcdTA2Y2MsIFN1b21pLCBWXHUwMGY1cm8sIEZcdTAwZjhyb3lza3QsIEZyYW5cdTAwZTdhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIFx1OGQxYlx1OGE5ZSwgR1x1MDBlMGlkaGxpZywgR2FsZWdvLCBBdmFcdTAwZjFlXCdcdTFlYmQsIFx1MGE5N1x1MGFjMVx1MGE5Y1x1MGFiMFx1MGFiZVx1MGFhNFx1MGFjMCwgR2FlbGcsIFx1MDVlMlx1MDVkMVx1MDVlOFx1MDVkOVx1MDVlYSwgXHUwOTM5XHUwOTNmXHUwOTI4XHUwOTRkXHUwOTI2XHUwOTQwLCBGaWppIEhpbmRpLCBIcnZhdHNraSwgS3JleVx1MDBmMmwgYXlpc3llbiwgTWFneWFyLCBcdTA1NDBcdTA1NjFcdTA1NzVcdTA1NjVcdTA1ODBcdTA1NjVcdTA1NzYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCBJbG9rYW5vLCBJZG8sIFx1MDBjZHNsZW5za2EsIEl0YWxpYW5vLCBcdTY1ZTVcdTY3MmNcdThhOWUsIExvamJhbiwgQmFzYSBKYXdhLCBcdTEwZTVcdTEwZDBcdTEwZTBcdTEwZDdcdTEwZTNcdTEwZGFcdTEwZDgsIEtvbmdvLCBLYWxhYWxsaXN1dCwgXHUwYzk1XHUwY2E4XHUwY2NkXHUwY2E4XHUwY2ExLCBcdWQ1NWNcdWFkNmRcdWM1YjQsIFx1MDQxYVx1MDQ0YVx1MDQzMFx1MDQ0MFx1MDQzMFx1MDQ0N1x1MDQzMFx1MDQzOS1cdTA0MWNcdTA0MzBcdTA0M2JcdTA0M2FcdTA0NGFcdTA0MzBcdTA0NDAsIFJpcG9hcmlzY2gsIEt1cmRcdTAwZWUsIFx1MDQxYVx1MDQzZVx1MDQzY1x1MDQzOCwgS2VybmV3ZWssIFx1MDQxYVx1MDQ0Ylx1MDQ0MFx1MDQzM1x1MDQ0Ylx1MDQzN1x1MDQ0N1x1MDQzMCwgTGF0aW5hLCBMYWRpbm8sIExcdTAwZWJ0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nXHUwMGUxbGEsIFx1MGVhNVx1MGViMlx1MGVhNywgTGlldHV2aVx1MDE3MywgTGF0dmllXHUwMTYxdSwgQmFzYSBCYW55dW1hc2FuLCBNYWxhZ2FzeSwgXHUwNDFjXHUwNDMwXHUwNDNhXHUwNDM1XHUwNDM0XHUwNDNlXHUwNDNkXHUwNDQxXHUwNDNhXHUwNDM4LCBcdTBkMmVcdTBkMzJcdTBkMmZcdTBkM2VcdTBkMzNcdTBkMDIsIFx1MDkyZVx1MDkzMFx1MDkzZVx1MDkyMFx1MDk0MCwgQmFoYXNhIE1lbGF5dSwgXHUwNjQ1XHUwNjI3XHUwNjMyXHUwNjUwXHUwNjMxXHUwNjQ4XHUwNjQ2XHUwNmNjLCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwgXHUwOTI4XHUwOTQ3XHUwOTJhXHUwOTNlXHUwOTMyIFx1MDkyZFx1MDkzZVx1MDkzN1x1MDkzZSwgTmVkZXJsYW5kcywgXHUyMDJhTm9yc2sgKG55bm9yc2spXHUyMDJjLCBcdTIwMmFOb3JzayAoYm9rbVx1MDBlNWwpXHUyMDJjLCBOb3Vvcm1hbmQsIERpblx1MDBlOSBiaXphYWQsIE9jY2l0YW4sIFx1MDQxOFx1MDQ0MFx1MDQzZVx1MDQzZFx1MDQzMFx1MDQ0MywgUGFwaWFtZW50dSwgRGVpdHNjaCwgTm9yZnVrIFwvIFBpdGtlcm4sIFBvbHNraSwgXHUwNjdlXHUwNjQ2XHUwNjJjXHUwNjI3XHUwNjI4XHUwNmNjLCBcdTA2N2VcdTA2OWFcdTA2MmFcdTA2NDgsIFBvcnR1Z3VcdTAwZWFzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb21cdTAwZTJuXHUwMTAzLCBcdTA0MjBcdTA0NDNcdTA0NDFcdTA0NDFcdTA0M2FcdTA0MzhcdTA0MzksIFx1MDQyMVx1MDQzMFx1MDQ0NVx1MDQzMCBcdTA0NDJcdTA0NGJcdTA0M2JcdTA0MzAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTXHUwMGUxbWVnaWVsbGEsIFNpbXBsZSBFbmdsaXNoLCBTbG92ZW5cdTAxMGRpbmEsIFNsb3Zlblx1MDE2MVx1MDEwZGluYSwgXHUwNDIxXHUwNDQwXHUwNDNmXHUwNDQxXHUwNDNhXHUwNDM4IFwvIFNycHNraSwgU2VlbHRlcnNrLCBTdmVuc2thLCBLaXN3YWhpbGksIFx1MGJhNFx1MGJhZVx1MGJiZlx1MGJiNFx1MGJjZCwgXHUwYzI0XHUwYzQ2XHUwYzMyXHUwYzQxXHUwYzE3XHUwYzQxLCBcdTA0MjJcdTA0M2VcdTA0YjdcdTA0MzhcdTA0M2FcdTA0ZTMsIFx1MGU0NFx1MGUxN1x1MGUyMiwgVFx1MDBmY3JrbWVuXHUwMGU3ZSwgVGFnYWxvZywgVFx1MDBmY3JrXHUwMGU3ZSwgXHUwNDIyXHUwNDMwXHUwNDQyXHUwNDMwXHUwNDQwXHUwNDQ3XHUwNDMwXC9UYXRhclx1MDBlN2EsIFx1MDQyM1x1MDQzYVx1MDQ0MFx1MDQzMFx1MDQ1N1x1MDQzZFx1MDQ0MVx1MDQ0Y1x1MDQzYVx1MDQzMCwgXHUwNjI3XHUwNjMxXHUwNjJmXHUwNjQ4LCBUaVx1MWViZm5nIFZpXHUxZWM3dCwgVm9sYXBcdTAwZmNrLCBXYWxvbiwgV2luYXJheSwgXHU1NDM0XHU4YmVkLCBpc2lYaG9zYSwgXHUwNWQ5XHUwNWQ5XHUwNWI0XHUwNWQzXHUwNWQ5XHUwNWU5LCBZb3JcdTAwZjliXHUwMGUxLCBaZVx1MDBlYXV3cywgXHU0ZTJkXHU2NTg3LCBCXHUwMGUybi1sXHUwMGUybS1nXHUwMGZhLCBcdTdjYjVcdThhOWUiOiJsb25nIGtleSJ9XX19JzsKLQotICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTZXQnXSA9ICd7IjEiOnsic2V0IjpbImkzMiIsMywxLDUsNl19fSc7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0TGlzdCddID0gJ3siMSI6eyJsc3QiOlsiaTMyIiwzLDEsMiwzXX19JzsKLQotICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RFbnVtJ10gPSAneyIxIjp7ImkzMiI6MX19JzsKLQotICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RUeXBlZGVmJ10gPSAneyIxIjp7Imk2NCI6Njl9fSc7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0TWFwTWFwJ10gPSAneyIwIjp7Im1hcCI6WyJpMzIiLCJtYXAiLDIseyI0IjpbImkzMiIsImkzMiIsNCx7IjEiOjEsIjIiOjIsIjMiOjMsIjQiOjR9XSwiLTQiOlsiaTMyIiwiaTMyIiw0LHsiLTQiOi00LCItMyI6LTMsIi0yIjotMiwiLTEiOi0xfV19XX19JzsKLQotICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RJbnNhbml0eSddID0gJ3siMCI6eyJtYXAiOlsiaTY0IiwibWFwIiwyLHsiMSI6WyJpMzIiLCJyZWMiLDIseyIyIjp7IjEiOnsibWFwIjpbImkzMiIsImk2NCIsMix7IjUiOjUsIjgiOjh9XX0sIjIiOnsibHN0IjpbInJlYyIsMix7IjEiOnsic3RyIjoiR29vZGJ5ZTQifSwiNCI6eyJpOCI6NH0sIjkiOnsiaTMyIjo0fSwiMTEiOnsiaTY0Ijo0fX0seyIxIjp7InN0ciI6IkhlbGxvMiJ9LCI0Ijp7Imk4IjoyfSwiOSI6eyJpMzIiOjJ9LCIxMSI6eyJpNjQiOjJ9fV19fSwiMyI6eyIxIjp7Im1hcCI6WyJpMzIiLCJpNjQiLDIseyI1Ijo1LCI4Ijo4fV19LCIyIjp7ImxzdCI6WyJyZWMiLDIseyIxIjp7InN0ciI6Ikdvb2RieWU0In0sIjQiOnsiaTgiOjR9LCI5Ijp7ImkzMiI6NH0sIjExIjp7Imk2NCI6NH19LHsiMSI6eyJzdHIiOiJIZWxsbzIifSwiNCI6eyJpOCI6Mn0sIjkiOnsiaTMyIjoyfSwiMTEiOnsiaTY0IjoyfX1dfX19XSwiMiI6WyJpMzIiLCJyZWMiLDEseyI2Ijp7fX1dfV19fSc7Ci0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC90ZXN0L1Rlc3QvVGhyaWZ0L1Rlc3RWYWxpZGF0b3JzLnBocCBiL2xpYi9waHAvdGVzdC9UZXN0L1RocmlmdC9UZXN0VmFsaWRhdG9ycy5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2Y2YwMDAuLjAwMDAwMDAKLS0tIGEvbGliL3BocC90ZXN0L1Rlc3QvVGhyaWZ0L1Rlc3RWYWxpZGF0b3JzLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1uYW1lc3BhY2UgdGVzdFxwaHA7Ci0KLXJlcXVpcmVfb25jZSBfX0RJUl9fLicvLi4vLi4vLi4vbGliL1RocmlmdC9DbGFzc0xvYWRlci9UaHJpZnRDbGFzc0xvYWRlci5waHAnOwotCi11c2UgVGhyaWZ0XENsYXNzTG9hZGVyXFRocmlmdENsYXNzTG9hZGVyOwotdXNlIFRocmlmdFxFeGNlcHRpb25cVFByb3RvY29sRXhjZXB0aW9uOwotdXNlIFRocmlmdFxQcm90b2NvbFxUQmluYXJ5UHJvdG9jb2w7Ci11c2UgVGhyaWZ0XFRyYW5zcG9ydFxUTWVtb3J5QnVmZmVyOwotCi0kb29wX21vZGUgPSAoaXNzZXQoJGFyZ3ZbMV0pICYmICRhcmd2WzFdID09PSAnLW9vcCcpOwotJEdFTl9ESVIgPSAkb29wX21vZGUgPyAncGhwdm8nIDogJ3BocHYnOwotCi0kbG9hZGVyID0gbmV3IFRocmlmdENsYXNzTG9hZGVyKCk7Ci0kbG9hZGVyLT5yZWdpc3Rlck5hbWVzcGFjZSgnVGhyaWZ0JywgX19ESVJfXyAuICcvLi4vLi4vLi4vbGliJyk7Ci0kbG9hZGVyLT5yZWdpc3RlckRlZmluaXRpb24oJ1RocmlmdFRlc3QnLCBfX0RJUl9fIC4gJy8uLi8uLi9wYWNrYWdlcy8nIC4gJEdFTl9ESVIpOwotJGxvYWRlci0+cmVnaXN0ZXJEZWZpbml0aW9uKCdUZXN0VmFsaWRhdG9ycycsIF9fRElSX18gLiAnLy4uLy4uL3BhY2thZ2VzLycgLiAkR0VOX0RJUik7Ci0kbG9hZGVyLT5yZWdpc3RlcigpOwotCi0vLyBXb3VsZCBiZSBuaWNlIHRvIGhhdmUgUEhQVW5pdCBoZXJlLCBidXQgZm9yIG5vdyBqdXN0IGhhY2sgaXQuCi0KLXNldF9leGNlcHRpb25faGFuZGxlcihmdW5jdGlvbiAoJGUpIHsKLSAgICBteV9hc3NlcnQoZmFsc2UsICJVbmV4cGVjdGVkIGV4Y2VwdGlvbiBjYXVnaHQ6ICIgLiAkZS0+Z2V0TWVzc2FnZSgpKTsKLX0pOwotCi1zZXRfZXJyb3JfaGFuZGxlcihmdW5jdGlvbiAoJGVycm5vLCAkZXJybXNnKSB7Ci0gICAgbXlfYXNzZXJ0KGZhbHNlLCAiVW5leHBlY3RlZCBQSFAgZXJyb3I6ICIgLiAkZXJybXNnKTsKLX0pOwotCi0vLyBFbXB0eSBzdHJ1Y3RzIHNob3VsZCBub3QgaGF2ZSB2YWxpZGF0b3JzCi1hc3NlcnRfaGFzX25vX3JlYWRfdmFsaWRhdG9yKCdUaHJpZnRUZXN0XEVtcHR5U3RydWN0Jyk7Ci1hc3NlcnRfaGFzX25vX3dyaXRlX3ZhbGlkYXRvcignVGhyaWZ0VGVzdFxFbXB0eVN0cnVjdCcpOwotCi0vLyBCb25rIGhhcyBvbmx5IG9wdF9pbl9yZXFfb3V0IGZpZWxkcwotewotICAgIGFzc2VydF9oYXNfbm9fcmVhZF92YWxpZGF0b3IoJ1RocmlmdFRlc3RcQm9uaycpOwotICAgIGFzc2VydF9oYXNfYV93cml0ZV92YWxpZGF0b3IoJ1RocmlmdFRlc3RcQm9uaycpOwotICAgIHsKLSAgICAgICAgLy8gQ2hlY2sgdGhhdCB3ZSBjYW4gcmVhZCBhbiBlbXB0eSBvYmplY3QKLSAgICAgICAgJGJvbmsgPSBuZXcgXFRocmlmdFRlc3RcQm9uaygpOwotICAgICAgICAkdHJhbnNwb3J0ID0gbmV3IFRNZW1vcnlCdWZmZXIoIlwwMDAiKTsKLSAgICAgICAgJHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCgkdHJhbnNwb3J0KTsKLSAgICAgICAgJGJvbmstPnJlYWQoJHByb3RvY29sKTsKLSAgICB9Ci0gICAgewotICAgICAgICAvLyAuLi5idXQgbm90IHdyaXRlIGFuIGVtcHR5IG9iamVjdAotICAgICAgICAkYm9uayA9IG5ldyBcVGhyaWZ0VGVzdFxCb25rKCk7Ci0gICAgICAgICR0cmFuc3BvcnQgPSBuZXcgVE1lbW9yeUJ1ZmZlcigpOwotICAgICAgICAkcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKCR0cmFuc3BvcnQpOwotICAgICAgICBhc3NlcnRfcHJvdG9jb2xfZXhjZXB0aW9uX3Rocm93bihmdW5jdGlvbiAoKSB1c2UgKCRib25rLCAkcHJvdG9jb2wpIHsgJGJvbmstPndyaXRlKCRwcm90b2NvbCk7IH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCb25rIHdhcyBhYmxlIHRvIHdyaXRlIGFuIGVtcHR5IG9iamVjdCcpOwotICAgIH0KLX0KLQotLy8gU3RydWN0QSBoYXMgYSBzaW5nbGUgcmVxdWlyZWQgZmllbGQKLXsKLSAgICBhc3NlcnRfaGFzX2FfcmVhZF92YWxpZGF0b3IoJ1RocmlmdFRlc3RcU3RydWN0QScpOwotICAgIGFzc2VydF9oYXNfYV93cml0ZV92YWxpZGF0b3IoJ1RocmlmdFRlc3RcU3RydWN0QScpOwotICAgIHsKLSAgICAgICAgLy8gQ2hlY2sgdGhhdCB3ZSBhcmUgbm90IGFibGUgdG8gd3JpdGUgU3RydWN0QSB3aXRoIGEgbWlzc2luZyByZXF1aXJlZCBmaWVsZAotICAgICAgICAkc3RydWN0YSA9IG5ldyBcVGhyaWZ0VGVzdFxTdHJ1Y3RBKCk7Ci0gICAgICAgICR0cmFuc3BvcnQgPSBuZXcgVE1lbW9yeUJ1ZmZlcigpOwotICAgICAgICAkcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKCR0cmFuc3BvcnQpOwotICAgICAgICBhc3NlcnRfcHJvdG9jb2xfZXhjZXB0aW9uX3Rocm93bihmdW5jdGlvbiAoKSB1c2UgKCRzdHJ1Y3RhLCAkcHJvdG9jb2wpIHsgJHN0cnVjdGEtPndyaXRlKCRwcm90b2NvbCk7IH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTdHJ1Y3RBIHdhcyBhYmxlIHRvIHdyaXRlIGFuIGVtcHR5IG9iamVjdCcpOwotICAgIH0KLSAgICB7Ci0gICAgICAgIC8vIENoZWNrIHRoYXQgd2UgYXJlIGFibGUgdG8gcmVhZCBhbmQgd3JpdGUgYSBtZXNzYWdlIHdpdGggYSBnb29kIFN0cnVjdEEKLSAgICAgICAgJHRyYW5zcG9ydCA9IG5ldyBUTWVtb3J5QnVmZmVyKGJhc2U2NF9kZWNvZGUoJ0N3QUJBQUFBQTJGaVl3QT0nKSk7Ci0gICAgICAgICRwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2woJHRyYW5zcG9ydCk7Ci0gICAgICAgICRzdHJ1Y3RhID0gbmV3IFxUaHJpZnRUZXN0XFN0cnVjdEEoKTsKLSAgICAgICAgJHN0cnVjdGEtPnJlYWQoJHByb3RvY29sKTsKLSAgICAgICAgJHN0cnVjdGEtPndyaXRlKCRwcm90b2NvbCk7Ci0gICAgfQotfQotCi0vLyBVbmlvbnMgc2hvdWxkIG5vdCBnZXQgd3JpdGUgdmFsaWRhdG9ycwotYXNzZXJ0X2hhc19ub193cml0ZV92YWxpZGF0b3IoJ1Rlc3RWYWxpZGF0b3JzXFVuaW9uT2ZTdHJpbmdzJyk7Ci0KLS8vIFNlcnZpY2UgX3Jlc3VsdCBjbGFzc2VzIHNob3VsZCBub3QgZ2V0IGFueSB2YWxpZGF0b3JzCi1hc3NlcnRfaGFzX25vX3JlYWRfdmFsaWRhdG9yKCdUZXN0VmFsaWRhdG9yc1xUZXN0U2VydmljZV90ZXN0X3Jlc3VsdCcpOwotYXNzZXJ0X2hhc19ub193cml0ZV92YWxpZGF0b3IoJ1Rlc3RWYWxpZGF0b3JzXFRlc3RTZXJ2aWNlX3Rlc3RfcmVzdWx0Jyk7Ci0KLWZ1bmN0aW9uIGFzc2VydF9oYXNfYV9yZWFkX3ZhbGlkYXRvcigkY2xhc3MpCi17Ci0gICAgbXlfYXNzZXJ0KGhhc19yZWFkX3ZhbGlkYXRvcl9tZXRob2QoJGNsYXNzKSwKLSAgICAgICAgICAgICAgJGNsYXNzIC4gJyBjbGFzcyBzaG91bGQgaGF2ZSBhIHJlYWQgdmFsaWRhdG9yJyk7Ci19Ci0KLWZ1bmN0aW9uIGFzc2VydF9oYXNfbm9fcmVhZF92YWxpZGF0b3IoJGNsYXNzKQotewotICAgIG15X2Fzc2VydCghaGFzX3JlYWRfdmFsaWRhdG9yX21ldGhvZCgkY2xhc3MpLAotICAgICAgICAgICAgICAkY2xhc3MgLiAnIGNsYXNzIHNob3VsZCBub3QgaGF2ZSBhIHJlYWQgdmFsaWRhdG9yJyk7Ci19Ci0KLWZ1bmN0aW9uIGFzc2VydF9oYXNfYV93cml0ZV92YWxpZGF0b3IoJGNsYXNzKQotewotICAgIG15X2Fzc2VydChoYXNfd3JpdGVfdmFsaWRhdG9yX21ldGhvZCgkY2xhc3MpLAotICAgICAgICAgICAgICAkY2xhc3MgLiAnIGNsYXNzIHNob3VsZCBoYXZlIGEgd3JpdGUgdmFsaWRhdG9yJyk7Ci19Ci0KLWZ1bmN0aW9uIGFzc2VydF9oYXNfbm9fd3JpdGVfdmFsaWRhdG9yKCRjbGFzcykKLXsKLSAgICBteV9hc3NlcnQoIWhhc193cml0ZV92YWxpZGF0b3JfbWV0aG9kKCRjbGFzcyksCi0gICAgICAgICAgICAgICRjbGFzcyAuICcgY2xhc3Mgc2hvdWxkIG5vdCBoYXZlIGEgd3JpdGUgdmFsaWRhdG9yJyk7Ci19Ci0KLWZ1bmN0aW9uIGFzc2VydF9wcm90b2NvbF9leGNlcHRpb25fdGhyb3duKCRjYWxsYWJsZSwgJG1lc3NhZ2UpCi17Ci0gICAgdHJ5IHsKLSAgICAgICAgY2FsbF91c2VyX2Z1bmMoJGNhbGxhYmxlKTsKLSAgICAgICAgbXlfYXNzZXJ0KGZhbHNlLCAkbWVzc2FnZSk7Ci0gICAgfSBjYXRjaCAoVFByb3RvY29sRXhjZXB0aW9uICRlKSB7Ci0gICAgfQotfQotCi1mdW5jdGlvbiBoYXNfd3JpdGVfdmFsaWRhdG9yX21ldGhvZCgkY2xhc3MpCi17Ci0gICAgJHJjID0gbmV3IFxSZWZsZWN0aW9uQ2xhc3MoJGNsYXNzKTsKLQotICAgIHJldHVybiAkcmMtPmhhc01ldGhvZCgnX3ZhbGlkYXRlRm9yV3JpdGUnKTsKLX0KLQotZnVuY3Rpb24gaGFzX3JlYWRfdmFsaWRhdG9yX21ldGhvZCgkY2xhc3MpCi17Ci0gICAgJHJjID0gbmV3IFxSZWZsZWN0aW9uQ2xhc3MoJGNsYXNzKTsKLQotICAgIHJldHVybiAkcmMtPmhhc01ldGhvZCgnX3ZhbGlkYXRlRm9yUmVhZCcpOwotfQotCi1mdW5jdGlvbiBteV9hc3NlcnQoJHNvbWV0aGluZywgJG1lc3NhZ2UpCi17Ci0gICAgaWYgKCEkc29tZXRoaW5nKSB7Ci0gICAgICAgIGZ3cml0ZShTVERFUlIsIGJhc2VuYW1lKF9fRklMRV9fKSAuICIgRkFJTEVEOiAkbWVzc2FnZVxuIik7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC90ZXN0L1ZhbGlkYXRvci9CYXNlVmFsaWRhdG9yVGVzdC5waHAgYi9saWIvcGhwL3Rlc3QvVmFsaWRhdG9yL0Jhc2VWYWxpZGF0b3JUZXN0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDI5MDgzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC90ZXN0L1ZhbGlkYXRvci9CYXNlVmFsaWRhdG9yVGVzdC5waHAKQEAgLTAsMCArMSwxNTQgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK25hbWVzcGFjZSBUZXN0XFRocmlmdDsKKwordXNlIFBIUFVuaXRcRnJhbWV3b3JrXFRlc3RDYXNlOwordXNlIFRocmlmdFxFeGNlcHRpb25cVFByb3RvY29sRXhjZXB0aW9uOwordXNlIFRocmlmdFxQcm90b2NvbFxUQmluYXJ5UHJvdG9jb2w7Cit1c2UgVGhyaWZ0XFRyYW5zcG9ydFxUTWVtb3J5QnVmZmVyOworCithYnN0cmFjdCBjbGFzcyBCYXNlVmFsaWRhdG9yVGVzdCBleHRlbmRzIFRlc3RDYXNlCit7CisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RFbXB0eVN0cnVjdFZhbGlkYXRvcigpCisgICAgeworICAgICAgICAkdGhpcy0+YXNzZXJ0Tm9SZWFkVmFsaWRhdG9yKCdUaHJpZnRUZXN0XEVtcHR5U3RydWN0Jyk7CisgICAgICAgICR0aGlzLT5hc3NlcnROb1dyaXRlVmFsaWRhdG9yKCdUaHJpZnRUZXN0XEVtcHR5U3RydWN0Jyk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RCb25rVmFsaWRhdG9yKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5hc3NlcnROb1JlYWRWYWxpZGF0b3IoJ1RocmlmdFRlc3RcQm9uaycpOworICAgICAgICAkdGhpcy0+YXNzZXJ0SGFzV3JpdGVWYWxpZGF0b3IoJ1RocmlmdFRlc3RcQm9uaycpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RydWN0QVZhbGlkYXRvcigpCisgICAgeworICAgICAgICAkdGhpcy0+YXNzZXJ0SGFzUmVhZFZhbGlkYXRvcignVGhyaWZ0VGVzdFxTdHJ1Y3RBJyk7CisgICAgICAgICR0aGlzLT5hc3NlcnRIYXNXcml0ZVZhbGlkYXRvcignVGhyaWZ0VGVzdFxTdHJ1Y3RBJyk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RVbmlvbk9mU3RyaW5nc1ZhbGlkYXRvcigpCisgICAgeworICAgICAgICAkdGhpcy0+YXNzZXJ0Tm9Xcml0ZVZhbGlkYXRvcignVGVzdFZhbGlkYXRvcnNcVW5pb25PZlN0cmluZ3MnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFNlcnZpY2VSZXN1bHRWYWxpZGF0b3IoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmFzc2VydE5vUmVhZFZhbGlkYXRvcignVGVzdFZhbGlkYXRvcnNcVGVzdFNlcnZpY2VfdGVzdF9yZXN1bHQnKTsKKyAgICAgICAgJHRoaXMtPmFzc2VydE5vV3JpdGVWYWxpZGF0b3IoJ1Rlc3RWYWxpZGF0b3JzXFRlc3RTZXJ2aWNlX3Rlc3RfcmVzdWx0Jyk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RSZWFkRW1wdHkoKQorICAgIHsKKyAgICAgICAgJGJvbmsgPSBuZXcgXFRocmlmdFRlc3RcQm9uaygpOworICAgICAgICAkdHJhbnNwb3J0ID0gbmV3IFRNZW1vcnlCdWZmZXIoIlwwMDAiKTsKKyAgICAgICAgJHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCgkdHJhbnNwb3J0KTsKKyAgICAgICAgJGJvbmstPnJlYWQoJHByb3RvY29sKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFdyaXRlRW1wdHkoKQorICAgIHsKKyAgICAgICAgJGJvbmsgPSBuZXcgXFRocmlmdFRlc3RcQm9uaygpOworICAgICAgICAkdHJhbnNwb3J0ID0gbmV3IFRNZW1vcnlCdWZmZXIoKTsKKyAgICAgICAgJHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCgkdHJhbnNwb3J0KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICRib25rLT53cml0ZSgkcHJvdG9jb2wpOworICAgICAgICAgICAgJHRoaXMtPmZhaWwoJ0Jvbmsgd2FzIGFibGUgdG8gd3JpdGUgYW4gZW1wdHkgb2JqZWN0Jyk7CisgICAgICAgIH0gY2F0Y2ggKFRQcm90b2NvbEV4Y2VwdGlvbiAkZSkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RXcml0ZVdpdGhNaXNzaW5nUmVxdWlyZWQoKQorICAgIHsKKyAgICAgICAgLy8gQ2hlY2sgdGhhdCB3ZSBhcmUgbm90IGFibGUgdG8gd3JpdGUgU3RydWN0QSB3aXRoIGEgbWlzc2luZyByZXF1aXJlZCBmaWVsZAorICAgICAgICAkc3RydWN0YSA9IG5ldyBcVGhyaWZ0VGVzdFxTdHJ1Y3RBKCk7CisgICAgICAgICR0cmFuc3BvcnQgPSBuZXcgVE1lbW9yeUJ1ZmZlcigpOworICAgICAgICAkcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKCR0cmFuc3BvcnQpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAkc3RydWN0YS0+d3JpdGUoJHByb3RvY29sKTsKKyAgICAgICAgICAgICR0aGlzLT5mYWlsKCdTdHJ1Y3RBIHdhcyBhYmxlIHRvIHdyaXRlIGFuIGVtcHR5IG9iamVjdCcpOworICAgICAgICB9IGNhdGNoIChUUHJvdG9jb2xFeGNlcHRpb24gJGUpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0UmVhZFN0cnVjdEEoKQorICAgIHsKKyAgICAgICAgJHRyYW5zcG9ydCA9IG5ldyBUTWVtb3J5QnVmZmVyKGJhc2U2NF9kZWNvZGUoJ0N3QUJBQUFBQTJGaVl3QT0nKSk7CisgICAgICAgICRwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2woJHRyYW5zcG9ydCk7CisgICAgICAgICRzdHJ1Y3RhID0gbmV3IFxUaHJpZnRUZXN0XFN0cnVjdEEoKTsKKyAgICAgICAgJHN0cnVjdGEtPnJlYWQoJHByb3RvY29sKTsKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygiYWJjIiwgJHN0cnVjdGEtPnMpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0V3JpdGVTdHJ1Y3RBKCkKKyAgICB7CisgICAgICAgICR0cmFuc3BvcnQgPSBuZXcgVE1lbW9yeUJ1ZmZlcigpOworICAgICAgICAkcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKCR0cmFuc3BvcnQpOworICAgICAgICAkc3RydWN0YSA9IG5ldyBcVGhyaWZ0VGVzdFxTdHJ1Y3RBKCk7CisgICAgICAgICRzdHJ1Y3RhLT5zID0gImFiYyI7CisgICAgICAgICRzdHJ1Y3RhLT53cml0ZSgkcHJvdG9jb2wpOworICAgICAgICAkd3JpdGVSZXN1bHQgPSBiYXNlNjRfZW5jb2RlKCR0cmFuc3BvcnQtPmdldEJ1ZmZlcigpKTsKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygnQ3dBQkFBQUFBMkZpWXdBPScsICR3cml0ZVJlc3VsdCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmdW5jdGlvbiBhc3NlcnRIYXNSZWFkVmFsaWRhdG9yKCRjbGFzcykKKyAgICB7CisgICAgICAgIGlmICghc3RhdGljOjpoYXNSZWFkVmFsaWRhdG9yKCRjbGFzcykpIHsKKyAgICAgICAgICAgIHN0YXRpYzo6ZmFpbCgkY2xhc3MgLiAnIGNsYXNzIHNob3VsZCBoYXZlIGEgcmVhZCB2YWxpZGF0b3InKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBzdGF0aWMgZnVuY3Rpb24gYXNzZXJ0Tm9SZWFkVmFsaWRhdG9yKCRjbGFzcykKKyAgICB7CisgICAgICAgIGlmIChzdGF0aWM6Omhhc1JlYWRWYWxpZGF0b3IoJGNsYXNzKSkgeworICAgICAgICAgICAgc3RhdGljOjpmYWlsKCRjbGFzcyAuICcgY2xhc3Mgc2hvdWxkIG5vdCBoYXZlIGEgd3JpdGUgdmFsaWRhdG9yJyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZ1bmN0aW9uIGFzc2VydEhhc1dyaXRlVmFsaWRhdG9yKCRjbGFzcykKKyAgICB7CisgICAgICAgIGlmICghc3RhdGljOjpoYXNXcml0ZVZhbGlkYXRvcigkY2xhc3MpKSB7CisgICAgICAgICAgICBzdGF0aWM6OmZhaWwoJGNsYXNzIC4gJyBjbGFzcyBzaG91bGQgaGF2ZSBhIHdyaXRlIHZhbGlkYXRvcicpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmdW5jdGlvbiBhc3NlcnROb1dyaXRlVmFsaWRhdG9yKCRjbGFzcykKKyAgICB7CisgICAgICAgIGlmIChzdGF0aWM6Omhhc1dyaXRlVmFsaWRhdG9yKCRjbGFzcykpIHsKKyAgICAgICAgICAgIHN0YXRpYzo6ZmFpbCgkY2xhc3MgLiAnIGNsYXNzIHNob3VsZCBub3QgaGF2ZSBhIHdyaXRlIHZhbGlkYXRvcicpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaGFzUmVhZFZhbGlkYXRvcigkY2xhc3MpCisgICAgeworICAgICAgICAkcmMgPSBuZXcgXFJlZmxlY3Rpb25DbGFzcygkY2xhc3MpOworCisgICAgICAgIHJldHVybiAkcmMtPmhhc01ldGhvZCgnX3ZhbGlkYXRlRm9yUmVhZCcpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGhhc1dyaXRlVmFsaWRhdG9yKCRjbGFzcykKKyAgICB7CisgICAgICAgICRyYyA9IG5ldyBcUmVmbGVjdGlvbkNsYXNzKCRjbGFzcyk7CisKKyAgICAgICAgcmV0dXJuICRyYy0+aGFzTWV0aG9kKCdfdmFsaWRhdGVGb3JXcml0ZScpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvdGVzdC9WYWxpZGF0b3IvVmFsaWRhdG9yVGVzdC5waHAgYi9saWIvcGhwL3Rlc3QvVmFsaWRhdG9yL1ZhbGlkYXRvclRlc3QucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNmM3YTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL3Rlc3QvVmFsaWRhdG9yL1ZhbGlkYXRvclRlc3QucGhwCkBAIC0wLDAgKzEsNDEgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK25hbWVzcGFjZSBUZXN0XFRocmlmdDsKKworcmVxdWlyZSBfX0RJUl9fIC4gJy8uLi8uLi8uLi8uLi92ZW5kb3IvYXV0b2xvYWQucGhwJzsKKwordXNlIFRocmlmdFxDbGFzc0xvYWRlclxUaHJpZnRDbGFzc0xvYWRlcjsKKworLyoqCisgKiBDbGFzcyBUZXN0VmFsaWRhdG9ycworICogQHBhY2thZ2UgVGVzdFxUaHJpZnQKKyAqCisgKiBAcnVuVGVzdHNJblNlcGFyYXRlUHJvY2Vzc2VzCisgKi8KK2NsYXNzIFZhbGlkYXRvclRlc3QgZXh0ZW5kcyBCYXNlVmFsaWRhdG9yVGVzdAoreworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRVcCgpCisgICAgeworICAgICAgICAvKiogQHZhciBcQ29tcG9zZXJcQXV0b2xvYWRcQ2xhc3NMb2FkZXIgJGxvYWRlciAqLworICAgICAgICAkbG9hZGVyID0gcmVxdWlyZSBfX0RJUl9fIC4gJy8uLi8uLi8uLi8uLi92ZW5kb3IvYXV0b2xvYWQucGhwJzsKKyAgICAgICAgJGxvYWRlci0+YWRkUHNyNCgnJywgX19ESVJfXyAuICcvLi4vcGFja2FnZXMvcGhwdicpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvdGVzdC9WYWxpZGF0b3IvVmFsaWRhdG9yVGVzdE9vcC5waHAgYi9saWIvcGhwL3Rlc3QvVmFsaWRhdG9yL1ZhbGlkYXRvclRlc3RPb3AucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzYmNhNGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL3Rlc3QvVmFsaWRhdG9yL1ZhbGlkYXRvclRlc3RPb3AucGhwCkBAIC0wLDAgKzEsNDEgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK25hbWVzcGFjZSBUZXN0XFRocmlmdDsKKworcmVxdWlyZV9vbmNlIF9fRElSX18gLiAnLy4uLy4uLy4uLy4uL3ZlbmRvci9hdXRvbG9hZC5waHAnOworCit1c2UgVGhyaWZ0XENsYXNzTG9hZGVyXFRocmlmdENsYXNzTG9hZGVyOworCisvKioKKyAqIENsYXNzIFRlc3RWYWxpZGF0b3JzT29wCisgKiBAcGFja2FnZSBUZXN0XFRocmlmdAorICoKKyAqIEBydW5UZXN0c0luU2VwYXJhdGVQcm9jZXNzZXMKKyAqLworY2xhc3MgVmFsaWRhdG9yVGVzdE9vcCBleHRlbmRzIEJhc2VWYWxpZGF0b3JUZXN0Cit7CisgICAgcHVibGljIGZ1bmN0aW9uIHNldFVwKCkKKyAgICB7CisgICAgICAgIC8qKiBAdmFyIFxDb21wb3NlclxBdXRvbG9hZFxDbGFzc0xvYWRlciAkbG9hZGVyICovCisgICAgICAgICRsb2FkZXIgPSByZXF1aXJlIF9fRElSX18gLiAnLy4uLy4uLy4uLy4uL3ZlbmRvci9hdXRvbG9hZC5waHAnOworICAgICAgICAkbG9hZGVyLT5hZGRQc3I0KCcnLCBfX0RJUl9fIC4gJy8uLi9wYWNrYWdlcy9waHB2bycpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9weS9DTWFrZUxpc3RzLnR4dCBiL2xpYi9weS9DTWFrZUxpc3RzLnR4dApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGVmOTg3YjYuLjdiYjkxZmUKLS0tIGEvbGliL3B5L0NNYWtlTGlzdHMudHh0CisrKyBiL2xpYi9weS9DTWFrZUxpc3RzLnR4dApAQCAtMjQsMyArMjQsOCBAQAogICAgIFdPUktJTkdfRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfQogICAgIENPTU1FTlQgIkJ1aWxkaW5nIFB5dGhvbiBsaWJyYXJ5IgogKQorCitpZihCVUlMRF9URVNUSU5HKQorICAgIGFkZF90ZXN0KFB5dGhvblRlc3RTU0xTb2NrZXQgJHtQWVRIT05fRVhFQ1VUQUJMRX0gJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3Rlc3QvdGVzdF9zc2xzb2NrZXQucHkpCisgICAgYWRkX3Rlc3QoUHl0aG9uVGhyaWZ0SnNvbiAke1BZVEhPTl9FWEVDVVRBQkxFfSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vdGVzdC90aHJpZnRfanNvbi5weSkKK2VuZGlmKCkKZGlmZiAtLWdpdCBhL2xpYi9weS9NQU5JRkVTVC5pbiBiL2xpYi9weS9NQU5JRkVTVC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjU0ZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5L01BTklGRVNULmluCkBAIC0wLDAgKzEgQEAKK2luY2x1ZGUgc3JjL2V4dC8qCmRpZmYgLS1naXQgYS9saWIvcHkvTWFrZWZpbGUuYW0gYi9saWIvcHkvTWFrZWZpbGUuYW0Kb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCAyY2RiYjI0Li41ODYxODU4Ci0tLSBhL2xpYi9weS9NYWtlZmlsZS5hbQorKysgYi9saWIvcHkvTWFrZWZpbGUuYW0KQEAgLTE5LDcgKzE5LDE4IEBACiBBVVRPTUFLRV9PUFRJT05TID0gc2VyaWFsLXRlc3RzCiBERVNURElSID89IC8KIAotYWxsLWxvY2FsOgoraWYgV0lUSF9QWTMKK3B5My1idWlsZDoKKwkkKFBZVEhPTjMpIHNldHVwLnB5IGJ1aWxkCitweTMtdGVzdDogcHkzLWJ1aWxkCisJJChQWVRIT04zKSB0ZXN0L3RocmlmdF9qc29uLnB5CisJJChQWVRIT04zKSB0ZXN0L3Rlc3Rfc3Nsc29ja2V0LnB5CitlbHNlCitweTMtYnVpbGQ6CitweTMtdGVzdDoKK2VuZGlmCisKK2FsbC1sb2NhbDogcHkzLWJ1aWxkCiAJJChQWVRIT04pIHNldHVwLnB5IGJ1aWxkCiAKICMgV2UncmUgaWdub3JpbmcgcHJlZml4IGhlcmUgYmVjYXVzZSBzaXRlLXBhY2thZ2VzIHNlZW1zIHRvIGJlCkBAIC0zMiwxMyArNDMsMTcgQEAKIGNsZWFuLWxvY2FsOgogCSQoUk0pIC1yIGJ1aWxkCiAKLWNoZWNrLWxvY2FsOiBhbGwKK2NoZWNrLWxvY2FsOiBhbGwgcHkzLXRlc3QKKwkkKFBZVEhPTikgdGVzdC90aHJpZnRfanNvbi5weQorCSQoUFlUSE9OKSB0ZXN0L3Rlc3Rfc3Nsc29ja2V0LnB5CiAKIEVYVFJBX0RJU1QgPSBcCiAJQ01ha2VMaXN0cy50eHQgXAorCU1BTklGRVNULmluIFwKIAljb2Rpbmdfc3RhbmRhcmRzLm1kIFwKIAljb21wYXQgXAogCXNldHVwLnB5IFwKIAlzZXR1cC5jZmcgXAogCXNyYyBcCisJdGVzdCBcCiAJUkVBRE1FLm1kCmRpZmYgLS1naXQgYS9saWIvcHkvc2V0dXAuY2ZnIGIvbGliL3B5L3NldHVwLmNmZwppbmRleCBjNmRhYjQwLi5jOWVkMGFlIDEwMDY0NAotLS0gYS9saWIvcHkvc2V0dXAuY2ZnCisrKyBiL2xpYi9weS9zZXR1cC5jZmcKQEAgLTIsMyArMiw1IEBACiBvcHRpbWl6ZSA9IDEKIFttZXRhZGF0YV0KIGRlc2NyaXB0aW9uLWZpbGUgPSBSRUFETUUubWQKK1tmbGFrZThdCittYXgtbGluZS1sZW5ndGggPSAxMDAKZGlmZiAtLWdpdCBhL2xpYi9weS9zZXR1cC5weSBiL2xpYi9weS9zZXR1cC5weQppbmRleCA4MzZjZjcxLi4zY2YxNDY5IDEwMDY0NAotLS0gYS9saWIvcHkvc2V0dXAucHkKKysrIGIvbGliL3B5L3NldHVwLnB5CkBAIC05LDcgKzksNyBAQAogIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCiAjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogIwotIwlodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICMKICMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAogIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgpAQCAtMjIsOCArMjIsOCBAQAogaW1wb3J0IHN5cwogdHJ5OgogICAgIGZyb20gc2V0dXB0b29scyBpbXBvcnQgc2V0dXAsIEV4dGVuc2lvbgotZXhjZXB0OgotICAgIGZyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IHNldHVwLCBFeHRlbnNpb24sIENvbW1hbmQKK2V4Y2VwdCBFeGNlcHRpb246CisgICAgZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgc2V0dXAsIEV4dGVuc2lvbgogCiBmcm9tIGRpc3R1dGlscy5jb21tYW5kLmJ1aWxkX2V4dCBpbXBvcnQgYnVpbGRfZXh0CiBmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IENDb21waWxlckVycm9yLCBEaXN0dXRpbHNFeGVjRXJyb3IsIERpc3R1dGlsc1BsYXRmb3JtRXJyb3IKQEAgLTMxLDc0ICszMSwxMDMgQEAKICMgRml4IHRvIGJ1aWxkIHNkaXN0IHVuZGVyIHZhZ3JhbnQKIGltcG9ydCBvcwogaWYgJ3ZhZ3JhbnQnIGluIHN0cihvcy5lbnZpcm9uKToKLSAgICBkZWwgb3MubGluaworICAgIHRyeToKKyAgICAgICAgZGVsIG9zLmxpbmsKKyAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgIHBhc3MKIAotaW5jbHVkZV9kaXJzID0gW10KK2luY2x1ZGVfZGlycyA9IFsnc3JjJ10KIGlmIHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInOgogICAgIGluY2x1ZGVfZGlycy5hcHBlbmQoJ2NvbXBhdC93aW4zMicpCiAgICAgZXh0X2Vycm9ycyA9IChDQ29tcGlsZXJFcnJvciwgRGlzdHV0aWxzRXhlY0Vycm9yLCBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yLCBJT0Vycm9yKQogZWxzZToKICAgICBleHRfZXJyb3JzID0gKENDb21waWxlckVycm9yLCBEaXN0dXRpbHNFeGVjRXJyb3IsIERpc3R1dGlsc1BsYXRmb3JtRXJyb3IpCiAKKwogY2xhc3MgQnVpbGRGYWlsZWQoRXhjZXB0aW9uKToKICAgICBwYXNzCiAKKwogY2xhc3MgdmVfYnVpbGRfZXh0KGJ1aWxkX2V4dCk6CiAgICAgZGVmIHJ1bihzZWxmKToKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgYnVpbGRfZXh0LnJ1bihzZWxmKQotICAgICAgICBleGNlcHQgRGlzdHV0aWxzUGxhdGZvcm1FcnJvciBhcyB4OgorICAgICAgICBleGNlcHQgRGlzdHV0aWxzUGxhdGZvcm1FcnJvcjoKICAgICAgICAgICAgIHJhaXNlIEJ1aWxkRmFpbGVkKCkKIAogICAgIGRlZiBidWlsZF9leHRlbnNpb24oc2VsZiwgZXh0KToKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgYnVpbGRfZXh0LmJ1aWxkX2V4dGVuc2lvbihzZWxmLCBleHQpCi0gICAgICAgIGV4Y2VwdCBleHRfZXJyb3JzIGFzIHg6CisgICAgICAgIGV4Y2VwdCBleHRfZXJyb3JzOgogICAgICAgICAgICAgcmFpc2UgQnVpbGRGYWlsZWQoKQogCisKIGRlZiBydW5fc2V0dXAod2l0aF9iaW5hcnkpOgogICAgIGlmIHdpdGhfYmluYXJ5OgogICAgICAgICBleHRlbnNpb25zID0gZGljdCgKLSAgICAgICAgICAgIGV4dF9tb2R1bGVzID0gWwotICAgICAgICAgICAgICAgICBFeHRlbnNpb24oJ3RocmlmdC5wcm90b2NvbC5mYXN0YmluYXJ5JywKLSAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcyA9IFsnc3JjL3Byb3RvY29sL2Zhc3RiaW5hcnkuYyddLAotICAgICAgICAgICAgICAgICAgICBpbmNsdWRlX2RpcnMgPSBpbmNsdWRlX2RpcnMsCi0gICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgZXh0X21vZHVsZXM9WworICAgICAgICAgICAgICAgIEV4dGVuc2lvbigndGhyaWZ0LnByb3RvY29sLmZhc3RiaW5hcnknLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzPVsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvZXh0L21vZHVsZS5jcHAnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9leHQvdHlwZXMuY3BwJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcmMvZXh0L2JpbmFyeS5jcHAnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9leHQvY29tcGFjdC5jcHAnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlX2RpcnM9aW5jbHVkZV9kaXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICBdLAogICAgICAgICAgICAgY21kY2xhc3M9ZGljdChidWlsZF9leHQ9dmVfYnVpbGRfZXh0KQogICAgICAgICApCiAgICAgZWxzZToKICAgICAgICAgZXh0ZW5zaW9ucyA9IGRpY3QoKQotICAgICAgICAKLSAgICBzZXR1cChuYW1lID0gJ3RocmlmdCcsCi0gICAgICAgIHZlcnNpb24gPSAnMC45LjMnLAotICAgICAgICBkZXNjcmlwdGlvbiA9ICdQeXRob24gYmluZGluZ3MgZm9yIHRoZSBBcGFjaGUgVGhyaWZ0IFJQQyBzeXN0ZW0nLAotICAgICAgICBhdXRob3IgPSAnVGhyaWZ0IERldmVsb3BlcnMnLAotICAgICAgICBhdXRob3JfZW1haWwgPSAnZGV2QHRocmlmdC5hcGFjaGUub3JnJywKLSAgICAgICAgdXJsID0gJ2h0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZycsCi0gICAgICAgIGxpY2Vuc2UgPSAnQXBhY2hlIExpY2Vuc2UgMi4wJywKLSAgICAgICAgcGFja2FnZXMgPSBbCi0gICAgICAgICAgICAndGhyaWZ0JywKLSAgICAgICAgICAgICd0aHJpZnQucHJvdG9jb2wnLAotICAgICAgICAgICAgJ3RocmlmdC50cmFuc3BvcnQnLAotICAgICAgICAgICAgJ3RocmlmdC5zZXJ2ZXInLAotICAgICAgICBdLAotICAgICAgICBwYWNrYWdlX2RpciA9IHsndGhyaWZ0JyA6ICdzcmMnfSwKLSAgICAgICAgY2xhc3NpZmllcnMgPSBbCi0gICAgICAgICAgICAnRGV2ZWxvcG1lbnQgU3RhdHVzIDo6IDUgLSBQcm9kdWN0aW9uL1N0YWJsZScsCi0gICAgICAgICAgICAnRW52aXJvbm1lbnQgOjogQ29uc29sZScsCi0gICAgICAgICAgICAnSW50ZW5kZWQgQXVkaWVuY2UgOjogRGV2ZWxvcGVycycsCi0gICAgICAgICAgICAnUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uJywKLSAgICAgICAgICAgICdQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMicsCi0gICAgICAgICAgICAnVG9waWMgOjogU29mdHdhcmUgRGV2ZWxvcG1lbnQgOjogTGlicmFyaWVzJywKLSAgICAgICAgICAgICdUb3BpYyA6OiBTeXN0ZW0gOjogTmV0d29ya2luZycKLSAgICAgICAgXSwKLSAgICAgICAgdXNlXzJ0bzMgPSBUcnVlLAotICAgICAgICAqKmV4dGVuc2lvbnMKLSAgICApCisKKyAgICBzc2xfZGVwcyA9IFtdCisgICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA9PSAyOgorICAgICAgICBzc2xfZGVwcy5hcHBlbmQoJ2lwYWRkcmVzcycpCisgICAgaWYgc3lzLmhleHZlcnNpb24gPCAweDAzMDUwMDAwOgorICAgICAgICBzc2xfZGVwcy5hcHBlbmQoJ2JhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWU+PTMuNScpCisgICAgdG9ybmFkb19kZXBzID0gWyd0b3JuYWRvPj00LjAnXQorICAgIHR3aXN0ZWRfZGVwcyA9IFsndHdpc3RlZCddCisKKyAgICBzZXR1cChuYW1lPSd0aHJpZnQnLAorICAgICAgICAgIHZlcnNpb249JzEuMC4wJywKKyAgICAgICAgICBkZXNjcmlwdGlvbj0nUHl0aG9uIGJpbmRpbmdzIGZvciB0aGUgQXBhY2hlIFRocmlmdCBSUEMgc3lzdGVtJywKKyAgICAgICAgICBhdXRob3I9J0FwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycycsCisgICAgICAgICAgYXV0aG9yX2VtYWlsPSdkZXZAdGhyaWZ0LmFwYWNoZS5vcmcnLAorICAgICAgICAgIHVybD0naHR0cDovL3RocmlmdC5hcGFjaGUub3JnJywKKyAgICAgICAgICBsaWNlbnNlPSdBcGFjaGUgTGljZW5zZSAyLjAnLAorICAgICAgICAgIGluc3RhbGxfcmVxdWlyZXM9WydzaXg+PTEuNy4yJ10sCisgICAgICAgICAgZXh0cmFzX3JlcXVpcmU9eworICAgICAgICAgICAgICAnc3NsJzogc3NsX2RlcHMsCisgICAgICAgICAgICAgICd0b3JuYWRvJzogdG9ybmFkb19kZXBzLAorICAgICAgICAgICAgICAndHdpc3RlZCc6IHR3aXN0ZWRfZGVwcywKKyAgICAgICAgICAgICAgJ2FsbCc6IHNzbF9kZXBzICsgdG9ybmFkb19kZXBzICsgdHdpc3RlZF9kZXBzLAorICAgICAgICAgIH0sCisgICAgICAgICAgcGFja2FnZXM9WworICAgICAgICAgICAgICAndGhyaWZ0JywKKyAgICAgICAgICAgICAgJ3RocmlmdC5wcm90b2NvbCcsCisgICAgICAgICAgICAgICd0aHJpZnQudHJhbnNwb3J0JywKKyAgICAgICAgICAgICAgJ3RocmlmdC5zZXJ2ZXInLAorICAgICAgICAgIF0sCisgICAgICAgICAgcGFja2FnZV9kaXI9eyd0aHJpZnQnOiAnc3JjJ30sCisgICAgICAgICAgY2xhc3NpZmllcnM9WworICAgICAgICAgICAgICAnRGV2ZWxvcG1lbnQgU3RhdHVzIDo6IDUgLSBQcm9kdWN0aW9uL1N0YWJsZScsCisgICAgICAgICAgICAgICdFbnZpcm9ubWVudCA6OiBDb25zb2xlJywKKyAgICAgICAgICAgICAgJ0ludGVuZGVkIEF1ZGllbmNlIDo6IERldmVsb3BlcnMnLAorICAgICAgICAgICAgICAnUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uJywKKyAgICAgICAgICAgICAgJ1Byb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAyJywKKyAgICAgICAgICAgICAgJ1Byb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzJywKKyAgICAgICAgICAgICAgJ1RvcGljIDo6IFNvZnR3YXJlIERldmVsb3BtZW50IDo6IExpYnJhcmllcycsCisgICAgICAgICAgICAgICdUb3BpYyA6OiBTeXN0ZW0gOjogTmV0d29ya2luZycKKyAgICAgICAgICBdLAorICAgICAgICAgIHppcF9zYWZlPUZhbHNlLAorICAgICAgICAgICoqZXh0ZW5zaW9ucworICAgICAgICAgICkKKwogCiB0cnk6Ci0gICAgcnVuX3NldHVwKFRydWUpCisgICAgd2l0aF9iaW5hcnkgPSBUcnVlCisgICAgcnVuX3NldHVwKHdpdGhfYmluYXJ5KQogZXhjZXB0IEJ1aWxkRmFpbGVkOgogICAgIHByaW50KCkKICAgICBwcmludCgnKicgKiA4MCkKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvVE11bHRpcGxleGVkUHJvY2Vzc29yLnB5IGIvbGliL3B5L3NyYy9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IucHkKaW5kZXggYThkNTU2NS4uM2FjNWFmMCAxMDA2NDQKLS0tIGEvbGliL3B5L3NyYy9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IucHkKKysrIGIvbGliL3B5L3NyYy9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IucHkKQEAgLTIwLDM5ICsyMCwzNSBAQAogZnJvbSB0aHJpZnQuVGhyaWZ0IGltcG9ydCBUUHJvY2Vzc29yLCBUTWVzc2FnZVR5cGUsIFRFeGNlcHRpb24KIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUUHJvdG9jb2xEZWNvcmF0b3IsIFRNdWx0aXBsZXhlZFByb3RvY29sCiAKKwogY2xhc3MgVE11bHRpcGxleGVkUHJvY2Vzc29yKFRQcm9jZXNzb3IpOgotICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgc2VsZi5zZXJ2aWNlcyA9IHt9CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLnNlcnZpY2VzID0ge30KIAotICBkZWYgcmVnaXN0ZXJQcm9jZXNzb3Ioc2VsZiwgc2VydmljZU5hbWUsIHByb2Nlc3Nvcik6Ci0gICAgc2VsZi5zZXJ2aWNlc1tzZXJ2aWNlTmFtZV0gPSBwcm9jZXNzb3IKKyAgICBkZWYgcmVnaXN0ZXJQcm9jZXNzb3Ioc2VsZiwgc2VydmljZU5hbWUsIHByb2Nlc3Nvcik6CisgICAgICAgIHNlbGYuc2VydmljZXNbc2VydmljZU5hbWVdID0gcHJvY2Vzc29yCiAKLSAgZGVmIHByb2Nlc3Moc2VsZiwgaXByb3QsIG9wcm90KToKLSAgICAobmFtZSwgdHlwZSwgc2VxaWQpID0gaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpOwotICAgIGlmIHR5cGUgIT0gVE1lc3NhZ2VUeXBlLkNBTEwgJiB0eXBlICE9IFRNZXNzYWdlVHlwZS5PTkVXQVk6Ci0gICAgICByYWlzZSBURXhjZXB0aW9uKCJUTXVsdGlwbGV4IHByb3RvY29sIG9ubHkgc3VwcG9ydHMgQ0FMTCAmIE9ORVdBWSIpCisgICAgZGVmIHByb2Nlc3Moc2VsZiwgaXByb3QsIG9wcm90KToKKyAgICAgICAgKG5hbWUsIHR5cGUsIHNlcWlkKSA9IGlwcm90LnJlYWRNZXNzYWdlQmVnaW4oKQorICAgICAgICBpZiB0eXBlICE9IFRNZXNzYWdlVHlwZS5DQUxMIGFuZCB0eXBlICE9IFRNZXNzYWdlVHlwZS5PTkVXQVk6CisgICAgICAgICAgICByYWlzZSBURXhjZXB0aW9uKCJUTXVsdGlwbGV4ZWQgcHJvdG9jb2wgb25seSBzdXBwb3J0cyBDQUxMICYgT05FV0FZIikKIAotICAgIGluZGV4ID0gbmFtZS5maW5kKFRNdWx0aXBsZXhlZFByb3RvY29sLlNFUEFSQVRPUikKLSAgICBpZiBpbmRleCA8IDA6Ci0gICAgICByYWlzZSBURXhjZXB0aW9uKCJTZXJ2aWNlIG5hbWUgbm90IGZvdW5kIGluIG1lc3NhZ2UgbmFtZTogIiArIG5hbWUgKyAiLiBEaWQgeW91IGZvcmdldCB0byB1c2UgVE11bHRpcGxleFByb3RvY29sIGluIHlvdXIgY2xpZW50PyIpCisgICAgICAgIGluZGV4ID0gbmFtZS5maW5kKFRNdWx0aXBsZXhlZFByb3RvY29sLlNFUEFSQVRPUikKKyAgICAgICAgaWYgaW5kZXggPCAwOgorICAgICAgICAgICAgcmFpc2UgVEV4Y2VwdGlvbigiU2VydmljZSBuYW1lIG5vdCBmb3VuZCBpbiBtZXNzYWdlIG5hbWU6ICIgKyBuYW1lICsgIi4gRGlkIHlvdSBmb3JnZXQgdG8gdXNlIFRNdWx0aXBsZXhlZFByb3RvY29sIGluIHlvdXIgY2xpZW50PyIpCiAKLSAgICBzZXJ2aWNlTmFtZSA9IG5hbWVbMDppbmRleF0KLSAgICBjYWxsID0gbmFtZVtpbmRleCtsZW4oVE11bHRpcGxleGVkUHJvdG9jb2wuU0VQQVJBVE9SKTpdCi0gICAgaWYgbm90IHNlcnZpY2VOYW1lIGluIHNlbGYuc2VydmljZXM6Ci0gICAgICByYWlzZSBURXhjZXB0aW9uKCJTZXJ2aWNlIG5hbWUgbm90IGZvdW5kOiAiICsgc2VydmljZU5hbWUgKyAiLiBEaWQgeW91IGZvcmdldCB0byBjYWxsIHJlZ2lzdGVyUHJvY2Vzc29yKCk/IikKKyAgICAgICAgc2VydmljZU5hbWUgPSBuYW1lWzA6aW5kZXhdCisgICAgICAgIGNhbGwgPSBuYW1lW2luZGV4ICsgbGVuKFRNdWx0aXBsZXhlZFByb3RvY29sLlNFUEFSQVRPUik6XQorICAgICAgICBpZiBzZXJ2aWNlTmFtZSBub3QgaW4gc2VsZi5zZXJ2aWNlczoKKyAgICAgICAgICAgIHJhaXNlIFRFeGNlcHRpb24oIlNlcnZpY2UgbmFtZSBub3QgZm91bmQ6ICIgKyBzZXJ2aWNlTmFtZSArICIuIERpZCB5b3UgZm9yZ2V0IHRvIGNhbGwgcmVnaXN0ZXJQcm9jZXNzb3IoKT8iKQogCi0gICAgc3RhbmRhcmRNZXNzYWdlID0gKAotICAgICAgY2FsbCwKLSAgICAgIHR5cGUsCi0gICAgICBzZXFpZAotICAgICkKLSAgICByZXR1cm4gc2VsZi5zZXJ2aWNlc1tzZXJ2aWNlTmFtZV0ucHJvY2VzcyhTdG9yZWRNZXNzYWdlUHJvdG9jb2woaXByb3QsIHN0YW5kYXJkTWVzc2FnZSksIG9wcm90KQorICAgICAgICBzdGFuZGFyZE1lc3NhZ2UgPSAoY2FsbCwgdHlwZSwgc2VxaWQpCisgICAgICAgIHJldHVybiBzZWxmLnNlcnZpY2VzW3NlcnZpY2VOYW1lXS5wcm9jZXNzKFN0b3JlZE1lc3NhZ2VQcm90b2NvbChpcHJvdCwgc3RhbmRhcmRNZXNzYWdlKSwgb3Byb3QpCiAKIAogY2xhc3MgU3RvcmVkTWVzc2FnZVByb3RvY29sKFRQcm90b2NvbERlY29yYXRvci5UUHJvdG9jb2xEZWNvcmF0b3IpOgotICBkZWYgX19pbml0X18oc2VsZiwgcHJvdG9jb2wsIG1lc3NhZ2VCZWdpbik6Ci0gICAgVFByb3RvY29sRGVjb3JhdG9yLlRQcm90b2NvbERlY29yYXRvci5fX2luaXRfXyhzZWxmLCBwcm90b2NvbCkKLSAgICBzZWxmLm1lc3NhZ2VCZWdpbiA9IG1lc3NhZ2VCZWdpbgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcm90b2NvbCwgbWVzc2FnZUJlZ2luKToKKyAgICAgICAgc2VsZi5tZXNzYWdlQmVnaW4gPSBtZXNzYWdlQmVnaW4KIAotICBkZWYgcmVhZE1lc3NhZ2VCZWdpbihzZWxmKToKLSAgICByZXR1cm4gc2VsZi5tZXNzYWdlQmVnaW4KKyAgICBkZWYgcmVhZE1lc3NhZ2VCZWdpbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubWVzc2FnZUJlZ2luCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL1RSZWN1cnNpdmUucHkgYi9saWIvcHkvc3JjL1RSZWN1cnNpdmUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJmMjAyYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9zcmMvVFJlY3Vyc2l2ZS5weQpAQCAtMCwwICsxLDgzIEBACisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBkaXZpc2lvbgorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCB1bmljb2RlX2xpdGVyYWxzCisKK2Zyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgVFR5cGUKKworVFlQRV9JRFggPSAxCitTUEVDX0FSR1NfSURYID0gMworU1BFQ19BUkdTX0NMQVNTX1JFRl9JRFggPSAwCitTUEVDX0FSR1NfVEhSSUZUX1NQRUNfSURYID0gMQorCisKK2RlZiBmaXhfc3BlYyhhbGxfc3RydWN0cyk6CisgICAgIiIiV2lyZSB1cCByZWN1cnNpdmUgcmVmZXJlbmNlcyBmb3IgYWxsIFRTdHJ1Y3QgZGVmaW5pdGlvbnMgaW5zaWRlIG9mIGVhY2ggdGhyaWZ0X3NwZWMuIiIiCisgICAgZm9yIHN0cnVjIGluIGFsbF9zdHJ1Y3RzOgorICAgICAgICBzcGVjID0gc3RydWMudGhyaWZ0X3NwZWMKKyAgICAgICAgZm9yIHRocmlmdF9zcGVjIGluIHNwZWM6CisgICAgICAgICAgICBpZiB0aHJpZnRfc3BlYyBpcyBOb25lOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbGlmIHRocmlmdF9zcGVjW1RZUEVfSURYXSA9PSBUVHlwZS5TVFJVQ1Q6CisgICAgICAgICAgICAgICAgb3RoZXIgPSB0aHJpZnRfc3BlY1tTUEVDX0FSR1NfSURYXVtTUEVDX0FSR1NfQ0xBU1NfUkVGX0lEWF0udGhyaWZ0X3NwZWMKKyAgICAgICAgICAgICAgICB0aHJpZnRfc3BlY1tTUEVDX0FSR1NfSURYXVtTUEVDX0FSR1NfVEhSSUZUX1NQRUNfSURYXSA9IG90aGVyCisgICAgICAgICAgICBlbGlmIHRocmlmdF9zcGVjW1RZUEVfSURYXSBpbiAoVFR5cGUuTElTVCwgVFR5cGUuU0VUKToKKyAgICAgICAgICAgICAgICBfZml4X2xpc3Rfb3Jfc2V0KHRocmlmdF9zcGVjW1NQRUNfQVJHU19JRFhdKQorICAgICAgICAgICAgZWxpZiB0aHJpZnRfc3BlY1tUWVBFX0lEWF0gPT0gVFR5cGUuTUFQOgorICAgICAgICAgICAgICAgIF9maXhfbWFwKHRocmlmdF9zcGVjW1NQRUNfQVJHU19JRFhdKQorCisKK2RlZiBfZml4X2xpc3Rfb3Jfc2V0KGVsZW1lbnRfdHlwZSk6CisgICAgIyBGb3IgYSBsaXN0IG9yIHNldCwgdGhlIHRocmlmdF9zcGVjIGVudHJ5IGxvb2tzIGxpa2UsCisgICAgIyAoMSwgVFR5cGUuTElTVCwgJ2xpc3RlcicsIChUVHlwZS5TVFJVQ1QsIFtSZWNMaXN0LCBOb25lXSwgRmFsc2UpLCBOb25lLCApLCAgIyAxCisgICAgIyBzbyBgYGVsZW1lbnRfdHlwZWBgIHdpbGwgYmUsCisgICAgIyAoVFR5cGUuU1RSVUNULCBbUmVjTGlzdCwgTm9uZV0sIEZhbHNlKQorICAgIGlmIGVsZW1lbnRfdHlwZVswXSA9PSBUVHlwZS5TVFJVQ1Q6CisgICAgICAgIGVsZW1lbnRfdHlwZVsxXVsxXSA9IGVsZW1lbnRfdHlwZVsxXVswXS50aHJpZnRfc3BlYworICAgIGVsaWYgZWxlbWVudF90eXBlWzBdIGluIChUVHlwZS5MSVNULCBUVHlwZS5TRVQpOgorICAgICAgICBfZml4X2xpc3Rfb3Jfc2V0KGVsZW1lbnRfdHlwZVsxXSkKKyAgICBlbGlmIGVsZW1lbnRfdHlwZVswXSA9PSBUVHlwZS5NQVA6CisgICAgICAgIF9maXhfbWFwKGVsZW1lbnRfdHlwZVsxXSkKKworCitkZWYgX2ZpeF9tYXAoZWxlbWVudF90eXBlKToKKyAgICAjIEZvciBhIG1hcCBvZiBrZXkgLT4gdmFsdWUgdHlwZSwgYGBlbGVtZW50X3R5cGVgYCB3aWxsIGJlLAorICAgICMgKFRUeXBlLkkxNiwgTm9uZSwgVFR5cGUuU1RSVUNULCBbUmVjTWFwQmFzaWMsIE5vbmVdLCBGYWxzZSksIE5vbmUsICkKKyAgICAjIHdoaWNoIGlzIGp1c3QgYSBub3JtYWwgc3RydWN0IGRlZmluaXRpb24uCisgICAgIworICAgICMgRm9yIGEgbWFwIG9mIGtleSAtPiBsaXN0IC8gc2V0LCBgYGVsZW1lbnRfdHlwZWBgIHdpbGwgYmUsCisgICAgIyAoVFR5cGUuSTE2LCBOb25lLCBUVHlwZS5MSVNULCAoVFR5cGUuU1RSVUNULCBbUmVjTWFwTGlzdCwgTm9uZV0sIEZhbHNlKSwgRmFsc2UpCisgICAgIyBhbmQgd2UgbmVlZCB0byBwcm9jZXNzIHRoZSAzcmQgZWxlbWVudCBhcyBhIGxpc3QuCisgICAgIworICAgICMgRm9yIGEgbWFwIG9mIGtleSAtPiBtYXAsIGBgZWxlbWVudF90eXBlYGAgd2lsbCBiZSwKKyAgICAjIChUVHlwZS5JMTYsIE5vbmUsIFRUeXBlLk1BUCwgKFRUeXBlLkkxNiwgTm9uZSwgVFR5cGUuU1RSVUNULAorICAgICMgIFtSZWNNYXBNYXAsIE5vbmVdLCBGYWxzZSksIEZhbHNlKQorICAgICMgYW5kIG5lZWQgdG8gcHJvY2VzcyAzcmQgZWxlbWVudCBhcyBhIG1hcC4KKworICAgICMgSXMgdGhlIG1hcCBrZXkgYSBzdHJ1Y3Q/CisgICAgaWYgZWxlbWVudF90eXBlWzBdID09IFRUeXBlLlNUUlVDVDoKKyAgICAgICAgZWxlbWVudF90eXBlWzFdWzFdID0gZWxlbWVudF90eXBlWzFdWzBdLnRocmlmdF9zcGVjCisgICAgZWxpZiBlbGVtZW50X3R5cGVbMF0gaW4gKFRUeXBlLkxJU1QsIFRUeXBlLlNFVCk6CisgICAgICAgIF9maXhfbGlzdF9vcl9zZXQoZWxlbWVudF90eXBlWzFdKQorICAgIGVsaWYgZWxlbWVudF90eXBlWzBdID09IFRUeXBlLk1BUDoKKyAgICAgICAgX2ZpeF9tYXAoZWxlbWVudF90eXBlWzFdKQorCisgICAgIyBJcyB0aGUgbWFwIHZhbHVlIGEgc3RydWN0PworICAgIGlmIGVsZW1lbnRfdHlwZVsyXSA9PSBUVHlwZS5TVFJVQ1Q6CisgICAgICAgIGVsZW1lbnRfdHlwZVszXVsxXSA9IGVsZW1lbnRfdHlwZVszXVswXS50aHJpZnRfc3BlYworICAgIGVsaWYgZWxlbWVudF90eXBlWzJdIGluIChUVHlwZS5MSVNULCBUVHlwZS5TRVQpOgorICAgICAgICBfZml4X2xpc3Rfb3Jfc2V0KGVsZW1lbnRfdHlwZVszXSkKKyAgICBlbGlmIGVsZW1lbnRfdHlwZVsyXSA9PSBUVHlwZS5NQVA6CisgICAgICAgIF9maXhfbWFwKGVsZW1lbnRfdHlwZVszXSkKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvVFNDb25zLnB5IGIvbGliL3B5L3NyYy9UU0NvbnMucHkKaW5kZXggZGE4ZDI4My4uYmM2N2Q3MCAxMDA2NDQKLS0tIGEvbGliL3B5L3NyYy9UU0NvbnMucHkKKysrIGIvbGliL3B5L3NyYy9UU0NvbnMucHkKQEAgLTE5LDE3ICsxOSwxOCBAQAogCiBmcm9tIG9zIGltcG9ydCBwYXRoCiBmcm9tIFNDb25zLkJ1aWxkZXIgaW1wb3J0IEJ1aWxkZXIKK2Zyb20gc2l4Lm1vdmVzIGltcG9ydCBtYXAKIAogCiBkZWYgc2NvbnNfZW52KGVudiwgYWRkPScnKToKLSAgb3BhdGggPSBwYXRoLmRpcm5hbWUocGF0aC5hYnNwYXRoKCckVEFSR0VUJykpCi0gIGxzdHIgPSAndGhyaWZ0IC0tZ2VuIGNwcCAtbyAnICsgb3BhdGggKyAnICcgKyBhZGQgKyAnICRTT1VSQ0UnCi0gIGNwcGJ1aWxkID0gQnVpbGRlcihhY3Rpb249bHN0cikKLSAgZW52LkFwcGVuZChCVUlMREVSUz17J1RocmlmdENwcCc6IGNwcGJ1aWxkfSkKKyAgICBvcGF0aCA9IHBhdGguZGlybmFtZShwYXRoLmFic3BhdGgoJyRUQVJHRVQnKSkKKyAgICBsc3RyID0gJ3RocmlmdCAtLWdlbiBjcHAgLW8gJyArIG9wYXRoICsgJyAnICsgYWRkICsgJyAkU09VUkNFJworICAgIGNwcGJ1aWxkID0gQnVpbGRlcihhY3Rpb249bHN0cikKKyAgICBlbnYuQXBwZW5kKEJVSUxERVJTPXsnVGhyaWZ0Q3BwJzogY3BwYnVpbGR9KQogCiAKIGRlZiBnZW5fY3BwKGVudiwgZGlyLCBmaWxlKToKLSAgc2NvbnNfZW52KGVudikKLSAgc3VmZml4ZXMgPSBbJ190eXBlcy5oJywgJ190eXBlcy5jcHAnXQotICB0YXJnZXRzID0gbWFwKGxhbWJkYSBzOiAnZ2VuLWNwcC8nICsgZmlsZSArIHMsIHN1ZmZpeGVzKQotICByZXR1cm4gZW52LlRocmlmdENwcCh0YXJnZXRzLCBkaXIgKyBmaWxlICsgJy50aHJpZnQnKQorICAgIHNjb25zX2VudihlbnYpCisgICAgc3VmZml4ZXMgPSBbJ190eXBlcy5oJywgJ190eXBlcy5jcHAnXQorICAgIHRhcmdldHMgPSBtYXAobGFtYmRhIHM6ICdnZW4tY3BwLycgKyBmaWxlICsgcywgc3VmZml4ZXMpCisgICAgcmV0dXJuIGVudi5UaHJpZnRDcHAodGFyZ2V0cywgZGlyICsgZmlsZSArICcudGhyaWZ0JykKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvVFNlcmlhbGl6YXRpb24ucHkgYi9saWIvcHkvc3JjL1RTZXJpYWxpemF0aW9uLnB5CmluZGV4IDhhNThkODkuLmZiYmU3NjggMTAwNjQ0Ci0tLSBhL2xpYi9weS9zcmMvVFNlcmlhbGl6YXRpb24ucHkKKysrIGIvbGliL3B5L3NyYy9UU2VyaWFsaXphdGlvbi5weQpAQCAtMTcsOCArMTcsOCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotZnJvbSBwcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCi1mcm9tIHRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAorZnJvbSAucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAorZnJvbSAudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0CiAKIAogZGVmIHNlcmlhbGl6ZSh0aHJpZnRfb2JqZWN0LApkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9UVG9ybmFkby5weSBiL2xpYi9weS9zcmMvVFRvcm5hZG8ucHkKaW5kZXggZWYzZTBmMi4uNWVmZjExZCAxMDA2NDQKLS0tIGEvbGliL3B5L3NyYy9UVG9ybmFkby5weQorKysgYi9saWIvcHkvc3JjL1RUb3JuYWRvLnB5CkBAIC0xOCwxMyArMTgsMTEgQEAKICMKIAogZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKK2ltcG9ydCBsb2dnaW5nCiBpbXBvcnQgc29ja2V0CiBpbXBvcnQgc3RydWN0CiAKLWltcG9ydCBsb2dnaW5nCi1sb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKLQotZnJvbSB0aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnRFeGNlcHRpb24sIFRUcmFuc3BvcnRCYXNlLCBUTWVtb3J5QnVmZmVyCitmcm9tIC50cmFuc3BvcnQuVFRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydEV4Y2VwdGlvbiwgVFRyYW5zcG9ydEJhc2UsIFRNZW1vcnlCdWZmZXIKIAogZnJvbSBpbyBpbXBvcnQgQnl0ZXNJTwogZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVxdWUKQEAgLTMzLDYgKzMxLDggQEAKIAogX19hbGxfXyA9IFsnVFRvcm5hZG9TZXJ2ZXInLCAnVFRvcm5hZG9TdHJlYW1UcmFuc3BvcnQnXQogCitsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKKwogCiBjbGFzcyBfTG9jayhvYmplY3QpOgogICAgIGRlZiBfX2luaXRfXyhzZWxmKToKQEAgLTE2NCwxNCArMTY0LDIwIEBACiAKICAgICBAZ2VuLmNvcm91dGluZQogICAgIGRlZiBoYW5kbGVfc3RyZWFtKHNlbGYsIHN0cmVhbSwgYWRkcmVzcyk6Ci0gICAgICAgIGhvc3QsIHBvcnQgPSBhZGRyZXNzCisgICAgICAgIGhvc3QsIHBvcnQgPSBhZGRyZXNzWzoyXQogICAgICAgICB0cmFucyA9IFRUb3JuYWRvU3RyZWFtVHJhbnNwb3J0KGhvc3Q9aG9zdCwgcG9ydD1wb3J0LCBzdHJlYW09c3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvX2xvb3A9c2VsZi5pb19sb29wKQogICAgICAgICBvcHJvdCA9IHNlbGYuX29wcm90X2ZhY3RvcnkuZ2V0UHJvdG9jb2wodHJhbnMpCiAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgd2hpbGUgbm90IHRyYW5zLnN0cmVhbS5jbG9zZWQoKToKLSAgICAgICAgICAgICAgICBmcmFtZSA9IHlpZWxkIHRyYW5zLnJlYWRGcmFtZSgpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBmcmFtZSA9IHlpZWxkIHRyYW5zLnJlYWRGcmFtZSgpCisgICAgICAgICAgICAgICAgZXhjZXB0IFRUcmFuc3BvcnRFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgICAgICAgICAgaWYgZS50eXBlID09IFRUcmFuc3BvcnRFeGNlcHRpb24uRU5EX09GX0ZJTEU6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgICAgICAgICB0ciA9IFRNZW1vcnlCdWZmZXIoZnJhbWUpCiAgICAgICAgICAgICAgICAgaXByb3QgPSBzZWxmLl9pcHJvdF9mYWN0b3J5LmdldFByb3RvY29sKHRyKQogICAgICAgICAgICAgICAgIHlpZWxkIHNlbGYuX3Byb2Nlc3Nvci5wcm9jZXNzKGlwcm90LCBvcHJvdCkKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvVGhyaWZ0LnB5IGIvbGliL3B5L3NyYy9UaHJpZnQucHkKaW5kZXggOTg5MGFmNy4uMDA5NDFkOCAxMDA2NDQKLS0tIGEvbGliL3B5L3NyYy9UaHJpZnQucHkKKysrIGIvbGliL3B5L3NyYy9UaHJpZnQucHkKQEAgLTIwLDE1MSArMjAsMTczIEBACiBpbXBvcnQgc3lzCiAKIAotY2xhc3MgVFR5cGU6Ci0gIFNUT1AgICA9IDAKLSAgVk9JRCAgID0gMQotICBCT09MICAgPSAyCi0gIEJZVEUgICA9IDMKLSAgSTA4ICAgID0gMwotICBET1VCTEUgPSA0Ci0gIEkxNiAgICA9IDYKLSAgSTMyICAgID0gOAotICBJNjQgICAgPSAxMAotICBTVFJJTkcgPSAxMQotICBVVEY3ICAgPSAxMQotICBTVFJVQ1QgPSAxMgotICBNQVAgICAgPSAxMwotICBTRVQgICAgPSAxNAotICBMSVNUICAgPSAxNQotICBVVEY4ICAgPSAxNgotICBVVEYxNiAgPSAxNworY2xhc3MgVFR5cGUob2JqZWN0KToKKyAgICBTVE9QID0gMAorICAgIFZPSUQgPSAxCisgICAgQk9PTCA9IDIKKyAgICBCWVRFID0gMworICAgIEkwOCA9IDMKKyAgICBET1VCTEUgPSA0CisgICAgSTE2ID0gNgorICAgIEkzMiA9IDgKKyAgICBJNjQgPSAxMAorICAgIFNUUklORyA9IDExCisgICAgVVRGNyA9IDExCisgICAgU1RSVUNUID0gMTIKKyAgICBNQVAgPSAxMworICAgIFNFVCA9IDE0CisgICAgTElTVCA9IDE1CisgICAgVVRGOCA9IDE2CisgICAgVVRGMTYgPSAxNwogCi0gIF9WQUxVRVNfVE9fTkFNRVMgPSAoJ1NUT1AnLAotICAgICAgICAgICAgICAgICAgICAgICdWT0lEJywKLSAgICAgICAgICAgICAgICAgICAgICAnQk9PTCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ0JZVEUnLAotICAgICAgICAgICAgICAgICAgICAgICdET1VCTEUnLAotICAgICAgICAgICAgICAgICAgICAgIE5vbmUsCi0gICAgICAgICAgICAgICAgICAgICAgJ0kxNicsCi0gICAgICAgICAgICAgICAgICAgICAgTm9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAnSTMyJywKLSAgICAgICAgICAgICAgICAgICAgICBOb25lLAotICAgICAgICAgICAgICAgICAgICAgJ0k2NCcsCi0gICAgICAgICAgICAgICAgICAgICAnU1RSSU5HJywKLSAgICAgICAgICAgICAgICAgICAgICdTVFJVQ1QnLAotICAgICAgICAgICAgICAgICAgICAgJ01BUCcsCi0gICAgICAgICAgICAgICAgICAgICAnU0VUJywKLSAgICAgICAgICAgICAgICAgICAgICdMSVNUJywKLSAgICAgICAgICAgICAgICAgICAgICdVVEY4JywKLSAgICAgICAgICAgICAgICAgICAgICdVVEYxNicpCisgICAgX1ZBTFVFU19UT19OQU1FUyA9ICgKKyAgICAgICAgJ1NUT1AnLAorICAgICAgICAnVk9JRCcsCisgICAgICAgICdCT09MJywKKyAgICAgICAgJ0JZVEUnLAorICAgICAgICAnRE9VQkxFJywKKyAgICAgICAgTm9uZSwKKyAgICAgICAgJ0kxNicsCisgICAgICAgIE5vbmUsCisgICAgICAgICdJMzInLAorICAgICAgICBOb25lLAorICAgICAgICAnSTY0JywKKyAgICAgICAgJ1NUUklORycsCisgICAgICAgICdTVFJVQ1QnLAorICAgICAgICAnTUFQJywKKyAgICAgICAgJ1NFVCcsCisgICAgICAgICdMSVNUJywKKyAgICAgICAgJ1VURjgnLAorICAgICAgICAnVVRGMTYnLAorICAgICkKIAogCi1jbGFzcyBUTWVzc2FnZVR5cGU6Ci0gIENBTEwgPSAxCi0gIFJFUExZID0gMgotICBFWENFUFRJT04gPSAzCi0gIE9ORVdBWSA9IDQKK2NsYXNzIFRNZXNzYWdlVHlwZShvYmplY3QpOgorICAgIENBTEwgPSAxCisgICAgUkVQTFkgPSAyCisgICAgRVhDRVBUSU9OID0gMworICAgIE9ORVdBWSA9IDQKIAogCi1jbGFzcyBUUHJvY2Vzc29yOgotICAiIiJCYXNlIGNsYXNzIGZvciBwcm9jc2Vzc29yLCB3aGljaCB3b3JrcyBvbiB0d28gc3RyZWFtcy4iIiIKK2NsYXNzIFRQcm9jZXNzb3Iob2JqZWN0KToKKyAgICAiIiJCYXNlIGNsYXNzIGZvciBwcm9jZXNzb3IsIHdoaWNoIHdvcmtzIG9uIHR3byBzdHJlYW1zLiIiIgogCi0gIGRlZiBwcm9jZXNzKGlwcm90LCBvcHJvdCk6Ci0gICAgcGFzcworICAgIGRlZiBwcm9jZXNzKHNlbGYsIGlwcm90LCBvcHJvdCk6CisgICAgICAgIHBhc3MKIAogCiBjbGFzcyBURXhjZXB0aW9uKEV4Y2VwdGlvbik6Ci0gICIiIkJhc2UgY2xhc3MgZm9yIGFsbCB0aHJpZnQgZXhjZXB0aW9ucy4iIiIKKyAgICAiIiJCYXNlIGNsYXNzIGZvciBhbGwgdGhyaWZ0IGV4Y2VwdGlvbnMuIiIiCiAKLSAgIyBCYXNlRXhjZXB0aW9uLm1lc3NhZ2UgaXMgZGVwcmVjYXRlZCBpbiBQeXRob24gdlsyLjYsMy4wKQotICBpZiAoMiwgNiwgMCkgPD0gc3lzLnZlcnNpb25faW5mbyA8ICgzLCAwKToKLSAgICBkZWYgX2dldF9tZXNzYWdlKHNlbGYpOgotICAgICAgcmV0dXJuIHNlbGYuX21lc3NhZ2UKKyAgICAjIEJhc2VFeGNlcHRpb24ubWVzc2FnZSBpcyBkZXByZWNhdGVkIGluIFB5dGhvbiB2WzIuNiwzLjApCisgICAgaWYgKDIsIDYsIDApIDw9IHN5cy52ZXJzaW9uX2luZm8gPCAoMywgMCk6CisgICAgICAgIGRlZiBfZ2V0X21lc3NhZ2Uoc2VsZik6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fbWVzc2FnZQogCi0gICAgZGVmIF9zZXRfbWVzc2FnZShzZWxmLCBtZXNzYWdlKToKLSAgICAgIHNlbGYuX21lc3NhZ2UgPSBtZXNzYWdlCi0gICAgbWVzc2FnZSA9IHByb3BlcnR5KF9nZXRfbWVzc2FnZSwgX3NldF9tZXNzYWdlKQorICAgICAgICBkZWYgX3NldF9tZXNzYWdlKHNlbGYsIG1lc3NhZ2UpOgorICAgICAgICAgICAgc2VsZi5fbWVzc2FnZSA9IG1lc3NhZ2UKKyAgICAgICAgbWVzc2FnZSA9IHByb3BlcnR5KF9nZXRfbWVzc2FnZSwgX3NldF9tZXNzYWdlKQogCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBtZXNzYWdlPU5vbmUpOgotICAgIEV4Y2VwdGlvbi5fX2luaXRfXyhzZWxmLCBtZXNzYWdlKQotICAgIHNlbGYubWVzc2FnZSA9IG1lc3NhZ2UKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWVzc2FnZT1Ob25lKToKKyAgICAgICAgRXhjZXB0aW9uLl9faW5pdF9fKHNlbGYsIG1lc3NhZ2UpCisgICAgICAgIHNlbGYubWVzc2FnZSA9IG1lc3NhZ2UKIAogCiBjbGFzcyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEV4Y2VwdGlvbik6Ci0gICIiIkFwcGxpY2F0aW9uIGxldmVsIHRocmlmdCBleGNlcHRpb25zLiIiIgorICAgICIiIkFwcGxpY2F0aW9uIGxldmVsIHRocmlmdCBleGNlcHRpb25zLiIiIgogCi0gIFVOS05PV04gPSAwCi0gIFVOS05PV05fTUVUSE9EID0gMQotICBJTlZBTElEX01FU1NBR0VfVFlQRSA9IDIKLSAgV1JPTkdfTUVUSE9EX05BTUUgPSAzCi0gIEJBRF9TRVFVRU5DRV9JRCA9IDQKLSAgTUlTU0lOR19SRVNVTFQgPSA1Ci0gIElOVEVSTkFMX0VSUk9SID0gNgotICBQUk9UT0NPTF9FUlJPUiA9IDcKLSAgSU5WQUxJRF9UUkFOU0ZPUk0gPSA4Ci0gIElOVkFMSURfUFJPVE9DT0wgPSA5Ci0gIFVOU1VQUE9SVEVEX0NMSUVOVF9UWVBFID0gMTAKKyAgICBVTktOT1dOID0gMAorICAgIFVOS05PV05fTUVUSE9EID0gMQorICAgIElOVkFMSURfTUVTU0FHRV9UWVBFID0gMgorICAgIFdST05HX01FVEhPRF9OQU1FID0gMworICAgIEJBRF9TRVFVRU5DRV9JRCA9IDQKKyAgICBNSVNTSU5HX1JFU1VMVCA9IDUKKyAgICBJTlRFUk5BTF9FUlJPUiA9IDYKKyAgICBQUk9UT0NPTF9FUlJPUiA9IDcKKyAgICBJTlZBTElEX1RSQU5TRk9STSA9IDgKKyAgICBJTlZBTElEX1BST1RPQ09MID0gOQorICAgIFVOU1VQUE9SVEVEX0NMSUVOVF9UWVBFID0gMTAKIAotICBkZWYgX19pbml0X18oc2VsZiwgdHlwZT1VTktOT1dOLCBtZXNzYWdlPU5vbmUpOgotICAgIFRFeGNlcHRpb24uX19pbml0X18oc2VsZiwgbWVzc2FnZSkKLSAgICBzZWxmLnR5cGUgPSB0eXBlCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHR5cGU9VU5LTk9XTiwgbWVzc2FnZT1Ob25lKToKKyAgICAgICAgVEV4Y2VwdGlvbi5fX2luaXRfXyhzZWxmLCBtZXNzYWdlKQorICAgICAgICBzZWxmLnR5cGUgPSB0eXBlCiAKLSAgZGVmIF9fc3RyX18oc2VsZik6Ci0gICAgaWYgc2VsZi5tZXNzYWdlOgotICAgICAgcmV0dXJuIHNlbGYubWVzc2FnZQotICAgIGVsaWYgc2VsZi50eXBlID09IHNlbGYuVU5LTk9XTl9NRVRIT0Q6Ci0gICAgICByZXR1cm4gJ1Vua25vd24gbWV0aG9kJwotICAgIGVsaWYgc2VsZi50eXBlID09IHNlbGYuSU5WQUxJRF9NRVNTQUdFX1RZUEU6Ci0gICAgICByZXR1cm4gJ0ludmFsaWQgbWVzc2FnZSB0eXBlJwotICAgIGVsaWYgc2VsZi50eXBlID09IHNlbGYuV1JPTkdfTUVUSE9EX05BTUU6Ci0gICAgICByZXR1cm4gJ1dyb25nIG1ldGhvZCBuYW1lJwotICAgIGVsaWYgc2VsZi50eXBlID09IHNlbGYuQkFEX1NFUVVFTkNFX0lEOgotICAgICAgcmV0dXJuICdCYWQgc2VxdWVuY2UgSUQnCi0gICAgZWxpZiBzZWxmLnR5cGUgPT0gc2VsZi5NSVNTSU5HX1JFU1VMVDoKLSAgICAgIHJldHVybiAnTWlzc2luZyByZXN1bHQnCi0gICAgZWxpZiBzZWxmLnR5cGUgPT0gc2VsZi5JTlRFUk5BTF9FUlJPUjoKLSAgICAgIHJldHVybiAnSW50ZXJuYWwgZXJyb3InCi0gICAgZWxpZiBzZWxmLnR5cGUgPT0gc2VsZi5QUk9UT0NPTF9FUlJPUjoKLSAgICAgIHJldHVybiAnUHJvdG9jb2wgZXJyb3InCi0gICAgZWxpZiBzZWxmLnR5cGUgPT0gc2VsZi5JTlZBTElEX1RSQU5TRk9STToKLSAgICAgIHJldHVybiAnSW52YWxpZCB0cmFuc2Zvcm0nCi0gICAgZWxpZiBzZWxmLnR5cGUgPT0gc2VsZi5JTlZBTElEX1BST1RPQ09MOgotICAgICAgcmV0dXJuICdJbnZhbGlkIHByb3RvY29sJwotICAgIGVsaWYgc2VsZi50eXBlID09IHNlbGYuVU5TVVBQT1JURURfQ0xJRU5UX1RZUEU6Ci0gICAgICByZXR1cm4gJ1Vuc3VwcG9ydGVkIGNsaWVudCB0eXBlJwotICAgIGVsc2U6Ci0gICAgICByZXR1cm4gJ0RlZmF1bHQgKHVua25vd24pIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbicKLQotICBkZWYgcmVhZChzZWxmLCBpcHJvdCk6Ci0gICAgaXByb3QucmVhZFN0cnVjdEJlZ2luKCkKLSAgICB3aGlsZSBUcnVlOgotICAgICAgKGZuYW1lLCBmdHlwZSwgZmlkKSA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCkKLSAgICAgIGlmIGZ0eXBlID09IFRUeXBlLlNUT1A6Ci0gICAgICAgIGJyZWFrCi0gICAgICBpZiBmaWQgPT0gMToKLSAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuU1RSSU5HOgotICAgICAgICAgIHNlbGYubWVzc2FnZSA9IGlwcm90LnJlYWRTdHJpbmcoKQorICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICBpZiBzZWxmLm1lc3NhZ2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5tZXNzYWdlCisgICAgICAgIGVsaWYgc2VsZi50eXBlID09IHNlbGYuVU5LTk9XTl9NRVRIT0Q6CisgICAgICAgICAgICByZXR1cm4gJ1Vua25vd24gbWV0aG9kJworICAgICAgICBlbGlmIHNlbGYudHlwZSA9PSBzZWxmLklOVkFMSURfTUVTU0FHRV9UWVBFOgorICAgICAgICAgICAgcmV0dXJuICdJbnZhbGlkIG1lc3NhZ2UgdHlwZScKKyAgICAgICAgZWxpZiBzZWxmLnR5cGUgPT0gc2VsZi5XUk9OR19NRVRIT0RfTkFNRToKKyAgICAgICAgICAgIHJldHVybiAnV3JvbmcgbWV0aG9kIG5hbWUnCisgICAgICAgIGVsaWYgc2VsZi50eXBlID09IHNlbGYuQkFEX1NFUVVFTkNFX0lEOgorICAgICAgICAgICAgcmV0dXJuICdCYWQgc2VxdWVuY2UgSUQnCisgICAgICAgIGVsaWYgc2VsZi50eXBlID09IHNlbGYuTUlTU0lOR19SRVNVTFQ6CisgICAgICAgICAgICByZXR1cm4gJ01pc3NpbmcgcmVzdWx0JworICAgICAgICBlbGlmIHNlbGYudHlwZSA9PSBzZWxmLklOVEVSTkFMX0VSUk9SOgorICAgICAgICAgICAgcmV0dXJuICdJbnRlcm5hbCBlcnJvcicKKyAgICAgICAgZWxpZiBzZWxmLnR5cGUgPT0gc2VsZi5QUk9UT0NPTF9FUlJPUjoKKyAgICAgICAgICAgIHJldHVybiAnUHJvdG9jb2wgZXJyb3InCisgICAgICAgIGVsaWYgc2VsZi50eXBlID09IHNlbGYuSU5WQUxJRF9UUkFOU0ZPUk06CisgICAgICAgICAgICByZXR1cm4gJ0ludmFsaWQgdHJhbnNmb3JtJworICAgICAgICBlbGlmIHNlbGYudHlwZSA9PSBzZWxmLklOVkFMSURfUFJPVE9DT0w6CisgICAgICAgICAgICByZXR1cm4gJ0ludmFsaWQgcHJvdG9jb2wnCisgICAgICAgIGVsaWYgc2VsZi50eXBlID09IHNlbGYuVU5TVVBQT1JURURfQ0xJRU5UX1RZUEU6CisgICAgICAgICAgICByZXR1cm4gJ1Vuc3VwcG9ydGVkIGNsaWVudCB0eXBlJwogICAgICAgICBlbHNlOgotICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCi0gICAgICBlbGlmIGZpZCA9PSAyOgotICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5JMzI6Ci0gICAgICAgICAgc2VsZi50eXBlID0gaXByb3QucmVhZEkzMigpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKLSAgICAgIGVsc2U6Ci0gICAgICAgIGlwcm90LnNraXAoZnR5cGUpCi0gICAgICBpcHJvdC5yZWFkRmllbGRFbmQoKQotICAgIGlwcm90LnJlYWRTdHJ1Y3RFbmQoKQorICAgICAgICAgICAgcmV0dXJuICdEZWZhdWx0ICh1bmtub3duKSBUQXBwbGljYXRpb25FeGNlcHRpb24nCiAKLSAgZGVmIHdyaXRlKHNlbGYsIG9wcm90KToKLSAgICBvcHJvdC53cml0ZVN0cnVjdEJlZ2luKCdUQXBwbGljYXRpb25FeGNlcHRpb24nKQotICAgIGlmIHNlbGYubWVzc2FnZSBpcyBub3QgTm9uZToKLSAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbignbWVzc2FnZScsIFRUeXBlLlNUUklORywgMSkKLSAgICAgIG9wcm90LndyaXRlU3RyaW5nKHNlbGYubWVzc2FnZSkKLSAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKQotICAgIGlmIHNlbGYudHlwZSBpcyBub3QgTm9uZToKLSAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbigndHlwZScsIFRUeXBlLkkzMiwgMikKLSAgICAgIG9wcm90LndyaXRlSTMyKHNlbGYudHlwZSkKLSAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKQotICAgIG9wcm90LndyaXRlRmllbGRTdG9wKCkKLSAgICBvcHJvdC53cml0ZVN0cnVjdEVuZCgpCisgICAgZGVmIHJlYWQoc2VsZiwgaXByb3QpOgorICAgICAgICBpcHJvdC5yZWFkU3RydWN0QmVnaW4oKQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgKGZuYW1lLCBmdHlwZSwgZmlkKSA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCkKKyAgICAgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLlNUT1A6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlmIGZpZCA9PSAxOgorICAgICAgICAgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLlNUUklORzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5tZXNzYWdlID0gaXByb3QucmVhZFN0cmluZygpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgICAgICAgIGVsaWYgZmlkID09IDI6CisgICAgICAgICAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuSTMyOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnR5cGUgPSBpcHJvdC5yZWFkSTMyKCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgICAgICAgaXByb3QucmVhZEZpZWxkRW5kKCkKKyAgICAgICAgaXByb3QucmVhZFN0cnVjdEVuZCgpCisKKyAgICBkZWYgd3JpdGUoc2VsZiwgb3Byb3QpOgorICAgICAgICBvcHJvdC53cml0ZVN0cnVjdEJlZ2luKCdUQXBwbGljYXRpb25FeGNlcHRpb24nKQorICAgICAgICBpZiBzZWxmLm1lc3NhZ2UgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ21lc3NhZ2UnLCBUVHlwZS5TVFJJTkcsIDEpCisgICAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhzZWxmLm1lc3NhZ2UpCisgICAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKKyAgICAgICAgaWYgc2VsZi50eXBlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCd0eXBlJywgVFR5cGUuSTMyLCAyKQorICAgICAgICAgICAgb3Byb3Qud3JpdGVJMzIoc2VsZi50eXBlKQorICAgICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCisgICAgICAgIG9wcm90LndyaXRlRmllbGRTdG9wKCkKKyAgICAgICAgb3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKQorCisKK2NsYXNzIFRGcm96ZW5EaWN0KGRpY3QpOgorICAgICIiIkEgZGljdGlvbmFyeSB0aGF0IGlzICJmcm96ZW4iIGxpa2UgYSBmcm96ZW5zZXQiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBzdXBlcihURnJvemVuRGljdCwgc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3dhcmdzKQorICAgICAgICAjIFNvcnQgdGhlIGl0ZW1zIHNvIHRoZXkgd2lsbCBiZSBpbiBhIGNvbnNpc3RlbnQgb3JkZXIuCisgICAgICAgICMgWE9SIGluIHRoZSBoYXNoIG9mIHRoZSBjbGFzcyBzbyB3ZSBkb24ndCBjb2xsaWRlIHdpdGgKKyAgICAgICAgIyB0aGUgaGFzaCBvZiBhIGxpc3Qgb2YgdHVwbGVzLgorICAgICAgICBzZWxmLl9faGFzaHZhbCA9IGhhc2goVEZyb3plbkRpY3QpIF4gaGFzaCh0dXBsZShzb3J0ZWQoc2VsZi5pdGVtcygpKSkpCisKKyAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwgKmFyZ3MpOgorICAgICAgICByYWlzZSBUeXBlRXJyb3IoIkNhbid0IG1vZGlmeSBmcm96ZW4gVEZyZWV6YWJsZURpY3QiKQorCisgICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsICphcmdzKToKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJDYW4ndCBtb2RpZnkgZnJvemVuIFRGcmVlemFibGVEaWN0IikKKworICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX19oYXNodmFsCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL2NvbXBhdC5weSBiL2xpYi9weS9zcmMvY29tcGF0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlODI3MWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvc3JjL2NvbXBhdC5weQpAQCAtMCwwICsxLDQ2IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW1wb3J0IHN5cworCitpZiBzeXMudmVyc2lvbl9pbmZvWzBdID09IDI6CisKKyAgICBmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8gYXMgQnVmZmVySU8KKworICAgIGRlZiBiaW5hcnlfdG9fc3RyKGJpbl92YWwpOgorICAgICAgICByZXR1cm4gYmluX3ZhbAorCisgICAgZGVmIHN0cl90b19iaW5hcnkoc3RyX3ZhbCk6CisgICAgICAgIHJldHVybiBzdHJfdmFsCisKKyAgICBkZWYgYnl0ZV9pbmRleChieXRlc192YWwsIGkpOgorICAgICAgICByZXR1cm4gb3JkKGJ5dGVzX3ZhbFtpXSkKKworZWxzZToKKworICAgIGZyb20gaW8gaW1wb3J0IEJ5dGVzSU8gYXMgQnVmZmVySU8gICMgbm9xYQorCisgICAgZGVmIGJpbmFyeV90b19zdHIoYmluX3ZhbCk6CisgICAgICAgIHJldHVybiBiaW5fdmFsLmRlY29kZSgndXRmOCcpCisKKyAgICBkZWYgc3RyX3RvX2JpbmFyeShzdHJfdmFsKToKKyAgICAgICAgcmV0dXJuIGJ5dGVzKHN0cl92YWwsICd1dGY4JykKKworICAgIGRlZiBieXRlX2luZGV4KGJ5dGVzX3ZhbCwgaSk6CisgICAgICAgIHJldHVybiBieXRlc192YWxbaV0KZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvZXh0L2JpbmFyeS5jcHAgYi9saWIvcHkvc3JjL2V4dC9iaW5hcnkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZDhkOTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvc3JjL2V4dC9iaW5hcnkuY3BwCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImV4dC9iaW5hcnkuaCIKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHkgeworCitib29sIEJpbmFyeVByb3RvY29sOjpyZWFkRmllbGRCZWdpbihUVHlwZSYgdHlwZSwgaW50MTZfdCYgdGFnKSB7CisgIHVpbnQ4X3QgYiA9IDA7CisgIGlmICghcmVhZEJ5dGUoYikpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgdHlwZSA9IHN0YXRpY19jYXN0PFRUeXBlPihiKTsKKyAgaWYgKHR5cGUgPT0gVF9TVE9QKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIHJlYWRJMTYodGFnKTsKK30KK30KK30KK30KZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvZXh0L2JpbmFyeS5oIGIvbGliL3B5L3NyYy9leHQvYmluYXJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYwYjBkMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9zcmMvZXh0L2JpbmFyeS5oCkBAIC0wLDAgKzEsMjE3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVEhSSUZUX1BZX0JJTkFSWV9ICisjZGVmaW5lIFRIUklGVF9QWV9CSU5BUllfSAorCisjaW5jbHVkZSA8UHl0aG9uLmg+CisjaW5jbHVkZSAiZXh0L3Byb3RvY29sLmgiCisjaW5jbHVkZSAiZXh0L2VuZGlhbi5oIgorI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHB5IHsKKworY2xhc3MgQmluYXJ5UHJvdG9jb2wgOiBwdWJsaWMgUHJvdG9jb2xCYXNlPEJpbmFyeVByb3RvY29sPiB7CitwdWJsaWM6CisgIHZpcnR1YWwgfkJpbmFyeVByb3RvY29sKCkge30KKworICB2b2lkIHdyaXRlSTgoaW50OF90IHZhbCkgeyB3cml0ZUJ1ZmZlcihyZWludGVycHJldF9jYXN0PGNoYXIqPigmdmFsKSwgc2l6ZW9mKGludDhfdCkpOyB9CisKKyAgdm9pZCB3cml0ZUkxNihpbnQxNl90IHZhbCkgeworICAgIGludDE2X3QgbmV0ID0gc3RhdGljX2Nhc3Q8aW50MTZfdD4oaHRvbnModmFsKSk7CisgICAgd3JpdGVCdWZmZXIocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJm5ldCksIHNpemVvZihpbnQxNl90KSk7CisgIH0KKworICB2b2lkIHdyaXRlSTMyKGludDMyX3QgdmFsKSB7CisgICAgaW50MzJfdCBuZXQgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihodG9ubCh2YWwpKTsKKyAgICB3cml0ZUJ1ZmZlcihyZWludGVycHJldF9jYXN0PGNoYXIqPigmbmV0KSwgc2l6ZW9mKGludDMyX3QpKTsKKyAgfQorCisgIHZvaWQgd3JpdGVJNjQoaW50NjRfdCB2YWwpIHsKKyAgICBpbnQ2NF90IG5ldCA9IHN0YXRpY19jYXN0PGludDY0X3Q+KGh0b25sbCh2YWwpKTsKKyAgICB3cml0ZUJ1ZmZlcihyZWludGVycHJldF9jYXN0PGNoYXIqPigmbmV0KSwgc2l6ZW9mKGludDY0X3QpKTsKKyAgfQorCisgIHZvaWQgd3JpdGVEb3VibGUoZG91YmxlIGR1YikgeworICAgIC8vIFVuZm9ydHVuYXRlbHksIGJpdHdpc2VfY2FzdCBkb2Vzbid0IHdvcmsgaW4gQy4gIEJhZCBDIQorICAgIHVuaW9uIHsKKyAgICAgIGRvdWJsZSBmOworICAgICAgaW50NjRfdCB0OworICAgIH0gdHJhbnNmZXI7CisgICAgdHJhbnNmZXIuZiA9IGR1YjsKKyAgICB3cml0ZUk2NCh0cmFuc2Zlci50KTsKKyAgfQorCisgIHZvaWQgd3JpdGVCb29sKGludCB2KSB7IHdyaXRlQnl0ZShzdGF0aWNfY2FzdDx1aW50OF90Pih2KSk7IH0KKworICB2b2lkIHdyaXRlU3RyaW5nKFB5T2JqZWN0KiB2YWx1ZSwgaW50MzJfdCBsZW4pIHsKKyAgICB3cml0ZUkzMihsZW4pOworICAgIHdyaXRlQnVmZmVyKFB5Qnl0ZXNfQVNfU1RSSU5HKHZhbHVlKSwgbGVuKTsKKyAgfQorCisgIGJvb2wgd3JpdGVMaXN0QmVnaW4oUHlPYmplY3QqIHZhbHVlLCBjb25zdCBTZXRMaXN0VHlwZUFyZ3MmIHBhcnNlZGFyZ3MsIGludDMyX3QgbGVuKSB7CisgICAgd3JpdGVCeXRlKHBhcnNlZGFyZ3MuZWxlbWVudF90eXBlKTsKKyAgICB3cml0ZUkzMihsZW4pOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgYm9vbCB3cml0ZU1hcEJlZ2luKFB5T2JqZWN0KiB2YWx1ZSwgY29uc3QgTWFwVHlwZUFyZ3MmIHBhcnNlZGFyZ3MsIGludDMyX3QgbGVuKSB7CisgICAgd3JpdGVCeXRlKHBhcnNlZGFyZ3Mua3RhZyk7CisgICAgd3JpdGVCeXRlKHBhcnNlZGFyZ3MudnRhZyk7CisgICAgd3JpdGVJMzIobGVuKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGJvb2wgd3JpdGVTdHJ1Y3RCZWdpbigpIHsgcmV0dXJuIHRydWU7IH0KKyAgYm9vbCB3cml0ZVN0cnVjdEVuZCgpIHsgcmV0dXJuIHRydWU7IH0KKyAgYm9vbCB3cml0ZUZpZWxkKFB5T2JqZWN0KiB2YWx1ZSwgY29uc3QgU3RydWN0SXRlbVNwZWMmIHBhcnNlZHNwZWMpIHsKKyAgICB3cml0ZUJ5dGUoc3RhdGljX2Nhc3Q8dWludDhfdD4ocGFyc2Vkc3BlYy50eXBlKSk7CisgICAgd3JpdGVJMTYocGFyc2Vkc3BlYy50YWcpOworICAgIHJldHVybiBlbmNvZGVWYWx1ZSh2YWx1ZSwgcGFyc2Vkc3BlYy50eXBlLCBwYXJzZWRzcGVjLnR5cGVhcmdzKTsKKyAgfQorCisgIHZvaWQgd3JpdGVGaWVsZFN0b3AoKSB7IHdyaXRlQnl0ZShzdGF0aWNfY2FzdDx1aW50OF90PihUX1NUT1ApKTsgfQorCisgIGJvb2wgcmVhZEJvb2woYm9vbCYgdmFsKSB7CisgICAgY2hhciogYnVmOworICAgIGlmICghcmVhZEJ5dGVzKCZidWYsIDEpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHZhbCA9IGJ1ZlswXSA9PSAxOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgYm9vbCByZWFkSTgoaW50OF90JiB2YWwpIHsKKyAgICBjaGFyKiBidWY7CisgICAgaWYgKCFyZWFkQnl0ZXMoJmJ1ZiwgMSkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgdmFsID0gYnVmWzBdOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgYm9vbCByZWFkSTE2KGludDE2X3QmIHZhbCkgeworICAgIGNoYXIqIGJ1ZjsKKyAgICBpZiAoIXJlYWRCeXRlcygmYnVmLCBzaXplb2YoaW50MTZfdCkpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG1lbWNweSgmdmFsLCBidWYsIHNpemVvZihpbnQxNl90KSk7CisgICAgdmFsID0gbnRvaHModmFsKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGJvb2wgcmVhZEkzMihpbnQzMl90JiB2YWwpIHsKKyAgICBjaGFyKiBidWY7CisgICAgaWYgKCFyZWFkQnl0ZXMoJmJ1Ziwgc2l6ZW9mKGludDMyX3QpKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBtZW1jcHkoJnZhbCwgYnVmLCBzaXplb2YoaW50MzJfdCkpOworICAgIHZhbCA9IG50b2hsKHZhbCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBib29sIHJlYWRJNjQoaW50NjRfdCYgdmFsKSB7CisgICAgY2hhciogYnVmOworICAgIGlmICghcmVhZEJ5dGVzKCZidWYsIHNpemVvZihpbnQ2NF90KSkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbWVtY3B5KCZ2YWwsIGJ1Ziwgc2l6ZW9mKGludDY0X3QpKTsKKyAgICB2YWwgPSBudG9obGwodmFsKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGJvb2wgcmVhZERvdWJsZShkb3VibGUmIHZhbCkgeworICAgIHVuaW9uIHsKKyAgICAgIGludDY0X3QgZjsKKyAgICAgIGRvdWJsZSB0OworICAgIH0gdHJhbnNmZXI7CisKKyAgICBpZiAoIXJlYWRJNjQodHJhbnNmZXIuZikpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgdmFsID0gdHJhbnNmZXIudDsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGludDMyX3QgcmVhZFN0cmluZyhjaGFyKiogYnVmKSB7CisgICAgaW50MzJfdCBsZW4gPSAwOworICAgIGlmICghcmVhZEkzMihsZW4pIHx8ICFjaGVja0xlbmd0aExpbWl0KGxlbiwgc3RyaW5nTGltaXQoKSkgfHwgIXJlYWRCeXRlcyhidWYsIGxlbikpIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIGxlbjsKKyAgfQorCisgIGludDMyX3QgcmVhZExpc3RCZWdpbihUVHlwZSYgZXR5cGUpIHsKKyAgICBpbnQzMl90IGxlbjsKKyAgICB1aW50OF90IGIgPSAwOworICAgIGlmICghcmVhZEJ5dGUoYikgfHwgIXJlYWRJMzIobGVuKSB8fCAhY2hlY2tMZW5ndGhMaW1pdChsZW4sIGNvbnRhaW5lckxpbWl0KCkpKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGV0eXBlID0gc3RhdGljX2Nhc3Q8VFR5cGU+KGIpOworICAgIHJldHVybiBsZW47CisgIH0KKworICBpbnQzMl90IHJlYWRNYXBCZWdpbihUVHlwZSYga3R5cGUsIFRUeXBlJiB2dHlwZSkgeworICAgIGludDMyX3QgbGVuOworICAgIHVpbnQ4X3QgaywgdjsKKyAgICBpZiAoIXJlYWRCeXRlKGspIHx8ICFyZWFkQnl0ZSh2KSB8fCAhcmVhZEkzMihsZW4pIHx8ICFjaGVja0xlbmd0aExpbWl0KGxlbiwgY29udGFpbmVyTGltaXQoKSkpIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAga3R5cGUgPSBzdGF0aWNfY2FzdDxUVHlwZT4oayk7CisgICAgdnR5cGUgPSBzdGF0aWNfY2FzdDxUVHlwZT4odik7CisgICAgcmV0dXJuIGxlbjsKKyAgfQorCisgIGJvb2wgcmVhZFN0cnVjdEJlZ2luKCkgeyByZXR1cm4gdHJ1ZTsgfQorICBib29sIHJlYWRTdHJ1Y3RFbmQoKSB7IHJldHVybiB0cnVlOyB9CisKKyAgYm9vbCByZWFkRmllbGRCZWdpbihUVHlwZSYgdHlwZSwgaW50MTZfdCYgdGFnKTsKKworI2RlZmluZSBTS0lQQllURVMobikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghcmVhZEJ5dGVzKCZkdW1teV9idWZfLCAobikpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcmV0dXJuIGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisgIGJvb2wgc2tpcEJvb2woKSB7IFNLSVBCWVRFUygxKTsgfQorICBib29sIHNraXBCeXRlKCkgeyBTS0lQQllURVMoMSk7IH0KKyAgYm9vbCBza2lwSTE2KCkgeyBTS0lQQllURVMoMik7IH0KKyAgYm9vbCBza2lwSTMyKCkgeyBTS0lQQllURVMoNCk7IH0KKyAgYm9vbCBza2lwSTY0KCkgeyBTS0lQQllURVMoOCk7IH0KKyAgYm9vbCBza2lwRG91YmxlKCkgeyBTS0lQQllURVMoOCk7IH0KKyAgYm9vbCBza2lwU3RyaW5nKCkgeworICAgIGludDMyX3QgbGVuOworICAgIGlmICghcmVhZEkzMihsZW4pKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIFNLSVBCWVRFUyhsZW4pOworICB9CisjdW5kZWYgU0tJUEJZVEVTCisKK3ByaXZhdGU6CisgIGNoYXIqIGR1bW15X2J1Zl87Cit9OworfQorfQorfQorI2VuZGlmIC8vIFRIUklGVF9QWV9CSU5BUllfSApkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9leHQvY29tcGFjdC5jcHAgYi9saWIvcHkvc3JjL2V4dC9jb21wYWN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWE5OWEwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5L3NyYy9leHQvY29tcGFjdC5jcHAKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImV4dC9jb21wYWN0LmgiCisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHkgeworCitjb25zdCB1aW50OF90IENvbXBhY3RQcm90b2NvbDo6VFR5cGVUb0NUeXBlW10gPSB7CisgICAgQ1RfU1RPUCwgICAgICAgICAvLyBUX1NUT1AKKyAgICAwLCAgICAgICAgICAgICAgIC8vIHVudXNlZAorICAgIENUX0JPT0xFQU5fVFJVRSwgLy8gVF9CT09MCisgICAgQ1RfQllURSwgICAgICAgICAvLyBUX0JZVEUKKyAgICBDVF9ET1VCTEUsICAgICAgIC8vIFRfRE9VQkxFCisgICAgMCwgICAgICAgICAgICAgICAvLyB1bnVzZWQKKyAgICBDVF9JMTYsICAgICAgICAgIC8vIFRfSTE2CisgICAgMCwgICAgICAgICAgICAgICAvLyB1bnVzZWQKKyAgICBDVF9JMzIsICAgICAgICAgIC8vIFRfSTMyCisgICAgMCwgICAgICAgICAgICAgICAvLyB1bnVzZWQKKyAgICBDVF9JNjQsICAgICAgICAgIC8vIFRfSTY0CisgICAgQ1RfQklOQVJZLCAgICAgICAvLyBUX1NUUklORworICAgIENUX1NUUlVDVCwgICAgICAgLy8gVF9TVFJVQ1QKKyAgICBDVF9NQVAsICAgICAgICAgIC8vIFRfTUFQCisgICAgQ1RfU0VULCAgICAgICAgICAvLyBUX1NFVAorICAgIENUX0xJU1QsICAgICAgICAgLy8gVF9MSVNUCit9OworCitib29sIENvbXBhY3RQcm90b2NvbDo6cmVhZEZpZWxkQmVnaW4oVFR5cGUmIHR5cGUsIGludDE2X3QmIHRhZykgeworICB1aW50OF90IGI7CisgIGlmICghcmVhZEJ5dGUoYikpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgdWludDhfdCBjdHlwZSA9IGIgJiAweGY7CisgIHR5cGUgPSBnZXRUVHlwZShjdHlwZSk7CisgIGlmICh0eXBlID09IC0xKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9IGVsc2UgaWYgKHR5cGUgPT0gVF9TVE9QKSB7CisgICAgdGFnID0gMDsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICB1aW50OF90IGRpZmYgPSAoYiAmIDB4ZjApID4+IDQ7CisgIGlmIChkaWZmKSB7CisgICAgdGFnID0gcmVhZFRhZ3NfLnRvcCgpICsgZGlmZjsKKyAgfSBlbHNlIGlmICghcmVhZEkxNih0YWcpKSB7CisgICAgcmVhZFRhZ3NfLnRvcCgpID0gLTE7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmIChjdHlwZSA9PSBDVF9CT09MRUFOX0ZBTFNFIHx8IGN0eXBlID09IENUX0JPT0xFQU5fVFJVRSkgeworICAgIHJlYWRCb29sXy5leGlzdHMgPSB0cnVlOworICAgIHJlYWRCb29sXy52YWx1ZSA9IGN0eXBlID09IENUX0JPT0xFQU5fVFJVRTsKKyAgfQorICByZWFkVGFnc18udG9wKCkgPSB0YWc7CisgIHJldHVybiB0cnVlOworfQorCitUVHlwZSBDb21wYWN0UHJvdG9jb2w6OmdldFRUeXBlKHVpbnQ4X3QgdHlwZSkgeworICBzd2l0Y2ggKHR5cGUpIHsKKyAgY2FzZSBUX1NUT1A6CisgICAgcmV0dXJuIFRfU1RPUDsKKyAgY2FzZSBDVF9CT09MRUFOX0ZBTFNFOgorICBjYXNlIENUX0JPT0xFQU5fVFJVRToKKyAgICByZXR1cm4gVF9CT09MOworICBjYXNlIENUX0JZVEU6CisgICAgcmV0dXJuIFRfQllURTsKKyAgY2FzZSBDVF9JMTY6CisgICAgcmV0dXJuIFRfSTE2OworICBjYXNlIENUX0kzMjoKKyAgICByZXR1cm4gVF9JMzI7CisgIGNhc2UgQ1RfSTY0OgorICAgIHJldHVybiBUX0k2NDsKKyAgY2FzZSBDVF9ET1VCTEU6CisgICAgcmV0dXJuIFRfRE9VQkxFOworICBjYXNlIENUX0JJTkFSWToKKyAgICByZXR1cm4gVF9TVFJJTkc7CisgIGNhc2UgQ1RfTElTVDoKKyAgICByZXR1cm4gVF9MSVNUOworICBjYXNlIENUX1NFVDoKKyAgICByZXR1cm4gVF9TRVQ7CisgIGNhc2UgQ1RfTUFQOgorICAgIHJldHVybiBUX01BUDsKKyAgY2FzZSBDVF9TVFJVQ1Q6CisgICAgcmV0dXJuIFRfU1RSVUNUOworICBkZWZhdWx0OgorICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJkb24ndCBrbm93IHdoYXQgdHlwZTogJWQiLCB0eXBlKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VFR5cGU+KC0xKTsKKyAgfQorfQorfQorfQorfQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9leHQvY29tcGFjdC5oIGIvbGliL3B5L3NyYy9leHQvY29tcGFjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3OGQ3YTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvc3JjL2V4dC9jb21wYWN0LmgKQEAgLTAsMCArMSwzNjggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUSFJJRlRfUFlfQ09NUEFDVF9ICisjZGVmaW5lIFRIUklGVF9QWV9DT01QQUNUX0gKKworI2luY2x1ZGUgPFB5dGhvbi5oPgorI2luY2x1ZGUgImV4dC9wcm90b2NvbC5oIgorI2luY2x1ZGUgImV4dC9lbmRpYW4uaCIKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGFjaz4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBweSB7CisKK2NsYXNzIENvbXBhY3RQcm90b2NvbCA6IHB1YmxpYyBQcm90b2NvbEJhc2U8Q29tcGFjdFByb3RvY29sPiB7CitwdWJsaWM6CisgIENvbXBhY3RQcm90b2NvbCgpIHsgcmVhZEJvb2xfLmV4aXN0cyA9IGZhbHNlOyB9CisKKyAgdmlydHVhbCB+Q29tcGFjdFByb3RvY29sKCkge30KKworICB2b2lkIHdyaXRlSTgoaW50OF90IHZhbCkgeyB3cml0ZUJ1ZmZlcihyZWludGVycHJldF9jYXN0PGNoYXIqPigmdmFsKSwgMSk7IH0KKworICB2b2lkIHdyaXRlSTE2KGludDE2X3QgdmFsKSB7IHdyaXRlVmFyaW50KHRvWmlnWmFnKHZhbCkpOyB9CisKKyAgaW50IHdyaXRlSTMyKGludDMyX3QgdmFsKSB7IHJldHVybiB3cml0ZVZhcmludCh0b1ppZ1phZyh2YWwpKTsgfQorCisgIHZvaWQgd3JpdGVJNjQoaW50NjRfdCB2YWwpIHsgd3JpdGVWYXJpbnQ2NCh0b1ppZ1phZzY0KHZhbCkpOyB9CisKKyAgdm9pZCB3cml0ZURvdWJsZShkb3VibGUgZHViKSB7CisgICAgdW5pb24geworICAgICAgZG91YmxlIGY7CisgICAgICBpbnQ2NF90IHQ7CisgICAgfSB0cmFuc2ZlcjsKKyAgICB0cmFuc2Zlci5mID0gaHRvbGVsbChkdWIpOworICAgIHdyaXRlQnVmZmVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZ0cmFuc2Zlci50KSwgc2l6ZW9mKGludDY0X3QpKTsKKyAgfQorCisgIHZvaWQgd3JpdGVCb29sKGludCB2KSB7IHdyaXRlQnl0ZShzdGF0aWNfY2FzdDx1aW50OF90Pih2ID8gQ1RfQk9PTEVBTl9UUlVFIDogQ1RfQk9PTEVBTl9GQUxTRSkpOyB9CisKKyAgdm9pZCB3cml0ZVN0cmluZyhQeU9iamVjdCogdmFsdWUsIGludDMyX3QgbGVuKSB7CisgICAgd3JpdGVWYXJpbnQobGVuKTsKKyAgICB3cml0ZUJ1ZmZlcihQeUJ5dGVzX0FTX1NUUklORyh2YWx1ZSksIGxlbik7CisgIH0KKworICBib29sIHdyaXRlTGlzdEJlZ2luKFB5T2JqZWN0KiB2YWx1ZSwgY29uc3QgU2V0TGlzdFR5cGVBcmdzJiBhcmdzLCBpbnQzMl90IGxlbikgeworICAgIGludCBjdHlwZSA9IHRvQ29tcGFjdFR5cGUoYXJncy5lbGVtZW50X3R5cGUpOworICAgIGlmIChsZW4gPD0gMTQpIHsKKyAgICAgIHdyaXRlQnl0ZShzdGF0aWNfY2FzdDx1aW50OF90PihsZW4gPDwgNCB8IGN0eXBlKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHdyaXRlQnl0ZSgweGYwIHwgY3R5cGUpOworICAgICAgd3JpdGVWYXJpbnQobGVuKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBib29sIHdyaXRlTWFwQmVnaW4oUHlPYmplY3QqIHZhbHVlLCBjb25zdCBNYXBUeXBlQXJncyYgYXJncywgaW50MzJfdCBsZW4pIHsKKyAgICBpZiAobGVuID09IDApIHsKKyAgICAgIHdyaXRlQnl0ZSgwKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpbnQgY3R5cGUgPSB0b0NvbXBhY3RUeXBlKGFyZ3Mua3RhZykgPDwgNCB8IHRvQ29tcGFjdFR5cGUoYXJncy52dGFnKTsKKyAgICB3cml0ZVZhcmludChsZW4pOworICAgIHdyaXRlQnl0ZShjdHlwZSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBib29sIHdyaXRlU3RydWN0QmVnaW4oKSB7CisgICAgd3JpdGVUYWdzXy5wdXNoKDApOworICAgIHJldHVybiB0cnVlOworICB9CisgIGJvb2wgd3JpdGVTdHJ1Y3RFbmQoKSB7CisgICAgd3JpdGVUYWdzXy5wb3AoKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGJvb2wgd3JpdGVGaWVsZChQeU9iamVjdCogdmFsdWUsIGNvbnN0IFN0cnVjdEl0ZW1TcGVjJiBzcGVjKSB7CisgICAgaWYgKHNwZWMudHlwZSA9PSBUX0JPT0wpIHsKKyAgICAgIGRvV3JpdGVGaWVsZEJlZ2luKHNwZWMsIFB5T2JqZWN0X0lzVHJ1ZSh2YWx1ZSkgPyBDVF9CT09MRUFOX1RSVUUgOiBDVF9CT09MRUFOX0ZBTFNFKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICBkb1dyaXRlRmllbGRCZWdpbihzcGVjLCB0b0NvbXBhY3RUeXBlKHNwZWMudHlwZSkpOworICAgICAgcmV0dXJuIGVuY29kZVZhbHVlKHZhbHVlLCBzcGVjLnR5cGUsIHNwZWMudHlwZWFyZ3MpOworICAgIH0KKyAgfQorCisgIHZvaWQgd3JpdGVGaWVsZFN0b3AoKSB7IHdyaXRlQnl0ZSgwKTsgfQorCisgIGJvb2wgcmVhZEJvb2woYm9vbCYgdmFsKSB7CisgICAgaWYgKHJlYWRCb29sXy5leGlzdHMpIHsKKyAgICAgIHJlYWRCb29sXy5leGlzdHMgPSBmYWxzZTsKKyAgICAgIHZhbCA9IHJlYWRCb29sXy52YWx1ZTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBjaGFyKiBidWY7CisgICAgaWYgKCFyZWFkQnl0ZXMoJmJ1ZiwgMSkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgdmFsID0gYnVmWzBdID09IENUX0JPT0xFQU5fVFJVRTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBib29sIHJlYWRJOChpbnQ4X3QmIHZhbCkgeworICAgIGNoYXIqIGJ1ZjsKKyAgICBpZiAoIXJlYWRCeXRlcygmYnVmLCAxKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB2YWwgPSBidWZbMF07CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBib29sIHJlYWRJMTYoaW50MTZfdCYgdmFsKSB7CisgICAgdWludDE2X3QgdXZhbDsKKyAgICBpZiAocmVhZFZhcmludDx1aW50MTZfdCwgMz4odXZhbCkpIHsKKyAgICAgIHZhbCA9IGZyb21aaWdaYWc8aW50MTZfdCwgdWludDE2X3Q+KHV2YWwpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGJvb2wgcmVhZEkzMihpbnQzMl90JiB2YWwpIHsKKyAgICB1aW50MzJfdCB1dmFsOworICAgIGlmIChyZWFkVmFyaW50PHVpbnQzMl90LCA1Pih1dmFsKSkgeworICAgICAgdmFsID0gZnJvbVppZ1phZzxpbnQzMl90LCB1aW50MzJfdD4odXZhbCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgYm9vbCByZWFkSTY0KGludDY0X3QmIHZhbCkgeworICAgIHVpbnQ2NF90IHV2YWw7CisgICAgaWYgKHJlYWRWYXJpbnQ8dWludDY0X3QsIDEwPih1dmFsKSkgeworICAgICAgdmFsID0gZnJvbVppZ1phZzxpbnQ2NF90LCB1aW50NjRfdD4odXZhbCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgYm9vbCByZWFkRG91YmxlKGRvdWJsZSYgdmFsKSB7CisgICAgdW5pb24geworICAgICAgaW50NjRfdCBmOworICAgICAgZG91YmxlIHQ7CisgICAgfSB0cmFuc2ZlcjsKKworICAgIGNoYXIqIGJ1ZjsKKyAgICBpZiAoIXJlYWRCeXRlcygmYnVmLCA4KSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBtZW1jcHkoJnRyYW5zZmVyLmYsIGJ1Ziwgc2l6ZW9mKGludDY0X3QpKTsKKyAgICB0cmFuc2Zlci5mID0gbGV0b2hsbCh0cmFuc2Zlci5mKTsKKyAgICB2YWwgPSB0cmFuc2Zlci50OworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgaW50MzJfdCByZWFkU3RyaW5nKGNoYXIqKiBidWYpIHsKKyAgICB1aW50MzJfdCBsZW47CisgICAgaWYgKCFyZWFkVmFyaW50PHVpbnQzMl90LCA1PihsZW4pIHx8ICFjaGVja0xlbmd0aExpbWl0KGxlbiwgc3RyaW5nTGltaXQoKSkpIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKGxlbiA9PSAwKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKCFyZWFkQnl0ZXMoYnVmLCBsZW4pKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiBsZW47CisgIH0KKworICBpbnQzMl90IHJlYWRMaXN0QmVnaW4oVFR5cGUmIGV0eXBlKSB7CisgICAgdWludDhfdCBiOworICAgIGlmICghcmVhZEJ5dGUoYikpIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZXR5cGUgPSBnZXRUVHlwZShiICYgMHhmKTsKKyAgICBpZiAoZXR5cGUgPT0gLTEpIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgdWludDMyX3QgbGVuID0gKGIgPj4gNCkgJiAweGY7CisgICAgaWYgKGxlbiA9PSAxNSAmJiAhcmVhZFZhcmludDx1aW50MzJfdCwgNT4obGVuKSkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoIWNoZWNrTGVuZ3RoTGltaXQobGVuLCBjb250YWluZXJMaW1pdCgpKSkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gbGVuOworICB9CisKKyAgaW50MzJfdCByZWFkTWFwQmVnaW4oVFR5cGUmIGt0eXBlLCBUVHlwZSYgdnR5cGUpIHsKKyAgICB1aW50MzJfdCBsZW47CisgICAgaWYgKCFyZWFkVmFyaW50PHVpbnQzMl90LCA1PihsZW4pIHx8ICFjaGVja0xlbmd0aExpbWl0KGxlbiwgY29udGFpbmVyTGltaXQoKSkpIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKGxlbiAhPSAwKSB7CisgICAgICB1aW50OF90IGt2VHlwZTsKKyAgICAgIGlmICghcmVhZEJ5dGUoa3ZUeXBlKSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBrdHlwZSA9IGdldFRUeXBlKGt2VHlwZSA+PiA0KTsKKyAgICAgIHZ0eXBlID0gZ2V0VFR5cGUoa3ZUeXBlICYgMHhmKTsKKyAgICAgIGlmIChrdHlwZSA9PSAtMSB8fCB2dHlwZSA9PSAtMSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBsZW47CisgIH0KKworICBib29sIHJlYWRTdHJ1Y3RCZWdpbigpIHsKKyAgICByZWFkVGFnc18ucHVzaCgwKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBib29sIHJlYWRTdHJ1Y3RFbmQoKSB7CisgICAgcmVhZFRhZ3NfLnBvcCgpOworICAgIHJldHVybiB0cnVlOworICB9CisgIGJvb2wgcmVhZEZpZWxkQmVnaW4oVFR5cGUmIHR5cGUsIGludDE2X3QmIHRhZyk7CisKKyAgYm9vbCBza2lwQm9vbCgpIHsKKyAgICBib29sIHZhbDsKKyAgICByZXR1cm4gcmVhZEJvb2wodmFsKTsKKyAgfQorI2RlZmluZSBTS0lQQllURVMobikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghcmVhZEJ5dGVzKCZkdW1teV9idWZfLCAobikpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcmV0dXJuIGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorICBib29sIHNraXBCeXRlKCkgeyBTS0lQQllURVMoMSk7IH0KKyAgYm9vbCBza2lwRG91YmxlKCkgeyBTS0lQQllURVMoOCk7IH0KKyAgYm9vbCBza2lwSTE2KCkgeworICAgIGludDE2X3QgdmFsOworICAgIHJldHVybiByZWFkSTE2KHZhbCk7CisgIH0KKyAgYm9vbCBza2lwSTMyKCkgeworICAgIGludDMyX3QgdmFsOworICAgIHJldHVybiByZWFkSTMyKHZhbCk7CisgIH0KKyAgYm9vbCBza2lwSTY0KCkgeworICAgIGludDY0X3QgdmFsOworICAgIHJldHVybiByZWFkSTY0KHZhbCk7CisgIH0KKyAgYm9vbCBza2lwU3RyaW5nKCkgeworICAgIHVpbnQzMl90IGxlbjsKKyAgICBpZiAoIXJlYWRWYXJpbnQ8dWludDMyX3QsIDU+KGxlbikpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgU0tJUEJZVEVTKGxlbik7CisgIH0KKyN1bmRlZiBTS0lQQllURVMKKworcHJpdmF0ZToKKyAgZW51bSBUeXBlcyB7CisgICAgQ1RfU1RPUCA9IDB4MDAsCisgICAgQ1RfQk9PTEVBTl9UUlVFID0gMHgwMSwKKyAgICBDVF9CT09MRUFOX0ZBTFNFID0gMHgwMiwKKyAgICBDVF9CWVRFID0gMHgwMywKKyAgICBDVF9JMTYgPSAweDA0LAorICAgIENUX0kzMiA9IDB4MDUsCisgICAgQ1RfSTY0ID0gMHgwNiwKKyAgICBDVF9ET1VCTEUgPSAweDA3LAorICAgIENUX0JJTkFSWSA9IDB4MDgsCisgICAgQ1RfTElTVCA9IDB4MDksCisgICAgQ1RfU0VUID0gMHgwQSwKKyAgICBDVF9NQVAgPSAweDBCLAorICAgIENUX1NUUlVDVCA9IDB4MEMKKyAgfTsKKworICBzdGF0aWMgY29uc3QgdWludDhfdCBUVHlwZVRvQ1R5cGVbXTsKKworICBUVHlwZSBnZXRUVHlwZSh1aW50OF90IHR5cGUpOworCisgIGludCB0b0NvbXBhY3RUeXBlKFRUeXBlIHR5cGUpIHsKKyAgICBpbnQgaSA9IHN0YXRpY19jYXN0PGludD4odHlwZSk7CisgICAgcmV0dXJuIGkgPCAxNiA/IFRUeXBlVG9DVHlwZVtpXSA6IC0xOworICB9CisKKyAgdWludDMyX3QgdG9aaWdaYWcoaW50MzJfdCB2YWwpIHsgcmV0dXJuICh2YWwgPj4gMzEpIF4gKHZhbCA8PCAxKTsgfQorCisgIHVpbnQ2NF90IHRvWmlnWmFnNjQoaW50NjRfdCB2YWwpIHsgcmV0dXJuICh2YWwgPj4gNjMpIF4gKHZhbCA8PCAxKTsgfQorCisgIGludCB3cml0ZVZhcmludCh1aW50MzJfdCB2YWwpIHsKKyAgICBpbnQgY250ID0gMTsKKyAgICB3aGlsZSAodmFsICYgfjB4N2ZVKSB7CisgICAgICB3cml0ZUJ5dGUoc3RhdGljX2Nhc3Q8Y2hhcj4oKHZhbCAmIDB4N2ZVKSB8IDB4ODBVKSk7CisgICAgICB2YWwgPj49IDc7CisgICAgICArK2NudDsKKyAgICB9CisgICAgd3JpdGVCeXRlKHN0YXRpY19jYXN0PGNoYXI+KHZhbCkpOworICAgIHJldHVybiBjbnQ7CisgIH0KKworICBpbnQgd3JpdGVWYXJpbnQ2NCh1aW50NjRfdCB2YWwpIHsKKyAgICBpbnQgY250ID0gMTsKKyAgICB3aGlsZSAodmFsICYgfjB4N2ZVTEwpIHsKKyAgICAgIHdyaXRlQnl0ZShzdGF0aWNfY2FzdDxjaGFyPigodmFsICYgMHg3ZlVMTCkgfCAweDgwVUxMKSk7CisgICAgICB2YWwgPj49IDc7CisgICAgICArK2NudDsKKyAgICB9CisgICAgd3JpdGVCeXRlKHN0YXRpY19jYXN0PGNoYXI+KHZhbCkpOworICAgIHJldHVybiBjbnQ7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgaW50IE1heD4KKyAgYm9vbCByZWFkVmFyaW50KFQmIHJlc3VsdCkgeworICAgIHVpbnQ4X3QgYjsKKyAgICBUIHZhbCA9IDA7CisgICAgaW50IHNoaWZ0ID0gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IE1heDsgKytpKSB7CisgICAgICBpZiAoIXJlYWRCeXRlKGIpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGlmIChiICYgMHg4MCkgeworICAgICAgICB2YWwgfD0gc3RhdGljX2Nhc3Q8VD4oYiAmIDB4N2YpIDw8IHNoaWZ0OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdmFsIHw9IHN0YXRpY19jYXN0PFQ+KGIpIDw8IHNoaWZ0OworICAgICAgICByZXN1bHQgPSB2YWw7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgICAgc2hpZnQgKz0gNzsKKyAgICB9CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX092ZXJmbG93RXJyb3IsICJ2YXJpbnQgZXhjZWVkZWQgJWQgYnl0ZXMiLCBNYXgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBTLCB0eXBlbmFtZSBVPgorICBTIGZyb21aaWdaYWcoVSB2YWwpIHsKKyAgICByZXR1cm4gKHZhbCA+PiAxKSBeIHN0YXRpY19jYXN0PFU+KC1zdGF0aWNfY2FzdDxTPih2YWwgJiAxKSk7CisgIH0KKworICB2b2lkIGRvV3JpdGVGaWVsZEJlZ2luKGNvbnN0IFN0cnVjdEl0ZW1TcGVjJiBzcGVjLCBpbnQgY3R5cGUpIHsKKyAgICBpbnQgZGlmZiA9IHNwZWMudGFnIC0gd3JpdGVUYWdzXy50b3AoKTsKKyAgICBpZiAoZGlmZiA+IDAgJiYgZGlmZiA8PSAxNSkgeworICAgICAgd3JpdGVCeXRlKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGRpZmYgPDwgNCB8IGN0eXBlKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHdyaXRlQnl0ZShzdGF0aWNfY2FzdDx1aW50OF90PihjdHlwZSkpOworICAgICAgd3JpdGVJMTYoc3BlYy50YWcpOworICAgIH0KKyAgICB3cml0ZVRhZ3NfLnRvcCgpID0gc3BlYy50YWc7CisgIH0KKworICBzdGQ6OnN0YWNrPGludD4gd3JpdGVUYWdzXzsKKyAgc3RkOjpzdGFjazxpbnQ+IHJlYWRUYWdzXzsKKyAgc3RydWN0IHsKKyAgICBib29sIGV4aXN0czsKKyAgICBib29sIHZhbHVlOworICB9IHJlYWRCb29sXzsKKyAgY2hhciogZHVtbXlfYnVmXzsKK307Cit9Cit9Cit9CisjZW5kaWYgLy8gVEhSSUZUX1BZX0NPTVBBQ1RfSApkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9leHQvZW5kaWFuLmggYi9saWIvcHkvc3JjL2V4dC9lbmRpYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTM3MmE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5L3NyYy9leHQvZW5kaWFuLmgKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRIUklGVF9QWV9FTkRJQU5fSAorI2RlZmluZSBUSFJJRlRfUFlfRU5ESUFOX0gKKworI2luY2x1ZGUgPFB5dGhvbi5oPgorCisjaWZuZGVmIF9XSU4zMgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNlbHNlCisjaW5jbHVkZSA8V2luU29jazIuaD4KKyNwcmFnbWEgY29tbWVudChsaWIsICJ3czJfMzIubGliIikKKyNkZWZpbmUgQklHX0VORElBTiAoNDMyMSkKKyNkZWZpbmUgTElUVExFX0VORElBTiAoMTIzNCkKKyNkZWZpbmUgQllURV9PUkRFUiBMSVRUTEVfRU5ESUFOCisjZGVmaW5lIGlubGluZSBfX2lubGluZQorI2VuZGlmCisKKy8qIEZpeCBlbmRpYW5uZXNzIGlzc3VlcyBvbiBTb2xhcmlzICovCisjaWYgZGVmaW5lZChfX1NWUjQpICYmIGRlZmluZWQoX19zdW4pCisjaWYgZGVmaW5lZChfX2kzODYpICYmICFkZWZpbmVkKF9faTM4Nl9fKQorI2RlZmluZSBfX2kzODZfXworI2VuZGlmCisKKyNpZm5kZWYgQklHX0VORElBTgorI2RlZmluZSBCSUdfRU5ESUFOICg0MzIxKQorI2VuZGlmCisjaWZuZGVmIExJVFRMRV9FTkRJQU4KKyNkZWZpbmUgTElUVExFX0VORElBTiAoMTIzNCkKKyNlbmRpZgorCisvKiBJMzg2IGlzIExFLCBldmVuIG9uIFNvbGFyaXMgKi8KKyNpZiAhZGVmaW5lZChCWVRFX09SREVSKSAmJiBkZWZpbmVkKF9faTM4Nl9fKQorI2RlZmluZSBCWVRFX09SREVSIExJVFRMRV9FTkRJQU4KKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgX19CWVRFX09SREVSCisjaWYgZGVmaW5lZChCWVRFX09SREVSKSAmJiBkZWZpbmVkKExJVFRMRV9FTkRJQU4pICYmIGRlZmluZWQoQklHX0VORElBTikKKyNkZWZpbmUgX19CWVRFX09SREVSIEJZVEVfT1JERVIKKyNkZWZpbmUgX19MSVRUTEVfRU5ESUFOIExJVFRMRV9FTkRJQU4KKyNkZWZpbmUgX19CSUdfRU5ESUFOIEJJR19FTkRJQU4KKyNlbHNlCisjZXJyb3IgIkNhbm5vdCBkZXRlcm1pbmUgZW5kaWFubmVzcyIKKyNlbmRpZgorI2VuZGlmCisKKy8vIFNhbWUgY29tbWVudCBhcyB0aGUgZW51bS4gIFNvcnJ5LgorI2lmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKyNkZWZpbmUgbnRvaGxsKG4pIChuKQorI2RlZmluZSBodG9ubGwobikgKG4pCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX0dMSUJDX18pCisjaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KKyNkZWZpbmUgbGV0b2hsbChuKSBic3dhcF82NChuKQorI2RlZmluZSBodG9sZWxsKG4pIGJzd2FwXzY0KG4pCisjZWxzZSAvKiBHTlVDICYgR0xJQkMgKi8KKyNkZWZpbmUgbGV0b2hsbChuKSAoKCgodW5zaWduZWQgbG9uZyBsb25nKW50b2hsKG4pKSA8PCAzMikgKyBudG9obChuID4+IDMyKSkKKyNkZWZpbmUgaHRvbGVsbChuKSAoKCgodW5zaWduZWQgbG9uZyBsb25nKWh0b25sKG4pKSA8PCAzMikgKyBodG9ubChuID4+IDMyKSkKKyNlbmRpZgorI2VsaWYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgorI2lmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19HTElCQ19fKQorI2luY2x1ZGUgPGJ5dGVzd2FwLmg+CisjZGVmaW5lIG50b2hsbChuKSBic3dhcF82NChuKQorI2RlZmluZSBodG9ubGwobikgYnN3YXBfNjQobikKKyNlbHNlIC8qIEdOVUMgJiBHTElCQyAqLworI2RlZmluZSBudG9obGwobikgKCgoKHVuc2lnbmVkIGxvbmcgbG9uZyludG9obChuKSkgPDwgMzIpICsgbnRvaGwobiA+PiAzMikpCisjZGVmaW5lIGh0b25sbChuKSAoKCgodW5zaWduZWQgbG9uZyBsb25nKWh0b25sKG4pKSA8PCAzMikgKyBodG9ubChuID4+IDMyKSkKKyNlbmRpZiAvKiBHTlVDICYgR0xJQkMgKi8KKyNkZWZpbmUgbGV0b2hsbChuKSAobikKKyNkZWZpbmUgaHRvbGVsbChuKSAobikKKyNlbHNlIC8qIF9fQllURV9PUkRFUiAqLworI2Vycm9yICJDYW4ndCBkZWZpbmUgaHRvbmxsIG9yIG50b2hsbCEiCisjZW5kaWYKKworI2VuZGlmIC8vIFRIUklGVF9QWV9FTkRJQU5fSApkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9leHQvbW9kdWxlLmNwcCBiL2xpYi9weS9zcmMvZXh0L21vZHVsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE1OGI4ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9zcmMvZXh0L21vZHVsZS5jcHAKQEAgLTAsMCArMSwyMDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPFB5dGhvbi5oPgorI2luY2x1ZGUgInR5cGVzLmgiCisjaW5jbHVkZSAiYmluYXJ5LmgiCisjaW5jbHVkZSAiY29tcGFjdC5oIgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLy8gVE9ETyhkcmVpc3MpOiBkZWZ2YWwgYXBwZWFycyB0byBiZSB1bnVzZWQuICBMb29rIGludG8gcmVtb3ZpbmcgaXQuCisvLyBUT0RPKGRyZWlzcyk6IE1ha2UgcGFyc2Vfc3BlY19hcmdzIHJlY3Vyc2l2ZSwgYW5kIGNhY2hlIHRoZSBvdXRwdXQKKy8vICAgICAgICAgICAgICAgcGVybWFuZW50bHkgaW4gdGhlIG9iamVjdC4gIChNYWxsb2MgYW5kIG9ycGhhbi4pCisvLyBUT0RPKGRyZWlzcyk6IFdoeSBkbyB3ZSBuZWVkIGNTdHJpbmdJTyBmb3IgcmVhZGluZywgd2h5IG5vdCBqdXN0IGNoYXIqPworLy8gICAgICAgICAgICAgICBDYW4gY1N0cmluZ0lPIGxldCB1cyB3b3JrIHdpdGggYSBCdWZmZXJlZFRyYW5zcG9ydD8KKy8vIFRPRE8oZHJlaXNzKTogRG9uJ3QgaWdub3JlIHRoZSBydiBmcm9tIGN3cml0ZSAobWF5YmUpLgorCisvLyBEb2luZyBhIGJlbmNobWFyayBzaG93cyB0aGF0IGludGVybmluZyBhY3R1YWxseSBtYWtlcyBhIGRpZmZlcmVuY2UsIGFtYXppbmdseS4KKworLyoqIFBvaW50ZXIgdG8gaW50ZXJuZWQgc3RyaW5nIHRvIHNwZWVkIHVwIGF0dHJpYnV0ZSBsb29rdXAuICovCitQeU9iamVjdCogSU5URVJOX1NUUklORyhURnJvemVuRGljdCk7CitQeU9iamVjdCogSU5URVJOX1NUUklORyhjc3RyaW5naW9fYnVmKTsKK1B5T2JqZWN0KiBJTlRFUk5fU1RSSU5HKGNzdHJpbmdpb19yZWZpbGwpOworc3RhdGljIFB5T2JqZWN0KiBJTlRFUk5fU1RSSU5HKHN0cmluZ19sZW5ndGhfbGltaXQpOworc3RhdGljIFB5T2JqZWN0KiBJTlRFUk5fU1RSSU5HKGNvbnRhaW5lcl9sZW5ndGhfbGltaXQpOworc3RhdGljIFB5T2JqZWN0KiBJTlRFUk5fU1RSSU5HKHRyYW5zKTsKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBweSB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RhdGljIFB5T2JqZWN0KiBlbmNvZGVfaW1wbChQeU9iamVjdCogYXJncykgeworICBpZiAoIWFyZ3MpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgUHlPYmplY3QqIGVuY19vYmogPSBOVUxMOworICBQeU9iamVjdCogdHlwZV9hcmdzID0gTlVMTDsKKyAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPTyIsICZlbmNfb2JqLCAmdHlwZV9hcmdzKSkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIGlmICghZW5jX29iaiB8fCAhdHlwZV9hcmdzKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBUIHByb3RvY29sOworICBpZiAoIXByb3RvY29sLnByZXBhcmVFbmNvZGVCdWZmZXIoKSB8fCAhcHJvdG9jb2wuZW5jb2RlVmFsdWUoZW5jX29iaiwgVF9TVFJVQ1QsIHR5cGVfYXJncykpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIHJldHVybiBwcm90b2NvbC5nZXRFbmNvZGVkVmFsdWUoKTsKK30KKworc3RhdGljIGlubGluZSBsb25nIGFzX2xvbmdfdGhlbl9kZWxldGUoUHlPYmplY3QqIHZhbHVlLCBsb25nIGRlZmF1bHRfdmFsdWUpIHsKKyAgU2NvcGVkUHlPYmplY3Qgc2NvcGUodmFsdWUpOworICBsb25nIHYgPSBQeUludF9Bc0xvbmcodmFsdWUpOworICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQodikpIHsKKyAgICBQeUVycl9DbGVhcigpOworICAgIHJldHVybiBkZWZhdWx0X3ZhbHVlOworICB9CisgIHJldHVybiB2OworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0YXRpYyBQeU9iamVjdCogZGVjb2RlX2ltcGwoUHlPYmplY3QqIGFyZ3MpIHsKKyAgUHlPYmplY3QqIG91dHB1dF9vYmogPSBOVUxMOworICBQeU9iamVjdCogb3Byb3QgPSBOVUxMOworICBQeU9iamVjdCogdHlwZWFyZ3MgPSBOVUxMOworICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9PTyIsICZvdXRwdXRfb2JqLCAmb3Byb3QsICZ0eXBlYXJncykpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIFQgcHJvdG9jb2w7CisgIGludDMyX3QgZGVmYXVsdF9saW1pdCA9IChzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptYXgpKCk7CisgIHByb3RvY29sLnNldFN0cmluZ0xlbmd0aExpbWl0KAorICAgICAgYXNfbG9uZ190aGVuX2RlbGV0ZShQeU9iamVjdF9HZXRBdHRyKG9wcm90LCBJTlRFUk5fU1RSSU5HKHN0cmluZ19sZW5ndGhfbGltaXQpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdF9saW1pdCkpOworICBwcm90b2NvbC5zZXRDb250YWluZXJMZW5ndGhMaW1pdCgKKyAgICAgIGFzX2xvbmdfdGhlbl9kZWxldGUoUHlPYmplY3RfR2V0QXR0cihvcHJvdCwgSU5URVJOX1NUUklORyhjb250YWluZXJfbGVuZ3RoX2xpbWl0KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRfbGltaXQpKTsKKyAgU2NvcGVkUHlPYmplY3QgdHJhbnNwb3J0KFB5T2JqZWN0X0dldEF0dHIob3Byb3QsIElOVEVSTl9TVFJJTkcodHJhbnMpKSk7CisgIGlmICghdHJhbnNwb3J0KSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBTdHJ1Y3RUeXBlQXJncyBwYXJzZWRhcmdzOworICBpZiAoIXBhcnNlX3N0cnVjdF9hcmdzKCZwYXJzZWRhcmdzLCB0eXBlYXJncykpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGlmICghcHJvdG9jb2wucHJlcGFyZURlY29kZUJ1ZmZlckZyb21UcmFuc3BvcnQodHJhbnNwb3J0LmdldCgpKSkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgcmV0dXJuIHByb3RvY29sLnJlYWRTdHJ1Y3Qob3V0cHV0X29iaiwgcGFyc2VkYXJncy5rbGFzcywgcGFyc2VkYXJncy5zcGVjKTsKK30KK30KK30KK30KKwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OjpweTsKKworLyogLS0gUFlUSE9OIE1PRFVMRSBTRVRVUCBTVFVGRiAtLS0gKi8KKworZXh0ZXJuICJDIiB7CisKK3N0YXRpYyBQeU9iamVjdCogZW5jb2RlX2JpbmFyeShQeU9iamVjdCosIFB5T2JqZWN0KiBhcmdzKSB7CisgIHJldHVybiBlbmNvZGVfaW1wbDxCaW5hcnlQcm90b2NvbD4oYXJncyk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogZGVjb2RlX2JpbmFyeShQeU9iamVjdCosIFB5T2JqZWN0KiBhcmdzKSB7CisgIHJldHVybiBkZWNvZGVfaW1wbDxCaW5hcnlQcm90b2NvbD4oYXJncyk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogZW5jb2RlX2NvbXBhY3QoUHlPYmplY3QqLCBQeU9iamVjdCogYXJncykgeworICByZXR1cm4gZW5jb2RlX2ltcGw8Q29tcGFjdFByb3RvY29sPihhcmdzKTsKK30KKworc3RhdGljIFB5T2JqZWN0KiBkZWNvZGVfY29tcGFjdChQeU9iamVjdCosIFB5T2JqZWN0KiBhcmdzKSB7CisgIHJldHVybiBkZWNvZGVfaW1wbDxDb21wYWN0UHJvdG9jb2w+KGFyZ3MpOworfQorCitzdGF0aWMgUHlNZXRob2REZWYgVGhyaWZ0RmFzdEJpbmFyeU1ldGhvZHNbXSA9IHsKKyAgICB7ImVuY29kZV9iaW5hcnkiLCBlbmNvZGVfYmluYXJ5LCBNRVRIX1ZBUkFSR1MsICIifSwKKyAgICB7ImRlY29kZV9iaW5hcnkiLCBkZWNvZGVfYmluYXJ5LCBNRVRIX1ZBUkFSR1MsICIifSwKKyAgICB7ImVuY29kZV9jb21wYWN0IiwgZW5jb2RlX2NvbXBhY3QsIE1FVEhfVkFSQVJHUywgIiJ9LAorICAgIHsiZGVjb2RlX2NvbXBhY3QiLCBkZWNvZGVfY29tcGFjdCwgTUVUSF9WQVJBUkdTLCAiIn0sCisgICAge05VTEwsIE5VTEwsIDAsIE5VTEx9IC8qIFNlbnRpbmVsICovCit9OworCisjaWYgUFlfTUFKT1JfVkVSU0lPTiA+PSAzCisKK3N0YXRpYyBzdHJ1Y3QgUHlNb2R1bGVEZWYgVGhyaWZ0RmFzdEJpbmFyeURlZiA9IHtQeU1vZHVsZURlZl9IRUFEX0lOSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRocmlmdC5wcm90b2NvbC5mYXN0YmluYXJ5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0RmFzdEJpbmFyeU1ldGhvZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTH07CisKKyNkZWZpbmUgSU5JVEVSUk9SIHJldHVybiBOVUxMOworCitQeU9iamVjdCogUHlJbml0X2Zhc3RiaW5hcnkoKSB7CisKKyNlbHNlCisKKyNkZWZpbmUgSU5JVEVSUk9SIHJldHVybjsKKwordm9pZCBpbml0ZmFzdGJpbmFyeSgpIHsKKworICBQeWNTdHJpbmdfSU1QT1JUOworICBpZiAoUHljU3RyaW5nSU8gPT0gTlVMTCkKKyAgICBJTklURVJST1IKKworI2VuZGlmCisKKyNkZWZpbmUgSU5JVF9JTlRFUk5fU1RSSU5HKHZhbHVlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBJTlRFUk5fU1RSSU5HKHZhbHVlKSA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoI3ZhbHVlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIUlOVEVSTl9TVFJJTkcodmFsdWUpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIElOSVRFUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworICBJTklUX0lOVEVSTl9TVFJJTkcoVEZyb3plbkRpY3QpOworICBJTklUX0lOVEVSTl9TVFJJTkcoY3N0cmluZ2lvX2J1Zik7CisgIElOSVRfSU5URVJOX1NUUklORyhjc3RyaW5naW9fcmVmaWxsKTsKKyAgSU5JVF9JTlRFUk5fU1RSSU5HKHN0cmluZ19sZW5ndGhfbGltaXQpOworICBJTklUX0lOVEVSTl9TVFJJTkcoY29udGFpbmVyX2xlbmd0aF9saW1pdCk7CisgIElOSVRfSU5URVJOX1NUUklORyh0cmFucyk7CisjdW5kZWYgSU5JVF9JTlRFUk5fU1RSSU5HCisKKyAgUHlPYmplY3QqIG1vZHVsZSA9CisjaWYgUFlfTUFKT1JfVkVSU0lPTiA+PSAzCisgICAgICBQeU1vZHVsZV9DcmVhdGUoJlRocmlmdEZhc3RCaW5hcnlEZWYpOworI2Vsc2UKKyAgICAgIFB5X0luaXRNb2R1bGUoInRocmlmdC5wcm90b2NvbC5mYXN0YmluYXJ5IiwgVGhyaWZ0RmFzdEJpbmFyeU1ldGhvZHMpOworI2VuZGlmCisgIGlmIChtb2R1bGUgPT0gTlVMTCkKKyAgICBJTklURVJST1I7CisKKyNpZiBQWV9NQUpPUl9WRVJTSU9OID49IDMKKyAgcmV0dXJuIG1vZHVsZTsKKyNlbmRpZgorfQorfQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9leHQvcHJvdG9jb2wuaCBiL2xpYi9weS9zcmMvZXh0L3Byb3RvY29sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIxYjdlZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9zcmMvZXh0L3Byb3RvY29sLmgKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRIUklGVF9QWV9QUk9UT0NPTF9ICisjZGVmaW5lIFRIUklGVF9QWV9QUk9UT0NPTF9ICisKKyNpbmNsdWRlICJleHQvdHlwZXMuaCIKKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHkgeworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KK2NsYXNzIFByb3RvY29sQmFzZSB7CisKK3B1YmxpYzoKKyAgUHJvdG9jb2xCYXNlKCkKKyAgICA6IHN0cmluZ0xpbWl0Xygoc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KSgpKSwKKyAgICAgIGNvbnRhaW5lckxpbWl0Xygoc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KSgpKSwKKyAgICAgIG91dHB1dF8oTlVMTCkge30KKyAgaW5saW5lIHZpcnR1YWwgflByb3RvY29sQmFzZSgpOworCisgIGJvb2wgcHJlcGFyZURlY29kZUJ1ZmZlckZyb21UcmFuc3BvcnQoUHlPYmplY3QqIHRyYW5zKTsKKworICBQeU9iamVjdCogcmVhZFN0cnVjdChQeU9iamVjdCogb3V0cHV0LCBQeU9iamVjdCoga2xhc3MsIFB5T2JqZWN0KiBzcGVjX3NlcSk7CisKKyAgYm9vbCBwcmVwYXJlRW5jb2RlQnVmZmVyKCk7CisKKyAgYm9vbCBlbmNvZGVWYWx1ZShQeU9iamVjdCogdmFsdWUsIFRUeXBlIHR5cGUsIFB5T2JqZWN0KiB0eXBlYXJncyk7CisKKyAgUHlPYmplY3QqIGdldEVuY29kZWRWYWx1ZSgpOworCisgIGxvbmcgc3RyaW5nTGltaXQoKSBjb25zdCB7IHJldHVybiBzdHJpbmdMaW1pdF87IH0KKyAgdm9pZCBzZXRTdHJpbmdMZW5ndGhMaW1pdChsb25nIGxpbWl0KSB7IHN0cmluZ0xpbWl0XyA9IGxpbWl0OyB9CisKKyAgbG9uZyBjb250YWluZXJMaW1pdCgpIGNvbnN0IHsgcmV0dXJuIGNvbnRhaW5lckxpbWl0XzsgfQorICB2b2lkIHNldENvbnRhaW5lckxlbmd0aExpbWl0KGxvbmcgbGltaXQpIHsgY29udGFpbmVyTGltaXRfID0gbGltaXQ7IH0KKworcHJvdGVjdGVkOgorICBib29sIHJlYWRCeXRlcyhjaGFyKiogb3V0cHV0LCBpbnQgbGVuKTsKKworICBib29sIHJlYWRCeXRlKHVpbnQ4X3QmIHZhbCkgeworICAgIGNoYXIqIGJ1ZjsKKyAgICBpZiAoIXJlYWRCeXRlcygmYnVmLCAxKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB2YWwgPSBzdGF0aWNfY2FzdDx1aW50OF90PihidWZbMF0pOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgYm9vbCB3cml0ZUJ1ZmZlcihjaGFyKiBkYXRhLCBzaXplX3QgbGVuKTsKKworICB2b2lkIHdyaXRlQnl0ZSh1aW50OF90IHZhbCkgeyB3cml0ZUJ1ZmZlcihyZWludGVycHJldF9jYXN0PGNoYXIqPigmdmFsKSwgMSk7IH0KKworICBQeU9iamVjdCogZGVjb2RlVmFsdWUoVFR5cGUgdHlwZSwgUHlPYmplY3QqIHR5cGVhcmdzKTsKKworICBib29sIHNraXAoVFR5cGUgdHlwZSk7CisKKyAgaW5saW5lIGJvb2wgY2hlY2tUeXBlKFRUeXBlIGdvdCwgVFR5cGUgZXhwZWN0ZWQpOworICBpbmxpbmUgYm9vbCBjaGVja0xlbmd0aExpbWl0KGludDMyX3QgbGVuLCBsb25nIGxpbWl0KTsKKworICBpbmxpbmUgYm9vbCBpc1V0ZjgoUHlPYmplY3QqIHR5cGVhcmdzKTsKKworcHJpdmF0ZToKKyAgSW1wbCogaW1wbCgpIHsgcmV0dXJuIHN0YXRpY19jYXN0PEltcGwqPih0aGlzKTsgfQorCisgIGxvbmcgc3RyaW5nTGltaXRfOworICBsb25nIGNvbnRhaW5lckxpbWl0XzsKKyAgRW5jb2RlQnVmZmVyKiBvdXRwdXRfOworICBEZWNvZGVCdWZmZXIgaW5wdXRfOworfTsKK30KK30KK30KKworI2luY2x1ZGUgImV4dC9wcm90b2NvbC50Y2MiCisKKyNlbmRpZiAvLyBUSFJJRlRfUFlfUFJPVE9DT0xfSApkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9leHQvcHJvdG9jb2wudGNjIGIvbGliL3B5L3NyYy9leHQvcHJvdG9jb2wudGNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNWRmN2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvc3JjL2V4dC9wcm90b2NvbC50Y2MKQEAgLTAsMCArMSw5MTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUSFJJRlRfUFlfUFJPVE9DT0xfVENDCisjZGVmaW5lIFRIUklGVF9QWV9QUk9UT0NPTF9UQ0MKKworI2luY2x1ZGUgPGl0ZXJhdG9yPgorCisjZGVmaW5lIENIRUNLX1JBTkdFKHYsIG1pbiwgbWF4KSAoKCh2KSA8PSAobWF4KSkgJiYgKCh2KSA+PSAobWluKSkpCisjZGVmaW5lIElOSVRfT1VUQlVGX1NJWkUgMTI4CisKKyNpZiBQWV9NQUpPUl9WRVJTSU9OIDwgMworI2luY2x1ZGUgPGNTdHJpbmdJTy5oPgorI2Vsc2UKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjZW5kaWYKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBweSB7CisKKyNpZiBQWV9NQUpPUl9WRVJTSU9OIDwgMworCituYW1lc3BhY2UgZGV0YWlsIHsKKworaW5saW5lIGJvb2wgaW5wdXRfY2hlY2soUHlPYmplY3QqIGlucHV0KSB7CisgIHJldHVybiBQeWNTdHJpbmdJT19JbnB1dENoZWNrKGlucHV0KTsKK30KKworaW5saW5lIEVuY29kZUJ1ZmZlciogbmV3X2VuY29kZV9idWZmZXIoc2l6ZV90IHNpemUpIHsKKyAgaWYgKCFQeWNTdHJpbmdJTykgeworICAgIFB5Y1N0cmluZ19JTVBPUlQ7CisgIH0KKyAgaWYgKCFQeWNTdHJpbmdJTykgeworICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiBQeWNTdHJpbmdJTy0+TmV3T3V0cHV0KHNpemUpOworfQorCitpbmxpbmUgaW50IHJlYWRfYnVmZmVyKFB5T2JqZWN0KiBidWYsIGNoYXIqKiBvdXRwdXQsIGludCBsZW4pIHsKKyAgaWYgKCFQeWNTdHJpbmdJTykgeworICAgIFB5Y1N0cmluZ19JTVBPUlQ7CisgIH0KKyAgaWYgKCFQeWNTdHJpbmdJTykgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwgImZhaWxlZCB0byBpbXBvcnQgbmF0aXZlIGNTdHJpbmdJTyIpOworICAgIHJldHVybiAtMTsKKyAgfQorICByZXR1cm4gUHljU3RyaW5nSU8tPmNyZWFkKGJ1Ziwgb3V0cHV0LCBsZW4pOworfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KK2lubGluZSBQcm90b2NvbEJhc2U8SW1wbD46On5Qcm90b2NvbEJhc2UoKSB7CisgIGlmIChvdXRwdXRfKSB7CisgICAgUHlfQ0xFQVIob3V0cHV0Xyk7CisgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEltcGw+CitpbmxpbmUgYm9vbCBQcm90b2NvbEJhc2U8SW1wbD46OmlzVXRmOChQeU9iamVjdCogdHlwZWFyZ3MpIHsKKyAgcmV0dXJuIFB5U3RyaW5nX0NoZWNrKHR5cGVhcmdzKSAmJiAhc3RybmNtcChQeVN0cmluZ19BU19TVFJJTkcodHlwZWFyZ3MpLCAiVVRGOCIsIDQpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KK1B5T2JqZWN0KiBQcm90b2NvbEJhc2U8SW1wbD46OmdldEVuY29kZWRWYWx1ZSgpIHsKKyAgaWYgKCFQeWNTdHJpbmdJTykgeworICAgIFB5Y1N0cmluZ19JTVBPUlQ7CisgIH0KKyAgaWYgKCFQeWNTdHJpbmdJTykgeworICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiBQeWNTdHJpbmdJTy0+Y2dldHZhbHVlKG91dHB1dF8pOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KK2lubGluZSBib29sIFByb3RvY29sQmFzZTxJbXBsPjo6d3JpdGVCdWZmZXIoY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgaWYgKCFQeWNTdHJpbmdJTykgeworICAgIFB5Y1N0cmluZ19JTVBPUlQ7CisgIH0KKyAgaWYgKCFQeWNTdHJpbmdJTykgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwgImZhaWxlZCB0byBpbXBvcnQgbmF0aXZlIGNTdHJpbmdJTyIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpbnQgbGVuID0gUHljU3RyaW5nSU8tPmN3cml0ZShvdXRwdXRfLCBkYXRhLCBzaXplKTsKKyAgaWYgKGxlbiA8IDApIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSU9FcnJvciwgImZhaWxlZCB0byB3cml0ZSB0byBjU3RyaW5nSU8gb2JqZWN0Iik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmIChzdGF0aWNfY2FzdDxzaXplX3Q+KGxlbikgIT0gc2l6ZSkgeworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19FT0ZFcnJvciwgIndyaXRlIGxlbmd0aCBtaXNtYXRjaDogZXhwZWN0ZWQgJWx1IGdvdCAlZCIsIHNpemUsIGxlbik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCisjZWxzZQorCituYW1lc3BhY2UgZGV0YWlsIHsKKworaW5saW5lIGJvb2wgaW5wdXRfY2hlY2soUHlPYmplY3QqIGlucHV0KSB7CisgIC8vIFRPRE86IENoZWNrIGZvciBCeXRlc0lPIHR5cGUKKyAgcmV0dXJuIHRydWU7Cit9CisKK2lubGluZSBFbmNvZGVCdWZmZXIqIG5ld19lbmNvZGVfYnVmZmVyKHNpemVfdCBzaXplKSB7CisgIEVuY29kZUJ1ZmZlciogYnVmZmVyID0gbmV3IEVuY29kZUJ1ZmZlcjsKKyAgYnVmZmVyLT5idWYucmVzZXJ2ZShzaXplKTsKKyAgYnVmZmVyLT5wb3MgPSAwOworICByZXR1cm4gYnVmZmVyOworfQorCitzdHJ1Y3QgYnl0ZXNpbyB7CisgIFB5T2JqZWN0X0hFQUQKKyNpZiBQWV9NSU5PUl9WRVJTSU9OIDwgNQorICAgICAgY2hhciogYnVmOworI2Vsc2UKKyAgICAgIFB5T2JqZWN0KiBidWY7CisjZW5kaWYKKyAgUHlfc3NpemVfdCBwb3M7CisgIFB5X3NzaXplX3Qgc3RyaW5nX3NpemU7Cit9OworCitpbmxpbmUgaW50IHJlYWRfYnVmZmVyKFB5T2JqZWN0KiBidWYsIGNoYXIqKiBvdXRwdXQsIGludCBsZW4pIHsKKyAgYnl0ZXNpbyogYnVmMiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Ynl0ZXNpbyo+KGJ1Zik7CisjaWYgUFlfTUlOT1JfVkVSU0lPTiA8IDUKKyAgKm91dHB1dCA9IGJ1ZjItPmJ1ZiArIGJ1ZjItPnBvczsKKyNlbHNlCisgICpvdXRwdXQgPSBQeUJ5dGVzX0FTX1NUUklORyhidWYyLT5idWYpICsgYnVmMi0+cG9zOworI2VuZGlmCisgIFB5X3NzaXplX3QgcG9zMCA9IGJ1ZjItPnBvczsKKyAgYnVmMi0+cG9zID0gKHN0ZDo6bWluKShidWYyLT5wb3MgKyBzdGF0aWNfY2FzdDxQeV9zc2l6ZV90PihsZW4pLCBidWYyLT5zdHJpbmdfc2l6ZSk7CisgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGJ1ZjItPnBvcyAtIHBvczApOworfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KK2lubGluZSBQcm90b2NvbEJhc2U8SW1wbD46On5Qcm90b2NvbEJhc2UoKSB7CisgIGlmIChvdXRwdXRfKSB7CisgICAgZGVsZXRlIG91dHB1dF87CisgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEltcGw+CitpbmxpbmUgYm9vbCBQcm90b2NvbEJhc2U8SW1wbD46OmlzVXRmOChQeU9iamVjdCogdHlwZWFyZ3MpIHsKKyAgLy8gd2hpbGUgY29uZGl0aW9uIGZvciBweTIgaXMgImFyZyA9PSAnVVRGOCciLCBpdCBzaG91bGQgYmUgImFyZyAhPSAnQklOQVJZJyIgZm9yIHB5My4KKyAgLy8gSEFDSzogY2hlY2sgdGhlIGxlbmd0aCBhbmQgZG9uJ3QgYm90aGVyIHJlYWRpbmcgdGhlIHZhbHVlCisgIHJldHVybiAhUHlVbmljb2RlX0NoZWNrKHR5cGVhcmdzKSB8fCBQeVVuaWNvZGVfR0VUX0xFTkdUSCh0eXBlYXJncykgIT0gNjsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEltcGw+CitQeU9iamVjdCogUHJvdG9jb2xCYXNlPEltcGw+OjpnZXRFbmNvZGVkVmFsdWUoKSB7CisgIHJldHVybiBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKG91dHB1dF8tPmJ1Zi5kYXRhKCksIG91dHB1dF8tPmJ1Zi5zaXplKCkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KK2lubGluZSBib29sIFByb3RvY29sQmFzZTxJbXBsPjo6d3JpdGVCdWZmZXIoY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgc2l6ZV90IG5lZWQgPSBzaXplICsgb3V0cHV0Xy0+cG9zOworICBpZiAob3V0cHV0Xy0+YnVmLmNhcGFjaXR5KCkgPCBuZWVkKSB7CisgICAgdHJ5IHsKKyAgICAgIG91dHB1dF8tPmJ1Zi5yZXNlcnZlKG5lZWQpOworICAgIH0gY2F0Y2ggKHN0ZDo6YmFkX2FsbG9jJiBleCkgeworICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLCAiRmFpbGVkIHRvIGFsbG9jYXRlIHdyaXRlIGJ1ZmZlciIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorICBzdGQ6OmNvcHkoZGF0YSwgZGF0YSArIHNpemUsIHN0ZDo6YmFja19pbnNlcnRlcihvdXRwdXRfLT5idWYpKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKyNlbmRpZgorCituYW1lc3BhY2UgZGV0YWlsIHsKKworI2RlZmluZSBERUNMQVJFX09QX1NDT1BFKG5hbWUsIG9wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdHJ1Y3QgbmFtZSMjU2NvcGUgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEltcGwqIGltcGw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGJvb2wgdmFsaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG5hbWUjI1Njb3BlKEltcGwqIHRoaXopIDogaW1wbCh0aGl6KSwgdmFsaWQoaW1wbC0+b3AjI0JlZ2luKCkpIHt9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH5uYW1lIyNTY29wZSgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaWYgKHZhbGlkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbXBsLT5vcCMjRW5kKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG9wZXJhdG9yIGJvb2woKSB7IHJldHVybiB2YWxpZDsgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbCwgdGVtcGxhdGUgPHR5cGVuYW1lPiBjbGFzcyBUPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBuYW1lIyNTY29wZTxJbXBsPiBvcCMjU2NvcGUoVDxJbXBsPiogdGhpeikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBuYW1lIyNTY29wZTxJbXBsPihzdGF0aWNfY2FzdDxJbXBsKj4odGhpeikpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CitERUNMQVJFX09QX1NDT1BFKFdyaXRlU3RydWN0LCB3cml0ZVN0cnVjdCkKK0RFQ0xBUkVfT1BfU0NPUEUoUmVhZFN0cnVjdCwgcmVhZFN0cnVjdCkKKyN1bmRlZiBERUNMQVJFX09QX1NDT1BFCisKK2lubGluZSBib29sIGNoZWNrX3NzaXplX3RfMzIoUHlfc3NpemVfdCBsZW4pIHsKKyAgLy8gZXJyb3IgZnJvbSBnZXR0aW5nIHRoZSBpbnQKKyAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKGxlbikpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFDSEVDS19SQU5HRShsZW4sIDAsIChzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptYXgpKCkpKSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJzaXplIG91dCBvZiByYW5nZTogZXhjZWVkZWQgSU5UMzJfTUFYIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2Jvb2wgcGFyc2VfcHlpbnQoUHlPYmplY3QqIG8sIFQqIHJldCwgaW50MzJfdCBtaW4sIGludDMyX3QgbWF4KSB7CisgIGxvbmcgdmFsID0gUHlJbnRfQXNMb25nKG8pOworCisgIGlmIChJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRCh2YWwpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghQ0hFQ0tfUkFOR0UodmFsLCBtaW4sIG1heCkpIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgImludCBvdXQgb2YgcmFuZ2UiKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAqcmV0ID0gc3RhdGljX2Nhc3Q8VD4odmFsKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbXBsPgoraW5saW5lIGJvb2wgUHJvdG9jb2xCYXNlPEltcGw+OjpjaGVja1R5cGUoVFR5cGUgZ290LCBUVHlwZSBleHBlY3RlZCkgeworICBpZiAoZXhwZWN0ZWQgIT0gZ290KSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImdvdCB3cm9uZyB0dHlwZSB3aGlsZSByZWFkaW5nIGZpZWxkIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KK2Jvb2wgUHJvdG9jb2xCYXNlPEltcGw+OjpjaGVja0xlbmd0aExpbWl0KGludDMyX3QgbGVuLCBsb25nIGxpbWl0KSB7CisgIGlmIChsZW4gPCAwKSB7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX092ZXJmbG93RXJyb3IsICJuZWdhdGl2ZSBsZW5ndGg6ICVsZCIsIGxpbWl0KTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKGxlbiA+IGxpbWl0KSB7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX092ZXJmbG93RXJyb3IsICJzaXplIGV4Y2VlZGVkIHNwZWNpZmllZCBsaW1pdDogJWxkIiwgbGltaXQpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEltcGw+Citib29sIFByb3RvY29sQmFzZTxJbXBsPjo6cmVhZEJ5dGVzKGNoYXIqKiBvdXRwdXQsIGludCBsZW4pIHsKKyAgaWYgKGxlbiA8IDApIHsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwgImF0dGVtcHRlZCB0byByZWFkIG5lZ2F0aXZlIGxlbmd0aDogJWQiLCBsZW4pOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBUT0RPKGRyZWlzcyk6IERvbid0IGZlYXIgdGhlIG1hbGxvYy4gIFRoaW5rIGFib3V0IHRha2luZyBhIGNvcHkgb2YKKyAgLy8gICAgICAgICAgICAgICB0aGUgcGFydGlhbCByZWFkIGluc3RlYWQgb2YgZm9yY2luZyB0aGUgdHJhbnNwb3J0CisgIC8vICAgICAgICAgICAgICAgdG8gcHJlcGVuZCBpdCB0byBpdHMgYnVmZmVyLgorCisgIGludCBybGVuID0gZGV0YWlsOjpyZWFkX2J1ZmZlcihpbnB1dF8uc3RyaW5naW9idWYuZ2V0KCksIG91dHB1dCwgbGVuKTsKKworICBpZiAocmxlbiA9PSBsZW4pIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIGlmIChybGVuID09IC0xKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9IGVsc2UgeworICAgIC8vIHVzaW5nIGJ1aWxkaW5nIGZ1bmN0aW9ucyBhcyB0aGlzIGlzIGEgcmFyZSBjb2RlcGF0aAorICAgIFNjb3BlZFB5T2JqZWN0IG5ld2lvYnVmKFB5T2JqZWN0X0NhbGxGdW5jdGlvbihpbnB1dF8ucmVmaWxsX2NhbGxhYmxlLmdldCgpLCByZWZpbGxfc2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqb3V0cHV0LCBybGVuLCBsZW4sIE5VTEwpKTsKKyAgICBpZiAoIW5ld2lvYnVmKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gbXVzdCBkbyB0aGlzICpBRlRFUiogdGhlIGNhbGwgc28gdGhhdCB3ZSBkb24ndCBkZXJlZiB0aGUgaW8gYnVmZmVyCisgICAgaW5wdXRfLnN0cmluZ2lvYnVmLnJlc2V0KG5ld2lvYnVmLnJlbGVhc2UoKSk7CisKKyAgICBybGVuID0gZGV0YWlsOjpyZWFkX2J1ZmZlcihpbnB1dF8uc3RyaW5naW9idWYuZ2V0KCksIG91dHB1dCwgbGVuKTsKKworICAgIGlmIChybGVuID09IGxlbikgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmIChybGVuID09IC0xKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFRPRE8oZHJlaXNzKTogVGhpcyBjb3VsZCBiZSBhIHZhbGlkIGNvZGUgcGF0aCBmb3IgYmlnIGJpbmFyeSBibG9icy4KKyAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJyZWZpbGwgY2xhaW1lZCB0byBoYXZlIHJlZmlsbGVkIHRoZSBidWZmZXIsIGJ1dCBkaWRuJ3QhISIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KK2Jvb2wgUHJvdG9jb2xCYXNlPEltcGw+OjpwcmVwYXJlRGVjb2RlQnVmZmVyRnJvbVRyYW5zcG9ydChQeU9iamVjdCogdHJhbnMpIHsKKyAgaWYgKGlucHV0Xy5zdHJpbmdpb2J1ZikgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiZGVjb2RlIGJ1ZmZlciBpcyBhbHJlYWR5IGluaXRpYWxpemVkIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgU2NvcGVkUHlPYmplY3Qgc3RyaW5naW9idWYoUHlPYmplY3RfR2V0QXR0cih0cmFucywgSU5URVJOX1NUUklORyhjc3RyaW5naW9fYnVmKSkpOworICBpZiAoIXN0cmluZ2lvYnVmKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghZGV0YWlsOjppbnB1dF9jaGVjayhzdHJpbmdpb2J1Zi5nZXQoKSkpIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZXhwZWN0aW5nIHN0cmluZ2lvIGlucHV0XyIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIFNjb3BlZFB5T2JqZWN0IHJlZmlsbF9jYWxsYWJsZShQeU9iamVjdF9HZXRBdHRyKHRyYW5zLCBJTlRFUk5fU1RSSU5HKGNzdHJpbmdpb19yZWZpbGwpKSk7CisgIGlmICghcmVmaWxsX2NhbGxhYmxlKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghUHlDYWxsYWJsZV9DaGVjayhyZWZpbGxfY2FsbGFibGUuZ2V0KCkpKSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImV4cGVjdGluZyBjYWxsYWJsZSIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlucHV0Xy5zdHJpbmdpb2J1Zi5zd2FwKHN0cmluZ2lvYnVmKTsKKyAgaW5wdXRfLnJlZmlsbF9jYWxsYWJsZS5zd2FwKHJlZmlsbF9jYWxsYWJsZSk7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KK2Jvb2wgUHJvdG9jb2xCYXNlPEltcGw+OjpwcmVwYXJlRW5jb2RlQnVmZmVyKCkgeworICBvdXRwdXRfID0gZGV0YWlsOjpuZXdfZW5jb2RlX2J1ZmZlcihJTklUX09VVEJVRl9TSVpFKTsKKyAgcmV0dXJuIG91dHB1dF8gIT0gTlVMTDsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEltcGw+Citib29sIFByb3RvY29sQmFzZTxJbXBsPjo6ZW5jb2RlVmFsdWUoUHlPYmplY3QqIHZhbHVlLCBUVHlwZSB0eXBlLCBQeU9iamVjdCogdHlwZWFyZ3MpIHsKKyAgLyoKKyAgICogUmVmY291bnRpbmcgU3RyYXRlZ3k6CisgICAqCisgICAqIFdlIGFzc3VtZSB0aGF0IGVsZW1lbnRzIG9mIHRoZSB0aHJpZnRfc3BlYyB0dXBsZSBhcmUgbm90IGdvaW5nIHRvIGJlCisgICAqIG11dGF0ZWQsIHNvIHdlIGRvbid0IHJlZiBjb3VudCB0aG9zZSBhdCBhbGwuIE90aGVyIHRoYW4gdGhhdCwgd2UgdHJ5IHRvCisgICAqIGtlZXAgYSByZWZlcmVuY2UgdG8gYWxsIHRoZSB1c2VyLWNyZWF0ZWQgb2JqZWN0cyB3aGlsZSB3ZSB3b3JrIHdpdGggdGhlbS4KKyAgICogZW5jb2RlVmFsdWUgYXNzdW1lcyB0aGF0IGEgcmVmZXJlbmNlIGlzIGFscmVhZHkgaGVsZC4gVGhlICpjYWxsZXIqIGlzCisgICAqIHJlc3BvbnNpYmxlIGZvciBoYW5kbGluZyByZWZlcmVuY2VzCisgICAqLworCisgIHN3aXRjaCAodHlwZSkgeworCisgIGNhc2UgVF9CT09MOiB7CisgICAgaW50IHYgPSBQeU9iamVjdF9Jc1RydWUodmFsdWUpOworICAgIGlmICh2ID09IC0xKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGltcGwoKS0+d3JpdGVCb29sKHYpOworICAgIHJldHVybiB0cnVlOworICB9CisgIGNhc2UgVF9JMDg6IHsKKyAgICBpbnQ4X3QgdmFsOworCisgICAgaWYgKCFwYXJzZV9weWludCh2YWx1ZSwgJnZhbCwgKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50OF90Pjo6bWluKSgpLAorICAgICAgICAgICAgICAgICAgICAgKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50OF90Pjo6bWF4KSgpKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGltcGwoKS0+d3JpdGVJOCh2YWwpOworICAgIHJldHVybiB0cnVlOworICB9CisgIGNhc2UgVF9JMTY6IHsKKyAgICBpbnQxNl90IHZhbDsKKworICAgIGlmICghcGFyc2VfcHlpbnQodmFsdWUsICZ2YWwsIChzdGQ6Om51bWVyaWNfbGltaXRzPGludDE2X3Q+OjptaW4pKCksCisgICAgICAgICAgICAgICAgICAgICAoc3RkOjpudW1lcmljX2xpbWl0czxpbnQxNl90Pjo6bWF4KSgpKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGltcGwoKS0+d3JpdGVJMTYodmFsKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBjYXNlIFRfSTMyOiB7CisgICAgaW50MzJfdCB2YWw7CisKKyAgICBpZiAoIXBhcnNlX3B5aW50KHZhbHVlLCAmdmFsLCAoc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWluKSgpLAorICAgICAgICAgICAgICAgICAgICAgKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1heCkoKSkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbXBsKCktPndyaXRlSTMyKHZhbCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgY2FzZSBUX0k2NDogeworICAgIGludDY0X3QgbnZhbCA9IFB5TG9uZ19Bc0xvbmdMb25nKHZhbHVlKTsKKworICAgIGlmIChJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRChudmFsKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICghQ0hFQ0tfUkFOR0UobnZhbCwgKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1pbikoKSwKKyAgICAgICAgICAgICAgICAgICAgIChzdGQ6Om51bWVyaWNfbGltaXRzPGludDY0X3Q+OjptYXgpKCkpKSB7CisgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgImludCBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbXBsKCktPndyaXRlSTY0KG52YWwpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgY2FzZSBUX0RPVUJMRTogeworICAgIGRvdWJsZSBudmFsID0gUHlGbG9hdF9Bc0RvdWJsZSh2YWx1ZSk7CisgICAgaWYgKG52YWwgPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW1wbCgpLT53cml0ZURvdWJsZShudmFsKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGNhc2UgVF9TVFJJTkc6IHsKKyAgICBTY29wZWRQeU9iamVjdCBudmFsOworCisgICAgaWYgKFB5VW5pY29kZV9DaGVjayh2YWx1ZSkpIHsKKyAgICAgIG52YWwucmVzZXQoUHlVbmljb2RlX0FzVVRGOFN0cmluZyh2YWx1ZSkpOworICAgICAgaWYgKCFudmFsKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICAgIG52YWwucmVzZXQodmFsdWUpOworICAgIH0KKworICAgIFB5X3NzaXplX3QgbGVuID0gUHlCeXRlc19TaXplKG52YWwuZ2V0KCkpOworICAgIGlmICghZGV0YWlsOjpjaGVja19zc2l6ZV90XzMyKGxlbikpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbXBsKCktPndyaXRlU3RyaW5nKG52YWwuZ2V0KCksIHN0YXRpY19jYXN0PGludDMyX3Q+KGxlbikpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgY2FzZSBUX0xJU1Q6CisgIGNhc2UgVF9TRVQ6IHsKKyAgICBTZXRMaXN0VHlwZUFyZ3MgcGFyc2VkYXJnczsKKyAgICBpZiAoIXBhcnNlX3NldF9saXN0X2FyZ3MoJnBhcnNlZGFyZ3MsIHR5cGVhcmdzKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFB5X3NzaXplX3QgbGVuID0gUHlPYmplY3RfTGVuZ3RoKHZhbHVlKTsKKyAgICBpZiAoIWRldGFpbDo6Y2hlY2tfc3NpemVfdF8zMihsZW4pKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFpbXBsKCktPndyaXRlTGlzdEJlZ2luKHZhbHVlLCBwYXJzZWRhcmdzLCBzdGF0aWNfY2FzdDxpbnQzMl90PihsZW4pKSB8fCBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIFNjb3BlZFB5T2JqZWN0IGl0ZXJhdG9yKFB5T2JqZWN0X0dldEl0ZXIodmFsdWUpKTsKKyAgICBpZiAoIWl0ZXJhdG9yKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgd2hpbGUgKFB5T2JqZWN0KiByYXdJdGVtID0gUHlJdGVyX05leHQoaXRlcmF0b3IuZ2V0KCkpKSB7CisgICAgICBTY29wZWRQeU9iamVjdCBpdGVtKHJhd0l0ZW0pOworICAgICAgaWYgKCFlbmNvZGVWYWx1ZShpdGVtLmdldCgpLCBwYXJzZWRhcmdzLmVsZW1lbnRfdHlwZSwgcGFyc2VkYXJncy50eXBlYXJncykpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgY2FzZSBUX01BUDogeworICAgIFB5X3NzaXplX3QgbGVuID0gUHlEaWN0X1NpemUodmFsdWUpOworICAgIGlmICghZGV0YWlsOjpjaGVja19zc2l6ZV90XzMyKGxlbikpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBNYXBUeXBlQXJncyBwYXJzZWRhcmdzOworICAgIGlmICghcGFyc2VfbWFwX2FyZ3MoJnBhcnNlZGFyZ3MsIHR5cGVhcmdzKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICghaW1wbCgpLT53cml0ZU1hcEJlZ2luKHZhbHVlLCBwYXJzZWRhcmdzLCBzdGF0aWNfY2FzdDxpbnQzMl90PihsZW4pKSB8fCBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIFB5X3NzaXplX3QgcG9zID0gMDsKKyAgICBQeU9iamVjdCogayA9IE5VTEw7CisgICAgUHlPYmplY3QqIHYgPSBOVUxMOworICAgIC8vIFRPRE8oYm1hdXJlcik6IHNob3VsZCBzdXBwb3J0IGFueSBtYXBwaW5nLCBub3QganVzdCBkaWN0cworICAgIHdoaWxlIChQeURpY3RfTmV4dCh2YWx1ZSwgJnBvcywgJmssICZ2KSkgeworICAgICAgaWYgKCFlbmNvZGVWYWx1ZShrLCBwYXJzZWRhcmdzLmt0YWcsIHBhcnNlZGFyZ3Mua3R5cGVhcmdzKQorICAgICAgICAgIHx8ICFlbmNvZGVWYWx1ZSh2LCBwYXJzZWRhcmdzLnZ0YWcsIHBhcnNlZGFyZ3MudnR5cGVhcmdzKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgY2FzZSBUX1NUUlVDVDogeworICAgIFN0cnVjdFR5cGVBcmdzIHBhcnNlZGFyZ3M7CisgICAgaWYgKCFwYXJzZV9zdHJ1Y3RfYXJncygmcGFyc2VkYXJncywgdHlwZWFyZ3MpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgUHlfc3NpemVfdCBuc3BlYyA9IFB5VHVwbGVfU2l6ZShwYXJzZWRhcmdzLnNwZWMpOworICAgIGlmIChuc3BlYyA9PSAtMSkgeworICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgInNwZWMgaXMgbm90IGEgdHVwbGUiKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBkZXRhaWw6OldyaXRlU3RydWN0U2NvcGU8SW1wbD4gc2NvcGUgPSBkZXRhaWw6OndyaXRlU3RydWN0U2NvcGUodGhpcyk7CisgICAgaWYgKCFzY29wZSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBmb3IgKFB5X3NzaXplX3QgaSA9IDA7IGkgPCBuc3BlYzsgaSsrKSB7CisgICAgICBQeU9iamVjdCogc3BlY190dXBsZSA9IFB5VHVwbGVfR0VUX0lURU0ocGFyc2VkYXJncy5zcGVjLCBpKTsKKyAgICAgIGlmIChzcGVjX3R1cGxlID09IFB5X05vbmUpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIFN0cnVjdEl0ZW1TcGVjIHBhcnNlZHNwZWM7CisgICAgICBpZiAoIXBhcnNlX3N0cnVjdF9pdGVtX3NwZWMoJnBhcnNlZHNwZWMsIHNwZWNfdHVwbGUpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgU2NvcGVkUHlPYmplY3QgaW5zdHZhbChQeU9iamVjdF9HZXRBdHRyKHZhbHVlLCBwYXJzZWRzcGVjLmF0dHJuYW1lKSk7CisKKyAgICAgIGlmICghaW5zdHZhbCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIGlmIChpbnN0dmFsLmdldCgpID09IFB5X05vbmUpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGJvb2wgcmVzID0gaW1wbCgpLT53cml0ZUZpZWxkKGluc3R2YWwuZ2V0KCksIHBhcnNlZHNwZWMpOworICAgICAgaWYgKCFyZXMpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICBpbXBsKCktPndyaXRlRmllbGRTdG9wKCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBjYXNlIFRfU1RPUDoKKyAgY2FzZSBUX1ZPSUQ6CisgIGNhc2UgVF9VVEYxNjoKKyAgY2FzZSBUX1VURjg6CisgIGNhc2UgVF9VNjQ6CisgIGRlZmF1bHQ6CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgIlVuZXhwZWN0ZWQgVFR5cGUgZm9yIGVuY29kZVZhbHVlOiAlZCIsIHR5cGUpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KK2Jvb2wgUHJvdG9jb2xCYXNlPEltcGw+Ojpza2lwKFRUeXBlIHR5cGUpIHsKKyAgc3dpdGNoICh0eXBlKSB7CisgIGNhc2UgVF9CT09MOgorICAgIHJldHVybiBpbXBsKCktPnNraXBCb29sKCk7CisgIGNhc2UgVF9JMDg6CisgICAgcmV0dXJuIGltcGwoKS0+c2tpcEJ5dGUoKTsKKyAgY2FzZSBUX0kxNjoKKyAgICByZXR1cm4gaW1wbCgpLT5za2lwSTE2KCk7CisgIGNhc2UgVF9JMzI6CisgICAgcmV0dXJuIGltcGwoKS0+c2tpcEkzMigpOworICBjYXNlIFRfSTY0OgorICAgIHJldHVybiBpbXBsKCktPnNraXBJNjQoKTsKKyAgY2FzZSBUX0RPVUJMRToKKyAgICByZXR1cm4gaW1wbCgpLT5za2lwRG91YmxlKCk7CisKKyAgY2FzZSBUX1NUUklORzogeworICAgIHJldHVybiBpbXBsKCktPnNraXBTdHJpbmcoKTsKKyAgfQorCisgIGNhc2UgVF9MSVNUOgorICBjYXNlIFRfU0VUOiB7CisgICAgVFR5cGUgZXR5cGUgPSBUX1NUT1A7CisgICAgaW50MzJfdCBsZW4gPSBpbXBsKCktPnJlYWRMaXN0QmVnaW4oZXR5cGUpOworICAgIGlmIChsZW4gPCAwKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICBpZiAoIXNraXAoZXR5cGUpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBjYXNlIFRfTUFQOiB7CisgICAgVFR5cGUga3R5cGUgPSBUX1NUT1A7CisgICAgVFR5cGUgdnR5cGUgPSBUX1NUT1A7CisgICAgaW50MzJfdCBsZW4gPSBpbXBsKCktPnJlYWRNYXBCZWdpbihrdHlwZSwgdnR5cGUpOworICAgIGlmIChsZW4gPCAwKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICBpZiAoIXNraXAoa3R5cGUpIHx8ICFza2lwKHZ0eXBlKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgY2FzZSBUX1NUUlVDVDogeworICAgIGRldGFpbDo6UmVhZFN0cnVjdFNjb3BlPEltcGw+IHNjb3BlID0gZGV0YWlsOjpyZWFkU3RydWN0U2NvcGUodGhpcyk7CisgICAgaWYgKCFzY29wZSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgVFR5cGUgdHlwZSA9IFRfU1RPUDsKKyAgICAgIGludDE2X3QgdGFnOworICAgICAgaWYgKCFpbXBsKCktPnJlYWRGaWVsZEJlZ2luKHR5cGUsIHRhZykpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgaWYgKHR5cGUgPT0gVF9TVE9QKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgICAgaWYgKCFza2lwKHR5cGUpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBjYXNlIFRfU1RPUDoKKyAgY2FzZSBUX1ZPSUQ6CisgIGNhc2UgVF9VVEYxNjoKKyAgY2FzZSBUX1VURjg6CisgIGNhc2UgVF9VNjQ6CisgIGRlZmF1bHQ6CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgIlVuZXhwZWN0ZWQgVFR5cGUgZm9yIHNraXA6ICVkIiwgdHlwZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFJldHVybnMgYSBuZXcgcmVmZXJlbmNlLgordGVtcGxhdGUgPHR5cGVuYW1lIEltcGw+CitQeU9iamVjdCogUHJvdG9jb2xCYXNlPEltcGw+OjpkZWNvZGVWYWx1ZShUVHlwZSB0eXBlLCBQeU9iamVjdCogdHlwZWFyZ3MpIHsKKyAgc3dpdGNoICh0eXBlKSB7CisKKyAgY2FzZSBUX0JPT0w6IHsKKyAgICBib29sIHYgPSAwOworICAgIGlmICghaW1wbCgpLT5yZWFkQm9vbCh2KSkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICh2KSB7CisgICAgICBQeV9SRVRVUk5fVFJVRTsKKyAgICB9IGVsc2UgeworICAgICAgUHlfUkVUVVJOX0ZBTFNFOworICAgIH0KKyAgfQorICBjYXNlIFRfSTA4OiB7CisgICAgaW50OF90IHYgPSAwOworICAgIGlmICghaW1wbCgpLT5yZWFkSTgodikpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcodik7CisgIH0KKyAgY2FzZSBUX0kxNjogeworICAgIGludDE2X3QgdiA9IDA7CisgICAgaWYgKCFpbXBsKCktPnJlYWRJMTYodikpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcodik7CisgIH0KKyAgY2FzZSBUX0kzMjogeworICAgIGludDMyX3QgdiA9IDA7CisgICAgaWYgKCFpbXBsKCktPnJlYWRJMzIodikpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcodik7CisgIH0KKworICBjYXNlIFRfSTY0OiB7CisgICAgaW50NjRfdCB2ID0gMDsKKyAgICBpZiAoIWltcGwoKS0+cmVhZEk2NCh2KSkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIC8vIFRPRE8oZHJlaXNzKTogRmluZCBvdXQgaWYgd2UgY2FuIHRha2UgdGhpcyBmYXN0cGF0aCBhbHdheXMgd2hlbgorICAgIC8vICAgICAgICAgICAgICAgc2l6ZW9mKGxvbmcpID09IHNpemVvZihsb25nIGxvbmcpLgorICAgIGlmIChDSEVDS19SQU5HRSh2LCBMT05HX01JTiwgTE9OR19NQVgpKSB7CisgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpdik7CisgICAgfQorICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKHYpOworICB9CisKKyAgY2FzZSBUX0RPVUJMRTogeworICAgIGRvdWJsZSB2ID0gMC4wOworICAgIGlmICghaW1wbCgpLT5yZWFkRG91YmxlKHYpKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSh2KTsKKyAgfQorCisgIGNhc2UgVF9TVFJJTkc6IHsKKyAgICBjaGFyKiBidWYgPSBOVUxMOworICAgIGludCBsZW4gPSBpbXBsKCktPnJlYWRTdHJpbmcoJmJ1Zik7CisgICAgaWYgKGxlbiA8IDApIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoaXNVdGY4KHR5cGVhcmdzKSkgeworICAgICAgcmV0dXJuIFB5VW5pY29kZV9EZWNvZGVVVEY4KGJ1ZiwgbGVuLCAwKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoYnVmLCBsZW4pOworICAgIH0KKyAgfQorCisgIGNhc2UgVF9MSVNUOgorICBjYXNlIFRfU0VUOiB7CisgICAgU2V0TGlzdFR5cGVBcmdzIHBhcnNlZGFyZ3M7CisgICAgaWYgKCFwYXJzZV9zZXRfbGlzdF9hcmdzKCZwYXJzZWRhcmdzLCB0eXBlYXJncykpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIFRUeXBlIGV0eXBlID0gVF9TVE9QOworICAgIGludDMyX3QgbGVuID0gaW1wbCgpLT5yZWFkTGlzdEJlZ2luKGV0eXBlKTsKKyAgICBpZiAobGVuIDwgMCkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChsZW4gPiAwICYmICFjaGVja1R5cGUoZXR5cGUsIHBhcnNlZGFyZ3MuZWxlbWVudF90eXBlKSkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgYm9vbCB1c2VfdHVwbGUgPSB0eXBlID09IFRfTElTVCAmJiBwYXJzZWRhcmdzLmltbXV0YWJsZTsKKyAgICBTY29wZWRQeU9iamVjdCByZXQodXNlX3R1cGxlID8gUHlUdXBsZV9OZXcobGVuKSA6IFB5TGlzdF9OZXcobGVuKSk7CisgICAgaWYgKCFyZXQpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgIFB5T2JqZWN0KiBpdGVtID0gZGVjb2RlVmFsdWUoZXR5cGUsIHBhcnNlZGFyZ3MudHlwZWFyZ3MpOworICAgICAgaWYgKCFpdGVtKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorICAgICAgaWYgKHVzZV90dXBsZSkgeworICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHJldC5nZXQoKSwgaSwgaXRlbSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBQeUxpc3RfU0VUX0lURU0ocmV0LmdldCgpLCBpLCBpdGVtKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUT0RPKGRyZWlzcyk6IENvbnNpZGVyIGJpdGluZyB0aGUgYnVsbGV0IGFuZCBtYWtpbmcgdHdvIHNlcGFyYXRlIGNhc2VzCisgICAgLy8gICAgICAgICAgICAgICBmb3IgbGlzdCBhbmQgc2V0LCBhdm9pZGluZyB0aGlzIHBvc3QgZmFjdG8gY29udmVyc2lvbi4KKyAgICBpZiAodHlwZSA9PSBUX1NFVCkgeworICAgICAgUHlPYmplY3QqIHNldHJldDsKKyAgICAgIHNldHJldCA9IHBhcnNlZGFyZ3MuaW1tdXRhYmxlID8gUHlGcm96ZW5TZXRfTmV3KHJldC5nZXQoKSkgOiBQeVNldF9OZXcocmV0LmdldCgpKTsKKyAgICAgIHJldHVybiBzZXRyZXQ7CisgICAgfQorICAgIHJldHVybiByZXQucmVsZWFzZSgpOworICB9CisKKyAgY2FzZSBUX01BUDogeworICAgIE1hcFR5cGVBcmdzIHBhcnNlZGFyZ3M7CisgICAgaWYgKCFwYXJzZV9tYXBfYXJncygmcGFyc2VkYXJncywgdHlwZWFyZ3MpKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBUVHlwZSBrdHlwZSA9IFRfU1RPUDsKKyAgICBUVHlwZSB2dHlwZSA9IFRfU1RPUDsKKyAgICB1aW50MzJfdCBsZW4gPSBpbXBsKCktPnJlYWRNYXBCZWdpbihrdHlwZSwgdnR5cGUpOworICAgIGlmIChsZW4gPiAwICYmICghY2hlY2tUeXBlKGt0eXBlLCBwYXJzZWRhcmdzLmt0YWcpIHx8ICFjaGVja1R5cGUodnR5cGUsIHBhcnNlZGFyZ3MudnRhZykpKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBTY29wZWRQeU9iamVjdCByZXQoUHlEaWN0X05ldygpKTsKKyAgICBpZiAoIXJldCkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICBTY29wZWRQeU9iamVjdCBrKGRlY29kZVZhbHVlKGt0eXBlLCBwYXJzZWRhcmdzLmt0eXBlYXJncykpOworICAgICAgaWYgKCFrKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorICAgICAgU2NvcGVkUHlPYmplY3QgdihkZWNvZGVWYWx1ZSh2dHlwZSwgcGFyc2VkYXJncy52dHlwZWFyZ3MpKTsKKyAgICAgIGlmICghdikgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgICAgIGlmIChQeURpY3RfU2V0SXRlbShyZXQuZ2V0KCksIGsuZ2V0KCksIHYuZ2V0KCkpID09IC0xKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorICAgIH0KKworICAgIGlmIChwYXJzZWRhcmdzLmltbXV0YWJsZSkgeworICAgICAgaWYgKCFUaHJpZnRNb2R1bGUpIHsKKyAgICAgICAgVGhyaWZ0TW9kdWxlID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlKCJ0aHJpZnQuVGhyaWZ0Iik7CisgICAgICB9CisgICAgICBpZiAoIVRocmlmdE1vZHVsZSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKworICAgICAgU2NvcGVkUHlPYmplY3QgY2xzKFB5T2JqZWN0X0dldEF0dHIoVGhyaWZ0TW9kdWxlLCBJTlRFUk5fU1RSSU5HKFRGcm96ZW5EaWN0KSkpOworICAgICAgaWYgKCFjbHMpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisKKyAgICAgIFNjb3BlZFB5T2JqZWN0IGFyZyhQeVR1cGxlX05ldygxKSk7CisgICAgICBQeVR1cGxlX1NFVF9JVEVNKGFyZy5nZXQoKSwgMCwgcmV0LnJlbGVhc2UoKSk7CisgICAgICByZXQucmVzZXQoUHlPYmplY3RfQ2FsbE9iamVjdChjbHMuZ2V0KCksIGFyZy5nZXQoKSkpOworICAgIH0KKworICAgIHJldHVybiByZXQucmVsZWFzZSgpOworICB9CisKKyAgY2FzZSBUX1NUUlVDVDogeworICAgIFN0cnVjdFR5cGVBcmdzIHBhcnNlZGFyZ3M7CisgICAgaWYgKCFwYXJzZV9zdHJ1Y3RfYXJncygmcGFyc2VkYXJncywgdHlwZWFyZ3MpKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHJlYWRTdHJ1Y3QoUHlfTm9uZSwgcGFyc2VkYXJncy5rbGFzcywgcGFyc2VkYXJncy5zcGVjKTsKKyAgfQorCisgIGNhc2UgVF9TVE9QOgorICBjYXNlIFRfVk9JRDoKKyAgY2FzZSBUX1VURjE2OgorICBjYXNlIFRfVVRGODoKKyAgY2FzZSBUX1U2NDoKKyAgZGVmYXVsdDoKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiVW5leHBlY3RlZCBUVHlwZSBmb3IgZGVjb2RlVmFsdWU6ICVkIiwgdHlwZSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEltcGw+CitQeU9iamVjdCogUHJvdG9jb2xCYXNlPEltcGw+OjpyZWFkU3RydWN0KFB5T2JqZWN0KiBvdXRwdXQsIFB5T2JqZWN0KiBrbGFzcywgUHlPYmplY3QqIHNwZWNfc2VxKSB7CisgIGludCBzcGVjX3NlcV9sZW4gPSBQeVR1cGxlX1NpemUoc3BlY19zZXEpOworICBib29sIGltbXV0YWJsZSA9IG91dHB1dCA9PSBQeV9Ob25lOworICBTY29wZWRQeU9iamVjdCBrd2FyZ3M7CisgIGlmIChzcGVjX3NlcV9sZW4gPT0gLTEpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGlmIChpbW11dGFibGUpIHsKKyAgICBrd2FyZ3MucmVzZXQoUHlEaWN0X05ldygpKTsKKyAgICBpZiAoIWt3YXJncykgeworICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImZhaWxlZCB0byBwcmVwYXJlIGt3YXJndW1lbnQgc3RvcmFnZSIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICB9CisKKyAgZGV0YWlsOjpSZWFkU3RydWN0U2NvcGU8SW1wbD4gc2NvcGUgPSBkZXRhaWw6OnJlYWRTdHJ1Y3RTY29wZSh0aGlzKTsKKyAgaWYgKCFzY29wZSkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIHdoaWxlICh0cnVlKSB7CisgICAgVFR5cGUgdHlwZSA9IFRfU1RPUDsKKyAgICBpbnQxNl90IHRhZzsKKyAgICBpZiAoIWltcGwoKS0+cmVhZEZpZWxkQmVnaW4odHlwZSwgdGFnKSkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICh0eXBlID09IFRfU1RPUCkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICh0YWcgPCAwIHx8IHRhZyA+PSBzcGVjX3NlcV9sZW4pIHsKKyAgICAgIGlmICghc2tpcCh0eXBlKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiRXJyb3Igd2hpbGUgc2tpcHBpbmcgdW5rbm93biBmaWVsZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIFB5T2JqZWN0KiBpdGVtX3NwZWMgPSBQeVR1cGxlX0dFVF9JVEVNKHNwZWNfc2VxLCB0YWcpOworICAgIGlmIChpdGVtX3NwZWMgPT0gUHlfTm9uZSkgeworICAgICAgaWYgKCFza2lwKHR5cGUpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJFcnJvciB3aGlsZSBza2lwcGluZyB1bmtub3duIGZpZWxkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorICAgICAgY29udGludWU7CisgICAgfQorICAgIFN0cnVjdEl0ZW1TcGVjIHBhcnNlZHNwZWM7CisgICAgaWYgKCFwYXJzZV9zdHJ1Y3RfaXRlbV9zcGVjKCZwYXJzZWRzcGVjLCBpdGVtX3NwZWMpKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKHBhcnNlZHNwZWMudHlwZSAhPSB0eXBlKSB7CisgICAgICBpZiAoIXNraXAodHlwZSkpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgInN0cnVjdCBmaWVsZCBoYWQgd3JvbmcgdHlwZTogZXhwZWN0ZWQgJWQgYnV0IGdvdCAlZCIsCisgICAgICAgICAgICAgICAgICAgICBwYXJzZWRzcGVjLnR5cGUsIHR5cGUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIFNjb3BlZFB5T2JqZWN0IGZpZWxkdmFsKGRlY29kZVZhbHVlKHBhcnNlZHNwZWMudHlwZSwgcGFyc2Vkc3BlYy50eXBlYXJncykpOworICAgIGlmICghZmllbGR2YWwpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmICgoaW1tdXRhYmxlICYmIFB5RGljdF9TZXRJdGVtKGt3YXJncy5nZXQoKSwgcGFyc2Vkc3BlYy5hdHRybmFtZSwgZmllbGR2YWwuZ2V0KCkpID09IC0xKQorICAgICAgICB8fCAoIWltbXV0YWJsZSAmJiBQeU9iamVjdF9TZXRBdHRyKG91dHB1dCwgcGFyc2Vkc3BlYy5hdHRybmFtZSwgZmllbGR2YWwuZ2V0KCkpID09IC0xKSkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICB9CisgIGlmIChpbW11dGFibGUpIHsKKyAgICBTY29wZWRQeU9iamVjdCBhcmdzKFB5VHVwbGVfTmV3KDApKTsKKyAgICBpZiAoIWFyZ3MpIHsKKyAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJmYWlsZWQgdG8gcHJlcGFyZSBhcmd1bWVudCBzdG9yYWdlIik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5T2JqZWN0X0NhbGwoa2xhc3MsIGFyZ3MuZ2V0KCksIGt3YXJncy5nZXQoKSk7CisgIH0KKyAgUHlfSU5DUkVGKG91dHB1dCk7CisgIHJldHVybiBvdXRwdXQ7Cit9Cit9Cit9Cit9CisjZW5kaWYgLy8gVEhSSUZUX1BZX1BST1RPQ09MX0gKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvZXh0L3R5cGVzLmNwcCBiL2xpYi9weS9zcmMvZXh0L3R5cGVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODQ0M2ZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5L3NyYy9leHQvdHlwZXMuY3BwCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJleHQvdHlwZXMuaCIKKyNpbmNsdWRlICJleHQvcHJvdG9jb2wuaCIKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBweSB7CisKK1B5T2JqZWN0KiBUaHJpZnRNb2R1bGUgPSBOVUxMOworCisjaWYgUFlfTUFKT1JfVkVSU0lPTiA8IDMKK2NoYXIgcmVmaWxsX3NpZ25hdHVyZVtdID0geydzJywgJyMnLCAnaSd9OworI2Vsc2UKK2NvbnN0IGNoYXIqIHJlZmlsbF9zaWduYXR1cmUgPSAieSNpIjsKKyNlbmRpZgorCitib29sIHBhcnNlX3N0cnVjdF9pdGVtX3NwZWMoU3RydWN0SXRlbVNwZWMqIGRlc3QsIFB5T2JqZWN0KiBzcGVjX3R1cGxlKSB7CisgIC8vIGknZCBsaWtlIHRvIHVzZSBQYXJzZUFyZ3MgaGVyZSwgYnV0IGl0IHNlZW1zIHRvIGJlIGEgYm90dGxlbmVjay4KKyAgaWYgKFB5VHVwbGVfU2l6ZShzcGVjX3R1cGxlKSAhPSA1KSB7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgImV4cGVjdGluZyA1IGFyZ3VtZW50cyBmb3Igc3BlYyB0dXBsZSBidXQgZ290ICVkIiwKKyAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihQeVR1cGxlX1NpemUoc3BlY190dXBsZSkpKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBkZXN0LT50YWcgPSBzdGF0aWNfY2FzdDxUVHlwZT4oUHlJbnRfQXNMb25nKFB5VHVwbGVfR0VUX0lURU0oc3BlY190dXBsZSwgMCkpKTsKKyAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKGRlc3QtPnRhZykpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBkZXN0LT50eXBlID0gc3RhdGljX2Nhc3Q8VFR5cGU+KFB5SW50X0FzTG9uZyhQeVR1cGxlX0dFVF9JVEVNKHNwZWNfdHVwbGUsIDEpKSk7CisgIGlmIChJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRChkZXN0LT50eXBlKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGRlc3QtPmF0dHJuYW1lID0gUHlUdXBsZV9HRVRfSVRFTShzcGVjX3R1cGxlLCAyKTsKKyAgZGVzdC0+dHlwZWFyZ3MgPSBQeVR1cGxlX0dFVF9JVEVNKHNwZWNfdHVwbGUsIDMpOworICBkZXN0LT5kZWZ2YWwgPSBQeVR1cGxlX0dFVF9JVEVNKHNwZWNfdHVwbGUsIDQpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBwYXJzZV9zZXRfbGlzdF9hcmdzKFNldExpc3RUeXBlQXJncyogZGVzdCwgUHlPYmplY3QqIHR5cGVhcmdzKSB7CisgIGlmIChQeVR1cGxlX1NpemUodHlwZWFyZ3MpICE9IDMpIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZXhwZWN0aW5nIHR1cGxlIG9mIHNpemUgMyBmb3IgbGlzdC9zZXQgdHlwZSBhcmdzIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZGVzdC0+ZWxlbWVudF90eXBlID0gc3RhdGljX2Nhc3Q8VFR5cGU+KFB5SW50X0FzTG9uZyhQeVR1cGxlX0dFVF9JVEVNKHR5cGVhcmdzLCAwKSkpOworICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQoZGVzdC0+ZWxlbWVudF90eXBlKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGRlc3QtPnR5cGVhcmdzID0gUHlUdXBsZV9HRVRfSVRFTSh0eXBlYXJncywgMSk7CisKKyAgZGVzdC0+aW1tdXRhYmxlID0gUHlfVHJ1ZSA9PSBQeVR1cGxlX0dFVF9JVEVNKHR5cGVhcmdzLCAyKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBwYXJzZV9tYXBfYXJncyhNYXBUeXBlQXJncyogZGVzdCwgUHlPYmplY3QqIHR5cGVhcmdzKSB7CisgIGlmIChQeVR1cGxlX1NpemUodHlwZWFyZ3MpICE9IDUpIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZXhwZWN0aW5nIDUgYXJndW1lbnRzIGZvciB0eXBlYXJncyB0byBtYXAiKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBkZXN0LT5rdGFnID0gc3RhdGljX2Nhc3Q8VFR5cGU+KFB5SW50X0FzTG9uZyhQeVR1cGxlX0dFVF9JVEVNKHR5cGVhcmdzLCAwKSkpOworICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQoZGVzdC0+a3RhZykpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBkZXN0LT52dGFnID0gc3RhdGljX2Nhc3Q8VFR5cGU+KFB5SW50X0FzTG9uZyhQeVR1cGxlX0dFVF9JVEVNKHR5cGVhcmdzLCAyKSkpOworICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQoZGVzdC0+dnRhZykpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBkZXN0LT5rdHlwZWFyZ3MgPSBQeVR1cGxlX0dFVF9JVEVNKHR5cGVhcmdzLCAxKTsKKyAgZGVzdC0+dnR5cGVhcmdzID0gUHlUdXBsZV9HRVRfSVRFTSh0eXBlYXJncywgMyk7CisgIGRlc3QtPmltbXV0YWJsZSA9IFB5X1RydWUgPT0gUHlUdXBsZV9HRVRfSVRFTSh0eXBlYXJncywgNCk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgcGFyc2Vfc3RydWN0X2FyZ3MoU3RydWN0VHlwZUFyZ3MqIGRlc3QsIFB5T2JqZWN0KiB0eXBlYXJncykgeworICBpZiAoUHlMaXN0X1NpemUodHlwZWFyZ3MpICE9IDIpIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZXhwZWN0aW5nIGxpc3Qgb2Ygc2l6ZSAyIGZvciBzdHJ1Y3QgYXJncyIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGRlc3QtPmtsYXNzID0gUHlMaXN0X0dFVF9JVEVNKHR5cGVhcmdzLCAwKTsKKyAgZGVzdC0+c3BlYyA9IFB5TGlzdF9HRVRfSVRFTSh0eXBlYXJncywgMSk7CisKKyAgcmV0dXJuIHRydWU7Cit9Cit9Cit9Cit9CmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL2V4dC90eXBlcy5oIGIvbGliL3B5L3NyYy9leHQvdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2Q4ZGRhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5L3NyYy9leHQvdHlwZXMuaApAQCAtMCwwICsxLDE5MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRIUklGVF9QWV9UWVBFU19ICisjZGVmaW5lIFRIUklGVF9QWV9UWVBFU19ICisKKyNpbmNsdWRlIDxQeXRob24uaD4KKworI2lmZGVmIF9NU0NfVkVSCisjZGVmaW5lIF9fU1REQ19GT1JNQVRfTUFDUk9TCisjZGVmaW5lIF9fU1REQ19MSU1JVF9NQUNST1MKKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaWYgUFlfTUFKT1JfVkVSU0lPTiA+PSAzCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKy8vIFRPRE86IGJldHRlciBtYWNyb3MKKyNkZWZpbmUgUHlJbnRfQXNMb25nKHYpIFB5TG9uZ19Bc0xvbmcodikKKyNkZWZpbmUgUHlJbnRfRnJvbUxvbmcodikgUHlMb25nX0Zyb21Mb25nKHYpCisKKyNkZWZpbmUgUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZyh2KSBQeVVuaWNvZGVfSW50ZXJuRnJvbVN0cmluZyh2KQorCisjZW5kaWYKKworI2RlZmluZSBJTlRFUk5fU1RSSU5HKHZhbHVlKSBfaW50ZXJuXyMjdmFsdWUKKworI2RlZmluZSBJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRCh2KSAoKCh2KSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKworZXh0ZXJuICJDIiB7CitleHRlcm4gUHlPYmplY3QqIElOVEVSTl9TVFJJTkcoVEZyb3plbkRpY3QpOworZXh0ZXJuIFB5T2JqZWN0KiBJTlRFUk5fU1RSSU5HKGNzdHJpbmdpb19idWYpOworZXh0ZXJuIFB5T2JqZWN0KiBJTlRFUk5fU1RSSU5HKGNzdHJpbmdpb19yZWZpbGwpOworfQorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHB5IHsKKworZXh0ZXJuIFB5T2JqZWN0KiBUaHJpZnRNb2R1bGU7CisKKy8vIFN0b2xlbiBvdXQgb2YgVFByb3RvY29sLmguCisvLyBJdCB3b3VsZCBiZSBhIGh1Z2UgcGFpbiB0byBoYXZlIGJvdGggZ2V0IHRoaXMgZnJvbSBvbmUgcGxhY2UuCitlbnVtIFRUeXBlIHsKKyAgVF9JTlZBTElEID0gLTEsCisgIFRfU1RPUCA9IDAsCisgIFRfVk9JRCA9IDEsCisgIFRfQk9PTCA9IDIsCisgIFRfQllURSA9IDMsCisgIFRfSTA4ID0gMywKKyAgVF9JMTYgPSA2LAorICBUX0kzMiA9IDgsCisgIFRfVTY0ID0gOSwKKyAgVF9JNjQgPSAxMCwKKyAgVF9ET1VCTEUgPSA0LAorICBUX1NUUklORyA9IDExLAorICBUX1VURjcgPSAxMSwKKyAgVF9TVFJVQ1QgPSAxMiwKKyAgVF9NQVAgPSAxMywKKyAgVF9TRVQgPSAxNCwKKyAgVF9MSVNUID0gMTUsCisgIFRfVVRGOCA9IDE2LAorICBUX1VURjE2ID0gMTcKK307CisKKy8vIHJlcGxhY2Ugd2l0aCB1bmlxdWVfcHRyIHdoZW4gd2UncmUgT0sgd2l0aCBDKysxMQorY2xhc3MgU2NvcGVkUHlPYmplY3QgeworcHVibGljOgorICBTY29wZWRQeU9iamVjdCgpIDogb2JqXyhOVUxMKSB7fQorICBleHBsaWNpdCBTY29wZWRQeU9iamVjdChQeU9iamVjdCogcHlfb2JqZWN0KSA6IG9ial8ocHlfb2JqZWN0KSB7fQorICB+U2NvcGVkUHlPYmplY3QoKSB7CisgICAgaWYgKG9ial8pCisgICAgICBQeV9ERUNSRUYob2JqXyk7CisgIH0KKyAgUHlPYmplY3QqIGdldCgpIHRocm93KCkgeyByZXR1cm4gb2JqXzsgfQorICBvcGVyYXRvciBib29sKCkgeyByZXR1cm4gb2JqXzsgfQorICB2b2lkIHJlc2V0KFB5T2JqZWN0KiBweV9vYmplY3QpIHRocm93KCkgeworICAgIGlmIChvYmpfKQorICAgICAgUHlfREVDUkVGKG9ial8pOworICAgIG9ial8gPSBweV9vYmplY3Q7CisgIH0KKyAgUHlPYmplY3QqIHJlbGVhc2UoKSB0aHJvdygpIHsKKyAgICBQeU9iamVjdCogdG1wID0gb2JqXzsKKyAgICBvYmpfID0gTlVMTDsKKyAgICByZXR1cm4gdG1wOworICB9CisgIHZvaWQgc3dhcChTY29wZWRQeU9iamVjdCYgb3RoZXIpIHRocm93KCkgeworICAgIFNjb3BlZFB5T2JqZWN0IHRtcChvdGhlci5yZWxlYXNlKCkpOworICAgIG90aGVyLnJlc2V0KHJlbGVhc2UoKSk7CisgICAgcmVzZXQodG1wLnJlbGVhc2UoKSk7CisgIH0KKworcHJpdmF0ZToKKyAgU2NvcGVkUHlPYmplY3QoY29uc3QgU2NvcGVkUHlPYmplY3QmKSB7fQorICBTY29wZWRQeU9iamVjdCYgb3BlcmF0b3I9KGNvbnN0IFNjb3BlZFB5T2JqZWN0JikgeyByZXR1cm4gKnRoaXM7IH0KKworICBQeU9iamVjdCogb2JqXzsKK307CisKKy8qKgorICogQSBjYWNoZSBvZiB0aGUgdHdvIGtleSBhdHRyaWJ1dGVzIG9mIGEgQ1JlYWRhYmxlVHJhbnNwb3J0LAorICogc28gd2UgZG9uJ3QgaGF2ZSB0byBrZWVwIGNhbGxpbmcgUHlPYmplY3RfR2V0QXR0ci4KKyAqLworc3RydWN0IERlY29kZUJ1ZmZlciB7CisgIFNjb3BlZFB5T2JqZWN0IHN0cmluZ2lvYnVmOworICBTY29wZWRQeU9iamVjdCByZWZpbGxfY2FsbGFibGU7Cit9OworCisjaWYgUFlfTUFKT1JfVkVSU0lPTiA8IDMKK2V4dGVybiBjaGFyIHJlZmlsbF9zaWduYXR1cmVbM107Cit0eXBlZGVmIFB5T2JqZWN0IEVuY29kZUJ1ZmZlcjsKKyNlbHNlCitleHRlcm4gY29uc3QgY2hhciogcmVmaWxsX3NpZ25hdHVyZTsKK3N0cnVjdCBFbmNvZGVCdWZmZXIgeworICBzdGQ6OnZlY3RvcjxjaGFyPiBidWY7CisgIHNpemVfdCBwb3M7Cit9OworI2VuZGlmCisKKy8qKgorICogQSBjYWNoZSBvZiB0aGUgc3BlY19hcmdzIGZvciBhIHNldCBvciBsaXN0LAorICogc28gd2UgZG9uJ3QgaGF2ZSB0byBrZWVwIGNhbGxpbmcgUHlUdXBsZV9HRVRfSVRFTS4KKyAqLworc3RydWN0IFNldExpc3RUeXBlQXJncyB7CisgIFRUeXBlIGVsZW1lbnRfdHlwZTsKKyAgUHlPYmplY3QqIHR5cGVhcmdzOworICBib29sIGltbXV0YWJsZTsKK307CisKKy8qKgorICogQSBjYWNoZSBvZiB0aGUgc3BlY19hcmdzIGZvciBhIG1hcCwKKyAqIHNvIHdlIGRvbid0IGhhdmUgdG8ga2VlcCBjYWxsaW5nIFB5VHVwbGVfR0VUX0lURU0uCisgKi8KK3N0cnVjdCBNYXBUeXBlQXJncyB7CisgIFRUeXBlIGt0YWc7CisgIFRUeXBlIHZ0YWc7CisgIFB5T2JqZWN0KiBrdHlwZWFyZ3M7CisgIFB5T2JqZWN0KiB2dHlwZWFyZ3M7CisgIGJvb2wgaW1tdXRhYmxlOworfTsKKworLyoqCisgKiBBIGNhY2hlIG9mIHRoZSBzcGVjX2FyZ3MgZm9yIGEgc3RydWN0LAorICogc28gd2UgZG9uJ3QgaGF2ZSB0byBrZWVwIGNhbGxpbmcgUHlUdXBsZV9HRVRfSVRFTS4KKyAqLworc3RydWN0IFN0cnVjdFR5cGVBcmdzIHsKKyAgUHlPYmplY3QqIGtsYXNzOworICBQeU9iamVjdCogc3BlYzsKKyAgYm9vbCBpbW11dGFibGU7Cit9OworCisvKioKKyAqIEEgY2FjaGUgb2YgdGhlIGl0ZW0gc3BlYyBmcm9tIGEgc3RydWN0IHNwZWNpZmljYXRpb24sCisgKiBzbyB3ZSBkb24ndCBoYXZlIHRvIGtlZXAgY2FsbGluZyBQeVR1cGxlX0dFVF9JVEVNLgorICovCitzdHJ1Y3QgU3RydWN0SXRlbVNwZWMgeworICBpbnQgdGFnOworICBUVHlwZSB0eXBlOworICBQeU9iamVjdCogYXR0cm5hbWU7CisgIFB5T2JqZWN0KiB0eXBlYXJnczsKKyAgUHlPYmplY3QqIGRlZnZhbDsKK307CisKK2Jvb2wgcGFyc2Vfc2V0X2xpc3RfYXJncyhTZXRMaXN0VHlwZUFyZ3MqIGRlc3QsIFB5T2JqZWN0KiB0eXBlYXJncyk7CisKK2Jvb2wgcGFyc2VfbWFwX2FyZ3MoTWFwVHlwZUFyZ3MqIGRlc3QsIFB5T2JqZWN0KiB0eXBlYXJncyk7CisKK2Jvb2wgcGFyc2Vfc3RydWN0X2FyZ3MoU3RydWN0VHlwZUFyZ3MqIGRlc3QsIFB5T2JqZWN0KiB0eXBlYXJncyk7CisKK2Jvb2wgcGFyc2Vfc3RydWN0X2l0ZW1fc3BlYyhTdHJ1Y3RJdGVtU3BlYyogZGVzdCwgUHlPYmplY3QqIHNwZWNfdHVwbGUpOworfQorfQorfQorCisjZW5kaWYgLy8gVEhSSUZUX1BZX1RZUEVTX0gKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvcHJvdG9jb2wvVEJhc2UucHkgYi9saWIvcHkvc3JjL3Byb3RvY29sL1RCYXNlLnB5CmluZGV4IDZjYmQ1ZjMuLjlhZTFiMTEgMTAwNjQ0Ci0tLSBhL2xpYi9weS9zcmMvcHJvdG9jb2wvVEJhc2UucHkKKysrIGIvbGliL3B5L3NyYy9wcm90b2NvbC9UQmFzZS5weQpAQCAtMTcsNjUgKzE3LDY2IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1mcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0ICoKLWZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAogCi10cnk6Ci0gIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBmYXN0YmluYXJ5Ci1leGNlcHQ6Ci0gIGZhc3RiaW5hcnkgPSBOb25lCi0KIAogY2xhc3MgVEJhc2Uob2JqZWN0KToKLSAgX19zbG90c19fID0gW10KKyAgICBfX3Nsb3RzX18gPSAoKQogCi0gIGRlZiBfX3JlcHJfXyhzZWxmKToKLSAgICBMID0gWyclcz0lcicgJSAoa2V5LCBnZXRhdHRyKHNlbGYsIGtleSkpCi0gICAgICAgICAgICAgIGZvciBrZXkgaW4gc2VsZi5fX3Nsb3RzX19dCi0gICAgcmV0dXJuICclcyglcyknICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCAnLCAnLmpvaW4oTCkpCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICBMID0gWyclcz0lcicgJSAoa2V5LCBnZXRhdHRyKHNlbGYsIGtleSkpIGZvciBrZXkgaW4gc2VsZi5fX3Nsb3RzX19dCisgICAgICAgIHJldHVybiAnJXMoJXMpJyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgJywgJy5qb2luKEwpKQogCi0gIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgotICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXyk6Ci0gICAgICByZXR1cm4gRmFsc2UKLSAgICBmb3IgYXR0ciBpbiBzZWxmLl9fc2xvdHNfXzoKLSAgICAgIG15X3ZhbCA9IGdldGF0dHIoc2VsZiwgYXR0cikKLSAgICAgIG90aGVyX3ZhbCA9IGdldGF0dHIob3RoZXIsIGF0dHIpCi0gICAgICBpZiBteV92YWwgIT0gb3RoZXJfdmFsOgotICAgICAgICByZXR1cm4gRmFsc2UKLSAgICByZXR1cm4gVHJ1ZQorICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGZvciBhdHRyIGluIHNlbGYuX19zbG90c19fOgorICAgICAgICAgICAgbXlfdmFsID0gZ2V0YXR0cihzZWxmLCBhdHRyKQorICAgICAgICAgICAgb3RoZXJfdmFsID0gZ2V0YXR0cihvdGhlciwgYXR0cikKKyAgICAgICAgICAgIGlmIG15X3ZhbCAhPSBvdGhlcl92YWw6CisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBUcnVlCiAKLSAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6Ci0gICAgcmV0dXJuIG5vdCAoc2VsZiA9PSBvdGhlcikKKyAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIG5vdCAoc2VsZiA9PSBvdGhlcikKIAotICBkZWYgcmVhZChzZWxmLCBpcHJvdCk6Ci0gICAgaWYgKGlwcm90Ll9fY2xhc3NfXyA9PSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgYW5kCi0gICAgICAgIGlzaW5zdGFuY2UoaXByb3QudHJhbnMsIFRUcmFuc3BvcnQuQ1JlYWRhYmxlVHJhbnNwb3J0KSBhbmQKLSAgICAgICAgc2VsZi50aHJpZnRfc3BlYyBpcyBub3QgTm9uZSBhbmQKLSAgICAgICAgZmFzdGJpbmFyeSBpcyBub3QgTm9uZSk6Ci0gICAgICBmYXN0YmluYXJ5LmRlY29kZV9iaW5hcnkoc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcHJvdC50cmFucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi5fX2NsYXNzX18sIHNlbGYudGhyaWZ0X3NwZWMpKQotICAgICAgcmV0dXJuCi0gICAgaXByb3QucmVhZFN0cnVjdChzZWxmLCBzZWxmLnRocmlmdF9zcGVjKQorICAgIGRlZiByZWFkKHNlbGYsIGlwcm90KToKKyAgICAgICAgaWYgKGlwcm90Ll9mYXN0X2RlY29kZSBpcyBub3QgTm9uZSBhbmQKKyAgICAgICAgICAgICAgICBpc2luc3RhbmNlKGlwcm90LnRyYW5zLCBUVHJhbnNwb3J0LkNSZWFkYWJsZVRyYW5zcG9ydCkgYW5kCisgICAgICAgICAgICAgICAgc2VsZi50aHJpZnRfc3BlYyBpcyBub3QgTm9uZSk6CisgICAgICAgICAgICBpcHJvdC5fZmFzdF9kZWNvZGUoc2VsZiwgaXByb3QsIFtzZWxmLl9fY2xhc3NfXywgc2VsZi50aHJpZnRfc3BlY10pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpcHJvdC5yZWFkU3RydWN0KHNlbGYsIHNlbGYudGhyaWZ0X3NwZWMpCiAKLSAgZGVmIHdyaXRlKHNlbGYsIG9wcm90KToKLSAgICBpZiAob3Byb3QuX19jbGFzc19fID09IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBhbmQKLSAgICAgICAgc2VsZi50aHJpZnRfc3BlYyBpcyBub3QgTm9uZSBhbmQKLSAgICAgICAgZmFzdGJpbmFyeSBpcyBub3QgTm9uZSk6Ci0gICAgICBvcHJvdC50cmFucy53cml0ZSgKLSAgICAgICAgZmFzdGJpbmFyeS5lbmNvZGVfYmluYXJ5KHNlbGYsIChzZWxmLl9fY2xhc3NfXywgc2VsZi50aHJpZnRfc3BlYykpKQotICAgICAgcmV0dXJuCi0gICAgb3Byb3Qud3JpdGVTdHJ1Y3Qoc2VsZiwgc2VsZi50aHJpZnRfc3BlYykKKyAgICBkZWYgd3JpdGUoc2VsZiwgb3Byb3QpOgorICAgICAgICBpZiAob3Byb3QuX2Zhc3RfZW5jb2RlIGlzIG5vdCBOb25lIGFuZCBzZWxmLnRocmlmdF9zcGVjIGlzIG5vdCBOb25lKToKKyAgICAgICAgICAgIG9wcm90LnRyYW5zLndyaXRlKAorICAgICAgICAgICAgICAgIG9wcm90Ll9mYXN0X2VuY29kZShzZWxmLCBbc2VsZi5fX2NsYXNzX18sIHNlbGYudGhyaWZ0X3NwZWNdKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG9wcm90LndyaXRlU3RydWN0KHNlbGYsIHNlbGYudGhyaWZ0X3NwZWMpCiAKIAotY2xhc3MgVEV4Y2VwdGlvbkJhc2UoRXhjZXB0aW9uKToKLSAgIyBvbGQgc3R5bGUgY2xhc3Mgc28gcHl0aG9uMi40IGNhbiByYWlzZSBleGNlcHRpb25zIGRlcml2ZWQgZnJvbSB0aGlzCi0gICMgIFRoaXMgY2FuJ3QgaW5oZXJpdCBmcm9tIFRCYXNlIGJlY2F1c2Ugb2YgdGhhdCBsaW1pdGF0aW9uLgotICBfX3Nsb3RzX18gPSBbXQorY2xhc3MgVEV4Y2VwdGlvbkJhc2UoVEJhc2UsIEV4Y2VwdGlvbik6CisgICAgcGFzcwogCi0gIF9fcmVwcl9fID0gVEJhc2UuX19yZXByX18uaW1fZnVuYwotICBfX2VxX18gPSBUQmFzZS5fX2VxX18uaW1fZnVuYwotICBfX25lX18gPSBUQmFzZS5fX25lX18uaW1fZnVuYwotICByZWFkID0gVEJhc2UucmVhZC5pbV9mdW5jCi0gIHdyaXRlID0gVEJhc2Uud3JpdGUuaW1fZnVuYworCitjbGFzcyBURnJvemVuQmFzZShUQmFzZSk6CisgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsICphcmdzKToKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJDYW4ndCBtb2RpZnkgZnJvemVuIHN0cnVjdCIpCisKKyAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwgKmFyZ3MpOgorICAgICAgICByYWlzZSBUeXBlRXJyb3IoIkNhbid0IG1vZGlmeSBmcm96ZW4gc3RydWN0IikKKworICAgIGRlZiBfX2hhc2hfXyhzZWxmLCAqYXJncyk6CisgICAgICAgIHJldHVybiBoYXNoKHNlbGYuX19jbGFzc19fKSBeIGhhc2goc2VsZi5fX3Nsb3RzX18pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgcmVhZChjbHMsIGlwcm90KToKKyAgICAgICAgaWYgKGlwcm90Ll9mYXN0X2RlY29kZSBpcyBub3QgTm9uZSBhbmQKKyAgICAgICAgICAgICAgICBpc2luc3RhbmNlKGlwcm90LnRyYW5zLCBUVHJhbnNwb3J0LkNSZWFkYWJsZVRyYW5zcG9ydCkgYW5kCisgICAgICAgICAgICAgICAgY2xzLnRocmlmdF9zcGVjIGlzIG5vdCBOb25lKToKKyAgICAgICAgICAgIHNlbGYgPSBjbHMoKQorICAgICAgICAgICAgcmV0dXJuIGlwcm90Ll9mYXN0X2RlY29kZShOb25lLCBpcHJvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGYuX19jbGFzc19fLCBzZWxmLnRocmlmdF9zcGVjXSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBpcHJvdC5yZWFkU3RydWN0KGNscywgY2xzLnRocmlmdF9zcGVjLCBUcnVlKQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wucHkgYi9saWIvcHkvc3JjL3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5weQppbmRleCA2ZmRkMDhjLi5mNmJlNzcyIDEwMDY0NAotLS0gYS9saWIvcHkvc3JjL3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5weQorKysgYi9saWIvcHkvc3JjL3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5weQpAQCAtMTcsMjQ0ICsxNywyODUgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLWZyb20gVFByb3RvY29sIGltcG9ydCAqCitmcm9tIC5UUHJvdG9jb2wgaW1wb3J0IFRUeXBlLCBUUHJvdG9jb2xCYXNlLCBUUHJvdG9jb2xFeGNlcHRpb24KIGZyb20gc3RydWN0IGltcG9ydCBwYWNrLCB1bnBhY2sKIAogCiBjbGFzcyBUQmluYXJ5UHJvdG9jb2woVFByb3RvY29sQmFzZSk6Ci0gICIiIkJpbmFyeSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGhyaWZ0IHByb3RvY29sIGRyaXZlci4iIiIKKyAgICAiIiJCaW5hcnkgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRocmlmdCBwcm90b2NvbCBkcml2ZXIuIiIiCiAKLSAgIyBOYXN0eUhheHguIFB5dGhvbiAyLjQrIG9uIDMyLWJpdCBtYWNoaW5lcyBmb3JjZXMgaGV4IGNvbnN0YW50cyB0byBiZQotICAjIHBvc2l0aXZlLCBjb252ZXJ0aW5nIHRoaXMgaW50byBhIGxvbmcuIElmIHdlIGhhcmRjb2RlIHRoZSBpbnQgdmFsdWUKLSAgIyBpbnN0ZWFkIGl0J2xsIHN0YXkgaW4gMzIgYml0LWxhbmQuCisgICAgIyBOYXN0eUhheHguIFB5dGhvbiAyLjQrIG9uIDMyLWJpdCBtYWNoaW5lcyBmb3JjZXMgaGV4IGNvbnN0YW50cyB0byBiZQorICAgICMgcG9zaXRpdmUsIGNvbnZlcnRpbmcgdGhpcyBpbnRvIGEgbG9uZy4gSWYgd2UgaGFyZGNvZGUgdGhlIGludCB2YWx1ZQorICAgICMgaW5zdGVhZCBpdCdsbCBzdGF5IGluIDMyIGJpdC1sYW5kLgogCi0gICMgVkVSU0lPTl9NQVNLID0gMHhmZmZmMDAwMAotICBWRVJTSU9OX01BU0sgPSAtNjU1MzYKKyAgICAjIFZFUlNJT05fTUFTSyA9IDB4ZmZmZjAwMDAKKyAgICBWRVJTSU9OX01BU0sgPSAtNjU1MzYKIAotICAjIFZFUlNJT05fMSA9IDB4ODAwMTAwMDAKLSAgVkVSU0lPTl8xID0gLTIxNDc0MTgxMTIKKyAgICAjIFZFUlNJT05fMSA9IDB4ODAwMTAwMDAKKyAgICBWRVJTSU9OXzEgPSAtMjE0NzQxODExMgogCi0gIFRZUEVfTUFTSyA9IDB4MDAwMDAwZmYKKyAgICBUWVBFX01BU0sgPSAweDAwMDAwMGZmCiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsIHRyYW5zLCBzdHJpY3RSZWFkPUZhbHNlLCBzdHJpY3RXcml0ZT1UcnVlKToKLSAgICBUUHJvdG9jb2xCYXNlLl9faW5pdF9fKHNlbGYsIHRyYW5zKQotICAgIHNlbGYuc3RyaWN0UmVhZCA9IHN0cmljdFJlYWQKLSAgICBzZWxmLnN0cmljdFdyaXRlID0gc3RyaWN0V3JpdGUKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHJhbnMsIHN0cmljdFJlYWQ9RmFsc2UsIHN0cmljdFdyaXRlPVRydWUsICoqa3dhcmdzKToKKyAgICAgICAgVFByb3RvY29sQmFzZS5fX2luaXRfXyhzZWxmLCB0cmFucykKKyAgICAgICAgc2VsZi5zdHJpY3RSZWFkID0gc3RyaWN0UmVhZAorICAgICAgICBzZWxmLnN0cmljdFdyaXRlID0gc3RyaWN0V3JpdGUKKyAgICAgICAgc2VsZi5zdHJpbmdfbGVuZ3RoX2xpbWl0ID0ga3dhcmdzLmdldCgnc3RyaW5nX2xlbmd0aF9saW1pdCcsIE5vbmUpCisgICAgICAgIHNlbGYuY29udGFpbmVyX2xlbmd0aF9saW1pdCA9IGt3YXJncy5nZXQoJ2NvbnRhaW5lcl9sZW5ndGhfbGltaXQnLCBOb25lKQogCi0gIGRlZiB3cml0ZU1lc3NhZ2VCZWdpbihzZWxmLCBuYW1lLCB0eXBlLCBzZXFpZCk6Ci0gICAgaWYgc2VsZi5zdHJpY3RXcml0ZToKLSAgICAgIHNlbGYud3JpdGVJMzIoVEJpbmFyeVByb3RvY29sLlZFUlNJT05fMSB8IHR5cGUpCi0gICAgICBzZWxmLndyaXRlU3RyaW5nKG5hbWUpCi0gICAgICBzZWxmLndyaXRlSTMyKHNlcWlkKQotICAgIGVsc2U6Ci0gICAgICBzZWxmLndyaXRlU3RyaW5nKG5hbWUpCi0gICAgICBzZWxmLndyaXRlQnl0ZSh0eXBlKQotICAgICAgc2VsZi53cml0ZUkzMihzZXFpZCkKKyAgICBkZWYgX2NoZWNrX3N0cmluZ19sZW5ndGgoc2VsZiwgbGVuZ3RoKToKKyAgICAgICAgc2VsZi5fY2hlY2tfbGVuZ3RoKHNlbGYuc3RyaW5nX2xlbmd0aF9saW1pdCwgbGVuZ3RoKQogCi0gIGRlZiB3cml0ZU1lc3NhZ2VFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiBfY2hlY2tfY29udGFpbmVyX2xlbmd0aChzZWxmLCBsZW5ndGgpOgorICAgICAgICBzZWxmLl9jaGVja19sZW5ndGgoc2VsZi5jb250YWluZXJfbGVuZ3RoX2xpbWl0LCBsZW5ndGgpCiAKLSAgZGVmIHdyaXRlU3RydWN0QmVnaW4oc2VsZiwgbmFtZSk6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZU1lc3NhZ2VCZWdpbihzZWxmLCBuYW1lLCB0eXBlLCBzZXFpZCk6CisgICAgICAgIGlmIHNlbGYuc3RyaWN0V3JpdGU6CisgICAgICAgICAgICBzZWxmLndyaXRlSTMyKFRCaW5hcnlQcm90b2NvbC5WRVJTSU9OXzEgfCB0eXBlKQorICAgICAgICAgICAgc2VsZi53cml0ZVN0cmluZyhuYW1lKQorICAgICAgICAgICAgc2VsZi53cml0ZUkzMihzZXFpZCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYud3JpdGVTdHJpbmcobmFtZSkKKyAgICAgICAgICAgIHNlbGYud3JpdGVCeXRlKHR5cGUpCisgICAgICAgICAgICBzZWxmLndyaXRlSTMyKHNlcWlkKQogCi0gIGRlZiB3cml0ZVN0cnVjdEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlTWVzc2FnZUVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZUZpZWxkQmVnaW4oc2VsZiwgbmFtZSwgdHlwZSwgaWQpOgotICAgIHNlbGYud3JpdGVCeXRlKHR5cGUpCi0gICAgc2VsZi53cml0ZUkxNihpZCkKKyAgICBkZWYgd3JpdGVTdHJ1Y3RCZWdpbihzZWxmLCBuYW1lKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZUZpZWxkRW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVTdHJ1Y3RFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVGaWVsZFN0b3Aoc2VsZik6Ci0gICAgc2VsZi53cml0ZUJ5dGUoVFR5cGUuU1RPUCkKKyAgICBkZWYgd3JpdGVGaWVsZEJlZ2luKHNlbGYsIG5hbWUsIHR5cGUsIGlkKToKKyAgICAgICAgc2VsZi53cml0ZUJ5dGUodHlwZSkKKyAgICAgICAgc2VsZi53cml0ZUkxNihpZCkKIAotICBkZWYgd3JpdGVNYXBCZWdpbihzZWxmLCBrdHlwZSwgdnR5cGUsIHNpemUpOgotICAgIHNlbGYud3JpdGVCeXRlKGt0eXBlKQotICAgIHNlbGYud3JpdGVCeXRlKHZ0eXBlKQotICAgIHNlbGYud3JpdGVJMzIoc2l6ZSkKKyAgICBkZWYgd3JpdGVGaWVsZEVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZU1hcEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlRmllbGRTdG9wKHNlbGYpOgorICAgICAgICBzZWxmLndyaXRlQnl0ZShUVHlwZS5TVE9QKQogCi0gIGRlZiB3cml0ZUxpc3RCZWdpbihzZWxmLCBldHlwZSwgc2l6ZSk6Ci0gICAgc2VsZi53cml0ZUJ5dGUoZXR5cGUpCi0gICAgc2VsZi53cml0ZUkzMihzaXplKQorICAgIGRlZiB3cml0ZU1hcEJlZ2luKHNlbGYsIGt0eXBlLCB2dHlwZSwgc2l6ZSk6CisgICAgICAgIHNlbGYud3JpdGVCeXRlKGt0eXBlKQorICAgICAgICBzZWxmLndyaXRlQnl0ZSh2dHlwZSkKKyAgICAgICAgc2VsZi53cml0ZUkzMihzaXplKQogCi0gIGRlZiB3cml0ZUxpc3RFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZU1hcEVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZVNldEJlZ2luKHNlbGYsIGV0eXBlLCBzaXplKToKLSAgICBzZWxmLndyaXRlQnl0ZShldHlwZSkKLSAgICBzZWxmLndyaXRlSTMyKHNpemUpCisgICAgZGVmIHdyaXRlTGlzdEJlZ2luKHNlbGYsIGV0eXBlLCBzaXplKToKKyAgICAgICAgc2VsZi53cml0ZUJ5dGUoZXR5cGUpCisgICAgICAgIHNlbGYud3JpdGVJMzIoc2l6ZSkKIAotICBkZWYgd3JpdGVTZXRFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZUxpc3RFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVCb29sKHNlbGYsIGJvb2wpOgotICAgIGlmIGJvb2w6Ci0gICAgICBzZWxmLndyaXRlQnl0ZSgxKQotICAgIGVsc2U6Ci0gICAgICBzZWxmLndyaXRlQnl0ZSgwKQorICAgIGRlZiB3cml0ZVNldEJlZ2luKHNlbGYsIGV0eXBlLCBzaXplKToKKyAgICAgICAgc2VsZi53cml0ZUJ5dGUoZXR5cGUpCisgICAgICAgIHNlbGYud3JpdGVJMzIoc2l6ZSkKIAotICBkZWYgd3JpdGVCeXRlKHNlbGYsIGJ5dGUpOgotICAgIGJ1ZmYgPSBwYWNrKCIhYiIsIGJ5dGUpCi0gICAgc2VsZi50cmFucy53cml0ZShidWZmKQorICAgIGRlZiB3cml0ZVNldEVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZUkxNihzZWxmLCBpMTYpOgotICAgIGJ1ZmYgPSBwYWNrKCIhaCIsIGkxNikKLSAgICBzZWxmLnRyYW5zLndyaXRlKGJ1ZmYpCisgICAgZGVmIHdyaXRlQm9vbChzZWxmLCBib29sKToKKyAgICAgICAgaWYgYm9vbDoKKyAgICAgICAgICAgIHNlbGYud3JpdGVCeXRlKDEpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLndyaXRlQnl0ZSgwKQogCi0gIGRlZiB3cml0ZUkzMihzZWxmLCBpMzIpOgotICAgIGJ1ZmYgPSBwYWNrKCIhaSIsIGkzMikKLSAgICBzZWxmLnRyYW5zLndyaXRlKGJ1ZmYpCisgICAgZGVmIHdyaXRlQnl0ZShzZWxmLCBieXRlKToKKyAgICAgICAgYnVmZiA9IHBhY2soIiFiIiwgYnl0ZSkKKyAgICAgICAgc2VsZi50cmFucy53cml0ZShidWZmKQogCi0gIGRlZiB3cml0ZUk2NChzZWxmLCBpNjQpOgotICAgIGJ1ZmYgPSBwYWNrKCIhcSIsIGk2NCkKLSAgICBzZWxmLnRyYW5zLndyaXRlKGJ1ZmYpCisgICAgZGVmIHdyaXRlSTE2KHNlbGYsIGkxNik6CisgICAgICAgIGJ1ZmYgPSBwYWNrKCIhaCIsIGkxNikKKyAgICAgICAgc2VsZi50cmFucy53cml0ZShidWZmKQogCi0gIGRlZiB3cml0ZURvdWJsZShzZWxmLCBkdWIpOgotICAgIGJ1ZmYgPSBwYWNrKCIhZCIsIGR1YikKLSAgICBzZWxmLnRyYW5zLndyaXRlKGJ1ZmYpCisgICAgZGVmIHdyaXRlSTMyKHNlbGYsIGkzMik6CisgICAgICAgIGJ1ZmYgPSBwYWNrKCIhaSIsIGkzMikKKyAgICAgICAgc2VsZi50cmFucy53cml0ZShidWZmKQogCi0gIGRlZiB3cml0ZVN0cmluZyhzZWxmLCBzdHIpOgotICAgIHNlbGYud3JpdGVJMzIobGVuKHN0cikpCi0gICAgc2VsZi50cmFucy53cml0ZShzdHIpCisgICAgZGVmIHdyaXRlSTY0KHNlbGYsIGk2NCk6CisgICAgICAgIGJ1ZmYgPSBwYWNrKCIhcSIsIGk2NCkKKyAgICAgICAgc2VsZi50cmFucy53cml0ZShidWZmKQogCi0gIGRlZiByZWFkTWVzc2FnZUJlZ2luKHNlbGYpOgotICAgIHN6ID0gc2VsZi5yZWFkSTMyKCkKLSAgICBpZiBzeiA8IDA6Ci0gICAgICB2ZXJzaW9uID0gc3ogJiBUQmluYXJ5UHJvdG9jb2wuVkVSU0lPTl9NQVNLCi0gICAgICBpZiB2ZXJzaW9uICE9IFRCaW5hcnlQcm90b2NvbC5WRVJTSU9OXzE6Ci0gICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbigKLSAgICAgICAgICB0eXBlPVRQcm90b2NvbEV4Y2VwdGlvbi5CQURfVkVSU0lPTiwKLSAgICAgICAgICBtZXNzYWdlPSdCYWQgdmVyc2lvbiBpbiByZWFkTWVzc2FnZUJlZ2luOiAlZCcgJSAoc3opKQotICAgICAgdHlwZSA9IHN6ICYgVEJpbmFyeVByb3RvY29sLlRZUEVfTUFTSwotICAgICAgbmFtZSA9IHNlbGYucmVhZFN0cmluZygpCi0gICAgICBzZXFpZCA9IHNlbGYucmVhZEkzMigpCi0gICAgZWxzZToKLSAgICAgIGlmIHNlbGYuc3RyaWN0UmVhZDoKLSAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKHR5cGU9VFByb3RvY29sRXhjZXB0aW9uLkJBRF9WRVJTSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0nTm8gcHJvdG9jb2wgdmVyc2lvbiBoZWFkZXInKQotICAgICAgbmFtZSA9IHNlbGYudHJhbnMucmVhZEFsbChzeikKLSAgICAgIHR5cGUgPSBzZWxmLnJlYWRCeXRlKCkKLSAgICAgIHNlcWlkID0gc2VsZi5yZWFkSTMyKCkKLSAgICByZXR1cm4gKG5hbWUsIHR5cGUsIHNlcWlkKQorICAgIGRlZiB3cml0ZURvdWJsZShzZWxmLCBkdWIpOgorICAgICAgICBidWZmID0gcGFjaygiIWQiLCBkdWIpCisgICAgICAgIHNlbGYudHJhbnMud3JpdGUoYnVmZikKIAotICBkZWYgcmVhZE1lc3NhZ2VFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZUJpbmFyeShzZWxmLCBzdHIpOgorICAgICAgICBzZWxmLndyaXRlSTMyKGxlbihzdHIpKQorICAgICAgICBzZWxmLnRyYW5zLndyaXRlKHN0cikKIAotICBkZWYgcmVhZFN0cnVjdEJlZ2luKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZE1lc3NhZ2VCZWdpbihzZWxmKToKKyAgICAgICAgc3ogPSBzZWxmLnJlYWRJMzIoKQorICAgICAgICBpZiBzeiA8IDA6CisgICAgICAgICAgICB2ZXJzaW9uID0gc3ogJiBUQmluYXJ5UHJvdG9jb2wuVkVSU0lPTl9NQVNLCisgICAgICAgICAgICBpZiB2ZXJzaW9uICE9IFRCaW5hcnlQcm90b2NvbC5WRVJTSU9OXzE6CisgICAgICAgICAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICB0eXBlPVRQcm90b2NvbEV4Y2VwdGlvbi5CQURfVkVSU0lPTiwKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0nQmFkIHZlcnNpb24gaW4gcmVhZE1lc3NhZ2VCZWdpbjogJWQnICUgKHN6KSkKKyAgICAgICAgICAgIHR5cGUgPSBzeiAmIFRCaW5hcnlQcm90b2NvbC5UWVBFX01BU0sKKyAgICAgICAgICAgIG5hbWUgPSBzZWxmLnJlYWRTdHJpbmcoKQorICAgICAgICAgICAgc2VxaWQgPSBzZWxmLnJlYWRJMzIoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgc2VsZi5zdHJpY3RSZWFkOgorICAgICAgICAgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbih0eXBlPVRQcm90b2NvbEV4Y2VwdGlvbi5CQURfVkVSU0lPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0nTm8gcHJvdG9jb2wgdmVyc2lvbiBoZWFkZXInKQorICAgICAgICAgICAgbmFtZSA9IHNlbGYudHJhbnMucmVhZEFsbChzeikKKyAgICAgICAgICAgIHR5cGUgPSBzZWxmLnJlYWRCeXRlKCkKKyAgICAgICAgICAgIHNlcWlkID0gc2VsZi5yZWFkSTMyKCkKKyAgICAgICAgcmV0dXJuIChuYW1lLCB0eXBlLCBzZXFpZCkKIAotICBkZWYgcmVhZFN0cnVjdEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRNZXNzYWdlRW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRGaWVsZEJlZ2luKHNlbGYpOgotICAgIHR5cGUgPSBzZWxmLnJlYWRCeXRlKCkKLSAgICBpZiB0eXBlID09IFRUeXBlLlNUT1A6Ci0gICAgICByZXR1cm4gKE5vbmUsIHR5cGUsIDApCi0gICAgaWQgPSBzZWxmLnJlYWRJMTYoKQotICAgIHJldHVybiAoTm9uZSwgdHlwZSwgaWQpCisgICAgZGVmIHJlYWRTdHJ1Y3RCZWdpbihzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkRmllbGRFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiByZWFkU3RydWN0RW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRNYXBCZWdpbihzZWxmKToKLSAgICBrdHlwZSA9IHNlbGYucmVhZEJ5dGUoKQotICAgIHZ0eXBlID0gc2VsZi5yZWFkQnl0ZSgpCi0gICAgc2l6ZSA9IHNlbGYucmVhZEkzMigpCi0gICAgcmV0dXJuIChrdHlwZSwgdnR5cGUsIHNpemUpCisgICAgZGVmIHJlYWRGaWVsZEJlZ2luKHNlbGYpOgorICAgICAgICB0eXBlID0gc2VsZi5yZWFkQnl0ZSgpCisgICAgICAgIGlmIHR5cGUgPT0gVFR5cGUuU1RPUDoKKyAgICAgICAgICAgIHJldHVybiAoTm9uZSwgdHlwZSwgMCkKKyAgICAgICAgaWQgPSBzZWxmLnJlYWRJMTYoKQorICAgICAgICByZXR1cm4gKE5vbmUsIHR5cGUsIGlkKQogCi0gIGRlZiByZWFkTWFwRW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZEZpZWxkRW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRMaXN0QmVnaW4oc2VsZik6Ci0gICAgZXR5cGUgPSBzZWxmLnJlYWRCeXRlKCkKLSAgICBzaXplID0gc2VsZi5yZWFkSTMyKCkKLSAgICByZXR1cm4gKGV0eXBlLCBzaXplKQorICAgIGRlZiByZWFkTWFwQmVnaW4oc2VsZik6CisgICAgICAgIGt0eXBlID0gc2VsZi5yZWFkQnl0ZSgpCisgICAgICAgIHZ0eXBlID0gc2VsZi5yZWFkQnl0ZSgpCisgICAgICAgIHNpemUgPSBzZWxmLnJlYWRJMzIoKQorICAgICAgICBzZWxmLl9jaGVja19jb250YWluZXJfbGVuZ3RoKHNpemUpCisgICAgICAgIHJldHVybiAoa3R5cGUsIHZ0eXBlLCBzaXplKQogCi0gIGRlZiByZWFkTGlzdEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRNYXBFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZFNldEJlZ2luKHNlbGYpOgotICAgIGV0eXBlID0gc2VsZi5yZWFkQnl0ZSgpCi0gICAgc2l6ZSA9IHNlbGYucmVhZEkzMigpCi0gICAgcmV0dXJuIChldHlwZSwgc2l6ZSkKKyAgICBkZWYgcmVhZExpc3RCZWdpbihzZWxmKToKKyAgICAgICAgZXR5cGUgPSBzZWxmLnJlYWRCeXRlKCkKKyAgICAgICAgc2l6ZSA9IHNlbGYucmVhZEkzMigpCisgICAgICAgIHNlbGYuX2NoZWNrX2NvbnRhaW5lcl9sZW5ndGgoc2l6ZSkKKyAgICAgICAgcmV0dXJuIChldHlwZSwgc2l6ZSkKIAotICBkZWYgcmVhZFNldEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRMaXN0RW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRCb29sKHNlbGYpOgotICAgIGJ5dGUgPSBzZWxmLnJlYWRCeXRlKCkKLSAgICBpZiBieXRlID09IDA6Ci0gICAgICByZXR1cm4gRmFsc2UKLSAgICByZXR1cm4gVHJ1ZQorICAgIGRlZiByZWFkU2V0QmVnaW4oc2VsZik6CisgICAgICAgIGV0eXBlID0gc2VsZi5yZWFkQnl0ZSgpCisgICAgICAgIHNpemUgPSBzZWxmLnJlYWRJMzIoKQorICAgICAgICBzZWxmLl9jaGVja19jb250YWluZXJfbGVuZ3RoKHNpemUpCisgICAgICAgIHJldHVybiAoZXR5cGUsIHNpemUpCiAKLSAgZGVmIHJlYWRCeXRlKHNlbGYpOgotICAgIGJ1ZmYgPSBzZWxmLnRyYW5zLnJlYWRBbGwoMSkKLSAgICB2YWwsID0gdW5wYWNrKCchYicsIGJ1ZmYpCi0gICAgcmV0dXJuIHZhbAorICAgIGRlZiByZWFkU2V0RW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRJMTYoc2VsZik6Ci0gICAgYnVmZiA9IHNlbGYudHJhbnMucmVhZEFsbCgyKQotICAgIHZhbCwgPSB1bnBhY2soJyFoJywgYnVmZikKLSAgICByZXR1cm4gdmFsCisgICAgZGVmIHJlYWRCb29sKHNlbGYpOgorICAgICAgICBieXRlID0gc2VsZi5yZWFkQnl0ZSgpCisgICAgICAgIGlmIGJ5dGUgPT0gMDoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQogCi0gIGRlZiByZWFkSTMyKHNlbGYpOgotICAgIGJ1ZmYgPSBzZWxmLnRyYW5zLnJlYWRBbGwoNCkKLSAgICB2YWwsID0gdW5wYWNrKCchaScsIGJ1ZmYpCi0gICAgcmV0dXJuIHZhbAorICAgIGRlZiByZWFkQnl0ZShzZWxmKToKKyAgICAgICAgYnVmZiA9IHNlbGYudHJhbnMucmVhZEFsbCgxKQorICAgICAgICB2YWwsID0gdW5wYWNrKCchYicsIGJ1ZmYpCisgICAgICAgIHJldHVybiB2YWwKIAotICBkZWYgcmVhZEk2NChzZWxmKToKLSAgICBidWZmID0gc2VsZi50cmFucy5yZWFkQWxsKDgpCi0gICAgdmFsLCA9IHVucGFjaygnIXEnLCBidWZmKQotICAgIHJldHVybiB2YWwKKyAgICBkZWYgcmVhZEkxNihzZWxmKToKKyAgICAgICAgYnVmZiA9IHNlbGYudHJhbnMucmVhZEFsbCgyKQorICAgICAgICB2YWwsID0gdW5wYWNrKCchaCcsIGJ1ZmYpCisgICAgICAgIHJldHVybiB2YWwKIAotICBkZWYgcmVhZERvdWJsZShzZWxmKToKLSAgICBidWZmID0gc2VsZi50cmFucy5yZWFkQWxsKDgpCi0gICAgdmFsLCA9IHVucGFjaygnIWQnLCBidWZmKQotICAgIHJldHVybiB2YWwKKyAgICBkZWYgcmVhZEkzMihzZWxmKToKKyAgICAgICAgYnVmZiA9IHNlbGYudHJhbnMucmVhZEFsbCg0KQorICAgICAgICB2YWwsID0gdW5wYWNrKCchaScsIGJ1ZmYpCisgICAgICAgIHJldHVybiB2YWwKIAotICBkZWYgcmVhZFN0cmluZyhzZWxmKToKLSAgICBsZW4gPSBzZWxmLnJlYWRJMzIoKQotICAgIHN0ciA9IHNlbGYudHJhbnMucmVhZEFsbChsZW4pCi0gICAgcmV0dXJuIHN0cgorICAgIGRlZiByZWFkSTY0KHNlbGYpOgorICAgICAgICBidWZmID0gc2VsZi50cmFucy5yZWFkQWxsKDgpCisgICAgICAgIHZhbCwgPSB1bnBhY2soJyFxJywgYnVmZikKKyAgICAgICAgcmV0dXJuIHZhbAorCisgICAgZGVmIHJlYWREb3VibGUoc2VsZik6CisgICAgICAgIGJ1ZmYgPSBzZWxmLnRyYW5zLnJlYWRBbGwoOCkKKyAgICAgICAgdmFsLCA9IHVucGFjaygnIWQnLCBidWZmKQorICAgICAgICByZXR1cm4gdmFsCisKKyAgICBkZWYgcmVhZEJpbmFyeShzZWxmKToKKyAgICAgICAgc2l6ZSA9IHNlbGYucmVhZEkzMigpCisgICAgICAgIHNlbGYuX2NoZWNrX3N0cmluZ19sZW5ndGgoc2l6ZSkKKyAgICAgICAgcyA9IHNlbGYudHJhbnMucmVhZEFsbChzaXplKQorICAgICAgICByZXR1cm4gcwogCiAKLWNsYXNzIFRCaW5hcnlQcm90b2NvbEZhY3Rvcnk6Ci0gIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJpY3RSZWFkPUZhbHNlLCBzdHJpY3RXcml0ZT1UcnVlKToKLSAgICBzZWxmLnN0cmljdFJlYWQgPSBzdHJpY3RSZWFkCi0gICAgc2VsZi5zdHJpY3RXcml0ZSA9IHN0cmljdFdyaXRlCitjbGFzcyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmljdFJlYWQ9RmFsc2UsIHN0cmljdFdyaXRlPVRydWUsICoqa3dhcmdzKToKKyAgICAgICAgc2VsZi5zdHJpY3RSZWFkID0gc3RyaWN0UmVhZAorICAgICAgICBzZWxmLnN0cmljdFdyaXRlID0gc3RyaWN0V3JpdGUKKyAgICAgICAgc2VsZi5zdHJpbmdfbGVuZ3RoX2xpbWl0ID0ga3dhcmdzLmdldCgnc3RyaW5nX2xlbmd0aF9saW1pdCcsIE5vbmUpCisgICAgICAgIHNlbGYuY29udGFpbmVyX2xlbmd0aF9saW1pdCA9IGt3YXJncy5nZXQoJ2NvbnRhaW5lcl9sZW5ndGhfbGltaXQnLCBOb25lKQogCi0gIGRlZiBnZXRQcm90b2NvbChzZWxmLCB0cmFucyk6Ci0gICAgcHJvdCA9IFRCaW5hcnlQcm90b2NvbCh0cmFucywgc2VsZi5zdHJpY3RSZWFkLCBzZWxmLnN0cmljdFdyaXRlKQotICAgIHJldHVybiBwcm90CisgICAgZGVmIGdldFByb3RvY29sKHNlbGYsIHRyYW5zKToKKyAgICAgICAgcHJvdCA9IFRCaW5hcnlQcm90b2NvbCh0cmFucywgc2VsZi5zdHJpY3RSZWFkLCBzZWxmLnN0cmljdFdyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19sZW5ndGhfbGltaXQ9c2VsZi5zdHJpbmdfbGVuZ3RoX2xpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcl9sZW5ndGhfbGltaXQ9c2VsZi5jb250YWluZXJfbGVuZ3RoX2xpbWl0KQorICAgICAgICByZXR1cm4gcHJvdAogCiAKIGNsYXNzIFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKFRCaW5hcnlQcm90b2NvbCk6Ci0gICIiIkMtQWNjZWxlcmF0ZWQgdmVyc2lvbiBvZiBUQmluYXJ5UHJvdG9jb2wuCisgICAgIiIiQy1BY2NlbGVyYXRlZCB2ZXJzaW9uIG9mIFRCaW5hcnlQcm90b2NvbC4KIAotICBUaGlzIGNsYXNzIGRvZXMgbm90IG92ZXJyaWRlIGFueSBvZiBUQmluYXJ5UHJvdG9jb2wncyBtZXRob2RzLAotICBidXQgdGhlIGdlbmVyYXRlZCBjb2RlIHJlY29nbml6ZXMgaXQgZGlyZWN0bHkgYW5kIHdpbGwgY2FsbCBpbnRvCi0gIG91ciBDIG1vZHVsZSB0byBkbyB0aGUgZW5jb2RpbmcsIGJ5cGFzc2luZyB0aGlzIG9iamVjdCBlbnRpcmVseS4KLSAgV2UgaW5oZXJpdCBmcm9tIFRCaW5hcnlQcm90b2NvbCBzbyB0aGF0IHRoZSBub3JtYWwgVEJpbmFyeVByb3RvY29sCi0gIGVuY29kaW5nIGNhbiBoYXBwZW4gaWYgdGhlIGZhc3RiaW5hcnkgbW9kdWxlIGRvZXNuJ3Qgd29yayBmb3Igc29tZQotICByZWFzb24uICAoVE9ETyhkcmVpc3MpOiBNYWtlIHRoaXMgaGFwcGVuIHNhbmVseSBpbiBtb3JlIGNhc2VzLikKKyAgICBUaGlzIGNsYXNzIGRvZXMgbm90IG92ZXJyaWRlIGFueSBvZiBUQmluYXJ5UHJvdG9jb2wncyBtZXRob2RzLAorICAgIGJ1dCB0aGUgZ2VuZXJhdGVkIGNvZGUgcmVjb2duaXplcyBpdCBkaXJlY3RseSBhbmQgd2lsbCBjYWxsIGludG8KKyAgICBvdXIgQyBtb2R1bGUgdG8gZG8gdGhlIGVuY29kaW5nLCBieXBhc3NpbmcgdGhpcyBvYmplY3QgZW50aXJlbHkuCisgICAgV2UgaW5oZXJpdCBmcm9tIFRCaW5hcnlQcm90b2NvbCBzbyB0aGF0IHRoZSBub3JtYWwgVEJpbmFyeVByb3RvY29sCisgICAgZW5jb2RpbmcgY2FuIGhhcHBlbiBpZiB0aGUgZmFzdGJpbmFyeSBtb2R1bGUgZG9lc24ndCB3b3JrIGZvciBzb21lCisgICAgcmVhc29uLiAgKFRPRE8oZHJlaXNzKTogTWFrZSB0aGlzIGhhcHBlbiBzYW5lbHkgaW4gbW9yZSBjYXNlcy4pCisgICAgVG8gZGlzYWJsZSB0aGlzIGJlaGF2aW9yLCBwYXNzIGZhbGxiYWNrPUZhbHNlIGNvbnN0cnVjdG9yIGFyZ3VtZW50LgogCi0gIEluIG9yZGVyIHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBDIG1vZHVsZSwganVzdCB1c2UKLSAgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgaW5zdGVhZCBvZiBUQmluYXJ5UHJvdG9jb2wuCisgICAgSW4gb3JkZXIgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIEMgbW9kdWxlLCBqdXN0IHVzZQorICAgIFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIGluc3RlYWQgb2YgVEJpbmFyeVByb3RvY29sLgogCi0gIE5PVEU6ICBUaGlzIGNvZGUgd2FzIGNvbnRyaWJ1dGVkIGJ5IGFuIGV4dGVybmFsIGRldmVsb3Blci4KLSAgICAgICAgIFRoZSBpbnRlcm5hbCBUaHJpZnQgdGVhbSBoYXMgcmV2aWV3ZWQgYW5kIHRlc3RlZCBpdCwKLSAgICAgICAgIGJ1dCB3ZSBjYW5ub3QgZ3VhcmFudGVlIHRoYXQgaXQgaXMgcHJvZHVjdGlvbi1yZWFkeS4KLSAgICAgICAgIFBsZWFzZSBmZWVsIGZyZWUgdG8gcmVwb3J0IGJ1Z3MgYW5kL29yIHN1Y2Nlc3Mgc3RvcmllcwotICAgICAgICAgdG8gdGhlIHB1YmxpYyBtYWlsaW5nIGxpc3QuCi0gICIiIgotICBwYXNzCisgICAgTk9URTogIFRoaXMgY29kZSB3YXMgY29udHJpYnV0ZWQgYnkgYW4gZXh0ZXJuYWwgZGV2ZWxvcGVyLgorICAgICAgICAgICBUaGUgaW50ZXJuYWwgVGhyaWZ0IHRlYW0gaGFzIHJldmlld2VkIGFuZCB0ZXN0ZWQgaXQsCisgICAgICAgICAgIGJ1dCB3ZSBjYW5ub3QgZ3VhcmFudGVlIHRoYXQgaXQgaXMgcHJvZHVjdGlvbi1yZWFkeS4KKyAgICAgICAgICAgUGxlYXNlIGZlZWwgZnJlZSB0byByZXBvcnQgYnVncyBhbmQvb3Igc3VjY2VzcyBzdG9yaWVzCisgICAgICAgICAgIHRvIHRoZSBwdWJsaWMgbWFpbGluZyBsaXN0LgorICAgICIiIgorICAgIHBhc3MKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBmYWxsYmFjayA9IGt3YXJncy5wb3AoJ2ZhbGxiYWNrJywgVHJ1ZSkKKyAgICAgICAgc3VwZXIoVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQsIHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3YXJncykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IGZhc3RiaW5hcnkKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgaWYgbm90IGZhbGxiYWNrOgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9mYXN0X2RlY29kZSA9IGZhc3RiaW5hcnkuZGVjb2RlX2JpbmFyeQorICAgICAgICAgICAgc2VsZi5fZmFzdF9lbmNvZGUgPSBmYXN0YmluYXJ5LmVuY29kZV9iaW5hcnkKIAogCi1jbGFzcyBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3Rvcnk6Ci0gIGRlZiBnZXRQcm90b2NvbChzZWxmLCB0cmFucyk6Ci0gICAgcmV0dXJuIFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKHRyYW5zKQorY2xhc3MgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsCisgICAgICAgICAgICAgICAgIHN0cmluZ19sZW5ndGhfbGltaXQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgY29udGFpbmVyX2xlbmd0aF9saW1pdD1Ob25lLAorICAgICAgICAgICAgICAgICBmYWxsYmFjaz1UcnVlKToKKyAgICAgICAgc2VsZi5zdHJpbmdfbGVuZ3RoX2xpbWl0ID0gc3RyaW5nX2xlbmd0aF9saW1pdAorICAgICAgICBzZWxmLmNvbnRhaW5lcl9sZW5ndGhfbGltaXQgPSBjb250YWluZXJfbGVuZ3RoX2xpbWl0CisgICAgICAgIHNlbGYuX2ZhbGxiYWNrID0gZmFsbGJhY2sKKworICAgIGRlZiBnZXRQcm90b2NvbChzZWxmLCB0cmFucyk6CisgICAgICAgIHJldHVybiBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCgKKyAgICAgICAgICAgIHRyYW5zLAorICAgICAgICAgICAgc3RyaW5nX2xlbmd0aF9saW1pdD1zZWxmLnN0cmluZ19sZW5ndGhfbGltaXQsCisgICAgICAgICAgICBjb250YWluZXJfbGVuZ3RoX2xpbWl0PXNlbGYuY29udGFpbmVyX2xlbmd0aF9saW1pdCwKKyAgICAgICAgICAgIGZhbGxiYWNrPXNlbGYuX2ZhbGxiYWNrKQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLnB5IGIvbGliL3B5L3NyYy9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLnB5CmluZGV4IDcwNTRhYjAuLmU0ODVjZmYgMTAwNjQ0Ci0tLSBhL2xpYi9weS9zcmMvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5weQorKysgYi9saWIvcHkvc3JjL3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wucHkKQEAgLTE3LDkgKzE3LDExIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1mcm9tIFRQcm90b2NvbCBpbXBvcnQgKgorZnJvbSAuVFByb3RvY29sIGltcG9ydCBUVHlwZSwgVFByb3RvY29sQmFzZSwgVFByb3RvY29sRXhjZXB0aW9uLCBjaGVja0ludGVnZXJMaW1pdHMKIGZyb20gc3RydWN0IGltcG9ydCBwYWNrLCB1bnBhY2sKIAorZnJvbSAuLmNvbXBhdCBpbXBvcnQgYmluYXJ5X3RvX3N0ciwgc3RyX3RvX2JpbmFyeQorCiBfX2FsbF9fID0gWydUQ29tcGFjdFByb3RvY29sJywgJ1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5J10KIAogQ0xFQVIgPSAwCkBAIC0zNCwzNzIgKzM2LDQ0MCBAQAogCiAKIGRlZiBtYWtlX2hlbHBlcih2X2Zyb20sIGNvbnRhaW5lcik6Ci0gIGRlZiBoZWxwZXIoZnVuYyk6Ci0gICAgZGVmIG5lc3RlZChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgotICAgICAgYXNzZXJ0IHNlbGYuc3RhdGUgaW4gKHZfZnJvbSwgY29udGFpbmVyKSwgKHNlbGYuc3RhdGUsIHZfZnJvbSwgY29udGFpbmVyKQotICAgICAgcmV0dXJuIGZ1bmMoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKQotICAgIHJldHVybiBuZXN0ZWQKLSAgcmV0dXJuIGhlbHBlcgorICAgIGRlZiBoZWxwZXIoZnVuYyk6CisgICAgICAgIGRlZiBuZXN0ZWQoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgICAgIGFzc2VydCBzZWxmLnN0YXRlIGluICh2X2Zyb20sIGNvbnRhaW5lciksIChzZWxmLnN0YXRlLCB2X2Zyb20sIGNvbnRhaW5lcikKKyAgICAgICAgICAgIHJldHVybiBmdW5jKHNlbGYsICphcmdzLCAqKmt3YXJncykKKyAgICAgICAgcmV0dXJuIG5lc3RlZAorICAgIHJldHVybiBoZWxwZXIKKworCiB3cml0ZXIgPSBtYWtlX2hlbHBlcihWQUxVRV9XUklURSwgQ09OVEFJTkVSX1dSSVRFKQogcmVhZGVyID0gbWFrZV9oZWxwZXIoVkFMVUVfUkVBRCwgQ09OVEFJTkVSX1JFQUQpCiAKIAogZGVmIG1ha2VaaWdaYWcobiwgYml0cyk6Ci0gIGNoZWNrSW50ZWdlckxpbWl0cyhuLCBiaXRzKQotICByZXR1cm4gKG4gPDwgMSkgXiAobiA+PiAoYml0cyAtIDEpKQorICAgIGNoZWNrSW50ZWdlckxpbWl0cyhuLCBiaXRzKQorICAgIHJldHVybiAobiA8PCAxKSBeIChuID4+IChiaXRzIC0gMSkpCiAKIAogZGVmIGZyb21aaWdaYWcobik6Ci0gIHJldHVybiAobiA+PiAxKSBeIC0obiAmIDEpCisgICAgcmV0dXJuIChuID4+IDEpIF4gLShuICYgMSkKIAogCiBkZWYgd3JpdGVWYXJpbnQodHJhbnMsIG4pOgotICBvdXQgPSBbXQotICB3aGlsZSBUcnVlOgotICAgIGlmIG4gJiB+MHg3ZiA9PSAwOgotICAgICAgb3V0LmFwcGVuZChuKQotICAgICAgYnJlYWsKLSAgICBlbHNlOgotICAgICAgb3V0LmFwcGVuZCgobiAmIDB4ZmYpIHwgMHg4MCkKLSAgICAgIG4gPSBuID4+IDcKLSAgdHJhbnMud3JpdGUoJycuam9pbihtYXAoY2hyLCBvdXQpKSkKKyAgICBvdXQgPSBieXRlYXJyYXkoKQorICAgIHdoaWxlIFRydWU6CisgICAgICAgIGlmIG4gJiB+MHg3ZiA9PSAwOgorICAgICAgICAgICAgb3V0LmFwcGVuZChuKQorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG91dC5hcHBlbmQoKG4gJiAweGZmKSB8IDB4ODApCisgICAgICAgICAgICBuID0gbiA+PiA3CisgICAgdHJhbnMud3JpdGUoYnl0ZXMob3V0KSkKIAogCiBkZWYgcmVhZFZhcmludCh0cmFucyk6Ci0gIHJlc3VsdCA9IDAKLSAgc2hpZnQgPSAwCi0gIHdoaWxlIFRydWU6Ci0gICAgeCA9IHRyYW5zLnJlYWRBbGwoMSkKLSAgICBieXRlID0gb3JkKHgpCi0gICAgcmVzdWx0IHw9IChieXRlICYgMHg3ZikgPDwgc2hpZnQKLSAgICBpZiBieXRlID4+IDcgPT0gMDoKLSAgICAgIHJldHVybiByZXN1bHQKLSAgICBzaGlmdCArPSA3CisgICAgcmVzdWx0ID0gMAorICAgIHNoaWZ0ID0gMAorICAgIHdoaWxlIFRydWU6CisgICAgICAgIHggPSB0cmFucy5yZWFkQWxsKDEpCisgICAgICAgIGJ5dGUgPSBvcmQoeCkKKyAgICAgICAgcmVzdWx0IHw9IChieXRlICYgMHg3ZikgPDwgc2hpZnQKKyAgICAgICAgaWYgYnl0ZSA+PiA3ID09IDA6CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0CisgICAgICAgIHNoaWZ0ICs9IDcKIAogCi1jbGFzcyBDb21wYWN0VHlwZToKLSAgU1RPUCA9IDB4MDAKLSAgVFJVRSA9IDB4MDEKLSAgRkFMU0UgPSAweDAyCi0gIEJZVEUgPSAweDAzCi0gIEkxNiA9IDB4MDQKLSAgSTMyID0gMHgwNQotICBJNjQgPSAweDA2Ci0gIERPVUJMRSA9IDB4MDcKLSAgQklOQVJZID0gMHgwOAotICBMSVNUID0gMHgwOQotICBTRVQgPSAweDBBCi0gIE1BUCA9IDB4MEIKLSAgU1RSVUNUID0gMHgwQworY2xhc3MgQ29tcGFjdFR5cGUob2JqZWN0KToKKyAgICBTVE9QID0gMHgwMAorICAgIFRSVUUgPSAweDAxCisgICAgRkFMU0UgPSAweDAyCisgICAgQllURSA9IDB4MDMKKyAgICBJMTYgPSAweDA0CisgICAgSTMyID0gMHgwNQorICAgIEk2NCA9IDB4MDYKKyAgICBET1VCTEUgPSAweDA3CisgICAgQklOQVJZID0gMHgwOAorICAgIExJU1QgPSAweDA5CisgICAgU0VUID0gMHgwQQorICAgIE1BUCA9IDB4MEIKKyAgICBTVFJVQ1QgPSAweDBDCiAKLUNUWVBFUyA9IHtUVHlwZS5TVE9QOiBDb21wYWN0VHlwZS5TVE9QLAotICAgICAgICAgIFRUeXBlLkJPT0w6IENvbXBhY3RUeXBlLlRSVUUsICAjIHVzZWQgZm9yIGNvbGxlY3Rpb24KLSAgICAgICAgICBUVHlwZS5CWVRFOiBDb21wYWN0VHlwZS5CWVRFLAotICAgICAgICAgIFRUeXBlLkkxNjogQ29tcGFjdFR5cGUuSTE2LAotICAgICAgICAgIFRUeXBlLkkzMjogQ29tcGFjdFR5cGUuSTMyLAotICAgICAgICAgIFRUeXBlLkk2NDogQ29tcGFjdFR5cGUuSTY0LAotICAgICAgICAgIFRUeXBlLkRPVUJMRTogQ29tcGFjdFR5cGUuRE9VQkxFLAotICAgICAgICAgIFRUeXBlLlNUUklORzogQ29tcGFjdFR5cGUuQklOQVJZLAotICAgICAgICAgIFRUeXBlLlNUUlVDVDogQ29tcGFjdFR5cGUuU1RSVUNULAotICAgICAgICAgIFRUeXBlLkxJU1Q6IENvbXBhY3RUeXBlLkxJU1QsCi0gICAgICAgICAgVFR5cGUuU0VUOiBDb21wYWN0VHlwZS5TRVQsCi0gICAgICAgICAgVFR5cGUuTUFQOiBDb21wYWN0VHlwZS5NQVAKLSAgICAgICAgICB9CisKK0NUWVBFUyA9IHsKKyAgICBUVHlwZS5TVE9QOiBDb21wYWN0VHlwZS5TVE9QLAorICAgIFRUeXBlLkJPT0w6IENvbXBhY3RUeXBlLlRSVUUsICAjIHVzZWQgZm9yIGNvbGxlY3Rpb24KKyAgICBUVHlwZS5CWVRFOiBDb21wYWN0VHlwZS5CWVRFLAorICAgIFRUeXBlLkkxNjogQ29tcGFjdFR5cGUuSTE2LAorICAgIFRUeXBlLkkzMjogQ29tcGFjdFR5cGUuSTMyLAorICAgIFRUeXBlLkk2NDogQ29tcGFjdFR5cGUuSTY0LAorICAgIFRUeXBlLkRPVUJMRTogQ29tcGFjdFR5cGUuRE9VQkxFLAorICAgIFRUeXBlLlNUUklORzogQ29tcGFjdFR5cGUuQklOQVJZLAorICAgIFRUeXBlLlNUUlVDVDogQ29tcGFjdFR5cGUuU1RSVUNULAorICAgIFRUeXBlLkxJU1Q6IENvbXBhY3RUeXBlLkxJU1QsCisgICAgVFR5cGUuU0VUOiBDb21wYWN0VHlwZS5TRVQsCisgICAgVFR5cGUuTUFQOiBDb21wYWN0VHlwZS5NQVAsCit9CiAKIFRUWVBFUyA9IHt9CiBmb3IgaywgdiBpbiBDVFlQRVMuaXRlbXMoKToKLSAgVFRZUEVTW3ZdID0gaworICAgIFRUWVBFU1t2XSA9IGsKIFRUWVBFU1tDb21wYWN0VHlwZS5GQUxTRV0gPSBUVHlwZS5CT09MCiBkZWwgawogZGVsIHYKIAogCiBjbGFzcyBUQ29tcGFjdFByb3RvY29sKFRQcm90b2NvbEJhc2UpOgotICAiIiJDb21wYWN0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBUaHJpZnQgcHJvdG9jb2wgZHJpdmVyLiIiIgorICAgICIiIkNvbXBhY3QgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRocmlmdCBwcm90b2NvbCBkcml2ZXIuIiIiCiAKLSAgUFJPVE9DT0xfSUQgPSAweDgyCi0gIFZFUlNJT04gPSAxCi0gIFZFUlNJT05fTUFTSyA9IDB4MWYKLSAgVFlQRV9NQVNLID0gMHhlMAotICBUWVBFX0JJVFMgPSAweDA3Ci0gIFRZUEVfU0hJRlRfQU1PVU5UID0gNQorICAgIFBST1RPQ09MX0lEID0gMHg4MgorICAgIFZFUlNJT04gPSAxCisgICAgVkVSU0lPTl9NQVNLID0gMHgxZgorICAgIFRZUEVfTUFTSyA9IDB4ZTAKKyAgICBUWVBFX0JJVFMgPSAweDA3CisgICAgVFlQRV9TSElGVF9BTU9VTlQgPSA1CiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsIHRyYW5zKToKLSAgICBUUHJvdG9jb2xCYXNlLl9faW5pdF9fKHNlbGYsIHRyYW5zKQotICAgIHNlbGYuc3RhdGUgPSBDTEVBUgotICAgIHNlbGYuX19sYXN0X2ZpZCA9IDAKLSAgICBzZWxmLl9fYm9vbF9maWQgPSBOb25lCi0gICAgc2VsZi5fX2Jvb2xfdmFsdWUgPSBOb25lCi0gICAgc2VsZi5fX3N0cnVjdHMgPSBbXQotICAgIHNlbGYuX19jb250YWluZXJzID0gW10KKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHJhbnMsCisgICAgICAgICAgICAgICAgIHN0cmluZ19sZW5ndGhfbGltaXQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgY29udGFpbmVyX2xlbmd0aF9saW1pdD1Ob25lKToKKyAgICAgICAgVFByb3RvY29sQmFzZS5fX2luaXRfXyhzZWxmLCB0cmFucykKKyAgICAgICAgc2VsZi5zdGF0ZSA9IENMRUFSCisgICAgICAgIHNlbGYuX19sYXN0X2ZpZCA9IDAKKyAgICAgICAgc2VsZi5fX2Jvb2xfZmlkID0gTm9uZQorICAgICAgICBzZWxmLl9fYm9vbF92YWx1ZSA9IE5vbmUKKyAgICAgICAgc2VsZi5fX3N0cnVjdHMgPSBbXQorICAgICAgICBzZWxmLl9fY29udGFpbmVycyA9IFtdCisgICAgICAgIHNlbGYuc3RyaW5nX2xlbmd0aF9saW1pdCA9IHN0cmluZ19sZW5ndGhfbGltaXQKKyAgICAgICAgc2VsZi5jb250YWluZXJfbGVuZ3RoX2xpbWl0ID0gY29udGFpbmVyX2xlbmd0aF9saW1pdAogCi0gIGRlZiBfX3dyaXRlVmFyaW50KHNlbGYsIG4pOgotICAgIHdyaXRlVmFyaW50KHNlbGYudHJhbnMsIG4pCisgICAgZGVmIF9jaGVja19zdHJpbmdfbGVuZ3RoKHNlbGYsIGxlbmd0aCk6CisgICAgICAgIHNlbGYuX2NoZWNrX2xlbmd0aChzZWxmLnN0cmluZ19sZW5ndGhfbGltaXQsIGxlbmd0aCkKIAotICBkZWYgd3JpdGVNZXNzYWdlQmVnaW4oc2VsZiwgbmFtZSwgdHlwZSwgc2VxaWQpOgotICAgIGFzc2VydCBzZWxmLnN0YXRlID09IENMRUFSCi0gICAgc2VsZi5fX3dyaXRlVUJ5dGUoc2VsZi5QUk9UT0NPTF9JRCkKLSAgICBzZWxmLl9fd3JpdGVVQnl0ZShzZWxmLlZFUlNJT04gfCAodHlwZSA8PCBzZWxmLlRZUEVfU0hJRlRfQU1PVU5UKSkKLSAgICBzZWxmLl9fd3JpdGVWYXJpbnQoc2VxaWQpCi0gICAgc2VsZi5fX3dyaXRlU3RyaW5nKG5hbWUpCi0gICAgc2VsZi5zdGF0ZSA9IFZBTFVFX1dSSVRFCisgICAgZGVmIF9jaGVja19jb250YWluZXJfbGVuZ3RoKHNlbGYsIGxlbmd0aCk6CisgICAgICAgIHNlbGYuX2NoZWNrX2xlbmd0aChzZWxmLmNvbnRhaW5lcl9sZW5ndGhfbGltaXQsIGxlbmd0aCkKIAotICBkZWYgd3JpdGVNZXNzYWdlRW5kKHNlbGYpOgotICAgIGFzc2VydCBzZWxmLnN0YXRlID09IFZBTFVFX1dSSVRFCi0gICAgc2VsZi5zdGF0ZSA9IENMRUFSCisgICAgZGVmIF9fd3JpdGVWYXJpbnQoc2VsZiwgbik6CisgICAgICAgIHdyaXRlVmFyaW50KHNlbGYudHJhbnMsIG4pCiAKLSAgZGVmIHdyaXRlU3RydWN0QmVnaW4oc2VsZiwgbmFtZSk6Ci0gICAgYXNzZXJ0IHNlbGYuc3RhdGUgaW4gKENMRUFSLCBDT05UQUlORVJfV1JJVEUsIFZBTFVFX1dSSVRFKSwgc2VsZi5zdGF0ZQotICAgIHNlbGYuX19zdHJ1Y3RzLmFwcGVuZCgoc2VsZi5zdGF0ZSwgc2VsZi5fX2xhc3RfZmlkKSkKLSAgICBzZWxmLnN0YXRlID0gRklFTERfV1JJVEUKLSAgICBzZWxmLl9fbGFzdF9maWQgPSAwCisgICAgZGVmIHdyaXRlTWVzc2FnZUJlZ2luKHNlbGYsIG5hbWUsIHR5cGUsIHNlcWlkKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuc3RhdGUgPT0gQ0xFQVIKKyAgICAgICAgc2VsZi5fX3dyaXRlVUJ5dGUoc2VsZi5QUk9UT0NPTF9JRCkKKyAgICAgICAgc2VsZi5fX3dyaXRlVUJ5dGUoc2VsZi5WRVJTSU9OIHwgKHR5cGUgPDwgc2VsZi5UWVBFX1NISUZUX0FNT1VOVCkpCisgICAgICAgIHNlbGYuX193cml0ZVZhcmludChzZXFpZCkKKyAgICAgICAgc2VsZi5fX3dyaXRlQmluYXJ5KHN0cl90b19iaW5hcnkobmFtZSkpCisgICAgICAgIHNlbGYuc3RhdGUgPSBWQUxVRV9XUklURQogCi0gIGRlZiB3cml0ZVN0cnVjdEVuZChzZWxmKToKLSAgICBhc3NlcnQgc2VsZi5zdGF0ZSA9PSBGSUVMRF9XUklURQotICAgIHNlbGYuc3RhdGUsIHNlbGYuX19sYXN0X2ZpZCA9IHNlbGYuX19zdHJ1Y3RzLnBvcCgpCisgICAgZGVmIHdyaXRlTWVzc2FnZUVuZChzZWxmKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuc3RhdGUgPT0gVkFMVUVfV1JJVEUKKyAgICAgICAgc2VsZi5zdGF0ZSA9IENMRUFSCiAKLSAgZGVmIHdyaXRlRmllbGRTdG9wKHNlbGYpOgotICAgIHNlbGYuX193cml0ZUJ5dGUoMCkKKyAgICBkZWYgd3JpdGVTdHJ1Y3RCZWdpbihzZWxmLCBuYW1lKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuc3RhdGUgaW4gKENMRUFSLCBDT05UQUlORVJfV1JJVEUsIFZBTFVFX1dSSVRFKSwgc2VsZi5zdGF0ZQorICAgICAgICBzZWxmLl9fc3RydWN0cy5hcHBlbmQoKHNlbGYuc3RhdGUsIHNlbGYuX19sYXN0X2ZpZCkpCisgICAgICAgIHNlbGYuc3RhdGUgPSBGSUVMRF9XUklURQorICAgICAgICBzZWxmLl9fbGFzdF9maWQgPSAwCiAKLSAgZGVmIF9fd3JpdGVGaWVsZEhlYWRlcihzZWxmLCB0eXBlLCBmaWQpOgotICAgIGRlbHRhID0gZmlkIC0gc2VsZi5fX2xhc3RfZmlkCi0gICAgaWYgMCA8IGRlbHRhIDw9IDE1OgotICAgICAgc2VsZi5fX3dyaXRlVUJ5dGUoZGVsdGEgPDwgNCB8IHR5cGUpCi0gICAgZWxzZToKLSAgICAgIHNlbGYuX193cml0ZUJ5dGUodHlwZSkKLSAgICAgIHNlbGYuX193cml0ZUkxNihmaWQpCi0gICAgc2VsZi5fX2xhc3RfZmlkID0gZmlkCisgICAgZGVmIHdyaXRlU3RydWN0RW5kKHNlbGYpOgorICAgICAgICBhc3NlcnQgc2VsZi5zdGF0ZSA9PSBGSUVMRF9XUklURQorICAgICAgICBzZWxmLnN0YXRlLCBzZWxmLl9fbGFzdF9maWQgPSBzZWxmLl9fc3RydWN0cy5wb3AoKQogCi0gIGRlZiB3cml0ZUZpZWxkQmVnaW4oc2VsZiwgbmFtZSwgdHlwZSwgZmlkKToKLSAgICBhc3NlcnQgc2VsZi5zdGF0ZSA9PSBGSUVMRF9XUklURSwgc2VsZi5zdGF0ZQotICAgIGlmIHR5cGUgPT0gVFR5cGUuQk9PTDoKLSAgICAgIHNlbGYuc3RhdGUgPSBCT09MX1dSSVRFCi0gICAgICBzZWxmLl9fYm9vbF9maWQgPSBmaWQKLSAgICBlbHNlOgotICAgICAgc2VsZi5zdGF0ZSA9IFZBTFVFX1dSSVRFCi0gICAgICBzZWxmLl9fd3JpdGVGaWVsZEhlYWRlcihDVFlQRVNbdHlwZV0sIGZpZCkKKyAgICBkZWYgd3JpdGVGaWVsZFN0b3Aoc2VsZik6CisgICAgICAgIHNlbGYuX193cml0ZUJ5dGUoMCkKIAotICBkZWYgd3JpdGVGaWVsZEVuZChzZWxmKToKLSAgICBhc3NlcnQgc2VsZi5zdGF0ZSBpbiAoVkFMVUVfV1JJVEUsIEJPT0xfV1JJVEUpLCBzZWxmLnN0YXRlCi0gICAgc2VsZi5zdGF0ZSA9IEZJRUxEX1dSSVRFCisgICAgZGVmIF9fd3JpdGVGaWVsZEhlYWRlcihzZWxmLCB0eXBlLCBmaWQpOgorICAgICAgICBkZWx0YSA9IGZpZCAtIHNlbGYuX19sYXN0X2ZpZAorICAgICAgICBpZiAwIDwgZGVsdGEgPD0gMTU6CisgICAgICAgICAgICBzZWxmLl9fd3JpdGVVQnl0ZShkZWx0YSA8PCA0IHwgdHlwZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX193cml0ZUJ5dGUodHlwZSkKKyAgICAgICAgICAgIHNlbGYuX193cml0ZUkxNihmaWQpCisgICAgICAgIHNlbGYuX19sYXN0X2ZpZCA9IGZpZAogCi0gIGRlZiBfX3dyaXRlVUJ5dGUoc2VsZiwgYnl0ZSk6Ci0gICAgc2VsZi50cmFucy53cml0ZShwYWNrKCchQicsIGJ5dGUpKQorICAgIGRlZiB3cml0ZUZpZWxkQmVnaW4oc2VsZiwgbmFtZSwgdHlwZSwgZmlkKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuc3RhdGUgPT0gRklFTERfV1JJVEUsIHNlbGYuc3RhdGUKKyAgICAgICAgaWYgdHlwZSA9PSBUVHlwZS5CT09MOgorICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IEJPT0xfV1JJVEUKKyAgICAgICAgICAgIHNlbGYuX19ib29sX2ZpZCA9IGZpZAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IFZBTFVFX1dSSVRFCisgICAgICAgICAgICBzZWxmLl9fd3JpdGVGaWVsZEhlYWRlcihDVFlQRVNbdHlwZV0sIGZpZCkKIAotICBkZWYgX193cml0ZUJ5dGUoc2VsZiwgYnl0ZSk6Ci0gICAgc2VsZi50cmFucy53cml0ZShwYWNrKCchYicsIGJ5dGUpKQorICAgIGRlZiB3cml0ZUZpZWxkRW5kKHNlbGYpOgorICAgICAgICBhc3NlcnQgc2VsZi5zdGF0ZSBpbiAoVkFMVUVfV1JJVEUsIEJPT0xfV1JJVEUpLCBzZWxmLnN0YXRlCisgICAgICAgIHNlbGYuc3RhdGUgPSBGSUVMRF9XUklURQogCi0gIGRlZiBfX3dyaXRlSTE2KHNlbGYsIGkxNik6Ci0gICAgc2VsZi5fX3dyaXRlVmFyaW50KG1ha2VaaWdaYWcoaTE2LCAxNikpCisgICAgZGVmIF9fd3JpdGVVQnl0ZShzZWxmLCBieXRlKToKKyAgICAgICAgc2VsZi50cmFucy53cml0ZShwYWNrKCchQicsIGJ5dGUpKQogCi0gIGRlZiBfX3dyaXRlU2l6ZShzZWxmLCBpMzIpOgotICAgIHNlbGYuX193cml0ZVZhcmludChpMzIpCisgICAgZGVmIF9fd3JpdGVCeXRlKHNlbGYsIGJ5dGUpOgorICAgICAgICBzZWxmLnRyYW5zLndyaXRlKHBhY2soJyFiJywgYnl0ZSkpCiAKLSAgZGVmIHdyaXRlQ29sbGVjdGlvbkJlZ2luKHNlbGYsIGV0eXBlLCBzaXplKToKLSAgICBhc3NlcnQgc2VsZi5zdGF0ZSBpbiAoVkFMVUVfV1JJVEUsIENPTlRBSU5FUl9XUklURSksIHNlbGYuc3RhdGUKLSAgICBpZiBzaXplIDw9IDE0OgotICAgICAgc2VsZi5fX3dyaXRlVUJ5dGUoc2l6ZSA8PCA0IHwgQ1RZUEVTW2V0eXBlXSkKLSAgICBlbHNlOgotICAgICAgc2VsZi5fX3dyaXRlVUJ5dGUoMHhmMCB8IENUWVBFU1tldHlwZV0pCi0gICAgICBzZWxmLl9fd3JpdGVTaXplKHNpemUpCi0gICAgc2VsZi5fX2NvbnRhaW5lcnMuYXBwZW5kKHNlbGYuc3RhdGUpCi0gICAgc2VsZi5zdGF0ZSA9IENPTlRBSU5FUl9XUklURQotICB3cml0ZVNldEJlZ2luID0gd3JpdGVDb2xsZWN0aW9uQmVnaW4KLSAgd3JpdGVMaXN0QmVnaW4gPSB3cml0ZUNvbGxlY3Rpb25CZWdpbgorICAgIGRlZiBfX3dyaXRlSTE2KHNlbGYsIGkxNik6CisgICAgICAgIHNlbGYuX193cml0ZVZhcmludChtYWtlWmlnWmFnKGkxNiwgMTYpKQogCi0gIGRlZiB3cml0ZU1hcEJlZ2luKHNlbGYsIGt0eXBlLCB2dHlwZSwgc2l6ZSk6Ci0gICAgYXNzZXJ0IHNlbGYuc3RhdGUgaW4gKFZBTFVFX1dSSVRFLCBDT05UQUlORVJfV1JJVEUpLCBzZWxmLnN0YXRlCi0gICAgaWYgc2l6ZSA9PSAwOgotICAgICAgc2VsZi5fX3dyaXRlQnl0ZSgwKQotICAgIGVsc2U6Ci0gICAgICBzZWxmLl9fd3JpdGVTaXplKHNpemUpCi0gICAgICBzZWxmLl9fd3JpdGVVQnl0ZShDVFlQRVNba3R5cGVdIDw8IDQgfCBDVFlQRVNbdnR5cGVdKQotICAgIHNlbGYuX19jb250YWluZXJzLmFwcGVuZChzZWxmLnN0YXRlKQotICAgIHNlbGYuc3RhdGUgPSBDT05UQUlORVJfV1JJVEUKKyAgICBkZWYgX193cml0ZVNpemUoc2VsZiwgaTMyKToKKyAgICAgICAgc2VsZi5fX3dyaXRlVmFyaW50KGkzMikKIAotICBkZWYgd3JpdGVDb2xsZWN0aW9uRW5kKHNlbGYpOgotICAgIGFzc2VydCBzZWxmLnN0YXRlID09IENPTlRBSU5FUl9XUklURSwgc2VsZi5zdGF0ZQotICAgIHNlbGYuc3RhdGUgPSBzZWxmLl9fY29udGFpbmVycy5wb3AoKQotICB3cml0ZU1hcEVuZCA9IHdyaXRlQ29sbGVjdGlvbkVuZAotICB3cml0ZVNldEVuZCA9IHdyaXRlQ29sbGVjdGlvbkVuZAotICB3cml0ZUxpc3RFbmQgPSB3cml0ZUNvbGxlY3Rpb25FbmQKKyAgICBkZWYgd3JpdGVDb2xsZWN0aW9uQmVnaW4oc2VsZiwgZXR5cGUsIHNpemUpOgorICAgICAgICBhc3NlcnQgc2VsZi5zdGF0ZSBpbiAoVkFMVUVfV1JJVEUsIENPTlRBSU5FUl9XUklURSksIHNlbGYuc3RhdGUKKyAgICAgICAgaWYgc2l6ZSA8PSAxNDoKKyAgICAgICAgICAgIHNlbGYuX193cml0ZVVCeXRlKHNpemUgPDwgNCB8IENUWVBFU1tldHlwZV0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9fd3JpdGVVQnl0ZSgweGYwIHwgQ1RZUEVTW2V0eXBlXSkKKyAgICAgICAgICAgIHNlbGYuX193cml0ZVNpemUoc2l6ZSkKKyAgICAgICAgc2VsZi5fX2NvbnRhaW5lcnMuYXBwZW5kKHNlbGYuc3RhdGUpCisgICAgICAgIHNlbGYuc3RhdGUgPSBDT05UQUlORVJfV1JJVEUKKyAgICB3cml0ZVNldEJlZ2luID0gd3JpdGVDb2xsZWN0aW9uQmVnaW4KKyAgICB3cml0ZUxpc3RCZWdpbiA9IHdyaXRlQ29sbGVjdGlvbkJlZ2luCiAKLSAgZGVmIHdyaXRlQm9vbChzZWxmLCBib29sKToKLSAgICBpZiBzZWxmLnN0YXRlID09IEJPT0xfV1JJVEU6Ci0gICAgICBpZiBib29sOgotICAgICAgICBjdHlwZSA9IENvbXBhY3RUeXBlLlRSVUUKLSAgICAgIGVsc2U6Ci0gICAgICAgIGN0eXBlID0gQ29tcGFjdFR5cGUuRkFMU0UKLSAgICAgIHNlbGYuX193cml0ZUZpZWxkSGVhZGVyKGN0eXBlLCBzZWxmLl9fYm9vbF9maWQpCi0gICAgZWxpZiBzZWxmLnN0YXRlID09IENPTlRBSU5FUl9XUklURToKLSAgICAgIGlmIGJvb2w6Ci0gICAgICAgIHNlbGYuX193cml0ZUJ5dGUoQ29tcGFjdFR5cGUuVFJVRSkKLSAgICAgIGVsc2U6Ci0gICAgICAgIHNlbGYuX193cml0ZUJ5dGUoQ29tcGFjdFR5cGUuRkFMU0UpCi0gICAgZWxzZToKLSAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCJJbnZhbGlkIHN0YXRlIGluIGNvbXBhY3QgcHJvdG9jb2wiKQorICAgIGRlZiB3cml0ZU1hcEJlZ2luKHNlbGYsIGt0eXBlLCB2dHlwZSwgc2l6ZSk6CisgICAgICAgIGFzc2VydCBzZWxmLnN0YXRlIGluIChWQUxVRV9XUklURSwgQ09OVEFJTkVSX1dSSVRFKSwgc2VsZi5zdGF0ZQorICAgICAgICBpZiBzaXplID09IDA6CisgICAgICAgICAgICBzZWxmLl9fd3JpdGVCeXRlKDApCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9fd3JpdGVTaXplKHNpemUpCisgICAgICAgICAgICBzZWxmLl9fd3JpdGVVQnl0ZShDVFlQRVNba3R5cGVdIDw8IDQgfCBDVFlQRVNbdnR5cGVdKQorICAgICAgICBzZWxmLl9fY29udGFpbmVycy5hcHBlbmQoc2VsZi5zdGF0ZSkKKyAgICAgICAgc2VsZi5zdGF0ZSA9IENPTlRBSU5FUl9XUklURQogCi0gIHdyaXRlQnl0ZSA9IHdyaXRlcihfX3dyaXRlQnl0ZSkKLSAgd3JpdGVJMTYgPSB3cml0ZXIoX193cml0ZUkxNikKKyAgICBkZWYgd3JpdGVDb2xsZWN0aW9uRW5kKHNlbGYpOgorICAgICAgICBhc3NlcnQgc2VsZi5zdGF0ZSA9PSBDT05UQUlORVJfV1JJVEUsIHNlbGYuc3RhdGUKKyAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuX19jb250YWluZXJzLnBvcCgpCisgICAgd3JpdGVNYXBFbmQgPSB3cml0ZUNvbGxlY3Rpb25FbmQKKyAgICB3cml0ZVNldEVuZCA9IHdyaXRlQ29sbGVjdGlvbkVuZAorICAgIHdyaXRlTGlzdEVuZCA9IHdyaXRlQ29sbGVjdGlvbkVuZAogCi0gIEB3cml0ZXIKLSAgZGVmIHdyaXRlSTMyKHNlbGYsIGkzMik6Ci0gICAgc2VsZi5fX3dyaXRlVmFyaW50KG1ha2VaaWdaYWcoaTMyLCAzMikpCisgICAgZGVmIHdyaXRlQm9vbChzZWxmLCBib29sKToKKyAgICAgICAgaWYgc2VsZi5zdGF0ZSA9PSBCT09MX1dSSVRFOgorICAgICAgICAgICAgaWYgYm9vbDoKKyAgICAgICAgICAgICAgICBjdHlwZSA9IENvbXBhY3RUeXBlLlRSVUUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgY3R5cGUgPSBDb21wYWN0VHlwZS5GQUxTRQorICAgICAgICAgICAgc2VsZi5fX3dyaXRlRmllbGRIZWFkZXIoY3R5cGUsIHNlbGYuX19ib29sX2ZpZCkKKyAgICAgICAgZWxpZiBzZWxmLnN0YXRlID09IENPTlRBSU5FUl9XUklURToKKyAgICAgICAgICAgIGlmIGJvb2w6CisgICAgICAgICAgICAgICAgc2VsZi5fX3dyaXRlQnl0ZShDb21wYWN0VHlwZS5UUlVFKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLl9fd3JpdGVCeXRlKENvbXBhY3RUeXBlLkZBTFNFKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoIkludmFsaWQgc3RhdGUgaW4gY29tcGFjdCBwcm90b2NvbCIpCiAKLSAgQHdyaXRlcgotICBkZWYgd3JpdGVJNjQoc2VsZiwgaTY0KToKLSAgICBzZWxmLl9fd3JpdGVWYXJpbnQobWFrZVppZ1phZyhpNjQsIDY0KSkKKyAgICB3cml0ZUJ5dGUgPSB3cml0ZXIoX193cml0ZUJ5dGUpCisgICAgd3JpdGVJMTYgPSB3cml0ZXIoX193cml0ZUkxNikKIAotICBAd3JpdGVyCi0gIGRlZiB3cml0ZURvdWJsZShzZWxmLCBkdWIpOgotICAgIHNlbGYudHJhbnMud3JpdGUocGFjaygnPGQnLCBkdWIpKQorICAgIEB3cml0ZXIKKyAgICBkZWYgd3JpdGVJMzIoc2VsZiwgaTMyKToKKyAgICAgICAgc2VsZi5fX3dyaXRlVmFyaW50KG1ha2VaaWdaYWcoaTMyLCAzMikpCiAKLSAgZGVmIF9fd3JpdGVTdHJpbmcoc2VsZiwgcyk6Ci0gICAgc2VsZi5fX3dyaXRlU2l6ZShsZW4ocykpCi0gICAgc2VsZi50cmFucy53cml0ZShzKQotICB3cml0ZVN0cmluZyA9IHdyaXRlcihfX3dyaXRlU3RyaW5nKQorICAgIEB3cml0ZXIKKyAgICBkZWYgd3JpdGVJNjQoc2VsZiwgaTY0KToKKyAgICAgICAgc2VsZi5fX3dyaXRlVmFyaW50KG1ha2VaaWdaYWcoaTY0LCA2NCkpCiAKLSAgZGVmIHJlYWRGaWVsZEJlZ2luKHNlbGYpOgotICAgIGFzc2VydCBzZWxmLnN0YXRlID09IEZJRUxEX1JFQUQsIHNlbGYuc3RhdGUKLSAgICB0eXBlID0gc2VsZi5fX3JlYWRVQnl0ZSgpCi0gICAgaWYgdHlwZSAmIDB4MGYgPT0gVFR5cGUuU1RPUDoKLSAgICAgIHJldHVybiAoTm9uZSwgMCwgMCkKLSAgICBkZWx0YSA9IHR5cGUgPj4gNAotICAgIGlmIGRlbHRhID09IDA6Ci0gICAgICBmaWQgPSBzZWxmLl9fcmVhZEkxNigpCi0gICAgZWxzZToKLSAgICAgIGZpZCA9IHNlbGYuX19sYXN0X2ZpZCArIGRlbHRhCi0gICAgc2VsZi5fX2xhc3RfZmlkID0gZmlkCi0gICAgdHlwZSA9IHR5cGUgJiAweDBmCi0gICAgaWYgdHlwZSA9PSBDb21wYWN0VHlwZS5UUlVFOgotICAgICAgc2VsZi5zdGF0ZSA9IEJPT0xfUkVBRAotICAgICAgc2VsZi5fX2Jvb2xfdmFsdWUgPSBUcnVlCi0gICAgZWxpZiB0eXBlID09IENvbXBhY3RUeXBlLkZBTFNFOgotICAgICAgc2VsZi5zdGF0ZSA9IEJPT0xfUkVBRAotICAgICAgc2VsZi5fX2Jvb2xfdmFsdWUgPSBGYWxzZQotICAgIGVsc2U6Ci0gICAgICBzZWxmLnN0YXRlID0gVkFMVUVfUkVBRAotICAgIHJldHVybiAoTm9uZSwgc2VsZi5fX2dldFRUeXBlKHR5cGUpLCBmaWQpCisgICAgQHdyaXRlcgorICAgIGRlZiB3cml0ZURvdWJsZShzZWxmLCBkdWIpOgorICAgICAgICBzZWxmLnRyYW5zLndyaXRlKHBhY2soJzxkJywgZHViKSkKIAotICBkZWYgcmVhZEZpZWxkRW5kKHNlbGYpOgotICAgIGFzc2VydCBzZWxmLnN0YXRlIGluIChWQUxVRV9SRUFELCBCT09MX1JFQUQpLCBzZWxmLnN0YXRlCi0gICAgc2VsZi5zdGF0ZSA9IEZJRUxEX1JFQUQKKyAgICBkZWYgX193cml0ZUJpbmFyeShzZWxmLCBzKToKKyAgICAgICAgc2VsZi5fX3dyaXRlU2l6ZShsZW4ocykpCisgICAgICAgIHNlbGYudHJhbnMud3JpdGUocykKKyAgICB3cml0ZUJpbmFyeSA9IHdyaXRlcihfX3dyaXRlQmluYXJ5KQogCi0gIGRlZiBfX3JlYWRVQnl0ZShzZWxmKToKLSAgICByZXN1bHQsID0gdW5wYWNrKCchQicsIHNlbGYudHJhbnMucmVhZEFsbCgxKSkKLSAgICByZXR1cm4gcmVzdWx0CisgICAgZGVmIHJlYWRGaWVsZEJlZ2luKHNlbGYpOgorICAgICAgICBhc3NlcnQgc2VsZi5zdGF0ZSA9PSBGSUVMRF9SRUFELCBzZWxmLnN0YXRlCisgICAgICAgIHR5cGUgPSBzZWxmLl9fcmVhZFVCeXRlKCkKKyAgICAgICAgaWYgdHlwZSAmIDB4MGYgPT0gVFR5cGUuU1RPUDoKKyAgICAgICAgICAgIHJldHVybiAoTm9uZSwgMCwgMCkKKyAgICAgICAgZGVsdGEgPSB0eXBlID4+IDQKKyAgICAgICAgaWYgZGVsdGEgPT0gMDoKKyAgICAgICAgICAgIGZpZCA9IHNlbGYuX19yZWFkSTE2KCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZpZCA9IHNlbGYuX19sYXN0X2ZpZCArIGRlbHRhCisgICAgICAgIHNlbGYuX19sYXN0X2ZpZCA9IGZpZAorICAgICAgICB0eXBlID0gdHlwZSAmIDB4MGYKKyAgICAgICAgaWYgdHlwZSA9PSBDb21wYWN0VHlwZS5UUlVFOgorICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IEJPT0xfUkVBRAorICAgICAgICAgICAgc2VsZi5fX2Jvb2xfdmFsdWUgPSBUcnVlCisgICAgICAgIGVsaWYgdHlwZSA9PSBDb21wYWN0VHlwZS5GQUxTRToKKyAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBCT09MX1JFQUQKKyAgICAgICAgICAgIHNlbGYuX19ib29sX3ZhbHVlID0gRmFsc2UKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBWQUxVRV9SRUFECisgICAgICAgIHJldHVybiAoTm9uZSwgc2VsZi5fX2dldFRUeXBlKHR5cGUpLCBmaWQpCiAKLSAgZGVmIF9fcmVhZEJ5dGUoc2VsZik6Ci0gICAgcmVzdWx0LCA9IHVucGFjaygnIWInLCBzZWxmLnRyYW5zLnJlYWRBbGwoMSkpCi0gICAgcmV0dXJuIHJlc3VsdAorICAgIGRlZiByZWFkRmllbGRFbmQoc2VsZik6CisgICAgICAgIGFzc2VydCBzZWxmLnN0YXRlIGluIChWQUxVRV9SRUFELCBCT09MX1JFQUQpLCBzZWxmLnN0YXRlCisgICAgICAgIHNlbGYuc3RhdGUgPSBGSUVMRF9SRUFECiAKLSAgZGVmIF9fcmVhZFZhcmludChzZWxmKToKLSAgICByZXR1cm4gcmVhZFZhcmludChzZWxmLnRyYW5zKQorICAgIGRlZiBfX3JlYWRVQnl0ZShzZWxmKToKKyAgICAgICAgcmVzdWx0LCA9IHVucGFjaygnIUInLCBzZWxmLnRyYW5zLnJlYWRBbGwoMSkpCisgICAgICAgIHJldHVybiByZXN1bHQKIAotICBkZWYgX19yZWFkWmlnWmFnKHNlbGYpOgotICAgIHJldHVybiBmcm9tWmlnWmFnKHNlbGYuX19yZWFkVmFyaW50KCkpCisgICAgZGVmIF9fcmVhZEJ5dGUoc2VsZik6CisgICAgICAgIHJlc3VsdCwgPSB1bnBhY2soJyFiJywgc2VsZi50cmFucy5yZWFkQWxsKDEpKQorICAgICAgICByZXR1cm4gcmVzdWx0CiAKLSAgZGVmIF9fcmVhZFNpemUoc2VsZik6Ci0gICAgcmVzdWx0ID0gc2VsZi5fX3JlYWRWYXJpbnQoKQotICAgIGlmIHJlc3VsdCA8IDA6Ci0gICAgICByYWlzZSBURXhjZXB0aW9uKCJMZW5ndGggPCAwIikKLSAgICByZXR1cm4gcmVzdWx0CisgICAgZGVmIF9fcmVhZFZhcmludChzZWxmKToKKyAgICAgICAgcmV0dXJuIHJlYWRWYXJpbnQoc2VsZi50cmFucykKIAotICBkZWYgcmVhZE1lc3NhZ2VCZWdpbihzZWxmKToKLSAgICBhc3NlcnQgc2VsZi5zdGF0ZSA9PSBDTEVBUgotICAgIHByb3RvX2lkID0gc2VsZi5fX3JlYWRVQnl0ZSgpCi0gICAgaWYgcHJvdG9faWQgIT0gc2VsZi5QUk9UT0NPTF9JRDoKLSAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uQkFEX1ZFUlNJT04sCi0gICAgICAgICAgJ0JhZCBwcm90b2NvbCBpZCBpbiB0aGUgbWVzc2FnZTogJWQnICUgcHJvdG9faWQpCi0gICAgdmVyX3R5cGUgPSBzZWxmLl9fcmVhZFVCeXRlKCkKLSAgICB0eXBlID0gKHZlcl90eXBlID4+IHNlbGYuVFlQRV9TSElGVF9BTU9VTlQpICYgc2VsZi5UWVBFX0JJVFMKLSAgICB2ZXJzaW9uID0gdmVyX3R5cGUgJiBzZWxmLlZFUlNJT05fTUFTSwotICAgIGlmIHZlcnNpb24gIT0gc2VsZi5WRVJTSU9OOgotICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5CQURfVkVSU0lPTiwKLSAgICAgICAgICAnQmFkIHZlcnNpb246ICVkIChleHBlY3QgJWQpJyAlICh2ZXJzaW9uLCBzZWxmLlZFUlNJT04pKQotICAgIHNlcWlkID0gc2VsZi5fX3JlYWRWYXJpbnQoKQotICAgIG5hbWUgPSBzZWxmLl9fcmVhZFN0cmluZygpCi0gICAgcmV0dXJuIChuYW1lLCB0eXBlLCBzZXFpZCkKKyAgICBkZWYgX19yZWFkWmlnWmFnKHNlbGYpOgorICAgICAgICByZXR1cm4gZnJvbVppZ1phZyhzZWxmLl9fcmVhZFZhcmludCgpKQogCi0gIGRlZiByZWFkTWVzc2FnZUVuZChzZWxmKToKLSAgICBhc3NlcnQgc2VsZi5zdGF0ZSA9PSBDTEVBUgotICAgIGFzc2VydCBsZW4oc2VsZi5fX3N0cnVjdHMpID09IDAKKyAgICBkZWYgX19yZWFkU2l6ZShzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5fX3JlYWRWYXJpbnQoKQorICAgICAgICBpZiByZXN1bHQgPCAwOgorICAgICAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKCJMZW5ndGggPCAwIikKKyAgICAgICAgcmV0dXJuIHJlc3VsdAogCi0gIGRlZiByZWFkU3RydWN0QmVnaW4oc2VsZik6Ci0gICAgYXNzZXJ0IHNlbGYuc3RhdGUgaW4gKENMRUFSLCBDT05UQUlORVJfUkVBRCwgVkFMVUVfUkVBRCksIHNlbGYuc3RhdGUKLSAgICBzZWxmLl9fc3RydWN0cy5hcHBlbmQoKHNlbGYuc3RhdGUsIHNlbGYuX19sYXN0X2ZpZCkpCi0gICAgc2VsZi5zdGF0ZSA9IEZJRUxEX1JFQUQKLSAgICBzZWxmLl9fbGFzdF9maWQgPSAwCisgICAgZGVmIHJlYWRNZXNzYWdlQmVnaW4oc2VsZik6CisgICAgICAgIGFzc2VydCBzZWxmLnN0YXRlID09IENMRUFSCisgICAgICAgIHByb3RvX2lkID0gc2VsZi5fX3JlYWRVQnl0ZSgpCisgICAgICAgIGlmIHByb3RvX2lkICE9IHNlbGYuUFJPVE9DT0xfSUQ6CisgICAgICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLkJBRF9WRVJTSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCYWQgcHJvdG9jb2wgaWQgaW4gdGhlIG1lc3NhZ2U6ICVkJyAlIHByb3RvX2lkKQorICAgICAgICB2ZXJfdHlwZSA9IHNlbGYuX19yZWFkVUJ5dGUoKQorICAgICAgICB0eXBlID0gKHZlcl90eXBlID4+IHNlbGYuVFlQRV9TSElGVF9BTU9VTlQpICYgc2VsZi5UWVBFX0JJVFMKKyAgICAgICAgdmVyc2lvbiA9IHZlcl90eXBlICYgc2VsZi5WRVJTSU9OX01BU0sKKyAgICAgICAgaWYgdmVyc2lvbiAhPSBzZWxmLlZFUlNJT046CisgICAgICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLkJBRF9WRVJTSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCYWQgdmVyc2lvbjogJWQgKGV4cGVjdCAlZCknICUgKHZlcnNpb24sIHNlbGYuVkVSU0lPTikpCisgICAgICAgIHNlcWlkID0gc2VsZi5fX3JlYWRWYXJpbnQoKQorICAgICAgICBuYW1lID0gYmluYXJ5X3RvX3N0cihzZWxmLl9fcmVhZEJpbmFyeSgpKQorICAgICAgICByZXR1cm4gKG5hbWUsIHR5cGUsIHNlcWlkKQogCi0gIGRlZiByZWFkU3RydWN0RW5kKHNlbGYpOgotICAgIGFzc2VydCBzZWxmLnN0YXRlID09IEZJRUxEX1JFQUQKLSAgICBzZWxmLnN0YXRlLCBzZWxmLl9fbGFzdF9maWQgPSBzZWxmLl9fc3RydWN0cy5wb3AoKQorICAgIGRlZiByZWFkTWVzc2FnZUVuZChzZWxmKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuc3RhdGUgPT0gQ0xFQVIKKyAgICAgICAgYXNzZXJ0IGxlbihzZWxmLl9fc3RydWN0cykgPT0gMAogCi0gIGRlZiByZWFkQ29sbGVjdGlvbkJlZ2luKHNlbGYpOgotICAgIGFzc2VydCBzZWxmLnN0YXRlIGluIChWQUxVRV9SRUFELCBDT05UQUlORVJfUkVBRCksIHNlbGYuc3RhdGUKLSAgICBzaXplX3R5cGUgPSBzZWxmLl9fcmVhZFVCeXRlKCkKLSAgICBzaXplID0gc2l6ZV90eXBlID4+IDQKLSAgICB0eXBlID0gc2VsZi5fX2dldFRUeXBlKHNpemVfdHlwZSkKLSAgICBpZiBzaXplID09IDE1OgotICAgICAgc2l6ZSA9IHNlbGYuX19yZWFkU2l6ZSgpCi0gICAgc2VsZi5fX2NvbnRhaW5lcnMuYXBwZW5kKHNlbGYuc3RhdGUpCi0gICAgc2VsZi5zdGF0ZSA9IENPTlRBSU5FUl9SRUFECi0gICAgcmV0dXJuIHR5cGUsIHNpemUKLSAgcmVhZFNldEJlZ2luID0gcmVhZENvbGxlY3Rpb25CZWdpbgotICByZWFkTGlzdEJlZ2luID0gcmVhZENvbGxlY3Rpb25CZWdpbgorICAgIGRlZiByZWFkU3RydWN0QmVnaW4oc2VsZik6CisgICAgICAgIGFzc2VydCBzZWxmLnN0YXRlIGluIChDTEVBUiwgQ09OVEFJTkVSX1JFQUQsIFZBTFVFX1JFQUQpLCBzZWxmLnN0YXRlCisgICAgICAgIHNlbGYuX19zdHJ1Y3RzLmFwcGVuZCgoc2VsZi5zdGF0ZSwgc2VsZi5fX2xhc3RfZmlkKSkKKyAgICAgICAgc2VsZi5zdGF0ZSA9IEZJRUxEX1JFQUQKKyAgICAgICAgc2VsZi5fX2xhc3RfZmlkID0gMAogCi0gIGRlZiByZWFkTWFwQmVnaW4oc2VsZik6Ci0gICAgYXNzZXJ0IHNlbGYuc3RhdGUgaW4gKFZBTFVFX1JFQUQsIENPTlRBSU5FUl9SRUFEKSwgc2VsZi5zdGF0ZQotICAgIHNpemUgPSBzZWxmLl9fcmVhZFNpemUoKQotICAgIHR5cGVzID0gMAotICAgIGlmIHNpemUgPiAwOgotICAgICAgdHlwZXMgPSBzZWxmLl9fcmVhZFVCeXRlKCkKLSAgICB2dHlwZSA9IHNlbGYuX19nZXRUVHlwZSh0eXBlcykKLSAgICBrdHlwZSA9IHNlbGYuX19nZXRUVHlwZSh0eXBlcyA+PiA0KQotICAgIHNlbGYuX19jb250YWluZXJzLmFwcGVuZChzZWxmLnN0YXRlKQotICAgIHNlbGYuc3RhdGUgPSBDT05UQUlORVJfUkVBRAotICAgIHJldHVybiAoa3R5cGUsIHZ0eXBlLCBzaXplKQorICAgIGRlZiByZWFkU3RydWN0RW5kKHNlbGYpOgorICAgICAgICBhc3NlcnQgc2VsZi5zdGF0ZSA9PSBGSUVMRF9SRUFECisgICAgICAgIHNlbGYuc3RhdGUsIHNlbGYuX19sYXN0X2ZpZCA9IHNlbGYuX19zdHJ1Y3RzLnBvcCgpCiAKLSAgZGVmIHJlYWRDb2xsZWN0aW9uRW5kKHNlbGYpOgotICAgIGFzc2VydCBzZWxmLnN0YXRlID09IENPTlRBSU5FUl9SRUFELCBzZWxmLnN0YXRlCi0gICAgc2VsZi5zdGF0ZSA9IHNlbGYuX19jb250YWluZXJzLnBvcCgpCi0gIHJlYWRTZXRFbmQgPSByZWFkQ29sbGVjdGlvbkVuZAotICByZWFkTGlzdEVuZCA9IHJlYWRDb2xsZWN0aW9uRW5kCi0gIHJlYWRNYXBFbmQgPSByZWFkQ29sbGVjdGlvbkVuZAorICAgIGRlZiByZWFkQ29sbGVjdGlvbkJlZ2luKHNlbGYpOgorICAgICAgICBhc3NlcnQgc2VsZi5zdGF0ZSBpbiAoVkFMVUVfUkVBRCwgQ09OVEFJTkVSX1JFQUQpLCBzZWxmLnN0YXRlCisgICAgICAgIHNpemVfdHlwZSA9IHNlbGYuX19yZWFkVUJ5dGUoKQorICAgICAgICBzaXplID0gc2l6ZV90eXBlID4+IDQKKyAgICAgICAgdHlwZSA9IHNlbGYuX19nZXRUVHlwZShzaXplX3R5cGUpCisgICAgICAgIGlmIHNpemUgPT0gMTU6CisgICAgICAgICAgICBzaXplID0gc2VsZi5fX3JlYWRTaXplKCkKKyAgICAgICAgc2VsZi5fY2hlY2tfY29udGFpbmVyX2xlbmd0aChzaXplKQorICAgICAgICBzZWxmLl9fY29udGFpbmVycy5hcHBlbmQoc2VsZi5zdGF0ZSkKKyAgICAgICAgc2VsZi5zdGF0ZSA9IENPTlRBSU5FUl9SRUFECisgICAgICAgIHJldHVybiB0eXBlLCBzaXplCisgICAgcmVhZFNldEJlZ2luID0gcmVhZENvbGxlY3Rpb25CZWdpbgorICAgIHJlYWRMaXN0QmVnaW4gPSByZWFkQ29sbGVjdGlvbkJlZ2luCiAKLSAgZGVmIHJlYWRCb29sKHNlbGYpOgotICAgIGlmIHNlbGYuc3RhdGUgPT0gQk9PTF9SRUFEOgotICAgICAgcmV0dXJuIHNlbGYuX19ib29sX3ZhbHVlID09IENvbXBhY3RUeXBlLlRSVUUKLSAgICBlbGlmIHNlbGYuc3RhdGUgPT0gQ09OVEFJTkVSX1JFQUQ6Ci0gICAgICByZXR1cm4gc2VsZi5fX3JlYWRCeXRlKCkgPT0gQ29tcGFjdFR5cGUuVFJVRQotICAgIGVsc2U6Ci0gICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigiSW52YWxpZCBzdGF0ZSBpbiBjb21wYWN0IHByb3RvY29sOiAlZCIgJQotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSkKKyAgICBkZWYgcmVhZE1hcEJlZ2luKHNlbGYpOgorICAgICAgICBhc3NlcnQgc2VsZi5zdGF0ZSBpbiAoVkFMVUVfUkVBRCwgQ09OVEFJTkVSX1JFQUQpLCBzZWxmLnN0YXRlCisgICAgICAgIHNpemUgPSBzZWxmLl9fcmVhZFNpemUoKQorICAgICAgICBzZWxmLl9jaGVja19jb250YWluZXJfbGVuZ3RoKHNpemUpCisgICAgICAgIHR5cGVzID0gMAorICAgICAgICBpZiBzaXplID4gMDoKKyAgICAgICAgICAgIHR5cGVzID0gc2VsZi5fX3JlYWRVQnl0ZSgpCisgICAgICAgIHZ0eXBlID0gc2VsZi5fX2dldFRUeXBlKHR5cGVzKQorICAgICAgICBrdHlwZSA9IHNlbGYuX19nZXRUVHlwZSh0eXBlcyA+PiA0KQorICAgICAgICBzZWxmLl9fY29udGFpbmVycy5hcHBlbmQoc2VsZi5zdGF0ZSkKKyAgICAgICAgc2VsZi5zdGF0ZSA9IENPTlRBSU5FUl9SRUFECisgICAgICAgIHJldHVybiAoa3R5cGUsIHZ0eXBlLCBzaXplKQogCi0gIHJlYWRCeXRlID0gcmVhZGVyKF9fcmVhZEJ5dGUpCi0gIF9fcmVhZEkxNiA9IF9fcmVhZFppZ1phZwotICByZWFkSTE2ID0gcmVhZGVyKF9fcmVhZFppZ1phZykKLSAgcmVhZEkzMiA9IHJlYWRlcihfX3JlYWRaaWdaYWcpCi0gIHJlYWRJNjQgPSByZWFkZXIoX19yZWFkWmlnWmFnKQorICAgIGRlZiByZWFkQ29sbGVjdGlvbkVuZChzZWxmKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuc3RhdGUgPT0gQ09OVEFJTkVSX1JFQUQsIHNlbGYuc3RhdGUKKyAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuX19jb250YWluZXJzLnBvcCgpCisgICAgcmVhZFNldEVuZCA9IHJlYWRDb2xsZWN0aW9uRW5kCisgICAgcmVhZExpc3RFbmQgPSByZWFkQ29sbGVjdGlvbkVuZAorICAgIHJlYWRNYXBFbmQgPSByZWFkQ29sbGVjdGlvbkVuZAogCi0gIEByZWFkZXIKLSAgZGVmIHJlYWREb3VibGUoc2VsZik6Ci0gICAgYnVmZiA9IHNlbGYudHJhbnMucmVhZEFsbCg4KQotICAgIHZhbCwgPSB1bnBhY2soJzxkJywgYnVmZikKLSAgICByZXR1cm4gdmFsCisgICAgZGVmIHJlYWRCb29sKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnN0YXRlID09IEJPT0xfUkVBRDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9fYm9vbF92YWx1ZSA9PSBDb21wYWN0VHlwZS5UUlVFCisgICAgICAgIGVsaWYgc2VsZi5zdGF0ZSA9PSBDT05UQUlORVJfUkVBRDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9fcmVhZEJ5dGUoKSA9PSBDb21wYWN0VHlwZS5UUlVFCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigiSW52YWxpZCBzdGF0ZSBpbiBjb21wYWN0IHByb3RvY29sOiAlZCIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSkKIAotICBkZWYgX19yZWFkU3RyaW5nKHNlbGYpOgotICAgIGxlbiA9IHNlbGYuX19yZWFkU2l6ZSgpCi0gICAgcmV0dXJuIHNlbGYudHJhbnMucmVhZEFsbChsZW4pCi0gIHJlYWRTdHJpbmcgPSByZWFkZXIoX19yZWFkU3RyaW5nKQorICAgIHJlYWRCeXRlID0gcmVhZGVyKF9fcmVhZEJ5dGUpCisgICAgX19yZWFkSTE2ID0gX19yZWFkWmlnWmFnCisgICAgcmVhZEkxNiA9IHJlYWRlcihfX3JlYWRaaWdaYWcpCisgICAgcmVhZEkzMiA9IHJlYWRlcihfX3JlYWRaaWdaYWcpCisgICAgcmVhZEk2NCA9IHJlYWRlcihfX3JlYWRaaWdaYWcpCiAKLSAgZGVmIF9fZ2V0VFR5cGUoc2VsZiwgYnl0ZSk6Ci0gICAgcmV0dXJuIFRUWVBFU1tieXRlICYgMHgwZl0KKyAgICBAcmVhZGVyCisgICAgZGVmIHJlYWREb3VibGUoc2VsZik6CisgICAgICAgIGJ1ZmYgPSBzZWxmLnRyYW5zLnJlYWRBbGwoOCkKKyAgICAgICAgdmFsLCA9IHVucGFjaygnPGQnLCBidWZmKQorICAgICAgICByZXR1cm4gdmFsCisKKyAgICBkZWYgX19yZWFkQmluYXJ5KHNlbGYpOgorICAgICAgICBzaXplID0gc2VsZi5fX3JlYWRTaXplKCkKKyAgICAgICAgc2VsZi5fY2hlY2tfc3RyaW5nX2xlbmd0aChzaXplKQorICAgICAgICByZXR1cm4gc2VsZi50cmFucy5yZWFkQWxsKHNpemUpCisgICAgcmVhZEJpbmFyeSA9IHJlYWRlcihfX3JlYWRCaW5hcnkpCisKKyAgICBkZWYgX19nZXRUVHlwZShzZWxmLCBieXRlKToKKyAgICAgICAgcmV0dXJuIFRUWVBFU1tieXRlICYgMHgwZl0KIAogCi1jbGFzcyBUQ29tcGFjdFByb3RvY29sRmFjdG9yeToKLSAgZGVmIF9faW5pdF9fKHNlbGYpOgorY2xhc3MgVENvbXBhY3RQcm90b2NvbEZhY3Rvcnkob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwKKyAgICAgICAgICAgICAgICAgc3RyaW5nX2xlbmd0aF9saW1pdD1Ob25lLAorICAgICAgICAgICAgICAgICBjb250YWluZXJfbGVuZ3RoX2xpbWl0PU5vbmUpOgorICAgICAgICBzZWxmLnN0cmluZ19sZW5ndGhfbGltaXQgPSBzdHJpbmdfbGVuZ3RoX2xpbWl0CisgICAgICAgIHNlbGYuY29udGFpbmVyX2xlbmd0aF9saW1pdCA9IGNvbnRhaW5lcl9sZW5ndGhfbGltaXQKKworICAgIGRlZiBnZXRQcm90b2NvbChzZWxmLCB0cmFucyk6CisgICAgICAgIHJldHVybiBUQ29tcGFjdFByb3RvY29sKHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN0cmluZ19sZW5ndGhfbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udGFpbmVyX2xlbmd0aF9saW1pdCkKKworCitjbGFzcyBUQ29tcGFjdFByb3RvY29sQWNjZWxlcmF0ZWQoVENvbXBhY3RQcm90b2NvbCk6CisgICAgIiIiQy1BY2NlbGVyYXRlZCB2ZXJzaW9uIG9mIFRDb21wYWN0UHJvdG9jb2wuCisKKyAgICBUaGlzIGNsYXNzIGRvZXMgbm90IG92ZXJyaWRlIGFueSBvZiBUQ29tcGFjdFByb3RvY29sJ3MgbWV0aG9kcywKKyAgICBidXQgdGhlIGdlbmVyYXRlZCBjb2RlIHJlY29nbml6ZXMgaXQgZGlyZWN0bHkgYW5kIHdpbGwgY2FsbCBpbnRvCisgICAgb3VyIEMgbW9kdWxlIHRvIGRvIHRoZSBlbmNvZGluZywgYnlwYXNzaW5nIHRoaXMgb2JqZWN0IGVudGlyZWx5LgorICAgIFdlIGluaGVyaXQgZnJvbSBUQ29tcGFjdFByb3RvY29sIHNvIHRoYXQgdGhlIG5vcm1hbCBUQ29tcGFjdFByb3RvY29sCisgICAgZW5jb2RpbmcgY2FuIGhhcHBlbiBpZiB0aGUgZmFzdGJpbmFyeSBtb2R1bGUgZG9lc24ndCB3b3JrIGZvciBzb21lCisgICAgcmVhc29uLgorICAgIFRvIGRpc2FibGUgdGhpcyBiZWhhdmlvciwgcGFzcyBmYWxsYmFjaz1GYWxzZSBjb25zdHJ1Y3RvciBhcmd1bWVudC4KKworICAgIEluIG9yZGVyIHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBDIG1vZHVsZSwganVzdCB1c2UKKyAgICBUQ29tcGFjdFByb3RvY29sQWNjZWxlcmF0ZWQgaW5zdGVhZCBvZiBUQ29tcGFjdFByb3RvY29sLgorICAgICIiIgogICAgIHBhc3MKIAotICBkZWYgZ2V0UHJvdG9jb2woc2VsZiwgdHJhbnMpOgotICAgIHJldHVybiBUQ29tcGFjdFByb3RvY29sKHRyYW5zKQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBmYWxsYmFjayA9IGt3YXJncy5wb3AoJ2ZhbGxiYWNrJywgVHJ1ZSkKKyAgICAgICAgc3VwZXIoVENvbXBhY3RQcm90b2NvbEFjY2VsZXJhdGVkLCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprd2FyZ3MpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBmYXN0YmluYXJ5CisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIGlmIG5vdCBmYWxsYmFjazoKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fZmFzdF9kZWNvZGUgPSBmYXN0YmluYXJ5LmRlY29kZV9jb21wYWN0CisgICAgICAgICAgICBzZWxmLl9mYXN0X2VuY29kZSA9IGZhc3RiaW5hcnkuZW5jb2RlX2NvbXBhY3QKKworCitjbGFzcyBUQ29tcGFjdFByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsCisgICAgICAgICAgICAgICAgIHN0cmluZ19sZW5ndGhfbGltaXQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgY29udGFpbmVyX2xlbmd0aF9saW1pdD1Ob25lLAorICAgICAgICAgICAgICAgICBmYWxsYmFjaz1UcnVlKToKKyAgICAgICAgc2VsZi5zdHJpbmdfbGVuZ3RoX2xpbWl0ID0gc3RyaW5nX2xlbmd0aF9saW1pdAorICAgICAgICBzZWxmLmNvbnRhaW5lcl9sZW5ndGhfbGltaXQgPSBjb250YWluZXJfbGVuZ3RoX2xpbWl0CisgICAgICAgIHNlbGYuX2ZhbGxiYWNrID0gZmFsbGJhY2sKKworICAgIGRlZiBnZXRQcm90b2NvbChzZWxmLCB0cmFucyk6CisgICAgICAgIHJldHVybiBUQ29tcGFjdFByb3RvY29sQWNjZWxlcmF0ZWQoCisgICAgICAgICAgICB0cmFucywKKyAgICAgICAgICAgIHN0cmluZ19sZW5ndGhfbGltaXQ9c2VsZi5zdHJpbmdfbGVuZ3RoX2xpbWl0LAorICAgICAgICAgICAgY29udGFpbmVyX2xlbmd0aF9saW1pdD1zZWxmLmNvbnRhaW5lcl9sZW5ndGhfbGltaXQsCisgICAgICAgICAgICBmYWxsYmFjaz1zZWxmLl9mYWxsYmFjaykKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvcHJvdG9jb2wvVEhlYWRlclByb3RvY29sLnB5IGIvbGliL3B5L3NyYy9wcm90b2NvbC9USGVhZGVyUHJvdG9jb2wucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI3YTc0OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9zcmMvcHJvdG9jb2wvVEhlYWRlclByb3RvY29sLnB5CkBAIC0wLDAgKzEsMjI1IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworZnJvbSB0aHJpZnQucHJvdG9jb2wuVEJpbmFyeVByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZAorZnJvbSB0aHJpZnQucHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbCBpbXBvcnQgVENvbXBhY3RQcm90b2NvbEFjY2VsZXJhdGVkCitmcm9tIHRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaW1wb3J0IFRQcm90b2NvbEJhc2UsIFRQcm90b2NvbEV4Y2VwdGlvbgorZnJvbSB0aHJpZnQuVGhyaWZ0IGltcG9ydCBUQXBwbGljYXRpb25FeGNlcHRpb24sIFRNZXNzYWdlVHlwZQorZnJvbSB0aHJpZnQudHJhbnNwb3J0LlRIZWFkZXJUcmFuc3BvcnQgaW1wb3J0IFRIZWFkZXJUcmFuc3BvcnQsIFRIZWFkZXJTdWJwcm90b2NvbElELCBUSGVhZGVyQ2xpZW50VHlwZQorCisKK1BST1RPQ09MU19CWV9JRCA9IHsKKyAgICBUSGVhZGVyU3VicHJvdG9jb2xJRC5CSU5BUlk6IFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkLAorICAgIFRIZWFkZXJTdWJwcm90b2NvbElELkNPTVBBQ1Q6IFRDb21wYWN0UHJvdG9jb2xBY2NlbGVyYXRlZCwKK30KKworCitjbGFzcyBUSGVhZGVyUHJvdG9jb2woVFByb3RvY29sQmFzZSk6CisgICAgIiIiQSBmcmFtZWQgcHJvdG9jb2wgd2l0aCBoZWFkZXJzIGFuZCBwYXlsb2FkIHRyYW5zZm9ybXMuCisKKyAgICBUSGVhZGVyUHJvdG9jb2wgZnJhbWVzIG90aGVyIFRocmlmdCBwcm90b2NvbHMgYW5kIGFkZHMgc3VwcG9ydCBmb3Igb3B0aW9uYWwKKyAgICBvdXQtb2YtYmFuZCBoZWFkZXJzLiBUaGUgY3VycmVudGx5IHN1cHBvcnRlZCBzdWJwcm90b2NvbHMgYXJlCisgICAgVEJpbmFyeVByb3RvY29sIGFuZCBUQ29tcGFjdFByb3RvY29sLgorCisgICAgSXQncyBhbHNvIHBvc3NpYmxlIHRvIGFwcGx5IHRyYW5zZm9ybXMgdG8gdGhlIGVuY29kZWQgbWVzc2FnZSBwYXlsb2FkLiBUaGUKKyAgICBvbmx5IHRyYW5zZm9ybSBjdXJyZW50bHkgc3VwcG9ydGVkIGlzIHRvIGd6aXAuCisKKyAgICBXaGVuIHVzZWQgaW4gYSBzZXJ2ZXIsIFRIZWFkZXJQcm90b2NvbCBjYW4gYWNjZXB0IG1lc3NhZ2VzIGZyb20KKyAgICBub24tVEhlYWRlclByb3RvY29sIGNsaWVudHMgaWYgYWxsb3dlZCAoc2VlIGBhbGxvd2VkX2NsaWVudF90eXBlc2ApLiBUaGlzCisgICAgaW5jbHVkZXMgZnJhbWVkIGFuZCB1bmZyYW1lZCB0cmFuc3BvcnRzIGFuZCBib3RoIFRCaW5hcnlQcm90b2NvbCBhbmQKKyAgICBUQ29tcGFjdFByb3RvY29sLiBUaGUgc2VydmVyIHdpbGwgcmVzcG9uZCBpbiB0aGUgYXBwcm9wcmlhdGUgZGlhbGVjdCBmb3IKKyAgICB0aGUgY29ubmVjdGVkIGNsaWVudC4gSFRUUCBjbGllbnRzIGFyZSBub3QgY3VycmVudGx5IHN1cHBvcnRlZC4KKworICAgIFRIZWFkZXJQcm90b2NvbCBkb2VzIG5vdCBjdXJyZW50bHkgc3VwcG9ydCBUSFRUUFNlcnZlciwgVE5vbmJsb2NraW5nU2VydmVyLAorICAgIG9yIFRQcm9jZXNzUG9vbFNlcnZlci4KKworICAgIFNlZSBkb2Mvc3BlY3MvSGVhZGVyRm9ybWF0Lm1kIGZvciBkZXRhaWxzIG9mIHRoZSB3aXJlIGZvcm1hdC4KKworICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRyYW5zcG9ydCwgYWxsb3dlZF9jbGllbnRfdHlwZXMpOgorICAgICAgICAjIG11Y2ggb2YgdGhlIGFjdHVhbCB3b3JrIGZvciBUSGVhZGVyUHJvdG9jb2wgaGFwcGVucyBkb3duIGluCisgICAgICAgICMgVEhlYWRlclRyYW5zcG9ydCBzaW5jZSB3ZSBuZWVkIHRvIGRvIGxvdy1sZXZlbCBzaGVuYW5pZ2FucyB0byBkZXRlY3QKKyAgICAgICAgIyBpZiB0aGUgY2xpZW50IGlzIHNlbmRpbmcgdXMgaGVhZGVycyBvciBvbmUgb2YgdGhlIGhlYWRlcmxlc3MgZm9ybWF0cworICAgICAgICAjIHdlIHN1cHBvcnQuIHRoaXMgd3JhcHMgdGhlIHJlYWwgdHJhbnNwb3J0IHdpdGggdGhlIG9uZSB0aGF0IGRvZXMgYWxsCisgICAgICAgICMgdGhlIG1hZ2ljLgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh0cmFuc3BvcnQsIFRIZWFkZXJUcmFuc3BvcnQpOgorICAgICAgICAgICAgdHJhbnNwb3J0ID0gVEhlYWRlclRyYW5zcG9ydCh0cmFuc3BvcnQsIGFsbG93ZWRfY2xpZW50X3R5cGVzKQorICAgICAgICBzdXBlcihUSGVhZGVyUHJvdG9jb2wsIHNlbGYpLl9faW5pdF9fKHRyYW5zcG9ydCkKKyAgICAgICAgc2VsZi5fc2V0X3Byb3RvY29sKCkKKworICAgIGRlZiBnZXRfaGVhZGVycyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudHJhbnMuZ2V0X2hlYWRlcnMoKQorCisgICAgZGVmIHNldF9oZWFkZXIoc2VsZiwga2V5LCB2YWx1ZSk6CisgICAgICAgIHNlbGYudHJhbnMuc2V0X2hlYWRlcihrZXksIHZhbHVlKQorCisgICAgZGVmIGNsZWFyX2hlYWRlcnMoc2VsZik6CisgICAgICAgIHNlbGYudHJhbnMuY2xlYXJfaGVhZGVycygpCisKKyAgICBkZWYgYWRkX3RyYW5zZm9ybShzZWxmLCB0cmFuc2Zvcm1faWQpOgorICAgICAgICBzZWxmLnRyYW5zLmFkZF90cmFuc2Zvcm0odHJhbnNmb3JtX2lkKQorCisgICAgZGVmIHdyaXRlTWVzc2FnZUJlZ2luKHNlbGYsIG5hbWUsIHR0eXBlLCBzZXFpZCk6CisgICAgICAgIHNlbGYudHJhbnMuc2VxdWVuY2VfaWQgPSBzZXFpZAorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wud3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgdHR5cGUsIHNlcWlkKQorCisgICAgZGVmIHdyaXRlTWVzc2FnZUVuZChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpCisKKyAgICBkZWYgd3JpdGVTdHJ1Y3RCZWdpbihzZWxmLCBuYW1lKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlU3RydWN0QmVnaW4obmFtZSkKKworICAgIGRlZiB3cml0ZVN0cnVjdEVuZChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlU3RydWN0RW5kKCkKKworICAgIGRlZiB3cml0ZUZpZWxkQmVnaW4oc2VsZiwgbmFtZSwgdHR5cGUsIGZpZCk6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC53cml0ZUZpZWxkQmVnaW4obmFtZSwgdHR5cGUsIGZpZCkKKworICAgIGRlZiB3cml0ZUZpZWxkRW5kKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wud3JpdGVGaWVsZEVuZCgpCisKKyAgICBkZWYgd3JpdGVGaWVsZFN0b3Aoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC53cml0ZUZpZWxkU3RvcCgpCisKKyAgICBkZWYgd3JpdGVNYXBCZWdpbihzZWxmLCBrdHlwZSwgdnR5cGUsIHNpemUpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wud3JpdGVNYXBCZWdpbihrdHlwZSwgdnR5cGUsIHNpemUpCisKKyAgICBkZWYgd3JpdGVNYXBFbmQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC53cml0ZU1hcEVuZCgpCisKKyAgICBkZWYgd3JpdGVMaXN0QmVnaW4oc2VsZiwgZXR5cGUsIHNpemUpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wud3JpdGVMaXN0QmVnaW4oZXR5cGUsIHNpemUpCisKKyAgICBkZWYgd3JpdGVMaXN0RW5kKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wud3JpdGVMaXN0RW5kKCkKKworICAgIGRlZiB3cml0ZVNldEJlZ2luKHNlbGYsIGV0eXBlLCBzaXplKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlU2V0QmVnaW4oZXR5cGUsIHNpemUpCisKKyAgICBkZWYgd3JpdGVTZXRFbmQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC53cml0ZVNldEVuZCgpCisKKyAgICBkZWYgd3JpdGVCb29sKHNlbGYsIGJvb2xfdmFsKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlQm9vbChib29sX3ZhbCkKKworICAgIGRlZiB3cml0ZUJ5dGUoc2VsZiwgYnl0ZSk6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC53cml0ZUJ5dGUoYnl0ZSkKKworICAgIGRlZiB3cml0ZUkxNihzZWxmLCBpMTYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wud3JpdGVJMTYoaTE2KQorCisgICAgZGVmIHdyaXRlSTMyKHNlbGYsIGkzMik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC53cml0ZUkzMihpMzIpCisKKyAgICBkZWYgd3JpdGVJNjQoc2VsZiwgaTY0KToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlSTY0KGk2NCkKKworICAgIGRlZiB3cml0ZURvdWJsZShzZWxmLCBkdWIpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wud3JpdGVEb3VibGUoZHViKQorCisgICAgZGVmIHdyaXRlQmluYXJ5KHNlbGYsIHN0cl92YWwpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wud3JpdGVCaW5hcnkoc3RyX3ZhbCkKKworICAgIGRlZiBfc2V0X3Byb3RvY29sKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBwcm90b2NvbF9jbHMgPSBQUk9UT0NPTFNfQllfSURbc2VsZi50cmFucy5wcm90b2NvbF9pZF0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcmFpc2UgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX1BST1RPQ09MLAorICAgICAgICAgICAgICAgICJVbmtub3duIHByb3RvY29sIHJlcXVlc3RlZC4iLAorICAgICAgICAgICAgKQorCisgICAgICAgIHNlbGYuX3Byb3RvY29sID0gcHJvdG9jb2xfY2xzKHNlbGYudHJhbnMpCisgICAgICAgIHNlbGYuX2Zhc3RfZW5jb2RlID0gc2VsZi5fcHJvdG9jb2wuX2Zhc3RfZW5jb2RlCisgICAgICAgIHNlbGYuX2Zhc3RfZGVjb2RlID0gc2VsZi5fcHJvdG9jb2wuX2Zhc3RfZGVjb2RlCisKKyAgICBkZWYgcmVhZE1lc3NhZ2VCZWdpbihzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi50cmFucy5yZWFkRnJhbWUoMCkKKyAgICAgICAgICAgIHNlbGYuX3NldF9wcm90b2NvbCgpCisgICAgICAgIGV4Y2VwdCBUQXBwbGljYXRpb25FeGNlcHRpb24gYXMgZXhjOgorICAgICAgICAgICAgc2VsZi5fcHJvdG9jb2wud3JpdGVNZXNzYWdlQmVnaW4oYiIiLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCAwKQorICAgICAgICAgICAgZXhjLndyaXRlKHNlbGYuX3Byb3RvY29sKQorICAgICAgICAgICAgc2VsZi5fcHJvdG9jb2wud3JpdGVNZXNzYWdlRW5kKCkKKyAgICAgICAgICAgIHNlbGYudHJhbnMuZmx1c2goKQorCisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkTWVzc2FnZUJlZ2luKCkKKworICAgIGRlZiByZWFkTWVzc2FnZUVuZChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLnJlYWRNZXNzYWdlRW5kKCkKKworICAgIGRlZiByZWFkU3RydWN0QmVnaW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkU3RydWN0QmVnaW4oKQorCisgICAgZGVmIHJlYWRTdHJ1Y3RFbmQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkU3RydWN0RW5kKCkKKworICAgIGRlZiByZWFkRmllbGRCZWdpbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLnJlYWRGaWVsZEJlZ2luKCkKKworICAgIGRlZiByZWFkRmllbGRFbmQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkRmllbGRFbmQoKQorCisgICAgZGVmIHJlYWRNYXBCZWdpbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLnJlYWRNYXBCZWdpbigpCisKKyAgICBkZWYgcmVhZE1hcEVuZChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLnJlYWRNYXBFbmQoKQorCisgICAgZGVmIHJlYWRMaXN0QmVnaW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkTGlzdEJlZ2luKCkKKworICAgIGRlZiByZWFkTGlzdEVuZChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLnJlYWRMaXN0RW5kKCkKKworICAgIGRlZiByZWFkU2V0QmVnaW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkU2V0QmVnaW4oKQorCisgICAgZGVmIHJlYWRTZXRFbmQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkU2V0RW5kKCkKKworICAgIGRlZiByZWFkQm9vbChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLnJlYWRCb29sKCkKKworICAgIGRlZiByZWFkQnl0ZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLnJlYWRCeXRlKCkKKworICAgIGRlZiByZWFkSTE2KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZEkxNigpCisKKyAgICBkZWYgcmVhZEkzMihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLnJlYWRJMzIoKQorCisgICAgZGVmIHJlYWRJNjQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkSTY0KCkKKworICAgIGRlZiByZWFkRG91YmxlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZERvdWJsZSgpCisKKyAgICBkZWYgcmVhZEJpbmFyeShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLnJlYWRCaW5hcnkoKQorCisKK2NsYXNzIFRIZWFkZXJQcm90b2NvbEZhY3Rvcnkob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYWxsb3dlZF9jbGllbnRfdHlwZXM9KFRIZWFkZXJDbGllbnRUeXBlLkhFQURFUlMsKSk6CisgICAgICAgIHNlbGYuYWxsb3dlZF9jbGllbnRfdHlwZXMgPSBhbGxvd2VkX2NsaWVudF90eXBlcworCisgICAgZGVmIGdldFByb3RvY29sKHNlbGYsIHRyYW5zKToKKyAgICAgICAgcmV0dXJuIFRIZWFkZXJQcm90b2NvbCh0cmFucywgc2VsZi5hbGxvd2VkX2NsaWVudF90eXBlcykKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5weSBiL2xpYi9weS9zcmMvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5weQppbmRleCA5YzE4NzdiLi5kYjIwOTlhIDEwMDY0NAotLS0gYS9saWIvcHkvc3JjL3Byb3RvY29sL1RKU09OUHJvdG9jb2wucHkKKysrIGIvbGliL3B5L3NyYy9wcm90b2NvbC9USlNPTlByb3RvY29sLnB5CkBAIC0xNywxMSArMTcsMTQgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLWZyb20gVFByb3RvY29sIGltcG9ydCBUVHlwZSwgVFByb3RvY29sQmFzZSwgVFByb3RvY29sRXhjZXB0aW9uLCBcCi0gICAgY2hlY2tJbnRlZ2VyTGltaXRzCitmcm9tIC5UUHJvdG9jb2wgaW1wb3J0IChUVHlwZSwgVFByb3RvY29sQmFzZSwgVFByb3RvY29sRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tJbnRlZ2VyTGltaXRzKQogaW1wb3J0IGJhc2U2NAotaW1wb3J0IGpzb24KIGltcG9ydCBtYXRoCitpbXBvcnQgc3lzCisKK2Zyb20gLi5jb21wYXQgaW1wb3J0IHN0cl90b19iaW5hcnkKKwogCiBfX2FsbF9fID0gWydUSlNPTlByb3RvY29sJywKICAgICAgICAgICAgJ1RKU09OUHJvdG9jb2xGYWN0b3J5JywKQEAgLTMwLDUwMyArMzMsNjA4IEBACiAKIFZFUlNJT04gPSAxCiAKLUNPTU1BID0gJywnCi1DT0xPTiA9ICc6JwotTEJSQUNFID0gJ3snCi1SQlJBQ0UgPSAnfScKLUxCUkFDS0VUID0gJ1snCi1SQlJBQ0tFVCA9ICddJwotUVVPVEUgPSAnIicKLUJBQ0tTTEFTSCA9ICdcXCcKLVpFUk8gPSAnMCcKK0NPTU1BID0gYicsJworQ09MT04gPSBiJzonCitMQlJBQ0UgPSBiJ3snCitSQlJBQ0UgPSBiJ30nCitMQlJBQ0tFVCA9IGInWycKK1JCUkFDS0VUID0gYiddJworUVVPVEUgPSBiJyInCitCQUNLU0xBU0ggPSBiJ1xcJworWkVSTyA9IGInMCcKIAotRVNDU0VRID0gJ1xcdTAwJwotRVNDQVBFX0NIQVIgPSAnIlxcYmZucnQnCi1FU0NBUEVfQ0hBUl9WQUxTID0gWyciJywgJ1xcJywgJ1xiJywgJ1xmJywgJ1xuJywgJ1xyJywgJ1x0J10KLU5VTUVSSUNfQ0hBUiA9ICcrLS4wMTIzNDU2Nzg5RWUnCitFU0NTRVEwID0gb3JkKCdcXCcpCitFU0NTRVExID0gb3JkKCd1JykKK0VTQ0FQRV9DSEFSX1ZBTFMgPSB7CisgICAgJyInOiAnXFwiJywKKyAgICAnXFwnOiAnXFxcXCcsCisgICAgJ1xiJzogJ1xcYicsCisgICAgJ1xmJzogJ1xcZicsCisgICAgJ1xuJzogJ1xcbicsCisgICAgJ1xyJzogJ1xccicsCisgICAgJ1x0JzogJ1xcdCcsCisgICAgIyAnLyc6ICdcXC8nLAorfQorRVNDQVBFX0NIQVJTID0geworICAgIGInIic6ICciJywKKyAgICBiJ1xcJzogJ1xcJywKKyAgICBiJ2InOiAnXGInLAorICAgIGInZic6ICdcZicsCisgICAgYiduJzogJ1xuJywKKyAgICBiJ3InOiAnXHInLAorICAgIGIndCc6ICdcdCcsCisgICAgYicvJzogJy8nLAorfQorTlVNRVJJQ19DSEFSID0gYicrLS4wMTIzNDU2Nzg5RWUnCiAKLUNUWVBFUyA9IHtUVHlwZS5CT09MOiAgICAgICAndGYnLAotICAgICAgICAgIFRUeXBlLkJZVEU6ICAgICAgICdpOCcsCi0gICAgICAgICAgVFR5cGUuSTE2OiAgICAgICAgJ2kxNicsCi0gICAgICAgICAgVFR5cGUuSTMyOiAgICAgICAgJ2kzMicsCi0gICAgICAgICAgVFR5cGUuSTY0OiAgICAgICAgJ2k2NCcsCi0gICAgICAgICAgVFR5cGUuRE9VQkxFOiAgICAgJ2RibCcsCi0gICAgICAgICAgVFR5cGUuU1RSSU5HOiAgICAgJ3N0cicsCi0gICAgICAgICAgVFR5cGUuU1RSVUNUOiAgICAgJ3JlYycsCi0gICAgICAgICAgVFR5cGUuTElTVDogICAgICAgJ2xzdCcsCi0gICAgICAgICAgVFR5cGUuU0VUOiAgICAgICAgJ3NldCcsCi0gICAgICAgICAgVFR5cGUuTUFQOiAgICAgICAgJ21hcCd9CitDVFlQRVMgPSB7CisgICAgVFR5cGUuQk9PTDogJ3RmJywKKyAgICBUVHlwZS5CWVRFOiAnaTgnLAorICAgIFRUeXBlLkkxNjogJ2kxNicsCisgICAgVFR5cGUuSTMyOiAnaTMyJywKKyAgICBUVHlwZS5JNjQ6ICdpNjQnLAorICAgIFRUeXBlLkRPVUJMRTogJ2RibCcsCisgICAgVFR5cGUuU1RSSU5HOiAnc3RyJywKKyAgICBUVHlwZS5TVFJVQ1Q6ICdyZWMnLAorICAgIFRUeXBlLkxJU1Q6ICdsc3QnLAorICAgIFRUeXBlLlNFVDogJ3NldCcsCisgICAgVFR5cGUuTUFQOiAnbWFwJywKK30KIAogSlRZUEVTID0ge30KIGZvciBrZXkgaW4gQ1RZUEVTLmtleXMoKToKLSAgSlRZUEVTW0NUWVBFU1trZXldXSA9IGtleQorICAgIEpUWVBFU1tDVFlQRVNba2V5XV0gPSBrZXkKIAogCiBjbGFzcyBKU09OQmFzZUNvbnRleHQob2JqZWN0KToKIAotICBkZWYgX19pbml0X18oc2VsZiwgcHJvdG9jb2wpOgotICAgIHNlbGYucHJvdG9jb2wgPSBwcm90b2NvbAotICAgIHNlbGYuZmlyc3QgPSBUcnVlCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHByb3RvY29sKToKKyAgICAgICAgc2VsZi5wcm90b2NvbCA9IHByb3RvY29sCisgICAgICAgIHNlbGYuZmlyc3QgPSBUcnVlCiAKLSAgZGVmIGRvSU8oc2VsZiwgZnVuY3Rpb24pOgotICAgIHBhc3MKLSAgCi0gIGRlZiB3cml0ZShzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIGRvSU8oc2VsZiwgZnVuY3Rpb24pOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZShzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiBlc2NhcGVOdW0oc2VsZik6Ci0gICAgcmV0dXJuIEZhbHNlCisgICAgZGVmIHJlYWQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgX19zdHJfXyhzZWxmKToKLSAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18uX19uYW1lX18KKyAgICBkZWYgZXNjYXBlTnVtKHNlbGYpOgorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18uX19uYW1lX18KIAogCiBjbGFzcyBKU09OTGlzdENvbnRleHQoSlNPTkJhc2VDb250ZXh0KToKLSAgICAKLSAgZGVmIGRvSU8oc2VsZiwgZnVuY3Rpb24pOgotICAgIGlmIHNlbGYuZmlyc3QgaXMgVHJ1ZToKLSAgICAgIHNlbGYuZmlyc3QgPSBGYWxzZQotICAgIGVsc2U6Ci0gICAgICBmdW5jdGlvbihDT01NQSkKIAotICBkZWYgd3JpdGUoc2VsZik6Ci0gICAgc2VsZi5kb0lPKHNlbGYucHJvdG9jb2wudHJhbnMud3JpdGUpCisgICAgZGVmIGRvSU8oc2VsZiwgZnVuY3Rpb24pOgorICAgICAgICBpZiBzZWxmLmZpcnN0IGlzIFRydWU6CisgICAgICAgICAgICBzZWxmLmZpcnN0ID0gRmFsc2UKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZ1bmN0aW9uKENPTU1BKQogCi0gIGRlZiByZWFkKHNlbGYpOgotICAgIHNlbGYuZG9JTyhzZWxmLnByb3RvY29sLnJlYWRKU09OU3ludGF4Q2hhcikKKyAgICBkZWYgd3JpdGUoc2VsZik6CisgICAgICAgIHNlbGYuZG9JTyhzZWxmLnByb3RvY29sLnRyYW5zLndyaXRlKQorCisgICAgZGVmIHJlYWQoc2VsZik6CisgICAgICAgIHNlbGYuZG9JTyhzZWxmLnByb3RvY29sLnJlYWRKU09OU3ludGF4Q2hhcikKIAogCiBjbGFzcyBKU09OUGFpckNvbnRleHQoSlNPTkJhc2VDb250ZXh0KToKLSAgCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBwcm90b2NvbCk6Ci0gICAgc3VwZXIoSlNPTlBhaXJDb250ZXh0LCBzZWxmKS5fX2luaXRfXyhwcm90b2NvbCkKLSAgICBzZWxmLmNvbG9uID0gVHJ1ZQogCi0gIGRlZiBkb0lPKHNlbGYsIGZ1bmN0aW9uKToKLSAgICBpZiBzZWxmLmZpcnN0OgotICAgICAgc2VsZi5maXJzdCA9IEZhbHNlCi0gICAgICBzZWxmLmNvbG9uID0gVHJ1ZQotICAgIGVsc2U6Ci0gICAgICBmdW5jdGlvbihDT0xPTiBpZiBzZWxmLmNvbG9uIGVsc2UgQ09NTUEpCi0gICAgICBzZWxmLmNvbG9uID0gbm90IHNlbGYuY29sb24KKyAgICBkZWYgX19pbml0X18oc2VsZiwgcHJvdG9jb2wpOgorICAgICAgICBzdXBlcihKU09OUGFpckNvbnRleHQsIHNlbGYpLl9faW5pdF9fKHByb3RvY29sKQorICAgICAgICBzZWxmLmNvbG9uID0gVHJ1ZQogCi0gIGRlZiB3cml0ZShzZWxmKToKLSAgICBzZWxmLmRvSU8oc2VsZi5wcm90b2NvbC50cmFucy53cml0ZSkKKyAgICBkZWYgZG9JTyhzZWxmLCBmdW5jdGlvbik6CisgICAgICAgIGlmIHNlbGYuZmlyc3Q6CisgICAgICAgICAgICBzZWxmLmZpcnN0ID0gRmFsc2UKKyAgICAgICAgICAgIHNlbGYuY29sb24gPSBUcnVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmdW5jdGlvbihDT0xPTiBpZiBzZWxmLmNvbG9uIGVsc2UgQ09NTUEpCisgICAgICAgICAgICBzZWxmLmNvbG9uID0gbm90IHNlbGYuY29sb24KIAotICBkZWYgcmVhZChzZWxmKToKLSAgICBzZWxmLmRvSU8oc2VsZi5wcm90b2NvbC5yZWFkSlNPTlN5bnRheENoYXIpCisgICAgZGVmIHdyaXRlKHNlbGYpOgorICAgICAgICBzZWxmLmRvSU8oc2VsZi5wcm90b2NvbC50cmFucy53cml0ZSkKIAotICBkZWYgZXNjYXBlTnVtKHNlbGYpOgotICAgIHJldHVybiBzZWxmLmNvbG9uCisgICAgZGVmIHJlYWQoc2VsZik6CisgICAgICAgIHNlbGYuZG9JTyhzZWxmLnByb3RvY29sLnJlYWRKU09OU3ludGF4Q2hhcikKIAotICBkZWYgX19zdHJfXyhzZWxmKToKLSAgICByZXR1cm4gJyVzLCBjb2xvbj0lcycgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHNlbGYuY29sb24pCisgICAgZGVmIGVzY2FwZU51bShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuY29sb24KKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gJyVzLCBjb2xvbj0lcycgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHNlbGYuY29sb24pCiAKIAogY2xhc3MgTG9va2FoZWFkUmVhZGVyKCk6Ci0gIGhhc0RhdGEgPSBGYWxzZQotICBkYXRhID0gJycKKyAgICBoYXNEYXRhID0gRmFsc2UKKyAgICBkYXRhID0gJycKIAotICBkZWYgX19pbml0X18oc2VsZiwgcHJvdG9jb2wpOgotICAgIHNlbGYucHJvdG9jb2wgPSBwcm90b2NvbAorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcm90b2NvbCk6CisgICAgICAgIHNlbGYucHJvdG9jb2wgPSBwcm90b2NvbAogCi0gIGRlZiByZWFkKHNlbGYpOgotICAgIGlmIHNlbGYuaGFzRGF0YSBpcyBUcnVlOgotICAgICAgc2VsZi5oYXNEYXRhID0gRmFsc2UKLSAgICBlbHNlOgotICAgICAgc2VsZi5kYXRhID0gc2VsZi5wcm90b2NvbC50cmFucy5yZWFkKDEpCi0gICAgcmV0dXJuIHNlbGYuZGF0YQorICAgIGRlZiByZWFkKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmhhc0RhdGEgaXMgVHJ1ZToKKyAgICAgICAgICAgIHNlbGYuaGFzRGF0YSA9IEZhbHNlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmRhdGEgPSBzZWxmLnByb3RvY29sLnRyYW5zLnJlYWQoMSkKKyAgICAgICAgcmV0dXJuIHNlbGYuZGF0YQogCi0gIGRlZiBwZWVrKHNlbGYpOgotICAgIGlmIHNlbGYuaGFzRGF0YSBpcyBGYWxzZToKLSAgICAgIHNlbGYuZGF0YSA9IHNlbGYucHJvdG9jb2wudHJhbnMucmVhZCgxKQotICAgIHNlbGYuaGFzRGF0YSA9IFRydWUKLSAgICByZXR1cm4gc2VsZi5kYXRhCisgICAgZGVmIHBlZWsoc2VsZik6CisgICAgICAgIGlmIHNlbGYuaGFzRGF0YSBpcyBGYWxzZToKKyAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYucHJvdG9jb2wudHJhbnMucmVhZCgxKQorICAgICAgICBzZWxmLmhhc0RhdGEgPSBUcnVlCisgICAgICAgIHJldHVybiBzZWxmLmRhdGEKKwogCiBjbGFzcyBUSlNPTlByb3RvY29sQmFzZShUUHJvdG9jb2xCYXNlKToKIAotICBkZWYgX19pbml0X18oc2VsZiwgdHJhbnMpOgotICAgIFRQcm90b2NvbEJhc2UuX19pbml0X18oc2VsZiwgdHJhbnMpCi0gICAgc2VsZi5yZXNldFdyaXRlQ29udGV4dCgpCi0gICAgc2VsZi5yZXNldFJlYWRDb250ZXh0KCkKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHJhbnMpOgorICAgICAgICBUUHJvdG9jb2xCYXNlLl9faW5pdF9fKHNlbGYsIHRyYW5zKQorICAgICAgICBzZWxmLnJlc2V0V3JpdGVDb250ZXh0KCkKKyAgICAgICAgc2VsZi5yZXNldFJlYWRDb250ZXh0KCkKIAotICBkZWYgcmVzZXRXcml0ZUNvbnRleHQoc2VsZik6Ci0gICAgc2VsZi5jb250ZXh0ID0gSlNPTkJhc2VDb250ZXh0KHNlbGYpCi0gICAgc2VsZi5jb250ZXh0U3RhY2sgPSBbc2VsZi5jb250ZXh0XQorICAgICMgV2UgZG9uJ3QgaGF2ZSBsZW5ndGggbGltaXQgaW1wbGVtZW50YXRpb24gZm9yIEpTT04gcHJvdG9jb2xzCisgICAgQHByb3BlcnR5CisgICAgZGVmIHN0cmluZ19sZW5ndGhfbGltaXQoc2VuZik6CisgICAgICAgIHJldHVybiBOb25lCiAKLSAgZGVmIHJlc2V0UmVhZENvbnRleHQoc2VsZik6Ci0gICAgc2VsZi5yZXNldFdyaXRlQ29udGV4dCgpCi0gICAgc2VsZi5yZWFkZXIgPSBMb29rYWhlYWRSZWFkZXIoc2VsZikKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgY29udGFpbmVyX2xlbmd0aF9saW1pdChzZW5mKToKKyAgICAgICAgcmV0dXJuIE5vbmUKIAotICBkZWYgcHVzaENvbnRleHQoc2VsZiwgY3R4KToKLSAgICBzZWxmLmNvbnRleHRTdGFjay5hcHBlbmQoY3R4KQotICAgIHNlbGYuY29udGV4dCA9IGN0eAorICAgIGRlZiByZXNldFdyaXRlQ29udGV4dChzZWxmKToKKyAgICAgICAgc2VsZi5jb250ZXh0ID0gSlNPTkJhc2VDb250ZXh0KHNlbGYpCisgICAgICAgIHNlbGYuY29udGV4dFN0YWNrID0gW3NlbGYuY29udGV4dF0KIAotICBkZWYgcG9wQ29udGV4dChzZWxmKToKLSAgICBzZWxmLmNvbnRleHRTdGFjay5wb3AoKQotICAgIGlmIHNlbGYuY29udGV4dFN0YWNrOgotICAgICAgc2VsZi5jb250ZXh0ID0gc2VsZi5jb250ZXh0U3RhY2tbLTFdCi0gICAgZWxzZToKLSAgICAgIHNlbGYuY29udGV4dCA9IEpTT05CYXNlQ29udGV4dChzZWxmKQorICAgIGRlZiByZXNldFJlYWRDb250ZXh0KHNlbGYpOgorICAgICAgICBzZWxmLnJlc2V0V3JpdGVDb250ZXh0KCkKKyAgICAgICAgc2VsZi5yZWFkZXIgPSBMb29rYWhlYWRSZWFkZXIoc2VsZikKIAotICBkZWYgd3JpdGVKU09OU3RyaW5nKHNlbGYsIHN0cmluZyk6Ci0gICAgc2VsZi5jb250ZXh0LndyaXRlKCkKLSAgICBzZWxmLnRyYW5zLndyaXRlKGpzb24uZHVtcHMoc3RyaW5nKSkKKyAgICBkZWYgcHVzaENvbnRleHQoc2VsZiwgY3R4KToKKyAgICAgICAgc2VsZi5jb250ZXh0U3RhY2suYXBwZW5kKGN0eCkKKyAgICAgICAgc2VsZi5jb250ZXh0ID0gY3R4CiAKLSAgZGVmIHdyaXRlSlNPTk51bWJlcihzZWxmLCBudW1iZXIpOgotICAgIHNlbGYuY29udGV4dC53cml0ZSgpCi0gICAganNOdW1iZXIgPSBzdHIobnVtYmVyKQotICAgIGlmIHNlbGYuY29udGV4dC5lc2NhcGVOdW0oKToKLSAgICAgIGpzTnVtYmVyID0gIiVzJXMlcyIgJSAoUVVPVEUsIGpzTnVtYmVyLCAgUVVPVEUpCi0gICAgc2VsZi50cmFucy53cml0ZShqc051bWJlcikKLQotICBkZWYgd3JpdGVKU09OQmFzZTY0KHNlbGYsIGJpbmFyeSk6Ci0gICAgc2VsZi5jb250ZXh0LndyaXRlKCkKLSAgICBzZWxmLnRyYW5zLndyaXRlKFFVT1RFKQotICAgIHNlbGYudHJhbnMud3JpdGUoYmFzZTY0LmI2NGVuY29kZShiaW5hcnkpKQotICAgIHNlbGYudHJhbnMud3JpdGUoUVVPVEUpCi0KLSAgZGVmIHdyaXRlSlNPTk9iamVjdFN0YXJ0KHNlbGYpOgotICAgIHNlbGYuY29udGV4dC53cml0ZSgpCi0gICAgc2VsZi50cmFucy53cml0ZShMQlJBQ0UpCi0gICAgc2VsZi5wdXNoQ29udGV4dChKU09OUGFpckNvbnRleHQoc2VsZikpCi0KLSAgZGVmIHdyaXRlSlNPTk9iamVjdEVuZChzZWxmKToKLSAgICBzZWxmLnBvcENvbnRleHQoKQotICAgIHNlbGYudHJhbnMud3JpdGUoUkJSQUNFKQotCi0gIGRlZiB3cml0ZUpTT05BcnJheVN0YXJ0KHNlbGYpOgotICAgIHNlbGYuY29udGV4dC53cml0ZSgpCi0gICAgc2VsZi50cmFucy53cml0ZShMQlJBQ0tFVCkKLSAgICBzZWxmLnB1c2hDb250ZXh0KEpTT05MaXN0Q29udGV4dChzZWxmKSkKLQotICBkZWYgd3JpdGVKU09OQXJyYXlFbmQoc2VsZik6Ci0gICAgc2VsZi5wb3BDb250ZXh0KCkKLSAgICBzZWxmLnRyYW5zLndyaXRlKFJCUkFDS0VUKQotCi0gIGRlZiByZWFkSlNPTlN5bnRheENoYXIoc2VsZiwgY2hhcmFjdGVyKToKLSAgICBjdXJyZW50ID0gc2VsZi5yZWFkZXIucmVhZCgpCi0gICAgaWYgY2hhcmFjdGVyICE9IGN1cnJlbnQ6Ci0gICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5leHBlY3RlZCBjaGFyYWN0ZXI6ICVzIiAlIGN1cnJlbnQpCi0KLSAgZGVmIHJlYWRKU09OU3RyaW5nKHNlbGYsIHNraXBDb250ZXh0KToKLSAgICBzdHJpbmcgPSBbXQotICAgIGlmIHNraXBDb250ZXh0IGlzIEZhbHNlOgotICAgICAgc2VsZi5jb250ZXh0LnJlYWQoKQotICAgIHNlbGYucmVhZEpTT05TeW50YXhDaGFyKFFVT1RFKQotICAgIHdoaWxlIFRydWU6Ci0gICAgICBjaGFyYWN0ZXIgPSBzZWxmLnJlYWRlci5yZWFkKCkKLSAgICAgIGlmIGNoYXJhY3RlciA9PSBRVU9URToKLSAgICAgICAgYnJlYWsKLSAgICAgIGlmIGNoYXJhY3RlciA9PSBFU0NTRVFbMF06Ci0gICAgICAgIGNoYXJhY3RlciA9IHNlbGYucmVhZGVyLnJlYWQoKQotICAgICAgICBpZiBjaGFyYWN0ZXIgPT0gRVNDU0VRWzFdOgotICAgICAgICAgIHNlbGYucmVhZEpTT05TeW50YXhDaGFyKFpFUk8pCi0gICAgICAgICAgc2VsZi5yZWFkSlNPTlN5bnRheENoYXIoWkVSTykKLSAgICAgICAgICBjaGFyYWN0ZXIgPSBqc29uLkpTT05EZWNvZGVyKCkuZGVjb2RlKCciXHUwMCVzIicgJSBzZWxmLnRyYW5zLnJlYWQoMikpCisgICAgZGVmIHBvcENvbnRleHQoc2VsZik6CisgICAgICAgIHNlbGYuY29udGV4dFN0YWNrLnBvcCgpCisgICAgICAgIGlmIHNlbGYuY29udGV4dFN0YWNrOgorICAgICAgICAgICAgc2VsZi5jb250ZXh0ID0gc2VsZi5jb250ZXh0U3RhY2tbLTFdCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgb2ZmID0gRVNDQVBFX0NIQVIuZmluZChjaGFyYWN0ZXIpCi0gICAgICAgICAgaWYgb2ZmID09IC0xOgorICAgICAgICAgICAgc2VsZi5jb250ZXh0ID0gSlNPTkJhc2VDb250ZXh0KHNlbGYpCisKKyAgICBkZWYgd3JpdGVKU09OU3RyaW5nKHNlbGYsIHN0cmluZyk6CisgICAgICAgIHNlbGYuY29udGV4dC53cml0ZSgpCisgICAgICAgIGpzb25fc3RyID0gWyciJ10KKyAgICAgICAgZm9yIHMgaW4gc3RyaW5nOgorICAgICAgICAgICAgZXNjYXBlZCA9IEVTQ0FQRV9DSEFSX1ZBTFMuZ2V0KHMsIHMpCisgICAgICAgICAgICBqc29uX3N0ci5hcHBlbmQoZXNjYXBlZCkKKyAgICAgICAganNvbl9zdHIuYXBwZW5kKCciJykKKyAgICAgICAgc2VsZi50cmFucy53cml0ZShzdHJfdG9fYmluYXJ5KCcnLmpvaW4oanNvbl9zdHIpKSkKKworICAgIGRlZiB3cml0ZUpTT05OdW1iZXIoc2VsZiwgbnVtYmVyLCBmb3JtYXR0ZXI9J3swfScpOgorICAgICAgICBzZWxmLmNvbnRleHQud3JpdGUoKQorICAgICAgICBqc051bWJlciA9IHN0cihmb3JtYXR0ZXIuZm9ybWF0KG51bWJlcikpLmVuY29kZSgnYXNjaWknKQorICAgICAgICBpZiBzZWxmLmNvbnRleHQuZXNjYXBlTnVtKCk6CisgICAgICAgICAgICBzZWxmLnRyYW5zLndyaXRlKFFVT1RFKQorICAgICAgICAgICAgc2VsZi50cmFucy53cml0ZShqc051bWJlcikKKyAgICAgICAgICAgIHNlbGYudHJhbnMud3JpdGUoUVVPVEUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnRyYW5zLndyaXRlKGpzTnVtYmVyKQorCisgICAgZGVmIHdyaXRlSlNPTkJhc2U2NChzZWxmLCBiaW5hcnkpOgorICAgICAgICBzZWxmLmNvbnRleHQud3JpdGUoKQorICAgICAgICBzZWxmLnRyYW5zLndyaXRlKFFVT1RFKQorICAgICAgICBzZWxmLnRyYW5zLndyaXRlKGJhc2U2NC5iNjRlbmNvZGUoYmluYXJ5KSkKKyAgICAgICAgc2VsZi50cmFucy53cml0ZShRVU9URSkKKworICAgIGRlZiB3cml0ZUpTT05PYmplY3RTdGFydChzZWxmKToKKyAgICAgICAgc2VsZi5jb250ZXh0LndyaXRlKCkKKyAgICAgICAgc2VsZi50cmFucy53cml0ZShMQlJBQ0UpCisgICAgICAgIHNlbGYucHVzaENvbnRleHQoSlNPTlBhaXJDb250ZXh0KHNlbGYpKQorCisgICAgZGVmIHdyaXRlSlNPTk9iamVjdEVuZChzZWxmKToKKyAgICAgICAgc2VsZi5wb3BDb250ZXh0KCkKKyAgICAgICAgc2VsZi50cmFucy53cml0ZShSQlJBQ0UpCisKKyAgICBkZWYgd3JpdGVKU09OQXJyYXlTdGFydChzZWxmKToKKyAgICAgICAgc2VsZi5jb250ZXh0LndyaXRlKCkKKyAgICAgICAgc2VsZi50cmFucy53cml0ZShMQlJBQ0tFVCkKKyAgICAgICAgc2VsZi5wdXNoQ29udGV4dChKU09OTGlzdENvbnRleHQoc2VsZikpCisKKyAgICBkZWYgd3JpdGVKU09OQXJyYXlFbmQoc2VsZik6CisgICAgICAgIHNlbGYucG9wQ29udGV4dCgpCisgICAgICAgIHNlbGYudHJhbnMud3JpdGUoUkJSQUNLRVQpCisKKyAgICBkZWYgcmVhZEpTT05TeW50YXhDaGFyKHNlbGYsIGNoYXJhY3Rlcik6CisgICAgICAgIGN1cnJlbnQgPSBzZWxmLnJlYWRlci5yZWFkKCkKKyAgICAgICAgaWYgY2hhcmFjdGVyICE9IGN1cnJlbnQ6CiAgICAgICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgY29udHJvbCBjaGFyIikKLSAgICAgICAgICBjaGFyYWN0ZXIgPSBFU0NBUEVfQ0hBUl9WQUxTW29mZl0KLSAgICAgIHN0cmluZy5hcHBlbmQoY2hhcmFjdGVyKQotICAgIHJldHVybiAnJy5qb2luKHN0cmluZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5leHBlY3RlZCBjaGFyYWN0ZXI6ICVzIiAlIGN1cnJlbnQpCiAKLSAgZGVmIGlzSlNPTk51bWVyaWMoc2VsZiwgY2hhcmFjdGVyKToKLSAgICByZXR1cm4gKFRydWUgaWYgTlVNRVJJQ19DSEFSLmZpbmQoY2hhcmFjdGVyKSAhPSAtIDEgZWxzZSBGYWxzZSkKKyAgICBkZWYgX2lzSGlnaFN1cnJvZ2F0ZShzZWxmLCBjb2RldW5pdCk6CisgICAgICAgIHJldHVybiBjb2RldW5pdCA+PSAweGQ4MDAgYW5kIGNvZGV1bml0IDw9IDB4ZGJmZgogCi0gIGRlZiByZWFkSlNPTlF1b3RlcyhzZWxmKToKLSAgICBpZiAoc2VsZi5jb250ZXh0LmVzY2FwZU51bSgpKToKLSAgICAgIHNlbGYucmVhZEpTT05TeW50YXhDaGFyKFFVT1RFKQorICAgIGRlZiBfaXNMb3dTdXJyb2dhdGUoc2VsZiwgY29kZXVuaXQpOgorICAgICAgICByZXR1cm4gY29kZXVuaXQgPj0gMHhkYzAwIGFuZCBjb2RldW5pdCA8PSAweGRmZmYKIAotICBkZWYgcmVhZEpTT05OdW1lcmljQ2hhcnMoc2VsZik6Ci0gICAgbnVtZXJpYyA9IFtdCi0gICAgd2hpbGUgVHJ1ZToKLSAgICAgIGNoYXJhY3RlciA9IHNlbGYucmVhZGVyLnBlZWsoKQotICAgICAgaWYgc2VsZi5pc0pTT05OdW1lcmljKGNoYXJhY3RlcikgaXMgRmFsc2U6Ci0gICAgICAgIGJyZWFrCi0gICAgICBudW1lcmljLmFwcGVuZChzZWxmLnJlYWRlci5yZWFkKCkpCi0gICAgcmV0dXJuICcnLmpvaW4obnVtZXJpYykKKyAgICBkZWYgX3RvQ2hhcihzZWxmLCBoaWdoLCBsb3c9Tm9uZSk6CisgICAgICAgIGlmIG5vdCBsb3c6CisgICAgICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdID09IDI6CisgICAgICAgICAgICAgICAgcmV0dXJuICgiXFx1JTA0eCIgJSBoaWdoKS5kZWNvZGUoJ3VuaWNvZGUtZXNjYXBlJykgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZW5jb2RlKCd1dGYtOCcpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBjaHIoaGlnaCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNvZGVwb2ludCA9ICgxIDw8IDE2KSArICgoaGlnaCAmIDB4M2ZmKSA8PCAxMCkKKyAgICAgICAgICAgIGNvZGVwb2ludCArPSBsb3cgJiAweDNmZgorICAgICAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA9PSAyOgorICAgICAgICAgICAgICAgIHMgPSAiXFxVJTA4eCIgJSBjb2RlcG9pbnQKKyAgICAgICAgICAgICAgICByZXR1cm4gcy5kZWNvZGUoJ3VuaWNvZGUtZXNjYXBlJykuZW5jb2RlKCd1dGYtOCcpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBjaHIoY29kZXBvaW50KQogCi0gIGRlZiByZWFkSlNPTkludGVnZXIoc2VsZik6Ci0gICAgc2VsZi5jb250ZXh0LnJlYWQoKQotICAgIHNlbGYucmVhZEpTT05RdW90ZXMoKQotICAgIG51bWVyaWMgPSBzZWxmLnJlYWRKU09OTnVtZXJpY0NoYXJzKCkKLSAgICBzZWxmLnJlYWRKU09OUXVvdGVzKCkKLSAgICB0cnk6Ci0gICAgICByZXR1cm4gaW50KG51bWVyaWMpCi0gICAgZXhjZXB0IFZhbHVlRXJyb3I6Ci0gICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFkIGRhdGEgZW5jb3VudGVkIGluIG51bWVyaWMgZGF0YSIpCi0KLSAgZGVmIHJlYWRKU09ORG91YmxlKHNlbGYpOgotICAgIHNlbGYuY29udGV4dC5yZWFkKCkKLSAgICBpZiBzZWxmLnJlYWRlci5wZWVrKCkgPT0gUVVPVEU6Ci0gICAgICBzdHJpbmcgID0gc2VsZi5yZWFkSlNPTlN0cmluZyhUcnVlKQotICAgICAgdHJ5OgotICAgICAgICBkb3VibGUgPSBmbG9hdChzdHJpbmcpCi0gICAgICAgIGlmIChzZWxmLmNvbnRleHQuZXNjYXBlTnVtIGlzIEZhbHNlIGFuZAotICAgICAgICAgICAgbm90IG1hdGguaXNpbmYoZG91YmxlKSBhbmQKLSAgICAgICAgICAgIG5vdCBtYXRoLmlzbmFuKGRvdWJsZSkpOgotICAgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTnVtZXJpYyBkYXRhIHVuZXhwZWN0ZWRseSBxdW90ZWQiKQotICAgICAgICByZXR1cm4gZG91YmxlCi0gICAgICBleGNlcHQgVmFsdWVFcnJvcjoKLSAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFkIGRhdGEgZW5jb3VudGVkIGluIG51bWVyaWMgZGF0YSIpCi0gICAgZWxzZToKLSAgICAgIGlmIHNlbGYuY29udGV4dC5lc2NhcGVOdW0oKSBpcyBUcnVlOgorICAgIGRlZiByZWFkSlNPTlN0cmluZyhzZWxmLCBza2lwQ29udGV4dCk6CisgICAgICAgIGhpZ2hTdXJyb2dhdGUgPSBOb25lCisgICAgICAgIHN0cmluZyA9IFtdCisgICAgICAgIGlmIHNraXBDb250ZXh0IGlzIEZhbHNlOgorICAgICAgICAgICAgc2VsZi5jb250ZXh0LnJlYWQoKQogICAgICAgICBzZWxmLnJlYWRKU09OU3ludGF4Q2hhcihRVU9URSkKLSAgICAgIHRyeToKLSAgICAgICAgcmV0dXJuIGZsb2F0KHNlbGYucmVhZEpTT05OdW1lcmljQ2hhcnMoKSkKLSAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgotICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCYWQgZGF0YSBlbmNvdW50ZWQgaW4gbnVtZXJpYyBkYXRhIikKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGNoYXJhY3RlciA9IHNlbGYucmVhZGVyLnJlYWQoKQorICAgICAgICAgICAgaWYgY2hhcmFjdGVyID09IFFVT1RFOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpZiBvcmQoY2hhcmFjdGVyKSA9PSBFU0NTRVEwOgorICAgICAgICAgICAgICAgIGNoYXJhY3RlciA9IHNlbGYucmVhZGVyLnJlYWQoKQorICAgICAgICAgICAgICAgIGlmIG9yZChjaGFyYWN0ZXIpID09IEVTQ1NFUTE6CisgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlciA9IHNlbGYudHJhbnMucmVhZCg0KS5kZWNvZGUoJ2FzY2lpJykKKyAgICAgICAgICAgICAgICAgICAgY29kZXVuaXQgPSBpbnQoY2hhcmFjdGVyLCAxNikKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5faXNIaWdoU3Vycm9nYXRlKGNvZGV1bml0KToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGhpZ2hTdXJyb2dhdGU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgbG93IHN1cnJvZ2F0ZSBjaGFyIikKKyAgICAgICAgICAgICAgICAgICAgICAgIGhpZ2hTdXJyb2dhdGUgPSBjb2RldW5pdAorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgZWxpZiBzZWxmLl9pc0xvd1N1cnJvZ2F0ZShjb2RldW5pdCk6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgaGlnaFN1cnJvZ2F0ZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBoaWdoIHN1cnJvZ2F0ZSBjaGFyIikKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlciA9IHNlbGYuX3RvQ2hhcihoaWdoU3Vycm9nYXRlLCBjb2RldW5pdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGhpZ2hTdXJyb2dhdGUgPSBOb25lCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgPSBzZWxmLl90b0NoYXIoY29kZXVuaXQpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgaWYgY2hhcmFjdGVyIG5vdCBpbiBFU0NBUEVfQ0hBUlM6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgY29udHJvbCBjaGFyIikKKyAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyID0gRVNDQVBFX0NIQVJTW2NoYXJhY3Rlcl0KKyAgICAgICAgICAgIGVsaWYgY2hhcmFjdGVyIGluIEVTQ0FQRV9DSEFSX1ZBTFM6CisgICAgICAgICAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmVzY2FwZWQgY29udHJvbCBjaGFyIikKKyAgICAgICAgICAgIGVsaWYgc3lzLnZlcnNpb25faW5mb1swXSA+IDI6CisgICAgICAgICAgICAgICAgdXRmOF9ieXRlcyA9IGJ5dGVhcnJheShbb3JkKGNoYXJhY3RlcildKQorICAgICAgICAgICAgICAgIHdoaWxlIG9yZChzZWxmLnJlYWRlci5wZWVrKCkpID49IDB4ODA6CisgICAgICAgICAgICAgICAgICAgIHV0ZjhfYnl0ZXMuYXBwZW5kKG9yZChzZWxmLnJlYWRlci5yZWFkKCkpKQorICAgICAgICAgICAgICAgIGNoYXJhY3RlciA9IHV0ZjhfYnl0ZXMuZGVjb2RlKCd1dGY4JykKKyAgICAgICAgICAgIHN0cmluZy5hcHBlbmQoY2hhcmFjdGVyKQogCi0gIGRlZiByZWFkSlNPTkJhc2U2NChzZWxmKToKLSAgICBzdHJpbmcgPSBzZWxmLnJlYWRKU09OU3RyaW5nKEZhbHNlKQotICAgIHJldHVybiBiYXNlNjQuYjY0ZGVjb2RlKHN0cmluZykKKyAgICAgICAgICAgIGlmIGhpZ2hTdXJyb2dhdGU6CisgICAgICAgICAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBsb3cgc3Vycm9nYXRlIGNoYXIiKQorICAgICAgICByZXR1cm4gJycuam9pbihzdHJpbmcpCiAKLSAgZGVmIHJlYWRKU09OT2JqZWN0U3RhcnQoc2VsZik6Ci0gICAgc2VsZi5jb250ZXh0LnJlYWQoKQotICAgIHNlbGYucmVhZEpTT05TeW50YXhDaGFyKExCUkFDRSkKLSAgICBzZWxmLnB1c2hDb250ZXh0KEpTT05QYWlyQ29udGV4dChzZWxmKSkKKyAgICBkZWYgaXNKU09OTnVtZXJpYyhzZWxmLCBjaGFyYWN0ZXIpOgorICAgICAgICByZXR1cm4gKFRydWUgaWYgTlVNRVJJQ19DSEFSLmZpbmQoY2hhcmFjdGVyKSAhPSAtIDEgZWxzZSBGYWxzZSkKIAotICBkZWYgcmVhZEpTT05PYmplY3RFbmQoc2VsZik6Ci0gICAgc2VsZi5yZWFkSlNPTlN5bnRheENoYXIoUkJSQUNFKQotICAgIHNlbGYucG9wQ29udGV4dCgpCisgICAgZGVmIHJlYWRKU09OUXVvdGVzKHNlbGYpOgorICAgICAgICBpZiAoc2VsZi5jb250ZXh0LmVzY2FwZU51bSgpKToKKyAgICAgICAgICAgIHNlbGYucmVhZEpTT05TeW50YXhDaGFyKFFVT1RFKQogCi0gIGRlZiByZWFkSlNPTkFycmF5U3RhcnQoc2VsZik6Ci0gICAgc2VsZi5jb250ZXh0LnJlYWQoKQotICAgIHNlbGYucmVhZEpTT05TeW50YXhDaGFyKExCUkFDS0VUKQotICAgIHNlbGYucHVzaENvbnRleHQoSlNPTkxpc3RDb250ZXh0KHNlbGYpKQorICAgIGRlZiByZWFkSlNPTk51bWVyaWNDaGFycyhzZWxmKToKKyAgICAgICAgbnVtZXJpYyA9IFtdCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBjaGFyYWN0ZXIgPSBzZWxmLnJlYWRlci5wZWVrKCkKKyAgICAgICAgICAgIGlmIHNlbGYuaXNKU09OTnVtZXJpYyhjaGFyYWN0ZXIpIGlzIEZhbHNlOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBudW1lcmljLmFwcGVuZChzZWxmLnJlYWRlci5yZWFkKCkpCisgICAgICAgIHJldHVybiBiJycuam9pbihudW1lcmljKS5kZWNvZGUoJ2FzY2lpJykKIAotICBkZWYgcmVhZEpTT05BcnJheUVuZChzZWxmKToKLSAgICBzZWxmLnJlYWRKU09OU3ludGF4Q2hhcihSQlJBQ0tFVCkKLSAgICBzZWxmLnBvcENvbnRleHQoKQorICAgIGRlZiByZWFkSlNPTkludGVnZXIoc2VsZik6CisgICAgICAgIHNlbGYuY29udGV4dC5yZWFkKCkKKyAgICAgICAgc2VsZi5yZWFkSlNPTlF1b3RlcygpCisgICAgICAgIG51bWVyaWMgPSBzZWxmLnJlYWRKU09OTnVtZXJpY0NoYXJzKCkKKyAgICAgICAgc2VsZi5yZWFkSlNPTlF1b3RlcygpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBpbnQobnVtZXJpYykKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFkIGRhdGEgZW5jb3VudGVkIGluIG51bWVyaWMgZGF0YSIpCisKKyAgICBkZWYgcmVhZEpTT05Eb3VibGUoc2VsZik6CisgICAgICAgIHNlbGYuY29udGV4dC5yZWFkKCkKKyAgICAgICAgaWYgc2VsZi5yZWFkZXIucGVlaygpID09IFFVT1RFOgorICAgICAgICAgICAgc3RyaW5nID0gc2VsZi5yZWFkSlNPTlN0cmluZyhUcnVlKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGRvdWJsZSA9IGZsb2F0KHN0cmluZykKKyAgICAgICAgICAgICAgICBpZiAoc2VsZi5jb250ZXh0LmVzY2FwZU51bSBpcyBGYWxzZSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBtYXRoLmlzaW5mKGRvdWJsZSkgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICBub3QgbWF0aC5pc25hbihkb3VibGUpKToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJOdW1lcmljIGRhdGEgdW5leHBlY3RlZGx5IHF1b3RlZCIpCisgICAgICAgICAgICAgICAgcmV0dXJuIGRvdWJsZQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCYWQgZGF0YSBlbmNvdW50ZWQgaW4gbnVtZXJpYyBkYXRhIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHNlbGYuY29udGV4dC5lc2NhcGVOdW0oKSBpcyBUcnVlOgorICAgICAgICAgICAgICAgIHNlbGYucmVhZEpTT05TeW50YXhDaGFyKFFVT1RFKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJldHVybiBmbG9hdChzZWxmLnJlYWRKU09OTnVtZXJpY0NoYXJzKCkpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJhZCBkYXRhIGVuY291bnRlZCBpbiBudW1lcmljIGRhdGEiKQorCisgICAgZGVmIHJlYWRKU09OQmFzZTY0KHNlbGYpOgorICAgICAgICBzdHJpbmcgPSBzZWxmLnJlYWRKU09OU3RyaW5nKEZhbHNlKQorICAgICAgICBzaXplID0gbGVuKHN0cmluZykKKyAgICAgICAgbSA9IHNpemUgJSA0CisgICAgICAgICMgRm9yY2UgcGFkZGluZyBzaW5jZSBiNjRlbmNvZGUgbWV0aG9kIGRvZXMgbm90IGFsbG93IGl0CisgICAgICAgIGlmIG0gIT0gMDoKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDQgLSBtKToKKyAgICAgICAgICAgICAgICBzdHJpbmcgKz0gJz0nCisgICAgICAgIHJldHVybiBiYXNlNjQuYjY0ZGVjb2RlKHN0cmluZykKKworICAgIGRlZiByZWFkSlNPTk9iamVjdFN0YXJ0KHNlbGYpOgorICAgICAgICBzZWxmLmNvbnRleHQucmVhZCgpCisgICAgICAgIHNlbGYucmVhZEpTT05TeW50YXhDaGFyKExCUkFDRSkKKyAgICAgICAgc2VsZi5wdXNoQ29udGV4dChKU09OUGFpckNvbnRleHQoc2VsZikpCisKKyAgICBkZWYgcmVhZEpTT05PYmplY3RFbmQoc2VsZik6CisgICAgICAgIHNlbGYucmVhZEpTT05TeW50YXhDaGFyKFJCUkFDRSkKKyAgICAgICAgc2VsZi5wb3BDb250ZXh0KCkKKworICAgIGRlZiByZWFkSlNPTkFycmF5U3RhcnQoc2VsZik6CisgICAgICAgIHNlbGYuY29udGV4dC5yZWFkKCkKKyAgICAgICAgc2VsZi5yZWFkSlNPTlN5bnRheENoYXIoTEJSQUNLRVQpCisgICAgICAgIHNlbGYucHVzaENvbnRleHQoSlNPTkxpc3RDb250ZXh0KHNlbGYpKQorCisgICAgZGVmIHJlYWRKU09OQXJyYXlFbmQoc2VsZik6CisgICAgICAgIHNlbGYucmVhZEpTT05TeW50YXhDaGFyKFJCUkFDS0VUKQorICAgICAgICBzZWxmLnBvcENvbnRleHQoKQogCiAKIGNsYXNzIFRKU09OUHJvdG9jb2woVEpTT05Qcm90b2NvbEJhc2UpOgogCi0gIGRlZiByZWFkTWVzc2FnZUJlZ2luKHNlbGYpOgotICAgIHNlbGYucmVzZXRSZWFkQ29udGV4dCgpCi0gICAgc2VsZi5yZWFkSlNPTkFycmF5U3RhcnQoKQotICAgIGlmIHNlbGYucmVhZEpTT05JbnRlZ2VyKCkgIT0gVkVSU0lPTjoKLSAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uQkFEX1ZFUlNJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1lc3NhZ2UgY29udGFpbmVkIGJhZCB2ZXJzaW9uLiIpCi0gICAgbmFtZSA9IHNlbGYucmVhZEpTT05TdHJpbmcoRmFsc2UpCi0gICAgdHlwZW4gPSBzZWxmLnJlYWRKU09OSW50ZWdlcigpCi0gICAgc2VxaWQgPSBzZWxmLnJlYWRKU09OSW50ZWdlcigpCi0gICAgcmV0dXJuIChuYW1lLCB0eXBlbiwgc2VxaWQpCisgICAgZGVmIHJlYWRNZXNzYWdlQmVnaW4oc2VsZik6CisgICAgICAgIHNlbGYucmVzZXRSZWFkQ29udGV4dCgpCisgICAgICAgIHNlbGYucmVhZEpTT05BcnJheVN0YXJ0KCkKKyAgICAgICAgaWYgc2VsZi5yZWFkSlNPTkludGVnZXIoKSAhPSBWRVJTSU9OOgorICAgICAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5CQURfVkVSU0lPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWVzc2FnZSBjb250YWluZWQgYmFkIHZlcnNpb24uIikKKyAgICAgICAgbmFtZSA9IHNlbGYucmVhZEpTT05TdHJpbmcoRmFsc2UpCisgICAgICAgIHR5cGVuID0gc2VsZi5yZWFkSlNPTkludGVnZXIoKQorICAgICAgICBzZXFpZCA9IHNlbGYucmVhZEpTT05JbnRlZ2VyKCkKKyAgICAgICAgcmV0dXJuIChuYW1lLCB0eXBlbiwgc2VxaWQpCiAKLSAgZGVmIHJlYWRNZXNzYWdlRW5kKHNlbGYpOgotICAgIHNlbGYucmVhZEpTT05BcnJheUVuZCgpCisgICAgZGVmIHJlYWRNZXNzYWdlRW5kKHNlbGYpOgorICAgICAgICBzZWxmLnJlYWRKU09OQXJyYXlFbmQoKQogCi0gIGRlZiByZWFkU3RydWN0QmVnaW4oc2VsZik6Ci0gICAgc2VsZi5yZWFkSlNPTk9iamVjdFN0YXJ0KCkKKyAgICBkZWYgcmVhZFN0cnVjdEJlZ2luKHNlbGYpOgorICAgICAgICBzZWxmLnJlYWRKU09OT2JqZWN0U3RhcnQoKQogCi0gIGRlZiByZWFkU3RydWN0RW5kKHNlbGYpOgotICAgIHNlbGYucmVhZEpTT05PYmplY3RFbmQoKQorICAgIGRlZiByZWFkU3RydWN0RW5kKHNlbGYpOgorICAgICAgICBzZWxmLnJlYWRKU09OT2JqZWN0RW5kKCkKIAotICBkZWYgcmVhZEZpZWxkQmVnaW4oc2VsZik6Ci0gICAgY2hhcmFjdGVyID0gc2VsZi5yZWFkZXIucGVlaygpCi0gICAgdHR5cGUgPSAwCi0gICAgaWQgPSAwCi0gICAgaWYgY2hhcmFjdGVyID09IFJCUkFDRToKLSAgICAgIHR0eXBlID0gVFR5cGUuU1RPUAotICAgIGVsc2U6Ci0gICAgICBpZCA9IHNlbGYucmVhZEpTT05JbnRlZ2VyKCkKLSAgICAgIHNlbGYucmVhZEpTT05PYmplY3RTdGFydCgpCi0gICAgICB0dHlwZSA9IEpUWVBFU1tzZWxmLnJlYWRKU09OU3RyaW5nKEZhbHNlKV0KLSAgICByZXR1cm4gKE5vbmUsIHR0eXBlLCBpZCkKKyAgICBkZWYgcmVhZEZpZWxkQmVnaW4oc2VsZik6CisgICAgICAgIGNoYXJhY3RlciA9IHNlbGYucmVhZGVyLnBlZWsoKQorICAgICAgICB0dHlwZSA9IDAKKyAgICAgICAgaWQgPSAwCisgICAgICAgIGlmIGNoYXJhY3RlciA9PSBSQlJBQ0U6CisgICAgICAgICAgICB0dHlwZSA9IFRUeXBlLlNUT1AKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlkID0gc2VsZi5yZWFkSlNPTkludGVnZXIoKQorICAgICAgICAgICAgc2VsZi5yZWFkSlNPTk9iamVjdFN0YXJ0KCkKKyAgICAgICAgICAgIHR0eXBlID0gSlRZUEVTW3NlbGYucmVhZEpTT05TdHJpbmcoRmFsc2UpXQorICAgICAgICByZXR1cm4gKE5vbmUsIHR0eXBlLCBpZCkKIAotICBkZWYgcmVhZEZpZWxkRW5kKHNlbGYpOgotICAgIHNlbGYucmVhZEpTT05PYmplY3RFbmQoKQorICAgIGRlZiByZWFkRmllbGRFbmQoc2VsZik6CisgICAgICAgIHNlbGYucmVhZEpTT05PYmplY3RFbmQoKQogCi0gIGRlZiByZWFkTWFwQmVnaW4oc2VsZik6Ci0gICAgc2VsZi5yZWFkSlNPTkFycmF5U3RhcnQoKQotICAgIGtleVR5cGUgPSBKVFlQRVNbc2VsZi5yZWFkSlNPTlN0cmluZyhGYWxzZSldCi0gICAgdmFsdWVUeXBlID0gSlRZUEVTW3NlbGYucmVhZEpTT05TdHJpbmcoRmFsc2UpXQotICAgIHNpemUgPSBzZWxmLnJlYWRKU09OSW50ZWdlcigpCi0gICAgc2VsZi5yZWFkSlNPTk9iamVjdFN0YXJ0KCkKLSAgICByZXR1cm4gKGtleVR5cGUsIHZhbHVlVHlwZSwgc2l6ZSkKKyAgICBkZWYgcmVhZE1hcEJlZ2luKHNlbGYpOgorICAgICAgICBzZWxmLnJlYWRKU09OQXJyYXlTdGFydCgpCisgICAgICAgIGtleVR5cGUgPSBKVFlQRVNbc2VsZi5yZWFkSlNPTlN0cmluZyhGYWxzZSldCisgICAgICAgIHZhbHVlVHlwZSA9IEpUWVBFU1tzZWxmLnJlYWRKU09OU3RyaW5nKEZhbHNlKV0KKyAgICAgICAgc2l6ZSA9IHNlbGYucmVhZEpTT05JbnRlZ2VyKCkKKyAgICAgICAgc2VsZi5yZWFkSlNPTk9iamVjdFN0YXJ0KCkKKyAgICAgICAgcmV0dXJuIChrZXlUeXBlLCB2YWx1ZVR5cGUsIHNpemUpCiAKLSAgZGVmIHJlYWRNYXBFbmQoc2VsZik6Ci0gICAgc2VsZi5yZWFkSlNPTk9iamVjdEVuZCgpCi0gICAgc2VsZi5yZWFkSlNPTkFycmF5RW5kKCkKKyAgICBkZWYgcmVhZE1hcEVuZChzZWxmKToKKyAgICAgICAgc2VsZi5yZWFkSlNPTk9iamVjdEVuZCgpCisgICAgICAgIHNlbGYucmVhZEpTT05BcnJheUVuZCgpCiAKLSAgZGVmIHJlYWRDb2xsZWN0aW9uQmVnaW4oc2VsZik6Ci0gICAgc2VsZi5yZWFkSlNPTkFycmF5U3RhcnQoKQotICAgIGVsZW1UeXBlID0gSlRZUEVTW3NlbGYucmVhZEpTT05TdHJpbmcoRmFsc2UpXQotICAgIHNpemUgPSBzZWxmLnJlYWRKU09OSW50ZWdlcigpCi0gICAgcmV0dXJuIChlbGVtVHlwZSwgc2l6ZSkKLSAgcmVhZExpc3RCZWdpbiA9IHJlYWRDb2xsZWN0aW9uQmVnaW4KLSAgcmVhZFNldEJlZ2luID0gcmVhZENvbGxlY3Rpb25CZWdpbgorICAgIGRlZiByZWFkQ29sbGVjdGlvbkJlZ2luKHNlbGYpOgorICAgICAgICBzZWxmLnJlYWRKU09OQXJyYXlTdGFydCgpCisgICAgICAgIGVsZW1UeXBlID0gSlRZUEVTW3NlbGYucmVhZEpTT05TdHJpbmcoRmFsc2UpXQorICAgICAgICBzaXplID0gc2VsZi5yZWFkSlNPTkludGVnZXIoKQorICAgICAgICByZXR1cm4gKGVsZW1UeXBlLCBzaXplKQorICAgIHJlYWRMaXN0QmVnaW4gPSByZWFkQ29sbGVjdGlvbkJlZ2luCisgICAgcmVhZFNldEJlZ2luID0gcmVhZENvbGxlY3Rpb25CZWdpbgogCi0gIGRlZiByZWFkQ29sbGVjdGlvbkVuZChzZWxmKToKLSAgICBzZWxmLnJlYWRKU09OQXJyYXlFbmQoKQotICByZWFkU2V0RW5kID0gcmVhZENvbGxlY3Rpb25FbmQKLSAgcmVhZExpc3RFbmQgPSByZWFkQ29sbGVjdGlvbkVuZAorICAgIGRlZiByZWFkQ29sbGVjdGlvbkVuZChzZWxmKToKKyAgICAgICAgc2VsZi5yZWFkSlNPTkFycmF5RW5kKCkKKyAgICByZWFkU2V0RW5kID0gcmVhZENvbGxlY3Rpb25FbmQKKyAgICByZWFkTGlzdEVuZCA9IHJlYWRDb2xsZWN0aW9uRW5kCiAKLSAgZGVmIHJlYWRCb29sKHNlbGYpOgotICAgIHJldHVybiAoRmFsc2UgaWYgc2VsZi5yZWFkSlNPTkludGVnZXIoKSA9PSAwIGVsc2UgVHJ1ZSkKKyAgICBkZWYgcmVhZEJvb2woc2VsZik6CisgICAgICAgIHJldHVybiAoRmFsc2UgaWYgc2VsZi5yZWFkSlNPTkludGVnZXIoKSA9PSAwIGVsc2UgVHJ1ZSkKIAotICBkZWYgcmVhZE51bWJlcihzZWxmKToKLSAgICByZXR1cm4gc2VsZi5yZWFkSlNPTkludGVnZXIoKQotICByZWFkQnl0ZSA9IHJlYWROdW1iZXIKLSAgcmVhZEkxNiA9IHJlYWROdW1iZXIKLSAgcmVhZEkzMiA9IHJlYWROdW1iZXIKLSAgcmVhZEk2NCA9IHJlYWROdW1iZXIKKyAgICBkZWYgcmVhZE51bWJlcihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucmVhZEpTT05JbnRlZ2VyKCkKKyAgICByZWFkQnl0ZSA9IHJlYWROdW1iZXIKKyAgICByZWFkSTE2ID0gcmVhZE51bWJlcgorICAgIHJlYWRJMzIgPSByZWFkTnVtYmVyCisgICAgcmVhZEk2NCA9IHJlYWROdW1iZXIKIAotICBkZWYgcmVhZERvdWJsZShzZWxmKToKLSAgICByZXR1cm4gc2VsZi5yZWFkSlNPTkRvdWJsZSgpCisgICAgZGVmIHJlYWREb3VibGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnJlYWRKU09ORG91YmxlKCkKIAotICBkZWYgcmVhZFN0cmluZyhzZWxmKToKLSAgICByZXR1cm4gc2VsZi5yZWFkSlNPTlN0cmluZyhGYWxzZSkKKyAgICBkZWYgcmVhZFN0cmluZyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucmVhZEpTT05TdHJpbmcoRmFsc2UpCiAKLSAgZGVmIHJlYWRCaW5hcnkoc2VsZik6Ci0gICAgcmV0dXJuIHNlbGYucmVhZEpTT05CYXNlNjQoKQorICAgIGRlZiByZWFkQmluYXJ5KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5yZWFkSlNPTkJhc2U2NCgpCiAKLSAgZGVmIHdyaXRlTWVzc2FnZUJlZ2luKHNlbGYsIG5hbWUsIHJlcXVlc3RfdHlwZSwgc2VxaWQpOgotICAgIHNlbGYucmVzZXRXcml0ZUNvbnRleHQoKQotICAgIHNlbGYud3JpdGVKU09OQXJyYXlTdGFydCgpCi0gICAgc2VsZi53cml0ZUpTT05OdW1iZXIoVkVSU0lPTikKLSAgICBzZWxmLndyaXRlSlNPTlN0cmluZyhuYW1lKQotICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKHJlcXVlc3RfdHlwZSkKLSAgICBzZWxmLndyaXRlSlNPTk51bWJlcihzZXFpZCkKKyAgICBkZWYgd3JpdGVNZXNzYWdlQmVnaW4oc2VsZiwgbmFtZSwgcmVxdWVzdF90eXBlLCBzZXFpZCk6CisgICAgICAgIHNlbGYucmVzZXRXcml0ZUNvbnRleHQoKQorICAgICAgICBzZWxmLndyaXRlSlNPTkFycmF5U3RhcnQoKQorICAgICAgICBzZWxmLndyaXRlSlNPTk51bWJlcihWRVJTSU9OKQorICAgICAgICBzZWxmLndyaXRlSlNPTlN0cmluZyhuYW1lKQorICAgICAgICBzZWxmLndyaXRlSlNPTk51bWJlcihyZXF1ZXN0X3R5cGUpCisgICAgICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKHNlcWlkKQogCi0gIGRlZiB3cml0ZU1lc3NhZ2VFbmQoc2VsZik6Ci0gICAgc2VsZi53cml0ZUpTT05BcnJheUVuZCgpCisgICAgZGVmIHdyaXRlTWVzc2FnZUVuZChzZWxmKToKKyAgICAgICAgc2VsZi53cml0ZUpTT05BcnJheUVuZCgpCiAKLSAgZGVmIHdyaXRlU3RydWN0QmVnaW4oc2VsZiwgbmFtZSk6Ci0gICAgc2VsZi53cml0ZUpTT05PYmplY3RTdGFydCgpCisgICAgZGVmIHdyaXRlU3RydWN0QmVnaW4oc2VsZiwgbmFtZSk6CisgICAgICAgIHNlbGYud3JpdGVKU09OT2JqZWN0U3RhcnQoKQogCi0gIGRlZiB3cml0ZVN0cnVjdEVuZChzZWxmKToKLSAgICBzZWxmLndyaXRlSlNPTk9iamVjdEVuZCgpCisgICAgZGVmIHdyaXRlU3RydWN0RW5kKHNlbGYpOgorICAgICAgICBzZWxmLndyaXRlSlNPTk9iamVjdEVuZCgpCiAKLSAgZGVmIHdyaXRlRmllbGRCZWdpbihzZWxmLCBuYW1lLCB0dHlwZSwgaWQpOgotICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKGlkKQotICAgIHNlbGYud3JpdGVKU09OT2JqZWN0U3RhcnQoKQotICAgIHNlbGYud3JpdGVKU09OU3RyaW5nKENUWVBFU1t0dHlwZV0pCisgICAgZGVmIHdyaXRlRmllbGRCZWdpbihzZWxmLCBuYW1lLCB0dHlwZSwgaWQpOgorICAgICAgICBzZWxmLndyaXRlSlNPTk51bWJlcihpZCkKKyAgICAgICAgc2VsZi53cml0ZUpTT05PYmplY3RTdGFydCgpCisgICAgICAgIHNlbGYud3JpdGVKU09OU3RyaW5nKENUWVBFU1t0dHlwZV0pCiAKLSAgZGVmIHdyaXRlRmllbGRFbmQoc2VsZik6Ci0gICAgc2VsZi53cml0ZUpTT05PYmplY3RFbmQoKQorICAgIGRlZiB3cml0ZUZpZWxkRW5kKHNlbGYpOgorICAgICAgICBzZWxmLndyaXRlSlNPTk9iamVjdEVuZCgpCiAKLSAgZGVmIHdyaXRlRmllbGRTdG9wKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVGaWVsZFN0b3Aoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVNYXBCZWdpbihzZWxmLCBrdHlwZSwgdnR5cGUsIHNpemUpOgotICAgIHNlbGYud3JpdGVKU09OQXJyYXlTdGFydCgpCi0gICAgc2VsZi53cml0ZUpTT05TdHJpbmcoQ1RZUEVTW2t0eXBlXSkKLSAgICBzZWxmLndyaXRlSlNPTlN0cmluZyhDVFlQRVNbdnR5cGVdKQotICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKHNpemUpCi0gICAgc2VsZi53cml0ZUpTT05PYmplY3RTdGFydCgpCisgICAgZGVmIHdyaXRlTWFwQmVnaW4oc2VsZiwga3R5cGUsIHZ0eXBlLCBzaXplKToKKyAgICAgICAgc2VsZi53cml0ZUpTT05BcnJheVN0YXJ0KCkKKyAgICAgICAgc2VsZi53cml0ZUpTT05TdHJpbmcoQ1RZUEVTW2t0eXBlXSkKKyAgICAgICAgc2VsZi53cml0ZUpTT05TdHJpbmcoQ1RZUEVTW3Z0eXBlXSkKKyAgICAgICAgc2VsZi53cml0ZUpTT05OdW1iZXIoc2l6ZSkKKyAgICAgICAgc2VsZi53cml0ZUpTT05PYmplY3RTdGFydCgpCiAKLSAgZGVmIHdyaXRlTWFwRW5kKHNlbGYpOgotICAgIHNlbGYud3JpdGVKU09OT2JqZWN0RW5kKCkKLSAgICBzZWxmLndyaXRlSlNPTkFycmF5RW5kKCkKLSAgICAKLSAgZGVmIHdyaXRlTGlzdEJlZ2luKHNlbGYsIGV0eXBlLCBzaXplKToKLSAgICBzZWxmLndyaXRlSlNPTkFycmF5U3RhcnQoKQotICAgIHNlbGYud3JpdGVKU09OU3RyaW5nKENUWVBFU1tldHlwZV0pCi0gICAgc2VsZi53cml0ZUpTT05OdW1iZXIoc2l6ZSkKLSAgICAKLSAgZGVmIHdyaXRlTGlzdEVuZChzZWxmKToKLSAgICBzZWxmLndyaXRlSlNPTkFycmF5RW5kKCkKKyAgICBkZWYgd3JpdGVNYXBFbmQoc2VsZik6CisgICAgICAgIHNlbGYud3JpdGVKU09OT2JqZWN0RW5kKCkKKyAgICAgICAgc2VsZi53cml0ZUpTT05BcnJheUVuZCgpCiAKLSAgZGVmIHdyaXRlU2V0QmVnaW4oc2VsZiwgZXR5cGUsIHNpemUpOgotICAgIHNlbGYud3JpdGVKU09OQXJyYXlTdGFydCgpCi0gICAgc2VsZi53cml0ZUpTT05TdHJpbmcoQ1RZUEVTW2V0eXBlXSkKLSAgICBzZWxmLndyaXRlSlNPTk51bWJlcihzaXplKQotICAgIAotICBkZWYgd3JpdGVTZXRFbmQoc2VsZik6Ci0gICAgc2VsZi53cml0ZUpTT05BcnJheUVuZCgpCisgICAgZGVmIHdyaXRlTGlzdEJlZ2luKHNlbGYsIGV0eXBlLCBzaXplKToKKyAgICAgICAgc2VsZi53cml0ZUpTT05BcnJheVN0YXJ0KCkKKyAgICAgICAgc2VsZi53cml0ZUpTT05TdHJpbmcoQ1RZUEVTW2V0eXBlXSkKKyAgICAgICAgc2VsZi53cml0ZUpTT05OdW1iZXIoc2l6ZSkKIAotICBkZWYgd3JpdGVCb29sKHNlbGYsIGJvb2xlYW4pOgotICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKDEgaWYgYm9vbGVhbiBpcyBUcnVlIGVsc2UgMCkKKyAgICBkZWYgd3JpdGVMaXN0RW5kKHNlbGYpOgorICAgICAgICBzZWxmLndyaXRlSlNPTkFycmF5RW5kKCkKIAotICBkZWYgd3JpdGVCeXRlKHNlbGYsIGJ5dGUpOgotICAgIGNoZWNrSW50ZWdlckxpbWl0cyhieXRlLCA4KQotICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKGJ5dGUpCisgICAgZGVmIHdyaXRlU2V0QmVnaW4oc2VsZiwgZXR5cGUsIHNpemUpOgorICAgICAgICBzZWxmLndyaXRlSlNPTkFycmF5U3RhcnQoKQorICAgICAgICBzZWxmLndyaXRlSlNPTlN0cmluZyhDVFlQRVNbZXR5cGVdKQorICAgICAgICBzZWxmLndyaXRlSlNPTk51bWJlcihzaXplKQogCi0gIGRlZiB3cml0ZUkxNihzZWxmLCBpMTYpOgotICAgIGNoZWNrSW50ZWdlckxpbWl0cyhpMTYsIDE2KQotICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKGkxNikKKyAgICBkZWYgd3JpdGVTZXRFbmQoc2VsZik6CisgICAgICAgIHNlbGYud3JpdGVKU09OQXJyYXlFbmQoKQogCi0gIGRlZiB3cml0ZUkzMihzZWxmLCBpMzIpOgotICAgIGNoZWNrSW50ZWdlckxpbWl0cyhpMzIsIDMyKQotICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKGkzMikKKyAgICBkZWYgd3JpdGVCb29sKHNlbGYsIGJvb2xlYW4pOgorICAgICAgICBzZWxmLndyaXRlSlNPTk51bWJlcigxIGlmIGJvb2xlYW4gaXMgVHJ1ZSBlbHNlIDApCiAKLSAgZGVmIHdyaXRlSTY0KHNlbGYsIGk2NCk6Ci0gICAgY2hlY2tJbnRlZ2VyTGltaXRzKGk2NCwgNjQpCi0gICAgc2VsZi53cml0ZUpTT05OdW1iZXIoaTY0KQorICAgIGRlZiB3cml0ZUJ5dGUoc2VsZiwgYnl0ZSk6CisgICAgICAgIGNoZWNrSW50ZWdlckxpbWl0cyhieXRlLCA4KQorICAgICAgICBzZWxmLndyaXRlSlNPTk51bWJlcihieXRlKQogCi0gIGRlZiB3cml0ZURvdWJsZShzZWxmLCBkYmwpOgotICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKGRibCkKKyAgICBkZWYgd3JpdGVJMTYoc2VsZiwgaTE2KToKKyAgICAgICAgY2hlY2tJbnRlZ2VyTGltaXRzKGkxNiwgMTYpCisgICAgICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKGkxNikKIAotICBkZWYgd3JpdGVTdHJpbmcoc2VsZiwgc3RyaW5nKToKLSAgICBzZWxmLndyaXRlSlNPTlN0cmluZyhzdHJpbmcpCi0gICAgCi0gIGRlZiB3cml0ZUJpbmFyeShzZWxmLCBiaW5hcnkpOgotICAgIHNlbGYud3JpdGVKU09OQmFzZTY0KGJpbmFyeSkKKyAgICBkZWYgd3JpdGVJMzIoc2VsZiwgaTMyKToKKyAgICAgICAgY2hlY2tJbnRlZ2VyTGltaXRzKGkzMiwgMzIpCisgICAgICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKGkzMikKKworICAgIGRlZiB3cml0ZUk2NChzZWxmLCBpNjQpOgorICAgICAgICBjaGVja0ludGVnZXJMaW1pdHMoaTY0LCA2NCkKKyAgICAgICAgc2VsZi53cml0ZUpTT05OdW1iZXIoaTY0KQorCisgICAgZGVmIHdyaXRlRG91YmxlKHNlbGYsIGRibCk6CisgICAgICAgICMgMTcgc2lnbmlmaWNhbnQgZGlnaXRzIHNob3VsZCBiZSBqdXN0IGVub3VnaCBmb3IgYW55IGRvdWJsZSBwcmVjaXNpb24KKyAgICAgICAgIyB2YWx1ZS4KKyAgICAgICAgc2VsZi53cml0ZUpTT05OdW1iZXIoZGJsLCAnezA6LjE3Z30nKQorCisgICAgZGVmIHdyaXRlU3RyaW5nKHNlbGYsIHN0cmluZyk6CisgICAgICAgIHNlbGYud3JpdGVKU09OU3RyaW5nKHN0cmluZykKKworICAgIGRlZiB3cml0ZUJpbmFyeShzZWxmLCBiaW5hcnkpOgorICAgICAgICBzZWxmLndyaXRlSlNPTkJhc2U2NChiaW5hcnkpCiAKIAotY2xhc3MgVEpTT05Qcm90b2NvbEZhY3Rvcnk6CitjbGFzcyBUSlNPTlByb3RvY29sRmFjdG9yeShvYmplY3QpOgorICAgIGRlZiBnZXRQcm90b2NvbChzZWxmLCB0cmFucyk6CisgICAgICAgIHJldHVybiBUSlNPTlByb3RvY29sKHRyYW5zKQogCi0gIGRlZiBnZXRQcm90b2NvbChzZWxmLCB0cmFucyk6Ci0gICAgcmV0dXJuIFRKU09OUHJvdG9jb2wodHJhbnMpCisgICAgQHByb3BlcnR5CisgICAgZGVmIHN0cmluZ19sZW5ndGhfbGltaXQoc2VuZik6CisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgY29udGFpbmVyX2xlbmd0aF9saW1pdChzZW5mKToKKyAgICAgICAgcmV0dXJuIE5vbmUKIAogCiBjbGFzcyBUU2ltcGxlSlNPTlByb3RvY29sKFRKU09OUHJvdG9jb2xCYXNlKToKICAgICAiIiJTaW1wbGUsIHJlYWRhYmxlLCB3cml0ZS1vbmx5IEpTT04gcHJvdG9jb2wuCi0gICAgCisKICAgICBVc2VmdWwgZm9yIGludGVyYWN0aW5nIHdpdGggc2NyaXB0aW5nIGxhbmd1YWdlcy4KICAgICAiIiIKIAogICAgIGRlZiByZWFkTWVzc2FnZUJlZ2luKHNlbGYpOgogICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCkKLSAgICAKKwogICAgIGRlZiByZWFkTWVzc2FnZUVuZChzZWxmKToKICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigpCi0gICAgCisKICAgICBkZWYgcmVhZFN0cnVjdEJlZ2luKHNlbGYpOgogICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCkKLSAgICAKKwogICAgIGRlZiByZWFkU3RydWN0RW5kKHNlbGYpOgogICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCkKLSAgICAKKwogICAgIGRlZiB3cml0ZU1lc3NhZ2VCZWdpbihzZWxmLCBuYW1lLCByZXF1ZXN0X3R5cGUsIHNlcWlkKToKICAgICAgICAgc2VsZi5yZXNldFdyaXRlQ29udGV4dCgpCi0gICAgCisKICAgICBkZWYgd3JpdGVNZXNzYWdlRW5kKHNlbGYpOgogICAgICAgICBwYXNzCi0gICAgCisKICAgICBkZWYgd3JpdGVTdHJ1Y3RCZWdpbihzZWxmLCBuYW1lKToKICAgICAgICAgc2VsZi53cml0ZUpTT05PYmplY3RTdGFydCgpCi0gICAgCisKICAgICBkZWYgd3JpdGVTdHJ1Y3RFbmQoc2VsZik6CiAgICAgICAgIHNlbGYud3JpdGVKU09OT2JqZWN0RW5kKCkKLSAgICAgIAorCiAgICAgZGVmIHdyaXRlRmllbGRCZWdpbihzZWxmLCBuYW1lLCB0dHlwZSwgZmlkKToKICAgICAgICAgc2VsZi53cml0ZUpTT05TdHJpbmcobmFtZSkKLSAgICAKKwogICAgIGRlZiB3cml0ZUZpZWxkRW5kKHNlbGYpOgogICAgICAgICBwYXNzCi0gICAgCisKICAgICBkZWYgd3JpdGVNYXBCZWdpbihzZWxmLCBrdHlwZSwgdnR5cGUsIHNpemUpOgogICAgICAgICBzZWxmLndyaXRlSlNPTk9iamVjdFN0YXJ0KCkKLSAgICAKKwogICAgIGRlZiB3cml0ZU1hcEVuZChzZWxmKToKICAgICAgICAgc2VsZi53cml0ZUpTT05PYmplY3RFbmQoKQotICAgIAorCiAgICAgZGVmIF93cml0ZUNvbGxlY3Rpb25CZWdpbihzZWxmLCBldHlwZSwgc2l6ZSk6CiAgICAgICAgIHNlbGYud3JpdGVKU09OQXJyYXlTdGFydCgpCi0gICAgCisKICAgICBkZWYgX3dyaXRlQ29sbGVjdGlvbkVuZChzZWxmKToKICAgICAgICAgc2VsZi53cml0ZUpTT05BcnJheUVuZCgpCiAgICAgd3JpdGVMaXN0QmVnaW4gPSBfd3JpdGVDb2xsZWN0aW9uQmVnaW4KQEAgLTU0OSwxNiArNjU3LDE2IEBACiAgICAgZGVmIHdyaXRlSTY0KHNlbGYsIGk2NCk6CiAgICAgICAgIGNoZWNrSW50ZWdlckxpbWl0cyhpNjQsIDY0KQogICAgICAgICBzZWxmLndyaXRlSlNPTk51bWJlcihpNjQpCi0gICAgCisKICAgICBkZWYgd3JpdGVCb29sKHNlbGYsIGJvb2xlYW4pOgogICAgICAgICBzZWxmLndyaXRlSlNPTk51bWJlcigxIGlmIGJvb2xlYW4gaXMgVHJ1ZSBlbHNlIDApCiAKICAgICBkZWYgd3JpdGVEb3VibGUoc2VsZiwgZGJsKToKICAgICAgICAgc2VsZi53cml0ZUpTT05OdW1iZXIoZGJsKQotICAgIAorCiAgICAgZGVmIHdyaXRlU3RyaW5nKHNlbGYsIHN0cmluZyk6CiAgICAgICAgIHNlbGYud3JpdGVKU09OU3RyaW5nKHN0cmluZykKLSAgICAgIAorCiAgICAgZGVmIHdyaXRlQmluYXJ5KHNlbGYsIGJpbmFyeSk6CiAgICAgICAgIHNlbGYud3JpdGVKU09OQmFzZTY0KGJpbmFyeSkKIApkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5weSBiL2xpYi9weS9zcmMvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wucHkKaW5kZXggZDI1ZjM2Ny4uMGY4MzkwZiAxMDA2NDQKLS0tIGEvbGliL3B5L3NyYy9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5weQorKysgYi9saWIvcHkvc3JjL3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLnB5CkBAIC0yMiwxOCArMjIsMTggQEAKIAogU0VQQVJBVE9SID0gIjoiCiAKLWNsYXNzIFRNdWx0aXBsZXhlZFByb3RvY29sKFRQcm90b2NvbERlY29yYXRvci5UUHJvdG9jb2xEZWNvcmF0b3IpOgotICBkZWYgX19pbml0X18oc2VsZiwgcHJvdG9jb2wsIHNlcnZpY2VOYW1lKToKLSAgICBUUHJvdG9jb2xEZWNvcmF0b3IuVFByb3RvY29sRGVjb3JhdG9yLl9faW5pdF9fKHNlbGYsIHByb3RvY29sKQotICAgIHNlbGYuc2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZQogCi0gIGRlZiB3cml0ZU1lc3NhZ2VCZWdpbihzZWxmLCBuYW1lLCB0eXBlLCBzZXFpZCk6Ci0gICAgaWYgKHR5cGUgPT0gVE1lc3NhZ2VUeXBlLkNBTEwgb3IKLSAgICAgICAgdHlwZSA9PSBUTWVzc2FnZVR5cGUuT05FV0FZKToKLSAgICAgIHNlbGYucHJvdG9jb2wud3JpdGVNZXNzYWdlQmVnaW4oCi0gICAgICAgIHNlbGYuc2VydmljZU5hbWUgKyBTRVBBUkFUT1IgKyBuYW1lLAotICAgICAgICB0eXBlLAotICAgICAgICBzZXFpZAotICAgICAgKQotICAgIGVsc2U6Ci0gICAgICBzZWxmLnByb3RvY29sLndyaXRlTWVzc2FnZUJlZ2luKG5hbWUsIHR5cGUsIHNlcWlkKQorY2xhc3MgVE11bHRpcGxleGVkUHJvdG9jb2woVFByb3RvY29sRGVjb3JhdG9yLlRQcm90b2NvbERlY29yYXRvcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHByb3RvY29sLCBzZXJ2aWNlTmFtZSk6CisgICAgICAgIHNlbGYuc2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZQorCisgICAgZGVmIHdyaXRlTWVzc2FnZUJlZ2luKHNlbGYsIG5hbWUsIHR5cGUsIHNlcWlkKToKKyAgICAgICAgaWYgKHR5cGUgPT0gVE1lc3NhZ2VUeXBlLkNBTEwgb3IKKyAgICAgICAgICAgICAgICB0eXBlID09IFRNZXNzYWdlVHlwZS5PTkVXQVkpOgorICAgICAgICAgICAgc3VwZXIoVE11bHRpcGxleGVkUHJvdG9jb2wsIHNlbGYpLndyaXRlTWVzc2FnZUJlZ2luKAorICAgICAgICAgICAgICAgIHNlbGYuc2VydmljZU5hbWUgKyBTRVBBUkFUT1IgKyBuYW1lLAorICAgICAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgc2VxaWQKKyAgICAgICAgICAgICkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHN1cGVyKFRNdWx0aXBsZXhlZFByb3RvY29sLCBzZWxmKS53cml0ZU1lc3NhZ2VCZWdpbihuYW1lLCB0eXBlLCBzZXFpZCkKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvcHJvdG9jb2wvVFByb3RvY29sLnB5IGIvbGliL3B5L3NyYy9wcm90b2NvbC9UUHJvdG9jb2wucHkKaW5kZXggMzExYTYzNS4uODMxNGNmNiAxMDA2NDQKLS0tIGEvbGliL3B5L3NyYy9wcm90b2NvbC9UUHJvdG9jb2wucHkKKysrIGIvbGliL3B5L3NyYy9wcm90b2NvbC9UUHJvdG9jb2wucHkKQEAgLTE3LDM5MCArMTcsMzg4IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1mcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0ICoKK2Zyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgVEV4Y2VwdGlvbiwgVFR5cGUsIFRGcm96ZW5EaWN0Citmcm9tIHRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydEV4Y2VwdGlvbgorZnJvbSAuLmNvbXBhdCBpbXBvcnQgYmluYXJ5X3RvX3N0ciwgc3RyX3RvX2JpbmFyeQorCitpbXBvcnQgc2l4CitpbXBvcnQgc3lzCitmcm9tIGl0ZXJ0b29scyBpbXBvcnQgaXNsaWNlCitmcm9tIHNpeC5tb3ZlcyBpbXBvcnQgemlwCiAKIAogY2xhc3MgVFByb3RvY29sRXhjZXB0aW9uKFRFeGNlcHRpb24pOgotICAiIiJDdXN0b20gUHJvdG9jb2wgRXhjZXB0aW9uIGNsYXNzIiIiCisgICAgIiIiQ3VzdG9tIFByb3RvY29sIEV4Y2VwdGlvbiBjbGFzcyIiIgogCi0gIFVOS05PV04gPSAwCi0gIElOVkFMSURfREFUQSA9IDEKLSAgTkVHQVRJVkVfU0laRSA9IDIKLSAgU0laRV9MSU1JVCA9IDMKLSAgQkFEX1ZFUlNJT04gPSA0Ci0gIE5PVF9JTVBMRU1FTlRFRCA9IDUKLSAgREVQVEhfTElNSVQgPSA2CisgICAgVU5LTk9XTiA9IDAKKyAgICBJTlZBTElEX0RBVEEgPSAxCisgICAgTkVHQVRJVkVfU0laRSA9IDIKKyAgICBTSVpFX0xJTUlUID0gMworICAgIEJBRF9WRVJTSU9OID0gNAorICAgIE5PVF9JTVBMRU1FTlRFRCA9IDUKKyAgICBERVBUSF9MSU1JVCA9IDYKKyAgICBJTlZBTElEX1BST1RPQ09MID0gNwogCi0gIGRlZiBfX2luaXRfXyhzZWxmLCB0eXBlPVVOS05PV04sIG1lc3NhZ2U9Tm9uZSk6Ci0gICAgVEV4Y2VwdGlvbi5fX2luaXRfXyhzZWxmLCBtZXNzYWdlKQotICAgIHNlbGYudHlwZSA9IHR5cGUKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHlwZT1VTktOT1dOLCBtZXNzYWdlPU5vbmUpOgorICAgICAgICBURXhjZXB0aW9uLl9faW5pdF9fKHNlbGYsIG1lc3NhZ2UpCisgICAgICAgIHNlbGYudHlwZSA9IHR5cGUKIAogCi1jbGFzcyBUUHJvdG9jb2xCYXNlOgotICAiIiJCYXNlIGNsYXNzIGZvciBUaHJpZnQgcHJvdG9jb2wgZHJpdmVyLiIiIgorY2xhc3MgVFByb3RvY29sQmFzZShvYmplY3QpOgorICAgICIiIkJhc2UgY2xhc3MgZm9yIFRocmlmdCBwcm90b2NvbCBkcml2ZXIuIiIiCiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsIHRyYW5zKToKLSAgICBzZWxmLnRyYW5zID0gdHJhbnMKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHJhbnMpOgorICAgICAgICBzZWxmLnRyYW5zID0gdHJhbnMKKyAgICAgICAgc2VsZi5fZmFzdF9kZWNvZGUgPSBOb25lCisgICAgICAgIHNlbGYuX2Zhc3RfZW5jb2RlID0gTm9uZQogCi0gIGRlZiB3cml0ZU1lc3NhZ2VCZWdpbihzZWxmLCBuYW1lLCB0dHlwZSwgc2VxaWQpOgotICAgIHBhc3MKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIF9jaGVja19sZW5ndGgobGltaXQsIGxlbmd0aCk6CisgICAgICAgIGlmIGxlbmd0aCA8IDA6CisgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uTkVHQVRJVkVfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ05lZ2F0aXZlIGxlbmd0aDogJWQnICUgbGVuZ3RoKQorICAgICAgICBpZiBsaW1pdCBpcyBub3QgTm9uZSBhbmQgbGVuZ3RoID4gbGltaXQ6CisgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uU0laRV9MSU1JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0xlbmd0aCBleGNlZWRlZCBtYXggYWxsb3dlZDogJWQnICUgbGltaXQpCiAKLSAgZGVmIHdyaXRlTWVzc2FnZUVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlTWVzc2FnZUJlZ2luKHNlbGYsIG5hbWUsIHR0eXBlLCBzZXFpZCk6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVTdHJ1Y3RCZWdpbihzZWxmLCBuYW1lKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlTWVzc2FnZUVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZVN0cnVjdEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlU3RydWN0QmVnaW4oc2VsZiwgbmFtZSk6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVGaWVsZEJlZ2luKHNlbGYsIG5hbWUsIHR0eXBlLCBmaWQpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVTdHJ1Y3RFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVGaWVsZEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlRmllbGRCZWdpbihzZWxmLCBuYW1lLCB0dHlwZSwgZmlkKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZUZpZWxkU3RvcChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlRmllbGRFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVNYXBCZWdpbihzZWxmLCBrdHlwZSwgdnR5cGUsIHNpemUpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVGaWVsZFN0b3Aoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVNYXBFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZU1hcEJlZ2luKHNlbGYsIGt0eXBlLCB2dHlwZSwgc2l6ZSk6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVMaXN0QmVnaW4oc2VsZiwgZXR5cGUsIHNpemUpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVNYXBFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVMaXN0RW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVMaXN0QmVnaW4oc2VsZiwgZXR5cGUsIHNpemUpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlU2V0QmVnaW4oc2VsZiwgZXR5cGUsIHNpemUpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVMaXN0RW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlU2V0RW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVTZXRCZWdpbihzZWxmLCBldHlwZSwgc2l6ZSk6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVCb29sKHNlbGYsIGJvb2xfdmFsKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlU2V0RW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlQnl0ZShzZWxmLCBieXRlKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlQm9vbChzZWxmLCBib29sX3ZhbCk6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVJMTYoc2VsZiwgaTE2KToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlQnl0ZShzZWxmLCBieXRlKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZUkzMihzZWxmLCBpMzIpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVJMTYoc2VsZiwgaTE2KToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZUk2NChzZWxmLCBpNjQpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVJMzIoc2VsZiwgaTMyKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZURvdWJsZShzZWxmLCBkdWIpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVJNjQoc2VsZiwgaTY0KToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZVN0cmluZyhzZWxmLCBzdHJfdmFsKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlRG91YmxlKHNlbGYsIGR1Yik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZE1lc3NhZ2VCZWdpbihzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlU3RyaW5nKHNlbGYsIHN0cl92YWwpOgorICAgICAgICBzZWxmLndyaXRlQmluYXJ5KHN0cl90b19iaW5hcnkoc3RyX3ZhbCkpCiAKLSAgZGVmIHJlYWRNZXNzYWdlRW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVCaW5hcnkoc2VsZiwgc3RyX3ZhbCk6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZFN0cnVjdEJlZ2luKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVVdGY4KHNlbGYsIHN0cl92YWwpOgorICAgICAgICBzZWxmLndyaXRlU3RyaW5nKHN0cl92YWwuZW5jb2RlKCd1dGY4JykpCiAKLSAgZGVmIHJlYWRTdHJ1Y3RFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiByZWFkTWVzc2FnZUJlZ2luKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRGaWVsZEJlZ2luKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZE1lc3NhZ2VFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZEZpZWxkRW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZFN0cnVjdEJlZ2luKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRNYXBCZWdpbihzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRTdHJ1Y3RFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZE1hcEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRGaWVsZEJlZ2luKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRMaXN0QmVnaW4oc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiByZWFkRmllbGRFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZExpc3RFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiByZWFkTWFwQmVnaW4oc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZFNldEJlZ2luKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZE1hcEVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkU2V0RW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZExpc3RCZWdpbihzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkQm9vbChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRMaXN0RW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRCeXRlKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZFNldEJlZ2luKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRJMTYoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiByZWFkU2V0RW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRJMzIoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiByZWFkQm9vbChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkSTY0KHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZEJ5dGUoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZERvdWJsZShzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRJMTYoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZFN0cmluZyhzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRJMzIoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgc2tpcChzZWxmLCB0dHlwZSk6Ci0gICAgaWYgdHR5cGUgPT0gVFR5cGUuU1RPUDoKLSAgICAgIHJldHVybgotICAgIGVsaWYgdHR5cGUgPT0gVFR5cGUuQk9PTDoKLSAgICAgIHNlbGYucmVhZEJvb2woKQotICAgIGVsaWYgdHR5cGUgPT0gVFR5cGUuQllURToKLSAgICAgIHNlbGYucmVhZEJ5dGUoKQotICAgIGVsaWYgdHR5cGUgPT0gVFR5cGUuSTE2OgotICAgICAgc2VsZi5yZWFkSTE2KCkKLSAgICBlbGlmIHR0eXBlID09IFRUeXBlLkkzMjoKLSAgICAgIHNlbGYucmVhZEkzMigpCi0gICAgZWxpZiB0dHlwZSA9PSBUVHlwZS5JNjQ6Ci0gICAgICBzZWxmLnJlYWRJNjQoKQotICAgIGVsaWYgdHR5cGUgPT0gVFR5cGUuRE9VQkxFOgotICAgICAgc2VsZi5yZWFkRG91YmxlKCkKLSAgICBlbGlmIHR0eXBlID09IFRUeXBlLlNUUklORzoKLSAgICAgIHNlbGYucmVhZFN0cmluZygpCi0gICAgZWxpZiB0dHlwZSA9PSBUVHlwZS5TVFJVQ1Q6Ci0gICAgICBuYW1lID0gc2VsZi5yZWFkU3RydWN0QmVnaW4oKQotICAgICAgd2hpbGUgVHJ1ZToKLSAgICAgICAgKG5hbWUsIHR0eXBlLCBpZCkgPSBzZWxmLnJlYWRGaWVsZEJlZ2luKCkKKyAgICBkZWYgcmVhZEk2NChzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIHJlYWREb3VibGUoc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiByZWFkU3RyaW5nKHNlbGYpOgorICAgICAgICByZXR1cm4gYmluYXJ5X3RvX3N0cihzZWxmLnJlYWRCaW5hcnkoKSkKKworICAgIGRlZiByZWFkQmluYXJ5KHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgcmVhZFV0Zjgoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnJlYWRTdHJpbmcoKS5kZWNvZGUoJ3V0ZjgnKQorCisgICAgZGVmIHNraXAoc2VsZiwgdHR5cGUpOgogICAgICAgICBpZiB0dHlwZSA9PSBUVHlwZS5TVE9QOgotICAgICAgICAgIGJyZWFrCi0gICAgICAgIHNlbGYuc2tpcCh0dHlwZSkKLSAgICAgICAgc2VsZi5yZWFkRmllbGRFbmQoKQotICAgICAgc2VsZi5yZWFkU3RydWN0RW5kKCkKLSAgICBlbGlmIHR0eXBlID09IFRUeXBlLk1BUDoKLSAgICAgIChrdHlwZSwgdnR5cGUsIHNpemUpID0gc2VsZi5yZWFkTWFwQmVnaW4oKQotICAgICAgZm9yIGkgaW4geHJhbmdlKHNpemUpOgotICAgICAgICBzZWxmLnNraXAoa3R5cGUpCi0gICAgICAgIHNlbGYuc2tpcCh2dHlwZSkKLSAgICAgIHNlbGYucmVhZE1hcEVuZCgpCi0gICAgZWxpZiB0dHlwZSA9PSBUVHlwZS5TRVQ6Ci0gICAgICAoZXR5cGUsIHNpemUpID0gc2VsZi5yZWFkU2V0QmVnaW4oKQotICAgICAgZm9yIGkgaW4geHJhbmdlKHNpemUpOgotICAgICAgICBzZWxmLnNraXAoZXR5cGUpCi0gICAgICBzZWxmLnJlYWRTZXRFbmQoKQotICAgIGVsaWYgdHR5cGUgPT0gVFR5cGUuTElTVDoKLSAgICAgIChldHlwZSwgc2l6ZSkgPSBzZWxmLnJlYWRMaXN0QmVnaW4oKQotICAgICAgZm9yIGkgaW4geHJhbmdlKHNpemUpOgotICAgICAgICBzZWxmLnNraXAoZXR5cGUpCi0gICAgICBzZWxmLnJlYWRMaXN0RW5kKCkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBlbGlmIHR0eXBlID09IFRUeXBlLkJPT0w6CisgICAgICAgICAgICBzZWxmLnJlYWRCb29sKCkKKyAgICAgICAgZWxpZiB0dHlwZSA9PSBUVHlwZS5CWVRFOgorICAgICAgICAgICAgc2VsZi5yZWFkQnl0ZSgpCisgICAgICAgIGVsaWYgdHR5cGUgPT0gVFR5cGUuSTE2OgorICAgICAgICAgICAgc2VsZi5yZWFkSTE2KCkKKyAgICAgICAgZWxpZiB0dHlwZSA9PSBUVHlwZS5JMzI6CisgICAgICAgICAgICBzZWxmLnJlYWRJMzIoKQorICAgICAgICBlbGlmIHR0eXBlID09IFRUeXBlLkk2NDoKKyAgICAgICAgICAgIHNlbGYucmVhZEk2NCgpCisgICAgICAgIGVsaWYgdHR5cGUgPT0gVFR5cGUuRE9VQkxFOgorICAgICAgICAgICAgc2VsZi5yZWFkRG91YmxlKCkKKyAgICAgICAgZWxpZiB0dHlwZSA9PSBUVHlwZS5TVFJJTkc6CisgICAgICAgICAgICBzZWxmLnJlYWRTdHJpbmcoKQorICAgICAgICBlbGlmIHR0eXBlID09IFRUeXBlLlNUUlVDVDoKKyAgICAgICAgICAgIG5hbWUgPSBzZWxmLnJlYWRTdHJ1Y3RCZWdpbigpCisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgIChuYW1lLCB0dHlwZSwgaWQpID0gc2VsZi5yZWFkRmllbGRCZWdpbigpCisgICAgICAgICAgICAgICAgaWYgdHR5cGUgPT0gVFR5cGUuU1RPUDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBzZWxmLnNraXAodHR5cGUpCisgICAgICAgICAgICAgICAgc2VsZi5yZWFkRmllbGRFbmQoKQorICAgICAgICAgICAgc2VsZi5yZWFkU3RydWN0RW5kKCkKKyAgICAgICAgZWxpZiB0dHlwZSA9PSBUVHlwZS5NQVA6CisgICAgICAgICAgICAoa3R5cGUsIHZ0eXBlLCBzaXplKSA9IHNlbGYucmVhZE1hcEJlZ2luKCkKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHNpemUpOgorICAgICAgICAgICAgICAgIHNlbGYuc2tpcChrdHlwZSkKKyAgICAgICAgICAgICAgICBzZWxmLnNraXAodnR5cGUpCisgICAgICAgICAgICBzZWxmLnJlYWRNYXBFbmQoKQorICAgICAgICBlbGlmIHR0eXBlID09IFRUeXBlLlNFVDoKKyAgICAgICAgICAgIChldHlwZSwgc2l6ZSkgPSBzZWxmLnJlYWRTZXRCZWdpbigpCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShzaXplKToKKyAgICAgICAgICAgICAgICBzZWxmLnNraXAoZXR5cGUpCisgICAgICAgICAgICBzZWxmLnJlYWRTZXRFbmQoKQorICAgICAgICBlbGlmIHR0eXBlID09IFRUeXBlLkxJU1Q6CisgICAgICAgICAgICAoZXR5cGUsIHNpemUpID0gc2VsZi5yZWFkTGlzdEJlZ2luKCkKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHNpemUpOgorICAgICAgICAgICAgICAgIHNlbGYuc2tpcChldHlwZSkKKyAgICAgICAgICAgIHNlbGYucmVhZExpc3RFbmQoKQogCi0gICMgdHVwbGUgb2Y6ICggJ3JlYWRlciBtZXRob2QnIG5hbWUsIGlzX2NvbnRhaW5lciBib29sLCAnd3JpdGVyX21ldGhvZCcgbmFtZSApCi0gIF9UVFlQRV9IQU5ETEVSUyA9ICgKLSAgICAgICAoTm9uZSwgTm9uZSwgRmFsc2UpLCAgIyAwIFRUeXBlLlNUT1AKLSAgICAgICAoTm9uZSwgTm9uZSwgRmFsc2UpLCAgIyAxIFRUeXBlLlZPSUQgIyBUT0RPOiBoYW5kbGUgdm9pZD8KLSAgICAgICAoJ3JlYWRCb29sJywgJ3dyaXRlQm9vbCcsIEZhbHNlKSwgICMgMiBUVHlwZS5CT09MCi0gICAgICAgKCdyZWFkQnl0ZScsICAnd3JpdGVCeXRlJywgRmFsc2UpLCAgIyAzIFRUeXBlLkJZVEUgYW5kIEkwOAotICAgICAgICgncmVhZERvdWJsZScsICd3cml0ZURvdWJsZScsIEZhbHNlKSwgICMgNCBUVHlwZS5ET1VCTEUKLSAgICAgICAoTm9uZSwgTm9uZSwgRmFsc2UpLCAgIyA1IHVuZGVmaW5lZAotICAgICAgICgncmVhZEkxNicsICd3cml0ZUkxNicsIEZhbHNlKSwgICMgNiBUVHlwZS5JMTYKLSAgICAgICAoTm9uZSwgTm9uZSwgRmFsc2UpLCAgIyA3IHVuZGVmaW5lZAotICAgICAgICgncmVhZEkzMicsICd3cml0ZUkzMicsIEZhbHNlKSwgICMgOCBUVHlwZS5JMzIKLSAgICAgICAoTm9uZSwgTm9uZSwgRmFsc2UpLCAgIyA5IHVuZGVmaW5lZAotICAgICAgICgncmVhZEk2NCcsICd3cml0ZUk2NCcsIEZhbHNlKSwgICMgMTAgVFR5cGUuSTY0Ci0gICAgICAgKCdyZWFkU3RyaW5nJywgJ3dyaXRlU3RyaW5nJywgRmFsc2UpLCAgIyAxMSBUVHlwZS5TVFJJTkcgYW5kIFVURjcKLSAgICAgICAoJ3JlYWRDb250YWluZXJTdHJ1Y3QnLCAnd3JpdGVDb250YWluZXJTdHJ1Y3QnLCBUcnVlKSwgICMgMTIgKi5TVFJVQ1QKLSAgICAgICAoJ3JlYWRDb250YWluZXJNYXAnLCAnd3JpdGVDb250YWluZXJNYXAnLCBUcnVlKSwgICMgMTMgVFR5cGUuTUFQCi0gICAgICAgKCdyZWFkQ29udGFpbmVyU2V0JywgJ3dyaXRlQ29udGFpbmVyU2V0JywgVHJ1ZSksICAjIDE0IFRUeXBlLlNFVAotICAgICAgICgncmVhZENvbnRhaW5lckxpc3QnLCAnd3JpdGVDb250YWluZXJMaXN0JywgVHJ1ZSksICAjIDE1IFRUeXBlLkxJU1QKLSAgICAgICAoTm9uZSwgTm9uZSwgRmFsc2UpLCAgIyAxNiBUVHlwZS5VVEY4ICMgVE9ETzogaGFuZGxlIHV0ZjggdHlwZXM/Ci0gICAgICAgKE5vbmUsIE5vbmUsIEZhbHNlKSAgIyAxNyBUVHlwZS5VVEYxNiAjIFRPRE86IGhhbmRsZSB1dGYxNiB0eXBlcz8KLSAgICAgICkKKyAgICAjIHR1cGxlIG9mOiAoICdyZWFkZXIgbWV0aG9kJyBuYW1lLCBpc19jb250YWluZXIgYm9vbCwgJ3dyaXRlcl9tZXRob2QnIG5hbWUgKQorICAgIF9UVFlQRV9IQU5ETEVSUyA9ICgKKyAgICAgICAgKE5vbmUsIE5vbmUsIEZhbHNlKSwgICMgMCBUVHlwZS5TVE9QCisgICAgICAgIChOb25lLCBOb25lLCBGYWxzZSksICAjIDEgVFR5cGUuVk9JRCAjIFRPRE86IGhhbmRsZSB2b2lkPworICAgICAgICAoJ3JlYWRCb29sJywgJ3dyaXRlQm9vbCcsIEZhbHNlKSwgICMgMiBUVHlwZS5CT09MCisgICAgICAgICgncmVhZEJ5dGUnLCAnd3JpdGVCeXRlJywgRmFsc2UpLCAgIyAzIFRUeXBlLkJZVEUgYW5kIEkwOAorICAgICAgICAoJ3JlYWREb3VibGUnLCAnd3JpdGVEb3VibGUnLCBGYWxzZSksICAjIDQgVFR5cGUuRE9VQkxFCisgICAgICAgIChOb25lLCBOb25lLCBGYWxzZSksICAjIDUgdW5kZWZpbmVkCisgICAgICAgICgncmVhZEkxNicsICd3cml0ZUkxNicsIEZhbHNlKSwgICMgNiBUVHlwZS5JMTYKKyAgICAgICAgKE5vbmUsIE5vbmUsIEZhbHNlKSwgICMgNyB1bmRlZmluZWQKKyAgICAgICAgKCdyZWFkSTMyJywgJ3dyaXRlSTMyJywgRmFsc2UpLCAgIyA4IFRUeXBlLkkzMgorICAgICAgICAoTm9uZSwgTm9uZSwgRmFsc2UpLCAgIyA5IHVuZGVmaW5lZAorICAgICAgICAoJ3JlYWRJNjQnLCAnd3JpdGVJNjQnLCBGYWxzZSksICAjIDEwIFRUeXBlLkk2NAorICAgICAgICAoJ3JlYWRTdHJpbmcnLCAnd3JpdGVTdHJpbmcnLCBGYWxzZSksICAjIDExIFRUeXBlLlNUUklORyBhbmQgVVRGNworICAgICAgICAoJ3JlYWRDb250YWluZXJTdHJ1Y3QnLCAnd3JpdGVDb250YWluZXJTdHJ1Y3QnLCBUcnVlKSwgICMgMTIgKi5TVFJVQ1QKKyAgICAgICAgKCdyZWFkQ29udGFpbmVyTWFwJywgJ3dyaXRlQ29udGFpbmVyTWFwJywgVHJ1ZSksICAjIDEzIFRUeXBlLk1BUAorICAgICAgICAoJ3JlYWRDb250YWluZXJTZXQnLCAnd3JpdGVDb250YWluZXJTZXQnLCBUcnVlKSwgICMgMTQgVFR5cGUuU0VUCisgICAgICAgICgncmVhZENvbnRhaW5lckxpc3QnLCAnd3JpdGVDb250YWluZXJMaXN0JywgVHJ1ZSksICAjIDE1IFRUeXBlLkxJU1QKKyAgICAgICAgKE5vbmUsIE5vbmUsIEZhbHNlKSwgICMgMTYgVFR5cGUuVVRGOCAjIFRPRE86IGhhbmRsZSB1dGY4IHR5cGVzPworICAgICAgICAoTm9uZSwgTm9uZSwgRmFsc2UpICAjIDE3IFRUeXBlLlVURjE2ICMgVE9ETzogaGFuZGxlIHV0ZjE2IHR5cGVzPworICAgICkKIAotICBkZWYgcmVhZEZpZWxkQnlUVHlwZShzZWxmLCB0dHlwZSwgc3BlYyk6Ci0gICAgdHJ5OgotICAgICAgKHJfaGFuZGxlciwgd19oYW5kbGVyLCBpc19jb250YWluZXIpID0gc2VsZi5fVFRZUEVfSEFORExFUlNbdHR5cGVdCi0gICAgZXhjZXB0IEluZGV4RXJyb3I6Ci0gICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24odHlwZT1UUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9J0ludmFsaWQgZmllbGQgdHlwZSAlZCcgJSAodHR5cGUpKQotICAgIGlmIHJfaGFuZGxlciBpcyBOb25lOgotICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKHR5cGU9VFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSdJbnZhbGlkIGZpZWxkIHR5cGUgJWQnICUgKHR0eXBlKSkKLSAgICByZWFkZXIgPSBnZXRhdHRyKHNlbGYsIHJfaGFuZGxlcikKLSAgICBpZiBub3QgaXNfY29udGFpbmVyOgotICAgICAgcmV0dXJuIHJlYWRlcigpCi0gICAgcmV0dXJuIHJlYWRlcihzcGVjKQorICAgIGRlZiBfdHR5cGVfaGFuZGxlcnMoc2VsZiwgdHR5cGUsIHNwZWMpOgorICAgICAgICBpZiBzcGVjID09ICdCSU5BUlknOgorICAgICAgICAgICAgaWYgdHR5cGUgIT0gVFR5cGUuU1RSSU5HOgorICAgICAgICAgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbih0eXBlPVRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9J0ludmFsaWQgYmluYXJ5IGZpZWxkIHR5cGUgJWQnICUgdHR5cGUpCisgICAgICAgICAgICByZXR1cm4gKCdyZWFkQmluYXJ5JywgJ3dyaXRlQmluYXJ5JywgRmFsc2UpCisgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMiBhbmQgc3BlYyA9PSAnVVRGOCc6CisgICAgICAgICAgICBpZiB0dHlwZSAhPSBUVHlwZS5TVFJJTkc6CisgICAgICAgICAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKHR5cGU9VFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0nSW52YWxpZCBzdHJpbmcgZmllbGQgdHlwZSAlZCcgJSB0dHlwZSkKKyAgICAgICAgICAgIHJldHVybiAoJ3JlYWRVdGY4JywgJ3dyaXRlVXRmOCcsIEZhbHNlKQorICAgICAgICByZXR1cm4gc2VsZi5fVFRZUEVfSEFORExFUlNbdHR5cGVdIGlmIHR0eXBlIDwgbGVuKHNlbGYuX1RUWVBFX0hBTkRMRVJTKSBlbHNlIChOb25lLCBOb25lLCBGYWxzZSkKIAotICBkZWYgcmVhZENvbnRhaW5lckxpc3Qoc2VsZiwgc3BlYyk6Ci0gICAgcmVzdWx0cyA9IFtdCi0gICAgdHR5cGUsIHRzcGVjID0gc3BlY1swXSwgc3BlY1sxXQotICAgIHJfaGFuZGxlciA9IHNlbGYuX1RUWVBFX0hBTkRMRVJTW3R0eXBlXVswXQotICAgIHJlYWRlciA9IGdldGF0dHIoc2VsZiwgcl9oYW5kbGVyKQotICAgIChsaXN0X3R5cGUsIGxpc3RfbGVuKSA9IHNlbGYucmVhZExpc3RCZWdpbigpCi0gICAgaWYgdHNwZWMgaXMgTm9uZToKLSAgICAgICMgbGlzdCB2YWx1ZXMgYXJlIHNpbXBsZSB0eXBlcwotICAgICAgZm9yIGlkeCBpbiB4cmFuZ2UobGlzdF9sZW4pOgotICAgICAgICByZXN1bHRzLmFwcGVuZChyZWFkZXIoKSkKLSAgICBlbHNlOgotICAgICAgIyB0aGlzIGlzIGxpa2UgYW4gaW5saW5lZCByZWFkRmllbGRCeVRUeXBlCi0gICAgICBjb250YWluZXJfcmVhZGVyID0gc2VsZi5fVFRZUEVfSEFORExFUlNbbGlzdF90eXBlXVswXQotICAgICAgdmFsX3JlYWRlciA9IGdldGF0dHIoc2VsZiwgY29udGFpbmVyX3JlYWRlcikKLSAgICAgIGZvciBpZHggaW4geHJhbmdlKGxpc3RfbGVuKToKLSAgICAgICAgdmFsID0gdmFsX3JlYWRlcih0c3BlYykKLSAgICAgICAgcmVzdWx0cy5hcHBlbmQodmFsKQotICAgIHNlbGYucmVhZExpc3RFbmQoKQotICAgIHJldHVybiByZXN1bHRzCisgICAgZGVmIF9yZWFkX2J5X3R0eXBlKHNlbGYsIHR0eXBlLCBzcGVjLCBlc3BlYyk6CisgICAgICAgIHJlYWRlcl9uYW1lLCBfLCBpc19jb250YWluZXIgPSBzZWxmLl90dHlwZV9oYW5kbGVycyh0dHlwZSwgZXNwZWMpCisgICAgICAgIGlmIHJlYWRlcl9uYW1lIGlzIE5vbmU6CisgICAgICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24odHlwZT1UUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9J0ludmFsaWQgdHlwZSAlZCcgJSAodHR5cGUpKQorICAgICAgICByZWFkZXJfZnVuYyA9IGdldGF0dHIoc2VsZiwgcmVhZGVyX25hbWUpCisgICAgICAgIHJlYWQgPSAobGFtYmRhOiByZWFkZXJfZnVuYyhlc3BlYykpIGlmIGlzX2NvbnRhaW5lciBlbHNlIHJlYWRlcl9mdW5jCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICB5aWVsZCByZWFkKCkKIAotICBkZWYgcmVhZENvbnRhaW5lclNldChzZWxmLCBzcGVjKToKLSAgICByZXN1bHRzID0gc2V0KCkKLSAgICB0dHlwZSwgdHNwZWMgPSBzcGVjWzBdLCBzcGVjWzFdCi0gICAgcl9oYW5kbGVyID0gc2VsZi5fVFRZUEVfSEFORExFUlNbdHR5cGVdWzBdCi0gICAgcmVhZGVyID0gZ2V0YXR0cihzZWxmLCByX2hhbmRsZXIpCi0gICAgKHNldF90eXBlLCBzZXRfbGVuKSA9IHNlbGYucmVhZFNldEJlZ2luKCkKLSAgICBpZiB0c3BlYyBpcyBOb25lOgotICAgICAgIyBzZXQgbWVtYmVycyBhcmUgc2ltcGxlIHR5cGVzCi0gICAgICBmb3IgaWR4IGluIHhyYW5nZShzZXRfbGVuKToKLSAgICAgICAgcmVzdWx0cy5hZGQocmVhZGVyKCkpCi0gICAgZWxzZToKLSAgICAgIGNvbnRhaW5lcl9yZWFkZXIgPSBzZWxmLl9UVFlQRV9IQU5ETEVSU1tzZXRfdHlwZV1bMF0KLSAgICAgIHZhbF9yZWFkZXIgPSBnZXRhdHRyKHNlbGYsIGNvbnRhaW5lcl9yZWFkZXIpCi0gICAgICBmb3IgaWR4IGluIHhyYW5nZShzZXRfbGVuKToKLSAgICAgICAgcmVzdWx0cy5hZGQodmFsX3JlYWRlcih0c3BlYykpCi0gICAgc2VsZi5yZWFkU2V0RW5kKCkKLSAgICByZXR1cm4gcmVzdWx0cworICAgIGRlZiByZWFkRmllbGRCeVRUeXBlKHNlbGYsIHR0eXBlLCBzcGVjKToKKyAgICAgICAgcmV0dXJuIG5leHQoc2VsZi5fcmVhZF9ieV90dHlwZSh0dHlwZSwgc3BlYywgc3BlYykpCiAKLSAgZGVmIHJlYWRDb250YWluZXJTdHJ1Y3Qoc2VsZiwgc3BlYyk6Ci0gICAgKG9ial9jbGFzcywgb2JqX3NwZWMpID0gc3BlYwotICAgIG9iaiA9IG9ial9jbGFzcygpCi0gICAgb2JqLnJlYWQoc2VsZikKLSAgICByZXR1cm4gb2JqCisgICAgZGVmIHJlYWRDb250YWluZXJMaXN0KHNlbGYsIHNwZWMpOgorICAgICAgICB0dHlwZSwgdHNwZWMsIGlzX2ltbXV0YWJsZSA9IHNwZWMKKyAgICAgICAgKGxpc3RfdHlwZSwgbGlzdF9sZW4pID0gc2VsZi5yZWFkTGlzdEJlZ2luKCkKKyAgICAgICAgIyBUT0RPOiBjb21wYXJlIHR5cGVzIHdlIGp1c3QgZGVjb2RlZCB3aXRoIHRocmlmdF9zcGVjCisgICAgICAgIGVsZW1zID0gaXNsaWNlKHNlbGYuX3JlYWRfYnlfdHR5cGUodHR5cGUsIHNwZWMsIHRzcGVjKSwgbGlzdF9sZW4pCisgICAgICAgIHJlc3VsdHMgPSAodHVwbGUgaWYgaXNfaW1tdXRhYmxlIGVsc2UgbGlzdCkoZWxlbXMpCisgICAgICAgIHNlbGYucmVhZExpc3RFbmQoKQorICAgICAgICByZXR1cm4gcmVzdWx0cwogCi0gIGRlZiByZWFkQ29udGFpbmVyTWFwKHNlbGYsIHNwZWMpOgotICAgIHJlc3VsdHMgPSBkaWN0KCkKLSAgICBrZXlfdHR5cGUsIGtleV9zcGVjID0gc3BlY1swXSwgc3BlY1sxXQotICAgIHZhbF90dHlwZSwgdmFsX3NwZWMgPSBzcGVjWzJdLCBzcGVjWzNdCi0gICAgKG1hcF9rdHlwZSwgbWFwX3Z0eXBlLCBtYXBfbGVuKSA9IHNlbGYucmVhZE1hcEJlZ2luKCkKLSAgICAjIFRPRE86IGNvbXBhcmUgdHlwZXMgd2UganVzdCBkZWNvZGVkIHdpdGggdGhyaWZ0X3NwZWMgYW5kCi0gICAgIyBhYm9ydC9za2lwIGlmIHR5cGVzIGRpc2FncmVlCi0gICAga2V5X3JlYWRlciA9IGdldGF0dHIoc2VsZiwgc2VsZi5fVFRZUEVfSEFORExFUlNba2V5X3R0eXBlXVswXSkKLSAgICB2YWxfcmVhZGVyID0gZ2V0YXR0cihzZWxmLCBzZWxmLl9UVFlQRV9IQU5ETEVSU1t2YWxfdHR5cGVdWzBdKQotICAgICMgbGlzdCB2YWx1ZXMgYXJlIHNpbXBsZSB0eXBlcwotICAgIGZvciBpZHggaW4geHJhbmdlKG1hcF9sZW4pOgotICAgICAgaWYga2V5X3NwZWMgaXMgTm9uZToKLSAgICAgICAga192YWwgPSBrZXlfcmVhZGVyKCkKLSAgICAgIGVsc2U6Ci0gICAgICAgIGtfdmFsID0gc2VsZi5yZWFkRmllbGRCeVRUeXBlKGtleV90dHlwZSwga2V5X3NwZWMpCi0gICAgICBpZiB2YWxfc3BlYyBpcyBOb25lOgotICAgICAgICB2X3ZhbCA9IHZhbF9yZWFkZXIoKQotICAgICAgZWxzZToKLSAgICAgICAgdl92YWwgPSBzZWxmLnJlYWRGaWVsZEJ5VFR5cGUodmFsX3R0eXBlLCB2YWxfc3BlYykKLSAgICAgICMgdGhpcyByYWlzZXMgYSBUeXBlRXJyb3Igd2l0aCB1bmhhc2hhYmxlIGtleXMgdHlwZXMKLSAgICAgICMgaS5lLiB0aGlzIGZhaWxzOiBkPWRpY3QoKTsgZFtbMCwxXV0gPSAyCi0gICAgICByZXN1bHRzW2tfdmFsXSA9IHZfdmFsCi0gICAgc2VsZi5yZWFkTWFwRW5kKCkKLSAgICByZXR1cm4gcmVzdWx0cworICAgIGRlZiByZWFkQ29udGFpbmVyU2V0KHNlbGYsIHNwZWMpOgorICAgICAgICB0dHlwZSwgdHNwZWMsIGlzX2ltbXV0YWJsZSA9IHNwZWMKKyAgICAgICAgKHNldF90eXBlLCBzZXRfbGVuKSA9IHNlbGYucmVhZFNldEJlZ2luKCkKKyAgICAgICAgIyBUT0RPOiBjb21wYXJlIHR5cGVzIHdlIGp1c3QgZGVjb2RlZCB3aXRoIHRocmlmdF9zcGVjCisgICAgICAgIGVsZW1zID0gaXNsaWNlKHNlbGYuX3JlYWRfYnlfdHR5cGUodHR5cGUsIHNwZWMsIHRzcGVjKSwgc2V0X2xlbikKKyAgICAgICAgcmVzdWx0cyA9IChmcm96ZW5zZXQgaWYgaXNfaW1tdXRhYmxlIGVsc2Ugc2V0KShlbGVtcykKKyAgICAgICAgc2VsZi5yZWFkU2V0RW5kKCkKKyAgICAgICAgcmV0dXJuIHJlc3VsdHMKIAotICBkZWYgcmVhZFN0cnVjdChzZWxmLCBvYmosIHRocmlmdF9zcGVjKToKLSAgICBzZWxmLnJlYWRTdHJ1Y3RCZWdpbigpCi0gICAgd2hpbGUgVHJ1ZToKLSAgICAgIChmbmFtZSwgZnR5cGUsIGZpZCkgPSBzZWxmLnJlYWRGaWVsZEJlZ2luKCkKLSAgICAgIGlmIGZ0eXBlID09IFRUeXBlLlNUT1A6Ci0gICAgICAgIGJyZWFrCi0gICAgICB0cnk6Ci0gICAgICAgIGZpZWxkID0gdGhyaWZ0X3NwZWNbZmlkXQotICAgICAgZXhjZXB0IEluZGV4RXJyb3I6Ci0gICAgICAgIHNlbGYuc2tpcChmdHlwZSkKLSAgICAgIGVsc2U6Ci0gICAgICAgIGlmIGZpZWxkIGlzIG5vdCBOb25lIGFuZCBmdHlwZSA9PSBmaWVsZFsxXToKLSAgICAgICAgICBmbmFtZSA9IGZpZWxkWzJdCi0gICAgICAgICAgZnNwZWMgPSBmaWVsZFszXQotICAgICAgICAgIHZhbCA9IHNlbGYucmVhZEZpZWxkQnlUVHlwZShmdHlwZSwgZnNwZWMpCi0gICAgICAgICAgc2V0YXR0cihvYmosIGZuYW1lLCB2YWwpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgc2VsZi5za2lwKGZ0eXBlKQotICAgICAgc2VsZi5yZWFkRmllbGRFbmQoKQotICAgIHNlbGYucmVhZFN0cnVjdEVuZCgpCisgICAgZGVmIHJlYWRDb250YWluZXJTdHJ1Y3Qoc2VsZiwgc3BlYyk6CisgICAgICAgIChvYmpfY2xhc3MsIG9ial9zcGVjKSA9IHNwZWMKKyAgICAgICAgb2JqID0gb2JqX2NsYXNzKCkKKyAgICAgICAgb2JqLnJlYWQoc2VsZikKKyAgICAgICAgcmV0dXJuIG9iagogCi0gIGRlZiB3cml0ZUNvbnRhaW5lclN0cnVjdChzZWxmLCB2YWwsIHNwZWMpOgotICAgIHZhbC53cml0ZShzZWxmKQorICAgIGRlZiByZWFkQ29udGFpbmVyTWFwKHNlbGYsIHNwZWMpOgorICAgICAgICBrdHlwZSwga3NwZWMsIHZ0eXBlLCB2c3BlYywgaXNfaW1tdXRhYmxlID0gc3BlYworICAgICAgICAobWFwX2t0eXBlLCBtYXBfdnR5cGUsIG1hcF9sZW4pID0gc2VsZi5yZWFkTWFwQmVnaW4oKQorICAgICAgICAjIFRPRE86IGNvbXBhcmUgdHlwZXMgd2UganVzdCBkZWNvZGVkIHdpdGggdGhyaWZ0X3NwZWMgYW5kCisgICAgICAgICMgYWJvcnQvc2tpcCBpZiB0eXBlcyBkaXNhZ3JlZQorICAgICAgICBrZXlzID0gc2VsZi5fcmVhZF9ieV90dHlwZShrdHlwZSwgc3BlYywga3NwZWMpCisgICAgICAgIHZhbHMgPSBzZWxmLl9yZWFkX2J5X3R0eXBlKHZ0eXBlLCBzcGVjLCB2c3BlYykKKyAgICAgICAga2V5dmFscyA9IGlzbGljZSh6aXAoa2V5cywgdmFscyksIG1hcF9sZW4pCisgICAgICAgIHJlc3VsdHMgPSAoVEZyb3plbkRpY3QgaWYgaXNfaW1tdXRhYmxlIGVsc2UgZGljdCkoa2V5dmFscykKKyAgICAgICAgc2VsZi5yZWFkTWFwRW5kKCkKKyAgICAgICAgcmV0dXJuIHJlc3VsdHMKIAotICBkZWYgd3JpdGVDb250YWluZXJMaXN0KHNlbGYsIHZhbCwgc3BlYyk6Ci0gICAgc2VsZi53cml0ZUxpc3RCZWdpbihzcGVjWzBdLCBsZW4odmFsKSkKLSAgICByX2hhbmRsZXIsIHdfaGFuZGxlciwgaXNfY29udGFpbmVyID0gc2VsZi5fVFRZUEVfSEFORExFUlNbc3BlY1swXV0KLSAgICBlX3dyaXRlciA9IGdldGF0dHIoc2VsZiwgd19oYW5kbGVyKQotICAgIGlmIG5vdCBpc19jb250YWluZXI6Ci0gICAgICBmb3IgZWxlbSBpbiB2YWw6Ci0gICAgICAgIGVfd3JpdGVyKGVsZW0pCi0gICAgZWxzZToKLSAgICAgIGZvciBlbGVtIGluIHZhbDoKLSAgICAgICAgZV93cml0ZXIoZWxlbSwgc3BlY1sxXSkKLSAgICBzZWxmLndyaXRlTGlzdEVuZCgpCisgICAgZGVmIHJlYWRTdHJ1Y3Qoc2VsZiwgb2JqLCB0aHJpZnRfc3BlYywgaXNfaW1tdXRhYmxlPUZhbHNlKToKKyAgICAgICAgaWYgaXNfaW1tdXRhYmxlOgorICAgICAgICAgICAgZmllbGRzID0ge30KKyAgICAgICAgc2VsZi5yZWFkU3RydWN0QmVnaW4oKQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgKGZuYW1lLCBmdHlwZSwgZmlkKSA9IHNlbGYucmVhZEZpZWxkQmVnaW4oKQorICAgICAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuU1RPUDoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGZpZWxkID0gdGhyaWZ0X3NwZWNbZmlkXQorICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICAgICAgc2VsZi5za2lwKGZ0eXBlKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBmaWVsZCBpcyBub3QgTm9uZSBhbmQgZnR5cGUgPT0gZmllbGRbMV06CisgICAgICAgICAgICAgICAgICAgIGZuYW1lID0gZmllbGRbMl0KKyAgICAgICAgICAgICAgICAgICAgZnNwZWMgPSBmaWVsZFszXQorICAgICAgICAgICAgICAgICAgICB2YWwgPSBzZWxmLnJlYWRGaWVsZEJ5VFR5cGUoZnR5cGUsIGZzcGVjKQorICAgICAgICAgICAgICAgICAgICBpZiBpc19pbW11dGFibGU6CisgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHNbZm5hbWVdID0gdmFsCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKG9iaiwgZm5hbWUsIHZhbCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnNraXAoZnR5cGUpCisgICAgICAgICAgICBzZWxmLnJlYWRGaWVsZEVuZCgpCisgICAgICAgIHNlbGYucmVhZFN0cnVjdEVuZCgpCisgICAgICAgIGlmIGlzX2ltbXV0YWJsZToKKyAgICAgICAgICAgIHJldHVybiBvYmooKipmaWVsZHMpCiAKLSAgZGVmIHdyaXRlQ29udGFpbmVyU2V0KHNlbGYsIHZhbCwgc3BlYyk6Ci0gICAgc2VsZi53cml0ZVNldEJlZ2luKHNwZWNbMF0sIGxlbih2YWwpKQotICAgIHJfaGFuZGxlciwgd19oYW5kbGVyLCBpc19jb250YWluZXIgPSBzZWxmLl9UVFlQRV9IQU5ETEVSU1tzcGVjWzBdXQotICAgIGVfd3JpdGVyID0gZ2V0YXR0cihzZWxmLCB3X2hhbmRsZXIpCi0gICAgaWYgbm90IGlzX2NvbnRhaW5lcjoKLSAgICAgIGZvciBlbGVtIGluIHZhbDoKLSAgICAgICAgZV93cml0ZXIoZWxlbSkKLSAgICBlbHNlOgotICAgICAgZm9yIGVsZW0gaW4gdmFsOgotICAgICAgICBlX3dyaXRlcihlbGVtLCBzcGVjWzFdKQotICAgIHNlbGYud3JpdGVTZXRFbmQoKQorICAgIGRlZiB3cml0ZUNvbnRhaW5lclN0cnVjdChzZWxmLCB2YWwsIHNwZWMpOgorICAgICAgICB2YWwud3JpdGUoc2VsZikKIAotICBkZWYgd3JpdGVDb250YWluZXJNYXAoc2VsZiwgdmFsLCBzcGVjKToKLSAgICBrX3R5cGUgPSBzcGVjWzBdCi0gICAgdl90eXBlID0gc3BlY1syXQotICAgIGlnbm9yZSwga3R5cGVfbmFtZSwga19pc19jb250YWluZXIgPSBzZWxmLl9UVFlQRV9IQU5ETEVSU1trX3R5cGVdCi0gICAgaWdub3JlLCB2dHlwZV9uYW1lLCB2X2lzX2NvbnRhaW5lciA9IHNlbGYuX1RUWVBFX0hBTkRMRVJTW3ZfdHlwZV0KLSAgICBrX3dyaXRlciA9IGdldGF0dHIoc2VsZiwga3R5cGVfbmFtZSkKLSAgICB2X3dyaXRlciA9IGdldGF0dHIoc2VsZiwgdnR5cGVfbmFtZSkKLSAgICBzZWxmLndyaXRlTWFwQmVnaW4oa190eXBlLCB2X3R5cGUsIGxlbih2YWwpKQotICAgIGZvciBtX2tleSwgbV92YWwgaW4gdmFsLml0ZXJpdGVtcygpOgotICAgICAgaWYgbm90IGtfaXNfY29udGFpbmVyOgotICAgICAgICBrX3dyaXRlcihtX2tleSkKLSAgICAgIGVsc2U6Ci0gICAgICAgIGtfd3JpdGVyKG1fa2V5LCBzcGVjWzFdKQotICAgICAgaWYgbm90IHZfaXNfY29udGFpbmVyOgotICAgICAgICB2X3dyaXRlcihtX3ZhbCkKLSAgICAgIGVsc2U6Ci0gICAgICAgIHZfd3JpdGVyKG1fdmFsLCBzcGVjWzNdKQotICAgIHNlbGYud3JpdGVNYXBFbmQoKQorICAgIGRlZiB3cml0ZUNvbnRhaW5lckxpc3Qoc2VsZiwgdmFsLCBzcGVjKToKKyAgICAgICAgdHR5cGUsIHRzcGVjLCBfID0gc3BlYworICAgICAgICBzZWxmLndyaXRlTGlzdEJlZ2luKHR0eXBlLCBsZW4odmFsKSkKKyAgICAgICAgZm9yIF8gaW4gc2VsZi5fd3JpdGVfYnlfdHR5cGUodHR5cGUsIHZhbCwgc3BlYywgdHNwZWMpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLndyaXRlTGlzdEVuZCgpCiAKLSAgZGVmIHdyaXRlU3RydWN0KHNlbGYsIG9iaiwgdGhyaWZ0X3NwZWMpOgotICAgIHNlbGYud3JpdGVTdHJ1Y3RCZWdpbihvYmouX19jbGFzc19fLl9fbmFtZV9fKQotICAgIGZvciBmaWVsZCBpbiB0aHJpZnRfc3BlYzoKLSAgICAgIGlmIGZpZWxkIGlzIE5vbmU6Ci0gICAgICAgIGNvbnRpbnVlCi0gICAgICBmbmFtZSA9IGZpZWxkWzJdCi0gICAgICB2YWwgPSBnZXRhdHRyKG9iaiwgZm5hbWUpCi0gICAgICBpZiB2YWwgaXMgTm9uZToKLSAgICAgICAgIyBza2lwIHdyaXRpbmcgb3V0IHVuc2V0IGZpZWxkcwotICAgICAgICBjb250aW51ZQotICAgICAgZmlkID0gZmllbGRbMF0KLSAgICAgIGZ0eXBlID0gZmllbGRbMV0KLSAgICAgIGZzcGVjID0gZmllbGRbM10KLSAgICAgICMgZ2V0IHRoZSB3cml0ZXIgbWV0aG9kIGZvciB0aGlzIHZhbHVlCi0gICAgICBzZWxmLndyaXRlRmllbGRCZWdpbihmbmFtZSwgZnR5cGUsIGZpZCkKLSAgICAgIHNlbGYud3JpdGVGaWVsZEJ5VFR5cGUoZnR5cGUsIHZhbCwgZnNwZWMpCi0gICAgICBzZWxmLndyaXRlRmllbGRFbmQoKQotICAgIHNlbGYud3JpdGVGaWVsZFN0b3AoKQotICAgIHNlbGYud3JpdGVTdHJ1Y3RFbmQoKQorICAgIGRlZiB3cml0ZUNvbnRhaW5lclNldChzZWxmLCB2YWwsIHNwZWMpOgorICAgICAgICB0dHlwZSwgdHNwZWMsIF8gPSBzcGVjCisgICAgICAgIHNlbGYud3JpdGVTZXRCZWdpbih0dHlwZSwgbGVuKHZhbCkpCisgICAgICAgIGZvciBfIGluIHNlbGYuX3dyaXRlX2J5X3R0eXBlKHR0eXBlLCB2YWwsIHNwZWMsIHRzcGVjKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi53cml0ZVNldEVuZCgpCiAKLSAgZGVmIHdyaXRlRmllbGRCeVRUeXBlKHNlbGYsIHR0eXBlLCB2YWwsIHNwZWMpOgotICAgIHJfaGFuZGxlciwgd19oYW5kbGVyLCBpc19jb250YWluZXIgPSBzZWxmLl9UVFlQRV9IQU5ETEVSU1t0dHlwZV0KLSAgICB3cml0ZXIgPSBnZXRhdHRyKHNlbGYsIHdfaGFuZGxlcikKLSAgICBpZiBpc19jb250YWluZXI6Ci0gICAgICB3cml0ZXIodmFsLCBzcGVjKQotICAgIGVsc2U6Ci0gICAgICB3cml0ZXIodmFsKQorICAgIGRlZiB3cml0ZUNvbnRhaW5lck1hcChzZWxmLCB2YWwsIHNwZWMpOgorICAgICAgICBrdHlwZSwga3NwZWMsIHZ0eXBlLCB2c3BlYywgXyA9IHNwZWMKKyAgICAgICAgc2VsZi53cml0ZU1hcEJlZ2luKGt0eXBlLCB2dHlwZSwgbGVuKHZhbCkpCisgICAgICAgIGZvciBfIGluIHppcChzZWxmLl93cml0ZV9ieV90dHlwZShrdHlwZSwgc2l4Lml0ZXJrZXlzKHZhbCksIHNwZWMsIGtzcGVjKSwKKyAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3dyaXRlX2J5X3R0eXBlKHZ0eXBlLCBzaXguaXRlcnZhbHVlcyh2YWwpLCBzcGVjLCB2c3BlYykpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLndyaXRlTWFwRW5kKCkKKworICAgIGRlZiB3cml0ZVN0cnVjdChzZWxmLCBvYmosIHRocmlmdF9zcGVjKToKKyAgICAgICAgc2VsZi53cml0ZVN0cnVjdEJlZ2luKG9iai5fX2NsYXNzX18uX19uYW1lX18pCisgICAgICAgIGZvciBmaWVsZCBpbiB0aHJpZnRfc3BlYzoKKyAgICAgICAgICAgIGlmIGZpZWxkIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGZuYW1lID0gZmllbGRbMl0KKyAgICAgICAgICAgIHZhbCA9IGdldGF0dHIob2JqLCBmbmFtZSkKKyAgICAgICAgICAgIGlmIHZhbCBpcyBOb25lOgorICAgICAgICAgICAgICAgICMgc2tpcCB3cml0aW5nIG91dCB1bnNldCBmaWVsZHMKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZmlkID0gZmllbGRbMF0KKyAgICAgICAgICAgIGZ0eXBlID0gZmllbGRbMV0KKyAgICAgICAgICAgIGZzcGVjID0gZmllbGRbM10KKyAgICAgICAgICAgIHNlbGYud3JpdGVGaWVsZEJlZ2luKGZuYW1lLCBmdHlwZSwgZmlkKQorICAgICAgICAgICAgc2VsZi53cml0ZUZpZWxkQnlUVHlwZShmdHlwZSwgdmFsLCBmc3BlYykKKyAgICAgICAgICAgIHNlbGYud3JpdGVGaWVsZEVuZCgpCisgICAgICAgIHNlbGYud3JpdGVGaWVsZFN0b3AoKQorICAgICAgICBzZWxmLndyaXRlU3RydWN0RW5kKCkKKworICAgIGRlZiBfd3JpdGVfYnlfdHR5cGUoc2VsZiwgdHR5cGUsIHZhbHMsIHNwZWMsIGVzcGVjKToKKyAgICAgICAgXywgd3JpdGVyX25hbWUsIGlzX2NvbnRhaW5lciA9IHNlbGYuX3R0eXBlX2hhbmRsZXJzKHR0eXBlLCBlc3BlYykKKyAgICAgICAgd3JpdGVyX2Z1bmMgPSBnZXRhdHRyKHNlbGYsIHdyaXRlcl9uYW1lKQorICAgICAgICB3cml0ZSA9IChsYW1iZGEgdjogd3JpdGVyX2Z1bmModiwgZXNwZWMpKSBpZiBpc19jb250YWluZXIgZWxzZSB3cml0ZXJfZnVuYworICAgICAgICBmb3IgdiBpbiB2YWxzOgorICAgICAgICAgICAgeWllbGQgd3JpdGUodikKKworICAgIGRlZiB3cml0ZUZpZWxkQnlUVHlwZShzZWxmLCB0dHlwZSwgdmFsLCBzcGVjKToKKyAgICAgICAgbmV4dChzZWxmLl93cml0ZV9ieV90dHlwZSh0dHlwZSwgW3ZhbF0sIHNwZWMsIHNwZWMpKQorCiAKIGRlZiBjaGVja0ludGVnZXJMaW1pdHMoaSwgYml0cyk6CiAgICAgaWYgYml0cyA9PSA4IGFuZCAoaSA8IC0xMjggb3IgaSA+IDEyNyk6CkBAIC00MTMsOSArNDExLDEwIEBACiAgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImkzMiByZXF1aXJlcyAtMjE0NzQ4MzY0OCA8PSBudW1iZXIgPD0gMjE0NzQ4MzY0NyIpCiAgICAgZWxpZiBiaXRzID09IDY0IGFuZCAoaSA8IC05MjIzMzcyMDM2ODU0Nzc1ODA4IG9yIGkgPiA5MjIzMzcyMDM2ODU0Nzc1ODA3KToKLSAgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpNjQgcmVxdWlyZXMgLTkyMjMzNzIwMzY4NTQ3NzU4MDggPD0gbnVtYmVyIDw9IDkyMjMzNzIwMzY4NTQ3NzU4MDciKQorICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpNjQgcmVxdWlyZXMgLTkyMjMzNzIwMzY4NTQ3NzU4MDggPD0gbnVtYmVyIDw9IDkyMjMzNzIwMzY4NTQ3NzU4MDciKQogCi1jbGFzcyBUUHJvdG9jb2xGYWN0b3J5OgotICBkZWYgZ2V0UHJvdG9jb2woc2VsZiwgdHJhbnMpOgotICAgIHBhc3MKKworY2xhc3MgVFByb3RvY29sRmFjdG9yeShvYmplY3QpOgorICAgIGRlZiBnZXRQcm90b2NvbChzZWxmLCB0cmFucyk6CisgICAgICAgIHBhc3MKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLnB5IGIvbGliL3B5L3NyYy9wcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IucHkKaW5kZXggM2U5ZTUwMC4uZjU1NDZjNyAxMDA2NDQKLS0tIGEvbGliL3B5L3NyYy9wcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IucHkKKysrIGIvbGliL3B5L3NyYy9wcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IucHkKQEAgLTE3LDI2ICsxNywxMCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotZnJvbSB0aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIGltcG9ydCBUUHJvdG9jb2xCYXNlCi1mcm9tIHR5cGVzIGltcG9ydCAqCiAKLWNsYXNzIFRQcm90b2NvbERlY29yYXRvcigpOgotICBkZWYgX19pbml0X18oc2VsZiwgcHJvdG9jb2wpOgotICAgIFRQcm90b2NvbEJhc2UocHJvdG9jb2wpCi0gICAgc2VsZi5wcm90b2NvbCA9IHByb3RvY29sCi0KLSAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpOgotICAgIGlmIGhhc2F0dHIoc2VsZi5wcm90b2NvbCwgbmFtZSk6Ci0gICAgICBtZW1iZXIgPSBnZXRhdHRyKHNlbGYucHJvdG9jb2wsIG5hbWUpCi0gICAgICBpZiB0eXBlKG1lbWJlcikgaW4gW01ldGhvZFR5cGUsIFVuYm91bmRNZXRob2RUeXBlLCBGdW5jdGlvblR5cGUsIExhbWJkYVR5cGUsIEJ1aWx0aW5GdW5jdGlvblR5cGUsIEJ1aWx0aW5NZXRob2RUeXBlXToKLSAgICAgICAgcmV0dXJuIGxhbWJkYSAqYXJncywgKiprd2FyZ3M6IHNlbGYuX3dyYXAobWVtYmVyLCBhcmdzLCBrd2FyZ3MpCi0gICAgICBlbHNlOgotICAgICAgICByZXR1cm4gbWVtYmVyCi0gICAgcmFpc2UgQXR0cmlidXRlRXJyb3IobmFtZSkKLQotICBkZWYgX3dyYXAoc2VsZiwgZnVuYywgYXJncywga3dhcmdzKToKLSAgICBpZiB0eXBlKGZ1bmMpID09IE1ldGhvZFR5cGU6Ci0gICAgICByZXN1bHQgPSBmdW5jKCphcmdzLCAqKmt3YXJncykKLSAgICBlbHNlOgotICAgICAgcmVzdWx0ID0gZnVuYyhzZWxmLnByb3RvY29sLCAqYXJncywgKiprd2FyZ3MpCi0gICAgcmV0dXJuIHJlc3VsdAorY2xhc3MgVFByb3RvY29sRGVjb3JhdG9yKG9iamVjdCk6CisgICAgZGVmIF9fbmV3X18oY2xzLCBwcm90b2NvbCwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgZGVjb3JhdGVkX2NscyA9IHR5cGUoJycuam9pbihbJ0RlY29yYXRlZCcsIHByb3RvY29sLl9fY2xhc3NfXy5fX25hbWVfX10pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xzLCBwcm90b2NvbC5fX2NsYXNzX18pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbC5fX2RpY3RfXykKKyAgICAgICAgcmV0dXJuIG9iamVjdC5fX25ld19fKGRlY29yYXRlZF9jbHMpCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3Byb3RvY29sL19faW5pdF9fLnB5IGIvbGliL3B5L3NyYy9wcm90b2NvbC9fX2luaXRfXy5weQppbmRleCA3ZWVmYjQ1Li43MTQ4ZjY2IDEwMDY0NAotLS0gYS9saWIvcHkvc3JjL3Byb3RvY29sL19faW5pdF9fLnB5CisrKyBiL2xpYi9weS9zcmMvcHJvdG9jb2wvX19pbml0X18ucHkKQEAgLTE3LDQgKzE3LDUgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLV9fYWxsX18gPSBbJ2Zhc3RiaW5hcnknLCAnVEJhc2UnLCAnVEJpbmFyeVByb3RvY29sJywgJ1RDb21wYWN0UHJvdG9jb2wnLCAnVEpTT05Qcm90b2NvbCcsICdUUHJvdG9jb2wnXQorX19hbGxfXyA9IFsnZmFzdGJpbmFyeScsICdUQmFzZScsICdUQmluYXJ5UHJvdG9jb2wnLCAnVENvbXBhY3RQcm90b2NvbCcsCisgICAgICAgICAgICdUSlNPTlByb3RvY29sJywgJ1RQcm90b2NvbCddCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3Byb3RvY29sL2Zhc3RiaW5hcnkuYyBiL2xpYi9weS9zcmMvcHJvdG9jb2wvZmFzdGJpbmFyeS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2M0OTExLi4wMDAwMDAwCi0tLSBhL2xpYi9weS9zcmMvcHJvdG9jb2wvZmFzdGJpbmFyeS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIzNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxQeXRob24uaD4KLSNpbmNsdWRlICJjU3RyaW5nSU8uaCIKLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpZm5kZWYgX1dJTjMyCi0jIGluY2x1ZGUgPHN0ZGJvb2wuaD4KLSMgaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotI2Vsc2UKLSMgaW5jbHVkZSA8V2luU29jazIuaD4KLSMgcHJhZ21hIGNvbW1lbnQgKGxpYiwgIndzMl8zMi5saWIiKQotIyBkZWZpbmUgQklHX0VORElBTiAoNDMyMSkKLSMgZGVmaW5lIExJVFRMRV9FTkRJQU4gKDEyMzQpCi0jIGRlZmluZSBCWVRFX09SREVSIExJVFRMRV9FTkRJQU4KLSMgaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgX01TQ19WRVIgPCAxNjAwCi0gICB0eXBlZGVmIGludCBfQm9vbDsKLSMgIGRlZmluZSBib29sIF9Cb29sCi0jICBkZWZpbmUgZmFsc2UgMAotIyAgZGVmaW5lIHRydWUgMQotIyBlbmRpZgotIyBkZWZpbmUgaW5saW5lIF9faW5saW5lCi0jZW5kaWYKLQotLyogRml4IGVuZGlhbm5lc3MgaXNzdWVzIG9uIFNvbGFyaXMgKi8KLSNpZiBkZWZpbmVkIChfX1NWUjQpICYmIGRlZmluZWQgKF9fc3VuKQotICNpZiBkZWZpbmVkKF9faTM4NikgJiYgIWRlZmluZWQoX19pMzg2X18pCi0gICNkZWZpbmUgX19pMzg2X18KLSAjZW5kaWYKLQotICNpZm5kZWYgQklHX0VORElBTgotICAjZGVmaW5lIEJJR19FTkRJQU4gKDQzMjEpCi0gI2VuZGlmCi0gI2lmbmRlZiBMSVRUTEVfRU5ESUFOCi0gICNkZWZpbmUgTElUVExFX0VORElBTiAoMTIzNCkKLSAjZW5kaWYKLQotIC8qIEkzODYgaXMgTEUsIGV2ZW4gb24gU29sYXJpcyAqLwotICNpZiAhZGVmaW5lZChCWVRFX09SREVSKSAmJiBkZWZpbmVkKF9faTM4Nl9fKQotICAjZGVmaW5lIEJZVEVfT1JERVIgTElUVExFX0VORElBTgotICNlbmRpZgotI2VuZGlmCi0KLS8vIFRPRE8oZHJlaXNzKTogZGVmdmFsIGFwcGVhcnMgdG8gYmUgdW51c2VkLiAgTG9vayBpbnRvIHJlbW92aW5nIGl0LgotLy8gVE9ETyhkcmVpc3MpOiBNYWtlIHBhcnNlX3NwZWNfYXJncyByZWN1cnNpdmUsIGFuZCBjYWNoZSB0aGUgb3V0cHV0Ci0vLyAgICAgICAgICAgICAgIHBlcm1hbmVudGx5IGluIHRoZSBvYmplY3QuICAoTWFsbG9jIGFuZCBvcnBoYW4uKQotLy8gVE9ETyhkcmVpc3MpOiBXaHkgZG8gd2UgbmVlZCBjU3RyaW5nSU8gZm9yIHJlYWRpbmcsIHdoeSBub3QganVzdCBjaGFyKj8KLS8vICAgICAgICAgICAgICAgQ2FuIGNTdHJpbmdJTyBsZXQgdXMgd29yayB3aXRoIGEgQnVmZmVyZWRUcmFuc3BvcnQ/Ci0vLyBUT0RPKGRyZWlzcyk6IERvbid0IGlnbm9yZSB0aGUgcnYgZnJvbSBjd3JpdGUgKG1heWJlKS4KLQotLyogPT09PT09IEJFR0lOIFVUSUxJVElFUyA9PT09PT0gKi8KLQotI2RlZmluZSBJTklUX09VVEJVRl9TSVpFIDEyOAotCi0vLyBTdG9sZW4gb3V0IG9mIFRQcm90b2NvbC5oLgotLy8gSXQgd291bGQgYmUgYSBodWdlIHBhaW4gdG8gaGF2ZSBib3RoIGdldCB0aGlzIGZyb20gb25lIHBsYWNlLgotdHlwZWRlZiBlbnVtIFRUeXBlIHsKLSAgVF9TVE9QICAgICAgID0gMCwKLSAgVF9WT0lEICAgICAgID0gMSwKLSAgVF9CT09MICAgICAgID0gMiwKLSAgVF9CWVRFICAgICAgID0gMywKLSAgVF9JMDggICAgICAgID0gMywKLSAgVF9JMTYgICAgICAgID0gNiwKLSAgVF9JMzIgICAgICAgID0gOCwKLSAgVF9VNjQgICAgICAgID0gOSwKLSAgVF9JNjQgICAgICAgID0gMTAsCi0gIFRfRE9VQkxFICAgICA9IDQsCi0gIFRfU1RSSU5HICAgICA9IDExLAotICBUX1VURjcgICAgICAgPSAxMSwKLSAgVF9TVFJVQ1QgICAgID0gMTIsCi0gIFRfTUFQICAgICAgICA9IDEzLAotICBUX1NFVCAgICAgICAgPSAxNCwKLSAgVF9MSVNUICAgICAgID0gMTUsCi0gIFRfVVRGOCAgICAgICA9IDE2LAotICBUX1VURjE2ICAgICAgPSAxNwotfSBUVHlwZTsKLQotI2lmbmRlZiBfX0JZVEVfT1JERVIKLSMgaWYgZGVmaW5lZChCWVRFX09SREVSKSAmJiBkZWZpbmVkKExJVFRMRV9FTkRJQU4pICYmIGRlZmluZWQoQklHX0VORElBTikKLSMgIGRlZmluZSBfX0JZVEVfT1JERVIgQllURV9PUkRFUgotIyAgZGVmaW5lIF9fTElUVExFX0VORElBTiBMSVRUTEVfRU5ESUFOCi0jICBkZWZpbmUgX19CSUdfRU5ESUFOIEJJR19FTkRJQU4KLSMgZWxzZQotIyAgZXJyb3IgIkNhbm5vdCBkZXRlcm1pbmUgZW5kaWFubmVzcyIKLSMgZW5kaWYKLSNlbmRpZgotCi0vLyBTYW1lIGNvbW1lbnQgYXMgdGhlIGVudW0uICBTb3JyeS4KLSNpZiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCi0jIGRlZmluZSBudG9obGwobikgKG4pCi0jIGRlZmluZSBodG9ubGwobikgKG4pCi0jZWxpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCi0jIGlmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19HTElCQ19fKQotIyAgaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KLSMgIGRlZmluZSBudG9obGwobikgYnN3YXBfNjQobikKLSMgIGRlZmluZSBodG9ubGwobikgYnN3YXBfNjQobikKLSMgZWxzZSAvKiBHTlVDICYgR0xJQkMgKi8KLSMgIGRlZmluZSBudG9obGwobikgKCAoKCh1bnNpZ25lZCBsb25nIGxvbmcpbnRvaGwobikpIDw8IDMyKSArIG50b2hsKG4gPj4gMzIpICkKLSMgIGRlZmluZSBodG9ubGwobikgKCAoKCh1bnNpZ25lZCBsb25nIGxvbmcpaHRvbmwobikpIDw8IDMyKSArIGh0b25sKG4gPj4gMzIpICkKLSMgZW5kaWYgLyogR05VQyAmIEdMSUJDICovCi0jZWxzZSAvKiBfX0JZVEVfT1JERVIgKi8KLSMgZXJyb3IgIkNhbid0IGRlZmluZSBodG9ubGwgb3IgbnRvaGxsISIKLSNlbmRpZgotCi0vLyBEb2luZyBhIGJlbmNobWFyayBzaG93cyB0aGF0IGludGVybmluZyBhY3R1YWxseSBtYWtlcyBhIGRpZmZlcmVuY2UsIGFtYXppbmdseS4KLSNkZWZpbmUgSU5URVJOX1NUUklORyh2YWx1ZSkgX2ludGVybl8gIyMgdmFsdWUKLQotI2RlZmluZSBJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRCh2KSAoICgodikgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkgKQotI2RlZmluZSBDSEVDS19SQU5HRSh2LCBtaW4sIG1heCkgKCAoKHYpIDw9IChtYXgpKSAmJiAoKHYpID49IChtaW4pKSApCi0KLS8vIFB5X3NzaXplX3Qgd2FzIG5vdCBkZWZpbmVkIGJlZm9yZSBQeXRob24gMi41Ci0jaWYgKFBZX1ZFUlNJT05fSEVYIDwgMHgwMjA1MDAwMCkKLXR5cGVkZWYgaW50IFB5X3NzaXplX3Q7Ci0jZW5kaWYKLQotLyoqCi0gKiBBIGNhY2hlIG9mIHRoZSBzcGVjX2FyZ3MgZm9yIGEgc2V0IG9yIGxpc3QsCi0gKiBzbyB3ZSBkb24ndCBoYXZlIHRvIGtlZXAgY2FsbGluZyBQeVR1cGxlX0dFVF9JVEVNLgotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIFRUeXBlIGVsZW1lbnRfdHlwZTsKLSAgUHlPYmplY3QqIHR5cGVhcmdzOwotfSBTZXRMaXN0VHlwZUFyZ3M7Ci0KLS8qKgotICogQSBjYWNoZSBvZiB0aGUgc3BlY19hcmdzIGZvciBhIG1hcCwKLSAqIHNvIHdlIGRvbid0IGhhdmUgdG8ga2VlcCBjYWxsaW5nIFB5VHVwbGVfR0VUX0lURU0uCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgVFR5cGUga3RhZzsKLSAgVFR5cGUgdnRhZzsKLSAgUHlPYmplY3QqIGt0eXBlYXJnczsKLSAgUHlPYmplY3QqIHZ0eXBlYXJnczsKLX0gTWFwVHlwZUFyZ3M7Ci0KLS8qKgotICogQSBjYWNoZSBvZiB0aGUgc3BlY19hcmdzIGZvciBhIHN0cnVjdCwKLSAqIHNvIHdlIGRvbid0IGhhdmUgdG8ga2VlcCBjYWxsaW5nIFB5VHVwbGVfR0VUX0lURU0uCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgUHlPYmplY3QqIGtsYXNzOwotICBQeU9iamVjdCogc3BlYzsKLX0gU3RydWN0VHlwZUFyZ3M7Ci0KLS8qKgotICogQSBjYWNoZSBvZiB0aGUgaXRlbSBzcGVjIGZyb20gYSBzdHJ1Y3Qgc3BlY2lmaWNhdGlvbiwKLSAqIHNvIHdlIGRvbid0IGhhdmUgdG8ga2VlcCBjYWxsaW5nIFB5VHVwbGVfR0VUX0lURU0uCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgaW50IHRhZzsKLSAgVFR5cGUgdHlwZTsKLSAgUHlPYmplY3QqIGF0dHJuYW1lOwotICBQeU9iamVjdCogdHlwZWFyZ3M7Ci0gIFB5T2JqZWN0KiBkZWZ2YWw7Ci19IFN0cnVjdEl0ZW1TcGVjOwotCi0vKioKLSAqIEEgY2FjaGUgb2YgdGhlIHR3byBrZXkgYXR0cmlidXRlcyBvZiBhIENSZWFkYWJsZVRyYW5zcG9ydCwKLSAqIHNvIHdlIGRvbid0IGhhdmUgdG8ga2VlcCBjYWxsaW5nIFB5T2JqZWN0X0dldEF0dHIuCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgUHlPYmplY3QqIHN0cmluZ2lvYnVmOwotICBQeU9iamVjdCogcmVmaWxsX2NhbGxhYmxlOwotfSBEZWNvZGVCdWZmZXI7Ci0KLS8qKiBQb2ludGVyIHRvIGludGVybmVkIHN0cmluZyB0byBzcGVlZCB1cCBhdHRyaWJ1dGUgbG9va3VwLiAqLwotc3RhdGljIFB5T2JqZWN0KiBJTlRFUk5fU1RSSU5HKGNzdHJpbmdpb19idWYpOwotLyoqIFBvaW50ZXIgdG8gaW50ZXJuZWQgc3RyaW5nIHRvIHNwZWVkIHVwIGF0dHJpYnV0ZSBsb29rdXAuICovCi1zdGF0aWMgUHlPYmplY3QqIElOVEVSTl9TVFJJTkcoY3N0cmluZ2lvX3JlZmlsbCk7Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbAotY2hlY2tfc3NpemVfdF8zMihQeV9zc2l6ZV90IGxlbikgewotICAvLyBlcnJvciBmcm9tIGdldHRpbmcgdGhlIGludAotICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQobGVuKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUNIRUNLX1JBTkdFKGxlbiwgMCwgSU5UMzJfTUFYKSkgewotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAic3RyaW5nIHNpemUgb3V0IG9mIHJhbmdlIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0jZGVmaW5lIE1BWF9MSVNUX1NJWkUgKDEwMDAwKQotCi1zdGF0aWMgaW5saW5lIGJvb2wKLWNoZWNrX2xpc3RfbGVuZ3RoKFB5X3NzaXplX3QgbGVuKSB7Ci0gIC8vIGVycm9yIGZyb20gZ2V0dGluZyB0aGUgaW50Ci0gIGlmIChJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRChsZW4pKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghQ0hFQ0tfUkFOR0UobGVuLCAwLCBNQVhfTElTVF9TSVpFKSkgewotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAibGlzdCBzaXplIG91dCBvZiB0aGUgc2FuaXR5IGxpbWl0ICgxMDAwMCBpdGVtcyBtYXgpIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wKLXBhcnNlX3B5aW50KFB5T2JqZWN0KiBvLCBpbnQzMl90KiByZXQsIGludDMyX3QgbWluLCBpbnQzMl90IG1heCkgewotICBsb25nIHZhbCA9IFB5SW50X0FzTG9uZyhvKTsKLQotICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQodmFsKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUNIRUNLX1JBTkdFKHZhbCwgbWluLCBtYXgpKSB7Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJpbnQgb3V0IG9mIHJhbmdlIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgKnJldCA9IChpbnQzMl90KSB2YWw7Ci0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIC0tLSBGVU5DVElPTlMgVE8gUEFSU0UgU1RSVUNUIFNQRUNJRklDQVRPSU5TIC0tLSAqLwotCi1zdGF0aWMgYm9vbAotcGFyc2Vfc2V0X2xpc3RfYXJncyhTZXRMaXN0VHlwZUFyZ3MqIGRlc3QsIFB5T2JqZWN0KiB0eXBlYXJncykgewotICBpZiAoUHlUdXBsZV9TaXplKHR5cGVhcmdzKSAhPSAyKSB7Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImV4cGVjdGluZyB0dXBsZSBvZiBzaXplIDIgZm9yIGxpc3Qvc2V0IHR5cGUgYXJncyIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGRlc3QtPmVsZW1lbnRfdHlwZSA9IFB5SW50X0FzTG9uZyhQeVR1cGxlX0dFVF9JVEVNKHR5cGVhcmdzLCAwKSk7Ci0gIGlmIChJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRChkZXN0LT5lbGVtZW50X3R5cGUpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZGVzdC0+dHlwZWFyZ3MgPSBQeVR1cGxlX0dFVF9JVEVNKHR5cGVhcmdzLCAxKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2wKLXBhcnNlX21hcF9hcmdzKE1hcFR5cGVBcmdzKiBkZXN0LCBQeU9iamVjdCogdHlwZWFyZ3MpIHsKLSAgaWYgKFB5VHVwbGVfU2l6ZSh0eXBlYXJncykgIT0gNCkgewotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJleHBlY3RpbmcgNCBhcmd1bWVudHMgZm9yIHR5cGVhcmdzIHRvIG1hcCIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGRlc3QtPmt0YWcgPSBQeUludF9Bc0xvbmcoUHlUdXBsZV9HRVRfSVRFTSh0eXBlYXJncywgMCkpOwotICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQoZGVzdC0+a3RhZykpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBkZXN0LT52dGFnID0gUHlJbnRfQXNMb25nKFB5VHVwbGVfR0VUX0lURU0odHlwZWFyZ3MsIDIpKTsKLSAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKGRlc3QtPnZ0YWcpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZGVzdC0+a3R5cGVhcmdzID0gUHlUdXBsZV9HRVRfSVRFTSh0eXBlYXJncywgMSk7Ci0gIGRlc3QtPnZ0eXBlYXJncyA9IFB5VHVwbGVfR0VUX0lURU0odHlwZWFyZ3MsIDMpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbAotcGFyc2Vfc3RydWN0X2FyZ3MoU3RydWN0VHlwZUFyZ3MqIGRlc3QsIFB5T2JqZWN0KiB0eXBlYXJncykgewotICBpZiAoUHlUdXBsZV9TaXplKHR5cGVhcmdzKSAhPSAyKSB7Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImV4cGVjdGluZyB0dXBsZSBvZiBzaXplIDIgZm9yIHN0cnVjdCBhcmdzIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZGVzdC0+a2xhc3MgPSBQeVR1cGxlX0dFVF9JVEVNKHR5cGVhcmdzLCAwKTsKLSAgZGVzdC0+c3BlYyA9IFB5VHVwbGVfR0VUX0lURU0odHlwZWFyZ3MsIDEpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgaW50Ci1wYXJzZV9zdHJ1Y3RfaXRlbV9zcGVjKFN0cnVjdEl0ZW1TcGVjKiBkZXN0LCBQeU9iamVjdCogc3BlY190dXBsZSkgewotCi0gIC8vIGknZCBsaWtlIHRvIHVzZSBQYXJzZUFyZ3MgaGVyZSwgYnV0IGl0IHNlZW1zIHRvIGJlIGEgYm90dGxlbmVjay4KLSAgaWYgKFB5VHVwbGVfU2l6ZShzcGVjX3R1cGxlKSAhPSA1KSB7Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImV4cGVjdGluZyA1IGFyZ3VtZW50cyBmb3Igc3BlYyB0dXBsZSIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGRlc3QtPnRhZyA9IFB5SW50X0FzTG9uZyhQeVR1cGxlX0dFVF9JVEVNKHNwZWNfdHVwbGUsIDApKTsKLSAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKGRlc3QtPnRhZykpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBkZXN0LT50eXBlID0gUHlJbnRfQXNMb25nKFB5VHVwbGVfR0VUX0lURU0oc3BlY190dXBsZSwgMSkpOwotICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQoZGVzdC0+dHlwZSkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBkZXN0LT5hdHRybmFtZSA9IFB5VHVwbGVfR0VUX0lURU0oc3BlY190dXBsZSwgMik7Ci0gIGRlc3QtPnR5cGVhcmdzID0gUHlUdXBsZV9HRVRfSVRFTShzcGVjX3R1cGxlLCAzKTsKLSAgZGVzdC0+ZGVmdmFsID0gUHlUdXBsZV9HRVRfSVRFTShzcGVjX3R1cGxlLCA0KTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qID09PT09PSBFTkQgVVRJTElUSUVTID09PT09PSAqLwotCi0KLS8qID09PT09PSBCRUdJTiBXUklUSU5HIEZVTkNUSU9OUyA9PT09PT0gKi8KLQotLyogLS0tIExPVy1MRVZFTCBXUklUSU5HIEZVTkNUSU9OUyAtLS0gKi8KLQotc3RhdGljIHZvaWQgd3JpdGVCeXRlKFB5T2JqZWN0KiBvdXRidWYsIGludDhfdCB2YWwpIHsKLSAgaW50OF90IG5ldCA9IHZhbDsKLSAgUHljU3RyaW5nSU8tPmN3cml0ZShvdXRidWYsIChjaGFyKikmbmV0LCBzaXplb2YoaW50OF90KSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHdyaXRlSTE2KFB5T2JqZWN0KiBvdXRidWYsIGludDE2X3QgdmFsKSB7Ci0gIGludDE2X3QgbmV0ID0gKGludDE2X3QpaHRvbnModmFsKTsKLSAgUHljU3RyaW5nSU8tPmN3cml0ZShvdXRidWYsIChjaGFyKikmbmV0LCBzaXplb2YoaW50MTZfdCkpOwotfQotCi1zdGF0aWMgdm9pZCB3cml0ZUkzMihQeU9iamVjdCogb3V0YnVmLCBpbnQzMl90IHZhbCkgewotICBpbnQzMl90IG5ldCA9IChpbnQzMl90KWh0b25sKHZhbCk7Ci0gIFB5Y1N0cmluZ0lPLT5jd3JpdGUob3V0YnVmLCAoY2hhciopJm5ldCwgc2l6ZW9mKGludDMyX3QpKTsKLX0KLQotc3RhdGljIHZvaWQgd3JpdGVJNjQoUHlPYmplY3QqIG91dGJ1ZiwgaW50NjRfdCB2YWwpIHsKLSAgaW50NjRfdCBuZXQgPSAoaW50NjRfdClodG9ubGwodmFsKTsKLSAgUHljU3RyaW5nSU8tPmN3cml0ZShvdXRidWYsIChjaGFyKikmbmV0LCBzaXplb2YoaW50NjRfdCkpOwotfQotCi1zdGF0aWMgdm9pZCB3cml0ZURvdWJsZShQeU9iamVjdCogb3V0YnVmLCBkb3VibGUgZHViKSB7Ci0gIC8vIFVuZm9ydHVuYXRlbHksIGJpdHdpc2VfY2FzdCBkb2Vzbid0IHdvcmsgaW4gQy4gIEJhZCBDIQotICB1bmlvbiB7Ci0gICAgZG91YmxlIGY7Ci0gICAgaW50NjRfdCB0OwotICB9IHRyYW5zZmVyOwotICB0cmFuc2Zlci5mID0gZHViOwotICB3cml0ZUk2NChvdXRidWYsIHRyYW5zZmVyLnQpOwotfQotCi0KLS8qIC0tLSBNQUlOIFJFQ1VSU0lWRSBPVVRQVVQgRlVOQ1RJT04gLS0gKi8KLQotc3RhdGljIGludAotb3V0cHV0X3ZhbChQeU9iamVjdCogb3V0cHV0LCBQeU9iamVjdCogdmFsdWUsIFRUeXBlIHR5cGUsIFB5T2JqZWN0KiB0eXBlYXJncykgewotICAvKgotICAgKiBSZWZjb3VudGluZyBTdHJhdGVneToKLSAgICoKLSAgICogV2UgYXNzdW1lIHRoYXQgZWxlbWVudHMgb2YgdGhlIHRocmlmdF9zcGVjIHR1cGxlIGFyZSBub3QgZ29pbmcgdG8gYmUKLSAgICogbXV0YXRlZCwgc28gd2UgZG9uJ3QgcmVmIGNvdW50IHRob3NlIGF0IGFsbC4gT3RoZXIgdGhhbiB0aGF0LCB3ZSB0cnkgdG8KLSAgICoga2VlcCBhIHJlZmVyZW5jZSB0byBhbGwgdGhlIHVzZXItY3JlYXRlZCBvYmplY3RzIHdoaWxlIHdlIHdvcmsgd2l0aCB0aGVtLgotICAgKiBvdXRwdXRfdmFsIGFzc3VtZXMgdGhhdCBhIHJlZmVyZW5jZSBpcyBhbHJlYWR5IGhlbGQuIFRoZSAqY2FsbGVyKiBpcwotICAgKiByZXNwb25zaWJsZSBmb3IgaGFuZGxpbmcgcmVmZXJlbmNlcwotICAgKi8KLQotICBzd2l0Y2ggKHR5cGUpIHsKLQotICBjYXNlIFRfQk9PTDogewotICAgIGludCB2ID0gUHlPYmplY3RfSXNUcnVlKHZhbHVlKTsKLSAgICBpZiAodiA9PSAtMSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHdyaXRlQnl0ZShvdXRwdXQsIChpbnQ4X3QpIHYpOwotICAgIGJyZWFrOwotICB9Ci0gIGNhc2UgVF9JMDg6IHsKLSAgICBpbnQzMl90IHZhbDsKLQotICAgIGlmICghcGFyc2VfcHlpbnQodmFsdWUsICZ2YWwsIElOVDhfTUlOLCBJTlQ4X01BWCkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB3cml0ZUJ5dGUob3V0cHV0LCAoaW50OF90KSB2YWwpOwotICAgIGJyZWFrOwotICB9Ci0gIGNhc2UgVF9JMTY6IHsKLSAgICBpbnQzMl90IHZhbDsKLQotICAgIGlmICghcGFyc2VfcHlpbnQodmFsdWUsICZ2YWwsIElOVDE2X01JTiwgSU5UMTZfTUFYKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHdyaXRlSTE2KG91dHB1dCwgKGludDE2X3QpIHZhbCk7Ci0gICAgYnJlYWs7Ci0gIH0KLSAgY2FzZSBUX0kzMjogewotICAgIGludDMyX3QgdmFsOwotCi0gICAgaWYgKCFwYXJzZV9weWludCh2YWx1ZSwgJnZhbCwgSU5UMzJfTUlOLCBJTlQzMl9NQVgpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgd3JpdGVJMzIob3V0cHV0LCB2YWwpOwotICAgIGJyZWFrOwotICB9Ci0gIGNhc2UgVF9JNjQ6IHsKLSAgICBpbnQ2NF90IG52YWwgPSBQeUxvbmdfQXNMb25nTG9uZyh2YWx1ZSk7Ci0KLSAgICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQobnZhbCkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAoIUNIRUNLX1JBTkdFKG52YWwsIElOVDY0X01JTiwgSU5UNjRfTUFYKSkgewotICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJpbnQgb3V0IG9mIHJhbmdlIik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgd3JpdGVJNjQob3V0cHV0LCBudmFsKTsKLSAgICBicmVhazsKLSAgfQotCi0gIGNhc2UgVF9ET1VCTEU6IHsKLSAgICBkb3VibGUgbnZhbCA9IFB5RmxvYXRfQXNEb3VibGUodmFsdWUpOwotICAgIGlmIChudmFsID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHdyaXRlRG91YmxlKG91dHB1dCwgbnZhbCk7Ci0gICAgYnJlYWs7Ci0gIH0KLQotICBjYXNlIFRfU1RSSU5HOiB7Ci0gICAgUHlfc3NpemVfdCBsZW4gPSBQeVN0cmluZ19TaXplKHZhbHVlKTsKLQotICAgIGlmICghY2hlY2tfc3NpemVfdF8zMihsZW4pKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgd3JpdGVJMzIob3V0cHV0LCAoaW50MzJfdCkgbGVuKTsKLSAgICBQeWNTdHJpbmdJTy0+Y3dyaXRlKG91dHB1dCwgUHlTdHJpbmdfQXNTdHJpbmcodmFsdWUpLCAoaW50MzJfdCkgbGVuKTsKLSAgICBicmVhazsKLSAgfQotCi0gIGNhc2UgVF9MSVNUOgotICBjYXNlIFRfU0VUOiB7Ci0gICAgUHlfc3NpemVfdCBsZW47Ci0gICAgU2V0TGlzdFR5cGVBcmdzIHBhcnNlZGFyZ3M7Ci0gICAgUHlPYmplY3QgKml0ZW07Ci0gICAgUHlPYmplY3QgKml0ZXJhdG9yOwotCi0gICAgaWYgKCFwYXJzZV9zZXRfbGlzdF9hcmdzKCZwYXJzZWRhcmdzLCB0eXBlYXJncykpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBsZW4gPSBQeU9iamVjdF9MZW5ndGgodmFsdWUpOwotCi0gICAgaWYgKCFjaGVja19zc2l6ZV90XzMyKGxlbikpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB3cml0ZUJ5dGUob3V0cHV0LCBwYXJzZWRhcmdzLmVsZW1lbnRfdHlwZSk7Ci0gICAgd3JpdGVJMzIob3V0cHV0LCAoaW50MzJfdCkgbGVuKTsKLQotICAgIGl0ZXJhdG9yID0gIFB5T2JqZWN0X0dldEl0ZXIodmFsdWUpOwotICAgIGlmIChpdGVyYXRvciA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgd2hpbGUgKChpdGVtID0gUHlJdGVyX05leHQoaXRlcmF0b3IpKSkgewotICAgICAgaWYgKCFvdXRwdXRfdmFsKG91dHB1dCwgaXRlbSwgcGFyc2VkYXJncy5lbGVtZW50X3R5cGUsIHBhcnNlZGFyZ3MudHlwZWFyZ3MpKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKLSAgICAgICAgUHlfREVDUkVGKGl0ZXJhdG9yKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgUHlfREVDUkVGKGl0ZW0pOwotICAgIH0KLQotICAgIFB5X0RFQ1JFRihpdGVyYXRvcik7Ci0KLSAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGJyZWFrOwotICB9Ci0KLSAgY2FzZSBUX01BUDogewotICAgIFB5T2JqZWN0ICprLCAqdjsKLSAgICBQeV9zc2l6ZV90IHBvcyA9IDA7Ci0gICAgUHlfc3NpemVfdCBsZW47Ci0KLSAgICBNYXBUeXBlQXJncyBwYXJzZWRhcmdzOwotCi0gICAgbGVuID0gUHlEaWN0X1NpemUodmFsdWUpOwotICAgIGlmICghY2hlY2tfc3NpemVfdF8zMihsZW4pKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKCFwYXJzZV9tYXBfYXJncygmcGFyc2VkYXJncywgdHlwZWFyZ3MpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgd3JpdGVCeXRlKG91dHB1dCwgcGFyc2VkYXJncy5rdGFnKTsKLSAgICB3cml0ZUJ5dGUob3V0cHV0LCBwYXJzZWRhcmdzLnZ0YWcpOwotICAgIHdyaXRlSTMyKG91dHB1dCwgbGVuKTsKLQotICAgIC8vIFRPRE8oYm1hdXJlcik6IHNob3VsZCBzdXBwb3J0IGFueSBtYXBwaW5nLCBub3QganVzdCBkaWN0cwotICAgIHdoaWxlIChQeURpY3RfTmV4dCh2YWx1ZSwgJnBvcywgJmssICZ2KSkgewotICAgICAgLy8gVE9ETyhkcmVpc3MpOiBUaGluayBoYXJkIGFib3V0IHdoZXRoZXIgdGhlc2UgSU5DUkVGcyBhY3R1YWxseQotICAgICAgLy8gICAgICAgICAgICAgICB0dXJuIGFueSB1bnNhZmUgc2NlbmFyaW9zIGludG8gc2FmZSBzY2VuYXJpb3MuCi0gICAgICBQeV9JTkNSRUYoayk7Ci0gICAgICBQeV9JTkNSRUYodik7Ci0KLSAgICAgIGlmICghb3V0cHV0X3ZhbChvdXRwdXQsIGssIHBhcnNlZGFyZ3Mua3RhZywgcGFyc2VkYXJncy5rdHlwZWFyZ3MpCi0gICAgICAgICAgfHwgIW91dHB1dF92YWwob3V0cHV0LCB2LCBwYXJzZWRhcmdzLnZ0YWcsIHBhcnNlZGFyZ3MudnR5cGVhcmdzKSkgewotICAgICAgICBQeV9ERUNSRUYoayk7Ci0gICAgICAgIFB5X0RFQ1JFRih2KTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgUHlfREVDUkVGKGspOwotICAgICAgUHlfREVDUkVGKHYpOwotICAgIH0KLSAgICBicmVhazsKLSAgfQotCi0gIC8vIFRPRE8oZHJlaXNzKTogQ29uc2lkZXIgYnJlYWtpbmcgdGhpcyBvdXQgYXMgYSBmdW5jdGlvbgotICAvLyAgICAgICAgICAgICAgIHRoZSB3YXkgd2UgZGlkIGZvciBkZWNvZGVfc3RydWN0LgotICBjYXNlIFRfU1RSVUNUOiB7Ci0gICAgU3RydWN0VHlwZUFyZ3MgcGFyc2VkYXJnczsKLSAgICBQeV9zc2l6ZV90IG5zcGVjOwotICAgIFB5X3NzaXplX3QgaTsKLQotICAgIGlmICghcGFyc2Vfc3RydWN0X2FyZ3MoJnBhcnNlZGFyZ3MsIHR5cGVhcmdzKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIG5zcGVjID0gUHlUdXBsZV9TaXplKHBhcnNlZGFyZ3Muc3BlYyk7Ci0KLSAgICBpZiAobnNwZWMgPT0gLTEpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbnNwZWM7IGkrKykgewotICAgICAgU3RydWN0SXRlbVNwZWMgcGFyc2Vkc3BlYzsKLSAgICAgIFB5T2JqZWN0KiBzcGVjX3R1cGxlOwotICAgICAgUHlPYmplY3QqIGluc3R2YWwgPSBOVUxMOwotCi0gICAgICBzcGVjX3R1cGxlID0gUHlUdXBsZV9HRVRfSVRFTShwYXJzZWRhcmdzLnNwZWMsIGkpOwotICAgICAgaWYgKHNwZWNfdHVwbGUgPT0gUHlfTm9uZSkgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgaWYgKCFwYXJzZV9zdHJ1Y3RfaXRlbV9zcGVjICgmcGFyc2Vkc3BlYywgc3BlY190dXBsZSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgICBpbnN0dmFsID0gUHlPYmplY3RfR2V0QXR0cih2YWx1ZSwgcGFyc2Vkc3BlYy5hdHRybmFtZSk7Ci0KLSAgICAgIGlmICghaW5zdHZhbCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChpbnN0dmFsID09IFB5X05vbmUpIHsKLSAgICAgICAgUHlfREVDUkVGKGluc3R2YWwpOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgd3JpdGVCeXRlKG91dHB1dCwgKGludDhfdCkgcGFyc2Vkc3BlYy50eXBlKTsKLSAgICAgIHdyaXRlSTE2KG91dHB1dCwgcGFyc2Vkc3BlYy50YWcpOwotCi0gICAgICBpZiAoIW91dHB1dF92YWwob3V0cHV0LCBpbnN0dmFsLCBwYXJzZWRzcGVjLnR5cGUsIHBhcnNlZHNwZWMudHlwZWFyZ3MpKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihpbnN0dmFsKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgICBQeV9ERUNSRUYoaW5zdHZhbCk7Ci0gICAgfQotCi0gICAgd3JpdGVCeXRlKG91dHB1dCwgKGludDhfdClUX1NUT1ApOwotICAgIGJyZWFrOwotICB9Ci0KLSAgY2FzZSBUX1NUT1A6Ci0gIGNhc2UgVF9WT0lEOgotICBjYXNlIFRfVVRGMTY6Ci0gIGNhc2UgVF9VVEY4OgotICBjYXNlIFRfVTY0OgotICBkZWZhdWx0OgotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJVbmV4cGVjdGVkIFRUeXBlIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotCi0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiAtLS0gVE9QLUxFVkVMIFdSQVBQRVIgRk9SIE9VVFBVVCAtLSAqLwotCi1zdGF0aWMgUHlPYmplY3QgKgotZW5jb2RlX2JpbmFyeShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpIHsKLSAgUHlPYmplY3QqIGVuY19vYmo7Ci0gIFB5T2JqZWN0KiB0eXBlX2FyZ3M7Ci0gIFB5T2JqZWN0KiBidWY7Ci0gIFB5T2JqZWN0KiByZXQgPSBOVUxMOwotCi0gIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT08iLCAmZW5jX29iaiwgJnR5cGVfYXJncykpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIGJ1ZiA9IFB5Y1N0cmluZ0lPLT5OZXdPdXRwdXQoSU5JVF9PVVRCVUZfU0laRSk7Ci0gIGlmIChvdXRwdXRfdmFsKGJ1ZiwgZW5jX29iaiwgVF9TVFJVQ1QsIHR5cGVfYXJncykpIHsKLSAgICByZXQgPSBQeWNTdHJpbmdJTy0+Y2dldHZhbHVlKGJ1Zik7Ci0gIH0KLQotICBQeV9ERUNSRUYoYnVmKTsKLSAgcmV0dXJuIHJldDsKLX0KLQotLyogPT09PT09IEVORCBXUklUSU5HIEZVTkNUSU9OUyA9PT09PT0gKi8KLQotCi0vKiA9PT09PT0gQkVHSU4gUkVBRElORyBGVU5DVElPTlMgPT09PT09ICovCi0KLS8qIC0tLSBMT1ctTEVWRUwgUkVBRElORyBGVU5DVElPTlMgLS0tICovCi0KLXN0YXRpYyB2b2lkCi1mcmVlX2RlY29kZWJ1ZihEZWNvZGVCdWZmZXIqIGQpIHsKLSAgUHlfWERFQ1JFRihkLT5zdHJpbmdpb2J1Zik7Ci0gIFB5X1hERUNSRUYoZC0+cmVmaWxsX2NhbGxhYmxlKTsKLX0KLQotc3RhdGljIGJvb2wKLWRlY29kZV9idWZmZXJfZnJvbV9vYmooRGVjb2RlQnVmZmVyKiBkZXN0LCBQeU9iamVjdCogb2JqKSB7Ci0gIGRlc3QtPnN0cmluZ2lvYnVmID0gUHlPYmplY3RfR2V0QXR0cihvYmosIElOVEVSTl9TVFJJTkcoY3N0cmluZ2lvX2J1ZikpOwotICBpZiAoIWRlc3QtPnN0cmluZ2lvYnVmKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKCFQeWNTdHJpbmdJT19JbnB1dENoZWNrKGRlc3QtPnN0cmluZ2lvYnVmKSkgewotICAgIGZyZWVfZGVjb2RlYnVmKGRlc3QpOwotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJleHBlY3Rpbmcgc3RyaW5naW8gaW5wdXQiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBkZXN0LT5yZWZpbGxfY2FsbGFibGUgPSBQeU9iamVjdF9HZXRBdHRyKG9iaiwgSU5URVJOX1NUUklORyhjc3RyaW5naW9fcmVmaWxsKSk7Ci0KLSAgaWYoIWRlc3QtPnJlZmlsbF9jYWxsYWJsZSkgewotICAgIGZyZWVfZGVjb2RlYnVmKGRlc3QpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmICghUHlDYWxsYWJsZV9DaGVjayhkZXN0LT5yZWZpbGxfY2FsbGFibGUpKSB7Ci0gICAgZnJlZV9kZWNvZGVidWYoZGVzdCk7Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImV4cGVjdGluZyBjYWxsYWJsZSIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbCByZWFkQnl0ZXMoRGVjb2RlQnVmZmVyKiBpbnB1dCwgY2hhcioqIG91dHB1dCwgaW50IGxlbikgewotICBpbnQgcmVhZDsKLQotICAvLyBUT0RPKGRyZWlzcyk6IERvbid0IGZlYXIgdGhlIG1hbGxvYy4gIFRoaW5rIGFib3V0IHRha2luZyBhIGNvcHkgb2YKLSAgLy8gICAgICAgICAgICAgICB0aGUgcGFydGlhbCByZWFkIGluc3RlYWQgb2YgZm9yY2luZyB0aGUgdHJhbnNwb3J0Ci0gIC8vICAgICAgICAgICAgICAgdG8gcHJlcGVuZCBpdCB0byBpdHMgYnVmZmVyLgotCi0gIHJlYWQgPSBQeWNTdHJpbmdJTy0+Y3JlYWQoaW5wdXQtPnN0cmluZ2lvYnVmLCBvdXRwdXQsIGxlbik7Ci0KLSAgaWYgKHJlYWQgPT0gbGVuKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0gZWxzZSBpZiAocmVhZCA9PSAtMSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfSBlbHNlIHsKLSAgICBQeU9iamVjdCogbmV3aW9idWY7Ci0KLSAgICAvLyB1c2luZyBidWlsZGluZyBmdW5jdGlvbnMgYXMgdGhpcyBpcyBhIHJhcmUgY29kZXBhdGgKLSAgICBuZXdpb2J1ZiA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbigKLSAgICAgICAgaW5wdXQtPnJlZmlsbF9jYWxsYWJsZSwgInMjaSIsICpvdXRwdXQsIHJlYWQsIGxlbiwgTlVMTCk7Ci0gICAgaWYgKG5ld2lvYnVmID09IE5VTEwpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBtdXN0IGRvIHRoaXMgKkFGVEVSKiB0aGUgY2FsbCBzbyB0aGF0IHdlIGRvbid0IGRlcmVmIHRoZSBpbyBidWZmZXIKLSAgICBQeV9DTEVBUihpbnB1dC0+c3RyaW5naW9idWYpOwotICAgIGlucHV0LT5zdHJpbmdpb2J1ZiA9IG5ld2lvYnVmOwotCi0gICAgcmVhZCA9IFB5Y1N0cmluZ0lPLT5jcmVhZChpbnB1dC0+c3RyaW5naW9idWYsIG91dHB1dCwgbGVuKTsKLQotICAgIGlmIChyZWFkID09IGxlbikgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSBlbHNlIGlmIChyZWFkID09IC0xKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIFRPRE8oZHJlaXNzKTogVGhpcyBjb3VsZCBiZSBhIHZhbGlkIGNvZGUgcGF0aCBmb3IgYmlnIGJpbmFyeSBibG9icy4KLSAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0gICAgICAgICAgInJlZmlsbCBjbGFpbWVkIHRvIGhhdmUgcmVmaWxsZWQgdGhlIGJ1ZmZlciwgYnV0IGRpZG4ndCEhIik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci19Ci0KLXN0YXRpYyBpbnQ4X3QgcmVhZEJ5dGUoRGVjb2RlQnVmZmVyKiBpbnB1dCkgewotICBjaGFyKiBidWY7Ci0gIGlmICghcmVhZEJ5dGVzKGlucHV0LCAmYnVmLCBzaXplb2YoaW50OF90KSkpIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICByZXR1cm4gKihpbnQ4X3QqKSBidWY7Ci19Ci0KLXN0YXRpYyBpbnQxNl90IHJlYWRJMTYoRGVjb2RlQnVmZmVyKiBpbnB1dCkgewotICBjaGFyKiBidWY7Ci0gIGlmICghcmVhZEJ5dGVzKGlucHV0LCAmYnVmLCBzaXplb2YoaW50MTZfdCkpKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgcmV0dXJuIChpbnQxNl90KSBudG9ocygqKGludDE2X3QqKSBidWYpOwotfQotCi1zdGF0aWMgaW50MzJfdCByZWFkSTMyKERlY29kZUJ1ZmZlciogaW5wdXQpIHsKLSAgY2hhciogYnVmOwotICBpZiAoIXJlYWRCeXRlcyhpbnB1dCwgJmJ1Ziwgc2l6ZW9mKGludDMyX3QpKSkgewotICAgIHJldHVybiAtMTsKLSAgfQotICByZXR1cm4gKGludDMyX3QpIG50b2hsKCooaW50MzJfdCopIGJ1Zik7Ci19Ci0KLQotc3RhdGljIGludDY0X3QgcmVhZEk2NChEZWNvZGVCdWZmZXIqIGlucHV0KSB7Ci0gIGNoYXIqIGJ1ZjsKLSAgaWYgKCFyZWFkQnl0ZXMoaW5wdXQsICZidWYsIHNpemVvZihpbnQ2NF90KSkpIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICByZXR1cm4gKGludDY0X3QpIG50b2hsbCgqKGludDY0X3QqKSBidWYpOwotfQotCi1zdGF0aWMgZG91YmxlIHJlYWREb3VibGUoRGVjb2RlQnVmZmVyKiBpbnB1dCkgewotICB1bmlvbiB7Ci0gICAgaW50NjRfdCBmOwotICAgIGRvdWJsZSB0OwotICB9IHRyYW5zZmVyOwotCi0gIHRyYW5zZmVyLmYgPSByZWFkSTY0KGlucHV0KTsKLSAgaWYgKHRyYW5zZmVyLmYgPT0gLTEpIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgcmV0dXJuIHRyYW5zZmVyLnQ7Ci19Ci0KLXN0YXRpYyBib29sCi1jaGVja1R5cGVCeXRlKERlY29kZUJ1ZmZlciogaW5wdXQsIFRUeXBlIGV4cGVjdGVkKSB7Ci0gIFRUeXBlIGdvdCA9IHJlYWRCeXRlKGlucHV0KTsKLSAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKGdvdCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoZXhwZWN0ZWQgIT0gZ290KSB7Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImdvdCB3cm9uZyB0dHlwZSB3aGlsZSByZWFkaW5nIGZpZWxkIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbAotc2tpcChEZWNvZGVCdWZmZXIqIGlucHV0LCBUVHlwZSB0eXBlKSB7Ci0jZGVmaW5lIFNLSVBCWVRFUyhuKSBcCi0gIGRvIHsgXAotICAgIGlmICghcmVhZEJ5dGVzKGlucHV0LCAmZHVtbXlfYnVmLCAobikpKSB7IFwKLSAgICAgIHJldHVybiBmYWxzZTsgXAotICAgIH0gXAotICB9IHdoaWxlKDApCi0KLSAgY2hhciogZHVtbXlfYnVmOwotCi0gIHN3aXRjaCAodHlwZSkgewotCi0gIGNhc2UgVF9CT09MOgotICBjYXNlIFRfSTA4OiBTS0lQQllURVMoMSk7IGJyZWFrOwotICBjYXNlIFRfSTE2OiBTS0lQQllURVMoMik7IGJyZWFrOwotICBjYXNlIFRfSTMyOiBTS0lQQllURVMoNCk7IGJyZWFrOwotICBjYXNlIFRfSTY0OgotICBjYXNlIFRfRE9VQkxFOiBTS0lQQllURVMoOCk7IGJyZWFrOwotCi0gIGNhc2UgVF9TVFJJTkc6IHsKLSAgICAvLyBUT0RPKGRyZWlzcyk6IEZpbmQgb3V0IGlmIHRoZXNlIGNoZWNrX3NzaXplX3QzMnMgYXJlIHJlYWxseSBuZWNlc3NhcnkuCi0gICAgaW50IGxlbiA9IHJlYWRJMzIoaW5wdXQpOwotICAgIGlmICghY2hlY2tfc3NpemVfdF8zMihsZW4pKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIFNLSVBCWVRFUyhsZW4pOwotICAgIGJyZWFrOwotICB9Ci0KLSAgY2FzZSBUX0xJU1Q6Ci0gIGNhc2UgVF9TRVQ6IHsKLSAgICBUVHlwZSBldHlwZTsKLSAgICBpbnQgbGVuLCBpOwotCi0gICAgZXR5cGUgPSByZWFkQnl0ZShpbnB1dCk7Ci0gICAgaWYgKGV0eXBlID09IC0xKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgbGVuID0gcmVhZEkzMihpbnB1dCk7Ci0gICAgaWYgKCFjaGVja19zc2l6ZV90XzMyKGxlbikpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgIGlmICghc2tpcChpbnB1dCwgZXR5cGUpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgYnJlYWs7Ci0gIH0KLQotICBjYXNlIFRfTUFQOiB7Ci0gICAgVFR5cGUga3R5cGUsIHZ0eXBlOwotICAgIGludCBsZW4sIGk7Ci0KLSAgICBrdHlwZSA9IHJlYWRCeXRlKGlucHV0KTsKLSAgICBpZiAoa3R5cGUgPT0gLTEpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB2dHlwZSA9IHJlYWRCeXRlKGlucHV0KTsKLSAgICBpZiAodnR5cGUgPT0gLTEpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBsZW4gPSByZWFkSTMyKGlucHV0KTsKLSAgICBpZiAoIWNoZWNrX3NzaXplX3RfMzIobGVuKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgaWYgKCEoc2tpcChpbnB1dCwga3R5cGUpICYmIHNraXAoaW5wdXQsIHZ0eXBlKSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgICBicmVhazsKLSAgfQotCi0gIGNhc2UgVF9TVFJVQ1Q6IHsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgVFR5cGUgdHlwZTsKLQotICAgICAgdHlwZSA9IHJlYWRCeXRlKGlucHV0KTsKLSAgICAgIGlmICh0eXBlID09IC0xKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLQotICAgICAgaWYgKHR5cGUgPT0gVF9TVE9QKQotICAgICAgICBicmVhazsKLQotICAgICAgU0tJUEJZVEVTKDIpOyAvLyB0YWcKLSAgICAgIGlmICghc2tpcChpbnB1dCwgdHlwZSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgICBicmVhazsKLSAgfQotCi0gIGNhc2UgVF9TVE9QOgotICBjYXNlIFRfVk9JRDoKLSAgY2FzZSBUX1VURjE2OgotICBjYXNlIFRfVVRGODoKLSAgY2FzZSBUX1U2NDoKLSAgZGVmYXVsdDoKLSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiVW5leHBlY3RlZCBUVHlwZSIpOwotICAgIHJldHVybiBmYWxzZTsKLQotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSN1bmRlZiBTS0lQQllURVMKLX0KLQotCi0vKiAtLS0gSEVMUEVSIEZVTkNUSU9OIEZPUiBERUNPREVfVkFMIC0tLSAqLwotCi1zdGF0aWMgUHlPYmplY3QqCi1kZWNvZGVfdmFsKERlY29kZUJ1ZmZlciogaW5wdXQsIFRUeXBlIHR5cGUsIFB5T2JqZWN0KiB0eXBlYXJncyk7Ci0KLXN0YXRpYyBib29sCi1kZWNvZGVfc3RydWN0KERlY29kZUJ1ZmZlciogaW5wdXQsIFB5T2JqZWN0KiBvdXRwdXQsIFB5T2JqZWN0KiBzcGVjX3NlcSkgewotICBpbnQgc3BlY19zZXFfbGVuID0gUHlUdXBsZV9TaXplKHNwZWNfc2VxKTsKLSAgaWYgKHNwZWNfc2VxX2xlbiA9PSAtMSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHdoaWxlICh0cnVlKSB7Ci0gICAgVFR5cGUgdHlwZTsKLSAgICBpbnQxNl90IHRhZzsKLSAgICBQeU9iamVjdCogaXRlbV9zcGVjOwotICAgIFB5T2JqZWN0KiBmaWVsZHZhbCA9IE5VTEw7Ci0gICAgU3RydWN0SXRlbVNwZWMgcGFyc2Vkc3BlYzsKLQotICAgIHR5cGUgPSByZWFkQnl0ZShpbnB1dCk7Ci0gICAgaWYgKHR5cGUgPT0gLTEpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKHR5cGUgPT0gVF9TVE9QKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgdGFnID0gcmVhZEkxNihpbnB1dCk7Ci0gICAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKHRhZykpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKHRhZyA+PSAwICYmIHRhZyA8IHNwZWNfc2VxX2xlbikgewotICAgICAgaXRlbV9zcGVjID0gUHlUdXBsZV9HRVRfSVRFTShzcGVjX3NlcSwgdGFnKTsKLSAgICB9IGVsc2UgewotICAgICAgaXRlbV9zcGVjID0gUHlfTm9uZTsKLSAgICB9Ci0KLSAgICBpZiAoaXRlbV9zcGVjID09IFB5X05vbmUpIHsKLSAgICAgIGlmICghc2tpcChpbnB1dCwgdHlwZSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFwYXJzZV9zdHJ1Y3RfaXRlbV9zcGVjKCZwYXJzZWRzcGVjLCBpdGVtX3NwZWMpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmIChwYXJzZWRzcGVjLnR5cGUgIT0gdHlwZSkgewotICAgICAgaWYgKCFza2lwKGlucHV0LCB0eXBlKSkgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAic3RydWN0IGZpZWxkIGhhZCB3cm9uZyB0eXBlIHdoaWxlIHJlYWRpbmcgYW5kIGNhbid0IGJlIHNraXBwZWQiKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZmllbGR2YWwgPSBkZWNvZGVfdmFsKGlucHV0LCBwYXJzZWRzcGVjLnR5cGUsIHBhcnNlZHNwZWMudHlwZWFyZ3MpOwotICAgIGlmIChmaWVsZHZhbCA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKFB5T2JqZWN0X1NldEF0dHIob3V0cHV0LCBwYXJzZWRzcGVjLmF0dHJuYW1lLCBmaWVsZHZhbCkgPT0gLTEpIHsKLSAgICAgIFB5X0RFQ1JFRihmaWVsZHZhbCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIFB5X0RFQ1JFRihmaWVsZHZhbCk7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogLS0tIE1BSU4gUkVDVVJTSVZFIElOUFVUIEZVTkNUSU9OIC0tLSAqLwotCi0vLyBSZXR1cm5zIGEgbmV3IHJlZmVyZW5jZS4KLXN0YXRpYyBQeU9iamVjdCoKLWRlY29kZV92YWwoRGVjb2RlQnVmZmVyKiBpbnB1dCwgVFR5cGUgdHlwZSwgUHlPYmplY3QqIHR5cGVhcmdzKSB7Ci0gIHN3aXRjaCAodHlwZSkgewotCi0gIGNhc2UgVF9CT09MOiB7Ci0gICAgaW50OF90IHYgPSByZWFkQnl0ZShpbnB1dCk7Ci0gICAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKHYpKSB7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKHYpIHsKLSAgICBjYXNlIDA6IFB5X1JFVFVSTl9GQUxTRTsKLSAgICBjYXNlIDE6IFB5X1JFVFVSTl9UUlVFOwotICAgIC8vIERvbid0IGxhdWdoLiAgVGhpcyBpcyBhIHBvdGVudGlhbGx5IHNlcmlvdXMgaXNzdWUuCi0gICAgZGVmYXVsdDogUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJvb2xlYW4gb3V0IG9mIHJhbmdlIik7IHJldHVybiBOVUxMOwotICAgIH0KLSAgICBicmVhazsKLSAgfQotICBjYXNlIFRfSTA4OiB7Ci0gICAgaW50OF90IHYgPSByZWFkQnl0ZShpbnB1dCk7Ci0gICAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKHYpKSB7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcodik7Ci0gIH0KLSAgY2FzZSBUX0kxNjogewotICAgIGludDE2X3QgdiA9IHJlYWRJMTYoaW5wdXQpOwotICAgIGlmIChJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRCh2KSkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh2KTsKLSAgfQotICBjYXNlIFRfSTMyOiB7Ci0gICAgaW50MzJfdCB2ID0gcmVhZEkzMihpbnB1dCk7Ci0gICAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKHYpKSB7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHYpOwotICB9Ci0KLSAgY2FzZSBUX0k2NDogewotICAgIGludDY0X3QgdiA9IHJlYWRJNjQoaW5wdXQpOwotICAgIGlmIChJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRCh2KSkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIC8vIFRPRE8oZHJlaXNzKTogRmluZCBvdXQgaWYgd2UgY2FuIHRha2UgdGhpcyBmYXN0cGF0aCBhbHdheXMgd2hlbgotICAgIC8vICAgICAgICAgICAgICAgc2l6ZW9mKGxvbmcpID09IHNpemVvZihsb25nIGxvbmcpLgotICAgIGlmIChDSEVDS19SQU5HRSh2LCBMT05HX01JTiwgTE9OR19NQVgpKSB7Ci0gICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHYpOwotICAgIH0KLQotICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKHYpOwotICB9Ci0KLSAgY2FzZSBUX0RPVUJMRTogewotICAgIGRvdWJsZSB2ID0gcmVhZERvdWJsZShpbnB1dCk7Ci0gICAgaWYgKHYgPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUodik7Ci0gIH0KLQotICBjYXNlIFRfU1RSSU5HOiB7Ci0gICAgUHlfc3NpemVfdCBsZW4gPSByZWFkSTMyKGlucHV0KTsKLSAgICBjaGFyKiBidWY7Ci0gICAgaWYgKCFyZWFkQnl0ZXMoaW5wdXQsICZidWYsIGxlbikpIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShidWYsIGxlbik7Ci0gIH0KLQotICBjYXNlIFRfTElTVDoKLSAgY2FzZSBUX1NFVDogewotICAgIFNldExpc3RUeXBlQXJncyBwYXJzZWRhcmdzOwotICAgIGludDMyX3QgbGVuOwotICAgIFB5T2JqZWN0KiByZXQgPSBOVUxMOwotICAgIGludCBpOwotCi0gICAgaWYgKCFwYXJzZV9zZXRfbGlzdF9hcmdzKCZwYXJzZWRhcmdzLCB0eXBlYXJncykpIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGlmICghY2hlY2tUeXBlQnl0ZShpbnB1dCwgcGFyc2VkYXJncy5lbGVtZW50X3R5cGUpKSB7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBsZW4gPSByZWFkSTMyKGlucHV0KTsKLSAgICBpZiAoIWNoZWNrX2xpc3RfbGVuZ3RoKGxlbikpIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldCA9IFB5TGlzdF9OZXcobGVuKTsKLSAgICBpZiAoIXJldCkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICBQeU9iamVjdCogaXRlbSA9IGRlY29kZV92YWwoaW5wdXQsIHBhcnNlZGFyZ3MuZWxlbWVudF90eXBlLCBwYXJzZWRhcmdzLnR5cGVhcmdzKTsKLSAgICAgIGlmICghaXRlbSkgewotICAgICAgICBQeV9ERUNSRUYocmV0KTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICB9Ci0gICAgICBQeUxpc3RfU0VUX0lURU0ocmV0LCBpLCBpdGVtKTsKLSAgICB9Ci0KLSAgICAvLyBUT0RPKGRyZWlzcyk6IENvbnNpZGVyIGJpdGluZyB0aGUgYnVsbGV0IGFuZCBtYWtpbmcgdHdvIHNlcGFyYXRlIGNhc2VzCi0gICAgLy8gICAgICAgICAgICAgICBmb3IgbGlzdCBhbmQgc2V0LCBhdm9pZGluZyB0aGlzIHBvc3QgZmFjdG8gY29udmVyc2lvbi4KLSAgICBpZiAodHlwZSA9PSBUX1NFVCkgewotICAgICAgUHlPYmplY3QqIHNldHJldDsKLSNpZiAoUFlfVkVSU0lPTl9IRVggPCAweDAyMDUwMDAwKQotICAgICAgLy8gaGFjayBuZWVkZWQgZm9yIG9sZGVyIHZlcnNpb25zCi0gICAgICBzZXRyZXQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKChQeU9iamVjdCopJlB5U2V0X1R5cGUsIHJldCwgTlVMTCk7Ci0jZWxzZQotICAgICAgLy8gb2ZmaWNpYWwgdmVyc2lvbgotICAgICAgc2V0cmV0ID0gUHlTZXRfTmV3KHJldCk7Ci0jZW5kaWYKLSAgICAgIFB5X0RFQ1JFRihyZXQpOwotICAgICAgcmV0dXJuIHNldHJldDsKLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLSAgfQotCi0gIGNhc2UgVF9NQVA6IHsKLSAgICBpbnQzMl90IGxlbjsKLSAgICBpbnQgaTsKLSAgICBNYXBUeXBlQXJncyBwYXJzZWRhcmdzOwotICAgIFB5T2JqZWN0KiByZXQgPSBOVUxMOwotCi0gICAgaWYgKCFwYXJzZV9tYXBfYXJncygmcGFyc2VkYXJncywgdHlwZWFyZ3MpKSB7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAoIWNoZWNrVHlwZUJ5dGUoaW5wdXQsIHBhcnNlZGFyZ3Mua3RhZykpIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBpZiAoIWNoZWNrVHlwZUJ5dGUoaW5wdXQsIHBhcnNlZGFyZ3MudnRhZykpIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGxlbiA9IHJlYWRJMzIoaW5wdXQpOwotICAgIGlmICghY2hlY2tfc3NpemVfdF8zMihsZW4pKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0ID0gUHlEaWN0X05ldygpOwotICAgIGlmICghcmV0KSB7Ci0gICAgICBnb3RvIGVycm9yOwotICAgIH0KLQotICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgUHlPYmplY3QqIGsgPSBOVUxMOwotICAgICAgUHlPYmplY3QqIHYgPSBOVUxMOwotICAgICAgayA9IGRlY29kZV92YWwoaW5wdXQsIHBhcnNlZGFyZ3Mua3RhZywgcGFyc2VkYXJncy5rdHlwZWFyZ3MpOwotICAgICAgaWYgKGsgPT0gTlVMTCkgewotICAgICAgICBnb3RvIGxvb3BfZXJyb3I7Ci0gICAgICB9Ci0gICAgICB2ID0gZGVjb2RlX3ZhbChpbnB1dCwgcGFyc2VkYXJncy52dGFnLCBwYXJzZWRhcmdzLnZ0eXBlYXJncyk7Ci0gICAgICBpZiAodiA9PSBOVUxMKSB7Ci0gICAgICAgIGdvdG8gbG9vcF9lcnJvcjsKLSAgICAgIH0KLSAgICAgIGlmIChQeURpY3RfU2V0SXRlbShyZXQsIGssIHYpID09IC0xKSB7Ci0gICAgICAgIGdvdG8gbG9vcF9lcnJvcjsKLSAgICAgIH0KLQotICAgICAgUHlfREVDUkVGKGspOwotICAgICAgUHlfREVDUkVGKHYpOwotICAgICAgY29udGludWU7Ci0KLSAgICAgIC8vIFl1Y2shICBEZXN0cnVjdG9ycywgYW55b25lPwotICAgICAgbG9vcF9lcnJvcjoKLSAgICAgIFB5X1hERUNSRUYoayk7Ci0gICAgICBQeV9YREVDUkVGKHYpOwotICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0OwotCi0gICAgZXJyb3I6Ci0gICAgUHlfWERFQ1JFRihyZXQpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgY2FzZSBUX1NUUlVDVDogewotICAgIFN0cnVjdFR5cGVBcmdzIHBhcnNlZGFyZ3M7Ci0JUHlPYmplY3QqIHJldDsKLSAgICBpZiAoIXBhcnNlX3N0cnVjdF9hcmdzKCZwYXJzZWRhcmdzLCB0eXBlYXJncykpIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldCA9IFB5T2JqZWN0X0NhbGxPYmplY3QocGFyc2VkYXJncy5rbGFzcywgTlVMTCk7Ci0gICAgaWYgKCFyZXQpIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGlmICghZGVjb2RlX3N0cnVjdChpbnB1dCwgcmV0LCBwYXJzZWRhcmdzLnNwZWMpKSB7Ci0gICAgICBQeV9ERUNSRUYocmV0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiByZXQ7Ci0gIH0KLQotICBjYXNlIFRfU1RPUDoKLSAgY2FzZSBUX1ZPSUQ6Ci0gIGNhc2UgVF9VVEYxNjoKLSAgY2FzZSBUX1VURjg6Ci0gIGNhc2UgVF9VNjQ6Ci0gIGRlZmF1bHQ6Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIlVuZXhwZWN0ZWQgVFR5cGUiKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotfQotCi0KLS8qIC0tLSBUT1AtTEVWRUwgV1JBUFBFUiBGT1IgSU5QVVQgLS0gKi8KLQotc3RhdGljIFB5T2JqZWN0KgotZGVjb2RlX2JpbmFyeShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpIHsKLSAgUHlPYmplY3QqIG91dHB1dF9vYmogPSBOVUxMOwotICBQeU9iamVjdCogdHJhbnNwb3J0ID0gTlVMTDsKLSAgUHlPYmplY3QqIHR5cGVhcmdzID0gTlVMTDsKLSAgU3RydWN0VHlwZUFyZ3MgcGFyc2VkYXJnczsKLSAgRGVjb2RlQnVmZmVyIGlucHV0ID0gezAsIDB9OwotCi0gIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT09PIiwgJm91dHB1dF9vYmosICZ0cmFuc3BvcnQsICZ0eXBlYXJncykpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIGlmICghcGFyc2Vfc3RydWN0X2FyZ3MoJnBhcnNlZGFyZ3MsIHR5cGVhcmdzKSkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgaWYgKCFkZWNvZGVfYnVmZmVyX2Zyb21fb2JqKCZpbnB1dCwgdHJhbnNwb3J0KSkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgaWYgKCFkZWNvZGVfc3RydWN0KCZpbnB1dCwgb3V0cHV0X29iaiwgcGFyc2VkYXJncy5zcGVjKSkgewotICAgIGZyZWVfZGVjb2RlYnVmKCZpbnB1dCk7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBmcmVlX2RlY29kZWJ1ZigmaW5wdXQpOwotCi0gIFB5X1JFVFVSTl9OT05FOwotfQotCi0vKiA9PT09PT0gRU5EIFJFQURJTkcgRlVOQ1RJT05TID09PT09PSAqLwotCi0KLS8qIC0tIFBZVEhPTiBNT0RVTEUgU0VUVVAgU1RVRkYgLS0tICovCi0KLXN0YXRpYyBQeU1ldGhvZERlZiBUaHJpZnRGYXN0QmluYXJ5TWV0aG9kc1tdID0gewotCi0gIHsiZW5jb2RlX2JpbmFyeSIsICBlbmNvZGVfYmluYXJ5LCBNRVRIX1ZBUkFSR1MsICIifSwKLSAgeyJkZWNvZGVfYmluYXJ5IiwgIGRlY29kZV9iaW5hcnksIE1FVEhfVkFSQVJHUywgIiJ9LAotCi0gIHtOVUxMLCBOVUxMLCAwLCBOVUxMfSAgICAgICAgLyogU2VudGluZWwgKi8KLX07Ci0KLVB5TU9ESU5JVF9GVU5DCi1pbml0ZmFzdGJpbmFyeSh2b2lkKSB7Ci0jZGVmaW5lIElOSVRfSU5URVJOX1NUUklORyh2YWx1ZSkgXAotICBkbyB7IFwKLSAgICBJTlRFUk5fU1RSSU5HKHZhbHVlKSA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoI3ZhbHVlKTsgXAotICAgIGlmKCFJTlRFUk5fU1RSSU5HKHZhbHVlKSkgcmV0dXJuOyBcCi0gIH0gd2hpbGUoMCkKLQotICBJTklUX0lOVEVSTl9TVFJJTkcoY3N0cmluZ2lvX2J1Zik7Ci0gIElOSVRfSU5URVJOX1NUUklORyhjc3RyaW5naW9fcmVmaWxsKTsKLSN1bmRlZiBJTklUX0lOVEVSTl9TVFJJTkcKLQotICBQeWNTdHJpbmdfSU1QT1JUOwotICBpZiAoUHljU3RyaW5nSU8gPT0gTlVMTCkgcmV0dXJuOwotCi0gICh2b2lkKSBQeV9Jbml0TW9kdWxlKCJ0aHJpZnQucHJvdG9jb2wuZmFzdGJpbmFyeSIsIFRocmlmdEZhc3RCaW5hcnlNZXRob2RzKTsKLX0KZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvc2VydmVyL1RIdHRwU2VydmVyLnB5IGIvbGliL3B5L3NyYy9zZXJ2ZXIvVEh0dHBTZXJ2ZXIucHkKaW5kZXggNmY5MjE3My4uODVjZjQwMCAxMDA2NDQKLS0tIGEvbGliL3B5L3NyYy9zZXJ2ZXIvVEh0dHBTZXJ2ZXIucHkKKysrIGIvbGliL3B5L3NyYy9zZXJ2ZXIvVEh0dHBTZXJ2ZXIucHkKQEAgLTE3LDcxICsxNyw5MCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotaW1wb3J0IEJhc2VIVFRQU2VydmVyCitpbXBvcnQgc3NsCisKK2Zyb20gc2l4Lm1vdmVzIGltcG9ydCBCYXNlSFRUUFNlcnZlcgogCiBmcm9tIHRocmlmdC5zZXJ2ZXIgaW1wb3J0IFRTZXJ2ZXIKIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAogCiAKIGNsYXNzIFJlc3BvbnNlRXhjZXB0aW9uKEV4Y2VwdGlvbik6Ci0gICIiIkFsbG93cyBoYW5kbGVycyB0byBvdmVycmlkZSB0aGUgSFRUUCByZXNwb25zZQorICAgICIiIkFsbG93cyBoYW5kbGVycyB0byBvdmVycmlkZSB0aGUgSFRUUCByZXNwb25zZQogCi0gIE5vcm1hbGx5LCBUSHR0cFNlcnZlciBhbHdheXMgc2VuZHMgYSAyMDAgcmVzcG9uc2UuICBJZiBhIGhhbmRsZXIgd2FudHMKLSAgdG8gb3ZlcnJpZGUgdGhpcyBiZWhhdmlvciAoZS5nLiwgdG8gc2ltdWxhdGUgYSBtaXNjb25maWd1cmVkIG9yCi0gIG92ZXJsb2FkZWQgd2ViIHNlcnZlciBkdXJpbmcgdGVzdGluZyksIGl0IGNhbiByYWlzZSBhIFJlc3BvbnNlRXhjZXB0aW9uLgotICBUaGUgZnVuY3Rpb24gcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3RvciB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZQotICBSZXF1ZXN0SGFuZGxlciBhcyBpdHMgb25seSBhcmd1bWVudC4KLSAgIiIiCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBoYW5kbGVyKToKLSAgICBzZWxmLmhhbmRsZXIgPSBoYW5kbGVyCisgICAgTm9ybWFsbHksIFRIdHRwU2VydmVyIGFsd2F5cyBzZW5kcyBhIDIwMCByZXNwb25zZS4gIElmIGEgaGFuZGxlciB3YW50cworICAgIHRvIG92ZXJyaWRlIHRoaXMgYmVoYXZpb3IgKGUuZy4sIHRvIHNpbXVsYXRlIGEgbWlzY29uZmlndXJlZCBvcgorICAgIG92ZXJsb2FkZWQgd2ViIHNlcnZlciBkdXJpbmcgdGVzdGluZyksIGl0IGNhbiByYWlzZSBhIFJlc3BvbnNlRXhjZXB0aW9uLgorICAgIFRoZSBmdW5jdGlvbiBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlCisgICAgUmVxdWVzdEhhbmRsZXIgYXMgaXRzIG9ubHkgYXJndW1lbnQuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGhhbmRsZXIpOgorICAgICAgICBzZWxmLmhhbmRsZXIgPSBoYW5kbGVyCiAKIAogY2xhc3MgVEh0dHBTZXJ2ZXIoVFNlcnZlci5UU2VydmVyKToKLSAgIiIiQSBzaW1wbGUgSFRUUC1iYXNlZCBUaHJpZnQgc2VydmVyCisgICAgIiIiQSBzaW1wbGUgSFRUUC1iYXNlZCBUaHJpZnQgc2VydmVyCiAKLSAgVGhpcyBjbGFzcyBpcyBub3QgdmVyeSBwZXJmb3JtYW50LCBidXQgaXQgaXMgdXNlZnVsIChmb3IgZXhhbXBsZSkgZm9yCi0gIGFjdGluZyBhcyBhIG1vY2sgdmVyc2lvbiBvZiBhbiBBcGFjaGUtYmFzZWQgUEhQIFRocmlmdCBlbmRwb2ludC4KLSAgIiIiCi0gIGRlZiBfX2luaXRfXyhzZWxmLAotICAgICAgICAgICAgICAgcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgc2VydmVyX2FkZHJlc3MsCi0gICAgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeT1Ob25lLAotICAgICAgICAgICAgICAgc2VydmVyX2NsYXNzPUJhc2VIVFRQU2VydmVyLkhUVFBTZXJ2ZXIpOgotICAgICIiIlNldCB1cCBwcm90b2NvbCBmYWN0b3JpZXMgYW5kIEhUVFAgc2VydmVyLgotCi0gICAgU2VlIEJhc2VIVFRQU2VydmVyIGZvciBzZXJ2ZXJfYWRkcmVzcy4KLSAgICBTZWUgVFNlcnZlciBmb3IgcHJvdG9jb2wgZmFjdG9yaWVzLgorICAgIFRoaXMgY2xhc3MgaXMgbm90IHZlcnkgcGVyZm9ybWFudCwgYnV0IGl0IGlzIHVzZWZ1bCAoZm9yIGV4YW1wbGUpIGZvcgorICAgIGFjdGluZyBhcyBhIG1vY2sgdmVyc2lvbiBvZiBhbiBBcGFjaGUtYmFzZWQgUEhQIFRocmlmdCBlbmRwb2ludC4KICAgICAiIiIKLSAgICBpZiBvdXRwdXRQcm90b2NvbEZhY3RvcnkgaXMgTm9uZToKLSAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeSA9IGlucHV0UHJvdG9jb2xGYWN0b3J5CisgICAgZGVmIF9faW5pdF9fKHNlbGYsCisgICAgICAgICAgICAgICAgIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgc2VydmVyX2FkZHJlc3MsCisgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbEZhY3Rvcnk9Tm9uZSwKKyAgICAgICAgICAgICAgICAgc2VydmVyX2NsYXNzPUJhc2VIVFRQU2VydmVyLkhUVFBTZXJ2ZXIsCisgICAgICAgICAgICAgICAgICoqa3dhcmdzKToKKyAgICAgICAgIiIiU2V0IHVwIHByb3RvY29sIGZhY3RvcmllcyBhbmQgSFRUUCAob3IgSFRUUFMpIHNlcnZlci4KIAotICAgIFRTZXJ2ZXIuVFNlcnZlci5fX2luaXRfXyhzZWxmLCBwcm9jZXNzb3IsIE5vbmUsIE5vbmUsIE5vbmUsCi0gICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnkpCisgICAgICAgIFNlZSBCYXNlSFRUUFNlcnZlciBmb3Igc2VydmVyX2FkZHJlc3MuCisgICAgICAgIFNlZSBUU2VydmVyIGZvciBwcm90b2NvbCBmYWN0b3JpZXMuCiAKLSAgICB0aHR0cHNlcnZlciA9IHNlbGYKKyAgICAgICAgVG8gbWFrZSBhIHNlY3VyZSBzZXJ2ZXIsIHByb3ZpZGUgdGhlIG5hbWVkIGFyZ3VtZW50czoKKyAgICAgICAgKiBjYWZpbGUgICAgLSB0byB2YWxpZGF0ZSBjbGllbnRzIFtvcHRpb25hbF0KKyAgICAgICAgKiBjZXJ0X2ZpbGUgLSB0aGUgc2VydmVyIGNlcnQKKyAgICAgICAgKiBrZXlfZmlsZSAgLSB0aGUgc2VydmVyJ3Mga2V5CisgICAgICAgICIiIgorICAgICAgICBpZiBvdXRwdXRQcm90b2NvbEZhY3RvcnkgaXMgTm9uZToKKyAgICAgICAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeSA9IGlucHV0UHJvdG9jb2xGYWN0b3J5CiAKLSAgICBjbGFzcyBSZXF1ZXN0SGFuZGVyKEJhc2VIVFRQU2VydmVyLkJhc2VIVFRQUmVxdWVzdEhhbmRsZXIpOgotICAgICAgZGVmIGRvX1BPU1Qoc2VsZik6Ci0gICAgICAgICMgRG9uJ3QgY2FyZSBhYm91dCB0aGUgcmVxdWVzdCBwYXRoLgotICAgICAgICBpdHJhbnMgPSBUVHJhbnNwb3J0LlRGaWxlT2JqZWN0VHJhbnNwb3J0KHNlbGYucmZpbGUpCi0gICAgICAgIG90cmFucyA9IFRUcmFuc3BvcnQuVEZpbGVPYmplY3RUcmFuc3BvcnQoc2VsZi53ZmlsZSkKLSAgICAgICAgaXRyYW5zID0gVFRyYW5zcG9ydC5UQnVmZmVyZWRUcmFuc3BvcnQoCi0gICAgICAgICAgaXRyYW5zLCBpbnQoc2VsZi5oZWFkZXJzWydDb250ZW50LUxlbmd0aCddKSkKLSAgICAgICAgb3RyYW5zID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkKLSAgICAgICAgaXByb3QgPSB0aHR0cHNlcnZlci5pbnB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChpdHJhbnMpCi0gICAgICAgIG9wcm90ID0gdGh0dHBzZXJ2ZXIub3V0cHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKG90cmFucykKLSAgICAgICAgdHJ5OgotICAgICAgICAgIHRodHRwc2VydmVyLnByb2Nlc3Nvci5wcm9jZXNzKGlwcm90LCBvcHJvdCkKLSAgICAgICAgZXhjZXB0IFJlc3BvbnNlRXhjZXB0aW9uIGFzIGV4bjoKLSAgICAgICAgICBleG4uaGFuZGxlcihzZWxmKQotICAgICAgICBlbHNlOgotICAgICAgICAgIHNlbGYuc2VuZF9yZXNwb25zZSgyMDApCi0gICAgICAgICAgc2VsZi5zZW5kX2hlYWRlcigiY29udGVudC10eXBlIiwgImFwcGxpY2F0aW9uL3gtdGhyaWZ0IikKLSAgICAgICAgICBzZWxmLmVuZF9oZWFkZXJzKCkKLSAgICAgICAgICBzZWxmLndmaWxlLndyaXRlKG90cmFucy5nZXR2YWx1ZSgpKQorICAgICAgICBUU2VydmVyLlRTZXJ2ZXIuX19pbml0X18oc2VsZiwgcHJvY2Vzc29yLCBOb25lLCBOb25lLCBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSkKIAotICAgIHNlbGYuaHR0cGQgPSBzZXJ2ZXJfY2xhc3Moc2VydmVyX2FkZHJlc3MsIFJlcXVlc3RIYW5kZXIpCisgICAgICAgIHRodHRwc2VydmVyID0gc2VsZgogCi0gIGRlZiBzZXJ2ZShzZWxmKToKLSAgICBzZWxmLmh0dHBkLnNlcnZlX2ZvcmV2ZXIoKQorICAgICAgICBjbGFzcyBSZXF1ZXN0SGFuZGVyKEJhc2VIVFRQU2VydmVyLkJhc2VIVFRQUmVxdWVzdEhhbmRsZXIpOgorICAgICAgICAgICAgZGVmIGRvX1BPU1Qoc2VsZik6CisgICAgICAgICAgICAgICAgIyBEb24ndCBjYXJlIGFib3V0IHRoZSByZXF1ZXN0IHBhdGguCisgICAgICAgICAgICAgICAgaXRyYW5zID0gVFRyYW5zcG9ydC5URmlsZU9iamVjdFRyYW5zcG9ydChzZWxmLnJmaWxlKQorICAgICAgICAgICAgICAgIG90cmFucyA9IFRUcmFuc3BvcnQuVEZpbGVPYmplY3RUcmFuc3BvcnQoc2VsZi53ZmlsZSkKKyAgICAgICAgICAgICAgICBpdHJhbnMgPSBUVHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydCgKKyAgICAgICAgICAgICAgICAgICAgaXRyYW5zLCBpbnQoc2VsZi5oZWFkZXJzWydDb250ZW50LUxlbmd0aCddKSkKKyAgICAgICAgICAgICAgICBvdHJhbnMgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQorICAgICAgICAgICAgICAgIGlwcm90ID0gdGh0dHBzZXJ2ZXIuaW5wdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2woaXRyYW5zKQorICAgICAgICAgICAgICAgIG9wcm90ID0gdGh0dHBzZXJ2ZXIub3V0cHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKG90cmFucykKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHRodHRwc2VydmVyLnByb2Nlc3Nvci5wcm9jZXNzKGlwcm90LCBvcHJvdCkKKyAgICAgICAgICAgICAgICBleGNlcHQgUmVzcG9uc2VFeGNlcHRpb24gYXMgZXhuOgorICAgICAgICAgICAgICAgICAgICBleG4uaGFuZGxlcihzZWxmKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VuZF9yZXNwb25zZSgyMDApCisgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoImNvbnRlbnQtdHlwZSIsICJhcHBsaWNhdGlvbi94LXRocmlmdCIpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZW5kX2hlYWRlcnMoKQorICAgICAgICAgICAgICAgICAgICBzZWxmLndmaWxlLndyaXRlKG90cmFucy5nZXR2YWx1ZSgpKQorCisgICAgICAgIHNlbGYuaHR0cGQgPSBzZXJ2ZXJfY2xhc3Moc2VydmVyX2FkZHJlc3MsIFJlcXVlc3RIYW5kZXIpCisKKyAgICAgICAgaWYgKGt3YXJncy5nZXQoJ2NhZmlsZScpIG9yIGt3YXJncy5nZXQoJ2NlcnRfZmlsZScpIG9yIGt3YXJncy5nZXQoJ2tleV9maWxlJykpOgorICAgICAgICAgICAgY29udGV4dCA9IHNzbC5jcmVhdGVfZGVmYXVsdF9jb250ZXh0KGNhZmlsZT1rd2FyZ3MuZ2V0KCdjYWZpbGUnKSkKKyAgICAgICAgICAgIGNvbnRleHQuY2hlY2tfaG9zdG5hbWUgPSBGYWxzZQorICAgICAgICAgICAgY29udGV4dC5sb2FkX2NlcnRfY2hhaW4oa3dhcmdzLmdldCgnY2VydF9maWxlJyksIGt3YXJncy5nZXQoJ2tleV9maWxlJykpCisgICAgICAgICAgICBjb250ZXh0LnZlcmlmeV9tb2RlID0gc3NsLkNFUlRfUkVRVUlSRUQgaWYga3dhcmdzLmdldCgnY2FmaWxlJykgZWxzZSBzc2wuQ0VSVF9OT05FCisgICAgICAgICAgICBzZWxmLmh0dHBkLnNvY2tldCA9IGNvbnRleHQud3JhcF9zb2NrZXQoc2VsZi5odHRwZC5zb2NrZXQsIHNlcnZlcl9zaWRlPVRydWUpCisKKyAgICBkZWYgc2VydmUoc2VsZik6CisgICAgICAgIHNlbGYuaHR0cGQuc2VydmVfZm9yZXZlcigpCisKKyAgICBkZWYgc2h1dGRvd24oc2VsZik6CisgICAgICAgIHNlbGYuaHR0cGQuc29ja2V0LmNsb3NlKCkKKyAgICAgICAgIyBzZWxmLmh0dHBkLnNodXRkb3duKCkgIyBoYW5ncyBmb3JldmVyLCBweXRob24gZG9lc24ndCBoYW5kbGUgUE9MTE5WQUwgcHJvcGVybHkhCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIucHkgYi9saWIvcHkvc3JjL3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIucHkKaW5kZXggMzk0ODZjZC4uZjYyZDQ4NiAxMDA2NDQKLS0tIGEvbGliL3B5L3NyYy9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLnB5CisrKyBiL2xpYi9weS9zcmMvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5weQpAQCAtMjQsMjAgKzI0LDIzIEBACiBUaGUgdGhyZWFkIHBvb29sIHNob3VsZCBiZSBzaXplZCBmb3IgY29uY3VycmVudCB0YXNrcywgbm90CiBtYXhpbXVtIGNvbm5lY3Rpb25zCiAiIiIKLWltcG9ydCB0aHJlYWRpbmcKLWltcG9ydCBzb2NrZXQKLWltcG9ydCBRdWV1ZQotaW1wb3J0IHNlbGVjdAotaW1wb3J0IHN0cnVjdAogCiBpbXBvcnQgbG9nZ2luZwotbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCitpbXBvcnQgc2VsZWN0CitpbXBvcnQgc29ja2V0CitpbXBvcnQgc3RydWN0CitpbXBvcnQgdGhyZWFkaW5nCisKK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlcXVlCitmcm9tIHNpeC5tb3ZlcyBpbXBvcnQgcXVldWUKIAogZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0CiBmcm9tIHRocmlmdC5wcm90b2NvbC5UQmluYXJ5UHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkKIAogX19hbGxfXyA9IFsnVE5vbmJsb2NraW5nU2VydmVyJ10KIAorbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCisKIAogY2xhc3MgV29ya2VyKHRocmVhZGluZy5UaHJlYWQpOgogICAgICIiIldvcmtlciBpcyBhIHNtYWxsIGhlbHBlciB0byBwcm9jZXNzIGluY29taW5nIGNvbm5lY3Rpb24uIiIiCkBAIC01Niw4ICs1OSw5IEBACiAgICAgICAgICAgICAgICAgcHJvY2Vzc29yLnByb2Nlc3MoaXByb3QsIG9wcm90KQogICAgICAgICAgICAgICAgIGNhbGxiYWNrKFRydWUsIG90cmFucy5nZXR2YWx1ZSgpKQogICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKLSAgICAgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKCJFeGNlcHRpb24gd2hpbGUgcHJvY2Vzc2luZyByZXF1ZXN0IikKLSAgICAgICAgICAgICAgICBjYWxsYmFjayhGYWxzZSwgJycpCisgICAgICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbigiRXhjZXB0aW9uIHdoaWxlIHByb2Nlc3NpbmcgcmVxdWVzdCIsIGV4Y19pbmZvPVRydWUpCisgICAgICAgICAgICAgICAgY2FsbGJhY2soRmFsc2UsIGInJykKKwogCiBXQUlUX0xFTiA9IDAKIFdBSVRfTUVTU0FHRSA9IDEKQEAgLTgzLDExICs4NywyNCBAQAogICAgICAgICB0cnk6CiAgICAgICAgICAgICByZXR1cm4gZnVuYyhzZWxmLCAqYXJncywgKiprd2FyZ3MpCiAgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3I6CisgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ2lnbm9yaW5nIHNvY2tldCBleGNlcHRpb24nLCBleGNfaW5mbz1UcnVlKQogICAgICAgICAgICAgc2VsZi5jbG9zZSgpCiAgICAgcmV0dXJuIHJlYWQKIAogCi1jbGFzcyBDb25uZWN0aW9uOgorY2xhc3MgTWVzc2FnZShvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvZmZzZXQsIGxlbl8sIGhlYWRlcik6CisgICAgICAgIHNlbGYub2Zmc2V0ID0gb2Zmc2V0CisgICAgICAgIHNlbGYubGVuID0gbGVuXworICAgICAgICBzZWxmLmJ1ZmZlciA9IE5vbmUKKyAgICAgICAgc2VsZi5pc19oZWFkZXIgPSBoZWFkZXIKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBlbmQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLm9mZnNldCArIHNlbGYubGVuCisKKworY2xhc3MgQ29ubmVjdGlvbihvYmplY3QpOgogICAgICIiIkJhc2ljIGNsYXNzIGlzIHJlcHJlc2VudGVkIGNvbm5lY3Rpb24uCiAKICAgICBJdCBjYW4gYmUgaW4gc3RhdGU6CkBAIC0xMDQsNjggKzEyMSw2MCBAQAogICAgICAgICBzZWxmLnNvY2tldC5zZXRibG9ja2luZyhGYWxzZSkKICAgICAgICAgc2VsZi5zdGF0dXMgPSBXQUlUX0xFTgogICAgICAgICBzZWxmLmxlbiA9IDAKLSAgICAgICAgc2VsZi5tZXNzYWdlID0gJycKKyAgICAgICAgc2VsZi5yZWNlaXZlZCA9IGRlcXVlKCkKKyAgICAgICAgc2VsZi5fcmVhZGluZyA9IE1lc3NhZ2UoMCwgNCwgVHJ1ZSkKKyAgICAgICAgc2VsZi5fcmJ1ZiA9IGInJworICAgICAgICBzZWxmLl93YnVmID0gYicnCiAgICAgICAgIHNlbGYubG9jayA9IHRocmVhZGluZy5Mb2NrKCkKICAgICAgICAgc2VsZi53YWtlX3VwID0gd2FrZV91cAotCi0gICAgZGVmIF9yZWFkX2xlbihzZWxmKToKLSAgICAgICAgIiIiUmVhZHMgbGVuZ3RoIG9mIHJlcXVlc3QuCi0KLSAgICAgICAgSXQncyBhIHNhZmVyIGFsdGVybmF0aXZlIHRvIHNlbGYuc29ja2V0LnJlY3YoNCkKLSAgICAgICAgIiIiCi0gICAgICAgIHJlYWQgPSBzZWxmLnNvY2tldC5yZWN2KDQgLSBsZW4oc2VsZi5tZXNzYWdlKSkKLSAgICAgICAgaWYgbGVuKHJlYWQpID09IDA6Ci0gICAgICAgICAgICAjIGlmIHdlIHJlYWQgMCBieXRlcyBhbmQgc2VsZi5tZXNzYWdlIGlzIGVtcHR5LCB0aGVuCi0gICAgICAgICAgICAjIHRoZSBjbGllbnQgY2xvc2VkIHRoZSBjb25uZWN0aW9uCi0gICAgICAgICAgICBpZiBsZW4oc2VsZi5tZXNzYWdlKSAhPSAwOgotICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiY2FuJ3QgcmVhZCBmcmFtZSBzaXplIGZyb20gc29ja2V0IikKLSAgICAgICAgICAgIHNlbGYuY2xvc2UoKQotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIHNlbGYubWVzc2FnZSArPSByZWFkCi0gICAgICAgIGlmIGxlbihzZWxmLm1lc3NhZ2UpID09IDQ6Ci0gICAgICAgICAgICBzZWxmLmxlbiwgPSBzdHJ1Y3QudW5wYWNrKCchaScsIHNlbGYubWVzc2FnZSkKLSAgICAgICAgICAgIGlmIHNlbGYubGVuIDwgMDoKLSAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIm5lZ2F0aXZlIGZyYW1lIHNpemUsIGl0IHNlZW1zIGNsaWVudCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZG9lc24ndCB1c2UgRnJhbWVkVHJhbnNwb3J0IikKLSAgICAgICAgICAgICAgICBzZWxmLmNsb3NlKCkKLSAgICAgICAgICAgIGVsaWYgc2VsZi5sZW4gPT0gMDoKLSAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoImVtcHR5IGZyYW1lLCBpdCdzIHJlYWxseSBzdHJhbmdlIikKLSAgICAgICAgICAgICAgICBzZWxmLmNsb3NlKCkKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgc2VsZi5tZXNzYWdlID0gJycKLSAgICAgICAgICAgICAgICBzZWxmLnN0YXR1cyA9IFdBSVRfTUVTU0FHRQorICAgICAgICBzZWxmLnJlbWFpbmluZyA9IEZhbHNlCiAKICAgICBAc29ja2V0X2V4Y2VwdGlvbgogICAgIGRlZiByZWFkKHNlbGYpOgogICAgICAgICAiIiJSZWFkcyBkYXRhIGZyb20gc3RyZWFtIGFuZCBzd2l0Y2ggc3RhdGUuIiIiCiAgICAgICAgIGFzc2VydCBzZWxmLnN0YXR1cyBpbiAoV0FJVF9MRU4sIFdBSVRfTUVTU0FHRSkKLSAgICAgICAgaWYgc2VsZi5zdGF0dXMgPT0gV0FJVF9MRU46Ci0gICAgICAgICAgICBzZWxmLl9yZWFkX2xlbigpCi0gICAgICAgICAgICAjIGdvIGJhY2sgdG8gdGhlIG1haW4gbG9vcCBoZXJlIGZvciBzaW1wbGljaXR5IGluc3RlYWQgb2YKLSAgICAgICAgICAgICMgZmFsbGluZyB0aHJvdWdoLCBldmVuIHRob3VnaCB0aGVyZSBpcyBhIGdvb2QgY2hhbmNlIHRoYXQKLSAgICAgICAgICAgICMgdGhlIG1lc3NhZ2UgaXMgYWxyZWFkeSBhdmFpbGFibGUKLSAgICAgICAgZWxpZiBzZWxmLnN0YXR1cyA9PSBXQUlUX01FU1NBR0U6Ci0gICAgICAgICAgICByZWFkID0gc2VsZi5zb2NrZXQucmVjdihzZWxmLmxlbiAtIGxlbihzZWxmLm1lc3NhZ2UpKQotICAgICAgICAgICAgaWYgbGVuKHJlYWQpID09IDA6Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJjYW4ndCByZWFkIGZyYW1lIGZyb20gc29ja2V0IChnZXQgJWQgb2YgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVkIGJ5dGVzKSIgJSAobGVuKHNlbGYubWVzc2FnZSksIHNlbGYubGVuKSkKKyAgICAgICAgYXNzZXJ0IG5vdCBzZWxmLnJlY2VpdmVkCisgICAgICAgIGJ1Zl9zaXplID0gODE5MgorICAgICAgICBmaXJzdCA9IFRydWUKKyAgICAgICAgZG9uZSA9IEZhbHNlCisgICAgICAgIHdoaWxlIG5vdCBkb25lOgorICAgICAgICAgICAgcmVhZCA9IHNlbGYuc29ja2V0LnJlY3YoYnVmX3NpemUpCisgICAgICAgICAgICBybGVuID0gbGVuKHJlYWQpCisgICAgICAgICAgICBkb25lID0gcmxlbiA8IGJ1Zl9zaXplCisgICAgICAgICAgICBzZWxmLl9yYnVmICs9IHJlYWQKKyAgICAgICAgICAgIGlmIGZpcnN0IGFuZCBybGVuID09IDA6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5zdGF0dXMgIT0gV0FJVF9MRU4gb3Igc2VsZi5fcmJ1ZjoKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdjb3VsZCBub3QgcmVhZCBmcmFtZSBmcm9tIHNvY2tldCcpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdyZWFkIHplcm8gbGVuZ3RoLiBjbGllbnQgbWlnaHQgaGF2ZSBkaXNjb25uZWN0ZWQnKQogICAgICAgICAgICAgICAgIHNlbGYuY2xvc2UoKQotICAgICAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgc2VsZi5tZXNzYWdlICs9IHJlYWQKLSAgICAgICAgICAgIGlmIGxlbihzZWxmLm1lc3NhZ2UpID09IHNlbGYubGVuOgorICAgICAgICAgICAgd2hpbGUgbGVuKHNlbGYuX3JidWYpID49IHNlbGYuX3JlYWRpbmcuZW5kOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuX3JlYWRpbmcuaXNfaGVhZGVyOgorICAgICAgICAgICAgICAgICAgICBtbGVuLCA9IHN0cnVjdC51bnBhY2soJyFpJywgc2VsZi5fcmJ1Zls6NF0pCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX3JlYWRpbmcgPSBNZXNzYWdlKHNlbGYuX3JlYWRpbmcuZW5kLCBtbGVuLCBGYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0dXMgPSBXQUlUX01FU1NBR0UKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9yZWFkaW5nLmJ1ZmZlciA9IHNlbGYuX3JidWYKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWNlaXZlZC5hcHBlbmQoc2VsZi5fcmVhZGluZykKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fcmJ1ZiA9IHNlbGYuX3JidWZbc2VsZi5fcmVhZGluZy5lbmQ6XQorICAgICAgICAgICAgICAgICAgICBzZWxmLl9yZWFkaW5nID0gTWVzc2FnZSgwLCA0LCBUcnVlKQorICAgICAgICAgICAgZmlyc3QgPSBGYWxzZQorICAgICAgICAgICAgaWYgc2VsZi5yZWNlaXZlZDoKICAgICAgICAgICAgICAgICBzZWxmLnN0YXR1cyA9IFdBSVRfUFJPQ0VTUworICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHNlbGYucmVtYWluaW5nID0gbm90IGRvbmUKIAogICAgIEBzb2NrZXRfZXhjZXB0aW9uCiAgICAgZGVmIHdyaXRlKHNlbGYpOgogICAgICAgICAiIiJXcml0ZXMgZGF0YSBmcm9tIHNvY2tldCBhbmQgc3dpdGNoIHN0YXRlLiIiIgogICAgICAgICBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gU0VORF9BTlNXRVIKLSAgICAgICAgc2VudCA9IHNlbGYuc29ja2V0LnNlbmQoc2VsZi5tZXNzYWdlKQotICAgICAgICBpZiBzZW50ID09IGxlbihzZWxmLm1lc3NhZ2UpOgorICAgICAgICBzZW50ID0gc2VsZi5zb2NrZXQuc2VuZChzZWxmLl93YnVmKQorICAgICAgICBpZiBzZW50ID09IGxlbihzZWxmLl93YnVmKToKICAgICAgICAgICAgIHNlbGYuc3RhdHVzID0gV0FJVF9MRU4KLSAgICAgICAgICAgIHNlbGYubWVzc2FnZSA9ICcnCisgICAgICAgICAgICBzZWxmLl93YnVmID0gYicnCiAgICAgICAgICAgICBzZWxmLmxlbiA9IDAKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYubWVzc2FnZSA9IHNlbGYubWVzc2FnZVtzZW50Ol0KKyAgICAgICAgICAgIHNlbGYuX3didWYgPSBzZWxmLl93YnVmW3NlbnQ6XQogCiAgICAgQGxvY2tlZAogICAgIGRlZiByZWFkeShzZWxmLCBhbGxfb2ssIG1lc3NhZ2UpOgpAQCAtMTg1LDEzICsxOTQsMTMgQEAKICAgICAgICAgICAgIHNlbGYuY2xvc2UoKQogICAgICAgICAgICAgc2VsZi53YWtlX3VwKCkKICAgICAgICAgICAgIHJldHVybgotICAgICAgICBzZWxmLmxlbiA9ICcnCisgICAgICAgIHNlbGYubGVuID0gMAogICAgICAgICBpZiBsZW4obWVzc2FnZSkgPT0gMDoKICAgICAgICAgICAgICMgaXQgd2FzIGEgb25ld2F5IHJlcXVlc3QsIGRvIG5vdCB3cml0ZSBhbnN3ZXIKLSAgICAgICAgICAgIHNlbGYubWVzc2FnZSA9ICcnCisgICAgICAgICAgICBzZWxmLl93YnVmID0gYicnCiAgICAgICAgICAgICBzZWxmLnN0YXR1cyA9IFdBSVRfTEVOCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLm1lc3NhZ2UgPSBzdHJ1Y3QucGFjaygnIWknLCBsZW4obWVzc2FnZSkpICsgbWVzc2FnZQorICAgICAgICAgICAgc2VsZi5fd2J1ZiA9IHN0cnVjdC5wYWNrKCchaScsIGxlbihtZXNzYWdlKSkgKyBtZXNzYWdlCiAgICAgICAgICAgICBzZWxmLnN0YXR1cyA9IFNFTkRfQU5TV0VSCiAgICAgICAgIHNlbGYud2FrZV91cCgpCiAKQEAgLTIyMSw3ICsyMzAsNyBAQAogICAgICAgICBzZWxmLnNvY2tldC5jbG9zZSgpCiAKIAotY2xhc3MgVE5vbmJsb2NraW5nU2VydmVyOgorY2xhc3MgVE5vbmJsb2NraW5nU2VydmVyKG9iamVjdCk6CiAgICAgIiIiTm9uLWJsb2NraW5nIHNlcnZlci4iIiIKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLApAQCAtMjM2LDcgKzI0NSw3IEBACiAgICAgICAgIHNlbGYub3V0X3Byb3RvY29sID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5IG9yIHNlbGYuaW5fcHJvdG9jb2wKICAgICAgICAgc2VsZi50aHJlYWRzID0gaW50KHRocmVhZHMpCiAgICAgICAgIHNlbGYuY2xpZW50cyA9IHt9Ci0gICAgICAgIHNlbGYudGFza3MgPSBRdWV1ZS5RdWV1ZSgpCisgICAgICAgIHNlbGYudGFza3MgPSBxdWV1ZS5RdWV1ZSgpCiAgICAgICAgIHNlbGYuX3JlYWQsIHNlbGYuX3dyaXRlID0gc29ja2V0LnNvY2tldHBhaXIoKQogICAgICAgICBzZWxmLnByZXBhcmVkID0gRmFsc2UKICAgICAgICAgc2VsZi5fc3RvcCA9IEZhbHNlCkBAIC0yNTIsNyArMjYxLDcgQEAKICAgICAgICAgaWYgc2VsZi5wcmVwYXJlZDoKICAgICAgICAgICAgIHJldHVybgogICAgICAgICBzZWxmLnNvY2tldC5saXN0ZW4oKQotICAgICAgICBmb3IgXyBpbiB4cmFuZ2Uoc2VsZi50aHJlYWRzKToKKyAgICAgICAgZm9yIF8gaW4gcmFuZ2Uoc2VsZi50aHJlYWRzKToKICAgICAgICAgICAgIHRocmVhZCA9IFdvcmtlcihzZWxmLnRhc2tzKQogICAgICAgICAgICAgdGhyZWFkLnNldERhZW1vbihUcnVlKQogICAgICAgICAgICAgdGhyZWFkLnN0YXJ0KCkKQEAgLTI2OSw3ICsyNzgsNyBAQAogICAgICAgICBJbiB0aGlzIGNhc2UsIHdlIGNhbiBqdXN0IHdyaXRlIGFueXRoaW5nIHRvIHRoZSBzZWNvbmQgc29ja2V0IGZyb20KICAgICAgICAgc29ja2V0cGFpci4KICAgICAgICAgIiIiCi0gICAgICAgIHNlbGYuX3dyaXRlLnNlbmQoJzEnKQorICAgICAgICBzZWxmLl93cml0ZS5zZW5kKGInMScpCiAKICAgICBkZWYgc3RvcChzZWxmKToKICAgICAgICAgIiIiU3RvcCB0aGUgc2VydmVyLgpAQCAtMjkwLDE0ICsyOTksMjAgQEAKICAgICAgICAgIiIiRG9lcyBzZWxlY3Qgb24gb3BlbiBjb25uZWN0aW9ucy4iIiIKICAgICAgICAgcmVhZGFibGUgPSBbc2VsZi5zb2NrZXQuaGFuZGxlLmZpbGVubygpLCBzZWxmLl9yZWFkLmZpbGVubygpXQogICAgICAgICB3cml0YWJsZSA9IFtdCi0gICAgICAgIGZvciBpLCBjb25uZWN0aW9uIGluIHNlbGYuY2xpZW50cy5pdGVtcygpOgorICAgICAgICByZW1haW5pbmcgPSBbXQorICAgICAgICBmb3IgaSwgY29ubmVjdGlvbiBpbiBsaXN0KHNlbGYuY2xpZW50cy5pdGVtcygpKToKICAgICAgICAgICAgIGlmIGNvbm5lY3Rpb24uaXNfcmVhZGFibGUoKToKICAgICAgICAgICAgICAgICByZWFkYWJsZS5hcHBlbmQoY29ubmVjdGlvbi5maWxlbm8oKSkKKyAgICAgICAgICAgICAgICBpZiBjb25uZWN0aW9uLnJlbWFpbmluZyBvciBjb25uZWN0aW9uLnJlY2VpdmVkOgorICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcuYXBwZW5kKGNvbm5lY3Rpb24uZmlsZW5vKCkpCiAgICAgICAgICAgICBpZiBjb25uZWN0aW9uLmlzX3dyaXRlYWJsZSgpOgogICAgICAgICAgICAgICAgIHdyaXRhYmxlLmFwcGVuZChjb25uZWN0aW9uLmZpbGVubygpKQogICAgICAgICAgICAgaWYgY29ubmVjdGlvbi5pc19jbG9zZWQoKToKICAgICAgICAgICAgICAgICBkZWwgc2VsZi5jbGllbnRzW2ldCi0gICAgICAgIHJldHVybiBzZWxlY3Quc2VsZWN0KHJlYWRhYmxlLCB3cml0YWJsZSwgcmVhZGFibGUpCisgICAgICAgIGlmIHJlbWFpbmluZzoKKyAgICAgICAgICAgIHJldHVybiByZW1haW5pbmcsIFtdLCBbXSwgRmFsc2UKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxlY3Quc2VsZWN0KHJlYWRhYmxlLCB3cml0YWJsZSwgcmVhZGFibGUpICsgKFRydWUsKQogCiAgICAgZGVmIGhhbmRsZShzZWxmKToKICAgICAgICAgIiIiSGFuZGxlIHJlcXVlc3RzLgpAQCAtMzA1LDIwICszMjAsMjcgQEAKICAgICAgICAgV0FSTklORyEgWW91IG11c3QgY2FsbCBwcmVwYXJlKCkgQkVGT1JFIGNhbGxpbmcgaGFuZGxlKCkKICAgICAgICAgIiIiCiAgICAgICAgIGFzc2VydCBzZWxmLnByZXBhcmVkLCAiWW91IGhhdmUgdG8gY2FsbCBwcmVwYXJlIGJlZm9yZSBoYW5kbGUiCi0gICAgICAgIHJzZXQsIHdzZXQsIHhzZXQgPSBzZWxmLl9zZWxlY3QoKQorICAgICAgICByc2V0LCB3c2V0LCB4c2V0LCBzZWxlY3RlZCA9IHNlbGYuX3NlbGVjdCgpCiAgICAgICAgIGZvciByZWFkYWJsZSBpbiByc2V0OgogICAgICAgICAgICAgaWYgcmVhZGFibGUgPT0gc2VsZi5fcmVhZC5maWxlbm8oKToKICAgICAgICAgICAgICAgICAjIGRvbid0IGNhcmUgaSBqdXN0IG5lZWQgdG8gY2xlYW4gcmVhZGFibGUgZmxhZwogICAgICAgICAgICAgICAgIHNlbGYuX3JlYWQucmVjdigxMDI0KQogICAgICAgICAgICAgZWxpZiByZWFkYWJsZSA9PSBzZWxmLnNvY2tldC5oYW5kbGUuZmlsZW5vKCk6Ci0gICAgICAgICAgICAgICAgY2xpZW50ID0gc2VsZi5zb2NrZXQuYWNjZXB0KCkuaGFuZGxlCi0gICAgICAgICAgICAgICAgc2VsZi5jbGllbnRzW2NsaWVudC5maWxlbm8oKV0gPSBDb25uZWN0aW9uKGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53YWtlX3VwKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50ID0gc2VsZi5zb2NrZXQuYWNjZXB0KCkKKyAgICAgICAgICAgICAgICAgICAgaWYgY2xpZW50OgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jbGllbnRzW2NsaWVudC5oYW5kbGUuZmlsZW5vKCldID0gQ29ubmVjdGlvbihjbGllbnQuaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndha2VfdXApCisgICAgICAgICAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdlcnJvciB3aGlsZSBhY2NlcHRpbmcnLCBleGNfaW5mbz1UcnVlKQogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBjb25uZWN0aW9uID0gc2VsZi5jbGllbnRzW3JlYWRhYmxlXQotICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24ucmVhZCgpCi0gICAgICAgICAgICAgICAgaWYgY29ubmVjdGlvbi5zdGF0dXMgPT0gV0FJVF9QUk9DRVNTOgotICAgICAgICAgICAgICAgICAgICBpdHJhbnNwb3J0ID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKGNvbm5lY3Rpb24ubWVzc2FnZSkKKyAgICAgICAgICAgICAgICBpZiBzZWxlY3RlZDoKKyAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5yZWFkKCkKKyAgICAgICAgICAgICAgICBpZiBjb25uZWN0aW9uLnJlY2VpdmVkOgorICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnN0YXR1cyA9IFdBSVRfUFJPQ0VTUworICAgICAgICAgICAgICAgICAgICBtc2cgPSBjb25uZWN0aW9uLnJlY2VpdmVkLnBvcGxlZnQoKQorICAgICAgICAgICAgICAgICAgICBpdHJhbnNwb3J0ID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKG1zZy5idWZmZXIsIG1zZy5vZmZzZXQpCiAgICAgICAgICAgICAgICAgICAgIG90cmFuc3BvcnQgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQogICAgICAgICAgICAgICAgICAgICBpcHJvdCA9IHNlbGYuaW5fcHJvdG9jb2wuZ2V0UHJvdG9jb2woaXRyYW5zcG9ydCkKICAgICAgICAgICAgICAgICAgICAgb3Byb3QgPSBzZWxmLm91dF9wcm90b2NvbC5nZXRQcm90b2NvbChvdHJhbnNwb3J0KQpAQCAtMzMyLDcgKzM1NCw3IEBACiAKICAgICBkZWYgY2xvc2Uoc2VsZik6CiAgICAgICAgICIiIkNsb3NlcyB0aGUgc2VydmVyLiIiIgotICAgICAgICBmb3IgXyBpbiB4cmFuZ2Uoc2VsZi50aHJlYWRzKToKKyAgICAgICAgZm9yIF8gaW4gcmFuZ2Uoc2VsZi50aHJlYWRzKToKICAgICAgICAgICAgIHNlbGYudGFza3MucHV0KFtOb25lLCBOb25lLCBOb25lLCBOb25lLCBOb25lXSkKICAgICAgICAgc2VsZi5zb2NrZXQuY2xvc2UoKQogICAgICAgICBzZWxmLnByZXBhcmVkID0gRmFsc2UKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvc2VydmVyL1RQcm9jZXNzUG9vbFNlcnZlci5weSBiL2xpYi9weS9zcmMvc2VydmVyL1RQcm9jZXNzUG9vbFNlcnZlci5weQppbmRleCBhZTdmZTFjLi5mZTZkYzgxIDEwMDY0NAotLS0gYS9saWIvcHkvc3JjL3NlcnZlci9UUHJvY2Vzc1Bvb2xTZXJ2ZXIucHkKKysrIGIvbGliL3B5L3NyYy9zZXJ2ZXIvVFByb2Nlc3NQb29sU2VydmVyLnB5CkBAIC0xOSwxMyArMTksMTQgQEAKIAogCiBpbXBvcnQgbG9nZ2luZwotbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCiAKLWZyb20gbXVsdGlwcm9jZXNzaW5nIGltcG9ydCAgUHJvY2VzcywgVmFsdWUsIENvbmRpdGlvbiwgcmVkdWN0aW9uCitmcm9tIG11bHRpcHJvY2Vzc2luZyBpbXBvcnQgUHJvY2VzcywgVmFsdWUsIENvbmRpdGlvbgogCi1mcm9tIFRTZXJ2ZXIgaW1wb3J0IFRTZXJ2ZXIKK2Zyb20gLlRTZXJ2ZXIgaW1wb3J0IFRTZXJ2ZXIKIGZyb20gdGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0RXhjZXB0aW9uCiAKK2xvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQorCiAKIGNsYXNzIFRQcm9jZXNzUG9vbFNlcnZlcihUU2VydmVyKToKICAgICAiIiJTZXJ2ZXIgd2l0aCBhIGZpeGVkIHNpemUgcG9vbCBvZiB3b3JrZXIgc3VicHJvY2Vzc2VzIHRvIHNlcnZpY2UgcmVxdWVzdHMKQEAgLTU5LDcgKzYwLDcgQEAKICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICBjbGllbnQgPSBzZWxmLnNlcnZlclRyYW5zcG9ydC5hY2NlcHQoKQogICAgICAgICAgICAgICAgIGlmIG5vdCBjbGllbnQ6Ci0gICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgIHNlbGYuc2VydmVDbGllbnQoY2xpZW50KQogICAgICAgICAgICAgZXhjZXB0IChLZXlib2FyZEludGVycnVwdCwgU3lzdGVtRXhpdCk6CiAgICAgICAgICAgICAgICAgcmV0dXJuIDAKQEAgLTc2LDcgKzc3LDcgQEAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgICAgICBzZWxmLnByb2Nlc3Nvci5wcm9jZXNzKGlwcm90LCBvcHJvdCkKLSAgICAgICAgZXhjZXB0IFRUcmFuc3BvcnRFeGNlcHRpb24gYXMgdHg6CisgICAgICAgIGV4Y2VwdCBUVHJhbnNwb3J0RXhjZXB0aW9uOgogICAgICAgICAgICAgcGFzcwogICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIHg6CiAgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKHgpCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3NlcnZlci9UU2VydmVyLnB5IGIvbGliL3B5L3NyYy9zZXJ2ZXIvVFNlcnZlci5weQppbmRleCA4YzU4ZTM5Li5kZjJhN2JiIDEwMDY0NAotLS0gYS9saWIvcHkvc3JjL3NlcnZlci9UU2VydmVyLnB5CisrKyBiL2xpYi9weS9zcmMvc2VydmVyL1RTZXJ2ZXIucHkKQEAgLTE3LDI2MyArMTcsMzA3IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1pbXBvcnQgUXVldWUKLWltcG9ydCBvcwotaW1wb3J0IHN5cwotaW1wb3J0IHRocmVhZGluZwotaW1wb3J0IHRyYWNlYmFjawotCitmcm9tIHNpeC5tb3ZlcyBpbXBvcnQgcXVldWUKIGltcG9ydCBsb2dnaW5nCi1sb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKK2ltcG9ydCBvcworaW1wb3J0IHRocmVhZGluZwogCi1mcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRQcm9jZXNzb3IKIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKK2Zyb20gdGhyaWZ0LnByb3RvY29sLlRIZWFkZXJQcm90b2NvbCBpbXBvcnQgVEhlYWRlclByb3RvY29sRmFjdG9yeQogZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0CiAKK2xvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQogCi1jbGFzcyBUU2VydmVyOgotICAiIiJCYXNlIGludGVyZmFjZSBmb3IgYSBzZXJ2ZXIsIHdoaWNoIG11c3QgaGF2ZSBhIHNlcnZlKCkgbWV0aG9kLgogCi0gIFRocmVlIGNvbnN0cnVjdG9ycyBmb3IgYWxsIHNlcnZlcnM6Ci0gIDEpIChwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCkKLSAgMikgKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpCi0gIDMpIChwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnkpCi0gICIiIgotICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MpOgotICAgIGlmIChsZW4oYXJncykgPT0gMik6Ci0gICAgICBzZWxmLl9faW5pdEFyZ3NfXyhhcmdzWzBdLCBhcmdzWzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydC5UVHJhbnNwb3J0RmFjdG9yeUJhc2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQuVFRyYW5zcG9ydEZhY3RvcnlCYXNlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkKLSAgICBlbGlmIChsZW4oYXJncykgPT0gNCk6Ci0gICAgICBzZWxmLl9faW5pdEFyZ3NfXyhhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzJdLCBhcmdzWzNdLCBhcmdzWzNdKQotICAgIGVsaWYgKGxlbihhcmdzKSA9PSA2KToKLSAgICAgIHNlbGYuX19pbml0QXJnc19fKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10sIGFyZ3NbNF0sIGFyZ3NbNV0pCitjbGFzcyBUU2VydmVyKG9iamVjdCk6CisgICAgIiIiQmFzZSBpbnRlcmZhY2UgZm9yIGEgc2VydmVyLCB3aGljaCBtdXN0IGhhdmUgYSBzZXJ2ZSgpIG1ldGhvZC4KIAotICBkZWYgX19pbml0QXJnc19fKHNlbGYsIHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KToKLSAgICBzZWxmLnByb2Nlc3NvciA9IHByb2Nlc3NvcgotICAgIHNlbGYuc2VydmVyVHJhbnNwb3J0ID0gc2VydmVyVHJhbnNwb3J0Ci0gICAgc2VsZi5pbnB1dFRyYW5zcG9ydEZhY3RvcnkgPSBpbnB1dFRyYW5zcG9ydEZhY3RvcnkKLSAgICBzZWxmLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5Ci0gICAgc2VsZi5pbnB1dFByb3RvY29sRmFjdG9yeSA9IGlucHV0UHJvdG9jb2xGYWN0b3J5Ci0gICAgc2VsZi5vdXRwdXRQcm90b2NvbEZhY3RvcnkgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnkKKyAgICBUaHJlZSBjb25zdHJ1Y3RvcnMgZm9yIGFsbCBzZXJ2ZXJzOgorICAgIDEpIChwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCkKKyAgICAyKSAocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSkKKyAgICAzKSAocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSkKKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MpOgorICAgICAgICBpZiAobGVuKGFyZ3MpID09IDIpOgorICAgICAgICAgICAgc2VsZi5fX2luaXRBcmdzX18oYXJnc1swXSwgYXJnc1sxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQuVFRyYW5zcG9ydEZhY3RvcnlCYXNlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0LlRUcmFuc3BvcnRGYWN0b3J5QmFzZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpCisgICAgICAgIGVsaWYgKGxlbihhcmdzKSA9PSA0KToKKyAgICAgICAgICAgIHNlbGYuX19pbml0QXJnc19fKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbMl0sIGFyZ3NbM10sIGFyZ3NbM10pCisgICAgICAgIGVsaWYgKGxlbihhcmdzKSA9PSA2KToKKyAgICAgICAgICAgIHNlbGYuX19pbml0QXJnc19fKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10sIGFyZ3NbNF0sIGFyZ3NbNV0pCiAKLSAgZGVmIHNlcnZlKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgX19pbml0QXJnc19fKHNlbGYsIHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LCBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSk6CisgICAgICAgIHNlbGYucHJvY2Vzc29yID0gcHJvY2Vzc29yCisgICAgICAgIHNlbGYuc2VydmVyVHJhbnNwb3J0ID0gc2VydmVyVHJhbnNwb3J0CisgICAgICAgIHNlbGYuaW5wdXRUcmFuc3BvcnRGYWN0b3J5ID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5CisgICAgICAgIHNlbGYub3V0cHV0VHJhbnNwb3J0RmFjdG9yeSA9IG91dHB1dFRyYW5zcG9ydEZhY3RvcnkKKyAgICAgICAgc2VsZi5pbnB1dFByb3RvY29sRmFjdG9yeSA9IGlucHV0UHJvdG9jb2xGYWN0b3J5CisgICAgICAgIHNlbGYub3V0cHV0UHJvdG9jb2xGYWN0b3J5ID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5CisKKyAgICAgICAgaW5wdXRfaXNfaGVhZGVyID0gaXNpbnN0YW5jZShzZWxmLmlucHV0UHJvdG9jb2xGYWN0b3J5LCBUSGVhZGVyUHJvdG9jb2xGYWN0b3J5KQorICAgICAgICBvdXRwdXRfaXNfaGVhZGVyID0gaXNpbnN0YW5jZShzZWxmLm91dHB1dFByb3RvY29sRmFjdG9yeSwgVEhlYWRlclByb3RvY29sRmFjdG9yeSkKKyAgICAgICAgaWYgYW55KChpbnB1dF9pc19oZWFkZXIsIG91dHB1dF9pc19oZWFkZXIpKSBhbmQgaW5wdXRfaXNfaGVhZGVyICE9IG91dHB1dF9pc19oZWFkZXI6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJUSGVhZGVyUHJvdG9jb2wgc2VydmVycyByZXF1aXJlIHRoYXQgYm90aCB0aGUgaW5wdXQgYW5kICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm91dHB1dCBwcm90b2NvbHMgYXJlIFRIZWFkZXJQcm90b2NvbC4iKQorCisgICAgZGVmIHNlcnZlKHNlbGYpOgorICAgICAgICBwYXNzCiAKIAogY2xhc3MgVFNpbXBsZVNlcnZlcihUU2VydmVyKToKLSAgIiIiU2ltcGxlIHNpbmdsZS10aHJlYWRlZCBzZXJ2ZXIgdGhhdCBqdXN0IHB1bXBzIGFyb3VuZCBvbmUgdHJhbnNwb3J0LiIiIgorICAgICIiIlNpbXBsZSBzaW5nbGUtdGhyZWFkZWQgc2VydmVyIHRoYXQganVzdCBwdW1wcyBhcm91bmQgb25lIHRyYW5zcG9ydC4iIiIKIAotICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MpOgotICAgIFRTZXJ2ZXIuX19pbml0X18oc2VsZiwgKmFyZ3MpCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzKToKKyAgICAgICAgVFNlcnZlci5fX2luaXRfXyhzZWxmLCAqYXJncykKIAotICBkZWYgc2VydmUoc2VsZik6Ci0gICAgc2VsZi5zZXJ2ZXJUcmFuc3BvcnQubGlzdGVuKCkKLSAgICB3aGlsZSBUcnVlOgotICAgICAgY2xpZW50ID0gc2VsZi5zZXJ2ZXJUcmFuc3BvcnQuYWNjZXB0KCkKLSAgICAgIGlmIG5vdCBjbGllbnQ6Ci0gICAgICAgIGNvbnRpbnVlCi0gICAgICBpdHJhbnMgPSBzZWxmLmlucHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoY2xpZW50KQotICAgICAgb3RyYW5zID0gc2VsZi5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCi0gICAgICBpcHJvdCA9IHNlbGYuaW5wdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2woaXRyYW5zKQotICAgICAgb3Byb3QgPSBzZWxmLm91dHB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChvdHJhbnMpCi0gICAgICB0cnk6CisgICAgZGVmIHNlcnZlKHNlbGYpOgorICAgICAgICBzZWxmLnNlcnZlclRyYW5zcG9ydC5saXN0ZW4oKQogICAgICAgICB3aGlsZSBUcnVlOgotICAgICAgICAgIHNlbGYucHJvY2Vzc29yLnByb2Nlc3MoaXByb3QsIG9wcm90KQotICAgICAgZXhjZXB0IFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbiBhcyB0eDoKLSAgICAgICAgcGFzcwotICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyB4OgotICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKHgpCisgICAgICAgICAgICBjbGllbnQgPSBzZWxmLnNlcnZlclRyYW5zcG9ydC5hY2NlcHQoKQorICAgICAgICAgICAgaWYgbm90IGNsaWVudDoKKyAgICAgICAgICAgICAgICBjb250aW51ZQogCi0gICAgICBpdHJhbnMuY2xvc2UoKQotICAgICAgb3RyYW5zLmNsb3NlKCkKKyAgICAgICAgICAgIGl0cmFucyA9IHNlbGYuaW5wdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCisgICAgICAgICAgICBpcHJvdCA9IHNlbGYuaW5wdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2woaXRyYW5zKQorCisgICAgICAgICAgICAjIGZvciBUSGVhZGVyUHJvdG9jb2wsIHdlIG11c3QgdXNlIHRoZSBzYW1lIHByb3RvY29sIGluc3RhbmNlIGZvcgorICAgICAgICAgICAgIyBpbnB1dCBhbmQgb3V0cHV0IHNvIHRoYXQgdGhlIHJlc3BvbnNlIGlzIGluIHRoZSBzYW1lIGRpYWxlY3QgdGhhdAorICAgICAgICAgICAgIyB0aGUgc2VydmVyIGRldGVjdGVkIHRoZSByZXF1ZXN0IHdhcyBpbi4KKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5pbnB1dFByb3RvY29sRmFjdG9yeSwgVEhlYWRlclByb3RvY29sRmFjdG9yeSk6CisgICAgICAgICAgICAgICAgb3RyYW5zID0gTm9uZQorICAgICAgICAgICAgICAgIG9wcm90ID0gaXByb3QKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgb3RyYW5zID0gc2VsZi5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCisgICAgICAgICAgICAgICAgb3Byb3QgPSBzZWxmLm91dHB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChvdHJhbnMpCisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnByb2Nlc3Nvci5wcm9jZXNzKGlwcm90LCBvcHJvdCkKKyAgICAgICAgICAgIGV4Y2VwdCBUVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb246CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyB4OgorICAgICAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oeCkKKworICAgICAgICAgICAgaXRyYW5zLmNsb3NlKCkKKyAgICAgICAgICAgIGlmIG90cmFuczoKKyAgICAgICAgICAgICAgICBvdHJhbnMuY2xvc2UoKQogCiAKIGNsYXNzIFRUaHJlYWRlZFNlcnZlcihUU2VydmVyKToKLSAgIiIiVGhyZWFkZWQgc2VydmVyIHRoYXQgc3Bhd25zIGEgbmV3IHRocmVhZCBwZXIgZWFjaCBjb25uZWN0aW9uLiIiIgorICAgICIiIlRocmVhZGVkIHNlcnZlciB0aGF0IHNwYXducyBhIG5ldyB0aHJlYWQgcGVyIGVhY2ggY29ubmVjdGlvbi4iIiIKIAotICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKLSAgICBUU2VydmVyLl9faW5pdF9fKHNlbGYsICphcmdzKQotICAgIHNlbGYuZGFlbW9uID0ga3dhcmdzLmdldCgiZGFlbW9uIiwgRmFsc2UpCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIFRTZXJ2ZXIuX19pbml0X18oc2VsZiwgKmFyZ3MpCisgICAgICAgIHNlbGYuZGFlbW9uID0ga3dhcmdzLmdldCgiZGFlbW9uIiwgRmFsc2UpCiAKLSAgZGVmIHNlcnZlKHNlbGYpOgotICAgIHNlbGYuc2VydmVyVHJhbnNwb3J0Lmxpc3RlbigpCi0gICAgd2hpbGUgVHJ1ZToKLSAgICAgIHRyeToKLSAgICAgICAgY2xpZW50ID0gc2VsZi5zZXJ2ZXJUcmFuc3BvcnQuYWNjZXB0KCkKLSAgICAgICAgaWYgbm90IGNsaWVudDoKLSAgICAgICAgICBjb250aW51ZQotICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9c2VsZi5oYW5kbGUsIGFyZ3M9KGNsaWVudCwpKQotICAgICAgICB0LnNldERhZW1vbihzZWxmLmRhZW1vbikKLSAgICAgICAgdC5zdGFydCgpCi0gICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6Ci0gICAgICAgIHJhaXNlCi0gICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIHg6Ci0gICAgICAgIGxvZ2dlci5leGNlcHRpb24oeCkKKyAgICBkZWYgc2VydmUoc2VsZik6CisgICAgICAgIHNlbGYuc2VydmVyVHJhbnNwb3J0Lmxpc3RlbigpCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY2xpZW50ID0gc2VsZi5zZXJ2ZXJUcmFuc3BvcnQuYWNjZXB0KCkKKyAgICAgICAgICAgICAgICBpZiBub3QgY2xpZW50OgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1zZWxmLmhhbmRsZSwgYXJncz0oY2xpZW50LCkpCisgICAgICAgICAgICAgICAgdC5zZXREYWVtb24oc2VsZi5kYWVtb24pCisgICAgICAgICAgICAgICAgdC5zdGFydCgpCisgICAgICAgICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgeDoKKyAgICAgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKHgpCiAKLSAgZGVmIGhhbmRsZShzZWxmLCBjbGllbnQpOgotICAgIGl0cmFucyA9IHNlbGYuaW5wdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCi0gICAgb3RyYW5zID0gc2VsZi5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCi0gICAgaXByb3QgPSBzZWxmLmlucHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKGl0cmFucykKLSAgICBvcHJvdCA9IHNlbGYub3V0cHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKG90cmFucykKLSAgICB0cnk6Ci0gICAgICB3aGlsZSBUcnVlOgotICAgICAgICBzZWxmLnByb2Nlc3Nvci5wcm9jZXNzKGlwcm90LCBvcHJvdCkKLSAgICBleGNlcHQgVFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uIGFzIHR4OgotICAgICAgcGFzcwotICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgeDoKLSAgICAgIGxvZ2dlci5leGNlcHRpb24oeCkKKyAgICBkZWYgaGFuZGxlKHNlbGYsIGNsaWVudCk6CisgICAgICAgIGl0cmFucyA9IHNlbGYuaW5wdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCisgICAgICAgIGlwcm90ID0gc2VsZi5pbnB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChpdHJhbnMpCiAKLSAgICBpdHJhbnMuY2xvc2UoKQotICAgIG90cmFucy5jbG9zZSgpCisgICAgICAgICMgZm9yIFRIZWFkZXJQcm90b2NvbCwgd2UgbXVzdCB1c2UgdGhlIHNhbWUgcHJvdG9jb2wgaW5zdGFuY2UgZm9yIGlucHV0CisgICAgICAgICMgYW5kIG91dHB1dCBzbyB0aGF0IHRoZSByZXNwb25zZSBpcyBpbiB0aGUgc2FtZSBkaWFsZWN0IHRoYXQgdGhlCisgICAgICAgICMgc2VydmVyIGRldGVjdGVkIHRoZSByZXF1ZXN0IHdhcyBpbi4KKyAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLmlucHV0UHJvdG9jb2xGYWN0b3J5LCBUSGVhZGVyUHJvdG9jb2xGYWN0b3J5KToKKyAgICAgICAgICAgIG90cmFucyA9IE5vbmUKKyAgICAgICAgICAgIG9wcm90ID0gaXByb3QKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG90cmFucyA9IHNlbGYub3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoY2xpZW50KQorICAgICAgICAgICAgb3Byb3QgPSBzZWxmLm91dHB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChvdHJhbnMpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICBzZWxmLnByb2Nlc3Nvci5wcm9jZXNzKGlwcm90LCBvcHJvdCkKKyAgICAgICAgZXhjZXB0IFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyB4OgorICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbih4KQorCisgICAgICAgIGl0cmFucy5jbG9zZSgpCisgICAgICAgIGlmIG90cmFuczoKKyAgICAgICAgICAgIG90cmFucy5jbG9zZSgpCiAKIAogY2xhc3MgVFRocmVhZFBvb2xTZXJ2ZXIoVFNlcnZlcik6Ci0gICIiIlNlcnZlciB3aXRoIGEgZml4ZWQgc2l6ZSBwb29sIG9mIHRocmVhZHMgd2hpY2ggc2VydmljZSByZXF1ZXN0cy4iIiIKKyAgICAiIiJTZXJ2ZXIgd2l0aCBhIGZpeGVkIHNpemUgcG9vbCBvZiB0aHJlYWRzIHdoaWNoIHNlcnZpY2UgcmVxdWVzdHMuIiIiCiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6Ci0gICAgVFNlcnZlci5fX2luaXRfXyhzZWxmLCAqYXJncykKLSAgICBzZWxmLmNsaWVudHMgPSBRdWV1ZS5RdWV1ZSgpCi0gICAgc2VsZi50aHJlYWRzID0gMTAKLSAgICBzZWxmLmRhZW1vbiA9IGt3YXJncy5nZXQoImRhZW1vbiIsIEZhbHNlKQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBUU2VydmVyLl9faW5pdF9fKHNlbGYsICphcmdzKQorICAgICAgICBzZWxmLmNsaWVudHMgPSBxdWV1ZS5RdWV1ZSgpCisgICAgICAgIHNlbGYudGhyZWFkcyA9IDEwCisgICAgICAgIHNlbGYuZGFlbW9uID0ga3dhcmdzLmdldCgiZGFlbW9uIiwgRmFsc2UpCiAKLSAgZGVmIHNldE51bVRocmVhZHMoc2VsZiwgbnVtKToKLSAgICAiIiJTZXQgdGhlIG51bWJlciBvZiB3b3JrZXIgdGhyZWFkcyB0aGF0IHNob3VsZCBiZSBjcmVhdGVkIiIiCi0gICAgc2VsZi50aHJlYWRzID0gbnVtCisgICAgZGVmIHNldE51bVRocmVhZHMoc2VsZiwgbnVtKToKKyAgICAgICAgIiIiU2V0IHRoZSBudW1iZXIgb2Ygd29ya2VyIHRocmVhZHMgdGhhdCBzaG91bGQgYmUgY3JlYXRlZCIiIgorICAgICAgICBzZWxmLnRocmVhZHMgPSBudW0KIAotICBkZWYgc2VydmVUaHJlYWQoc2VsZik6Ci0gICAgIiIiTG9vcCBhcm91bmQgZ2V0dGluZyBjbGllbnRzIGZyb20gdGhlIHNoYXJlZCBxdWV1ZSBhbmQgcHJvY2VzcyB0aGVtLiIiIgotICAgIHdoaWxlIFRydWU6Ci0gICAgICB0cnk6Ci0gICAgICAgIGNsaWVudCA9IHNlbGYuY2xpZW50cy5nZXQoKQotICAgICAgICBzZWxmLnNlcnZlQ2xpZW50KGNsaWVudCkKLSAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgeDoKLSAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbih4KQorICAgIGRlZiBzZXJ2ZVRocmVhZChzZWxmKToKKyAgICAgICAgIiIiTG9vcCBhcm91bmQgZ2V0dGluZyBjbGllbnRzIGZyb20gdGhlIHNoYXJlZCBxdWV1ZSBhbmQgcHJvY2VzcyB0aGVtLiIiIgorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNsaWVudCA9IHNlbGYuY2xpZW50cy5nZXQoKQorICAgICAgICAgICAgICAgIHNlbGYuc2VydmVDbGllbnQoY2xpZW50KQorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyB4OgorICAgICAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oeCkKIAotICBkZWYgc2VydmVDbGllbnQoc2VsZiwgY2xpZW50KToKLSAgICAiIiJQcm9jZXNzIGlucHV0L291dHB1dCBmcm9tIGEgY2xpZW50IGZvciBhcyBsb25nIGFzIHBvc3NpYmxlIiIiCi0gICAgaXRyYW5zID0gc2VsZi5pbnB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KGNsaWVudCkKLSAgICBvdHJhbnMgPSBzZWxmLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KGNsaWVudCkKLSAgICBpcHJvdCA9IHNlbGYuaW5wdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2woaXRyYW5zKQotICAgIG9wcm90ID0gc2VsZi5vdXRwdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2wob3RyYW5zKQotICAgIHRyeToKLSAgICAgIHdoaWxlIFRydWU6Ci0gICAgICAgIHNlbGYucHJvY2Vzc29yLnByb2Nlc3MoaXByb3QsIG9wcm90KQotICAgIGV4Y2VwdCBUVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb24gYXMgdHg6Ci0gICAgICBwYXNzCi0gICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyB4OgotICAgICAgbG9nZ2VyLmV4Y2VwdGlvbih4KQorICAgIGRlZiBzZXJ2ZUNsaWVudChzZWxmLCBjbGllbnQpOgorICAgICAgICAiIiJQcm9jZXNzIGlucHV0L291dHB1dCBmcm9tIGEgY2xpZW50IGZvciBhcyBsb25nIGFzIHBvc3NpYmxlIiIiCisgICAgICAgIGl0cmFucyA9IHNlbGYuaW5wdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCisgICAgICAgIGlwcm90ID0gc2VsZi5pbnB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChpdHJhbnMpCiAKLSAgICBpdHJhbnMuY2xvc2UoKQotICAgIG90cmFucy5jbG9zZSgpCisgICAgICAgICMgZm9yIFRIZWFkZXJQcm90b2NvbCwgd2UgbXVzdCB1c2UgdGhlIHNhbWUgcHJvdG9jb2wgaW5zdGFuY2UgZm9yIGlucHV0CisgICAgICAgICMgYW5kIG91dHB1dCBzbyB0aGF0IHRoZSByZXNwb25zZSBpcyBpbiB0aGUgc2FtZSBkaWFsZWN0IHRoYXQgdGhlCisgICAgICAgICMgc2VydmVyIGRldGVjdGVkIHRoZSByZXF1ZXN0IHdhcyBpbi4KKyAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLmlucHV0UHJvdG9jb2xGYWN0b3J5LCBUSGVhZGVyUHJvdG9jb2xGYWN0b3J5KToKKyAgICAgICAgICAgIG90cmFucyA9IE5vbmUKKyAgICAgICAgICAgIG9wcm90ID0gaXByb3QKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG90cmFucyA9IHNlbGYub3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoY2xpZW50KQorICAgICAgICAgICAgb3Byb3QgPSBzZWxmLm91dHB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChvdHJhbnMpCiAKLSAgZGVmIHNlcnZlKHNlbGYpOgotICAgICIiIlN0YXJ0IGEgZml4ZWQgbnVtYmVyIG9mIHdvcmtlciB0aHJlYWRzIGFuZCBwdXQgY2xpZW50IGludG8gYSBxdWV1ZSIiIgotICAgIGZvciBpIGluIHJhbmdlKHNlbGYudGhyZWFkcyk6Ci0gICAgICB0cnk6Ci0gICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1zZWxmLnNlcnZlVGhyZWFkKQotICAgICAgICB0LnNldERhZW1vbihzZWxmLmRhZW1vbikKLSAgICAgICAgdC5zdGFydCgpCi0gICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIHg6Ci0gICAgICAgIGxvZ2dlci5leGNlcHRpb24oeCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICBzZWxmLnByb2Nlc3Nvci5wcm9jZXNzKGlwcm90LCBvcHJvdCkKKyAgICAgICAgZXhjZXB0IFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyB4OgorICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbih4KQogCi0gICAgIyBQdW1wIHRoZSBzb2NrZXQgZm9yIGNsaWVudHMKLSAgICBzZWxmLnNlcnZlclRyYW5zcG9ydC5saXN0ZW4oKQotICAgIHdoaWxlIFRydWU6Ci0gICAgICB0cnk6Ci0gICAgICAgIGNsaWVudCA9IHNlbGYuc2VydmVyVHJhbnNwb3J0LmFjY2VwdCgpCi0gICAgICAgIGlmIG5vdCBjbGllbnQ6Ci0gICAgICAgICAgY29udGludWUKLSAgICAgICAgc2VsZi5jbGllbnRzLnB1dChjbGllbnQpCi0gICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIHg6Ci0gICAgICAgIGxvZ2dlci5leGNlcHRpb24oeCkKKyAgICAgICAgaXRyYW5zLmNsb3NlKCkKKyAgICAgICAgaWYgb3RyYW5zOgorICAgICAgICAgICAgb3RyYW5zLmNsb3NlKCkKKworICAgIGRlZiBzZXJ2ZShzZWxmKToKKyAgICAgICAgIiIiU3RhcnQgYSBmaXhlZCBudW1iZXIgb2Ygd29ya2VyIHRocmVhZHMgYW5kIHB1dCBjbGllbnQgaW50byBhIHF1ZXVlIiIiCisgICAgICAgIGZvciBpIGluIHJhbmdlKHNlbGYudGhyZWFkcyk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXNlbGYuc2VydmVUaHJlYWQpCisgICAgICAgICAgICAgICAgdC5zZXREYWVtb24oc2VsZi5kYWVtb24pCisgICAgICAgICAgICAgICAgdC5zdGFydCgpCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIHg6CisgICAgICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbih4KQorCisgICAgICAgICMgUHVtcCB0aGUgc29ja2V0IGZvciBjbGllbnRzCisgICAgICAgIHNlbGYuc2VydmVyVHJhbnNwb3J0Lmxpc3RlbigpCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY2xpZW50ID0gc2VsZi5zZXJ2ZXJUcmFuc3BvcnQuYWNjZXB0KCkKKyAgICAgICAgICAgICAgICBpZiBub3QgY2xpZW50OgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIHNlbGYuY2xpZW50cy5wdXQoY2xpZW50KQorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyB4OgorICAgICAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oeCkKIAogCiBjbGFzcyBURm9ya2luZ1NlcnZlcihUU2VydmVyKToKLSAgIiIiQSBUaHJpZnQgc2VydmVyIHRoYXQgZm9ya3MgYSBuZXcgcHJvY2VzcyBmb3IgZWFjaCByZXF1ZXN0CisgICAgIiIiQSBUaHJpZnQgc2VydmVyIHRoYXQgZm9ya3MgYSBuZXcgcHJvY2VzcyBmb3IgZWFjaCByZXF1ZXN0CiAKLSAgVGhpcyBpcyBtb3JlIHNjYWxhYmxlIHRoYW4gdGhlIHRocmVhZGVkIHNlcnZlciBhcyBpdCBkb2VzIG5vdCBjYXVzZQotICBHSUwgY29udGVudGlvbi4KKyAgICBUaGlzIGlzIG1vcmUgc2NhbGFibGUgdGhhbiB0aGUgdGhyZWFkZWQgc2VydmVyIGFzIGl0IGRvZXMgbm90IGNhdXNlCisgICAgR0lMIGNvbnRlbnRpb24uCiAKLSAgTm90ZSB0aGF0IHRoaXMgaGFzIGRpZmZlcmVudCBzZW1hbnRpY3MgZnJvbSB0aGUgdGhyZWFkaW5nIHNlcnZlci4KLSAgU3BlY2lmaWNhbGx5LCB1cGRhdGVzIHRvIHNoYXJlZCB2YXJpYWJsZXMgd2lsbCBubyBsb25nZXIgYmUgc2hhcmVkLgotICBJdCB3aWxsIGFsc28gbm90IHdvcmsgb24gd2luZG93cy4KKyAgICBOb3RlIHRoYXQgdGhpcyBoYXMgZGlmZmVyZW50IHNlbWFudGljcyBmcm9tIHRoZSB0aHJlYWRpbmcgc2VydmVyLgorICAgIFNwZWNpZmljYWxseSwgdXBkYXRlcyB0byBzaGFyZWQgdmFyaWFibGVzIHdpbGwgbm8gbG9uZ2VyIGJlIHNoYXJlZC4KKyAgICBJdCB3aWxsIGFsc28gbm90IHdvcmsgb24gd2luZG93cy4KIAotICBUaGlzIGNvZGUgaXMgaGVhdmlseSBpbnNwaXJlZCBieSBTb2NrZXRTZXJ2ZXIuRm9ya2luZ01peEluIGluIHRoZQotICBQeXRob24gc3RkbGliLgotICAiIiIKLSAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzKToKLSAgICBUU2VydmVyLl9faW5pdF9fKHNlbGYsICphcmdzKQotICAgIHNlbGYuY2hpbGRyZW4gPSBbXQorICAgIFRoaXMgY29kZSBpcyBoZWF2aWx5IGluc3BpcmVkIGJ5IFNvY2tldFNlcnZlci5Gb3JraW5nTWl4SW4gaW4gdGhlCisgICAgUHl0aG9uIHN0ZGxpYi4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MpOgorICAgICAgICBUU2VydmVyLl9faW5pdF9fKHNlbGYsICphcmdzKQorICAgICAgICBzZWxmLmNoaWxkcmVuID0gW10KIAotICBkZWYgc2VydmUoc2VsZik6Ci0gICAgZGVmIHRyeV9jbG9zZShmaWxlKToKLSAgICAgIHRyeToKLSAgICAgICAgZmlsZS5jbG9zZSgpCi0gICAgICBleGNlcHQgSU9FcnJvciBhcyBlOgotICAgICAgICBsb2dnZXIud2FybmluZyhlLCBleGNfaW5mbz1UcnVlKQotCi0gICAgc2VsZi5zZXJ2ZXJUcmFuc3BvcnQubGlzdGVuKCkKLSAgICB3aGlsZSBUcnVlOgotICAgICAgY2xpZW50ID0gc2VsZi5zZXJ2ZXJUcmFuc3BvcnQuYWNjZXB0KCkKLSAgICAgIGlmIG5vdCBjbGllbnQ6Ci0gICAgICAgIGNvbnRpbnVlCi0gICAgICB0cnk6Ci0gICAgICAgIHBpZCA9IG9zLmZvcmsoKQotCi0gICAgICAgIGlmIHBpZDogICMgcGFyZW50Ci0gICAgICAgICAgIyBhZGQgYmVmb3JlIGNvbGxlY3QsIG90aGVyd2lzZSB5b3UgcmFjZSB3LyB3YWl0cGlkCi0gICAgICAgICAgc2VsZi5jaGlsZHJlbi5hcHBlbmQocGlkKQotICAgICAgICAgIHNlbGYuY29sbGVjdF9jaGlsZHJlbigpCi0KLSAgICAgICAgICAjIFBhcmVudCBtdXN0IGNsb3NlIHNvY2tldCBvciB0aGUgY29ubmVjdGlvbiBtYXkgbm90IGdldAotICAgICAgICAgICMgY2xvc2VkIHByb21wdGx5Ci0gICAgICAgICAgaXRyYW5zID0gc2VsZi5pbnB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KGNsaWVudCkKLSAgICAgICAgICBvdHJhbnMgPSBzZWxmLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KGNsaWVudCkKLSAgICAgICAgICB0cnlfY2xvc2UoaXRyYW5zKQotICAgICAgICAgIHRyeV9jbG9zZShvdHJhbnMpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgaXRyYW5zID0gc2VsZi5pbnB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KGNsaWVudCkKLSAgICAgICAgICBvdHJhbnMgPSBzZWxmLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KGNsaWVudCkKLQotICAgICAgICAgIGlwcm90ID0gc2VsZi5pbnB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChpdHJhbnMpCi0gICAgICAgICAgb3Byb3QgPSBzZWxmLm91dHB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChvdHJhbnMpCi0KLSAgICAgICAgICBlY29kZSA9IDAKLSAgICAgICAgICB0cnk6CisgICAgZGVmIHNlcnZlKHNlbGYpOgorICAgICAgICBkZWYgdHJ5X2Nsb3NlKGZpbGUpOgogICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICB3aGlsZSBUcnVlOgotICAgICAgICAgICAgICAgIHNlbGYucHJvY2Vzc29yLnByb2Nlc3MoaXByb3QsIG9wcm90KQotICAgICAgICAgICAgZXhjZXB0IFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbiBhcyB0eDoKLSAgICAgICAgICAgICAgcGFzcwotICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgotICAgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKGUpCi0gICAgICAgICAgICAgIGVjb2RlID0gMQotICAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICB0cnlfY2xvc2UoaXRyYW5zKQotICAgICAgICAgICAgdHJ5X2Nsb3NlKG90cmFucykKKyAgICAgICAgICAgICAgICBmaWxlLmNsb3NlKCkKKyAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoZSwgZXhjX2luZm89VHJ1ZSkKIAotICAgICAgICAgIG9zLl9leGl0KGVjb2RlKQorICAgICAgICBzZWxmLnNlcnZlclRyYW5zcG9ydC5saXN0ZW4oKQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgY2xpZW50ID0gc2VsZi5zZXJ2ZXJUcmFuc3BvcnQuYWNjZXB0KCkKKyAgICAgICAgICAgIGlmIG5vdCBjbGllbnQ6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwaWQgPSBvcy5mb3JrKCkKIAotICAgICAgZXhjZXB0IFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbiBhcyB0eDoKLSAgICAgICAgcGFzcwotICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyB4OgotICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKHgpCisgICAgICAgICAgICAgICAgaWYgcGlkOiAgIyBwYXJlbnQKKyAgICAgICAgICAgICAgICAgICAgIyBhZGQgYmVmb3JlIGNvbGxlY3QsIG90aGVyd2lzZSB5b3UgcmFjZSB3LyB3YWl0cGlkCisgICAgICAgICAgICAgICAgICAgIHNlbGYuY2hpbGRyZW4uYXBwZW5kKHBpZCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jb2xsZWN0X2NoaWxkcmVuKCkKIAotICBkZWYgY29sbGVjdF9jaGlsZHJlbihzZWxmKToKLSAgICB3aGlsZSBzZWxmLmNoaWxkcmVuOgotICAgICAgdHJ5OgotICAgICAgICBwaWQsIHN0YXR1cyA9IG9zLndhaXRwaWQoMCwgb3MuV05PSEFORykKLSAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKLSAgICAgICAgcGlkID0gTm9uZQorICAgICAgICAgICAgICAgICAgICAjIFBhcmVudCBtdXN0IGNsb3NlIHNvY2tldCBvciB0aGUgY29ubmVjdGlvbiBtYXkgbm90IGdldAorICAgICAgICAgICAgICAgICAgICAjIGNsb3NlZCBwcm9tcHRseQorICAgICAgICAgICAgICAgICAgICBpdHJhbnMgPSBzZWxmLmlucHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoY2xpZW50KQorICAgICAgICAgICAgICAgICAgICBvdHJhbnMgPSBzZWxmLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KGNsaWVudCkKKyAgICAgICAgICAgICAgICAgICAgdHJ5X2Nsb3NlKGl0cmFucykKKyAgICAgICAgICAgICAgICAgICAgdHJ5X2Nsb3NlKG90cmFucykKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBpdHJhbnMgPSBzZWxmLmlucHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoY2xpZW50KQorICAgICAgICAgICAgICAgICAgICBpcHJvdCA9IHNlbGYuaW5wdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2woaXRyYW5zKQogCi0gICAgICBpZiBwaWQ6Ci0gICAgICAgIHNlbGYuY2hpbGRyZW4ucmVtb3ZlKHBpZCkKLSAgICAgIGVsc2U6Ci0gICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgICMgZm9yIFRIZWFkZXJQcm90b2NvbCwgd2UgbXVzdCB1c2UgdGhlIHNhbWUgcHJvdG9jb2wKKyAgICAgICAgICAgICAgICAgICAgIyBpbnN0YW5jZSBmb3IgaW5wdXQgYW5kIG91dHB1dCBzbyB0aGF0IHRoZSByZXNwb25zZSBpcyBpbgorICAgICAgICAgICAgICAgICAgICAjIHRoZSBzYW1lIGRpYWxlY3QgdGhhdCB0aGUgc2VydmVyIGRldGVjdGVkIHRoZSByZXF1ZXN0IHdhcworICAgICAgICAgICAgICAgICAgICAjIGluLgorICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYuaW5wdXRQcm90b2NvbEZhY3RvcnksIFRIZWFkZXJQcm90b2NvbEZhY3RvcnkpOgorICAgICAgICAgICAgICAgICAgICAgICAgb3RyYW5zID0gTm9uZQorICAgICAgICAgICAgICAgICAgICAgICAgb3Byb3QgPSBpcHJvdAorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgb3RyYW5zID0gc2VsZi5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCisgICAgICAgICAgICAgICAgICAgICAgICBvcHJvdCA9IHNlbGYub3V0cHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKG90cmFucykKKworICAgICAgICAgICAgICAgICAgICBlY29kZSA9IDAKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucHJvY2Vzc29yLnByb2Nlc3MoaXByb3QsIG9wcm90KQorICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbihlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjb2RlID0gMQorICAgICAgICAgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgICAgICAgICAgdHJ5X2Nsb3NlKGl0cmFucykKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG90cmFuczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnlfY2xvc2Uob3RyYW5zKQorCisgICAgICAgICAgICAgICAgICAgIG9zLl9leGl0KGVjb2RlKQorCisgICAgICAgICAgICBleGNlcHQgVFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgeDoKKyAgICAgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKHgpCisKKyAgICBkZWYgY29sbGVjdF9jaGlsZHJlbihzZWxmKToKKyAgICAgICAgd2hpbGUgc2VsZi5jaGlsZHJlbjoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwaWQsIHN0YXR1cyA9IG9zLndhaXRwaWQoMCwgb3MuV05PSEFORykKKyAgICAgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKKyAgICAgICAgICAgICAgICBwaWQgPSBOb25lCisKKyAgICAgICAgICAgIGlmIHBpZDoKKyAgICAgICAgICAgICAgICBzZWxmLmNoaWxkcmVuLnJlbW92ZShwaWQpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGJyZWFrCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3RyYW5zcG9ydC9USGVhZGVyVHJhbnNwb3J0LnB5IGIvbGliL3B5L3NyYy90cmFuc3BvcnQvVEhlYWRlclRyYW5zcG9ydC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGQ1NjQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5L3NyYy90cmFuc3BvcnQvVEhlYWRlclRyYW5zcG9ydC5weQpAQCAtMCwwICsxLDM1MiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2ltcG9ydCBzdHJ1Y3QKK2ltcG9ydCB6bGliCisKK2Zyb20gdGhyaWZ0LmNvbXBhdCBpbXBvcnQgQnVmZmVySU8sIGJ5dGVfaW5kZXgKK2Zyb20gdGhyaWZ0LnByb3RvY29sLlRCaW5hcnlQcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCitmcm9tIHRocmlmdC5wcm90b2NvbC5UQ29tcGFjdFByb3RvY29sIGltcG9ydCBUQ29tcGFjdFByb3RvY29sLCByZWFkVmFyaW50LCB3cml0ZVZhcmludAorZnJvbSB0aHJpZnQuVGhyaWZ0IGltcG9ydCBUQXBwbGljYXRpb25FeGNlcHRpb24KK2Zyb20gdGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0IGltcG9ydCAoCisgICAgQ1JlYWRhYmxlVHJhbnNwb3J0LAorICAgIFRNZW1vcnlCdWZmZXIsCisgICAgVFRyYW5zcG9ydEJhc2UsCisgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbiwKKykKKworCitVMTYgPSBzdHJ1Y3QuU3RydWN0KCIhSCIpCitJMzIgPSBzdHJ1Y3QuU3RydWN0KCIhaSIpCitIRUFERVJfTUFHSUMgPSAweDBGRkYKK0hBUkRfTUFYX0ZSQU1FX1NJWkUgPSAweDNGRkZGRkZGCisKKworY2xhc3MgVEhlYWRlckNsaWVudFR5cGUob2JqZWN0KToKKyAgICBIRUFERVJTID0gMHgwMAorCisgICAgRlJBTUVEX0JJTkFSWSA9IDB4MDEKKyAgICBVTkZSQU1FRF9CSU5BUlkgPSAweDAyCisKKyAgICBGUkFNRURfQ09NUEFDVCA9IDB4MDMKKyAgICBVTkZSQU1FRF9DT01QQUNUID0gMHgwNAorCisKK2NsYXNzIFRIZWFkZXJTdWJwcm90b2NvbElEKG9iamVjdCk6CisgICAgQklOQVJZID0gMHgwMAorICAgIENPTVBBQ1QgPSAweDAyCisKKworY2xhc3MgVEluZm9IZWFkZXJUeXBlKG9iamVjdCk6CisgICAgS0VZX1ZBTFVFID0gMHgwMQorCisKK2NsYXNzIFRIZWFkZXJUcmFuc2Zvcm1JRChvYmplY3QpOgorICAgIFpMSUIgPSAweDAxCisKKworUkVBRF9UUkFOU0ZPUk1TX0JZX0lEID0geworICAgIFRIZWFkZXJUcmFuc2Zvcm1JRC5aTElCOiB6bGliLmRlY29tcHJlc3MsCit9CisKKworV1JJVEVfVFJBTlNGT1JNU19CWV9JRCA9IHsKKyAgICBUSGVhZGVyVHJhbnNmb3JtSUQuWkxJQjogemxpYi5jb21wcmVzcywKK30KKworCitkZWYgX3JlYWRTdHJpbmcodHJhbnMpOgorICAgIHNpemUgPSByZWFkVmFyaW50KHRyYW5zKQorICAgIGlmIHNpemUgPCAwOgorICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5ORUdBVElWRV9TSVpFLAorICAgICAgICAgICAgIk5lZ2F0aXZlIGxlbmd0aCIKKyAgICAgICAgKQorICAgIHJldHVybiB0cmFucy5yZWFkKHNpemUpCisKKworZGVmIF93cml0ZVN0cmluZyh0cmFucywgdmFsdWUpOgorICAgIHdyaXRlVmFyaW50KHRyYW5zLCBsZW4odmFsdWUpKQorICAgIHRyYW5zLndyaXRlKHZhbHVlKQorCisKK2NsYXNzIFRIZWFkZXJUcmFuc3BvcnQoVFRyYW5zcG9ydEJhc2UsIENSZWFkYWJsZVRyYW5zcG9ydCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRyYW5zcG9ydCwgYWxsb3dlZF9jbGllbnRfdHlwZXMpOgorICAgICAgICBzZWxmLl90cmFuc3BvcnQgPSB0cmFuc3BvcnQKKyAgICAgICAgc2VsZi5fY2xpZW50X3R5cGUgPSBUSGVhZGVyQ2xpZW50VHlwZS5IRUFERVJTCisgICAgICAgIHNlbGYuX2FsbG93ZWRfY2xpZW50X3R5cGVzID0gYWxsb3dlZF9jbGllbnRfdHlwZXMKKworICAgICAgICBzZWxmLl9yZWFkX2J1ZmZlciA9IEJ1ZmZlcklPKGIiIikKKyAgICAgICAgc2VsZi5fcmVhZF9oZWFkZXJzID0ge30KKworICAgICAgICBzZWxmLl93cml0ZV9idWZmZXIgPSBCdWZmZXJJTygpCisgICAgICAgIHNlbGYuX3dyaXRlX2hlYWRlcnMgPSB7fQorICAgICAgICBzZWxmLl93cml0ZV90cmFuc2Zvcm1zID0gW10KKworICAgICAgICBzZWxmLmZsYWdzID0gMAorICAgICAgICBzZWxmLnNlcXVlbmNlX2lkID0gMAorICAgICAgICBzZWxmLl9wcm90b2NvbF9pZCA9IFRIZWFkZXJTdWJwcm90b2NvbElELkJJTkFSWQorICAgICAgICBzZWxmLl9tYXhfZnJhbWVfc2l6ZSA9IEhBUkRfTUFYX0ZSQU1FX1NJWkUKKworICAgIGRlZiBpc09wZW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl90cmFuc3BvcnQuaXNPcGVuKCkKKworICAgIGRlZiBvcGVuKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fdHJhbnNwb3J0Lm9wZW4oKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fdHJhbnNwb3J0LmNsb3NlKCkKKworICAgIGRlZiBnZXRfaGVhZGVycyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3JlYWRfaGVhZGVycworCisgICAgZGVmIHNldF9oZWFkZXIoc2VsZiwga2V5LCB2YWx1ZSk6CisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGtleSwgYnl0ZXMpOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiaGVhZGVyIG5hbWVzIG11c3QgYmUgYnl0ZXMiKQorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh2YWx1ZSwgYnl0ZXMpOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiaGVhZGVyIHZhbHVlcyBtdXN0IGJlIGJ5dGVzIikKKyAgICAgICAgc2VsZi5fd3JpdGVfaGVhZGVyc1trZXldID0gdmFsdWUKKworICAgIGRlZiBjbGVhcl9oZWFkZXJzKHNlbGYpOgorICAgICAgICBzZWxmLl93cml0ZV9oZWFkZXJzLmNsZWFyKCkKKworICAgIGRlZiBhZGRfdHJhbnNmb3JtKHNlbGYsIHRyYW5zZm9ybV9pZCk6CisgICAgICAgIGlmIHRyYW5zZm9ybV9pZCBub3QgaW4gV1JJVEVfVFJBTlNGT1JNU19CWV9JRDoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInVua25vd24gdHJhbnNmb3JtIikKKyAgICAgICAgc2VsZi5fd3JpdGVfdHJhbnNmb3Jtcy5hcHBlbmQodHJhbnNmb3JtX2lkKQorCisgICAgZGVmIHNldF9tYXhfZnJhbWVfc2l6ZShzZWxmLCBzaXplKToKKyAgICAgICAgaWYgbm90IDAgPCBzaXplIDwgSEFSRF9NQVhfRlJBTUVfU0laRToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm1heGltdW0gZnJhbWUgc2l6ZSBzaG91bGQgYmUgPCAlZCBhbmQgPiAwIiAlIEhBUkRfTUFYX0ZSQU1FX1NJWkUpCisgICAgICAgIHNlbGYuX21heF9mcmFtZV9zaXplID0gc2l6ZQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIHByb3RvY29sX2lkKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9jbGllbnRfdHlwZSA9PSBUSGVhZGVyQ2xpZW50VHlwZS5IRUFERVJTOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sX2lkCisgICAgICAgIGVsaWYgc2VsZi5fY2xpZW50X3R5cGUgaW4gKFRIZWFkZXJDbGllbnRUeXBlLkZSQU1FRF9CSU5BUlksIFRIZWFkZXJDbGllbnRUeXBlLlVORlJBTUVEX0JJTkFSWSk6CisgICAgICAgICAgICByZXR1cm4gVEhlYWRlclN1YnByb3RvY29sSUQuQklOQVJZCisgICAgICAgIGVsaWYgc2VsZi5fY2xpZW50X3R5cGUgaW4gKFRIZWFkZXJDbGllbnRUeXBlLkZSQU1FRF9DT01QQUNULCBUSGVhZGVyQ2xpZW50VHlwZS5VTkZSQU1FRF9DT01QQUNUKToKKyAgICAgICAgICAgIHJldHVybiBUSGVhZGVyU3VicHJvdG9jb2xJRC5DT01QQUNUCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uSU5WQUxJRF9DTElFTlRfVFlQRSwKKyAgICAgICAgICAgICAgICAiUHJvdG9jb2wgSUQgbm90IGtub3cgZm9yIGNsaWVudCB0eXBlICVkIiAlIHNlbGYuX2NsaWVudF90eXBlLAorICAgICAgICAgICAgKQorCisgICAgZGVmIHJlYWQoc2VsZiwgc3opOgorICAgICAgICAjIGlmIHRoZXJlIGFyZSBieXRlcyBsZWZ0IGluIHRoZSBidWZmZXIsIHByb2R1Y2UgdGhvc2UgZmlyc3QuCisgICAgICAgIGJ5dGVzX3JlYWQgPSBzZWxmLl9yZWFkX2J1ZmZlci5yZWFkKHN6KQorICAgICAgICBieXRlc19sZWZ0X3RvX3JlYWQgPSBzeiAtIGxlbihieXRlc19yZWFkKQorICAgICAgICBpZiBieXRlc19sZWZ0X3RvX3JlYWQgPT0gMDoKKyAgICAgICAgICAgIHJldHVybiBieXRlc19yZWFkCisKKyAgICAgICAgIyBpZiB3ZSd2ZSBkZXRlcm1pbmVkIHRoaXMgaXMgYW4gdW5mcmFtZWQgY2xpZW50LCBqdXN0IHBhc3MgdGhlIHJlYWQKKyAgICAgICAgIyB0aHJvdWdoIHRvIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCB1bnRpbCB3ZSdyZSByZXNldCBhZ2FpbiBhdCB0aGUKKyAgICAgICAgIyBiZWdpbm5pbmcgb2YgdGhlIG5leHQgbWVzc2FnZS4KKyAgICAgICAgaWYgc2VsZi5fY2xpZW50X3R5cGUgaW4gKFRIZWFkZXJDbGllbnRUeXBlLlVORlJBTUVEX0JJTkFSWSwgVEhlYWRlckNsaWVudFR5cGUuVU5GUkFNRURfQ09NUEFDVCk6CisgICAgICAgICAgICByZXR1cm4gYnl0ZXNfcmVhZCArIHNlbGYuX3RyYW5zcG9ydC5yZWFkKGJ5dGVzX2xlZnRfdG9fcmVhZCkKKworICAgICAgICAjIHdlJ3JlIGVtcHR5IGFuZCAobWF5YmUpIGZyYW1lZC4gZmlsbCB0aGUgYnVmZmVycyB3aXRoIHRoZSBuZXh0IGZyYW1lLgorICAgICAgICBzZWxmLnJlYWRGcmFtZShieXRlc19sZWZ0X3RvX3JlYWQpCisgICAgICAgIHJldHVybiBieXRlc19yZWFkICsgc2VsZi5fcmVhZF9idWZmZXIucmVhZChieXRlc19sZWZ0X3RvX3JlYWQpCisKKyAgICBkZWYgX3NldF9jbGllbnRfdHlwZShzZWxmLCBjbGllbnRfdHlwZSk6CisgICAgICAgIGlmIGNsaWVudF90eXBlIG5vdCBpbiBzZWxmLl9hbGxvd2VkX2NsaWVudF90eXBlczoKKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5JTlZBTElEX0NMSUVOVF9UWVBFLAorICAgICAgICAgICAgICAgICJDbGllbnQgdHlwZSAlZCBub3QgYWxsb3dlZCBieSBzZXJ2ZXIuIiAlIGNsaWVudF90eXBlLAorICAgICAgICAgICAgKQorICAgICAgICBzZWxmLl9jbGllbnRfdHlwZSA9IGNsaWVudF90eXBlCisKKyAgICBkZWYgcmVhZEZyYW1lKHNlbGYsIHJlcV9zeik6CisgICAgICAgICMgdGhlIGZpcnN0IHdvcmQgY291bGQgZWl0aGVyIGJlIHRoZSBsZW5ndGggZmllbGQgb2YgYSBmcmFtZWQgbWVzc2FnZQorICAgICAgICAjIG9yIHRoZSBmaXJzdCBieXRlcyBvZiBhbiB1bmZyYW1lZCBtZXNzYWdlLgorICAgICAgICBmaXJzdF93b3JkID0gc2VsZi5fdHJhbnNwb3J0LnJlYWRBbGwoSTMyLnNpemUpCisgICAgICAgIGZyYW1lX3NpemUsID0gSTMyLnVucGFjayhmaXJzdF93b3JkKQorICAgICAgICBpc191bmZyYW1lZCA9IEZhbHNlCisgICAgICAgIGlmIGZyYW1lX3NpemUgJiBUQmluYXJ5UHJvdG9jb2wuVkVSU0lPTl9NQVNLID09IFRCaW5hcnlQcm90b2NvbC5WRVJTSU9OXzE6CisgICAgICAgICAgICBzZWxmLl9zZXRfY2xpZW50X3R5cGUoVEhlYWRlckNsaWVudFR5cGUuVU5GUkFNRURfQklOQVJZKQorICAgICAgICAgICAgaXNfdW5mcmFtZWQgPSBUcnVlCisgICAgICAgIGVsaWYgKGJ5dGVfaW5kZXgoZmlyc3Rfd29yZCwgMCkgPT0gVENvbXBhY3RQcm90b2NvbC5QUk9UT0NPTF9JRCBhbmQKKyAgICAgICAgICAgICAgYnl0ZV9pbmRleChmaXJzdF93b3JkLCAxKSAmIFRDb21wYWN0UHJvdG9jb2wuVkVSU0lPTl9NQVNLID09IFRDb21wYWN0UHJvdG9jb2wuVkVSU0lPTik6CisgICAgICAgICAgICBzZWxmLl9zZXRfY2xpZW50X3R5cGUoVEhlYWRlckNsaWVudFR5cGUuVU5GUkFNRURfQ09NUEFDVCkKKyAgICAgICAgICAgIGlzX3VuZnJhbWVkID0gVHJ1ZQorCisgICAgICAgIGlmIGlzX3VuZnJhbWVkOgorICAgICAgICAgICAgYnl0ZXNfbGVmdF90b19yZWFkID0gcmVxX3N6IC0gSTMyLnNpemUKKyAgICAgICAgICAgIGlmIGJ5dGVzX2xlZnRfdG9fcmVhZCA+IDA6CisgICAgICAgICAgICAgICAgcmVzdCA9IHNlbGYuX3RyYW5zcG9ydC5yZWFkKGJ5dGVzX2xlZnRfdG9fcmVhZCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmVzdCA9IGIiIgorICAgICAgICAgICAgc2VsZi5fcmVhZF9idWZmZXIgPSBCdWZmZXJJTyhmaXJzdF93b3JkICsgcmVzdCkKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgb2ssIHdlJ3JlIHN0aWxsIGhlcmUgc28gd2UncmUgZnJhbWVkLgorICAgICAgICBpZiBmcmFtZV9zaXplID4gc2VsZi5fbWF4X2ZyYW1lX3NpemU6CisgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uU0laRV9MSU1JVCwKKyAgICAgICAgICAgICAgICAiRnJhbWUgd2FzIHRvbyBsYXJnZS4iLAorICAgICAgICAgICAgKQorICAgICAgICByZWFkX2J1ZmZlciA9IEJ1ZmZlcklPKHNlbGYuX3RyYW5zcG9ydC5yZWFkQWxsKGZyYW1lX3NpemUpKQorCisgICAgICAgICMgdGhlIG5leHQgd29yZCBpcyBlaXRoZXIgZ29pbmcgdG8gYmUgdGhlIHZlcnNpb24gZmllbGQgb2YgYQorICAgICAgICAjIGJpbmFyeS9jb21wYWN0IHByb3RvY29sIG1lc3NhZ2Ugb3IgdGhlIG1hZ2ljIHZhbHVlICsgZmxhZ3Mgb2YgYQorICAgICAgICAjIGhlYWRlciBwcm90b2NvbCBtZXNzYWdlLgorICAgICAgICBzZWNvbmRfd29yZCA9IHJlYWRfYnVmZmVyLnJlYWQoSTMyLnNpemUpCisgICAgICAgIHZlcnNpb24sID0gSTMyLnVucGFjayhzZWNvbmRfd29yZCkKKyAgICAgICAgcmVhZF9idWZmZXIuc2VlaygwKQorICAgICAgICBpZiB2ZXJzaW9uID4+IDE2ID09IEhFQURFUl9NQUdJQzoKKyAgICAgICAgICAgIHNlbGYuX3NldF9jbGllbnRfdHlwZShUSGVhZGVyQ2xpZW50VHlwZS5IRUFERVJTKQorICAgICAgICAgICAgc2VsZi5fcmVhZF9idWZmZXIgPSBzZWxmLl9wYXJzZV9oZWFkZXJfZm9ybWF0KHJlYWRfYnVmZmVyKQorICAgICAgICBlbGlmIHZlcnNpb24gJiBUQmluYXJ5UHJvdG9jb2wuVkVSU0lPTl9NQVNLID09IFRCaW5hcnlQcm90b2NvbC5WRVJTSU9OXzE6CisgICAgICAgICAgICBzZWxmLl9zZXRfY2xpZW50X3R5cGUoVEhlYWRlckNsaWVudFR5cGUuRlJBTUVEX0JJTkFSWSkKKyAgICAgICAgICAgIHNlbGYuX3JlYWRfYnVmZmVyID0gcmVhZF9idWZmZXIKKyAgICAgICAgZWxpZiAoYnl0ZV9pbmRleChzZWNvbmRfd29yZCwgMCkgPT0gVENvbXBhY3RQcm90b2NvbC5QUk9UT0NPTF9JRCBhbmQKKyAgICAgICAgICAgICAgYnl0ZV9pbmRleChzZWNvbmRfd29yZCwgMSkgJiBUQ29tcGFjdFByb3RvY29sLlZFUlNJT05fTUFTSyA9PSBUQ29tcGFjdFByb3RvY29sLlZFUlNJT04pOgorICAgICAgICAgICAgc2VsZi5fc2V0X2NsaWVudF90eXBlKFRIZWFkZXJDbGllbnRUeXBlLkZSQU1FRF9DT01QQUNUKQorICAgICAgICAgICAgc2VsZi5fcmVhZF9idWZmZXIgPSByZWFkX2J1ZmZlcgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLklOVkFMSURfQ0xJRU5UX1RZUEUsCisgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBkZXRlY3QgY2xpZW50IHRyYW5zcG9ydCB0eXBlLiIsCisgICAgICAgICAgICApCisKKyAgICBkZWYgX3BhcnNlX2hlYWRlcl9mb3JtYXQoc2VsZiwgYnVmZmVyKToKKyAgICAgICAgIyBtYWtlIEJ1ZmZlcklPIGxvb2sgbGlrZSBUVHJhbnNwb3J0IGZvciB2YXJpbnQgaGVscGVycworICAgICAgICBidWZmZXJfdHJhbnNwb3J0ID0gVE1lbW9yeUJ1ZmZlcigpCisgICAgICAgIGJ1ZmZlcl90cmFuc3BvcnQuX2J1ZmZlciA9IGJ1ZmZlcgorCisgICAgICAgIGJ1ZmZlci5yZWFkKDIpICAjIGRpc2NhcmQgdGhlIG1hZ2ljIGJ5dGVzCisgICAgICAgIHNlbGYuZmxhZ3MsID0gVTE2LnVucGFjayhidWZmZXIucmVhZChVMTYuc2l6ZSkpCisgICAgICAgIHNlbGYuc2VxdWVuY2VfaWQsID0gSTMyLnVucGFjayhidWZmZXIucmVhZChJMzIuc2l6ZSkpCisKKyAgICAgICAgaGVhZGVyX2xlbmd0aCA9IFUxNi51bnBhY2soYnVmZmVyLnJlYWQoVTE2LnNpemUpKVswXSAqIDQKKyAgICAgICAgZW5kX29mX2hlYWRlcnMgPSBidWZmZXIudGVsbCgpICsgaGVhZGVyX2xlbmd0aAorICAgICAgICBpZiBlbmRfb2ZfaGVhZGVycyA+IGxlbihidWZmZXIuZ2V0dmFsdWUoKSk6CisgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uU0laRV9MSU1JVCwKKyAgICAgICAgICAgICAgICAiSGVhZGVyIHNpemUgaXMgbGFyZ2VyIHRoYW4gd2hvbGUgZnJhbWUuIiwKKyAgICAgICAgICAgICkKKworICAgICAgICBzZWxmLl9wcm90b2NvbF9pZCA9IHJlYWRWYXJpbnQoYnVmZmVyX3RyYW5zcG9ydCkKKworICAgICAgICB0cmFuc2Zvcm1zID0gW10KKyAgICAgICAgdHJhbnNmb3JtX2NvdW50ID0gcmVhZFZhcmludChidWZmZXJfdHJhbnNwb3J0KQorICAgICAgICBmb3IgXyBpbiByYW5nZSh0cmFuc2Zvcm1fY291bnQpOgorICAgICAgICAgICAgdHJhbnNmb3JtX2lkID0gcmVhZFZhcmludChidWZmZXJfdHJhbnNwb3J0KQorICAgICAgICAgICAgaWYgdHJhbnNmb3JtX2lkIG5vdCBpbiBSRUFEX1RSQU5TRk9STVNfQllfSUQ6CisgICAgICAgICAgICAgICAgcmFpc2UgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBUQXBwbGljYXRpb25FeGNlcHRpb24uSU5WQUxJRF9UUkFOU0ZPUk0sCisgICAgICAgICAgICAgICAgICAgICJVbmtub3duIHRyYW5zZm9ybTogJWQiICUgdHJhbnNmb3JtX2lkLAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIHRyYW5zZm9ybXMuYXBwZW5kKHRyYW5zZm9ybV9pZCkKKyAgICAgICAgdHJhbnNmb3Jtcy5yZXZlcnNlKCkKKworICAgICAgICBoZWFkZXJzID0ge30KKyAgICAgICAgd2hpbGUgYnVmZmVyLnRlbGwoKSA8IGVuZF9vZl9oZWFkZXJzOgorICAgICAgICAgICAgaGVhZGVyX3R5cGUgPSByZWFkVmFyaW50KGJ1ZmZlcl90cmFuc3BvcnQpCisgICAgICAgICAgICBpZiBoZWFkZXJfdHlwZSA9PSBUSW5mb0hlYWRlclR5cGUuS0VZX1ZBTFVFOgorICAgICAgICAgICAgICAgIGNvdW50ID0gcmVhZFZhcmludChidWZmZXJfdHJhbnNwb3J0KQorICAgICAgICAgICAgICAgIGZvciBfIGluIHJhbmdlKGNvdW50KToKKyAgICAgICAgICAgICAgICAgICAga2V5ID0gX3JlYWRTdHJpbmcoYnVmZmVyX3RyYW5zcG9ydCkKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBfcmVhZFN0cmluZyhidWZmZXJfdHJhbnNwb3J0KQorICAgICAgICAgICAgICAgICAgICBoZWFkZXJzW2tleV0gPSB2YWx1ZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBicmVhayAgIyBpZ25vcmUgdW5rbm93biBoZWFkZXJzCisgICAgICAgIHNlbGYuX3JlYWRfaGVhZGVycyA9IGhlYWRlcnMKKworICAgICAgICAjIHNraXAgcGFkZGluZyAvIGFueXRoaW5nIHdlIGRpZG4ndCB1bmRlcnN0YW5kCisgICAgICAgIGJ1ZmZlci5zZWVrKGVuZF9vZl9oZWFkZXJzKQorCisgICAgICAgIHBheWxvYWQgPSBidWZmZXIucmVhZCgpCisgICAgICAgIGZvciB0cmFuc2Zvcm1faWQgaW4gdHJhbnNmb3JtczoKKyAgICAgICAgICAgIHRyYW5zZm9ybV9mbiA9IFJFQURfVFJBTlNGT1JNU19CWV9JRFt0cmFuc2Zvcm1faWRdCisgICAgICAgICAgICBwYXlsb2FkID0gdHJhbnNmb3JtX2ZuKHBheWxvYWQpCisgICAgICAgIHJldHVybiBCdWZmZXJJTyhwYXlsb2FkKQorCisgICAgZGVmIHdyaXRlKHNlbGYsIGJ1Zik6CisgICAgICAgIHNlbGYuX3dyaXRlX2J1ZmZlci53cml0ZShidWYpCisKKyAgICBkZWYgZmx1c2goc2VsZik6CisgICAgICAgIHBheWxvYWQgPSBzZWxmLl93cml0ZV9idWZmZXIuZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLl93cml0ZV9idWZmZXIgPSBCdWZmZXJJTygpCisKKyAgICAgICAgYnVmZmVyID0gQnVmZmVySU8oKQorICAgICAgICBpZiBzZWxmLl9jbGllbnRfdHlwZSA9PSBUSGVhZGVyQ2xpZW50VHlwZS5IRUFERVJTOgorICAgICAgICAgICAgZm9yIHRyYW5zZm9ybV9pZCBpbiBzZWxmLl93cml0ZV90cmFuc2Zvcm1zOgorICAgICAgICAgICAgICAgIHRyYW5zZm9ybV9mbiA9IFdSSVRFX1RSQU5TRk9STVNfQllfSURbdHJhbnNmb3JtX2lkXQorICAgICAgICAgICAgICAgIHBheWxvYWQgPSB0cmFuc2Zvcm1fZm4ocGF5bG9hZCkKKworICAgICAgICAgICAgaGVhZGVycyA9IEJ1ZmZlcklPKCkKKyAgICAgICAgICAgIHdyaXRlVmFyaW50KGhlYWRlcnMsIHNlbGYuX3Byb3RvY29sX2lkKQorICAgICAgICAgICAgd3JpdGVWYXJpbnQoaGVhZGVycywgbGVuKHNlbGYuX3dyaXRlX3RyYW5zZm9ybXMpKQorICAgICAgICAgICAgZm9yIHRyYW5zZm9ybV9pZCBpbiBzZWxmLl93cml0ZV90cmFuc2Zvcm1zOgorICAgICAgICAgICAgICAgIHdyaXRlVmFyaW50KGhlYWRlcnMsIHRyYW5zZm9ybV9pZCkKKyAgICAgICAgICAgIGlmIHNlbGYuX3dyaXRlX2hlYWRlcnM6CisgICAgICAgICAgICAgICAgd3JpdGVWYXJpbnQoaGVhZGVycywgVEluZm9IZWFkZXJUeXBlLktFWV9WQUxVRSkKKyAgICAgICAgICAgICAgICB3cml0ZVZhcmludChoZWFkZXJzLCBsZW4oc2VsZi5fd3JpdGVfaGVhZGVycykpCisgICAgICAgICAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gc2VsZi5fd3JpdGVfaGVhZGVycy5pdGVtcygpOgorICAgICAgICAgICAgICAgICAgICBfd3JpdGVTdHJpbmcoaGVhZGVycywga2V5KQorICAgICAgICAgICAgICAgICAgICBfd3JpdGVTdHJpbmcoaGVhZGVycywgdmFsdWUpCisgICAgICAgICAgICAgICAgc2VsZi5fd3JpdGVfaGVhZGVycyA9IHt9CisgICAgICAgICAgICBwYWRkaW5nX25lZWRlZCA9ICg0IC0gKGxlbihoZWFkZXJzLmdldHZhbHVlKCkpICUgNCkpICUgNAorICAgICAgICAgICAgaGVhZGVycy53cml0ZShiIlx4MDAiICogcGFkZGluZ19uZWVkZWQpCisgICAgICAgICAgICBoZWFkZXJfYnl0ZXMgPSBoZWFkZXJzLmdldHZhbHVlKCkKKworICAgICAgICAgICAgYnVmZmVyLndyaXRlKEkzMi5wYWNrKDEwICsgbGVuKGhlYWRlcl9ieXRlcykgKyBsZW4ocGF5bG9hZCkpKQorICAgICAgICAgICAgYnVmZmVyLndyaXRlKFUxNi5wYWNrKEhFQURFUl9NQUdJQykpCisgICAgICAgICAgICBidWZmZXIud3JpdGUoVTE2LnBhY2soc2VsZi5mbGFncykpCisgICAgICAgICAgICBidWZmZXIud3JpdGUoSTMyLnBhY2soc2VsZi5zZXF1ZW5jZV9pZCkpCisgICAgICAgICAgICBidWZmZXIud3JpdGUoVTE2LnBhY2sobGVuKGhlYWRlcl9ieXRlcykgLy8gNCkpCisgICAgICAgICAgICBidWZmZXIud3JpdGUoaGVhZGVyX2J5dGVzKQorICAgICAgICAgICAgYnVmZmVyLndyaXRlKHBheWxvYWQpCisgICAgICAgIGVsaWYgc2VsZi5fY2xpZW50X3R5cGUgaW4gKFRIZWFkZXJDbGllbnRUeXBlLkZSQU1FRF9CSU5BUlksIFRIZWFkZXJDbGllbnRUeXBlLkZSQU1FRF9DT01QQUNUKToKKyAgICAgICAgICAgIGJ1ZmZlci53cml0ZShJMzIucGFjayhsZW4ocGF5bG9hZCkpKQorICAgICAgICAgICAgYnVmZmVyLndyaXRlKHBheWxvYWQpCisgICAgICAgIGVsaWYgc2VsZi5fY2xpZW50X3R5cGUgaW4gKFRIZWFkZXJDbGllbnRUeXBlLlVORlJBTUVEX0JJTkFSWSwgVEhlYWRlckNsaWVudFR5cGUuVU5GUkFNRURfQ09NUEFDVCk6CisgICAgICAgICAgICBidWZmZXIud3JpdGUocGF5bG9hZCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5JTlZBTElEX0NMSUVOVF9UWVBFLAorICAgICAgICAgICAgICAgICJVbmtub3duIGNsaWVudCB0eXBlLiIsCisgICAgICAgICAgICApCisKKyAgICAgICAgIyB0aGUgZnJhbWUgbGVuZ3RoIGZpZWxkIGRvZXNuJ3QgY291bnQgdG93YXJkcyB0aGUgZnJhbWUgcGF5bG9hZCBzaXplCisgICAgICAgIGZyYW1lX2J5dGVzID0gYnVmZmVyLmdldHZhbHVlKCkKKyAgICAgICAgZnJhbWVfcGF5bG9hZF9zaXplID0gbGVuKGZyYW1lX2J5dGVzKSAtIDQKKyAgICAgICAgaWYgZnJhbWVfcGF5bG9hZF9zaXplID4gc2VsZi5fbWF4X2ZyYW1lX3NpemU6CisgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uU0laRV9MSU1JVCwKKyAgICAgICAgICAgICAgICAiQXR0ZW1wdGluZyB0byBzZW5kIGZyYW1lIHRoYXQgaXMgdG9vIGxhcmdlLiIsCisgICAgICAgICAgICApCisKKyAgICAgICAgc2VsZi5fdHJhbnNwb3J0LndyaXRlKGZyYW1lX2J5dGVzKQorICAgICAgICBzZWxmLl90cmFuc3BvcnQuZmx1c2goKQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIGNzdHJpbmdpb19idWYoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9yZWFkX2J1ZmZlcgorCisgICAgZGVmIGNzdHJpbmdpb19yZWZpbGwoc2VsZiwgcGFydGlhbHJlYWQsIHJlcWxlbik6CisgICAgICAgIHJlc3VsdCA9IGJ5dGVhcnJheShwYXJ0aWFscmVhZCkKKyAgICAgICAgd2hpbGUgbGVuKHJlc3VsdCkgPCByZXFsZW46CisgICAgICAgICAgICByZXN1bHQgKz0gc2VsZi5yZWFkKHJlcWxlbiAtIGxlbihyZXN1bHQpKQorICAgICAgICBzZWxmLl9yZWFkX2J1ZmZlciA9IEJ1ZmZlcklPKHJlc3VsdCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX3JlYWRfYnVmZmVyCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3RyYW5zcG9ydC9USHR0cENsaWVudC5weSBiL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LnB5CmluZGV4IDU4NTFmYTIuLjM3YjBhNGQgMTAwNjQ0Ci0tLSBhL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LnB5CisrKyBiL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LnB5CkBAIC0xNywxMzUgKzE3LDE3MSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotaW1wb3J0IGh0dHBsaWIKK2Zyb20gaW8gaW1wb3J0IEJ5dGVzSU8KIGltcG9ydCBvcwotaW1wb3J0IHNvY2tldAoraW1wb3J0IHNzbAogaW1wb3J0IHN5cwotaW1wb3J0IHVybGxpYgotaW1wb3J0IHVybHBhcnNlCiBpbXBvcnQgd2FybmluZ3MKK2ltcG9ydCBiYXNlNjQKIAotZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCitmcm9tIHNpeC5tb3ZlcyBpbXBvcnQgdXJsbGliCitmcm9tIHNpeC5tb3ZlcyBpbXBvcnQgaHR0cF9jbGllbnQKIAotZnJvbSBUVHJhbnNwb3J0IGltcG9ydCAqCitmcm9tIC5UVHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0QmFzZQoraW1wb3J0IHNpeAogCiAKIGNsYXNzIFRIdHRwQ2xpZW50KFRUcmFuc3BvcnRCYXNlKToKLSAgIiIiSHR0cCBpbXBsZW1lbnRhdGlvbiBvZiBUVHJhbnNwb3J0IGJhc2UuIiIiCisgICAgIiIiSHR0cCBpbXBsZW1lbnRhdGlvbiBvZiBUVHJhbnNwb3J0IGJhc2UuIiIiCiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsIHVyaV9vcl9ob3N0LCBwb3J0PU5vbmUsIHBhdGg9Tm9uZSk6Ci0gICAgIiIiVEh0dHBDbGllbnQgc3VwcG9ydHMgdHdvIGRpZmZlcmVudCB0eXBlcyBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzLgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB1cmlfb3JfaG9zdCwgcG9ydD1Ob25lLCBwYXRoPU5vbmUsIGNhZmlsZT1Ob25lLCBjZXJ0X2ZpbGU9Tm9uZSwga2V5X2ZpbGU9Tm9uZSwgc3NsX2NvbnRleHQ9Tm9uZSk6CisgICAgICAgICIiIlRIdHRwQ2xpZW50IHN1cHBvcnRzIHR3byBkaWZmZXJlbnQgdHlwZXMgb2YgY29uc3RydWN0aW9uOgogCi0gICAgVEh0dHBDbGllbnQoaG9zdCwgcG9ydCwgcGF0aCkgLSBkZXByZWNhdGVkCi0gICAgVEh0dHBDbGllbnQodXJpKQorICAgICAgICBUSHR0cENsaWVudChob3N0LCBwb3J0LCBwYXRoKSAtIGRlcHJlY2F0ZWQKKyAgICAgICAgVEh0dHBDbGllbnQodXJpLCBbcG9ydD08bj4sIHBhdGg9PHM+LCBjYWZpbGU9PGZpbGVuYW1lPiwgY2VydF9maWxlPTxmaWxlbmFtZT4sIGtleV9maWxlPTxmaWxlbmFtZT4sIHNzbF9jb250ZXh0PTxjb250ZXh0Pl0pCiAKLSAgICBPbmx5IHRoZSBzZWNvbmQgc3VwcG9ydHMgaHR0cHMuCi0gICAgIiIiCi0gICAgaWYgcG9ydCBpcyBub3QgTm9uZToKLSAgICAgIHdhcm5pbmdzLndhcm4oCi0gICAgICAgICJQbGVhc2UgdXNlIHRoZSBUSHR0cENsaWVudCgnaHR0cDovL2hvc3Q6cG9ydC9wYXRoJykgc3ludGF4IiwKLSAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLAotICAgICAgICBzdGFja2xldmVsPTIpCi0gICAgICBzZWxmLmhvc3QgPSB1cmlfb3JfaG9zdAotICAgICAgc2VsZi5wb3J0ID0gcG9ydAotICAgICAgYXNzZXJ0IHBhdGgKLSAgICAgIHNlbGYucGF0aCA9IHBhdGgKLSAgICAgIHNlbGYuc2NoZW1lID0gJ2h0dHAnCi0gICAgZWxzZToKLSAgICAgIHBhcnNlZCA9IHVybHBhcnNlLnVybHBhcnNlKHVyaV9vcl9ob3N0KQotICAgICAgc2VsZi5zY2hlbWUgPSBwYXJzZWQuc2NoZW1lCi0gICAgICBhc3NlcnQgc2VsZi5zY2hlbWUgaW4gKCdodHRwJywgJ2h0dHBzJykKLSAgICAgIGlmIHNlbGYuc2NoZW1lID09ICdodHRwJzoKLSAgICAgICAgc2VsZi5wb3J0ID0gcGFyc2VkLnBvcnQgb3IgaHR0cGxpYi5IVFRQX1BPUlQKLSAgICAgIGVsaWYgc2VsZi5zY2hlbWUgPT0gJ2h0dHBzJzoKLSAgICAgICAgc2VsZi5wb3J0ID0gcGFyc2VkLnBvcnQgb3IgaHR0cGxpYi5IVFRQU19QT1JUCi0gICAgICBzZWxmLmhvc3QgPSBwYXJzZWQuaG9zdG5hbWUKLSAgICAgIHNlbGYucGF0aCA9IHBhcnNlZC5wYXRoCi0gICAgICBpZiBwYXJzZWQucXVlcnk6Ci0gICAgICAgIHNlbGYucGF0aCArPSAnPyVzJyAlIHBhcnNlZC5xdWVyeQotICAgIHNlbGYuX193YnVmID0gU3RyaW5nSU8oKQotICAgIHNlbGYuX19odHRwID0gTm9uZQotICAgIHNlbGYuX190aW1lb3V0ID0gTm9uZQotICAgIHNlbGYuX19jdXN0b21faGVhZGVycyA9IE5vbmUKKyAgICAgICAgT25seSB0aGUgc2Vjb25kIHN1cHBvcnRzIGh0dHBzLiAgVG8gcHJvcGVybHkgYXV0aGVudGljYXRlIGFnYWluc3QgdGhlIHNlcnZlciwKKyAgICAgICAgcHJvdmlkZSB0aGUgY2xpZW50J3MgaWRlbnRpdHkgYnkgc3BlY2lmeWluZyBjZXJ0X2ZpbGUgYW5kIGtleV9maWxlLiAgVG8gcHJvcGVybHkKKyAgICAgICAgYXV0aGVudGljYXRlIHRoZSBzZXJ2ZXIsIHNwZWNpZnkgZWl0aGVyIGNhZmlsZSBvciBzc2xfY29udGV4dCB3aXRoIGEgQ0EgZGVmaW5lZC4KKyAgICAgICAgTk9URTogaWYgYm90aCBjYWZpbGUgYW5kIHNzbF9jb250ZXh0IGFyZSBkZWZpbmVkLCBzc2xfY29udGV4dCB3aWxsIG92ZXJyaWRlIGNhZmlsZS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHBvcnQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICB3YXJuaW5ncy53YXJuKAorICAgICAgICAgICAgICAgICJQbGVhc2UgdXNlIHRoZSBUSHR0cENsaWVudCgnaHR0cHtzfTovL2hvc3Q6cG9ydC9wYXRoJykgY29uc3RydWN0b3IiLAorICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywKKyAgICAgICAgICAgICAgICBzdGFja2xldmVsPTIpCisgICAgICAgICAgICBzZWxmLmhvc3QgPSB1cmlfb3JfaG9zdAorICAgICAgICAgICAgc2VsZi5wb3J0ID0gcG9ydAorICAgICAgICAgICAgYXNzZXJ0IHBhdGgKKyAgICAgICAgICAgIHNlbGYucGF0aCA9IHBhdGgKKyAgICAgICAgICAgIHNlbGYuc2NoZW1lID0gJ2h0dHAnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwYXJzZWQgPSB1cmxsaWIucGFyc2UudXJscGFyc2UodXJpX29yX2hvc3QpCisgICAgICAgICAgICBzZWxmLnNjaGVtZSA9IHBhcnNlZC5zY2hlbWUKKyAgICAgICAgICAgIGFzc2VydCBzZWxmLnNjaGVtZSBpbiAoJ2h0dHAnLCAnaHR0cHMnKQorICAgICAgICAgICAgaWYgc2VsZi5zY2hlbWUgPT0gJ2h0dHAnOgorICAgICAgICAgICAgICAgIHNlbGYucG9ydCA9IHBhcnNlZC5wb3J0IG9yIGh0dHBfY2xpZW50LkhUVFBfUE9SVAorICAgICAgICAgICAgZWxpZiBzZWxmLnNjaGVtZSA9PSAnaHR0cHMnOgorICAgICAgICAgICAgICAgIHNlbGYucG9ydCA9IHBhcnNlZC5wb3J0IG9yIGh0dHBfY2xpZW50LkhUVFBTX1BPUlQKKyAgICAgICAgICAgICAgICBzZWxmLmNlcnRmaWxlID0gY2VydF9maWxlCisgICAgICAgICAgICAgICAgc2VsZi5rZXlmaWxlID0ga2V5X2ZpbGUKKyAgICAgICAgICAgICAgICBzZWxmLmNvbnRleHQgPSBzc2wuY3JlYXRlX2RlZmF1bHRfY29udGV4dChjYWZpbGU9Y2FmaWxlKSBpZiAoY2FmaWxlIGFuZCBub3Qgc3NsX2NvbnRleHQpIGVsc2Ugc3NsX2NvbnRleHQKKyAgICAgICAgICAgIHNlbGYuaG9zdCA9IHBhcnNlZC5ob3N0bmFtZQorICAgICAgICAgICAgc2VsZi5wYXRoID0gcGFyc2VkLnBhdGgKKyAgICAgICAgICAgIGlmIHBhcnNlZC5xdWVyeToKKyAgICAgICAgICAgICAgICBzZWxmLnBhdGggKz0gJz8lcycgJSBwYXJzZWQucXVlcnkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcHJveHkgPSB1cmxsaWIucmVxdWVzdC5nZXRwcm94aWVzKClbc2VsZi5zY2hlbWVdCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHByb3h5ID0gTm9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgdXJsbGliLnJlcXVlc3QucHJveHlfYnlwYXNzKHNlbGYuaG9zdCk6CisgICAgICAgICAgICAgICAgcHJveHkgPSBOb25lCisgICAgICAgIGlmIHByb3h5OgorICAgICAgICAgICAgcGFyc2VkID0gdXJsbGliLnBhcnNlLnVybHBhcnNlKHByb3h5KQorICAgICAgICAgICAgc2VsZi5yZWFsaG9zdCA9IHNlbGYuaG9zdAorICAgICAgICAgICAgc2VsZi5yZWFscG9ydCA9IHNlbGYucG9ydAorICAgICAgICAgICAgc2VsZi5ob3N0ID0gcGFyc2VkLmhvc3RuYW1lCisgICAgICAgICAgICBzZWxmLnBvcnQgPSBwYXJzZWQucG9ydAorICAgICAgICAgICAgc2VsZi5wcm94eV9hdXRoID0gc2VsZi5iYXNpY19wcm94eV9hdXRoX2hlYWRlcihwYXJzZWQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnJlYWxob3N0ID0gc2VsZi5yZWFscG9ydCA9IHNlbGYucHJveHlfYXV0aCA9IE5vbmUKKyAgICAgICAgc2VsZi5fX3didWYgPSBCeXRlc0lPKCkKKyAgICAgICAgc2VsZi5fX2h0dHAgPSBOb25lCisgICAgICAgIHNlbGYuX19odHRwX3Jlc3BvbnNlID0gTm9uZQorICAgICAgICBzZWxmLl9fdGltZW91dCA9IE5vbmUKKyAgICAgICAgc2VsZi5fX2N1c3RvbV9oZWFkZXJzID0gTm9uZQogCi0gIGRlZiBvcGVuKHNlbGYpOgotICAgIGlmIHNlbGYuc2NoZW1lID09ICdodHRwJzoKLSAgICAgIHNlbGYuX19odHRwID0gaHR0cGxpYi5IVFRQKHNlbGYuaG9zdCwgc2VsZi5wb3J0KQotICAgIGVsc2U6Ci0gICAgICBzZWxmLl9faHR0cCA9IGh0dHBsaWIuSFRUUFMoc2VsZi5ob3N0LCBzZWxmLnBvcnQpCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBiYXNpY19wcm94eV9hdXRoX2hlYWRlcihwcm94eSk6CisgICAgICAgIGlmIHByb3h5IGlzIE5vbmUgb3Igbm90IHByb3h5LnVzZXJuYW1lOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgYXAgPSAiJXM6JXMiICUgKHVybGxpYi5wYXJzZS51bnF1b3RlKHByb3h5LnVzZXJuYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVybGxpYi5wYXJzZS51bnF1b3RlKHByb3h5LnBhc3N3b3JkKSkKKyAgICAgICAgY3IgPSBiYXNlNjQuYjY0ZW5jb2RlKGFwKS5zdHJpcCgpCisgICAgICAgIHJldHVybiAiQmFzaWMgIiArIGNyCiAKLSAgZGVmIGNsb3NlKHNlbGYpOgotICAgIHNlbGYuX19odHRwLmNsb3NlKCkKLSAgICBzZWxmLl9faHR0cCA9IE5vbmUKKyAgICBkZWYgdXNpbmdfcHJveHkoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnJlYWxob3N0IGlzIG5vdCBOb25lCiAKLSAgZGVmIGlzT3BlbihzZWxmKToKLSAgICByZXR1cm4gc2VsZi5fX2h0dHAgaXMgbm90IE5vbmUKKyAgICBkZWYgb3BlbihzZWxmKToKKyAgICAgICAgaWYgc2VsZi5zY2hlbWUgPT0gJ2h0dHAnOgorICAgICAgICAgICAgc2VsZi5fX2h0dHAgPSBodHRwX2NsaWVudC5IVFRQQ29ubmVjdGlvbihzZWxmLmhvc3QsIHNlbGYucG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dD1zZWxmLl9fdGltZW91dCkKKyAgICAgICAgZWxpZiBzZWxmLnNjaGVtZSA9PSAnaHR0cHMnOgorICAgICAgICAgICAgc2VsZi5fX2h0dHAgPSBodHRwX2NsaWVudC5IVFRQU0Nvbm5lY3Rpb24oc2VsZi5ob3N0LCBzZWxmLnBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfZmlsZT1zZWxmLmtleWZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X2ZpbGU9c2VsZi5jZXJ0ZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ9c2VsZi5fX3RpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0PXNlbGYuY29udGV4dCkKKyAgICAgICAgaWYgc2VsZi51c2luZ19wcm94eSgpOgorICAgICAgICAgICAgc2VsZi5fX2h0dHAuc2V0X3R1bm5lbChzZWxmLnJlYWxob3N0LCBzZWxmLnJlYWxwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IlByb3h5LUF1dGhvcml6YXRpb24iOiBzZWxmLnByb3h5X2F1dGh9KQogCi0gIGRlZiBzZXRUaW1lb3V0KHNlbGYsIG1zKToKLSAgICBpZiBub3QgaGFzYXR0cihzb2NrZXQsICdnZXRkZWZhdWx0dGltZW91dCcpOgotICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5fX2h0dHAuY2xvc2UoKQorICAgICAgICBzZWxmLl9faHR0cCA9IE5vbmUKKyAgICAgICAgc2VsZi5fX2h0dHBfcmVzcG9uc2UgPSBOb25lCiAKLSAgICBpZiBtcyBpcyBOb25lOgotICAgICAgc2VsZi5fX3RpbWVvdXQgPSBOb25lCi0gICAgZWxzZToKLSAgICAgIHNlbGYuX190aW1lb3V0ID0gbXMgLyAxMDAwLjAKKyAgICBkZWYgaXNPcGVuKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX2h0dHAgaXMgbm90IE5vbmUKIAotICBkZWYgc2V0Q3VzdG9tSGVhZGVycyhzZWxmLCBoZWFkZXJzKToKLSAgICBzZWxmLl9fY3VzdG9tX2hlYWRlcnMgPSBoZWFkZXJzCisgICAgZGVmIHNldFRpbWVvdXQoc2VsZiwgbXMpOgorICAgICAgICBpZiBtcyBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5fX3RpbWVvdXQgPSBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9fdGltZW91dCA9IG1zIC8gMTAwMC4wCiAKLSAgZGVmIHJlYWQoc2VsZiwgc3opOgotICAgIHJldHVybiBzZWxmLl9faHR0cC5maWxlLnJlYWQoc3opCisgICAgZGVmIHNldEN1c3RvbUhlYWRlcnMoc2VsZiwgaGVhZGVycyk6CisgICAgICAgIHNlbGYuX19jdXN0b21faGVhZGVycyA9IGhlYWRlcnMKIAotICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKLSAgICBzZWxmLl9fd2J1Zi53cml0ZShidWYpCisgICAgZGVmIHJlYWQoc2VsZiwgc3opOgorICAgICAgICByZXR1cm4gc2VsZi5fX2h0dHBfcmVzcG9uc2UucmVhZChzeikKIAotICBkZWYgX193aXRoVGltZW91dChmKToKLSAgICBkZWYgX2YoKmFyZ3MsICoqa3dhcmdzKToKLSAgICAgIG9yaWdfdGltZW91dCA9IHNvY2tldC5nZXRkZWZhdWx0dGltZW91dCgpCi0gICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQoYXJnc1swXS5fX3RpbWVvdXQpCi0gICAgICB0cnk6Ci0gICAgICAgIHJlc3VsdCA9IGYoKmFyZ3MsICoqa3dhcmdzKQotICAgICAgZmluYWxseToKLSAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KG9yaWdfdGltZW91dCkKLSAgICAgIHJldHVybiByZXN1bHQKLSAgICByZXR1cm4gX2YKKyAgICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKKyAgICAgICAgc2VsZi5fX3didWYud3JpdGUoYnVmKQogCi0gIGRlZiBmbHVzaChzZWxmKToKLSAgICBpZiBzZWxmLmlzT3BlbigpOgotICAgICAgc2VsZi5jbG9zZSgpCi0gICAgc2VsZi5vcGVuKCkKKyAgICBkZWYgZmx1c2goc2VsZik6CisgICAgICAgIGlmIHNlbGYuaXNPcGVuKCk6CisgICAgICAgICAgICBzZWxmLmNsb3NlKCkKKyAgICAgICAgc2VsZi5vcGVuKCkKIAotICAgICMgUHVsbCBkYXRhIG91dCBvZiBidWZmZXIKLSAgICBkYXRhID0gc2VsZi5fX3didWYuZ2V0dmFsdWUoKQotICAgIHNlbGYuX193YnVmID0gU3RyaW5nSU8oKQorICAgICAgICAjIFB1bGwgZGF0YSBvdXQgb2YgYnVmZmVyCisgICAgICAgIGRhdGEgPSBzZWxmLl9fd2J1Zi5nZXR2YWx1ZSgpCisgICAgICAgIHNlbGYuX193YnVmID0gQnl0ZXNJTygpCiAKLSAgICAjIEhUVFAgcmVxdWVzdAotICAgIHNlbGYuX19odHRwLnB1dHJlcXVlc3QoJ1BPU1QnLCBzZWxmLnBhdGgpCisgICAgICAgICMgSFRUUCByZXF1ZXN0CisgICAgICAgIGlmIHNlbGYudXNpbmdfcHJveHkoKSBhbmQgc2VsZi5zY2hlbWUgPT0gImh0dHAiOgorICAgICAgICAgICAgIyBuZWVkIGZ1bGwgVVJMIG9mIHJlYWwgaG9zdCBmb3IgSFRUUCBwcm94eSBoZXJlIChIVFRQUyB1c2VzIENPTk5FQ1QgdHVubmVsKQorICAgICAgICAgICAgc2VsZi5fX2h0dHAucHV0cmVxdWVzdCgnUE9TVCcsICJodHRwOi8vJXM6JXMlcyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi5yZWFsaG9zdCwgc2VsZi5yZWFscG9ydCwgc2VsZi5wYXRoKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX19odHRwLnB1dHJlcXVlc3QoJ1BPU1QnLCBzZWxmLnBhdGgpCiAKLSAgICAjIFdyaXRlIGhlYWRlcnMKLSAgICBzZWxmLl9faHR0cC5wdXRoZWFkZXIoJ0hvc3QnLCBzZWxmLmhvc3QpCi0gICAgc2VsZi5fX2h0dHAucHV0aGVhZGVyKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24veC10aHJpZnQnKQotICAgIHNlbGYuX19odHRwLnB1dGhlYWRlcignQ29udGVudC1MZW5ndGgnLCBzdHIobGVuKGRhdGEpKSkKKyAgICAgICAgIyBXcml0ZSBoZWFkZXJzCisgICAgICAgIHNlbGYuX19odHRwLnB1dGhlYWRlcignQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL3gtdGhyaWZ0JykKKyAgICAgICAgc2VsZi5fX2h0dHAucHV0aGVhZGVyKCdDb250ZW50LUxlbmd0aCcsIHN0cihsZW4oZGF0YSkpKQorICAgICAgICBpZiBzZWxmLnVzaW5nX3Byb3h5KCkgYW5kIHNlbGYuc2NoZW1lID09ICJodHRwIiBhbmQgc2VsZi5wcm94eV9hdXRoIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5fX2h0dHAucHV0aGVhZGVyKCJQcm94eS1BdXRob3JpemF0aW9uIiwgc2VsZi5wcm94eV9hdXRoKQogCi0gICAgaWYgbm90IHNlbGYuX19jdXN0b21faGVhZGVycyBvciAnVXNlci1BZ2VudCcgbm90IGluIHNlbGYuX19jdXN0b21faGVhZGVyczoKLSAgICAgIHVzZXJfYWdlbnQgPSAnUHl0aG9uL1RIdHRwQ2xpZW50JwotICAgICAgc2NyaXB0ID0gb3MucGF0aC5iYXNlbmFtZShzeXMuYXJndlswXSkKLSAgICAgIGlmIHNjcmlwdDoKLSAgICAgICAgdXNlcl9hZ2VudCA9ICclcyAoJXMpJyAlICh1c2VyX2FnZW50LCB1cmxsaWIucXVvdGUoc2NyaXB0KSkKLSAgICAgIHNlbGYuX19odHRwLnB1dGhlYWRlcignVXNlci1BZ2VudCcsIHVzZXJfYWdlbnQpCisgICAgICAgIGlmIG5vdCBzZWxmLl9fY3VzdG9tX2hlYWRlcnMgb3IgJ1VzZXItQWdlbnQnIG5vdCBpbiBzZWxmLl9fY3VzdG9tX2hlYWRlcnM6CisgICAgICAgICAgICB1c2VyX2FnZW50ID0gJ1B5dGhvbi9USHR0cENsaWVudCcKKyAgICAgICAgICAgIHNjcmlwdCA9IG9zLnBhdGguYmFzZW5hbWUoc3lzLmFyZ3ZbMF0pCisgICAgICAgICAgICBpZiBzY3JpcHQ6CisgICAgICAgICAgICAgICAgdXNlcl9hZ2VudCA9ICclcyAoJXMpJyAlICh1c2VyX2FnZW50LCB1cmxsaWIucGFyc2UucXVvdGUoc2NyaXB0KSkKKyAgICAgICAgICAgIHNlbGYuX19odHRwLnB1dGhlYWRlcignVXNlci1BZ2VudCcsIHVzZXJfYWdlbnQpCiAKLSAgICBpZiBzZWxmLl9fY3VzdG9tX2hlYWRlcnM6Ci0gICAgICAgIGZvciBrZXksIHZhbCBpbiBzZWxmLl9fY3VzdG9tX2hlYWRlcnMuaXRlcml0ZW1zKCk6Ci0gICAgICAgICAgICBzZWxmLl9faHR0cC5wdXRoZWFkZXIoa2V5LCB2YWwpCisgICAgICAgIGlmIHNlbGYuX19jdXN0b21faGVhZGVyczoKKyAgICAgICAgICAgIGZvciBrZXksIHZhbCBpbiBzaXguaXRlcml0ZW1zKHNlbGYuX19jdXN0b21faGVhZGVycyk6CisgICAgICAgICAgICAgICAgc2VsZi5fX2h0dHAucHV0aGVhZGVyKGtleSwgdmFsKQogCi0gICAgc2VsZi5fX2h0dHAuZW5kaGVhZGVycygpCisgICAgICAgIHNlbGYuX19odHRwLmVuZGhlYWRlcnMoKQogCi0gICAgIyBXcml0ZSBwYXlsb2FkCi0gICAgc2VsZi5fX2h0dHAuc2VuZChkYXRhKQorICAgICAgICAjIFdyaXRlIHBheWxvYWQKKyAgICAgICAgc2VsZi5fX2h0dHAuc2VuZChkYXRhKQogCi0gICAgIyBHZXQgcmVwbHkgdG8gZmx1c2ggdGhlIHJlcXVlc3QKLSAgICBzZWxmLmNvZGUsIHNlbGYubWVzc2FnZSwgc2VsZi5oZWFkZXJzID0gc2VsZi5fX2h0dHAuZ2V0cmVwbHkoKQotCi0gICMgRGVjb3JhdGUgaWYgd2Uga25vdyBob3cgdG8gdGltZW91dAotICBpZiBoYXNhdHRyKHNvY2tldCwgJ2dldGRlZmF1bHR0aW1lb3V0Jyk6Ci0gICAgZmx1c2ggPSBfX3dpdGhUaW1lb3V0KGZsdXNoKQorICAgICAgICAjIEdldCByZXBseSB0byBmbHVzaCB0aGUgcmVxdWVzdAorICAgICAgICBzZWxmLl9faHR0cF9yZXNwb25zZSA9IHNlbGYuX19odHRwLmdldHJlc3BvbnNlKCkKKyAgICAgICAgc2VsZi5jb2RlID0gc2VsZi5fX2h0dHBfcmVzcG9uc2Uuc3RhdHVzCisgICAgICAgIHNlbGYubWVzc2FnZSA9IHNlbGYuX19odHRwX3Jlc3BvbnNlLnJlYXNvbgorICAgICAgICBzZWxmLmhlYWRlcnMgPSBzZWxmLl9faHR0cF9yZXNwb25zZS5tc2cKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXQucHkgYi9saWIvcHkvc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0LnB5CmluZGV4IDZhZDhkNTAuLmI1NGNhNWQgMTAwNjQ0Ci0tLSBhL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXQucHkKKysrIGIvbGliL3B5L3NyYy90cmFuc3BvcnQvVFNTTFNvY2tldC5weQpAQCAtMTcsMjExICsxNywzODAgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKK2ltcG9ydCBsb2dnaW5nCiBpbXBvcnQgb3MKIGltcG9ydCBzb2NrZXQKIGltcG9ydCBzc2wKK2ltcG9ydCBzeXMKK2ltcG9ydCB3YXJuaW5ncwogCitmcm9tIC5zc2xjb21wYXQgaW1wb3J0IF9tYXRjaF9ob3N0bmFtZSwgX21hdGNoX2hhc19pcGFkZHJlc3MKIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFNvY2tldAogZnJvbSB0aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnRFeGNlcHRpb24KIAorbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCit3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygKKyAgICAnZGVmYXVsdCcsIGNhdGVnb3J5PURlcHJlY2F0aW9uV2FybmluZywgbW9kdWxlPV9fbmFtZV9fKQogCi1jbGFzcyBUU1NMU29ja2V0KFRTb2NrZXQuVFNvY2tldCk6Ci0gICIiIgotICBTU0wgaW1wbGVtZW50YXRpb24gb2YgY2xpZW50LXNpZGUgVFNvY2tldAogCi0gIFRoaXMgY2xhc3MgY3JlYXRlcyBvdXRib3VuZCBzb2NrZXRzIHdyYXBwZWQgdXNpbmcgdGhlCi0gIHB5dGhvbiBzdGFuZGFyZCBzc2wgbW9kdWxlIGZvciBlbmNyeXB0ZWQgY29ubmVjdGlvbnMuCitjbGFzcyBUU1NMQmFzZShvYmplY3QpOgorICAgICMgU1NMQ29udGV4dCBpcyBub3QgYXZhaWxhYmxlIGZvciBQeXRob24gPCAyLjcuOQorICAgIF9oYXNfc3NsX2NvbnRleHQgPSBzeXMuaGV4dmVyc2lvbiA+PSAweDAyMDcwOUYwCiAKLSAgVGhlIHByb3RvY29sIHVzZWQgaXMgc2V0IHVzaW5nIHRoZSBjbGFzcyB2YXJpYWJsZQotICBTU0xfVkVSU0lPTiwgd2hpY2ggbXVzdCBiZSBvbmUgb2Ygc3NsLlBST1RPQ09MXyogYW5kCi0gIGRlZmF1bHRzIHRvICBzc2wuUFJPVE9DT0xfVExTdjEgZm9yIGdyZWF0ZXN0IHNlY3VyaXR5LgotICAiIiIKLSAgU1NMX1ZFUlNJT04gPSBzc2wuUFJPVE9DT0xfVExTdjEKKyAgICAjIGNpcGhlcnMgYXJndW1lbnQgaXMgbm90IGF2YWlsYWJsZSBmb3IgUHl0aG9uIDwgMi43LjAKKyAgICBfaGFzX2NpcGhlcnMgPSBzeXMuaGV4dmVyc2lvbiA+PSAweDAyMDcwMEYwCiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsCi0gICAgICAgICAgICAgICBob3N0PSdsb2NhbGhvc3QnLAotICAgICAgICAgICAgICAgcG9ydD05MDkwLAotICAgICAgICAgICAgICAgdmFsaWRhdGU9VHJ1ZSwKLSAgICAgICAgICAgICAgIGNhX2NlcnRzPU5vbmUsCi0gICAgICAgICAgICAgICBrZXlmaWxlPU5vbmUsCi0gICAgICAgICAgICAgICBjZXJ0ZmlsZT1Ob25lLAotICAgICAgICAgICAgICAgdW5peF9zb2NrZXQ9Tm9uZSwKLSAgICAgICAgICAgICAgIGNpcGhlcnM9Tm9uZSk6Ci0gICAgIiIiQ3JlYXRlIFNTTCBUU29ja2V0CisgICAgIyBGb3IgcHl0aG9uID49IDIuNy45LCB1c2UgbGF0ZXN0IFRMUyB0aGF0IGJvdGggY2xpZW50IGFuZCBzZXJ2ZXIKKyAgICAjIHN1cHBvcnRzLgorICAgICMgU1NMIDIuMCBhbmQgMy4wIGFyZSBkaXNhYmxlZCB2aWEgc3NsLk9QX05PX1NTTHYyIGFuZCBzc2wuT1BfTk9fU1NMdjMuCisgICAgIyBGb3IgcHl0aG9uIDwgMi43LjksIHVzZSBUTFMgMS4wIHNpbmNlIFRMU3YxX1ggbm9yIE9QX05PX1NTTHZYIGlzCisgICAgIyB1bmF2YWlsYWJsZS4KKyAgICBfZGVmYXVsdF9wcm90b2NvbCA9IHNzbC5QUk9UT0NPTF9TU0x2MjMgaWYgX2hhc19zc2xfY29udGV4dCBlbHNlIFwKKyAgICAgICAgc3NsLlBST1RPQ09MX1RMU3YxCiAKLSAgICBAcGFyYW0gdmFsaWRhdGU6IFNldCB0byBGYWxzZSB0byBkaXNhYmxlIFNTTCBjZXJ0aWZpY2F0ZSB2YWxpZGF0aW9uCi0gICAgQHR5cGUgdmFsaWRhdGU6IGJvb2wKLSAgICBAcGFyYW0gY2FfY2VydHM6IEZpbGVuYW1lIHRvIHRoZSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgcGVtIGZpbGUsIHBvc3NpYmx5IGEKLSAgICBmaWxlIGRvd25sb2FkZWQgZnJvbTogaHR0cDovL2N1cmwuaGF4eC5zZS9jYS9jYWNlcnQucGVtICBUaGlzIGlzIHBhc3NlZCB0bwotICAgIHRoZSBzc2xfd3JhcCBmdW5jdGlvbiBhcyB0aGUgJ2NhX2NlcnRzJyBwYXJhbWV0ZXIuCi0gICAgQHR5cGUgY2FfY2VydHM6IHN0cgotICAgIEBwYXJhbSBrZXlmaWxlOiBUaGUgcHJpdmF0ZSBrZXkKLSAgICBAdHlwZSBrZXlmaWxlOiBzdHIKLSAgICBAcGFyYW0gY2VydGZpbGU6IFRoZSBjZXJ0IGZpbGUKLSAgICBAdHlwZSBjZXJ0ZmlsZTogc3RyCi0gICAgQHBhcmFtIGNpcGhlcnM6IFRoZSBjaXBoZXIgc3VpdGVzIHRvIGFsbG93LiBUaGlzIGlzIHBhc3NlZCB0bwotICAgICAgICAgICAgICAgICAgICB0aGUgc3NsX3dyYXAgZnVuY3Rpb24gYXMgdGhlICdjaXBoZXJzJyBwYXJhbWV0ZXIuCi0gICAgQHR5cGUgY2lwaGVyczogc3RyCi0gICAgCi0gICAgUmFpc2VzIGFuIElPRXJyb3IgZXhjZXB0aW9uIGlmIHZhbGlkYXRlIGlzIFRydWUgYW5kIHRoZSBjYV9jZXJ0cyBmaWxlIGlzCi0gICAgTm9uZSwgbm90IHByZXNlbnQgb3IgdW5yZWFkYWJsZS4KKyAgICBkZWYgX2luaXRfY29udGV4dChzZWxmLCBzc2xfdmVyc2lvbik6CisgICAgICAgIGlmIHNlbGYuX2hhc19zc2xfY29udGV4dDoKKyAgICAgICAgICAgIHNlbGYuX2NvbnRleHQgPSBzc2wuU1NMQ29udGV4dChzc2xfdmVyc2lvbikKKyAgICAgICAgICAgIGlmIHNlbGYuX2NvbnRleHQucHJvdG9jb2wgPT0gc3NsLlBST1RPQ09MX1NTTHYyMzoKKyAgICAgICAgICAgICAgICBzZWxmLl9jb250ZXh0Lm9wdGlvbnMgfD0gc3NsLk9QX05PX1NTTHYyCisgICAgICAgICAgICAgICAgc2VsZi5fY29udGV4dC5vcHRpb25zIHw9IHNzbC5PUF9OT19TU0x2MworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fY29udGV4dCA9IE5vbmUKKyAgICAgICAgICAgIHNlbGYuX3NzbF92ZXJzaW9uID0gc3NsX3ZlcnNpb24KKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBfc2hvdWxkX3ZlcmlmeShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5faGFzX3NzbF9jb250ZXh0OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NvbnRleHQudmVyaWZ5X21vZGUgIT0gc3NsLkNFUlRfTk9ORQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2VydF9yZXFzICE9IHNzbC5DRVJUX05PTkUKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBzc2xfdmVyc2lvbihzZWxmKToKKyAgICAgICAgaWYgc2VsZi5faGFzX3NzbF9jb250ZXh0OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuc3NsX2NvbnRleHQucHJvdG9jb2wKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9zc2xfdmVyc2lvbgorCisgICAgQHByb3BlcnR5CisgICAgZGVmIHNzbF9jb250ZXh0KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29udGV4dAorCisgICAgU1NMX1ZFUlNJT04gPSBfZGVmYXVsdF9wcm90b2NvbAogICAgICIiIgotICAgIHNlbGYudmFsaWRhdGUgPSB2YWxpZGF0ZQotICAgIHNlbGYuaXNfdmFsaWQgPSBGYWxzZQotICAgIHNlbGYucGVlcmNlcnQgPSBOb25lCi0gICAgaWYgbm90IHZhbGlkYXRlOgotICAgICAgc2VsZi5jZXJ0X3JlcXMgPSBzc2wuQ0VSVF9OT05FCi0gICAgZWxzZToKLSAgICAgIHNlbGYuY2VydF9yZXFzID0gc3NsLkNFUlRfUkVRVUlSRUQKLSAgICBzZWxmLmNhX2NlcnRzID0gY2FfY2VydHMKLSAgICBzZWxmLmtleWZpbGUgPSBrZXlmaWxlCi0gICAgc2VsZi5jZXJ0ZmlsZSA9IGNlcnRmaWxlCi0gICAgc2VsZi5jaXBoZXJzID0gY2lwaGVycwotICAgIGlmIHZhbGlkYXRlOgotICAgICAgaWYgY2FfY2VydHMgaXMgTm9uZSBvciBub3Qgb3MuYWNjZXNzKGNhX2NlcnRzLCBvcy5SX09LKToKLSAgICAgICAgcmFpc2UgSU9FcnJvcignQ2VydGlmaWNhdGUgQXV0aG9yaXR5IGNhX2NlcnRzIGZpbGUgIiVzIiAnCi0gICAgICAgICAgICAgICAgICAgICAgJ2lzIG5vdCByZWFkYWJsZSwgY2Fubm90IHZhbGlkYXRlIFNTTCAnCi0gICAgICAgICAgICAgICAgICAgICAgJ2NlcnRpZmljYXRlcy4nICUgKGNhX2NlcnRzKSkKLSAgICBUU29ja2V0LlRTb2NrZXQuX19pbml0X18oc2VsZiwgaG9zdCwgcG9ydCwgdW5peF9zb2NrZXQpCisgIERlZmF1bHQgU1NMIHZlcnNpb24uCisgIEZvciBiYWNrd29yZCBjb21wYXRpYmlsaXR5LCBpdCBjYW4gYmUgbW9kaWZpZWQuCisgIFVzZSBfX2luaXRfXyBrZXl3b2FyZCBhcmd1bWVudCAic3NsX3ZlcnNpb24iIGluc3RlYWQuCisgICIiIgogCi0gIGRlZiBvcGVuKHNlbGYpOgotICAgIHRyeToKLSAgICAgIHJlczAgPSBzZWxmLl9yZXNvbHZlQWRkcigpCi0gICAgICBmb3IgcmVzIGluIHJlczA6Ci0gICAgICAgIHNvY2tfZmFtaWx5LCBzb2NrX3R5cGUgPSByZXNbMDoyXQotICAgICAgICBpcF9wb3J0ID0gcmVzWzRdCi0gICAgICAgIHBsYWluX3NvY2sgPSBzb2NrZXQuc29ja2V0KHNvY2tfZmFtaWx5LCBzb2NrX3R5cGUpCi0gICAgICAgIHNlbGYuaGFuZGxlID0gc3NsLndyYXBfc29ja2V0KHBsYWluX3NvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzbF92ZXJzaW9uPXNlbGYuU1NMX1ZFUlNJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvX2hhbmRzaGFrZV9vbl9jb25uZWN0PVRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhX2NlcnRzPXNlbGYuY2FfY2VydHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleWZpbGU9c2VsZi5rZXlmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0ZmlsZT1zZWxmLmNlcnRmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X3JlcXM9c2VsZi5jZXJ0X3JlcXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpcGhlcnM9c2VsZi5jaXBoZXJzKQotICAgICAgICBzZWxmLmhhbmRsZS5zZXR0aW1lb3V0KHNlbGYuX3RpbWVvdXQpCisgICAgZGVmIF9kZXByZWNhdGVkX2FyZyhzZWxmLCBhcmdzLCBrd2FyZ3MsIHBvcywga2V5KToKKyAgICAgICAgaWYgbGVuKGFyZ3MpIDw9IHBvczoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICByZWFsX3BvcyA9IHBvcyArIDMKKyAgICAgICAgd2FybmluZ3Mud2FybigKKyAgICAgICAgICAgICclZHRoIHBvc2l0aW9uYWwgYXJndW1lbnQgaXMgZGVwcmVjYXRlZC4nCisgICAgICAgICAgICAncGxlYXNlIHVzZSBrZXl3YXJkIGFyZ3VtZW50IGluc3RlYW5kLicKKyAgICAgICAgICAgICUgcmVhbF9wb3MsIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0zKQorCisgICAgICAgIGlmIGtleSBpbiBrd2FyZ3M6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoCisgICAgICAgICAgICAgICAgJ0R1cGxpY2F0ZSBhcmd1bWVudDogJWR0aCBhcmd1bWVudCBhbmQgJXMga2V5d2FyZCBhcmd1bWVudC4nCisgICAgICAgICAgICAgICAgJSAocmVhbF9wb3MsIGtleSkpCisgICAgICAgIGt3YXJnc1trZXldID0gYXJnc1twb3NdCisKKyAgICBkZWYgX3VuaXhfc29ja2V0X2FyZyhzZWxmLCBob3N0LCBwb3J0LCBhcmdzLCBrd2FyZ3MpOgorICAgICAgICBrZXkgPSAndW5peF9zb2NrZXQnCisgICAgICAgIGlmIGhvc3QgaXMgTm9uZSBhbmQgcG9ydCBpcyBOb25lIGFuZCBsZW4oYXJncykgPT0gMSBhbmQga2V5IG5vdCBpbiBrd2FyZ3M6CisgICAgICAgICAgICBrd2FyZ3Nba2V5XSA9IGFyZ3NbMF0KKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIGtleSk6CisgICAgICAgIGlmIGtleSA9PSAnU1NMX1ZFUlNJT04nOgorICAgICAgICAgICAgd2FybmluZ3Mud2FybigKKyAgICAgICAgICAgICAgICAnU1NMX1ZFUlNJT04gaXMgZGVwcmVjYXRlZC4nCisgICAgICAgICAgICAgICAgJ3BsZWFzZSB1c2Ugc3NsX3ZlcnNpb24gYXR0cmlidXRlIGluc3RlYWQuJywKKyAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnNzbF92ZXJzaW9uCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2VydmVyX3NpZGUsIGhvc3QsIHNzbF9vcHRzKToKKyAgICAgICAgc2VsZi5fc2VydmVyX3NpZGUgPSBzZXJ2ZXJfc2lkZQorICAgICAgICBpZiBUU1NMQmFzZS5TU0xfVkVSU0lPTiAhPSBzZWxmLl9kZWZhdWx0X3Byb3RvY29sOgorICAgICAgICAgICAgd2FybmluZ3Mud2FybigKKyAgICAgICAgICAgICAgICAnU1NMX1ZFUlNJT04gaXMgZGVwcmVjYXRlZC4nCisgICAgICAgICAgICAgICAgJ3BsZWFzZSB1c2Ugc3NsX3ZlcnNpb24ga2V5d2FyZCBhcmd1bWVudCBpbnN0ZWFkLicsCisgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCisgICAgICAgIHNlbGYuX2NvbnRleHQgPSBzc2xfb3B0cy5wb3AoJ3NzbF9jb250ZXh0JywgTm9uZSkKKyAgICAgICAgc2VsZi5fc2VydmVyX2hvc3RuYW1lID0gTm9uZQorICAgICAgICBpZiBub3Qgc2VsZi5fc2VydmVyX3NpZGU6CisgICAgICAgICAgICBzZWxmLl9zZXJ2ZXJfaG9zdG5hbWUgPSBzc2xfb3B0cy5wb3AoJ3NlcnZlcl9ob3N0bmFtZScsIGhvc3QpCisgICAgICAgIGlmIHNlbGYuX2NvbnRleHQ6CisgICAgICAgICAgICBzZWxmLl9jdXN0b21fY29udGV4dCA9IFRydWUKKyAgICAgICAgICAgIGlmIHNzbF9vcHRzOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICdJbmNvbXBhdGlibGUgYXJndW1lbnRzOiBzc2xfY29udGV4dCBhbmQgJXMnCisgICAgICAgICAgICAgICAgICAgICUgJyAnLmpvaW4oc3NsX29wdHMua2V5cygpKSkKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9oYXNfc3NsX2NvbnRleHQ6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgJ3NzbF9jb250ZXh0IGlzIG5vdCBhdmFpbGFibGUgZm9yIHRoaXMgdmVyc2lvbiBvZiBQeXRob24nKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fY3VzdG9tX2NvbnRleHQgPSBGYWxzZQorICAgICAgICAgICAgc3NsX3ZlcnNpb24gPSBzc2xfb3B0cy5wb3AoJ3NzbF92ZXJzaW9uJywgVFNTTEJhc2UuU1NMX1ZFUlNJT04pCisgICAgICAgICAgICBzZWxmLl9pbml0X2NvbnRleHQoc3NsX3ZlcnNpb24pCisgICAgICAgICAgICBzZWxmLmNlcnRfcmVxcyA9IHNzbF9vcHRzLnBvcCgnY2VydF9yZXFzJywgc3NsLkNFUlRfUkVRVUlSRUQpCisgICAgICAgICAgICBzZWxmLmNhX2NlcnRzID0gc3NsX29wdHMucG9wKCdjYV9jZXJ0cycsIE5vbmUpCisgICAgICAgICAgICBzZWxmLmtleWZpbGUgPSBzc2xfb3B0cy5wb3AoJ2tleWZpbGUnLCBOb25lKQorICAgICAgICAgICAgc2VsZi5jZXJ0ZmlsZSA9IHNzbF9vcHRzLnBvcCgnY2VydGZpbGUnLCBOb25lKQorICAgICAgICAgICAgc2VsZi5jaXBoZXJzID0gc3NsX29wdHMucG9wKCdjaXBoZXJzJywgTm9uZSkKKworICAgICAgICAgICAgaWYgc3NsX29wdHM6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgJ1Vua25vd24ga2V5d29yZCBhcmd1bWVudHM6ICcsICcgJy5qb2luKHNzbF9vcHRzLmtleXMoKSkpCisKKyAgICAgICAgICAgIGlmIHNlbGYuX3Nob3VsZF92ZXJpZnk6CisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuY2FfY2VydHM6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAnY2FfY2VydHMgaXMgbmVlZGVkIHdoZW4gY2VydF9yZXFzIGlzIG5vdCBzc2wuQ0VSVF9OT05FJykKKyAgICAgICAgICAgICAgICBpZiBub3Qgb3MuYWNjZXNzKHNlbGYuY2FfY2VydHMsIG9zLlJfT0spOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBJT0Vycm9yKCdDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgY2FfY2VydHMgZmlsZSAiJXMiICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXMgbm90IHJlYWRhYmxlLCBjYW5ub3QgdmFsaWRhdGUgU1NMICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY2VydGlmaWNhdGVzLicgJSAoc2VsZi5jYV9jZXJ0cykpCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgY2VydGZpbGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9jZXJ0ZmlsZQorCisgICAgQGNlcnRmaWxlLnNldHRlcgorICAgIGRlZiBjZXJ0ZmlsZShzZWxmLCBjZXJ0ZmlsZSk6CisgICAgICAgIGlmIHNlbGYuX3NlcnZlcl9zaWRlIGFuZCBub3QgY2VydGZpbGU6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdjZXJ0ZmlsZSBpcyBuZWVkZWQgZm9yIHNlcnZlci1zaWRlJykKKyAgICAgICAgaWYgY2VydGZpbGUgYW5kIG5vdCBvcy5hY2Nlc3MoY2VydGZpbGUsIG9zLlJfT0spOgorICAgICAgICAgICAgcmFpc2UgSU9FcnJvcignTm8gc3VjaCBjZXJ0ZmlsZSBmb3VuZDogJXMnICUgKGNlcnRmaWxlKSkKKyAgICAgICAgc2VsZi5fY2VydGZpbGUgPSBjZXJ0ZmlsZQorCisgICAgZGVmIF93cmFwX3NvY2tldChzZWxmLCBzb2NrKToKKyAgICAgICAgaWYgc2VsZi5faGFzX3NzbF9jb250ZXh0OgorICAgICAgICAgICAgaWYgbm90IHNlbGYuX2N1c3RvbV9jb250ZXh0OgorICAgICAgICAgICAgICAgIHNlbGYuc3NsX2NvbnRleHQudmVyaWZ5X21vZGUgPSBzZWxmLmNlcnRfcmVxcworICAgICAgICAgICAgICAgIGlmIHNlbGYuY2VydGZpbGU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3NsX2NvbnRleHQubG9hZF9jZXJ0X2NoYWluKHNlbGYuY2VydGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYua2V5ZmlsZSkKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmNpcGhlcnM6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3NsX2NvbnRleHQuc2V0X2NpcGhlcnMoc2VsZi5jaXBoZXJzKQorICAgICAgICAgICAgICAgIGlmIHNlbGYuY2FfY2VydHM6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3NsX2NvbnRleHQubG9hZF92ZXJpZnlfbG9jYXRpb25zKHNlbGYuY2FfY2VydHMpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5zc2xfY29udGV4dC53cmFwX3NvY2tldCgKKyAgICAgICAgICAgICAgICBzb2NrLCBzZXJ2ZXJfc2lkZT1zZWxmLl9zZXJ2ZXJfc2lkZSwKKyAgICAgICAgICAgICAgICBzZXJ2ZXJfaG9zdG5hbWU9c2VsZi5fc2VydmVyX2hvc3RuYW1lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3NsX29wdHMgPSB7CisgICAgICAgICAgICAgICAgJ3NzbF92ZXJzaW9uJzogc2VsZi5fc3NsX3ZlcnNpb24sCisgICAgICAgICAgICAgICAgJ3NlcnZlcl9zaWRlJzogc2VsZi5fc2VydmVyX3NpZGUsCisgICAgICAgICAgICAgICAgJ2NhX2NlcnRzJzogc2VsZi5jYV9jZXJ0cywKKyAgICAgICAgICAgICAgICAna2V5ZmlsZSc6IHNlbGYua2V5ZmlsZSwKKyAgICAgICAgICAgICAgICAnY2VydGZpbGUnOiBzZWxmLmNlcnRmaWxlLAorICAgICAgICAgICAgICAgICdjZXJ0X3JlcXMnOiBzZWxmLmNlcnRfcmVxcywKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIHNlbGYuY2lwaGVyczoKKyAgICAgICAgICAgICAgICBpZiBzZWxmLl9oYXNfY2lwaGVyczoKKyAgICAgICAgICAgICAgICAgICAgc3NsX29wdHNbJ2NpcGhlcnMnXSA9IHNlbGYuY2lwaGVycworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgJ2NpcGhlcnMgaXMgc3BlY2lmaWVkIGJ1dCBpZ25vcmVkIGR1ZSB0byBvbGQgUHl0aG9uIHZlcnNpb24nKQorICAgICAgICAgICAgcmV0dXJuIHNzbC53cmFwX3NvY2tldChzb2NrLCAqKnNzbF9vcHRzKQorCisKK2NsYXNzIFRTU0xTb2NrZXQoVFNvY2tldC5UU29ja2V0LCBUU1NMQmFzZSk6CisgICAgIiIiCisgICAgU1NMIGltcGxlbWVudGF0aW9uIG9mIFRTb2NrZXQKKworICAgIFRoaXMgY2xhc3MgY3JlYXRlcyBvdXRib3VuZCBzb2NrZXRzIHdyYXBwZWQgdXNpbmcgdGhlCisgICAgcHl0aG9uIHN0YW5kYXJkIHNzbCBtb2R1bGUgZm9yIGVuY3J5cHRlZCBjb25uZWN0aW9ucy4KKyAgICAiIiIKKworICAgICMgTmV3IHNpZ25hdHVyZQorICAgICMgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3Q9J2xvY2FsaG9zdCcsIHBvcnQ9OTA5MCwgdW5peF9zb2NrZXQ9Tm9uZSwKKyAgICAjICAgICAgICAgICAgICAqKnNzbF9hcmdzKToKKyAgICAjIERlcHJlY2F0ZWQgc2lnbmF0dXJlCisgICAgIyBkZWYgX19pbml0X18oc2VsZiwgaG9zdD0nbG9jYWxob3N0JywgcG9ydD05MDkwLCB2YWxpZGF0ZT1UcnVlLAorICAgICMgICAgICAgICAgICAgIGNhX2NlcnRzPU5vbmUsIGtleWZpbGU9Tm9uZSwgY2VydGZpbGU9Tm9uZSwKKyAgICAjICAgICAgICAgICAgICB1bml4X3NvY2tldD1Ob25lLCBjaXBoZXJzPU5vbmUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0PSdsb2NhbGhvc3QnLCBwb3J0PTkwOTAsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICIiIlBvc2l0aW9uYWwgYXJndW1lbnRzOiBgYGhvc3RgYCwgYGBwb3J0YGAsIGBgdW5peF9zb2NrZXRgYAorCisgICAgICAgIEtleXdvcmQgYXJndW1lbnRzOiBgYGtleWZpbGVgYCwgYGBjZXJ0ZmlsZWBgLCBgYGNlcnRfcmVxc2BgLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYGBzc2xfdmVyc2lvbmBgLCBgYGNhX2NlcnRzYGAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBgYGNpcGhlcnNgYCAoUHl0aG9uIDIuNy4wIG9yIGxhdGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGBgc2VydmVyX2hvc3RuYW1lYGAgKFB5dGhvbiAyLjcuOSBvciBsYXRlcikKKyAgICAgICAgUGFzc2VkIHRvIHNzbC53cmFwX3NvY2tldC4gU2VlIHNzbC53cmFwX3NvY2tldCBkb2N1bWVudGF0aW9uLgorCisgICAgICAgIEFsdGVybmF0aXZlIGtleXdvcmQgYXJndW1lbnRzOiAoUHl0aG9uIDIuNy45IG9yIGxhdGVyKQorICAgICAgICAgIGBgc3NsX2NvbnRleHRgYDogc3NsLlNTTENvbnRleHQgdG8gYmUgdXNlZCBmb3IgU1NMQ29udGV4dC53cmFwX3NvY2tldAorICAgICAgICAgIGBgc2VydmVyX2hvc3RuYW1lYGA6IFBhc3NlZCB0byBTU0xDb250ZXh0LndyYXBfc29ja2V0CisKKyAgICAgICAgQ29tbW9uIGtleXdvcmQgYXJndW1lbnQ6CisgICAgICAgICAgYGB2YWxpZGF0ZV9jYWxsYmFja2BgIChjZXJ0LCBob3N0bmFtZSkgLT4gTm9uZToKKyAgICAgICAgICAgICAgQ2FsbGVkIGFmdGVyIFNTTCBoYW5kc2hha2UuIENhbiByYWlzZSB3aGVuIGhvc3RuYW1lIGRvZXMgbm90CisgICAgICAgICAgICAgIG1hdGNoIHRoZSBjZXJ0LgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5pc192YWxpZCA9IEZhbHNlCisgICAgICAgIHNlbGYucGVlcmNlcnQgPSBOb25lCisKKyAgICAgICAgaWYgYXJnczoKKyAgICAgICAgICAgIGlmIGxlbihhcmdzKSA+IDY6CisgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdUb28gbWFueSBwb3NpdGlvbmFsIGFyZ3VtZW50JykKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLl91bml4X3NvY2tldF9hcmcoaG9zdCwgcG9ydCwgYXJncywga3dhcmdzKToKKyAgICAgICAgICAgICAgICBzZWxmLl9kZXByZWNhdGVkX2FyZyhhcmdzLCBrd2FyZ3MsIDAsICd2YWxpZGF0ZScpCisgICAgICAgICAgICBzZWxmLl9kZXByZWNhdGVkX2FyZyhhcmdzLCBrd2FyZ3MsIDEsICdjYV9jZXJ0cycpCisgICAgICAgICAgICBzZWxmLl9kZXByZWNhdGVkX2FyZyhhcmdzLCBrd2FyZ3MsIDIsICdrZXlmaWxlJykKKyAgICAgICAgICAgIHNlbGYuX2RlcHJlY2F0ZWRfYXJnKGFyZ3MsIGt3YXJncywgMywgJ2NlcnRmaWxlJykKKyAgICAgICAgICAgIHNlbGYuX2RlcHJlY2F0ZWRfYXJnKGFyZ3MsIGt3YXJncywgNCwgJ3VuaXhfc29ja2V0JykKKyAgICAgICAgICAgIHNlbGYuX2RlcHJlY2F0ZWRfYXJnKGFyZ3MsIGt3YXJncywgNSwgJ2NpcGhlcnMnKQorCisgICAgICAgIHZhbGlkYXRlID0ga3dhcmdzLnBvcCgndmFsaWRhdGUnLCBOb25lKQorICAgICAgICBpZiB2YWxpZGF0ZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGNlcnRfcmVxc19uYW1lID0gJ0NFUlRfUkVRVUlSRUQnIGlmIHZhbGlkYXRlIGVsc2UgJ0NFUlRfTk9ORScKKyAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCisgICAgICAgICAgICAgICAgJ3ZhbGlkYXRlIGlzIGRlcHJlY2F0ZWQuIHBsZWFzZSB1c2UgY2VydF9yZXFzPXNzbC4lcyBpbnN0ZWFkJworICAgICAgICAgICAgICAgICUgY2VydF9yZXFzX25hbWUsCisgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCisgICAgICAgICAgICBpZiAnY2VydF9yZXFzJyBpbiBrd2FyZ3M6CisgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdDYW5ub3Qgc3BlY2lmeSBib3RoIHZhbGlkYXRlIGFuZCBjZXJ0X3JlcXMnKQorICAgICAgICAgICAga3dhcmdzWydjZXJ0X3JlcXMnXSA9IHNzbC5DRVJUX1JFUVVJUkVEIGlmIHZhbGlkYXRlIGVsc2Ugc3NsLkNFUlRfTk9ORQorCisgICAgICAgIHVuaXhfc29ja2V0ID0ga3dhcmdzLnBvcCgndW5peF9zb2NrZXQnLCBOb25lKQorICAgICAgICBzZWxmLl92YWxpZGF0ZV9jYWxsYmFjayA9IGt3YXJncy5wb3AoJ3ZhbGlkYXRlX2NhbGxiYWNrJywgX21hdGNoX2hvc3RuYW1lKQorICAgICAgICBUU1NMQmFzZS5fX2luaXRfXyhzZWxmLCBGYWxzZSwgaG9zdCwga3dhcmdzKQorICAgICAgICBUU29ja2V0LlRTb2NrZXQuX19pbml0X18oc2VsZiwgaG9zdCwgcG9ydCwgdW5peF9zb2NrZXQpCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgdmFsaWRhdGUoc2VsZik6CisgICAgICAgIHdhcm5pbmdzLndhcm4oJ3ZhbGlkYXRlIGlzIGRlcHJlY2F0ZWQuIHBsZWFzZSB1c2UgY2VydF9yZXFzIGluc3RlYWQnLAorICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yKQorICAgICAgICByZXR1cm4gc2VsZi5jZXJ0X3JlcXMgIT0gc3NsLkNFUlRfTk9ORQorCisgICAgQHZhbGlkYXRlLnNldHRlcgorICAgIGRlZiB2YWxpZGF0ZShzZWxmLCB2YWx1ZSk6CisgICAgICAgIHdhcm5pbmdzLndhcm4oJ3ZhbGlkYXRlIGlzIGRlcHJlY2F0ZWQuIHBsZWFzZSB1c2UgY2VydF9yZXFzIGluc3RlYWQnLAorICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yKQorICAgICAgICBzZWxmLmNlcnRfcmVxcyA9IHNzbC5DRVJUX1JFUVVJUkVEIGlmIHZhbHVlIGVsc2Ugc3NsLkNFUlRfTk9ORQorCisgICAgZGVmIF9kb19vcGVuKHNlbGYsIGZhbWlseSwgc29ja3R5cGUpOgorICAgICAgICBwbGFpbl9zb2NrID0gc29ja2V0LnNvY2tldChmYW1pbHksIHNvY2t0eXBlKQogICAgICAgICB0cnk6Ci0gICAgICAgICAgc2VsZi5oYW5kbGUuY29ubmVjdChpcF9wb3J0KQotICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yIGFzIGU6Ci0gICAgICAgICAgaWYgcmVzIGlzIG5vdCByZXMwWy0xXToKLSAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJhaXNlIGUKLSAgICAgICAgYnJlYWsKLSAgICBleGNlcHQgc29ja2V0LmVycm9yIGFzIGU6Ci0gICAgICBpZiBzZWxmLl91bml4X3NvY2tldDoKLSAgICAgICAgbWVzc2FnZSA9ICdDb3VsZCBub3QgY29ubmVjdCB0byBzZWN1cmUgc29ja2V0ICVzOiAlcycgXAotICAgICAgICAgICAgICAgICUgKHNlbGYuX3VuaXhfc29ja2V0LCBlKQotICAgICAgZWxzZToKLSAgICAgICAgbWVzc2FnZSA9ICdDb3VsZCBub3QgY29ubmVjdCB0byAlczolZDogJXMnICUgKHNlbGYuaG9zdCwgc2VsZi5wb3J0LCBlKQotICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbih0eXBlPVRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9bWVzc2FnZSkKLSAgICBpZiBzZWxmLnZhbGlkYXRlOgotICAgICAgc2VsZi5fdmFsaWRhdGVfY2VydCgpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fd3JhcF9zb2NrZXQocGxhaW5fc29jaykKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgIHBsYWluX3NvY2suY2xvc2UoKQorICAgICAgICAgICAgbXNnID0gJ2ZhaWxlZCB0byBpbml0aWFsaXplIFNTTCcKKyAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24obXNnKQorICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLCBtc2cpCiAKLSAgZGVmIF92YWxpZGF0ZV9jZXJ0KHNlbGYpOgotICAgICIiImludGVybmFsIG1ldGhvZCB0byB2YWxpZGF0ZSB0aGUgcGVlcidzIFNTTCBjZXJ0aWZpY2F0ZSwgYW5kIHRvIGNoZWNrIHRoZQotICAgIGNvbW1vbk5hbWUgb2YgdGhlIGNlcnRpZmljYXRlIHRvIGVuc3VyZSBpdCBtYXRjaGVzIHRoZSBob3N0bmFtZSB3ZQotICAgIHVzZWQgdG8gbWFrZSB0aGlzIGNvbm5lY3Rpb24uICBEb2VzIG5vdCBzdXBwb3J0IHN1YmplY3RBbHROYW1lIHJlY29yZHMKLSAgICBpbiBjZXJ0aWZpY2F0ZXMuCisgICAgZGVmIG9wZW4oc2VsZik6CisgICAgICAgIHN1cGVyKFRTU0xTb2NrZXQsIHNlbGYpLm9wZW4oKQorICAgICAgICBpZiBzZWxmLl9zaG91bGRfdmVyaWZ5OgorICAgICAgICAgICAgc2VsZi5wZWVyY2VydCA9IHNlbGYuaGFuZGxlLmdldHBlZXJjZXJ0KCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLl92YWxpZGF0ZV9jYWxsYmFjayhzZWxmLnBlZXJjZXJ0LCBzZWxmLl9zZXJ2ZXJfaG9zdG5hbWUpCisgICAgICAgICAgICAgICAgc2VsZi5pc192YWxpZCA9IFRydWUKKyAgICAgICAgICAgIGV4Y2VwdCBUVHJhbnNwb3J0RXhjZXB0aW9uOgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4OgorICAgICAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5VTktOT1dOLCBzdHIoZXgpKQogCi0gICAgcmFpc2VzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgdGhlIGNlcnRpZmljYXRlIGZhaWxzIHZhbGlkYXRpb24uCisKK2NsYXNzIFRTU0xTZXJ2ZXJTb2NrZXQoVFNvY2tldC5UU2VydmVyU29ja2V0LCBUU1NMQmFzZSk6CisgICAgIiIiU1NMIGltcGxlbWVudGF0aW9uIG9mIFRTZXJ2ZXJTb2NrZXQKKworICAgIFRoaXMgdXNlcyB0aGUgc3NsIG1vZHVsZSdzIHdyYXBfc29ja2V0KCkgbWV0aG9kIHRvIHByb3ZpZGUgU1NMCisgICAgbmVnb3RpYXRlZCBlbmNyeXB0aW9uLgogICAgICIiIgotICAgIGNlcnQgPSBzZWxmLmhhbmRsZS5nZXRwZWVyY2VydCgpCi0gICAgc2VsZi5wZWVyY2VydCA9IGNlcnQKLSAgICBpZiAnc3ViamVjdCcgbm90IGluIGNlcnQ6Ci0gICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKAotICAgICAgICB0eXBlPVRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sCi0gICAgICAgIG1lc3NhZ2U9J05vIFNTTCBjZXJ0aWZpY2F0ZSBmb3VuZCBmcm9tICVzOiVzJyAlIChzZWxmLmhvc3QsIHNlbGYucG9ydCkpCi0gICAgZmllbGRzID0gY2VydFsnc3ViamVjdCddCi0gICAgZm9yIGZpZWxkIGluIGZpZWxkczoKLSAgICAgICMgZW5zdXJlIHN0cnVjdHVyZSB3ZSBnZXQgYmFjayBpcyB3aGF0IHdlIGV4cGVjdAotICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZmllbGQsIHR1cGxlKToKLSAgICAgICAgY29udGludWUKLSAgICAgIGNlcnRfcGFpciA9IGZpZWxkWzBdCi0gICAgICBpZiBsZW4oY2VydF9wYWlyKSA8IDI6Ci0gICAgICAgIGNvbnRpbnVlCi0gICAgICBjZXJ0X2tleSwgY2VydF92YWx1ZSA9IGNlcnRfcGFpclswOjJdCi0gICAgICBpZiBjZXJ0X2tleSAhPSAnY29tbW9uTmFtZSc6Ci0gICAgICAgIGNvbnRpbnVlCi0gICAgICBjZXJ0aG9zdCA9IGNlcnRfdmFsdWUKLSAgICAgICMgdGhpcyBjaGVjayBzaG91bGQgYmUgcGVyZm9ybWVkIGJ5IHNvbWUgc29ydCBvZiBBY2Nlc3MgTWFuYWdlcgotICAgICAgaWYgY2VydGhvc3QgPT0gc2VsZi5ob3N0OgotICAgICAgICAjIHN1Y2Nlc3MsIGNlcnQgY29tbW9uTmFtZSBtYXRjaGVzIGRlc2lyZWQgaG9zdG5hbWUKLSAgICAgICAgc2VsZi5pc192YWxpZCA9IFRydWUKLSAgICAgICAgcmV0dXJuCi0gICAgICBlbHNlOgotICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKAotICAgICAgICAgIHR5cGU9VFRyYW5zcG9ydEV4Y2VwdGlvbi5VTktOT1dOLAotICAgICAgICAgIG1lc3NhZ2U9J0hvc3RuYW1lIHdlIGNvbm5lY3RlZCB0byAiJXMiIGRvZXNuXCd0IG1hdGNoIGNlcnRpZmljYXRlICcKLSAgICAgICAgICAgICAgICAgICdwcm92aWRlZCBjb21tb25OYW1lICIlcyInICUgKHNlbGYuaG9zdCwgY2VydGhvc3QpKQotICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oCi0gICAgICB0eXBlPVRUcmFuc3BvcnRFeGNlcHRpb24uVU5LTk9XTiwKLSAgICAgIG1lc3NhZ2U9J0NvdWxkIG5vdCB2YWxpZGF0ZSBTU0wgY2VydGlmaWNhdGUgZnJvbSAnCi0gICAgICAgICAgICAgICdob3N0ICIlcyIuICBDZXJ0PSVzJyAlIChzZWxmLmhvc3QsIGNlcnQpKQogCisgICAgIyBOZXcgc2lnbmF0dXJlCisgICAgIyBkZWYgX19pbml0X18oc2VsZiwgaG9zdD0nbG9jYWxob3N0JywgcG9ydD05MDkwLCB1bml4X3NvY2tldD1Ob25lLCAqKnNzbF9hcmdzKToKKyAgICAjIERlcHJlY2F0ZWQgc2lnbmF0dXJlCisgICAgIyBkZWYgX19pbml0X18oc2VsZiwgaG9zdD1Ob25lLCBwb3J0PTkwOTAsIGNlcnRmaWxlPSdjZXJ0LnBlbScsIHVuaXhfc29ja2V0PU5vbmUsIGNpcGhlcnM9Tm9uZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3Q9Tm9uZSwgcG9ydD05MDkwLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAiIiJQb3NpdGlvbmFsIGFyZ3VtZW50czogYGBob3N0YGAsIGBgcG9ydGBgLCBgYHVuaXhfc29ja2V0YGAKIAotY2xhc3MgVFNTTFNlcnZlclNvY2tldChUU29ja2V0LlRTZXJ2ZXJTb2NrZXQpOgotICAiIiJTU0wgaW1wbGVtZW50YXRpb24gb2YgVFNlcnZlclNvY2tldAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50czogYGBrZXlmaWxlYGAsIGBgY2VydGZpbGVgYCwgYGBjZXJ0X3JlcXNgYCwgYGBzc2xfdmVyc2lvbmBgLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYGBjYV9jZXJ0c2BgLCBgYGNpcGhlcnNgYCAoUHl0aG9uIDIuNy4wIG9yIGxhdGVyKQorICAgICAgICBTZWUgc3NsLndyYXBfc29ja2V0IGRvY3VtZW50YXRpb24uCiAKLSAgVGhpcyB1c2VzIHRoZSBzc2wgbW9kdWxlJ3Mgd3JhcF9zb2NrZXQoKSBtZXRob2QgdG8gcHJvdmlkZSBTU0wKLSAgbmVnb3RpYXRlZCBlbmNyeXB0aW9uLgotICAiIiIKLSAgU1NMX1ZFUlNJT04gPSBzc2wuUFJPVE9DT0xfVExTdjEKKyAgICAgICAgQWx0ZXJuYXRpdmUga2V5d29yZCBhcmd1bWVudHM6IChQeXRob24gMi43Ljkgb3IgbGF0ZXIpCisgICAgICAgICAgYGBzc2xfY29udGV4dGBgOiBzc2wuU1NMQ29udGV4dCB0byBiZSB1c2VkIGZvciBTU0xDb250ZXh0LndyYXBfc29ja2V0CisgICAgICAgICAgYGBzZXJ2ZXJfaG9zdG5hbWVgYDogUGFzc2VkIHRvIFNTTENvbnRleHQud3JhcF9zb2NrZXQKIAotICBkZWYgX19pbml0X18oc2VsZiwKLSAgICAgICAgICAgICAgIGhvc3Q9Tm9uZSwKLSAgICAgICAgICAgICAgIHBvcnQ9OTA5MCwKLSAgICAgICAgICAgICAgIGNlcnRmaWxlPSdjZXJ0LnBlbScsCi0gICAgICAgICAgICAgICB1bml4X3NvY2tldD1Ob25lLAotICAgICAgICAgICAgICAgY2lwaGVycz1Ob25lKToKLSAgICAiIiJJbml0aWFsaXplIGEgVFNTTFNlcnZlclNvY2tldAorICAgICAgICBDb21tb24ga2V5d29yZCBhcmd1bWVudDoKKyAgICAgICAgICBgYHZhbGlkYXRlX2NhbGxiYWNrYGAgKGNlcnQsIGhvc3RuYW1lKSAtPiBOb25lOgorICAgICAgICAgICAgICBDYWxsZWQgYWZ0ZXIgU1NMIGhhbmRzaGFrZS4gQ2FuIHJhaXNlIHdoZW4gaG9zdG5hbWUgZG9lcyBub3QKKyAgICAgICAgICAgICAgbWF0Y2ggdGhlIGNlcnQuCisgICAgICAgICIiIgorICAgICAgICBpZiBhcmdzOgorICAgICAgICAgICAgaWYgbGVuKGFyZ3MpID4gMzoKKyAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ1RvbyBtYW55IHBvc2l0aW9uYWwgYXJndW1lbnQnKQorICAgICAgICAgICAgaWYgbm90IHNlbGYuX3VuaXhfc29ja2V0X2FyZyhob3N0LCBwb3J0LCBhcmdzLCBrd2FyZ3MpOgorICAgICAgICAgICAgICAgIHNlbGYuX2RlcHJlY2F0ZWRfYXJnKGFyZ3MsIGt3YXJncywgMCwgJ2NlcnRmaWxlJykKKyAgICAgICAgICAgIHNlbGYuX2RlcHJlY2F0ZWRfYXJnKGFyZ3MsIGt3YXJncywgMSwgJ3VuaXhfc29ja2V0JykKKyAgICAgICAgICAgIHNlbGYuX2RlcHJlY2F0ZWRfYXJnKGFyZ3MsIGt3YXJncywgMiwgJ2NpcGhlcnMnKQogCi0gICAgQHBhcmFtIGNlcnRmaWxlOiBmaWxlbmFtZSBvZiB0aGUgc2VydmVyIGNlcnRpZmljYXRlLCBkZWZhdWx0cyB0byBjZXJ0LnBlbQotICAgIEB0eXBlIGNlcnRmaWxlOiBzdHIKLSAgICBAcGFyYW0gaG9zdDogVGhlIGhvc3RuYW1lIG9yIElQIHRvIGJpbmQgdGhlIGxpc3RlbiBzb2NrZXQgdG8sCi0gICAgICAgICAgICAgICAgIGkuZS4gJ2xvY2FsaG9zdCcgZm9yIG9ubHkgYWxsb3dpbmcgbG9jYWwgbmV0d29yayBjb25uZWN0aW9ucy4KLSAgICAgICAgICAgICAgICAgUGFzcyBOb25lIHRvIGJpbmQgdG8gYWxsIGludGVyZmFjZXMuCi0gICAgQHR5cGUgaG9zdDogc3RyCi0gICAgQHBhcmFtIHBvcnQ6IFRoZSBwb3J0IHRvIGxpc3RlbiBvbiBmb3IgaW5ib3VuZCBjb25uZWN0aW9ucy4KLSAgICBAdHlwZSBwb3J0OiBpbnQKLSAgICBAcGFyYW0gY2lwaGVyczogVGhlIGNpcGhlciBzdWl0ZXMgdG8gYWxsb3cuIFRoaXMgaXMgcGFzc2VkIHRvCi0gICAgICAgICAgICAgICAgICAgIHRoZSBzc2xfd3JhcCBmdW5jdGlvbiBhcyB0aGUgJ2NpcGhlcnMnIHBhcmFtZXRlci4KLSAgICBAdHlwZSBjaXBoZXJzOiBzdHIKKyAgICAgICAgaWYgJ3NzbF9jb250ZXh0JyBub3QgaW4ga3dhcmdzOgorICAgICAgICAgICAgIyBQcmVzZXJ2ZSBleGlzdGluZyBiZWhhdmlvcnMgZm9yIGRlZmF1bHQgdmFsdWVzCisgICAgICAgICAgICBpZiAnY2VydF9yZXFzJyBub3QgaW4ga3dhcmdzOgorICAgICAgICAgICAgICAgIGt3YXJnc1snY2VydF9yZXFzJ10gPSBzc2wuQ0VSVF9OT05FCisgICAgICAgICAgICBpZidjZXJ0ZmlsZScgbm90IGluIGt3YXJnczoKKyAgICAgICAgICAgICAgICBrd2FyZ3NbJ2NlcnRmaWxlJ10gPSAnY2VydC5wZW0nCiAKLSAgICAiIiIKLSAgICBzZWxmLnNldENlcnRmaWxlKGNlcnRmaWxlKQotICAgIFRTb2NrZXQuVFNlcnZlclNvY2tldC5fX2luaXRfXyhzZWxmLCBob3N0LCBwb3J0KQotICAgIHNlbGYuY2lwaGVycyA9IGNpcGhlcnMKKyAgICAgICAgdW5peF9zb2NrZXQgPSBrd2FyZ3MucG9wKCd1bml4X3NvY2tldCcsIE5vbmUpCisgICAgICAgIHNlbGYuX3ZhbGlkYXRlX2NhbGxiYWNrID0gXAorICAgICAgICAgICAga3dhcmdzLnBvcCgndmFsaWRhdGVfY2FsbGJhY2snLCBfbWF0Y2hfaG9zdG5hbWUpCisgICAgICAgIFRTU0xCYXNlLl9faW5pdF9fKHNlbGYsIFRydWUsIE5vbmUsIGt3YXJncykKKyAgICAgICAgVFNvY2tldC5UU2VydmVyU29ja2V0Ll9faW5pdF9fKHNlbGYsIGhvc3QsIHBvcnQsIHVuaXhfc29ja2V0KQorICAgICAgICBpZiBzZWxmLl9zaG91bGRfdmVyaWZ5IGFuZCBub3QgX21hdGNoX2hhc19pcGFkZHJlc3M6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdOZWVkIGlwYWRkcmVzcyBhbmQgYmFja3BvcnRzLnNzbF9tYXRjaF9ob3N0bmFtZSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGUgdG8gdmVyaWZ5IGNsaWVudCBjZXJ0aWZpY2F0ZScpCiAKLSAgZGVmIHNldENlcnRmaWxlKHNlbGYsIGNlcnRmaWxlKToKLSAgICAiIiJTZXQgb3IgY2hhbmdlIHRoZSBzZXJ2ZXIgY2VydGlmaWNhdGUgZmlsZSB1c2VkIHRvIHdyYXAgbmV3IGNvbm5lY3Rpb25zLgorICAgIGRlZiBzZXRDZXJ0ZmlsZShzZWxmLCBjZXJ0ZmlsZSk6CisgICAgICAgICIiIlNldCBvciBjaGFuZ2UgdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZSBmaWxlIHVzZWQgdG8gd3JhcCBuZXcKKyAgICAgICAgY29ubmVjdGlvbnMuCiAKLSAgICBAcGFyYW0gY2VydGZpbGU6IFRoZSBmaWxlbmFtZSBvZiB0aGUgc2VydmVyIGNlcnRpZmljYXRlLAotICAgICAgICAgICAgICAgICAgICAgaS5lLiAnL2V0Yy9jZXJ0cy9zZXJ2ZXIucGVtJwotICAgIEB0eXBlIGNlcnRmaWxlOiBzdHIKKyAgICAgICAgQHBhcmFtIGNlcnRmaWxlOiBUaGUgZmlsZW5hbWUgb2YgdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpLmUuICcvZXRjL2NlcnRzL3NlcnZlci5wZW0nCisgICAgICAgIEB0eXBlIGNlcnRmaWxlOiBzdHIKIAotICAgIFJhaXNlcyBhbiBJT0Vycm9yIGV4Y2VwdGlvbiBpZiB0aGUgY2VydGZpbGUgaXMgbm90IHByZXNlbnQgb3IgdW5yZWFkYWJsZS4KLSAgICAiIiIKLSAgICBpZiBub3Qgb3MuYWNjZXNzKGNlcnRmaWxlLCBvcy5SX09LKToKLSAgICAgIHJhaXNlIElPRXJyb3IoJ05vIHN1Y2ggY2VydGZpbGUgZm91bmQ6ICVzJyAlIChjZXJ0ZmlsZSkpCi0gICAgc2VsZi5jZXJ0ZmlsZSA9IGNlcnRmaWxlCisgICAgICAgIFJhaXNlcyBhbiBJT0Vycm9yIGV4Y2VwdGlvbiBpZiB0aGUgY2VydGZpbGUgaXMgbm90IHByZXNlbnQgb3IgdW5yZWFkYWJsZS4KKyAgICAgICAgIiIiCisgICAgICAgIHdhcm5pbmdzLndhcm4oCisgICAgICAgICAgICAnc2V0Q2VydGZpbGUgaXMgZGVwcmVjYXRlZC4gcGxlYXNlIHVzZSBjZXJ0ZmlsZSBwcm9wZXJ0eSBpbnN0ZWFkLicsCisgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKKyAgICAgICAgc2VsZi5jZXJ0ZmlsZSA9IGNlcnRmaWxlCiAKLSAgZGVmIGFjY2VwdChzZWxmKToKLSAgICBwbGFpbl9jbGllbnQsIGFkZHIgPSBzZWxmLmhhbmRsZS5hY2NlcHQoKQotICAgIHRyeToKLSAgICAgIGNsaWVudCA9IHNzbC53cmFwX3NvY2tldChwbGFpbl9jbGllbnQsIGNlcnRmaWxlPXNlbGYuY2VydGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgc2VydmVyX3NpZGU9VHJ1ZSwgc3NsX3ZlcnNpb249c2VsZi5TU0xfVkVSU0lPTiwKLSAgICAgICAgICAgICAgICAgICAgICBjaXBoZXJzPXNlbGYuY2lwaGVycykKLSAgICBleGNlcHQgc3NsLlNTTEVycm9yIGFzIHNzbF9leGM6Ci0gICAgICAjIGZhaWxlZCBoYW5kc2hha2Uvc3NsIHdyYXAsIGNsb3NlIHNvY2tldCB0byBjbGllbnQKLSAgICAgIHBsYWluX2NsaWVudC5jbG9zZSgpCi0gICAgICAjIHJhaXNlIHNzbF9leGMKLSAgICAgICMgV2UgY2FuJ3QgcmFpc2UgdGhlIGV4Y2VwdGlvbiwgYmVjYXVzZSBpdCBraWxscyBtb3N0IFRTZXJ2ZXIgZGVyaXZlZAotICAgICAgIyBzZXJ2ZSgpIG1ldGhvZHMuCi0gICAgICAjIEluc3RlYWQsIHJldHVybiBOb25lLCBhbmQgbGV0IHRoZSBUU2VydmVyIGluc3RhbmNlIGRlYWwgd2l0aCBpdCBpbgotICAgICAgIyBvdGhlciBleGNlcHRpb24gaGFuZGxpbmcuICAoYnV0IFRTaW1wbGVTZXJ2ZXIgZGllcyBhbnl3YXkpCi0gICAgICByZXR1cm4gTm9uZQotICAgIHJlc3VsdCA9IFRTb2NrZXQuVFNvY2tldCgpCi0gICAgcmVzdWx0LnNldEhhbmRsZShjbGllbnQpCi0gICAgcmV0dXJuIHJlc3VsdAorICAgIGRlZiBhY2NlcHQoc2VsZik6CisgICAgICAgIHBsYWluX2NsaWVudCwgYWRkciA9IHNlbGYuaGFuZGxlLmFjY2VwdCgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNsaWVudCA9IHNlbGYuX3dyYXBfc29ja2V0KHBsYWluX2NsaWVudCkKKyAgICAgICAgZXhjZXB0IChzc2wuU1NMRXJyb3IsIHNvY2tldC5lcnJvciwgT1NFcnJvcik6CisgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKCdFcnJvciB3aGlsZSBhY2NlcHRpbmcgZnJvbSAlcycsIGFkZHIpCisgICAgICAgICAgICAjIGZhaWxlZCBoYW5kc2hha2Uvc3NsIHdyYXAsIGNsb3NlIHNvY2tldCB0byBjbGllbnQKKyAgICAgICAgICAgIHBsYWluX2NsaWVudC5jbG9zZSgpCisgICAgICAgICAgICAjIHJhaXNlCisgICAgICAgICAgICAjIFdlIGNhbid0IHJhaXNlIHRoZSBleGNlcHRpb24sIGJlY2F1c2UgaXQga2lsbHMgbW9zdCBUU2VydmVyIGRlcml2ZWQKKyAgICAgICAgICAgICMgc2VydmUoKSBtZXRob2RzLgorICAgICAgICAgICAgIyBJbnN0ZWFkLCByZXR1cm4gTm9uZSwgYW5kIGxldCB0aGUgVFNlcnZlciBpbnN0YW5jZSBkZWFsIHdpdGggaXQgaW4KKyAgICAgICAgICAgICMgb3RoZXIgZXhjZXB0aW9uIGhhbmRsaW5nLiAgKGJ1dCBUU2ltcGxlU2VydmVyIGRpZXMgYW55d2F5KQorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICBpZiBzZWxmLl9zaG91bGRfdmVyaWZ5OgorICAgICAgICAgICAgY2xpZW50LnBlZXJjZXJ0ID0gY2xpZW50LmdldHBlZXJjZXJ0KCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLl92YWxpZGF0ZV9jYWxsYmFjayhjbGllbnQucGVlcmNlcnQsIGFkZHJbMF0pCisgICAgICAgICAgICAgICAgY2xpZW50LmlzX3ZhbGlkID0gVHJ1ZQorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICBsb2dnZXIud2FybignRmFpbGVkIHRvIHZhbGlkYXRlIGNsaWVudCBjZXJ0aWZpY2F0ZSBhZGRyZXNzOiAlcycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkclswXSwgZXhjX2luZm89VHJ1ZSkKKyAgICAgICAgICAgICAgICBjbGllbnQuY2xvc2UoKQorICAgICAgICAgICAgICAgIHBsYWluX2NsaWVudC5jbG9zZSgpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICByZXN1bHQgPSBUU29ja2V0LlRTb2NrZXQoKQorICAgICAgICByZXN1bHQuaGFuZGxlID0gY2xpZW50CisgICAgICAgIHJldHVybiByZXN1bHQKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RTb2NrZXQucHkgYi9saWIvcHkvc3JjL3RyYW5zcG9ydC9UU29ja2V0LnB5CmluZGV4IDdiNTY0YWEuLmE3ZDY2MTcgMTAwNjQ0Ci0tLSBhL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RTb2NrZXQucHkKKysrIGIvbGliL3B5L3NyYy90cmFuc3BvcnQvVFNvY2tldC5weQpAQCAtMTgsMTYzICsxOCwxODQgQEAKICMKIAogaW1wb3J0IGVycm5vCitpbXBvcnQgbG9nZ2luZwogaW1wb3J0IG9zCiBpbXBvcnQgc29ja2V0CiBpbXBvcnQgc3lzCiAKLWZyb20gVFRyYW5zcG9ydCBpbXBvcnQgKgorZnJvbSAuVFRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydEJhc2UsIFRUcmFuc3BvcnRFeGNlcHRpb24sIFRTZXJ2ZXJUcmFuc3BvcnRCYXNlCisKK2xvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQogCiAKIGNsYXNzIFRTb2NrZXRCYXNlKFRUcmFuc3BvcnRCYXNlKToKLSAgZGVmIF9yZXNvbHZlQWRkcihzZWxmKToKLSAgICBpZiBzZWxmLl91bml4X3NvY2tldCBpcyBub3QgTm9uZToKLSAgICAgIHJldHVybiBbKHNvY2tldC5BRl9VTklYLCBzb2NrZXQuU09DS19TVFJFQU0sIE5vbmUsIE5vbmUsCi0gICAgICAgICAgICAgICBzZWxmLl91bml4X3NvY2tldCldCi0gICAgZWxzZToKLSAgICAgIHJldHVybiBzb2NrZXQuZ2V0YWRkcmluZm8oc2VsZi5ob3N0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3NvY2tldF9mYW1pbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldC5TT0NLX1NUUkVBTSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0LkFJX1BBU1NJVkUgfCBzb2NrZXQuQUlfQUREUkNPTkZJRykKKyAgICBkZWYgX3Jlc29sdmVBZGRyKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl91bml4X3NvY2tldCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBbKHNvY2tldC5BRl9VTklYLCBzb2NrZXQuU09DS19TVFJFQU0sIE5vbmUsIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICBzZWxmLl91bml4X3NvY2tldCldCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc29ja2V0LmdldGFkZHJpbmZvKHNlbGYuaG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9zb2NrZXRfZmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXQuU09DS19TVFJFQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldC5BSV9QQVNTSVZFIHwgc29ja2V0LkFJX0FERFJDT05GSUcpCiAKLSAgZGVmIGNsb3NlKHNlbGYpOgotICAgIGlmIHNlbGYuaGFuZGxlOgotICAgICAgc2VsZi5oYW5kbGUuY2xvc2UoKQotICAgICAgc2VsZi5oYW5kbGUgPSBOb25lCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmhhbmRsZToKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlLmNsb3NlKCkKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlID0gTm9uZQogCiAKIGNsYXNzIFRTb2NrZXQoVFNvY2tldEJhc2UpOgotICAiIiJTb2NrZXQgaW1wbGVtZW50YXRpb24gb2YgVFRyYW5zcG9ydCBiYXNlLiIiIgorICAgICIiIlNvY2tldCBpbXBsZW1lbnRhdGlvbiBvZiBUVHJhbnNwb3J0IGJhc2UuIiIiCiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3Q9J2xvY2FsaG9zdCcsIHBvcnQ9OTA5MCwgdW5peF9zb2NrZXQ9Tm9uZSwgc29ja2V0X2ZhbWlseT1zb2NrZXQuQUZfVU5TUEVDKToKLSAgICAiIiJJbml0aWFsaXplIGEgVFNvY2tldAorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0PSdsb2NhbGhvc3QnLCBwb3J0PTkwOTAsIHVuaXhfc29ja2V0PU5vbmUsIHNvY2tldF9mYW1pbHk9c29ja2V0LkFGX1VOU1BFQyk6CisgICAgICAgICIiIkluaXRpYWxpemUgYSBUU29ja2V0CiAKLSAgICBAcGFyYW0gaG9zdChzdHIpICBUaGUgaG9zdCB0byBjb25uZWN0IHRvLgotICAgIEBwYXJhbSBwb3J0KGludCkgIFRoZSAoVENQKSBwb3J0IHRvIGNvbm5lY3QgdG8uCi0gICAgQHBhcmFtIHVuaXhfc29ja2V0KHN0cikgIFRoZSBmaWxlbmFtZSBvZiBhIHVuaXggc29ja2V0IHRvIGNvbm5lY3QgdG8uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChob3N0IGFuZCBwb3J0IHdpbGwgYmUgaWdub3JlZC4pCi0gICAgQHBhcmFtIHNvY2tldF9mYW1pbHkoaW50KSAgVGhlIHNvY2tldCBmYW1pbHkgdG8gdXNlIHdpdGggdGhpcyBzb2NrZXQuCi0gICAgIiIiCi0gICAgc2VsZi5ob3N0ID0gaG9zdAotICAgIHNlbGYucG9ydCA9IHBvcnQKLSAgICBzZWxmLmhhbmRsZSA9IE5vbmUKLSAgICBzZWxmLl91bml4X3NvY2tldCA9IHVuaXhfc29ja2V0Ci0gICAgc2VsZi5fdGltZW91dCA9IE5vbmUKLSAgICBzZWxmLl9zb2NrZXRfZmFtaWx5ID0gc29ja2V0X2ZhbWlseQorICAgICAgICBAcGFyYW0gaG9zdChzdHIpICBUaGUgaG9zdCB0byBjb25uZWN0IHRvLgorICAgICAgICBAcGFyYW0gcG9ydChpbnQpICBUaGUgKFRDUCkgcG9ydCB0byBjb25uZWN0IHRvLgorICAgICAgICBAcGFyYW0gdW5peF9zb2NrZXQoc3RyKSAgVGhlIGZpbGVuYW1lIG9mIGEgdW5peCBzb2NrZXQgdG8gY29ubmVjdCB0by4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChob3N0IGFuZCBwb3J0IHdpbGwgYmUgaWdub3JlZC4pCisgICAgICAgIEBwYXJhbSBzb2NrZXRfZmFtaWx5KGludCkgIFRoZSBzb2NrZXQgZmFtaWx5IHRvIHVzZSB3aXRoIHRoaXMgc29ja2V0LgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5ob3N0ID0gaG9zdAorICAgICAgICBzZWxmLnBvcnQgPSBwb3J0CisgICAgICAgIHNlbGYuaGFuZGxlID0gTm9uZQorICAgICAgICBzZWxmLl91bml4X3NvY2tldCA9IHVuaXhfc29ja2V0CisgICAgICAgIHNlbGYuX3RpbWVvdXQgPSBOb25lCisgICAgICAgIHNlbGYuX3NvY2tldF9mYW1pbHkgPSBzb2NrZXRfZmFtaWx5CiAKLSAgZGVmIHNldEhhbmRsZShzZWxmLCBoKToKLSAgICBzZWxmLmhhbmRsZSA9IGgKKyAgICBkZWYgc2V0SGFuZGxlKHNlbGYsIGgpOgorICAgICAgICBzZWxmLmhhbmRsZSA9IGgKIAotICBkZWYgaXNPcGVuKHNlbGYpOgotICAgIHJldHVybiBzZWxmLmhhbmRsZSBpcyBub3QgTm9uZQorICAgIGRlZiBpc09wZW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmhhbmRsZSBpcyBub3QgTm9uZQogCi0gIGRlZiBzZXRUaW1lb3V0KHNlbGYsIG1zKToKLSAgICBpZiBtcyBpcyBOb25lOgotICAgICAgc2VsZi5fdGltZW91dCA9IE5vbmUKLSAgICBlbHNlOgotICAgICAgc2VsZi5fdGltZW91dCA9IG1zIC8gMTAwMC4wCisgICAgZGVmIHNldFRpbWVvdXQoc2VsZiwgbXMpOgorICAgICAgICBpZiBtcyBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5fdGltZW91dCA9IE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX3RpbWVvdXQgPSBtcyAvIDEwMDAuMAogCi0gICAgaWYgc2VsZi5oYW5kbGUgaXMgbm90IE5vbmU6Ci0gICAgICBzZWxmLmhhbmRsZS5zZXR0aW1lb3V0KHNlbGYuX3RpbWVvdXQpCisgICAgICAgIGlmIHNlbGYuaGFuZGxlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5oYW5kbGUuc2V0dGltZW91dChzZWxmLl90aW1lb3V0KQogCi0gIGRlZiBvcGVuKHNlbGYpOgotICAgIHRyeToKLSAgICAgIHJlczAgPSBzZWxmLl9yZXNvbHZlQWRkcigpCi0gICAgICBmb3IgcmVzIGluIHJlczA6Ci0gICAgICAgIHNlbGYuaGFuZGxlID0gc29ja2V0LnNvY2tldChyZXNbMF0sIHJlc1sxXSkKLSAgICAgICAgc2VsZi5oYW5kbGUuc2V0dGltZW91dChzZWxmLl90aW1lb3V0KQorICAgIGRlZiBfZG9fb3BlbihzZWxmLCBmYW1pbHksIHNvY2t0eXBlKToKKyAgICAgICAgcmV0dXJuIHNvY2tldC5zb2NrZXQoZmFtaWx5LCBzb2NrdHlwZSkKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBfYWRkcmVzcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3VuaXhfc29ja2V0IGlmIHNlbGYuX3VuaXhfc29ja2V0IGVsc2UgJyVzOiVkJyAlIChzZWxmLmhvc3QsIHNlbGYucG9ydCkKKworICAgIGRlZiBvcGVuKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmhhbmRsZToKKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5BTFJFQURZX09QRU4pCiAgICAgICAgIHRyeToKLSAgICAgICAgICBzZWxmLmhhbmRsZS5jb25uZWN0KHJlc1s0XSkKKyAgICAgICAgICAgIGFkZHJzID0gc2VsZi5fcmVzb2x2ZUFkZHIoKQorICAgICAgICBleGNlcHQgc29ja2V0LmdhaWVycm9yOgorICAgICAgICAgICAgbXNnID0gJ2ZhaWxlZCB0byByZXNvbHZlIHNvY2thZGRyIGZvciAnICsgc3RyKHNlbGYuX2FkZHJlc3MpCisgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKG1zZykKKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwgbXNnKQorICAgICAgICBmb3IgZmFtaWx5LCBzb2NrdHlwZSwgXywgXywgc29ja2FkZHIgaW4gYWRkcnM6CisgICAgICAgICAgICBoYW5kbGUgPSBzZWxmLl9kb19vcGVuKGZhbWlseSwgc29ja3R5cGUpCisgICAgICAgICAgICBoYW5kbGUuc2V0dGltZW91dChzZWxmLl90aW1lb3V0KQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGhhbmRsZS5jb25uZWN0KHNvY2thZGRyKQorICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlID0gaGFuZGxlCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yOgorICAgICAgICAgICAgICAgIGhhbmRsZS5jbG9zZSgpCisgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ0NvdWxkIG5vdCBjb25uZWN0IHRvICVzJywgc29ja2FkZHIsIGV4Y19pbmZvPVRydWUpCisgICAgICAgIG1zZyA9ICdDb3VsZCBub3QgY29ubmVjdCB0byBhbnkgb2YgJXMnICUgbGlzdChtYXAobGFtYmRhIGE6IGFbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcnMpKQorICAgICAgICBsb2dnZXIuZXJyb3IobXNnKQorICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sIG1zZykKKworICAgIGRlZiByZWFkKHNlbGYsIHN6KToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYnVmZiA9IHNlbGYuaGFuZGxlLnJlY3Yoc3opCiAgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IgYXMgZToKLSAgICAgICAgICBpZiByZXMgaXMgbm90IHJlczBbLTFdOgotICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmFpc2UgZQotICAgICAgICBicmVhawotICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IgYXMgZToKLSAgICAgIGlmIHNlbGYuX3VuaXhfc29ja2V0OgotICAgICAgICBtZXNzYWdlID0gJ0NvdWxkIG5vdCBjb25uZWN0IHRvIHNvY2tldCAlcycgJSBzZWxmLl91bml4X3NvY2tldAotICAgICAgZWxzZToKLSAgICAgICAgbWVzc2FnZSA9ICdDb3VsZCBub3QgY29ubmVjdCB0byAlczolZCcgJSAoc2VsZi5ob3N0LCBzZWxmLnBvcnQpCi0gICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKHR5cGU9VFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT1tZXNzYWdlKQorICAgICAgICAgICAgaWYgKGUuYXJnc1swXSA9PSBlcnJuby5FQ09OTlJFU0VUIGFuZAorICAgICAgICAgICAgICAgICAgICAoc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nIG9yIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdmcmVlYnNkJykpKToKKyAgICAgICAgICAgICAgICAjIGZyZWVic2QgYW5kIE1hY2ggZG9uJ3QgZm9sbG93IFBPU0lYIHNlbWFudGljIG9mIHJlY3YKKyAgICAgICAgICAgICAgICAjIGFuZCBmYWlsIHdpdGggRUNPTk5SRVNFVCBpZiBwZWVyIHBlcmZvcm1lZCBzaHV0ZG93bi4KKyAgICAgICAgICAgICAgICAjIFNlZSBjb3JyZXNwb25kaW5nIGNvbW1lbnQgYW5kIGNvZGUgaW4gVFNvY2tldDo6cmVhZCgpCisgICAgICAgICAgICAgICAgIyBpbiBsaWIvY3BwL3NyYy90cmFuc3BvcnQvVFNvY2tldC5jcHAuCisgICAgICAgICAgICAgICAgc2VsZi5jbG9zZSgpCisgICAgICAgICAgICAgICAgIyBUcmlnZ2VyIHRoZSBjaGVjayB0byByYWlzZSB0aGUgRU5EX09GX0ZJTEUgZXhjZXB0aW9uIGJlbG93LgorICAgICAgICAgICAgICAgIGJ1ZmYgPSAnJworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICBpZiBsZW4oYnVmZikgPT0gMDoKKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24odHlwZT1UVHJhbnNwb3J0RXhjZXB0aW9uLkVORF9PRl9GSUxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSdUU29ja2V0IHJlYWQgMCBieXRlcycpCisgICAgICAgIHJldHVybiBidWZmCiAKLSAgZGVmIHJlYWQoc2VsZiwgc3opOgotICAgIHRyeToKLSAgICAgIGJ1ZmYgPSBzZWxmLmhhbmRsZS5yZWN2KHN6KQotICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IgYXMgZToKLSAgICAgIGlmIChlLmFyZ3NbMF0gPT0gZXJybm8uRUNPTk5SRVNFVCBhbmQKLSAgICAgICAgICAoc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nIG9yIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdmcmVlYnNkJykpKToKLSAgICAgICAgIyBmcmVlYnNkIGFuZCBNYWNoIGRvbid0IGZvbGxvdyBQT1NJWCBzZW1hbnRpYyBvZiByZWN2Ci0gICAgICAgICMgYW5kIGZhaWwgd2l0aCBFQ09OTlJFU0VUIGlmIHBlZXIgcGVyZm9ybWVkIHNodXRkb3duLgotICAgICAgICAjIFNlZSBjb3JyZXNwb25kaW5nIGNvbW1lbnQgYW5kIGNvZGUgaW4gVFNvY2tldDo6cmVhZCgpCi0gICAgICAgICMgaW4gbGliL2NwcC9zcmMvdHJhbnNwb3J0L1RTb2NrZXQuY3BwLgotICAgICAgICBzZWxmLmNsb3NlKCkKLSAgICAgICAgIyBUcmlnZ2VyIHRoZSBjaGVjayB0byByYWlzZSB0aGUgRU5EX09GX0ZJTEUgZXhjZXB0aW9uIGJlbG93LgotICAgICAgICBidWZmID0gJycKLSAgICAgIGVsc2U6Ci0gICAgICAgIHJhaXNlCi0gICAgaWYgbGVuKGJ1ZmYpID09IDA6Ci0gICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKHR5cGU9VFRyYW5zcG9ydEV4Y2VwdGlvbi5FTkRfT0ZfRklMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0nVFNvY2tldCByZWFkIDAgYnl0ZXMnKQotICAgIHJldHVybiBidWZmCisgICAgZGVmIHdyaXRlKHNlbGYsIGJ1ZmYpOgorICAgICAgICBpZiBub3Qgc2VsZi5oYW5kbGU6CisgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKHR5cGU9VFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0nVHJhbnNwb3J0IG5vdCBvcGVuJykKKyAgICAgICAgc2VudCA9IDAKKyAgICAgICAgaGF2ZSA9IGxlbihidWZmKQorICAgICAgICB3aGlsZSBzZW50IDwgaGF2ZToKKyAgICAgICAgICAgIHBsdXMgPSBzZWxmLmhhbmRsZS5zZW5kKGJ1ZmYpCisgICAgICAgICAgICBpZiBwbHVzID09IDA6CisgICAgICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbih0eXBlPVRUcmFuc3BvcnRFeGNlcHRpb24uRU5EX09GX0ZJTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSdUU29ja2V0IHNlbnQgMCBieXRlcycpCisgICAgICAgICAgICBzZW50ICs9IHBsdXMKKyAgICAgICAgICAgIGJ1ZmYgPSBidWZmW3BsdXM6XQogCi0gIGRlZiB3cml0ZShzZWxmLCBidWZmKToKLSAgICBpZiBub3Qgc2VsZi5oYW5kbGU6Ci0gICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKHR5cGU9VFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0nVHJhbnNwb3J0IG5vdCBvcGVuJykKLSAgICBzZW50ID0gMAotICAgIGhhdmUgPSBsZW4oYnVmZikKLSAgICB3aGlsZSBzZW50IDwgaGF2ZToKLSAgICAgIHBsdXMgPSBzZWxmLmhhbmRsZS5zZW5kKGJ1ZmYpCi0gICAgICBpZiBwbHVzID09IDA6Ci0gICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24odHlwZT1UVHJhbnNwb3J0RXhjZXB0aW9uLkVORF9PRl9GSUxFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9J1RTb2NrZXQgc2VudCAwIGJ5dGVzJykKLSAgICAgIHNlbnQgKz0gcGx1cwotICAgICAgYnVmZiA9IGJ1ZmZbcGx1czpdCi0KLSAgZGVmIGZsdXNoKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgZmx1c2goc2VsZik6CisgICAgICAgIHBhc3MKIAogCiBjbGFzcyBUU2VydmVyU29ja2V0KFRTb2NrZXRCYXNlLCBUU2VydmVyVHJhbnNwb3J0QmFzZSk6Ci0gICIiIlNvY2tldCBpbXBsZW1lbnRhdGlvbiBvZiBUU2VydmVyVHJhbnNwb3J0IGJhc2UuIiIiCisgICAgIiIiU29ja2V0IGltcGxlbWVudGF0aW9uIG9mIFRTZXJ2ZXJUcmFuc3BvcnQgYmFzZS4iIiIKIAotICBkZWYgX19pbml0X18oc2VsZiwgaG9zdD1Ob25lLCBwb3J0PTkwOTAsIHVuaXhfc29ja2V0PU5vbmUsIHNvY2tldF9mYW1pbHk9c29ja2V0LkFGX1VOU1BFQyk6Ci0gICAgc2VsZi5ob3N0ID0gaG9zdAotICAgIHNlbGYucG9ydCA9IHBvcnQKLSAgICBzZWxmLl91bml4X3NvY2tldCA9IHVuaXhfc29ja2V0Ci0gICAgc2VsZi5fc29ja2V0X2ZhbWlseSA9IHNvY2tldF9mYW1pbHkKLSAgICBzZWxmLmhhbmRsZSA9IE5vbmUKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaG9zdD1Ob25lLCBwb3J0PTkwOTAsIHVuaXhfc29ja2V0PU5vbmUsIHNvY2tldF9mYW1pbHk9c29ja2V0LkFGX1VOU1BFQyk6CisgICAgICAgIHNlbGYuaG9zdCA9IGhvc3QKKyAgICAgICAgc2VsZi5wb3J0ID0gcG9ydAorICAgICAgICBzZWxmLl91bml4X3NvY2tldCA9IHVuaXhfc29ja2V0CisgICAgICAgIHNlbGYuX3NvY2tldF9mYW1pbHkgPSBzb2NrZXRfZmFtaWx5CisgICAgICAgIHNlbGYuaGFuZGxlID0gTm9uZQorICAgICAgICBzZWxmLl9iYWNrbG9nID0gMTI4CiAKLSAgZGVmIGxpc3RlbihzZWxmKToKLSAgICByZXMwID0gc2VsZi5fcmVzb2x2ZUFkZHIoKQotICAgIHNvY2tldF9mYW1pbHkgPSBzZWxmLl9zb2NrZXRfZmFtaWx5ID09IHNvY2tldC5BRl9VTlNQRUMgYW5kIHNvY2tldC5BRl9JTkVUNiBvciBzZWxmLl9zb2NrZXRfZmFtaWx5Ci0gICAgZm9yIHJlcyBpbiByZXMwOgotICAgICAgaWYgcmVzWzBdIGlzIHNvY2tldF9mYW1pbHkgb3IgcmVzIGlzIHJlczBbLTFdOgotICAgICAgICBicmVhaworICAgIGRlZiBzZXRCYWNrbG9nKHNlbGYsIGJhY2tsb2c9Tm9uZSk6CisgICAgICAgIGlmIG5vdCBzZWxmLmhhbmRsZToKKyAgICAgICAgICAgIHNlbGYuX2JhY2tsb2cgPSBiYWNrbG9nCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFdlIGNhbm4ndCB1cGRhdGUgYmFja2xvZyB3aGVuIGl0IGlzIGFscmVhZHkgbGlzdGVuaW5nLCBzaW5jZSB0aGUKKyAgICAgICAgICAgICMgaGFuZGxlIGhhcyBiZWVuIGNyZWF0ZWQuCisgICAgICAgICAgICBsb2dnZXIud2FybignWW91IGhhdmUgdG8gc2V0IGJhY2tsb2cgYmVmb3JlIGxpc3Rlbi4nKQogCi0gICAgIyBXZSBuZWVkIHJlbW92ZSB0aGUgb2xkIHVuaXggc29ja2V0IGlmIHRoZSBmaWxlIGV4aXN0cyBhbmQKLSAgICAjIG5vYm9keSBpcyBsaXN0ZW5pbmcgb24gaXQuCi0gICAgaWYgc2VsZi5fdW5peF9zb2NrZXQ6Ci0gICAgICB0bXAgPSBzb2NrZXQuc29ja2V0KHJlc1swXSwgcmVzWzFdKQotICAgICAgdHJ5OgotICAgICAgICB0bXAuY29ubmVjdChyZXNbNF0pCi0gICAgICBleGNlcHQgc29ja2V0LmVycm9yIGFzIGVycjoKLSAgICAgICAgZW5vLCBtZXNzYWdlID0gZXJyLmFyZ3MKLSAgICAgICAgaWYgZW5vID09IGVycm5vLkVDT05OUkVGVVNFRDoKLSAgICAgICAgICBvcy51bmxpbmsocmVzWzRdKQorICAgIGRlZiBsaXN0ZW4oc2VsZik6CisgICAgICAgIHJlczAgPSBzZWxmLl9yZXNvbHZlQWRkcigpCisgICAgICAgIHNvY2tldF9mYW1pbHkgPSBzZWxmLl9zb2NrZXRfZmFtaWx5ID09IHNvY2tldC5BRl9VTlNQRUMgYW5kIHNvY2tldC5BRl9JTkVUNiBvciBzZWxmLl9zb2NrZXRfZmFtaWx5CisgICAgICAgIGZvciByZXMgaW4gcmVzMDoKKyAgICAgICAgICAgIGlmIHJlc1swXSBpcyBzb2NrZXRfZmFtaWx5IG9yIHJlcyBpcyByZXMwWy0xXToKKyAgICAgICAgICAgICAgICBicmVhawogCi0gICAgc2VsZi5oYW5kbGUgPSBzb2NrZXQuc29ja2V0KHJlc1swXSwgcmVzWzFdKQotICAgIHNlbGYuaGFuZGxlLnNldHNvY2tvcHQoc29ja2V0LlNPTF9TT0NLRVQsIHNvY2tldC5TT19SRVVTRUFERFIsIDEpCi0gICAgaWYgaGFzYXR0cihzZWxmLmhhbmRsZSwgJ3NldHRpbWVvdXQnKToKLSAgICAgIHNlbGYuaGFuZGxlLnNldHRpbWVvdXQoTm9uZSkKLSAgICBzZWxmLmhhbmRsZS5iaW5kKHJlc1s0XSkKLSAgICBzZWxmLmhhbmRsZS5saXN0ZW4oMTI4KQorICAgICAgICAjIFdlIG5lZWQgcmVtb3ZlIHRoZSBvbGQgdW5peCBzb2NrZXQgaWYgdGhlIGZpbGUgZXhpc3RzIGFuZAorICAgICAgICAjIG5vYm9keSBpcyBsaXN0ZW5pbmcgb24gaXQuCisgICAgICAgIGlmIHNlbGYuX3VuaXhfc29ja2V0OgorICAgICAgICAgICAgdG1wID0gc29ja2V0LnNvY2tldChyZXNbMF0sIHJlc1sxXSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB0bXAuY29ubmVjdChyZXNbNF0pCisgICAgICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yIGFzIGVycjoKKyAgICAgICAgICAgICAgICBlbm8sIG1lc3NhZ2UgPSBlcnIuYXJncworICAgICAgICAgICAgICAgIGlmIGVubyA9PSBlcnJuby5FQ09OTlJFRlVTRUQ6CisgICAgICAgICAgICAgICAgICAgIG9zLnVubGluayhyZXNbNF0pCiAKLSAgZGVmIGFjY2VwdChzZWxmKToKLSAgICBjbGllbnQsIGFkZHIgPSBzZWxmLmhhbmRsZS5hY2NlcHQoKQotICAgIHJlc3VsdCA9IFRTb2NrZXQoKQotICAgIHJlc3VsdC5zZXRIYW5kbGUoY2xpZW50KQotICAgIHJldHVybiByZXN1bHQKKyAgICAgICAgc2VsZi5oYW5kbGUgPSBzb2NrZXQuc29ja2V0KHJlc1swXSwgcmVzWzFdKQorICAgICAgICBzZWxmLmhhbmRsZS5zZXRzb2Nrb3B0KHNvY2tldC5TT0xfU09DS0VULCBzb2NrZXQuU09fUkVVU0VBRERSLCAxKQorICAgICAgICBpZiBoYXNhdHRyKHNlbGYuaGFuZGxlLCAnc2V0dGltZW91dCcpOgorICAgICAgICAgICAgc2VsZi5oYW5kbGUuc2V0dGltZW91dChOb25lKQorICAgICAgICBzZWxmLmhhbmRsZS5iaW5kKHJlc1s0XSkKKyAgICAgICAgc2VsZi5oYW5kbGUubGlzdGVuKHNlbGYuX2JhY2tsb2cpCisKKyAgICBkZWYgYWNjZXB0KHNlbGYpOgorICAgICAgICBjbGllbnQsIGFkZHIgPSBzZWxmLmhhbmRsZS5hY2NlcHQoKQorICAgICAgICByZXN1bHQgPSBUU29ja2V0KCkKKyAgICAgICAgcmVzdWx0LnNldEhhbmRsZShjbGllbnQpCisgICAgICAgIHJldHVybiByZXN1bHQKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnQucHkgYi9saWIvcHkvc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0LnB5CmluZGV4IDU5MTRhY2EuLmQxMzA2MGYgMTAwNjQ0Ci0tLSBhL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnQucHkKKysrIGIvbGliL3B5L3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydC5weQpAQCAtMTcsNDMwICsxNyw0MzkgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLWZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTwogZnJvbSBzdHJ1Y3QgaW1wb3J0IHBhY2ssIHVucGFjawogZnJvbSB0aHJpZnQuVGhyaWZ0IGltcG9ydCBURXhjZXB0aW9uCitmcm9tIC4uY29tcGF0IGltcG9ydCBCdWZmZXJJTwogCiAKIGNsYXNzIFRUcmFuc3BvcnRFeGNlcHRpb24oVEV4Y2VwdGlvbik6Ci0gICIiIkN1c3RvbSBUcmFuc3BvcnQgRXhjZXB0aW9uIGNsYXNzIiIiCisgICAgIiIiQ3VzdG9tIFRyYW5zcG9ydCBFeGNlcHRpb24gY2xhc3MiIiIKIAotICBVTktOT1dOID0gMAotICBOT1RfT1BFTiA9IDEKLSAgQUxSRUFEWV9PUEVOID0gMgotICBUSU1FRF9PVVQgPSAzCi0gIEVORF9PRl9GSUxFID0gNAorICAgIFVOS05PV04gPSAwCisgICAgTk9UX09QRU4gPSAxCisgICAgQUxSRUFEWV9PUEVOID0gMgorICAgIFRJTUVEX09VVCA9IDMKKyAgICBFTkRfT0ZfRklMRSA9IDQKKyAgICBORUdBVElWRV9TSVpFID0gNQorICAgIFNJWkVfTElNSVQgPSA2CisgICAgSU5WQUxJRF9DTElFTlRfVFlQRSA9IDcKIAotICBkZWYgX19pbml0X18oc2VsZiwgdHlwZT1VTktOT1dOLCBtZXNzYWdlPU5vbmUpOgotICAgIFRFeGNlcHRpb24uX19pbml0X18oc2VsZiwgbWVzc2FnZSkKLSAgICBzZWxmLnR5cGUgPSB0eXBlCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHR5cGU9VU5LTk9XTiwgbWVzc2FnZT1Ob25lKToKKyAgICAgICAgVEV4Y2VwdGlvbi5fX2luaXRfXyhzZWxmLCBtZXNzYWdlKQorICAgICAgICBzZWxmLnR5cGUgPSB0eXBlCiAKIAotY2xhc3MgVFRyYW5zcG9ydEJhc2U6Ci0gICIiIkJhc2UgY2xhc3MgZm9yIFRocmlmdCB0cmFuc3BvcnQgbGF5ZXIuIiIiCitjbGFzcyBUVHJhbnNwb3J0QmFzZShvYmplY3QpOgorICAgICIiIkJhc2UgY2xhc3MgZm9yIFRocmlmdCB0cmFuc3BvcnQgbGF5ZXIuIiIiCiAKLSAgZGVmIGlzT3BlbihzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIGlzT3BlbihzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiBvcGVuKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgb3BlbihzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiBjbG9zZShzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWQoc2VsZiwgc3opOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZChzZWxmLCBzeik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZEFsbChzZWxmLCBzeik6Ci0gICAgYnVmZiA9ICcnCi0gICAgaGF2ZSA9IDAKLSAgICB3aGlsZSAoaGF2ZSA8IHN6KToKLSAgICAgIGNodW5rID0gc2VsZi5yZWFkKHN6IC0gaGF2ZSkKLSAgICAgIGhhdmUgKz0gbGVuKGNodW5rKQotICAgICAgYnVmZiArPSBjaHVuaworICAgIGRlZiByZWFkQWxsKHNlbGYsIHN6KToKKyAgICAgICAgYnVmZiA9IGInJworICAgICAgICBoYXZlID0gMAorICAgICAgICB3aGlsZSAoaGF2ZSA8IHN6KToKKyAgICAgICAgICAgIGNodW5rID0gc2VsZi5yZWFkKHN6IC0gaGF2ZSkKKyAgICAgICAgICAgIGNodW5rTGVuID0gbGVuKGNodW5rKQorICAgICAgICAgICAgaGF2ZSArPSBjaHVua0xlbgorICAgICAgICAgICAgYnVmZiArPSBjaHVuawogCi0gICAgICBpZiBsZW4oY2h1bmspID09IDA6Ci0gICAgICAgIHJhaXNlIEVPRkVycm9yKCkKKyAgICAgICAgICAgIGlmIGNodW5rTGVuID09IDA6CisgICAgICAgICAgICAgICAgcmFpc2UgRU9GRXJyb3IoKQogCi0gICAgcmV0dXJuIGJ1ZmYKKyAgICAgICAgcmV0dXJuIGJ1ZmYKIAotICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlKHNlbGYsIGJ1Zik6CisgICAgICAgIHBhc3MKIAotICBkZWYgZmx1c2goc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgcGFzcwogCiAKICMgVGhpcyBjbGFzcyBzaG91bGQgYmUgdGhvdWdodCBvZiBhcyBhbiBpbnRlcmZhY2UuCi1jbGFzcyBDUmVhZGFibGVUcmFuc3BvcnQ6Ci0gICIiImJhc2UgY2xhc3MgZm9yIHRyYW5zcG9ydHMgdGhhdCBhcmUgcmVhZGFibGUgZnJvbSBDIiIiCitjbGFzcyBDUmVhZGFibGVUcmFuc3BvcnQob2JqZWN0KToKKyAgICAiIiJiYXNlIGNsYXNzIGZvciB0cmFuc3BvcnRzIHRoYXQgYXJlIHJlYWRhYmxlIGZyb20gQyIiIgogCi0gICMgVE9ETyhkcmVpc3MpOiBUaGluayBhYm91dCBjaGFuZ2luZyB0aGlzIGludGVyZmFjZSB0byBhbGxvdyB1cyB0byB1c2UKLSAgIyAgICAgICAgICAgICAgIGEgKFB5dGhvbiwgbm90IGMpIFN0cmluZ0lPIGluc3RlYWQsIGJlY2F1c2UgaXQgYWxsb3dzCi0gICMgICAgICAgICAgICAgICB5b3UgdG8gd3JpdGUgYWZ0ZXIgcmVhZGluZy4KKyAgICAjIFRPRE8oZHJlaXNzKTogVGhpbmsgYWJvdXQgY2hhbmdpbmcgdGhpcyBpbnRlcmZhY2UgdG8gYWxsb3cgdXMgdG8gdXNlCisgICAgIyAgICAgICAgICAgICAgIGEgKFB5dGhvbiwgbm90IGMpIFN0cmluZ0lPIGluc3RlYWQsIGJlY2F1c2UgaXQgYWxsb3dzCisgICAgIyAgICAgICAgICAgICAgIHlvdSB0byB3cml0ZSBhZnRlciByZWFkaW5nLgogCi0gICMgTk9URTogVGhpcyBpcyBhIGNsYXNzaWMgY2xhc3MsIHNvIHByb3BlcnRpZXMgd2lsbCBOT1Qgd29yawotICAjICAgICAgIGNvcnJlY3RseSBmb3Igc2V0dGluZy4KLSAgQHByb3BlcnR5Ci0gIGRlZiBjc3RyaW5naW9fYnVmKHNlbGYpOgotICAgICIiIkEgY1N0cmluZ0lPIGJ1ZmZlciB0aGF0IGNvbnRhaW5zIHRoZSBjdXJyZW50IGNodW5rIHdlIGFyZSByZWFkaW5nLiIiIgotICAgIHBhc3MKKyAgICAjIE5PVEU6IFRoaXMgaXMgYSBjbGFzc2ljIGNsYXNzLCBzbyBwcm9wZXJ0aWVzIHdpbGwgTk9UIHdvcmsKKyAgICAjICAgICAgIGNvcnJlY3RseSBmb3Igc2V0dGluZy4KKyAgICBAcHJvcGVydHkKKyAgICBkZWYgY3N0cmluZ2lvX2J1ZihzZWxmKToKKyAgICAgICAgIiIiQSBjU3RyaW5nSU8gYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIGN1cnJlbnQgY2h1bmsgd2UgYXJlIHJlYWRpbmcuIiIiCisgICAgICAgIHBhc3MKIAotICBkZWYgY3N0cmluZ2lvX3JlZmlsbChzZWxmLCBwYXJ0aWFscmVhZCwgcmVxbGVuKToKLSAgICAiIiJSZWZpbGxzIGNzdHJpbmdpb19idWYuCisgICAgZGVmIGNzdHJpbmdpb19yZWZpbGwoc2VsZiwgcGFydGlhbHJlYWQsIHJlcWxlbik6CisgICAgICAgICIiIlJlZmlsbHMgY3N0cmluZ2lvX2J1Zi4KIAotICAgIFJldHVybnMgdGhlIGN1cnJlbnRseSB1c2VkIGJ1ZmZlciAod2hpY2ggY2FuIGJ1dCBuZWVkIG5vdCBiZSB0aGUgc2FtZSBhcwotICAgIHRoZSBvbGQgY3N0cmluZ2lvX2J1ZikuIHBhcnRpYWxyZWFkIGlzIHdoYXQgdGhlIEMgY29kZSBoYXMgcmVhZCBmcm9tIHRoZQotICAgIGJ1ZmZlciwgYW5kIHNob3VsZCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBidWZmZXIgYmVmb3JlIGFueSBtb3JlIHJlYWRzLiAgVGhlCi0gICAgcmV0dXJuIHZhbHVlIG11c3QgYmUgYSBuZXcsIG5vdCBib3Jyb3dlZCByZWZlcmVuY2UuICBTb21ldGhpbmcgYWxvbmcgdGhlCi0gICAgbGluZXMgb2Ygc2VsZi5fYnVmIHNob3VsZCBiZSBmaW5lLgorICAgICAgICBSZXR1cm5zIHRoZSBjdXJyZW50bHkgdXNlZCBidWZmZXIgKHdoaWNoIGNhbiBidXQgbmVlZCBub3QgYmUgdGhlIHNhbWUgYXMKKyAgICAgICAgdGhlIG9sZCBjc3RyaW5naW9fYnVmKS4gcGFydGlhbHJlYWQgaXMgd2hhdCB0aGUgQyBjb2RlIGhhcyByZWFkIGZyb20gdGhlCisgICAgICAgIGJ1ZmZlciwgYW5kIHNob3VsZCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBidWZmZXIgYmVmb3JlIGFueSBtb3JlIHJlYWRzLiAgVGhlCisgICAgICAgIHJldHVybiB2YWx1ZSBtdXN0IGJlIGEgbmV3LCBub3QgYm9ycm93ZWQgcmVmZXJlbmNlLiAgU29tZXRoaW5nIGFsb25nIHRoZQorICAgICAgICBsaW5lcyBvZiBzZWxmLl9idWYgc2hvdWxkIGJlIGZpbmUuCiAKLSAgICBJZiByZXFsZW4gYnl0ZXMgY2FuJ3QgYmUgcmVhZCwgdGhyb3cgRU9GRXJyb3IuCi0gICAgIiIiCi0gICAgcGFzcworICAgICAgICBJZiByZXFsZW4gYnl0ZXMgY2FuJ3QgYmUgcmVhZCwgdGhyb3cgRU9GRXJyb3IuCisgICAgICAgICIiIgorICAgICAgICBwYXNzCiAKIAotY2xhc3MgVFNlcnZlclRyYW5zcG9ydEJhc2U6Ci0gICIiIkJhc2UgY2xhc3MgZm9yIFRocmlmdCBzZXJ2ZXIgdHJhbnNwb3J0cy4iIiIKK2NsYXNzIFRTZXJ2ZXJUcmFuc3BvcnRCYXNlKG9iamVjdCk6CisgICAgIiIiQmFzZSBjbGFzcyBmb3IgVGhyaWZ0IHNlcnZlciB0cmFuc3BvcnRzLiIiIgogCi0gIGRlZiBsaXN0ZW4oc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiBsaXN0ZW4oc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgYWNjZXB0KHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgYWNjZXB0KHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIGNsb3NlKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHBhc3MKIAogCi1jbGFzcyBUVHJhbnNwb3J0RmFjdG9yeUJhc2U6Ci0gICIiIkJhc2UgY2xhc3MgZm9yIGEgVHJhbnNwb3J0IEZhY3RvcnkiIiIKK2NsYXNzIFRUcmFuc3BvcnRGYWN0b3J5QmFzZShvYmplY3QpOgorICAgICIiIkJhc2UgY2xhc3MgZm9yIGEgVHJhbnNwb3J0IEZhY3RvcnkiIiIKIAotICBkZWYgZ2V0VHJhbnNwb3J0KHNlbGYsIHRyYW5zKToKLSAgICByZXR1cm4gdHJhbnMKKyAgICBkZWYgZ2V0VHJhbnNwb3J0KHNlbGYsIHRyYW5zKToKKyAgICAgICAgcmV0dXJuIHRyYW5zCiAKIAotY2xhc3MgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeToKLSAgIiIiRmFjdG9yeSB0cmFuc3BvcnQgdGhhdCBidWlsZHMgYnVmZmVyZWQgdHJhbnNwb3J0cyIiIgorY2xhc3MgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeShvYmplY3QpOgorICAgICIiIkZhY3RvcnkgdHJhbnNwb3J0IHRoYXQgYnVpbGRzIGJ1ZmZlcmVkIHRyYW5zcG9ydHMiIiIKIAotICBkZWYgZ2V0VHJhbnNwb3J0KHNlbGYsIHRyYW5zKToKLSAgICBidWZmZXJlZCA9IFRCdWZmZXJlZFRyYW5zcG9ydCh0cmFucykKLSAgICByZXR1cm4gYnVmZmVyZWQKKyAgICBkZWYgZ2V0VHJhbnNwb3J0KHNlbGYsIHRyYW5zKToKKyAgICAgICAgYnVmZmVyZWQgPSBUQnVmZmVyZWRUcmFuc3BvcnQodHJhbnMpCisgICAgICAgIHJldHVybiBidWZmZXJlZAogCiAKIGNsYXNzIFRCdWZmZXJlZFRyYW5zcG9ydChUVHJhbnNwb3J0QmFzZSwgQ1JlYWRhYmxlVHJhbnNwb3J0KToKLSAgIiIiQ2xhc3MgdGhhdCB3cmFwcyBhbm90aGVyIHRyYW5zcG9ydCBhbmQgYnVmZmVycyBpdHMgSS9PLgorICAgICIiIkNsYXNzIHRoYXQgd3JhcHMgYW5vdGhlciB0cmFuc3BvcnQgYW5kIGJ1ZmZlcnMgaXRzIEkvTy4KIAotICBUaGUgaW1wbGVtZW50YXRpb24gdXNlcyBhIChjb25maWd1cmFibGUpIGZpeGVkLXNpemUgcmVhZCBidWZmZXIKLSAgYnV0IGJ1ZmZlcnMgYWxsIHdyaXRlcyB1bnRpbCBhIGZsdXNoIGlzIHBlcmZvcm1lZC4KLSAgIiIiCi0gIERFRkFVTFRfQlVGRkVSID0gNDA5NgorICAgIFRoZSBpbXBsZW1lbnRhdGlvbiB1c2VzIGEgKGNvbmZpZ3VyYWJsZSkgZml4ZWQtc2l6ZSByZWFkIGJ1ZmZlcgorICAgIGJ1dCBidWZmZXJzIGFsbCB3cml0ZXMgdW50aWwgYSBmbHVzaCBpcyBwZXJmb3JtZWQuCisgICAgIiIiCisgICAgREVGQVVMVF9CVUZGRVIgPSA0MDk2CiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsIHRyYW5zLCByYnVmX3NpemU9REVGQVVMVF9CVUZGRVIpOgotICAgIHNlbGYuX190cmFucyA9IHRyYW5zCi0gICAgc2VsZi5fX3didWYgPSBTdHJpbmdJTygpCi0gICAgc2VsZi5fX3JidWYgPSBTdHJpbmdJTygiIikKLSAgICBzZWxmLl9fcmJ1Zl9zaXplID0gcmJ1Zl9zaXplCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRyYW5zLCByYnVmX3NpemU9REVGQVVMVF9CVUZGRVIpOgorICAgICAgICBzZWxmLl9fdHJhbnMgPSB0cmFucworICAgICAgICBzZWxmLl9fd2J1ZiA9IEJ1ZmZlcklPKCkKKyAgICAgICAgIyBQYXNzIHN0cmluZyBhcmd1bWVudCB0byBpbml0aWFsaXplIHJlYWQgYnVmZmVyIGFzIGNTdHJpbmdJTy5JbnB1dFR5cGUKKyAgICAgICAgc2VsZi5fX3JidWYgPSBCdWZmZXJJTyhiJycpCisgICAgICAgIHNlbGYuX19yYnVmX3NpemUgPSByYnVmX3NpemUKIAotICBkZWYgaXNPcGVuKHNlbGYpOgotICAgIHJldHVybiBzZWxmLl9fdHJhbnMuaXNPcGVuKCkKKyAgICBkZWYgaXNPcGVuKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX3RyYW5zLmlzT3BlbigpCiAKLSAgZGVmIG9wZW4oc2VsZik6Ci0gICAgcmV0dXJuIHNlbGYuX190cmFucy5vcGVuKCkKKyAgICBkZWYgb3BlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX190cmFucy5vcGVuKCkKIAotICBkZWYgY2xvc2Uoc2VsZik6Ci0gICAgcmV0dXJuIHNlbGYuX190cmFucy5jbG9zZSgpCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX3RyYW5zLmNsb3NlKCkKIAotICBkZWYgcmVhZChzZWxmLCBzeik6Ci0gICAgcmV0ID0gc2VsZi5fX3JidWYucmVhZChzeikKLSAgICBpZiBsZW4ocmV0KSAhPSAwOgotICAgICAgcmV0dXJuIHJldAorICAgIGRlZiByZWFkKHNlbGYsIHN6KToKKyAgICAgICAgcmV0ID0gc2VsZi5fX3JidWYucmVhZChzeikKKyAgICAgICAgaWYgbGVuKHJldCkgIT0gMDoKKyAgICAgICAgICAgIHJldHVybiByZXQKKyAgICAgICAgc2VsZi5fX3JidWYgPSBCdWZmZXJJTyhzZWxmLl9fdHJhbnMucmVhZChtYXgoc3osIHNlbGYuX19yYnVmX3NpemUpKSkKKyAgICAgICAgcmV0dXJuIHNlbGYuX19yYnVmLnJlYWQoc3opCiAKLSAgICBzZWxmLl9fcmJ1ZiA9IFN0cmluZ0lPKHNlbGYuX190cmFucy5yZWFkKG1heChzeiwgc2VsZi5fX3JidWZfc2l6ZSkpKQotICAgIHJldHVybiBzZWxmLl9fcmJ1Zi5yZWFkKHN6KQorICAgIGRlZiB3cml0ZShzZWxmLCBidWYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9fd2J1Zi53cml0ZShidWYpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgICMgb24gZXhjZXB0aW9uIHJlc2V0IHdidWYgc28gaXQgZG9lc24ndCBjb250YWluIGEgcGFydGlhbCBmdW5jdGlvbiBjYWxsCisgICAgICAgICAgICBzZWxmLl9fd2J1ZiA9IEJ1ZmZlcklPKCkKKyAgICAgICAgICAgIHJhaXNlIGUKIAotICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKLSAgICB0cnk6Ci0gICAgICBzZWxmLl9fd2J1Zi53cml0ZShidWYpCi0gICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgotICAgICAgIyBvbiBleGNlcHRpb24gcmVzZXQgd2J1ZiBzbyBpdCBkb2Vzbid0IGNvbnRhaW4gYSBwYXJ0aWFsIGZ1bmN0aW9uIGNhbGwKLSAgICAgIHNlbGYuX193YnVmID0gU3RyaW5nSU8oKQotICAgICAgcmFpc2UgZQorICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgb3V0ID0gc2VsZi5fX3didWYuZ2V0dmFsdWUoKQorICAgICAgICAjIHJlc2V0IHdidWYgYmVmb3JlIHdyaXRlL2ZsdXNoIHRvIHByZXNlcnZlIHN0YXRlIG9uIHVuZGVybHlpbmcgZmFpbHVyZQorICAgICAgICBzZWxmLl9fd2J1ZiA9IEJ1ZmZlcklPKCkKKyAgICAgICAgc2VsZi5fX3RyYW5zLndyaXRlKG91dCkKKyAgICAgICAgc2VsZi5fX3RyYW5zLmZsdXNoKCkKIAotICBkZWYgZmx1c2goc2VsZik6Ci0gICAgb3V0ID0gc2VsZi5fX3didWYuZ2V0dmFsdWUoKQotICAgICMgcmVzZXQgd2J1ZiBiZWZvcmUgd3JpdGUvZmx1c2ggdG8gcHJlc2VydmUgc3RhdGUgb24gdW5kZXJseWluZyBmYWlsdXJlCi0gICAgc2VsZi5fX3didWYgPSBTdHJpbmdJTygpCi0gICAgc2VsZi5fX3RyYW5zLndyaXRlKG91dCkKLSAgICBzZWxmLl9fdHJhbnMuZmx1c2goKQorICAgICMgSW1wbGVtZW50IHRoZSBDUmVhZGFibGVUcmFuc3BvcnQgaW50ZXJmYWNlLgorICAgIEBwcm9wZXJ0eQorICAgIGRlZiBjc3RyaW5naW9fYnVmKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX3JidWYKIAotICAjIEltcGxlbWVudCB0aGUgQ1JlYWRhYmxlVHJhbnNwb3J0IGludGVyZmFjZS4KLSAgQHByb3BlcnR5Ci0gIGRlZiBjc3RyaW5naW9fYnVmKHNlbGYpOgotICAgIHJldHVybiBzZWxmLl9fcmJ1ZgorICAgIGRlZiBjc3RyaW5naW9fcmVmaWxsKHNlbGYsIHBhcnRpYWxyZWFkLCByZXFsZW4pOgorICAgICAgICByZXRzdHJpbmcgPSBwYXJ0aWFscmVhZAorICAgICAgICBpZiByZXFsZW4gPCBzZWxmLl9fcmJ1Zl9zaXplOgorICAgICAgICAgICAgIyB0cnkgdG8gbWFrZSBhIHJlYWQgb2YgYXMgbXVjaCBhcyB3ZSBjYW4uCisgICAgICAgICAgICByZXRzdHJpbmcgKz0gc2VsZi5fX3RyYW5zLnJlYWQoc2VsZi5fX3JidWZfc2l6ZSkKIAotICBkZWYgY3N0cmluZ2lvX3JlZmlsbChzZWxmLCBwYXJ0aWFscmVhZCwgcmVxbGVuKToKLSAgICByZXRzdHJpbmcgPSBwYXJ0aWFscmVhZAotICAgIGlmIHJlcWxlbiA8IHNlbGYuX19yYnVmX3NpemU6Ci0gICAgICAjIHRyeSB0byBtYWtlIGEgcmVhZCBvZiBhcyBtdWNoIGFzIHdlIGNhbi4KLSAgICAgIHJldHN0cmluZyArPSBzZWxmLl9fdHJhbnMucmVhZChzZWxmLl9fcmJ1Zl9zaXplKQorICAgICAgICAjIGJ1dCBtYWtlIHN1cmUgd2UgZG8gcmVhZCByZXFsZW4gYnl0ZXMuCisgICAgICAgIGlmIGxlbihyZXRzdHJpbmcpIDwgcmVxbGVuOgorICAgICAgICAgICAgcmV0c3RyaW5nICs9IHNlbGYuX190cmFucy5yZWFkQWxsKHJlcWxlbiAtIGxlbihyZXRzdHJpbmcpKQogCi0gICAgIyBidXQgbWFrZSBzdXJlIHdlIGRvIHJlYWQgcmVxbGVuIGJ5dGVzLgotICAgIGlmIGxlbihyZXRzdHJpbmcpIDwgcmVxbGVuOgotICAgICAgcmV0c3RyaW5nICs9IHNlbGYuX190cmFucy5yZWFkQWxsKHJlcWxlbiAtIGxlbihyZXRzdHJpbmcpKQotCi0gICAgc2VsZi5fX3JidWYgPSBTdHJpbmdJTyhyZXRzdHJpbmcpCi0gICAgcmV0dXJuIHNlbGYuX19yYnVmCisgICAgICAgIHNlbGYuX19yYnVmID0gQnVmZmVySU8ocmV0c3RyaW5nKQorICAgICAgICByZXR1cm4gc2VsZi5fX3JidWYKIAogCiBjbGFzcyBUTWVtb3J5QnVmZmVyKFRUcmFuc3BvcnRCYXNlLCBDUmVhZGFibGVUcmFuc3BvcnQpOgotICAiIiJXcmFwcyBhIGNTdHJpbmdJTyBvYmplY3QgYXMgYSBUVHJhbnNwb3J0LgorICAgICIiIldyYXBzIGEgY0J5dGVzSU8gb2JqZWN0IGFzIGEgVFRyYW5zcG9ydC4KIAotICBOT1RFOiBVbmxpa2UgdGhlIEMrKyB2ZXJzaW9uIG9mIHRoaXMgY2xhc3MsIHlvdSBjYW5ub3Qgd3JpdGUgdG8gaXQKLSAgICAgICAgdGhlbiBpbW1lZGlhdGVseSByZWFkIGZyb20gaXQuICBJZiB5b3Ugd2FudCB0byByZWFkIGZyb20gYQotICAgICAgICBUTWVtb3J5QnVmZmVyLCB5b3UgbXVzdCBlaXRoZXIgcGFzcyBhIHN0cmluZyB0byB0aGUgY29uc3RydWN0b3IuCi0gIFRPRE8oZHJlaXNzKTogTWFrZSB0aGlzIHdvcmsgbGlrZSB0aGUgQysrIHZlcnNpb24uCi0gICIiIgorICAgIE5PVEU6IFVubGlrZSB0aGUgQysrIHZlcnNpb24gb2YgdGhpcyBjbGFzcywgeW91IGNhbm5vdCB3cml0ZSB0byBpdAorICAgICAgICAgIHRoZW4gaW1tZWRpYXRlbHkgcmVhZCBmcm9tIGl0LiAgSWYgeW91IHdhbnQgdG8gcmVhZCBmcm9tIGEKKyAgICAgICAgICBUTWVtb3J5QnVmZmVyLCB5b3UgbXVzdCBlaXRoZXIgcGFzcyBhIHN0cmluZyB0byB0aGUgY29uc3RydWN0b3IuCisgICAgVE9ETyhkcmVpc3MpOiBNYWtlIHRoaXMgd29yayBsaWtlIHRoZSBDKysgdmVyc2lvbi4KKyAgICAiIiIKIAotICBkZWYgX19pbml0X18oc2VsZiwgdmFsdWU9Tm9uZSk6Ci0gICAgIiIidmFsdWUgLS0gYSB2YWx1ZSB0byByZWFkIGZyb20gZm9yIHN0cmluZ2lvCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlPU5vbmUsIG9mZnNldD0wKToKKyAgICAgICAgIiIidmFsdWUgLS0gYSB2YWx1ZSB0byByZWFkIGZyb20gZm9yIHN0cmluZ2lvCiAKLSAgICBJZiB2YWx1ZSBpcyBzZXQsIHRoaXMgd2lsbCBiZSBhIHRyYW5zcG9ydCBmb3IgcmVhZGluZywKLSAgICBvdGhlcndpc2UsIGl0IGlzIGZvciB3cml0aW5nIiIiCi0gICAgaWYgdmFsdWUgaXMgbm90IE5vbmU6Ci0gICAgICBzZWxmLl9idWZmZXIgPSBTdHJpbmdJTyh2YWx1ZSkKLSAgICBlbHNlOgotICAgICAgc2VsZi5fYnVmZmVyID0gU3RyaW5nSU8oKQorICAgICAgICBJZiB2YWx1ZSBpcyBzZXQsIHRoaXMgd2lsbCBiZSBhIHRyYW5zcG9ydCBmb3IgcmVhZGluZywKKyAgICAgICAgb3RoZXJ3aXNlLCBpdCBpcyBmb3Igd3JpdGluZyIiIgorICAgICAgICBpZiB2YWx1ZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX2J1ZmZlciA9IEJ1ZmZlcklPKHZhbHVlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fYnVmZmVyID0gQnVmZmVySU8oKQorICAgICAgICBpZiBvZmZzZXQ6CisgICAgICAgICAgICBzZWxmLl9idWZmZXIuc2VlayhvZmZzZXQpCiAKLSAgZGVmIGlzT3BlbihzZWxmKToKLSAgICByZXR1cm4gbm90IHNlbGYuX2J1ZmZlci5jbG9zZWQKKyAgICBkZWYgaXNPcGVuKHNlbGYpOgorICAgICAgICByZXR1cm4gbm90IHNlbGYuX2J1ZmZlci5jbG9zZWQKIAotICBkZWYgb3BlbihzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIG9wZW4oc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgY2xvc2Uoc2VsZik6Ci0gICAgc2VsZi5fYnVmZmVyLmNsb3NlKCkKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYuX2J1ZmZlci5jbG9zZSgpCiAKLSAgZGVmIHJlYWQoc2VsZiwgc3opOgotICAgIHJldHVybiBzZWxmLl9idWZmZXIucmVhZChzeikKKyAgICBkZWYgcmVhZChzZWxmLCBzeik6CisgICAgICAgIHJldHVybiBzZWxmLl9idWZmZXIucmVhZChzeikKIAotICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKLSAgICBzZWxmLl9idWZmZXIud3JpdGUoYnVmKQorICAgIGRlZiB3cml0ZShzZWxmLCBidWYpOgorICAgICAgICBzZWxmLl9idWZmZXIud3JpdGUoYnVmKQogCi0gIGRlZiBmbHVzaChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIGZsdXNoKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIGdldHZhbHVlKHNlbGYpOgotICAgIHJldHVybiBzZWxmLl9idWZmZXIuZ2V0dmFsdWUoKQorICAgIGRlZiBnZXR2YWx1ZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2J1ZmZlci5nZXR2YWx1ZSgpCiAKLSAgIyBJbXBsZW1lbnQgdGhlIENSZWFkYWJsZVRyYW5zcG9ydCBpbnRlcmZhY2UuCi0gIEBwcm9wZXJ0eQotICBkZWYgY3N0cmluZ2lvX2J1ZihzZWxmKToKLSAgICByZXR1cm4gc2VsZi5fYnVmZmVyCisgICAgIyBJbXBsZW1lbnQgdGhlIENSZWFkYWJsZVRyYW5zcG9ydCBpbnRlcmZhY2UuCisgICAgQHByb3BlcnR5CisgICAgZGVmIGNzdHJpbmdpb19idWYoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9idWZmZXIKIAotICBkZWYgY3N0cmluZ2lvX3JlZmlsbChzZWxmLCBwYXJ0aWFscmVhZCwgcmVxbGVuKToKLSAgICAjIG9ubHkgb25lIHNob3QgYXQgcmVhZGluZy4uLgotICAgIHJhaXNlIEVPRkVycm9yKCkKKyAgICBkZWYgY3N0cmluZ2lvX3JlZmlsbChzZWxmLCBwYXJ0aWFscmVhZCwgcmVxbGVuKToKKyAgICAgICAgIyBvbmx5IG9uZSBzaG90IGF0IHJlYWRpbmcuLi4KKyAgICAgICAgcmFpc2UgRU9GRXJyb3IoKQogCiAKLWNsYXNzIFRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5OgotICAiIiJGYWN0b3J5IHRyYW5zcG9ydCB0aGF0IGJ1aWxkcyBmcmFtZWQgdHJhbnNwb3J0cyIiIgorY2xhc3MgVEZyYW1lZFRyYW5zcG9ydEZhY3Rvcnkob2JqZWN0KToKKyAgICAiIiJGYWN0b3J5IHRyYW5zcG9ydCB0aGF0IGJ1aWxkcyBmcmFtZWQgdHJhbnNwb3J0cyIiIgogCi0gIGRlZiBnZXRUcmFuc3BvcnQoc2VsZiwgdHJhbnMpOgotICAgIGZyYW1lZCA9IFRGcmFtZWRUcmFuc3BvcnQodHJhbnMpCi0gICAgcmV0dXJuIGZyYW1lZAorICAgIGRlZiBnZXRUcmFuc3BvcnQoc2VsZiwgdHJhbnMpOgorICAgICAgICBmcmFtZWQgPSBURnJhbWVkVHJhbnNwb3J0KHRyYW5zKQorICAgICAgICByZXR1cm4gZnJhbWVkCiAKIAogY2xhc3MgVEZyYW1lZFRyYW5zcG9ydChUVHJhbnNwb3J0QmFzZSwgQ1JlYWRhYmxlVHJhbnNwb3J0KToKLSAgIiIiQ2xhc3MgdGhhdCB3cmFwcyBhbm90aGVyIHRyYW5zcG9ydCBhbmQgZnJhbWVzIGl0cyBJL08gd2hlbiB3cml0aW5nLiIiIgorICAgICIiIkNsYXNzIHRoYXQgd3JhcHMgYW5vdGhlciB0cmFuc3BvcnQgYW5kIGZyYW1lcyBpdHMgSS9PIHdoZW4gd3JpdGluZy4iIiIKIAotICBkZWYgX19pbml0X18oc2VsZiwgdHJhbnMsKToKLSAgICBzZWxmLl9fdHJhbnMgPSB0cmFucwotICAgIHNlbGYuX19yYnVmID0gU3RyaW5nSU8oKQotICAgIHNlbGYuX193YnVmID0gU3RyaW5nSU8oKQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0cmFucywpOgorICAgICAgICBzZWxmLl9fdHJhbnMgPSB0cmFucworICAgICAgICBzZWxmLl9fcmJ1ZiA9IEJ1ZmZlcklPKGInJykKKyAgICAgICAgc2VsZi5fX3didWYgPSBCdWZmZXJJTygpCiAKLSAgZGVmIGlzT3BlbihzZWxmKToKLSAgICByZXR1cm4gc2VsZi5fX3RyYW5zLmlzT3BlbigpCisgICAgZGVmIGlzT3BlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX190cmFucy5pc09wZW4oKQogCi0gIGRlZiBvcGVuKHNlbGYpOgotICAgIHJldHVybiBzZWxmLl9fdHJhbnMub3BlbigpCisgICAgZGVmIG9wZW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9fdHJhbnMub3BlbigpCiAKLSAgZGVmIGNsb3NlKHNlbGYpOgotICAgIHJldHVybiBzZWxmLl9fdHJhbnMuY2xvc2UoKQorICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX190cmFucy5jbG9zZSgpCiAKLSAgZGVmIHJlYWQoc2VsZiwgc3opOgotICAgIHJldCA9IHNlbGYuX19yYnVmLnJlYWQoc3opCi0gICAgaWYgbGVuKHJldCkgIT0gMDoKLSAgICAgIHJldHVybiByZXQKKyAgICBkZWYgcmVhZChzZWxmLCBzeik6CisgICAgICAgIHJldCA9IHNlbGYuX19yYnVmLnJlYWQoc3opCisgICAgICAgIGlmIGxlbihyZXQpICE9IDA6CisgICAgICAgICAgICByZXR1cm4gcmV0CiAKLSAgICBzZWxmLnJlYWRGcmFtZSgpCi0gICAgcmV0dXJuIHNlbGYuX19yYnVmLnJlYWQoc3opCisgICAgICAgIHNlbGYucmVhZEZyYW1lKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX19yYnVmLnJlYWQoc3opCiAKLSAgZGVmIHJlYWRGcmFtZShzZWxmKToKLSAgICBidWZmID0gc2VsZi5fX3RyYW5zLnJlYWRBbGwoNCkKLSAgICBzeiwgPSB1bnBhY2soJyFpJywgYnVmZikKLSAgICBzZWxmLl9fcmJ1ZiA9IFN0cmluZ0lPKHNlbGYuX190cmFucy5yZWFkQWxsKHN6KSkKKyAgICBkZWYgcmVhZEZyYW1lKHNlbGYpOgorICAgICAgICBidWZmID0gc2VsZi5fX3RyYW5zLnJlYWRBbGwoNCkKKyAgICAgICAgc3osID0gdW5wYWNrKCchaScsIGJ1ZmYpCisgICAgICAgIHNlbGYuX19yYnVmID0gQnVmZmVySU8oc2VsZi5fX3RyYW5zLnJlYWRBbGwoc3opKQogCi0gIGRlZiB3cml0ZShzZWxmLCBidWYpOgotICAgIHNlbGYuX193YnVmLndyaXRlKGJ1ZikKKyAgICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKKyAgICAgICAgc2VsZi5fX3didWYud3JpdGUoYnVmKQogCi0gIGRlZiBmbHVzaChzZWxmKToKLSAgICB3b3V0ID0gc2VsZi5fX3didWYuZ2V0dmFsdWUoKQotICAgIHdzeiA9IGxlbih3b3V0KQotICAgICMgcmVzZXQgd2J1ZiBiZWZvcmUgd3JpdGUvZmx1c2ggdG8gcHJlc2VydmUgc3RhdGUgb24gdW5kZXJseWluZyBmYWlsdXJlCi0gICAgc2VsZi5fX3didWYgPSBTdHJpbmdJTygpCi0gICAgIyBOLkIuOiBEb2luZyB0aGlzIHN0cmluZyBjb25jYXRlbmF0aW9uIGlzIFdBWSBjaGVhcGVyIHRoYW4gbWFraW5nCi0gICAgIyB0d28gc2VwYXJhdGUgY2FsbHMgdG8gdGhlIHVuZGVybHlpbmcgc29ja2V0IG9iamVjdC4gU29ja2V0IHdyaXRlcyBpbgotICAgICMgUHl0aG9uIHR1cm4gb3V0IHRvIGJlIFJFQUxMWSBleHBlbnNpdmUsIGJ1dCBpdCBzZWVtcyB0byBkbyBhIHByZXR0eQotICAgICMgZ29vZCBqb2Igb2YgbWFuYWdpbmcgc3RyaW5nIGJ1ZmZlciBvcGVyYXRpb25zIHdpdGhvdXQgZXhjZXNzaXZlIGNvcGllcwotICAgIGJ1ZiA9IHBhY2soIiFpIiwgd3N6KSArIHdvdXQKLSAgICBzZWxmLl9fdHJhbnMud3JpdGUoYnVmKQotICAgIHNlbGYuX190cmFucy5mbHVzaCgpCisgICAgZGVmIGZsdXNoKHNlbGYpOgorICAgICAgICB3b3V0ID0gc2VsZi5fX3didWYuZ2V0dmFsdWUoKQorICAgICAgICB3c3ogPSBsZW4od291dCkKKyAgICAgICAgIyByZXNldCB3YnVmIGJlZm9yZSB3cml0ZS9mbHVzaCB0byBwcmVzZXJ2ZSBzdGF0ZSBvbiB1bmRlcmx5aW5nIGZhaWx1cmUKKyAgICAgICAgc2VsZi5fX3didWYgPSBCdWZmZXJJTygpCisgICAgICAgICMgTi5CLjogRG9pbmcgdGhpcyBzdHJpbmcgY29uY2F0ZW5hdGlvbiBpcyBXQVkgY2hlYXBlciB0aGFuIG1ha2luZworICAgICAgICAjIHR3byBzZXBhcmF0ZSBjYWxscyB0byB0aGUgdW5kZXJseWluZyBzb2NrZXQgb2JqZWN0LiBTb2NrZXQgd3JpdGVzIGluCisgICAgICAgICMgUHl0aG9uIHR1cm4gb3V0IHRvIGJlIFJFQUxMWSBleHBlbnNpdmUsIGJ1dCBpdCBzZWVtcyB0byBkbyBhIHByZXR0eQorICAgICAgICAjIGdvb2Qgam9iIG9mIG1hbmFnaW5nIHN0cmluZyBidWZmZXIgb3BlcmF0aW9ucyB3aXRob3V0IGV4Y2Vzc2l2ZSBjb3BpZXMKKyAgICAgICAgYnVmID0gcGFjaygiIWkiLCB3c3opICsgd291dAorICAgICAgICBzZWxmLl9fdHJhbnMud3JpdGUoYnVmKQorICAgICAgICBzZWxmLl9fdHJhbnMuZmx1c2goKQogCi0gICMgSW1wbGVtZW50IHRoZSBDUmVhZGFibGVUcmFuc3BvcnQgaW50ZXJmYWNlLgotICBAcHJvcGVydHkKLSAgZGVmIGNzdHJpbmdpb19idWYoc2VsZik6Ci0gICAgcmV0dXJuIHNlbGYuX19yYnVmCisgICAgIyBJbXBsZW1lbnQgdGhlIENSZWFkYWJsZVRyYW5zcG9ydCBpbnRlcmZhY2UuCisgICAgQHByb3BlcnR5CisgICAgZGVmIGNzdHJpbmdpb19idWYoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9fcmJ1ZgogCi0gIGRlZiBjc3RyaW5naW9fcmVmaWxsKHNlbGYsIHByZWZpeCwgcmVxbGVuKToKLSAgICAjIHNlbGYuX19yYnVmIHdpbGwgYWxyZWFkeSBiZSBlbXB0eSBoZXJlIGJlY2F1c2UgZmFzdGJpbmFyeSBkb2Vzbid0Ci0gICAgIyBhc2sgZm9yIGEgcmVmaWxsIHVudGlsIHRoZSBwcmV2aW91cyBidWZmZXIgaXMgZW1wdHkuICBUaGVyZWZvcmUsCi0gICAgIyB3ZSBjYW4gc3RhcnQgcmVhZGluZyBuZXcgZnJhbWVzIGltbWVkaWF0ZWx5LgotICAgIHdoaWxlIGxlbihwcmVmaXgpIDwgcmVxbGVuOgotICAgICAgc2VsZi5yZWFkRnJhbWUoKQotICAgICAgcHJlZml4ICs9IHNlbGYuX19yYnVmLmdldHZhbHVlKCkKLSAgICBzZWxmLl9fcmJ1ZiA9IFN0cmluZ0lPKHByZWZpeCkKLSAgICByZXR1cm4gc2VsZi5fX3JidWYKKyAgICBkZWYgY3N0cmluZ2lvX3JlZmlsbChzZWxmLCBwcmVmaXgsIHJlcWxlbik6CisgICAgICAgICMgc2VsZi5fX3JidWYgd2lsbCBhbHJlYWR5IGJlIGVtcHR5IGhlcmUgYmVjYXVzZSBmYXN0YmluYXJ5IGRvZXNuJ3QKKyAgICAgICAgIyBhc2sgZm9yIGEgcmVmaWxsIHVudGlsIHRoZSBwcmV2aW91cyBidWZmZXIgaXMgZW1wdHkuICBUaGVyZWZvcmUsCisgICAgICAgICMgd2UgY2FuIHN0YXJ0IHJlYWRpbmcgbmV3IGZyYW1lcyBpbW1lZGlhdGVseS4KKyAgICAgICAgd2hpbGUgbGVuKHByZWZpeCkgPCByZXFsZW46CisgICAgICAgICAgICBzZWxmLnJlYWRGcmFtZSgpCisgICAgICAgICAgICBwcmVmaXggKz0gc2VsZi5fX3JidWYuZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLl9fcmJ1ZiA9IEJ1ZmZlcklPKHByZWZpeCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX19yYnVmCiAKIAogY2xhc3MgVEZpbGVPYmplY3RUcmFuc3BvcnQoVFRyYW5zcG9ydEJhc2UpOgotICAiIiJXcmFwcyBhIGZpbGUtbGlrZSBvYmplY3QgdG8gbWFrZSBpdCB3b3JrIGFzIGEgVGhyaWZ0IHRyYW5zcG9ydC4iIiIKKyAgICAiIiJXcmFwcyBhIGZpbGUtbGlrZSBvYmplY3QgdG8gbWFrZSBpdCB3b3JrIGFzIGEgVGhyaWZ0IHRyYW5zcG9ydC4iIiIKIAotICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW9iaik6Ci0gICAgc2VsZi5maWxlb2JqID0gZmlsZW9iagorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlb2JqKToKKyAgICAgICAgc2VsZi5maWxlb2JqID0gZmlsZW9iagogCi0gIGRlZiBpc09wZW4oc2VsZik6Ci0gICAgcmV0dXJuIFRydWUKKyAgICBkZWYgaXNPcGVuKHNlbGYpOgorICAgICAgICByZXR1cm4gVHJ1ZQogCi0gIGRlZiBjbG9zZShzZWxmKToKLSAgICBzZWxmLmZpbGVvYmouY2xvc2UoKQorICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5maWxlb2JqLmNsb3NlKCkKIAotICBkZWYgcmVhZChzZWxmLCBzeik6Ci0gICAgcmV0dXJuIHNlbGYuZmlsZW9iai5yZWFkKHN6KQorICAgIGRlZiByZWFkKHNlbGYsIHN6KToKKyAgICAgICAgcmV0dXJuIHNlbGYuZmlsZW9iai5yZWFkKHN6KQogCi0gIGRlZiB3cml0ZShzZWxmLCBidWYpOgotICAgIHNlbGYuZmlsZW9iai53cml0ZShidWYpCisgICAgZGVmIHdyaXRlKHNlbGYsIGJ1Zik6CisgICAgICAgIHNlbGYuZmlsZW9iai53cml0ZShidWYpCiAKLSAgZGVmIGZsdXNoKHNlbGYpOgotICAgIHNlbGYuZmlsZW9iai5mbHVzaCgpCisgICAgZGVmIGZsdXNoKHNlbGYpOgorICAgICAgICBzZWxmLmZpbGVvYmouZmx1c2goKQogCiAKIGNsYXNzIFRTYXNsQ2xpZW50VHJhbnNwb3J0KFRUcmFuc3BvcnRCYXNlLCBDUmVhZGFibGVUcmFuc3BvcnQpOgotICAiIiIKLSAgU0FTTCB0cmFuc3BvcnQgCi0gICIiIgotCi0gIFNUQVJUID0gMQotICBPSyA9IDIKLSAgQkFEID0gMwotICBFUlJPUiA9IDQKLSAgQ09NUExFVEUgPSA1Ci0KLSAgZGVmIF9faW5pdF9fKHNlbGYsIHRyYW5zcG9ydCwgaG9zdCwgc2VydmljZSwgbWVjaGFuaXNtPSdHU1NBUEknLAotICAgICAgKipzYXNsX2t3YXJncyk6CiAgICAgIiIiCi0gICAgdHJhbnNwb3J0OiBhbiB1bmRlcmx5aW5nIHRyYW5zcG9ydCB0byB1c2UsIHR5cGljYWxseSBqdXN0IGEgVFNvY2tldAotICAgIGhvc3Q6IHRoZSBuYW1lIG9mIHRoZSBzZXJ2ZXIsIGZyb20gYSBTQVNMIHBlcnNwZWN0aXZlCi0gICAgc2VydmljZTogdGhlIG5hbWUgb2YgdGhlIHNlcnZlcidzIHNlcnZpY2UsIGZyb20gYSBTQVNMIHBlcnNwZWN0aXZlCi0gICAgbWVjaGFuaXNtOiB0aGUgbmFtZSBvZiB0aGUgcHJlZmVycmVkIG1lY2hhbmlzbSB0byB1c2UKLQotICAgIEFsbCBvdGhlciBrd2FyZ3Mgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIHB1cmVzYXNsLmNsaWVudC5TQVNMQ2xpZW50Ci0gICAgY29uc3RydWN0b3IuCisgICAgU0FTTCB0cmFuc3BvcnQKICAgICAiIiIKIAotICAgIGZyb20gcHVyZXNhc2wuY2xpZW50IGltcG9ydCBTQVNMQ2xpZW50CisgICAgU1RBUlQgPSAxCisgICAgT0sgPSAyCisgICAgQkFEID0gMworICAgIEVSUk9SID0gNAorICAgIENPTVBMRVRFID0gNQogCi0gICAgc2VsZi50cmFuc3BvcnQgPSB0cmFuc3BvcnQKLSAgICBzZWxmLnNhc2wgPSBTQVNMQ2xpZW50KGhvc3QsIHNlcnZpY2UsIG1lY2hhbmlzbSwgKipzYXNsX2t3YXJncykKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHJhbnNwb3J0LCBob3N0LCBzZXJ2aWNlLCBtZWNoYW5pc209J0dTU0FQSScsCisgICAgICAgICAgICAgICAgICoqc2FzbF9rd2FyZ3MpOgorICAgICAgICAiIiIKKyAgICAgICAgdHJhbnNwb3J0OiBhbiB1bmRlcmx5aW5nIHRyYW5zcG9ydCB0byB1c2UsIHR5cGljYWxseSBqdXN0IGEgVFNvY2tldAorICAgICAgICBob3N0OiB0aGUgbmFtZSBvZiB0aGUgc2VydmVyLCBmcm9tIGEgU0FTTCBwZXJzcGVjdGl2ZQorICAgICAgICBzZXJ2aWNlOiB0aGUgbmFtZSBvZiB0aGUgc2VydmVyJ3Mgc2VydmljZSwgZnJvbSBhIFNBU0wgcGVyc3BlY3RpdmUKKyAgICAgICAgbWVjaGFuaXNtOiB0aGUgbmFtZSBvZiB0aGUgcHJlZmVycmVkIG1lY2hhbmlzbSB0byB1c2UKIAotICAgIHNlbGYuX193YnVmID0gU3RyaW5nSU8oKQotICAgIHNlbGYuX19yYnVmID0gU3RyaW5nSU8oKQorICAgICAgICBBbGwgb3RoZXIga3dhcmdzIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBwdXJlc2FzbC5jbGllbnQuU0FTTENsaWVudAorICAgICAgICBjb25zdHJ1Y3Rvci4KKyAgICAgICAgIiIiCiAKLSAgZGVmIG9wZW4oc2VsZik6Ci0gICAgaWYgbm90IHNlbGYudHJhbnNwb3J0LmlzT3BlbigpOgotICAgICAgc2VsZi50cmFuc3BvcnQub3BlbigpCisgICAgICAgIGZyb20gcHVyZXNhc2wuY2xpZW50IGltcG9ydCBTQVNMQ2xpZW50CiAKLSAgICBzZWxmLnNlbmRfc2FzbF9tc2coc2VsZi5TVEFSVCwgc2VsZi5zYXNsLm1lY2hhbmlzbSkKLSAgICBzZWxmLnNlbmRfc2FzbF9tc2coc2VsZi5PSywgc2VsZi5zYXNsLnByb2Nlc3MoKSkKKyAgICAgICAgc2VsZi50cmFuc3BvcnQgPSB0cmFuc3BvcnQKKyAgICAgICAgc2VsZi5zYXNsID0gU0FTTENsaWVudChob3N0LCBzZXJ2aWNlLCBtZWNoYW5pc20sICoqc2FzbF9rd2FyZ3MpCiAKLSAgICB3aGlsZSBUcnVlOgotICAgICAgc3RhdHVzLCBjaGFsbGVuZ2UgPSBzZWxmLnJlY3Zfc2FzbF9tc2coKQotICAgICAgaWYgc3RhdHVzID09IHNlbGYuT0s6Ci0gICAgICAgIHNlbGYuc2VuZF9zYXNsX21zZyhzZWxmLk9LLCBzZWxmLnNhc2wucHJvY2VzcyhjaGFsbGVuZ2UpKQotICAgICAgZWxpZiBzdGF0dXMgPT0gc2VsZi5DT01QTEVURToKLSAgICAgICAgaWYgbm90IHNlbGYuc2FzbC5jb21wbGV0ZToKLSAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKCJUaGUgc2VydmVyIGVycm9uZW91c2x5IGluZGljYXRlZCAiCi0gICAgICAgICAgICAgICJ0aGF0IFNBU0wgbmVnb3RpYXRpb24gd2FzIGNvbXBsZXRlIikKKyAgICAgICAgc2VsZi5fX3didWYgPSBCdWZmZXJJTygpCisgICAgICAgIHNlbGYuX19yYnVmID0gQnVmZmVySU8oYicnKQorCisgICAgZGVmIG9wZW4oc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLnRyYW5zcG9ydC5pc09wZW4oKToKKyAgICAgICAgICAgIHNlbGYudHJhbnNwb3J0Lm9wZW4oKQorCisgICAgICAgIHNlbGYuc2VuZF9zYXNsX21zZyhzZWxmLlNUQVJULCBzZWxmLnNhc2wubWVjaGFuaXNtKQorICAgICAgICBzZWxmLnNlbmRfc2FzbF9tc2coc2VsZi5PSywgc2VsZi5zYXNsLnByb2Nlc3MoKSkKKworICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgc3RhdHVzLCBjaGFsbGVuZ2UgPSBzZWxmLnJlY3Zfc2FzbF9tc2coKQorICAgICAgICAgICAgaWYgc3RhdHVzID09IHNlbGYuT0s6CisgICAgICAgICAgICAgICAgc2VsZi5zZW5kX3Nhc2xfbXNnKHNlbGYuT0ssIHNlbGYuc2FzbC5wcm9jZXNzKGNoYWxsZW5nZSkpCisgICAgICAgICAgICBlbGlmIHN0YXR1cyA9PSBzZWxmLkNPTVBMRVRFOgorICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLnNhc2wuY29tcGxldGU6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBzZXJ2ZXIgZXJyb25lb3VzbHkgaW5kaWNhdGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aGF0IFNBU0wgbmVnb3RpYXRpb24gd2FzIGNvbXBsZXRlIikKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAiQmFkIFNBU0wgbmVnb3RpYXRpb24gc3RhdHVzOiAlZCAoJXMpIgorICAgICAgICAgICAgICAgICAgICAlIChzdGF0dXMsIGNoYWxsZW5nZSkpCisKKyAgICBkZWYgc2VuZF9zYXNsX21zZyhzZWxmLCBzdGF0dXMsIGJvZHkpOgorICAgICAgICBoZWFkZXIgPSBwYWNrKCI+QkkiLCBzdGF0dXMsIGxlbihib2R5KSkKKyAgICAgICAgc2VsZi50cmFuc3BvcnQud3JpdGUoaGVhZGVyICsgYm9keSkKKyAgICAgICAgc2VsZi50cmFuc3BvcnQuZmx1c2goKQorCisgICAgZGVmIHJlY3Zfc2FzbF9tc2coc2VsZik6CisgICAgICAgIGhlYWRlciA9IHNlbGYudHJhbnNwb3J0LnJlYWRBbGwoNSkKKyAgICAgICAgc3RhdHVzLCBsZW5ndGggPSB1bnBhY2soIj5CSSIsIGhlYWRlcikKKyAgICAgICAgaWYgbGVuZ3RoID4gMDoKKyAgICAgICAgICAgIHBheWxvYWQgPSBzZWxmLnRyYW5zcG9ydC5yZWFkQWxsKGxlbmd0aCkKICAgICAgICAgZWxzZToKLSAgICAgICAgICBicmVhawotICAgICAgZWxzZToKLSAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQmFkIFNBU0wgbmVnb3RpYXRpb24gc3RhdHVzOiAlZCAoJXMpIgotICAgICAgICAgICAgJSAoc3RhdHVzLCBjaGFsbGVuZ2UpKQorICAgICAgICAgICAgcGF5bG9hZCA9ICIiCisgICAgICAgIHJldHVybiBzdGF0dXMsIHBheWxvYWQKIAotICBkZWYgc2VuZF9zYXNsX21zZyhzZWxmLCBzdGF0dXMsIGJvZHkpOgotICAgIGhlYWRlciA9IHBhY2soIj5CSSIsIHN0YXR1cywgbGVuKGJvZHkpKQotICAgIHNlbGYudHJhbnNwb3J0LndyaXRlKGhlYWRlciArIGJvZHkpCi0gICAgc2VsZi50cmFuc3BvcnQuZmx1c2goKQorICAgIGRlZiB3cml0ZShzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5fX3didWYud3JpdGUoZGF0YSkKIAotICBkZWYgcmVjdl9zYXNsX21zZyhzZWxmKToKLSAgICBoZWFkZXIgPSBzZWxmLnRyYW5zcG9ydC5yZWFkQWxsKDUpCi0gICAgc3RhdHVzLCBsZW5ndGggPSB1bnBhY2soIj5CSSIsIGhlYWRlcikKLSAgICBpZiBsZW5ndGggPiAwOgotICAgICAgcGF5bG9hZCA9IHNlbGYudHJhbnNwb3J0LnJlYWRBbGwobGVuZ3RoKQotICAgIGVsc2U6Ci0gICAgICBwYXlsb2FkID0gIiIKLSAgICByZXR1cm4gc3RhdHVzLCBwYXlsb2FkCisgICAgZGVmIGZsdXNoKHNlbGYpOgorICAgICAgICBkYXRhID0gc2VsZi5fX3didWYuZ2V0dmFsdWUoKQorICAgICAgICBlbmNvZGVkID0gc2VsZi5zYXNsLndyYXAoZGF0YSkKKyAgICAgICAgc2VsZi50cmFuc3BvcnQud3JpdGUoJycuam9pbigocGFjaygiIWkiLCBsZW4oZW5jb2RlZCkpLCBlbmNvZGVkKSkpCisgICAgICAgIHNlbGYudHJhbnNwb3J0LmZsdXNoKCkKKyAgICAgICAgc2VsZi5fX3didWYgPSBCdWZmZXJJTygpCiAKLSAgZGVmIHdyaXRlKHNlbGYsIGRhdGEpOgotICAgIHNlbGYuX193YnVmLndyaXRlKGRhdGEpCisgICAgZGVmIHJlYWQoc2VsZiwgc3opOgorICAgICAgICByZXQgPSBzZWxmLl9fcmJ1Zi5yZWFkKHN6KQorICAgICAgICBpZiBsZW4ocmV0KSAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHJldAogCi0gIGRlZiBmbHVzaChzZWxmKToKLSAgICBkYXRhID0gc2VsZi5fX3didWYuZ2V0dmFsdWUoKQotICAgIGVuY29kZWQgPSBzZWxmLnNhc2wud3JhcChkYXRhKQotICAgIHNlbGYudHJhbnNwb3J0LndyaXRlKCcnLmpvaW4oKHBhY2soIiFpIiwgbGVuKGVuY29kZWQpKSwgZW5jb2RlZCkpKQotICAgIHNlbGYudHJhbnNwb3J0LmZsdXNoKCkKLSAgICBzZWxmLl9fd2J1ZiA9IFN0cmluZ0lPKCkKKyAgICAgICAgc2VsZi5fcmVhZF9mcmFtZSgpCisgICAgICAgIHJldHVybiBzZWxmLl9fcmJ1Zi5yZWFkKHN6KQogCi0gIGRlZiByZWFkKHNlbGYsIHN6KToKLSAgICByZXQgPSBzZWxmLl9fcmJ1Zi5yZWFkKHN6KQotICAgIGlmIGxlbihyZXQpICE9IDA6Ci0gICAgICByZXR1cm4gcmV0CisgICAgZGVmIF9yZWFkX2ZyYW1lKHNlbGYpOgorICAgICAgICBoZWFkZXIgPSBzZWxmLnRyYW5zcG9ydC5yZWFkQWxsKDQpCisgICAgICAgIGxlbmd0aCwgPSB1bnBhY2soJyFpJywgaGVhZGVyKQorICAgICAgICBlbmNvZGVkID0gc2VsZi50cmFuc3BvcnQucmVhZEFsbChsZW5ndGgpCisgICAgICAgIHNlbGYuX19yYnVmID0gQnVmZmVySU8oc2VsZi5zYXNsLnVud3JhcChlbmNvZGVkKSkKIAotICAgIHNlbGYuX3JlYWRfZnJhbWUoKQotICAgIHJldHVybiBzZWxmLl9fcmJ1Zi5yZWFkKHN6KQorICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5zYXNsLmRpc3Bvc2UoKQorICAgICAgICBzZWxmLnRyYW5zcG9ydC5jbG9zZSgpCiAKLSAgZGVmIF9yZWFkX2ZyYW1lKHNlbGYpOgotICAgIGhlYWRlciA9IHNlbGYudHJhbnNwb3J0LnJlYWRBbGwoNCkKLSAgICBsZW5ndGgsID0gdW5wYWNrKCchaScsIGhlYWRlcikKLSAgICBlbmNvZGVkID0gc2VsZi50cmFuc3BvcnQucmVhZEFsbChsZW5ndGgpCi0gICAgc2VsZi5fX3JidWYgPSBTdHJpbmdJTyhzZWxmLnNhc2wudW53cmFwKGVuY29kZWQpKQorICAgICMgYmFzZWQgb24gVEZyYW1lZFRyYW5zcG9ydAorICAgIEBwcm9wZXJ0eQorICAgIGRlZiBjc3RyaW5naW9fYnVmKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX3JidWYKIAotICBkZWYgY2xvc2Uoc2VsZik6Ci0gICAgc2VsZi5zYXNsLmRpc3Bvc2UoKQotICAgIHNlbGYudHJhbnNwb3J0LmNsb3NlKCkKLQotICAjIGJhc2VkIG9uIFRGcmFtZWRUcmFuc3BvcnQKLSAgQHByb3BlcnR5Ci0gIGRlZiBjc3RyaW5naW9fYnVmKHNlbGYpOgotICAgIHJldHVybiBzZWxmLl9fcmJ1ZgotCi0gIGRlZiBjc3RyaW5naW9fcmVmaWxsKHNlbGYsIHByZWZpeCwgcmVxbGVuKToKLSAgICAjIHNlbGYuX19yYnVmIHdpbGwgYWxyZWFkeSBiZSBlbXB0eSBoZXJlIGJlY2F1c2UgZmFzdGJpbmFyeSBkb2Vzbid0Ci0gICAgIyBhc2sgZm9yIGEgcmVmaWxsIHVudGlsIHRoZSBwcmV2aW91cyBidWZmZXIgaXMgZW1wdHkuICBUaGVyZWZvcmUsCi0gICAgIyB3ZSBjYW4gc3RhcnQgcmVhZGluZyBuZXcgZnJhbWVzIGltbWVkaWF0ZWx5LgotICAgIHdoaWxlIGxlbihwcmVmaXgpIDwgcmVxbGVuOgotICAgICAgc2VsZi5fcmVhZF9mcmFtZSgpCi0gICAgICBwcmVmaXggKz0gc2VsZi5fX3JidWYuZ2V0dmFsdWUoKQotICAgIHNlbGYuX19yYnVmID0gU3RyaW5nSU8ocHJlZml4KQotICAgIHJldHVybiBzZWxmLl9fcmJ1ZgotCisgICAgZGVmIGNzdHJpbmdpb19yZWZpbGwoc2VsZiwgcHJlZml4LCByZXFsZW4pOgorICAgICAgICAjIHNlbGYuX19yYnVmIHdpbGwgYWxyZWFkeSBiZSBlbXB0eSBoZXJlIGJlY2F1c2UgZmFzdGJpbmFyeSBkb2Vzbid0CisgICAgICAgICMgYXNrIGZvciBhIHJlZmlsbCB1bnRpbCB0aGUgcHJldmlvdXMgYnVmZmVyIGlzIGVtcHR5LiAgVGhlcmVmb3JlLAorICAgICAgICAjIHdlIGNhbiBzdGFydCByZWFkaW5nIG5ldyBmcmFtZXMgaW1tZWRpYXRlbHkuCisgICAgICAgIHdoaWxlIGxlbihwcmVmaXgpIDwgcmVxbGVuOgorICAgICAgICAgICAgc2VsZi5fcmVhZF9mcmFtZSgpCisgICAgICAgICAgICBwcmVmaXggKz0gc2VsZi5fX3JidWYuZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLl9fcmJ1ZiA9IEJ1ZmZlcklPKHByZWZpeCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX19yYnVmCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3RyYW5zcG9ydC9UVHdpc3RlZC5weSBiL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RUd2lzdGVkLnB5CmluZGV4IDI5YmJkNGMuLmEyN2YwYWQgMTAwNjQ0Ci0tLSBhL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RUd2lzdGVkLnB5CisrKyBiL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RUd2lzdGVkLnB5CkBAIC0xNywxMCArMTcsMTAgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKK2Zyb20gaW8gaW1wb3J0IEJ5dGVzSU8KIGltcG9ydCBzdHJ1Y3QKLWZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTwogCi1mcm9tIHpvcGUuaW50ZXJmYWNlIGltcG9ydCBpbXBsZW1lbnRzLCBJbnRlcmZhY2UsIEF0dHJpYnV0ZQorZnJvbSB6b3BlLmludGVyZmFjZSBpbXBvcnQgaW1wbGVtZW50ZXIsIEludGVyZmFjZSwgQXR0cmlidXRlCiBmcm9tIHR3aXN0ZWQuaW50ZXJuZXQucHJvdG9jb2wgaW1wb3J0IFNlcnZlckZhY3RvcnksIENsaWVudEZhY3RvcnksIFwKICAgICBjb25uZWN0aW9uRG9uZQogZnJvbSB0d2lzdGVkLmludGVybmV0IGltcG9ydCBkZWZlcgpAQCAtMzQsMTQgKzM0LDE0IEBACiBjbGFzcyBUTWVzc2FnZVNlbmRlclRyYW5zcG9ydChUVHJhbnNwb3J0LlRUcmFuc3BvcnRCYXNlKToKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgc2VsZi5fX3didWYgPSBTdHJpbmdJTygpCisgICAgICAgIHNlbGYuX193YnVmID0gQnl0ZXNJTygpCiAKICAgICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKICAgICAgICAgc2VsZi5fX3didWYud3JpdGUoYnVmKQogCiAgICAgZGVmIGZsdXNoKHNlbGYpOgogICAgICAgICBtc2cgPSBzZWxmLl9fd2J1Zi5nZXR2YWx1ZSgpCi0gICAgICAgIHNlbGYuX193YnVmID0gU3RyaW5nSU8oKQorICAgICAgICBzZWxmLl9fd2J1ZiA9IEJ5dGVzSU8oKQogICAgICAgICByZXR1cm4gc2VsZi5zZW5kTWVzc2FnZShtc2cpCiAKICAgICBkZWYgc2VuZE1lc3NhZ2Uoc2VsZiwgbWVzc2FnZSk6CkBAIC04MiwxMSArODIsMTggQEAKICAgICAgICAgc2VsZi5zdGFydGVkLmNhbGxiYWNrKHNlbGYuY2xpZW50KQogCiAgICAgZGVmIGNvbm5lY3Rpb25Mb3N0KHNlbGYsIHJlYXNvbj1jb25uZWN0aW9uRG9uZSk6Ci0gICAgICAgIGZvciBrLCB2IGluIHNlbGYuY2xpZW50Ll9yZXFzLml0ZXJpdGVtcygpOgorICAgICAgICAjIHRoZSBjYWxsZWQgZXJyYmFja3MgY2FuIGFkZCBpdGVtcyB0byBvdXIgY2xpZW50J3MgX3JlcXMsCisgICAgICAgICMgc28gd2UgbmVlZCB0byB1c2UgYSB0bXAsIGFuZCBpdGVyYXRlIHVudGlsIG5vIG1vcmUgcmVxdWVzdHMKKyAgICAgICAgIyBhcmUgYWRkZWQgZHVyaW5nIGVycmJhY2tzCisgICAgICAgIGlmIHNlbGYuY2xpZW50OgogICAgICAgICAgICAgdGV4ID0gVFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uKAogICAgICAgICAgICAgICAgIHR5cGU9VFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uLkVORF9PRl9GSUxFLAotICAgICAgICAgICAgICAgIG1lc3NhZ2U9J0Nvbm5lY3Rpb24gY2xvc2VkJykKLSAgICAgICAgICAgIHYuZXJyYmFjayh0ZXgpCisgICAgICAgICAgICAgICAgbWVzc2FnZT0nQ29ubmVjdGlvbiBjbG9zZWQgKCVzKScgJSByZWFzb24pCisgICAgICAgICAgICB3aGlsZSBzZWxmLmNsaWVudC5fcmVxczoKKyAgICAgICAgICAgICAgICBfLCB2ID0gc2VsZi5jbGllbnQuX3JlcXMucG9waXRlbSgpCisgICAgICAgICAgICAgICAgdi5lcnJiYWNrKHRleCkKKyAgICAgICAgICAgIGRlbCBzZWxmLmNsaWVudC5fcmVxcworICAgICAgICAgICAgc2VsZi5jbGllbnQgPSBOb25lCiAKICAgICBkZWYgc3RyaW5nUmVjZWl2ZWQoc2VsZiwgZnJhbWUpOgogICAgICAgICB0ciA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihmcmFtZSkKQEAgLTExMyw3ICsxMjAsNyBAQAogICAgIE1BWF9MRU5HVEggPSAyICoqIDMxIC0gMQogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNsaWVudF9jbGFzcywgaXByb3RfZmFjdG9yeSwgb3Byb3RfZmFjdG9yeT1Ob25lLAotICAgICAgICAgICAgaG9zdD1Ob25lLCBzZXJ2aWNlPU5vbmUsIG1lY2hhbmlzbT0nR1NTQVBJJywgKipzYXNsX2t3YXJncyk6CisgICAgICAgICAgICAgICAgIGhvc3Q9Tm9uZSwgc2VydmljZT1Ob25lLCBtZWNoYW5pc209J0dTU0FQSScsICoqc2FzbF9rd2FyZ3MpOgogICAgICAgICAiIiIKICAgICAgICAgaG9zdDogdGhlIG5hbWUgb2YgdGhlIHNlcnZlciwgZnJvbSBhIFNBU0wgcGVyc3BlY3RpdmUKICAgICAgICAgc2VydmljZTogdGhlIG5hbWUgb2YgdGhlIHNlcnZlcidzIHNlcnZpY2UsIGZyb20gYSBTQVNMIHBlcnNwZWN0aXZlCkBAIC0yMjksNyArMjM2LDcgQEAKIAogICAgICAgICBkID0gc2VsZi5mYWN0b3J5LnByb2Nlc3Nvci5wcm9jZXNzKGlwcm90LCBvcHJvdCkKICAgICAgICAgZC5hZGRDYWxsYmFja3Moc2VsZi5wcm9jZXNzT2ssIHNlbGYucHJvY2Vzc0Vycm9yLAotICAgICAgICAgICAgY2FsbGJhY2tBcmdzPSh0bW8sKSkKKyAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tBcmdzPSh0bW8sKSkKIAogCiBjbGFzcyBJVGhyaWZ0U2VydmVyRmFjdG9yeShJbnRlcmZhY2UpOgpAQCAtMjUwLDEwICsyNTcsOSBAQAogICAgIG9wcm90X2ZhY3RvcnkgPSBBdHRyaWJ1dGUoIk91dHB1dCBwcm90b2NvbCBmYWN0b3J5IikKIAogCitAaW1wbGVtZW50ZXIoSVRocmlmdFNlcnZlckZhY3RvcnkpCiBjbGFzcyBUaHJpZnRTZXJ2ZXJGYWN0b3J5KFNlcnZlckZhY3RvcnkpOgogCi0gICAgaW1wbGVtZW50cyhJVGhyaWZ0U2VydmVyRmFjdG9yeSkKLQogICAgIHByb3RvY29sID0gVGhyaWZ0U2VydmVyUHJvdG9jb2wKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcm9jZXNzb3IsIGlwcm90X2ZhY3RvcnksIG9wcm90X2ZhY3Rvcnk9Tm9uZSk6CkBAIC0yNjUsMTAgKzI3MSw5IEBACiAgICAgICAgICAgICBzZWxmLm9wcm90X2ZhY3RvcnkgPSBvcHJvdF9mYWN0b3J5CiAKIAorQGltcGxlbWVudGVyKElUaHJpZnRDbGllbnRGYWN0b3J5KQogY2xhc3MgVGhyaWZ0Q2xpZW50RmFjdG9yeShDbGllbnRGYWN0b3J5KToKIAotICAgIGltcGxlbWVudHMoSVRocmlmdENsaWVudEZhY3RvcnkpCi0KICAgICBwcm90b2NvbCA9IFRocmlmdENsaWVudFByb3RvY29sCiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgY2xpZW50X2NsYXNzLCBpcHJvdF9mYWN0b3J5LCBvcHJvdF9mYWN0b3J5PU5vbmUpOgpAQCAtMjgxLDcgKzI4Niw3IEBACiAKICAgICBkZWYgYnVpbGRQcm90b2NvbChzZWxmLCBhZGRyKToKICAgICAgICAgcCA9IHNlbGYucHJvdG9jb2woc2VsZi5jbGllbnRfY2xhc3MsIHNlbGYuaXByb3RfZmFjdG9yeSwKLSAgICAgICAgICAgIHNlbGYub3Byb3RfZmFjdG9yeSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHJvdF9mYWN0b3J5KQogICAgICAgICBwLmZhY3RvcnkgPSBzZWxmCiAgICAgICAgIHJldHVybiBwCiAKQEAgLTI5MSw3ICsyOTYsNyBAQAogICAgIGFsbG93ZWRNZXRob2RzID0gKCdQT1NUJywpCiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgcHJvY2Vzc29yLCBpbnB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5PU5vbmUpOgorICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbEZhY3Rvcnk9Tm9uZSk6CiAgICAgICAgIHJlc291cmNlLlJlc291cmNlLl9faW5pdF9fKHNlbGYpCiAgICAgICAgIHNlbGYuaW5wdXRQcm90b2NvbEZhY3RvcnkgPSBpbnB1dFByb3RvY29sRmFjdG9yeQogICAgICAgICBpZiBvdXRwdXRQcm90b2NvbEZhY3RvcnkgaXMgTm9uZToKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0LnB5IGIvbGliL3B5L3NyYy90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQucHkKaW5kZXggYTJmNDJhNS4uZTg0ODU3OSAxMDA2NDQKLS0tIGEvbGliL3B5L3NyYy90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQucHkKKysrIGIvbGliL3B5L3NyYy90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQucHkKQEAgLTI0LDIyNSArMjQsMjI1IEBACiAKIGZyb20gX19mdXR1cmVfXyBpbXBvcnQgZGl2aXNpb24KIGltcG9ydCB6bGliCi1mcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KLWZyb20gVFRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydEJhc2UsIENSZWFkYWJsZVRyYW5zcG9ydAorZnJvbSAuVFRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydEJhc2UsIENSZWFkYWJsZVRyYW5zcG9ydAorZnJvbSAuLmNvbXBhdCBpbXBvcnQgQnVmZmVySU8KIAogCiBjbGFzcyBUWmxpYlRyYW5zcG9ydEZhY3Rvcnkob2JqZWN0KToKLSAgIiIiRmFjdG9yeSB0cmFuc3BvcnQgdGhhdCBidWlsZHMgemxpYiBjb21wcmVzc2VkIHRyYW5zcG9ydHMuCisgICAgIiIiRmFjdG9yeSB0cmFuc3BvcnQgdGhhdCBidWlsZHMgemxpYiBjb21wcmVzc2VkIHRyYW5zcG9ydHMuCiAKLSAgVGhpcyBmYWN0b3J5IGNhY2hlcyB0aGUgbGFzdCBzaW5nbGUgY2xpZW50L3RyYW5zcG9ydCB0aGF0IGl0IHdhcyBwYXNzZWQKLSAgYW5kIHJldHVybnMgdGhlIHNhbWUgVFpsaWJUcmFuc3BvcnQgb2JqZWN0IHRoYXQgd2FzIGNyZWF0ZWQuCisgICAgVGhpcyBmYWN0b3J5IGNhY2hlcyB0aGUgbGFzdCBzaW5nbGUgY2xpZW50L3RyYW5zcG9ydCB0aGF0IGl0IHdhcyBwYXNzZWQKKyAgICBhbmQgcmV0dXJucyB0aGUgc2FtZSBUWmxpYlRyYW5zcG9ydCBvYmplY3QgdGhhdCB3YXMgY3JlYXRlZC4KIAotICBUaGlzIGNhY2hpbmcgbWVhbnMgdGhlIFRTZXJ2ZXIgY2xhc3Mgd2lsbCBnZXQgdGhlIF9zYW1lXyB0cmFuc3BvcnQKLSAgb2JqZWN0IGZvciBib3RoIGlucHV0IGFuZCBvdXRwdXQgdHJhbnNwb3J0cyBmcm9tIHRoaXMgZmFjdG9yeS4KLSAgKEZvciBub24tdGhyZWFkZWQgc2NlbmFyaW9zIG9ubHksIHNpbmNlIHRoZSBjYWNoZSBvbmx5IGhvbGRzIG9uZSBvYmplY3QpCisgICAgVGhpcyBjYWNoaW5nIG1lYW5zIHRoZSBUU2VydmVyIGNsYXNzIHdpbGwgZ2V0IHRoZSBfc2FtZV8gdHJhbnNwb3J0CisgICAgb2JqZWN0IGZvciBib3RoIGlucHV0IGFuZCBvdXRwdXQgdHJhbnNwb3J0cyBmcm9tIHRoaXMgZmFjdG9yeS4KKyAgICAoRm9yIG5vbi10aHJlYWRlZCBzY2VuYXJpb3Mgb25seSwgc2luY2UgdGhlIGNhY2hlIG9ubHkgaG9sZHMgb25lIG9iamVjdCkKIAotICBUaGUgcHVycG9zZSBvZiB0aGlzIGNhY2hpbmcgaXMgdG8gYWxsb2NhdGUgb25seSBvbmUgVFpsaWJUcmFuc3BvcnQgd2hlcmUKLSAgb25seSBvbmUgaXMgcmVhbGx5IG5lZWRlZCAoc2luY2UgaXQgbXVzdCBoYXZlIHNlcGFyYXRlIHJlYWQvd3JpdGUgYnVmZmVycyksCi0gIGFuZCBtYWtlcyB0aGUgc3RhdGlzdGljcyBmcm9tIGdldENvbXBTYXZpbmdzKCkgYW5kIGdldENvbXBSYXRpbygpCi0gIGVhc2llciB0byB1bmRlcnN0YW5kLgotICAiIiIKLSAgIyBjbGFzcyBzY29wZWQgY2FjaGUgb2YgbGFzdCB0cmFuc3BvcnQgZ2l2ZW4gYW5kIHpsaWJ0cmFuc3BvcnQgcmV0dXJuZWQKLSAgX2xhc3RfdHJhbnMgPSBOb25lCi0gIF9sYXN0X3ogPSBOb25lCi0KLSAgZGVmIGdldFRyYW5zcG9ydChzZWxmLCB0cmFucywgY29tcHJlc3NsZXZlbD05KToKLSAgICAiIiJXcmFwIGEgdHJhbnNwb3J0LCB0cmFucywgd2l0aCB0aGUgVFpsaWJUcmFuc3BvcnQKLSAgICBjb21wcmVzc2VkIHRyYW5zcG9ydCBjbGFzcywgcmV0dXJuaW5nIGEgbmV3Ci0gICAgdHJhbnNwb3J0IHRvIHRoZSBjYWxsZXIuCi0KLSAgICBAcGFyYW0gY29tcHJlc3NsZXZlbDogVGhlIHpsaWIgY29tcHJlc3Npb24gbGV2ZWwsIHJhbmdpbmcKLSAgICBmcm9tIDAgKG5vIGNvbXByZXNzaW9uKSB0byA5IChiZXN0IGNvbXByZXNzaW9uKS4gIERlZmF1bHRzIHRvIDkuCi0gICAgQHR5cGUgY29tcHJlc3NsZXZlbDogaW50Ci0KLSAgICBUaGlzIG1ldGhvZCByZXR1cm5zIGEgVFpsaWJUcmFuc3BvcnQgd2hpY2ggd3JhcHMgdGhlCi0gICAgcGFzc2VkIEN7dHJhbnN9IFRUcmFuc3BvcnQgZGVyaXZlZCBpbnN0YW5jZS4KKyAgICBUaGUgcHVycG9zZSBvZiB0aGlzIGNhY2hpbmcgaXMgdG8gYWxsb2NhdGUgb25seSBvbmUgVFpsaWJUcmFuc3BvcnQgd2hlcmUKKyAgICBvbmx5IG9uZSBpcyByZWFsbHkgbmVlZGVkIChzaW5jZSBpdCBtdXN0IGhhdmUgc2VwYXJhdGUgcmVhZC93cml0ZSBidWZmZXJzKSwKKyAgICBhbmQgbWFrZXMgdGhlIHN0YXRpc3RpY3MgZnJvbSBnZXRDb21wU2F2aW5ncygpIGFuZCBnZXRDb21wUmF0aW8oKQorICAgIGVhc2llciB0byB1bmRlcnN0YW5kLgogICAgICIiIgotICAgIGlmIHRyYW5zID09IHNlbGYuX2xhc3RfdHJhbnM6Ci0gICAgICByZXR1cm4gc2VsZi5fbGFzdF96Ci0gICAgenRyYW5zID0gVFpsaWJUcmFuc3BvcnQodHJhbnMsIGNvbXByZXNzbGV2ZWwpCi0gICAgc2VsZi5fbGFzdF90cmFucyA9IHRyYW5zCi0gICAgc2VsZi5fbGFzdF96ID0genRyYW5zCi0gICAgcmV0dXJuIHp0cmFucworICAgICMgY2xhc3Mgc2NvcGVkIGNhY2hlIG9mIGxhc3QgdHJhbnNwb3J0IGdpdmVuIGFuZCB6bGlidHJhbnNwb3J0IHJldHVybmVkCisgICAgX2xhc3RfdHJhbnMgPSBOb25lCisgICAgX2xhc3RfeiA9IE5vbmUKKworICAgIGRlZiBnZXRUcmFuc3BvcnQoc2VsZiwgdHJhbnMsIGNvbXByZXNzbGV2ZWw9OSk6CisgICAgICAgICIiIldyYXAgYSB0cmFuc3BvcnQsIHRyYW5zLCB3aXRoIHRoZSBUWmxpYlRyYW5zcG9ydAorICAgICAgICBjb21wcmVzc2VkIHRyYW5zcG9ydCBjbGFzcywgcmV0dXJuaW5nIGEgbmV3CisgICAgICAgIHRyYW5zcG9ydCB0byB0aGUgY2FsbGVyLgorCisgICAgICAgIEBwYXJhbSBjb21wcmVzc2xldmVsOiBUaGUgemxpYiBjb21wcmVzc2lvbiBsZXZlbCwgcmFuZ2luZworICAgICAgICBmcm9tIDAgKG5vIGNvbXByZXNzaW9uKSB0byA5IChiZXN0IGNvbXByZXNzaW9uKS4gIERlZmF1bHRzIHRvIDkuCisgICAgICAgIEB0eXBlIGNvbXByZXNzbGV2ZWw6IGludAorCisgICAgICAgIFRoaXMgbWV0aG9kIHJldHVybnMgYSBUWmxpYlRyYW5zcG9ydCB3aGljaCB3cmFwcyB0aGUKKyAgICAgICAgcGFzc2VkIEN7dHJhbnN9IFRUcmFuc3BvcnQgZGVyaXZlZCBpbnN0YW5jZS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHRyYW5zID09IHNlbGYuX2xhc3RfdHJhbnM6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fbGFzdF96CisgICAgICAgIHp0cmFucyA9IFRabGliVHJhbnNwb3J0KHRyYW5zLCBjb21wcmVzc2xldmVsKQorICAgICAgICBzZWxmLl9sYXN0X3RyYW5zID0gdHJhbnMKKyAgICAgICAgc2VsZi5fbGFzdF96ID0genRyYW5zCisgICAgICAgIHJldHVybiB6dHJhbnMKIAogCiBjbGFzcyBUWmxpYlRyYW5zcG9ydChUVHJhbnNwb3J0QmFzZSwgQ1JlYWRhYmxlVHJhbnNwb3J0KToKLSAgIiIiQ2xhc3MgdGhhdCB3cmFwcyBhIHRyYW5zcG9ydCB3aXRoIHpsaWIsIGNvbXByZXNzaW5nIHdyaXRlcwotICBhbmQgZGVjb21wcmVzc2VzIHJlYWRzLCB1c2luZyB0aGUgcHl0aG9uIHN0YW5kYXJkCi0gIGxpYnJhcnkgemxpYiBtb2R1bGUuCi0gICIiIgotICAjIFJlYWQgYnVmZmVyIHNpemUgZm9yIHRoZSBweXRob24gZmFzdGJpbmFyeSBDIGV4dGVuc2lvbiwKLSAgIyB0aGUgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgY2xhc3MuCi0gIERFRkFVTFRfQlVGRlNJWkUgPSA0MDk2Ci0KLSAgZGVmIF9faW5pdF9fKHNlbGYsIHRyYW5zLCBjb21wcmVzc2xldmVsPTkpOgotICAgICIiIkNyZWF0ZSBhIG5ldyBUWmxpYlRyYW5zcG9ydCwgd3JhcHBpbmcgQ3t0cmFuc30sIGFub3RoZXIKLSAgICBUVHJhbnNwb3J0IGRlcml2ZWQgb2JqZWN0LgotCi0gICAgQHBhcmFtIHRyYW5zOiBBIHRocmlmdCB0cmFuc3BvcnQgb2JqZWN0LCBpLmUuIGEgVFNvY2tldCgpIG9iamVjdC4KLSAgICBAdHlwZSB0cmFuczogVFRyYW5zcG9ydAotICAgIEBwYXJhbSBjb21wcmVzc2xldmVsOiBUaGUgemxpYiBjb21wcmVzc2lvbiBsZXZlbCwgcmFuZ2luZwotICAgIGZyb20gMCAobm8gY29tcHJlc3Npb24pIHRvIDkgKGJlc3QgY29tcHJlc3Npb24pLiAgRGVmYXVsdCBpcyA5LgotICAgIEB0eXBlIGNvbXByZXNzbGV2ZWw6IGludAorICAgICIiIkNsYXNzIHRoYXQgd3JhcHMgYSB0cmFuc3BvcnQgd2l0aCB6bGliLCBjb21wcmVzc2luZyB3cml0ZXMKKyAgICBhbmQgZGVjb21wcmVzc2VzIHJlYWRzLCB1c2luZyB0aGUgcHl0aG9uIHN0YW5kYXJkCisgICAgbGlicmFyeSB6bGliIG1vZHVsZS4KICAgICAiIiIKLSAgICBzZWxmLl9fdHJhbnMgPSB0cmFucwotICAgIHNlbGYuY29tcHJlc3NsZXZlbCA9IGNvbXByZXNzbGV2ZWwKLSAgICBzZWxmLl9fcmJ1ZiA9IFN0cmluZ0lPKCkKLSAgICBzZWxmLl9fd2J1ZiA9IFN0cmluZ0lPKCkKLSAgICBzZWxmLl9pbml0X3psaWIoKQotICAgIHNlbGYuX2luaXRfc3RhdHMoKQorICAgICMgUmVhZCBidWZmZXIgc2l6ZSBmb3IgdGhlIHB5dGhvbiBmYXN0YmluYXJ5IEMgZXh0ZW5zaW9uLAorICAgICMgdGhlIFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIGNsYXNzLgorICAgIERFRkFVTFRfQlVGRlNJWkUgPSA0MDk2CiAKLSAgZGVmIF9yZWluaXRfYnVmZmVycyhzZWxmKToKLSAgICAiIiJJbnRlcm5hbCBtZXRob2QgdG8gaW5pdGlhbGl6ZS9yZXNldCB0aGUgaW50ZXJuYWwgU3RyaW5nSU8gb2JqZWN0cwotICAgIGZvciByZWFkIGFuZCB3cml0ZSBidWZmZXJzLgotICAgICIiIgotICAgIHNlbGYuX19yYnVmID0gU3RyaW5nSU8oKQotICAgIHNlbGYuX193YnVmID0gU3RyaW5nSU8oKQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0cmFucywgY29tcHJlc3NsZXZlbD05KToKKyAgICAgICAgIiIiQ3JlYXRlIGEgbmV3IFRabGliVHJhbnNwb3J0LCB3cmFwcGluZyBDe3RyYW5zfSwgYW5vdGhlcgorICAgICAgICBUVHJhbnNwb3J0IGRlcml2ZWQgb2JqZWN0LgogCi0gIGRlZiBfaW5pdF9zdGF0cyhzZWxmKToKLSAgICAiIiJJbnRlcm5hbCBtZXRob2QgdG8gcmVzZXQgdGhlIGludGVybmFsIHN0YXRpc3RpY3MgY291bnRlcnMKLSAgICBmb3IgY29tcHJlc3Npb24gcmF0aW9zIGFuZCBiYW5kd2lkdGggc2F2aW5ncy4KLSAgICAiIiIKLSAgICBzZWxmLmJ5dGVzX2luID0gMAotICAgIHNlbGYuYnl0ZXNfb3V0ID0gMAotICAgIHNlbGYuYnl0ZXNfaW5fY29tcCA9IDAKLSAgICBzZWxmLmJ5dGVzX291dF9jb21wID0gMAorICAgICAgICBAcGFyYW0gdHJhbnM6IEEgdGhyaWZ0IHRyYW5zcG9ydCBvYmplY3QsIGkuZS4gYSBUU29ja2V0KCkgb2JqZWN0LgorICAgICAgICBAdHlwZSB0cmFuczogVFRyYW5zcG9ydAorICAgICAgICBAcGFyYW0gY29tcHJlc3NsZXZlbDogVGhlIHpsaWIgY29tcHJlc3Npb24gbGV2ZWwsIHJhbmdpbmcKKyAgICAgICAgZnJvbSAwIChubyBjb21wcmVzc2lvbikgdG8gOSAoYmVzdCBjb21wcmVzc2lvbikuICBEZWZhdWx0IGlzIDkuCisgICAgICAgIEB0eXBlIGNvbXByZXNzbGV2ZWw6IGludAorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fX3RyYW5zID0gdHJhbnMKKyAgICAgICAgc2VsZi5jb21wcmVzc2xldmVsID0gY29tcHJlc3NsZXZlbAorICAgICAgICBzZWxmLl9fcmJ1ZiA9IEJ1ZmZlcklPKCkKKyAgICAgICAgc2VsZi5fX3didWYgPSBCdWZmZXJJTygpCisgICAgICAgIHNlbGYuX2luaXRfemxpYigpCisgICAgICAgIHNlbGYuX2luaXRfc3RhdHMoKQogCi0gIGRlZiBfaW5pdF96bGliKHNlbGYpOgotICAgICIiIkludGVybmFsIG1ldGhvZCBmb3Igc2V0dGluZyB1cCB0aGUgemxpYiBjb21wcmVzc2lvbiBhbmQKLSAgICBkZWNvbXByZXNzaW9uIG9iamVjdHMuCi0gICAgIiIiCi0gICAgc2VsZi5femNvbXBfcmVhZCA9IHpsaWIuZGVjb21wcmVzc29iaigpCi0gICAgc2VsZi5femNvbXBfd3JpdGUgPSB6bGliLmNvbXByZXNzb2JqKHNlbGYuY29tcHJlc3NsZXZlbCkKKyAgICBkZWYgX3JlaW5pdF9idWZmZXJzKHNlbGYpOgorICAgICAgICAiIiJJbnRlcm5hbCBtZXRob2QgdG8gaW5pdGlhbGl6ZS9yZXNldCB0aGUgaW50ZXJuYWwgU3RyaW5nSU8gb2JqZWN0cworICAgICAgICBmb3IgcmVhZCBhbmQgd3JpdGUgYnVmZmVycy4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX19yYnVmID0gQnVmZmVySU8oKQorICAgICAgICBzZWxmLl9fd2J1ZiA9IEJ1ZmZlcklPKCkKIAotICBkZWYgZ2V0Q29tcFJhdGlvKHNlbGYpOgotICAgICIiIkdldCB0aGUgY3VycmVudCBtZWFzdXJlZCBjb21wcmVzc2lvbiByYXRpb3MgKGluLG91dCkgZnJvbQotICAgIHRoaXMgdHJhbnNwb3J0LgorICAgIGRlZiBfaW5pdF9zdGF0cyhzZWxmKToKKyAgICAgICAgIiIiSW50ZXJuYWwgbWV0aG9kIHRvIHJlc2V0IHRoZSBpbnRlcm5hbCBzdGF0aXN0aWNzIGNvdW50ZXJzCisgICAgICAgIGZvciBjb21wcmVzc2lvbiByYXRpb3MgYW5kIGJhbmR3aWR0aCBzYXZpbmdzLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5ieXRlc19pbiA9IDAKKyAgICAgICAgc2VsZi5ieXRlc19vdXQgPSAwCisgICAgICAgIHNlbGYuYnl0ZXNfaW5fY29tcCA9IDAKKyAgICAgICAgc2VsZi5ieXRlc19vdXRfY29tcCA9IDAKIAotICAgIFJldHVybnMgYSB0dXBsZSBvZjoKLSAgICAoaW5ib3VuZF9jb21wcmVzc2lvbl9yYXRpbywgb3V0Ym91bmRfY29tcHJlc3Npb25fcmF0aW8pCisgICAgZGVmIF9pbml0X3psaWIoc2VsZik6CisgICAgICAgICIiIkludGVybmFsIG1ldGhvZCBmb3Igc2V0dGluZyB1cCB0aGUgemxpYiBjb21wcmVzc2lvbiBhbmQKKyAgICAgICAgZGVjb21wcmVzc2lvbiBvYmplY3RzLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5femNvbXBfcmVhZCA9IHpsaWIuZGVjb21wcmVzc29iaigpCisgICAgICAgIHNlbGYuX3pjb21wX3dyaXRlID0gemxpYi5jb21wcmVzc29iaihzZWxmLmNvbXByZXNzbGV2ZWwpCiAKLSAgICBUaGUgY29tcHJlc3Npb24gcmF0aW9zIGFyZSBjb21wdXRlZCBhczoKLSAgICAgICAgY29tcHJlc3NlZCAvIHVuY29tcHJlc3NlZAorICAgIGRlZiBnZXRDb21wUmF0aW8oc2VsZik6CisgICAgICAgICIiIkdldCB0aGUgY3VycmVudCBtZWFzdXJlZCBjb21wcmVzc2lvbiByYXRpb3MgKGluLG91dCkgZnJvbQorICAgICAgICB0aGlzIHRyYW5zcG9ydC4KIAotICAgIEUuZy4sIGRhdGEgdGhhdCBjb21wcmVzc2VzIGJ5IDEweCB3aWxsIGhhdmUgYSByYXRpbyBvZjogMC4xMAotICAgIGFuZCBkYXRhIHRoYXQgY29tcHJlc3NlcyB0byBoYWxmIG9mIHRzIG9yaWdpbmFsIHNpemUgd2lsbAotICAgIGhhdmUgYSByYXRpbyBvZiAwLjUKKyAgICAgICAgUmV0dXJucyBhIHR1cGxlIG9mOgorICAgICAgICAoaW5ib3VuZF9jb21wcmVzc2lvbl9yYXRpbywgb3V0Ym91bmRfY29tcHJlc3Npb25fcmF0aW8pCiAKLSAgICBOb25lIGlzIHJldHVybmVkIGlmIG5vIGJ5dGVzIGhhdmUgeWV0IGJlZW4gcHJvY2Vzc2VkIGluCi0gICAgYSBwYXJ0aWN1bGFyIGRpcmVjdGlvbi4KLSAgICAiIiIKLSAgICByX3BlcmNlbnQsIHdfcGVyY2VudCA9IChOb25lLCBOb25lKQotICAgIGlmIHNlbGYuYnl0ZXNfaW4gPiAwOgotICAgICAgcl9wZXJjZW50ID0gc2VsZi5ieXRlc19pbl9jb21wIC8gc2VsZi5ieXRlc19pbgotICAgIGlmIHNlbGYuYnl0ZXNfb3V0ID4gMDoKLSAgICAgIHdfcGVyY2VudCA9IHNlbGYuYnl0ZXNfb3V0X2NvbXAgLyBzZWxmLmJ5dGVzX291dAotICAgIHJldHVybiAocl9wZXJjZW50LCB3X3BlcmNlbnQpCisgICAgICAgIFRoZSBjb21wcmVzc2lvbiByYXRpb3MgYXJlIGNvbXB1dGVkIGFzOgorICAgICAgICAgICAgY29tcHJlc3NlZCAvIHVuY29tcHJlc3NlZAogCi0gIGRlZiBnZXRDb21wU2F2aW5ncyhzZWxmKToKLSAgICAiIiJHZXQgdGhlIGN1cnJlbnQgY291bnQgb2Ygc2F2ZWQgYnl0ZXMgZHVlIHRvIGRhdGEKLSAgICBjb21wcmVzc2lvbi4KKyAgICAgICAgRS5nLiwgZGF0YSB0aGF0IGNvbXByZXNzZXMgYnkgMTB4IHdpbGwgaGF2ZSBhIHJhdGlvIG9mOiAwLjEwCisgICAgICAgIGFuZCBkYXRhIHRoYXQgY29tcHJlc3NlcyB0byBoYWxmIG9mIHRzIG9yaWdpbmFsIHNpemUgd2lsbAorICAgICAgICBoYXZlIGEgcmF0aW8gb2YgMC41CiAKLSAgICBSZXR1cm5zIGEgdHVwbGUgb2Y6Ci0gICAgKGluYm91bmRfc2F2ZWRfYnl0ZXMsIG91dGJvdW5kX3NhdmVkX2J5dGVzKQorICAgICAgICBOb25lIGlzIHJldHVybmVkIGlmIG5vIGJ5dGVzIGhhdmUgeWV0IGJlZW4gcHJvY2Vzc2VkIGluCisgICAgICAgIGEgcGFydGljdWxhciBkaXJlY3Rpb24uCisgICAgICAgICIiIgorICAgICAgICByX3BlcmNlbnQsIHdfcGVyY2VudCA9IChOb25lLCBOb25lKQorICAgICAgICBpZiBzZWxmLmJ5dGVzX2luID4gMDoKKyAgICAgICAgICAgIHJfcGVyY2VudCA9IHNlbGYuYnl0ZXNfaW5fY29tcCAvIHNlbGYuYnl0ZXNfaW4KKyAgICAgICAgaWYgc2VsZi5ieXRlc19vdXQgPiAwOgorICAgICAgICAgICAgd19wZXJjZW50ID0gc2VsZi5ieXRlc19vdXRfY29tcCAvIHNlbGYuYnl0ZXNfb3V0CisgICAgICAgIHJldHVybiAocl9wZXJjZW50LCB3X3BlcmNlbnQpCiAKLSAgICBOb3RlOiBpZiBjb21wcmVzc2lvbiBpcyBhY3R1YWxseSBleHBhbmRpbmcgeW91cgotICAgIGRhdGEgKG9ubHkgbGlrZWx5IHdpdGggdmVyeSB0aW55IHRocmlmdCBvYmplY3RzKSwgdGhlbgotICAgIHRoZSB2YWx1ZXMgcmV0dXJuZWQgd2lsbCBiZSBuZWdhdGl2ZS4KLSAgICAiIiIKLSAgICByX3NhdmVkID0gc2VsZi5ieXRlc19pbiAtIHNlbGYuYnl0ZXNfaW5fY29tcAotICAgIHdfc2F2ZWQgPSBzZWxmLmJ5dGVzX291dCAtIHNlbGYuYnl0ZXNfb3V0X2NvbXAKLSAgICByZXR1cm4gKHJfc2F2ZWQsIHdfc2F2ZWQpCisgICAgZGVmIGdldENvbXBTYXZpbmdzKHNlbGYpOgorICAgICAgICAiIiJHZXQgdGhlIGN1cnJlbnQgY291bnQgb2Ygc2F2ZWQgYnl0ZXMgZHVlIHRvIGRhdGEKKyAgICAgICAgY29tcHJlc3Npb24uCiAKLSAgZGVmIGlzT3BlbihzZWxmKToKLSAgICAiIiJSZXR1cm4gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0J3Mgb3BlbiBzdGF0dXMiIiIKLSAgICByZXR1cm4gc2VsZi5fX3RyYW5zLmlzT3BlbigpCisgICAgICAgIFJldHVybnMgYSB0dXBsZSBvZjoKKyAgICAgICAgKGluYm91bmRfc2F2ZWRfYnl0ZXMsIG91dGJvdW5kX3NhdmVkX2J5dGVzKQogCi0gIGRlZiBvcGVuKHNlbGYpOgotICAgICIiIk9wZW4gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IiIiCi0gICAgc2VsZi5faW5pdF9zdGF0cygpCi0gICAgcmV0dXJuIHNlbGYuX190cmFucy5vcGVuKCkKKyAgICAgICAgTm90ZTogaWYgY29tcHJlc3Npb24gaXMgYWN0dWFsbHkgZXhwYW5kaW5nIHlvdXIKKyAgICAgICAgZGF0YSAob25seSBsaWtlbHkgd2l0aCB2ZXJ5IHRpbnkgdGhyaWZ0IG9iamVjdHMpLCB0aGVuCisgICAgICAgIHRoZSB2YWx1ZXMgcmV0dXJuZWQgd2lsbCBiZSBuZWdhdGl2ZS4KKyAgICAgICAgIiIiCisgICAgICAgIHJfc2F2ZWQgPSBzZWxmLmJ5dGVzX2luIC0gc2VsZi5ieXRlc19pbl9jb21wCisgICAgICAgIHdfc2F2ZWQgPSBzZWxmLmJ5dGVzX291dCAtIHNlbGYuYnl0ZXNfb3V0X2NvbXAKKyAgICAgICAgcmV0dXJuIChyX3NhdmVkLCB3X3NhdmVkKQogCi0gIGRlZiBsaXN0ZW4oc2VsZik6Ci0gICAgIiIiSW52b2tlIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCdzIGxpc3RlbigpIG1ldGhvZCIiIgotICAgIHNlbGYuX190cmFucy5saXN0ZW4oKQorICAgIGRlZiBpc09wZW4oc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQncyBvcGVuIHN0YXR1cyIiIgorICAgICAgICByZXR1cm4gc2VsZi5fX3RyYW5zLmlzT3BlbigpCiAKLSAgZGVmIGFjY2VwdChzZWxmKToKLSAgICAiIiJBY2NlcHQgY29ubmVjdGlvbnMgb24gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IiIiCi0gICAgcmV0dXJuIHNlbGYuX190cmFucy5hY2NlcHQoKQorICAgIGRlZiBvcGVuKHNlbGYpOgorICAgICAgICAiIiJPcGVuIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCIiIgorICAgICAgICBzZWxmLl9pbml0X3N0YXRzKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX190cmFucy5vcGVuKCkKIAotICBkZWYgY2xvc2Uoc2VsZik6Ci0gICAgIiIiQ2xvc2UgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LCIiIgotICAgIHNlbGYuX3JlaW5pdF9idWZmZXJzKCkKLSAgICBzZWxmLl9pbml0X3psaWIoKQotICAgIHJldHVybiBzZWxmLl9fdHJhbnMuY2xvc2UoKQorICAgIGRlZiBsaXN0ZW4oc2VsZik6CisgICAgICAgICIiIkludm9rZSB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQncyBsaXN0ZW4oKSBtZXRob2QiIiIKKyAgICAgICAgc2VsZi5fX3RyYW5zLmxpc3RlbigpCiAKLSAgZGVmIHJlYWQoc2VsZiwgc3opOgotICAgICIiIlJlYWQgdXAgdG8gc3ogYnl0ZXMgZnJvbSB0aGUgZGVjb21wcmVzc2VkIGJ5dGVzIGJ1ZmZlciwgYW5kCi0gICAgcmVhZCBmcm9tIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCBpZiB0aGUgZGVjb21wcmVzc2lvbgotICAgIGJ1ZmZlciBpcyBlbXB0eS4KLSAgICAiIiIKLSAgICByZXQgPSBzZWxmLl9fcmJ1Zi5yZWFkKHN6KQotICAgIGlmIGxlbihyZXQpID4gMDoKLSAgICAgIHJldHVybiByZXQKLSAgICAjIGtlZXAgcmVhZGluZyBmcm9tIHRyYW5zcG9ydCB1bnRpbCBzb21ldGhpbmcgY29tZXMgYmFjawotICAgIHdoaWxlIFRydWU6Ci0gICAgICBpZiBzZWxmLnJlYWRDb21wKHN6KToKLSAgICAgICAgYnJlYWsKLSAgICByZXQgPSBzZWxmLl9fcmJ1Zi5yZWFkKHN6KQotICAgIHJldHVybiByZXQKKyAgICBkZWYgYWNjZXB0KHNlbGYpOgorICAgICAgICAiIiJBY2NlcHQgY29ubmVjdGlvbnMgb24gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IiIiCisgICAgICAgIHJldHVybiBzZWxmLl9fdHJhbnMuYWNjZXB0KCkKIAotICBkZWYgcmVhZENvbXAoc2VsZiwgc3opOgotICAgICIiIlJlYWQgY29tcHJlc3NlZCBkYXRhIGZyb20gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LCB0aGVuCi0gICAgZGVjb21wcmVzcyBpdCBhbmQgYXBwZW5kIGl0IHRvIHRoZSBpbnRlcm5hbCBTdHJpbmdJTyByZWFkIGJ1ZmZlcgotICAgICIiIgotICAgIHpidWYgPSBzZWxmLl9fdHJhbnMucmVhZChzeikKLSAgICB6YnVmID0gc2VsZi5femNvbXBfcmVhZC51bmNvbnN1bWVkX3RhaWwgKyB6YnVmCi0gICAgYnVmID0gc2VsZi5femNvbXBfcmVhZC5kZWNvbXByZXNzKHpidWYpCi0gICAgc2VsZi5ieXRlc19pbiArPSBsZW4oemJ1ZikKLSAgICBzZWxmLmJ5dGVzX2luX2NvbXAgKz0gbGVuKGJ1ZikKLSAgICBvbGQgPSBzZWxmLl9fcmJ1Zi5yZWFkKCkKLSAgICBzZWxmLl9fcmJ1ZiA9IFN0cmluZ0lPKG9sZCArIGJ1ZikKLSAgICBpZiBsZW4ob2xkKSArIGxlbihidWYpID09IDA6Ci0gICAgICByZXR1cm4gRmFsc2UKLSAgICByZXR1cm4gVHJ1ZQorICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgIiIiQ2xvc2UgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LCIiIgorICAgICAgICBzZWxmLl9yZWluaXRfYnVmZmVycygpCisgICAgICAgIHNlbGYuX2luaXRfemxpYigpCisgICAgICAgIHJldHVybiBzZWxmLl9fdHJhbnMuY2xvc2UoKQogCi0gIGRlZiB3cml0ZShzZWxmLCBidWYpOgotICAgICIiIldyaXRlIHNvbWUgYnl0ZXMsIHB1dHRpbmcgdGhlbSBpbnRvIHRoZSBpbnRlcm5hbCB3cml0ZQotICAgIGJ1ZmZlciBmb3IgZXZlbnR1YWwgY29tcHJlc3Npb24uCi0gICAgIiIiCi0gICAgc2VsZi5fX3didWYud3JpdGUoYnVmKQorICAgIGRlZiByZWFkKHNlbGYsIHN6KToKKyAgICAgICAgIiIiUmVhZCB1cCB0byBzeiBieXRlcyBmcm9tIHRoZSBkZWNvbXByZXNzZWQgYnl0ZXMgYnVmZmVyLCBhbmQKKyAgICAgICAgcmVhZCBmcm9tIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCBpZiB0aGUgZGVjb21wcmVzc2lvbgorICAgICAgICBidWZmZXIgaXMgZW1wdHkuCisgICAgICAgICIiIgorICAgICAgICByZXQgPSBzZWxmLl9fcmJ1Zi5yZWFkKHN6KQorICAgICAgICBpZiBsZW4ocmV0KSA+IDA6CisgICAgICAgICAgICByZXR1cm4gcmV0CisgICAgICAgICMga2VlcCByZWFkaW5nIGZyb20gdHJhbnNwb3J0IHVudGlsIHNvbWV0aGluZyBjb21lcyBiYWNrCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBpZiBzZWxmLnJlYWRDb21wKHN6KToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICByZXQgPSBzZWxmLl9fcmJ1Zi5yZWFkKHN6KQorICAgICAgICByZXR1cm4gcmV0CiAKLSAgZGVmIGZsdXNoKHNlbGYpOgotICAgICIiIkZsdXNoIGFueSBxdWV1ZWQgdXAgZGF0YSBpbiB0aGUgd3JpdGUgYnVmZmVyIGFuZCBlbnN1cmUgdGhlCi0gICAgY29tcHJlc3Npb24gYnVmZmVyIGlzIGZsdXNoZWQgb3V0IHRvIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydAotICAgICIiIgotICAgIHdvdXQgPSBzZWxmLl9fd2J1Zi5nZXR2YWx1ZSgpCi0gICAgaWYgbGVuKHdvdXQpID4gMDoKLSAgICAgIHpidWYgPSBzZWxmLl96Y29tcF93cml0ZS5jb21wcmVzcyh3b3V0KQotICAgICAgc2VsZi5ieXRlc19vdXQgKz0gbGVuKHdvdXQpCi0gICAgICBzZWxmLmJ5dGVzX291dF9jb21wICs9IGxlbih6YnVmKQotICAgIGVsc2U6Ci0gICAgICB6YnVmID0gJycKLSAgICB6dGFpbCA9IHNlbGYuX3pjb21wX3dyaXRlLmZsdXNoKHpsaWIuWl9TWU5DX0ZMVVNIKQotICAgIHNlbGYuYnl0ZXNfb3V0X2NvbXAgKz0gbGVuKHp0YWlsKQotICAgIGlmIChsZW4oemJ1ZikgKyBsZW4oenRhaWwpKSA+IDA6Ci0gICAgICBzZWxmLl9fd2J1ZiA9IFN0cmluZ0lPKCkKLSAgICAgIHNlbGYuX190cmFucy53cml0ZSh6YnVmICsgenRhaWwpCi0gICAgc2VsZi5fX3RyYW5zLmZsdXNoKCkKKyAgICBkZWYgcmVhZENvbXAoc2VsZiwgc3opOgorICAgICAgICAiIiJSZWFkIGNvbXByZXNzZWQgZGF0YSBmcm9tIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCwgdGhlbgorICAgICAgICBkZWNvbXByZXNzIGl0IGFuZCBhcHBlbmQgaXQgdG8gdGhlIGludGVybmFsIFN0cmluZ0lPIHJlYWQgYnVmZmVyCisgICAgICAgICIiIgorICAgICAgICB6YnVmID0gc2VsZi5fX3RyYW5zLnJlYWQoc3opCisgICAgICAgIHpidWYgPSBzZWxmLl96Y29tcF9yZWFkLnVuY29uc3VtZWRfdGFpbCArIHpidWYKKyAgICAgICAgYnVmID0gc2VsZi5femNvbXBfcmVhZC5kZWNvbXByZXNzKHpidWYpCisgICAgICAgIHNlbGYuYnl0ZXNfaW4gKz0gbGVuKHpidWYpCisgICAgICAgIHNlbGYuYnl0ZXNfaW5fY29tcCArPSBsZW4oYnVmKQorICAgICAgICBvbGQgPSBzZWxmLl9fcmJ1Zi5yZWFkKCkKKyAgICAgICAgc2VsZi5fX3JidWYgPSBCdWZmZXJJTyhvbGQgKyBidWYpCisgICAgICAgIGlmIGxlbihvbGQpICsgbGVuKGJ1ZikgPT0gMDoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQogCi0gIEBwcm9wZXJ0eQotICBkZWYgY3N0cmluZ2lvX2J1ZihzZWxmKToKLSAgICAiIiJJbXBsZW1lbnQgdGhlIENSZWFkYWJsZVRyYW5zcG9ydCBpbnRlcmZhY2UiIiIKLSAgICByZXR1cm4gc2VsZi5fX3JidWYKKyAgICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKKyAgICAgICAgIiIiV3JpdGUgc29tZSBieXRlcywgcHV0dGluZyB0aGVtIGludG8gdGhlIGludGVybmFsIHdyaXRlCisgICAgICAgIGJ1ZmZlciBmb3IgZXZlbnR1YWwgY29tcHJlc3Npb24uCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9fd2J1Zi53cml0ZShidWYpCiAKLSAgZGVmIGNzdHJpbmdpb19yZWZpbGwoc2VsZiwgcGFydGlhbHJlYWQsIHJlcWxlbik6Ci0gICAgIiIiSW1wbGVtZW50IHRoZSBDUmVhZGFibGVUcmFuc3BvcnQgaW50ZXJmYWNlIGZvciByZWZpbGwiIiIKLSAgICByZXRzdHJpbmcgPSBwYXJ0aWFscmVhZAotICAgIGlmIHJlcWxlbiA8IHNlbGYuREVGQVVMVF9CVUZGU0laRToKLSAgICAgIHJldHN0cmluZyArPSBzZWxmLnJlYWQoc2VsZi5ERUZBVUxUX0JVRkZTSVpFKQotICAgIHdoaWxlIGxlbihyZXRzdHJpbmcpIDwgcmVxbGVuOgotICAgICAgcmV0c3RyaW5nICs9IHNlbGYucmVhZChyZXFsZW4gLSBsZW4ocmV0c3RyaW5nKSkKLSAgICBzZWxmLl9fcmJ1ZiA9IFN0cmluZ0lPKHJldHN0cmluZykKLSAgICByZXR1cm4gc2VsZi5fX3JidWYKKyAgICBkZWYgZmx1c2goc2VsZik6CisgICAgICAgICIiIkZsdXNoIGFueSBxdWV1ZWQgdXAgZGF0YSBpbiB0aGUgd3JpdGUgYnVmZmVyIGFuZCBlbnN1cmUgdGhlCisgICAgICAgIGNvbXByZXNzaW9uIGJ1ZmZlciBpcyBmbHVzaGVkIG91dCB0byB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQKKyAgICAgICAgIiIiCisgICAgICAgIHdvdXQgPSBzZWxmLl9fd2J1Zi5nZXR2YWx1ZSgpCisgICAgICAgIGlmIGxlbih3b3V0KSA+IDA6CisgICAgICAgICAgICB6YnVmID0gc2VsZi5femNvbXBfd3JpdGUuY29tcHJlc3Mod291dCkKKyAgICAgICAgICAgIHNlbGYuYnl0ZXNfb3V0ICs9IGxlbih3b3V0KQorICAgICAgICAgICAgc2VsZi5ieXRlc19vdXRfY29tcCArPSBsZW4oemJ1ZikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHpidWYgPSAnJworICAgICAgICB6dGFpbCA9IHNlbGYuX3pjb21wX3dyaXRlLmZsdXNoKHpsaWIuWl9TWU5DX0ZMVVNIKQorICAgICAgICBzZWxmLmJ5dGVzX291dF9jb21wICs9IGxlbih6dGFpbCkKKyAgICAgICAgaWYgKGxlbih6YnVmKSArIGxlbih6dGFpbCkpID4gMDoKKyAgICAgICAgICAgIHNlbGYuX193YnVmID0gQnVmZmVySU8oKQorICAgICAgICAgICAgc2VsZi5fX3RyYW5zLndyaXRlKHpidWYgKyB6dGFpbCkKKyAgICAgICAgc2VsZi5fX3RyYW5zLmZsdXNoKCkKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBjc3RyaW5naW9fYnVmKHNlbGYpOgorICAgICAgICAiIiJJbXBsZW1lbnQgdGhlIENSZWFkYWJsZVRyYW5zcG9ydCBpbnRlcmZhY2UiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX19yYnVmCisKKyAgICBkZWYgY3N0cmluZ2lvX3JlZmlsbChzZWxmLCBwYXJ0aWFscmVhZCwgcmVxbGVuKToKKyAgICAgICAgIiIiSW1wbGVtZW50IHRoZSBDUmVhZGFibGVUcmFuc3BvcnQgaW50ZXJmYWNlIGZvciByZWZpbGwiIiIKKyAgICAgICAgcmV0c3RyaW5nID0gcGFydGlhbHJlYWQKKyAgICAgICAgaWYgcmVxbGVuIDwgc2VsZi5ERUZBVUxUX0JVRkZTSVpFOgorICAgICAgICAgICAgcmV0c3RyaW5nICs9IHNlbGYucmVhZChzZWxmLkRFRkFVTFRfQlVGRlNJWkUpCisgICAgICAgIHdoaWxlIGxlbihyZXRzdHJpbmcpIDwgcmVxbGVuOgorICAgICAgICAgICAgcmV0c3RyaW5nICs9IHNlbGYucmVhZChyZXFsZW4gLSBsZW4ocmV0c3RyaW5nKSkKKyAgICAgICAgc2VsZi5fX3JidWYgPSBCdWZmZXJJTyhyZXRzdHJpbmcpCisgICAgICAgIHJldHVybiBzZWxmLl9fcmJ1ZgpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy90cmFuc3BvcnQvc3NsY29tcGF0LnB5IGIvbGliL3B5L3NyYy90cmFuc3BvcnQvc3NsY29tcGF0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMDBjYjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvc3JjL3RyYW5zcG9ydC9zc2xjb21wYXQucHkKQEAgLTAsMCArMSwxMDAgQEAKKyMKKyMgbGljZW5zZWQgdG8gdGhlIGFwYWNoZSBzb2Z0d2FyZSBmb3VuZGF0aW9uIChhc2YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gc2VlIHRoZSBub3RpY2UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gdGhlIGFzZiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBhcGFjaGUgbGljZW5zZSwgdmVyc2lvbiAyLjAgKHRoZQorIyAibGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIGxpY2Vuc2UuIHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgbGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9saWNlbnNlLTIuMAorIworIyB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBsaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJhcyBpcyIgYmFzaXMsIHdpdGhvdXQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIGFueQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IHN5cworCitmcm9tIHRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydEV4Y2VwdGlvbgorCitsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKKworCitkZWYgbGVnYWN5X3ZhbGlkYXRlX2NhbGxiYWNrKGNlcnQsIGhvc3RuYW1lKToKKyAgICAiIiJsZWdhY3kgbWV0aG9kIHRvIHZhbGlkYXRlIHRoZSBwZWVyJ3MgU1NMIGNlcnRpZmljYXRlLCBhbmQgdG8gY2hlY2sKKyAgICB0aGUgY29tbW9uTmFtZSBvZiB0aGUgY2VydGlmaWNhdGUgdG8gZW5zdXJlIGl0IG1hdGNoZXMgdGhlIGhvc3RuYW1lIHdlCisgICAgdXNlZCB0byBtYWtlIHRoaXMgY29ubmVjdGlvbi4gIERvZXMgbm90IHN1cHBvcnQgc3ViamVjdEFsdE5hbWUgcmVjb3JkcworICAgIGluIGNlcnRpZmljYXRlcy4KKworICAgIHJhaXNlcyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIHRoZSBjZXJ0aWZpY2F0ZSBmYWlscyB2YWxpZGF0aW9uLgorICAgICIiIgorICAgIGlmICdzdWJqZWN0JyBub3QgaW4gY2VydDoKKyAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sCisgICAgICAgICAgICAnTm8gU1NMIGNlcnRpZmljYXRlIGZvdW5kIGZyb20gJXMnICUgaG9zdG5hbWUpCisgICAgZmllbGRzID0gY2VydFsnc3ViamVjdCddCisgICAgZm9yIGZpZWxkIGluIGZpZWxkczoKKyAgICAgICAgIyBlbnN1cmUgc3RydWN0dXJlIHdlIGdldCBiYWNrIGlzIHdoYXQgd2UgZXhwZWN0CisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGZpZWxkLCB0dXBsZSk6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBjZXJ0X3BhaXIgPSBmaWVsZFswXQorICAgICAgICBpZiBsZW4oY2VydF9wYWlyKSA8IDI6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBjZXJ0X2tleSwgY2VydF92YWx1ZSA9IGNlcnRfcGFpclswOjJdCisgICAgICAgIGlmIGNlcnRfa2V5ICE9ICdjb21tb25OYW1lJzoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGNlcnRob3N0ID0gY2VydF92YWx1ZQorICAgICAgICAjIHRoaXMgY2hlY2sgc2hvdWxkIGJlIHBlcmZvcm1lZCBieSBzb21lIHNvcnQgb2YgQWNjZXNzIE1hbmFnZXIKKyAgICAgICAgaWYgY2VydGhvc3QgPT0gaG9zdG5hbWU6CisgICAgICAgICAgICAjIHN1Y2Nlc3MsIGNlcnQgY29tbW9uTmFtZSBtYXRjaGVzIGRlc2lyZWQgaG9zdG5hbWUKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLlVOS05PV04sCisgICAgICAgICAgICAgICAgJ0hvc3RuYW1lIHdlIGNvbm5lY3RlZCB0byAiJXMiIGRvZXNuXCd0IG1hdGNoIGNlcnRpZmljYXRlICcKKyAgICAgICAgICAgICAgICAncHJvdmlkZWQgY29tbW9uTmFtZSAiJXMiJyAlIChob3N0bmFtZSwgY2VydGhvc3QpKQorICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uVU5LTk9XTiwKKyAgICAgICAgJ0NvdWxkIG5vdCB2YWxpZGF0ZSBTU0wgY2VydGlmaWNhdGUgZnJvbSBob3N0ICIlcyIuICBDZXJ0PSVzJworICAgICAgICAlIChob3N0bmFtZSwgY2VydCkpCisKKworZGVmIF9vcHRpb25hbF9kZXBlbmRlbmNpZXMoKToKKyAgICB0cnk6CisgICAgICAgIGltcG9ydCBpcGFkZHJlc3MgICMgbm9xYQorICAgICAgICBsb2dnZXIuZGVidWcoJ2lwYWRkcmVzcyBtb2R1bGUgaXMgYXZhaWxhYmxlJykKKyAgICAgICAgaXBhZGRyID0gVHJ1ZQorICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgbG9nZ2VyLndhcm4oJ2lwYWRkcmVzcyBtb2R1bGUgaXMgdW5hdmFpbGFibGUnKQorICAgICAgICBpcGFkZHIgPSBGYWxzZQorCisgICAgaWYgc3lzLmhleHZlcnNpb24gPCAweDAzMDUwMEYwOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmcm9tIGJhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUgaW1wb3J0IG1hdGNoX2hvc3RuYW1lLCBfX3ZlcnNpb25fXyBhcyB2ZXIKKyAgICAgICAgICAgIHZlciA9IGxpc3QobWFwKGludCwgdmVyLnNwbGl0KCcuJykpKQorICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lIG1vZHVsZSBpcyBhdmFpbGFibGUnKQorICAgICAgICAgICAgbWF0Y2ggPSBtYXRjaF9ob3N0bmFtZQorICAgICAgICAgICAgaWYgdmVyWzBdICogMTAgKyB2ZXJbMV0gPj0gMzU6CisgICAgICAgICAgICAgICAgcmV0dXJuIGlwYWRkciwgbWF0Y2gKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ2JhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUgbW9kdWxlIGlzIHRvbyBvbGQnKQorICAgICAgICAgICAgICAgIGlwYWRkciA9IEZhbHNlCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIGxvZ2dlci53YXJuKCdiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lIGlzIHVuYXZhaWxhYmxlJykKKyAgICAgICAgICAgIGlwYWRkciA9IEZhbHNlCisgICAgdHJ5OgorICAgICAgICBmcm9tIHNzbCBpbXBvcnQgbWF0Y2hfaG9zdG5hbWUKKyAgICAgICAgbG9nZ2VyLmRlYnVnKCdzc2wubWF0Y2hfaG9zdG5hbWUgaXMgYXZhaWxhYmxlJykKKyAgICAgICAgbWF0Y2ggPSBtYXRjaF9ob3N0bmFtZQorICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgbG9nZ2VyLndhcm4oJ3VzaW5nIGxlZ2FjeSB2YWxpZGF0aW9uIGNhbGxiYWNrJykKKyAgICAgICAgbWF0Y2ggPSBsZWdhY3lfdmFsaWRhdGVfY2FsbGJhY2sKKyAgICByZXR1cm4gaXBhZGRyLCBtYXRjaAorCisKK19tYXRjaF9oYXNfaXBhZGRyZXNzLCBfbWF0Y2hfaG9zdG5hbWUgPSBfb3B0aW9uYWxfZGVwZW5kZW5jaWVzKCkKZGlmZiAtLWdpdCBhL2xpYi9weS90ZXN0L19pbXBvcnRfbG9jYWxfdGhyaWZ0LnB5IGIvbGliL3B5L3Rlc3QvX2ltcG9ydF9sb2NhbF90aHJpZnQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIyMzEyMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS90ZXN0L19pbXBvcnRfbG9jYWxfdGhyaWZ0LnB5CkBAIC0wLDAgKzEsMzAgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbXBvcnQgZ2xvYgoraW1wb3J0IG9zCitpbXBvcnQgc3lzCisKK1NDUklQVF9ESVIgPSBvcy5wYXRoLnJlYWxwYXRoKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpCitST09UX0RJUiA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKFNDUklQVF9ESVIpKSkKKworZm9yIGxpYnBhdGggaW4gZ2xvYi5nbG9iKG9zLnBhdGguam9pbihST09UX0RJUiwgJ2xpYicsICdweScsICdidWlsZCcsICdsaWIuKicpKToKKyAgICBpZiBsaWJwYXRoLmVuZHN3aXRoKCctJWQuJWQnICUgKHN5cy52ZXJzaW9uX2luZm9bMF0sIHN5cy52ZXJzaW9uX2luZm9bMV0pKToKKyAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIGxpYnBhdGgpCisgICAgICAgIGJyZWFrCmRpZmYgLS1naXQgYS9saWIvcHkvdGVzdC90ZXN0X3NzbHNvY2tldC5weSBiL2xpYi9weS90ZXN0L3Rlc3Rfc3Nsc29ja2V0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMzQ0ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvdGVzdC90ZXN0X3NzbHNvY2tldC5weQpAQCAtMCwwICsxLDM0NiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2ltcG9ydCBpbnNwZWN0CitpbXBvcnQgbG9nZ2luZworaW1wb3J0IG9zCitpbXBvcnQgcGxhdGZvcm0KK2ltcG9ydCBzc2wKK2ltcG9ydCBzeXMKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IHRocmVhZGluZworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgd2FybmluZ3MKK2Zyb20gY29udGV4dGxpYiBpbXBvcnQgY29udGV4dG1hbmFnZXIKKworaW1wb3J0IF9pbXBvcnRfbG9jYWxfdGhyaWZ0ICAjIG5vcWEKKworU0NSSVBUX0RJUiA9IG9zLnBhdGgucmVhbHBhdGgob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSkKK1JPT1RfRElSID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUoU0NSSVBUX0RJUikpKQorU0VSVkVSX1BFTSA9IG9zLnBhdGguam9pbihST09UX0RJUiwgJ3Rlc3QnLCAna2V5cycsICdzZXJ2ZXIucGVtJykKK1NFUlZFUl9DRVJUID0gb3MucGF0aC5qb2luKFJPT1RfRElSLCAndGVzdCcsICdrZXlzJywgJ3NlcnZlci5jcnQnKQorU0VSVkVSX0tFWSA9IG9zLnBhdGguam9pbihST09UX0RJUiwgJ3Rlc3QnLCAna2V5cycsICdzZXJ2ZXIua2V5JykKK0NMSUVOVF9DRVJUX05PX0lQID0gb3MucGF0aC5qb2luKFJPT1RfRElSLCAndGVzdCcsICdrZXlzJywgJ2NsaWVudC5jcnQnKQorQ0xJRU5UX0tFWV9OT19JUCA9IG9zLnBhdGguam9pbihST09UX0RJUiwgJ3Rlc3QnLCAna2V5cycsICdjbGllbnQua2V5JykKK0NMSUVOVF9DRVJUID0gb3MucGF0aC5qb2luKFJPT1RfRElSLCAndGVzdCcsICdrZXlzJywgJ2NsaWVudF92My5jcnQnKQorQ0xJRU5UX0tFWSA9IG9zLnBhdGguam9pbihST09UX0RJUiwgJ3Rlc3QnLCAna2V5cycsICdjbGllbnRfdjMua2V5JykKK0NMSUVOVF9DQSA9IG9zLnBhdGguam9pbihST09UX0RJUiwgJ3Rlc3QnLCAna2V5cycsICdDQS5wZW0nKQorCitURVNUX0NJUEhFUlMgPSAnREVTLUNCQzMtU0hBOkVDREhFLVJTQS1BRVMxMjgtR0NNLVNIQTI1NicKKworCitjbGFzcyBTZXJ2ZXJBY2NlcHRvcih0aHJlYWRpbmcuVGhyZWFkKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2VydmVyLCBleHBlY3RfZmFpbHVyZT1GYWxzZSk6CisgICAgICAgIHN1cGVyKFNlcnZlckFjY2VwdG9yLCBzZWxmKS5fX2luaXRfXygpCisgICAgICAgIHNlbGYuZGFlbW9uID0gVHJ1ZQorICAgICAgICBzZWxmLl9zZXJ2ZXIgPSBzZXJ2ZXIKKyAgICAgICAgc2VsZi5fbGlzdGVuaW5nID0gdGhyZWFkaW5nLkV2ZW50KCkKKyAgICAgICAgc2VsZi5fcG9ydCA9IE5vbmUKKyAgICAgICAgc2VsZi5fcG9ydF9ib3VuZCA9IHRocmVhZGluZy5FdmVudCgpCisgICAgICAgIHNlbGYuX2NsaWVudCA9IE5vbmUKKyAgICAgICAgc2VsZi5fY2xpZW50X2FjY2VwdGVkID0gdGhyZWFkaW5nLkV2ZW50KCkKKyAgICAgICAgc2VsZi5fZXhwZWN0X2ZhaWx1cmUgPSBleHBlY3RfZmFpbHVyZQorICAgICAgICBmcmFtZSA9IGluc3BlY3Quc3RhY2soMylbMl0KKyAgICAgICAgc2VsZi5uYW1lID0gZnJhbWVbM10KKyAgICAgICAgZGVsIGZyYW1lCisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICBzZWxmLl9zZXJ2ZXIubGlzdGVuKCkKKyAgICAgICAgc2VsZi5fbGlzdGVuaW5nLnNldCgpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYWRkcmVzcyA9IHNlbGYuX3NlcnZlci5oYW5kbGUuZ2V0c29ja25hbWUoKQorICAgICAgICAgICAgaWYgbGVuKGFkZHJlc3MpID4gMToKKyAgICAgICAgICAgICAgICAjIEFGX0lORVQgYWRkcmVzc2VzIGFyZSAyLXR1cGxlcyAoaG9zdCwgcG9ydCkgYW5kIEFGX0lORVQ2IGFyZQorICAgICAgICAgICAgICAgICMgNC10dXBsZXMgKGhvc3QsIHBvcnQsIC4uLiksIGJ1dCBpbiBlYWNoIGNhc2UgcG9ydCBpcyBpbiB0aGUgc2Vjb25kIHNsb3QuCisgICAgICAgICAgICAgICAgc2VsZi5fcG9ydCA9IGFkZHJlc3NbMV0KKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuX3BvcnRfYm91bmQuc2V0KCkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9jbGllbnQgPSBzZWxmLl9zZXJ2ZXIuYWNjZXB0KCkKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgIGxvZ2dpbmcuZXhjZXB0aW9uKCdlcnJvciBvbiBzZXJ2ZXIgc2lkZSAoJXMpOicgJSBzZWxmLm5hbWUpCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5fZXhwZWN0X2ZhaWx1cmU6CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuX2NsaWVudF9hY2NlcHRlZC5zZXQoKQorCisgICAgZGVmIGF3YWl0X2xpc3RlbmluZyhzZWxmKToKKyAgICAgICAgc2VsZi5fbGlzdGVuaW5nLndhaXQoKQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIHBvcnQoc2VsZik6CisgICAgICAgIHNlbGYuX3BvcnRfYm91bmQud2FpdCgpCisgICAgICAgIHJldHVybiBzZWxmLl9wb3J0CisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgY2xpZW50KHNlbGYpOgorICAgICAgICBzZWxmLl9jbGllbnRfYWNjZXB0ZWQud2FpdCgpCisgICAgICAgIHJldHVybiBzZWxmLl9jbGllbnQKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fY2xpZW50OgorICAgICAgICAgICAgc2VsZi5fY2xpZW50LmNsb3NlKCkKKyAgICAgICAgc2VsZi5fc2VydmVyLmNsb3NlKCkKKworCisjIFB5dGhvbiAyLjYgY29tcGF0CitjbGFzcyBBc3NlcnRSYWlzZXMob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZXhwZWN0ZWQpOgorICAgICAgICBzZWxmLl9leHBlY3RlZCA9IGV4cGVjdGVkCisKKyAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgX19leGl0X18oc2VsZiwgZXhjX3R5cGUsIGV4Y192YWx1ZSwgdHJhY2ViYWNrKToKKyAgICAgICAgaWYgbm90IGV4Y190eXBlIG9yIG5vdCBpc3N1YmNsYXNzKGV4Y190eXBlLCBzZWxmLl9leHBlY3RlZCk6CisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oJ2ZhaWwnKQorICAgICAgICByZXR1cm4gVHJ1ZQorCisKK2NsYXNzIFRTU0xTb2NrZXRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgX3NlcnZlcl9zb2NrZXQoc2VsZiwgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gVFNTTFNlcnZlclNvY2tldChwb3J0PTAsICoqa3dhcmdzKQorCisgICAgQGNvbnRleHRtYW5hZ2VyCisgICAgZGVmIF9jb25uZWN0YWJsZV9jbGllbnQoc2VsZiwgc2VydmVyLCBleHBlY3RfZmFpbHVyZT1GYWxzZSwgcGF0aD1Ob25lLCAqKmNsaWVudF9rd2FyZ3MpOgorICAgICAgICBhY2MgPSBTZXJ2ZXJBY2NlcHRvcihzZXJ2ZXIsIGV4cGVjdF9mYWlsdXJlKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBhY2Muc3RhcnQoKQorICAgICAgICAgICAgYWNjLmF3YWl0X2xpc3RlbmluZygpCisKKyAgICAgICAgICAgIGhvc3QsIHBvcnQgPSAoJ2xvY2FsaG9zdCcsIGFjYy5wb3J0KSBpZiBwYXRoIGlzIE5vbmUgZWxzZSAoTm9uZSwgTm9uZSkKKyAgICAgICAgICAgIGNsaWVudCA9IFRTU0xTb2NrZXQoaG9zdCwgcG9ydCwgdW5peF9zb2NrZXQ9cGF0aCwgKipjbGllbnRfa3dhcmdzKQorICAgICAgICAgICAgeWllbGQgYWNjLCBjbGllbnQKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGFjYy5jbG9zZSgpCisKKyAgICBkZWYgX2Fzc2VydF9jb25uZWN0aW9uX2ZhaWx1cmUoc2VsZiwgc2VydmVyLCBwYXRoPU5vbmUsICoqY2xpZW50X2FyZ3MpOgorICAgICAgICBsb2dnaW5nLmRpc2FibGUobG9nZ2luZy5DUklUSUNBTCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2l0aCBzZWxmLl9jb25uZWN0YWJsZV9jbGllbnQoc2VydmVyLCBUcnVlLCBwYXRoPXBhdGgsICoqY2xpZW50X2FyZ3MpIGFzIChhY2MsIGNsaWVudCk6CisgICAgICAgICAgICAgICAgIyBXZSBuZWVkIHRvIHdhaXQgZm9yIGEgY29ubmVjdGlvbiBmYWlsdXJlLCBidXQgbm90IHRvbyBsb25nLiAgMjBtcyBpcyBhIHR1bmFibGUKKyAgICAgICAgICAgICAgICAjIGNvbXByb21pc2UgYmV0d2VlbiB0ZXN0IHNwZWVkIGFuZCBzdGFiaWxpdHkKKyAgICAgICAgICAgICAgICBjbGllbnQuc2V0VGltZW91dCgyMCkKKyAgICAgICAgICAgICAgICB3aXRoIHNlbGYuX2Fzc2VydF9yYWlzZXMoVFRyYW5zcG9ydEV4Y2VwdGlvbik6CisgICAgICAgICAgICAgICAgICAgIGNsaWVudC5vcGVuKCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoYWNjLmNsaWVudCBpcyBOb25lKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgbG9nZ2luZy5kaXNhYmxlKGxvZ2dpbmcuTk9UU0VUKQorCisgICAgZGVmIF9hc3NlcnRfcmFpc2VzKHNlbGYsIGV4Yyk6CisgICAgICAgIGlmIHN5cy5oZXh2ZXJzaW9uID49IDB4MDIwNzAwRjA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5hc3NlcnRSYWlzZXMoZXhjKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIEFzc2VydFJhaXNlcyhleGMpCisKKyAgICBkZWYgX2Fzc2VydF9jb25uZWN0aW9uX3N1Y2Nlc3Moc2VsZiwgc2VydmVyLCBwYXRoPU5vbmUsICoqY2xpZW50X2FyZ3MpOgorICAgICAgICB3aXRoIHNlbGYuX2Nvbm5lY3RhYmxlX2NsaWVudChzZXJ2ZXIsIHBhdGg9cGF0aCwgKipjbGllbnRfYXJncykgYXMgKGFjYywgY2xpZW50KToKKyAgICAgICAgICAgIGNsaWVudC5vcGVuKCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoYWNjLmNsaWVudCBpcyBub3QgTm9uZSkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgY2xpZW50LmNsb3NlKCkKKworICAgICMgZGVwcmVjYXRlZCBmZWF0dXJlCisgICAgZGVmIHRlc3RfZGVwcmVjYXRpb24oc2VsZik6CisgICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MocmVjb3JkPVRydWUpIGFzIHc6CisgICAgICAgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygnYWx3YXlzJywgY2F0ZWdvcnk9RGVwcmVjYXRpb25XYXJuaW5nLCBtb2R1bGU9c2VsZi5fX21vZHVsZV9fKQorICAgICAgICAgICAgVFNTTFNvY2tldCgnbG9jYWxob3N0JywgMCwgdmFsaWRhdGU9VHJ1ZSwgY2FfY2VydHM9U0VSVkVSX0NFUlQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih3KSwgMSkKKworICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKHJlY29yZD1UcnVlKSBhcyB3OgorICAgICAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoJ2Fsd2F5cycsIGNhdGVnb3J5PURlcHJlY2F0aW9uV2FybmluZywgbW9kdWxlPXNlbGYuX19tb2R1bGVfXykKKyAgICAgICAgICAgICMgRGVwcmVjYXRlZCBzaWduYXR1cmUKKyAgICAgICAgICAgICMgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3Q9J2xvY2FsaG9zdCcsIHBvcnQ9OTA5MCwgdmFsaWRhdGU9VHJ1ZSwgY2FfY2VydHM9Tm9uZSwga2V5ZmlsZT1Ob25lLCBjZXJ0ZmlsZT1Ob25lLCB1bml4X3NvY2tldD1Ob25lLCBjaXBoZXJzPU5vbmUpOgorICAgICAgICAgICAgVFNTTFNvY2tldCgnbG9jYWxob3N0JywgMCwgVHJ1ZSwgU0VSVkVSX0NFUlQsIENMSUVOVF9LRVksIENMSUVOVF9DRVJULCBOb25lLCBURVNUX0NJUEhFUlMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih3KSwgNykKKworICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKHJlY29yZD1UcnVlKSBhcyB3OgorICAgICAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoJ2Fsd2F5cycsIGNhdGVnb3J5PURlcHJlY2F0aW9uV2FybmluZywgbW9kdWxlPXNlbGYuX19tb2R1bGVfXykKKyAgICAgICAgICAgICMgRGVwcmVjYXRlZCBzaWduYXR1cmUKKyAgICAgICAgICAgICMgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3Q9Tm9uZSwgcG9ydD05MDkwLCBjZXJ0ZmlsZT0nY2VydC5wZW0nLCB1bml4X3NvY2tldD1Ob25lLCBjaXBoZXJzPU5vbmUpOgorICAgICAgICAgICAgVFNTTFNlcnZlclNvY2tldChOb25lLCAwLCBTRVJWRVJfUEVNLCBOb25lLCBURVNUX0NJUEhFUlMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih3KSwgMykKKworICAgICMgZGVwcmVjYXRlZCBmZWF0dXJlCisgICAgZGVmIHRlc3Rfc2V0X2NlcnRfcmVxc19ieV92YWxpZGF0ZShzZWxmKToKKyAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncyhyZWNvcmQ9VHJ1ZSkgYXMgdzoKKyAgICAgICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCdhbHdheXMnLCBjYXRlZ29yeT1EZXByZWNhdGlvbldhcm5pbmcsIG1vZHVsZT1zZWxmLl9fbW9kdWxlX18pCisgICAgICAgICAgICBjMSA9IFRTU0xTb2NrZXQoJ2xvY2FsaG9zdCcsIDAsIHZhbGlkYXRlPVRydWUsIGNhX2NlcnRzPVNFUlZFUl9DRVJUKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjMS5jZXJ0X3JlcXMsIHNzbC5DRVJUX1JFUVVJUkVEKQorCisgICAgICAgICAgICBjMSA9IFRTU0xTb2NrZXQoJ2xvY2FsaG9zdCcsIDAsIHZhbGlkYXRlPUZhbHNlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjMS5jZXJ0X3JlcXMsIHNzbC5DRVJUX05PTkUpCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHcpLCAyKQorCisgICAgIyBkZXByZWNhdGVkIGZlYXR1cmUKKyAgICBkZWYgdGVzdF9zZXRfdmFsaWRhdGVfYnlfY2VydF9yZXFzKHNlbGYpOgorICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKHJlY29yZD1UcnVlKSBhcyB3OgorICAgICAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoJ2Fsd2F5cycsIGNhdGVnb3J5PURlcHJlY2F0aW9uV2FybmluZywgbW9kdWxlPXNlbGYuX19tb2R1bGVfXykKKyAgICAgICAgICAgIGMxID0gVFNTTFNvY2tldCgnbG9jYWxob3N0JywgMCwgY2VydF9yZXFzPXNzbC5DRVJUX05PTkUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGMxLnZhbGlkYXRlKQorCisgICAgICAgICAgICBjMiA9IFRTU0xTb2NrZXQoJ2xvY2FsaG9zdCcsIDAsIGNlcnRfcmVxcz1zc2wuQ0VSVF9SRVFVSVJFRCwgY2FfY2VydHM9U0VSVkVSX0NFUlQpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoYzIudmFsaWRhdGUpCisKKyAgICAgICAgICAgIGMzID0gVFNTTFNvY2tldCgnbG9jYWxob3N0JywgMCwgY2VydF9yZXFzPXNzbC5DRVJUX09QVElPTkFMLCBjYV9jZXJ0cz1TRVJWRVJfQ0VSVCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjMy52YWxpZGF0ZSkKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odyksIDMpCisKKyAgICBkZWYgdGVzdF91bml4X2RvbWFpbl9zb2NrZXQoc2VsZik6CisgICAgICAgIGlmIHBsYXRmb3JtLnN5c3RlbSgpID09ICdXaW5kb3dzJzoKKyAgICAgICAgICAgIHByaW50KCdza2lwcGluZyB0ZXN0X3VuaXhfZG9tYWluX3NvY2tldCcpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZmQsIHBhdGggPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKKyAgICAgICAgb3MuY2xvc2UoZmQpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlcnZlciA9IHNlbGYuX3NlcnZlcl9zb2NrZXQodW5peF9zb2NrZXQ9cGF0aCwga2V5ZmlsZT1TRVJWRVJfS0VZLCBjZXJ0ZmlsZT1TRVJWRVJfQ0VSVCkKKyAgICAgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX3N1Y2Nlc3Moc2VydmVyLCBwYXRoPXBhdGgsIGNlcnRfcmVxcz1zc2wuQ0VSVF9OT05FKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MudW5saW5rKHBhdGgpCisKKyAgICBkZWYgdGVzdF9zZXJ2ZXJfY2VydChzZWxmKToKKyAgICAgICAgc2VydmVyID0gc2VsZi5fc2VydmVyX3NvY2tldChrZXlmaWxlPVNFUlZFUl9LRVksIGNlcnRmaWxlPVNFUlZFUl9DRVJUKQorICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9zdWNjZXNzKHNlcnZlciwgY2VydF9yZXFzPXNzbC5DRVJUX1JFUVVJUkVELCBjYV9jZXJ0cz1TRVJWRVJfQ0VSVCkKKworICAgICAgICBzZXJ2ZXIgPSBzZWxmLl9zZXJ2ZXJfc29ja2V0KGtleWZpbGU9U0VSVkVSX0tFWSwgY2VydGZpbGU9U0VSVkVSX0NFUlQpCisgICAgICAgICMgc2VydmVyIGNlcnQgbm90IGluIGNhX2NlcnRzCisgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX2ZhaWx1cmUoc2VydmVyLCBjZXJ0X3JlcXM9c3NsLkNFUlRfUkVRVUlSRUQsIGNhX2NlcnRzPUNMSUVOVF9DRVJUKQorCisgICAgICAgIHNlcnZlciA9IHNlbGYuX3NlcnZlcl9zb2NrZXQoa2V5ZmlsZT1TRVJWRVJfS0VZLCBjZXJ0ZmlsZT1TRVJWRVJfQ0VSVCkKKyAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fc3VjY2VzcyhzZXJ2ZXIsIGNlcnRfcmVxcz1zc2wuQ0VSVF9OT05FKQorCisgICAgZGVmIHRlc3Rfc2V0X3NlcnZlcl9jZXJ0KHNlbGYpOgorICAgICAgICBzZXJ2ZXIgPSBzZWxmLl9zZXJ2ZXJfc29ja2V0KGtleWZpbGU9U0VSVkVSX0tFWSwgY2VydGZpbGU9Q0xJRU5UX0NFUlQpCisgICAgICAgIHdpdGggc2VsZi5fYXNzZXJ0X3JhaXNlcyhFeGNlcHRpb24pOgorICAgICAgICAgICAgc2VydmVyLmNlcnRmaWxlID0gJ2ZvbycKKyAgICAgICAgd2l0aCBzZWxmLl9hc3NlcnRfcmFpc2VzKEV4Y2VwdGlvbik6CisgICAgICAgICAgICBzZXJ2ZXIuY2VydGZpbGUgPSBOb25lCisgICAgICAgIHNlcnZlci5jZXJ0ZmlsZSA9IFNFUlZFUl9DRVJUCisgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX3N1Y2Nlc3Moc2VydmVyLCBjZXJ0X3JlcXM9c3NsLkNFUlRfUkVRVUlSRUQsIGNhX2NlcnRzPVNFUlZFUl9DRVJUKQorCisgICAgZGVmIHRlc3RfY2xpZW50X2NlcnQoc2VsZik6CisgICAgICAgIGlmIG5vdCBfbWF0Y2hfaGFzX2lwYWRkcmVzczoKKyAgICAgICAgICAgIHByaW50KCdza2lwcGluZyB0ZXN0X2NsaWVudF9jZXJ0JykKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZXJ2ZXIgPSBzZWxmLl9zZXJ2ZXJfc29ja2V0KAorICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX1JFUVVJUkVELCBrZXlmaWxlPVNFUlZFUl9LRVksCisgICAgICAgICAgICBjZXJ0ZmlsZT1TRVJWRVJfQ0VSVCwgY2FfY2VydHM9Q0xJRU5UX0NFUlQpCisgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX2ZhaWx1cmUoc2VydmVyLCBjZXJ0X3JlcXM9c3NsLkNFUlRfTk9ORSwgY2VydGZpbGU9U0VSVkVSX0NFUlQsIGtleWZpbGU9U0VSVkVSX0tFWSkKKworICAgICAgICBzZXJ2ZXIgPSBzZWxmLl9zZXJ2ZXJfc29ja2V0KAorICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX1JFUVVJUkVELCBrZXlmaWxlPVNFUlZFUl9LRVksCisgICAgICAgICAgICBjZXJ0ZmlsZT1TRVJWRVJfQ0VSVCwgY2FfY2VydHM9Q0xJRU5UX0NBKQorICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9mYWlsdXJlKHNlcnZlciwgY2VydF9yZXFzPXNzbC5DRVJUX05PTkUsIGNlcnRmaWxlPUNMSUVOVF9DRVJUX05PX0lQLCBrZXlmaWxlPUNMSUVOVF9LRVlfTk9fSVApCisKKyAgICAgICAgc2VydmVyID0gc2VsZi5fc2VydmVyX3NvY2tldCgKKyAgICAgICAgICAgIGNlcnRfcmVxcz1zc2wuQ0VSVF9SRVFVSVJFRCwga2V5ZmlsZT1TRVJWRVJfS0VZLAorICAgICAgICAgICAgY2VydGZpbGU9U0VSVkVSX0NFUlQsIGNhX2NlcnRzPUNMSUVOVF9DQSkKKyAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fc3VjY2VzcyhzZXJ2ZXIsIGNlcnRfcmVxcz1zc2wuQ0VSVF9OT05FLCBjZXJ0ZmlsZT1DTElFTlRfQ0VSVCwga2V5ZmlsZT1DTElFTlRfS0VZKQorCisgICAgICAgIHNlcnZlciA9IHNlbGYuX3NlcnZlcl9zb2NrZXQoCisgICAgICAgICAgICBjZXJ0X3JlcXM9c3NsLkNFUlRfT1BUSU9OQUwsIGtleWZpbGU9U0VSVkVSX0tFWSwKKyAgICAgICAgICAgIGNlcnRmaWxlPVNFUlZFUl9DRVJULCBjYV9jZXJ0cz1DTElFTlRfQ0EpCisgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX3N1Y2Nlc3Moc2VydmVyLCBjZXJ0X3JlcXM9c3NsLkNFUlRfTk9ORSwgY2VydGZpbGU9Q0xJRU5UX0NFUlQsIGtleWZpbGU9Q0xJRU5UX0tFWSkKKworICAgIGRlZiB0ZXN0X2NpcGhlcnMoc2VsZik6CisgICAgICAgIHNlcnZlciA9IHNlbGYuX3NlcnZlcl9zb2NrZXQoa2V5ZmlsZT1TRVJWRVJfS0VZLCBjZXJ0ZmlsZT1TRVJWRVJfQ0VSVCwgY2lwaGVycz1URVNUX0NJUEhFUlMpCisgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX3N1Y2Nlc3Moc2VydmVyLCBjYV9jZXJ0cz1TRVJWRVJfQ0VSVCwgY2lwaGVycz1URVNUX0NJUEhFUlMpCisKKyAgICAgICAgaWYgbm90IFRTU0xTb2NrZXQuX2hhc19jaXBoZXJzOgorICAgICAgICAgICAgIyB1bml0dGVzdC5za2lwIGlzIG5vdCBhdmFpbGFibGUgZm9yIFB5dGhvbiAyLjYKKyAgICAgICAgICAgIHByaW50KCdza2lwcGluZyB0ZXN0X2NpcGhlcnMnKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlcnZlciA9IHNlbGYuX3NlcnZlcl9zb2NrZXQoa2V5ZmlsZT1TRVJWRVJfS0VZLCBjZXJ0ZmlsZT1TRVJWRVJfQ0VSVCkKKyAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fZmFpbHVyZShzZXJ2ZXIsIGNhX2NlcnRzPVNFUlZFUl9DRVJULCBjaXBoZXJzPSdOVUxMJykKKworICAgICAgICBzZXJ2ZXIgPSBzZWxmLl9zZXJ2ZXJfc29ja2V0KGtleWZpbGU9U0VSVkVSX0tFWSwgY2VydGZpbGU9U0VSVkVSX0NFUlQsIGNpcGhlcnM9VEVTVF9DSVBIRVJTKQorICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9mYWlsdXJlKHNlcnZlciwgY2FfY2VydHM9U0VSVkVSX0NFUlQsIGNpcGhlcnM9J05VTEwnKQorCisgICAgZGVmIHRlc3Rfc3NsMl9hbmRfc3NsM19kaXNhYmxlZChzZWxmKToKKyAgICAgICAgaWYgbm90IGhhc2F0dHIoc3NsLCAnUFJPVE9DT0xfU1NMdjMnKToKKyAgICAgICAgICAgIHByaW50KCdQUk9UT0NPTF9TU0x2MyBpcyBub3QgYXZhaWxhYmxlJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlcnZlciA9IHNlbGYuX3NlcnZlcl9zb2NrZXQoa2V5ZmlsZT1TRVJWRVJfS0VZLCBjZXJ0ZmlsZT1TRVJWRVJfQ0VSVCkKKyAgICAgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX2ZhaWx1cmUoc2VydmVyLCBjYV9jZXJ0cz1TRVJWRVJfQ0VSVCwgc3NsX3ZlcnNpb249c3NsLlBST1RPQ09MX1NTTHYzKQorCisgICAgICAgICAgICBzZXJ2ZXIgPSBzZWxmLl9zZXJ2ZXJfc29ja2V0KGtleWZpbGU9U0VSVkVSX0tFWSwgY2VydGZpbGU9U0VSVkVSX0NFUlQsIHNzbF92ZXJzaW9uPXNzbC5QUk9UT0NPTF9TU0x2MykKKyAgICAgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX2ZhaWx1cmUoc2VydmVyLCBjYV9jZXJ0cz1TRVJWRVJfQ0VSVCkKKworICAgICAgICBpZiBub3QgaGFzYXR0cihzc2wsICdQUk9UT0NPTF9TU0x2MicpOgorICAgICAgICAgICAgcHJpbnQoJ1BST1RPQ09MX1NTTHYyIGlzIG5vdCBhdmFpbGFibGUnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VydmVyID0gc2VsZi5fc2VydmVyX3NvY2tldChrZXlmaWxlPVNFUlZFUl9LRVksIGNlcnRmaWxlPVNFUlZFUl9DRVJUKQorICAgICAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fZmFpbHVyZShzZXJ2ZXIsIGNhX2NlcnRzPVNFUlZFUl9DRVJULCBzc2xfdmVyc2lvbj1zc2wuUFJPVE9DT0xfU1NMdjIpCisKKyAgICAgICAgICAgIHNlcnZlciA9IHNlbGYuX3NlcnZlcl9zb2NrZXQoa2V5ZmlsZT1TRVJWRVJfS0VZLCBjZXJ0ZmlsZT1TRVJWRVJfQ0VSVCwgc3NsX3ZlcnNpb249c3NsLlBST1RPQ09MX1NTTHYyKQorICAgICAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fZmFpbHVyZShzZXJ2ZXIsIGNhX2NlcnRzPVNFUlZFUl9DRVJUKQorCisgICAgZGVmIHRlc3RfbmV3ZXJfdGxzKHNlbGYpOgorICAgICAgICBpZiBub3QgVFNTTFNvY2tldC5faGFzX3NzbF9jb250ZXh0OgorICAgICAgICAgICAgIyB1bml0dGVzdC5za2lwIGlzIG5vdCBhdmFpbGFibGUgZm9yIFB5dGhvbiAyLjYKKyAgICAgICAgICAgIHByaW50KCdza2lwcGluZyB0ZXN0X25ld2VyX3RscycpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgbm90IGhhc2F0dHIoc3NsLCAnUFJPVE9DT0xfVExTdjFfMicpOgorICAgICAgICAgICAgcHJpbnQoJ1BST1RPQ09MX1RMU3YxXzIgaXMgbm90IGF2YWlsYWJsZScpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZXJ2ZXIgPSBzZWxmLl9zZXJ2ZXJfc29ja2V0KGtleWZpbGU9U0VSVkVSX0tFWSwgY2VydGZpbGU9U0VSVkVSX0NFUlQsIHNzbF92ZXJzaW9uPXNzbC5QUk9UT0NPTF9UTFN2MV8yKQorICAgICAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fc3VjY2VzcyhzZXJ2ZXIsIGNhX2NlcnRzPVNFUlZFUl9DRVJULCBzc2xfdmVyc2lvbj1zc2wuUFJPVE9DT0xfVExTdjFfMikKKworICAgICAgICBpZiBub3QgaGFzYXR0cihzc2wsICdQUk9UT0NPTF9UTFN2MV8xJyk6CisgICAgICAgICAgICBwcmludCgnUFJPVE9DT0xfVExTdjFfMSBpcyBub3QgYXZhaWxhYmxlJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlcnZlciA9IHNlbGYuX3NlcnZlcl9zb2NrZXQoa2V5ZmlsZT1TRVJWRVJfS0VZLCBjZXJ0ZmlsZT1TRVJWRVJfQ0VSVCwgc3NsX3ZlcnNpb249c3NsLlBST1RPQ09MX1RMU3YxXzEpCisgICAgICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9zdWNjZXNzKHNlcnZlciwgY2FfY2VydHM9U0VSVkVSX0NFUlQsIHNzbF92ZXJzaW9uPXNzbC5QUk9UT0NPTF9UTFN2MV8xKQorCisgICAgICAgIGlmIG5vdCBoYXNhdHRyKHNzbCwgJ1BST1RPQ09MX1RMU3YxXzEnKSBvciBub3QgaGFzYXR0cihzc2wsICdQUk9UT0NPTF9UTFN2MV8yJyk6CisgICAgICAgICAgICBwcmludCgnUFJPVE9DT0xfVExTdjFfMSBhbmQvb3IgUFJPVE9DT0xfVExTdjFfMiBpcyBub3QgYXZhaWxhYmxlJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlcnZlciA9IHNlbGYuX3NlcnZlcl9zb2NrZXQoa2V5ZmlsZT1TRVJWRVJfS0VZLCBjZXJ0ZmlsZT1TRVJWRVJfQ0VSVCwgc3NsX3ZlcnNpb249c3NsLlBST1RPQ09MX1RMU3YxXzIpCisgICAgICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9mYWlsdXJlKHNlcnZlciwgY2FfY2VydHM9U0VSVkVSX0NFUlQsIHNzbF92ZXJzaW9uPXNzbC5QUk9UT0NPTF9UTFN2MV8xKQorCisgICAgZGVmIHRlc3Rfc3NsX2NvbnRleHQoc2VsZik6CisgICAgICAgIGlmIG5vdCBUU1NMU29ja2V0Ll9oYXNfc3NsX2NvbnRleHQ6CisgICAgICAgICAgICAjIHVuaXR0ZXN0LnNraXAgaXMgbm90IGF2YWlsYWJsZSBmb3IgUHl0aG9uIDIuNgorICAgICAgICAgICAgcHJpbnQoJ3NraXBwaW5nIHRlc3Rfc3NsX2NvbnRleHQnKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlcnZlcl9jb250ZXh0ID0gc3NsLmNyZWF0ZV9kZWZhdWx0X2NvbnRleHQoc3NsLlB1cnBvc2UuQ0xJRU5UX0FVVEgpCisgICAgICAgIHNlcnZlcl9jb250ZXh0LmxvYWRfY2VydF9jaGFpbihTRVJWRVJfQ0VSVCwgU0VSVkVSX0tFWSkKKyAgICAgICAgc2VydmVyX2NvbnRleHQubG9hZF92ZXJpZnlfbG9jYXRpb25zKENMSUVOVF9DQSkKKyAgICAgICAgc2VydmVyX2NvbnRleHQudmVyaWZ5X21vZGUgPSBzc2wuQ0VSVF9SRVFVSVJFRAorICAgICAgICBzZXJ2ZXIgPSBzZWxmLl9zZXJ2ZXJfc29ja2V0KHNzbF9jb250ZXh0PXNlcnZlcl9jb250ZXh0KQorCisgICAgICAgIGNsaWVudF9jb250ZXh0ID0gc3NsLmNyZWF0ZV9kZWZhdWx0X2NvbnRleHQoc3NsLlB1cnBvc2UuU0VSVkVSX0FVVEgpCisgICAgICAgIGNsaWVudF9jb250ZXh0LmxvYWRfY2VydF9jaGFpbihDTElFTlRfQ0VSVCwgQ0xJRU5UX0tFWSkKKyAgICAgICAgY2xpZW50X2NvbnRleHQubG9hZF92ZXJpZnlfbG9jYXRpb25zKFNFUlZFUl9DRVJUKQorICAgICAgICBjbGllbnRfY29udGV4dC52ZXJpZnlfbW9kZSA9IHNzbC5DRVJUX1JFUVVJUkVECisKKyAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fc3VjY2VzcyhzZXJ2ZXIsIHNzbF9jb250ZXh0PWNsaWVudF9jb250ZXh0KQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgbG9nZ2luZy5iYXNpY0NvbmZpZyhsZXZlbD1sb2dnaW5nLldBUk4pCisgICAgZnJvbSB0aHJpZnQudHJhbnNwb3J0LlRTU0xTb2NrZXQgaW1wb3J0IFRTU0xTb2NrZXQsIFRTU0xTZXJ2ZXJTb2NrZXQsIF9tYXRjaF9oYXNfaXBhZGRyZXNzCisgICAgZnJvbSB0aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnRFeGNlcHRpb24KKworICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5L3Rlc3QvdGhyaWZ0X2pzb24ucHkgYi9saWIvcHkvdGVzdC90aHJpZnRfanNvbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGU3YTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5L3Rlc3QvdGhyaWZ0X2pzb24ucHkKQEAgLTAsMCArMSw1MSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2ltcG9ydCBzeXMKK2ltcG9ydCB1bml0dGVzdAorCitpbXBvcnQgX2ltcG9ydF9sb2NhbF90aHJpZnQgICMgbm9xYQorZnJvbSB0aHJpZnQucHJvdG9jb2wuVEpTT05Qcm90b2NvbCBpbXBvcnQgVEpTT05Qcm90b2NvbAorZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0CisKKyMKKyMgSW4gb3JkZXIgdG8gcnVuIHRoZSB0ZXN0IHVuZGVyIFdpbmRvd3MuIFdlIG5lZWQgdG8gY3JlYXRlIHN5bWJvbGljIGxpbmsKKyMgbmFtZSAndGhyaWZ0JyB0byAnLi4vc3JjJyBmb2xkZXIgYnkgdXNpbmc6CisjCisjIG1rbGluayAvRCB0aHJpZnQgLi5cc3JjCisjCisKKworY2xhc3MgVGVzdEpTT05TdHJpbmcodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfZXNjYXBlZF91bmljb2RlX3N0cmluZyhzZWxmKToKKyAgICAgICAgdW5pY29kZV9qc29uID0gYiciaGVsbG8gXFx1MGUwMVxcdTBlMDJcXHUwZTAzXFx1ZDgzNVxcdWRjYWJcXHVkYjQwXFx1ZGM3MCB1bmljb2RlIicKKyAgICAgICAgdW5pY29kZV90ZXh0ID0gdSdoZWxsbyBcdTBlMDFcdTBlMDJcdTBlMDNcVTAwMDFENEFCXFUwMDBFMDA3MCB1bmljb2RlJworCisgICAgICAgIGJ1ZiA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcih1bmljb2RlX2pzb24pCisgICAgICAgIHRyYW5zcG9ydCA9IFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSgpLmdldFRyYW5zcG9ydChidWYpCisgICAgICAgIHByb3RvY29sID0gVEpTT05Qcm90b2NvbCh0cmFuc3BvcnQpCisKKyAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA9PSAyOgorICAgICAgICAgICAgdW5pY29kZV90ZXh0ID0gdW5pY29kZV90ZXh0LmVuY29kZSgndXRmOCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvdG9jb2wucmVhZFN0cmluZygpLCB1bmljb2RlX3RleHQpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9yYi9SYWtlZmlsZSBiL2xpYi9yYi9SYWtlZmlsZQppbmRleCAwODMxZTY4Li41ZTVlNWFjIDEwMDY0NAotLS0gYS9saWIvcmIvUmFrZWZpbGUKKysrIGIvbGliL3JiL1Jha2VmaWxlCkBAIC00NywxNSArNDcsMTUgQEAKIAogICB0YXNrIDonbmFtZXNwYWNlZF9zcGVjJyBkbwogICAgIGRpciA9IEZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAnL3NwZWMnCi0gICAgc2ggVEhSSUZULCAnLS1nZW4nLCAncmI6bmFtZXNwYWNlZCcsICctcmVjdXJzZScsICctbycsIGRpciwgIiN7ZGlyfS9UaHJpZnROYW1lc3BhY2VkU3BlYy50aHJpZnQiCi0gICAgc2ggVEhSSUZULCAnLS1nZW4nLCAncmI6bmFtZXNwYWNlZCcsICctcmVjdXJzZScsICctbycsIGRpciwgIiN7ZGlyfS9CYXNlU2VydmljZS50aHJpZnQiCi0gICAgc2ggVEhSSUZULCAnLS1nZW4nLCAncmI6bmFtZXNwYWNlZCcsICctcmVjdXJzZScsICctbycsIGRpciwgIiN7ZGlyfS9FeHRlbmRlZFNlcnZpY2UudGhyaWZ0IgorICAgIHNoIFRIUklGVCwgJy0tZ2VuJywgJ3JiOm5hbWVzcGFjZWQnLCAnLS1yZWN1cnNlJywgJy1vJywgZGlyLCAiI3tkaXJ9L1RocmlmdE5hbWVzcGFjZWRTcGVjLnRocmlmdCIKKyAgICBzaCBUSFJJRlQsICctLWdlbicsICdyYjpuYW1lc3BhY2VkJywgJy0tcmVjdXJzZScsICctbycsIGRpciwgIiN7ZGlyfS9CYXNlU2VydmljZS50aHJpZnQiCisgICAgc2ggVEhSSUZULCAnLS1nZW4nLCAncmI6bmFtZXNwYWNlZCcsICctLXJlY3Vyc2UnLCAnLW8nLCBkaXIsICIje2Rpcn0vRXh0ZW5kZWRTZXJ2aWNlLnRocmlmdCIKICAgZW5kCiAKICAgdGFzayA6J2ZsYXRfc3BlYycgZG8KICAgICBkaXIgPSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy9zcGVjJwogICAgIG1rZGlyX3AoIiN7ZGlyfS9nZW4tcmIvZmxhdCIpCi0gICAgc2ggVEhSSUZULCAnLS1nZW4nLCAncmInLCAnLXJlY3Vyc2UnLCAnLW91dCcsICIje2Rpcn0vZ2VuLXJiL2ZsYXQiLCAiI3tkaXJ9L1RocmlmdE5hbWVzcGFjZWRTcGVjLnRocmlmdCIKKyAgICBzaCBUSFJJRlQsICctLWdlbicsICdyYicsICctLXJlY3Vyc2UnLCAnLW91dCcsICIje2Rpcn0vZ2VuLXJiL2ZsYXQiLCAiI3tkaXJ9L1RocmlmdE5hbWVzcGFjZWRTcGVjLnRocmlmdCIKICAgZW5kCiAKICAgdGFzayA6J2JlbmNobWFyaycgZG8KQEAgLTcxLDYgKzcxLDcgQEAKIAogZGVzYyAiQnVpbGQgdGhlIG5hdGl2ZSBsaWJyYXJ5IgogdGFzayA6YnVpbGRfZXh0ID0+IDonZ2VuLXJiJyBkbworICAgbmV4dCBpZiBkZWZpbmVkPyhSVUJZX0VOR0lORSkgJiYgUlVCWV9FTkdJTkUgPX4gL2pydWJ5LwogICAgRGlyOjpjaGRpcihGaWxlOjpkaXJuYW1lKCdleHQvZXh0Y29uZi5yYicpKSBkbwogICAgICAgdW5sZXNzIHNoICJydWJ5ICN7RmlsZTo6YmFzZW5hbWUoJ2V4dC9leHRjb25mLnJiJyl9IgogICAgICAgICAkc3RkZXJyLnB1dHMgIkZhaWxlZCB0byBydW4gZXh0Y29uZiIKZGlmZiAtLWdpdCBhL2xpYi9yYi9leHQvc3RydWN0LmMgYi9saWIvcmIvZXh0L3N0cnVjdC5jCmluZGV4IGY1MDBkMDMuLmUzYWE4NTUgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9leHQvc3RydWN0LmMKKysrIGIvbGliL3JiL2V4dC9zdHJ1Y3QuYwpAQCAtMjkwLDcgKzI5MCw3IEBACiAKICAgICBpZiAoVFlQRSh2YWx1ZSkgPT0gVF9BUlJBWSkgewogICAgICAgaXRlbXMgPSB2YWx1ZTsKLSAgICB9IGVsc2UgeyAgICAgICAgCisgICAgfSBlbHNlIHsKICAgICAgIGlmIChyYl9jU2V0ID09IENMQVNTX09GKHZhbHVlKSkgewogICAgICAgICBpdGVtcyA9IHJiX2Z1bmNhbGwodmFsdWUsIGVudHJpZXNfbWV0aG9kX2lkLCAwKTsKICAgICAgIH0gZWxzZSB7CkBAIC02NzAsNiArNjcwLDEwIEBACiAKICAgVkFMVUUgZmllbGRfaW5mbyA9IHJiX2hhc2hfYXJlZihzdHJ1Y3RfZmllbGRzLCBmaWVsZF9pZCk7CiAKKyAgaWYoTklMX1AoZmllbGRfaW5mbykpIHsKKyAgICByYl9yYWlzZShyYl9lUnVudGltZUVycm9yLCAic2V0X2ZpZWxkIGlzIG5vdCB2YWxpZCBmb3IgdGhpcyB1bmlvbiEiKTsKKyAgfQorCiAgIFZBTFVFIHR0eXBlX3ZhbHVlID0gcmJfaGFzaF9hcmVmKGZpZWxkX2luZm8sIHR5cGVfc3ltKTsKICAgaW50IHR0eXBlID0gRklYMklOVCh0dHlwZV92YWx1ZSk7CiAKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0LnJiIGIvbGliL3JiL2xpYi90aHJpZnQucmIKaW5kZXggZmFkZWJjYS4uMGY1ODEyMiAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQucmIKQEAgLTEsNCArMSw0IEBACi0jIAorIwogIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCiAjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCkBAIC02LDE2ICs2LDE2IEBACiAjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKICMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQogIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMgCisjCiAjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jIAorIwogIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCiAjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCiAjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQogIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQogIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAjIHVuZGVyIHRoZSBMaWNlbnNlLgotIyAKKyMKICMgQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KICMgUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKICMgZGV0YWlscy4KQEAgLTQ5LDcgKzQ5LDkgQEAKIHJlcXVpcmUgJ3RocmlmdC90cmFuc3BvcnQvYmFzZV90cmFuc3BvcnQnCiByZXF1aXJlICd0aHJpZnQvdHJhbnNwb3J0L2Jhc2Vfc2VydmVyX3RyYW5zcG9ydCcKIHJlcXVpcmUgJ3RocmlmdC90cmFuc3BvcnQvc29ja2V0JworcmVxdWlyZSAndGhyaWZ0L3RyYW5zcG9ydC9zc2xfc29ja2V0JwogcmVxdWlyZSAndGhyaWZ0L3RyYW5zcG9ydC9zZXJ2ZXJfc29ja2V0JworcmVxdWlyZSAndGhyaWZ0L3RyYW5zcG9ydC9zc2xfc2VydmVyX3NvY2tldCcKIHJlcXVpcmUgJ3RocmlmdC90cmFuc3BvcnQvdW5peF9zb2NrZXQnCiByZXF1aXJlICd0aHJpZnQvdHJhbnNwb3J0L3VuaXhfc2VydmVyX3NvY2tldCcKIHJlcXVpcmUgJ3RocmlmdC90cmFuc3BvcnQvYnVmZmVyZWRfdHJhbnNwb3J0JwpkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvcHJvY2Vzc29yLnJiIGIvbGliL3JiL2xpYi90aHJpZnQvcHJvY2Vzc29yLnJiCmluZGV4IGI5NmZiNDMuLmNlMjFlMTIgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3Byb2Nlc3Nvci5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC9wcm9jZXNzb3IucmIKQEAgLTE3LDEwICsxNywxOCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMgCiAKK3JlcXVpcmUgJ2xvZ2dlcicKKwogbW9kdWxlIFRocmlmdAogICBtb2R1bGUgUHJvY2Vzc29yCi0gICAgZGVmIGluaXRpYWxpemUoaGFuZGxlcikKKyAgICBkZWYgaW5pdGlhbGl6ZShoYW5kbGVyLCBsb2dnZXI9bmlsKQogICAgICAgQGhhbmRsZXIgPSBoYW5kbGVyCisgICAgICBpZiBsb2dnZXIubmlsPworICAgICAgICBAbG9nZ2VyID0gTG9nZ2VyLm5ldyhTVERFUlIpCisgICAgICAgIEBsb2dnZXIubGV2ZWwgPSBMb2dnZXI6OldBUk4KKyAgICAgIGVsc2UKKyAgICAgICAgQGxvZ2dlciA9IGxvZ2dlcgorICAgICAgZW5kCiAgICAgZW5kCiAKICAgICBkZWYgcHJvY2VzcyhpcHJvdCwgb3Byb3QpCkBAIC0zMCw2ICszOCw3IEBACiAgICAgICAgICAgc2VuZCgicHJvY2Vzc18je25hbWV9Iiwgc2VxaWQsIGlwcm90LCBvcHJvdCkKICAgICAgICAgcmVzY3VlID0+IGUKICAgICAgICAgICB4ID0gQXBwbGljYXRpb25FeGNlcHRpb24ubmV3KEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpJTlRFUk5BTF9FUlJPUiwgJ0ludGVybmFsIGVycm9yJykKKyAgICAgICAgICBAbG9nZ2VyLmRlYnVnICJJbnRlcm5hbCBlcnJvciA6ICN7ZS5tZXNzYWdlfVxuI3tlLmJhY2t0cmFjZS5qb2luKCJcbiIpfSIKICAgICAgICAgICB3cml0ZV9lcnJvcih4LCBvcHJvdCwgbmFtZSwgc2VxaWQpCiAgICAgICAgIGVuZAogICAgICAgICB0cnVlCkBAIC01NywxMiArNjYsMTAgQEAKICAgICBlbmQKIAogICAgIGRlZiB3cml0ZV9lcnJvcihlcnIsIG9wcm90LCBuYW1lLCBzZXFpZCkKLSAgICAgIHAgJ3dyaXRlX2Vycm9yJwogICAgICAgb3Byb3Qud3JpdGVfbWVzc2FnZV9iZWdpbihuYW1lLCBNZXNzYWdlVHlwZXM6OkVYQ0VQVElPTiwgc2VxaWQpCiAgICAgICBlcnIud3JpdGUob3Byb3QpCiAgICAgICBvcHJvdC53cml0ZV9tZXNzYWdlX2VuZAogICAgICAgb3Byb3QudHJhbnMuZmx1c2gKLSAgICAgIHAgJ3dyaXRlX2Vycm9yIGVuZCcKICAgICBlbmQKICAgZW5kCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL2Jhc2VfcHJvdG9jb2wucmIgYi9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9iYXNlX3Byb3RvY29sLnJiCmluZGV4IDg4ZjQ0ZDQuLjVjNjkzZTkgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL2Jhc2VfcHJvdG9jb2wucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvYmFzZV9wcm90b2NvbC5yYgpAQCAtMzY5LDExICszNjksMTkgQEAKICAgICAgICAgcmVhZF9saXN0X2VuZAogICAgICAgZW5kCiAgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICIje3RyYW5zLnRvX3N9IgorICAgIGVuZAogICBlbmQKIAogICBjbGFzcyBCYXNlUHJvdG9jb2xGYWN0b3J5CiAgICAgZGVmIGdldF9wcm90b2NvbCh0cmFucykKICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKICAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgImJhc2UiCisgICAgZW5kCiAgIGVuZAotZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9iaW5hcnlfcHJvdG9jb2wucmIgYi9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9iaW5hcnlfcHJvdG9jb2wucmIKaW5kZXggZTcwYjFlMy4uZDgyNzlkYiAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvYmluYXJ5X3Byb3RvY29sLnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL2JpbmFyeV9wcm90b2NvbC5yYgpAQCAtMjI2LDEyICsyMjYsMTkgQEAKICAgICAgIHNpemUgPSByZWFkX2kzMgogICAgICAgdHJhbnMucmVhZF9hbGwoc2l6ZSkKICAgICBlbmQKLQorICAgIAorICAgIGRlZiB0b19zCisgICAgICAiYmluYXJ5KCN7c3VwZXIudG9fc30pIgorICAgIGVuZAogICBlbmQKIAogICBjbGFzcyBCaW5hcnlQcm90b2NvbEZhY3RvcnkgPCBCYXNlUHJvdG9jb2xGYWN0b3J5CiAgICAgZGVmIGdldF9wcm90b2NvbCh0cmFucykKICAgICAgIHJldHVybiBUaHJpZnQ6OkJpbmFyeVByb3RvY29sLm5ldyh0cmFucykKICAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgImJpbmFyeSIKKyAgICBlbmQKICAgZW5kCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL2JpbmFyeV9wcm90b2NvbF9hY2NlbGVyYXRlZC5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL2JpbmFyeV9wcm90b2NvbF9hY2NlbGVyYXRlZC5yYgppbmRleCA3MGVhNjUyLi4wOWIwMjY0IDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9iaW5hcnlfcHJvdG9jb2xfYWNjZWxlcmF0ZWQucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvYmluYXJ5X3Byb3RvY29sX2FjY2VsZXJhdGVkLnJiCkBAIC0zNSw1ICszNSwxMyBAQAogICAgICAgICBCaW5hcnlQcm90b2NvbC5uZXcodHJhbnMpCiAgICAgICBlbmQKICAgICBlbmQKKworICAgIGRlZiB0b19zCisgICAgICBpZiAoZGVmaW5lZD8gQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCkKKyAgICAgICAgImJpbmFyeS1hY2NlbCIKKyAgICAgIGVsc2UKKyAgICAgICAgImJpbmFyeSIKKyAgICAgIGVuZAorICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvY29tcGFjdF9wcm90b2NvbC5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL2NvbXBhY3RfcHJvdG9jb2wucmIKaW5kZXggNjA1ZWVhNi4uMWY5YmQzMCAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvY29tcGFjdF9wcm90b2NvbC5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9jb21wYWN0X3Byb3RvY29sLnJiCkBAIC0zNDUsNiArMzQ1LDEwIEBACiAgICAgICBzaXplID0gcmVhZF92YXJpbnQzMigpCiAgICAgICB0cmFucy5yZWFkX2FsbChzaXplKQogICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICAiY29tcGFjdCgje3N1cGVyLnRvX3N9KSIKKyAgICBlbmQKIAogICAgIHByaXZhdGUKICAgICAKQEAgLTQzMSw1ICs0MzUsOSBAQAogICAgIGRlZiBnZXRfcHJvdG9jb2wodHJhbnMpCiAgICAgICBDb21wYWN0UHJvdG9jb2wubmV3KHRyYW5zKQogICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICAiY29tcGFjdCIKKyAgICBlbmQKICAgZW5kCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL2pzb25fcHJvdG9jb2wucmIgYi9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9qc29uX3Byb3RvY29sLnJiCmluZGV4IDlmMDA2OWQuLjkxZTc0ZTQgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL2pzb25fcHJvdG9jb2wucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvanNvbl9wcm90b2NvbC5yYgpAQCAtMTgsNiArMTgsNyBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMgCiAKK3JlcXVpcmUgJ2Jhc2U2NCcKIAogbW9kdWxlIFRocmlmdAogICBjbGFzcyBMb29rYWhlYWRSZWFkZXIKQEAgLTMxMCw3ICszMTEsNyBAQAogICAgIGRlZiB3cml0ZV9qc29uX2Jhc2U2NChzdHIpCiAgICAgICBAY29udGV4dC53cml0ZSh0cmFucykKICAgICAgIHRyYW5zLndyaXRlKEBAa0pTT05TdHJpbmdEZWxpbWl0ZXIpCi0gICAgICB3cml0ZV9qc29uX3N0cmluZyhbc3RyXS5wYWNrKCJtIikpCisgICAgICB0cmFucy53cml0ZShCYXNlNjQuc3RyaWN0X2VuY29kZTY0KHN0cikpCiAgICAgICB0cmFucy53cml0ZShAQGtKU09OU3RyaW5nRGVsaW1pdGVyKQogICAgIGVuZAogCkBAIC0zMzIsNyArMzMzLDcgQEAKICAgICAjICJOYU4iIG9yICJJbmZpbml0eSIgb3IgIi1JbmZpbml0eSIuCiAgICAgZGVmIHdyaXRlX2pzb25fZG91YmxlKG51bSkKICAgICAgIEBjb250ZXh0LndyaXRlKHRyYW5zKQotICAgICAgIyBOb3JtYWxpemUgb3V0cHV0IG9mIGJvb3N0OjpsZXhpY2FsX2Nhc3QgZm9yIE5hTnMgYW5kIEluZmluaXRpZXMKKyAgICAgICMgTm9ybWFsaXplIG91dHB1dCBvZiB0aHJpZnQ6OnRvX3N0cmluZyBmb3IgTmFOcyBhbmQgSW5maW5pdGllcwogICAgICAgc3BlY2lhbCA9IGZhbHNlOwogICAgICAgaWYgKG51bS5uYW4/KQogICAgICAgICBzcGVjaWFsID0gdHJ1ZTsKQEAgLTUxMyw3ICs1MTQsNyBAQAogICAgICAgIyBUaGUgZWxlbWVudHMgb2YgdGhpcyBhcnJheSBtdXN0IG1hdGNoIHVwIHdpdGggdGhlIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgaW4KICAgICAgICMgZXNjYXBlX2NoYXJzCiAgICAgICBlc2NhcGVfY2hhcl92YWxzID0gWwotICAgICAgICAnIicsICdcXCcsICcvJywgJ1xiJywgJ1xmJywgJ1xuJywgJ1xyJywgJ1x0JywKKyAgICAgICAgIlwiIiwgIlxcIiwgIlwvIiwgIlxiIiwgIlxmIiwgIlxuIiwgIlxyIiwgIlx0IiwKICAgICAgIF0KIAogICAgICAgaWYgIXNraXBDb250ZXh0CkBAIC01NDYsNyArNTQ3LDE1IEBACiAKICAgICAjIFJlYWRzIGEgYmxvY2sgb2YgYmFzZTY0IGNoYXJhY3RlcnMsIGRlY29kaW5nIGl0LCBhbmQgcmV0dXJucyB2aWEgc3RyCiAgICAgZGVmIHJlYWRfanNvbl9iYXNlNjQKLSAgICAgIHJlYWRfanNvbl9zdHJpbmcudW5wYWNrKCJtIilbMF0KKyAgICAgIHN0ciA9IHJlYWRfanNvbl9zdHJpbmcKKyAgICAgIG0gPSBzdHIubGVuZ3RoICUgNAorICAgICAgaWYgbSAhPSAwCisgICAgICAgICMgQWRkIG1pc3NpbmcgcGFkZGluZworICAgICAgICAoNCAtIG0pLnRpbWVzIGRvCisgICAgICAgICAgc3RyICs9ICc9JworICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgICAgQmFzZTY0LnN0cmljdF9kZWNvZGU2NChzdHIpCiAgICAgZW5kCiAKICAgICAjIFJlYWRzIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycywgc3RvcHBpbmcgYXQgdGhlIGZpcnN0IG9uZSB0aGF0IGlzIG5vdApAQCAtNzU5LDExICs3NjgsMTkgQEAKICAgICBkZWYgcmVhZF9iaW5hcnkKICAgICAgIHJlYWRfanNvbl9iYXNlNjQKICAgICBlbmQKKworICAgIGRlZiB0b19zCisgICAgICAianNvbigje3N1cGVyLnRvX3N9KSIKKyAgICBlbmQKICAgZW5kCiAKICAgY2xhc3MgSnNvblByb3RvY29sRmFjdG9yeSA8IEJhc2VQcm90b2NvbEZhY3RvcnkKICAgICBkZWYgZ2V0X3Byb3RvY29sKHRyYW5zKQogICAgICAgcmV0dXJuIFRocmlmdDo6SnNvblByb3RvY29sLm5ldyh0cmFucykKICAgICBlbmQKKworICAgIGRlZiB0b19zCisgICAgICAianNvbiIKKyAgICBlbmQKICAgZW5kCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL211bHRpcGxleGVkX3Byb3RvY29sLnJiIGIvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvbXVsdGlwbGV4ZWRfcHJvdG9jb2wucmIKaW5kZXggMTNjOWQ5My4uYjQ0MjhhNyAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvbXVsdGlwbGV4ZWRfcHJvdG9jb2wucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvbXVsdGlwbGV4ZWRfcHJvdG9jb2wucmIKQEAgLTM2LDUgKzM2LDkgQEAKICAgICAgICAgQHByb3RvY29sLndyaXRlX21lc3NhZ2VfYmVnaW4obmFtZSwgdHlwZSwgc2VxaWQpCiAgICAgICBlbmQgCiAgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICJtdWx0aXBsZXhlZCgje0BzZXJ2aWNlX25hbWU9QHByb3RvY29sLnRvX3N9KSIKKyAgICBlbmQKICAgZW5kCi1lbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci9iYXNlX3NlcnZlci5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci9iYXNlX3NlcnZlci5yYgppbmRleCAxZWUxMjEzLi5hYTRkMDljIDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvYmFzZV9zZXJ2ZXIucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL2Jhc2Vfc2VydmVyLnJiCkBAIC0yNiw2ICsyNiwxMiBAQAogICAgICAgQHByb3RvY29sX2ZhY3RvcnkgPSBwcm90b2NvbF9mYWN0b3J5ID8gcHJvdG9jb2xfZmFjdG9yeSA6IFRocmlmdDo6QmluYXJ5UHJvdG9jb2xGYWN0b3J5Lm5ldwogICAgIGVuZAogCi0gICAgZGVmIHNlcnZlOyBuaWw7IGVuZAorICAgIGRlZiBzZXJ2ZQorICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorICAgIGVuZAorCisgICAgZGVmIHRvX3MKKyAgICAgICJzZXJ2ZXIoI3tAcHJvdG9jb2xfZmFjdG9yeS50b19zfSgje0B0cmFuc3BvcnRfZmFjdG9yeS50b19zfSgje0BzZXJ2ZXJfdHJhbnNwb3J0LnRvX3N9KSkpIgorICAgIGVuZAogICBlbmQKLWVuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL3NpbXBsZV9zZXJ2ZXIucmIgYi9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvc2ltcGxlX3NlcnZlci5yYgppbmRleCAyMWU4NjU5Li45MDVmZTliIDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvc2ltcGxlX3NlcnZlci5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvc2ltcGxlX3NlcnZlci5yYgpAQCAtMzksNSArMzksOSBAQAogICAgICAgICBAc2VydmVyX3RyYW5zcG9ydC5jbG9zZQogICAgICAgZW5kCiAgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICJzaW1wbGUoI3tzdXBlci50b19zfSkiCisgICAgZW5kCiAgIGVuZAotZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvdGhyZWFkX3Bvb2xfc2VydmVyLnJiIGIvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL3RocmVhZF9wb29sX3NlcnZlci5yYgppbmRleCA4Y2VjODA1Li5iYjc1NGFkIDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvdGhyZWFkX3Bvb2xfc2VydmVyLnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci90aHJlYWRfcG9vbF9zZXJ2ZXIucmIKQEAgLTcxLDUgKzcxLDkgQEAKICAgICAgICAgQHNlcnZlcl90cmFuc3BvcnQuY2xvc2UKICAgICAgIGVuZAogICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICAidGhyZWFkcG9vbCgje3N1cGVyLnRvX3N9KSIKKyAgICBlbmQKICAgZW5kCi1lbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci90aHJlYWRlZF9zZXJ2ZXIucmIgYi9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvdGhyZWFkZWRfc2VydmVyLnJiCmluZGV4IGEyYzkxN2MuLjg4ZWUxODMgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci90aHJlYWRlZF9zZXJ2ZXIucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL3RocmVhZGVkX3NlcnZlci5yYgpAQCAtNDMsNSArNDMsOSBAQAogICAgICAgICBAc2VydmVyX3RyYW5zcG9ydC5jbG9zZQogICAgICAgZW5kCiAgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICJ0aHJlYWRlZCgje3N1cGVyLnRvX3N9KSIKKyAgICBlbmQKICAgZW5kCi1lbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9iYXNlX3NlcnZlcl90cmFuc3BvcnQucmIgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvYmFzZV9zZXJ2ZXJfdHJhbnNwb3J0LnJiCmluZGV4IDY4YzVhZjAuLjAxMDU0NjMgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9iYXNlX3NlcnZlcl90cmFuc3BvcnQucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2Jhc2Vfc2VydmVyX3RyYW5zcG9ydC5yYgpAQCAtMzQsNCArMzQsNCBAQAogICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgogICAgIGVuZAogICBlbmQKLWVuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2Jhc2VfdHJhbnNwb3J0LnJiIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2Jhc2VfdHJhbnNwb3J0LnJiCmluZGV4IDg3OTAzMjYuLjk3ZTU5MzUgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9iYXNlX3RyYW5zcG9ydC5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvYmFzZV90cmFuc3BvcnQucmIKQEAgLTk5LDExICs5OSwxOSBAQAogICAgIGFsaWFzX21ldGhvZCA6PDwsIDp3cml0ZQogCiAgICAgZGVmIGZsdXNoOyBlbmQKKworICAgIGRlZiB0b19zCisgICAgICAiYmFzZSIKKyAgICBlbmQKICAgZW5kCiAgIAogICBjbGFzcyBCYXNlVHJhbnNwb3J0RmFjdG9yeQogICAgIGRlZiBnZXRfdHJhbnNwb3J0KHRyYW5zKQogICAgICAgcmV0dXJuIHRyYW5zCiAgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICJiYXNlIgorICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2J1ZmZlcmVkX3RyYW5zcG9ydC5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9idWZmZXJlZF90cmFuc3BvcnQucmIKaW5kZXggNzgxZDNjNi4uNGZlOWM0MSAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2J1ZmZlcmVkX3RyYW5zcG9ydC5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvYnVmZmVyZWRfdHJhbnNwb3J0LnJiCkBAIC0xMDQsMTEgKzEwNCwxOSBAQAogICAgICAgCiAgICAgICBAdHJhbnNwb3J0LmZsdXNoCiAgICAgZW5kCisKKyAgICBkZWYgdG9fcworICAgICAgImJ1ZmZlcmVkKCN7QHRyYW5zcG9ydC50b19zfSkiCisgICAgZW5kCiAgIGVuZAogCiAgIGNsYXNzIEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSA8IEJhc2VUcmFuc3BvcnRGYWN0b3J5CiAgICAgZGVmIGdldF90cmFuc3BvcnQodHJhbnNwb3J0KQogICAgICAgcmV0dXJuIEJ1ZmZlcmVkVHJhbnNwb3J0Lm5ldyh0cmFuc3BvcnQpCiAgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICJidWZmZXJlZCIKKyAgICBlbmQKICAgZW5kCi1lbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9mcmFtZWRfdHJhbnNwb3J0LnJiIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2ZyYW1lZF90cmFuc3BvcnQucmIKaW5kZXggZDgwNmNlMC4uOTUzMTc3OCAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2ZyYW1lZF90cmFuc3BvcnQucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2ZyYW1lZF90cmFuc3BvcnQucmIKQEAgLTk5LDYgKzk5LDEwIEBACiAgICAgICBAd2J1ZiA9IEJ5dGVzLmVtcHR5X2J5dGVfYnVmZmVyCiAgICAgZW5kCiAKKyAgICBkZWYgdG9fcworICAgICAgImZyYW1lZCgje0B0cmFuc3BvcnQudG9fc30pIgorICAgIGVuZAorCiAgICAgcHJpdmF0ZQogCiAgICAgZGVmIHJlYWRfZnJhbWUKQEAgLTExMyw1ICsxMTcsOSBAQAogICAgIGRlZiBnZXRfdHJhbnNwb3J0KHRyYW5zcG9ydCkKICAgICAgIHJldHVybiBGcmFtZWRUcmFuc3BvcnQubmV3KHRyYW5zcG9ydCkKICAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgImZyYW1lZCIKKyAgICBlbmQKICAgZW5kCi1lbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9odHRwX2NsaWVudF90cmFuc3BvcnQucmIgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvaHR0cF9jbGllbnRfdHJhbnNwb3J0LnJiCmluZGV4IDc3ZmZlMzUuLjVjMWRkNWMgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9odHRwX2NsaWVudF90cmFuc3BvcnQucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2h0dHBfY2xpZW50X3RyYW5zcG9ydC5yYgpAQCAtNTAsNyArNTAsMTIgQEAKICAgICAgIGRhdGEgPSByZXNwLmJvZHkKICAgICAgIGRhdGEgPSBCeXRlcy5mb3JjZV9iaW5hcnlfZW5jb2RpbmcoZGF0YSkKICAgICAgIEBpbmJ1ZiA9IFN0cmluZ0lPLm5ldyBkYXRhCisgICAgZW5zdXJlCiAgICAgICBAb3V0YnVmID0gQnl0ZXMuZW1wdHlfYnl0ZV9idWZmZXIKICAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgIkB7c2VsZi51cmx9IgorICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2lvX3N0cmVhbV90cmFuc3BvcnQucmIgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvaW9fc3RyZWFtX3RyYW5zcG9ydC5yYgppbmRleCBlM2M4Mzc5Li5jY2VjNjhmIDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvaW9fc3RyZWFtX3RyYW5zcG9ydC5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvaW9fc3RyZWFtX3RyYW5zcG9ydC5yYgpAQCAtMzUsNSArMzUsOCBAQAogICAgIGRlZiB3cml0ZShidWYpOyBAb3V0cHV0LndyaXRlKEJ5dGVzLmZvcmNlX2JpbmFyeV9lbmNvZGluZyhidWYpKSBlbmQKICAgICBkZWYgY2xvc2U7IEBpbnB1dC5jbG9zZTsgQG91dHB1dC5jbG9zZSBlbmQKICAgICBkZWYgdG9faW87IEBpbnB1dCBlbmQgIyB3ZSdyZSBhc3N1bWluZyB0aGlzIGlzIHVzZWQgaW4gYSBJTy5zZWxlY3QgZm9yIHJlYWRpbmcKKyAgICBkZWYgdG9fcworICAgICAgImlvc3RyZWFtKGlucHV0PSN7QGlucHV0LnRvX3N9LG91dHB1dD0je0BvdXRwdXQudG9fc30pIgorICAgIGVuZAogICBlbmQKLWVuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L21lbW9yeV9idWZmZXJfdHJhbnNwb3J0LnJiIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L21lbW9yeV9idWZmZXJfdHJhbnNwb3J0LnJiCmluZGV4IGFkNWFkODUuLjQ2OWVhNzMgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9tZW1vcnlfYnVmZmVyX3RyYW5zcG9ydC5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvbWVtb3J5X2J1ZmZlcl90cmFuc3BvcnQucmIKQEAgLTEyMSw1ICsxMjEsOSBAQAogICAgICAgZW5kCiAgICAgICBvdXQuam9pbigiICIpCiAgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICJtZW1vcnkiCisgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvc2VydmVyX3NvY2tldC5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9zZXJ2ZXJfc29ja2V0LnJiCmluZGV4IDdmZWI5YWIuLjUwMDAyMzIgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9zZXJ2ZXJfc29ja2V0LnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9zZXJ2ZXJfc29ja2V0LnJiCkBAIC01OSw1ICs1OSwxMCBAQAogICAgIGVuZAogCiAgICAgYWxpYXMgdG9faW8gaGFuZGxlCisKKyAgICBkZWYgdG9fcworICAgICAgInNvY2tldCgje0Bob3N0fToje0Bwb3J0fSkiCisgICAgZW5kCisKICAgZW5kCi1lbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9zb2NrZXQucmIgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvc29ja2V0LnJiCmluZGV4IDJiN2NhMDkuLmY1ZTZmM2IgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9zb2NrZXQucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L3NvY2tldC5yYgpAQCAtMzMsMjYgKzMzLDI4IEBACiAgICAgYXR0cl9hY2Nlc3NvciA6aGFuZGxlLCA6dGltZW91dAogCiAgICAgZGVmIG9wZW4KLSAgICAgIGJlZ2luCi0gICAgICAgIGFkZHJpbmZvID0gOjpTb2NrZXQ6OmdldGFkZHJpbmZvKEBob3N0LCBAcG9ydCwgbmlsLCA6OlNvY2tldDo6U09DS19TVFJFQU0pLmZpcnN0Ci0gICAgICAgIEBoYW5kbGUgPSA6OlNvY2tldC5uZXcoYWRkcmluZm9bNF0sIDo6U29ja2V0OjpTT0NLX1NUUkVBTSwgMCkKLSAgICAgICAgQGhhbmRsZS5zZXRzb2Nrb3B0KDo6U29ja2V0OjpJUFBST1RPX1RDUCwgOjpTb2NrZXQ6OlRDUF9OT0RFTEFZLCAxKQotICAgICAgICBzb2NrYWRkciA9IDo6U29ja2V0LnNvY2thZGRyX2luKGFkZHJpbmZvWzFdLCBhZGRyaW5mb1szXSkKKyAgICAgIGZvciBhZGRyaW5mbyBpbiA6OlNvY2tldDo6Z2V0YWRkcmluZm8oQGhvc3QsIEBwb3J0LCBuaWwsIDo6U29ja2V0OjpTT0NLX1NUUkVBTSkgZG8KICAgICAgICAgYmVnaW4KLSAgICAgICAgICBAaGFuZGxlLmNvbm5lY3Rfbm9uYmxvY2soc29ja2FkZHIpCi0gICAgICAgIHJlc2N1ZSBFcnJubzo6RUlOUFJPR1JFU1MKLSAgICAgICAgICB1bmxlc3MgSU8uc2VsZWN0KG5pbCwgWyBAaGFuZGxlIF0sIG5pbCwgQHRpbWVvdXQpCi0gICAgICAgICAgICByYWlzZSBUcmFuc3BvcnRFeGNlcHRpb24ubmV3KFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDb25uZWN0aW9uIHRpbWVvdXQgdG8gI3tAZGVzY30iKQotICAgICAgICAgIGVuZAorICAgICAgICAgIHNvY2tldCA9IDo6U29ja2V0Lm5ldyhhZGRyaW5mb1s0XSwgOjpTb2NrZXQ6OlNPQ0tfU1RSRUFNLCAwKQorICAgICAgICAgIHNvY2tldC5zZXRzb2Nrb3B0KDo6U29ja2V0OjpJUFBST1RPX1RDUCwgOjpTb2NrZXQ6OlRDUF9OT0RFTEFZLCAxKQorICAgICAgICAgIHNvY2thZGRyID0gOjpTb2NrZXQuc29ja2FkZHJfaW4oYWRkcmluZm9bMV0sIGFkZHJpbmZvWzNdKQogICAgICAgICAgIGJlZ2luCi0gICAgICAgICAgICBAaGFuZGxlLmNvbm5lY3Rfbm9uYmxvY2soc29ja2FkZHIpCi0gICAgICAgICAgcmVzY3VlIEVycm5vOjpFSVNDT05OCisgICAgICAgICAgICBzb2NrZXQuY29ubmVjdF9ub25ibG9jayhzb2NrYWRkcikKKyAgICAgICAgICByZXNjdWUgRXJybm86OkVJTlBST0dSRVNTCisgICAgICAgICAgICB1bmxlc3MgSU8uc2VsZWN0KG5pbCwgWyBzb2NrZXQgXSwgbmlsLCBAdGltZW91dCkKKyAgICAgICAgICAgICAgbmV4dAorICAgICAgICAgICAgZW5kCisgICAgICAgICAgICBiZWdpbgorICAgICAgICAgICAgICBzb2NrZXQuY29ubmVjdF9ub25ibG9jayhzb2NrYWRkcikKKyAgICAgICAgICAgIHJlc2N1ZSBFcnJubzo6RUlTQ09OTgorICAgICAgICAgICAgZW5kCiAgICAgICAgICAgZW5kCisgICAgICAgICAgcmV0dXJuIEBoYW5kbGUgPSBzb2NrZXQKKyAgICAgICAgcmVzY3VlIFN0YW5kYXJkRXJyb3IgPT4gZQorICAgICAgICAgIG5leHQKICAgICAgICAgZW5kCi0gICAgICAgIEBoYW5kbGUKLSAgICAgIHJlc2N1ZSBTdGFuZGFyZEVycm9yID0+IGUKLSAgICAgICAgcmFpc2UgVHJhbnNwb3J0RXhjZXB0aW9uLm5ldyhUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQ291bGQgbm90IGNvbm5lY3QgdG8gI3tAZGVzY306ICN7ZX0iKQogICAgICAgZW5kCisgICAgICByYWlzZSBUcmFuc3BvcnRFeGNlcHRpb24ubmV3KFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDb3VsZCBub3QgY29ubmVjdCB0byAje0BkZXNjfTogI3tlfSIpCiAgICAgZW5kCiAKICAgICBkZWYgb3Blbj8KQEAgLTEzMiw4ICsxMzQsMTAgQEAKICAgICAgIEBoYW5kbGUgPSBuaWwKICAgICBlbmQKIAotICAgIGRlZiB0b19pbwotICAgICAgQGhhbmRsZQorICAgIGFsaWFzIHRvX2lvIGhhbmRsZQorCisgICAgZGVmIHRvX3MKKyAgICAgICJzb2NrZXQoI3tAaG9zdH06I3tAcG9ydH0pIgogICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L3NzbF9zZXJ2ZXJfc29ja2V0LnJiIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L3NzbF9zZXJ2ZXJfc29ja2V0LnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhYmQ1ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvc3NsX3NlcnZlcl9zb2NrZXQucmIKQEAgLTAsMCArMSw0MSBAQAorIyBlbmNvZGluZzogYXNjaWktOGJpdAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3JlcXVpcmUgJ3NvY2tldCcKKworbW9kdWxlIFRocmlmdAorICBjbGFzcyBTU0xTZXJ2ZXJTb2NrZXQgPCBTZXJ2ZXJTb2NrZXQKKyAgICBkZWYgaW5pdGlhbGl6ZShob3N0X29yX3BvcnQsIHBvcnQgPSBuaWwsIHNzbF9jb250ZXh0ID0gbmlsKQorICAgICAgc3VwZXIoaG9zdF9vcl9wb3J0LCBwb3J0KQorICAgICAgQHNzbF9jb250ZXh0ID0gc3NsX2NvbnRleHQKKyAgICBlbmQKKworICAgIGF0dHJfYWNjZXNzb3IgOnNzbF9jb250ZXh0CisKKyAgICBkZWYgbGlzdGVuCisgICAgICBzb2NrZXQgPSBUQ1BTZXJ2ZXIubmV3KEBob3N0LCBAcG9ydCkKKyAgICAgIEBoYW5kbGUgPSBPcGVuU1NMOjpTU0w6OlNTTFNlcnZlci5uZXcoc29ja2V0LCBAc3NsX2NvbnRleHQpCisgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICJzc2woI3tzdXBlci50b19zfSkiCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvc3NsX3NvY2tldC5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9zc2xfc29ja2V0LnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhYjk2YWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvc3NsX3NvY2tldC5yYgpAQCAtMCwwICsxLDUxIEBACisjIGVuY29kaW5nOiBhc2NpaS04Yml0CisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKworbW9kdWxlIFRocmlmdAorICBjbGFzcyBTU0xTb2NrZXQgPCBTb2NrZXQKKyAgICBkZWYgaW5pdGlhbGl6ZShob3N0PSdsb2NhbGhvc3QnLCBwb3J0PTkwOTAsIHRpbWVvdXQ9bmlsLCBzc2xfY29udGV4dD1uaWwpCisgICAgICBzdXBlcihob3N0LCBwb3J0LCB0aW1lb3V0KQorICAgICAgQHNzbF9jb250ZXh0ID0gc3NsX2NvbnRleHQKKyAgICBlbmQKKworICAgIGF0dHJfYWNjZXNzb3IgOnNzbF9jb250ZXh0CisKKyAgICBkZWYgb3BlbgorICAgICAgc29ja2V0ID0gc3VwZXIKKyAgICAgIEBoYW5kbGUgPSBPcGVuU1NMOjpTU0w6OlNTTFNvY2tldC5uZXcoc29ja2V0LCBAc3NsX2NvbnRleHQpCisgICAgICBiZWdpbgorICAgICAgICBAaGFuZGxlLmNvbm5lY3Rfbm9uYmxvY2sKKyAgICAgICAgQGhhbmRsZS5wb3N0X2Nvbm5lY3Rpb25fY2hlY2soQGhvc3QpCisgICAgICAgIEBoYW5kbGUKKyAgICAgIHJlc2N1ZSBJTzo6V2FpdFJlYWRhYmxlCisgICAgICAgIElPLnNlbGVjdChbIEBoYW5kbGUgXSwgbmlsLCBuaWwsIEB0aW1lb3V0KQorICAgICAgICByZXRyeQorICAgICAgcmVzY3VlIElPOjpXYWl0V3JpdGFibGUKKyAgICAgICAgSU8uc2VsZWN0KG5pbCwgWyBAaGFuZGxlIF0sIG5pbCwgQHRpbWVvdXQpCisgICAgICAgIHJldHJ5CisgICAgICByZXNjdWUgU3RhbmRhcmRFcnJvciA9PiBlCisgICAgICAgIHJhaXNlIFRyYW5zcG9ydEV4Y2VwdGlvbi5uZXcoVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkNvdWxkIG5vdCBjb25uZWN0IHRvICN7QGRlc2N9OiAje2V9IikKKyAgICAgIGVuZAorICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICAic3NsKCN7c3VwZXIudG9fc30pIgorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L3VuaXhfc2VydmVyX3NvY2tldC5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC91bml4X3NlcnZlcl9zb2NrZXQucmIKaW5kZXggYTEzNWQyNS4uMDU3ZDEyMiAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L3VuaXhfc2VydmVyX3NvY2tldC5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvdW5peF9zZXJ2ZXJfc29ja2V0LnJiCkBAIC01Niw1ICs1Niw5IEBACiAgICAgZW5kCiAKICAgICBhbGlhcyB0b19pbyBoYW5kbGUKKworICAgIGRlZiB0b19zCisgICAgICAiZG9tYWluKCN7QHBhdGh9KSIKKyAgICBlbmQKICAgZW5kCi1lbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC91bml4X3NvY2tldC5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC91bml4X3NvY2tldC5yYgppbmRleCA4ZjY5MmU0Li41ZGZmZDU5IDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvdW5peF9zb2NrZXQucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L3VuaXhfc29ja2V0LnJiCkBAIC0zNiw1ICszNiw5IEBACiAgICAgICAgIHJhaXNlIFRyYW5zcG9ydEV4Y2VwdGlvbi5uZXcoVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkNvdWxkIG5vdCBvcGVuIFVOSVggc29ja2V0IGF0ICN7QHBhdGh9IikKICAgICAgIGVuZAogICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICAiZG9tYWluKCN7QHBhdGh9KSIKKyAgICBlbmQKICAgZW5kCi1lbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL2Jhc2VfcHJvdG9jb2xfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL2Jhc2VfcHJvdG9jb2xfc3BlYy5yYgppbmRleCBlYzUwYzQ4Li5lY2E5MzZiIDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy9iYXNlX3Byb3RvY29sX3NwZWMucmIKKysrIGIvbGliL3JiL3NwZWMvYmFzZV9wcm90b2NvbF9zcGVjLnJiCkBAIC0yMiw0MSArMjIsNDYgQEAKIGRlc2NyaWJlICdCYXNlUHJvdG9jb2wnIGRvCiAKICAgYmVmb3JlKDplYWNoKSBkbwotICAgIEB0cmFucyA9IG1vY2soIk1vY2tUcmFuc3BvcnQiKQorICAgIEB0cmFucyA9IGRvdWJsZSgiTW9ja1RyYW5zcG9ydCIpCiAgICAgQHByb3QgPSBUaHJpZnQ6OkJhc2VQcm90b2NvbC5uZXcoQHRyYW5zKQogICBlbmQKIAogICBkZXNjcmliZSBUaHJpZnQ6OkJhc2VQcm90b2NvbCBkbwogICAgICMgbW9zdCBvZiB0aGUgbWV0aG9kcyBhcmUgc3R1YnMsIHNvIHdlIGNhbiBpZ25vcmUgdGhlbQogCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6dG9fcykub25jZS5hbmRfcmV0dXJuKCJ0cmFucyIpCisgICAgICBleHBlY3QoQHByb3QudG9fcykudG8gZXEoInRyYW5zIikKKyAgICBlbmQKKwogICAgIGl0ICJzaG91bGQgbWFrZSB0cmFucyBhY2Nlc3NpYmxlIiBkbwotICAgICAgQHByb3QudHJhbnMuc2hvdWxkIGVxbChAdHJhbnMpCisgICAgICBleHBlY3QoQHByb3QudHJhbnMpLnRvIGVxbChAdHJhbnMpCiAgICAgZW5kCiAKICAgICBpdCAnc2hvdWxkIHdyaXRlIG91dCBhIGZpZWxkIG5pY2VseSAoZGVwcmVjYXRlZCB3cml0ZV9maWVsZCBzaWduYXR1cmUpJyBkbwotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdmaWVsZCcsICd0eXBlJywgJ2ZpZCcpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV90eXBlKS53aXRoKHs6bmFtZSA9PiAnZmllbGQnLCA6dHlwZSA9PiAndHlwZSd9LCAndmFsdWUnKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfZW5kKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdmaWVsZCcsICd0eXBlJywgJ2ZpZCcpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfdHlwZSkud2l0aCh7Om5hbWUgPT4gJ2ZpZWxkJywgOnR5cGUgPT4gJ3R5cGUnfSwgJ3ZhbHVlJykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9lbmQpLm9yZGVyZWQKICAgICAgIEBwcm90LndyaXRlX2ZpZWxkKCdmaWVsZCcsICd0eXBlJywgJ2ZpZCcsICd2YWx1ZScpCiAgICAgZW5kCiAKICAgICBpdCAnc2hvdWxkIHdyaXRlIG91dCBhIGZpZWxkIG5pY2VseScgZG8KLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnZmllbGQnLCAndHlwZScsICdmaWQnKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfdHlwZSkud2l0aCh7Om5hbWUgPT4gJ2ZpZWxkJywgOnR5cGUgPT4gJ3R5cGUnLCA6YmluYXJ5ID0+IGZhbHNlfSwgJ3ZhbHVlJykub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2VuZCkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnZmllbGQnLCAndHlwZScsICdmaWQnKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3R5cGUpLndpdGgoezpuYW1lID0+ICdmaWVsZCcsIDp0eXBlID0+ICd0eXBlJywgOmJpbmFyeSA9PiBmYWxzZX0sICd2YWx1ZScpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfZW5kKS5vcmRlcmVkCiAgICAgICBAcHJvdC53cml0ZV9maWVsZCh7Om5hbWUgPT4gJ2ZpZWxkJywgOnR5cGUgPT4gJ3R5cGUnLCA6YmluYXJ5ID0+IGZhbHNlfSwgJ2ZpZCcsICd2YWx1ZScpCiAgICAgZW5kCiAKICAgICBpdCAnc2hvdWxkIHdyaXRlIG91dCB0aGUgZGlmZmVyZW50IHR5cGVzIChkZXByZWNhdGVkIHdyaXRlX3R5cGUgc2lnbmF0dXJlKScgZG8KLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9ib29sKS53aXRoKCdib29sJykub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2J5dGUpLndpdGgoJ2J5dGUnKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZG91YmxlKS53aXRoKCdkb3VibGUnKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfaTE2KS53aXRoKCdpMTYnKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfaTMyKS53aXRoKCdpMzInKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfaTY0KS53aXRoKCdpNjQnKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCdzdHJpbmcnKS5vcmRlcmVkCi0gICAgICBzdHJ1Y3QgPSBtb2NrKCdTdHJ1Y3QnKQotICAgICAgc3RydWN0LnNob3VsZF9yZWNlaXZlKDp3cml0ZSkud2l0aChAcHJvdCkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9ib29sKS53aXRoKCdib29sJykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9ieXRlKS53aXRoKCdieXRlJykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9kb3VibGUpLndpdGgoJ2RvdWJsZScpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfaTE2KS53aXRoKCdpMTYnKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2kzMikud2l0aCgnaTMyJykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9pNjQpLndpdGgoJ2k2NCcpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCdzdHJpbmcnKS5vcmRlcmVkCisgICAgICBzdHJ1Y3QgPSBkb3VibGUoJ1N0cnVjdCcpCisgICAgICBleHBlY3Qoc3RydWN0KS50byByZWNlaXZlKDp3cml0ZSkud2l0aChAcHJvdCkub3JkZXJlZAogICAgICAgQHByb3Qud3JpdGVfdHlwZShUaHJpZnQ6OlR5cGVzOjpCT09MLCAnYm9vbCcpCiAgICAgICBAcHJvdC53cml0ZV90eXBlKFRocmlmdDo6VHlwZXM6OkJZVEUsICdieXRlJykKICAgICAgIEBwcm90LndyaXRlX3R5cGUoVGhyaWZ0OjpUeXBlczo6RE9VQkxFLCAnZG91YmxlJykKQEAgLTcyLDE2ICs3NywxNiBAQAogICAgIGVuZAogCiAgICAgaXQgJ3Nob3VsZCB3cml0ZSBvdXQgdGhlIGRpZmZlcmVudCB0eXBlcycgZG8KLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9ib29sKS53aXRoKCdib29sJykub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2J5dGUpLndpdGgoJ2J5dGUnKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZG91YmxlKS53aXRoKCdkb3VibGUnKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfaTE2KS53aXRoKCdpMTYnKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfaTMyKS53aXRoKCdpMzInKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfaTY0KS53aXRoKCdpNjQnKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCdzdHJpbmcnKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfYmluYXJ5KS53aXRoKCdiaW5hcnknKS5vcmRlcmVkCi0gICAgICBzdHJ1Y3QgPSBtb2NrKCdTdHJ1Y3QnKQotICAgICAgc3RydWN0LnNob3VsZF9yZWNlaXZlKDp3cml0ZSkud2l0aChAcHJvdCkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9ib29sKS53aXRoKCdib29sJykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9ieXRlKS53aXRoKCdieXRlJykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9kb3VibGUpLndpdGgoJ2RvdWJsZScpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfaTE2KS53aXRoKCdpMTYnKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2kzMikud2l0aCgnaTMyJykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9pNjQpLndpdGgoJ2k2NCcpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCdzdHJpbmcnKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2JpbmFyeSkud2l0aCgnYmluYXJ5Jykub3JkZXJlZAorICAgICAgc3RydWN0ID0gZG91YmxlKCdTdHJ1Y3QnKQorICAgICAgZXhwZWN0KHN0cnVjdCkudG8gcmVjZWl2ZSg6d3JpdGUpLndpdGgoQHByb3QpLm9yZGVyZWQKICAgICAgIEBwcm90LndyaXRlX3R5cGUoezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkJPT0x9LCAnYm9vbCcpCiAgICAgICBAcHJvdC53cml0ZV90eXBlKHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpCWVRFfSwgJ2J5dGUnKQogICAgICAgQHByb3Qud3JpdGVfdHlwZSh7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6RE9VQkxFfSwgJ2RvdWJsZScpCkBAIC05OCwxMyArMTAzLDEzIEBACiAgICAgZW5kCiAKICAgICBpdCAnc2hvdWxkIHJlYWQgdGhlIGRpZmZlcmVudCB0eXBlcyAoZGVwcmVjYXRlZCByZWFkX3R5cGUgc2lnbmF0dXJlKScgZG8KLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2Jvb2wpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2J5dGUpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2kxNikub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfaTMyKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9pNjQpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2RvdWJsZSkub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RyaW5nKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfYm9vbCkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2J5dGUpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9pMTYpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9pMzIpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9pNjQpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9kb3VibGUpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJpbmcpLm9yZGVyZWQKICAgICAgIEBwcm90LnJlYWRfdHlwZShUaHJpZnQ6OlR5cGVzOjpCT09MKQogICAgICAgQHByb3QucmVhZF90eXBlKFRocmlmdDo6VHlwZXM6OkJZVEUpCiAgICAgICBAcHJvdC5yZWFkX3R5cGUoVGhyaWZ0OjpUeXBlczo6STE2KQpAQCAtMTIwLDE0ICsxMjUsMTQgQEAKICAgICBlbmQKIAogICAgIGl0ICdzaG91bGQgcmVhZCB0aGUgZGlmZmVyZW50IHR5cGVzJyBkbwotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfYm9vbCkub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfYnl0ZSkub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfaTE2KS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9pMzIpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2k2NCkub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfZG91YmxlKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJpbmcpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2JpbmFyeSkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2Jvb2wpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9ieXRlKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfaTE2KS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfaTMyKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfaTY0KS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfZG91YmxlKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RyaW5nKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfYmluYXJ5KS5vcmRlcmVkCiAgICAgICBAcHJvdC5yZWFkX3R5cGUoezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkJPT0x9KQogICAgICAgQHByb3QucmVhZF90eXBlKHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpCWVRFfSkKICAgICAgIEBwcm90LnJlYWRfdHlwZSh7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STE2fSkKQEAgLTE0NCwxMyArMTQ5LDEzIEBACiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHNraXAgdGhlIGJhc2ljIHR5cGVzIiBkbwotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfYm9vbCkub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfYnl0ZSkub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfaTE2KS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9pMzIpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2k2NCkub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfZG91YmxlKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJpbmcpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9ib29sKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfYnl0ZSkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2kxNikub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2kzMikub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2k2NCkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2RvdWJsZSkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cmluZykub3JkZXJlZAogICAgICAgQHByb3Quc2tpcChUaHJpZnQ6OlR5cGVzOjpCT09MKQogICAgICAgQHByb3Quc2tpcChUaHJpZnQ6OlR5cGVzOjpCWVRFKQogICAgICAgQHByb3Quc2tpcChUaHJpZnQ6OlR5cGVzOjpJMTYpCkBAIC0xNjMsNDcgKzE2OCw0NyBAQAogCiAgICAgaXQgInNob3VsZCBza2lwIHN0cnVjdHMiIGRvCiAgICAgICByZWFsX3NraXAgPSBAcHJvdC5tZXRob2QoOnNraXApCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfYmVnaW4pLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2ZpZWxkX2JlZ2luKS5leGFjdGx5KDQpLnRpbWVzLmFuZF9yZXR1cm4oCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RydWN0X2JlZ2luKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfZmllbGRfYmVnaW4pLmV4YWN0bHkoNCkudGltZXMuYW5kX3JldHVybigKICAgICAgICAgWydmaWVsZCAxJywgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAxXSwKICAgICAgICAgWydmaWVsZCAyJywgVGhyaWZ0OjpUeXBlczo6STMyLCAyXSwKICAgICAgICAgWydmaWVsZCAzJywgVGhyaWZ0OjpUeXBlczo6TUFQLCAzXSwKICAgICAgICAgW25pbCwgVGhyaWZ0OjpUeXBlczo6U1RPUCwgMF0KICAgICAgICkKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2ZpZWxkX2VuZCkuZXhhY3RseSgzKS50aW1lcwotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RyaW5nKS5leGFjdGx5KDMpLnRpbWVzCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9pMzIpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX21hcF9iZWdpbikub3JkZXJlZC5hbmRfcmV0dXJuKFtUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIFRocmlmdDo6VHlwZXM6OlNUUklORywgMV0pCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfZmllbGRfZW5kKS5leGFjdGx5KDMpLnRpbWVzCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RyaW5nKS5leGFjdGx5KDMpLnRpbWVzCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfaTMyKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfbWFwX2JlZ2luKS5vcmRlcmVkLmFuZF9yZXR1cm4oW1RocmlmdDo6VHlwZXM6OlNUUklORywgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAxXSkKICAgICAgICMgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RyaW5nKS5leGFjdGx5KDIpLnRpbWVzCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9tYXBfZW5kKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfZW5kKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfbWFwX2VuZCkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cnVjdF9lbmQpLm9yZGVyZWQKICAgICAgIHJlYWxfc2tpcC5jYWxsKFRocmlmdDo6VHlwZXM6OlNUUlVDVCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgc2tpcCBtYXBzIiBkbwogICAgICAgcmVhbF9za2lwID0gQHByb3QubWV0aG9kKDpza2lwKQotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbWFwX2JlZ2luKS5vcmRlcmVkLmFuZF9yZXR1cm4oW1RocmlmdDo6VHlwZXM6OlNUUklORywgVGhyaWZ0OjpUeXBlczo6U1RSVUNULCAxXSkKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cmluZykub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RydWN0X2JlZ2luKS5vcmRlcmVkLmFuZF9yZXR1cm4oWyJzb21lX3N0cnVjdCJdKQotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfZmllbGRfYmVnaW4pLm9yZGVyZWQuYW5kX3JldHVybihbbmlsLCBUaHJpZnQ6OlR5cGVzOjpTVE9QLCBuaWxdKTsKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cnVjdF9lbmQpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX21hcF9lbmQpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9tYXBfYmVnaW4pLm9yZGVyZWQuYW5kX3JldHVybihbVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCBUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QsIDFdKQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cmluZykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cnVjdF9iZWdpbikub3JkZXJlZC5hbmRfcmV0dXJuKFsic29tZV9zdHJ1Y3QiXSkKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9maWVsZF9iZWdpbikub3JkZXJlZC5hbmRfcmV0dXJuKFtuaWwsIFRocmlmdDo6VHlwZXM6OlNUT1AsIG5pbF0pOworICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cnVjdF9lbmQpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9tYXBfZW5kKS5vcmRlcmVkCiAgICAgICByZWFsX3NraXAuY2FsbChUaHJpZnQ6OlR5cGVzOjpNQVApCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHNraXAgc2V0cyIgZG8KICAgICAgIHJlYWxfc2tpcCA9IEBwcm90Lm1ldGhvZCg6c2tpcCkKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3NldF9iZWdpbikub3JkZXJlZC5hbmRfcmV0dXJuKFtUaHJpZnQ6OlR5cGVzOjpJNjQsIDldKQotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfaTY0KS5vcmRlcmVkLmV4YWN0bHkoOSkudGltZXMKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3NldF9lbmQpCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc2V0X2JlZ2luKS5vcmRlcmVkLmFuZF9yZXR1cm4oW1RocmlmdDo6VHlwZXM6Okk2NCwgOV0pCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfaTY0KS5vcmRlcmVkLmV4YWN0bHkoOSkudGltZXMKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zZXRfZW5kKQogICAgICAgcmVhbF9za2lwLmNhbGwoVGhyaWZ0OjpUeXBlczo6U0VUKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBza2lwIGxpc3RzIiBkbwogICAgICAgcmVhbF9za2lwID0gQHByb3QubWV0aG9kKDpza2lwKQotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbGlzdF9iZWdpbikub3JkZXJlZC5hbmRfcmV0dXJuKFtUaHJpZnQ6OlR5cGVzOjpET1VCTEUsIDExXSkKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2RvdWJsZSkub3JkZXJlZC5leGFjdGx5KDExKS50aW1lcwotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbGlzdF9lbmQpCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfbGlzdF9iZWdpbikub3JkZXJlZC5hbmRfcmV0dXJuKFtUaHJpZnQ6OlR5cGVzOjpET1VCTEUsIDExXSkKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9kb3VibGUpLm9yZGVyZWQuZXhhY3RseSgxMSkudGltZXMKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9saXN0X2VuZCkKICAgICAgIHJlYWxfc2tpcC5jYWxsKFRocmlmdDo6VHlwZXM6OkxJU1QpCiAgICAgZW5kCiAgIGVuZApAQCAtMjExLDcgKzIxNiwxMSBAQAogICBkZXNjcmliZSBUaHJpZnQ6OkJhc2VQcm90b2NvbEZhY3RvcnkgZG8KICAgICBpdCAic2hvdWxkIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IiIGRvCiAgICAgICAjIHJldHVybmluZyBuaWwgc2luY2UgUHJvdG9jb2wgaXMganVzdCBhbiBhYnN0cmFjdCBjbGFzcwotICAgICAgbGFtYmRhIHtUaHJpZnQ6OkJhc2VQcm90b2NvbEZhY3RvcnkubmV3LmdldF9wcm90b2NvbChtb2NrKCJNb2NrVHJhbnNwb3J0IikpfS5zaG91bGQgcmFpc2VfZXJyb3IoTm90SW1wbGVtZW50ZWRFcnJvcikKKyAgICAgIGV4cGVjdCB7VGhyaWZ0OjpCYXNlUHJvdG9jb2xGYWN0b3J5Lm5ldy5nZXRfcHJvdG9jb2woZG91YmxlKCJNb2NrVHJhbnNwb3J0IikpfS50byByYWlzZV9lcnJvcihOb3RJbXBsZW1lbnRlZEVycm9yKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KFRocmlmdDo6QmFzZVByb3RvY29sRmFjdG9yeS5uZXcudG9fcykudG8gZXEoImJhc2UiKQogICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvYmFzZV90cmFuc3BvcnRfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL2Jhc2VfdHJhbnNwb3J0X3NwZWMucmIKaW5kZXggNDE5NjU3Mi4uZDJmNjBhYSAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvYmFzZV90cmFuc3BvcnRfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy9iYXNlX3RyYW5zcG9ydF9zcGVjLnJiCkBAIC0yNCwxMDUgKzI0LDExOSBAQAogICBkZXNjcmliZSBUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbiBkbwogICAgIGl0ICJzaG91bGQgbWFrZSB0eXBlIGFjY2Vzc2libGUiIGRvCiAgICAgICBleGMgPSBUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbi5uZXcoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb246OkFMUkVBRFlfT1BFTiwgIm1zZyIpCi0gICAgICBleGMudHlwZS5zaG91bGQgPT0gVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb246OkFMUkVBRFlfT1BFTgotICAgICAgZXhjLm1lc3NhZ2Uuc2hvdWxkID09ICJtc2ciCisgICAgICBleHBlY3QoZXhjLnR5cGUpLnRvIGVxKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uOjpBTFJFQURZX09QRU4pCisgICAgICBleHBlY3QoZXhjLm1lc3NhZ2UpLnRvIGVxKCJtc2ciKQogICAgIGVuZAogICBlbmQKIAogICBkZXNjcmliZSBUaHJpZnQ6OkJhc2VUcmFuc3BvcnQgZG8KICAgICBpdCAic2hvdWxkIHJlYWQgdGhlIHNwZWNpZmllZCBzaXplIiBkbwogICAgICAgdHJhbnNwb3J0ID0gVGhyaWZ0OjpCYXNlVHJhbnNwb3J0Lm5ldwotICAgICAgdHJhbnNwb3J0LnNob3VsZF9yZWNlaXZlKDpyZWFkKS53aXRoKDQwKS5vcmRlcmVkLmFuZF9yZXR1cm4oIjEwIGxldHRlcnMiKQotICAgICAgdHJhbnNwb3J0LnNob3VsZF9yZWNlaXZlKDpyZWFkKS53aXRoKDMwKS5vcmRlcmVkLmFuZF9yZXR1cm4oImZpZnRlZW4gbGV0dGVycyIpCi0gICAgICB0cmFuc3BvcnQuc2hvdWxkX3JlY2VpdmUoOnJlYWQpLndpdGgoMTUpLm9yZGVyZWQuYW5kX3JldHVybigibW9yZSBjaGFyYWN0ZXJzIikKLSAgICAgIHRyYW5zcG9ydC5yZWFkX2FsbCg0MCkuc2hvdWxkID09ICIxMCBsZXR0ZXJzZmlmdGVlbiBsZXR0ZXJzbW9yZSBjaGFyYWN0ZXJzIgorICAgICAgZXhwZWN0KHRyYW5zcG9ydCkudG8gcmVjZWl2ZSg6cmVhZCkud2l0aCg0MCkub3JkZXJlZC5hbmRfcmV0dXJuKCIxMCBsZXR0ZXJzIikKKyAgICAgIGV4cGVjdCh0cmFuc3BvcnQpLnRvIHJlY2VpdmUoOnJlYWQpLndpdGgoMzApLm9yZGVyZWQuYW5kX3JldHVybigiZmlmdGVlbiBsZXR0ZXJzIikKKyAgICAgIGV4cGVjdCh0cmFuc3BvcnQpLnRvIHJlY2VpdmUoOnJlYWQpLndpdGgoMTUpLm9yZGVyZWQuYW5kX3JldHVybigibW9yZSBjaGFyYWN0ZXJzIikKKyAgICAgIGV4cGVjdCh0cmFuc3BvcnQucmVhZF9hbGwoNDApKS50byBlcSgiMTAgbGV0dGVyc2ZpZnRlZW4gbGV0dGVyc21vcmUgY2hhcmFjdGVycyIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHN0dWIgb3V0IHRoZSByZXN0IG9mIHRoZSBtZXRob2RzIiBkbwogICAgICAgIyBjYW4ndCB0ZXN0IGZvciBzdHViYmluZXNzLCBzbyBqdXN0IG1ha2Ugc3VyZSB0aGV5J3JlIGRlZmluZWQKICAgICAgIFs6b3Blbj8sIDpvcGVuLCA6Y2xvc2UsIDpyZWFkLCA6d3JpdGUsIDpmbHVzaF0uZWFjaCBkbyB8c3ltfAotICAgICAgICBUaHJpZnQ6OkJhc2VUcmFuc3BvcnQubWV0aG9kX2RlZmluZWQ/KHN5bSkuc2hvdWxkIGJlX3RydWUKKyAgICAgICAgZXhwZWN0KFRocmlmdDo6QmFzZVRyYW5zcG9ydC5tZXRob2RfZGVmaW5lZD8oc3ltKSkudG8gYmVfdHJ1dGh5CiAgICAgICBlbmQKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgYWxpYXMgPDwgdG8gd3JpdGUiIGRvCi0gICAgICBUaHJpZnQ6OkJhc2VUcmFuc3BvcnQuaW5zdGFuY2VfbWV0aG9kKDo8PCkuc2hvdWxkID09IFRocmlmdDo6QmFzZVRyYW5zcG9ydC5pbnN0YW5jZV9tZXRob2QoOndyaXRlKQorICAgICAgZXhwZWN0KFRocmlmdDo6QmFzZVRyYW5zcG9ydC5pbnN0YW5jZV9tZXRob2QoOjw8KSkudG8gZXEoVGhyaWZ0OjpCYXNlVHJhbnNwb3J0Lmluc3RhbmNlX21ldGhvZCg6d3JpdGUpKQorICAgIGVuZAorICAgIAorICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChUaHJpZnQ6OkJhc2VUcmFuc3BvcnQubmV3LnRvX3MpLnRvIGVxKCJiYXNlIikKICAgICBlbmQKICAgZW5kCiAKICAgZGVzY3JpYmUgVGhyaWZ0OjpCYXNlU2VydmVyVHJhbnNwb3J0IGRvCiAgICAgaXQgInNob3VsZCBzdHViIG91dCBpdHMgbWV0aG9kcyIgZG8KICAgICAgIFs6bGlzdGVuLCA6YWNjZXB0LCA6Y2xvc2VdLmVhY2ggZG8gfHN5bXwKLSAgICAgICAgVGhyaWZ0OjpCYXNlU2VydmVyVHJhbnNwb3J0Lm1ldGhvZF9kZWZpbmVkPyhzeW0pLnNob3VsZCBiZV90cnVlCisgICAgICAgIGV4cGVjdChUaHJpZnQ6OkJhc2VTZXJ2ZXJUcmFuc3BvcnQubWV0aG9kX2RlZmluZWQ/KHN5bSkpLnRvIGJlX3RydXRoeQogICAgICAgZW5kCiAgICAgZW5kCiAgIGVuZAogCiAgIGRlc2NyaWJlIFRocmlmdDo6QmFzZVRyYW5zcG9ydEZhY3RvcnkgZG8KICAgICBpdCAic2hvdWxkIHJldHVybiB0aGUgdHJhbnNwb3J0IGl0J3MgZ2l2ZW4iIGRvCi0gICAgICB0cmFuc3BvcnQgPSBtb2NrKCJUcmFuc3BvcnQiKQotICAgICAgVGhyaWZ0OjpCYXNlVHJhbnNwb3J0RmFjdG9yeS5uZXcuZ2V0X3RyYW5zcG9ydCh0cmFuc3BvcnQpLnNob3VsZCBlcWwodHJhbnNwb3J0KQorICAgICAgdHJhbnNwb3J0ID0gZG91YmxlKCJUcmFuc3BvcnQiKQorICAgICAgZXhwZWN0KFRocmlmdDo6QmFzZVRyYW5zcG9ydEZhY3RvcnkubmV3LmdldF90cmFuc3BvcnQodHJhbnNwb3J0KSkudG8gZXFsKHRyYW5zcG9ydCkKKyAgICBlbmQKKyAgICAKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBleHBlY3QoVGhyaWZ0OjpCYXNlVHJhbnNwb3J0RmFjdG9yeS5uZXcudG9fcykudG8gZXEoImJhc2UiKQogICAgIGVuZAogICBlbmQKIAogICBkZXNjcmliZSBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0IGRvCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgdG9fcyB0aGF0IGRlc2NyaWJlcyB0aGUgZW5jYXBzdWxhdGlvbiIgZG8KKyAgICAgIHRyYW5zID0gZG91YmxlKCJUcmFuc3BvcnQiKQorICAgICAgZXhwZWN0KHRyYW5zKS50byByZWNlaXZlKDp0b19zKS5hbmRfcmV0dXJuKCJtb2NrIikKKyAgICAgIGV4cGVjdChUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0Lm5ldyh0cmFucykudG9fcykudG8gZXEoImJ1ZmZlcmVkKG1vY2spIikKKyAgICBlbmQKKwogICAgIGl0ICJzaG91bGQgcGFzcyB0aHJvdWdoIGV2ZXJ5dGhpbmcgYnV0IHdyaXRlL2ZsdXNoL3JlYWQiIGRvCi0gICAgICB0cmFucyA9IG1vY2soIlRyYW5zcG9ydCIpCi0gICAgICB0cmFucy5zaG91bGRfcmVjZWl2ZSg6b3Blbj8pLm9yZGVyZWQuYW5kX3JldHVybigiKyBvcGVuPyIpCi0gICAgICB0cmFucy5zaG91bGRfcmVjZWl2ZSg6b3Blbikub3JkZXJlZC5hbmRfcmV0dXJuKCIrIG9wZW4iKQotICAgICAgdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmZsdXNoKS5vcmRlcmVkICMgZnJvbSB0aGUgY2xvc2UKLSAgICAgIHRyYW5zLnNob3VsZF9yZWNlaXZlKDpjbG9zZSkub3JkZXJlZC5hbmRfcmV0dXJuKCIrIGNsb3NlIikKKyAgICAgIHRyYW5zID0gZG91YmxlKCJUcmFuc3BvcnQiKQorICAgICAgZXhwZWN0KHRyYW5zKS50byByZWNlaXZlKDpvcGVuPykub3JkZXJlZC5hbmRfcmV0dXJuKCIrIG9wZW4/IikKKyAgICAgIGV4cGVjdCh0cmFucykudG8gcmVjZWl2ZSg6b3Blbikub3JkZXJlZC5hbmRfcmV0dXJuKCIrIG9wZW4iKQorICAgICAgZXhwZWN0KHRyYW5zKS50byByZWNlaXZlKDpmbHVzaCkub3JkZXJlZCAjIGZyb20gdGhlIGNsb3NlCisgICAgICBleHBlY3QodHJhbnMpLnRvIHJlY2VpdmUoOmNsb3NlKS5vcmRlcmVkLmFuZF9yZXR1cm4oIisgY2xvc2UiKQogICAgICAgYnRyYW5zID0gVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydC5uZXcodHJhbnMpCi0gICAgICBidHJhbnMub3Blbj8uc2hvdWxkID09ICIrIG9wZW4/IgotICAgICAgYnRyYW5zLm9wZW4uc2hvdWxkID09ICIrIG9wZW4iCi0gICAgICBidHJhbnMuY2xvc2Uuc2hvdWxkID09ICIrIGNsb3NlIgorICAgICAgZXhwZWN0KGJ0cmFucy5vcGVuPykudG8gZXEoIisgb3Blbj8iKQorICAgICAgZXhwZWN0KGJ0cmFucy5vcGVuKS50byBlcSgiKyBvcGVuIikKKyAgICAgIGV4cGVjdChidHJhbnMuY2xvc2UpLnRvIGVxKCIrIGNsb3NlIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgYnVmZmVyIHJlYWRzIGluIGNodW5rcyBvZiAje1RocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQ6OkRFRkFVTFRfQlVGRkVSfSIgZG8KLSAgICAgIHRyYW5zID0gbW9jaygiVHJhbnNwb3J0IikKLSAgICAgIHRyYW5zLnNob3VsZF9yZWNlaXZlKDpyZWFkKS53aXRoKFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQ6OkRFRkFVTFRfQlVGRkVSKS5hbmRfcmV0dXJuKCJsb3J1bSBpcHN1bSBkb2xvciBlbWV0IikKKyAgICAgIHRyYW5zID0gZG91YmxlKCJUcmFuc3BvcnQiKQorICAgICAgZXhwZWN0KHRyYW5zKS50byByZWNlaXZlKDpyZWFkKS53aXRoKFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQ6OkRFRkFVTFRfQlVGRkVSKS5hbmRfcmV0dXJuKCJsb3J1bSBpcHN1bSBkb2xvciBlbWV0IikKICAgICAgIGJ0cmFucyA9IFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQubmV3KHRyYW5zKQotICAgICAgYnRyYW5zLnJlYWQoNikuc2hvdWxkID09ICJsb3J1bSAiCi0gICAgICBidHJhbnMucmVhZCg2KS5zaG91bGQgPT0gImlwc3VtICIKLSAgICAgIGJ0cmFucy5yZWFkKDYpLnNob3VsZCA9PSAiZG9sb3IgIgotICAgICAgYnRyYW5zLnJlYWQoNikuc2hvdWxkID09ICJlbWV0IgorICAgICAgZXhwZWN0KGJ0cmFucy5yZWFkKDYpKS50byBlcSgibG9ydW0gIikKKyAgICAgIGV4cGVjdChidHJhbnMucmVhZCg2KSkudG8gZXEoImlwc3VtICIpCisgICAgICBleHBlY3QoYnRyYW5zLnJlYWQoNikpLnRvIGVxKCJkb2xvciAiKQorICAgICAgZXhwZWN0KGJ0cmFucy5yZWFkKDYpKS50byBlcSgiZW1ldCIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGJ1ZmZlciB3cml0ZXMgYW5kIHNlbmQgdGhlbSBvbiBmbHVzaCIgZG8KLSAgICAgIHRyYW5zID0gbW9jaygiVHJhbnNwb3J0IikKKyAgICAgIHRyYW5zID0gZG91YmxlKCJUcmFuc3BvcnQiKQogICAgICAgYnRyYW5zID0gVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydC5uZXcodHJhbnMpCiAgICAgICBidHJhbnMud3JpdGUoIm9uZS8iKQogICAgICAgYnRyYW5zLndyaXRlKCJ0d28vIikKICAgICAgIGJ0cmFucy53cml0ZSgidGhyZWUvIikKLSAgICAgIHRyYW5zLnNob3VsZF9yZWNlaXZlKDp3cml0ZSkud2l0aCgib25lL3R3by90aHJlZS8iKS5vcmRlcmVkCi0gICAgICB0cmFucy5zaG91bGRfcmVjZWl2ZSg6Zmx1c2gpLm9yZGVyZWQKKyAgICAgIGV4cGVjdCh0cmFucykudG8gcmVjZWl2ZSg6d3JpdGUpLndpdGgoIm9uZS90d28vdGhyZWUvIikub3JkZXJlZAorICAgICAgZXhwZWN0KHRyYW5zKS50byByZWNlaXZlKDpmbHVzaCkub3JkZXJlZAogICAgICAgYnRyYW5zLmZsdXNoCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIG9ubHkgc2VuZCBidWZmZXJlZCBkYXRhIG9uY2UiIGRvCi0gICAgICB0cmFucyA9IG1vY2soIlRyYW5zcG9ydCIpCisgICAgICB0cmFucyA9IGRvdWJsZSgiVHJhbnNwb3J0IikKICAgICAgIGJ0cmFucyA9IFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQubmV3KHRyYW5zKQogICAgICAgYnRyYW5zLndyaXRlKCJvbmUvIikKICAgICAgIGJ0cmFucy53cml0ZSgidHdvLyIpCiAgICAgICBidHJhbnMud3JpdGUoInRocmVlLyIpCi0gICAgICB0cmFucy5zaG91bGRfcmVjZWl2ZSg6d3JpdGUpLndpdGgoIm9uZS90d28vdGhyZWUvIikKLSAgICAgIHRyYW5zLnN0dWIhKDpmbHVzaCkKKyAgICAgIGV4cGVjdCh0cmFucykudG8gcmVjZWl2ZSg6d3JpdGUpLndpdGgoIm9uZS90d28vdGhyZWUvIikKKyAgICAgIGFsbG93KHRyYW5zKS50byByZWNlaXZlKDpmbHVzaCkKICAgICAgIGJ0cmFucy5mbHVzaAogICAgICAgIyBOb3RoaW5nIHRvIGZsdXNoIHdpdGggbm8gZGF0YQogICAgICAgYnRyYW5zLmZsdXNoCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGZsdXNoIG9uIGNsb3NlIiBkbwotICAgICAgdHJhbnMgPSBtb2NrKCJUcmFuc3BvcnQiKQotICAgICAgdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmNsb3NlKQorICAgICAgdHJhbnMgPSBkb3VibGUoIlRyYW5zcG9ydCIpCisgICAgICBleHBlY3QodHJhbnMpLnRvIHJlY2VpdmUoOmNsb3NlKQogICAgICAgYnRyYW5zID0gVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydC5uZXcodHJhbnMpCi0gICAgICBidHJhbnMuc2hvdWxkX3JlY2VpdmUoOmZsdXNoKQorICAgICAgZXhwZWN0KGJ0cmFucykudG8gcmVjZWl2ZSg6Zmx1c2gpCiAgICAgICBidHJhbnMuY2xvc2UKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgbm90IHdyaXRlIHRvIHNvY2tldCBpZiB0aGVyZSdzIG5vIGRhdGEiIGRvCi0gICAgICB0cmFucyA9IG1vY2soIlRyYW5zcG9ydCIpCi0gICAgICB0cmFucy5zaG91bGRfcmVjZWl2ZSg6Zmx1c2gpCisgICAgICB0cmFucyA9IGRvdWJsZSgiVHJhbnNwb3J0IikKKyAgICAgIGV4cGVjdCh0cmFucykudG8gcmVjZWl2ZSg6Zmx1c2gpCiAgICAgICBidHJhbnMgPSBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0Lm5ldyh0cmFucykKICAgICAgIGJ0cmFucy5mbHVzaAogICAgIGVuZApAQCAtMTMwLDgwICsxNDQsOTAgQEAKIAogICBkZXNjcmliZSBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSBkbwogICAgIGl0ICJzaG91bGQgd3JhcCB0aGUgZ2l2ZW4gdHJhbnNwb3J0IGluIGEgQnVmZmVyZWRUcmFuc3BvcnQiIGRvCi0gICAgICB0cmFucyA9IG1vY2soIlRyYW5zcG9ydCIpCi0gICAgICBidHJhbnMgPSBtb2NrKCJCdWZmZXJlZFRyYW5zcG9ydCIpCi0gICAgICBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0LnNob3VsZF9yZWNlaXZlKDpuZXcpLndpdGgodHJhbnMpLmFuZF9yZXR1cm4oYnRyYW5zKQotICAgICAgVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkubmV3LmdldF90cmFuc3BvcnQodHJhbnMpLnNob3VsZCA9PSBidHJhbnMKKyAgICAgIHRyYW5zID0gZG91YmxlKCJUcmFuc3BvcnQiKQorICAgICAgYnRyYW5zID0gZG91YmxlKCJCdWZmZXJlZFRyYW5zcG9ydCIpCisgICAgICBleHBlY3QoVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydCkudG8gcmVjZWl2ZSg6bmV3KS53aXRoKHRyYW5zKS5hbmRfcmV0dXJuKGJ0cmFucykKKyAgICAgIGV4cGVjdChUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeS5uZXcuZ2V0X3RyYW5zcG9ydCh0cmFucykpLnRvIGVxKGJ0cmFucykKKyAgICBlbmQKKyAgICAKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBleHBlY3QoVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkubmV3LnRvX3MpLnRvIGVxKCJidWZmZXJlZCIpCiAgICAgZW5kCiAgIGVuZAogCiAgIGRlc2NyaWJlIFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0IGRvCiAgICAgYmVmb3JlKDplYWNoKSBkbwotICAgICAgQHRyYW5zID0gbW9jaygiVHJhbnNwb3J0IikKKyAgICAgIEB0cmFucyA9IGRvdWJsZSgiVHJhbnNwb3J0IikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHRvX3MgdGhhdCBkZXNjcmliZXMgdGhlIGVuY2Fwc3VsYXRpb24iIGRvCisgICAgICB0cmFucyA9IGRvdWJsZSgiVHJhbnNwb3J0IikKKyAgICAgIGV4cGVjdCh0cmFucykudG8gcmVjZWl2ZSg6dG9fcykuYW5kX3JldHVybigibW9jayIpCisgICAgICBleHBlY3QoVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQubmV3KHRyYW5zKS50b19zKS50byBlcSgiZnJhbWVkKG1vY2spIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcGFzcyB0aHJvdWdoIG9wZW4/L29wZW4vY2xvc2UiIGRvCiAgICAgICBmdHJhbnMgPSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydC5uZXcoQHRyYW5zKQotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDpvcGVuPykub3JkZXJlZC5hbmRfcmV0dXJuKCIrIG9wZW4/IikKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6b3Blbikub3JkZXJlZC5hbmRfcmV0dXJuKCIrIG9wZW4iKQotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDpjbG9zZSkub3JkZXJlZC5hbmRfcmV0dXJuKCIrIGNsb3NlIikKLSAgICAgIGZ0cmFucy5vcGVuPy5zaG91bGQgPT0gIisgb3Blbj8iCi0gICAgICBmdHJhbnMub3Blbi5zaG91bGQgPT0gIisgb3BlbiIKLSAgICAgIGZ0cmFucy5jbG9zZS5zaG91bGQgPT0gIisgY2xvc2UiCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDpvcGVuPykub3JkZXJlZC5hbmRfcmV0dXJuKCIrIG9wZW4/IikKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOm9wZW4pLm9yZGVyZWQuYW5kX3JldHVybigiKyBvcGVuIikKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOmNsb3NlKS5vcmRlcmVkLmFuZF9yZXR1cm4oIisgY2xvc2UiKQorICAgICAgZXhwZWN0KGZ0cmFucy5vcGVuPykudG8gZXEoIisgb3Blbj8iKQorICAgICAgZXhwZWN0KGZ0cmFucy5vcGVuKS50byBlcSgiKyBvcGVuIikKKyAgICAgIGV4cGVjdChmdHJhbnMuY2xvc2UpLnRvIGVxKCIrIGNsb3NlIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcGFzcyB0aHJvdWdoIHJlYWQgd2hlbiByZWFkIGlzIHR1cm5lZCBvZmYiIGRvCiAgICAgICBmdHJhbnMgPSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydC5uZXcoQHRyYW5zLCBmYWxzZSwgdHJ1ZSkKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6cmVhZCkud2l0aCgxNykub3JkZXJlZC5hbmRfcmV0dXJuKCIrIHJlYWQiKQotICAgICAgZnRyYW5zLnJlYWQoMTcpLnNob3VsZCA9PSAiKyByZWFkIgorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6cmVhZCkud2l0aCgxNykub3JkZXJlZC5hbmRfcmV0dXJuKCIrIHJlYWQiKQorICAgICAgZXhwZWN0KGZ0cmFucy5yZWFkKDE3KSkudG8gZXEoIisgcmVhZCIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHBhc3MgdGhyb3VnaCB3cml0ZS9mbHVzaCB3aGVuIHdyaXRlIGlzIHR1cm5lZCBvZmYiIGRvCiAgICAgICBmdHJhbnMgPSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydC5uZXcoQHRyYW5zLCB0cnVlLCBmYWxzZSkKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6d3JpdGUpLndpdGgoImZvbyIpLm9yZGVyZWQuYW5kX3JldHVybigiKyB3cml0ZSIpCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmZsdXNoKS5vcmRlcmVkLmFuZF9yZXR1cm4oIisgZmx1c2giKQotICAgICAgZnRyYW5zLndyaXRlKCJmb28iKS5zaG91bGQgPT0gIisgd3JpdGUiCi0gICAgICBmdHJhbnMuZmx1c2guc2hvdWxkID09ICIrIGZsdXNoIgorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6d3JpdGUpLndpdGgoImZvbyIpLm9yZGVyZWQuYW5kX3JldHVybigiKyB3cml0ZSIpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDpmbHVzaCkub3JkZXJlZC5hbmRfcmV0dXJuKCIrIGZsdXNoIikKKyAgICAgIGV4cGVjdChmdHJhbnMud3JpdGUoImZvbyIpKS50byBlcSgiKyB3cml0ZSIpCisgICAgICBleHBlY3QoZnRyYW5zLmZsdXNoKS50byBlcSgiKyBmbHVzaCIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJldHVybiBhIGZ1bGwgZnJhbWUgaWYgYXNrZWQgZm9yID49IHRoZSBmcmFtZSdzIGxlbmd0aCIgZG8KICAgICAgIGZyYW1lID0gInRoaXMgaXMgYSBmcmFtZSIKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6cmVhZF9hbGwpLndpdGgoNCkuYW5kX3JldHVybigiXDAwMFwwMDBcMDAwXDAxNyIpCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOnJlYWRfYWxsKS53aXRoKGZyYW1lLmxlbmd0aCkuYW5kX3JldHVybihmcmFtZSkKLSAgICAgIFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0Lm5ldyhAdHJhbnMpLnJlYWQoZnJhbWUubGVuZ3RoICsgMTApLnNob3VsZCA9PSBmcmFtZQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6cmVhZF9hbGwpLndpdGgoNCkuYW5kX3JldHVybigiXDAwMFwwMDBcMDAwXDAxNyIpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDpyZWFkX2FsbCkud2l0aChmcmFtZS5sZW5ndGgpLmFuZF9yZXR1cm4oZnJhbWUpCisgICAgICBleHBlY3QoVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQubmV3KEB0cmFucykucmVhZChmcmFtZS5sZW5ndGggKyAxMCkpLnRvIGVxKGZyYW1lKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZXR1cm4gc2xpY2VzIG9mIHRoZSBmcmFtZSB3aGVuIGFza2VkIGZvciA8IHRoZSBmcmFtZSdzIGxlbmd0aCIgZG8KICAgICAgIGZyYW1lID0gInRoaXMgaXMgYSBmcmFtZSIKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6cmVhZF9hbGwpLndpdGgoNCkuYW5kX3JldHVybigiXDAwMFwwMDBcMDAwXDAxNyIpCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOnJlYWRfYWxsKS53aXRoKGZyYW1lLmxlbmd0aCkuYW5kX3JldHVybihmcmFtZSkKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOnJlYWRfYWxsKS53aXRoKDQpLmFuZF9yZXR1cm4oIlwwMDBcMDAwXDAwMFwwMTciKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6cmVhZF9hbGwpLndpdGgoZnJhbWUubGVuZ3RoKS5hbmRfcmV0dXJuKGZyYW1lKQogICAgICAgZnRyYW5zID0gVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQubmV3KEB0cmFucykKLSAgICAgIGZ0cmFucy5yZWFkKDQpLnNob3VsZCA9PSAidGhpcyIKLSAgICAgIGZ0cmFucy5yZWFkKDQpLnNob3VsZCA9PSAiIGlzICIKLSAgICAgIGZ0cmFucy5yZWFkKDE2KS5zaG91bGQgPT0gImEgZnJhbWUiCisgICAgICBleHBlY3QoZnRyYW5zLnJlYWQoNCkpLnRvIGVxKCJ0aGlzIikKKyAgICAgIGV4cGVjdChmdHJhbnMucmVhZCg0KSkudG8gZXEoIiBpcyAiKQorICAgICAgZXhwZWN0KGZ0cmFucy5yZWFkKDE2KSkudG8gZXEoImEgZnJhbWUiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZXR1cm4gbm90aGluZyBpZiBhc2tlZCBmb3IgPD0gMCIgZG8KLSAgICAgIFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0Lm5ldyhAdHJhbnMpLnJlYWQoLTIpLnNob3VsZCA9PSAiIgorICAgICAgZXhwZWN0KFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0Lm5ldyhAdHJhbnMpLnJlYWQoLTIpKS50byBlcSgiIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcHVsbCBhIG5ldyBmcmFtZSB3aGVuIHRoZSBmaXJzdCBpcyBleGhhdXN0ZWQiIGRvCiAgICAgICBmcmFtZSA9ICJ0aGlzIGlzIGEgZnJhbWUiCiAgICAgICBmcmFtZTIgPSAieWV0IGFub3RoZXIgZnJhbWUiCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOnJlYWRfYWxsKS53aXRoKDQpLmFuZF9yZXR1cm4oIlwwMDBcMDAwXDAwMFwwMTciLCAiXDAwMFwwMDBcMDAwXDAyMSIpCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOnJlYWRfYWxsKS53aXRoKGZyYW1lLmxlbmd0aCkuYW5kX3JldHVybihmcmFtZSkKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6cmVhZF9hbGwpLndpdGgoZnJhbWUyLmxlbmd0aCkuYW5kX3JldHVybihmcmFtZTIpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDpyZWFkX2FsbCkud2l0aCg0KS5hbmRfcmV0dXJuKCJcMDAwXDAwMFwwMDBcMDE3IiwgIlwwMDBcMDAwXDAwMFwwMjEiKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6cmVhZF9hbGwpLndpdGgoZnJhbWUubGVuZ3RoKS5hbmRfcmV0dXJuKGZyYW1lKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6cmVhZF9hbGwpLndpdGgoZnJhbWUyLmxlbmd0aCkuYW5kX3JldHVybihmcmFtZTIpCiAgICAgICBmdHJhbnMgPSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydC5uZXcoQHRyYW5zKQotICAgICAgZnRyYW5zLnJlYWQoNCkuc2hvdWxkID09ICJ0aGlzIgotICAgICAgZnRyYW5zLnJlYWQoOCkuc2hvdWxkID09ICIgaXMgYSBmciIKLSAgICAgIGZ0cmFucy5yZWFkKDYpLnNob3VsZCA9PSAiYW1lIgotICAgICAgZnRyYW5zLnJlYWQoNCkuc2hvdWxkID09ICJ5ZXQgIgotICAgICAgZnRyYW5zLnJlYWQoMTYpLnNob3VsZCA9PSAiYW5vdGhlciBmcmFtZSIKKyAgICAgIGV4cGVjdChmdHJhbnMucmVhZCg0KSkudG8gZXEoInRoaXMiKQorICAgICAgZXhwZWN0KGZ0cmFucy5yZWFkKDgpKS50byBlcSgiIGlzIGEgZnIiKQorICAgICAgZXhwZWN0KGZ0cmFucy5yZWFkKDYpKS50byBlcSgiYW1lIikKKyAgICAgIGV4cGVjdChmdHJhbnMucmVhZCg0KSkudG8gZXEoInlldCAiKQorICAgICAgZXhwZWN0KGZ0cmFucy5yZWFkKDE2KSkudG8gZXEoImFub3RoZXIgZnJhbWUiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBidWZmZXIgd3JpdGVzIiBkbwogICAgICAgZnRyYW5zID0gVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQubmV3KEB0cmFucykKLSAgICAgIEB0cmFucy5zaG91bGRfbm90X3JlY2VpdmUoOndyaXRlKQorICAgICAgZXhwZWN0KEB0cmFucykubm90X3RvIHJlY2VpdmUoOndyaXRlKQogICAgICAgZnRyYW5zLndyaXRlKCJmb28iKQogICAgICAgZnRyYW5zLndyaXRlKCJiYXIiKQogICAgICAgZnRyYW5zLndyaXRlKCJ0aGlzIGlzIGEgZnJhbWUiKQpAQCAtMjEzLDE1ICsyMzcsMTUgQEAKICAgICAgIGZ0cmFucyA9IFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0Lm5ldyhAdHJhbnMpCiAgICAgICBmdHJhbnMud3JpdGUoImZvb2JhciIsIDMpCiAgICAgICBmdHJhbnMud3JpdGUoImJhcmZvbyIsIDEpCi0gICAgICBAdHJhbnMuc3R1YiEoOmZsdXNoKQotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDp3cml0ZSkud2l0aCgiXDAwMFwwMDBcMDAwXDAwNGZvb2IiKQorICAgICAgYWxsb3coQHRyYW5zKS50byByZWNlaXZlKDpmbHVzaCkKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOndyaXRlKS53aXRoKCJcMDAwXDAwMFwwMDBcMDA0Zm9vYiIpCiAgICAgICBmdHJhbnMuZmx1c2gKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgZmx1c2ggZnJhbWVzIHdpdGggYSA0LWJ5dGUgaGVhZGVyIiBkbwogICAgICAgZnRyYW5zID0gVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQubmV3KEB0cmFucykKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6d3JpdGUpLndpdGgoIlwwMDBcMDAwXDAwMFwwMzVvbmUvdHdvL3RocmVlL3RoaXMgaXMgYSBmcmFtZSIpLm9yZGVyZWQKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6Zmx1c2gpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOndyaXRlKS53aXRoKCJcMDAwXDAwMFwwMDBcMDM1b25lL3R3by90aHJlZS90aGlzIGlzIGEgZnJhbWUiKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDpmbHVzaCkub3JkZXJlZAogICAgICAgZnRyYW5zLndyaXRlKCJvbmUvIikKICAgICAgIGZ0cmFucy53cml0ZSgidHdvLyIpCiAgICAgICBmdHJhbnMud3JpdGUoInRocmVlLyIpCkBAIC0yMzEsMjIgKzI1NSwyNiBAQAogCiAgICAgaXQgInNob3VsZCBub3QgZmx1c2ggdGhlIHNhbWUgYnVmZmVyZWQgZGF0YSB0d2ljZSIgZG8KICAgICAgIGZ0cmFucyA9IFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0Lm5ldyhAdHJhbnMpCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOndyaXRlKS53aXRoKCJcMDAwXDAwMFwwMDBcMDA3Zm9vL2JhciIpCi0gICAgICBAdHJhbnMuc3R1YiEoOmZsdXNoKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6d3JpdGUpLndpdGgoIlwwMDBcMDAwXDAwMFwwMDdmb28vYmFyIikKKyAgICAgIGFsbG93KEB0cmFucykudG8gcmVjZWl2ZSg6Zmx1c2gpCiAgICAgICBmdHJhbnMud3JpdGUoImZvbyIpCiAgICAgICBmdHJhbnMud3JpdGUoIi9iYXIiKQogICAgICAgZnRyYW5zLmZsdXNoCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOndyaXRlKS53aXRoKCJcMDAwXDAwMFwwMDBcMDAwIikKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOndyaXRlKS53aXRoKCJcMDAwXDAwMFwwMDBcMDAwIikKICAgICAgIGZ0cmFucy5mbHVzaAogICAgIGVuZAogICBlbmQKIAogICBkZXNjcmliZSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydEZhY3RvcnkgZG8KICAgICBpdCAic2hvdWxkIHdyYXAgdGhlIGdpdmVuIHRyYW5zcG9ydCBpbiBhIEZyYW1lZFRyYW5zcG9ydCIgZG8KLSAgICAgIHRyYW5zID0gbW9jaygiVHJhbnNwb3J0IikKLSAgICAgIFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0LnNob3VsZF9yZWNlaXZlKDpuZXcpLndpdGgodHJhbnMpCisgICAgICB0cmFucyA9IGRvdWJsZSgiVHJhbnNwb3J0IikKKyAgICAgIGV4cGVjdChUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydCkudG8gcmVjZWl2ZSg6bmV3KS53aXRoKHRyYW5zKQogICAgICAgVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnRGYWN0b3J5Lm5ldy5nZXRfdHJhbnNwb3J0KHRyYW5zKQogICAgIGVuZAorICAgIAorICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydEZhY3RvcnkubmV3LnRvX3MpLnRvIGVxKCJmcmFtZWQiKQorICAgIGVuZAogICBlbmQKIAogICBkZXNjcmliZSBUaHJpZnQ6Ok1lbW9yeUJ1ZmZlclRyYW5zcG9ydCBkbwpAQCAtMjU0LDk2ICsyODIsMTA2IEBACiAgICAgICBAYnVmZmVyID0gVGhyaWZ0OjpNZW1vcnlCdWZmZXJUcmFuc3BvcnQubmV3CiAgICAgZW5kCiAKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBleHBlY3QoQGJ1ZmZlci50b19zKS50byBlcSgibWVtb3J5IikKKyAgICBlbmQKKwogICAgIGl0ICJzaG91bGQgYWNjZXB0IGEgYnVmZmVyIG9uIGlucHV0IGFuZCB1c2UgaXQgZGlyZWN0bHkiIGRvCiAgICAgICBzID0gInRoaXMgaXMgYSB0ZXN0IgogICAgICAgQGJ1ZmZlciA9IFRocmlmdDo6TWVtb3J5QnVmZmVyVHJhbnNwb3J0Lm5ldyhzKQotICAgICAgQGJ1ZmZlci5yZWFkKDQpLnNob3VsZCA9PSAidGhpcyIKKyAgICAgIGV4cGVjdChAYnVmZmVyLnJlYWQoNCkpLnRvIGVxKCJ0aGlzIikKICAgICAgIHMuc2xpY2UhKC00Li4tMSkKLSAgICAgIEBidWZmZXIucmVhZChAYnVmZmVyLmF2YWlsYWJsZSkuc2hvdWxkID09ICIgaXMgYSAiCisgICAgICBleHBlY3QoQGJ1ZmZlci5yZWFkKEBidWZmZXIuYXZhaWxhYmxlKSkudG8gZXEoIiBpcyBhICIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGFsd2F5cyByZW1haW4gb3BlbiIgZG8KLSAgICAgIEBidWZmZXIuc2hvdWxkIGJlX29wZW4KKyAgICAgIGV4cGVjdChAYnVmZmVyKS50byBiZV9vcGVuCiAgICAgICBAYnVmZmVyLmNsb3NlCi0gICAgICBAYnVmZmVyLnNob3VsZCBiZV9vcGVuCisgICAgICBleHBlY3QoQGJ1ZmZlcikudG8gYmVfb3BlbgogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZXNwb25kIHRvIHBlZWsgYW5kIGF2YWlsYWJsZSIgZG8KICAgICAgIEBidWZmZXIud3JpdGUgInNvbWUgZGF0YSIKLSAgICAgIEBidWZmZXIucGVlay5zaG91bGQgYmVfdHJ1ZQotICAgICAgQGJ1ZmZlci5hdmFpbGFibGUuc2hvdWxkID09IDkKKyAgICAgIGV4cGVjdChAYnVmZmVyLnBlZWspLnRvIGJlX3RydXRoeQorICAgICAgZXhwZWN0KEBidWZmZXIuYXZhaWxhYmxlKS50byBlcSg5KQogICAgICAgQGJ1ZmZlci5yZWFkKDQpCi0gICAgICBAYnVmZmVyLnBlZWsuc2hvdWxkIGJlX3RydWUKLSAgICAgIEBidWZmZXIuYXZhaWxhYmxlLnNob3VsZCA9PSA1CisgICAgICBleHBlY3QoQGJ1ZmZlci5wZWVrKS50byBiZV90cnV0aHkKKyAgICAgIGV4cGVjdChAYnVmZmVyLmF2YWlsYWJsZSkudG8gZXEoNSkKICAgICAgIEBidWZmZXIucmVhZCg1KQotICAgICAgQGJ1ZmZlci5wZWVrLnNob3VsZCBiZV9mYWxzZQotICAgICAgQGJ1ZmZlci5hdmFpbGFibGUuc2hvdWxkID09IDAKKyAgICAgIGV4cGVjdChAYnVmZmVyLnBlZWspLnRvIGJlX2ZhbHNleQorICAgICAgZXhwZWN0KEBidWZmZXIuYXZhaWxhYmxlKS50byBlcSgwKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBiZSBhYmxlIHRvIHJlc2V0IHRoZSBidWZmZXIiIGRvCiAgICAgICBAYnVmZmVyLndyaXRlICJ0ZXN0IGRhdGEiCiAgICAgICBAYnVmZmVyLnJlc2V0X2J1ZmZlcigiZm9vYmFyIikKLSAgICAgIEBidWZmZXIuYXZhaWxhYmxlLnNob3VsZCA9PSA2Ci0gICAgICBAYnVmZmVyLnJlYWQoQGJ1ZmZlci5hdmFpbGFibGUpLnNob3VsZCA9PSAiZm9vYmFyIgorICAgICAgZXhwZWN0KEBidWZmZXIuYXZhaWxhYmxlKS50byBlcSg2KQorICAgICAgZXhwZWN0KEBidWZmZXIucmVhZChAYnVmZmVyLmF2YWlsYWJsZSkpLnRvIGVxKCJmb29iYXIiKQogICAgICAgQGJ1ZmZlci5yZXNldF9idWZmZXIKLSAgICAgIEBidWZmZXIuYXZhaWxhYmxlLnNob3VsZCA9PSAwCisgICAgICBleHBlY3QoQGJ1ZmZlci5hdmFpbGFibGUpLnRvIGVxKDApCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGNvcHkgdGhlIGdpdmVuIHN0cmluZyB3aGVuIHJlc2V0dGluZyB0aGUgYnVmZmVyIiBkbwogICAgICAgcyA9ICJ0aGlzIGlzIGEgdGVzdCIKICAgICAgIEBidWZmZXIucmVzZXRfYnVmZmVyKHMpCi0gICAgICBAYnVmZmVyLmF2YWlsYWJsZS5zaG91bGQgPT0gMTQKKyAgICAgIGV4cGVjdChAYnVmZmVyLmF2YWlsYWJsZSkudG8gZXEoMTQpCiAgICAgICBAYnVmZmVyLnJlYWQoMTApCi0gICAgICBAYnVmZmVyLmF2YWlsYWJsZS5zaG91bGQgPT0gNAotICAgICAgcy5zaG91bGQgPT0gInRoaXMgaXMgYSB0ZXN0IgorICAgICAgZXhwZWN0KEBidWZmZXIuYXZhaWxhYmxlKS50byBlcSg0KQorICAgICAgZXhwZWN0KHMpLnRvIGVxKCJ0aGlzIGlzIGEgdGVzdCIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJldHVybiBmcm9tIHJlYWQgd2hhdCB3YXMgZ2l2ZW4gaW4gd3JpdGUiIGRvCiAgICAgICBAYnVmZmVyLndyaXRlICJ0ZXN0IGRhdGEiCi0gICAgICBAYnVmZmVyLnJlYWQoNCkuc2hvdWxkID09ICJ0ZXN0IgotICAgICAgQGJ1ZmZlci5yZWFkKEBidWZmZXIuYXZhaWxhYmxlKS5zaG91bGQgPT0gIiBkYXRhIgorICAgICAgZXhwZWN0KEBidWZmZXIucmVhZCg0KSkudG8gZXEoInRlc3QiKQorICAgICAgZXhwZWN0KEBidWZmZXIucmVhZChAYnVmZmVyLmF2YWlsYWJsZSkpLnRvIGVxKCIgZGF0YSIpCiAgICAgICBAYnVmZmVyLndyaXRlICJmb28iCiAgICAgICBAYnVmZmVyLndyaXRlICIgYmFyIgotICAgICAgQGJ1ZmZlci5yZWFkKEBidWZmZXIuYXZhaWxhYmxlKS5zaG91bGQgPT0gImZvbyBiYXIiCisgICAgICBleHBlY3QoQGJ1ZmZlci5yZWFkKEBidWZmZXIuYXZhaWxhYmxlKSkudG8gZXEoImZvbyBiYXIiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCB0aHJvdyBhbiBFT0ZFcnJvciB3aGVuIHRoZXJlIGlzbid0IGVub3VnaCBkYXRhIGluIHRoZSBidWZmZXIiIGRvCiAgICAgICBAYnVmZmVyLnJlc2V0X2J1ZmZlcigiIikKLSAgICAgIGxhbWJkYXtAYnVmZmVyLnJlYWQoMSl9LnNob3VsZCByYWlzZV9lcnJvcihFT0ZFcnJvcikKKyAgICAgIGV4cGVjdHtAYnVmZmVyLnJlYWQoMSl9LnRvIHJhaXNlX2Vycm9yKEVPRkVycm9yKQogCiAgICAgICBAYnVmZmVyLnJlc2V0X2J1ZmZlcigiMTIzNCIpCi0gICAgICBsYW1iZGF7QGJ1ZmZlci5yZWFkKDUpfS5zaG91bGQgcmFpc2VfZXJyb3IoRU9GRXJyb3IpCisgICAgICBleHBlY3R7QGJ1ZmZlci5yZWFkKDUpfS50byByYWlzZV9lcnJvcihFT0ZFcnJvcikKICAgICBlbmQKICAgZW5kCiAKICAgZGVzY3JpYmUgVGhyaWZ0OjpJT1N0cmVhbVRyYW5zcG9ydCBkbwogICAgIGJlZm9yZSg6ZWFjaCkgZG8KLSAgICAgIEBpbnB1dCA9IG1vY2soIklucHV0IiwgOmNsb3NlZD8gPT4gZmFsc2UpCi0gICAgICBAb3V0cHV0ID0gbW9jaygiT3V0cHV0IiwgOmNsb3NlZD8gPT4gZmFsc2UpCisgICAgICBAaW5wdXQgPSBkb3VibGUoIklucHV0IiwgOmNsb3NlZD8gPT4gZmFsc2UpCisgICAgICBAb3V0cHV0ID0gZG91YmxlKCJPdXRwdXQiLCA6Y2xvc2VkPyA9PiBmYWxzZSkKICAgICAgIEB0cmFucyA9IFRocmlmdDo6SU9TdHJlYW1UcmFuc3BvcnQubmV3KEBpbnB1dCwgQG91dHB1dCkKICAgICBlbmQKIAorICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChAaW5wdXQpLnRvIHJlY2VpdmUoOnRvX3MpLmFuZF9yZXR1cm4oIm1vY2tfaW5wdXQiKQorICAgICAgZXhwZWN0KEBvdXRwdXQpLnRvIHJlY2VpdmUoOnRvX3MpLmFuZF9yZXR1cm4oIm1vY2tfb3V0cHV0IikKKyAgICAgIGV4cGVjdChAdHJhbnMudG9fcykudG8gZXEoImlvc3RyZWFtKGlucHV0PW1vY2tfaW5wdXQsb3V0cHV0PW1vY2tfb3V0cHV0KSIpCisgICAgZW5kCisKICAgICBpdCAic2hvdWxkIGJlIG9wZW4gYXMgbG9uZyBhcyBib3RoIGlucHV0IG9yIG91dHB1dCBhcmUgb3BlbiIgZG8KLSAgICAgIEB0cmFucy5zaG91bGQgYmVfb3BlbgotICAgICAgQGlucHV0LnN0dWIhKDpjbG9zZWQ/KS5hbmRfcmV0dXJuKHRydWUpCi0gICAgICBAdHJhbnMuc2hvdWxkIGJlX29wZW4KLSAgICAgIEBpbnB1dC5zdHViISg6Y2xvc2VkPykuYW5kX3JldHVybihmYWxzZSkKLSAgICAgIEBvdXRwdXQuc3R1YiEoOmNsb3NlZD8pLmFuZF9yZXR1cm4odHJ1ZSkKLSAgICAgIEB0cmFucy5zaG91bGQgYmVfb3BlbgotICAgICAgQGlucHV0LnN0dWIhKDpjbG9zZWQ/KS5hbmRfcmV0dXJuKHRydWUpCi0gICAgICBAdHJhbnMuc2hvdWxkX25vdCBiZV9vcGVuCisgICAgICBleHBlY3QoQHRyYW5zKS50byBiZV9vcGVuCisgICAgICBhbGxvdyhAaW5wdXQpLnRvIHJlY2VpdmUoOmNsb3NlZD8pLmFuZF9yZXR1cm4odHJ1ZSkKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIGJlX29wZW4KKyAgICAgIGFsbG93KEBpbnB1dCkudG8gcmVjZWl2ZSg6Y2xvc2VkPykuYW5kX3JldHVybihmYWxzZSkKKyAgICAgIGFsbG93KEBvdXRwdXQpLnRvIHJlY2VpdmUoOmNsb3NlZD8pLmFuZF9yZXR1cm4odHJ1ZSkKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIGJlX29wZW4KKyAgICAgIGFsbG93KEBpbnB1dCkudG8gcmVjZWl2ZSg6Y2xvc2VkPykuYW5kX3JldHVybih0cnVlKQorICAgICAgZXhwZWN0KEB0cmFucykubm90X3RvIGJlX29wZW4KICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcGFzcyB0aHJvdWdoIHJlYWQvd3JpdGUgdG8gaW5wdXQvb3V0cHV0IiBkbwotICAgICAgQGlucHV0LnNob3VsZF9yZWNlaXZlKDpyZWFkKS53aXRoKDE3KS5hbmRfcmV0dXJuKCIrIHJlYWQiKQotICAgICAgQG91dHB1dC5zaG91bGRfcmVjZWl2ZSg6d3JpdGUpLndpdGgoImZvb2JhciIpLmFuZF9yZXR1cm4oIisgd3JpdGUiKQotICAgICAgQHRyYW5zLnJlYWQoMTcpLnNob3VsZCA9PSAiKyByZWFkIgotICAgICAgQHRyYW5zLndyaXRlKCJmb29iYXIiKS5zaG91bGQgPT0gIisgd3JpdGUiCisgICAgICBleHBlY3QoQGlucHV0KS50byByZWNlaXZlKDpyZWFkKS53aXRoKDE3KS5hbmRfcmV0dXJuKCIrIHJlYWQiKQorICAgICAgZXhwZWN0KEBvdXRwdXQpLnRvIHJlY2VpdmUoOndyaXRlKS53aXRoKCJmb29iYXIiKS5hbmRfcmV0dXJuKCIrIHdyaXRlIikKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZCgxNykpLnRvIGVxKCIrIHJlYWQiKQorICAgICAgZXhwZWN0KEB0cmFucy53cml0ZSgiZm9vYmFyIikpLnRvIGVxKCIrIHdyaXRlIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgY2xvc2UgYm90aCBpbnB1dCBhbmQgb3V0cHV0IHdoZW4gY2xvc2VkIiBkbwotICAgICAgQGlucHV0LnNob3VsZF9yZWNlaXZlKDpjbG9zZSkKLSAgICAgIEBvdXRwdXQuc2hvdWxkX3JlY2VpdmUoOmNsb3NlKQorICAgICAgZXhwZWN0KEBpbnB1dCkudG8gcmVjZWl2ZSg6Y2xvc2UpCisgICAgICBleHBlY3QoQG91dHB1dCkudG8gcmVjZWl2ZSg6Y2xvc2UpCiAgICAgICBAdHJhbnMuY2xvc2UKICAgICBlbmQKICAgZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9iaW5hcnlfcHJvdG9jb2xfYWNjZWxlcmF0ZWRfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL2JpbmFyeV9wcm90b2NvbF9hY2NlbGVyYXRlZF9zcGVjLnJiCmluZGV4IGJhYzllYTcuLmIyY2QwNGIgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL2JpbmFyeV9wcm90b2NvbF9hY2NlbGVyYXRlZF9zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL2JpbmFyeV9wcm90b2NvbF9hY2NlbGVyYXRlZF9zcGVjLnJiCkBAIC0zMywxMCArMzMsMTQgQEAKIAogICAgIGRlc2NyaWJlIFRocmlmdDo6QmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkgZG8KICAgICAgIGl0ICJzaG91bGQgY3JlYXRlIGEgQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCIgZG8KLSAgICAgICAgVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeS5uZXcuZ2V0X3Byb3RvY29sKG1vY2soIk1vY2tUcmFuc3BvcnQiKSkuc2hvdWxkIGJlX2luc3RhbmNlX29mKFRocmlmdDo6QmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCkKKyAgICAgICAgZXhwZWN0KFRocmlmdDo6QmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkubmV3LmdldF9wcm90b2NvbChkb3VibGUoIk1vY2tUcmFuc3BvcnQiKSkpLnRvIGJlX2luc3RhbmNlX29mKFRocmlmdDo6QmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCkKKyAgICAgIGVuZAorCisgICAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICAgIGV4cGVjdChUaHJpZnQ6OkJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5Lm5ldy50b19zKS50byBlcSgiYmluYXJ5LWFjY2VsIikKICAgICAgIGVuZAogICAgIGVuZAogICBlbmQKIGVsc2UKICAgcHV0cyAic2tpcHBpbmcgQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBzcGVjIGJlY2F1c2UgaXQgaXMgbm90IGRlZmluZWQuIgotZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9iaW5hcnlfcHJvdG9jb2xfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL2JpbmFyeV9wcm90b2NvbF9zcGVjLnJiCmluZGV4IDMyNzcyZDMuLjA2NWY1Y2UgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL2JpbmFyeV9wcm90b2NvbF9zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL2JpbmFyeV9wcm90b2NvbF9zcGVjLnJiCkBAIC0zOCwyOSArMzgsMzcgQEAKICAgICBpdCAic2hvdWxkIHJlYWQgYSBtZXNzYWdlIGhlYWRlciIgZG8KICAgICAgIEB0cmFucy53cml0ZShbcHJvdG9jb2xfY2xhc3MuY29uc3RfZ2V0KDpWRVJTSU9OXzEpIHwgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OlJFUExZXS5wYWNrKCdOJykpCiAgICAgICBAdHJhbnMud3JpdGUoWzQyXS5wYWNrKCdOJykpCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJpbmcpLmFuZF9yZXR1cm4oJ3Rlc3RNZXNzYWdlJykKLSAgICAgIEBwcm90LnJlYWRfbWVzc2FnZV9iZWdpbi5zaG91bGQgPT0gWyd0ZXN0TWVzc2FnZScsIFRocmlmdDo6TWVzc2FnZVR5cGVzOjpSRVBMWSwgNDJdCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RyaW5nKS5hbmRfcmV0dXJuKCd0ZXN0TWVzc2FnZScpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9tZXNzYWdlX2JlZ2luKS50byBlcShbJ3Rlc3RNZXNzYWdlJywgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OlJFUExZLCA0Ml0pCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJhaXNlIGFuIGV4Y2VwdGlvbiBpZiB0aGUgbWVzc2FnZSBoZWFkZXIgaGFzIHRoZSB3cm9uZyB2ZXJzaW9uIiBkbwotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfaTMyKS5hbmRfcmV0dXJuKC0xKQotICAgICAgbGFtYmRhIHsgQHByb3QucmVhZF9tZXNzYWdlX2JlZ2luIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24sICdNaXNzaW5nIHZlcnNpb24gaWRlbnRpZmllcicpIGRvIHxlfAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2kzMikuYW5kX3JldHVybigtMSkKKyAgICAgIGV4cGVjdCB7IEBwcm90LnJlYWRfbWVzc2FnZV9iZWdpbiB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24sICdNaXNzaW5nIHZlcnNpb24gaWRlbnRpZmllcicpIGRvIHxlfAogICAgICAgICBlLnR5cGUgPT0gVGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbjo6QkFEX1ZFUlNJT04KICAgICAgIGVuZAogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByYWlzZSBhbiBleGNlcHRpb24gaWYgdGhlIG1lc3NhZ2UgaGVhZGVyIGRvZXMgbm90IGV4aXN0IGFuZCBzdHJpY3RfcmVhZCBpcyBlbmFibGVkIiBkbwotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfaTMyKS5hbmRfcmV0dXJuKDQyKQotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnN0cmljdF9yZWFkKS5hbmRfcmV0dXJuKHRydWUpCi0gICAgICBsYW1iZGEgeyBAcHJvdC5yZWFkX21lc3NhZ2VfYmVnaW4gfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbiwgJ05vIHZlcnNpb24gaWRlbnRpZmllciwgb2xkIHByb3RvY29sIGNsaWVudD8nKSBkbyB8ZXwKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9pMzIpLmFuZF9yZXR1cm4oNDIpCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnN0cmljdF9yZWFkKS5hbmRfcmV0dXJuKHRydWUpCisgICAgICBleHBlY3QgeyBAcHJvdC5yZWFkX21lc3NhZ2VfYmVnaW4gfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uLCAnTm8gdmVyc2lvbiBpZGVudGlmaWVyLCBvbGQgcHJvdG9jb2wgY2xpZW50PycpIGRvIHxlfAogICAgICAgICBlLnR5cGUgPT0gVGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbjo6QkFEX1ZFUlNJT04KICAgICAgIGVuZAogICAgIGVuZAorCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KEBwcm90LnRvX3MpLnRvIGVxKCJiaW5hcnkobWVtb3J5KSIpCisgICAgZW5kCiAgIGVuZAogCiAgIGRlc2NyaWJlIFRocmlmdDo6QmluYXJ5UHJvdG9jb2xGYWN0b3J5IGRvCiAgICAgaXQgInNob3VsZCBjcmVhdGUgYSBCaW5hcnlQcm90b2NvbCIgZG8KLSAgICAgIFRocmlmdDo6QmluYXJ5UHJvdG9jb2xGYWN0b3J5Lm5ldy5nZXRfcHJvdG9jb2wobW9jaygiTW9ja1RyYW5zcG9ydCIpKS5zaG91bGQgYmVfaW5zdGFuY2Vfb2YoVGhyaWZ0OjpCaW5hcnlQcm90b2NvbCkKKyAgICAgIGV4cGVjdChUaHJpZnQ6OkJpbmFyeVByb3RvY29sRmFjdG9yeS5uZXcuZ2V0X3Byb3RvY29sKGRvdWJsZSgiTW9ja1RyYW5zcG9ydCIpKSkudG8gYmVfaW5zdGFuY2Vfb2YoVGhyaWZ0OjpCaW5hcnlQcm90b2NvbCkKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChUaHJpZnQ6OkJpbmFyeVByb3RvY29sRmFjdG9yeS5uZXcudG9fcykudG8gZXEoImJpbmFyeSIpCiAgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9iaW5hcnlfcHJvdG9jb2xfc3BlY19zaGFyZWQucmIgYi9saWIvcmIvc3BlYy9iaW5hcnlfcHJvdG9jb2xfc3BlY19zaGFyZWQucmIKaW5kZXggYzYxNWI1OC4uNThkNjVmMCAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvYmluYXJ5X3Byb3RvY29sX3NwZWNfc2hhcmVkLnJiCisrKyBiL2xpYi9yYi9zcGVjL2JpbmFyeV9wcm90b2NvbF9zcGVjX3NoYXJlZC5yYgpAQCAtMjcsMzQgKzI3LDM0IEBACiAgIGVuZAogCiAgIGl0ICJzaG91bGQgZGVmaW5lIHRoZSBwcm9wZXIgVkVSU0lPTl8xLCBWRVJTSU9OX01BU0sgQU5EIFRZUEVfTUFTSyIgZG8KLSAgICBwcm90b2NvbF9jbGFzcy5jb25zdF9nZXQoOlZFUlNJT05fTUFTSykuc2hvdWxkID09IDB4ZmZmZjAwMDAKLSAgICBwcm90b2NvbF9jbGFzcy5jb25zdF9nZXQoOlZFUlNJT05fMSkuc2hvdWxkID09IDB4ODAwMTAwMDAKLSAgICBwcm90b2NvbF9jbGFzcy5jb25zdF9nZXQoOlRZUEVfTUFTSykuc2hvdWxkID09IDB4MDAwMDAwZmYKKyAgICBleHBlY3QocHJvdG9jb2xfY2xhc3MuY29uc3RfZ2V0KDpWRVJTSU9OX01BU0spKS50byBlcSgweGZmZmYwMDAwKQorICAgIGV4cGVjdChwcm90b2NvbF9jbGFzcy5jb25zdF9nZXQoOlZFUlNJT05fMSkpLnRvIGVxKDB4ODAwMTAwMDApCisgICAgZXhwZWN0KHByb3RvY29sX2NsYXNzLmNvbnN0X2dldCg6VFlQRV9NQVNLKSkudG8gZXEoMHgwMDAwMDBmZikKICAgZW5kCiAKICAgaXQgInNob3VsZCBtYWtlIHN0cmljdF9yZWFkIHJlYWRhYmxlIiBkbwotICAgIEBwcm90LnN0cmljdF9yZWFkLnNob3VsZCBlcWwodHJ1ZSkKKyAgICBleHBlY3QoQHByb3Quc3RyaWN0X3JlYWQpLnRvIGVxbCh0cnVlKQogICBlbmQKIAogICBpdCAic2hvdWxkIG1ha2Ugc3RyaWN0X3dyaXRlIHJlYWRhYmxlIiBkbwotICAgIEBwcm90LnN0cmljdF93cml0ZS5zaG91bGQgZXFsKHRydWUpCisgICAgZXhwZWN0KEBwcm90LnN0cmljdF93cml0ZSkudG8gZXFsKHRydWUpCiAgIGVuZCAgICAKIAogICBpdCAic2hvdWxkIHdyaXRlIHRoZSBtZXNzYWdlIGhlYWRlciIgZG8KICAgICBAcHJvdC53cml0ZV9tZXNzYWdlX2JlZ2luKCd0ZXN0TWVzc2FnZScsIFRocmlmdDo6TWVzc2FnZVR5cGVzOjpDQUxMLCAxNykKLSAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gW3Byb3RvY29sX2NsYXNzLmNvbnN0X2dldCg6VkVSU0lPTl8xKSB8IFRocmlmdDo6TWVzc2FnZVR5cGVzOjpDQUxMLCAidGVzdE1lc3NhZ2UiLnNpemUsICJ0ZXN0TWVzc2FnZSIsIDE3XS5wYWNrKCJOTmExMU4iKQorICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoW3Byb3RvY29sX2NsYXNzLmNvbnN0X2dldCg6VkVSU0lPTl8xKSB8IFRocmlmdDo6TWVzc2FnZVR5cGVzOjpDQUxMLCAidGVzdE1lc3NhZ2UiLnNpemUsICJ0ZXN0TWVzc2FnZSIsIDE3XS5wYWNrKCJOTmExMU4iKSkKICAgZW5kCiAgIAogICBpdCAic2hvdWxkIHdyaXRlIHRoZSBtZXNzYWdlIGhlYWRlciB3aXRob3V0IHZlcnNpb24gd2hlbiB3cml0ZXMgYXJlIG5vdCBzdHJpY3QiIGRvCiAgICAgQHByb3QgPSBwcm90b2NvbF9jbGFzcy5uZXcoQHRyYW5zLCB0cnVlLCBmYWxzZSkgIyBubyBzdHJpY3Qgd3JpdGUKICAgICBAcHJvdC53cml0ZV9tZXNzYWdlX2JlZ2luKCd0ZXN0TWVzc2FnZScsIFRocmlmdDo6TWVzc2FnZVR5cGVzOjpDQUxMLCAxNykKLSAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIlwwMDBcMDAwXDAwMFx2dGVzdE1lc3NhZ2VcMDAxXDAwMFwwMDBcMDAwXDAyMSIKKyAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJcMDAwXDAwMFwwMDBcdnRlc3RNZXNzYWdlXDAwMVwwMDBcMDAwXDAwMFwwMjEiKQogICBlbmQKICAgCiAgIGl0ICJzaG91bGQgd3JpdGUgdGhlIG1lc3NhZ2UgaGVhZGVyIHdpdGggYSB2ZXJzaW9uIHdoZW4gd3JpdGVzIGFyZSBzdHJpY3QiIGRvCiAgICAgQHByb3QgPSBwcm90b2NvbF9jbGFzcy5uZXcoQHRyYW5zKSAjIHN0cmljdCB3cml0ZQogICAgIEBwcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oJ3Rlc3RNZXNzYWdlJywgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkNBTEwsIDE3KQotICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiXDIwMFwwMDFcMDAwXDAwMVwwMDBcMDAwXDAwMFx2dGVzdE1lc3NhZ2VcMDAwXDAwMFwwMDBcMDIxIgorICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlwyMDBcMDAxXDAwMFwwMDFcMDAwXDAwMFwwMDBcdnRlc3RNZXNzYWdlXDAwMFwwMDBcMDAwXDAyMSIpCiAgIGVuZAogICAKIApAQCAtNjIsNjQgKzYyLDY3IEBACiAKICAgaXQgInNob3VsZCB3cml0ZSB0aGUgZmllbGQgaGVhZGVyIiBkbwogICAgIEBwcm90LndyaXRlX2ZpZWxkX2JlZ2luKCdmb28nLCBUaHJpZnQ6OlR5cGVzOjpET1VCTEUsIDMpCi0gICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09IFtUaHJpZnQ6OlR5cGVzOjpET1VCTEUsIDNdLnBhY2soImNuIikKKyAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKFtUaHJpZnQ6OlR5cGVzOjpET1VCTEUsIDNdLnBhY2soImNuIikpCiAgIGVuZAogICAKICAgIyBmaWVsZCBmb290ZXIgaXMgYSBub29wCiAgIAogICBpdCAic2hvdWxkIHdyaXRlIHRoZSBTVE9QIGZpZWxkIiBkbwogICAgIEBwcm90LndyaXRlX2ZpZWxkX3N0b3AKLSAgICBAdHJhbnMucmVhZCgxKS5zaG91bGQgPT0gIlwwMDAiCisgICAgZXhwZWN0KEB0cmFucy5yZWFkKDEpKS50byBlcSgiXDAwMCIpCiAgIGVuZAogICAKICAgaXQgInNob3VsZCB3cml0ZSB0aGUgbWFwIGhlYWRlciIgZG8KICAgICBAcHJvdC53cml0ZV9tYXBfYmVnaW4oVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCBUaHJpZnQ6OlR5cGVzOjpMSVNULCAxNykKLSAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gW1RocmlmdDo6VHlwZXM6OlNUUklORywgVGhyaWZ0OjpUeXBlczo6TElTVCwgMTddLnBhY2soImNjTiIpOworICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoW1RocmlmdDo6VHlwZXM6OlNUUklORywgVGhyaWZ0OjpUeXBlczo6TElTVCwgMTddLnBhY2soImNjTiIpKTsKICAgZW5kCiAgICAKICAgIyBtYXAgZm9vdGVyIGlzIGEgbm9vcAogICAKICAgaXQgInNob3VsZCB3cml0ZSB0aGUgbGlzdCBoZWFkZXIiIGRvCiAgICAgQHByb3Qud3JpdGVfbGlzdF9iZWdpbihUaHJpZnQ6OlR5cGVzOjpJMTYsIDQyKQotICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSBbVGhyaWZ0OjpUeXBlczo6STE2LCA0Ml0ucGFjaygiY04iKQorICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoW1RocmlmdDo6VHlwZXM6OkkxNiwgNDJdLnBhY2soImNOIikpCiAgIGVuZAogICAKICAgIyBsaXN0IGZvb3RlciBpcyBhIG5vb3AKICAgCiAgIGl0ICJzaG91bGQgd3JpdGUgdGhlIHNldCBoZWFkZXIiIGRvCiAgICAgQHByb3Qud3JpdGVfc2V0X2JlZ2luKFRocmlmdDo6VHlwZXM6OkkxNiwgNDIpCi0gICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09IFtUaHJpZnQ6OlR5cGVzOjpJMTYsIDQyXS5wYWNrKCJjTiIpCisgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcShbVGhyaWZ0OjpUeXBlczo6STE2LCA0Ml0ucGFjaygiY04iKSkKICAgZW5kCiAgIAogICBpdCAic2hvdWxkIHdyaXRlIGEgYm9vbCIgZG8KICAgICBAcHJvdC53cml0ZV9ib29sKHRydWUpCiAgICAgQHByb3Qud3JpdGVfYm9vbChmYWxzZSkKLSAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIlwwMDFcMDAwIgorICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlwwMDFcMDAwIikKICAgZW5kCiAgIAogICBpdCAic2hvdWxkIHRyZWF0IGEgbmlsIGJvb2wgYXMgZmFsc2UiIGRvCiAgICAgQHByb3Qud3JpdGVfYm9vbChuaWwpCi0gICAgQHRyYW5zLnJlYWQoMSkuc2hvdWxkID09ICJcMDAwIgorICAgIGV4cGVjdChAdHJhbnMucmVhZCgxKSkudG8gZXEoIlwwMDAiKQogICBlbmQKICAgCiAgIGl0ICJzaG91bGQgd3JpdGUgYSBieXRlIiBkbwogICAgICMgYnl0ZSBpcyBzbWFsbCBlbm91Z2gsIGxldCdzIGNoZWNrIC0xMjguLjEyNwogICAgICgtMTI4Li4xMjcpLmVhY2ggZG8gfGl8CiAgICAgICBAcHJvdC53cml0ZV9ieXRlKGkpCi0gICAgICBAdHJhbnMucmVhZCgxKS5zaG91bGQgPT0gW2ldLnBhY2soJ2MnKQorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKDEpKS50byBlcShbaV0ucGFjaygnYycpKQogICAgIGVuZAotICAgICMgaGFuZGluZyBpdCBudW1iZXJzIG91dCBvZiBzaWduZWQgcmFuZ2Ugc2hvdWxkIGNsaXAKLSAgICBAdHJhbnMucnNwZWNfdmVyaWZ5CisgIGVuZAorCisgIGl0ICJzaG91bGQgY2xpcCBudW1iZXJzIG91dCBvZiBzaWduZWQgcmFuZ2UiIGRvCiAgICAgKDEyOC4uMjU1KS5lYWNoIGRvIHxpfAogICAgICAgQHByb3Qud3JpdGVfYnl0ZShpKQotICAgICAgQHRyYW5zLnJlYWQoMSkuc2hvdWxkID09IFtpXS5wYWNrKCdjJykKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZCgxKSkudG8gZXEoW2ldLnBhY2soJ2MnKSkKICAgICBlbmQKLSAgICAjIGFuZCBsYXN0bHksIGEgQmlnbnVtIGlzIGdvaW5nIHRvIGVycm9yIG91dAotICAgIGxhbWJkYSB7IEBwcm90LndyaXRlX2J5dGUoMioqNjUpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFJhbmdlRXJyb3IpCisgIGVuZAorCisgIGl0ICJlcnJvcnMgb3V0IHdpdGggYSBCaWdudW0iIGRvCisgICAgZXhwZWN0IHsgQHByb3Qud3JpdGVfYnl0ZSgyKio2NSkgfS50byByYWlzZV9lcnJvcihSYW5nZUVycm9yKQogICBlbmQKICAgCiAgIGl0ICJzaG91bGQgZXJyb3IgZ3JhY2VmdWxseSB3aGVuIHRyeWluZyB0byB3cml0ZSBhIG5pbCBieXRlIiBkbwotICAgIGxhbWJkYSB7IEBwcm90LndyaXRlX2J5dGUobmlsKSB9LnNob3VsZCByYWlzZV9lcnJvcgorICAgIGV4cGVjdCB7IEBwcm90LndyaXRlX2J5dGUobmlsKSB9LnRvIHJhaXNlX2Vycm9yCiAgIGVuZAogICAKICAgaXQgInNob3VsZCB3cml0ZSBhbiBpMTYiIGRvCkBAIC0xMzEsMTQgKzEzNCwxNCBAQAogICAgICMgYW5kIHRyeSBzb21ldGhpbmcgb3V0IG9mIHNpZ25lZCByYW5nZSwgaXQgc2hvdWxkIGNsaXAKICAgICBAcHJvdC53cml0ZV9pMTYoMioqMTUgKyA1KQogICAgIAotICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiXDIwMFwwMDBcMzc0XDAwMFwwMDBcMDIxXDAwMFwwMDBcMzMwXDM2MFwwMDZcMjczXDE3N1wzNzdcMjAwXDAwNSIKKyAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJcMjAwXDAwMFwzNzRcMDAwXDAwMFwwMjFcMDAwXDAwMFwzMzBcMzYwXDAwNlwyNzNcMTc3XDM3N1wyMDBcMDA1IikKICAgICAKICAgICAjIGEgQmlnbnVtIHNob3VsZCBlcnJvcgogICAgICMgbGFtYmRhIHsgQHByb3Qud3JpdGVfaTE2KDIqKjY1KSB9LnNob3VsZCByYWlzZV9lcnJvcihSYW5nZUVycm9yKQogICBlbmQKICAgCiAgIGl0ICJzaG91bGQgZXJyb3IgZ3JhY2VmdWxseSB3aGVuIHRyeWluZyB0byB3cml0ZSBhIG5pbCBpMTYiIGRvCi0gICAgbGFtYmRhIHsgQHByb3Qud3JpdGVfaTE2KG5pbCkgfS5zaG91bGQgcmFpc2VfZXJyb3IKKyAgICBleHBlY3QgeyBAcHJvdC53cml0ZV9pMTYobmlsKSB9LnRvIHJhaXNlX2Vycm9yCiAgIGVuZAogICAKICAgaXQgInNob3VsZCB3cml0ZSBhbiBpMzIiIGRvCkBAIC0xNDgsMTQgKzE1MSwxNCBAQAogICAgICAgQHByb3Qud3JpdGVfaTMyKGkpCiAgICAgZW5kCiAgICAgIyB0cnkgc29tZXRoaW5nIG91dCBvZiBzaWduZWQgcmFuZ2UsIGl0IHNob3VsZCBjbGlwCi0gICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJcMjAwXDAwMFwwMDBcMDAwIiArICJcMzc3XDM3NlwwMzdcciIgKyAiXDM3N1wzNzdcMzY2XDAzNCIgKyAiXDM3N1wzNzdcMzc3XDM3NSIgKyAiXDAwMFwwMDBcMDAwXDAwMCIgKyAiXDAwMCNcMzQwXDIwMyIgKyAiXDAwMFwwMDAwKyIgKyAiXDE3N1wzNzdcMzc3XDM3NyIKKyAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJcMjAwXDAwMFwwMDBcMDAwIiArICJcMzc3XDM3NlwwMzdcciIgKyAiXDM3N1wzNzdcMzY2XDAzNCIgKyAiXDM3N1wzNzdcMzc3XDM3NSIgKyAiXDAwMFwwMDBcMDAwXDAwMCIgKyAiXDAwMCNcMzQwXDIwMyIgKyAiXDAwMFwwMDAwKyIgKyAiXDE3N1wzNzdcMzc3XDM3NyIpCiAgICAgWzIgKiogMzEgKyA1LCAyICoqIDY1ICsgNV0uZWFjaCBkbyB8aXwKLSAgICAgIGxhbWJkYSB7IEBwcm90LndyaXRlX2kzMihpKSB9LnNob3VsZCByYWlzZV9lcnJvcihSYW5nZUVycm9yKSAgCisgICAgICBleHBlY3QgeyBAcHJvdC53cml0ZV9pMzIoaSkgfS50byByYWlzZV9lcnJvcihSYW5nZUVycm9yKSAgCiAgICAgZW5kCiAgIGVuZAogICAKICAgaXQgInNob3VsZCBlcnJvciBncmFjZWZ1bGx5IHdoZW4gdHJ5aW5nIHRvIHdyaXRlIGEgbmlsIGkzMiIgZG8KLSAgICBsYW1iZGEgeyBAcHJvdC53cml0ZV9pMzIobmlsKSB9LnNob3VsZCByYWlzZV9lcnJvcgorICAgIGV4cGVjdCB7IEBwcm90LndyaXRlX2kzMihuaWwpIH0udG8gcmFpc2VfZXJyb3IKICAgZW5kCiAgIAogICBpdCAic2hvdWxkIHdyaXRlIGFuIGk2NCIgZG8KQEAgLTE2NSw3ICsxNjgsNyBAQAogICAgICAgQHByb3Qud3JpdGVfaTY0KGkpCiAgICAgZW5kCiAgICAgIyB0cnkgc29tZXRoaW5nIG91dCBvZiBzaWduZWQgcmFuZ2UsIGl0IHNob3VsZCBjbGlwCi0gICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09IFsiXDIwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDAiLAorICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoWyJcMjAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMCIsCiAgICAgICAiXDM3N1wzNzdcMzY0XDMwM1wwMzVcMjQ0K10iLAogICAgICAgIlwzNzdcMzc3XDM3N1wzNzdcMzc2XDIzMTpcMzQxIiwKICAgICAgICJcMzc3XDM3N1wzNzdcMzc3XDM3N1wzNzdcMzc3XDAyNiIsCkBAIC0xNzMsMTIgKzE3NiwxMiBAQAogICAgICAgIlwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDRcMzE3IiwKICAgICAgICJcMDAwXDAwMFwwMDBcMDAwXDAwMCNcMzQwXDIwNCIsCiAgICAgICAiXDAwMFwwMDBcMDAwXDAwMlwzNDBcMzExflwzNjUiLAotICAgICAgIlwxNzdcMzc3XDM3N1wzNzdcMzc3XDM3N1wzNzdcMzc3Il0uam9pbigiIikKLSAgICBsYW1iZGEgeyBAcHJvdC53cml0ZV9pNjQoMiAqKiA2NSArIDUpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFJhbmdlRXJyb3IpCisgICAgICAiXDE3N1wzNzdcMzc3XDM3N1wzNzdcMzc3XDM3N1wzNzciXS5qb2luKCIiKSkKKyAgICBleHBlY3QgeyBAcHJvdC53cml0ZV9pNjQoMiAqKiA2NSArIDUpIH0udG8gcmFpc2VfZXJyb3IoUmFuZ2VFcnJvcikKICAgZW5kCiAgIAogICBpdCAic2hvdWxkIGVycm9yIGdyYWNlZnVsbHkgd2hlbiB0cnlpbmcgdG8gd3JpdGUgYSBuaWwgaTY0IiBkbwotICAgIGxhbWJkYSB7IEBwcm90LndyaXRlX2k2NChuaWwpIH0uc2hvdWxkIHJhaXNlX2Vycm9yCisgICAgZXhwZWN0IHsgQHByb3Qud3JpdGVfaTY0KG5pbCkgfS50byByYWlzZV9lcnJvcgogICBlbmQKICAgCiAgIGl0ICJzaG91bGQgd3JpdGUgYSBkb3VibGUiIGRvCkBAIC0xODYsMTIgKzE4OSwxMiBAQAogICAgIHZhbHVlcyA9IFtGbG9hdDo6TUlOLC0xMjMxLjE1MzI1LCAtMTIzMTIzLjIzLCAtMjMuMjM1MTUxMjMsIDAsIDEyMzUxLjEzMjUsIDUyMy4yMywgRmxvYXQ6Ok1BWF0KICAgICB2YWx1ZXMuZWFjaCBkbyB8ZnwKICAgICAgIEBwcm90LndyaXRlX2RvdWJsZShmKQotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09IFtmXS5wYWNrKCJHIikKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoW2ZdLnBhY2soIkciKSkKICAgICBlbmQKICAgZW5kCiAgIAogICBpdCAic2hvdWxkIGVycm9yIGdyYWNlZnVsbHkgd2hlbiB0cnlpbmcgdG8gd3JpdGUgYSBuaWwgZG91YmxlIiBkbwotICAgIGxhbWJkYSB7IEBwcm90LndyaXRlX2RvdWJsZShuaWwpIH0uc2hvdWxkIHJhaXNlX2Vycm9yCisgICAgZXhwZWN0IHsgQHByb3Qud3JpdGVfZG91YmxlKG5pbCkgfS50byByYWlzZV9lcnJvcgogICBlbmQKIAogICBpZiBSVUJZX1ZFUlNJT04gPj0gJzEuOScKQEAgLTE5OSwxMTEgKzIwMiwxMTEgQEAKICAgICAgIHN0ciA9ICdhYmMnCiAgICAgICBAcHJvdC53cml0ZV9zdHJpbmcoc3RyKQogICAgICAgYSA9IEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpCi0gICAgICBhLmVuY29kaW5nLnNob3VsZCA9PSBFbmNvZGluZzo6QklOQVJZCi0gICAgICBhLnVucGFjaygnQyonKS5zaG91bGQgPT0gWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4NjEsIDB4NjIsIDB4NjNdCisgICAgICBleHBlY3QoYS5lbmNvZGluZykudG8gZXEoRW5jb2Rpbmc6OkJJTkFSWSkKKyAgICAgIGV4cGVjdChhLnVucGFjaygnQyonKSkudG8gZXEoWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4NjEsIDB4NjIsIDB4NjNdKQogICAgIGVuZAogCiAgICAgaXQgJ3Nob3VsZCB3cml0ZSBhIHN0cmluZyB3aXRoIHVuaWNvZGUgY2hhcmFjdGVycycgZG8KICAgICAgIHN0ciA9ICJhYmMgXHUyMEFDIFx1MjBBRCIuZW5jb2RlKCdVVEYtOCcpCiAgICAgICBAcHJvdC53cml0ZV9zdHJpbmcoc3RyKQogICAgICAgYSA9IEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpCi0gICAgICBhLmVuY29kaW5nLnNob3VsZCA9PSBFbmNvZGluZzo6QklOQVJZCi0gICAgICBhLnVucGFjaygnQyonKS5zaG91bGQgPT0gWzB4MDAsIDB4MDAsIDB4MDAsIDB4MEIsIDB4NjEsIDB4NjIsIDB4NjMsIDB4MjAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTIsIDB4ODIsIDB4QUMsIDB4MjAsIDB4RTIsIDB4ODIsIDB4QURdCisgICAgICBleHBlY3QoYS5lbmNvZGluZykudG8gZXEoRW5jb2Rpbmc6OkJJTkFSWSkKKyAgICAgIGV4cGVjdChhLnVucGFjaygnQyonKSkudG8gZXEoWzB4MDAsIDB4MDAsIDB4MDAsIDB4MEIsIDB4NjEsIDB4NjIsIDB4NjMsIDB4MjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RTIsIDB4ODIsIDB4QUMsIDB4MjAsIDB4RTIsIDB4ODIsIDB4QURdKQogICAgIGVuZAogCiAgICAgaXQgJ3Nob3VsZCB3cml0ZSBzaG91bGQgd3JpdGUgYSBzdHJpbmcgd2l0aCB1bmljb2RlIGNoYXJhY3RlcnMgYW5kIHRyYW5zY29kaW5nJyBkbwogICAgICAgc3RyID0gImFiYyBcdTIwQUMiLmVuY29kZSgnSVNPLTg4NTktMTUnKQogICAgICAgQHByb3Qud3JpdGVfc3RyaW5nKHN0cikKICAgICAgIGEgPSBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKQotICAgICAgYS5lbmNvZGluZy5zaG91bGQgPT0gRW5jb2Rpbmc6OkJJTkFSWQotICAgICAgYS51bnBhY2soJ0MqJykuc2hvdWxkID09IFsweDAwLCAweDAwLCAweDAwLCAweDA3LCAweDYxLCAweDYyLCAweDYzLCAweDIwLCAweEUyLCAweDgyLCAweEFDXQorICAgICAgZXhwZWN0KGEuZW5jb2RpbmcpLnRvIGVxKEVuY29kaW5nOjpCSU5BUlkpCisgICAgICBleHBlY3QoYS51bnBhY2soJ0MqJykpLnRvIGVxKFsweDAwLCAweDAwLCAweDAwLCAweDA3LCAweDYxLCAweDYyLCAweDYzLCAweDIwLCAweEUyLCAweDgyLCAweEFDXSkKICAgICBlbmQKIAogICAgIGl0ICdzaG91bGQgd3JpdGUgYSBiaW5hcnkgc3RyaW5nJyBkbwogICAgICAgYnVmZmVyID0gWzAsIDEsIDIsIDNdLnBhY2soJ0MqJykKICAgICAgIEBwcm90LndyaXRlX2JpbmFyeShidWZmZXIpCiAgICAgICBhID0gQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkKLSAgICAgIGEuZW5jb2Rpbmcuc2hvdWxkID09IEVuY29kaW5nOjpCSU5BUlkKLSAgICAgIGEudW5wYWNrKCdDKicpLnNob3VsZCA9PSBbMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMSwgMHgwMiwgMHgwM10KKyAgICAgIGV4cGVjdChhLmVuY29kaW5nKS50byBlcShFbmNvZGluZzo6QklOQVJZKQorICAgICAgZXhwZWN0KGEudW5wYWNrKCdDKicpKS50byBlcShbMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMSwgMHgwMiwgMHgwM10pCiAgICAgZW5kCiAgIGVsc2UKICAgICBpdCAnc2hvdWxkIHdyaXRlIGEgc3RyaW5nJyBkbwogICAgICAgc3RyID0gJ2FiYycKICAgICAgIEBwcm90LndyaXRlX3N0cmluZyhzdHIpCiAgICAgICBhID0gQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkKLSAgICAgIGEudW5wYWNrKCdDKicpLnNob3VsZCA9PSBbMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywgMHg2MSwgMHg2MiwgMHg2M10KKyAgICAgIGV4cGVjdChhLnVucGFjaygnQyonKSkudG8gZXEoWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4NjEsIDB4NjIsIDB4NjNdKQogICAgIGVuZAogCiAgICAgaXQgJ3Nob3VsZCB3cml0ZSBhIGJpbmFyeSBzdHJpbmcnIGRvCiAgICAgICBidWZmZXIgPSBbMCwgMSwgMiwgM10ucGFjaygnQyonKQogICAgICAgQHByb3Qud3JpdGVfYmluYXJ5KGJ1ZmZlcikKICAgICAgIGEgPSBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKQotICAgICAgYS51bnBhY2soJ0MqJykuc2hvdWxkID09IFsweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAxLCAweDAyLCAweDAzXQorICAgICAgZXhwZWN0KGEudW5wYWNrKCdDKicpKS50byBlcShbMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMSwgMHgwMiwgMHgwM10pCiAgICAgZW5kCiAgIGVuZAogCiAgIGl0ICJzaG91bGQgZXJyb3IgZ3JhY2VmdWxseSB3aGVuIHRyeWluZyB0byB3cml0ZSBhIG5pbCBzdHJpbmciIGRvCi0gICAgbGFtYmRhIHsgQHByb3Qud3JpdGVfc3RyaW5nKG5pbCkgfS5zaG91bGQgcmFpc2VfZXJyb3IKKyAgICBleHBlY3QgeyBAcHJvdC53cml0ZV9zdHJpbmcobmlsKSB9LnRvIHJhaXNlX2Vycm9yCiAgIGVuZAogICAKICAgaXQgInNob3VsZCB3cml0ZSB0aGUgbWVzc2FnZSBoZWFkZXIgd2l0aG91dCB2ZXJzaW9uIHdoZW4gd3JpdGVzIGFyZSBub3Qgc3RyaWN0IiBkbwogICAgIEBwcm90ID0gcHJvdG9jb2xfY2xhc3MubmV3KEB0cmFucywgdHJ1ZSwgZmFsc2UpICMgbm8gc3RyaWN0IHdyaXRlCiAgICAgQHByb3Qud3JpdGVfbWVzc2FnZV9iZWdpbigndGVzdE1lc3NhZ2UnLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6Q0FMTCwgMTcpCi0gICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJcMDAwXDAwMFwwMDBcdnRlc3RNZXNzYWdlXDAwMVwwMDBcMDAwXDAwMFwwMjEiCisgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXDAwMFwwMDBcMDAwXHZ0ZXN0TWVzc2FnZVwwMDFcMDAwXDAwMFwwMDBcMDIxIikKICAgZW5kCiAgICAgCiAgIGl0ICJzaG91bGQgd3JpdGUgdGhlIG1lc3NhZ2UgaGVhZGVyIHdpdGggYSB2ZXJzaW9uIHdoZW4gd3JpdGVzIGFyZSBzdHJpY3QiIGRvCiAgICAgQHByb3QgPSBwcm90b2NvbF9jbGFzcy5uZXcoQHRyYW5zKSAjIHN0cmljdCB3cml0ZQogICAgIEBwcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oJ3Rlc3RNZXNzYWdlJywgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkNBTEwsIDE3KQotICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiXDIwMFwwMDFcMDAwXDAwMVwwMDBcMDAwXDAwMFx2dGVzdE1lc3NhZ2VcMDAwXDAwMFwwMDBcMDIxIgorICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlwyMDBcMDAxXDAwMFwwMDFcMDAwXDAwMFwwMDBcdnRlc3RNZXNzYWdlXDAwMFwwMDBcMDAwXDAyMSIpCiAgIGVuZAogICAKICAgIyBtZXNzYWdlIGZvb3RlciBpcyBhIG5vb3AKICAgCiAgIGl0ICJzaG91bGQgcmVhZCBhIGZpZWxkIGhlYWRlciIgZG8KICAgICBAdHJhbnMud3JpdGUoW1RocmlmdDo6VHlwZXM6OlNUUklORywgM10ucGFjaygiY24iKSkKLSAgICBAcHJvdC5yZWFkX2ZpZWxkX2JlZ2luLnNob3VsZCA9PSBbbmlsLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDNdCisgICAgZXhwZWN0KEBwcm90LnJlYWRfZmllbGRfYmVnaW4pLnRvIGVxKFtuaWwsIFRocmlmdDo6VHlwZXM6OlNUUklORywgM10pCiAgIGVuZAogICAKICAgIyBmaWVsZCBmb290ZXIgaXMgYSBub29wCiAgIAogICBpdCAic2hvdWxkIHJlYWQgYSBzdG9wIGZpZWxkIiBkbwogICAgIEB0cmFucy53cml0ZShbVGhyaWZ0OjpUeXBlczo6U1RPUF0ucGFjaygiYyIpKTsKLSAgICBAcHJvdC5yZWFkX2ZpZWxkX2JlZ2luLnNob3VsZCA9PSBbbmlsLCBUaHJpZnQ6OlR5cGVzOjpTVE9QLCAwXQorICAgIGV4cGVjdChAcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKS50byBlcShbbmlsLCBUaHJpZnQ6OlR5cGVzOjpTVE9QLCAwXSkKICAgZW5kCiAKICAgaXQgInNob3VsZCByZWFkIGEgbWFwIGhlYWRlciIgZG8KICAgICBAdHJhbnMud3JpdGUoW1RocmlmdDo6VHlwZXM6OkRPVUJMRSwgVGhyaWZ0OjpUeXBlczo6STY0LCA0Ml0ucGFjaygiY2NOIikpCi0gICAgQHByb3QucmVhZF9tYXBfYmVnaW4uc2hvdWxkID09IFtUaHJpZnQ6OlR5cGVzOjpET1VCTEUsIFRocmlmdDo6VHlwZXM6Okk2NCwgNDJdCisgICAgZXhwZWN0KEBwcm90LnJlYWRfbWFwX2JlZ2luKS50byBlcShbVGhyaWZ0OjpUeXBlczo6RE9VQkxFLCBUaHJpZnQ6OlR5cGVzOjpJNjQsIDQyXSkKICAgZW5kCiAgIAogICAjIG1hcCBmb290ZXIgaXMgYSBub29wCiAgIAogICBpdCAic2hvdWxkIHJlYWQgYSBsaXN0IGhlYWRlciIgZG8KICAgICBAdHJhbnMud3JpdGUoW1RocmlmdDo6VHlwZXM6OlNUUklORywgMTddLnBhY2soImNOIikpCi0gICAgQHByb3QucmVhZF9saXN0X2JlZ2luLnNob3VsZCA9PSBbVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAxN10KKyAgICBleHBlY3QoQHByb3QucmVhZF9saXN0X2JlZ2luKS50byBlcShbVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAxN10pCiAgIGVuZAogICAKICAgIyBsaXN0IGZvb3RlciBpcyBhIG5vb3AKICAgCiAgIGl0ICJzaG91bGQgcmVhZCBhIHNldCBoZWFkZXIiIGRvCiAgICAgQHRyYW5zLndyaXRlKFtUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDE3XS5wYWNrKCJjTiIpKQotICAgIEBwcm90LnJlYWRfc2V0X2JlZ2luLnNob3VsZCA9PSBbVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAxN10KKyAgICBleHBlY3QoQHByb3QucmVhZF9zZXRfYmVnaW4pLnRvIGVxKFtUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDE3XSkKICAgZW5kCiAgIAogICAjIHNldCBmb290ZXIgaXMgYSBub29wCiAgIAogICBpdCAic2hvdWxkIHJlYWQgYSBib29sIiBkbwogICAgIEB0cmFucy53cml0ZSgiXDAwMVwwMDAiKTsKLSAgICBAcHJvdC5yZWFkX2Jvb2wuc2hvdWxkID09IHRydWUKLSAgICBAcHJvdC5yZWFkX2Jvb2wuc2hvdWxkID09IGZhbHNlCisgICAgZXhwZWN0KEBwcm90LnJlYWRfYm9vbCkudG8gZXEodHJ1ZSkKKyAgICBleHBlY3QoQHByb3QucmVhZF9ib29sKS50byBlcShmYWxzZSkKICAgZW5kCiAgIAogICBpdCAic2hvdWxkIHJlYWQgYSBieXRlIiBkbwogICAgIFstMTI4LCAtNTcsIC0zLCAwLCAxNywgMjQsIDEyN10uZWFjaCBkbyB8aXwKICAgICAgIEB0cmFucy53cml0ZShbaV0ucGFjaygiYyIpKQotICAgICAgQHByb3QucmVhZF9ieXRlLnNob3VsZCA9PSBpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9ieXRlKS50byBlcShpKQogICAgIGVuZAogICBlbmQKICAgCkBAIC0zMTEsNyArMzE0LDcgQEAKICAgICAjIHRyeSBhIHNjYXR0ZXJpbmcgb2YgdmFsdWVzLCBpbmNsdWRpbmcgbWluL21heAogICAgIFstMioqMTUsIC01MjM3LCAtMzUzLCAwLCAxNTI3LCAyMjM0LCAyKioxNS0xXS5lYWNoIGRvIHxpfAogICAgICAgQHRyYW5zLndyaXRlKFtpXS5wYWNrKCJuIikpOwotICAgICAgQHByb3QucmVhZF9pMTYuc2hvdWxkID09IGkKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2kxNikudG8gZXEoaSkKICAgICBlbmQKICAgZW5kCiAgIApAQCAtMzE5LDcgKzMyMiw3IEBACiAgICAgIyB0cnkgYSBzY2F0dGVyaW5nIG9mIHZhbHVlcywgaW5jbHVkaW5nIG1pbi9tYXgKICAgICBbLTIqKjMxLCAtMjM1MTI1LCAtNjIzNiwgMCwgMjM1MSwgMTIzMTIzLCAyKiozMS0xXS5lYWNoIGRvIHxpfAogICAgICAgQHRyYW5zLndyaXRlKFtpXS5wYWNrKCJOIikpCi0gICAgICBAcHJvdC5yZWFkX2kzMi5zaG91bGQgPT0gaQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfaTMyKS50byBlcShpKQogICAgIGVuZAogICBlbmQKICAgCkBAIC0zMjcsNyArMzMwLDcgQEAKICAgICAjIHRyeSBhIHNjYXR0ZXJpbmcgb2YgdmFsdWVzLCBpbmNsdWRpbmcgbWluL21heAogICAgIFstMioqNjMsIC0xMjM1MTIzMTIsIC02MzQ2LCAwLCAzMiwgMjM0NjMyMjMyMywgMioqNjMtMV0uZWFjaCBkbyB8aXwKICAgICAgIEB0cmFucy53cml0ZShbaSA+PiAzMiwgaSAmIDB4RkZGRkZGRkZdLnBhY2soIk5OIikpCi0gICAgICBAcHJvdC5yZWFkX2k2NC5zaG91bGQgPT0gaQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfaTY0KS50byBlcShpKQogICAgIGVuZAogICBlbmQKICAgCkBAIC0zMzUsNyArMzM4LDcgQEAKICAgICAjIHRyeSBhIHJhbmRvbSBzY2F0dGVyaW5nIG9mIHZhbHVlcywgaW5jbHVkaW5nIG1pbi9tYXgKICAgICBbRmxvYXQ6Ok1JTiwgLTIzMTIzMS4xMjM1MSwgLTMyMy4yMzM1MTMsIDAsIDEyMy4yMzUxMjM1LCAyMzUxMjM1LjEyMzUxMjM1LCBGbG9hdDo6TUFYXS5lYWNoIGRvIHxmfAogICAgICAgQHRyYW5zLndyaXRlKFtmXS5wYWNrKCJHIikpOwotICAgICAgQHByb3QucmVhZF9kb3VibGUuc2hvdWxkID09IGYKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2RvdWJsZSkudG8gZXEoZikKICAgICBlbmQKICAgZW5kCiAKQEAgLTM0NSw4ICszNDgsOCBAQAogICAgICAgYnVmZmVyID0gWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4NjEsIDB4NjIsIDB4NjNdLnBhY2soJ0MqJykKICAgICAgIEB0cmFucy53cml0ZShidWZmZXIpCiAgICAgICBhID0gQHByb3QucmVhZF9zdHJpbmcKLSAgICAgIGEuc2hvdWxkID09ICdhYmMnLmVuY29kZSgnVVRGLTgnKQotICAgICAgYS5lbmNvZGluZy5zaG91bGQgPT0gRW5jb2Rpbmc6OlVURl84CisgICAgICBleHBlY3QoYSkudG8gZXEoJ2FiYycuZW5jb2RlKCdVVEYtOCcpKQorICAgICAgZXhwZWN0KGEuZW5jb2RpbmcpLnRvIGVxKEVuY29kaW5nOjpVVEZfOCkKICAgICBlbmQKIAogICAgIGl0ICdzaG91bGQgcmVhZCBhIHN0cmluZyBjb250YWluaW5nIHVuaWNvZGUgY2hhcmFjdGVycyBmcm9tIFVURi04IGVuY29kZWQgYnVmZmVyJyBkbwpAQCAtMzU0LDQ0ICszNTcsNDQgQEAKICAgICAgIGJ1ZmZlciA9IFsweDAwLCAweDAwLCAweDAwLCAweDAzLCAweEUyLCAweDgyLCAweEFDXS5wYWNrKCdDKicpCiAgICAgICBAdHJhbnMud3JpdGUoYnVmZmVyKQogICAgICAgYSA9IEBwcm90LnJlYWRfc3RyaW5nCi0gICAgICBhLnNob3VsZCA9PSAiXHUyMEFDIi5lbmNvZGUoJ1VURi04JykKLSAgICAgIGEuZW5jb2Rpbmcuc2hvdWxkID09IEVuY29kaW5nOjpVVEZfOAorICAgICAgZXhwZWN0KGEpLnRvIGVxKCJcdTIwQUMiLmVuY29kZSgnVVRGLTgnKSkKKyAgICAgIGV4cGVjdChhLmVuY29kaW5nKS50byBlcShFbmNvZGluZzo6VVRGXzgpCiAgICAgZW5kCiAKICAgICBpdCAnc2hvdWxkIHJlYWQgYSBiaW5hcnkgc3RyaW5nJyBkbwogICAgICAgYnVmZmVyID0gWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDNdLnBhY2soJ0MqJykKICAgICAgIEB0cmFucy53cml0ZShidWZmZXIpCiAgICAgICBhID0gQHByb3QucmVhZF9iaW5hcnkKLSAgICAgIGEuc2hvdWxkID09IFsweDAwLCAweDAxLCAweDAyLCAweDAzXS5wYWNrKCdDKicpCi0gICAgICBhLmVuY29kaW5nLnNob3VsZCA9PSBFbmNvZGluZzo6QklOQVJZCisgICAgICBleHBlY3QoYSkudG8gZXEoWzB4MDAsIDB4MDEsIDB4MDIsIDB4MDNdLnBhY2soJ0MqJykpCisgICAgICBleHBlY3QoYS5lbmNvZGluZykudG8gZXEoRW5jb2Rpbmc6OkJJTkFSWSkKICAgICBlbmQKICAgZWxzZQogICAgIGl0ICdzaG91bGQgcmVhZCBhIHN0cmluZycgZG8KICAgICAgICMgaTMyIG9mIHZhbHVlIDMsIGZvbGxvd2VkIGJ5IHRocmVlIGNoYXJhY3RlcnMvVVRGLTggYnl0ZXMgJ2EnLCAnYicsICdjJwogICAgICAgYnVmZmVyID0gWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4NjEsIDB4NjIsIDB4NjNdLnBhY2soJ0MqJykKICAgICAgIEB0cmFucy53cml0ZShidWZmZXIpCi0gICAgICBAcHJvdC5yZWFkX3N0cmluZy5zaG91bGQgPT0gJ2FiYycKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX3N0cmluZykudG8gZXEoJ2FiYycpCiAgICAgZW5kCiAKICAgICBpdCAnc2hvdWxkIHJlYWQgYSBiaW5hcnkgc3RyaW5nJyBkbwogICAgICAgYnVmZmVyID0gWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDNdLnBhY2soJ0MqJykKICAgICAgIEB0cmFucy53cml0ZShidWZmZXIpCiAgICAgICBhID0gQHByb3QucmVhZF9iaW5hcnkKLSAgICAgIGEuc2hvdWxkID09IFsweDAwLCAweDAxLCAweDAyLCAweDAzXS5wYWNrKCdDKicpCisgICAgICBleHBlY3QoYSkudG8gZXEoWzB4MDAsIDB4MDEsIDB4MDIsIDB4MDNdLnBhY2soJ0MqJykpCiAgICAgZW5kCiAgIGVuZAogCiAgIGl0ICJzaG91bGQgcGVyZm9ybSBhIGNvbXBsZXRlIHJwYyB3aXRoIG5vIGFyZ3Mgb3IgcmV0dXJuIiBkbwogICAgIHNydl90ZXN0KAogICAgICAgcHJvYyB7fGNsaWVudHwgY2xpZW50LnNlbmRfdm9pZE1ldGhvZCgpfSwKLSAgICAgIHByb2Mge3xjbGllbnR8IGNsaWVudC5yZWN2X3ZvaWRNZXRob2Quc2hvdWxkID09IG5pbH0KKyAgICAgIHByb2Mge3xjbGllbnR8IGV4cGVjdChjbGllbnQucmVjdl92b2lkTWV0aG9kKS50byBlcShuaWwpfQogICAgICkKICAgZW5kCiAKICAgaXQgInNob3VsZCBwZXJmb3JtIGEgY29tcGxldGUgcnBjIHdpdGggYSBwcmltaXRpdmUgcmV0dXJuIHR5cGUiIGRvCiAgICAgc3J2X3Rlc3QoCiAgICAgICBwcm9jIHt8Y2xpZW50fCBjbGllbnQuc2VuZF9wcmltaXRpdmVNZXRob2QoKX0sCi0gICAgICBwcm9jIHt8Y2xpZW50fCBjbGllbnQucmVjdl9wcmltaXRpdmVNZXRob2Quc2hvdWxkID09IDF9CisgICAgICBwcm9jIHt8Y2xpZW50fCBleHBlY3QoY2xpZW50LnJlY3ZfcHJpbWl0aXZlTWV0aG9kKS50byBlcSgxKX0KICAgICApCiAgIGVuZAogCkBAIC00MDIsNyArNDA1LDcgQEAKICAgICAgICAgcmVzdWx0ID0gY2xpZW50LnJlY3Zfc3RydWN0TWV0aG9kCiAgICAgICAgIHJlc3VsdC5zZXRfYnl0ZV9tYXAgPSBuaWwKICAgICAgICAgcmVzdWx0Lm1hcF9ieXRlX21hcCA9IG5pbAotICAgICAgICByZXN1bHQuc2hvdWxkID09IEZpeHR1cmVzOjpDT01QQUNUX1BST1RPQ09MX1RFU1RfU1RSVUNUCisgICAgICAgIGV4cGVjdChyZXN1bHQpLnRvIGVxKEZpeHR1cmVzOjpDT01QQUNUX1BST1RPQ09MX1RFU1RfU1RSVUNUKQogICAgICAgfQogICAgICkKICAgZW5kCkBAIC00MjMsOSArNDI2LDkgQEAKICAgICBjbGllbnRwcm90byA9IHByb3RvY29sX2NsYXNzLm5ldyhjbGllbnRzaWRlKQogICAgIHNlcnZlcnByb3RvID0gcHJvdG9jb2xfY2xhc3MubmV3KHNlcnZlcnNpZGUpCiAKLSAgICBwcm9jZXNzb3IgPSBTcnY6OlByb2Nlc3Nvci5uZXcoU3J2SGFuZGxlci5uZXcpCisgICAgcHJvY2Vzc29yID0gVGhyaWZ0OjpUZXN0OjpTcnY6OlByb2Nlc3Nvci5uZXcoU3J2SGFuZGxlci5uZXcpCiAKLSAgICBjbGllbnQgPSBTcnY6OkNsaWVudC5uZXcoY2xpZW50cHJvdG8sIGNsaWVudHByb3RvKQorICAgIGNsaWVudCA9IFRocmlmdDo6VGVzdDo6U3J2OjpDbGllbnQubmV3KGNsaWVudHByb3RvLCBjbGllbnRwcm90bykKIAogICAgICMgZmlyc3QgYmxvY2sKICAgICBmaXJzdGJsb2NrLmNhbGwoY2xpZW50KQpkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvYnl0ZXNfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL2J5dGVzX3NwZWMucmIKaW5kZXggYjgyZTMwNC4uMmU4NjUzYyAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvYnl0ZXNfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy9ieXRlc19zcGVjLnJiCkBAIC0yNSwzMyArMjUsMzMgQEAKICAgICBkZXNjcmliZSAnLmVtcHR5X2J5dGVfYnVmZmVyJyBkbwogICAgICAgaXQgJ3Nob3VsZCBjcmVhdGUgYW4gZW1wdHkgYnVmZmVyJyBkbwogICAgICAgICBiID0gVGhyaWZ0OjpCeXRlcy5lbXB0eV9ieXRlX2J1ZmZlcgotICAgICAgICBiLmxlbmd0aC5zaG91bGQgPT0gMAotICAgICAgICBiLmVuY29kaW5nLnNob3VsZCA9PSBFbmNvZGluZzo6QklOQVJZCisgICAgICAgIGV4cGVjdChiLmxlbmd0aCkudG8gZXEoMCkKKyAgICAgICAgZXhwZWN0KGIuZW5jb2RpbmcpLnRvIGVxKEVuY29kaW5nOjpCSU5BUlkpCiAgICAgICBlbmQKIAogICAgICAgaXQgJ3Nob3VsZCBjcmVhdGUgYW4gZW1wdHkgYnVmZmVyIG9mIGdpdmVuIHNpemUnIGRvCiAgICAgICAgIGIgPSBUaHJpZnQ6OkJ5dGVzLmVtcHR5X2J5dGVfYnVmZmVyIDIKLSAgICAgICAgYi5sZW5ndGguc2hvdWxkID09IDIKLSAgICAgICAgYi5nZXRieXRlKDApLnNob3VsZCA9PSAwCi0gICAgICAgIGIuZ2V0Ynl0ZSgxKS5zaG91bGQgPT0gMAotICAgICAgICBiLmVuY29kaW5nLnNob3VsZCA9PSBFbmNvZGluZzo6QklOQVJZCisgICAgICAgIGV4cGVjdChiLmxlbmd0aCkudG8gZXEoMikKKyAgICAgICAgZXhwZWN0KGIuZ2V0Ynl0ZSgwKSkudG8gZXEoMCkKKyAgICAgICAgZXhwZWN0KGIuZ2V0Ynl0ZSgxKSkudG8gZXEoMCkKKyAgICAgICAgZXhwZWN0KGIuZW5jb2RpbmcpLnRvIGVxKEVuY29kaW5nOjpCSU5BUlkpCiAgICAgICBlbmQKICAgICBlbmQKIAogICAgIGRlc2NyaWJlICcuZm9yY2VfYmluYXJ5X2VuY29kaW5nJyBkbwogICAgICAgaXQgJ3Nob3VsZCBjaGFuZ2UgZW5jb2RpbmcnIGRvCiAgICAgICAgIGUgPSAnU1RSSU5HJy5lbmNvZGUoJ1VURi04JykKLSAgICAgICAgZS5lbmNvZGluZy5zaG91bGRfbm90ID09IEVuY29kaW5nOjpCSU5BUlkKKyAgICAgICAgZXhwZWN0KGUuZW5jb2RpbmcpLm5vdF90byBlcShFbmNvZGluZzo6QklOQVJZKQogICAgICAgICBhID0gVGhyaWZ0OjpCeXRlcy5mb3JjZV9iaW5hcnlfZW5jb2RpbmcgZQotICAgICAgICBhLmVuY29kaW5nLnNob3VsZCA9PSBFbmNvZGluZzo6QklOQVJZCisgICAgICAgIGV4cGVjdChhLmVuY29kaW5nKS50byBlcShFbmNvZGluZzo6QklOQVJZKQogICAgICAgZW5kCiAgICAgZW5kCiAKICAgICBkZXNjcmliZSAnLmdldF9zdHJpbmdfYnl0ZScgZG8KICAgICAgIGl0ICdzaG91bGQgZ2V0IHRoZSBieXRlIGF0IGluZGV4JyBkbwogICAgICAgICBzID0gIlx4NDFceDQyIgotICAgICAgICBUaHJpZnQ6OkJ5dGVzLmdldF9zdHJpbmdfYnl0ZShzLCAwKS5zaG91bGQgPT0gMHg0MQotICAgICAgICBUaHJpZnQ6OkJ5dGVzLmdldF9zdHJpbmdfYnl0ZShzLCAxKS5zaG91bGQgPT0gMHg0MgorICAgICAgICBleHBlY3QoVGhyaWZ0OjpCeXRlcy5nZXRfc3RyaW5nX2J5dGUocywgMCkpLnRvIGVxKDB4NDEpCisgICAgICAgIGV4cGVjdChUaHJpZnQ6OkJ5dGVzLmdldF9zdHJpbmdfYnl0ZShzLCAxKSkudG8gZXEoMHg0MikKICAgICAgIGVuZAogICAgIGVuZAogCkBAIC01OSw0MiArNTksNDIgQEAKICAgICAgIGl0ICdzaG91bGQgc2V0IGJ5dGUgdmFsdWUgYXQgaW5kZXgnIGRvCiAgICAgICAgIHMgPSAiXHg0MVx4NDIiCiAgICAgICAgIFRocmlmdDo6Qnl0ZXMuc2V0X3N0cmluZ19ieXRlKHMsIDAsIDB4NDMpCi0gICAgICAgIHMuZ2V0Ynl0ZSgwKS5zaG91bGQgPT0gMHg0MwotICAgICAgICBzLnNob3VsZCA9PSAnQ0InCisgICAgICAgIGV4cGVjdChzLmdldGJ5dGUoMCkpLnRvIGVxKDB4NDMpCisgICAgICAgIGV4cGVjdChzKS50byBlcSgnQ0InKQogICAgICAgZW5kCiAgICAgZW5kCiAKICAgICBkZXNjcmliZSAnLmNvbnZlcnRfdG9fdXRmOF9ieXRlX2J1ZmZlcicgZG8KICAgICAgIGl0ICdzaG91bGQgY29udmVydCBVVEYtOCBTdHJpbmcgdG8gYnl0ZSBidWZmZXInIGRvCiAgICAgICAgIGUgPSAiXHUyMEFDIi5lbmNvZGUoJ1VURi04JykgIyBhIHN0cmluZyB3aXRoIGV1cm8gc2lnbiBjaGFyYWN0ZXIgVSsyMEFDCi0gICAgICAgIGUubGVuZ3RoLnNob3VsZCA9PSAxCisgICAgICAgIGV4cGVjdChlLmxlbmd0aCkudG8gZXEoMSkKIAogICAgICAgICBhID0gVGhyaWZ0OjpCeXRlcy5jb252ZXJ0X3RvX3V0ZjhfYnl0ZV9idWZmZXIgZQotICAgICAgICBhLmVuY29kaW5nLnNob3VsZCA9PSBFbmNvZGluZzo6QklOQVJZCi0gICAgICAgIGEubGVuZ3RoLnNob3VsZCA9PSAzCi0gICAgICAgIGEudW5wYWNrKCdDKicpLnNob3VsZCA9PSBbMHhFMiwgMHg4MiwgMHhBQ10KKyAgICAgICAgZXhwZWN0KGEuZW5jb2RpbmcpLnRvIGVxKEVuY29kaW5nOjpCSU5BUlkpCisgICAgICAgIGV4cGVjdChhLmxlbmd0aCkudG8gZXEoMykKKyAgICAgICAgZXhwZWN0KGEudW5wYWNrKCdDKicpKS50byBlcShbMHhFMiwgMHg4MiwgMHhBQ10pCiAgICAgICBlbmQKIAogICAgICAgaXQgJ3Nob3VsZCBjb252ZXJ0IElTTy04ODU5LTE1IFN0cmluZyB0byBVVEYtOCBieXRlIGJ1ZmZlcicgZG8KICAgICAgICAgIyBBc3N1bXB0aW9ucwogICAgICAgICBlID0gIlx1MjBBQyIuZW5jb2RlKCdJU08tODg1OS0xNScpICMgYSBzdHJpbmcgd2l0aCBldXJvIHNpZ24gY2hhcmFjdGVyIFUrMjBBQywgdGhlbiBjb252ZXJ0ZWQgdG8gSVNPLTg4NTktMTUKLSAgICAgICAgZS5sZW5ndGguc2hvdWxkID09IDEKLSAgICAgICAgZS51bnBhY2soJ0MqJykuc2hvdWxkID09IFsweEE0XSAjIGV1cm8gc2lnbiBpcyBhIGRpZmZlcmVudCBjb2RlIHBvaW50IGluIElTTy04ODU5LTE1CisgICAgICAgIGV4cGVjdChlLmxlbmd0aCkudG8gZXEoMSkKKyAgICAgICAgZXhwZWN0KGUudW5wYWNrKCdDKicpKS50byBlcShbMHhBNF0pICMgZXVybyBzaWduIGlzIGEgZGlmZmVyZW50IGNvZGUgcG9pbnQgaW4gSVNPLTg4NTktMTUKIAogICAgICAgICBhID0gVGhyaWZ0OjpCeXRlcy5jb252ZXJ0X3RvX3V0ZjhfYnl0ZV9idWZmZXIgZQotICAgICAgICBhLmVuY29kaW5nLnNob3VsZCA9PSBFbmNvZGluZzo6QklOQVJZCi0gICAgICAgIGEubGVuZ3RoLnNob3VsZCA9PSAzCi0gICAgICAgIGEudW5wYWNrKCdDKicpLnNob3VsZCA9PSBbMHhFMiwgMHg4MiwgMHhBQ10KKyAgICAgICAgZXhwZWN0KGEuZW5jb2RpbmcpLnRvIGVxKEVuY29kaW5nOjpCSU5BUlkpCisgICAgICAgIGV4cGVjdChhLmxlbmd0aCkudG8gZXEoMykKKyAgICAgICAgZXhwZWN0KGEudW5wYWNrKCdDKicpKS50byBlcShbMHhFMiwgMHg4MiwgMHhBQ10pCiAgICAgICBlbmQKICAgICBlbmQKIAogICAgIGRlc2NyaWJlICcuY29udmVydF90b19zdHJpbmcnIGRvCiAgICAgICBpdCAnc2hvdWxkIGNvbnZlcnQgVVRGLTggYnl0ZSBidWZmZXIgdG8gYSBVVEYtOCBTdHJpbmcnIGRvCiAgICAgICAgIGUgPSBbMHhFMiwgMHg4MiwgMHhBQ10ucGFjaygiQyoiKQotICAgICAgICBlLmVuY29kaW5nLnNob3VsZCA9PSBFbmNvZGluZzo6QklOQVJZCisgICAgICAgIGV4cGVjdChlLmVuY29kaW5nKS50byBlcShFbmNvZGluZzo6QklOQVJZKQogICAgICAgICBhID0gVGhyaWZ0OjpCeXRlcy5jb252ZXJ0X3RvX3N0cmluZyBlCi0gICAgICAgIGEuZW5jb2Rpbmcuc2hvdWxkID09IEVuY29kaW5nOjpVVEZfOAotICAgICAgICBhLnNob3VsZCA9PSAiXHUyMEFDIgorICAgICAgICBleHBlY3QoYS5lbmNvZGluZykudG8gZXEoRW5jb2Rpbmc6OlVURl84KQorICAgICAgICBleHBlY3QoYSkudG8gZXEoIlx1MjBBQyIpCiAgICAgICBlbmQKICAgICBlbmQKIApAQCAtMTAyLDE0ICsxMDIsMTQgQEAKICAgICBkZXNjcmliZSAnLmVtcHR5X2J5dGVfYnVmZmVyJyBkbwogICAgICAgaXQgJ3Nob3VsZCBjcmVhdGUgYW4gZW1wdHkgYnVmZmVyJyBkbwogICAgICAgICBiID0gVGhyaWZ0OjpCeXRlcy5lbXB0eV9ieXRlX2J1ZmZlcgotICAgICAgICBiLmxlbmd0aC5zaG91bGQgPT0gMAorICAgICAgICBleHBlY3QoYi5sZW5ndGgpLnRvIGVxKDApCiAgICAgICBlbmQKIAogICAgICAgaXQgJ3Nob3VsZCBjcmVhdGUgYW4gZW1wdHkgYnVmZmVyIG9mIGdpdmVuIHNpemUnIGRvCiAgICAgICAgIGIgPSBUaHJpZnQ6OkJ5dGVzLmVtcHR5X2J5dGVfYnVmZmVyIDIKLSAgICAgICAgYi5sZW5ndGguc2hvdWxkID09IDIKLSAgICAgICAgYlswXS5zaG91bGQgPT0gMAotICAgICAgICBiWzFdLnNob3VsZCA9PSAwCisgICAgICAgIGV4cGVjdChiLmxlbmd0aCkudG8gZXEoMikKKyAgICAgICAgZXhwZWN0KGJbMF0pLnRvIGVxKDApCisgICAgICAgIGV4cGVjdChiWzFdKS50byBlcSgwKQogICAgICAgZW5kCiAgICAgZW5kCiAKQEAgLTExNywxNiArMTE3LDE2IEBACiAgICAgICBpdCAnc2hvdWxkIGJlIGEgbm8tb3AnIGRvCiAgICAgICAgIGUgPSAnU1RSSU5HJwogICAgICAgICBhID0gVGhyaWZ0OjpCeXRlcy5mb3JjZV9iaW5hcnlfZW5jb2RpbmcgZQotICAgICAgICBhLnNob3VsZCA9PSBlCi0gICAgICAgIGEuc2hvdWxkIGJlKGUpCisgICAgICAgIGV4cGVjdChhKS50byBlcShlKQorICAgICAgICBleHBlY3QoYSkudG8gYmUoZSkKICAgICAgIGVuZAogICAgIGVuZAogCiAgICAgZGVzY3JpYmUgJy5nZXRfc3RyaW5nX2J5dGUnIGRvCiAgICAgICBpdCAnc2hvdWxkIGdldCB0aGUgYnl0ZSBhdCBpbmRleCcgZG8KICAgICAgICAgcyA9ICJceDQxXHg0MiIKLSAgICAgICAgVGhyaWZ0OjpCeXRlcy5nZXRfc3RyaW5nX2J5dGUocywgMCkuc2hvdWxkID09IDB4NDEKLSAgICAgICAgVGhyaWZ0OjpCeXRlcy5nZXRfc3RyaW5nX2J5dGUocywgMSkuc2hvdWxkID09IDB4NDIKKyAgICAgICAgZXhwZWN0KFRocmlmdDo6Qnl0ZXMuZ2V0X3N0cmluZ19ieXRlKHMsIDApKS50byBlcSgweDQxKQorICAgICAgICBleHBlY3QoVGhyaWZ0OjpCeXRlcy5nZXRfc3RyaW5nX2J5dGUocywgMSkpLnRvIGVxKDB4NDIpCiAgICAgICBlbmQKICAgICBlbmQKIApAQCAtMTM0LDggKzEzNCw4IEBACiAgICAgICBpdCAnc2hvdWxkIHNldCBieXRlIHZhbHVlIGF0IGluZGV4JyBkbwogICAgICAgICBzID0gIlx4NDFceDQyIgogICAgICAgICBUaHJpZnQ6OkJ5dGVzLnNldF9zdHJpbmdfYnl0ZShzLCAwLCAweDQzKQotICAgICAgICBzWzBdLnNob3VsZCA9PSAweDQzCi0gICAgICAgIHMuc2hvdWxkID09ICdDQicKKyAgICAgICAgZXhwZWN0KHNbMF0pLnRvIGVxKDB4NDMpCisgICAgICAgIGV4cGVjdChzKS50byBlcSgnQ0InKQogICAgICAgZW5kCiAgICAgZW5kCiAKQEAgLTE0Myw4ICsxNDMsOCBAQAogICAgICAgaXQgJ3Nob3VsZCBiZSBhIG5vLW9wJyBkbwogICAgICAgICBlID0gJ1NUUklORycKICAgICAgICAgYSA9IFRocmlmdDo6Qnl0ZXMuY29udmVydF90b191dGY4X2J5dGVfYnVmZmVyIGUKLSAgICAgICAgYS5zaG91bGQgPT0gZQotICAgICAgICBhLnNob3VsZCBiZShlKQorICAgICAgICBleHBlY3QoYSkudG8gZXEoZSkKKyAgICAgICAgZXhwZWN0KGEpLnRvIGJlKGUpCiAgICAgICBlbmQKICAgICBlbmQKIApAQCAtMTUyLDggKzE1Miw4IEBACiAgICAgICBpdCAnc2hvdWxkIGJlIGEgbm8tb3AnIGRvCiAgICAgICAgIGUgPSAnU1RSSU5HJwogICAgICAgICBhID0gVGhyaWZ0OjpCeXRlcy5jb252ZXJ0X3RvX3N0cmluZyBlCi0gICAgICAgIGEuc2hvdWxkID09IGUKLSAgICAgICAgYS5zaG91bGQgYmUoZSkKKyAgICAgICAgZXhwZWN0KGEpLnRvIGVxKGUpCisgICAgICAgIGV4cGVjdChhKS50byBiZShlKQogICAgICAgZW5kCiAgICAgZW5kCiAgIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvY2xpZW50X3NwZWMucmIgYi9saWIvcmIvc3BlYy9jbGllbnRfc3BlYy5yYgppbmRleCBmOGZmZThhLi5kNWQ0Y2VlIDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy9jbGllbnRfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy9jbGllbnRfc3BlYy5yYgpAQCAtMjYsNzQgKzI2LDczIEBACiAgIGVuZAogCiAgIGJlZm9yZSg6ZWFjaCkgZG8KLSAgICBAcHJvdCA9IG1vY2soIk1vY2tQcm90b2NvbCIpCisgICAgQHByb3QgPSBkb3VibGUoIk1vY2tQcm90b2NvbCIpCiAgICAgQGNsaWVudCA9IENsaWVudFNwZWMubmV3KEBwcm90KQogICBlbmQKIAogICBkZXNjcmliZSBUaHJpZnQ6OkNsaWVudCBkbwogICAgIGl0ICJzaG91bGQgcmUtdXNlIGlwcm90IGZvciBvcHJvdCBpZiBub3Qgb3RoZXJ3aXNlIHNwZWNpZmllZCIgZG8KLSAgICAgIEBjbGllbnQuaW5zdGFuY2VfdmFyaWFibGVfZ2V0KDonQGlwcm90Jykuc2hvdWxkIGVxbChAcHJvdCkKLSAgICAgIEBjbGllbnQuaW5zdGFuY2VfdmFyaWFibGVfZ2V0KDonQG9wcm90Jykuc2hvdWxkIGVxbChAcHJvdCkKKyAgICAgIGV4cGVjdChAY2xpZW50Lmluc3RhbmNlX3ZhcmlhYmxlX2dldCg6J0BpcHJvdCcpKS50byBlcWwoQHByb3QpCisgICAgICBleHBlY3QoQGNsaWVudC5pbnN0YW5jZV92YXJpYWJsZV9nZXQoOidAb3Byb3QnKSkudG8gZXFsKEBwcm90KQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBzZW5kIGEgdGVzdCBtZXNzYWdlIiBkbwotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX21lc3NhZ2VfYmVnaW4pLndpdGgoJ3Rlc3RNZXNzYWdlJywgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkNBTEwsIDApCi0gICAgICBtb2NrX2FyZ3MgPSBtb2NrKCcjPFRlc3RNZXNzYWdlX2FyZ3M6bW9jaz4nKQotICAgICAgbW9ja19hcmdzLnNob3VsZF9yZWNlaXZlKDpmb289KS53aXRoKCdmb28nKQotICAgICAgbW9ja19hcmdzLnNob3VsZF9yZWNlaXZlKDpiYXI9KS53aXRoKDQyKQotICAgICAgbW9ja19hcmdzLnNob3VsZF9yZWNlaXZlKDp3cml0ZSkud2l0aChAcHJvdCkKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9tZXNzYWdlX2VuZCkKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp0cmFucykgZG8KLSAgICAgICAgbW9jaygndHJhbnMnKS50YXAgZG8gfHRyYW5zfAotICAgICAgICAgIHRyYW5zLnNob3VsZF9yZWNlaXZlKDpmbHVzaCkKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfbWVzc2FnZV9iZWdpbikud2l0aCgndGVzdE1lc3NhZ2UnLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6Q0FMTCwgMCkKKyAgICAgIG1vY2tfYXJncyA9IGRvdWJsZSgnIzxUZXN0TWVzc2FnZV9hcmdzOm1vY2s+JykKKyAgICAgIGV4cGVjdChtb2NrX2FyZ3MpLnRvIHJlY2VpdmUoOmZvbz0pLndpdGgoJ2ZvbycpCisgICAgICBleHBlY3QobW9ja19hcmdzKS50byByZWNlaXZlKDpiYXI9KS53aXRoKDQyKQorICAgICAgZXhwZWN0KG1vY2tfYXJncykudG8gcmVjZWl2ZSg6d3JpdGUpLndpdGgoQHByb3QpCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX21lc3NhZ2VfZW5kKQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp0cmFucykgZG8KKyAgICAgICAgZG91YmxlKCd0cmFucycpLnRhcCBkbyB8dHJhbnN8CisgICAgICAgICAgZXhwZWN0KHRyYW5zKS50byByZWNlaXZlKDpmbHVzaCkKICAgICAgICAgZW5kCiAgICAgICBlbmQKLSAgICAgIGtsYXNzID0gc3R1YigiVGVzdE1lc3NhZ2VfYXJncyIsIDpuZXcgPT4gbW9ja19hcmdzKQorICAgICAga2xhc3MgPSBkb3VibGUoIlRlc3RNZXNzYWdlX2FyZ3MiLCA6bmV3ID0+IG1vY2tfYXJncykKICAgICAgIEBjbGllbnQuc2VuZF9tZXNzYWdlKCd0ZXN0TWVzc2FnZScsIGtsYXNzLCA6Zm9vID0+ICdmb28nLCA6YmFyID0+IDQyKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBpbmNyZW1lbnQgdGhlIHNlcXVlbmNlIGlkIHdoZW4gc2VuZGluZyBtZXNzYWdlcyIgZG8KLSAgICAgIHBlbmRpbmcgIml0IHNlZW1zIHNlcXVlbmNlIGlkcyBhcmUgY29tcGxldGVseSBpZ25vcmVkIHJpZ2h0IG5vdyIgZG8KLSAgICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX21lc3NhZ2VfYmVnaW4pLndpdGgoJ3Rlc3RNZXNzYWdlJywgIFRocmlmdDo6TWVzc2FnZVR5cGVzOjpDQUxMLCAwKS5vcmRlcmVkCi0gICAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9tZXNzYWdlX2JlZ2luKS53aXRoKCd0ZXN0TWVzc2FnZTInLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6Q0FMTCwgMSkub3JkZXJlZAotICAgICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfbWVzc2FnZV9iZWdpbikud2l0aCgndGVzdE1lc3NhZ2UzJywgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkNBTEwsIDIpLm9yZGVyZWQKLSAgICAgICAgQHByb3Quc3R1YiEoOndyaXRlX21lc3NhZ2VfZW5kKQotICAgICAgICBAcHJvdC5zdHViISg6dHJhbnMpLmFuZF9yZXR1cm4gbW9jaygidHJhbnMiKS5hc19udWxsX29iamVjdAotICAgICAgICBAY2xpZW50LnNlbmRfbWVzc2FnZSgndGVzdE1lc3NhZ2UnLCBtb2NrKCJhcmdzIGNsYXNzIikuYXNfbnVsbF9vYmplY3QpCi0gICAgICAgIEBjbGllbnQuc2VuZF9tZXNzYWdlKCd0ZXN0TWVzc2FnZTInLCBtb2NrKCJhcmdzIGNsYXNzIikuYXNfbnVsbF9vYmplY3QpCi0gICAgICAgIEBjbGllbnQuc2VuZF9tZXNzYWdlKCd0ZXN0TWVzc2FnZTMnLCBtb2NrKCJhcmdzIGNsYXNzIikuYXNfbnVsbF9vYmplY3QpCi0gICAgICBlbmQKKyAgICAgIHBlbmRpbmcgIml0IHNlZW1zIHNlcXVlbmNlIGlkcyBhcmUgY29tcGxldGVseSBpZ25vcmVkIHJpZ2h0IG5vdyIKKyAgICAgIEBwcm90LmV4cGVjdCg6d3JpdGVfbWVzc2FnZV9iZWdpbikud2l0aCgndGVzdE1lc3NhZ2UnLCAgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkNBTEwsIDApLm9yZGVyZWQKKyAgICAgIEBwcm90LmV4cGVjdCg6d3JpdGVfbWVzc2FnZV9iZWdpbikud2l0aCgndGVzdE1lc3NhZ2UyJywgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkNBTEwsIDEpLm9yZGVyZWQKKyAgICAgIEBwcm90LmV4cGVjdCg6d3JpdGVfbWVzc2FnZV9iZWdpbikud2l0aCgndGVzdE1lc3NhZ2UzJywgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkNBTEwsIDIpLm9yZGVyZWQKKyAgICAgIEBwcm90LnN0dWIhKDp3cml0ZV9tZXNzYWdlX2VuZCkKKyAgICAgIEBwcm90LnN0dWIhKDp0cmFucykuYW5kX3JldHVybiBkb3VibGUoInRyYW5zIikuYXNfbnVsbF9vYmplY3QKKyAgICAgIEBjbGllbnQuc2VuZF9tZXNzYWdlKCd0ZXN0TWVzc2FnZScsIGRvdWJsZSgiYXJncyBjbGFzcyIpLmFzX251bGxfb2JqZWN0KQorICAgICAgQGNsaWVudC5zZW5kX21lc3NhZ2UoJ3Rlc3RNZXNzYWdlMicsIGRvdWJsZSgiYXJncyBjbGFzcyIpLmFzX251bGxfb2JqZWN0KQorICAgICAgQGNsaWVudC5zZW5kX21lc3NhZ2UoJ3Rlc3RNZXNzYWdlMycsIGRvdWJsZSgiYXJncyBjbGFzcyIpLmFzX251bGxfb2JqZWN0KQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZWNlaXZlIGEgdGVzdCBtZXNzYWdlIiBkbwotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbWVzc2FnZV9iZWdpbikuYW5kX3JldHVybiBbbmlsLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6Q0FMTCwgMF0KLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX21lc3NhZ2VfZW5kKQotICAgICAgbW9ja19rbGFzcyA9IG1vY2soIiM8TW9ja0NsYXNzOm1vY2s+IikKLSAgICAgIG1vY2tfa2xhc3Muc2hvdWxkX3JlY2VpdmUoOnJlYWQpLndpdGgoQHByb3QpCi0gICAgICBAY2xpZW50LnJlY2VpdmVfbWVzc2FnZShzdHViKCJNb2NrQ2xhc3MiLCA6bmV3ID0+IG1vY2tfa2xhc3MpKQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX21lc3NhZ2VfYmVnaW4pLmFuZF9yZXR1cm4gW25pbCwgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkNBTEwsIDBdCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfbWVzc2FnZV9lbmQpCisgICAgICBtb2NrX2tsYXNzID0gZG91YmxlKCIjPE1vY2tDbGFzczptb2NrPiIpCisgICAgICBleHBlY3QobW9ja19rbGFzcykudG8gcmVjZWl2ZSg6cmVhZCkud2l0aChAcHJvdCkKKyAgICAgIEBjbGllbnQucmVjZWl2ZV9tZXNzYWdlKGRvdWJsZSgiTW9ja0NsYXNzIiwgOm5ldyA9PiBtb2NrX2tsYXNzKSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgaGFuZGxlIHJlY2VpdmVkIGV4Y2VwdGlvbnMiIGRvCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9tZXNzYWdlX2JlZ2luKS5hbmRfcmV0dXJuIFtuaWwsIFRocmlmdDo6TWVzc2FnZVR5cGVzOjpFWENFUFRJT04sIDBdCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9tZXNzYWdlX2VuZCkKLSAgICAgIFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24uc2hvdWxkX3JlY2VpdmUoOm5ldykuYW5kX3JldHVybiBkbworICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX21lc3NhZ2VfYmVnaW4pLmFuZF9yZXR1cm4gW25pbCwgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkVYQ0VQVElPTiwgMF0KKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9tZXNzYWdlX2VuZCkKKyAgICAgIGV4cGVjdChUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uKS50byByZWNlaXZlKDpuZXcpIGRvCiAgICAgICAgIFN0YW5kYXJkRXJyb3IubmV3LnRhcCBkbyB8bW9ja19leGN8Ci0gICAgICAgICAgbW9ja19leGMuc2hvdWxkX3JlY2VpdmUoOnJlYWQpLndpdGgoQHByb3QpCisgICAgICAgICAgZXhwZWN0KG1vY2tfZXhjKS50byByZWNlaXZlKDpyZWFkKS53aXRoKEBwcm90KQogICAgICAgICBlbmQKICAgICAgIGVuZAotICAgICAgbGFtYmRhIHsgQGNsaWVudC5yZWNlaXZlX21lc3NhZ2UobmlsKSB9LnNob3VsZCByYWlzZV9lcnJvcihTdGFuZGFyZEVycm9yKQorICAgICAgZXhwZWN0IHsgQGNsaWVudC5yZWNlaXZlX21lc3NhZ2UobmlsKSB9LnRvIHJhaXNlX2Vycm9yKFN0YW5kYXJkRXJyb3IpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGNsb3NlIHRoZSB0cmFuc3BvcnQgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHNlbmRpbmcgYSBtZXNzYWdlIiBkbwotICAgICAgQHByb3Quc3R1YiEoOndyaXRlX21lc3NhZ2VfYmVnaW4pCi0gICAgICBAcHJvdC5zaG91bGRfbm90X3JlY2VpdmUoOndyaXRlX21lc3NhZ2VfZW5kKQotICAgICAgbW9ja19hcmdzID0gbW9jaygiIzxUZXN0TWVzc2FnZV9hcmdzOm1vY2s+IikKLSAgICAgIG1vY2tfYXJncy5zaG91bGRfcmVjZWl2ZSg6d3JpdGUpLndpdGgoQHByb3QpLmFuZF9yYWlzZShTdGFuZGFyZEVycm9yKQotICAgICAgdHJhbnMgPSBtb2NrKCJNb2NrVHJhbnNwb3J0IikKLSAgICAgIEBwcm90LnN0dWIhKDp0cmFucykuYW5kX3JldHVybih0cmFucykKLSAgICAgIHRyYW5zLnNob3VsZF9yZWNlaXZlKDpjbG9zZSkKLSAgICAgIGtsYXNzID0gbW9jaygiVGVzdE1lc3NhZ2VfYXJncyIsIDpuZXcgPT4gbW9ja19hcmdzKQotICAgICAgbGFtYmRhIHsgQGNsaWVudC5zZW5kX21lc3NhZ2UoInRlc3RNZXNzYWdlIiwga2xhc3MpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFN0YW5kYXJkRXJyb3IpCisgICAgICBhbGxvdyhAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfbWVzc2FnZV9iZWdpbikKKyAgICAgIGV4cGVjdChAcHJvdCkubm90X3RvIHJlY2VpdmUoOndyaXRlX21lc3NhZ2VfZW5kKQorICAgICAgbW9ja19hcmdzID0gZG91YmxlKCIjPFRlc3RNZXNzYWdlX2FyZ3M6bW9jaz4iKQorICAgICAgZXhwZWN0KG1vY2tfYXJncykudG8gcmVjZWl2ZSg6d3JpdGUpLndpdGgoQHByb3QpLmFuZF9yYWlzZShTdGFuZGFyZEVycm9yKQorICAgICAgdHJhbnMgPSBkb3VibGUoIk1vY2tUcmFuc3BvcnQiKQorICAgICAgYWxsb3coQHByb3QpLnRvIHJlY2VpdmUoOnRyYW5zKS5hbmRfcmV0dXJuKHRyYW5zKQorICAgICAgZXhwZWN0KHRyYW5zKS50byByZWNlaXZlKDpjbG9zZSkKKyAgICAgIGtsYXNzID0gZG91YmxlKCJUZXN0TWVzc2FnZV9hcmdzIiwgOm5ldyA9PiBtb2NrX2FyZ3MpCisgICAgICBleHBlY3QgeyBAY2xpZW50LnNlbmRfbWVzc2FnZSgidGVzdE1lc3NhZ2UiLCBrbGFzcykgfS50byByYWlzZV9lcnJvcihTdGFuZGFyZEVycm9yKQogICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvY29tcGFjdF9wcm90b2NvbF9zcGVjLnJiIGIvbGliL3JiL3NwZWMvY29tcGFjdF9wcm90b2NvbF9zcGVjLnJiCmluZGV4IGRhYWQ1ODMuLjUxM2RkNjkgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL2NvbXBhY3RfcHJvdG9jb2xfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy9jb21wYWN0X3Byb3RvY29sX3NwZWMucmIKQEAgLTQyLDcgKzQyLDcgQEAKICAgICAgICAgcHJvdG8uc2VuZCh3cml0ZXIocHJpbWl0aXZlX3R5cGUpLCB2YWx1ZSkKICAgICAgICAgIyBwdXRzICJidWY6ICN7dHJhbnMuaW5zcGVjdF9idWZmZXJ9IiBpZiBwcmltaXRpdmVfdHlwZSA9PSA6aTY0CiAgICAgICAgIHJlYWRfYmFjayA9IHByb3RvLnNlbmQocmVhZGVyKHByaW1pdGl2ZV90eXBlKSkKLSAgICAgICAgcmVhZF9iYWNrLnNob3VsZCA9PSB2YWx1ZQorICAgICAgICBleHBlY3QocmVhZF9iYWNrKS50byBlcSh2YWx1ZSkKICAgICAgIGVuZAogICAgIGVuZAogICBlbmQKQEAgLTYyLDEwICs2MiwxMCBAQAogCiAgICAgICAgIHByb3RvID0gVGhyaWZ0OjpDb21wYWN0UHJvdG9jb2wubmV3KHRyYW5zKQogICAgICAgICBuYW1lLCB0eXBlLCBpZCA9IHByb3RvLnJlYWRfZmllbGRfYmVnaW4KLSAgICAgICAgdHlwZS5zaG91bGQgPT0gdGhyaWZ0X3R5cGUKLSAgICAgICAgaWQuc2hvdWxkID09IDE1CisgICAgICAgIGV4cGVjdCh0eXBlKS50byBlcSh0aHJpZnRfdHlwZSkKKyAgICAgICAgZXhwZWN0KGlkKS50byBlcSgxNSkKICAgICAgICAgcmVhZF9iYWNrID0gcHJvdG8uc2VuZChyZWFkZXIocHJpbWl0aXZlX3R5cGUpKQotICAgICAgICByZWFkX2JhY2suc2hvdWxkID09IHZhbHVlCisgICAgICAgIGV4cGVjdChyZWFkX2JhY2spLnRvIGVxKHZhbHVlKQogICAgICAgICBwcm90by5yZWFkX2ZpZWxkX2VuZAogICAgICAgZW5kCiAgICAgZW5kCkBAIC03NSwxMyArNzUsMTMgQEAKICAgICB0cmFucyA9IFRocmlmdDo6TWVtb3J5QnVmZmVyVHJhbnNwb3J0Lm5ldwogICAgIHByb3RvID0gVGhyaWZ0OjpDb21wYWN0UHJvdG9jb2wubmV3KHRyYW5zKQogCi0gICAgc3RydWN0ID0gQ29tcGFjdFByb3RvVGVzdFN0cnVjdC5uZXcKKyAgICBzdHJ1Y3QgPSBUaHJpZnQ6OlRlc3Q6OkNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QubmV3CiAgICAgIyBzZXRzIGFuZCBtYXBzIGRvbid0IGhhc2ggd2VsbC4uLiBub3Qgc3VyZSB3aGF0IHRvIGRvIGhlcmUuCiAgICAgc3RydWN0LndyaXRlKHByb3RvKQogCi0gICAgc3RydWN0MiA9IENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QubmV3CisgICAgc3RydWN0MiA9IFRocmlmdDo6VGVzdDo6Q29tcGFjdFByb3RvVGVzdFN0cnVjdC5uZXcKICAgICBzdHJ1Y3QyLnJlYWQocHJvdG8pICAgIAotICAgIHN0cnVjdDIuc2hvdWxkID09IHN0cnVjdAorICAgIGV4cGVjdChzdHJ1Y3QyKS50byBlcShzdHJ1Y3QpCiAgIGVuZAogCiAgIGl0ICJzaG91bGQgbWFrZSBtZXRob2QgY2FsbHMgY29ycmVjdGx5IiBkbwpAQCAtOTEsMTkgKzkxLDE5IEBACiAgICAgY2xpZW50X2luX3RyYW5zID0gVGhyaWZ0OjpNZW1vcnlCdWZmZXJUcmFuc3BvcnQubmV3CiAgICAgY2xpZW50X2luX3Byb3RvID0gVGhyaWZ0OjpDb21wYWN0UHJvdG9jb2wubmV3KGNsaWVudF9pbl90cmFucykKIAotICAgIHByb2Nlc3NvciA9IFNydjo6UHJvY2Vzc29yLm5ldyhKYW5reUhhbmRsZXIubmV3KQorICAgIHByb2Nlc3NvciA9IFRocmlmdDo6VGVzdDo6U3J2OjpQcm9jZXNzb3IubmV3KEphbmt5SGFuZGxlci5uZXcpCiAKLSAgICBjbGllbnQgPSBTcnY6OkNsaWVudC5uZXcoY2xpZW50X2luX3Byb3RvLCBjbGllbnRfb3V0X3Byb3RvKQorICAgIGNsaWVudCA9IFRocmlmdDo6VGVzdDo6U3J2OjpDbGllbnQubmV3KGNsaWVudF9pbl9wcm90bywgY2xpZW50X291dF9wcm90bykKICAgICBjbGllbnQuc2VuZF9KYW5reSgxKQogICAgICMgcHV0cyBjbGllbnRfb3V0X3RyYW5zLmluc3BlY3RfYnVmZmVyCiAgICAgcHJvY2Vzc29yLnByb2Nlc3MoY2xpZW50X291dF9wcm90bywgY2xpZW50X2luX3Byb3RvKQotICAgIGNsaWVudC5yZWN2X0phbmt5LnNob3VsZCA9PSAyCisgICAgZXhwZWN0KGNsaWVudC5yZWN2X0phbmt5KS50byBlcSgyKQogICBlbmQKICAgCiAgIGl0ICJzaG91bGQgZGVhbCB3aXRoIGZpZWxkcyBmb2xsb3dpbmcgZmllbGRzIHRoYXQgaGF2ZSBub24tZGVsdGEgaWRzIiBkbwotICAgIGJyY3AgPSBCcmVha3NSdWJ5Q29tcGFjdFByb3RvY29sLm5ldygKKyAgICBicmNwID0gVGhyaWZ0OjpUZXN0OjpCcmVha3NSdWJ5Q29tcGFjdFByb3RvY29sLm5ldygKICAgICAgIDpmaWVsZDEgPT4gImJsYWgiLCAKLSAgICAgIDpmaWVsZDIgPT4gQmlnRmllbGRJZFN0cnVjdC5uZXcoCisgICAgICA6ZmllbGQyID0+IFRocmlmdDo6VGVzdDo6QmlnRmllbGRJZFN0cnVjdC5uZXcoCiAgICAgICAgIDpmaWVsZDEgPT4gInN0cmluZzEiLCAKICAgICAgICAgOmZpZWxkMiA9PiAic3RyaW5nMiIpLCAKICAgICAgIDpmaWVsZDMgPT4gMykKQEAgLTExMSwyMCArMTExLDI1IEBACiAgICAgYnl0ZXMgPSBzZXIuc2VyaWFsaXplKGJyY3ApCiAKICAgICBkZXNlciA9IFRocmlmdDo6RGVzZXJpYWxpemVyLm5ldyhUaHJpZnQ6OkNvbXBhY3RQcm90b2NvbEZhY3RvcnkubmV3KQotICAgIGJyY3AyID0gQnJlYWtzUnVieUNvbXBhY3RQcm90b2NvbC5uZXcKKyAgICBicmNwMiA9IFRocmlmdDo6VGVzdDo6QnJlYWtzUnVieUNvbXBhY3RQcm90b2NvbC5uZXcKICAgICBkZXNlci5kZXNlcmlhbGl6ZShicmNwMiwgYnl0ZXMpCi0gICAgYnJjcDIuc2hvdWxkID09IGJyY3AKKyAgICBleHBlY3QoYnJjcDIpLnRvIGVxKGJyY3ApCiAgIGVuZAogICAKICAgaXQgInNob3VsZCBkZXNlcmlhbGl6ZSBhbiBlbXB0eSBtYXAgdG8gYW4gZW1wdHkgaGFzaCIgZG8KLSAgICBzdHJ1Y3QgPSBTaW5nbGVNYXBUZXN0U3RydWN0Lm5ldyg6aTMyX21hcCA9PiB7fSkKKyAgICBzdHJ1Y3QgPSBUaHJpZnQ6OlRlc3Q6OlNpbmdsZU1hcFRlc3RTdHJ1Y3QubmV3KDppMzJfbWFwID0+IHt9KQogICAgIHNlciA9IFRocmlmdDo6U2VyaWFsaXplci5uZXcoVGhyaWZ0OjpDb21wYWN0UHJvdG9jb2xGYWN0b3J5Lm5ldykKICAgICBieXRlcyA9IHNlci5zZXJpYWxpemUoc3RydWN0KQogCiAgICAgZGVzZXIgPSBUaHJpZnQ6OkRlc2VyaWFsaXplci5uZXcoVGhyaWZ0OjpDb21wYWN0UHJvdG9jb2xGYWN0b3J5Lm5ldykKLSAgICBzdHJ1Y3QyID0gU2luZ2xlTWFwVGVzdFN0cnVjdC5uZXcKKyAgICBzdHJ1Y3QyID0gVGhyaWZ0OjpUZXN0OjpTaW5nbGVNYXBUZXN0U3RydWN0Lm5ldwogICAgIGRlc2VyLmRlc2VyaWFsaXplKHN0cnVjdDIsIGJ5dGVzKQotICAgIHN0cnVjdC5zaG91bGQgPT0gc3RydWN0MgorICAgIGV4cGVjdChzdHJ1Y3QpLnRvIGVxKHN0cnVjdDIpCisgIGVuZAorICAKKyAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgIHRyYW5zID0gVGhyaWZ0OjpNZW1vcnlCdWZmZXJUcmFuc3BvcnQubmV3CisgICAgZXhwZWN0KFRocmlmdDo6Q29tcGFjdFByb3RvY29sLm5ldyh0cmFucykudG9fcykudG8gZXEoImNvbXBhY3QobWVtb3J5KSIpCiAgIGVuZAogICAKICAgY2xhc3MgSmFua3lIYW5kbGVyCkBAIC0xNDEsMyArMTQ2LDEzIEBACiAgICAgInJlYWRfI3tzeW0udG9fc30iCiAgIGVuZAogZW5kCisKK2Rlc2NyaWJlIFRocmlmdDo6Q29tcGFjdFByb3RvY29sRmFjdG9yeSBkbworICBpdCAic2hvdWxkIGNyZWF0ZSBhIENvbXBhY3RQcm90b2NvbCIgZG8KKyAgICBleHBlY3QoVGhyaWZ0OjpDb21wYWN0UHJvdG9jb2xGYWN0b3J5Lm5ldy5nZXRfcHJvdG9jb2woZG91YmxlKCJNb2NrVHJhbnNwb3J0IikpKS50byBiZV9pbnN0YW5jZV9vZihUaHJpZnQ6OkNvbXBhY3RQcm90b2NvbCkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgIGV4cGVjdChUaHJpZnQ6OkNvbXBhY3RQcm90b2NvbEZhY3RvcnkubmV3LnRvX3MpLnRvIGVxKCJjb21wYWN0IikKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL2V4Y2VwdGlvbl9zcGVjLnJiIGIvbGliL3JiL3NwZWMvZXhjZXB0aW9uX3NwZWMucmIKaW5kZXggZDFkYTYyMS4uMzc5YWU2OSAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvZXhjZXB0aW9uX3NwZWMucmIKKysrIGIvbGliL3JiL3NwZWMvZXhjZXB0aW9uX3NwZWMucmIKQEAgLTI0LDEwNyArMjQsMTA3IEBACiAgIGRlc2NyaWJlIFRocmlmdDo6RXhjZXB0aW9uIGRvCiAgICAgaXQgInNob3VsZCBoYXZlIGFuIGFjY2Vzc2libGUgbWVzc2FnZSIgZG8KICAgICAgIGUgPSBUaHJpZnQ6OkV4Y2VwdGlvbi5uZXcoInRlc3QgbWVzc2FnZSIpCi0gICAgICBlLm1lc3NhZ2Uuc2hvdWxkID09ICJ0ZXN0IG1lc3NhZ2UiCisgICAgICBleHBlY3QoZS5tZXNzYWdlKS50byBlcSgidGVzdCBtZXNzYWdlIikKICAgICBlbmQKICAgZW5kCiAKICAgZGVzY3JpYmUgVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbiBkbwogICAgIGl0ICJzaG91bGQgaW5oZXJpdCBmcm9tIFRocmlmdDo6RXhjZXB0aW9uIiBkbwotICAgICAgVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbi5zdXBlcmNsYXNzLnNob3VsZCA9PSBUaHJpZnQ6OkV4Y2VwdGlvbgorICAgICAgZXhwZWN0KFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24uc3VwZXJjbGFzcykudG8gZXEoVGhyaWZ0OjpFeGNlcHRpb24pCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGhhdmUgYW4gYWNjZXNzaWJsZSB0eXBlIGFuZCBtZXNzYWdlIiBkbwogICAgICAgZSA9IFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24ubmV3Ci0gICAgICBlLnR5cGUuc2hvdWxkID09IFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb246OlVOS05PV04KLSAgICAgIGUubWVzc2FnZS5zaG91bGQgYmVfbmlsCisgICAgICBleHBlY3QoZS50eXBlKS50byBlcShUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uOjpVTktOT1dOKQorICAgICAgZXhwZWN0KGUubWVzc2FnZSkudG8gYmVfbmlsCiAgICAgICBlID0gVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbi5uZXcoVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6VU5LTk9XTl9NRVRIT0QsICJ0ZXN0IG1lc3NhZ2UiKQotICAgICAgZS50eXBlLnNob3VsZCA9PSBUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uOjpVTktOT1dOX01FVEhPRAotICAgICAgZS5tZXNzYWdlLnNob3VsZCA9PSAidGVzdCBtZXNzYWdlIgorICAgICAgZXhwZWN0KGUudHlwZSkudG8gZXEoVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6VU5LTk9XTl9NRVRIT0QpCisgICAgICBleHBlY3QoZS5tZXNzYWdlKS50byBlcSgidGVzdCBtZXNzYWdlIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVhZCBhIHN0cnVjdCBvZmYgb2YgYSBwcm90b2NvbCIgZG8KLSAgICAgIHByb3QgPSBtb2NrKCJNb2NrUHJvdG9jb2wiKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfYmVnaW4pLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfZmllbGRfYmVnaW4pLmV4YWN0bHkoMykudGltZXMuYW5kX3JldHVybigKKyAgICAgIHByb3QgPSBkb3VibGUoIk1vY2tQcm90b2NvbCIpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfYmVnaW4pLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX2ZpZWxkX2JlZ2luKS5leGFjdGx5KDMpLnRpbWVzLmFuZF9yZXR1cm4oCiAgICAgICAgIFsibWVzc2FnZSIsIFRocmlmdDo6VHlwZXM6OlNUUklORywgMV0sCiAgICAgICAgIFsidHlwZSIsIFRocmlmdDo6VHlwZXM6OkkzMiwgMl0sCiAgICAgICAgIFtuaWwsIFRocmlmdDo6VHlwZXM6OlNUT1AsIDBdCiAgICAgICApCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cmluZykub3JkZXJlZC5hbmRfcmV0dXJuICJ0ZXN0IG1lc3NhZ2UiCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2kzMikub3JkZXJlZC5hbmRfcmV0dXJuIFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb246OkJBRF9TRVFVRU5DRV9JRAotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9maWVsZF9lbmQpLmV4YWN0bHkoMikudGltZXMKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RydWN0X2VuZCkub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RyaW5nKS5vcmRlcmVkLmFuZF9yZXR1cm4gInRlc3QgbWVzc2FnZSIKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX2kzMikub3JkZXJlZC5hbmRfcmV0dXJuIFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb246OkJBRF9TRVFVRU5DRV9JRAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfZmllbGRfZW5kKS5leGFjdGx5KDIpLnRpbWVzCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfZW5kKS5vcmRlcmVkCiAKICAgICAgIGUgPSBUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uLm5ldwogICAgICAgZS5yZWFkKHByb3QpCi0gICAgICBlLm1lc3NhZ2Uuc2hvdWxkID09ICJ0ZXN0IG1lc3NhZ2UiCi0gICAgICBlLnR5cGUuc2hvdWxkID09IFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb246OkJBRF9TRVFVRU5DRV9JRAorICAgICAgZXhwZWN0KGUubWVzc2FnZSkudG8gZXEoInRlc3QgbWVzc2FnZSIpCisgICAgICBleHBlY3QoZS50eXBlKS50byBlcShUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uOjpCQURfU0VRVUVOQ0VfSUQpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHNraXAgYmFkIGZpZWxkcyB3aGVuIHJlYWRpbmcgYSBzdHJ1Y3QiIGRvCi0gICAgICBwcm90ID0gbW9jaygiTW9ja1Byb3RvY29sIikKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RydWN0X2JlZ2luKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2ZpZWxkX2JlZ2luKS5leGFjdGx5KDUpLnRpbWVzLmFuZF9yZXR1cm4oCisgICAgICBwcm90ID0gZG91YmxlKCJNb2NrUHJvdG9jb2wiKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RydWN0X2JlZ2luKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9maWVsZF9iZWdpbikuZXhhY3RseSg1KS50aW1lcy5hbmRfcmV0dXJuKAogICAgICAgICBbInR5cGUiLCBUaHJpZnQ6OlR5cGVzOjpJMzIsIDJdLAogICAgICAgICBbInR5cGUiLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDJdLAogICAgICAgICBbIm1lc3NhZ2UiLCBUaHJpZnQ6OlR5cGVzOjpNQVAsIDFdLAogICAgICAgICBbIm1lc3NhZ2UiLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDNdLAogICAgICAgICBbbmlsLCBUaHJpZnQ6OlR5cGVzOjpTVE9QLCAwXQogICAgICAgKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9pMzIpLmFuZF9yZXR1cm4gVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6SU5WQUxJRF9NRVNTQUdFX1RZUEUKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnNraXApLndpdGgoVGhyaWZ0OjpUeXBlczo6U1RSSU5HKS50d2ljZQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6c2tpcCkud2l0aChUaHJpZnQ6OlR5cGVzOjpNQVApCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2ZpZWxkX2VuZCkuZXhhY3RseSg0KS50aW1lcwotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfZW5kKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9pMzIpLmFuZF9yZXR1cm4gVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6SU5WQUxJRF9NRVNTQUdFX1RZUEUKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpza2lwKS53aXRoKFRocmlmdDo6VHlwZXM6OlNUUklORykudHdpY2UKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpza2lwKS53aXRoKFRocmlmdDo6VHlwZXM6Ok1BUCkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX2ZpZWxkX2VuZCkuZXhhY3RseSg0KS50aW1lcworICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RydWN0X2VuZCkub3JkZXJlZAogCiAgICAgICBlID0gVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbi5uZXcKICAgICAgIGUucmVhZChwcm90KQotICAgICAgZS5tZXNzYWdlLnNob3VsZCBiZV9uaWwKLSAgICAgIGUudHlwZS5zaG91bGQgPT0gVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6SU5WQUxJRF9NRVNTQUdFX1RZUEUKKyAgICAgIGV4cGVjdChlLm1lc3NhZ2UpLnRvIGJlX25pbAorICAgICAgZXhwZWN0KGUudHlwZSkudG8gZXEoVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6SU5WQUxJRF9NRVNTQUdFX1RZUEUpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIGEgVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbiBzdHJ1Y3QgdG8gdGhlIG9wcm90IiBkbwotICAgICAgcHJvdCA9IG1vY2soIk1vY2tQcm90b2NvbCIpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfYmVnaW4pLndpdGgoIlRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24iKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgibWVzc2FnZSIsIFRocmlmdDo6VHlwZXM6OlNUUklORywgMSkub3JkZXJlZAotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCJ0ZXN0IG1lc3NhZ2UiKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgidHlwZSIsIFRocmlmdDo6VHlwZXM6OkkzMiwgMikub3JkZXJlZAotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfaTMyKS53aXRoKFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb246OlVOS05PV05fTUVUSE9EKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9lbmQpLnR3aWNlCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9zdG9wKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfZW5kKS5vcmRlcmVkCisgICAgICBwcm90ID0gZG91YmxlKCJNb2NrUHJvdG9jb2wiKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgibWVzc2FnZSIsIFRocmlmdDo6VHlwZXM6OlNUUklORywgMSkub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgidGVzdCBtZXNzYWdlIikub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCJ0eXBlIiwgVGhyaWZ0OjpUeXBlczo6STMyLCAyKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfaTMyKS53aXRoKFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb246OlVOS05PV05fTUVUSE9EKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfZW5kKS50d2ljZQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX3N0b3ApLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfZW5kKS5vcmRlcmVkCiAKICAgICAgIGUgPSBUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uLm5ldyhUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uOjpVTktOT1dOX01FVEhPRCwgInRlc3QgbWVzc2FnZSIpCiAgICAgICBlLndyaXRlKHByb3QpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHNraXAgbmlsIGZpZWxkcyB3aGVuIHdyaXRpbmcgdG8gdGhlIG9wcm90IiBkbwotICAgICAgcHJvdCA9IG1vY2soIk1vY2tQcm90b2NvbCIpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfYmVnaW4pLndpdGgoIlRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24iKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgibWVzc2FnZSIsIFRocmlmdDo6VHlwZXM6OlNUUklORywgMSkub3JkZXJlZAotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCJ0ZXN0IG1lc3NhZ2UiKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9lbmQpLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX3N0b3ApLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cnVjdF9lbmQpLm9yZGVyZWQKKyAgICAgIHByb3QgPSBkb3VibGUoIk1vY2tQcm90b2NvbCIpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2JlZ2luKS53aXRoKCJUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uIikub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCJtZXNzYWdlIiwgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAxKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCJ0ZXN0IG1lc3NhZ2UiKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfZW5kKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfc3RvcCkub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cnVjdF9lbmQpLm9yZGVyZWQKIAogICAgICAgZSA9IFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24ubmV3KG5pbCwgInRlc3QgbWVzc2FnZSIpCiAgICAgICBlLndyaXRlKHByb3QpCiAKLSAgICAgIHByb3QgPSBtb2NrKCJNb2NrUHJvdG9jb2wiKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2JlZ2luKS53aXRoKCJUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uIikub3JkZXJlZAotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoInR5cGUiLCBUaHJpZnQ6OlR5cGVzOjpJMzIsIDIpLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2kzMikud2l0aChUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uOjpCQURfU0VRVUVOQ0VfSUQpLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2VuZCkub3JkZXJlZAotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfc3RvcCkub3JkZXJlZAotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2VuZCkub3JkZXJlZAorICAgICAgcHJvdCA9IGRvdWJsZSgiTW9ja1Byb3RvY29sIikKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfYmVnaW4pLndpdGgoIlRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24iKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoInR5cGUiLCBUaHJpZnQ6OlR5cGVzOjpJMzIsIDIpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6QkFEX1NFUVVFTkNFX0lEKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfZW5kKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfc3RvcCkub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cnVjdF9lbmQpLm9yZGVyZWQKIAogICAgICAgZSA9IFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24ubmV3KFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb246OkJBRF9TRVFVRU5DRV9JRCkKICAgICAgIGUud3JpdGUocHJvdCkKIAotICAgICAgcHJvdCA9IG1vY2soIk1vY2tQcm90b2NvbCIpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfYmVnaW4pLndpdGgoIlRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24iKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9zdG9wKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfZW5kKS5vcmRlcmVkCisgICAgICBwcm90ID0gZG91YmxlKCJNb2NrUHJvdG9jb2wiKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9zdG9wKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2VuZCkub3JkZXJlZAogCiAgICAgICBlID0gVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbi5uZXcobmlsKQogICAgICAgZS53cml0ZShwcm90KQpAQCAtMTM0LDggKzEzNCw4IEBACiAgIGRlc2NyaWJlIFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24gZG8KICAgICBpdCAic2hvdWxkIGhhdmUgYW4gYWNjZXNzaWJsZSB0eXBlIiBkbwogICAgICAgcHJvdCA9IFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24ubmV3KFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQsICJtZXNzYWdlIikKLSAgICAgIHByb3QudHlwZS5zaG91bGQgPT0gVGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVAotICAgICAgcHJvdC5tZXNzYWdlLnNob3VsZCA9PSAibWVzc2FnZSIKKyAgICAgIGV4cGVjdChwcm90LnR5cGUpLnRvIGVxKFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpCisgICAgICBleHBlY3QocHJvdC5tZXNzYWdlKS50byBlcSgibWVzc2FnZSIpCiAgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9mbGF0X3NwZWMucmIgYi9saWIvcmIvc3BlYy9mbGF0X3NwZWMucmIKaW5kZXggZjM3ODc4Mi4uODkzMDU2YyAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvZmxhdF9zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL2ZsYXRfc3BlYy5yYgpAQCAtMzIsNyArMzIsNyBAQAogICAgICAib3RoZXJfbmFtZXNwYWNlL3JlZmVyZW5jZWRfY29uc3RhbnRzLnJiIiwKICAgICAgIm90aGVyX25hbWVzcGFjZS9yZWZlcmVuY2VkX3R5cGVzLnJiIgogICAgIF0uZWFjaCBkbyB8bmFtZXwKLSAgICAgIEZpbGUuZXhpc3Q/KEZpbGUuam9pbihwcmVmaXgsIG5hbWUpKS5zaG91bGRfbm90IGJlX3RydWUKKyAgICAgIGV4cGVjdChGaWxlLmV4aXN0PyhGaWxlLmpvaW4ocHJlZml4LCBuYW1lKSkpLm5vdF90byBiZV90cnV0aHkKICAgICBlbmQKICAgZW5kCiAKQEAgLTQ0LDE5ICs0NCwxOSBAQAogICAgICAicmVmZXJlbmNlZF9jb25zdGFudHMucmIiLAogICAgICAicmVmZXJlbmNlZF90eXBlcy5yYiIKICAgICBdLmVhY2ggZG8gfG5hbWV8Ci0gICAgICBGaWxlLmV4aXN0PyhGaWxlLmpvaW4ocHJlZml4LCBuYW1lKSkuc2hvdWxkIGJlX3RydWUKKyAgICAgIGV4cGVjdChGaWxlLmV4aXN0PyhGaWxlLmpvaW4ocHJlZml4LCBuYW1lKSkpLnRvIGJlX3RydXRoeQogICAgIGVuZAogICBlbmQKIAogICBpdCAiaGFzIGEgc2VydmljZSBjbGFzcyBpbiB0aGUgcmlnaHQgcGxhY2UiIGRvCi0gICAgZGVmaW5lZD8oTmFtZXNwYWNlZFNwZWNOYW1lc3BhY2U6Ok5hbWVzcGFjZWROb25ibG9ja2luZ1NlcnZpY2UpLnNob3VsZCBiZV90cnVlCisgICAgZXhwZWN0KGRlZmluZWQ/KE5hbWVzcGFjZWRTcGVjTmFtZXNwYWNlOjpOYW1lc3BhY2VkTm9uYmxvY2tpbmdTZXJ2aWNlKSkudG8gYmVfdHJ1dGh5CiAgIGVuZAogCiAgIGl0ICJoYXMgYSBzdHJ1Y3QgaW4gdGhlIHJpZ2h0IHBsYWNlIiBkbwotICAgIGRlZmluZWQ/KE5hbWVzcGFjZWRTcGVjTmFtZXNwYWNlOjpIZWxsbykuc2hvdWxkIGJlX3RydWUKKyAgICBleHBlY3QoZGVmaW5lZD8oTmFtZXNwYWNlZFNwZWNOYW1lc3BhY2U6OkhlbGxvKSkudG8gYmVfdHJ1dGh5CiAgIGVuZAogCiAgIGl0ICJyZXF1aXJlZCBhbiBpbmNsdWRlZCBmaWxlIiBkbwotICAgIGRlZmluZWQ/KE90aGVyTmFtZXNwYWNlOjpTb21lRW51bSkuc2hvdWxkIGJlX3RydWUKKyAgICBleHBlY3QoZGVmaW5lZD8oT3RoZXJOYW1lc3BhY2U6OlNvbWVFbnVtKSkudG8gYmVfdHJ1dGh5CiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9odHRwX2NsaWVudF9zcGVjLnJiIGIvbGliL3JiL3NwZWMvaHR0cF9jbGllbnRfc3BlYy5yYgppbmRleCA3OTNmYzczLi5kZjQ3MmFiIDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy9odHRwX2NsaWVudF9zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL2h0dHBfY2xpZW50X3NwZWMucmIKQEAgLTI1LDI4ICsyNSwzMiBAQAogICAgIGJlZm9yZSg6ZWFjaCkgZG8KICAgICAgIEBjbGllbnQgPSBUaHJpZnQ6OkhUVFBDbGllbnRUcmFuc3BvcnQubmV3KCJodHRwOi8vbXkuZG9tYWluLmNvbS9wYXRoL3RvL3NlcnZpY2U/cGFyYW09dmFsdWUiKQogICAgIGVuZAorICAgIAorICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIEBjbGllbnQudG9fcyA9PSAiaHR0cDovL215LmRvbWFpbi5jb20vcGF0aC90by9zZXJ2aWNlP3BhcmFtPXZhbHVlIgorICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBhbHdheXMgYmUgb3BlbiIgZG8KLSAgICAgIEBjbGllbnQuc2hvdWxkIGJlX29wZW4KKyAgICAgIGV4cGVjdChAY2xpZW50KS50byBiZV9vcGVuCiAgICAgICBAY2xpZW50LmNsb3NlCi0gICAgICBAY2xpZW50LnNob3VsZCBiZV9vcGVuCisgICAgICBleHBlY3QoQGNsaWVudCkudG8gYmVfb3BlbgogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBwb3N0IHZpYSBIVFRQIGFuZCByZXR1cm4gdGhlIHJlc3VsdHMiIGRvCiAgICAgICBAY2xpZW50LndyaXRlICJhIHRlc3QiCiAgICAgICBAY2xpZW50LndyaXRlICIgZnJhbWUiCi0gICAgICBOZXQ6OkhUVFAuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aCgibXkuZG9tYWluLmNvbSIsIDgwKS5hbmRfcmV0dXJuIGRvCi0gICAgICAgIG1vY2soIk5ldDo6SFRUUCIpLnRhcCBkbyB8aHR0cHwKLSAgICAgICAgICBodHRwLnNob3VsZF9yZWNlaXZlKDp1c2Vfc3NsPSkud2l0aChmYWxzZSkKLSAgICAgICAgICBodHRwLnNob3VsZF9yZWNlaXZlKDpwb3N0KS53aXRoKCIvcGF0aC90by9zZXJ2aWNlP3BhcmFtPXZhbHVlIiwgImEgdGVzdCBmcmFtZSIsIHsiQ29udGVudC1UeXBlIj0+ImFwcGxpY2F0aW9uL3gtdGhyaWZ0In0pLmFuZF9yZXR1cm4gZG8KLSAgICAgICAgICAgIG1vY2soIk5ldDo6SFRUUE9LIikudGFwIGRvIHxyZXNwb25zZXwKLSAgICAgICAgICAgICAgcmVzcG9uc2Uuc2hvdWxkX3JlY2VpdmUoOmJvZHkpLmFuZF9yZXR1cm4gImRhdGEiCisgICAgICBleHBlY3QoTmV0OjpIVFRQKS50byByZWNlaXZlKDpuZXcpLndpdGgoIm15LmRvbWFpbi5jb20iLCA4MCkgZG8KKyAgICAgICAgZG91YmxlKCJOZXQ6OkhUVFAiKS50YXAgZG8gfGh0dHB8CisgICAgICAgICAgZXhwZWN0KGh0dHApLnRvIHJlY2VpdmUoOnVzZV9zc2w9KS53aXRoKGZhbHNlKQorICAgICAgICAgIGV4cGVjdChodHRwKS50byByZWNlaXZlKDpwb3N0KS53aXRoKCIvcGF0aC90by9zZXJ2aWNlP3BhcmFtPXZhbHVlIiwgImEgdGVzdCBmcmFtZSIsIHsiQ29udGVudC1UeXBlIj0+ImFwcGxpY2F0aW9uL3gtdGhyaWZ0In0pIGRvCisgICAgICAgICAgICBkb3VibGUoIk5ldDo6SFRUUE9LIikudGFwIGRvIHxyZXNwb25zZXwKKyAgICAgICAgICAgICAgZXhwZWN0KHJlc3BvbnNlKS50byByZWNlaXZlKDpib2R5KS5hbmRfcmV0dXJuICJkYXRhIgogICAgICAgICAgICAgZW5kCiAgICAgICAgICAgZW5kCiAgICAgICAgIGVuZAogICAgICAgZW5kCiAgICAgICBAY2xpZW50LmZsdXNoCi0gICAgICBAY2xpZW50LnJlYWQoMTApLnNob3VsZCA9PSAiZGF0YSIKKyAgICAgIGV4cGVjdChAY2xpZW50LnJlYWQoMTApKS50byBlcSgiZGF0YSIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHNlbmQgY3VzdG9tIGhlYWRlcnMgaWYgZGVmaW5lZCIgZG8KQEAgLTU1LDE4ICs1OSwzMyBAQAogICAgICAgaGVhZGVycyA9IHsiQ29udGVudC1UeXBlIj0+ImFwcGxpY2F0aW9uL3gtdGhyaWZ0In0ubWVyZ2UoY3VzdG9tX2hlYWRlcnMpCiAKICAgICAgIEBjbGllbnQuYWRkX2hlYWRlcnMoY3VzdG9tX2hlYWRlcnMpCi0gICAgICBOZXQ6OkhUVFAuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aCgibXkuZG9tYWluLmNvbSIsIDgwKS5hbmRfcmV0dXJuIGRvCi0gICAgICAgIG1vY2soIk5ldDo6SFRUUCIpLnRhcCBkbyB8aHR0cHwKLSAgICAgICAgICBodHRwLnNob3VsZF9yZWNlaXZlKDp1c2Vfc3NsPSkud2l0aChmYWxzZSkKLSAgICAgICAgICBodHRwLnNob3VsZF9yZWNlaXZlKDpwb3N0KS53aXRoKCIvcGF0aC90by9zZXJ2aWNlP3BhcmFtPXZhbHVlIiwgInRlc3QiLCBoZWFkZXJzKS5hbmRfcmV0dXJuIGRvCi0gICAgICAgICAgICBtb2NrKCJOZXQ6OkhUVFBPSyIpLnRhcCBkbyB8cmVzcG9uc2V8Ci0gICAgICAgICAgICAgIHJlc3BvbnNlLnNob3VsZF9yZWNlaXZlKDpib2R5KS5hbmRfcmV0dXJuICJkYXRhIgorICAgICAgZXhwZWN0KE5ldDo6SFRUUCkudG8gcmVjZWl2ZSg6bmV3KS53aXRoKCJteS5kb21haW4uY29tIiwgODApIGRvCisgICAgICAgIGRvdWJsZSgiTmV0OjpIVFRQIikudGFwIGRvIHxodHRwfAorICAgICAgICAgIGV4cGVjdChodHRwKS50byByZWNlaXZlKDp1c2Vfc3NsPSkud2l0aChmYWxzZSkKKyAgICAgICAgICBleHBlY3QoaHR0cCkudG8gcmVjZWl2ZSg6cG9zdCkud2l0aCgiL3BhdGgvdG8vc2VydmljZT9wYXJhbT12YWx1ZSIsICJ0ZXN0IiwgaGVhZGVycykgZG8KKyAgICAgICAgICAgIGRvdWJsZSgiTmV0OjpIVFRQT0siKS50YXAgZG8gfHJlc3BvbnNlfAorICAgICAgICAgICAgICBleHBlY3QocmVzcG9uc2UpLnRvIHJlY2VpdmUoOmJvZHkpLmFuZF9yZXR1cm4gImRhdGEiCiAgICAgICAgICAgICBlbmQKICAgICAgICAgICBlbmQKICAgICAgICAgZW5kCiAgICAgICBlbmQKICAgICAgIEBjbGllbnQuZmx1c2gKICAgICBlbmQKKworICAgIGl0ICdzaG91bGQgcmVzZXQgdGhlIG91dGJ1ZiBvbiBIVFRQIGZhaWx1cmVzJyBkbworICAgICAgQGNsaWVudC53cml0ZSAidGVzdCIKKworICAgICAgZXhwZWN0KE5ldDo6SFRUUCkudG8gcmVjZWl2ZSg6bmV3KS53aXRoKCJteS5kb21haW4uY29tIiwgODApIGRvCisgICAgICAgIGRvdWJsZSgiTmV0OjpIVFRQIikudGFwIGRvIHxodHRwfAorICAgICAgICAgIGV4cGVjdChodHRwKS50byByZWNlaXZlKDp1c2Vfc3NsPSkud2l0aChmYWxzZSkKKyAgICAgICAgICBleHBlY3QoaHR0cCkudG8gcmVjZWl2ZSg6cG9zdCkud2l0aCgiL3BhdGgvdG8vc2VydmljZT9wYXJhbT12YWx1ZSIsICJ0ZXN0IiwgeyJDb250ZW50LVR5cGUiPT4iYXBwbGljYXRpb24veC10aHJpZnQifSkgeyByYWlzZSBOZXQ6OlJlYWRUaW1lb3V0IH0KKyAgICAgICAgZW5kCisgICAgICBlbmQKKworICAgICAgQGNsaWVudC5mbHVzaCAgcmVzY3VlCisgICAgICBleHBlY3QoQGNsaWVudC5pbnN0YW5jZV92YXJpYWJsZV9nZXQoOkBvdXRidWYpKS50byBlcShUaHJpZnQ6OkJ5dGVzLmVtcHR5X2J5dGVfYnVmZmVyKQorICAgIGVuZAorCiAgIGVuZAogCiAgIGRlc2NyaWJlICdzc2wgZW5hYmxlZCcgZG8KQEAgLTgwLDIwICs5OSwyMCBAQAogCiAgICAgICBjbGllbnQud3JpdGUgInRlc3QiCiAKLSAgICAgIE5ldDo6SFRUUC5zaG91bGRfcmVjZWl2ZSg6bmV3KS53aXRoKCJteS5kb21haW4uY29tIiwgNDQzKS5hbmRfcmV0dXJuIGRvCi0gICAgICAgIG1vY2soIk5ldDo6SFRUUCIpLnRhcCBkbyB8aHR0cHwKLSAgICAgICAgICBodHRwLnNob3VsZF9yZWNlaXZlKDp1c2Vfc3NsPSkud2l0aCh0cnVlKQotICAgICAgICAgIGh0dHAuc2hvdWxkX3JlY2VpdmUoOnZlcmlmeV9tb2RlPSkud2l0aChPcGVuU1NMOjpTU0w6OlZFUklGWV9QRUVSKQotICAgICAgICAgIGh0dHAuc2hvdWxkX3JlY2VpdmUoOnBvc3QpLndpdGgoQHNlcnZpY2VfcGF0aCwgInRlc3QiLAotICAgICAgICAgICAgICAiQ29udGVudC1UeXBlIiA9PiAiYXBwbGljYXRpb24veC10aHJpZnQiKS5hbmRfcmV0dXJuIGRvCi0gICAgICAgICAgICBtb2NrKCJOZXQ6OkhUVFBPSyIpLnRhcCBkbyB8cmVzcG9uc2V8Ci0gICAgICAgICAgICAgIHJlc3BvbnNlLnNob3VsZF9yZWNlaXZlKDpib2R5KS5hbmRfcmV0dXJuICJkYXRhIgorICAgICAgZXhwZWN0KE5ldDo6SFRUUCkudG8gcmVjZWl2ZSg6bmV3KS53aXRoKCJteS5kb21haW4uY29tIiwgNDQzKSBkbworICAgICAgICBkb3VibGUoIk5ldDo6SFRUUCIpLnRhcCBkbyB8aHR0cHwKKyAgICAgICAgICBleHBlY3QoaHR0cCkudG8gcmVjZWl2ZSg6dXNlX3NzbD0pLndpdGgodHJ1ZSkKKyAgICAgICAgICBleHBlY3QoaHR0cCkudG8gcmVjZWl2ZSg6dmVyaWZ5X21vZGU9KS53aXRoKE9wZW5TU0w6OlNTTDo6VkVSSUZZX1BFRVIpCisgICAgICAgICAgZXhwZWN0KGh0dHApLnRvIHJlY2VpdmUoOnBvc3QpLndpdGgoQHNlcnZpY2VfcGF0aCwgInRlc3QiLAorICAgICAgICAgICAgICAiQ29udGVudC1UeXBlIiA9PiAiYXBwbGljYXRpb24veC10aHJpZnQiKSBkbworICAgICAgICAgICAgZG91YmxlKCJOZXQ6OkhUVFBPSyIpLnRhcCBkbyB8cmVzcG9uc2V8CisgICAgICAgICAgICAgIGV4cGVjdChyZXNwb25zZSkudG8gcmVjZWl2ZSg6Ym9keSkuYW5kX3JldHVybiAiZGF0YSIKICAgICAgICAgICAgIGVuZAogICAgICAgICAgIGVuZAogICAgICAgICBlbmQKICAgICAgIGVuZAogICAgICAgY2xpZW50LmZsdXNoCi0gICAgICBjbGllbnQucmVhZCg0KS5zaG91bGQgPT0gImRhdGEiCisgICAgICBleHBlY3QoY2xpZW50LnJlYWQoNCkpLnRvIGVxKCJkYXRhIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgc2V0IFNTTCB2ZXJpZnkgbW9kZSB3aGVuIHNwZWNpZmllZCIgZG8KQEAgLTEwMSwyMCArMTIwLDIwIEBACiAgICAgICAgICAgOnNzbF92ZXJpZnlfbW9kZSA9PiBPcGVuU1NMOjpTU0w6OlZFUklGWV9OT05FKQogCiAgICAgICBjbGllbnQud3JpdGUgInRlc3QiCi0gICAgICBOZXQ6OkhUVFAuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aCgibXkuZG9tYWluLmNvbSIsIDQ0MykuYW5kX3JldHVybiBkbwotICAgICAgICBtb2NrKCJOZXQ6OkhUVFAiKS50YXAgZG8gfGh0dHB8Ci0gICAgICAgICAgaHR0cC5zaG91bGRfcmVjZWl2ZSg6dXNlX3NzbD0pLndpdGgodHJ1ZSkKLSAgICAgICAgICBodHRwLnNob3VsZF9yZWNlaXZlKDp2ZXJpZnlfbW9kZT0pLndpdGgoT3BlblNTTDo6U1NMOjpWRVJJRllfTk9ORSkKLSAgICAgICAgICBodHRwLnNob3VsZF9yZWNlaXZlKDpwb3N0KS53aXRoKEBzZXJ2aWNlX3BhdGgsICJ0ZXN0IiwKLSAgICAgICAgICAgICAgIkNvbnRlbnQtVHlwZSIgPT4gImFwcGxpY2F0aW9uL3gtdGhyaWZ0IikuYW5kX3JldHVybiBkbwotICAgICAgICAgICAgbW9jaygiTmV0OjpIVFRQT0siKS50YXAgZG8gfHJlc3BvbnNlfAotICAgICAgICAgICAgICByZXNwb25zZS5zaG91bGRfcmVjZWl2ZSg6Ym9keSkuYW5kX3JldHVybiAiZGF0YSIKKyAgICAgIGV4cGVjdChOZXQ6OkhUVFApLnRvIHJlY2VpdmUoOm5ldykud2l0aCgibXkuZG9tYWluLmNvbSIsIDQ0MykgZG8KKyAgICAgICAgZG91YmxlKCJOZXQ6OkhUVFAiKS50YXAgZG8gfGh0dHB8CisgICAgICAgICAgZXhwZWN0KGh0dHApLnRvIHJlY2VpdmUoOnVzZV9zc2w9KS53aXRoKHRydWUpCisgICAgICAgICAgZXhwZWN0KGh0dHApLnRvIHJlY2VpdmUoOnZlcmlmeV9tb2RlPSkud2l0aChPcGVuU1NMOjpTU0w6OlZFUklGWV9OT05FKQorICAgICAgICAgIGV4cGVjdChodHRwKS50byByZWNlaXZlKDpwb3N0KS53aXRoKEBzZXJ2aWNlX3BhdGgsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgIkNvbnRlbnQtVHlwZSIgPT4gImFwcGxpY2F0aW9uL3gtdGhyaWZ0IikgZG8KKyAgICAgICAgICAgIGRvdWJsZSgiTmV0OjpIVFRQT0siKS50YXAgZG8gfHJlc3BvbnNlfAorICAgICAgICAgICAgICBleHBlY3QocmVzcG9uc2UpLnRvIHJlY2VpdmUoOmJvZHkpLmFuZF9yZXR1cm4gImRhdGEiCiAgICAgICAgICAgICBlbmQKICAgICAgICAgICBlbmQKICAgICAgICAgZW5kCiAgICAgICBlbmQKICAgICAgIGNsaWVudC5mbHVzaAotICAgICAgY2xpZW50LnJlYWQoNCkuc2hvdWxkID09ICJkYXRhIgorICAgICAgZXhwZWN0KGNsaWVudC5yZWFkKDQpKS50byBlcSgiZGF0YSIpCiAgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9qc29uX3Byb3RvY29sX3NwZWMucmIgYi9saWIvcmIvc3BlYy9qc29uX3Byb3RvY29sX3NwZWMucmIKaW5kZXggMmY3ZjFlNi4uZmUxYWY3YiAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvanNvbl9wcm90b2NvbF9zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL2pzb25fcHJvdG9jb2xfc3BlYy5yYgpAQCAtMzAsMjUyICszMCwyNTcgQEAKIAogICAgIGl0ICJzaG91bGQgd3JpdGUganNvbiBlc2NhcGVkIGNoYXIiIGRvCiAgICAgICBAcHJvdC53cml0ZV9qc29uX2VzY2FwZV9jaGFyKCJcbiIpCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gJ1x1MDAwYScKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoJ1x1MDAwYScpCiAKICAgICAgIEBwcm90LndyaXRlX2pzb25fZXNjYXBlX2NoYXIoIiAiKQotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICdcdTAwMjAnCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCdcdTAwMjAnKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCB3cml0ZSBqc29uIGNoYXIiIGRvCiAgICAgICBAcHJvdC53cml0ZV9qc29uX2NoYXIoIlxuIikKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAnXFxuJworICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgnXFxuJykKIAogICAgICAgQHByb3Qud3JpdGVfanNvbl9jaGFyKCIgIikKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAnICcKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoJyAnKQogCiAgICAgICBAcHJvdC53cml0ZV9qc29uX2NoYXIoIlxcIikKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiXFxcXCIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlxcXFwiKQogCiAgICAgICBAcHJvdC53cml0ZV9qc29uX2NoYXIoIkAiKQotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICdAJworICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgnQCcpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIGpzb24gc3RyaW5nIiBkbwogICAgICAgQHByb3Qud3JpdGVfanNvbl9zdHJpbmcoInRoaXMgaXMgYSBcXCBqc29uXG5zdHJpbmciKQotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJcInRoaXMgaXMgYSBcXFxcIGpzb25cXG5zdHJpbmdcIiIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlwidGhpcyBpcyBhIFxcXFwganNvblxcbnN0cmluZ1wiIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUganNvbiBiYXNlNjQiIGRvCiAgICAgICBAcHJvdC53cml0ZV9qc29uX2Jhc2U2NCgidGhpcyBpcyBhIGJhc2U2NCBzdHJpbmciKQotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJcIlwiZEdocGN5QnBjeUJoSUdKaGMyVTJOQ0J6ZEhKcGJtYz1cXG5cIlwiIgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXCJkR2hwY3lCcGN5QmhJR0poYzJVMk5DQnpkSEpwYm1jPVwiIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUganNvbiBpbnRlZ2VyIiBkbwogICAgICAgQHByb3Qud3JpdGVfanNvbl9pbnRlZ2VyKDQ1KQotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICI0NSIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIjQ1IikKIAogICAgICAgQHByb3Qud3JpdGVfanNvbl9pbnRlZ2VyKDMzMDAwKQotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICIzMzAwMCIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIjMzMDAwIikKIAogICAgICAgQHByb3Qud3JpdGVfanNvbl9pbnRlZ2VyKDMwMDAwMDAwMDApCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIjMwMDAwMDAwMDAiCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCIzMDAwMDAwMDAwIikKIAogICAgICAgQHByb3Qud3JpdGVfanNvbl9pbnRlZ2VyKDYwMDAwMDAwMDApCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIjYwMDAwMDAwMDAiCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCI2MDAwMDAwMDAwIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUganNvbiBkb3VibGUiIGRvCiAgICAgICBAcHJvdC53cml0ZV9qc29uX2RvdWJsZSgxMi4zKQotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICIxMi4zIgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiMTIuMyIpCiAKICAgICAgIEBwcm90LndyaXRlX2pzb25fZG91YmxlKC0zLjIxKQotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICItMy4yMSIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIi0zLjIxIikKIAogICAgICAgQHByb3Qud3JpdGVfanNvbl9kb3VibGUoKCgrMS4wLzAuMCkvKCsxLjAvMC4wKSkpCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIlwiTmFOXCIiCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJcIk5hTlwiIikKIAogICAgICAgQHByb3Qud3JpdGVfanNvbl9kb3VibGUoKCsxLjAvMC4wKSkKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiXCJJbmZpbml0eVwiIgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXCJJbmZpbml0eVwiIikKIAogICAgICAgQHByb3Qud3JpdGVfanNvbl9kb3VibGUoKC0xLjAvMC4wKSkKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiXCItSW5maW5pdHlcIiIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlwiLUluZmluaXR5XCIiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCB3cml0ZSBqc29uIG9iamVjdCBzdGFydCIgZG8KICAgICAgIEBwcm90LndyaXRlX2pzb25fb2JqZWN0X3N0YXJ0Ci0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gInsiCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJ7IikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUganNvbiBvYmplY3QgZW5kIiBkbwogICAgICAgQHByb3Qud3JpdGVfanNvbl9vYmplY3RfZW5kCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIn0iCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJ9IikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUganNvbiBhcnJheSBzdGFydCIgZG8KICAgICAgIEBwcm90LndyaXRlX2pzb25fYXJyYXlfc3RhcnQKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiWyIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlsiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCB3cml0ZSBqc29uIGFycmF5IGVuZCIgZG8KICAgICAgIEBwcm90LndyaXRlX2pzb25fYXJyYXlfZW5kCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIl0iCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJdIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUgbWVzc2FnZSBiZWdpbiIgZG8KICAgICAgIEBwcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oIm5hbWUiLCAxMiwgMzIpCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIlsxLFwibmFtZVwiLDEyLDMyIgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiWzEsXCJuYW1lXCIsMTIsMzIiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCB3cml0ZSBtZXNzYWdlIGVuZCIgZG8KICAgICAgIEBwcm90LndyaXRlX21lc3NhZ2VfZW5kCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIl0iCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJdIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUgc3RydWN0IGJlZ2luIiBkbwogICAgICAgQHByb3Qud3JpdGVfc3RydWN0X2JlZ2luKCJuYW1lIikKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAieyIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoInsiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCB3cml0ZSBzdHJ1Y3QgZW5kIiBkbwogICAgICAgQHByb3Qud3JpdGVfc3RydWN0X2VuZAotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJ9IgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgifSIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIGZpZWxkIGJlZ2luIiBkbwogICAgICAgQHByb3Qud3JpdGVfZmllbGRfYmVnaW4oIm5hbWUiLCBUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QsIDMyKQotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICIzMntcInJlY1wiIgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiMzJ7XCJyZWNcIiIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIGZpZWxkIGVuZCIgZG8KICAgICAgIEBwcm90LndyaXRlX2ZpZWxkX2VuZAotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJ9IgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgifSIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIGZpZWxkIHN0b3AiIGRvCiAgICAgICBAcHJvdC53cml0ZV9maWVsZF9zdG9wCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIiIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIiIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIG1hcCBiZWdpbiIgZG8KICAgICAgIEBwcm90LndyaXRlX21hcF9iZWdpbihUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QsIFRocmlmdDo6VHlwZXM6OkxJU1QsIDMyKQotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJbXCJyZWNcIixcImxzdFwiLDMyLHsiCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJbXCJyZWNcIixcImxzdFwiLDMyLHsiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCB3cml0ZSBtYXAgZW5kIiBkbwogICAgICAgQHByb3Qud3JpdGVfbWFwX2VuZAotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJ9XSIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIn1dIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUgbGlzdCBiZWdpbiIgZG8KICAgICAgIEBwcm90LndyaXRlX2xpc3RfYmVnaW4oVGhyaWZ0OjpUeXBlczo6U1RSVUNULCAzMikKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiW1wicmVjXCIsMzIiCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJbXCJyZWNcIiwzMiIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIGxpc3QgZW5kIiBkbwogICAgICAgQHByb3Qud3JpdGVfbGlzdF9lbmQKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiXSIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIl0iKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCB3cml0ZSBzZXQgYmVnaW4iIGRvCiAgICAgICBAcHJvdC53cml0ZV9zZXRfYmVnaW4oVGhyaWZ0OjpUeXBlczo6U1RSVUNULCAzMikKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiW1wicmVjXCIsMzIiCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJbXCJyZWNcIiwzMiIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIHNldCBlbmQiIGRvCiAgICAgICBAcHJvdC53cml0ZV9zZXRfZW5kCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIl0iCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJdIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUgYm9vbCIgZG8KICAgICAgIEBwcm90LndyaXRlX2Jvb2wodHJ1ZSkKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiMSIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIjEiKQogCiAgICAgICBAcHJvdC53cml0ZV9ib29sKGZhbHNlKQotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICIwIgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiMCIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIGJ5dGUiIGRvCiAgICAgICBAcHJvdC53cml0ZV9ieXRlKDEwMCkKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiMTAwIgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiMTAwIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUgaTE2IiBkbwogICAgICAgQHByb3Qud3JpdGVfaTE2KDEwMDApCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIjEwMDAiCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCIxMDAwIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUgaTMyIiBkbwogICAgICAgQHByb3Qud3JpdGVfaTMyKDMwMDAwMDAwMDApCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIjMwMDAwMDAwMDAiCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCIzMDAwMDAwMDAwIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUgaTY0IiBkbwogICAgICAgQHByb3Qud3JpdGVfaTY0KDYwMDAwMDAwMDApCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIjYwMDAwMDAwMDAiCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCI2MDAwMDAwMDAwIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUgZG91YmxlIiBkbwogICAgICAgQHByb3Qud3JpdGVfZG91YmxlKDEuMjMpCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIjEuMjMiCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCIxLjIzIikKIAogICAgICAgQHByb3Qud3JpdGVfZG91YmxlKC0zMi4xKQotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICItMzIuMSIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIi0zMi4xIikKIAogICAgICAgQHByb3Qud3JpdGVfZG91YmxlKCgoKzEuMC8wLjApLygrMS4wLzAuMCkpKQotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJcIk5hTlwiIgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXCJOYU5cIiIpCiAKICAgICAgIEBwcm90LndyaXRlX2RvdWJsZSgoKzEuMC8wLjApKQotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJcIkluZmluaXR5XCIiCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJcIkluZmluaXR5XCIiKQogCiAgICAgICBAcHJvdC53cml0ZV9kb3VibGUoKC0xLjAvMC4wKSkKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiXCItSW5maW5pdHlcIiIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlwiLUluZmluaXR5XCIiKQogICAgIGVuZAogCiAgICAgaWYgUlVCWV9WRVJTSU9OID49ICcxLjknCiAgICAgICBpdCAnc2hvdWxkIHdyaXRlIHN0cmluZycgZG8KICAgICAgICAgQHByb3Qud3JpdGVfc3RyaW5nKCd0aGlzIGlzIGEgdGVzdCBzdHJpbmcnKQogICAgICAgICBhID0gQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkKLSAgICAgICAgYS5zaG91bGQgPT0gJyJ0aGlzIGlzIGEgdGVzdCBzdHJpbmciJy5mb3JjZV9lbmNvZGluZyhFbmNvZGluZzo6QklOQVJZKQotICAgICAgICBhLmVuY29kaW5nLnNob3VsZCA9PSBFbmNvZGluZzo6QklOQVJZCisgICAgICAgIGV4cGVjdChhKS50byBlcSgnInRoaXMgaXMgYSB0ZXN0IHN0cmluZyInLmZvcmNlX2VuY29kaW5nKEVuY29kaW5nOjpCSU5BUlkpKQorICAgICAgICBleHBlY3QoYS5lbmNvZGluZykudG8gZXEoRW5jb2Rpbmc6OkJJTkFSWSkKICAgICAgIGVuZAogCiAgICAgICBpdCAnc2hvdWxkIHdyaXRlIHN0cmluZyB3aXRoIHVuaWNvZGUgY2hhcmFjdGVycycgZG8KICAgICAgICAgQHByb3Qud3JpdGVfc3RyaW5nKCJ0aGlzIGlzIGEgdGVzdCBzdHJpbmcgd2l0aCB1bmljb2RlIGNoYXJhY3RlcnM6IFx1MjBBQyBcdTIwQUQiKQogICAgICAgICBhID0gQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkKLSAgICAgICAgYS5zaG91bGQgPT0gIlwidGhpcyBpcyBhIHRlc3Qgc3RyaW5nIHdpdGggdW5pY29kZSBjaGFyYWN0ZXJzOiBcdTIwQUMgXHUyMEFEXCIiLmZvcmNlX2VuY29kaW5nKEVuY29kaW5nOjpCSU5BUlkpCi0gICAgICAgIGEuZW5jb2Rpbmcuc2hvdWxkID09IEVuY29kaW5nOjpCSU5BUlkKKyAgICAgICAgZXhwZWN0KGEpLnRvIGVxKCJcInRoaXMgaXMgYSB0ZXN0IHN0cmluZyB3aXRoIHVuaWNvZGUgY2hhcmFjdGVyczogXHUyMEFDIFx1MjBBRFwiIi5mb3JjZV9lbmNvZGluZyhFbmNvZGluZzo6QklOQVJZKSkKKyAgICAgICAgZXhwZWN0KGEuZW5jb2RpbmcpLnRvIGVxKEVuY29kaW5nOjpCSU5BUlkpCiAgICAgICBlbmQKICAgICBlbHNlCiAgICAgICBpdCAnc2hvdWxkIHdyaXRlIHN0cmluZycgZG8KICAgICAgICAgQHByb3Qud3JpdGVfc3RyaW5nKCd0aGlzIGlzIGEgdGVzdCBzdHJpbmcnKQotICAgICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gJyJ0aGlzIGlzIGEgdGVzdCBzdHJpbmciJworICAgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCcidGhpcyBpcyBhIHRlc3Qgc3RyaW5nIicpCiAgICAgICBlbmQKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUgYmluYXJ5IiBkbwogICAgICAgQHByb3Qud3JpdGVfYmluYXJ5KCJ0aGlzIGlzIGEgYmFzZTY0IHN0cmluZyIpCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIlwiXCJkR2hwY3lCcGN5QmhJR0poYzJVMk5DQnpkSEpwYm1jPVxcblwiXCIiCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJcImRHaHBjeUJwY3lCaElHSmhjMlUyTkNCemRISnBibWM9XCIiKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCB3cml0ZSBsb25nIGJpbmFyeSIgZG8KKyAgICAgIEBwcm90LndyaXRlX2JpbmFyeSgoMC4uLjI1NikudG9fYS5wYWNrKCdDKicpKQorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXCJBQUVDQXdRRkJnY0lDUW9MREEwT0R4QVJFaE1VRlJZWEdCa2FHeHdkSGg4Z0lTSWpKQ1VtSnlncEtpc3NMUzR2TURFeU16UTFOamM0T1RvN1BEMCtQMEJCUWtORVJVWkhTRWxLUzB4TlRrOVFVVkpUVkZWV1YxaFpXbHRjWFY1ZllHRmlZMlJsWm1kb2FXcHJiRzF1YjNCeGNuTjBkWFozZUhsNmUzeDlmbitBZ1lLRGhJV0doNGlKaW91TWpZNlBrSkdTazVTVmxwZVltWnFibkoyZW42Q2hvcU9rcGFhbnFLbXFxNnl0cnErd3NiS3p0TFcydDdpNXVydTh2YjYvd01IQ3c4VEZ4c2ZJeWNyTHpNM096OURSMHRQVTFkYlgyTm5hMjl6ZDN0L2c0ZUxqNU9YbTUranA2dXZzN2U3djhQSHk4L1QxOXZmNCtmcjcvUDMrL3c9PVwiIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgZ2V0IHR5cGUgbmFtZSBmb3IgdHlwZSBpZCIgZG8KICAgICAgIGV4cGVjdCB7QHByb3QuZ2V0X3R5cGVfbmFtZV9mb3JfdHlwZV9pZChUaHJpZnQ6OlR5cGVzOjpTVE9QKX0udG8gcmFpc2VfZXJyb3IoTm90SW1wbGVtZW50ZWRFcnJvcikKICAgICAgIGV4cGVjdCB7QHByb3QuZ2V0X3R5cGVfbmFtZV9mb3JfdHlwZV9pZChUaHJpZnQ6OlR5cGVzOjpWT0lEKX0udG8gcmFpc2VfZXJyb3IoTm90SW1wbGVtZW50ZWRFcnJvcikKLSAgICAgIEBwcm90LmdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoVGhyaWZ0OjpUeXBlczo6Qk9PTCkuc2hvdWxkID09ICJ0ZiIKLSAgICAgIEBwcm90LmdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoVGhyaWZ0OjpUeXBlczo6QllURSkuc2hvdWxkID09ICJpOCIKLSAgICAgIEBwcm90LmdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoVGhyaWZ0OjpUeXBlczo6RE9VQkxFKS5zaG91bGQgPT0gImRibCIKLSAgICAgIEBwcm90LmdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoVGhyaWZ0OjpUeXBlczo6STE2KS5zaG91bGQgPT0gImkxNiIKLSAgICAgIEBwcm90LmdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoVGhyaWZ0OjpUeXBlczo6STMyKS5zaG91bGQgPT0gImkzMiIKLSAgICAgIEBwcm90LmdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoVGhyaWZ0OjpUeXBlczo6STY0KS5zaG91bGQgPT0gImk2NCIKLSAgICAgIEBwcm90LmdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoVGhyaWZ0OjpUeXBlczo6U1RSSU5HKS5zaG91bGQgPT0gInN0ciIKLSAgICAgIEBwcm90LmdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoVGhyaWZ0OjpUeXBlczo6U1RSVUNUKS5zaG91bGQgPT0gInJlYyIKLSAgICAgIEBwcm90LmdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoVGhyaWZ0OjpUeXBlczo6TUFQKS5zaG91bGQgPT0gIm1hcCIKLSAgICAgIEBwcm90LmdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoVGhyaWZ0OjpUeXBlczo6U0VUKS5zaG91bGQgPT0gInNldCIKLSAgICAgIEBwcm90LmdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoVGhyaWZ0OjpUeXBlczo6TElTVCkuc2hvdWxkID09ICJsc3QiCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfbmFtZV9mb3JfdHlwZV9pZChUaHJpZnQ6OlR5cGVzOjpCT09MKSkudG8gZXEoInRmIikKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6OkJZVEUpKS50byBlcSgiaTgiKQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoVGhyaWZ0OjpUeXBlczo6RE9VQkxFKSkudG8gZXEoImRibCIpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfbmFtZV9mb3JfdHlwZV9pZChUaHJpZnQ6OlR5cGVzOjpJMTYpKS50byBlcSgiaTE2IikKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6OkkzMikpLnRvIGVxKCJpMzIiKQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoVGhyaWZ0OjpUeXBlczo6STY0KSkudG8gZXEoImk2NCIpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfbmFtZV9mb3JfdHlwZV9pZChUaHJpZnQ6OlR5cGVzOjpTVFJJTkcpKS50byBlcSgic3RyIikKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6OlNUUlVDVCkpLnRvIGVxKCJyZWMiKQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoVGhyaWZ0OjpUeXBlczo6TUFQKSkudG8gZXEoIm1hcCIpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfbmFtZV9mb3JfdHlwZV9pZChUaHJpZnQ6OlR5cGVzOjpTRVQpKS50byBlcSgic2V0IikKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6OkxJU1QpKS50byBlcSgibHN0IikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgZ2V0IHR5cGUgaWQgZm9yIHR5cGUgbmFtZSIgZG8KICAgICAgIGV4cGVjdCB7QHByb3QuZ2V0X3R5cGVfaWRfZm9yX3R5cGVfbmFtZSgicHAiKX0udG8gcmFpc2VfZXJyb3IoTm90SW1wbGVtZW50ZWRFcnJvcikKLSAgICAgIEBwcm90LmdldF90eXBlX2lkX2Zvcl90eXBlX25hbWUoInRmIikuc2hvdWxkID09IFRocmlmdDo6VHlwZXM6OkJPT0wKLSAgICAgIEBwcm90LmdldF90eXBlX2lkX2Zvcl90eXBlX25hbWUoImk4Iikuc2hvdWxkID09IFRocmlmdDo6VHlwZXM6OkJZVEUKLSAgICAgIEBwcm90LmdldF90eXBlX2lkX2Zvcl90eXBlX25hbWUoImRibCIpLnNob3VsZCA9PSBUaHJpZnQ6OlR5cGVzOjpET1VCTEUKLSAgICAgIEBwcm90LmdldF90eXBlX2lkX2Zvcl90eXBlX25hbWUoImkxNiIpLnNob3VsZCA9PSBUaHJpZnQ6OlR5cGVzOjpJMTYKLSAgICAgIEBwcm90LmdldF90eXBlX2lkX2Zvcl90eXBlX25hbWUoImkzMiIpLnNob3VsZCA9PSBUaHJpZnQ6OlR5cGVzOjpJMzIKLSAgICAgIEBwcm90LmdldF90eXBlX2lkX2Zvcl90eXBlX25hbWUoImk2NCIpLnNob3VsZCA9PSBUaHJpZnQ6OlR5cGVzOjpJNjQKLSAgICAgIEBwcm90LmdldF90eXBlX2lkX2Zvcl90eXBlX25hbWUoInN0ciIpLnNob3VsZCA9PSBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcKLSAgICAgIEBwcm90LmdldF90eXBlX2lkX2Zvcl90eXBlX25hbWUoInJlYyIpLnNob3VsZCA9PSBUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QKLSAgICAgIEBwcm90LmdldF90eXBlX2lkX2Zvcl90eXBlX25hbWUoIm1hcCIpLnNob3VsZCA9PSBUaHJpZnQ6OlR5cGVzOjpNQVAKLSAgICAgIEBwcm90LmdldF90eXBlX2lkX2Zvcl90eXBlX25hbWUoInNldCIpLnNob3VsZCA9PSBUaHJpZnQ6OlR5cGVzOjpTRVQKLSAgICAgIEBwcm90LmdldF90eXBlX2lkX2Zvcl90eXBlX25hbWUoImxzdCIpLnNob3VsZCA9PSBUaHJpZnQ6OlR5cGVzOjpMSVNUCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfaWRfZm9yX3R5cGVfbmFtZSgidGYiKSkudG8gZXEoVGhyaWZ0OjpUeXBlczo6Qk9PTCkKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJpOCIpKS50byBlcShUaHJpZnQ6OlR5cGVzOjpCWVRFKQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX2lkX2Zvcl90eXBlX25hbWUoImRibCIpKS50byBlcShUaHJpZnQ6OlR5cGVzOjpET1VCTEUpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfaWRfZm9yX3R5cGVfbmFtZSgiaTE2IikpLnRvIGVxKFRocmlmdDo6VHlwZXM6OkkxNikKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJpMzIiKSkudG8gZXEoVGhyaWZ0OjpUeXBlczo6STMyKQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX2lkX2Zvcl90eXBlX25hbWUoImk2NCIpKS50byBlcShUaHJpZnQ6OlR5cGVzOjpJNjQpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfaWRfZm9yX3R5cGVfbmFtZSgic3RyIikpLnRvIGVxKFRocmlmdDo6VHlwZXM6OlNUUklORykKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJyZWMiKSkudG8gZXEoVGhyaWZ0OjpUeXBlczo6U1RSVUNUKQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX2lkX2Zvcl90eXBlX25hbWUoIm1hcCIpKS50byBlcShUaHJpZnQ6OlR5cGVzOjpNQVApCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfaWRfZm9yX3R5cGVfbmFtZSgic2V0IikpLnRvIGVxKFRocmlmdDo6VHlwZXM6OlNFVCkKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJsc3QiKSkudG8gZXEoVGhyaWZ0OjpUeXBlczo6TElTVCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVhZCBqc29uIHN5bnRheCBjaGFyIiBkbwpAQCAtMjg3LDQ3ICsyOTIsNjggQEAKIAogICAgIGl0ICJzaG91bGQgcmVhZCBqc29uIGVzY2FwZSBjaGFyIiBkbwogICAgICAgQHRyYW5zLndyaXRlKCcwMDU0JykKLSAgICAgIEBwcm90LnJlYWRfanNvbl9lc2NhcGVfY2hhci5zaG91bGQgPT0gJ1QnCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX2VzY2FwZV9jaGFyKS50byBlcSgnVCcpCisKKyAgICAgIEB0cmFucy53cml0ZSgiXCJcXFwiXCIiKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9zdHJpbmcoZmFsc2UpKS50byBlcSgiXCIiKQorCisgICAgICBAdHJhbnMud3JpdGUoIlwiXFxcXFwiIikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2pzb25fc3RyaW5nKGZhbHNlKSkudG8gZXEoIlxcIikKKworICAgICAgQHRyYW5zLndyaXRlKCJcIlxcL1wiIikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2pzb25fc3RyaW5nKGZhbHNlKSkudG8gZXEoIlwvIikKKworICAgICAgQHRyYW5zLndyaXRlKCJcIlxcYlwiIikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2pzb25fc3RyaW5nKGZhbHNlKSkudG8gZXEoIlxiIikKKworICAgICAgQHRyYW5zLndyaXRlKCJcIlxcZlwiIikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2pzb25fc3RyaW5nKGZhbHNlKSkudG8gZXEoIlxmIikKKworICAgICAgQHRyYW5zLndyaXRlKCJcIlxcblwiIikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2pzb25fc3RyaW5nKGZhbHNlKSkudG8gZXEoIlxuIikKKworICAgICAgQHRyYW5zLndyaXRlKCJcIlxcclwiIikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2pzb25fc3RyaW5nKGZhbHNlKSkudG8gZXEoIlxyIikKKworICAgICAgQHRyYW5zLndyaXRlKCJcIlxcdFwiIikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2pzb25fc3RyaW5nKGZhbHNlKSkudG8gZXEoIlx0IikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVhZCBqc29uIHN0cmluZyIgZG8KICAgICAgIEB0cmFucy53cml0ZSgiXCJcXFAiKQogICAgICAgZXhwZWN0IHtAcHJvdC5yZWFkX2pzb25fc3RyaW5nKGZhbHNlKX0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbikKIAotICAgICAgQHRyYW5zLndyaXRlKCJcIlxcblwiIikKLSAgICAgIEBwcm90LnJlYWRfanNvbl9zdHJpbmcoZmFsc2UpLnNob3VsZCA9PSAiXFxuIgotCiAgICAgICBAdHJhbnMud3JpdGUoIlwidGhpcyBpcyBhIHRlc3Qgc3RyaW5nXCIiKQotICAgICAgQHByb3QucmVhZF9qc29uX3N0cmluZy5zaG91bGQgPT0gInRoaXMgaXMgYSB0ZXN0IHN0cmluZyIKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2pzb25fc3RyaW5nKS50byBlcSgidGhpcyBpcyBhIHRlc3Qgc3RyaW5nIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVhZCBqc29uIGJhc2U2NCIgZG8KICAgICAgIEB0cmFucy53cml0ZSgiXCJkR2hwY3lCcGN5QmhJSFJsYzNRZ2MzUnlhVzVuXCIiKQotICAgICAgQHByb3QucmVhZF9qc29uX2Jhc2U2NC5zaG91bGQgPT0gInRoaXMgaXMgYSB0ZXN0IHN0cmluZyIKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2pzb25fYmFzZTY0KS50byBlcSgidGhpcyBpcyBhIHRlc3Qgc3RyaW5nIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgaXMganNvbiBudW1lcmljIiBkbwotICAgICAgQHByb3QuaXNfanNvbl9udW1lcmljKCJBIikuc2hvdWxkID09IGZhbHNlCi0gICAgICBAcHJvdC5pc19qc29uX251bWVyaWMoIisiKS5zaG91bGQgPT0gdHJ1ZQotICAgICAgQHByb3QuaXNfanNvbl9udW1lcmljKCItIikuc2hvdWxkID09IHRydWUKLSAgICAgIEBwcm90LmlzX2pzb25fbnVtZXJpYygiLiIpLnNob3VsZCA9PSB0cnVlCi0gICAgICBAcHJvdC5pc19qc29uX251bWVyaWMoIjAiKS5zaG91bGQgPT0gdHJ1ZQotICAgICAgQHByb3QuaXNfanNvbl9udW1lcmljKCIxIikuc2hvdWxkID09IHRydWUKLSAgICAgIEBwcm90LmlzX2pzb25fbnVtZXJpYygiMiIpLnNob3VsZCA9PSB0cnVlCi0gICAgICBAcHJvdC5pc19qc29uX251bWVyaWMoIjMiKS5zaG91bGQgPT0gdHJ1ZQotICAgICAgQHByb3QuaXNfanNvbl9udW1lcmljKCI0Iikuc2hvdWxkID09IHRydWUKLSAgICAgIEBwcm90LmlzX2pzb25fbnVtZXJpYygiNSIpLnNob3VsZCA9PSB0cnVlCi0gICAgICBAcHJvdC5pc19qc29uX251bWVyaWMoIjYiKS5zaG91bGQgPT0gdHJ1ZQotICAgICAgQHByb3QuaXNfanNvbl9udW1lcmljKCI3Iikuc2hvdWxkID09IHRydWUKLSAgICAgIEBwcm90LmlzX2pzb25fbnVtZXJpYygiOCIpLnNob3VsZCA9PSB0cnVlCi0gICAgICBAcHJvdC5pc19qc29uX251bWVyaWMoIjkiKS5zaG91bGQgPT0gdHJ1ZQotICAgICAgQHByb3QuaXNfanNvbl9udW1lcmljKCJFIikuc2hvdWxkID09IHRydWUKLSAgICAgIEBwcm90LmlzX2pzb25fbnVtZXJpYygiZSIpLnNob3VsZCA9PSB0cnVlCisgICAgICBleHBlY3QoQHByb3QuaXNfanNvbl9udW1lcmljKCJBIikpLnRvIGVxKGZhbHNlKQorICAgICAgZXhwZWN0KEBwcm90LmlzX2pzb25fbnVtZXJpYygiKyIpKS50byBlcSh0cnVlKQorICAgICAgZXhwZWN0KEBwcm90LmlzX2pzb25fbnVtZXJpYygiLSIpKS50byBlcSh0cnVlKQorICAgICAgZXhwZWN0KEBwcm90LmlzX2pzb25fbnVtZXJpYygiLiIpKS50byBlcSh0cnVlKQorICAgICAgZXhwZWN0KEBwcm90LmlzX2pzb25fbnVtZXJpYygiMCIpKS50byBlcSh0cnVlKQorICAgICAgZXhwZWN0KEBwcm90LmlzX2pzb25fbnVtZXJpYygiMSIpKS50byBlcSh0cnVlKQorICAgICAgZXhwZWN0KEBwcm90LmlzX2pzb25fbnVtZXJpYygiMiIpKS50byBlcSh0cnVlKQorICAgICAgZXhwZWN0KEBwcm90LmlzX2pzb25fbnVtZXJpYygiMyIpKS50byBlcSh0cnVlKQorICAgICAgZXhwZWN0KEBwcm90LmlzX2pzb25fbnVtZXJpYygiNCIpKS50byBlcSh0cnVlKQorICAgICAgZXhwZWN0KEBwcm90LmlzX2pzb25fbnVtZXJpYygiNSIpKS50byBlcSh0cnVlKQorICAgICAgZXhwZWN0KEBwcm90LmlzX2pzb25fbnVtZXJpYygiNiIpKS50byBlcSh0cnVlKQorICAgICAgZXhwZWN0KEBwcm90LmlzX2pzb25fbnVtZXJpYygiNyIpKS50byBlcSh0cnVlKQorICAgICAgZXhwZWN0KEBwcm90LmlzX2pzb25fbnVtZXJpYygiOCIpKS50byBlcSh0cnVlKQorICAgICAgZXhwZWN0KEBwcm90LmlzX2pzb25fbnVtZXJpYygiOSIpKS50byBlcSh0cnVlKQorICAgICAgZXhwZWN0KEBwcm90LmlzX2pzb25fbnVtZXJpYygiRSIpKS50byBlcSh0cnVlKQorICAgICAgZXhwZWN0KEBwcm90LmlzX2pzb25fbnVtZXJpYygiZSIpKS50byBlcSh0cnVlKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZWFkIGpzb24gbnVtZXJpYyBjaGFycyIgZG8KICAgICAgIEB0cmFucy53cml0ZSgiMS40NTNFNDVUIikKLSAgICAgIEBwcm90LnJlYWRfanNvbl9udW1lcmljX2NoYXJzLnNob3VsZCA9PSAiMS40NTNFNDUiCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX251bWVyaWNfY2hhcnMpLnRvIGVxKCIxLjQ1M0U0NSIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlYWQganNvbiBpbnRlZ2VyIiBkbwpAQCAtMzM2LDcgKzM2Miw3IEBACiAgICAgICBAcHJvdC5yZWFkX3N0cmluZwogCiAgICAgICBAdHJhbnMud3JpdGUoIjE0NTNUIikKLSAgICAgIEBwcm90LnJlYWRfanNvbl9pbnRlZ2VyLnNob3VsZCA9PSAxNDUzCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX2ludGVnZXIpLnRvIGVxKDE0NTMpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlYWQganNvbiBkb3VibGUiIGRvCkBAIC0zNDgsMzcgKzM3NCwzNyBAQAogICAgICAgZXhwZWN0IHtAcHJvdC5yZWFkX2pzb25fZG91YmxlfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uKQogCiAgICAgICBAdHJhbnMud3JpdGUoIjEuNDUzZTAxXCJcIiIpCi0gICAgICBAcHJvdC5yZWFkX2pzb25fZG91YmxlLnNob3VsZCA9PSAxNC41MworICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9kb3VibGUpLnRvIGVxKDE0LjUzKQogICAgICAgQHByb3QucmVhZF9zdHJpbmcKIAogICAgICAgQHRyYW5zLndyaXRlKCJcIk5hTlwiIikKLSAgICAgIEBwcm90LnJlYWRfanNvbl9kb3VibGUubmFuPy5zaG91bGQgPT0gdHJ1ZQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9kb3VibGUubmFuPykudG8gZXEodHJ1ZSkKIAogICAgICAgQHRyYW5zLndyaXRlKCJcIkluZmluaXR5XCIiKQotICAgICAgQHByb3QucmVhZF9qc29uX2RvdWJsZS5zaG91bGQgPT0gKzEuMC8wLjAKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2pzb25fZG91YmxlKS50byBlcSgrMS4wLzAuMCkKIAogICAgICAgQHRyYW5zLndyaXRlKCJcIi1JbmZpbml0eVwiIikKLSAgICAgIEBwcm90LnJlYWRfanNvbl9kb3VibGUuc2hvdWxkID09IC0xLjAvMC4wCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX2RvdWJsZSkudG8gZXEoLTEuMC8wLjApCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlYWQganNvbiBvYmplY3Qgc3RhcnQiIGRvCiAgICAgICBAdHJhbnMud3JpdGUoInsiKQotICAgICAgQHByb3QucmVhZF9qc29uX29iamVjdF9zdGFydC5zaG91bGQgPT0gbmlsCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX29iamVjdF9zdGFydCkudG8gZXEobmlsKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZWFkIGpzb24gb2JqZWN0IGVuZCIgZG8KICAgICAgIEB0cmFucy53cml0ZSgifSIpCi0gICAgICBAcHJvdC5yZWFkX2pzb25fb2JqZWN0X2VuZC5zaG91bGQgPT0gbmlsCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX29iamVjdF9lbmQpLnRvIGVxKG5pbCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVhZCBqc29uIGFycmF5IHN0YXJ0IiBkbwogICAgICAgQHRyYW5zLndyaXRlKCJbIikKLSAgICAgIEBwcm90LnJlYWRfanNvbl9hcnJheV9zdGFydC5zaG91bGQgPT0gbmlsCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX2FycmF5X3N0YXJ0KS50byBlcShuaWwpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlYWQganNvbiBhcnJheSBlbmQiIGRvCiAgICAgICBAdHJhbnMud3JpdGUoIl0iKQotICAgICAgQHByb3QucmVhZF9qc29uX2FycmF5X2VuZC5zaG91bGQgPT0gbmlsCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX2FycmF5X2VuZCkudG8gZXEobmlsKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZWFkX21lc3NhZ2VfYmVnaW4iIGRvCkBAIC0zODYsMTI4ICs0MTIsMTQxIEBACiAgICAgICBleHBlY3Qge0Bwcm90LnJlYWRfbWVzc2FnZV9iZWdpbn0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbikKIAogICAgICAgQHRyYW5zLndyaXRlKCJbMSxcIm5hbWVcIiwxMiwzMlwiXCIiKQotICAgICAgQHByb3QucmVhZF9tZXNzYWdlX2JlZ2luLnNob3VsZCA9PSBbIm5hbWUiLCAxMiwgMzJdCisgICAgICBleHBlY3QoQHByb3QucmVhZF9tZXNzYWdlX2JlZ2luKS50byBlcShbIm5hbWUiLCAxMiwgMzJdKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZWFkIG1lc3NhZ2UgZW5kIiBkbwogICAgICAgQHRyYW5zLndyaXRlKCJdIikKLSAgICAgIEBwcm90LnJlYWRfbWVzc2FnZV9lbmQuc2hvdWxkID09IG5pbAorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfbWVzc2FnZV9lbmQpLnRvIGVxKG5pbCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVhZCBzdHJ1Y3QgYmVnaW4iIGRvCiAgICAgICBAdHJhbnMud3JpdGUoInsiKQotICAgICAgQHByb3QucmVhZF9zdHJ1Y3RfYmVnaW4uc2hvdWxkID09IG5pbAorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfc3RydWN0X2JlZ2luKS50byBlcShuaWwpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlYWQgc3RydWN0IGVuZCIgZG8KICAgICAgIEB0cmFucy53cml0ZSgifSIpCi0gICAgICBAcHJvdC5yZWFkX3N0cnVjdF9lbmQuc2hvdWxkID09IG5pbAorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfc3RydWN0X2VuZCkudG8gZXEobmlsKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZWFkIGZpZWxkIGJlZ2luIiBkbwogICAgICAgQHRyYW5zLndyaXRlKCIxe1wicmVjXCIiKQotICAgICAgQHByb3QucmVhZF9maWVsZF9iZWdpbi5zaG91bGQgPT0gW25pbCwgMTIsIDFdCisgICAgICBleHBlY3QoQHByb3QucmVhZF9maWVsZF9iZWdpbikudG8gZXEoW25pbCwgMTIsIDFdKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZWFkIGZpZWxkIGVuZCIgZG8KICAgICAgIEB0cmFucy53cml0ZSgifSIpCi0gICAgICBAcHJvdC5yZWFkX2ZpZWxkX2VuZC5zaG91bGQgPT0gbmlsCisgICAgICBleHBlY3QoQHByb3QucmVhZF9maWVsZF9lbmQpLnRvIGVxKG5pbCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVhZCBtYXAgYmVnaW4iIGRvCiAgICAgICBAdHJhbnMud3JpdGUoIltcInJlY1wiLFwibHN0XCIsMix7IikKLSAgICAgIEBwcm90LnJlYWRfbWFwX2JlZ2luLnNob3VsZCA9PSBbMTIsIDE1LCAyXQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfbWFwX2JlZ2luKS50byBlcShbMTIsIDE1LCAyXSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVhZCBtYXAgZW5kIiBkbwogICAgICAgQHRyYW5zLndyaXRlKCJ9XSIpCi0gICAgICBAcHJvdC5yZWFkX21hcF9lbmQuc2hvdWxkID09IG5pbAorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfbWFwX2VuZCkudG8gZXEobmlsKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZWFkIGxpc3QgYmVnaW4iIGRvCiAgICAgICBAdHJhbnMud3JpdGUoIltcInJlY1wiLDJcIlwiIikKLSAgICAgIEBwcm90LnJlYWRfbGlzdF9iZWdpbi5zaG91bGQgPT0gWzEyLCAyXQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfbGlzdF9iZWdpbikudG8gZXEoWzEyLCAyXSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVhZCBsaXN0IGVuZCIgZG8KICAgICAgIEB0cmFucy53cml0ZSgiXSIpCi0gICAgICBAcHJvdC5yZWFkX2xpc3RfZW5kLnNob3VsZCA9PSBuaWwKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2xpc3RfZW5kKS50byBlcShuaWwpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlYWQgc2V0IGJlZ2luIiBkbwogICAgICAgQHRyYW5zLndyaXRlKCJbXCJyZWNcIiwyXCJcIiIpCi0gICAgICBAcHJvdC5yZWFkX3NldF9iZWdpbi5zaG91bGQgPT0gWzEyLCAyXQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfc2V0X2JlZ2luKS50byBlcShbMTIsIDJdKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZWFkIHNldCBlbmQiIGRvCiAgICAgICBAdHJhbnMud3JpdGUoIl0iKQotICAgICAgQHByb3QucmVhZF9zZXRfZW5kLnNob3VsZCA9PSBuaWwKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX3NldF9lbmQpLnRvIGVxKG5pbCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVhZCBib29sIiBkbwogICAgICAgQHRyYW5zLndyaXRlKCIwXCJcIiIpCi0gICAgICBAcHJvdC5yZWFkX2Jvb2wuc2hvdWxkID09IGZhbHNlCisgICAgICBleHBlY3QoQHByb3QucmVhZF9ib29sKS50byBlcShmYWxzZSkKICAgICAgIEBwcm90LnJlYWRfc3RyaW5nCiAKICAgICAgIEB0cmFucy53cml0ZSgiMVwiXCIiKQotICAgICAgQHByb3QucmVhZF9ib29sLnNob3VsZCA9PSB0cnVlCisgICAgICBleHBlY3QoQHByb3QucmVhZF9ib29sKS50byBlcSh0cnVlKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZWFkIGJ5dGUiIGRvCiAgICAgICBAdHJhbnMud3JpdGUoIjYwXCJcIiIpCi0gICAgICBAcHJvdC5yZWFkX2J5dGUuc2hvdWxkID09IDYwCisgICAgICBleHBlY3QoQHByb3QucmVhZF9ieXRlKS50byBlcSg2MCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVhZCBpMTYiIGRvCiAgICAgICBAdHJhbnMud3JpdGUoIjEwMDBcIlwiIikKLSAgICAgIEBwcm90LnJlYWRfaTE2LnNob3VsZCA9PSAxMDAwCisgICAgICBleHBlY3QoQHByb3QucmVhZF9pMTYpLnRvIGVxKDEwMDApCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlYWQgaTMyIiBkbwogICAgICAgQHRyYW5zLndyaXRlKCIzMDAwMDAwMDAwXCJcIiIpCi0gICAgICBAcHJvdC5yZWFkX2kzMi5zaG91bGQgPT0gMzAwMDAwMDAwMAorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfaTMyKS50byBlcSgzMDAwMDAwMDAwKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZWFkIGk2NCIgZG8KICAgICAgIEB0cmFucy53cml0ZSgiNjAwMDAwMDAwMFwiXCIiKQotICAgICAgQHByb3QucmVhZF9pNjQuc2hvdWxkID09IDYwMDAwMDAwMDAKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2k2NCkudG8gZXEoNjAwMDAwMDAwMCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVhZCBkb3VibGUiIGRvCiAgICAgICBAdHJhbnMud3JpdGUoIjEyLjIzXCJcIiIpCi0gICAgICBAcHJvdC5yZWFkX2RvdWJsZS5zaG91bGQgPT0gMTIuMjMKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2RvdWJsZSkudG8gZXEoMTIuMjMpCiAgICAgZW5kCiAKICAgICBpZiBSVUJZX1ZFUlNJT04gPj0gJzEuOScKICAgICAgIGl0ICdzaG91bGQgcmVhZCBzdHJpbmcnIGRvCiAgICAgICAgIEB0cmFucy53cml0ZSgnInRoaXMgaXMgYSB0ZXN0IHN0cmluZyInLmZvcmNlX2VuY29kaW5nKEVuY29kaW5nOjpCSU5BUlkpKQogICAgICAgICBhID0gQHByb3QucmVhZF9zdHJpbmcKLSAgICAgICAgYS5zaG91bGQgPT0gJ3RoaXMgaXMgYSB0ZXN0IHN0cmluZycKLSAgICAgICAgYS5lbmNvZGluZy5zaG91bGQgPT0gRW5jb2Rpbmc6OlVURl84CisgICAgICAgIGV4cGVjdChhKS50byBlcSgndGhpcyBpcyBhIHRlc3Qgc3RyaW5nJykKKyAgICAgICAgZXhwZWN0KGEuZW5jb2RpbmcpLnRvIGVxKEVuY29kaW5nOjpVVEZfOCkKICAgICAgIGVuZAogCiAgICAgICBpdCAnc2hvdWxkIHJlYWQgc3RyaW5nIHdpdGggdW5pY29kZSBjaGFyYWN0ZXJzJyBkbwogICAgICAgICBAdHJhbnMud3JpdGUoJyJ0aGlzIGlzIGEgdGVzdCBzdHJpbmcgd2l0aCB1bmljb2RlIGNoYXJhY3RlcnM6IFx1MjBBQyBcdTIwQUQiJy5mb3JjZV9lbmNvZGluZyhFbmNvZGluZzo6QklOQVJZKSkKICAgICAgICAgYSA9IEBwcm90LnJlYWRfc3RyaW5nCi0gICAgICAgIGEuc2hvdWxkID09ICJ0aGlzIGlzIGEgdGVzdCBzdHJpbmcgd2l0aCB1bmljb2RlIGNoYXJhY3RlcnM6IFx1MjBBQyBcdTIwQUQiCi0gICAgICAgIGEuZW5jb2Rpbmcuc2hvdWxkID09IEVuY29kaW5nOjpVVEZfOAorICAgICAgICBleHBlY3QoYSkudG8gZXEoInRoaXMgaXMgYSB0ZXN0IHN0cmluZyB3aXRoIHVuaWNvZGUgY2hhcmFjdGVyczogXHUyMEFDIFx1MjBBRCIpCisgICAgICAgIGV4cGVjdChhLmVuY29kaW5nKS50byBlcShFbmNvZGluZzo6VVRGXzgpCiAgICAgICBlbmQKICAgICBlbHNlCiAgICAgICBpdCAnc2hvdWxkIHJlYWQgc3RyaW5nJyBkbwogICAgICAgICBAdHJhbnMud3JpdGUoJyJ0aGlzIGlzIGEgdGVzdCBzdHJpbmciJykKLSAgICAgICAgQHByb3QucmVhZF9zdHJpbmcuc2hvdWxkID09ICd0aGlzIGlzIGEgdGVzdCBzdHJpbmcnCisgICAgICAgIGV4cGVjdChAcHJvdC5yZWFkX3N0cmluZykudG8gZXEoJ3RoaXMgaXMgYSB0ZXN0IHN0cmluZycpCiAgICAgICBlbmQKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVhZCBiaW5hcnkiIGRvCiAgICAgICBAdHJhbnMud3JpdGUoIlwiZEdocGN5QnBjeUJoSUhSbGMzUWdjM1J5YVc1blwiIikKLSAgICAgIEBwcm90LnJlYWRfYmluYXJ5LnNob3VsZCA9PSAidGhpcyBpcyBhIHRlc3Qgc3RyaW5nIgorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfYmluYXJ5KS50byBlcSgidGhpcyBpcyBhIHRlc3Qgc3RyaW5nIikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcmVhZCBsb25nIGJpbmFyeSIgZG8KKyAgICAgIEB0cmFucy53cml0ZSgiXCJBQUVDQXdRRkJnY0lDUW9MREEwT0R4QVJFaE1VRlJZWEdCa2FHeHdkSGg4Z0lTSWpKQ1VtSnlncEtpc3NMUzR2TURFeU16UTFOamM0T1RvN1BEMCtQMEJCUWtORVJVWkhTRWxLUzB4TlRrOVFVVkpUVkZWV1YxaFpXbHRjWFY1ZllHRmlZMlJsWm1kb2FXcHJiRzF1YjNCeGNuTjBkWFozZUhsNmUzeDlmbitBZ1lLRGhJV0doNGlKaW91TWpZNlBrSkdTazVTVmxwZVltWnFibkoyZW42Q2hvcU9rcGFhbnFLbXFxNnl0cnErd3NiS3p0TFcydDdpNXVydTh2YjYvd01IQ3c4VEZ4c2ZJeWNyTHpNM096OURSMHRQVTFkYlgyTm5hMjl6ZDN0L2c0ZUxqNU9YbTUranA2dXZzN2U3djhQSHk4L1QxOXZmNCtmcjcvUDMrL3c9PVwiIikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2JpbmFyeS5ieXRlcy50b19hKS50byBlcSgoMC4uLjI1NikudG9fYSkKKyAgICBlbmQKKyAgCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KEBwcm90LnRvX3MpLnRvIGVxKCJqc29uKG1lbW9yeSkiKQogICAgIGVuZAogICBlbmQKIAogICBkZXNjcmliZSBUaHJpZnQ6Okpzb25Qcm90b2NvbEZhY3RvcnkgZG8KICAgICBpdCAic2hvdWxkIGNyZWF0ZSBhIEpzb25Qcm90b2NvbCIgZG8KLSAgICAgIFRocmlmdDo6SnNvblByb3RvY29sRmFjdG9yeS5uZXcuZ2V0X3Byb3RvY29sKG1vY2soIk1vY2tUcmFuc3BvcnQiKSkuc2hvdWxkIGJlX2luc3RhbmNlX29mKFRocmlmdDo6SnNvblByb3RvY29sKQorICAgICAgZXhwZWN0KFRocmlmdDo6SnNvblByb3RvY29sRmFjdG9yeS5uZXcuZ2V0X3Byb3RvY29sKGRvdWJsZSgiTW9ja1RyYW5zcG9ydCIpKSkudG8gYmVfaW5zdGFuY2Vfb2YoVGhyaWZ0OjpKc29uUHJvdG9jb2wpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBleHBlY3QoVGhyaWZ0OjpKc29uUHJvdG9jb2xGYWN0b3J5Lm5ldy50b19zKS50byBlcSgianNvbiIpCiAgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9uYW1lc3BhY2VkX3NwZWMucmIgYi9saWIvcmIvc3BlYy9uYW1lc3BhY2VkX3NwZWMucmIKaW5kZXggMzEzNzlkOS4uNGQ2ZDM2OSAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvbmFtZXNwYWNlZF9zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL25hbWVzcGFjZWRfc3BlYy5yYgpAQCAtMzIsNyArMzIsNyBAQAogICAgICAib3RoZXJfbmFtZXNwYWNlL3JlZmVyZW5jZWRfY29uc3RhbnRzLnJiIiwKICAgICAgIm90aGVyX25hbWVzcGFjZS9yZWZlcmVuY2VkX3R5cGVzLnJiIgogICAgIF0uZWFjaCBkbyB8bmFtZXwKLSAgICAgIEZpbGUuZXhpc3Q/KEZpbGUuam9pbihwcmVmaXgsIG5hbWUpKS5zaG91bGQgYmVfdHJ1ZQorICAgICAgZXhwZWN0KEZpbGUuZXhpc3Q/KEZpbGUuam9pbihwcmVmaXgsIG5hbWUpKSkudG8gYmVfdHJ1dGh5CiAgICAgZW5kCiAgIGVuZAogCkBAIC00NCwyMCArNDQsMjAgQEAKICAgICAgInJlZmVyZW5jZWRfY29uc3RhbnRzLnJiIiwKICAgICAgInJlZmVyZW5jZWRfdHlwZXMucmIiCiAgICAgXS5lYWNoIGRvIHxuYW1lfAotICAgICAgRmlsZS5leGlzdD8oRmlsZS5qb2luKHByZWZpeCwgbmFtZSkpLnNob3VsZF9ub3QgYmVfdHJ1ZQorICAgICAgZXhwZWN0KEZpbGUuZXhpc3Q/KEZpbGUuam9pbihwcmVmaXgsIG5hbWUpKSkubm90X3RvIGJlX3RydXRoeQogICAgIGVuZAogICBlbmQKIAogICBpdCAiaGFzIGEgc2VydmljZSBjbGFzcyBpbiB0aGUgcmlnaHQgcGxhY2UiIGRvCi0gICAgZGVmaW5lZD8oTmFtZXNwYWNlZFNwZWNOYW1lc3BhY2U6Ok5hbWVzcGFjZWROb25ibG9ja2luZ1NlcnZpY2UpLnNob3VsZCBiZV90cnVlCisgICAgZXhwZWN0KGRlZmluZWQ/KE5hbWVzcGFjZWRTcGVjTmFtZXNwYWNlOjpOYW1lc3BhY2VkTm9uYmxvY2tpbmdTZXJ2aWNlKSkudG8gYmVfdHJ1dGh5CiAgIGVuZAogCiAgIGl0ICJoYXMgYSBzdHJ1Y3QgaW4gdGhlIHJpZ2h0IHBsYWNlIiBkbwotICAgIGRlZmluZWQ/KE5hbWVzcGFjZWRTcGVjTmFtZXNwYWNlOjpIZWxsbykuc2hvdWxkIGJlX3RydWUKKyAgICBleHBlY3QoZGVmaW5lZD8oTmFtZXNwYWNlZFNwZWNOYW1lc3BhY2U6OkhlbGxvKSkudG8gYmVfdHJ1dGh5CiAgIGVuZAogCiAgIGl0ICJyZXF1aXJlZCBhbiBpbmNsdWRlZCBmaWxlIiBkbwotICAgIGRlZmluZWQ/KE90aGVyTmFtZXNwYWNlOjpTb21lRW51bSkuc2hvdWxkIGJlX3RydWUKKyAgICBleHBlY3QoZGVmaW5lZD8oT3RoZXJOYW1lc3BhY2U6OlNvbWVFbnVtKSkudG8gYmVfdHJ1dGh5CiAgIGVuZAogCiAgIGl0ICJleHRlbmRlZCBhIHNlcnZpY2UiIGRvCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9ub25ibG9ja2luZ19zZXJ2ZXJfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL25vbmJsb2NraW5nX3NlcnZlcl9zcGVjLnJiCmluZGV4IDcxMmNmNDUuLjYxM2Q4ODMgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL25vbmJsb2NraW5nX3NlcnZlcl9zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL25vbmJsb2NraW5nX3NlcnZlcl9zcGVjLnJiCkBAIC0xNzYsOCArMTc2LDggQEAKIAogICAgIGl0ICJzaG91bGQgaGFuZGxlIGJhc2ljIG1lc3NhZ2UgcGFzc2luZyIgZG8KICAgICAgIGNsaWVudCA9IHNldHVwX2NsaWVudAotICAgICAgY2xpZW50LmdyZWV0aW5nKHRydWUpLnNob3VsZCA9PSBTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcKLSAgICAgIGNsaWVudC5ncmVldGluZyhmYWxzZSkuc2hvdWxkID09IFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldyg6Z3JlZXRpbmcgPT4gJ0Fsb2hhIScpCisgICAgICBleHBlY3QoY2xpZW50LmdyZWV0aW5nKHRydWUpKS50byBlcShTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcpCisgICAgICBleHBlY3QoY2xpZW50LmdyZWV0aW5nKGZhbHNlKSkudG8gZXEoU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KDpncmVldGluZyA9PiAnQWxvaGEhJykpCiAgICAgICBAc2VydmVyLnNodXRkb3duCiAgICAgZW5kCiAKQEAgLTE5NSw3ICsxOTUsNyBAQAogICAgICAgZW5kCiAgICAgICA0LnRpbWVzIHsgdHJhbnNfcXVldWUucG9wIH0KICAgICAgIHNldHVwX2NsaWVudC51bmJsb2NrKDQpCi0gICAgICA0LnRpbWVzIHsgcXVldWUucG9wLnNob3VsZCBiZV90cnVlIH0KKyAgICAgIDQudGltZXMgeyBleHBlY3QocXVldWUucG9wKS50byBiZV90cnV0aHkgfQogICAgICAgQHNlcnZlci5zaHV0ZG93bgogICAgIGVuZAogCkBAIC0yMTIsMTUgKzIxMiwxNSBAQAogICAgICAgcXVldWVzWzRdIDw8IDpoZWxsbwogICAgICAgcXVldWVzWzVdIDw8IDpoZWxsbwogICAgICAgcXVldWVzWzZdIDw8IDpoZWxsbwotICAgICAgMy50aW1lcyB7IHJlc3VsdC5wb3Auc2hvdWxkID09IFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldyB9Ci0gICAgICBjbGllbnQuZ3JlZXRpbmcodHJ1ZSkuc2hvdWxkID09IFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldworICAgICAgMy50aW1lcyB7IGV4cGVjdChyZXN1bHQucG9wKS50byBlcShTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcpIH0KKyAgICAgIGV4cGVjdChjbGllbnQuZ3JlZXRpbmcodHJ1ZSkpLnRvIGVxKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldykKICAgICAgIHF1ZXVlc1s1XSA8PCBbOnVuYmxvY2ssIDRdCi0gICAgICA0LnRpbWVzIHsgcmVzdWx0LnBvcC5zaG91bGQgYmVfdHJ1ZSB9CisgICAgICA0LnRpbWVzIHsgZXhwZWN0KHJlc3VsdC5wb3ApLnRvIGJlX3RydXRoeSB9CiAgICAgICBxdWV1ZXNbMl0gPDwgOmhlbGxvCi0gICAgICByZXN1bHQucG9wLnNob3VsZCA9PSBTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcKLSAgICAgIGNsaWVudC5ncmVldGluZyhmYWxzZSkuc2hvdWxkID09IFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldyg6Z3JlZXRpbmcgPT4gJ0Fsb2hhIScpCisgICAgICBleHBlY3QocmVzdWx0LnBvcCkudG8gZXEoU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KQorICAgICAgZXhwZWN0KGNsaWVudC5ncmVldGluZyhmYWxzZSkpLnRvIGVxKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldyg6Z3JlZXRpbmcgPT4gJ0Fsb2hhIScpKQogICAgICAgNy50aW1lcyB7IHF1ZXVlcy5zaGlmdCA8PCA6ZXhpdCB9Ci0gICAgICBjbGllbnQuZ3JlZXRpbmcodHJ1ZSkuc2hvdWxkID09IFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldworICAgICAgZXhwZWN0KGNsaWVudC5ncmVldGluZyh0cnVlKSkudG8gZXEoU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KQogICAgICAgQHNlcnZlci5zaHV0ZG93bgogICAgIGVuZAogCkBAIC0yMjksNyArMjI5LDcgQEAKICAgICAgIGNsaWVudCA9IHNldHVwX2NsaWVudAogICAgICAgY2xpZW50LmdyZWV0aW5nKGZhbHNlKSAjIGZvcmNlIGEgbWVzc2FnZSBwYXNzCiAgICAgICBAc2VydmVyLnNodXRkb3duCi0gICAgICBAc2VydmVyX3RocmVhZC5qb2luKDIpLnNob3VsZCBiZV9hbl9pbnN0YW5jZV9vZihUaHJlYWQpCisgICAgICBleHBlY3QoQHNlcnZlcl90aHJlYWQuam9pbigyKSkudG8gYmVfYW5faW5zdGFuY2Vfb2YoVGhyZWFkKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBjb250aW51ZSBwcm9jZXNzaW5nIGFjdGl2ZSBtZXNzYWdlcyB3aGVuIHNodXR0aW5nIGRvd24iIGRvCkBAIC0yMzgsOCArMjM4LDggQEAKICAgICAgIGNsaWVudCA8PCA6c2xlZXAKICAgICAgIHNsZWVwIDAuMSAjIGdpdmUgdGhlIHNlcnZlciB0aW1lIHRvIHN0YXJ0IHByb2Nlc3NpbmcgdGhlIGNsaWVudCdzIG1lc3NhZ2UKICAgICAgIEBzZXJ2ZXIuc2h1dGRvd24KLSAgICAgIEBzZXJ2ZXJfdGhyZWFkLmpvaW4oMikuc2hvdWxkIGJlX2FuX2luc3RhbmNlX29mKFRocmVhZCkKLSAgICAgIHJlc3VsdC5wb3Auc2hvdWxkID09IDpzbGVwdAorICAgICAgZXhwZWN0KEBzZXJ2ZXJfdGhyZWFkLmpvaW4oMikpLnRvIGJlX2FuX2luc3RhbmNlX29mKFRocmVhZCkKKyAgICAgIGV4cGVjdChyZXN1bHQucG9wKS50byBlcSg6c2xlcHQpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGtpbGwgYWN0aXZlIG1lc3NhZ2VzIHdoZW4gdGhleSBkb24ndCBleHBpcmUgd2hpbGUgc2h1dHRpbmcgZG93biIgZG8KQEAgLTI0OSwxNSArMjQ5LDE1IEBACiAgICAgICBzbGVlcCAwLjEgIyBzdGFydCBwcm9jZXNzaW5nIHRoZSBjbGllbnQncyBtZXNzYWdlCiAgICAgICBAc2VydmVyLnNodXRkb3duKDEpCiAgICAgICBAY2F0Y2hfZXhjZXB0aW9ucyA9IHRydWUKLSAgICAgIEBzZXJ2ZXJfdGhyZWFkLmpvaW4oMykuc2hvdWxkX25vdCBiZV9uaWwKLSAgICAgIHJlc3VsdC5zaG91bGQgYmVfZW1wdHkKKyAgICAgIGV4cGVjdChAc2VydmVyX3RocmVhZC5qb2luKDMpKS5ub3RfdG8gYmVfbmlsCisgICAgICBleHBlY3QocmVzdWx0KS50byBiZV9lbXB0eQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBhbGxvdyBzaHV0dGluZyBkb3duIGluIHJlc3BvbnNlIHRvIGEgbWVzc2FnZSIgZG8KICAgICAgIGNsaWVudCA9IHNldHVwX2NsaWVudAotICAgICAgY2xpZW50LmdyZWV0aW5nKHRydWUpLnNob3VsZCA9PSBTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcKKyAgICAgIGV4cGVjdChjbGllbnQuZ3JlZXRpbmcodHJ1ZSkpLnRvIGVxKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldykKICAgICAgIGNsaWVudC5zaHV0ZG93bgotICAgICAgQHNlcnZlcl90aHJlYWQuam9pbigyKS5zaG91bGRfbm90IGJlX25pbAorICAgICAgZXhwZWN0KEBzZXJ2ZXJfdGhyZWFkLmpvaW4oMikpLm5vdF90byBiZV9uaWwKICAgICBlbmQKICAgZW5kCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL3Byb2Nlc3Nvcl9zcGVjLnJiIGIvbGliL3JiL3NwZWMvcHJvY2Vzc29yX3NwZWMucmIKaW5kZXggOTg5ZjVjYy4uZDMwNTUzZiAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvcHJvY2Vzc29yX3NwZWMucmIKKysrIGIvbGliL3JiL3NwZWMvcHJvY2Vzc29yX3NwZWMucmIKQEAgLTI3LDUyICsyNyw1MiBAQAogCiAgIGRlc2NyaWJlIFRocmlmdDo6UHJvY2Vzc29yIGRvCiAgICAgYmVmb3JlKDplYWNoKSBkbwotICAgICAgQHByb2Nlc3NvciA9IFByb2Nlc3NvclNwZWMubmV3KG1vY2soIk1vY2tIYW5kbGVyIikpCi0gICAgICBAcHJvdCA9IG1vY2soIk1vY2tQcm90b2NvbCIpCisgICAgICBAcHJvY2Vzc29yID0gUHJvY2Vzc29yU3BlYy5uZXcoZG91YmxlKCJNb2NrSGFuZGxlciIpKQorICAgICAgQHByb3QgPSBkb3VibGUoIk1vY2tQcm90b2NvbCIpCiAgICAgZW5kCiAKICAgICBkZWYgbW9ja190cmFucyhvYmopCi0gICAgICBvYmouc2hvdWxkX3JlY2VpdmUoOnRyYW5zKS5vcmRlcmVkLmFuZF9yZXR1cm4gZG8KLSAgICAgICAgbW9jaygidHJhbnMiKS50YXAgZG8gfHRyYW5zfAotICAgICAgICAgIHRyYW5zLnNob3VsZF9yZWNlaXZlKDpmbHVzaCkub3JkZXJlZAorICAgICAgZXhwZWN0KG9iaikudG8gcmVjZWl2ZSg6dHJhbnMpLm9yZGVyZWQgZG8KKyAgICAgICAgZG91YmxlKCJ0cmFucyIpLnRhcCBkbyB8dHJhbnN8CisgICAgICAgICAgZXhwZWN0KHRyYW5zKS50byByZWNlaXZlKDpmbHVzaCkub3JkZXJlZAogICAgICAgICBlbmQKICAgICAgIGVuZAogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBjYWxsIHByb2Nlc3NfPG1lc3NhZ2U+IHdoZW4gaXQgcmVjZWl2ZXMgdGhhdCBtZXNzYWdlIiBkbwotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbWVzc2FnZV9iZWdpbikub3JkZXJlZC5hbmRfcmV0dXJuIFsndGVzdE1lc3NhZ2UnLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6Q0FMTCwgMTddCi0gICAgICBAcHJvY2Vzc29yLnNob3VsZF9yZWNlaXZlKDpwcm9jZXNzX3Rlc3RNZXNzYWdlKS53aXRoKDE3LCBAcHJvdCwgQHByb3QpLm9yZGVyZWQKLSAgICAgIEBwcm9jZXNzb3IucHJvY2VzcyhAcHJvdCwgQHByb3QpLnNob3VsZCA9PSB0cnVlCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfbWVzc2FnZV9iZWdpbikub3JkZXJlZC5hbmRfcmV0dXJuIFsndGVzdE1lc3NhZ2UnLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6Q0FMTCwgMTddCisgICAgICBleHBlY3QoQHByb2Nlc3NvcikudG8gcmVjZWl2ZSg6cHJvY2Vzc190ZXN0TWVzc2FnZSkud2l0aCgxNywgQHByb3QsIEBwcm90KS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb2Nlc3Nvci5wcm9jZXNzKEBwcm90LCBAcHJvdCkpLnRvIGVxKHRydWUpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJhaXNlIGFuIEFwcGxpY2F0aW9uRXhjZXB0aW9uIHdoZW4gdGhlIHJlY2VpdmVkIG1lc3NhZ2UgY2Fubm90IGJlIHByb2Nlc3NlZCIgZG8KLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX21lc3NhZ2VfYmVnaW4pLm9yZGVyZWQuYW5kX3JldHVybiBbJ3Rlc3RNZXNzYWdlJywgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkNBTEwsIDRdCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6c2tpcCkud2l0aChUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX21lc3NhZ2VfZW5kKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfbWVzc2FnZV9iZWdpbikud2l0aCgndGVzdE1lc3NhZ2UnLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6RVhDRVBUSU9OLCA0KS5vcmRlcmVkCi0gICAgICBlID0gbW9jayhUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uKQotICAgICAgZS5zaG91bGRfcmVjZWl2ZSg6d3JpdGUpLndpdGgoQHByb3QpLm9yZGVyZWQKLSAgICAgIFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24uc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aChUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uOjpVTktOT1dOX01FVEhPRCwgIlVua25vd24gZnVuY3Rpb24gdGVzdE1lc3NhZ2UiKS5hbmRfcmV0dXJuKGUpCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfbWVzc2FnZV9lbmQpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9tZXNzYWdlX2JlZ2luKS5vcmRlcmVkLmFuZF9yZXR1cm4gWyd0ZXN0TWVzc2FnZScsIFRocmlmdDo6TWVzc2FnZVR5cGVzOjpDQUxMLCA0XQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpza2lwKS53aXRoKFRocmlmdDo6VHlwZXM6OlNUUlVDVCkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX21lc3NhZ2VfZW5kKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX21lc3NhZ2VfYmVnaW4pLndpdGgoJ3Rlc3RNZXNzYWdlJywgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkVYQ0VQVElPTiwgNCkub3JkZXJlZAorICAgICAgZSA9IGRvdWJsZShUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uKQorICAgICAgZXhwZWN0KGUpLnRvIHJlY2VpdmUoOndyaXRlKS53aXRoKEBwcm90KS5vcmRlcmVkCisgICAgICBleHBlY3QoVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbikudG8gcmVjZWl2ZSg6bmV3KS53aXRoKFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb246OlVOS05PV05fTUVUSE9ELCAiVW5rbm93biBmdW5jdGlvbiB0ZXN0TWVzc2FnZSIpLmFuZF9yZXR1cm4oZSkKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfbWVzc2FnZV9lbmQpLm9yZGVyZWQKICAgICAgIG1vY2tfdHJhbnMoQHByb3QpCiAgICAgICBAcHJvY2Vzc29yLnByb2Nlc3MoQHByb3QsIEBwcm90KQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBwYXNzIGFyZ3Mgb2ZmIHRvIHRoZSBhcmdzIGNsYXNzIiBkbwotICAgICAgYXJnc19jbGFzcyA9IG1vY2soIk1vY2tBcmdzQ2xhc3MiKQotICAgICAgYXJncyA9IG1vY2soIiM8TW9ja0FyZ3NDbGFzczptb2NrPiIpLnRhcCBkbyB8YXJnc3wKLSAgICAgICAgYXJncy5zaG91bGRfcmVjZWl2ZSg6cmVhZCkud2l0aChAcHJvdCkub3JkZXJlZAorICAgICAgYXJnc19jbGFzcyA9IGRvdWJsZSgiTW9ja0FyZ3NDbGFzcyIpCisgICAgICBhcmdzID0gZG91YmxlKCIjPE1vY2tBcmdzQ2xhc3M6bW9jaz4iKS50YXAgZG8gfGFyZ3N8CisgICAgICAgIGV4cGVjdChhcmdzKS50byByZWNlaXZlKDpyZWFkKS53aXRoKEBwcm90KS5vcmRlcmVkCiAgICAgICBlbmQKLSAgICAgIGFyZ3NfY2xhc3Muc2hvdWxkX3JlY2VpdmUoOm5ldykuYW5kX3JldHVybiBhcmdzCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9tZXNzYWdlX2VuZCkub3JkZXJlZAotICAgICAgQHByb2Nlc3Nvci5yZWFkX2FyZ3MoQHByb3QsIGFyZ3NfY2xhc3MpLnNob3VsZCBlcWwoYXJncykKKyAgICAgIGV4cGVjdChhcmdzX2NsYXNzKS50byByZWNlaXZlKDpuZXcpLmFuZF9yZXR1cm4gYXJncworICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX21lc3NhZ2VfZW5kKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb2Nlc3Nvci5yZWFkX2FyZ3MoQHByb3QsIGFyZ3NfY2xhc3MpKS50byBlcWwoYXJncykKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUgb3V0IGEgcmVwbHkgd2hlbiBhc2tlZCIgZG8KLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9tZXNzYWdlX2JlZ2luKS53aXRoKCd0ZXN0TWVzc2FnZScsIFRocmlmdDo6TWVzc2FnZVR5cGVzOjpSRVBMWSwgMjMpLm9yZGVyZWQKLSAgICAgIHJlc3VsdCA9IG1vY2soIk1vY2tSZXN1bHQiKQotICAgICAgcmVzdWx0LnNob3VsZF9yZWNlaXZlKDp3cml0ZSkud2l0aChAcHJvdCkub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX21lc3NhZ2VfZW5kKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX21lc3NhZ2VfYmVnaW4pLndpdGgoJ3Rlc3RNZXNzYWdlJywgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OlJFUExZLCAyMykub3JkZXJlZAorICAgICAgcmVzdWx0ID0gZG91YmxlKCJNb2NrUmVzdWx0IikKKyAgICAgIGV4cGVjdChyZXN1bHQpLnRvIHJlY2VpdmUoOndyaXRlKS53aXRoKEBwcm90KS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX21lc3NhZ2VfZW5kKS5vcmRlcmVkCiAgICAgICBtb2NrX3RyYW5zKEBwcm90KQogICAgICAgQHByb2Nlc3Nvci53cml0ZV9yZXN1bHQocmVzdWx0LCBAcHJvdCwgJ3Rlc3RNZXNzYWdlJywgMjMpCiAgICAgZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9zZXJpYWxpemVyX3NwZWMucmIgYi9saWIvcmIvc3BlYy9zZXJpYWxpemVyX3NwZWMucmIKaW5kZXggNTk5YjQ1NC4uMmE3ZGM2ZCAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvc2VyaWFsaXplcl9zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL3NlcmlhbGl6ZXJfc3BlYy5yYgpAQCAtMjUsMTkgKzI1LDE5IEBACiAgICAgaXQgInNob3VsZCBzZXJpYWxpemUgc3RydWN0cyB0byBiaW5hcnkgYnkgZGVmYXVsdCIgZG8KICAgICAgIHNlcmlhbGl6ZXIgPSBUaHJpZnQ6OlNlcmlhbGl6ZXIubmV3KFRocmlmdDo6QmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkubmV3KQogICAgICAgZGF0YSA9IHNlcmlhbGl6ZXIuc2VyaWFsaXplKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldyg6Z3JlZXRpbmcgPT4gIidFbGxvIGd1didub3IhIikpCi0gICAgICBkYXRhLnNob3VsZCA9PSAiXHgwQlx4MDBceDAxXHgwMFx4MDBceDAwXHgwRSdFbGxvIGd1didub3IhXHgwMCIKKyAgICAgIGV4cGVjdChkYXRhKS50byBlcSgiXHgwQlx4MDBceDAxXHgwMFx4MDBceDAwXHgwRSdFbGxvIGd1didub3IhXHgwMCIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHNlcmlhbGl6ZSBzdHJ1Y3RzIHRvIHRoZSBnaXZlbiBwcm90b2NvbCIgZG8KLSAgICAgIHByb3RvY29sID0gVGhyaWZ0OjpCYXNlUHJvdG9jb2wubmV3KG1vY2soInRyYW5zcG9ydCIpKQotICAgICAgcHJvdG9jb2wuc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiU3BlY05hbWVzcGFjZTo6SGVsbG8iKQotICAgICAgcHJvdG9jb2wuc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCJncmVldGluZyIsIFRocmlmdDo6VHlwZXM6OlNUUklORywgMSkKLSAgICAgIHByb3RvY29sLnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJpbmcpLndpdGgoIkdvb2QgZGF5IikKLSAgICAgIHByb3RvY29sLnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9lbmQpCi0gICAgICBwcm90b2NvbC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfc3RvcCkKLSAgICAgIHByb3RvY29sLnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfZW5kKQotICAgICAgcHJvdG9jb2xfZmFjdG9yeSA9IG1vY2soIlByb3RvY29sRmFjdG9yeSIpCi0gICAgICBwcm90b2NvbF9mYWN0b3J5LnN0dWIhKDpnZXRfcHJvdG9jb2wpLmFuZF9yZXR1cm4ocHJvdG9jb2wpCisgICAgICBwcm90b2NvbCA9IFRocmlmdDo6QmFzZVByb3RvY29sLm5ldyhkb3VibGUoInRyYW5zcG9ydCIpKQorICAgICAgZXhwZWN0KHByb3RvY29sKS50byByZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfYmVnaW4pLndpdGgoIlNwZWNOYW1lc3BhY2U6OkhlbGxvIikKKyAgICAgIGV4cGVjdChwcm90b2NvbCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoImdyZWV0aW5nIiwgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAxKQorICAgICAgZXhwZWN0KHByb3RvY29sKS50byByZWNlaXZlKDp3cml0ZV9zdHJpbmcpLndpdGgoIkdvb2QgZGF5IikKKyAgICAgIGV4cGVjdChwcm90b2NvbCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfZW5kKQorICAgICAgZXhwZWN0KHByb3RvY29sKS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9zdG9wKQorICAgICAgZXhwZWN0KHByb3RvY29sKS50byByZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfZW5kKQorICAgICAgcHJvdG9jb2xfZmFjdG9yeSA9IGRvdWJsZSgiUHJvdG9jb2xGYWN0b3J5IikKKyAgICAgIGFsbG93KHByb3RvY29sX2ZhY3RvcnkpLnRvIHJlY2VpdmUoOmdldF9wcm90b2NvbCkuYW5kX3JldHVybihwcm90b2NvbCkKICAgICAgIHNlcmlhbGl6ZXIgPSBUaHJpZnQ6OlNlcmlhbGl6ZXIubmV3KHByb3RvY29sX2ZhY3RvcnkpCiAgICAgICBzZXJpYWxpemVyLnNlcmlhbGl6ZShTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcoOmdyZWV0aW5nID0+ICJHb29kIGRheSIpKQogICAgIGVuZApAQCAtNDcsMjEgKzQ3LDIxIEBACiAgICAgaXQgInNob3VsZCBkZXNlcmlhbGl6ZSBzdHJ1Y3RzIGZyb20gYmluYXJ5IGJ5IGRlZmF1bHQiIGRvCiAgICAgICBkZXNlcmlhbGl6ZXIgPSBUaHJpZnQ6OkRlc2VyaWFsaXplci5uZXcKICAgICAgIGRhdGEgPSAiXHgwQlx4MDBceDAxXHgwMFx4MDBceDAwXHgwRSdFbGxvIGd1didub3IhXHgwMCIKLSAgICAgIGRlc2VyaWFsaXplci5kZXNlcmlhbGl6ZShTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcsIGRhdGEpLnNob3VsZCA9PSBTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcoOmdyZWV0aW5nID0+ICInRWxsbyBndXYnbm9yISIpCisgICAgICBleHBlY3QoZGVzZXJpYWxpemVyLmRlc2VyaWFsaXplKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldywgZGF0YSkpLnRvIGVxKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldyg6Z3JlZXRpbmcgPT4gIidFbGxvIGd1didub3IhIikpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGRlc2VyaWFsaXplIHN0cnVjdHMgZnJvbSB0aGUgZ2l2ZW4gcHJvdG9jb2wiIGRvCi0gICAgICBwcm90b2NvbCA9IFRocmlmdDo6QmFzZVByb3RvY29sLm5ldyhtb2NrKCJ0cmFuc3BvcnQiKSkKLSAgICAgIHByb3RvY29sLnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cnVjdF9iZWdpbikuYW5kX3JldHVybigiU3BlY05hbWVzcGFjZTo6SGVsbG8iKQotICAgICAgcHJvdG9jb2wuc2hvdWxkX3JlY2VpdmUoOnJlYWRfZmllbGRfYmVnaW4pLmFuZF9yZXR1cm4oWyJncmVldGluZyIsIFRocmlmdDo6VHlwZXM6OlNUUklORywgMV0sCisgICAgICBwcm90b2NvbCA9IFRocmlmdDo6QmFzZVByb3RvY29sLm5ldyhkb3VibGUoInRyYW5zcG9ydCIpKQorICAgICAgZXhwZWN0KHByb3RvY29sKS50byByZWNlaXZlKDpyZWFkX3N0cnVjdF9iZWdpbikuYW5kX3JldHVybigiU3BlY05hbWVzcGFjZTo6SGVsbG8iKQorICAgICAgZXhwZWN0KHByb3RvY29sKS50byByZWNlaXZlKDpyZWFkX2ZpZWxkX2JlZ2luKS5hbmRfcmV0dXJuKFsiZ3JlZXRpbmciLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25pbCwgVGhyaWZ0OjpUeXBlczo6U1RPUCwgMF0pCi0gICAgICBwcm90b2NvbC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJpbmcpLmFuZF9yZXR1cm4oIkdvb2QgZGF5IikKLSAgICAgIHByb3RvY29sLnNob3VsZF9yZWNlaXZlKDpyZWFkX2ZpZWxkX2VuZCkKLSAgICAgIHByb3RvY29sLnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cnVjdF9lbmQpCi0gICAgICBwcm90b2NvbF9mYWN0b3J5ID0gbW9jaygiUHJvdG9jb2xGYWN0b3J5IikKLSAgICAgIHByb3RvY29sX2ZhY3Rvcnkuc3R1YiEoOmdldF9wcm90b2NvbCkuYW5kX3JldHVybihwcm90b2NvbCkKKyAgICAgIGV4cGVjdChwcm90b2NvbCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJpbmcpLmFuZF9yZXR1cm4oIkdvb2QgZGF5IikKKyAgICAgIGV4cGVjdChwcm90b2NvbCkudG8gcmVjZWl2ZSg6cmVhZF9maWVsZF9lbmQpCisgICAgICBleHBlY3QocHJvdG9jb2wpLnRvIHJlY2VpdmUoOnJlYWRfc3RydWN0X2VuZCkKKyAgICAgIHByb3RvY29sX2ZhY3RvcnkgPSBkb3VibGUoIlByb3RvY29sRmFjdG9yeSIpCisgICAgICBhbGxvdyhwcm90b2NvbF9mYWN0b3J5KS50byByZWNlaXZlKDpnZXRfcHJvdG9jb2wpLmFuZF9yZXR1cm4ocHJvdG9jb2wpCiAgICAgICBkZXNlcmlhbGl6ZXIgPSBUaHJpZnQ6OkRlc2VyaWFsaXplci5uZXcocHJvdG9jb2xfZmFjdG9yeSkKLSAgICAgIGRlc2VyaWFsaXplci5kZXNlcmlhbGl6ZShTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcsICIiKS5zaG91bGQgPT0gU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KDpncmVldGluZyA9PiAiR29vZCBkYXkiKQorICAgICAgZXhwZWN0KGRlc2VyaWFsaXplci5kZXNlcmlhbGl6ZShTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcsICIiKSkudG8gZXEoU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KDpncmVldGluZyA9PiAiR29vZCBkYXkiKSkKICAgICBlbmQKICAgZW5kCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL3NlcnZlcl9zb2NrZXRfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL3NlcnZlcl9zb2NrZXRfc3BlYy5yYgppbmRleCAxMzAxZDU0Li5lYzllNTUwIDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy9zZXJ2ZXJfc29ja2V0X3NwZWMucmIKKysrIGIvbGliL3JiL3NwZWMvc2VydmVyX3NvY2tldF9zcGVjLnJiCkBAIC0yOCw1MiArMjgsNTcgQEAKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgY3JlYXRlIGEgaGFuZGxlIHdoZW4gY2FsbGluZyBsaXN0ZW4iIGRvCi0gICAgICBUQ1BTZXJ2ZXIuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aChuaWwsIDEyMzQpCisgICAgICBleHBlY3QoVENQU2VydmVyKS50byByZWNlaXZlKDpuZXcpLndpdGgobmlsLCAxMjM0KQogICAgICAgQHNvY2tldC5saXN0ZW4KICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgYWNjZXB0IGFuIG9wdGlvbmFsIGhvc3QgYXJndW1lbnQiIGRvCiAgICAgICBAc29ja2V0ID0gVGhyaWZ0OjpTZXJ2ZXJTb2NrZXQubmV3KCdsb2NhbGhvc3QnLCAxMjM0KQotICAgICAgVENQU2VydmVyLnNob3VsZF9yZWNlaXZlKDpuZXcpLndpdGgoJ2xvY2FsaG9zdCcsIDEyMzQpCisgICAgICBleHBlY3QoVENQU2VydmVyKS50byByZWNlaXZlKDpuZXcpLndpdGgoJ2xvY2FsaG9zdCcsIDEyMzQpCisgICAgICBAc29ja2V0LnRvX3MgPT0gInNlcnZlcihsb2NhbGhvc3Q6MTIzNCkiCiAgICAgICBAc29ja2V0Lmxpc3RlbgogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBjcmVhdGUgYSBUaHJpZnQ6OlNvY2tldCB0byB3cmFwIGFjY2VwdGVkIHNvY2tldHMiIGRvCi0gICAgICBoYW5kbGUgPSBtb2NrKCJUQ1BTZXJ2ZXIiKQotICAgICAgVENQU2VydmVyLnNob3VsZF9yZWNlaXZlKDpuZXcpLndpdGgobmlsLCAxMjM0KS5hbmRfcmV0dXJuKGhhbmRsZSkKKyAgICAgIGhhbmRsZSA9IGRvdWJsZSgiVENQU2VydmVyIikKKyAgICAgIGV4cGVjdChUQ1BTZXJ2ZXIpLnRvIHJlY2VpdmUoOm5ldykud2l0aChuaWwsIDEyMzQpLmFuZF9yZXR1cm4oaGFuZGxlKQogICAgICAgQHNvY2tldC5saXN0ZW4KLSAgICAgIHNvY2sgPSBtb2NrKCJzb2NrIikKLSAgICAgIGhhbmRsZS5zaG91bGRfcmVjZWl2ZSg6YWNjZXB0KS5hbmRfcmV0dXJuKHNvY2spCi0gICAgICB0cmFucyA9IG1vY2soIlNvY2tldCIpCi0gICAgICBUaHJpZnQ6OlNvY2tldC5zaG91bGRfcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuKHRyYW5zKQotICAgICAgdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmhhbmRsZT0pLndpdGgoc29jaykKLSAgICAgIEBzb2NrZXQuYWNjZXB0LnNob3VsZCA9PSB0cmFucworICAgICAgc29jayA9IGRvdWJsZSgic29jayIpCisgICAgICBleHBlY3QoaGFuZGxlKS50byByZWNlaXZlKDphY2NlcHQpLmFuZF9yZXR1cm4oc29jaykKKyAgICAgIHRyYW5zID0gZG91YmxlKCJTb2NrZXQiKQorICAgICAgZXhwZWN0KFRocmlmdDo6U29ja2V0KS50byByZWNlaXZlKDpuZXcpLmFuZF9yZXR1cm4odHJhbnMpCisgICAgICBleHBlY3QodHJhbnMpLnRvIHJlY2VpdmUoOmhhbmRsZT0pLndpdGgoc29jaykKKyAgICAgIGV4cGVjdChAc29ja2V0LmFjY2VwdCkudG8gZXEodHJhbnMpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGNsb3NlIHRoZSBoYW5kbGUgd2hlbiBjbG9zZWQiIGRvCi0gICAgICBoYW5kbGUgPSBtb2NrKCJUQ1BTZXJ2ZXIiLCA6Y2xvc2VkPyA9PiBmYWxzZSkKLSAgICAgIFRDUFNlcnZlci5zaG91bGRfcmVjZWl2ZSg6bmV3KS53aXRoKG5pbCwgMTIzNCkuYW5kX3JldHVybihoYW5kbGUpCisgICAgICBoYW5kbGUgPSBkb3VibGUoIlRDUFNlcnZlciIsIDpjbG9zZWQ/ID0+IGZhbHNlKQorICAgICAgZXhwZWN0KFRDUFNlcnZlcikudG8gcmVjZWl2ZSg6bmV3KS53aXRoKG5pbCwgMTIzNCkuYW5kX3JldHVybihoYW5kbGUpCiAgICAgICBAc29ja2V0Lmxpc3RlbgotICAgICAgaGFuZGxlLnNob3VsZF9yZWNlaXZlKDpjbG9zZSkKKyAgICAgIGV4cGVjdChoYW5kbGUpLnRvIHJlY2VpdmUoOmNsb3NlKQogICAgICAgQHNvY2tldC5jbG9zZQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZXR1cm4gbmlsIHdoZW4gYWNjZXB0aW5nIGlmIHRoZXJlIGlzIG5vIGhhbmRsZSIgZG8KLSAgICAgIEBzb2NrZXQuYWNjZXB0LnNob3VsZCBiZV9uaWwKKyAgICAgIGV4cGVjdChAc29ja2V0LmFjY2VwdCkudG8gYmVfbmlsCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJldHVybiB0cnVlIGZvciBjbG9zZWQ/IHdoZW4gYXBwcm9wcmlhdGUiIGRvCi0gICAgICBoYW5kbGUgPSBtb2NrKCJUQ1BTZXJ2ZXIiLCA6Y2xvc2VkPyA9PiBmYWxzZSkKLSAgICAgIFRDUFNlcnZlci5zdHViISg6bmV3KS5hbmRfcmV0dXJuKGhhbmRsZSkKKyAgICAgIGhhbmRsZSA9IGRvdWJsZSgiVENQU2VydmVyIiwgOmNsb3NlZD8gPT4gZmFsc2UpCisgICAgICBhbGxvdyhUQ1BTZXJ2ZXIpLnRvIHJlY2VpdmUoOm5ldykuYW5kX3JldHVybihoYW5kbGUpCiAgICAgICBAc29ja2V0Lmxpc3RlbgotICAgICAgQHNvY2tldC5zaG91bGRfbm90IGJlX2Nsb3NlZAotICAgICAgaGFuZGxlLnN0dWIhKDpjbG9zZSkKKyAgICAgIGV4cGVjdChAc29ja2V0KS5ub3RfdG8gYmVfY2xvc2VkCisgICAgICBhbGxvdyhoYW5kbGUpLnRvIHJlY2VpdmUoOmNsb3NlKQogICAgICAgQHNvY2tldC5jbG9zZQotICAgICAgQHNvY2tldC5zaG91bGQgYmVfY2xvc2VkCisgICAgICBleHBlY3QoQHNvY2tldCkudG8gYmVfY2xvc2VkCiAgICAgICBAc29ja2V0Lmxpc3RlbgotICAgICAgQHNvY2tldC5zaG91bGRfbm90IGJlX2Nsb3NlZAotICAgICAgaGFuZGxlLnN0dWIhKDpjbG9zZWQ/KS5hbmRfcmV0dXJuKHRydWUpCi0gICAgICBAc29ja2V0LnNob3VsZCBiZV9jbG9zZWQKKyAgICAgIGV4cGVjdChAc29ja2V0KS5ub3RfdG8gYmVfY2xvc2VkCisgICAgICBhbGxvdyhoYW5kbGUpLnRvIHJlY2VpdmUoOmNsb3NlZD8pLmFuZF9yZXR1cm4odHJ1ZSkKKyAgICAgIGV4cGVjdChAc29ja2V0KS50byBiZV9jbG9zZWQKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChAc29ja2V0LnRvX3MpLnRvIGVxKCJzb2NrZXQoOjEyMzQpIikKICAgICBlbmQKICAgZW5kCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL3NlcnZlcl9zcGVjLnJiIGIvbGliL3JiL3NwZWMvc2VydmVyX3NwZWMucmIKaW5kZXggZWFlY2JkYS4uNTdmNTIzNyAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvc2VydmVyX3NwZWMucmIKKysrIGIvbGliL3JiL3NwZWMvc2VydmVyX3NwZWMucmIKQEAgLTIxLDk1ICsyMSwxMzUgQEAKIGRlc2NyaWJlICdTZXJ2ZXInIGRvCiAKICAgZGVzY3JpYmUgVGhyaWZ0OjpCYXNlU2VydmVyIGRvCi0gICAgaXQgInNob3VsZCBkZWZhdWx0IHRvIEJhc2VUcmFuc3BvcnRGYWN0b3J5IGFuZCBCaW5hcnlQcm90b2NvbEZhY3Rvcnkgd2hlbiBub3Qgc3BlY2lmaWVkIiBkbwotICAgICAgc2VydmVyID0gVGhyaWZ0OjpCYXNlU2VydmVyLm5ldyhtb2NrKCJQcm9jZXNzb3IiKSwgbW9jaygiQmFzZVNlcnZlclRyYW5zcG9ydCIpKQotICAgICAgc2VydmVyLmluc3RhbmNlX3ZhcmlhYmxlX2dldCg6J0B0cmFuc3BvcnRfZmFjdG9yeScpLnNob3VsZCBiZV9hbl9pbnN0YW5jZV9vZihUaHJpZnQ6OkJhc2VUcmFuc3BvcnRGYWN0b3J5KQotICAgICAgc2VydmVyLmluc3RhbmNlX3ZhcmlhYmxlX2dldCg6J0Bwcm90b2NvbF9mYWN0b3J5Jykuc2hvdWxkIGJlX2FuX2luc3RhbmNlX29mKFRocmlmdDo6QmluYXJ5UHJvdG9jb2xGYWN0b3J5KQorICAgIGJlZm9yZSg6ZWFjaCkgZG8KKyAgICAgIEBwcm9jZXNzb3IgPSBkb3VibGUoIlByb2Nlc3NvciIpCisgICAgICBAc2VydmVyVHJhbnMgPSBkb3VibGUoIlNlcnZlclRyYW5zcG9ydCIpCisgICAgICBAdHJhbnMgPSBkb3VibGUoIkJhc2VUcmFuc3BvcnQiKQorICAgICAgQHByb3QgPSBkb3VibGUoIkJhc2VQcm90b2NvbCIpCisgICAgICBAc2VydmVyID0gZGVzY3JpYmVkX2NsYXNzLm5ldyhAcHJvY2Vzc29yLCBAc2VydmVyVHJhbnMsIEB0cmFucywgQHByb3QpCiAgICAgZW5kCiAKLSAgICAjIHNlcnZlIGlzIGEgbm9vcCwgc28gY2FuJ3QgdGVzdCB0aGF0CisgICAgaXQgInNob3VsZCBkZWZhdWx0IHRvIEJhc2VUcmFuc3BvcnRGYWN0b3J5IGFuZCBCaW5hcnlQcm90b2NvbEZhY3Rvcnkgd2hlbiBub3Qgc3BlY2lmaWVkIiBkbworICAgICAgQHNlcnZlciA9IFRocmlmdDo6QmFzZVNlcnZlci5uZXcoZG91YmxlKCJQcm9jZXNzb3IiKSwgZG91YmxlKCJCYXNlU2VydmVyVHJhbnNwb3J0IikpCisgICAgICBleHBlY3QoQHNlcnZlci5pbnN0YW5jZV92YXJpYWJsZV9nZXQoOidAdHJhbnNwb3J0X2ZhY3RvcnknKSkudG8gYmVfYW5faW5zdGFuY2Vfb2YoVGhyaWZ0OjpCYXNlVHJhbnNwb3J0RmFjdG9yeSkKKyAgICAgIGV4cGVjdChAc2VydmVyLmluc3RhbmNlX3ZhcmlhYmxlX2dldCg6J0Bwcm90b2NvbF9mYWN0b3J5JykpLnRvIGJlX2FuX2luc3RhbmNlX29mKFRocmlmdDo6QmluYXJ5UHJvdG9jb2xGYWN0b3J5KQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBub3Qgc2VydmUiIGRvCisgICAgICBleHBlY3QgeyBAc2VydmVyLnNlcnZlKCl9LnRvIHJhaXNlX2Vycm9yKE5vdEltcGxlbWVudGVkRXJyb3IpCisgICAgZW5kCisgICAgCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KEBzZXJ2ZXJUcmFucykudG8gcmVjZWl2ZSg6dG9fcykub25jZS5hbmRfcmV0dXJuKCJzZXJ2ZXJUcmFucyIpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDp0b19zKS5vbmNlLmFuZF9yZXR1cm4oInRyYW5zIikKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6dG9fcykub25jZS5hbmRfcmV0dXJuKCJwcm90IikKKyAgICAgIGV4cGVjdChAc2VydmVyLnRvX3MpLnRvIGVxKCJzZXJ2ZXIocHJvdCh0cmFucyhzZXJ2ZXJUcmFucykpKSIpCisgICAgZW5kCiAgIGVuZAogCiAgIGRlc2NyaWJlIFRocmlmdDo6U2ltcGxlU2VydmVyIGRvCiAgICAgYmVmb3JlKDplYWNoKSBkbwotICAgICAgQHByb2Nlc3NvciA9IG1vY2soIlByb2Nlc3NvciIpCi0gICAgICBAc2VydmVyVHJhbnMgPSBtb2NrKCJTZXJ2ZXJUcmFuc3BvcnQiKQotICAgICAgQHRyYW5zID0gbW9jaygiQmFzZVRyYW5zcG9ydCIpCi0gICAgICBAcHJvdCA9IG1vY2soIkJhc2VQcm90b2NvbCIpCi0gICAgICBAY2xpZW50ID0gbW9jaygiQ2xpZW50IikKKyAgICAgIEBwcm9jZXNzb3IgPSBkb3VibGUoIlByb2Nlc3NvciIpCisgICAgICBAc2VydmVyVHJhbnMgPSBkb3VibGUoIlNlcnZlclRyYW5zcG9ydCIpCisgICAgICBAdHJhbnMgPSBkb3VibGUoIkJhc2VUcmFuc3BvcnQiKQorICAgICAgQHByb3QgPSBkb3VibGUoIkJhc2VQcm90b2NvbCIpCisgICAgICBAY2xpZW50ID0gZG91YmxlKCJDbGllbnQiKQogICAgICAgQHNlcnZlciA9IGRlc2NyaWJlZF9jbGFzcy5uZXcoQHByb2Nlc3NvciwgQHNlcnZlclRyYW5zLCBAdHJhbnMsIEBwcm90KQogICAgIGVuZAogICAgIAorICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChAc2VydmVyVHJhbnMpLnRvIHJlY2VpdmUoOnRvX3MpLm9uY2UuYW5kX3JldHVybigic2VydmVyVHJhbnMiKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6dG9fcykub25jZS5hbmRfcmV0dXJuKCJ0cmFucyIpCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnRvX3MpLm9uY2UuYW5kX3JldHVybigicHJvdCIpCisgICAgICBleHBlY3QoQHNlcnZlci50b19zKS50byBlcSgic2ltcGxlKHNlcnZlcihwcm90KHRyYW5zKHNlcnZlclRyYW5zKSkpKSIpCisgICAgZW5kCisgICAgCiAgICAgaXQgInNob3VsZCBzZXJ2ZSBpbiB0aGUgbWFpbiB0aHJlYWQiIGRvCi0gICAgICBAc2VydmVyVHJhbnMuc2hvdWxkX3JlY2VpdmUoOmxpc3Rlbikub3JkZXJlZAotICAgICAgQHNlcnZlclRyYW5zLnNob3VsZF9yZWNlaXZlKDphY2NlcHQpLmV4YWN0bHkoMykudGltZXMuYW5kX3JldHVybihAY2xpZW50KQotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDpnZXRfdHJhbnNwb3J0KS5leGFjdGx5KDMpLnRpbWVzLndpdGgoQGNsaWVudCkuYW5kX3JldHVybihAdHJhbnMpCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6Z2V0X3Byb3RvY29sKS5leGFjdGx5KDMpLnRpbWVzLndpdGgoQHRyYW5zKS5hbmRfcmV0dXJuKEBwcm90KQorICAgICAgZXhwZWN0KEBzZXJ2ZXJUcmFucykudG8gcmVjZWl2ZSg6bGlzdGVuKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHNlcnZlclRyYW5zKS50byByZWNlaXZlKDphY2NlcHQpLmV4YWN0bHkoMykudGltZXMuYW5kX3JldHVybihAY2xpZW50KQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6Z2V0X3RyYW5zcG9ydCkuZXhhY3RseSgzKS50aW1lcy53aXRoKEBjbGllbnQpLmFuZF9yZXR1cm4oQHRyYW5zKQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpnZXRfcHJvdG9jb2wpLmV4YWN0bHkoMykudGltZXMud2l0aChAdHJhbnMpLmFuZF9yZXR1cm4oQHByb3QpCiAgICAgICB4ID0gMAotICAgICAgQHByb2Nlc3Nvci5zaG91bGRfcmVjZWl2ZSg6cHJvY2VzcykuZXhhY3RseSgzKS50aW1lcy53aXRoKEBwcm90LCBAcHJvdCkuYW5kX3JldHVybiBkbworICAgICAgZXhwZWN0KEBwcm9jZXNzb3IpLnRvIHJlY2VpdmUoOnByb2Nlc3MpLmV4YWN0bHkoMykudGltZXMud2l0aChAcHJvdCwgQHByb3QpIGRvCiAgICAgICAgIGNhc2UgKHggKz0gMSkKICAgICAgICAgd2hlbiAxIHRoZW4gcmFpc2UgVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb24KICAgICAgICAgd2hlbiAyIHRoZW4gcmFpc2UgVGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbgogICAgICAgICB3aGVuIDMgdGhlbiB0aHJvdyA6c3RvcAogICAgICAgICBlbmQKICAgICAgIGVuZAotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDpjbG9zZSkuZXhhY3RseSgzKS50aW1lcwotICAgICAgQHNlcnZlclRyYW5zLnNob3VsZF9yZWNlaXZlKDpjbG9zZSkub3JkZXJlZAotICAgICAgbGFtYmRhIHsgQHNlcnZlci5zZXJ2ZSB9LnNob3VsZCB0aHJvd19zeW1ib2woOnN0b3ApCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDpjbG9zZSkuZXhhY3RseSgzKS50aW1lcworICAgICAgZXhwZWN0KEBzZXJ2ZXJUcmFucykudG8gcmVjZWl2ZSg6Y2xvc2UpLm9yZGVyZWQKKyAgICAgIGV4cGVjdCB7IEBzZXJ2ZXIuc2VydmUgfS50byB0aHJvd19zeW1ib2woOnN0b3ApCiAgICAgZW5kCiAgIGVuZAogCiAgIGRlc2NyaWJlIFRocmlmdDo6VGhyZWFkZWRTZXJ2ZXIgZG8KICAgICBiZWZvcmUoOmVhY2gpIGRvCi0gICAgICBAcHJvY2Vzc29yID0gbW9jaygiUHJvY2Vzc29yIikKLSAgICAgIEBzZXJ2ZXJUcmFucyA9IG1vY2soIlNlcnZlclRyYW5zcG9ydCIpCi0gICAgICBAdHJhbnMgPSBtb2NrKCJCYXNlVHJhbnNwb3J0IikKLSAgICAgIEBwcm90ID0gbW9jaygiQmFzZVByb3RvY29sIikKLSAgICAgIEBjbGllbnQgPSBtb2NrKCJDbGllbnQiKQorICAgICAgQHByb2Nlc3NvciA9IGRvdWJsZSgiUHJvY2Vzc29yIikKKyAgICAgIEBzZXJ2ZXJUcmFucyA9IGRvdWJsZSgiU2VydmVyVHJhbnNwb3J0IikKKyAgICAgIEB0cmFucyA9IGRvdWJsZSgiQmFzZVRyYW5zcG9ydCIpCisgICAgICBAcHJvdCA9IGRvdWJsZSgiQmFzZVByb3RvY29sIikKKyAgICAgIEBjbGllbnQgPSBkb3VibGUoIkNsaWVudCIpCiAgICAgICBAc2VydmVyID0gZGVzY3JpYmVkX2NsYXNzLm5ldyhAcHJvY2Vzc29yLCBAc2VydmVyVHJhbnMsIEB0cmFucywgQHByb3QpCiAgICAgZW5kCiAKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBleHBlY3QoQHNlcnZlclRyYW5zKS50byByZWNlaXZlKDp0b19zKS5vbmNlLmFuZF9yZXR1cm4oInNlcnZlclRyYW5zIikKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOnRvX3MpLm9uY2UuYW5kX3JldHVybigidHJhbnMiKQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp0b19zKS5vbmNlLmFuZF9yZXR1cm4oInByb3QiKQorICAgICAgZXhwZWN0KEBzZXJ2ZXIudG9fcykudG8gZXEoInRocmVhZGVkKHNlcnZlcihwcm90KHRyYW5zKHNlcnZlclRyYW5zKSkpKSIpCisgICAgZW5kCisgICAgCiAgICAgaXQgInNob3VsZCBzZXJ2ZSB1c2luZyB0aHJlYWRzIiBkbwotICAgICAgQHNlcnZlclRyYW5zLnNob3VsZF9yZWNlaXZlKDpsaXN0ZW4pLm9yZGVyZWQKLSAgICAgIEBzZXJ2ZXJUcmFucy5zaG91bGRfcmVjZWl2ZSg6YWNjZXB0KS5leGFjdGx5KDMpLnRpbWVzLmFuZF9yZXR1cm4oQGNsaWVudCkKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6Z2V0X3RyYW5zcG9ydCkuZXhhY3RseSgzKS50aW1lcy53aXRoKEBjbGllbnQpLmFuZF9yZXR1cm4oQHRyYW5zKQotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOmdldF9wcm90b2NvbCkuZXhhY3RseSgzKS50aW1lcy53aXRoKEB0cmFucykuYW5kX3JldHVybihAcHJvdCkKLSAgICAgIFRocmVhZC5zaG91bGRfcmVjZWl2ZSg6bmV3KS53aXRoKEBwcm90LCBAdHJhbnMpLmV4YWN0bHkoMykudGltZXMuYW5kX3lpZWxkKEBwcm90LCBAdHJhbnMpCisgICAgICBleHBlY3QoQHNlcnZlclRyYW5zKS50byByZWNlaXZlKDpsaXN0ZW4pLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAc2VydmVyVHJhbnMpLnRvIHJlY2VpdmUoOmFjY2VwdCkuZXhhY3RseSgzKS50aW1lcy5hbmRfcmV0dXJuKEBjbGllbnQpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDpnZXRfdHJhbnNwb3J0KS5leGFjdGx5KDMpLnRpbWVzLndpdGgoQGNsaWVudCkuYW5kX3JldHVybihAdHJhbnMpCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOmdldF9wcm90b2NvbCkuZXhhY3RseSgzKS50aW1lcy53aXRoKEB0cmFucykuYW5kX3JldHVybihAcHJvdCkKKyAgICAgIGV4cGVjdChUaHJlYWQpLnRvIHJlY2VpdmUoOm5ldykud2l0aChAcHJvdCwgQHRyYW5zKS5leGFjdGx5KDMpLnRpbWVzLmFuZF95aWVsZChAcHJvdCwgQHRyYW5zKQogICAgICAgeCA9IDAKLSAgICAgIEBwcm9jZXNzb3Iuc2hvdWxkX3JlY2VpdmUoOnByb2Nlc3MpLmV4YWN0bHkoMykudGltZXMud2l0aChAcHJvdCwgQHByb3QpLmFuZF9yZXR1cm4gZG8KKyAgICAgIGV4cGVjdChAcHJvY2Vzc29yKS50byByZWNlaXZlKDpwcm9jZXNzKS5leGFjdGx5KDMpLnRpbWVzLndpdGgoQHByb3QsIEBwcm90KSBkbwogICAgICAgICBjYXNlICh4ICs9IDEpCiAgICAgICAgIHdoZW4gMSB0aGVuIHJhaXNlIFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uCiAgICAgICAgIHdoZW4gMiB0aGVuIHJhaXNlIFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24KICAgICAgICAgd2hlbiAzIHRoZW4gdGhyb3cgOnN0b3AKICAgICAgICAgZW5kCiAgICAgICBlbmQKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6Y2xvc2UpLmV4YWN0bHkoMykudGltZXMKLSAgICAgIEBzZXJ2ZXJUcmFucy5zaG91bGRfcmVjZWl2ZSg6Y2xvc2UpLm9yZGVyZWQKLSAgICAgIGxhbWJkYSB7IEBzZXJ2ZXIuc2VydmUgfS5zaG91bGQgdGhyb3dfc3ltYm9sKDpzdG9wKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6Y2xvc2UpLmV4YWN0bHkoMykudGltZXMKKyAgICAgIGV4cGVjdChAc2VydmVyVHJhbnMpLnRvIHJlY2VpdmUoOmNsb3NlKS5vcmRlcmVkCisgICAgICBleHBlY3QgeyBAc2VydmVyLnNlcnZlIH0udG8gdGhyb3dfc3ltYm9sKDpzdG9wKQogICAgIGVuZAogICBlbmQKIAogICBkZXNjcmliZSBUaHJpZnQ6OlRocmVhZFBvb2xTZXJ2ZXIgZG8KICAgICBiZWZvcmUoOmVhY2gpIGRvCi0gICAgICBAcHJvY2Vzc29yID0gbW9jaygiUHJvY2Vzc29yIikKLSAgICAgIEBzZXJ2ZXJfdHJhbnMgPSBtb2NrKCJTZXJ2ZXJUcmFuc3BvcnQiKQotICAgICAgQHRyYW5zID0gbW9jaygiQmFzZVRyYW5zcG9ydCIpCi0gICAgICBAcHJvdCA9IG1vY2soIkJhc2VQcm90b2NvbCIpCi0gICAgICBAY2xpZW50ID0gbW9jaygiQ2xpZW50IikKKyAgICAgIEBwcm9jZXNzb3IgPSBkb3VibGUoIlByb2Nlc3NvciIpCisgICAgICBAc2VydmVyX3RyYW5zID0gZG91YmxlKCJTZXJ2ZXJUcmFuc3BvcnQiKQorICAgICAgQHRyYW5zID0gZG91YmxlKCJCYXNlVHJhbnNwb3J0IikKKyAgICAgIEBwcm90ID0gZG91YmxlKCJCYXNlUHJvdG9jb2wiKQorICAgICAgQGNsaWVudCA9IGRvdWJsZSgiQ2xpZW50IikKICAgICAgIEBzZXJ2ZXIgPSBkZXNjcmliZWRfY2xhc3MubmV3KEBwcm9jZXNzb3IsIEBzZXJ2ZXJfdHJhbnMsIEB0cmFucywgQHByb3QpCisgICAgICBzbGVlcCgwLjE1KQogICAgIGVuZAogCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KEBzZXJ2ZXJfdHJhbnMpLnRvIHJlY2VpdmUoOnRvX3MpLm9uY2UuYW5kX3JldHVybigic2VydmVyX3RyYW5zIikKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOnRvX3MpLm9uY2UuYW5kX3JldHVybigidHJhbnMiKQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp0b19zKS5vbmNlLmFuZF9yZXR1cm4oInByb3QiKQorICAgICAgZXhwZWN0KEBzZXJ2ZXIudG9fcykudG8gZXEoInRocmVhZHBvb2woc2VydmVyKHByb3QodHJhbnMoc2VydmVyX3RyYW5zKSkpKSIpCisgICAgZW5kCisgICAgCiAgICAgaXQgInNob3VsZCBzZXJ2ZSBpbnNpZGUgYSB0aHJlYWQiIGRvCiAgICAgICBleGNlcHRpb25fcSA9IEBzZXJ2ZXIuaW5zdGFuY2VfdmFyaWFibGVfZ2V0KDpAZXhjZXB0aW9uX3EpCi0gICAgICBkZXNjcmliZWRfY2xhc3MuYW55X2luc3RhbmNlLnNob3VsZF9yZWNlaXZlKDpzZXJ2ZSkgZG8gCisgICAgICBleHBlY3RfYW55X2luc3RhbmNlX29mKGRlc2NyaWJlZF9jbGFzcykudG8gcmVjZWl2ZSg6c2VydmUpIGRvIAogICAgICAgICBleGNlcHRpb25fcS5wdXNoKFN0YW5kYXJkRXJyb3IubmV3KCdFUlJPUicpKQogICAgICAgZW5kCiAgICAgICBleHBlY3QgeyBAc2VydmVyLnJlc2N1YWJsZV9zZXJ2ZSB9LnRvKHJhaXNlX2Vycm9yKCdFUlJPUicpKQorICAgICAgc2xlZXAoMC4xNSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgYXZvaWQgcnVubmluZyB0aGUgc2VydmVyIHR3aWNlIHdoZW4gcmV0cnlpbmcgcmVzY3VhYmxlX3NlcnZlIiBkbwogICAgICAgZXhjZXB0aW9uX3EgPSBAc2VydmVyLmluc3RhbmNlX3ZhcmlhYmxlX2dldCg6QGV4Y2VwdGlvbl9xKQotICAgICAgZGVzY3JpYmVkX2NsYXNzLmFueV9pbnN0YW5jZS5zaG91bGRfcmVjZWl2ZSg6c2VydmUpIGRvIAorICAgICAgZXhwZWN0X2FueV9pbnN0YW5jZV9vZihkZXNjcmliZWRfY2xhc3MpLnRvIHJlY2VpdmUoOnNlcnZlKSBkbyAKICAgICAgICAgZXhjZXB0aW9uX3EucHVzaChTdGFuZGFyZEVycm9yLm5ldygnRVJST1IxJykpCiAgICAgICAgIGV4Y2VwdGlvbl9xLnB1c2goU3RhbmRhcmRFcnJvci5uZXcoJ0VSUk9SMicpKQogICAgICAgZW5kCkBAIC0xMTgsMjkgKzE1OCwyOSBAQAogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBzZXJ2ZSB1c2luZyBhIHRocmVhZCBwb29sIiBkbwotICAgICAgdGhyZWFkX3EgPSBtb2NrKCJTaXplZFF1ZXVlIikKLSAgICAgIGV4Y2VwdGlvbl9xID0gbW9jaygiUXVldWUiKQorICAgICAgdGhyZWFkX3EgPSBkb3VibGUoIlNpemVkUXVldWUiKQorICAgICAgZXhjZXB0aW9uX3EgPSBkb3VibGUoIlF1ZXVlIikKICAgICAgIEBzZXJ2ZXIuaW5zdGFuY2VfdmFyaWFibGVfc2V0KDpAdGhyZWFkX3EsIHRocmVhZF9xKQogICAgICAgQHNlcnZlci5pbnN0YW5jZV92YXJpYWJsZV9zZXQoOkBleGNlcHRpb25fcSwgZXhjZXB0aW9uX3EpCi0gICAgICBAc2VydmVyX3RyYW5zLnNob3VsZF9yZWNlaXZlKDpsaXN0ZW4pLm9yZGVyZWQKLSAgICAgIHRocmVhZF9xLnNob3VsZF9yZWNlaXZlKDpwdXNoKS53aXRoKDp0b2tlbikKLSAgICAgIHRocmVhZF9xLnNob3VsZF9yZWNlaXZlKDpwb3ApCi0gICAgICBUaHJlYWQuc2hvdWxkX3JlY2VpdmUoOm5ldykuYW5kX3lpZWxkCi0gICAgICBAc2VydmVyX3RyYW5zLnNob3VsZF9yZWNlaXZlKDphY2NlcHQpLmV4YWN0bHkoMykudGltZXMuYW5kX3JldHVybihAY2xpZW50KQotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDpnZXRfdHJhbnNwb3J0KS5leGFjdGx5KDMpLnRpbWVzLmFuZF9yZXR1cm4oQHRyYW5zKQotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOmdldF9wcm90b2NvbCkuZXhhY3RseSgzKS50aW1lcy5hbmRfcmV0dXJuKEBwcm90KQorICAgICAgZXhwZWN0KEBzZXJ2ZXJfdHJhbnMpLnRvIHJlY2VpdmUoOmxpc3Rlbikub3JkZXJlZAorICAgICAgZXhwZWN0KHRocmVhZF9xKS50byByZWNlaXZlKDpwdXNoKS53aXRoKDp0b2tlbikKKyAgICAgIGV4cGVjdCh0aHJlYWRfcSkudG8gcmVjZWl2ZSg6cG9wKQorICAgICAgZXhwZWN0KFRocmVhZCkudG8gcmVjZWl2ZSg6bmV3KS5hbmRfeWllbGQKKyAgICAgIGV4cGVjdChAc2VydmVyX3RyYW5zKS50byByZWNlaXZlKDphY2NlcHQpLmV4YWN0bHkoMykudGltZXMuYW5kX3JldHVybihAY2xpZW50KQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6Z2V0X3RyYW5zcG9ydCkuZXhhY3RseSgzKS50aW1lcy5hbmRfcmV0dXJuKEB0cmFucykKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6Z2V0X3Byb3RvY29sKS5leGFjdGx5KDMpLnRpbWVzLmFuZF9yZXR1cm4oQHByb3QpCiAgICAgICB4ID0gMAogICAgICAgZXJyb3IgPSBSdW50aW1lRXJyb3IubmV3KCJTdG9wcGVkIikKLSAgICAgIEBwcm9jZXNzb3Iuc2hvdWxkX3JlY2VpdmUoOnByb2Nlc3MpLmV4YWN0bHkoMykudGltZXMud2l0aChAcHJvdCwgQHByb3QpLmFuZF9yZXR1cm4gZG8KKyAgICAgIGV4cGVjdChAcHJvY2Vzc29yKS50byByZWNlaXZlKDpwcm9jZXNzKS5leGFjdGx5KDMpLnRpbWVzLndpdGgoQHByb3QsIEBwcm90KSBkbwogICAgICAgICBjYXNlICh4ICs9IDEpCiAgICAgICAgIHdoZW4gMSB0aGVuIHJhaXNlIFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uCiAgICAgICAgIHdoZW4gMiB0aGVuIHJhaXNlIFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24KICAgICAgICAgd2hlbiAzIHRoZW4gcmFpc2UgZXJyb3IKICAgICAgICAgZW5kCiAgICAgICBlbmQKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6Y2xvc2UpLmV4YWN0bHkoMykudGltZXMKLSAgICAgIGV4Y2VwdGlvbl9xLnNob3VsZF9yZWNlaXZlKDpwdXNoKS53aXRoKGVycm9yKS5hbmRfdGhyb3coOnN0b3ApCi0gICAgICBAc2VydmVyX3RyYW5zLnNob3VsZF9yZWNlaXZlKDpjbG9zZSkKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOmNsb3NlKS5leGFjdGx5KDMpLnRpbWVzCisgICAgICBleHBlY3QoZXhjZXB0aW9uX3EpLnRvIHJlY2VpdmUoOnB1c2gpLndpdGgoZXJyb3IpLmFuZF90aHJvdyg6c3RvcCkKKyAgICAgIGV4cGVjdChAc2VydmVyX3RyYW5zKS50byByZWNlaXZlKDpjbG9zZSkKICAgICAgIGV4cGVjdCB7IEBzZXJ2ZXIuc2VydmUgfS50byh0aHJvd19zeW1ib2woOnN0b3ApKQogICAgIGVuZAogICBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL3NvY2tldF9zcGVjLnJiIGIvbGliL3JiL3NwZWMvc29ja2V0X3NwZWMucmIKaW5kZXggZTZiNjczMi4uMjAyYzc0NSAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvc29ja2V0X3NwZWMucmIKKysrIGIvbGliL3JiL3NwZWMvc29ja2V0X3NwZWMucmIKQEAgLTI1LDM3ICsyNSw0NCBAQAogICBkZXNjcmliZSBUaHJpZnQ6OlNvY2tldCBkbwogICAgIGJlZm9yZSg6ZWFjaCkgZG8KICAgICAgIEBzb2NrZXQgPSBUaHJpZnQ6OlNvY2tldC5uZXcKLSAgICAgIEBoYW5kbGUgPSBtb2NrKCJIYW5kbGUiLCA6Y2xvc2VkPyA9PiBmYWxzZSkKLSAgICAgIEBoYW5kbGUuc3R1YiEoOmNsb3NlKQotICAgICAgQGhhbmRsZS5zdHViISg6Y29ubmVjdF9ub25ibG9jaykKLSAgICAgIEBoYW5kbGUuc3R1YiEoOnNldHNvY2tvcHQpCi0gICAgICA6OlNvY2tldC5zdHViISg6bmV3KS5hbmRfcmV0dXJuKEBoYW5kbGUpCisgICAgICBAaGFuZGxlID0gZG91YmxlKCJIYW5kbGUiLCA6Y2xvc2VkPyA9PiBmYWxzZSkKKyAgICAgIGFsbG93KEBoYW5kbGUpLnRvIHJlY2VpdmUoOmNsb3NlKQorICAgICAgYWxsb3coQGhhbmRsZSkudG8gcmVjZWl2ZSg6Y29ubmVjdF9ub25ibG9jaykKKyAgICAgIGFsbG93KEBoYW5kbGUpLnRvIHJlY2VpdmUoOnNldHNvY2tvcHQpCisgICAgICBhbGxvdyg6OlNvY2tldCkudG8gcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuKEBoYW5kbGUpCiAgICAgZW5kCiAKICAgICBpdF9zaG91bGRfYmVoYXZlX2xpa2UgImEgc29ja2V0IgogCiAgICAgaXQgInNob3VsZCByYWlzZSBhIFRyYW5zcG9ydEV4Y2VwdGlvbiB3aGVuIGl0IGNhbm5vdCBvcGVuIGEgc29ja2V0IiBkbwotICAgICAgOjpTb2NrZXQuc2hvdWxkX3JlY2VpdmUoOm5ldykuYW5kX3JhaXNlKFN0YW5kYXJkRXJyb3IpCi0gICAgICBsYW1iZGEgeyBAc29ja2V0Lm9wZW4gfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb24pIHsgfGV8IGUudHlwZS5zaG91bGQgPT0gVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOIH0KKyAgICAgIGV4cGVjdCg6OlNvY2tldCkudG8gcmVjZWl2ZSg6Z2V0YWRkcmluZm8pLndpdGgoImxvY2FsaG9zdCIsIDkwOTAsIG5pbCwgOjpTb2NrZXQ6OlNPQ0tfU1RSRUFNKS5hbmRfcmV0dXJuKFtbXV0pCisgICAgICBleHBlY3QgeyBAc29ja2V0Lm9wZW4gfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbikgeyB8ZXwgZXhwZWN0KGUudHlwZSkudG8gZXEoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKSB9CiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIG9wZW4gYSA6OlNvY2tldCB3aXRoIGRlZmF1bHQgYXJncyIgZG8KLSAgICAgIDo6U29ja2V0LnNob3VsZF9yZWNlaXZlKDpuZXcpLmFuZF9yZXR1cm4obW9jaygiSGFuZGxlIiwgOmNvbm5lY3Rfbm9uYmxvY2sgPT4gdHJ1ZSwgOnNldHNvY2tvcHQgPT4gbmlsKSkKLSAgICAgIDo6U29ja2V0LnNob3VsZF9yZWNlaXZlKDpnZXRhZGRyaW5mbykud2l0aCgibG9jYWxob3N0IiwgOTA5MCwgbmlsLCA6OlNvY2tldDo6U09DS19TVFJFQU0pLmFuZF9yZXR1cm4oW1tdXSkKLSAgICAgIDo6U29ja2V0LnNob3VsZF9yZWNlaXZlKDpzb2NrYWRkcl9pbikKKyAgICAgIGV4cGVjdCg6OlNvY2tldCkudG8gcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuKGRvdWJsZSgiSGFuZGxlIiwgOmNvbm5lY3Rfbm9uYmxvY2sgPT4gdHJ1ZSwgOnNldHNvY2tvcHQgPT4gbmlsKSkKKyAgICAgIGV4cGVjdCg6OlNvY2tldCkudG8gcmVjZWl2ZSg6Z2V0YWRkcmluZm8pLndpdGgoImxvY2FsaG9zdCIsIDkwOTAsIG5pbCwgOjpTb2NrZXQ6OlNPQ0tfU1RSRUFNKS5hbmRfcmV0dXJuKFtbXV0pCisgICAgICBleHBlY3QoOjpTb2NrZXQpLnRvIHJlY2VpdmUoOnNvY2thZGRyX2luKQorICAgICAgQHNvY2tldC50b19zID09ICJzb2NrZXQobG9jYWxob3N0OjkwOTApIgogICAgICAgQHNvY2tldC5vcGVuCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGFjY2VwdCBob3N0L3BvcnQgb3B0aW9ucyIgZG8KLSAgICAgIDo6U29ja2V0LnNob3VsZF9yZWNlaXZlKDpuZXcpLmFuZF9yZXR1cm4obW9jaygiSGFuZGxlIiwgOmNvbm5lY3Rfbm9uYmxvY2sgPT4gdHJ1ZSwgOnNldHNvY2tvcHQgPT4gbmlsKSkKLSAgICAgIDo6U29ja2V0LnNob3VsZF9yZWNlaXZlKDpnZXRhZGRyaW5mbykud2l0aCgibXkuZG9tYWluIiwgMTIzNCwgbmlsLCA6OlNvY2tldDo6U09DS19TVFJFQU0pLmFuZF9yZXR1cm4oW1tdXSkKLSAgICAgIDo6U29ja2V0LnNob3VsZF9yZWNlaXZlKDpzb2NrYWRkcl9pbikKLSAgICAgIFRocmlmdDo6U29ja2V0Lm5ldygnbXkuZG9tYWluJywgMTIzNCkub3BlbgorICAgICAgZXhwZWN0KDo6U29ja2V0KS50byByZWNlaXZlKDpuZXcpLmFuZF9yZXR1cm4oZG91YmxlKCJIYW5kbGUiLCA6Y29ubmVjdF9ub25ibG9jayA9PiB0cnVlLCA6c2V0c29ja29wdCA9PiBuaWwpKQorICAgICAgZXhwZWN0KDo6U29ja2V0KS50byByZWNlaXZlKDpnZXRhZGRyaW5mbykud2l0aCgibXkuZG9tYWluIiwgMTIzNCwgbmlsLCA6OlNvY2tldDo6U09DS19TVFJFQU0pLmFuZF9yZXR1cm4oW1tdXSkKKyAgICAgIGV4cGVjdCg6OlNvY2tldCkudG8gcmVjZWl2ZSg6c29ja2FkZHJfaW4pCisgICAgICBAc29ja2V0ID0gVGhyaWZ0OjpTb2NrZXQubmV3KCdteS5kb21haW4nLCAxMjM0KS5vcGVuCisgICAgICBAc29ja2V0LnRvX3MgPT0gInNvY2tldChteS5kb21haW46MTIzNCkiCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGFjY2VwdCBhbiBvcHRpb25hbCB0aW1lb3V0IiBkbwotICAgICAgOjpTb2NrZXQuc3R1YiEoOm5ldykKLSAgICAgIFRocmlmdDo6U29ja2V0Lm5ldygnbG9jYWxob3N0JywgODA4MCwgNSkudGltZW91dC5zaG91bGQgPT0gNQorICAgICAgYWxsb3coOjpTb2NrZXQpLnRvIHJlY2VpdmUoOm5ldykKKyAgICAgIGV4cGVjdChUaHJpZnQ6OlNvY2tldC5uZXcoJ2xvY2FsaG9zdCcsIDgwODAsIDUpLnRpbWVvdXQpLnRvIGVxKDUpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBhbGxvdyg6OlNvY2tldCkudG8gcmVjZWl2ZSg6bmV3KQorICAgICAgZXhwZWN0KFRocmlmdDo6U29ja2V0Lm5ldygnbXlob3N0JywgODA5MCkudG9fcykudG8gZXEoInNvY2tldChteWhvc3Q6ODA5MCkiKQogICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvc29ja2V0X3NwZWNfc2hhcmVkLnJiIGIvbGliL3JiL3NwZWMvc29ja2V0X3NwZWNfc2hhcmVkLnJiCmluZGV4IDVmZGRjMTYuLjMyYmRiNzEgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL3NvY2tldF9zcGVjX3NoYXJlZC5yYgorKysgYi9saWIvcmIvc3BlYy9zb2NrZXRfc3BlY19zaGFyZWQucmIKQEAgLTIxLDg0ICsyMSw4NCBAQAogCiBzaGFyZWRfZXhhbXBsZXNfZm9yICJhIHNvY2tldCIgZG8KICAgaXQgInNob3VsZCBvcGVuIGEgc29ja2V0IiBkbwotICAgIEBzb2NrZXQub3Blbi5zaG91bGQgPT0gQGhhbmRsZQorICAgIGV4cGVjdChAc29ja2V0Lm9wZW4pLnRvIGVxKEBoYW5kbGUpCiAgIGVuZAogCiAgIGl0ICJzaG91bGQgYmUgb3BlbiB3aGVuZXZlciBpdCBoYXMgYSBoYW5kbGUiIGRvCi0gICAgQHNvY2tldC5zaG91bGRfbm90IGJlX29wZW4KKyAgICBleHBlY3QoQHNvY2tldCkubm90X3RvIGJlX29wZW4KICAgICBAc29ja2V0Lm9wZW4KLSAgICBAc29ja2V0LnNob3VsZCBiZV9vcGVuCisgICAgZXhwZWN0KEBzb2NrZXQpLnRvIGJlX29wZW4KICAgICBAc29ja2V0LmhhbmRsZSA9IG5pbAotICAgIEBzb2NrZXQuc2hvdWxkX25vdCBiZV9vcGVuCisgICAgZXhwZWN0KEBzb2NrZXQpLm5vdF90byBiZV9vcGVuCiAgICAgQHNvY2tldC5oYW5kbGUgPSBAaGFuZGxlCiAgICAgQHNvY2tldC5jbG9zZQotICAgIEBzb2NrZXQuc2hvdWxkX25vdCBiZV9vcGVuCisgICAgZXhwZWN0KEBzb2NrZXQpLm5vdF90byBiZV9vcGVuCiAgIGVuZAogCiAgIGl0ICJzaG91bGQgd3JpdGUgZGF0YSB0byB0aGUgaGFuZGxlIiBkbwogICAgIEBzb2NrZXQub3BlbgotICAgIEBoYW5kbGUuc2hvdWxkX3JlY2VpdmUoOndyaXRlKS53aXRoKCJmb29iYXIiKQorICAgIGV4cGVjdChAaGFuZGxlKS50byByZWNlaXZlKDp3cml0ZSkud2l0aCgiZm9vYmFyIikKICAgICBAc29ja2V0LndyaXRlKCJmb29iYXIiKQotICAgIEBoYW5kbGUuc2hvdWxkX3JlY2VpdmUoOndyaXRlKS53aXRoKCJmYWlsIikuYW5kX3JhaXNlKFN0YW5kYXJkRXJyb3IpCi0gICAgbGFtYmRhIHsgQHNvY2tldC53cml0ZSgiZmFpbCIpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uKSB7IHxlfCBlLnR5cGUuc2hvdWxkID09IFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiB9CisgICAgZXhwZWN0KEBoYW5kbGUpLnRvIHJlY2VpdmUoOndyaXRlKS53aXRoKCJmYWlsIikuYW5kX3JhaXNlKFN0YW5kYXJkRXJyb3IpCisgICAgZXhwZWN0IHsgQHNvY2tldC53cml0ZSgiZmFpbCIpIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb24pIHsgfGV8IGV4cGVjdChlLnR5cGUpLnRvIGVxKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTikgfQogICBlbmQKIAogICBpdCAic2hvdWxkIHJhaXNlIGFuIGVycm9yIHdoZW4gaXQgY2Fubm90IHJlYWQgZnJvbSB0aGUgaGFuZGxlIiBkbwogICAgIEBzb2NrZXQub3BlbgotICAgIEBoYW5kbGUuc2hvdWxkX3JlY2VpdmUoOnJlYWRwYXJ0aWFsKS53aXRoKDE3KS5hbmRfcmFpc2UoU3RhbmRhcmRFcnJvcikKLSAgICBsYW1iZGEgeyBAc29ja2V0LnJlYWQoMTcpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uKSB7IHxlfCBlLnR5cGUuc2hvdWxkID09IFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiB9CisgICAgZXhwZWN0KEBoYW5kbGUpLnRvIHJlY2VpdmUoOnJlYWRwYXJ0aWFsKS53aXRoKDE3KS5hbmRfcmFpc2UoU3RhbmRhcmRFcnJvcikKKyAgICBleHBlY3QgeyBAc29ja2V0LnJlYWQoMTcpIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb24pIHsgfGV8IGV4cGVjdChlLnR5cGUpLnRvIGVxKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTikgfQogICBlbmQKIAogICBpdCAic2hvdWxkIHJldHVybiB0aGUgZGF0YSByZWFkIHdoZW4gcmVhZGluZyBmcm9tIHRoZSBoYW5kbGUgd29ya3MiIGRvCiAgICAgQHNvY2tldC5vcGVuCi0gICAgQGhhbmRsZS5zaG91bGRfcmVjZWl2ZSg6cmVhZHBhcnRpYWwpLndpdGgoMTcpLmFuZF9yZXR1cm4oInRlc3QgZGF0YSIpCi0gICAgQHNvY2tldC5yZWFkKDE3KS5zaG91bGQgPT0gInRlc3QgZGF0YSIKKyAgICBleHBlY3QoQGhhbmRsZSkudG8gcmVjZWl2ZSg6cmVhZHBhcnRpYWwpLndpdGgoMTcpLmFuZF9yZXR1cm4oInRlc3QgZGF0YSIpCisgICAgZXhwZWN0KEBzb2NrZXQucmVhZCgxNykpLnRvIGVxKCJ0ZXN0IGRhdGEiKQogICBlbmQKIAogICBpdCAic2hvdWxkIGRlY2xhcmUgaXRzZWxmIGFzIGNsb3NlZCB3aGVuIGl0IGhhcyBhbiBlcnJvciIgZG8KICAgICBAc29ja2V0Lm9wZW4KLSAgICBAaGFuZGxlLnNob3VsZF9yZWNlaXZlKDp3cml0ZSkud2l0aCgiZmFpbCIpLmFuZF9yYWlzZShTdGFuZGFyZEVycm9yKQotICAgIEBzb2NrZXQuc2hvdWxkIGJlX29wZW4KLSAgICBsYW1iZGEgeyBAc29ja2V0LndyaXRlKCJmYWlsIikgfS5zaG91bGQgcmFpc2VfZXJyb3IKLSAgICBAc29ja2V0LnNob3VsZF9ub3QgYmVfb3BlbgorICAgIGV4cGVjdChAaGFuZGxlKS50byByZWNlaXZlKDp3cml0ZSkud2l0aCgiZmFpbCIpLmFuZF9yYWlzZShTdGFuZGFyZEVycm9yKQorICAgIGV4cGVjdChAc29ja2V0KS50byBiZV9vcGVuCisgICAgZXhwZWN0IHsgQHNvY2tldC53cml0ZSgiZmFpbCIpIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb24pIHsgfGV8IGV4cGVjdChlLnR5cGUpLnRvIGVxKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTikgfQorICAgIGV4cGVjdChAc29ja2V0KS5ub3RfdG8gYmVfb3BlbgogICBlbmQKIAogICBpdCAic2hvdWxkIHJhaXNlIGFuIGVycm9yIHdoZW4gdGhlIHN0cmVhbSBpcyBjbG9zZWQiIGRvCiAgICAgQHNvY2tldC5vcGVuCi0gICAgQGhhbmRsZS5zdHViISg6Y2xvc2VkPykuYW5kX3JldHVybih0cnVlKQotICAgIEBzb2NrZXQuc2hvdWxkX25vdCBiZV9vcGVuCi0gICAgbGFtYmRhIHsgQHNvY2tldC53cml0ZSgiZmFpbCIpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKElPRXJyb3IsICJjbG9zZWQgc3RyZWFtIikKLSAgICBsYW1iZGEgeyBAc29ja2V0LnJlYWQoMTApIH0uc2hvdWxkIHJhaXNlX2Vycm9yKElPRXJyb3IsICJjbG9zZWQgc3RyZWFtIikKKyAgICBhbGxvdyhAaGFuZGxlKS50byByZWNlaXZlKDpjbG9zZWQ/KS5hbmRfcmV0dXJuKHRydWUpCisgICAgZXhwZWN0KEBzb2NrZXQpLm5vdF90byBiZV9vcGVuCisgICAgZXhwZWN0IHsgQHNvY2tldC53cml0ZSgiZmFpbCIpIH0udG8gcmFpc2VfZXJyb3IoSU9FcnJvciwgImNsb3NlZCBzdHJlYW0iKQorICAgIGV4cGVjdCB7IEBzb2NrZXQucmVhZCgxMCkgfS50byByYWlzZV9lcnJvcihJT0Vycm9yLCAiY2xvc2VkIHN0cmVhbSIpCiAgIGVuZAogCiAgIGl0ICJzaG91bGQgc3VwcG9ydCB0aGUgdGltZW91dCBhY2Nlc3NvciBmb3IgcmVhZCIgZG8KICAgICBAc29ja2V0LnRpbWVvdXQgPSAzCiAgICAgQHNvY2tldC5vcGVuCi0gICAgSU8uc2hvdWxkX3JlY2VpdmUoOnNlbGVjdCkud2l0aChbQGhhbmRsZV0sIG5pbCwgbmlsLCAzKS5hbmRfcmV0dXJuKFtbQGhhbmRsZV0sIFtdLCBbXV0pCi0gICAgQGhhbmRsZS5zaG91bGRfcmVjZWl2ZSg6cmVhZHBhcnRpYWwpLndpdGgoMTcpLmFuZF9yZXR1cm4oInRlc3QgZGF0YSIpCi0gICAgQHNvY2tldC5yZWFkKDE3KS5zaG91bGQgPT0gInRlc3QgZGF0YSIKKyAgICBleHBlY3QoSU8pLnRvIHJlY2VpdmUoOnNlbGVjdCkud2l0aChbQGhhbmRsZV0sIG5pbCwgbmlsLCAzKS5hbmRfcmV0dXJuKFtbQGhhbmRsZV0sIFtdLCBbXV0pCisgICAgZXhwZWN0KEBoYW5kbGUpLnRvIHJlY2VpdmUoOnJlYWRwYXJ0aWFsKS53aXRoKDE3KS5hbmRfcmV0dXJuKCJ0ZXN0IGRhdGEiKQorICAgIGV4cGVjdChAc29ja2V0LnJlYWQoMTcpKS50byBlcSgidGVzdCBkYXRhIikKICAgZW5kCiAKICAgaXQgInNob3VsZCBzdXBwb3J0IHRoZSB0aW1lb3V0IGFjY2Vzc29yIGZvciB3cml0ZSIgZG8KICAgICBAc29ja2V0LnRpbWVvdXQgPSAzCiAgICAgQHNvY2tldC5vcGVuCi0gICAgSU8uc2hvdWxkX3JlY2VpdmUoOnNlbGVjdCkud2l0aChuaWwsIFtAaGFuZGxlXSwgbmlsLCAzKS50d2ljZS5hbmRfcmV0dXJuKFtbXSwgW0BoYW5kbGVdLCBbXV0pCi0gICAgQGhhbmRsZS5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfbm9uYmxvY2spLndpdGgoInRlc3QgZGF0YSIpLmFuZF9yZXR1cm4oNCkKLSAgICBAaGFuZGxlLnNob3VsZF9yZWNlaXZlKDp3cml0ZV9ub25ibG9jaykud2l0aCgiIGRhdGEiKS5hbmRfcmV0dXJuKDUpCi0gICAgQHNvY2tldC53cml0ZSgidGVzdCBkYXRhIikuc2hvdWxkID09IDkKKyAgICBleHBlY3QoSU8pLnRvIHJlY2VpdmUoOnNlbGVjdCkud2l0aChuaWwsIFtAaGFuZGxlXSwgbmlsLCAzKS50d2ljZS5hbmRfcmV0dXJuKFtbXSwgW0BoYW5kbGVdLCBbXV0pCisgICAgZXhwZWN0KEBoYW5kbGUpLnRvIHJlY2VpdmUoOndyaXRlX25vbmJsb2NrKS53aXRoKCJ0ZXN0IGRhdGEiKS5hbmRfcmV0dXJuKDQpCisgICAgZXhwZWN0KEBoYW5kbGUpLnRvIHJlY2VpdmUoOndyaXRlX25vbmJsb2NrKS53aXRoKCIgZGF0YSIpLmFuZF9yZXR1cm4oNSkKKyAgICBleHBlY3QoQHNvY2tldC53cml0ZSgidGVzdCBkYXRhIikpLnRvIGVxKDkpCiAgIGVuZAogCiAgIGl0ICJzaG91bGQgcmFpc2UgYW4gZXJyb3Igd2hlbiByZWFkIHRpbWVzIG91dCIgZG8KICAgICBAc29ja2V0LnRpbWVvdXQgPSAwLjUKICAgICBAc29ja2V0Lm9wZW4KLSAgICBJTy5zaG91bGRfcmVjZWl2ZSg6c2VsZWN0KS5vbmNlIHtzbGVlcCgwLjUpOyBuaWx9Ci0gICAgbGFtYmRhIHsgQHNvY2tldC5yZWFkKDE3KSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbikgeyB8ZXwgZS50eXBlLnNob3VsZCA9PSBUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VUIH0KKyAgICBleHBlY3QoSU8pLnRvIHJlY2VpdmUoOnNlbGVjdCkub25jZSB7c2xlZXAoMC41KTsgbmlsfQorICAgIGV4cGVjdCB7IEBzb2NrZXQucmVhZCgxNykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbikgeyB8ZXwgZXhwZWN0KGUudHlwZSkudG8gZXEoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCkgfQogICBlbmQKIAogICBpdCAic2hvdWxkIHJhaXNlIGFuIGVycm9yIHdoZW4gd3JpdGUgdGltZXMgb3V0IiBkbwogICAgIEBzb2NrZXQudGltZW91dCA9IDAuNQogICAgIEBzb2NrZXQub3BlbgotICAgIElPLnNob3VsZF9yZWNlaXZlKDpzZWxlY3QpLndpdGgobmlsLCBbQGhhbmRsZV0sIG5pbCwgMC41KS5hbnlfbnVtYmVyX29mX3RpbWVzLmFuZF9yZXR1cm4obmlsKQotICAgIGxhbWJkYSB7IEBzb2NrZXQud3JpdGUoInRlc3QgZGF0YSIpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uKSB7IHxlfCBlLnR5cGUuc2hvdWxkID09IFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uOjpUSU1FRF9PVVQgfQorICAgIGFsbG93KElPKS50byByZWNlaXZlKDpzZWxlY3QpLndpdGgobmlsLCBbQGhhbmRsZV0sIG5pbCwgMC41KS5hbmRfcmV0dXJuKG5pbCkKKyAgICBleHBlY3QgeyBAc29ja2V0LndyaXRlKCJ0ZXN0IGRhdGEiKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uKSB7IHxlfCBleHBlY3QoZS50eXBlKS50byBlcShUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VUKSB9CiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9zcGVjX2hlbHBlci5yYiBiL2xpYi9yYi9zcGVjL3NwZWNfaGVscGVyLnJiCmluZGV4IDM2NzJiZjAuLjViZjk4ZDAgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL3NwZWNfaGVscGVyLnJiCisrKyBiL2xpYi9yYi9zcGVjL3NwZWNfaGVscGVyLnJiCkBAIC01NCw3ICs1NCw3IEBACiByZXF1aXJlICdub25ibG9ja2luZ19zZXJ2aWNlJwogCiBtb2R1bGUgRml4dHVyZXMKLSAgQ09NUEFDVF9QUk9UT0NPTF9URVNUX1NUUlVDVCA9IENPTVBBQ1RfVEVTVC5kdXAKKyAgQ09NUEFDVF9QUk9UT0NPTF9URVNUX1NUUlVDVCA9IFRocmlmdDo6VGVzdDo6Q09NUEFDVF9URVNULmR1cAogICBDT01QQUNUX1BST1RPQ09MX1RFU1RfU1RSVUNULmFfYmluYXJ5ID0gWzAsMSwyLDMsNCw1LDYsNyw4XS5wYWNrKCdjKicpCiAgIENPTVBBQ1RfUFJPVE9DT0xfVEVTVF9TVFJVQ1Quc2V0X2J5dGVfbWFwID0gbmlsCiAgIENPTVBBQ1RfUFJPVE9DT0xfVEVTVF9TVFJVQ1QubWFwX2J5dGVfbWFwID0gbmlsCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9zc2xfc2VydmVyX3NvY2tldF9zcGVjLnJiIGIvbGliL3JiL3NwZWMvc3NsX3NlcnZlcl9zb2NrZXRfc3BlYy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmU2NTE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3JiL3NwZWMvc3NsX3NlcnZlcl9zb2NrZXRfc3BlYy5yYgpAQCAtMCwwICsxLDM0IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworcmVxdWlyZSAnc3BlY19oZWxwZXInCityZXF1aXJlIEZpbGUuZXhwYW5kX3BhdGgoIiN7RmlsZS5kaXJuYW1lKF9fRklMRV9fKX0vc29ja2V0X3NwZWNfc2hhcmVkIikKKworZGVzY3JpYmUgJ1NTTFNlcnZlclNvY2tldCcgZG8KKworICBkZXNjcmliZSBUaHJpZnQ6OlNTTFNlcnZlclNvY2tldCBkbworICAgIGJlZm9yZSg6ZWFjaCkgZG8KKyAgICAgIEBzb2NrZXQgPSBUaHJpZnQ6OlNTTFNlcnZlclNvY2tldC5uZXcoMTIzNCkKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChAc29ja2V0LnRvX3MpLnRvIGVxKCJzc2woc29ja2V0KDoxMjM0KSkiKQorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvc3NsX3NvY2tldF9zcGVjLnJiIGIvbGliL3JiL3NwZWMvc3NsX3NvY2tldF9zcGVjLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwOGQ4ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmIvc3BlYy9zc2xfc29ja2V0X3NwZWMucmIKQEAgLTAsMCArMSw3OCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3JlcXVpcmUgJ3NwZWNfaGVscGVyJworcmVxdWlyZSBGaWxlLmV4cGFuZF9wYXRoKCIje0ZpbGUuZGlybmFtZShfX0ZJTEVfXyl9L3NvY2tldF9zcGVjX3NoYXJlZCIpCisKK2Rlc2NyaWJlICdTU0xTb2NrZXQnIGRvCisKKyAgZGVzY3JpYmUgVGhyaWZ0OjpTU0xTb2NrZXQgZG8KKyAgICBiZWZvcmUoOmVhY2gpIGRvCisgICAgICBAY29udGV4dCA9IE9wZW5TU0w6OlNTTDo6U1NMQ29udGV4dC5uZXcKKyAgICAgIEBzb2NrZXQgPSBUaHJpZnQ6OlNTTFNvY2tldC5uZXcKKyAgICAgIEBzaW1wbGVfc29ja2V0X2hhbmRsZSA9IGRvdWJsZSgiSGFuZGxlIiwgOmNsb3NlZD8gPT4gZmFsc2UpCisgICAgICBhbGxvdyhAc2ltcGxlX3NvY2tldF9oYW5kbGUpLnRvIHJlY2VpdmUoOmNsb3NlKQorICAgICAgYWxsb3coQHNpbXBsZV9zb2NrZXRfaGFuZGxlKS50byByZWNlaXZlKDpjb25uZWN0X25vbmJsb2NrKQorICAgICAgYWxsb3coQHNpbXBsZV9zb2NrZXRfaGFuZGxlKS50byByZWNlaXZlKDpzZXRzb2Nrb3B0KQorCisgICAgICBAaGFuZGxlID0gZG91YmxlKGRvdWJsZSgiU1NMSGFuZGxlIiwgOmNvbm5lY3Rfbm9uYmxvY2sgPT4gdHJ1ZSwgOnBvc3RfY29ubmVjdGlvbl9jaGVjayA9PiB0cnVlKSwgOmNsb3NlZD8gPT4gZmFsc2UpCisgICAgICBhbGxvdyhAaGFuZGxlKS50byByZWNlaXZlKDpjb25uZWN0X25vbmJsb2NrKQorICAgICAgYWxsb3coQGhhbmRsZSkudG8gcmVjZWl2ZSg6Y2xvc2UpCisgICAgICBhbGxvdyhAaGFuZGxlKS50byByZWNlaXZlKDpwb3N0X2Nvbm5lY3Rpb25fY2hlY2spCisKKyAgICAgIGFsbG93KDo6U29ja2V0KS50byByZWNlaXZlKDpuZXcpLmFuZF9yZXR1cm4oQHNpbXBsZV9zb2NrZXRfaGFuZGxlKQorICAgICAgYWxsb3coT3BlblNTTDo6U1NMOjpTU0xTb2NrZXQpLnRvIHJlY2VpdmUoOm5ldykuYW5kX3JldHVybihAaGFuZGxlKQorICAgIGVuZAorCisgICAgaXRfc2hvdWxkX2JlaGF2ZV9saWtlICJhIHNvY2tldCIKKworICAgIGl0ICJzaG91bGQgcmFpc2UgYSBUcmFuc3BvcnRFeGNlcHRpb24gd2hlbiBpdCBjYW5ub3Qgb3BlbiBhIHNzbCBzb2NrZXQiIGRvCisgICAgICBleHBlY3QoOjpTb2NrZXQpLnRvIHJlY2VpdmUoOmdldGFkZHJpbmZvKS53aXRoKCJsb2NhbGhvc3QiLCA5MDkwLCBuaWwsIDo6U29ja2V0OjpTT0NLX1NUUkVBTSkuYW5kX3JldHVybihbW11dKQorICAgICAgZXhwZWN0IHsgQHNvY2tldC5vcGVuIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb24pIHsgfGV8IGV4cGVjdChlLnR5cGUpLnRvIGVxKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTikgfQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBvcGVuIGEgOjpTb2NrZXQgd2l0aCBkZWZhdWx0IGFyZ3MiIGRvCisgICAgICBleHBlY3QoT3BlblNTTDo6U1NMOjpTU0xTb2NrZXQpLnRvIHJlY2VpdmUoOm5ldykud2l0aChAc2ltcGxlX3NvY2tldF9oYW5kbGUsIG5pbCkuYW5kX3JldHVybihAaGFuZGxlKQorICAgICAgZXhwZWN0KEBoYW5kbGUpLnRvIHJlY2VpdmUoOnBvc3RfY29ubmVjdGlvbl9jaGVjaykud2l0aCgnbG9jYWxob3N0JykKKyAgICAgIEBzb2NrZXQub3BlbgorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBhY2NlcHQgaG9zdC9wb3J0IG9wdGlvbnMiIGRvCisgICAgICBoYW5kbGUgPSBkb3VibGUoIkhhbmRsZSIsIDpjb25uZWN0X25vbmJsb2NrID0+IHRydWUsIDpzZXRzb2Nrb3B0ID0+IG5pbCkKKyAgICAgIGFsbG93KDo6U29ja2V0KS50byByZWNlaXZlKDpuZXcpLmFuZF9yZXR1cm4oaGFuZGxlKQorICAgICAgZXhwZWN0KDo6U29ja2V0KS50byByZWNlaXZlKDpnZXRhZGRyaW5mbykud2l0aCgibXkuZG9tYWluIiwgMTIzNCwgbmlsLCA6OlNvY2tldDo6U09DS19TVFJFQU0pLmFuZF9yZXR1cm4oW1tdXSkKKyAgICAgIGV4cGVjdCg6OlNvY2tldCkudG8gcmVjZWl2ZSg6c29ja2FkZHJfaW4pCisgICAgICBleHBlY3QoT3BlblNTTDo6U1NMOjpTU0xTb2NrZXQpLnRvIHJlY2VpdmUoOm5ldykud2l0aChoYW5kbGUsIG5pbCkuYW5kX3JldHVybihAaGFuZGxlKQorICAgICAgZXhwZWN0KEBoYW5kbGUpLnRvIHJlY2VpdmUoOnBvc3RfY29ubmVjdGlvbl9jaGVjaykud2l0aCgnbXkuZG9tYWluJykKKyAgICAgIFRocmlmdDo6U1NMU29ja2V0Lm5ldygnbXkuZG9tYWluJywgMTIzNCwgNjAwMCwgbmlsKS5vcGVuCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIGFjY2VwdCBhbiBvcHRpb25hbCB0aW1lb3V0IiBkbworICAgICAgZXhwZWN0KFRocmlmdDo6U1NMU29ja2V0Lm5ldygnbG9jYWxob3N0JywgODA4MCwgNSkudGltZW91dCkudG8gZXEoNSkKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgYWNjZXB0IGFuIG9wdGlvbmFsIGNvbnRleHQiIGRvCisgICAgICBleHBlY3QoVGhyaWZ0OjpTU0xTb2NrZXQubmV3KCdsb2NhbGhvc3QnLCA4MDgwLCA1LCBAY29udGV4dCkuc3NsX2NvbnRleHQpLnRvIGVxKEBjb250ZXh0KQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KFRocmlmdDo6U1NMU29ja2V0Lm5ldygnbXlob3N0JywgODA5MCkudG9fcykudG8gZXEoInNzbChzb2NrZXQobXlob3N0OjgwOTApKSIpCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL3N0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19zcGVjLnJiCmluZGV4IGRjOGNlNWYuLmQwNjM1NjkgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL3N0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL3N0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19zcGVjLnJiCkBAIC0zOSw5ICszOSw5IEBACiAgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWx1ZSA9IFsgWzEsIDIsIDNdLCBbMiwgMywgNF0gXQogICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsaWRhdGUKICAgICAgICAgZW5kCi0gICAgICAgIGEuc2hvdWxkID09IGIKKyAgICAgICAgZXhwZWN0KGEpLnRvIGVxKGIpCiAgICAgICAgIGIudmFsdWUucHVzaCBbMywgNCwgNV0KLSAgICAgICAgYS5zaG91bGRfbm90ID09IGIKKyAgICAgICAgZXhwZWN0KGEpLm5vdF90byBlcShiKQogICAgICAgZW5kCiAgICAgZW5kCiAKQEAgLTUyLDkgKzUyLDkgQEAKICAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbHVlID0gWyBbMSwgMiwgM10sIFsyLCAzLCA0XSBdLnRvX3NldAogICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsaWRhdGUKICAgICAgICAgZW5kCi0gICAgICAgIGEuc2hvdWxkID09IGIKKyAgICAgICAgZXhwZWN0KGEpLnRvIGVxKGIpCiAgICAgICAgIGIudmFsdWUuYWRkIFszLCA0LCA1XQotICAgICAgICBhLnNob3VsZF9ub3QgPT0gYgorICAgICAgICBleHBlY3QoYSkubm90X3RvIGVxKGIpCiAgICAgICBlbmQKICAgICBlbmQKIApAQCAtNjUsOSArNjUsOSBAQAogICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsdWUgPSB7IFsxLCAyLCAzXSA9PiAxLCBbMiwgMywgNF0gPT4gMiB9CiAgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWxpZGF0ZQogICAgICAgICBlbmQKLSAgICAgICAgYS5zaG91bGQgPT0gYgorICAgICAgICBleHBlY3QoYSkudG8gZXEoYikKICAgICAgICAgYi52YWx1ZVtbMywgNCwgNV1dID0gMwotICAgICAgICBhLnNob3VsZF9ub3QgPT0gYgorICAgICAgICBleHBlY3QoYSkubm90X3RvIGVxKGIpCiAgICAgICBlbmQKICAgICBlbmQKIApAQCAtNzgsOSArNzgsOSBAQAogICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsdWUgPSB7IDEgPT4gWzEsIDIsIDNdLCAyID0+IFsyLCAzLCA0XSB9CiAgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWxpZGF0ZQogICAgICAgICBlbmQKLSAgICAgICAgYS5zaG91bGQgPT0gYgorICAgICAgICBleHBlY3QoYSkudG8gZXEoYikKICAgICAgICAgYi52YWx1ZVszXSA9IFszLCA0LCA1XQotICAgICAgICBhLnNob3VsZF9ub3QgPT0gYgorICAgICAgICBleHBlY3QoYSkubm90X3RvIGVxKGIpCiAgICAgICBlbmQKICAgICBlbmQKIApAQCAtOTEsOSArOTEsOSBAQAogICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsdWUgPSBbIFsxLCAyLCAzXS50b19zZXQsIFsyLCAzLCA0XS50b19zZXQgXQogICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsaWRhdGUKICAgICAgICAgZW5kCi0gICAgICAgIGEuc2hvdWxkID09IGIKKyAgICAgICAgZXhwZWN0KGEpLnRvIGVxKGIpCiAgICAgICAgIGIudmFsdWUucHVzaChbMywgNCwgNV0udG9fc2V0KQotICAgICAgICBhLnNob3VsZF9ub3QgPT0gYgorICAgICAgICBleHBlY3QoYSkubm90X3RvIGVxKGIpCiAgICAgICBlbmQKICAgICBlbmQKIApAQCAtMTA0LDkgKzEwNCw5IEBACiAgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWx1ZSA9IFsgWzEsIDIsIDNdLnRvX3NldCwgWzIsIDMsIDRdLnRvX3NldCBdLnRvX3NldAogICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsaWRhdGUKICAgICAgICAgZW5kCi0gICAgICAgIGEuc2hvdWxkID09IGIKKyAgICAgICAgZXhwZWN0KGEpLnRvIGVxKGIpCiAgICAgICAgIGIudmFsdWUuYWRkKFszLCA0LCA1XS50b19zZXQpCi0gICAgICAgIGEuc2hvdWxkX25vdCA9PSBiCisgICAgICAgIGV4cGVjdChhKS5ub3RfdG8gZXEoYikKICAgICAgIGVuZAogICAgIGVuZAogCkBAIC0xMTcsOSArMTE3LDkgQEAKICAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbHVlID0geyBbMSwgMiwgM10udG9fc2V0ID0+IDEsIFsyLCAzLCA0XS50b19zZXQgPT4gMiB9CiAgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWxpZGF0ZQogICAgICAgICBlbmQKLSAgICAgICAgYS5zaG91bGQgPT0gYgorICAgICAgICBleHBlY3QoYSkudG8gZXEoYikKICAgICAgICAgYi52YWx1ZVtbMywgNCwgNV0udG9fc2V0XSA9IDMKLSAgICAgICAgYS5zaG91bGRfbm90ID09IGIKKyAgICAgICAgZXhwZWN0KGEpLm5vdF90byBlcShiKQogICAgICAgZW5kCiAgICAgZW5kCiAKQEAgLTEzMCw5ICsxMzAsOSBAQAogICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsdWUgPSB7IDEgPT4gWzEsIDIsIDNdLnRvX3NldCwgMiA9PiBbMiwgMywgNF0udG9fc2V0IH0KICAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbGlkYXRlCiAgICAgICAgIGVuZAotICAgICAgICBhLnNob3VsZCA9PSBiCisgICAgICAgIGV4cGVjdChhKS50byBlcShiKQogICAgICAgICBiLnZhbHVlWzNdID0gWzMsIDQsIDVdLnRvX3NldAotICAgICAgICBhLnNob3VsZF9ub3QgPT0gYgorICAgICAgICBleHBlY3QoYSkubm90X3RvIGVxKGIpCiAgICAgICBlbmQKICAgICBlbmQKIApAQCAtMTQzLDkgKzE0Myw5IEBACiAgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWx1ZSA9IFsgezEgPT4gMiwgMyA9PiA0fSwgezIgPT4gMywgNCA9PiA1fSBdCiAgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWxpZGF0ZQogICAgICAgICBlbmQKLSAgICAgICAgYS5zaG91bGQgPT0gYgorICAgICAgICBleHBlY3QoYSkudG8gZXEoYikKICAgICAgICAgYi52YWx1ZS5wdXNoKHsgMyA9PiA0LCA1ID0+IDYgfSkKLSAgICAgICAgYS5zaG91bGRfbm90ID09IGIKKyAgICAgICAgZXhwZWN0KGEpLm5vdF90byBlcShiKQogICAgICAgZW5kCiAgICAgZW5kCiAKQEAgLTE1Niw5ICsxNTYsOSBAQAogICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsdWUgPSBbIHsxID0+IDIsIDMgPT4gNH0sIHsyID0+IDMsIDQgPT4gNX0gXS50b19zZXQKICAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbGlkYXRlCiAgICAgICAgIGVuZAotICAgICAgICBhLnNob3VsZCA9PSBiCisgICAgICAgIGV4cGVjdChhKS50byBlcShiKQogICAgICAgICBiLnZhbHVlLmFkZCh7IDMgPT4gNCwgNSA9PiA2IH0pCi0gICAgICAgIGEuc2hvdWxkX25vdCA9PSBiCisgICAgICAgIGV4cGVjdChhKS5ub3RfdG8gZXEoYikKICAgICAgIGVuZAogICAgIGVuZAogCkBAIC0xNjksOSArMTY5LDkgQEAKICAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbHVlID0geyB7IDEgPT4gMiwgMyA9PiA0fSA9PiAxLCB7MiA9PiAzLCA0ID0+IDV9ICA9PiAyIH0KICAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbGlkYXRlCiAgICAgICAgIGVuZAotICAgICAgICBhLnNob3VsZCA9PSBiCisgICAgICAgIGV4cGVjdChhKS50byBlcShiKQogICAgICAgICBiLnZhbHVlW3szID0+IDQsIDUgPT4gNn1dID0gMwotICAgICAgICBhLnNob3VsZF9ub3QgPT0gYgorICAgICAgICBleHBlY3QoYSkubm90X3RvIGVxKGIpCiAgICAgICBlbmQKICAgICBlbmQKIApAQCAtMTgyLDkgKzE4Miw5IEBACiAgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWx1ZSA9IHsgMSA9PiB7IDEgPT4gMiwgMyA9PiA0fSwgMiA9PiB7MiA9PiAzLCA0ID0+IDV9IH0KICAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbGlkYXRlCiAgICAgICAgIGVuZAotICAgICAgICBhLnNob3VsZCA9PSBiCisgICAgICAgIGV4cGVjdChhKS50byBlcShiKQogICAgICAgICBiLnZhbHVlWzNdID0geyAzID0+IDQsIDUgPT4gNiB9Ci0gICAgICAgIGEuc2hvdWxkX25vdCA9PSBiCisgICAgICAgIGV4cGVjdChhKS5ub3RfdG8gZXEoYikKICAgICAgIGVuZAogICAgIGVuZAogICBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL3N0cnVjdF9zcGVjLnJiIGIvbGliL3JiL3NwZWMvc3RydWN0X3NwZWMucmIKaW5kZXggNjUzNGQ2MS4uYmJkNTAyYiAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvc3RydWN0X3NwZWMucmIKKysrIGIvbGliL3JiL3NwZWMvc3RydWN0X3NwZWMucmIKQEAgLTI1LDcgKzI1LDcgQEAKICAgICBpdCAic2hvdWxkIGl0ZXJhdGUgb3ZlciBhbGwgZmllbGRzIHByb3Blcmx5IiBkbwogICAgICAgZmllbGRzID0ge30KICAgICAgIFNwZWNOYW1lc3BhY2U6OkZvby5uZXcuZWFjaF9maWVsZCB7IHxmaWQsZmllbGRfaW5mb3wgZmllbGRzW2ZpZF0gPSBmaWVsZF9pbmZvIH0KLSAgICAgIGZpZWxkcy5zaG91bGQgPT0gU3BlY05hbWVzcGFjZTo6Rm9vOjpGSUVMRFMKKyAgICAgIGV4cGVjdChmaWVsZHMpLnRvIGVxKFNwZWNOYW1lc3BhY2U6OkZvbzo6RklFTERTKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBpbml0aWFsaXplIGFsbCBmaWVsZHMgdG8gZGVmYXVsdHMiIGRvCkBAIC0zOSwxOSArMzksMTkgQEAKICAgICBlbmQKIAogICAgIGRlZiB2YWxpZGF0ZV9kZWZhdWx0X2FyZ3VtZW50cyhvYmplY3QpCi0gICAgICBvYmplY3Quc2ltcGxlLnNob3VsZCA9PSA1MwotICAgICAgb2JqZWN0LndvcmRzLnNob3VsZCA9PSAid29yZHMiCi0gICAgICBvYmplY3QuaGVsbG8uc2hvdWxkID09IFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldyg6Z3JlZXRpbmcgPT4gJ2hlbGxvLCB3b3JsZCEnKQotICAgICAgb2JqZWN0LmludHMuc2hvdWxkID09IFsxLCAyLCAyLCAzXQotICAgICAgb2JqZWN0LmNvbXBsZXguc2hvdWxkIGJlX25pbAotICAgICAgb2JqZWN0LnNob3J0cy5zaG91bGQgPT0gU2V0Lm5ldyhbNSwgMTcsIDIzOV0pCisgICAgICBleHBlY3Qob2JqZWN0LnNpbXBsZSkudG8gZXEoNTMpCisgICAgICBleHBlY3Qob2JqZWN0LndvcmRzKS50byBlcSgid29yZHMiKQorICAgICAgZXhwZWN0KG9iamVjdC5oZWxsbykudG8gZXEoU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KDpncmVldGluZyA9PiAnaGVsbG8sIHdvcmxkIScpKQorICAgICAgZXhwZWN0KG9iamVjdC5pbnRzKS50byBlcShbMSwgMiwgMiwgM10pCisgICAgICBleHBlY3Qob2JqZWN0LmNvbXBsZXgpLnRvIGJlX25pbAorICAgICAgZXhwZWN0KG9iamVjdC5zaG9ydHMpLnRvIGVxKFNldC5uZXcoWzUsIDE3LCAyMzldKSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgbm90IHNoYXJlIGRlZmF1bHQgdmFsdWVzIGJldHdlZW4gaW5zdGFuY2VzIiBkbwogICAgICAgYmVnaW4KICAgICAgICAgc3RydWN0ID0gU3BlY05hbWVzcGFjZTo6Rm9vLm5ldwogICAgICAgICBzdHJ1Y3QuaW50cyA8PCAxNwotICAgICAgICBTcGVjTmFtZXNwYWNlOjpGb28ubmV3LmludHMuc2hvdWxkID09IFsxLDIsMiwzXQorICAgICAgICBleHBlY3QoU3BlY05hbWVzcGFjZTo6Rm9vLm5ldy5pbnRzKS50byBlcShbMSwyLDIsM10pCiAgICAgICBlbnN1cmUKICAgICAgICAgIyBlbnN1cmUgbm8gbGVha2FnZSB0byBvdGhlciB0ZXN0cwogICAgICAgICBTcGVjTmFtZXNwYWNlOjpGb286OkZJRUxEU1s0XVs6ZGVmYXVsdF0gPSBbMSwyLDIsM10KQEAgLTYwLDQ4ICs2MCw0OCBAQAogCiAgICAgaXQgInNob3VsZCBwcm9wZXJseSBpbml0aWFsaXplIGJvb2xlYW4gdmFsdWVzIiBkbwogICAgICAgc3RydWN0ID0gU3BlY05hbWVzcGFjZTo6Qm9vbFN0cnVjdC5uZXcoOnllc25vID0+IGZhbHNlKQotICAgICAgc3RydWN0Lnllc25vLnNob3VsZCBiZV9mYWxzZQorICAgICAgZXhwZWN0KHN0cnVjdC55ZXNubykudG8gYmVfZmFsc2V5CiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGhhdmUgcHJvcGVyID09IHNlbWFudGljcyIgZG8KLSAgICAgIFNwZWNOYW1lc3BhY2U6OkZvby5uZXcuc2hvdWxkX25vdCA9PSBTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcKLSAgICAgIFNwZWNOYW1lc3BhY2U6OkZvby5uZXcuc2hvdWxkID09IFNwZWNOYW1lc3BhY2U6OkZvby5uZXcKLSAgICAgIFNwZWNOYW1lc3BhY2U6OkZvby5uZXcoOnNpbXBsZSA9PiA1Mikuc2hvdWxkX25vdCA9PSBTcGVjTmFtZXNwYWNlOjpGb28ubmV3CisgICAgICBleHBlY3QoU3BlY05hbWVzcGFjZTo6Rm9vLm5ldykubm90X3RvIGVxKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldykKKyAgICAgIGV4cGVjdChTcGVjTmFtZXNwYWNlOjpGb28ubmV3KS50byBlcShTcGVjTmFtZXNwYWNlOjpGb28ubmV3KQorICAgICAgZXhwZWN0KFNwZWNOYW1lc3BhY2U6OkZvby5uZXcoOnNpbXBsZSA9PiA1MikpLm5vdF90byBlcShTcGVjTmFtZXNwYWNlOjpGb28ubmV3KQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBwcmludCBlbnVtIHZhbHVlIG5hbWVzIGluIGluc3BlY3QiIGRvCi0gICAgICBTcGVjTmFtZXNwYWNlOjpTdHJ1Y3RXaXRoU29tZUVudW0ubmV3KDpzb21lX2VudW0gPT4gU3BlY05hbWVzcGFjZTo6U29tZUVudW06Ok9ORSkuaW5zcGVjdC5zaG91bGQgPT0gIjxTcGVjTmFtZXNwYWNlOjpTdHJ1Y3RXaXRoU29tZUVudW0gc29tZV9lbnVtOk9ORSAoMCk+IgorICAgICAgZXhwZWN0KFNwZWNOYW1lc3BhY2U6OlN0cnVjdFdpdGhTb21lRW51bS5uZXcoOnNvbWVfZW51bSA9PiBTcGVjTmFtZXNwYWNlOjpTb21lRW51bTo6T05FKS5pbnNwZWN0KS50byBlcSgiPFNwZWNOYW1lc3BhY2U6OlN0cnVjdFdpdGhTb21lRW51bSBzb21lX2VudW06T05FICgwKT4iKQogCi0gICAgICBTcGVjTmFtZXNwYWNlOjpTdHJ1Y3RXaXRoRW51bU1hcC5uZXcoOm15X21hcCA9PiB7U3BlY05hbWVzcGFjZTo6U29tZUVudW06Ok9ORSA9PiBbU3BlY05hbWVzcGFjZTo6U29tZUVudW06OlRXT119KS5pbnNwZWN0LnNob3VsZCA9PSAiPFNwZWNOYW1lc3BhY2U6OlN0cnVjdFdpdGhFbnVtTWFwIG15X21hcDp7T05FICgwKTogW1RXTyAoMSldfT4iCisgICAgICBleHBlY3QoU3BlY05hbWVzcGFjZTo6U3RydWN0V2l0aEVudW1NYXAubmV3KDpteV9tYXAgPT4ge1NwZWNOYW1lc3BhY2U6OlNvbWVFbnVtOjpPTkUgPT4gW1NwZWNOYW1lc3BhY2U6OlNvbWVFbnVtOjpUV09dfSkuaW5zcGVjdCkudG8gZXEoIjxTcGVjTmFtZXNwYWNlOjpTdHJ1Y3RXaXRoRW51bU1hcCBteV9tYXA6e09ORSAoMCk6IFtUV08gKDEpXX0+IikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcHJldHR5IHByaW50IGJpbmFyeSBmaWVsZHMiIGRvCi0gICAgICBTcGVjTmFtZXNwYWNlOjpGb28yLm5ldyg6bXlfYmluYXJ5ID0+ICJcMDAxXDAwMlwwMDMiKS5pbnNwZWN0LnNob3VsZCA9PSAiPFNwZWNOYW1lc3BhY2U6OkZvbzIgbXlfYmluYXJ5OjAxMDIwMz4iCisgICAgICBleHBlY3QoU3BlY05hbWVzcGFjZTo6Rm9vMi5uZXcoOm15X2JpbmFyeSA9PiAiXDAwMVwwMDJcMDAzIikuaW5zcGVjdCkudG8gZXEoIjxTcGVjTmFtZXNwYWNlOjpGb28yIG15X2JpbmFyeTowMTAyMDM+IikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgb2ZmZXIgZmllbGQ/IG1ldGhvZHMiIGRvCi0gICAgICBTcGVjTmFtZXNwYWNlOjpGb28ubmV3Lm9wdF9zdHJpbmc/LnNob3VsZCBiZV9mYWxzZQotICAgICAgU3BlY05hbWVzcGFjZTo6Rm9vLm5ldyg6c2ltcGxlID0+IDUyKS5zaW1wbGU/LnNob3VsZCBiZV90cnVlCi0gICAgICBTcGVjTmFtZXNwYWNlOjpGb28ubmV3KDpteV9ib29sID0+IGZhbHNlKS5teV9ib29sPy5zaG91bGQgYmVfdHJ1ZQotICAgICAgU3BlY05hbWVzcGFjZTo6Rm9vLm5ldyg6bXlfYm9vbCA9PiB0cnVlKS5teV9ib29sPy5zaG91bGQgYmVfdHJ1ZQorICAgICAgZXhwZWN0KFNwZWNOYW1lc3BhY2U6OkZvby5uZXcub3B0X3N0cmluZz8pLnRvIGJlX2ZhbHNleQorICAgICAgZXhwZWN0KFNwZWNOYW1lc3BhY2U6OkZvby5uZXcoOnNpbXBsZSA9PiA1Mikuc2ltcGxlPykudG8gYmVfdHJ1dGh5CisgICAgICBleHBlY3QoU3BlY05hbWVzcGFjZTo6Rm9vLm5ldyg6bXlfYm9vbCA9PiBmYWxzZSkubXlfYm9vbD8pLnRvIGJlX3RydXRoeQorICAgICAgZXhwZWN0KFNwZWNOYW1lc3BhY2U6OkZvby5uZXcoOm15X2Jvb2wgPT4gdHJ1ZSkubXlfYm9vbD8pLnRvIGJlX3RydXRoeQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBiZSBjb21wYXJhYmxlIiBkbwogICAgICAgczEgPSBTcGVjTmFtZXNwYWNlOjpTdHJ1Y3RXaXRoU29tZUVudW0ubmV3KDpzb21lX2VudW0gPT4gU3BlY05hbWVzcGFjZTo6U29tZUVudW06Ok9ORSkKICAgICAgIHMyID0gU3BlY05hbWVzcGFjZTo6U3RydWN0V2l0aFNvbWVFbnVtLm5ldyg6c29tZV9lbnVtID0+IFNwZWNOYW1lc3BhY2U6OlNvbWVFbnVtOjpUV08pCiAKLSAgICAgIChzMSA8PT4gczIpLnNob3VsZCA9PSAtMQotICAgICAgKHMyIDw9PiBzMSkuc2hvdWxkID09IDEKLSAgICAgIChzMSA8PT4gczEpLnNob3VsZCA9PSAwCi0gICAgICAoczEgPD0+IFNwZWNOYW1lc3BhY2U6OlN0cnVjdFdpdGhTb21lRW51bS5uZXcoKSkuc2hvdWxkID09IC0xCisgICAgICBleHBlY3QoczEgPD0+IHMyKS50byBlcSgtMSkKKyAgICAgIGV4cGVjdChzMiA8PT4gczEpLnRvIGVxKDEpCisgICAgICBleHBlY3QoczEgPD0+IHMxKS50byBlcSgwKQorICAgICAgZXhwZWN0KHMxIDw9PiBTcGVjTmFtZXNwYWNlOjpTdHJ1Y3RXaXRoU29tZUVudW0ubmV3KCkpLnRvIGVxKC0xKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZWFkIGl0c2VsZiBvZmYgdGhlIHdpcmUiIGRvCiAgICAgICBzdHJ1Y3QgPSBTcGVjTmFtZXNwYWNlOjpGb28ubmV3Ci0gICAgICBwcm90ID0gVGhyaWZ0OjpCYXNlUHJvdG9jb2wubmV3KG1vY2soInRyYW5zcG9ydCIpKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfYmVnaW4pLnR3aWNlCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cnVjdF9lbmQpLnR3aWNlCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2ZpZWxkX2JlZ2luKS5hbmRfcmV0dXJuKAorICAgICAgcHJvdCA9IFRocmlmdDo6QmFzZVByb3RvY29sLm5ldyhkb3VibGUoInRyYW5zcG9ydCIpKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RydWN0X2JlZ2luKS50d2ljZQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RydWN0X2VuZCkudHdpY2UKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX2ZpZWxkX2JlZ2luKS5hbmRfcmV0dXJuKAogICAgICAgICBbJ2NvbXBsZXgnLCBUaHJpZnQ6OlR5cGVzOjpNQVAsIDVdLCAjIEZvbwogICAgICAgICBbJ3dvcmRzJywgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAyXSwgIyBGb28KICAgICAgICAgWydoZWxsbycsIFRocmlmdDo6VHlwZXM6OlNUUlVDVCwgM10sICMgRm9vCkBAIC0xMTIsNDkgKzExMiw0OSBAQAogICAgICAgICBbJ3Nob3J0cycsIFRocmlmdDo6VHlwZXM6OlNFVCwgNl0sICMgRm9vCiAgICAgICAgIFtuaWwsIFRocmlmdDo6VHlwZXM6OlNUT1AsIDBdICMgSGVsbG8KICAgICAgICkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfZmllbGRfZW5kKS5leGFjdGx5KDcpLnRpbWVzCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX21hcF9iZWdpbikuYW5kX3JldHVybigKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX2ZpZWxkX2VuZCkuZXhhY3RseSg3KS50aW1lcworICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfbWFwX2JlZ2luKS5hbmRfcmV0dXJuKAogICAgICAgICBbVGhyaWZ0OjpUeXBlczo6STMyLCBUaHJpZnQ6OlR5cGVzOjpNQVAsIDJdLCAjIGNvbXBsZXgKICAgICAgICAgICBbVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCBUaHJpZnQ6OlR5cGVzOjpET1VCTEUsIDJdLCAjIGNvbXBsZXgvMS92YWx1ZQogICAgICAgICAgIFtUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIFRocmlmdDo6VHlwZXM6OkRPVUJMRSwgMV0gIyBjb21wbGV4LzIvdmFsdWUKICAgICAgICkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbWFwX2VuZCkuZXhhY3RseSgzKS50aW1lcwotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9saXN0X2JlZ2luKS5hbmRfcmV0dXJuKFtUaHJpZnQ6OlR5cGVzOjpJMzIsIDRdKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9saXN0X2VuZCkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc2V0X2JlZ2luKS5hbmRfcmV0dXJuKFtUaHJpZnQ6OlR5cGVzOjpJMTYsIDJdKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zZXRfZW5kKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9pMzIpLmFuZF9yZXR1cm4oCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9tYXBfZW5kKS5leGFjdGx5KDMpLnRpbWVzCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9saXN0X2JlZ2luKS5hbmRfcmV0dXJuKFtUaHJpZnQ6OlR5cGVzOjpJMzIsIDRdKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfbGlzdF9lbmQpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zZXRfYmVnaW4pLmFuZF9yZXR1cm4oW1RocmlmdDo6VHlwZXM6OkkxNiwgMl0pCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zZXRfZW5kKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfaTMyKS5hbmRfcmV0dXJuKAogICAgICAgICAxLCAxNCwgICAgICAgICMgY29tcGxleCBrZXlzCiAgICAgICAgIDQyLCAgICAgICAgICAgIyBzaW1wbGUKICAgICAgICAgNCwgMjMsIDQsIDI5ICAjIGludHMKICAgICAgICkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RyaW5nKS5hbmRfcmV0dXJuKCJwaSIsICJlIiwgImZlaWdlbmJhdW0iLCAiYXBwbGUgYmFuYW5hIiwgIndoYXQncyB1cD8iKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9kb3VibGUpLmFuZF9yZXR1cm4oTWF0aDo6UEksIE1hdGg6OkUsIDQuNjY5MjAxNjA5KQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9pMTYpLmFuZF9yZXR1cm4oMiwgMykKLSAgICAgIHByb3Quc2hvdWxkX25vdF9yZWNlaXZlKDpza2lwKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RyaW5nKS5hbmRfcmV0dXJuKCJwaSIsICJlIiwgImZlaWdlbmJhdW0iLCAiYXBwbGUgYmFuYW5hIiwgIndoYXQncyB1cD8iKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfZG91YmxlKS5hbmRfcmV0dXJuKE1hdGg6OlBJLCBNYXRoOjpFLCA0LjY2OTIwMTYwOSkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX2kxNikuYW5kX3JldHVybigyLCAzKQorICAgICAgZXhwZWN0KHByb3QpLm5vdF90byByZWNlaXZlKDpza2lwKQogICAgICAgc3RydWN0LnJlYWQocHJvdCkKIAotICAgICAgc3RydWN0LnNpbXBsZS5zaG91bGQgPT0gNDIKLSAgICAgIHN0cnVjdC5jb21wbGV4LnNob3VsZCA9PSB7MSA9PiB7InBpIiA9PiBNYXRoOjpQSSwgImUiID0+IE1hdGg6OkV9LCAxNCA9PiB7ImZlaWdlbmJhdW0iID0+IDQuNjY5MjAxNjA5fX0KLSAgICAgIHN0cnVjdC5oZWxsby5zaG91bGQgPT0gU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KDpncmVldGluZyA9PiAid2hhdCdzIHVwPyIpCi0gICAgICBzdHJ1Y3Qud29yZHMuc2hvdWxkID09ICJhcHBsZSBiYW5hbmEiCi0gICAgICBzdHJ1Y3QuaW50cy5zaG91bGQgPT0gWzQsIDIzLCA0LCAyOV0KLSAgICAgIHN0cnVjdC5zaG9ydHMuc2hvdWxkID09IFNldC5uZXcoWzMsIDJdKQorICAgICAgZXhwZWN0KHN0cnVjdC5zaW1wbGUpLnRvIGVxKDQyKQorICAgICAgZXhwZWN0KHN0cnVjdC5jb21wbGV4KS50byBlcSh7MSA9PiB7InBpIiA9PiBNYXRoOjpQSSwgImUiID0+IE1hdGg6OkV9LCAxNCA9PiB7ImZlaWdlbmJhdW0iID0+IDQuNjY5MjAxNjA5fX0pCisgICAgICBleHBlY3Qoc3RydWN0LmhlbGxvKS50byBlcShTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcoOmdyZWV0aW5nID0+ICJ3aGF0J3MgdXA/IikpCisgICAgICBleHBlY3Qoc3RydWN0LndvcmRzKS50byBlcSgiYXBwbGUgYmFuYW5hIikKKyAgICAgIGV4cGVjdChzdHJ1Y3QuaW50cykudG8gZXEoWzQsIDIzLCA0LCAyOV0pCisgICAgICBleHBlY3Qoc3RydWN0LnNob3J0cykudG8gZXEoU2V0Lm5ldyhbMywgMl0pKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBzZXJpYWxpemUgZmFsc2UgYm9vbGVhbiBmaWVsZHMgY29ycmVjdGx5IiBkbwogICAgICAgYiA9IFNwZWNOYW1lc3BhY2U6OkJvb2xTdHJ1Y3QubmV3KDp5ZXNubyA9PiBmYWxzZSkKICAgICAgIHByb3QgPSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sLm5ldyhUaHJpZnQ6Ok1lbW9yeUJ1ZmZlclRyYW5zcG9ydC5uZXcpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9ib29sKS53aXRoKGZhbHNlKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2Jvb2wpLndpdGgoZmFsc2UpCiAgICAgICBiLndyaXRlKHByb3QpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHNraXAgdW5leHBlY3RlZCBmaWVsZHMgaW4gc3RydWN0cyBhbmQgdXNlIGRlZmF1bHQgdmFsdWVzIiBkbwogICAgICAgc3RydWN0ID0gU3BlY05hbWVzcGFjZTo6Rm9vLm5ldwotICAgICAgcHJvdCA9IFRocmlmdDo6QmFzZVByb3RvY29sLm5ldyhtb2NrKCJ0cmFuc3BvcnQiKSkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RydWN0X2JlZ2luKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfZW5kKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9maWVsZF9iZWdpbikuYW5kX3JldHVybigKKyAgICAgIHByb3QgPSBUaHJpZnQ6OkJhc2VQcm90b2NvbC5uZXcoZG91YmxlKCJ0cmFuc3BvcnQiKSkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cnVjdF9iZWdpbikKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cnVjdF9lbmQpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9maWVsZF9iZWdpbikuYW5kX3JldHVybigKICAgICAgICAgWydzaW1wbGUnLCBUaHJpZnQ6OlR5cGVzOjpJMzIsIDFdLAogICAgICAgICBbJ2NvbXBsZXgnLCBUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QsIDVdLAogICAgICAgICBbJ3RoaW56JywgVGhyaWZ0OjpUeXBlczo6TUFQLCA3XSwKQEAgLTE2Miw1NSArMTYyLDU1IEBACiAgICAgICAgIFsnd29yZHMnLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDJdLAogICAgICAgICBbbmlsLCBUaHJpZnQ6OlR5cGVzOjpTVE9QLCAwXQogICAgICAgKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9maWVsZF9lbmQpLmV4YWN0bHkoNSkudGltZXMKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfaTMyKS5hbmRfcmV0dXJuKDQyKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJpbmcpLmFuZF9yZXR1cm4oImZvb2JhciIpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpza2lwKS53aXRoKFRocmlmdDo6VHlwZXM6OlNUUlVDVCkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnNraXApLndpdGgoVGhyaWZ0OjpUeXBlczo6TUFQKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfZmllbGRfZW5kKS5leGFjdGx5KDUpLnRpbWVzCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9pMzIpLmFuZF9yZXR1cm4oNDIpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJpbmcpLmFuZF9yZXR1cm4oImZvb2JhciIpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6c2tpcCkud2l0aChUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6c2tpcCkud2l0aChUaHJpZnQ6OlR5cGVzOjpNQVApCiAgICAgICAjIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbWFwX2JlZ2luKS5hbmRfcmV0dXJuKFtUaHJpZnQ6OlR5cGVzOjpJMzIsIFRocmlmdDo6VHlwZXM6OkkzMiwgMF0pCiAgICAgICAjIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbWFwX2VuZCkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnNraXApLndpdGgoVGhyaWZ0OjpUeXBlczo6STMyKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnNraXApLndpdGgoVGhyaWZ0OjpUeXBlczo6STMyKQogICAgICAgc3RydWN0LnJlYWQocHJvdCkKIAotICAgICAgc3RydWN0LnNpbXBsZS5zaG91bGQgPT0gNDIKLSAgICAgIHN0cnVjdC5jb21wbGV4LnNob3VsZCBiZV9uaWwKLSAgICAgIHN0cnVjdC53b3Jkcy5zaG91bGQgPT0gImZvb2JhciIKLSAgICAgIHN0cnVjdC5oZWxsby5zaG91bGQgPT0gU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KDpncmVldGluZyA9PiAnaGVsbG8sIHdvcmxkIScpCi0gICAgICBzdHJ1Y3QuaW50cy5zaG91bGQgPT0gWzEsIDIsIDIsIDNdCi0gICAgICBzdHJ1Y3Quc2hvcnRzLnNob3VsZCA9PSBTZXQubmV3KFs1LCAxNywgMjM5XSkKKyAgICAgIGV4cGVjdChzdHJ1Y3Quc2ltcGxlKS50byBlcSg0MikKKyAgICAgIGV4cGVjdChzdHJ1Y3QuY29tcGxleCkudG8gYmVfbmlsCisgICAgICBleHBlY3Qoc3RydWN0LndvcmRzKS50byBlcSgiZm9vYmFyIikKKyAgICAgIGV4cGVjdChzdHJ1Y3QuaGVsbG8pLnRvIGVxKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldyg6Z3JlZXRpbmcgPT4gJ2hlbGxvLCB3b3JsZCEnKSkKKyAgICAgIGV4cGVjdChzdHJ1Y3QuaW50cykudG8gZXEoWzEsIDIsIDIsIDNdKQorICAgICAgZXhwZWN0KHN0cnVjdC5zaG9ydHMpLnRvIGVxKFNldC5uZXcoWzUsIDE3LCAyMzldKSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUgaXRzZWxmIHRvIHRoZSB3aXJlIiBkbwotICAgICAgcHJvdCA9IFRocmlmdDo6QmFzZVByb3RvY29sLm5ldyhtb2NrKCJ0cmFuc3BvcnQiKSkgI21vY2soIlByb3RvY29sIikKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiU3BlY05hbWVzcGFjZTo6Rm9vIikKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiU3BlY05hbWVzcGFjZTo6SGVsbG8iKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2VuZCkudHdpY2UKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdpbnRzJywgVGhyaWZ0OjpUeXBlczo6TElTVCwgNCkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2kzMikud2l0aCgxKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfaTMyKS53aXRoKDIpLnR3aWNlCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoMykKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdjb21wbGV4JywgVGhyaWZ0OjpUeXBlczo6TUFQLCA1KQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfaTMyKS53aXRoKDUpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJpbmcpLndpdGgoJ2ZvbycpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9kb3VibGUpLndpdGgoMS4yMykKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdzaG9ydHMnLCBUaHJpZnQ6OlR5cGVzOjpTRVQsIDYpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9pMTYpLndpdGgoNSkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2kxNikud2l0aCgxNykKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2kxNikud2l0aCgyMzkpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9zdG9wKS50d2ljZQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfZW5kKS5leGFjdGx5KDYpLnRpbWVzCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnc2ltcGxlJywgVGhyaWZ0OjpUeXBlczo6STMyLCAxKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfaTMyKS53aXRoKDUzKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ2hlbGxvJywgVGhyaWZ0OjpUeXBlczo6U1RSVUNULCAzKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ2dyZWV0aW5nJywgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAxKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCdoZWxsbywgd29ybGQhJykKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX21hcF9iZWdpbikud2l0aChUaHJpZnQ6OlR5cGVzOjpJMzIsIFRocmlmdDo6VHlwZXM6Ok1BUCwgMSkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX21hcF9iZWdpbikud2l0aChUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIFRocmlmdDo6VHlwZXM6OkRPVUJMRSwgMSkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX21hcF9lbmQpLnR3aWNlCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9saXN0X2JlZ2luKS53aXRoKFRocmlmdDo6VHlwZXM6OkkzMiwgNCkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2xpc3RfZW5kKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc2V0X2JlZ2luKS53aXRoKFRocmlmdDo6VHlwZXM6OkkxNiwgMykKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3NldF9lbmQpCisgICAgICBwcm90ID0gVGhyaWZ0OjpCYXNlUHJvdG9jb2wubmV3KGRvdWJsZSgidHJhbnNwb3J0IikpICNtb2NrKCJQcm90b2NvbCIpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2JlZ2luKS53aXRoKCJTcGVjTmFtZXNwYWNlOjpGb28iKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiU3BlY05hbWVzcGFjZTo6SGVsbG8iKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cnVjdF9lbmQpLnR3aWNlCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ2ludHMnLCBUaHJpZnQ6OlR5cGVzOjpMSVNULCA0KQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2kzMikud2l0aCgxKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2kzMikud2l0aCgyKS50d2ljZQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2kzMikud2l0aCgzKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdjb21wbGV4JywgVGhyaWZ0OjpUeXBlczo6TUFQLCA1KQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2kzMikud2l0aCg1KQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgnZm9vJykKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9kb3VibGUpLndpdGgoMS4yMykKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnc2hvcnRzJywgVGhyaWZ0OjpUeXBlczo6U0VULCA2KQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2kxNikud2l0aCg1KQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2kxNikud2l0aCgxNykKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9pMTYpLndpdGgoMjM5KQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX3N0b3ApLnR3aWNlCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfZW5kKS5leGFjdGx5KDYpLnRpbWVzCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ3NpbXBsZScsIFRocmlmdDo6VHlwZXM6OkkzMiwgMSkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoNTMpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ2hlbGxvJywgVGhyaWZ0OjpUeXBlczo6U1RSVUNULCAzKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdncmVldGluZycsIFRocmlmdDo6VHlwZXM6OlNUUklORywgMSkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJpbmcpLndpdGgoJ2hlbGxvLCB3b3JsZCEnKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX21hcF9iZWdpbikud2l0aChUaHJpZnQ6OlR5cGVzOjpJMzIsIFRocmlmdDo6VHlwZXM6Ok1BUCwgMSkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9tYXBfYmVnaW4pLndpdGgoVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCBUaHJpZnQ6OlR5cGVzOjpET1VCTEUsIDEpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfbWFwX2VuZCkudHdpY2UKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9saXN0X2JlZ2luKS53aXRoKFRocmlmdDo6VHlwZXM6OkkzMiwgNCkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9saXN0X2VuZCkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zZXRfYmVnaW4pLndpdGgoVGhyaWZ0OjpUeXBlczo6STE2LCAzKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3NldF9lbmQpCiAKICAgICAgIHN0cnVjdCA9IFNwZWNOYW1lc3BhY2U6OkZvby5uZXcKICAgICAgIHN0cnVjdC53b3JkcyA9IG5pbApAQCAtMjIxLDUwICsyMjEsNTAgQEAKICAgICBpdCAic2hvdWxkIHJhaXNlIGFuIGV4Y2VwdGlvbiBpZiBwcmVzZW50ZWQgd2l0aCBhbiB1bmtub3duIGNvbnRhaW5lciIgZG8KICAgICAgICMgeWVhaCB0aGlzIGlzIHNpbGx5LCBidXQgSSdtIGdvaW5nIGZvciBjb2RlIGNvdmVyYWdlIGhlcmUKICAgICAgIHN0cnVjdCA9IFNwZWNOYW1lc3BhY2U6OkZvby5uZXcKLSAgICAgIGxhbWJkYSB7IHN0cnVjdC5zZW5kIDp3cml0ZV9jb250YWluZXIsIG5pbCwgbmlsLCB7OnR5cGUgPT4gImZvbyJ9IH0uc2hvdWxkIHJhaXNlX2Vycm9yKFN0YW5kYXJkRXJyb3IsICJOb3QgYSBjb250YWluZXIgdHlwZTogZm9vIikKKyAgICAgIGV4cGVjdCB7IHN0cnVjdC5zZW5kIDp3cml0ZV9jb250YWluZXIsIG5pbCwgbmlsLCB7OnR5cGUgPT4gImZvbyJ9IH0udG8gcmFpc2VfZXJyb3IoU3RhbmRhcmRFcnJvciwgIk5vdCBhIGNvbnRhaW5lciB0eXBlOiBmb28iKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBzdXBwb3J0IG9wdGlvbmFsIHR5cGUtY2hlY2tpbmcgaW4gVGhyaWZ0OjpTdHJ1Y3QubmV3IiBkbwogICAgICAgVGhyaWZ0LnR5cGVfY2hlY2tpbmcgPSB0cnVlCiAgICAgICBiZWdpbgotICAgICAgICBsYW1iZGEgeyBTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcoOmdyZWV0aW5nID0+IDMpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yLCAiRXhwZWN0ZWQgVHlwZXM6OlNUUklORywgcmVjZWl2ZWQgRml4bnVtIGZvciBmaWVsZCBncmVldGluZyIpCisgICAgICAgIGV4cGVjdCB7IFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldyg6Z3JlZXRpbmcgPT4gMykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvciwgL0V4cGVjdGVkIFR5cGVzOjpTVFJJTkcsIHJlY2VpdmVkIChJbnRlZ2VyfEZpeG51bSkgZm9yIGZpZWxkIGdyZWV0aW5nLykKICAgICAgIGVuc3VyZQogICAgICAgICBUaHJpZnQudHlwZV9jaGVja2luZyA9IGZhbHNlCiAgICAgICBlbmQKLSAgICAgIGxhbWJkYSB7IFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldyg6Z3JlZXRpbmcgPT4gMykgfS5zaG91bGRfbm90IHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KDpncmVldGluZyA9PiAzKSB9Lm5vdF90byByYWlzZV9lcnJvcgogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBzdXBwb3J0IG9wdGlvbmFsIHR5cGUtY2hlY2tpbmcgaW4gZmllbGQgYWNjZXNzb3JzIiBkbwogICAgICAgVGhyaWZ0LnR5cGVfY2hlY2tpbmcgPSB0cnVlCiAgICAgICBiZWdpbgogICAgICAgICBoZWxsbyA9IFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldwotICAgICAgICBsYW1iZGEgeyBoZWxsby5ncmVldGluZyA9IDMgfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IsICJFeHBlY3RlZCBUeXBlczo6U1RSSU5HLCByZWNlaXZlZCBGaXhudW0gZm9yIGZpZWxkIGdyZWV0aW5nIikKKyAgICAgICAgZXhwZWN0IHsgaGVsbG8uZ3JlZXRpbmcgPSAzIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IsIC9FeHBlY3RlZCBUeXBlczo6U1RSSU5HLCByZWNlaXZlZCAoSW50ZWdlcnxGaXhudW0pIGZvciBmaWVsZCBncmVldGluZy8pCiAgICAgICBlbnN1cmUKICAgICAgICAgVGhyaWZ0LnR5cGVfY2hlY2tpbmcgPSBmYWxzZQogICAgICAgZW5kCi0gICAgICBsYW1iZGEgeyBoZWxsby5ncmVldGluZyA9IDMgfS5zaG91bGRfbm90IHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgaGVsbG8uZ3JlZXRpbmcgPSAzIH0ubm90X3RvIHJhaXNlX2Vycm9yCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJhaXNlIGFuIGV4Y2VwdGlvbiB3aGVuIHVua25vd24gdHlwZXMgYXJlIGdpdmVuIHRvIFRocmlmdDo6U3RydWN0Lm5ldyIgZG8KLSAgICAgIGxhbWJkYSB7IFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldyg6ZmlzaCA9PiAnc2FsbW9uJykgfS5zaG91bGQgcmFpc2VfZXJyb3IoRXhjZXB0aW9uLCAiVW5rbm93biBrZXkgZ2l2ZW4gdG8gU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3OiBmaXNoIikKKyAgICAgIGV4cGVjdCB7IFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldyg6ZmlzaCA9PiAnc2FsbW9uJykgfS50byByYWlzZV9lcnJvcihFeGNlcHRpb24sICJVbmtub3duIGtleSBnaXZlbiB0byBTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXc6IGZpc2giKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBzdXBwb3J0IGByYWlzZSBYY2VwdGlvbiwgJ21lc3NhZ2UnYCBmb3IgRXhjZXB0aW9uIHN0cnVjdHMiIGRvCiAgICAgICBiZWdpbgogICAgICAgICByYWlzZSBTcGVjTmFtZXNwYWNlOjpYY2VwdGlvbiwgInNvbWV0aGluZyBoYXBwZW5lZCIKICAgICAgIHJlc2N1ZSBUaHJpZnQ6OkV4Y2VwdGlvbiA9PiBlCi0gICAgICAgIGUubWVzc2FnZS5zaG91bGQgPT0gInNvbWV0aGluZyBoYXBwZW5lZCIKLSAgICAgICAgZS5jb2RlLnNob3VsZCA9PSAxCisgICAgICAgIGV4cGVjdChlLm1lc3NhZ2UpLnRvIGVxKCJzb21ldGhpbmcgaGFwcGVuZWQiKQorICAgICAgICBleHBlY3QoZS5jb2RlKS50byBlcSgxKQogICAgICAgICAjIGVuc3VyZSBpdCBnZXRzIHNlcmlhbGl6ZWQgcHJvcGVybHksIHRoaXMgaXMgdGhlIHJlYWxseSBpbXBvcnRhbnQgcGFydAotICAgICAgICBwcm90ID0gVGhyaWZ0OjpCYXNlUHJvdG9jb2wubmV3KG1vY2soInRyYW5zIikpCi0gICAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiU3BlY05hbWVzcGFjZTo6WGNlcHRpb24iKQotICAgICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfZW5kKQotICAgICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnbWVzc2FnZScsIFRocmlmdDo6VHlwZXM6OlNUUklORywgMSkjLCAic29tZXRoaW5nIGhhcHBlbmVkIikKLSAgICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCJzb21ldGhpbmcgaGFwcGVuZWQiKQotICAgICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnY29kZScsIFRocmlmdDo6VHlwZXM6OkkzMiwgMikjLCAxKQotICAgICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoMSkKLSAgICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfc3RvcCkKLSAgICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfZW5kKS50d2ljZQorICAgICAgICBwcm90ID0gVGhyaWZ0OjpCYXNlUHJvdG9jb2wubmV3KGRvdWJsZSgidHJhbnMiKSkKKyAgICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiU3BlY05hbWVzcGFjZTo6WGNlcHRpb24iKQorICAgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2VuZCkKKyAgICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdtZXNzYWdlJywgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAxKSMsICJzb21ldGhpbmcgaGFwcGVuZWQiKQorICAgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCJzb21ldGhpbmcgaGFwcGVuZWQiKQorICAgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ2NvZGUnLCBUaHJpZnQ6OlR5cGVzOjpJMzIsIDIpIywgMSkKKyAgICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2kzMikud2l0aCgxKQorICAgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfc3RvcCkKKyAgICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2VuZCkudHdpY2UKIAogICAgICAgICBlLndyaXRlKHByb3QpCiAgICAgICBlbmQKQEAgLTI3NCwxNyArMjc0LDE3IEBACiAgICAgICBiZWdpbgogICAgICAgICByYWlzZSBTcGVjTmFtZXNwYWNlOjpYY2VwdGlvbiwgOm1lc3NhZ2UgPT4gInNvbWV0aGluZyBoYXBwZW5lZCIsIDpjb2RlID0+IDUKICAgICAgIHJlc2N1ZSBUaHJpZnQ6OkV4Y2VwdGlvbiA9PiBlCi0gICAgICAgIGUubWVzc2FnZS5zaG91bGQgPT0gInNvbWV0aGluZyBoYXBwZW5lZCIKLSAgICAgICAgZS5jb2RlLnNob3VsZCA9PSA1Ci0gICAgICAgIHByb3QgPSBUaHJpZnQ6OkJhc2VQcm90b2NvbC5uZXcobW9jaygidHJhbnMiKSkKLSAgICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2JlZ2luKS53aXRoKCJTcGVjTmFtZXNwYWNlOjpYY2VwdGlvbiIpCi0gICAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cnVjdF9lbmQpCi0gICAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdtZXNzYWdlJywgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAxKQotICAgICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJpbmcpLndpdGgoInNvbWV0aGluZyBoYXBwZW5lZCIpCi0gICAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdjb2RlJywgVGhyaWZ0OjpUeXBlczo6STMyLCAyKQotICAgICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoNSkKLSAgICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfc3RvcCkKLSAgICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfZW5kKS50d2ljZQorICAgICAgICBleHBlY3QoZS5tZXNzYWdlKS50byBlcSgic29tZXRoaW5nIGhhcHBlbmVkIikKKyAgICAgICAgZXhwZWN0KGUuY29kZSkudG8gZXEoNSkKKyAgICAgICAgcHJvdCA9IFRocmlmdDo6QmFzZVByb3RvY29sLm5ldyhkb3VibGUoInRyYW5zIikpCisgICAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfYmVnaW4pLndpdGgoIlNwZWNOYW1lc3BhY2U6OlhjZXB0aW9uIikKKyAgICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cnVjdF9lbmQpCisgICAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnbWVzc2FnZScsIFRocmlmdDo6VHlwZXM6OlNUUklORywgMSkKKyAgICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgic29tZXRoaW5nIGhhcHBlbmVkIikKKyAgICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdjb2RlJywgVGhyaWZ0OjpUeXBlczo6STMyLCAyKQorICAgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfaTMyKS53aXRoKDUpCisgICAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9zdG9wKQorICAgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfZW5kKS50d2ljZQogCiAgICAgICAgIGUud3JpdGUocHJvdCkKICAgICAgIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvdGhpbl9odHRwX3NlcnZlcl9zcGVjLnJiIGIvbGliL3JiL3NwZWMvdGhpbl9odHRwX3NlcnZlcl9zcGVjLnJiCmluZGV4IDU1MjA4MzkuLjY2NTM5MWIgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL3RoaW5faHR0cF9zZXJ2ZXJfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy90aGluX2h0dHBfc2VydmVyX3NwZWMucmIKQEAgLTIzLDI0ICsyMywyNCBAQAogCiBkZXNjcmliZSBUaHJpZnQ6OlRoaW5IVFRQU2VydmVyIGRvCiAKLSAgbGV0KDpwcm9jZXNzb3IpIHsgbW9jaygncHJvY2Vzc29yJykgfQorICBsZXQoOnByb2Nlc3NvcikgeyBkb3VibGUoJ3Byb2Nlc3NvcicpIH0KIAogICBkZXNjcmliZSAiI2luaXRpYWxpemUiIGRvCiAKICAgICBjb250ZXh0ICJ3aGVuIHVzaW5nIHRoZSBkZWZhdWx0cyIgZG8KIAogICAgICAgaXQgImJpbmRzIHRvIHBvcnQgODAsIHdpdGggaG9zdCAwLjAuMC4wLCBhIHBhdGggb2YgJy8nIiBkbwotICAgICAgICBUaGluOjpTZXJ2ZXIuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aCgnMC4wLjAuMCcsIDgwLCBhbl9pbnN0YW5jZV9vZihSYWNrOjpCdWlsZGVyKSkKKyAgICAgICAgZXhwZWN0KFRoaW46OlNlcnZlcikudG8gcmVjZWl2ZSg6bmV3KS53aXRoKCcwLjAuMC4wJywgODAsIGFuX2luc3RhbmNlX29mKFJhY2s6OkJ1aWxkZXIpKQogICAgICAgICBUaHJpZnQ6OlRoaW5IVFRQU2VydmVyLm5ldyhwcm9jZXNzb3IpCiAgICAgICBlbmQKIAogICAgICAgaXQgJ2NyZWF0ZXMgYSBUaGluSFRUUFNlcnZlcjo6UmFja0FwcGxpY2F0aW9uQ29udGV4dCcgZG8KLSAgICAgICAgVGhyaWZ0OjpUaGluSFRUUFNlcnZlcjo6UmFja0FwcGxpY2F0aW9uLnNob3VsZF9yZWNlaXZlKDpmb3IpLndpdGgoIi8iLCBwcm9jZXNzb3IsIGFuX2luc3RhbmNlX29mKFRocmlmdDo6QmluYXJ5UHJvdG9jb2xGYWN0b3J5KSkuYW5kX3JldHVybihhbnl0aGluZykKKyAgICAgICAgZXhwZWN0KFRocmlmdDo6VGhpbkhUVFBTZXJ2ZXI6OlJhY2tBcHBsaWNhdGlvbikudG8gcmVjZWl2ZSg6Zm9yKS53aXRoKCIvIiwgcHJvY2Vzc29yLCBhbl9pbnN0YW5jZV9vZihUaHJpZnQ6OkJpbmFyeVByb3RvY29sRmFjdG9yeSkpLmFuZF9yZXR1cm4oYW55dGhpbmcpCiAgICAgICAgIFRocmlmdDo6VGhpbkhUVFBTZXJ2ZXIubmV3KHByb2Nlc3NvcikKICAgICAgIGVuZAogCiAgICAgICBpdCAidXNlcyB0aGUgQmluYXJ5UHJvdG9jb2xGYWN0b3J5IiBkbwotICAgICAgICBUaHJpZnQ6OkJpbmFyeVByb3RvY29sRmFjdG9yeS5zaG91bGRfcmVjZWl2ZSg6bmV3KQorICAgICAgICBleHBlY3QoVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEZhY3RvcnkpLnRvIHJlY2VpdmUoOm5ldykKICAgICAgICAgVGhyaWZ0OjpUaGluSFRUUFNlcnZlci5uZXcocHJvY2Vzc29yKQogICAgICAgZW5kCiAKQEAgLTUyLDcgKzUyLDcgQEAKICAgICAgICAgaXAgPSAiMTkyLjE2OC4wLjEiCiAgICAgICAgIHBvcnQgPSAzMDAwCiAgICAgICAgIHBhdGggPSAiL3RoaW4iCi0gICAgICAgIFRoaW46OlNlcnZlci5zaG91bGRfcmVjZWl2ZSg6bmV3KS53aXRoKGlwLCBwb3J0LCBhbl9pbnN0YW5jZV9vZihSYWNrOjpCdWlsZGVyKSkKKyAgICAgICAgZXhwZWN0KFRoaW46OlNlcnZlcikudG8gcmVjZWl2ZSg6bmV3KS53aXRoKGlwLCBwb3J0LCBhbl9pbnN0YW5jZV9vZihSYWNrOjpCdWlsZGVyKSkKICAgICAgICAgVGhyaWZ0OjpUaGluSFRUUFNlcnZlci5uZXcocHJvY2Vzc29yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgOmlwID0+IGlwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgOnBvcnQgPT4gcG9ydCwKQEAgLTYwLDcgKzYwLDcgQEAKICAgICAgIGVuZAogCiAgICAgICBpdCAnY3JlYXRlcyBhIFRoaW5IVFRQU2VydmVyOjpSYWNrQXBwbGljYXRpb25Db250ZXh0IHdpdGggYSBkaWZmZXJlbnQgcHJvdG9jb2wgZmFjdG9yeScgZG8KLSAgICAgICAgVGhyaWZ0OjpUaGluSFRUUFNlcnZlcjo6UmFja0FwcGxpY2F0aW9uLnNob3VsZF9yZWNlaXZlKDpmb3IpLndpdGgoIi8iLCBwcm9jZXNzb3IsIGFuX2luc3RhbmNlX29mKFRocmlmdDo6SnNvblByb3RvY29sRmFjdG9yeSkpLmFuZF9yZXR1cm4oYW55dGhpbmcpCisgICAgICAgIGV4cGVjdChUaHJpZnQ6OlRoaW5IVFRQU2VydmVyOjpSYWNrQXBwbGljYXRpb24pLnRvIHJlY2VpdmUoOmZvcikud2l0aCgiLyIsIHByb2Nlc3NvciwgYW5faW5zdGFuY2Vfb2YoVGhyaWZ0OjpKc29uUHJvdG9jb2xGYWN0b3J5KSkuYW5kX3JldHVybihhbnl0aGluZykKICAgICAgICAgVGhyaWZ0OjpUaGluSFRUUFNlcnZlci5uZXcocHJvY2Vzc29yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgOnByb3RvY29sX2ZhY3RvcnkgPT4gVGhyaWZ0OjpKc29uUHJvdG9jb2xGYWN0b3J5Lm5ldykKICAgICAgIGVuZApAQCAtNzIsMTIgKzcyLDEyIEBACiAgIGRlc2NyaWJlICIjc2VydmUiIGRvCiAKICAgICBpdCAnc3RhcnRzIHRoZSBUaGluIHNlcnZlcicgZG8KLSAgICAgIHVuZGVybHlpbmdfdGhpbl9zZXJ2ZXIgPSBtb2NrKCd0aGluIHNlcnZlcicsIDpzdGFydCA9PiB0cnVlKQotICAgICAgVGhpbjo6U2VydmVyLnN0dWIoOm5ldykuYW5kX3JldHVybih1bmRlcmx5aW5nX3RoaW5fc2VydmVyKQorICAgICAgdW5kZXJseWluZ190aGluX3NlcnZlciA9IGRvdWJsZSgndGhpbiBzZXJ2ZXInLCA6c3RhcnQgPT4gdHJ1ZSkKKyAgICAgIGFsbG93KFRoaW46OlNlcnZlcikudG8gcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuKHVuZGVybHlpbmdfdGhpbl9zZXJ2ZXIpCiAKICAgICAgIHRoaW5fdGhyaWZ0X3NlcnZlciA9IFRocmlmdDo6VGhpbkhUVFBTZXJ2ZXIubmV3KHByb2Nlc3NvcikKIAotICAgICAgdW5kZXJseWluZ190aGluX3NlcnZlci5zaG91bGRfcmVjZWl2ZSg6c3RhcnQpCisgICAgICBleHBlY3QodW5kZXJseWluZ190aGluX3NlcnZlcikudG8gcmVjZWl2ZSg6c3RhcnQpCiAgICAgICB0aGluX3RocmlmdF9zZXJ2ZXIuc2VydmUKICAgICBlbmQKICAgZW5kCkBAIC04Nyw4ICs4Nyw4IEBACiBkZXNjcmliZSBUaHJpZnQ6OlRoaW5IVFRQU2VydmVyOjpSYWNrQXBwbGljYXRpb24gZG8KICAgaW5jbHVkZSBSYWNrOjpUZXN0OjpNZXRob2RzCiAKLSAgbGV0KDpwcm9jZXNzb3IpIHsgbW9jaygncHJvY2Vzc29yJykgfQotICBsZXQoOnByb3RvY29sX2ZhY3RvcnkpIHsgbW9jaygncHJvdG9jb2wgZmFjdG9yeScpIH0KKyAgbGV0KDpwcm9jZXNzb3IpIHsgZG91YmxlKCdwcm9jZXNzb3InKSB9CisgIGxldCg6cHJvdG9jb2xfZmFjdG9yeSkgeyBkb3VibGUoJ3Byb3RvY29sIGZhY3RvcnknKSB9CiAKICAgZGVmIGFwcAogICAgIFRocmlmdDo6VGhpbkhUVFBTZXJ2ZXI6OlJhY2tBcHBsaWNhdGlvbi5mb3IoIi8iLCBwcm9jZXNzb3IsIHByb3RvY29sX2ZhY3RvcnkpCkBAIC05OSwxMyArOTksMTMgQEAKICAgICBpdCAncmVjZWl2ZXMgYSBub24tUE9TVCcgZG8KICAgICAgIGhlYWRlcignQ29udGVudC1UeXBlJywgImFwcGxpY2F0aW9uL3gtdGhyaWZ0IikKICAgICAgIGdldCAiLyIKLSAgICAgIGxhc3RfcmVzcG9uc2Uuc3RhdHVzLnNob3VsZCBiZSA0MDQKKyAgICAgIGV4cGVjdChsYXN0X3Jlc3BvbnNlLnN0YXR1cykudG8gYmUgNDA0CiAgICAgZW5kCiAKICAgICBpdCAncmVjZWl2ZXMgYSBoZWFkZXIgb3RoZXIgdGhhbiBhcHBsaWNhdGlvbi94LXRocmlmdCcgZG8KICAgICAgIGhlYWRlcignQ29udGVudC1UeXBlJywgImFwcGxpY2F0aW9uL2pzb24iKQogICAgICAgcG9zdCAiLyIKLSAgICAgIGxhc3RfcmVzcG9uc2Uuc3RhdHVzLnNob3VsZCBiZSA0MDQKKyAgICAgIGV4cGVjdChsYXN0X3Jlc3BvbnNlLnN0YXR1cykudG8gYmUgNDA0CiAgICAgZW5kCiAKICAgZW5kCkBAIC0xMTMsMjYgKzExMywyNiBAQAogICBjb250ZXh0ICIyMDAgcmVzcG9uc2UiIGRvCiAKICAgICBiZWZvcmUgZG8KLSAgICAgIHByb3RvY29sX2ZhY3Rvcnkuc3R1Yig6Z2V0X3Byb3RvY29sKQotICAgICAgcHJvY2Vzc29yLnN0dWIoOnByb2Nlc3MpCisgICAgICBhbGxvdyhwcm90b2NvbF9mYWN0b3J5KS50byByZWNlaXZlKDpnZXRfcHJvdG9jb2wpCisgICAgICBhbGxvdyhwcm9jZXNzb3IpLnRvIHJlY2VpdmUoOnByb2Nlc3MpCiAgICAgZW5kCiAKICAgICBpdCAnY3JlYXRlcyBhbiBJT1N0cmVhbVRyYW5zcG9ydCcgZG8KICAgICAgIGhlYWRlcignQ29udGVudC1UeXBlJywgImFwcGxpY2F0aW9uL3gtdGhyaWZ0IikKLSAgICAgIFRocmlmdDo6SU9TdHJlYW1UcmFuc3BvcnQuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aChhbl9pbnN0YW5jZV9vZihSYWNrOjpMaW50OjpJbnB1dFdyYXBwZXIpLCBhbl9pbnN0YW5jZV9vZihSYWNrOjpSZXNwb25zZSkpCisgICAgICBleHBlY3QoVGhyaWZ0OjpJT1N0cmVhbVRyYW5zcG9ydCkudG8gcmVjZWl2ZSg6bmV3KS53aXRoKGFuX2luc3RhbmNlX29mKFJhY2s6OkxpbnQ6OklucHV0V3JhcHBlciksIGFuX2luc3RhbmNlX29mKFJhY2s6OlJlc3BvbnNlKSkKICAgICAgIHBvc3QgIi8iCiAgICAgZW5kCiAKICAgICBpdCAnZmV0Y2hlcyB0aGUgcmlnaHQgcHJvdG9jb2wgYmFzZWQgb24gdGhlIFRyYW5zcG9ydCcgZG8KICAgICAgIGhlYWRlcignQ29udGVudC1UeXBlJywgImFwcGxpY2F0aW9uL3gtdGhyaWZ0IikKLSAgICAgIHByb3RvY29sX2ZhY3Rvcnkuc2hvdWxkX3JlY2VpdmUoOmdldF9wcm90b2NvbCkud2l0aChhbl9pbnN0YW5jZV9vZihUaHJpZnQ6OklPU3RyZWFtVHJhbnNwb3J0KSkKKyAgICAgIGV4cGVjdChwcm90b2NvbF9mYWN0b3J5KS50byByZWNlaXZlKDpnZXRfcHJvdG9jb2wpLndpdGgoYW5faW5zdGFuY2Vfb2YoVGhyaWZ0OjpJT1N0cmVhbVRyYW5zcG9ydCkpCiAgICAgICBwb3N0ICIvIgogICAgIGVuZAogCiAgICAgaXQgJ3N0YXR1cyBjb2RlIDIwMCcgZG8KICAgICAgIGhlYWRlcignQ29udGVudC1UeXBlJywgImFwcGxpY2F0aW9uL3gtdGhyaWZ0IikKICAgICAgIHBvc3QgIi8iCi0gICAgICBsYXN0X3Jlc3BvbnNlLm9rPy5zaG91bGQgYmVfdHJ1ZQorICAgICAgZXhwZWN0KGxhc3RfcmVzcG9uc2Uub2s/KS50byBiZV90cnV0aHkKICAgICBlbmQKIAogICBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL3R5cGVzX3NwZWMucmIgYi9saWIvcmIvc3BlYy90eXBlc19zcGVjLnJiCmluZGV4IGIyYzNhMjAuLmQ1OTVhYjUgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL3R5cGVzX3NwZWMucmIKKysrIGIvbGliL3JiL3NwZWMvdHlwZXNfc3BlYy5yYgpAQCAtMzEsODUgKzMxLDg4IEBACiAKICAgY29udGV4dCAndHlwZSBjaGVja2luZycgZG8KICAgICBpdCAic2hvdWxkIHJldHVybiB0aGUgcHJvcGVyIG5hbWUgZm9yIGVhY2ggdHlwZSIgZG8KLSAgICAgIFRocmlmdC50eXBlX25hbWUoVGhyaWZ0OjpUeXBlczo6STE2KS5zaG91bGQgPT0gIlR5cGVzOjpJMTYiCi0gICAgICBUaHJpZnQudHlwZV9uYW1lKFRocmlmdDo6VHlwZXM6OlZPSUQpLnNob3VsZCA9PSAiVHlwZXM6OlZPSUQiCi0gICAgICBUaHJpZnQudHlwZV9uYW1lKFRocmlmdDo6VHlwZXM6OkxJU1QpLnNob3VsZCA9PSAiVHlwZXM6OkxJU1QiCi0gICAgICBUaHJpZnQudHlwZV9uYW1lKDQyKS5zaG91bGQgYmVfbmlsCisgICAgICBleHBlY3QoVGhyaWZ0LnR5cGVfbmFtZShUaHJpZnQ6OlR5cGVzOjpJMTYpKS50byBlcSgiVHlwZXM6OkkxNiIpCisgICAgICBleHBlY3QoVGhyaWZ0LnR5cGVfbmFtZShUaHJpZnQ6OlR5cGVzOjpWT0lEKSkudG8gZXEoIlR5cGVzOjpWT0lEIikKKyAgICAgIGV4cGVjdChUaHJpZnQudHlwZV9uYW1lKFRocmlmdDo6VHlwZXM6OkxJU1QpKS50byBlcSgiVHlwZXM6OkxJU1QiKQorICAgICAgZXhwZWN0KFRocmlmdC50eXBlX25hbWUoNDIpKS50byBiZV9uaWwKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgY2hlY2sgdHlwZXMgcHJvcGVybHkiIGRvCiAgICAgICAjIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgVGhyaWZ0OjpUeXBlczo6U1RPUCkgfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZSgzLCAgICAgICAgICAgICAgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNUT1B9LCAgIDpmb28pIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCAgICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpWT0lEfSwgICA6Zm9vKSB9LnNob3VsZF9ub3QgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZSgzLCAgICAgICAgICAgICAgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlZPSUR9LCAgIDpmb28pIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUodHJ1ZSwgICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpCT09MfSwgICA6Zm9vKSB9LnNob3VsZF9ub3QgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZSgzLCAgICAgICAgICAgICAgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkJPT0x9LCAgIDpmb28pIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoNDIsICAgICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpCWVRFfSwgICA6Zm9vKSB9LnNob3VsZF9ub3QgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZSg0MiwgICAgICAgICAgICAgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkkxNn0sICAgIDpmb28pIH0uc2hvdWxkX25vdCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKDQyLCAgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STMyfSwgICAgOmZvbykgfS5zaG91bGRfbm90IHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoNDIsICAgICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpJNjR9LCAgICA6Zm9vKSB9LnNob3VsZF9ub3QgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZSgzLjE0LCAgICAgICAgICAgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkkzMn0sICAgIDpmb28pIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoMy4xNCwgICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpET1VCTEV9LCA6Zm9vKSB9LnNob3VsZF9ub3QgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZSgzLCAgICAgICAgICAgICAgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkRPVUJMRX0sIDpmb28pIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoIjMiLCAgICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTVFJJTkd9LCA6Zm9vKSB9LnNob3VsZF9ub3QgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZSgzLCAgICAgICAgICAgICAgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNUUklOR30sIDpmb28pIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoMywgICAgICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTVE9QfSwgICA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCAgICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpWT0lEfSwgICA6Zm9vKSB9Lm5vdF90byByYWlzZV9lcnJvcgorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoMywgICAgICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpWT0lEfSwgICA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUodHJ1ZSwgICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpCT09MfSwgICA6Zm9vKSB9Lm5vdF90byByYWlzZV9lcnJvcgorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoMywgICAgICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpCT09MfSwgICA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoNDIsICAgICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpCWVRFfSwgICA6Zm9vKSB9Lm5vdF90byByYWlzZV9lcnJvcgorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoNDIsICAgICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpJMTZ9LCAgICA6Zm9vKSB9Lm5vdF90byByYWlzZV9lcnJvcgorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoNDIsICAgICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpJMzJ9LCAgICA6Zm9vKSB9Lm5vdF90byByYWlzZV9lcnJvcgorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoNDIsICAgICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpJNjR9LCAgICA6Zm9vKSB9Lm5vdF90byByYWlzZV9lcnJvcgorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoMy4xNCwgICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpJMzJ9LCAgICA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoMy4xNCwgICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpET1VCTEV9LCA6Zm9vKSB9Lm5vdF90byByYWlzZV9lcnJvcgorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoMywgICAgICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpET1VCTEV9LCA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoIjMiLCAgICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTVFJJTkd9LCA6Zm9vKSB9Lm5vdF90byByYWlzZV9lcnJvcgorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoMywgICAgICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTVFJJTkd9LCA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQogICAgICAgaGVsbG8gPSBTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKGhlbGxvLCAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U1RSVUNULCA6Y2xhc3MgPT4gU3BlY05hbWVzcGFjZTo6SGVsbG99LCA6Zm9vKSB9LnNob3VsZF9ub3QgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZSgiZm9vIiwgICAgICAgICAgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNUUlVDVH0sIDpmb28pIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoezpmb28gPT4gMX0sICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpNQVB9LCAgICA6Zm9vKSB9LnNob3VsZF9ub3QgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShbMV0sICAgICAgICAgICAgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6Ok1BUH0sICAgIDpmb28pIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoWzFdLCAgICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpMSVNUfSwgICA6Zm9vKSB9LnNob3VsZF9ub3QgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZSh7OmZvbyA9PiAxfSwgICAgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkxJU1R9LCAgIDpmb28pIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoU2V0Lm5ldyhbMSwyXSksIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTRVR9LCAgICA6Zm9vKSB9LnNob3VsZF9ub3QgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShbMSwyXSwgICAgICAgICAgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNFVH0sICAgIDpmb28pIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoezpmb28gPT4gdHJ1ZX0sIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTRVR9LCAgICA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKGhlbGxvLCAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U1RSVUNULCA6Y2xhc3MgPT4gU3BlY05hbWVzcGFjZTo6SGVsbG99LCA6Zm9vKSB9Lm5vdF90byByYWlzZV9lcnJvcgorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoImZvbyIsICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTVFJVQ1R9LCA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZmllbGQgPSB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6TUFQLCA6a2V5ID0+IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpJMzJ9LCA6dmFsdWUgPT4gezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNUUklOR319CisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZSh7MSA9PiAib25lIn0sICAgZmllbGQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpmb28pIH0ubm90X3RvIHJhaXNlX2Vycm9yCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShbMV0sICAgICAgICAgICAgZmllbGQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpmb28pIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBmaWVsZCA9IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpMSVNULCA6ZWxlbWVudCA9PiB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STMyfX0KKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKFsxXSwgICAgICAgICAgICBmaWVsZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmZvbykgfS5ub3RfdG8gcmFpc2VfZXJyb3IKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKHs6Zm9vID0+IDF9LCAgICBmaWVsZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGZpZWxkID0gezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNFVCwgOmVsZW1lbnQgPT4gezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkkzMn19CisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShTZXQubmV3KFsxLDJdKSwgZmllbGQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpmb28pIH0ubm90X3RvIHJhaXNlX2Vycm9yCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShbMSwyXSwgICAgICAgICAgZmllbGQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpmb28pIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZSh7OmZvbyA9PiB0cnVlfSwgZmllbGQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpmb28pIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGVycm9yIG91dCBpZiBuaWwgaXMgcGFzc2VkIGFuZCBza2lwX3R5cGVzIGlzIGZhbHNlIiBkbwotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6Qk9PTH0sICAgOmZvbywgZmFsc2UpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6QllURX0sICAgOmZvbywgZmFsc2UpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STE2fSwgICAgOmZvbywgZmFsc2UpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STMyfSwgICAgOmZvbywgZmFsc2UpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STY0fSwgICAgOmZvbywgZmFsc2UpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6RE9VQkxFfSwgOmZvbywgZmFsc2UpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U1RSSU5HfSwgOmZvbywgZmFsc2UpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U1RSVUNUfSwgOmZvbywgZmFsc2UpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6TElTVH0sICAgOmZvbywgZmFsc2UpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U0VUfSwgICAgOmZvbywgZmFsc2UpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6TUFQfSwgICAgOmZvbywgZmFsc2UpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6Qk9PTH0sICAgOmZvbywgZmFsc2UpIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpCWVRFfSwgICA6Zm9vLCBmYWxzZSkgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkkxNn0sICAgIDpmb28sIGZhbHNlKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STMyfSwgICAgOmZvbywgZmFsc2UpIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpJNjR9LCAgICA6Zm9vLCBmYWxzZSkgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkRPVUJMRX0sIDpmb28sIGZhbHNlKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U1RSSU5HfSwgOmZvbywgZmFsc2UpIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTVFJVQ1R9LCA6Zm9vLCBmYWxzZSkgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkxJU1R9LCAgIDpmb28sIGZhbHNlKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U0VUfSwgICAgOmZvbywgZmFsc2UpIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpNQVB9LCAgICA6Zm9vLCBmYWxzZSkgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgY2hlY2sgZWxlbWVudCB0eXBlcyBvbiBjb250YWluZXJzIiBkbwogICAgICAgZmllbGQgPSB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6TElTVCwgOmVsZW1lbnQgPT4gezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkkzMn19Ci0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShbMSwgMl0sIGZpZWxkLCA6Zm9vKSB9LnNob3VsZF9ub3QgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShbMSwgbmlsLCAyXSwgZmllbGQsIDpmb28pIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoWzEsIDJdLCBmaWVsZCwgOmZvbykgfS5ub3RfdG8gcmFpc2VfZXJyb3IKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKFsxLCBuaWwsIDJdLCBmaWVsZCwgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKICAgICAgIGZpZWxkID0gezp0eXBlID0+IFRocmlmdDo6VHlwZXM6Ok1BUCwgOmtleSA9PiB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STMyfSwgOnZhbHVlID0+IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTVFJJTkd9fQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoezEgPT4gIm9uZSIsIDIgPT4gInR3byJ9LCBmaWVsZCwgOmZvbykgfS5zaG91bGRfbm90IHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoezEgPT4gIm9uZSIsIG5pbCA9PiAibmlsIn0sIGZpZWxkLCA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKHsxID0+IG5pbCwgMiA9PiAidHdvIn0sIGZpZWxkLCA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKHsxID0+ICJvbmUiLCAyID0+ICJ0d28ifSwgZmllbGQsIDpmb28pIH0ubm90X3RvIHJhaXNlX2Vycm9yCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZSh7MSA9PiAib25lIiwgbmlsID0+ICJuaWwifSwgZmllbGQsIDpmb28pIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZSh7MSA9PiBuaWwsIDIgPT4gInR3byJ9LCBmaWVsZCwgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKICAgICAgIGZpZWxkID0gezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNFVCwgOmVsZW1lbnQgPT4gezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkkzMn19Ci0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShTZXQubmV3KFsxLCAyXSksIGZpZWxkLCA6Zm9vKSB9LnNob3VsZF9ub3QgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShTZXQubmV3KFsxLCBuaWwsIDJdKSwgZmllbGQsIDpmb28pIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoU2V0Lm5ldyhbMSwgMi4zLCAyXSksIGZpZWxkLCA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKFNldC5uZXcoWzEsIDJdKSwgZmllbGQsIDpmb28pIH0ubm90X3RvIHJhaXNlX2Vycm9yCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShTZXQubmV3KFsxLCBuaWwsIDJdKSwgZmllbGQsIDpmb28pIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShTZXQubmV3KFsxLCAyLjMsIDJdKSwgZmllbGQsIDpmb28pIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCiAKICAgICAgIGZpZWxkID0gezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNUUlVDVCwgOmNsYXNzID0+IFNwZWNOYW1lc3BhY2U6OkhlbGxvfQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoU3BlY05hbWVzcGFjZTo6Qm9vbFN0cnVjdCwgZmllbGQsIDpmb28pIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoU3BlY05hbWVzcGFjZTo6Qm9vbFN0cnVjdCwgZmllbGQsIDpmb28pIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGdpdmUgdGhlIFRocmlmdDo6VHlwZUVycm9yIGEgcmVhZGFibGUgbWVzc2FnZSIgZG8KLSAgICAgIG1zZyA9ICJFeHBlY3RlZCBUeXBlczo6U1RSSU5HLCByZWNlaXZlZCBGaXhudW0gZm9yIGZpZWxkIGZvbyIKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKDMsIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTVFJJTkd9LCA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvciwgbXNnKQotICAgICAgbXNnID0gIkV4cGVjdGVkIFR5cGVzOjpTVFJJTkcsIHJlY2VpdmVkIEZpeG51bSBmb3IgZmllbGQgZm9vLmVsZW1lbnQiCisgICAgICBtc2cgPSAvRXhwZWN0ZWQgVHlwZXM6OlNUUklORywgcmVjZWl2ZWQgKEludGVnZXJ8Rml4bnVtKSBmb3IgZmllbGQgZm9vLworICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoMywgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNUUklOR30sIDpmb28pIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IsIG1zZykKKyAgICAgIG1zZyA9IC9FeHBlY3RlZCBUeXBlczo6U1RSSU5HLCByZWNlaXZlZCAoSW50ZWdlcnxGaXhudW0pIGZvciBmaWVsZCBmb28uZWxlbWVudC8KICAgICAgIGZpZWxkID0gezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkxJU1QsIDplbGVtZW50ID0+IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTVFJJTkd9fQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoWzNdLCBmaWVsZCwgOmZvbykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IsIG1zZykKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKFszXSwgZmllbGQsIDpmb28pIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IsIG1zZykKICAgICAgIG1zZyA9ICJFeHBlY3RlZCBUeXBlczo6STMyLCByZWNlaXZlZCBOaWxDbGFzcyBmb3IgZmllbGQgZm9vLmVsZW1lbnQua2V5IgogICAgICAgZmllbGQgPSB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6TElTVCwKICAgICAgICAgICAgICAgIDplbGVtZW50ID0+IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpNQVAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmtleSA9PiB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STMyfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6dmFsdWUgPT4gezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkkzMn19fQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoW3tuaWwgPT4gM31dLCBmaWVsZCwgOmZvbykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IsIG1zZykKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKFt7bmlsID0+IDN9XSwgZmllbGQsIDpmb28pIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IsIG1zZykKICAgICAgIG1zZyA9ICJFeHBlY3RlZCBUeXBlczo6STMyLCByZWNlaXZlZCBOaWxDbGFzcyBmb3IgZmllbGQgZm9vLmVsZW1lbnQudmFsdWUiCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShbezEgPT4gbmlsfV0sIGZpZWxkLCA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvciwgbXNnKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoW3sxID0+IG5pbH1dLCBmaWVsZCwgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvciwgbXNnKQogICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvdW5pb25fc3BlYy5yYiBiL2xpYi9yYi9zcGVjL3VuaW9uX3NwZWMucmIKaW5kZXggYTQyNzA5MC4uMGNlNjMwNiAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvdW5pb25fc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy91bmlvbl9zcGVjLnJiCkBAIC0yNCw3OCArMjQsODUgQEAKICAgZGVzY3JpYmUgVGhyaWZ0OjpVbmlvbiBkbwogICAgIGl0ICJzaG91bGQgcmV0dXJuIG5pbCB2YWx1ZSBpbiB1bnNldCB1bmlvbiIgZG8KICAgICAgIHVuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3Ci0gICAgICB1bmlvbi5nZXRfc2V0X2ZpZWxkLnNob3VsZCA9PSBuaWwKLSAgICAgIHVuaW9uLmdldF92YWx1ZS5zaG91bGQgPT0gbmlsCisgICAgICBleHBlY3QodW5pb24uZ2V0X3NldF9maWVsZCkudG8gZXEobmlsKQorICAgICAgZXhwZWN0KHVuaW9uLmdldF92YWx1ZSkudG8gZXEobmlsKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBzZXQgYSBmaWVsZCBhbmQgYmUgYWNjZXNzaWJsZSB0aHJvdWdoIGdldF92YWx1ZSBhbmQgdGhlIG5hbWVkIGZpZWxkIGFjY2Vzc29yIiBkbwogICAgICAgdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcKICAgICAgIHVuaW9uLmludGVnZXIzMiA9IDI1Ci0gICAgICB1bmlvbi5nZXRfc2V0X2ZpZWxkLnNob3VsZCA9PSA6aW50ZWdlcjMyCi0gICAgICB1bmlvbi5nZXRfdmFsdWUuc2hvdWxkID09IDI1Ci0gICAgICB1bmlvbi5pbnRlZ2VyMzIuc2hvdWxkID09IDI1CisgICAgICBleHBlY3QodW5pb24uZ2V0X3NldF9maWVsZCkudG8gZXEoOmludGVnZXIzMikKKyAgICAgIGV4cGVjdCh1bmlvbi5nZXRfdmFsdWUpLnRvIGVxKDI1KQorICAgICAgZXhwZWN0KHVuaW9uLmludGVnZXIzMikudG8gZXEoMjUpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdvcmsgY29ycmVjdGx5IHdoZW4gaW5zdGFudGlhdGVkIHdpdGggc3RhdGljIGZpZWxkIGNvbnN0cnVjdG9ycyIgZG8KICAgICAgIHVuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24uaW50ZWdlcjMyKDUpCi0gICAgICB1bmlvbi5nZXRfc2V0X2ZpZWxkLnNob3VsZCA9PSA6aW50ZWdlcjMyCi0gICAgICB1bmlvbi5pbnRlZ2VyMzIuc2hvdWxkID09IDUKKyAgICAgIGV4cGVjdCh1bmlvbi5nZXRfc2V0X2ZpZWxkKS50byBlcSg6aW50ZWdlcjMyKQorICAgICAgZXhwZWN0KHVuaW9uLmludGVnZXIzMikudG8gZXEoNSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmFpc2UgZm9yIHdyb25nIHNldCBmaWVsZCIgZG8KICAgICAgIHVuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3CiAgICAgICB1bmlvbi5pbnRlZ2VyMzIgPSAyNQotICAgICAgbGFtYmRhIHsgdW5pb24uc29tZV9jaGFyYWN0ZXJzIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFJ1bnRpbWVFcnJvciwgInNvbWVfY2hhcmFjdGVycyBpcyBub3QgdW5pb24ncyBzZXQgZmllbGQuIikKKyAgICAgIGV4cGVjdCB7IHVuaW9uLnNvbWVfY2hhcmFjdGVycyB9LnRvIHJhaXNlX2Vycm9yKFJ1bnRpbWVFcnJvciwgInNvbWVfY2hhcmFjdGVycyBpcyBub3QgdW5pb24ncyBzZXQgZmllbGQuIikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcmFpc2UgZm9yIHdyb25nIHNldCBmaWVsZCB3aGVuIGhhc2ggaW5pdGlhbGl6ZWQgYW5kIHR5cGUgY2hlY2tpbmcgaXMgb2ZmIiBkbworICAgICAgVGhyaWZ0LnR5cGVfY2hlY2tpbmcgPSBmYWxzZQorICAgICAgdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoe2luY29ycmVjdF9maWVsZDogOmluY29ycmVjdH0pCisgICAgICBleGFtcGxlID0gbGFtYmRhIHsgVGhyaWZ0OjpTZXJpYWxpemVyLm5ldy5zZXJpYWxpemUodW5pb24pIH0KKyAgICAgIGV4cGVjdChleGFtcGxlKS50byByYWlzZV9lcnJvcihSdW50aW1lRXJyb3IsICJzZXRfZmllbGQgaXMgbm90IHZhbGlkIGZvciB0aGlzIHVuaW9uISIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIG5vdCBiZSBlcXVhbCB0byBuaWwiIGRvCiAgICAgICB1bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldwotICAgICAgdW5pb24uc2hvdWxkX25vdCA9PSBuaWwKKyAgICAgIGV4cGVjdCh1bmlvbikubm90X3RvIGVxKG5pbCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgbm90IGJlIGVxdWFsIHdpdGggYW4gZW1wdHkgU3RyaW5nIiBkbwogICAgICAgdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcKLSAgICAgIHVuaW9uLnNob3VsZF9ub3QgPT0gJycKKyAgICAgIGV4cGVjdCh1bmlvbikubm90X3RvIGVxKCcnKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBub3QgZXF1YXRlIHR3byBkaWZmZXJlbnQgdW5pb25zLCBpMzIgdnMuIHN0cmluZyIgZG8KICAgICAgIHVuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDppbnRlZ2VyMzIsIDI1KQogICAgICAgb3RoZXJfdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOnNvbWVfY2hhcmFjdGVycywgImJsYWghIikKLSAgICAgIHVuaW9uLnNob3VsZF9ub3QgPT0gb3RoZXJfdW5pb24KKyAgICAgIGV4cGVjdCh1bmlvbikubm90X3RvIGVxKG90aGVyX3VuaW9uKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBwcm9wZXJseSByZXNldCBzZXRmaWVsZCBhbmQgc2V0dmFsdWUiIGRvCiAgICAgICB1bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6aW50ZWdlcjMyLCAyNSkKLSAgICAgIHVuaW9uLmdldF9zZXRfZmllbGQuc2hvdWxkID09IDppbnRlZ2VyMzIKKyAgICAgIGV4cGVjdCh1bmlvbi5nZXRfc2V0X2ZpZWxkKS50byBlcSg6aW50ZWdlcjMyKQogICAgICAgdW5pb24uc29tZV9jaGFyYWN0ZXJzID0gImJsYWghIgotICAgICAgdW5pb24uZ2V0X3NldF9maWVsZC5zaG91bGQgPT0gOnNvbWVfY2hhcmFjdGVycwotICAgICAgdW5pb24uZ2V0X3ZhbHVlLnNob3VsZCA9PSAiYmxhaCEiCi0gICAgICBsYW1iZGEgeyB1bmlvbi5pbnRlZ2VyMzIgfS5zaG91bGQgcmFpc2VfZXJyb3IoUnVudGltZUVycm9yLCAiaW50ZWdlcjMyIGlzIG5vdCB1bmlvbidzIHNldCBmaWVsZC4iKQorICAgICAgZXhwZWN0KHVuaW9uLmdldF9zZXRfZmllbGQpLnRvIGVxKDpzb21lX2NoYXJhY3RlcnMpCisgICAgICBleHBlY3QodW5pb24uZ2V0X3ZhbHVlKS50byBlcSgiYmxhaCEiKQorICAgICAgZXhwZWN0IHsgdW5pb24uaW50ZWdlcjMyIH0udG8gcmFpc2VfZXJyb3IoUnVudGltZUVycm9yLCAiaW50ZWdlcjMyIGlzIG5vdCB1bmlvbidzIHNldCBmaWVsZC4iKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBub3QgZXF1YXRlIHR3byBkaWZmZXJlbnQgdW5pb25zIHdpdGggZGlmZmVyZW50IHZhbHVlcyIgZG8KICAgICAgIHVuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDppbnRlZ2VyMzIsIDI1KQogICAgICAgb3RoZXJfdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOmludGVnZXIzMiwgNDAwKQotICAgICAgdW5pb24uc2hvdWxkX25vdCA9PSBvdGhlcl91bmlvbgorICAgICAgZXhwZWN0KHVuaW9uKS5ub3RfdG8gZXEob3RoZXJfdW5pb24pCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIG5vdCBlcXVhdGUgdHdvIGRpZmZlcmVudCB1bmlvbnMgd2l0aCBkaWZmZXJlbnQgZmllbGRzIiBkbwogICAgICAgdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOmludGVnZXIzMiwgMjUpCiAgICAgICBvdGhlcl91bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6b3RoZXJfaTMyLCAyNSkKLSAgICAgIHVuaW9uLnNob3VsZF9ub3QgPT0gb3RoZXJfdW5pb24KKyAgICAgIGV4cGVjdCh1bmlvbikubm90X3RvIGVxKG90aGVyX3VuaW9uKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBpbnNwZWN0IHByb3Blcmx5IiBkbwogICAgICAgdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOmludGVnZXIzMiwgMjUpCi0gICAgICB1bmlvbi5pbnNwZWN0LnNob3VsZCA9PSAiPFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uIGludGVnZXIzMjogMjU+IgorICAgICAgZXhwZWN0KHVuaW9uLmluc3BlY3QpLnRvIGVxKCI8U3BlY05hbWVzcGFjZTo6TXlfdW5pb24gaW50ZWdlcjMyOiAyNT4iKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBub3QgYWxsb3cgc2V0dGluZyB3aXRoIGluc3RhbmNlX3ZhcmlhYmxlX3NldCIgZG8KICAgICAgIHVuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDppbnRlZ2VyMzIsIDI3KQogICAgICAgdW5pb24uaW5zdGFuY2VfdmFyaWFibGVfc2V0KDpAc29tZV9jaGFyYWN0ZXJzLCAiaGFsbG8hIikKLSAgICAgIHVuaW9uLmdldF9zZXRfZmllbGQuc2hvdWxkID09IDppbnRlZ2VyMzIKLSAgICAgIHVuaW9uLmdldF92YWx1ZS5zaG91bGQgPT0gMjcKLSAgICAgIGxhbWJkYSB7IHVuaW9uLnNvbWVfY2hhcmFjdGVycyB9LnNob3VsZCByYWlzZV9lcnJvcihSdW50aW1lRXJyb3IsICJzb21lX2NoYXJhY3RlcnMgaXMgbm90IHVuaW9uJ3Mgc2V0IGZpZWxkLiIpCisgICAgICBleHBlY3QodW5pb24uZ2V0X3NldF9maWVsZCkudG8gZXEoOmludGVnZXIzMikKKyAgICAgIGV4cGVjdCh1bmlvbi5nZXRfdmFsdWUpLnRvIGVxKDI3KQorICAgICAgZXhwZWN0IHsgdW5pb24uc29tZV9jaGFyYWN0ZXJzIH0udG8gcmFpc2VfZXJyb3IoUnVudGltZUVycm9yLCAic29tZV9jaGFyYWN0ZXJzIGlzIG5vdCB1bmlvbidzIHNldCBmaWVsZC4iKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBzZXJpYWxpemUgdG8gYmluYXJ5IGNvcnJlY3RseSIgZG8KQEAgLTEwNyw3ICsxMTQsNyBAQAogCiAgICAgICBvdGhlcl91bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6aW50ZWdlcjMyLCAyNSkKICAgICAgIG90aGVyX3VuaW9uLnJlYWQocHJvdG8pCi0gICAgICBvdGhlcl91bmlvbi5zaG91bGQgPT0gdW5pb24KKyAgICAgIGV4cGVjdChvdGhlcl91bmlvbikudG8gZXEodW5pb24pCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHNlcmlhbGl6ZSB0byBqc29uIGNvcnJlY3RseSIgZG8KQEAgLTExOSwyNCArMTI2LDI0IEBACiAKICAgICAgIG90aGVyX3VuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDppbnRlZ2VyMzIsIDI1KQogICAgICAgb3RoZXJfdW5pb24ucmVhZChwcm90bykKLSAgICAgIG90aGVyX3VuaW9uLnNob3VsZCA9PSB1bmlvbgorICAgICAgZXhwZWN0KG90aGVyX3VuaW9uKS50byBlcSh1bmlvbikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmFpc2Ugd2hlbiB2YWxpZGF0aW5nIHVuc2V0IHVuaW9uIiBkbwogICAgICAgdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcKLSAgICAgIGxhbWJkYSB7IHVuaW9uLnZhbGlkYXRlIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFN0YW5kYXJkRXJyb3IsICJVbmlvbiBmaWVsZHMgYXJlIG5vdCBzZXQuIikKKyAgICAgIGV4cGVjdCB7IHVuaW9uLnZhbGlkYXRlIH0udG8gcmFpc2VfZXJyb3IoU3RhbmRhcmRFcnJvciwgIlVuaW9uIGZpZWxkcyBhcmUgbm90IHNldC4iKQogCiAgICAgICBvdGhlcl91bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6aW50ZWdlcjMyLCAxKQotICAgICAgbGFtYmRhIHsgb3RoZXJfdW5pb24udmFsaWRhdGUgfS5zaG91bGRfbm90IHJhaXNlX2Vycm9yKFN0YW5kYXJkRXJyb3IsICJVbmlvbiBmaWVsZHMgYXJlIG5vdCBzZXQuIikKKyAgICAgIGV4cGVjdCB7IG90aGVyX3VuaW9uLnZhbGlkYXRlIH0ubm90X3RvIHJhaXNlX2Vycm9yCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHZhbGlkYXRlIGFuIGVudW0gZmllbGQgcHJvcGVybHkiIGRvCiAgICAgICB1bmlvbiA9IFNwZWNOYW1lc3BhY2U6OlRlc3RVbmlvbi5uZXcoOmVudW1fZmllbGQsIDMpCi0gICAgICB1bmlvbi5nZXRfc2V0X2ZpZWxkLnNob3VsZCA9PSA6ZW51bV9maWVsZAotICAgICAgbGFtYmRhIHsgdW5pb24udmFsaWRhdGUgfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbiwgIkludmFsaWQgdmFsdWUgb2YgZmllbGQgZW51bV9maWVsZCEiKQorICAgICAgZXhwZWN0KHVuaW9uLmdldF9zZXRfZmllbGQpLnRvIGVxKDplbnVtX2ZpZWxkKQorICAgICAgZXhwZWN0IHsgdW5pb24udmFsaWRhdGUgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uLCAiSW52YWxpZCB2YWx1ZSBvZiBmaWVsZCBlbnVtX2ZpZWxkISIpCiAKICAgICAgIG90aGVyX3VuaW9uID0gU3BlY05hbWVzcGFjZTo6VGVzdFVuaW9uLm5ldyg6ZW51bV9maWVsZCwgMSkKLSAgICAgIGxhbWJkYSB7IG90aGVyX3VuaW9uLnZhbGlkYXRlIH0uc2hvdWxkX25vdCByYWlzZV9lcnJvcihUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uLCAiSW52YWxpZCB2YWx1ZSBvZiBmaWVsZCBlbnVtX2ZpZWxkISIpCisgICAgICBleHBlY3QgeyBvdGhlcl91bmlvbi52YWxpZGF0ZSB9Lm5vdF90byByYWlzZV9lcnJvcgogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBwcm9wZXJseSBzZXJpYWxpemUgYW5kIG1hdGNoIHN0cnVjdHMgd2l0aCBhIHVuaW9uIiBkbwpAQCAtMTUxLDM3ICsxNTgsMzcgQEAKICAgICAgIG90aGVyX3VuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDpzb21lX2NoYXJhY3RlcnMsICJoZWxsbyB0aGVyZSIpCiAgICAgICBzd3UyID0gU3BlY05hbWVzcGFjZTo6U3RydWN0X3dpdGhfdW5pb24ubmV3KDpmdW5fdW5pb24gPT4gb3RoZXJfdW5pb24pCiAKLSAgICAgIHN3dTIuc2hvdWxkX25vdCA9PSBzd3UKKyAgICAgIGV4cGVjdChzd3UyKS5ub3RfdG8gZXEoc3d1KQogCiAgICAgICBzd3UyLnJlYWQocHJvdG8pCi0gICAgICBzd3UyLnNob3VsZCA9PSBzd3UKKyAgICAgIGV4cGVjdChzd3UyKS50byBlcShzd3UpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHN1cHBvcnQgb2xkIHN0eWxlIGNvbnN0cnVjdG9yIiBkbwogICAgICAgdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOmludGVnZXIzMiA9PiAyNikKLSAgICAgIHVuaW9uLmdldF9zZXRfZmllbGQuc2hvdWxkID09IDppbnRlZ2VyMzIKLSAgICAgIHVuaW9uLmdldF92YWx1ZS5zaG91bGQgPT0gMjYKKyAgICAgIGV4cGVjdCh1bmlvbi5nZXRfc2V0X2ZpZWxkKS50byBlcSg6aW50ZWdlcjMyKQorICAgICAgZXhwZWN0KHVuaW9uLmdldF92YWx1ZSkudG8gZXEoMjYpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIG5vdCB0aHJvdyBhbiBlcnJvciB3aGVuIGluc3BlY3RlZCBhbmQgdW5zZXQiIGRvCi0gICAgICBsYW1iZGF7U3BlY05hbWVzcGFjZTo6VGVzdFVuaW9uLm5ldygpLmluc3BlY3R9LnNob3VsZF9ub3QgcmFpc2VfZXJyb3IKKyAgICAgIGV4cGVjdHtTcGVjTmFtZXNwYWNlOjpUZXN0VW5pb24ubmV3KCkuaW5zcGVjdH0ubm90X3RvIHJhaXNlX2Vycm9yCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHByaW50IGVudW0gdmFsdWUgbmFtZSB3aGVuIGluc3BlY3RlZCIgZG8KLSAgICAgIFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6c29tZV9lbnVtID0+IFNwZWNOYW1lc3BhY2U6OlNvbWVFbnVtOjpPTkUpLmluc3BlY3Quc2hvdWxkID09ICI8U3BlY05hbWVzcGFjZTo6TXlfdW5pb24gc29tZV9lbnVtOiBPTkUgKDApPiIKKyAgICAgIGV4cGVjdChTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOnNvbWVfZW51bSA9PiBTcGVjTmFtZXNwYWNlOjpTb21lRW51bTo6T05FKS5pbnNwZWN0KS50byBlcSgiPFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uIHNvbWVfZW51bTogT05FICgwKT4iKQogCi0gICAgICBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOm15X21hcCA9PiB7U3BlY05hbWVzcGFjZTo6U29tZUVudW06Ok9ORSA9PiBbU3BlY05hbWVzcGFjZTo6U29tZUVudW06OlRXT119KS5pbnNwZWN0LnNob3VsZCA9PSAiPFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uIG15X21hcDoge09ORSAoMCk6IFtUV08gKDEpXX0+IgorICAgICAgZXhwZWN0KFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6bXlfbWFwID0+IHtTcGVjTmFtZXNwYWNlOjpTb21lRW51bTo6T05FID0+IFtTcGVjTmFtZXNwYWNlOjpTb21lRW51bTo6VFdPXX0pLmluc3BlY3QpLnRvIGVxKCI8U3BlY05hbWVzcGFjZTo6TXlfdW5pb24gbXlfbWFwOiB7T05FICgwKTogW1RXTyAoMSldfT4iKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBvZmZlciBmaWVsZD8gbWV0aG9kcyIgZG8KLSAgICAgIFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldy5zb21lX2VudW0/LnNob3VsZCBiZV9mYWxzZQotICAgICAgU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDpzb21lX2VudW0gPT4gU3BlY05hbWVzcGFjZTo6U29tZUVudW06Ok9ORSkuc29tZV9lbnVtPy5zaG91bGQgYmVfdHJ1ZQotICAgICAgU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDppbV90cnVlID0+IGZhbHNlKS5pbV90cnVlPy5zaG91bGQgYmVfdHJ1ZQotICAgICAgU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDppbV90cnVlID0+IHRydWUpLmltX3RydWU/LnNob3VsZCBiZV90cnVlCisgICAgICBleHBlY3QoU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3LnNvbWVfZW51bT8pLnRvIGJlX2ZhbHNleQorICAgICAgZXhwZWN0KFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6c29tZV9lbnVtID0+IFNwZWNOYW1lc3BhY2U6OlNvbWVFbnVtOjpPTkUpLnNvbWVfZW51bT8pLnRvIGJlX3RydXRoeQorICAgICAgZXhwZWN0KFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6aW1fdHJ1ZSA9PiBmYWxzZSkuaW1fdHJ1ZT8pLnRvIGJlX3RydXRoeQorICAgICAgZXhwZWN0KFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6aW1fdHJ1ZSA9PiB0cnVlKS5pbV90cnVlPykudG8gYmVfdHJ1dGh5CiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHByZXR0eSBwcmludCBiaW5hcnkgZmllbGRzIiBkbwotICAgICAgU3BlY05hbWVzcGFjZTo6VGVzdFVuaW9uLm5ldyg6YmluYXJ5X2ZpZWxkID0+ICJcMDAxXDAwMlwwMDMiKS5pbnNwZWN0LnNob3VsZCA9PSAiPFNwZWNOYW1lc3BhY2U6OlRlc3RVbmlvbiBiaW5hcnlfZmllbGQ6IDAxMDIwMz4iCisgICAgICBleHBlY3QoU3BlY05hbWVzcGFjZTo6VGVzdFVuaW9uLm5ldyg6YmluYXJ5X2ZpZWxkID0+ICJcMDAxXDAwMlwwMDMiKS5pbnNwZWN0KS50byBlcSgiPFNwZWNOYW1lc3BhY2U6OlRlc3RVbmlvbiBiaW5hcnlfZmllbGQ6IDAxMDIwMz4iKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBiZSBjb21wYXJhYmxlIiBkbwpAQCAtMjAwLDcgKzIwNyw3IEBACiAgICAgICBmb3IgeSBpbiAwLi4zCiAgICAgICAgIGZvciB4IGluIDAuLjMKICAgICAgICAgICAjIHB1dHMgIiN7b2Jqc1t5XS5pbnNwZWN0fSA8PT4gI3tvYmpzW3hdLmluc3BlY3R9IHNob3VsZCA9PSAje3JlbGF0aW9uc2hpcHNbeV1beF19IgotICAgICAgICAgIChvYmpzW3ldIDw9PiBvYmpzW3hdKS5zaG91bGQgPT0gcmVsYXRpb25zaGlwc1t5XVt4XQorICAgICAgICAgIGV4cGVjdChvYmpzW3ldIDw9PiBvYmpzW3hdKS50byBlcShyZWxhdGlvbnNoaXBzW3ldW3hdKQogICAgICAgICBlbmQKICAgICAgIGVuZAogICAgIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvdW5peF9zb2NrZXRfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL3VuaXhfc29ja2V0X3NwZWMucmIKaW5kZXggY2I2Y2ZmMy4uODYyM2U5NSAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvdW5peF9zb2NrZXRfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy91bml4X3NvY2tldF9zcGVjLnJiCkBAIC0yNiwyMSArMjYsMjYgQEAKICAgICBiZWZvcmUoOmVhY2gpIGRvCiAgICAgICBAcGF0aCA9ICcvdG1wL3RocmlmdF9zcGVjX3NvY2tldCcKICAgICAgIEBzb2NrZXQgPSBUaHJpZnQ6OlVOSVhTb2NrZXQubmV3KEBwYXRoKQotICAgICAgQGhhbmRsZSA9IG1vY2soIkhhbmRsZSIsIDpjbG9zZWQ/ID0+IGZhbHNlKQotICAgICAgQGhhbmRsZS5zdHViISg6Y2xvc2UpCi0gICAgICA6OlVOSVhTb2NrZXQuc3R1YiEoOm5ldykuYW5kX3JldHVybihAaGFuZGxlKQorICAgICAgQGhhbmRsZSA9IGRvdWJsZSgiSGFuZGxlIiwgOmNsb3NlZD8gPT4gZmFsc2UpCisgICAgICBhbGxvdyhAaGFuZGxlKS50byByZWNlaXZlKDpjbG9zZSkKKyAgICAgIGFsbG93KDo6VU5JWFNvY2tldCkudG8gcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuKEBoYW5kbGUpCiAgICAgZW5kCiAKICAgICBpdF9zaG91bGRfYmVoYXZlX2xpa2UgImEgc29ja2V0IgogCiAgICAgaXQgInNob3VsZCByYWlzZSBhIFRyYW5zcG9ydEV4Y2VwdGlvbiB3aGVuIGl0IGNhbm5vdCBvcGVuIGEgc29ja2V0IiBkbwotICAgICAgOjpVTklYU29ja2V0LnNob3VsZF9yZWNlaXZlKDpuZXcpLmFuZF9yYWlzZShTdGFuZGFyZEVycm9yKQotICAgICAgbGFtYmRhIHsgQHNvY2tldC5vcGVuIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uKSB7IHxlfCBlLnR5cGUuc2hvdWxkID09IFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiB9CisgICAgICBleHBlY3QoOjpVTklYU29ja2V0KS50byByZWNlaXZlKDpuZXcpLmFuZF9yYWlzZShTdGFuZGFyZEVycm9yKQorICAgICAgZXhwZWN0IHsgQHNvY2tldC5vcGVuIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb24pIHsgfGV8IGV4cGVjdChlLnR5cGUpLnRvIGVxKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTikgfQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBhY2NlcHQgYW4gb3B0aW9uYWwgdGltZW91dCIgZG8KLSAgICAgIDo6VU5JWFNvY2tldC5zdHViISg6bmV3KQotICAgICAgVGhyaWZ0OjpVTklYU29ja2V0Lm5ldyhAcGF0aCwgNSkudGltZW91dC5zaG91bGQgPT0gNQorICAgICAgYWxsb3coOjpVTklYU29ja2V0KS50byByZWNlaXZlKDpuZXcpCisgICAgICBleHBlY3QoVGhyaWZ0OjpVTklYU29ja2V0Lm5ldyhAcGF0aCwgNSkudGltZW91dCkudG8gZXEoNSkKKyAgICBlbmQKKyAgICAKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBhbGxvdyg6OlVOSVhTb2NrZXQpLnRvIHJlY2VpdmUoOm5ldykKKyAgICAgIGV4cGVjdChUaHJpZnQ6OlVOSVhTb2NrZXQubmV3KEBwYXRoKS50b19zKS50byBlcSgiZG9tYWluKCN7QHBhdGh9KSIpCiAgICAgZW5kCiAgIGVuZAogCkBAIC01MSw1NyArNTYsNjEgQEAKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgY3JlYXRlIGEgaGFuZGxlIHdoZW4gY2FsbGluZyBsaXN0ZW4iIGRvCi0gICAgICBVTklYU2VydmVyLnNob3VsZF9yZWNlaXZlKDpuZXcpLndpdGgoQHBhdGgpCisgICAgICBleHBlY3QoVU5JWFNlcnZlcikudG8gcmVjZWl2ZSg6bmV3KS53aXRoKEBwYXRoKQogICAgICAgQHNvY2tldC5saXN0ZW4KICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgY3JlYXRlIGEgVGhyaWZ0OjpVTklYU29ja2V0IHRvIHdyYXAgYWNjZXB0ZWQgc29ja2V0cyIgZG8KLSAgICAgIGhhbmRsZSA9IG1vY2soIlVOSVhTZXJ2ZXIiKQotICAgICAgVU5JWFNlcnZlci5zaG91bGRfcmVjZWl2ZSg6bmV3KS53aXRoKEBwYXRoKS5hbmRfcmV0dXJuKGhhbmRsZSkKKyAgICAgIGhhbmRsZSA9IGRvdWJsZSgiVU5JWFNlcnZlciIpCisgICAgICBleHBlY3QoVU5JWFNlcnZlcikudG8gcmVjZWl2ZSg6bmV3KS53aXRoKEBwYXRoKS5hbmRfcmV0dXJuKGhhbmRsZSkKICAgICAgIEBzb2NrZXQubGlzdGVuCi0gICAgICBzb2NrID0gbW9jaygic29jayIpCi0gICAgICBoYW5kbGUuc2hvdWxkX3JlY2VpdmUoOmFjY2VwdCkuYW5kX3JldHVybihzb2NrKQotICAgICAgdHJhbnMgPSBtb2NrKCJVTklYU29ja2V0IikKLSAgICAgIFRocmlmdDo6VU5JWFNvY2tldC5zaG91bGRfcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuKHRyYW5zKQotICAgICAgdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmhhbmRsZT0pLndpdGgoc29jaykKLSAgICAgIEBzb2NrZXQuYWNjZXB0LnNob3VsZCA9PSB0cmFucworICAgICAgc29jayA9IGRvdWJsZSgic29jayIpCisgICAgICBleHBlY3QoaGFuZGxlKS50byByZWNlaXZlKDphY2NlcHQpLmFuZF9yZXR1cm4oc29jaykKKyAgICAgIHRyYW5zID0gZG91YmxlKCJVTklYU29ja2V0IikKKyAgICAgIGV4cGVjdChUaHJpZnQ6OlVOSVhTb2NrZXQpLnRvIHJlY2VpdmUoOm5ldykuYW5kX3JldHVybih0cmFucykKKyAgICAgIGV4cGVjdCh0cmFucykudG8gcmVjZWl2ZSg6aGFuZGxlPSkud2l0aChzb2NrKQorICAgICAgZXhwZWN0KEBzb2NrZXQuYWNjZXB0KS50byBlcSh0cmFucykKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgY2xvc2UgdGhlIGhhbmRsZSB3aGVuIGNsb3NlZCIgZG8KLSAgICAgIGhhbmRsZSA9IG1vY2soIlVOSVhTZXJ2ZXIiLCA6Y2xvc2VkPyA9PiBmYWxzZSkKLSAgICAgIFVOSVhTZXJ2ZXIuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aChAcGF0aCkuYW5kX3JldHVybihoYW5kbGUpCisgICAgICBoYW5kbGUgPSBkb3VibGUoIlVOSVhTZXJ2ZXIiLCA6Y2xvc2VkPyA9PiBmYWxzZSkKKyAgICAgIGV4cGVjdChVTklYU2VydmVyKS50byByZWNlaXZlKDpuZXcpLndpdGgoQHBhdGgpLmFuZF9yZXR1cm4oaGFuZGxlKQogICAgICAgQHNvY2tldC5saXN0ZW4KLSAgICAgIGhhbmRsZS5zaG91bGRfcmVjZWl2ZSg6Y2xvc2UpCi0gICAgICBGaWxlLnN0dWIhKDpkZWxldGUpCisgICAgICBleHBlY3QoaGFuZGxlKS50byByZWNlaXZlKDpjbG9zZSkKKyAgICAgIGFsbG93KEZpbGUpLnRvIHJlY2VpdmUoOmRlbGV0ZSkKICAgICAgIEBzb2NrZXQuY2xvc2UKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgZGVsZXRlIHRoZSBzb2NrZXQgd2hlbiBjbG9zZWQiIGRvCi0gICAgICBoYW5kbGUgPSBtb2NrKCJVTklYU2VydmVyIiwgOmNsb3NlZD8gPT4gZmFsc2UpCi0gICAgICBVTklYU2VydmVyLnNob3VsZF9yZWNlaXZlKDpuZXcpLndpdGgoQHBhdGgpLmFuZF9yZXR1cm4oaGFuZGxlKQorICAgICAgaGFuZGxlID0gZG91YmxlKCJVTklYU2VydmVyIiwgOmNsb3NlZD8gPT4gZmFsc2UpCisgICAgICBleHBlY3QoVU5JWFNlcnZlcikudG8gcmVjZWl2ZSg6bmV3KS53aXRoKEBwYXRoKS5hbmRfcmV0dXJuKGhhbmRsZSkKICAgICAgIEBzb2NrZXQubGlzdGVuCi0gICAgICBoYW5kbGUuc3R1YiEoOmNsb3NlKQotICAgICAgRmlsZS5zaG91bGRfcmVjZWl2ZSg6ZGVsZXRlKS53aXRoKEBwYXRoKQorICAgICAgYWxsb3coaGFuZGxlKS50byByZWNlaXZlKDpjbG9zZSkKKyAgICAgIGV4cGVjdChGaWxlKS50byByZWNlaXZlKDpkZWxldGUpLndpdGgoQHBhdGgpCiAgICAgICBAc29ja2V0LmNsb3NlCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJldHVybiBuaWwgd2hlbiBhY2NlcHRpbmcgaWYgdGhlcmUgaXMgbm8gaGFuZGxlIiBkbwotICAgICAgQHNvY2tldC5hY2NlcHQuc2hvdWxkIGJlX25pbAorICAgICAgZXhwZWN0KEBzb2NrZXQuYWNjZXB0KS50byBiZV9uaWwKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmV0dXJuIHRydWUgZm9yIGNsb3NlZD8gd2hlbiBhcHByb3ByaWF0ZSIgZG8KLSAgICAgIGhhbmRsZSA9IG1vY2soIlVOSVhTZXJ2ZXIiLCA6Y2xvc2VkPyA9PiBmYWxzZSkKLSAgICAgIFVOSVhTZXJ2ZXIuc3R1YiEoOm5ldykuYW5kX3JldHVybihoYW5kbGUpCi0gICAgICBGaWxlLnN0dWIhKDpkZWxldGUpCisgICAgICBoYW5kbGUgPSBkb3VibGUoIlVOSVhTZXJ2ZXIiLCA6Y2xvc2VkPyA9PiBmYWxzZSkKKyAgICAgIGFsbG93KFVOSVhTZXJ2ZXIpLnRvIHJlY2VpdmUoOm5ldykuYW5kX3JldHVybihoYW5kbGUpCisgICAgICBhbGxvdyhGaWxlKS50byByZWNlaXZlKDpkZWxldGUpCiAgICAgICBAc29ja2V0Lmxpc3RlbgotICAgICAgQHNvY2tldC5zaG91bGRfbm90IGJlX2Nsb3NlZAotICAgICAgaGFuZGxlLnN0dWIhKDpjbG9zZSkKKyAgICAgIGV4cGVjdChAc29ja2V0KS5ub3RfdG8gYmVfY2xvc2VkCisgICAgICBhbGxvdyhoYW5kbGUpLnRvIHJlY2VpdmUoOmNsb3NlKQogICAgICAgQHNvY2tldC5jbG9zZQotICAgICAgQHNvY2tldC5zaG91bGQgYmVfY2xvc2VkCisgICAgICBleHBlY3QoQHNvY2tldCkudG8gYmVfY2xvc2VkCiAgICAgICBAc29ja2V0Lmxpc3RlbgotICAgICAgQHNvY2tldC5zaG91bGRfbm90IGJlX2Nsb3NlZAotICAgICAgaGFuZGxlLnN0dWIhKDpjbG9zZWQ/KS5hbmRfcmV0dXJuKHRydWUpCi0gICAgICBAc29ja2V0LnNob3VsZCBiZV9jbG9zZWQKKyAgICAgIGV4cGVjdChAc29ja2V0KS5ub3RfdG8gYmVfY2xvc2VkCisgICAgICBhbGxvdyhoYW5kbGUpLnRvIHJlY2VpdmUoOmNsb3NlZD8pLmFuZF9yZXR1cm4odHJ1ZSkKKyAgICAgIGV4cGVjdChAc29ja2V0KS50byBiZV9jbG9zZWQKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChAc29ja2V0LnRvX3MpLnRvIGVxKCJkb21haW4oI3tAcGF0aH0pIikKICAgICBlbmQKICAgZW5kCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi90aHJpZnQuZ2Vtc3BlYyBiL2xpYi9yYi90aHJpZnQuZ2Vtc3BlYwppbmRleCBiNDA3NGNiLi5lNTMxOTRlIDEwMDY0NAotLS0gYS9saWIvcmIvdGhyaWZ0LmdlbXNwZWMKKysrIGIvbGliL3JiL3RocmlmdC5nZW1zcGVjCkBAIC0zLDE0ICszLDE0IEBACiAKIEdlbTo6U3BlY2lmaWNhdGlvbi5uZXcgZG8gfHN8CiAgIHMubmFtZSAgICAgICAgPSAndGhyaWZ0JwotICBzLnZlcnNpb24gICAgID0gJzAuOS4zLjAnCi0gIHMuYXV0aG9ycyAgICAgPSBbJ1RocmlmdCBEZXZlbG9wZXJzJ10KKyAgcy52ZXJzaW9uICAgICA9ICcxLjAuMCcKKyAgcy5hdXRob3JzICAgICA9IFsnQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzJ10KICAgcy5lbWFpbCAgICAgICA9IFsnZGV2QHRocmlmdC5hcGFjaGUub3JnJ10KICAgcy5ob21lcGFnZSAgICA9ICdodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcnCiAgIHMuc3VtbWFyeSAgICAgPSAlcXtSdWJ5IGJpbmRpbmdzIGZvciBBcGFjaGUgVGhyaWZ0fQogICBzLmRlc2NyaXB0aW9uID0gJXF7UnVieSBiaW5kaW5ncyBmb3IgdGhlIEFwYWNoZSBUaHJpZnQgUlBDIHN5c3RlbX0KLSAgcy5saWNlbnNlID0gJ0FwYWNoZSAyLjAnCi0gIHMuZXh0ZW5zaW9ucyA9IFsnZXh0L2V4dGNvbmYucmInXQorICBzLmxpY2Vuc2UgICAgID0gJ0FwYWNoZS0yLjAnCisgIHMuZXh0ZW5zaW9ucyAgPSBbJ2V4dC9leHRjb25mLnJiJ10KIAogICBzLmhhc19yZG9jICAgICAgPSB0cnVlCiAgIHMucmRvY19vcHRpb25zICA9ICV3Wy0tbGluZS1udW1iZXJzIC0taW5saW5lLXNvdXJjZSAtLXRpdGxlIFRocmlmdCAtLW1haW4gUkVBRE1FXQpAQCAtMjcsMTEgKzI3LDE0IEBACiAKICAgcy5yZXF1aXJlX3BhdGhzID0gJXdbbGliIGV4dF0KIAotICBzLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5ICdyc3BlYycsICd+PiAyLjEwLjAnCi0gIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3kgInJhY2siLCAifj4gMS41LjIiCi0gIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3kgInJhY2stdGVzdCIsICJ+PiAwLjYuMiIKLSAgcy5hZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSAidGhpbiIsICJ+PiAxLjUuMCIKLSAgcy5hZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSAiYnVuZGxlciIKLSAgcy5hZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSAncmFrZScKKyAgcy5hZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSAnYnVuZGxlcicsICAgICAgICAgICAgJ34+IDEuMTEnCisgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3kgJ3ByeScsICAgICAgICAgICAgICAgICd+PiAwLjExLjMnCisgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3kgJ3ByeS1ieWVidWcnLCAgICAgICAgICd+PiAzLjYnCisgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3kgJ3ByeS1zdGFja19leHBsb3JlcicsICd+PiAwLjQuOS4yJworICBzLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5ICdyYWNrJywgICAgICAgICAgICAgICAnfj4gMi4wJworICBzLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5ICdyYWNrLXRlc3QnLCAgICAgICAgICAnfj4gMC44LjMnCisgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3kgJ3Jha2UnLCAgICAgICAgICAgICAgICd+PiAxMi4zJworICBzLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5ICdyc3BlYycsICAgICAgICAgICAgICAnfj4gMy43JworICBzLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5ICd0aGluJywgICAgICAgICAgICAgICAnfj4gMS43JwogZW5kCiAKZGlmZiAtLWdpdCBhL2xpYi9ycy9DYXJnby50b21sIGIvbGliL3JzL0NhcmdvLnRvbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQzMjE3OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy9DYXJnby50b21sCkBAIC0wLDAgKzEsMTkgQEAKK1twYWNrYWdlXQorbmFtZSA9ICJ0aHJpZnQiCitkZXNjcmlwdGlvbiA9ICJSdXN0IGJpbmRpbmdzIGZvciB0aGUgQXBhY2hlIFRocmlmdCBSUEMgc3lzdGVtIgordmVyc2lvbiA9ICIxLjAuMCIKK2xpY2Vuc2UgPSAiQXBhY2hlLTIuMCIKK2F1dGhvcnMgPSBbIkFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPiJdCitob21lcGFnZSA9ICJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmciCitkb2N1bWVudGF0aW9uID0gImh0dHBzOi8vdGhyaWZ0LmFwYWNoZS5vcmciCityZWFkbWUgPSAiUkVBRE1FLm1kIgorZXhjbHVkZSA9IFsiTWFrZWZpbGUqIiwgInRlc3QvKioiLCAiKi5pbWwiXQora2V5d29yZHMgPSBbInRocmlmdCJdCisKK1tkZXBlbmRlbmNpZXNdCitieXRlb3JkZXIgPSAifjEuMi4xIgoraW50ZWdlci1lbmNvZGluZyA9ICJ+MS4wLjQiCitsb2cgPSAifjAuMy44IgordGhyZWFkcG9vbCA9ICJ+MS43LjEiCit0cnlfZnJvbSA9ICJ+MC4yLjIiCisKZGlmZiAtLWdpdCBhL2xpYi9ycy9NYWtlZmlsZS5hbSBiL2xpYi9ycy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTM0MTIwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNDYgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitTVUJESVJTID0gLgorCitpZiBXSVRIX1RFU1RTCitTVUJESVJTICs9IHRlc3QKK2VuZGlmCisKK2luc3RhbGw6CisJQGVjaG8gJyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjJworCUBlY2hvICcjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIycKKwlAZWNobyAnVGhlIFJ1c3QgY2xpZW50IGxpYnJhcnkgc2hvdWxkIGJlIGluc3RhbGxlZCB2aWEgYSBDYXJnby50b21sIGRlcGVuZGVuY3kgLSBwbGVhc2Ugc2VlIC9saWIvcnMvUkVBRE1FLm1kJworCUBlY2hvICcjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIycKKwlAZWNobyAnIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMnCisKK2NoZWNrLWxvY2FsOgorCSQoQ0FSR08pIHRlc3QKKworYWxsLWxvY2FsOgorCSQoQ0FSR08pIGJ1aWxkCisKK2NsZWFuLWxvY2FsOgorCSQoQ0FSR08pIGNsZWFuCisJLSQoUk0pIENhcmdvLmxvY2sKKworRVhUUkFfRElTVCA9IFwKKwlzcmMgXAorCUNhcmdvLnRvbWwgXAorCVJFQURNRS5tZApkaWZmIC0tZ2l0IGEvbGliL3JzL1JFQURNRS5tZCBiL2xpYi9ycy9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MzN2ExMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy9SRUFETUUubWQKQEAgLTAsMCArMSwxMTEgQEAKKyMgUnVzdCBUaHJpZnQgbGlicmFyeQorCisjIyBPdmVydmlldworCitUaGlzIGNyYXRlIGltcGxlbWVudHMgdGhlIGNvbXBvbmVudHMgcmVxdWlyZWQgdG8gYnVpbGQgYSB3b3JraW5nIFRocmlmdCBzZXJ2ZXIKK2FuZCBjbGllbnQuIEl0IGlzIGRpdmlkZWQgaW50byB0aGUgZm9sbG93aW5nIG1vZHVsZXM6CisKKyAxLiBlcnJvcnMKKyAyLiBwcm90b2NvbAorIDMuIHRyYW5zcG9ydAorIDQuIHNlcnZlcgorIDUuIGF1dG9nZW4KKworVGhlIG1vZHVsZXMgYXJlIGxheWVyZWQgYXMgc2hvd24uIFRoZSBgZ2VuZXJhdGVkYCBsYXllciBpcyBjb2RlIGdlbmVyYXRlZCBieSB0aGUKK1RocmlmdCBjb21waWxlcidzIFJ1c3QgcGx1Z2luLiBJdCB1c2VzIHRoZSBjb21wb25lbnRzIGRlZmluZWQgaW4gdGhpcyBjcmF0ZSB0bworc2VyaWFsaXplIGFuZCBkZXNlcmlhbGl6ZSB0eXBlcyBhbmQgaW1wbGVtZW50IFJQQy4gVXNlcnMgaW50ZXJhY3Qgd2l0aCB0aGVzZQordHlwZXMgYW5kIHNlcnZpY2VzIGJ5IHdyaXRpbmcgdGhlaXIgb3duIGNvZGUgb24gdG9wLgorCisgYGBgdGV4dAorICstLS0tLS0tLS0tLSsKKyB8ICBhcHAgZGV2ICB8CisgKy0tLS0tLS0tLS0tKworIHwgZ2VuZXJhdGVkIHwgPC0+IGVycm9ycy9yZXN1bHRzCisgKy0tLS0tLS0tLS0tKworIHwgIHByb3RvY29sIHwKKyArLS0tLS0tLS0tLS0rCisgfCB0cmFuc3BvcnQgfAorICstLS0tLS0tLS0tLSsKKyBgYGAKKworIyMgVXNpbmcgdGhpcyBjcmF0ZQorCitBZGQgYHRocmlmdCA9ICJ4LnkueiJgIHRvIHlvdXIgYENhcmdvLnRvbWxgLCB3aGVyZSBgeC55LnpgIGlzIHRoZSB2ZXJzaW9uIG9mIHRoZQorVGhyaWZ0IGNvbXBpbGVyIHlvdSdyZSB1c2luZy4KKworIyMgQVBJIERvY3VtZW50YXRpb24KKworRnVsbCBbUnVzdGRvY10oaHR0cHM6Ly9kb2NzLnJzL3RocmlmdC8pCisKKyMjIENvbXBhdGliaWxpdHkKKworVGhlIFJ1c3QgbGlicmFyeSBhbmQgYXV0by1nZW5lcmF0ZWQgY29kZSB0YXJnZXRzIFJ1c3QgdmVyc2lvbnMgMS4yOCsuCitJdCBkb2VzIG5vdCBjdXJyZW50bHkgdXNlIGFueSBSdXN0IDIwMTggZmVhdHVyZXMuCisKKyMjIyBCcmVha2luZyBDaGFuZ2VzCisKK0JyZWFraW5nIGNoYW5nZXMgYXJlIG1pbmltaXplZC4gV2hlbiB0aGV5IGFyZSBtYWRlIHRoZXkgd2lsbCBiZSBvdXRsaW5lZCBiZWxvdyB3aXRoIHRyYW5zaXRpb24gZ3VpZGVsaW5lcy4KKworIyMjIyMgVGhyaWZ0IDAuMTIuMAorCisqICoqW1RIUklGVC00NTI5XSoqIC0gUnVzdCBlbnVtIHZhcmlhbnRzIGFyZSBub3cgY2FtZWwtY2FzZWQgaW5zdGVhZCBvZiB1cHBlcmNhc2VkIHRvIGNvbmZvcm0gdG8gUnVzdCBuYW1pbmcgY29udmVudGlvbnMKKworICAgIFByZXZpb3VzbHksIGVudW0gdmFyaWFudHMgd2VyZSB1cHBlcmNhc2VkIGluIHRoZSBhdXRvLWdlbmVyYXRlZCBjb2RlLgorICAgIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIHRocmlmdCBlbnVtOgorCisgICAgYGBgdGhyaWZ0CisgICAgLy8gVEhSSUZUCisgICAgZW51bSBPcGVyYXRpb24geworICAgICAgQURELAorICAgICAgU1VCVFJBQ1QsCisgICAgICBNVUxUSVBMWSwKKyAgICAgIERJVklERSwKKyAgICB9CisgICAgYGBgCisgICAgCisgICAgdXNlZCB0byBnZW5lcmF0ZToKKyAgICAKKyAgICBgYGBydXN0CisgICAgLy8gT0xEIEFVVE8tR0VORVJBVEVEIFJVU1QKKyAgICBwdWIgZW51bSBPcGVyYXRpb24geworICAgICAgIEFERCwKKyAgICAgICBTVUJUUkFDVCwKKyAgICAgICBNVUxUSVBMWSwKKyAgICAgICBESVZJREUsCisgICAgIH0KKyAgICBgYGAKKyAgICBJdCAqbm93KiBnZW5lcmF0ZXM6CisgICAgYGBgcnVzdAorICAgIC8vIE5FVyBBVVRPLUdFTkVSQVRFRCBSVVNUCisgICAgcHViIGVudW0gT3BlcmF0aW9uIHsKKyAgICAgICBBZGQsCisgICAgICAgU3VidHJhY3QsCisgICAgICAgTXVsdGlwbHksCisgICAgICAgRGl2aWRlLAorICAgICB9CisgICAgYGBgCisgICAgCisgICAgWW91IHdpbGwgaGF2ZSB0byBjaGFuZ2UgYWxsIGVudW0gdmFyaWFudHMgaW4geW91ciBjb2RlIHRvIHVzZSBjYW1lbC1jYXNlZCBuYW1lcy4KKyAgICBUaGlzIHNob3VsZCBiZSBhIHNlYXJjaCBhbmQgcmVwbGFjZS4KKworIyMgQ29udHJpYnV0aW5nCisKK0J1ZyByZXBvcnRzIGFuZCBQUnMgYXJlIGFsd2F5cyB3ZWxjb21lISBQbGVhc2Ugc2VlIHRoZQorW1RocmlmdCB3ZWJzaXRlXShodHRwczovL3RocmlmdC5hcGFjaGUub3JnLykgZm9yIG1vcmUgZGV0YWlscy4KKworVGhyaWZ0IFJ1c3Qgc3VwcG9ydCByZXF1aXJlcyBjb2RlIGluIHNldmVyYWwgZGlyZWN0b3JpZXM6CisKKyogYGNvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfcnNfZ2VuZXJhdG9yLmNjYDogYmluZGluZyBjb2RlIGdlbmVyYXRvcgorKiBgbGliL3JzYDogcnVudGltZSBsaWJyYXJ5CisqIGBsaWIvcnMvdGVzdGA6IHN1cHBsZW1lbnRhbCB0ZXN0cworKiBgdHV0b3JpYWwvcnNgOiB0dXRvcmlhbCBjbGllbnQgYW5kIHNlcnZlcgorKiBgdGVzdC9yc2A6IGNyb3NzLWxhbmd1YWdlIHRlc3QgY2xpZW50IGFuZCBzZXJ2ZXIKKworQWxsIGxpYnJhcnkgY29kZSwgdGVzdCBjb2RlIGFuZCBhdXRvLWdlbmVyYXRlZCBjb2RlIGNvbXBpbGVzIGFuZCBwYXNzZXMgY2xpcHB5Cit3aXRob3V0IHdhcm5pbmdzLiBBbGwgbmV3IGNvZGUgbXVzdCBkbyB0aGUgc2FtZSEgV2hlbiBtYWtpbmcgY2hhbmdlcyBlbnN1cmUgdGhhdDoKKworKiBgcnVzdGNgIGRvZXMgZG9lcyBvdXRwdXQgYW55IHdhcm5pbmdzCisqIGBjbGlwcHlgIHdpdGggZGVmYXVsdCBzZXR0aW5ncyBkb2VzIG5vdCBvdXRwdXQgYW55IHdhcm5pbmdzIChpbmNsdWRlcyBhdXRvLWdlbmVyYXRlZCBjb2RlKQorKiBgY2FyZ28gdGVzdGAgaXMgc3VjY2Vzc2Z1bAorKiBgbWFrZSBwcmVjcm9zc2AgYW5kIGBtYWtlIGNoZWNrYCBhcmUgc3VjY2Vzc2Z1bAorKiBgdHV0b3JpYWwvYmluL3R1dG9yaWFsX2NsaWVudGAgYW5kIGB0dXRvcmlhbC9iaW4vdHV0b3JpYWxfc2VydmVyYCBjb21tdW5pY2F0ZQpkaWZmIC0tZ2l0IGEvbGliL3JzL1JFTEVBU0lORy5tZCBiL2xpYi9ycy9SRUxFQVNJTkcubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDczZDdhMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy9SRUxFQVNJTkcubWQKQEAgLTAsMCArMSw1NyBAQAorIyBQdWJsaXNoaW5nIHRoZSB0aHJpZnQgY3JhdGUKKworUHVibGlzaGluZyB0aGUgUnVzdCB0aHJpZnQgY3JhdGUgaXMgc3RyYWlnaHRmb3J3YXJkLCBhbmQgaW52b2x2ZXMgdHdvIG1ham9yIHN0ZXBzOgorCisxLiBTZXR0aW5nIHVwIHlvdXIgW2NyYXRlcy5pb10oaHR0cHM6Ly93d3cuY3JhdGVzLmlvKSBhY2NvdW50IF8ob25lLXRpbWUpXworCisyLiBQYWNrYWdpbmcvcHVibGlzaGluZyB0aGUgUnVzdCB0aHJpZnQgY3JhdGUgaXRzZWxmCisKKyMjIFNldCB1cCB5b3VyIGNyYXRlcy5pbyBhY2NvdW50IChvbmUtdGltZSkKKworMS4gR28gdG8gW2NyYXRlcy5pb10oaHR0cHM6Ly93d3cuY3JhdGVzLmlvKSBhbmQgY2xpY2sgdGhlIGBMb2cgSW5gIGJ1dHRvbiBhdCB0aGUgdG9wIHJpZ2h0LgorCisgICBMb2cgaW4gKiphcyB0aGUgR2l0aHViIHVzZXIgd2l0aCB3cml0ZSBwZXJtaXNzaW9ucyB0byB0aGUgdGhyaWZ0IHJlcG8hKioKKworMi4gQ2xpY2sgeW91ciB1c2VyIGljb24gYnV0dG9uIGF0IHRoZSB0b3AgcmlnaHQgYW5kIHNlbGVjdCBgQWNjb3VudCBTZXR0aW5nc2AuCisKKzMuIENsaWNrIGBOZXcgVG9rZW5gIG5leHQgdG8gYEFQSSBBY2Nlc3NgLgorCisgICBUaGlzIGdlbmVyYXRlcyBhIG5ldyBBUEkga2V5IHRoYXQgY2FyZ28gdXNlcyB0byBwdWJsaXNoIHBhY2thZ2VzIHRvIGNyYXRlcy5pby4KKyAgIFN0b3JlIHRoaXMgQVBJIGtleSBzb21ld2hlcmUgc2FmZS4gSWYgeW91IHdpbGwgb25seSB1c2UgdGhpcyBHaXRodWIgYWNjb3VudCB0bworICAgcHVibGlzaCBjcmF0ZXMgdG8gY3JhdGVzLmlvIHlvdSBjYW4gZm9sbG93IHRoZSBpbnN0cnVjdGlvbnMgdG8gc2F2ZSB0aGUKKyAgIGdlbmVyYXRlZCBrZXkgdG8gYH4vLmNhcmdvL2NyZWRlbnRpYWxzYC4KKworIyMgUGFja2FnZSBhbmQgUHVibGlzaAorCitZb3UgY2FuIHVzZSB0aGUgYXV0b21hdGVkIHNjcmlwdCBvciBydW4gdGhlIHJlbGVhc2Ugc3RlcHMgbWFudWFsbHkuCisKKyoqSW1wb3J0YW50Kio6IGBjYXJnb2AgZXhwZWN0cyB0aGF0IHZlcnNpb24gbnVtYmVycyBmb2xsb3cgdGhlIHNlbWFudGljIHZlcnNpb25pbmcgZm9ybWF0LgorVGhpcyBtZWFucyB0aGF0IGBUSFJJRlRfUkVMRUFTRV9WRVJTSU9OYCBtdXN0IGhhdmUgYSBtYWpvciwgbWlub3IgYW5kIHBhdGNoIG51bWJlciwgaS5lLiwgbXVzdAorYmUgaW4gdGhlIGZvcm0gYCMuIyMuIyNgLgorCisjIyMjIEF1dG9tYXRlZAorCitSdW4gYC4vcmVsZWFzZS5zaCBbVEhSSUZUX1JFTEVBU0VfVkVSU0lPTl1gLgorCitfUmVxdWlyZXMgeW91IHRvIGhhdmUgc3RvcmVkIHlvdXIgY3JlZGVudGlhbHMgaW4gYH4vLmNhcmdvL2NyZWRlbnRpYWxzYC5fCisKKyMjIyMgTWFudWFsCisKKzEuIEVkaXQgYENhcmdvLnRvbWxgIGFuZCB1cGRhdGUgdGhlIGB2ZXJzaW9uID0gMS4wYCBrZXkgdG8gYHZlcnNpb24gPSBbVEhSSUZUX1JFTEVBU0VfVkVSU0lPTl1gCisKKzIuIGBnaXQgYWRkIENhcmdvLnRvbWxgCisKKzMuIGBnaXQgY29tbWl0IC1tICJVcGRhdGUgdGhyaWZ0IGNyYXRlIHZlcnNpb24gdG8gW1RIUklGVF9SRUxFQVNFX1ZFUlNJT05dIiAtbSAiQ2xpZW50OiBycyJgCisKKzQuIGBjYXJnbyBsb2dpbmAKKworICAgIF8obm90IHJlcXVpcmVkIGlmIHlvdSBoYXZlIHN0b3JlZCB5b3VyIGNyZWRlbnRpYWxzIGluIGB+Ly5jYXJnby9jcmVkZW50aWFsc2ApXworCis1LiBgY2FyZ28gY2xlYW5gCisKKzYuIGBjYXJnbyBwYWNrYWdlYAorCisgICBUaGlzIHN0ZXAgZmFpbHMgaWYgdGhlcmUgYXJlIGFueSB1bmNvbW1pdHRlZCBvciBpZ25vcmVkIGZpbGVzLiBEbyAqKm5vdCoqIHVzZSB0aGUgYC0tYWxsb3ctZGlydHlgCisgICBmbGFnISBJbnN0ZWFkLCBhZGQgdGhlIGhpZ2hsaWdodGVkIGZpbGVzIGFzIGVudHJpZXMgaW4gdGhlIGBDYXJnby50b21sYCBgZXhjbHVkZWAga2V5LgorCis3LiBgY2FyZ28gcHVibGlzaGAKZGlmZiAtLWdpdCBhL2xpYi9ycy9yZWxlYXNlLnNoIGIvbGliL3JzL3JlbGVhc2Uuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzRlNWI0OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy9yZWxlYXNlLnNoCkBAIC0wLDAgKzEsMjYgQEAKKyMhL2Jpbi9iYXNoCisKK3NldCAtbyBlcnJleGl0CitzZXQgLW8gcGlwZWZhaWwKK3NldCAtbyBub3Vuc2V0CisKK2lmICEgW1sgJCMgLWVxIDEgJiYgJDEgPX4gXlswLTldKFwuWzAtOV1bMC05XSopezJ9JCBdXTsgdGhlbgorICAgICg+JjIgZWNobyAiVXNhZ2U6IC4vcHVibGlzaC1jcmF0ZS5zaCBbVEhSSUZUX1JFTEVBU0VfVkVSU0lPTl0gIikKKyAgICAoPiYyIGVjaG8gIiAgICAgICBUSFJJRlRfUkVMRUFTRV9WRVJTSU9OIGlzIGluIHNlbWFudGljIHZlcnNpb25pbmcgZm9ybWF0LCBpLmUuICMuIyMuIyMiKQorICAgIGV4aXQgMQorZmkKKworVEhSSUZUX1JFTEVBU0VfVkVSU0lPTj0kezE6LX0KKworZWNobyAiVXBkYXRpbmcgQ2FyZ28udG9tbCB0byAke1RIUklGVF9SRUxFQVNFX1ZFUlNJT059Igorc2VkIC1pLm9sZCAtZSAicy9edmVyc2lvbiA9IC4qJC92ZXJzaW9uID0gXCIke1RIUklGVF9SRUxFQVNFX1ZFUlNJT059XCIvZyIgQ2FyZ28udG9tbAorcm0gQ2FyZ28udG9tbC5vbGQKKworZWNobyAiQ29tbWl0dGluZyB1cGRhdGVkIENhcmdvLnRvbWwiCitnaXQgYWRkIENhcmdvLnRvbWwKK2dpdCBjb21taXQgLW0gIlVwZGF0ZSB0aHJpZnQgY3JhdGUgdmVyc2lvbiB0byAke1RIUklGVF9SRUxFQVNFX1ZFUlNJT059IiAtbSAiQ2xpZW50OiBycyIKKworZWNobyAiUGFja2FnaW5nIGFuZCByZWxlYXNpbmcgcnVzdCB0aHJpZnQgY3JhdGUgd2l0aCB2ZXJzaW9uICR7VEhSSUZUX1JFTEVBU0VfVkVSU0lPTn0iCitjYXJnbyBjbGVhbgorY2FyZ28gcGFja2FnZQorY2FyZ28gcHVibGlzaApkaWZmIC0tZ2l0IGEvbGliL3JzL3NyYy9hdXRvZ2VuLnJzIGIvbGliL3JzL3NyYy9hdXRvZ2VuLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0ZDQwODAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvc3JjL2F1dG9nZW4ucnMKQEAgLTAsMCArMSw0NSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyEgVGhyaWZ0IGNvbXBpbGVyIGF1dG8tZ2VuZXJhdGVkIHN1cHBvcnQuCisvLyEKKy8vIQorLy8hIFR5cGVzIGFuZCBmdW5jdGlvbnMgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBUaHJpZnQgY29tcGlsZXIncyBSdXN0IHBsdWdpbgorLy8hIHRvIGltcGxlbWVudCByZXF1aXJlZCBmdW5jdGlvbmFsaXR5LiBVc2VycyBzaG91bGQgbmV2ZXIgaGF2ZSB0byB1c2UgY29kZQorLy8hIGluIHRoaXMgbW9kdWxlIGRpcmVjdGx5LgorCit1c2UgcHJvdG9jb2w6OntUSW5wdXRQcm90b2NvbCwgVE91dHB1dFByb3RvY29sfTsKKworLy8vIFNwZWNpZmllcyB0aGUgbWluaW11bSBmdW5jdGlvbmFsaXR5IGFuIGF1dG8tZ2VuZXJhdGVkIGNsaWVudCBzaG91bGQgcHJvdmlkZQorLy8vIHRvIGNvbW11bmljYXRlIHdpdGggYSBUaHJpZnQgc2VydmVyLgorcHViIHRyYWl0IFRUaHJpZnRDbGllbnQgeworICAgIC8vLyBSZXR1cm5zIHRoZSBpbnB1dCBwcm90b2NvbCB1c2VkIHRvIHJlYWQgc2VyaWFsaXplZCBUaHJpZnQgbWVzc2FnZXMKKyAgICAvLy8gZnJvbSB0aGUgVGhyaWZ0IHNlcnZlci4KKyAgICBmbiBpX3Byb3RfbXV0KCZtdXQgc2VsZikgLT4gJm11dCBUSW5wdXRQcm90b2NvbDsKKyAgICAvLy8gUmV0dXJucyB0aGUgb3V0cHV0IHByb3RvY29sIHVzZWQgdG8gd3JpdGUgc2VyaWFsaXplZCBUaHJpZnQgbWVzc2FnZXMKKyAgICAvLy8gdG8gdGhlIFRocmlmdCBzZXJ2ZXIuCisgICAgZm4gb19wcm90X211dCgmbXV0IHNlbGYpIC0+ICZtdXQgVE91dHB1dFByb3RvY29sOworICAgIC8vLyBSZXR1cm5zIHRoZSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIGxhc3QgbWVzc2FnZSB3cml0dGVuIHRvIHRoZSBUaHJpZnQKKyAgICAvLy8gc2VydmVyLiBSZXR1cm5zIGAwYCBpZiBubyBtZXNzYWdlcyBoYXZlIGJlZW4gd3JpdHRlbi4gU2VxdWVuY2UKKyAgICAvLy8gbnVtYmVycyBzaG91bGQgKm5ldmVyKiBiZSBuZWdhdGl2ZSwgYW5kIHRoaXMgbWV0aG9kIHJldHVybnMgYW4gYGkzMmAKKyAgICAvLy8gc2ltcGx5IGJlY2F1c2UgdGhlIFRocmlmdCBwcm90b2NvbCBlbmNvZGVzIHNlcXVlbmNlIG51bWJlcnMgYXMgYGkzMmAgb24KKyAgICAvLy8gdGhlIHdpcmUuCisgICAgZm4gc2VxdWVuY2VfbnVtYmVyKCZzZWxmKSAtPiBpMzI7IC8vIEZJWE1FOiBjb25zaWRlciByZXR1cm5pbmcgYSB1MzIKKyAgICAvLy8gSW5jcmVtZW50cyB0aGUgc2VxdWVuY2UgbnVtYmVyLCBpbmRpY2F0aW5nIHRoYXQgYSBtZXNzYWdlIHdpdGggdGhhdAorICAgIC8vLyBudW1iZXIgaGFzIGJlZW4gc2VudCB0byB0aGUgVGhyaWZ0IHNlcnZlci4KKyAgICBmbiBpbmNyZW1lbnRfc2VxdWVuY2VfbnVtYmVyKCZtdXQgc2VsZikgLT4gaTMyOworfQpkaWZmIC0tZ2l0IGEvbGliL3JzL3NyYy9lcnJvcnMucnMgYi9saWIvcnMvc3JjL2Vycm9ycy5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmEyNTc2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3NyYy9lcnJvcnMucnMKQEAgLTAsMCArMSw2NzAgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNlIHN0ZDo6Y29udmVydDo6e0Zyb20sIEludG99OwordXNlIHN0ZDo6ZXJyb3I6OkVycm9yIGFzIFN0ZEVycm9yOwordXNlIHN0ZDo6Zm10Ojp7RGVidWcsIERpc3BsYXksIEZvcm1hdHRlcn07Cit1c2Ugc3RkOjp7ZXJyb3IsIGZtdCwgaW8sIHN0cmluZ307Cit1c2UgdHJ5X2Zyb206OlRyeUZyb207CisKK3VzZSBwcm90b2NvbDo6e1RGaWVsZElkZW50aWZpZXIsIFRJbnB1dFByb3RvY29sLCBUT3V0cHV0UHJvdG9jb2wsIFRTdHJ1Y3RJZGVudGlmaWVyLCBUVHlwZX07CisKKy8vIEZJWE1FOiBzaG91bGQgYWxsIG15IGVycm9yIHN0cnVjdHMgaW1wbCBlcnJvcjo6RXJyb3IgYXMgd2VsbD8KKy8vIEZJWE1FOiBzaG91bGQgYWxsIGZpZWxkcyBpbiBUcmFuc3BvcnRFcnJvciwgUHJvdG9jb2xFcnJvciBhbmQgQXBwbGljYXRpb25FcnJvciBiZSBvcHRpb25hbD8KKworLy8vIEVycm9yIHR5cGUgcmV0dXJuZWQgYnkgYWxsIHJ1bnRpbWUgbGlicmFyeSBmdW5jdGlvbnMuCisvLy8KKy8vLyBgdGhyaWZ0OjpFcnJvcmAgaXMgdXNlZCB0aHJvdWdob3V0IHRoaXMgY3JhdGUgYXMgd2VsbCBhcyBpbiBhdXRvLWdlbmVyYXRlZAorLy8vIFJ1c3QgY29kZS4gSXQgY29uc2lzdHMgb2YgZm91ciB2YXJpYW50cyBkZWZpbmVkIGJ5IGNvbnZlbnRpb24gYWNyb3NzIFRocmlmdAorLy8vIGltcGxlbWVudGF0aW9uczoKKy8vLworLy8vIDEuIGBUcmFuc3BvcnRgOiBlcnJvcnMgZW5jb3VudGVyZWQgd2hpbGUgb3BlcmF0aW5nIG9uIEkvTyBjaGFubmVscworLy8vIDIuIGBQcm90b2NvbGA6IGVycm9ycyBlbmNvdW50ZXJlZCBkdXJpbmcgcnVudGltZS1saWJyYXJ5IHByb2Nlc3NpbmcKKy8vLyAzLiBgQXBwbGljYXRpb25gOiBlcnJvcnMgZW5jb3VudGVyZWQgd2l0aGluIGF1dG8tZ2VuZXJhdGVkIGNvZGUKKy8vLyA0LiBgVXNlcmA6IElETC1kZWZpbmVkIGV4Y2VwdGlvbiBzdHJ1Y3RzCisvLy8KKy8vLyBUaGUgYEFwcGxpY2F0aW9uYCB2YXJpYW50IGFsc28gZnVuY3Rpb25zIGFzIGEgY2F0Y2gtYWxsOiBhbGwgaGFuZGxlciBlcnJvcnMKKy8vLyBhcmUgYXV0b21hdGljYWxseSB0dXJuZWQgaW50byBhcHBsaWNhdGlvbiBlcnJvcnMuCisvLy8KKy8vLyBBbGwgZXJyb3IgdmFyaWFudHMgZXhjZXB0IGBFcnJvcjo6VXNlcmAgdGFrZSBhbiBlcG9ueW1vdXMgc3RydWN0IHdpdGggdHdvCisvLy8gcmVxdWlyZWQgZmllbGRzOgorLy8vCisvLy8gMS4gYGtpbmRgOiB2YXJpYW50LXNwZWNpZmljIGVudW0gaWRlbnRpZnlpbmcgdGhlIGVycm9yIHN1Yi10eXBlCisvLy8gMi4gYG1lc3NhZ2VgOiBodW1hbi1yZWFkYWJsZSBlcnJvciBpbmZvIHN0cmluZworLy8vCisvLy8gYGtpbmRgIGlzIGRlZmluZWQgYnkgY29udmVudGlvbiB3aGlsZSBgbWVzc2FnZWAgaXMgZnJlZWZvcm0uIElmIG5vbmUgb2YgdGhlCisvLy8gZW51bWVyYXRlZCBraW5kcyBhcmUgc3VpdGFibGUgdXNlIGBVbmtub3duYC4KKy8vLworLy8vIFRvIHNpbXBsaWZ5IGVycm9yIGNyZWF0aW9uIGNvbnZlbmllbmNlIGNvbnN0cnVjdG9ycyBhcmUgZGVmaW5lZCBmb3IgYWxsCisvLy8gdmFyaWFudHMsIGFuZCBjb252ZXJzaW9ucyBmcm9tIHRoZWlyIHN0cnVjdHMgKGB0aHJpZnQ6OlRyYW5zcG9ydEVycm9yYCwKKy8vLyBgdGhyaWZ0OjpQcm90b2NvbEVycm9yYCBhbmQgYHRocmlmdDo6QXBwbGljYXRpb25FcnJvcmAgaW50byBgdGhyaWZ0OjpFcnJvcmAuCisvLy8KKy8vLyAjIEV4YW1wbGVzCisvLy8KKy8vLyBDcmVhdGUgYSBgVHJhbnNwb3J0RXJyb3JgLgorLy8vCisvLy8gYGBgCisvLy8gdXNlIHRocmlmdDsKKy8vLyB1c2UgdGhyaWZ0Ojp7VHJhbnNwb3J0RXJyb3IsIFRyYW5zcG9ydEVycm9yS2luZH07CisvLy8KKy8vLyAvLyBleHBsaWNpdAorLy8vIGxldCBlcnIwOiB0aHJpZnQ6OlJlc3VsdDwoKT4gPSBFcnIoCisvLy8gICB0aHJpZnQ6OkVycm9yOjpUcmFuc3BvcnQoCisvLy8gICAgIFRyYW5zcG9ydEVycm9yIHsKKy8vLyAgICAgICBraW5kOiBUcmFuc3BvcnRFcnJvcktpbmQ6OlRpbWVkT3V0LAorLy8vICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoImNvbm5lY3Rpb24gdG8gc2VydmVyIHRpbWVkIG91dCIpCisvLy8gICAgIH0KKy8vLyAgICkKKy8vLyApOworLy8vCisvLy8gLy8gdXNlIGNvbnZlcnNpb24KKy8vLyBsZXQgZXJyMTogdGhyaWZ0OjpSZXN1bHQ8KCk+ID0gRXJyKAorLy8vICAgdGhyaWZ0OjpFcnJvcjo6ZnJvbSgKKy8vLyAgICAgVHJhbnNwb3J0RXJyb3IgeworLy8vICAgICAgIGtpbmQ6IFRyYW5zcG9ydEVycm9yS2luZDo6VGltZWRPdXQsCisvLy8gICAgICAgbWVzc2FnZTogZm9ybWF0ISgiY29ubmVjdGlvbiB0byBzZXJ2ZXIgdGltZWQgb3V0IikKKy8vLyAgICAgfQorLy8vICAgKQorLy8vICk7CisvLy8KKy8vLyAvLyB1c2Ugc3RydWN0IGNvbnN0cnVjdG9yCisvLy8gbGV0IGVycjI6IHRocmlmdDo6UmVzdWx0PCgpPiA9IEVycigKKy8vLyAgIHRocmlmdDo6RXJyb3I6OlRyYW5zcG9ydCgKKy8vLyAgICAgVHJhbnNwb3J0RXJyb3I6Om5ldygKKy8vLyAgICAgICBUcmFuc3BvcnRFcnJvcktpbmQ6OlRpbWVkT3V0LAorLy8vICAgICAgICJjb25uZWN0aW9uIHRvIHNlcnZlciB0aW1lZCBvdXQiCisvLy8gICAgICkKKy8vLyAgICkKKy8vLyApOworLy8vCisvLy8KKy8vLyAvLyB1c2UgZXJyb3IgdmFyaWFudCBjb25zdHJ1Y3RvcgorLy8vIGxldCBlcnIzOiB0aHJpZnQ6OlJlc3VsdDwoKT4gPSBFcnIoCisvLy8gICB0aHJpZnQ6Om5ld190cmFuc3BvcnRfZXJyb3IoCisvLy8gICAgIFRyYW5zcG9ydEVycm9yS2luZDo6VGltZWRPdXQsCisvLy8gICAgICJjb25uZWN0aW9uIHRvIHNlcnZlciB0aW1lZCBvdXQiCisvLy8gICApCisvLy8gKTsKKy8vLyBgYGAKKy8vLworLy8vIENyZWF0ZSBhbiBlcnJvciBmcm9tIGEgc3RyaW5nLgorLy8vCisvLy8gYGBgCisvLy8gdXNlIHRocmlmdDsKKy8vLyB1c2UgdGhyaWZ0Ojp7QXBwbGljYXRpb25FcnJvciwgQXBwbGljYXRpb25FcnJvcktpbmR9OworLy8vCisvLy8gLy8gd2UganVzdCB1c2UgYEZyb206OmZyb21gIHRvIGNvbnZlcnQgYSBgU3RyaW5nYCBpbnRvIGEgYHRocmlmdDo6RXJyb3JgCisvLy8gbGV0IGVycjA6IHRocmlmdDo6UmVzdWx0PCgpPiA9IEVycigKKy8vLyAgIHRocmlmdDo6RXJyb3I6OmZyb20oIlRoaXMgaXMgYW4gZXJyb3IiKQorLy8vICk7CisvLy8KKy8vLyAvLyBlcnIwIGlzIGVxdWl2YWxlbnQgdG8uLi4KKy8vLyBsZXQgZXJyMTogdGhyaWZ0OjpSZXN1bHQ8KCk+ID0gRXJyKAorLy8vICAgdGhyaWZ0OjpFcnJvcjo6QXBwbGljYXRpb24oCisvLy8gICAgIEFwcGxpY2F0aW9uRXJyb3IgeworLy8vICAgICAgIGtpbmQ6IEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpVbmtub3duLAorLy8vICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoIlRoaXMgaXMgYW4gZXJyb3IiKQorLy8vICAgICB9CisvLy8gICApCisvLy8gKTsKKy8vLyBgYGAKKy8vLworLy8vIFJldHVybiBhbiBJREwtZGVmaW5lZCBleGNlcHRpb24uCisvLy8KKy8vLyBgYGB0ZXh0CisvLy8gLy8gVGhyaWZ0IElETCBleGNlcHRpb24gZGVmaW5pdGlvbi4KKy8vLyBleGNlcHRpb24gWGNlcHRpb24geworLy8vICAgMTogaTMyIGVycm9yQ29kZSwKKy8vLyAgIDI6IHN0cmluZyBtZXNzYWdlCisvLy8gfQorLy8vIGBgYAorLy8vCisvLy8gYGBgCisvLy8gdXNlIHN0ZDo6Y29udmVydDo6RnJvbTsKKy8vLyB1c2Ugc3RkOjplcnJvcjo6RXJyb3I7CisvLy8gdXNlIHN0ZDo6Zm10OworLy8vIHVzZSBzdGQ6OmZtdDo6e0Rpc3BsYXksIEZvcm1hdHRlcn07CisvLy8KKy8vLyAvLyBhdXRvLWdlbmVyYXRlZCBieSB0aGUgVGhyaWZ0IGNvbXBpbGVyCisvLy8gI1tkZXJpdmUoQ2xvbmUsIERlYnVnLCBFcSwgT3JkLCBQYXJ0aWFsRXEsIFBhcnRpYWxPcmQpXQorLy8vIHB1YiBzdHJ1Y3QgWGNlcHRpb24geworLy8vICAgcHViIGVycm9yX2NvZGU6IE9wdGlvbjxpMzI+LAorLy8vICAgcHViIG1lc3NhZ2U6IE9wdGlvbjxTdHJpbmc+LAorLy8vIH0KKy8vLworLy8vIC8vIGF1dG8tZ2VuZXJhdGVkIGJ5IHRoZSBUaHJpZnQgY29tcGlsZXIKKy8vLyBpbXBsIEVycm9yIGZvciBYY2VwdGlvbiB7CisvLy8gICBmbiBkZXNjcmlwdGlvbigmc2VsZikgLT4gJnN0ciB7CisvLy8gICAgICJyZW1vdGUgc2VydmljZSB0aHJldyBYY2VwdGlvbiIKKy8vLyAgIH0KKy8vLyB9CisvLy8KKy8vLyAvLyBhdXRvLWdlbmVyYXRlZCBieSB0aGUgVGhyaWZ0IGNvbXBpbGVyCisvLy8gaW1wbCBGcm9tPFhjZXB0aW9uPiBmb3IgdGhyaWZ0OjpFcnJvciB7CisvLy8gICBmbiBmcm9tKGU6IFhjZXB0aW9uKSAtPiBTZWxmIHsKKy8vLyAgICAgdGhyaWZ0OjpFcnJvcjo6VXNlcihCb3g6Om5ldyhlKSkKKy8vLyAgIH0KKy8vLyB9CisvLy8KKy8vLyAvLyBhdXRvLWdlbmVyYXRlZCBieSB0aGUgVGhyaWZ0IGNvbXBpbGVyCisvLy8gaW1wbCBEaXNwbGF5IGZvciBYY2VwdGlvbiB7CisvLy8gICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgRm9ybWF0dGVyKSAtPiBmbXQ6OlJlc3VsdCB7CisvLy8gICAgIHNlbGYuZGVzY3JpcHRpb24oKS5mbXQoZikKKy8vLyAgIH0KKy8vLyB9CisvLy8KKy8vLyAvLyBpbiB1c2VyIGNvZGUuLi4KKy8vLyBsZXQgZXJyOiB0aHJpZnQ6OlJlc3VsdDwoKT4gPSBFcnIoCisvLy8gICB0aHJpZnQ6OkVycm9yOjpmcm9tKFhjZXB0aW9uIHsgZXJyb3JfY29kZTogU29tZSgxKSwgbWVzc2FnZTogTm9uZSB9KQorLy8vICk7CisvLy8gYGBgCitwdWIgZW51bSBFcnJvciB7CisgICAgLy8vIEVycm9ycyBlbmNvdW50ZXJlZCB3aGlsZSBvcGVyYXRpbmcgb24gSS9PIGNoYW5uZWxzLgorICAgIC8vLworICAgIC8vLyBUaGVzZSBpbmNsdWRlICpjb25uZWN0aW9uIGNsb3NlZCogYW5kICpiaW5kIGZhaWx1cmUqLgorICAgIFRyYW5zcG9ydChUcmFuc3BvcnRFcnJvciksCisgICAgLy8vIEVycm9ycyBlbmNvdW50ZXJlZCBkdXJpbmcgcnVudGltZS1saWJyYXJ5IHByb2Nlc3NpbmcuCisgICAgLy8vCisgICAgLy8vIFRoZXNlIGluY2x1ZGUgKm1lc3NhZ2UgdG9vIGxhcmdlKiBhbmQgKnVuc3VwcG9ydGVkIHByb3RvY29sIHZlcnNpb24qLgorICAgIFByb3RvY29sKFByb3RvY29sRXJyb3IpLAorICAgIC8vLyBFcnJvcnMgZW5jb3VudGVyZWQgd2l0aGluIGF1dG8tZ2VuZXJhdGVkIGNvZGUsIG9yIHdoZW4gaW5jb21pbmcKKyAgICAvLy8gb3Igb3V0Z29pbmcgbWVzc2FnZXMgdmlvbGF0ZSB0aGUgVGhyaWZ0IHNwZWMuCisgICAgLy8vCisgICAgLy8vIFRoZXNlIGluY2x1ZGUgKm91dC1vZi1vcmRlciBtZXNzYWdlcyogYW5kICptaXNzaW5nIHJlcXVpcmVkIHN0cnVjdAorICAgIC8vLyBmaWVsZHMqLgorICAgIC8vLworICAgIC8vLyBUaGlzIHZhcmlhbnQgYWxzbyBmdW5jdGlvbnMgYXMgYSBjYXRjaC1hbGw6IGVycm9ycyBmcm9tIGhhbmRsZXIKKyAgICAvLy8gZnVuY3Rpb25zIGFyZSBhdXRvbWF0aWNhbGx5IHJldHVybmVkIGFzIGFuIGBBcHBsaWNhdGlvbkVycm9yYC4KKyAgICBBcHBsaWNhdGlvbihBcHBsaWNhdGlvbkVycm9yKSwKKyAgICAvLy8gSURMLWRlZmluZWQgZXhjZXB0aW9uIHN0cnVjdHMuCisgICAgVXNlcihCb3g8ZXJyb3I6OkVycm9yICsgU3luYyArIFNlbmQ+KSwKK30KKworaW1wbCBFcnJvciB7CisgICAgLy8vIENyZWF0ZSBhbiBgQXBwbGljYXRpb25FcnJvcmAgZnJvbSBpdHMgd2lyZSByZXByZXNlbnRhdGlvbi4KKyAgICAvLy8KKyAgICAvLy8gQXBwbGljYXRpb24gY29kZSAqKnNob3VsZCBuZXZlcioqIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuCisgICAgcHViIGZuIHJlYWRfYXBwbGljYXRpb25fZXJyb3JfZnJvbV9pbl9wcm90b2NvbCgKKyAgICAgICAgaTogJm11dCBUSW5wdXRQcm90b2NvbCwKKyAgICApIC0+IDo6UmVzdWx0PEFwcGxpY2F0aW9uRXJyb3I+IHsKKyAgICAgICAgbGV0IG11dCBtZXNzYWdlID0gImdlbmVyYWwgcmVtb3RlIGVycm9yIi50b19vd25lZCgpOworICAgICAgICBsZXQgbXV0IGtpbmQgPSBBcHBsaWNhdGlvbkVycm9yS2luZDo6VW5rbm93bjsKKworICAgICAgICBpLnJlYWRfc3RydWN0X2JlZ2luKCk/OworCisgICAgICAgIGxvb3AgeworICAgICAgICAgICAgbGV0IGZpZWxkX2lkZW50ID0gaS5yZWFkX2ZpZWxkX2JlZ2luKCk/OworCisgICAgICAgICAgICBpZiBmaWVsZF9pZGVudC5maWVsZF90eXBlID09IFRUeXBlOjpTdG9wIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbGV0IGlkID0gZmllbGRfaWRlbnQKKyAgICAgICAgICAgICAgICAuaWQKKyAgICAgICAgICAgICAgICAuZXhwZWN0KCJzZW5kZXIgc2hvdWxkIGFsd2F5cyBzcGVjaWZ5IGlkIGZvciBub24tU1RPUCBmaWVsZCIpOworCisgICAgICAgICAgICBtYXRjaCBpZCB7CisgICAgICAgICAgICAgICAgMSA9PiB7CisgICAgICAgICAgICAgICAgICAgIGxldCByZW1vdGVfbWVzc2FnZSA9IGkucmVhZF9zdHJpbmcoKT87CisgICAgICAgICAgICAgICAgICAgIGkucmVhZF9maWVsZF9lbmQoKT87CisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSByZW1vdGVfbWVzc2FnZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgMiA9PiB7CisgICAgICAgICAgICAgICAgICAgIGxldCByZW1vdGVfdHlwZV9hc19pbnQgPSBpLnJlYWRfaTMyKCk/OworICAgICAgICAgICAgICAgICAgICBsZXQgcmVtb3RlX2tpbmQ6IEFwcGxpY2F0aW9uRXJyb3JLaW5kID0gVHJ5RnJvbTo6dHJ5X2Zyb20ocmVtb3RlX3R5cGVfYXNfaW50KQorICAgICAgICAgICAgICAgICAgICAgICAgLnVud3JhcF9vcihBcHBsaWNhdGlvbkVycm9yS2luZDo6VW5rbm93bik7CisgICAgICAgICAgICAgICAgICAgIGkucmVhZF9maWVsZF9lbmQoKT87CisgICAgICAgICAgICAgICAgICAgIGtpbmQgPSByZW1vdGVfa2luZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgXyA9PiB7CisgICAgICAgICAgICAgICAgICAgIGkuc2tpcChmaWVsZF9pZGVudC5maWVsZF90eXBlKT87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaS5yZWFkX3N0cnVjdF9lbmQoKT87CisKKyAgICAgICAgT2soQXBwbGljYXRpb25FcnJvciB7CisgICAgICAgICAgICBraW5kOiBraW5kLAorICAgICAgICAgICAgbWVzc2FnZTogbWVzc2FnZSwKKyAgICAgICAgfSkKKyAgICB9CisKKyAgICAvLy8gQ29udmVydCBhbiBgQXBwbGljYXRpb25FcnJvcmAgaW50byBpdHMgd2lyZSByZXByZXNlbnRhdGlvbiBhbmQgd3JpdGUKKyAgICAvLy8gaXQgdG8gdGhlIHJlbW90ZS4KKyAgICAvLy8KKyAgICAvLy8gQXBwbGljYXRpb24gY29kZSAqKnNob3VsZCBuZXZlcioqIGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuCisgICAgcHViIGZuIHdyaXRlX2FwcGxpY2F0aW9uX2Vycm9yX3RvX291dF9wcm90b2NvbCgKKyAgICAgICAgZTogJkFwcGxpY2F0aW9uRXJyb3IsCisgICAgICAgIG86ICZtdXQgVE91dHB1dFByb3RvY29sLAorICAgICkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgby53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyIHsKKyAgICAgICAgICAgIG5hbWU6ICJUQXBwbGljYXRpb25FeGNlcHRpb24iLnRvX293bmVkKCksCisgICAgICAgIH0pPzsKKworICAgICAgICBsZXQgbWVzc2FnZV9maWVsZCA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygibWVzc2FnZSIsIFRUeXBlOjpTdHJpbmcsIDEpOworICAgICAgICBsZXQgdHlwZV9maWVsZCA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygidHlwZSIsIFRUeXBlOjpJMzIsIDIpOworCisgICAgICAgIG8ud3JpdGVfZmllbGRfYmVnaW4oJm1lc3NhZ2VfZmllbGQpPzsKKyAgICAgICAgby53cml0ZV9zdHJpbmcoJmUubWVzc2FnZSk/OworICAgICAgICBvLndyaXRlX2ZpZWxkX2VuZCgpPzsKKworICAgICAgICBvLndyaXRlX2ZpZWxkX2JlZ2luKCZ0eXBlX2ZpZWxkKT87CisgICAgICAgIG8ud3JpdGVfaTMyKGUua2luZCBhcyBpMzIpPzsKKyAgICAgICAgby53cml0ZV9maWVsZF9lbmQoKT87CisKKyAgICAgICAgby53cml0ZV9maWVsZF9zdG9wKCk/OworICAgICAgICBvLndyaXRlX3N0cnVjdF9lbmQoKT87CisKKyAgICAgICAgby5mbHVzaCgpCisgICAgfQorfQorCitpbXBsIGVycm9yOjpFcnJvciBmb3IgRXJyb3IgeworICAgIGZuIGRlc2NyaXB0aW9uKCZzZWxmKSAtPiAmc3RyIHsKKyAgICAgICAgbWF0Y2ggKnNlbGYgeworICAgICAgICAgICAgRXJyb3I6OlRyYW5zcG9ydChyZWYgZSkgPT4gVHJhbnNwb3J0RXJyb3I6OmRlc2NyaXB0aW9uKGUpLAorICAgICAgICAgICAgRXJyb3I6OlByb3RvY29sKHJlZiBlKSA9PiBQcm90b2NvbEVycm9yOjpkZXNjcmlwdGlvbihlKSwKKyAgICAgICAgICAgIEVycm9yOjpBcHBsaWNhdGlvbihyZWYgZSkgPT4gQXBwbGljYXRpb25FcnJvcjo6ZGVzY3JpcHRpb24oZSksCisgICAgICAgICAgICBFcnJvcjo6VXNlcihyZWYgZSkgPT4gZS5kZXNjcmlwdGlvbigpLAorICAgICAgICB9CisgICAgfQorfQorCitpbXBsIERlYnVnIGZvciBFcnJvciB7CisgICAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IEZvcm1hdHRlcikgLT4gZm10OjpSZXN1bHQgeworICAgICAgICBtYXRjaCAqc2VsZiB7CisgICAgICAgICAgICBFcnJvcjo6VHJhbnNwb3J0KHJlZiBlKSA9PiBEZWJ1Zzo6Zm10KGUsIGYpLAorICAgICAgICAgICAgRXJyb3I6OlByb3RvY29sKHJlZiBlKSA9PiBEZWJ1Zzo6Zm10KGUsIGYpLAorICAgICAgICAgICAgRXJyb3I6OkFwcGxpY2F0aW9uKHJlZiBlKSA9PiBEZWJ1Zzo6Zm10KGUsIGYpLAorICAgICAgICAgICAgRXJyb3I6OlVzZXIocmVmIGUpID0+IERlYnVnOjpmbXQoZSwgZiksCisgICAgICAgIH0KKyAgICB9Cit9CisKK2ltcGwgRGlzcGxheSBmb3IgRXJyb3IgeworICAgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBGb3JtYXR0ZXIpIC0+IGZtdDo6UmVzdWx0IHsKKyAgICAgICAgbWF0Y2ggKnNlbGYgeworICAgICAgICAgICAgRXJyb3I6OlRyYW5zcG9ydChyZWYgZSkgPT4gRGlzcGxheTo6Zm10KGUsIGYpLAorICAgICAgICAgICAgRXJyb3I6OlByb3RvY29sKHJlZiBlKSA9PiBEaXNwbGF5OjpmbXQoZSwgZiksCisgICAgICAgICAgICBFcnJvcjo6QXBwbGljYXRpb24ocmVmIGUpID0+IERpc3BsYXk6OmZtdChlLCBmKSwKKyAgICAgICAgICAgIEVycm9yOjpVc2VyKHJlZiBlKSA9PiBEaXNwbGF5OjpmbXQoZSwgZiksCisgICAgICAgIH0KKyAgICB9Cit9CisKK2ltcGwgRnJvbTxTdHJpbmc+IGZvciBFcnJvciB7CisgICAgZm4gZnJvbShzOiBTdHJpbmcpIC0+IFNlbGYgeworICAgICAgICBFcnJvcjo6QXBwbGljYXRpb24oQXBwbGljYXRpb25FcnJvciB7CisgICAgICAgICAgICBraW5kOiBBcHBsaWNhdGlvbkVycm9yS2luZDo6VW5rbm93biwKKyAgICAgICAgICAgIG1lc3NhZ2U6IHMsCisgICAgICAgIH0pCisgICAgfQorfQorCitpbXBsPCdhPiBGcm9tPCYnYSBzdHI+IGZvciBFcnJvciB7CisgICAgZm4gZnJvbShzOiAmJ2Egc3RyKSAtPiBTZWxmIHsKKyAgICAgICAgRXJyb3I6OkFwcGxpY2F0aW9uKEFwcGxpY2F0aW9uRXJyb3IgeworICAgICAgICAgICAga2luZDogQXBwbGljYXRpb25FcnJvcktpbmQ6OlVua25vd24sCisgICAgICAgICAgICBtZXNzYWdlOiBTdHJpbmc6OmZyb20ocyksCisgICAgICAgIH0pCisgICAgfQorfQorCitpbXBsIEZyb208VHJhbnNwb3J0RXJyb3I+IGZvciBFcnJvciB7CisgICAgZm4gZnJvbShlOiBUcmFuc3BvcnRFcnJvcikgLT4gU2VsZiB7CisgICAgICAgIEVycm9yOjpUcmFuc3BvcnQoZSkKKyAgICB9Cit9CisKK2ltcGwgRnJvbTxQcm90b2NvbEVycm9yPiBmb3IgRXJyb3IgeworICAgIGZuIGZyb20oZTogUHJvdG9jb2xFcnJvcikgLT4gU2VsZiB7CisgICAgICAgIEVycm9yOjpQcm90b2NvbChlKQorICAgIH0KK30KKworaW1wbCBGcm9tPEFwcGxpY2F0aW9uRXJyb3I+IGZvciBFcnJvciB7CisgICAgZm4gZnJvbShlOiBBcHBsaWNhdGlvbkVycm9yKSAtPiBTZWxmIHsKKyAgICAgICAgRXJyb3I6OkFwcGxpY2F0aW9uKGUpCisgICAgfQorfQorCisvLy8gQ3JlYXRlIGEgbmV3IGBFcnJvcmAgaW5zdGFuY2Ugb2YgdHlwZSBgVHJhbnNwb3J0YCB0aGF0IHdyYXBzIGEKKy8vLyBgVHJhbnNwb3J0RXJyb3JgLgorcHViIGZuIG5ld190cmFuc3BvcnRfZXJyb3I8UzogSW50bzxTdHJpbmc+PihraW5kOiBUcmFuc3BvcnRFcnJvcktpbmQsIG1lc3NhZ2U6IFMpIC0+IEVycm9yIHsKKyAgICBFcnJvcjo6VHJhbnNwb3J0KFRyYW5zcG9ydEVycm9yOjpuZXcoa2luZCwgbWVzc2FnZSkpCit9CisKKy8vLyBJbmZvcm1hdGlvbiBhYm91dCBJL08gZXJyb3JzLgorI1tkZXJpdmUoRGVidWcsIEVxLCBQYXJ0aWFsRXEpXQorcHViIHN0cnVjdCBUcmFuc3BvcnRFcnJvciB7CisgICAgLy8vIEkvTyBlcnJvciB2YXJpYW50LgorICAgIC8vLworICAgIC8vLyBJZiBhIHNwZWNpZmljIGBUcmFuc3BvcnRFcnJvcktpbmRgIGRvZXMgbm90IGFwcGx5IHVzZQorICAgIC8vLyBgVHJhbnNwb3J0RXJyb3JLaW5kOjpVbmtub3duYC4KKyAgICBwdWIga2luZDogVHJhbnNwb3J0RXJyb3JLaW5kLAorICAgIC8vLyBIdW1hbi1yZWFkYWJsZSBlcnJvciBtZXNzYWdlLgorICAgIHB1YiBtZXNzYWdlOiBTdHJpbmcsCit9CisKK2ltcGwgVHJhbnNwb3J0RXJyb3IgeworICAgIC8vLyBDcmVhdGUgYSBuZXcgYFRyYW5zcG9ydEVycm9yYC4KKyAgICBwdWIgZm4gbmV3PFM6IEludG88U3RyaW5nPj4oa2luZDogVHJhbnNwb3J0RXJyb3JLaW5kLCBtZXNzYWdlOiBTKSAtPiBUcmFuc3BvcnRFcnJvciB7CisgICAgICAgIFRyYW5zcG9ydEVycm9yIHsKKyAgICAgICAgICAgIGtpbmQ6IGtpbmQsCisgICAgICAgICAgICBtZXNzYWdlOiBtZXNzYWdlLmludG8oKSwKKyAgICAgICAgfQorICAgIH0KK30KKworLy8vIEkvTyBlcnJvciBjYXRlZ29yaWVzLgorLy8vCisvLy8gVGhpcyBsaXN0IG1heSBncm93LCBhbmQgaXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIG1hdGNoIGFnYWluc3QgaXQuCisjW2Rlcml2ZShDbG9uZSwgQ29weSwgRXEsIERlYnVnLCBQYXJ0aWFsRXEpXQorcHViIGVudW0gVHJhbnNwb3J0RXJyb3JLaW5kIHsKKyAgICAvLy8gQ2F0Y2gtYWxsIEkvTyBlcnJvci4KKyAgICBVbmtub3duID0gMCwKKyAgICAvLy8gQW4gSS9PIG9wZXJhdGlvbiB3YXMgYXR0ZW1wdGVkIHdoZW4gdGhlIHRyYW5zcG9ydCBjaGFubmVsIHdhcyBub3Qgb3Blbi4KKyAgICBOb3RPcGVuID0gMSwKKyAgICAvLy8gVGhlIHRyYW5zcG9ydCBjaGFubmVsIGNhbm5vdCBiZSBvcGVuZWQgYmVjYXVzZSBpdCB3YXMgb3BlbmVkIHByZXZpb3VzbHkuCisgICAgQWxyZWFkeU9wZW4gPSAyLAorICAgIC8vLyBBbiBJL08gb3BlcmF0aW9uIHRpbWVkIG91dC4KKyAgICBUaW1lZE91dCA9IDMsCisgICAgLy8vIEEgcmVhZCBjb3VsZCBub3QgY29tcGxldGUgYmVjYXVzZSBubyBieXRlcyB3ZXJlIGF2YWlsYWJsZS4KKyAgICBFbmRPZkZpbGUgPSA0LAorICAgIC8vLyBBbiBpbnZhbGlkIChidWZmZXIvbWVzc2FnZSkgc2l6ZSB3YXMgcmVxdWVzdGVkIG9yIHJlY2VpdmVkLgorICAgIE5lZ2F0aXZlU2l6ZSA9IDUsCisgICAgLy8vIFRvbyBsYXJnZSBhIGJ1ZmZlciBvciBtZXNzYWdlIHNpemUgd2FzIHJlcXVlc3RlZCBvciByZWNlaXZlZC4KKyAgICBTaXplTGltaXQgPSA2LAorfQorCitpbXBsIFRyYW5zcG9ydEVycm9yIHsKKyAgICBmbiBkZXNjcmlwdGlvbigmc2VsZikgLT4gJnN0ciB7CisgICAgICAgIG1hdGNoIHNlbGYua2luZCB7CisgICAgICAgICAgICBUcmFuc3BvcnRFcnJvcktpbmQ6OlVua25vd24gPT4gInRyYW5zcG9ydCBlcnJvciIsCisgICAgICAgICAgICBUcmFuc3BvcnRFcnJvcktpbmQ6Ok5vdE9wZW4gPT4gIm5vdCBvcGVuIiwKKyAgICAgICAgICAgIFRyYW5zcG9ydEVycm9yS2luZDo6QWxyZWFkeU9wZW4gPT4gImFscmVhZHkgb3BlbiIsCisgICAgICAgICAgICBUcmFuc3BvcnRFcnJvcktpbmQ6OlRpbWVkT3V0ID0+ICJ0aW1lZCBvdXQiLAorICAgICAgICAgICAgVHJhbnNwb3J0RXJyb3JLaW5kOjpFbmRPZkZpbGUgPT4gImVuZCBvZiBmaWxlIiwKKyAgICAgICAgICAgIFRyYW5zcG9ydEVycm9yS2luZDo6TmVnYXRpdmVTaXplID0+ICJuZWdhdGl2ZSBzaXplIG1lc3NhZ2UiLAorICAgICAgICAgICAgVHJhbnNwb3J0RXJyb3JLaW5kOjpTaXplTGltaXQgPT4gIm1lc3NhZ2UgdG9vIGxvbmciLAorICAgICAgICB9CisgICAgfQorfQorCitpbXBsIERpc3BsYXkgZm9yIFRyYW5zcG9ydEVycm9yIHsKKyAgICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgRm9ybWF0dGVyKSAtPiBmbXQ6OlJlc3VsdCB7CisgICAgICAgIHdyaXRlIShmLCAie30iLCBzZWxmLmRlc2NyaXB0aW9uKCkpCisgICAgfQorfQorCitpbXBsIFRyeUZyb208aTMyPiBmb3IgVHJhbnNwb3J0RXJyb3JLaW5kIHsKKyAgICB0eXBlIEVyciA9IEVycm9yOworICAgIGZuIHRyeV9mcm9tKGZyb206IGkzMikgLT4gUmVzdWx0PFNlbGYsIFNlbGY6OkVycj4geworICAgICAgICBtYXRjaCBmcm9tIHsKKyAgICAgICAgICAgIDAgPT4gT2soVHJhbnNwb3J0RXJyb3JLaW5kOjpVbmtub3duKSwKKyAgICAgICAgICAgIDEgPT4gT2soVHJhbnNwb3J0RXJyb3JLaW5kOjpOb3RPcGVuKSwKKyAgICAgICAgICAgIDIgPT4gT2soVHJhbnNwb3J0RXJyb3JLaW5kOjpBbHJlYWR5T3BlbiksCisgICAgICAgICAgICAzID0+IE9rKFRyYW5zcG9ydEVycm9yS2luZDo6VGltZWRPdXQpLAorICAgICAgICAgICAgNCA9PiBPayhUcmFuc3BvcnRFcnJvcktpbmQ6OkVuZE9mRmlsZSksCisgICAgICAgICAgICA1ID0+IE9rKFRyYW5zcG9ydEVycm9yS2luZDo6TmVnYXRpdmVTaXplKSwKKyAgICAgICAgICAgIDYgPT4gT2soVHJhbnNwb3J0RXJyb3JLaW5kOjpTaXplTGltaXQpLAorICAgICAgICAgICAgXyA9PiBFcnIoRXJyb3I6OlByb3RvY29sKFByb3RvY29sRXJyb3IgeworICAgICAgICAgICAgICAgIGtpbmQ6IFByb3RvY29sRXJyb3JLaW5kOjpVbmtub3duLAorICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoImNhbm5vdCBjb252ZXJ0IHt9IHRvIFRyYW5zcG9ydEVycm9yS2luZCIsIGZyb20pLAorICAgICAgICAgICAgfSkpLAorICAgICAgICB9CisgICAgfQorfQorCitpbXBsIEZyb208aW86OkVycm9yPiBmb3IgRXJyb3IgeworICAgIGZuIGZyb20oZXJyOiBpbzo6RXJyb3IpIC0+IFNlbGYgeworICAgICAgICBtYXRjaCBlcnIua2luZCgpIHsKKyAgICAgICAgICAgIGlvOjpFcnJvcktpbmQ6OkNvbm5lY3Rpb25SZXNldAorICAgICAgICAgICAgfCBpbzo6RXJyb3JLaW5kOjpDb25uZWN0aW9uUmVmdXNlZAorICAgICAgICAgICAgfCBpbzo6RXJyb3JLaW5kOjpOb3RDb25uZWN0ZWQgPT4gRXJyb3I6OlRyYW5zcG9ydChUcmFuc3BvcnRFcnJvciB7CisgICAgICAgICAgICAgICAga2luZDogVHJhbnNwb3J0RXJyb3JLaW5kOjpOb3RPcGVuLAorICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGVyci5kZXNjcmlwdGlvbigpLnRvX293bmVkKCksCisgICAgICAgICAgICB9KSwKKyAgICAgICAgICAgIGlvOjpFcnJvcktpbmQ6OkFscmVhZHlFeGlzdHMgPT4gRXJyb3I6OlRyYW5zcG9ydChUcmFuc3BvcnRFcnJvciB7CisgICAgICAgICAgICAgICAga2luZDogVHJhbnNwb3J0RXJyb3JLaW5kOjpBbHJlYWR5T3BlbiwKKyAgICAgICAgICAgICAgICBtZXNzYWdlOiBlcnIuZGVzY3JpcHRpb24oKS50b19vd25lZCgpLAorICAgICAgICAgICAgfSksCisgICAgICAgICAgICBpbzo6RXJyb3JLaW5kOjpUaW1lZE91dCA9PiBFcnJvcjo6VHJhbnNwb3J0KFRyYW5zcG9ydEVycm9yIHsKKyAgICAgICAgICAgICAgICBraW5kOiBUcmFuc3BvcnRFcnJvcktpbmQ6OlRpbWVkT3V0LAorICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGVyci5kZXNjcmlwdGlvbigpLnRvX293bmVkKCksCisgICAgICAgICAgICB9KSwKKyAgICAgICAgICAgIGlvOjpFcnJvcktpbmQ6OlVuZXhwZWN0ZWRFb2YgPT4gRXJyb3I6OlRyYW5zcG9ydChUcmFuc3BvcnRFcnJvciB7CisgICAgICAgICAgICAgICAga2luZDogVHJhbnNwb3J0RXJyb3JLaW5kOjpFbmRPZkZpbGUsCisgICAgICAgICAgICAgICAgbWVzc2FnZTogZXJyLmRlc2NyaXB0aW9uKCkudG9fb3duZWQoKSwKKyAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgXyA9PiB7CisgICAgICAgICAgICAgICAgRXJyb3I6OlRyYW5zcG9ydChUcmFuc3BvcnRFcnJvciB7CisgICAgICAgICAgICAgICAgICAgIGtpbmQ6IFRyYW5zcG9ydEVycm9yS2luZDo6VW5rbm93biwKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZXJyLmRlc2NyaXB0aW9uKCkudG9fb3duZWQoKSwgLy8gRklYTUU6IHVzZSBpbyBlcnJvcidzIGRlYnVnIHN0cmluZworICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK2ltcGwgRnJvbTxzdHJpbmc6OkZyb21VdGY4RXJyb3I+IGZvciBFcnJvciB7CisgICAgZm4gZnJvbShlcnI6IHN0cmluZzo6RnJvbVV0ZjhFcnJvcikgLT4gU2VsZiB7CisgICAgICAgIEVycm9yOjpQcm90b2NvbChQcm90b2NvbEVycm9yIHsKKyAgICAgICAgICAgIGtpbmQ6IFByb3RvY29sRXJyb3JLaW5kOjpJbnZhbGlkRGF0YSwKKyAgICAgICAgICAgIG1lc3NhZ2U6IGVyci5kZXNjcmlwdGlvbigpLnRvX293bmVkKCksIC8vIEZJWE1FOiB1c2UgZm10OjpFcnJvcidzIGRlYnVnIHN0cmluZworICAgICAgICB9KQorICAgIH0KK30KKworLy8vIENyZWF0ZSBhIG5ldyBgRXJyb3JgIGluc3RhbmNlIG9mIHR5cGUgYFByb3RvY29sYCB0aGF0IHdyYXBzIGEKKy8vLyBgUHJvdG9jb2xFcnJvcmAuCitwdWIgZm4gbmV3X3Byb3RvY29sX2Vycm9yPFM6IEludG88U3RyaW5nPj4oa2luZDogUHJvdG9jb2xFcnJvcktpbmQsIG1lc3NhZ2U6IFMpIC0+IEVycm9yIHsKKyAgICBFcnJvcjo6UHJvdG9jb2woUHJvdG9jb2xFcnJvcjo6bmV3KGtpbmQsIG1lc3NhZ2UpKQorfQorCisvLy8gSW5mb3JtYXRpb24gYWJvdXQgZXJyb3JzIHRoYXQgb2NjdXIgaW4gdGhlIHJ1bnRpbWUgbGlicmFyeS4KKyNbZGVyaXZlKERlYnVnLCBFcSwgUGFydGlhbEVxKV0KK3B1YiBzdHJ1Y3QgUHJvdG9jb2xFcnJvciB7CisgICAgLy8vIFByb3RvY29sIGVycm9yIHZhcmlhbnQuCisgICAgLy8vCisgICAgLy8vIElmIGEgc3BlY2lmaWMgYFByb3RvY29sRXJyb3JLaW5kYCBkb2VzIG5vdCBhcHBseSB1c2UKKyAgICAvLy8gYFByb3RvY29sRXJyb3JLaW5kOjpVbmtub3duYC4KKyAgICBwdWIga2luZDogUHJvdG9jb2xFcnJvcktpbmQsCisgICAgLy8vIEh1bWFuLXJlYWRhYmxlIGVycm9yIG1lc3NhZ2UuCisgICAgcHViIG1lc3NhZ2U6IFN0cmluZywKK30KKworaW1wbCBQcm90b2NvbEVycm9yIHsKKyAgICAvLy8gQ3JlYXRlIGEgbmV3IGBQcm90b2NvbEVycm9yYC4KKyAgICBwdWIgZm4gbmV3PFM6IEludG88U3RyaW5nPj4oa2luZDogUHJvdG9jb2xFcnJvcktpbmQsIG1lc3NhZ2U6IFMpIC0+IFByb3RvY29sRXJyb3IgeworICAgICAgICBQcm90b2NvbEVycm9yIHsKKyAgICAgICAgICAgIGtpbmQ6IGtpbmQsCisgICAgICAgICAgICBtZXNzYWdlOiBtZXNzYWdlLmludG8oKSwKKyAgICAgICAgfQorICAgIH0KK30KKworLy8vIFJ1bnRpbWUgbGlicmFyeSBlcnJvciBjYXRlZ29yaWVzLgorLy8vCisvLy8gVGhpcyBsaXN0IG1heSBncm93LCBhbmQgaXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIG1hdGNoIGFnYWluc3QgaXQuCisjW2Rlcml2ZShDbG9uZSwgQ29weSwgRXEsIERlYnVnLCBQYXJ0aWFsRXEpXQorcHViIGVudW0gUHJvdG9jb2xFcnJvcktpbmQgeworICAgIC8vLyBDYXRjaC1hbGwgcnVudGltZS1saWJyYXJ5IGVycm9yLgorICAgIFVua25vd24gPSAwLAorICAgIC8vLyBBbiBpbnZhbGlkIGFyZ3VtZW50IHdhcyBzdXBwbGllZCB0byBhIGxpYnJhcnkgZnVuY3Rpb24sIG9yIGludmFsaWQgZGF0YQorICAgIC8vLyB3YXMgcmVjZWl2ZWQgZnJvbSBhIFRocmlmdCBlbmRwb2ludC4KKyAgICBJbnZhbGlkRGF0YSA9IDEsCisgICAgLy8vIEFuIGludmFsaWQgc2l6ZSB3YXMgcmVjZWl2ZWQgaW4gYW4gZW5jb2RlZCBmaWVsZC4KKyAgICBOZWdhdGl2ZVNpemUgPSAyLAorICAgIC8vLyBUaHJpZnQgbWVzc2FnZSBvciBmaWVsZCB3YXMgdG9vIGxvbmcuCisgICAgU2l6ZUxpbWl0ID0gMywKKyAgICAvLy8gVW5zdXBwb3J0ZWQgb3IgdW5rbm93biBUaHJpZnQgcHJvdG9jb2wgdmVyc2lvbi4KKyAgICBCYWRWZXJzaW9uID0gNCwKKyAgICAvLy8gVW5zdXBwb3J0ZWQgVGhyaWZ0IHByb3RvY29sLCBzZXJ2ZXIgb3IgZmllbGQgdHlwZS4KKyAgICBOb3RJbXBsZW1lbnRlZCA9IDUsCisgICAgLy8vIFJlYWNoZWQgdGhlIG1heGltdW0gbmVzdGVkIGRlcHRoIHRvIHdoaWNoIGFuIGVuY29kZWQgVGhyaWZ0IGZpZWxkIGNvdWxkCisgICAgLy8vIGJlIHNraXBwZWQuCisgICAgRGVwdGhMaW1pdCA9IDYsCit9CisKK2ltcGwgUHJvdG9jb2xFcnJvciB7CisgICAgZm4gZGVzY3JpcHRpb24oJnNlbGYpIC0+ICZzdHIgeworICAgICAgICBtYXRjaCBzZWxmLmtpbmQgeworICAgICAgICAgICAgUHJvdG9jb2xFcnJvcktpbmQ6OlVua25vd24gPT4gInByb3RvY29sIGVycm9yIiwKKyAgICAgICAgICAgIFByb3RvY29sRXJyb3JLaW5kOjpJbnZhbGlkRGF0YSA9PiAiYmFkIGRhdGEiLAorICAgICAgICAgICAgUHJvdG9jb2xFcnJvcktpbmQ6Ok5lZ2F0aXZlU2l6ZSA9PiAibmVnYXRpdmUgbWVzc2FnZSBzaXplIiwKKyAgICAgICAgICAgIFByb3RvY29sRXJyb3JLaW5kOjpTaXplTGltaXQgPT4gIm1lc3NhZ2UgdG9vIGxvbmciLAorICAgICAgICAgICAgUHJvdG9jb2xFcnJvcktpbmQ6OkJhZFZlcnNpb24gPT4gImludmFsaWQgdGhyaWZ0IHZlcnNpb24iLAorICAgICAgICAgICAgUHJvdG9jb2xFcnJvcktpbmQ6Ok5vdEltcGxlbWVudGVkID0+ICJub3QgaW1wbGVtZW50ZWQiLAorICAgICAgICAgICAgUHJvdG9jb2xFcnJvcktpbmQ6OkRlcHRoTGltaXQgPT4gIm1heGltdW0gc2tpcCBkZXB0aCByZWFjaGVkIiwKKyAgICAgICAgfQorICAgIH0KK30KKworaW1wbCBEaXNwbGF5IGZvciBQcm90b2NvbEVycm9yIHsKKyAgICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgRm9ybWF0dGVyKSAtPiBmbXQ6OlJlc3VsdCB7CisgICAgICAgIHdyaXRlIShmLCAie30iLCBzZWxmLmRlc2NyaXB0aW9uKCkpCisgICAgfQorfQorCitpbXBsIFRyeUZyb208aTMyPiBmb3IgUHJvdG9jb2xFcnJvcktpbmQgeworICAgIHR5cGUgRXJyID0gRXJyb3I7CisgICAgZm4gdHJ5X2Zyb20oZnJvbTogaTMyKSAtPiBSZXN1bHQ8U2VsZiwgU2VsZjo6RXJyPiB7CisgICAgICAgIG1hdGNoIGZyb20geworICAgICAgICAgICAgMCA9PiBPayhQcm90b2NvbEVycm9yS2luZDo6VW5rbm93biksCisgICAgICAgICAgICAxID0+IE9rKFByb3RvY29sRXJyb3JLaW5kOjpJbnZhbGlkRGF0YSksCisgICAgICAgICAgICAyID0+IE9rKFByb3RvY29sRXJyb3JLaW5kOjpOZWdhdGl2ZVNpemUpLAorICAgICAgICAgICAgMyA9PiBPayhQcm90b2NvbEVycm9yS2luZDo6U2l6ZUxpbWl0KSwKKyAgICAgICAgICAgIDQgPT4gT2soUHJvdG9jb2xFcnJvcktpbmQ6OkJhZFZlcnNpb24pLAorICAgICAgICAgICAgNSA9PiBPayhQcm90b2NvbEVycm9yS2luZDo6Tm90SW1wbGVtZW50ZWQpLAorICAgICAgICAgICAgNiA9PiBPayhQcm90b2NvbEVycm9yS2luZDo6RGVwdGhMaW1pdCksCisgICAgICAgICAgICBfID0+IEVycihFcnJvcjo6UHJvdG9jb2woUHJvdG9jb2xFcnJvciB7CisgICAgICAgICAgICAgICAga2luZDogUHJvdG9jb2xFcnJvcktpbmQ6OlVua25vd24sCisgICAgICAgICAgICAgICAgbWVzc2FnZTogZm9ybWF0ISgiY2Fubm90IGNvbnZlcnQge30gdG8gUHJvdG9jb2xFcnJvcktpbmQiLCBmcm9tKSwKKyAgICAgICAgICAgIH0pKSwKKyAgICAgICAgfQorICAgIH0KK30KKworLy8vIENyZWF0ZSBhIG5ldyBgRXJyb3JgIGluc3RhbmNlIG9mIHR5cGUgYEFwcGxpY2F0aW9uYCB0aGF0IHdyYXBzIGFuCisvLy8gYEFwcGxpY2F0aW9uRXJyb3JgLgorcHViIGZuIG5ld19hcHBsaWNhdGlvbl9lcnJvcjxTOiBJbnRvPFN0cmluZz4+KGtpbmQ6IEFwcGxpY2F0aW9uRXJyb3JLaW5kLCBtZXNzYWdlOiBTKSAtPiBFcnJvciB7CisgICAgRXJyb3I6OkFwcGxpY2F0aW9uKEFwcGxpY2F0aW9uRXJyb3I6Om5ldyhraW5kLCBtZXNzYWdlKSkKK30KKworLy8vIEluZm9ybWF0aW9uIGFib3V0IGVycm9ycyBpbiBhdXRvLWdlbmVyYXRlZCBjb2RlIG9yIGluIHVzZXItaW1wbGVtZW50ZWQKKy8vLyBzZXJ2aWNlIGhhbmRsZXJzLgorI1tkZXJpdmUoRGVidWcsIEVxLCBQYXJ0aWFsRXEpXQorcHViIHN0cnVjdCBBcHBsaWNhdGlvbkVycm9yIHsKKyAgICAvLy8gQXBwbGljYXRpb24gZXJyb3IgdmFyaWFudC4KKyAgICAvLy8KKyAgICAvLy8gSWYgYSBzcGVjaWZpYyBgQXBwbGljYXRpb25FcnJvcktpbmRgIGRvZXMgbm90IGFwcGx5IHVzZQorICAgIC8vLyBgQXBwbGljYXRpb25FcnJvcktpbmQ6OlVua25vd25gLgorICAgIHB1YiBraW5kOiBBcHBsaWNhdGlvbkVycm9yS2luZCwKKyAgICAvLy8gSHVtYW4tcmVhZGFibGUgZXJyb3IgbWVzc2FnZS4KKyAgICBwdWIgbWVzc2FnZTogU3RyaW5nLAorfQorCitpbXBsIEFwcGxpY2F0aW9uRXJyb3IgeworICAgIC8vLyBDcmVhdGUgYSBuZXcgYEFwcGxpY2F0aW9uRXJyb3JgLgorICAgIHB1YiBmbiBuZXc8UzogSW50bzxTdHJpbmc+PihraW5kOiBBcHBsaWNhdGlvbkVycm9yS2luZCwgbWVzc2FnZTogUykgLT4gQXBwbGljYXRpb25FcnJvciB7CisgICAgICAgIEFwcGxpY2F0aW9uRXJyb3IgeworICAgICAgICAgICAga2luZDoga2luZCwKKyAgICAgICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UuaW50bygpLAorICAgICAgICB9CisgICAgfQorfQorCisvLy8gQXV0by1nZW5lcmF0ZWQgb3IgdXNlci1pbXBsZW1lbnRlZCBjb2RlIGVycm9yIGNhdGVnb3JpZXMuCisvLy8KKy8vLyBUaGlzIGxpc3QgbWF5IGdyb3csIGFuZCBpdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gbWF0Y2ggYWdhaW5zdCBpdC4KKyNbZGVyaXZlKENsb25lLCBDb3B5LCBEZWJ1ZywgRXEsIFBhcnRpYWxFcSldCitwdWIgZW51bSBBcHBsaWNhdGlvbkVycm9yS2luZCB7CisgICAgLy8vIENhdGNoLWFsbCBhcHBsaWNhdGlvbiBlcnJvci4KKyAgICBVbmtub3duID0gMCwKKyAgICAvLy8gTWFkZSBzZXJ2aWNlIGNhbGwgdG8gYW4gdW5rbm93biBzZXJ2aWNlIG1ldGhvZC4KKyAgICBVbmtub3duTWV0aG9kID0gMSwKKyAgICAvLy8gUmVjZWl2ZWQgYW4gdW5rbm93biBUaHJpZnQgbWVzc2FnZSB0eXBlLiBUaGF0IGlzLCBub3Qgb25lIG9mIHRoZQorICAgIC8vLyBgdGhyaWZ0Ojpwcm90b2NvbDo6VE1lc3NhZ2VUeXBlYCB2YXJpYW50cy4KKyAgICBJbnZhbGlkTWVzc2FnZVR5cGUgPSAyLAorICAgIC8vLyBNZXRob2QgbmFtZSBpbiBhIHNlcnZpY2UgcmVwbHkgZG9lcyBub3QgbWF0Y2ggdGhlIG5hbWUgb2YgdGhlCisgICAgLy8vIHJlY2VpdmluZyBzZXJ2aWNlIG1ldGhvZC4KKyAgICBXcm9uZ01ldGhvZE5hbWUgPSAzLAorICAgIC8vLyBSZWNlaXZlZCBhbiBvdXQtb2Ytb3JkZXIgVGhyaWZ0IG1lc3NhZ2UuCisgICAgQmFkU2VxdWVuY2VJZCA9IDQsCisgICAgLy8vIFNlcnZpY2UgcmVwbHkgaXMgbWlzc2luZyByZXF1aXJlZCBmaWVsZHMuCisgICAgTWlzc2luZ1Jlc3VsdCA9IDUsCisgICAgLy8vIEF1dG8tZ2VuZXJhdGVkIGNvZGUgZmFpbGVkIHVuZXhwZWN0ZWRseS4KKyAgICBJbnRlcm5hbEVycm9yID0gNiwKKyAgICAvLy8gVGhyaWZ0IHByb3RvY29sIGVycm9yLiBXaGVuIHBvc3NpYmxlIHVzZSBgRXJyb3I6OlByb3RvY29sRXJyb3JgIHdpdGggYQorICAgIC8vLyBzcGVjaWZpYyBgUHJvdG9jb2xFcnJvcktpbmRgIGluc3RlYWQuCisgICAgUHJvdG9jb2xFcnJvciA9IDcsCisgICAgLy8vICpVbmtub3duKi4gSW5jbHVkZWQgb25seSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIFRocmlmdCBpbXBsZW1lbnRhdGlvbnMuCisgICAgSW52YWxpZFRyYW5zZm9ybSA9IDgsIC8vID8/CisgICAgLy8vIFRocmlmdCBlbmRwb2ludCByZXF1ZXN0ZWQsIG9yIGlzIHVzaW5nLCBhbiB1bnN1cHBvcnRlZCBlbmNvZGluZy4KKyAgICBJbnZhbGlkUHJvdG9jb2wgPSA5LCAvLyA/PworICAgIC8vLyBUaHJpZnQgZW5kcG9pbnQgcmVxdWVzdGVkLCBvciBpcyB1c2luZywgYW4gdW5zdXBwb3J0ZWQgYXV0by1nZW5lcmF0ZWQgY2xpZW50IHR5cGUuCisgICAgVW5zdXBwb3J0ZWRDbGllbnRUeXBlID0gMTAsIC8vID8/Cit9CisKK2ltcGwgQXBwbGljYXRpb25FcnJvciB7CisgICAgZm4gZGVzY3JpcHRpb24oJnNlbGYpIC0+ICZzdHIgeworICAgICAgICBtYXRjaCBzZWxmLmtpbmQgeworICAgICAgICAgICAgQXBwbGljYXRpb25FcnJvcktpbmQ6OlVua25vd24gPT4gInNlcnZpY2UgZXJyb3IiLAorICAgICAgICAgICAgQXBwbGljYXRpb25FcnJvcktpbmQ6OlVua25vd25NZXRob2QgPT4gInVua25vd24gc2VydmljZSBtZXRob2QiLAorICAgICAgICAgICAgQXBwbGljYXRpb25FcnJvcktpbmQ6OkludmFsaWRNZXNzYWdlVHlwZSA9PiAid3JvbmcgbWVzc2FnZSB0eXBlIHJlY2VpdmVkIiwKKyAgICAgICAgICAgIEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpXcm9uZ01ldGhvZE5hbWUgPT4gInVua25vd24gbWV0aG9kIHJlcGx5IHJlY2VpdmVkIiwKKyAgICAgICAgICAgIEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpCYWRTZXF1ZW5jZUlkID0+ICJvdXQgb2Ygb3JkZXIgc2VxdWVuY2UgaWQiLAorICAgICAgICAgICAgQXBwbGljYXRpb25FcnJvcktpbmQ6Ok1pc3NpbmdSZXN1bHQgPT4gIm1pc3NpbmcgbWV0aG9kIHJlc3VsdCIsCisgICAgICAgICAgICBBcHBsaWNhdGlvbkVycm9yS2luZDo6SW50ZXJuYWxFcnJvciA9PiAicmVtb3RlIHNlcnZpY2UgdGhyZXcgZXhjZXB0aW9uIiwKKyAgICAgICAgICAgIEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpQcm90b2NvbEVycm9yID0+ICJwcm90b2NvbCBlcnJvciIsCisgICAgICAgICAgICBBcHBsaWNhdGlvbkVycm9yS2luZDo6SW52YWxpZFRyYW5zZm9ybSA9PiAiaW52YWxpZCB0cmFuc2Zvcm0iLAorICAgICAgICAgICAgQXBwbGljYXRpb25FcnJvcktpbmQ6OkludmFsaWRQcm90b2NvbCA9PiAiaW52YWxpZCBwcm90b2NvbCByZXF1ZXN0ZWQiLAorICAgICAgICAgICAgQXBwbGljYXRpb25FcnJvcktpbmQ6OlVuc3VwcG9ydGVkQ2xpZW50VHlwZSA9PiAidW5zdXBwb3J0ZWQgcHJvdG9jb2wgY2xpZW50IiwKKyAgICAgICAgfQorICAgIH0KK30KKworaW1wbCBEaXNwbGF5IGZvciBBcHBsaWNhdGlvbkVycm9yIHsKKyAgICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgRm9ybWF0dGVyKSAtPiBmbXQ6OlJlc3VsdCB7CisgICAgICAgIHdyaXRlIShmLCAie30iLCBzZWxmLmRlc2NyaXB0aW9uKCkpCisgICAgfQorfQorCitpbXBsIFRyeUZyb208aTMyPiBmb3IgQXBwbGljYXRpb25FcnJvcktpbmQgeworICAgIHR5cGUgRXJyID0gRXJyb3I7CisgICAgZm4gdHJ5X2Zyb20oZnJvbTogaTMyKSAtPiBSZXN1bHQ8U2VsZiwgU2VsZjo6RXJyPiB7CisgICAgICAgIG1hdGNoIGZyb20geworICAgICAgICAgICAgMCA9PiBPayhBcHBsaWNhdGlvbkVycm9yS2luZDo6VW5rbm93biksCisgICAgICAgICAgICAxID0+IE9rKEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpVbmtub3duTWV0aG9kKSwKKyAgICAgICAgICAgIDIgPT4gT2soQXBwbGljYXRpb25FcnJvcktpbmQ6OkludmFsaWRNZXNzYWdlVHlwZSksCisgICAgICAgICAgICAzID0+IE9rKEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpXcm9uZ01ldGhvZE5hbWUpLAorICAgICAgICAgICAgNCA9PiBPayhBcHBsaWNhdGlvbkVycm9yS2luZDo6QmFkU2VxdWVuY2VJZCksCisgICAgICAgICAgICA1ID0+IE9rKEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpNaXNzaW5nUmVzdWx0KSwKKyAgICAgICAgICAgIDYgPT4gT2soQXBwbGljYXRpb25FcnJvcktpbmQ6OkludGVybmFsRXJyb3IpLAorICAgICAgICAgICAgNyA9PiBPayhBcHBsaWNhdGlvbkVycm9yS2luZDo6UHJvdG9jb2xFcnJvciksCisgICAgICAgICAgICA4ID0+IE9rKEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpJbnZhbGlkVHJhbnNmb3JtKSwKKyAgICAgICAgICAgIDkgPT4gT2soQXBwbGljYXRpb25FcnJvcktpbmQ6OkludmFsaWRQcm90b2NvbCksCisgICAgICAgICAgICAxMCA9PiBPayhBcHBsaWNhdGlvbkVycm9yS2luZDo6VW5zdXBwb3J0ZWRDbGllbnRUeXBlKSwKKyAgICAgICAgICAgIF8gPT4gRXJyKEVycm9yOjpBcHBsaWNhdGlvbihBcHBsaWNhdGlvbkVycm9yIHsKKyAgICAgICAgICAgICAgICBraW5kOiBBcHBsaWNhdGlvbkVycm9yS2luZDo6VW5rbm93biwKKyAgICAgICAgICAgICAgICBtZXNzYWdlOiBmb3JtYXQhKCJjYW5ub3QgY29udmVydCB7fSB0byBBcHBsaWNhdGlvbkVycm9yS2luZCIsIGZyb20pLAorICAgICAgICAgICAgfSkpLAorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3JzL3NyYy9saWIucnMgYi9saWIvcnMvc3JjL2xpYi5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTVjN2Q2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3NyYy9saWIucnMKQEAgLTAsMCArMSw4NyBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyEgUnVzdCBydW50aW1lIGxpYnJhcnkgZm9yIHRoZSBBcGFjaGUgVGhyaWZ0IFJQQyBzeXN0ZW0uCisvLyEKKy8vISBUaGlzIGNyYXRlIGltcGxlbWVudHMgdGhlIGNvbXBvbmVudHMgcmVxdWlyZWQgdG8gYnVpbGQgYSB3b3JraW5nCisvLyEgVGhyaWZ0IHNlcnZlciBhbmQgY2xpZW50LiBJdCBpcyBkaXZpZGVkIGludG8gdGhlIGZvbGxvd2luZyBtb2R1bGVzOgorLy8hCisvLyEgMS4gZXJyb3JzCisvLyEgMi4gcHJvdG9jb2wKKy8vISAzLiB0cmFuc3BvcnQKKy8vISA0LiBzZXJ2ZXIKKy8vISA1LiBhdXRvZ2VuCisvLyEKKy8vISBUaGUgbW9kdWxlcyBhcmUgbGF5ZXJlZCBhcyBzaG93biBpbiB0aGUgZGlhZ3JhbSBiZWxvdy4gVGhlIGBhdXRvZ2VuJ2RgCisvLyEgbGF5ZXIgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBUaHJpZnQgY29tcGlsZXIncyBSdXN0IHBsdWdpbi4gSXQgdXNlcyB0aGUKKy8vISB0eXBlcyBhbmQgZnVuY3Rpb25zIGRlZmluZWQgaW4gdGhpcyBjcmF0ZSB0byBzZXJpYWxpemUgYW5kIGRlc2VyaWFsaXplCisvLyEgbWVzc2FnZXMgYW5kIGltcGxlbWVudCBSUEMuIFVzZXJzIGludGVyYWN0IHdpdGggdGhlc2UgdHlwZXMgYW5kIHNlcnZpY2VzCisvLyEgYnkgd3JpdGluZyB0aGVpciBvd24gY29kZSB0aGF0IHVzZXMgdGhlIGF1dG8tZ2VuZXJhdGVkIGNsaWVudHMgYW5kCisvLyEgc2VydmVycy4KKy8vIQorLy8hIGBgYHRleHQKKy8vISArLS0tLS0tLS0tLS0rCisvLyEgfCB1c2VyIGFwcCAgfAorLy8hICstLS0tLS0tLS0tLSsKKy8vISB8IGF1dG9nZW4nZCB8ICh1c2VzIGVycm9ycywgYXV0b2dlbikKKy8vISArLS0tLS0tLS0tLS0rCisvLyEgfCAgcHJvdG9jb2wgfAorLy8hICstLS0tLS0tLS0tLSsKKy8vISB8IHRyYW5zcG9ydCB8CisvLyEgKy0tLS0tLS0tLS0tKworLy8hIGBgYAorCisjIVtjcmF0ZV90eXBlID0gImxpYiJdCisjIVtkb2ModGVzdChhdHRyKGFsbG93KHVudXNlZF92YXJpYWJsZXMpLCBkZW55KHdhcm5pbmdzKSkpKV0KKworZXh0ZXJuIGNyYXRlIGJ5dGVvcmRlcjsKK2V4dGVybiBjcmF0ZSBpbnRlZ2VyX2VuY29kaW5nOworZXh0ZXJuIGNyYXRlIHRocmVhZHBvb2w7CitleHRlcm4gY3JhdGUgdHJ5X2Zyb207CisKKyNbbWFjcm9fdXNlXQorZXh0ZXJuIGNyYXRlIGxvZzsKKworLy8gTk9URTogdGhpcyBtYWNybyBoYXMgdG8gYmUgZGVmaW5lZCBiZWZvcmUgYW55IG1vZHVsZXMuIFNlZToKKy8vIGh0dHBzOi8vZGFuaWVsa2VlcC5naXRodWIuaW8vcXVpY2staW50cm8tdG8tbWFjcm9zLmh0bWwjc29tZS1tb3JlLWdvdGNoYXMKKworLy8vIEFzc2VydCB0aGF0IGFuIGV4cHJlc3Npb24gcmV0dXJuaW5nIGEgYFJlc3VsdGAgaXMgYSBzdWNjZXNzLiBJZiBpdCBpcywKKy8vLyByZXR1cm4gdGhlIHZhbHVlIGNvbnRhaW5lZCBpbiB0aGUgcmVzdWx0LCBpLmUuIGBleHByLnVud3JhcCgpYC4KKyNbY2ZnKHRlc3QpXQorbWFjcm9fcnVsZXMhIGFzc2VydF9zdWNjZXNzIHsKKyAgICAoJGU6IGV4cHIpID0+IHt7CisgICAgICAgIGxldCByZXMgPSAkZTsKKyAgICAgICAgYXNzZXJ0IShyZXMuaXNfb2soKSk7CisgICAgICAgIHJlcy51bndyYXAoKQorICAgIH19OworfQorCitwdWIgbW9kIHByb3RvY29sOworcHViIG1vZCBzZXJ2ZXI7CitwdWIgbW9kIHRyYW5zcG9ydDsKKworbW9kIGVycm9yczsKK3B1YiB1c2UgZXJyb3JzOjoqOworCittb2QgYXV0b2dlbjsKK3B1YiB1c2UgYXV0b2dlbjo6KjsKKworLy8vIFJlc3VsdCB0eXBlIHJldHVybmVkIGJ5IGFsbCBydW50aW1lIGxpYnJhcnkgZnVuY3Rpb25zLgorLy8vCisvLy8gQXMgaXMgY29udmVudGlvbiB0aGlzIGlzIGEgdHlwZWRlZiBvZiBgc3RkOjpyZXN1bHQ6OlJlc3VsdGAKKy8vLyB3aXRoIGBFYCBkZWZpbmVkIGFzIHRoZSBgdGhyaWZ0OjpFcnJvcmAgdHlwZS4KK3B1YiB0eXBlIFJlc3VsdDxUPiA9IHN0ZDo6cmVzdWx0OjpSZXN1bHQ8VCwgc2VsZjo6RXJyb3I+OwpkaWZmIC0tZ2l0IGEvbGliL3JzL3NyYy9wcm90b2NvbC9iaW5hcnkucnMgYi9saWIvcnMvc3JjL3Byb3RvY29sL2JpbmFyeS5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWFmZjNkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3NyYy9wcm90b2NvbC9iaW5hcnkucnMKQEAgLTAsMCArMSw5NTcgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNlIGJ5dGVvcmRlcjo6e0JpZ0VuZGlhbiwgQnl0ZU9yZGVyLCBSZWFkQnl0ZXNFeHQsIFdyaXRlQnl0ZXNFeHR9OwordXNlIHN0ZDo6Y29udmVydDo6RnJvbTsKK3VzZSB0cnlfZnJvbTo6VHJ5RnJvbTsKKwordXNlIHN1cGVyOjp7CisgICAgVEZpZWxkSWRlbnRpZmllciwgVElucHV0UHJvdG9jb2wsIFRJbnB1dFByb3RvY29sRmFjdG9yeSwgVExpc3RJZGVudGlmaWVyLCBUTWFwSWRlbnRpZmllciwKKyAgICBUTWVzc2FnZUlkZW50aWZpZXIsIFRNZXNzYWdlVHlwZSwKK307Cit1c2Ugc3VwZXI6OntUT3V0cHV0UHJvdG9jb2wsIFRPdXRwdXRQcm90b2NvbEZhY3RvcnksIFRTZXRJZGVudGlmaWVyLCBUU3RydWN0SWRlbnRpZmllciwgVFR5cGV9OwordXNlIHRyYW5zcG9ydDo6e1RSZWFkVHJhbnNwb3J0LCBUV3JpdGVUcmFuc3BvcnR9OwordXNlIHtQcm90b2NvbEVycm9yLCBQcm90b2NvbEVycm9yS2luZH07CisKK2NvbnN0IEJJTkFSWV9QUk9UT0NPTF9WRVJTSU9OXzE6IHUzMiA9IDB4ODAwMTAwMDA7CisKKy8vLyBSZWFkIG1lc3NhZ2VzIGVuY29kZWQgaW4gdGhlIFRocmlmdCBzaW1wbGUgYmluYXJ5IGVuY29kaW5nLgorLy8vCisvLy8gVGhlcmUgYXJlIHR3byBhdmFpbGFibGUgbW9kZXM6IGBzdHJpY3RgIGFuZCBgbm9uLXN0cmljdGAsIHdoZXJlIHRoZQorLy8vIGBub24tc3RyaWN0YCB2ZXJzaW9uIGRvZXMgbm90IGNoZWNrIGZvciB0aGUgcHJvdG9jb2wgdmVyc2lvbiBpbiB0aGUKKy8vLyByZWNlaXZlZCBtZXNzYWdlIGhlYWRlci4KKy8vLworLy8vICMgRXhhbXBsZXMKKy8vLworLy8vIENyZWF0ZSBhbmQgdXNlIGEgYFRCaW5hcnlJbnB1dFByb3RvY29sYC4KKy8vLworLy8vIGBgYG5vX3J1bgorLy8vIHVzZSB0aHJpZnQ6OnByb3RvY29sOjp7VEJpbmFyeUlucHV0UHJvdG9jb2wsIFRJbnB1dFByb3RvY29sfTsKKy8vLyB1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUY3BDaGFubmVsOworLy8vCisvLy8gbGV0IG11dCBjaGFubmVsID0gVFRjcENoYW5uZWw6Om5ldygpOworLy8vIGNoYW5uZWwub3BlbigibG9jYWxob3N0OjkwOTAiKS51bndyYXAoKTsKKy8vLworLy8vIGxldCBtdXQgcHJvdG9jb2wgPSBUQmluYXJ5SW5wdXRQcm90b2NvbDo6bmV3KGNoYW5uZWwsIHRydWUpOworLy8vCisvLy8gbGV0IHJlY3ZkX2Jvb2wgPSBwcm90b2NvbC5yZWFkX2Jvb2woKS51bndyYXAoKTsKKy8vLyBsZXQgcmVjdmRfc3RyaW5nID0gcHJvdG9jb2wucmVhZF9zdHJpbmcoKS51bndyYXAoKTsKKy8vLyBgYGAKKyNbZGVyaXZlKERlYnVnKV0KK3B1YiBzdHJ1Y3QgVEJpbmFyeUlucHV0UHJvdG9jb2w8VD4KK3doZXJlCisgICAgVDogVFJlYWRUcmFuc3BvcnQsCit7CisgICAgc3RyaWN0OiBib29sLAorICAgIHB1YiB0cmFuc3BvcnQ6IFQsIC8vIEZJWE1FOiBzaG91bGRuJ3QgYmUgcHVibGljCit9CisKK2ltcGw8J2EsIFQ+IFRCaW5hcnlJbnB1dFByb3RvY29sPFQ+Cit3aGVyZQorICAgIFQ6IFRSZWFkVHJhbnNwb3J0LAoreworICAgIC8vLyBDcmVhdGUgYSBgVEJpbmFyeUlucHV0UHJvdG9jb2xgIHRoYXQgcmVhZHMgYnl0ZXMgZnJvbSBgdHJhbnNwb3J0YC4KKyAgICAvLy8KKyAgICAvLy8gU2V0IGBzdHJpY3RgIHRvIGB0cnVlYCBpZiBhbGwgaW5jb21pbmcgbWVzc2FnZXMgY29udGFpbiB0aGUgcHJvdG9jb2wKKyAgICAvLy8gdmVyc2lvbiBudW1iZXIgaW4gdGhlIHByb3RvY29sIGhlYWRlci4KKyAgICBwdWIgZm4gbmV3KHRyYW5zcG9ydDogVCwgc3RyaWN0OiBib29sKSAtPiBUQmluYXJ5SW5wdXRQcm90b2NvbDxUPiB7CisgICAgICAgIFRCaW5hcnlJbnB1dFByb3RvY29sIHsKKyAgICAgICAgICAgIHN0cmljdDogc3RyaWN0LAorICAgICAgICAgICAgdHJhbnNwb3J0OiB0cmFuc3BvcnQsCisgICAgICAgIH0KKyAgICB9Cit9CisKK2ltcGw8VD4gVElucHV0UHJvdG9jb2wgZm9yIFRCaW5hcnlJbnB1dFByb3RvY29sPFQ+Cit3aGVyZQorICAgIFQ6IFRSZWFkVHJhbnNwb3J0LAoreworICAgICNbY2ZnX2F0dHIoZmVhdHVyZSA9ICJjYXJnby1jbGlwcHkiLCBhbGxvdyhjb2xsYXBzaWJsZV9pZikpXQorICAgIGZuIHJlYWRfbWVzc2FnZV9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRNZXNzYWdlSWRlbnRpZmllcj4geworICAgICAgICBsZXQgbXV0IGZpcnN0X2J5dGVzID0gdmVjIVswOyA0XTsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQucmVhZF9leGFjdCgmbXV0IGZpcnN0X2J5dGVzWy4uXSk/OworCisgICAgICAgIC8vIHRoZSB0aHJpZnQgdmVyc2lvbiBoZWFkZXIgaXMgaW50ZW50aW9uYWxseSBuZWdhdGl2ZQorICAgICAgICAvLyBzbyB0aGUgZmlyc3QgY2hlY2sgd2UnbGwgZG8gaXMgc2VlIGlmIHRoZSBzaWduIGJpdCBpcyBzZXQKKyAgICAgICAgLy8gYW5kIGlmIHNvIC0gYXNzdW1lIGl0J3MgdGhlIHByb3RvY29sLXZlcnNpb24gaGVhZGVyCisgICAgICAgIGlmIGZpcnN0X2J5dGVzWzBdID49IDggeworICAgICAgICAgICAgLy8gYXBwYXJlbnRseSB3ZSBnb3QgYSBwcm90b2NvbC12ZXJzaW9uIGhlYWRlciAtIGNoZWNrCisgICAgICAgICAgICAvLyBpdCwgYW5kIGlmIGl0IG1hdGNoZXMsIHJlYWQgdGhlIHJlc3Qgb2YgdGhlIGZpZWxkcworICAgICAgICAgICAgaWYgZmlyc3RfYnl0ZXNbMC4uMl0gIT0gWzB4ODAsIDB4MDFdIHsKKyAgICAgICAgICAgICAgICBFcnIoOjpFcnJvcjo6UHJvdG9jb2woUHJvdG9jb2xFcnJvciB7CisgICAgICAgICAgICAgICAgICAgIGtpbmQ6IFByb3RvY29sRXJyb3JLaW5kOjpCYWRWZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBmb3JtYXQhKCJyZWNlaXZlZCBiYWQgdmVyc2lvbjogezo/fSIsICZmaXJzdF9ieXRlc1swLi4yXSksCisgICAgICAgICAgICAgICAgfSkpCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxldCBtZXNzYWdlX3R5cGU6IFRNZXNzYWdlVHlwZSA9IFRyeUZyb206OnRyeV9mcm9tKGZpcnN0X2J5dGVzWzNdKT87CisgICAgICAgICAgICAgICAgbGV0IG5hbWUgPSBzZWxmLnJlYWRfc3RyaW5nKCk/OworICAgICAgICAgICAgICAgIGxldCBzZXF1ZW5jZV9udW1iZXIgPSBzZWxmLnJlYWRfaTMyKCk/OworICAgICAgICAgICAgICAgIE9rKFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KG5hbWUsIG1lc3NhZ2VfdHlwZSwgc2VxdWVuY2VfbnVtYmVyKSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGFwcGFyZW50bHkgd2UgZGlkbid0IGdldCBhIHByb3RvY29sLXZlcnNpb24gaGVhZGVyLAorICAgICAgICAgICAgLy8gd2hpY2ggaGFwcGVucyBpZiB0aGUgc2VuZGVyIGlzIG5vdCB1c2luZyB0aGUgc3RyaWN0IHByb3RvY29sCisgICAgICAgICAgICBpZiBzZWxmLnN0cmljdCB7CisgICAgICAgICAgICAgICAgLy8gd2UncmUgaW4gc3RyaWN0IG1vZGUgaG93ZXZlciwgYW5kIHRoYXQgYWx3YXlzCisgICAgICAgICAgICAgICAgLy8gcmVxdWlyZXMgdGhlIHByb3RvY29sLXZlcnNpb24gaGVhZGVyIHRvIGJlIHdyaXR0ZW4gZmlyc3QKKyAgICAgICAgICAgICAgICBFcnIoOjpFcnJvcjo6UHJvdG9jb2woUHJvdG9jb2xFcnJvciB7CisgICAgICAgICAgICAgICAgICAgIGtpbmQ6IFByb3RvY29sRXJyb3JLaW5kOjpCYWRWZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBmb3JtYXQhKCJyZWNlaXZlZCBiYWQgdmVyc2lvbjogezo/fSIsICZmaXJzdF9ieXRlc1swLi4yXSksCisgICAgICAgICAgICAgICAgfSkpCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGluIHRoZSBub24tc3RyaWN0IHZlcnNpb24gdGhlIGZpcnN0IG1lc3NhZ2UgZmllbGQKKyAgICAgICAgICAgICAgICAvLyBpcyB0aGUgbWVzc2FnZSBuYW1lLiBzdHJpbmdzIChieXRlIGFycmF5cykgYXJlIGxlbmd0aC1wcmVmaXhlZCwKKyAgICAgICAgICAgICAgICAvLyBzbyB3ZSd2ZSBqdXN0IHJlYWQgdGhlIGxlbmd0aCBpbiB0aGUgZmlyc3QgNCBieXRlcworICAgICAgICAgICAgICAgIGxldCBuYW1lX3NpemUgPSBCaWdFbmRpYW46OnJlYWRfaTMyKCZmaXJzdF9ieXRlcykgYXMgdXNpemU7CisgICAgICAgICAgICAgICAgbGV0IG11dCBuYW1lX2J1ZjogVmVjPHU4PiA9IHZlYyFbMDsgbmFtZV9zaXplXTsKKyAgICAgICAgICAgICAgICBzZWxmLnRyYW5zcG9ydC5yZWFkX2V4YWN0KCZtdXQgbmFtZV9idWYpPzsKKyAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IFN0cmluZzo6ZnJvbV91dGY4KG5hbWVfYnVmKT87CisKKyAgICAgICAgICAgICAgICAvLyByZWFkIHRoZSByZXN0IG9mIHRoZSBmaWVsZHMKKyAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZV90eXBlOiBUTWVzc2FnZVR5cGUgPSBzZWxmLnJlYWRfYnl0ZSgpLmFuZF90aGVuKFRyeUZyb206OnRyeV9mcm9tKT87CisgICAgICAgICAgICAgICAgbGV0IHNlcXVlbmNlX251bWJlciA9IHNlbGYucmVhZF9pMzIoKT87CisgICAgICAgICAgICAgICAgT2soVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcobmFtZSwgbWVzc2FnZV90eXBlLCBzZXF1ZW5jZV9udW1iZXIpKQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZm4gcmVhZF9tZXNzYWdlX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHJlYWRfc3RydWN0X2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8T3B0aW9uPFRTdHJ1Y3RJZGVudGlmaWVyPj4geworICAgICAgICBPayhOb25lKQorICAgIH0KKworICAgIGZuIHJlYWRfc3RydWN0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHJlYWRfZmllbGRfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxURmllbGRJZGVudGlmaWVyPiB7CisgICAgICAgIGxldCBmaWVsZF90eXBlX2J5dGUgPSBzZWxmLnJlYWRfYnl0ZSgpPzsKKyAgICAgICAgbGV0IGZpZWxkX3R5cGUgPSBmaWVsZF90eXBlX2Zyb21fdTgoZmllbGRfdHlwZV9ieXRlKT87CisgICAgICAgIGxldCBpZCA9IG1hdGNoIGZpZWxkX3R5cGUgeworICAgICAgICAgICAgVFR5cGU6OlN0b3AgPT4gT2soMCksCisgICAgICAgICAgICBfID0+IHNlbGYucmVhZF9pMTYoKSwKKyAgICAgICAgfT87CisgICAgICAgIE9rKFRGaWVsZElkZW50aWZpZXI6Om5ldzo6PE9wdGlvbjxTdHJpbmc+LCBTdHJpbmcsIGkxNj4oCisgICAgICAgICAgICBOb25lLCBmaWVsZF90eXBlLCBpZCwKKyAgICAgICAgKSkKKyAgICB9CisKKyAgICBmbiByZWFkX2ZpZWxkX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHJlYWRfYnl0ZXMoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxWZWM8dTg+PiB7CisgICAgICAgIGxldCBudW1fYnl0ZXMgPSBzZWxmLnRyYW5zcG9ydC5yZWFkX2kzMjo6PEJpZ0VuZGlhbj4oKT8gYXMgdXNpemU7CisgICAgICAgIGxldCBtdXQgYnVmID0gdmVjIVswdTg7IG51bV9ieXRlc107CisgICAgICAgIHNlbGYudHJhbnNwb3J0CisgICAgICAgICAgICAucmVhZF9leGFjdCgmbXV0IGJ1ZikKKyAgICAgICAgICAgIC5tYXAofF98IGJ1ZikKKyAgICAgICAgICAgIC5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgZm4gcmVhZF9ib29sKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8Ym9vbD4geworICAgICAgICBsZXQgYiA9IHNlbGYucmVhZF9pOCgpPzsKKyAgICAgICAgbWF0Y2ggYiB7CisgICAgICAgICAgICAwID0+IE9rKGZhbHNlKSwKKyAgICAgICAgICAgIF8gPT4gT2sodHJ1ZSksCisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbiByZWFkX2k4KCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8aTg+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQucmVhZF9pOCgpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICBmbiByZWFkX2kxNigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGkxNj4geworICAgICAgICBzZWxmLnRyYW5zcG9ydC5yZWFkX2kxNjo6PEJpZ0VuZGlhbj4oKS5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgZm4gcmVhZF9pMzIoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxpMzI+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQucmVhZF9pMzI6OjxCaWdFbmRpYW4+KCkubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIGZuIHJlYWRfaTY0KCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8aTY0PiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0LnJlYWRfaTY0Ojo8QmlnRW5kaWFuPigpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICBmbiByZWFkX2RvdWJsZSgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGY2ND4geworICAgICAgICBzZWxmLnRyYW5zcG9ydC5yZWFkX2Y2NDo6PEJpZ0VuZGlhbj4oKS5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgZm4gcmVhZF9zdHJpbmcoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxTdHJpbmc+IHsKKyAgICAgICAgbGV0IGJ5dGVzID0gc2VsZi5yZWFkX2J5dGVzKCk/OworICAgICAgICBTdHJpbmc6OmZyb21fdXRmOChieXRlcykubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIGZuIHJlYWRfbGlzdF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRMaXN0SWRlbnRpZmllcj4geworICAgICAgICBsZXQgZWxlbWVudF90eXBlOiBUVHlwZSA9IHNlbGYucmVhZF9ieXRlKCkuYW5kX3RoZW4oZmllbGRfdHlwZV9mcm9tX3U4KT87CisgICAgICAgIGxldCBzaXplID0gc2VsZi5yZWFkX2kzMigpPzsKKyAgICAgICAgT2soVExpc3RJZGVudGlmaWVyOjpuZXcoZWxlbWVudF90eXBlLCBzaXplKSkKKyAgICB9CisKKyAgICBmbiByZWFkX2xpc3RfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gcmVhZF9zZXRfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxUU2V0SWRlbnRpZmllcj4geworICAgICAgICBsZXQgZWxlbWVudF90eXBlOiBUVHlwZSA9IHNlbGYucmVhZF9ieXRlKCkuYW5kX3RoZW4oZmllbGRfdHlwZV9mcm9tX3U4KT87CisgICAgICAgIGxldCBzaXplID0gc2VsZi5yZWFkX2kzMigpPzsKKyAgICAgICAgT2soVFNldElkZW50aWZpZXI6Om5ldyhlbGVtZW50X3R5cGUsIHNpemUpKQorICAgIH0KKworICAgIGZuIHJlYWRfc2V0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHJlYWRfbWFwX2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VE1hcElkZW50aWZpZXI+IHsKKyAgICAgICAgbGV0IGtleV90eXBlOiBUVHlwZSA9IHNlbGYucmVhZF9ieXRlKCkuYW5kX3RoZW4oZmllbGRfdHlwZV9mcm9tX3U4KT87CisgICAgICAgIGxldCB2YWx1ZV90eXBlOiBUVHlwZSA9IHNlbGYucmVhZF9ieXRlKCkuYW5kX3RoZW4oZmllbGRfdHlwZV9mcm9tX3U4KT87CisgICAgICAgIGxldCBzaXplID0gc2VsZi5yZWFkX2kzMigpPzsKKyAgICAgICAgT2soVE1hcElkZW50aWZpZXI6Om5ldyhrZXlfdHlwZSwgdmFsdWVfdHlwZSwgc2l6ZSkpCisgICAgfQorCisgICAgZm4gcmVhZF9tYXBfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgLy8gdXRpbGl0eQorICAgIC8vCisKKyAgICBmbiByZWFkX2J5dGUoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDx1OD4geworICAgICAgICBzZWxmLnRyYW5zcG9ydC5yZWFkX3U4KCkubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KK30KKworLy8vIEZhY3RvcnkgZm9yIGNyZWF0aW5nIGluc3RhbmNlcyBvZiBgVEJpbmFyeUlucHV0UHJvdG9jb2xgLgorI1tkZXJpdmUoRGVmYXVsdCldCitwdWIgc3RydWN0IFRCaW5hcnlJbnB1dFByb3RvY29sRmFjdG9yeTsKKworaW1wbCBUQmluYXJ5SW5wdXRQcm90b2NvbEZhY3RvcnkgeworICAgIC8vLyBDcmVhdGUgYSBgVEJpbmFyeUlucHV0UHJvdG9jb2xGYWN0b3J5YC4KKyAgICBwdWIgZm4gbmV3KCkgLT4gVEJpbmFyeUlucHV0UHJvdG9jb2xGYWN0b3J5IHsKKyAgICAgICAgVEJpbmFyeUlucHV0UHJvdG9jb2xGYWN0b3J5IHt9CisgICAgfQorfQorCitpbXBsIFRJbnB1dFByb3RvY29sRmFjdG9yeSBmb3IgVEJpbmFyeUlucHV0UHJvdG9jb2xGYWN0b3J5IHsKKyAgICBmbiBjcmVhdGUoJnNlbGYsIHRyYW5zcG9ydDogQm94PFRSZWFkVHJhbnNwb3J0ICsgU2VuZD4pIC0+IEJveDxUSW5wdXRQcm90b2NvbCArIFNlbmQ+IHsKKyAgICAgICAgQm94OjpuZXcoVEJpbmFyeUlucHV0UHJvdG9jb2w6Om5ldyh0cmFuc3BvcnQsIHRydWUpKQorICAgIH0KK30KKworLy8vIFdyaXRlIG1lc3NhZ2VzIHVzaW5nIHRoZSBUaHJpZnQgc2ltcGxlIGJpbmFyeSBlbmNvZGluZy4KKy8vLworLy8vIFRoZXJlIGFyZSB0d28gYXZhaWxhYmxlIG1vZGVzOiBgc3RyaWN0YCBhbmQgYG5vbi1zdHJpY3RgLCB3aGVyZSB0aGUKKy8vLyBgc3RyaWN0YCB2ZXJzaW9uIHdyaXRlcyB0aGUgcHJvdG9jb2wgdmVyc2lvbiBudW1iZXIgaW4gdGhlIG91dGdvaW5nIG1lc3NhZ2UKKy8vLyBoZWFkZXIgYW5kIHRoZSBgbm9uLXN0cmljdGAgdmVyc2lvbiBkb2VzIG5vdC4KKy8vLworLy8vICMgRXhhbXBsZXMKKy8vLworLy8vIENyZWF0ZSBhbmQgdXNlIGEgYFRCaW5hcnlPdXRwdXRQcm90b2NvbGAuCisvLy8KKy8vLyBgYGBub19ydW4KKy8vLyB1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RCaW5hcnlPdXRwdXRQcm90b2NvbCwgVE91dHB1dFByb3RvY29sfTsKKy8vLyB1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUY3BDaGFubmVsOworLy8vCisvLy8gbGV0IG11dCBjaGFubmVsID0gVFRjcENoYW5uZWw6Om5ldygpOworLy8vIGNoYW5uZWwub3BlbigibG9jYWxob3N0OjkwOTAiKS51bndyYXAoKTsKKy8vLworLy8vIGxldCBtdXQgcHJvdG9jb2wgPSBUQmluYXJ5T3V0cHV0UHJvdG9jb2w6Om5ldyhjaGFubmVsLCB0cnVlKTsKKy8vLworLy8vIHByb3RvY29sLndyaXRlX2Jvb2wodHJ1ZSkudW53cmFwKCk7CisvLy8gcHJvdG9jb2wud3JpdGVfc3RyaW5nKCJ0ZXN0X3N0cmluZyIpLnVud3JhcCgpOworLy8vIGBgYAorI1tkZXJpdmUoRGVidWcpXQorcHViIHN0cnVjdCBUQmluYXJ5T3V0cHV0UHJvdG9jb2w8VD4KK3doZXJlCisgICAgVDogVFdyaXRlVHJhbnNwb3J0LAoreworICAgIHN0cmljdDogYm9vbCwKKyAgICBwdWIgdHJhbnNwb3J0OiBULCAvLyBGSVhNRTogZG8gbm90IG1ha2UgcHVibGljOyBvbmx5IHB1YmxpYyBmb3IgdGVzdGluZyEKK30KKworaW1wbDxUPiBUQmluYXJ5T3V0cHV0UHJvdG9jb2w8VD4KK3doZXJlCisgICAgVDogVFdyaXRlVHJhbnNwb3J0LAoreworICAgIC8vLyBDcmVhdGUgYSBgVEJpbmFyeU91dHB1dFByb3RvY29sYCB0aGF0IHdyaXRlcyBieXRlcyB0byBgdHJhbnNwb3J0YC4KKyAgICAvLy8KKyAgICAvLy8gU2V0IGBzdHJpY3RgIHRvIGB0cnVlYCBpZiBhbGwgb3V0Z29pbmcgbWVzc2FnZXMgc2hvdWxkIGNvbnRhaW4gdGhlCisgICAgLy8vIHByb3RvY29sIHZlcnNpb24gbnVtYmVyIGluIHRoZSBwcm90b2NvbCBoZWFkZXIuCisgICAgcHViIGZuIG5ldyh0cmFuc3BvcnQ6IFQsIHN0cmljdDogYm9vbCkgLT4gVEJpbmFyeU91dHB1dFByb3RvY29sPFQ+IHsKKyAgICAgICAgVEJpbmFyeU91dHB1dFByb3RvY29sIHsKKyAgICAgICAgICAgIHN0cmljdDogc3RyaWN0LAorICAgICAgICAgICAgdHJhbnNwb3J0OiB0cmFuc3BvcnQsCisgICAgICAgIH0KKyAgICB9Cit9CisKK2ltcGw8VD4gVE91dHB1dFByb3RvY29sIGZvciBUQmluYXJ5T3V0cHV0UHJvdG9jb2w8VD4KK3doZXJlCisgICAgVDogVFdyaXRlVHJhbnNwb3J0LAoreworICAgIGZuIHdyaXRlX21lc3NhZ2VfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVE1lc3NhZ2VJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBpZiBzZWxmLnN0cmljdCB7CisgICAgICAgICAgICBsZXQgbWVzc2FnZV90eXBlOiB1OCA9IGlkZW50aWZpZXIubWVzc2FnZV90eXBlLmludG8oKTsKKyAgICAgICAgICAgIGxldCBoZWFkZXIgPSBCSU5BUllfUFJPVE9DT0xfVkVSU0lPTl8xIHwgKG1lc3NhZ2VfdHlwZSBhcyB1MzIpOworICAgICAgICAgICAgc2VsZi50cmFuc3BvcnQud3JpdGVfdTMyOjo8QmlnRW5kaWFuPihoZWFkZXIpPzsKKyAgICAgICAgICAgIHNlbGYud3JpdGVfc3RyaW5nKCZpZGVudGlmaWVyLm5hbWUpPzsKKyAgICAgICAgICAgIHNlbGYud3JpdGVfaTMyKGlkZW50aWZpZXIuc2VxdWVuY2VfbnVtYmVyKQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VsZi53cml0ZV9zdHJpbmcoJmlkZW50aWZpZXIubmFtZSk/OworICAgICAgICAgICAgc2VsZi53cml0ZV9ieXRlKGlkZW50aWZpZXIubWVzc2FnZV90eXBlLmludG8oKSk/OworICAgICAgICAgICAgc2VsZi53cml0ZV9pMzIoaWRlbnRpZmllci5zZXF1ZW5jZV9udW1iZXIpCisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbiB3cml0ZV9tZXNzYWdlX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHdyaXRlX3N0cnVjdF9iZWdpbigmbXV0IHNlbGYsIF86ICZUU3RydWN0SWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gd3JpdGVfc3RydWN0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHdyaXRlX2ZpZWxkX2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRGaWVsZElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIGlmIGlkZW50aWZpZXIuaWQuaXNfbm9uZSgpICYmIGlkZW50aWZpZXIuZmllbGRfdHlwZSAhPSBUVHlwZTo6U3RvcCB7CisgICAgICAgICAgICByZXR1cm4gRXJyKDo6RXJyb3I6OlByb3RvY29sKFByb3RvY29sRXJyb3IgeworICAgICAgICAgICAgICAgIGtpbmQ6IFByb3RvY29sRXJyb3JLaW5kOjpVbmtub3duLAorICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoCisgICAgICAgICAgICAgICAgICAgICJjYW5ub3Qgd3JpdGUgaWRlbnRpZmllciB7Oj99IHdpdGhvdXQgc2VxdWVuY2UgbnVtYmVyIiwKKyAgICAgICAgICAgICAgICAgICAgJmlkZW50aWZpZXIKKyAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgfSkpOworICAgICAgICB9CisKKyAgICAgICAgc2VsZi53cml0ZV9ieXRlKGZpZWxkX3R5cGVfdG9fdTgoaWRlbnRpZmllci5maWVsZF90eXBlKSk/OworICAgICAgICBpZiBsZXQgU29tZShpZCkgPSBpZGVudGlmaWVyLmlkIHsKKyAgICAgICAgICAgIHNlbGYud3JpdGVfaTE2KGlkKQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgT2soKCkpCisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbiB3cml0ZV9maWVsZF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9maWVsZF9zdG9wKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi53cml0ZV9ieXRlKGZpZWxkX3R5cGVfdG9fdTgoVFR5cGU6OlN0b3ApKQorICAgIH0KKworICAgIGZuIHdyaXRlX2J5dGVzKCZtdXQgc2VsZiwgYjogJlt1OF0pIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYud3JpdGVfaTMyKGIubGVuKCkgYXMgaTMyKT87CisgICAgICAgIHNlbGYudHJhbnNwb3J0LndyaXRlX2FsbChiKS5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgZm4gd3JpdGVfYm9vbCgmbXV0IHNlbGYsIGI6IGJvb2wpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIGlmIGIgeworICAgICAgICAgICAgc2VsZi53cml0ZV9pOCgxKQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VsZi53cml0ZV9pOCgwKQorICAgICAgICB9CisgICAgfQorCisgICAgZm4gd3JpdGVfaTgoJm11dCBzZWxmLCBpOiBpOCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQud3JpdGVfaTgoaSkubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIGZuIHdyaXRlX2kxNigmbXV0IHNlbGYsIGk6IGkxNikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQud3JpdGVfaTE2Ojo8QmlnRW5kaWFuPihpKS5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgZm4gd3JpdGVfaTMyKCZtdXQgc2VsZiwgaTogaTMyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLnRyYW5zcG9ydC53cml0ZV9pMzI6OjxCaWdFbmRpYW4+KGkpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9pNjQoJm11dCBzZWxmLCBpOiBpNjQpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0LndyaXRlX2k2NDo6PEJpZ0VuZGlhbj4oaSkubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIGZuIHdyaXRlX2RvdWJsZSgmbXV0IHNlbGYsIGQ6IGY2NCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQud3JpdGVfZjY0Ojo8QmlnRW5kaWFuPihkKS5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgZm4gd3JpdGVfc3RyaW5nKCZtdXQgc2VsZiwgczogJnN0cikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi53cml0ZV9ieXRlcyhzLmFzX2J5dGVzKCkpCisgICAgfQorCisgICAgZm4gd3JpdGVfbGlzdF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUTGlzdElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYud3JpdGVfYnl0ZShmaWVsZF90eXBlX3RvX3U4KGlkZW50aWZpZXIuZWxlbWVudF90eXBlKSk/OworICAgICAgICBzZWxmLndyaXRlX2kzMihpZGVudGlmaWVyLnNpemUpCisgICAgfQorCisgICAgZm4gd3JpdGVfbGlzdF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9zZXRfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVFNldElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYud3JpdGVfYnl0ZShmaWVsZF90eXBlX3RvX3U4KGlkZW50aWZpZXIuZWxlbWVudF90eXBlKSk/OworICAgICAgICBzZWxmLndyaXRlX2kzMihpZGVudGlmaWVyLnNpemUpCisgICAgfQorCisgICAgZm4gd3JpdGVfc2V0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHdyaXRlX21hcF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUTWFwSWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgbGV0IGtleV90eXBlID0gaWRlbnRpZmllcgorICAgICAgICAgICAgLmtleV90eXBlCisgICAgICAgICAgICAuZXhwZWN0KCJtYXAgaWRlbnRpZmllciB0byB3cml0ZSBzaG91bGQgY29udGFpbiBrZXkgdHlwZSIpOworICAgICAgICBzZWxmLndyaXRlX2J5dGUoZmllbGRfdHlwZV90b191OChrZXlfdHlwZSkpPzsKKyAgICAgICAgbGV0IHZhbF90eXBlID0gaWRlbnRpZmllcgorICAgICAgICAgICAgLnZhbHVlX3R5cGUKKyAgICAgICAgICAgIC5leHBlY3QoIm1hcCBpZGVudGlmaWVyIHRvIHdyaXRlIHNob3VsZCBjb250YWluIHZhbHVlIHR5cGUiKTsKKyAgICAgICAgc2VsZi53cml0ZV9ieXRlKGZpZWxkX3R5cGVfdG9fdTgodmFsX3R5cGUpKT87CisgICAgICAgIHNlbGYud3JpdGVfaTMyKGlkZW50aWZpZXIuc2l6ZSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9tYXBfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gZmx1c2goJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLnRyYW5zcG9ydC5mbHVzaCgpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICAvLyB1dGlsaXR5CisgICAgLy8KKworICAgIGZuIHdyaXRlX2J5dGUoJm11dCBzZWxmLCBiOiB1OCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQud3JpdGVfdTgoYikubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KK30KKworLy8vIEZhY3RvcnkgZm9yIGNyZWF0aW5nIGluc3RhbmNlcyBvZiBgVEJpbmFyeU91dHB1dFByb3RvY29sYC4KKyNbZGVyaXZlKERlZmF1bHQpXQorcHViIHN0cnVjdCBUQmluYXJ5T3V0cHV0UHJvdG9jb2xGYWN0b3J5OworCitpbXBsIFRCaW5hcnlPdXRwdXRQcm90b2NvbEZhY3RvcnkgeworICAgIC8vLyBDcmVhdGUgYSBgVEJpbmFyeU91dHB1dFByb3RvY29sRmFjdG9yeWAuCisgICAgcHViIGZuIG5ldygpIC0+IFRCaW5hcnlPdXRwdXRQcm90b2NvbEZhY3RvcnkgeworICAgICAgICBUQmluYXJ5T3V0cHV0UHJvdG9jb2xGYWN0b3J5IHt9CisgICAgfQorfQorCitpbXBsIFRPdXRwdXRQcm90b2NvbEZhY3RvcnkgZm9yIFRCaW5hcnlPdXRwdXRQcm90b2NvbEZhY3RvcnkgeworICAgIGZuIGNyZWF0ZSgmc2VsZiwgdHJhbnNwb3J0OiBCb3g8VFdyaXRlVHJhbnNwb3J0ICsgU2VuZD4pIC0+IEJveDxUT3V0cHV0UHJvdG9jb2wgKyBTZW5kPiB7CisgICAgICAgIEJveDo6bmV3KFRCaW5hcnlPdXRwdXRQcm90b2NvbDo6bmV3KHRyYW5zcG9ydCwgdHJ1ZSkpCisgICAgfQorfQorCitmbiBmaWVsZF90eXBlX3RvX3U4KGZpZWxkX3R5cGU6IFRUeXBlKSAtPiB1OCB7CisgICAgbWF0Y2ggZmllbGRfdHlwZSB7CisgICAgICAgIFRUeXBlOjpTdG9wID0+IDB4MDAsCisgICAgICAgIFRUeXBlOjpWb2lkID0+IDB4MDEsCisgICAgICAgIFRUeXBlOjpCb29sID0+IDB4MDIsCisgICAgICAgIFRUeXBlOjpJMDggPT4gMHgwMywgLy8gZXF1aXZhbGVudCB0byBUVHlwZTo6Qnl0ZQorICAgICAgICBUVHlwZTo6RG91YmxlID0+IDB4MDQsCisgICAgICAgIFRUeXBlOjpJMTYgPT4gMHgwNiwKKyAgICAgICAgVFR5cGU6OkkzMiA9PiAweDA4LAorICAgICAgICBUVHlwZTo6STY0ID0+IDB4MEEsCisgICAgICAgIFRUeXBlOjpTdHJpbmcgfCBUVHlwZTo6VXRmNyA9PiAweDBCLAorICAgICAgICBUVHlwZTo6U3RydWN0ID0+IDB4MEMsCisgICAgICAgIFRUeXBlOjpNYXAgPT4gMHgwRCwKKyAgICAgICAgVFR5cGU6OlNldCA9PiAweDBFLAorICAgICAgICBUVHlwZTo6TGlzdCA9PiAweDBGLAorICAgICAgICBUVHlwZTo6VXRmOCA9PiAweDEwLAorICAgICAgICBUVHlwZTo6VXRmMTYgPT4gMHgxMSwKKyAgICB9Cit9CisKK2ZuIGZpZWxkX3R5cGVfZnJvbV91OChiOiB1OCkgLT4gOjpSZXN1bHQ8VFR5cGU+IHsKKyAgICBtYXRjaCBiIHsKKyAgICAgICAgMHgwMCA9PiBPayhUVHlwZTo6U3RvcCksCisgICAgICAgIDB4MDEgPT4gT2soVFR5cGU6OlZvaWQpLAorICAgICAgICAweDAyID0+IE9rKFRUeXBlOjpCb29sKSwKKyAgICAgICAgMHgwMyA9PiBPayhUVHlwZTo6STA4KSwgLy8gRXF1aXZhbGVudCB0byBUVHlwZTo6Qnl0ZQorICAgICAgICAweDA0ID0+IE9rKFRUeXBlOjpEb3VibGUpLAorICAgICAgICAweDA2ID0+IE9rKFRUeXBlOjpJMTYpLAorICAgICAgICAweDA4ID0+IE9rKFRUeXBlOjpJMzIpLAorICAgICAgICAweDBBID0+IE9rKFRUeXBlOjpJNjQpLAorICAgICAgICAweDBCID0+IE9rKFRUeXBlOjpTdHJpbmcpLCAvLyB0ZWNobmljYWxseSwgYWxzbyBhIFVURjcsIGJ1dCB3ZSdsbCB0cmVhdCBpdCBhcyBzdHJpbmcKKyAgICAgICAgMHgwQyA9PiBPayhUVHlwZTo6U3RydWN0KSwKKyAgICAgICAgMHgwRCA9PiBPayhUVHlwZTo6TWFwKSwKKyAgICAgICAgMHgwRSA9PiBPayhUVHlwZTo6U2V0KSwKKyAgICAgICAgMHgwRiA9PiBPayhUVHlwZTo6TGlzdCksCisgICAgICAgIDB4MTAgPT4gT2soVFR5cGU6OlV0ZjgpLAorICAgICAgICAweDExID0+IE9rKFRUeXBlOjpVdGYxNiksCisgICAgICAgIHVua24gPT4gRXJyKDo6RXJyb3I6OlByb3RvY29sKFByb3RvY29sRXJyb3IgeworICAgICAgICAgICAga2luZDogUHJvdG9jb2xFcnJvcktpbmQ6OkludmFsaWREYXRhLAorICAgICAgICAgICAgbWVzc2FnZTogZm9ybWF0ISgiY2Fubm90IGNvbnZlcnQge30gdG8gVFR5cGUiLCB1bmtuKSwKKyAgICAgICAgfSkpLAorICAgIH0KK30KKworI1tjZmcodGVzdCldCittb2QgdGVzdHMgeworCisgICAgdXNlIHByb3RvY29sOjp7CisgICAgICAgIFRGaWVsZElkZW50aWZpZXIsIFRJbnB1dFByb3RvY29sLCBUTGlzdElkZW50aWZpZXIsIFRNYXBJZGVudGlmaWVyLCBUTWVzc2FnZUlkZW50aWZpZXIsCisgICAgICAgIFRNZXNzYWdlVHlwZSwgVE91dHB1dFByb3RvY29sLCBUU2V0SWRlbnRpZmllciwgVFN0cnVjdElkZW50aWZpZXIsIFRUeXBlLAorICAgIH07CisgICAgdXNlIHRyYW5zcG9ydDo6e1JlYWRIYWxmLCBUQnVmZmVyQ2hhbm5lbCwgVElvQ2hhbm5lbCwgV3JpdGVIYWxmfTsKKworICAgIHVzZSBzdXBlcjo6KjsKKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX3N0cmljdF9tZXNzYWdlX2NhbGxfYmVnaW4oKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHModHJ1ZSk7CisKKyAgICAgICAgbGV0IGlkZW50ID0gVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoInRlc3QiLCBUTWVzc2FnZVR5cGU6OkNhbGwsIDEpOworICAgICAgICBhc3NlcnQhKG9fcHJvdC53cml0ZV9tZXNzYWdlX2JlZ2luKCZpZGVudCkuaXNfb2soKSk7CisKKyAgICAgICAgI1tjZmdfYXR0cihydXN0Zm10LCBydXN0Zm10Ojpza2lwKV0KKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDE2XSA9IFsKKyAgICAgICAgICAgIDB4ODAsCisgICAgICAgICAgICAweDAxLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDEsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDA0LAorICAgICAgICAgICAgMHg3NCwKKyAgICAgICAgICAgIDB4NjUsCisgICAgICAgICAgICAweDczLAorICAgICAgICAgICAgMHg3NCwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDEsCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX25vbl9zdHJpY3RfbWVzc2FnZV9jYWxsX2JlZ2luKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKGZhbHNlKTsKKworICAgICAgICBsZXQgaWRlbnQgPSBUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygidGVzdCIsIFRNZXNzYWdlVHlwZTo6Q2FsbCwgMSk7CisgICAgICAgIGFzc2VydCEob19wcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oJmlkZW50KS5pc19vaygpKTsKKworICAgICAgICAjW2NmZ19hdHRyKHJ1c3RmbXQsIHJ1c3RmbXQ6OnNraXApXQorICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgMTNdID0gWworICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwNCwKKyAgICAgICAgICAgIDB4NzQsCisgICAgICAgICAgICAweDY1LAorICAgICAgICAgICAgMHg3MywKKyAgICAgICAgICAgIDB4NzQsCisgICAgICAgICAgICAweDAxLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMSwKKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfc3RyaWN0X21lc3NhZ2VfcmVwbHlfYmVnaW4oKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHModHJ1ZSk7CisKKyAgICAgICAgbGV0IGlkZW50ID0gVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoInRlc3QiLCBUTWVzc2FnZVR5cGU6OlJlcGx5LCAxMCk7CisgICAgICAgIGFzc2VydCEob19wcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oJmlkZW50KS5pc19vaygpKTsKKworICAgICAgICAjW2NmZ19hdHRyKHJ1c3RmbXQsIHJ1c3RmbXQ6OnNraXApXQorICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgMTZdID0gWworICAgICAgICAgICAgMHg4MCwKKyAgICAgICAgICAgIDB4MDEsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMiwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDQsCisgICAgICAgICAgICAweDc0LAorICAgICAgICAgICAgMHg2NSwKKyAgICAgICAgICAgIDB4NzMsCisgICAgICAgICAgICAweDc0LAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwQSwKKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbm9uX3N0cmljdF9tZXNzYWdlX3JlcGx5X2JlZ2luKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKGZhbHNlKTsKKworICAgICAgICBsZXQgaWRlbnQgPSBUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygidGVzdCIsIFRNZXNzYWdlVHlwZTo6UmVwbHksIDEwKTsKKyAgICAgICAgYXNzZXJ0IShvX3Byb3Qud3JpdGVfbWVzc2FnZV9iZWdpbigmaWRlbnQpLmlzX29rKCkpOworCisgICAgICAgICNbY2ZnX2F0dHIocnVzdGZtdCwgcnVzdGZtdDo6c2tpcCldCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyAxM10gPSBbCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDA0LAorICAgICAgICAgICAgMHg3NCwKKyAgICAgICAgICAgIDB4NjUsCisgICAgICAgICAgICAweDczLAorICAgICAgICAgICAgMHg3NCwKKyAgICAgICAgICAgIDB4MDIsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDBBLAorICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX3N0cmljdF9tZXNzYWdlX2JlZ2luKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKHRydWUpOworCisgICAgICAgIGxldCBzZW50X2lkZW50ID0gVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoInRlc3QiLCBUTWVzc2FnZVR5cGU6OkNhbGwsIDEpOworICAgICAgICBhc3NlcnQhKG9fcHJvdC53cml0ZV9tZXNzYWdlX2JlZ2luKCZzZW50X2lkZW50KS5pc19vaygpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICBsZXQgcmVjZWl2ZWRfaWRlbnQgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfbWVzc2FnZV9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmcmVjZWl2ZWRfaWRlbnQsICZzZW50X2lkZW50KTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX25vbl9zdHJpY3RfbWVzc2FnZV9iZWdpbigpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cyhmYWxzZSk7CisKKyAgICAgICAgbGV0IHNlbnRfaWRlbnQgPSBUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygidGVzdCIsIFRNZXNzYWdlVHlwZTo6Q2FsbCwgMSk7CisgICAgICAgIGFzc2VydCEob19wcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oJnNlbnRfaWRlbnQpLmlzX29rKCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIGxldCByZWNlaXZlZF9pZGVudCA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9tZXNzYWdlX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKCZyZWNlaXZlZF9pZGVudCwgJnNlbnRfaWRlbnQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX21lc3NhZ2VfZW5kKCkgeworICAgICAgICBhc3NlcnRfbm9fd3JpdGUofG98IG8ud3JpdGVfbWVzc2FnZV9lbmQoKSwgdHJ1ZSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfc3RydWN0X2JlZ2luKCkgeworICAgICAgICBhc3NlcnRfbm9fd3JpdGUoCisgICAgICAgICAgICB8b3wgby53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSwKKyAgICAgICAgICAgIHRydWUsCisgICAgICAgICk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfc3RydWN0X2VuZCgpIHsKKyAgICAgICAgYXNzZXJ0X25vX3dyaXRlKHxvfCBvLndyaXRlX3N0cnVjdF9lbmQoKSwgdHJ1ZSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfZmllbGRfYmVnaW4oKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHModHJ1ZSk7CisKKyAgICAgICAgYXNzZXJ0IShvX3Byb3QKKyAgICAgICAgICAgIC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJzb21lX2ZpZWxkIiwgVFR5cGU6OlN0cmluZywgMjIpKQorICAgICAgICAgICAgLmlzX29rKCkpOworCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyAzXSA9IFsweDBCLCAweDAwLCAweDE2XTsKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfZmllbGRfYmVnaW4oKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHModHJ1ZSk7CisKKyAgICAgICAgbGV0IHNlbnRfZmllbGRfaWRlbnQgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJNjQsIDIwKTsKKyAgICAgICAgYXNzZXJ0IShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJnNlbnRfZmllbGRfaWRlbnQpLmlzX29rKCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIGxldCBleHBlY3RlZF9pZGVudCA9IFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgIGZpZWxkX3R5cGU6IFRUeXBlOjpJNjQsCisgICAgICAgICAgICBpZDogU29tZSgyMCksCisgICAgICAgIH07IC8vIG5vIG5hbWUKKyAgICAgICAgbGV0IHJlY2VpdmVkX2lkZW50ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKCZyZWNlaXZlZF9pZGVudCwgJmV4cGVjdGVkX2lkZW50KTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9zdG9wX2ZpZWxkKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKHRydWUpOworCisgICAgICAgIGFzc2VydCEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKS5pc19vaygpKTsKKworICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgMV0gPSBbMHgwMF07CisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX2ZpZWxkX3N0b3AoKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHModHJ1ZSk7CisKKyAgICAgICAgYXNzZXJ0IShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpLmlzX29rKCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIGxldCBleHBlY3RlZF9pZGVudCA9IFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgIGZpZWxkX3R5cGU6IFRUeXBlOjpTdG9wLAorICAgICAgICAgICAgaWQ6IFNvbWUoMCksCisgICAgICAgIH07IC8vIHdlIGdldCBpZCAwCisKKyAgICAgICAgbGV0IHJlY2VpdmVkX2lkZW50ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKCZyZWNlaXZlZF9pZGVudCwgJmV4cGVjdGVkX2lkZW50KTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9maWVsZF9lbmQoKSB7CisgICAgICAgIGFzc2VydF9ub193cml0ZSh8b3wgby53cml0ZV9maWVsZF9lbmQoKSwgdHJ1ZSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbGlzdF9iZWdpbigpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cyh0cnVlKTsKKworICAgICAgICBhc3NlcnQhKG9fcHJvdAorICAgICAgICAgICAgLndyaXRlX2xpc3RfYmVnaW4oJlRMaXN0SWRlbnRpZmllcjo6bmV3KFRUeXBlOjpCb29sLCA1KSkKKyAgICAgICAgICAgIC5pc19vaygpKTsKKworICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgNV0gPSBbMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNV07CisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX2xpc3RfYmVnaW4oKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHModHJ1ZSk7CisKKyAgICAgICAgbGV0IGlkZW50ID0gVExpc3RJZGVudGlmaWVyOjpuZXcoVFR5cGU6Okxpc3QsIDkwMCk7CisgICAgICAgIGFzc2VydCEob19wcm90LndyaXRlX2xpc3RfYmVnaW4oJmlkZW50KS5pc19vaygpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICBsZXQgcmVjZWl2ZWRfaWRlbnQgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfbGlzdF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmcmVjZWl2ZWRfaWRlbnQsICZpZGVudCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbGlzdF9lbmQoKSB7CisgICAgICAgIGFzc2VydF9ub193cml0ZSh8b3wgby53cml0ZV9saXN0X2VuZCgpLCB0cnVlKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9zZXRfYmVnaW4oKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHModHJ1ZSk7CisKKyAgICAgICAgYXNzZXJ0IShvX3Byb3QKKyAgICAgICAgICAgIC53cml0ZV9zZXRfYmVnaW4oJlRTZXRJZGVudGlmaWVyOjpuZXcoVFR5cGU6OkkxNiwgNykpCisgICAgICAgICAgICAuaXNfb2soKSk7CisKKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDVdID0gWzB4MDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDddOworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9zZXRfYmVnaW4oKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHModHJ1ZSk7CisKKyAgICAgICAgbGV0IGlkZW50ID0gVFNldElkZW50aWZpZXI6Om5ldyhUVHlwZTo6STY0LCAyMDAwKTsKKyAgICAgICAgYXNzZXJ0IShvX3Byb3Qud3JpdGVfc2V0X2JlZ2luKCZpZGVudCkuaXNfb2soKSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgbGV0IHJlY2VpdmVkX2lkZW50X3Jlc3VsdCA9IGlfcHJvdC5yZWFkX3NldF9iZWdpbigpOworICAgICAgICBhc3NlcnQhKHJlY2VpdmVkX2lkZW50X3Jlc3VsdC5pc19vaygpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmcmVjZWl2ZWRfaWRlbnRfcmVzdWx0LnVud3JhcCgpLCAmaWRlbnQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX3NldF9lbmQoKSB7CisgICAgICAgIGFzc2VydF9ub193cml0ZSh8b3wgby53cml0ZV9zZXRfZW5kKCksIHRydWUpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX21hcF9iZWdpbigpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cyh0cnVlKTsKKworICAgICAgICBhc3NlcnQhKG9fcHJvdAorICAgICAgICAgICAgLndyaXRlX21hcF9iZWdpbigmVE1hcElkZW50aWZpZXI6Om5ldyhUVHlwZTo6STY0LCBUVHlwZTo6U3RydWN0LCAzMikpCisgICAgICAgICAgICAuaXNfb2soKSk7CisKKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDZdID0gWzB4MEEsIDB4MEMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjBdOworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9tYXBfYmVnaW4oKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHModHJ1ZSk7CisKKyAgICAgICAgbGV0IGlkZW50ID0gVE1hcElkZW50aWZpZXI6Om5ldyhUVHlwZTo6TWFwLCBUVHlwZTo6U2V0LCAxMDApOworICAgICAgICBhc3NlcnQhKG9fcHJvdC53cml0ZV9tYXBfYmVnaW4oJmlkZW50KS5pc19vaygpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICBsZXQgcmVjZWl2ZWRfaWRlbnQgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfbWFwX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKCZyZWNlaXZlZF9pZGVudCwgJmlkZW50KTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9tYXBfZW5kKCkgeworICAgICAgICBhc3NlcnRfbm9fd3JpdGUofG98IG8ud3JpdGVfbWFwX2VuZCgpLCB0cnVlKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9ib29sX3RydWUoKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHModHJ1ZSk7CisKKyAgICAgICAgYXNzZXJ0IShvX3Byb3Qud3JpdGVfYm9vbCh0cnVlKS5pc19vaygpKTsKKworICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgMV0gPSBbMHgwMV07CisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9ib29sX2ZhbHNlKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKHRydWUpOworCisgICAgICAgIGFzc2VydCEob19wcm90LndyaXRlX2Jvb2woZmFsc2UpLmlzX29rKCkpOworCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyAxXSA9IFsweDAwXTsKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JlYWRfYm9vbF90cnVlKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIF8pID0gdGVzdF9vYmplY3RzKHRydWUpOworCisgICAgICAgIHNldF9yZWFkYWJsZV9ieXRlcyEoaV9wcm90LCAmWzB4MDFdKTsKKworICAgICAgICBsZXQgcmVhZF9ib29sID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2Jvb2woKSk7CisgICAgICAgIGFzc2VydF9lcSEocmVhZF9ib29sLCB0cnVlKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yZWFkX2Jvb2xfZmFsc2UoKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgXykgPSB0ZXN0X29iamVjdHModHJ1ZSk7CisKKyAgICAgICAgc2V0X3JlYWRhYmxlX2J5dGVzIShpX3Byb3QsICZbMHgwMF0pOworCisgICAgICAgIGxldCByZWFkX2Jvb2wgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfYm9vbCgpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX2Jvb2wsIGZhbHNlKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9hbGxvd19hbnlfbm9uX3plcm9fdmFsdWVfdG9fYmVfaW50ZXJwcmV0ZWRfYXNfYm9vbF90cnVlKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIF8pID0gdGVzdF9vYmplY3RzKHRydWUpOworCisgICAgICAgIHNldF9yZWFkYWJsZV9ieXRlcyEoaV9wcm90LCAmWzB4QUNdKTsKKworICAgICAgICBsZXQgcmVhZF9ib29sID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2Jvb2woKSk7CisgICAgICAgIGFzc2VydF9lcSEocmVhZF9ib29sLCB0cnVlKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9ieXRlcygpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cyh0cnVlKTsKKworICAgICAgICBsZXQgYnl0ZXM6IFt1ODsgMTBdID0gWzB4MEEsIDB4Q0MsIDB4RDEsIDB4ODQsIDB4OTksIDB4MTIsIDB4QUIsIDB4QkIsIDB4NDUsIDB4REZdOworCisgICAgICAgIGFzc2VydCEob19wcm90LndyaXRlX2J5dGVzKCZieXRlcykuaXNfb2soKSk7CisKKyAgICAgICAgbGV0IGJ1ZiA9IG9fcHJvdC50cmFuc3BvcnQud3JpdGVfYnl0ZXMoKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmYnVmWzAuLjRdLCBbMHgwMCwgMHgwMCwgMHgwMCwgMHgwQV0pOyAvLyBsZW5ndGgKKyAgICAgICAgYXNzZXJ0X2VxISgmYnVmWzQuLl0sIGJ5dGVzKTsgLy8gYWN0dWFsIGJ5dGVzCisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9ieXRlcygpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cyh0cnVlKTsKKworICAgICAgICAjW2NmZ19hdHRyKHJ1c3RmbXQsIHJ1c3RmbXQ6OnNraXApXQorICAgICAgICBsZXQgYnl0ZXM6IFt1ODsgMjVdID0gWworICAgICAgICAgICAgMHgyMCwKKyAgICAgICAgICAgIDB4RkQsCisgICAgICAgICAgICAweDE4LAorICAgICAgICAgICAgMHg4NCwKKyAgICAgICAgICAgIDB4OTksCisgICAgICAgICAgICAweDEyLAorICAgICAgICAgICAgMHhBQiwKKyAgICAgICAgICAgIDB4QkIsCisgICAgICAgICAgICAweDQ1LAorICAgICAgICAgICAgMHhERiwKKyAgICAgICAgICAgIDB4MzQsCisgICAgICAgICAgICAweERDLAorICAgICAgICAgICAgMHg5OCwKKyAgICAgICAgICAgIDB4QTQsCisgICAgICAgICAgICAweDZELAorICAgICAgICAgICAgMHhGMywKKyAgICAgICAgICAgIDB4OTksCisgICAgICAgICAgICAweEI0LAorICAgICAgICAgICAgMHhCNywKKyAgICAgICAgICAgIDB4RDQsCisgICAgICAgICAgICAweDlDLAorICAgICAgICAgICAgMHhBNSwKKyAgICAgICAgICAgIDB4QjMsCisgICAgICAgICAgICAweEM5LAorICAgICAgICAgICAgMHg4OCwKKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnQhKG9fcHJvdC53cml0ZV9ieXRlcygmYnl0ZXMpLmlzX29rKCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIGxldCByZWNlaXZlZF9ieXRlcyA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9ieXRlcygpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmcmVjZWl2ZWRfYnl0ZXMsICZieXRlcyk7CisgICAgfQorCisgICAgZm4gdGVzdF9vYmplY3RzKAorICAgICAgICBzdHJpY3Q6IGJvb2wsCisgICAgKSAtPiAoCisgICAgICAgIFRCaW5hcnlJbnB1dFByb3RvY29sPFJlYWRIYWxmPFRCdWZmZXJDaGFubmVsPj4sCisgICAgICAgIFRCaW5hcnlPdXRwdXRQcm90b2NvbDxXcml0ZUhhbGY8VEJ1ZmZlckNoYW5uZWw+PiwKKyAgICApIHsKKyAgICAgICAgbGV0IG1lbSA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDQwLCA0MCk7CisKKyAgICAgICAgbGV0IChyX21lbSwgd19tZW0pID0gbWVtLnNwbGl0KCkudW53cmFwKCk7CisKKyAgICAgICAgbGV0IGlfcHJvdCA9IFRCaW5hcnlJbnB1dFByb3RvY29sOjpuZXcocl9tZW0sIHN0cmljdCk7CisgICAgICAgIGxldCBvX3Byb3QgPSBUQmluYXJ5T3V0cHV0UHJvdG9jb2w6Om5ldyh3X21lbSwgc3RyaWN0KTsKKworICAgICAgICAoaV9wcm90LCBvX3Byb3QpCisgICAgfQorCisgICAgZm4gYXNzZXJ0X25vX3dyaXRlPEY+KG11dCB3cml0ZV9mbjogRiwgc3RyaWN0OiBib29sKQorICAgIHdoZXJlCisgICAgICAgIEY6IEZuTXV0KCZtdXQgVEJpbmFyeU91dHB1dFByb3RvY29sPFdyaXRlSGFsZjxUQnVmZmVyQ2hhbm5lbD4+KSAtPiA6OlJlc3VsdDwoKT4sCisgICAgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKHN0cmljdCk7CisgICAgICAgIGFzc2VydCEod3JpdGVfZm4oJm11dCBvX3Byb3QpLmlzX29rKCkpOworICAgICAgICBhc3NlcnRfZXEhKG9fcHJvdC50cmFuc3BvcnQud3JpdGVfYnl0ZXMoKS5sZW4oKSwgMCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3JzL3NyYy9wcm90b2NvbC9jb21wYWN0LnJzIGIvbGliL3JzL3NyYy9wcm90b2NvbC9jb21wYWN0LnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNWVkYWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvc3JjL3Byb3RvY29sL2NvbXBhY3QucnMKQEAgLTAsMCArMSwyMzg2IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzZSBieXRlb3JkZXI6OntCaWdFbmRpYW4sIFJlYWRCeXRlc0V4dCwgV3JpdGVCeXRlc0V4dH07Cit1c2UgaW50ZWdlcl9lbmNvZGluZzo6e1ZhckludFJlYWRlciwgVmFySW50V3JpdGVyfTsKK3VzZSBzdGQ6OmNvbnZlcnQ6OkZyb207Cit1c2Ugc3RkOjppbzsKK3VzZSB0cnlfZnJvbTo6VHJ5RnJvbTsKKwordXNlIHN1cGVyOjp7CisgICAgVEZpZWxkSWRlbnRpZmllciwgVElucHV0UHJvdG9jb2wsIFRJbnB1dFByb3RvY29sRmFjdG9yeSwgVExpc3RJZGVudGlmaWVyLCBUTWFwSWRlbnRpZmllciwKKyAgICBUTWVzc2FnZUlkZW50aWZpZXIsIFRNZXNzYWdlVHlwZSwKK307Cit1c2Ugc3VwZXI6OntUT3V0cHV0UHJvdG9jb2wsIFRPdXRwdXRQcm90b2NvbEZhY3RvcnksIFRTZXRJZGVudGlmaWVyLCBUU3RydWN0SWRlbnRpZmllciwgVFR5cGV9OwordXNlIHRyYW5zcG9ydDo6e1RSZWFkVHJhbnNwb3J0LCBUV3JpdGVUcmFuc3BvcnR9OworCitjb25zdCBDT01QQUNUX1BST1RPQ09MX0lEOiB1OCA9IDB4ODI7Citjb25zdCBDT01QQUNUX1ZFUlNJT046IHU4ID0gMHgwMTsKK2NvbnN0IENPTVBBQ1RfVkVSU0lPTl9NQVNLOiB1OCA9IDB4MUY7CisKKy8vLyBSZWFkIG1lc3NhZ2VzIGVuY29kZWQgaW4gdGhlIFRocmlmdCBjb21wYWN0IHByb3RvY29sLgorLy8vCisvLy8gIyBFeGFtcGxlcworLy8vCisvLy8gQ3JlYXRlIGFuZCB1c2UgYSBgVENvbXBhY3RJbnB1dFByb3RvY29sYC4KKy8vLworLy8vIGBgYG5vX3J1bgorLy8vIHVzZSB0aHJpZnQ6OnByb3RvY29sOjp7VENvbXBhY3RJbnB1dFByb3RvY29sLCBUSW5wdXRQcm90b2NvbH07CisvLy8gdXNlIHRocmlmdDo6dHJhbnNwb3J0OjpUVGNwQ2hhbm5lbDsKKy8vLworLy8vIGxldCBtdXQgY2hhbm5lbCA9IFRUY3BDaGFubmVsOjpuZXcoKTsKKy8vLyBjaGFubmVsLm9wZW4oImxvY2FsaG9zdDo5MDkwIikudW53cmFwKCk7CisvLy8KKy8vLyBsZXQgbXV0IHByb3RvY29sID0gVENvbXBhY3RJbnB1dFByb3RvY29sOjpuZXcoY2hhbm5lbCk7CisvLy8KKy8vLyBsZXQgcmVjdmRfYm9vbCA9IHByb3RvY29sLnJlYWRfYm9vbCgpLnVud3JhcCgpOworLy8vIGxldCByZWN2ZF9zdHJpbmcgPSBwcm90b2NvbC5yZWFkX3N0cmluZygpLnVud3JhcCgpOworLy8vIGBgYAorI1tkZXJpdmUoRGVidWcpXQorcHViIHN0cnVjdCBUQ29tcGFjdElucHV0UHJvdG9jb2w8VD4KK3doZXJlCisgICAgVDogVFJlYWRUcmFuc3BvcnQsCit7CisgICAgLy8gSWRlbnRpZmllciBvZiB0aGUgbGFzdCBmaWVsZCBkZXNlcmlhbGl6ZWQgZm9yIGEgc3RydWN0LgorICAgIGxhc3RfcmVhZF9maWVsZF9pZDogaTE2LAorICAgIC8vIFN0YWNrIG9mIHRoZSBsYXN0IHJlYWQgZmllbGQgaWRzIChhIG5ldyBlbnRyeSBpcyBhZGRlZCBlYWNoIHRpbWUgYSBuZXN0ZWQgc3RydWN0IGlzIHJlYWQpLgorICAgIHJlYWRfZmllbGRfaWRfc3RhY2s6IFZlYzxpMTY+LAorICAgIC8vIEJvb2xlYW4gdmFsdWUgZm9yIGEgZmllbGQuCisgICAgLy8gU2F2ZWQgYmVjYXVzZSBib29sZWFuIGZpZWxkcyBhbmQgdGhlaXIgdmFsdWUgYXJlIGVuY29kZWQgaW4gYSBzaW5nbGUgYnl0ZSwKKyAgICAvLyBhbmQgcmVhZGluZyB0aGUgZmllbGQgb25seSBvY2N1cnMgYWZ0ZXIgdGhlIGZpZWxkIGlkIGlzIHJlYWQuCisgICAgcGVuZGluZ19yZWFkX2Jvb2xfdmFsdWU6IE9wdGlvbjxib29sPiwKKyAgICAvLyBVbmRlcmx5aW5nIHRyYW5zcG9ydCB1c2VkIGZvciBieXRlLWxldmVsIG9wZXJhdGlvbnMuCisgICAgdHJhbnNwb3J0OiBULAorfQorCitpbXBsPFQ+IFRDb21wYWN0SW5wdXRQcm90b2NvbDxUPgord2hlcmUKKyAgICBUOiBUUmVhZFRyYW5zcG9ydCwKK3sKKyAgICAvLy8gQ3JlYXRlIGEgYFRDb21wYWN0SW5wdXRQcm90b2NvbGAgdGhhdCByZWFkcyBieXRlcyBmcm9tIGB0cmFuc3BvcnRgLgorICAgIHB1YiBmbiBuZXcodHJhbnNwb3J0OiBUKSAtPiBUQ29tcGFjdElucHV0UHJvdG9jb2w8VD4geworICAgICAgICBUQ29tcGFjdElucHV0UHJvdG9jb2wgeworICAgICAgICAgICAgbGFzdF9yZWFkX2ZpZWxkX2lkOiAwLAorICAgICAgICAgICAgcmVhZF9maWVsZF9pZF9zdGFjazogVmVjOjpuZXcoKSwKKyAgICAgICAgICAgIHBlbmRpbmdfcmVhZF9ib29sX3ZhbHVlOiBOb25lLAorICAgICAgICAgICAgdHJhbnNwb3J0OiB0cmFuc3BvcnQsCisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbiByZWFkX2xpc3Rfc2V0X2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KFRUeXBlLCBpMzIpPiB7CisgICAgICAgIGxldCBoZWFkZXIgPSBzZWxmLnJlYWRfYnl0ZSgpPzsKKyAgICAgICAgbGV0IGVsZW1lbnRfdHlwZSA9IGNvbGxlY3Rpb25fdThfdG9fdHlwZShoZWFkZXIgJiAweDBGKT87CisKKyAgICAgICAgbGV0IGVsZW1lbnRfY291bnQ7CisgICAgICAgIGxldCBwb3NzaWJsZV9lbGVtZW50X2NvdW50ID0gKGhlYWRlciAmIDB4RjApID4+IDQ7CisgICAgICAgIGlmIHBvc3NpYmxlX2VsZW1lbnRfY291bnQgIT0gMTUgeworICAgICAgICAgICAgLy8gaGlnaCBiaXRzIHNldCBoaWdoIGlmIGNvdW50IGFuZCB0eXBlIGVuY29kZWQgc2VwYXJhdGVseQorICAgICAgICAgICAgZWxlbWVudF9jb3VudCA9IHBvc3NpYmxlX2VsZW1lbnRfY291bnQgYXMgaTMyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZWxlbWVudF9jb3VudCA9IHNlbGYudHJhbnNwb3J0LnJlYWRfdmFyaW50Ojo8dTMyPigpPyBhcyBpMzI7CisgICAgICAgIH0KKworICAgICAgICBPaygoZWxlbWVudF90eXBlLCBlbGVtZW50X2NvdW50KSkKKyAgICB9Cit9CisKK2ltcGw8VD4gVElucHV0UHJvdG9jb2wgZm9yIFRDb21wYWN0SW5wdXRQcm90b2NvbDxUPgord2hlcmUKKyAgICBUOiBUUmVhZFRyYW5zcG9ydCwKK3sKKyAgICBmbiByZWFkX21lc3NhZ2VfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxUTWVzc2FnZUlkZW50aWZpZXI+IHsKKyAgICAgICAgbGV0IGNvbXBhY3RfaWQgPSBzZWxmLnJlYWRfYnl0ZSgpPzsKKyAgICAgICAgaWYgY29tcGFjdF9pZCAhPSBDT01QQUNUX1BST1RPQ09MX0lEIHsKKyAgICAgICAgICAgIEVycig6OkVycm9yOjpQcm90b2NvbCg6OlByb3RvY29sRXJyb3IgeworICAgICAgICAgICAgICAgIGtpbmQ6IDo6UHJvdG9jb2xFcnJvcktpbmQ6OkJhZFZlcnNpb24sCisgICAgICAgICAgICAgICAgbWVzc2FnZTogZm9ybWF0ISgiaW52YWxpZCBjb21wYWN0IHByb3RvY29sIGhlYWRlciB7Oj99IiwgY29tcGFjdF9pZCksCisgICAgICAgICAgICB9KSkKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE9rKCgpKQorICAgICAgICB9PzsKKworICAgICAgICBsZXQgdHlwZV9hbmRfYnl0ZSA9IHNlbGYucmVhZF9ieXRlKCk/OworICAgICAgICBsZXQgcmVjZWl2ZWRfdmVyc2lvbiA9IHR5cGVfYW5kX2J5dGUgJiBDT01QQUNUX1ZFUlNJT05fTUFTSzsKKyAgICAgICAgaWYgcmVjZWl2ZWRfdmVyc2lvbiAhPSBDT01QQUNUX1ZFUlNJT04geworICAgICAgICAgICAgRXJyKDo6RXJyb3I6OlByb3RvY29sKDo6UHJvdG9jb2xFcnJvciB7CisgICAgICAgICAgICAgICAga2luZDogOjpQcm90b2NvbEVycm9yS2luZDo6QmFkVmVyc2lvbiwKKyAgICAgICAgICAgICAgICBtZXNzYWdlOiBmb3JtYXQhKAorICAgICAgICAgICAgICAgICAgICAiY2Fubm90IHByb2Nlc3MgY29tcGFjdCBwcm90b2NvbCB2ZXJzaW9uIHs6P30iLAorICAgICAgICAgICAgICAgICAgICByZWNlaXZlZF92ZXJzaW9uCisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgIH0pKQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgT2soKCkpCisgICAgICAgIH0/OworCisgICAgICAgIC8vIE5PVEU6IHVuc2lnbmVkIHJpZ2h0IHNoaWZ0IHdpbGwgcGFkIHdpdGggMHMKKyAgICAgICAgbGV0IG1lc3NhZ2VfdHlwZTogVE1lc3NhZ2VUeXBlID0gVE1lc3NhZ2VUeXBlOjp0cnlfZnJvbSh0eXBlX2FuZF9ieXRlID4+IDUpPzsKKyAgICAgICAgbGV0IHNlcXVlbmNlX251bWJlciA9IHNlbGYucmVhZF9pMzIoKT87CisgICAgICAgIGxldCBzZXJ2aWNlX2NhbGxfbmFtZSA9IHNlbGYucmVhZF9zdHJpbmcoKT87CisKKyAgICAgICAgc2VsZi5sYXN0X3JlYWRfZmllbGRfaWQgPSAwOworCisgICAgICAgIE9rKFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KAorICAgICAgICAgICAgc2VydmljZV9jYWxsX25hbWUsCisgICAgICAgICAgICBtZXNzYWdlX3R5cGUsCisgICAgICAgICAgICBzZXF1ZW5jZV9udW1iZXIsCisgICAgICAgICkpCisgICAgfQorCisgICAgZm4gcmVhZF9tZXNzYWdlX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHJlYWRfc3RydWN0X2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8T3B0aW9uPFRTdHJ1Y3RJZGVudGlmaWVyPj4geworICAgICAgICBzZWxmLnJlYWRfZmllbGRfaWRfc3RhY2sucHVzaChzZWxmLmxhc3RfcmVhZF9maWVsZF9pZCk7CisgICAgICAgIHNlbGYubGFzdF9yZWFkX2ZpZWxkX2lkID0gMDsKKyAgICAgICAgT2soTm9uZSkKKyAgICB9CisKKyAgICBmbiByZWFkX3N0cnVjdF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmxhc3RfcmVhZF9maWVsZF9pZCA9IHNlbGYKKyAgICAgICAgICAgIC5yZWFkX2ZpZWxkX2lkX3N0YWNrCisgICAgICAgICAgICAucG9wKCkKKyAgICAgICAgICAgIC5leHBlY3QoInNob3VsZCBoYXZlIHByZXZpb3VzIGZpZWxkIGlkcyIpOworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiByZWFkX2ZpZWxkX2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VEZpZWxkSWRlbnRpZmllcj4geworICAgICAgICAvLyB3ZSBjYW4gcmVhZCBhdCBsZWFzdCBvbmUgYnl0ZSwgd2hpY2ggaXM6CisgICAgICAgIC8vIC0gdGhlIHR5cGUKKyAgICAgICAgLy8gLSB0aGUgZmllbGQgZGVsdGEgYW5kIHRoZSB0eXBlCisgICAgICAgIGxldCBmaWVsZF90eXBlID0gc2VsZi5yZWFkX2J5dGUoKT87CisgICAgICAgIGxldCBmaWVsZF9kZWx0YSA9IChmaWVsZF90eXBlICYgMHhGMCkgPj4gNDsKKyAgICAgICAgbGV0IGZpZWxkX3R5cGUgPSBtYXRjaCBmaWVsZF90eXBlICYgMHgwRiB7CisgICAgICAgICAgICAweDAxID0+IHsKKyAgICAgICAgICAgICAgICBzZWxmLnBlbmRpbmdfcmVhZF9ib29sX3ZhbHVlID0gU29tZSh0cnVlKTsKKyAgICAgICAgICAgICAgICBPayhUVHlwZTo6Qm9vbCkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIDB4MDIgPT4geworICAgICAgICAgICAgICAgIHNlbGYucGVuZGluZ19yZWFkX2Jvb2xfdmFsdWUgPSBTb21lKGZhbHNlKTsKKyAgICAgICAgICAgICAgICBPayhUVHlwZTo6Qm9vbCkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHR0dTggPT4gdThfdG9fdHlwZSh0dHU4KSwKKyAgICAgICAgfT87CisKKyAgICAgICAgbWF0Y2ggZmllbGRfdHlwZSB7CisgICAgICAgICAgICBUVHlwZTo6U3RvcCA9PiBPaygKKyAgICAgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyOjpuZXc6OjxPcHRpb248U3RyaW5nPiwgU3RyaW5nLCBPcHRpb248aTE2Pj4oCisgICAgICAgICAgICAgICAgICAgIE5vbmUsCisgICAgICAgICAgICAgICAgICAgIFRUeXBlOjpTdG9wLAorICAgICAgICAgICAgICAgICAgICBOb25lLAorICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICApLAorICAgICAgICAgICAgXyA9PiB7CisgICAgICAgICAgICAgICAgaWYgZmllbGRfZGVsdGEgIT0gMCB7CisgICAgICAgICAgICAgICAgICAgIHNlbGYubGFzdF9yZWFkX2ZpZWxkX2lkICs9IGZpZWxkX2RlbHRhIGFzIGkxNjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzZWxmLmxhc3RfcmVhZF9maWVsZF9pZCA9IHNlbGYucmVhZF9pMTYoKT87CisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIE9rKFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgICAgICBmaWVsZF90eXBlOiBmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICBpZDogU29tZShzZWxmLmxhc3RfcmVhZF9maWVsZF9pZCksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZuIHJlYWRfZmllbGRfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gcmVhZF9ib29sKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8Ym9vbD4geworICAgICAgICBtYXRjaCBzZWxmLnBlbmRpbmdfcmVhZF9ib29sX3ZhbHVlLnRha2UoKSB7CisgICAgICAgICAgICBTb21lKGIpID0+IE9rKGIpLAorICAgICAgICAgICAgTm9uZSA9PiB7CisgICAgICAgICAgICAgICAgbGV0IGIgPSBzZWxmLnJlYWRfYnl0ZSgpPzsKKyAgICAgICAgICAgICAgICBtYXRjaCBiIHsKKyAgICAgICAgICAgICAgICAgICAgMHgwMSA9PiBPayh0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgMHgwMiA9PiBPayhmYWxzZSksCisgICAgICAgICAgICAgICAgICAgIHVua24gPT4gRXJyKDo6RXJyb3I6OlByb3RvY29sKDo6UHJvdG9jb2xFcnJvciB7CisgICAgICAgICAgICAgICAgICAgICAgICBraW5kOiA6OlByb3RvY29sRXJyb3JLaW5kOjpJbnZhbGlkRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoImNhbm5vdCBjb252ZXJ0IHt9IGludG8gYm9vbCIsIHVua24pLAorICAgICAgICAgICAgICAgICAgICB9KSksCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZm4gcmVhZF9ieXRlcygmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFZlYzx1OD4+IHsKKyAgICAgICAgbGV0IGxlbiA9IHNlbGYudHJhbnNwb3J0LnJlYWRfdmFyaW50Ojo8dTMyPigpPzsKKyAgICAgICAgbGV0IG11dCBidWYgPSB2ZWMhWzB1ODsgbGVuIGFzIHVzaXplXTsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQKKyAgICAgICAgICAgIC5yZWFkX2V4YWN0KCZtdXQgYnVmKQorICAgICAgICAgICAgLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICAgICAgICAgIC5tYXAofF98IGJ1ZikKKyAgICB9CisKKyAgICBmbiByZWFkX2k4KCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8aTg+IHsKKyAgICAgICAgc2VsZi5yZWFkX2J5dGUoKS5tYXAofGl8IGkgYXMgaTgpCisgICAgfQorCisgICAgZm4gcmVhZF9pMTYoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxpMTY+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQucmVhZF92YXJpbnQ6OjxpMTY+KCkubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIGZuIHJlYWRfaTMyKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8aTMyPiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0LnJlYWRfdmFyaW50Ojo8aTMyPigpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICBmbiByZWFkX2k2NCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGk2ND4geworICAgICAgICBzZWxmLnRyYW5zcG9ydC5yZWFkX3ZhcmludDo6PGk2ND4oKS5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgZm4gcmVhZF9kb3VibGUoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxmNjQ+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQucmVhZF9mNjQ6OjxCaWdFbmRpYW4+KCkubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIGZuIHJlYWRfc3RyaW5nKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8U3RyaW5nPiB7CisgICAgICAgIGxldCBieXRlcyA9IHNlbGYucmVhZF9ieXRlcygpPzsKKyAgICAgICAgU3RyaW5nOjpmcm9tX3V0ZjgoYnl0ZXMpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICBmbiByZWFkX2xpc3RfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxUTGlzdElkZW50aWZpZXI+IHsKKyAgICAgICAgbGV0IChlbGVtZW50X3R5cGUsIGVsZW1lbnRfY291bnQpID0gc2VsZi5yZWFkX2xpc3Rfc2V0X2JlZ2luKCk/OworICAgICAgICBPayhUTGlzdElkZW50aWZpZXI6Om5ldyhlbGVtZW50X3R5cGUsIGVsZW1lbnRfY291bnQpKQorICAgIH0KKworICAgIGZuIHJlYWRfbGlzdF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiByZWFkX3NldF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRTZXRJZGVudGlmaWVyPiB7CisgICAgICAgIGxldCAoZWxlbWVudF90eXBlLCBlbGVtZW50X2NvdW50KSA9IHNlbGYucmVhZF9saXN0X3NldF9iZWdpbigpPzsKKyAgICAgICAgT2soVFNldElkZW50aWZpZXI6Om5ldyhlbGVtZW50X3R5cGUsIGVsZW1lbnRfY291bnQpKQorICAgIH0KKworICAgIGZuIHJlYWRfc2V0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHJlYWRfbWFwX2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VE1hcElkZW50aWZpZXI+IHsKKyAgICAgICAgbGV0IGVsZW1lbnRfY291bnQgPSBzZWxmLnRyYW5zcG9ydC5yZWFkX3ZhcmludDo6PHUzMj4oKT8gYXMgaTMyOworICAgICAgICBpZiBlbGVtZW50X2NvdW50ID09IDAgeworICAgICAgICAgICAgT2soVE1hcElkZW50aWZpZXI6Om5ldyhOb25lLCBOb25lLCAwKSkKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxldCB0eXBlX2hlYWRlciA9IHNlbGYucmVhZF9ieXRlKCk/OworICAgICAgICAgICAgbGV0IGtleV90eXBlID0gY29sbGVjdGlvbl91OF90b190eXBlKCh0eXBlX2hlYWRlciAmIDB4RjApID4+IDQpPzsKKyAgICAgICAgICAgIGxldCB2YWxfdHlwZSA9IGNvbGxlY3Rpb25fdThfdG9fdHlwZSh0eXBlX2hlYWRlciAmIDB4MEYpPzsKKyAgICAgICAgICAgIE9rKFRNYXBJZGVudGlmaWVyOjpuZXcoa2V5X3R5cGUsIHZhbF90eXBlLCBlbGVtZW50X2NvdW50KSkKKyAgICAgICAgfQorICAgIH0KKworICAgIGZuIHJlYWRfbWFwX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIC8vIHV0aWxpdHkKKyAgICAvLworCisgICAgZm4gcmVhZF9ieXRlKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8dTg+IHsKKyAgICAgICAgbGV0IG11dCBidWYgPSBbMHU4OyAxXTsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQKKyAgICAgICAgICAgIC5yZWFkX2V4YWN0KCZtdXQgYnVmKQorICAgICAgICAgICAgLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICAgICAgICAgIC5tYXAofF98IGJ1ZlswXSkKKyAgICB9Cit9CisKK2ltcGw8VD4gaW86OlNlZWsgZm9yIFRDb21wYWN0SW5wdXRQcm90b2NvbDxUPgord2hlcmUKKyAgICBUOiBpbzo6U2VlayArIFRSZWFkVHJhbnNwb3J0LAoreworICAgIGZuIHNlZWsoJm11dCBzZWxmLCBwb3M6IGlvOjpTZWVrRnJvbSkgLT4gaW86OlJlc3VsdDx1NjQ+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQuc2Vlayhwb3MpCisgICAgfQorfQorCisvLy8gRmFjdG9yeSBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzIG9mIGBUQ29tcGFjdElucHV0UHJvdG9jb2xgLgorI1tkZXJpdmUoRGVmYXVsdCldCitwdWIgc3RydWN0IFRDb21wYWN0SW5wdXRQcm90b2NvbEZhY3Rvcnk7CisKK2ltcGwgVENvbXBhY3RJbnB1dFByb3RvY29sRmFjdG9yeSB7CisgICAgLy8vIENyZWF0ZSBhIGBUQ29tcGFjdElucHV0UHJvdG9jb2xGYWN0b3J5YC4KKyAgICBwdWIgZm4gbmV3KCkgLT4gVENvbXBhY3RJbnB1dFByb3RvY29sRmFjdG9yeSB7CisgICAgICAgIFRDb21wYWN0SW5wdXRQcm90b2NvbEZhY3Rvcnkge30KKyAgICB9Cit9CisKK2ltcGwgVElucHV0UHJvdG9jb2xGYWN0b3J5IGZvciBUQ29tcGFjdElucHV0UHJvdG9jb2xGYWN0b3J5IHsKKyAgICBmbiBjcmVhdGUoJnNlbGYsIHRyYW5zcG9ydDogQm94PFRSZWFkVHJhbnNwb3J0ICsgU2VuZD4pIC0+IEJveDxUSW5wdXRQcm90b2NvbCArIFNlbmQ+IHsKKyAgICAgICAgQm94OjpuZXcoVENvbXBhY3RJbnB1dFByb3RvY29sOjpuZXcodHJhbnNwb3J0KSkKKyAgICB9Cit9CisKKy8vLyBXcml0ZSBtZXNzYWdlcyB1c2luZyB0aGUgVGhyaWZ0IGNvbXBhY3QgcHJvdG9jb2wuCisvLy8KKy8vLyAjIEV4YW1wbGVzCisvLy8KKy8vLyBDcmVhdGUgYW5kIHVzZSBhIGBUQ29tcGFjdE91dHB1dFByb3RvY29sYC4KKy8vLworLy8vIGBgYG5vX3J1bgorLy8vIHVzZSB0aHJpZnQ6OnByb3RvY29sOjp7VENvbXBhY3RPdXRwdXRQcm90b2NvbCwgVE91dHB1dFByb3RvY29sfTsKKy8vLyB1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUY3BDaGFubmVsOworLy8vCisvLy8gbGV0IG11dCBjaGFubmVsID0gVFRjcENoYW5uZWw6Om5ldygpOworLy8vIGNoYW5uZWwub3BlbigibG9jYWxob3N0OjkwOTAiKS51bndyYXAoKTsKKy8vLworLy8vIGxldCBtdXQgcHJvdG9jb2wgPSBUQ29tcGFjdE91dHB1dFByb3RvY29sOjpuZXcoY2hhbm5lbCk7CisvLy8KKy8vLyBwcm90b2NvbC53cml0ZV9ib29sKHRydWUpLnVud3JhcCgpOworLy8vIHByb3RvY29sLndyaXRlX3N0cmluZygidGVzdF9zdHJpbmciKS51bndyYXAoKTsKKy8vLyBgYGAKKyNbZGVyaXZlKERlYnVnKV0KK3B1YiBzdHJ1Y3QgVENvbXBhY3RPdXRwdXRQcm90b2NvbDxUPgord2hlcmUKKyAgICBUOiBUV3JpdGVUcmFuc3BvcnQsCit7CisgICAgLy8gSWRlbnRpZmllciBvZiB0aGUgbGFzdCBmaWVsZCBzZXJpYWxpemVkIGZvciBhIHN0cnVjdC4KKyAgICBsYXN0X3dyaXRlX2ZpZWxkX2lkOiBpMTYsCisgICAgLy8gU3RhY2sgb2YgdGhlIGxhc3Qgd3JpdHRlbiBmaWVsZCBpZHMgKG5ldyBlbnRyeSBhZGRlZCBlYWNoIHRpbWUgYSBuZXN0ZWQgc3RydWN0IGlzIHdyaXR0ZW4pLgorICAgIHdyaXRlX2ZpZWxkX2lkX3N0YWNrOiBWZWM8aTE2PiwKKyAgICAvLyBGaWVsZCBpZGVudGlmaWVyIG9mIHRoZSBib29sZWFuIGZpZWxkIHRvIGJlIHdyaXR0ZW4uCisgICAgLy8gU2F2ZWQgYmVjYXVzZSBib29sZWFuIGZpZWxkcyBhbmQgdGhlaXIgdmFsdWUgYXJlIGVuY29kZWQgaW4gYSBzaW5nbGUgYnl0ZQorICAgIHBlbmRpbmdfd3JpdGVfYm9vbF9maWVsZF9pZGVudGlmaWVyOiBPcHRpb248VEZpZWxkSWRlbnRpZmllcj4sCisgICAgLy8gVW5kZXJseWluZyB0cmFuc3BvcnQgdXNlZCBmb3IgYnl0ZS1sZXZlbCBvcGVyYXRpb25zLgorICAgIHRyYW5zcG9ydDogVCwKK30KKworaW1wbDxUPiBUQ29tcGFjdE91dHB1dFByb3RvY29sPFQ+Cit3aGVyZQorICAgIFQ6IFRXcml0ZVRyYW5zcG9ydCwKK3sKKyAgICAvLy8gQ3JlYXRlIGEgYFRDb21wYWN0T3V0cHV0UHJvdG9jb2xgIHRoYXQgd3JpdGVzIGJ5dGVzIHRvIGB0cmFuc3BvcnRgLgorICAgIHB1YiBmbiBuZXcodHJhbnNwb3J0OiBUKSAtPiBUQ29tcGFjdE91dHB1dFByb3RvY29sPFQ+IHsKKyAgICAgICAgVENvbXBhY3RPdXRwdXRQcm90b2NvbCB7CisgICAgICAgICAgICBsYXN0X3dyaXRlX2ZpZWxkX2lkOiAwLAorICAgICAgICAgICAgd3JpdGVfZmllbGRfaWRfc3RhY2s6IFZlYzo6bmV3KCksCisgICAgICAgICAgICBwZW5kaW5nX3dyaXRlX2Jvb2xfZmllbGRfaWRlbnRpZmllcjogTm9uZSwKKyAgICAgICAgICAgIHRyYW5zcG9ydDogdHJhbnNwb3J0LAorICAgICAgICB9CisgICAgfQorCisgICAgLy8gRklYTUU6IGZpZWxkX3R5cGUgYXMgdW5jb25zdHJhaW5lZCB1OCBpcyBiYWQKKyAgICBmbiB3cml0ZV9maWVsZF9oZWFkZXIoJm11dCBzZWxmLCBmaWVsZF90eXBlOiB1OCwgZmllbGRfaWQ6IGkxNikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgbGV0IGZpZWxkX2RlbHRhID0gZmllbGRfaWQgLSBzZWxmLmxhc3Rfd3JpdGVfZmllbGRfaWQ7CisgICAgICAgIGlmIGZpZWxkX2RlbHRhID4gMCAmJiBmaWVsZF9kZWx0YSA8IDE1IHsKKyAgICAgICAgICAgIHNlbGYud3JpdGVfYnl0ZSgoKGZpZWxkX2RlbHRhIGFzIHU4KSA8PCA0KSB8IGZpZWxkX3R5cGUpPzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNlbGYud3JpdGVfYnl0ZShmaWVsZF90eXBlKT87CisgICAgICAgICAgICBzZWxmLndyaXRlX2kxNihmaWVsZF9pZCk/OworICAgICAgICB9CisgICAgICAgIHNlbGYubGFzdF93cml0ZV9maWVsZF9pZCA9IGZpZWxkX2lkOworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9saXN0X3NldF9iZWdpbigmbXV0IHNlbGYsIGVsZW1lbnRfdHlwZTogVFR5cGUsIGVsZW1lbnRfY291bnQ6IGkzMikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgbGV0IGVsZW1faWRlbnRpZmllciA9IGNvbGxlY3Rpb25fdHlwZV90b191OChlbGVtZW50X3R5cGUpOworICAgICAgICBpZiBlbGVtZW50X2NvdW50IDw9IDE0IHsKKyAgICAgICAgICAgIGxldCBoZWFkZXIgPSAoZWxlbWVudF9jb3VudCBhcyB1OCkgPDwgNCB8IGVsZW1faWRlbnRpZmllcjsKKyAgICAgICAgICAgIHNlbGYud3JpdGVfYnl0ZShoZWFkZXIpCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsZXQgaGVhZGVyID0gMHhGMCB8IGVsZW1faWRlbnRpZmllcjsKKyAgICAgICAgICAgIHNlbGYud3JpdGVfYnl0ZShoZWFkZXIpPzsKKyAgICAgICAgICAgIHNlbGYudHJhbnNwb3J0CisgICAgICAgICAgICAgICAgLndyaXRlX3ZhcmludChlbGVtZW50X2NvdW50IGFzIHUzMikKKyAgICAgICAgICAgICAgICAubWFwX2VycihGcm9tOjpmcm9tKQorICAgICAgICAgICAgICAgIC5tYXAofF98ICgpKQorICAgICAgICB9CisgICAgfQorCisgICAgZm4gYXNzZXJ0X25vX3BlbmRpbmdfYm9vbF93cml0ZSgmc2VsZikgeworICAgICAgICBpZiBsZXQgU29tZShyZWYgZikgPSBzZWxmLnBlbmRpbmdfd3JpdGVfYm9vbF9maWVsZF9pZGVudGlmaWVyIHsKKyAgICAgICAgICAgIHBhbmljISgicGVuZGluZyBib29sIGZpZWxkIHs6P30gbm90IHdyaXR0ZW4iLCBmKQorICAgICAgICB9CisgICAgfQorfQorCitpbXBsPFQ+IFRPdXRwdXRQcm90b2NvbCBmb3IgVENvbXBhY3RPdXRwdXRQcm90b2NvbDxUPgord2hlcmUKKyAgICBUOiBUV3JpdGVUcmFuc3BvcnQsCit7CisgICAgZm4gd3JpdGVfbWVzc2FnZV9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUTWVzc2FnZUlkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYud3JpdGVfYnl0ZShDT01QQUNUX1BST1RPQ09MX0lEKT87CisgICAgICAgIHNlbGYud3JpdGVfYnl0ZSgodTg6OmZyb20oaWRlbnRpZmllci5tZXNzYWdlX3R5cGUpIDw8IDUpIHwgQ09NUEFDVF9WRVJTSU9OKT87CisgICAgICAgIHNlbGYud3JpdGVfaTMyKGlkZW50aWZpZXIuc2VxdWVuY2VfbnVtYmVyKT87CisgICAgICAgIHNlbGYud3JpdGVfc3RyaW5nKCZpZGVudGlmaWVyLm5hbWUpPzsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gd3JpdGVfbWVzc2FnZV9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmFzc2VydF9ub19wZW5kaW5nX2Jvb2xfd3JpdGUoKTsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gd3JpdGVfc3RydWN0X2JlZ2luKCZtdXQgc2VsZiwgXzogJlRTdHJ1Y3RJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLndyaXRlX2ZpZWxkX2lkX3N0YWNrLnB1c2goc2VsZi5sYXN0X3dyaXRlX2ZpZWxkX2lkKTsKKyAgICAgICAgc2VsZi5sYXN0X3dyaXRlX2ZpZWxkX2lkID0gMDsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gd3JpdGVfc3RydWN0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuYXNzZXJ0X25vX3BlbmRpbmdfYm9vbF93cml0ZSgpOworICAgICAgICBzZWxmLmxhc3Rfd3JpdGVfZmllbGRfaWQgPSBzZWxmCisgICAgICAgICAgICAud3JpdGVfZmllbGRfaWRfc3RhY2sKKyAgICAgICAgICAgIC5wb3AoKQorICAgICAgICAgICAgLmV4cGVjdCgic2hvdWxkIGhhdmUgcHJldmlvdXMgZmllbGQgaWRzIik7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHdyaXRlX2ZpZWxkX2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRGaWVsZElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIG1hdGNoIGlkZW50aWZpZXIuZmllbGRfdHlwZSB7CisgICAgICAgICAgICBUVHlwZTo6Qm9vbCA9PiB7CisgICAgICAgICAgICAgICAgaWYgc2VsZi5wZW5kaW5nX3dyaXRlX2Jvb2xfZmllbGRfaWRlbnRpZmllci5pc19zb21lKCkgeworICAgICAgICAgICAgICAgICAgICBwYW5pYyEoCisgICAgICAgICAgICAgICAgICAgICAgICAic2hvdWxkIG5vdCBoYXZlIGEgcGVuZGluZyBib29sIHdoaWxlIHdyaXRpbmcgYW5vdGhlciBib29sIHdpdGggaWQ6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICB7Oj99IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXIKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZWxmLnBlbmRpbmdfd3JpdGVfYm9vbF9maWVsZF9pZGVudGlmaWVyID0gU29tZShpZGVudGlmaWVyLmNsb25lKCkpOworICAgICAgICAgICAgICAgIE9rKCgpKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgXyA9PiB7CisgICAgICAgICAgICAgICAgbGV0IGZpZWxkX3R5cGUgPSB0eXBlX3RvX3U4KGlkZW50aWZpZXIuZmllbGRfdHlwZSk7CisgICAgICAgICAgICAgICAgbGV0IGZpZWxkX2lkID0gaWRlbnRpZmllci5pZC5leHBlY3QoIm5vbi1zdG9wIGZpZWxkIHNob3VsZCBoYXZlIGZpZWxkIGlkIik7CisgICAgICAgICAgICAgICAgc2VsZi53cml0ZV9maWVsZF9oZWFkZXIoZmllbGRfdHlwZSwgZmllbGRfaWQpCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbiB3cml0ZV9maWVsZF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmFzc2VydF9ub19wZW5kaW5nX2Jvb2xfd3JpdGUoKTsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gd3JpdGVfZmllbGRfc3RvcCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuYXNzZXJ0X25vX3BlbmRpbmdfYm9vbF93cml0ZSgpOworICAgICAgICBzZWxmLndyaXRlX2J5dGUodHlwZV90b191OChUVHlwZTo6U3RvcCkpCisgICAgfQorCisgICAgZm4gd3JpdGVfYm9vbCgmbXV0IHNlbGYsIGI6IGJvb2wpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIG1hdGNoIHNlbGYucGVuZGluZ193cml0ZV9ib29sX2ZpZWxkX2lkZW50aWZpZXIudGFrZSgpIHsKKyAgICAgICAgICAgIFNvbWUocGVuZGluZykgPT4geworICAgICAgICAgICAgICAgIGxldCBmaWVsZF9pZCA9IHBlbmRpbmcuaWQuZXhwZWN0KCJib29sIGZpZWxkIHNob3VsZCBoYXZlIGEgZmllbGQgaWQiKTsKKyAgICAgICAgICAgICAgICBsZXQgZmllbGRfdHlwZV9hc191OCA9IGlmIGIgeyAweDAxIH0gZWxzZSB7IDB4MDIgfTsKKyAgICAgICAgICAgICAgICBzZWxmLndyaXRlX2ZpZWxkX2hlYWRlcihmaWVsZF90eXBlX2FzX3U4LCBmaWVsZF9pZCkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE5vbmUgPT4geworICAgICAgICAgICAgICAgIGlmIGIgeworICAgICAgICAgICAgICAgICAgICBzZWxmLndyaXRlX2J5dGUoMHgwMSkKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzZWxmLndyaXRlX2J5dGUoMHgwMikKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbiB3cml0ZV9ieXRlcygmbXV0IHNlbGYsIGI6ICZbdThdKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLnRyYW5zcG9ydC53cml0ZV92YXJpbnQoYi5sZW4oKSBhcyB1MzIpPzsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQud3JpdGVfYWxsKGIpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9pOCgmbXV0IHNlbGYsIGk6IGk4KSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLndyaXRlX2J5dGUoaSBhcyB1OCkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9pMTYoJm11dCBzZWxmLCBpOiBpMTYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0CisgICAgICAgICAgICAud3JpdGVfdmFyaW50KGkpCisgICAgICAgICAgICAubWFwX2VycihGcm9tOjpmcm9tKQorICAgICAgICAgICAgLm1hcCh8X3wgKCkpCisgICAgfQorCisgICAgZm4gd3JpdGVfaTMyKCZtdXQgc2VsZiwgaTogaTMyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLnRyYW5zcG9ydAorICAgICAgICAgICAgLndyaXRlX3ZhcmludChpKQorICAgICAgICAgICAgLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICAgICAgICAgIC5tYXAofF98ICgpKQorICAgIH0KKworICAgIGZuIHdyaXRlX2k2NCgmbXV0IHNlbGYsIGk6IGk2NCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQKKyAgICAgICAgICAgIC53cml0ZV92YXJpbnQoaSkKKyAgICAgICAgICAgIC5tYXBfZXJyKEZyb206OmZyb20pCisgICAgICAgICAgICAubWFwKHxffCAoKSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9kb3VibGUoJm11dCBzZWxmLCBkOiBmNjQpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0LndyaXRlX2Y2NDo6PEJpZ0VuZGlhbj4oZCkubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIGZuIHdyaXRlX3N0cmluZygmbXV0IHNlbGYsIHM6ICZzdHIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYud3JpdGVfYnl0ZXMocy5hc19ieXRlcygpKQorICAgIH0KKworICAgIGZuIHdyaXRlX2xpc3RfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVExpc3RJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLndyaXRlX2xpc3Rfc2V0X2JlZ2luKGlkZW50aWZpZXIuZWxlbWVudF90eXBlLCBpZGVudGlmaWVyLnNpemUpCisgICAgfQorCisgICAgZm4gd3JpdGVfbGlzdF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9zZXRfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVFNldElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYud3JpdGVfbGlzdF9zZXRfYmVnaW4oaWRlbnRpZmllci5lbGVtZW50X3R5cGUsIGlkZW50aWZpZXIuc2l6ZSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9zZXRfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gd3JpdGVfbWFwX2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRNYXBJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBpZiBpZGVudGlmaWVyLnNpemUgPT0gMCB7CisgICAgICAgICAgICBzZWxmLndyaXRlX2J5dGUoMCkKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNlbGYudHJhbnNwb3J0LndyaXRlX3ZhcmludChpZGVudGlmaWVyLnNpemUgYXMgdTMyKT87CisKKyAgICAgICAgICAgIGxldCBrZXlfdHlwZSA9IGlkZW50aWZpZXIKKyAgICAgICAgICAgICAgICAua2V5X3R5cGUKKyAgICAgICAgICAgICAgICAuZXhwZWN0KCJtYXAgaWRlbnRpZmllciB0byB3cml0ZSBzaG91bGQgY29udGFpbiBrZXkgdHlwZSIpOworICAgICAgICAgICAgbGV0IGtleV90eXBlX2J5dGUgPSBjb2xsZWN0aW9uX3R5cGVfdG9fdTgoa2V5X3R5cGUpIDw8IDQ7CisKKyAgICAgICAgICAgIGxldCB2YWxfdHlwZSA9IGlkZW50aWZpZXIKKyAgICAgICAgICAgICAgICAudmFsdWVfdHlwZQorICAgICAgICAgICAgICAgIC5leHBlY3QoIm1hcCBpZGVudGlmaWVyIHRvIHdyaXRlIHNob3VsZCBjb250YWluIHZhbHVlIHR5cGUiKTsKKyAgICAgICAgICAgIGxldCB2YWxfdHlwZV9ieXRlID0gY29sbGVjdGlvbl90eXBlX3RvX3U4KHZhbF90eXBlKTsKKworICAgICAgICAgICAgbGV0IG1hcF90eXBlX2hlYWRlciA9IGtleV90eXBlX2J5dGUgfCB2YWxfdHlwZV9ieXRlOworICAgICAgICAgICAgc2VsZi53cml0ZV9ieXRlKG1hcF90eXBlX2hlYWRlcikKKyAgICAgICAgfQorICAgIH0KKworICAgIGZuIHdyaXRlX21hcF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiBmbHVzaCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0LmZsdXNoKCkubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIC8vIHV0aWxpdHkKKyAgICAvLworCisgICAgZm4gd3JpdGVfYnl0ZSgmbXV0IHNlbGYsIGI6IHU4KSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLnRyYW5zcG9ydC53cml0ZSgmW2JdKS5tYXBfZXJyKEZyb206OmZyb20pLm1hcCh8X3wgKCkpCisgICAgfQorfQorCisvLy8gRmFjdG9yeSBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzIG9mIGBUQ29tcGFjdE91dHB1dFByb3RvY29sYC4KKyNbZGVyaXZlKERlZmF1bHQpXQorcHViIHN0cnVjdCBUQ29tcGFjdE91dHB1dFByb3RvY29sRmFjdG9yeTsKKworaW1wbCBUQ29tcGFjdE91dHB1dFByb3RvY29sRmFjdG9yeSB7CisgICAgLy8vIENyZWF0ZSBhIGBUQ29tcGFjdE91dHB1dFByb3RvY29sRmFjdG9yeWAuCisgICAgcHViIGZuIG5ldygpIC0+IFRDb21wYWN0T3V0cHV0UHJvdG9jb2xGYWN0b3J5IHsKKyAgICAgICAgVENvbXBhY3RPdXRwdXRQcm90b2NvbEZhY3Rvcnkge30KKyAgICB9Cit9CisKK2ltcGwgVE91dHB1dFByb3RvY29sRmFjdG9yeSBmb3IgVENvbXBhY3RPdXRwdXRQcm90b2NvbEZhY3RvcnkgeworICAgIGZuIGNyZWF0ZSgmc2VsZiwgdHJhbnNwb3J0OiBCb3g8VFdyaXRlVHJhbnNwb3J0ICsgU2VuZD4pIC0+IEJveDxUT3V0cHV0UHJvdG9jb2wgKyBTZW5kPiB7CisgICAgICAgIEJveDo6bmV3KFRDb21wYWN0T3V0cHV0UHJvdG9jb2w6Om5ldyh0cmFuc3BvcnQpKQorICAgIH0KK30KKworZm4gY29sbGVjdGlvbl90eXBlX3RvX3U4KGZpZWxkX3R5cGU6IFRUeXBlKSAtPiB1OCB7CisgICAgbWF0Y2ggZmllbGRfdHlwZSB7CisgICAgICAgIFRUeXBlOjpCb29sID0+IDB4MDEsCisgICAgICAgIGYgPT4gdHlwZV90b191OChmKSwKKyAgICB9Cit9CisKK2ZuIHR5cGVfdG9fdTgoZmllbGRfdHlwZTogVFR5cGUpIC0+IHU4IHsKKyAgICBtYXRjaCBmaWVsZF90eXBlIHsKKyAgICAgICAgVFR5cGU6OlN0b3AgPT4gMHgwMCwKKyAgICAgICAgVFR5cGU6OkkwOCA9PiAweDAzLCAvLyBlcXVpdmFsZW50IHRvIFRUeXBlOjpCeXRlCisgICAgICAgIFRUeXBlOjpJMTYgPT4gMHgwNCwKKyAgICAgICAgVFR5cGU6OkkzMiA9PiAweDA1LAorICAgICAgICBUVHlwZTo6STY0ID0+IDB4MDYsCisgICAgICAgIFRUeXBlOjpEb3VibGUgPT4gMHgwNywKKyAgICAgICAgVFR5cGU6OlN0cmluZyA9PiAweDA4LAorICAgICAgICBUVHlwZTo6TGlzdCA9PiAweDA5LAorICAgICAgICBUVHlwZTo6U2V0ID0+IDB4MEEsCisgICAgICAgIFRUeXBlOjpNYXAgPT4gMHgwQiwKKyAgICAgICAgVFR5cGU6OlN0cnVjdCA9PiAweDBDLAorICAgICAgICBfID0+IHBhbmljIShmb3JtYXQhKAorICAgICAgICAgICAgInNob3VsZCBub3QgaGF2ZSBhdHRlbXB0ZWQgdG8gY29udmVydCB7fSB0byB1OCIsCisgICAgICAgICAgICBmaWVsZF90eXBlCisgICAgICAgICkpLAorICAgIH0KK30KKworZm4gY29sbGVjdGlvbl91OF90b190eXBlKGI6IHU4KSAtPiA6OlJlc3VsdDxUVHlwZT4geworICAgIG1hdGNoIGIgeworICAgICAgICAweDAxID0+IE9rKFRUeXBlOjpCb29sKSwKKyAgICAgICAgbyA9PiB1OF90b190eXBlKG8pLAorICAgIH0KK30KKworZm4gdThfdG9fdHlwZShiOiB1OCkgLT4gOjpSZXN1bHQ8VFR5cGU+IHsKKyAgICBtYXRjaCBiIHsKKyAgICAgICAgMHgwMCA9PiBPayhUVHlwZTo6U3RvcCksCisgICAgICAgIDB4MDMgPT4gT2soVFR5cGU6OkkwOCksIC8vIGVxdWl2YWxlbnQgdG8gVFR5cGU6OkJ5dGUKKyAgICAgICAgMHgwNCA9PiBPayhUVHlwZTo6STE2KSwKKyAgICAgICAgMHgwNSA9PiBPayhUVHlwZTo6STMyKSwKKyAgICAgICAgMHgwNiA9PiBPayhUVHlwZTo6STY0KSwKKyAgICAgICAgMHgwNyA9PiBPayhUVHlwZTo6RG91YmxlKSwKKyAgICAgICAgMHgwOCA9PiBPayhUVHlwZTo6U3RyaW5nKSwKKyAgICAgICAgMHgwOSA9PiBPayhUVHlwZTo6TGlzdCksCisgICAgICAgIDB4MEEgPT4gT2soVFR5cGU6OlNldCksCisgICAgICAgIDB4MEIgPT4gT2soVFR5cGU6Ok1hcCksCisgICAgICAgIDB4MEMgPT4gT2soVFR5cGU6OlN0cnVjdCksCisgICAgICAgIHVua24gPT4gRXJyKDo6RXJyb3I6OlByb3RvY29sKDo6UHJvdG9jb2xFcnJvciB7CisgICAgICAgICAgICBraW5kOiA6OlByb3RvY29sRXJyb3JLaW5kOjpJbnZhbGlkRGF0YSwKKyAgICAgICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoImNhbm5vdCBjb252ZXJ0IHt9IGludG8gVFR5cGUiLCB1bmtuKSwKKyAgICAgICAgfSkpLAorICAgIH0KK30KKworI1tjZmcodGVzdCldCittb2QgdGVzdHMgeworCisgICAgdXNlIHByb3RvY29sOjp7CisgICAgICAgIFRGaWVsZElkZW50aWZpZXIsIFRJbnB1dFByb3RvY29sLCBUTGlzdElkZW50aWZpZXIsIFRNYXBJZGVudGlmaWVyLCBUTWVzc2FnZUlkZW50aWZpZXIsCisgICAgICAgIFRNZXNzYWdlVHlwZSwgVE91dHB1dFByb3RvY29sLCBUU2V0SWRlbnRpZmllciwgVFN0cnVjdElkZW50aWZpZXIsIFRUeXBlLAorICAgIH07CisgICAgdXNlIHRyYW5zcG9ydDo6e1JlYWRIYWxmLCBUQnVmZmVyQ2hhbm5lbCwgVElvQ2hhbm5lbCwgV3JpdGVIYWxmfTsKKworICAgIHVzZSBzdXBlcjo6KjsKKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX21lc3NhZ2VfYmVnaW5fMCgpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfbWVzc2FnZV9iZWdpbigmVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoCisgICAgICAgICAgICAiZm9vIiwKKyAgICAgICAgICAgIFRNZXNzYWdlVHlwZTo6Q2FsbCwKKyAgICAgICAgICAgIDQzMQorICAgICAgICApKSk7CisKKyAgICAgICAgI1tjZmdfYXR0cihydXN0Zm10LCBydXN0Zm10Ojpza2lwKV0KKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDhdID0gWworICAgICAgICAgICAgMHg4MiwgLyogcHJvdG9jb2wgSUQgKi8KKyAgICAgICAgICAgIDB4MjEsIC8qIG1lc3NhZ2UgdHlwZSB8IHByb3RvY29sIHZlcnNpb24gKi8KKyAgICAgICAgICAgIDB4REUsCisgICAgICAgICAgICAweDA2LCAvKiB6aWctemFnIHZhcmludCBzZXF1ZW5jZSBudW1iZXIgKi8KKyAgICAgICAgICAgIDB4MDMsIC8qIG1lc3NhZ2UtbmFtZSBsZW5ndGggKi8KKyAgICAgICAgICAgIDB4NjYsCisgICAgICAgICAgICAweDZGLAorICAgICAgICAgICAgMHg2RiAvKiAiZm9vIiAqLywKKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbWVzc2FnZV9iZWdpbl8xKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9tZXNzYWdlX2JlZ2luKCZUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygKKyAgICAgICAgICAgICJiYXIiLAorICAgICAgICAgICAgVE1lc3NhZ2VUeXBlOjpSZXBseSwKKyAgICAgICAgICAgIDk5MTgyOAorICAgICAgICApKSk7CisKKyAgICAgICAgI1tjZmdfYXR0cihydXN0Zm10LCBydXN0Zm10Ojpza2lwKV0KKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDldID0gWworICAgICAgICAgICAgMHg4MiwgLyogcHJvdG9jb2wgSUQgKi8KKyAgICAgICAgICAgIDB4NDEsIC8qIG1lc3NhZ2UgdHlwZSB8IHByb3RvY29sIHZlcnNpb24gKi8KKyAgICAgICAgICAgIDB4QTgsCisgICAgICAgICAgICAweDg5LAorICAgICAgICAgICAgMHg3OSwgLyogemlnLXphZyB2YXJpbnQgc2VxdWVuY2UgbnVtYmVyICovCisgICAgICAgICAgICAweDAzLCAvKiBtZXNzYWdlLW5hbWUgbGVuZ3RoICovCisgICAgICAgICAgICAweDYyLAorICAgICAgICAgICAgMHg2MSwKKyAgICAgICAgICAgIDB4NzIgLyogImJhciIgKi8sCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfbWVzc2FnZV9iZWdpbigpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIGxldCBpZGVudCA9IFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KCJzZXJ2aWNlX2NhbGwiLCBUTWVzc2FnZVR5cGU6OkNhbGwsIDEyODM5NDgpOworCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfbWVzc2FnZV9iZWdpbigmaWRlbnQpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICBsZXQgcmVzID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX21lc3NhZ2VfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoJnJlcywgJmlkZW50KTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9tZXNzYWdlX2VuZCgpIHsKKyAgICAgICAgYXNzZXJ0X25vX3dyaXRlKHxvfCBvLndyaXRlX21lc3NhZ2VfZW5kKCkpOworICAgIH0KKworICAgIC8vIE5PVEU6IHN0cnVjdHMgYW5kIGZpZWxkcyBhcmUgdGVzdGVkIHRvZ2V0aGVyCisgICAgLy8KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX3N0cnVjdF93aXRoX2RlbHRhX2ZpZWxkcygpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIC8vIG5vIGJ5dGVzIHNob3VsZCBiZSB3cml0dGVuIGhvd2V2ZXIKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gd3JpdGUgdGhyZWUgZmllbGRzIHdpdGggdGlueSBmaWVsZCBpZHMKKyAgICAgICAgLy8gc2luY2UgdGhleSdyZSBzbWFsbCB0aGUgZmllbGQgaWRzIHdpbGwgYmUgZW5jb2RlZCBhcyBkZWx0YXMKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGlzIHRoZSBmaXJzdCBmaWVsZCAoYW5kIGl0J3MgemVybykgaXQgZ2V0cyB0aGUgZnVsbCB2YXJpbnQgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STA4LCAwKSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMCBhbmQgPCAxNSBpdCBjYW4gYmUgZW5jb2RlZCBhcyBhIGRlbHRhCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkxNiwgNCkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDAgYW5kIDwgMTUgaXQgY2FuIGJlIGVuY29kZWQgYXMgYSBkZWx0YQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpMaXN0LCA5KSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBub3csIGZpbmlzaCB0aGUgc3RydWN0IG9mZgorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICAjW2NmZ19hdHRyKHJ1c3RmbXQsIHJ1c3RmbXQ6OnNraXApXQorICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgNV0gPSBbCisgICAgICAgICAgICAweDAzLCAvKiBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDAwLCAvKiBmaXJzdCBmaWVsZCBpZCAqLworICAgICAgICAgICAgMHg0NCwgLyogZmllbGQgZGVsdGEgKDQpIHwgZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHg1OSwgLyogZmllbGQgZGVsdGEgKDUpIHwgZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHgwMCAvKiBmaWVsZCBzdG9wICovLAorICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX3N0cnVjdF93aXRoX2RlbHRhX2ZpZWxkcygpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIC8vIG5vIGJ5dGVzIHNob3VsZCBiZSB3cml0dGVuIGhvd2V2ZXIKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gd3JpdGUgdGhyZWUgZmllbGRzIHdpdGggdGlueSBmaWVsZCBpZHMKKyAgICAgICAgLy8gc2luY2UgdGhleSdyZSBzbWFsbCB0aGUgZmllbGQgaWRzIHdpbGwgYmUgZW5jb2RlZCBhcyBkZWx0YXMKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGlzIHRoZSBmaXJzdCBmaWVsZCAoYW5kIGl0J3MgemVybykgaXQgZ2V0cyB0aGUgZnVsbCB2YXJpbnQgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzEgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJMDgsIDApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8xKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAwIGFuZCA8IDE1IGl0IGNhbiBiZSBlbmNvZGVkIGFzIGEgZGVsdGEKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzIgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJMTYsIDQpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8yKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAwIGFuZCA8IDE1IGl0IGNhbiBiZSBlbmNvZGVkIGFzIGEgZGVsdGEKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzMgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpMaXN0LCA5KTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMykpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBub3csIGZpbmlzaCB0aGUgc3RydWN0IG9mZgorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICAvLyByZWFkIHRoZSBzdHJ1Y3QgYmFjaworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2JlZ2luKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzEgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzEsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMQorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzIgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzIsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMgorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzMgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzMsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMworICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzQgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzQsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIGZpZWxkX3R5cGU6IFRUeXBlOjpTdG9wLAorICAgICAgICAgICAgICAgIGlkOiBOb25lLAorICAgICAgICAgICAgfQorICAgICAgICApOworCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfZW5kKCkpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX3N0cnVjdF93aXRoX25vbl96ZXJvX2luaXRpYWxfZmllbGRfYW5kX2RlbHRhX2ZpZWxkcygpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIC8vIG5vIGJ5dGVzIHNob3VsZCBiZSB3cml0dGVuIGhvd2V2ZXIKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gd3JpdGUgdGhyZWUgZmllbGRzIHdpdGggdGlueSBmaWVsZCBpZHMKKyAgICAgICAgLy8gc2luY2UgdGhleSdyZSBzbWFsbCB0aGUgZmllbGQgaWRzIHdpbGwgYmUgZW5jb2RlZCBhcyBkZWx0YXMKKworICAgICAgICAvLyBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STMyLCAxKSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMCBhbmQgPCAxNSBpdCBjYW4gYmUgZW5jb2RlZCBhcyBhIGRlbHRhCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OlNldCwgMikpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDAgYW5kIDwgMTUgaXQgY2FuIGJlIGVuY29kZWQgYXMgYSBkZWx0YQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpTdHJpbmcsIDYpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIG5vdywgZmluaXNoIHRoZSBzdHJ1Y3Qgb2ZmCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgICNbY2ZnX2F0dHIocnVzdGZtdCwgcnVzdGZtdDo6c2tpcCldCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyA0XSA9IFsKKyAgICAgICAgICAgIDB4MTUsIC8qIGZpZWxkIGRlbHRhICgxKSB8IGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MUEsIC8qIGZpZWxkIGRlbHRhICgxKSB8IGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4NDgsIC8qIGZpZWxkIGRlbHRhICg0KSB8IGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MDAgLyogZmllbGQgc3RvcCAqLywKKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9zdHJ1Y3Rfd2l0aF9ub25femVyb19pbml0aWFsX2ZpZWxkX2FuZF9kZWx0YV9maWVsZHMoKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICAvLyBubyBieXRlcyBzaG91bGQgYmUgd3JpdHRlbiBob3dldmVyCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIHdyaXRlIHRocmVlIGZpZWxkcyB3aXRoIHRpbnkgZmllbGQgaWRzCisgICAgICAgIC8vIHNpbmNlIHRoZXkncmUgc21hbGwgdGhlIGZpZWxkIGlkcyB3aWxsIGJlIGVuY29kZWQgYXMgZGVsdGFzCisKKyAgICAgICAgLy8gZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8xID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STMyLCAxKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMCBhbmQgPCAxNSBpdCBjYW4gYmUgZW5jb2RlZCBhcyBhIGRlbHRhCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8yID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6U2V0LCAyKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMikpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMCBhbmQgPCAxNSBpdCBjYW4gYmUgZW5jb2RlZCBhcyBhIGRlbHRhCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8zID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6U3RyaW5nLCA2KTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMykpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBub3csIGZpbmlzaCB0aGUgc3RydWN0IG9mZgorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICAvLyByZWFkIHRoZSBzdHJ1Y3QgYmFjaworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2JlZ2luKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzEgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzEsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMQorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzIgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzIsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMgorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzMgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzMsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMworICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzQgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzQsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIGZpZWxkX3R5cGU6IFRUeXBlOjpTdG9wLAorICAgICAgICAgICAgICAgIGlkOiBOb25lLAorICAgICAgICAgICAgfQorICAgICAgICApOworCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfZW5kKCkpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX3N0cnVjdF93aXRoX2xvbmdfZmllbGRzKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgLy8gbm8gYnl0ZXMgc2hvdWxkIGJlIHdyaXR0ZW4gaG93ZXZlcgorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyB3cml0ZSB0aHJlZSBmaWVsZHMgd2l0aCBmaWVsZCBpZHMgdGhhdCBjYW5ub3QgYmUgZW5jb2RlZCBhcyBkZWx0YXMKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGlzIHRoZSBmaXJzdCBmaWVsZCAoYW5kIGl0J3MgemVybykgaXQgZ2V0cyB0aGUgZnVsbCB2YXJpbnQgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STMyLCAwKSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhIGlzID4gMTUgaXQgaXMgZW5jb2RlZCBhcyBhIHppZy16YWcgdmFyaW50CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6Okk2NCwgMTYpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgaXMgPiAxNSBpdCBpcyBlbmNvZGVkIGFzIGEgemlnLXphZyB2YXJpbnQKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6U2V0LCA5OSkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gbm93LCBmaW5pc2ggdGhlIHN0cnVjdCBvZmYKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgI1tjZmdfYXR0cihydXN0Zm10LCBydXN0Zm10Ojpza2lwKV0KKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDhdID0gWworICAgICAgICAgICAgMHgwNSwgLyogZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHgwMCwgLyogZmlyc3QgZmllbGQgaWQgKi8KKyAgICAgICAgICAgIDB4MDYsIC8qIGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MjAsIC8qIHppZy16YWcgdmFyaW50IGZpZWxkIGlkICovCisgICAgICAgICAgICAweDBBLCAvKiBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweEM2LAorICAgICAgICAgICAgMHgwMSwgLyogemlnLXphZyB2YXJpbnQgZmllbGQgaWQgKi8KKyAgICAgICAgICAgIDB4MDAgLyogZmllbGQgc3RvcCAqLywKKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9zdHJ1Y3Rfd2l0aF9sb25nX2ZpZWxkcygpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIC8vIG5vIGJ5dGVzIHNob3VsZCBiZSB3cml0dGVuIGhvd2V2ZXIKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gd3JpdGUgdGhyZWUgZmllbGRzIHdpdGggZmllbGQgaWRzIHRoYXQgY2Fubm90IGJlIGVuY29kZWQgYXMgZGVsdGFzCisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBpcyB0aGUgZmlyc3QgZmllbGQgKGFuZCBpdCdzIHplcm8pIGl0IGdldHMgdGhlIGZ1bGwgdmFyaW50IHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8xID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STMyLCAwKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhIGlzID4gMTUgaXQgaXMgZW5jb2RlZCBhcyBhIHppZy16YWcgdmFyaW50CisgICAgICAgIGxldCBmaWVsZF9pZGVudF8yID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STY0LCAxNik7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzIpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSBpcyA+IDE1IGl0IGlzIGVuY29kZWQgYXMgYSB6aWctemFnIHZhcmludAorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMyA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OlNldCwgOTkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8zKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIG5vdywgZmluaXNoIHRoZSBzdHJ1Y3Qgb2ZmCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIC8vIHJlYWQgdGhlIHN0cnVjdCBiYWNrCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfYmVnaW4oKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMSA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMSwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8xCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMiA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMiwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8yCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMyA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMywKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8zCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfNCA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfNCwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgZmllbGRfdHlwZTogVFR5cGU6OlN0b3AsCisgICAgICAgICAgICAgICAgaWQ6IE5vbmUsCisgICAgICAgICAgICB9CisgICAgICAgICk7CisKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9lbmQoKSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfc3RydWN0X3dpdGhfbWl4X29mX2xvbmdfYW5kX2RlbHRhX2ZpZWxkcygpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIC8vIG5vIGJ5dGVzIHNob3VsZCBiZSB3cml0dGVuIGhvd2V2ZXIKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gd3JpdGUgdGhyZWUgZmllbGRzIHdpdGggZmllbGQgaWRzIHRoYXQgY2Fubm90IGJlIGVuY29kZWQgYXMgZGVsdGFzCisKKyAgICAgICAgLy8gc2luY2UgdGhlIGRlbHRhIGlzID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STY0LCAxKSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STMyLCA5KSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhIGlzID4gMTUgaXQgaXMgZW5jb2RlZCBhcyBhIHppZy16YWcgdmFyaW50CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OlNldCwgMTAwMCkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSBpcyA+IDE1IGl0IGlzIGVuY29kZWQgYXMgYSB6aWctemFnIHZhcmludAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpTZXQsIDIwMDEpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgaXMgb25seSAzIHVwIGZyb20gdGhlIHByZXZpb3VzIGl0IGlzIHJlY29yZGVkIGFzIGEgZGVsdGEKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6U2V0LCAyMDA0KSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBub3csIGZpbmlzaCB0aGUgc3RydWN0IG9mZgorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICAjW2NmZ19hdHRyKHJ1c3RmbXQsIHJ1c3RmbXQ6OnNraXApXQorICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgMTBdID0gWworICAgICAgICAgICAgMHgxNiwgLyogZmllbGQgZGVsdGEgKDEpIHwgZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHg4NSwgLyogZmllbGQgZGVsdGEgKDgpIHwgZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHgwQSwgLyogZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHhEMCwKKyAgICAgICAgICAgIDB4MEYsIC8qIHppZy16YWcgdmFyaW50IGZpZWxkIGlkICovCisgICAgICAgICAgICAweDBBLCAvKiBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweEEyLAorICAgICAgICAgICAgMHgxRiwgLyogemlnLXphZyB2YXJpbnQgZmllbGQgaWQgKi8KKyAgICAgICAgICAgIDB4M0EsIC8qIGZpZWxkIGRlbHRhICgzKSB8IGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MDAgLyogZmllbGQgc3RvcCAqLywKKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9zdHJ1Y3Rfd2l0aF9taXhfb2ZfbG9uZ19hbmRfZGVsdGFfZmllbGRzKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgLy8gbm8gYnl0ZXMgc2hvdWxkIGJlIHdyaXR0ZW4gaG93ZXZlcgorICAgICAgICBsZXQgc3RydWN0X2lkZW50ID0gVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIik7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZzdHJ1Y3RfaWRlbnQpKTsKKworICAgICAgICAvLyB3cml0ZSB0aHJlZSBmaWVsZHMgd2l0aCBmaWVsZCBpZHMgdGhhdCBjYW5ub3QgYmUgZW5jb2RlZCBhcyBkZWx0YXMKKworICAgICAgICAvLyBzaW5jZSB0aGUgZGVsdGEgaXMgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMSA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6Okk2NCwgMSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzEpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8yID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STMyLCA5KTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMikpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhIGlzID4gMTUgaXQgaXMgZW5jb2RlZCBhcyBhIHppZy16YWcgdmFyaW50CisgICAgICAgIGxldCBmaWVsZF9pZGVudF8zID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6U2V0LCAxMDAwKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMykpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhIGlzID4gMTUgaXQgaXMgZW5jb2RlZCBhcyBhIHppZy16YWcgdmFyaW50CisgICAgICAgIGxldCBmaWVsZF9pZGVudF80ID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6U2V0LCAyMDAxKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfNCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGlzIG9ubHkgMyB1cCBmcm9tIHRoZSBwcmV2aW91cyBpdCBpcyByZWNvcmRlZCBhcyBhIGRlbHRhCisgICAgICAgIGxldCBmaWVsZF9pZGVudF81ID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6U2V0LCAyMDA0KTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfNSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBub3csIGZpbmlzaCB0aGUgc3RydWN0IG9mZgorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICAvLyByZWFkIHRoZSBzdHJ1Y3QgYmFjaworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2JlZ2luKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzEgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzEsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMQorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzIgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzIsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMgorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzMgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzMsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMworICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzQgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzQsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfNAorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzUgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzUsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfNQorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzYgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzYsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIGZpZWxkX3R5cGU6IFRUeXBlOjpTdG9wLAorICAgICAgICAgICAgICAgIGlkOiBOb25lLAorICAgICAgICAgICAgfQorICAgICAgICApOworCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfZW5kKCkpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX25lc3RlZF9zdHJ1Y3RzXzAoKSB7CisgICAgICAgIC8vIGxhc3QgZmllbGQgb2YgdGhlIGNvbnRhaW5pbmcgc3RydWN0IGlzIGEgZGVsdGEKKyAgICAgICAgLy8gZmlyc3QgZmllbGQgb2YgdGhlIHRoZSBjb250YWluZWQgc3RydWN0IGlzIGEgZGVsdGEKKworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgLy8gc3RhcnQgY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhlIGRlbHRhIGlzID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STY0LCAxKSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBjb250YWluaW5nIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STMyLCA5KSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzdGFydCBjb250YWluZWQgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhlIGRlbHRhIGlzID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STA4LCA3KSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBjb250YWluZWQgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAxNSBpdCBnZXRzIGEgZnVsbCB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpEb3VibGUsIDI0KSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmVkIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgI1tjZmdfYXR0cihydXN0Zm10LCBydXN0Zm10Ojpza2lwKV0KKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDddID0gWworICAgICAgICAgICAgMHgxNiwgLyogZmllbGQgZGVsdGEgKDEpIHwgZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHg4NSwgLyogZmllbGQgZGVsdGEgKDgpIHwgZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHg3MywgLyogZmllbGQgZGVsdGEgKDcpIHwgZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHgwNywgLyogZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHgzMCwgLyogemlnLXphZyB2YXJpbnQgZmllbGQgaWQgKi8KKyAgICAgICAgICAgIDB4MDAsIC8qIGZpZWxkIHN0b3AgLSBjb250YWluZWQgKi8KKyAgICAgICAgICAgIDB4MDAgLyogZmllbGQgc3RvcCAtIGNvbnRhaW5pbmcgKi8sCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfbmVzdGVkX3N0cnVjdHNfMCgpIHsKKyAgICAgICAgLy8gbGFzdCBmaWVsZCBvZiB0aGUgY29udGFpbmluZyBzdHJ1Y3QgaXMgYSBkZWx0YQorICAgICAgICAvLyBmaXJzdCBmaWVsZCBvZiB0aGUgdGhlIGNvbnRhaW5lZCBzdHJ1Y3QgaXMgYSBkZWx0YQorCisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICAvLyBzdGFydCBjb250YWluaW5nIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyBjb250YWluaW5nIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGUgZGVsdGEgaXMgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMSA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6Okk2NCwgMSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzEpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8yID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STMyLCA5KTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMikpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzdGFydCBjb250YWluZWQgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhlIGRlbHRhIGlzID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzMgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJMDgsIDcpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8zKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDE1IGl0IGdldHMgYSBmdWxsIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF80ID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6RG91YmxlLCAyNCk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzQpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIC8vIHJlYWQgY29udGFpbmluZyBzdHJ1Y3QgYmFjaworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2JlZ2luKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzEgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzEsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMQorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzIgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzIsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMgorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHJlYWQgY29udGFpbmVkIHN0cnVjdCBiYWNrCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfYmVnaW4oKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMyA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMywKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8zCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfNCA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfNCwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF80CisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfNiA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfNiwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgZmllbGRfdHlwZTogVFR5cGU6OlN0b3AsCisgICAgICAgICAgICAgICAgaWQ6IE5vbmUsCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluaW5nIHN0cnVjdAorICAgICAgICBsZXQgcmVhZF9pZGVudF83ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF83LAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICBmaWVsZF90eXBlOiBUVHlwZTo6U3RvcCwKKyAgICAgICAgICAgICAgICBpZDogTm9uZSwKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9lbmQoKSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbmVzdGVkX3N0cnVjdHNfMSgpIHsKKyAgICAgICAgLy8gbGFzdCBmaWVsZCBvZiB0aGUgY29udGFpbmluZyBzdHJ1Y3QgaXMgYSBkZWx0YQorICAgICAgICAvLyBmaXJzdCBmaWVsZCBvZiB0aGUgdGhlIGNvbnRhaW5lZCBzdHJ1Y3QgaXMgYSBmdWxsIHdyaXRlCisKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIC8vIHN0YXJ0IGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoZSBkZWx0YSBpcyA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6Okk2NCwgMSkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkzMiwgOSkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc3RhcnQgY29udGFpbmVkIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyBjb250YWluZWQgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAxNSBpdCBnZXRzIGEgZnVsbCB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpEb3VibGUsIDI0KSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBjb250YWluZWQgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoZSBkZWx0YSBpcyA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkwOCwgMjcpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluZWQgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluaW5nIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICAjW2NmZ19hdHRyKHJ1c3RmbXQsIHJ1c3RmbXQ6OnNraXApXQorICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgN10gPSBbCisgICAgICAgICAgICAweDE2LCAvKiBmaWVsZCBkZWx0YSAoMSkgfCBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDg1LCAvKiBmaWVsZCBkZWx0YSAoOCkgfCBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDA3LCAvKiBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDMwLCAvKiB6aWctemFnIHZhcmludCBmaWVsZCBpZCAqLworICAgICAgICAgICAgMHgzMywgLyogZmllbGQgZGVsdGEgKDMpIHwgZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHgwMCwgLyogZmllbGQgc3RvcCAtIGNvbnRhaW5lZCAqLworICAgICAgICAgICAgMHgwMCAvKiBmaWVsZCBzdG9wIC0gY29udGFpbmluZyAqLywKKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9uZXN0ZWRfc3RydWN0c18xKCkgeworICAgICAgICAvLyBsYXN0IGZpZWxkIG9mIHRoZSBjb250YWluaW5nIHN0cnVjdCBpcyBhIGRlbHRhCisgICAgICAgIC8vIGZpcnN0IGZpZWxkIG9mIHRoZSB0aGUgY29udGFpbmVkIHN0cnVjdCBpcyBhIGZ1bGwgd3JpdGUKKworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgLy8gc3RhcnQgY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhlIGRlbHRhIGlzID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzEgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJNjQsIDEpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8xKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMiA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkzMiwgOSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzIpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc3RhcnQgY29udGFpbmVkIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyBjb250YWluZWQgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAxNSBpdCBnZXRzIGEgZnVsbCB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMyA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkRvdWJsZSwgMjQpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8zKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhlIGRlbHRhIGlzID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzQgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJMDgsIDI3KTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfNCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmVkIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgLy8gcmVhZCBjb250YWluaW5nIHN0cnVjdCBiYWNrCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfYmVnaW4oKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMSA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMSwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8xCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMiA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMiwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8yCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gcmVhZCBjb250YWluZWQgc3RydWN0IGJhY2sKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9iZWdpbigpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8zID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8zLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzMKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF80ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF80LAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzQKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmVkIHN0cnVjdAorICAgICAgICBsZXQgcmVhZF9pZGVudF82ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF82LAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICBmaWVsZF90eXBlOiBUVHlwZTo6U3RvcCwKKyAgICAgICAgICAgICAgICBpZDogTm9uZSwKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIGxldCByZWFkX2lkZW50XzcgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzcsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIGZpZWxkX3R5cGU6IFRUeXBlOjpTdG9wLAorICAgICAgICAgICAgICAgIGlkOiBOb25lLAorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2VuZCgpKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9uZXN0ZWRfc3RydWN0c18yKCkgeworICAgICAgICAvLyBsYXN0IGZpZWxkIG9mIHRoZSBjb250YWluaW5nIHN0cnVjdCBpcyBhIGZ1bGwgd3JpdGUKKyAgICAgICAgLy8gZmlyc3QgZmllbGQgb2YgdGhlIHRoZSBjb250YWluZWQgc3RydWN0IGlzIGEgZGVsdGEgd3JpdGUKKworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgLy8gc3RhcnQgY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhlIGRlbHRhIGlzID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STY0LCAxKSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBjb250YWluaW5nIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMTUgaXQgZ2V0cyBhIGZ1bGwgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6U3RyaW5nLCAyMSkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc3RhcnQgY29udGFpbmVkIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyBjb250YWluZWQgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpEb3VibGUsIDcpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhlIGRlbHRhIGlzID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STA4LCAxMCkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgICNbY2ZnX2F0dHIocnVzdGZtdCwgcnVzdGZtdDo6c2tpcCldCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyA3XSA9IFsKKyAgICAgICAgICAgIDB4MTYsIC8qIGZpZWxkIGRlbHRhICgxKSB8IGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MDgsIC8qIGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MkEsIC8qIHppZy16YWcgdmFyaW50IGZpZWxkIGlkICovCisgICAgICAgICAgICAweDc3LCAvKiBmaWVsZCBkZWx0YSg3KSB8IGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MzMsIC8qIGZpZWxkIGRlbHRhICgzKSB8IGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MDAsIC8qIGZpZWxkIHN0b3AgLSBjb250YWluZWQgKi8KKyAgICAgICAgICAgIDB4MDAgLyogZmllbGQgc3RvcCAtIGNvbnRhaW5pbmcgKi8sCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfbmVzdGVkX3N0cnVjdHNfMigpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIC8vIHN0YXJ0IGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoZSBkZWx0YSBpcyA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8xID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STY0LCAxKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBjb250YWluaW5nIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMTUgaXQgZ2V0cyBhIGZ1bGwgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzIgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpTdHJpbmcsIDIxKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMikpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzdGFydCBjb250YWluZWQgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8zID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6RG91YmxlLCA3KTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMykpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBjb250YWluZWQgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoZSBkZWx0YSBpcyA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF80ID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STA4LCAxMCk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzQpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIC8vIHJlYWQgY29udGFpbmluZyBzdHJ1Y3QgYmFjaworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2JlZ2luKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzEgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzEsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMQorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzIgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzIsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMgorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHJlYWQgY29udGFpbmVkIHN0cnVjdCBiYWNrCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfYmVnaW4oKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMyA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMywKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8zCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfNCA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfNCwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF80CisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfNiA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfNiwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgZmllbGRfdHlwZTogVFR5cGU6OlN0b3AsCisgICAgICAgICAgICAgICAgaWQ6IE5vbmUsCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluaW5nIHN0cnVjdAorICAgICAgICBsZXQgcmVhZF9pZGVudF83ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF83LAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICBmaWVsZF90eXBlOiBUVHlwZTo6U3RvcCwKKyAgICAgICAgICAgICAgICBpZDogTm9uZSwKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9lbmQoKSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbmVzdGVkX3N0cnVjdHNfMygpIHsKKyAgICAgICAgLy8gbGFzdCBmaWVsZCBvZiB0aGUgY29udGFpbmluZyBzdHJ1Y3QgaXMgYSBmdWxsIHdyaXRlCisgICAgICAgIC8vIGZpcnN0IGZpZWxkIG9mIHRoZSB0aGUgY29udGFpbmVkIHN0cnVjdCBpcyBhIGZ1bGwgd3JpdGUKKworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgLy8gc3RhcnQgY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhlIGRlbHRhIGlzID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STY0LCAxKSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBjb250YWluaW5nIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMTUgaXQgZ2V0cyBhIGZ1bGwgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6U3RyaW5nLCAyMSkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc3RhcnQgY29udGFpbmVkIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyBjb250YWluZWQgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAxNSBpdCBnZXRzIGEgZnVsbCB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpEb3VibGUsIDIxKSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBjb250YWluZWQgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoZSBkZWx0YSBpcyA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkwOCwgMjcpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluZWQgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluaW5nIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICAjW2NmZ19hdHRyKHJ1c3RmbXQsIHJ1c3RmbXQ6OnNraXApXQorICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgOF0gPSBbCisgICAgICAgICAgICAweDE2LCAvKiBmaWVsZCBkZWx0YSAoMSkgfCBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDA4LCAvKiBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDJBLCAvKiB6aWctemFnIHZhcmludCBmaWVsZCBpZCAqLworICAgICAgICAgICAgMHgwNywgLyogZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHgyQSwgLyogemlnLXphZyB2YXJpbnQgZmllbGQgaWQgKi8KKyAgICAgICAgICAgIDB4NjMsIC8qIGZpZWxkIGRlbHRhICg2KSB8IGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MDAsIC8qIGZpZWxkIHN0b3AgLSBjb250YWluZWQgKi8KKyAgICAgICAgICAgIDB4MDAgLyogZmllbGQgc3RvcCAtIGNvbnRhaW5pbmcgKi8sCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfbmVzdGVkX3N0cnVjdHNfMygpIHsKKyAgICAgICAgLy8gbGFzdCBmaWVsZCBvZiB0aGUgY29udGFpbmluZyBzdHJ1Y3QgaXMgYSBmdWxsIHdyaXRlCisgICAgICAgIC8vIGZpcnN0IGZpZWxkIG9mIHRoZSB0aGUgY29udGFpbmVkIHN0cnVjdCBpcyBhIGZ1bGwgd3JpdGUKKworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgLy8gc3RhcnQgY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhlIGRlbHRhIGlzID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzEgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJNjQsIDEpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8xKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAxNSBpdCBnZXRzIGEgZnVsbCB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMiA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OlN0cmluZywgMjEpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8yKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHN0YXJ0IGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gY29udGFpbmVkIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMTUgaXQgZ2V0cyBhIGZ1bGwgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzMgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpEb3VibGUsIDIxKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMykpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBjb250YWluZWQgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoZSBkZWx0YSBpcyA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF80ID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STA4LCAyNyk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzQpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIC8vIHJlYWQgY29udGFpbmluZyBzdHJ1Y3QgYmFjaworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2JlZ2luKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzEgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzEsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMQorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzIgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzIsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMgorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHJlYWQgY29udGFpbmVkIHN0cnVjdCBiYWNrCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfYmVnaW4oKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMyA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMywKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8zCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfNCA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfNCwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF80CisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfNiA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfNiwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgZmllbGRfdHlwZTogVFR5cGU6OlN0b3AsCisgICAgICAgICAgICAgICAgaWQ6IE5vbmUsCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluaW5nIHN0cnVjdAorICAgICAgICBsZXQgcmVhZF9pZGVudF83ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF83LAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICBmaWVsZF90eXBlOiBUVHlwZTo6U3RvcCwKKyAgICAgICAgICAgICAgICBpZDogTm9uZSwKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9lbmQoKSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfYm9vbF9maWVsZCgpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIC8vIG5vIGJ5dGVzIHNob3VsZCBiZSB3cml0dGVuIGhvd2V2ZXIKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gd3JpdGUgdGhyZWUgZmllbGRzIHdpdGggZmllbGQgaWRzIHRoYXQgY2Fubm90IGJlIGVuY29kZWQgYXMgZGVsdGFzCisKKyAgICAgICAgLy8gc2luY2UgdGhlIGRlbHRhIGlzID4gMCBhbmQgPCAxNiBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6Qm9vbCwgMSkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9ib29sKHRydWUpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkJvb2wsIDkpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfYm9vbChmYWxzZSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMTUgaXQgZ2V0cyBhIGZ1bGwgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6Qm9vbCwgMjYpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfYm9vbCh0cnVlKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAxNSBpdCBnZXRzIGEgZnVsbCB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpCb29sLCA0NSkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9ib29sKGZhbHNlKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIG5vdywgZmluaXNoIHRoZSBzdHJ1Y3Qgb2ZmCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgICNbY2ZnX2F0dHIocnVzdGZtdCwgcnVzdGZtdDo6c2tpcCldCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyA3XSA9IFsKKyAgICAgICAgICAgIDB4MTEsIC8qIGZpZWxkIGRlbHRhICgxKSB8IHRydWUgKi8KKyAgICAgICAgICAgIDB4ODIsIC8qIGZpZWxkIGRlbHRhICg4KSB8IGZhbHNlICovCisgICAgICAgICAgICAweDAxLCAvKiB0cnVlICovCisgICAgICAgICAgICAweDM0LCAvKiBmaWVsZCBpZCAqLworICAgICAgICAgICAgMHgwMiwgLyogZmFsc2UgKi8KKyAgICAgICAgICAgIDB4NUEsIC8qIGZpZWxkIGlkICovCisgICAgICAgICAgICAweDAwIC8qIHN0b3AgZmllbGQgKi8sCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfYm9vbF9maWVsZCgpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIC8vIG5vIGJ5dGVzIHNob3VsZCBiZSB3cml0dGVuIGhvd2V2ZXIKKyAgICAgICAgbGV0IHN0cnVjdF9pZGVudCA9IFRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmc3RydWN0X2lkZW50KSk7CisKKyAgICAgICAgLy8gd3JpdGUgdHdvIGZpZWxkcworCisgICAgICAgIC8vIHNpbmNlIHRoZSBkZWx0YSBpcyA+IDAgYW5kIDwgMTYgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8xID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6Qm9vbCwgMSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzEpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9ib29sKHRydWUpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8yID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6Qm9vbCwgOSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzIpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9ib29sKGZhbHNlKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAxNSBpdCBnZXRzIGEgZnVsbCB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMyA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkJvb2wsIDI2KTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMykpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2Jvb2wodHJ1ZSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMTUgaXQgZ2V0cyBhIGZ1bGwgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzQgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpCb29sLCA0NSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzQpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9ib29sKGZhbHNlKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIG5vdywgZmluaXNoIHRoZSBzdHJ1Y3Qgb2ZmCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIC8vIHJlYWQgdGhlIHN0cnVjdCBiYWNrCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfYmVnaW4oKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMSA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMSwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8xCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGxldCByZWFkX3ZhbHVlXzEgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfYm9vbCgpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX3ZhbHVlXzEsIHRydWUpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzIgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzIsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMgorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBsZXQgcmVhZF92YWx1ZV8yID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2Jvb2woKSk7CisgICAgICAgIGFzc2VydF9lcSEocmVhZF92YWx1ZV8yLCBmYWxzZSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMyA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMywKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8zCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGxldCByZWFkX3ZhbHVlXzMgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfYm9vbCgpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX3ZhbHVlXzMsIHRydWUpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzQgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzQsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfNAorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBsZXQgcmVhZF92YWx1ZV80ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2Jvb2woKSk7CisgICAgICAgIGFzc2VydF9lcSEocmVhZF92YWx1ZV80LCBmYWxzZSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfNSA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfNSwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgZmllbGRfdHlwZTogVFR5cGU6OlN0b3AsCisgICAgICAgICAgICAgICAgaWQ6IE5vbmUsCisgICAgICAgICAgICB9CisgICAgICAgICk7CisKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9lbmQoKSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgICNbc2hvdWxkX3BhbmljXQorICAgIGZuIG11c3RfZmFpbF9pZl93cml0ZV9maWVsZF9lbmRfd2l0aG91dF93cml0aW5nX2Jvb2xfdmFsdWUoKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkJvb2wsIDEpKSk7CisgICAgICAgIG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKS51bndyYXAoKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgI1tzaG91bGRfcGFuaWNdCisgICAgZm4gbXVzdF9mYWlsX2lmX3dyaXRlX3N0b3BfZmllbGRfd2l0aG91dF93cml0aW5nX2Jvb2xfdmFsdWUoKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkJvb2wsIDEpKSk7CisgICAgICAgIG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkudW53cmFwKCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgICNbc2hvdWxkX3BhbmljXQorICAgIGZuIG11c3RfZmFpbF9pZl93cml0ZV9zdHJ1Y3RfZW5kX3dpdGhvdXRfd3JpdGluZ19ib29sX3ZhbHVlKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpCb29sLCAxKSkpOworICAgICAgICBvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpLnVud3JhcCgpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICAjW3Nob3VsZF9wYW5pY10KKyAgICBmbiBtdXN0X2ZhaWxfaWZfd3JpdGVfc3RydWN0X2VuZF93aXRob3V0X2FueV9maWVsZHMoKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKyAgICAgICAgb19wcm90LndyaXRlX3N0cnVjdF9lbmQoKS51bndyYXAoKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9maWVsZF9lbmQoKSB7CisgICAgICAgIGFzc2VydF9ub193cml0ZSh8b3wgby53cml0ZV9maWVsZF9lbmQoKSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfc21hbGxfc2l6ZWRfbGlzdF9iZWdpbigpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfbGlzdF9iZWdpbigmVExpc3RJZGVudGlmaWVyOjpuZXcoVFR5cGU6Okk2NCwgNCkpKTsKKworICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgMV0gPSBbMHg0NiAvKiBzaXplIHwgZWxlbV90eXBlICovXTsKKworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9zbWFsbF9zaXplZF9saXN0X2JlZ2luKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgbGV0IGlkZW50ID0gVExpc3RJZGVudGlmaWVyOjpuZXcoVFR5cGU6OkkwOCwgMTApOworCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfbGlzdF9iZWdpbigmaWRlbnQpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICBsZXQgcmVzID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2xpc3RfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoJnJlcywgJmlkZW50KTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9sYXJnZV9zaXplZF9saXN0X2JlZ2luKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgbGV0IHJlcyA9IG9fcHJvdC53cml0ZV9saXN0X2JlZ2luKCZUTGlzdElkZW50aWZpZXI6Om5ldyhUVHlwZTo6TGlzdCwgOTk5OSkpOworICAgICAgICBhc3NlcnQhKHJlcy5pc19vaygpKTsKKworICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgM10gPSBbCisgICAgICAgICAgICAweEY5LCAvKiAweEYwIHwgZWxlbV90eXBlICovCisgICAgICAgICAgICAweDhGLCAweDRFLCAvKiBzaXplIGFzIHZhcmludCAqLworICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX2xhcmdlX3NpemVkX2xpc3RfYmVnaW4oKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICBsZXQgaWRlbnQgPSBUTGlzdElkZW50aWZpZXI6Om5ldyhUVHlwZTo6U2V0LCA0NzM4MSk7CisKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9saXN0X2JlZ2luKCZpZGVudCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIGxldCByZXMgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfbGlzdF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmcmVzLCAmaWRlbnQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX2xpc3RfZW5kKCkgeworICAgICAgICBhc3NlcnRfbm9fd3JpdGUofG98IG8ud3JpdGVfbGlzdF9lbmQoKSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfc21hbGxfc2l6ZWRfc2V0X2JlZ2luKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zZXRfYmVnaW4oJlRTZXRJZGVudGlmaWVyOjpuZXcoVFR5cGU6OlN0cnVjdCwgMikpKTsKKworICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgMV0gPSBbMHgyQyAvKiBzaXplIHwgZWxlbV90eXBlICovXTsKKworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9zbWFsbF9zaXplZF9zZXRfYmVnaW4oKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICBsZXQgaWRlbnQgPSBUU2V0SWRlbnRpZmllcjo6bmV3KFRUeXBlOjpJMTYsIDcpOworCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc2V0X2JlZ2luKCZpZGVudCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIGxldCByZXMgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc2V0X2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKCZyZXMsICZpZGVudCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbGFyZ2Vfc2l6ZWRfc2V0X2JlZ2luKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zZXRfYmVnaW4oJlRTZXRJZGVudGlmaWVyOjpuZXcoVFR5cGU6OkRvdWJsZSwgMjM4OTEpKSk7CisKKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDRdID0gWworICAgICAgICAgICAgMHhGNywgLyogMHhGMCB8IGVsZW1fdHlwZSAqLworICAgICAgICAgICAgMHhEMywgMHhCQSwgMHgwMSwgLyogc2l6ZSBhcyB2YXJpbnQgKi8KKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9sYXJnZV9zaXplZF9zZXRfYmVnaW4oKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICBsZXQgaWRlbnQgPSBUU2V0SWRlbnRpZmllcjo6bmV3KFRUeXBlOjpNYXAsIDM5Mjg0MjkpOworCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc2V0X2JlZ2luKCZpZGVudCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIGxldCByZXMgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc2V0X2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKCZyZXMsICZpZGVudCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfc2V0X2VuZCgpIHsKKyAgICAgICAgYXNzZXJ0X25vX3dyaXRlKHxvfCBvLndyaXRlX3NldF9lbmQoKSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfemVyb19zaXplZF9tYXBfYmVnaW4oKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX21hcF9iZWdpbigmVE1hcElkZW50aWZpZXI6Om5ldyhUVHlwZTo6U3RyaW5nLCBUVHlwZTo6STMyLCAwKSkpOworCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyAxXSA9IFsweDAwXTsgLy8gc2luY2Ugc2l6ZSBpcyB6ZXJvIHdlIGRvbid0IHdyaXRlIGFueXRoaW5nCisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JlYWRfemVyb19zaXplZF9tYXBfYmVnaW4oKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX21hcF9iZWdpbigmVE1hcElkZW50aWZpZXI6Om5ldyhUVHlwZTo6RG91YmxlLCBUVHlwZTo6STMyLCAwKSkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIGxldCByZXMgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfbWFwX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgJnJlcywKKyAgICAgICAgICAgICZUTWFwSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAga2V5X3R5cGU6IE5vbmUsCisgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTogTm9uZSwKKyAgICAgICAgICAgICAgICBzaXplOiAwLAorICAgICAgICAgICAgfQorICAgICAgICApOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX21hcF9iZWdpbigpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfbWFwX2JlZ2luKCZUTWFwSWRlbnRpZmllcjo6bmV3KAorICAgICAgICAgICAgVFR5cGU6OkRvdWJsZSwKKyAgICAgICAgICAgIFRUeXBlOjpTdHJpbmcsCisgICAgICAgICAgICAyMzgKKyAgICAgICAgKSkpOworCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyAzXSA9IFsKKyAgICAgICAgICAgIDB4RUUsIDB4MDEsIC8qIHNpemUgYXMgdmFyaW50ICovCisgICAgICAgICAgICAweDc4LCAvKiBrZXkgdHlwZSB8IHZhbCB0eXBlICovCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfbWFwX2JlZ2luKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgbGV0IGlkZW50ID0gVE1hcElkZW50aWZpZXI6Om5ldyhUVHlwZTo6TWFwLCBUVHlwZTo6TGlzdCwgMTkyODM0OSk7CisKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9tYXBfYmVnaW4oJmlkZW50KSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgbGV0IHJlcyA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9tYXBfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoJnJlcywgJmlkZW50KTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9tYXBfZW5kKCkgeworICAgICAgICBhc3NlcnRfbm9fd3JpdGUofG98IG8ud3JpdGVfbWFwX2VuZCgpKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9tYXBfd2l0aF9ib29sX2tleV9hbmRfdmFsdWUoKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX21hcF9iZWdpbigmVE1hcElkZW50aWZpZXI6Om5ldyhUVHlwZTo6Qm9vbCwgVFR5cGU6OkJvb2wsIDEpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfYm9vbCh0cnVlKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfYm9vbChmYWxzZSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX21hcF9lbmQoKSk7CisKKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDRdID0gWworICAgICAgICAgICAgMHgwMSwgLyogc2l6ZSBhcyB2YXJpbnQgKi8KKyAgICAgICAgICAgIDB4MTEsIC8qIGtleSB0eXBlIHwgdmFsIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MDEsIC8qIGtleTogdHJ1ZSAqLworICAgICAgICAgICAgMHgwMiwgLyogdmFsOiBmYWxzZSAqLworICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX21hcF93aXRoX2Jvb2xfdmFsdWUoKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICBsZXQgbWFwX2lkZW50ID0gVE1hcElkZW50aWZpZXI6Om5ldyhUVHlwZTo6Qm9vbCwgVFR5cGU6OkJvb2wsIDIpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX21hcF9iZWdpbigmbWFwX2lkZW50KSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfYm9vbCh0cnVlKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfYm9vbChmYWxzZSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2Jvb2woZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9ib29sKHRydWUpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9tYXBfZW5kKCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIC8vIG1hcCBoZWFkZXIKKyAgICAgICAgbGV0IHJjdmRfaWRlbnQgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfbWFwX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKCZyY3ZkX2lkZW50LCAmbWFwX2lkZW50KTsKKyAgICAgICAgLy8ga2V5IDEKKyAgICAgICAgbGV0IGIgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfYm9vbCgpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShiLCB0cnVlKTsKKyAgICAgICAgLy8gdmFsIDEKKyAgICAgICAgbGV0IGIgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfYm9vbCgpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShiLCBmYWxzZSk7CisgICAgICAgIC8vIGtleSAyCisgICAgICAgIGxldCBiID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2Jvb2woKSk7CisgICAgICAgIGFzc2VydF9lcSEoYiwgZmFsc2UpOworICAgICAgICAvLyB2YWwgMgorICAgICAgICBsZXQgYiA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9ib29sKCkpOworICAgICAgICBhc3NlcnRfZXEhKGIsIHRydWUpOworICAgICAgICAvLyBtYXAgZW5kCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9tYXBfZW5kKCkpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JlYWRfbWFwX2VuZCgpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBfKSA9IHRlc3Rfb2JqZWN0cygpOworICAgICAgICBhc3NlcnQhKGlfcHJvdC5yZWFkX21hcF9lbmQoKS5pc19vaygpKTsgLy8gd2lsbCBibG93IHVwIGlmIHdlIHRyeSB0byByZWFkIGZyb20gZW1wdHkgYnVmZmVyCisgICAgfQorCisgICAgZm4gdGVzdF9vYmplY3RzKCkgLT4gKAorICAgICAgICBUQ29tcGFjdElucHV0UHJvdG9jb2w8UmVhZEhhbGY8VEJ1ZmZlckNoYW5uZWw+PiwKKyAgICAgICAgVENvbXBhY3RPdXRwdXRQcm90b2NvbDxXcml0ZUhhbGY8VEJ1ZmZlckNoYW5uZWw+PiwKKyAgICApIHsKKyAgICAgICAgbGV0IG1lbSA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDgwLCA4MCk7CisKKyAgICAgICAgbGV0IChyX21lbSwgd19tZW0pID0gbWVtLnNwbGl0KCkudW53cmFwKCk7CisKKyAgICAgICAgbGV0IGlfcHJvdCA9IFRDb21wYWN0SW5wdXRQcm90b2NvbDo6bmV3KHJfbWVtKTsKKyAgICAgICAgbGV0IG9fcHJvdCA9IFRDb21wYWN0T3V0cHV0UHJvdG9jb2w6Om5ldyh3X21lbSk7CisKKyAgICAgICAgKGlfcHJvdCwgb19wcm90KQorICAgIH0KKworICAgIGZuIGFzc2VydF9ub193cml0ZTxGPihtdXQgd3JpdGVfZm46IEYpCisgICAgd2hlcmUKKyAgICAgICAgRjogRm5NdXQoJm11dCBUQ29tcGFjdE91dHB1dFByb3RvY29sPFdyaXRlSGFsZjxUQnVmZmVyQ2hhbm5lbD4+KSAtPiA6OlJlc3VsdDwoKT4sCisgICAgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisgICAgICAgIGFzc2VydCEod3JpdGVfZm4oJm11dCBvX3Byb3QpLmlzX29rKCkpOworICAgICAgICBhc3NlcnRfZXEhKG9fcHJvdC50cmFuc3BvcnQud3JpdGVfYnl0ZXMoKS5sZW4oKSwgMCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3JzL3NyYy9wcm90b2NvbC9tb2QucnMgYi9saWIvcnMvc3JjL3Byb3RvY29sL21vZC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWMwMjg5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3NyYy9wcm90b2NvbC9tb2QucnMKQEAgLTAsMCArMSw5NjkgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8hIFR5cGVzIHVzZWQgdG8gc2VuZCBhbmQgcmVjZWl2ZSBwcmltaXRpdmVzIGJldHdlZW4gYSBUaHJpZnQgY2xpZW50IGFuZCBzZXJ2ZXIuCisvLyEKKy8vISAjIEV4YW1wbGVzCisvLyEKKy8vISBDcmVhdGUgYW5kIHVzZSBhIGBUSW5wdXRQcm90b2NvbGAuCisvLyEKKy8vISBgYGBub19ydW4KKy8vISB1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RCaW5hcnlJbnB1dFByb3RvY29sLCBUSW5wdXRQcm90b2NvbH07CisvLyEgdXNlIHRocmlmdDo6dHJhbnNwb3J0OjpUVGNwQ2hhbm5lbDsKKy8vIQorLy8hIC8vIGNyZWF0ZSB0aGUgSS9PIGNoYW5uZWwKKy8vISBsZXQgbXV0IGNoYW5uZWwgPSBUVGNwQ2hhbm5lbDo6bmV3KCk7CisvLyEgY2hhbm5lbC5vcGVuKCIxMjcuMC4wLjE6OTA5MCIpLnVud3JhcCgpOworLy8hCisvLyEgLy8gY3JlYXRlIHRoZSBwcm90b2NvbCB0byBkZWNvZGUgYnl0ZXMgaW50byB0eXBlcworLy8hIGxldCBtdXQgcHJvdG9jb2wgPSBUQmluYXJ5SW5wdXRQcm90b2NvbDo6bmV3KGNoYW5uZWwsIHRydWUpOworLy8hCisvLyEgLy8gcmVhZCB0eXBlcyBmcm9tIHRoZSB3aXJlCisvLyEgbGV0IGZpZWxkX2lkZW50aWZpZXIgPSBwcm90b2NvbC5yZWFkX2ZpZWxkX2JlZ2luKCkudW53cmFwKCk7CisvLyEgbGV0IGZpZWxkX2NvbnRlbnRzID0gcHJvdG9jb2wucmVhZF9zdHJpbmcoKS51bndyYXAoKTsKKy8vISBsZXQgZmllbGRfZW5kID0gcHJvdG9jb2wucmVhZF9maWVsZF9lbmQoKS51bndyYXAoKTsKKy8vISBgYGAKKy8vIQorLy8hIENyZWF0ZSBhbmQgdXNlIGEgYFRPdXRwdXRQcm90b2NvbGAuCisvLyEKKy8vISBgYGBub19ydW4KKy8vISB1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RCaW5hcnlPdXRwdXRQcm90b2NvbCwgVEZpZWxkSWRlbnRpZmllciwgVE91dHB1dFByb3RvY29sLCBUVHlwZX07CisvLyEgdXNlIHRocmlmdDo6dHJhbnNwb3J0OjpUVGNwQ2hhbm5lbDsKKy8vIQorLy8hIC8vIGNyZWF0ZSB0aGUgSS9PIGNoYW5uZWwKKy8vISBsZXQgbXV0IGNoYW5uZWwgPSBUVGNwQ2hhbm5lbDo6bmV3KCk7CisvLyEgY2hhbm5lbC5vcGVuKCIxMjcuMC4wLjE6OTA5MCIpLnVud3JhcCgpOworLy8hCisvLyEgLy8gY3JlYXRlIHRoZSBwcm90b2NvbCB0byBlbmNvZGUgdHlwZXMgaW50byBieXRlcworLy8hIGxldCBtdXQgcHJvdG9jb2wgPSBUQmluYXJ5T3V0cHV0UHJvdG9jb2w6Om5ldyhjaGFubmVsLCB0cnVlKTsKKy8vIQorLy8hIC8vIHdyaXRlIHR5cGVzCisvLyEgcHJvdG9jb2wud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygic3RyaW5nX3RoaW5nIiwgVFR5cGU6OlN0cmluZywgMSkpLnVud3JhcCgpOworLy8hIHByb3RvY29sLndyaXRlX3N0cmluZygiZm9vIikudW53cmFwKCk7CisvLyEgcHJvdG9jb2wud3JpdGVfZmllbGRfZW5kKCkudW53cmFwKCk7CisvLyEgYGBgCisKK3VzZSBzdGQ6OmNvbnZlcnQ6OkZyb207Cit1c2Ugc3RkOjpmbXQ7Cit1c2Ugc3RkOjpmbXQ6OntEaXNwbGF5LCBGb3JtYXR0ZXJ9OwordXNlIHRyeV9mcm9tOjpUcnlGcm9tOworCit1c2UgdHJhbnNwb3J0Ojp7VFJlYWRUcmFuc3BvcnQsIFRXcml0ZVRyYW5zcG9ydH07Cit1c2Uge1Byb3RvY29sRXJyb3IsIFByb3RvY29sRXJyb3JLaW5kfTsKKworI1tjZmcodGVzdCldCittYWNyb19ydWxlcyEgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMgeworICAgICgkb19wcm90OmlkZW50LCAkZXhwZWN0ZWRfYnl0ZXM6aWRlbnQpID0+IHt7CisgICAgICAgIGFzc2VydF9lcSEoJG9fcHJvdC50cmFuc3BvcnQud3JpdGVfYnl0ZXMoKSwgJiRleHBlY3RlZF9ieXRlcyk7CisgICAgfX07Cit9CisKKy8vIEZJWE1FOiBzaG91bGQgdGFrZSBib3RoIHJlYWQgYW5kIHdyaXRlCisjW2NmZyh0ZXN0KV0KK21hY3JvX3J1bGVzISBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciB7CisgICAgKCRvX3Byb3Q6aWRlbnQpID0+IHt7CisgICAgICAgICRvX3Byb3QudHJhbnNwb3J0LmNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyKCk7CisgICAgfX07Cit9CisKKyNbY2ZnKHRlc3QpXQorbWFjcm9fcnVsZXMhIHNldF9yZWFkYWJsZV9ieXRlcyB7CisgICAgKCRpX3Byb3Q6aWRlbnQsICRieXRlczpleHByKSA9PiB7CisgICAgICAgICRpX3Byb3QudHJhbnNwb3J0LnNldF9yZWFkYWJsZV9ieXRlcygkYnl0ZXMpOworICAgIH07Cit9CisKK21vZCBiaW5hcnk7Cittb2QgY29tcGFjdDsKK21vZCBtdWx0aXBsZXhlZDsKK21vZCBzdG9yZWQ7CisKK3B1YiB1c2Ugc2VsZjo6YmluYXJ5Ojp7CisgICAgVEJpbmFyeUlucHV0UHJvdG9jb2wsIFRCaW5hcnlJbnB1dFByb3RvY29sRmFjdG9yeSwgVEJpbmFyeU91dHB1dFByb3RvY29sLAorICAgIFRCaW5hcnlPdXRwdXRQcm90b2NvbEZhY3RvcnksCit9OworcHViIHVzZSBzZWxmOjpjb21wYWN0Ojp7CisgICAgVENvbXBhY3RJbnB1dFByb3RvY29sLCBUQ29tcGFjdElucHV0UHJvdG9jb2xGYWN0b3J5LCBUQ29tcGFjdE91dHB1dFByb3RvY29sLAorICAgIFRDb21wYWN0T3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorfTsKK3B1YiB1c2Ugc2VsZjo6bXVsdGlwbGV4ZWQ6OlRNdWx0aXBsZXhlZE91dHB1dFByb3RvY29sOworcHViIHVzZSBzZWxmOjpzdG9yZWQ6OlRTdG9yZWRJbnB1dFByb3RvY29sOworCisvLyBEZWZhdWx0IG1heGltdW0gZGVwdGggdG8gd2hpY2ggYFRJbnB1dFByb3RvY29sOjpza2lwYCB3aWxsIHNraXAgYSBUaHJpZnQKKy8vIGZpZWxkLiBBIGRlZmF1bHQgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgVGhyaWZ0IHN0cnVjdHMgb3IgY29sbGVjdGlvbnMgbWF5CisvLyBjb250YWluIG5lc3RlZCBzdHJ1Y3RzIGFuZCBjb2xsZWN0aW9ucywgd2hpY2ggY291bGQgcmVzdWx0IGluIGluZGVmaW5pdGUKKy8vIHJlY3Vyc2lvbi4KK2NvbnN0IE1BWElNVU1fU0tJUF9ERVBUSDogaTggPSA2NDsKKworLy8vIENvbnZlcnRzIGEgc3RyZWFtIG9mIGJ5dGVzIGludG8gVGhyaWZ0IGlkZW50aWZpZXJzLCBwcmltaXRpdmVzLAorLy8vIGNvbnRhaW5lcnMsIG9yIHN0cnVjdHMuCisvLy8KKy8vLyBUaGlzIHRyYWl0IGRvZXMgbm90IGRlYWwgd2l0aCBoaWdoZXItbGV2ZWwgVGhyaWZ0IGNvbmNlcHRzIGxpa2Ugc3RydWN0cyBvcgorLy8vIGV4Y2VwdGlvbnMgLSBvbmx5IHdpdGggcHJpbWl0aXZlcyBhbmQgbWVzc2FnZSBvciBjb250YWluZXIgYm91bmRhcmllcy4gT25jZQorLy8vIGJ5dGVzIGFyZSByZWFkIHRoZXkgYXJlIGRlc2VyaWFsaXplZCBhbmQgYW4gaWRlbnRpZmllciAoZm9yIGV4YW1wbGUKKy8vLyBgVE1lc3NhZ2VJZGVudGlmaWVyYCkgb3IgYSBwcmltaXRpdmUgaXMgcmV0dXJuZWQuCisvLy8KKy8vLyBBbGwgbWV0aG9kcyByZXR1cm4gYSBgdGhyaWZ0OjpSZXN1bHRgLiBJZiBhbiBgRXJyYCBpcyByZXR1cm5lZCB0aGUgcHJvdG9jb2wKKy8vLyBpbnN0YW5jZSBhbmQgaXRzIHVuZGVybHlpbmcgdHJhbnNwb3J0IHNob3VsZCBiZSB0ZXJtaW5hdGVkLgorLy8vCisvLy8gIyBFeGFtcGxlcworLy8vCisvLy8gQ3JlYXRlIGFuZCB1c2UgYSBgVElucHV0UHJvdG9jb2xgCisvLy8KKy8vLyBgYGBub19ydW4KKy8vLyB1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RCaW5hcnlJbnB1dFByb3RvY29sLCBUSW5wdXRQcm90b2NvbH07CisvLy8gdXNlIHRocmlmdDo6dHJhbnNwb3J0OjpUVGNwQ2hhbm5lbDsKKy8vLworLy8vIGxldCBtdXQgY2hhbm5lbCA9IFRUY3BDaGFubmVsOjpuZXcoKTsKKy8vLyBjaGFubmVsLm9wZW4oIjEyNy4wLjAuMTo5MDkwIikudW53cmFwKCk7CisvLy8KKy8vLyBsZXQgbXV0IHByb3RvY29sID0gVEJpbmFyeUlucHV0UHJvdG9jb2w6Om5ldyhjaGFubmVsLCB0cnVlKTsKKy8vLworLy8vIGxldCBmaWVsZF9pZGVudGlmaWVyID0gcHJvdG9jb2wucmVhZF9maWVsZF9iZWdpbigpLnVud3JhcCgpOworLy8vIGxldCBmaWVsZF9jb250ZW50cyA9IHByb3RvY29sLnJlYWRfc3RyaW5nKCkudW53cmFwKCk7CisvLy8gbGV0IGZpZWxkX2VuZCA9IHByb3RvY29sLnJlYWRfZmllbGRfZW5kKCkudW53cmFwKCk7CisvLy8gYGBgCitwdWIgdHJhaXQgVElucHV0UHJvdG9jb2wgeworICAgIC8vLyBSZWFkIHRoZSBiZWdpbm5pbmcgb2YgYSBUaHJpZnQgbWVzc2FnZS4KKyAgICBmbiByZWFkX21lc3NhZ2VfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxUTWVzc2FnZUlkZW50aWZpZXI+OworICAgIC8vLyBSZWFkIHRoZSBlbmQgb2YgYSBUaHJpZnQgbWVzc2FnZS4KKyAgICBmbiByZWFkX21lc3NhZ2VfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBSZWFkIHRoZSBiZWdpbm5pbmcgb2YgYSBUaHJpZnQgc3RydWN0LgorICAgIGZuIHJlYWRfc3RydWN0X2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8T3B0aW9uPFRTdHJ1Y3RJZGVudGlmaWVyPj47CisgICAgLy8vIFJlYWQgdGhlIGVuZCBvZiBhIFRocmlmdCBzdHJ1Y3QuCisgICAgZm4gcmVhZF9zdHJ1Y3RfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBSZWFkIHRoZSBiZWdpbm5pbmcgb2YgYSBUaHJpZnQgc3RydWN0IGZpZWxkLgorICAgIGZuIHJlYWRfZmllbGRfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxURmllbGRJZGVudGlmaWVyPjsKKyAgICAvLy8gUmVhZCB0aGUgZW5kIG9mIGEgVGhyaWZ0IHN0cnVjdCBmaWVsZC4KKyAgICBmbiByZWFkX2ZpZWxkX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gUmVhZCBhIGJvb2wuCisgICAgZm4gcmVhZF9ib29sKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8Ym9vbD47CisgICAgLy8vIFJlYWQgYSBmaXhlZC1sZW5ndGggYnl0ZSBhcnJheS4KKyAgICBmbiByZWFkX2J5dGVzKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VmVjPHU4Pj47CisgICAgLy8vIFJlYWQgYSB3b3JkLgorICAgIGZuIHJlYWRfaTgoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxpOD47CisgICAgLy8vIFJlYWQgYSAxNi1iaXQgc2lnbmVkIGludGVnZXIuCisgICAgZm4gcmVhZF9pMTYoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxpMTY+OworICAgIC8vLyBSZWFkIGEgMzItYml0IHNpZ25lZCBpbnRlZ2VyLgorICAgIGZuIHJlYWRfaTMyKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8aTMyPjsKKyAgICAvLy8gUmVhZCBhIDY0LWJpdCBzaWduZWQgaW50ZWdlci4KKyAgICBmbiByZWFkX2k2NCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGk2ND47CisgICAgLy8vIFJlYWQgYSA2NC1iaXQgZmxvYXQuCisgICAgZm4gcmVhZF9kb3VibGUoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxmNjQ+OworICAgIC8vLyBSZWFkIGEgZml4ZWQtbGVuZ3RoIHN0cmluZyAobm90IG51bGwgdGVybWluYXRlZCkuCisgICAgZm4gcmVhZF9zdHJpbmcoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxTdHJpbmc+OworICAgIC8vLyBSZWFkIHRoZSBiZWdpbm5pbmcgb2YgYSBsaXN0LgorICAgIGZuIHJlYWRfbGlzdF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRMaXN0SWRlbnRpZmllcj47CisgICAgLy8vIFJlYWQgdGhlIGVuZCBvZiBhIGxpc3QuCisgICAgZm4gcmVhZF9saXN0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gUmVhZCB0aGUgYmVnaW5uaW5nIG9mIGEgc2V0LgorICAgIGZuIHJlYWRfc2V0X2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VFNldElkZW50aWZpZXI+OworICAgIC8vLyBSZWFkIHRoZSBlbmQgb2YgYSBzZXQuCisgICAgZm4gcmVhZF9zZXRfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBSZWFkIHRoZSBiZWdpbm5pbmcgb2YgYSBtYXAuCisgICAgZm4gcmVhZF9tYXBfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxUTWFwSWRlbnRpZmllcj47CisgICAgLy8vIFJlYWQgdGhlIGVuZCBvZiBhIG1hcC4KKyAgICBmbiByZWFkX21hcF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFNraXAgYSBmaWVsZCB3aXRoIHR5cGUgYGZpZWxkX3R5cGVgIHJlY3Vyc2l2ZWx5IHVudGlsIHRoZSBkZWZhdWx0CisgICAgLy8vIG1heGltdW0gc2tpcCBkZXB0aCBpcyByZWFjaGVkLgorICAgIGZuIHNraXAoJm11dCBzZWxmLCBmaWVsZF90eXBlOiBUVHlwZSkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5za2lwX3RpbGxfZGVwdGgoZmllbGRfdHlwZSwgTUFYSU1VTV9TS0lQX0RFUFRIKQorICAgIH0KKyAgICAvLy8gU2tpcCBhIGZpZWxkIHdpdGggdHlwZSBgZmllbGRfdHlwZWAgcmVjdXJzaXZlbHkgdXAgdG8gYGRlcHRoYCBsZXZlbHMuCisgICAgZm4gc2tpcF90aWxsX2RlcHRoKCZtdXQgc2VsZiwgZmllbGRfdHlwZTogVFR5cGUsIGRlcHRoOiBpOCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgaWYgZGVwdGggPT0gMCB7CisgICAgICAgICAgICByZXR1cm4gRXJyKDo6RXJyb3I6OlByb3RvY29sKFByb3RvY29sRXJyb3IgeworICAgICAgICAgICAgICAgIGtpbmQ6IFByb3RvY29sRXJyb3JLaW5kOjpEZXB0aExpbWl0LAorICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoImNhbm5vdCBwYXJzZSBwYXN0IHs6P30iLCBmaWVsZF90eXBlKSwKKyAgICAgICAgICAgIH0pKTsKKyAgICAgICAgfQorCisgICAgICAgIG1hdGNoIGZpZWxkX3R5cGUgeworICAgICAgICAgICAgVFR5cGU6OkJvb2wgPT4gc2VsZi5yZWFkX2Jvb2woKS5tYXAofF98ICgpKSwKKyAgICAgICAgICAgIFRUeXBlOjpJMDggPT4gc2VsZi5yZWFkX2k4KCkubWFwKHxffCAoKSksCisgICAgICAgICAgICBUVHlwZTo6STE2ID0+IHNlbGYucmVhZF9pMTYoKS5tYXAofF98ICgpKSwKKyAgICAgICAgICAgIFRUeXBlOjpJMzIgPT4gc2VsZi5yZWFkX2kzMigpLm1hcCh8X3wgKCkpLAorICAgICAgICAgICAgVFR5cGU6Okk2NCA9PiBzZWxmLnJlYWRfaTY0KCkubWFwKHxffCAoKSksCisgICAgICAgICAgICBUVHlwZTo6RG91YmxlID0+IHNlbGYucmVhZF9kb3VibGUoKS5tYXAofF98ICgpKSwKKyAgICAgICAgICAgIFRUeXBlOjpTdHJpbmcgPT4gc2VsZi5yZWFkX3N0cmluZygpLm1hcCh8X3wgKCkpLAorICAgICAgICAgICAgVFR5cGU6OlN0cnVjdCA9PiB7CisgICAgICAgICAgICAgICAgc2VsZi5yZWFkX3N0cnVjdF9iZWdpbigpPzsKKyAgICAgICAgICAgICAgICBsb29wIHsKKyAgICAgICAgICAgICAgICAgICAgbGV0IGZpZWxkX2lkZW50ID0gc2VsZi5yZWFkX2ZpZWxkX2JlZ2luKCk/OworICAgICAgICAgICAgICAgICAgICBpZiBmaWVsZF9pZGVudC5maWVsZF90eXBlID09IFRUeXBlOjpTdG9wIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc2tpcF90aWxsX2RlcHRoKGZpZWxkX2lkZW50LmZpZWxkX3R5cGUsIGRlcHRoIC0gMSk/OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZWxmLnJlYWRfc3RydWN0X2VuZCgpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBUVHlwZTo6TGlzdCA9PiB7CisgICAgICAgICAgICAgICAgbGV0IGxpc3RfaWRlbnQgPSBzZWxmLnJlYWRfbGlzdF9iZWdpbigpPzsKKyAgICAgICAgICAgICAgICBmb3IgXyBpbiAwLi5saXN0X2lkZW50LnNpemUgeworICAgICAgICAgICAgICAgICAgICBzZWxmLnNraXBfdGlsbF9kZXB0aChsaXN0X2lkZW50LmVsZW1lbnRfdHlwZSwgZGVwdGggLSAxKT87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNlbGYucmVhZF9saXN0X2VuZCgpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBUVHlwZTo6U2V0ID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgc2V0X2lkZW50ID0gc2VsZi5yZWFkX3NldF9iZWdpbigpPzsKKyAgICAgICAgICAgICAgICBmb3IgXyBpbiAwLi5zZXRfaWRlbnQuc2l6ZSB7CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc2tpcF90aWxsX2RlcHRoKHNldF9pZGVudC5lbGVtZW50X3R5cGUsIGRlcHRoIC0gMSk/OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZWxmLnJlYWRfc2V0X2VuZCgpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBUVHlwZTo6TWFwID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgbWFwX2lkZW50ID0gc2VsZi5yZWFkX21hcF9iZWdpbigpPzsKKyAgICAgICAgICAgICAgICBmb3IgXyBpbiAwLi5tYXBfaWRlbnQuc2l6ZSB7CisgICAgICAgICAgICAgICAgICAgIGxldCBrZXlfdHlwZSA9IG1hcF9pZGVudAorICAgICAgICAgICAgICAgICAgICAgICAgLmtleV90eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAuZXhwZWN0KCJub24temVybyBzaXplZCBtYXAgc2hvdWxkIGNvbnRhaW4ga2V5IHR5cGUiKTsKKyAgICAgICAgICAgICAgICAgICAgbGV0IHZhbF90eXBlID0gbWFwX2lkZW50CisgICAgICAgICAgICAgICAgICAgICAgICAudmFsdWVfdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgLmV4cGVjdCgibm9uLXplcm8gc2l6ZWQgbWFwIHNob3VsZCBjb250YWluIHZhbHVlIHR5cGUiKTsKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5za2lwX3RpbGxfZGVwdGgoa2V5X3R5cGUsIGRlcHRoIC0gMSk/OworICAgICAgICAgICAgICAgICAgICBzZWxmLnNraXBfdGlsbF9kZXB0aCh2YWxfdHlwZSwgZGVwdGggLSAxKT87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNlbGYucmVhZF9tYXBfZW5kKCkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHUgPT4gRXJyKDo6RXJyb3I6OlByb3RvY29sKFByb3RvY29sRXJyb3IgeworICAgICAgICAgICAgICAgIGtpbmQ6IFByb3RvY29sRXJyb3JLaW5kOjpVbmtub3duLAorICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoImNhbm5vdCBza2lwIGZpZWxkIHR5cGUgezo/fSIsICZ1KSwKKyAgICAgICAgICAgIH0pKSwKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHV0aWxpdHkgKERPIE5PVCBVU0UgSU4gR0VORVJBVEVEIENPREUhISEhKQorICAgIC8vCisKKyAgICAvLy8gUmVhZCBhbiB1bnNpZ25lZCBieXRlLgorICAgIC8vLworICAgIC8vLyBUaGlzIG1ldGhvZCBzaG91bGQgKipuZXZlcioqIGJlIHVzZWQgaW4gZ2VuZXJhdGVkIGNvZGUuCisgICAgZm4gcmVhZF9ieXRlKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8dTg+OworfQorCisvLy8gQ29udmVydHMgVGhyaWZ0IGlkZW50aWZpZXJzLCBwcmltaXRpdmVzLCBjb250YWluZXJzIG9yIHN0cnVjdHMgaW50byBhCisvLy8gc3RyZWFtIG9mIGJ5dGVzLgorLy8vCisvLy8gVGhpcyB0cmFpdCBkb2VzIG5vdCBkZWFsIHdpdGggaGlnaGVyLWxldmVsIFRocmlmdCBjb25jZXB0cyBsaWtlIHN0cnVjdHMgb3IKKy8vLyBleGNlcHRpb25zIC0gb25seSB3aXRoIHByaW1pdGl2ZXMgYW5kIG1lc3NhZ2Ugb3IgY29udGFpbmVyIGJvdW5kYXJpZXMuCisvLy8gV3JpdGUgbWV0aG9kcyB0YWtlIGFuIGlkZW50aWZpZXIgKGZvciBleGFtcGxlLCBgVE1lc3NhZ2VJZGVudGlmaWVyYCkgb3IgYQorLy8vIHByaW1pdGl2ZS4gQW55IG9yIGFsbCBvZiB0aGUgZmllbGRzIGluIGFuIGlkZW50aWZpZXIgbWF5IGJlIG9taXR0ZWQgd2hlbgorLy8vIHdyaXRpbmcgdG8gdGhlIHRyYW5zcG9ydC4gV3JpdGUgbWV0aG9kcyBtYXkgZXZlbiBiZSBub29wcy4gQWxsIG9mIHRoaXMgaXMKKy8vLyB0cmFuc3BhcmVudCB0byB0aGUgY2FsbGVyOyBhcyBsb25nIGFzIGEgbWF0Y2hpbmcgYFRJbnB1dFByb3RvY29sYAorLy8vIGltcGxlbWVudGF0aW9uIGlzIHVzZWQsIHJlY2VpdmVkIG1lc3NhZ2VzIHdpbGwgYmUgZGVjb2RlZCBjb3JyZWN0bHkuCisvLy8KKy8vLyBBbGwgbWV0aG9kcyByZXR1cm4gYSBgdGhyaWZ0OjpSZXN1bHRgLiBJZiBhbiBgRXJyYCBpcyByZXR1cm5lZCB0aGUgcHJvdG9jb2wKKy8vLyBpbnN0YW5jZSBhbmQgaXRzIHVuZGVybHlpbmcgdHJhbnNwb3J0IHNob3VsZCBiZSB0ZXJtaW5hdGVkLgorLy8vCisvLy8gIyBFeGFtcGxlcworLy8vCisvLy8gQ3JlYXRlIGFuZCB1c2UgYSBgVE91dHB1dFByb3RvY29sYAorLy8vCisvLy8gYGBgbm9fcnVuCisvLy8gdXNlIHRocmlmdDo6cHJvdG9jb2w6OntUQmluYXJ5T3V0cHV0UHJvdG9jb2wsIFRGaWVsZElkZW50aWZpZXIsIFRPdXRwdXRQcm90b2NvbCwgVFR5cGV9OworLy8vIHVzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6VFRjcENoYW5uZWw7CisvLy8KKy8vLyBsZXQgbXV0IGNoYW5uZWwgPSBUVGNwQ2hhbm5lbDo6bmV3KCk7CisvLy8gY2hhbm5lbC5vcGVuKCIxMjcuMC4wLjE6OTA5MCIpLnVud3JhcCgpOworLy8vCisvLy8gbGV0IG11dCBwcm90b2NvbCA9IFRCaW5hcnlPdXRwdXRQcm90b2NvbDo6bmV3KGNoYW5uZWwsIHRydWUpOworLy8vCisvLy8gcHJvdG9jb2wud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygic3RyaW5nX3RoaW5nIiwgVFR5cGU6OlN0cmluZywgMSkpLnVud3JhcCgpOworLy8vIHByb3RvY29sLndyaXRlX3N0cmluZygiZm9vIikudW53cmFwKCk7CisvLy8gcHJvdG9jb2wud3JpdGVfZmllbGRfZW5kKCkudW53cmFwKCk7CisvLy8gYGBgCitwdWIgdHJhaXQgVE91dHB1dFByb3RvY29sIHsKKyAgICAvLy8gV3JpdGUgdGhlIGJlZ2lubmluZyBvZiBhIFRocmlmdCBtZXNzYWdlLgorICAgIGZuIHdyaXRlX21lc3NhZ2VfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVE1lc3NhZ2VJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFdyaXRlIHRoZSBlbmQgb2YgYSBUaHJpZnQgbWVzc2FnZS4KKyAgICBmbiB3cml0ZV9tZXNzYWdlX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gV3JpdGUgdGhlIGJlZ2lubmluZyBvZiBhIFRocmlmdCBzdHJ1Y3QuCisgICAgZm4gd3JpdGVfc3RydWN0X2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRTdHJ1Y3RJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFdyaXRlIHRoZSBlbmQgb2YgYSBUaHJpZnQgc3RydWN0LgorICAgIGZuIHdyaXRlX3N0cnVjdF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFdyaXRlIHRoZSBiZWdpbm5pbmcgb2YgYSBUaHJpZnQgZmllbGQuCisgICAgZm4gd3JpdGVfZmllbGRfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVEZpZWxkSWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBXcml0ZSB0aGUgZW5kIG9mIGEgVGhyaWZ0IGZpZWxkLgorICAgIGZuIHdyaXRlX2ZpZWxkX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gV3JpdGUgYSBTVE9QIGZpZWxkIGluZGljYXRpbmcgdGhhdCBhbGwgdGhlIGZpZWxkcyBpbiBhIHN0cnVjdCBoYXZlIGJlZW4KKyAgICAvLy8gd3JpdHRlbi4KKyAgICBmbiB3cml0ZV9maWVsZF9zdG9wKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBXcml0ZSBhIGJvb2wuCisgICAgZm4gd3JpdGVfYm9vbCgmbXV0IHNlbGYsIGI6IGJvb2wpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gV3JpdGUgYSBmaXhlZC1sZW5ndGggYnl0ZSBhcnJheS4KKyAgICBmbiB3cml0ZV9ieXRlcygmbXV0IHNlbGYsIGI6ICZbdThdKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFdyaXRlIGFuIDgtYml0IHNpZ25lZCBpbnRlZ2VyLgorICAgIGZuIHdyaXRlX2k4KCZtdXQgc2VsZiwgaTogaTgpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gV3JpdGUgYSAxNi1iaXQgc2lnbmVkIGludGVnZXIuCisgICAgZm4gd3JpdGVfaTE2KCZtdXQgc2VsZiwgaTogaTE2KSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFdyaXRlIGEgMzItYml0IHNpZ25lZCBpbnRlZ2VyLgorICAgIGZuIHdyaXRlX2kzMigmbXV0IHNlbGYsIGk6IGkzMikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBXcml0ZSBhIDY0LWJpdCBzaWduZWQgaW50ZWdlci4KKyAgICBmbiB3cml0ZV9pNjQoJm11dCBzZWxmLCBpOiBpNjQpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gV3JpdGUgYSA2NC1iaXQgZmxvYXQuCisgICAgZm4gd3JpdGVfZG91YmxlKCZtdXQgc2VsZiwgZDogZjY0KSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFdyaXRlIGEgZml4ZWQtbGVuZ3RoIHN0cmluZy4KKyAgICBmbiB3cml0ZV9zdHJpbmcoJm11dCBzZWxmLCBzOiAmc3RyKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFdyaXRlIHRoZSBiZWdpbm5pbmcgb2YgYSBsaXN0LgorICAgIGZuIHdyaXRlX2xpc3RfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVExpc3RJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFdyaXRlIHRoZSBlbmQgb2YgYSBsaXN0LgorICAgIGZuIHdyaXRlX2xpc3RfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBXcml0ZSB0aGUgYmVnaW5uaW5nIG9mIGEgc2V0LgorICAgIGZuIHdyaXRlX3NldF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUU2V0SWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBXcml0ZSB0aGUgZW5kIG9mIGEgc2V0LgorICAgIGZuIHdyaXRlX3NldF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFdyaXRlIHRoZSBiZWdpbm5pbmcgb2YgYSBtYXAuCisgICAgZm4gd3JpdGVfbWFwX2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRNYXBJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFdyaXRlIHRoZSBlbmQgb2YgYSBtYXAuCisgICAgZm4gd3JpdGVfbWFwX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gRmx1c2ggYnVmZmVyZWQgYnl0ZXMgdG8gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LgorICAgIGZuIGZsdXNoKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+OworCisgICAgLy8gdXRpbGl0eSAoRE8gTk9UIFVTRSBJTiBHRU5FUkFURUQgQ09ERSEhISEpCisgICAgLy8KKworICAgIC8vLyBXcml0ZSBhbiB1bnNpZ25lZCBieXRlLgorICAgIC8vLworICAgIC8vLyBUaGlzIG1ldGhvZCBzaG91bGQgKipuZXZlcioqIGJlIHVzZWQgaW4gZ2VuZXJhdGVkIGNvZGUuCisgICAgZm4gd3JpdGVfYnl0ZSgmbXV0IHNlbGYsIGI6IHU4KSAtPiA6OlJlc3VsdDwoKT47IC8vIEZJWE1FOiBSRU1PVkUKK30KKworaW1wbDxQPiBUSW5wdXRQcm90b2NvbCBmb3IgQm94PFA+Cit3aGVyZQorICAgIFA6IFRJbnB1dFByb3RvY29sICsgP1NpemVkLAoreworICAgIGZuIHJlYWRfbWVzc2FnZV9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRNZXNzYWdlSWRlbnRpZmllcj4geworICAgICAgICAoKipzZWxmKS5yZWFkX21lc3NhZ2VfYmVnaW4oKQorICAgIH0KKworICAgIGZuIHJlYWRfbWVzc2FnZV9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS5yZWFkX21lc3NhZ2VfZW5kKCkKKyAgICB9CisKKyAgICBmbiByZWFkX3N0cnVjdF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PE9wdGlvbjxUU3RydWN0SWRlbnRpZmllcj4+IHsKKyAgICAgICAgKCoqc2VsZikucmVhZF9zdHJ1Y3RfYmVnaW4oKQorICAgIH0KKworICAgIGZuIHJlYWRfc3RydWN0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLnJlYWRfc3RydWN0X2VuZCgpCisgICAgfQorCisgICAgZm4gcmVhZF9maWVsZF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRGaWVsZElkZW50aWZpZXI+IHsKKyAgICAgICAgKCoqc2VsZikucmVhZF9maWVsZF9iZWdpbigpCisgICAgfQorCisgICAgZm4gcmVhZF9maWVsZF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS5yZWFkX2ZpZWxkX2VuZCgpCisgICAgfQorCisgICAgZm4gcmVhZF9ib29sKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8Ym9vbD4geworICAgICAgICAoKipzZWxmKS5yZWFkX2Jvb2woKQorICAgIH0KKworICAgIGZuIHJlYWRfYnl0ZXMoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxWZWM8dTg+PiB7CisgICAgICAgICgqKnNlbGYpLnJlYWRfYnl0ZXMoKQorICAgIH0KKworICAgIGZuIHJlYWRfaTgoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxpOD4geworICAgICAgICAoKipzZWxmKS5yZWFkX2k4KCkKKyAgICB9CisKKyAgICBmbiByZWFkX2kxNigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGkxNj4geworICAgICAgICAoKipzZWxmKS5yZWFkX2kxNigpCisgICAgfQorCisgICAgZm4gcmVhZF9pMzIoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxpMzI+IHsKKyAgICAgICAgKCoqc2VsZikucmVhZF9pMzIoKQorICAgIH0KKworICAgIGZuIHJlYWRfaTY0KCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8aTY0PiB7CisgICAgICAgICgqKnNlbGYpLnJlYWRfaTY0KCkKKyAgICB9CisKKyAgICBmbiByZWFkX2RvdWJsZSgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGY2ND4geworICAgICAgICAoKipzZWxmKS5yZWFkX2RvdWJsZSgpCisgICAgfQorCisgICAgZm4gcmVhZF9zdHJpbmcoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxTdHJpbmc+IHsKKyAgICAgICAgKCoqc2VsZikucmVhZF9zdHJpbmcoKQorICAgIH0KKworICAgIGZuIHJlYWRfbGlzdF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRMaXN0SWRlbnRpZmllcj4geworICAgICAgICAoKipzZWxmKS5yZWFkX2xpc3RfYmVnaW4oKQorICAgIH0KKworICAgIGZuIHJlYWRfbGlzdF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS5yZWFkX2xpc3RfZW5kKCkKKyAgICB9CisKKyAgICBmbiByZWFkX3NldF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRTZXRJZGVudGlmaWVyPiB7CisgICAgICAgICgqKnNlbGYpLnJlYWRfc2V0X2JlZ2luKCkKKyAgICB9CisKKyAgICBmbiByZWFkX3NldF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS5yZWFkX3NldF9lbmQoKQorICAgIH0KKworICAgIGZuIHJlYWRfbWFwX2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VE1hcElkZW50aWZpZXI+IHsKKyAgICAgICAgKCoqc2VsZikucmVhZF9tYXBfYmVnaW4oKQorICAgIH0KKworICAgIGZuIHJlYWRfbWFwX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLnJlYWRfbWFwX2VuZCgpCisgICAgfQorCisgICAgZm4gcmVhZF9ieXRlKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8dTg+IHsKKyAgICAgICAgKCoqc2VsZikucmVhZF9ieXRlKCkKKyAgICB9Cit9CisKK2ltcGw8UD4gVE91dHB1dFByb3RvY29sIGZvciBCb3g8UD4KK3doZXJlCisgICAgUDogVE91dHB1dFByb3RvY29sICsgP1NpemVkLAoreworICAgIGZuIHdyaXRlX21lc3NhZ2VfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVE1lc3NhZ2VJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS53cml0ZV9tZXNzYWdlX2JlZ2luKGlkZW50aWZpZXIpCisgICAgfQorCisgICAgZm4gd3JpdGVfbWVzc2FnZV9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS53cml0ZV9tZXNzYWdlX2VuZCgpCisgICAgfQorCisgICAgZm4gd3JpdGVfc3RydWN0X2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRTdHJ1Y3RJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS53cml0ZV9zdHJ1Y3RfYmVnaW4oaWRlbnRpZmllcikKKyAgICB9CisKKyAgICBmbiB3cml0ZV9zdHJ1Y3RfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfc3RydWN0X2VuZCgpCisgICAgfQorCisgICAgZm4gd3JpdGVfZmllbGRfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVEZpZWxkSWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfZmllbGRfYmVnaW4oaWRlbnRpZmllcikKKyAgICB9CisKKyAgICBmbiB3cml0ZV9maWVsZF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS53cml0ZV9maWVsZF9lbmQoKQorICAgIH0KKworICAgIGZuIHdyaXRlX2ZpZWxkX3N0b3AoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS53cml0ZV9maWVsZF9zdG9wKCkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9ib29sKCZtdXQgc2VsZiwgYjogYm9vbCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfYm9vbChiKQorICAgIH0KKworICAgIGZuIHdyaXRlX2J5dGVzKCZtdXQgc2VsZiwgYjogJlt1OF0pIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLndyaXRlX2J5dGVzKGIpCisgICAgfQorCisgICAgZm4gd3JpdGVfaTgoJm11dCBzZWxmLCBpOiBpOCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfaTgoaSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9pMTYoJm11dCBzZWxmLCBpOiBpMTYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLndyaXRlX2kxNihpKQorICAgIH0KKworICAgIGZuIHdyaXRlX2kzMigmbXV0IHNlbGYsIGk6IGkzMikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfaTMyKGkpCisgICAgfQorCisgICAgZm4gd3JpdGVfaTY0KCZtdXQgc2VsZiwgaTogaTY0KSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS53cml0ZV9pNjQoaSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9kb3VibGUoJm11dCBzZWxmLCBkOiBmNjQpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLndyaXRlX2RvdWJsZShkKQorICAgIH0KKworICAgIGZuIHdyaXRlX3N0cmluZygmbXV0IHNlbGYsIHM6ICZzdHIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLndyaXRlX3N0cmluZyhzKQorICAgIH0KKworICAgIGZuIHdyaXRlX2xpc3RfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVExpc3RJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS53cml0ZV9saXN0X2JlZ2luKGlkZW50aWZpZXIpCisgICAgfQorCisgICAgZm4gd3JpdGVfbGlzdF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS53cml0ZV9saXN0X2VuZCgpCisgICAgfQorCisgICAgZm4gd3JpdGVfc2V0X2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRTZXRJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS53cml0ZV9zZXRfYmVnaW4oaWRlbnRpZmllcikKKyAgICB9CisKKyAgICBmbiB3cml0ZV9zZXRfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfc2V0X2VuZCgpCisgICAgfQorCisgICAgZm4gd3JpdGVfbWFwX2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRNYXBJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS53cml0ZV9tYXBfYmVnaW4oaWRlbnRpZmllcikKKyAgICB9CisKKyAgICBmbiB3cml0ZV9tYXBfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfbWFwX2VuZCgpCisgICAgfQorCisgICAgZm4gZmx1c2goJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS5mbHVzaCgpCisgICAgfQorCisgICAgZm4gd3JpdGVfYnl0ZSgmbXV0IHNlbGYsIGI6IHU4KSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS53cml0ZV9ieXRlKGIpCisgICAgfQorfQorCisvLy8gSGVscGVyIHR5cGUgdXNlZCBieSBzZXJ2ZXJzIHRvIGNyZWF0ZSBgVElucHV0UHJvdG9jb2xgIGluc3RhbmNlcyBmb3IKKy8vLyBhY2NlcHRlZCBjbGllbnQgY29ubmVjdGlvbnMuCisvLy8KKy8vLyAjIEV4YW1wbGVzCisvLy8KKy8vLyBDcmVhdGUgYSBgVElucHV0UHJvdG9jb2xGYWN0b3J5YCBhbmQgdXNlIGl0IHRvIGNyZWF0ZSBhIGBUSW5wdXRQcm90b2NvbGAuCisvLy8KKy8vLyBgYGBub19ydW4KKy8vLyB1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RCaW5hcnlJbnB1dFByb3RvY29sRmFjdG9yeSwgVElucHV0UHJvdG9jb2xGYWN0b3J5fTsKKy8vLyB1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUY3BDaGFubmVsOworLy8vCisvLy8gbGV0IG11dCBjaGFubmVsID0gVFRjcENoYW5uZWw6Om5ldygpOworLy8vIGNoYW5uZWwub3BlbigiMTI3LjAuMC4xOjkwOTAiKS51bndyYXAoKTsKKy8vLworLy8vIGxldCBmYWN0b3J5ID0gVEJpbmFyeUlucHV0UHJvdG9jb2xGYWN0b3J5OjpuZXcoKTsKKy8vLyBsZXQgcHJvdG9jb2wgPSBmYWN0b3J5LmNyZWF0ZShCb3g6Om5ldyhjaGFubmVsKSk7CisvLy8gYGBgCitwdWIgdHJhaXQgVElucHV0UHJvdG9jb2xGYWN0b3J5IHsKKyAgICAvLyBDcmVhdGUgYSBgVElucHV0UHJvdG9jb2xgIHRoYXQgcmVhZHMgYnl0ZXMgZnJvbSBgdHJhbnNwb3J0YC4KKyAgICBmbiBjcmVhdGUoJnNlbGYsIHRyYW5zcG9ydDogQm94PFRSZWFkVHJhbnNwb3J0ICsgU2VuZD4pIC0+IEJveDxUSW5wdXRQcm90b2NvbCArIFNlbmQ+OworfQorCitpbXBsPFQ+IFRJbnB1dFByb3RvY29sRmFjdG9yeSBmb3IgQm94PFQ+Cit3aGVyZQorICAgIFQ6IFRJbnB1dFByb3RvY29sRmFjdG9yeSArID9TaXplZCwKK3sKKyAgICBmbiBjcmVhdGUoJnNlbGYsIHRyYW5zcG9ydDogQm94PFRSZWFkVHJhbnNwb3J0ICsgU2VuZD4pIC0+IEJveDxUSW5wdXRQcm90b2NvbCArIFNlbmQ+IHsKKyAgICAgICAgKCoqc2VsZikuY3JlYXRlKHRyYW5zcG9ydCkKKyAgICB9Cit9CisKKy8vLyBIZWxwZXIgdHlwZSB1c2VkIGJ5IHNlcnZlcnMgdG8gY3JlYXRlIGBUT3V0cHV0UHJvdG9jb2xgIGluc3RhbmNlcyBmb3IKKy8vLyBhY2NlcHRlZCBjbGllbnQgY29ubmVjdGlvbnMuCisvLy8KKy8vLyAjIEV4YW1wbGVzCisvLy8KKy8vLyBDcmVhdGUgYSBgVE91dHB1dFByb3RvY29sRmFjdG9yeWAgYW5kIHVzZSBpdCB0byBjcmVhdGUgYSBgVE91dHB1dFByb3RvY29sYC4KKy8vLworLy8vIGBgYG5vX3J1bgorLy8vIHVzZSB0aHJpZnQ6OnByb3RvY29sOjp7VEJpbmFyeU91dHB1dFByb3RvY29sRmFjdG9yeSwgVE91dHB1dFByb3RvY29sRmFjdG9yeX07CisvLy8gdXNlIHRocmlmdDo6dHJhbnNwb3J0OjpUVGNwQ2hhbm5lbDsKKy8vLworLy8vIGxldCBtdXQgY2hhbm5lbCA9IFRUY3BDaGFubmVsOjpuZXcoKTsKKy8vLyBjaGFubmVsLm9wZW4oIjEyNy4wLjAuMTo5MDkwIikudW53cmFwKCk7CisvLy8KKy8vLyBsZXQgZmFjdG9yeSA9IFRCaW5hcnlPdXRwdXRQcm90b2NvbEZhY3Rvcnk6Om5ldygpOworLy8vIGxldCBwcm90b2NvbCA9IGZhY3RvcnkuY3JlYXRlKEJveDo6bmV3KGNoYW5uZWwpKTsKKy8vLyBgYGAKK3B1YiB0cmFpdCBUT3V0cHV0UHJvdG9jb2xGYWN0b3J5IHsKKyAgICAvLy8gQ3JlYXRlIGEgYFRPdXRwdXRQcm90b2NvbGAgdGhhdCB3cml0ZXMgYnl0ZXMgdG8gYHRyYW5zcG9ydGAuCisgICAgZm4gY3JlYXRlKCZzZWxmLCB0cmFuc3BvcnQ6IEJveDxUV3JpdGVUcmFuc3BvcnQgKyBTZW5kPikgLT4gQm94PFRPdXRwdXRQcm90b2NvbCArIFNlbmQ+OworfQorCitpbXBsPFQ+IFRPdXRwdXRQcm90b2NvbEZhY3RvcnkgZm9yIEJveDxUPgord2hlcmUKKyAgICBUOiBUT3V0cHV0UHJvdG9jb2xGYWN0b3J5ICsgP1NpemVkLAoreworICAgIGZuIGNyZWF0ZSgmc2VsZiwgdHJhbnNwb3J0OiBCb3g8VFdyaXRlVHJhbnNwb3J0ICsgU2VuZD4pIC0+IEJveDxUT3V0cHV0UHJvdG9jb2wgKyBTZW5kPiB7CisgICAgICAgICgqKnNlbGYpLmNyZWF0ZSh0cmFuc3BvcnQpCisgICAgfQorfQorCisvLy8gVGhyaWZ0IG1lc3NhZ2UgaWRlbnRpZmllci4KKyNbZGVyaXZlKENsb25lLCBEZWJ1ZywgRXEsIFBhcnRpYWxFcSldCitwdWIgc3RydWN0IFRNZXNzYWdlSWRlbnRpZmllciB7CisgICAgLy8vIFNlcnZpY2UgY2FsbCB0aGUgbWVzc2FnZSBpcyBhc3NvY2lhdGVkIHdpdGguCisgICAgcHViIG5hbWU6IFN0cmluZywKKyAgICAvLy8gTWVzc2FnZSB0eXBlLgorICAgIHB1YiBtZXNzYWdlX3R5cGU6IFRNZXNzYWdlVHlwZSwKKyAgICAvLy8gT3JkZXJlZCBzZXF1ZW5jZSBudW1iZXIgaWRlbnRpZnlpbmcgdGhlIG1lc3NhZ2UuCisgICAgcHViIHNlcXVlbmNlX251bWJlcjogaTMyLAorfQorCitpbXBsIFRNZXNzYWdlSWRlbnRpZmllciB7CisgICAgLy8vIENyZWF0ZSBhIGBUTWVzc2FnZUlkZW50aWZpZXJgIGZvciBhIFRocmlmdCBzZXJ2aWNlLWNhbGwgbmFtZWQgYG5hbWVgCisgICAgLy8vIHdpdGggbWVzc2FnZSB0eXBlIGBtZXNzYWdlX3R5cGVgIGFuZCBzZXF1ZW5jZSBudW1iZXIgYHNlcXVlbmNlX251bWJlcmAuCisgICAgcHViIGZuIG5ldzxTOiBJbnRvPFN0cmluZz4+KAorICAgICAgICBuYW1lOiBTLAorICAgICAgICBtZXNzYWdlX3R5cGU6IFRNZXNzYWdlVHlwZSwKKyAgICAgICAgc2VxdWVuY2VfbnVtYmVyOiBpMzIsCisgICAgKSAtPiBUTWVzc2FnZUlkZW50aWZpZXIgeworICAgICAgICBUTWVzc2FnZUlkZW50aWZpZXIgeworICAgICAgICAgICAgbmFtZTogbmFtZS5pbnRvKCksCisgICAgICAgICAgICBtZXNzYWdlX3R5cGU6IG1lc3NhZ2VfdHlwZSwKKyAgICAgICAgICAgIHNlcXVlbmNlX251bWJlcjogc2VxdWVuY2VfbnVtYmVyLAorICAgICAgICB9CisgICAgfQorfQorCisvLy8gVGhyaWZ0IHN0cnVjdCBpZGVudGlmaWVyLgorI1tkZXJpdmUoQ2xvbmUsIERlYnVnLCBFcSwgUGFydGlhbEVxKV0KK3B1YiBzdHJ1Y3QgVFN0cnVjdElkZW50aWZpZXIgeworICAgIC8vLyBOYW1lIG9mIHRoZSBlbmNvZGVkIFRocmlmdCBzdHJ1Y3QuCisgICAgcHViIG5hbWU6IFN0cmluZywKK30KKworaW1wbCBUU3RydWN0SWRlbnRpZmllciB7CisgICAgLy8vIENyZWF0ZSBhIGBUU3RydWN0SWRlbnRpZmllcmAgZm9yIGEgc3RydWN0IG5hbWVkIGBuYW1lYC4KKyAgICBwdWIgZm4gbmV3PFM6IEludG88U3RyaW5nPj4obmFtZTogUykgLT4gVFN0cnVjdElkZW50aWZpZXIgeworICAgICAgICBUU3RydWN0SWRlbnRpZmllciB7IG5hbWU6IG5hbWUuaW50bygpIH0KKyAgICB9Cit9CisKKy8vLyBUaHJpZnQgZmllbGQgaWRlbnRpZmllci4KKyNbZGVyaXZlKENsb25lLCBEZWJ1ZywgRXEsIFBhcnRpYWxFcSldCitwdWIgc3RydWN0IFRGaWVsZElkZW50aWZpZXIgeworICAgIC8vLyBOYW1lIG9mIHRoZSBUaHJpZnQgZmllbGQuCisgICAgLy8vCisgICAgLy8vIGBOb25lYCBpZiBpdCdzIG5vdCBzZW50IG92ZXIgdGhlIHdpcmUuCisgICAgcHViIG5hbWU6IE9wdGlvbjxTdHJpbmc+LAorICAgIC8vLyBGaWVsZCB0eXBlLgorICAgIC8vLworICAgIC8vLyBUaGlzIG1heSBiZSBhIHByaW1pdGl2ZSwgY29udGFpbmVyLCBvciBhIHN0cnVjdC4KKyAgICBwdWIgZmllbGRfdHlwZTogVFR5cGUsCisgICAgLy8vIFRocmlmdCBmaWVsZCBpZC4KKyAgICAvLy8KKyAgICAvLy8gYE5vbmVgIG9ubHkgaWYgYGZpZWxkX3R5cGVgIGlzIGBUVHlwZTo6U3RvcGAuCisgICAgcHViIGlkOiBPcHRpb248aTE2PiwKK30KKworaW1wbCBURmllbGRJZGVudGlmaWVyIHsKKyAgICAvLy8gQ3JlYXRlIGEgYFRGaWVsZElkZW50aWZpZXJgIGZvciBhIGZpZWxkIG5hbWVkIGBuYW1lYCB3aXRoIHR5cGUKKyAgICAvLy8gYGZpZWxkX3R5cGVgIGFuZCBmaWVsZCBpZCBgaWRgLgorICAgIC8vLworICAgIC8vLyBgaWRgIHNob3VsZCBiZSBgTm9uZWAgaWYgYGZpZWxkX3R5cGVgIGlzIGBUVHlwZTo6U3RvcGAuCisgICAgcHViIGZuIG5ldzxOLCBTLCBJPihuYW1lOiBOLCBmaWVsZF90eXBlOiBUVHlwZSwgaWQ6IEkpIC0+IFRGaWVsZElkZW50aWZpZXIKKyAgICB3aGVyZQorICAgICAgICBOOiBJbnRvPE9wdGlvbjxTPj4sCisgICAgICAgIFM6IEludG88U3RyaW5nPiwKKyAgICAgICAgSTogSW50bzxPcHRpb248aTE2Pj4sCisgICAgeworICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgIG5hbWU6IG5hbWUuaW50bygpLm1hcCh8bnwgbi5pbnRvKCkpLAorICAgICAgICAgICAgZmllbGRfdHlwZTogZmllbGRfdHlwZSwKKyAgICAgICAgICAgIGlkOiBpZC5pbnRvKCksCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vLyBUaHJpZnQgbGlzdCBpZGVudGlmaWVyLgorI1tkZXJpdmUoQ2xvbmUsIERlYnVnLCBFcSwgUGFydGlhbEVxKV0KK3B1YiBzdHJ1Y3QgVExpc3RJZGVudGlmaWVyIHsKKyAgICAvLy8gVHlwZSBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIGxpc3QuCisgICAgcHViIGVsZW1lbnRfdHlwZTogVFR5cGUsCisgICAgLy8vIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdC4KKyAgICBwdWIgc2l6ZTogaTMyLAorfQorCitpbXBsIFRMaXN0SWRlbnRpZmllciB7CisgICAgLy8vIENyZWF0ZSBhIGBUTGlzdElkZW50aWZpZXJgIGZvciBhIGxpc3Qgd2l0aCBgc2l6ZWAgZWxlbWVudHMgb2YgdHlwZQorICAgIC8vLyBgZWxlbWVudF90eXBlYC4KKyAgICBwdWIgZm4gbmV3KGVsZW1lbnRfdHlwZTogVFR5cGUsIHNpemU6IGkzMikgLT4gVExpc3RJZGVudGlmaWVyIHsKKyAgICAgICAgVExpc3RJZGVudGlmaWVyIHsKKyAgICAgICAgICAgIGVsZW1lbnRfdHlwZTogZWxlbWVudF90eXBlLAorICAgICAgICAgICAgc2l6ZTogc2l6ZSwKKyAgICAgICAgfQorICAgIH0KK30KKworLy8vIFRocmlmdCBzZXQgaWRlbnRpZmllci4KKyNbZGVyaXZlKENsb25lLCBEZWJ1ZywgRXEsIFBhcnRpYWxFcSldCitwdWIgc3RydWN0IFRTZXRJZGVudGlmaWVyIHsKKyAgICAvLy8gVHlwZSBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIHNldC4KKyAgICBwdWIgZWxlbWVudF90eXBlOiBUVHlwZSwKKyAgICAvLy8gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBzZXQuCisgICAgcHViIHNpemU6IGkzMiwKK30KKworaW1wbCBUU2V0SWRlbnRpZmllciB7CisgICAgLy8vIENyZWF0ZSBhIGBUU2V0SWRlbnRpZmllcmAgZm9yIGEgc2V0IHdpdGggYHNpemVgIGVsZW1lbnRzIG9mIHR5cGUKKyAgICAvLy8gYGVsZW1lbnRfdHlwZWAuCisgICAgcHViIGZuIG5ldyhlbGVtZW50X3R5cGU6IFRUeXBlLCBzaXplOiBpMzIpIC0+IFRTZXRJZGVudGlmaWVyIHsKKyAgICAgICAgVFNldElkZW50aWZpZXIgeworICAgICAgICAgICAgZWxlbWVudF90eXBlOiBlbGVtZW50X3R5cGUsCisgICAgICAgICAgICBzaXplOiBzaXplLAorICAgICAgICB9CisgICAgfQorfQorCisvLy8gVGhyaWZ0IG1hcCBpZGVudGlmaWVyLgorI1tkZXJpdmUoQ2xvbmUsIERlYnVnLCBFcSwgUGFydGlhbEVxKV0KK3B1YiBzdHJ1Y3QgVE1hcElkZW50aWZpZXIgeworICAgIC8vLyBNYXAga2V5IHR5cGUuCisgICAgcHViIGtleV90eXBlOiBPcHRpb248VFR5cGU+LAorICAgIC8vLyBNYXAgdmFsdWUgdHlwZS4KKyAgICBwdWIgdmFsdWVfdHlwZTogT3B0aW9uPFRUeXBlPiwKKyAgICAvLy8gTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIG1hcC4KKyAgICBwdWIgc2l6ZTogaTMyLAorfQorCitpbXBsIFRNYXBJZGVudGlmaWVyIHsKKyAgICAvLy8gQ3JlYXRlIGEgYFRNYXBJZGVudGlmaWVyYCBmb3IgYSBtYXAgd2l0aCBgc2l6ZWAgZW50cmllcyBvZiB0eXBlCisgICAgLy8vIGBrZXlfdHlwZSAtPiB2YWx1ZV90eXBlYC4KKyAgICBwdWIgZm4gbmV3PEssIFY+KGtleV90eXBlOiBLLCB2YWx1ZV90eXBlOiBWLCBzaXplOiBpMzIpIC0+IFRNYXBJZGVudGlmaWVyCisgICAgd2hlcmUKKyAgICAgICAgSzogSW50bzxPcHRpb248VFR5cGU+PiwKKyAgICAgICAgVjogSW50bzxPcHRpb248VFR5cGU+PiwKKyAgICB7CisgICAgICAgIFRNYXBJZGVudGlmaWVyIHsKKyAgICAgICAgICAgIGtleV90eXBlOiBrZXlfdHlwZS5pbnRvKCksCisgICAgICAgICAgICB2YWx1ZV90eXBlOiB2YWx1ZV90eXBlLmludG8oKSwKKyAgICAgICAgICAgIHNpemU6IHNpemUsCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vLyBUaHJpZnQgbWVzc2FnZSB0eXBlcy4KKyNbZGVyaXZlKENsb25lLCBDb3B5LCBEZWJ1ZywgRXEsIFBhcnRpYWxFcSldCitwdWIgZW51bSBUTWVzc2FnZVR5cGUgeworICAgIC8vLyBTZXJ2aWNlLWNhbGwgcmVxdWVzdC4KKyAgICBDYWxsLAorICAgIC8vLyBTZXJ2aWNlLWNhbGwgcmVzcG9uc2UuCisgICAgUmVwbHksCisgICAgLy8vIFVuZXhwZWN0ZWQgZXJyb3IgaW4gdGhlIHJlbW90ZSBzZXJ2aWNlLgorICAgIEV4Y2VwdGlvbiwKKyAgICAvLy8gT25lLXdheSBzZXJ2aWNlLWNhbGwgcmVxdWVzdCAobm8gcmVzcG9uc2UgaXMgZXhwZWN0ZWQpLgorICAgIE9uZVdheSwKK30KKworaW1wbCBEaXNwbGF5IGZvciBUTWVzc2FnZVR5cGUgeworICAgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBGb3JtYXR0ZXIpIC0+IGZtdDo6UmVzdWx0IHsKKyAgICAgICAgbWF0Y2ggKnNlbGYgeworICAgICAgICAgICAgVE1lc3NhZ2VUeXBlOjpDYWxsID0+IHdyaXRlIShmLCAiQ2FsbCIpLAorICAgICAgICAgICAgVE1lc3NhZ2VUeXBlOjpSZXBseSA9PiB3cml0ZSEoZiwgIlJlcGx5IiksCisgICAgICAgICAgICBUTWVzc2FnZVR5cGU6OkV4Y2VwdGlvbiA9PiB3cml0ZSEoZiwgIkV4Y2VwdGlvbiIpLAorICAgICAgICAgICAgVE1lc3NhZ2VUeXBlOjpPbmVXYXkgPT4gd3JpdGUhKGYsICJPbmVXYXkiKSwKKyAgICAgICAgfQorICAgIH0KK30KKworaW1wbCBGcm9tPFRNZXNzYWdlVHlwZT4gZm9yIHU4IHsKKyAgICBmbiBmcm9tKG1lc3NhZ2VfdHlwZTogVE1lc3NhZ2VUeXBlKSAtPiBTZWxmIHsKKyAgICAgICAgbWF0Y2ggbWVzc2FnZV90eXBlIHsKKyAgICAgICAgICAgIFRNZXNzYWdlVHlwZTo6Q2FsbCA9PiAweDAxLAorICAgICAgICAgICAgVE1lc3NhZ2VUeXBlOjpSZXBseSA9PiAweDAyLAorICAgICAgICAgICAgVE1lc3NhZ2VUeXBlOjpFeGNlcHRpb24gPT4gMHgwMywKKyAgICAgICAgICAgIFRNZXNzYWdlVHlwZTo6T25lV2F5ID0+IDB4MDQsCisgICAgICAgIH0KKyAgICB9Cit9CisKK2ltcGwgVHJ5RnJvbTx1OD4gZm9yIFRNZXNzYWdlVHlwZSB7CisgICAgdHlwZSBFcnIgPSA6OkVycm9yOworICAgIGZuIHRyeV9mcm9tKGI6IHU4KSAtPiA6OlJlc3VsdDxTZWxmPiB7CisgICAgICAgIG1hdGNoIGIgeworICAgICAgICAgICAgMHgwMSA9PiBPayhUTWVzc2FnZVR5cGU6OkNhbGwpLAorICAgICAgICAgICAgMHgwMiA9PiBPayhUTWVzc2FnZVR5cGU6OlJlcGx5KSwKKyAgICAgICAgICAgIDB4MDMgPT4gT2soVE1lc3NhZ2VUeXBlOjpFeGNlcHRpb24pLAorICAgICAgICAgICAgMHgwNCA9PiBPayhUTWVzc2FnZVR5cGU6Ok9uZVdheSksCisgICAgICAgICAgICB1bmtuID0+IEVycig6OkVycm9yOjpQcm90b2NvbChQcm90b2NvbEVycm9yIHsKKyAgICAgICAgICAgICAgICBraW5kOiBQcm90b2NvbEVycm9yS2luZDo6SW52YWxpZERhdGEsCisgICAgICAgICAgICAgICAgbWVzc2FnZTogZm9ybWF0ISgiY2Fubm90IGNvbnZlcnQge30gdG8gVE1lc3NhZ2VUeXBlIiwgdW5rbiksCisgICAgICAgICAgICB9KSksCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vLyBUaHJpZnQgc3RydWN0LWZpZWxkIHR5cGVzLgorI1tkZXJpdmUoQ2xvbmUsIENvcHksIERlYnVnLCBFcSwgUGFydGlhbEVxKV0KK3B1YiBlbnVtIFRUeXBlIHsKKyAgICAvLy8gSW5kaWNhdGVzIHRoYXQgdGhlcmUgYXJlIG5vIG1vcmUgc2VyaWFsaXplZCBmaWVsZHMgaW4gdGhpcyBUaHJpZnQgc3RydWN0LgorICAgIFN0b3AsCisgICAgLy8vIFZvaWQgKGAoKWApIGZpZWxkLgorICAgIFZvaWQsCisgICAgLy8vIEJvb2xlYW4uCisgICAgQm9vbCwKKyAgICAvLy8gU2lnbmVkIDgtYml0IGludC4KKyAgICBJMDgsCisgICAgLy8vIERvdWJsZS1wcmVjaXNpb24gbnVtYmVyLgorICAgIERvdWJsZSwKKyAgICAvLy8gU2lnbmVkIDE2LWJpdCBpbnQuCisgICAgSTE2LAorICAgIC8vLyBTaWduZWQgMzItYml0IGludC4KKyAgICBJMzIsCisgICAgLy8vIFNpZ25lZCA2NC1iaXQgaW50LgorICAgIEk2NCwKKyAgICAvLy8gVVRGLTggc3RyaW5nLgorICAgIFN0cmluZywKKyAgICAvLy8gVVRGLTcgc3RyaW5nLiAqVW5zdXBwb3J0ZWQqLgorICAgIFV0ZjcsCisgICAgLy8vIFRocmlmdCBzdHJ1Y3QuCisgICAgU3RydWN0LAorICAgIC8vLyBNYXAuCisgICAgTWFwLAorICAgIC8vLyBTZXQuCisgICAgU2V0LAorICAgIC8vLyBMaXN0LgorICAgIExpc3QsCisgICAgLy8vIFVURi04IHN0cmluZy4KKyAgICBVdGY4LAorICAgIC8vLyBVVEYtMTYgc3RyaW5nLiAqVW5zdXBwb3J0ZWQqLgorICAgIFV0ZjE2LAorfQorCitpbXBsIERpc3BsYXkgZm9yIFRUeXBlIHsKKyAgICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgRm9ybWF0dGVyKSAtPiBmbXQ6OlJlc3VsdCB7CisgICAgICAgIG1hdGNoICpzZWxmIHsKKyAgICAgICAgICAgIFRUeXBlOjpTdG9wID0+IHdyaXRlIShmLCAiU1RPUCIpLAorICAgICAgICAgICAgVFR5cGU6OlZvaWQgPT4gd3JpdGUhKGYsICJ2b2lkIiksCisgICAgICAgICAgICBUVHlwZTo6Qm9vbCA9PiB3cml0ZSEoZiwgImJvb2wiKSwKKyAgICAgICAgICAgIFRUeXBlOjpJMDggPT4gd3JpdGUhKGYsICJpMDgiKSwKKyAgICAgICAgICAgIFRUeXBlOjpEb3VibGUgPT4gd3JpdGUhKGYsICJkb3VibGUiKSwKKyAgICAgICAgICAgIFRUeXBlOjpJMTYgPT4gd3JpdGUhKGYsICJpMTYiKSwKKyAgICAgICAgICAgIFRUeXBlOjpJMzIgPT4gd3JpdGUhKGYsICJpMzIiKSwKKyAgICAgICAgICAgIFRUeXBlOjpJNjQgPT4gd3JpdGUhKGYsICJpNjQiKSwKKyAgICAgICAgICAgIFRUeXBlOjpTdHJpbmcgPT4gd3JpdGUhKGYsICJzdHJpbmciKSwKKyAgICAgICAgICAgIFRUeXBlOjpVdGY3ID0+IHdyaXRlIShmLCAiVVRGNyIpLAorICAgICAgICAgICAgVFR5cGU6OlN0cnVjdCA9PiB3cml0ZSEoZiwgInN0cnVjdCIpLAorICAgICAgICAgICAgVFR5cGU6Ok1hcCA9PiB3cml0ZSEoZiwgIm1hcCIpLAorICAgICAgICAgICAgVFR5cGU6OlNldCA9PiB3cml0ZSEoZiwgInNldCIpLAorICAgICAgICAgICAgVFR5cGU6Okxpc3QgPT4gd3JpdGUhKGYsICJsaXN0IiksCisgICAgICAgICAgICBUVHlwZTo6VXRmOCA9PiB3cml0ZSEoZiwgIlVURjgiKSwKKyAgICAgICAgICAgIFRUeXBlOjpVdGYxNiA9PiB3cml0ZSEoZiwgIlVURjE2IiksCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vLyBDb21wYXJlIHRoZSBleHBlY3RlZCBtZXNzYWdlIHNlcXVlbmNlIG51bWJlciBgZXhwZWN0ZWRgIHdpdGggdGhlIHJlY2VpdmVkCisvLy8gbWVzc2FnZSBzZXF1ZW5jZSBudW1iZXIgYGFjdHVhbGAuCisvLy8KKy8vLyBSZXR1cm4gYCgpYCBpZiBgYWN0dWFsID09IGV4cGVjdGVkYCwgYEVycmAgb3RoZXJ3aXNlLgorcHViIGZuIHZlcmlmeV9leHBlY3RlZF9zZXF1ZW5jZV9udW1iZXIoZXhwZWN0ZWQ6IGkzMiwgYWN0dWFsOiBpMzIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgaWYgZXhwZWN0ZWQgPT0gYWN0dWFsIHsKKyAgICAgICAgT2soKCkpCisgICAgfSBlbHNlIHsKKyAgICAgICAgRXJyKDo6RXJyb3I6OkFwcGxpY2F0aW9uKDo6QXBwbGljYXRpb25FcnJvciB7CisgICAgICAgICAgICBraW5kOiA6OkFwcGxpY2F0aW9uRXJyb3JLaW5kOjpCYWRTZXF1ZW5jZUlkLAorICAgICAgICAgICAgbWVzc2FnZTogZm9ybWF0ISgiZXhwZWN0ZWQge30gZ290IHt9IiwgZXhwZWN0ZWQsIGFjdHVhbCksCisgICAgICAgIH0pKQorICAgIH0KK30KKworLy8vIENvbXBhcmUgdGhlIGV4cGVjdGVkIHNlcnZpY2UtY2FsbCBuYW1lIGBleHBlY3RlZGAgd2l0aCB0aGUgcmVjZWl2ZWQKKy8vLyBzZXJ2aWNlLWNhbGwgbmFtZSBgYWN0dWFsYC4KKy8vLworLy8vIFJldHVybiBgKClgIGlmIGBhY3R1YWwgPT0gZXhwZWN0ZWRgLCBgRXJyYCBvdGhlcndpc2UuCitwdWIgZm4gdmVyaWZ5X2V4cGVjdGVkX3NlcnZpY2VfY2FsbChleHBlY3RlZDogJnN0ciwgYWN0dWFsOiAmc3RyKSAtPiA6OlJlc3VsdDwoKT4geworICAgIGlmIGV4cGVjdGVkID09IGFjdHVhbCB7CisgICAgICAgIE9rKCgpKQorICAgIH0gZWxzZSB7CisgICAgICAgIEVycig6OkVycm9yOjpBcHBsaWNhdGlvbig6OkFwcGxpY2F0aW9uRXJyb3IgeworICAgICAgICAgICAga2luZDogOjpBcHBsaWNhdGlvbkVycm9yS2luZDo6V3JvbmdNZXRob2ROYW1lLAorICAgICAgICAgICAgbWVzc2FnZTogZm9ybWF0ISgiZXhwZWN0ZWQge30gZ290IHt9IiwgZXhwZWN0ZWQsIGFjdHVhbCksCisgICAgICAgIH0pKQorICAgIH0KK30KKworLy8vIENvbXBhcmUgdGhlIGV4cGVjdGVkIG1lc3NhZ2UgdHlwZSBgZXhwZWN0ZWRgIHdpdGggdGhlIHJlY2VpdmVkIG1lc3NhZ2UgdHlwZQorLy8vIGBhY3R1YWxgLgorLy8vCisvLy8gUmV0dXJuIGAoKWAgaWYgYGFjdHVhbCA9PSBleHBlY3RlZGAsIGBFcnJgIG90aGVyd2lzZS4KK3B1YiBmbiB2ZXJpZnlfZXhwZWN0ZWRfbWVzc2FnZV90eXBlKGV4cGVjdGVkOiBUTWVzc2FnZVR5cGUsIGFjdHVhbDogVE1lc3NhZ2VUeXBlKSAtPiA6OlJlc3VsdDwoKT4geworICAgIGlmIGV4cGVjdGVkID09IGFjdHVhbCB7CisgICAgICAgIE9rKCgpKQorICAgIH0gZWxzZSB7CisgICAgICAgIEVycig6OkVycm9yOjpBcHBsaWNhdGlvbig6OkFwcGxpY2F0aW9uRXJyb3IgeworICAgICAgICAgICAga2luZDogOjpBcHBsaWNhdGlvbkVycm9yS2luZDo6SW52YWxpZE1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgbWVzc2FnZTogZm9ybWF0ISgiZXhwZWN0ZWQge30gZ290IHt9IiwgZXhwZWN0ZWQsIGFjdHVhbCksCisgICAgICAgIH0pKQorICAgIH0KK30KKworLy8vIENoZWNrIGlmIGEgcmVxdWlyZWQgVGhyaWZ0IHN0cnVjdCBmaWVsZCBleGlzdHMuCisvLy8KKy8vLyBSZXR1cm4gYCgpYCBpZiBpdCBkb2VzLCBgRXJyYCBvdGhlcndpc2UuCitwdWIgZm4gdmVyaWZ5X3JlcXVpcmVkX2ZpZWxkX2V4aXN0czxUPihmaWVsZF9uYW1lOiAmc3RyLCBmaWVsZDogJk9wdGlvbjxUPikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICBtYXRjaCAqZmllbGQgeworICAgICAgICBTb21lKF8pID0+IE9rKCgpKSwKKyAgICAgICAgTm9uZSA9PiBFcnIoOjpFcnJvcjo6UHJvdG9jb2woOjpQcm90b2NvbEVycm9yIHsKKyAgICAgICAgICAgIGtpbmQ6IDo6UHJvdG9jb2xFcnJvcktpbmQ6OlVua25vd24sCisgICAgICAgICAgICBtZXNzYWdlOiBmb3JtYXQhKCJtaXNzaW5nIHJlcXVpcmVkIGZpZWxkIHt9IiwgZmllbGRfbmFtZSksCisgICAgICAgIH0pKSwKKyAgICB9Cit9CisKKy8vLyBFeHRyYWN0IHRoZSBmaWVsZCBpZCBmcm9tIGEgVGhyaWZ0IGZpZWxkIGlkZW50aWZpZXIuCisvLy8KKy8vLyBgZmllbGRfaWRlbnRgIG11c3QgKm5vdCogaGF2ZSBgVEZpZWxkSWRlbnRpZmllci5maWVsZF90eXBlYCBvZiB0eXBlIGBUVHlwZTo6U3RvcGAuCisvLy8KKy8vLyBSZXR1cm4gYFRGaWVsZElkZW50aWZpZXIuaWRgIGlmIGFuIGlkIGV4aXN0cywgYEVycmAgb3RoZXJ3aXNlLgorcHViIGZuIGZpZWxkX2lkKGZpZWxkX2lkZW50OiAmVEZpZWxkSWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8aTE2PiB7CisgICAgZmllbGRfaWRlbnQuaWQub2tfb3JfZWxzZSh8fCB7CisgICAgICAgIDo6RXJyb3I6OlByb3RvY29sKDo6UHJvdG9jb2xFcnJvciB7CisgICAgICAgICAgICBraW5kOiA6OlByb3RvY29sRXJyb3JLaW5kOjpVbmtub3duLAorICAgICAgICAgICAgbWVzc2FnZTogZm9ybWF0ISgibWlzc2luZyBmaWVsZCBpbiBpbiB7Oj99IiwgZmllbGRfaWRlbnQpLAorICAgICAgICB9KQorICAgIH0pCit9CisKKyNbY2ZnKHRlc3QpXQorbW9kIHRlc3RzIHsKKworICAgIHVzZSBzdGQ6OmlvOjpDdXJzb3I7CisKKyAgICB1c2Ugc3VwZXI6Oio7CisgICAgdXNlIHRyYW5zcG9ydDo6e1RSZWFkVHJhbnNwb3J0LCBUV3JpdGVUcmFuc3BvcnR9OworCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfY3JlYXRlX3VzYWJsZV9pbnB1dF9wcm90b2NvbF9mcm9tX2NvbmNyZXRlX2lucHV0X3Byb3RvY29sKCkgeworICAgICAgICBsZXQgcjogQm94PFRSZWFkVHJhbnNwb3J0PiA9IEJveDo6bmV3KEN1cnNvcjo6bmV3KFswLCAxLCAyXSkpOworICAgICAgICBsZXQgbXV0IHQgPSBUQ29tcGFjdElucHV0UHJvdG9jb2w6Om5ldyhyKTsKKyAgICAgICAgdGFrZXNfaW5wdXRfcHJvdG9jb2woJm11dCB0KQorICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2NyZWF0ZV91c2FibGVfaW5wdXRfcHJvdG9jb2xfZnJvbV9ib3hlZF9pbnB1dCgpIHsKKyAgICAgICAgbGV0IHI6IEJveDxUUmVhZFRyYW5zcG9ydD4gPSBCb3g6Om5ldyhDdXJzb3I6Om5ldyhbMCwgMSwgMl0pKTsKKyAgICAgICAgbGV0IG11dCB0OiBCb3g8VElucHV0UHJvdG9jb2w+ID0gQm94OjpuZXcoVENvbXBhY3RJbnB1dFByb3RvY29sOjpuZXcocikpOworICAgICAgICB0YWtlc19pbnB1dF9wcm90b2NvbCgmbXV0IHQpCisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfY3JlYXRlX3VzYWJsZV9vdXRwdXRfcHJvdG9jb2xfZnJvbV9jb25jcmV0ZV9vdXRwdXRfcHJvdG9jb2woKSB7CisgICAgICAgIGxldCB3OiBCb3g8VFdyaXRlVHJhbnNwb3J0PiA9IEJveDo6bmV3KHZlYyFbMHU4OyAxMF0pOworICAgICAgICBsZXQgbXV0IHQgPSBUQ29tcGFjdE91dHB1dFByb3RvY29sOjpuZXcodyk7CisgICAgICAgIHRha2VzX291dHB1dF9wcm90b2NvbCgmbXV0IHQpCisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfY3JlYXRlX3VzYWJsZV9vdXRwdXRfcHJvdG9jb2xfZnJvbV9ib3hlZF9vdXRwdXQoKSB7CisgICAgICAgIGxldCB3OiBCb3g8VFdyaXRlVHJhbnNwb3J0PiA9IEJveDo6bmV3KHZlYyFbMHU4OyAxMF0pOworICAgICAgICBsZXQgbXV0IHQ6IEJveDxUT3V0cHV0UHJvdG9jb2w+ID0gQm94OjpuZXcoVENvbXBhY3RPdXRwdXRQcm90b2NvbDo6bmV3KHcpKTsKKyAgICAgICAgdGFrZXNfb3V0cHV0X3Byb3RvY29sKCZtdXQgdCkKKyAgICB9CisKKyAgICBmbiB0YWtlc19pbnB1dF9wcm90b2NvbDxSPih0OiAmbXV0IFIpCisgICAgd2hlcmUKKyAgICAgICAgUjogVElucHV0UHJvdG9jb2wsCisgICAgeworICAgICAgICB0LnJlYWRfYnl0ZSgpLnVud3JhcCgpOworICAgIH0KKworICAgIGZuIHRha2VzX291dHB1dF9wcm90b2NvbDxXPih0OiAmbXV0IFcpCisgICAgd2hlcmUKKyAgICAgICAgVzogVE91dHB1dFByb3RvY29sLAorICAgIHsKKyAgICAgICAgdC5mbHVzaCgpLnVud3JhcCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9ycy9zcmMvcHJvdG9jb2wvbXVsdGlwbGV4ZWQucnMgYi9saWIvcnMvc3JjL3Byb3RvY29sL211bHRpcGxleGVkLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhZWU0NGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvc3JjL3Byb3RvY29sL211bHRpcGxleGVkLnJzCkBAIC0wLDAgKzEsMjM5IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzZSBzdXBlcjo6eworICAgIFRGaWVsZElkZW50aWZpZXIsIFRMaXN0SWRlbnRpZmllciwgVE1hcElkZW50aWZpZXIsIFRNZXNzYWdlSWRlbnRpZmllciwgVE1lc3NhZ2VUeXBlLAorICAgIFRPdXRwdXRQcm90b2NvbCwgVFNldElkZW50aWZpZXIsIFRTdHJ1Y3RJZGVudGlmaWVyLAorfTsKKworLy8vIGBUT3V0cHV0UHJvdG9jb2xgIHRoYXQgcHJlZml4ZXMgdGhlIHNlcnZpY2UgbmFtZSB0byBhbGwgb3V0Z29pbmcgVGhyaWZ0CisvLy8gbWVzc2FnZXMuCisvLy8KKy8vLyBBIGBUTXVsdGlwbGV4ZWRPdXRwdXRQcm90b2NvbGAgc2hvdWxkIGJlIHVzZWQgd2hlbiBtdWx0aXBsZSBUaHJpZnQgc2VydmljZXMKKy8vLyBzZW5kIG1lc3NhZ2VzIG92ZXIgYSBzaW5nbGUgSS9PIGNoYW5uZWwuIEJ5IHByZWZpeGluZyBzZXJ2aWNlIGlkZW50aWZpZXJzCisvLy8gdG8gb3V0Z29pbmcgbWVzc2FnZXMgcmVjZWl2ZXJzIGFyZSBhYmxlIHRvIGRlbXV4IHRoZW0gYW5kIHJvdXRlIHRoZW0gdG8gdGhlCisvLy8gYXBwcm9wcmlhdGUgc2VydmljZSBwcm9jZXNzb3IuIFJ1c3QgcmVjZWl2ZXJzIG11c3QgdXNlIGEgYFRNdWx0aXBsZXhlZFByb2Nlc3NvcmAKKy8vLyB0byBwcm9jZXNzIGluY29taW5nIG1lc3NhZ2VzLCB3aGlsZSBvdGhlciBsYW5ndWFnZXMgbXVzdCB1c2UgdGhlaXIKKy8vLyBjb3JyZXNwb25kaW5nIG11bHRpcGxleGVkIHByb2Nlc3NvciBpbXBsZW1lbnRhdGlvbnMuCisvLy8KKy8vLyBGb3IgZXhhbXBsZSwgZ2l2ZW4gYSBzZXJ2aWNlIGBUZXN0U2VydmljZWAgYW5kIGEgc2VydmljZSBjYWxsIGB0ZXN0X2NhbGxgLAorLy8vIHRoaXMgaW1wbGVtZW50YXRpb24gd291bGQgaWRlbnRpZnkgbWVzc2FnZXMgYXMgb3JpZ2luYXRpbmcgZnJvbQorLy8vIGBUZXN0U2VydmljZTp0ZXN0X2NhbGxgLgorLy8vCisvLy8gIyBFeGFtcGxlcworLy8vCisvLy8gQ3JlYXRlIGFuZCB1c2UgYSBgVE11bHRpcGxleGVkT3V0cHV0UHJvdG9jb2xgLgorLy8vCisvLy8gYGBgbm9fcnVuCisvLy8gdXNlIHRocmlmdDo6cHJvdG9jb2w6OntUTWVzc2FnZUlkZW50aWZpZXIsIFRNZXNzYWdlVHlwZSwgVE91dHB1dFByb3RvY29sfTsKKy8vLyB1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RCaW5hcnlPdXRwdXRQcm90b2NvbCwgVE11bHRpcGxleGVkT3V0cHV0UHJvdG9jb2x9OworLy8vIHVzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6VFRjcENoYW5uZWw7CisvLy8KKy8vLyBsZXQgbXV0IGNoYW5uZWwgPSBUVGNwQ2hhbm5lbDo6bmV3KCk7CisvLy8gY2hhbm5lbC5vcGVuKCJsb2NhbGhvc3Q6OTA5MCIpLnVud3JhcCgpOworLy8vCisvLy8gbGV0IHByb3RvY29sID0gVEJpbmFyeU91dHB1dFByb3RvY29sOjpuZXcoY2hhbm5lbCwgdHJ1ZSk7CisvLy8gbGV0IG11dCBwcm90b2NvbCA9IFRNdWx0aXBsZXhlZE91dHB1dFByb3RvY29sOjpuZXcoInNlcnZpY2VfbmFtZSIsIHByb3RvY29sKTsKKy8vLworLy8vIGxldCBpZGVudCA9IFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KCJzdmNfY2FsbCIsIFRNZXNzYWdlVHlwZTo6Q2FsbCwgMSk7CisvLy8gcHJvdG9jb2wud3JpdGVfbWVzc2FnZV9iZWdpbigmaWRlbnQpLnVud3JhcCgpOworLy8vIGBgYAorI1tkZXJpdmUoRGVidWcpXQorcHViIHN0cnVjdCBUTXVsdGlwbGV4ZWRPdXRwdXRQcm90b2NvbDxQPgord2hlcmUKKyAgICBQOiBUT3V0cHV0UHJvdG9jb2wsCit7CisgICAgc2VydmljZV9uYW1lOiBTdHJpbmcsCisgICAgaW5uZXI6IFAsCit9CisKK2ltcGw8UD4gVE11bHRpcGxleGVkT3V0cHV0UHJvdG9jb2w8UD4KK3doZXJlCisgICAgUDogVE91dHB1dFByb3RvY29sLAoreworICAgIC8vLyBDcmVhdGUgYSBgVE11bHRpcGxleGVkT3V0cHV0UHJvdG9jb2xgIHRoYXQgaWRlbnRpZmllcyBvdXRnb2luZyBtZXNzYWdlcworICAgIC8vLyBhcyBvcmlnaW5hdGluZyBmcm9tIGEgc2VydmljZSBuYW1lZCBgc2VydmljZV9uYW1lYCBhbmQgc2VuZHMgdGhlbSBvdmVyCisgICAgLy8vIHRoZSBgd3JhcHBlZGAgYFRPdXRwdXRQcm90b2NvbGAuIE91dGdvaW5nIG1lc3NhZ2VzIGFyZSBlbmNvZGVkIGFuZCBzZW50CisgICAgLy8vIGJ5IGB3cmFwcGVkYCwgbm90IGJ5IHRoaXMgaW5zdGFuY2UuCisgICAgcHViIGZuIG5ldyhzZXJ2aWNlX25hbWU6ICZzdHIsIHdyYXBwZWQ6IFApIC0+IFRNdWx0aXBsZXhlZE91dHB1dFByb3RvY29sPFA+IHsKKyAgICAgICAgVE11bHRpcGxleGVkT3V0cHV0UHJvdG9jb2wgeworICAgICAgICAgICAgc2VydmljZV9uYW1lOiBzZXJ2aWNlX25hbWUudG9fb3duZWQoKSwKKyAgICAgICAgICAgIGlubmVyOiB3cmFwcGVkLAorICAgICAgICB9CisgICAgfQorfQorCisvLyBGSVhNRTogYXZvaWQgcGFzc3Rocm91Z2ggbWV0aG9kcworaW1wbDxQPiBUT3V0cHV0UHJvdG9jb2wgZm9yIFRNdWx0aXBsZXhlZE91dHB1dFByb3RvY29sPFA+Cit3aGVyZQorICAgIFA6IFRPdXRwdXRQcm90b2NvbCwKK3sKKyAgICBmbiB3cml0ZV9tZXNzYWdlX2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRNZXNzYWdlSWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgbWF0Y2ggaWRlbnRpZmllci5tZXNzYWdlX3R5cGUgeworICAgICAgICAgICAgLy8gRklYTUU6IGlzIHRoZXJlIGEgYmV0dGVyIHdheSB0byBvdmVycmlkZSBpZGVudGlmaWVyIGhlcmU/CisgICAgICAgICAgICBUTWVzc2FnZVR5cGU6OkNhbGwgfCBUTWVzc2FnZVR5cGU6Ok9uZVdheSA9PiB7CisgICAgICAgICAgICAgICAgbGV0IGlkZW50aWZpZXIgPSBUTWVzc2FnZUlkZW50aWZpZXIgeworICAgICAgICAgICAgICAgICAgICBuYW1lOiBmb3JtYXQhKCJ7fTp7fSIsIHNlbGYuc2VydmljZV9uYW1lLCBpZGVudGlmaWVyLm5hbWUpLAorICAgICAgICAgICAgICAgICAgICAuLippZGVudGlmaWVyCisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBzZWxmLmlubmVyLndyaXRlX21lc3NhZ2VfYmVnaW4oJmlkZW50aWZpZXIpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBfID0+IHNlbGYuaW5uZXIud3JpdGVfbWVzc2FnZV9iZWdpbihpZGVudGlmaWVyKSwKKyAgICAgICAgfQorICAgIH0KKworICAgIGZuIHdyaXRlX21lc3NhZ2VfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci53cml0ZV9tZXNzYWdlX2VuZCgpCisgICAgfQorCisgICAgZm4gd3JpdGVfc3RydWN0X2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRTdHJ1Y3RJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLndyaXRlX3N0cnVjdF9iZWdpbihpZGVudGlmaWVyKQorICAgIH0KKworICAgIGZuIHdyaXRlX3N0cnVjdF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLndyaXRlX3N0cnVjdF9lbmQoKQorICAgIH0KKworICAgIGZuIHdyaXRlX2ZpZWxkX2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRGaWVsZElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIud3JpdGVfZmllbGRfYmVnaW4oaWRlbnRpZmllcikKKyAgICB9CisKKyAgICBmbiB3cml0ZV9maWVsZF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLndyaXRlX2ZpZWxkX2VuZCgpCisgICAgfQorCisgICAgZm4gd3JpdGVfZmllbGRfc3RvcCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIud3JpdGVfZmllbGRfc3RvcCgpCisgICAgfQorCisgICAgZm4gd3JpdGVfYnl0ZXMoJm11dCBzZWxmLCBiOiAmW3U4XSkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci53cml0ZV9ieXRlcyhiKQorICAgIH0KKworICAgIGZuIHdyaXRlX2Jvb2woJm11dCBzZWxmLCBiOiBib29sKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLndyaXRlX2Jvb2woYikKKyAgICB9CisKKyAgICBmbiB3cml0ZV9pOCgmbXV0IHNlbGYsIGk6IGk4KSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLndyaXRlX2k4KGkpCisgICAgfQorCisgICAgZm4gd3JpdGVfaTE2KCZtdXQgc2VsZiwgaTogaTE2KSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLndyaXRlX2kxNihpKQorICAgIH0KKworICAgIGZuIHdyaXRlX2kzMigmbXV0IHNlbGYsIGk6IGkzMikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci53cml0ZV9pMzIoaSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9pNjQoJm11dCBzZWxmLCBpOiBpNjQpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIud3JpdGVfaTY0KGkpCisgICAgfQorCisgICAgZm4gd3JpdGVfZG91YmxlKCZtdXQgc2VsZiwgZDogZjY0KSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLndyaXRlX2RvdWJsZShkKQorICAgIH0KKworICAgIGZuIHdyaXRlX3N0cmluZygmbXV0IHNlbGYsIHM6ICZzdHIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIud3JpdGVfc3RyaW5nKHMpCisgICAgfQorCisgICAgZm4gd3JpdGVfbGlzdF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUTGlzdElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIud3JpdGVfbGlzdF9iZWdpbihpZGVudGlmaWVyKQorICAgIH0KKworICAgIGZuIHdyaXRlX2xpc3RfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci53cml0ZV9saXN0X2VuZCgpCisgICAgfQorCisgICAgZm4gd3JpdGVfc2V0X2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRTZXRJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLndyaXRlX3NldF9iZWdpbihpZGVudGlmaWVyKQorICAgIH0KKworICAgIGZuIHdyaXRlX3NldF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLndyaXRlX3NldF9lbmQoKQorICAgIH0KKworICAgIGZuIHdyaXRlX21hcF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUTWFwSWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci53cml0ZV9tYXBfYmVnaW4oaWRlbnRpZmllcikKKyAgICB9CisKKyAgICBmbiB3cml0ZV9tYXBfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci53cml0ZV9tYXBfZW5kKCkKKyAgICB9CisKKyAgICBmbiBmbHVzaCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIuZmx1c2goKQorICAgIH0KKworICAgIC8vIHV0aWxpdHkKKyAgICAvLworCisgICAgZm4gd3JpdGVfYnl0ZSgmbXV0IHNlbGYsIGI6IHU4KSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLndyaXRlX2J5dGUoYikKKyAgICB9Cit9CisKKyNbY2ZnKHRlc3QpXQorbW9kIHRlc3RzIHsKKworICAgIHVzZSBwcm90b2NvbDo6e1RCaW5hcnlPdXRwdXRQcm90b2NvbCwgVE1lc3NhZ2VJZGVudGlmaWVyLCBUTWVzc2FnZVR5cGUsIFRPdXRwdXRQcm90b2NvbH07CisgICAgdXNlIHRyYW5zcG9ydDo6e1RCdWZmZXJDaGFubmVsLCBUSW9DaGFubmVsLCBXcml0ZUhhbGZ9OworCisgICAgdXNlIHN1cGVyOjoqOworCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbWVzc2FnZV9iZWdpbl93aXRoX3ByZWZpeGVkX3NlcnZpY2VfbmFtZSgpIHsKKyAgICAgICAgbGV0IG11dCBvX3Byb3QgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICBsZXQgaWRlbnQgPSBUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygiYmFyIiwgVE1lc3NhZ2VUeXBlOjpDYWxsLCAyKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9tZXNzYWdlX2JlZ2luKCZpZGVudCkpOworCisgICAgICAgICNbY2ZnX2F0dHIocnVzdGZtdCwgcnVzdGZtdDo6c2tpcCldCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyAxOV0gPSBbCisgICAgICAgICAgICAweDgwLAorICAgICAgICAgICAgMHgwMSwgLyogcHJvdG9jb2wgaWRlbnRpZmllciAqLworICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDEsIC8qIG1lc3NhZ2UgdHlwZSAqLworICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwNywKKyAgICAgICAgICAgIDB4NjYsCisgICAgICAgICAgICAweDZGLAorICAgICAgICAgICAgMHg2RiwgLyogImZvbyIgKi8KKyAgICAgICAgICAgIDB4M0EsIC8qICI6IiAqLworICAgICAgICAgICAgMHg2MiwKKyAgICAgICAgICAgIDB4NjEsCisgICAgICAgICAgICAweDcyLCAvKiAiYmFyIiAqLworICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMiAvKiBzZXF1ZW5jZSBudW1iZXIgKi8sCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxIShvX3Byb3QuaW5uZXIudHJhbnNwb3J0LndyaXRlX2J5dGVzKCksIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICBmbiB0ZXN0X29iamVjdHMoKSAtPiBUTXVsdGlwbGV4ZWRPdXRwdXRQcm90b2NvbDxUQmluYXJ5T3V0cHV0UHJvdG9jb2w8V3JpdGVIYWxmPFRCdWZmZXJDaGFubmVsPj4+CisgICAgeworICAgICAgICBsZXQgYyA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDQwLCA0MCk7CisgICAgICAgIGxldCAoXywgd19jaGFuKSA9IGMuc3BsaXQoKS51bndyYXAoKTsKKyAgICAgICAgbGV0IHByb3QgPSBUQmluYXJ5T3V0cHV0UHJvdG9jb2w6Om5ldyh3X2NoYW4sIHRydWUpOworICAgICAgICBUTXVsdGlwbGV4ZWRPdXRwdXRQcm90b2NvbDo6bmV3KCJmb28iLCBwcm90KQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9ycy9zcmMvcHJvdG9jb2wvc3RvcmVkLnJzIGIvbGliL3JzL3NyYy9wcm90b2NvbC9zdG9yZWQucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM1NTk3OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy9zcmMvcHJvdG9jb2wvc3RvcmVkLnJzCkBAIC0wLDAgKzEsMTk2IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzZSBzdGQ6OmNvbnZlcnQ6OkludG87CisKK3VzZSBzdXBlcjo6eworICAgIFRGaWVsZElkZW50aWZpZXIsIFRJbnB1dFByb3RvY29sLCBUTGlzdElkZW50aWZpZXIsIFRNYXBJZGVudGlmaWVyLCBUTWVzc2FnZUlkZW50aWZpZXIsCisgICAgVFNldElkZW50aWZpZXIsIFRTdHJ1Y3RJZGVudGlmaWVyLAorfTsKK3VzZSBQcm90b2NvbEVycm9yS2luZDsKKworLy8vIGBUSW5wdXRQcm90b2NvbGAgcmVxdWlyZWQgdG8gdXNlIGEgYFRNdWx0aXBsZXhlZFByb2Nlc3NvcmAuCisvLy8KKy8vLyBBIGBUTXVsdGlwbGV4ZWRQcm9jZXNzb3JgIHJlYWRzIGluY29taW5nIG1lc3NhZ2UgaWRlbnRpZmllcnMgdG8gZGV0ZXJtaW5lIHRvCisvLy8gd2hpY2ggYFRQcm9jZXNzb3JgIHJlcXVlc3RzIHNob3VsZCBiZSBmb3J3YXJkZWQuIEhvd2V2ZXIsIG9uY2UgcmVhZCwgdGhvc2UKKy8vLyBtZXNzYWdlIGlkZW50aWZpZXIgYnl0ZXMgYXJlIG5vIGxvbmdlciBvbiB0aGUgd2lyZS4gU2luY2UgZG93bnN0cmVhbQorLy8vIHByb2Nlc3NvcnMgZXhwZWN0IHRvIHJlYWQgbWVzc2FnZSBpZGVudGlmaWVycyBmcm9tIHRoZSBnaXZlbiBpbnB1dCBwcm90b2NvbAorLy8vIHdlIG5lZWQgc29tZSB3YXkgb2Ygc3VwcGx5aW5nIGEgYFRNZXNzYWdlSWRlbnRpZmllcmAgd2l0aCB0aGUgc2VydmljZS1uYW1lCisvLy8gc3RyaXBwZWQuIFRoaXMgaW1wbGVtZW50YXRpb24gc3RvcmVzIHRoZSByZWNlaXZlZCBgVE1lc3NhZ2VJZGVudGlmaWVyYAorLy8vICh3aXRob3V0IHRoZSBzZXJ2aWNlIG5hbWUpIGFuZCBwYXNzZXMgaXQgdG8gdGhlIHdyYXBwZWQgYFRJbnB1dFByb3RvY29sYAorLy8vIHdoZW4gYFRJbnB1dFByb3RvY29sOjpyZWFkX21lc3NhZ2VfYmVnaW4oLi4uKWAgaXMgY2FsbGVkLiBJdCBkZWxlZ2F0ZXMgYWxsCisvLy8gb3RoZXIgY2FsbHMgZGlyZWN0bHkgdG8gdGhlIHdyYXBwZWQgYFRJbnB1dFByb3RvY29sYC4KKy8vLworLy8vIFRoaXMgdHlwZSAqKnNob3VsZCBub3QqKiBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9uIGNvZGUuCisvLy8KKy8vLyAjIEV4YW1wbGVzCisvLy8KKy8vLyBDcmVhdGUgYW5kIHVzZSBhIGBUU3RvcmVkSW5wdXRQcm90b2NvbGAuCisvLy8KKy8vLyBgYGBub19ydW4KKy8vLyB1c2UgdGhyaWZ0OworLy8vIHVzZSB0aHJpZnQ6OnByb3RvY29sOjp7VElucHV0UHJvdG9jb2wsIFRNZXNzYWdlSWRlbnRpZmllciwgVE1lc3NhZ2VUeXBlLCBUT3V0cHV0UHJvdG9jb2x9OworLy8vIHVzZSB0aHJpZnQ6OnByb3RvY29sOjp7VEJpbmFyeUlucHV0UHJvdG9jb2wsIFRCaW5hcnlPdXRwdXRQcm90b2NvbCwgVFN0b3JlZElucHV0UHJvdG9jb2x9OworLy8vIHVzZSB0aHJpZnQ6OnNlcnZlcjo6VFByb2Nlc3NvcjsKKy8vLyB1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OntUSW9DaGFubmVsLCBUVGNwQ2hhbm5lbH07CisvLy8KKy8vLyAvLyBzYW1wbGUgcHJvY2Vzc29yCisvLy8gc3RydWN0IEFjdHVhbFByb2Nlc3NvcjsKKy8vLyBpbXBsIFRQcm9jZXNzb3IgZm9yIEFjdHVhbFByb2Nlc3NvciB7CisvLy8gICAgIGZuIHByb2Nlc3MoCisvLy8gICAgICAgICAmc2VsZiwKKy8vLyAgICAgICAgIF86ICZtdXQgVElucHV0UHJvdG9jb2wsCisvLy8gICAgICAgICBfOiAmbXV0IFRPdXRwdXRQcm90b2NvbAorLy8vICAgICApIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7CisvLy8gICAgICAgICB1bmltcGxlbWVudGVkISgpCisvLy8gICAgIH0KKy8vLyB9CisvLy8gbGV0IHByb2Nlc3NvciA9IEFjdHVhbFByb2Nlc3NvciB7fTsKKy8vLworLy8vIC8vIGNvbnN0cnVjdCB0aGUgc2hhcmVkIHRyYW5zcG9ydAorLy8vIGxldCBtdXQgY2hhbm5lbCA9IFRUY3BDaGFubmVsOjpuZXcoKTsKKy8vLyBjaGFubmVsLm9wZW4oImxvY2FsaG9zdDo5MDkwIikudW53cmFwKCk7CisvLy8KKy8vLyBsZXQgKGlfY2hhbiwgb19jaGFuKSA9IGNoYW5uZWwuc3BsaXQoKS51bndyYXAoKTsKKy8vLworLy8vIC8vIGNvbnN0cnVjdCB0aGUgYWN0dWFsIGlucHV0IGFuZCBvdXRwdXQgcHJvdG9jb2xzCisvLy8gbGV0IG11dCBpX3Byb3QgPSBUQmluYXJ5SW5wdXRQcm90b2NvbDo6bmV3KGlfY2hhbiwgdHJ1ZSk7CisvLy8gbGV0IG11dCBvX3Byb3QgPSBUQmluYXJ5T3V0cHV0UHJvdG9jb2w6Om5ldyhvX2NoYW4sIHRydWUpOworLy8vCisvLy8gLy8gbWVzc2FnZSBpZGVudGlmaWVyIHJlY2VpdmVkIGZyb20gcmVtb3RlIGFuZCBtb2RpZmllZCB0byByZW1vdmUgdGhlIHNlcnZpY2UgbmFtZQorLy8vIGxldCBuZXdfbXNnX2lkZW50ID0gVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoInNlcnZpY2VfY2FsbCIsIFRNZXNzYWdlVHlwZTo6Q2FsbCwgMSk7CisvLy8KKy8vLyAvLyBjb25zdHJ1Y3QgdGhlIHByb3h5IGlucHV0IHByb3RvY29sCisvLy8gbGV0IG11dCBwcm94eV9pX3Byb3QgPSBUU3RvcmVkSW5wdXRQcm90b2NvbDo6bmV3KCZtdXQgaV9wcm90LCBuZXdfbXNnX2lkZW50KTsKKy8vLyBsZXQgcmVzID0gcHJvY2Vzc29yLnByb2Nlc3MoJm11dCBwcm94eV9pX3Byb3QsICZtdXQgb19wcm90KTsKKy8vLyBgYGAKKy8vIEZJWE1FOiBpbXBsZW1lbnQgRGVidWcKK3B1YiBzdHJ1Y3QgVFN0b3JlZElucHV0UHJvdG9jb2w8J2E+IHsKKyAgICBpbm5lcjogJidhIG11dCBUSW5wdXRQcm90b2NvbCwKKyAgICBtZXNzYWdlX2lkZW50OiBPcHRpb248VE1lc3NhZ2VJZGVudGlmaWVyPiwKK30KKworaW1wbDwnYT4gVFN0b3JlZElucHV0UHJvdG9jb2w8J2E+IHsKKyAgICAvLy8gQ3JlYXRlIGEgYFRTdG9yZWRJbnB1dFByb3RvY29sYCB0aGF0IGRlbGVnYXRlcyBhbGwgY2FsbHMgb3RoZXIgdGhhbgorICAgIC8vLyBgVElucHV0UHJvdG9jb2w6OnJlYWRfbWVzc2FnZV9iZWdpbiguLi4pYCB0byBhIGB3cmFwcGVkYAorICAgIC8vLyBgVElucHV0UHJvdG9jb2xgLiBgbWVzc2FnZV9pZGVudGAgaXMgdGhlIG1vZGlmaWVkIG1lc3NhZ2UgaWRlbnRpZmllciAtCisgICAgLy8vIHdpdGggc2VydmljZSBuYW1lIHN0cmlwcGVkIC0gdGhhdCB3aWxsIGJlIHBhc3NlZCB0bworICAgIC8vLyBgd3JhcHBlZC5yZWFkX21lc3NhZ2VfYmVnaW4oLi4uKWAuCisgICAgcHViIGZuIG5ldygKKyAgICAgICAgd3JhcHBlZDogJm11dCBUSW5wdXRQcm90b2NvbCwKKyAgICAgICAgbWVzc2FnZV9pZGVudDogVE1lc3NhZ2VJZGVudGlmaWVyLAorICAgICkgLT4gVFN0b3JlZElucHV0UHJvdG9jb2wgeworICAgICAgICBUU3RvcmVkSW5wdXRQcm90b2NvbCB7CisgICAgICAgICAgICBpbm5lcjogd3JhcHBlZCwKKyAgICAgICAgICAgIG1lc3NhZ2VfaWRlbnQ6IG1lc3NhZ2VfaWRlbnQuaW50bygpLAorICAgICAgICB9CisgICAgfQorfQorCitpbXBsPCdhPiBUSW5wdXRQcm90b2NvbCBmb3IgVFN0b3JlZElucHV0UHJvdG9jb2w8J2E+IHsKKyAgICBmbiByZWFkX21lc3NhZ2VfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxUTWVzc2FnZUlkZW50aWZpZXI+IHsKKyAgICAgICAgc2VsZi5tZXNzYWdlX2lkZW50LnRha2UoKS5va19vcl9lbHNlKHx8IHsKKyAgICAgICAgICAgIDo6ZXJyb3JzOjpuZXdfcHJvdG9jb2xfZXJyb3IoCisgICAgICAgICAgICAgICAgUHJvdG9jb2xFcnJvcktpbmQ6OlVua25vd24sCisgICAgICAgICAgICAgICAgIm1lc3NhZ2UgaWRlbnRpZmllciBhbHJlYWR5IHJlYWQiLAorICAgICAgICAgICAgKQorICAgICAgICB9KQorICAgIH0KKworICAgIGZuIHJlYWRfbWVzc2FnZV9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLnJlYWRfbWVzc2FnZV9lbmQoKQorICAgIH0KKworICAgIGZuIHJlYWRfc3RydWN0X2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8T3B0aW9uPFRTdHJ1Y3RJZGVudGlmaWVyPj4geworICAgICAgICBzZWxmLmlubmVyLnJlYWRfc3RydWN0X2JlZ2luKCkKKyAgICB9CisKKyAgICBmbiByZWFkX3N0cnVjdF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLnJlYWRfc3RydWN0X2VuZCgpCisgICAgfQorCisgICAgZm4gcmVhZF9maWVsZF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRGaWVsZElkZW50aWZpZXI+IHsKKyAgICAgICAgc2VsZi5pbm5lci5yZWFkX2ZpZWxkX2JlZ2luKCkKKyAgICB9CisKKyAgICBmbiByZWFkX2ZpZWxkX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIucmVhZF9maWVsZF9lbmQoKQorICAgIH0KKworICAgIGZuIHJlYWRfYnl0ZXMoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxWZWM8dTg+PiB7CisgICAgICAgIHNlbGYuaW5uZXIucmVhZF9ieXRlcygpCisgICAgfQorCisgICAgZm4gcmVhZF9ib29sKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8Ym9vbD4geworICAgICAgICBzZWxmLmlubmVyLnJlYWRfYm9vbCgpCisgICAgfQorCisgICAgZm4gcmVhZF9pOCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGk4PiB7CisgICAgICAgIHNlbGYuaW5uZXIucmVhZF9pOCgpCisgICAgfQorCisgICAgZm4gcmVhZF9pMTYoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxpMTY+IHsKKyAgICAgICAgc2VsZi5pbm5lci5yZWFkX2kxNigpCisgICAgfQorCisgICAgZm4gcmVhZF9pMzIoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxpMzI+IHsKKyAgICAgICAgc2VsZi5pbm5lci5yZWFkX2kzMigpCisgICAgfQorCisgICAgZm4gcmVhZF9pNjQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxpNjQ+IHsKKyAgICAgICAgc2VsZi5pbm5lci5yZWFkX2k2NCgpCisgICAgfQorCisgICAgZm4gcmVhZF9kb3VibGUoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxmNjQ+IHsKKyAgICAgICAgc2VsZi5pbm5lci5yZWFkX2RvdWJsZSgpCisgICAgfQorCisgICAgZm4gcmVhZF9zdHJpbmcoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxTdHJpbmc+IHsKKyAgICAgICAgc2VsZi5pbm5lci5yZWFkX3N0cmluZygpCisgICAgfQorCisgICAgZm4gcmVhZF9saXN0X2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VExpc3RJZGVudGlmaWVyPiB7CisgICAgICAgIHNlbGYuaW5uZXIucmVhZF9saXN0X2JlZ2luKCkKKyAgICB9CisKKyAgICBmbiByZWFkX2xpc3RfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci5yZWFkX2xpc3RfZW5kKCkKKyAgICB9CisKKyAgICBmbiByZWFkX3NldF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRTZXRJZGVudGlmaWVyPiB7CisgICAgICAgIHNlbGYuaW5uZXIucmVhZF9zZXRfYmVnaW4oKQorICAgIH0KKworICAgIGZuIHJlYWRfc2V0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIucmVhZF9zZXRfZW5kKCkKKyAgICB9CisKKyAgICBmbiByZWFkX21hcF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRNYXBJZGVudGlmaWVyPiB7CisgICAgICAgIHNlbGYuaW5uZXIucmVhZF9tYXBfYmVnaW4oKQorICAgIH0KKworICAgIGZuIHJlYWRfbWFwX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIucmVhZF9tYXBfZW5kKCkKKyAgICB9CisKKyAgICAvLyB1dGlsaXR5CisgICAgLy8KKworICAgIGZuIHJlYWRfYnl0ZSgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PHU4PiB7CisgICAgICAgIHNlbGYuaW5uZXIucmVhZF9ieXRlKCkKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcnMvc3JjL3NlcnZlci9tb2QucnMgYi9saWIvcnMvc3JjL3NlcnZlci9tb2QucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBiMzgxYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy9zcmMvc2VydmVyL21vZC5ycwpAQCAtMCwwICsxLDEyNCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyEgVHlwZXMgdXNlZCB0byBpbXBsZW1lbnQgYSBUaHJpZnQgc2VydmVyLgorCit1c2UgcHJvdG9jb2w6OntUSW5wdXRQcm90b2NvbCwgVE1lc3NhZ2VJZGVudGlmaWVyLCBUTWVzc2FnZVR5cGUsIFRPdXRwdXRQcm90b2NvbH07Cit1c2Uge0FwcGxpY2F0aW9uRXJyb3IsIEFwcGxpY2F0aW9uRXJyb3JLaW5kfTsKKworbW9kIG11bHRpcGxleGVkOworbW9kIHRocmVhZGVkOworCitwdWIgdXNlIHNlbGY6Om11bHRpcGxleGVkOjpUTXVsdGlwbGV4ZWRQcm9jZXNzb3I7CitwdWIgdXNlIHNlbGY6OnRocmVhZGVkOjpUU2VydmVyOworCisvLy8gSGFuZGxlcyBpbmNvbWluZyBUaHJpZnQgbWVzc2FnZXMgYW5kIGRpc3BhdGNoZXMgdGhlbSB0byB0aGUgdXNlci1kZWZpbmVkCisvLy8gaGFuZGxlciBmdW5jdGlvbnMuCisvLy8KKy8vLyBBbiBpbXBsZW1lbnRhdGlvbiBpcyBhdXRvLWdlbmVyYXRlZCBmb3IgZWFjaCBUaHJpZnQgc2VydmljZS4gV2hlbiB1c2VkIGJ5IGEKKy8vLyBzZXJ2ZXIgKGZvciBleGFtcGxlLCBhIGBUU2ltcGxlU2VydmVyYCksIGl0IHdpbGwgZGVtdXggaW5jb21pbmcgc2VydmljZQorLy8vIGNhbGxzIGFuZCBpbnZva2UgdGhlIGNvcnJlc3BvbmRpbmcgdXNlci1kZWZpbmVkIGhhbmRsZXIgZnVuY3Rpb24uCisvLy8KKy8vLyAjIEV4YW1wbGVzCisvLy8KKy8vLyBDcmVhdGUgYW5kIHN0YXJ0IGEgc2VydmVyIHVzaW5nIHRoZSBhdXRvLWdlbmVyYXRlZCBgVFByb2Nlc3NvcmAgZm9yCisvLy8gYSBUaHJpZnQgc2VydmljZSBgU2ltcGxlU2VydmljZWAuCisvLy8KKy8vLyBgYGBub19ydW4KKy8vLyB1c2UgdGhyaWZ0OworLy8vIHVzZSB0aHJpZnQ6OnByb3RvY29sOjp7VElucHV0UHJvdG9jb2wsIFRPdXRwdXRQcm90b2NvbH07CisvLy8gdXNlIHRocmlmdDo6c2VydmVyOjpUUHJvY2Vzc29yOworLy8vCisvLy8gLy8KKy8vLyAvLyBhdXRvLWdlbmVyYXRlZAorLy8vIC8vCisvLy8KKy8vLyAvLyBwcm9jZXNzb3IgZm9yIGBTaW1wbGVTZXJ2aWNlYAorLy8vIHN0cnVjdCBTaW1wbGVTZXJ2aWNlU3luY1Byb2Nlc3NvcjsKKy8vLyBpbXBsIFNpbXBsZVNlcnZpY2VTeW5jUHJvY2Vzc29yIHsKKy8vLyAgICAgZm4gbmV3PEg6IFNpbXBsZVNlcnZpY2VTeW5jSGFuZGxlcj4ocHJvY2Vzc29yOiBIKSAtPiBTaW1wbGVTZXJ2aWNlU3luY1Byb2Nlc3NvciB7CisvLy8gICAgICAgICB1bmltcGxlbWVudGVkISgpOworLy8vICAgICB9CisvLy8gfQorLy8vCisvLy8gLy8gYFRQcm9jZXNzb3JgIGltcGxlbWVudGF0aW9uIGZvciBgU2ltcGxlU2VydmljZWAKKy8vLyBpbXBsIFRQcm9jZXNzb3IgZm9yIFNpbXBsZVNlcnZpY2VTeW5jUHJvY2Vzc29yIHsKKy8vLyAgICAgZm4gcHJvY2Vzcygmc2VsZiwgaTogJm11dCBUSW5wdXRQcm90b2NvbCwgbzogJm11dCBUT3V0cHV0UHJvdG9jb2wpIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7CisvLy8gICAgICAgICB1bmltcGxlbWVudGVkISgpOworLy8vICAgICB9CisvLy8gfQorLy8vCisvLy8gLy8gc2VydmljZSBmdW5jdGlvbnMgZm9yIFNpbXBsZVNlcnZpY2UKKy8vLyB0cmFpdCBTaW1wbGVTZXJ2aWNlU3luY0hhbmRsZXIgeworLy8vICAgICBmbiBzZXJ2aWNlX2NhbGwoJnNlbGYpIC0+IHRocmlmdDo6UmVzdWx0PCgpPjsKKy8vLyB9CisvLy8KKy8vLyAvLworLy8vIC8vIHVzZXItY29kZSBmb2xsb3dzCisvLy8gLy8KKy8vLworLy8vIC8vIGRlZmluZSBhIGhhbmRsZXIgdGhhdCB3aWxsIGJlIGludm9rZWQgd2hlbiBgc2VydmljZV9jYWxsYCBpcyByZWNlaXZlZAorLy8vIHN0cnVjdCBTaW1wbGVTZXJ2aWNlSGFuZGxlckltcGw7CisvLy8gaW1wbCBTaW1wbGVTZXJ2aWNlU3luY0hhbmRsZXIgZm9yIFNpbXBsZVNlcnZpY2VIYW5kbGVySW1wbCB7CisvLy8gICAgIGZuIHNlcnZpY2VfY2FsbCgmc2VsZikgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsKKy8vLyAgICAgICAgIHVuaW1wbGVtZW50ZWQhKCk7CisvLy8gICAgIH0KKy8vLyB9CisvLy8KKy8vLyAvLyBpbnN0YW50aWF0ZSB0aGUgcHJvY2Vzc29yCisvLy8gbGV0IHByb2Nlc3NvciA9IFNpbXBsZVNlcnZpY2VTeW5jUHJvY2Vzc29yOjpuZXcoU2ltcGxlU2VydmljZUhhbmRsZXJJbXBsIHt9KTsKKy8vLworLy8vIC8vIGF0IHRoaXMgcG9pbnQgeW91IGNhbiBwYXNzIHRoZSBwcm9jZXNzb3IgdG8gdGhlIHNlcnZlcgorLy8vIC8vIGxldCBzZXJ2ZXIgPSBUU2VydmVyOjpuZXcoLi4uLCBwcm9jZXNzb3IpOworLy8vIGBgYAorcHViIHRyYWl0IFRQcm9jZXNzb3IgeworICAgIC8vLyBQcm9jZXNzIGEgVGhyaWZ0IHNlcnZpY2UgY2FsbC4KKyAgICAvLy8KKyAgICAvLy8gUmVhZHMgYXJndW1lbnRzIGZyb20gYGlgLCBleGVjdXRlcyB0aGUgdXNlcidzIGhhbmRsZXIgY29kZSwgYW5kIHdyaXRlcworICAgIC8vLyB0aGUgcmVzcG9uc2UgdG8gYG9gLgorICAgIC8vLworICAgIC8vLyBSZXR1cm5zIGAoKWAgaWYgdGhlIGhhbmRsZXIgd2FzIGV4ZWN1dGVkOyBgRXJyYCBvdGhlcndpc2UuCisgICAgZm4gcHJvY2Vzcygmc2VsZiwgaTogJm11dCBUSW5wdXRQcm90b2NvbCwgbzogJm11dCBUT3V0cHV0UHJvdG9jb2wpIC0+IDo6UmVzdWx0PCgpPjsKK30KKworLy8vIENvbnZlbmllbmNlIGZ1bmN0aW9uIHVzZWQgaW4gZ2VuZXJhdGVkIGBUUHJvY2Vzc29yYCBpbXBsZW1lbnRhdGlvbnMgdG8KKy8vLyByZXR1cm4gYW4gYEFwcGxpY2F0aW9uRXJyb3JgIGlmIHRocmlmdCBtZXNzYWdlIHByb2Nlc3NpbmcgZmFpbGVkLgorcHViIGZuIGhhbmRsZV9wcm9jZXNzX3Jlc3VsdCgKKyAgICBtc2dfaWRlbnQ6ICZUTWVzc2FnZUlkZW50aWZpZXIsCisgICAgcmVzOiA6OlJlc3VsdDwoKT4sCisgICAgb19wcm90OiAmbXV0IFRPdXRwdXRQcm90b2NvbCwKKykgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICBpZiBsZXQgRXJyKGUpID0gcmVzIHsKKyAgICAgICAgbGV0IGUgPSBtYXRjaCBlIHsKKyAgICAgICAgICAgIDo6RXJyb3I6OkFwcGxpY2F0aW9uKGEpID0+IGEsCisgICAgICAgICAgICBfID0+IEFwcGxpY2F0aW9uRXJyb3I6Om5ldyhBcHBsaWNhdGlvbkVycm9yS2luZDo6VW5rbm93biwgZm9ybWF0ISgiezo/fSIsIGUpKSwKKyAgICAgICAgfTsKKworICAgICAgICBsZXQgaWRlbnQgPSBUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygKKyAgICAgICAgICAgIG1zZ19pZGVudC5uYW1lLmNsb25lKCksCisgICAgICAgICAgICBUTWVzc2FnZVR5cGU6OkV4Y2VwdGlvbiwKKyAgICAgICAgICAgIG1zZ19pZGVudC5zZXF1ZW5jZV9udW1iZXIsCisgICAgICAgICk7CisKKyAgICAgICAgb19wcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oJmlkZW50KT87CisgICAgICAgIDo6RXJyb3I6OndyaXRlX2FwcGxpY2F0aW9uX2Vycm9yX3RvX291dF9wcm90b2NvbCgmZSwgb19wcm90KT87CisgICAgICAgIG9fcHJvdC53cml0ZV9tZXNzYWdlX2VuZCgpPzsKKyAgICAgICAgb19wcm90LmZsdXNoKCkKKyAgICB9IGVsc2UgeworICAgICAgICBPaygoKSkKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcnMvc3JjL3NlcnZlci9tdWx0aXBsZXhlZC5ycyBiL2xpYi9ycy9zcmMvc2VydmVyL211bHRpcGxleGVkLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MzM3OTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvc3JjL3NlcnZlci9tdWx0aXBsZXhlZC5ycwpAQCAtMCwwICsxLDM1MSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2Ugc3RkOjpjb2xsZWN0aW9uczo6SGFzaE1hcDsKK3VzZSBzdGQ6OmNvbnZlcnQ6OkludG87Cit1c2Ugc3RkOjpmbXQ7Cit1c2Ugc3RkOjpmbXQ6OntEZWJ1ZywgRm9ybWF0dGVyfTsKK3VzZSBzdGQ6OnN5bmM6OntBcmMsIE11dGV4fTsKKwordXNlIHByb3RvY29sOjp7VElucHV0UHJvdG9jb2wsIFRNZXNzYWdlSWRlbnRpZmllciwgVE91dHB1dFByb3RvY29sLCBUU3RvcmVkSW5wdXRQcm90b2NvbH07CisKK3VzZSBzdXBlcjo6e2hhbmRsZV9wcm9jZXNzX3Jlc3VsdCwgVFByb2Nlc3Nvcn07CisKK2NvbnN0IE1JU1NJTkdfU0VQQVJBVE9SX0FORF9OT19ERUZBVUxUOiAmJ3N0YXRpYyBzdHIgPQorICAgICJtaXNzaW5nIHNlcnZpY2Ugc2VwYXJhdG9yIGFuZCBubyBkZWZhdWx0IHByb2Nlc3NvciBzZXQiOwordHlwZSBUaHJlYWRTYWZlUHJvY2Vzc29yID0gQm94PFRQcm9jZXNzb3IgKyBTZW5kICsgU3luYz47CisKKy8vLyBBIGBUUHJvY2Vzc29yYCB0aGF0IGNhbiBkZW11eCBzZXJ2aWNlIGNhbGxzIHRvIG11bHRpcGxlIHVuZGVybHlpbmcKKy8vLyBUaHJpZnQgc2VydmljZXMuCisvLy8KKy8vLyBVc2VycyByZWdpc3RlciBzZXJ2aWNlLXNwZWNpZmljIGBUUHJvY2Vzc29yYCBpbnN0YW5jZXMgd2l0aCBhCisvLy8gYFRNdWx0aXBsZXhlZFByb2Nlc3NvcmAsIGFuZCB0aGVuIHJlZ2lzdGVyIHRoYXQgcHJvY2Vzc29yIHdpdGggYSBzZXJ2ZXIKKy8vLyBpbXBsZW1lbnRhdGlvbi4gRm9sbG93aW5nIHRoYXQsIGFsbCBpbmNvbWluZyBzZXJ2aWNlIGNhbGxzIGFyZSBhdXRvbWF0aWNhbGx5CisvLy8gcm91dGVkIHRvIHRoZSBzZXJ2aWNlLXNwZWNpZmljIGBUUHJvY2Vzc29yYC4KKy8vLworLy8vIEEgYFRNdWx0aXBsZXhlZFByb2Nlc3NvcmAgY2FuIG9ubHkgaGFuZGxlIG1lc3NhZ2VzIHNlbnQgYnkgYQorLy8vIGBUTXVsdGlwbGV4ZWRPdXRwdXRQcm90b2NvbGAuCisjW2Rlcml2ZShEZWZhdWx0KV0KK3B1YiBzdHJ1Y3QgVE11bHRpcGxleGVkUHJvY2Vzc29yIHsKKyAgICBzdG9yZWQ6IE11dGV4PFN0b3JlZFByb2Nlc3NvcnM+LAorfQorCisjW2Rlcml2ZShEZWZhdWx0KV0KK3N0cnVjdCBTdG9yZWRQcm9jZXNzb3JzIHsKKyAgICBwcm9jZXNzb3JzOiBIYXNoTWFwPFN0cmluZywgQXJjPFRocmVhZFNhZmVQcm9jZXNzb3I+PiwKKyAgICBkZWZhdWx0X3Byb2Nlc3NvcjogT3B0aW9uPEFyYzxUaHJlYWRTYWZlUHJvY2Vzc29yPj4sCit9CisKK2ltcGwgVE11bHRpcGxleGVkUHJvY2Vzc29yIHsKKyAgICAvLy8gQ3JlYXRlIGEgbmV3IGBUTXVsdGlwbGV4ZWRQcm9jZXNzb3JgIHdpdGggbm8gcmVnaXN0ZXJlZCBzZXJ2aWNlLXNwZWNpZmljCisgICAgLy8vIHByb2Nlc3NvcnMuCisgICAgcHViIGZuIG5ldygpIC0+IFRNdWx0aXBsZXhlZFByb2Nlc3NvciB7CisgICAgICAgIFRNdWx0aXBsZXhlZFByb2Nlc3NvciB7CisgICAgICAgICAgICBzdG9yZWQ6IE11dGV4OjpuZXcoU3RvcmVkUHJvY2Vzc29ycyB7CisgICAgICAgICAgICAgICAgcHJvY2Vzc29yczogSGFzaE1hcDo6bmV3KCksCisgICAgICAgICAgICAgICAgZGVmYXVsdF9wcm9jZXNzb3I6IE5vbmUsCisgICAgICAgICAgICB9KSwKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLyBSZWdpc3RlciBhIHNlcnZpY2Utc3BlY2lmaWMgYHByb2Nlc3NvcmAgZm9yIHRoZSBzZXJ2aWNlIG5hbWVkCisgICAgLy8vIGBzZXJ2aWNlX25hbWVgLiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGFsc28gYmFja3dhcmRzLWNvbXBhdGlibGUgd2l0aAorICAgIC8vLyBub24tbXVsdGlwbGV4ZWQgY2xpZW50cy4gU2V0IGBhc19kZWZhdWx0YCB0byBgdHJ1ZWAgdG8gYWxsb3cKKyAgICAvLy8gbm9uLW5hbWVzcGFjZWQgcmVxdWVzdHMgdG8gYmUgZGlzcGF0Y2hlZCB0byBhIGRlZmF1bHQgcHJvY2Vzc29yLgorICAgIC8vLworICAgIC8vLyBSZXR1cm5zIHN1Y2Nlc3MgaWYgYSBuZXcgZW50cnkgd2FzIGluc2VydGVkLiBSZXR1cm5zIGFuIGVycm9yIGlmOgorICAgIC8vLyAqIEEgcHJvY2Vzc29yIGV4aXN0cyBmb3IgYHNlcnZpY2VfbmFtZWAKKyAgICAvLy8gKiBZb3UgYXR0ZW1wdCB0byByZWdpc3RlciBhIHByb2Nlc3NvciBhcyBkZWZhdWx0LCBhbmQgYW4gZXhpc3RpbmcgZGVmYXVsdCBleGlzdHMKKyAgICAjW2NmZ19hdHRyKGZlYXR1cmUgPSAiY2FyZ28tY2xpcHB5IiwgYWxsb3cobWFwX2VudHJ5KSldCisgICAgcHViIGZuIHJlZ2lzdGVyPFM6IEludG88U3RyaW5nPj4oCisgICAgICAgICZtdXQgc2VsZiwKKyAgICAgICAgc2VydmljZV9uYW1lOiBTLAorICAgICAgICBwcm9jZXNzb3I6IEJveDxUUHJvY2Vzc29yICsgU2VuZCArIFN5bmM+LAorICAgICAgICBhc19kZWZhdWx0OiBib29sLAorICAgICkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgbGV0IG11dCBzdG9yZWQgPSBzZWxmLnN0b3JlZC5sb2NrKCkudW53cmFwKCk7CisKKyAgICAgICAgbGV0IG5hbWUgPSBzZXJ2aWNlX25hbWUuaW50bygpOworICAgICAgICBpZiAhc3RvcmVkLnByb2Nlc3NvcnMuY29udGFpbnNfa2V5KCZuYW1lKSB7CisgICAgICAgICAgICBsZXQgcHJvY2Vzc29yID0gQXJjOjpuZXcocHJvY2Vzc29yKTsKKworICAgICAgICAgICAgaWYgYXNfZGVmYXVsdCB7CisgICAgICAgICAgICAgICAgaWYgc3RvcmVkLmRlZmF1bHRfcHJvY2Vzc29yLmlzX25vbmUoKSB7CisgICAgICAgICAgICAgICAgICAgIHN0b3JlZC5wcm9jZXNzb3JzLmluc2VydChuYW1lLCBwcm9jZXNzb3IuY2xvbmUoKSk7CisgICAgICAgICAgICAgICAgICAgIHN0b3JlZC5kZWZhdWx0X3Byb2Nlc3NvciA9IFNvbWUocHJvY2Vzc29yLmNsb25lKCkpOworICAgICAgICAgICAgICAgICAgICBPaygoKSkKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBFcnIoImNhbm5vdCByZXNldCBkZWZhdWx0IHByb2Nlc3NvciIuaW50bygpKQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3RvcmVkLnByb2Nlc3NvcnMuaW5zZXJ0KG5hbWUsIHByb2Nlc3Nvcik7CisgICAgICAgICAgICAgICAgT2soKCkpCisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBFcnIoZm9ybWF0ISgiY2Fubm90IG92ZXJ3cml0ZSBleGlzdGluZyBwcm9jZXNzb3IgZm9yIHNlcnZpY2Uge30iLCBuYW1lKS5pbnRvKCkpCisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbiBwcm9jZXNzX21lc3NhZ2UoCisgICAgICAgICZzZWxmLAorICAgICAgICBtc2dfaWRlbnQ6ICZUTWVzc2FnZUlkZW50aWZpZXIsCisgICAgICAgIGlfcHJvdDogJm11dCBUSW5wdXRQcm90b2NvbCwKKyAgICAgICAgb19wcm90OiAmbXV0IFRPdXRwdXRQcm90b2NvbCwKKyAgICApIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIGxldCAoc3ZjX25hbWUsIHN2Y19jYWxsKSA9IHNwbGl0X2lkZW50X25hbWUoJm1zZ19pZGVudC5uYW1lKTsKKyAgICAgICAgZGVidWchKCJyb3V0aW5nIHN2Y19uYW1lIHs6P30gc3ZjX2NhbGwge30iLCAmc3ZjX25hbWUsICZzdmNfY2FsbCk7CisKKyAgICAgICAgbGV0IHByb2Nlc3NvcjogT3B0aW9uPEFyYzxUaHJlYWRTYWZlUHJvY2Vzc29yPj4gPSB7CisgICAgICAgICAgICBsZXQgc3RvcmVkID0gc2VsZi5zdG9yZWQubG9jaygpLnVud3JhcCgpOworICAgICAgICAgICAgaWYgbGV0IFNvbWUobmFtZSkgPSBzdmNfbmFtZSB7CisgICAgICAgICAgICAgICAgc3RvcmVkLnByb2Nlc3NvcnMuZ2V0KG5hbWUpLmNsb25lZCgpCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0b3JlZC5kZWZhdWx0X3Byb2Nlc3Nvci5jbG9uZSgpCisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgbWF0Y2ggcHJvY2Vzc29yIHsKKyAgICAgICAgICAgIFNvbWUoYXJjKSA9PiB7CisgICAgICAgICAgICAgICAgbGV0IG5ld19tc2dfaWRlbnQgPSBUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygKKyAgICAgICAgICAgICAgICAgICAgc3ZjX2NhbGwsCisgICAgICAgICAgICAgICAgICAgIG1zZ19pZGVudC5tZXNzYWdlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgIG1zZ19pZGVudC5zZXF1ZW5jZV9udW1iZXIsCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICBsZXQgbXV0IHByb3h5X2lfcHJvdCA9IFRTdG9yZWRJbnB1dFByb3RvY29sOjpuZXcoaV9wcm90LCBuZXdfbXNnX2lkZW50KTsKKyAgICAgICAgICAgICAgICAoKmFyYykucHJvY2VzcygmbXV0IHByb3h5X2lfcHJvdCwgb19wcm90KQorICAgICAgICAgICAgfQorICAgICAgICAgICAgTm9uZSA9PiBFcnIobWlzc2luZ19wcm9jZXNzb3JfbWVzc2FnZShzdmNfbmFtZSkuaW50bygpKSwKKyAgICAgICAgfQorICAgIH0KK30KKworaW1wbCBUUHJvY2Vzc29yIGZvciBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgeworICAgIGZuIHByb2Nlc3MoJnNlbGYsIGlfcHJvdDogJm11dCBUSW5wdXRQcm90b2NvbCwgb19wcm90OiAmbXV0IFRPdXRwdXRQcm90b2NvbCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgbGV0IG1zZ19pZGVudCA9IGlfcHJvdC5yZWFkX21lc3NhZ2VfYmVnaW4oKT87CisKKyAgICAgICAgZGVidWchKCJwcm9jZXNzIGluY29taW5nIG1zZyBpZDp7Oj99IiwgJm1zZ19pZGVudCk7CisgICAgICAgIGxldCByZXMgPSBzZWxmLnByb2Nlc3NfbWVzc2FnZSgmbXNnX2lkZW50LCBpX3Byb3QsIG9fcHJvdCk7CisKKyAgICAgICAgaGFuZGxlX3Byb2Nlc3NfcmVzdWx0KCZtc2dfaWRlbnQsIHJlcywgb19wcm90KQorICAgIH0KK30KKworaW1wbCBEZWJ1ZyBmb3IgVE11bHRpcGxleGVkUHJvY2Vzc29yIHsKKyAgICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgRm9ybWF0dGVyKSAtPiBmbXQ6OlJlc3VsdCB7CisgICAgICAgIGxldCBzdG9yZWQgPSBzZWxmLnN0b3JlZC5sb2NrKCkudW53cmFwKCk7CisgICAgICAgIHdyaXRlISgKKyAgICAgICAgICAgIGYsCisgICAgICAgICAgICAiVE11bHRpcGxleGVkUHJvY2VzcyB7eyByZWdpc3RlcmVkX2NvdW50OiB7Oj99IGRlZmF1bHQ6IHs6P30gfX0iLAorICAgICAgICAgICAgc3RvcmVkLnByb2Nlc3NvcnMua2V5cygpLmxlbigpLAorICAgICAgICAgICAgc3RvcmVkLmRlZmF1bHRfcHJvY2Vzc29yLmlzX3NvbWUoKQorICAgICAgICApCisgICAgfQorfQorCitmbiBzcGxpdF9pZGVudF9uYW1lKGlkZW50X25hbWU6ICZzdHIpIC0+IChPcHRpb248JnN0cj4sICZzdHIpIHsKKyAgICBpZGVudF9uYW1lCisgICAgICAgIC5maW5kKCc6JykKKyAgICAgICAgLm1hcCh8cG9zfCB7CisgICAgICAgICAgICBsZXQgKHN2Y19uYW1lLCBzdmNfY2FsbCkgPSBpZGVudF9uYW1lLnNwbGl0X2F0KHBvcyk7CisgICAgICAgICAgICBsZXQgKF8sIHN2Y19jYWxsKSA9IHN2Y19jYWxsLnNwbGl0X2F0KDEpOyAvLyByZW1vdmUgY29sb24gZnJvbSBzZXJ2aWNlIGNhbGwgbmFtZQorICAgICAgICAgICAgKFNvbWUoc3ZjX25hbWUpLCBzdmNfY2FsbCkKKyAgICAgICAgfSkKKyAgICAgICAgLm9yX2Vsc2UofHwgU29tZSgoTm9uZSwgaWRlbnRfbmFtZSkpKQorICAgICAgICAudW53cmFwKCkKK30KKworZm4gbWlzc2luZ19wcm9jZXNzb3JfbWVzc2FnZShzdmNfbmFtZTogT3B0aW9uPCZzdHI+KSAtPiBTdHJpbmcgeworICAgIG1hdGNoIHN2Y19uYW1lIHsKKyAgICAgICAgU29tZShuYW1lKSA9PiBmb3JtYXQhKCJubyBwcm9jZXNzb3IgZm91bmQgZm9yIHNlcnZpY2Uge30iLCBuYW1lKSwKKyAgICAgICAgTm9uZSA9PiBNSVNTSU5HX1NFUEFSQVRPUl9BTkRfTk9fREVGQVVMVC50b19vd25lZCgpLAorICAgIH0KK30KKworI1tjZmcodGVzdCldCittb2QgdGVzdHMgeworICAgIHVzZSBzdGQ6OmNvbnZlcnQ6OkludG87CisgICAgdXNlIHN0ZDo6c3luYzo6YXRvbWljOjp7QXRvbWljQm9vbCwgT3JkZXJpbmd9OworICAgIHVzZSBzdGQ6OnN5bmM6OkFyYzsKKworICAgIHVzZSBwcm90b2NvbDo6e1RCaW5hcnlJbnB1dFByb3RvY29sLCBUQmluYXJ5T3V0cHV0UHJvdG9jb2wsIFRNZXNzYWdlSWRlbnRpZmllciwgVE1lc3NhZ2VUeXBlfTsKKyAgICB1c2UgdHJhbnNwb3J0Ojp7UmVhZEhhbGYsIFRCdWZmZXJDaGFubmVsLCBUSW9DaGFubmVsLCBXcml0ZUhhbGZ9OworICAgIHVzZSB7QXBwbGljYXRpb25FcnJvciwgQXBwbGljYXRpb25FcnJvcktpbmR9OworCisgICAgdXNlIHN1cGVyOjoqOworCisgICAgI1t0ZXN0XQorICAgIGZuIHNob3VsZF9zcGxpdF9uYW1lX2ludG9fcHJvcGVyX3NlcGFyYXRvcl9hbmRfc2VydmljZV9jYWxsKCkgeworICAgICAgICBsZXQgaWRlbnRfbmFtZSA9ICJmb286YmFyX2NhbGwiOworICAgICAgICBsZXQgKHNlcnYsIGNhbGwpID0gc3BsaXRfaWRlbnRfbmFtZSgmaWRlbnRfbmFtZSk7CisgICAgICAgIGFzc2VydF9lcSEoc2VydiwgU29tZSgiZm9vIikpOworICAgICAgICBhc3NlcnRfZXEhKGNhbGwsICJiYXJfY2FsbCIpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBzaG91bGRfcmV0dXJuX2Z1bGxfaWRlbnRfaWZfbm9fc2VwYXJhdG9yX2V4aXN0cygpIHsKKyAgICAgICAgbGV0IGlkZW50X25hbWUgPSAiYmFyX2NhbGwiOworICAgICAgICBsZXQgKHNlcnYsIGNhbGwpID0gc3BsaXRfaWRlbnRfbmFtZSgmaWRlbnRfbmFtZSk7CisgICAgICAgIGFzc2VydF9lcSEoc2VydiwgTm9uZSk7CisgICAgICAgIGFzc2VydF9lcSEoY2FsbCwgImJhcl9jYWxsIik7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHNob3VsZF93cml0ZV9lcnJvcl9pZl9ub19zZXBhcmF0b3JfZm91bmRfYW5kX25vX2RlZmF1bHRfcHJvY2Vzc29yX2V4aXN0cygpIHsKKyAgICAgICAgbGV0IChtdXQgaSwgbXV0IG8pID0gYnVpbGRfb2JqZWN0cygpOworCisgICAgICAgIGxldCBzZW50X2lkZW50ID0gVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRNZXNzYWdlVHlwZTo6Q2FsbCwgMTApOworICAgICAgICBvLndyaXRlX21lc3NhZ2VfYmVnaW4oJnNlbnRfaWRlbnQpLnVud3JhcCgpOworICAgICAgICBvLmZsdXNoKCkudW53cmFwKCk7CisgICAgICAgIG8udHJhbnNwb3J0LmNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyKCk7CisgICAgICAgIG8udHJhbnNwb3J0LmVtcHR5X3dyaXRlX2J1ZmZlcigpOworCisgICAgICAgIGxldCBwID0gVE11bHRpcGxleGVkUHJvY2Vzc29yOjpuZXcoKTsKKyAgICAgICAgcC5wcm9jZXNzKCZtdXQgaSwgJm11dCBvKS51bndyYXAoKTsgLy8gYXQgdGhpcyBwb2ludCBhbiBlcnJvciBzaG91bGQgYmUgd3JpdHRlbiBvdXQKKworICAgICAgICBpLnRyYW5zcG9ydC5zZXRfcmVhZGFibGVfYnl0ZXMoJm8udHJhbnNwb3J0LndyaXRlX2J5dGVzKCkpOworICAgICAgICBsZXQgcmN2ZF9pZGVudCA9IGkucmVhZF9tZXNzYWdlX2JlZ2luKCkudW53cmFwKCk7CisgICAgICAgIGxldCBleHBlY3RlZF9pZGVudCA9IFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUTWVzc2FnZVR5cGU6OkV4Y2VwdGlvbiwgMTApOworICAgICAgICBhc3NlcnRfZXEhKHJjdmRfaWRlbnQsIGV4cGVjdGVkX2lkZW50KTsKKyAgICAgICAgbGV0IHJjdmRfZXJyID0gOjpFcnJvcjo6cmVhZF9hcHBsaWNhdGlvbl9lcnJvcl9mcm9tX2luX3Byb3RvY29sKCZtdXQgaSkudW53cmFwKCk7CisgICAgICAgIGxldCBleHBlY3RlZF9lcnIgPSBBcHBsaWNhdGlvbkVycm9yOjpuZXcoCisgICAgICAgICAgICBBcHBsaWNhdGlvbkVycm9yS2luZDo6VW5rbm93biwKKyAgICAgICAgICAgIE1JU1NJTkdfU0VQQVJBVE9SX0FORF9OT19ERUZBVUxULAorICAgICAgICApOworICAgICAgICBhc3NlcnRfZXEhKHJjdmRfZXJyLCBleHBlY3RlZF9lcnIpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBzaG91bGRfd3JpdGVfZXJyb3JfaWZfc2VwYXJhdG9yX2V4aXN0c19hbmRfbm9fcHJvY2Vzc29yX2ZvdW5kKCkgeworICAgICAgICBsZXQgKG11dCBpLCBtdXQgbykgPSBidWlsZF9vYmplY3RzKCk7CisKKyAgICAgICAgbGV0IHNlbnRfaWRlbnQgPSBUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygibWlzc2luZzpjYWxsIiwgVE1lc3NhZ2VUeXBlOjpDYWxsLCAxMCk7CisgICAgICAgIG8ud3JpdGVfbWVzc2FnZV9iZWdpbigmc2VudF9pZGVudCkudW53cmFwKCk7CisgICAgICAgIG8uZmx1c2goKS51bndyYXAoKTsKKyAgICAgICAgby50cmFuc3BvcnQuY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIoKTsKKyAgICAgICAgby50cmFuc3BvcnQuZW1wdHlfd3JpdGVfYnVmZmVyKCk7CisKKyAgICAgICAgbGV0IHAgPSBUTXVsdGlwbGV4ZWRQcm9jZXNzb3I6Om5ldygpOworICAgICAgICBwLnByb2Nlc3MoJm11dCBpLCAmbXV0IG8pLnVud3JhcCgpOyAvLyBhdCB0aGlzIHBvaW50IGFuIGVycm9yIHNob3VsZCBiZSB3cml0dGVuIG91dAorCisgICAgICAgIGkudHJhbnNwb3J0LnNldF9yZWFkYWJsZV9ieXRlcygmby50cmFuc3BvcnQud3JpdGVfYnl0ZXMoKSk7CisgICAgICAgIGxldCByY3ZkX2lkZW50ID0gaS5yZWFkX21lc3NhZ2VfYmVnaW4oKS51bndyYXAoKTsKKyAgICAgICAgbGV0IGV4cGVjdGVkX2lkZW50ID0gVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoIm1pc3Npbmc6Y2FsbCIsIFRNZXNzYWdlVHlwZTo6RXhjZXB0aW9uLCAxMCk7CisgICAgICAgIGFzc2VydF9lcSEocmN2ZF9pZGVudCwgZXhwZWN0ZWRfaWRlbnQpOworICAgICAgICBsZXQgcmN2ZF9lcnIgPSA6OkVycm9yOjpyZWFkX2FwcGxpY2F0aW9uX2Vycm9yX2Zyb21faW5fcHJvdG9jb2woJm11dCBpKS51bndyYXAoKTsKKyAgICAgICAgbGV0IGV4cGVjdGVkX2VyciA9IEFwcGxpY2F0aW9uRXJyb3I6Om5ldygKKyAgICAgICAgICAgIEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpVbmtub3duLAorICAgICAgICAgICAgbWlzc2luZ19wcm9jZXNzb3JfbWVzc2FnZShTb21lKCJtaXNzaW5nIikpLAorICAgICAgICApOworICAgICAgICBhc3NlcnRfZXEhKHJjdmRfZXJyLCBleHBlY3RlZF9lcnIpOworICAgIH0KKworICAgICNbZGVyaXZlKERlZmF1bHQpXQorICAgIHN0cnVjdCBTZXJ2aWNlIHsKKyAgICAgICAgcHViIGludm9rZWQ6IEFyYzxBdG9taWNCb29sPiwKKyAgICB9CisKKyAgICBpbXBsIFRQcm9jZXNzb3IgZm9yIFNlcnZpY2UgeworICAgICAgICBmbiBwcm9jZXNzKCZzZWxmLCBfOiAmbXV0IFRJbnB1dFByb3RvY29sLCBfOiAmbXV0IFRPdXRwdXRQcm90b2NvbCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgICAgIGxldCByZXMgPSBzZWxmCisgICAgICAgICAgICAgICAgLmludm9rZWQKKyAgICAgICAgICAgICAgICAuY29tcGFyZV9hbmRfc3dhcChmYWxzZSwgdHJ1ZSwgT3JkZXJpbmc6OlJlbGF4ZWQpOworICAgICAgICAgICAgaWYgcmVzIHsKKyAgICAgICAgICAgICAgICBPaygoKSkKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgRXJyKCJmYWlsZWQgc3dhcCIuaW50bygpKQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHNob3VsZF9yb3V0ZV9jYWxsX3RvX2NvcnJlY3RfcHJvY2Vzc29yKCkgeworICAgICAgICBsZXQgKG11dCBpLCBtdXQgbykgPSBidWlsZF9vYmplY3RzKCk7CisKKyAgICAgICAgLy8gYnVpbGQgdGhlIHNlcnZpY2VzCisgICAgICAgIGxldCBzdmNfMSA9IFNlcnZpY2UgeworICAgICAgICAgICAgaW52b2tlZDogQXJjOjpuZXcoQXRvbWljQm9vbDo6bmV3KGZhbHNlKSksCisgICAgICAgIH07CisgICAgICAgIGxldCBhdG1fMSA9IHN2Y18xLmludm9rZWQuY2xvbmUoKTsKKyAgICAgICAgbGV0IHN2Y18yID0gU2VydmljZSB7CisgICAgICAgICAgICBpbnZva2VkOiBBcmM6Om5ldyhBdG9taWNCb29sOjpuZXcoZmFsc2UpKSwKKyAgICAgICAgfTsKKyAgICAgICAgbGV0IGF0bV8yID0gc3ZjXzIuaW52b2tlZC5jbG9uZSgpOworCisgICAgICAgIC8vIHJlZ2lzdGVyIHRoZW0KKyAgICAgICAgbGV0IG11dCBwID0gVE11bHRpcGxleGVkUHJvY2Vzc29yOjpuZXcoKTsKKyAgICAgICAgcC5yZWdpc3Rlcigic2VydmljZV8xIiwgQm94OjpuZXcoc3ZjXzEpLCBmYWxzZSkudW53cmFwKCk7CisgICAgICAgIHAucmVnaXN0ZXIoInNlcnZpY2VfMiIsIEJveDo6bmV3KHN2Y18yKSwgZmFsc2UpLnVud3JhcCgpOworCisgICAgICAgIC8vIG1ha2UgdGhlIHNlcnZpY2UgY2FsbAorICAgICAgICBsZXQgc2VudF9pZGVudCA9IFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KCJzZXJ2aWNlXzE6Y2FsbCIsIFRNZXNzYWdlVHlwZTo6Q2FsbCwgMTApOworICAgICAgICBvLndyaXRlX21lc3NhZ2VfYmVnaW4oJnNlbnRfaWRlbnQpLnVud3JhcCgpOworICAgICAgICBvLmZsdXNoKCkudW53cmFwKCk7CisgICAgICAgIG8udHJhbnNwb3J0LmNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyKCk7CisgICAgICAgIG8udHJhbnNwb3J0LmVtcHR5X3dyaXRlX2J1ZmZlcigpOworCisgICAgICAgIHAucHJvY2VzcygmbXV0IGksICZtdXQgbykudW53cmFwKCk7CisKKyAgICAgICAgLy8gc2VydmljZSAxIHNob3VsZCBoYXZlIGJlZW4gaW52b2tlZCwgbm90IHNlcnZpY2UgMgorICAgICAgICBhc3NlcnRfZXEhKGF0bV8xLmxvYWQoT3JkZXJpbmc6OlJlbGF4ZWQpLCB0cnVlKTsKKyAgICAgICAgYXNzZXJ0X2VxIShhdG1fMi5sb2FkKE9yZGVyaW5nOjpSZWxheGVkKSwgZmFsc2UpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBzaG91bGRfcm91dGVfY2FsbF90b19jb3JyZWN0X3Byb2Nlc3Nvcl9pZl9ub19zZXBhcmF0b3JfZXhpc3RzX2FuZF9kZWZhdWx0X3Byb2Nlc3Nvcl9zZXQoKSB7CisgICAgICAgIGxldCAobXV0IGksIG11dCBvKSA9IGJ1aWxkX29iamVjdHMoKTsKKworICAgICAgICAvLyBidWlsZCB0aGUgc2VydmljZXMKKyAgICAgICAgbGV0IHN2Y18xID0gU2VydmljZSB7CisgICAgICAgICAgICBpbnZva2VkOiBBcmM6Om5ldyhBdG9taWNCb29sOjpuZXcoZmFsc2UpKSwKKyAgICAgICAgfTsKKyAgICAgICAgbGV0IGF0bV8xID0gc3ZjXzEuaW52b2tlZC5jbG9uZSgpOworICAgICAgICBsZXQgc3ZjXzIgPSBTZXJ2aWNlIHsKKyAgICAgICAgICAgIGludm9rZWQ6IEFyYzo6bmV3KEF0b21pY0Jvb2w6Om5ldyhmYWxzZSkpLAorICAgICAgICB9OworICAgICAgICBsZXQgYXRtXzIgPSBzdmNfMi5pbnZva2VkLmNsb25lKCk7CisKKyAgICAgICAgLy8gcmVnaXN0ZXIgdGhlbQorICAgICAgICBsZXQgbXV0IHAgPSBUTXVsdGlwbGV4ZWRQcm9jZXNzb3I6Om5ldygpOworICAgICAgICBwLnJlZ2lzdGVyKCJzZXJ2aWNlXzEiLCBCb3g6Om5ldyhzdmNfMSksIGZhbHNlKS51bndyYXAoKTsKKyAgICAgICAgcC5yZWdpc3Rlcigic2VydmljZV8yIiwgQm94OjpuZXcoc3ZjXzIpLCB0cnVlKS51bndyYXAoKTsgLy8gc2Vjb25kIHByb2Nlc3NvciBpcyBkZWZhdWx0CisKKyAgICAgICAgLy8gbWFrZSB0aGUgc2VydmljZSBjYWxsIChpdCdzIGFuIG9sZCBjbGllbnQsIHNvIHdlIGhhdmUgdG8gYmUgYmFja3dhcmRzIGNvbXBhdGlibGUpCisgICAgICAgIGxldCBzZW50X2lkZW50ID0gVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoIm9sZF9jYWxsIiwgVE1lc3NhZ2VUeXBlOjpDYWxsLCAxMCk7CisgICAgICAgIG8ud3JpdGVfbWVzc2FnZV9iZWdpbigmc2VudF9pZGVudCkudW53cmFwKCk7CisgICAgICAgIG8uZmx1c2goKS51bndyYXAoKTsKKyAgICAgICAgby50cmFuc3BvcnQuY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIoKTsKKyAgICAgICAgby50cmFuc3BvcnQuZW1wdHlfd3JpdGVfYnVmZmVyKCk7CisKKyAgICAgICAgcC5wcm9jZXNzKCZtdXQgaSwgJm11dCBvKS51bndyYXAoKTsKKworICAgICAgICAvLyBzZXJ2aWNlIDIgc2hvdWxkIGhhdmUgYmVlbiBpbnZva2VkLCBub3Qgc2VydmljZSAxCisgICAgICAgIGFzc2VydF9lcSEoYXRtXzEubG9hZChPcmRlcmluZzo6UmVsYXhlZCksIGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0X2VxIShhdG1fMi5sb2FkKE9yZGVyaW5nOjpSZWxheGVkKSwgdHJ1ZSk7CisgICAgfQorCisgICAgZm4gYnVpbGRfb2JqZWN0cygpIC0+ICgKKyAgICAgICAgVEJpbmFyeUlucHV0UHJvdG9jb2w8UmVhZEhhbGY8VEJ1ZmZlckNoYW5uZWw+PiwKKyAgICAgICAgVEJpbmFyeU91dHB1dFByb3RvY29sPFdyaXRlSGFsZjxUQnVmZmVyQ2hhbm5lbD4+LAorICAgICkgeworICAgICAgICBsZXQgYyA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDEyOCwgMTI4KTsKKyAgICAgICAgbGV0IChyX2MsIHdfYykgPSBjLnNwbGl0KCkudW53cmFwKCk7CisgICAgICAgICgKKyAgICAgICAgICAgIFRCaW5hcnlJbnB1dFByb3RvY29sOjpuZXcocl9jLCB0cnVlKSwKKyAgICAgICAgICAgIFRCaW5hcnlPdXRwdXRQcm90b2NvbDo6bmV3KHdfYywgdHJ1ZSksCisgICAgICAgICkKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcnMvc3JjL3NlcnZlci90aHJlYWRlZC5ycyBiL2xpYi9ycy9zcmMvc2VydmVyL3RocmVhZGVkLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMzlhNGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvc3JjL3NlcnZlci90aHJlYWRlZC5ycwpAQCAtMCwwICsxLDIzNCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2Ugc3RkOjpuZXQ6OntUY3BMaXN0ZW5lciwgVGNwU3RyZWFtfTsKK3VzZSBzdGQ6OnN5bmM6OkFyYzsKK3VzZSB0aHJlYWRwb29sOjpUaHJlYWRQb29sOworCit1c2UgcHJvdG9jb2w6OntUSW5wdXRQcm90b2NvbCwgVElucHV0UHJvdG9jb2xGYWN0b3J5LCBUT3V0cHV0UHJvdG9jb2wsIFRPdXRwdXRQcm90b2NvbEZhY3Rvcnl9OwordXNlIHRyYW5zcG9ydDo6e1RJb0NoYW5uZWwsIFRSZWFkVHJhbnNwb3J0RmFjdG9yeSwgVFRjcENoYW5uZWwsIFRXcml0ZVRyYW5zcG9ydEZhY3Rvcnl9OwordXNlIHtBcHBsaWNhdGlvbkVycm9yLCBBcHBsaWNhdGlvbkVycm9yS2luZH07CisKK3VzZSBzdXBlcjo6VFByb2Nlc3NvcjsKKworLy8vIEZpeGVkLXNpemUgdGhyZWFkLXBvb2wgYmxvY2tpbmcgVGhyaWZ0IHNlcnZlci4KKy8vLworLy8vIEEgYFRTZXJ2ZXJgIGxpc3RlbnMgb24gYSBnaXZlbiBhZGRyZXNzIGFuZCBzdWJtaXRzIGFjY2VwdGVkIGNvbm5lY3Rpb25zCisvLy8gdG8gYW4gKip1bmJvdW5kZWQqKiBxdWV1ZS4gQ29ubmVjdGlvbnMgZnJvbSB0aGlzIHF1ZXVlIGFyZSBzZXJ2aWNlZCBieQorLy8vIHRoZSBmaXJzdCBhdmFpbGFibGUgd29ya2VyIHRocmVhZCBmcm9tIGEgKipmaXhlZC1zaXplKiogdGhyZWFkIHBvb2wuIEVhY2gKKy8vLyBhY2NlcHRlZCBjb25uZWN0aW9uIGlzIGhhbmRsZWQgYnkgdGhhdCB3b3JrZXIgdGhyZWFkLCBhbmQgY29tbXVuaWNhdGlvbgorLy8vIG92ZXIgdGhpcyB0aHJlYWQgb2NjdXJzIHNlcXVlbnRpYWxseSBhbmQgc3luY2hyb25vdXNseSAoaS5lLiBjYWxscyBibG9jaykuCisvLy8gQWNjZXB0ZWQgY29ubmVjdGlvbnMgaGF2ZSBhbiBpbnB1dCBoYWxmIGFuZCBhbiBvdXRwdXQgaGFsZiwgZWFjaCBvZiB3aGljaAorLy8vIHVzZXMgYSBgVFRyYW5zcG9ydGAgYW5kIGBUSW5wdXRQcm90b2NvbGAvYFRPdXRwdXRQcm90b2NvbGAgdG8gdHJhbnNsYXRlCisvLy8gbWVzc2FnZXMgdG8gYW5kIGZyb20gYnllcy4gQW55IGNvbWJpbmF0aW9uIG9mIGBUSW5wdXRQcm90b2NvbGAsIGBUT3V0cHV0UHJvdG9jb2xgCisvLy8gYW5kIGBUVHJhbnNwb3J0YCBtYXkgYmUgdXNlZC4KKy8vLworLy8vICMgRXhhbXBsZXMKKy8vLworLy8vIENyZWF0aW5nIGFuZCBydW5uaW5nIGEgYFRTZXJ2ZXJgIHVzaW5nIFRocmlmdC1jb21waWxlci1nZW5lcmF0ZWQKKy8vLyBzZXJ2aWNlIGNvZGUuCisvLy8KKy8vLyBgYGBub19ydW4KKy8vLyB1c2UgdGhyaWZ0OworLy8vIHVzZSB0aHJpZnQ6OnByb3RvY29sOjp7VElucHV0UHJvdG9jb2xGYWN0b3J5LCBUT3V0cHV0UHJvdG9jb2xGYWN0b3J5fTsKKy8vLyB1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RCaW5hcnlJbnB1dFByb3RvY29sRmFjdG9yeSwgVEJpbmFyeU91dHB1dFByb3RvY29sRmFjdG9yeX07CisvLy8gdXNlIHRocmlmdDo6cHJvdG9jb2w6OntUSW5wdXRQcm90b2NvbCwgVE91dHB1dFByb3RvY29sfTsKKy8vLyB1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OntUQnVmZmVyZWRSZWFkVHJhbnNwb3J0RmFjdG9yeSwgVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5LAorLy8vICAgICAgICAgICAgICAgICAgICAgICAgIFRSZWFkVHJhbnNwb3J0RmFjdG9yeSwgVFdyaXRlVHJhbnNwb3J0RmFjdG9yeX07CisvLy8gdXNlIHRocmlmdDo6c2VydmVyOjp7VFByb2Nlc3NvciwgVFNlcnZlcn07CisvLy8KKy8vLyAvLworLy8vIC8vIGF1dG8tZ2VuZXJhdGVkCisvLy8gLy8KKy8vLworLy8vIC8vIHByb2Nlc3NvciBmb3IgYFNpbXBsZVNlcnZpY2VgCisvLy8gc3RydWN0IFNpbXBsZVNlcnZpY2VTeW5jUHJvY2Vzc29yOworLy8vIGltcGwgU2ltcGxlU2VydmljZVN5bmNQcm9jZXNzb3IgeworLy8vICAgICBmbiBuZXc8SDogU2ltcGxlU2VydmljZVN5bmNIYW5kbGVyPihwcm9jZXNzb3I6IEgpIC0+IFNpbXBsZVNlcnZpY2VTeW5jUHJvY2Vzc29yIHsKKy8vLyAgICAgICAgIHVuaW1wbGVtZW50ZWQhKCk7CisvLy8gICAgIH0KKy8vLyB9CisvLy8KKy8vLyAvLyBgVFByb2Nlc3NvcmAgaW1wbGVtZW50YXRpb24gZm9yIGBTaW1wbGVTZXJ2aWNlYAorLy8vIGltcGwgVFByb2Nlc3NvciBmb3IgU2ltcGxlU2VydmljZVN5bmNQcm9jZXNzb3IgeworLy8vICAgICBmbiBwcm9jZXNzKCZzZWxmLCBpOiAmbXV0IFRJbnB1dFByb3RvY29sLCBvOiAmbXV0IFRPdXRwdXRQcm90b2NvbCkgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsKKy8vLyAgICAgICAgIHVuaW1wbGVtZW50ZWQhKCk7CisvLy8gICAgIH0KKy8vLyB9CisvLy8KKy8vLyAvLyBzZXJ2aWNlIGZ1bmN0aW9ucyBmb3IgU2ltcGxlU2VydmljZQorLy8vIHRyYWl0IFNpbXBsZVNlcnZpY2VTeW5jSGFuZGxlciB7CisvLy8gICAgIGZuIHNlcnZpY2VfY2FsbCgmc2VsZikgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+OworLy8vIH0KKy8vLworLy8vIC8vCisvLy8gLy8gdXNlci1jb2RlIGZvbGxvd3MKKy8vLyAvLworLy8vCisvLy8gLy8gZGVmaW5lIGEgaGFuZGxlciB0aGF0IHdpbGwgYmUgaW52b2tlZCB3aGVuIGBzZXJ2aWNlX2NhbGxgIGlzIHJlY2VpdmVkCisvLy8gc3RydWN0IFNpbXBsZVNlcnZpY2VIYW5kbGVySW1wbDsKKy8vLyBpbXBsIFNpbXBsZVNlcnZpY2VTeW5jSGFuZGxlciBmb3IgU2ltcGxlU2VydmljZUhhbmRsZXJJbXBsIHsKKy8vLyAgICAgZm4gc2VydmljZV9jYWxsKCZzZWxmKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geworLy8vICAgICAgICAgdW5pbXBsZW1lbnRlZCEoKTsKKy8vLyAgICAgfQorLy8vIH0KKy8vLworLy8vIC8vIGluc3RhbnRpYXRlIHRoZSBwcm9jZXNzb3IKKy8vLyBsZXQgcHJvY2Vzc29yID0gU2ltcGxlU2VydmljZVN5bmNQcm9jZXNzb3I6Om5ldyhTaW1wbGVTZXJ2aWNlSGFuZGxlckltcGwge30pOworLy8vCisvLy8gLy8gaW5zdGFudGlhdGUgdGhlIHNlcnZlcgorLy8vIGxldCBpX3RyX2ZhY3Q6IEJveDxUUmVhZFRyYW5zcG9ydEZhY3Rvcnk+ID0gQm94OjpuZXcoVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydEZhY3Rvcnk6Om5ldygpKTsKKy8vLyBsZXQgaV9wcl9mYWN0OiBCb3g8VElucHV0UHJvdG9jb2xGYWN0b3J5PiA9IEJveDo6bmV3KFRCaW5hcnlJbnB1dFByb3RvY29sRmFjdG9yeTo6bmV3KCkpOworLy8vIGxldCBvX3RyX2ZhY3Q6IEJveDxUV3JpdGVUcmFuc3BvcnRGYWN0b3J5PiA9IEJveDo6bmV3KFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0RmFjdG9yeTo6bmV3KCkpOworLy8vIGxldCBvX3ByX2ZhY3Q6IEJveDxUT3V0cHV0UHJvdG9jb2xGYWN0b3J5PiA9IEJveDo6bmV3KFRCaW5hcnlPdXRwdXRQcm90b2NvbEZhY3Rvcnk6Om5ldygpKTsKKy8vLworLy8vIGxldCBtdXQgc2VydmVyID0gVFNlcnZlcjo6bmV3KAorLy8vICAgICBpX3RyX2ZhY3QsCisvLy8gICAgIGlfcHJfZmFjdCwKKy8vLyAgICAgb190cl9mYWN0LAorLy8vICAgICBvX3ByX2ZhY3QsCisvLy8gICAgIHByb2Nlc3NvciwKKy8vLyAgICAgMTAKKy8vLyApOworLy8vCisvLy8gLy8gc3RhcnQgbGlzdGVuaW5nIGZvciBpbmNvbWluZyBjb25uZWN0aW9ucworLy8vIG1hdGNoIHNlcnZlci5saXN0ZW4oIjEyNy4wLjAuMTo4MDgwIikgeworLy8vICAgT2soXykgID0+IHByaW50bG4hKCJsaXN0ZW4gY29tcGxldGVkIiksCisvLy8gICBFcnIoZSkgPT4gcHJpbnRsbiEoImxpc3RlbiBmYWlsZWQgd2l0aCBlcnJvciB7Oj99IiwgZSksCisvLy8gfQorLy8vIGBgYAorI1tkZXJpdmUoRGVidWcpXQorcHViIHN0cnVjdCBUU2VydmVyPFBSQywgUlRGLCBJUEYsIFdURiwgT1BGPgord2hlcmUKKyAgICBQUkM6IFRQcm9jZXNzb3IgKyBTZW5kICsgU3luYyArICdzdGF0aWMsCisgICAgUlRGOiBUUmVhZFRyYW5zcG9ydEZhY3RvcnkgKyAnc3RhdGljLAorICAgIElQRjogVElucHV0UHJvdG9jb2xGYWN0b3J5ICsgJ3N0YXRpYywKKyAgICBXVEY6IFRXcml0ZVRyYW5zcG9ydEZhY3RvcnkgKyAnc3RhdGljLAorICAgIE9QRjogVE91dHB1dFByb3RvY29sRmFjdG9yeSArICdzdGF0aWMsCit7CisgICAgcl90cmFuc19mYWN0b3J5OiBSVEYsCisgICAgaV9wcm90b19mYWN0b3J5OiBJUEYsCisgICAgd190cmFuc19mYWN0b3J5OiBXVEYsCisgICAgb19wcm90b19mYWN0b3J5OiBPUEYsCisgICAgcHJvY2Vzc29yOiBBcmM8UFJDPiwKKyAgICB3b3JrZXJfcG9vbDogVGhyZWFkUG9vbCwKK30KKworaW1wbDxQUkMsIFJURiwgSVBGLCBXVEYsIE9QRj4gVFNlcnZlcjxQUkMsIFJURiwgSVBGLCBXVEYsIE9QRj4KK3doZXJlCisgICAgUFJDOiBUUHJvY2Vzc29yICsgU2VuZCArIFN5bmMgKyAnc3RhdGljLAorICAgIFJURjogVFJlYWRUcmFuc3BvcnRGYWN0b3J5ICsgJ3N0YXRpYywKKyAgICBJUEY6IFRJbnB1dFByb3RvY29sRmFjdG9yeSArICdzdGF0aWMsCisgICAgV1RGOiBUV3JpdGVUcmFuc3BvcnRGYWN0b3J5ICsgJ3N0YXRpYywKKyAgICBPUEY6IFRPdXRwdXRQcm90b2NvbEZhY3RvcnkgKyAnc3RhdGljLAoreworICAgIC8vLyBDcmVhdGUgYSBgVFNlcnZlcmAuCisgICAgLy8vCisgICAgLy8vIEVhY2ggYWNjZXB0ZWQgY29ubmVjdGlvbiBoYXMgYW4gaW5wdXQgYW5kIG91dHB1dCBoYWxmLCBlYWNoIG9mIHdoaWNoCisgICAgLy8vIHJlcXVpcmVzIGEgYFRUcmFuc3BvcnRgIGFuZCBgVFByb3RvY29sYC4gYFRTZXJ2ZXJgIHVzZXMKKyAgICAvLy8gYHJlYWRfdHJhbnNwb3J0X2ZhY3RvcnlgIGFuZCBgaW5wdXRfcHJvdG9jb2xfZmFjdG9yeWAgdG8gY3JlYXRlCisgICAgLy8vIGltcGxlbWVudGF0aW9ucyBmb3IgdGhlIGlucHV0LCBhbmQgYHdyaXRlX3RyYW5zcG9ydF9mYWN0b3J5YCBhbmQKKyAgICAvLy8gYG91dHB1dF9wcm90b2NvbF9mYWN0b3J5YCB0byBjcmVhdGUgaW1wbGVtZW50YXRpb25zIGZvciB0aGUgb3V0cHV0LgorICAgIHB1YiBmbiBuZXcoCisgICAgICAgIHJlYWRfdHJhbnNwb3J0X2ZhY3Rvcnk6IFJURiwKKyAgICAgICAgaW5wdXRfcHJvdG9jb2xfZmFjdG9yeTogSVBGLAorICAgICAgICB3cml0ZV90cmFuc3BvcnRfZmFjdG9yeTogV1RGLAorICAgICAgICBvdXRwdXRfcHJvdG9jb2xfZmFjdG9yeTogT1BGLAorICAgICAgICBwcm9jZXNzb3I6IFBSQywKKyAgICAgICAgbnVtX3dvcmtlcnM6IHVzaXplLAorICAgICkgLT4gVFNlcnZlcjxQUkMsIFJURiwgSVBGLCBXVEYsIE9QRj4geworICAgICAgICBUU2VydmVyIHsKKyAgICAgICAgICAgIHJfdHJhbnNfZmFjdG9yeTogcmVhZF90cmFuc3BvcnRfZmFjdG9yeSwKKyAgICAgICAgICAgIGlfcHJvdG9fZmFjdG9yeTogaW5wdXRfcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgICAgIHdfdHJhbnNfZmFjdG9yeTogd3JpdGVfdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgICAgICBvX3Byb3RvX2ZhY3Rvcnk6IG91dHB1dF9wcm90b2NvbF9mYWN0b3J5LAorICAgICAgICAgICAgcHJvY2Vzc29yOiBBcmM6Om5ldyhwcm9jZXNzb3IpLAorICAgICAgICAgICAgd29ya2VyX3Bvb2w6IFRocmVhZFBvb2w6OndpdGhfbmFtZSgiVGhyaWZ0IHNlcnZpY2UgcHJvY2Vzc29yIi50b19vd25lZCgpLCBudW1fd29ya2VycyksCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gTGlzdGVuIGZvciBpbmNvbWluZyBjb25uZWN0aW9ucyBvbiBgbGlzdGVuX2FkZHJlc3NgLgorICAgIC8vLworICAgIC8vLyBgbGlzdGVuX2FkZHJlc3NgIHNob3VsZCBiZSBpbiB0aGUgZm9ybSBgaG9zdDpwb3J0YCwKKyAgICAvLy8gZm9yIGV4YW1wbGU6IGAxMjcuMC4wLjE6ODA4MGAuCisgICAgLy8vCisgICAgLy8vIFJldHVybiBgKClgIGlmIHN1Y2Nlc3NmdWwuCisgICAgLy8vCisgICAgLy8vIFJldHVybiBgRXJyYCB3aGVuIHRoZSBzZXJ2ZXIgY2Fubm90IGJpbmQgdG8gYGxpc3Rlbl9hZGRyZXNzYCBvciB0aGVyZQorICAgIC8vLyBpcyBhbiB1bnJlY292ZXJhYmxlIGVycm9yLgorICAgIHB1YiBmbiBsaXN0ZW4oJm11dCBzZWxmLCBsaXN0ZW5fYWRkcmVzczogJnN0cikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgbGV0IGxpc3RlbmVyID0gVGNwTGlzdGVuZXI6OmJpbmQobGlzdGVuX2FkZHJlc3MpPzsKKyAgICAgICAgZm9yIHN0cmVhbSBpbiBsaXN0ZW5lci5pbmNvbWluZygpIHsKKyAgICAgICAgICAgIG1hdGNoIHN0cmVhbSB7CisgICAgICAgICAgICAgICAgT2socykgPT4geworICAgICAgICAgICAgICAgICAgICBsZXQgKGlfcHJvdCwgb19wcm90KSA9IHNlbGYubmV3X3Byb3RvY29sc19mb3JfY29ubmVjdGlvbihzKT87CisgICAgICAgICAgICAgICAgICAgIGxldCBwcm9jZXNzb3IgPSBzZWxmLnByb2Nlc3Nvci5jbG9uZSgpOworICAgICAgICAgICAgICAgICAgICBzZWxmLndvcmtlcl9wb29sCisgICAgICAgICAgICAgICAgICAgICAgICAuZXhlY3V0ZShtb3ZlIHx8IGhhbmRsZV9pbmNvbWluZ19jb25uZWN0aW9uKHByb2Nlc3NvciwgaV9wcm90LCBvX3Byb3QpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRXJyKGUpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgd2FybiEoImZhaWxlZCB0byBhY2NlcHQgcmVtb3RlIGNvbm5lY3Rpb24gd2l0aCBlcnJvciB7Oj99IiwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgRXJyKDo6RXJyb3I6OkFwcGxpY2F0aW9uKEFwcGxpY2F0aW9uRXJyb3IgeworICAgICAgICAgICAga2luZDogQXBwbGljYXRpb25FcnJvcktpbmQ6OlVua25vd24sCisgICAgICAgICAgICBtZXNzYWdlOiAiYWJvcnRlZCBsaXN0ZW4gbG9vcCIuaW50bygpLAorICAgICAgICB9KSkKKyAgICB9CisKKyAgICBmbiBuZXdfcHJvdG9jb2xzX2Zvcl9jb25uZWN0aW9uKAorICAgICAgICAmbXV0IHNlbGYsCisgICAgICAgIHN0cmVhbTogVGNwU3RyZWFtLAorICAgICkgLT4gOjpSZXN1bHQ8KEJveDxUSW5wdXRQcm90b2NvbCArIFNlbmQ+LCBCb3g8VE91dHB1dFByb3RvY29sICsgU2VuZD4pPiB7CisgICAgICAgIC8vIGNyZWF0ZSB0aGUgc2hhcmVkIHRjcCBzdHJlYW0KKyAgICAgICAgbGV0IGNoYW5uZWwgPSBUVGNwQ2hhbm5lbDo6d2l0aF9zdHJlYW0oc3RyZWFtKTsKKworICAgICAgICAvLyBzcGxpdCBpdCBpbnRvIHR3byAtIG9uZSB0byBiZSBvd25lZCBieSB0aGUKKyAgICAgICAgLy8gaW5wdXQgdHJhbi9wcm90byBhbmQgdGhlIG90aGVyIGJ5IHRoZSBvdXRwdXQKKyAgICAgICAgbGV0IChyX2NoYW4sIHdfY2hhbikgPSBjaGFubmVsLnNwbGl0KCk/OworCisgICAgICAgIC8vIGlucHV0IHByb3RvY29sIGFuZCB0cmFuc3BvcnQKKyAgICAgICAgbGV0IHJfdHJhbiA9IHNlbGYucl90cmFuc19mYWN0b3J5LmNyZWF0ZShCb3g6Om5ldyhyX2NoYW4pKTsKKyAgICAgICAgbGV0IGlfcHJvdCA9IHNlbGYuaV9wcm90b19mYWN0b3J5LmNyZWF0ZShyX3RyYW4pOworCisgICAgICAgIC8vIG91dHB1dCBwcm90b2NvbCBhbmQgdHJhbnNwb3J0CisgICAgICAgIGxldCB3X3RyYW4gPSBzZWxmLndfdHJhbnNfZmFjdG9yeS5jcmVhdGUoQm94OjpuZXcod19jaGFuKSk7CisgICAgICAgIGxldCBvX3Byb3QgPSBzZWxmLm9fcHJvdG9fZmFjdG9yeS5jcmVhdGUod190cmFuKTsKKworICAgICAgICBPaygoaV9wcm90LCBvX3Byb3QpKQorICAgIH0KK30KKworZm4gaGFuZGxlX2luY29taW5nX2Nvbm5lY3Rpb248UFJDPigKKyAgICBwcm9jZXNzb3I6IEFyYzxQUkM+LAorICAgIGlfcHJvdDogQm94PFRJbnB1dFByb3RvY29sPiwKKyAgICBvX3Byb3Q6IEJveDxUT3V0cHV0UHJvdG9jb2w+LAorKSB3aGVyZQorICAgIFBSQzogVFByb2Nlc3NvciwKK3sKKyAgICBsZXQgbXV0IGlfcHJvdCA9IGlfcHJvdDsKKyAgICBsZXQgbXV0IG9fcHJvdCA9IG9fcHJvdDsKKyAgICBsb29wIHsKKyAgICAgICAgbGV0IHIgPSBwcm9jZXNzb3IucHJvY2VzcygmbXV0ICppX3Byb3QsICZtdXQgKm9fcHJvdCk7CisgICAgICAgIGlmIGxldCBFcnIoZSkgPSByIHsKKyAgICAgICAgICAgIHdhcm4hKCJwcm9jZXNzb3IgY29tcGxldGVkIHdpdGggZXJyb3I6IHs6P30iLCBlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3JzL3NyYy90cmFuc3BvcnQvYnVmZmVyZWQucnMgYi9saWIvcnMvc3JjL3RyYW5zcG9ydC9idWZmZXJlZC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2NmZWZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3NyYy90cmFuc3BvcnQvYnVmZmVyZWQucnMKQEAgLTAsMCArMSw0ODMgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNlIHN0ZDo6Y21wOwordXNlIHN0ZDo6aW87Cit1c2Ugc3RkOjppbzo6e1JlYWQsIFdyaXRlfTsKKwordXNlIHN1cGVyOjp7VFJlYWRUcmFuc3BvcnQsIFRSZWFkVHJhbnNwb3J0RmFjdG9yeSwgVFdyaXRlVHJhbnNwb3J0LCBUV3JpdGVUcmFuc3BvcnRGYWN0b3J5fTsKKworLy8vIERlZmF1bHQgY2FwYWNpdHkgb2YgdGhlIHJlYWQgYnVmZmVyIGluIGJ5dGVzLgorY29uc3QgUkVBRF9DQVBBQ0lUWTogdXNpemUgPSA0MDk2OworCisvLy8gRGVmYXVsdCBjYXBhY2l0eSBvZiB0aGUgd3JpdGUgYnVmZmVyIGluIGJ5dGVzLi4KK2NvbnN0IFdSSVRFX0NBUEFDSVRZOiB1c2l6ZSA9IDQwOTY7CisKKy8vLyBUcmFuc3BvcnQgdGhhdCByZWFkcyBtZXNzYWdlcyB2aWEgYW4gaW50ZXJuYWwgYnVmZmVyLgorLy8vCisvLy8gQSBgVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydGAgbWFpbnRhaW5zIGEgZml4ZWQtc2l6ZSBpbnRlcm5hbCByZWFkIGJ1ZmZlci4KKy8vLyBPbiBhIGNhbGwgdG8gYFRCdWZmZXJlZFJlYWRUcmFuc3BvcnQ6OnJlYWQoLi4uKWAgb25lIGZ1bGwgbWVzc2FnZSAtIGJvdGgKKy8vLyBmaXhlZC1sZW5ndGggaGVhZGVyIGFuZCBieXRlcyAtIGlzIHJlYWQgZnJvbSB0aGUgd3JhcHBlZCBjaGFubmVsIGFuZCBidWZmZXJlZC4KKy8vLyBTdWJzZXF1ZW50IHJlYWQgY2FsbHMgYXJlIHNlcnZpY2VkIGZyb20gdGhlIGludGVybmFsIGJ1ZmZlciB1bnRpbCBpdCBpcworLy8vIGV4aGF1c3RlZCwgYXQgd2hpY2ggcG9pbnQgdGhlIG5leHQgZnVsbCBtZXNzYWdlIGlzIHJlYWQgZnJvbSB0aGUgd3JhcHBlZAorLy8vIGNoYW5uZWwuCisvLy8KKy8vLyAjIEV4YW1wbGVzCisvLy8KKy8vLyBDcmVhdGUgYW5kIHVzZSBhIGBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0YC4KKy8vLworLy8vIGBgYG5vX3J1bgorLy8vIHVzZSBzdGQ6OmlvOjpSZWFkOworLy8vIHVzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6e1RCdWZmZXJlZFJlYWRUcmFuc3BvcnQsIFRUY3BDaGFubmVsfTsKKy8vLworLy8vIGxldCBtdXQgYyA9IFRUY3BDaGFubmVsOjpuZXcoKTsKKy8vLyBjLm9wZW4oImxvY2FsaG9zdDo5MDkwIikudW53cmFwKCk7CisvLy8KKy8vLyBsZXQgbXV0IHQgPSBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0OjpuZXcoYyk7CisvLy8KKy8vLyB0LnJlYWQoJm11dCB2ZWMhWzB1ODsgMV0pLnVud3JhcCgpOworLy8vIGBgYAorI1tkZXJpdmUoRGVidWcpXQorcHViIHN0cnVjdCBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0PEM+Cit3aGVyZQorICAgIEM6IFJlYWQsCit7CisgICAgYnVmOiBCb3g8W3U4XT4sCisgICAgcG9zOiB1c2l6ZSwKKyAgICBjYXA6IHVzaXplLAorICAgIGNoYW46IEMsCit9CisKK2ltcGw8Qz4gVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydDxDPgord2hlcmUKKyAgICBDOiBSZWFkLAoreworICAgIC8vLyBDcmVhdGUgYSBgVEJ1ZmZlcmVkVHJhbnNwb3J0YCB3aXRoIGRlZmF1bHQtc2l6ZWQgaW50ZXJuYWwgcmVhZCBhbmQKKyAgICAvLy8gd3JpdGUgYnVmZmVycyB0aGF0IHdyYXBzIHRoZSBnaXZlbiBgVElvQ2hhbm5lbGAuCisgICAgcHViIGZuIG5ldyhjaGFubmVsOiBDKSAtPiBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0PEM+IHsKKyAgICAgICAgVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydDo6d2l0aF9jYXBhY2l0eShSRUFEX0NBUEFDSVRZLCBjaGFubmVsKQorICAgIH0KKworICAgIC8vLyBDcmVhdGUgYSBgVEJ1ZmZlcmVkVHJhbnNwb3J0YCB3aXRoIGFuIGludGVybmFsIHJlYWQgYnVmZmVyIG9mIHNpemUKKyAgICAvLy8gYHJlYWRfY2FwYWNpdHlgIGFuZCBhbiBpbnRlcm5hbCB3cml0ZSBidWZmZXIgb2Ygc2l6ZQorICAgIC8vLyBgd3JpdGVfY2FwYWNpdHlgIHRoYXQgd3JhcHMgdGhlIGdpdmVuIGBUSW9DaGFubmVsYC4KKyAgICBwdWIgZm4gd2l0aF9jYXBhY2l0eShyZWFkX2NhcGFjaXR5OiB1c2l6ZSwgY2hhbm5lbDogQykgLT4gVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydDxDPiB7CisgICAgICAgIFRCdWZmZXJlZFJlYWRUcmFuc3BvcnQgeworICAgICAgICAgICAgYnVmOiB2ZWMhWzA7IHJlYWRfY2FwYWNpdHldLmludG9fYm94ZWRfc2xpY2UoKSwKKyAgICAgICAgICAgIHBvczogMCwKKyAgICAgICAgICAgIGNhcDogMCwKKyAgICAgICAgICAgIGNoYW46IGNoYW5uZWwsCisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbiBnZXRfYnl0ZXMoJm11dCBzZWxmKSAtPiBpbzo6UmVzdWx0PCZbdThdPiB7CisgICAgICAgIGlmIHNlbGYuY2FwIC0gc2VsZi5wb3MgPT0gMCB7CisgICAgICAgICAgICBzZWxmLnBvcyA9IDA7CisgICAgICAgICAgICBzZWxmLmNhcCA9IHNlbGYuY2hhbi5yZWFkKCZtdXQgc2VsZi5idWYpPzsKKyAgICAgICAgfQorCisgICAgICAgIE9rKCZzZWxmLmJ1ZltzZWxmLnBvcy4uc2VsZi5jYXBdKQorICAgIH0KKworICAgIGZuIGNvbnN1bWUoJm11dCBzZWxmLCBjb25zdW1lZDogdXNpemUpIHsKKyAgICAgICAgLy8gVE9ETzogd2FzIGEgYnVnIGhlcmUgKz0gPC0tIHRlc3Qgc29tZWhvdworICAgICAgICBzZWxmLnBvcyA9IGNtcDo6bWluKHNlbGYuY2FwLCBzZWxmLnBvcyArIGNvbnN1bWVkKTsKKyAgICB9Cit9CisKK2ltcGw8Qz4gUmVhZCBmb3IgVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydDxDPgord2hlcmUKKyAgICBDOiBSZWFkLAoreworICAgIGZuIHJlYWQoJm11dCBzZWxmLCBidWY6ICZtdXQgW3U4XSkgLT4gaW86OlJlc3VsdDx1c2l6ZT4geworICAgICAgICBsZXQgbXV0IGJ5dGVzX3JlYWQgPSAwOworCisgICAgICAgIGxvb3AgeworICAgICAgICAgICAgbGV0IG5yZWFkID0geworICAgICAgICAgICAgICAgIGxldCBhdmFpbF9ieXRlcyA9IHNlbGYuZ2V0X2J5dGVzKCk/OworICAgICAgICAgICAgICAgIGxldCBhdmFpbF9zcGFjZSA9IGJ1Zi5sZW4oKSAtIGJ5dGVzX3JlYWQ7CisgICAgICAgICAgICAgICAgbGV0IG5yZWFkID0gY21wOjptaW4oYXZhaWxfc3BhY2UsIGF2YWlsX2J5dGVzLmxlbigpKTsKKyAgICAgICAgICAgICAgICBidWZbYnl0ZXNfcmVhZC4uKGJ5dGVzX3JlYWQgKyBucmVhZCldLmNvcHlfZnJvbV9zbGljZSgmYXZhaWxfYnl0ZXNbLi5ucmVhZF0pOworICAgICAgICAgICAgICAgIG5yZWFkCisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBzZWxmLmNvbnN1bWUobnJlYWQpOworICAgICAgICAgICAgYnl0ZXNfcmVhZCArPSBucmVhZDsKKworICAgICAgICAgICAgaWYgYnl0ZXNfcmVhZCA9PSBidWYubGVuKCkgfHwgbnJlYWQgPT0gMCB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBPayhieXRlc19yZWFkKQorICAgIH0KK30KKworLy8vIEZhY3RvcnkgZm9yIGNyZWF0aW5nIGluc3RhbmNlcyBvZiBgVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydGAuCisjW2Rlcml2ZShEZWZhdWx0KV0KK3B1YiBzdHJ1Y3QgVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydEZhY3Rvcnk7CisKK2ltcGwgVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydEZhY3RvcnkgeworICAgIHB1YiBmbiBuZXcoKSAtPiBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0RmFjdG9yeSB7CisgICAgICAgIFRCdWZmZXJlZFJlYWRUcmFuc3BvcnRGYWN0b3J5IHt9CisgICAgfQorfQorCitpbXBsIFRSZWFkVHJhbnNwb3J0RmFjdG9yeSBmb3IgVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydEZhY3RvcnkgeworICAgIC8vLyBDcmVhdGUgYSBgVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydGAuCisgICAgZm4gY3JlYXRlKCZzZWxmLCBjaGFubmVsOiBCb3g8UmVhZCArIFNlbmQ+KSAtPiBCb3g8VFJlYWRUcmFuc3BvcnQgKyBTZW5kPiB7CisgICAgICAgIEJveDo6bmV3KFRCdWZmZXJlZFJlYWRUcmFuc3BvcnQ6Om5ldyhjaGFubmVsKSkKKyAgICB9Cit9CisKKy8vLyBUcmFuc3BvcnQgdGhhdCB3cml0ZXMgbWVzc2FnZXMgdmlhIGFuIGludGVybmFsIGJ1ZmZlci4KKy8vLworLy8vIEEgYFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0YCBtYWludGFpbnMgYSBmaXhlZC1zaXplIGludGVybmFsIHdyaXRlIGJ1ZmZlci4KKy8vLyBBbGwgd3JpdGVzIGFyZSBtYWRlIHRvIHRoaXMgYnVmZmVyIGFuZCBhcmUgc2VudCB0byB0aGUgd3JhcHBlZCBjaGFubmVsIG9ubHkKKy8vLyB3aGVuIGBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydDo6Zmx1c2goKWAgaXMgY2FsbGVkLiBPbiBhIGZsdXNoIGEgZml4ZWQtbGVuZ3RoCisvLy8gaGVhZGVyIHdpdGggYSBjb3VudCBvZiB0aGUgYnVmZmVyZWQgYnl0ZXMgaXMgd3JpdHRlbiwgZm9sbG93ZWQgYnkgdGhlIGJ5dGVzCisvLy8gdGhlbXNlbHZlcy4KKy8vLworLy8vICMgRXhhbXBsZXMKKy8vLworLy8vIENyZWF0ZSBhbmQgdXNlIGEgYFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0YC4KKy8vLworLy8vIGBgYG5vX3J1bgorLy8vIHVzZSBzdGQ6OmlvOjpXcml0ZTsKKy8vLyB1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OntUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydCwgVFRjcENoYW5uZWx9OworLy8vCisvLy8gbGV0IG11dCBjID0gVFRjcENoYW5uZWw6Om5ldygpOworLy8vIGMub3BlbigibG9jYWxob3N0OjkwOTAiKS51bndyYXAoKTsKKy8vLworLy8vIGxldCBtdXQgdCA9IFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0OjpuZXcoYyk7CisvLy8KKy8vLyB0LndyaXRlKCZbMHgwMF0pLnVud3JhcCgpOworLy8vIHQuZmx1c2goKS51bndyYXAoKTsKKy8vLyBgYGAKKyNbZGVyaXZlKERlYnVnKV0KK3B1YiBzdHJ1Y3QgVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQ8Qz4KK3doZXJlCisgICAgQzogV3JpdGUsCit7CisgICAgYnVmOiBWZWM8dTg+LAorICAgIGNhcDogdXNpemUsCisgICAgY2hhbm5lbDogQywKK30KKworaW1wbDxDPiBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydDxDPgord2hlcmUKKyAgICBDOiBXcml0ZSwKK3sKKyAgICAvLy8gQ3JlYXRlIGEgYFRCdWZmZXJlZFRyYW5zcG9ydGAgd2l0aCBkZWZhdWx0LXNpemVkIGludGVybmFsIHJlYWQgYW5kCisgICAgLy8vIHdyaXRlIGJ1ZmZlcnMgdGhhdCB3cmFwcyB0aGUgZ2l2ZW4gYFRJb0NoYW5uZWxgLgorICAgIHB1YiBmbiBuZXcoY2hhbm5lbDogQykgLT4gVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQ8Qz4geworICAgICAgICBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydDo6d2l0aF9jYXBhY2l0eShXUklURV9DQVBBQ0lUWSwgY2hhbm5lbCkKKyAgICB9CisKKyAgICAvLy8gQ3JlYXRlIGEgYFRCdWZmZXJlZFRyYW5zcG9ydGAgd2l0aCBhbiBpbnRlcm5hbCByZWFkIGJ1ZmZlciBvZiBzaXplCisgICAgLy8vIGByZWFkX2NhcGFjaXR5YCBhbmQgYW4gaW50ZXJuYWwgd3JpdGUgYnVmZmVyIG9mIHNpemUKKyAgICAvLy8gYHdyaXRlX2NhcGFjaXR5YCB0aGF0IHdyYXBzIHRoZSBnaXZlbiBgVElvQ2hhbm5lbGAuCisgICAgcHViIGZuIHdpdGhfY2FwYWNpdHkod3JpdGVfY2FwYWNpdHk6IHVzaXplLCBjaGFubmVsOiBDKSAtPiBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydDxDPiB7CisgICAgICAgIGFzc2VydCEoCisgICAgICAgICAgICB3cml0ZV9jYXBhY2l0eSA+IDAsCisgICAgICAgICAgICAid3JpdGUgYnVmZmVyIHNpemUgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIiCisgICAgICAgICk7CisKKyAgICAgICAgVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQgeworICAgICAgICAgICAgYnVmOiBWZWM6OndpdGhfY2FwYWNpdHkod3JpdGVfY2FwYWNpdHkpLAorICAgICAgICAgICAgY2FwOiB3cml0ZV9jYXBhY2l0eSwKKyAgICAgICAgICAgIGNoYW5uZWw6IGNoYW5uZWwsCisgICAgICAgIH0KKyAgICB9Cit9CisKK2ltcGw8Qz4gV3JpdGUgZm9yIFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0PEM+Cit3aGVyZQorICAgIEM6IFdyaXRlLAoreworICAgIGZuIHdyaXRlKCZtdXQgc2VsZiwgYnVmOiAmW3U4XSkgLT4gaW86OlJlc3VsdDx1c2l6ZT4geworICAgICAgICBpZiAhYnVmLmlzX2VtcHR5KCkgeworICAgICAgICAgICAgbGV0IG11dCBhdmFpbF9ieXRlczsKKworICAgICAgICAgICAgbG9vcCB7CisgICAgICAgICAgICAgICAgYXZhaWxfYnl0ZXMgPSBjbXA6Om1pbihidWYubGVuKCksIHNlbGYuY2FwIC0gc2VsZi5idWYubGVuKCkpOworCisgICAgICAgICAgICAgICAgaWYgYXZhaWxfYnl0ZXMgPT0gMCB7CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmx1c2goKT87CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsZXQgYXZhaWxfYnl0ZXMgPSBhdmFpbF9ieXRlczsKKworICAgICAgICAgICAgc2VsZi5idWYuZXh0ZW5kX2Zyb21fc2xpY2UoJmJ1ZlsuLmF2YWlsX2J5dGVzXSk7CisgICAgICAgICAgICBhc3NlcnQhKHNlbGYuYnVmLmxlbigpIDw9IHNlbGYuY2FwLCAiY29weSBvdmVyZmxvd2VkIGJ1ZmZlciIpOworCisgICAgICAgICAgICBPayhhdmFpbF9ieXRlcykKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE9rKDApCisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbiBmbHVzaCgmbXV0IHNlbGYpIC0+IGlvOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5jaGFubmVsLndyaXRlX2FsbCgmc2VsZi5idWYpPzsKKyAgICAgICAgc2VsZi5jaGFubmVsLmZsdXNoKCk/OworICAgICAgICBzZWxmLmJ1Zi5jbGVhcigpOworICAgICAgICBPaygoKSkKKyAgICB9Cit9CisKKy8vLyBGYWN0b3J5IGZvciBjcmVhdGluZyBpbnN0YW5jZXMgb2YgYFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0YC4KKyNbZGVyaXZlKERlZmF1bHQpXQorcHViIHN0cnVjdCBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydEZhY3Rvcnk7CisKK2ltcGwgVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5IHsKKyAgICBwdWIgZm4gbmV3KCkgLT4gVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5IHsKKyAgICAgICAgVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5IHt9CisgICAgfQorfQorCitpbXBsIFRXcml0ZVRyYW5zcG9ydEZhY3RvcnkgZm9yIFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0RmFjdG9yeSB7CisgICAgLy8vIENyZWF0ZSBhIGBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydGAuCisgICAgZm4gY3JlYXRlKCZzZWxmLCBjaGFubmVsOiBCb3g8V3JpdGUgKyBTZW5kPikgLT4gQm94PFRXcml0ZVRyYW5zcG9ydCArIFNlbmQ+IHsKKyAgICAgICAgQm94OjpuZXcoVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQ6Om5ldyhjaGFubmVsKSkKKyAgICB9Cit9CisKKyNbY2ZnKHRlc3QpXQorbW9kIHRlc3RzIHsKKyAgICB1c2Ugc3RkOjppbzo6e1JlYWQsIFdyaXRlfTsKKworICAgIHVzZSBzdXBlcjo6KjsKKyAgICB1c2UgdHJhbnNwb3J0OjpUQnVmZmVyQ2hhbm5lbDsKKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JldHVybl96ZXJvX2lmX3JlYWRfYnVmZmVyX2lzX2VtcHR5KCkgeworICAgICAgICBsZXQgbWVtID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMTAsIDApOworICAgICAgICBsZXQgbXV0IHQgPSBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0Ojp3aXRoX2NhcGFjaXR5KDEwLCBtZW0pOworCisgICAgICAgIGxldCBtdXQgYiA9IHZlYyFbMDsgMTBdOworICAgICAgICBsZXQgcmVhZF9yZXN1bHQgPSB0LnJlYWQoJm11dCBiKTsKKworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfcmVzdWx0LnVud3JhcCgpLCAwKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yZXR1cm5femVyb19pZl9jYWxsZXJfcmVhZHNfaW50b196ZXJvX2NhcGFjaXR5X2J1ZmZlcigpIHsKKyAgICAgICAgbGV0IG1lbSA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDEwLCAwKTsKKyAgICAgICAgbGV0IG11dCB0ID0gVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydDo6d2l0aF9jYXBhY2l0eSgxMCwgbWVtKTsKKworICAgICAgICBsZXQgcmVhZF9yZXN1bHQgPSB0LnJlYWQoJm11dCBbXSk7CisKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX3Jlc3VsdC51bndyYXAoKSwgMCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfcmV0dXJuX3plcm9faWZfbm90aGluZ19tb3JlX2Nhbl9iZV9yZWFkKCkgeworICAgICAgICBsZXQgbWVtID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoNCwgMCk7CisgICAgICAgIGxldCBtdXQgdCA9IFRCdWZmZXJlZFJlYWRUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoNCwgbWVtKTsKKworICAgICAgICB0LmNoYW4uc2V0X3JlYWRhYmxlX2J5dGVzKCZbMCwgMSwgMiwgM10pOworCisgICAgICAgIC8vIHJlYWQgYnVmZmVyIGlzIGV4YWN0bHkgdGhlIHNhbWUgc2l6ZSBhcyBieXRlcyBhdmFpbGFibGUKKyAgICAgICAgbGV0IG11dCBidWYgPSB2ZWMhWzB1ODsgNF07CisgICAgICAgIGxldCByZWFkX3Jlc3VsdCA9IHQucmVhZCgmbXV0IGJ1Zik7CisKKyAgICAgICAgLy8gd2UndmUgcmVhZCBleGFjdGx5IDQgYnl0ZXMKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX3Jlc3VsdC51bndyYXAoKSwgNCk7CisgICAgICAgIGFzc2VydF9lcSEoJmJ1ZiwgJlswLCAxLCAyLCAzXSk7CisKKyAgICAgICAgLy8gdHJ5IHJlYWQgYWdhaW4KKyAgICAgICAgbGV0IGJ1Zl9hZ2FpbiA9IHZlYyFbMHU4OyA0XTsKKyAgICAgICAgbGV0IHJlYWRfcmVzdWx0ID0gdC5yZWFkKCZtdXQgYnVmKTsKKworICAgICAgICAvLyB0aGlzIHRpbWUsIDAgYnl0ZXMgYW5kIHdlIGhhdmVuJ3QgY2hhbmdlZCB0aGUgYnVmZmVyCisgICAgICAgIGFzc2VydF9lcSEocmVhZF9yZXN1bHQudW53cmFwKCksIDApOworICAgICAgICBhc3NlcnRfZXEhKCZidWZfYWdhaW4sICZbMCwgMCwgMCwgMF0pCisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfZmlsbF91c2VyX2J1ZmZlcl93aXRoX29ubHlfYXNfbWFueV9ieXRlc19hc19hdmFpbGFibGUoKSB7CisgICAgICAgIGxldCBtZW0gPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSg0LCAwKTsKKyAgICAgICAgbGV0IG11dCB0ID0gVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydDo6d2l0aF9jYXBhY2l0eSg0LCBtZW0pOworCisgICAgICAgIHQuY2hhbi5zZXRfcmVhZGFibGVfYnl0ZXMoJlswLCAxLCAyLCAzXSk7CisKKyAgICAgICAgLy8gcmVhZCBidWZmZXIgaXMgbXVjaCBsYXJnZXIgdGhhbiB0aGUgYnl0ZXMgYXZhaWxhYmxlCisgICAgICAgIGxldCBtdXQgYnVmID0gdmVjIVswdTg7IDhdOworICAgICAgICBsZXQgcmVhZF9yZXN1bHQgPSB0LnJlYWQoJm11dCBidWYpOworCisgICAgICAgIC8vIHdlJ3ZlIHJlYWQgZXhhY3RseSA0IGJ5dGVzCisgICAgICAgIGFzc2VydF9lcSEocmVhZF9yZXN1bHQudW53cmFwKCksIDQpOworICAgICAgICBhc3NlcnRfZXEhKCZidWZbLi40XSwgJlswLCAxLCAyLCAzXSk7CisKKyAgICAgICAgLy8gdHJ5IHJlYWQgYWdhaW4KKyAgICAgICAgbGV0IHJlYWRfcmVzdWx0ID0gdC5yZWFkKCZtdXQgYnVmWzQuLl0pOworCisgICAgICAgIC8vIHRoaXMgdGltZSwgMCBieXRlcyBhbmQgd2UgaGF2ZW4ndCBjaGFuZ2VkIHRoZSBidWZmZXIKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX3Jlc3VsdC51bndyYXAoKSwgMCk7CisgICAgICAgIGFzc2VydF9lcSEoJmJ1ZiwgJlswLCAxLCAyLCAzLCAwLCAwLCAwLCAwXSkKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yZWFkX3N1Y2Nlc3NmdWxseSgpIHsKKyAgICAgICAgLy8gdGhpcyB0ZXN0IGludm9sdmVzIGEgZmV3IGxvb3BzIHdpdGhpbiB0aGUgYnVmZmVyZWQgdHJhbnNwb3J0CisgICAgICAgIC8vIGl0c2VsZiB3aGVyZSBpdCBoYXMgdG8gZHJhaW4gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IGluIG9yZGVyCisgICAgICAgIC8vIHRvIHNlcnZpY2UgYSByZWFkCisKKyAgICAgICAgLy8gd2UgaGF2ZSBhIG11Y2ggc21hbGxlciBidWZmZXIgdGhhbiB0aGUKKyAgICAgICAgLy8gdW5kZXJseWluZyB0cmFuc3BvcnQgaGFzIGJ5dGVzIGF2YWlsYWJsZQorICAgICAgICBsZXQgbWVtID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMTAsIDApOworICAgICAgICBsZXQgbXV0IHQgPSBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0Ojp3aXRoX2NhcGFjaXR5KDIsIG1lbSk7CisKKyAgICAgICAgLy8gZmlsbCB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQncyBieXRlIGJ1ZmZlcgorICAgICAgICBsZXQgbXV0IHJlYWRhYmxlX2J5dGVzID0gWzB1ODsgMTBdOworICAgICAgICBmb3IgaSBpbiAwLi4xMCB7CisgICAgICAgICAgICByZWFkYWJsZV9ieXRlc1tpXSA9IGkgYXMgdTg7CisgICAgICAgIH0KKworICAgICAgICB0LmNoYW4uc2V0X3JlYWRhYmxlX2J5dGVzKCZyZWFkYWJsZV9ieXRlcyk7CisKKyAgICAgICAgLy8gd2UgYXNrIHRvIHJlYWQgaW50byBhIGJ1ZmZlciB0aGF0J3MgbXVjaCBsYXJnZXIKKyAgICAgICAgLy8gdGhhbiB0aGUgb25lIHRoZSBidWZmZXJlZCB0cmFuc3BvcnQgaGFzOyBhcyBhIHJlc3VsdAorICAgICAgICAvLyBpdCdzIGdvaW5nIHRvIGhhdmUgdG8ga2VlcCBhc2tpbmcgdGhlIHVuZGVybHlpbmcKKyAgICAgICAgLy8gdHJhbnNwb3J0IGZvciBtb3JlIGJ5dGVzCisgICAgICAgIGxldCBtdXQgYnVmID0gWzB1ODsgOF07CisgICAgICAgIGxldCByZWFkX3Jlc3VsdCA9IHQucmVhZCgmbXV0IGJ1Zik7CisKKyAgICAgICAgLy8gd2Ugc2hvdWxkIGhhdmUgcmVhZCA4IGJ5dGVzCisgICAgICAgIGFzc2VydF9lcSEocmVhZF9yZXN1bHQudW53cmFwKCksIDgpOworICAgICAgICBhc3NlcnRfZXEhKCZidWYsICZbMCwgMSwgMiwgMywgNCwgNSwgNiwgN10pOworCisgICAgICAgIC8vIGxldCdzIGNsZWFyIG91dCB0aGUgYnVmZmVyIGFuZCB0cnkgcmVhZCBhZ2FpbgorICAgICAgICBmb3IgaSBpbiAwLi44IHsKKyAgICAgICAgICAgIGJ1ZltpXSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgbGV0IHJlYWRfcmVzdWx0ID0gdC5yZWFkKCZtdXQgYnVmKTsKKworICAgICAgICAvLyB0aGlzIHRpbWUgd2Ugd2VyZSBvbmx5IGFibGUgdG8gcmVhZCAyIGJ5dGVzCisgICAgICAgIC8vIChhbGwgdGhhdCdzIHJlbWFpbmluZyBmcm9tIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCkKKyAgICAgICAgLy8gbGV0J3MgYWxzbyBjaGVjayB0aGF0IHRoZSByZW1haW5pbmcgYnl0ZXMgYXJlIHVudG91Y2hlZAorICAgICAgICBhc3NlcnRfZXEhKHJlYWRfcmVzdWx0LnVud3JhcCgpLCAyKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmYnVmWzAuLjJdLCAmWzgsIDldKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmYnVmWzIuLl0sICZbMCwgMCwgMCwgMCwgMCwgMF0pOworCisgICAgICAgIC8vIHRyeSByZWFkIGFnYWluICh3ZSBzaG91bGQgZ2V0IDApCisgICAgICAgIC8vIGFuZCBhbGwgdGhlIGV4aXN0aW5nIGJ5dGVzIHdlcmUgdW50b3VjaGVkCisgICAgICAgIGxldCByZWFkX3Jlc3VsdCA9IHQucmVhZCgmbXV0IGJ1Zik7CisgICAgICAgIGFzc2VydF9lcSEocmVhZF9yZXN1bHQudW53cmFwKCksIDApOworICAgICAgICBhc3NlcnRfZXEhKCZidWZbMC4uMl0sICZbOCwgOV0pOworICAgICAgICBhc3NlcnRfZXEhKCZidWZbMi4uXSwgJlswLCAwLCAwLCAwLCAwLCAwXSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfcmV0dXJuX2Vycm9yX3doZW5fbm90aGluZ19jYW5fYmVfd3JpdHRlbl90b191bmRlcmx5aW5nX2NoYW5uZWwoKSB7CisgICAgICAgIGxldCBtZW0gPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgwLCAwKTsKKyAgICAgICAgbGV0IG11dCB0ID0gVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoMSwgbWVtKTsKKworICAgICAgICBsZXQgYiA9IHZlYyFbMDsgMTBdOworICAgICAgICBsZXQgciA9IHQud3JpdGUoJmIpOworCisgICAgICAgIC8vIHNob3VsZCBoYXZlIHdyaXR0ZW4gMSBieXRlCisgICAgICAgIGFzc2VydF9lcSEoci51bndyYXAoKSwgMSk7CisKKyAgICAgICAgLy8gbGV0J3MgdHJ5IGFnYWluLi4uCisgICAgICAgIGxldCByID0gdC53cml0ZSgmYlsxLi5dKTsKKworICAgICAgICAvLyB0aGlzIHRpbWUgd2UnbGwgZXJyb3Igb3V0IGJlY2F1c2UgdGhlIGF1dG8tZmx1c2ggZmFpbGVkCisgICAgICAgIGFzc2VydCEoci5pc19lcnIoKSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfcmV0dXJuX3plcm9faWZfY2FsbGVyX2NhbGxzX3dyaXRlX3dpdGhfZW1wdHlfYnVmZmVyKCkgeworICAgICAgICBsZXQgbWVtID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMCwgMTApOworICAgICAgICBsZXQgbXV0IHQgPSBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydDo6d2l0aF9jYXBhY2l0eSgxMCwgbWVtKTsKKworICAgICAgICBsZXQgciA9IHQud3JpdGUoJltdKTsKKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDBdID0gW107CisKKyAgICAgICAgYXNzZXJ0X2VxIShyLnVud3JhcCgpLCAwKTsKKyAgICAgICAgYXNzZXJ0X2VxX3RyYW5zcG9ydF93cml0dGVuX2J5dGVzISh0LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfYXV0b19mbHVzaF9pZl93cml0ZV9idWZmZXJfZnVsbCgpIHsKKyAgICAgICAgbGV0IG1lbSA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDAsIDgpOworICAgICAgICBsZXQgbXV0IHQgPSBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydDo6d2l0aF9jYXBhY2l0eSg0LCBtZW0pOworCisgICAgICAgIGxldCBiMCA9IFsweDAwLCAweDAxLCAweDAyLCAweDAzXTsKKyAgICAgICAgbGV0IGIxID0gWzB4MDQsIDB4MDUsIDB4MDYsIDB4MDddOworCisgICAgICAgIC8vIHdyaXRlIHRoZSBmaXJzdCA0IGJ5dGVzOyB3ZSd2ZSBub3cgZmlsbGVkIHRoZSB0cmFuc3BvcnQncyB3cml0ZSBidWZmZXIKKyAgICAgICAgbGV0IHIgPSB0LndyaXRlKCZiMCk7CisgICAgICAgIGFzc2VydF9lcSEoci51bndyYXAoKSwgNCk7CisKKyAgICAgICAgLy8gdHJ5IHdyaXRlIHRoZSBuZXh0IDQgYnl0ZXM7IHRoaXMgY2F1c2VzIHRoZSB0cmFuc3BvcnQgdG8gYXV0by1mbHVzaCB0aGUgZmlyc3QgNCBieXRlcworICAgICAgICBsZXQgciA9IHQud3JpdGUoJmIxKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyLnVud3JhcCgpLCA0KTsKKworICAgICAgICAvLyBjaGVjayB0aGF0IGluIHdyaXRpbmcgdGhlIHNlY29uZCA0IGJ5dGVzIHdlIGF1dG8tZmx1c2hlZCB0aGUgZmlyc3QgNCBieXRlcworICAgICAgICBhc3NlcnRfZXFfdHJhbnNwb3J0X251bV93cml0dGVuX2J5dGVzISh0LCA0KTsKKyAgICAgICAgYXNzZXJ0X2VxX3RyYW5zcG9ydF93cml0dGVuX2J5dGVzISh0LCBiMCk7CisgICAgICAgIHQuY2hhbm5lbC5lbXB0eV93cml0ZV9idWZmZXIoKTsKKworICAgICAgICAvLyBub3cgZmx1c2ggdGhlIHRyYW5zcG9ydCB0byBwdXNoIHRoZSBzZWNvbmQgNCBieXRlcyB0byB0aGUgdW5kZXJseWluZyBjaGFubmVsCisgICAgICAgIGFzc2VydCEodC5mbHVzaCgpLmlzX29rKCkpOworCisgICAgICAgIC8vIGNoZWNrIHRoYXQgd2Ugd3JvdGUgb3V0IHRoZSBzZWNvbmQgNCBieXRlcworICAgICAgICBhc3NlcnRfZXFfdHJhbnNwb3J0X3dyaXR0ZW5fYnl0ZXMhKHQsIGIxKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV90b19pbm5lcl90cmFuc3BvcnRfb25fZmx1c2goKSB7CisgICAgICAgIGxldCBtZW0gPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgxMCwgMTApOworICAgICAgICBsZXQgbXV0IHQgPSBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydDo6bmV3KG1lbSk7CisKKyAgICAgICAgbGV0IGI6IFt1ODsgNV0gPSBbMCwgMSwgMiwgMywgNF07CisgICAgICAgIGFzc2VydF9lcSEodC53cml0ZSgmYikudW53cmFwKCksIDUpOworICAgICAgICBhc3NlcnRfZXFfdHJhbnNwb3J0X251bV93cml0dGVuX2J5dGVzISh0LCAwKTsKKworICAgICAgICBhc3NlcnQhKHQuZmx1c2goKS5pc19vaygpKTsKKworICAgICAgICBhc3NlcnRfZXFfdHJhbnNwb3J0X3dyaXR0ZW5fYnl0ZXMhKHQsIGIpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX3N1Y2Nlc3NmdWxseV9hZnRlcl9mbHVzaCgpIHsKKyAgICAgICAgbGV0IG1lbSA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDAsIDUpOworICAgICAgICBsZXQgbXV0IHQgPSBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydDo6d2l0aF9jYXBhY2l0eSg1LCBtZW0pOworCisgICAgICAgIC8vIHdyaXRlIGFuZCBmbHVzaAorICAgICAgICBsZXQgYjogW3U4OyA1XSA9IFswLCAxLCAyLCAzLCA0XTsKKyAgICAgICAgYXNzZXJ0X2VxISh0LndyaXRlKCZiKS51bndyYXAoKSwgNSk7CisgICAgICAgIGFzc2VydCEodC5mbHVzaCgpLmlzX29rKCkpOworCisgICAgICAgIC8vIGNoZWNrIHRoZSBmbHVzaGVkIGJ5dGVzCisgICAgICAgIGFzc2VydF9lcV90cmFuc3BvcnRfd3JpdHRlbl9ieXRlcyEodCwgYik7CisKKyAgICAgICAgLy8gcmVzZXQgb3VyIHVuZGVybHlpbmcgdHJhbnNwb3J0CisgICAgICAgIHQuY2hhbm5lbC5lbXB0eV93cml0ZV9idWZmZXIoKTsKKworICAgICAgICAvLyB3cml0ZSBhbmQgZmx1c2ggYWdhaW4KKyAgICAgICAgYXNzZXJ0X2VxISh0LndyaXRlKCZiKS51bndyYXAoKSwgNSk7CisgICAgICAgIGFzc2VydCEodC5mbHVzaCgpLmlzX29rKCkpOworCisgICAgICAgIC8vIGNoZWNrIHRoZSBmbHVzaGVkIGJ5dGVzCisgICAgICAgIGFzc2VydF9lcV90cmFuc3BvcnRfd3JpdHRlbl9ieXRlcyEodCwgYik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3JzL3NyYy90cmFuc3BvcnQvZnJhbWVkLnJzIGIvbGliL3JzL3NyYy90cmFuc3BvcnQvZnJhbWVkLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMDkzMDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvc3JjL3RyYW5zcG9ydC9mcmFtZWQucnMKQEAgLTAsMCArMSw0NTkgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNlIGJ5dGVvcmRlcjo6e0JpZ0VuZGlhbiwgUmVhZEJ5dGVzRXh0LCBXcml0ZUJ5dGVzRXh0fTsKK3VzZSBzdGQ6OmNtcDsKK3VzZSBzdGQ6OmlvOwordXNlIHN0ZDo6aW86OntSZWFkLCBXcml0ZX07CisKK3VzZSBzdXBlcjo6e1RSZWFkVHJhbnNwb3J0LCBUUmVhZFRyYW5zcG9ydEZhY3RvcnksIFRXcml0ZVRyYW5zcG9ydCwgVFdyaXRlVHJhbnNwb3J0RmFjdG9yeX07CisKKy8vLyBEZWZhdWx0IGNhcGFjaXR5IG9mIHRoZSByZWFkIGJ1ZmZlciBpbiBieXRlcy4KK2NvbnN0IFJFQURfQ0FQQUNJVFk6IHVzaXplID0gNDA5NjsKKworLy8vIERlZmF1bHQgY2FwYWNpdHkgb2YgdGhlIHdyaXRlIGJ1ZmZlciBpbiBieXRlcy4KK2NvbnN0IFdSSVRFX0NBUEFDSVRZOiB1c2l6ZSA9IDQwOTY7CisKKy8vLyBUcmFuc3BvcnQgdGhhdCByZWFkcyBmcmFtZWQgbWVzc2FnZXMuCisvLy8KKy8vLyBBIGBURnJhbWVkUmVhZFRyYW5zcG9ydGAgbWFpbnRhaW5zIGEgZml4ZWQtc2l6ZSBpbnRlcm5hbCByZWFkIGJ1ZmZlci4KKy8vLyBPbiBhIGNhbGwgdG8gYFRGcmFtZWRSZWFkVHJhbnNwb3J0OjpyZWFkKC4uLilgIG9uZSBmdWxsIG1lc3NhZ2UgLSBib3RoCisvLy8gZml4ZWQtbGVuZ3RoIGhlYWRlciBhbmQgYnl0ZXMgLSBpcyByZWFkIGZyb20gdGhlIHdyYXBwZWQgY2hhbm5lbCBhbmQKKy8vLyBidWZmZXJlZC4gU3Vic2VxdWVudCByZWFkIGNhbGxzIGFyZSBzZXJ2aWNlZCBmcm9tIHRoZSBpbnRlcm5hbCBidWZmZXIKKy8vLyB1bnRpbCBpdCBpcyBleGhhdXN0ZWQsIGF0IHdoaWNoIHBvaW50IHRoZSBuZXh0IGZ1bGwgbWVzc2FnZSBpcyByZWFkCisvLy8gZnJvbSB0aGUgd3JhcHBlZCBjaGFubmVsLgorLy8vCisvLy8gIyBFeGFtcGxlcworLy8vCisvLy8gQ3JlYXRlIGFuZCB1c2UgYSBgVEZyYW1lZFJlYWRUcmFuc3BvcnRgLgorLy8vCisvLy8gYGBgbm9fcnVuCisvLy8gdXNlIHN0ZDo6aW86OlJlYWQ7CisvLy8gdXNlIHRocmlmdDo6dHJhbnNwb3J0Ojp7VEZyYW1lZFJlYWRUcmFuc3BvcnQsIFRUY3BDaGFubmVsfTsKKy8vLworLy8vIGxldCBtdXQgYyA9IFRUY3BDaGFubmVsOjpuZXcoKTsKKy8vLyBjLm9wZW4oImxvY2FsaG9zdDo5MDkwIikudW53cmFwKCk7CisvLy8KKy8vLyBsZXQgbXV0IHQgPSBURnJhbWVkUmVhZFRyYW5zcG9ydDo6bmV3KGMpOworLy8vCisvLy8gdC5yZWFkKCZtdXQgdmVjIVswdTg7IDFdKS51bndyYXAoKTsKKy8vLyBgYGAKKyNbZGVyaXZlKERlYnVnKV0KK3B1YiBzdHJ1Y3QgVEZyYW1lZFJlYWRUcmFuc3BvcnQ8Qz4KK3doZXJlCisgICAgQzogUmVhZCwKK3sKKyAgICBidWY6IFZlYzx1OD4sCisgICAgcG9zOiB1c2l6ZSwKKyAgICBjYXA6IHVzaXplLAorICAgIGNoYW46IEMsCit9CisKK2ltcGw8Qz4gVEZyYW1lZFJlYWRUcmFuc3BvcnQ8Qz4KK3doZXJlCisgICAgQzogUmVhZCwKK3sKKyAgICAvLy8gQ3JlYXRlIGEgYFRGcmFtZWRSZWFkVHJhbnNwb3J0YCB3aXRoIGEgZGVmYXVsdC1zaXplZAorICAgIC8vLyBpbnRlcm5hbCByZWFkIGJ1ZmZlciB0aGF0IHdyYXBzIHRoZSBnaXZlbiBgVElvQ2hhbm5lbGAuCisgICAgcHViIGZuIG5ldyhjaGFubmVsOiBDKSAtPiBURnJhbWVkUmVhZFRyYW5zcG9ydDxDPiB7CisgICAgICAgIFRGcmFtZWRSZWFkVHJhbnNwb3J0Ojp3aXRoX2NhcGFjaXR5KFJFQURfQ0FQQUNJVFksIGNoYW5uZWwpCisgICAgfQorCisgICAgLy8vIENyZWF0ZSBhIGBURnJhbWVkVHJhbnNwb3J0YCB3aXRoIGFuIGludGVybmFsIHJlYWQgYnVmZmVyCisgICAgLy8vIG9mIHNpemUgYHJlYWRfY2FwYWNpdHlgIHRoYXQgd3JhcHMgdGhlIGdpdmVuIGBUSW9DaGFubmVsYC4KKyAgICBwdWIgZm4gd2l0aF9jYXBhY2l0eShyZWFkX2NhcGFjaXR5OiB1c2l6ZSwgY2hhbm5lbDogQykgLT4gVEZyYW1lZFJlYWRUcmFuc3BvcnQ8Qz4geworICAgICAgICBURnJhbWVkUmVhZFRyYW5zcG9ydCB7CisgICAgICAgICAgICBidWY6IHZlYyFbMDsgcmVhZF9jYXBhY2l0eV0sIC8vIEZJWE1FOiBkbyBJIGFjdHVhbGx5IGhhdmUgdG8gZG8gdGhpcz8KKyAgICAgICAgICAgIHBvczogMCwKKyAgICAgICAgICAgIGNhcDogMCwKKyAgICAgICAgICAgIGNoYW46IGNoYW5uZWwsCisgICAgICAgIH0KKyAgICB9Cit9CisKK2ltcGw8Qz4gUmVhZCBmb3IgVEZyYW1lZFJlYWRUcmFuc3BvcnQ8Qz4KK3doZXJlCisgICAgQzogUmVhZCwKK3sKKyAgICBmbiByZWFkKCZtdXQgc2VsZiwgYjogJm11dCBbdThdKSAtPiBpbzo6UmVzdWx0PHVzaXplPiB7CisgICAgICAgIGlmIHNlbGYuY2FwIC0gc2VsZi5wb3MgPT0gMCB7CisgICAgICAgICAgICBsZXQgbWVzc2FnZV9zaXplID0gc2VsZi5jaGFuLnJlYWRfaTMyOjo8QmlnRW5kaWFuPigpPyBhcyB1c2l6ZTsKKworICAgICAgICAgICAgbGV0IGJ1Zl9jYXBhY2l0eSA9IGNtcDo6bWF4KG1lc3NhZ2Vfc2l6ZSwgUkVBRF9DQVBBQ0lUWSk7CisgICAgICAgICAgICBzZWxmLmJ1Zi5yZXNpemUoYnVmX2NhcGFjaXR5LCAwKTsKKworICAgICAgICAgICAgc2VsZi5jaGFuLnJlYWRfZXhhY3QoJm11dCBzZWxmLmJ1ZlsuLm1lc3NhZ2Vfc2l6ZV0pPzsKKyAgICAgICAgICAgIHNlbGYuY2FwID0gbWVzc2FnZV9zaXplIGFzIHVzaXplOworICAgICAgICAgICAgc2VsZi5wb3MgPSAwOworICAgICAgICB9CisKKyAgICAgICAgbGV0IG5yZWFkID0gY21wOjptaW4oYi5sZW4oKSwgc2VsZi5jYXAgLSBzZWxmLnBvcyk7CisgICAgICAgIGJbLi5ucmVhZF0uY2xvbmVfZnJvbV9zbGljZSgmc2VsZi5idWZbc2VsZi5wb3MuLnNlbGYucG9zICsgbnJlYWRdKTsKKyAgICAgICAgc2VsZi5wb3MgKz0gbnJlYWQ7CisKKyAgICAgICAgT2sobnJlYWQpCisgICAgfQorfQorCisvLy8gRmFjdG9yeSBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzIG9mIGBURnJhbWVkUmVhZFRyYW5zcG9ydGAuCisjW2Rlcml2ZShEZWZhdWx0KV0KK3B1YiBzdHJ1Y3QgVEZyYW1lZFJlYWRUcmFuc3BvcnRGYWN0b3J5OworCitpbXBsIFRGcmFtZWRSZWFkVHJhbnNwb3J0RmFjdG9yeSB7CisgICAgcHViIGZuIG5ldygpIC0+IFRGcmFtZWRSZWFkVHJhbnNwb3J0RmFjdG9yeSB7CisgICAgICAgIFRGcmFtZWRSZWFkVHJhbnNwb3J0RmFjdG9yeSB7fQorICAgIH0KK30KKworaW1wbCBUUmVhZFRyYW5zcG9ydEZhY3RvcnkgZm9yIFRGcmFtZWRSZWFkVHJhbnNwb3J0RmFjdG9yeSB7CisgICAgLy8vIENyZWF0ZSBhIGBURnJhbWVkUmVhZFRyYW5zcG9ydGAuCisgICAgZm4gY3JlYXRlKCZzZWxmLCBjaGFubmVsOiBCb3g8UmVhZCArIFNlbmQ+KSAtPiBCb3g8VFJlYWRUcmFuc3BvcnQgKyBTZW5kPiB7CisgICAgICAgIEJveDo6bmV3KFRGcmFtZWRSZWFkVHJhbnNwb3J0OjpuZXcoY2hhbm5lbCkpCisgICAgfQorfQorCisvLy8gVHJhbnNwb3J0IHRoYXQgd3JpdGVzIGZyYW1lZCBtZXNzYWdlcy4KKy8vLworLy8vIEEgYFRGcmFtZWRXcml0ZVRyYW5zcG9ydGAgbWFpbnRhaW5zIGEgZml4ZWQtc2l6ZSBpbnRlcm5hbCB3cml0ZSBidWZmZXIuIEFsbAorLy8vIHdyaXRlcyBhcmUgbWFkZSB0byB0aGlzIGJ1ZmZlciBhbmQgYXJlIHNlbnQgdG8gdGhlIHdyYXBwZWQgY2hhbm5lbCBvbmx5CisvLy8gd2hlbiBgVEZyYW1lZFdyaXRlVHJhbnNwb3J0OjpmbHVzaCgpYCBpcyBjYWxsZWQuIE9uIGEgZmx1c2ggYSBmaXhlZC1sZW5ndGgKKy8vLyBoZWFkZXIgd2l0aCBhIGNvdW50IG9mIHRoZSBidWZmZXJlZCBieXRlcyBpcyB3cml0dGVuLCBmb2xsb3dlZCBieSB0aGUgYnl0ZXMKKy8vLyB0aGVtc2VsdmVzLgorLy8vCisvLy8gIyBFeGFtcGxlcworLy8vCisvLy8gQ3JlYXRlIGFuZCB1c2UgYSBgVEZyYW1lZFdyaXRlVHJhbnNwb3J0YC4KKy8vLworLy8vIGBgYG5vX3J1bgorLy8vIHVzZSBzdGQ6OmlvOjpXcml0ZTsKKy8vLyB1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OntURnJhbWVkV3JpdGVUcmFuc3BvcnQsIFRUY3BDaGFubmVsfTsKKy8vLworLy8vIGxldCBtdXQgYyA9IFRUY3BDaGFubmVsOjpuZXcoKTsKKy8vLyBjLm9wZW4oImxvY2FsaG9zdDo5MDkwIikudW53cmFwKCk7CisvLy8KKy8vLyBsZXQgbXV0IHQgPSBURnJhbWVkV3JpdGVUcmFuc3BvcnQ6Om5ldyhjKTsKKy8vLworLy8vIHQud3JpdGUoJlsweDAwXSkudW53cmFwKCk7CisvLy8gdC5mbHVzaCgpLnVud3JhcCgpOworLy8vIGBgYAorI1tkZXJpdmUoRGVidWcpXQorcHViIHN0cnVjdCBURnJhbWVkV3JpdGVUcmFuc3BvcnQ8Qz4KK3doZXJlCisgICAgQzogV3JpdGUsCit7CisgICAgYnVmOiBWZWM8dTg+LAorICAgIGNoYW5uZWw6IEMsCit9CisKK2ltcGw8Qz4gVEZyYW1lZFdyaXRlVHJhbnNwb3J0PEM+Cit3aGVyZQorICAgIEM6IFdyaXRlLAoreworICAgIC8vLyBDcmVhdGUgYSBgVEZyYW1lZFdyaXRlVHJhbnNwb3J0YCB3aXRoIGRlZmF1bHQtc2l6ZWQgaW50ZXJuYWwKKyAgICAvLy8gd3JpdGUgYnVmZmVyIHRoYXQgd3JhcHMgdGhlIGdpdmVuIGBUSW9DaGFubmVsYC4KKyAgICBwdWIgZm4gbmV3KGNoYW5uZWw6IEMpIC0+IFRGcmFtZWRXcml0ZVRyYW5zcG9ydDxDPiB7CisgICAgICAgIFRGcmFtZWRXcml0ZVRyYW5zcG9ydDo6d2l0aF9jYXBhY2l0eShXUklURV9DQVBBQ0lUWSwgY2hhbm5lbCkKKyAgICB9CisKKyAgICAvLy8gQ3JlYXRlIGEgYFRGcmFtZWRXcml0ZVRyYW5zcG9ydGAgd2l0aCBhbiBpbnRlcm5hbCB3cml0ZSBidWZmZXIKKyAgICAvLy8gb2Ygc2l6ZSBgd3JpdGVfY2FwYWNpdHlgIHRoYXQgd3JhcHMgdGhlIGdpdmVuIGBUSW9DaGFubmVsYC4KKyAgICBwdWIgZm4gd2l0aF9jYXBhY2l0eSh3cml0ZV9jYXBhY2l0eTogdXNpemUsIGNoYW5uZWw6IEMpIC0+IFRGcmFtZWRXcml0ZVRyYW5zcG9ydDxDPiB7CisgICAgICAgIFRGcmFtZWRXcml0ZVRyYW5zcG9ydCB7CisgICAgICAgICAgICBidWY6IFZlYzo6d2l0aF9jYXBhY2l0eSh3cml0ZV9jYXBhY2l0eSksCisgICAgICAgICAgICBjaGFubmVsLAorICAgICAgICB9CisgICAgfQorfQorCitpbXBsPEM+IFdyaXRlIGZvciBURnJhbWVkV3JpdGVUcmFuc3BvcnQ8Qz4KK3doZXJlCisgICAgQzogV3JpdGUsCit7CisgICAgZm4gd3JpdGUoJm11dCBzZWxmLCBiOiAmW3U4XSkgLT4gaW86OlJlc3VsdDx1c2l6ZT4geworICAgICAgICBsZXQgY3VycmVudF9jYXBhY2l0eSA9IHNlbGYuYnVmLmNhcGFjaXR5KCk7CisgICAgICAgIGxldCBhdmFpbGFibGVfc3BhY2UgPSBjdXJyZW50X2NhcGFjaXR5IC0gc2VsZi5idWYubGVuKCk7CisgICAgICAgIGlmIGIubGVuKCkgPiBhdmFpbGFibGVfc3BhY2UgeworICAgICAgICAgICAgbGV0IGFkZGl0aW9uYWxfc3BhY2UgPSBjbXA6Om1heChiLmxlbigpIC0gYXZhaWxhYmxlX3NwYWNlLCBjdXJyZW50X2NhcGFjaXR5KTsKKyAgICAgICAgICAgIHNlbGYuYnVmLnJlc2VydmUoYWRkaXRpb25hbF9zcGFjZSk7CisgICAgICAgIH0KKworICAgICAgICBzZWxmLmJ1Zi5leHRlbmRfZnJvbV9zbGljZShiKTsKKyAgICAgICAgT2soYi5sZW4oKSkKKyAgICB9CisKKyAgICBmbiBmbHVzaCgmbXV0IHNlbGYpIC0+IGlvOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgbGV0IG1lc3NhZ2Vfc2l6ZSA9IHNlbGYuYnVmLmxlbigpOworCisgICAgICAgIGlmIGxldCAwID0gbWVzc2FnZV9zaXplIHsKKyAgICAgICAgICAgIHJldHVybiBPaygoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZWxmLmNoYW5uZWwud3JpdGVfaTMyOjo8QmlnRW5kaWFuPihtZXNzYWdlX3NpemUgYXMgaTMyKT87CisgICAgICAgIH0KKworICAgICAgICAvLyB3aWxsIHNwaW4gaWYgdGhlIHVuZGVybHlpbmcgY2hhbm5lbCBjYW4ndCBiZSB3cml0dGVuIHRvCisgICAgICAgIGxldCBtdXQgYnl0ZV9pbmRleCA9IDA7CisgICAgICAgIHdoaWxlIGJ5dGVfaW5kZXggPCBtZXNzYWdlX3NpemUgeworICAgICAgICAgICAgbGV0IG53cml0ZSA9IHNlbGYuY2hhbm5lbC53cml0ZSgmc2VsZi5idWZbYnl0ZV9pbmRleC4ubWVzc2FnZV9zaXplXSk/OworICAgICAgICAgICAgYnl0ZV9pbmRleCA9IGNtcDo6bWluKGJ5dGVfaW5kZXggKyBud3JpdGUsIG1lc3NhZ2Vfc2l6ZSk7CisgICAgICAgIH0KKworICAgICAgICBsZXQgYnVmX2NhcGFjaXR5ID0gY21wOjptaW4oc2VsZi5idWYuY2FwYWNpdHkoKSwgV1JJVEVfQ0FQQUNJVFkpOworICAgICAgICBzZWxmLmJ1Zi5yZXNpemUoYnVmX2NhcGFjaXR5LCAwKTsKKyAgICAgICAgc2VsZi5idWYuY2xlYXIoKTsKKworICAgICAgICBzZWxmLmNoYW5uZWwuZmx1c2goKQorICAgIH0KK30KKworLy8vIEZhY3RvcnkgZm9yIGNyZWF0aW5nIGluc3RhbmNlcyBvZiBgVEZyYW1lZFdyaXRlVHJhbnNwb3J0YC4KKyNbZGVyaXZlKERlZmF1bHQpXQorcHViIHN0cnVjdCBURnJhbWVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5OworCitpbXBsIFRGcmFtZWRXcml0ZVRyYW5zcG9ydEZhY3RvcnkgeworICAgIHB1YiBmbiBuZXcoKSAtPiBURnJhbWVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5IHsKKyAgICAgICAgVEZyYW1lZFdyaXRlVHJhbnNwb3J0RmFjdG9yeSB7fQorICAgIH0KK30KKworaW1wbCBUV3JpdGVUcmFuc3BvcnRGYWN0b3J5IGZvciBURnJhbWVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5IHsKKyAgICAvLy8gQ3JlYXRlIGEgYFRGcmFtZWRXcml0ZVRyYW5zcG9ydGAuCisgICAgZm4gY3JlYXRlKCZzZWxmLCBjaGFubmVsOiBCb3g8V3JpdGUgKyBTZW5kPikgLT4gQm94PFRXcml0ZVRyYW5zcG9ydCArIFNlbmQ+IHsKKyAgICAgICAgQm94OjpuZXcoVEZyYW1lZFdyaXRlVHJhbnNwb3J0OjpuZXcoY2hhbm5lbCkpCisgICAgfQorfQorCisjW2NmZyh0ZXN0KV0KK21vZCB0ZXN0cyB7CisgICAgdXNlIHN1cGVyOjoqOworICAgIHVzZSB0cmFuc3BvcnQ6Om1lbTo6VEJ1ZmZlckNoYW5uZWw7CisKKyAgICAvLyBGSVhNRTogdGVzdCBhIGZvcmNlZCByZXNlcnZlCisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yZWFkX21lc3NhZ2Vfc21hbGxlcl90aGFuX2luaXRpYWxfYnVmZmVyX3NpemUoKSB7CisgICAgICAgIGxldCBjID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMTAsIDEwKTsKKyAgICAgICAgbGV0IG11dCB0ID0gVEZyYW1lZFJlYWRUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoOCwgYyk7CisKKyAgICAgICAgdC5jaGFuLnNldF9yZWFkYWJsZV9ieXRlcygmWworICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgLyogbWVzc2FnZSBzaXplICovCisgICAgICAgICAgICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAvKiBtZXNzYWdlIGJvZHkgKi8KKyAgICAgICAgXSk7CisKKyAgICAgICAgbGV0IG11dCBidWYgPSB2ZWMhWzA7IDhdOworCisgICAgICAgIC8vIHdlJ3ZlIHJlYWQgZXhhY3RseSA0IGJ5dGVzCisgICAgICAgIGFzc2VydF9lcSEodC5yZWFkKCZtdXQgYnVmKS51bndyYXAoKSwgNCk7CisgICAgICAgIGFzc2VydF9lcSEoJmJ1ZlsuLjRdLCAmWzB4MDAsIDB4MDEsIDB4MDIsIDB4MDNdKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yZWFkX21lc3NhZ2VfZ3JlYXRlcl90aGFuX2luaXRpYWxfYnVmZmVyX3NpemUoKSB7CisgICAgICAgIGxldCBjID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMTAsIDEwKTsKKyAgICAgICAgbGV0IG11dCB0ID0gVEZyYW1lZFJlYWRUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoMiwgYyk7CisKKyAgICAgICAgdC5jaGFuLnNldF9yZWFkYWJsZV9ieXRlcygmWworICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgLyogbWVzc2FnZSBzaXplICovCisgICAgICAgICAgICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAvKiBtZXNzYWdlIGJvZHkgKi8KKyAgICAgICAgXSk7CisKKyAgICAgICAgbGV0IG11dCBidWYgPSB2ZWMhWzA7IDhdOworCisgICAgICAgIC8vIHdlJ3ZlIHJlYWQgZXhhY3RseSA0IGJ5dGVzCisgICAgICAgIGFzc2VydF9lcSEodC5yZWFkKCZtdXQgYnVmKS51bndyYXAoKSwgNCk7CisgICAgICAgIGFzc2VydF9lcSEoJmJ1ZlsuLjRdLCAmWzB4MDAsIDB4MDEsIDB4MDIsIDB4MDNdKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yZWFkX211bHRpcGxlX21lc3NhZ2VzX2luX3NlcXVlbmNlX2NvcnJlY3RseSgpIHsKKyAgICAgICAgbGV0IGMgPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgxMCwgMTApOworICAgICAgICBsZXQgbXV0IHQgPSBURnJhbWVkUmVhZFRyYW5zcG9ydDo6d2l0aF9jYXBhY2l0eSgyLCBjKTsKKworICAgICAgICAvLworICAgICAgICAvLyAxc3QgbWVzc2FnZQorICAgICAgICAvLworCisgICAgICAgIHQuY2hhbi5zZXRfcmVhZGFibGVfYnl0ZXMoJlsKKyAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIC8qIG1lc3NhZ2Ugc2l6ZSAqLworICAgICAgICAgICAgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgLyogbWVzc2FnZSBib2R5ICovCisgICAgICAgIF0pOworCisgICAgICAgIGxldCBtdXQgYnVmID0gdmVjIVswOyA4XTsKKworICAgICAgICAvLyB3ZSd2ZSByZWFkIGV4YWN0bHkgNCBieXRlcworICAgICAgICBhc3NlcnRfZXEhKHQucmVhZCgmbXV0IGJ1ZikudW53cmFwKCksIDQpOworICAgICAgICBhc3NlcnRfZXEhKCZidWYsICZbMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0pOworCisgICAgICAgIC8vCisgICAgICAgIC8vIDJuZCBtZXNzYWdlCisgICAgICAgIC8vCisKKyAgICAgICAgdC5jaGFuLnNldF9yZWFkYWJsZV9ieXRlcygmWworICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgLyogbWVzc2FnZSBzaXplICovCisgICAgICAgICAgICAweDA0LCAvKiBtZXNzYWdlIGJvZHkgKi8KKyAgICAgICAgXSk7CisKKyAgICAgICAgbGV0IG11dCBidWYgPSB2ZWMhWzA7IDhdOworCisgICAgICAgIC8vIHdlJ3ZlIHJlYWQgZXhhY3RseSAxIGJ5dGUKKyAgICAgICAgYXNzZXJ0X2VxISh0LnJlYWQoJm11dCBidWYpLnVud3JhcCgpLCAxKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmYnVmLCAmWzB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9tZXNzYWdlX3NtYWxsZXJfdGhhbl9idWZmZXJfc2l6ZSgpIHsKKyAgICAgICAgbGV0IG1lbSA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDAsIDApOworICAgICAgICBsZXQgbXV0IHQgPSBURnJhbWVkV3JpdGVUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoMjAsIG1lbSk7CisKKyAgICAgICAgbGV0IGIgPSB2ZWMhWzA7IDEwXTsKKworICAgICAgICAvLyBzaG91bGQgaGF2ZSB3cml0dGVuIDEwIGJ5dGVzCisgICAgICAgIGFzc2VydF9lcSEodC53cml0ZSgmYikudW53cmFwKCksIDEwKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yZXR1cm5femVyb19pZl9jYWxsZXJfY2FsbHNfd3JpdGVfd2l0aF9lbXB0eV9idWZmZXIoKSB7CisgICAgICAgIGxldCBtZW0gPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgwLCAxMCk7CisgICAgICAgIGxldCBtdXQgdCA9IFRGcmFtZWRXcml0ZVRyYW5zcG9ydDo6d2l0aF9jYXBhY2l0eSgxMCwgbWVtKTsKKworICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgMF0gPSBbXTsKKworICAgICAgICBhc3NlcnRfZXEhKHQud3JpdGUoJltdKS51bndyYXAoKSwgMCk7CisgICAgICAgIGFzc2VydF9lcV90cmFuc3BvcnRfd3JpdHRlbl9ieXRlcyEodCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX3RvX2lubmVyX3RyYW5zcG9ydF9vbl9mbHVzaCgpIHsKKyAgICAgICAgbGV0IG1lbSA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDEwLCAxMCk7CisgICAgICAgIGxldCBtdXQgdCA9IFRGcmFtZWRXcml0ZVRyYW5zcG9ydDo6bmV3KG1lbSk7CisKKyAgICAgICAgbGV0IGI6IFt1ODsgNV0gPSBbMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNF07CisgICAgICAgIGFzc2VydF9lcSEodC53cml0ZSgmYikudW53cmFwKCksIDUpOworICAgICAgICBhc3NlcnRfZXFfdHJhbnNwb3J0X251bV93cml0dGVuX2J5dGVzISh0LCAwKTsKKworICAgICAgICBhc3NlcnQhKHQuZmx1c2goKS5pc19vaygpKTsKKworICAgICAgICBsZXQgZXhwZWN0ZWRfYnl0ZXMgPSBbCisgICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDA1LCAvKiBtZXNzYWdlIHNpemUgKi8KKyAgICAgICAgICAgIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIC8qIG1lc3NhZ2UgYm9keSAqLworICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcV90cmFuc3BvcnRfd3JpdHRlbl9ieXRlcyEodCwgZXhwZWN0ZWRfYnl0ZXMpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX21lc3NhZ2VfZ3JlYXRlcl90aGFuX2J1ZmZlcl9zaXplXzAwKCkgeworICAgICAgICBsZXQgbWVtID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMCwgMTApOworCisgICAgICAgIC8vIElNUE9SVEFOVDogRE8gKipOT1QqKiBDSEFOR0UgVEhFIFdSSVRFX0NBUEFDSVRZIE9SIFRIRSBOVU1CRVIgT0YgQllURVMgVE8gQkUgV1JJVFRFTiEKKyAgICAgICAgLy8gdGhlc2UgbGVuZ3RocyB3ZXJlIGNob3NlbiB0byBiZSBqdXN0IGxvbmcgZW5vdWdoCisgICAgICAgIC8vIHRoYXQgZG91YmxpbmcgdGhlIGNhcGFjaXR5IGlzIGEgKip3b3JzZSoqIGNob2ljZSB0aGFuCisgICAgICAgIC8vIHNpbXBseSByZXNpemluZyB0aGUgYnVmZmVyIHRvIGIubGVuKCkKKworICAgICAgICBsZXQgbXV0IHQgPSBURnJhbWVkV3JpdGVUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoMSwgbWVtKTsKKyAgICAgICAgbGV0IGIgPSBbMHgwMCwgMHgwMSwgMHgwMl07CisKKyAgICAgICAgLy8gc2hvdWxkIGhhdmUgd3JpdHRlbiAzIGJ5dGVzCisgICAgICAgIGFzc2VydF9lcSEodC53cml0ZSgmYikudW53cmFwKCksIDMpOworICAgICAgICBhc3NlcnRfZXFfdHJhbnNwb3J0X251bV93cml0dGVuX2J5dGVzISh0LCAwKTsKKworICAgICAgICBhc3NlcnQhKHQuZmx1c2goKS5pc19vaygpKTsKKworICAgICAgICBsZXQgZXhwZWN0ZWRfYnl0ZXMgPSBbCisgICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAzLCAvKiBtZXNzYWdlIHNpemUgKi8KKyAgICAgICAgICAgIDB4MDAsIDB4MDEsIDB4MDIsIC8qIG1lc3NhZ2UgYm9keSAqLworICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcV90cmFuc3BvcnRfd3JpdHRlbl9ieXRlcyEodCwgZXhwZWN0ZWRfYnl0ZXMpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX21lc3NhZ2VfZ3JlYXRlcl90aGFuX2J1ZmZlcl9zaXplXzAxKCkgeworICAgICAgICBsZXQgbWVtID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMCwgMTApOworCisgICAgICAgIC8vIElNUE9SVEFOVDogRE8gKipOT1QqKiBDSEFOR0UgVEhFIFdSSVRFX0NBUEFDSVRZIE9SIFRIRSBOVU1CRVIgT0YgQllURVMgVE8gQkUgV1JJVFRFTiEKKyAgICAgICAgLy8gdGhlc2UgbGVuZ3RocyB3ZXJlIGNob3NlbiB0byBiZSBqdXN0IGxvbmcgZW5vdWdoCisgICAgICAgIC8vIHRoYXQgZG91YmxpbmcgdGhlIGNhcGFjaXR5IGlzIGEgKipiZXR0ZXIqKiBjaG9pY2UgdGhhbgorICAgICAgICAvLyBzaW1wbHkgcmVzaXppbmcgdGhlIGJ1ZmZlciB0byBiLmxlbigpCisKKyAgICAgICAgbGV0IG11dCB0ID0gVEZyYW1lZFdyaXRlVHJhbnNwb3J0Ojp3aXRoX2NhcGFjaXR5KDIsIG1lbSk7CisgICAgICAgIGxldCBiID0gWzB4MDAsIDB4MDEsIDB4MDJdOworCisgICAgICAgIC8vIHNob3VsZCBoYXZlIHdyaXR0ZW4gMyBieXRlcworICAgICAgICBhc3NlcnRfZXEhKHQud3JpdGUoJmIpLnVud3JhcCgpLCAzKTsKKyAgICAgICAgYXNzZXJ0X2VxX3RyYW5zcG9ydF9udW1fd3JpdHRlbl9ieXRlcyEodCwgMCk7CisKKyAgICAgICAgYXNzZXJ0ISh0LmZsdXNoKCkuaXNfb2soKSk7CisKKyAgICAgICAgbGV0IGV4cGVjdGVkX2J5dGVzID0gWworICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywgLyogbWVzc2FnZSBzaXplICovCisgICAgICAgICAgICAweDAwLCAweDAxLCAweDAyLCAvKiBtZXNzYWdlIGJvZHkgKi8KKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXFfdHJhbnNwb3J0X3dyaXR0ZW5fYnl0ZXMhKHQsIGV4cGVjdGVkX2J5dGVzKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yZXR1cm5fZXJyb3JfaWZfbm90aGluZ19jYW5fYmVfd3JpdHRlbl90b19pbm5lcl90cmFuc3BvcnRfb25fZmx1c2goKSB7CisgICAgICAgIGxldCBtZW0gPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgwLCAwKTsKKyAgICAgICAgbGV0IG11dCB0ID0gVEZyYW1lZFdyaXRlVHJhbnNwb3J0Ojp3aXRoX2NhcGFjaXR5KDEsIG1lbSk7CisKKyAgICAgICAgbGV0IGIgPSB2ZWMhWzA7IDEwXTsKKworICAgICAgICAvLyBzaG91bGQgaGF2ZSB3cml0dGVuIDEwIGJ5dGVzCisgICAgICAgIGFzc2VydF9lcSEodC53cml0ZSgmYikudW53cmFwKCksIDEwKTsKKworICAgICAgICAvLyBsZXQncyBmbHVzaAorICAgICAgICBsZXQgciA9IHQuZmx1c2goKTsKKworICAgICAgICAvLyB0aGlzIHRpbWUgd2UnbGwgZXJyb3Igb3V0IGJlY2F1c2UgdGhlIGZsdXNoIGNhbid0IHdyaXRlIHRvIHRoZSB1bmRlcmx5aW5nIGNoYW5uZWwKKyAgICAgICAgYXNzZXJ0IShyLmlzX2VycigpKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9zdWNjZXNzZnVsbHlfYWZ0ZXJfZmx1c2goKSB7CisgICAgICAgIC8vIElNUE9SVEFOVDogd3JpdGUgY2FwYWNpdHkgKk1VU1QqIGJlIGdyZWF0ZXIKKyAgICAgICAgLy8gdGhhbiBtZXNzYWdlIHNpemVzIHVzZWQgaW4gdGhpcyB0ZXN0ICsgNC1ieXRlIGZyYW1lIGhlYWRlcgorICAgICAgICBsZXQgbWVtID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMCwgMTApOworICAgICAgICBsZXQgbXV0IHQgPSBURnJhbWVkV3JpdGVUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoNSwgbWVtKTsKKworICAgICAgICAvLyB3cml0ZSBhbmQgZmx1c2gKKyAgICAgICAgbGV0IGZpcnN0X21lc3NhZ2U6IFt1ODsgNV0gPSBbMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNF07CisgICAgICAgIGFzc2VydF9lcSEodC53cml0ZSgmZmlyc3RfbWVzc2FnZSkudW53cmFwKCksIDUpOworICAgICAgICBhc3NlcnQhKHQuZmx1c2goKS5pc19vaygpKTsKKworICAgICAgICBsZXQgbXV0IGV4cGVjdGVkID0gVmVjOjpuZXcoKTsKKyAgICAgICAgZXhwZWN0ZWQud3JpdGVfYWxsKCZbMHgwMCwgMHgwMCwgMHgwMCwgMHgwNV0pLnVud3JhcCgpOyAvLyBtZXNzYWdlIHNpemUKKyAgICAgICAgZXhwZWN0ZWQuZXh0ZW5kX2Zyb21fc2xpY2UoJmZpcnN0X21lc3NhZ2UpOworCisgICAgICAgIC8vIGNoZWNrIHRoZSBmbHVzaGVkIGJ5dGVzCisgICAgICAgIGFzc2VydF9lcSEodC5jaGFubmVsLndyaXRlX2J5dGVzKCksIGV4cGVjdGVkKTsKKworICAgICAgICAvLyByZXNldCBvdXIgdW5kZXJseWluZyB0cmFuc3BvcnQKKyAgICAgICAgdC5jaGFubmVsLmVtcHR5X3dyaXRlX2J1ZmZlcigpOworCisgICAgICAgIGxldCBzZWNvbmRfbWVzc2FnZTogW3U4OyAzXSA9IFsweDA1LCAweDA2LCAweDA3XTsKKyAgICAgICAgYXNzZXJ0X2VxISh0LndyaXRlKCZzZWNvbmRfbWVzc2FnZSkudW53cmFwKCksIDMpOworICAgICAgICBhc3NlcnQhKHQuZmx1c2goKS5pc19vaygpKTsKKworICAgICAgICBleHBlY3RlZC5jbGVhcigpOworICAgICAgICBleHBlY3RlZC53cml0ZV9hbGwoJlsweDAwLCAweDAwLCAweDAwLCAweDAzXSkudW53cmFwKCk7IC8vIG1lc3NhZ2Ugc2l6ZQorICAgICAgICBleHBlY3RlZC5leHRlbmRfZnJvbV9zbGljZSgmc2Vjb25kX21lc3NhZ2UpOworCisgICAgICAgIC8vIGNoZWNrIHRoZSBmbHVzaGVkIGJ5dGVzCisgICAgICAgIGFzc2VydF9lcSEodC5jaGFubmVsLndyaXRlX2J5dGVzKCksIGV4cGVjdGVkKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcnMvc3JjL3RyYW5zcG9ydC9tZW0ucnMgYi9saWIvcnMvc3JjL3RyYW5zcG9ydC9tZW0ucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJjNGI1NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy9zcmMvdHJhbnNwb3J0L21lbS5ycwpAQCAtMCwwICsxLDM4NSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2Ugc3RkOjpjbXA7Cit1c2Ugc3RkOjppbzsKK3VzZSBzdGQ6OnN5bmM6OntBcmMsIE11dGV4fTsKKwordXNlIHN1cGVyOjp7UmVhZEhhbGYsIFRJb0NoYW5uZWwsIFdyaXRlSGFsZn07CisKKy8vLyBJbi1tZW1vcnkgcmVhZCBhbmQgd3JpdGUgY2hhbm5lbCB3aXRoIGZpeGVkLXNpemUgcmVhZCBhbmQgd3JpdGUgYnVmZmVycy4KKy8vLworLy8vIE9uIGEgYHdyaXRlYCBieXRlcyBhcmUgd3JpdHRlbiB0byB0aGUgaW50ZXJuYWwgd3JpdGUgYnVmZmVyLiBXcml0ZXMgYXJlIG5vCisvLy8gbG9uZ2VyIGFjY2VwdGVkIG9uY2UgdGhpcyBidWZmZXIgaXMgZnVsbC4gQ2FsbGVycyBtdXN0IGBlbXB0eV93cml0ZV9idWZmZXIoKWAKKy8vLyBiZWZvcmUgc3Vic2VxdWVudCB3cml0ZXMgYXJlIGFjY2VwdGVkLgorLy8vCisvLy8gWW91IGNhbiBzZXQgcmVhZGFibGUgYnl0ZXMgaW4gdGhlIGludGVybmFsIHJlYWQgYnVmZmVyIGJ5IGZpbGxpbmcgaXQgd2l0aAorLy8vIGBzZXRfcmVhZGFibGVfYnl0ZXMoLi4uKWAuIENhbGxlcnMgY2FuIHRoZW4gcmVhZCB1bnRpbCB0aGUgYnVmZmVyIGlzCisvLy8gZGVwbGV0ZWQuIE5vIGZ1cnRoZXIgcmVhZHMgYXJlIGFjY2VwdGVkIHVudGlsIHRoZSBpbnRlcm5hbCByZWFkIGJ1ZmZlciBpcworLy8vIHJlcGxlbmlzaGVkIGFnYWluLgorI1tkZXJpdmUoRGVidWcpXQorcHViIHN0cnVjdCBUQnVmZmVyQ2hhbm5lbCB7CisgICAgcmVhZDogQXJjPE11dGV4PFJlYWREYXRhPj4sCisgICAgd3JpdGU6IEFyYzxNdXRleDxXcml0ZURhdGE+PiwKK30KKworI1tkZXJpdmUoRGVidWcpXQorc3RydWN0IFJlYWREYXRhIHsKKyAgICBidWY6IEJveDxbdThdPiwKKyAgICBwb3M6IHVzaXplLAorICAgIGlkeDogdXNpemUsCisgICAgY2FwOiB1c2l6ZSwKK30KKworI1tkZXJpdmUoRGVidWcpXQorc3RydWN0IFdyaXRlRGF0YSB7CisgICAgYnVmOiBCb3g8W3U4XT4sCisgICAgcG9zOiB1c2l6ZSwKKyAgICBjYXA6IHVzaXplLAorfQorCitpbXBsIFRCdWZmZXJDaGFubmVsIHsKKyAgICAvLy8gQ29uc3RydWN0cyBhIG5ldywgZW1wdHkgYFRCdWZmZXJDaGFubmVsYCB3aXRoIHRoZSBnaXZlbgorICAgIC8vLyByZWFkIGJ1ZmZlciBjYXBhY2l0eSBhbmQgd3JpdGUgYnVmZmVyIGNhcGFjaXR5LgorICAgIHB1YiBmbiB3aXRoX2NhcGFjaXR5KHJlYWRfY2FwYWNpdHk6IHVzaXplLCB3cml0ZV9jYXBhY2l0eTogdXNpemUpIC0+IFRCdWZmZXJDaGFubmVsIHsKKyAgICAgICAgVEJ1ZmZlckNoYW5uZWwgeworICAgICAgICAgICAgcmVhZDogQXJjOjpuZXcoTXV0ZXg6Om5ldyhSZWFkRGF0YSB7CisgICAgICAgICAgICAgICAgYnVmOiB2ZWMhWzA7IHJlYWRfY2FwYWNpdHldLmludG9fYm94ZWRfc2xpY2UoKSwKKyAgICAgICAgICAgICAgICBpZHg6IDAsCisgICAgICAgICAgICAgICAgcG9zOiAwLAorICAgICAgICAgICAgICAgIGNhcDogcmVhZF9jYXBhY2l0eSwKKyAgICAgICAgICAgIH0pKSwKKyAgICAgICAgICAgIHdyaXRlOiBBcmM6Om5ldyhNdXRleDo6bmV3KFdyaXRlRGF0YSB7CisgICAgICAgICAgICAgICAgYnVmOiB2ZWMhWzA7IHdyaXRlX2NhcGFjaXR5XS5pbnRvX2JveGVkX3NsaWNlKCksCisgICAgICAgICAgICAgICAgcG9zOiAwLAorICAgICAgICAgICAgICAgIGNhcDogd3JpdGVfY2FwYWNpdHksCisgICAgICAgICAgICB9KSksCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIGEgY29weSBvZiB0aGUgYnl0ZXMgaGVsZCBieSB0aGUgaW50ZXJuYWwgcmVhZCBidWZmZXIuCisgICAgLy8vIFJldHVybnMgYW4gZW1wdHkgdmVjdG9yIGlmIG5vIHJlYWRhYmxlIGJ5dGVzIGFyZSBwcmVzZW50LgorICAgIHB1YiBmbiByZWFkX2J5dGVzKCZzZWxmKSAtPiBWZWM8dTg+IHsKKyAgICAgICAgbGV0IHJkYXRhID0gc2VsZi5yZWFkLmFzX3JlZigpLmxvY2soKS51bndyYXAoKTsKKyAgICAgICAgbGV0IG11dCBidWYgPSB2ZWMhWzB1ODsgcmRhdGEuaWR4XTsKKyAgICAgICAgYnVmLmNvcHlfZnJvbV9zbGljZSgmcmRhdGEuYnVmWy4ucmRhdGEuaWR4XSk7CisgICAgICAgIGJ1ZgorICAgIH0KKworICAgIC8vIEZJWE1FOiBkbyBJIHJlYWxseSBuZWVkIHRoaXMgQVBJIGNhbGw/CisgICAgLy8gRklYTUU6IHNob3VsZCB0aGlzIHNpbXBseSByZXNldCB0byB0aGUgbGFzdCBzZXQgb2YgcmVhZGFibGUgYnl0ZXM/CisgICAgLy8vIFJlc2V0IHRoZSBudW1iZXIgb2YgcmVhZGFibGUgYnl0ZXMgdG8gemVyby4KKyAgICAvLy8KKyAgICAvLy8gU3Vic2VxdWVudCBjYWxscyB0byBgcmVhZGAgd2lsbCByZXR1cm4gbm90aGluZy4KKyAgICBwdWIgZm4gZW1wdHlfcmVhZF9idWZmZXIoJm11dCBzZWxmKSB7CisgICAgICAgIGxldCBtdXQgcmRhdGEgPSBzZWxmLnJlYWQuYXNfcmVmKCkubG9jaygpLnVud3JhcCgpOworICAgICAgICByZGF0YS5wb3MgPSAwOworICAgICAgICByZGF0YS5pZHggPSAwOworICAgIH0KKworICAgIC8vLyBDb3B5IGJ5dGVzIGZyb20gdGhlIHNvdXJjZSBidWZmZXIgYGJ1ZmAgaW50byB0aGUgaW50ZXJuYWwgcmVhZCBidWZmZXIsCisgICAgLy8vIG92ZXJ3cml0aW5nIGFueSBleGlzdGluZyBieXRlcy4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCwKKyAgICAvLy8gd2hpY2ggaXMgYG1pbihidWYubGVuKCksIGludGVybmFsX3JlYWRfYnVmLmxlbigpKWAuCisgICAgcHViIGZuIHNldF9yZWFkYWJsZV9ieXRlcygmbXV0IHNlbGYsIGJ1ZjogJlt1OF0pIC0+IHVzaXplIHsKKyAgICAgICAgc2VsZi5lbXB0eV9yZWFkX2J1ZmZlcigpOworICAgICAgICBsZXQgbXV0IHJkYXRhID0gc2VsZi5yZWFkLmFzX3JlZigpLmxvY2soKS51bndyYXAoKTsKKyAgICAgICAgbGV0IG1heF9ieXRlcyA9IGNtcDo6bWluKHJkYXRhLmNhcCwgYnVmLmxlbigpKTsKKyAgICAgICAgcmRhdGEuYnVmWy4ubWF4X2J5dGVzXS5jbG9uZV9mcm9tX3NsaWNlKCZidWZbLi5tYXhfYnl0ZXNdKTsKKyAgICAgICAgcmRhdGEuaWR4ID0gbWF4X2J5dGVzOworICAgICAgICBtYXhfYnl0ZXMKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIGEgY29weSBvZiB0aGUgYnl0ZXMgaGVsZCBieSB0aGUgaW50ZXJuYWwgd3JpdGUgYnVmZmVyLgorICAgIC8vLyBSZXR1cm5zIGFuIGVtcHR5IHZlY3RvciBpZiBubyBieXRlcyB3ZXJlIHdyaXR0ZW4uCisgICAgcHViIGZuIHdyaXRlX2J5dGVzKCZzZWxmKSAtPiBWZWM8dTg+IHsKKyAgICAgICAgbGV0IHdkYXRhID0gc2VsZi53cml0ZS5hc19yZWYoKS5sb2NrKCkudW53cmFwKCk7CisgICAgICAgIGxldCBtdXQgYnVmID0gdmVjIVswdTg7IHdkYXRhLnBvc107CisgICAgICAgIGJ1Zi5jb3B5X2Zyb21fc2xpY2UoJndkYXRhLmJ1ZlsuLndkYXRhLnBvc10pOworICAgICAgICBidWYKKyAgICB9CisKKyAgICAvLy8gUmVzZXRzIHRoZSBpbnRlcm5hbCB3cml0ZSBidWZmZXIsIG1ha2luZyBpdCBzZWVtIGxpa2Ugbm8gYnl0ZXMgd2VyZQorICAgIC8vLyB3cml0dGVuLiBDYWxsaW5nIGB3cml0ZV9idWZmZXJgIGFmdGVyIHRoaXMgcmV0dXJucyBhbiBlbXB0eSB2ZWN0b3IuCisgICAgcHViIGZuIGVtcHR5X3dyaXRlX2J1ZmZlcigmbXV0IHNlbGYpIHsKKyAgICAgICAgbGV0IG11dCB3ZGF0YSA9IHNlbGYud3JpdGUuYXNfcmVmKCkubG9jaygpLnVud3JhcCgpOworICAgICAgICB3ZGF0YS5wb3MgPSAwOworICAgIH0KKworICAgIC8vLyBPdmVyd3JpdGVzIHRoZSBjb250ZW50cyBvZiB0aGUgcmVhZCBidWZmZXIgd2l0aCB0aGUgY29udGVudHMgb2YgdGhlCisgICAgLy8vIHdyaXRlIGJ1ZmZlci4gVGhlIHdyaXRlIGJ1ZmZlciBpcyBlbXB0aWVkIGFmdGVyIHRoaXMgb3BlcmF0aW9uLgorICAgIHB1YiBmbiBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlcigmbXV0IHNlbGYpIHsKKyAgICAgICAgLy8gRklYTUU6IHJlZG8gdGhpcyBlbnRpcmUgbWV0aG9kCisgICAgICAgIGxldCBidWYgPSB7CisgICAgICAgICAgICBsZXQgd2RhdGEgPSBzZWxmLndyaXRlLmFzX3JlZigpLmxvY2soKS51bndyYXAoKTsKKyAgICAgICAgICAgIGxldCBiID0gJndkYXRhLmJ1ZlsuLndkYXRhLnBvc107CisgICAgICAgICAgICBsZXQgbXV0IGJfcmV0ID0gdmVjIVswOyBiLmxlbigpXTsKKyAgICAgICAgICAgIGJfcmV0LmNvcHlfZnJvbV9zbGljZShiKTsKKyAgICAgICAgICAgIGJfcmV0CisgICAgICAgIH07CisKKyAgICAgICAgbGV0IGJ5dGVzX2NvcGllZCA9IHNlbGYuc2V0X3JlYWRhYmxlX2J5dGVzKCZidWYpOworICAgICAgICBhc3NlcnRfZXEhKGJ5dGVzX2NvcGllZCwgYnVmLmxlbigpKTsKKworICAgICAgICBzZWxmLmVtcHR5X3dyaXRlX2J1ZmZlcigpOworICAgIH0KK30KKworaW1wbCBUSW9DaGFubmVsIGZvciBUQnVmZmVyQ2hhbm5lbCB7CisgICAgZm4gc3BsaXQoc2VsZikgLT4gOjpSZXN1bHQ8KFJlYWRIYWxmPFNlbGY+LCBXcml0ZUhhbGY8U2VsZj4pPgorICAgIHdoZXJlCisgICAgICAgIFNlbGY6IFNpemVkLAorICAgIHsKKyAgICAgICAgT2soKAorICAgICAgICAgICAgUmVhZEhhbGYgeworICAgICAgICAgICAgICAgIGhhbmRsZTogVEJ1ZmZlckNoYW5uZWwgeworICAgICAgICAgICAgICAgICAgICByZWFkOiBzZWxmLnJlYWQuY2xvbmUoKSwKKyAgICAgICAgICAgICAgICAgICAgd3JpdGU6IHNlbGYud3JpdGUuY2xvbmUoKSwKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIFdyaXRlSGFsZiB7CisgICAgICAgICAgICAgICAgaGFuZGxlOiBUQnVmZmVyQ2hhbm5lbCB7CisgICAgICAgICAgICAgICAgICAgIHJlYWQ6IHNlbGYucmVhZC5jbG9uZSgpLAorICAgICAgICAgICAgICAgICAgICB3cml0ZTogc2VsZi53cml0ZS5jbG9uZSgpLAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICB9LAorICAgICAgICApKQorICAgIH0KK30KKworaW1wbCBpbzo6UmVhZCBmb3IgVEJ1ZmZlckNoYW5uZWwgeworICAgIGZuIHJlYWQoJm11dCBzZWxmLCBidWY6ICZtdXQgW3U4XSkgLT4gaW86OlJlc3VsdDx1c2l6ZT4geworICAgICAgICBsZXQgbXV0IHJkYXRhID0gc2VsZi5yZWFkLmFzX3JlZigpLmxvY2soKS51bndyYXAoKTsKKyAgICAgICAgbGV0IG5yZWFkID0gY21wOjptaW4oYnVmLmxlbigpLCByZGF0YS5pZHggLSByZGF0YS5wb3MpOworICAgICAgICBidWZbLi5ucmVhZF0uY2xvbmVfZnJvbV9zbGljZSgmcmRhdGEuYnVmW3JkYXRhLnBvcy4ucmRhdGEucG9zICsgbnJlYWRdKTsKKyAgICAgICAgcmRhdGEucG9zICs9IG5yZWFkOworICAgICAgICBPayhucmVhZCkKKyAgICB9Cit9CisKK2ltcGwgaW86OldyaXRlIGZvciBUQnVmZmVyQ2hhbm5lbCB7CisgICAgZm4gd3JpdGUoJm11dCBzZWxmLCBidWY6ICZbdThdKSAtPiBpbzo6UmVzdWx0PHVzaXplPiB7CisgICAgICAgIGxldCBtdXQgd2RhdGEgPSBzZWxmLndyaXRlLmFzX3JlZigpLmxvY2soKS51bndyYXAoKTsKKyAgICAgICAgbGV0IG53cml0ZSA9IGNtcDo6bWluKGJ1Zi5sZW4oKSwgd2RhdGEuY2FwIC0gd2RhdGEucG9zKTsKKyAgICAgICAgbGV0IChzdGFydCwgZW5kKSA9ICh3ZGF0YS5wb3MsIHdkYXRhLnBvcyArIG53cml0ZSk7CisgICAgICAgIHdkYXRhLmJ1ZltzdGFydC4uZW5kXS5jbG9uZV9mcm9tX3NsaWNlKCZidWZbLi5ud3JpdGVdKTsKKyAgICAgICAgd2RhdGEucG9zICs9IG53cml0ZTsKKyAgICAgICAgT2sobndyaXRlKQorICAgIH0KKworICAgIGZuIGZsdXNoKCZtdXQgc2VsZikgLT4gaW86OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkgLy8gbm90aGluZyB0byBkbyBvbiBmbHVzaAorICAgIH0KK30KKworI1tjZmcodGVzdCldCittb2QgdGVzdHMgeworICAgIHVzZSBzdGQ6OmlvOjp7UmVhZCwgV3JpdGV9OworCisgICAgdXNlIHN1cGVyOjpUQnVmZmVyQ2hhbm5lbDsKKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2VtcHR5X3dyaXRlX2J1ZmZlcigpIHsKKyAgICAgICAgbGV0IG11dCB0ID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMCwgMSk7CisKKyAgICAgICAgbGV0IGJ5dGVzX3RvX3dyaXRlOiBbdTg7IDFdID0gWzB4MDFdOworICAgICAgICBsZXQgcmVzdWx0ID0gdC53cml0ZSgmYnl0ZXNfdG9fd3JpdGUpOworICAgICAgICBhc3NlcnRfZXEhKHJlc3VsdC51bndyYXAoKSwgMSk7CisgICAgICAgIGFzc2VydF9lcSEoJnQud3JpdGVfYnl0ZXMoKSwgJmJ5dGVzX3RvX3dyaXRlKTsKKworICAgICAgICB0LmVtcHR5X3dyaXRlX2J1ZmZlcigpOworICAgICAgICBhc3NlcnRfZXEhKHQud3JpdGVfYnl0ZXMoKS5sZW4oKSwgMCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfYWNjZXB0X3dyaXRlc19hZnRlcl9idWZmZXJfZW1wdGllZCgpIHsKKyAgICAgICAgbGV0IG11dCB0ID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMCwgMik7CisKKyAgICAgICAgbGV0IGJ5dGVzX3RvX3dyaXRlOiBbdTg7IDJdID0gWzB4MDEsIDB4MDJdOworCisgICAgICAgIC8vIGZpcnN0IHdyaXRlIChhbGwgYnl0ZXMgd3JpdHRlbikKKyAgICAgICAgbGV0IHJlc3VsdCA9IHQud3JpdGUoJmJ5dGVzX3RvX3dyaXRlKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZXN1bHQudW53cmFwKCksIDIpOworICAgICAgICBhc3NlcnRfZXEhKCZ0LndyaXRlX2J5dGVzKCksICZieXRlc190b193cml0ZSk7CisKKyAgICAgICAgLy8gdHJ5IHdyaXRlIGFnYWluIChub3RoaW5nIHNob3VsZCBiZSB3cml0dGVuKQorICAgICAgICBsZXQgcmVzdWx0ID0gdC53cml0ZSgmYnl0ZXNfdG9fd3JpdGUpOworICAgICAgICBhc3NlcnRfZXEhKHJlc3VsdC51bndyYXAoKSwgMCk7CisgICAgICAgIGFzc2VydF9lcSEoJnQud3JpdGVfYnl0ZXMoKSwgJmJ5dGVzX3RvX3dyaXRlKTsgLy8gc3RpbGwgdGhlIHNhbWUgYXMgYmVmb3JlCisKKyAgICAgICAgLy8gbm93IHJlc2V0IHRoZSBidWZmZXIKKyAgICAgICAgdC5lbXB0eV93cml0ZV9idWZmZXIoKTsKKyAgICAgICAgYXNzZXJ0X2VxISh0LndyaXRlX2J5dGVzKCkubGVuKCksIDApOworCisgICAgICAgIC8vIG5vdyB0cnkgd3JpdGUgYWdhaW4gLSB0aGUgd3JpdGUgc2hvdWxkIHN1Y2NlZWQKKyAgICAgICAgbGV0IHJlc3VsdCA9IHQud3JpdGUoJmJ5dGVzX3RvX3dyaXRlKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZXN1bHQudW53cmFwKCksIDIpOworICAgICAgICBhc3NlcnRfZXEhKCZ0LndyaXRlX2J5dGVzKCksICZieXRlc190b193cml0ZSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfYWNjZXB0X211bHRpcGxlX3dyaXRlc191bnRpbF9idWZmZXJfaXNfZnVsbCgpIHsKKyAgICAgICAgbGV0IG11dCB0ID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMCwgMTApOworCisgICAgICAgIC8vIGZpcnN0IHdyaXRlIChhbGwgYnl0ZXMgd3JpdHRlbikKKyAgICAgICAgbGV0IGJ5dGVzX3RvX3dyaXRlXzA6IFt1ODsgMl0gPSBbMHgwMSwgMHg0MV07CisgICAgICAgIGxldCB3cml0ZV8wX3Jlc3VsdCA9IHQud3JpdGUoJmJ5dGVzX3RvX3dyaXRlXzApOworICAgICAgICBhc3NlcnRfZXEhKHdyaXRlXzBfcmVzdWx0LnVud3JhcCgpLCAyKTsKKyAgICAgICAgYXNzZXJ0X2VxISh0LndyaXRlX2J5dGVzKCksICZieXRlc190b193cml0ZV8wKTsKKworICAgICAgICAvLyBzZWNvbmQgd3JpdGUgKGFsbCBieXRlcyB3cml0dGVuLCBzdGFydGluZyBhdCBpbmRleCAyKQorICAgICAgICBsZXQgYnl0ZXNfdG9fd3JpdGVfMTogW3U4OyA3XSA9IFsweDI0LCAweDQxLCAweDMyLCAweDMzLCAweDExLCAweDk4LCAweEFGXTsKKyAgICAgICAgbGV0IHdyaXRlXzFfcmVzdWx0ID0gdC53cml0ZSgmYnl0ZXNfdG9fd3JpdGVfMSk7CisgICAgICAgIGFzc2VydF9lcSEod3JpdGVfMV9yZXN1bHQudW53cmFwKCksIDcpOworICAgICAgICBhc3NlcnRfZXEhKCZ0LndyaXRlX2J5dGVzKClbMi4uXSwgJmJ5dGVzX3RvX3dyaXRlXzEpOworCisgICAgICAgIC8vIHRoaXJkIHdyaXRlIChvbmx5IDEgYnl0ZSB3cml0dGVuIC0gdGhhdCdzIGFsbCB3ZSBoYXZlIHNwYWNlIGZvcikKKyAgICAgICAgbGV0IGJ5dGVzX3RvX3dyaXRlXzI6IFt1ODsgM10gPSBbMHhCRiwgMHhEQSwgMHg5OF07CisgICAgICAgIGxldCB3cml0ZV8yX3Jlc3VsdCA9IHQud3JpdGUoJmJ5dGVzX3RvX3dyaXRlXzIpOworICAgICAgICBhc3NlcnRfZXEhKHdyaXRlXzJfcmVzdWx0LnVud3JhcCgpLCAxKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmdC53cml0ZV9ieXRlcygpWzkuLl0sICZieXRlc190b193cml0ZV8yWzAuLjFdKTsgLy8gaG93IGRvZXMgdGhpcyBzeW50YXggd29yaz8hCisKKyAgICAgICAgLy8gZm91cnRoIHdyaXRlIChubyB3cml0ZXMgYXJlIGFjY2VwdGVkKQorICAgICAgICBsZXQgYnl0ZXNfdG9fd3JpdGVfMzogW3U4OyAzXSA9IFsweEJGLCAweEFBLCAweEZEXTsKKyAgICAgICAgbGV0IHdyaXRlXzNfcmVzdWx0ID0gdC53cml0ZSgmYnl0ZXNfdG9fd3JpdGVfMyk7CisgICAgICAgIGFzc2VydF9lcSEod3JpdGVfM19yZXN1bHQudW53cmFwKCksIDApOworCisgICAgICAgIC8vIGNoZWNrIHRoZSBmdWxsIHdyaXRlIGJ1ZmZlcgorICAgICAgICBsZXQgbXV0IGV4cGVjdGVkOiBWZWM8dTg+ID0gVmVjOjp3aXRoX2NhcGFjaXR5KDEwKTsKKyAgICAgICAgZXhwZWN0ZWQuZXh0ZW5kX2Zyb21fc2xpY2UoJmJ5dGVzX3RvX3dyaXRlXzApOworICAgICAgICBleHBlY3RlZC5leHRlbmRfZnJvbV9zbGljZSgmYnl0ZXNfdG9fd3JpdGVfMSk7CisgICAgICAgIGV4cGVjdGVkLmV4dGVuZF9mcm9tX3NsaWNlKCZieXRlc190b193cml0ZV8yWzAuLjFdKTsKKyAgICAgICAgYXNzZXJ0X2VxISh0LndyaXRlX2J5dGVzKCksICZleHBlY3RlZFsuLl0pOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2VtcHR5X3JlYWRfYnVmZmVyKCkgeworICAgICAgICBsZXQgbXV0IHQgPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgxLCAwKTsKKworICAgICAgICBsZXQgYnl0ZXNfdG9fcmVhZDogW3U4OyAxXSA9IFsweDAxXTsKKyAgICAgICAgbGV0IHJlc3VsdCA9IHQuc2V0X3JlYWRhYmxlX2J5dGVzKCZieXRlc190b19yZWFkKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZXN1bHQsIDEpOworICAgICAgICBhc3NlcnRfZXEhKHQucmVhZF9ieXRlcygpLCAmYnl0ZXNfdG9fcmVhZCk7CisKKyAgICAgICAgdC5lbXB0eV9yZWFkX2J1ZmZlcigpOworICAgICAgICBhc3NlcnRfZXEhKHQucmVhZF9ieXRlcygpLmxlbigpLCAwKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9hbGxvd19yZWFkYWJsZV9ieXRlc190b19iZV9zZXRfYWZ0ZXJfcmVhZF9idWZmZXJfZW1wdGllZCgpIHsKKyAgICAgICAgbGV0IG11dCB0ID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMSwgMCk7CisKKyAgICAgICAgbGV0IGJ5dGVzX3RvX3JlYWRfMDogW3U4OyAxXSA9IFsweDAxXTsKKyAgICAgICAgbGV0IHJlc3VsdCA9IHQuc2V0X3JlYWRhYmxlX2J5dGVzKCZieXRlc190b19yZWFkXzApOworICAgICAgICBhc3NlcnRfZXEhKHJlc3VsdCwgMSk7CisgICAgICAgIGFzc2VydF9lcSEodC5yZWFkX2J5dGVzKCksICZieXRlc190b19yZWFkXzApOworCisgICAgICAgIHQuZW1wdHlfcmVhZF9idWZmZXIoKTsKKyAgICAgICAgYXNzZXJ0X2VxISh0LnJlYWRfYnl0ZXMoKS5sZW4oKSwgMCk7CisKKyAgICAgICAgbGV0IGJ5dGVzX3RvX3JlYWRfMTogW3U4OyAxXSA9IFsweDAyXTsKKyAgICAgICAgbGV0IHJlc3VsdCA9IHQuc2V0X3JlYWRhYmxlX2J5dGVzKCZieXRlc190b19yZWFkXzEpOworICAgICAgICBhc3NlcnRfZXEhKHJlc3VsdCwgMSk7CisgICAgICAgIGFzc2VydF9lcSEodC5yZWFkX2J5dGVzKCksICZieXRlc190b19yZWFkXzEpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2FjY2VwdF9tdWx0aXBsZV9yZWFkc191bnRpbF9hbGxfYnl0ZXNfcmVhZCgpIHsKKyAgICAgICAgbGV0IG11dCB0ID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMTAsIDApOworCisgICAgICAgIGxldCByZWFkYWJsZV9ieXRlczogW3U4OyAxMF0gPSBbMHhGRiwgMHhFRSwgMHhERCwgMHhDQywgMHhCQiwgMHgwMCwgMHgxQSwgMHgyQiwgMHgzQywgMHg0RF07CisKKyAgICAgICAgLy8gY2hlY2sgdGhhdCB3ZSdyZSBhYmxlIHRvIHNldCB0aGUgYnl0ZXMgdG8gYmUgcmVhZAorICAgICAgICBsZXQgcmVzdWx0ID0gdC5zZXRfcmVhZGFibGVfYnl0ZXMoJnJlYWRhYmxlX2J5dGVzKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZXN1bHQsIDEwKTsKKyAgICAgICAgYXNzZXJ0X2VxISh0LnJlYWRfYnl0ZXMoKSwgJnJlYWRhYmxlX2J5dGVzKTsKKworICAgICAgICAvLyBmaXJzdCByZWFkCisgICAgICAgIGxldCBtdXQgcmVhZF9idWZfMCA9IHZlYyFbMDsgNV07CisgICAgICAgIGxldCByZWFkX3Jlc3VsdCA9IHQucmVhZCgmbXV0IHJlYWRfYnVmXzApOworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfcmVzdWx0LnVud3JhcCgpLCA1KTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX2J1Zl8wLmFzX3NsaWNlKCksICYocmVhZGFibGVfYnl0ZXNbMC4uNV0pKTsKKworICAgICAgICAvLyBzZWNvbmQgcmVhZAorICAgICAgICBsZXQgbXV0IHJlYWRfYnVmXzEgPSB2ZWMhWzA7IDRdOworICAgICAgICBsZXQgcmVhZF9yZXN1bHQgPSB0LnJlYWQoJm11dCByZWFkX2J1Zl8xKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX3Jlc3VsdC51bndyYXAoKSwgNCk7CisgICAgICAgIGFzc2VydF9lcSEocmVhZF9idWZfMS5hc19zbGljZSgpLCAmKHJlYWRhYmxlX2J5dGVzWzUuLjldKSk7CisKKyAgICAgICAgLy8gdGhpcmQgcmVhZCAob25seSAxIGJ5dGUgcmVtYWlucyB0byBiZSByZWFkKQorICAgICAgICBsZXQgbXV0IHJlYWRfYnVmXzIgPSB2ZWMhWzA7IDNdOworICAgICAgICBsZXQgcmVhZF9yZXN1bHQgPSB0LnJlYWQoJm11dCByZWFkX2J1Zl8yKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX3Jlc3VsdC51bndyYXAoKSwgMSk7CisgICAgICAgIHJlYWRfYnVmXzIudHJ1bmNhdGUoMSk7IC8vIEZJWE1FOiBkb2VzIHRoZSBjYWxsZXIgaGF2ZSB0byBkbyB0aGlzPworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfYnVmXzIuYXNfc2xpY2UoKSwgJihyZWFkYWJsZV9ieXRlc1s5Li5dKSk7CisKKyAgICAgICAgLy8gZm91cnRoIHJlYWQgKG5vdGhpbmcgc2hvdWxkIGJlIHJlYWRhYmxlKQorICAgICAgICBsZXQgbXV0IHJlYWRfYnVmXzMgPSB2ZWMhWzA7IDEwXTsKKyAgICAgICAgbGV0IHJlYWRfcmVzdWx0ID0gdC5yZWFkKCZtdXQgcmVhZF9idWZfMyk7CisgICAgICAgIGFzc2VydF9lcSEocmVhZF9yZXN1bHQudW53cmFwKCksIDApOworICAgICAgICByZWFkX2J1Zl8zLnRydW5jYXRlKDApOworCisgICAgICAgIC8vIGNoZWNrIHRoYXQgYWxsIHRoZSBieXRlcyB3ZSByZWNlaXZlZCBtYXRjaCB0aGUgb3JpZ2luYWwgKGFnYWluISkKKyAgICAgICAgbGV0IG11dCBieXRlc19yZWFkID0gVmVjOjp3aXRoX2NhcGFjaXR5KDEwKTsKKyAgICAgICAgYnl0ZXNfcmVhZC5leHRlbmRfZnJvbV9zbGljZSgmcmVhZF9idWZfMCk7CisgICAgICAgIGJ5dGVzX3JlYWQuZXh0ZW5kX2Zyb21fc2xpY2UoJnJlYWRfYnVmXzEpOworICAgICAgICBieXRlc19yZWFkLmV4dGVuZF9mcm9tX3NsaWNlKCZyZWFkX2J1Zl8yKTsKKyAgICAgICAgYnl0ZXNfcmVhZC5leHRlbmRfZnJvbV9zbGljZSgmcmVhZF9idWZfMyk7CisgICAgICAgIGFzc2VydF9lcSEoJmJ5dGVzX3JlYWQsICZyZWFkYWJsZV9ieXRlcyk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfYWxsb3dfcmVhZHNfdG9fc3VjY2VlZF9hZnRlcl9yZWFkX2J1ZmZlcl9yZXBsZW5pc2hlZCgpIHsKKyAgICAgICAgbGV0IG11dCB0ID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMywgMCk7CisKKyAgICAgICAgbGV0IHJlYWRhYmxlX2J5dGVzXzA6IFt1ODsgM10gPSBbMHgwMiwgMHhBQiwgMHgzM107CisKKyAgICAgICAgLy8gY2hlY2sgdGhhdCB3ZSdyZSBhYmxlIHRvIHNldCB0aGUgYnl0ZXMgdG8gYmUgcmVhZAorICAgICAgICBsZXQgcmVzdWx0ID0gdC5zZXRfcmVhZGFibGVfYnl0ZXMoJnJlYWRhYmxlX2J5dGVzXzApOworICAgICAgICBhc3NlcnRfZXEhKHJlc3VsdCwgMyk7CisgICAgICAgIGFzc2VydF9lcSEodC5yZWFkX2J5dGVzKCksICZyZWFkYWJsZV9ieXRlc18wKTsKKworICAgICAgICBsZXQgbXV0IHJlYWRfYnVmID0gdmVjIVswOyA0XTsKKworICAgICAgICAvLyBkcmFpbiB0aGUgcmVhZCBidWZmZXIKKyAgICAgICAgbGV0IHJlYWRfcmVzdWx0ID0gdC5yZWFkKCZtdXQgcmVhZF9idWYpOworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfcmVzdWx0LnVud3JhcCgpLCAzKTsKKyAgICAgICAgYXNzZXJ0X2VxISh0LnJlYWRfYnl0ZXMoKSwgJnJlYWRfYnVmWzAuLjNdKTsKKworICAgICAgICAvLyBjaGVjayB0aGF0IGEgc3Vic2VxdWVudCByZWFkIGZhaWxzCisgICAgICAgIGxldCByZWFkX3Jlc3VsdCA9IHQucmVhZCgmbXV0IHJlYWRfYnVmKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX3Jlc3VsdC51bndyYXAoKSwgMCk7CisKKyAgICAgICAgLy8gd2UgZG9uJ3QgbW9kaWZ5IHRoZSByZWFkIGJ1ZmZlciBvbiBmYWlsdXJlCisgICAgICAgIGxldCBtdXQgZXhwZWN0ZWRfYnl0ZXMgPSBWZWM6OndpdGhfY2FwYWNpdHkoNCk7CisgICAgICAgIGV4cGVjdGVkX2J5dGVzLmV4dGVuZF9mcm9tX3NsaWNlKCZyZWFkYWJsZV9ieXRlc18wKTsKKyAgICAgICAgZXhwZWN0ZWRfYnl0ZXMucHVzaCgweDAwKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmcmVhZF9idWYsICZleHBlY3RlZF9ieXRlcyk7CisKKyAgICAgICAgLy8gcmVwbGVuaXNoIHRoZSByZWFkIGJ1ZmZlciBhZ2FpbgorICAgICAgICBsZXQgcmVhZGFibGVfYnl0ZXNfMTogW3U4OyAyXSA9IFsweDkxLCAweEFBXTsKKworICAgICAgICAvLyBjaGVjayB0aGF0IHdlJ3JlIGFibGUgdG8gc2V0IHRoZSBieXRlcyB0byBiZSByZWFkCisgICAgICAgIGxldCByZXN1bHQgPSB0LnNldF9yZWFkYWJsZV9ieXRlcygmcmVhZGFibGVfYnl0ZXNfMSk7CisgICAgICAgIGFzc2VydF9lcSEocmVzdWx0LCAyKTsKKyAgICAgICAgYXNzZXJ0X2VxISh0LnJlYWRfYnl0ZXMoKSwgJnJlYWRhYmxlX2J5dGVzXzEpOworCisgICAgICAgIC8vIHJlYWQgYWdhaW4KKyAgICAgICAgbGV0IHJlYWRfcmVzdWx0ID0gdC5yZWFkKCZtdXQgcmVhZF9idWYpOworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfcmVzdWx0LnVud3JhcCgpLCAyKTsKKyAgICAgICAgYXNzZXJ0X2VxISh0LnJlYWRfYnl0ZXMoKSwgJnJlYWRfYnVmWzAuLjJdKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcnMvc3JjL3RyYW5zcG9ydC9tb2QucnMgYi9saWIvcnMvc3JjL3RyYW5zcG9ydC9tb2QucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYyMzM1MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy9zcmMvdHJhbnNwb3J0L21vZC5ycwpAQCAtMCwwICsxLDI5MSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyEgVHlwZXMgdXNlZCB0byBzZW5kIGFuZCByZWNlaXZlIGJ5dGVzIG92ZXIgYW4gSS9PIGNoYW5uZWwuCisvLyEKKy8vISBUaGUgY29yZSB0eXBlcyBhcmUgdGhlIGBUUmVhZFRyYW5zcG9ydGAsIGBUV3JpdGVUcmFuc3BvcnRgIGFuZCB0aGUKKy8vISBgVElvQ2hhbm5lbGAgdHJhaXRzLCB0aHJvdWdoIHdoaWNoIGBUSW5wdXRQcm90b2NvbGAgb3IKKy8vISBgVE91dHB1dFByb3RvY29sYCBjYW4gcmVjZWl2ZSBhbmQgc2VuZCBwcmltaXRpdmVzIG92ZXIgdGhlIHdpcmUuIFdoaWxlCisvLyEgYFRJbnB1dFByb3RvY29sYCBhbmQgYFRPdXRwdXRQcm90b2NvbGAgaW5zdGFuY2VzIGRlYWwgd2l0aCBsYW5ndWFnZSBwcmltaXRpdmVzCisvLyEgdGhlIHR5cGVzIGluIHRoaXMgbW9kdWxlIHVuZGVyc3RhbmQgb25seSBieXRlcy4KKwordXNlIHN0ZDo6aW87Cit1c2Ugc3RkOjppbzo6e1JlYWQsIFdyaXRlfTsKK3VzZSBzdGQ6Om9wczo6e0RlcmVmLCBEZXJlZk11dH07CisKKyNbY2ZnKHRlc3QpXQorbWFjcm9fcnVsZXMhIGFzc2VydF9lcV90cmFuc3BvcnRfbnVtX3dyaXR0ZW5fYnl0ZXMgeworICAgICgkdHJhbnNwb3J0OmlkZW50LCAkbnVtX3dyaXR0ZW5fYnl0ZXM6ZXhwcikgPT4ge3sKKyAgICAgICAgYXNzZXJ0X2VxISgkdHJhbnNwb3J0LmNoYW5uZWwud3JpdGVfYnl0ZXMoKS5sZW4oKSwgJG51bV93cml0dGVuX2J5dGVzKTsKKyAgICB9fTsKK30KKworI1tjZmcodGVzdCldCittYWNyb19ydWxlcyEgYXNzZXJ0X2VxX3RyYW5zcG9ydF93cml0dGVuX2J5dGVzIHsKKyAgICAoJHRyYW5zcG9ydDppZGVudCwgJGV4cGVjdGVkX2J5dGVzOmlkZW50KSA9PiB7eworICAgICAgICBhc3NlcnRfZXEhKCR0cmFuc3BvcnQuY2hhbm5lbC53cml0ZV9ieXRlcygpLCAmJGV4cGVjdGVkX2J5dGVzKTsKKyAgICB9fTsKK30KKworbW9kIGJ1ZmZlcmVkOworbW9kIGZyYW1lZDsKK21vZCBtZW07Cittb2Qgc29ja2V0OworCitwdWIgdXNlIHNlbGY6OmJ1ZmZlcmVkOjp7CisgICAgVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydCwgVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydEZhY3RvcnksIFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0LAorICAgIFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0RmFjdG9yeSwKK307CitwdWIgdXNlIHNlbGY6OmZyYW1lZDo6eworICAgIFRGcmFtZWRSZWFkVHJhbnNwb3J0LCBURnJhbWVkUmVhZFRyYW5zcG9ydEZhY3RvcnksIFRGcmFtZWRXcml0ZVRyYW5zcG9ydCwKKyAgICBURnJhbWVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5LAorfTsKK3B1YiB1c2Ugc2VsZjo6bWVtOjpUQnVmZmVyQ2hhbm5lbDsKK3B1YiB1c2Ugc2VsZjo6c29ja2V0OjpUVGNwQ2hhbm5lbDsKKworLy8vIElkZW50aWZpZXMgYSB0cmFuc3BvcnQgdXNlZCBieSBhIGBUSW5wdXRQcm90b2NvbGAgdG8gcmVjZWl2ZSBieXRlcy4KK3B1YiB0cmFpdCBUUmVhZFRyYW5zcG9ydDogUmVhZCB7fQorCisvLy8gSGVscGVyIHR5cGUgdXNlZCBieSBhIHNlcnZlciB0byBjcmVhdGUgYFRSZWFkVHJhbnNwb3J0YCBpbnN0YW5jZXMgZm9yCisvLy8gYWNjZXB0ZWQgY2xpZW50IGNvbm5lY3Rpb25zLgorcHViIHRyYWl0IFRSZWFkVHJhbnNwb3J0RmFjdG9yeSB7CisgICAgLy8vIENyZWF0ZSBhIGBUVHJhbnNwb3J0YCB0aGF0IHdyYXBzIGEgY2hhbm5lbCBvdmVyIHdoaWNoIGJ5dGVzIGFyZSB0byBiZSByZWFkLgorICAgIGZuIGNyZWF0ZSgmc2VsZiwgY2hhbm5lbDogQm94PFJlYWQgKyBTZW5kPikgLT4gQm94PFRSZWFkVHJhbnNwb3J0ICsgU2VuZD47Cit9CisKKy8vLyBJZGVudGlmaWVzIGEgdHJhbnNwb3J0IHVzZWQgYnkgYFRPdXRwdXRQcm90b2NvbGAgdG8gc2VuZCBieXRlcy4KK3B1YiB0cmFpdCBUV3JpdGVUcmFuc3BvcnQ6IFdyaXRlIHt9CisKKy8vLyBIZWxwZXIgdHlwZSB1c2VkIGJ5IGEgc2VydmVyIHRvIGNyZWF0ZSBgVFdyaXRlVHJhbnNwb3J0YCBpbnN0YW5jZXMgZm9yCisvLy8gYWNjZXB0ZWQgY2xpZW50IGNvbm5lY3Rpb25zLgorcHViIHRyYWl0IFRXcml0ZVRyYW5zcG9ydEZhY3RvcnkgeworICAgIC8vLyBDcmVhdGUgYSBgVFRyYW5zcG9ydGAgdGhhdCB3cmFwcyBhIGNoYW5uZWwgb3ZlciB3aGljaCBieXRlcyBhcmUgdG8gYmUgc2VudC4KKyAgICBmbiBjcmVhdGUoJnNlbGYsIGNoYW5uZWw6IEJveDxXcml0ZSArIFNlbmQ+KSAtPiBCb3g8VFdyaXRlVHJhbnNwb3J0ICsgU2VuZD47Cit9CisKK2ltcGw8VD4gVFJlYWRUcmFuc3BvcnQgZm9yIFQgd2hlcmUgVDogUmVhZCB7fQorCitpbXBsPFQ+IFRXcml0ZVRyYW5zcG9ydCBmb3IgVCB3aGVyZSBUOiBXcml0ZSB7fQorCisvLyBGSVhNRTogaW1wbGVtZW50IHRoZSBEZWJ1ZyB0cmFpdCBmb3IgYm94ZWQgdHJhbnNwb3J0cworCitpbXBsPFQ+IFRSZWFkVHJhbnNwb3J0RmFjdG9yeSBmb3IgQm94PFQ+Cit3aGVyZQorICAgIFQ6IFRSZWFkVHJhbnNwb3J0RmFjdG9yeSArID9TaXplZCwKK3sKKyAgICBmbiBjcmVhdGUoJnNlbGYsIGNoYW5uZWw6IEJveDxSZWFkICsgU2VuZD4pIC0+IEJveDxUUmVhZFRyYW5zcG9ydCArIFNlbmQ+IHsKKyAgICAgICAgKCoqc2VsZikuY3JlYXRlKGNoYW5uZWwpCisgICAgfQorfQorCitpbXBsPFQ+IFRXcml0ZVRyYW5zcG9ydEZhY3RvcnkgZm9yIEJveDxUPgord2hlcmUKKyAgICBUOiBUV3JpdGVUcmFuc3BvcnRGYWN0b3J5ICsgP1NpemVkLAoreworICAgIGZuIGNyZWF0ZSgmc2VsZiwgY2hhbm5lbDogQm94PFdyaXRlICsgU2VuZD4pIC0+IEJveDxUV3JpdGVUcmFuc3BvcnQgKyBTZW5kPiB7CisgICAgICAgICgqKnNlbGYpLmNyZWF0ZShjaGFubmVsKQorICAgIH0KK30KKworLy8vIElkZW50aWZpZXMgYSBzcGxpdHRhYmxlIGJpZGlyZWN0aW9uYWwgSS9PIGNoYW5uZWwgdXNlZCB0byBzZW5kIGFuZCByZWNlaXZlIGJ5dGVzLgorcHViIHRyYWl0IFRJb0NoYW5uZWw6IFJlYWQgKyBXcml0ZSB7CisgICAgLy8vIFNwbGl0IHRoZSBjaGFubmVsIGludG8gYSByZWFkYWJsZSBoYWxmIGFuZCBhIHdyaXRhYmxlIGhhbGYsIHdoZXJlIHRoZQorICAgIC8vLyByZWFkYWJsZSBoYWxmIGltcGxlbWVudHMgYGlvOjpSZWFkYCBhbmQgdGhlIHdyaXRhYmxlIGhhbGYgaW1wbGVtZW50cworICAgIC8vLyBgaW86OldyaXRlYC4gUmV0dXJucyBgTm9uZWAgaWYgdGhlIGNoYW5uZWwgd2FzIG5vdCBpbml0aWFsaXplZCwgb3IgaWYgaXQKKyAgICAvLy8gY2Fubm90IGJlIHNwbGl0IHNhZmVseS4KKyAgICAvLy8KKyAgICAvLy8gUmV0dXJuZWQgaGFsdmVzIG1heSBzaGFyZSB0aGUgdW5kZXJseWluZyBPUyBjaGFubmVsIG9yIGJ1ZmZlciByZXNvdXJjZXMuCisgICAgLy8vIEltcGxlbWVudGF0aW9ucyAqKnNob3VsZCBlbnN1cmUqKiB0aGF0IHRoZXNlIHR3byBoYWx2ZXMgY2FuIGJlIHNhZmVseQorICAgIC8vLyB1c2VkIGluZGVwZW5kZW50bHkgYnkgY29uY3VycmVudCB0aHJlYWRzLgorICAgIGZuIHNwbGl0KHNlbGYpIC0+IDo6UmVzdWx0PCg6OnRyYW5zcG9ydDo6UmVhZEhhbGY8U2VsZj4sIDo6dHJhbnNwb3J0OjpXcml0ZUhhbGY8U2VsZj4pPgorICAgIHdoZXJlCisgICAgICAgIFNlbGY6IFNpemVkOworfQorCisvLy8gVGhlIHJlYWRhYmxlIGhhbGYgb2YgYW4gb2JqZWN0IHJldHVybmVkIGZyb20gYFRJb0NoYW5uZWw6OnNwbGl0YC4KKyNbZGVyaXZlKERlYnVnKV0KK3B1YiBzdHJ1Y3QgUmVhZEhhbGY8Qz4KK3doZXJlCisgICAgQzogUmVhZCwKK3sKKyAgICBoYW5kbGU6IEMsCit9CisKKy8vLyBUaGUgd3JpdGFibGUgaGFsZiBvZiBhbiBvYmplY3QgcmV0dXJuZWQgZnJvbSBgVElvQ2hhbm5lbDo6c3BsaXRgLgorI1tkZXJpdmUoRGVidWcpXQorcHViIHN0cnVjdCBXcml0ZUhhbGY8Qz4KK3doZXJlCisgICAgQzogV3JpdGUsCit7CisgICAgaGFuZGxlOiBDLAorfQorCitpbXBsPEM+IFJlYWRIYWxmPEM+Cit3aGVyZQorICAgIEM6IFJlYWQsCit7CisgICAgLy8vIENyZWF0ZSBhIGBSZWFkSGFsZmAgYXNzb2NpYXRlZCB3aXRoIHJlYWRhYmxlIGBoYW5kbGVgCisgICAgcHViIGZuIG5ldyhoYW5kbGU6IEMpIC0+IFJlYWRIYWxmPEM+IHsKKyAgICAgICAgUmVhZEhhbGYgeyBoYW5kbGUgfQorICAgIH0KK30KKworaW1wbDxDPiBXcml0ZUhhbGY8Qz4KK3doZXJlCisgICAgQzogV3JpdGUsCit7CisgICAgLy8vIENyZWF0ZSBhIGBXcml0ZUhhbGZgIGFzc29jaWF0ZWQgd2l0aCB3cml0YWJsZSBgaGFuZGxlYAorICAgIHB1YiBmbiBuZXcoaGFuZGxlOiBDKSAtPiBXcml0ZUhhbGY8Qz4geworICAgICAgICBXcml0ZUhhbGYgeyBoYW5kbGUgfQorICAgIH0KK30KKworaW1wbDxDPiBSZWFkIGZvciBSZWFkSGFsZjxDPgord2hlcmUKKyAgICBDOiBSZWFkLAoreworICAgIGZuIHJlYWQoJm11dCBzZWxmLCBidWY6ICZtdXQgW3U4XSkgLT4gaW86OlJlc3VsdDx1c2l6ZT4geworICAgICAgICBzZWxmLmhhbmRsZS5yZWFkKGJ1ZikKKyAgICB9Cit9CisKK2ltcGw8Qz4gV3JpdGUgZm9yIFdyaXRlSGFsZjxDPgord2hlcmUKKyAgICBDOiBXcml0ZSwKK3sKKyAgICBmbiB3cml0ZSgmbXV0IHNlbGYsIGJ1ZjogJlt1OF0pIC0+IGlvOjpSZXN1bHQ8dXNpemU+IHsKKyAgICAgICAgc2VsZi5oYW5kbGUud3JpdGUoYnVmKQorICAgIH0KKworICAgIGZuIGZsdXNoKCZtdXQgc2VsZikgLT4gaW86OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmhhbmRsZS5mbHVzaCgpCisgICAgfQorfQorCitpbXBsPEM+IERlcmVmIGZvciBSZWFkSGFsZjxDPgord2hlcmUKKyAgICBDOiBSZWFkLAoreworICAgIHR5cGUgVGFyZ2V0ID0gQzsKKworICAgIGZuIGRlcmVmKCZzZWxmKSAtPiAmU2VsZjo6VGFyZ2V0IHsKKyAgICAgICAgJnNlbGYuaGFuZGxlCisgICAgfQorfQorCitpbXBsPEM+IERlcmVmTXV0IGZvciBSZWFkSGFsZjxDPgord2hlcmUKKyAgICBDOiBSZWFkLAoreworICAgIGZuIGRlcmVmX211dCgmbXV0IHNlbGYpIC0+ICZtdXQgQyB7CisgICAgICAgICZtdXQgc2VsZi5oYW5kbGUKKyAgICB9Cit9CisKK2ltcGw8Qz4gRGVyZWYgZm9yIFdyaXRlSGFsZjxDPgord2hlcmUKKyAgICBDOiBXcml0ZSwKK3sKKyAgICB0eXBlIFRhcmdldCA9IEM7CisKKyAgICBmbiBkZXJlZigmc2VsZikgLT4gJlNlbGY6OlRhcmdldCB7CisgICAgICAgICZzZWxmLmhhbmRsZQorICAgIH0KK30KKworaW1wbDxDPiBEZXJlZk11dCBmb3IgV3JpdGVIYWxmPEM+Cit3aGVyZQorICAgIEM6IFdyaXRlLAoreworICAgIGZuIGRlcmVmX211dCgmbXV0IHNlbGYpIC0+ICZtdXQgQyB7CisgICAgICAgICZtdXQgc2VsZi5oYW5kbGUKKyAgICB9Cit9CisKKyNbY2ZnKHRlc3QpXQorbW9kIHRlc3RzIHsKKworICAgIHVzZSBzdGQ6OmlvOjpDdXJzb3I7CisKKyAgICB1c2Ugc3VwZXI6Oio7CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9jcmVhdGVfdXNhYmxlX3JlYWRfY2hhbm5lbF9mcm9tX2NvbmNyZXRlX3JlYWRfdHlwZSgpIHsKKyAgICAgICAgbGV0IHIgPSBDdXJzb3I6Om5ldyhbMCwgMSwgMl0pOworICAgICAgICBsZXQgXyA9IFRCdWZmZXJlZFJlYWRUcmFuc3BvcnQ6Om5ldyhyKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9jcmVhdGVfdXNhYmxlX3JlYWRfY2hhbm5lbF9mcm9tX2JveGVkX3JlYWQoKSB7CisgICAgICAgIGxldCByOiBCb3g8UmVhZD4gPSBCb3g6Om5ldyhDdXJzb3I6Om5ldyhbMCwgMSwgMl0pKTsKKyAgICAgICAgbGV0IF8gPSBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0OjpuZXcocik7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfY3JlYXRlX3VzYWJsZV93cml0ZV9jaGFubmVsX2Zyb21fY29uY3JldGVfd3JpdGVfdHlwZSgpIHsKKyAgICAgICAgbGV0IHcgPSB2ZWMhWzB1ODsgMTBdOworICAgICAgICBsZXQgXyA9IFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0OjpuZXcodyk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfY3JlYXRlX3VzYWJsZV93cml0ZV9jaGFubmVsX2Zyb21fYm94ZWRfd3JpdGUoKSB7CisgICAgICAgIGxldCB3OiBCb3g8V3JpdGU+ID0gQm94OjpuZXcodmVjIVswdTg7IDEwXSk7CisgICAgICAgIGxldCBfID0gVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQ6Om5ldyh3KTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9jcmVhdGVfdXNhYmxlX3JlYWRfdHJhbnNwb3J0X2Zyb21fY29uY3JldGVfcmVhZF90cmFuc3BvcnQoKSB7CisgICAgICAgIGxldCByID0gQ3Vyc29yOjpuZXcoWzAsIDEsIDJdKTsKKyAgICAgICAgbGV0IG11dCB0ID0gVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydDo6bmV3KHIpOworICAgICAgICB0YWtlc19yZWFkX3RyYW5zcG9ydCgmbXV0IHQpCisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfY3JlYXRlX3VzYWJsZV9yZWFkX3RyYW5zcG9ydF9mcm9tX2JveGVkX3JlYWQoKSB7CisgICAgICAgIGxldCByID0gQ3Vyc29yOjpuZXcoWzAsIDEsIDJdKTsKKyAgICAgICAgbGV0IG11dCB0OiBCb3g8VFJlYWRUcmFuc3BvcnQ+ID0gQm94OjpuZXcoVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydDo6bmV3KHIpKTsKKyAgICAgICAgdGFrZXNfcmVhZF90cmFuc3BvcnQoJm11dCB0KQorICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2NyZWF0ZV91c2FibGVfd3JpdGVfdHJhbnNwb3J0X2Zyb21fY29uY3JldGVfd3JpdGVfdHJhbnNwb3J0KCkgeworICAgICAgICBsZXQgdyA9IHZlYyFbMHU4OyAxMF07CisgICAgICAgIGxldCBtdXQgdCA9IFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0OjpuZXcodyk7CisgICAgICAgIHRha2VzX3dyaXRlX3RyYW5zcG9ydCgmbXV0IHQpCisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfY3JlYXRlX3VzYWJsZV93cml0ZV90cmFuc3BvcnRfZnJvbV9ib3hlZF93cml0ZSgpIHsKKyAgICAgICAgbGV0IHcgPSB2ZWMhWzB1ODsgMTBdOworICAgICAgICBsZXQgbXV0IHQ6IEJveDxUV3JpdGVUcmFuc3BvcnQ+ID0gQm94OjpuZXcoVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQ6Om5ldyh3KSk7CisgICAgICAgIHRha2VzX3dyaXRlX3RyYW5zcG9ydCgmbXV0IHQpCisgICAgfQorCisgICAgZm4gdGFrZXNfcmVhZF90cmFuc3BvcnQ8Uj4odDogJm11dCBSKQorICAgIHdoZXJlCisgICAgICAgIFI6IFRSZWFkVHJhbnNwb3J0LAorICAgIHsKKyAgICAgICAgdC5ieXRlcygpOworICAgIH0KKworICAgIGZuIHRha2VzX3dyaXRlX3RyYW5zcG9ydDxXPih0OiAmbXV0IFcpCisgICAgd2hlcmUKKyAgICAgICAgVzogVFdyaXRlVHJhbnNwb3J0LAorICAgIHsKKyAgICAgICAgdC5mbHVzaCgpLnVud3JhcCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9ycy9zcmMvdHJhbnNwb3J0L3NvY2tldC5ycyBiL2xpYi9ycy9zcmMvdHJhbnNwb3J0L3NvY2tldC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmVmNjdiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3NyYy90cmFuc3BvcnQvc29ja2V0LnJzCkBAIC0wLDAgKzEsMTY4IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzZSBzdGQ6OmNvbnZlcnQ6OkZyb207Cit1c2Ugc3RkOjppbzsKK3VzZSBzdGQ6OmlvOjp7RXJyb3JLaW5kLCBSZWFkLCBXcml0ZX07Cit1c2Ugc3RkOjpuZXQ6OntTaHV0ZG93biwgVGNwU3RyZWFtfTsKKwordXNlIHN1cGVyOjp7UmVhZEhhbGYsIFRJb0NoYW5uZWwsIFdyaXRlSGFsZn07Cit1c2Uge25ld190cmFuc3BvcnRfZXJyb3IsIFRyYW5zcG9ydEVycm9yS2luZH07CisKKy8vLyBCaWRpcmVjdGlvbmFsIFRDUC9JUCBjaGFubmVsLgorLy8vCisvLy8gIyBFeGFtcGxlcworLy8vCisvLy8gQ3JlYXRlIGEgYFRUY3BDaGFubmVsYC4KKy8vLworLy8vIGBgYG5vX3J1bgorLy8vIHVzZSBzdGQ6OmlvOjp7UmVhZCwgV3JpdGV9OworLy8vIHVzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6VFRjcENoYW5uZWw7CisvLy8KKy8vLyBsZXQgbXV0IGMgPSBUVGNwQ2hhbm5lbDo6bmV3KCk7CisvLy8gYy5vcGVuKCJsb2NhbGhvc3Q6OTA5MCIpLnVud3JhcCgpOworLy8vCisvLy8gbGV0IG11dCBidWYgPSB2ZWMhWzB1ODsgNF07CisvLy8gYy5yZWFkKCZtdXQgYnVmKS51bndyYXAoKTsKKy8vLyBjLndyaXRlKCZ2ZWMhWzAsIDEsIDJdKS51bndyYXAoKTsKKy8vLyBgYGAKKy8vLworLy8vIENyZWF0ZSBhIGBUVGNwQ2hhbm5lbGAgYnkgd3JhcHBpbmcgYW4gZXhpc3RpbmcgYFRjcFN0cmVhbWAuCisvLy8KKy8vLyBgYGBub19ydW4KKy8vLyB1c2Ugc3RkOjppbzo6e1JlYWQsIFdyaXRlfTsKKy8vLyB1c2Ugc3RkOjpuZXQ6OlRjcFN0cmVhbTsKKy8vLyB1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUY3BDaGFubmVsOworLy8vCisvLy8gbGV0IHN0cmVhbSA9IFRjcFN0cmVhbTo6Y29ubmVjdCgiMTI3LjAuMC4xOjkxODkiKS51bndyYXAoKTsKKy8vLworLy8vIC8vIG5vIG5lZWQgdG8gY2FsbCBjLm9wZW4oKSBzaW5jZSB3ZSd2ZSBhbHJlYWR5IGNvbm5lY3RlZCBhYm92ZQorLy8vIGxldCBtdXQgYyA9IFRUY3BDaGFubmVsOjp3aXRoX3N0cmVhbShzdHJlYW0pOworLy8vCisvLy8gbGV0IG11dCBidWYgPSB2ZWMhWzB1ODsgNF07CisvLy8gYy5yZWFkKCZtdXQgYnVmKS51bndyYXAoKTsKKy8vLyBjLndyaXRlKCZ2ZWMhWzAsIDEsIDJdKS51bndyYXAoKTsKKy8vLyBgYGAKKyNbZGVyaXZlKERlYnVnLCBEZWZhdWx0KV0KK3B1YiBzdHJ1Y3QgVFRjcENoYW5uZWwgeworICAgIHN0cmVhbTogT3B0aW9uPFRjcFN0cmVhbT4sCit9CisKK2ltcGwgVFRjcENoYW5uZWwgeworICAgIC8vLyBDcmVhdGUgYW4gdW5pbml0aWFsaXplZCBgVFRjcENoYW5uZWxgLgorICAgIC8vLworICAgIC8vLyBUaGUgcmV0dXJuZWQgaW5zdGFuY2UgbXVzdCBiZSBvcGVuZWQgdXNpbmcgYFRUY3BDaGFubmVsOjpvcGVuKC4uLilgCisgICAgLy8vIGJlZm9yZSBpdCBjYW4gYmUgdXNlZC4KKyAgICBwdWIgZm4gbmV3KCkgLT4gVFRjcENoYW5uZWwgeworICAgICAgICBUVGNwQ2hhbm5lbCB7IHN0cmVhbTogTm9uZSB9CisgICAgfQorCisgICAgLy8vIENyZWF0ZSBhIGBUVGNwQ2hhbm5lbGAgdGhhdCB3cmFwcyBhbiBleGlzdGluZyBgVGNwU3RyZWFtYC4KKyAgICAvLy8KKyAgICAvLy8gVGhlIHBhc3NlZC1pbiBzdHJlYW0gaXMgYXNzdW1lZCB0byBoYXZlIGJlZW4gb3BlbmVkIGJlZm9yZSBiZWluZyB3cmFwcGVkCisgICAgLy8vIGJ5IHRoZSBjcmVhdGVkIGBUVGNwQ2hhbm5lbGAgaW5zdGFuY2UuCisgICAgcHViIGZuIHdpdGhfc3RyZWFtKHN0cmVhbTogVGNwU3RyZWFtKSAtPiBUVGNwQ2hhbm5lbCB7CisgICAgICAgIFRUY3BDaGFubmVsIHsKKyAgICAgICAgICAgIHN0cmVhbTogU29tZShzdHJlYW0pLAorICAgICAgICB9CisgICAgfQorCisgICAgLy8vIENvbm5lY3QgdG8gYHJlbW90ZV9hZGRyZXNzYCwgd2hpY2ggc2hvdWxkIGhhdmUgdGhlIGZvcm0gYGhvc3Q6cG9ydGAuCisgICAgcHViIGZuIG9wZW4oJm11dCBzZWxmLCByZW1vdGVfYWRkcmVzczogJnN0cikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgaWYgc2VsZi5zdHJlYW0uaXNfc29tZSgpIHsKKyAgICAgICAgICAgIEVycihuZXdfdHJhbnNwb3J0X2Vycm9yKAorICAgICAgICAgICAgICAgIFRyYW5zcG9ydEVycm9yS2luZDo6QWxyZWFkeU9wZW4sCisgICAgICAgICAgICAgICAgInRjcCBjb25uZWN0aW9uIHByZXZpb3VzbHkgb3BlbmVkIiwKKyAgICAgICAgICAgICkpCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtYXRjaCBUY3BTdHJlYW06OmNvbm5lY3QoJnJlbW90ZV9hZGRyZXNzKSB7CisgICAgICAgICAgICAgICAgT2socykgPT4geworICAgICAgICAgICAgICAgICAgICBzZWxmLnN0cmVhbSA9IFNvbWUocyk7CisgICAgICAgICAgICAgICAgICAgIE9rKCgpKQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBFcnIoZSkgPT4gRXJyKEZyb206OmZyb20oZSkpLAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8vIFNodXQgZG93biB0aGlzIGNoYW5uZWwuCisgICAgLy8vCisgICAgLy8vIEJvdGggc2VuZCBhbmQgcmVjZWl2ZSBoYWx2ZXMgYXJlIGNsb3NlZCwgYW5kIHRoaXMgaW5zdGFuY2UgY2FuIG5vCisgICAgLy8vIGxvbmdlciBiZSB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggYW5vdGhlciBlbmRwb2ludC4KKyAgICBwdWIgZm4gY2xvc2UoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlmX3NldCh8c3wgcy5zaHV0ZG93bihTaHV0ZG93bjo6Qm90aCkpCisgICAgICAgICAgICAubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIGZuIGlmX3NldDxGLCBUPigmbXV0IHNlbGYsIG11dCBzdHJlYW1fb3BlcmF0aW9uOiBGKSAtPiBpbzo6UmVzdWx0PFQ+CisgICAgd2hlcmUKKyAgICAgICAgRjogRm5NdXQoJm11dCBUY3BTdHJlYW0pIC0+IGlvOjpSZXN1bHQ8VD4sCisgICAgeworICAgICAgICBpZiBsZXQgU29tZShyZWYgbXV0IHMpID0gc2VsZi5zdHJlYW0geworICAgICAgICAgICAgc3RyZWFtX29wZXJhdGlvbihzKQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRXJyKGlvOjpFcnJvcjo6bmV3KAorICAgICAgICAgICAgICAgIEVycm9yS2luZDo6Tm90Q29ubmVjdGVkLAorICAgICAgICAgICAgICAgICJ0Y3AgZW5kcG9pbnQgbm90IGNvbm5lY3RlZCIsCisgICAgICAgICAgICApKQorICAgICAgICB9CisgICAgfQorfQorCitpbXBsIFRJb0NoYW5uZWwgZm9yIFRUY3BDaGFubmVsIHsKKyAgICBmbiBzcGxpdChzZWxmKSAtPiA6OlJlc3VsdDwoUmVhZEhhbGY8U2VsZj4sIFdyaXRlSGFsZjxTZWxmPik+CisgICAgd2hlcmUKKyAgICAgICAgU2VsZjogU2l6ZWQsCisgICAgeworICAgICAgICBsZXQgbXV0IHMgPSBzZWxmOworCisgICAgICAgIHMuc3RyZWFtCisgICAgICAgICAgICAuYXNfbXV0KCkKKyAgICAgICAgICAgIC5hbmRfdGhlbih8c3wgcy50cnlfY2xvbmUoKS5vaygpKQorICAgICAgICAgICAgLm1hcCh8Y2xvbmVkfCB7CisgICAgICAgICAgICAgICAgbGV0IHJlYWRfaGFsZiA9IFJlYWRIYWxmOjpuZXcoVFRjcENoYW5uZWwgeworICAgICAgICAgICAgICAgICAgICBzdHJlYW06IHMuc3RyZWFtLnRha2UoKSwKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICBsZXQgd3JpdGVfaGFsZiA9IFdyaXRlSGFsZjo6bmV3KFRUY3BDaGFubmVsIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtOiBTb21lKGNsb25lZCksCisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgKHJlYWRfaGFsZiwgd3JpdGVfaGFsZikKKyAgICAgICAgICAgIH0pCisgICAgICAgICAgICAub2tfb3JfZWxzZSh8fCB7CisgICAgICAgICAgICAgICAgbmV3X3RyYW5zcG9ydF9lcnJvcigKKyAgICAgICAgICAgICAgICAgICAgVHJhbnNwb3J0RXJyb3JLaW5kOjpVbmtub3duLAorICAgICAgICAgICAgICAgICAgICAiY2Fubm90IGNsb25lIHVuZGVybHlpbmcgdGNwIHN0cmVhbSIsCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSkKKyAgICB9Cit9CisKK2ltcGwgUmVhZCBmb3IgVFRjcENoYW5uZWwgeworICAgIGZuIHJlYWQoJm11dCBzZWxmLCBiOiAmbXV0IFt1OF0pIC0+IGlvOjpSZXN1bHQ8dXNpemU+IHsKKyAgICAgICAgc2VsZi5pZl9zZXQofHN8IHMucmVhZChiKSkKKyAgICB9Cit9CisKK2ltcGwgV3JpdGUgZm9yIFRUY3BDaGFubmVsIHsKKyAgICBmbiB3cml0ZSgmbXV0IHNlbGYsIGI6ICZbdThdKSAtPiBpbzo6UmVzdWx0PHVzaXplPiB7CisgICAgICAgIHNlbGYuaWZfc2V0KHxzfCBzLndyaXRlKGIpKQorICAgIH0KKworICAgIGZuIGZsdXNoKCZtdXQgc2VsZikgLT4gaW86OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlmX3NldCh8c3wgcy5mbHVzaCgpKQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9ycy90ZXN0L0NhcmdvLnRvbWwgYi9saWIvcnMvdGVzdC9DYXJnby50b21sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZGVjMTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvdGVzdC9DYXJnby50b21sCkBAIC0wLDAgKzEsMTUgQEAKK1twYWNrYWdlXQorbmFtZSA9ICJraXRjaGVuLXNpbmsiCit2ZXJzaW9uID0gIjAuMS4wIgorbGljZW5zZSA9ICJBcGFjaGUtMi4wIgorYXV0aG9ycyA9IFsiQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+Il0KK3B1Ymxpc2ggPSBmYWxzZQorCitbZGVwZW5kZW5jaWVzXQorY2xhcCA9ICI8Mi4yOC4wIgorb3JkZXJlZC1mbG9hdCA9ICIwLjMuMCIKK3RyeV9mcm9tID0gIjAuMi4wIgorCitbZGVwZW5kZW5jaWVzLnRocmlmdF0KK3BhdGggPSAiLi4vIgorCmRpZmYgLS1naXQgYS9saWIvcnMvdGVzdC9NYWtlZmlsZS5hbSBiL2xpYi9ycy90ZXN0L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlZGQ3NTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvdGVzdC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDU0IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworVEhSSUZUID0gJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKKworc3R1YnM6IHRocmlmdHMvQmFzZV9PbmUudGhyaWZ0IHRocmlmdHMvQmFzZV9Ud28udGhyaWZ0IHRocmlmdHMvTWlkbGF5ZXIudGhyaWZ0IHRocmlmdHMvVWx0aW1hdGUudGhyaWZ0ICQodG9wX2J1aWxkZGlyKS90ZXN0L1JlY3Vyc2l2ZS50aHJpZnQgJChUSFJJRlQpCisJJChUSFJJRlQpIC1JIC4vdGhyaWZ0cyAtb3V0IHNyYyAtLWdlbiBycyB0aHJpZnRzL0Jhc2VfT25lLnRocmlmdAorCSQoVEhSSUZUKSAtSSAuL3RocmlmdHMgLW91dCBzcmMgLS1nZW4gcnMgdGhyaWZ0cy9CYXNlX1R3by50aHJpZnQKKwkkKFRIUklGVCkgLUkgLi90aHJpZnRzIC1vdXQgc3JjIC0tZ2VuIHJzIHRocmlmdHMvTWlkbGF5ZXIudGhyaWZ0CisJJChUSFJJRlQpIC1JIC4vdGhyaWZ0cyAtb3V0IHNyYyAtLWdlbiBycyB0aHJpZnRzL1VsdGltYXRlLnRocmlmdAorCSQoVEhSSUZUKSAtb3V0IHNyYyAtLWdlbiBycyAkKHRvcF9idWlsZGRpcikvdGVzdC9SZWN1cnNpdmUudGhyaWZ0CisKK2NoZWNrOiBzdHVicworCSQoQ0FSR08pIGJ1aWxkCisJJChDQVJHTykgdGVzdAorCVsgLWQgYmluIF0gfHwgbWtkaXIgYmluCisJY3AgdGFyZ2V0L2RlYnVnL2tpdGNoZW5fc2lua19zZXJ2ZXIgYmluL2tpdGNoZW5fc2lua19zZXJ2ZXIKKwljcCB0YXJnZXQvZGVidWcva2l0Y2hlbl9zaW5rX2NsaWVudCBiaW4va2l0Y2hlbl9zaW5rX2NsaWVudAorCitjbGVhbi1sb2NhbDoKKwkkKENBUkdPKSBjbGVhbgorCS0kKFJNKSBDYXJnby5sb2NrCisJLSQoUk0pIHNyYy9iYXNlX29uZS5ycworCS0kKFJNKSBzcmMvYmFzZV90d28ucnMKKwktJChSTSkgc3JjL21pZGxheWVyLnJzCisJLSQoUk0pIHNyYy91bHRpbWF0ZS5ycworCS0kKFJNKSAtciBiaW4KKworRVhUUkFfRElTVCA9IFwKKwlDYXJnby50b21sIFwKKwl0aHJpZnRzL0Jhc2VfT25lLnRocmlmdCBcCisJdGhyaWZ0cy9CYXNlX1R3by50aHJpZnQgXAorCXRocmlmdHMvTWlkbGF5ZXIudGhyaWZ0IFwKKwl0aHJpZnRzL1VsdGltYXRlLnRocmlmdCBcCisJc3JjL2xpYi5ycyBcCisJc3JjL2Jpbi9raXRjaGVuX3Npbmtfc2VydmVyLnJzIFwKKwlzcmMvYmluL2tpdGNoZW5fc2lua19jbGllbnQucnMKKwpkaWZmIC0tZ2l0IGEvbGliL3JzL3Rlc3Qvc3JjL2Jpbi9raXRjaGVuX3NpbmtfY2xpZW50LnJzIGIvbGliL3JzL3Rlc3Qvc3JjL2Jpbi9raXRjaGVuX3NpbmtfY2xpZW50LnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyOTVjODgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvdGVzdC9zcmMvYmluL2tpdGNoZW5fc2lua19jbGllbnQucnMKQEAgLTAsMCArMSwyMzkgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworI1ttYWNyb191c2VdCitleHRlcm4gY3JhdGUgY2xhcDsKKworZXh0ZXJuIGNyYXRlIGtpdGNoZW5fc2luazsKK2V4dGVybiBjcmF0ZSB0aHJpZnQ7CisKK3VzZSBzdGQ6OmNvbnZlcnQ6OkludG87CisKK3VzZSBraXRjaGVuX3Npbms6OmJhc2VfdHdvOjp7VE5hcGtpblNlcnZpY2VTeW5jQ2xpZW50LCBUUmFtZW5TZXJ2aWNlU3luY0NsaWVudH07Cit1c2Uga2l0Y2hlbl9zaW5rOjptaWRsYXllcjo6e01lYWxTZXJ2aWNlU3luY0NsaWVudCwgVE1lYWxTZXJ2aWNlU3luY0NsaWVudH07Cit1c2Uga2l0Y2hlbl9zaW5rOjpyZWN1cnNpdmU7Cit1c2Uga2l0Y2hlbl9zaW5rOjpyZWN1cnNpdmU6OntDb1JlYywgQ29SZWMyLCBSZWNMaXN0LCBSZWNUcmVlLCBUVGVzdFNlcnZpY2VTeW5jQ2xpZW50fTsKK3VzZSBraXRjaGVuX3Npbms6OnVsdGltYXRlOjp7RnVsbE1lYWxTZXJ2aWNlU3luY0NsaWVudCwgVEZ1bGxNZWFsU2VydmljZVN5bmNDbGllbnR9OwordXNlIHRocmlmdDo6cHJvdG9jb2w6OnsKKyAgICBUQmluYXJ5SW5wdXRQcm90b2NvbCwgVEJpbmFyeU91dHB1dFByb3RvY29sLCBUQ29tcGFjdElucHV0UHJvdG9jb2wsIFRDb21wYWN0T3V0cHV0UHJvdG9jb2wsCisgICAgVElucHV0UHJvdG9jb2wsIFRPdXRwdXRQcm90b2NvbCwKK307Cit1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OnsKKyAgICBSZWFkSGFsZiwgVEZyYW1lZFJlYWRUcmFuc3BvcnQsIFRGcmFtZWRXcml0ZVRyYW5zcG9ydCwgVElvQ2hhbm5lbCwgVFRjcENoYW5uZWwsIFdyaXRlSGFsZiwKK307CisKK2ZuIG1haW4oKSB7CisgICAgbWF0Y2ggcnVuKCkgeworICAgICAgICBPaygoKSkgPT4gcHJpbnRsbiEoImtpdGNoZW4gc2luayBjbGllbnQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSIpLAorICAgICAgICBFcnIoZSkgPT4geworICAgICAgICAgICAgcHJpbnRsbiEoImtpdGNoZW4gc2luayBjbGllbnQgZmFpbGVkIHdpdGggZXJyb3Igezo/fSIsIGUpOworICAgICAgICAgICAgc3RkOjpwcm9jZXNzOjpleGl0KDEpOworICAgICAgICB9CisgICAgfQorfQorCitmbiBydW4oKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geworICAgIGxldCBtYXRjaGVzID0gY2xhcF9hcHAhKHJ1c3Rfa2l0Y2hlbl9zaW5rX2NsaWVudCA9PgorICAgICAgICAodmVyc2lvbjogIjAuMS4wIikKKyAgICAgICAgKGF1dGhvcjogIkFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPiIpCisgICAgICAgIChhYm91dDogIlRocmlmdCBSdXN0IGtpdGNoZW4gc2luayBjbGllbnQiKQorICAgICAgICAoQGFyZyBob3N0OiAtLWhvc3QgK3Rha2VzX3ZhbHVlICJIb3N0IG9uIHdoaWNoIHRoZSBUaHJpZnQgdGVzdCBzZXJ2ZXIgaXMgbG9jYXRlZCIpCisgICAgICAgIChAYXJnIHBvcnQ6IC0tcG9ydCArdGFrZXNfdmFsdWUgIlBvcnQgb24gd2hpY2ggdGhlIFRocmlmdCB0ZXN0IHNlcnZlciBpcyBsaXN0ZW5pbmciKQorICAgICAgICAoQGFyZyBwcm90b2NvbDogLS1wcm90b2NvbCArdGFrZXNfdmFsdWUgIlRocmlmdCBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiB0byB1c2UgKFwiYmluYXJ5XCIsIFwiY29tcGFjdFwiKSIpCisgICAgICAgIChAYXJnIHNlcnZpY2U6IC0tc2VydmljZSArdGFrZXNfdmFsdWUgIlNlcnZpY2UgdHlwZSB0byBjb250YWN0IChcInBhcnRcIiwgXCJmdWxsXCIsIFwicmVjdXJzaXZlXCIpIikKKyAgICApCisgICAgICAgICAgICAuZ2V0X21hdGNoZXMoKTsKKworICAgIGxldCBob3N0ID0gbWF0Y2hlcy52YWx1ZV9vZigiaG9zdCIpLnVud3JhcF9vcigiMTI3LjAuMC4xIik7CisgICAgbGV0IHBvcnQgPSB2YWx1ZV90IShtYXRjaGVzLCAicG9ydCIsIHUxNikudW53cmFwX29yKDkwOTApOworICAgIGxldCBwcm90b2NvbCA9IG1hdGNoZXMudmFsdWVfb2YoInByb3RvY29sIikudW53cmFwX29yKCJjb21wYWN0Iik7CisgICAgbGV0IHNlcnZpY2UgPSBtYXRjaGVzLnZhbHVlX29mKCJzZXJ2aWNlIikudW53cmFwX29yKCJwYXJ0Iik7CisKKyAgICBsZXQgKGlfY2hhbiwgb19jaGFuKSA9IHRjcF9jaGFubmVsKGhvc3QsIHBvcnQpPzsKKyAgICBsZXQgKGlfdHJhbiwgb190cmFuKSA9ICgKKyAgICAgICAgVEZyYW1lZFJlYWRUcmFuc3BvcnQ6Om5ldyhpX2NoYW4pLAorICAgICAgICBURnJhbWVkV3JpdGVUcmFuc3BvcnQ6Om5ldyhvX2NoYW4pLAorICAgICk7CisKKyAgICBsZXQgKGlfcHJvdCwgb19wcm90KTogKEJveDxUSW5wdXRQcm90b2NvbD4sIEJveDxUT3V0cHV0UHJvdG9jb2w+KSA9IG1hdGNoIHByb3RvY29sIHsKKyAgICAgICAgImJpbmFyeSIgPT4gKAorICAgICAgICAgICAgQm94OjpuZXcoVEJpbmFyeUlucHV0UHJvdG9jb2w6Om5ldyhpX3RyYW4sIHRydWUpKSwKKyAgICAgICAgICAgIEJveDo6bmV3KFRCaW5hcnlPdXRwdXRQcm90b2NvbDo6bmV3KG9fdHJhbiwgdHJ1ZSkpLAorICAgICAgICApLAorICAgICAgICAiY29tcGFjdCIgPT4gKAorICAgICAgICAgICAgQm94OjpuZXcoVENvbXBhY3RJbnB1dFByb3RvY29sOjpuZXcoaV90cmFuKSksCisgICAgICAgICAgICBCb3g6Om5ldyhUQ29tcGFjdE91dHB1dFByb3RvY29sOjpuZXcob190cmFuKSksCisgICAgICAgICksCisgICAgICAgIHVubWF0Y2hlZCA9PiByZXR1cm4gRXJyKGZvcm1hdCEoInVuc3VwcG9ydGVkIHByb3RvY29sIHt9IiwgdW5tYXRjaGVkKS5pbnRvKCkpLAorICAgIH07CisKKyAgICBydW5fY2xpZW50KHNlcnZpY2UsIGlfcHJvdCwgb19wcm90KQorfQorCitmbiBydW5fY2xpZW50KAorICAgIHNlcnZpY2U6ICZzdHIsCisgICAgaV9wcm90OiBCb3g8VElucHV0UHJvdG9jb2w+LAorICAgIG9fcHJvdDogQm94PFRPdXRwdXRQcm90b2NvbD4sCispIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7CisgICAgbWF0Y2ggc2VydmljZSB7CisgICAgICAgICJmdWxsIiA9PiBleGVjX2Z1bGxfbWVhbF9jbGllbnQoaV9wcm90LCBvX3Byb3QpLAorICAgICAgICAicGFydCIgPT4gZXhlY19tZWFsX2NsaWVudChpX3Byb3QsIG9fcHJvdCksCisgICAgICAgICJyZWN1cnNpdmUiID0+IGV4ZWNfcmVjdXJzaXZlX2NsaWVudChpX3Byb3QsIG9fcHJvdCksCisgICAgICAgIF8gPT4gRXJyKHRocmlmdDo6RXJyb3I6OmZyb20oZm9ybWF0ISgKKyAgICAgICAgICAgICJ1bmtub3duIHNlcnZpY2UgdHlwZSB7fSIsCisgICAgICAgICAgICBzZXJ2aWNlCisgICAgICAgICkpKSwKKyAgICB9Cit9CisKK2ZuIHRjcF9jaGFubmVsKAorICAgIGhvc3Q6ICZzdHIsCisgICAgcG9ydDogdTE2LAorKSAtPiB0aHJpZnQ6OlJlc3VsdDwoUmVhZEhhbGY8VFRjcENoYW5uZWw+LCBXcml0ZUhhbGY8VFRjcENoYW5uZWw+KT4geworICAgIGxldCBtdXQgYyA9IFRUY3BDaGFubmVsOjpuZXcoKTsKKyAgICBjLm9wZW4oJmZvcm1hdCEoInt9Ont9IiwgaG9zdCwgcG9ydCkpPzsKKyAgICBjLnNwbGl0KCkKK30KKworZm4gZXhlY19tZWFsX2NsaWVudCgKKyAgICBpX3Byb3Q6IEJveDxUSW5wdXRQcm90b2NvbD4sCisgICAgb19wcm90OiBCb3g8VE91dHB1dFByb3RvY29sPiwKKykgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsKKyAgICBsZXQgbXV0IGNsaWVudCA9IE1lYWxTZXJ2aWNlU3luY0NsaWVudDo6bmV3KGlfcHJvdCwgb19wcm90KTsKKworICAgIC8vIGNsaWVudC5mdWxsX21lYWwoKTsgLy8gPC0tIElNUE9SVEFOVDogaWYgeW91IHVuY29tbWVudCB0aGlzLCBjb21waWxhdGlvbiAqc2hvdWxkKiBmYWlsCisgICAgLy8gdGhpcyBpcyBiZWNhdXNlIHRoZSBNZWFsU2VydmljZSBzdHJ1Y3QgZG9lcyBub3QgY29udGFpbiB0aGUgYXBwcm9wcmlhdGUgc2VydmljZSBtYXJrZXIKKworICAgIC8vIG9ubHkgdGhlIGZvbGxvd2luZyB0aHJlZSBjYWxscyB3b3JrCisgICAgZXhlY3V0ZV9jYWxsKCJwYXJ0IiwgInJhbWVuIiwgfHwgY2xpZW50LnJhbWVuKDUwKSkubWFwKHxffCAoKSk/OworICAgIGV4ZWN1dGVfY2FsbCgicGFydCIsICJtZWFsIiwgfHwgY2xpZW50Lm1lYWwoKSkubWFwKHxffCAoKSk/OworICAgIGV4ZWN1dGVfY2FsbCgicGFydCIsICJuYXBraW4iLCB8fCBjbGllbnQubmFwa2luKCkpLm1hcCh8X3wgKCkpPzsKKworICAgIE9rKCgpKQorfQorCitmbiBleGVjX2Z1bGxfbWVhbF9jbGllbnQoCisgICAgaV9wcm90OiBCb3g8VElucHV0UHJvdG9jb2w+LAorICAgIG9fcHJvdDogQm94PFRPdXRwdXRQcm90b2NvbD4sCispIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7CisgICAgbGV0IG11dCBjbGllbnQgPSBGdWxsTWVhbFNlcnZpY2VTeW5jQ2xpZW50OjpuZXcoaV9wcm90LCBvX3Byb3QpOworCisgICAgZXhlY3V0ZV9jYWxsKCJmdWxsIiwgInJhbWVuIiwgfHwgY2xpZW50LnJhbWVuKDEwMCkpLm1hcCh8X3wgKCkpPzsKKyAgICBleGVjdXRlX2NhbGwoImZ1bGwiLCAibWVhbCIsIHx8IGNsaWVudC5tZWFsKCkpLm1hcCh8X3wgKCkpPzsKKyAgICBleGVjdXRlX2NhbGwoImZ1bGwiLCAibmFwa2luIiwgfHwgY2xpZW50Lm5hcGtpbigpKS5tYXAofF98ICgpKT87CisgICAgZXhlY3V0ZV9jYWxsKCJmdWxsIiwgImZ1bGwgbWVhbCIsIHx8IGNsaWVudC5mdWxsX21lYWwoKSkubWFwKHxffCAoKSk/OworCisgICAgT2soKCkpCit9CisKK2ZuIGV4ZWNfcmVjdXJzaXZlX2NsaWVudCgKKyAgICBpX3Byb3Q6IEJveDxUSW5wdXRQcm90b2NvbD4sCisgICAgb19wcm90OiBCb3g8VE91dHB1dFByb3RvY29sPiwKKykgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsKKyAgICBsZXQgbXV0IGNsaWVudCA9IHJlY3Vyc2l2ZTo6VGVzdFNlcnZpY2VTeW5jQ2xpZW50OjpuZXcoaV9wcm90LCBvX3Byb3QpOworCisgICAgbGV0IHRyZWUgPSBSZWNUcmVlIHsKKyAgICAgICAgY2hpbGRyZW46IFNvbWUodmVjIVtCb3g6Om5ldyhSZWNUcmVlIHsKKyAgICAgICAgICAgIGNoaWxkcmVuOiBTb21lKHZlYyFbCisgICAgICAgICAgICAgICAgQm94OjpuZXcoUmVjVHJlZSB7CisgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBOb25lLAorICAgICAgICAgICAgICAgICAgICBpdGVtOiBTb21lKDMpLAorICAgICAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgICAgIEJveDo6bmV3KFJlY1RyZWUgeworICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbjogTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgaXRlbTogU29tZSg0KSwKKyAgICAgICAgICAgICAgICB9KSwKKyAgICAgICAgICAgIF0pLAorICAgICAgICAgICAgaXRlbTogU29tZSgyKSwKKyAgICAgICAgfSldKSwKKyAgICAgICAgaXRlbTogU29tZSgxKSwKKyAgICB9OworCisgICAgbGV0IGV4cGVjdGVkX3RyZWUgPSBSZWNUcmVlIHsKKyAgICAgICAgY2hpbGRyZW46IFNvbWUodmVjIVtCb3g6Om5ldyhSZWNUcmVlIHsKKyAgICAgICAgICAgIGNoaWxkcmVuOiBTb21lKHZlYyFbCisgICAgICAgICAgICAgICAgQm94OjpuZXcoUmVjVHJlZSB7CisgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBTb21lKFZlYzo6bmV3KCkpLCAvLyByZW1vdGUgcmV0dXJucyBhbiBlbXB0eSBsaXN0CisgICAgICAgICAgICAgICAgICAgIGl0ZW06IFNvbWUoMyksCisgICAgICAgICAgICAgICAgfSksCisgICAgICAgICAgICAgICAgQm94OjpuZXcoUmVjVHJlZSB7CisgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBTb21lKFZlYzo6bmV3KCkpLCAvLyByZW1vdGUgcmV0dXJucyBhbiBlbXB0eSBsaXN0CisgICAgICAgICAgICAgICAgICAgIGl0ZW06IFNvbWUoNCksCisgICAgICAgICAgICAgICAgfSksCisgICAgICAgICAgICBdKSwKKyAgICAgICAgICAgIGl0ZW06IFNvbWUoMiksCisgICAgICAgIH0pXSksCisgICAgICAgIGl0ZW06IFNvbWUoMSksCisgICAgfTsKKworICAgIGxldCByZXR1cm5lZF90cmVlID0gZXhlY3V0ZV9jYWxsKCJyZWN1cnNpdmUiLCAiZWNob190cmVlIiwgfHwgY2xpZW50LmVjaG9fdHJlZSh0cmVlLmNsb25lKCkpKT87CisgICAgaWYgcmV0dXJuZWRfdHJlZSAhPSBleHBlY3RlZF90cmVlIHsKKyAgICAgICAgcmV0dXJuIEVycihmb3JtYXQhKAorICAgICAgICAgICAgIm1pc21hdGNoZWQgcmVjdXJzaXZlIHRyZWUgezo/fSB7Oj99IiwKKyAgICAgICAgICAgIGV4cGVjdGVkX3RyZWUsIHJldHVybmVkX3RyZWUKKyAgICAgICAgKQorICAgICAgICAuaW50bygpKTsKKyAgICB9CisKKyAgICBsZXQgbGlzdCA9IFJlY0xpc3QgeworICAgICAgICBuZXh0aXRlbTogU29tZShCb3g6Om5ldyhSZWNMaXN0IHsKKyAgICAgICAgICAgIG5leHRpdGVtOiBTb21lKEJveDo6bmV3KFJlY0xpc3QgeworICAgICAgICAgICAgICAgIG5leHRpdGVtOiBOb25lLAorICAgICAgICAgICAgICAgIGl0ZW06IFNvbWUoMyksCisgICAgICAgICAgICB9KSksCisgICAgICAgICAgICBpdGVtOiBTb21lKDIpLAorICAgICAgICB9KSksCisgICAgICAgIGl0ZW06IFNvbWUoMSksCisgICAgfTsKKyAgICBsZXQgcmV0dXJuZWRfbGlzdCA9IGV4ZWN1dGVfY2FsbCgicmVjdXJzaXZlIiwgImVjaG9fbGlzdCIsIHx8IGNsaWVudC5lY2hvX2xpc3QobGlzdC5jbG9uZSgpKSk/OworICAgIGlmIHJldHVybmVkX2xpc3QgIT0gbGlzdCB7CisgICAgICAgIHJldHVybiBFcnIoZm9ybWF0ISgibWlzbWF0Y2hlZCByZWN1cnNpdmUgbGlzdCB7Oj99IHs6P30iLCBsaXN0LCByZXR1cm5lZF9saXN0KS5pbnRvKCkpOworICAgIH0KKworICAgIGxldCBjb19yZWMgPSBDb1JlYyB7CisgICAgICAgIG90aGVyOiBTb21lKEJveDo6bmV3KENvUmVjMiB7CisgICAgICAgICAgICBvdGhlcjogU29tZShDb1JlYyB7CisgICAgICAgICAgICAgICAgb3RoZXI6IFNvbWUoQm94OjpuZXcoQ29SZWMyIHsgb3RoZXI6IE5vbmUgfSkpLAorICAgICAgICAgICAgfSksCisgICAgICAgIH0pKSwKKyAgICB9OworICAgIGxldCByZXR1cm5lZF9jb19yZWMgPSBleGVjdXRlX2NhbGwoInJlY3Vyc2l2ZSIsICJlY2hvX2NvX3JlYyIsIHx8IHsKKyAgICAgICAgY2xpZW50LmVjaG9fY29fcmVjKGNvX3JlYy5jbG9uZSgpKQorICAgIH0pPzsKKyAgICBpZiByZXR1cm5lZF9jb19yZWMgIT0gY29fcmVjIHsKKyAgICAgICAgcmV0dXJuIEVycihmb3JtYXQhKCJtaXNtYXRjaGVkIGNvX3JlYyB7Oj99IHs6P30iLCBjb19yZWMsIHJldHVybmVkX2NvX3JlYykuaW50bygpKTsKKyAgICB9CisKKyAgICBPaygoKSkKK30KKworZm4gZXhlY3V0ZV9jYWxsPEYsIFI+KHNlcnZpY2VfdHlwZTogJnN0ciwgY2FsbF9uYW1lOiAmc3RyLCBtdXQgZjogRikgLT4gdGhyaWZ0OjpSZXN1bHQ8Uj4KK3doZXJlCisgICAgRjogRm5NdXQoKSAtPiB0aHJpZnQ6OlJlc3VsdDxSPiwKK3sKKyAgICBsZXQgcmVzID0gZigpOworCisgICAgbWF0Y2ggcmVzIHsKKyAgICAgICAgT2soXykgPT4gcHJpbnRsbiEoInt9OiBjb21wbGV0ZWQge30gY2FsbCIsIHNlcnZpY2VfdHlwZSwgY2FsbF9uYW1lKSwKKyAgICAgICAgRXJyKHJlZiBlKSA9PiBwcmludGxuISgKKyAgICAgICAgICAgICJ7fTogZmFpbGVkIHt9IGNhbGwgd2l0aCBlcnJvciB7Oj99IiwKKyAgICAgICAgICAgIHNlcnZpY2VfdHlwZSwgY2FsbF9uYW1lLCBlCisgICAgICAgICksCisgICAgfQorCisgICAgcmVzCit9CmRpZmYgLS1naXQgYS9saWIvcnMvdGVzdC9zcmMvYmluL2tpdGNoZW5fc2lua19zZXJ2ZXIucnMgYi9saWIvcnMvdGVzdC9zcmMvYmluL2tpdGNoZW5fc2lua19zZXJ2ZXIucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM4MDFlYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy90ZXN0L3NyYy9iaW4va2l0Y2hlbl9zaW5rX3NlcnZlci5ycwpAQCAtMCwwICsxLDMxMyBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjW21hY3JvX3VzZV0KK2V4dGVybiBjcmF0ZSBjbGFwOworZXh0ZXJuIGNyYXRlIGtpdGNoZW5fc2luazsKK2V4dGVybiBjcmF0ZSB0aHJpZnQ7CisKK3VzZSB0aHJpZnQ6OnByb3RvY29sOjp7CisgICAgVEJpbmFyeUlucHV0UHJvdG9jb2xGYWN0b3J5LCBUQmluYXJ5T3V0cHV0UHJvdG9jb2xGYWN0b3J5LCBUQ29tcGFjdElucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgIFRDb21wYWN0T3V0cHV0UHJvdG9jb2xGYWN0b3J5LCBUSW5wdXRQcm90b2NvbEZhY3RvcnksIFRPdXRwdXRQcm90b2NvbEZhY3RvcnksCit9OwordXNlIHRocmlmdDo6c2VydmVyOjpUU2VydmVyOwordXNlIHRocmlmdDo6dHJhbnNwb3J0Ojp7CisgICAgVEZyYW1lZFJlYWRUcmFuc3BvcnRGYWN0b3J5LCBURnJhbWVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5LCBUUmVhZFRyYW5zcG9ydEZhY3RvcnksCisgICAgVFdyaXRlVHJhbnNwb3J0RmFjdG9yeSwKK307CisKK3VzZSBraXRjaGVuX3Npbms6OmJhc2Vfb25lOjpOb29kbGU7Cit1c2Uga2l0Y2hlbl9zaW5rOjpiYXNlX3R3bzo6eworICAgIEJyb3RoVHlwZSwgTmFwa2luLCBOYXBraW5TZXJ2aWNlU3luY0hhbmRsZXIsIFJhbWVuLCBSYW1lblNlcnZpY2VTeW5jSGFuZGxlciwKK307Cit1c2Uga2l0Y2hlbl9zaW5rOjptaWRsYXllcjo6eworICAgIERlc3NlcnQsIE1lYWwsIE1lYWxTZXJ2aWNlU3luY0hhbmRsZXIsIE1lYWxTZXJ2aWNlU3luY1Byb2Nlc3NvciwgUGllLAorfTsKK3VzZSBraXRjaGVuX3Npbms6OnJlY3Vyc2l2ZTsKK3VzZSBraXRjaGVuX3Npbms6OnVsdGltYXRlOjpGdWxsTWVhbEFuZERyaW5rc1NlcnZpY2VTeW5jSGFuZGxlcjsKK3VzZSBraXRjaGVuX3Npbms6OnVsdGltYXRlOjp7CisgICAgRHJpbmssIEZ1bGxNZWFsLCBGdWxsTWVhbEFuZERyaW5rcywgRnVsbE1lYWxBbmREcmlua3NTZXJ2aWNlU3luY1Byb2Nlc3NvciwKKyAgICBGdWxsTWVhbFNlcnZpY2VTeW5jSGFuZGxlciwKK307CisKK2ZuIG1haW4oKSB7CisgICAgbWF0Y2ggcnVuKCkgeworICAgICAgICBPaygoKSkgPT4gcHJpbnRsbiEoImtpdGNoZW4gc2luayBzZXJ2ZXIgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSIpLAorICAgICAgICBFcnIoZSkgPT4geworICAgICAgICAgICAgcHJpbnRsbiEoImtpdGNoZW4gc2luayBzZXJ2ZXIgZmFpbGVkIHdpdGggZXJyb3Igezo/fSIsIGUpOworICAgICAgICAgICAgc3RkOjpwcm9jZXNzOjpleGl0KDEpOworICAgICAgICB9CisgICAgfQorfQorCitmbiBydW4oKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geworICAgIGxldCBtYXRjaGVzID0gY2xhcF9hcHAhKHJ1c3Rfa2l0Y2hlbl9zaW5rX3NlcnZlciA9PgorICAgICAgICAodmVyc2lvbjogIjAuMS4wIikKKyAgICAgICAgKGF1dGhvcjogIkFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPiIpCisgICAgICAgIChhYm91dDogIlRocmlmdCBSdXN0IGtpdGNoZW4gc2luayB0ZXN0IHNlcnZlciIpCisgICAgICAgIChAYXJnIHBvcnQ6IC0tcG9ydCArdGFrZXNfdmFsdWUgInBvcnQgb24gd2hpY2ggdGhlIHRlc3Qgc2VydmVyIGxpc3RlbnMiKQorICAgICAgICAoQGFyZyBwcm90b2NvbDogLS1wcm90b2NvbCArdGFrZXNfdmFsdWUgIlRocmlmdCBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiB0byB1c2UgKFwiYmluYXJ5XCIsIFwiY29tcGFjdFwiKSIpCisgICAgICAgIChAYXJnIHNlcnZpY2U6IC0tc2VydmljZSArdGFrZXNfdmFsdWUgIlNlcnZpY2UgdHlwZSB0byBjb250YWN0IChcInBhcnRcIiwgXCJmdWxsXCIsIFwicmVjdXJzaXZlXCIpIikKKyAgICApCisgICAgICAgICAgICAuZ2V0X21hdGNoZXMoKTsKKworICAgIGxldCBwb3J0ID0gdmFsdWVfdCEobWF0Y2hlcywgInBvcnQiLCB1MTYpLnVud3JhcF9vcig5MDkwKTsKKyAgICBsZXQgcHJvdG9jb2wgPSBtYXRjaGVzLnZhbHVlX29mKCJwcm90b2NvbCIpLnVud3JhcF9vcigiY29tcGFjdCIpOworICAgIGxldCBzZXJ2aWNlID0gbWF0Y2hlcy52YWx1ZV9vZigic2VydmljZSIpLnVud3JhcF9vcigicGFydCIpOworICAgIGxldCBsaXN0ZW5fYWRkcmVzcyA9IGZvcm1hdCEoIjEyNy4wLjAuMTp7fSIsIHBvcnQpOworCisgICAgcHJpbnRsbiEoImJpbmRpbmcgdG8ge30iLCBsaXN0ZW5fYWRkcmVzcyk7CisKKyAgICBsZXQgcl90cmFuc3BvcnRfZmFjdG9yeSA9IFRGcmFtZWRSZWFkVHJhbnNwb3J0RmFjdG9yeTo6bmV3KCk7CisgICAgbGV0IHdfdHJhbnNwb3J0X2ZhY3RvcnkgPSBURnJhbWVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5OjpuZXcoKTsKKworICAgIGxldCAoaV9wcm90b2NvbF9mYWN0b3J5LCBvX3Byb3RvY29sX2ZhY3RvcnkpOiAoCisgICAgICAgIEJveDxUSW5wdXRQcm90b2NvbEZhY3Rvcnk+LAorICAgICAgICBCb3g8VE91dHB1dFByb3RvY29sRmFjdG9yeT4sCisgICAgKSA9IG1hdGNoICYqcHJvdG9jb2wgeworICAgICAgICAiYmluYXJ5IiA9PiAoCisgICAgICAgICAgICBCb3g6Om5ldyhUQmluYXJ5SW5wdXRQcm90b2NvbEZhY3Rvcnk6Om5ldygpKSwKKyAgICAgICAgICAgIEJveDo6bmV3KFRCaW5hcnlPdXRwdXRQcm90b2NvbEZhY3Rvcnk6Om5ldygpKSwKKyAgICAgICAgKSwKKyAgICAgICAgImNvbXBhY3QiID0+ICgKKyAgICAgICAgICAgIEJveDo6bmV3KFRDb21wYWN0SW5wdXRQcm90b2NvbEZhY3Rvcnk6Om5ldygpKSwKKyAgICAgICAgICAgIEJveDo6bmV3KFRDb21wYWN0T3V0cHV0UHJvdG9jb2xGYWN0b3J5OjpuZXcoKSksCisgICAgICAgICksCisgICAgICAgIHVua25vd24gPT4geworICAgICAgICAgICAgcmV0dXJuIEVycihmb3JtYXQhKCJ1bnN1cHBvcnRlZCB0cmFuc3BvcnQgdHlwZSB7fSIsIHVua25vd24pLmludG8oKSk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLy8gRklYTUU6IHNob3VsZCBwcm9jZXNzb3IgYmUgYm94ZWQgYXMgd2VsbD8KKyAgICAvLworICAgIC8vIFtzaWdoXSBJIGhhdGUgUnVzdCBnZW5lcmljcyBpbXBsZW1lbnRhdGlvbgorICAgIC8vCisgICAgLy8gSSB3b3VsZCBoYXZlIHByZWZlcnJlZCB0byBidWlsZCBhIHNlcnZlciBoZXJlLCByZXR1cm4gaXQsIGFuZCB0aGVuIGRvCisgICAgLy8gdGhlIGNvbW1vbiBsaXN0ZW4tYW5kLWhhbmRsZSBzdHVmZiwgYnV0IHNpbmNlIHRoZSBzZXJ2ZXIgZG9lc24ndCBoYXZlIGEKKyAgICAvLyBjb21tb24gdHlwZSAoYmVjYXVzZSBlYWNoIG1hdGNoIGFybSBpbnN0YW50aWF0ZXMgYSBzZXJ2ZXIgd2l0aCBhCisgICAgLy8gZGlmZmVyZW50IHByb2Nlc3NvcikgdGhpcyBpc24ndCBwb3NzaWJsZS4KKyAgICAvLworICAgIC8vIFNpbmNlIHdoYXQgSSdtIGRvaW5nIGlzIHVuY29tbW9uIEknbSBqdXN0IGdvaW5nIHRvIGR1cGxpY2F0ZSB0aGUgY29kZQorICAgIG1hdGNoICYqc2VydmljZSB7CisgICAgICAgICJwYXJ0IiA9PiBydW5fbWVhbF9zZXJ2ZXIoCisgICAgICAgICAgICAmbGlzdGVuX2FkZHJlc3MsCisgICAgICAgICAgICByX3RyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICAgICAgaV9wcm90b2NvbF9mYWN0b3J5LAorICAgICAgICAgICAgd190cmFuc3BvcnRfZmFjdG9yeSwKKyAgICAgICAgICAgIG9fcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgKSwKKyAgICAgICAgImZ1bGwiID0+IHJ1bl9mdWxsX21lYWxfc2VydmVyKAorICAgICAgICAgICAgJmxpc3Rlbl9hZGRyZXNzLAorICAgICAgICAgICAgcl90cmFuc3BvcnRfZmFjdG9yeSwKKyAgICAgICAgICAgIGlfcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgICAgIHdfdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgICAgICBvX3Byb3RvY29sX2ZhY3RvcnksCisgICAgICAgICksCisgICAgICAgICJyZWN1cnNpdmUiID0+IHJ1bl9yZWN1cnNpdmVfc2VydmVyKAorICAgICAgICAgICAgJmxpc3Rlbl9hZGRyZXNzLAorICAgICAgICAgICAgcl90cmFuc3BvcnRfZmFjdG9yeSwKKyAgICAgICAgICAgIGlfcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgICAgIHdfdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgICAgICBvX3Byb3RvY29sX2ZhY3RvcnksCisgICAgICAgICksCisgICAgICAgIHVua25vd24gPT4gRXJyKGZvcm1hdCEoInVuc3VwcG9ydGVkIHNlcnZpY2UgdHlwZSB7fSIsIHVua25vd24pLmludG8oKSksCisgICAgfQorfQorCitmbiBydW5fbWVhbF9zZXJ2ZXI8UlRGLCBJUEYsIFdURiwgT1BGPigKKyAgICBsaXN0ZW5fYWRkcmVzczogJnN0ciwKKyAgICByX3RyYW5zcG9ydF9mYWN0b3J5OiBSVEYsCisgICAgaV9wcm90b2NvbF9mYWN0b3J5OiBJUEYsCisgICAgd190cmFuc3BvcnRfZmFjdG9yeTogV1RGLAorICAgIG9fcHJvdG9jb2xfZmFjdG9yeTogT1BGLAorKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4KK3doZXJlCisgICAgUlRGOiBUUmVhZFRyYW5zcG9ydEZhY3RvcnkgKyAnc3RhdGljLAorICAgIElQRjogVElucHV0UHJvdG9jb2xGYWN0b3J5ICsgJ3N0YXRpYywKKyAgICBXVEY6IFRXcml0ZVRyYW5zcG9ydEZhY3RvcnkgKyAnc3RhdGljLAorICAgIE9QRjogVE91dHB1dFByb3RvY29sRmFjdG9yeSArICdzdGF0aWMsCit7CisgICAgbGV0IHByb2Nlc3NvciA9IE1lYWxTZXJ2aWNlU3luY1Byb2Nlc3Nvcjo6bmV3KFBhcnRIYW5kbGVyIHt9KTsKKyAgICBsZXQgbXV0IHNlcnZlciA9IFRTZXJ2ZXI6Om5ldygKKyAgICAgICAgcl90cmFuc3BvcnRfZmFjdG9yeSwKKyAgICAgICAgaV9wcm90b2NvbF9mYWN0b3J5LAorICAgICAgICB3X3RyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICBvX3Byb3RvY29sX2ZhY3RvcnksCisgICAgICAgIHByb2Nlc3NvciwKKyAgICAgICAgMSwKKyAgICApOworCisgICAgc2VydmVyLmxpc3RlbihsaXN0ZW5fYWRkcmVzcykKK30KKworZm4gcnVuX2Z1bGxfbWVhbF9zZXJ2ZXI8UlRGLCBJUEYsIFdURiwgT1BGPigKKyAgICBsaXN0ZW5fYWRkcmVzczogJnN0ciwKKyAgICByX3RyYW5zcG9ydF9mYWN0b3J5OiBSVEYsCisgICAgaV9wcm90b2NvbF9mYWN0b3J5OiBJUEYsCisgICAgd190cmFuc3BvcnRfZmFjdG9yeTogV1RGLAorICAgIG9fcHJvdG9jb2xfZmFjdG9yeTogT1BGLAorKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4KK3doZXJlCisgICAgUlRGOiBUUmVhZFRyYW5zcG9ydEZhY3RvcnkgKyAnc3RhdGljLAorICAgIElQRjogVElucHV0UHJvdG9jb2xGYWN0b3J5ICsgJ3N0YXRpYywKKyAgICBXVEY6IFRXcml0ZVRyYW5zcG9ydEZhY3RvcnkgKyAnc3RhdGljLAorICAgIE9QRjogVE91dHB1dFByb3RvY29sRmFjdG9yeSArICdzdGF0aWMsCit7CisgICAgbGV0IHByb2Nlc3NvciA9IEZ1bGxNZWFsQW5kRHJpbmtzU2VydmljZVN5bmNQcm9jZXNzb3I6Om5ldyhGdWxsSGFuZGxlciB7fSk7CisgICAgbGV0IG11dCBzZXJ2ZXIgPSBUU2VydmVyOjpuZXcoCisgICAgICAgIHJfdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgIGlfcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgd190cmFuc3BvcnRfZmFjdG9yeSwKKyAgICAgICAgb19wcm90b2NvbF9mYWN0b3J5LAorICAgICAgICBwcm9jZXNzb3IsCisgICAgICAgIDEsCisgICAgKTsKKworICAgIHNlcnZlci5saXN0ZW4obGlzdGVuX2FkZHJlc3MpCit9CisKK3N0cnVjdCBQYXJ0SGFuZGxlcjsKKworaW1wbCBNZWFsU2VydmljZVN5bmNIYW5kbGVyIGZvciBQYXJ0SGFuZGxlciB7CisgICAgZm4gaGFuZGxlX21lYWwoJnNlbGYpIC0+IHRocmlmdDo6UmVzdWx0PE1lYWw+IHsKKyAgICAgICAgcHJpbnRsbiEoInBhcnQ6IGhhbmRsaW5nIG1lYWwgY2FsbCIpOworICAgICAgICBPayhtZWFsKCkpCisgICAgfQorfQorCitpbXBsIFJhbWVuU2VydmljZVN5bmNIYW5kbGVyIGZvciBQYXJ0SGFuZGxlciB7CisgICAgZm4gaGFuZGxlX3JhbWVuKCZzZWxmLCBfOiBpMzIpIC0+IHRocmlmdDo6UmVzdWx0PFJhbWVuPiB7CisgICAgICAgIHByaW50bG4hKCJwYXJ0OiBoYW5kbGluZyByYW1lbiBjYWxsIik7CisgICAgICAgIE9rKHJhbWVuKCkpCisgICAgfQorfQorCitpbXBsIE5hcGtpblNlcnZpY2VTeW5jSGFuZGxlciBmb3IgUGFydEhhbmRsZXIgeworICAgIGZuIGhhbmRsZV9uYXBraW4oJnNlbGYpIC0+IHRocmlmdDo6UmVzdWx0PE5hcGtpbj4geworICAgICAgICBwcmludGxuISgicGFydDogaGFuZGxpbmcgbmFwa2luIGNhbGwiKTsKKyAgICAgICAgT2sobmFwa2luKCkpCisgICAgfQorfQorCisvLyBmdWxsIHNlcnZpY2UKKy8vCisKK3N0cnVjdCBGdWxsSGFuZGxlcjsKKworaW1wbCBGdWxsTWVhbEFuZERyaW5rc1NlcnZpY2VTeW5jSGFuZGxlciBmb3IgRnVsbEhhbmRsZXIgeworICAgIGZuIGhhbmRsZV9mdWxsX21lYWxfYW5kX2RyaW5rcygmc2VsZikgLT4gdGhyaWZ0OjpSZXN1bHQ8RnVsbE1lYWxBbmREcmlua3M+IHsKKyAgICAgICAgcHJpbnRsbiEoImZ1bGxfbWVhbF9hbmRfZHJpbmtzOiBoYW5kbGluZyBmdWxsIG1lYWwgYW5kIGRyaW5rcyBjYWxsIik7CisgICAgICAgIE9rKEZ1bGxNZWFsQW5kRHJpbmtzOjpuZXcoZnVsbF9tZWFsKCksIERyaW5rOjpDYW5hZGlhbldoaXNreSkpCisgICAgfQorCisgICAgZm4gaGFuZGxlX2Jlc3RfcGllKCZzZWxmKSAtPiB0aHJpZnQ6OlJlc3VsdDxQaWU+IHsKKyAgICAgICAgcHJpbnRsbiEoImZ1bGxfbWVhbF9hbmRfZHJpbmtzOiBoYW5kbGluZyBwaWUgY2FsbCIpOworICAgICAgICBPayhQaWU6Ok1pc3Npc3NpcHBpTXVkKSAvLyBJIHByZWZlciBQaWU6OlB1bXBraW4sIGJ1dCBJIGhhdmUgdG8gY2hlY2sgdGhhdCBjYXNpbmcgd29ya3MKKyAgICB9Cit9CisKK2ltcGwgRnVsbE1lYWxTZXJ2aWNlU3luY0hhbmRsZXIgZm9yIEZ1bGxIYW5kbGVyIHsKKyAgICBmbiBoYW5kbGVfZnVsbF9tZWFsKCZzZWxmKSAtPiB0aHJpZnQ6OlJlc3VsdDxGdWxsTWVhbD4geworICAgICAgICBwcmludGxuISgiZnVsbDogaGFuZGxpbmcgZnVsbCBtZWFsIGNhbGwiKTsKKyAgICAgICAgT2soZnVsbF9tZWFsKCkpCisgICAgfQorfQorCitpbXBsIE1lYWxTZXJ2aWNlU3luY0hhbmRsZXIgZm9yIEZ1bGxIYW5kbGVyIHsKKyAgICBmbiBoYW5kbGVfbWVhbCgmc2VsZikgLT4gdGhyaWZ0OjpSZXN1bHQ8TWVhbD4geworICAgICAgICBwcmludGxuISgiZnVsbDogaGFuZGxpbmcgbWVhbCBjYWxsIik7CisgICAgICAgIE9rKG1lYWwoKSkKKyAgICB9Cit9CisKK2ltcGwgUmFtZW5TZXJ2aWNlU3luY0hhbmRsZXIgZm9yIEZ1bGxIYW5kbGVyIHsKKyAgICBmbiBoYW5kbGVfcmFtZW4oJnNlbGYsIF86IGkzMikgLT4gdGhyaWZ0OjpSZXN1bHQ8UmFtZW4+IHsKKyAgICAgICAgcHJpbnRsbiEoImZ1bGw6IGhhbmRsaW5nIHJhbWVuIGNhbGwiKTsKKyAgICAgICAgT2socmFtZW4oKSkKKyAgICB9Cit9CisKK2ltcGwgTmFwa2luU2VydmljZVN5bmNIYW5kbGVyIGZvciBGdWxsSGFuZGxlciB7CisgICAgZm4gaGFuZGxlX25hcGtpbigmc2VsZikgLT4gdGhyaWZ0OjpSZXN1bHQ8TmFwa2luPiB7CisgICAgICAgIHByaW50bG4hKCJmdWxsOiBoYW5kbGluZyBuYXBraW4gY2FsbCIpOworICAgICAgICBPayhuYXBraW4oKSkKKyAgICB9Cit9CisKK2ZuIGZ1bGxfbWVhbCgpIC0+IEZ1bGxNZWFsIHsKKyAgICBGdWxsTWVhbDo6bmV3KG1lYWwoKSwgRGVzc2VydDo6UG9ydCgiR3JhaGFtJ3MgVGF3bnkiLnRvX293bmVkKCkpKQorfQorCitmbiBtZWFsKCkgLT4gTWVhbCB7CisgICAgTWVhbDo6bmV3KG5vb2RsZSgpLCByYW1lbigpKQorfQorCitmbiBub29kbGUoKSAtPiBOb29kbGUgeworICAgIE5vb2RsZTo6bmV3KCJzcGVsdCIudG9fb3duZWQoKSwgMTAwKQorfQorCitmbiByYW1lbigpIC0+IFJhbWVuIHsKKyAgICBSYW1lbjo6bmV3KCJNciBSYW1lbiIudG9fb3duZWQoKSwgNzIsIEJyb3RoVHlwZTo6TWlzbykKK30KKworZm4gbmFwa2luKCkgLT4gTmFwa2luIHsKKyAgICBOYXBraW4ge30KK30KKworZm4gcnVuX3JlY3Vyc2l2ZV9zZXJ2ZXI8UlRGLCBJUEYsIFdURiwgT1BGPigKKyAgICBsaXN0ZW5fYWRkcmVzczogJnN0ciwKKyAgICByX3RyYW5zcG9ydF9mYWN0b3J5OiBSVEYsCisgICAgaV9wcm90b2NvbF9mYWN0b3J5OiBJUEYsCisgICAgd190cmFuc3BvcnRfZmFjdG9yeTogV1RGLAorICAgIG9fcHJvdG9jb2xfZmFjdG9yeTogT1BGLAorKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4KK3doZXJlCisgICAgUlRGOiBUUmVhZFRyYW5zcG9ydEZhY3RvcnkgKyAnc3RhdGljLAorICAgIElQRjogVElucHV0UHJvdG9jb2xGYWN0b3J5ICsgJ3N0YXRpYywKKyAgICBXVEY6IFRXcml0ZVRyYW5zcG9ydEZhY3RvcnkgKyAnc3RhdGljLAorICAgIE9QRjogVE91dHB1dFByb3RvY29sRmFjdG9yeSArICdzdGF0aWMsCit7CisgICAgbGV0IHByb2Nlc3NvciA9IHJlY3Vyc2l2ZTo6VGVzdFNlcnZpY2VTeW5jUHJvY2Vzc29yOjpuZXcoUmVjdXJzaXZlVGVzdFNlcnZlckhhbmRsZXIge30pOworICAgIGxldCBtdXQgc2VydmVyID0gVFNlcnZlcjo6bmV3KAorICAgICAgICByX3RyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICBpX3Byb3RvY29sX2ZhY3RvcnksCisgICAgICAgIHdfdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgIG9fcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgcHJvY2Vzc29yLAorICAgICAgICAxLAorICAgICk7CisKKyAgICBzZXJ2ZXIubGlzdGVuKGxpc3Rlbl9hZGRyZXNzKQorfQorCitzdHJ1Y3QgUmVjdXJzaXZlVGVzdFNlcnZlckhhbmRsZXI7CitpbXBsIHJlY3Vyc2l2ZTo6VGVzdFNlcnZpY2VTeW5jSGFuZGxlciBmb3IgUmVjdXJzaXZlVGVzdFNlcnZlckhhbmRsZXIgeworICAgIGZuIGhhbmRsZV9lY2hvX3RyZWUoJnNlbGYsIHRyZWU6IHJlY3Vyc2l2ZTo6UmVjVHJlZSkgLT4gdGhyaWZ0OjpSZXN1bHQ8cmVjdXJzaXZlOjpSZWNUcmVlPiB7CisgICAgICAgIHByaW50bG4hKCJ7Oj99IiwgdHJlZSk7CisgICAgICAgIE9rKHRyZWUpCisgICAgfQorCisgICAgZm4gaGFuZGxlX2VjaG9fbGlzdCgmc2VsZiwgbHN0OiByZWN1cnNpdmU6OlJlY0xpc3QpIC0+IHRocmlmdDo6UmVzdWx0PHJlY3Vyc2l2ZTo6UmVjTGlzdD4geworICAgICAgICBwcmludGxuISgiezo/fSIsIGxzdCk7CisgICAgICAgIE9rKGxzdCkKKyAgICB9CisKKyAgICBmbiBoYW5kbGVfZWNob19jb19yZWMoJnNlbGYsIGl0ZW06IHJlY3Vyc2l2ZTo6Q29SZWMpIC0+IHRocmlmdDo6UmVzdWx0PHJlY3Vyc2l2ZTo6Q29SZWM+IHsKKyAgICAgICAgcHJpbnRsbiEoIns6P30iLCBpdGVtKTsKKyAgICAgICAgT2soaXRlbSkKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcnMvdGVzdC9zcmMvbGliLnJzIGIvbGliL3JzL3Rlc3Qvc3JjL2xpYi5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWUxNzZlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3Rlc3Qvc3JjL2xpYi5ycwpAQCAtMCwwICsxLDU3IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK2V4dGVybiBjcmF0ZSBvcmRlcmVkX2Zsb2F0OworZXh0ZXJuIGNyYXRlIHRocmlmdDsKK2V4dGVybiBjcmF0ZSB0cnlfZnJvbTsKKworcHViIG1vZCBiYXNlX29uZTsKK3B1YiBtb2QgYmFzZV90d287CitwdWIgbW9kIG1pZGxheWVyOworcHViIG1vZCB1bHRpbWF0ZTsKK3B1YiBtb2QgcmVjdXJzaXZlOworCisjW2NmZyh0ZXN0KV0KK21vZCB0ZXN0cyB7CisKKyAgICB1c2Ugc3RkOjpkZWZhdWx0OjpEZWZhdWx0OworCisgICAgdXNlIHN1cGVyOjoqOworCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfYmVfYWJsZV90b191c2VfY29uc3RydWN0b3IoKSB7CisgICAgICAgIGxldCBfID0gbWlkbGF5ZXI6Ok1lYWw6Om5ldyhTb21lKGJhc2Vfb25lOjpOb29kbGU6OmRlZmF1bHQoKSksIE5vbmUpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2JlX2FibGVfdG9fdXNlX2NvbnN0cnVjdG9yX3dpdGhfbm9fZmllbGRzKCkgeworICAgICAgICBsZXQgXyA9IG1pZGxheWVyOjpNZWFsOjpuZXcoTm9uZSwgTm9uZSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfYmVfYWJsZV90b191c2VfY29uc3RydWN0b3Jfd2l0aG91dF9vcHRpb25fd3JhcCgpIHsKKyAgICAgICAgbGV0IF8gPSBtaWRsYXllcjo6TWVhbDo6bmV3KGJhc2Vfb25lOjpOb29kbGU6OmRlZmF1bHQoKSwgTm9uZSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfYmVfYWJsZV90b191c2VfZGVmYXVsdHMoKSB7CisgICAgICAgIGxldCBfID0gbWlkbGF5ZXI6Ok1lYWwgeworICAgICAgICAgICAgbm9vZGxlOiBTb21lKGJhc2Vfb25lOjpOb29kbGU6OmRlZmF1bHQoKSksCisgICAgICAgICAgICAuLkRlZmF1bHQ6OmRlZmF1bHQoKQorICAgICAgICB9OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9ycy90ZXN0L3RocmlmdHMvQmFzZV9PbmUudGhyaWZ0IGIvbGliL3JzL3Rlc3QvdGhyaWZ0cy9CYXNlX09uZS50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVmYTZjMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy90ZXN0L3RocmlmdHMvQmFzZV9PbmUudGhyaWZ0CkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKK3R5cGVkZWYgaTY0IFRlbXBlcmF0dXJlCisKK3R5cGVkZWYgaTggU2l6ZQorCit0eXBlZGVmIHN0cmluZyBMb2NhdGlvbgorCitjb25zdCBpMzIgQm9pbGluZ1BvaW50ID0gMTAwCisKK2NvbnN0IGxpc3Q8VGVtcGVyYXR1cmU+IFRlbXBlcmF0dXJlcyA9IFsxMCwgMTEsIDIyLCAzM10KKworLy8gSU1QT1JUQU5UOiB0ZW1wcyBzaG91bGQgZW5kIHdpdGggIi4wIiBiZWNhdXNlIHRoaXMgdGVzdHMKKy8vIHRoYXQgd2UgZG9uJ3QgaGF2ZSBhIHByb2JsZW0gd2l0aCBjb25zdCBmbG9hdCBsaXN0IGdlbmVyYXRpb24KK2NvbnN0IGxpc3Q8ZG91YmxlPiBDb21tb25UZW1wZXJhdHVyZXMgPSBbMzAwLjAsIDQ1MC4wXQorCitjb25zdCBkb3VibGUgTWVhbHNQZXJEYXkgPSAyLjU7CisKK2NvbnN0IHN0cmluZyBEZWZhdWx0UmVjaXBlTmFtZSA9ICJTb3VwLXJpc2Ugb2YgdGhlIERheSIKK2NvbnN0IGJpbmFyeSBEZWZhdWx0UmVjaXBlQmluYXJ5ID0gIlNvdXAtcmlzZSBvZiB0aGUgMDEwMTAxMDEiCisKK3N0cnVjdCBOb29kbGUgeworICAxOiBzdHJpbmcgZmxvdXJUeXBlCisgIDI6IFRlbXBlcmF0dXJlIGNvb2tUZW1wCit9CisKK3N0cnVjdCBTcGFnaGV0dGkgeworICAxOiBvcHRpb25hbCBsaXN0PE5vb2RsZT4gbm9vZGxlcworfQorCitjb25zdCBOb29kbGUgU3BlbHROb29kbGUgPSB7ICJmbG91clR5cGUiOiAic3BlbHQiLCAiY29va1RlbXAiOiAxMTAgfQorCitzdHJ1Y3QgTWVhc3VyaW5nU3Bvb24geworICAxOiBTaXplIHNpemUKK30KKworc3RydWN0IE1lYXN1cmluZ0N1cCB7CisgIDE6IGRvdWJsZSBtaWxsaXMKK30KKwordW5pb24gTWVhc3VyaW5nQWlkcyB7CisgIDE6IE1lYXN1cmluZ1Nwb29uIHNwb29uCisgIDI6IE1lYXN1cmluZ0N1cCBjdXAKK30KKworc3RydWN0IENvb2tpbmdUZW1wZXJhdHVyZXMgeworICAxOiBzZXQ8ZG91YmxlPiBjb21tb25UZW1wZXJhdHVyZXMKKyAgMjogbGlzdDxkb3VibGU+IHVzZWRUZW1wZXJhdHVyZXMKKyAgMzogbWFwPGRvdWJsZSwgZG91YmxlPiBmYWhyZW5oZWl0VG9DZW50aWdyYWRlQ29udmVyc2lvbnMKK30KKworc3RydWN0IFJlY2lwZSB7CisgIDE6IHN0cmluZyByZWNpcGVOYW1lCisgIDI6IHN0cmluZyBjdWlzaW5lCisgIDM6IGk4IHBhZ2UKK30KKwordW5pb24gQ29va2luZ1Rvb2xzIHsKKyAgMTogc2V0PE1lYXN1cmluZ1Nwb29uPiBtZWFzdXJpbmdTcG9vbnMKKyAgMjogbWFwPFNpemUsIExvY2F0aW9uPiBtZWFzdXJpbmdDdXBzLAorICAzOiBsaXN0PFJlY2lwZT4gcmVjaXBlcworfQorCmRpZmYgLS1naXQgYS9saWIvcnMvdGVzdC90aHJpZnRzL0Jhc2VfVHdvLnRocmlmdCBiL2xpYi9ycy90ZXN0L3RocmlmdHMvQmFzZV9Ud28udGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhYTZhY2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvdGVzdC90aHJpZnRzL0Jhc2VfVHdvLnRocmlmdApAQCAtMCwwICsxLDUwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCitjb25zdCBpMzIgV2F0ZXJXZWlnaHQgPSAyMDAKKworZW51bSBicm90aFR5cGUgeworICBNaXNvLAorICBzaG91eXUsCit9CisKK3N0cnVjdCBSYW1lbiB7CisgIDE6IG9wdGlvbmFsIHN0cmluZyByYW1lblR5cGUKKyAgMjogcmVxdWlyZWQgaTMyIG5vb2RsZUNvdW50CisgIDM6IGJyb3RoVHlwZSBicm90aAorfQorCitzdHJ1Y3QgTmFwa2luIHsKKyAgLy8gZW1wdHkKK30KKworc2VydmljZSBOYXBraW5TZXJ2aWNlIHsKKyAgTmFwa2luIG5hcGtpbigpCit9CisKK3NlcnZpY2UgUmFtZW5TZXJ2aWNlIGV4dGVuZHMgTmFwa2luU2VydmljZSB7CisgIFJhbWVuIHJhbWVuKDE6IGkzMiByZXF1ZXN0ZWROb29kbGVDb3VudCkKK30KKworLyogY29uc3Qgc3RydWN0IENvb2tlZFJhbWVuID0geyAiYmFyIjogMTAgfSAqLworCmRpZmYgLS1naXQgYS9saWIvcnMvdGVzdC90aHJpZnRzL01pZGxheWVyLnRocmlmdCBiL2xpYi9ycy90ZXN0L3RocmlmdHMvTWlkbGF5ZXIudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZmY0OWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvdGVzdC90aHJpZnRzL01pZGxheWVyLnRocmlmdApAQCAtMCwwICsxLDcxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCitpbmNsdWRlICJCYXNlX09uZS50aHJpZnQiCitpbmNsdWRlICJCYXNlX1R3by50aHJpZnQiCisKK2NvbnN0IGkzMiBXYXRlckJvaWxpbmdQb2ludCA9IEJhc2VfT25lLkJvaWxpbmdQb2ludAorCitjb25zdCBtYXA8c3RyaW5nLCBCYXNlX09uZS5UZW1wZXJhdHVyZT4gVGVtcGVyYXR1cmVOYW1lcyA9IHsgImZyZWV6aW5nIjogMCwgImJvaWxpbmciOiAxMDAgfQorCitjb25zdCBtYXA8c2V0PGkzMj4sIG1hcDxsaXN0PHN0cmluZz4sIHN0cmluZz4+IE15Q29uc3ROZXN0ZWRNYXAgPSB7CisgIFswLCAxLCAyLCAzXTogeyBbImZvbyJdOiAiYmFyIiB9LAorICBbMjBdOiB7IFsibnV0IiwgInRvbiJdIDogImJhciIgfSwKKyAgWzMwLCA0MF06IHsgWyJib3VuY3kiLCAidGlua2x5Il06ICJjYXN0bGUiIH0KK30KKworY29uc3QgbGlzdDxsaXN0PGkzMj4+IE15Q29uc3ROZXN0ZWRMaXN0ID0gWworICBbMCwgMSwgMl0sCisgIFszLCA0LCA1XSwKKyAgWzYsIDcsIDhdCitdCisKK2NvbnN0IHNldDxzZXQ8aTMyPj4gTXlDb25zdE5lc3RlZFNldCA9IFsKKyAgWzAsIDEsIDJdLAorICBbMywgNCwgNV0sCisgIFs2LCA3LCA4XQorXQorCitlbnVtIFBpZSB7CisgIFBVTVBLSU4sCisgIGFwcGxlLCAvLyBpbnRlbnRpb25hbGx5IHBvb3JseSBjYXNlZAorICBTVFJBV0JFUlJZX1JIVUJBUkIsCisgIEtleV9MaW1lLCAvLyBpbnRlbnRpb25hbGx5IHBvb3JseSBjYXNlZAorICBjb2NvbnV0X0NyZWFtLCAvLyBpbnRlbnRpb25hbGx5IHBvb3JseSBjYXNlZAorICBtaXNzaXNzaXBwaV9tdWQsIC8vIGludGVudGlvbmFsbHkgcG9vcmx5IGNhc2VkCit9CisKK3N0cnVjdCBNZWFsIHsKKyAgMTogQmFzZV9PbmUuTm9vZGxlIG5vb2RsZQorICAyOiBCYXNlX1R3by5SYW1lbiByYW1lbgorfQorCit1bmlvbiBEZXNzZXJ0ICB7CisgIDE6IHN0cmluZyBwb3J0CisgIDI6IHN0cmluZyBpY2VXaW5lCit9CisKK3NlcnZpY2UgTWVhbFNlcnZpY2UgZXh0ZW5kcyBCYXNlX1R3by5SYW1lblNlcnZpY2UgeworICBNZWFsIG1lYWwoKQorfQorCmRpZmYgLS1naXQgYS9saWIvcnMvdGVzdC90aHJpZnRzL1VsdGltYXRlLnRocmlmdCBiL2xpYi9ycy90ZXN0L3RocmlmdHMvVWx0aW1hdGUudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyZmExMDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvdGVzdC90aHJpZnRzL1VsdGltYXRlLnRocmlmdApAQCAtMCwwICsxLDY2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCitpbmNsdWRlICJNaWRsYXllci50aHJpZnQiCisKK2VudW0gRHJpbmsgeworICBXQVRFUiwKKyAgV0hJU0tFWSwKKyAgV0lORSwKKyAgc2NvdGNoLCAvLyBpbnRlbnRpb25hbGx5IHBvb3JseSBjYXNlZAorICBMQVRFX0hBUlZFU1RfV0lORSwKKyAgSW5kaWFfUGFsZV9BbGUsIC8vIGludGVudGlvbmFsbHkgcG9vcmx5IGNhc2VkCisgIGFwcGxlX2NpZGVyLCAvLyBpbnRlbnRpYWxseSBwb29ybHkgY2FzZWQKKyAgYmVsZ2lhbl9BbGUsIC8vIGludGVudGlvbmFsbHkgcG9vcmx5IGNhc2VkCisgIENhbmFkaWFuX3doaXNreSwgLy8gaW50ZW50aW9uYWxseSBwb29ybHkgY2FzZWQKK30KKworY29uc3QgbWFwPGk4LCBNaWRsYXllci5QaWU+IFJhbmtlZFBpZXMgPSB7CisgIDE6IE1pZGxheWVyLlBpZS5QVU1QS0lOLAorICAyOiBNaWRsYXllci5QaWUuU1RSQVdCRVJSWV9SSFVCQVJCLAorICAzOiBNaWRsYXllci5QaWUuYXBwbGUsCisgIDQ6IE1pZGxheWVyLlBpZS5taXNzaXNzaXBwaV9tdWQsCisgIDU6IE1pZGxheWVyLlBpZS5jb2NvbnV0X0NyZWFtLAorICA2OiBNaWRsYXllci5QaWUuS2V5X0xpbWUsCit9CisKK3N0cnVjdCBGdWxsTWVhbCB7CisgIDE6IHJlcXVpcmVkIE1pZGxheWVyLk1lYWwgbWVhbAorICAyOiByZXF1aXJlZCBNaWRsYXllci5EZXNzZXJ0IGRlc3NlcnQKK30KKworc3RydWN0IEZ1bGxNZWFsQW5kRHJpbmtzIHsKKyAgMTogcmVxdWlyZWQgRnVsbE1lYWwgZnVsbE1lYWwKKyAgMjogb3B0aW9uYWwgRHJpbmsgZHJpbmsKK30KKworc2VydmljZSBGdWxsTWVhbFNlcnZpY2UgZXh0ZW5kcyBNaWRsYXllci5NZWFsU2VydmljZSB7CisgIEZ1bGxNZWFsIGZ1bGxNZWFsKCkKK30KKworc2VydmljZSBGdWxsTWVhbEFuZERyaW5rc1NlcnZpY2UgZXh0ZW5kcyBGdWxsTWVhbFNlcnZpY2UgeworICBGdWxsTWVhbEFuZERyaW5rcyBmdWxsTWVhbEFuZERyaW5rcygpCisKKyAgTWlkbGF5ZXIuUGllIGJlc3RQaWUoKQorfQorCmRpZmYgLS1naXQgYS9saWIvc3QvcGFja2FnZS54bWwgYi9saWIvc3QvcGFja2FnZS54bWwKaW5kZXggZDQwNjAxOC4uZjgzOTM2YSAxMDA2NDQKLS0tIGEvbGliL3N0L3BhY2thZ2UueG1sCisrKyBiL2xpYi9zdC9wYWNrYWdlLnhtbApAQCAtMTcsNyArMTcsNyBAQAogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICB1bmRlciB0aGUgTGljZW5zZS4KICAtLT4KLTwhLS0gQXBhY2hlIFRocmlmdCBTbWFsbHRhbGsgbGlicmFyeSB2ZXJzaW9uIDAuOS4zIC0tPgorPCEtLSBBcGFjaGUgVGhyaWZ0IFNtYWxsdGFsayBsaWJyYXJ5IHZlcnNpb24gMS4wLjAgLS0+CiA8cGFja2FnZT4KICAgPG5hbWU+bGlidGhyaWZ0LXN0PC9uYW1lPgogICA8ZmlsZT50aHJpZnQuc3Q8L2ZpbGU+CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvTWFrZWZpbGUuYW0gYi9saWIvc3dpZnQvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI4OGIwNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQ2IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworU1VCRElSUyA9IC4KKworYWxsLWxvY2FsOgorCXN3aWZ0IGJ1aWxkIC0tY29uZmlndXJhdGlvbiByZWxlYXNlCisKK2luc3RhbGwtZXhlYy1ob29rOgorCXN3aWZ0IGluc3RhbGwKKworY2xlYW4tbG9jYWw6CisJc3dpZnQgcGFja2FnZSBjbGVhbgorCXJtIC1yZiAuYnVpbGQKKworcHJlY3Jvc3M6CisJc3dpZnQKKworY2hlY2stbG9jYWw6CisJc3dpZnQgdGVzdAorCitFWFRSQV9ESVNUID0gXAorCVBhY2thZ2Uuc3dpZnQgXAorCVNvdXJjZXMgXAorCVRlc3RzIFwKKwlSRUFETUUubWQKKworTUFJTlRBSU5FUkNMRUFORklMRVMgPSBcCisJTWFrZWZpbGUgXAorCU1ha2VmaWxlLmluCmRpZmYgLS1naXQgYS9saWIvc3dpZnQvUGFja2FnZS5zd2lmdCBiL2xpYi9zd2lmdC9QYWNrYWdlLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MzNmNjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvUGFja2FnZS5zd2lmdApAQCAtMCwwICsxLDI0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBQYWNrYWdlRGVzY3JpcHRpb24KKworbGV0IHBhY2thZ2UgPSBQYWNrYWdlKAorCW5hbWU6ICJUaHJpZnQiCispCmRpZmYgLS1naXQgYS9saWIvc3dpZnQvUkVBRE1FLm1kIGIvbGliL3N3aWZ0L1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjEwOTYxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1JFQURNRS5tZApAQCAtMCwwICsxLDIxNSBAQAorVGhyaWZ0IFN3aWZ0IExpYnJhcnkKKz09PT09PT09PT09PT09PT09PT09PT09PT0KKworTGljZW5zZQorLS0tLS0tLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK2Rpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCitzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwordW5kZXIgdGhlIExpY2Vuc2UuCisKKworIyMgQnVpbGQKKyAgICBzd2lmdCBidWlsZAorCisjIyBUZXN0CisgICAgc3dpZnQgdGVzdAorCisjIyBJbnN0YWxsIExpYnJhcnkKKyMjIyMjIENvY29hcG9kcworQWRkIHRoZSBmb2xsb3dpbmcgdG8geW91ciBwb2RmaWxlCitgYGBydWJ5CisgICAgcG9kICdUaHJpZnQtc3dpZnQzJywgOmdpdCA9PiAnZ2l0QGdpdGh1Yi5jb206YXBhY2hlL3RocmlmdC5naXQnLCA6YnJhbmNoID0+ICdtYXN0ZXInCitgYGAKKworIyMjIyMgU1BNCitVbmZvcnR1bmF0ZWx5IGR1ZSB0byBzb21lIGxpbWl0YXRpb25zIGluIFNQTSwgdGhlIFBhY2thZ2UgbWFuaWZlc3QgYW5kIFNvdXJjZXMgZGlyZWN0b3J5IG11c3QgYmUgYXQgdGhlIHJvb3Qgb2YgdGhlIHByb2plY3QuCitUbyBnZXQgYXJvdW5kIHRoYXQgZm9yIHRoZSB0aW1lIGJlaW5nLCB5b3UgY2FuIHVzZSB0aGlzIG1pcnJvcmVkIHJlcG8uCitBZGQgdGhlIGZvbGxvd2luZyB0byB5b3VyIFBhY2thZ2Uuc3dpZnQKK2BgYHN3aWZ0CitkZXBlbmRlbmNpZXM6IFsKKyAgICAuUGFja2FnZSh1cmw6ICJodHRwczovL2dpdGh1Yi5jb20vYXBvY29saXBzZS9UaHJpZnQtU3dpZnQuZ2l0IiwgbWFqb3JWZXJzaW9uOiAxKQorXQorYGBgCisKKyMjIFRocmlmdCBDb21waWxlcgorCitZb3UgY2FuIGNvbXBpbGUgSURMIHNvdXJjZXMgZm9yIFN3aWZ0IDMgd2l0aCB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6CisKKyAgICB0aHJpZnQgLS1nZW4gc3dpZnQgdGhyaWZ0X2ZpbGUKKworIyMgQ2xpZW50IEV4YW1wbGUKK2BgYHN3aWZ0CitsZXQgdHJhbnNwb3J0ID0gVFNvY2tldFRyYW5zcG9ydChob3N0bmFtZTogImxvY2FsaG9zdCIsIHBvcnQ6IDkwOTApIQorCisvLyAgdmFyIHByb3RvID0gVENvbXBhY3RQcm90b2NvbCh0cmFuc3BvcnQ6IHRyYW5zcG9ydCkKK2xldCBwcm90byA9IFRCaW5hcnlQcm90b2NvbChvbjogdHJhbnNwb3J0KQorLy8gIHZhciBjbGllbnQgPSBIZXJtZXNDbGllbnQoaW5vdXRQcm90b2NvbDogcHJvdG8pCitsZXQgY2xpZW50ID0gVGhyaWZ0VGVzdENsaWVudChpbm91dFByb3RvY29sOiBwcm90bykKK2RvIHsKKyAgICB0cnkgY2xpZW50LnRlc3RWb2lkKCkKK30gY2F0Y2ggbGV0IGVycm9yIHsKKyAgICBwcmludCgiXChlcnJvcikiKQorfQorYGBgCisKKyMjIExpYnJhcnkgTm90ZXMKKy0gRWxpbWluYXRlZCBQcm90b2NvbCBGYWN0b3JpZXMsIFRoZXkgd2VyZSBvbmx5IHVzZWQgaW4gYXN5bmMgY2xpZW50cyBhbmQgc2VydmVyIGltcGxlbWVudGF0aW9ucywgd2hlcmUgR2VuZXJpY3MgcHJvdmlkZSBhIGJldHRlciBhbHRlcm5hdGl2ZS4KKy0gU3dpZnR5IEVycm9ycywgQWxsIGBURXJyb3JgIHR5cGVzIGhhdmUgYSBuZXN0ZWQgYEVycm9yQ29kZWAgRW51bSBhcyB3ZWxsIGFzIHNvbWUgZXh0cmEgZmxhdm9yIHdoZXJlIG5lZWRlZC4KKy0gVmFsdWUgdHlwZWQgZXZlcnl0aGluZy4gIGBUVHJhbnNwb3J0YCBvcGVyYXRlcyBvbiB2YWx1ZSB0eXBlZCBgRGF0YWAgcmF0aGVyIHRoYW4gcmVmZXJlbmNlIHR5cGVkIGBOU0RhdGFgIG9yIGBVbnNhZmVCdWZmZXJQb2ludGVyYHMKKy0gU3dpZnQgMyBOYW1lZCBwcm90b2NvbHMuICBTd2lmdCAzIG5hbWluZyBjb252ZW50aW9ucyBzdWdnZXN0IHRoZSBlbGltaW5hdGlvbiBvZiByZWR1bmRhbnQgd29yZHMgdGhhdCBjYW4gYmUgaW5mZXJyZWQgZnJvbSB2YXJpYWJsZS9mdW5jdGlvbiBzaWduYXR1cmVzLiAgVGhpcyByZW5hbWluZyBpcyBhcHBsaWVkIHRocm91Z2hvdXQgdGhlIFN3aWZ0IDMgbGlicmFyeSBjb252ZXJ0aW5nIG1vc3QgbmFtaW5nIGNvbnZlbnRpb25zIHVzZWQgaW4gdGhlIFN3aWZ0Mi9Db2NvYSBsaWJyYXJ5IHRvIFN3aWZ0IDMtZXNxdWUgbmFtaW5nIGNvbnZlbnRpb25zLiBlZy4KK2BgYHN3aWZ0CitmdW5jIHJlYWRTdHJpbmcoKSB0aHJvd3MgLT4gU3RyaW5nCitmdW5jIHdyaXRlU3RyaW5nKF8gdmFsOiBTdHJpbmcpIHRocm93cworYGBgCitoYXZlIGJlZW4gcmVuYW1lZCB0byBlbGltaW5hdGUgcmVkdW5kYW50IHdvcmRzOgorYGBgc3dpZnQKK2Z1bmMgcmVhZCgpIHRocm93cyAtPiBTdHJpbmcKK2Z1bmMgd3JpdGUoXyB2YWw6IFN0cmluZykgdGhyb3dzCitgYGAKKworLSBFbGltaW5hdGVkIGBUSFRUUFRyYW5zcG9ydGAgdGhhdCB1c2VzIGBOU1VSTENvbm5lY3Rpb25gIGR1ZSB0byBpdCBiZWluZyBkZXByZWNhdGVkIGFuZCBub3QgYXZhaWxhYmxlIGF0IGFsbCBpbiBTd2lmdCAzIGZvciBMaW51eC4gIGBUSFRUUFNlc3Npb25UcmFuc3BvcnRgIGZyb20gdGhlIFN3aWZ0Mi9Db2NvYSBsaWJyYXJ5IHRoYXQgdXNlcyBgTlNVUkxTZXNzaW9uYCBoYXMgYmVlbiByZW5hbWVkIHRvIGBUSFRUUFRyYW5zcG9ydGAgZm9yIHRoaXMgbGlicmFyeSBhbmQgbGV2ZXJhZ2VzIGBVUkxTZXNzaW9uYCwgcHJvdmlkaW5nIGJvdGggc3luY2hyb25vdXMgKHdpdGggc2VtYXBob3JlcykgYW5kIGFzeW5jaHJvbm91cyBiZWhhdmlvci4KKy0gUHJvYmFibHkgc29tZSBNb3JlIHRoaW5ncyBJJ3ZlIG1pc3NlZCBoZXJlLgorCisjIyBHZW5lcmF0b3IgTm90ZXMKKyMjIyMgR2VuZXJhdG9yIEZsYWdzCit8IEZsYWcgICAgICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgfAorfCAtLS0tLS0tLS0tLS0tIHw6LS0tLS0tLS0tLS0tLTp8Cit8IGFzeW5jX2NsaWVudHMgfCBHZW5lcmF0ZSBjbGllbnRzIHdoaWNoIGludm9rZSBhc3luY2hyb25vdXNseSB2aWEgYmxvY2sgc3ludGF4LiBBc3luY2hyb25vdXMgY2xhc3NlcyBhcmUgYXBwZW5kZWQgd2l0aCBgX0FzeW5jYCB8Cit8IG5vX3N0cmljdCogICAgfCBHZW5lcmF0ZXMgbm9uLXN0cmljdCBzdHJ1Y3RzICAgICAgfAorfCBkZWJ1Z19kZXNjcmlwdGlvbnMgfCBBbGxvdyB1c2Ugb2YgZGVidWdEZXNjcmlwdGlvbiBzbyB0aGUgYXBwIGNhbiBhZGQgZGVzY3JpcHRpb24gdmlhIGEgY2F0ZW9nb3J5L2V4dGVuc2lvbiAgICAgIHwKK3wgbG9nX3VuZXhwZWN0ZWQgfCBMb2cgZXZlcnkgdGltZSBhbiB1bmV4cGVjdGVkIGZpZWxkIElEIG9yIHR5cGUgaXMgZW5jb3VudGVyZWQuIHwKK3wgc2FmZV9lbnVtcyAgICAgfCBHZW5lcmF0ZSBlbnVtIHR5cGVzIHdpdGggYW4gdW5rbm93biBjYXNlIHRvIGhhbmRsZSB1bnNwZWNpZmllZCB2YWx1ZXMgcmF0aGVyIHRoYW4gdGhyb3cgYSBzZXJpYWxpemF0aW9uIGVycm9yICB8CisKKworCisqTW9zdCB0aHJpZnQgbGlicmFyaWVzIGFsbG93IGVtcHR5IGluaXRpYWxpemF0aW9uIG9mIFN0cnVjdHMsIGluaXRpYWxpemluZyBgcmVxdWlyZWRgIGZpZWxkcyB3aXRoIG5pbC9udWxsL05vbmUgKFB5dGhvbiBhbmQgTm9kZSBnZW5lcmF0b3JzKS4gIFN3aWZ0IG9uIHRoZSBvdGhlciBoYW5kIHJlcXVpcmVzIGluaXRpYWxpemVycyB0byBpbml0aWFsaXplIGFsbCBub24tT3B0aW9uYWwgZmllbGRzLCBhbmQgdGh1cyB0aGUgU3dpZnQgMyBnZW5lcmF0b3IgZG9lcyBub3QgcHJvdmlkZSBkZWZhdWx0IHZhbHVlcyAodW5saWtlIHRoZSBTd2lmdCAyL0NvY29hIGdlbmVyYXRvcikuICBJbiBvdGhlciBsYW5ndWFnZXMsIHRoaXMgYWxsb3dzIHRoZSBzZW5kaW5nIG9mIE5VTEwgdmFsdWVzIGluIGZpZWxkcyB0aGF0IGFyZSBtYXJrZWQgYHJlcXVpcmVkYCwgYW5kIHRodXMgd2lsbCB0aHJvdyBhbiBlcnJvciBpbiBTd2lmdCBjbGllbnRzIGF0dGVtcHRpbmcgdG8gdmFsaWRhdGUgZmllbGRzLiAgVGhlIGBub19zdHJpY3RgIG9wdGlvbiBoZXJlIHdpbGwgaWdub3JlIHRoZSB2YWxpZGF0aW9uIGNoZWNrLCBhcyB3ZWxsIGFzIGJlaGF2ZSBzaW1pbGFyIHRvIHRoZSBTd2lmdDIvQ29jb2EgZ2VuZXJhdG9yIGFuZCBpbml0aWFsaXplIHJlcXVpcmVkIGZpZWxkcyB3aXRoIGVtcHR5IGluaXRpYWxpemVycyAod2hlcmUgcG9zc2libGUpLgorCisKKyMjIFdoYXRzIGltcGxlbWVudGVkCisjIyMjIExpYnJhcnkKKyMjIyMjIFRyYW5zcG9ydHMKKy0gW3hdIFRTb2NrZXRUcmFuc3BvcnQgLSBDRlNvY2tldCBhbmQgUG9zaXhTb2NrZXQgdmFyaWFudHMgYXZhaWxhYmxlLiBDRlNvY2tldCB2YXJpYW50IG9ubHkgY3VycmVudGx5IGF2YWlsYWJsZSBmb3IgRGFyd2luIHBsYXRmb3JtcworLSBbeF0gVEhUVFBUcmFuc3BvcnQgLSBDdXJyZW50bHkgb25seSBhdmFpbGFibGUgZm9yIERhcndpbiBwbGF0Zm9ybXMsIFN3aWZ0IEZvdW5kYXRpb24gVVJMU2Vzc2lvbiBpbXBsZW1lbnRhdGlvbiBuZWVkcyBjb21wbGV0aW9uIG9uIGxpbnV4LgorLSBbeF0gVFNvY2tldFNlcnZlciAtIFVzZXMgQ0ZTb2NrZXRzIG9ubHkgZm9yIGJpbmRpbmcsIHNob3VsZCBiZSB3b3JraW5nIG9uIGxpbnV4CistIFt4XSBURnJhbWVkVHJhbnNwb3J0CistIFt4XSBUTWVtb3J5QnVmZmVyVHJhbnNwb3J0CistIFt4XSBURmlsZVRyYW5zcG9ydCAtIEEgZmV3IHZhcmlhbnRzIHVzaW5nIEZpbGUgaGFuZGxlcyBhbmQgZmlsZSBkZXNjcmlwdG9ycy4KKy0gW3hdIFRTdHJlYW1UcmFuc3BvcnQgLSBGdWxseSBmdW5jdGlvbmFsIGluIERhcndpbiwgRm91bmRhdGlvbiBiYWNraW5nIG5vdCB5ZXQgY29tcGxldGVkIGluIExpbnV4IChUaGlzIGxpbWl0cyBUQ0ZTb2NrZXRUcmFuc3BvcnQgdG8gRGFyd2luKQorLSBbIF0gSFRUUFNlcnZlciAtIEN1cnJlbnRseSB0aGVyZSBpcyBubyBsaWdodHdlaWdodCAgSFRUUFNlcnZlciBpbXBsZW1lbnRhdGlvbiB0aGUgU3dpZnQgU3RhbmRhcmQgTGlicmFyeSwgc28gb3RoZXIgM3JkIHBhcnR5IGFsdGVybmF0aXZlcyBhcmUgcmVxdWlyZWQgYW5kIG91dCBvZiBzY29wZSBmb3IgdGhlIFRocmlmdCBsaWJyYXJ5LiAgRXhhbXBsZXMgdXNpbmcgUGVyZmVjdCB3aWxsIGJlIHByb3ZpZGVkLgorLSBbIF0gT3RoZXIgKGd6LCBldGMpCisKKyMjIyMjIFByb3RvY29scworLSBbeF0gVEJpbmFyeVByb3RvY29sCistIFt4XSBUQ29tcGFjdFByb3RvY29sCistIFsgXSBUSlNPTlByb3RvY29sIC0gVGhpcyB3aWxsIG5lZWQgdG8gYmUgaW1wbGVtZW50ZWQKKworIyMjIyMgR2VuZXJhdG9yCistIFt4XSBDb2RlIENvbXBsZXRlIEdlbmVyYXRvcgorLSBbeF0gQXN5bmMgY2xpZW50cworLSBbeF0gRG9jdW1lbnRhdGlvbiBHZW5lcmF0aW9uIC0gR2VuZXJhdG9yIHdpbGwgdHJhbnNwbGFudCBJREwgZG9jcyB0byBTd2lmdCBjb2RlIGZvciBlYXN5IGxvb2t1cCBpbiBYY29kZQorLSBbIF0gRGVmYXVsdCBWYWx1ZXMgLSBUT0RPCistIFsgXSBub19zdHJpY3QgbW9kZSAtIFRPRE8KKy0gWyBdIE5hbWVzcGFjaW5nIC0gU3RpbGwgaGF2ZW4ndCBuYWlsZWQgZG93biBhIGdvb2QgcGFyYWRpZ20gZm9yIG5hbWVzcGFjaW5nLiAgSXQgd2lsbCBsaWtlbHkgaW52b2x2ZSBjcmVhdGluZyBzdWJkaXJlY3RvcmllcyBmb3IgZGlmZmVyZW50IG5hbWVzcGFjZXMgYW5kIGV4cGVjdGluZyB0aGUgZGV2ZWxvcGVyIHRvIGltcG9ydCBlYWNoIHN1YmRpcmVjdG9yeSBhcyBzZXBhcmF0ZSBtb2R1bGVzLiAgSXQgY291bGQgZXh0ZW5kIHRvIGNyZWF0aW5nIFNQTSBQYWNrYWdlIG1hbmlmZXN0cyB3aXRoIHN1Yi1tb2R1bGVzIHdpdGhpbiB0aGUgZ2VuZXJhdGVkIG1vZHVsZQorCisKKworIyMgRXhhbXBsZSBIVFRQIFNlcnZlciB3aXRoIFBlcmZlY3QKK2BgYHN3aWZ0CitpbXBvcnQgUGVyZmVjdExpYgoraW1wb3J0IFBlcmZlY3RIVFRQCitpbXBvcnQgUGVyZmVjdEhUVFBTZXJ2ZXIKK2ltcG9ydCBEaXNwYXRjaAorCitsZXQgbG9nUXVldWUgPSBEaXNwYXRjaFF1ZXVlKGxhYmVsOiAibG9nIiwgcW9zOiAuYmFja2dyb3VuZCwgYXR0cmlidXRlczogLmNvbmN1cnJlbnQpCitsZXQgcFF1ZXVlID0gRGlzcGF0Y2hRdWV1ZShsYWJlbDogImxvZyIsIHFvczogLnVzZXJJbml0aWF0ZWQsIGF0dHJpYnV0ZXM6IC5jb25jdXJyZW50KQorCisKK2NsYXNzIFRQZXJmZWN0U2VydmVyPEluUHJvdG9jb2w6IFRQcm90b2NvbCwgT3V0UHJvdG9jb2w6IFRQcm90b2NvbD4geworCisgcHJpdmF0ZSB2YXIgc2VydmVyID0gSFRUUFNlcnZlcigpCisgcHJpdmF0ZSB2YXIgcHJvY2Vzc29yOiBUUHJvY2Vzc29yCisKKyBpbml0KGFkZHJlc3M6IFN0cmluZz8gPSBuaWwsCisgICAgICBwYXRoOiBTdHJpbmc/ID0gbmlsLAorICAgICAgcG9ydDogSW50LAorICAgICAgcHJvY2Vzc29yOiBUUHJvY2Vzc29yLAorICAgICAgaW5Qcm90b2NvbDogSW5Qcm90b2NvbC5UeXBlLAorICAgICAgb3V0UHJvdG9jb2w6IE91dFByb3RvY29sLlR5cGUpIHRocm93cyB7CisKKyAgIHNlbGYucHJvY2Vzc29yID0gcHJvY2Vzc29yCisKKyAgIGlmIGxldCBhZGRyZXNzID0gYWRkcmVzcyB7CisgICAgIHNlcnZlci5zZXJ2ZXJBZGRyZXNzID0gYWRkcmVzcworICAgfQorICAgc2VydmVyLnNlcnZlclBvcnQgPSBVSW50MTYocG9ydCkKKworICAgdmFyIHJvdXRlcyA9IFJvdXRlcygpCisgICB2YXIgdXJpID0gIi8iCisgICBpZiBsZXQgcGF0aCA9IHBhdGggeworICAgICB1cmkgKz0gcGF0aAorICAgfQorICAgcm91dGVzLmFkZChtZXRob2Q6IC5wb3N0LCB1cmk6IHVyaSkgeyByZXF1ZXN0LCByZXNwb25zZSBpbgorICAgICBwUXVldWUuYXN5bmMgeworICAgICAgIHJlc3BvbnNlLnNldEhlYWRlciguY29udGVudFR5cGUsIHZhbHVlOiAiYXBwbGljYXRpb24veC10aHJpZnQiKQorCisgICAgICAgbGV0IGl0cmFucyA9IFRNZW1vcnlCdWZmZXJUcmFuc3BvcnQoKQorICAgICAgIGlmIGxldCBieXRlcyA9IHJlcXVlc3QucG9zdEJvZHlCeXRlcyB7CisgICAgICAgICBsZXQgZGF0YSA9IERhdGEoYnl0ZXM6IGJ5dGVzKQorICAgICAgICAgaXRyYW5zLnJlc2V0KHJlYWRCdWZmZXI6IGRhdGEpCisgICAgICAgfQorCisgICAgICAgbGV0IG90cmFucyA9IFRNZW1vcnlCdWZmZXJUcmFuc3BvcnQoZmx1c2hIYW5kbGVyOiB7IHRyYW5zLCBidWZmIGluCisgICAgICAgICBsZXQgYXJyYXkgPSBidWZmLndpdGhVbnNhZmVCeXRlcyB7CisgICAgICAgICAgIEFycmF5PFVJbnQ4PihVbnNhZmVCdWZmZXJQb2ludGVyKHN0YXJ0OiAkMCwgY291bnQ6IGJ1ZmYuY291bnQpKQorICAgICAgICAgfQorICAgICAgICAgcmVzcG9uc2Uuc3RhdHVzID0gLm9rCisgICAgICAgICByZXNwb25zZS5zZXRCb2R5KGJ5dGVzOiBhcnJheSkKKyAgICAgICAgIHJlc3BvbnNlLmNvbXBsZXRlZCgpCisgICAgICAgfSkKKworICAgICAgIGxldCBpbnByb3RvID0gSW5Qcm90b2NvbChvbjogaXRyYW5zKQorICAgICAgIGxldCBvdXRwcm90byA9IE91dFByb3RvY29sKG9uOiBvdHJhbnMpCisKKyAgICAgICBkbyB7CisgICAgICAgICB0cnkgcHJvY2Vzc29yLnByb2Nlc3Mob246IGlucHJvdG8sIG91dFByb3RvY29sOiBvdXRwcm90bykKKyAgICAgICAgIHRyeSBvdHJhbnMuZmx1c2goKQorICAgICAgIH0gY2F0Y2ggeworICAgICAgICAgcmVzcG9uc2Uuc3RhdHVzID0gLmJhZFJlcXVlc3QKKyAgICAgICAgIHJlc3BvbnNlLmNvbXBsZXRlZCgpCisgICAgICAgfQorICAgICB9CisgICB9CisgICBzZXJ2ZXIuYWRkUm91dGVzKHJvdXRlcykKKyB9CisKKyBmdW5jIHNlcnZlKCkgdGhyb3dzIHsKKyAgIHRyeSBzZXJ2ZXIuc3RhcnQoKQorIH0KK30KK2BgYAorCisjIyMjIEV4YW1wbGUgVXNhZ2UKK2BgYHN3aWZ0CitjbGFzcyBTZXJ2aWNlSGFuZGxlciA6IFNlcnZpY2UgeworICAgIC4uLgorfQorbGV0IHNlcnZlciA9IHRyeT8gVFBlcmZlY3RTZXJ2ZXIocG9ydDogOTA5MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc29yOiBTZXJ2aWNlUHJvY2Vzc29yKHNlcnZpY2U6IFNlcnZpY2VIYW5kbGVyKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblByb3RvY29sOiBUQmluYXJ5UHJvdG9jb2wuc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0UHJvdG9jb2w6IFRCaW5hcnlQcm90b2NvbC5zZWxmKQorCit0cnk/IHNlcnZlcj8uc2VydmUoKQorYGBgCmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9MaW51eEhlbHBlci5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL0xpbnV4SGVscGVyLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZDkyYmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9MaW51eEhlbHBlci5zd2lmdApAQCAtMCwwICsxLDQ2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworaW1wb3J0IEZvdW5kYXRpb24KK2ltcG9ydCBDb3JlRm91bmRhdGlvbgorCisjaWYgb3MoTGludXgpCisvLy8gRXh0ZW5zaW9ucyBmb3IgTGludXggZm9yIGluY29tcGxldGUgRm91bmRhdGlvbiBBUEkncy4KKy8vLyBzd2lmdC1jb3JlbGlicy1mb3VuZGF0aW9uIGlzIG5vdCB5ZXQgMToxIHdpdGggT1NYL2lPUyBGb3VuZGF0aW9uCisKK2V4dGVuc2lvbiBDRlNvY2tldEVycm9yIHsKKyAgcHVibGljIHN0YXRpYyBsZXQgc3VjY2VzcyA9IGtDRlNvY2tldFN1Y2Nlc3MKK30KKyAgCitleHRlbnNpb24gVUludCB7CisgIHB1YmxpYyBzdGF0aWMgZnVuYyAmKGxoczogVUludCwgcmhzOiBJbnQpIC0+IFVJbnQgeworICAgIGxldCBjYXN0ID0gdW5zYWZlQml0Q2FzdChyaHMsIHRvOiBVSW50LnNlbGYpCisgICAgcmV0dXJuIGxocyAmIGNhc3QKKyAgfQorfQorCisjZWxzZQorZXh0ZW5zaW9uIENGU3RyZWFtUHJvcGVydHlLZXkgeworICBzdGF0aWMgbGV0IHNob3VsZENsb3NlTmF0aXZlU29ja2V0ICA9IENGU3RyZWFtUHJvcGVydHlLZXkoa0NGU3RyZWFtUHJvcGVydHlTaG91bGRDbG9zZU5hdGl2ZVNvY2tldCkKKyAgLy8gRXhpc3RzIGFzIFN0cmVhbS5Qcm9wZXJ0eUtleS5zb2NrZXRTZWN1cml0eWxldmVsS2V5IGJ1dCBkb2Vzbid0IHdvcmsgd2l0aCBDRlJlYWRTdHJlYW1TZXRQcm9wZXJ0eQorICBzdGF0aWMgbGV0IHNvY2tldFNlY3VyaXR5TGV2ZWwgICAgICA9IENGU3RyZWFtUHJvcGVydHlLZXkoa0NGU3RyZWFtUHJvcGVydHlTb2NrZXRTZWN1cml0eUxldmVsKQorICBzdGF0aWMgbGV0IFNTTFNldHRpbmdzICAgICAgICAgICAgICA9IENGU3RyZWFtUHJvcGVydHlLZXkoa0NGU3RyZWFtUHJvcGVydHlTU0xTZXR0aW5ncykKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVEFwcGxpY2F0aW9uRXJyb3Iuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UQXBwbGljYXRpb25FcnJvci5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzM5Mzk2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVEFwcGxpY2F0aW9uRXJyb3Iuc3dpZnQKQEAgLTAsMCArMSwxNTcgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworKiB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKworcHVibGljIHN0cnVjdCBUQXBwbGljYXRpb25FcnJvciA6IFRFcnJvciB7CisgIHB1YmxpYyBlbnVtIENvZGUgOiBURXJyb3JDb2RlIHsKKyAgICBjYXNlIHVua25vd24KKyAgICBjYXNlIHVua25vd25NZXRob2QobWV0aG9kTmFtZTogU3RyaW5nPykKKyAgICBjYXNlIGludmFsaWRNZXNzYWdlVHlwZQorICAgIGNhc2Ugd3JvbmdNZXRob2ROYW1lKG1ldGhvZE5hbWU6IFN0cmluZz8pCisgICAgY2FzZSBiYWRTZXF1ZW5jZUlkCisgICAgY2FzZSBtaXNzaW5nUmVzdWx0KG1ldGhvZE5hbWU6IFN0cmluZz8pCisgICAgY2FzZSBpbnRlcm5hbEVycm9yCisgICAgY2FzZSBwcm90b2NvbEVycm9yCisgICAgY2FzZSBpbnZhbGlkVHJhbnNmb3JtCisgICAgY2FzZSBpbnZhbGlkUHJvdG9jb2wKKyAgICBjYXNlIHVuc3VwcG9ydGVkQ2xpZW50VHlwZQorICAgIAorICAgIAorICAgIC8vLyBJbml0aWFsaXplIGEgVEFwcGxpY2F0aW9uRXJyb3Igd2l0aCBhIFRocmlmdCBlcnJvciBjb2RlCisgICAgLy8vIE5vcm1hbGx5IHRoaXMgd291bGQgYmUgYWNoaWV2ZWQgd2l0aCBSYXdSZXByZXNlbnRhYmxlIGhvd2V2ZXIKKyAgICAvLy8gYnkgZG9pbmcgdGhpcyB3ZSBjYW4gYWxsb3cgZm9yIGFzc29jaWF0ZWQgcHJvcGVydGllcyBvbiBlbnVtIGNhc2VzIGZvcgorICAgIC8vLyBjYXNlIHNwZWNpZmljIGNvbnRleHQgZGF0YSBpbiBhIFN3aWZ0eSwgdHlwZS1zYWZlIG1hbm5lci4KKyAgICAvLy8KKyAgICAvLy8gLSBwYXJhbWV0ZXIgdGhyaWZ0RXJyb3JDb2RlOiBJbnRlZ2VyIFRBcHBsaWNhdGlvbkVycm9yKGV4Y2VwdGlvbikgZXJyb3IgY29kZS4gIAorICAgIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgdG8gMCAoLnVua25vd24pCisgICAgcHVibGljIGluaXQodGhyaWZ0RXJyb3JDb2RlOiBJbnQpIHsKKyAgICAgIHN3aXRjaCB0aHJpZnRFcnJvckNvZGUgeworICAgICAgY2FzZSAxOiAgc2VsZiA9IC51bmtub3duTWV0aG9kKG1ldGhvZE5hbWU6IG5pbCkKKyAgICAgIGNhc2UgMjogIHNlbGYgPSAuaW52YWxpZE1lc3NhZ2VUeXBlCisgICAgICBjYXNlIDM6ICBzZWxmID0gLndyb25nTWV0aG9kTmFtZShtZXRob2ROYW1lOiBuaWwpCisgICAgICBjYXNlIDQ6ICBzZWxmID0gLmJhZFNlcXVlbmNlSWQKKyAgICAgIGNhc2UgNTogIHNlbGYgPSAubWlzc2luZ1Jlc3VsdChtZXRob2ROYW1lOiBuaWwpCisgICAgICBjYXNlIDY6ICBzZWxmID0gLmludGVybmFsRXJyb3IKKyAgICAgIGNhc2UgNzogIHNlbGYgPSAucHJvdG9jb2xFcnJvcgorICAgICAgY2FzZSA4OiAgc2VsZiA9IC5pbnZhbGlkUHJvdG9jb2wKKyAgICAgIGNhc2UgOTogIHNlbGYgPSAuaW52YWxpZFRyYW5zZm9ybQorICAgICAgY2FzZSAxMDogc2VsZiA9IC51bnN1cHBvcnRlZENsaWVudFR5cGUKKyAgICAgIGRlZmF1bHQ6IHNlbGYgPSAudW5rbm93bgorICAgICAgfQorICAgIH0KKyAgICBwdWJsaWMgdmFyIHRocmlmdEVycm9yQ29kZTogSW50IHsKKyAgICAgIHN3aXRjaCBzZWxmIHsKKyAgICAgIGNhc2UgLnVua25vd246ICAgICAgICAgICAgICAgIHJldHVybiAwCisgICAgICBjYXNlIC51bmtub3duTWV0aG9kOiAgICAgICAgICByZXR1cm4gMQorICAgICAgY2FzZSAuaW52YWxpZE1lc3NhZ2VUeXBlOiAgICAgcmV0dXJuIDIKKyAgICAgIGNhc2UgLndyb25nTWV0aG9kTmFtZTogICAgICAgIHJldHVybiAzCisgICAgICBjYXNlIC5iYWRTZXF1ZW5jZUlkOiAgICAgICAgICByZXR1cm4gNAorICAgICAgY2FzZSAubWlzc2luZ1Jlc3VsdDogICAgICAgICAgcmV0dXJuIDUKKyAgICAgIGNhc2UgLmludGVybmFsRXJyb3I6ICAgICAgICAgIHJldHVybiA2CisgICAgICBjYXNlIC5wcm90b2NvbEVycm9yOiAgICAgICAgICByZXR1cm4gNworICAgICAgY2FzZSAuaW52YWxpZFByb3RvY29sOiAgICAgICAgcmV0dXJuIDgKKyAgICAgIGNhc2UgLmludmFsaWRUcmFuc2Zvcm06ICAgICAgIHJldHVybiA5CisgICAgICBjYXNlIC51bnN1cHBvcnRlZENsaWVudFR5cGU6ICByZXR1cm4gMTAKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHZhciBkZXNjcmlwdGlvbjogU3RyaW5nIHsKKyAgICAgIC8vLyBPdXRwdXQgImZvciAjbWV0aG9kTmFtZSIgaWYgbWV0aG9kIGlzIG5vdCBuaWwgZWxzZSBlbXB0eQorICAgICAgbGV0IG1ldGhvZFVud3JhcDogKFN0cmluZz8pIC0+IFN0cmluZyA9ICB7IG1ldGhvZCBpbgorICAgICAgICByZXR1cm4gIlwobWV0aG9kID09IG5pbCA/ICIiIDogIiBmb3IgXChtZXRob2QgPz8gIiIpIikiCisgICAgICB9CisgICAgICBzd2l0Y2ggc2VsZiB7CisgICAgICBjYXNlIC51bmtub3duOiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlVua25vd24gVEFwcGxpY2F0aW9uRXJyb3IiCisgICAgICBjYXNlIC51bmtub3duTWV0aG9kKGxldCBtZXRob2QpOiAgICByZXR1cm4gIlVua25vd24gTWV0aG9kXChtZXRob2RVbndyYXAobWV0aG9kKSkiCisgICAgICBjYXNlIC5pbnZhbGlkTWVzc2FnZVR5cGU6ICAgICAgICAgICByZXR1cm4gIkludmFsaWQgTWVzc2FnZSBUeXBlIgorICAgICAgY2FzZSAud3JvbmdNZXRob2ROYW1lKGxldCBtZXRob2QpOiAgcmV0dXJuICJXcm9uZyBNZXRob2QgTmFtZVwobWV0aG9kVW53cmFwKG1ldGhvZCkpIgorICAgICAgY2FzZSAuYmFkU2VxdWVuY2VJZDogICAgICAgICAgICAgICAgcmV0dXJuICJCYWQgU2VxdWVuY2UgSUQiCisgICAgICBjYXNlIC5taXNzaW5nUmVzdWx0KGxldCBtZXRob2QpOiAgICByZXR1cm4gIk1pc3NpbmcgUmVzdWx0XChtZXRob2RVbndyYXAobWV0aG9kKSkiCisgICAgICBjYXNlIC5pbnRlcm5hbEVycm9yOiAgICAgICAgICAgICAgICByZXR1cm4gIkludGVybmFsIEVycm9yIgorICAgICAgY2FzZSAucHJvdG9jb2xFcnJvcjogICAgICAgICAgICAgICAgcmV0dXJuICJQcm90b2NvbCBFcnJvciIKKyAgICAgIGNhc2UgLmludmFsaWRQcm90b2NvbDogICAgICAgICAgICAgIHJldHVybiAiSW52YWxpZCBQcm90b2NvbCIKKyAgICAgIGNhc2UgLmludmFsaWRUcmFuc2Zvcm06ICAgICAgICAgICAgIHJldHVybiAiSW52YWxpZCBUcmFuc2Zvcm0iCisgICAgICBjYXNlIC51bnN1cHBvcnRlZENsaWVudFR5cGU6ICAgICAgICByZXR1cm4gIlVuc3VwcG9ydGVkIENsaWVudCBUeXBlIgorICAgICAgfQorICAgIH0KKyAgfQorCisgIHB1YmxpYyBpbml0KCkgeyB9CisgIAorICBwdWJsaWMgaW5pdCh0aHJpZnRFcnJvckNvZGUgY29kZTogSW50LCBtZXNzYWdlOiBTdHJpbmc/ID0gbmlsKSB7CisgICAgc2VsZi5lcnJvciA9IENvZGUodGhyaWZ0RXJyb3JDb2RlOiBjb2RlKQorICAgIHNlbGYubWVzc2FnZSA9IG1lc3NhZ2UKKyAgfQorICAKKyAgcHVibGljIHZhciBlcnJvcjogQ29kZSA9IC51bmtub3duCisgIHB1YmxpYyB2YXIgbWVzc2FnZTogU3RyaW5nPyA9IG5pbAorICBwdWJsaWMgc3RhdGljIHZhciBkZWZhdWx0Q2FzZTogQ29kZSB7IHJldHVybiAudW5rbm93biB9Cit9CisKK2V4dGVuc2lvbiBUQXBwbGljYXRpb25FcnJvciA6IFRTZXJpYWxpemFibGUgeworICBwdWJsaWMgc3RhdGljIHZhciB0aHJpZnRUeXBlOiBUVHlwZSB7IHJldHVybiAuc3RydWN0IH0KKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkKGZyb20gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IFRBcHBsaWNhdGlvbkVycm9yIHsKKyAgICB2YXIgZXJyb3JDb2RlOiBJbnQgPSAwCisgICAgdmFyIG1lc3NhZ2U6IFN0cmluZz8gPSBuaWwKKyAgICBfID0gdHJ5IHByb3RvLnJlYWRTdHJ1Y3RCZWdpbigpCisgICAgZmllbGRzOiB3aGlsZSB0cnVlIHsKKyAgICAgIGxldCAoXywgZmllbGRUeXBlLCBmaWVsZElEKSA9IHRyeSBwcm90by5yZWFkRmllbGRCZWdpbigpCisgICAgICAKKyAgICAgIHN3aXRjaCAoZmllbGRJRCwgZmllbGRUeXBlKSB7CisgICAgICBjYXNlIChfLCAuc3RvcCk6CisgICAgICAgIGJyZWFrIGZpZWxkcworICAgICAgY2FzZSAoMSwgLnN0cmluZyk6CisgICAgICAgIG1lc3NhZ2UgPSB0cnkgcHJvdG8ucmVhZCgpCisgICAgICBjYXNlICgyLCAuaTMyKToKKyAgICAgICAgZXJyb3JDb2RlID0gSW50KHRyeSBwcm90by5yZWFkKCkgYXMgSW50MzIpCisgICAgICAKKyAgICAgIGNhc2UgbGV0IChfLCB1bmtub3duVHlwZSk6CisgICAgICAgIHRyeSBwcm90by5za2lwKHR5cGU6IHVua25vd25UeXBlKQorICAgICAgfQorICAgICAgCisgICAgICB0cnkgcHJvdG8ucmVhZEZpZWxkRW5kKCkKKyAgICB9CisgICAgdHJ5IHByb3RvLnJlYWRTdHJ1Y3RFbmQoKQorICAgIHJldHVybiBUQXBwbGljYXRpb25FcnJvcih0aHJpZnRFcnJvckNvZGU6IGVycm9yQ29kZSwgbWVzc2FnZTogbWVzc2FnZSkKKyAgfQorCisgIHB1YmxpYyBmdW5jIHdyaXRlKHRvIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHByb3RvLndyaXRlU3RydWN0QmVnaW4obmFtZTogIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpCisgICAgCisgICAgdHJ5IHByb3RvLndyaXRlRmllbGRCZWdpbihuYW1lOiAibWVzc2FnZSIsIHR5cGU6IC5zdHJpbmcsIGZpZWxkSUQ6IDEpCisgICAgdHJ5IHByb3RvLndyaXRlKG1lc3NhZ2UgPz8gIiIpCisgICAgdHJ5IHByb3RvLndyaXRlRmllbGRFbmQoKQorICAgIAorICAgIHRyeSBwcm90by53cml0ZUZpZWxkQmVnaW4obmFtZTogInR5cGUiLCB0eXBlOiAuaTMyLCBmaWVsZElEOiAyKQorICAgIGxldCB2YWwgPSBJbnQzMihlcnJvci50aHJpZnRFcnJvckNvZGUpCisgICAgdHJ5IHByb3RvLndyaXRlKHZhbCkKKyAgICB0cnkgcHJvdG8ud3JpdGVGaWVsZEVuZCgpCisgICAgdHJ5IHByb3RvLndyaXRlRmllbGRTdG9wKCkKKyAgICB0cnkgcHJvdG8ud3JpdGVTdHJ1Y3RFbmQoKQorICB9CisgIAorICBwdWJsaWMgdmFyIGhhc2hWYWx1ZTogSW50IHsKKyAgICByZXR1cm4gZXJyb3IudGhyaWZ0RXJyb3JDb2RlICYrIChtZXNzYWdlPy5oYXNoVmFsdWUgPz8gMCkKKyAgfQorfQorCitwdWJsaWMgZnVuYyA9PShsaHM6IFRBcHBsaWNhdGlvbkVycm9yLCByaHM6IFRBcHBsaWNhdGlvbkVycm9yKSAtPiBCb29sIHsKKyAgcmV0dXJuIGxocy5lcnJvci50aHJpZnRFcnJvckNvZGUgPT0gcmhzLmVycm9yLnRocmlmdEVycm9yQ29kZSAmJiBsaHMubWVzc2FnZSA9PSByaHMubWVzc2FnZQorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVEJpbmFyeS5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RCaW5hcnkuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJlNTY0NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RCaW5hcnkuc3dpZnQKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgRm91bmRhdGlvbgorCitleHRlbnNpb24gRGF0YSA6IFRTZXJpYWxpemFibGUgeworICBwdWJsaWMgc3RhdGljIHZhciB0aHJpZnRUeXBlOiBUVHlwZSB7IHJldHVybiAuc3RyaW5nIH0KKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkKGZyb20gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IERhdGEgeworICAgIHJldHVybiB0cnkgcHJvdG8ucmVhZCgpIGFzIERhdGEKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUodG8gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGUoc2VsZikKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVEJpbmFyeVByb3RvY29sLnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVEJpbmFyeVByb3RvY29sLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NzI0OWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UQmluYXJ5UHJvdG9jb2wuc3dpZnQKQEAgLTAsMCArMSwzODQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW1wb3J0IEZvdW5kYXRpb24KKworcHVibGljIHN0cnVjdCBUQmluYXJ5UHJvdG9jb2xWZXJzaW9uIHsKKyAgc3RhdGljIGxldCB2ZXJzaW9uMSAgICA9IEludDMyKGJpdFBhdHRlcm46IDB4ODAwMTAwMDApCisgIHN0YXRpYyBsZXQgdmVyc2lvbk1hc2sgPSBJbnQzMihiaXRQYXR0ZXJuOiAweGZmZmYwMDAwKQorfQorCitwdWJsaWMgY2xhc3MgVEJpbmFyeVByb3RvY29sOiBUUHJvdG9jb2wgeworICBwdWJsaWMgdmFyIG1lc3NhZ2VTaXplTGltaXQ6IFVJbnQzMiAgPSAwCisgIAorICBwdWJsaWMgdmFyIHRyYW5zcG9ydDogVFRyYW5zcG9ydAorICAKKyAgLy8gY2xhc3MgbGV2ZWwgcHJvcGVydGllcyBmb3Igc2V0dGluZyBnbG9iYWwgY29uZmlnICh1c2VmdWwgZm9yIHNlcnZlciBpbiBsaWV1IG9mIEZhY3RvcnkgZGVzaWduKQorICBwdWJsaWMgc3RhdGljIHZhciBzdHJpY3RSZWFkOiBCb29sID0gZmFsc2UKKyAgcHVibGljIHN0YXRpYyB2YXIgc3RyaWN0V3JpdGU6IEJvb2wgPSB0cnVlCisKKyAgcHJpdmF0ZSB2YXIgc3RyaWN0UmVhZDogQm9vbAorICBwcml2YXRlIHZhciBzdHJpY3RXcml0ZTogQm9vbAorICAKKyAgdmFyIGN1cnJlbnRNZXNzYWdlTmFtZTogU3RyaW5nPworICB2YXIgY3VycmVudEZpZWxkTmFtZTogU3RyaW5nPworICAKKyAgCisgIHB1YmxpYyBjb252ZW5pZW5jZSBpbml0KHRyYW5zcG9ydDogVFRyYW5zcG9ydCwgc3RyaWN0UmVhZDogQm9vbCwgc3RyaWN0V3JpdGU6IEJvb2wpIHsKKyAgICBzZWxmLmluaXQob246IHRyYW5zcG9ydCkKKyAgICBzZWxmLnN0cmljdFJlYWQgPSBzdHJpY3RSZWFkCisgICAgc2VsZi5zdHJpY3RXcml0ZSA9IHN0cmljdFdyaXRlCisgIH0KKyAgCisgIHB1YmxpYyByZXF1aXJlZCBpbml0KG9uIHRyYW5zcG9ydDogVFRyYW5zcG9ydCkgeworICAgIHNlbGYudHJhbnNwb3J0ID0gdHJhbnNwb3J0CisgICAgc2VsZi5zdHJpY3RXcml0ZSA9IFRCaW5hcnlQcm90b2NvbC5zdHJpY3RXcml0ZQorICAgIHNlbGYuc3RyaWN0UmVhZCA9IFRCaW5hcnlQcm90b2NvbC5zdHJpY3RSZWFkCisgIH0KKyAgCisgIGZ1bmMgcmVhZFN0cmluZ0JvZHkoXyBzaXplOiBJbnQpIHRocm93cyAtPiBTdHJpbmcgeworICAgIAorICAgIHZhciBkYXRhID0gRGF0YSgpCisgICAgdHJ5IFByb3RvY29sVHJhbnNwb3J0VHJ5KGVycm9yOiBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVHJhbnNwb3J0IHJlYWQgZmFpbGVkIikpIHsKKyAgICAgIGRhdGEgPSB0cnkgc2VsZi50cmFuc3BvcnQucmVhZEFsbChzaXplOiBzaXplKQorICAgIH0KKyAgICAKKyAgICByZXR1cm4gU3RyaW5nKGRhdGE6IGRhdGEsIGVuY29kaW5nOiBTdHJpbmcuRW5jb2RpbmcudXRmOCkgPz8gIiIKKyAgfQorICAKKyAgLy8vIE1hcms6IC0gVFByb3RvY29sCisgIAorICBwdWJsaWMgZnVuYyByZWFkTWVzc2FnZUJlZ2luKCkgdGhyb3dzIC0+IChTdHJpbmcsIFRNZXNzYWdlVHlwZSwgSW50MzIpIHsKKyAgICBsZXQgc2l6ZTogSW50MzIgPSB0cnkgcmVhZCgpCisgICAgdmFyIG1lc3NhZ2VOYW1lID0gIiIKKyAgICB2YXIgdHlwZSA9IFRNZXNzYWdlVHlwZS5leGNlcHRpb24KKyAgICAKKyAgICBpZiBzaXplIDwgMCB7CisgICAgICBsZXQgdmVyc2lvbiA9IHNpemUgJiBUQmluYXJ5UHJvdG9jb2xWZXJzaW9uLnZlcnNpb25NYXNrCisgICAgICBpZiB2ZXJzaW9uICE9IFRCaW5hcnlQcm90b2NvbFZlcnNpb24udmVyc2lvbjEgeworICAgICAgICB0aHJvdyBUUHJvdG9jb2xFcnJvcihlcnJvcjogLmJhZFZlcnNpb24oZXhwZWN0ZWQ6ICJcKFRCaW5hcnlQcm90b2NvbFZlcnNpb24udmVyc2lvbjEpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdDogIlwodmVyc2lvbikiKSkKKyAgICAgIH0KKyAgICAgIHR5cGUgPSBUTWVzc2FnZVR5cGUocmF3VmFsdWU6IEludDMyKHNpemUpICYgMHgwMEZGKSA/PyB0eXBlCisgICAgICBtZXNzYWdlTmFtZSA9IHRyeSByZWFkKCkKKyAgICB9IGVsc2UgeworICAgICAgaWYgc3RyaWN0UmVhZCB7CisgICAgICAgIGxldCBlcnJvck1lc3NhZ2UgPSAiTWlzc2luZyBtZXNzYWdlIHZlcnNpb24sIG9sZCBjbGllbnQ/IE1lc3NhZ2UgTmFtZTogXChjdXJyZW50TWVzc2FnZU5hbWUgPz8gIiIpIgorICAgICAgICB0aHJvdyBUUHJvdG9jb2xFcnJvcihlcnJvcjogLmludmFsaWREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBlcnJvck1lc3NhZ2UpCisgICAgICB9CisgICAgICBpZiBtZXNzYWdlU2l6ZUxpbWl0ID4gMCAmJiBzaXplID4gSW50MzIobWVzc2FnZVNpemVMaW1pdCkgeworICAgICAgICB0aHJvdyBUUHJvdG9jb2xFcnJvcihlcnJvcjogLnNpemVMaW1pdChsaW1pdDogSW50KG1lc3NhZ2VTaXplTGltaXQpLCBnb3Q6IEludChzaXplKSkpCisgICAgICB9CisgICAgICAKKyAgICAgIG1lc3NhZ2VOYW1lID0gdHJ5IHJlYWRTdHJpbmdCb2R5KEludChzaXplKSkKKyAgICAgIHR5cGUgPSBUTWVzc2FnZVR5cGUocmF3VmFsdWU6IEludDMyKHRyeSByZWFkKCkgYXMgVUludDgpKSA/PyB0eXBlCisgICAgfQorICAgIAorICAgIGxldCBzZXFJRDogSW50MzIgPSB0cnkgcmVhZCgpCisgICAgcmV0dXJuIChtZXNzYWdlTmFtZSwgdHlwZSwgc2VxSUQpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRNZXNzYWdlRW5kKCkgdGhyb3dzIHsKKyAgICByZXR1cm4KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZFN0cnVjdEJlZ2luKCkgdGhyb3dzIC0+IFN0cmluZyB7CisgICAgcmV0dXJuICIiCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRTdHJ1Y3RFbmQoKSB0aHJvd3MgeworICAgIHJldHVybgorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkRmllbGRCZWdpbigpIHRocm93cyAtPiAoU3RyaW5nLCBUVHlwZSwgSW50MzIpIHsKKyAgICAKKyAgICBsZXQgZmllbGRUeXBlID0gVFR5cGUocmF3VmFsdWU6IEludDMyKHRyeSByZWFkKCkgYXMgVUludDgpKSA/PyBUVHlwZS5zdG9wCisgICAgdmFyIGZpZWxkSUQ6IEludDMyID0gMAorICAgIAorICAgIGlmIGZpZWxkVHlwZSAhPSAuc3RvcCB7CisgICAgICBmaWVsZElEID0gSW50MzIodHJ5IHJlYWQoKSBhcyBJbnQxNikKKyAgICB9CisgICAgCisgICAgcmV0dXJuICgiIiwgZmllbGRUeXBlLCBmaWVsZElEKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkRmllbGRFbmQoKSB0aHJvd3MgeworICAgIHJldHVybgorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkTWFwQmVnaW4oKSB0aHJvd3MgLT4gKFRUeXBlLCBUVHlwZSwgSW50MzIpIHsKKyAgICB2YXIgcmF3ID0gSW50MzIodHJ5IHJlYWQoKSBhcyBVSW50OCkKKyAgICBndWFyZCBsZXQga2V5VHlwZSA9IFRUeXBlKHJhd1ZhbHVlOiByYXcpIGVsc2UgeworICAgICAgdGhyb3cgVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlVua25vd24gdmFsdWUgZm9yIGtleVR5cGUgVFR5cGU6IFwocmF3KSIpCisgICAgfQorICAgIAorICAgIHJhdyA9IEludDMyKHRyeSByZWFkKCkgYXMgVUludDgpCisgICAgZ3VhcmQgbGV0IHZhbHVlVHlwZSA9IFRUeXBlKHJhd1ZhbHVlOiByYXcpIGVsc2UgeworICAgICAgdGhyb3cgVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlVua25vd24gdmFsdWUgZm9yIHZhbHVlVHlwZSBUVHlwZTogXChyYXcpIikKKyAgICB9CisgICAgbGV0IHNpemU6IEludDMyID0gdHJ5IHJlYWQoKQorICAgIAorICAgIHJldHVybiAoa2V5VHlwZSwgdmFsdWVUeXBlLCBzaXplKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkTWFwRW5kKCkgdGhyb3dzIHsKKyAgICByZXR1cm4KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZFNldEJlZ2luKCkgdGhyb3dzIC0+IChUVHlwZSwgSW50MzIpIHsKKyAgICBsZXQgcmF3ID0gSW50MzIodHJ5IHJlYWQoKSBhcyBVSW50OCkKKyAgICBndWFyZCBsZXQgZWxlbWVudFR5cGUgPSBUVHlwZShyYXdWYWx1ZTogcmF3KSBlbHNlIHsKKyAgICAgIHRocm93IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJVbmtub3duIHZhbHVlIGZvciBlbGVtZW50VHlwZSBUVHlwZTogXChyYXcpIikKKyAgICB9CisgICAgCisgICAgbGV0IHNpemU6IEludDMyID0gdHJ5IHJlYWQoKQorICAgIAorICAgIHJldHVybiAoZWxlbWVudFR5cGUsIHNpemUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRTZXRFbmQoKSB0aHJvd3MgeworICAgIHJldHVybgorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkTGlzdEJlZ2luKCkgdGhyb3dzIC0+IChUVHlwZSwgSW50MzIpIHsKKyAgICBsZXQgcmF3ID0gSW50MzIodHJ5IHJlYWQoKSBhcyBVSW50OCkKKyAgICBndWFyZCBsZXQgZWxlbWVudFR5cGUgPSBUVHlwZShyYXdWYWx1ZTogcmF3KSBlbHNlIHsKKyAgICAgIHRocm93IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJVbmtub3duIHZhbHVlIGZvciBlbGVtZW50VHlwZSBUVHlwZTogXChyYXcpIikKKyAgICB9CisgICAgbGV0IHNpemU6IEludDMyID0gdHJ5IHJlYWQoKQorICAgIAorICAgIHJldHVybiAoZWxlbWVudFR5cGUsIHNpemUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRMaXN0RW5kKCkgdGhyb3dzIHsKKyAgICByZXR1cm4KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBTdHJpbmcgeworICAgIGxldCBkYXRhOiBEYXRhID0gdHJ5IHJlYWQoKQorICAgIGd1YXJkIGxldCBzdHIgPSBTdHJpbmcuaW5pdChkYXRhOiBkYXRhLCBlbmNvZGluZzogLnV0ZjgpIGVsc2UgeworICAgICAgdGhyb3cgVFByb3RvY29sRXJyb3IoZXJyb3I6IC5pbnZhbGlkRGF0YSwgbWVzc2FnZTogIkNvdWxkbid0IGVuY29kZSBVVEYtOCBmcm9tIGRhdGEgcmVhZCIpCisgICAgfQorICAgIHJldHVybiBzdHIKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBCb29sIHsKKyAgICByZXR1cm4gKHRyeSByZWFkKCkgYXMgVUludDgpID09IDEKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBVSW50OCB7CisgICAgdmFyIGJ1ZmYgPSBEYXRhKCkKKyAgICB0cnkgUHJvdG9jb2xUcmFuc3BvcnRUcnkoZXJyb3I6IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJUcmFuc3BvcnQgUmVhZCBGYWlsZWQiKSkgeworICAgICAgYnVmZiA9IHRyeSBzZWxmLnRyYW5zcG9ydC5yZWFkQWxsKHNpemU6IDEpCisgICAgfQorICAgIHJldHVybiBidWZmWzBdCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gSW50MTYgeworICAgIHZhciBidWZmID0gRGF0YSgpCisgICAgdHJ5IFByb3RvY29sVHJhbnNwb3J0VHJ5KGVycm9yOiBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVHJhbnNwb3J0IFJlYWQgRmFpbGVkIikpIHsKKyAgICAgIGJ1ZmYgPSB0cnkgc2VsZi50cmFuc3BvcnQucmVhZEFsbChzaXplOiAyKQorICAgIH0KKyAgICB2YXIgcmV0ID0gSW50MTYoYnVmZlswXSAmIDB4ZmYpIDw8IDgKKyAgICByZXQgfD0gICAgSW50MTYoYnVmZlsxXSAmIDB4ZmYpCisgICAgcmV0dXJuIHJldAorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IEludDMyIHsKKyAgICB2YXIgYnVmZiA9IERhdGEoKQorICAgIHRyeSBQcm90b2NvbFRyYW5zcG9ydFRyeShlcnJvcjogVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlRyYW5zcG9ydCBSZWFkIEZhaWxlZCIpKSB7CisgICAgICBidWZmID0gdHJ5IHNlbGYudHJhbnNwb3J0LnJlYWRBbGwoc2l6ZTogNCkKKyAgICB9CisgICAgdmFyIHJldCA9IEludDMyKGJ1ZmZbMF0gJiAweGZmKSA8PCAyNAorICAgIHJldCB8PSAgICBJbnQzMihidWZmWzFdICYgMHhmZikgPDwgMTYKKyAgICByZXQgfD0gICAgSW50MzIoYnVmZlsyXSAmIDB4ZmYpIDw8IDgKKyAgICByZXQgfD0gICAgSW50MzIoYnVmZlszXSAmIDB4ZmYpCisgICAgCisgICAgcmV0dXJuIHJldAorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IEludDY0IHsKKyAgICB2YXIgYnVmZiA9IERhdGEoKQorICAgIHRyeSBQcm90b2NvbFRyYW5zcG9ydFRyeShlcnJvcjogVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlRyYW5zcG9ydCBSZWFkIEZhaWxlZCIpKSB7CisgICAgICBidWZmID0gdHJ5IHNlbGYudHJhbnNwb3J0LnJlYWRBbGwoc2l6ZTogOCkKKyAgICB9CisgICAgdmFyIHJldCA9IEludDY0KGJ1ZmZbMF0gJiAweGZmKSA8PCA1NgorICAgIHJldCB8PSAgICBJbnQ2NChidWZmWzFdICYgMHhmZikgPDwgNDgKKyAgICByZXQgfD0gICAgSW50NjQoYnVmZlsyXSAmIDB4ZmYpIDw8IDQwCisgICAgcmV0IHw9ICAgIEludDY0KGJ1ZmZbM10gJiAweGZmKSA8PCAzMgorICAgIHJldCB8PSAgICBJbnQ2NChidWZmWzRdICYgMHhmZikgPDwgMjQKKyAgICByZXQgfD0gICAgSW50NjQoYnVmZls1XSAmIDB4ZmYpIDw8IDE2CisgICAgcmV0IHw9ICAgIEludDY0KGJ1ZmZbNl0gJiAweGZmKSA8PCA4CisgICAgcmV0IHw9ICAgIEludDY0KGJ1ZmZbN10gJiAweGZmKQorICAgIAorICAgIHJldHVybiByZXQKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBEb3VibGUgeworICAgIGxldCB2YWwgPSB0cnkgcmVhZCgpIGFzIEludDY0CisgICAgcmV0dXJuIERvdWJsZShiaXRQYXR0ZXJuOiBVSW50NjQoYml0UGF0dGVybjogdmFsKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBEYXRhIHsKKyAgICBsZXQgc2l6ZSA9IEludCh0cnkgcmVhZCgpIGFzIEludDMyKQorICAgIHZhciBkYXRhID0gRGF0YSgpCisgICAgdHJ5IFByb3RvY29sVHJhbnNwb3J0VHJ5KGVycm9yOiBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVHJhbnNwb3J0IFJlYWQgRmFpbGVkIikpIHsKKyAgICAgIGRhdGEgPSB0cnkgc2VsZi50cmFuc3BvcnQucmVhZEFsbChzaXplOiBzaXplKQorICAgIH0KKyAgICAKKyAgICByZXR1cm4gZGF0YQorICB9CisgIAorICAvLyBXcml0ZSBtZXRob2RzCisgIAorICBwdWJsaWMgZnVuYyB3cml0ZU1lc3NhZ2VCZWdpbihuYW1lOiBTdHJpbmcsIHR5cGUgbWVzc2FnZVR5cGU6IFRNZXNzYWdlVHlwZSwgc2VxdWVuY2VJRDogSW50MzIpIHRocm93cyB7CisgICAgaWYgc3RyaWN0V3JpdGUgeworICAgICAgbGV0IHZlcnNpb24gPSBUQmluYXJ5UHJvdG9jb2xWZXJzaW9uLnZlcnNpb24xIHwgSW50MzIobWVzc2FnZVR5cGUucmF3VmFsdWUpCisgICAgICB0cnkgd3JpdGUodmVyc2lvbikKKyAgICAgIHRyeSB3cml0ZShuYW1lKQorICAgICAgdHJ5IHdyaXRlKHNlcXVlbmNlSUQpCisgICAgfSBlbHNlIHsKKyAgICAgIHRyeSB3cml0ZShuYW1lKQorICAgICAgdHJ5IHdyaXRlKFVJbnQ4KG1lc3NhZ2VUeXBlLnJhd1ZhbHVlKSkKKyAgICAgIHRyeSB3cml0ZShzZXF1ZW5jZUlEKQorICAgIH0KKyAgICBjdXJyZW50TWVzc2FnZU5hbWUgPSBuYW1lCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlTWVzc2FnZUVuZCgpIHRocm93cyB7CisgICAgY3VycmVudE1lc3NhZ2VOYW1lID0gbmlsCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlU3RydWN0QmVnaW4obmFtZTogU3RyaW5nKSB0aHJvd3MgeworICAgIHJldHVybgorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZVN0cnVjdEVuZCgpIHRocm93cyB7CisgICAgcmV0dXJuCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlRmllbGRCZWdpbihuYW1lOiBTdHJpbmcsIHR5cGUgZmllbGRUeXBlOiBUVHlwZSwgZmllbGRJRDogSW50MzIpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlKFVJbnQ4KGZpZWxkVHlwZS5yYXdWYWx1ZSkpCisgICAgdHJ5IHdyaXRlKEludDE2KGZpZWxkSUQpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZUZpZWxkU3RvcCgpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlKFVJbnQ4KFRUeXBlLnN0b3AucmF3VmFsdWUpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZUZpZWxkRW5kKCkgdGhyb3dzIHsKKyAgICByZXR1cm4KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVNYXBCZWdpbihrZXlUeXBlOiBUVHlwZSwgdmFsdWVUeXBlOiBUVHlwZSwgc2l6ZTogSW50MzIpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlKFVJbnQ4KGtleVR5cGUucmF3VmFsdWUpKQorICAgIHRyeSB3cml0ZShVSW50OCh2YWx1ZVR5cGUucmF3VmFsdWUpKQorICAgIHRyeSB3cml0ZShzaXplKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZU1hcEVuZCgpIHRocm93cyB7CisgICAgcmV0dXJuCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlU2V0QmVnaW4oZWxlbWVudFR5cGU6IFRUeXBlLCBzaXplOiBJbnQzMikgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGUoVUludDgoZWxlbWVudFR5cGUucmF3VmFsdWUpKQorICAgIHRyeSB3cml0ZShzaXplKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZVNldEVuZCgpIHRocm93cyB7CisgICAgcmV0dXJuCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlTGlzdEJlZ2luKGVsZW1lbnRUeXBlOiBUVHlwZSwgc2l6ZTogSW50MzIpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlKFVJbnQ4KGVsZW1lbnRUeXBlLnJhd1ZhbHVlKSkKKyAgICB0cnkgd3JpdGUoc2l6ZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVMaXN0RW5kKCkgdGhyb3dzIHsKKyAgICByZXR1cm4KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogU3RyaW5nKSB0aHJvd3MgeworICAgIHRyeSB3cml0ZSh2YWx1ZS5kYXRhKHVzaW5nOiAudXRmOCkhKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZShfIHZhbHVlOiBCb29sKSB0aHJvd3MgeworICAgIGxldCBieXRlVmFsOiBVSW50OCA9IHZhbHVlID8gMSA6IDAKKyAgICB0cnkgd3JpdGUoYnl0ZVZhbCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogVUludDgpIHRocm93cyB7CisgICAgbGV0IGJ1ZmYgPSBEYXRhKGJ5dGVzOiBbdmFsdWVdKQorICAgIAorICAgIHRyeSBQcm90b2NvbFRyYW5zcG9ydFRyeShlcnJvcjogVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlRyYW5zcG9ydCB3cml0ZSBmYWlsZWQiKSkgeworICAgICAgdHJ5IHNlbGYudHJhbnNwb3J0LndyaXRlKGRhdGE6IGJ1ZmYpCisgICAgfQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZShfIHZhbHVlOiBJbnQxNikgdGhyb3dzIHsKKyAgICB2YXIgYnVmZiA9IERhdGEoKQorICAgIGJ1ZmYuYXBwZW5kKERhdGEoYnl0ZXM6IFtVSW50OCgweGZmICYgKHZhbHVlID4+IDgpKV0pKQorICAgIGJ1ZmYuYXBwZW5kKERhdGEoYnl0ZXM6IFtVSW50OCgweGZmICYgKHZhbHVlKSldKSkKKyAgICB0cnkgUHJvdG9jb2xUcmFuc3BvcnRUcnkoZXJyb3I6IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJUcmFuc3BvcnQgd3JpdGUgZmFpbGVkIikpIHsKKyAgICAgIHRyeSBzZWxmLnRyYW5zcG9ydC53cml0ZShkYXRhOiBidWZmKQorICAgIH0KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogSW50MzIpIHRocm93cyB7CisgICAgdmFyIGJ1ZmYgPSBEYXRhKCkKKyAgICBidWZmLmFwcGVuZChEYXRhKGJ5dGVzOiBbVUludDgoMHhmZiAmICh2YWx1ZSA+PiAyNCkpXSkpCisgICAgYnVmZi5hcHBlbmQoRGF0YShieXRlczogW1VJbnQ4KDB4ZmYgJiAodmFsdWUgPj4gMTYpKV0pKQorICAgIGJ1ZmYuYXBwZW5kKERhdGEoYnl0ZXM6IFtVSW50OCgweGZmICYgKHZhbHVlID4+IDgpKV0pKQorICAgIGJ1ZmYuYXBwZW5kKERhdGEoYnl0ZXM6IFtVSW50OCgweGZmICYgKHZhbHVlKSldKSkKKyAgICAKKyAgICB0cnkgUHJvdG9jb2xUcmFuc3BvcnRUcnkoZXJyb3I6IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJUcmFuc3BvcnQgd3JpdGUgZmFpbGVkIikpIHsKKyAgICAgIHRyeSBzZWxmLnRyYW5zcG9ydC53cml0ZShkYXRhOiBidWZmKQorICAgIH0KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogSW50NjQpIHRocm93cyB7CisgICAgdmFyIGJ1ZmYgPSBEYXRhKCkKKyAgICBidWZmLmFwcGVuZChEYXRhKGJ5dGVzOiBbVUludDgoMHhmZiAmICh2YWx1ZSA+PiA1NikpXSkpCisgICAgYnVmZi5hcHBlbmQoRGF0YShieXRlczogW1VJbnQ4KDB4ZmYgJiAodmFsdWUgPj4gNDgpKV0pKQorICAgIGJ1ZmYuYXBwZW5kKERhdGEoYnl0ZXM6IFtVSW50OCgweGZmICYgKHZhbHVlID4+IDQwKSldKSkKKyAgICBidWZmLmFwcGVuZChEYXRhKGJ5dGVzOiBbVUludDgoMHhmZiAmICh2YWx1ZSA+PiAzMikpXSkpCisgICAgYnVmZi5hcHBlbmQoRGF0YShieXRlczogW1VJbnQ4KDB4ZmYgJiAodmFsdWUgPj4gMjQpKV0pKQorICAgIGJ1ZmYuYXBwZW5kKERhdGEoYnl0ZXM6IFtVSW50OCgweGZmICYgKHZhbHVlID4+IDE2KSldKSkKKyAgICBidWZmLmFwcGVuZChEYXRhKGJ5dGVzOiBbVUludDgoMHhmZiAmICh2YWx1ZSA+PiA4KSldKSkKKyAgICBidWZmLmFwcGVuZChEYXRhKGJ5dGVzOiBbVUludDgoMHhmZiAmICh2YWx1ZSkpXSkpCisgICAgCisgICAgdHJ5IFByb3RvY29sVHJhbnNwb3J0VHJ5KGVycm9yOiBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVHJhbnNwb3J0IHdyaXRlIGZhaWxlZCIpKSB7CisgICAgICB0cnkgc2VsZi50cmFuc3BvcnQud3JpdGUoZGF0YTogYnVmZikKKyAgICB9CisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IERvdWJsZSkgdGhyb3dzIHsKKyAgICAvLyBOb3RhYmx5IHVuc2FmZSwgc2luY2UgRG91YmxlIGFuZCBJbnQ2NCBhcmUgdGhlIHNhbWUgc2l6ZSwgdGhpcyBzaG91bGQgd29yayBmaW5lCisgICAgdHJ5IHNlbGYud3JpdGUoSW50NjQoYml0UGF0dGVybjogdmFsdWUuYml0UGF0dGVybikpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gZGF0YTogRGF0YSkgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGUoSW50MzIoZGF0YS5jb3VudCkpCisgICAgCisgICAgdHJ5IFByb3RvY29sVHJhbnNwb3J0VHJ5KGVycm9yOiBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVHJhbnNwb3J0IHdyaXRlIGZhaWxlZCIpKSB7CisgICAgICB0cnkgc2VsZi50cmFuc3BvcnQud3JpdGUoZGF0YTogZGF0YSkKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RDbGllbnQuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UQ2xpZW50LnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMzI4OGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UQ2xpZW50LnN3aWZ0CkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitvcGVuIGNsYXNzIFRDbGllbnQgeworICBwdWJsaWMgbGV0IGluUHJvdG9jb2w6IFRQcm90b2NvbAorICBwdWJsaWMgbGV0IG91dFByb3RvY29sOiBUUHJvdG9jb2wKKworICByZXF1aXJlZCBwdWJsaWMgaW5pdChpbm91dFByb3RvY29sOiBUUHJvdG9jb2wpIHsKKyAgICBzZWxmLmluUHJvdG9jb2wgPSBpbm91dFByb3RvY29sCisgICAgc2VsZi5vdXRQcm90b2NvbCA9IGlub3V0UHJvdG9jb2wKKyAgfQorCisgIHJlcXVpcmVkIHB1YmxpYyBpbml0KGluUHJvdG9jb2w6IFRQcm90b2NvbCwgb3V0UHJvdG9jb2w6IFRQcm90b2NvbCkgeworICAgIHNlbGYuaW5Qcm90b2NvbCA9IGluUHJvdG9jb2wKKyAgICBzZWxmLm91dFByb3RvY29sID0gb3V0UHJvdG9jb2wKKyAgfQorfQorCisKK29wZW4gY2xhc3MgVEFzeW5jQ2xpZW50PFByb3RvY29sOiBUUHJvdG9jb2wsIEZhY3Rvcnk6IFRBc3luY1RyYW5zcG9ydEZhY3Rvcnk+IHsKKyAgcHVibGljIHZhciBmYWN0b3J5OiBGYWN0b3J5CisgIHB1YmxpYyBpbml0KHdpdGggcHJvdG9jb2w6IFByb3RvY29sLlR5cGUsIGZhY3Rvcnk6IEZhY3RvcnkpIHsKKyAgICBzZWxmLmZhY3RvcnkgPSBmYWN0b3J5CisgIH0KK30KKworCitwdWJsaWMgZW51bSBUQXN5bmNSZXN1bHQ8VD4geworICBjYXNlIHN1Y2Nlc3MoVCkKKyAgY2FzZSBlcnJvcihTd2lmdC5FcnJvcikKKyAgCisgIHB1YmxpYyBmdW5jIHZhbHVlKCkgdGhyb3dzIC0+IFQgeworICAgIHN3aXRjaCBzZWxmIHsKKyAgICBjYXNlIC5zdWNjZXNzKGxldCB0KTogcmV0dXJuIHQKKyAgICBjYXNlIC5lcnJvcihsZXQgZSk6IHRocm93IGUKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RDb21wYWN0UHJvdG9jb2wuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UQ29tcGFjdFByb3RvY29sLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NzczYzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UQ29tcGFjdFByb3RvY29sLnN3aWZ0CkBAIC0wLDAgKzEsNTc1IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyogdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitpbXBvcnQgRm91bmRhdGlvbgoraW1wb3J0IENvcmVGb3VuZGF0aW9uCisKK3B1YmxpYyBlbnVtIFRDVHlwZTogVUludDggeworICBjYXNlIHN0b3AgICAgICAgICAgPSAweDAwCisgIGNhc2UgYm9vbGVhbl9UUlVFICA9IDB4MDEKKyAgY2FzZSBib29sZWFuX0ZBTFNFID0gMHgwMgorICBjYXNlIGk4ICAgICAgICAgICAgPSAweDAzCisgIGNhc2UgaTE2ICAgICAgICAgICA9IDB4MDQKKyAgY2FzZSBpMzIgICAgICAgICAgID0gMHgwNQorICBjYXNlIGk2NCAgICAgICAgICAgPSAweDA2CisgIGNhc2UgZG91YmxlICAgICAgICA9IDB4MDcKKyAgY2FzZSBiaW5hcnkgICAgICAgID0gMHgwOAorICBjYXNlIGxpc3QgICAgICAgICAgPSAweDA5CisgIGNhc2Ugc2V0ICAgICAgICAgICA9IDB4MEEKKyAgY2FzZSBtYXAgICAgICAgICAgID0gMHgwQgorICBjYXNlIGBzdHJ1Y3RgICAgICAgPSAweDBDCisgIAorICBwdWJsaWMgc3RhdGljIGxldCB0eXBlTWFzazogVUludDggPSAweEUwIC8vIDExMTAgMDAwMAorICBwdWJsaWMgc3RhdGljIGxldCB0eXBlQml0czogVUludDggPSAweDA3IC8vIDAwMDAgMDExMQorICBwdWJsaWMgc3RhdGljIGxldCB0eXBlU2hpZnRBbW91bnQgPSA1CisgCit9CisKKworcHVibGljIGNsYXNzIFRDb21wYWN0UHJvdG9jb2w6IFRQcm90b2NvbCB7CisgIHB1YmxpYyBzdGF0aWMgbGV0IHByb3RvY29sSUQ6IFVJbnQ4ICA9IDB4ODIKKyAgcHVibGljIHN0YXRpYyBsZXQgdmVyc2lvbjogVUludDggICAgID0gMQorICBwdWJsaWMgc3RhdGljIGxldCB2ZXJzaW9uTWFzazogVUludDggPSAweDFGIC8vIDAwMDEgMTExMQorICAKKyAgcHVibGljIHZhciB0cmFuc3BvcnQ6IFRUcmFuc3BvcnQKKyAgCisgIHZhciBsYXN0RmllbGQ6IFtVSW50OF0gPSBbXQorICB2YXIgbGFzdEZpZWxkSWQ6IFVJbnQ4ID0gMAorICAKKyAgdmFyIGJvb2xGaWVsZE5hbWU6IFN0cmluZz8KKyAgdmFyIGJvb2xGaWVsZFR5cGU6IFRUeXBlPworICB2YXIgYm9vbEZpZWxkSWQ6IEludDMyPworICB2YXIgYm9vbGVhblZhbHVlOiBCb29sPworICAKKyAgdmFyIGN1cnJlbnRNZXNzYWdlTmFtZTogU3RyaW5nPworCisgIHB1YmxpYyByZXF1aXJlZCBpbml0KG9uIHRyYW5zcG9ydDogVFRyYW5zcG9ydCkgeworICAgIHNlbGYudHJhbnNwb3J0ID0gdHJhbnNwb3J0CisgIH0KKworICAKKyAgLy8vIE1hcms6IC0gVENvbXBhY3RQcm90b2NvbCBoZWxwZXJzCisgIAorICBmdW5jIHdyaXRlYnl0ZURpcmVjdChfIGJ5dGU6IFVJbnQ4KSB0aHJvd3MgeworICAgIGxldCBieXRlID0gRGF0YShieXRlczogW2J5dGVdKQorICAgIHRyeSBQcm90b2NvbFRyYW5zcG9ydFRyeShlcnJvcjogVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlRyYW5zcG9ydCBXcml0ZSBGYWlsZWQiKSkgeworICAgICAgdHJ5IHNlbGYudHJhbnNwb3J0LndyaXRlKGRhdGE6IGJ5dGUpCisgICAgfQorICB9CisgIAorICBmdW5jIHdyaXRlVmFyaW50MzIoXyB2YWw6IFVJbnQzMikgdGhyb3dzIHsKKyAgICB2YXIgdmFsID0gdmFsCisgICAgdmFyIGkzMmJ1ZiA9IFtVSW50OF0ocmVwZWF0aW5nOiAwLCBjb3VudDogNSkKKyAgICB2YXIgaWR4ID0gMAorICAgIHdoaWxlIHRydWUgeworICAgICAgaWYgKHZhbCAmIH4weDdGKSA9PSAwIHsKKyAgICAgICAgaTMyYnVmW2lkeF0gPSBVSW50OCh2YWwpCisgICAgICAgIGlkeCArPSAxCisgICAgICAgIGJyZWFrCisgICAgICB9IGVsc2UgeworICAgICAgICBpMzJidWZbaWR4XSA9IFVJbnQ4KCh2YWwgJiAweDdGKSB8IDB4ODApCisgICAgICAgIGlkeCArPSAxCisgICAgICAgIHZhbCA+Pj0gNworICAgICAgfQorICAgIH0KKyAgICAKKyAgICB0cnkgUHJvdG9jb2xUcmFuc3BvcnRUcnkoZXJyb3I6IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJUcmFuc3BvcnQgV3JpdGUgRmFpbGVkIikpIHsKKyAgICAgIHRyeSBzZWxmLnRyYW5zcG9ydC53cml0ZShkYXRhOiBEYXRhKGJ5dGVzOiBpMzJidWZbMC4uPGlkeF0pKQorICAgIH0KKyAgfQorICAKKyAgZnVuYyB3cml0ZVZhcmludDY0KF8gdmFsOiBVSW50NjQpIHRocm93cyB7CisgICAgdmFyIHZhbCA9IHZhbAorICAgIHZhciB2YXJpbnQ2NG91dCA9IFtVSW50OF0ocmVwZWF0aW5nOiAwLCBjb3VudDogMTApCisgICAgdmFyIGlkeCA9IDAKKyAgICB3aGlsZSB0cnVlIHsKKyAgICAgIGlmICh2YWwgJiB+MHg3RikgPT0gMHsKKyAgICAgICAgdmFyaW50NjRvdXRbaWR4XSA9IFVJbnQ4KHZhbCkKKyAgICAgICAgaWR4ICs9IDEKKyAgICAgICAgYnJlYWsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHZhcmludDY0b3V0W2lkeF0gPSBVSW50OCh2YWwgJiAweDdGKSB8IDB4ODAKKyAgICAgICAgaWR4ICs9IDEKKyAgICAgICAgdmFsID4+PSA3CisgICAgICB9CisgICAgfQorICAgIAorICAgIHRyeSBQcm90b2NvbFRyYW5zcG9ydFRyeShlcnJvcjogVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlRyYW5zcG9ydCBXcml0ZSBGYWlsZWQiKSkgeworICAgICAgdHJ5IHNlbGYudHJhbnNwb3J0LndyaXRlKGRhdGE6IERhdGEoYnl0ZXM6IHZhcmludDY0b3V0WzAuLjxpZHhdKSkKKyAgICB9CisgIAorICB9CisgIAorICBmdW5jIHdyaXRlQ29sbGVjdGlvbkJlZ2luKF8gZWxlbWVudFR5cGU6IFRUeXBlLCBzaXplOiBJbnQzMikgdGhyb3dzIHsKKyAgICBsZXQgY3R5cGUgPSBjb21wYWN0VHlwZShlbGVtZW50VHlwZSkucmF3VmFsdWUKKyAgICBpZiBzaXplIDw9IDE0IHsKKyAgICAgIHRyeSB3cml0ZWJ5dGVEaXJlY3QoVUludDgoc2l6ZSA8PCA0KSB8IGN0eXBlKQorICAgIH0gZWxzZSB7CisgICAgICB0cnkgd3JpdGVieXRlRGlyZWN0KDB4RjAgfCBjdHlwZSkKKyAgICAgIHRyeSB3cml0ZVZhcmludDMyKFVJbnQzMihzaXplKSkKKyAgICB9CisgIH0KKyAgCisgIGZ1bmMgcmVhZEJpbmFyeShfIHNpemU6IEludCkgdGhyb3dzIC0+IERhdGEgeworICAgIHZhciByZXN1bHQgPSBEYXRhKCkKKyAgICBpZiBzaXplICE9IDAgeworICAgICAgdHJ5IFByb3RvY29sVHJhbnNwb3J0VHJ5KGVycm9yOiBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVHJhbnNwb3J0IFJlYWQgRmFpbGVkIikpIHsKKyAgICAgICAgcmVzdWx0ID0gdHJ5IHNlbGYudHJhbnNwb3J0LnJlYWRBbGwoc2l6ZTogc2l6ZSkKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdAorICB9CisgIAorICBmdW5jIHJlYWRWYXJpbnQzMigpIHRocm93cyAtPiBVSW50MzIgeworICAgIHZhciByZXN1bHQ6IFVJbnQzMiA9IDAKKyAgICB2YXIgc2hpZnQ6IFVJbnQzMiA9IDAKKyAgICB3aGlsZSB0cnVlIHsKKyAgICAgIGxldCBieXRlOiBVSW50OCA9IHRyeSByZWFkKCkKKyAgICAgIAorICAgICAgcmVzdWx0IHw9IFVJbnQzMihieXRlICYgMHg3RikgPDwgc2hpZnQKKyAgICAgIGlmIChieXRlICYgMHg4MCkgPT0gMCB7CisgICAgICAgIGJyZWFrCisgICAgICB9CisgICAgICAKKyAgICAgIHNoaWZ0ICs9IDcKKyAgICB9CisgICAgCisgICAgcmV0dXJuIHJlc3VsdAorICB9CisgIAorICBmdW5jIHJlYWRWYXJpbnQ2NCgpIHRocm93cyAtPiBVSW50NjQgeworICAgIHZhciByZXN1bHQ6IFVJbnQ2NCA9IDAKKyAgICB2YXIgc2hpZnQ6IFVJbnQ2NCA9IDAKKyAgICAKKyAgICB3aGlsZSB0cnVlIHsKKyAgICAgIGxldCBieXRlOiBVSW50OCA9IHRyeSByZWFkKCkKKyAgICAgIAorICAgICAgcmVzdWx0IHw9IFVJbnQ2NChieXRlICYgMHg3RikgPDwgc2hpZnQKKyAgICAgIGlmIChieXRlICYgMHg4MCkgPT0gMCB7CisgICAgICAgIGJyZWFrCisgICAgICB9CisgICAgICAKKyAgICAgIHNoaWZ0ICs9IDcKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdAorICB9CisgIAorCisgIGZ1bmMgdHR5cGUoXyBjb21wYWN0VHlwZVZhbDogVUludDgpIHRocm93cyAtPiBUVHlwZSB7CisgICAgZ3VhcmQgbGV0IGNvbXBhY3RUeXBlID0gVENUeXBlKHJhd1ZhbHVlOiBjb21wYWN0VHlwZVZhbCkgZWxzZSB7CisgICAgICB0aHJvdyBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVW5rbm93biBUQ1R5cGUgdmFsdWU6IFwoY29tcGFjdFR5cGVWYWwpIikKKyAgICB9CisgICAgCisgICAgc3dpdGNoIGNvbXBhY3RUeXBlIHsKKyAgICBjYXNlIC5zdG9wOiByZXR1cm4gLnN0b3A7CisgICAgY2FzZSAuYm9vbGVhbl9GQUxTRSwgLmJvb2xlYW5fVFJVRTogcmV0dXJuIC5ib29sOworICAgIGNhc2UgLmk4OiByZXR1cm4gLmk4OworICAgIGNhc2UgLmkxNjogcmV0dXJuIC5pMTY7CisgICAgY2FzZSAuaTMyOiByZXR1cm4gLmkzMjsKKyAgICBjYXNlIC5pNjQ6IHJldHVybiAuaTY0OworICAgIGNhc2UgLmRvdWJsZTogcmV0dXJuIC5kb3VibGU7CisgICAgY2FzZSAuYmluYXJ5OiByZXR1cm4gLnN0cmluZzsKKyAgICBjYXNlIC5saXN0OiByZXR1cm4gLmxpc3Q7CisgICAgY2FzZSAuc2V0OiByZXR1cm4gLnNldDsKKyAgICBjYXNlIC5tYXA6IHJldHVybiAubWFwOworICAgIGNhc2UgLnN0cnVjdDogcmV0dXJuIC5zdHJ1Y3Q7CisgICAgfQorICB9CisgIAorICBmdW5jIGNvbXBhY3RUeXBlKF8gdHR5cGU6IFRUeXBlKSAtPiBUQ1R5cGUgeworICAgIHN3aXRjaCB0dHlwZSB7CisgICAgY2FzZSAuc3RvcDogICByZXR1cm4gLnN0b3AKKyAgICBjYXNlIC52b2lkOiAgIHJldHVybiAuaTgKKyAgICBjYXNlIC5ib29sOiAgIHJldHVybiAuYm9vbGVhbl9GQUxTRQorICAgIGNhc2UgLmk4OiAgIHJldHVybiAuaTgKKyAgICBjYXNlIC5kb3VibGU6IHJldHVybiAuZG91YmxlCisgICAgY2FzZSAuaTE2OiAgICByZXR1cm4gLmkxNgorICAgIGNhc2UgLmkzMjogICAgcmV0dXJuIC5pMzIKKyAgICBjYXNlIC5pNjQ6ICAgIHJldHVybiAuaTY0CisgICAgY2FzZSAuc3RyaW5nOiByZXR1cm4gLmJpbmFyeQorICAgIGNhc2UgLnN0cnVjdDogcmV0dXJuIC5zdHJ1Y3QKKyAgICBjYXNlIC5tYXA6ICAgIHJldHVybiAubWFwCisgICAgY2FzZSAuc2V0OiAgICByZXR1cm4gLnNldAorICAgIGNhc2UgLmxpc3Q6ICAgcmV0dXJuIC5saXN0CisgICAgY2FzZSAudXRmODogICByZXR1cm4gLmJpbmFyeQorICAgIGNhc2UgLnV0ZjE2OiAgcmV0dXJuIC5iaW5hcnkKKyAgICB9CisgIH0KKyAgCisgIC8vLyBaaWdaYWcgZW5jb2RpbmcgbWFwcyBzaWduZWQgaW50ZWdlcnMgdG8gdW5zaWduZWQgaW50ZWdlcnMgc28gdGhhdAorICAvLy8gbnVtYmVycyB3aXRoIGEgc21hbGwgYWJzb2x1dGUgdmFsdWUgKGZvciBpbnN0YW5jZSwgLTEpIGhhdmUKKyAgLy8vIGEgc21hbGwgdmFyaW50IGVuY29kZWQgdmFsdWUgdG9vLiBJdCBkb2VzIHRoaXMgaW4gYSB3YXkgdGhhdAorICAvLy8gInppZy16YWdzIiBiYWNrIGFuZCBmb3J0aCB0aHJvdWdoIHRoZSBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgaW50ZWdlcnMsCisgIC8vLyBzbyB0aGF0IC0xIGlzIGVuY29kZWQgYXMgMSwgMSBpcyBlbmNvZGVkIGFzIDIsIC0yIGlzIGVuY29kZWQgYXMgMywgYW5kIHNvCisgIC8vLworICAvLy8gLSBwYXJhbWV0ZXIgbjogbnVtYmVyIHRvIHppZ3phZworICAvLy8KKyAgLy8vIC0gcmV0dXJuczogemlnemFnZWQgVUludDMyCisgIGZ1bmMgaTMyVG9aaWdaYWcoXyBuIDogSW50MzIpIC0+IFVJbnQzMiB7CisgICAgcmV0dXJuIFVJbnQzMihiaXRQYXR0ZXJuOiBJbnQzMihuIDw8IDEpIF4gSW50MzIobiA+PiAzMSkpCisgIH0KKworICBmdW5jIGk2NFRvWmlnWmFnKF8gbiA6IEludDY0KSAtPiBVSW50NjQgeworICAgIHJldHVybiBVSW50NjQoYml0UGF0dGVybjogSW50NjQobiA8PCAxKSBeIEludDY0KG4gPj4gNjMpKQorICB9CisKKyAgZnVuYyB6aWdaYWdUb2kzMihfIG46IFVJbnQzMikgLT4gSW50MzIgeworICAgIHJldHVybiBJbnQzMihuID4+IDEpIF4gKC1JbnQzMihuICYgMSkpCisgIH0KKyAgCisgIGZ1bmMgemlnWmFnVG9pNjQoXyBuOiBVSW50NjQpIC0+IEludDY0IHsKKyAgICByZXR1cm4gSW50NjQobiA+PiAxKSBeICgtSW50NjQobiAmIDEpKQorICB9CisgIAorICAKKyAgCisgIC8vLyBNYXJrOiAtIFRQcm90b2NvbCAgCisgIAorICBwdWJsaWMgZnVuYyByZWFkTWVzc2FnZUJlZ2luKCkgdGhyb3dzIC0+IChTdHJpbmcsIFRNZXNzYWdlVHlwZSwgSW50MzIpIHsKKyAgICBsZXQgcHJvdG9jb2xJZDogVUludDggPSB0cnkgcmVhZCgpCisgICAgCisgICAgaWYgcHJvdG9jb2xJZCAhPSBUQ29tcGFjdFByb3RvY29sLnByb3RvY29sSUQgeworICAgICAgbGV0IGV4cGVjdGVkID0gU3RyaW5nKGZvcm1hdDoiJTJYIiwgVENvbXBhY3RQcm90b2NvbC5wcm90b2NvbElEKQorICAgICAgbGV0IGdvdCAgICAgID0gU3RyaW5nKGZvcm1hdDoiJTJYIiwgcHJvdG9jb2xJZCkKKyAgICAgIHRocm93IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJXcm9uZyBQcm90b2NvbCBJRCBcKGdvdCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWRFcnJvcjogLm1pc21hdGNoZWRQcm90b2NvbChleHBlY3RlZDogZXhwZWN0ZWQsIGdvdDogZ290KSkKKworICAgIH0KKworICAgIGxldCB2ZXJzaW9uQW5kVHlwZTogVUludDggPSB0cnkgcmVhZCgpCisgICAgbGV0IHZlcnNpb246IFVJbnQ4ID0gdmVyc2lvbkFuZFR5cGUgJiBUQ29tcGFjdFByb3RvY29sLnZlcnNpb25NYXNrCisgICAgaWYgdmVyc2lvbiAhPSBUQ29tcGFjdFByb3RvY29sLnZlcnNpb24geworICAgICAgdGhyb3cgVFByb3RvY29sRXJyb3IoZXJyb3I6IC5iYWRWZXJzaW9uKGV4cGVjdGVkOiAiXChUQ29tcGFjdFByb3RvY29sLnZlcnNpb24pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3Q6IlwodmVyc2lvbikiKSkKKworICAgIH0KKyAgICAKKyAgICBsZXQgdHlwZSA9ICh2ZXJzaW9uQW5kVHlwZSA+PiBVSW50OChUQ1R5cGUudHlwZVNoaWZ0QW1vdW50KSkgJiBUQ1R5cGUudHlwZUJpdHMKKyAgICBndWFyZCBsZXQgbXR5cGUgPSBUTWVzc2FnZVR5cGUocmF3VmFsdWU6IEludDMyKHR5cGUpKSBlbHNlIHsKKyAgICAgIHRocm93IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJVbmtub3duIFRNZXNzYWdlVHlwZSB2YWx1ZTogXCh0eXBlKSIpCisgICAgfQorICAgIGxldCBzZXF1ZW5jZUlkID0gdHJ5IHJlYWRWYXJpbnQzMigpCisgICAgbGV0IG5hbWU6IFN0cmluZyA9IHRyeSByZWFkKCkKKyAgICAKKyAgICByZXR1cm4gKG5hbWUsIG10eXBlLCBJbnQzMihzZXF1ZW5jZUlkKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZE1lc3NhZ2VFbmQoKSB0aHJvd3MgeyB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkU3RydWN0QmVnaW4oKSB0aHJvd3MgLT4gU3RyaW5nIHsKKyAgICBsYXN0RmllbGQuYXBwZW5kKGxhc3RGaWVsZElkKQorICAgIGxhc3RGaWVsZElkID0gMAorICAgIHJldHVybiAiIgorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkU3RydWN0RW5kKCkgdGhyb3dzIHsKKyAgICBsYXN0RmllbGRJZCA9IGxhc3RGaWVsZC5sYXN0ID8/IDAKKyAgICBsYXN0RmllbGQucmVtb3ZlTGFzdCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRGaWVsZEJlZ2luKCkgdGhyb3dzIC0+IChTdHJpbmcsIFRUeXBlLCBJbnQzMikgeworICAgIGxldCBieXRlOiBVSW50OCA9IHRyeSByZWFkKCkKKyAgICBndWFyZCBsZXQgdHlwZSA9IFRDVHlwZShyYXdWYWx1ZTogYnl0ZSAmIDB4MEYpIGVsc2UgeworICAgICAgdGhyb3cgVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlVua25vd24gVENUeXBlIFwoYnl0ZSAmIDB4MEYpIikKKyAgICB9CisgICAgCisgICAgLy8gaWYgaXQncyBhIHN0b3AsIHRoZW4gd2UgY2FuIHJldHVybiBpbW1lZGlhdGVseSwgYXMgdGhlIHN0cnVjdCBpcyBvdmVyCisgICAgaWYgdHlwZSA9PSAuc3RvcCB7CisgICAgICByZXR1cm4gKCIiLCAuc3RvcCwgMCkKKyAgICB9CisgICAgCisgICAgdmFyIGZpZWxkSWQ6IEludDE2ID0gMAorICAgIAorICAgIC8vIG1hc2sgb2ZmIHRoZSA0TVNCIG9mIHRoZSB0eXBlIGhlYWRlci4gIGl0IGNvdWxkIGNvbnRhaW4gYSBmaWVsZCBpZCBkZWx0YQorICAgIGxldCBtb2RpZmllciA9IChieXRlICYgMHhGMCkgPj4gNAorICAgIGlmIG1vZGlmaWVyID09IDAgeworICAgICAgLy8gbm90IGEgZGVsdGEuICBsb29rIGFoZWFkIGZvciB0aGUgemlnemFnIHZhcmludCBmaWVsZCBpZAorICAgICAgZmllbGRJZCA9IHRyeSByZWFkKCkKKyAgICB9IGVsc2UgeworICAgICAgLy8gaGFzIGEgZGVsdGEuICBhZGQgdGhlIGRlbHRhIHRvIHRoZSBsYXN0IFJlYWQgZmllbGQgaWQuCisgICAgICBmaWVsZElkID0gSW50MTYobGFzdEZpZWxkSWQgKyBtb2RpZmllcikKKyAgICB9CisgICAgCisgICAgbGV0IGZpZWxkVHlwZSA9IHRyeSB0dHlwZSh0eXBlLnJhd1ZhbHVlKQorICAgIAorICAgIC8vIGlmIHRoaXMgaGFwcGVucyB0byBiZSBhIGJvb2xlYW4gZmllbGQsIHRoZSB2YWx1ZSBpcyBlbmNvZGVkIGluIHRoZSB0eXBlCisgICAgaWYgdHlwZSA9PSAuYm9vbGVhbl9UUlVFIHx8IHR5cGUgPT0gLmJvb2xlYW5fRkFMU0UgeworICAgICAgLy8gc2F2ZSB0aGUgYm9vbGVhbiB2YWx1ZSBpbiBhIHNwZWNpYWwgaW5zdGFuY2UgdmFyaWFibGUKKyAgICAgIGJvb2xlYW5WYWx1ZSA9IHR5cGUgPT0gLmJvb2xlYW5fVFJVRQorICAgIH0KKyAgICAKKyAgICAvLyBwdXNoIHRoZSBuZXcgZmllbGQgb250byB0aGUgZmllbGQgc3RhY2sgc28gd2UgY2FuIGtlZXAgdGhlIGRlbHRhcyBnb2luZworICAgIGxhc3RGaWVsZElkID0gVUludDgoZmllbGRJZCkKKyAgICByZXR1cm4gKCIiLCBmaWVsZFR5cGUsIEludDMyKGZpZWxkSWQpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkRmllbGRFbmQoKSB0aHJvd3MgeyB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IFN0cmluZyB7CisgICAgbGV0IGxlbmd0aCA9IHRyeSByZWFkVmFyaW50MzIoKQorICAgIAorICAgIHZhciByZXN1bHQ6IFN0cmluZworICAgIAorICAgIGlmIGxlbmd0aCAhPSAwIHsKKyAgICAgIGxldCBkYXRhID0gdHJ5IHJlYWRCaW5hcnkoSW50KGxlbmd0aCkpCisgICAgICByZXN1bHQgPSBTdHJpbmcoZGF0YTogZGF0YSwgZW5jb2Rpbmc6IFN0cmluZy5FbmNvZGluZy51dGY4KSA/PyAiIgorICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgPSAiIgorICAgIH0KKyAgICAKKyAgICByZXR1cm4gcmVzdWx0CisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gQm9vbCB7CisgICAgaWYgbGV0IHZhbCA9IGJvb2xlYW5WYWx1ZSB7CisgICAgICBzZWxmLmJvb2xlYW5WYWx1ZSA9IG5pbAorICAgICAgcmV0dXJuIHZhbAorICAgIH0gZWxzZSB7CisgICAgICBsZXQgcmVzdWx0ID0gdHJ5IHJlYWQoKSBhcyBVSW50OAorICAgICAgcmV0dXJuIFRDVHlwZShyYXdWYWx1ZTogcmVzdWx0KSA9PSAuYm9vbGVhbl9UUlVFCisgICAgfQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IFVJbnQ4IHsKKyAgICB2YXIgYnVmZjogVUludDggPSAwCisgICAgdHJ5IFByb3RvY29sVHJhbnNwb3J0VHJ5KGVycm9yOiBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVHJhbnNwb3J0IFJlYWQgRmFpbGVkIikpIHsKKyAgICAgIGJ1ZmYgPSB0cnkgc2VsZi50cmFuc3BvcnQucmVhZEFsbChzaXplOiAxKVswXQorICAgIH0KKyAgICByZXR1cm4gYnVmZgorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IEludDE2IHsKKyAgICBsZXQgdiA9IHRyeSByZWFkVmFyaW50MzIoKQorICAgIHJldHVybiBJbnQxNih6aWdaYWdUb2kzMih2KSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBJbnQzMiB7CisgICAgbGV0IHYgPSB0cnkgcmVhZFZhcmludDMyKCkKKyAgICByZXR1cm4gemlnWmFnVG9pMzIodikKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBJbnQ2NCB7CisgICAgbGV0IHYgPSB0cnkgcmVhZFZhcmludDY0KCkKKyAgICByZXR1cm4gemlnWmFnVG9pNjQodikKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBEb3VibGUgeworICAgIHZhciBidWZmID0gRGF0YSgpCisgICAgdHJ5IFByb3RvY29sVHJhbnNwb3J0VHJ5KGVycm9yOiBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVHJhbnNwb3J0IFJlYWQgRmFpbGVkIikpIHsKKyAgICAgIGJ1ZmYgPSB0cnkgc2VsZi50cmFuc3BvcnQucmVhZEFsbChzaXplOiA4KQorICAgIH0KKyAgICAKKyAgICBsZXQgaTY0OiBVSW50NjQgPSBidWZmLndpdGhVbnNhZmVCeXRlcyB7IChwdHI6IFVuc2FmZVBvaW50ZXI8VUludDg+KSAtPiBVSW50NjQgaW4KKyAgICAgIHJldHVybiBVbnNhZmVQb2ludGVyPFVJbnQ2ND4oT3BhcXVlUG9pbnRlcihwdHIpKS5wb2ludGVlCisgICAgfQorICAgIGxldCBiaXRzID0gQ0ZTd2FwSW50NjRMaXR0bGVUb0hvc3QoaTY0KQorICAgIHJldHVybiBEb3VibGUoYml0UGF0dGVybjogYml0cykKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBEYXRhIHsKKyAgICBsZXQgbGVuZ3RoID0gdHJ5IHJlYWRWYXJpbnQzMigpCisgICAgcmV0dXJuIHRyeSByZWFkQmluYXJ5KEludChsZW5ndGgpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkTWFwQmVnaW4oKSB0aHJvd3MgLT4gKFRUeXBlLCBUVHlwZSwgSW50MzIpIHsKKyAgICB2YXIga2V5QW5kVmFsdWVUeXBlOiBVSW50OCA9IDgKKyAgICBsZXQgc2l6ZSA9IHRyeSByZWFkVmFyaW50MzIoKQorICAgIGlmIHNpemUgIT0gMCB7CisgICAgICBrZXlBbmRWYWx1ZVR5cGUgPSB0cnkgcmVhZCgpCisgICAgfQorICAgIAorICAgIGxldCBrZXlUeXBlID0gdHJ5IHR0eXBlKGtleUFuZFZhbHVlVHlwZSA+PiA0KQorICAgIGxldCB2YWx1ZVR5cGUgPSB0cnkgdHR5cGUoa2V5QW5kVmFsdWVUeXBlICYgMHhGKQorICAgIAorICAgIHJldHVybiAoa2V5VHlwZSwgdmFsdWVUeXBlLCBJbnQzMihzaXplKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZE1hcEVuZCgpIHRocm93cyB7IH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRTZXRCZWdpbigpIHRocm93cyAtPiAoVFR5cGUsIEludDMyKSB7CisgICAgcmV0dXJuIHRyeSByZWFkTGlzdEJlZ2luKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZFNldEVuZCgpIHRocm93cyB7IH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRMaXN0QmVnaW4oKSB0aHJvd3MgLT4gKFRUeXBlLCBJbnQzMikgeworICAgIGxldCBzaXplQW5kVHlwZTogVUludDggPSB0cnkgcmVhZCgpCisgICAgdmFyIHNpemU6IFVJbnQzMiA9IFVJbnQzMihzaXplQW5kVHlwZSA+PiA0KSAmIDB4MGYKKyAgICBpZiBzaXplID09IDE1IHsKKyAgICAgIHNpemUgPSB0cnkgcmVhZFZhcmludDMyKCkKKyAgICB9CisgICAgbGV0IGVsZW1lbnRUeXBlID0gdHJ5IHR0eXBlKHNpemVBbmRUeXBlICYgMHgwRikKKyAgICAKKyAgICByZXR1cm4gKGVsZW1lbnRUeXBlLCBJbnQzMihzaXplKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZExpc3RFbmQoKSB0aHJvd3MgeyB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZU1lc3NhZ2VCZWdpbihuYW1lOiBTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgbWVzc2FnZVR5cGU6IFRNZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDogSW50MzIpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlYnl0ZURpcmVjdChUQ29tcGFjdFByb3RvY29sLnByb3RvY29sSUQpCisgICAgbGV0IG5leHRCeXRlOiBVSW50OCA9IChUQ29tcGFjdFByb3RvY29sLnZlcnNpb24gJiBUQ29tcGFjdFByb3RvY29sLnZlcnNpb25NYXNrKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgIChVSW50OCgoVUludDMyKG1lc3NhZ2VUeXBlLnJhd1ZhbHVlKSA8PCBVSW50MzIoVENUeXBlLnR5cGVTaGlmdEFtb3VudCkpKSAmCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRDVHlwZS50eXBlTWFzaykKKyAgICB0cnkgd3JpdGVieXRlRGlyZWN0KG5leHRCeXRlKQorICAgIHRyeSB3cml0ZVZhcmludDMyKFVJbnQzMihzZXF1ZW5jZUlEKSkKKyAgICB0cnkgd3JpdGUobmFtZSkKKyAgICAKKyAgICBjdXJyZW50TWVzc2FnZU5hbWUgPSBuYW1lCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlTWVzc2FnZUVuZCgpIHRocm93cyB7CisgICAgY3VycmVudE1lc3NhZ2VOYW1lID0gbmlsCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlU3RydWN0QmVnaW4obmFtZTogU3RyaW5nKSB0aHJvd3MgeworICAgIGxhc3RGaWVsZC5hcHBlbmQobGFzdEZpZWxkSWQpCisgICAgbGFzdEZpZWxkSWQgPSAwCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlU3RydWN0RW5kKCkgdGhyb3dzIHsKKyAgICBsYXN0RmllbGRJZCA9IGxhc3RGaWVsZC5sYXN0ID8/IDAKKyAgICBsYXN0RmllbGQucmVtb3ZlTGFzdCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlRmllbGRCZWdpbihuYW1lOiBTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlIGZpZWxkVHlwZTogVFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOiBJbnQzMikgdGhyb3dzIHsKKyAgICBpZiBmaWVsZFR5cGUgPT0gLmJvb2wgeworICAgICAgYm9vbEZpZWxkTmFtZSA9IG5hbWUKKyAgICAgIGJvb2xGaWVsZFR5cGUgPSBmaWVsZFR5cGUKKyAgICAgIGJvb2xGaWVsZElkID0gZmllbGRJRAorICAgICAgcmV0dXJuCisgICAgfSBlbHNlIHsKKyAgICAgIHRyeSB3cml0ZUZpZWxkQmVnaW5JbnRlcm5hbChuYW1lOiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGZpZWxkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOiBmaWVsZElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVPdmVycmlkZTogMHhGRikKKyAgICB9CisgIH0KKyAgCisgIGZ1bmMgd3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwobmFtZTogU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgZmllbGRUeXBlOiBUVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOiBJbnQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlT3ZlcnJpZGU6IFVJbnQ4KSB0aHJvd3MgeworICAgIAorICAgIGxldCB0eXBlVG9Xcml0ZSA9IHR5cGVPdmVycmlkZSA9PSAweEZGID8gY29tcGFjdFR5cGUoZmllbGRUeXBlKS5yYXdWYWx1ZSA6IHR5cGVPdmVycmlkZQorICAgIAorICAgIC8vIGNoZWNrIGlmIHdlIGNhbiB1c2UgZGVsdGEgZW5jb2RpbmcgZm9yIHRoZSBmaWVsZCBpZAorICAgIGxldCBkaWZmID0gVUludDgoZmllbGRJRCkgLSBsYXN0RmllbGRJZAorICAgIGlmIChVSW50OChmaWVsZElEKSA+IGxhc3RGaWVsZElkKSAmJiAoZGlmZiA8PSAxNSkgeworICAgICAgLy8gV3JpdGUgdGhlbSB0b2dldGhlcgorICAgICAgdHJ5IHdyaXRlYnl0ZURpcmVjdCgoVUludDgoZmllbGRJRCkgLSBsYXN0RmllbGRJZCkgPDwgNCB8IHR5cGVUb1dyaXRlKQorICAgICAgCisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFdyaXRlIHRoZW0gc2VwYXJhdGUKKyAgICAgIHRyeSB3cml0ZWJ5dGVEaXJlY3QodHlwZVRvV3JpdGUpCisgICAgICB0cnkgd3JpdGUoSW50MTYoZmllbGRJRCkpCisgICAgfQorICAgIAorICAgIGxhc3RGaWVsZElkID0gVUludDgoZmllbGRJRCkKKyAgICAgIAorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZUZpZWxkU3RvcCgpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlYnl0ZURpcmVjdChUQ1R5cGUuc3RvcC5yYXdWYWx1ZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVGaWVsZEVuZCgpIHRocm93cyB7IH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlTWFwQmVnaW4oa2V5VHlwZTogVFR5cGUsIHZhbHVlVHlwZTogVFR5cGUsIHNpemU6IEludDMyKSB0aHJvd3MgeworICAgIGlmIHNpemUgPT0gMCB7CisgICAgICB0cnkgd3JpdGVieXRlRGlyZWN0KDApCisgICAgfSBlbHNlIHsKKyAgICAgIHRyeSB3cml0ZVZhcmludDMyKFVJbnQzMihzaXplKSkKKyAgICAgIAorICAgICAgbGV0IGNvbXBhY3RlZFR5cGVzID0gY29tcGFjdFR5cGUoa2V5VHlwZSkucmF3VmFsdWUgPDwgNCB8IGNvbXBhY3RUeXBlKHZhbHVlVHlwZSkucmF3VmFsdWUKKyAgICAgIHRyeSB3cml0ZWJ5dGVEaXJlY3QoY29tcGFjdGVkVHlwZXMpCisgICAgfQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZU1hcEVuZCgpIHRocm93cyB7IH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlU2V0QmVnaW4oZWxlbWVudFR5cGU6IFRUeXBlLCBzaXplOiBJbnQzMikgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGVDb2xsZWN0aW9uQmVnaW4oZWxlbWVudFR5cGUsIHNpemU6IHNpemUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlU2V0RW5kKCkgdGhyb3dzIHsgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVMaXN0QmVnaW4oZWxlbWVudFR5cGU6IFRUeXBlLCBzaXplOiBJbnQzMikgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGVDb2xsZWN0aW9uQmVnaW4oZWxlbWVudFR5cGUsIHNpemU6IHNpemUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlTGlzdEVuZCgpIHRocm93cyB7IH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IFN0cmluZykgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGUodmFsdWUuZGF0YSh1c2luZzogU3RyaW5nLkVuY29kaW5nLnV0ZjgpISkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogQm9vbCkgdGhyb3dzIHsKKyAgICBpZiBsZXQgYm9vbEZpZWxkSWQgPSBib29sRmllbGRJZCwgbGV0IGJvb2xGaWVsZFR5cGUgPSBib29sRmllbGRUeXBlLAorICAgICAgIGxldCBib29sRmllbGROYW1lID0gYm9vbEZpZWxkTmFtZSB7CisgICAgICAKKyAgICAgIC8vIHdlIGhhdmVuJ3Qgd3JpdHRlbiB0aGUgZmllbGQgaGVhZGVyIHlldAorICAgICAgbGV0IGNvbXBhY3RUeXBlOiBUQ1R5cGUgPSB2YWx1ZSA/IC5ib29sZWFuX1RSVUUgOiAuYm9vbGVhbl9GQUxTRQorICAgICAgdHJ5IHdyaXRlRmllbGRCZWdpbkludGVybmFsKG5hbWU6IGJvb2xGaWVsZE5hbWUsIHR5cGU6IGJvb2xGaWVsZFR5cGUsIGZpZWxkSUQ6IGJvb2xGaWVsZElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVPdmVycmlkZTogY29tcGFjdFR5cGUucmF3VmFsdWUpCisgICAgICBzZWxmLmJvb2xGaWVsZElkID0gbmlsCisgICAgICBzZWxmLmJvb2xGaWVsZFR5cGUgPSBuaWwKKyAgICAgIHNlbGYuYm9vbEZpZWxkTmFtZSA9IG5pbAorICAgIH0gZWxzZSB7CisgICAgICAvLyB3ZSdyZSBub3QgcGFydCBvZiBhIGZpZWxkLCBzbyBqdXN0IHdyaXRlIHRoZSB2YWx1ZS4KKyAgICAgIHRyeSB3cml0ZWJ5dGVEaXJlY3QodmFsdWUgPyBUQ1R5cGUuYm9vbGVhbl9UUlVFLnJhd1ZhbHVlIDogVENUeXBlLmJvb2xlYW5fRkFMU0UucmF3VmFsdWUpCisgICAgfQorICB9CisKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogVUludDgpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlYnl0ZURpcmVjdCh2YWx1ZSkKKyAgfQorCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IEludDE2KSB0aHJvd3MgeworICAgIHRyeSB3cml0ZVZhcmludDMyKGkzMlRvWmlnWmFnKEludDMyKHZhbHVlKSkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IEludDMyKSB0aHJvd3MgeworICAgIHRyeSB3cml0ZVZhcmludDMyKGkzMlRvWmlnWmFnKHZhbHVlKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogSW50NjQpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlVmFyaW50NjQoaTY0VG9aaWdaYWcodmFsdWUpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZShfIHZhbHVlOiBEb3VibGUpIHRocm93cyB7CisgICAgdmFyIGJpdHMgPSBDRlN3YXBJbnQ2NEhvc3RUb0xpdHRsZSh2YWx1ZS5iaXRQYXR0ZXJuKQorICAgIGxldCBkYXRhID0gd2l0aFVuc2FmZVBvaW50ZXIodG86ICZiaXRzKSB7CisgICAgICByZXR1cm4gRGF0YShieXRlczogVW5zYWZlUG9pbnRlcjxVSW50OD4oT3BhcXVlUG9pbnRlcigkMCkpLCBjb3VudDogTWVtb3J5TGF5b3V0PFVJbnQ2ND4uc2l6ZSkKKyAgICB9CisgICAgdHJ5IFByb3RvY29sVHJhbnNwb3J0VHJ5KGVycm9yOiBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVHJhbnNwb3J0IFdyaXRlIEZhaWxlZCIpKSB7CisgICAgICB0cnkgc2VsZi50cmFuc3BvcnQud3JpdGUoZGF0YTogZGF0YSkKKyAgICB9CisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gZGF0YTogRGF0YSkgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGVWYXJpbnQzMihVSW50MzIoZGF0YS5jb3VudCkpCisgICAgdHJ5IFByb3RvY29sVHJhbnNwb3J0VHJ5KGVycm9yOiBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVHJhbnNwb3J0IFdyaXRlIEZhaWxlZCIpKSB7CisgICAgICB0cnkgc2VsZi50cmFuc3BvcnQud3JpdGUoZGF0YTogZGF0YSkKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RFbnVtLnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVEVudW0uc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVkZmRiMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RFbnVtLnN3aWZ0CkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCitwdWJsaWMgcHJvdG9jb2wgVEVudW0gOiBUU2VyaWFsaXphYmxlLCBIYXNoYWJsZSB7CisgIHZhciByYXdWYWx1ZTogSW50MzIgeyBnZXQgfQorfQorCitleHRlbnNpb24gVEVudW0geworICBwdWJsaWMgc3RhdGljIHZhciB0aHJpZnRUeXBlOiBUVHlwZSB7IHJldHVybiAuaTMyIH0KKyAgcHVibGljIHZhciBoYXNoVmFsdWU6IEludCB7IHJldHVybiByYXdWYWx1ZS5oYXNoVmFsdWUgfQorCisgIHB1YmxpYyBmdW5jIHdyaXRlKHRvIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHByb3RvLndyaXRlKHJhd1ZhbHVlKQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9URXJyb3Iuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9URXJyb3Iuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzllZGJhNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RFcnJvci5zd2lmdApAQCAtMCwwICsxLDc3IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyogdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisKKy8vLyBURXJyb3JDb2RlCisvLy8KKy8vLyBQcm90b2NvbCBmb3IgVEVycm9yIGNvbmZvcm1lcnMnIGVudW0ncyB0byBjb25mb3JtIHRvLgorLy8vIEdlbmVyaWMgSW50IFRocmlmdCBlcnJvciBjb2RlIHRvIGFsbG93IGVycm9yIGNhc2VzIHRvIGhhdmUKKy8vLyBhc3NvY2lhdGVkIHZhbHVlcy4KK3B1YmxpYyBwcm90b2NvbCBURXJyb3JDb2RlIDogQ3VzdG9tU3RyaW5nQ29udmVydGlibGUgeworICB2YXIgdGhyaWZ0RXJyb3JDb2RlOiBJbnQgeyBnZXQgfQorfQorCisvLy8gVEVycm9yCisvLy8KKy8vLyBCYXNlIHByb3RvY29sIGZvciBhbGwgVGhyaWZ0IEVycm9yKEV4Y2VwdGlvbikgdHlwZXMgdG8gY29uZm9ybSB0bworcHVibGljIHByb3RvY29sIFRFcnJvciA6IEVycm9yLCBDdXN0b21TdHJpbmdDb252ZXJ0aWJsZSB7CisKKyAgLy8vIEVudW0gZm9yIGVycm9yIGNhc2VzLiAgQ2FuIGJlIHR5cGVhbGlhc2VkIHRvIGFueSBjb25mb3JtaW5nIGVudW0KKyAgLy8vIG9yIGRlZmluZWQgbmVzdGVkLgorICBhc3NvY2lhdGVkdHlwZSBDb2RlOiBURXJyb3JDb2RlCisgIAorICAvLy8gRXJyb3IgQ2FzZSwgdmFsdWUgZnJvbSBpbnRlcm5hbCBlbnVtCisgIHZhciBlcnJvcjogQ29kZSB7IGdldCBzZXQgfQorICAKKyAgLy8vIE9wdGlvbmFsIGFkZGl0aW9uYWwgbWVzc2FnZQorICB2YXIgbWVzc2FnZTogU3RyaW5nPyB7IGdldCBzZXQgfQorICAKKyAgLy8vIERlZmF1bHQgZXJyb3IgY2FzZSBmb3IgdGhlIGVycm9yIHR5cGUsIHVzZWQgZm9yIGdlbmVyaWMgaW5pdCgpCisgIHN0YXRpYyB2YXIgZGVmYXVsdENhc2U6IENvZGUgeyBnZXQgfQorICAKKyAgaW5pdCgpCit9CisKK2V4dGVuc2lvbiBURXJyb3IgeworICAvLy8gSHVtYW4gcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgZXJyb3IuIERlZmF1bHQgcHJvdmlkZWQgZm9yIHlvdSBpbiB0aGUKKyAgLy8vIGZvcm1hdCBcKFNlbGYuc2VsZik6IFwoZXJyb3IuZXJyb3JEZXNjcmlwdGlvbikgXG4gbWVzc2FnZQorICAvLy8gZWc6CisgIC8vLworICAvLy8gICAgIFRBcHBsaWNhdGlvbkVycm9yICgxKTogSW52YWxpZCBNZXNzYWdlIFR5cGUKKyAgLy8vICAgICBBbiB1bmtub3duIEVycm9yIGhhcyBvY2N1cmVkLgorICBwdWJsaWMgdmFyIGRlc2NyaXB0aW9uOiBTdHJpbmcgeworICAgIHZhciBvdXQgPSAiXChTZWxmLnNlbGYpIChcKGVycm9yLnRocmlmdEVycm9yQ29kZSkpOiAiICsgZXJyb3IuZGVzY3JpcHRpb24gKyAiXG4iCisgICAgaWYgbGV0IG1lc3NhZ2UgPSBtZXNzYWdlIHsKKyAgICAgIG91dCArPSAiTWVzc2FnZTogXChtZXNzYWdlKSIKKyAgICB9CisgICAgcmV0dXJuIG91dAorICB9CisKKyAgLy8vIFNpbXBsZSBkZWZhdWx0IEluaXRpYWxpemVyIGZvciBURXJyb3IncworICAvLy8KKyAgLy8vIC0gcGFyYW1ldGVyIGVycm9yOiAgIEVycm9yQ29kZSB2YWx1ZS4gIERlZmF1bHQ6IGRlZmF1bHRDYXNlCisgIC8vLyAtIHBhcmFtZXRlciBtZXNzYWdlOiBDdXN0b20gbWVzc2FnZSB3aXRoIGVycm9yLiAgT3B0aW9uYWwKKyAgLy8vCisgIC8vLyAtIHJldHVybnM6IDwjcmV0dXJuIHZhbHVlIGRlc2NyaXB0aW9uIz4KKyAgcHVibGljIGluaXQoZXJyb3I6IENvZGUsIG1lc3NhZ2U6IFN0cmluZz8gPSBuaWwpIHsKKyAgICBzZWxmLmluaXQoKQorICAgIHNlbGYuZXJyb3IgPSBlcnJvcgorICAgIHNlbGYubWVzc2FnZSA9IG1lc3NhZ2UKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVEZpbGVIYW5kbGVUcmFuc3BvcnQuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9URmlsZUhhbmRsZVRyYW5zcG9ydC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzE1ZmVmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVEZpbGVIYW5kbGVUcmFuc3BvcnQuc3dpZnQKQEAgLTAsMCArMSw1NiBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisqIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworaW1wb3J0IEZvdW5kYXRpb24KKworcHVibGljIGNsYXNzIFRGaWxlSGFuZGxlVHJhbnNwb3J0OiBUVHJhbnNwb3J0IHsKKyAgdmFyIGlucHV0RmlsZUhhbmRsZTogRmlsZUhhbmRsZQorICB2YXIgb3V0cHV0RmlsZUhhbmRsZTogRmlsZUhhbmRsZQorICAKKyAgcHVibGljIGluaXQoaW5wdXRGaWxlSGFuZGxlOiBGaWxlSGFuZGxlLCBvdXRwdXRGaWxlSGFuZGxlOiBGaWxlSGFuZGxlKSB7CisgICAgc2VsZi5pbnB1dEZpbGVIYW5kbGUgPSBpbnB1dEZpbGVIYW5kbGUKKyAgICBzZWxmLm91dHB1dEZpbGVIYW5kbGUgPSBvdXRwdXRGaWxlSGFuZGxlCisgIH0KKyAgCisgIHB1YmxpYyBjb252ZW5pZW5jZSBpbml0KGZpbGVIYW5kbGU6IEZpbGVIYW5kbGUpIHsKKyAgICBzZWxmLmluaXQoaW5wdXRGaWxlSGFuZGxlOiBmaWxlSGFuZGxlLCBvdXRwdXRGaWxlSGFuZGxlOiBmaWxlSGFuZGxlKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKHNpemU6IEludCkgdGhyb3dzIC0+IERhdGEgeworICAgIHZhciBkYXRhID0gRGF0YSgpCisgICAgd2hpbGUgZGF0YS5jb3VudCA8IHNpemUgeworICAgICAgbGV0IHJlYWQgPSBpbnB1dEZpbGVIYW5kbGUucmVhZERhdGEob2ZMZW5ndGg6IHNpemUgLSBkYXRhLmNvdW50KQorICAgICAgZGF0YS5hcHBlbmQocmVhZCkKKyAgICAgIGlmIHJlYWQuY291bnQgPT0gMCB7CisgICAgICAgIGJyZWFrCisgICAgICB9CisgICAgfQorICAgIHJldHVybiBkYXRhCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKGRhdGE6IERhdGEpIHRocm93cyB7CisgICAgb3V0cHV0RmlsZUhhbmRsZS53cml0ZShkYXRhKQorICB9CisgIAorICBwdWJsaWMgZnVuYyBmbHVzaCgpIHRocm93cyB7CisgICAgcmV0dXJuCisgIH0KK30KKworCmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9URmlsZVRyYW5zcG9ydC5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RGaWxlVHJhbnNwb3J0LnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMjI1M2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9URmlsZVRyYW5zcG9ydC5zd2lmdApAQCAtMCwwICsxLDEwMSBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisqIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworaW1wb3J0IEZvdW5kYXRpb24KKworI2lmIG9zKE9TWCkgfHwgb3MoaU9TKSB8fCBvcyh3YXRjaE9TKSB8fCBvcyh0dk9TKQorICBpbXBvcnQgRGFyd2luCisjZWxzZWlmIG9zKExpbnV4KSB8fCBvcyhGcmVlQlNEKSB8fCBvcyhQUzQpIHx8IG9zKEFuZHJvaWQpCisgIGltcG9ydCBHbGliYworI2VuZGlmCisKKy8vLyBURmlsZVRyYW5zcG9ydAorLy8vIEZvdW5kYXRpb24tbGVzcyBTd2lmdCBGaWxlIHRyYW5zcG9ydC4KKy8vLyBVc2VzIEMgZm9wZW4vZnJlYWQvZndyaXRlLAorLy8vIHByb3ZpZGVkIGJ5IEdsaWJjIGluIGxpbnV4IGFuZCBEYXJ3aW4gb24gT1NYL2lPUworcHVibGljIGNsYXNzIFRGaWxlVHJhbnNwb3J0OiBUVHJhbnNwb3J0IHsKKyAgdmFyIGZpbGVIYW5kbGU6IFVuc2FmZU11dGFibGVQb2ludGVyPEZJTEU+PyA9IG5pbAorICAKKyAgcHVibGljIGluaXQgKGZpbGVIYW5kbGU6IFVuc2FmZU11dGFibGVQb2ludGVyPEZJTEU+KSB7CisgICAgc2VsZi5maWxlSGFuZGxlID0gZmlsZUhhbmRsZQorICB9CisKKyAgcHVibGljIGNvbnZlbmllbmNlIGluaXQoZmlsZW5hbWU6IFN0cmluZykgdGhyb3dzIHsKKyAgICB2YXIgZmlsZUhhbmRsZTogVW5zYWZlTXV0YWJsZVBvaW50ZXI8RklMRT4/CisgICAgZmlsZW5hbWUud2l0aENTdHJpbmcoeyBjRmlsZW5hbWUgaW4KKyAgICAgICJydyIud2l0aENTdHJpbmcoeyBjTW9kZSBpbgorICAgICAgICBmaWxlSGFuZGxlID0gZm9wZW4oY0ZpbGVuYW1lLCBjTW9kZSkKKyAgICAgIH0pCisgICAgfSkKKyAgICBpZiBsZXQgZmlsZUhhbmRsZSA9IGZpbGVIYW5kbGUgeworICAgICAgc2VsZi5pbml0KGZpbGVIYW5kbGU6IGZpbGVIYW5kbGUpCisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFcnJvcihlcnJvcjogLm5vdE9wZW4pCisgICAgfQorICB9CisgIAorICBkZWluaXQgeworICAgIGZjbG9zZShzZWxmLmZpbGVIYW5kbGUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRBbGwoc2l6ZTogSW50KSB0aHJvd3MgLT4gRGF0YSB7CisgICAgbGV0IHJlYWQgPSB0cnkgc2VsZi5yZWFkKHNpemU6IHNpemUpCisgICAgCisgICAgaWYgcmVhZC5jb3VudCAhPSBzaXplIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFcnJvcihlcnJvcjogLmVuZE9mRmlsZSkKKyAgICB9CisgICAgcmV0dXJuIHJlYWQKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZChzaXplOiBJbnQpIHRocm93cyAtPiBEYXRhIHsKKyAgICAvLyBzZXQgdXAgcmVhZCBidWZmZXIsIHBvc2l0aW9uIDAKKyAgICB2YXIgcmVhZCA9IERhdGEoY2FwYWNpdHk6IHNpemUpCisgICAgdmFyIHBvc2l0aW9uID0gMAorICAgIAorICAgIC8vIHJlYWQgY2hhcmFjdGVyIGJ1ZmZlcgorICAgIHZhciBuZXh0Q2hhcjogVUludDggPSAwCisgICAgCisgICAgLy8gY29udGludWUgdW50aWwgd2UndmUgcmVhZCBzaXplIGJ5dGVzCisgICAgd2hpbGUgcmVhZC5jb3VudCA8IHNpemUgeworICAgICAgaWYgZnJlYWQoJm5leHRDaGFyLCAxLCAxLCBzZWxmLmZpbGVIYW5kbGUpID09IDEgeworICAgICAgICByZWFkW3Bvc2l0aW9uXSA9IG5leHRDaGFyCisKKyAgICAgICAgLy8gSW5jcmVtZW50IG91dHB1dCBieXRlIHBvaW50ZXIKKyAgICAgICAgcG9zaXRpb24gKz0gMQorICAgICAgICAKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93IFRUcmFuc3BvcnRFcnJvcihlcnJvcjogLmVuZE9mRmlsZSkKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlYWQKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoZGF0YTogRGF0YSkgdGhyb3dzIHsKKyAgICBsZXQgYnl0ZXNXcml0dGVuID0gZGF0YS53aXRoVW5zYWZlQnl0ZXMgeworICAgICAgZndyaXRlKCQwLCAxLCBkYXRhLmNvdW50LCBzZWxmLmZpbGVIYW5kbGUpCisgICAgfQorICAgIGlmIGJ5dGVzV3JpdHRlbiAhPSBkYXRhLmNvdW50IHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFcnJvcihlcnJvcjogLnVua25vd24pCisgICAgfQorICB9CisgIAorICBwdWJsaWMgZnVuYyBmbHVzaCgpIHRocm93cyB7CisgICAgcmV0dXJuCisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RGcmFtZWRUcmFuc3BvcnQuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9URnJhbWVkVHJhbnNwb3J0LnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMzg1ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9URnJhbWVkVHJhbnNwb3J0LnN3aWZ0CkBAIC0wLDAgKzEsMTIzIEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyogdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitpbXBvcnQgRm91bmRhdGlvbgorCitwdWJsaWMgY2xhc3MgVEZyYW1lZFRyYW5zcG9ydDogVFRyYW5zcG9ydCB7CisgIHB1YmxpYyBzdGF0aWMgbGV0IGhlYWRlclNpemUgICAgPSA0CisgIHB1YmxpYyBzdGF0aWMgbGV0IGluaXRGcmFtZVNpemUgPSAxMDI0CisgIHByaXZhdGUgc3RhdGljIGxldCBkZWZhdWx0TWF4TGVuZ3RoID0gMTYzODQwMDAKKworICBwdWJsaWMgdmFyIHRyYW5zcG9ydDogVFRyYW5zcG9ydAorICBwcml2YXRlIHZhciB3cml0ZUJ1ZmZlciA9IERhdGEoKQorCisgIHByaXZhdGUgdmFyIG1heFNpemUgICAgID0gVEZyYW1lZFRyYW5zcG9ydC5kZWZhdWx0TWF4TGVuZ3RoCisgIHByaXZhdGUgdmFyIHJlbWFpbmluZ0J5dGVzID0gMAorCisKKyAgcHVibGljIGluaXQodHJhbnNwb3J0OiBUVHJhbnNwb3J0LCBtYXhTaXplOiBJbnQpIHsKKyAgICBzZWxmLnRyYW5zcG9ydCA9IHRyYW5zcG9ydAorICAgIHNlbGYubWF4U2l6ZSA9IG1heFNpemUKKyAgfQorCisgIHB1YmxpYyBjb252ZW5pZW5jZSBpbml0KHRyYW5zcG9ydDogVFRyYW5zcG9ydCkgeworICAgIHNlbGYuaW5pdCh0cmFuc3BvcnQ6IHRyYW5zcG9ydCwgbWF4U2l6ZTogVEZyYW1lZFRyYW5zcG9ydC5kZWZhdWx0TWF4TGVuZ3RoKQorICB9CisKKyAgZnVuYyByZWFkSGVhZGVyKCkgdGhyb3dzIHsKKyAgICBsZXQgcmVhZCA9IHRyeSB0cmFuc3BvcnQucmVhZEFsbChzaXplOiBURnJhbWVkVHJhbnNwb3J0LmhlYWRlclNpemUpCisgICAgcmVtYWluaW5nQnl0ZXMgPSBJbnQoZGVjb2RlRnJhbWVTaXplKGRhdGE6IHJlYWQpKQorICB9CisKKyAgLy8vIE1hcms6IC0gVFRyYW5zcG9ydAorCisgIHB1YmxpYyBmdW5jIHJlYWQoc2l6ZTogSW50KSB0aHJvd3MgLT4gRGF0YSB7CisgICAgd2hpbGUgKHJlbWFpbmluZ0J5dGVzIDw9IDApIHsKKyAgICAgICAgdHJ5IHJlYWRIZWFkZXIoKQorICAgIH0KKworICAgIGxldCB0b1JlYWQgPSBtaW4oc2l6ZSwgcmVtYWluaW5nQnl0ZXMpCisKKyAgICBpZiB0b1JlYWQgPCAwIHsKKyAgICAgICAgdHJ5IGNsb3NlKCkKKyAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEVycm9yKGVycm9yOiAubmVnYXRpdmVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogICJSZWFkIGEgbmVnYXRpdmUgZnJhbWUgc2l6ZSAoXCh0b1JlYWQpKSEiKQorICAgIH0KKworICAgIGlmIHRvUmVhZCA+IG1heFNpemUgeworICAgICAgICB0cnkgY2xvc2UoKQorICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC5zaXplTGltaXQobGltaXQ6IG1heFNpemUsIGdvdDogdG9SZWFkKSkKKyAgICB9CisKKyAgICByZXR1cm4gdHJ5IHRyYW5zcG9ydC5yZWFkQWxsKHNpemU6IHRvUmVhZCkKKyAgfQorCisgIHB1YmxpYyBmdW5jIGZsdXNoKCkgdGhyb3dzIHsKKyAgICAvLyBjb3B5IGJ1ZmZlciBhbmQgcmVzZXQKKyAgICBsZXQgYnVmZiA9IHdyaXRlQnVmZmVyCisgICAgd3JpdGVCdWZmZXIgPSBEYXRhKCkKKworICAgIGlmIGJ1ZmYuY291bnQgLSBURnJhbWVkVHJhbnNwb3J0LmhlYWRlclNpemUgPCAwIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFcnJvcihlcnJvcjogLnVua25vd24pCisgICAgfQorCisgICAgbGV0IGZyYW1lU2l6ZSA9IGVuY29kZUZyYW1lU2l6ZShzaXplOiBVSW50MzIoYnVmZi5jb3VudCkpCisKKyAgICB0cnkgdHJhbnNwb3J0LndyaXRlKGRhdGE6IGZyYW1lU2l6ZSkKKyAgICB0cnkgdHJhbnNwb3J0LndyaXRlKGRhdGE6IGJ1ZmYpCisgICAgdHJ5IHRyYW5zcG9ydC5mbHVzaCgpCisgIH0KKworICBwdWJsaWMgZnVuYyB3cml0ZShkYXRhOiBEYXRhKSB0aHJvd3MgeworICAgIHdyaXRlQnVmZmVyLmFwcGVuZChkYXRhKQorICB9CisKKworCisgIHByaXZhdGUgZnVuYyBlbmNvZGVGcmFtZVNpemUoc2l6ZTogVUludDMyKSAtPiBEYXRhIHsKKyAgICB2YXIgZGF0YSA9IERhdGEoKQorICAgIGRhdGEuYXBwZW5kKERhdGEoYnl0ZXM6IFtVSW50OCgweGZmICYgKHNpemUgPj4gMjQpKV0pKQorICAgIGRhdGEuYXBwZW5kKERhdGEoYnl0ZXM6IFtVSW50OCgweGZmICYgKHNpemUgPj4gMTYpKV0pKQorICAgIGRhdGEuYXBwZW5kKERhdGEoYnl0ZXM6IFtVSW50OCgweGZmICYgKHNpemUgPj4gOCkpXSkpCisgICAgZGF0YS5hcHBlbmQoRGF0YShieXRlczogW1VJbnQ4KDB4ZmYgJiAoc2l6ZSkpXSkpCisKKyAgICByZXR1cm4gZGF0YQorICB9CisKKyAgcHJpdmF0ZSBmdW5jIGRlY29kZUZyYW1lU2l6ZShkYXRhOiBEYXRhKSAtPiBVSW50MzIgeworICAgIHZhciBzaXplOiBVSW50MzIKKyAgICBzaXplICA9IChVSW50MzIoZGF0YVswXSAmIDB4ZmYpIDw8IDI0KQorICAgIHNpemUgfD0gKFVJbnQzMihkYXRhWzFdICYgMHhmZikgPDwgMTYpCisgICAgc2l6ZSB8PSAoVUludDMyKGRhdGFbMl0gJiAweGZmKSA8PCAgOCkKKyAgICBzaXplIHw9IChVSW50MzIoZGF0YVszXSAmIDB4ZmYpKQorICAgIHJldHVybiBzaXplCisgIH0KKworICBwdWJsaWMgZnVuYyBjbG9zZSgpIHRocm93cyB7CisgICAgdHJ5IHRyYW5zcG9ydC5jbG9zZSgpCisgIH0KKworICBwdWJsaWMgZnVuYyBvcGVuKCkgdGhyb3dzIHsKKyAgICB0cnkgdHJhbnNwb3J0Lm9wZW4oKQorICB9CisKKyAgcHVibGljIGZ1bmMgaXNPcGVuKCkgdGhyb3dzIC0+IEJvb2wgeworICAgIHJldHVybiB0cnkgdHJhbnNwb3J0LmlzT3BlbigpCisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RIVFRQU2Vzc2lvblRyYW5zcG9ydC5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RIVFRQU2Vzc2lvblRyYW5zcG9ydC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzBhZjhlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVEhUVFBTZXNzaW9uVHJhbnNwb3J0LnN3aWZ0CkBAIC0wLDAgKzEsMTg0IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyogdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitpbXBvcnQgRm91bmRhdGlvbgoraW1wb3J0IERpc3BhdGNoCisKKworcHVibGljIGNsYXNzIFRIVFRQU2Vzc2lvblRyYW5zcG9ydDogVEFzeW5jVHJhbnNwb3J0IHsKKyAgcHVibGljIGNsYXNzIEZhY3RvcnkgOiBUQXN5bmNUcmFuc3BvcnRGYWN0b3J5IHsKKyAgICBwdWJsaWMgdmFyIHJlc3BvbnNlVmFsaWRhdGU6ICgoSFRUUFVSTFJlc3BvbnNlPywgRGF0YT8pIHRocm93cyAtPiBWb2lkKT8KKyAgICAKKyAgICB2YXIgc2Vzc2lvbjogVVJMU2Vzc2lvbgorICAgIHZhciB1cmw6IFVSTAorICAgIAorICAgIHB1YmxpYyBjbGFzcyBmdW5jIHNldHVwRGVmYXVsdHNGb3JTZXNzaW9uQ29uZmlndXJhdGlvbihfIGNvbmZpZzogVVJMU2Vzc2lvbkNvbmZpZ3VyYXRpb24sIHdpdGhQcm90b2NvbE5hbWUgcHJvdG9jb2xOYW1lOiBTdHJpbmc/KSB7CisgICAgICB2YXIgdGhyaWZ0Q29udGVudFR5cGUgPSAiYXBwbGljYXRpb24veC10aHJpZnQiCisgICAgICAKKyAgICAgIGlmIGxldCBwcm90b2NvbE5hbWUgPSBwcm90b2NvbE5hbWUgeworICAgICAgICB0aHJpZnRDb250ZW50VHlwZSArPSAiOyBwPVwocHJvdG9jb2xOYW1lKSIKKyAgICAgIH0KKyAgICAgIAorICAgICAgY29uZmlnLnJlcXVlc3RDYWNoZVBvbGljeSA9IC5yZWxvYWRJZ25vcmluZ0xvY2FsQ2FjaGVEYXRhCisgICAgICBjb25maWcudXJsQ2FjaGUgPSBuaWwKKyAgICAgIAorICAgICAgY29uZmlnLmh0dHBTaG91bGRVc2VQaXBlbGluaW5nICA9IHRydWUKKyAgICAgIGNvbmZpZy5odHRwU2hvdWxkU2V0Q29va2llcyAgICAgPSB0cnVlCisgICAgICBjb25maWcuaHR0cEFkZGl0aW9uYWxIZWFkZXJzICAgID0gWyJDb250ZW50LVR5cGUiOiB0aHJpZnRDb250ZW50VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFjY2VwdCI6IHRocmlmdENvbnRlbnRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVXNlci1BZ2VudCI6ICJUaHJpZnQvU3dpZnQgKFNlc3Npb24pIl0KKyAgICAgIAorICAgICAgCisgICAgfQorICAgIAorICAgIHB1YmxpYyBpbml0KHNlc3Npb246IFVSTFNlc3Npb24sIHVybDogVVJMKSB7CisgICAgICBzZWxmLnNlc3Npb24gPSBzZXNzaW9uCisgICAgICBzZWxmLnVybCA9IHVybAorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgZnVuYyBuZXdUcmFuc3BvcnQoKSAtPiBUSFRUUFNlc3Npb25UcmFuc3BvcnQgeworICAgICAgcmV0dXJuIFRIVFRQU2Vzc2lvblRyYW5zcG9ydChmYWN0b3J5OiBzZWxmKQorICAgIH0KKyAgICAKKyAgICBmdW5jIHZhbGlkYXRlUmVzcG9uc2UoXyByZXNwb25zZTogSFRUUFVSTFJlc3BvbnNlPywgZGF0YTogRGF0YT8pIHRocm93cyB7CisgICAgICB0cnkgcmVzcG9uc2VWYWxpZGF0ZT8ocmVzcG9uc2UsIGRhdGEpCisgICAgfQorICAgIAorICAgIGZ1bmMgdGFza1dpdGhSZXF1ZXN0KF8gcmVxdWVzdDogVVJMUmVxdWVzdCwgY29tcGxldGlvbkhhbmRsZXI6IEBlc2NhcGluZyAoRGF0YT8sIFVSTFJlc3BvbnNlPywgRXJyb3I/KSAtPiAoKSkgdGhyb3dzIC0+IFVSTFNlc3Npb25UYXNrIHsKKyAgICAgIAorICAgICAgbGV0IG5ld1Rhc2s6IFVSTFNlc3Npb25UYXNrPyA9IHNlc3Npb24uZGF0YVRhc2sod2l0aDogcmVxdWVzdCwgY29tcGxldGlvbkhhbmRsZXI6IGNvbXBsZXRpb25IYW5kbGVyKQorICAgICAgaWYgbGV0IG5ld1Rhc2sgPSBuZXdUYXNrIHsKKyAgICAgICAgcmV0dXJuIG5ld1Rhc2sKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93IFRUcmFuc3BvcnRFcnJvcihlcnJvcjogLnVua25vd24sIG1lc3NhZ2U6ICJGYWlsZWQgdG8gY3JlYXRlIHNlc3Npb24gZGF0YSB0YXNrIikKKyAgICAgIH0KKyAgICB9ICAgIAorICB9CisgIAorICB2YXIgZmFjdG9yeTogRmFjdG9yeQorICB2YXIgcmVxdWVzdERhdGEgPSBEYXRhKCkKKyAgdmFyIHJlc3BvbnNlRGF0YSA9IERhdGEoKQorICB2YXIgcmVzcG9uc2VEYXRhT2Zmc2V0OiBJbnQgPSAwCisgIAorICBpbml0KGZhY3Rvcnk6IEZhY3RvcnkpIHsKKyAgICBzZWxmLmZhY3RvcnkgPSBmYWN0b3J5CisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRBbGwoc2l6ZTogSW50KSB0aHJvd3MgLT4gRGF0YSB7CisgICAgbGV0IHJlYWQgPSB0cnkgc2VsZi5yZWFkKHNpemU6IHNpemUpCisgICAgaWYgcmVhZC5jb3VudCAhPSBzaXplIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFcnJvcihlcnJvcjogLmVuZE9mRmlsZSkKKyAgICB9CisgICAgcmV0dXJuIHJlYWQKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZChzaXplOiBJbnQpIHRocm93cyAtPiBEYXRhIHsKKyAgICBsZXQgYXZhaWwgPSByZXNwb25zZURhdGEuY291bnQgLSByZXNwb25zZURhdGFPZmZzZXQKKyAgICBsZXQgKHN0YXJ0LCBzdG9wKSA9IChyZXNwb25zZURhdGFPZmZzZXQsIHJlc3BvbnNlRGF0YU9mZnNldCArIG1pbihzaXplLCBhdmFpbCkpCisgICAgbGV0IHJlYWQgPSByZXNwb25zZURhdGEuc3ViZGF0YShpbjogc3RhcnQuLjxzdG9wKQorICAgIHJlc3BvbnNlRGF0YU9mZnNldCArPSByZWFkLmNvdW50CisgICAgcmV0dXJuIHJlYWQKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoZGF0YTogRGF0YSkgdGhyb3dzIHsKKyAgICByZXF1ZXN0RGF0YS5hcHBlbmQoZGF0YSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgZmx1c2goXyBjb21wbGV0ZWQ6IEBlc2NhcGluZyAoVEFzeW5jVHJhbnNwb3J0LCBFcnJvcj8pIC0+IFZvaWQpIHsKKyAgICB2YXIgZXJyb3I6IEVycm9yPworICAgIHZhciB0YXNrOiBVUkxTZXNzaW9uVGFzaz8KKyAgICAKKyAgICB2YXIgcmVxdWVzdCA9IFVSTFJlcXVlc3QodXJsOiBmYWN0b3J5LnVybCkKKyAgICByZXF1ZXN0Lmh0dHBNZXRob2QgPSAiUE9TVCIKKyAgICByZXF1ZXN0Lmh0dHBCb2R5ID0gIHJlcXVlc3REYXRhCisKKyAgICByZXF1ZXN0RGF0YSA9IERhdGEoKQorCisgICAgZG8geworICAgICAgdGFzayA9IHRyeSBmYWN0b3J5LnRhc2tXaXRoUmVxdWVzdChyZXF1ZXN0LCBjb21wbGV0aW9uSGFuZGxlcjogeyAoZGF0YSwgcmVzcG9uc2UsIHRhc2tFcnJvcikgaW4KKworICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2l0aCB0aGUgbmV0d29yaworICAgICAgICBpZiB0YXNrRXJyb3IgIT0gbmlsIHsKKyAgICAgICAgICAgIGVycm9yID0gVFRyYW5zcG9ydEVycm9yKGVycm9yOiAudGltZWRPdXQpCisgICAgICAgICAgICBjb21wbGV0ZWQoc2VsZiwgZXJyb3IpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIHJlc3BvbnNlIHR5cGUKKyAgICAgICAgaWYgdGFza0Vycm9yID09IG5pbCAmJiAhKHJlc3BvbnNlIGlzIEhUVFBVUkxSZXNwb25zZSkgeworICAgICAgICAgICAgZXJyb3IgPSBUSFRUUFRyYW5zcG9ydEVycm9yKGVycm9yOiAuaW52YWxpZFJlc3BvbnNlKQorICAgICAgICAgICAgY29tcGxldGVkKHNlbGYsIGVycm9yKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIENoZWNrIHN0YXR1cyBjb2RlCisgICAgICAgIGlmIGxldCBodHRwUmVzcG9uc2UgPSByZXNwb25zZSBhcz8gSFRUUFVSTFJlc3BvbnNlIHsKKyAgICAgICAgICBpZiB0YXNrRXJyb3IgPT0gbmlsICYmIGh0dHBSZXNwb25zZS5zdGF0dXNDb2RlICE9IDIwMCB7CisgICAgICAgICAgICBpZiBodHRwUmVzcG9uc2Uuc3RhdHVzQ29kZSA9PSA0MDEgeworICAgICAgICAgICAgICBlcnJvciA9IFRIVFRQVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC5hdXRoZW50aWNhdGlvbikKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGVycm9yID0gVEhUVFBUcmFuc3BvcnRFcnJvcihlcnJvcjogLmludmFsaWRTdGF0dXMoc3RhdHVzQ29kZTogaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGUpKQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICAKKyAgICAgICAgICAvLyBBbGxvdyBmYWN0b3J5IHRvIGNoZWNrCisgICAgICAgICAgaWYgZXJyb3IgIT0gbmlsIHsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgdHJ5IHNlbGYuZmFjdG9yeS52YWxpZGF0ZVJlc3BvbnNlKGh0dHBSZXNwb25zZSwgZGF0YTogZGF0YSkKKyAgICAgICAgICAgIH0gY2F0Y2ggbGV0IHZhbGlkYXRlRXJyb3IgeworICAgICAgICAgICAgICBlcnJvciA9IHZhbGlkYXRlRXJyb3IKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgc2VsZi5yZXNwb25zZURhdGFPZmZzZXQgPSAwCisgICAgICAgICAgaWYgZXJyb3IgIT0gbmlsIHsKKyAgICAgICAgICAgIHNlbGYucmVzcG9uc2VEYXRhID0gRGF0YSgpCisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNlbGYucmVzcG9uc2VEYXRhID0gZGF0YSA/PyBEYXRhKCkKKyAgICAgICAgICB9CisgICAgICAgICAgY29tcGxldGVkKHNlbGYsIGVycm9yKQorICAgICAgICB9CisgICAgICB9KQorICAgICAgCisgICAgfSBjYXRjaCBsZXQgdGFza0Vycm9yIHsKKyAgICAgIGVycm9yID0gdGFza0Vycm9yCisgICAgfQorICAgIAorICAgIGlmIGxldCBlcnJvciA9IGVycm9yLCB0YXNrID09IG5pbCB7CisgICAgICBjb21wbGV0ZWQoc2VsZiwgZXJyb3IpCisgICAgfQorICAgIHRhc2s/LnJlc3VtZSgpCisgIH0KKworICBwdWJsaWMgZnVuYyBmbHVzaCgpIHRocm93cyB7CisgICAgbGV0IGNvbXBsZXRlZCA9IERpc3BhdGNoU2VtYXBob3JlKHZhbHVlOiAwKQorICAgIHZhciBpbnRlcm5hbEVycm9yOiBFcnJvcj8KKyAgICAKKyAgICBmbHVzaCgpIHsgXywgZXJyb3IgaW4KKyAgICAgIGludGVybmFsRXJyb3IgPSBlcnJvcgorICAgICAgY29tcGxldGVkLnNpZ25hbCgpCisgICAgfQorICAgIAorICAgIF8gPSBjb21wbGV0ZWQud2FpdCh0aW1lb3V0OiBEaXNwYXRjaFRpbWUuZGlzdGFudEZ1dHVyZSkKKyAgICAKKyAgICBpZiBsZXQgZXJyb3IgPSBpbnRlcm5hbEVycm9yIHsKKyAgICAgIHRocm93IGVycm9yCisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UTGlzdC5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RMaXN0LnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMzlkMTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UTGlzdC5zd2lmdApAQCAtMCwwICsxLDEzOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwdWJsaWMgc3RydWN0IFRMaXN0PEVsZW1lbnQgOiBUU2VyaWFsaXphYmxlPiA6IFJhbmRvbUFjY2Vzc0NvbGxlY3Rpb24sIE11dGFibGVDb2xsZWN0aW9uLCBFeHByZXNzaWJsZUJ5QXJyYXlMaXRlcmFsLCBUU2VyaWFsaXphYmxlLCBIYXNoYWJsZSB7CisgIHB1YmxpYyB0eXBlYWxpYXMgU3RvcmFnZSA9IEFycmF5PEVsZW1lbnQ+CisgIHB1YmxpYyB0eXBlYWxpYXMgSW5kaWNlcyA9IFN0b3JhZ2UuSW5kaWNlcworCisgIGludGVybmFsIHZhciBzdG9yYWdlID0gU3RvcmFnZSgpCisgIHB1YmxpYyBpbml0KCkgeyB9CisgIHB1YmxpYyBpbml0KGFycmF5TGl0ZXJhbCBlbGVtZW50czogRWxlbWVudC4uLikgeworICAgIHNlbGYuc3RvcmFnZSA9IFN0b3JhZ2UoZWxlbWVudHMpCisgIH0KKyAgcHVibGljIGluaXQ8U291cmNlIDogU2VxdWVuY2U+KF8gc2VxdWVuY2U6IFNvdXJjZSkgd2hlcmUgU291cmNlLkl0ZXJhdG9yLkVsZW1lbnQgPT0gRWxlbWVudCB7CisgICAgc3RvcmFnZSA9IFN0b3JhZ2Uoc2VxdWVuY2UpCisgIH0KKworICAvLy8gTWFyazogSGFzaGFibGUKKyAgcHVibGljIHZhciBoYXNoVmFsdWUgOiBJbnQgeworICAgIGxldCBwcmltZSA9IDMxCisgICAgdmFyIHJlc3VsdCA9IDEKKyAgICBmb3IgZWxlbWVudCBpbiBzdG9yYWdlIHsKKyAgICAgIHJlc3VsdCA9IHByaW1lICYqIHJlc3VsdCAmKyBlbGVtZW50Lmhhc2hWYWx1ZQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0CisgIH0KKyAgCisgIC8vLyBNYXJrOiBUU2VyaWFsaXphYmxlCisgIHB1YmxpYyBzdGF0aWMgdmFyIHRocmlmdFR5cGUgOiBUVHlwZSB7IHJldHVybiAubGlzdCB9CisKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWQoZnJvbSBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gVExpc3QgeworICAgIGxldCAoZWxlbWVudFR5cGUsIHNpemUpID0gdHJ5IHByb3RvLnJlYWRMaXN0QmVnaW4oKQorICAgIGlmIGVsZW1lbnRUeXBlICE9IEVsZW1lbnQudGhyaWZ0VHlwZSB7CisgICAgICB0aHJvdyBUUHJvdG9jb2xFcnJvcihlcnJvcjogLmludmFsaWREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWRFcnJvcjogLnVuZXhwZWN0ZWRUeXBlKHR5cGU6IGVsZW1lbnRUeXBlKSkKKyAgICB9CisgICAgdmFyIGxpc3QgPSBUTGlzdCgpCisgICAgZm9yIF8gaW4gMC4uPHNpemUgeworICAgICAgbGV0IGVsZW1lbnQgPSB0cnkgRWxlbWVudC5yZWFkKGZyb206IHByb3RvKQorICAgICAgbGlzdC5zdG9yYWdlLmFwcGVuZChlbGVtZW50KQorICAgIH0KKyAgICB0cnkgcHJvdG8ucmVhZExpc3RFbmQoKQorICAgIHJldHVybiBsaXN0CisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKHRvIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHByb3RvLndyaXRlTGlzdEJlZ2luKGVsZW1lbnRUeXBlOiBFbGVtZW50LnRocmlmdFR5cGUsIHNpemU6IEludDMyKHNlbGYuY291bnQpKQorICAgIGZvciBlbGVtZW50IGluIHNlbGYuc3RvcmFnZSB7CisgICAgICB0cnkgRWxlbWVudC53cml0ZShlbGVtZW50LCB0bzogcHJvdG8pCisgICAgfQorICAgIHRyeSBwcm90by53cml0ZUxpc3RFbmQoKQorICB9CisKKyAgLy8vIE1hcms6IE11dGFibGVDb2xsZWN0aW9uCisgIAorICBwdWJsaWMgdHlwZWFsaWFzIFN1YlNlcXVlbmNlID0gU3RvcmFnZS5TdWJTZXF1ZW5jZQorICBwdWJsaWMgdHlwZWFsaWFzIEluZGV4ID0gU3RvcmFnZS5JbmRleAorICAKKyAgcHVibGljIHN1YnNjcmlwdChwb3NpdGlvbjogU3RvcmFnZS5JbmRleCkgLT4gRWxlbWVudCB7CisgICAgZ2V0IHsKKyAgICAgIHJldHVybiBzdG9yYWdlW3Bvc2l0aW9uXQorICAgIH0KKyAgICBzZXQgeworICAgICAgc3RvcmFnZVtwb3NpdGlvbl0gPSBuZXdWYWx1ZQorICAgIH0KKyAgfQorICAKKyAgcHVibGljIHN1YnNjcmlwdChyYW5nZTogUmFuZ2U8SW5kZXg+KSAtPiBTdWJTZXF1ZW5jZSB7CisgICAgZ2V0IHsKKyAgICAgIHJldHVybiBzdG9yYWdlW3JhbmdlXQorICAgIH0KKyAgICBzZXQgeworICAgICAgc3RvcmFnZVtyYW5nZV0gPSBuZXdWYWx1ZQorICAgIH0KKyAgfQorICAKKyAgcHVibGljIHZhciBzdGFydEluZGV4OiBJbmRleCB7CisgICAgcmV0dXJuIHN0b3JhZ2Uuc3RhcnRJbmRleAorICB9CisgIHB1YmxpYyB2YXIgZW5kSW5kZXg6IEluZGV4IHsKKyAgICByZXR1cm4gc3RvcmFnZS5lbmRJbmRleAorICB9CisgIAorICBwdWJsaWMgZnVuYyBmb3JtSW5kZXgoYWZ0ZXIgaTogaW5vdXQgSW5kZXgpIHsKKyAgICBzdG9yYWdlLmZvcm1JbmRleChhZnRlcjogJmkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGZvcm1JbmRleChiZWZvcmUgaTogaW5vdXQgSW50KSB7CisgICAgc3RvcmFnZS5mb3JtSW5kZXgoYmVmb3JlOiAmaSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgaW5kZXgoYWZ0ZXIgaTogSW5kZXgpIC0+IEluZGV4IHsKKyAgICByZXR1cm4gc3RvcmFnZS5pbmRleChhZnRlcjogaSkKKyAgfQorCisgIHB1YmxpYyBmdW5jIGluZGV4KGJlZm9yZSBpOiBJbnQpIC0+IEludCB7CisgICAgcmV0dXJuIHN0b3JhZ2UuaW5kZXgoYmVmb3JlOiBpKQorICB9CisKK30KKworZXh0ZW5zaW9uIFRMaXN0IDogUmFuZ2VSZXBsYWNlYWJsZUNvbGxlY3Rpb24geworICBwdWJsaWMgbXV0YXRpbmcgZnVuYyByZXBsYWNlU3VicmFuZ2U8QzogQ29sbGVjdGlvbj4oXyBzdWJyYW5nZTogUmFuZ2U8SW5kZXg+LCB3aXRoIG5ld0VsZW1lbnRzOiBDKQorICAgIHdoZXJlIEMuSXRlcmF0b3IuRWxlbWVudCA9PSBFbGVtZW50IHsKKyAgICBzdG9yYWdlLnJlcGxhY2VTdWJyYW5nZShzdWJyYW5nZSwgd2l0aDogbmV3RWxlbWVudHMpCisgIH0KK30KKworZXh0ZW5zaW9uIFRMaXN0IDogQ3VzdG9tU3RyaW5nQ29udmVydGlibGUsIEN1c3RvbURlYnVnU3RyaW5nQ29udmVydGlibGUgeworICAKKyAgcHVibGljIHZhciBkZXNjcmlwdGlvbiA6IFN0cmluZyB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZGVzY3JpcHRpb24KKyAgfQorICAKKyAgcHVibGljIHZhciBkZWJ1Z0Rlc2NyaXB0aW9uIDogU3RyaW5nIHsKKyAgICByZXR1cm4gc3RvcmFnZS5kZWJ1Z0Rlc2NyaXB0aW9uCisgIH0KKyAgCit9CisKK3B1YmxpYyBmdW5jID09PEVsZW1lbnQ+KGxoczogVExpc3Q8RWxlbWVudD4sIHJoczogVExpc3Q8RWxlbWVudD4pIC0+IEJvb2wgeworICByZXR1cm4gbGhzLnN0b3JhZ2UuZWxlbWVudHNFcXVhbChyaHMuc3RvcmFnZSkgeyAkMCA9PSAkMSB9Cit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UTWFwLnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVE1hcC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTgwMzc3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVE1hcC5zd2lmdApAQCAtMCwwICsxLDE5NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwdWJsaWMgc3RydWN0IFRNYXA8S2V5IDogVFNlcmlhbGl6YWJsZSAmIEhhc2hhYmxlLCBWYWx1ZSA6IFRTZXJpYWxpemFibGU+OiBDb2xsZWN0aW9uLCBFeHByZXNzaWJsZUJ5RGljdGlvbmFyeUxpdGVyYWwsIEhhc2hhYmxlLCBUU2VyaWFsaXphYmxlIHsKKyAgcHVibGljIHR5cGVhbGlhcyBTdG9yYWdlID0gRGljdGlvbmFyeTxLZXksIFZhbHVlPgorICBwdWJsaWMgdHlwZWFsaWFzIEVsZW1lbnQgPSBTdG9yYWdlLkVsZW1lbnQKKyAgcHVibGljIHR5cGVhbGlhcyBJbmRleCA9IFN0b3JhZ2UuSW5kZXgKKyAgcHVibGljIHR5cGVhbGlhcyBJbmRleERpc3RhbmNlID0gU3RvcmFnZS5JbmRleERpc3RhbmNlCisgIHB1YmxpYyB0eXBlYWxpYXMgSW5kaWNlcyA9IFN0b3JhZ2UuSW5kaWNlcworICBwdWJsaWMgdHlwZWFsaWFzIFN1YlNlcXVlbmNlID0gU3RvcmFnZS5TdWJTZXF1ZW5jZQorICBpbnRlcm5hbCB2YXIgc3RvcmFnZSA9IFN0b3JhZ2UoKQorICAKKyAgLy8vIE1hcms6IEJlIExpa2UgRGljdGlvbmFyeQorICAKKyAgcHVibGljIGZ1bmMgaW5kZXhGb3JLZXkoXyBrZXk6IEtleSkgLT4gSW5kZXg/IHsKKyAgICByZXR1cm4gc3RvcmFnZS5pbmRleChmb3JLZXk6IGtleSkKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgdXBkYXRlVmFsdWUoXyB2YWx1ZTogVmFsdWUsIGZvcktleSBrZXk6IEtleSkgLT4gVmFsdWU/IHsKKyAgICByZXR1cm4gdXBkYXRlVmFsdWUodmFsdWUsIGZvcktleToga2V5KQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyByZW1vdmVBdEluZGV4KF8gaW5kZXg6IERpY3Rpb25hcnlJbmRleDxLZXksIFZhbHVlPikgLT4gKEtleSwgVmFsdWUpIHsKKyAgICByZXR1cm4gcmVtb3ZlQXRJbmRleChpbmRleCkKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgcmVtb3ZlVmFsdWVGb3JLZXkoXyBrZXk6IEtleSkgLT4gVmFsdWU/IHsKKyAgICByZXR1cm4gc3RvcmFnZS5yZW1vdmVWYWx1ZShmb3JLZXk6IGtleSkKKyAgfQorICAKKyAgcHVibGljIGluaXQobWluaW11bUNhcGFjaXR5OiBJbnQpIHsKKyAgICBzdG9yYWdlID0gU3RvcmFnZShtaW5pbXVtQ2FwYWNpdHk6IG1pbmltdW1DYXBhY2l0eSkKKyAgfQorICAKKyAgLy8vIGluaXQgZnJvbSBEaWN0aW9uYXJ5PEssVj4KKyAgcHVibGljIGluaXQoXyBkaWN0OiBbS2V5OiBWYWx1ZV0pIHsKKyAgICBzdG9yYWdlID0gZGljdAorICB9CisKKyAgLy8vIHJlYWQgb25seSBhY2Nlc3MgdG8gc3RvcmFnZSBpZiBuZWVkZWQgYXMgRGljdGlvbmFyeTxLLFY+CisgIHB1YmxpYyB2YXIgZGljdGlvbmFyeTogW0tleTogVmFsdWVdIHsKKyAgICByZXR1cm4gc3RvcmFnZQorICB9CisgIAorICBwdWJsaWMgc3Vic2NyaXB0IChrZXk6IEtleSkgLT4gVmFsdWU/IHsKKyAgICBnZXQgeworICAgICAgcmV0dXJuIHN0b3JhZ2Vba2V5XQorICAgIH0KKyAgICBzZXQgeworICAgICAgc3RvcmFnZVtrZXldID0gbmV3VmFsdWUKKyAgICB9CisgIH0KKyAgCisgIC8vLyBNYXJrOiBDb2xsZWN0aW9uCisgIAorICBwdWJsaWMgdmFyIGluZGljZXM6IEluZGljZXMgeworICAgIHJldHVybiBzdG9yYWdlLmluZGljZXMKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgZGlzdGFuY2UoZnJvbSBzdGFydDogSW5kZXgsIHRvIGVuZDogSW5kZXgpIC0+IEluZGV4RGlzdGFuY2UgeworICAgIHJldHVybiBzdG9yYWdlLmRpc3RhbmNlKGZyb206IHN0YXJ0LCB0bzogZW5kKQorICB9CisgIAorICBwdWJsaWMgZnVuYyBpbmRleChfIGk6IEluZGV4LCBvZmZzZXRCeSBuOiBJbmRleERpc3RhbmNlKSAtPiBJbmRleCB7CisgICAgcmV0dXJuIHN0b3JhZ2UuaW5kZXgoaSwgb2Zmc2V0Qnk6IG4pCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGluZGV4KF8gaTogSW5kZXgsIG9mZnNldEJ5IG46IEluZGV4RGlzdGFuY2UsIGxpbWl0ZWRCeSBsaW1pdDogSW5kZXgpIC0+IEluZGV4PyB7CisgICAgcmV0dXJuIHN0b3JhZ2UuaW5kZXgoaSwgb2Zmc2V0Qnk6IG4sIGxpbWl0ZWRCeTogbGltaXQpCisgIH0KKyAgCisgIHB1YmxpYyBzdWJzY3JpcHQocG9zaXRpb246IEluZGV4KSAtPiBFbGVtZW50IHsKKyAgICByZXR1cm4gc3RvcmFnZVtwb3NpdGlvbl0KKyAgfQorICAKKyAgLy8vIE1hcms6IEluZGV4YWJsZUJhc2UKKyAgCisgIHB1YmxpYyB2YXIgc3RhcnRJbmRleDogSW5kZXggeyByZXR1cm4gc3RvcmFnZS5zdGFydEluZGV4IH0KKyAgcHVibGljIHZhciBlbmRJbmRleDogSW5kZXggeyByZXR1cm4gc3RvcmFnZS5lbmRJbmRleCB9CisgIHB1YmxpYyBmdW5jIGluZGV4KGFmdGVyIGk6IEluZGV4KSAtPiBJbmRleCB7CisgICAgcmV0dXJuIHN0b3JhZ2UuaW5kZXgoYWZ0ZXI6IGkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGZvcm1JbmRleChhZnRlciBpOiBpbm91dCBJbmRleCkgeworICAgIHN0b3JhZ2UuZm9ybUluZGV4KGFmdGVyOiAmaSkKKyAgfQorICAKKyAgcHVibGljIHN1YnNjcmlwdChib3VuZHM6IFJhbmdlPEluZGV4PikgLT4gU3ViU2VxdWVuY2UgeworICAgIHJldHVybiBzdG9yYWdlW2JvdW5kc10KKyAgfQorICAKKyAgLy8vIE1hcms6IERpY3Rpb25hcnlMaXRlcmFsQ29udmVydGlibGUKKyAgCisgIHB1YmxpYyBpbml0KGRpY3Rpb25hcnlMaXRlcmFsIGVsZW1lbnRzOiAoS2V5LCBWYWx1ZSkuLi4pIHsKKyAgICBzdG9yYWdlID0gU3RvcmFnZSgpCisgICAgZm9yIChrZXksIHZhbHVlKSBpbiBlbGVtZW50cyB7CisgICAgICBzdG9yYWdlW2tleV0gPSB2YWx1ZQorICAgIH0KKyAgfQorCisgIC8vLyBNYXJrOiBIYXNoYWJsZQorICAKKyAgcHVibGljIHZhciBoYXNoVmFsdWU6IEludCB7CisgICAgbGV0IHByaW1lID0gMzEKKyAgICB2YXIgcmVzdWx0ID0gMQorICAgIGZvciAoa2V5LCB2YWx1ZSkgaW4gc3RvcmFnZSB7CisgICAgICByZXN1bHQgPSBwcmltZSAmKiByZXN1bHQgJisga2V5Lmhhc2hWYWx1ZQorICAgICAgcmVzdWx0ID0gcHJpbWUgJiogcmVzdWx0ICYrIHZhbHVlLmhhc2hWYWx1ZQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0CisgIH0KKyAgCisgIC8vLyBNYXJrOiBUU2VyaWFsaXphYmxlCisgIAorICBwdWJsaWMgc3RhdGljIHZhciB0aHJpZnRUeXBlIDogVFR5cGUgeyByZXR1cm4gLm1hcCB9CisgIHB1YmxpYyBpbml0KCkgeworICAgIHN0b3JhZ2UgPSBTdG9yYWdlKCkKKyAgfQorICAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkKGZyb20gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IFRNYXAgeworCisgICAgbGV0IChrZXlUeXBlLCB2YWx1ZVR5cGUsIHNpemUpID0gdHJ5IHByb3RvLnJlYWRNYXBCZWdpbigpCisgICAgaWYgc2l6ZSA+IDAgeworICAgICAgaWYga2V5VHlwZSAhPSBLZXkudGhyaWZ0VHlwZSB7CisgICAgICAgIHRocm93IFRQcm90b2NvbEVycm9yKGVycm9yOiAuaW52YWxpZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICJVbmV4cGVjdGVkIFRNYXAgS2V5IFR5cGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbmRlZEVycm9yOiAudW5leHBlY3RlZFR5cGUodHlwZToga2V5VHlwZSkpCisgICAgICB9CisgICAgICBpZiB2YWx1ZVR5cGUgIT0gVmFsdWUudGhyaWZ0VHlwZSB7CisgICAgICAgIHRocm93IFRQcm90b2NvbEVycm9yKGVycm9yOiAuaW52YWxpZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICJVbmV4cGVjdGVkIFRNYXAgVmFsdWUgVHlwZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuZGVkRXJyb3I6IC51bmV4cGVjdGVkVHlwZSh0eXBlOiB2YWx1ZVR5cGUpKQorICAgICAgfQorICAgIH0KKworICAgIHZhciBtYXAgPSBUTWFwKCkKKyAgICBmb3IgXyBpbiAwLi48c2l6ZSB7CisgICAgICBsZXQga2V5ID0gdHJ5IEtleS5yZWFkKGZyb206IHByb3RvKQorICAgICAgbGV0IHZhbHVlID0gdHJ5IFZhbHVlLnJlYWQoZnJvbTogcHJvdG8pCisgICAgICBtYXAuc3RvcmFnZVtrZXldID0gdmFsdWUKKyAgICB9CisgICAgdHJ5IHByb3RvLnJlYWRNYXBFbmQoKQorICAgIHJldHVybiBtYXAKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUodG8gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGVNYXBCZWdpbihrZXlUeXBlOiBLZXkudGhyaWZ0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVR5cGU6IFZhbHVlLnRocmlmdFR5cGUsIHNpemU6IEludDMyKHNlbGYuY291bnQpKQorICAgIGZvciAoa2V5LCB2YWx1ZSkgaW4gc2VsZi5zdG9yYWdlIHsKKyAgICAgIHRyeSBLZXkud3JpdGUoa2V5LCB0bzogcHJvdG8pCisgICAgICB0cnkgVmFsdWUud3JpdGUodmFsdWUsIHRvOiBwcm90bykKKyAgICB9CisgICAgdHJ5IHByb3RvLndyaXRlTWFwRW5kKCkKKyAgfQorfQorCisvLy8gTWFyazogQ3VzdG9tU3RyaW5nQ29udmVydGlibGUsIEN1c3RvbURlYnVnU3RyaW5nQ29udmVydGlibGUKKworZXh0ZW5zaW9uIFRNYXAgOiBDdXN0b21TdHJpbmdDb252ZXJ0aWJsZSwgQ3VzdG9tRGVidWdTdHJpbmdDb252ZXJ0aWJsZSB7CisgIAorICBwdWJsaWMgdmFyIGRlc2NyaXB0aW9uIDogU3RyaW5nIHsKKyAgICByZXR1cm4gc3RvcmFnZS5kZXNjcmlwdGlvbgorICB9CisgIAorICBwdWJsaWMgdmFyIGRlYnVnRGVzY3JpcHRpb24gOiBTdHJpbmcgeworICAgIHJldHVybiBzdG9yYWdlLmRlYnVnRGVzY3JpcHRpb24KKyAgfQorICAKK30KKworLy8vIE1hcms6IEVxdWF0YWJsZQorCitwdWJsaWMgZnVuYyA9PTxLZXksIFZhbHVlPihsaHM6IFRNYXA8S2V5LFZhbHVlPiwgcmhzOiBUTWFwPEtleSwgVmFsdWU+KSAtPiBCb29sIHsKKyAgaWYgbGhzLmNvdW50ICE9IHJocy5jb3VudCB7CisgICAgcmV0dXJuIGZhbHNlCisgIH0KKyAgcmV0dXJuIGxocy5zdG9yYWdlLmVsZW1lbnRzRXF1YWwocmhzLnN0b3JhZ2UpIHsgJDAua2V5ID09ICQxLmtleSAmJiAkMC52YWx1ZSA9PSAkMS52YWx1ZSB9Cit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UTWVtb3J5QnVmZmVyVHJhbnNwb3J0LnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVE1lbW9yeUJ1ZmZlclRyYW5zcG9ydC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDU4YjZlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVE1lbW9yeUJ1ZmZlclRyYW5zcG9ydC5zd2lmdApAQCAtMCwwICsxLDc0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBGb3VuZGF0aW9uCisKK3B1YmxpYyBjbGFzcyBUTWVtb3J5QnVmZmVyVHJhbnNwb3J0IDogVFRyYW5zcG9ydCB7CisgIHB1YmxpYyBwcml2YXRlKHNldCkgdmFyIHJlYWRCdWZmZXIgPSBEYXRhKCkKKyAgcHVibGljIHByaXZhdGUoc2V0KSB2YXIgd3JpdGVCdWZmZXIgPSBEYXRhKCkKKyAgCisgIHB1YmxpYyBwcml2YXRlKHNldCkgdmFyIHBvc2l0aW9uID0gMAorCisgIHB1YmxpYyB2YXIgYnl0ZXNSZW1haW5pbmdJbkJ1ZmZlcjogSW50IHsKKyAgICByZXR1cm4gcmVhZEJ1ZmZlci5jb3VudCAtIHBvc2l0aW9uCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGNvbnN1bWVCdWZmZXIoc2l6ZTogSW50KSB7CisgICAgcG9zaXRpb24gKz0gc2l6ZQorICB9CisgIHB1YmxpYyBmdW5jIGNsZWFyKCkgeworICAgIHJlYWRCdWZmZXIgPSBEYXRhKCkKKyAgICB3cml0ZUJ1ZmZlciA9IERhdGEoKQorICB9CisgIAorICAKKyAgcHJpdmF0ZSB2YXIgZmx1c2hIYW5kbGVyOiAoKFRNZW1vcnlCdWZmZXJUcmFuc3BvcnQsIERhdGEpIC0+ICgpKT8KKyAgCisgIHB1YmxpYyBpbml0KGZsdXNoSGFuZGxlcjogKChUTWVtb3J5QnVmZmVyVHJhbnNwb3J0LCBEYXRhKSAtPiAoKSk/ID0gbmlsKSB7CisgICAgc2VsZi5mbHVzaEhhbmRsZXIgPSBmbHVzaEhhbmRsZXIKKyAgfQorICAKKyAgcHVibGljIGNvbnZlbmllbmNlIGluaXQocmVhZEJ1ZmZlcjogRGF0YSwgZmx1c2hIYW5kbGVyOiAoKFRNZW1vcnlCdWZmZXJUcmFuc3BvcnQsIERhdGEpIC0+ICgpKT8gPSBuaWwpIHsKKyAgICBzZWxmLmluaXQoKQorICAgIHNlbGYucmVhZEJ1ZmZlciA9IHJlYWRCdWZmZXIKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVzZXQocmVhZEJ1ZmZlcjogRGF0YSA9IERhdGEoKSwgd3JpdGVCdWZmZXI6IERhdGEgPSBEYXRhKCkpIHsKKyAgICBzZWxmLnJlYWRCdWZmZXIgPSByZWFkQnVmZmVyCisgICAgc2VsZi53cml0ZUJ1ZmZlciA9IHdyaXRlQnVmZmVyCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoc2l6ZTogSW50KSB0aHJvd3MgLT4gRGF0YSB7CisgICAgbGV0IGFtb3VudFRvUmVhZCA9IG1pbihieXRlc1JlbWFpbmluZ0luQnVmZmVyLCBzaXplKQorICAgIGlmIGFtb3VudFRvUmVhZCA+IDAgeworICAgICAgbGV0IHJldCA9IHJlYWRCdWZmZXIuc3ViZGF0YShpbjogUmFuZ2UodW5jaGVja2VkQm91bmRzOiAobG93ZXI6IHBvc2l0aW9uLCB1cHBlcjogcG9zaXRpb24gKyBhbW91bnRUb1JlYWQpKSkKKyAgICAgIHBvc2l0aW9uICs9IHJldC5jb3VudAorICAgICAgcmV0dXJuIHJldAorICAgIH0KKyAgICByZXR1cm4gRGF0YSgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKGRhdGE6IERhdGEpIHRocm93cyB7CisgICAgd3JpdGVCdWZmZXIuYXBwZW5kKGRhdGEpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGZsdXNoKCkgdGhyb3dzIHsKKyAgICBmbHVzaEhhbmRsZXI/KHNlbGYsIHdyaXRlQnVmZmVyKQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UTXVsdGlwbGV4ZWRQcm90b2NvbC5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RNdWx0aXBsZXhlZFByb3RvY29sLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczYThkNTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UTXVsdGlwbGV4ZWRQcm90b2NvbC5zd2lmdApAQCAtMCwwICsxLDQ3IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyogdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitwdWJsaWMgY2xhc3MgVE11bHRpcGxleGVkUHJvdG9jb2w8UHJvdG9jb2w6IFRQcm90b2NvbD46IFRXcmFwcGVkUHJvdG9jb2w8UHJvdG9jb2w+IHsKKyAgcHVibGljIGxldCBzZXBhcmF0b3IgPSAiOiIKKworICBwdWJsaWMgdmFyIHNlcnZpY2VOYW1lID0gIiIKKyAgCisgIHB1YmxpYyBjb252ZW5pZW5jZSBpbml0KG9uIHRyYW5zcG9ydDogVFRyYW5zcG9ydCwgc2VydmljZU5hbWU6IFN0cmluZykgeworICAgIHNlbGYuaW5pdChvbjogdHJhbnNwb3J0KQorICAgIHNlbGYuc2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZSAgICAKKyAgfQorCisgIG92ZXJyaWRlIHB1YmxpYyBmdW5jIHdyaXRlTWVzc2FnZUJlZ2luKG5hbWU6IFN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSBtZXNzYWdlVHlwZTogVE1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOiBJbnQzMikgdGhyb3dzIHsKKyAgICBzd2l0Y2ggbWVzc2FnZVR5cGUgeworICAgIGNhc2UgLmNhbGwsIC5vbmV3YXk6CisgICAgICB2YXIgc2VydmljZUZ1bmN0aW9uID0gc2VydmljZU5hbWUKKyAgICAgIHNlcnZpY2VGdW5jdGlvbiArPSBzZXJ2aWNlTmFtZSA9PSAiIiA/ICIiIDogc2VwYXJhdG9yCisgICAgICBzZXJ2aWNlRnVuY3Rpb24gKz0gbmFtZQorICAgICAgcmV0dXJuIHRyeSBzdXBlci53cml0ZU1lc3NhZ2VCZWdpbihuYW1lOiBzZXJ2aWNlRnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IG1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOiBzZXF1ZW5jZUlEKQorICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gdHJ5IHN1cGVyLndyaXRlTWVzc2FnZUJlZ2luKG5hbWU6IG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IG1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOiBzZXF1ZW5jZUlEKQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVFByb2Nlc3Nvci5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RQcm9jZXNzb3Iuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZmMjIyZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RQcm9jZXNzb3Iuc3dpZnQKQEAgLTAsMCArMSwyOSBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisqIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworCitwdWJsaWMgdHlwZWFsaWFzIFRQcm9jZXNzb3JNZXNzYWdlSGFuZGxlcjxUPiA9IChJbnQsIFRQcm90b2NvbCwgVFByb3RvY29sLCBUKSAtPiBWb2lkCisKK3B1YmxpYyBwcm90b2NvbCBUUHJvY2Vzc29yIHsKKyAgYXNzb2NpYXRlZHR5cGUgU2VydmljZQorICB2YXIgc2VydmljZTogU2VydmljZSB7IGdldCBzZXQgfQorICBmdW5jIHByb2Nlc3Mob24gaW5Qcm90b2NvbDogVFByb3RvY29sLCBvdXRQcm90b2NvbDogVFByb3RvY29sKSB0aHJvd3MKKyAgaW5pdChzZXJ2aWNlOiBTZXJ2aWNlKQorfQorCmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UUHJvdG9jb2wuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UUHJvdG9jb2wuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRlNGEyMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RQcm90b2NvbC5zd2lmdApAQCAtMCwwICsxLDE4MiBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisqIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworaW1wb3J0IEZvdW5kYXRpb24KKy8vCisKK3B1YmxpYyBlbnVtIFRNZXNzYWdlVHlwZTogSW50MzIgeworICBjYXNlIGNhbGwgPSAxCisgIGNhc2UgcmVwbHkgPSAyCisgIGNhc2UgZXhjZXB0aW9uID0gMworICBjYXNlIG9uZXdheSA9IDQKK30KKworcHVibGljIGVudW0gVFR5cGU6IEludDMyIHsKKyAgY2FzZSBzdG9wICAgICA9IDAKKyAgY2FzZSB2b2lkICAgICA9IDEKKyAgY2FzZSBib29sICAgICA9IDIKKyAgY2FzZSBpOCAgICAgICA9IDMKKyAgY2FzZSBkb3VibGUgICA9IDQKKyAgY2FzZSBpMTYgICAgICA9IDYKKyAgY2FzZSBpMzIgICAgICA9IDgKKyAgY2FzZSBpNjQgICAgICA9IDEwCisgIGNhc2Ugc3RyaW5nICAgPSAxMQorICBjYXNlIGBzdHJ1Y3RgID0gMTIKKyAgY2FzZSBtYXAgICAgICA9IDEzCisgIGNhc2Ugc2V0ICAgICAgPSAxNAorICBjYXNlIGxpc3QgICAgID0gMTUKKyAgY2FzZSB1dGY4ICAgICA9IDE2CisgIGNhc2UgdXRmMTYgICAgPSAxNworfQorCitwdWJsaWMgcHJvdG9jb2wgVFByb3RvY29sIHsKKyAgdmFyIHRyYW5zcG9ydDogVFRyYW5zcG9ydCB7IGdldCBzZXQgfQorICBpbml0KG9uIHRyYW5zcG9ydDogVFRyYW5zcG9ydCkKKyAgLy8gUmVhZGluZyBNZXRob2RzCisgIAorICBmdW5jIHJlYWRNZXNzYWdlQmVnaW4oKSB0aHJvd3MgLT4gKFN0cmluZywgVE1lc3NhZ2VUeXBlLCBJbnQzMikKKyAgZnVuYyByZWFkTWVzc2FnZUVuZCgpIHRocm93cworICBmdW5jIHJlYWRTdHJ1Y3RCZWdpbigpIHRocm93cyAtPiBTdHJpbmcKKyAgZnVuYyByZWFkU3RydWN0RW5kKCkgdGhyb3dzCisgIGZ1bmMgcmVhZEZpZWxkQmVnaW4oKSB0aHJvd3MgLT4gKFN0cmluZywgVFR5cGUsIEludDMyKQorICBmdW5jIHJlYWRGaWVsZEVuZCgpIHRocm93cworICBmdW5jIHJlYWRNYXBCZWdpbigpIHRocm93cyAtPiAoVFR5cGUsIFRUeXBlLCBJbnQzMikKKyAgZnVuYyByZWFkTWFwRW5kKCkgdGhyb3dzCisgIGZ1bmMgcmVhZFNldEJlZ2luKCkgdGhyb3dzIC0+IChUVHlwZSwgSW50MzIpCisgIGZ1bmMgcmVhZFNldEVuZCgpIHRocm93cworICBmdW5jIHJlYWRMaXN0QmVnaW4oKSB0aHJvd3MgLT4gKFRUeXBlLCBJbnQzMikKKyAgZnVuYyByZWFkTGlzdEVuZCgpIHRocm93cworICAKKyAgZnVuYyByZWFkKCkgdGhyb3dzIC0+IFN0cmluZworICBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gQm9vbAorICBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gVUludDgKKyAgZnVuYyByZWFkKCkgdGhyb3dzIC0+IEludDE2CisgIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBJbnQzMgorICBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gSW50NjQKKyAgZnVuYyByZWFkKCkgdGhyb3dzIC0+IERvdWJsZQorICBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gRGF0YQorICAKKyAgLy8gV3JpdGluZyBtZXRob2RzCisgIAorICBmdW5jIHdyaXRlTWVzc2FnZUJlZ2luKG5hbWU6IFN0cmluZywgdHlwZSBtZXNzYWdlVHlwZTogVE1lc3NhZ2VUeXBlLCBzZXF1ZW5jZUlEOiBJbnQzMikgdGhyb3dzCisgIGZ1bmMgd3JpdGVNZXNzYWdlRW5kKCkgdGhyb3dzCisgIGZ1bmMgd3JpdGVTdHJ1Y3RCZWdpbihuYW1lOiBTdHJpbmcpIHRocm93cworICBmdW5jIHdyaXRlU3RydWN0RW5kKCkgdGhyb3dzCisgIGZ1bmMgd3JpdGVGaWVsZEJlZ2luKG5hbWU6IFN0cmluZywgdHlwZSBmaWVsZFR5cGU6IFRUeXBlLCBmaWVsZElEOiBJbnQzMikgdGhyb3dzCisgIGZ1bmMgd3JpdGVGaWVsZFN0b3AoKSB0aHJvd3MKKyAgZnVuYyB3cml0ZUZpZWxkRW5kKCkgdGhyb3dzCisgIGZ1bmMgd3JpdGVNYXBCZWdpbihrZXlUeXBlOiBUVHlwZSwgdmFsdWVUeXBlOiBUVHlwZSwgc2l6ZTogSW50MzIpIHRocm93cworICBmdW5jIHdyaXRlTWFwRW5kKCkgdGhyb3dzCisgIGZ1bmMgd3JpdGVTZXRCZWdpbihlbGVtZW50VHlwZTogVFR5cGUsIHNpemU6IEludDMyKSB0aHJvd3MKKyAgZnVuYyB3cml0ZVNldEVuZCgpIHRocm93cworICBmdW5jIHdyaXRlTGlzdEJlZ2luKGVsZW1lbnRUeXBlOiBUVHlwZSwgc2l6ZTogSW50MzIpIHRocm93cworICBmdW5jIHdyaXRlTGlzdEVuZCgpIHRocm93cworCisgIGZ1bmMgd3JpdGUoXyB2YWx1ZTogU3RyaW5nKSB0aHJvd3MKKyAgZnVuYyB3cml0ZShfIHZhbHVlOiBCb29sKSB0aHJvd3MKKyAgZnVuYyB3cml0ZShfIHZhbHVlOiBVSW50OCkgdGhyb3dzCisgIGZ1bmMgd3JpdGUoXyB2YWx1ZTogSW50MTYpIHRocm93cworICBmdW5jIHdyaXRlKF8gdmFsdWU6IEludDMyKSB0aHJvd3MKKyAgZnVuYyB3cml0ZShfIHZhbHVlOiBJbnQ2NCkgdGhyb3dzCisgIGZ1bmMgd3JpdGUoXyB2YWx1ZTogRG91YmxlKSB0aHJvd3MKKyAgZnVuYyB3cml0ZShfIHZhbHVlOiBEYXRhKSB0aHJvd3MKK30KKworcHVibGljIGV4dGVuc2lvbiBUUHJvdG9jb2wgeworICBwdWJsaWMgZnVuYyB3cml0ZUZpZWxkVmFsdWUoXyB2YWx1ZTogVFNlcmlhbGl6YWJsZSwgbmFtZTogU3RyaW5nLCB0eXBlOiBUVHlwZSwgaWQ6IEludDMyKSB0aHJvd3MgeworICAgIHRyeSB3cml0ZUZpZWxkQmVnaW4obmFtZTogbmFtZSwgdHlwZTogdHlwZSwgZmllbGRJRDogaWQpCisgICAgdHJ5IHZhbHVlLndyaXRlKHRvOiBzZWxmKQorICAgIHRyeSB3cml0ZUZpZWxkRW5kKCkKKyAgfQorCisgIHB1YmxpYyBmdW5jIHZhbGlkYXRlVmFsdWUoXyB2YWx1ZTogQW55PywgbmFtZWQgbmFtZTogU3RyaW5nKSB0aHJvd3MgeworICAgIGlmIHZhbHVlID09IG5pbCB7CisgICAgICB0aHJvdyBUUHJvdG9jb2xFcnJvcihlcnJvcjogLnVua25vd24sIG1lc3NhZ2U6ICJNaXNzaW5nIHJlcXVpcmVkIHZhbHVlIGZvciBmaWVsZDogXChuYW1lKSIpCisgICAgfQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkUmVzdWx0TWVzc2FnZUJlZ2luKCkgdGhyb3dzIHsKKyAgICBsZXQgKF8sIHR5cGUsIF8pID0gdHJ5IHJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgICBpZiB0eXBlID09IC5leGNlcHRpb24geworICAgICAgbGV0IHggPSB0cnkgcmVhZEV4Y2VwdGlvbigpCisgICAgICB0aHJvdyB4CisgICAgfQorICAgIHJldHVybgorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkRXhjZXB0aW9uKCkgdGhyb3dzIC0+IFRBcHBsaWNhdGlvbkVycm9yIHsKKyAgICByZXR1cm4gdHJ5IFRBcHBsaWNhdGlvbkVycm9yLnJlYWQoZnJvbTogc2VsZikKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVFeGNlcHRpb24obWVzc2FnZU5hbWUgbmFtZTogU3RyaW5nLCBzZXF1ZW5jZUlEOiBJbnQzMiwgZXg6IFRBcHBsaWNhdGlvbkVycm9yKSB0aHJvd3MgeworICAgIHRyeSB3cml0ZU1lc3NhZ2VCZWdpbihuYW1lOiBuYW1lLCB0eXBlOiAuZXhjZXB0aW9uLCBzZXF1ZW5jZUlEOiBzZXF1ZW5jZUlEKQorICAgIHRyeSBleC53cml0ZSh0bzogc2VsZikKKyAgICB0cnkgd3JpdGVNZXNzYWdlRW5kKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgc2tpcCh0eXBlOiBUVHlwZSkgdGhyb3dzIHsKKyAgICBzd2l0Y2ggdHlwZSB7CisgICAgY2FzZSAuYm9vbDogICBfID0gdHJ5IHJlYWQoKSBhcyBCb29sCisgICAgY2FzZSAuaTg6ICAgXyA9IHRyeSByZWFkKCkgYXMgVUludDgKKyAgICBjYXNlIC5pMTY6ICAgIF8gPSB0cnkgcmVhZCgpIGFzIEludDE2CisgICAgY2FzZSAuaTMyOiAgICBfID0gdHJ5IHJlYWQoKSBhcyBJbnQzMgorICAgIGNhc2UgLmk2NDogICAgXyA9IHRyeSByZWFkKCkgYXMgSW50NjQKKyAgICBjYXNlIC5kb3VibGU6IF8gPSB0cnkgcmVhZCgpIGFzIERvdWJsZQorICAgIGNhc2UgLnN0cmluZzogXyA9IHRyeSByZWFkKCkgYXMgU3RyaW5nCisgICAgICAKKyAgICBjYXNlIC5zdHJ1Y3Q6CisgICAgICBfID0gdHJ5IHJlYWRTdHJ1Y3RCZWdpbigpCisgICAgICB3aGlsZSB0cnVlIHsKKyAgICAgICAgbGV0IChfLCBmaWVsZFR5cGUsIF8pID0gdHJ5IHJlYWRGaWVsZEJlZ2luKCkKKyAgICAgICAgaWYgZmllbGRUeXBlID09IC5zdG9wIHsKKyAgICAgICAgICBicmVhaworICAgICAgICB9CisgICAgICAgIHRyeSBza2lwKHR5cGU6IGZpZWxkVHlwZSkKKyAgICAgICAgdHJ5IHJlYWRGaWVsZEVuZCgpCisgICAgICB9CisgICAgICB0cnkgcmVhZFN0cnVjdEVuZCgpCisgICAgICAKKyAgICAgIAorICAgIGNhc2UgLm1hcDoKKyAgICAgIGxldCAoa2V5VHlwZSwgdmFsdWVUeXBlLCBzaXplKSA9IHRyeSByZWFkTWFwQmVnaW4oKQorICAgICAgZm9yIF8gaW4gMC4uPHNpemUgeworICAgICAgICB0cnkgc2tpcCh0eXBlOiBrZXlUeXBlKQorICAgICAgICB0cnkgc2tpcCh0eXBlOiB2YWx1ZVR5cGUpCisgICAgICB9CisgICAgICB0cnkgcmVhZE1hcEVuZCgpCisgICAgICAKKyAgICAgIAorICAgIGNhc2UgLnNldDoKKyAgICAgIGxldCAoZWxlbVR5cGUsIHNpemUpID0gdHJ5IHJlYWRTZXRCZWdpbigpCisgICAgICBmb3IgXyBpbiAwLi48c2l6ZSB7CisgICAgICAgIHRyeSBza2lwKHR5cGU6IGVsZW1UeXBlKQorICAgICAgfQorICAgICAgdHJ5IHJlYWRTZXRFbmQoKQorICAgICAgCisgICAgY2FzZSAubGlzdDoKKyAgICAgIGxldCAoZWxlbVR5cGUsIHNpemUpID0gdHJ5IHJlYWRMaXN0QmVnaW4oKQorICAgICAgZm9yIF8gaW4gMC4uPHNpemUgeworICAgICAgICB0cnkgc2tpcCh0eXBlOiBlbGVtVHlwZSkKKyAgICAgIH0KKyAgICAgIHRyeSByZWFkTGlzdEVuZCgpCisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybgorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVFByb3RvY29sRXJyb3Iuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UUHJvdG9jb2xFcnJvci5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWQxNGY5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVFByb3RvY29sRXJyb3Iuc3dpZnQKQEAgLTAsMCArMSwxNDYgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworKiB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK2ltcG9ydCBGb3VuZGF0aW9uCisKK3B1YmxpYyBzdHJ1Y3QgVFByb3RvY29sRXJyb3IgOiBURXJyb3IgeworICBwdWJsaWMgaW5pdCgpIHsgfQorCisgIHB1YmxpYyBlbnVtIENvZGUgOiBURXJyb3JDb2RlIHsKKyAgICBjYXNlIHVua25vd24KKyAgICBjYXNlIGludmFsaWREYXRhCisgICAgY2FzZSBuZWdhdGl2ZVNpemUKKyAgICBjYXNlIHNpemVMaW1pdChsaW1pdDogSW50LCBnb3Q6IEludCkKKyAgICBjYXNlIGJhZFZlcnNpb24oZXhwZWN0ZWQ6IFN0cmluZywgZ290OiBTdHJpbmcpCisgICAgY2FzZSBub3RJbXBsZW1lbnRlZAorICAgIGNhc2UgZGVwdGhMaW1pdAorCisgICAgcHVibGljIHZhciB0aHJpZnRFcnJvckNvZGU6IEludCB7CisgICAgICBzd2l0Y2ggc2VsZiB7CisgICAgICBjYXNlIC51bmtub3duOiAgICAgICAgcmV0dXJuIDAKKyAgICAgIGNhc2UgLmludmFsaWREYXRhOiAgICByZXR1cm4gMQorICAgICAgY2FzZSAubmVnYXRpdmVTaXplOiAgIHJldHVybiAyCisgICAgICBjYXNlIC5zaXplTGltaXQ6ICAgICAgcmV0dXJuIDMKKyAgICAgIGNhc2UgLmJhZFZlcnNpb246ICAgICByZXR1cm4gNAorICAgICAgY2FzZSAubm90SW1wbGVtZW50ZWQ6IHJldHVybiA1CisgICAgICBjYXNlIC5kZXB0aExpbWl0OiAgICAgcmV0dXJuIDYKKyAgICAgIH0KKworICAgIH0KKyAgICBwdWJsaWMgdmFyIGRlc2NyaXB0aW9uOiBTdHJpbmcgeworICAgICAgc3dpdGNoIHNlbGYgeworICAgICAgY2FzZSAudW5rbm93bjogICAgICAgIHJldHVybiAiVW5rbm93biBUUHJvdG9jb2xFcnJvciIKKyAgICAgIGNhc2UgLmludmFsaWREYXRhOiAgICByZXR1cm4gIkludmFsaWQgRGF0YSIKKyAgICAgIGNhc2UgLm5lZ2F0aXZlU2l6ZTogICByZXR1cm4gIk5lZ2F0aXZlIFNpemUiCisgICAgICBjYXNlIC5zaXplTGltaXQobGV0IGxpbWl0LCBsZXQgZ290KToKKyAgICAgICAgcmV0dXJuICJNZXNzYWdlIGV4Y2VlZHMgc2l6ZSBsaW1pdCBvZiBcKGxpbWl0KSAocmVjZWl2ZWQ6IFwoZ290KSIKKyAgICAgIGNhc2UgLmJhZFZlcnNpb24obGV0IGV4cGVjdGVkLCBsZXQgZ290KToKKyAgICAgICAgcmV0dXJuICJCYWQgVmVyc2lvbi4gKEV4cGVjdGVkOiBcKGV4cGVjdGVkKSwgR290OiBcKGdvdCkiCisgICAgICBjYXNlIC5ub3RJbXBsZW1lbnRlZDogcmV0dXJuICJOb3QgSW1wbGVtZW50ZWQiCisgICAgICBjYXNlIC5kZXB0aExpbWl0OiAgICAgcmV0dXJuICJEZXB0aCBMaW1pdCIKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwdWJsaWMgZW51bSBFeHRlbmRlZEVycm9yQ29kZSA6IFRFcnJvckNvZGUgeworICAgIGNhc2UgdW5rbm93bgorICAgIGNhc2UgbWlzc2luZ1JlcXVpcmVkRmllbGQoZmllbGROYW1lOiBTdHJpbmcpCisgICAgY2FzZSB1bmV4cGVjdGVkVHlwZSh0eXBlOiBUVHlwZSkKKyAgICBjYXNlIG1pc21hdGNoZWRQcm90b2NvbChleHBlY3RlZDogU3RyaW5nLCBnb3Q6IFN0cmluZykKKyAgICBwdWJsaWMgdmFyIHRocmlmdEVycm9yQ29kZTogSW50IHsKKyAgICAgIHN3aXRjaCBzZWxmIHsKKyAgICAgIGNhc2UgLnVua25vd246ICAgICAgICAgICAgICByZXR1cm4gMTAwMAorICAgICAgY2FzZSAubWlzc2luZ1JlcXVpcmVkRmllbGQ6IHJldHVybiAxMDAxCisgICAgICBjYXNlIC51bmV4cGVjdGVkVHlwZTogICAgICAgcmV0dXJuIDEwMDIKKyAgICAgIGNhc2UgLm1pc21hdGNoZWRQcm90b2NvbDogICByZXR1cm4gMTAwMworICAgICAgfQorICAgIH0KKyAgICBwdWJsaWMgdmFyIGRlc2NyaXB0aW9uOiBTdHJpbmcgeworICAgICAgc3dpdGNoIHNlbGYgeworICAgICAgY2FzZSAudW5rbm93bjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlVua25vd24gVFByb3RvY29sRXh0ZW5kZWRFcnJvciIKKyAgICAgIGNhc2UgLm1pc3NpbmdSZXF1aXJlZEZpZWxkKGxldCBmaWVsZE5hbWUpOiAgICAgICAgcmV0dXJuICJNaXNzaW5nIFJlcXVpcmVkIEZpZWxkOiBcKGZpZWxkTmFtZSkiCisgICAgICBjYXNlIC51bmV4cGVjdGVkVHlwZShsZXQgdHlwZSk6ICAgICAgICAgICAgICAgICAgIHJldHVybiAiVW5leHBlY3RlZCBUeXBlIFwodHlwZS5zZWxmKSIKKyAgICAgIGNhc2UgLm1pc21hdGNoZWRQcm90b2NvbChsZXQgZXhwZWN0ZWQsIGxldCBnb3QpOiAgcmV0dXJuICJNaXNtYXRjaGVkIFByb3RvY29sLiAgKEV4cGVjdGVkOiBcKGV4cGVjdGVkKSwgZ290IFwoZ290KSkiCisgICAgICB9CisgICAgfQorICB9CisKKyAgcHVibGljIHZhciBleHRlbmRlZEVycm9yOiBFeHRlbmRlZEVycm9yQ29kZT8gPSBuaWwKKworICBwdWJsaWMgaW5pdChlcnJvcjogQ29kZSA9IC51bmtub3duLAorICAgICAgICAgICAgICBtZXNzYWdlOiBTdHJpbmc/ID0gbmlsLAorICAgICAgICAgICAgICBleHRlbmRlZEVycm9yOiBFeHRlbmRlZEVycm9yQ29kZT8gPSBuaWwpIHsKKyAgICBzZWxmLmVycm9yID0gZXJyb3IKKyAgICBzZWxmLm1lc3NhZ2UgPSBtZXNzYWdlCisgICAgc2VsZi5leHRlbmRlZEVycm9yID0gZXh0ZW5kZWRFcnJvcgorICB9CisKKyAgLy8vIE1hcms6IFRFcnJvcgorICBwdWJsaWMgdmFyIGVycm9yOiBDb2RlID0gLnVua25vd24KKyAgcHVibGljIHZhciBtZXNzYWdlOiBTdHJpbmc/ID0gbmlsCisgIHB1YmxpYyBzdGF0aWMgdmFyIGRlZmF1bHRDYXNlOiBDb2RlIHsgcmV0dXJuIC51bmtub3duIH0KKworICBwdWJsaWMgdmFyIGRlc2NyaXB0aW9uOiBTdHJpbmcgeworICAgIHZhciBvdXQgPSAiXChUUHJvdG9jb2xFcnJvci5zZWxmKTogIChcKGVycm9yLnRocmlmdEVycm9yQ29kZSkgXChlcnJvci5kZXNjcmlwdGlvbilcbiIKKyAgICBpZiBsZXQgZXh0ZW5kZWRFcnJvciA9IGV4dGVuZGVkRXJyb3IgeworICAgICAgb3V0ICs9ICJUUHJvdG9jb2xFeHRlbmRlZEVycm9yIChcKGV4dGVuZGVkRXJyb3IudGhyaWZ0RXJyb3JDb2RlKSk6IFwoZXh0ZW5kZWRFcnJvci5kZXNjcmlwdGlvbikiCisgICAgfQorICAgIGlmIGxldCBtZXNzYWdlID0gbWVzc2FnZSB7CisgICAgICBvdXQgKz0gIk1lc3NhZ2U6IFwobWVzc2FnZSkiCisgICAgfQorICAgIHJldHVybiBvdXQKKyAgfQorfQorCisKKy8vLyBXcmFwcGVyIGZvciBUcmFuc3BvcnQgZXJyb3JzIGluIFByb3RvY29scy4gIEluc3BpcmVkIGJ5IFRocmlmdC1Db2NvYSBQUk9UT0NPTF9UUkFOU1BPUlRfRVJST1IKKy8vLyBtYWNyby4gIE1vZGlmaWVkIHRvIGJlIG1vcmUgU3dpZnQteS4gIENhdGNoZXMgYW55IFRFcnJvciB0aHJvd24gd2l0aGluIHRoZSBibG9jayBhbmQKKy8vLyByZXRocm93cyBhIGdpdmVuIFRQcm90b2NvbEVycm9yLCB0aGUgb3JpZ2luYWwgZXJyb3IncyBkZXNjcmlwdGlvbiBpcyBhcHBlbmRlZCB0byB0aGUgbmV3CisvLy8gVFByb3RvY29sRXJyb3IncyBtZXNzYWdlLiAgc291cmNlRmlsZSwgc291cmNlTGluZSwgc291cmNlTWV0aG9kIGFyZSBhdXRvLXBvcHVsYXRlZCBhbmQgc2hvdWxkCisvLy8gYmUgaWdub3JlZCB3aGVuIGNhbGxpbmcuCisvLy8KKy8vLyAtIHBhcmFtZXRlciBlcnJvcjogICAgICAgIFRQcm90b2NvbEVycm9yIHRvIHRocm93IGlmIHRoZSBibG9jayB0aHJvd3MKKy8vLyAtIHBhcmFtZXRlciBzb3VyY2VGaWxlOiAgIHRocm93aW5nIGZpbGUsIGF1dG9wb3B1bGF0ZWQKKy8vLyAtIHBhcmFtZXRlciBzb3VyY2VMaW5lOiAgIHRocm93aW5nIGxpbmUsIGF1dG9wb3B1bGF0ZWQKKy8vLyAtIHBhcmFtZXRlciBzb3VyY2VNZXRob2Q6IHRocm93aW5nIG1ldGhvZCwgYXV0b3BvcHVsYXRlZAorLy8vIC0gcGFyYW1ldGVyIGJsb2NrOiAgICAgICAgdGhyb3dpbmcgYmxvY2sKKy8vLworLy8vIC0gdGhyb3dzOiBUUHJvdG9jb2xFcnJvciAgRGVmYXVsdCBpcyBUUHJvdG9jb2xFcnJvci5FcnJvckNvZGUudW5rbm93bi4gIFVuZGVybHlpbmcKKy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yJ3MgZGVzY3JpcHRpb24gYXBwZW5kZWQgdG8gVFByb3RvY29sRXJyb3IubWVzc2FnZQorZnVuYyBQcm90b2NvbFRyYW5zcG9ydFRyeShlcnJvcjogVFByb3RvY29sRXJyb3IgPSBUUHJvdG9jb2xFcnJvcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VGaWxlOiBTdHJpbmcgPSAjZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlTGluZTogSW50ID0gI2xpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZU1ldGhvZDogU3RyaW5nID0gI2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jazogKCkgdGhyb3dzIC0+ICgpKSB0aHJvd3MgeworICAvLyBOZWVkIG11dGFibGUgY29weQorICB2YXIgZXJyb3IgPSBlcnJvcgorICBkbyB7CisgICAgdHJ5IGJsb2NrKCkKKyAgfSBjYXRjaCBsZXQgZXJyIGFzIFRFcnJvciB7CisgICAgdmFyIG1lc3NhZ2UgPSBlcnJvci5tZXNzYWdlID8/ICIiCisgICAgbWVzc2FnZSArPSAiXG5GaWxlOiBcKHNvdXJjZUZpbGUpXG4iCisgICAgbWVzc2FnZSArPSAiTGluZTogXChzb3VyY2VMaW5lKVxuIgorICAgIG1lc3NhZ2UgKz0gIk1ldGhvZDogXChzb3VyY2VNZXRob2QpIgorICAgIG1lc3NhZ2UgKz0gIlxuT3JpZ2luYWwgRXJyb3I6XG4iICsgZXJyLmRlc2NyaXB0aW9uCisgICAgZXJyb3IubWVzc2FnZSA9IG1lc3NhZ2UKKyAgICB0aHJvdyBlcnJvcgorICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVFNTTFNvY2tldFRyYW5zcG9ydC5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RTU0xTb2NrZXRUcmFuc3BvcnQuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJiNTkwMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RTU0xTb2NrZXRUcmFuc3BvcnQuc3dpZnQKQEAgLTAsMCArMSwyMjkgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworKiB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK2ltcG9ydCBGb3VuZGF0aW9uCitpbXBvcnQgQ29yZUZvdW5kYXRpb24KKworI2lmIG9zKExpbnV4KQorcHVibGljIGNsYXNzIFRTU0xTb2NrZXRUcmFuc3BvcnQgeworICBpbml0KGhvc3RuYW1lOiBTdHJpbmcsIHBvcnQ6IFVJbnQxNikgeworICAgIC8vIEZJWE1FIQorICAgIGFzc2VydChmYWxzZSwgIlNlY3VyaXR5IG5vdCBhdmFpbGFibGUgaW4gTGludXgsIFRTU0xTb2NrZXRUcmFuc3BvcnQgVW5hdmlsYWJsZSBmb3Igbm93IikKKyAgfQorfQorI2Vsc2UKK2xldCBpc0xpdHRsZUVuZGlhbiA9IEludChPU0hvc3RCeXRlT3JkZXIoKSkgPT0gT1NMaXR0bGVFbmRpYW4KK2xldCBodG9ucyAgPSBpc0xpdHRsZUVuZGlhbiA/IF9PU1N3YXBJbnQxNiA6IHsgJDAgfQorbGV0IGh0b25sICA9IGlzTGl0dGxlRW5kaWFuID8gX09TU3dhcEludDMyIDogeyAkMCB9CisKK3B1YmxpYyBjbGFzcyBUU1NMU29ja2V0VHJhbnNwb3J0OiBUU3RyZWFtVHJhbnNwb3J0IHsKKyAgdmFyIHNzbEhvc3RuYW1lOiBTdHJpbmcKKyAgdmFyIHNkOiBJbnQzMiA9IDAKKyAgCisgIHB1YmxpYyBpbml0KGhvc3RuYW1lOiBTdHJpbmcsIHBvcnQ6IFVJbnQxNikgdGhyb3dzIHsKKyAgICBzc2xIb3N0bmFtZSA9IGhvc3RuYW1lCisgICAgdmFyIHJlYWRTdHJlYW06IFVubWFuYWdlZDxDRlJlYWRTdHJlYW0+PworICAgIHZhciB3cml0ZVN0cmVhbTogVW5tYW5hZ2VkPENGV3JpdGVTdHJlYW0+PworICAgIAorICAgIC8qIGNyZWF0ZSBhIHNvY2tldCBzdHJ1Y3R1cmUgKi8KKyAgICB2YXIgcGluOiBzb2NrYWRkcl9pbiA9IHNvY2thZGRyX2luKCkKKyAgICB2YXIgaHA6IFVuc2FmZU11dGFibGVQb2ludGVyPGhvc3RlbnQ+PyA9IG5pbAorICAgIGZvciBpIGluIDAuLjwxMCB7CisgICAgICAKKyAgICAgIGhwID0gZ2V0aG9zdGJ5bmFtZShob3N0bmFtZS5jU3RyaW5nKHVzaW5nOiBTdHJpbmcuRW5jb2RpbmcudXRmOCkhKQorICAgICAgaWYgaHAgPT0gbmlsIHsKKyAgICAgICAgcHJpbnQoImZhaWxlZCB0byByZXNvbHZlIGhvc3RuYW1lIFwoaG9zdG5hbWUpIikKKyAgICAgICAgaGVycm9yKCJyZXNvbHYiKQorICAgICAgICBpZiBpID09IDkgeworICAgICAgICAgIHN1cGVyLmluaXQoaW5wdXRTdHJlYW06IG5pbCwgb3V0cHV0U3RyZWFtOiBuaWwpIC8vIGhhdmUgdG8gaW5pdCBiZWZvcmUgdGhyb3dpbmcKKyAgICAgICAgICB0aHJvdyBUU1NMU29ja2V0VHJhbnNwb3J0RXJyb3IoZXJyb3I6IC5ob3N0YW5hbWVSZXNvbHV0aW9uKGhvc3RuYW1lOiBob3N0bmFtZSkpCisgICAgICAgIH0KKyAgICAgICAgVGhyZWFkLnNsZWVwKGZvclRpbWVJbnRlcnZhbDogMC4yKQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgYnJlYWsKKyAgICAgIH0KKyAgICB9CisgICAgcGluLnNpbl9mYW1pbHkgID0gVUludDgoQUZfSU5FVCkKKyAgICBwaW4uc2luX2FkZHIgICAgPSBpbl9hZGRyKHNfYWRkcjogVUludDMyKChocD8ucG9pbnRlZS5oX2FkZHJfbGlzdC5wb2ludGVlPy5wb2ludGVlKSEpKSAvLyBJcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gZ2V0IHRoaXM/Pz8KKyAgICBwaW4uc2luX3BvcnQgICAgPSBodG9ucyhwb3J0KQorICAgIAorICAgIC8qIGNyZWF0ZSB0aGUgc29ja2V0ICovCisgICAgc2QgPSBzb2NrZXQoSW50MzIoQUZfSU5FVCksIEludDMyKFNPQ0tfU1RSRUFNKSwgSW50MzIoSVBQUk9UT19UQ1ApKQorICAgIGlmIHNkID09IC0xIHsKKyAgICAgIHN1cGVyLmluaXQoaW5wdXRTdHJlYW06IG5pbCwgb3V0cHV0U3RyZWFtOiBuaWwpIC8vIGhhdmUgdG8gaW5pdCBiZWZvcmUgdGhyb3dpbmcKKyAgICAgIHRocm93IFRTU0xTb2NrZXRUcmFuc3BvcnRFcnJvcihlcnJvcjogLnNvY2tldENyZWF0ZShwb3J0OiBJbnQocG9ydCkpKQorICAgIH0KKyAgICAKKyAgICAvKiBvcGVuIGEgY29ubmVjdGlvbiAqLworICAgIC8vIG5lZWQgYSBub24tc2VsZiByZWYgdG8gc2QsIG90aGVyd2lzZSB0aGUgaiBjb21wbGFpbnMKKyAgICBsZXQgc2RfbG9jYWwgPSBzZAorICAgIGxldCBjb25uZWN0UmVzdWx0ID0gd2l0aFVuc2FmZVBvaW50ZXIodG86ICZwaW4pIHsKKyAgICAgIGNvbm5lY3Qoc2RfbG9jYWwsIFVuc2FmZVBvaW50ZXI8c29ja2FkZHI+KE9wYXF1ZVBvaW50ZXIoJDApKSwgc29ja2xlbl90KE1lbW9yeUxheW91dDxzb2NrYWRkcl9pbj4uc2l6ZSkpCisgICAgfQorICAgIGlmIGNvbm5lY3RSZXN1bHQgPT0gLTEgeworICAgICAgc3VwZXIuaW5pdChpbnB1dFN0cmVhbTogbmlsLCBvdXRwdXRTdHJlYW06IG5pbCkgLy8gaGF2ZSB0byBpbml0IGJlZm9yZSB0aHJvd2luZworICAgICAgdGhyb3cgVFNTTFNvY2tldFRyYW5zcG9ydEVycm9yKGVycm9yOiAuY29ubmVjdCkKKyAgICB9CisgICAgCisgICAgQ0ZTdHJlYW1DcmVhdGVQYWlyV2l0aFNvY2tldChrQ0ZBbGxvY2F0b3JEZWZhdWx0LCBzZCwgJnJlYWRTdHJlYW0sICZ3cml0ZVN0cmVhbSkKKyAgICAKKyAgICBDRlJlYWRTdHJlYW1TZXRQcm9wZXJ0eShyZWFkU3RyZWFtPy50YWtlUmV0YWluZWRWYWx1ZSgpLCAuc29ja2V0TmF0aXZlSGFuZGxlLCBrQ0ZCb29sZWFuVHJ1ZSkKKyAgICBDRldyaXRlU3RyZWFtU2V0UHJvcGVydHkod3JpdGVTdHJlYW0/LnRha2VSZXRhaW5lZFZhbHVlKCksIC5zb2NrZXROYXRpdmVIYW5kbGUsIGtDRkJvb2xlYW5UcnVlKQorICAgIAorICAgIHZhciBpbnB1dFN0cmVhbTogSW5wdXRTdHJlYW0/ID0gbmlsCisgICAgdmFyIG91dHB1dFN0cmVhbTogT3V0cHV0U3RyZWFtPyA9IG5pbAorICAgIGlmIHJlYWRTdHJlYW0gIT0gbmlsICYmIHdyaXRlU3RyZWFtICE9IG5pbCB7CisgICAgICAKKyAgICAgIENGUmVhZFN0cmVhbVNldFByb3BlcnR5KHJlYWRTdHJlYW0/LnRha2VSZXRhaW5lZFZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc29ja2V0U2VjdXJpdHlMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDRlN0cmVhbVNvY2tldFNlY3VyaXR5TGV2ZWxUTFN2MSkKKyAgICAgIAorICAgICAgbGV0IHNldHRpbmdzOiBbU3RyaW5nOiBCb29sXSA9IFtrQ0ZTdHJlYW1TU0xWYWxpZGF0ZXNDZXJ0aWZpY2F0ZUNoYWluIGFzIFN0cmluZzogdHJ1ZV0KKyAgICAgIAorICAgICAgQ0ZSZWFkU3RyZWFtU2V0UHJvcGVydHkocmVhZFN0cmVhbT8udGFrZVJldGFpbmVkVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TU0xTZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzIGFzIENGVHlwZVJlZiEpCisgICAgICAKKyAgICAgIENGV3JpdGVTdHJlYW1TZXRQcm9wZXJ0eSh3cml0ZVN0cmVhbT8udGFrZVJldGFpbmVkVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TU0xTZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzIGFzIENGVHlwZVJlZiEpCisgICAgICAKKyAgICAgIGlucHV0U3RyZWFtID0gcmVhZFN0cmVhbSEudGFrZVJldGFpbmVkVmFsdWUoKQorICAgICAgaW5wdXRTdHJlYW0/LnNjaGVkdWxlKGluOiAuY3VycmVudCwgZm9yTW9kZTogLmRlZmF1bHRSdW5Mb29wTW9kZSkKKyAgICAgIGlucHV0U3RyZWFtPy5vcGVuKCkKKyAgICAgIAorICAgICAgb3V0cHV0U3RyZWFtID0gd3JpdGVTdHJlYW0hLnRha2VSZXRhaW5lZFZhbHVlKCkKKyAgICAgIG91dHB1dFN0cmVhbT8uc2NoZWR1bGUoaW46IC5jdXJyZW50LCBmb3JNb2RlOiAuZGVmYXVsdFJ1bkxvb3BNb2RlKQorICAgICAgb3V0cHV0U3RyZWFtPy5vcGVuKCkKKyAgICAgIAorICAgICAgcmVhZFN0cmVhbT8ucmVsZWFzZSgpCisgICAgICB3cml0ZVN0cmVhbT8ucmVsZWFzZSgpCisgICAgfQorICAgIAorICAgIAorICAgIHN1cGVyLmluaXQoaW5wdXRTdHJlYW06IGlucHV0U3RyZWFtLCBvdXRwdXRTdHJlYW06IG91dHB1dFN0cmVhbSkKKyAgICBzZWxmLmlucHV0Py5kZWxlZ2F0ZSA9IHNlbGYKKyAgICBzZWxmLm91dHB1dD8uZGVsZWdhdGUgPSBzZWxmCisgIH0KKyAgCisgIGZ1bmMgcmVjb3ZlckZyb21UcnVzdEZhaWx1cmUoXyBteVRydXN0OiBTZWNUcnVzdCwgbGFzdFRydXN0UmVzdWx0OiBTZWNUcnVzdFJlc3VsdFR5cGUpIC0+IEJvb2wgeworICAgIGxldCB0cnVzdFRpbWUgPSBTZWNUcnVzdEdldFZlcmlmeVRpbWUobXlUcnVzdCkKKyAgICBsZXQgY3VycmVudFRpbWUgPSBDRkFic29sdXRlVGltZUdldEN1cnJlbnQoKQorICAgIAorICAgIGxldCB0aW1lSW5jcmVtZW50ID0gMzE1MzYwMDAgLy8gZnJvbSBUU1NMU29ja2V0VHJhbnNwb3J0Lm0KKyAgICBsZXQgbmV3VGltZSA9IGN1cnJlbnRUaW1lIC0gRG91YmxlKHRpbWVJbmNyZW1lbnQpCisgICAgCisgICAgaWYgdHJ1c3RUaW1lIC0gbmV3VGltZSAhPSAwIHsKKyAgICAgIGxldCBuZXdEYXRlID0gQ0ZEYXRlQ3JlYXRlKG5pbCwgbmV3VGltZSkKKyAgICAgIFNlY1RydXN0U2V0VmVyaWZ5RGF0ZShteVRydXN0LCBuZXdEYXRlISkKKyAgICAgIAorICAgICAgdmFyIHRyID0gbGFzdFRydXN0UmVzdWx0CisgICAgICBsZXQgc3VjY2VzcyA9IHdpdGhVbnNhZmVNdXRhYmxlUG9pbnRlcih0bzogJnRyKSB7IHRyUHRyIC0+IEJvb2wgaW4KKyAgICAgICAgaWYgU2VjVHJ1c3RFdmFsdWF0ZShteVRydXN0LCB0clB0cikgIT0gZXJyU2VjU3VjY2VzcyB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWUKKyAgICAgIH0KKyAgICAgIGlmICFzdWNjZXNzIHsgcmV0dXJuIGZhbHNlIH0KKyAgICB9CisgICAgaWYgbGFzdFRydXN0UmVzdWx0ID09IC5wcm9jZWVkIHx8IGxhc3RUcnVzdFJlc3VsdCA9PSAudW5zcGVjaWZpZWQgeworICAgICAgICByZXR1cm4gZmFsc2UKKyAgICB9CisKKyAgICBwcmludCgiVFNTTFNvY2tldFRyYW5zcG9ydDogVW5hYmxlIHRvIHJlY292ZXIgY2VydGlmaWNhdGUgdHJ1c3QgZmFpbHVyZSIpCisgICAgcmV0dXJuIHRydWUKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgaXNPcGVuKCkgLT4gQm9vbCB7CisgICAgcmV0dXJuIHNkID4gMAorICB9Cit9CisKK2V4dGVuc2lvbiBUU1NMU29ja2V0VHJhbnNwb3J0OiBTdHJlYW1EZWxlZ2F0ZSB7CisgIHB1YmxpYyBmdW5jIHN0cmVhbShfIGFTdHJlYW06IFN0cmVhbSwgaGFuZGxlIGV2ZW50Q29kZTogU3RyZWFtLkV2ZW50KSB7CisgICAgCisgICAgc3dpdGNoIGV2ZW50Q29kZSB7CisgICAgY2FzZSBTdHJlYW0uRXZlbnQoKTogYnJlYWsKKyAgICBjYXNlIFN0cmVhbS5FdmVudC5oYXNCeXRlc0F2YWlsYWJsZTogYnJlYWsKKyAgICBjYXNlIFN0cmVhbS5FdmVudC5vcGVuQ29tcGxldGVkOiBicmVhaworICAgIGNhc2UgU3RyZWFtLkV2ZW50Lmhhc1NwYWNlQXZhaWxhYmxlOgorICAgICAgdmFyIHByb2NlZWQgPSBmYWxzZQorICAgICAgdmFyIHRydXN0UmVzdWx0OiBTZWNUcnVzdFJlc3VsdFR5cGUgPSAuaW52YWxpZAorCisgICAgICB2YXIgbmV3UG9saWNpZXM6IENGTXV0YWJsZUFycmF5PworICAgICAgCisgICAgICByZXBlYXQgeworICAgICAgICBsZXQgdHJ1c3Q6IFNlY1RydXN0ID0gYVN0cmVhbS5wcm9wZXJ0eShmb3JLZXk6IC5TU0xQZWVyVHJ1c3QpIGFzISBTZWNUcnVzdAorICAgICAgICAKKyAgICAgICAgLy8gQWRkIG5ldyBwb2xpY3kgdG8gY3VycmVudCBsaXN0IG9mIHBvbGljaWVzCisgICAgICAgIGxldCBwb2xpY3kgPSBTZWNQb2xpY3lDcmVhdGVTU0woZmFsc2UsIHNzbEhvc3RuYW1lIGFzIENGU3RyaW5nPykKKyAgICAgICAgdmFyIHBwb2xpY3kgPSBwb2xpY3kgLy8gbXV0YWJsZSBmb3IgcG9pbnRlcgorICAgICAgICBsZXQgcG9saWNpZXM6IFVuc2FmZU11dGFibGVQb2ludGVyPENGQXJyYXk/Pj8gPSBuaWwKKyAgICAgICAgaWYgU2VjVHJ1c3RDb3B5UG9saWNpZXModHJ1c3QsIHBvbGljaWVzISkgIT0gZXJyU2VjU3VjY2VzcyB7CisgICAgICAgICAgYnJlYWsKKyAgICAgICAgfQorICAgICAgICB3aXRoVW5zYWZlTXV0YWJsZVBvaW50ZXIodG86ICZwcG9saWN5KSB7IHB0ciBpbgorICAgICAgICAgIG5ld1BvbGljaWVzID0gQ0ZBcnJheUNyZWF0ZU11dGFibGVDb3B5KG5pbCwgMCwgcG9saWNpZXM/LnBvaW50ZWUpCisgICAgICAgICAgQ0ZBcnJheUFwcGVuZFZhbHVlKG5ld1BvbGljaWVzLCBwdHIpCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIHVwZGF0ZSB0cnVzdCBwb2xpY2llcworICAgICAgICBpZiBTZWNUcnVzdFNldFBvbGljaWVzKHRydXN0LCBuZXdQb2xpY2llcyEpICE9IGVyclNlY1N1Y2Nlc3MgeworICAgICAgICAgIGJyZWFrCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIEV2YWx1YXRlIHRoZSB0cnVzdCBjaGFpbgorICAgICAgICBsZXQgc3VjY2VzcyA9IHdpdGhVbnNhZmVNdXRhYmxlUG9pbnRlcih0bzogJnRydXN0UmVzdWx0KSB7IHRydXN0UHRyIC0+IEJvb2wgaW4KKyAgICAgICAgICBpZiBTZWNUcnVzdEV2YWx1YXRlKHRydXN0LCB0cnVzdFB0cikgIT0gZXJyU2VjU3VjY2VzcyB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2UKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIHRydWUKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgIXN1Y2Nlc3MgeworICAgICAgICAgIGJyZWFrCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBzd2l0Y2ggdHJ1c3RSZXN1bHQgeworICAgICAgICBjYXNlIC5wcm9jZWVkOiAgICAgIHByb2NlZWQgPSB0cnVlCisgICAgICAgIGNhc2UgLnVuc3BlY2lmaWVkOiAgcHJvY2VlZCA9IHRydWUKKyAgICAgICAgY2FzZSAucmVjb3ZlcmFibGVUcnVzdEZhaWx1cmU6CisgICAgICAgICAgcHJvY2VlZCA9IHNlbGYucmVjb3ZlckZyb21UcnVzdEZhaWx1cmUodHJ1c3QsIGxhc3RUcnVzdFJlc3VsdDogdHJ1c3RSZXN1bHQpCisgICAgICAgICAgCisgICAgICAgIGNhc2UgLmRlbnk6ICAgICAgICAgYnJlYWsKKyAgICAgICAgY2FzZSAuZmF0YWxUcnVzdEZhaWx1cmU6IGJyZWFrCisgICAgICAgIGNhc2UgLm90aGVyRXJyb3I6ICAgYnJlYWsKKyAgICAgICAgY2FzZSAuaW52YWxpZDogICAgICBicmVhaworICAgICAgICBkZWZhdWx0OiBicmVhaworICAgICAgICB9CisgICAgICB9IHdoaWxlIGZhbHNlCisgIAorICAgICAgaWYgIXByb2NlZWQgeworICAgICAgICBwcmludCgiVFNTTFNvY2tldFRyYW5zcG9ydDogQ2Fubm90IHRydXN0IGNlcnRpZmljYXRlLiAgUmVzdWx0OiBcKHRydXN0UmVzdWx0KSIpCisgICAgICAgIGFTdHJlYW0uY2xvc2UoKQorICAgICAgfQorICAgICAgCisgICAgY2FzZSBTdHJlYW0uRXZlbnQuZXJyb3JPY2N1cnJlZDogYnJlYWsKKyAgICBjYXNlIFN0cmVhbS5FdmVudC5lbmRFbmNvdW50ZXJlZDogYnJlYWsKKyAgICBkZWZhdWx0OiBicmVhaworICAgIH0KKyAgfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UU1NMU29ja2V0VHJhbnNwb3J0RXJyb3Iuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UU1NMU29ja2V0VHJhbnNwb3J0RXJyb3Iuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRhMTYyYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RTU0xTb2NrZXRUcmFuc3BvcnRFcnJvci5zd2lmdApAQCAtMCwwICsxLDQ4IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyogdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitwdWJsaWMgc3RydWN0IFRTU0xTb2NrZXRUcmFuc3BvcnRFcnJvcjogVEVycm9yIHsKKyAgcHVibGljIGVudW0gRXJyb3JDb2RlOiBURXJyb3JDb2RlIHsKKyAgICBjYXNlIGhvc3RhbmFtZVJlc29sdXRpb24oaG9zdG5hbWU6IFN0cmluZykKKyAgICBjYXNlIHNvY2tldENyZWF0ZShwb3J0OiBJbnQpCisgICAgY2FzZSBjb25uZWN0CisgIAorICAgIHB1YmxpYyB2YXIgdGhyaWZ0RXJyb3JDb2RlOiBJbnQgeworICAgICAgc3dpdGNoIHNlbGYgeworICAgICAgY2FzZSAuaG9zdGFuYW1lUmVzb2x1dGlvbjogIHJldHVybiAtMTAwMDAKKyAgICAgIGNhc2UgLnNvY2tldENyZWF0ZTogICAgICAgICByZXR1cm4gLTEwMDAxCisgICAgICBjYXNlIC5jb25uZWN0OiAgICAgICAgICAgICAgcmV0dXJuIC0xMDAwMgorICAgICAgfQorICAgIH0KKyAgCisgICAgcHVibGljIHZhciBkZXNjcmlwdGlvbjogU3RyaW5nIHsKKyAgICAgIHN3aXRjaCBzZWxmIHsKKyAgICAgIGNhc2UgLmhvc3RhbmFtZVJlc29sdXRpb24obGV0IGhvc3RuYW1lKTogIHJldHVybiAiRmFpbGVkIHRvIHJlc29sdmUgaG9zdG5hbWU6IFwoaG9zdG5hbWUpIgorICAgICAgY2FzZSAuc29ja2V0Q3JlYXRlKGxldCBwb3J0KTogICAgICAgICAgICAgcmV0dXJuICJDb3VsZCBub3QgY3JlYXRlIHNvY2tldCBvbiBwb3J0OiBcKHBvcnQpIgorICAgICAgY2FzZSAuY29ubmVjdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJDb25uZWN0IGVycm9yIgorICAgICAgfQorICAgIH0KKyAgCisgIH0KKyAgcHVibGljIHZhciBlcnJvcjogRXJyb3JDb2RlID0gLmNvbm5lY3QKKyAgcHVibGljIHZhciBtZXNzYWdlOiBTdHJpbmc/CisgIHB1YmxpYyBzdGF0aWMgdmFyIGRlZmF1bHRDYXNlOiBFcnJvckNvZGUgeyByZXR1cm4gLmNvbm5lY3QgfQorICAKKyAgcHVibGljIGluaXQoKSB7IH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RTZXJpYWxpemFibGUuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UU2VyaWFsaXphYmxlLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NTA5NmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UU2VyaWFsaXphYmxlLnN3aWZ0CkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBGb3VuZGF0aW9uCisKKworcHVibGljIHByb3RvY29sIFRTZXJpYWxpemFibGUgeworICB2YXIgaGFzaFZhbHVlOiBJbnQgeyBnZXQgfQorCisgIC8vLyBUVHlwZSBmb3IgaW5zdGFuY2UKKyAgc3RhdGljIHZhciB0aHJpZnRUeXBlOiBUVHlwZSB7IGdldCB9CisKKyAgLy8vIFJlYWQgVFNlcmlhbGl6YWJsZSBpbnN0YW5jZSBmcm9tIFByb3RvY29sCisgIHN0YXRpYyBmdW5jIHJlYWQoZnJvbSBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gU2VsZgorCisgIC8vLyBXcml0ZSBUU2VyaWFsaXphYmxlIGluc3RhbmNlIHRvIFByb3RvY29sCisgIGZ1bmMgd3JpdGUodG8gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzCisKK30KKworZXh0ZW5zaW9uIFRTZXJpYWxpemFibGUgeworICBwdWJsaWMgc3RhdGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogU2VsZiwgdG8gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgdmFsdWUud3JpdGUodG86IHByb3RvKQorICB9CisKKyAgLy8vIGNvbnZlbmllbmNlIGZvciBtZW1iZXIgYWNjZXNzCisgIHB1YmxpYyB2YXIgdGhyaWZ0VHlwZTogVFR5cGUgeyByZXR1cm4gU2VsZi50aHJpZnRUeXBlIH0KK30KKworcHVibGljIGZ1bmMgPT08VD4obGhzOiBULCByaHM6IFQpIC0+IEJvb2wgd2hlcmUgVCA6IFRTZXJpYWxpemFibGUgeworICByZXR1cm4gbGhzLmhhc2hWYWx1ZSA9PSByaHMuaGFzaFZhbHVlCit9CisKKy8vLyBEZWZhdWx0IHJlYWQvd3JpdGUgZm9yIHByaW1pdGF2ZSBUaHJpZnQgdHlwZXM6CisvLy8gQm9vbCwgSW50OCAoYnl0ZSksIEludDE2LCBJbnQzMiwgSW50NjQsIERvdWJsZSwgU3RyaW5nCisKK2V4dGVuc2lvbiBCb29sIDogVFNlcmlhbGl6YWJsZSB7CisgIHB1YmxpYyBzdGF0aWMgdmFyIHRocmlmdFR5cGU6IFRUeXBlIHsgcmV0dXJuIC5ib29sIH0KKworICBwdWJsaWMgc3RhdGljIGZ1bmMgcmVhZChmcm9tIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiBCb29sIHsKKyAgICByZXR1cm4gdHJ5IHByb3RvLnJlYWQoKQorICB9CisKKyAgcHVibGljIGZ1bmMgd3JpdGUodG8gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGUoc2VsZikKKyAgfQorfQorCitleHRlbnNpb24gSW50OCA6IFRTZXJpYWxpemFibGUgeworICBwdWJsaWMgc3RhdGljIHZhciB0aHJpZnRUeXBlOiBUVHlwZSB7IHJldHVybiAuaTggfQorCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkKGZyb20gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IEludDggeworICAgIHJldHVybiBJbnQ4KHRyeSBwcm90by5yZWFkKCkgYXMgVUludDgpCisgIH0KKworICBwdWJsaWMgZnVuYyB3cml0ZSh0byBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZShVSW50OChzZWxmKSkKKyAgfQorfQorCitleHRlbnNpb24gSW50MTYgOiBUU2VyaWFsaXphYmxlIHsKKyAgcHVibGljIHN0YXRpYyB2YXIgdGhyaWZ0VHlwZTogVFR5cGUgeyByZXR1cm4gLmkxNiB9CisKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWQoZnJvbSBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gSW50MTYgeworICAgIHJldHVybiB0cnkgcHJvdG8ucmVhZCgpCisgIH0KKworICBwdWJsaWMgZnVuYyB3cml0ZSh0byBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZShzZWxmKQorICB9Cit9CisKK2V4dGVuc2lvbiBJbnQzMiA6IFRTZXJpYWxpemFibGUgeworICBwdWJsaWMgc3RhdGljIHZhciB0aHJpZnRUeXBlOiBUVHlwZSB7IHJldHVybiAuaTMyIH0KKworICBwdWJsaWMgc3RhdGljIGZ1bmMgcmVhZChmcm9tIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiBJbnQzMiB7CisgICAgcmV0dXJuIHRyeSBwcm90by5yZWFkKCkKKyAgfQorCisgIHB1YmxpYyBmdW5jIHdyaXRlKHRvIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHByb3RvLndyaXRlKHNlbGYpCisgIH0KK30KKworCitleHRlbnNpb24gSW50NjQgOiBUU2VyaWFsaXphYmxlIHsKKyAgcHVibGljIHN0YXRpYyB2YXIgdGhyaWZ0VHlwZTogVFR5cGUgeyByZXR1cm4gLmk2NCB9CisKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWQoZnJvbSBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gSW50NjQgeworICAgIHJldHVybiB0cnkgcHJvdG8ucmVhZCgpCisgIH0KKworICBwdWJsaWMgZnVuYyB3cml0ZSh0byBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZShzZWxmKQorICB9Cit9CisKK2V4dGVuc2lvbiBEb3VibGUgOiBUU2VyaWFsaXphYmxlIHsKKyAgcHVibGljIHN0YXRpYyB2YXIgdGhyaWZ0VHlwZTogVFR5cGUgeyByZXR1cm4gLmRvdWJsZSB9CisKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWQoZnJvbSBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gRG91YmxlIHsKKyAgICByZXR1cm4gdHJ5IHByb3RvLnJlYWQoKQorICB9CisKKyAgcHVibGljIGZ1bmMgd3JpdGUodG8gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGUoc2VsZikKKyAgfQorfQorCitleHRlbnNpb24gU3RyaW5nIDogVFNlcmlhbGl6YWJsZSB7CisgIHB1YmxpYyBzdGF0aWMgdmFyIHRocmlmdFR5cGU6IFRUeXBlIHsgcmV0dXJuIC5zdHJpbmcgfQorCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkKGZyb20gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IFN0cmluZyB7CisgICAgcmV0dXJuIHRyeSBwcm90by5yZWFkKCkKKyAgfQorCisgIHB1YmxpYyBmdW5jIHdyaXRlKHRvIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHByb3RvLndyaXRlKHNlbGYpCisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RTZXQuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UU2V0LnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlY2QxNzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UU2V0LnN3aWZ0CkBAIC0wLDAgKzEsMTg5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBGb3VuZGF0aW9uCisKK3B1YmxpYyBzdHJ1Y3QgVFNldDxFbGVtZW50IDogVFNlcmlhbGl6YWJsZSAmIEhhc2hhYmxlPiA6IFNldEFsZ2VicmEsIEhhc2hhYmxlLCBDb2xsZWN0aW9uLCBFeHByZXNzaWJsZUJ5QXJyYXlMaXRlcmFsLCBUU2VyaWFsaXphYmxlIHsKKyAgLy8vIFR5cGVhbGlhcyBmb3IgU3RvcmFnZSB0eXBlCisgIHB1YmxpYyB0eXBlYWxpYXMgU3RvcmFnZSA9IFNldDxFbGVtZW50PgorICAKKyAgCisgIC8vLyBJbnRlcm5hbCBTdG9yYWdlIHVzZWQgZm9yIFRTZXQgKFNldFw8RWxlbWVudFw+KQorICBpbnRlcm5hbCB2YXIgc3RvcmFnZSA6IFN0b3JhZ2UKKyAgCisgIAorICAvLy8gTWFyazogQ29sbGVjdGlvbgorICAKKyAgcHVibGljIHR5cGVhbGlhcyBJbmRpY2VzID0gU3RvcmFnZS5JbmRpY2VzCisgIHB1YmxpYyB0eXBlYWxpYXMgSW5kZXggPSBTdG9yYWdlLkluZGV4CisgIHB1YmxpYyB0eXBlYWxpYXMgSW5kZXhEaXN0YW5jZSA9IFN0b3JhZ2UuSW5kZXhEaXN0YW5jZQorICBwdWJsaWMgdHlwZWFsaWFzIFN1YlNlcXVlbmNlID0gU3RvcmFnZS5TdWJTZXF1ZW5jZQorICAKKyAgCisgIHB1YmxpYyB2YXIgaW5kaWNlczogSW5kaWNlcyB7IHJldHVybiBzdG9yYWdlLmluZGljZXMgfQorICAKKyAgLy8gTXVzdCBpbXBsZW1lbnQgaXNFbXB0eSBldmVuIHRob3VnaCBib3RoIFNldEFsZ2VicmEgYW5kIENvbGxlY3Rpb24gcHJvdmlkZSBpdCBkdWUgdG8gdGhlaXIgY29uZmxjaXRpbmcgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMKKyAgcHVibGljIHZhciBpc0VtcHR5OiBCb29sIHsgcmV0dXJuIHN0b3JhZ2UuaXNFbXB0eSB9CisgIAorICBwdWJsaWMgZnVuYyBkaXN0YW5jZShmcm9tIHN0YXJ0OiBJbmRleCwgdG8gZW5kOiBJbmRleCkgLT4gSW5kZXhEaXN0YW5jZSB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZGlzdGFuY2UoZnJvbTogc3RhcnQsIHRvOiBlbmQpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGluZGV4KF8gaTogSW5kZXgsIG9mZnNldEJ5IG46IEluZGV4RGlzdGFuY2UpIC0+IEluZGV4IHsKKyAgICByZXR1cm4gc3RvcmFnZS5pbmRleChpLCBvZmZzZXRCeTogbikKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgaW5kZXgoXyBpOiBJbmRleCwgb2Zmc2V0QnkgbjogSW5kZXhEaXN0YW5jZSwgbGltaXRlZEJ5IGxpbWl0OiBJbmRleCkgLT4gSW5kZXg/IHsKKyAgICByZXR1cm4gc3RvcmFnZS5pbmRleChpLCBvZmZzZXRCeTogbiwgbGltaXRlZEJ5OiBsaW1pdCkKKyAgfQorICAKKyAgI2lmIHN3aWZ0KD49My4yKQorICBwdWJsaWMgc3Vic2NyaXB0IChwb3NpdGlvbjogU3RvcmFnZS5JbmRleCkgLT4gRWxlbWVudCB7CisgICAgICByZXR1cm4gc3RvcmFnZVtwb3NpdGlvbl0KKyAgICB9CisgICNlbHNlCisgIHB1YmxpYyBzdWJzY3JpcHQgKHBvc2l0aW9uOiBTdG9yYWdlLkluZGV4KSAtPiBFbGVtZW50PyB7CisgICAgcmV0dXJuIHN0b3JhZ2VbcG9zaXRpb25dCisgIH0KKyAgI2VuZGlmCisgIAorICAvLy8gTWFyazogU2V0QWxnZWJyYQorICBpbnRlcm5hbCBpbml0KHN0b3JhZ2U6IFNldDxFbGVtZW50PikgeworICAgIHNlbGYuc3RvcmFnZSA9IHN0b3JhZ2UKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgY29udGFpbnMoXyBtZW1iZXI6IEVsZW1lbnQpIC0+IEJvb2wgeworICAgIHJldHVybiBzdG9yYWdlLmNvbnRhaW5zKG1lbWJlcikKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgaW5zZXJ0KF8gbmV3TWVtYmVyOiBFbGVtZW50KSAtPiAoaW5zZXJ0ZWQ6IEJvb2wsIG1lbWJlckFmdGVySW5zZXJ0OiBFbGVtZW50KSB7CisgICAgcmV0dXJuIHN0b3JhZ2UuaW5zZXJ0KG5ld01lbWJlcikKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgcmVtb3ZlKF8gbWVtYmVyOiBFbGVtZW50KSAtPiBFbGVtZW50PyB7CisgICAgcmV0dXJuIHN0b3JhZ2UucmVtb3ZlKG1lbWJlcikKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgdW5pb24oXyBvdGhlcjogVFNldDxFbGVtZW50PikgLT4gVFNldCB7CisgICAgcmV0dXJuIFRTZXQoc3RvcmFnZTogc3RvcmFnZS51bmlvbihvdGhlci5zdG9yYWdlKSkKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgZm9ybUludGVyc2VjdGlvbihfIG90aGVyOiBUU2V0PEVsZW1lbnQ+KSB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZm9ybUludGVyc2VjdGlvbihvdGhlci5zdG9yYWdlKQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyBmb3JtU3ltbWV0cmljRGlmZmVyZW5jZShfIG90aGVyOiBUU2V0PEVsZW1lbnQ+KSB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZm9ybVN5bW1ldHJpY0RpZmZlcmVuY2Uob3RoZXIuc3RvcmFnZSkKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgZm9ybVVuaW9uKF8gb3RoZXI6IFRTZXQ8RWxlbWVudD4pIHsKKyAgICByZXR1cm4gc3RvcmFnZS5mb3JtVW5pb24ob3RoZXIuc3RvcmFnZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgaW50ZXJzZWN0aW9uKF8gb3RoZXI6IFRTZXQ8RWxlbWVudD4pIC0+IFRTZXQgeworICAgIHJldHVybiBUU2V0KHN0b3JhZ2U6IHN0b3JhZ2UuaW50ZXJzZWN0aW9uKG90aGVyLnN0b3JhZ2UpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyBzeW1tZXRyaWNEaWZmZXJlbmNlKF8gb3RoZXI6IFRTZXQ8RWxlbWVudD4pIC0+IFRTZXQgeworICAgIHJldHVybiBUU2V0KHN0b3JhZ2U6IHN0b3JhZ2Uuc3ltbWV0cmljRGlmZmVyZW5jZShvdGhlci5zdG9yYWdlKSkKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgdXBkYXRlKHdpdGggbmV3TWVtYmVyOiBFbGVtZW50KSAtPiBFbGVtZW50PyB7CisgICAgcmV0dXJuIHN0b3JhZ2UudXBkYXRlKHdpdGg6IG5ld01lbWJlcikKKyAgfQorICAKKyAgLy8vIE1hcms6IEluZGV4YWJsZUJhc2UKKyAgCisgIHB1YmxpYyB2YXIgc3RhcnRJbmRleDogSW5kZXggeyByZXR1cm4gc3RvcmFnZS5zdGFydEluZGV4IH0KKyAgcHVibGljIHZhciBlbmRJbmRleDogSW5kZXggeyByZXR1cm4gc3RvcmFnZS5lbmRJbmRleCB9CisgIHB1YmxpYyBmdW5jIGluZGV4KGFmdGVyIGk6IEluZGV4KSAtPiBJbmRleCB7CisgICAgcmV0dXJuIHN0b3JhZ2UuaW5kZXgoYWZ0ZXI6IGkpCisgIH0KKworICBwdWJsaWMgZnVuYyBmb3JtSW5kZXgoYWZ0ZXIgaTogaW5vdXQgU3RvcmFnZS5JbmRleCkgeworICAgIHN0b3JhZ2UuZm9ybUluZGV4KGFmdGVyOiAmaSkKKyAgfQorICAKKyAgcHVibGljIHN1YnNjcmlwdChib3VuZHM6IFJhbmdlPEluZGV4PikgLT4gU3ViU2VxdWVuY2UgeworICAgIHJldHVybiBzdG9yYWdlW2JvdW5kc10KKyAgfQorCisgIAorICAvLy8gTWFyazogSGFzaGFibGUKKyAgcHVibGljIHZhciBoYXNoVmFsdWUgOiBJbnQgeworICAgIGxldCBwcmltZSA9IDMxCisgICAgdmFyIHJlc3VsdCA9IDEKKyAgICBmb3IgZWxlbWVudCBpbiBzdG9yYWdlIHsKKyAgICAgIHJlc3VsdCA9IHByaW1lICYqIHJlc3VsdCAmKyBlbGVtZW50Lmhhc2hWYWx1ZQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0CisgIH0KKyAgCisgIC8vLyBNYXJrOiBUU2VyaWFsaXphYmxlCisgIHB1YmxpYyBzdGF0aWMgdmFyIHRocmlmdFR5cGUgOiBUVHlwZSB7IHJldHVybiAuc2V0IH0KKyAgCisgIHB1YmxpYyBpbml0KCkgeworICAgIHN0b3JhZ2UgPSBTdG9yYWdlKCkKKyAgfQorICAKKyAgcHVibGljIGluaXQoYXJyYXlMaXRlcmFsIGVsZW1lbnRzOiBFbGVtZW50Li4uKSB7CisgICAgc2VsZi5zdG9yYWdlID0gU3RvcmFnZShlbGVtZW50cykKKyAgfQorICAKKyAgcHVibGljIGluaXQ8U291cmNlIDogU2VxdWVuY2U+KF8gc2VxdWVuY2U6IFNvdXJjZSkgd2hlcmUgU291cmNlLkl0ZXJhdG9yLkVsZW1lbnQgPT0gRWxlbWVudCB7CisgICAgc3RvcmFnZSA9IFN0b3JhZ2Uoc2VxdWVuY2UpCisgIH0KKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkKGZyb20gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IFRTZXQgeworICAgIGxldCAoZWxlbWVudFR5cGUsIHNpemUpID0gdHJ5IHByb3RvLnJlYWRTZXRCZWdpbigpCisgICAgaWYgZWxlbWVudFR5cGUgIT0gRWxlbWVudC50aHJpZnRUeXBlIHsKKyAgICAgIHRocm93IFRQcm90b2NvbEVycm9yKGVycm9yOiAuaW52YWxpZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbmRlZEVycm9yOiAudW5leHBlY3RlZFR5cGUodHlwZTogZWxlbWVudFR5cGUpKQorICAgIH0KKyAgICB2YXIgc2V0ID0gVFNldCgpCisgICAgZm9yIF8gaW4gMC4uPHNpemUgeworICAgICAgbGV0IGVsZW1lbnQgPSB0cnkgRWxlbWVudC5yZWFkKGZyb206IHByb3RvKQorICAgICAgc2V0LnN0b3JhZ2UuaW5zZXJ0KGVsZW1lbnQpCisgICAgfQorICAgIHRyeSBwcm90by5yZWFkU2V0RW5kKCkKKyAgICByZXR1cm4gc2V0CisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKHRvIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHByb3RvLndyaXRlU2V0QmVnaW4oZWxlbWVudFR5cGU6IEVsZW1lbnQudGhyaWZ0VHlwZSwgc2l6ZTogSW50MzIoc2VsZi5jb3VudCkpCisgICAgZm9yIGVsZW1lbnQgaW4gc2VsZi5zdG9yYWdlIHsKKyAgICAgIHRyeSBFbGVtZW50LndyaXRlKGVsZW1lbnQsIHRvOiBwcm90bykKKyAgICB9CisgICAgdHJ5IHByb3RvLndyaXRlU2V0RW5kKCkKKyAgfQorfQorCitleHRlbnNpb24gVFNldDogQ3VzdG9tU3RyaW5nQ29udmVydGlibGUsIEN1c3RvbURlYnVnU3RyaW5nQ29udmVydGlibGUgeworICBwdWJsaWMgdmFyIGRlc2NyaXB0aW9uIDogU3RyaW5nIHsKKyAgICByZXR1cm4gc3RvcmFnZS5kZXNjcmlwdGlvbgorICB9CisgIHB1YmxpYyB2YXIgZGVidWdEZXNjcmlwdGlvbiA6IFN0cmluZyB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZGVidWdEZXNjcmlwdGlvbgorICB9CisgIAorfQorCitwdWJsaWMgZnVuYyA9PTxFbGVtZW50PihsaHM6IFRTZXQ8RWxlbWVudD4sIHJoczogVFNldDxFbGVtZW50PikgLT4gQm9vbCB7CisgIHJldHVybiBsaHMuc3RvcmFnZSA9PSByaHMuc3RvcmFnZQorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVFNvY2tldFNlcnZlci5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RTb2NrZXRTZXJ2ZXIuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIyNGU2NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RTb2NrZXRTZXJ2ZXIuc3dpZnQKQEAgLTAsMCArMSwxNDkgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworKiB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpZiBvcyhPU1gpIHx8IG9zKGlPUykgfHwgb3Mod2F0Y2hPUykgfHwgb3ModHZPUykKKyAgaW1wb3J0IERhcndpbgorI2Vsc2VpZiBvcyhMaW51eCkgfHwgb3MoRnJlZUJTRCkgfHwgb3MoUFM0KSB8fCBvcyhBbmRyb2lkKQorICBpbXBvcnQgR2xpYmMKKyAgaW1wb3J0IERpc3BhdGNoCisjZW5kaWYKKworaW1wb3J0IEZvdW5kYXRpb24KK2ltcG9ydCBDb3JlRm91bmRhdGlvbgorCitwdWJsaWMgbGV0IFRTb2NrZXRTZXJ2ZXJDbGllbnRDb25uZWN0aW9uRmluaXNoZWQgPSAiVFNvY2tldFNlcnZlckNsaWVudENvbm5lY3Rpb25GaW5pc2hlZCIKK3B1YmxpYyBsZXQgVFNvY2tldFNlcnZlclByb2Nlc3NvcktleSA9ICJUU29ja2V0U2VydmVyUHJvY2Vzc29yIgorcHVibGljIGxldCBUU29ja2V0U2VydmVyVHJhbnNwb3J0S2V5ID0gIlRTb2NrZXRTZXJ2ZXJUcmFuc3BvcnQiCisKK2NsYXNzIFRTb2NrZXRTZXJ2ZXI8SW5Qcm90b2NvbDogVFByb3RvY29sLCBPdXRQcm90b2NvbDogVFByb3RvY29sLCBQcm9jZXNzb3I6IFRQcm9jZXNzb3IsIFNlcnZpY2U+IHdoZXJlIFByb2Nlc3Nvci5TZXJ2aWNlID09IFNlcnZpY2UgeworICB2YXIgc29ja2V0RmlsZUhhbmRsZTogRmlsZUhhbmRsZQorICB2YXIgcHJvY2Vzc2luZ1F1ZXVlID0gIERpc3BhdGNoUXVldWUobGFiZWw6ICJUU29ja2V0U2VydmVyLnByb2Nlc3NpbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcW9zOiAuYmFja2dyb3VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IC5jb25jdXJyZW50KQorICB2YXIgc2VydmljZUhhbmRsZXI6IFNlcnZpY2UKKworICBwdWJsaWMgaW5pdChwb3J0OiBJbnQsCisgICAgICAgICAgICAgIHNlcnZpY2U6IFNlcnZpY2UsCisgICAgICAgICAgICAgIGluUHJvdG9jb2w6IEluUHJvdG9jb2wuVHlwZSwKKyAgICAgICAgICAgICAgb3V0UHJvdG9jb2w6IE91dFByb3RvY29sLlR5cGUsCisgICAgICAgICAgICAgIHByb2Nlc3NvcjogUHJvY2Vzc29yLlR5cGUpIHRocm93cyB7CisgICAgLy8gc2V0IHNlcnZpY2UgaGFuZGxlcgorICAgIHNlbGYuc2VydmljZUhhbmRsZXIgPSBzZXJ2aWNlCisKKyAgICAvLyBjcmVhdGUgYSBzb2NrZXQKKyAgICB2YXIgZmQ6IEludDMyID0gLTEKKyAgICAjaWYgb3MoTGludXgpCisgICAgICBsZXQgc29jayA9IENGU29ja2V0Q3JlYXRlKGtDRkFsbG9jYXRvckRlZmF1bHQsIFBGX0lORVQsIEludDMyKFNPQ0tfU1RSRUFNLnJhd1ZhbHVlKSwgSW50MzIoSVBQUk9UT19UQ1ApLCAwLCBuaWwsIG5pbCkKKyAgICAjZWxzZQorICAgICAgbGV0IHNvY2sgPSBDRlNvY2tldENyZWF0ZShrQ0ZBbGxvY2F0b3JEZWZhdWx0LCBQRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1AsIDAsIG5pbCwgbmlsKQorICAgICNlbmRpZgorICAgIGlmIHNvY2sgIT0gbmlsIHsKKyAgICAgIENGU29ja2V0U2V0U29ja2V0RmxhZ3Moc29jaywgQ0ZTb2NrZXRHZXRTb2NrZXRGbGFncyhzb2NrKSAmIH5rQ0ZTb2NrZXRDbG9zZU9uSW52YWxpZGF0ZSkKKworICAgICAgZmQgPSBDRlNvY2tldEdldE5hdGl2ZShzb2NrKQorICAgICAgdmFyIHllcyA9IDEKKyAgICAgIHNldHNvY2tvcHQoZmQsIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwgJnllcywgVUludDMyKE1lbW9yeUxheW91dDxJbnQ+LnNpemUpKQorCisgICAgICAjaWYgb3MoTGludXgpCisgICAgICAgIHZhciBhZGRyID0gc29ja2FkZHJfaW4oc2luX2ZhbWlseTogc2FfZmFtaWx5X3QoQUZfSU5FVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luX3BvcnQ6IGluX3BvcnRfdChwb3J0LmJpZ0VuZGlhbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luX2FkZHI6IGluX2FkZHIoc19hZGRyOiBpbl9hZGRyX3QoMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbl96ZXJvOiAoMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCkpCisgICAgICAjZWxzZQorICAgICAgICB2YXIgYWRkciA9IHNvY2thZGRyX2luKHNpbl9sZW46IFVJbnQ4KE1lbW9yeUxheW91dDxzb2NrYWRkcl9pbj4uc2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luX2ZhbWlseTogc2FfZmFtaWx5X3QoQUZfSU5FVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luX3BvcnQ6IGluX3BvcnRfdChwb3J0LmJpZ0VuZGlhbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luX2FkZHI6IGluX2FkZHIoc19hZGRyOiBpbl9hZGRyX3QoMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbl96ZXJvOiAoMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCkpCisgICAgICAjZW5kaWYKKworICAgICAgbGV0IHB0ciA9IHdpdGhVbnNhZmVQb2ludGVyKHRvOiAmYWRkcikgeworICAgICAgICByZXR1cm4gVW5zYWZlUG9pbnRlcjxVSW50OD4oT3BhcXVlUG9pbnRlcigkMCkpCisgICAgICB9CisKKyAgICAgIGxldCBhZGRyZXNzID0gRGF0YShieXRlczogcHRyLCBjb3VudDogTWVtb3J5TGF5b3V0PHNvY2thZGRyX2luPi5zaXplKQorCisgICAgICBsZXQgY2ZhZGRyID0gYWRkcmVzcy53aXRoVW5zYWZlQnl0ZXMgeworICAgICAgICBDRkRhdGFDcmVhdGVXaXRoQnl0ZXNOb0NvcHkoa0NGQWxsb2NhdG9yRGVmYXVsdCwgJDAsIGFkZHJlc3MuY291bnQsIG5pbCkKKyAgICAgIH0KKyAgICAgIGlmIENGU29ja2V0U2V0QWRkcmVzcyhzb2NrLCBjZmFkZHIpICE9IENGU29ja2V0RXJyb3Iuc3VjY2VzcyB7IC8va0NGU29ja2V0U3VjY2VzcyB7CisgICAgICAgIENGU29ja2V0SW52YWxpZGF0ZShzb2NrKQorICAgICAgICBwcmludCgiVFNvY2tldFNlcnZlcjogQ291bGQgbm90IGJpbmQgdG8gYWRkcmVzcyIpCisgICAgICAgIHRocm93IFRUcmFuc3BvcnRFcnJvcihlcnJvcjogLm5vdE9wZW4sIG1lc3NhZ2U6ICJDb3VsZCBub3QgYmluZCB0byBhZGRyZXNzIikKKyAgICAgIH0KKworICAgIH0gZWxzZSB7CisgICAgICBwcmludCgiVFNvY2tldFNlcnZlcjogTm8gc2VydmVyIHNvY2tldCIpCisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC5ub3RPcGVuLCBtZXNzYWdlOiAiQ291bGQgbm90IGNyZWF0ZSBzb2NrZXQiKQorICAgIH0KKworICAgIC8vIHdyYXAgaXQgaW4gYSBmaWxlIGhhbmRsZSBzbyB3ZSBjYW4gZ2V0IG1lc3NhZ2VzIGZyb20gaXQKKyAgICBzb2NrZXRGaWxlSGFuZGxlID0gRmlsZUhhbmRsZShmaWxlRGVzY3JpcHRvcjogZmQsIGNsb3NlT25EZWFsbG9jOiB0cnVlKQorCisgICAgLy8gdGhyb3cgYXdheSBvdXIgc29ja2V0CisgICAgQ0ZTb2NrZXRJbnZhbGlkYXRlKHNvY2spCisKKyAgICAvLyByZWdpc3RlciBmb3Igbm90aWZpY2F0aW9ucyBvZiBhY2NlcHRlZCBpbmNvbWluZyBjb25uZWN0aW9ucworICAgIF8gPSBOb3RpZmljYXRpb25DZW50ZXIuZGVmYXVsdC5hZGRPYnNlcnZlcihmb3JOYW1lOiAuTlNGaWxlSGFuZGxlQ29ubmVjdGlvbkFjY2VwdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Q6IG5pbCwgcXVldWU6IG5pbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3dlYWsgc2VsZl0gbm90aWZpY2F0aW9uIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWFyZCBsZXQgc3Ryb25nU2VsZiA9IHNlbGYgZWxzZSB7IHJldHVybiB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJvbmdTZWxmLmNvbm5lY3Rpb25BY2NlcHRlZChzdHJvbmdTZWxmLnNvY2tldEZpbGVIYW5kbGUpCisKKyAgICB9CisKKyAgICAvLyB0ZWxsIHNvY2tldCB0byBsaXN0ZW4KKyAgICBzb2NrZXRGaWxlSGFuZGxlLmFjY2VwdENvbm5lY3Rpb25JbkJhY2tncm91bmRBbmROb3RpZnkoKQorCisgICAgcHJpbnQoIlRTb2NrZXRTZXJ2ZXI6IExpc3RlbmluZyBvbiBUQ1AgcG9ydCBcKHBvcnQpIikKKyAgfQorCisgIGRlaW5pdCB7CisgICAgTm90aWZpY2F0aW9uQ2VudGVyLmRlZmF1bHQucmVtb3ZlT2JzZXJ2ZXIoc2VsZikKKyAgfQorCisgIGZ1bmMgY29ubmVjdGlvbkFjY2VwdGVkKF8gc29ja2V0OiBGaWxlSGFuZGxlKSB7CisgICAgLy8gTm93IHRoYXQgd2UgaGF2ZSBhIGNsaWVudCBjb25uZWN0ZWQsIGhhbmRsZSB0aGUgcmVxdWVzdCBvbiBxdWV1ZQorICAgIHByb2Nlc3NpbmdRdWV1ZS5hc3luYyB7CisgICAgICBzZWxmLmhhbmRsZUNsaWVudENvbm5lY3Rpb24oc29ja2V0KQorICAgIH0KKyAgfQorCisgIGZ1bmMgaGFuZGxlQ2xpZW50Q29ubmVjdGlvbihfIGNsaWVudFNvY2tldDogRmlsZUhhbmRsZSkgeworCisgICAgbGV0IHRyYW5zcG9ydCA9IFRGaWxlSGFuZGxlVHJhbnNwb3J0KGZpbGVIYW5kbGU6IGNsaWVudFNvY2tldCkKKyAgICBsZXQgcHJvY2Vzc29yID0gUHJvY2Vzc29yKHNlcnZpY2U6IHNlcnZpY2VIYW5kbGVyKQorCisgICAgbGV0IGluUHJvdG9jb2wgPSBJblByb3RvY29sKG9uOiB0cmFuc3BvcnQpCisgICAgbGV0IG91dFByb3RvY29sID0gT3V0UHJvdG9jb2wob246IHRyYW5zcG9ydCkKKworICAgIGRvIHsKKyAgICAgIHRyeSBwcm9jZXNzb3IucHJvY2VzcyhvbjogaW5Qcm90b2NvbCwgb3V0UHJvdG9jb2w6IG91dFByb3RvY29sKQorICAgIH0gY2F0Y2ggbGV0IGVycm9yIHsKKyAgICAgIHByaW50KCJFcnJvciBwcm9jZXNzaWduIHJlcXVlc3Q6IFwoZXJyb3IpIikKKyAgICB9CisgICAgRGlzcGF0Y2hRdWV1ZS5tYWluLmFzeW5jIHsKKyAgICAgIE5vdGlmaWNhdGlvbkNlbnRlci5kZWZhdWx0CisgICAgICAgIC5wb3N0KG5hbWU6IE5vdGlmaWNhdGlvbi5OYW1lKHJhd1ZhbHVlOiBUU29ja2V0U2VydmVyQ2xpZW50Q29ubmVjdGlvbkZpbmlzaGVkKSwKKyAgICAgICAgICAgICAgb2JqZWN0OiBzZWxmLAorICAgICAgICAgICAgICB1c2VySW5mbzogW1RTb2NrZXRTZXJ2ZXJQcm9jZXNzb3JLZXk6IHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUU29ja2V0U2VydmVyVHJhbnNwb3J0S2V5OiB0cmFuc3BvcnRdKQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVFNvY2tldFRyYW5zcG9ydC5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RTb2NrZXRUcmFuc3BvcnQuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMxNmUzNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RTb2NrZXRUcmFuc3BvcnQuc3dpZnQKQEAgLTAsMCArMSwyMTAgQEAKKworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKyNpZiBvcyhPU1gpIHx8IG9zKGlPUykgfHwgb3Mod2F0Y2hPUykgfHwgb3ModHZPUykKKyAgaW1wb3J0IERhcndpbgorI2Vsc2VpZiBvcyhMaW51eCkgfHwgb3MoRnJlZUJTRCkgfHwgb3MoUFM0KSB8fCBvcyhBbmRyb2lkKQorICBpbXBvcnQgR2xpYmMKKyAgaW1wb3J0IERpc3BhdGNoCisjZW5kaWYKKworaW1wb3J0IEZvdW5kYXRpb24KK2ltcG9ydCBDb3JlRm91bmRhdGlvbgorCitwcml2YXRlIHN0cnVjdCBTeXMgeworICAjaWYgb3MoTGludXgpCisgIHN0YXRpYyBsZXQgcmVhZCA9IEdsaWJjLnJlYWQKKyAgc3RhdGljIGxldCB3cml0ZSA9IEdsaWJjLndyaXRlCisgIHN0YXRpYyBsZXQgY2xvc2UgPSBHbGliYy5jbG9zZQorICAjZWxzZQorICBzdGF0aWMgbGV0IHJlYWQgPSBEYXJ3aW4ucmVhZAorICBzdGF0aWMgbGV0IHdyaXRlID0gRGFyd2luLndyaXRlCisgIHN0YXRpYyBsZXQgY2xvc2UgPSBEYXJ3aW4uY2xvc2UKKyAgI2VuZGlmCit9CisKK2V4dGVuc2lvbiBpbl9hZGRyIHsKKyAgcHVibGljIGluaXQ/KGhvc3RlbnQ6IGhvc3RlbnQ/KSB7CisgICAgZ3VhcmQgbGV0IGhvc3QgPSBob3N0ZW50LCBob3N0LmhfYWRkcl9saXN0ICE9IG5pbCwgaG9zdC5oX2FkZHJfbGlzdC5wb2ludGVlICE9IG5pbCBlbHNlIHsKKyAgICAgIHJldHVybiBuaWwKKyAgICB9CisgICAgc2VsZi5pbml0KCkKKyAgICBtZW1jcHkoJnNlbGYsIGhvc3QuaF9hZGRyX2xpc3QucG9pbnRlZSEsIEludChob3N0LmhfbGVuZ3RoKSkKKyAgICAKKyAgfQorfQorCisKKyNpZiBvcyhMaW51eCkKKyAgLy8vIFRDRlNvY2tldFRyYW5zcG9ydCBjdXJyZW50bHkgdW5hdmFpbGFibGUKKyAgLy8vIHJlbW92ZSBjb21tZW50cyBhbmQgYnVpbGQgdG8gc2VlIHdoeS9maXgKKyAgLy8vIGN1cnJlbnRseSBDRltSZWFkfFdyaXRlXVN0cmVhbSdzIGNhbid0IGNhc3QgdG8gW0lucHV0fE91dHB1dF1TdHJlYW1zIHdoaWNoIGJyZWFrcyB0aGlnbnMKKyNlbHNlCitleHRlbnNpb24gU3RyZWFtLlByb3BlcnR5S2V5IHsKKyAgc3RhdGljIGxldCBTU0xQZWVyVHJ1c3QgPSBTdHJlYW0uUHJvcGVydHlLZXkoa0NGU3RyZWFtUHJvcGVydHlTU0xQZWVyVHJ1c3QgYXMgU3RyaW5nKQorfQorCisvLy8gVENGU29ja2V0VHJhbnNwb3J0LCB1c2VzIENGU29ja2V0cyBhbmQgKE5TKVN0cmVhbSdzCitwdWJsaWMgY2xhc3MgVENGU29ja2V0VHJhbnNwb3J0OiBUU3RyZWFtVHJhbnNwb3J0IHsKKyAgICBwdWJsaWMgaW5pdD8oaG9zdG5hbWU6IFN0cmluZywgcG9ydDogSW50LCBzZWN1cmU6IEJvb2wgPSBmYWxzZSkgeworICAgIAorICAgIHZhciBpbnB1dFN0cmVhbTogSW5wdXRTdHJlYW0KKyAgICB2YXIgb3V0cHV0U3RyZWFtOiBPdXRwdXRTdHJlYW0KKyAgICAKKyAgICB2YXIgcmVhZFN0cmVhbTogIFVubWFuYWdlZDxDRlJlYWRTdHJlYW0+PworICAgIHZhciB3cml0ZVN0cmVhbTogIFVubWFuYWdlZDxDRldyaXRlU3RyZWFtPj8KKyAgICBDRlN0cmVhbUNyZWF0ZVBhaXJXaXRoU29ja2V0VG9Ib3N0KGtDRkFsbG9jYXRvckRlZmF1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0bmFtZSBhcyBDRlN0cmluZyEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSW50MzIocG9ydCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVhZFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3cml0ZVN0cmVhbSkKKyAgICAKKyAgICBpZiBsZXQgcmVhZFN0cmVhbSA9IHJlYWRTdHJlYW0/LnRha2VSZXRhaW5lZFZhbHVlKCksCisgICAgICBsZXQgd3JpdGVTdHJlYW0gPSB3cml0ZVN0cmVhbT8udGFrZVJldGFpbmVkVmFsdWUoKSB7CisgICAgICAgIENGUmVhZFN0cmVhbVNldFByb3BlcnR5KHJlYWRTdHJlYW0sIC5zaG91bGRDbG9zZU5hdGl2ZVNvY2tldCwga0NGQm9vbGVhblRydWUpCisgICAgICAgIENGV3JpdGVTdHJlYW1TZXRQcm9wZXJ0eSh3cml0ZVN0cmVhbSwgLnNob3VsZENsb3NlTmF0aXZlU29ja2V0LCBrQ0ZCb29sZWFuVHJ1ZSkKKyAgICAgIAorICAgICAgICBpZiBzZWN1cmUgeworICAgICAgICAgICAgQ0ZSZWFkU3RyZWFtU2V0UHJvcGVydHkocmVhZFN0cmVhbSwgLnNvY2tldFNlY3VyaXR5TGV2ZWwsIFN0cmVhbVNvY2tldFNlY3VyaXR5TGV2ZWwubmVnb3RpYXRlZFNTTC5yYXdWYWx1ZSBhcyBDRlN0cmluZykKKyAgICAgICAgICAgIENGV3JpdGVTdHJlYW1TZXRQcm9wZXJ0eSh3cml0ZVN0cmVhbSwgLnNvY2tldFNlY3VyaXR5TGV2ZWwsIFN0cmVhbVNvY2tldFNlY3VyaXR5TGV2ZWwubmVnb3RpYXRlZFNTTC5yYXdWYWx1ZSBhcyBDRlN0cmluZykKKyAgICAgICAgfQorCisgICAgICBpbnB1dFN0cmVhbSA9IHJlYWRTdHJlYW0gYXMgSW5wdXRTdHJlYW0KKyAgICAgIGlucHV0U3RyZWFtLnNjaGVkdWxlKGluOiAuY3VycmVudCwgZm9yTW9kZTogLmRlZmF1bHRSdW5Mb29wTW9kZSkKKyAgICAgIGlucHV0U3RyZWFtLm9wZW4oKQorICAgICAgCisgICAgICBvdXRwdXRTdHJlYW0gPSB3cml0ZVN0cmVhbSBhcyBPdXRwdXRTdHJlYW0KKyAgICAgIG91dHB1dFN0cmVhbS5zY2hlZHVsZShpbjogLmN1cnJlbnQsIGZvck1vZGU6IC5kZWZhdWx0UnVuTG9vcE1vZGUpCisgICAgICBvdXRwdXRTdHJlYW0ub3BlbigpCisgICAgICAKKyAgICB9IGVsc2UgeworICAgICAgCisgICAgICBpZiByZWFkU3RyZWFtICE9IG5pbCB7CisgICAgICAgIHJlYWRTdHJlYW0/LnJlbGVhc2UoKQorICAgICAgfQorICAgICAgaWYgd3JpdGVTdHJlYW0gIT0gbmlsIHsKKyAgICAgICAgd3JpdGVTdHJlYW0/LnJlbGVhc2UoKQorICAgICAgfQorICAgICAgc3VwZXIuaW5pdChpbnB1dFN0cmVhbTogbmlsLCBvdXRwdXRTdHJlYW06IG5pbCkKKyAgICAgIHJldHVybiBuaWwKKyAgICB9CisgICAgCisgICAgc3VwZXIuaW5pdChpbnB1dFN0cmVhbTogaW5wdXRTdHJlYW0sIG91dHB1dFN0cmVhbTogb3V0cHV0U3RyZWFtKQorICAgIAorICAgIHNlbGYuaW5wdXQ/LmRlbGVnYXRlID0gc2VsZgorICAgIHNlbGYub3V0cHV0Py5kZWxlZ2F0ZSA9IHNlbGYKKyAgfQorfQorCitleHRlbnNpb24gVENGU29ja2V0VHJhbnNwb3J0OiBTdHJlYW1EZWxlZ2F0ZSB7IH0KKyNlbmRpZgorCisKKy8vLyBUU29ja2V0VHJhbnNwb3J0LCBwb3NpeCBzb2NrZXRzLiAgU3VwcG9ydHMgSVB2NCBvbmx5IGZvciBub3cKK3B1YmxpYyBjbGFzcyBUU29ja2V0VHJhbnNwb3J0IDogVFRyYW5zcG9ydCB7CisgIHB1YmxpYyB2YXIgc29ja2V0RGVzY3JpcHRvcjogSW50MzIKKyAgCisgIAorICAKKyAgLy8vIEluaXRpYWxpemUgZnJvbSBhbiBhbHJlYWR5IHNldCB1cCBzb2NrZXREZXNjcmlwdG9yLgorICAvLy8gRXhwZWN0cyBzb2NrZXQgdGhhdHMgYWxyZWFkeSBib3VuZC9jb25uZWN0ZWQgKGkuZS4gZnJvbSBsaXN0ZW5pbmcpCisgIC8vLworICAvLy8gLSBwYXJhbWV0ZXIgc29ja2V0RGVzY3JpcHRvcjogcG9zaXggc29ja2V0IGRlc2NyaXB0b3IgKEludDMyKQorICBwdWJsaWMgaW5pdChzb2NrZXREZXNjcmlwdG9yOiBJbnQzMikgeworICAgIHNlbGYuc29ja2V0RGVzY3JpcHRvciA9IHNvY2tldERlc2NyaXB0b3IKKyAgfQorICAKKyAgCisgIHB1YmxpYyBjb252ZW5pZW5jZSBpbml0KGhvc3RuYW1lOiBTdHJpbmcsIHBvcnQ6IEludCkgdGhyb3dzIHsKKyAgICBndWFyZCBsZXQgaHAgPSBnZXRob3N0YnluYW1lKGhvc3RuYW1lLmNTdHJpbmcodXNpbmc6IC51dGY4KSEpPy5wb2ludGVlLAorICAgICAgbGV0IGhvc3RBZGRyID0gaW5fYWRkcihob3N0ZW50OiBocCkgZWxzZSB7CisgICAgICAgIHRocm93IFRUcmFuc3BvcnRFcnJvcihlcnJvcjogLnVua25vd24sIG1lc3NhZ2U6ICJJbnZhbGlkIGFkZHJlc3M6IFwoaG9zdG5hbWUpIikKKyAgICB9CisgICAgCisgICAgCisgICAgCisgICAgI2lmIG9zKExpbnV4KQorICAgICAgbGV0IHNvY2sgPSBzb2NrZXQoQUZfSU5FVCwgSW50MzIoU09DS19TVFJFQU0ucmF3VmFsdWUpLCAwKQorICAgICAgdmFyIGFkZHIgPSBzb2NrYWRkcl9pbihzaW5fZmFtaWx5OiBzYV9mYW1pbHlfdChBRl9JTkVUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luX3BvcnQ6IGluX3BvcnRfdChodG9ucyhVSW50MTYocG9ydCkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luX2FkZHI6IGhvc3RBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5femVybzogKDAsIDAsIDAsIDAsIDAsIDAsIDAsIDApKQorICAgICNlbHNlCisgICAgICBsZXQgc29jayA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCkKKyAgICAgIAorICAgICAgdmFyIGFkZHIgPSBzb2NrYWRkcl9pbihzaW5fbGVuOiBVSW50OChNZW1vcnlMYXlvdXQ8c29ja2FkZHJfaW4+LnNpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5fZmFtaWx5OiBzYV9mYW1pbHlfdChBRl9JTkVUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luX3BvcnQ6IGluX3BvcnRfdChodG9ucyhVSW50MTYocG9ydCkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luX2FkZHI6IGluX2FkZHIoc19hZGRyOiBpbl9hZGRyX3QoMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5femVybzogKDAsIDAsIDAsIDAsIDAsIDAsIDAsIDApKQorICAgICAgCisgICAgI2VuZGlmCisgICAgCisgICAgbGV0IGFkZHJQdHIgPSB3aXRoVW5zYWZlUG9pbnRlcih0bzogJmFkZHIpeyBVbnNhZmVQb2ludGVyPHNvY2thZGRyPihPcGFxdWVQb2ludGVyKCQwKSkgfQorICAgIAorICAgIGxldCBjb25uZWN0ZWQgPSBjb25uZWN0KHNvY2ssIGFkZHJQdHIsIFVJbnQzMihNZW1vcnlMYXlvdXQ8c29ja2FkZHJfaW4+LnNpemUpKQorICAgIGlmIGNvbm5lY3RlZCAhPSAwIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFcnJvcihlcnJvcjogLm5vdE9wZW4sIG1lc3NhZ2U6ICJFcnJvciBiaW5kaW5nIHRvIGhvc3Q6IFwoaG9zdG5hbWUpIFwocG9ydCkiKQorICAgIH0KKyAgICAKKyAgICBzZWxmLmluaXQoc29ja2V0RGVzY3JpcHRvcjogc29jaykKKyAgfQorICAKKyAgZGVpbml0IHsKKyAgICBjbG9zZSgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRBbGwoc2l6ZTogSW50KSB0aHJvd3MgLT4gRGF0YSB7CisgICAgdmFyIG91dCA9IERhdGEoKQorICAgIHdoaWxlIG91dC5jb3VudCA8IHNpemUgeworICAgICAgb3V0LmFwcGVuZCh0cnkgc2VsZi5yZWFkKHNpemU6IHNpemUpKQorICAgIH0KKyAgICByZXR1cm4gb3V0CisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoc2l6ZTogSW50KSB0aHJvd3MgLT4gRGF0YSB7CisgICAgdmFyIGJ1ZmYgPSBBcnJheTxVSW50OD4uaW5pdChyZXBlYXRpbmc6IDAsIGNvdW50OiBzaXplKQorICAgIGxldCByZWFkQnl0ZXMgPSBTeXMucmVhZChzb2NrZXREZXNjcmlwdG9yLCAmYnVmZiwgc2l6ZSkKKyAgICAKKyAgICByZXR1cm4gRGF0YShieXRlczogYnVmZlswLi48cmVhZEJ5dGVzXSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoZGF0YTogRGF0YSkgeworICAgIHZhciBieXRlc1RvV3JpdGUgPSBkYXRhLmNvdW50CisgICAgdmFyIHdyaXRlQnVmZmVyID0gZGF0YQorICAgIHdoaWxlIGJ5dGVzVG9Xcml0ZSA+IDAgeworICAgICAgbGV0IHdyaXR0ZW4gPSB3cml0ZUJ1ZmZlci53aXRoVW5zYWZlQnl0ZXMgeworICAgICAgICBTeXMud3JpdGUoc29ja2V0RGVzY3JpcHRvciwgJDAsIHdyaXRlQnVmZmVyLmNvdW50KQorICAgICAgfQorICAgICAgd3JpdGVCdWZmZXIgPSB3cml0ZUJ1ZmZlci5zdWJkYXRhKGluOiB3cml0dGVuIC4uPCB3cml0ZUJ1ZmZlci5jb3VudCkKKyAgICAgIGJ5dGVzVG9Xcml0ZSAtPSB3cml0dGVuCisgICAgfQorICB9CisgIAorICBwdWJsaWMgZnVuYyBmbHVzaCgpIHRocm93cyB7CisgICAgLy8gbm90aGluZyB0byBkbworICB9CisgIAorICBwdWJsaWMgZnVuYyBjbG9zZSgpIHsKKyAgICBzaHV0ZG93bihzb2NrZXREZXNjcmlwdG9yLCBJbnQzMihTSFVUX1JEV1IpKQorICAgIF8gPSBTeXMuY2xvc2Uoc29ja2V0RGVzY3JpcHRvcikKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVFN0cmVhbVRyYW5zcG9ydC5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RTdHJlYW1UcmFuc3BvcnQuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZiYzFiOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RTdHJlYW1UcmFuc3BvcnQuc3dpZnQKQEAgLTAsMCArMSwxNDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW1wb3J0IEZvdW5kYXRpb24KK2ltcG9ydCBDb3JlRm91bmRhdGlvbgorCisjaWYgb3MoTGludXgpCisgIC8vLyBDdXJyZW50bHkgdW5hdmFpbGFibGUgaW4gTGludXgKKyAgLy8vIFJlbW92ZSBjb21tZW50cyBhbmQgYnVpbGQgdG8gZml4CisgIC8vLyBDdXJyZW50bHkga0NvbnN0YW50cyBmb3IgQ0ZTb2NrZXRzIGRvbid0IGV4aXN0IGluIGxpbnV4IGFuZCBub3QgYWxsIGhhdmUgYmVlbiBtb3ZlZAorICAvLy8gdG8gcHJvcGVydHkgc3RydWN0cyB5ZXQKKyNlbHNlCisgIC8vIE11c3QgaW5oZXJpdCBOU09iamVjdCBmb3IgTlNTdHJlYW1EZWxlZ2F0ZSBjb25mb3JtYW5jZQorICBwdWJsaWMgY2xhc3MgVFN0cmVhbVRyYW5zcG9ydCA6IE5TT2JqZWN0LCBUVHJhbnNwb3J0IHsKKyAgICBwdWJsaWMgdmFyIGlucHV0OiBJbnB1dFN0cmVhbT8gPSBuaWwKKyAgICBwdWJsaWMgdmFyIG91dHB1dDogT3V0cHV0U3RyZWFtPyA9IG5pbAorICAgIAorICAgIHB1YmxpYyBpbml0KGlucHV0U3RyZWFtOiBJbnB1dFN0cmVhbT8sIG91dHB1dFN0cmVhbTogT3V0cHV0U3RyZWFtPykgeworICAgICAgaW5wdXQgICA9IGlucHV0U3RyZWFtCisgICAgICBvdXRwdXQgID0gb3V0cHV0U3RyZWFtCisgICAgfQorICAgIAorICAgIHB1YmxpYyBjb252ZW5pZW5jZSBpbml0KGlucHV0U3RyZWFtOiBJbnB1dFN0cmVhbT8pIHsKKyAgICAgIHNlbGYuaW5pdChpbnB1dFN0cmVhbTogaW5wdXRTdHJlYW0sIG91dHB1dFN0cmVhbTogbmlsKQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgY29udmVuaWVuY2UgaW5pdChvdXRwdXRTdHJlYW06IE91dHB1dFN0cmVhbT8pIHsKKyAgICAgIHNlbGYuaW5pdChpbnB1dFN0cmVhbTogbmlsLCBvdXRwdXRTdHJlYW06IG91dHB1dFN0cmVhbSkKKyAgICB9CisgICAgCisgICAgZGVpbml0IHsKKyAgICAgIGNsb3NlKCkKKyAgICB9CisgICAgCisgICAgcHVibGljIGZ1bmMgcmVhZEFsbChzaXplOiBJbnQpIHRocm93cyAtPiBEYXRhIHsKKyAgICAgIGd1YXJkIGxldCBpbnB1dCA9IGlucHV0IGVsc2UgeworICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC51bmtub3duKQorICAgICAgfQorICAgICAgCisgICAgICB2YXIgcmVhZCA9IERhdGEoKQorICAgICAgd2hpbGUgcmVhZC5jb3VudCA8IHNpemUgeworICAgICAgICB2YXIgYnVmZmVyID0gQXJyYXk8VUludDg+KHJlcGVhdGluZzogMCwgY291bnQ6IHNpemUgLSByZWFkLmNvdW50KQorICAgICAgICAKKyAgICAgICAgbGV0IGJ5dGVzUmVhZCA9IGJ1ZmZlci53aXRoVW5zYWZlTXV0YWJsZUJ1ZmZlclBvaW50ZXIgeyBidWZmZXJQdHIgaW4KKyAgICAgICAgICByZXR1cm4gaW5wdXQucmVhZChidWZmZXJQdHIuYmFzZUFkZHJlc3MhLCBtYXhMZW5ndGg6IHNpemUgLSByZWFkLmNvdW50KQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiBieXRlc1JlYWQgPD0gMCB7CisgICAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEVycm9yKGVycm9yOiAubm90T3BlbikKKyAgICAgICAgfQorICAgICAgICByZWFkLmFwcGVuZChEYXRhKGJ5dGVzOiBidWZmZXIpKQorICAgICAgfQorICAgICAgcmV0dXJuIHJlYWQKKyAgICB9CisgICAgCisgICAgcHVibGljIGZ1bmMgcmVhZChzaXplOiBJbnQpIHRocm93cyAtPiBEYXRhIHsKKyAgICAgIGd1YXJkIGxldCBpbnB1dCA9IGlucHV0IGVsc2UgeworICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC51bmtub3duKQorICAgICAgfQorICAgICAgCisgICAgICB2YXIgcmVhZCA9IERhdGEoKQorICAgICAgd2hpbGUgcmVhZC5jb3VudCA8IHNpemUgeworICAgICAgICB2YXIgYnVmZmVyID0gQXJyYXk8VUludDg+KHJlcGVhdGluZzogMCwgY291bnQ6IHNpemUgLSByZWFkLmNvdW50KQorICAgICAgICBsZXQgYnl0ZXNSZWFkID0gYnVmZmVyLndpdGhVbnNhZmVNdXRhYmxlQnVmZmVyUG9pbnRlciB7CisgICAgICAgICAgaW5wdXQucmVhZCgkMC5iYXNlQWRkcmVzcyEsIG1heExlbmd0aDogc2l6ZSAtIHJlYWQuY291bnQpCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIGJ5dGVzUmVhZCA8PSAwIHsKKyAgICAgICAgICBicmVhaworICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZWFkLmFwcGVuZChEYXRhKGJ5dGVzOiBidWZmZXIpKQorICAgICAgfQorICAgICAgcmV0dXJuIHJlYWQKKyAgICB9CisgICAgCisgICAgcHVibGljIGZ1bmMgd3JpdGUoZGF0YTogRGF0YSkgdGhyb3dzIHsKKyAgICAgIGd1YXJkIGxldCBvdXRwdXQgPSBvdXRwdXQgZWxzZSB7CisgICAgICAgIHRocm93IFRUcmFuc3BvcnRFcnJvcihlcnJvcjogLnVua25vd24pCisgICAgICB9CisgICAgICAKKyAgICAgIHZhciBieXRlc1dyaXR0ZW4gPSAwCisgICAgICB3aGlsZSBieXRlc1dyaXR0ZW4gPCBkYXRhLmNvdW50IHsKKyAgICAgICAgYnl0ZXNXcml0dGVuID0gZGF0YS53aXRoVW5zYWZlQnl0ZXMgeworICAgICAgICAgIHJldHVybiBvdXRwdXQud3JpdGUoJDAsIG1heExlbmd0aDogZGF0YS5jb3VudCkKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgYnl0ZXNXcml0dGVuID09IC0xIHsKKyAgICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC5ub3RPcGVuKQorICAgICAgICB9IGVsc2UgaWYgYnl0ZXNXcml0dGVuID09IDAgeworICAgICAgICAgIHRocm93IFRUcmFuc3BvcnRFcnJvcihlcnJvcjogLmVuZE9mRmlsZSkKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICAKKyAgICAKKyAgICBwdWJsaWMgZnVuYyBmbHVzaCgpIHRocm93cyB7CisgICAgICByZXR1cm4KKyAgICB9CisgICAgCisgICAgcHVibGljIGZ1bmMgY2xvc2UoKSB7CisgICAgICAKKyAgICAgIGlmIGlucHV0ICE9IG5pbCB7CisgICAgICAgIC8vIENsb3NlIGFuZCByZXNldCBpbnB1dHN0cmVhbQorICAgICAgICBpZiBsZXQgY2Y6IENGUmVhZFN0cmVhbSA9IGlucHV0IHsKKyAgICAgICAgICBDRlJlYWRTdHJlYW1TZXRQcm9wZXJ0eShjZiwgLnNob3VsZENsb3NlTmF0aXZlU29ja2V0LCBrQ0ZCb29sZWFuVHJ1ZSkKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaW5wdXQ/LmRlbGVnYXRlID0gbmlsCisgICAgICAgIGlucHV0Py5jbG9zZSgpCisgICAgICAgIGlucHV0Py5yZW1vdmUoZnJvbTogLmN1cnJlbnQsIGZvck1vZGU6IC5kZWZhdWx0UnVuTG9vcE1vZGUpCisgICAgICAgIGlucHV0ID0gbmlsCisgICAgICB9CisgICAgICAKKyAgICAgIGlmIG91dHB1dCAhPSBuaWwgeworICAgICAgICAvLyBDbG9zZSBhbmQgcmVzZXQgb3V0cHV0IHN0cmVhbQorICAgICAgICBpZiBsZXQgY2Y6IENGV3JpdGVTdHJlYW0gPSBvdXRwdXQgeworICAgICAgICAgIENGV3JpdGVTdHJlYW1TZXRQcm9wZXJ0eShjZiwgLnNob3VsZENsb3NlTmF0aXZlU29ja2V0LCBrQ0ZCb29sZWFuVHJ1ZSkKKyAgICAgICAgfQorICAgICAgICBvdXRwdXQ/LmRlbGVnYXRlID0gbmlsCisgICAgICAgIG91dHB1dD8uY2xvc2UoKQorICAgICAgICBvdXRwdXQ/LnJlbW92ZShmcm9tOiAuY3VycmVudCwgZm9yTW9kZTogLmRlZmF1bHRSdW5Mb29wTW9kZSkKKyAgICAgICAgb3V0cHV0ID0gbmlsCisgICAgICB9CisgICAgfQorICB9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RTdHJ1Y3Quc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UU3RydWN0LnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxNzJhMzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UU3RydWN0LnN3aWZ0CkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworLy8vIFByb3RvY29sIGZvciBHZW5lcmF0ZWQgU3RydWN0cyB0byBjb25mb3JtIHRvCisvLy8gRGljdGlvbmFyeSBtYXBzIGZpZWxkIG5hbWVzIHRvIGludGVybmFsIElEcyBhbmQgdXNlcyBSZWZsZWN0aW9uCisvLy8gdG8gaXRlcmF0ZSB0aHJvdWdoIGFsbCBmaWVsZHMuICAKKy8vLyBgd3JpdGVGaWVsZFZhbHVlKF86bmFtZTp0eXBlOmlkOilgIGNhbGxzIGBUU2VyaWFsaXphYmxlLndyaXRlKHRvOilgIGludGVybmFsbHkKKy8vLyBnaXZpbmcgYSBuaWNlIHJlY3Vyc2l2ZSBiZWhhdmlvciBmb3IgbmVzdGVkIFRTdHJ1Y3RzLCBUTGlzdHMsIFRNYXBzLCBhbmQgVFNldHMKK3B1YmxpYyBwcm90b2NvbCBUU3RydWN0IDogVFNlcmlhbGl6YWJsZSB7CisgIHN0YXRpYyB2YXIgZmllbGRJZHM6IFtTdHJpbmc6IEludDMyXSB7IGdldCB9CisgIHN0YXRpYyB2YXIgc3RydWN0TmFtZTogU3RyaW5nIHsgZ2V0IH0KK30KKworcHVibGljIGV4dGVuc2lvbiBUU3RydWN0IHsKKyAgcHVibGljIHN0YXRpYyB2YXIgZmllbGRJZHM6IFtTdHJpbmc6IChpZDogSW50MzIsIHR5cGU6IFRUeXBlKV0geyByZXR1cm4gWzpdIH0KKyAgcHVibGljIHN0YXRpYyB2YXIgdGhyaWZ0VHlwZTogVFR5cGUgeyByZXR1cm4gLnN0cnVjdCB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZSh0byBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIC8vIFdyaXRlIHN0cnVjdCBuYW1lIGZpcnN0CisgICAgdHJ5IHByb3RvLndyaXRlU3RydWN0QmVnaW4obmFtZTogU2VsZi5zdHJ1Y3ROYW1lKQorICAgIAorICAgIHRyeSBzZWxmLmZvckVhY2ggeyBuYW1lLCB2YWx1ZSwgaWQgaW4KKyAgICAgIC8vIFdyaXRlIHRvIHByb3RvY29sCisgICAgICB0cnkgcHJvdG8ud3JpdGVGaWVsZFZhbHVlKHZhbHVlLCBuYW1lOiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB2YWx1ZS50aHJpZnRUeXBlLCBpZDogaWQpCisgICAgfQorICAgIHRyeSBwcm90by53cml0ZUZpZWxkU3RvcCgpCisgICAgdHJ5IHByb3RvLndyaXRlU3RydWN0RW5kKCkKKyAgfQorICAKKyAgcHVibGljIHZhciBoYXNoVmFsdWU6IEludCB7CisgICAgbGV0IHByaW1lID0gMzEKKyAgICB2YXIgcmVzdWx0ID0gMQorICAgIHNlbGYuZm9yRWFjaCB7IF8sIHZhbHVlLCBfIGluCisgICAgICByZXN1bHQgPSBwcmltZSAmKiByZXN1bHQgJisgKHZhbHVlLmhhc2hWYWx1ZSkKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdAorICB9CisgIAorICAvLy8gUHJvdmlkZXMgYSBibG9jayBmb3IgaGFuZGxpbmcgZWFjaCAoYXZhaWxhYmxlKSB0aHJpZnQgcHJvcGVydHkgdXNpbmcgcmVmbGVjdGlvbgorICAvLy8gQ2F2ZWF0OiBTa2lwcyBvdmVyIG9wdGlvbmFsIHZhbHVlcworICAKKyAgCisgIC8vLyBQcm92aWRlcyBhIGJsb2NrIGZvciBoYW5kbGluZyBlYWNoIChhdmFpbGFibGUpIHRocmlmdCBwcm9wZXJ0eSB1c2luZyByZWZsZWN0aW9uCisgIC8vLworICAvLy8gLSBwYXJhbWV0ZXIgYmxvY2s6IGJsb2NrIGZvciBoYW5kbGluZyBwcm9wZXJ0eQorICAvLy8KKyAgLy8vIC0gdGhyb3dzOiByZXRocm93cyBhbnkgRXJyb3IgdGhyb3duIGluIGJsb2NrCisgIHByaXZhdGUgZnVuYyBmb3JFYWNoKF8gYmxvY2s6IChfIG5hbWU6IFN0cmluZywgXyB2YWx1ZTogVFNlcmlhbGl6YWJsZSwgXyBpZDogSW50MzIpIHRocm93cyAtPiBWb2lkKSByZXRocm93cyB7CisgICAgLy8gTWlycm9yIHRoZSBvYmplY3QsIGdldHRpbmcgKG5hbWU6IFN0cmluZz8sIHZhbHVlOiBBbnkpIGZvciBldmVyeSBwcm9wZXJ0eQorICAgIGxldCBtaXJyb3IgPSBNaXJyb3IocmVmbGVjdGluZzogc2VsZikKKyAgICAKKyAgICAvLyBJdGVyYXRlIHRocm91Z2ggYWxsIGNoaWxkcmVuLCBpZ25vcmUgZW1wdHkgcHJvcGVydHkgbmFtZXMKKyAgICBmb3IgKHByb3BOYW1lLCBwcm9wVmFsdWUpIGluIG1pcnJvci5jaGlsZHJlbiB7CisgICAgICBndWFyZCBsZXQgcHJvcE5hbWUgPSBwcm9wTmFtZSBlbHNlIHsgY29udGludWUgfQorCisgICAgICBpZiBsZXQgdHZhbCA9IHVud3JhcChhbnk6IHByb3BWYWx1ZSkgYXM/IFRTZXJpYWxpemFibGUsIGxldCBpZCA9IFNlbGYuZmllbGRJZHNbcHJvcE5hbWVdIHsKKyAgICAgICAgdHJ5IGJsb2NrKHByb3BOYW1lLCB0dmFsLCBpZCkKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgCisgIAorICAvLy8gQW55IGNhbiBteXN0ZXJpb3VzbHkgYmUgYW4gT3B0aW9uYWw8QW55PiBhdCB0aGUgc2FtZSB0aW1lLAorICAvLy8gdGhpcyBjaGVja3MgYW5kIGFsd2F5cyByZXR1cm5zIE9wdGlvbmFsPEFueT4gd2l0aG91dCBkb3VibGUgd3JhcHBpbmcKKyAgLy8vIHdlIHRoZW4gdHJ5IHRvIGJpbmQgdmFsdWUgYXMgVFNlcmlhbGl6YWJsZSB0byBpZ25vcmUgYW55IGV4dGVuc2lvbiBwcm9wZXJ0aWVzCisgIC8vLyBhbmQgdGhlIGxpa2UgYW5kIHZlcmlmeSB0aGUgcHJvcGVydHkgZXhpc3RzIGFuZCBncmFiIHRoZSBUaHJpZnQKKyAgLy8vIHByb3BlcnR5IElEIGF0IHRoZSBzYW1lIHRpbWUKKyAgLy8vCisgIC8vLyAtIHBhcmFtZXRlciBhbnk6IEFueSBpbnN0YW5jZSB0byBhdHRlbXB0IHRvIHVud3JhcAorICAvLy8KKyAgLy8vIC0gcmV0dXJuczogVW53cmFwcGVkIEFueSBhcyBPcHRpb25hbDxBbnk+CisgIHByaXZhdGUgZnVuYyB1bndyYXAoYW55OiBBbnkpIC0+IEFueT8geworICAgIGxldCBtaSA9IE1pcnJvcihyZWZsZWN0aW5nOiBhbnkpCisgICAgCisgICAgaWYgbWkuZGlzcGxheVN0eWxlICE9IC5vcHRpb25hbCB7IHJldHVybiBhbnkgfQorICAgIGlmIG1pLmNoaWxkcmVuLmNvdW50ID09IDAgeyByZXR1cm4gbmlsIH0KKyAgICAKKyAgICBsZXQgKF8sIHNvbWUpID0gbWkuY2hpbGRyZW4uZmlyc3QhCisgICAgcmV0dXJuIHNvbWUKKyAgfQorfQorCmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UVHJhbnNwb3J0LnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVFRyYW5zcG9ydC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODJiYmUxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVFRyYW5zcG9ydC5zd2lmdApAQCAtMCwwICsxLDY0IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyogdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitpbXBvcnQgRm91bmRhdGlvbgorCitwdWJsaWMgcHJvdG9jb2wgVFRyYW5zcG9ydCB7CisgIAorICAvLyBSZXF1aXJlZAorICBmdW5jIHJlYWQoc2l6ZTogSW50KSB0aHJvd3MgLT4gRGF0YQorICBmdW5jIHdyaXRlKGRhdGE6IERhdGEpIHRocm93cworICBmdW5jIGZsdXNoKCkgdGhyb3dzCisKKyAgLy8gT3B0aW9uYWwgKGRlZmF1bHQgcHJvdmlkZWQpCisgIGZ1bmMgcmVhZEFsbChzaXplOiBJbnQpIHRocm93cyAtPiBEYXRhCisgIGZ1bmMgaXNPcGVuKCkgdGhyb3dzIC0+IEJvb2wKKyAgZnVuYyBvcGVuKCkgdGhyb3dzCisgIGZ1bmMgY2xvc2UoKSB0aHJvd3MKK30KKworcHVibGljIGV4dGVuc2lvbiBUVHJhbnNwb3J0IHsKKyAgZnVuYyBpc09wZW4oKSB0aHJvd3MgLT4gQm9vbCB7IHJldHVybiB0cnVlIH0KKyAgZnVuYyBvcGVuKCkgdGhyb3dzIHsgfQorICBmdW5jIGNsb3NlKCkgdGhyb3dzIHsgfQorICAKKyAgZnVuYyByZWFkQWxsKHNpemU6IEludCkgdGhyb3dzIC0+IERhdGEgeworICAgIHZhciBidWZmID0gRGF0YSgpCisgICAgdmFyIGhhdmUgPSAwCisgICAgd2hpbGUgaGF2ZSA8IHNpemUgeworICAgICAgbGV0IGNodW5rID0gdHJ5IHNlbGYucmVhZChzaXplOiBzaXplIC0gaGF2ZSkKKyAgICAgIGhhdmUgKz0gY2h1bmsuY291bnQKKyAgICAgIGJ1ZmYuYXBwZW5kKGNodW5rKQorICAgICAgaWYgY2h1bmsuY291bnQgPT0gMCB7CisgICAgICAgIHRocm93IFRUcmFuc3BvcnRFcnJvcihlcnJvcjogLmVuZE9mRmlsZSkKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGJ1ZmYKKyAgfQorfQorCitwdWJsaWMgcHJvdG9jb2wgVEFzeW5jVHJhbnNwb3J0IDogVFRyYW5zcG9ydCB7CisgIC8vIEZhY3RvcnkKKyAgZnVuYyBmbHVzaChfIGNvbXBsZXRpb246IEBlc2NhcGluZyAoVEFzeW5jVHJhbnNwb3J0LCBFcnJvcj8pIC0+KCkpCit9CisKK3B1YmxpYyBwcm90b2NvbCBUQXN5bmNUcmFuc3BvcnRGYWN0b3J5IHsKKyAgYXNzb2NpYXRlZHR5cGUgVHJhbnNwb3J0IDogVEFzeW5jVHJhbnNwb3J0CisgIGZ1bmMgbmV3VHJhbnNwb3J0KCkgLT4gVHJhbnNwb3J0Cit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UVHJhbnNwb3J0RXJyb3Iuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UVHJhbnNwb3J0RXJyb3Iuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZkMDA1OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RUcmFuc3BvcnRFcnJvci5zd2lmdApAQCAtMCwwICsxLDg2IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyogdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitwdWJsaWMgc3RydWN0IFRUcmFuc3BvcnRFcnJvcjogVEVycm9yIHsKKyAgcHVibGljIGVudW0gRXJyb3JDb2RlOiBURXJyb3JDb2RlIHsKKyAgICBjYXNlIHVua25vd24KKyAgICBjYXNlIG5vdE9wZW4KKyAgICBjYXNlIGFscmVhZHlPcGVuCisgICAgY2FzZSB0aW1lZE91dAorICAgIGNhc2UgZW5kT2ZGaWxlCisgICAgY2FzZSBuZWdhdGl2ZVNpemUKKyAgICBjYXNlIHNpemVMaW1pdChsaW1pdDogSW50LCBnb3Q6IEludCkKKyAgICAKKyAgICBwdWJsaWMgdmFyIHRocmlmdEVycm9yQ29kZTogSW50IHsKKyAgICAgIHN3aXRjaCBzZWxmIHsKKyAgICAgIGNhc2UgLnVua25vd246ICAgICAgcmV0dXJuIDAKKyAgICAgIGNhc2UgLm5vdE9wZW46ICAgICAgcmV0dXJuIDEKKyAgICAgIGNhc2UgLmFscmVhZHlPcGVuOiAgcmV0dXJuIDIKKyAgICAgIGNhc2UgLnRpbWVkT3V0OiAgICAgcmV0dXJuIDMKKyAgICAgIGNhc2UgLmVuZE9mRmlsZTogICAgcmV0dXJuIDQKKyAgICAgIGNhc2UgLm5lZ2F0aXZlU2l6ZTogcmV0dXJuIDUKKyAgICAgIGNhc2UgLnNpemVMaW1pdDogICAgcmV0dXJuIDYKKyAgICAgIH0KKyAgICB9CisgICAgcHVibGljIHZhciBkZXNjcmlwdGlvbjogU3RyaW5nIHsKKyAgICAgIHN3aXRjaCBzZWxmIHsKKyAgICAgIGNhc2UgLnVua25vd246ICAgICAgcmV0dXJuICJVbmtub3duIFRUcmFuc3BvcnRFcnJvciIKKyAgICAgIGNhc2UgLm5vdE9wZW46ICAgICAgcmV0dXJuICJOb3QgT3BlbiIKKyAgICAgIGNhc2UgLmFscmVhZHlPcGVuOiAgcmV0dXJuICJBbHJlYWR5IE9wZW4iCisgICAgICBjYXNlIC50aW1lZE91dDogICAgIHJldHVybiAiVGltZWQgT3V0IgorICAgICAgY2FzZSAuZW5kT2ZGaWxlOiAgICByZXR1cm4gIkVuZCBPZiBGaWxlIgorICAgICAgY2FzZSAubmVnYXRpdmVTaXplOiByZXR1cm4gIk5lZ2F0aXZlIFNpemUiCisgICAgICBjYXNlIC5zaXplTGltaXQobGV0IGxpbWl0LCBsZXQgZ290KToKKyAgICAgICAgcmV0dXJuICJNZXNzYWdlIGV4Y2VlZHMgc2l6ZSBsaW1pdCBvZiBcKGxpbWl0KSAocmVjZWl2ZWQ6IFwoZ290KSIKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcHVibGljIHZhciBlcnJvcjogRXJyb3JDb2RlID0gLnVua25vd24KKyAgcHVibGljIHZhciBtZXNzYWdlOiBTdHJpbmc/ID0gbmlsCisgIHB1YmxpYyBzdGF0aWMgdmFyIGRlZmF1bHRDYXNlOiBFcnJvckNvZGUgeyByZXR1cm4gLnVua25vd24gfQorICAKKyAgcHVibGljIGluaXQoKSB7IH0KKworfQorCisvLy8gVEhUVFBUcmFuc3BvcnRFcnJvcgorLy8vCisvLy8gRXJyb3IncyB0aHJvd24gb24gSFRUUCBUcmFuc3BvcnQKK3B1YmxpYyBzdHJ1Y3QgVEhUVFBUcmFuc3BvcnRFcnJvcjogVEVycm9yIHsKKyAgcHVibGljIGVudW0gRXJyb3JDb2RlOiBURXJyb3JDb2RlIHsKKyAgICBjYXNlIGludmFsaWRSZXNwb25zZQorICAgIGNhc2UgaW52YWxpZFN0YXR1cyhzdGF0dXNDb2RlOiBJbnQpCisgICAgY2FzZSBhdXRoZW50aWNhdGlvbgorICAgIAorICAgIHB1YmxpYyB2YXIgZGVzY3JpcHRpb246IFN0cmluZyB7CisgICAgICBzd2l0Y2ggc2VsZiB7CisgICAgICBjYXNlIC5pbnZhbGlkUmVzcG9uc2U6ICAgICAgICAgICAgICAgIHJldHVybiAiSW52YWxpZCBIVFRQIFJlc3BvbnNlIgorICAgICAgY2FzZSAuaW52YWxpZFN0YXR1cyhsZXQgc3RhdHVzQ29kZSk6ICByZXR1cm4gIkludmFsaWQgSFRUUCBTdGF0dXMgQ29kZSAoXChzdGF0dXNDb2RlKSkiCisgICAgICBjYXNlIC5hdXRoZW50aWNhdGlvbjogICAgICAgICAgICAgICAgIHJldHVybiAiQXV0aGVudGljYXRpb24gRXJyb3IiCisgICAgICB9CisgICAgfQorICAgIHB1YmxpYyB2YXIgdGhyaWZ0RXJyb3JDb2RlOiBJbnQgeyByZXR1cm4gMCB9CisgIH0KKyAgcHVibGljIHZhciBlcnJvcjogRXJyb3JDb2RlID0gLmludmFsaWRSZXNwb25zZQorICBwdWJsaWMgdmFyIG1lc3NhZ2U6IFN0cmluZz8gPSBuaWwKKyAgcHVibGljIHN0YXRpYyB2YXIgZGVmYXVsdENhc2U6IEVycm9yQ29kZSB7IHJldHVybiAuaW52YWxpZFJlc3BvbnNlIH0KKyAgCisgIHB1YmxpYyBpbml0KCkgeyB9Cit9CisKZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RXcmFwcGVkUHJvdG9jb2wuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UV3JhcHBlZFByb3RvY29sLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlODU3N2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UV3JhcHBlZFByb3RvY29sLnN3aWZ0CkBAIC0wLDAgKzEsMjA4IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyogdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitpbXBvcnQgRm91bmRhdGlvbiAvLyBGb3IgKE5TKURhdGEKKworCisvLy8gR2VuZXJpYyBwcm90b2NvbCwgaW1wbGVtZW50ZXMgVFByb3RvY29sIGFuZCB3cmFwcyBhIGNvbmNyZXRlIHByb3RvY29sLgorLy8vIFVzZWZ1bCBmb3IgZ2VuZXJpY2FsbHkgc3ViY2xhc3NpbmcgcHJvdG9jb2xzIHRvIG92ZXJyaWRlIHNwZWNpZmljIG1ldGhvZHMgCisvLy8gKGkuZS4gVE11bHRpcGxleGVkUHJvdG9jb2wpCitvcGVuIGNsYXNzIFRXcmFwcGVkUHJvdG9jb2w8UHJvdG9jb2w6IFRQcm90b2NvbD4gOiBUUHJvdG9jb2wgeworICB2YXIgY29uY3JldGVQcm90b2NvbDogUHJvdG9jb2wKKyAgCisgIHB1YmxpYyB2YXIgdHJhbnNwb3J0OiBUVHJhbnNwb3J0IHsKKyAgICBnZXQgeworICAgICAgcmV0dXJuIGNvbmNyZXRlUHJvdG9jb2wudHJhbnNwb3J0CisgICAgfQorICAgIHNldCB7CisgICAgICBjb25jcmV0ZVByb3RvY29sLnRyYW5zcG9ydCA9IG5ld1ZhbHVlCisgICAgfQorICB9CisKKyAgcHVibGljIHJlcXVpcmVkIGluaXQob24gdHJhbnNwb3J0OiBUVHJhbnNwb3J0KSB7CisgICAgc2VsZi5jb25jcmV0ZVByb3RvY29sID0gUHJvdG9jb2wob246IHRyYW5zcG9ydCkKKyAgfQorICAKKyAgLy8gUmVhZCBtZXRob2RzCisgIAorICBwdWJsaWMgZnVuYyByZWFkTWVzc2FnZUJlZ2luKCkgdGhyb3dzIC0+IChTdHJpbmcsIFRNZXNzYWdlVHlwZSwgSW50MzIpIHsKKyAgICByZXR1cm4gdHJ5IGNvbmNyZXRlUHJvdG9jb2wucmVhZE1lc3NhZ2VCZWdpbigpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRNZXNzYWdlRW5kKCkgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC5yZWFkTWVzc2FnZUVuZCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRTdHJ1Y3RCZWdpbigpIHRocm93cyAtPiBTdHJpbmcgeworICAgIHJldHVybiB0cnkgY29uY3JldGVQcm90b2NvbC5yZWFkU3RydWN0QmVnaW4oKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkU3RydWN0RW5kKCkgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC5yZWFkU3RydWN0RW5kKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZEZpZWxkQmVnaW4oKSB0aHJvd3MgLT4gKFN0cmluZywgVFR5cGUsIEludDMyKSB7CisgICAgcmV0dXJuIHRyeSBjb25jcmV0ZVByb3RvY29sLnJlYWRGaWVsZEJlZ2luKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZEZpZWxkRW5kKCkgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC5yZWFkRmllbGRFbmQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkTWFwQmVnaW4oKSB0aHJvd3MgLT4gKFRUeXBlLCBUVHlwZSwgSW50MzIpIHsKKyAgICByZXR1cm4gdHJ5IGNvbmNyZXRlUHJvdG9jb2wucmVhZE1hcEJlZ2luKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZE1hcEVuZCgpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wucmVhZE1hcEVuZCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRTZXRCZWdpbigpIHRocm93cyAtPiAoVFR5cGUsIEludDMyKSB7CisgICAgcmV0dXJuIHRyeSBjb25jcmV0ZVByb3RvY29sLnJlYWRTZXRCZWdpbigpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRTZXRFbmQoKSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLnJlYWRTZXRFbmQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkTGlzdEJlZ2luKCkgdGhyb3dzIC0+IChUVHlwZSwgSW50MzIpIHsKKyAgICByZXR1cm4gdHJ5IGNvbmNyZXRlUHJvdG9jb2wucmVhZExpc3RCZWdpbigpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRMaXN0RW5kKCkgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC5yZWFkTGlzdEVuZCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gU3RyaW5nIHsKKyAgICByZXR1cm4gdHJ5IGNvbmNyZXRlUHJvdG9jb2wucmVhZCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gQm9vbCB7CisgICAgcmV0dXJuIHRyeSBjb25jcmV0ZVByb3RvY29sLnJlYWQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IFVJbnQ4IHsKKyAgICByZXR1cm4gdHJ5IGNvbmNyZXRlUHJvdG9jb2wucmVhZCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gSW50MTYgeworICAgIHJldHVybiB0cnkgY29uY3JldGVQcm90b2NvbC5yZWFkKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBJbnQzMiB7CisgICAgcmV0dXJuIHRyeSBjb25jcmV0ZVByb3RvY29sLnJlYWQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IEludDY0IHsKKyAgICByZXR1cm4gdHJ5IGNvbmNyZXRlUHJvdG9jb2wucmVhZCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gRG91YmxlIHsKKyAgICByZXR1cm4gdHJ5IGNvbmNyZXRlUHJvdG9jb2wucmVhZCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gRGF0YSB7CisgICAgcmV0dXJuIHRyeSBjb25jcmV0ZVByb3RvY29sLnJlYWQoKQorICB9CisgIAorICAvLyBXcml0ZSBtZXRob2RzCisgIAorICBwdWJsaWMgZnVuYyB3cml0ZU1lc3NhZ2VCZWdpbihuYW1lOiBTdHJpbmcsIHR5cGUgbWVzc2FnZVR5cGU6IFRNZXNzYWdlVHlwZSwgc2VxdWVuY2VJRDogSW50MzIpIHRocm93cyB7CisgICAgcmV0dXJuIHRyeSBjb25jcmV0ZVByb3RvY29sLndyaXRlTWVzc2FnZUJlZ2luKG5hbWU6IG5hbWUsIHR5cGU6IG1lc3NhZ2VUeXBlLCBzZXF1ZW5jZUlEOiBzZXF1ZW5jZUlEKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZU1lc3NhZ2VFbmQoKSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlU3RydWN0QmVnaW4obmFtZTogU3RyaW5nKSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLndyaXRlU3RydWN0QmVnaW4obmFtZTogbmFtZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVTdHJ1Y3RFbmQoKSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLndyaXRlU3RydWN0RW5kKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVGaWVsZEJlZ2luKG5hbWU6IFN0cmluZywgdHlwZSBmaWVsZFR5cGU6IFRUeXBlLCBmaWVsZElEOiBJbnQzMikgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC53cml0ZUZpZWxkQmVnaW4obmFtZTogbmFtZSwgdHlwZTogZmllbGRUeXBlLCBmaWVsZElEOiBmaWVsZElEKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZUZpZWxkU3RvcCgpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wud3JpdGVGaWVsZFN0b3AoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZUZpZWxkRW5kKCkgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC53cml0ZUZpZWxkRW5kKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVNYXBCZWdpbihrZXlUeXBlOiBUVHlwZSwgdmFsdWVUeXBlOiBUVHlwZSwgc2l6ZTogSW50MzIpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wud3JpdGVNYXBCZWdpbihrZXlUeXBlOiBrZXlUeXBlLCB2YWx1ZVR5cGU6IHZhbHVlVHlwZSwgc2l6ZTogc2l6ZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVNYXBFbmQoKSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLndyaXRlTWFwRW5kKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVTZXRCZWdpbihlbGVtZW50VHlwZTogVFR5cGUsIHNpemU6IEludDMyKSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLndyaXRlU2V0QmVnaW4oZWxlbWVudFR5cGU6IGVsZW1lbnRUeXBlLCBzaXplOiBzaXplKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZVNldEVuZCgpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wud3JpdGVTZXRFbmQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZUxpc3RCZWdpbihlbGVtZW50VHlwZTogVFR5cGUsIHNpemU6IEludDMyKSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLndyaXRlTGlzdEJlZ2luKGVsZW1lbnRUeXBlOiBlbGVtZW50VHlwZSwgc2l6ZTogc2l6ZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVMaXN0RW5kKCkgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC53cml0ZUxpc3RFbmQoKQorICB9CisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IFN0cmluZykgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC53cml0ZSh2YWx1ZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogQm9vbCkgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC53cml0ZSh2YWx1ZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogVUludDgpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wud3JpdGUodmFsdWUpCisgIH0KKworICBwdWJsaWMgZnVuYyB3cml0ZShfIHZhbHVlOiBJbnQxNikgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC53cml0ZSh2YWx1ZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogSW50MzIpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wud3JpdGUodmFsdWUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IEludDY0KSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLndyaXRlKHZhbHVlKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZShfIHZhbHVlOiBEb3VibGUpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wud3JpdGUodmFsdWUpCisgIH0KKworICBwdWJsaWMgZnVuYyB3cml0ZShfIGRhdGE6IERhdGEpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wud3JpdGUoZGF0YSkKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVGhyaWZ0LnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVGhyaWZ0LnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViZDE3NTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UaHJpZnQuc3dpZnQKQEAgLTAsMCArMSwzIEBACitjbGFzcyBUaHJpZnQgeworCWxldCB2ZXJzaW9uID0gIjEuMS4wIgorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1Rlc3RzL0xpbnV4TWFpbi5zd2lmdCBiL2xpYi9zd2lmdC9UZXN0cy9MaW51eE1haW4uc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg4ZmVjOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9UZXN0cy9MaW51eE1haW4uc3dpZnQKQEAgLTAsMCArMSw4IEBACitpbXBvcnQgWENUZXN0CitAdGVzdGFibGUgaW1wb3J0IFRocmlmdFRlc3RzCisKK1hDVE1haW4oWworICAgICB0ZXN0Q2FzZShUaHJpZnRUZXN0cy5hbGxUZXN0cyksCisgICAgIHRlc3RDYXNlKFRCaW5hcnlQcm90b2NvbFRlc3RzLmFsbFRlc3RzKSwKKyAgICAgdGVzdENhc2UoVENvbXBhY3RQcm90b2NvbFRlc3RzLmFsbFRlc3RzKSwKK10pCmRpZmYgLS1naXQgYS9saWIvc3dpZnQvVGVzdHMvVGhyaWZ0VGVzdHMvVEJpbmFyeVByb3RvY29sVGVzdHMuc3dpZnQgYi9saWIvc3dpZnQvVGVzdHMvVGhyaWZ0VGVzdHMvVEJpbmFyeVByb3RvY29sVGVzdHMuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZhNTU3MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9UZXN0cy9UaHJpZnRUZXN0cy9UQmluYXJ5UHJvdG9jb2xUZXN0cy5zd2lmdApAQCAtMCwwICsxLDE2OCBAQAorLy8KKy8vICBUQmluYXJ5UHJvdG9jb2xUZXN0cy5zd2lmdAorLy8gIFRocmlmdAorLy8KKy8vICBDcmVhdGVkIGJ5IENocmlzdG9waGVyIFNpbXBzb24gb24gOC8xOC8xNi4KKy8vCisvLworCitpbXBvcnQgWENUZXN0CitpbXBvcnQgRm91bmRhdGlvbgorQHRlc3RhYmxlIGltcG9ydCBUaHJpZnQKKworCisvLy8gVGVzdGluZyBCaW5hcnkgcHJvdG9jb2wgcmVhZC93cml0ZSBhZ2FpbnN0IGl0c2VsZgorLy8vIFVzZXMgc2VwYXJhdGUgcmVhZC93cml0ZSB0cmFuc3BvcnQvcHJvdG9jb2xzIAorY2xhc3MgVEJpbmFyeVByb3RvY29sVGVzdHM6IFhDVGVzdENhc2UgeworICB2YXIgdHJhbnNwb3J0OiBUTWVtb3J5QnVmZmVyVHJhbnNwb3J0ID0gVE1lbW9yeUJ1ZmZlclRyYW5zcG9ydChmbHVzaEhhbmRsZXI6IHsKKyAgICAkMC5yZXNldChyZWFkQnVmZmVyOiAkMSkKKyAgfSkKKyAgCisgIHZhciBwcm90bzogVEJpbmFyeVByb3RvY29sIQorICAKKyAgb3ZlcnJpZGUgZnVuYyBzZXRVcCgpIHsKKyAgICBzdXBlci5zZXRVcCgpCisgICAgcHJvdG8gPSBUQmluYXJ5UHJvdG9jb2wob246IHRyYW5zcG9ydCkKKyAgICB0cmFuc3BvcnQucmVzZXQoKQorICB9CisgIAorICBvdmVycmlkZSBmdW5jIHRlYXJEb3duKCkgeworICAgIHN1cGVyLnRlYXJEb3duKCkKKyAgICB0cmFuc3BvcnQucmVzZXQoKQorICB9CisgIAorICBmdW5jIHRlc3RJbnQ4V3JpdGVSZWFkKCkgeworICAgIGxldCB3cml0ZVZhbDogVUludDggPSAyNTAKKyAgICB0cnk/IHByb3RvLndyaXRlKHdyaXRlVmFsKQorICAgIHRyeT8gdHJhbnNwb3J0LmZsdXNoKCkKKworICAgIGxldCByZWFkVmFsOiBVSW50OCA9ICh0cnk/IHByb3RvLnJlYWQoKSkgPz8gMAorICAgIFhDVEFzc2VydEVxdWFsKHdyaXRlVmFsLCByZWFkVmFsLCAiRXJyb3Igd2l0aCBVSW50OCwgd3JvdGUgXCh3cml0ZVZhbCkgYnV0IHJlYWQgXChyZWFkVmFsKSIpCisgIH0KKyAgCisgIGZ1bmMgdGVzdEludDE2V3JpdGVSZWFkKCkgeworCisgICAgbGV0IHdyaXRlVmFsOiBJbnQxNiA9IDEyMzEyCisgICAgdHJ5PyBwcm90by53cml0ZSh3cml0ZVZhbCkKKyAgICB0cnk/IHRyYW5zcG9ydC5mbHVzaCgpCisgICAgbGV0IHJlYWRWYWw6IEludDE2ID0gKHRyeT8gcHJvdG8ucmVhZCgpKSA/PyAwCisgICAgWENUQXNzZXJ0RXF1YWwod3JpdGVWYWwsIHJlYWRWYWwsICJFcnJvciB3aXRoIEludDE2LCB3cm90ZSBcKHdyaXRlVmFsKSBidXQgcmVhZCBcKHJlYWRWYWwpIikKKyAgfQorICAKKyAgZnVuYyB0ZXN0SW50MzJXcml0ZVJlYWQoKSB7CisgICAgbGV0IHdyaXRlVmFsOiBJbnQzMiA9IDIwMjkyMzQKKyAgICB0cnk/IHByb3RvLndyaXRlKHdyaXRlVmFsKQorICAgIHRyeT8gdHJhbnNwb3J0LmZsdXNoKCkKKworICAgIGxldCByZWFkVmFsOiBJbnQzMiA9ICh0cnk/IHByb3RvLnJlYWQoKSkgPz8gMAorICAgIFhDVEFzc2VydEVxdWFsKHdyaXRlVmFsLCByZWFkVmFsLCAiRXJyb3Igd2l0aCBJbnQzMiwgd3JvdGUgXCh3cml0ZVZhbCkgYnV0IHJlYWQgXChyZWFkVmFsKSIpCisgIH0KKyAgCisgIGZ1bmMgdGVzdEludDY0V3JpdGVSZWFkKCkgeworICAgIGxldCB3cml0ZVZhbDogSW50NjQgPSAyMzQyMzQ5ODEzNzQxMzQKKyAgICB0cnk/IHByb3RvLndyaXRlKHdyaXRlVmFsKQorICAgIHRyeT8gdHJhbnNwb3J0LmZsdXNoKCkKKworICAgIGxldCByZWFkVmFsOiBJbnQ2NCA9ICh0cnk/IHByb3RvLnJlYWQoKSkgPz8gMAorICAgIFhDVEFzc2VydEVxdWFsKHdyaXRlVmFsLCByZWFkVmFsLCAiRXJyb3Igd2l0aCBJbnQ2NCwgd3JvdGUgXCh3cml0ZVZhbCkgYnV0IHJlYWQgXChyZWFkVmFsKSIpCisgIH0KKyAgCisgIGZ1bmMgdGVzdERvdWJsZVdyaXRlUmVhZCgpIHsKKyAgICBsZXQgd3JpdGVWYWw6IERvdWJsZSA9IDMuMTQxNTkyNgorICAgIHRyeT8gcHJvdG8ud3JpdGUod3JpdGVWYWwpCisgICAgdHJ5PyB0cmFuc3BvcnQuZmx1c2goKQorCisgICAgbGV0IHJlYWRWYWw6IERvdWJsZSA9ICh0cnk/IHByb3RvLnJlYWQoKSkgPz8gMC4wCisgICAgWENUQXNzZXJ0RXF1YWwod3JpdGVWYWwsIHJlYWRWYWwsICJFcnJvciB3aXRoIERvdWJsZSwgd3JvdGUgXCh3cml0ZVZhbCkgYnV0IHJlYWQgXChyZWFkVmFsKSIpCisgIH0KKyAgCisgIGZ1bmMgdGVzdEJvb2xXcml0ZVJlYWQoKSB7CisgICAgbGV0IHdyaXRlVmFsOiBCb29sID0gdHJ1ZQorICAgIHRyeT8gcHJvdG8ud3JpdGUod3JpdGVWYWwpCisgICAgdHJ5PyB0cmFuc3BvcnQuZmx1c2goKQorCisgICAgbGV0IHJlYWRWYWw6IEJvb2wgPSAodHJ5PyBwcm90by5yZWFkKCkpID8/IGZhbHNlCisgICAgWENUQXNzZXJ0RXF1YWwod3JpdGVWYWwsIHJlYWRWYWwsICJFcnJvciB3aXRoIEJvb2wsIHdyb3RlIFwod3JpdGVWYWwpIGJ1dCByZWFkIFwocmVhZFZhbCkiKQorICB9CisgIAorICBmdW5jIHRlc3RTdHJpbmdXcml0ZVJlYWQoKSB7CisgICAgbGV0IHdyaXRlVmFsOiBTdHJpbmcgPSAiSGVsbG8gV29ybGQiCisgICAgdHJ5PyBwcm90by53cml0ZSh3cml0ZVZhbCkKKyAgICB0cnk/IHRyYW5zcG9ydC5mbHVzaCgpCisKKyAgICBsZXQgcmVhZFZhbDogU3RyaW5nIQorICAgIGRvIHsKKyAgICAgIHJlYWRWYWwgPSB0cnkgcHJvdG8ucmVhZCgpCisgICAgfSBjYXRjaCBsZXQgZXJyb3IgeworICAgICAgWENUQXNzZXJ0RmFsc2UodHJ1ZSwgIkVycm9yIHJlYWRpbmcgXChlcnJvcikiKQorICAgICAgcmV0dXJuCisgICAgfQorICAgIAorICAgIFhDVEFzc2VydEVxdWFsKHdyaXRlVmFsLCByZWFkVmFsLCAiRXJyb3Igd2l0aCBTdHJpbmcsIHdyb3RlIFwod3JpdGVWYWwpIGJ1dCByZWFkIFwocmVhZFZhbCkiKQorICB9CisgIAorICBmdW5jIHRlc3REYXRhV3JpdGVSZWFkKCkgeworICAgIGxldCB3cml0ZVZhbDogRGF0YSA9ICJEYXRhIFdvcmxkIi5kYXRhKHVzaW5nOiAudXRmOCkhCisgICAgdHJ5PyBwcm90by53cml0ZSh3cml0ZVZhbCkKKyAgICB0cnk/IHRyYW5zcG9ydC5mbHVzaCgpCisKKyAgICBsZXQgcmVhZFZhbDogRGF0YSA9ICh0cnk/IHByb3RvLnJlYWQoKSkgPz8gIkdvb2RieWUgV29ybGQiLmRhdGEodXNpbmc6IC51dGY4KSEKKyAgICBYQ1RBc3NlcnRFcXVhbCh3cml0ZVZhbCwgcmVhZFZhbCwgIkVycm9yIHdpdGggRGF0YSwgd3JvdGUgXCh3cml0ZVZhbCkgYnV0IHJlYWQgXChyZWFkVmFsKSIpCisgIH0KKyAgCisgIGZ1bmMgdGVzdFN0cnVjdFdyaXRlUmVhZCgpIHsKKyAgICBsZXQgbXNnID0gIlRlc3QgUHJvdG9jb2wgRXJyb3IiCisgICAgbGV0IHdyaXRlVmFsID0gVEFwcGxpY2F0aW9uRXJyb3IoZXJyb3I6IC5wcm90b2NvbEVycm9yLCBtZXNzYWdlOiBtc2cpCisgICAgZG8geworICAgICAgdHJ5IHdyaXRlVmFsLndyaXRlKHRvOiBwcm90bykKKyAgICAgIHRyeT8gdHJhbnNwb3J0LmZsdXNoKCkKKworICAgIH0gY2F0Y2ggbGV0IGVycm9yIHsKKyAgICAgIFhDVEFzc2VydEZhbHNlKHRydWUsICJDYXVnaHQgRXJyb3IgYXR0ZW1wdGluZyB0byB3cml0ZSBcKGVycm9yKSIpCisgICAgfQorICAgIAorICAgIGRvIHsKKyAgICAgIGxldCByZWFkVmFsID0gdHJ5IFRBcHBsaWNhdGlvbkVycm9yLnJlYWQoZnJvbTogcHJvdG8pCisgICAgICBYQ1RBc3NlcnRFcXVhbChyZWFkVmFsLmVycm9yLnRocmlmdEVycm9yQ29kZSwgd3JpdGVWYWwuZXJyb3IudGhyaWZ0RXJyb3JDb2RlLCAiRXJyb3IgY2FzZSBtaXNtYXRjaCwgZXhwZWN0ZWQgXChyZWFkVmFsLmVycm9yKSBnb3QgXCh3cml0ZVZhbC5lcnJvcikiKQorICAgICAgWENUQXNzZXJ0RXF1YWwocmVhZFZhbC5tZXNzYWdlLCB3cml0ZVZhbC5tZXNzYWdlLCAiRXJyb3IgbWVzc2FnZSBtaXNtYXRjaCwgZXhwZWN0ZWQgXChyZWFkVmFsLm1lc3NhZ2UpIGdvdCBcKHdyaXRlVmFsLm1lc3NhZ2UpIikKKyAgICB9IGNhdGNoIGxldCBlcnJvciB7CisgICAgICBYQ1RBc3NlcnRGYWxzZSh0cnVlLCAiQ2F1Z2h0IEVycm9yIGF0dGVtcHRpbmcgdG8gcmVhZCBcKGVycm9yKSIpCisgICAgfQorICB9CisgIGZ1bmMgdGVzdFVuc2FmZUJpdGNhc3RVcGRhdGUoKSB7CisgICAgbGV0IHZhbHVlOiBEb3VibGUgPSAzLjE0MTU5CisgICAgbGV0IHZhbDogSW50NjQgPSAzMTQxNTkyNgorICAgIGxldCB1dmFsOiBVSW50NjQgPSAzMTQxNTkyNgorICAgIAorICAgIGxldCBpNjQgPSBJbnQ2NChiaXRQYXR0ZXJuOiB2YWx1ZS5iaXRQYXR0ZXJuKQorICAgIGxldCB1YmMgPSB1bnNhZmVCaXRDYXN0KHZhbHVlLCB0bzogSW50NjQuc2VsZikKKyAgICAKKyAgICBYQ1RBc3NlcnRFcXVhbChpNjQsIHViYywgIkJpdGNhc3QgRG91YmxlLT4gaTY0IFZhbHVlcyBkb24ndCBtYXRjaCIpCisgICAgCisgICAgbGV0IGRibCA9IERvdWJsZShiaXRQYXR0ZXJuOiBVSW50NjQodmFsKSkKKyAgICBsZXQgdWJkYiA9IHVuc2FmZUJpdENhc3QodmFsLCB0bzogRG91YmxlLnNlbGYpCisgICAgCisgICAgWENUQXNzZXJ0RXF1YWwoZGJsLCB1YmRiLCAiQml0Y2FzdCBpNjQgLT4gRG91YmxlIFZhbHVlcyBkb24ndCBtYXRjaCIpCisgICAgCisgICAgbGV0IGRiMiA9IERvdWJsZShiaXRQYXR0ZXJuOiB1dmFsKQorICAgIGxldCB1c2JjMiA9IHVuc2FmZUJpdENhc3QodXZhbCwgdG86IERvdWJsZS5zZWxmKQorICAgIAorICAgIFhDVEFzc2VydEVxdWFsKGRiMiwgdXNiYzIsICJCaXRjYXN0IHU2NCAtPiBEb3VibGUgVmFsdWVzIGRvbid0IG1hdGNoIikKKworICAgIAorICB9CisgIAorICBzdGF0aWMgdmFyIGFsbFRlc3RzIDogWyhTdHJpbmcsIChUQmluYXJ5UHJvdG9jb2xUZXN0cykgLT4gKCkgdGhyb3dzIC0+IFZvaWQpXSB7CisgICAgcmV0dXJuIFsKKyAgICAgICgidGVzdEludDhXcml0ZVJlYWQiLCB0ZXN0SW50OFdyaXRlUmVhZCksCisgICAgICAoInRlc3RJbnQxNldyaXRlUmVhZCIsIHRlc3RJbnQxNldyaXRlUmVhZCksCisgICAgICAoInRlc3RJbnQzMldyaXRlUmVhZCIsIHRlc3RJbnQzMldyaXRlUmVhZCksCisgICAgICAoInRlc3RJbnQ2NFdyaXRlUmVhZCIsIHRlc3RJbnQ2NFdyaXRlUmVhZCksCisgICAgICAoInRlc3REb3VibGVXcml0ZVJlYWQiLCB0ZXN0RG91YmxlV3JpdGVSZWFkKSwKKyAgICAgICgidGVzdEJvb2xXcml0ZVJlYWQiLCB0ZXN0Qm9vbFdyaXRlUmVhZCksCisgICAgICAoInRlc3RTdHJpbmdXcml0ZVJlYWQiLCB0ZXN0U3RyaW5nV3JpdGVSZWFkKSwKKyAgICAgICgidGVzdERhdGFXcml0ZVJlYWQiLCB0ZXN0RGF0YVdyaXRlUmVhZCksCisgICAgICAoInRlc3RTdHJ1Y3RXcml0ZVJlYWQiLCB0ZXN0U3RydWN0V3JpdGVSZWFkKQorICAgIF0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1Rlc3RzL1RocmlmdFRlc3RzL1RDb21wYWN0UHJvdG9jb2xUZXN0cy5zd2lmdCBiL2xpYi9zd2lmdC9UZXN0cy9UaHJpZnRUZXN0cy9UQ29tcGFjdFByb3RvY29sVGVzdHMuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgyYzI2MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9UZXN0cy9UaHJpZnRUZXN0cy9UQ29tcGFjdFByb3RvY29sVGVzdHMuc3dpZnQKQEAgLTAsMCArMSwyMTAgQEAKKy8vCisvLyAgVENvbXBhY3RQcm90b2NvbFRlc3RzLnN3aWZ0CisvLyAgVGhyaWZ0CisvLworLy8gIENyZWF0ZWQgYnkgQ2hyaXN0b3BoZXIgU2ltcHNvbiBvbiA4LzE5LzE2LgorLy8KKy8vCisKK2ltcG9ydCBYQ1Rlc3QKK2ltcG9ydCBGb3VuZGF0aW9uCitAdGVzdGFibGUgaW1wb3J0IFRocmlmdAorCisKKy8vLyBUZXN0aW5nIEJpbmFyeSBwcm90b2NvbCByZWFkL3dyaXRlIGFnYWluc3QgaXRzZWxmCisvLy8gVXNlcyBzZXBhcmF0ZSByZWFkL3dyaXRlIHRyYW5zcG9ydC9wcm90b2NvbHMKK2NsYXNzIFRDb21wYWN0UHJvdG9jb2xUZXN0czogWENUZXN0Q2FzZSB7CisgIHZhciB0cmFuc3BvcnQ6IFRNZW1vcnlCdWZmZXJUcmFuc3BvcnQgPSBUTWVtb3J5QnVmZmVyVHJhbnNwb3J0KGZsdXNoSGFuZGxlcjogeworICAgICQwLnJlc2V0KHJlYWRCdWZmZXI6ICQxKQorICB9KQorICB2YXIgcHJvdG86IFRDb21wYWN0UHJvdG9jb2whCisgIAorICBvdmVycmlkZSBmdW5jIHNldFVwKCkgeworICAgIHN1cGVyLnNldFVwKCkKKyAgICBwcm90byA9IFRDb21wYWN0UHJvdG9jb2wob246IHRyYW5zcG9ydCkKKyAgICB0cmFuc3BvcnQucmVzZXQoKQorICB9CisgIAorICBvdmVycmlkZSBmdW5jIHRlYXJEb3duKCkgeworICAgIHN1cGVyLnRlYXJEb3duKCkKKyAgICB0cmFuc3BvcnQucmVzZXQoKQorICB9CisgIAorICBmdW5jIHRlc3RJbnQ4V3JpdGVSZWFkKCkgeworICAgIGxldCB3cml0ZVZhbDogVUludDggPSAyNTAKKyAgICB0cnk/IHByb3RvLndyaXRlKHdyaXRlVmFsKQorICAgIHRyeT8gdHJhbnNwb3J0LmZsdXNoKCkKKyAgICBsZXQgcmVhZFZhbDogVUludDggPSAodHJ5PyBwcm90by5yZWFkKCkpID8/IDAKKyAgICBYQ1RBc3NlcnRFcXVhbCh3cml0ZVZhbCwgcmVhZFZhbCwgIkVycm9yIHdpdGggVUludDgsIHdyb3RlIFwod3JpdGVWYWwpIGJ1dCByZWFkIFwocmVhZFZhbCkiKQorICB9CisgIAorICBmdW5jIHRlc3RJbnQxNldyaXRlUmVhZCgpIHsKKyAgICBsZXQgd3JpdGVWYWw6IEludDE2ID0gMTIzMTIKKyAgICB0cnk/IHByb3RvLndyaXRlKHdyaXRlVmFsKQorICAgIHRyeT8gdHJhbnNwb3J0LmZsdXNoKCkKKworICAgIGxldCByZWFkVmFsOiBJbnQxNiA9ICh0cnk/IHByb3RvLnJlYWQoKSkgPz8gMAorICAgIFhDVEFzc2VydEVxdWFsKHdyaXRlVmFsLCByZWFkVmFsLCAiRXJyb3Igd2l0aCBJbnQxNiwgd3JvdGUgXCh3cml0ZVZhbCkgYnV0IHJlYWQgXChyZWFkVmFsKSIpCisgIH0KKyAgCisgIGZ1bmMgdGVzdEludDMyV3JpdGVSZWFkKCkgeworICAgIGxldCB3cml0ZVZhbDogSW50MzIgPSAyMDI5MjM0CisgICAgdHJ5PyBwcm90by53cml0ZSh3cml0ZVZhbCkKKyAgICB0cnk/IHRyYW5zcG9ydC5mbHVzaCgpCisKKyAgICBsZXQgcmVhZFZhbDogSW50MzIgPSAodHJ5PyBwcm90by5yZWFkKCkpID8/IDAKKyAgICBYQ1RBc3NlcnRFcXVhbCh3cml0ZVZhbCwgcmVhZFZhbCwgIkVycm9yIHdpdGggSW50MzIsIHdyb3RlIFwod3JpdGVWYWwpIGJ1dCByZWFkIFwocmVhZFZhbCkiKQorICB9CisgIAorICBmdW5jIHRlc3RJbnQ2NFdyaXRlUmVhZCgpIHsKKyAgICBsZXQgd3JpdGVWYWw6IEludDY0ID0gMjM0MjM0OTgxMzc0MTM0CisgICAgdHJ5PyBwcm90by53cml0ZSh3cml0ZVZhbCkKKyAgICB0cnk/IHRyYW5zcG9ydC5mbHVzaCgpCisKKyAgICBsZXQgcmVhZFZhbDogSW50NjQgPSAodHJ5PyBwcm90by5yZWFkKCkpID8/IDAKKyAgICBYQ1RBc3NlcnRFcXVhbCh3cml0ZVZhbCwgcmVhZFZhbCwgIkVycm9yIHdpdGggSW50NjQsIHdyb3RlIFwod3JpdGVWYWwpIGJ1dCByZWFkIFwocmVhZFZhbCkiKQorICB9CisgIAorICBmdW5jIHRlc3REb3VibGVXcml0ZVJlYWQoKSB7CisgICAgbGV0IHdyaXRlVmFsOiBEb3VibGUgPSAzLjE0MTU5MjYKKyAgICB0cnk/IHByb3RvLndyaXRlKHdyaXRlVmFsKQorICAgIHRyeT8gdHJhbnNwb3J0LmZsdXNoKCkKKworICAgIGxldCByZWFkVmFsOiBEb3VibGUgPSAodHJ5PyBwcm90by5yZWFkKCkpID8/IDAuMAorICAgIFhDVEFzc2VydEVxdWFsKHdyaXRlVmFsLCByZWFkVmFsLCAiRXJyb3Igd2l0aCBEb3VibGUsIHdyb3RlIFwod3JpdGVWYWwpIGJ1dCByZWFkIFwocmVhZFZhbCkiKQorICB9CisgIAorICBmdW5jIHRlc3RCb29sV3JpdGVSZWFkKCkgeworICAgIGxldCB3cml0ZVZhbDogQm9vbCA9IHRydWUKKyAgICB0cnk/IHByb3RvLndyaXRlKHdyaXRlVmFsKQorICAgIHRyeT8gdHJhbnNwb3J0LmZsdXNoKCkKKworICAgIGxldCByZWFkVmFsOiBCb29sID0gKHRyeT8gcHJvdG8ucmVhZCgpKSA/PyBmYWxzZQorICAgIFhDVEFzc2VydEVxdWFsKHdyaXRlVmFsLCByZWFkVmFsLCAiRXJyb3Igd2l0aCBCb29sLCB3cm90ZSBcKHdyaXRlVmFsKSBidXQgcmVhZCBcKHJlYWRWYWwpIikKKyAgfQorICAKKyAgZnVuYyB0ZXN0U3RyaW5nV3JpdGVSZWFkKCkgeworICAgIGxldCB3cml0ZVZhbDogU3RyaW5nID0gIkhlbGxvIFdvcmxkIgorICAgIHRyeT8gcHJvdG8ud3JpdGUod3JpdGVWYWwpCisgICAgdHJ5PyB0cmFuc3BvcnQuZmx1c2goKQorCisgICAgbGV0IHJlYWRWYWw6IFN0cmluZyEKKyAgICBkbyB7CisgICAgICByZWFkVmFsID0gdHJ5IHByb3RvLnJlYWQoKQorICAgIH0gY2F0Y2ggbGV0IGVycm9yIHsKKyAgICAgIFhDVEFzc2VydEZhbHNlKHRydWUsICJFcnJvciByZWFkaW5nIFwoZXJyb3IpIikKKyAgICAgIHJldHVybgorICAgIH0KKyAgICAKKyAgICBYQ1RBc3NlcnRFcXVhbCh3cml0ZVZhbCwgcmVhZFZhbCwgIkVycm9yIHdpdGggU3RyaW5nLCB3cm90ZSBcKHdyaXRlVmFsKSBidXQgcmVhZCBcKHJlYWRWYWwpIikKKyAgfQorICAKKyAgZnVuYyB0ZXN0RGF0YVdyaXRlUmVhZCgpIHsKKyAgICBsZXQgd3JpdGVWYWw6IERhdGEgPSAiRGF0YSBXb3JsZCIuZGF0YSh1c2luZzogLnV0ZjgpIQorICAgIHRyeT8gcHJvdG8ud3JpdGUod3JpdGVWYWwpCisgICAgdHJ5PyB0cmFuc3BvcnQuZmx1c2goKQorCisgICAgbGV0IHJlYWRWYWw6IERhdGEgPSAodHJ5PyBwcm90by5yZWFkKCkpID8/ICJHb29kYnllIFdvcmxkIi5kYXRhKHVzaW5nOiAudXRmOCkhCisgICAgWENUQXNzZXJ0RXF1YWwod3JpdGVWYWwsIHJlYWRWYWwsICJFcnJvciB3aXRoIERhdGEsIHdyb3RlIFwod3JpdGVWYWwpIGJ1dCByZWFkIFwocmVhZFZhbCkiKQorICB9CisgIAorICBmdW5jIHRlc3RTdHJ1Y3RXcml0ZVJlYWQoKSB7CisgICAgbGV0IG1zZyA9ICJUZXN0IFByb3RvY29sIEVycm9yIgorICAgIGxldCB3cml0ZVZhbCA9IFRBcHBsaWNhdGlvbkVycm9yKGVycm9yOiAucHJvdG9jb2xFcnJvciwgbWVzc2FnZTogbXNnKQorICAgIGRvIHsKKyAgICAgIHRyeSB3cml0ZVZhbC53cml0ZSh0bzogcHJvdG8pCisgICAgICB0cnkgdHJhbnNwb3J0LmZsdXNoKCkKKworICAgIH0gY2F0Y2ggbGV0IGVycm9yIHsKKyAgICAgIFhDVEFzc2VydEZhbHNlKHRydWUsICJDYXVnaHQgRXJyb3IgYXR0ZW1wdGluZyB0byB3cml0ZSBcKGVycm9yKSIpCisgICAgfQorICAgIAorICAgIGRvIHsKKyAgICAgIGxldCByZWFkVmFsID0gdHJ5IFRBcHBsaWNhdGlvbkVycm9yLnJlYWQoZnJvbTogcHJvdG8pCisgICAgICBYQ1RBc3NlcnRFcXVhbChyZWFkVmFsLmVycm9yLnRocmlmdEVycm9yQ29kZSwgd3JpdGVWYWwuZXJyb3IudGhyaWZ0RXJyb3JDb2RlLCAiRXJyb3IgY2FzZSBtaXNtYXRjaCwgZXhwZWN0ZWQgXChyZWFkVmFsLmVycm9yKSBnb3QgXCh3cml0ZVZhbC5lcnJvcikiKQorICAgICAgWENUQXNzZXJ0RXF1YWwocmVhZFZhbC5tZXNzYWdlLCB3cml0ZVZhbC5tZXNzYWdlLCAiRXJyb3IgbWVzc2FnZSBtaXNtYXRjaCwgZXhwZWN0ZWQgXChyZWFkVmFsLm1lc3NhZ2UpIGdvdCBcKHdyaXRlVmFsLm1lc3NhZ2UpIikKKyAgICB9IGNhdGNoIGxldCBlcnJvciB7CisgICAgICBYQ1RBc3NlcnRGYWxzZSh0cnVlLCAiQ2F1Z2h0IEVycm9yIGF0dGVtcHRpbmcgdG8gcmVhZCBcKGVycm9yKSIpCisgICAgfQorICB9CisgIAorICBmdW5jIHRlc3RJbnQzMlppZ1phZygpIHsKKyAgICBsZXQgemVybzogSW50MzIgPSAwCisgICAgbGV0IG9uZTogSW50MzIgPSAxCisgICAgbGV0IG5PbmU6IEludDMyID0gLTEKKyAgICBsZXQgdHdvOiBJbnQzMiA9IDIKKyAgICBsZXQgblR3bzogSW50MzIgPSAtMgorICAgIGxldCBtYXggPSBJbnQzMi5tYXgKKyAgICBsZXQgbWluID0gSW50MzIubWluCisKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by5pMzJUb1ppZ1phZyh6ZXJvKSwgVUludDMyKDApLCAiRXJyb3IgMzJiaXQgemlnemFnIG9uIFwoemVybykiKQorICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLnppZ1phZ1RvaTMyKDApLCB6ZXJvLCAiRXJyb3IgMzJiaXQgemlnemFnIG9uIFwoemVybykiKQorCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uaTMyVG9aaWdaYWcobk9uZSksIFVJbnQzMigxKSwgIkVycm9yIDMyYml0IHppZ3phZyBvbiBcKG5PbmUpIikKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by56aWdaYWdUb2kzMigxKSwgbk9uZSwgIkVycm9yIDMyYml0IHppZ3phZyBvbiBcKG5PbmUpIikKKworICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLmkzMlRvWmlnWmFnKG9uZSksIFVJbnQzMigyKSwgIkVycm9yIDMyYml0IHppZ3phZyBvbiBcKG9uZSkiKQorICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLnppZ1phZ1RvaTMyKDIpLCBvbmUsICJFcnJvciAzMmJpdCB6aWd6YWcgb24gXChvbmUpIikKKworICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLmkzMlRvWmlnWmFnKG5Ud28pLCBVSW50MzIoMyksICJFcnJvciAzMmJpdCB6aWd6YWcgb24gXChuVHdvKSIpCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uemlnWmFnVG9pMzIoMyksIG5Ud28sICJFcnJvciAzMmJpdCB6aWd6YWcgb24gXChuVHdvKSIpCisKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by5pMzJUb1ppZ1phZyh0d28pLCBVSW50MzIoNCksICJFcnJvciAzMmJpdCB6aWd6YWcgb24gXCh0d28pIikKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by56aWdaYWdUb2kzMig0KSwgdHdvLCAiRXJyb3IgMzJiaXQgemlnemFnIG9uIFwodHdvKSIpCisKKyAgICBsZXQgdU1heE1pbnVzT25lOiBVSW50MzIgPSBVSW50MzIubWF4IC0gMQorICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLmkzMlRvWmlnWmFnKG1heCksIHVNYXhNaW51c09uZSwgIkVycm9yIDMyYml0IHppZ3phZyBvbiBcKG1heCkiKQorICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLnppZ1phZ1RvaTMyKHVNYXhNaW51c09uZSksIG1heCwgIkVycm9yIDMyYml0IHppZ3phZyBvbiBcKG1heCkiKQorCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uaTMyVG9aaWdaYWcobWluKSwgVUludDMyLm1heCwgIkVycm9yIDMyYml0IHppZ3phZyBvbiBcKG1pbikiKQorICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLnppZ1phZ1RvaTMyKFVJbnQzMi5tYXgpLCBtaW4sICJFcnJvciAzMmJpdCB6aWd6YWcgb24gXChtaW4pIikKKyAgfQorCisgIGZ1bmMgdGVzdEludDY0WmlnWmFnKCkgeworICAgIGxldCB6ZXJvOiBJbnQ2NCA9IDAKKyAgICBsZXQgb25lOiBJbnQ2NCA9IDEKKyAgICBsZXQgbk9uZTogSW50NjQgPSAtMQorICAgIGxldCB0d286IEludDY0ID0gMgorICAgIGxldCBuVHdvOiBJbnQ2NCA9IC0yCisgICAgbGV0IG1heCA9IEludDY0Lm1heAorICAgIGxldCBtaW4gPSBJbnQ2NC5taW4KKworICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLmk2NFRvWmlnWmFnKHplcm8pLCBVSW50NjQoMCksICJFcnJvciA2NGJpdCB6aWd6YWcgb24gXCh6ZXJvKSIpCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uemlnWmFnVG9pNjQoMCksIHplcm8sICJFcnJvciA2NGJpdCB6aWd6YWcgb24gXCh6ZXJvKSIpCisKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by5pNjRUb1ppZ1phZyhuT25lKSwgVUludDY0KDEpLCAiRXJyb3IgNjRiaXQgemlnemFnIG9uIFwobk9uZSkiKQorICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLnppZ1phZ1RvaTY0KDEpLCBuT25lLCAiRXJyb3IgNjRiaXQgemlnemFnIG9uIFwobk9uZSkiKQorCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uaTY0VG9aaWdaYWcob25lKSwgVUludDY0KDIpLCAiRXJyb3IgNjRiaXQgemlnemFnIG9uIFwob25lKSIpCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uemlnWmFnVG9pNjQoMiksIG9uZSwgIkVycm9yIDY0Yml0IHppZ3phZyBvbiBcKG9uZSkiKQorCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uaTY0VG9aaWdaYWcoblR3byksIFVJbnQ2NCgzKSwgIkVycm9yIDY0Yml0IHppZ3phZyBvbiBcKG5Ud28pIikKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by56aWdaYWdUb2k2NCgzKSwgblR3bywgIkVycm9yIDY0Yml0IHppZ3phZyBvbiBcKG5Ud28pIikKKworICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLmk2NFRvWmlnWmFnKHR3byksIFVJbnQ2NCg0KSwgIkVycm9yIDY0Yml0IHppZ3phZyBvbiBcKHR3bykiKQorICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLnppZ1phZ1RvaTY0KDQpLCB0d28sICJFcnJvciA2NGJpdCB6aWd6YWcgb24gXCh0d28pIikKKworICAgIGxldCB1TWF4TWludXNPbmU6IFVJbnQ2NCA9IFVJbnQ2NC5tYXggLSAxCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uaTY0VG9aaWdaYWcobWF4KSwgdU1heE1pbnVzT25lLCAiRXJyb3IgNjRiaXQgemlnemFnIG9uIFwobWF4KSIpCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uemlnWmFnVG9pNjQodU1heE1pbnVzT25lKSwgbWF4LCAiRXJyb3IgNjRiaXQgemlnemFnIG9uIFwobWF4KSIpCisKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by5pNjRUb1ppZ1phZyhtaW4pLCBVSW50NjQubWF4LCAiRXJyb3IgNjRiaXQgemlnemFnIG9uIFwobWluKSIpCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uemlnWmFnVG9pNjQoVUludDY0Lm1heCksIG1pbiwgIkVycm9yIDY0Yml0IHppZ3phZyBvbiBcKG1pbikiKQorICB9CisgIAorICBzdGF0aWMgdmFyIGFsbFRlc3RzIDogWyhTdHJpbmcsIChUQ29tcGFjdFByb3RvY29sVGVzdHMpIC0+ICgpIHRocm93cyAtPiBWb2lkKV0geworICAgIHJldHVybiBbCisgICAgICAoInRlc3RJbnQ4V3JpdGVSZWFkIiwgdGVzdEludDhXcml0ZVJlYWQpLAorICAgICAgKCJ0ZXN0SW50MTZXcml0ZVJlYWQiLCB0ZXN0SW50MTZXcml0ZVJlYWQpLAorICAgICAgKCJ0ZXN0SW50MzJXcml0ZVJlYWQiLCB0ZXN0SW50MzJXcml0ZVJlYWQpLAorICAgICAgKCJ0ZXN0SW50NjRXcml0ZVJlYWQiLCB0ZXN0SW50NjRXcml0ZVJlYWQpLAorICAgICAgKCJ0ZXN0RG91YmxlV3JpdGVSZWFkIiwgdGVzdERvdWJsZVdyaXRlUmVhZCksCisgICAgICAoInRlc3RCb29sV3JpdGVSZWFkIiwgdGVzdEJvb2xXcml0ZVJlYWQpLAorICAgICAgKCJ0ZXN0U3RyaW5nV3JpdGVSZWFkIiwgdGVzdFN0cmluZ1dyaXRlUmVhZCksCisgICAgICAoInRlc3REYXRhV3JpdGVSZWFkIiwgdGVzdERhdGFXcml0ZVJlYWQpLAorICAgICAgKCJ0ZXN0U3RydWN0V3JpdGVSZWFkIiwgdGVzdFN0cnVjdFdyaXRlUmVhZCksCisgICAgICAoInRlc3RJbnQzMlppZ1phZyIsIHRlc3RJbnQzMlppZ1phZyksCisgICAgICAoInRlc3RJbnQ2NFppZ1phZyIsIHRlc3RJbnQ2NFppZ1phZykKKyAgICBdCisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9UZXN0cy9UaHJpZnRUZXN0cy9UaHJpZnRUZXN0cy5zd2lmdCBiL2xpYi9zd2lmdC9UZXN0cy9UaHJpZnRUZXN0cy9UaHJpZnRUZXN0cy5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzE2MTAwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1Rlc3RzL1RocmlmdFRlc3RzL1RocmlmdFRlc3RzLnN3aWZ0CkBAIC0wLDAgKzEsMTggQEAKK2ltcG9ydCBYQ1Rlc3QKK0B0ZXN0YWJsZSBpbXBvcnQgVGhyaWZ0CisKK2NsYXNzIFRocmlmdFRlc3RzOiBYQ1Rlc3RDYXNlIHsKKyAgZnVuYyB0ZXN0VmVyc2lvbigpIHsKKyAgICBYQ1RBc3NlcnRFcXVhbChUaHJpZnQoKS52ZXJzaW9uLCAiMS4xLjAiKQorICB9CisKKyAgZnVuYyB0ZXN0X2luX2FkZHJfZXh0ZW5zaW9uKCkgeworCisgIH0KKworICBzdGF0aWMgdmFyIGFsbFRlc3RzIDogWyhTdHJpbmcsIChUaHJpZnRUZXN0cykgLT4gKCkgdGhyb3dzIC0+IFZvaWQpXSB7CisgICAgcmV0dXJuIFsKKyAgICAgICgidGVzdFZlcnNpb24iLCB0ZXN0VmVyc2lvbiksCisgICAgXQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvdHMvdGhyaWZ0LmQudHMgYi9saWIvdHMvdGhyaWZ0LmQudHMKaW5kZXggN2M1YjllNC4uMGJhNDZjOSAxMDA2NDQKLS0tIGEvbGliL3RzL3RocmlmdC5kLnRzCisrKyBiL2xpYi90cy90aHJpZnQuZC50cwpAQCAtMzA0LDcgKzMwNCw3IEBACiAgICAgICovCiAgICAgY29uc3RydWN0b3IodXJsOiBzdHJpbmcpOwogCi0gICAgX19yZXNldCh1cmwpOiB2b2lkOworICAgIF9fcmVzZXQodXJsOiBzdHJpbmcpOiB2b2lkOwogCiAgICAgLyoqCiAgICAgICogU2VuZHMgdGhlIGN1cnJlbnQgV1MgcmVxdWVzdCBhbmQgcmVnaXN0ZXJzIGNhbGxiYWNrLiBUaGUgYXN5bmMgCkBAIC02OTQsNiArNjk0LDYgQEAKICAgICAgKiBAcGFyYW0ge1RocmlmdC5TZXJ2aWNlQ2xpZW50fSBTQ2wgLSBUaGUgU2VydmljZSBDbGllbnQgQ2xhc3MuCiAgICAgICogQHBhcmFtIHtUaHJpZnQuVHJhbnNwb3J0fSB0cmFuc3BvcnQgLSBUaHJpZnQuVHJhbnNwb3J0IGluc3RhbmNlIHdoaWNoIHByb3ZpZGVzIHJlbW90ZSBob3N0OnBvcnQuCiAgICAgICovCi0gICAgY3JlYXRlQ2xpZW50KHNlcnZpY2VOYW1lOiBzdHJpbmcsIFNDbDogYW55LCB0cmFuc3BvcnQ6IE9iamVjdCk7CisgICAgY3JlYXRlQ2xpZW50KHNlcnZpY2VOYW1lOiBzdHJpbmcsIFNDbDogYW55LCB0cmFuc3BvcnQ6IE9iamVjdCk6IGFueTsKICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL2xpYi94bWwvTWFrZWZpbGUuYW0gYi9saWIveG1sL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjYWQ2YmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIveG1sL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMjkgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitTVUJESVJTID0KKworaWYgV0lUSF9KQVZBCisjIFNjaGVtYSB2YWxpZGF0aW9uIHRlc3QgZGVwZW5kcyBvbiBqYXZhCitTVUJESVJTICs9IHRlc3QKK2VuZGlmCisKK0VYVFJBX0RJU1QgPSBcCisgIHRocmlmdC1pZGwueHNkIFwKKyAgdGVzdApkaWZmIC0tZ2l0IGEvbGliL3htbC90ZXN0L01ha2VmaWxlLmFtIGIvbGliL3htbC90ZXN0L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiODdhNTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIveG1sL3Rlc3QvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwyNiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2NoZWNrOgorCSQoQU5UKSAkKEFOVF9GTEFHUykgdGVzdAorCisjIE1ha2Ugc3VyZSB0aGlzIGRvZXNuJ3QgZmFpbCBpZiBhbnQgaXMgbm90IGNvbmZpZ3VyZWQuCitjbGVhbi1sb2NhbDoKKwlBTlQ9JChBTlQpIDsgaWYgdGVzdCAteiAiJCRBTlQiIDsgdGhlbiBBTlQ9OiA7IGZpIDsgXAorCSQkQU5UICQoQU5UX0ZMQUdTKSBjbGVhbgpkaWZmIC0tZ2l0IGEvbGliL3htbC90ZXN0L2J1aWxkLnhtbCBiL2xpYi94bWwvdGVzdC9idWlsZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBlOTVjZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi94bWwvdGVzdC9idWlsZC54bWwKQEAgLTAsMCArMSwxMTIgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCBuYW1lPSJYTUwgU2NoZW1hIFRlc3QiIGRlZmF1bHQ9InRlc3QiIGJhc2VkaXI9Ii4iPgorCisgIDxkZXNjcmlwdGlvbj5YTUwgU2NoZW1hIFZhbGlkYXRpb24gVGVzdDwvZGVzY3JpcHRpb24+CisKKyAgPHByb3BlcnR5IG5hbWU9InhtbC5kaXIiIGxvY2F0aW9uPSIke2Jhc2VkaXJ9Ly4uIiAvPgorICA8cHJvcGVydHkgbmFtZT0iZ2VuLnhtbC5kaXIiIGxvY2F0aW9uPSIke2Jhc2VkaXJ9Ly4uL2dlbi14bWwiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJpZGwueG1sLnNjaGVtYSIgbG9jYXRpb249IiR7eG1sLmRpcn0vdGhyaWZ0LWlkbC54c2QiIC8+CisKKyAgPHByb3BlcnR5IG5hbWU9InRocmlmdC5kaXIiIGxvY2F0aW9uPSIuLi8uLi8uLi8iIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJ0aHJpZnQudGVzdC5kaXIiIGxvY2F0aW9uPSIke3RocmlmdC5kaXJ9L3Rlc3QiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJ0aHJpZnQuY29tcGlsZXIiIGxvY2F0aW9uPSIke3RocmlmdC5kaXJ9L2NvbXBpbGVyL2NwcC90aHJpZnQiIC8+CisKKyAgPHByb3BlcnR5IGZpbGU9IiR7YmFzZWRpcn0vYnVpbGQucHJvcGVydGllcyIgLz4KKworICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGVyLmNoZWNrIj4KKyAgICA8ZmFpbD4KKyAgICAgIDxjb25kaXRpb24+CisgICAgICAgIDxub3Q+CisgICAgICAgICAgPHJlc291cmNlY291bnQgY291bnQ9IjEiPgorICAgICAgICAgICAgPGZpbGVzZXQgaWQ9ImZzIiBmaWxlPSIke3RocmlmdC5jb21waWxlcn0iLz4KKyAgICAgICAgICA8L3Jlc291cmNlY291bnQ+CisgICAgICAgIDwvbm90PgorICAgICAgPC9jb25kaXRpb24+CisgICAgICBUaHJpZnQgY29tcGlsZXIgaXMgbWlzc2luZyAhCisgICAgPC9mYWlsPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImluaXQiIGRlcGVuZHM9ImNvbXBpbGVyLmNoZWNrLCBta2RpcnMiPgorICAgIDx0c3RhbXAgLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJta2RpcnMiPgorICAgIDxta2RpciBkaXI9IiR7Z2VuLnhtbC5kaXJ9Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZ2VuZXJhdGUiIGRlcGVuZHM9ImluaXQiPgorICAgIDxnZW5lcmF0ZS14bWwgZmlsZT0iJHt0aHJpZnQudGVzdC5kaXJ9L1RocmlmdFRlc3QudGhyaWZ0Ii8+CisgICAgPGdlbmVyYXRlLXhtbCBmaWxlPSIke3RocmlmdC50ZXN0LmRpcn0vSW5jbHVkZS50aHJpZnQiLz4KKyAgICA8Z2VuZXJhdGUteG1sIGZpbGU9IiR7dGhyaWZ0LnRlc3QuZGlyfS9SZWN1cnNpdmUudGhyaWZ0Ii8+CisgICAgPGdlbmVyYXRlLXhtbCBmaWxlPSIke3RocmlmdC50ZXN0LmRpcn0vTWFueU9wdGlvbmFscy50aHJpZnQiLz4KKyAgICA8Z2VuZXJhdGUteG1sIGZpbGU9IiR7dGhyaWZ0LnRlc3QuZGlyfS9PcHRpb25hbFJlcXVpcmVkVGVzdC50aHJpZnQiLz4KKyAgICA8Z2VuZXJhdGUteG1sIGZpbGU9IiR7dGhyaWZ0LnRlc3QuZGlyfS9Db25zdGFudHNEZW1vLnRocmlmdCIvPgorICAgIDxnZW5lcmF0ZS14bWwgZmlsZT0iJHt0aHJpZnQudGVzdC5kaXJ9L1R5cGVkZWZUZXN0LnRocmlmdCIgLz4KKyAgICA8Z2VuZXJhdGUteG1sIGZpbGU9IiR7dGhyaWZ0LnRlc3QuZGlyfS9Bbm5vdGF0aW9uVGVzdC50aHJpZnQiIC8+CisgICAgPGdlbmVyYXRlLXhtbCBmaWxlPSIke3RocmlmdC50ZXN0LmRpcn0vRG9jVGVzdC50aHJpZnQiIC8+CisgICAgPGdlbmVyYXRlLXhtbCBmaWxlPSIke3RocmlmdC50ZXN0LmRpcn0vRW51bVRlc3QudGhyaWZ0IiAvPgorICAgIDxnZW5lcmF0ZS14bWwgZmlsZT0iJHt0aHJpZnQudGVzdC5kaXJ9L01hbnlUeXBlZGVmcy50aHJpZnQiIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdCIgZGVzY3JpcHRpb249InJ1biBzY2hlbWEgdmFsaWRhdGlvbiIKKyAgICAgICAgICBkZXBlbmRzPSJ2YWxpZGF0ZS1nZW5lcmF0ZWQteG1sIi8+CisgICAgCisgIDx0YXJnZXQgbmFtZT0idmFsaWRhdGUtZ2VuZXJhdGVkLXhtbCIgZGVwZW5kcz0iaW5pdCwgZ2VuZXJhdGUiPgorICAgIDx2YWxpZGF0ZS14bWwgZmlsZT0iJHtnZW4ueG1sLmRpcn0vVGhyaWZ0VGVzdC54bWwiLz4KKyAgICA8dmFsaWRhdGUteG1sIGZpbGU9IiR7Z2VuLnhtbC5kaXJ9L0luY2x1ZGUueG1sIi8+CisgICAgPHZhbGlkYXRlLXhtbCBmaWxlPSIke2dlbi54bWwuZGlyfS9SZWN1cnNpdmUueG1sIi8+CisgICAgPHZhbGlkYXRlLXhtbCBmaWxlPSIke2dlbi54bWwuZGlyfS9NYW55T3B0aW9uYWxzLnhtbCIvPgorICAgIDx2YWxpZGF0ZS14bWwgZmlsZT0iJHtnZW4ueG1sLmRpcn0vT3B0aW9uYWxSZXF1aXJlZFRlc3QueG1sIi8+CisgICAgPHZhbGlkYXRlLXhtbCBmaWxlPSIke2dlbi54bWwuZGlyfS9Db25zdGFudHNEZW1vLnhtbCIvPgorICAgIDx2YWxpZGF0ZS14bWwgZmlsZT0iJHtnZW4ueG1sLmRpcn0vVHlwZWRlZlRlc3QueG1sIi8+CisgICAgPHZhbGlkYXRlLXhtbCBmaWxlPSIke2dlbi54bWwuZGlyfS9Bbm5vdGF0aW9uVGVzdC54bWwiLz4KKyAgICA8dmFsaWRhdGUteG1sIGZpbGU9IiR7Z2VuLnhtbC5kaXJ9L0RvY1Rlc3QueG1sIi8+CisgICAgPHZhbGlkYXRlLXhtbCBmaWxlPSIke2dlbi54bWwuZGlyfS9FbnVtVGVzdC54bWwiLz4KKyAgICA8dmFsaWRhdGUteG1sIGZpbGU9IiR7Z2VuLnhtbC5kaXJ9L01hbnlUeXBlZGVmcy54bWwiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJjbGVhbiI+CisgICAgPGRlbGV0ZSBkaXI9IiR7YnVpbGQuZGlyfSIgLz4KKyAgICA8ZGVsZXRlIGRpcj0iJHtnZW4ueG1sLmRpcn0iIC8+CisgIDwvdGFyZ2V0PgorCisgIDxtYWNyb2RlZiBuYW1lPSJnZW5lcmF0ZS14bWwiPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmlsZSIgLz4KKyAgICA8c2VxdWVudGlhbD4KKyAgICAgIDxleGVjIGV4ZWN1dGFibGU9IiR7dGhyaWZ0LmNvbXBpbGVyfSIgZmFpbG9uZXJyb3I9InRydWUiPgorICAgICAgICA8YXJnIGxpbmU9Ii1nZW4geG1sOm1lcmdlIi8+CisgICAgICAgIDxhcmcgbGluZT0iLW91dCAke2dlbi54bWwuZGlyfSIvPgorICAgICAgICA8YXJnIGxpbmU9IkB7ZmlsZX0iLz4KKyAgICAgIDwvZXhlYz4KKyAgICA8L3NlcXVlbnRpYWw+CisgIDwvbWFjcm9kZWY+CisKKyAgPG1hY3JvZGVmIG5hbWU9InZhbGlkYXRlLXhtbCI+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJmaWxlIiAvPgorICAgIDxzZXF1ZW50aWFsPgorICAgICAgPGVjaG8gbWVzc2FnZT0idmFsaWRhdGluZyBnZW5lcmF0ZWQgWE1MOiBAe2ZpbGV9IiAvPgorICAgICAgPHNjaGVtYXZhbGlkYXRlIGZpbGU9IkB7ZmlsZX0iPgorICAgICAgICA8c2NoZW1hIG5hbWVzcGFjZT0iaHR0cDovL3RocmlmdC5hcGFjaGUub3JnL3htbC9pZGwiIAorICAgICAgICAgICAgICAgIGZpbGU9IiR7aWRsLnhtbC5zY2hlbWF9IiAvPgorICAgICAgPC9zY2hlbWF2YWxpZGF0ZT4KKyAgICA8L3NlcXVlbnRpYWw+CisgIDwvbWFjcm9kZWY+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2xpYi94bWwvdGhyaWZ0LWlkbC54c2QgYi9saWIveG1sL3RocmlmdC1pZGwueHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZGQ2OTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIveG1sL3RocmlmdC1pZGwueHNkCkBAIC0wLDAgKzEsMjgzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHNjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCisgICAgICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3RocmlmdC5hcGFjaGUub3JnL3htbC9pZGwiIAorICAgICAgICB4bWxuczp0bnM9Imh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy94bWwvaWRsIiAKKyAgICAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgorCisgIDxlbGVtZW50IG5hbWU9ImlkbCIgdHlwZT0idG5zOklETCIgLz4KKyAgPGVsZW1lbnQgbmFtZT0iZG9jdW1lbnQiIHR5cGU9InRuczpEb2N1bWVudCIgLz4KKworICA8Y29tcGxleFR5cGUgbmFtZT0iSURMIj4KKyAgICA8c2VxdWVuY2U+CisgICAgICA8ZWxlbWVudCByZWY9InRuczpkb2N1bWVudCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgIDwvc2VxdWVuY2U+CisgIDwvY29tcGxleFR5cGU+CisKKyAgPGNvbXBsZXhUeXBlIG5hbWU9IkRvY3VtZW50Ij4KKyAgICA8c2VxdWVuY2U+CisgICAgICA8Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICAgICAgICA8ZWxlbWVudCBuYW1lPSJpbmNsdWRlIiB0eXBlPSJ0bnM6SW5jbHVkZSIgLz4KKyAgICAgICAgPGVsZW1lbnQgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJ0bnM6TmFtZXNwYWNlIiAvPgorICAgICAgPC9jaG9pY2U+CisgICAgICA8Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICAgICAgICA8ZWxlbWVudCBuYW1lPSJleGNlcHRpb24iIHR5cGU9InRuczpFeGNlcHRpb24iIC8+CisgICAgICAgIDxlbGVtZW50IG5hbWU9InR5cGVkZWYiIHR5cGU9InRuczpUeXBlZGVmIiAvPgorICAgICAgICA8ZWxlbWVudCBuYW1lPSJzZXJ2aWNlIiB0eXBlPSJ0bnM6U2VydmljZSIgLz4KKyAgICAgICAgPGVsZW1lbnQgbmFtZT0ic3RydWN0IiB0eXBlPSJ0bnM6U3RydWN0IiAvPgorICAgICAgICA8ZWxlbWVudCBuYW1lPSJjb25zdCIgdHlwZT0idG5zOkNvbnN0IiAvPgorICAgICAgICA8ZWxlbWVudCBuYW1lPSJ1bmlvbiIgdHlwZT0idG5zOlVuaW9uIiAvPgorICAgICAgICA8ZWxlbWVudCBuYW1lPSJlbnVtIiB0eXBlPSJ0bnM6RW51bSIgLz4KKyAgICAgIDwvY2hvaWNlPgorICAgIDwvc2VxdWVuY2U+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXROYW1lc3BhY2UiIHR5cGU9ImFueVVSSSIgdXNlPSJvcHRpb25hbCIgLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9ImRvYyIgdHlwZT0ic3RyaW5nIiB1c2U9Im9wdGlvbmFsIiAvPgorICA8L2NvbXBsZXhUeXBlPgorCisgIDxjb21wbGV4VHlwZSBuYW1lPSJJbmNsdWRlIj4KKyAgICA8YXR0cmlidXRlIG5hbWU9ImZpbGUiIHR5cGU9InN0cmluZyIgdXNlPSJvcHRpb25hbCIgLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KKyAgPC9jb21wbGV4VHlwZT4KKworICA8Y29tcGxleFR5cGUgbmFtZT0iTmFtZXNwYWNlIj4KKyAgICA8c2VxdWVuY2U+CisgICAgICA8ZWxlbWVudCBuYW1lPSJhbm5vdGF0aW9uIiB0eXBlPSJ0bnM6QW5ub3RhdGlvbiIgCisgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgorICAgIDwvc2VxdWVuY2U+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0iZG9jIiB0eXBlPSJzdHJpbmciIHVzZT0ib3B0aW9uYWwiIC8+CisgIDwvY29tcGxleFR5cGU+CisKKyAgPGdyb3VwIG5hbWU9IkFic3RyYWN0U3RydWN0Ij4KKyAgICA8c2VxdWVuY2U+CisgICAgICA8ZWxlbWVudCBuYW1lPSJmaWVsZCIgdHlwZT0idG5zOkZpZWxkIiAKKyAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+CisgICAgICA8ZWxlbWVudCBuYW1lPSJhbm5vdGF0aW9uIiB0eXBlPSJ0bnM6QW5ub3RhdGlvbiIgCisgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgorICAgIDwvc2VxdWVuY2U+CisgIDwvZ3JvdXA+CisKKyAgPGF0dHJpYnV0ZUdyb3VwIG5hbWU9IlN0cnVjdEF0dHJpYnV0ZXMiPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0iZG9jIiB0eXBlPSJzdHJpbmciIHVzZT0ib3B0aW9uYWwiIC8+CisgIDwvYXR0cmlidXRlR3JvdXA+CisKKyAgPGNvbXBsZXhUeXBlIG5hbWU9IkV4Y2VwdGlvbiI+CisgICAgPGdyb3VwIHJlZj0idG5zOkFic3RyYWN0U3RydWN0IiAvPgorICAgIDxhdHRyaWJ1dGVHcm91cCByZWY9InRuczpTdHJ1Y3RBdHRyaWJ1dGVzIiAvPgorICA8L2NvbXBsZXhUeXBlPgorCisgIDxjb21wbGV4VHlwZSBuYW1lPSJTZXJ2aWNlIj4KKyAgICA8c2VxdWVuY2U+CisgICAgICA8ZWxlbWVudCBuYW1lPSJtZXRob2QiIHR5cGU9InRuczpNZXRob2QiIAorICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KKyAgICAgIDxlbGVtZW50IG5hbWU9ImFubm90YXRpb24iIHR5cGU9InRuczpBbm5vdGF0aW9uIiAKKyAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+CisgICAgPC9zZXF1ZW5jZT4KKyAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9InRhcmdldE5hbWVzcGFjZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0icGFyZW50LW1vZHVsZSIgdHlwZT0ic3RyaW5nIiB1c2U9Im9wdGlvbmFsIiAvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0icGFyZW50LWlkIiB0eXBlPSJzdHJpbmciIHVzZT0ib3B0aW9uYWwiIC8+IAorICAgIDxhdHRyaWJ1dGUgbmFtZT0iZG9jIiB0eXBlPSJzdHJpbmciIHVzZT0ib3B0aW9uYWwiIC8+CisgIDwvY29tcGxleFR5cGU+CisKKyAgPGNvbXBsZXhUeXBlIG5hbWU9Ik1ldGhvZCI+CisgICAgPHNlcXVlbmNlPgorICAgICAgPGVsZW1lbnQgbmFtZT0icmV0dXJucyIgdHlwZT0idG5zOlRocmlmdFR5cGUiIC8+CisgICAgICA8ZWxlbWVudCBuYW1lPSJhcmciIHR5cGU9InRuczpGaWVsZCIgCisgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgorICAgICAgPGVsZW1lbnQgbmFtZT0idGhyb3dzIiB0eXBlPSJ0bnM6RmllbGQiIAorICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KKyAgICAgIDxlbGVtZW50IG5hbWU9ImFubm90YXRpb24iIHR5cGU9InRuczpBbm5vdGF0aW9uIiAKKyAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+CisgICAgPC9zZXF1ZW5jZT4KKyAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9Im9uZXdheSIgdHlwZT0iYm9vbGVhbiIgdXNlPSJvcHRpb25hbCIgLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9ImRvYyIgdHlwZT0ic3RyaW5nIiB1c2U9Im9wdGlvbmFsIiAvPgorICA8L2NvbXBsZXhUeXBlPgorCisgIDxjb21wbGV4VHlwZSBuYW1lPSJUeXBlZGVmIj4KKyAgICA8Y29tcGxleENvbnRlbnQ+CisgICAgICA8ZXh0ZW5zaW9uIGJhc2U9InRuczpUaHJpZnRUeXBlIj4KKyAgICAgICAgPHNlcXVlbmNlPgorICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImFubm90YXRpb24iIHR5cGU9InRuczpBbm5vdGF0aW9uIiAKKyAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgorICAgICAgICA8L3NlcXVlbmNlPgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkb2MiIHR5cGU9InN0cmluZyIgdXNlPSJvcHRpb25hbCIgLz4KKyAgICAgIDwvZXh0ZW5zaW9uPgorICAgIDwvY29tcGxleENvbnRlbnQ+CisgIDwvY29tcGxleFR5cGU+CisKKyAgPGNvbXBsZXhUeXBlIG5hbWU9IlN0cnVjdCI+CisgICAgPGdyb3VwIHJlZj0idG5zOkFic3RyYWN0U3RydWN0IiAvPgorICAgIDxhdHRyaWJ1dGVHcm91cCByZWY9InRuczpTdHJ1Y3RBdHRyaWJ1dGVzIiAvPgorICA8L2NvbXBsZXhUeXBlPgorCisgIDxjb21wbGV4VHlwZSBuYW1lPSJVbmlvbiI+CisgICAgPGdyb3VwIHJlZj0idG5zOkFic3RyYWN0U3RydWN0IiAvPgorICAgIDxhdHRyaWJ1dGVHcm91cCByZWY9InRuczpTdHJ1Y3RBdHRyaWJ1dGVzIiAvPgorICA8L2NvbXBsZXhUeXBlPgorCisgIDxjb21wbGV4VHlwZSBuYW1lPSJFbnVtIj4KKyAgICA8c2VxdWVuY2U+CisgICAgICA8ZWxlbWVudCBuYW1lPSJtZW1iZXIiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICAgICAgICA8Y29tcGxleFR5cGU+CisgICAgICAgICAgPHNlcXVlbmNlPgorICAgICAgICAgICAgPGVsZW1lbnQgbmFtZT0iYW5ub3RhdGlvbiIgdHlwZT0idG5zOkFubm90YXRpb24iIAorICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KKyAgICAgICAgICA8L3NlcXVlbmNlPgorICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgorICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9ImludCIgLz4KKyAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImV4cGxpY2l0IiB0eXBlPSJib29sZWFuIiAvPgorICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZG9jIiB0eXBlPSJzdHJpbmciIC8+CisgICAgICAgIDwvY29tcGxleFR5cGU+CisgICAgICA8L2VsZW1lbnQ+CisgICAgICA8ZWxlbWVudCBuYW1lPSJhbm5vdGF0aW9uIiB0eXBlPSJ0bnM6QW5ub3RhdGlvbiIgCisgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KKyAgICA8L3NlcXVlbmNlPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0iZG9jIiB0eXBlPSJzdHJpbmciIC8+CisgIDwvY29tcGxleFR5cGU+CisKKyAgPGNvbXBsZXhUeXBlIG5hbWU9IkZpZWxkIj4KKyAgICA8Y29tcGxleENvbnRlbnQ+CisgICAgICA8ZXh0ZW5zaW9uIGJhc2U9InRuczpUaHJpZnRUeXBlIj4KKyAgICAgICAgPHNlcXVlbmNlPgorICAgICAgICAgIDxlbGVtZW50IG5hbWU9ImRlZmF1bHQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIj4KKyAgICAgICAgICAgIDxjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgPGdyb3VwIHJlZj0idG5zOkNvbnN0VmFsdWUiIC8+CisgICAgICAgICAgICA8L2NvbXBsZXhUeXBlPgorICAgICAgICAgIDwvZWxlbWVudD4KKyAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJhbm5vdGF0aW9uIiB0eXBlPSJ0bnM6QW5ub3RhdGlvbiIgCisgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KKyAgICAgICAgPC9zZXF1ZW5jZT4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmaWVsZC1pZCIgdHlwZT0ibG9uZyIgLz4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icmVxdWlyZWQiIHR5cGU9InRuczpSZXF1aXJlZG5lc3MiIC8+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZG9jIiB0eXBlPSJzdHJpbmciIC8+CisgICAgICA8L2V4dGVuc2lvbj4KKyAgICA8L2NvbXBsZXhDb250ZW50PgorICA8L2NvbXBsZXhUeXBlPgorCisgIDxzaW1wbGVUeXBlIG5hbWU9IlJlcXVpcmVkbmVzcyI+CisgICAgPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+CisgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9InJlcXVpcmVkIiAvPgorICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJvcHRpb25hbCIgLz4KKyAgICA8L3Jlc3RyaWN0aW9uPgorICA8L3NpbXBsZVR5cGU+CisKKyAgPGNvbXBsZXhUeXBlIG5hbWU9IkFubm90YXRpb24iPgorICAgIDxhdHRyaWJ1dGUgbmFtZT0ia2V5IiB0eXBlPSJzdHJpbmciIC8+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ic3RyaW5nIiAvPgorICA8L2NvbXBsZXhUeXBlPgorCisgIDxjb21wbGV4VHlwZSBuYW1lPSJDb25zdCI+CisgICAgPGNvbXBsZXhDb250ZW50PgorICAgICAgPGV4dGVuc2lvbiBiYXNlPSJ0bnM6VGhyaWZ0VHlwZSI+CisgICAgICAgIDxzZXF1ZW5jZT4KKyAgICAgICAgICA8Z3JvdXAgcmVmPSJ0bnM6Q29uc3RWYWx1ZSIgLz4KKyAgICAgICAgPC9zZXF1ZW5jZT4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZG9jIiB0eXBlPSJzdHJpbmciIC8+CisgICAgICA8L2V4dGVuc2lvbj4KKyAgICA8L2NvbXBsZXhDb250ZW50PgorICA8L2NvbXBsZXhUeXBlPgorCisgIDxjb21wbGV4VHlwZSBuYW1lPSJDb25zdExpc3QiPgorICAgIDxzZXF1ZW5jZT4KKyAgICAgIDxlbGVtZW50IG5hbWU9ImVudHJ5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKyAgICAgICAgPGNvbXBsZXhUeXBlPgorICAgICAgICAgIDxncm91cCByZWY9InRuczpDb25zdFZhbHVlIiAvPgorICAgICAgICA8L2NvbXBsZXhUeXBlPgorICAgICAgPC9lbGVtZW50PgorICAgIDwvc2VxdWVuY2U+CisgIDwvY29tcGxleFR5cGU+CisKKyAgPGNvbXBsZXhUeXBlIG5hbWU9IkNvbnN0TWFwIj4KKyAgICA8c2VxdWVuY2U+CisgICAgICA8ZWxlbWVudCBuYW1lPSJlbnRyeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisgICAgICAgIDxjb21wbGV4VHlwZT4KKyAgICAgICAgICA8c2VxdWVuY2U+CisgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJrZXkiPgorICAgICAgICAgICAgICA8Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgPGdyb3VwIHJlZj0idG5zOkNvbnN0VmFsdWUiIC8+CisgICAgICAgICAgICAgIDwvY29tcGxleFR5cGU+CisgICAgICAgICAgICA8L2VsZW1lbnQ+CisgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJ2YWx1ZSI+CisgICAgICAgICAgICAgIDxjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICA8Z3JvdXAgcmVmPSJ0bnM6Q29uc3RWYWx1ZSIgLz4KKyAgICAgICAgICAgICAgPC9jb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwvZWxlbWVudD4KKyAgICAgICAgICA8L3NlcXVlbmNlPgorICAgICAgICA8L2NvbXBsZXhUeXBlPgorICAgICAgPC9lbGVtZW50PgorICAgIDwvc2VxdWVuY2U+CisgIDwvY29tcGxleFR5cGU+CisKKyAgPGdyb3VwIG5hbWU9IkNvbnN0VmFsdWUiPgorICAgIDxjaG9pY2U+CisgICAgICA8ZWxlbWVudCBuYW1lPSJzdHJpbmciIHR5cGU9InN0cmluZyIgLz4KKyAgICAgIDxlbGVtZW50IG5hbWU9ImRvdWJsZSIgdHlwZT0iZG91YmxlIiAvPgorICAgICAgPGVsZW1lbnQgbmFtZT0ibGlzdCIgdHlwZT0idG5zOkNvbnN0TGlzdCIgLz4KKyAgICAgIDxlbGVtZW50IG5hbWU9Im1hcCIgdHlwZT0idG5zOkNvbnN0TWFwIiAvPgorICAgICAgPGVsZW1lbnQgbmFtZT0iaW50IiB0eXBlPSJsb25nIiAvPgorICAgIDwvY2hvaWNlPgorICA8L2dyb3VwPgorCisgIDxjb21wbGV4VHlwZSBuYW1lPSJUaHJpZnRUeXBlIj4KKyAgICA8c2VxdWVuY2U+CisgICAgICA8Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIj4KKyAgICAgICAgPGVsZW1lbnQgbmFtZT0iZWxlbVR5cGUiIHR5cGU9InRuczpUaHJpZnRUeXBlIiAvPgorICAgICAgICA8c2VxdWVuY2U+CisgICAgICAgICAgPGVsZW1lbnQgbmFtZT0ia2V5VHlwZSIgdHlwZT0idG5zOlRocmlmdFR5cGUiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgorICAgICAgICAgIDxlbGVtZW50IG5hbWU9InZhbHVlVHlwZSIgdHlwZT0idG5zOlRocmlmdFR5cGUiIAorICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSIxIiAvPgorICAgICAgICA8L3NlcXVlbmNlPgorICAgICAgPC9jaG9pY2U+CisgICAgPC9zZXF1ZW5jZT4KKyAgICA8YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InRuczpUeXBlSWRlbnRpZmllciIgdXNlPSJyZXF1aXJlZCIgLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9InR5cGUtbW9kdWxlIiB0eXBlPSJzdHJpbmciIC8+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlLWlkIiB0eXBlPSJzdHJpbmciIC8+CisgIDwvY29tcGxleFR5cGU+CisKKyAgPHNpbXBsZVR5cGUgbmFtZT0iVHlwZUlkZW50aWZpZXIiPgorICAgIDxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgorICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJ2b2lkIiAvPgorICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJib29sIiAvPgorICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJieXRlIiAvPgorICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJpOCIgLz4KKyAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iaTE2IiAvPgorICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJpMzIiIC8+CisgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9Imk2NCIgLz4KKyAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iZG91YmxlIiAvPgorICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJiaW5hcnkiIC8+CisgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9InN0cmluZyIgLz4KKyAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iaWQiIC8+CisgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9Im1hcCIgLz4KKyAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0ic2V0IiAvPgorICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJsaXN0IiAvPgorICAgIDwvcmVzdHJpY3Rpb24+CisgIDwvc2ltcGxlVHlwZT4KKworPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9wYWNrYWdlLWxvY2suanNvbiBiL3BhY2thZ2UtbG9jay5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNjVhYTYKLS0tIC9kZXYvbnVsbAorKysgYi9wYWNrYWdlLWxvY2suanNvbgpAQCAtMCwwICsxLDIxODMgQEAKK3sKKyAgIm5hbWUiOiAidGhyaWZ0IiwKKyAgInZlcnNpb24iOiAiMS4wLjAiLAorICAibG9ja2ZpbGVWZXJzaW9uIjogMSwKKyAgInJlcXVpcmVzIjogdHJ1ZSwKKyAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAiQGJhYmVsL2NvZGUtZnJhbWUiOiB7CisgICAgICAidmVyc2lvbiI6ICI3LjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvQGJhYmVsL2NvZGUtZnJhbWUvLS9jb2RlLWZyYW1lLTcuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1PZkMydWVtYWtuWHI4N2JkTFVrV29nN25ZdWxpTTlJajVIVWNhanNWY01DcFFyY0xtdHhSYlZGVElxbWNTa1NlWVJCRkJSeHMyRmlVcUZKRExkaWViQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiQGJhYmVsL2hpZ2hsaWdodCI6ICJeNy4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiQGJhYmVsL2hpZ2hsaWdodCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjcuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9AYmFiZWwvaGlnaGxpZ2h0Ly0vaGlnaGxpZ2h0LTcuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1VRk1DNFplRkM0OFRwdmo3QzhVZ0x2dGthVXVvdlFYKzV4Tldyc0lvTUc4bzJ6K1hGS2pLYU45aVZtUzg0ZFB3Vk4wMFc0d1BtcXZZb1pGM0VHQXNmdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY2hhbGsiOiAiXjIuMC4wIiwKKyAgICAgICAgImVzdXRpbHMiOiAiXjIuMC4yIiwKKyAgICAgICAgImpzLXRva2VucyI6ICJeNC4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiQHR5cGVzL25vZGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxMC4xMi42IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9AdHlwZXMvbm9kZS8tL25vZGUtMTAuMTIuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItK1pXQjVFYzFpa2k5OXhRRnpCbGl2bEt4U1pRK2Z1VUtCb3R0OFN0Qk9uTE40ZFdiUkhsZ2RnMVhrbnBXNmcwdHdlbmlONURjT3FBNjRDSnlPVVBTQXc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIkB0eXBlcy9xIjogeworICAgICAgInZlcnNpb24iOiAiMS41LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0B0eXBlcy9xLy0vcS0xLjUuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZXF6OGMvMGt3TmkvT0VIUWZ2SXVKVkxUc3QzaW4wZTd1VEtldVkrV0wvemZLbjB4VnVqT1RwNDJiUy92VVVva2hLNVAyQnBwTGQ5SlhNT01IY2diakE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFiYnJldiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC45IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hYmJyZXYvLS9hYmJyZXYtMS4wLjkudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1rYlI1SllpbmM0d2w4MTNXOWpkU292aDNZVFU9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYWNvcm4iOiB7CisgICAgICAidmVyc2lvbiI6ICI2LjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYWNvcm4vLS9hY29ybi02LjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItR1htS0l2YnJOM1RWN2FWcUF6VkZhTVc4Rjh3elZYN3ZvRUJSTzNiREE2NCtFWDM3WVNheWdnUkpQNVhpZzZIWUhCa1dLcEZnOVc1Z2c2b3JrbHViaGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFjb3JuLWpzeCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjUuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hY29ybi1qc3gvLS9hY29ybi1qc3gtNS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVhrQjUwZm4wTVVSRHl3dzkrVVlMM2MxeUxiT0J6MFpGdnJkWWxHQjhsK0lqZTFvU0M3NXFBcXJ6U1BqWVFiZG5RVXpobFVHTkt1ZXNyeUF2MGd4Wk9nPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhanYiOiB7CisgICAgICAidmVyc2lvbiI6ICI2LjUuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYWp2Ly0vYWp2LTYuNS40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi00V3lqdDgrdDZZc3pxYVhuTERmTW1HLzhBbE81WmJjc3kzQVRIbmNDempXL05vUHpBSWQ4QUs2NzQ5WWJqbWR0K2tVWTFnUDYwZkN1NDZvRHhQdi9tZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZmFzdC1kZWVwLWVxdWFsIjogIl4yLjAuMSIsCisgICAgICAgICJmYXN0LWpzb24tc3RhYmxlLXN0cmluZ2lmeSI6ICJeMi4wLjAiLAorICAgICAgICAianNvbi1zY2hlbWEtdHJhdmVyc2UiOiAiXjAuNC4xIiwKKyAgICAgICAgInVyaS1qcyI6ICJeNC4yLjIiCisgICAgICB9CisgICAgfSwKKyAgICAiYW1kZWZpbmUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYW1kZWZpbmUvLS9hbWRlZmluZS0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVNsS0NyQlpIS2VrMkdiejlPdEZSK0JmT2tmVT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAiYW5zaS1lc2NhcGVzIjogeworICAgICAgInZlcnNpb24iOiAiMy4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fuc2ktZXNjYXBlcy8tL2Fuc2ktZXNjYXBlcy0zLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItVWdBYjhIOUQ0MUFRbnUvUGJXbENvZlFWY25WNEdzMmJCSmk5ZVpQeGZVL2hnZ2xGaDNTTURNRU5SSXFkcjdINlhGblhkb2tuY3RGQnlWc0NPb3RUVnc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFuc2ktcmVnZXgiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYW5zaS1yZWdleC8tL2Fuc2ktcmVnZXgtMy4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS03UU1Yd3lJR1QzbEdiQUtXYTkyMkJhczMyWmc9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYW5zaS1zdHlsZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjIuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYW5zaS1zdHlsZXMvLS9hbnNpLXN0eWxlcy0zLjIuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItVlQwWkk2a1pSZFRoOFl5SnczU01iWW0vdStOcWZzQXhFcFdPMFBmOXNxOC9lOTRXeHhPcFBLeDlGUjFGbHlDdE9WRE5PUSs4bnRscUZ4aVJjK3I1cUE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNvbG9yLWNvbnZlcnQiOiAiXjEuOS4wIgorICAgICAgfQorICAgIH0sCisgICAgImFwcm9iYSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hcHJvYmEvLS9hcHJvYmEtMS4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVk5SjZaalh0b1loOFJuWFZDTU9VL3R0RG1rMWFCanVucTl2TzB0YTV4ODVXRFFpUWZVRjlzSVBCSVRkYmlpSVZjQm8wM0hpM2pNeGlnQnRzZGRsWFJ3PT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhcmUtd2UtdGhlcmUteWV0IjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FyZS13ZS10aGVyZS15ZXQvLS9hcmUtd2UtdGhlcmUteWV0LTEuMS41LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi01aFlkQWtabGNHOHRPTHVqVkRUZ0NUK3VQWDBWbnBBSDI4Z1dzTGZ6cFhZbTd3UDZtcDVRL2dZeVI3WVEwY0tWSmNYSm5sM2oya3BCYW4xM1B0UWY2dz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZGVsZWdhdGVzIjogIl4xLjAuMCIsCisgICAgICAgICJyZWFkYWJsZS1zdHJlYW0iOiAiXjIuMC42IgorICAgICAgfQorICAgIH0sCisgICAgImFyZ3BhcnNlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEwIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hcmdwYXJzZS8tL2FyZ3BhcnNlLTEuMC4xMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItbzVSb3k2dE5HNFNML0ZPa0NBTjZSemppYWtaUzI1UkxZRnJjTXR0SnFiZGQ4QldybkErZkd6NTdpTjVQYjA2cHZCR3ZsNWdRMEI0OGRKbHNsWHZvVGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInNwcmludGYtanMiOiAifjEuMC4yIgorICAgICAgfQorICAgIH0sCisgICAgImFycmF5LXVuaW9uIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FycmF5LXVuaW9uLy0vYXJyYXktdW5pb24tMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1talJCRGs5T1BhSTk2amRiNWI1dzhrZDQ3RGs9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXJyYXktdW5pcSI6ICJeMS4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiYXJyYXktdW5pcSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hcnJheS11bmlxLy0vYXJyYXktdW5pcS0xLjAuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXIycklkNkpjeC9kT0JZaVVkVGhZMzlzay9iWT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhcnJpZnkiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXJyaWZ5Ly0vYXJyaWZ5LTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtaVlVSTJpSW04NERma0Vjb1JXaEp3VkFhU3cwPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFzeW5jIjogeworICAgICAgInZlcnNpb24iOiAiMS41LjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXN5bmMvLS9hc3luYy0xLjUuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTdHcGhybFpJREF3OHNrSEpWaGppQ0pMNVp5bz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhc3luYy1saW1pdGVyIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FzeW5jLWxpbWl0ZXIvLS9hc3luYy1saW1pdGVyLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1qcC91Rm5vb09pTytMMjExZVpPb1N5enBPSVRNWHgxckJJVGF1WXlrRzNCUllQdThoMFVjeHNQTkIwNFJSNXZvNFR5ejMrYXkxN3RSNkpWZjlxellXZz09IgorICAgIH0sCisgICAgImJhYnlsb24iOiB7CisgICAgICAidmVyc2lvbiI6ICI3LjAuMC1iZXRhLjE5IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9iYWJ5bG9uLy0vYmFieWxvbi03LjAuMC1iZXRhLjE5LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1WZzBDOXMvUkVYNi9XSVhOMzdVS3B2NVpoUmk2QTRwakhscGtFMzQrOC9hNmMyVzFRNjkybjNobWMrU1pHNWxLUm5hRXhMVWJ4dEoxU1ZUK0thQ1EvQT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYmFsYW5jZWQtbWF0Y2giOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYmFsYW5jZWQtbWF0Y2gvLS9iYWxhbmNlZC1tYXRjaC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWliVFJtYXNyN2tuZUZrNmdLNG5PUmkxeHQyYz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJiaW5kaW5ncyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9iaW5kaW5ncy8tL2JpbmRpbmdzLTEuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1EcExoNUV6TVIya3p2WDFLSWxWQzBWa0MzaVp0SEtUZ2R0WjBhM3BnbEJaZGFRRmp0NVM5Zzl4ZDFsRStZdlh5ZmQ2bXRDZVJuclVmT0xZaVRNbE5Tdz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYmwiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjIuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ibC8tL2JsLTEuMi4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1lOHRRWW5ab2RtZWJZRFdHSDdLTVJ2dHpLWGFKSHgzQmJpbHJnWkNmdnlMVVlkS3BLMXQ1UFNQbXBrbnkvU2dpVFNDbmpmTFc3djVybE9OWFZGa1FFQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicmVhZGFibGUtc3RyZWFtIjogIl4yLjMuNSIsCisgICAgICAgICJzYWZlLWJ1ZmZlciI6ICJeNS4xLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiYmx1ZWJpcmQiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjUuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYmx1ZWJpcmQvLS9ibHVlYmlyZC0zLjUuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZGhIVFdNSTdrTXg1d2hNUW50bDdWcjlDNkJ2VjEwbEZYREFhc25xbnJNWWhYVkN6ems2SU85Rm8yTDc1alhIVDA3V3JPbmdMMVdEWE9wK3lZUzkxWWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImJyYWNlLWV4cGFuc2lvbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4xMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYnJhY2UtZXhwYW5zaW9uLy0vYnJhY2UtZXhwYW5zaW9uLTEuMS4xMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItaUN1UEhERmdySFg3SDJ2RUkvNXhwejA3elNIQjAwVHB1Z3FobVl0Vm1NTzY1MThtQ3VSTW9PWUZsZEVCbDBnMTg3dWZvemRhSGdXS2NZRmI2MXFHaUE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImJhbGFuY2VkLW1hdGNoIjogIl4xLjAuMCIsCisgICAgICAgICJjb25jYXQtbWFwIjogIjAuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgImJ1ZmZlci1hbGxvYyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9idWZmZXItYWxsb2MvLS9idWZmZXItYWxsb2MtMS4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUNGc0hRZ2p0VzFVQ2hkWGdieUpHdG5tK08vdUxRZVpkdGJEbzhtZlVnWVhDSFNNMXdnclZ4WG02YlN5clV1RXJFYis0c1lWR0N6QVNCUm90N3p5cm93PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJidWZmZXItYWxsb2MtdW5zYWZlIjogIl4xLjEuMCIsCisgICAgICAgICJidWZmZXItZmlsbCI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiYnVmZmVyLWFsbG9jLXVuc2FmZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9idWZmZXItYWxsb2MtdW5zYWZlLy0vYnVmZmVyLWFsbG9jLXVuc2FmZS0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItVEVNMmlNSUVRZEoyeWpQSm9TSXNsZG5sZVZhQWsxb1czREJWVXlreU9Mc0VzRm1FYzlrbitTRkZQeitnbDU0S1FOeGxEbkF3Q1hvc09TOU9reDJ4QWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImJ1ZmZlci1lcXVhbHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9idWZmZXItZXF1YWxzLy0vYnVmZmVyLWVxdWFscy0xLjAuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUExTzFUOUIvMlZaQmNHY2E1dlpyblBFTkovVT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJidWZmZXItZmlsbCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9idWZmZXItZmlsbC8tL2J1ZmZlci1maWxsLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtK1BlTGRuaVlpTzg1OGdYTlkzOW81d0lTS3l3PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNhbGxlci1wYXRoIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NhbGxlci1wYXRoLy0vY2FsbGVyLXBhdGgtMC4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1sQWhlOWpXQjdOUGFxU1JFcVA2VTZDVjNkUjg9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY2FsbHNpdGVzIjogIl4wLjIuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJjYWxsc2l0ZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2FsbHNpdGVzLy0vY2FsbHNpdGVzLTAuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcjZ1V0ppa1FwL004R2FWM1dDWEduelRqVU1vPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNhdGhhcnNpcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuOC45IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jYXRoYXJzaXMvLS9jYXRoYXJzaXMtMC44LjkudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1tTXlKREtaUzNTN3c1d3Mza2xNUS81NlEvSXM9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAidW5kZXJzY29yZS1jb250cmliIjogIn4wLjMuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJjaGFsayI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jaGFsay8tL2NoYWxrLTIuNC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1PYk42aDF2MmZUSlNtVVhvUzNuTVE5MkxiREs5YmU0VFYrNkcrb21RbEdKRmRjVVg1aGVLaTFMWjFZblJNSWd3VExFajNFMjRiVDZ0WW5pNTBybENmUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYW5zaS1zdHlsZXMiOiAiXjMuMi4xIiwKKyAgICAgICAgImVzY2FwZS1zdHJpbmctcmVnZXhwIjogIl4xLjAuNSIsCisgICAgICAgICJzdXBwb3J0cy1jb2xvciI6ICJeNS4zLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiY2hhcmRldCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jaGFyZGV0Ly0vY2hhcmRldC0wLjcuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItbVQ4aURjcmgwM3FER1JSbW9BMmhtQkpueHBsbE1SKzAvMHFsempxWkVTNk5kaVdEY1prQ05BazRyUEZaOVE4NXIyN3Vua2lOTmc4Wk9pd1pYQkh3Y0E9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNob3duciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jaG93bnIvLS9jaG93bnItMS4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWozOEV2TzUrTEhYODRqbG82aDRVem1Pd2kwVWdXNjFXUnlQdEp6NHFhYWRLNWVZM0JUUzVUWS9TMVN0YzNVazJsSU02VFBldkFsVUxpRUp3aWU4NjBnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjaXJjdWxhci1qc29uIjogeworICAgICAgInZlcnNpb24iOiAiMC4zLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NpcmN1bGFyLWpzb24vLS9jaXJjdWxhci1qc29uLTAuMy4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1VWkszTkJ4Mk1jYStiNUxzRzdiWTE4M3BIV3Q1WTF4dHM0UDNQejdFTlR3R1ZuSk9VV2JSYjNvY2p2WDdoeDl0cS95VEFkY2xYbTlzWjM4Z051ZW00QT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY2xpLWN1cnNvciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jbGktY3Vyc29yLy0vY2xpLWN1cnNvci0yLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXMxMnNOMlI1K3N3K2xIUjlRZERROVNPUC9MVT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJyZXN0b3JlLWN1cnNvciI6ICJeMi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiY2xpLXdpZHRoIjogeworICAgICAgInZlcnNpb24iOiAiMi4yLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NsaS13aWR0aC8tL2NsaS13aWR0aC0yLjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLS94bnQ2S21sNVhreVFVZXd3UjhQdkxxKzFqaz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjb2RlLXBvaW50LWF0IjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvZGUtcG9pbnQtYXQvLS9jb2RlLXBvaW50LWF0LTEuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRFFjTFRRUTZXK296b3ZHa0RpN2JQWnBNejNjPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNvbG9yLWNvbnZlcnQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjkuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29sb3ItY29udmVydC8tL2NvbG9yLWNvbnZlcnQtMS45LjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVFmQVV0ZCt2RmRBdEZRY0M4Q0N5WXQxZllXeFNxQWlLMmNTRDZ6REI4TjNjcHNFQkF2UnhwOXpPR2c2Ry9TSEhKWUFUODgvYXovSXVER0FMc05WYkdnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjb2xvci1uYW1lIjogIjEuMS4zIgorICAgICAgfQorICAgIH0sCisgICAgImNvbG9yLW5hbWUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29sb3ItbmFtZS8tL2NvbG9yLW5hbWUtMS4xLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1wOUJWaTlpY1F2ZVYzVUl5ajNRSU1jcFR2Q1U9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY29tbWFuZGVyIjogeworICAgICAgInZlcnNpb24iOiAiMi4xOS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb21tYW5kZXIvLS9jb21tYW5kZXItMi4xOS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi02dHZBT08rRDZPRU52UkFoNTI0RGg5amNmS1RZRFFBcXZxZXpiQ1c4MnhqNVgwcFNyY3B4dHZSS0hMRzB5Qlk2U0Q3UFNEckphaiswQWlPY0tWZDFYZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY29uY2F0LW1hcCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb25jYXQtbWFwLy0vY29uY2F0LW1hcC0wLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTJLbHIxMy9XamZkNU9uTURhanVnMVVCZFIzcz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjb25uZWN0IjogeworICAgICAgInZlcnNpb24iOiAiMy42LjYiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Nvbm5lY3QvLS9jb25uZWN0LTMuNi42LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtQ2UvMnhWcjNJMjRUY1RXbkpYU0ZpMmVHOVNRPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRlYnVnIjogIjIuNi45IiwKKyAgICAgICAgImZpbmFsaGFuZGxlciI6ICIxLjEuMCIsCisgICAgICAgICJwYXJzZXVybCI6ICJ+MS4zLjIiLAorICAgICAgICAidXRpbHMtbWVyZ2UiOiAiMS4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiY29uc29sZS1jb250cm9sLXN0cmluZ3MiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29uc29sZS1jb250cm9sLXN0cmluZ3MvLS9jb25zb2xlLWNvbnRyb2wtc3RyaW5ncy0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVBYejBSazIyUkc2bVJMOUxPVkIvbUZFQWpvND0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjb3JlLXV0aWwtaXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29yZS11dGlsLWlzLy0vY29yZS11dGlsLWlzLTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdGYxVUlncWl2RnExZXF0eFFNbEFkVVVEd2FjPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNyb3NzLXNwYXduIjogeworICAgICAgInZlcnNpb24iOiAiNi4wLjUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Nyb3NzLXNwYXduLy0vY3Jvc3Mtc3Bhd24tNi4wLjUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWVUVkxyQlN0N2ZqYkR5Z3o4MDVwTW5zdElzMlZUQk5rUm0wcXhaZCtNN0E1WERkeFZSV081TXhHQlhaaGpZNGNxTFlMZHRyR3FSZjhtQlBtendTcFdRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJuaWNlLXRyeSI6ICJeMS4wLjQiLAorICAgICAgICAicGF0aC1rZXkiOiAiXjIuMC4xIiwKKyAgICAgICAgInNlbXZlciI6ICJeNS41LjAiLAorICAgICAgICAic2hlYmFuZy1jb21tYW5kIjogIl4xLjIuMCIsCisgICAgICAgICJ3aGljaCI6ICJeMS4yLjkiCisgICAgICB9CisgICAgfSwKKyAgICAiZGVidWciOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjYuOSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVidWcvLS9kZWJ1Zy0yLjYuOS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItYkM3RWxyZEphSm5QYkFQKzFFb3RZdnFac2IzZWNsNXdpNkJmaTZCSlRVY05vd3A2Y3ZzcGcwalh6blJUS0RqbS9FN0FkZ0ZCVmVBUFZNTmNLR3NITUE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIm1zIjogIjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImRlY29tcHJlc3MtcmVzcG9uc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjMuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVjb21wcmVzcy1yZXNwb25zZS8tL2RlY29tcHJlc3MtcmVzcG9uc2UtMy4zLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1nS1RkTWpkSU9FdjZKSUNEWWlydDdKZ3EzL009IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAibWltaWMtcmVzcG9uc2UiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImRlZXAtZXF1YWwiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVlcC1lcXVhbC8tL2RlZXAtZXF1YWwtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS05ZEpnS1N0bURnaE8vMHpieWZDSzB5UjBTTFU9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZGVlcC1leHRlbmQiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjYuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVlcC1leHRlbmQvLS9kZWVwLWV4dGVuZC0wLjYuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItTE9IeElPYVBZZEhsSlJ0Q1FmRElWWnRmdy91Zk04K3JWajY0OVJJSHpjbS92R3dRUlhGdDZPUHFJRldzbTJYRU1yTklFdFdSNjRzWTFMRUtEMnZBT0E9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImRlZXAtaXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVlcC1pcy8tL2RlZXAtaXMtMC4xLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1zMm5XKzEyOEUrN1BVaytSc0hEKzdjTlh6elE9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZGVmaW5lLXByb3BlcnRpZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVmaW5lLXByb3BlcnRpZXMvLS9kZWZpbmUtcHJvcGVydGllcy0xLjEuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItM01xZllLajJsTHpkTVNmOFpJWkUvVitadXkrQmdENmYxNjRlOEsydzdkZ25wS0FyQkRlckdZcE00NklZWWNqbmtkUE5NalBrOUE2VkZCOCszU0tsWFE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIm9iamVjdC1rZXlzIjogIl4xLjAuMTIiCisgICAgICB9CisgICAgfSwKKyAgICAiZGVmaW5lZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWZpbmVkLy0vZGVmaW5lZC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXlZMmJ6dmRXZEJpT0VRbHBGUkdaNDVzZnBwTT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJkZWwiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjIuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVsLy0vZGVsLTIuMi4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtd1N5WUhRWjRSc2hMeXZoaXova3cyUWYvMGFnPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImdsb2JieSI6ICJeNS4wLjAiLAorICAgICAgICAiaXMtcGF0aC1jd2QiOiAiXjEuMC4wIiwKKyAgICAgICAgImlzLXBhdGgtaW4tY3dkIjogIl4xLjAuMCIsCisgICAgICAgICJvYmplY3QtYXNzaWduIjogIl40LjAuMSIsCisgICAgICAgICJwaWZ5IjogIl4yLjAuMCIsCisgICAgICAgICJwaW5raWUtcHJvbWlzZSI6ICJeMi4wLjAiLAorICAgICAgICAicmltcmFmIjogIl4yLjIuOCIKKyAgICAgIH0KKyAgICB9LAorICAgICJkZWxlZ2F0ZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVsZWdhdGVzLy0vZGVsZWdhdGVzLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtaE1iaFdiZ1pCUDNLV2FEdlJNMkhEVEVsRDVvPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImRldGVjdC1saWJjIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RldGVjdC1saWJjLy0vZGV0ZWN0LWxpYmMtMS4wLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0raE44UzlhWTdmVmMxYzBDckZXZmthVEV1cHM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZG9jdHJpbmUiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZG9jdHJpbmUvLS9kb2N0cmluZS0yLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItMzVtU2t1NFpYSzB2ZkN1SEVEQXd0NTVkZzJqTmFqSFoxb2R2Ris4U1NyODJFc1pZNFFtWGZ1V3NvOG9FZDh6UmhWT2JTTjE4YU0wQ2pTZG9CWDd6SXc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImVzdXRpbHMiOiAiXjIuMC4yIgorICAgICAgfQorICAgIH0sCisgICAgImVlLWZpcnN0IjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VlLWZpcnN0Ly0vZWUtZmlyc3QtMS4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1XUXhoRldzSzR2VHdKVmN5b1ZpeVpyeFdzaDA9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZW5jb2RldXJsIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VuY29kZXVybC8tL2VuY29kZXVybC0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXJULzB5RzdDMENreUwxb0N3Nm1tQnNsYlAxaz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJlbmQtb2Ytc3RyZWFtIjogeworICAgICAgInZlcnNpb24iOiAiMS40LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VuZC1vZi1zdHJlYW0vLS9lbmQtb2Ytc3RyZWFtLTEuNC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0xTWtyWk52V1RLQ2FpZ2JuK1cxNWVscTJCQi9MMjJucXJTWTVES2xvM1g2K3ZjbEptOEJiNWRqWEpCbUVYNmZTMyt6Q2gvRjRWQks1WjJLeEp0NHMyUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAib25jZSI6ICJeMS40LjAiCisgICAgICB9CisgICAgfSwKKyAgICAiZXMtYWJzdHJhY3QiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEyLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzLWFic3RyYWN0Ly0vZXMtYWJzdHJhY3QtMS4xMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1DOEZ4LzBqRm1WNUlQb01PRlBBOVA5RzVOdHFXKzRjT1BpdDNNSXV2UjJ0N0FnMksxNUVKVHB4bkhBWVR6TCthWVFKSUVTWWVYWm1EQmZPQkUxSGNwQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXMtdG8tcHJpbWl0aXZlIjogIl4xLjEuMSIsCisgICAgICAgICJmdW5jdGlvbi1iaW5kIjogIl4xLjEuMSIsCisgICAgICAgICJoYXMiOiAiXjEuMC4xIiwKKyAgICAgICAgImlzLWNhbGxhYmxlIjogIl4xLjEuMyIsCisgICAgICAgICJpcy1yZWdleCI6ICJeMS4wLjQiCisgICAgICB9CisgICAgfSwKKyAgICAiZXMtdG8tcHJpbWl0aXZlIjogeworICAgICAgInZlcnNpb24iOiAiMS4yLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzLXRvLXByaW1pdGl2ZS8tL2VzLXRvLXByaW1pdGl2ZS0xLjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItcVpyeUJPSmpWLy9MYXhMVFY2VUMvL1dld25lQjNMY1hPTDlOUCsrb3pLVlhzSUlJcG0vMmMxM1VEaUQ5SnAyZVRoc2VjdzltM2pQcUR3VHlvYmNkYmc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzLWNhbGxhYmxlIjogIl4xLjEuNCIsCisgICAgICAgICJpcy1kYXRlLW9iamVjdCI6ICJeMS4wLjEiLAorICAgICAgICAiaXMtc3ltYm9sIjogIl4xLjAuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJlc2NhcGUtaHRtbCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc2NhcGUtaHRtbC8tL2VzY2FwZS1odG1sLTEuMC4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtQWxqcTVOUFF3SmRONGNGcEdJN3dCUjBkR1lnPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImVzY2FwZS1zdHJpbmctcmVnZXhwIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzY2FwZS1zdHJpbmctcmVnZXhwLy0vZXNjYXBlLXN0cmluZy1yZWdleHAtMS4wLjUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1HMkhBVmlHUXFOLzJyanV5endJQXloTUxodFE9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZXNjb2RlZ2VuIjogeworICAgICAgInZlcnNpb24iOiAiMS44LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzY29kZWdlbi8tL2VzY29kZWdlbi0xLjguMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVdsdFRyMGFURVF2cnNJWjZvME1OMDdjS0VCZz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJlc3ByaW1hIjogIl4yLjcuMSIsCisgICAgICAgICJlc3RyYXZlcnNlIjogIl4xLjkuMSIsCisgICAgICAgICJlc3V0aWxzIjogIl4yLjAuMiIsCisgICAgICAgICJvcHRpb25hdG9yIjogIl4wLjguMSIsCisgICAgICAgICJzb3VyY2UtbWFwIjogIn4wLjIuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZXNwcmltYSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjcuMyIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzcHJpbWEvLS9lc3ByaW1hLTIuNy4zLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLWx1TzNEVmQ1OXExSnpRTW1jOUhERW5aN3BZRT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0sCisgICAgICAgICJlc3RyYXZlcnNlIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuOS4zIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXN0cmF2ZXJzZS8tL2VzdHJhdmVyc2UtMS45LjMudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcjJmeTNKSWxna0ZaVUpKZ2thUUFYU25KdTBRPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImVzbGludCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjUuNy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc2xpbnQvLS9lc2xpbnQtNS43LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXpZQ2VGUWFoc3hmZkdsODdVMmFKN0RQeUg4Q2JXZ3hCQzIxM1k4K1RDYW5oVVRmMmdFdmZxM0VLcEhtRWNvelRMeVBtR2U5TFpkTUF3Qy9DcEpCTTVBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJAYmFiZWwvY29kZS1mcmFtZSI6ICJeNy4wLjAiLAorICAgICAgICAiYWp2IjogIl42LjUuMyIsCisgICAgICAgICJjaGFsayI6ICJeMi4xLjAiLAorICAgICAgICAiY3Jvc3Mtc3Bhd24iOiAiXjYuMC41IiwKKyAgICAgICAgImRlYnVnIjogIl40LjAuMSIsCisgICAgICAgICJkb2N0cmluZSI6ICJeMi4xLjAiLAorICAgICAgICAiZXNsaW50LXNjb3BlIjogIl40LjAuMCIsCisgICAgICAgICJlc2xpbnQtdXRpbHMiOiAiXjEuMy4xIiwKKyAgICAgICAgImVzbGludC12aXNpdG9yLWtleXMiOiAiXjEuMC4wIiwKKyAgICAgICAgImVzcHJlZSI6ICJeNC4wLjAiLAorICAgICAgICAiZXNxdWVyeSI6ICJeMS4wLjEiLAorICAgICAgICAiZXN1dGlscyI6ICJeMi4wLjIiLAorICAgICAgICAiZmlsZS1lbnRyeS1jYWNoZSI6ICJeMi4wLjAiLAorICAgICAgICAiZnVuY3Rpb25hbC1yZWQtYmxhY2stdHJlZSI6ICJeMS4wLjEiLAorICAgICAgICAiZ2xvYiI6ICJeNy4xLjIiLAorICAgICAgICAiZ2xvYmFscyI6ICJeMTEuNy4wIiwKKyAgICAgICAgImlnbm9yZSI6ICJeNC4wLjYiLAorICAgICAgICAiaW11cm11cmhhc2giOiAiXjAuMS40IiwKKyAgICAgICAgImlucXVpcmVyIjogIl42LjEuMCIsCisgICAgICAgICJpcy1yZXNvbHZhYmxlIjogIl4xLjEuMCIsCisgICAgICAgICJqcy15YW1sIjogIl4zLjEyLjAiLAorICAgICAgICAianNvbi1zdGFibGUtc3RyaW5naWZ5LXdpdGhvdXQtanNvbmlmeSI6ICJeMS4wLjEiLAorICAgICAgICAibGV2biI6ICJeMC4zLjAiLAorICAgICAgICAibG9kYXNoIjogIl40LjE3LjUiLAorICAgICAgICAibWluaW1hdGNoIjogIl4zLjAuNCIsCisgICAgICAgICJta2RpcnAiOiAiXjAuNS4xIiwKKyAgICAgICAgIm5hdHVyYWwtY29tcGFyZSI6ICJeMS40LjAiLAorICAgICAgICAib3B0aW9uYXRvciI6ICJeMC44LjIiLAorICAgICAgICAicGF0aC1pcy1pbnNpZGUiOiAiXjEuMC4yIiwKKyAgICAgICAgInBsdXJhbGl6ZSI6ICJeNy4wLjAiLAorICAgICAgICAicHJvZ3Jlc3MiOiAiXjIuMC4wIiwKKyAgICAgICAgInJlZ2V4cHAiOiAiXjIuMC4xIiwKKyAgICAgICAgInJlcXVpcmUtdW5jYWNoZWQiOiAiXjEuMC4zIiwKKyAgICAgICAgInNlbXZlciI6ICJeNS41LjEiLAorICAgICAgICAic3RyaXAtYW5zaSI6ICJeNC4wLjAiLAorICAgICAgICAic3RyaXAtanNvbi1jb21tZW50cyI6ICJeMi4wLjEiLAorICAgICAgICAidGFibGUiOiAiXjUuMC4yIiwKKyAgICAgICAgInRleHQtdGFibGUiOiAiXjAuMi4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJkZWJ1ZyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICI0LjEuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlYnVnLy0vZGVidWctNC4xLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1oZU5QSlVKSXFDK3hCNmF5TEFNSGFJcm1OOUhLYTdhUU84TUdxS3B2Q0ErdUpZVmN2UjZsNWtnZHJoUnV3UEZIVTdQNS9BMXcwQmpCeVBId3BmVERLZz09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAibXMiOiAiXjIuMS4xIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgIm1zIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMS4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbXMvLS9tcy0yLjEuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXRncCtkbDVjR2syOHV0WWt0QnNyRnFBN0hLZ3JoZ1BzZzZaL0VmaFdJNGdsMUh3cThCL0dtWS8wb1haNm5GOGhEVmVzUy9GcG5ZYUQva09XaFlRdnlnPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJlc2xpbnQtY29uZmlnLXByZXR0aWVyIjogeworICAgICAgInZlcnNpb24iOiAiMy4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzbGludC1jb25maWctcHJldHRpZXIvLS9lc2xpbnQtY29uZmlnLXByZXR0aWVyLTMuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1RWUdmbXp1YzRxNEo2WElobHA4dlJLZEkvZkkwdFFmUVB5MWRNRTNVT0xwckUrdjRzc0gvM1c5TE0yUTdoNXFCY3k1bTBlaENyQkRVMllGOHE2T1k4dz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZ2V0LXN0ZGluIjogIl42LjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJlc2xpbnQtcGx1Z2luLXByZXR0aWVyIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzbGludC1wbHVnaW4tcHJldHRpZXIvLS9lc2xpbnQtcGx1Z2luLXByZXR0aWVyLTMuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi00ZzExb3B6aHFxLzgrQU1tbzVWYzJHbjd6OWFsWjRKcXJiWitENGk4S2xTeXhlUWhaSGxtSXJZOFU5QWtmNTE0TW9FaG9nUGE4N0pna3E4N2FaMk9odz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicHJldHRpZXItbGludGVyLWhlbHBlcnMiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImVzbGludC1zY29wZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc2xpbnQtc2NvcGUvLS9lc2xpbnQtc2NvcGUtNC4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTFHNlVURGk3SmMxRUxGd25SNThIVjRmSzlPUUs0UzZOOTg1ZjE2NnhxWHhwalU2cGx4RklTSmEyQmE5S0NRdUZhOFJDbmovbFNGSmJIbzdVRkRCblVBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJlc3JlY3Vyc2UiOiAiXjQuMS4wIiwKKyAgICAgICAgImVzdHJhdmVyc2UiOiAiXjQuMS4xIgorICAgICAgfQorICAgIH0sCisgICAgImVzbGludC11dGlscyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMy4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc2xpbnQtdXRpbHMvLS9lc2xpbnQtdXRpbHMtMS4zLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVo3WWpuSWxkWCsyWE1janI3WmtnRXNPai9iUkVPTlY2MHFZZUIvYmpNQXFxcVo0enhLeVdYK0JPVWtkbVJtQTlyaWlJUFZ2bzV4ODZtNWVsdmlPazBRPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJlc2xpbnQtdmlzaXRvci1rZXlzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzbGludC12aXNpdG9yLWtleXMvLS9lc2xpbnQtdmlzaXRvci1rZXlzLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1xem0vWHhJYnhtL0ZIeUgzNDFacmJuTVVwZSs1Qm9jdGU5eGttRk16UE1qUmFaTWNYd3crTXBCcHRGdnRVKzc5TDM2Mm5xaUxoZWtDeEN4RFBhVU1CUT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZXNwcmVlIjogeworICAgICAgInZlcnNpb24iOiAiNC4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzcHJlZS8tL2VzcHJlZS00LjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItSTVCeWNaVzZGQ1ZJdWI5M1RlVlkxczd2amhQOUNZNmNYQ3puSVJmaWlnN25SdmlLWllkUm5qL3NIRVdDNkE3V0U5UkRXT0ZxOSs3T3NXU1l6OHF2Mnc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFjb3JuIjogIl42LjAuMiIsCisgICAgICAgICJhY29ybi1qc3giOiAiXjUuMC4wIiwKKyAgICAgICAgImVzbGludC12aXNpdG9yLWtleXMiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImVzcHJpbWEiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXNwcmltYS8tL2VzcHJpbWEtNC4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWVHdUZGdzdVcGRhK2c0cCtRSHZuVzBSeVRYL1NWZUpCRE0vZ0N0TUFSTzBjTHVUMkhjRUtuVFB2aGpWNmFHZXFyQ0Ivc2JOb3AwS3N6bTBqc2FXVTRBPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJlc3F1ZXJ5IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzcXVlcnkvLS9lc3F1ZXJ5LTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1TbWl5WjV6SVdIOVZNK1NSVVJlTFM1UThhN0d4dFJkeEVCVlpwbTk4ckpNN1NiK0E5RFZDbmRYZmtlRlVkM2J5ZGVyZytFYkRrZm5ldmZDd3luV2FOQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXN0cmF2ZXJzZSI6ICJeNC4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiZXNyZWN1cnNlIjogeworICAgICAgInZlcnNpb24iOiAiNC4yLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzcmVjdXJzZS8tL2VzcmVjdXJzZS00LjIuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItNjRSQkIrK2ZJT0FYUHczUDljeTg5cWZNbHZaRVhaa3FxSmtqcXFYSXZ6UDVlelJaalcrbFBXanczNVVYLzNFaFVQRlliZzVFUjRKWWdEdzQwMDcvRFE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImVzdHJhdmVyc2UiOiAiXjQuMS4wIgorICAgICAgfQorICAgIH0sCisgICAgImVzdHJhdmVyc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXN0cmF2ZXJzZS8tL2VzdHJhdmVyc2UtNC4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1EZTQvN1RIODFHbGhqT2MwSUpuOEd2b0wyeE09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZXN1dGlscyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc3V0aWxzLy0vZXN1dGlscy0yLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUNyOVBIS3BieXg5Nm5Zck1iZXBQcXFCTHJKcz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJleHBhbmQtdGVtcGxhdGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXhwYW5kLXRlbXBsYXRlLy0vZXhwYW5kLXRlbXBsYXRlLTEuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1jZWJxTHRWOEtPWmZ3MFVJOFRFRld4dGN6eHhDMWp2eVV2eDZINGZ5cDFLMUZON0E0USt1Z2dWVWxPc0kxSzhBR1UwcndPR3FQOG5DYXBkcnc4Q1lRZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZXh0ZXJuYWwtZWRpdG9yIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V4dGVybmFsLWVkaXRvci8tL2V4dGVybmFsLWVkaXRvci0zLjAuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItYm43MUg5K3FXb09RS3laRG8yNW1PTVZwU21YUk9Bc1RKVlZWWXpycnRvbDNkNHkrQXNLamY0SXdsMlErSXVUMGtGU1ExcW8xNjZVdUl3cVlxN21HbkE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNoYXJkZXQiOiAiXjAuNy4wIiwKKyAgICAgICAgImljb252LWxpdGUiOiAiXjAuNC4yNCIsCisgICAgICAgICJ0bXAiOiAiXjAuMC4zMyIKKyAgICAgIH0KKyAgICB9LAorICAgICJmYXN0LWRlZXAtZXF1YWwiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmFzdC1kZWVwLWVxdWFsLy0vZmFzdC1kZWVwLWVxdWFsLTIuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZXdVaGpkK1daNzkvTnd2My9iTExGZjNRcWtrPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImZhc3QtZGlmZiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mYXN0LWRpZmYvLS9mYXN0LWRpZmYtMS4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXhKdW9UNStMOTlYbFo4dHdlZGFSZjZBeDJUZ1FWeHZnWk9Zb1BLcVp1Zm1KaWIwdEwydGVnUEJPWmIxcFZOZ0lobHFEbEEwZU8wYzN3QnZRY216eDR3PT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJmYXN0LWpzb24tc3RhYmxlLXN0cmluZ2lmeSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mYXN0LWpzb24tc3RhYmxlLXN0cmluZ2lmeS8tL2Zhc3QtanNvbi1zdGFibGUtc3RyaW5naWZ5LTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtMVJRc0RLN21zUmlmaDlPbllSRUdUNGJJdS9JPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImZhc3QtbGV2ZW5zaHRlaW4iOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuNiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmFzdC1sZXZlbnNodGVpbi8tL2Zhc3QtbGV2ZW5zaHRlaW4tMi4wLjYudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1QWXBjWm9nNkZxTU1xR1EraFI4WnVxZDVlUmM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZmlndXJlcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9maWd1cmVzLy0vZmlndXJlcy0yLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU9yR2kwcVlzaS90REdneVV5M2w2TDg0bnlXST0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJlc2NhcGUtc3RyaW5nLXJlZ2V4cCI6ICJeMS4wLjUiCisgICAgICB9CisgICAgfSwKKyAgICAiZmlsZS1lbnRyeS1jYWNoZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9maWxlLWVudHJ5LWNhY2hlLy0vZmlsZS1lbnRyeS1jYWNoZS0yLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXc1S1pERDVvUjRQWU9MaklTa1hZb0VoRmcyRT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJmbGF0LWNhY2hlIjogIl4xLjIuMSIsCisgICAgICAgICJvYmplY3QtYXNzaWduIjogIl40LjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJmaW5hbGhhbmRsZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmluYWxoYW5kbGVyLy0vZmluYWxoYW5kbGVyLTEuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtemd0b1ZiUllVK2VSc3Z6R2dBUnRpQ1U5MS9VPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRlYnVnIjogIjIuNi45IiwKKyAgICAgICAgImVuY29kZXVybCI6ICJ+MS4wLjEiLAorICAgICAgICAiZXNjYXBlLWh0bWwiOiAifjEuMC4zIiwKKyAgICAgICAgIm9uLWZpbmlzaGVkIjogIn4yLjMuMCIsCisgICAgICAgICJwYXJzZXVybCI6ICJ+MS4zLjIiLAorICAgICAgICAic3RhdHVzZXMiOiAifjEuMy4xIiwKKyAgICAgICAgInVucGlwZSI6ICJ+MS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiZmxhdC1jYWNoZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mbGF0LWNhY2hlLy0vZmxhdC1jYWNoZS0xLjMuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTB3TUxNck9CVlBUanQrbkhDZlNROSsrWHhJRT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjaXJjdWxhci1qc29uIjogIl4wLjMuMSIsCisgICAgICAgICJkZWwiOiAiXjIuMC4yIiwKKyAgICAgICAgImdyYWNlZnVsLWZzIjogIl40LjEuMiIsCisgICAgICAgICJ3cml0ZSI6ICJeMC4yLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiZm9yLWVhY2giOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjMuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZm9yLWVhY2gvLS9mb3ItZWFjaC0wLjMuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItanFZZkxwN21vOXZJeVFmOHlrVzJ2N0ErMk40UWplQ2VJNStEejlYcmFpTzFpZ244MXdqaUg3RmI5dlNPV3ZRZk50bVNhNEgyUm9RVHJyWGl2ZFVabXc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzLWNhbGxhYmxlIjogIl4xLjEuMyIKKyAgICAgIH0KKyAgICB9LAorICAgICJmcy1jb25zdGFudHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZnMtY29uc3RhbnRzLy0vZnMtY29uc3RhbnRzLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi15Nk9Bd29TSWY3RnlqTUl2OTR1K2I1cmRoZVpFanpSNjNHVHlaSm01cWg0QmkrMllnd0xDY0kvZlBGWmtMNVBTaXhPdDZaTkttK3crSGZwL0JjaXdvdz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZnMucmVhbHBhdGgiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZnMucmVhbHBhdGgvLS9mcy5yZWFscGF0aC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUZRU3RKU01WaktwQTIwb25oOHNCUVJtVTZrOD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJmdW5jdGlvbi1iaW5kIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Z1bmN0aW9uLWJpbmQvLS9mdW5jdGlvbi1iaW5kLTEuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi15SW92QXpNWDQ5c0Y4WWw1OGZTQ1dKNXN2U0x1YWliUHhYUUpGTG1CT2JUdUNyME1mMUtpUG9wR005TmlGamlZQkNiZmFhMkZoNmJyZVE2QU5WVEkwQT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZnVuY3Rpb25hbC1yZWQtYmxhY2stdHJlZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mdW5jdGlvbmFsLXJlZC1ibGFjay10cmVlLy0vZnVuY3Rpb25hbC1yZWQtYmxhY2stdHJlZS0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUd3cXp2VlU3S2cxam1kS2NEajZnc2xJSGd5Yz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJnYXVnZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNy40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9nYXVnZS8tL2dhdWdlLTIuNy40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTEFOQVhIVTR3NTErczNzeGNDTGpKZnNCaS9jPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFwcm9iYSI6ICJeMS4wLjMiLAorICAgICAgICAiY29uc29sZS1jb250cm9sLXN0cmluZ3MiOiAiXjEuMC4wIiwKKyAgICAgICAgImhhcy11bmljb2RlIjogIl4yLjAuMCIsCisgICAgICAgICJvYmplY3QtYXNzaWduIjogIl40LjEuMCIsCisgICAgICAgICJzaWduYWwtZXhpdCI6ICJeMy4wLjAiLAorICAgICAgICAic3RyaW5nLXdpZHRoIjogIl4xLjAuMSIsCisgICAgICAgICJzdHJpcC1hbnNpIjogIl4zLjAuMSIsCisgICAgICAgICJ3aWRlLWFsaWduIjogIl4xLjEuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiYW5zaS1yZWdleCI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjEuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fuc2ktcmVnZXgvLS9hbnNpLXJlZ2V4LTIuMS4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLXc3TTZ0ZTQyRFliZzVpandSb3JuN3lmV1ZOOD0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0sCisgICAgICAgICJpcy1mdWxsd2lkdGgtY29kZS1wb2ludCI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWZ1bGx3aWR0aC1jb2RlLXBvaW50Ly0vaXMtZnVsbHdpZHRoLWNvZGUtcG9pbnQtMS4wLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtNzU0eE9HOERHbjhOWkRyNEw5NVF4RmZ2QU1zPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgIm51bWJlci1pcy1uYW4iOiAiXjEuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgInN0cmluZy13aWR0aCI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N0cmluZy13aWR0aC8tL3N0cmluZy13aWR0aC0xLjAuMi50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1FWXZmVzR6Y1VhS241dzBoSGdmaXNMbXhCOU09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiY29kZS1wb2ludC1hdCI6ICJeMS4wLjAiLAorICAgICAgICAgICAgImlzLWZ1bGx3aWR0aC1jb2RlLXBvaW50IjogIl4xLjAuMCIsCisgICAgICAgICAgICAic3RyaXAtYW5zaSI6ICJeMy4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAic3RyaXAtYW5zaSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIzLjAuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3RyaXAtYW5zaS8tL3N0cmlwLWFuc2ktMy4wLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtYWpoZnVJVTlsUzFmOEYwT2lxK1VKNDNHUGM4PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImFuc2ktcmVnZXgiOiAiXjIuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImdldC1zdGRpbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjYuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9nZXQtc3RkaW4vLS9nZXQtc3RkaW4tNi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWpwNHRIYXd5VjcrZmtrU0t5dmp1TFpzd2JsVXR6K1NRS3pTV25CYmlpMTZCdVprc0psVTF3dUJZWFk3NXIrZHVoL2xsRjF1cjZvTndpKzJaempLWjdnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJnaXRodWItZnJvbS1wYWNrYWdlIjogeworICAgICAgInZlcnNpb24iOiAiMC4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dpdGh1Yi1mcm9tLXBhY2thZ2UvLS9naXRodWItZnJvbS1wYWNrYWdlLTAuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbC90ZGxyL2VpWE14UHlEb0tJNzVvV2Y2Wk00PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImdsb2IiOiB7CisgICAgICAidmVyc2lvbiI6ICI3LjEuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ2xvYi8tL2dsb2ItNy4xLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXZjZnVpSXhvZ0xWNERsR0JISVVPd0kwSWJySjhIV1BjNE1VN0h6dmlHZU5oby9VSkRmaTZCNXAzc0hlV0lRMEtHSVUwSnB4aTVaSHhlbVFmTGtrQXdRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJmcy5yZWFscGF0aCI6ICJeMS4wLjAiLAorICAgICAgICAiaW5mbGlnaHQiOiAiXjEuMC40IiwKKyAgICAgICAgImluaGVyaXRzIjogIjIiLAorICAgICAgICAibWluaW1hdGNoIjogIl4zLjAuNCIsCisgICAgICAgICJvbmNlIjogIl4xLjMuMCIsCisgICAgICAgICJwYXRoLWlzLWFic29sdXRlIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJnbG9iYWxzIjogeworICAgICAgInZlcnNpb24iOiAiMTEuOC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9nbG9iYWxzLy0vZ2xvYmFscy0xMS44LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWlvNkxreVBWdXpDSEJTUVY5Zm1Pd3haa1VrNm5JYUdteGhlTERnbXVGdjg5ajBmbTJhcURiSVhLQUdmekNNSHF6M0hMRjJaZjhXU0c2VnFNaDJxRm1BPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJnbG9iYnkiOiB7CisgICAgICAidmVyc2lvbiI6ICI1LjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ2xvYmJ5Ly0vZ2xvYmJ5LTUuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtNjloR1o4b051ek1MbWJ6OGFPckN2RlEzRGcwPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFycmF5LXVuaW9uIjogIl4xLjAuMSIsCisgICAgICAgICJhcnJpZnkiOiAiXjEuMC4wIiwKKyAgICAgICAgImdsb2IiOiAiXjcuMC4zIiwKKyAgICAgICAgIm9iamVjdC1hc3NpZ24iOiAiXjQuMC4xIiwKKyAgICAgICAgInBpZnkiOiAiXjIuMC4wIiwKKyAgICAgICAgInBpbmtpZS1wcm9taXNlIjogIl4yLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJncmFjZWZ1bC1mcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMS4xMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ3JhY2VmdWwtZnMvLS9ncmFjZWZ1bC1mcy00LjEuMTEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1Eb3ZmNU5IZHVJVk5aT0JPcDhBT0tnSnVWbGc9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaGFuZGxlYmFycyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMC4xMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaGFuZGxlYmFycy8tL2hhbmRsZWJhcnMtNC4wLjEyLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1SaG1UZWtQK0ZaTCtYTmh3UzFXZitiVFRacGRMb3Vnd3Q1cGNnQTF0dXo2SmN4MGZwSC83ejBxZDcxUktuWkhCQ3hJUkJIZkJPbmlvNGdWaVBlbU56QT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXN5bmMiOiAiXjIuNS4wIiwKKyAgICAgICAgIm9wdGltaXN0IjogIl4wLjYuMSIsCisgICAgICAgICJzb3VyY2UtbWFwIjogIl4wLjYuMSIsCisgICAgICAgICJ1Z2xpZnktanMiOiAiXjMuMS40IgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJhc3luYyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjYuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FzeW5jLy0vYXN5bmMtMi42LjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1mTkVpTDIrQVp0NkFsQXcvMjlDcjBVRGU0c1JBSENwRUhoNTRXTXorQmI3UWZOY0Z3NGgzbG9vZnlKcExlUXM0WXg3eXVxdS8yZExnTTVoS09zNkhsUT09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAibG9kYXNoIjogIl40LjE3LjEwIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgInNvdXJjZS1tYXAiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMC42LjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zb3VyY2UtbWFwLy0vc291cmNlLW1hcC0wLjYuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVVqZ2FwdW1XbGJNaGtCZ3pUN1lrYzVZWFVUNDZGMGlLdThTR1hxMGJjd1A1ZHovaDBQbGo2ZW5KcWp6MVpicTJsNVdhcVluclZid1dPV015RjNGNDdnPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJoYXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaGFzLy0vaGFzLTEuMC4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1mMmR2TzBWVTZPZWo3UmtXSkdyZWhqYnpNQWpGcDUvVktQcDV0VHBXSVY0SkhIWksxL0J4YkZSdGYvc2lBMlNXVGUwOWNhRG1WdFlZeldFSWJCUzR6dz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZnVuY3Rpb24tYmluZCI6ICJeMS4xLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiaGFzLWZsYWciOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaGFzLWZsYWcvLS9oYXMtZmxhZy0zLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXRkUlUzQ0dacmlKV21mTkdmbG9IODdsVnV2MD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJoYXMtc3ltYm9scyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9oYXMtc3ltYm9scy8tL2hhcy1zeW1ib2xzLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdWhxUEd2S2cvRGxsRDF5RkEyZHdRU0lHTzBRPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImhhcy11bmljb2RlIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2hhcy11bmljb2RlLy0vaGFzLXVuaWNvZGUtMi4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS00T2IrYWlqUFVST0lWZUNHMFdrZWR4M2lxTGs9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaWNvbnYtbGl0ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNC4yNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaWNvbnYtbGl0ZS8tL2ljb252LWxpdGUtMC40LjI0LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi12M01YblpBY3ZueXdrVFVFWm9tSUFjdGxlN1JYWGVlZE9SMzF3d2w3Vmx5b1hPNFFpOWFydlNlbk5RV25lMVRjUndoQ0wxSHdMSTIxYkVxZHBqOC9yQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAic2FmZXItYnVmZmVyIjogIj49IDIuMS4yIDwgMyIKKyAgICAgIH0KKyAgICB9LAorICAgICJpZ25vcmUiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjAuNiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaWdub3JlLy0vaWdub3JlLTQuMC42LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1jeUZES3JxYy9ZZGNXRm5pSmh6STQyK0F6UytnTndtVXpPU0ZjUkNRWXd5U3VCQkJ5L0tqdXhXTFovRkhFSDZNb3ExTml6TU9CV3lUY3Y4TzRPWklNZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaW11cm11cmhhc2giOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaW11cm11cmhhc2gvLS9pbXVybXVyaGFzaC0wLjEuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWtoaTVzcmtvb2ppeFBjVDdhMjFYYnlNVVUrbz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpbmZsaWdodCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC42IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pbmZsaWdodC8tL2luZmxpZ2h0LTEuMC42LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtU2Ixak1kZlFMUXdKdkpFS0VIVzZnV1cxYmZrPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIm9uY2UiOiAiXjEuMy4wIiwKKyAgICAgICAgIndyYXBweSI6ICIxIgorICAgICAgfQorICAgIH0sCisgICAgImluaGVyaXRzIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2luaGVyaXRzLy0vaW5oZXJpdHMtMi4wLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1ZendzZytQYVFxVUM5U1JtQWlTQTlDQ0NZZDQ9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaW5pIjogeworICAgICAgInZlcnNpb24iOiAiMS4zLjUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2luaS8tL2luaS0xLjMuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItUlpZNWh1SUtDTVJXRFVxWmxFaTcyZi9sbVhLTXZ1c3pjTUJkdWxpUTNubldieDlYL1pCUU83RGlqTUVZUzlFaEhCYjJxYWNSVU10Qzdzdkx3ZTBsY3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlucXVpcmVyIjogeworICAgICAgInZlcnNpb24iOiAiNi4yLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lucXVpcmVyLy0vaW5xdWlyZXItNi4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVFJRVFHNFl5UTJVWVpHREM0c3JNWjdCakhPbU5rMWxSMkpRajVVa25CYXBrbG02V0hBK1ZWSDdOK3NVZFgzQTdOZUNmR0Y4bzRYMVMzQW83bkFjSWVnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhbnNpLWVzY2FwZXMiOiAiXjMuMC4wIiwKKyAgICAgICAgImNoYWxrIjogIl4yLjAuMCIsCisgICAgICAgICJjbGktY3Vyc29yIjogIl4yLjEuMCIsCisgICAgICAgICJjbGktd2lkdGgiOiAiXjIuMC4wIiwKKyAgICAgICAgImV4dGVybmFsLWVkaXRvciI6ICJeMy4wLjAiLAorICAgICAgICAiZmlndXJlcyI6ICJeMi4wLjAiLAorICAgICAgICAibG9kYXNoIjogIl40LjE3LjEwIiwKKyAgICAgICAgIm11dGUtc3RyZWFtIjogIjAuMC43IiwKKyAgICAgICAgInJ1bi1hc3luYyI6ICJeMi4yLjAiLAorICAgICAgICAicnhqcyI6ICJeNi4xLjAiLAorICAgICAgICAic3RyaW5nLXdpZHRoIjogIl4yLjEuMCIsCisgICAgICAgICJzdHJpcC1hbnNpIjogIl40LjAuMCIsCisgICAgICAgICJ0aHJvdWdoIjogIl4yLjMuNiIKKyAgICAgIH0KKyAgICB9LAorICAgICJpcy1jYWxsYWJsZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1jYWxsYWJsZS8tL2lzLWNhbGxhYmxlLTEuMS40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1yNXA5c3hKalluQXJMak9icGpBNHh1NUVLSTNDdUtIa0pYTWhUN2t3YnBVeUlGRDFuNVBNQXNvUHZXbnZ0WmlOejdMamtZRFJaaGQ3RmxJMGVNaWpFQT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaXMtZGF0ZS1vYmplY3QiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZGF0ZS1vYmplY3QvLS9pcy1kYXRlLW9iamVjdC0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLW1xSU90cTdydi9kL3ZUUG5US0FiTTFnZE9oWT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpcy1mdWxsd2lkdGgtY29kZS1wb2ludCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1mdWxsd2lkdGgtY29kZS1wb2ludC8tL2lzLWZ1bGx3aWR0aC1jb2RlLXBvaW50LTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbzdNS1hFOFprWU1XZXFxNU8rNzY0OTM3WlU4PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlzLXBhdGgtY3dkIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLXBhdGgtY3dkLy0vaXMtcGF0aC1jd2QtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0waVhzSXhNdWllM1RqOXAyZEhMbUxtWHhFRzA9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaXMtcGF0aC1pbi1jd2QiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtcGF0aC1pbi1jd2QvLS9pcy1wYXRoLWluLWN3ZC0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItRmpWMVJUVzQ4RTdDV003ZUUvSjJOSnZBRUVWZWt0ZWNEQlZCRTVIaDNuTTFKZDBrdmhIdFg2OFByM3hzRGY4NTd4dDNZNEFrd1ZVTEsxVmt1NjJhYVE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzLXBhdGgtaW5zaWRlIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJpcy1wYXRoLWluc2lkZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1wYXRoLWluc2lkZS8tL2lzLXBhdGgtaW5zaWRlLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtanZXMzNsQkRlai9jcHJUb1plOTZwVnkwZ0RZPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInBhdGgtaXMtaW5zaWRlIjogIl4xLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJpcy1wcm9taXNlIjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLXByb21pc2UvLS9pcy1wcm9taXNlLTIuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZWFLcDdPZndsdWdQTnRLeTg3d1d3ZjlMOC9vPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlzLXJlZ2V4IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLXJlZ2V4Ly0vaXMtcmVnZXgtMS4wLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1WUmRJbTFSd2tiQ1REZ2xXVk03U1h1bCtsSkU9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaGFzIjogIl4xLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJpcy1yZXNvbHZhYmxlIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLXJlc29sdmFibGUvLS9pcy1yZXNvbHZhYmxlLTEuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1xZ0RZWEZTUjVXdkVmdVM1ZE1qNm9UTUVicnJTYU0wQ3JGazJZaXEvZ1huQnZEOXBNYTJqR1h4eWhHTGZ2aFpwdU1aZTE4Q0pwRnhBdDNDUnM0Mk5NZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaXMtc3ltYm9sIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLXN5bWJvbC8tL2lzLXN5bWJvbC0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItSFM4Ylo5b3g2MHlDSkxIOXNuQnBJd3Y5cFlVQWtjdUxoU0Exb2VybzFVQjV5OWFpUXBSQTh5MmV4OTQ1QU90Q1pMMWxKRGVJazNHNUx0aHN3STQ2THc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImhhcy1zeW1ib2xzIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJpc2FycmF5IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzYXJyYXkvLS9pc2FycmF5LTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdTVOZFNGZ3N1aGFNQm9OSlY2VktQZ2NTVHhFPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlzZXhlIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzZXhlLy0vaXNleGUtMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS02UHZ6ZE54VmIvaVVlaERjc0ZjdFl6OHMraEE9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaXN0YW5idWwiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjQuNSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXN0YW5idWwvLS9pc3RhbmJ1bC0wLjQuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVpjZlhQVXhOcUUxUE9zTVF1Umo3QzRBemN6cz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhYmJyZXYiOiAiMS4wLngiLAorICAgICAgICAiYXN5bmMiOiAiMS54IiwKKyAgICAgICAgImVzY29kZWdlbiI6ICIxLjgueCIsCisgICAgICAgICJlc3ByaW1hIjogIjIuNy54IiwKKyAgICAgICAgImdsb2IiOiAiXjUuMC4xNSIsCisgICAgICAgICJoYW5kbGViYXJzIjogIl40LjAuMSIsCisgICAgICAgICJqcy15YW1sIjogIjMueCIsCisgICAgICAgICJta2RpcnAiOiAiMC41LngiLAorICAgICAgICAibm9wdCI6ICIzLngiLAorICAgICAgICAib25jZSI6ICIxLngiLAorICAgICAgICAicmVzb2x2ZSI6ICIxLjEueCIsCisgICAgICAgICJzdXBwb3J0cy1jb2xvciI6ICJeMy4xLjAiLAorICAgICAgICAid2hpY2giOiAiXjEuMS4xIiwKKyAgICAgICAgIndvcmR3cmFwIjogIl4xLjAuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZXNwcmltYSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjcuMyIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzcHJpbWEvLS9lc3ByaW1hLTIuNy4zLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLWx1TzNEVmQ1OXExSnpRTW1jOUhERW5aN3BZRT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0sCisgICAgICAgICJnbG9iIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjUuMC4xNSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dsb2IvLS9nbG9iLTUuMC4xNS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1HOGsydWVBdlNtQS96Q0l1ejNZejB3dUxrN0U9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaW5mbGlnaHQiOiAiXjEuMC40IiwKKyAgICAgICAgICAgICJpbmhlcml0cyI6ICIyIiwKKyAgICAgICAgICAgICJtaW5pbWF0Y2giOiAiMiB8fCAzIiwKKyAgICAgICAgICAgICJvbmNlIjogIl4xLjMuMCIsCisgICAgICAgICAgICAicGF0aC1pcy1hYnNvbHV0ZSI6ICJeMS4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAiaGFzLWZsYWciOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9oYXMtZmxhZy8tL2hhcy1mbGFnLTEuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLW5aNTVNV1hPQVhvQThBUVl4RCtVS25zZEVmbz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0sCisgICAgICAgICJzdXBwb3J0cy1jb2xvciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIzLjIuMyIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N1cHBvcnRzLWNvbG9yLy0vc3VwcG9ydHMtY29sb3ItMy4yLjMudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWmF3RkJMT1ZRWEhZcGtsR3NxNDh1NHBmVlBZPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImhhcy1mbGFnIjogIl4xLjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJqcy10b2tlbnMiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvanMtdG9rZW5zLy0vanMtdG9rZW5zLTQuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1SZEpVZmxjRTNjVXpLaU1xUWdzQ3UwNkZQdTlVZElKTzBiZVliUGhITjRrNmFwZ0p0aWZjb0N0VDliY3hPcFlCdHBEMmtDTTZTYnpnNENhdXNXL1BLUT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAianMteWFtbCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMTIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvanMteWFtbC8tL2pzLXlhbWwtMy4xMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1QSXQyY253bVBmTDRoS053cWVpdXo0YktmbnpIVEJ2Nkh5VmdqYWhBNm1QTHdQRHpqRFdycGxKQk1qSFVGeGt1L04zRmxtcmJ5UGNsYWQrSSs0bUozQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXJncGFyc2UiOiAiXjEuMC43IiwKKyAgICAgICAgImVzcHJpbWEiOiAiXjQuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImpzMnhtbHBhcnNlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qczJ4bWxwYXJzZXIvLS9qczJ4bWxwYXJzZXItMy4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1QN1lPcWdpY1ZFRDVNWjlSZGd6TkIrSkpsek09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAieG1sY3JlYXRlIjogIl4xLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJqc2RvYyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuNS41IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qc2RvYy8tL2pzZG9jLTMuNS41LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi02UHhCNjVUQVU0V08wV3p5ci80L1lobEdvdlhsMEVWWWZwS2JwU3JvU2owcUJ4VDQveG9kL2w0ME9wa20zOGRSSFJkUWdkZVk4MzZNMHVWbkpRRzdrZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYmFieWxvbiI6ICI3LjAuMC1iZXRhLjE5IiwKKyAgICAgICAgImJsdWViaXJkIjogIn4zLjUuMCIsCisgICAgICAgICJjYXRoYXJzaXMiOiAifjAuOC45IiwKKyAgICAgICAgImVzY2FwZS1zdHJpbmctcmVnZXhwIjogIn4xLjAuNSIsCisgICAgICAgICJqczJ4bWxwYXJzZXIiOiAifjMuMC4wIiwKKyAgICAgICAgImtsYXciOiAifjIuMC4wIiwKKyAgICAgICAgIm1hcmtlZCI6ICJ+MC4zLjYiLAorICAgICAgICAibWtkaXJwIjogIn4wLjUuMSIsCisgICAgICAgICJyZXF1aXp6bGUiOiAifjAuMi4xIiwKKyAgICAgICAgInN0cmlwLWpzb24tY29tbWVudHMiOiAifjIuMC4xIiwKKyAgICAgICAgInRhZmZ5ZGIiOiAiMi42LjIiLAorICAgICAgICAidW5kZXJzY29yZSI6ICJ+MS44LjMiCisgICAgICB9CisgICAgfSwKKyAgICAianNvbi1zY2hlbWEtdHJhdmVyc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjQuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvanNvbi1zY2hlbWEtdHJhdmVyc2UvLS9qc29uLXNjaGVtYS10cmF2ZXJzZS0wLjQuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTIteGJiQ0g1ZENZVTVUOExjRWhodWg3SEo4OEhYdVczcXNJM1kwek9aRktmWkVIY3BXaUhVL0p4ems2MjlCcnNhYi9tTWlIUXRpOXdNUCs4NDVSUGUzVmc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImpzb24tc3RhYmxlLXN0cmluZ2lmeS13aXRob3V0LWpzb25pZnkiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvanNvbi1zdGFibGUtc3RyaW5naWZ5LXdpdGhvdXQtanNvbmlmeS8tL2pzb24tc3RhYmxlLXN0cmluZ2lmeS13aXRob3V0LWpzb25pZnktMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1uYmUxbEphdFB6eis4d3AxRkMwdGt3clhKbEU9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAia2xhdyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9rbGF3Ly0va2xhdy0yLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVdjRW80TnhjNUJBZ0VWRVpUdXVjdjRXR1VQWT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJncmFjZWZ1bC1mcyI6ICJeNC4xLjkiCisgICAgICB9CisgICAgfSwKKyAgICAibGV2biI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9sZXZuLy0vbGV2bi0wLjMuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU93bVNUdCtmQ0R3RWtQM1V3THhFSWVCSFpPND0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJwcmVsdWRlLWxzIjogIn4xLjEuMiIsCisgICAgICAgICJ0eXBlLWNoZWNrIjogIn4wLjMuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJsb2Rhc2giOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjE3LjExIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9sb2Rhc2gvLS9sb2Rhc2gtNC4xNy4xMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItY1FLaDhpZ281UVVoWjdsZzM4RFlXQXhNdmpTQUtHMEE4d0dTVmltUDA3U0lVRUsyVU8rYXJTUktiUlpXdGVsTXRONVYwSGt3aDVyeU90by9Tc2hZSWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm1hcmtlZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMy4xOSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9tYXJrZWQvLS9tYXJrZWQtMC4zLjE5LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1lYTJlR1dPcU54UGNYdjhkeUVSZFNyLzZGbXp2V3d6ak14cGZHQi9zYk1jY1hvY3QreFkrWXVrUEQrUVRVWnd5dks3Qlp3Y3I0bTIxV0JPVzQxcEFrZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAibWltaWMtZm4iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWltaWMtZm4vLS9taW1pYy1mbi0xLjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItamY4NHV4endpdWlJVktpT0xwZllrN040NlRTeTh1YlRvbm1uZVk5dnJwSE5BbnAwUUJ0MkJ4V1Y5ZE8zL2orQm9WQWIrYTVHNllEUFczTTVIT2RNV1E9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm1pbWljLXJlc3BvbnNlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21pbWljLXJlc3BvbnNlLy0vbWltaWMtcmVzcG9uc2UtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWo1RWN0bmtIN2FtZlYvcTVIZ21vYWwxZzJRSEZKUnJhT3RteDBKcElxa3hoQmhJL2xKU2wxbk1wUTQ1aFZhcndORVRPb1dFaW1uZFo0UUswUkh4dXhRPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJtaW5pbWF0Y2giOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWluaW1hdGNoLy0vbWluaW1hdGNoLTMuMC40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi15SkhWUUVoeXFQTFVUZ3Q5QjgzUFh1Nlczcng0TXZ2SHZTVXZUb29ncHdvR0RPVVEreURyUjBIUm90K3lPQ2RDTzd1NGhYM3BXZnQ2a1dCQmNxaDBVQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYnJhY2UtZXhwYW5zaW9uIjogIl4xLjEuNyIKKyAgICAgIH0KKyAgICB9LAorICAgICJtaW5pbWlzdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMC44IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL21pbmltaXN0Ly0vbWluaW1pc3QtMC4wLjgudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1oWC9LdjhNNWZTWWx1Q0tDWXVocXA2QVJzRjA9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAibWtkaXJwIjogeworICAgICAgInZlcnNpb24iOiAiMC41LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWtkaXJwLy0vbWtkaXJwLTAuNS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTUFWME9Pckd6MytNUjJmemhraldhWDExeVFNPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIm1pbmltaXN0IjogIjAuMC44IgorICAgICAgfQorICAgIH0sCisgICAgIm1zIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21zLy0vbXMtMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1WZ2l1cmZ3QXZtd3BBZDlmbUdGNGplRFZsOGc9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAibXV0ZS1zdHJlYW0iOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjAuNyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbXV0ZS1zdHJlYW0vLS9tdXRlLXN0cmVhbS0wLjAuNy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU1IWE9rN3dodVBxMFBodkUybjZCRmUwZWU2cz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJuYW4iOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEwLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbmFuLy0vbmFuLTIuMTAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItYkFkSnY3ZkJMaFdDKy9CbHMwT3phK212VGFOUXRQKzFSeWhoaHZEOTVwZ1VKejZYTTVJemdteE9rSXRKOXRrb0NpcGx2QW5YSTF0Tm1tVUQvZVNjeUE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm5hdHVyYWwtY29tcGFyZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuNC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9uYXR1cmFsLWNvbXBhcmUvLS9uYXR1cmFsLWNvbXBhcmUtMS40LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1TcjYvN3RkVUh5d25yUHNwdmJ2UlhJMWJwUGM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAibmljZS10cnkiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuNSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbmljZS10cnkvLS9uaWNlLXRyeS0xLjAuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItMW5oNDVkZWViNW9sTlk3ZVg4MkJrUE83U1N4UjVTU1lKaVBUclRkRlVWWXdBbDhDS01BNU45UGpUWWtIaVJqaXNWY3hjUTFIWGRMaHgycXh4SnpMTlE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm5vZGUtYWJpIjogeworICAgICAgInZlcnNpb24iOiAiMi40LjUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL25vZGUtYWJpLy0vbm9kZS1hYmktMi40LjUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWFhL1VDNk5yMyt0cWhIR1JzQXV3L2VkejcvcTlubmV0QnJLV3hqNnJwVHRtKzBYOVQxcVU3bElFSE1TM3lOOUp3QWJSaUtVYlJSRnkxUEx6L3kzYWFBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJzZW12ZXIiOiAiXjUuNC4xIgorICAgICAgfQorICAgIH0sCisgICAgIm5vZGUtaW50NjQiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjQuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbm9kZS1pbnQ2NC8tL25vZGUtaW50NjQtMC40LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1oNmtHWE5zMVhUR0MyUGxNNFJHSXVDWEdpanM9IgorICAgIH0sCisgICAgIm5vb3AtbG9nZ2VyIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL25vb3AtbG9nZ2VyLy0vbm9vcC1sb2dnZXItMC4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1sS0t4WXp4UEV4ZFZNQWZZbG0vUTZFRzJwTUk9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAibm9wdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC42IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ub3B0Ly0vbm9wdC0zLjAuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXhrWmR2d2lyelUyeldURi9lYXhvcGtheWovaz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhYmJyZXYiOiAiMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJucG1sb2ciOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbnBtbG9nLy0vbnBtbG9nLTQuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0ydVVxYXp1S2xUYVNJL2RDOEF6aWNVY2s3K0lyRWFPbk4vZTBqZDNYdHQxS2NHcHd4MzB2NTBtTDdvUHlyL2g5YkwzRTRhWmNjVndwd1ArNVc5VmprZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXJlLXdlLXRoZXJlLXlldCI6ICJ+MS4xLjIiLAorICAgICAgICAiY29uc29sZS1jb250cm9sLXN0cmluZ3MiOiAifjEuMS4wIiwKKyAgICAgICAgImdhdWdlIjogIn4yLjcuMyIsCisgICAgICAgICJzZXQtYmxvY2tpbmciOiAifjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgIm51bWJlci1pcy1uYW4iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbnVtYmVyLWlzLW5hbi8tL251bWJlci1pcy1uYW4tMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1DWHRnSzFOQ0tsSXNHdnVIa0RHRE5wUWFBUjA9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAib2JqZWN0LWFzc2lnbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vYmplY3QtYXNzaWduLy0vb2JqZWN0LWFzc2lnbi00LjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUlRbXR4NVpZaDgvQVhMdlVRc3JJdjdzMkNHTT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJvYmplY3QtaW5zcGVjdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuNi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vYmplY3QtaW5zcGVjdC8tL29iamVjdC1pbnNwZWN0LTEuNi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1HSnpmQlo2RGdEQW1udWFNMzEwNGpSNHMxTXl4cjNZM3pmSXlONHozVWRxTjY5b1NSYWNOSzhVaG5vYkRkQys3SjJBSENqR3d4UXViTkpmRTcwU1hYUT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAib2JqZWN0LWtleXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMTIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29iamVjdC1rZXlzLy0vb2JqZWN0LWtleXMtMS4wLjEyLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1GVE15RlVtMndCY0dIbkgyZVhtejd0QzZJd2xxUVo2bVZaKzZkbTZ2WjRJUUlIanM2RmROc1FCdUtHUHVVVVVZNk5mSncyUHNoQzA4VG42THpMRE9hZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAib24tZmluaXNoZWQiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjMuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvb24tZmluaXNoZWQvLS9vbi1maW5pc2hlZC0yLjMuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUlQRXpaSUd3ZzgxMU0zbVNvV2x4cWkyUWFVYz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJlZS1maXJzdCI6ICIxLjEuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJvbmNlIjogeworICAgICAgInZlcnNpb24iOiAiMS40LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29uY2UvLS9vbmNlLTEuNC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtV0RzYXAzV1dIVXNST3NGOW5GQzY3NTNYYTlFPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIndyYXBweSI6ICIxIgorICAgICAgfQorICAgIH0sCisgICAgIm9uZXRpbWUiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvb25ldGltZS8tL29uZXRpbWUtMi4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1CblFvSXcvV2RFT3llVXNpdTZVb3RvWjVZdFE9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAibWltaWMtZm4iOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgIm9wdGltaXN0IjogeworICAgICAgInZlcnNpb24iOiAiMC42LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29wdGltaXN0Ly0vb3B0aW1pc3QtMC42LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0yajZuUm9iNklhR2FFUnd5YnBEckZhQVpab1k9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAibWluaW1pc3QiOiAifjAuMC4xIiwKKyAgICAgICAgIndvcmR3cmFwIjogIn4wLjAuMiIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAid29yZHdyYXAiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMC4wLjMiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy93b3Jkd3JhcC8tL3dvcmR3cmFwLTAuMC4zLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLW85WGFiTlhBdkFBSTAzSTB1NjhiN1dNRmtRYz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJvcHRpb25hdG9yIjogeworICAgICAgInZlcnNpb24iOiAiMC44LjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29wdGlvbmF0b3IvLS9vcHRpb25hdG9yLTAuOC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTmt4ZVFKMC9UV01CMXNDMHdGdTZVQmdLNjJRPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRlZXAtaXMiOiAifjAuMS4zIiwKKyAgICAgICAgImZhc3QtbGV2ZW5zaHRlaW4iOiAifjIuMC40IiwKKyAgICAgICAgImxldm4iOiAifjAuMy4wIiwKKyAgICAgICAgInByZWx1ZGUtbHMiOiAifjEuMS4yIiwKKyAgICAgICAgInR5cGUtY2hlY2siOiAifjAuMy4yIiwKKyAgICAgICAgIndvcmR3cmFwIjogIn4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJvcy1ob21lZGlyIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29zLWhvbWVkaXIvLS9vcy1ob21lZGlyLTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtLzd4SmlETnVEb005NE1Gb3grOFZJU0dxZjdNPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm9zLXRtcGRpciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vcy10bXBkaXIvLS9vcy10bXBkaXItMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS11K1owQnNlYXFGeGMvc2RtL2xjMFZWMzZFblE9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGFyc2V1cmwiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjMuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGFyc2V1cmwvLS9wYXJzZXVybC0xLjMuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLS9DaWRUdGlaTVJsR0RCVmlVeVlzM0kzbVcvTT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwYXRoLWlzLWFic29sdXRlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BhdGgtaXMtYWJzb2x1dGUvLS9wYXRoLWlzLWFic29sdXRlLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRjB1U2FITlZOUCs4ZXM1cjlUcGFuaHRjWDE4PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInBhdGgtaXMtaW5zaWRlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BhdGgtaXMtaW5zaWRlLy0vcGF0aC1pcy1pbnNpZGUtMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1ObFFYM3Q1RVF3MGNFYTloQW4rczhIUzkvRk09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGF0aC1rZXkiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGF0aC1rZXkvLS9wYXRoLWtleS0yLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVFSeXR0WFRGb1VEVHBMR1JEVURZRE1uMEMwQT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwYXRoLXBhcnNlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjYiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BhdGgtcGFyc2UvLS9wYXRoLXBhcnNlLTEuMC42LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1HU21PVDJFYkhySU5CZjlTUjdDREVMd2xKOEFFTmszUW43T2lrSzRuRllBdTNPdGUyK0pZTlZ2a3BBRVFtMy9UTE5FSkZEL3haSmp6eXhnM0tCV096dz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGlmeSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL3BpZnkvLS9waWZ5LTIuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtN1JRYWFzQkRxRW5xV0lTWTU5eW9zVk13NlF3PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInBpbmtpZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9waW5raWUvLS9waW5raWUtMi4wLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1jbFZyZ00rZzFJcVhUb0RuY2tqb0R0VDMrSEE9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGlua2llLXByb21pc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGlua2llLXByb21pc2UvLS9waW5raWUtcHJvbWlzZS0yLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUlUWFczNmVqV01CcHJKc1hoM1lvZ2loRkQvbz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJwaW5raWUiOiAiXjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInBsdXJhbGl6ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjcuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wbHVyYWxpemUvLS9wbHVyYWxpemUtNy4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUFSaEJPZHpTM2U0MUZia1cvWFdyVEV0dWtxcUxvSzUrWi80VWVEYUx1U1crMzlKUGVGZ3M0Z0NHcXNySkhWWlgwZlVyeC8vNE9GMEsxQ1VHd2xJRm93PT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwcmVidWlsZC1pbnN0YWxsIjogeworICAgICAgInZlcnNpb24iOiAiNC4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3ByZWJ1aWxkLWluc3RhbGwvLS9wcmVidWlsZC1pbnN0YWxsLTQuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi03dGF5eGVZYm9KWDBSYlZ6ZG5LeUdsMnZoUVJXcjZxZkNsRVhEaE9rWGp1YU9LQ3cycThhaXVGaE9OUllWc0cvY3ppYTdLaHB5a0lsSTJTMlZhUHVuQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZGV0ZWN0LWxpYmMiOiAiXjEuMC4zIiwKKyAgICAgICAgImV4cGFuZC10ZW1wbGF0ZSI6ICJeMS4wLjIiLAorICAgICAgICAiZ2l0aHViLWZyb20tcGFja2FnZSI6ICIwLjAuMCIsCisgICAgICAgICJtaW5pbWlzdCI6ICJeMS4yLjAiLAorICAgICAgICAibWtkaXJwIjogIl4wLjUuMSIsCisgICAgICAgICJub2RlLWFiaSI6ICJeMi4yLjAiLAorICAgICAgICAibm9vcC1sb2dnZXIiOiAiXjAuMS4xIiwKKyAgICAgICAgIm5wbWxvZyI6ICJeNC4wLjEiLAorICAgICAgICAib3MtaG9tZWRpciI6ICJeMS4wLjEiLAorICAgICAgICAicHVtcCI6ICJeMi4wLjEiLAorICAgICAgICAicmMiOiAiXjEuMS42IiwKKyAgICAgICAgInNpbXBsZS1nZXQiOiAiXjIuNy4wIiwKKyAgICAgICAgInRhci1mcyI6ICJeMS4xMy4wIiwKKyAgICAgICAgInR1bm5lbC1hZ2VudCI6ICJeMC42LjAiLAorICAgICAgICAid2hpY2gtcG0tcnVucyI6ICJeMS4wLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgIm1pbmltaXN0IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMi4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9taW5pbWlzdC8tL21pbmltaXN0LTEuMi4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLW8xQUlzZzlCT0Q3c0g3a1U5TTFkOTVvbVFvUT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJwcmVsdWRlLWxzIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3ByZWx1ZGUtbHMvLS9wcmVsdWRlLWxzLTEuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSVpNcVZKOWVVdi9acUNmMWNPQkw1aXFYMmxRPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInByZXR0aWVyIjogeworICAgICAgInZlcnNpb24iOiAiMS4xNC4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wcmV0dGllci8tL3ByZXR0aWVyLTEuMTQuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItcVpEVm5Dcm5wc1JKSnE1blNzaUhDRTNCWU1FRDJPdHNJK2Ntekl6RjFRSWZxbTVBTGY4dEVKY08yN3pWMWdLTktSUGRoak8wZE5XbnJ6c3NEUTF0Rmc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInByZXR0aWVyLWxpbnRlci1oZWxwZXJzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3ByZXR0aWVyLWxpbnRlci1oZWxwZXJzLy0vcHJldHRpZXItbGludGVyLWhlbHBlcnMtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUdiSzJjUDlucmFTU1VGOU4yWHdVd3FmemxBRmxNTllZbCtTaEUvVitIOGE5dU5sL29VcUIxdzJFTDU0SmgwT2x5UlNkOFJmV1lKM2NvVlM0VFJPUDJ3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJmYXN0LWRpZmYiOiAiXjEuMS4yIgorICAgICAgfQorICAgIH0sCisgICAgInByb2Nlc3MtbmV4dGljay1hcmdzIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Byb2Nlc3MtbmV4dGljay1hcmdzLy0vcHJvY2Vzcy1uZXh0aWNrLWFyZ3MtMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU10RUMxVHFOMEVVNW5lcGhhSjRyQXRUaEh0Qzg2ZE5OOXFDdUVodHNodnBWQmtBVzVaTzdCQVNOOVJFbkY5ZW9YR2NSdWIrcEZ1S0VwT0hFK0hiRU13PT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwcm9ncmVzcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wcm9ncmVzcy8tL3Byb2dyZXNzLTIuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1PRSthNnZ6cWF6YytLNkx4SnJYNVVQeUtGdkduTDVDWW1xMmpGR05JQldIcGM0UXlFNDkvWU91bWNycFFGSnBmZWptdlJ0Ykp6Z08xelBtTUNxbGJCZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicHVtcCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wdW1wLy0vcHVtcC0yLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItcnVQTU5Sa04zTUhQMWNXSmM5T1dyK1QveERQMGpoWFlDTGZKY0J1WDU0aGhmSUJuYVFtQVVNZkRjRzRETTVVTVdCeUJiSlk2OVFTcGhtM2p0REtJa0E9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImVuZC1vZi1zdHJlYW0iOiAiXjEuMS4wIiwKKyAgICAgICAgIm9uY2UiOiAiXjEuMy4xIgorICAgICAgfQorICAgIH0sCisgICAgInB1bnljb2RlIjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3B1bnljb2RlLy0vcHVueWNvZGUtMi4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVhSc1JqZGYrajVtbCt5LzZHS0hQWmJyRi84cDJZZ2EwSlB0ZHFUSVkyWGU1b2hKUEQ5c2FESkpMUHZwOStOU0JwclZ2ZXZkWFp5Ym5qMmN2OE9FZDBBPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJxIjogeworICAgICAgInZlcnNpb24iOiAiMS41LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3EvLS9xLTEuNS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZmpMM1cwRTRFcEhRUmhIeHZ4UVFtc0FHVWRjPSIKKyAgICB9LAorICAgICJyYyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMi44IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yYy8tL3JjLTEuMi44LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi15M2JHZ3FLajNRQmR4TGJMa29tbG9oa3ZzQThnZEFpVVFsU0JKbkJoZm4rQlB4ZzRiYzYyZDhUY0JXMTV3YXZEZmdleENnY2Nja2hjWnZ5d3lRWVBPdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZGVlcC1leHRlbmQiOiAiXjAuNi4wIiwKKyAgICAgICAgImluaSI6ICJ+MS4zLjAiLAorICAgICAgICAibWluaW1pc3QiOiAiXjEuMi4wIiwKKyAgICAgICAgInN0cmlwLWpzb24tY29tbWVudHMiOiAifjIuMC4xIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJtaW5pbWlzdCI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjIuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWluaW1pc3QvLS9taW5pbWlzdC0xLjIuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1vMUFJc2c5Qk9EN3NIN2tVOU0xZDk1b21Rb1E9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAicmVhZGFibGUtc3RyZWFtIjogeworICAgICAgInZlcnNpb24iOiAiMi4zLjYiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVhZGFibGUtc3RyZWFtLy0vcmVhZGFibGUtc3RyZWFtLTIuMy42LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi10UXRLQTlXSUFoQkYzK1ZMQXNleU1xWmVCalcwQUhKb3hPdFlxU1VaTkp4YXVFcm1MYlZtMkZXMXkrSi9ZQTlkVXJBQzM5SVRlamxaV2hWSXdhd2tLdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY29yZS11dGlsLWlzIjogIn4xLjAuMCIsCisgICAgICAgICJpbmhlcml0cyI6ICJ+Mi4wLjMiLAorICAgICAgICAiaXNhcnJheSI6ICJ+MS4wLjAiLAorICAgICAgICAicHJvY2Vzcy1uZXh0aWNrLWFyZ3MiOiAifjIuMC4wIiwKKyAgICAgICAgInNhZmUtYnVmZmVyIjogIn41LjEuMSIsCisgICAgICAgICJzdHJpbmdfZGVjb2RlciI6ICJ+MS4xLjEiLAorICAgICAgICAidXRpbC1kZXByZWNhdGUiOiAifjEuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgInJlZ2V4cHAiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVnZXhwcC8tL3JlZ2V4cHAtMi4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWx2ME02K1RrRFZuaUEzYUQxRWcwRFZwZlUvYm9vU3U3RWV2M1RETy9tWktIQmZWamdDR1RWNHQ0YnVwcEVTRVlEdGtBcllGT3hUSld2NlM1QytpYU53PT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJyZXF1aXJlLXVuY2FjaGVkIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JlcXVpcmUtdW5jYWNoZWQvLS9yZXF1aXJlLXVuY2FjaGVkLTEuMC4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVGcxVzFzbG1MOU1lUXdFY1M1V3FTWlZVSWRNPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNhbGxlci1wYXRoIjogIl4wLjEuMCIsCisgICAgICAgICJyZXNvbHZlLWZyb20iOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInJlcXVpenpsZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMi4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZXF1aXp6bGUvLS9yZXF1aXp6bGUtMC4yLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1hVVBEVXd4Tm1uNUc4YzNkVWNGWS9HY00yOTQ9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAidW5kZXJzY29yZSI6ICJ+MS42LjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgInVuZGVyc2NvcmUiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS42LjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91bmRlcnNjb3JlLy0vdW5kZXJzY29yZS0xLjYuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1peml4REt6ZTlqTTN1TEpPVC9odFJhNmxLYWc9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAicmVzb2x2ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS43IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZXNvbHZlLy0vcmVzb2x2ZS0xLjEuNy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUlERVUyQ3JTeGUyZWpnUVJzNU1vZGVpSjZYcz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJyZXNvbHZlLWZyb20iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVzb2x2ZS1mcm9tLy0vcmVzb2x2ZS1mcm9tLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSnN2K2sxMGE3dXE3S2J3LzVhNndIcFBVUWlZPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInJlc3RvcmUtY3Vyc29yIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Jlc3RvcmUtY3Vyc29yLy0vcmVzdG9yZS1jdXJzb3ItMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1uMzdpaC9ndjB5YlUvUllwSTlZaEtlN2czNjg9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAib25ldGltZSI6ICJeMi4wLjAiLAorICAgICAgICAic2lnbmFsLWV4aXQiOiAiXjMuMC4yIgorICAgICAgfQorICAgIH0sCisgICAgInJlc3VtZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVzdW1lci8tL3Jlc3VtZXItMC4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS04ZWowWWVRR1M2T2VncTg4M0NxTWlUMEhaMWs9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAidGhyb3VnaCI6ICJ+Mi4zLjQiCisgICAgICB9CisgICAgfSwKKyAgICAicmltcmFmIjogeworICAgICAgInZlcnNpb24iOiAiMi42LjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JpbXJhZi8tL3JpbXJhZi0yLjYuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItbHJlZXdMSy9CbGdobXh0ZkgzNllZVmcxaThJQWNlNFRJN29hbzc1STFnMjQ1KzZCY3RxVFZRaUJQM1lVSjlDNkRRT1hKbWtZUjlYOWZDTHRDT0pjNXc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImdsb2IiOiAiXjcuMC41IgorICAgICAgfQorICAgIH0sCisgICAgInJ1bi1hc3luYyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ydW4tYXN5bmMvLS9ydW4tYXN5bmMtMi4zLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1BM0dyU3VDOTF5RFVGbTE5L2FaUDk2UkZwc0E9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXMtcHJvbWlzZSI6ICJeMi4xLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicnhqcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjYuMy4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yeGpzLy0vcnhqcy02LjMuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItSlRXbW9ZOXRXQ3M3enZJay9DdlJqaGpHYU9kK09WQk05ODdteEZvK09XNjZjR3BkS2paY3BtYzc0RVMxc0IvLzdLbC9QQWU4K3dFYWt1aEc0cGNnT3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInRzbGliIjogIl4xLjkuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJzYWZlLWJ1ZmZlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjUuMS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zYWZlLWJ1ZmZlci8tL3NhZmUtYnVmZmVyLTUuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1HZDJVWkJKRGtYbFk3R2JKeGZzRTgvbnZLa1VFVTFHMzhjMXNpTjZRUDZhOVBUOU1tSEI4R25wc2NTbU1KU29GOExPSXJ0OHVkL3dQdG9qeXM0RzYrZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic2FmZXItYnVmZmVyIjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NhZmVyLWJ1ZmZlci8tL3NhZmVyLWJ1ZmZlci0yLjEuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItWVpvM0s4MlNEN1JpeWkwRTFFUVBvakx6N2twZXBuU1FJOUl5UGJISGcxWFhYZXZiNWRKSTd0cHlOMkFEeEdjUWJIRzd2Y3lSSGswY2J3cWNRcmlVdGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInNlbXZlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjUuNi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zZW12ZXIvLS9zZW12ZXItNS42LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVJTOVI2UjM1TllnUW4rK2ZrRFdhT21xR29qNEVrOWdHcytEUHhOVVpLdXdFMTgzeGpKcm9LdnlvMUl6VkZlWHZVcnZtQUx5NkZXRDV4cmRKVDI1Z01nPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJzZXQtYmxvY2tpbmciOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2V0LWJsb2NraW5nLy0vc2V0LWJsb2NraW5nLTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtQkYrWGd0QVJycHBvQTkzVGdySkRrclBZa1BjPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInNoZWJhbmctY29tbWFuZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zaGViYW5nLWNvbW1hbmQvLS9zaGViYW5nLWNvbW1hbmQtMS4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1SS3JHVzJsYkF6bUphTU9mTmovdVhlcjk4ZW89IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAic2hlYmFuZy1yZWdleCI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAic2hlYmFuZy1yZWdleCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zaGViYW5nLXJlZ2V4Ly0vc2hlYmFuZy1yZWdleC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTJrTDBsMERBdEMyeXlwY29WeHl4a01tTy9xTT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJzaWduYWwtZXhpdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zaWduYWwtZXhpdC8tL3NpZ25hbC1leGl0LTMuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdGYzQWp4S0g2aEY0WW81QlhpVVRLM05rYkcwPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInNpbXBsZS1jb25jYXQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2ltcGxlLWNvbmNhdC8tL3NpbXBsZS1jb25jYXQtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1jMFRMdUxiaWI3Sjlackw4aHZuMjFabDFJY1k9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic2ltcGxlLWdldCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuOC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zaW1wbGUtZ2V0Ly0vc2ltcGxlLWdldC0yLjguMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItbFNTSFJTdzNtUU5VR1BBWVJxbzd4eTlkaEtteEZYSWpManA0S0hwZjk5R0VIMlZIN0MzQU0rUWZ4NmR1NmpoZlVpNlZtN1huYkVWRWY3V2I2TjhqUnc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRlY29tcHJlc3MtcmVzcG9uc2UiOiAiXjMuMy4wIiwKKyAgICAgICAgIm9uY2UiOiAiXjEuMy4xIiwKKyAgICAgICAgInNpbXBsZS1jb25jYXQiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInNsaWNlLWFuc2kiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2xpY2UtYW5zaS8tL3NsaWNlLWFuc2ktMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVBPcXhCSzZMYjNxNnMwNDdEL1hzRFZOUG5GOURsOEpTYXFlOWg5bFVSbDBPZE5xeS91akRyT2lJSHRzcVhNR2JXV1RJb21SekFNYVR5YXdBVS8vUmVnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpcy1mdWxsd2lkdGgtY29kZS1wb2ludCI6ICJeMi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAic291cmNlLW1hcCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zb3VyY2UtbWFwLy0vc291cmNlLW1hcC0wLjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTJyYy92UHdycUJtMDNnTzliMjZxU0JaTFA1MD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYW1kZWZpbmUiOiAiPj0wLjAuNCIKKyAgICAgIH0KKyAgICB9LAorICAgICJzcHJpbnRmLWpzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NwcmludGYtanMvLS9zcHJpbnRmLWpzLTEuMC4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtQk9hU2IyWW9sVFZQUGRBVklEWXp1RmNwZml3PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInN0YXR1c2VzIjogeworICAgICAgInZlcnNpb24iOiAiMS4zLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N0YXR1c2VzLy0vc3RhdHVzZXMtMS4zLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0rdlVibnJkS3J2T3pyUFN0WDJHcjhreTN1VDQ9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic3RyaW5nLXdpZHRoIjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N0cmluZy13aWR0aC8tL3N0cmluZy13aWR0aC0yLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItbk9xSDU5ZGVDcTlTUkhseHExQXc4NUpudDR3Nkt2TEtxV1ZpazZvQTlaa2xYTE5JT2xxZzRGMnlyVDFNVmFUakFxdlZ3ZGZlWjd3N2FDdkpEN3Vna3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzLWZ1bGx3aWR0aC1jb2RlLXBvaW50IjogIl4yLjAuMCIsCisgICAgICAgICJzdHJpcC1hbnNpIjogIl40LjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJzdHJpbmcucHJvdG90eXBlLnRyaW0iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3RyaW5nLnByb3RvdHlwZS50cmltLy0vc3RyaW5nLnByb3RvdHlwZS50cmltLTEuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtMEUzaXlKNFRmMDE5SUc4SWExN1MrdWErak9vPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0aWVzIjogIl4xLjEuMiIsCisgICAgICAgICJlcy1hYnN0cmFjdCI6ICJeMS41LjAiLAorICAgICAgICAiZnVuY3Rpb24tYmluZCI6ICJeMS4wLjIiCisgICAgICB9CisgICAgfSwKKyAgICAic3RyaW5nX2RlY29kZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3RyaW5nX2RlY29kZXIvLS9zdHJpbmdfZGVjb2Rlci0xLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItbi9TaG52RGk2RkhiYlZmdmlybytXb2ppRnp2K3M4TVBNSEJjelZlUGZVcERKTHdvTFQwaHQxbDRZd0JDYmk4cEpBdmVFRWRua0h5UHlUUC9telJmd2c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInNhZmUtYnVmZmVyIjogIn41LjEuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJzdHJpcC1hbnNpIjogeworICAgICAgInZlcnNpb24iOiAiNC4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N0cmlwLWFuc2kvLS9zdHJpcC1hbnNpLTQuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcUVlUUl1c2F3MmlvY1RpYlkxSml4UVh1Tm84PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFuc2ktcmVnZXgiOiAiXjMuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInN0cmlwLWpzb24tY29tbWVudHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3RyaXAtanNvbi1jb21tZW50cy8tL3N0cmlwLWpzb24tY29tbWVudHMtMi4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1QRk1aUXVrSXdtbDhEc05FaFl3b2JIeWdwZ289IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic3VwcG9ydHMtY29sb3IiOiB7CisgICAgICAidmVyc2lvbiI6ICI1LjUuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3VwcG9ydHMtY29sb3IvLS9zdXBwb3J0cy1jb2xvci01LjUuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItUWpWandkWEl0NDA4TUlpQXFDWDRvVUtzZ1UyRXFBR3pzMlBwa200YVFZYmptK1pFV0VjVzRTZkZOVHI0dU1OWm1hMGV5NGY1bGdMcmtCMGFYMFFNb3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImhhcy1mbGFnIjogIl4zLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJ0YWJsZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjUuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90YWJsZS8tL3RhYmxlLTUuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1lNTQyaW4yMlpMaEQvZk9JdVhzLzh5RFo5VzYxbHRGOGRhTTg4cmtSTnRnVEljdCt2STJmVG5BeXUvRGIyVENmRWNJOGk3bWpaejZtZUxxMG5XN1RZZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYWp2IjogIl42LjUuMyIsCisgICAgICAgICJsb2Rhc2giOiAiXjQuMTcuMTAiLAorICAgICAgICAic2xpY2UtYW5zaSI6ICIxLjAuMCIsCisgICAgICAgICJzdHJpbmctd2lkdGgiOiAiXjIuMS4xIgorICAgICAgfQorICAgIH0sCisgICAgInRhZmZ5ZGIiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjYuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdGFmZnlkYi8tL3RhZmZ5ZGItMi42LjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1mTHkyUzFvVUcyb3UvQ3hkTEdlMDRWQ3lvbWc9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAidGFwZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuOS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90YXBlLy0vdGFwZS00LjkuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItNmZLSVhrbkxwb2UvSnA0cnpIS0ZQcEpVSERIRHFuOGp1czk5SWZQbkhJanl6NzhIWWxlZlRHRDNiNUVrYlF6dUxmYUV2bWZQSzNJb2xMZ3EyeFQza3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRlZXAtZXF1YWwiOiAifjEuMC4xIiwKKyAgICAgICAgImRlZmluZWQiOiAifjEuMC4wIiwKKyAgICAgICAgImZvci1lYWNoIjogIn4wLjMuMyIsCisgICAgICAgICJmdW5jdGlvbi1iaW5kIjogIn4xLjEuMSIsCisgICAgICAgICJnbG9iIjogIn43LjEuMiIsCisgICAgICAgICJoYXMiOiAifjEuMC4zIiwKKyAgICAgICAgImluaGVyaXRzIjogIn4yLjAuMyIsCisgICAgICAgICJtaW5pbWlzdCI6ICJ+MS4yLjAiLAorICAgICAgICAib2JqZWN0LWluc3BlY3QiOiAifjEuNi4wIiwKKyAgICAgICAgInJlc29sdmUiOiAifjEuNy4xIiwKKyAgICAgICAgInJlc3VtZXIiOiAifjAuMC4wIiwKKyAgICAgICAgInN0cmluZy5wcm90b3R5cGUudHJpbSI6ICJ+MS4xLjIiLAorICAgICAgICAidGhyb3VnaCI6ICJ+Mi4zLjgiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgIm1pbmltaXN0IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMi4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9taW5pbWlzdC8tL21pbmltaXN0LTEuMi4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLW8xQUlzZzlCT0Q3c0g3a1U5TTFkOTVvbVFvUT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0sCisgICAgICAgICJyZXNvbHZlIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuNy4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVzb2x2ZS8tL3Jlc29sdmUtMS43LjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1jN3J3TG9mcDhnMVUraDFLTnlITC9qaWNyS2cxRWs0cStMcjMzQUw2NXVaVGluVVpIZTMwRDVIbHlONVY5TlcwSlgxRDVkWFE0anFXNWw3U3kva0dmdz09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAicGF0aC1wYXJzZSI6ICJeMS4wLjUiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAidGFyLWZzIjogeworICAgICAgInZlcnNpb24iOiAiMS4xNi4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90YXItZnMvLS90YXItZnMtMS4xNi4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1OdkNlWHBZeDdPc21PaDh6SU9QL2ViRzU1elpteExFMGV0ZldSYldvaytxMlFvOHgvdk9SL0lKVDF0YUFEWFBlK2pzaXU5YXhEYjNYNEIraUlnTmxLdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY2hvd25yIjogIl4xLjAuMSIsCisgICAgICAgICJta2RpcnAiOiAiXjAuNS4xIiwKKyAgICAgICAgInB1bXAiOiAiXjEuMC4wIiwKKyAgICAgICAgInRhci1zdHJlYW0iOiAiXjEuMS4yIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJwdW1wIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4zIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcHVtcC8tL3B1bXAtMS4wLjMudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi04azBKdXBXbWU1NSs5dENWRStGUzVVTFQzSzZBYmdxckdhNThsVFQ0OVJweWZ3d2NHZWRIcWFDNUxsUU5kRUF1bW4vd0ZzdTZhUHdrdVBNaW95OGtxdz09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiZW5kLW9mLXN0cmVhbSI6ICJeMS4xLjAiLAorICAgICAgICAgICAgIm9uY2UiOiAiXjEuMy4xIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInRhci1zdHJlYW0iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjYuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdGFyLXN0cmVhbS8tL3Rhci1zdHJlYW0tMS42LjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXJ6UzBoZWlOZjhYbjcvbXBkU1ZWU01BV0FveTliZmIxV09UWUM3OFowVVFLZUthL0NXUzhGT3EwbEtHTmE4RFdLQW45Z3hqQ3ZNTFljNVBHWFlsSzJBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJibCI6ICJeMS4wLjAiLAorICAgICAgICAiYnVmZmVyLWFsbG9jIjogIl4xLjIuMCIsCisgICAgICAgICJlbmQtb2Ytc3RyZWFtIjogIl4xLjAuMCIsCisgICAgICAgICJmcy1jb25zdGFudHMiOiAiXjEuMC4wIiwKKyAgICAgICAgInJlYWRhYmxlLXN0cmVhbSI6ICJeMi4zLjAiLAorICAgICAgICAidG8tYnVmZmVyIjogIl4xLjEuMSIsCisgICAgICAgICJ4dGVuZCI6ICJeNC4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAidGV4dC10YWJsZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90ZXh0LXRhYmxlLy0vdGV4dC10YWJsZS0wLjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWYxN29JNjZBVWdmQUN2TGZTb1RzUDgrbGNMUT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ0aHJvdWdoIjogeworICAgICAgInZlcnNpb24iOiAiMi4zLjgiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdGhyb3VnaC8tL3Rocm91Z2gtMi4zLjgudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1EZFRKLzZxOE5YbGdzYmNrRVYxK0RvYWk0ZlU9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAidG1wIjogeworICAgICAgInZlcnNpb24iOiAiMC4wLjMzIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90bXAvLS90bXAtMC4wLjMzLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1qUkNKbG9qS25aM2FkZHRUT2pkSXFvUnVQRUtCdk5YY0dZcXpPNnpXWlg4S2ZLRXBuR1k1amZnZ0pRM0VqS3V1OEQ0YkpScjB5K2NZSkZtWWJJbVhHdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAib3MtdG1wZGlyIjogIn4xLjAuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJ0by1idWZmZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdG8tYnVmZmVyLy0vdG8tYnVmZmVyLTEuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1seDlCNWl2N21zdUZZRTNkeXRUK0tFNXRhcCtyTll3K0s0alZrYjlSL2FzQWIrcGJCU00xN2p0dW5IcGxoQmU2UlJKZFp4M1BuMkpwaDI0TzMybU9WZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAidHNsaWIiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjkuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdHNsaWIvLS90c2xpYi0xLjkuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItNGtyRjhzY3BlamhhT2dxekJFY0dNN3lESUVmaTAvOCs4ekRSWmhOWloya2ptSEo0aHYzekNiUVd4b0pHejFpdzVVMEpsMG5tYTEzeHpIWGNuY01hdlE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInR1bm5lbC1hZ2VudCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90dW5uZWwtYWdlbnQvLS90dW5uZWwtYWdlbnQtMC42LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1KNlhlb0dzMnNFb0ttV1ozU3lrSWFQRDhRUDA9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAic2FmZS1idWZmZXIiOiAiXjUuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgInR5cGUtY2hlY2siOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjMuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdHlwZS1jaGVjay8tL3R5cGUtY2hlY2stMC4zLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1XSVRLdFJMUEhUVmVQN2VFOHdnRXNyVWcyM0k9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicHJlbHVkZS1scyI6ICJ+MS4xLjIiCisgICAgICB9CisgICAgfSwKKyAgICAidHlwZXNjcmlwdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMS42IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90eXBlc2NyaXB0Ly0vdHlwZXNjcmlwdC0zLjEuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItdERNWWZWdHZwYjk2bXNTMWxEWDlNRWRIclc0eU91WjRLZGM0SGltOW9VNzk2WGxkUFlGL3QyK3VLb1gwQkJhMGhYWHdEbHFZUWJYWTVSemp6YzVoQkE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInVnbGlmeS1qcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuNC45IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91Z2xpZnktanMvLS91Z2xpZnktanMtMy40LjkudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLThDSnNiS090RWJuSnNUeXY2TEU2bTZaS25pcU1pRldtbTlzUmJvcGJrR3MzZ01QUGZkM0ZoOGlJQTRZa3Y1TWdhVGJxSHI0QmFvR0xKTFpOaHNyVzFRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY29tbWFuZGVyIjogIn4yLjE3LjEiLAorICAgICAgICAic291cmNlLW1hcCI6ICJ+MC42LjEiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImNvbW1hbmRlciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjE3LjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb21tYW5kZXIvLS9jb21tYW5kZXItMi4xNy4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItd1BNVXQ2Rm5IMnl6Rzk1U0E2bXpqUU9FS1VVM2FMYURFbXpzMXRpKzFFOWgrQ3NyWmdoUmxxRU0vRUo0S3Njc1FWRzh1Tk40dVZyZVVlVDgrZHJsZ2c9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgICAgICB9LAorICAgICAgICAic291cmNlLW1hcCI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIwLjYuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NvdXJjZS1tYXAvLS9zb3VyY2UtbWFwLTAuNi4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItVWpnYXB1bVdsYk1oa0JnelQ3WWtjNVlYVVQ0NkYwaUt1OFNHWHEwYmN3UDVkei9oMFBsajZlbkpxanoxWmJxMmw1V2FxWW5yVmJ3V09XTXlGM0Y0N2c9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAidW5kZXJzY29yZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuOC4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91bmRlcnNjb3JlLy0vdW5kZXJzY29yZS0xLjguMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVR6KzFPeEJ1WUpmOCtjdEJDZktsNmIzNlVDST0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ1bmRlcnNjb3JlLWNvbnRyaWIiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjMuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdW5kZXJzY29yZS1jb250cmliLy0vdW5kZXJzY29yZS1jb250cmliLTAuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWmx0bXdrZUQrUG9yR01uNHk3RGl4OVNNSnNjPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInVuZGVyc2NvcmUiOiAiMS42LjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgInVuZGVyc2NvcmUiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS42LjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91bmRlcnNjb3JlLy0vdW5kZXJzY29yZS0xLjYuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1peml4REt6ZTlqTTN1TEpPVC9odFJhNmxLYWc9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAidW5waXBlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3VucGlwZS8tL3VucGlwZS0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXNyOU82RkZLcm1GbHRJRjRLZEliTHZTWkJPdz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ1cmktanMiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjIuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdXJpLWpzLy0vdXJpLWpzLTQuMi4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1LWTlGcm1pcnFsOTFYMlFnanJ5MFdkNFkrWVRkcmRaaGVTOFRGd3ZrYkxXZi9HNUtOSkRDaDZwS0w1T1pjdEVXNCswQmFhNWlkSzJaUXVFTFJ3UHpuUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicHVueWNvZGUiOiAiXjIuMS4wIgorICAgICAgfQorICAgIH0sCisgICAgInV0Zi04LXZhbGlkYXRlIjogeworICAgICAgInZlcnNpb24iOiAiNC4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3V0Zi04LXZhbGlkYXRlLy0vdXRmLTgtdmFsaWRhdGUtNC4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUNTNjNTc3A2enluQlE0SXhWemdqUDVBYmRvNkx1Sjg3SEZJY2dJaVZVZVk5NitNVEhrcUt0clVocGhid1E2alg4YVNHWnY4elg2bDFEQ1BwZmNBbnhBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJiaW5kaW5ncyI6ICJ+MS4zLjAiLAorICAgICAgICAibmFuIjogIn4yLjEwLjAiLAorICAgICAgICAicHJlYnVpbGQtaW5zdGFsbCI6ICJ+NC4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAidXRpbC1kZXByZWNhdGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdXRpbC1kZXByZWNhdGUvLS91dGlsLWRlcHJlY2F0ZS0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVJRMU55ZnB3M25Nbll2dlMxS0tKZ1VHYURNOD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ1dGlscy1tZXJnZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91dGlscy1tZXJnZS8tL3V0aWxzLW1lcmdlLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbjVWeEQxQ2laNVI3TE13U1IwSEJBb1FuNXhNPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIndoaWNoIjogeworICAgICAgInZlcnNpb24iOiAiMS4zLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3doaWNoLy0vd2hpY2gtMS4zLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUh4SmRZV3ExTVRJUWJKM253MGNxc3NIb1ROVTI2N0tsckR1R1oxV1lseERTdFV0S1VoT2FKbWgxMTIvVFptSHh4VWZ1SnFQWFNPbTd0RHlhczBPU0lRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpc2V4ZSI6ICJeMi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAid2hpY2gtcG0tcnVucyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy93aGljaC1wbS1ydW5zLy0vd2hpY2gtcG0tcnVucy0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVp3czYrOFZTNExWZDlyZDRES2RHRmZJNjBjcz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ3aWRlLWFsaWduIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3dpZGUtYWxpZ24vLS93aWRlLWFsaWduLTEuMS4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1RR2tPUWM4WEw2QnQ1UHduc0V4S0JQdU1LQnhuR3hXV1czZlU1NVh0NGZlSG96TVVoZFVNYUJDazI5MHFwbS93RzV1L1JTS3p3ZEFDNGk1MVlpZ2loQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAic3RyaW5nLXdpZHRoIjogIl4xLjAuMiB8fCAyIgorICAgICAgfQorICAgIH0sCisgICAgIndvcmR3cmFwIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3dvcmR3cmFwLy0vd29yZHdyYXAtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1KMWhJRUlrVVZxUVhISTBDSmtRYTNwREx5dXM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAid3JhcHB5IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3dyYXBweS8tL3dyYXBweS0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXRTUTlqejdCcWpYeE5rWUZ2QTBRTnVNS3RwOD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ3cml0ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMi4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy93cml0ZS8tL3dyaXRlLTAuMi4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWDhBNEtPSmt6cVAra1VWVWR2ZWp4V2JMQjFjPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIm1rZGlycCI6ICJeMC41LjEiCisgICAgICB9CisgICAgfSwKKyAgICAid3MiOiB7CisgICAgICAidmVyc2lvbiI6ICI1LjIuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvd3MvLS93cy01LjIuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItamFIRkQ2UEZ2NlVnb0lWZGE2cVpsbHB0UXNNbERFSmtUUWN5Ynp6WERZTTFYTzlZOGVtNjkxRkdNUG1NNDZXR3lMVTR6OUtNZ1FOK3FydXgvbmhsSEE9PSIsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhc3luYy1saW1pdGVyIjogIn4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJ4bWxjcmVhdGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcveG1sY3JlYXRlLy0veG1sY3JlYXRlLTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtK212M1lxWUtRVCt6M1k5TEE4V3lhU09OTUk4PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInh0ZW5kIjogeworICAgICAgInZlcnNpb24iOiAiNC4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3h0ZW5kLy0veHRlbmQtNC4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1wY2JWTXI1bGJpUGJnZzc3bERvZkJKbU5ZNjg9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9wYWNrYWdlLmpzb24gYi9wYWNrYWdlLmpzb24KaW5kZXggN2NjMWVmOS4uOTk1NTNlZSAxMDA2NDQKLS0tIGEvcGFja2FnZS5qc29uCisrKyBiL3BhY2thZ2UuanNvbgpAQCAtNCw5ICs0LDkgQEAKICAgImhvbWVwYWdlIjogImh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy8iLAogICAicmVwb3NpdG9yeSI6IHsKICAgICAidHlwZSI6ICJnaXQiLAotICAgICJ1cmwiOiAiaHR0cHM6Ly9naXQtd2lwLXVzLmFwYWNoZS5vcmcvcmVwb3MvYXNmL3RocmlmdC5naXQiCisgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC5naXQiCiAgIH0sCi0gICJ2ZXJzaW9uIjogIjAuOS4zIiwKKyAgInZlcnNpb24iOiAiMS4wLjAiLAogICAiYXV0aG9yIjogewogICAgICJuYW1lIjogIkFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyIsCiAgICAgImVtYWlsIjogImRldkB0aHJpZnQuYXBhY2hlLm9yZyIsCkBAIC0yMywyOCArMjMsNDQgQEAKICAgICAibWFpbCI6ICJkZXZAdGhyaWZ0LmFwYWNoZS5vcmciLAogICAgICJ1cmwiOiAiaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQiCiAgIH0sCisgICJmaWxlcyI6IFsKKyAgICAibGliL25vZGVqcy9saWIvdGhyaWZ0IiwKKyAgICAibGliL25vZGVqcy9SRUFETUUubWQiCisgIF0sCiAgICJkaXJlY3RvcmllcyI6IHsKICAgICAibGliIjogIi4vbGliL25vZGVqcy9saWIvdGhyaWZ0IgogICB9LAogICAibWFpbiI6ICIuL2xpYi9ub2RlanMvbGliL3RocmlmdCIsCiAgICJlbmdpbmVzIjogewotICAgICJub2RlIjogIj49IDAuMi40IgorICAgICJub2RlIjogIj49IDQuMS4wIgogICB9LAogICAiZGVwZW5kZW5jaWVzIjogewotICAgICJub2RlLWludDY0IjogIn4wLjMuMCIsCi0gICAgInEiOiAiMS4wLngiLAotICAgICJ3cyI6ICJ+MC40LjMyIgorICAgICJub2RlLWludDY0IjogIl4wLjQuMCIsCisgICAgInEiOiAiXjEuNS4wIiwKKyAgICAid3MiOiAiXjUuMC4wIgogICB9LAogICAiZGV2RGVwZW5kZW5jaWVzIjogewotICAgICJidWZmZXItZXF1YWxzIjogIl4xLjAuMyIsCi0gICAgImNvbW1hbmRlciI6ICIyLjEueCIsCi0gICAgImNvbm5lY3QiOiAiMi43LngiLAotICAgICJpc3RhbmJ1bCI6ICJeMC4zLjUiLAotICAgICJydW4tYnJvd3NlciI6ICJeMi4wLjEiLAotICAgICJ0YXBlIjogIn4zLjUuMCIKKyAgICAiYnVmZmVyLWVxdWFscyI6ICJeMS4wLjQiLAorICAgICJjb21tYW5kZXIiOiAiXjIuMTQuMSIsCisgICAgImNvbm5lY3QiOiAiXjMuNi42IiwKKyAgICAiZXNsaW50IjogIl41LjcuMCIsCisgICAgImVzbGludC1jb25maWctcHJldHRpZXIiOiAiXjMuMS4wIiwKKyAgICAiZXNsaW50LXBsdWdpbi1wcmV0dGllciI6ICJeMy4wLjAiLAorICAgICJpc3RhbmJ1bCI6ICJeMC40LjUiLAorICAgICJqc2RvYyI6ICJeMy41LjUiLAorICAgICJwcmV0dGllciI6ICJeMS4xNC4zIiwKKyAgICAidGFwZSI6ICJeNC45LjAiLAorICAgICJ1dGYtOC12YWxpZGF0ZSI6ICJeNC4wLjAiLAorICAgICJ0eXBlc2NyaXB0IjogIl4zLjEuNiIsCisgICAgIkB0eXBlcy9ub2RlIjogIl4xMC4xMi42IiwKKyAgICAiQHR5cGVzL3EiOiAiXjEuNS4xIgogICB9LAogICAic2NyaXB0cyI6IHsKICAgICAiY292ZXIiOiAibGliL25vZGVqcy90ZXN0L3Rlc3RBbGwuc2ggQ09WRVIiLAotICAgICJ0ZXN0IjogImxpYi9ub2RlanMvdGVzdC90ZXN0QWxsLnNoIgorICAgICJ0ZXN0IjogImxpYi9ub2RlanMvdGVzdC90ZXN0QWxsLnNoIiwKKyAgICAidGVzdC10cyI6ICJsaWIvbm9kZXRzL3Rlc3QvdGVzdEFsbC5zaCIsCisgICAgInByZXR0aWVyIjogInByZXR0aWVyIC0td3JpdGUgJyoqLyouanMnIiwKKyAgICAibGludCI6ICJlc2xpbnQgbGliL25vZGVqcy8uIC0tZXh0IC5qcyIsCisgICAgImxpbnQtdGVzdHMiOiAiZXNsaW50IGxpYi9ub2RlanMvdGVzdC8uIC0tZXh0IC5qcyIKICAgfQogfQpkaWZmIC0tZ2l0IGEvcGhwY3MueG1sLmRpc3QgYi9waHBjcy54bWwuZGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODAzODhhCi0tLSAvZGV2L251bGwKKysrIGIvcGhwY3MueG1sLmRpc3QKQEAgLTAsMCArMSwyNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8cnVsZXNldCBuYW1lPSJBcGFjaGVfVGhyaWZ0Ij4KKyAgICA8ZGVzY3JpcHRpb24+VGhlIGNvZGluZyBzdGFuZGFyZCBmb3IgdGhyaWZ0LjwvZGVzY3JpcHRpb24+CisKKyAgICA8ZmlsZT5saWIvcGhwL2xpYjwvZmlsZT4KKyAgICA8ZmlsZT5saWIvcGhwL3Rlc3Q8L2ZpbGU+CisgICAgPGV4Y2x1ZGUtcGF0dGVybj5saWIvcGhwL3Rlc3QvcGFja2FnZXMvKjwvZXhjbHVkZS1wYXR0ZXJuPgorCisgICAgPGFyZyBuYW1lPSJiYXNlcGF0aCIgdmFsdWU9Ii4iLz4KKyAgICA8YXJnIG5hbWU9ImNvbG9ycyIgLz4KKyAgICA8YXJnIG5hbWU9InBhcmFsbGVsIiB2YWx1ZT0iNCIgLz4KKworICAgIDxydWxlIHJlZj0iUFNSMiI+CisgICAgICAgIDxleGNsdWRlIG5hbWU9IlBTUjIuTWV0aG9kcy5NZXRob2REZWNsYXJhdGlvbi5VbmRlcnNjb3JlIi8+CisgICAgICAgIDxleGNsdWRlIG5hbWU9IlBTUjIuQ2xhc3Nlcy5Qcm9wZXJ0eURlY2xhcmF0aW9uLlVuZGVyc2NvcmUiLz4KKyAgICA8L3J1bGU+CisKKyAgICA8cnVsZSByZWY9IlBTUjEuRmlsZXMuU2lkZUVmZmVjdHMiPgorICAgICAgICA8ZXhjbHVkZS1wYXR0ZXJuPmxpYi9waHAvdGVzdC8qPC9leGNsdWRlLXBhdHRlcm4+CisgICAgPC9ydWxlPgorICAgIDxydWxlIHJlZj0iR2VuZXJpYy5GaWxlcy5MaW5lTGVuZ3RoIj4KKyAgICAgICAgPGV4Y2x1ZGUtcGF0dGVybj5saWIvcGhwL3Rlc3QvKjwvZXhjbHVkZS1wYXR0ZXJuPgorICAgIDwvcnVsZT4KKworPC9ydWxlc2V0PgpkaWZmIC0tZ2l0IGEvcHVsbF9yZXF1ZXN0X3RlbXBsYXRlLm1kIGIvcHVsbF9yZXF1ZXN0X3RlbXBsYXRlLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNjk2NWIKLS0tIC9kZXYvbnVsbAorKysgYi9wdWxsX3JlcXVlc3RfdGVtcGxhdGUubWQKQEAgLTAsMCArMSwxOSBAQAorU29tZSBoZWxwZnVsIHRpcHMgZm9yIGEgc3VjY2Vzc2Z1bCBBcGFjaGUgVGhyaWZ0IFBSOgorCisqIERpZCB5b3UgdGVzdCB5b3VyIGNoYW5nZXMgbG9jYWxseSBvciB1c2luZyBDSSBpbiB5b3VyIGZvcms/CisqIElzIHRoZSBBcGFjaGUgSmlyYSBUSFJJRlQgdGlja2V0IGlkZW50aWZpZXIgaW4gdGhlIFBSIHRpdGxlPworKiBJcyB0aGUgQXBhY2hlIEppcmEgVEhSSUZUIHRpY2tldCBpZGVudGlmaWVyIGluIHRoZSBjb21taXQgbWVzc2FnZT8KKyogRGlkIHlvdSBzcXVhc2ggeW91ciBjaGFuZ2VzIHRvIGEgc2luZ2xlIGNvbW1pdD8KKyogQXJlIHRoZXNlIGNoYW5nZXMgYmFja3dhcmRzIGNvbXBhdGlibGU/IChwbGVhc2Ugc2F5IHNvIGluIFBSIGRlc2NyaXB0aW9uKQorKiBEbyB5b3UgbmVlZCB0byB1cGRhdGUgdGhlIGxhbmd1YWdlLXNwZWNpZmljIFJFQURNRT8KKworRXhhbXBsZSBpZGVhbCBwdWxsIHJlcXVlc3QgdGl0bGU6CisKKyAgICAgICAgVEhSSUZULTk5OTk6IGFuIGV4YW1wbGUgcHVsbCByZXF1ZXN0IHRpdGxlCisKK0V4YW1wbGUgaWRlYWwgY29tbWl0IG1lc3NhZ2U6CisKKyAgICAgICAgVEhSSUZULTk5OTk6IFtzdW1tYXJ5IG9mIGZpeCwgb25lIGxpbmUgaWYgcG9zc2libGVdCisgICAgICAgIENsaWVudDogW2xhbmd1YWdlKHMpIGFmZmVjdGVkLCBjb21tYSBzZXBhcmF0ZWQsIHVzZSBsaWIvIGRpcmVjdG9yeSBuYW1lcyBwbGVhc2VdCisKK0ZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGNvbW1pdHRpbmcsIHNlZSBDT05UUklCVVRJTkcubWQKZGlmZiAtLWdpdCBhL3JhdF9leGNsdWRlIGIvcmF0X2V4Y2x1ZGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlYWZlOGIuLjAwMDAwMDAKLS0tIGEvcmF0X2V4Y2x1ZGUKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0uZ2l0aWdub3JlCi1DSEFOR0VTCi1DT05UUklCVVRPUlMKLWF1dG9zY2FuLmxvZwotY29uZmlnLmd1ZXNzCi1jb25maWcubG9nCi1jb25maWcuc3RhdHVzCi1jb25maWcuc3ViCi1jb25maWd1cmUKLWNvbmZpZ3VyZS5zY2FuCi1kZXBjb21wCi1pbnN0YWxsLXNoCi1saWJ0b29sCi1sdG1haW4uc2gKLW1pc3NpbmcKLXN0YW1wLWgxCi15bHdyYXAKLSoubTQKLWF1dG9tNHRlLmNhY2hlCi10aHJpZnR5LmgKLXRocmlmdHkuaGgKLXZlcnNpb24uaAotdmVyc2lvbi5oLmluCi1tZDUuYwotbWQ1LmgKLWRvYwotbGliL2VybC92c24ubWsKLS9saWIvZXJsL2J1aWxkLyoqLyoKLWxpYi9lcmwvc3JjL01ha2VmaWxlCi10aHJpZnQuYXBwdXAuc3JjCi1PQ2FtbE1ha2VmaWxlCi1SRUFETUUtT0NhbWxNYWtlZmlsZQotVE9ETwotTWFuaWZlc3QKLXNldHVwLnJiCmRpZmYgLS1naXQgYS9zb25hci1wcm9qZWN0LnByb3BlcnRpZXMgYi9zb25hci1wcm9qZWN0LnByb3BlcnRpZXMKaW5kZXggMjFmZWMzZC4uYmQ1ZWNjMiAxMDA3NTUKLS0tIGEvc29uYXItcHJvamVjdC5wcm9wZXJ0aWVzCisrKyBiL3NvbmFyLXByb2plY3QucHJvcGVydGllcwpAQCAtMTYsNyArMTYsNyBAQAogc2VydmljZXMgdGhhdCB3b3JrIGVmZmljaWVudGx5IGFuZCBzZWFtbGVzc2x5IGJldHdlZW4gYWxsIG1ham9yIGxhbmd1YWdlcy4KIAogIyBBcGFjaGUgVGhyaWZ0IFZlcnNpb24KLXNvbmFyLnByb2plY3RWZXJzaW9uPTAuOS4zCitzb25hci5wcm9qZWN0VmVyc2lvbj0xLjAuMAogIyB1c2UgdGhpcyB0byBzZXQgYW5vdGhlciB2ZXJzaW9uIHN0cmluZwogIyAkIHNvbmFyLXJ1bm5lciAtRCBzb25hci5wcm9qZWN0VmVyc2lvbj1gZ2l0IHJldi1wYXJzZSBIRUFEYAogIyBzZXQgcHJvamVjdERhdGUgaW4gY29tYmluYXRpb24gd2l0aCBwcm9qZWN0VmVyc2lvbiBmb3IgaW1wb3J0cyBvZiBvbGQgcmVsZWFzZXMKQEAgLTMxLDcgKzMxLDcgQEAKIHNvbmFyLnNvdXJjZUVuY29kaW5nPVVURi04CiAKICMgc2NtCi1zb25hci5zY20udXJsPXNjbTpnaXQ6aHR0cHM6Ly9naXQtd2lwLXVzLmFwYWNoZS5vcmcvcmVwb3MvYXNmL3RocmlmdAorc29uYXIuc2NtLnVybD1zY206Z2l0Omh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0LmdpdAogCiAjIGNwcGNoZWNrIC1xIC0tZXJyb3ItZXhpdGNvZGU9MCAtLXhtbCAuIDI+IGNwcGNoZWNrLXJlc3VsdC54bWwKIHNvbmFyLmN4eC5jcHBjaGVjay5yZXBvcnRQYXRoPWNwcGNoZWNrLXJlc3VsdC54bWwKQEAgLTU0LDE1ICs1NCwxNSBAQAogbW9kdWxlMS5zb25hci5wcm9qZWN0QmFzZURpcj1saWIvamF2YQogbW9kdWxlMS5zb25hci5zb3VyY2VzPXNyYwogbW9kdWxlMS5zb25hci50ZXN0cz10ZXN0Ci1tb2R1bGUxLnNvbmFyLmJpbmFyaWVzPWJ1aWxkL2xpYnRocmlmdC0xLjAuMC5qYXIKLW1vZHVsZTEuc29uYXIubGlicmFyaWVzPWJ1aWxkL2xpYi8qLmphcgorbW9kdWxlMS5zb25hci5iaW5hcmllcz1idWlsZC9saWJzL2xpYnRocmlmdC0xLjAuMC5qYXIKK21vZHVsZTEuc29uYXIubGlicmFyaWVzPWJ1aWxkL2RlcHMvKi5qYXIKIG1vZHVsZTEuc29uYXIubGFuZ3VhZ2U9amF2YQogCiBtb2R1bGUyLnNvbmFyLnByb2plY3ROYW1lPUFwYWNoZSBUaHJpZnQgLSBKYXZhIFR1dG9yaWFsCiBtb2R1bGUyLnNvbmFyLnByb2plY3RCYXNlRGlyPS4KIG1vZHVsZTIuc29uYXIuc291cmNlcz10dXRvcmlhbC9qYXZhL3NyYywgdHV0b3JpYWwvamF2YS9nZW4tamF2YQogbW9kdWxlMi5zb25hci5iaW5hcmllcz10dXRvcmlhbC9qYXZhL3R1dG9yaWFsLmphcgotbW9kdWxlMi5zb25hci5saWJyYXJpZXM9bGliL2phdmEvYnVpbGQvbGliLyouamFyLGxpYi9qYXZhL2J1aWxkL2xpYnRocmlmdC0xLjAuMC5qYXIKK21vZHVsZTIuc29uYXIubGlicmFyaWVzPWxpYi9qYXZhL2J1aWxkL2RlcHMvKi5qYXIsbGliL2phdmEvYnVpbGQvbGlicy9saWJ0aHJpZnQtMS4wLjAuamFyCiBtb2R1bGUyLnNvbmFyLmxhbmd1YWdlPWphdmEKIAogbW9kdWxlMy5zb25hci5wcm9qZWN0TmFtZT1BcGFjaGUgVGhyaWZ0IC0gSmF2YVNjcmlwdCBMaWJyYXJ5CmRpZmYgLS1naXQgYS90ZXN0L0Fubm90YXRpb25UZXN0LnRocmlmdCBiL3Rlc3QvQW5ub3RhdGlvblRlc3QudGhyaWZ0CmluZGV4IDE5MTk5NWEuLjdlMjRlMWMgMTAwNjQ0Ci0tLSBhL3Rlc3QvQW5ub3RhdGlvblRlc3QudGhyaWZ0CisrKyBiL3Rlc3QvQW5ub3RhdGlvblRlc3QudGhyaWZ0CkBAIC01Nyw2ICs1NywxNSBAQAogICAiV2ludGVyIgogfSAoIGZvbyA9ICJiYXIiICkKIAorc3RydWN0IG9zdHJfZGVmYXVsdCB7CisgIDE6IGkzMiBiYXI7Cit9CisKK3N0cnVjdCBvc3RyX2N1c3RvbSB7CisgIDE6IGkzMiBiYXI7Cit9IChjcHAuY3VzdG9tb3N0cmVhbSkKKworCiBzZXJ2aWNlIGZvb19zZXJ2aWNlIHsKICAgdm9pZCBmb28oKSAoIGZvbyA9ICJiYXIiICkKIH0gKGEuYj0iYyIpCmRpZmYgLS1naXQgYS90ZXN0L0NvbnN0YW50c0RlbW8udGhyaWZ0IGIvdGVzdC9Db25zdGFudHNEZW1vLnRocmlmdAppbmRleCA5YTcxYWM4Li5hNTQ1MzRkIDEwMDY0NAotLS0gYS90ZXN0L0NvbnN0YW50c0RlbW8udGhyaWZ0CisrKyBiL3Rlc3QvQ29uc3RhbnRzRGVtby50aHJpZnQKQEAgLTE4LDYgKzE4LDcgQEAKICAqLwogCiBuYW1lc3BhY2UgY3BwIHlvem9uZQorbmFtZXNwYWNlIGVybCBjb25zdHNfCiAKIHN0cnVjdCB0aGluZyB7CiAgIDE6IGkzMiBoZWxsbywKQEAgLTQ3LDYgKzQ4LDkgQEAKIGNvbnN0IGRvdWJsZSBHRW5fRFUgPSAwODUuMjM1NQogY29uc3Qgc3RyaW5nIEdFTl9TVFJJTkcgPSAiYXNsZGtqYXNmZCIKIAorY29uc3QgZG91YmxlIGUxMCA9IDFlMTAgICAvLyBmYWlscyB3aXRoIDAuOS4zIGFuZCBlYXJsaWVyCitjb25zdCBkb3VibGUgZTExID0gLTFlMTAgIAorCiBjb25zdCBtYXA8aTMyLGkzMj4gR0VOX01BUCA9IHsgMzU1MzIgOiAyMzMsIDQzNTIzIDogODUzIH0KIGNvbnN0IGxpc3Q8aTMyPiBHRU5fTElTVCA9IFsgMjM1MjM1LCAyMzU5ODM1MiwgMzI1MzUyMyBdCiAKZGlmZiAtLWdpdCBhL3Rlc3QvRGVidWdQcm90b1Rlc3QudGhyaWZ0IGIvdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQKaW5kZXggNGU5ZmI0Ny4uYjZhNzY1OSAxMDA2NDQKLS0tIGEvdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQKKysrIGIvdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQKQEAgLTIwLDYgKzIwLDcgQEAKIG5hbWVzcGFjZSBjX2dsaWIgVFRlc3QKIG5hbWVzcGFjZSBjcHAgdGhyaWZ0LnRlc3QuZGVidWcKIG5hbWVzcGFjZSBqYXZhIHRocmlmdC50ZXN0CituYW1lc3BhY2UgcmIgdGhyaWZ0LnRlc3QKIAogc3RydWN0IERvdWJsZXMgewogIDE6IGRvdWJsZSBuYW4sCkBAIC0zNSw3ICszNiw3IEBACiBzdHJ1Y3QgT25lT2ZFYWNoIHsKICAgMTogYm9vbCBpbV90cnVlLAogICAyOiBib29sIGltX2ZhbHNlLAotICAzOiBieXRlIGFfYml0ZSA9IDB4N2YsCisgIDM6IGk4IGFfYml0ZSA9IDB4N2YsCiAgIDQ6IGkxNiBpbnRlZ2VyMTYgPSAweDdmZmYsCiAgIDU6IGkzMiBpbnRlZ2VyMzIsCiAgIDY6IGk2NCBpbnRlZ2VyNjQgPSAxMDAwMDAwMDAwMCwKQEAgLTQ0LDcgKzQ1LDcgQEAKICAgOTogc3RyaW5nIHpvbWdfdW5pY29kZSwKICAgMTA6IGJvb2wgd2hhdF93aG8sCiAgIDExOiBiaW5hcnkgYmFzZTY0LAotICAxMjogbGlzdDxieXRlPiBieXRlX2xpc3QgPSBbMSwgMiwgM10sCisgIDEyOiBsaXN0PGk4PiBieXRlX2xpc3QgPSBbMSwgMiwgM10sCiAgIDEzOiBsaXN0PGkxNj4gaTE2X2xpc3QgPSBbMSwyLDNdLAogICAxNDogbGlzdDxpNjQ+IGk2NF9saXN0ID0gWzEsMiwzXQogfQpAQCAtNjEsNyArNjIsNyBAQAogCiBzdHJ1Y3QgSG9seU1vbGV5IHsKICAgMTogbGlzdDxPbmVPZkVhY2g+IGJpZywKLSAgMjogc2V0PGxpc3Q8c3RyaW5nPj4gY29udGFpbiwKKyAgMjogc2V0PGxpc3Q8c3RyaW5nPiAocHl0aG9uLmltbXV0YWJsZSA9ICIiKT4gY29udGFpbiwKICAgMzogbWFwPHN0cmluZyxsaXN0PEJvbms+PiBib25rcywKIH0KIApAQCAtNzEsMTEgKzcyLDE1IEBACiB9CiAKIHN0cnVjdCBFbXB0eSB7Ci19Cit9ICgKKyAgcHl0aG9uLmltbXV0YWJsZSA9ICIiLAorKQogCiBzdHJ1Y3QgV3JhcHBlciB7CiAgIDE6IEVtcHR5IGZvbwotfQorfSAoCisgIHB5dGhvbi5pbW11dGFibGUgPSAiIiwKKykKIAogc3RydWN0IFJhbmRvbVN0dWZmIHsKICAgMTogaTMyIGEsCkBAIC0xMDAsNyArMTA1LDcgQEAKIAogc3RydWN0IENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QgewogICAvLyBwcmltaXRpdmUgZmllbGRzCi0gIDE6IGJ5dGUgICBhX2J5dGU7CisgIDE6IGk4ICAgICBhX2J5dGU7CiAgIDI6IGkxNiAgICBhX2kxNjsKICAgMzogaTMyICAgIGFfaTMyOwogICA0OiBpNjQgICAgYV9pNjQ7CkBAIC0xMTIsNyArMTE3LDcgQEAKICAgMTA6IEVtcHR5IGVtcHR5X3N0cnVjdF9maWVsZDsKIAogICAvLyBwcmltaXRpdmVzIGluIGxpc3RzCi0gIDExOiBsaXN0PGJ5dGU+ICAgIGJ5dGVfbGlzdDsKKyAgMTE6IGxpc3Q8aTg+ICAgICAgYnl0ZV9saXN0OwogICAxMjogbGlzdDxpMTY+ICAgICBpMTZfbGlzdDsKICAgMTM6IGxpc3Q8aTMyPiAgICAgaTMyX2xpc3Q7CiAgIDE0OiBsaXN0PGk2ND4gICAgIGk2NF9saXN0OwpAQCAtMTIzLDcgKzEyOCw3IEBACiAgIDE5OiBsaXN0PEVtcHR5PiAgIHN0cnVjdF9saXN0OwogCiAgIC8vIHByaW1pdGl2ZXMgaW4gc2V0cwotICAyMDogc2V0PGJ5dGU+ICAgICBieXRlX3NldDsKKyAgMjA6IHNldDxpOD4gICAgICAgYnl0ZV9zZXQ7CiAgIDIxOiBzZXQ8aTE2PiAgICAgIGkxNl9zZXQ7CiAgIDIyOiBzZXQ8aTMyPiAgICAgIGkzMl9zZXQ7CiAgIDIzOiBzZXQ8aTY0PiAgICAgIGk2NF9zZXQ7CkBAIC0xMzUsMzAgKzE0MCwzMCBAQAogCiAgIC8vIG1hcHMKICAgLy8gcHJpbWl0aXZlcyBhcyBrZXlzCi0gIDI5OiBtYXA8Ynl0ZSwgYnl0ZT4gICAgICAgICAgICAgYnl0ZV9ieXRlX21hcDsKLSAgMzA6IG1hcDxpMTYsIGJ5dGU+ICAgICAgICAgICAgICBpMTZfYnl0ZV9tYXA7Ci0gIDMxOiBtYXA8aTMyLCBieXRlPiAgICAgICAgICAgICAgaTMyX2J5dGVfbWFwOwotICAzMjogbWFwPGk2NCwgYnl0ZT4gICAgICAgICAgICAgIGk2NF9ieXRlX21hcDsKLSAgMzM6IG1hcDxkb3VibGUsIGJ5dGU+ICAgICAgICAgICBkb3VibGVfYnl0ZV9tYXA7Ci0gIDM0OiBtYXA8c3RyaW5nLCBieXRlPiAgICAgICAgICAgc3RyaW5nX2J5dGVfbWFwOwotICAzNTogbWFwPGJpbmFyeSwgYnl0ZT4gICAgICAgICAgIGJpbmFyeV9ieXRlX21hcDsKLSAgMzY6IG1hcDxib29sLCBieXRlPiAgICAgICAgICAgICBib29sZWFuX2J5dGVfbWFwOworICAyOTogbWFwPGk4LCBpOD4gICAgICAgICAgICAgICBieXRlX2J5dGVfbWFwOworICAzMDogbWFwPGkxNiwgaTg+ICAgICAgICAgICAgICBpMTZfYnl0ZV9tYXA7CisgIDMxOiBtYXA8aTMyLCBpOD4gICAgICAgICAgICAgIGkzMl9ieXRlX21hcDsKKyAgMzI6IG1hcDxpNjQsIGk4PiAgICAgICAgICAgICAgaTY0X2J5dGVfbWFwOworICAzMzogbWFwPGRvdWJsZSwgaTg+ICAgICAgICAgICBkb3VibGVfYnl0ZV9tYXA7CisgIDM0OiBtYXA8c3RyaW5nLCBpOD4gICAgICAgICAgIHN0cmluZ19ieXRlX21hcDsKKyAgMzU6IG1hcDxiaW5hcnksIGk4PiAgICAgICAgICAgYmluYXJ5X2J5dGVfbWFwOworICAzNjogbWFwPGJvb2wsIGk4PiAgICAgICAgICAgICBib29sZWFuX2J5dGVfbWFwOwogICAvLyBwcmltaXRpdmVzIGFzIHZhbHVlcwotICAzNzogbWFwPGJ5dGUsIGkxNj4gICAgICAgICAgICAgIGJ5dGVfaTE2X21hcDsKLSAgMzg6IG1hcDxieXRlLCBpMzI+ICAgICAgICAgICAgICBieXRlX2kzMl9tYXA7Ci0gIDM5OiBtYXA8Ynl0ZSwgaTY0PiAgICAgICAgICAgICAgYnl0ZV9pNjRfbWFwOwotICA0MDogbWFwPGJ5dGUsIGRvdWJsZT4gICAgICAgICAgIGJ5dGVfZG91YmxlX21hcDsKLSAgNDE6IG1hcDxieXRlLCBzdHJpbmc+ICAgICAgICAgICBieXRlX3N0cmluZ19tYXA7Ci0gIDQyOiBtYXA8Ynl0ZSwgYmluYXJ5PiAgICAgICAgICAgYnl0ZV9iaW5hcnlfbWFwOwotICA0MzogbWFwPGJ5dGUsIGJvb2w+ICAgICAgICAgICAgIGJ5dGVfYm9vbGVhbl9tYXA7CisgIDM3OiBtYXA8aTgsIGkxNj4gICAgICAgICAgICAgIGJ5dGVfaTE2X21hcDsKKyAgMzg6IG1hcDxpOCwgaTMyPiAgICAgICAgICAgICAgYnl0ZV9pMzJfbWFwOworICAzOTogbWFwPGk4LCBpNjQ+ICAgICAgICAgICAgICBieXRlX2k2NF9tYXA7CisgIDQwOiBtYXA8aTgsIGRvdWJsZT4gICAgICAgICAgIGJ5dGVfZG91YmxlX21hcDsKKyAgNDE6IG1hcDxpOCwgc3RyaW5nPiAgICAgICAgICAgYnl0ZV9zdHJpbmdfbWFwOworICA0MjogbWFwPGk4LCBiaW5hcnk+ICAgICAgICAgICBieXRlX2JpbmFyeV9tYXA7CisgIDQzOiBtYXA8aTgsIGJvb2w+ICAgICAgICAgICAgIGJ5dGVfYm9vbGVhbl9tYXA7CiAgIC8vIGNvbGxlY3Rpb25zIGFzIGtleXMKLSAgNDQ6IG1hcDxsaXN0PGJ5dGU+LCBieXRlPiAgICAgICBsaXN0X2J5dGVfbWFwOwotICA0NTogbWFwPHNldDxieXRlPiwgYnl0ZT4gICAgICAgIHNldF9ieXRlX21hcDsKLSAgNDY6IG1hcDxtYXA8Ynl0ZSxieXRlPiwgYnl0ZT4gICBtYXBfYnl0ZV9tYXA7CisgIDQ0OiBtYXA8bGlzdDxpOD4gKHB5dGhvbi5pbW11dGFibGUgPSAiIiksIGk4PiAgICAgICBsaXN0X2J5dGVfbWFwOworICA0NTogbWFwPHNldDxpOD4gKHB5dGhvbi5pbW11dGFibGUgPSAiIiksIGk4PiAgICAgICAgc2V0X2J5dGVfbWFwOworICA0NjogbWFwPG1hcDxpOCxpOD4gKHB5dGhvbi5pbW11dGFibGUgPSAiIiksIGk4PiAgICAgbWFwX2J5dGVfbWFwOwogICAvLyBjb2xsZWN0aW9ucyBhcyB2YWx1ZXMKLSAgNDc6IG1hcDxieXRlLCBtYXA8Ynl0ZSxieXRlPj4gICBieXRlX21hcF9tYXA7Ci0gIDQ4OiBtYXA8Ynl0ZSwgc2V0PGJ5dGU+PiAgICAgICAgYnl0ZV9zZXRfbWFwOwotICA0OTogbWFwPGJ5dGUsIGxpc3Q8Ynl0ZT4+ICAgICAgIGJ5dGVfbGlzdF9tYXA7CisgIDQ3OiBtYXA8aTgsIG1hcDxpOCxpOD4+ICAgICBieXRlX21hcF9tYXA7CisgIDQ4OiBtYXA8aTgsIHNldDxpOD4+ICAgICAgICBieXRlX3NldF9tYXA7CisgIDQ5OiBtYXA8aTgsIGxpc3Q8aTg+PiAgICAgICBieXRlX2xpc3RfbWFwOwogfQogCiAvLyBUbyBiZSB1c2VkIHRvIHRlc3QgdGhlIHNlcmlhbGl6YXRpb24gb2YgYW4gZW1wdHkgbWFwCkBAIC0yNDMsNiArMjQ4LDggQEAKICAgdm9pZCBtZXRob2RXaXRoRGVmYXVsdEFyZ3MoMTogaTMyIHNvbWV0aGluZyA9IE1ZQ09OU1QpOwogCiAgIG9uZXdheSB2b2lkIG9uZXdheU1ldGhvZCgpOworCisgIGJvb2wgZGVjbGFyZWRFeGNlcHRpb25NZXRob2QoMTogYm9vbCBzaG91bGRUaHJvdykgdGhyb3dzICgxOiBFeGNlcHRpb25XaXRoQU1hcCB4d2FtYXApOwogfQogCiBzZXJ2aWNlIEluaGVyaXRlZCBleHRlbmRzIFNydiB7CkBAIC0yNTQsMTAgKzI2MSwxMCBAQAogLy8gVGhlIG9ubHkgcHVycG9zZSBvZiB0aGlzIHRoaW5nIGlzIHRvIGluY3JlYXNlIHRoZSBzaXplIG9mIHRoZSBnZW5lcmF0ZWQgY29kZQogLy8gc28gdGhhdCBabGliVGVzdCBoYXMgbW9yZSBoaWdobHkgY29tcHJlc3NpYmxlIGRhdGEgdG8gcGxheSB3aXRoLgogc3RydWN0IEJsb3dVcCB7Ci0gIDE6IG1hcDxsaXN0PGkzMj4sc2V0PG1hcDxpMzIsc3RyaW5nPj4+IGIxOwotICAyOiBtYXA8bGlzdDxpMzI+LHNldDxtYXA8aTMyLHN0cmluZz4+PiBiMjsKLSAgMzogbWFwPGxpc3Q8aTMyPixzZXQ8bWFwPGkzMixzdHJpbmc+Pj4gYjM7Ci0gIDQ6IG1hcDxsaXN0PGkzMj4sc2V0PG1hcDxpMzIsc3RyaW5nPj4+IGI0OworICAxOiBtYXA8bGlzdDxpMzI+KHB5dGhvbi5pbW11dGFibGUgPSAiIiksc2V0PG1hcDxpMzIsc3RyaW5nPiAocHl0aG9uLmltbXV0YWJsZSA9ICIiKT4+IGIxOworICAyOiBtYXA8bGlzdDxpMzI+KHB5dGhvbi5pbW11dGFibGUgPSAiIiksc2V0PG1hcDxpMzIsc3RyaW5nPiAocHl0aG9uLmltbXV0YWJsZSA9ICIiKT4+IGIyOworICAzOiBtYXA8bGlzdDxpMzI+KHB5dGhvbi5pbW11dGFibGUgPSAiIiksc2V0PG1hcDxpMzIsc3RyaW5nPiAocHl0aG9uLmltbXV0YWJsZSA9ICIiKT4+IGIzOworICA0OiBtYXA8bGlzdDxpMzI+KHB5dGhvbi5pbW11dGFibGUgPSAiIiksc2V0PG1hcDxpMzIsc3RyaW5nPiAocHl0aG9uLmltbXV0YWJsZSA9ICIiKT4+IGI0OwogfQogCiAKZGlmZiAtLWdpdCBhL3Rlc3QvRG9jVGVzdC50aHJpZnQgYi90ZXN0L0RvY1Rlc3QudGhyaWZ0CmluZGV4IDlkMTk4NTUuLmQ3MDJiMmMgMTAwNjQ0Ci0tLSBhL3Rlc3QvRG9jVGVzdC50aHJpZnQKKysrIGIvdGVzdC9Eb2NUZXN0LnRocmlmdApAQCAtNTgsNyArNTgsNyBAQAogICAxOiAgc3RyaW5nIHN0cmluZ190aGluZwogCiAgIC8qKiBkb2N0IHRleHQgZ29lcyBiZWZvcmUgYSBjb21tYSAqLwotICA0OiAgYnl0ZSAgIGJ5dGVfdGhpbmcsCisgIDQ6ICBpOCAgICAgYnl0ZV90aGluZywKIAogICA5OiAgaTMyICAgIGkzMl90aGluZywKICAgMTE6IGk2NCAgICBpNjRfdGhpbmcKQEAgLTc0LDcgKzc0LDcgQEAKIAogc3RydWN0IFh0cnVjdDIKIHsKLSAgMTogYnl0ZSAgIGJ5dGVfdGhpbmcsCisgIDE6IGk4ICAgICBieXRlX3RoaW5nLAogICAyOiBYdHJ1Y3Qgc3RydWN0X3RoaW5nLAogICAzOiBpMzIgICAgaTMyX3RoaW5nCiB9CkBAIC0xMTcsNyArMTE3LDcgQEAKICAgLyoqIEFuZCB0aGlzIGlzIGhvdyB5b3Ugd291bGQgZG9jdW1lbnQgZnVuY3Rpb25zIGluIGEgc2VydmljZSAqLwogICB2b2lkICAgICAgICAgdGVzdFZvaWQoKSwKICAgc3RyaW5nICAgICAgIHRlc3RTdHJpbmcoMTogc3RyaW5nIHRoaW5nKSwKLSAgYnl0ZSAgICAgICAgIHRlc3RCeXRlKDE6IGJ5dGUgdGhpbmcpLAorICBpOCAgICAgICAgICAgdGVzdEJ5dGUoMTogYnl0ZSB0aGluZyksCiAgIGkzMiAgICAgICAgICB0ZXN0STMyKDE6IGkzMiB0aGluZyksCiAKICAgLyoqIExpa2UgdGhpcyBvbmUgKi8KQEAgLTI0Niw0ICsyNDYsNDIgQEAKIAogLyoqbm8gcm9vbSBmb3IgbmV3bGluZSBoZXJlKi8KIAorLyogKiAvICovCit0eXBlZGVmIGkzMiBUZXN0Rm9yMzUwMWEKKworLyoqCisgKiAvCisgKi8KK3R5cGVkZWYgaTMyIFRlc3RGb3IzNTAxYgorCisKKy8qIENvbW1lbnQtZW5kIHRva2VucyBjYW4gb2YgY291cnNlIGhhdmUgbW9yZSB0aGFuIG9uZSBhc3RlcmlzayAqLworc3RydWN0IFRlc3RGb3IzNzA5XzAwIHsgLyogPyAqLyAxOiBpMzIgZm9vIH0KKy8qIENvbW1lbnQtZW5kIHRva2VucyBjYW4gb2YgY291cnNlIGhhdmUgbW9yZSB0aGFuIG9uZSBhc3RlcmlzayAqKi8KK3N0cnVjdCBUZXN0Rm9yMzcwOV8wMSB7IC8qID8gKi8gMTogaTMyIGZvbyB9CisvKiBDb21tZW50LWVuZCB0b2tlbnMgY2FuIG9mIGNvdXJzZSBoYXZlIG1vcmUgdGhhbiBvbmUgYXN0ZXJpc2sgKioqLworc3RydWN0IFRlc3RGb3IzNzA5XzAyIHsgLyogPyAqLyAxOiBpMzIgZm9vIH0KKy8qKiBDb21tZW50LWVuZCB0b2tlbnMgY2FuIG9mIGNvdXJzZSBoYXZlIG1vcmUgdGhhbiBvbmUgYXN0ZXJpc2sgKi8KK3N0cnVjdCBUZXN0Rm9yMzcwOV8wMyB7IC8qID8gKi8gMTogaTMyIGZvbyB9CisvKiogQ29tbWVudC1lbmQgdG9rZW5zIGNhbiBvZiBjb3Vyc2UgaGF2ZSBtb3JlIHRoYW4gb25lIGFzdGVyaXNrICoqLworc3RydWN0IFRlc3RGb3IzNzA5XzA0IHsgLyogPyAqLyAxOiBpMzIgZm9vIH0KKy8qKiBDb21tZW50LWVuZCB0b2tlbnMgY2FuIG9mIGNvdXJzZSBoYXZlIG1vcmUgdGhhbiBvbmUgYXN0ZXJpc2sgKioqLworc3RydWN0IFRlc3RGb3IzNzA5XzA1IHsgLyogPyAqLyAxOiBpMzIgZm9vIH0KKy8qKiogQ29tbWVudC1lbmQgdG9rZW5zIGNhbiBvZiBjb3Vyc2UgaGF2ZSBtb3JlIHRoYW4gb25lIGFzdGVyaXNrICovCitzdHJ1Y3QgVGVzdEZvcjM3MDlfMDYgeyAvKiA/ICovIDE6IGkzMiBmb28gfQorLyoqKiBDb21tZW50LWVuZCB0b2tlbnMgY2FuIG9mIGNvdXJzZSBoYXZlIG1vcmUgdGhhbiBvbmUgYXN0ZXJpc2sgKiovCitzdHJ1Y3QgVGVzdEZvcjM3MDlfMDcgeyAvKiA/ICovIDE6IGkzMiBmb28gfQorLyoqKiBDb21tZW50LWVuZCB0b2tlbnMgY2FuIG9mIGNvdXJzZSBoYXZlIG1vcmUgdGhhbiBvbmUgYXN0ZXJpc2sgKioqLworc3RydWN0IFRlc3RGb3IzNzA5XzA4IHsgLyogPyAqLyAxOiBpMzIgZm9vIH0KKworc3RydWN0IFRlc3RGb3IzNzA5IHsKKyAgLyoqIFRoaXMgaXMgYSBjb21tZW50ICovCisgIDE6IHJlcXVpcmVkIHN0cmluZyBpZCwKKyAgLyoqIFRoaXMgaXMgYWxzbyBhIGNvbW1lbnQgKiovCisgIDI6IHJlcXVpcmVkIHN0cmluZyB0eXBlSWQsCisgIC8qKiBZZXQgYW5vdGhlciBjb21tZW50ISAqLworICAzOiByZXF1aXJlZCBpMzIgZW5kVGltZXN0YW1wCit9CisKKwogLyogVEhFIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGVzdC9Eb3VibGVDb25zdGFudHNUZXN0LnRocmlmdCBiL3Rlc3QvRG91YmxlQ29uc3RhbnRzVGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkyMTJhYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvRG91YmxlQ29uc3RhbnRzVGVzdC50aHJpZnQKQEAgLTAsMCArMSwxNyBAQAorbmFtZXNwYWNlIGphdmEgdGhyaWZ0LnRlc3QKK25hbWVzcGFjZSBjcHAgdGhyaWZ0LnRlc3QKKworLy8gbW9yZSB0ZXN0cyBvbiBkb3VibGUgY29uc3RhbnRzIChwcmVjaXNpb24gYW5kIHR5cGUgY2hlY2tzKQorY29uc3QgZG91YmxlIERPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlRfVEVTVCA9IDEKK2NvbnN0IGRvdWJsZSBET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5UX1RFU1QgPSAtMTAwCitjb25zdCBkb3VibGUgRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5UX1RFU1QgPSA5MjIzMzcyMDM2ODU0Nzc1ODA3Citjb25zdCBkb3VibGUgRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVF9URVNUID0gLTkyMjMzNzIwMzY4NTQ3NzU4MDcKK2NvbnN0IGRvdWJsZSBET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMU19URVNUID0gMy4xNDE1OTI2NTM1OQorY29uc3QgZG91YmxlIERPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRV9URVNUID0gMTAwMDAwMC4xCitjb25zdCBkb3VibGUgRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QgPSAtMTAwMDAwMC4xCitjb25zdCBkb3VibGUgRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRV9URVNUID0gMS43ZSszMDgKK2NvbnN0IGRvdWJsZSBET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCA9IDkyMjMzNzIwMzY4NTQ3NzU4MTYuNDMKK2NvbnN0IGRvdWJsZSBET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFX1RFU1QgPSAtMS43ZSszMDgKK2NvbnN0IGRvdWJsZSBET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QgPSAtOTIyMzM3MjAzNjg1NDc3NTgxNi40MworCitjb25zdCBsaXN0PGRvdWJsZT4gRE9VQkxFX0xJU1RfVEVTVCA9IFsxLC0xMDAsMTAwLDkyMjMzNzIwMzY4NTQ3NzU4MDcsLTkyMjMzNzIwMzY4NTQ3NzU4MDcsMy4xNDE1OTI2NTM1OSwxMDAwMDAwLjEsLTEwMDAwMDAuMSwxLjdlKzMwOCwtMS43ZSszMDgsOTIyMzM3MjAzNjg1NDc3NTgxNi40MywtOTIyMzM3MjAzNjg1NDc3NTgxNi40M10KZGlmZiAtLWdpdCBhL3Rlc3QvRW51bUNvbnRhaW5lcnNUZXN0LnRocmlmdCBiL3Rlc3QvRW51bUNvbnRhaW5lcnNUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjY0MDhmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9FbnVtQ29udGFpbmVyc1Rlc3QudGhyaWZ0CkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworbmFtZXNwYWNlIGphdmEgdGhyaWZ0LnRlc3QuZW51bWNvbnRhaW5lcnMKKworZW51bSBHcmVla0dvZEdvZGRlc3MgeworICAgIEFSRVMsCisgICAgQVBIUk9ESVRFLAorICAgIFpFVVMsCisgICAgUE9TRUlET04sCisgICAgSEVSQSwKK30KKwordHlwZWRlZiBHcmVla0dvZEdvZGRlc3MgR3JlZWtHb2RHb2RkZXNzVHlwZQordHlwZWRlZiBpMzIgUG93ZXIKKworc3RydWN0IEdvZEJlYW4geworICAgIDE6IG9wdGlvbmFsIG1hcDxHcmVla0dvZEdvZGRlc3NUeXBlLCBQb3dlcj4gcG93ZXIsCisgICAgMjogb3B0aW9uYWwgc2V0PEdyZWVrR29kR29kZGVzc1R5cGU+IGdvZGRlc3MsCisgICAgMzogb3B0aW9uYWwgbWFwPHN0cmluZywgR3JlZWtHb2RHb2RkZXNzPiBieUFsaWFzLAorICAgIDQ6IG9wdGlvbmFsIHNldDxzdHJpbmc+IGltYWdlcywKK30KKworY29uc3QgbWFwPEdyZWVrR29kR29kZGVzc1R5cGUsIHN0cmluZz4gQVRUUklCVVRFUyA9Cit7CisgICAgR3JlZWtHb2RHb2RkZXNzLlpFVVM6ICJsaWdodG5pbmcgYm9sdCIsCisgICAgR3JlZWtHb2RHb2RkZXNzLlBPU0VJRE9OOiAidHJpZGVudCIsCit9CisKK2NvbnN0IHNldDxHcmVla0dvZEdvZGRlc3NUeXBlPiBCRUFVVFkgPSBbIEdyZWVrR29kR29kZGVzcy5BUEhST0RJVEUsIEdyZWVrR29kR29kZGVzcy5IRVJBIF0KZGlmZiAtLWdpdCBhL3Rlc3QvRW51bVRlc3QudGhyaWZ0IGIvdGVzdC9FbnVtVGVzdC50aHJpZnQKaW5kZXggNjIwMTkyMy4uNzk2MWYzOCAxMDA2NDQKLS0tIGEvdGVzdC9FbnVtVGVzdC50aHJpZnQKKysrIGIvdGVzdC9FbnVtVGVzdC50aHJpZnQKQEAgLTIxLDYgKzIxLDggQEAKICAqIGRldGFpbHMuCiAgKi8KIAorbmFtZXNwYWNlIGNfZ2xpYiBUVGVzdAorCiBlbnVtIE15RW51bTEgewogICBNRTFfMCA9IDAsCiAgIE1FMV8xID0gMSwKQEAgLTY0LDkgKzY2LDU0IEBACiAgIC8vIHJlcHJlc2VudGVkIHdpdGggYW4gaTMyLgogfQogCitlbnVtIE15RW51bTUgeworICBlMSAgICAgICAgLy8gZmFpbHMgd2l0aCAwLjkuMyBhbmQgZWFybGllcgorICBlMiA9IDQyICAgLy8gZmFpbHMgd2l0aCAwLjkuMyBhbmQgZWFybGllcgorfQorCitlbnVtIE15RW51bVdpdGhDdXN0b21Pc3RyZWFtIHsKKyAgY3VzdG9tMSA9IDEsCisgIEN1c3RvTTIKK30gKGNwcC5jdXN0b21vc3RyZWFtKQorCiBzdHJ1Y3QgTXlTdHJ1Y3QgewogICAxOiBNeUVudW0yIG1lMl8yID0gTXlFbnVtMS5NRTJfMgogICAyOiBNeUVudW0zIG1lM19uMiA9IE15RW51bTMuTUUzX04yCiAgIDM6IE15RW51bTMgbWUzX2QxID0gTXlFbnVtMy5NRTNfRDEKIH0KIAorc3RydWN0IEVudW1UZXN0U3RydWN0IHsKKyAgMTogTXlFbnVtMyBhX2VudW07CisgIDI6IGxpc3Q8TXlFbnVtMz4gZW51bV9saXN0OworICAzOiBzZXQ8TXlFbnVtMz4gZW51bV9zZXQ7CisgIDQ6IG1hcDxNeUVudW0zLCBNeUVudW0zPiBlbnVtX2VudW1fbWFwOworICAvLyBjb2xsZWN0aW9ucyBhcyBrZXlzCisgIDQ0OiBtYXA8bGlzdDxNeUVudW0zPiAocHl0aG9uLmltbXV0YWJsZSA9ICIiKSwgTXlFbnVtMz4gbGlzdF9lbnVtX21hcDsKKyAgNDU6IG1hcDxzZXQ8TXlFbnVtMz4gKHB5dGhvbi5pbW11dGFibGUgPSAiIiksIE15RW51bTM+IHNldF9lbnVtX21hcDsKKyAgNDY6IG1hcDxtYXA8TXlFbnVtMyxNeUVudW0zPiAocHl0aG9uLmltbXV0YWJsZSA9ICIiKSwgTXlFbnVtMz4gbWFwX2VudW1fbWFwOworICAvLyBjb2xsZWN0aW9ucyBhcyB2YWx1ZXMKKyAgNDc6IG1hcDxNeUVudW0zLCBtYXA8TXlFbnVtMywgTXlFbnVtMz4+IGVudW1fbWFwX21hcDsKKyAgNDg6IG1hcDxNeUVudW0zLCBzZXQ8TXlFbnVtMz4+IGVudW1fc2V0X21hcDsKKyAgNDk6IG1hcDxNeUVudW0zLCBsaXN0PE15RW51bTM+PiBlbnVtX2xpc3RfbWFwOworfQorCitjb25zdCBFbnVtVGVzdFN0cnVjdCBFTlVNX1RFU1QgPSB7CisgICdhX2VudW0nOiBNeUVudW0zLk1FM19EMSwKKyAgJ2VudW1fbGlzdCc6IFtNeUVudW0zLk1FM19EMSwgTXlFbnVtMy5NRTNfMCwgTXlFbnVtMy5NRTNfTjJdLAorICAnZW51bV9zZXQnOiBbTXlFbnVtMy5NRTNfRDEsIE15RW51bTMuTUUzX04xXSwKKyAgJ2VudW1fZW51bV9tYXAnOiB7TXlFbnVtMy5NRTNfRDE6IE15RW51bTMuTUUzXzAsIE15RW51bTMuTUUzXzA6IE15RW51bTMuTUUzX0QxfSwKKyAgJ2xpc3RfZW51bV9tYXAnOiB7W015RW51bTMuTUUzX0QxLCBNeUVudW0zLk1FM18wXTogTXlFbnVtMy5NRTNfMCwgW015RW51bTMuTUUzX0QxXTogTXlFbnVtMy5NRTNfMCwgW015RW51bTMuTUUzXzBdOiBNeUVudW0zLk1FM19EMX0sCisgICdzZXRfZW51bV9tYXAnOiB7W015RW51bTMuTUUzX0QxLCBNeUVudW0zLk1FM18wXTogTXlFbnVtMy5NRTNfMCwgW015RW51bTMuTUUzX0QxXTogTXlFbnVtMy5NRTNfMH0sCisgICdtYXBfZW51bV9tYXAnOiB7e015RW51bTMuTUUzX04xOiBNeUVudW0zLk1FM18xMH06IE15RW51bTMuTUUzXzF9LAorICAnZW51bV9tYXBfbWFwJzoge015RW51bTMuTUUzX04xOiB7TXlFbnVtMy5NRTNfRDE6IE15RW51bTMuTUUzX0QxfX0sCisgICdlbnVtX3NldF9tYXAnOiB7TXlFbnVtMy5NRTNfTjI6IFtNeUVudW0zLk1FM19EMSwgTXlFbnVtMy5NRTNfTjFdLCBNeUVudW0zLk1FM18xMDogW015RW51bTMuTUUzX0QxLCBNeUVudW0zLk1FM19OMV19LAorICAnZW51bV9saXN0X21hcCc6IHtNeUVudW0zLk1FM19EMTogW015RW51bTMuTUUzXzEwXSwgTXlFbnVtMy5NRTNfMDogW015RW51bTMuTUUzXzksIE15RW51bTMuTUUzXzEwXX0sCit9CisKK3NlcnZpY2UgRW51bVRlc3RTZXJ2aWNlIHsKKyAgTXlFbnVtMyB0ZXN0RW51bSgxOiBNeUVudW0zIGVudW0xKSwKKyAgbGlzdDxNeUVudW0zPiB0ZXN0RW51bUxpc3QoMTogbGlzdDxNeUVudW0zPiBlbnVtMSksCisgIHNldDxNeUVudW0zPiB0ZXN0RW51bVNldCgxOiBzZXQ8TXlFbnVtMz4gZW51bTEpLAorICBtYXA8TXlFbnVtMywgTXlFbnVtMz4gdGVzdEVudW1NYXAoMTogbWFwPE15RW51bTMsIE15RW51bTM+IGVudW0xKSwKKyAgRW51bVRlc3RTdHJ1Y3QgdGVzdEVudW1TdHJ1Y3QoMTogRW51bVRlc3RTdHJ1Y3QgZW51bTEpLAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9GYXN0YmluYXJ5VGVzdC5weSBiL3Rlc3QvRmFzdGJpbmFyeVRlc3QucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdmNmVmYWUuLjAwMDAwMDAKLS0tIGEvdGVzdC9GYXN0YmluYXJ5VGVzdC5weQorKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi0jIS91c3IvYmluL2VudiBweXRob24KLQotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLXIiIiIKLXRocmlmdCAtLWdlbiBweSBEZWJ1Z1Byb3RvVGVzdC50aHJpZnQKLS4vRmFzdGJpbmFyeVRlc3QucHkKLSIiIgotCi0jIFRPRE8oZHJlaXNzKTogVGVzdCBlcnJvciBjYXNlcy4gIENoZWNrIGZvciBtZW1vcnkgbGVha3MuCi0KLWltcG9ydCBzeXMKLXN5cy5wYXRoLmFwcGVuZCgnLi9nZW4tcHknKQotCi1pbXBvcnQgbWF0aAotZnJvbSBEZWJ1Z1Byb3RvVGVzdCBpbXBvcnQgU3J2Ci1mcm9tIERlYnVnUHJvdG9UZXN0LnR0eXBlcyBpbXBvcnQgKgotZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0Ci1mcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCi0KLWltcG9ydCB0aW1laXQKLWZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTwotZnJvbSBjb3B5IGltcG9ydCBkZWVwY29weQotZnJvbSBwcHJpbnQgaW1wb3J0IHBwcmludAotCi1jbGFzcyBURGV2TnVsbFRyYW5zcG9ydChUVHJhbnNwb3J0LlRUcmFuc3BvcnRCYXNlKToKLSAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgIHBhc3MKLSAgZGVmIGlzT3BlbihzZWxmKToKLSAgICByZXR1cm4gVHJ1ZQotCi1vb2UxID0gT25lT2ZFYWNoKCkKLW9vZTEuaW1fdHJ1ZSAgID0gVHJ1ZTsKLW9vZTEuaW1fZmFsc2UgID0gRmFsc2U7Ci1vb2UxLmFfYml0ZSAgICA9IDB4ZDY7Ci1vb2UxLmludGVnZXIxNiA9IDI3MDAwOwotb29lMS5pbnRlZ2VyMzIgPSAxPDwyNDsKLW9vZTEuaW50ZWdlcjY0ID0gNjAwMCAqIDEwMDAgKiAxMDAwOwotb29lMS5kb3VibGVfcHJlY2lzaW9uID0gbWF0aC5waTsKLW9vZTEuc29tZV9jaGFyYWN0ZXJzICA9ICJEZWJ1ZyBUSElTISI7Ci1vb2UxLnpvbWdfdW5pY29kZSAgICAgPSAiXHhkN1xuXGFcdCI7Ci0KLW9vZTIgPSBPbmVPZkVhY2goKTsKLW9vZTIuaW50ZWdlcjE2ID0gMTY7Ci1vb2UyLmludGVnZXIzMiA9IDMyOwotb29lMi5pbnRlZ2VyNjQgPSA2NDsKLW9vZTIuZG91YmxlX3ByZWNpc2lvbiA9IChtYXRoLnNxcnQoNSkrMSkvMjsKLW9vZTIuc29tZV9jaGFyYWN0ZXJzICA9ICI6UiAobWUgZ29pbmcgXCJycnJyXCIpIjsKLW9vZTIuem9tZ191bmljb2RlICAgICA9ICJceGQzXHg4MFx4ZTJceDg1XHhhZVx4Y2VceDlkXHgyMCJcCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHhkMFx4OWRceGNlXHhiZlx4ZTJceDg1XHhiZlx4ZDBceGJlIlwKLSAgICAgICAgICAgICAgICAgICAgICAgICJceGM5XHhhMVx4ZDBceGIzXHhkMFx4YjBceGNmXHg4MVx4ZTJceDg0XHg4ZSJcCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHgyMFx4Y2VceDkxXHg3NFx4NzRceGNlXHhiMVx4ZTJceDg1XHhiZFx4Y2VceGJhIlwKLSAgICAgICAgICAgICAgICAgICAgICAgICJceGM3XHg4M1x4ZTJceDgwXHhiYyI7Ci0KLWhtID0gSG9seU1vbGV5KHsiYmlnIjpbXSwgImNvbnRhaW4iOnNldCgpLCAiYm9ua3MiOnt9fSkKLWhtLmJpZy5hcHBlbmQob29lMSkKLWhtLmJpZy5hcHBlbmQob29lMikKLWhtLmJpZ1swXS5hX2JpdGUgPSAweDIyOwotaG0uYmlnWzFdLmFfYml0ZSA9IDB4MjI7Ci0KLWhtLmNvbnRhaW4uYWRkKCgiYW5kIGEgb25lIiwgImFuZCBhIHR3byIpKQotaG0uY29udGFpbi5hZGQoKCJ0aGVuIGEgb25lLCB0d28iLCAidGhyZWUhIiwgIkZPVVIhIikpCi1obS5jb250YWluLmFkZCgoKSkKLQotaG0uYm9ua3NbIm5vdGhpbmciXSA9IFtdOwotaG0uYm9ua3NbInNvbWV0aGluZyJdID0gWwotICBCb25rKHsidHlwZSI6MSwgIm1lc3NhZ2UiOiJXYWl0LiJ9KSwKLSAgQm9uayh7InR5cGUiOjIsICJtZXNzYWdlIjoiV2hhdD8ifSksCi1dCi1obS5ib25rc1sicG9lIl0gPSBbCi0gIEJvbmsoeyJ0eXBlIjozLCAibWVzc2FnZSI6InF1b3RoIn0pLAotICBCb25rKHsidHlwZSI6NCwgIm1lc3NhZ2UiOiJ0aGUgcmF2ZW4ifSksCi0gIEJvbmsoeyJ0eXBlIjo1LCAibWVzc2FnZSI6Im5ldmVybW9yZSJ9KSwKLV0KLQotcnMgPSBSYW5kb21TdHVmZigpCi1ycy5hID0gMQotcnMuYiA9IDIKLXJzLmMgPSAzCi1ycy5teWludGxpc3QgPSByYW5nZSgyMCkKLXJzLm1hcHMgPSB7MTpXcmFwcGVyKHsiZm9vIjpFbXB0eSgpfSksMjpXcmFwcGVyKHsiZm9vIjpFbXB0eSgpfSl9Ci1ycy5iaWdpbnQgPSAxMjQ1MjM0NTI0MzVMCi1ycy50cmlwbGUgPSAzLjE0Ci0KLSMgbWFrZSBzdXJlIHRoaXMgc3BsaXRzIHR3byBidWZmZXJzIGluIGEgYnVmZmVyZWQgcHJvdG9jb2wKLXJzaHVnZSA9IFJhbmRvbVN0dWZmKCkKLXJzaHVnZS5teWludGxpc3Q9cmFuZ2UoMTAwMDApCi0KLW15X3plcm8gPSBTcnYuSmFua3lfcmVzdWx0KHsiYXJnIjo1fSkKLQotZGVmIGNoZWNrV3JpdGUobyk6Ci0gIHRyYW5zX2Zhc3QgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQotICB0cmFuc19zbG93ID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkKLSAgcHJvdF9mYXN0ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKHRyYW5zX2Zhc3QpCi0gIHByb3Rfc2xvdyA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2wodHJhbnNfc2xvdykKLQotICBvLndyaXRlKHByb3RfZmFzdCkKLSAgby53cml0ZShwcm90X3Nsb3cpCi0gIE9SSUcgPSB0cmFuc19zbG93LmdldHZhbHVlKCkKLSAgTUlORSA9IHRyYW5zX2Zhc3QuZ2V0dmFsdWUoKQotICBpZiBPUklHICE9IE1JTkU6Ci0gICAgcHJpbnQgIm1pbmU6ICVzXG5vcmlnOiAlcyIgJSAocmVwcihNSU5FKSwgcmVwcihPUklHKSkKLQotZGVmIGNoZWNrUmVhZChvKToKLSAgcHJvdCA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2woVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkpCi0gIG8ud3JpdGUocHJvdCkKLQotICBzbG93X3ZlcnNpb25fYmluYXJ5ID0gcHJvdC50cmFucy5nZXR2YWx1ZSgpCi0KLSAgcHJvdCA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCgKLSAgICAgICAgICAgVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKHNsb3dfdmVyc2lvbl9iaW5hcnkpKQotICBjID0gby5fX2NsYXNzX18oKQotICBjLnJlYWQocHJvdCkKLSAgaWYgYyAhPSBvOgotICAgIHByaW50ICJjb3B5OiAiCi0gICAgcHByaW50KGV2YWwocmVwcihjKSkpCi0gICAgcHJpbnQgIm9yaWc6ICIKLSAgICBwcHJpbnQoZXZhbChyZXByKG8pKSkKLQotICBwcm90ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKAotICAgICAgICAgICBUVHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydCgKLSAgICAgICAgICAgICBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoc2xvd192ZXJzaW9uX2JpbmFyeSkpKQotICBjID0gby5fX2NsYXNzX18oKQotICBjLnJlYWQocHJvdCkKLSAgaWYgYyAhPSBvOgotICAgIHByaW50ICJjb3B5OiAiCi0gICAgcHByaW50KGV2YWwocmVwcihjKSkpCi0gICAgcHJpbnQgIm9yaWc6ICIKLSAgICBwcHJpbnQoZXZhbChyZXByKG8pKSkKLQotCi1kZWYgZG9UZXN0KCk6Ci0gIGNoZWNrV3JpdGUoaG0pCi0gIG5vX3NldCA9IGRlZXBjb3B5KGhtKQotICBub19zZXQuY29udGFpbiA9IHNldCgpCi0gIGNoZWNrUmVhZChub19zZXQpCi0gIGNoZWNrV3JpdGUocnMpCi0gIGNoZWNrUmVhZChycykKLSAgY2hlY2tXcml0ZShyc2h1Z2UpCi0gIGNoZWNrUmVhZChyc2h1Z2UpCi0gIGNoZWNrV3JpdGUobXlfemVybykKLSAgY2hlY2tSZWFkKG15X3plcm8pCi0gIGNoZWNrUmVhZChCYWNrd2FyZHMoeyJmaXJzdF90YWcyIjo0LCAic2Vjb25kX3RhZzEiOjJ9KSkKLQotICAjIE9uZSBjYXNlIHdoZXJlIHRoZSBzZXJpYWxpemVkIGZvcm0gY2hhbmdlcywgYnV0IG9ubHkgc3VwZXJmaWNpYWxseS4KLSAgbyA9IEJhY2t3YXJkcyh7ImZpcnN0X3RhZzIiOjQsICJzZWNvbmRfdGFnMSI6Mn0pCi0gIHRyYW5zX2Zhc3QgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQotICB0cmFuc19zbG93ID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkKLSAgcHJvdF9mYXN0ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKHRyYW5zX2Zhc3QpCi0gIHByb3Rfc2xvdyA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2wodHJhbnNfc2xvdykKLQotICBvLndyaXRlKHByb3RfZmFzdCkKLSAgby53cml0ZShwcm90X3Nsb3cpCi0gIE9SSUcgPSB0cmFuc19zbG93LmdldHZhbHVlKCkKLSAgTUlORSA9IHRyYW5zX2Zhc3QuZ2V0dmFsdWUoKQotICBpZiBPUklHID09IE1JTkU6Ci0gICAgcHJpbnQgIlRoYXQgc2hvdWxkbid0IGhhcHBlbi4iCi0KLQotICBwcm90ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpKQotICBvLndyaXRlKHByb3QpCi0gIHByb3QgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sKAotICAgICAgICAgICBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoCi0gICAgICAgICAgICAgcHJvdC50cmFucy5nZXR2YWx1ZSgpKSkKLSAgYyA9IG8uX19jbGFzc19fKCkKLSAgYy5yZWFkKHByb3QpCi0gIGlmIGMgIT0gbzoKLSAgICBwcmludCAiY29weTogIgotICAgIHBwcmludChldmFsKHJlcHIoYykpKQotICAgIHByaW50ICJvcmlnOiAiCi0gICAgcHByaW50KGV2YWwocmVwcihvKSkpCi0KLQotCi1kZWYgZG9CZW5jaG1hcmsoKToKLQotICBpdGVycyA9IDI1MDAwCi0KLSAgc2V0dXAgPSAiIiIKLWZyb20gX19tYWluX18gaW1wb3J0IGhtLCBycywgVERldk51bGxUcmFuc3BvcnQKLWZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKLXRyYW5zID0gVERldk51bGxUcmFuc3BvcnQoKQotcHJvdCA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2wlcyh0cmFucykKLSIiIgotCi0gIHNldHVwX2Zhc3QgPSBzZXR1cCAlICJBY2NlbGVyYXRlZCIKLSAgc2V0dXBfc2xvdyA9IHNldHVwICUgIiIKLQotICBwcmludCAiU3RhcnRpbmcgQmVuY2htYXJrcyIKLQotICBwcmludCAiSG9seU1vbGV5IFN0YW5kYXJkID0gJWYiICUgXAotICAgICAgdGltZWl0LlRpbWVyKCdobS53cml0ZShwcm90KScsIHNldHVwX3Nsb3cpLnRpbWVpdChudW1iZXI9aXRlcnMpCi0gIHByaW50ICJIb2x5TW9sZXkgQWNjZWxlci4gPSAlZiIgJSBcCi0gICAgICB0aW1laXQuVGltZXIoJ2htLndyaXRlKHByb3QpJywgc2V0dXBfZmFzdCkudGltZWl0KG51bWJlcj1pdGVycykKLQotICBwcmludCAiRmFzdFN0cnVjdCBTdGFuZGFyZCA9ICVmIiAlIFwKLSAgICAgIHRpbWVpdC5UaW1lcigncnMud3JpdGUocHJvdCknLCBzZXR1cF9zbG93KS50aW1laXQobnVtYmVyPWl0ZXJzKQotICBwcmludCAiRmFzdFN0cnVjdCBBY2NlbGVyLiA9ICVmIiAlIFwKLSAgICAgIHRpbWVpdC5UaW1lcigncnMud3JpdGUocHJvdCknLCBzZXR1cF9mYXN0KS50aW1laXQobnVtYmVyPWl0ZXJzKQotCi0KLQotZG9UZXN0KCkKLWRvQmVuY2htYXJrKCkKLQpkaWZmIC0tZ2l0IGEvdGVzdC9GdWxsQ2FtZWxUZXN0LnRocmlmdCBiL3Rlc3QvRnVsbENhbWVsVGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VlNGRkOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvRnVsbENhbWVsVGVzdC50aHJpZnQKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCituYW1lc3BhY2UgamF2YSB0aHJpZnQudGVzdC5mdWxsY2FtZWwKKworc3RydWN0IE9uZU9mRWFjaFpaIHsKKyAgMTogYm9vbCBpbV90cnVlLAorICAyOiBib29sIGltX2ZhbHNlLAorICAzOiBieXRlIGFfYml0ZSwKKyAgNDogaTE2IGludGVnZXIxNiwKKyAgNTogaTMyIGludGVnZXIzMiwKKyAgNjogaTY0IGludGVnZXI2NCwKKyAgNzogZG91YmxlIGRvdWJsZV9wcmVjaXNpb24sCisgIDg6IHN0cmluZyBzb21lX2NoYXJhY3RlcnMsCisgIDk6IHN0cmluZyB6b21nX3VuaWNvZGUsCisgIDEwOiBib29sIHdoYXRfd2hvLAorfQorCitzZXJ2aWNlIFVuZGVyc2NvcmVTcnYgeworICBpNjQgc29tZV9ycGNfY2FsbCgxOiBzdHJpbmcgbWVzc2FnZSkKK30KKwpkaWZmIC0tZ2l0IGEvdGVzdC9KYXZhRGVlcENvcHlUZXN0LnRocmlmdCBiL3Rlc3QvSmF2YURlZXBDb3B5VGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM5NzRhZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvSmF2YURlZXBDb3B5VGVzdC50aHJpZnQKQEAgLTAsMCArMSwxOSBAQAoraW5jbHVkZSAiSmF2YVR5cGVzLnRocmlmdCIKKworbmFtZXNwYWNlIGphdmEgdGhyaWZ0LnRlc3QKKworc3RydWN0IERlZXBDb3B5Rm9vIHsKKyAgMTogb3B0aW9uYWwgbGlzdDxEZWVwQ29weUJhcj4gbCwKKyAgMjogb3B0aW9uYWwgc2V0PERlZXBDb3B5QmFyPiBzLAorICAzOiBvcHRpb25hbCBtYXA8c3RyaW5nLCBEZWVwQ29weUJhcj4gbSwKKyAgNDogb3B0aW9uYWwgbGlzdDxKYXZhVHlwZXMuT2JqZWN0PiBsaSwKKyAgNTogb3B0aW9uYWwgc2V0PEphdmFUeXBlcy5PYmplY3Q+IHNpLAorICA2OiBvcHRpb25hbCBtYXA8c3RyaW5nLCBKYXZhVHlwZXMuT2JqZWN0PiBtaSwKKyAgNzogb3B0aW9uYWwgRGVlcENvcHlCYXIgYmFyLAorfQorCitzdHJ1Y3QgRGVlcENvcHlCYXIgeworICAxOiBvcHRpb25hbCBzdHJpbmcgYSwKKyAgMjogb3B0aW9uYWwgaTMyIGIsCisgIDM6IG9wdGlvbmFsIGJvb2wgYywKK30KZGlmZiAtLWdpdCBhL3Rlc3QvSmF2YVR5cGVzLnRocmlmdCBiL3Rlc3QvSmF2YVR5cGVzLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzczM2FkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9KYXZhVHlwZXMudGhyaWZ0CkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK25hbWVzcGFjZSBqYXZhIHRocmlmdC50ZXN0CisKK3N0cnVjdCBJbnRlZ2VyIHsKKyAgMTogaTMyIHZhbAorfQorCitzdHJ1Y3QgU3RyaW5nIHsKKyAgMTogc3RyaW5nIHZhbAorfQorCitzdHJ1Y3QgQm9vbGVhbiB7CisgIDE6IGJvb2wgdmFsCit9CisKK3N0cnVjdCBEb3VibGUgeworICAxOiBkb3VibGUgdmFsCit9CisKK3N0cnVjdCBMb25nIHsKKyAgMTogaTY0IHZhbAorfQorCitzdHJ1Y3QgQnl0ZSB7CisgIDE6IGJ5dGUgdmFsCit9CisKK3N0cnVjdCBGbG9hdCB7CisgIDE6IGRvdWJsZSB2YWwKK30KKworc3RydWN0IExpc3QgeworICAxOiBsaXN0PHN0cmluZz4gdmFscworfQorCitzdHJ1Y3QgQXJyYXlMaXN0IHsKKyAgMTogbGlzdDxzdHJpbmc+IHZhbHMKK30KKworc3RydWN0IFNvcnRlZE1hcCB7CisgIDE6IG1hcDxzdHJpbmcsIHN0cmluZz4gdmFscworfQorCitzdHJ1Y3QgVHJlZU1hcCB7CisgIDE6IG1hcDxzdHJpbmcsIHN0cmluZz4gdmFscworfQorCitzdHJ1Y3QgSGFzaE1hcCB7CisgIDE6IG1hcDxzdHJpbmcsIFN0cmluZz4gdmFscworfQorCitzdHJ1Y3QgTWFwIHsKKyAgMTogbWFwPGRvdWJsZSwgRG91YmxlPiB2YWxzCit9CisKK3N0cnVjdCBPYmplY3QgeworICAxOiBJbnRlZ2VyIGludGVnZXIsCisgIDI6IFN0cmluZyBzdHIsCisgIDM6IEJvb2xlYW4gYm9vbGVhbl9maWVsZCwKKyAgNDogRG91YmxlIGRibCwKKyAgNTogQnl0ZSBiaXRlLAorICA2OiBtYXA8aTMyLCBJbnRlZ2VyPiBpbnRtYXAsCisgIDc6IE1hcCBzb21lbWFwLAorfQorCitleGNlcHRpb24gRXhjZXB0aW9uIHsKKyAgMTogc3RyaW5nIG1zZworfQorCitzZXJ2aWNlIEFzeW5jTm9uYmxvY2tpbmdTZXJ2aWNlIHsKKyAgT2JqZWN0IG15bWV0aG9kKAorICAgIDE6IEludGVnZXIgaW50ZWdlciwKKyAgICAyOiBTdHJpbmcgc3RyLAorICAgIDM6IEJvb2xlYW4gYm9vbGVhbl9maWVsZCwKKyAgICA0OiBEb3VibGUgZGJsLAorICAgIDU6IEJ5dGUgYml0ZSwKKyAgICA2OiBtYXA8aTMyLCBJbnRlZ2VyPiBpbnRtYXAsCisgICAgNzogTWFwIHNvbWVtYXAsCisgICkgdGhyb3dzICgxOkV4Y2VwdGlvbiBleCk7Cit9CisKK3N0cnVjdCBTYWZlQnl0ZXMgeworICAxOiBiaW5hcnkgYnl0ZXM7Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3QvSnNEZWVwQ29uc3RydWN0b3JUZXN0LnRocmlmdCBiL3Rlc3QvSnNEZWVwQ29uc3RydWN0b3JUZXN0LnRocmlmdAppbmRleCBjMmUyM2FmLi5lZjUxMjZmIDEwMDY0NAotLS0gYS90ZXN0L0pzRGVlcENvbnN0cnVjdG9yVGVzdC50aHJpZnQKKysrIGIvdGVzdC9Kc0RlZXBDb25zdHJ1Y3RvclRlc3QudGhyaWZ0CkBAIC05LDYgKzksOCBAQAogICA0OiBtYXA8c3RyaW5nLFNpbXBsZT4gc3RydWN0X21hcF9maWVsZAogICA1OiBsaXN0PHNldDxtYXA8c3RyaW5nLGxpc3Q8U2ltcGxlPj4+PiBzdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQKICAgNjogbWFwPHN0cmluZywgbGlzdDxtYXA8c3RyaW5nLFNpbXBsZT4+ID4gc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkMgorICA3OiBsaXN0PGxpc3Q8c3RyaW5nPj4gbGlzdF9vZl9saXN0X2ZpZWxkCisgIDg6IGxpc3Q8bGlzdDxsaXN0PHN0cmluZz4+PiBsaXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZAogfQogCiBzdHJ1Y3QgQ29tcGxleExpc3QgewpkaWZmIC0tZ2l0IGEvdGVzdC9NYWtlZmlsZS5hbSBiL3Rlc3QvTWFrZWZpbGUuYW0KaW5kZXggNmViY2QyNy4uNjhmMTk4NiAxMDA3NTUKLS0tIGEvdGVzdC9NYWtlZmlsZS5hbQorKysgYi90ZXN0L01ha2VmaWxlLmFtCkBAIC0xNyw3ICsxNyw3IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1TVUJESVJTID0KK1NVQkRJUlMgPSBmZWF0dXJlcwogUFJFQ1JPU1NfVEFSR0VUID0KIAogaWYgV0lUSF9DX0dMSUIKQEAgLTI1LDYgKzI1LDE2IEBACiBQUkVDUk9TU19UQVJHRVQgKz0gcHJlY3Jvc3MtY19nbGliCiBlbmRpZgogCitpZiBXSVRIX0NMCitTVUJESVJTICs9IGNsCitQUkVDUk9TU19UQVJHRVQgKz0gcHJlY3Jvc3MtY2wKK2VuZGlmCisKK2lmIFdJVEhfTU9OTworU1VCRElSUyArPSBjc2hhcnAKK1BSRUNST1NTX1RBUkdFVCArPSBwcmVjcm9zcy1jc2hhcnAKK2VuZGlmCisKIGlmIFdJVEhfQ1BQCiBTVUJESVJTICs9IGNwcAogUFJFQ1JPU1NfVEFSR0VUICs9IHByZWNyb3NzLWNwcApAQCAtNDAsMTEgKzUwLDE4IEBACiBQUkVDUk9TU19UQVJHRVQgKz0gcHJlY3Jvc3MtcGhwCiBlbmRpZgogCitpZiBXSVRIX0RBUlQKK1NVQkRJUlMgKz0gZGFydAorUFJFQ1JPU1NfVEFSR0VUICs9IHByZWNyb3NzLWRhcnQKK2VuZGlmCisKIGlmIFdJVEhfUFlUSE9OCiBTVUJESVJTICs9IHB5CiBQUkVDUk9TU19UQVJHRVQgKz0gcHJlY3Jvc3MtcHkKLVNVQkRJUlMgKz0gcHkudHdpc3RlZAogU1VCRElSUyArPSBweS50b3JuYWRvCitpZiBXSVRIX1RXSVNURURfVEVTVAorU1VCRElSUyArPSBweS50d2lzdGVkCitlbmRpZgogZW5kaWYKIAogaWYgV0lUSF9SVUJZCkBAIC02MCw2ICs3NywxMCBAQAogU1VCRElSUyArPSBoYXhlCiBlbmRpZgogCitpZiBXSVRIX0RPVE5FVENPUkUKK1NVQkRJUlMgKz0gbmV0Y29yZQorZW5kaWYKKwogaWYgV0lUSF9HTwogU1VCRElSUyArPSBnbwogUFJFQ1JPU1NfVEFSR0VUICs9IHByZWNyb3NzLWdvCkBAIC02Nyw2ICs4OCwxNyBAQAogCiBpZiBXSVRIX0VSTEFORwogU1VCRElSUyArPSBlcmwKK1BSRUNST1NTX1RBUkdFVCArPSBwcmVjcm9zcy1lcmwKK2VuZGlmCisKK2lmIFdJVEhfTFVBCitTVUJESVJTICs9IGx1YQorUFJFQ1JPU1NfVEFSR0VUICs9IHByZWNyb3NzLWx1YQorZW5kaWYKKworaWYgV0lUSF9SUworU1VCRElSUyArPSBycworUFJFQ1JPU1NfVEFSR0VUICs9IHByZWNyb3NzLXJzCiBlbmRpZgogCiAjCkBAIC04Myw3ICsxMTUsOSBAQAogCWNyb3NzcnVubmVyIFwKIAlrZXlzIFwKIAljX2dsaWIgXAorCWNsIFwKIAljcHAgXAorCWRhcnQgXAogCWVybCBcCiAJaHMgXAogCWx1YSBcCkBAIC05NCwxNyArMTI4LDIxIEBACiAJcHkudHdpc3RlZCBcCiAJcHkudG9ybmFkbyBcCiAJcmIgXAorCXJzIFwKIAl0aHJlYWRzIFwKIAlBbm5vdGF0aW9uVGVzdC50aHJpZnQgXAogCUJyb2tlbkNvbnN0YW50cy50aHJpZnQgXAogCUNvbnN0YW50c0RlbW8udGhyaWZ0IFwKIAlEZWJ1Z1Byb3RvVGVzdC50aHJpZnQgXAorCURvdWJsZUNvbnN0YW50c1Rlc3QudGhyaWZ0IFwKIAlEZW5zZUxpbmtpbmdUZXN0LnRocmlmdCBcCiAJRG9jVGVzdC50aHJpZnQgXAogCUVudW1UZXN0LnRocmlmdCBcCi0Ja25vd25fZmFpbHVyZXNfTGludXguanNvbiBcCisJRnVsbENhbWVsVGVzdC50aHJpZnQgXAogCUluY2x1ZGUudGhyaWZ0IFwKIAlKYXZhQmVhbnNUZXN0LnRocmlmdCBcCisJSmF2YURlZXBDb3B5VGVzdC50aHJpZnQgXAorCUphdmFUeXBlcy50aHJpZnQgXAogCUpzRGVlcENvbnN0cnVjdG9yVGVzdC50aHJpZnQgXAogCU1hbnlPcHRpb25hbHMudGhyaWZ0IFwKIAlNYW55VHlwZWRlZnMudGhyaWZ0IFwKQEAgLTExMiwxNCArMTUwLDE4IEBACiAJT3B0aW9uYWxSZXF1aXJlZFRlc3QudGhyaWZ0IFwKIAlSZWN1cnNpdmUudGhyaWZ0IFwKIAlSZXVzZU9iamVjdHMudGhyaWZ0IFwKKwlFbnVtQ29udGFpbmVyc1Rlc3QudGhyaWZ0IFwKIAlTbWFsbFRlc3QudGhyaWZ0IFwKIAlTdHJlc3NUZXN0LnRocmlmdCBcCi0JdGVzdC5weSBcCi0JdGVzdHMuanNvbiBcCiAJVGhyaWZ0VGVzdC50aHJpZnQgXAogCVR5cGVkZWZUZXN0LnRocmlmdCBcCi0JRmFzdGJpbmFyeVRlc3QucHkgXAotCXJlc3VsdC5odG1sIFwKKwlVbnNhZmVUeXBlcy50aHJpZnQgXAorCWtub3duX2ZhaWx1cmVzX0xpbnV4Lmpzb24gXAorCXRlc3QucHkgXAorCXRlc3RzLmpzb24gXAorCXJlYnVpbGRfa25vd25fZmFpbHVyZXMuc2ggXAorCXJlc3VsdC5qcyBcCisJaW5kZXguaHRtbCBcCiAJUkVBRE1FLm1kIFwKIAl2YWxncmluZC5zdXBwcmVzcwogCmRpZmYgLS1naXQgYS90ZXN0L09wdGlvbmFsUmVxdWlyZWRUZXN0LnRocmlmdCBiL3Rlc3QvT3B0aW9uYWxSZXF1aXJlZFRlc3QudGhyaWZ0CmluZGV4IGRjZGQwZjIuLmE2MDg4OTggMTAwNjQ0Ci0tLSBhL3Rlc3QvT3B0aW9uYWxSZXF1aXJlZFRlc3QudGhyaWZ0CisrKyBiL3Rlc3QvT3B0aW9uYWxSZXF1aXJlZFRlc3QudGhyaWZ0CkBAIC04MCwzICs4MCw5IEBACiAgIDU6IHJlcXVpcmVkIGJpbmFyeSByZXFfYmluOwogICA2OiBvcHRpb25hbCBiaW5hcnkgb3B0X2JpbjsKIH0KKworc3RydWN0IEJpbmFyaWVzIHsKKyAgNDogYmluYXJ5IGJpbjsKKyAgNTogcmVxdWlyZWQgYmluYXJ5IHJlcV9iaW47CisgIDY6IG9wdGlvbmFsIGJpbmFyeSBvcHRfYmluOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9SRUFETUUubWQgYi90ZXN0L1JFQURNRS5tZAppbmRleCBjMWE3M2VjLi4wNjgyZjVkIDEwMDc1NQotLS0gYS90ZXN0L1JFQURNRS5tZAorKysgYi90ZXN0L1JFQURNRS5tZApAQCAtMzEsNiArMzEsMTEgQEAKICAgICB0ZXN0L3Rlc3QucHkgLS1zZXJ2ZXIgY3BwLGphdmEgLS1jbGllbnQgbm9kZWpzCiAgICAgdGVzdC90ZXN0LnB5IC0tc2VydmVyIG5vZGVqcyAtLWNsaWVudCBjcHAsamF2YQogCitBbm90aGVyIHVzZWZ1bCBmbGFnIGlzIC0tcmVnZXguIEZvciBleGFtcGxlLCB0byBydW4gYWxsIHRlc3RzIHRoYXQgaW52b2x2ZQorSmF2YSBUQmluYXJ5UHJvdG9jb2w6CisKKyAgICB0ZXN0L3Rlc3QucHkgLS1yZWdleCAiamF2YS4qYmluYXJ5IgorCiAjIyBUZXN0IGNhc2UgZGVmaW5pdGlvbiBmaWxlCiAKIFRoZSBjcm9zcyB0ZXN0IGNhc2VzIGFyZSBkZWZpbmVkIGluIFt0ZXN0cy5qc29uXSh0ZXN0cy5qc29uKS4KQEAgLTE2MSw3ICsxNjYsOSBAQAogICAgICAgI2RlZmluZSBURVNUX1NUUlVDVFMgICAgICAgMiAgLy8gMDAwMCAwMDEwCiAgICAgICAjZGVmaW5lIFRFU1RfQ09OVEFJTkVSUyAgICA0ICAvLyAwMDAwIDAxMDAKICAgICAgICNkZWZpbmUgVEVTVF9FWENFUFRJT05TICAgIDggIC8vIDAwMDAgMTAwMAotICAgICAgI2RlZmluZSBURVNUX05PVFVTRUQgICAgIDI0MCAgLy8gMTExMSAwMDAwIChyZXNlcnZlZCBiaXRzKQorICAgICAgI2RlZmluZSBURVNUX1VOS05PV04gICAgICA2NCAgLy8gMDEwMCAwMDAwIChGYWlsZWQgdG8gcHJlcGFyZSBlbnZpcm9uZW10IGV0Yy4pCisgICAgICAjZGVmaW5lIFRFU1RfVElNRU9VVCAgICAgMTI4ICAvLyAxMDAwIDAwMDAKKyAgICAgICNkZWZpbmUgVEVTVF9OT1RVU0VEICAgICAgNDggIC8vIDAwMTEgMDAwMCAocmVzZXJ2ZWQgYml0cykKIAogVGVzdHMgdGhhdCBoYXZlIG5vdCBiZWVuIGV4ZWN1dGVkIGF0IGFsbCBjb3VudCBhcyBlcnJvcnMuCiAKZGlmZiAtLWdpdCBhL3Rlc3QvU3RyZXNzVGVzdC50aHJpZnQgYi90ZXN0L1N0cmVzc1Rlc3QudGhyaWZ0CmluZGV4IGNjZjIyYWYuLjQzMTgxMWIgMTAwNjQ0Ci0tLSBhL3Rlc3QvU3RyZXNzVGVzdC50aHJpZnQKKysrIGIvdGVzdC9TdHJlc3NUZXN0LnRocmlmdApAQCAtMjQsMTIgKzI0LDEyIEBACiBzZXJ2aWNlIFNlcnZpY2UgewogCiAgIHZvaWQgZWNob1ZvaWQoKSwKLSAgYnl0ZSBlY2hvQnl0ZSgxOiBieXRlIGFyZyksCisgIGk4IGVjaG9CeXRlKDE6IGk4IGFyZyksCiAgIGkzMiBlY2hvSTMyKDE6IGkzMiBhcmcpLAogICBpNjQgZWNob0k2NCgxOiBpNjQgYXJnKSwKICAgc3RyaW5nIGVjaG9TdHJpbmcoMTogc3RyaW5nIGFyZyksCi0gIGxpc3Q8Ynl0ZT4gIGVjaG9MaXN0KDE6IGxpc3Q8Ynl0ZT4gYXJnKSwKLSAgc2V0PGJ5dGU+ICBlY2hvU2V0KDE6IHNldDxieXRlPiBhcmcpLAotICBtYXA8Ynl0ZSwgYnl0ZT4gIGVjaG9NYXAoMTogbWFwPGJ5dGUsIGJ5dGU+IGFyZyksCisgIGxpc3Q8aTg+ICBlY2hvTGlzdCgxOiBsaXN0PGk4PiBhcmcpLAorICBzZXQ8aTg+ICBlY2hvU2V0KDE6IHNldDxpOD4gYXJnKSwKKyAgbWFwPGk4LCBpOD4gIGVjaG9NYXAoMTogbWFwPGk4LCBpOD4gYXJnKSwKIH0KIApkaWZmIC0tZ2l0IGEvdGVzdC9UaHJpZnRUZXN0LnRocmlmdCBiL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKaW5kZXggYTc0OTU2Ni4uMzQ5OWFiNSAxMDA2NDQKLS0tIGEvdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorKysgYi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CkBAIC0zNiw2ICszNiw4IEBACiBuYW1lc3BhY2UgZGVscGhpIFRocmlmdC5UZXN0CiBuYW1lc3BhY2UgY29jb2EgVGhyaWZ0VGVzdAogbmFtZXNwYWNlIGx1YSBUaHJpZnRUZXN0CituYW1lc3BhY2UgeHNkIHRlc3QgKHVyaSA9ICdodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvbnMvVGhyaWZ0VGVzdCcpCituYW1lc3BhY2UgbmV0Y29yZSBUaHJpZnRUZXN0CiAKIC8vIFByZXNlbmNlIG9mIG5hbWVzcGFjZXMgYW5kIHN1Yi1uYW1lc3BhY2VzIGZvciB3aGljaCB0aGVyZSBpcwogLy8gbm8gZ2VuZXJhdG9yIHNob3VsZCBjb21waWxlIHdpdGggd2FybmluZ3Mgb25seQpAQCAtNzksMTQgKzgxLDE0IEBACiBzdHJ1Y3QgWHRydWN0CiB7CiAgIDE6ICBzdHJpbmcgc3RyaW5nX3RoaW5nLAotICA0OiAgYnl0ZSAgIGJ5dGVfdGhpbmcsCisgIDQ6ICBpOCAgICAgYnl0ZV90aGluZywKICAgOTogIGkzMiAgICBpMzJfdGhpbmcsCiAgIDExOiBpNjQgICAgaTY0X3RoaW5nCiB9CiAKIHN0cnVjdCBYdHJ1Y3QyCiB7Ci0gIDE6IGJ5dGUgICBieXRlX3RoaW5nLAorICAxOiBpOCAgICAgYnl0ZV90aGluZywgIC8vIHVzZWQgdG8gYmUgYnl0ZSwgaGVuY2UgdGhlIG5hbWUKICAgMjogWHRydWN0IHN0cnVjdF90aGluZywKICAgMzogaTMyICAgIGkzMl90aGluZwogfQpAQCAtMTA0LDE1ICsxMDYsMjQgQEAKIHsKICAgMTogbWFwPE51bWJlcnosIFVzZXJJZD4gdXNlck1hcCwKICAgMjogbGlzdDxYdHJ1Y3Q+IHh0cnVjdHMKLX0KK30gKHB5dGhvbi5pbW11dGFibGU9ICIiKQogCiBzdHJ1Y3QgQ3JhenlOZXN0aW5nIHsKICAgMTogc3RyaW5nIHN0cmluZ19maWVsZCwKICAgMjogb3B0aW9uYWwgc2V0PEluc2FuaXR5PiBzZXRfZmllbGQsCi0gIDM6IHJlcXVpcmVkIGxpc3Q8IG1hcDxzZXQ8aTMyPixtYXA8aTMyLHNldDxsaXN0PG1hcDxJbnNhbml0eSxzdHJpbmc+Pj4+Pj4gbGlzdF9maWVsZCwKKyAgLy8gRG8gbm90IGluc2VydCBsaW5lIGJyZWFrIGFzIHRlc3QvZ28vTWFrZWZpbGUuYW0gaXMgcmVtb3ZpbmcgdGhpcyBsaW5lIHdpdGggcGF0dGVybiBtYXRjaAorICAzOiByZXF1aXJlZCBsaXN0PG1hcDxzZXQ8aTMyPiAocHl0aG9uLmltbXV0YWJsZSA9ICIiKSwgbWFwPGkzMixzZXQ8bGlzdDxtYXA8SW5zYW5pdHksc3RyaW5nPihweXRob24uaW1tdXRhYmxlID0gIiIpPiAocHl0aG9uLmltbXV0YWJsZSA9ICIiKT4+Pj4gbGlzdF9maWVsZCwKICAgNDogYmluYXJ5IGJpbmFyeV9maWVsZAogfQogCit1bmlvbiBTb21lVW5pb24geworICAxOiBtYXA8TnVtYmVyeiwgVXNlcklkPiBtYXBfdGhpbmcsCisgIDI6IHN0cmluZyBzdHJpbmdfdGhpbmcsCisgIDM6IGkzMiBpMzJfdGhpbmcsCisgIDQ6IFh0cnVjdDMgeHRydWN0X3RoaW5nLAorICA1OiBJbnNhbml0eSBpbnNhbml0eV90aGluZworfQorCiBleGNlcHRpb24gWGNlcHRpb24gewogICAxOiBpMzIgZXJyb3JDb2RlLAogICAyOiBzdHJpbmcgbWVzc2FnZQpAQCAtMTUyLDEwICsxNjMsMTEgQEAKIAogICAvKioKICAgICogUHJpbnRzICd0ZXN0Qnl0ZSgiJWQiKScgd2l0aCB0aGluZyBhcyAnJWQnCi0gICAqIEBwYXJhbSBieXRlIHRoaW5nIC0gdGhlIGJ5dGUgdG8gcHJpbnQKLSAgICogQHJldHVybiBieXRlIC0gcmV0dXJucyB0aGUgYnl0ZSAndGhpbmcnCisgICAqIFRoZSB0eXBlcyBpOCBhbmQgYnl0ZSBhcmUgc3lub255bXMsIHVzZSBvZiBpOCBpcyBlbmNvdXJhZ2VkLCBieXRlIHN0aWxsIGV4aXN0cyBmb3IgdGhlIHNha2Ugb2YgY29tcGF0aWJpbGl0eS4KKyAgICogQHBhcmFtIGJ5dGUgdGhpbmcgLSB0aGUgaTgvYnl0ZSB0byBwcmludAorICAgKiBAcmV0dXJuIGk4IC0gcmV0dXJucyB0aGUgaTgvYnl0ZSAndGhpbmcnCiAgICAqLwotICBieXRlICAgICAgICAgdGVzdEJ5dGUoMTogYnl0ZSB0aGluZyksCisgIGk4ICAgICAgICAgICB0ZXN0Qnl0ZSgxOiBpOCB0aGluZyksCiAKICAgLyoqCiAgICAqIFByaW50cyAndGVzdEkzMigiJWQiKScgd2l0aCB0aGluZyBhcyAnJWQnCkBAIC0xODQsNyArMTk2LDcgQEAKICAgICogQHJldHVybiBiaW5hcnkgIC0gcmV0dXJucyB0aGUgYmluYXJ5ICd0aGluZycKICAgICovCiAgIGJpbmFyeSAgICAgICB0ZXN0QmluYXJ5KDE6IGJpbmFyeSB0aGluZyksCi0gIAorCiAgIC8qKgogICAgKiBQcmludHMgJ3Rlc3RTdHJ1Y3QoInslc30iKScgd2hlcmUgdGhpbmcgaGFzIGJlZW4gZm9ybWF0dGVkIGludG8gYSBzdHJpbmcgb2YgY29tbWEgc2VwYXJhdGVkIHZhbHVlcwogICAgKiBAcGFyYW0gWHRydWN0IHRoaW5nIC0gdGhlIFh0cnVjdCB0byBwcmludApAQCAtMjY4LDcgKzI4MCw3IEBACiAKICAgLyoqCiAgICAqIFByaW50cyAndGVzdE11bHRpKCknCi0gICAqIEBwYXJhbSBieXRlIGFyZzAgLQorICAgKiBAcGFyYW0gaTggYXJnMCAtCiAgICAqIEBwYXJhbSBpMzIgYXJnMSAtCiAgICAqIEBwYXJhbSBpNjQgYXJnMiAtCiAgICAqIEBwYXJhbSBtYXA8aTE2LCBzdHJpbmc+IGFyZzMgLQpAQCAtMjc3LDcgKzI4OSw3IEBACiAgICAqIEByZXR1cm4gWHRydWN0IC0gcmV0dXJucyBhbiBYdHJ1Y3Qgd2l0aCBzdHJpbmdfdGhpbmcgPSAiSGVsbG8yLCBieXRlX3RoaW5nID0gYXJnMCwgaTMyX3RoaW5nID0gYXJnMQogICAgKiAgICBhbmQgaTY0X3RoaW5nID0gYXJnMgogICAgKi8KLSAgWHRydWN0IHRlc3RNdWx0aSgxOiBieXRlIGFyZzAsIDI6IGkzMiBhcmcxLCAzOiBpNjQgYXJnMiwgNDogbWFwPGkxNiwgc3RyaW5nPiBhcmczLCA1OiBOdW1iZXJ6IGFyZzQsIDY6IFVzZXJJZCBhcmc1KSwKKyAgWHRydWN0IHRlc3RNdWx0aSgxOiBpOCBhcmcwLCAyOiBpMzIgYXJnMSwgMzogaTY0IGFyZzIsIDQ6IG1hcDxpMTYsIHN0cmluZz4gYXJnMywgNTogTnVtYmVyeiBhcmc0LCA2OiBVc2VySWQgYXJnNSksCiAKICAgLyoqCiAgICAqIFByaW50ICd0ZXN0RXhjZXB0aW9uKCVzKScgd2l0aCBhcmcgYXMgJyVzJwpAQCAtMjkyLDcgKzMwNCw3IEBACiAgICAqIFByaW50ICd0ZXN0TXVsdGlFeGNlcHRpb24oJXMsICVzKScgd2l0aCBhcmcwIGFzICclcycgYW5kIGFyZzEgYXMgJyVzJwogICAgKiBAcGFyYW0gc3RyaW5nIGFyZyAtIGEgc3RyaW5nIGluZGljYXRpb24gd2hhdCB0eXBlIG9mIGV4Y2VwdGlvbiB0byB0aHJvdwogICAgKiBpZiBhcmcwID09ICJYY2VwdGlvbiIgdGhyb3cgWGNlcHRpb24gd2l0aCBlcnJvckNvZGUgPSAxMDAxIGFuZCBtZXNzYWdlID0gIlRoaXMgaXMgYW4gWGNlcHRpb24iCi0gICAqIGVsc2VuIGlmIGFyZzAgPT0gIlhjZXB0aW9uMiIgdGhyb3cgWGNlcHRpb24yIHdpdGggZXJyb3JDb2RlID0gMjAwMiBhbmQgbWVzc2FnZSA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uMiIKKyAgICogZWxzZW4gaWYgYXJnMCA9PSAiWGNlcHRpb24yIiB0aHJvdyBYY2VwdGlvbjIgd2l0aCBlcnJvckNvZGUgPSAyMDAyIGFuZCBzdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nID0gIlRoaXMgaXMgYW4gWGNlcHRpb24yIgogICAgKiBlbHNlIGRvIG5vdCB0aHJvdyBhbnl0aGluZwogICAgKiBAcmV0dXJuIFh0cnVjdCAtIGFuIFh0cnVjdCB3aXRoIHN0cmluZ190aGluZyA9IGFyZzEKICAgICovCkBAIC0zMDksMTMgKzMyMSwxMiBAQAogCiBzZXJ2aWNlIFNlY29uZFNlcnZpY2UKIHsKLSAgdm9pZCBibGFoQmxhaCgpCiAgIC8qKgogICAgKiBQcmludHMgJ3Rlc3RTdHJpbmcoIiVzIiknIHdpdGggdGhpbmcgYXMgJyVzJwogICAgKiBAcGFyYW0gc3RyaW5nIHRoaW5nIC0gdGhlIHN0cmluZyB0byBwcmludAogICAgKiBAcmV0dXJuIHN0cmluZyAtIHJldHVybnMgdGhlIHN0cmluZyAndGhpbmcnCiAgICAqLwotICBzdHJpbmcgICAgICAgc2Vjb25kdGVzdFN0cmluZygxOiBzdHJpbmcgdGhpbmcpLAorICBzdHJpbmcgc2Vjb25kdGVzdFN0cmluZygxOiBzdHJpbmcgdGhpbmcpCiB9CiAKIHN0cnVjdCBWZXJzaW9uaW5nVGVzdFYxIHsKQEAgLTMyOCw3ICszMzksNyBAQAogICAgICAgIDE6IGkzMiBiZWdpbl9pbl9ib3RoLAogCiAgICAgICAgMjogaTMyIG5ld2ludCwKLSAgICAgICAzOiBieXRlIG5ld2J5dGUsCisgICAgICAgMzogaTggbmV3Ynl0ZSwKICAgICAgICA0OiBpMTYgbmV3c2hvcnQsCiAgICAgICAgNTogaTY0IG5ld2xvbmcsCiAgICAgICAgNjogZG91YmxlIG5ld2RvdWJsZQpkaWZmIC0tZ2l0IGEvdGVzdC9VbnNhZmVUeXBlcy50aHJpZnQgYi90ZXN0L1Vuc2FmZVR5cGVzLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzhjOTA1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9VbnNhZmVUeXBlcy50aHJpZnQKQEAgLTAsMCArMSwyNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCituYW1lc3BhY2UgamF2YSB0aHJpZnQudGVzdAorCitzdHJ1Y3QgVW5zYWZlQnl0ZXMgeworICAxOiBiaW5hcnkgYnl0ZXM7Cit9CmRpZmYgLS1naXQgYS90ZXN0L2NfZ2xpYi9NYWtlZmlsZS5hbSBiL3Rlc3QvY19nbGliL01ha2VmaWxlLmFtCmluZGV4IDc1NTlmZDYuLjRhMDNkMjkgMTAwNzU1Ci0tLSBhL3Rlc3QvY19nbGliL01ha2VmaWxlLmFtCisrKyBiL3Rlc3QvY19nbGliL01ha2VmaWxlLmFtCkBAIC0yOSw3ICsyOSw3IEBACiAKIGxpYnRlc3RjZ2xpYl9sYV9MSUJBREQgPSAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9saWJ0aHJpZnRfY19nbGliLmxhCiAKLXByZWNyb3NzOiB0ZXN0X2NsaWVudCB0ZXN0X3NlcnZlcgorcHJlY3Jvc3M6IGxpYnRlc3RjZ2xpYi5sYSB0ZXN0X2NsaWVudCB0ZXN0X3NlcnZlcgogCiBjaGVja19QUk9HUkFNUyA9IFwKIAl0ZXN0X2NsaWVudCBcCkBAIC00NSw2ICs0NSw4IEBACiB0ZXN0X3NlcnZlcl9TT1VSQ0VTID0gXAogCXNyYy90aHJpZnRfdGVzdF9oYW5kbGVyLmMgXAogCXNyYy90aHJpZnRfdGVzdF9oYW5kbGVyLmggXAorCXNyYy90aHJpZnRfc2Vjb25kX3NlcnZpY2VfaGFuZGxlci5jIFwKKwlzcmMvdGhyaWZ0X3NlY29uZF9zZXJ2aWNlX2hhbmRsZXIuaCBcCiAJc3JjL3Rlc3Rfc2VydmVyLmMKIAogdGVzdF9zZXJ2ZXJfTERBREQgPSBcCkBAIC01NCw4ICs1Niw2IEBACiAjCiAjIENvbW1vbiB0aHJpZnQgY29kZSBnZW5lcmF0aW9uIHJ1bGVzCiAjCi1USFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAotCiBnZW4tY19nbGliL3RfdGVzdF9zZWNvbmRfc2VydmljZS5jICBnZW4tY19nbGliL3RfdGVzdF9zZWNvbmRfc2VydmljZS5oICBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdC5jICBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdC5oICBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdF90eXBlcy5jICBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdF90eXBlcy5oOiAkKHRvcF9zcmNkaXIpL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQgJChUSFJJRlQpCiAJJChUSFJJRlQpIC0tZ2VuIGNfZ2xpYiAtciAkPAogCmRpZmYgLS1naXQgYS90ZXN0L2NfZ2xpYi9zcmMvdGVzdF9jbGllbnQuYyBiL3Rlc3QvY19nbGliL3NyYy90ZXN0X2NsaWVudC5jCmluZGV4IGIxZmUwNjUuLmVmMjRhYjcgMTAwNjQ0Ci0tLSBhL3Rlc3QvY19nbGliL3NyYy90ZXN0X2NsaWVudC5jCisrKyBiL3Rlc3QvY19nbGliL3NyYy90ZXN0X2NsaWVudC5jCkBAIC0yNywxMSArMjcsMTUgQEAKIAogI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5oPgogI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NzbF9zb2NrZXQuaD4KICNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgogCisjaW5jbHVkZSAiLi4vZ2VuLWNfZ2xpYi90X3Rlc3Rfc2Vjb25kX3NlcnZpY2UuaCIKICNpbmNsdWRlICIuLi9nZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdC5oIgogCiAvKiBIYW5kbGUgU0lHUElQRSBzaWduYWxzIChpbmRpY2F0aW5nIHRoZSBzZXJ2ZXIgaGFzIGNsb3NlZCB0aGUKQEAgLTcxLDQyICs3NSw4MiBAQAogICByZXR1cm4gcmVzdWx0OwogfQogCisvKioKKyAqIEl0IGdldHMgYSBtdWx0aXBsZXhlZCBwcm90b2NvbCB3aGljaCB1c2VzIGEgY29uY3JldGUgcHJvdG9jb2wgdW5kZXJuZWF0aAorICogQHBhcmFtICBwcm90b2NvbF9uYW1lICB0aGUgZnVsbHkgcXVhbGlmaWVkIHByb3RvY29sIHBhdGggKGUuZy4gImJpbmFyeTptdWx0aSIpCisgKiBAcGFyYW0gIHRyYW5zcG9ydCAgICAgIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydAorICogQHBhcmFtICBzZXJ2aWNlX25hbWUgICB0aGUgc2luZ2xlIHN1cHBvcnRlZCBzZXJ2aWNlIG5hbWUKKyAqIEB0b2RvICAgICAgICAgICAgICAgICAgbmVlZCB0byBhbGxvdyBtdWx0aXBsZSBzZXJ2aWNlcyB0byBmdWxseSB0ZXN0IG11bHRpcGxleGVkCisgKiBAcmV0dXJuICAgICAgICAgICAgICAgIGEgbXVsdGlwbGV4ZWQgcHJvdG9jb2wgd3JhcHBpbmcgdGhlIGNvcnJlY3QgdW5kZXJseWluZyBwcm90b2NvbAorICovCitUaHJpZnRQcm90b2NvbCAqCitnZXRfbXVsdGlwbGV4ZWRfcHJvdG9jb2woZ2NoYXIgKnByb3RvY29sX25hbWUsIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBnY2hhciAqc2VydmljZV9uYW1lKQoreworICBUaHJpZnRQcm90b2NvbCAqIG11bHRpcGxleGVkX3Byb3RvY29sID0gTlVMTDsKKworICBpZiAoIHN0cm5jbXAocHJvdG9jb2xfbmFtZSwgImJpbmFyeToiLCA3KSA9PSAwKSB7CisgICAgbXVsdGlwbGV4ZWRfcHJvdG9jb2wgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCwKKyAgICAgICAgICAgICAgICAgInRyYW5zcG9ydCIsIHRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgTlVMTCk7CisgIH0gZWxzZSBpZiAoIHN0cm5jbXAocHJvdG9jb2xfbmFtZSwgImNvbXBhY3Q6IiwgOCkgPT0gMCkgeworICAgIG11bHRpcGxleGVkX3Byb3RvY29sID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MLAorICAgICAgICAgICAgICAgICAidHJhbnNwb3J0IiwgdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgfSBlbHNlIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gbXVsdGlwbGV4IHByb3RvY29sIG5hbWU6ICVzXG4iLCBwcm90b2NvbF9uYW1lKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIHJldHVybiBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX01VTFRJUExFWEVEX1BST1RPQ09MLAorICAgICAgICAgICJ0cmFuc3BvcnQiLCAgICAgIHRyYW5zcG9ydCwKKyAgICAgICAgICAicHJvdG9jb2wiLCAgICAgICBtdWx0aXBsZXhlZF9wcm90b2NvbCwKKyAgICAgICAgICAic2VydmljZS1uYW1lIiwgICBzZXJ2aWNlX25hbWUsCisgICAgICAgICAgTlVMTCk7Cit9CisKIGludAogbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogewotICBzdGF0aWMgZ2NoYXIgKmhvc3QgPSBOVUxMOwotICBzdGF0aWMgZ2ludCAgIHBvcnQgPSA5MDkwOwotICBzdGF0aWMgZ2NoYXIgKnRyYW5zcG9ydF9vcHRpb24gPSBOVUxMOwotICBzdGF0aWMgZ2NoYXIgKnByb3RvY29sX29wdGlvbiA9IE5VTEw7Ci0gIHN0YXRpYyBnaW50ICAgbnVtX3Rlc3RzID0gMTsKKyAgc3RhdGljIGdjaGFyICogIGhvc3QgPSBOVUxMOworICBzdGF0aWMgZ2ludCAgICAgcG9ydCA9IDkwOTA7CisgIHN0YXRpYyBnYm9vbGVhbiBzc2wgID0gRkFMU0U7CisgIHN0YXRpYyBnY2hhciAqICB0cmFuc3BvcnRfb3B0aW9uID0gTlVMTDsKKyAgc3RhdGljIGdjaGFyICogIHByb3RvY29sX29wdGlvbiA9IE5VTEw7CisgIHN0YXRpYyBnaW50ICAgICBudW1fdGVzdHMgPSAxOwogCiAgIHN0YXRpYwogICAgIEdPcHRpb25FbnRyeSBvcHRpb25fZW50cmllc1tdID17Ci0gICAgeyAiaG9zdCIsICAgICAgICAgICAgMCwgMCwgR19PUFRJT05fQVJHX1NUUklORywgICAmaG9zdCwKKyAgICB7ICJob3N0IiwgICAgICAgICAgICAnaCcsIDAsIEdfT1BUSU9OX0FSR19TVFJJTkcsICAgJmhvc3QsCiAgICAgICAiSG9zdCB0byBjb25uZWN0ICg9bG9jYWxob3N0KSIsIE5VTEwgfSwKLSAgICB7ICJwb3J0IiwgICAgICAgICAgICAwLCAwLCBHX09QVElPTl9BUkdfSU5ULCAgICAgICZwb3J0LAorICAgIHsgInBvcnQiLCAgICAgICAgICAgICdwJywgMCwgR19PUFRJT05fQVJHX0lOVCwgICAgICAmcG9ydCwKICAgICAgICJQb3J0IG51bWJlciB0byBjb25uZWN0ICg9OTA5MCkiLCBOVUxMIH0sCi0gICAgeyAidHJhbnNwb3J0IiwgICAgICAgMCwgMCwgR19PUFRJT05fQVJHX1NUUklORywgICAmdHJhbnNwb3J0X29wdGlvbiwKKyAgICB7ICJzc2wiLCAgICAgICAgICAgICAncycsIDAsIEdfT1BUSU9OX0FSR19OT05FLCAgICAgJnNzbCwKKyAgICAgICJFbmFibGUgU1NMIiwgTlVMTCB9LAorICAgIHsgInRyYW5zcG9ydCIsICAgICAgICd0JywgMCwgR19PUFRJT05fQVJHX1NUUklORywgICAmdHJhbnNwb3J0X29wdGlvbiwKICAgICAgICJUcmFuc3BvcnQ6IGJ1ZmZlcmVkLCBmcmFtZWQgKD1idWZmZXJlZCkiLCBOVUxMIH0sCi0gICAgeyAicHJvdG9jb2wiLCAgICAgICAgMCwgMCwgR19PUFRJT05fQVJHX1NUUklORywgICAmcHJvdG9jb2xfb3B0aW9uLAotICAgICAgIlByb3RvY29sOiBiaW5hcnkgKD1iaW5hcnkpIiwgTlVMTCB9LAotICAgIHsgInRlc3Rsb29wcyIsICAgICAnbicsIDAsIEdfT1BUSU9OX0FSR19JTlQsICAgICAgJm51bV90ZXN0cywKKyAgICB7ICJwcm90b2NvbCIsICAgICAgICAncicsIDAsIEdfT1BUSU9OX0FSR19TVFJJTkcsICAgJnByb3RvY29sX29wdGlvbiwKKyAgICAgICJQcm90b2NvbDogYmluYXJ5LCBjb21wYWN0LCBtdWx0aSwgbXVsdGljICg9YmluYXJ5KSIsIE5VTEwgfSwKKyAgICB7ICJ0ZXN0bG9vcHMiLCAgICAgICAnbicsIDAsIEdfT1BUSU9OX0FSR19JTlQsICAgICAgJm51bV90ZXN0cywKICAgICAgICJOdW1iZXIgb2YgdGVzdHMgKD0xKSIsIE5VTEwgfSwKICAgICB7IE5VTEwgfQogICB9OwogCiAgIHN0cnVjdCBzaWdhY3Rpb24gc2lncGlwZV9hY3Rpb247CiAKKyAgR1R5cGUgIHNvY2tldF90eXBlICAgID0gVEhSSUZUX1RZUEVfU09DS0VUOworICBnY2hhciAqc29ja2V0X25hbWUgICAgPSAiaXAiOwogICBHVHlwZSAgdHJhbnNwb3J0X3R5cGUgPSBUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQ7CiAgIGdjaGFyICp0cmFuc3BvcnRfbmFtZSA9ICJidWZmZXJlZCI7CiAgIEdUeXBlICBwcm90b2NvbF90eXBlICA9IFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTDsKICAgZ2NoYXIgKnByb3RvY29sX25hbWUgID0gImJpbmFyeSI7CiAKLSAgVGhyaWZ0U29ja2V0ICAgICpzb2NrZXQ7Ci0gIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0OwotICBUaHJpZnRQcm90b2NvbCAgKnByb3RvY29sOworICBUaHJpZnRTb2NrZXQgICAgKnNvY2tldCA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgVGhyaWZ0UHJvdG9jb2wgICpwcm90b2NvbCA9IE5VTEw7CisgIFRocmlmdFByb3RvY29sICAqcHJvdG9jb2wyID0gTlVMTDsgICAgICAgICAgICAvLyBmb3IgbXVsdGlwbGV4ZWQgdGVzdHMKIAotICBUVGVzdFRocmlmdFRlc3RJZiAqdGVzdF9jbGllbnQ7CisgIFRUZXN0VGhyaWZ0VGVzdElmICp0ZXN0X2NsaWVudCA9IE5VTEw7CisgIFRUZXN0U2Vjb25kU2VydmljZUlmICpzZWNvbmRfc2VydmljZSA9IE5VTEw7ICAvLyBmb3IgbXVsdGlwbGV4ZWQgdGVzdHMKIAogICBzdHJ1Y3QgdGltZXZhbCB0aW1lX3N0YXJ0LCB0aW1lX3N0b3AsIHRpbWVfZWxhcHNlZDsKICAgZ3VpbnQ2NCB0aW1lX2VsYXBzZWRfdXNlYywgdGltZV90b3RhbF91c2VjID0gMDsKQEAgLTE0MSwxMCArMTg1LDI2IEBACiAgICAgaG9zdCA9IGdfc3RyZHVwICgibG9jYWxob3N0Iik7CiAKICAgLyogVmFsaWRhdGUgdGhlIHBhcnNlZCBvcHRpb25zICovCi0gIGlmIChwcm90b2NvbF9vcHRpb24gIT0gTlVMTCAmJgotICAgICAgc3RybmNtcCAocHJvdG9jb2xfb3B0aW9uLCAiYmluYXJ5IiwgNykgIT0gMCkgewotICAgIGZwcmludGYgKHN0ZGVyciwgIlVua25vd24gcHJvdG9jb2wgdHlwZSAlc1xuIiwgcHJvdG9jb2xfb3B0aW9uKTsKLSAgICBvcHRpb25zX3ZhbGlkID0gRkFMU0U7CisgIGlmIChwcm90b2NvbF9vcHRpb24gIT0gTlVMTCkgeworICAgIGlmIChzdHJuY21wIChwcm90b2NvbF9vcHRpb24sICJjb21wYWN0IiwgOCkgPT0gMCkgeworICAgICAgcHJvdG9jb2xfdHlwZSA9IFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0w7CisgICAgICBwcm90b2NvbF9uYW1lID0gImNvbXBhY3QiOworICAgIH0KKyAgICBlbHNlIGlmIChzdHJuY21wIChwcm90b2NvbF9vcHRpb24sICJtdWx0aSIsIDYpID09IDApIHsKKyAgICAgIHByb3RvY29sX3R5cGUgPSBUSFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9UT0NPTDsKKyAgICAgIHByb3RvY29sX25hbWUgPSAiYmluYXJ5Om11bHRpIjsKKyAgICB9CisgICAgZWxzZSBpZiAoc3RybmNtcCAocHJvdG9jb2xfb3B0aW9uLCAibXVsdGljIiwgNykgPT0gMCkgeworICAgICAgcHJvdG9jb2xfdHlwZSA9IFRIUklGVF9UWVBFX01VTFRJUExFWEVEX1BST1RPQ09MOworICAgICAgcHJvdG9jb2xfbmFtZSA9ICJjb21wYWN0Om11bHRpYyI7CisgICAgfQorICAgIGVsc2UgaWYgKHN0cm5jbXAgKHByb3RvY29sX29wdGlvbiwgImJpbmFyeSIsIDcpID09IDApIHsKKyAgICAgIHByaW50ZigiV2UgYXJlIGdvaW5nIHdpdGggZGVmYXVsdCBwcm90b2NvbFxuIik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiVW5rbm93biBwcm90b2NvbCB0eXBlICVzXG4iLCBwcm90b2NvbF9vcHRpb24pOworICAgICAgb3B0aW9uc192YWxpZCA9IEZBTFNFOworICAgIH0KICAgfQogCiAgIGlmICh0cmFuc3BvcnRfb3B0aW9uICE9IE5VTEwpIHsKQEAgLTE1OCwxMiArMjE4LDE5IEBACiAgICAgfQogICB9CiAKKyAgaWYgKHNzbCkgeworICAgIHNvY2tldF90eXBlID0gVEhSSUZUX1RZUEVfU1NMX1NPQ0tFVDsKKyAgICBzb2NrZXRfbmFtZSA9ICJpcC1zc2wiOworICAgIHByaW50ZigiVHlwZSBuYW1lICVzXG4iLCBnX3R5cGVfbmFtZSAoc29ja2V0X3R5cGUpKTsKKyAgfQorCiAgIGlmICghb3B0aW9uc192YWxpZCkKICAgICByZXR1cm4gMjU0OwogCi0gIHByaW50ZiAoIkNvbm5lY3RpbmcgKCVzLyVzKSB0bzogJXM6JWRcbiIsCisgIHByaW50ZiAoIkNvbm5lY3RpbmcgKCVzLyVzKSB0bzogJXMvJXM6JWRcbiIsCiAgICAgICAgICAgdHJhbnNwb3J0X25hbWUsCiAgICAgICAgICAgcHJvdG9jb2xfbmFtZSwKKyAgICAgICAgICBzb2NrZXRfbmFtZSwKICAgICAgICAgICBob3N0LAogICAgICAgICAgIHBvcnQpOwogCkBAIC0xNzUsMTcgKzI0Miw1MCBAQAogICBzaWdwaXBlX2FjdGlvbi5zYV9mbGFncyA9IFNBX1JFU0VUSEFORDsKICAgc2lnYWN0aW9uIChTSUdQSVBFLCAmc2lncGlwZV9hY3Rpb24sIE5VTEwpOwogCisgIGlmIChzc2wpIHsKKyAgICB0aHJpZnRfc3NsX3NvY2tldF9pbml0aWFsaXplX29wZW5zc2woKTsKKyAgfQorCiAgIC8qIEVzdGFibGlzaCBhbGwgb3VyIGNvbm5lY3Rpb24gb2JqZWN0cyAqLwotICBzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwKKyAgc29ja2V0ID0gZ19vYmplY3RfbmV3IChzb2NrZXRfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAiaG9zdG5hbWUiLCBob3N0LAogICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgICAgIHBvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgaWYgKHNzbCAmJiAhdGhyaWZ0X3NzbF9sb2FkX2NlcnRfZnJvbV9maWxlKFRIUklGVF9TU0xfU09DS0VUKHNvY2tldCksICIuLi9rZXlzL0NBLnBlbSIpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gbG9hZCB2YWxpZGF0aW9uIGNlcnRpZmljYXRlIC4uL2tleXMvQ0EucGVtIC0gZGlkIHlvdSBydW4gaW4gdGhlIHRlc3QvY19nbGliIGRpcmVjdG9yeT9cbiIpOworICAgIGdfY2xlYXJfb2JqZWN0ICgmc29ja2V0KTsKKyAgICByZXR1cm4gMjUzOworICB9CisKICAgdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3ICh0cmFuc3BvcnRfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJhbnNwb3J0Iiwgc29ja2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICBwcm90b2NvbCA9IGdfb2JqZWN0X25ldyAocHJvdG9jb2xfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc3BvcnQiLCB0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICBpZihwcm90b2NvbF90eXBlPT1USFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9UT0NPTCkgeworICAgIC8vIFRPRE86IEEgbXVsdGlwbGV4ZWQgdGVzdCBzaG91bGQgYWxzbyB0ZXN0ICJTZWNvbmQiIChzZWUgSmF2YSBUZXN0U2VydmVyKQorICAgIC8vIFRoZSBjb250ZXh0IGNvbWVzIGZyb20gdGhlIG5hbWUgb2YgdGhlIHRocmlmdCBmaWxlLiBJZiBtdWx0aXBsZSB0aHJpZnQKKyAgICAvLyBzY2hlbWFzIGFyZSB1c2VkIHdlIGhhdmUgdG8gcmVkbyB0aGUgd2F5IHRoaXMgaXMgZG9uZS4KKyAgICBwcm90b2NvbCA9IGdldF9tdWx0aXBsZXhlZF9wcm90b2NvbChwcm90b2NvbF9uYW1lLCB0cmFuc3BvcnQsICJUaHJpZnRUZXN0Iik7CisgICAgaWYgKE5VTEwgPT0gcHJvdG9jb2wpIHsKKyAgICAgIGdfY2xlYXJfb2JqZWN0ICgmdHJhbnNwb3J0KTsKKyAgICAgIGdfY2xlYXJfb2JqZWN0ICgmc29ja2V0KTsKKyAgICAgIHJldHVybiAyNTI7CisgICAgfQorCisgICAgLy8gTWFrZSBhIHNlY29uZCBwcm90b2NvbCBhbmQgY2xpZW50IHJ1bm5pbmcgb24gdGhlIHNhbWUgbXVsdGlwbGV4ZWQgdHJhbnNwb3J0CisgICAgcHJvdG9jb2wyID0gZ2V0X211bHRpcGxleGVkX3Byb3RvY29sKHByb3RvY29sX25hbWUsIHRyYW5zcG9ydCwgIlNlY29uZFNlcnZpY2UiKTsKKyAgICBzZWNvbmRfc2VydmljZSA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfU0VDT05EX1NFUlZJQ0VfQ0xJRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5wdXRfcHJvdG9jb2wiLCAgcHJvdG9jb2wyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3V0cHV0X3Byb3RvY29sIiwgcHJvdG9jb2wyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICB9ZWxzZXsKKyAgICBwcm90b2NvbCA9IGdfb2JqZWN0X25ldyAocHJvdG9jb2xfdHlwZSwKKyAgICAgICAgICAgInRyYW5zcG9ydCIsIHRyYW5zcG9ydCwKKyAgICAgICAgICAgTlVMTCk7CisgIH0KKwogICB0ZXN0X2NsaWVudCA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfVEhSSUZUX1RFU1RfQ0xJRU5ULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlucHV0X3Byb3RvY29sIiwgIHByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm91dHB1dF9wcm90b2NvbCIsIHByb3RvY29sLApAQCAtMjA0LDcgKzMwNCw3IEBACiAgICAgICBnaW50IGJ5dGVfdGhpbmcsIGkzMl90aGluZywgaW5uZXJfYnl0ZV90aGluZywgaW5uZXJfaTMyX3RoaW5nOwogICAgICAgZ2ludDY0IGk2NF90aGluZywgaW5uZXJfaTY0X3RoaW5nOwogCi0gICAgICBUVGVzdFh0cnVjdCAgKnh0cnVjdF9vdXQsICAqeHRydWN0X2luLCAgKmlubmVyX3h0cnVjdF9pbjsKKyAgICAgIFRUZXN0WHRydWN0ICAqeHRydWN0X291dCwgICp4dHJ1Y3Rfb3V0MiwgKnh0cnVjdF9pbiwgICppbm5lcl94dHJ1Y3RfaW47CiAgICAgICBUVGVzdFh0cnVjdDIgKnh0cnVjdDJfb3V0LCAqeHRydWN0Ml9pbjsKIAogICAgICAgR0hhc2hUYWJsZSAqbWFwX291dCwgKm1hcF9pbiwgKmlubmVyX21hcF9pbjsKQEAgLTIxNyw4ICszMTcsOSBAQAogICAgICAgR0FycmF5ICpsaXN0X291dCwgKmxpc3RfaW47CiAKICAgICAgIFRUZXN0TnVtYmVyeiBudW1iZXJ6OworICAgICAgVFRlc3ROdW1iZXJ6IG51bWJlcnoyOwogCi0gICAgICBUVGVzdFVzZXJJZCB1c2VyX2lkLCAqdXNlcl9pZF9wdHI7CisgICAgICBUVGVzdFVzZXJJZCB1c2VyX2lkLCAqdXNlcl9pZF9wdHIsICp1c2VyX2lkX3B0cjI7CiAKICAgICAgIFRUZXN0SW5zYW5pdHkgKmluc2FuaXR5X291dCwgKmluc2FuaXR5X2luOwogICAgICAgR0hhc2hUYWJsZSAqdXNlcl9tYXA7CkBAIC0yNzAsMTAgKzM3MSwxMSBAQAogICAgICAgICBwcmludGYgKCIgPSB2b2lkXG4iKTsKICAgICAgIH0KICAgICAgIGVsc2UgewotICAgICAgICBwcmludGYgKCIlc1xuIiwgZXJyb3ItPm1lc3NhZ2UpOwotICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKLSAgICAgICAgZXJyb3IgPSBOVUxMOwotCisgICAgICAgIGlmKGVycm9yIT1OVUxMKXsKKyAgICAgICAgICBwcmludGYgKCIlc1xuIiwgZXJyb3ItPm1lc3NhZ2UpOworICAgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgICAgIGVycm9yID0gTlVMTDsKKyAgICAgICAgfQogICAgICAgICBmYWlsX2NvdW50Kys7CiAgICAgICB9CiAKQEAgLTMwMSw2ICs0MDMsMzEgQEAKICAgICAgIH0KIAogICAgICAgLyoqCisgICAgICAgKiBNdWx0aXBsZXhlZCBUZXN0IC0gZG8gdGhpcyByaWdodCBpbiB0aGUgbWlkZGxlIG9mIHRoZSBub3JtYWwgVGVzdCBDbGllbnQgcnVuCisgICAgICAgKi8KKyAgICAgIGlmIChzZWNvbmRfc2VydmljZSkgeworICAgICAgICBwcmludGYgKCJ0ZXN0U2Vjb25kU2VydmljZU11bHRpcGxleFNlY29uZFRlc3RTdHJpbmcoXCIybmRcIikiKTsKKyAgICAgICAgaWYgKHRfdGVzdF9zZWNvbmRfc2VydmljZV9pZl9zZWNvbmR0ZXN0X3N0cmluZyAoc2Vjb25kX3NlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIybmQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKSB7CisgICAgICAgICAgcHJpbnRmICgiID0gXCIlc1wiXG4iLCBzdHJpbmcpOworICAgICAgICAgIGlmIChzdHJjbXAgKHN0cmluZywgInRlc3RTdHJpbmcoXCIybmRcIikiKSAhPSAwKSB7CisgICAgICAgICAgICArK2ZhaWxfY291bnQ7CisgICAgICAgICAgfQorCisgICAgICAgICAgZ19mcmVlIChzdHJpbmcpOworICAgICAgICAgIHN0cmluZyA9IE5VTEw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcHJpbnRmICgiJXNcbiIsIGVycm9yLT5tZXNzYWdlKTsKKyAgICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgICBlcnJvciA9IE5VTEw7CisKKyAgICAgICAgICArK2ZhaWxfY291bnQ7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyoqCiAgICAgICAgKiBCT09MIFRFU1QKICAgICAgICAqLwogICAgICAgcHJpbnRmICgidGVzdEJ5dGUodHJ1ZSkiKTsKQEAgLTM1NSw2ICs0ODIsMjIgQEAKIAogICAgICAgICBmYWlsX2NvdW50Kys7CiAgICAgICB9CisgICAgICBwcmludGYgKCJ0ZXN0Qnl0ZSgtMSkiKTsKKyAgICAgIGlmICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfaWZfdGVzdF9ieXRlICh0ZXN0X2NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKSB7CisgICAgICAgIHByaW50ZiAoIiA9ICVkXG4iLCBieXRlKTsKKyAgICAgICAgaWYgKGJ5dGUgIT0gLTEpCisgICAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHByaW50ZiAoIiVzXG4iLCBlcnJvci0+bWVzc2FnZSk7CisgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgICBlcnJvciA9IE5VTEw7CisKKyAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgfQogCiAgICAgICAvKioKICAgICAgICAqIEkzMiBURVNUCkBAIC00MTYsOCArNTU5LDEwNSBAQAogICAgICAgICBmYWlsX2NvdW50Kys7CiAgICAgICB9CiAKLSAgICAgIC8vIFRPRE86IGFkZCB0ZXN0QmluYXJ5KCkgCSAgCi0JICAKKyAgICAgIC8qKgorICAgICAgICogQklOQVJZIFRFU1QKKyAgICAgICAqLworICAgICAgcHJpbnRmICgidGVzdEJpbmFyeShlbXB0eSkiKTsKKyAgICAgIEdCeXRlQXJyYXkgKmVtcHR5QXJyYXkgPSBnX2J5dGVfYXJyYXlfbmV3KCk7CisgICAgICBHQnl0ZUFycmF5ICpyZXN1bHQgPSBOVUxMOworICAgICAgaWYgKHRfdGVzdF90aHJpZnRfdGVzdF9pZl90ZXN0X2JpbmFyeSAodGVzdF9jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHlBcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpIHsKKyAgICAgICAgR0J5dGVzICpyZXNwb25zZSA9IGdfYnl0ZV9hcnJheV9mcmVlX3RvX2J5dGVzKHJlc3VsdCk7ICAvLyBmcmVlcyByZXN1bHQKKyAgICAgICAgcmVzdWx0ID0gTlVMTDsKKyAgICAgICAgZ3NpemUgc2l6ID0gZ19ieXRlc19nZXRfc2l6ZShyZXNwb25zZSk7CisgICAgICAgIGlmIChzaXogPT0gMCkgeworICAgICAgICAgIHByaW50ZigiID0gZW1wdHlcbiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHByaW50ZigiID0gbm90IGVtcHR5ICglbGQgYnl0ZXMpXG4iLCAobG9uZylzaXopOworICAgICAgICAgICsrZmFpbF9jb3VudDsKKyAgICAgICAgfQorICAgICAgICBnX2J5dGVzX3VucmVmKHJlc3BvbnNlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZiAoIiVzXG4iLCBlcnJvci0+bWVzc2FnZSk7CisgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgICBlcnJvciA9IE5VTEw7CisKKyAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgfQorICAgICAgZ19ieXRlX2FycmF5X3VucmVmKGVtcHR5QXJyYXkpOworICAgICAgZW1wdHlBcnJheSA9IE5VTEw7CisKKyAgICAgIC8vIFRPRE86IGFkZCB0ZXN0QmluYXJ5KCkgd2l0aCBkYXRhCisgICAgICBwcmludGYgKCJ0ZXN0QmluYXJ5KFstMTI4Li4xMjddKSA9IHsiKTsKKyAgICAgIGNvbnN0IHNpZ25lZCBjaGFyIGJpbl9kYXRhWzI1Nl0KKyAgICAgICAgPSB7LTEyOCwgLTEyNywgLTEyNiwgLTEyNSwgLTEyNCwgLTEyMywgLTEyMiwgLTEyMSwgLTEyMCwgLTExOSwgLTExOCwgLTExNywgLTExNiwgLTExNSwgLTExNCwKKyAgICAgICAgICAgLTExMywgLTExMiwgLTExMSwgLTExMCwgLTEwOSwgLTEwOCwgLTEwNywgLTEwNiwgLTEwNSwgLTEwNCwgLTEwMywgLTEwMiwgLTEwMSwgLTEwMCwgLTk5LAorICAgICAgICAgICAtOTgsICAtOTcsICAtOTYsICAtOTUsICAtOTQsICAtOTMsICAtOTIsICAtOTEsICAtOTAsICAtODksICAtODgsICAtODcsICAtODYsICAtODUsICAtODQsCisgICAgICAgICAgIC04MywgIC04MiwgIC04MSwgIC04MCwgIC03OSwgIC03OCwgIC03NywgIC03NiwgIC03NSwgIC03NCwgIC03MywgIC03MiwgIC03MSwgIC03MCwgIC02OSwKKyAgICAgICAgICAgLTY4LCAgLTY3LCAgLTY2LCAgLTY1LCAgLTY0LCAgLTYzLCAgLTYyLCAgLTYxLCAgLTYwLCAgLTU5LCAgLTU4LCAgLTU3LCAgLTU2LCAgLTU1LCAgLTU0LAorICAgICAgICAgICAtNTMsICAtNTIsICAtNTEsICAtNTAsICAtNDksICAtNDgsICAtNDcsICAtNDYsICAtNDUsICAtNDQsICAtNDMsICAtNDIsICAtNDEsICAtNDAsICAtMzksCisgICAgICAgICAgIC0zOCwgIC0zNywgIC0zNiwgIC0zNSwgIC0zNCwgIC0zMywgIC0zMiwgIC0zMSwgIC0zMCwgIC0yOSwgIC0yOCwgIC0yNywgIC0yNiwgIC0yNSwgIC0yNCwKKyAgICAgICAgICAgLTIzLCAgLTIyLCAgLTIxLCAgLTIwLCAgLTE5LCAgLTE4LCAgLTE3LCAgLTE2LCAgLTE1LCAgLTE0LCAgLTEzLCAgLTEyLCAgLTExLCAgLTEwLCAgLTksCisgICAgICAgICAgIC04LCAgIC03LCAgIC02LCAgIC01LCAgIC00LCAgIC0zLCAgIC0yLCAgIC0xLCAgIDAsICAgIDEsICAgIDIsICAgIDMsICAgIDQsICAgIDUsICAgIDYsCisgICAgICAgICAgIDcsICAgIDgsICAgIDksICAgIDEwLCAgIDExLCAgIDEyLCAgIDEzLCAgIDE0LCAgIDE1LCAgIDE2LCAgIDE3LCAgIDE4LCAgIDE5LCAgIDIwLCAgIDIxLAorICAgICAgICAgICAyMiwgICAyMywgICAyNCwgICAyNSwgICAyNiwgICAyNywgICAyOCwgICAyOSwgICAzMCwgICAzMSwgICAzMiwgICAzMywgICAzNCwgICAzNSwgICAzNiwKKyAgICAgICAgICAgMzcsICAgMzgsICAgMzksICAgNDAsICAgNDEsICAgNDIsICAgNDMsICAgNDQsICAgNDUsICAgNDYsICAgNDcsICAgNDgsICAgNDksICAgNTAsICAgNTEsCisgICAgICAgICAgIDUyLCAgIDUzLCAgIDU0LCAgIDU1LCAgIDU2LCAgIDU3LCAgIDU4LCAgIDU5LCAgIDYwLCAgIDYxLCAgIDYyLCAgIDYzLCAgIDY0LCAgIDY1LCAgIDY2LAorICAgICAgICAgICA2NywgICA2OCwgICA2OSwgICA3MCwgICA3MSwgICA3MiwgICA3MywgICA3NCwgICA3NSwgICA3NiwgICA3NywgICA3OCwgICA3OSwgICA4MCwgICA4MSwKKyAgICAgICAgICAgODIsICAgODMsICAgODQsICAgODUsICAgODYsICAgODcsICAgODgsICAgODksICAgOTAsICAgOTEsICAgOTIsICAgOTMsICAgOTQsICAgOTUsICAgOTYsCisgICAgICAgICAgIDk3LCAgIDk4LCAgIDk5LCAgIDEwMCwgIDEwMSwgIDEwMiwgIDEwMywgIDEwNCwgIDEwNSwgIDEwNiwgIDEwNywgIDEwOCwgIDEwOSwgIDExMCwgIDExMSwKKyAgICAgICAgICAgMTEyLCAgMTEzLCAgMTE0LCAgMTE1LCAgMTE2LCAgMTE3LCAgMTE4LCAgMTE5LCAgMTIwLCAgMTIxLCAgMTIyLCAgMTIzLCAgMTI0LCAgMTI1LCAgMTI2LAorICAgICAgICAgICAxMjd9OworICAgICAgR0J5dGVBcnJheSAqZnVsbEFycmF5ID0gZ19ieXRlX2FycmF5X25ldygpOworICAgICAgZ19ieXRlX2FycmF5X2FwcGVuZChmdWxsQXJyYXksIChndWludDggKikoJmJpbl9kYXRhWzBdKSwgMjU2KTsKKyAgICAgIGlmICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfaWZfdGVzdF9iaW5hcnkgKHRlc3RfY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxBcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpIHsKKyAgICAgICAgR0J5dGVzICpyZXNwb25zZSA9IGdfYnl0ZV9hcnJheV9mcmVlX3RvX2J5dGVzKHJlc3VsdCk7ICAvLyBmcmVlcyByZXN1bHQKKyAgICAgICAgcmVzdWx0ID0gTlVMTDsKKyAgICAgICAgZ3NpemUgc2l6ID0gZ19ieXRlc19nZXRfc2l6ZShyZXNwb25zZSk7CisgICAgICAgIGdjb25zdHBvaW50ZXIgcHRyID0gZ19ieXRlc19nZXRfZGF0YShyZXNwb25zZSwgJnNpeik7CisgICAgICAgIGlmIChzaXogPT0gMjU2KSB7CisgICAgICAgICAgZ2Jvb2xlYW4gZmlyc3QgPSAxOworICAgICAgICAgIGdib29sZWFuIGZhaWxlZCA9IDA7CisgICAgICAgICAgaW50IGk7CisKKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyArK2kpIHsKKyAgICAgICAgICAgIGlmICghZmlyc3QpCisgICAgICAgICAgICAgIHByaW50ZigiLCIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBmaXJzdCA9IDA7CisgICAgICAgICAgICBpbnQgdmFsID0gKChzaWduZWQgY2hhciAqKXB0cilbaV07CisgICAgICAgICAgICBwcmludGYoIiVkIiwgdmFsKTsKKyAgICAgICAgICAgIGlmICghZmFpbGVkICYmIHZhbCAhPSBpIC0gMTI4KSB7CisgICAgICAgICAgICAgIGZhaWxlZCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIHByaW50ZigifSAiKTsKKyAgICAgICAgICBpZiAoZmFpbGVkKSB7CisgICAgICAgICAgICBwcmludGYoIkZBSUwgKGJhZCBjb250ZW50KSBzaXplICVsZCBPS1xuIiwgKGxvbmcpc2l6KTsKKyAgICAgICAgICAgICsrZmFpbF9jb3VudDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnRmKCJPSyBzaXplICVsZCBPS1xuIiwgKGxvbmcpc2l6KTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcHJpbnRmKCIgPSBiYWQgc2l6ZSAlbGRcbiIsIChsb25nKXNpeik7CisgICAgICAgICAgKytmYWlsX2NvdW50OworICAgICAgICB9CisgICAgICAgIGdfYnl0ZXNfdW5yZWYocmVzcG9uc2UpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmICgiJXNcbiIsIGVycm9yLT5tZXNzYWdlKTsKKyAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgIGVycm9yID0gTlVMTDsKKworICAgICAgICBmYWlsX2NvdW50Kys7CisgICAgICB9CisgICAgICBnX2J5dGVfYXJyYXlfdW5yZWYoZnVsbEFycmF5KTsKKyAgICAgIGZ1bGxBcnJheSA9IE5VTEw7CisKICAgICAgIC8qKgogICAgICAgICogU1RSVUNUIFRFU1QKICAgICAgICAqLwpAQCAtNDUxLDYgKzY5MSwxMSBAQAogICAgICAgICAgICAgaTMyX3RoaW5nICE9IC0zIHx8CiAgICAgICAgICAgICBpNjRfdGhpbmcgIT0gKGdpbnQ2NCktNSkKICAgICAgICAgICBmYWlsX2NvdW50Kys7CisKKyAgICAgICAgaWYgKHN0cmluZykgeworICAgICAgICAgIGdfZnJlZSAoc3RyaW5nKTsKKyAgICAgICAgICBzdHJpbmcgPSBOVUxMOworICAgICAgICB9CiAgICAgICB9CiAgICAgICBlbHNlIHsKICAgICAgICAgcHJpbnRmICgiJXNcbiIsIGVycm9yLT5tZXNzYWdlKTsKQEAgLTQ1OSw3ICs3MDQsOCBAQAogCiAgICAgICAgIGZhaWxfY291bnQrKzsKICAgICAgIH0KLSAgICAgIGdfb2JqZWN0X3VucmVmICh4dHJ1Y3RfaW4pOworICAgICAgLy8gZ19jbGVhcl9vYmplY3QoJnh0cnVjdF9vdXQpOyB1c2VkIGJlbG93CisgICAgICBnX2NsZWFyX29iamVjdCgmeHRydWN0X2luKTsKIAogICAgICAgLyoqCiAgICAgICAgKiBORVNURUQgU1RSVUNUIFRFU1QKQEAgLTUwMiw2ICs3NDgsMTEgQEAKICAgICAgICAgICAgIGlubmVyX2k2NF90aGluZyAhPSAoZ2ludDY0KS01IHx8CiAgICAgICAgICAgICBpMzJfdGhpbmcgIT0gNSkKICAgICAgICAgICBmYWlsX2NvdW50Kys7CisKKyAgICAgICAgaWYgKHN0cmluZykgeworICAgICAgICAgIGdfZnJlZShzdHJpbmcpOworICAgICAgICAgIHN0cmluZyA9IE5VTEw7CisgICAgICAgIH0KICAgICAgIH0KICAgICAgIGVsc2UgewogICAgICAgICBwcmludGYgKCIlc1xuIiwgZXJyb3ItPm1lc3NhZ2UpOwpAQCAtNTExLDEwICs3NjIsMTAgQEAKICAgICAgICAgZmFpbF9jb3VudCsrOwogICAgICAgfQogCi0gICAgICBnX29iamVjdF91bnJlZiAoeHRydWN0X2luKTsKLSAgICAgIGdfb2JqZWN0X3VucmVmICh4dHJ1Y3QyX2luKTsKLSAgICAgIGdfb2JqZWN0X3VucmVmICh4dHJ1Y3QyX291dCk7Ci0gICAgICBnX29iamVjdF91bnJlZiAoeHRydWN0X291dCk7CisgICAgICBnX2NsZWFyX29iamVjdCgmeHRydWN0X2luKTsKKyAgICAgIGdfY2xlYXJfb2JqZWN0KCZ4dHJ1Y3QyX2luKTsKKyAgICAgIGdfY2xlYXJfb2JqZWN0KCZ4dHJ1Y3QyX291dCk7CisgICAgICBnX2NsZWFyX29iamVjdCgmeHRydWN0X291dCk7CiAKICAgICAgIC8qKgogICAgICAgICogTUFQIFRFU1QKQEAgLTEwMjEsMTcgKzEyNzIsMjggQEAKICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAKICAgICAgIG51bWJlcnogPSBUX1RFU1RfTlVNQkVSWl9GSVZFOworICAgICAgbnVtYmVyejIgPSBUX1RFU1RfTlVNQkVSWl9FSUdIVDsKICAgICAgIHVzZXJfaWRfcHRyID0gZ19tYWxsb2MgKHNpemVvZiAqdXNlcl9pZF9wdHIpOwotICAgICAgKnVzZXJfaWRfcHRyID0gNTAwMDsKKyAgICAgICp1c2VyX2lkX3B0ciA9IDU7CisgICAgICB1c2VyX2lkX3B0cjIgPSBnX21hbGxvYyAoc2l6ZW9mICp1c2VyX2lkX3B0cik7CisgICAgICAqdXNlcl9pZF9wdHIyID0gODsKICAgICAgIGdfaGFzaF90YWJsZV9pbnNlcnQgKHVzZXJfbWFwLCAoZ3BvaW50ZXIpbnVtYmVyeiwgdXNlcl9pZF9wdHIpOworICAgICAgZ19oYXNoX3RhYmxlX2luc2VydCAodXNlcl9tYXAsIChncG9pbnRlciludW1iZXJ6MiwgdXNlcl9pZF9wdHIyKTsKICAgICAgIGdfaGFzaF90YWJsZV91bnJlZiAodXNlcl9tYXApOwogCiAgICAgICB4dHJ1Y3Rfb3V0ID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9YVFJVQ1QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyaW5nX3RoaW5nIiwgIlRydWNrIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJieXRlX3RoaW5nIiwgICA4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImkzMl90aGluZyIsICAgIDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaTY0X3RoaW5nIiwgICAgOExMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0cmluZ190aGluZyIsICJIZWxsbzIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ5dGVfdGhpbmciLCAgIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaTMyX3RoaW5nIiwgICAgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpNjRfdGhpbmciLCAgICAyTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgIHh0cnVjdF9vdXQyID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9YVFJVQ1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyaW5nX3RoaW5nIiwgIkdvb2RieWU0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJieXRlX3RoaW5nIiwgICA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImkzMl90aGluZyIsICAgIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaTY0X3RoaW5nIiwgICAgNExMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICBnX3B0cl9hcnJheV9hZGQgKHh0cnVjdHMsIHh0cnVjdF9vdXQyKTsKICAgICAgIGdfcHRyX2FycmF5X2FkZCAoeHRydWN0cywgeHRydWN0X291dCk7CiAgICAgICBnX3B0cl9hcnJheV91bnJlZiAoeHRydWN0cyk7CiAKQEAgLTEyNDYsNyArMTUwOCw3IEBACiAgICAgICB9CiAKICAgICAgIGdfaGFzaF90YWJsZV91bnJlZiAobWFwX2luKTsKLSAgICAgIGdfb2JqZWN0X3VucmVmIChpbnNhbml0eV9vdXQpOworICAgICAgZ19jbGVhcl9vYmplY3QgKCZpbnNhbml0eV9vdXQpOwogCiAgICAgICAvKiB0ZXN0IGV4Y2VwdGlvbiAqLwogICAgICAgcHJpbnRmICgidGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKFwiWGNlcHRpb25cIikgPT4iKTsKQEAgLTEyNjIsOCArMTUyNCw3IEBACiAgICAgICAgIHByaW50ZiAoIiAgeyV1LCBcIiVzXCJ9XG4iLCBpbnQzMiwgc3RyaW5nKTsKICAgICAgICAgZ19mcmVlIChzdHJpbmcpOwogCi0gICAgICAgIGdfb2JqZWN0X3VucmVmICh4Y2VwdGlvbik7Ci0gICAgICAgIHhjZXB0aW9uID0gTlVMTDsKKyAgICAgICAgZ19jbGVhcl9vYmplY3QgKCZ4Y2VwdGlvbik7CiAKICAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CiAgICAgICAgIGVycm9yID0gTlVMTDsKQEAgLTEyOTksMTAgKzE1NjAsNyBAQAogICAgICAgICBwcmludGYgKCIgIHZvaWRcbkZBSUxVUkVcbiIpOwogICAgICAgICBmYWlsX2NvdW50Kys7CiAKLSAgICAgICAgaWYgKHhjZXB0aW9uICE9IE5VTEwpIHsKLSAgICAgICAgICBnX29iamVjdF91bnJlZiAoeGNlcHRpb24pOwotICAgICAgICAgIHhjZXB0aW9uID0gTlVMTDsKLSAgICAgICAgfQorICAgICAgICBnX2NsZWFyX29iamVjdCAoJnhjZXB0aW9uKTsKIAogICAgICAgICBpZiAoZXJyb3IgIT0gTlVMTCkgewogICAgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOwpAQCAtMTMyMCwxMCArMTU3OCw3IEBACiAgICAgICAgIHByaW50ZiAoIiAgdm9pZFxuRkFJTFVSRVxuIik7CiAgICAgICAgIGZhaWxfY291bnQrKzsKIAotICAgICAgICBpZiAoeGNlcHRpb24gIT0gTlVMTCkgewotICAgICAgICAgIGdfb2JqZWN0X3VucmVmICh4Y2VwdGlvbik7Ci0gICAgICAgICAgeGNlcHRpb24gPSBOVUxMOwotICAgICAgICB9CisgICAgICAgIGdfY2xlYXJfb2JqZWN0ICgmeGNlcHRpb24pOwogCiAgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOwogICAgICAgICBlcnJvciA9IE5VTEw7CkBAIC0xMzYwLDE1ICsxNjE1LDggQEAKICAgICAgICAgcHJpbnRmICgiICByZXN1bHRcbkZBSUxVUkVcbiIpOwogICAgICAgICBmYWlsX2NvdW50Kys7CiAKLSAgICAgICAgaWYgKHhjZXB0aW9uICE9IE5VTEwpIHsKLSAgICAgICAgICBnX29iamVjdF91bnJlZiAoeGNlcHRpb24pOwotICAgICAgICAgIHhjZXB0aW9uID0gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh4Y2VwdGlvbjIgIT0gTlVMTCkgewotICAgICAgICAgIGdfb2JqZWN0X3VucmVmICh4Y2VwdGlvbjIpOwotICAgICAgICAgIHhjZXB0aW9uID0gTlVMTDsKLSAgICAgICAgfQorICAgICAgICBnX2NsZWFyX29iamVjdCAoJnhjZXB0aW9uKTsKKyAgICAgICAgZ19jbGVhcl9vYmplY3QgKCZ4Y2VwdGlvbjIpOwogCiAgICAgICAgIGlmIChlcnJvciAhPSBOVUxMKSB7CiAgICAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CkBAIC0xMzk4LDExICsxNjQ2LDggQEAKICAgICAgICAgcHJpbnRmICgiICB7JXUsIHtcIiVzXCJ9fVxuIiwgaW50MzIsIHN0cmluZyk7CiAgICAgICAgIGdfZnJlZSAoc3RyaW5nKTsKIAotICAgICAgICBnX29iamVjdF91bnJlZiAoaW5uZXJfeHRydWN0X2luKTsKLSAgICAgICAgaW5uZXJfeHRydWN0X2luID0gTlVMTDsKLQotICAgICAgICBnX29iamVjdF91bnJlZiAoeGNlcHRpb24yKTsKLSAgICAgICAgeGNlcHRpb24yID0gTlVMTDsKKyAgICAgICAgZ19jbGVhcl9vYmplY3QgKCZpbm5lcl94dHJ1Y3RfaW4pOworICAgICAgICBnX2NsZWFyX29iamVjdCAoJnhjZXB0aW9uMik7CiAKICAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CiAgICAgICAgIGVycm9yID0gTlVMTDsKQEAgLTE0MTEsMjIgKzE2NTYsMTUgQEAKICAgICAgICAgcHJpbnRmICgiICByZXN1bHRcbkZBSUxVUkVcbiIpOwogICAgICAgICBmYWlsX2NvdW50Kys7CiAKLSAgICAgICAgaWYgKHhjZXB0aW9uICE9IE5VTEwpIHsKLSAgICAgICAgICBnX29iamVjdF91bnJlZiAoeGNlcHRpb24pOwotICAgICAgICAgIHhjZXB0aW9uID0gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh4Y2VwdGlvbjIgIT0gTlVMTCkgewotICAgICAgICAgIGdfb2JqZWN0X3VucmVmICh4Y2VwdGlvbjIpOwotICAgICAgICAgIHhjZXB0aW9uID0gTlVMTDsKLSAgICAgICAgfQorICAgICAgICBnX2NsZWFyX29iamVjdCAoJnhjZXB0aW9uKTsKKyAgICAgICAgZ19jbGVhcl9vYmplY3QgKCZ4Y2VwdGlvbjIpOwogCiAgICAgICAgIGlmIChlcnJvciAhPSBOVUxMKSB7CiAgICAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CiAgICAgICAgICAgZXJyb3IgPSBOVUxMOwogICAgICAgICB9CiAgICAgICB9Ci0gICAgICBnX29iamVjdF91bnJlZiAoeHRydWN0X2luKTsKKyAgICAgIGdfY2xlYXJfb2JqZWN0ICgmeHRydWN0X2luKTsKIAogICAgICAgcHJpbnRmICgidGVzdENsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oXCJzdWNjZXNzXCIsIFwidGVzdCAzXCIpID0+Iik7CiAgICAgICB4dHJ1Y3RfaW4gPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1hUUlVDVCwgTlVMTCk7CkBAIC0xNDQ5LDIyICsxNjg3LDE1IEBACiAgICAgICAgIHByaW50ZiAoIiAgcmVzdWx0XG5GQUlMVVJFXG4iKTsKICAgICAgICAgZmFpbF9jb3VudCsrOwogCi0gICAgICAgIGlmICh4Y2VwdGlvbiAhPSBOVUxMKSB7Ci0gICAgICAgICAgZ19vYmplY3RfdW5yZWYgKHhjZXB0aW9uKTsKLSAgICAgICAgICB4Y2VwdGlvbiA9IE5VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoeGNlcHRpb24yICE9IE5VTEwpIHsKLSAgICAgICAgICBnX29iamVjdF91bnJlZiAoeGNlcHRpb24yKTsKLSAgICAgICAgICB4Y2VwdGlvbiA9IE5VTEw7Ci0gICAgICAgIH0KKyAgICAgICAgZ19jbGVhcl9vYmplY3QgKCZ4Y2VwdGlvbik7CisgICAgICAgIGdfY2xlYXJfb2JqZWN0ICgmeGNlcHRpb24yKTsKIAogICAgICAgICBpZiAoZXJyb3IgIT0gTlVMTCkgewogICAgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOwogICAgICAgICAgIGVycm9yID0gTlVMTDsKICAgICAgICAgfQogICAgICAgfQotICAgICAgZ19vYmplY3RfdW5yZWYgKHh0cnVjdF9pbik7CisgICAgICBnX2NsZWFyX29iamVjdCAoJnh0cnVjdF9pbik7CiAKICAgICAgIC8qIHRlc3Qgb25ld2F5IHZvaWQgKi8KICAgICAgIHByaW50ZiAoInRlc3RDbGllbnQudGVzdE9uZXdheSgxKSA9PiIpOwpAQCAtMTU1MCw2ICsxNzgxLDcgQEAKIAogICAvKiBBbGwgZG9uZS0tLW91dHB1dCBzdGF0aXN0aWNzICovCiAgIHB1dHMgKCJcbkFsbCB0ZXN0cyBkb25lLiIpOworICBwcmludGYoIk51bWJlciBvZiBmYWlsdXJlczogJWRcbiIsIGZhaWxfY291bnQpOwogCiAgIHRpbWVfYXZnX3VzZWMgPSB0aW1lX3RvdGFsX3VzZWMgLyBudW1fdGVzdHM7CiAKQEAgLTE1NTcsMTAgKzE3ODksMTYgQEAKICAgcHJpbnRmICgiTWF4IHRpbWU6ICUiIFBSSXU2NCAiIHVzXG4iLCB0aW1lX21heF91c2VjKTsKICAgcHJpbnRmICgiQXZnIHRpbWU6ICUiIFBSSXU2NCAiIHVzXG4iLCB0aW1lX2F2Z191c2VjKTsKIAotICBnX29iamVjdF91bnJlZiAodGVzdF9jbGllbnQpOwotICBnX29iamVjdF91bnJlZiAocHJvdG9jb2wpOwotICBnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKLSAgZ19mcmVlIChob3N0KTsKKyAgZ19jbGVhcl9vYmplY3QoJnNlY29uZF9zZXJ2aWNlKTsKKyAgZ19jbGVhcl9vYmplY3QoJnByb3RvY29sMik7CisgIGdfY2xlYXJfb2JqZWN0KCZ0ZXN0X2NsaWVudCk7CisgIGdfY2xlYXJfb2JqZWN0KCZwcm90b2NvbCk7CisgIGdfY2xlYXJfb2JqZWN0KCZ0cmFuc3BvcnQpOworICBnX2NsZWFyX29iamVjdCgmc29ja2V0KTsKKworICBpZiAoc3NsKSB7CisgICAgdGhyaWZ0X3NzbF9zb2NrZXRfZmluYWxpemVfb3BlbnNzbCgpOworICB9CiAKICAgcmV0dXJuIGZhaWxfY291bnQ7CiB9CmRpZmYgLS1naXQgYS90ZXN0L2NfZ2xpYi9zcmMvdGVzdF9zZXJ2ZXIuYyBiL3Rlc3QvY19nbGliL3NyYy90ZXN0X3NlcnZlci5jCmluZGV4IDEzZWVjMjcuLjJkNzE2ZWMgMTAwNjQ0Ci0tLSBhL3Rlc3QvY19nbGliL3NyYy90ZXN0X3NlcnZlci5jCisrKyBiL3Rlc3QvY19nbGliL3NyYy90ZXN0X3NlcnZlci5jCkBAIC0yMyw3ICsyMyw5IEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKICNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeS5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeS5oPgogI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvc2VydmVyL3RocmlmdF9zZXJ2ZXIuaD4KICNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3NlcnZlci90aHJpZnRfc2ltcGxlX3NlcnZlci5oPgogI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuaD4KQEAgLTM2LDggKzM4LDEwIEBACiAjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5Lmg+CiAKICNpbmNsdWRlICIuLi9nZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdC5oIgorI2luY2x1ZGUgIi4uL2dlbi1jX2dsaWIvdF90ZXN0X3NlY29uZF9zZXJ2aWNlLmgiCiAKICNpbmNsdWRlICJ0aHJpZnRfdGVzdF9oYW5kbGVyLmgiCisjaW5jbHVkZSAidGhyaWZ0X3NlY29uZF9zZXJ2aWNlX2hhbmRsZXIuaCIKIAogLyogT3VyIHNlcnZlciBvYmplY3QsIGRlY2xhcmVkIGdsb2JhbGx5IHNvIGl0IGlzIGFjY2Vzc2libGUgd2l0aGluIHRoZSBTSUdJTlQKICAgIHNpZ25hbCBoYW5kbGVyICovCkBAIC02OCw2ICs3Miw4IEBACiAgIHN0YXRpYyBnY2hhciAqc2VydmVyX3R5cGVfb3B0aW9uID0gTlVMTDsKICAgc3RhdGljIGdjaGFyICp0cmFuc3BvcnRfb3B0aW9uID0gTlVMTDsKICAgc3RhdGljIGdjaGFyICpwcm90b2NvbF9vcHRpb24gPSBOVUxMOworICBzdGF0aWMgZ2ludCAgIHN0cmluZ19saW1pdCA9IDA7CisgIHN0YXRpYyBnaW50ICAgY29udGFpbmVyX2xpbWl0ID0gMDsKIAogICBzdGF0aWMKICAgICBHT3B0aW9uRW50cnkgb3B0aW9uX2VudHJpZXNbXSA9IHsKQEAgLTc4LDcgKzg0LDExIEBACiAgICAgeyAidHJhbnNwb3J0IiwgICAgICAgMCwgMCwgR19PUFRJT05fQVJHX1NUUklORywgICAmdHJhbnNwb3J0X29wdGlvbiwKICAgICAgICJUcmFuc3BvcnQ6IGJ1ZmZlcmVkLCBmcmFtZWQgKD1idWZmZXJlZCkiLCBOVUxMIH0sCiAgICAgeyAicHJvdG9jb2wiLCAgICAgICAgMCwgMCwgR19PUFRJT05fQVJHX1NUUklORywgICAmcHJvdG9jb2xfb3B0aW9uLAotICAgICAgIlByb3RvY29sOiBiaW5hcnkgKD1iaW5hcnkpIiwgTlVMTCB9LAorICAgICAgIlByb3RvY29sOiBiaW5hcnksIGNvbXBhY3QgKD1iaW5hcnkpIiwgTlVMTCB9LAorICAgIHsgInN0cmluZy1saW1pdCIsICAgIDAsIDAsIEdfT1BUSU9OX0FSR19JTlQsICAgICAgJnN0cmluZ19saW1pdCwKKyAgICAgICJNYXggc3RyaW5nIGxlbmd0aCAoPW5vbmUpIiwgTlVMTCB9LAorICAgIHsgImNvbnRhaW5lci1saW1pdCIsIDAsIDAsIEdfT1BUSU9OX0FSR19JTlQsICAgICAgJmNvbnRhaW5lcl9saW1pdCwKKyAgICAgICJNYXggY29udGFpbmVyIGxlbmd0aCAoPW5vbmUpIiwgTlVMTCB9LAogICAgIHsgTlVMTCB9CiAgIH07CiAKQEAgLTg5LDcgKzk5LDEwIEBACiAgIEdUeXBlICBwcm90b2NvbF9mYWN0b3J5X3R5cGUgID0gVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MX0ZBQ1RPUlk7CiAKICAgVFRlc3RUaHJpZnRUZXN0SGFuZGxlciAqaGFuZGxlcjsKKyAgVFRlc3RUaHJpZnRUZXN0SGFuZGxlciAqaGFuZGxlcl9zZWNvbmRfc2VydmljZSA9IE5VTEw7CiAgIFRocmlmdFByb2Nlc3NvciAgICAgICAgKnByb2Nlc3NvcjsKKyAgVGhyaWZ0UHJvY2Vzc29yICAgICAgICAqcHJvY2Vzc29yX3Rlc3QgPSBOVUxMOworICBUaHJpZnRQcm9jZXNzb3IgICAgICAgICpwcm9jZXNzb3Jfc2Vjb25kX3NlcnZpY2UgPSBOVUxMOwogICBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgICpzZXJ2ZXJfdHJhbnNwb3J0OwogICBUaHJpZnRUcmFuc3BvcnRGYWN0b3J5ICp0cmFuc3BvcnRfZmFjdG9yeTsKICAgVGhyaWZ0UHJvdG9jb2xGYWN0b3J5ICAqcHJvdG9jb2xfZmFjdG9yeTsKQEAgLTEyNiwxMCArMTM5LDIyIEBACiAgICAgb3B0aW9uc192YWxpZCA9IEZBTFNFOwogICB9CiAKLSAgaWYgKHByb3RvY29sX29wdGlvbiAhPSBOVUxMICYmCi0gICAgICBzdHJuY21wIChwcm90b2NvbF9vcHRpb24sICJiaW5hcnkiLCA3KSAhPSAwKSB7Ci0gICAgZnByaW50ZiAoc3RkZXJyLCAiVW5rbm93biBwcm90b2NvbCB0eXBlICVzXG4iLCBwcm90b2NvbF9vcHRpb24pOwotICAgIG9wdGlvbnNfdmFsaWQgPSBGQUxTRTsKKyAgaWYgKHByb3RvY29sX29wdGlvbiAhPSBOVUxMKSB7CisgICAgaWYgKHN0cm5jbXAgKHByb3RvY29sX29wdGlvbiwgImNvbXBhY3QiLCA4KSA9PSAwKSB7CisgICAgICBwcm90b2NvbF9mYWN0b3J5X3R5cGUgPSBUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUlk7CisgICAgICBwcm90b2NvbF9uYW1lID0gImNvbXBhY3QiOworICAgIH0KKyAgICBlbHNlIGlmIChzdHJuY21wIChwcm90b2NvbF9vcHRpb24sICJtdWx0aSIsIDYpID09IDApIHsKKwlwcm90b2NvbF9uYW1lID0gImJpbmFyeTptdWx0aSI7CisgICAgfQorICAgIGVsc2UgaWYgKHN0cm5jbXAgKHByb3RvY29sX29wdGlvbiwgIm11bHRpYyIsIDcpID09IDApIHsKKwlwcm90b2NvbF9mYWN0b3J5X3R5cGUgPSBUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUlk7CisJcHJvdG9jb2xfbmFtZSA9ICJjb21wYWN0Om11bHRpYyI7CisgICAgfQorICAgIGVsc2UgaWYgKHN0cm5jbXAgKHByb3RvY29sX29wdGlvbiwgImJpbmFyeSIsIDcpICE9IDApIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIlVua25vd24gcHJvdG9jb2wgdHlwZSAlc1xuIiwgcHJvdG9jb2xfb3B0aW9uKTsKKyAgICAgIG9wdGlvbnNfdmFsaWQgPSBGQUxTRTsKKyAgICB9CiAgIH0KIAogICBpZiAodHJhbnNwb3J0X29wdGlvbiAhPSBOVUxMKSB7CkBAIC0xNDksMTYgKzE3NCw2NSBAQAogICAvKiBFc3RhYmxpc2ggYWxsIG91ciBjb25uZWN0aW9uIG9iamVjdHMgKi8KICAgaGFuZGxlciAgICAgICAgICAgPSBnX29iamVjdF9uZXcgKFRZUEVfVEhSSUZUX1RFU1RfSEFORExFUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICBwcm9jZXNzb3IgICAgICAgICA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfVEhSSUZUX1RFU1RfUFJPQ0VTU09SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhhbmRsZXIiLCBoYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKworCisgIGlmKHN0cnN0cihwcm90b2NvbF9uYW1lLCAiOm11bHRpIikpeworICAgICAgLyogV2hlbiBhIG11bHRpcGxleGVkIHByb2Nlc3NvciBpcyBpbnZvbHZlZCB0aGUgaGFuZGxlciBpcyBub3QKKyAgICAgICAgIHJlZ2lzdGVyZWQgYXMgdXN1YWwuIFdlIGNyZWF0ZSB0aGUgcHJvY2Vzc29yIGFuZCB0aGUgcmVhbAorICAgICAgICAgcHJvY2Vzc29yIGlzIHJlZ2lzdGVyZWQuIE11bHRpcGxlIHByb2Nlc3NvcnMgY2FuIGJlIHJlZ2lzdGVyZWQKKyAgICAgICAgIGF0IG9uY2UuIFRoaXMgaXMgd2h5IHdlIGRvbid0IGhhdmUgYSBjb25zdHJ1Y3RvciBwcm9wZXJ0eSAqLworICAgICAgcHJvY2Vzc29yID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9DRVNTT1IsCisJCQkJCSBOVUxMKTsKKworICAgICAgaGFuZGxlcl9zZWNvbmRfc2VydmljZSA9IGdfb2JqZWN0X25ldyAoVFlQRV9TRUNPTkRfU0VSVklDRV9IQU5ETEVSLAorICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgICAgIHByb2Nlc3Nvcl90ZXN0ID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9USFJJRlRfVEVTVF9QUk9DRVNTT1IsCisJCQkJICAgICJoYW5kbGVyIiwgaGFuZGxlciwKKwkJCQkgICAgTlVMTCk7CisgICAgICBwcm9jZXNzb3Jfc2Vjb25kX3NlcnZpY2UgPSAgIGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfU0VDT05EX1NFUlZJQ0VfUFJPQ0VTU09SLAorCQkJCSAgICAiaGFuZGxlciIsIGhhbmRsZXJfc2Vjb25kX3NlcnZpY2UsCisJCQkJICAgIE5VTEwpOworCisgICAgICAvKiBXZSByZWdpc3RlciBhIHRlc3QgcHJvY2Vzc29yIHdpdGggTXVsdGlwbGV4ZWQgbmFtZSBUaHJpZnRUZXN0ICovCisgICAgICBpZighdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9yZWdpc3Rlcl9wcm9jZXNzb3IocHJvY2Vzc29yLAorCQkJCQkJICAgICAgIlRocmlmdFRlc3QiLCBwcm9jZXNzb3JfdGVzdCwKKwkJCQkJCSAgICAgICZlcnJvcikpeworCSAgICBnX21lc3NhZ2UgKCJ0aHJpZnRfc2VydmVyX3NlcnZlOiAlcyIsCisJICAgICAgICAgICAgICAgZXJyb3IgIT0gTlVMTCA/IGVycm9yLT5tZXNzYWdlIDogIihudWxsKSIpOworCSAgICBnX2NsZWFyX2Vycm9yICgmZXJyb3IpOworICAgICAgfQorICAgICAgLyogV2UgcmVnaXN0ZXIgYSBzZWNvbmQgdGVzdCBwcm9jZXNzb3Igd2l0aCBNdWx0aXBsZXhlZCBuYW1lIFNlY29uZFNlcnZpY2UKKyAgICAgICAqIHdlIGFyZSByZXNwb25zaWJsZSBvZiBmcmVlaW5nIHRoZSBwcm9jZXNzb3Igd2hlbiBpdCdzIG5vdCB1c2VkIGFueW1vcmUgKi8KKyAgICAgIGlmKCF0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX3JlZ2lzdGVyX3Byb2Nlc3Nvcihwcm9jZXNzb3IsCisJCQkJCQkgICAgICAiU2Vjb25kU2VydmljZSIsIHByb2Nlc3Nvcl9zZWNvbmRfc2VydmljZSwKKwkJCQkJCSAgICAgICZlcnJvcikpeworCSAgICBnX21lc3NhZ2UgKCJ0aHJpZnRfc2VydmVyX3NlcnZlOiAlcyIsCisJICAgICAgICAgICAgICAgZXJyb3IgIT0gTlVMTCA/IGVycm9yLT5tZXNzYWdlIDogIihudWxsKSIpOworCSAgICBnX2NsZWFyX2Vycm9yICgmZXJyb3IpOworICAgICAgfQorCisgIH1lbHNleworICAgICAgcHJvY2Vzc29yID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9USFJJRlRfVEVTVF9QUk9DRVNTT1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhhbmRsZXIiLCBoYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICB9CiAgIHNlcnZlcl90cmFuc3BvcnQgID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCBwb3J0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgIHRyYW5zcG9ydF9mYWN0b3J5ID0gZ19vYmplY3RfbmV3ICh0cmFuc3BvcnRfZmFjdG9yeV90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gIHByb3RvY29sX2ZhY3RvcnkgID0gZ19vYmplY3RfbmV3IChwcm90b2NvbF9mYWN0b3J5X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICBpZiAoc3Ryc3RyIChwcm90b2NvbF9uYW1lLCAiY29tcGFjdCIpICE9IE5VTEwpIHsKKyAgICBwcm90b2NvbF9mYWN0b3J5ICA9IGdfb2JqZWN0X25ldyAocHJvdG9jb2xfZmFjdG9yeV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyaW5nX2xpbWl0Iiwgc3RyaW5nX2xpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udGFpbmVyX2xpbWl0IiwgY29udGFpbmVyX2xpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgfSBlbHNlIHsKKyAgICBwcm90b2NvbF9mYWN0b3J5ICA9IGdfb2JqZWN0X25ldyAocHJvdG9jb2xfZmFjdG9yeV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgfQogCiAgIHNlcnZlciA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0lNUExFX1NFUlZFUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvY2Vzc29yIiwgICAgICAgICAgICAgICAgcHJvY2Vzc29yLApAQCAtMjAyLDYgKzI3NiwxNSBAQAogICBnX29iamVjdF91bnJlZiAoc2VydmVyX3RyYW5zcG9ydCk7CiAgIGdfb2JqZWN0X3VucmVmIChwcm9jZXNzb3IpOwogICBnX29iamVjdF91bnJlZiAoaGFuZGxlcik7CisgIGlmKGhhbmRsZXJfc2Vjb25kX3NlcnZpY2UpeworICAgICAgZ19vYmplY3RfdW5yZWYgKGhhbmRsZXJfc2Vjb25kX3NlcnZpY2UpOworICB9CisgIGlmKHByb2Nlc3Nvcl90ZXN0KXsKKyAgICAgIGdfb2JqZWN0X3VucmVmIChwcm9jZXNzb3JfdGVzdCk7CisgIH0KKyAgaWYocHJvY2Vzc29yX3NlY29uZF9zZXJ2aWNlKXsKKyAgICAgIGdfb2JqZWN0X3VucmVmIChwcm9jZXNzb3Jfc2Vjb25kX3NlcnZpY2UpOworICB9CiAKICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS90ZXN0L2NfZ2xpYi9zcmMvdGhyaWZ0X3NlY29uZF9zZXJ2aWNlX2hhbmRsZXIuYyBiL3Rlc3QvY19nbGliL3NyYy90aHJpZnRfc2Vjb25kX3NlcnZpY2VfaGFuZGxlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2YWM3YmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NfZ2xpYi9zcmMvdGhyaWZ0X3NlY29uZF9zZXJ2aWNlX2hhbmRsZXIuYwpAQCAtMCwwICsxLDY5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24uaD4KKworI2luY2x1ZGUgInRocmlmdF9zZWNvbmRfc2VydmljZV9oYW5kbGVyLmgiCisKKy8qIEEgaGFuZGxlciB0aGF0IGltcGxlbWVudHMgdGhlIFRUZXN0U2Vjb25kU2VydmljZUlmIGludGVyZmFjZSAqLworCitHX0RFRklORV9UWVBFIChTZWNvbmRTZXJ2aWNlSGFuZGxlciwKKyAgICAgICAgICAgICAgIHNlY29uZF9zZXJ2aWNlX2hhbmRsZXIsCisJICAgICAgIFRfVEVTVF9UWVBFX1NFQ09ORF9TRVJWSUNFX0hBTkRMRVIpOworCisKK2dib29sZWFuCitzZWNvbmRfc2VydmljZV9oYW5kbGVyX3NlY29uZHRlc3Rfc3RyaW5nIChUVGVzdFNlY29uZFNlcnZpY2VJZiAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgICAgICAgICAgICAgKipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgICAgICAgICp0aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChpZmFjZSk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIGdjaGFyIGJ1ZmZlclsyNTZdOworCisgIHByaW50ZiAoInRlc3RTZWNvbmRTZXJ2aWNlTXVsdGlwbGV4U2Vjb25kVGVzdFN0cmluZyhcIiVzXCIpXG4iLCB0aGluZyk7CisgIHNucHJpbnRmKGJ1ZmZlciwgMjU1LCAidGVzdFN0cmluZyhcIiVzXCIpIiwgdGhpbmcpOworICAqX3JldHVybiA9IGdfc3RyZHVwIChidWZmZXIpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorc2Vjb25kX3NlcnZpY2VfaGFuZGxlcl9pbml0IChTZWNvbmRTZXJ2aWNlSGFuZGxlciAqc2VsZikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHNlbGYpOworfQorCitzdGF0aWMgdm9pZAorc2Vjb25kX3NlcnZpY2VfaGFuZGxlcl9jbGFzc19pbml0IChTZWNvbmRTZXJ2aWNlSGFuZGxlckNsYXNzICprbGFzcykKK3sKKyAgVFRlc3RTZWNvbmRTZXJ2aWNlSGFuZGxlckNsYXNzICpiYXNlX2NsYXNzID0KKyAgICAgIFRfVEVTVF9TRUNPTkRfU0VSVklDRV9IQU5ETEVSX0NMQVNTIChrbGFzcyk7CisKKworICBiYXNlX2NsYXNzLT5zZWNvbmR0ZXN0X3N0cmluZyA9CisgICAgICBzZWNvbmRfc2VydmljZV9oYW5kbGVyX3NlY29uZHRlc3Rfc3RyaW5nOworCit9CmRpZmYgLS1naXQgYS90ZXN0L2NfZ2xpYi9zcmMvdGhyaWZ0X3NlY29uZF9zZXJ2aWNlX2hhbmRsZXIuaCBiL3Rlc3QvY19nbGliL3NyYy90aHJpZnRfc2Vjb25kX3NlcnZpY2VfaGFuZGxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZTA0OGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NfZ2xpYi9zcmMvdGhyaWZ0X3NlY29uZF9zZXJ2aWNlX2hhbmRsZXIuaApAQCAtMCwwICsxLDczIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1NFQ09ORF9TRVJWSUNFX0hBTkRMRVJfSAorI2RlZmluZSBfU0VDT05EX1NFUlZJQ0VfSEFORExFUl9ICisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICIuLi9nZW4tY19nbGliL3RfdGVzdF9zZWNvbmRfc2VydmljZS5oIgorCitHX0JFR0lOX0RFQ0xTCisKKy8qIEEgaGFuZGxlciB0aGF0IGltcGxlbWVudHMgdGhlIFRUZXN0U2Vjb25kU2VydmljZUlmIGludGVyZmFjZSAqLworCisjZGVmaW5lIFRZUEVfU0VDT05EX1NFUlZJQ0VfSEFORExFUiAoc2Vjb25kX3NlcnZpY2VfaGFuZGxlcl9nZXRfdHlwZSAoKSkKKworI2RlZmluZSBTRUNPTkRfU0VSVklDRV9IQU5ETEVSKG9iaikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRV9TRUNPTkRfU0VSVklDRV9IQU5ETEVSLCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlY29uZFNlcnZpY2VIYW5kbGVyKSkKKyNkZWZpbmUgSVNfU0VDT05EX1NFUlZJQ0VfSEFORExFUihvYmopICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEVfU0VDT05EX1NFUlZJQ0VfSEFORExFUikpCisjZGVmaW5lIFNFQ09ORF9TRVJWSUNFX0hBTkRMRVJfQ0xBU1MoYykgICAgICAgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEVfU0VDT05EX1NFUlZJQ0VfSEFORExFUiwgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2Vjb25kU2VydmljZUhhbmRsZXJDbGFzcykpCisjZGVmaW5lIElTX1NFQ09ORF9TRVJWSUNFX0hBTkRMRVJfQ0xBU1MoYykgICAgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEVfU0VDT05EX1NFUlZJQ0VfSEFORExFUikpCisjZGVmaW5lIFNFQ09ORF9TRVJWSUNFX0hBTkRMRVJfR0VUX0NMQVNTKG9iaikgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRV9TRUNPTkRfU0VSVklDRV9IQU5ETEVSLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWNvbmRTZXJ2aWNlSGFuZGxlckNsYXNzKSkKKwordHlwZWRlZiBzdHJ1Y3QgX1NlY29uZFNlcnZpY2VIYW5kbGVyIFNlY29uZFNlcnZpY2VIYW5kbGVyOwordHlwZWRlZiBzdHJ1Y3QgX1NlY29uZFNlcnZpY2VIYW5kbGVyQ2xhc3MgU2Vjb25kU2VydmljZUhhbmRsZXJDbGFzczsKKworc3RydWN0IF9TZWNvbmRTZXJ2aWNlSGFuZGxlciB7CisgIFRUZXN0U2Vjb25kU2VydmljZUhhbmRsZXIgcGFyZW50OworfTsKKworc3RydWN0IF9TZWNvbmRTZXJ2aWNlSGFuZGxlckNsYXNzIHsKKyAgVFRlc3RTZWNvbmRTZXJ2aWNlSGFuZGxlckNsYXNzIHBhcmVudDsKKworfTsKKworLyogVXNlZCBieSBTRUNPTkRfU0VSVklDRV9IQU5ETEVSX0dFVF9UWVBFICovCitHVHlwZSBzZWNvbmRfc2VydmljZV9oYW5kbGVyX2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gc2Vjb25kX3NlcnZpY2VfaGFuZGxlcl9ibGFoX2JsYWggKFRUZXN0U2Vjb25kU2VydmljZUlmICppZmFjZSwgR0Vycm9yICoqZXJyb3IpOworZ2Jvb2xlYW4gc2Vjb25kX3NlcnZpY2VfaGFuZGxlcl9zZWNvbmR0ZXN0X3N0cmluZyAgICAgICAgICAoVFRlc3RTZWNvbmRTZXJ2aWNlSWYgKmlmYWNlLCBnY2hhciAqKiBfcmV0dXJuLCBjb25zdCBnY2hhciAqIHRoaW5nLCBHRXJyb3IgKiplcnJvcik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfU0VDT05EX1NFUlZJQ0VfSEFORExFUl9IICovCmRpZmYgLS1naXQgYS90ZXN0L2NfZ2xpYi9zcmMvdGhyaWZ0X3Rlc3RfaGFuZGxlci5jIGIvdGVzdC9jX2dsaWIvc3JjL3RocmlmdF90ZXN0X2hhbmRsZXIuYwppbmRleCBkODJiZWZiLi4xZDhiY2IyIDEwMDY0NAotLS0gYS90ZXN0L2NfZ2xpYi9zcmMvdGhyaWZ0X3Rlc3RfaGFuZGxlci5jCisrKyBiL3Rlc3QvY19nbGliL3NyYy90aHJpZnRfdGVzdF9oYW5kbGVyLmMKQEAgLTY4LDcgKzY4LDcgQEAKICAgVEhSSUZUX1VOVVNFRF9WQVIgKGlmYWNlKTsKICAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKIAotICBwcmludGYgKCJ0ZXN0Qnl0ZSglcylcbiIsIHRoaW5nID8gInRydWUiIDogImZhbHNlIik7CisgIHByaW50ZiAoInRlc3RCb29sKCVzKVxuIiwgdGhpbmcgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKICAgKl9yZXR1cm4gPSB0aGluZzsKIAogICByZXR1cm4gVFJVRTsKQEAgLTE0NCw3ICsxNDQsOCBAQAogICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOwogCiAgIHByaW50ZiAoInRlc3RCaW5hcnkoKVxuIik7ICAvLyBUT0RPOiBoZXggb3V0cHV0Ci0gIGdfYnl0ZV9hcnJheV9hcHBlbmQoICpfcmV0dXJuLCB0aGluZy0+ZGF0YSwgdGhpbmctPmxlbik7CisgIGdfYnl0ZV9hcnJheV9yZWYoKEdCeXRlQXJyYXkgKil0aGluZyk7CisgICpfcmV0dXJuID0gKEdCeXRlQXJyYXkgKil0aGluZzsKIAogICByZXR1cm4gVFJVRTsKIH0KQEAgLTQ3Miw4ICs0NzMsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVGVzdEluc2FuaXR5ICAqYXJndW1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICAgKiplcnJvcikKIHsKLSAgVFRlc3RYdHJ1Y3QgKmhlbGxvOwotICBUVGVzdFh0cnVjdCAqZ29vZGJ5ZTsKICAgVFRlc3RYdHJ1Y3QgKnh0cnVjdF9pbjsKIAogICBnY2hhciAqc3RyaW5nX3RoaW5nID0gTlVMTDsKQEAgLTQ4Myw3ICs0ODIsNiBAQAogCiAgIEdQdHJBcnJheSAqeHRydWN0czsKIAotICBUVGVzdEluc2FuaXR5ICpjcmF6eTsKICAgVFRlc3RJbnNhbml0eSAqbG9vbmV5OwogCiAgIEdIYXNoVGFibGUgKnVzZXJfbWFwOwpAQCAtNTAyLDUwICs1MDAsMTAgQEAKICAgZ3VpbnQgaTsKIAogICBUSFJJRlRfVU5VU0VEX1ZBUiAoaWZhY2UpOwotICBUSFJJRlRfVU5VU0VEX1ZBUiAoYXJndW1lbnQpOwogICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOwogCiAgIHByaW50ZiAoInRlc3RJbnNhbml0eSgpXG4iKTsKIAotICBoZWxsbyA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfWFRSVUNULAotICAgICAgICAgICAgICAgICAgICAgICAgInN0cmluZ190aGluZyIsICJIZWxsbzIiLAotICAgICAgICAgICAgICAgICAgICAgICAgImJ5dGVfdGhpbmciLCAgIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiaTMyX3RoaW5nIiwgICAgMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJpNjRfdGhpbmciLCAgICAyLAotICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0KLSAgZ29vZGJ5ZSA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfWFRSVUNULAotICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyaW5nX3RoaW5nIiwgIkdvb2RieWU0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgImJ5dGVfdGhpbmciLCAgIDQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJpMzJfdGhpbmciLCAgICA0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAiaTY0X3RoaW5nIiwgICAgNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0KLSAgY3JhenkgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX0lOU0FOSVRZLCBOVUxMKTsKLSAgZ19vYmplY3RfZ2V0IChjcmF6eSwKLSAgICAgICAgICAgICAgICAidXNlck1hcCIsICZ1c2VyX21hcCwKLSAgICAgICAgICAgICAgICAieHRydWN0cyIsICZ4dHJ1Y3RzLAotICAgICAgICAgICAgICAgIE5VTEwpOwotCi0gIHVzZXJfaWQgPSBnX21hbGxvYyhzaXplb2YgKnVzZXJfaWQpOwotICAqdXNlcl9pZCA9IDg7Ci0gIGdfaGFzaF90YWJsZV9pbnNlcnQgKHVzZXJfbWFwLAotICAgICAgICAgICAgICAgICAgICAgICBHSU5UX1RPX1BPSU5URVIgKFRfVEVTVF9OVU1CRVJaX0VJR0hUKSwKLSAgICAgICAgICAgICAgICAgICAgICAgdXNlcl9pZCk7Ci0KLSAgZ19wdHJfYXJyYXlfYWRkICh4dHJ1Y3RzLCBnb29kYnllKTsKLQotICB1c2VyX2lkID0gZ19tYWxsb2Moc2l6ZW9mICp1c2VyX2lkKTsKLSAgKnVzZXJfaWQgPSA1OwotICBnX2hhc2hfdGFibGVfaW5zZXJ0ICh1c2VyX21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgR0lOVF9UT19QT0lOVEVSIChUX1RFU1RfTlVNQkVSWl9GSVZFKSwKLSAgICAgICAgICAgICAgICAgICAgICAgdXNlcl9pZCk7Ci0KLSAgZ19wdHJfYXJyYXlfYWRkICh4dHJ1Y3RzLCBoZWxsbyk7Ci0KLSAgZ19oYXNoX3RhYmxlX3VucmVmICh1c2VyX21hcCk7Ci0gIGdfcHRyX2FycmF5X3VucmVmICh4dHJ1Y3RzKTsKLQogICBmaXJzdF9tYXAgPSBnX2hhc2hfdGFibGVfbmV3X2Z1bGwgKGdfZGlyZWN0X2hhc2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19kaXJlY3RfZXF1YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKQEAgLTU1NywxNyArNTE1LDIxIEBACiAKICAgZ19oYXNoX3RhYmxlX2luc2VydCAoZmlyc3RfbWFwLAogICAgICAgICAgICAgICAgICAgICAgICBHSU5UX1RPX1BPSU5URVIgKFRfVEVTVF9OVU1CRVJaX1RXTyksCi0gICAgICAgICAgICAgICAgICAgICAgIGNyYXp5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgKGdwb2ludGVyKWFyZ3VtZW50KTsKICAgZ19oYXNoX3RhYmxlX2luc2VydCAoZmlyc3RfbWFwLAogICAgICAgICAgICAgICAgICAgICAgICBHSU5UX1RPX1BPSU5URVIgKFRfVEVTVF9OVU1CRVJaX1RIUkVFKSwKLSAgICAgICAgICAgICAgICAgICAgICAgY3JhenkpOworICAgICAgICAgICAgICAgICAgICAgICAoZ3BvaW50ZXIpYXJndW1lbnQpOwogCi0gIC8qIEluY3JlbWVudCBjcmF6eSdzIHJlZiBjb3VudCBzaW5jZSBmaXJzdF9tYXAgbm93IGhvbGRzIHR3bwotICAgICByZWZlcmVuY2VzIHRvIGl0IGFuZCB3b3VsZCBvdGhlcndpc2UgYXR0ZW1wdCB0byBkZWFsbG9jYXRlIGl0Ci0gICAgIHR3aWNlIGR1cmluZyBkZXN0cnVjdGlvbi4gV2UgZG8gdGhpcyBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgY29weQotICAgICBvZiBjcmF6eSBpbiBvcmRlciB0byBtaW1pYyB0aGUgQysrIGltcGxlbWVudGF0aW9uIChhbmQgc2luY2UsCi0gICAgIGZyYW5rbHksIHRoZSB3b3JsZCBuZWVkcyBsZXNzIGNyYXp5LCBub3QgbW9yZSkuICovCi0gIGdfb2JqZWN0X3JlZiAoY3JhenkpOworICAvKiBJbmNyZW1lbnQgYXJndW1lbnQncyByZWYgY291bnQgYnkgdHdvIGJlY2F1c2UgZmlyc3RfbWFwIG5vdyBob2xkcworICAgICB0d28gcmVmZXJlbmNlcyB0byBpdCBhbmQgdGhlIGNhbGxlciBpcyBub3QgYXdhcmUgd2UgaGF2ZSBtYWRlIGFueQorICAgICBhZGRpdGlvbmFsIHJlZmVyZW5jZXMgdG8gYXJndW1lbnQuICAoVGhhdCBpcywgY2FsbGVyIG93bnMgYXJndW1lbnQKKyAgICAgYW5kIHdpbGwgdW5yZWYgaXQgZXhwbGljaXRseSBpbiBhZGRpdGlvbiB0byB1bnJlZi1pbmcgKl9yZXR1cm4uKQorCisgICAgIFdlIGRvIHRoaXMgaW5zdGVhZCBvZiBjcmVhdGluZyBhIGNvcHkgb2YgYXJndW1lbnQgaW4gb3JkZXIgdG8gbWltaWMKKyAgICAgdGhlIEMrKyBpbXBsZW1lbnRhdGlvbiAoYW5kIHNpbmNlLCBmcmFua2x5LCB0aGUgd29ybGQgbmVlZHMgbGVzcworICAgICBhcmd1bWVudCwgbm90IG1vcmUpLiAqLworICBnX29iamVjdF9yZWYgKChncG9pbnRlcilhcmd1bWVudCk7CisgIGdfb2JqZWN0X3JlZiAoKGdwb2ludGVyKWFyZ3VtZW50KTsKIAogICBsb29uZXkgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX0lOU0FOSVRZLCBOVUxMKTsKICAgZ19oYXNoX3RhYmxlX2luc2VydCAoc2Vjb25kX21hcCwKQEAgLTc0NCwxNiArNzA2LDE3IEBACiAgIGdfYXNzZXJ0ICgqZXJyMSA9PSBOVUxMKTsKICAgZ19hc3NlcnQgKCplcnIyID09IE5VTEwpOwogCi0gIGlmIChzdHJuY21wIChhcmcwLCAiWGNlcHRpb24iLCA5KSA9PSAwKSB7CisgIGlmIChzdHJuY21wIChhcmcwLCAiWGNlcHRpb24iLCA4KSA9PSAwICYmIHN0cmxlbihhcmcwKSA9PSA4KSB7CiAgICAgKmVycjEgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1hDRVBUSU9OLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3JDb2RlIiwgMTAwMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1lc3NhZ2UiLCAgIGdfc3RyZHVwICgiVGhpcyBpcyBhbiBYY2VwdGlvbiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgICByZXN1bHQgPSBGQUxTRTsKICAgfQotICBlbHNlIGlmIChzdHJuY21wIChhcmcwLCAiWGNlcHRpb24yIiwgMTApID09IDApIHsKKyAgZWxzZSBpZiAoc3RybmNtcCAoYXJnMCwgIlhjZXB0aW9uMiIsIDkpID09IDApIHsKICAgICAqZXJyMiA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfWENFUFRJT04yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3JDb2RlIiwgMjAwMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICJlcnJvckNvZGUiLCAyMDAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKIAogICAgIGdfb2JqZWN0X2dldCAoKmVycjIsCiAgICAgICAgICAgICAgICAgICAic3RydWN0X3RoaW5nIiwgJnN0cnVjdF90aGluZywKQEAgLTgyNiw2ICs3ODksOSBAQAogICBiYXNlX2NsYXNzLT50ZXN0X2RvdWJsZSA9CiAgICAga2xhc3MtPnRlc3RfZG91YmxlID0KICAgICB0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfZG91YmxlOworICBiYXNlX2NsYXNzLT50ZXN0X2JpbmFyeSA9CisgICAga2xhc3MtPnRlc3RfYmluYXJ5ID0KKyAgICB0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3RfYmluYXJ5OwogICBiYXNlX2NsYXNzLT50ZXN0X3N0cnVjdCA9CiAgICAga2xhc3MtPnRlc3Rfc3RydWN0ID0KICAgICB0aHJpZnRfdGVzdF9oYW5kbGVyX3Rlc3Rfc3RydWN0OwpkaWZmIC0tZ2l0IGEvdGVzdC9jX2dsaWIvc3JjL3RocmlmdF90ZXN0X2hhbmRsZXIuaCBiL3Rlc3QvY19nbGliL3NyYy90aHJpZnRfdGVzdF9oYW5kbGVyLmgKaW5kZXggOTU3YmJkYS4uYjY0Y2IxNiAxMDA2NDQKLS0tIGEvdGVzdC9jX2dsaWIvc3JjL3RocmlmdF90ZXN0X2hhbmRsZXIuaAorKysgYi90ZXN0L2NfZ2xpYi9zcmMvdGhyaWZ0X3Rlc3RfaGFuZGxlci5oCkBAIC04Niw2ICs4NiwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2RvdWJsZSpfcmV0dXJuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2RvdWJsZSAgICAgICAgIHRoaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICAgICAgICAgICAgICAqKmVycm9yKTsKKyAgZ2Jvb2xlYW4gKCp0ZXN0X2JpbmFyeSkgICAgICAgICAgKFRUZXN0VGhyaWZ0VGVzdElmICAgICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdCeXRlQXJyYXkgICAgICAgICoqX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdCeXRlQXJyYXkgICAgICp0aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICAgKiplcnJvcik7CiAgIGdib29sZWFuICgqdGVzdF9zdHJ1Y3QpICAgICAgICAgIChUVGVzdFRocmlmdFRlc3RJZiAgICAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVGVzdFh0cnVjdCAgICAgICAgICoqX3JldHVybiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUZXN0WHRydWN0ICAgICp0aGluZywKZGlmZiAtLWdpdCBhL3Rlc3QvY2wvTWFrZWZpbGUuYW0gYi90ZXN0L2NsL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmI1ZTcyYmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NsL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNDIgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitUSFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAorCitzdHViczogLi4vVGhyaWZ0VGVzdC50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gY2wgLi4vVGhyaWZ0VGVzdC50aHJpZnQKKworVGVzdFNlcnZlcjogbWFrZS10ZXN0LXNlcnZlci5saXNwCisJJChTQkNMKSAtLXNjcmlwdCBtYWtlLXRlc3Qtc2VydmVyLmxpc3AKKworVGVzdENsaWVudDogbWFrZS10ZXN0LWNsaWVudC5saXNwCisJJChTQkNMKSAtLXNjcmlwdCBtYWtlLXRlc3QtY2xpZW50Lmxpc3AKKworcHJlY3Jvc3M6IHN0dWJzIFRlc3RTZXJ2ZXIgVGVzdENsaWVudAorCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtciBnZW4tY2wKKwkkKFJNKSBUZXN0U2VydmVyCisJJChSTSkgVGVzdENsaWVudAorCitFWFRSQV9ESVNUID0gXAorCWltcGxlbWVudGF0aW9uLmxpc3AgXAorCW1ha2UtdGVzdC1jbGllbnQubGlzcCBcCisJbWFrZS10ZXN0LXNlcnZlci5saXNwIFwKKwl0ZXN0cy5saXNwCmRpZmYgLS1naXQgYS90ZXN0L2NsL2ltcGxlbWVudGF0aW9uLmxpc3AgYi90ZXN0L2NsL2ltcGxlbWVudGF0aW9uLmxpc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNhZjdiZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY2wvaW1wbGVtZW50YXRpb24ubGlzcApAQCAtMCwwICsxLDEzNiBAQAorKGluLXBhY2thZ2UgIzp0aHJpZnQudGVzdC1pbXBsZW1lbnRhdGlvbikKKworOzs7OyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzs7OzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOzs7OyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzs7OzsKKzs7OzsgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOzs7OworOzs7OyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis7Ozs7IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis7Ozs7IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOzs7OyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis7Ozs7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC12b2lkICgpCisgIChmb3JtYXQgdCAidGVzdFZvaWQoKX4lIikpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LXN0cmluZyAodGhpbmcpCisgIChmb3JtYXQgdCAidGVzdFN0cmluZyh+YSl+JSIgdGhpbmcpCisgIHRoaW5nKQorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC1ib29sICh0aGluZykKKyAgKGZvcm1hdCB0ICJ0ZXN0Qm9vbCh+YSl+JSIgKGlmIHRoaW5nICJ0cnVlIiAiZmFsc2UiKSkKKyAgdGhpbmcpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LWJ5dGUgKHRoaW5nKQorICAoZm9ybWF0IHQgInRlc3RCeXRlKH5hKX4lIiB0aGluZykKKyAgdGhpbmcpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LWkzMiAodGhpbmcpCisgIChmb3JtYXQgdCAidGVzdEkzMih+YSl+JSIgdGhpbmcpCisgIHRoaW5nKQorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC1pNjQgKHRoaW5nKQorICAoZm9ybWF0IHQgInRlc3RJNjQofmEpfiUiIHRoaW5nKQorICB0aGluZykKKworKGRlZnVuIHRocmlmdC50ZXN0LnRocmlmdC10ZXN0LWltcGxlbWVudGF0aW9uOnRlc3QtZG91YmxlICh0aGluZykKKyAgKGZvcm1hdCB0ICJ0ZXN0RG91YmxlKH5hKX4lIiB0aGluZykKKyAgdGhpbmcpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LWJpbmFyeSAodGhpbmcpCisgIChmb3JtYXQgdCAidGVzdEJpbmFyeSh+YSl+JSIgdGhpbmcpCisgIHRoaW5nKQorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC1zdHJ1Y3QgKHRoaW5nKQorICAoZm9ybWF0IHQgInRlc3RTdHJ1Y3QofmEpfiUiIHRoaW5nKQorICB0aGluZykKKworKGRlZnVuIHRocmlmdC50ZXN0LnRocmlmdC10ZXN0LWltcGxlbWVudGF0aW9uOnRlc3QtbmVzdCAodGhpbmcpCisgIChmb3JtYXQgdCAidGVzdE5lc3QofmEpfiUiIHRoaW5nKQorICB0aGluZykKKworKGRlZnVuIHRocmlmdC50ZXN0LnRocmlmdC10ZXN0LWltcGxlbWVudGF0aW9uOnRlc3QtbWFwICh0aGluZykKKyAgKGZvcm1hdCB0ICJ0ZXN0TWFwKH5hKX4lIiB0aGluZykKKyAgdGhpbmcpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LXN0cmluZy1tYXAgKHRoaW5nKQorICAoZm9ybWF0IHQgInRlc3RTdHJpbmdNYXAofmEpfiUiIHRoaW5nKQorICB0aGluZykKKworKGRlZnVuIHRocmlmdC50ZXN0LnRocmlmdC10ZXN0LWltcGxlbWVudGF0aW9uOnRlc3Qtc2V0ICh0aGluZykKKyAgKGZvcm1hdCB0ICJ0ZXN0U2V0KH5hKX4lIiB0aGluZykKKyAgdGhpbmcpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LWxpc3QgKHRoaW5nKQorICAoZm9ybWF0IHQgInRlc3RMaXN0KH5hKX4lIiB0aGluZykKKyAgdGhpbmcpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LWVudW0gKHRoaW5nKQorICAoZm9ybWF0IHQgInRlc3RFbnVtKH5hKX4lIiB0aGluZykKKyAgdGhpbmcpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LXR5cGVkZWYgKHRoaW5nKQorICAoZm9ybWF0IHQgInRlc3RUeXBlZGVmKH5hKX4lIiB0aGluZykKKyAgdGhpbmcpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LW1hcC1tYXAgKGhlbGxvKQorICAoZm9ybWF0IHQgInRlc3RNYXBNYXAofmEpfiUiIGhlbGxvKQorICAnKCgtNCAuICgoLTQgLiAtNCkgKC0zIC4gLTMpICgtMiAuIC0yKSAoLTEgLiAtMSkpKSAoNCAuICgoMSAuIDEpICgyIC4gMikgKDMgLiAzKSAoNCAuIDQpKSkpKQorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC1pbnNhbml0eSAoYXJndW1lbnQpCisgIChsZXQgKChyZXN1bHQgYCgoMSAuICgoMiAuICxhcmd1bWVudCkgKDMgLiAsYXJndW1lbnQpKSkKKyAgICAgICAgICAgICAgICAgICgyIC4gKCg2IC4gLCh0aHJpZnQudGVzdDo6bWFrZS1pbnNhbml0eSA6dXNlci1tYXAgbmlsIDp4dHJ1Y3RzIG5pbCkpKSkpKSkKKyAgICAoZm9ybWF0IHQgIn5hfiUiIHJlc3VsdCkKKyAgICByZXN1bHQpKQorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC1tdWx0aSAoYXJnMCBhcmcxIGFyZzIgYXJnMyBhcmc0IGFyZzUpCisgIChkZWNsYXJlIChpZ25vcmFibGUgYXJnMyBhcmc0IGFyZzUpKQorICAoZm9ybWF0IHQgInRlc3RNdWx0aSgpfiUiKQorICAodGhyaWZ0LnRlc3Q6bWFrZS14dHJ1Y3QgOnN0cmluZy10aGluZyAiSGVsbG8yIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgOmJ5dGUtdGhpbmcgYXJnMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgOmkzMi10aGluZyBhcmcxCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6aTY0LXRoaW5nIGFyZzIpKQorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC1leGNlcHRpb24gKGFyZykKKyAgKGZvcm1hdCB0ICJ0ZXN0RXhjZXB0aW9uKH5hKX4lIiBhcmcpCisgIChjb25kCisgICAgKChzdHJpbmc9IGFyZyAiWGNlcHRpb24iKSAoZXJyb3IgJ3RocmlmdC50ZXN0OnhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmVycm9yLWNvZGUgMTAwMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDptZXNzYWdlIGFyZykpCisgICAgKChzdHJpbmc9IGFyZyAiVEV4Y2VwdGlvbiIpIChlcnJvciAndGhyaWZ0LnRlc3Q6eGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDplcnJvci1jb2RlIDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDptZXNzYWdlICJTdHVmZiEiKSkpKQorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC1tdWx0aS1leGNlcHRpb24gKGFyZzAgYXJnMSkKKyAgKGZvcm1hdCB0ICJ0ZXN0TXVsdGlFeGNlcHRpb24ofmEsIH5hKX4lIiBhcmcwIGFyZzEpCisgIChjb25kCisgICAgKChzdHJpbmc9IGFyZzAgIlhjZXB0aW9uIikgKGVycm9yICd0aHJpZnQudGVzdDp4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDplcnJvci1jb2RlIDEwMDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6bWVzc2FnZSAiVGhpcyBpcyBhbiBYY2VwdGlvbiIpKQorICAgICgoc3RyaW5nPSBhcmcwICJYY2VwdGlvbjIiKSAoZXJyb3IgJ3RocmlmdC50ZXN0OnhjZXB0aW9uMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDplcnJvci1jb2RlIDIwMDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6c3RydWN0LXRoaW5nICh0aHJpZnQudGVzdDptYWtlLXh0cnVjdCA6c3RyaW5nLXRoaW5nICJUaGlzIGlzIGFuIFhjZXB0aW9uMiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Ynl0ZS10aGluZyAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmkzMi10aGluZyAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmk2NC10aGluZyAwKSkpKQorICAodGhyaWZ0LnRlc3Q6bWFrZS14dHJ1Y3QgOnN0cmluZy10aGluZyBhcmcxCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6Ynl0ZS10aGluZyAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6aTMyLXRoaW5nIDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDppNjQtdGhpbmcgMCkpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LW9uZXdheSAoc2Vjb25kcykKKyAgKGZvcm1hdCB0ICJ0ZXN0T25ld2F5KH5hKTogU2xlZXBpbmcuLi5+JSIgc2Vjb25kcykKKyAgKHNsZWVwIHNlY29uZHMpCisgIChmb3JtYXQgdCAidGVzdE9uZXdheSh+YSk6IGRvbmUgc2xlZXBpbmchfiUiIHNlY29uZHMpKQorCis7OzsgUmVtb3ZlZCBmcm9tIHRoZSBJREwgZGVmaW5pdGlvbi4KKyMrKG9yKQorKGRlZnVuIHRocmlmdC50ZXN0LnNlY29uZC1zZXJ2aWNlLWltcGxlbWVudGF0aW9uOmJsYWgtYmxhaCAoKQorICAoZm9ybWF0IHQgImJsYWhCbGFoKCl+JSIpKQorCisoZGVmdW4gdGhyaWZ0LnRlc3Quc2Vjb25kLXNlcnZpY2UtaW1wbGVtZW50YXRpb246c2Vjb25kdGVzdC1zdHJpbmcgKHRoaW5nKQorICAoZm9ybWF0IHQgInNlY29uZHRlc3RTdHJpbmcofmEpfiUiIHRoaW5nKQorICAoY29uY2F0ZW5hdGUgJ3N0cmluZyAidGVzdFN0cmluZyhcIiIgdGhpbmcgIlwiKSIpKQorCmRpZmYgLS1naXQgYS90ZXN0L2NsL21ha2UtdGVzdC1jbGllbnQubGlzcCBiL3Rlc3QvY2wvbWFrZS10ZXN0LWNsaWVudC5saXNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwOTY2OWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NsL21ha2UtdGVzdC1jbGllbnQubGlzcApAQCAtMCwwICsxLDkzIEBACisoaW4tcGFja2FnZSAjOmNsLXVzZXIpCisKKzs7OzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7Ozs7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzs7OzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Ozs7Cis7Ozs7ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzs7OzsKKzs7OzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOzs7OyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOzs7OyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzs7OzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOzs7OyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIysob3IpICh3aGVuIChub3QgKGJvdW5kcCAnc2ItaW1wbDo6ZGVmYXVsdC1leHRlcm5hbC1mb3JtYXQpCisgICAgICAgICAgICAgICAgIChzZXRmIHNiLWltcGw6OmRlZmF1bHQtZXh0ZXJuYWwtZm9ybWF0IDpVVEYtOCkpKQorCisocmVxdWlyZSAiYXNkZiIpCisobG9hZCAobWVyZ2UtcGF0aG5hbWVzICIuLi8uLi9saWIvY2wvbG9hZC1sb2NhbGx5Lmxpc3AiICpsb2FkLXRydWVuYW1lKikpCisoYXNkZjpsb2FkLXN5c3RlbSA6bmV0LmRpZGllcnZlcm5hLmNsb24pCisoYXNkZjpsb2FkLXN5c3RlbSA6Zmlhc2NvKQorKGFzZGY6bG9hZC1hc2QgKG1lcmdlLXBhdGhuYW1lcyAiZ2VuLWNsL1RocmlmdFRlc3QvdGhyaWZ0LWdlbi1UaHJpZnRUZXN0LmFzZCIgKmxvYWQtdHJ1ZW5hbWUqKSkKKyhhc2RmOmxvYWQtc3lzdGVtIDp0aHJpZnQtZ2VuLXRocmlmdHRlc3QpCisKKyhuZXQuZGlkaWVydmVybmEuY2xvbjpuaWNrbmFtZS1wYWNrYWdlKQorCisoZGVmcGFja2FnZSAjOnRocmlmdC1jcm9zcworICAoOnVzZSAjOmNvbW1vbi1saXNwICM6Zmlhc2NvKQorICAoOmV4cG9ydCAjOmNyb3NzLXRlc3QpKQorCisoaW4tcGFja2FnZSAjOnRocmlmdC1jcm9zcykKKworKGRlZnBhcmFtZXRlciAqcHJvdCogbmlsKQorCisobG9hZCAobWVyZ2UtcGF0aG5hbWVzICJ0ZXN0cy5saXNwIiAqbG9hZC10cnVlbmFtZSopIDpleHRlcm5hbC1mb3JtYXQgOlVURi04KQorCisoY2xvbjpkZWZzeW5vcHNpcyAoKQorICAodGV4dCA6Y29udGVudHMgIlRoZSBDb21tb24gTGlzcCBjbGllbnQgZm9yIFRocmlmdCdzIGNyb3NzLWxhbmd1YWdlIHRlc3Qgc3VpdGUuIikKKyAgKGdyb3VwICg6aGVhZGVyICJBbGxvd2VkIG9wdGlvbnM6IikKKyAgICAoZmxhZyA6c2hvcnQtbmFtZSAiaCIgOmxvbmctbmFtZSAiaGVscCIKKyAgICAgICAgICA6ZGVzY3JpcHRpb24gIlByaW50IHRoaXMgaGVscCBhbmQgZXhpdC4iKQorICAgIChzdHJvcHQgOmxvbmctbmFtZSAiaG9zdCIKKyAgICAgICAgICAgIDpkZXNjcmlwdGlvbiAiVGhlIGhvc3QgdG8gY29ubmVjdCB0by4iCisgICAgICAgICAgICA6ZGVmYXVsdC12YWx1ZSAibG9jYWxob3N0IgorICAgICAgICAgICAgOmFyZ3VtZW50LW5hbWUgIkFSRyIpCisgICAgKHN0cm9wdCA6bG9uZy1uYW1lICJwb3J0IgorICAgICAgICAgICAgOmRlc2NyaXB0aW9uICJOdW1iZXIgb2YgdGhlIHBvcnQgdG8gbGlzdGVuIGZvciBjb25uZWN0aW9ucyBvbi4iCisgICAgICAgICAgICA6ZGVmYXVsdC12YWx1ZSAiOTA5MCIKKyAgICAgICAgICAgIDphcmd1bWVudC1uYW1lICJBUkciCisgICAgICAgICAgICA6YXJndW1lbnQtdHlwZSA6b3B0aW9uYWwpCisgICAgKHN0cm9wdCA6bG9uZy1uYW1lICJ0cmFuc3BvcnQiCisgICAgICAgICAgICA6ZGVzY3JpcHRpb24gIlRyYW5zcG9ydDogdHJhbnNwb3J0IHRvIHVzZSAoXCJidWZmZXJlZFwiLCBcImZyYW1lZFwiKSIKKyAgICAgICAgICAgIDpkZWZhdWx0LXZhbHVlICJidWZmZXJlZCIKKyAgICAgICAgICAgIDphcmd1bWVudC1uYW1lICJBUkciKQorICAgIChzdHJvcHQgOmxvbmctbmFtZSAicHJvdG9jb2wiCisgICAgICAgICAgICA6ZGVzY3JpcHRpb24gIlByb3RvY29sOiBwcm90b2NvbCB0byB1c2UgKFwiYmluYXJ5XCIsIFwibXVsdGlcIikiCisgICAgICAgICAgICA6ZGVmYXVsdC12YWx1ZSAiYmluYXJ5IgorICAgICAgICAgICAgOmFyZ3VtZW50LW5hbWUgIkFSRyIpKSkKKworKGRlZnVuIG1haW4gKCkKKyAgIkVudHJ5IHBvaW50IGZvciBvdXIgc3RhbmRhbG9uZSBhcHBsaWNhdGlvbi4iCisgIChjbG9uOm1ha2UtY29udGV4dCkKKyAgKHdoZW4gKGNsb246Z2V0b3B0IDpzaG9ydC1uYW1lICJoIikKKyAgICAoY2xvbjpoZWxwKQorICAgIChjbG9uOmV4aXQpKQorICAobGV0ICgocG9ydCAiOTA5MCIpCisgICAgICAgIChob3N0ICJsb2NhbGhvc3QiKQorICAgICAgICAoZnJhbWVkIG5pbCkKKyAgICAgICAgKG11bHRpcGxleGVkIG5pbCkpCisgICAgKGNsb246ZG8tY21kbGluZS1vcHRpb25zIChvcHRpb24gbmFtZSB2YWx1ZSBzb3VyY2UpCisgICAgICAocHJpbnQgKGxpc3Qgb3B0aW9uIG5hbWUgdmFsdWUgc291cmNlKSkKKyAgICAgIChpZiAoc3RyaW5nPSBuYW1lICJob3N0IikKKyAgICAgICAgICAoc2V0ZiBob3N0IHZhbHVlKSkKKyAgICAgIChpZiAoc3RyaW5nPSBuYW1lICJwb3J0IikKKyAgICAgICAgICAoc2V0ZiBwb3J0IHZhbHVlKSkKKyAgICAgIChpZiAoc3RyaW5nPSBuYW1lICJ0cmFuc3BvcnQiKQorICAgICAgICAgIChjb25kICgoc3RyaW5nPSB2YWx1ZSAiYnVmZmVyZWQiKSAoc2V0ZiBmcmFtZWQgbmlsKSkKKyAgICAgICAgICAgICAgICAoKHN0cmluZz0gdmFsdWUgImZyYW1lZCIpIChzZXRmIGZyYW1lZCB0KSkKKyAgICAgICAgICAgICAgICAodCAoZXJyb3IgIlVuc3VwcG9ydGVkIHRyYW5zcG9ydC4iKSkpKQorICAgICAgKGlmIChzdHJpbmc9IG5hbWUgInByb3RvY29sIikKKyAgICAgICAgICAoY29uZCAoKHN0cmluZz0gdmFsdWUgImJpbmFyeSIpIChzZXRmIG11bHRpcGxleGVkIG5pbCkpCisgICAgICAgICAgICAgICAgKChzdHJpbmc9IHZhbHVlICJtdWx0aSIpIChzZXRmIG11bHRpcGxleGVkIHQpKQorICAgICAgICAgICAgICAgICh0IChlcnJvciAiVW5zdXBwb3J0ZWQgcHJvdG9jb2wuIikpKSkpCisgICAgKHRlcnByaSkKKyAgICAoc2V0ZiAqcHJvdCogKHRocmlmdC5pbXBsZW1lbnRhdGlvbjo6Y2xpZW50IChwdXJpOnBhcnNlLXVyaQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25jYXRlbmF0ZSAnc3RyaW5nICJ0aHJpZnQ6Ly8iIGhvc3QgIjoiIHBvcnQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmZyYW1lZCBmcmFtZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDptdWx0aXBsZXhlZCBtdWx0aXBsZXhlZCkpCisgICAgKGxldCAoKHJlc3VsdCAoY3Jvc3MtdGVzdCA6bXVsdGlwbGV4ZWQgbXVsdGlwbGV4ZWQpKSkKKyAgICAgICh0aHJpZnQuaW1wbGVtZW50YXRpb246OmNsb3NlICpwcm90KikKKyAgICAgIChjbG9uOmV4aXQgcmVzdWx0KSkpKQorCisoY2xvbjpkdW1wICJUZXN0Q2xpZW50IiBtYWluKQpkaWZmIC0tZ2l0IGEvdGVzdC9jbC9tYWtlLXRlc3Qtc2VydmVyLmxpc3AgYi90ZXN0L2NsL21ha2UtdGVzdC1zZXJ2ZXIubGlzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTNjODc5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jbC9tYWtlLXRlc3Qtc2VydmVyLmxpc3AKQEAgLTAsMCArMSw4MCBAQAorKGluLXBhY2thZ2UgIzpjbC11c2VyKQorCis7Ozs7IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOzs7OyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis7Ozs7IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOzs7OworOzs7OyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis7Ozs7Cis7Ozs7IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzs7OzsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzs7OzsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis7Ozs7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzs7OzsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyhyZXF1aXJlICJhc2RmIikKKyhsb2FkIChtZXJnZS1wYXRobmFtZXMgIi4uLy4uL2xpYi9jbC9sb2FkLWxvY2FsbHkubGlzcCIgKmxvYWQtdHJ1ZW5hbWUqKSkKKyhhc2RmOmxvYWQtc3lzdGVtIDpuZXQuZGlkaWVydmVybmEuY2xvbikKKyhhc2RmOmxvYWQtYXNkIChtZXJnZS1wYXRobmFtZXMgImdlbi1jbC9UaHJpZnRUZXN0L3RocmlmdC1nZW4tVGhyaWZ0VGVzdC5hc2QiICpsb2FkLXRydWVuYW1lKikpCisoYXNkZjpsb2FkLXN5c3RlbSA6dGhyaWZ0LWdlbi10aHJpZnR0ZXN0KQorKGxvYWQgKG1lcmdlLXBhdGhuYW1lcyAiaW1wbGVtZW50YXRpb24ubGlzcCIgKmxvYWQtdHJ1ZW5hbWUqKSkKKworKG5ldC5kaWRpZXJ2ZXJuYS5jbG9uOm5pY2tuYW1lLXBhY2thZ2UpCisKKyhjbG9uOmRlZnN5bm9wc2lzICgpCisgICh0ZXh0IDpjb250ZW50cyAiVGhlIENvbW1vbiBMaXNwIHNlcnZlciBmb3IgVGhyaWZ0J3MgY3Jvc3MtbGFuZ3VhZ2UgdGVzdCBzdWl0ZS4iKQorICAoZ3JvdXAgKDpoZWFkZXIgIkFsbG93ZWQgb3B0aW9uczoiKQorICAgIChmbGFnIDpzaG9ydC1uYW1lICJoIiA6bG9uZy1uYW1lICJoZWxwIgorICAgICAgICAgIDpkZXNjcmlwdGlvbiAiUHJpbnQgdGhpcyBoZWxwIGFuZCBleGl0LiIpCisgICAgKHN0cm9wdCA6bG9uZy1uYW1lICJwb3J0IgorICAgICAgICAgICAgOmRlc2NyaXB0aW9uICJOdW1iZXIgb2YgdGhlIHBvcnQgdG8gbGlzdGVuIGZvciBjb25uZWN0aW9ucyBvbi4iCisgICAgICAgICAgICA6ZGVmYXVsdC12YWx1ZSAiOTA5MCIKKyAgICAgICAgICAgIDphcmd1bWVudC1uYW1lICJBUkciCisgICAgICAgICAgICA6YXJndW1lbnQtdHlwZSA6b3B0aW9uYWwpCisgICAgKHN0cm9wdCA6bG9uZy1uYW1lICJzZXJ2ZXItdHlwZSIKKyAgICAgICAgICAgIDpkZXNjcmlwdGlvbiAiVGhlIHR5cGUgb2Ygc2VydmVyLCBjdXJyZW50bHkgb25seSBcInNpbXBsZVwiIGlzIGF2YWlsYWJsZS4iCisgICAgICAgICAgICA6ZGVmYXVsdC12YWx1ZSAic2ltcGxlIgorICAgICAgICAgICAgOmFyZ3VtZW50LW5hbWUgIkFSRyIpCisgICAgKHN0cm9wdCA6bG9uZy1uYW1lICJ0cmFuc3BvcnQiCisgICAgICAgICAgICA6ZGVzY3JpcHRpb24gIlRyYW5zcG9ydDogdHJhbnNwb3J0IHRvIHVzZSAoXCJidWZmZXJlZFwiIG9yIFwiZnJhbWVkXCIpIgorICAgICAgICAgICAgOmRlZmF1bHQtdmFsdWUgImJ1ZmZlcmVkIgorICAgICAgICAgICAgOmFyZ3VtZW50LW5hbWUgIkFSRyIpCisgICAgKHN0cm9wdCA6bG9uZy1uYW1lICJwcm90b2NvbCIKKyAgICAgICAgICAgIDpkZXNjcmlwdGlvbiAiUHJvdG9jb2w6IHByb3RvY29sIHRvIHVzZSAoXCJiaW5hcnlcIiBvciBcIm11bHRpXCIpIgorICAgICAgICAgICAgOmRlZmF1bHQtdmFsdWUgImJpbmFyeSIKKyAgICAgICAgICAgIDphcmd1bWVudC1uYW1lICJBUkciKSkpCisKKyhkZWZ1biBtYWluICgpCisgICJFbnRyeSBwb2ludCBmb3Igb3VyIHN0YW5kYWxvbmUgYXBwbGljYXRpb24uIgorICAoY2xvbjptYWtlLWNvbnRleHQpCisgICh3aGVuIChjbG9uOmdldG9wdCA6c2hvcnQtbmFtZSAiaCIpCisgICAgKGNsb246aGVscCkKKyAgICAoY2xvbjpleGl0KSkKKyAgKGxldCAoKHBvcnQgIjkwOTAiKQorICAgICAgICAoZnJhbWVkIG5pbCkKKyAgICAgICAgKG11bHRpcGxleGVkIG5pbCkpCisgICAgKGNsb246ZG8tY21kbGluZS1vcHRpb25zIChvcHRpb24gbmFtZSB2YWx1ZSBzb3VyY2UpCisgICAgICAocHJpbnQgKGxpc3Qgb3B0aW9uIG5hbWUgdmFsdWUgc291cmNlKSkKKyAgICAgIChpZiAoc3RyaW5nPSBuYW1lICJwb3J0IikKKyAgICAgICAgICAoc2V0ZiBwb3J0IHZhbHVlKSkKKyAgICAgIChpZiAoc3RyaW5nPSBuYW1lICJ0cmFuc3BvcnQiKQorICAgICAgICAgIChjb25kICgoc3RyaW5nPSB2YWx1ZSAiYnVmZmVyZWQiKSAoc2V0ZiBmcmFtZWQgbmlsKSkKKyAgICAgICAgICAgICAgICAoKHN0cmluZz0gdmFsdWUgImZyYW1lZCIpIChzZXRmIGZyYW1lZCB0KSkKKyAgICAgICAgICAgICAgICAodCAoZXJyb3IgIlVuc3VwcG9ydGVkIHRyYW5zcG9ydC4iKSkpKQorICAgICAgKGlmIChzdHJpbmc9IG5hbWUgInByb3RvY29sIikKKyAgICAgICAgICAoY29uZCAoKHN0cmluZz0gdmFsdWUgImJpbmFyeSIpIChzZXRmIG11bHRpcGxleGVkIG5pbCkpCisgICAgICAgICAgICAgICAgKChzdHJpbmc9IHZhbHVlICJtdWx0aSIpIChzZXRmIG11bHRpcGxleGVkIHQpKQorICAgICAgICAgICAgICAgICh0IChlcnJvciAiVW5zdXBwb3J0ZWQgcHJvdG9jb2wuIikpKSkpCisgICAgKHRlcnByaSkKKyAgICAobGV0ICgoc2VydmljZXMgKGlmIG11bHRpcGxleGVkCisgICAgICAgICAgICAgICAgICAgICAgICAobGlzdCB0aHJpZnQudGVzdDp0aHJpZnQtdGVzdCB0aHJpZnQudGVzdDpzZWNvbmQtc2VydmljZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmlmdC50ZXN0OnRocmlmdC10ZXN0KSkpCisgICAgICAodGhyaWZ0OnNlcnZlIChwdXJpOnBhcnNlLXVyaSAoY29uY2F0ZW5hdGUgJ3N0cmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aHJpZnQ6Ly8xMjcuMC4wLjE6IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQpKQorICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlcworICAgICAgICAgICAgICAgICAgICA6ZnJhbWVkIGZyYW1lZAorICAgICAgICAgICAgICAgICAgICA6bXVsdGlwbGV4ZWQgbXVsdGlwbGV4ZWQpKSkKKyAgKGNsb246ZXhpdCkpCisKKyhjbG9uOmR1bXAgIlRlc3RTZXJ2ZXIiIG1haW4pCmRpZmYgLS1naXQgYS90ZXN0L2NsL3Rlc3RzLmxpc3AgYi90ZXN0L2NsL3Rlc3RzLmxpc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUwMzVmZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY2wvdGVzdHMubGlzcApAQCAtMCwwICsxLDI0MCBAQAorKGluLXBhY2thZ2UgIzp0aHJpZnQtY3Jvc3MpCisKKzs7OzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7Ozs7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzs7OzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Ozs7Cis7Ozs7ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzs7OzsKKzs7OzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOzs7OyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOzs7OyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzs7OzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOzs7OyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworOzs7OyBUaGUgdGVzdHMgaGVyZSBvbmx5IG1ha2Ugc2Vuc2UgaW4gdGhlIGNvbnRleHQgb2YgYSBUZXN0U2VydmVyCis7Ozs7IHJ1bm5pbmcgYW5kIHRoZSBkeW5hbWljIHZhcmlhYmxlIHRocmlmdC1jcm9zczo6KnByb3QqCis7Ozs7IGJlaW5nIHNldCB3aXRoIGEgY2xpZW50IGNvbm5lY3Rpb24gdG8gdGhlIFRlc3RTZXJ2ZXIuIE5vcm1hbGx5LAorOzs7OyB0aGlzIGlzIGhhbmRsZWQgaW4gbWFrZS10ZXN0LWNsaWVudC5saXNwLgorCisKKzs7OyBTdGFuZGFyZCBUaHJpZnQgY3Jvc3MtdGVzdCBlcnJvciBjb2RlcworKGRlZnBhcmFtZXRlciAqdGVzdF9iYXNldHlwZXMqIDEpCisoZGVmcGFyYW1ldGVyICp0ZXN0X3N0cnVjdHMqIDIpCisoZGVmcGFyYW1ldGVyICp0ZXN0X2NvbnRhaW5lcnMqIDQpCisoZGVmcGFyYW1ldGVyICp0ZXN0X2V4Y2VwdGlvbnMqIDgpCisoZGVmcGFyYW1ldGVyICp0ZXN0X3Vua25vd24qIDY0KQorKGRlZnBhcmFtZXRlciAqdGVzdF90aW1lb3V0KiAxMjgpCisKKyhkZWZ1biBjcm9zcy10ZXN0ICgma2V5IChtdWx0aXBsZXhlZCBuaWwpKQorICAiVGhlIG1haW4gY3Jvc3MtdGVzdCBydW5uZXIuIgorICAobGV0ICgocmVzdWx0IG5pbCkpCisgICAgKGhhbmRsZXItY2FzZQorICAgICAgICAocHJvZ24KKyAgICAgICAgICAodW5sZXNzIChydW4tcGFja2FnZS10ZXN0cyA6cGFja2FnZSA6YmFzZS10eXBlcykKKyAgICAgICAgICAgIChwdXNobmV3ICp0ZXN0X2Jhc2V0eXBlcyogcmVzdWx0KSkKKyAgICAgICAgICAodW5sZXNzIChydW4tcGFja2FnZS10ZXN0cyA6cGFja2FnZSA6c3RydWN0cykKKyAgICAgICAgICAgIChwdXNobmV3ICp0ZXN0X3N0cnVjdHMqIHJlc3VsdCkpCisgICAgICAgICAgKHVubGVzcyAocnVuLXBhY2thZ2UtdGVzdHMgOnBhY2thZ2UgOmNvbnRhaW5lcnMpCisgICAgICAgICAgICAocHVzaG5ldyAqdGVzdF9jb250YWluZXJzKiByZXN1bHQpKQorICAgICAgICAgICh1bmxlc3MgKHJ1bi1wYWNrYWdlLXRlc3RzIDpwYWNrYWdlIDpleGNlcHRpb25zKQorICAgICAgICAgICAgKHB1c2huZXcgKnRlc3RfZXhjZXB0aW9ucyogcmVzdWx0KSkKKyAgICAgICAgICAodW5sZXNzIChydW4tcGFja2FnZS10ZXN0cyA6cGFja2FnZSA6bWlzYykKKyAgICAgICAgICAgIChwdXNobmV3ICp0ZXN0X3Vua25vd24qIHJlc3VsdCkpCisKKyAgICAgICAgICA7OyBJdCBkb2Vzbid0IHNlZW0gbGlrZSBhbnlvbmUgYWN0dWFsbHkgdXNlcworICAgICAgICAgIDs7IHRoZSBzZWNvbmQgdGVzdCBzZXJ2aWNlIHdoZW4gdGVzdGluZyBtdWx0aXBsZXhpbmcsCisgICAgICAgICAgOzsgc28gdGhpcyB3b3VsZCBmYWlsIGFnYWluc3Qgc2VydmVycyBpbiBvdGhlcgorICAgICAgICAgIDs7IGxhbmd1YWdlcy4gRm9yIG5vdywgYW55d2F5LgorICAgICAgICAgICMrKG9yKQorICAgICAgICAgICh3aGVuIG11bHRpcGxleGVkCisgICAgICAgICAgICAodW5sZXNzIChydW4tcGFja2FnZS10ZXN0cyA6cGFja2FnZSA6bXVsdGlwbGV4KQorICAgICAgICAgICAgICAocHVzaG5ldyAqdGVzdF91bmtub3duKiByZXN1bHQpKSkpCisgICAgICAoZXJyb3IgKGUpIChwdXNobmV3ICp0ZXN0X3Vua25vd24qIHJlc3VsdCkpKQorICAgIChhcHBseSAjJysgcmVzdWx0KSkpCisKKyhmaWFzY286ZGVmaW5lLXRlc3QtcGFja2FnZSAjOmJhc2UtdHlwZXMpCisKKyhpbi1wYWNrYWdlICM6YmFzZS10eXBlcykKKworKGRlZmNvbnN0YW50ICpsYW5nLXN0cmluZyogIkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvbsOpcywg2KfZhNi52LHYqNmK2KksINmF2LXYsdmJLCBBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXrJmXJiYXljYW4sINCR0LDRiNKh0L7RgNGCLCBCb2FyaXNjaCwgxb1lbWFpdMSXxaFrYSwg0JHQtdC70LDRgNGD0YHQutCw0Y8sINCR0LXQu9Cw0YDRg9GB0LrQsNGPICjRgtCw0YDQsNGI0LrQtdCy0ZbRhtCwKSwg0JHRitC70LPQsNGA0YHQutC4LCBCYW1hbmFua2FuLCDgpqzgpr7gpoLgprLgpr4sIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsw6AsIE3DrG5nLWTElcykbmctbmfhubPMhCwg0J3QvtGF0YfQuNC50L0sIENlYnVhbm8sIOGPo+GOs+GOqSwgxIxlc2t5LCDQodC70L7QstGjzIHQvdGM0YHQutGKIC8g4rCU4rCO4rCR4rCC4rCh4rCQ4rCg4rCU4rCN4rCfLCDQp9OR0LLQsNGI0LvQsCwgQ3ltcmFlZywgRGFuc2ssIFphemFraSwg3oveqN6I3qzegN6o3oTept6Q3rAsIM6VzrvOu863zr3Ouc66zqwsIEVtaWxpw6BuIGUgcnVtYWduw7JsLCBFbmdsaXNoLCBFc3BlcmFudG8sIEVzcGHDsW9sLCBFZXN0aSwgRXVza2FyYSwg2YHYp9ix2LPbjCwgU3VvbWksIFbDtXJvLCBGw7hyb3lza3QsIEZyYW7Dp2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwg6LSb6KqeLCBHw6BpZGhsaWcsIEdhbGVnbywgQXZhw7FlJ+G6vSwg4KqX4KuB4Kqc4Kqw4Kq+4Kqk4KuALCBHYWVsZywg16LXkdeo15nXqiwg4KS54KS/4KSo4KWN4KSm4KWALCBGaWppIEhpbmRpLCBIcnZhdHNraSwgS3JlecOybCBheWlzeWVuLCBNYWd5YXIsINWA1aHVtdWl1oDVpdW2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwgSWxva2FubywgSWRvLCDDjXNsZW5za2EsIEl0YWxpYW5vLCDml6XmnKzoqp4sIExvamJhbiwgQmFzYSBKYXdhLCDhg6Xhg5Dhg6Dhg5fhg6Phg5rhg5gsIEtvbmdvLCBLYWxhYWxsaXN1dCwg4LKV4LKo4LON4LKo4LKhLCDtlZzqta3slrQsINCa0YrQsNGA0LDRh9Cw0Lkt0JzQsNC70LrRitCw0YAsIFJpcG9hcmlzY2gsIEt1cmTDriwg0JrQvtC80LgsIEtlcm5ld2VrLCDQmtGL0YDQs9GL0LfRh9CwLCBMYXRpbmEsIExhZGlubywgTMOrdHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ8OhbGEsIOC6peC6suC6pywgTGlldHV2acWzLCBMYXR2aWXFoXUsIEJhc2EgQmFueXVtYXNhbiwgTWFsYWdhc3ksINCc0LDQutC10LTQvtC90YHQutC4LCDgtK7gtLLgtK/gtL7gtLPgtIIsIOCkruCksOCkvuCkoOClgCwg2YXYp9iy2ZDYsdmI2YbbjCwgQmFoYXNhIE1lbGF5dSwgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIOCkqOClh+CkquCkvuCksiDgpK3gpL7gpLfgpL4sIE5lZGVybGFuZHMsIOKAqk5vcnNrIChueW5vcnNrKeKArCwg4oCqTm9yc2sgKGJva23DpWwp4oCsLCBOb3Vvcm1hbmQsIERpbsOpIGJpemFhZCwgT2NjaXRhbiwg0JjRgNC+0L3QsNGDLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBQb2xza2ksINm+2YbYrNin2KjbjCwg2b7amtiq2YgsIE5vcmZ1ayAvIFBpdGtlcm4sIFBvcnR1Z3XDqnMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbcOibsSDLCDQoNGD0YHRgdC60LjQuSwg0KHQsNGF0LAg0YLRi9C70LAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTw6FtZWdpZWxsYSwgU2ltcGxlIEVuZ2xpc2gsIFNsb3ZlbsSNaW5hLCBTbG92ZW7FocSNaW5hLCDQodGA0L/RgdC60LggLyBTcnBza2ksIFNlZWx0ZXJzaywgU3ZlbnNrYSwgS2lzd2FoaWxpLCDgrqTgrq7grr/grrTgr40sIOCwpOCxhuCwsuCxgeCwl+CxgSwg0KLQvtK30LjQutOjLCDguYTguJfguKIsIFTDvHJrbWVuw6dlLCBUYWdhbG9nLCBUw7xya8OnZSwg0KLQsNGC0LDRgNGH0LAvVGF0YXLDp2EsINCj0LrRgNCw0ZfQvdGB0YzQutCwLCDYp9ix2K/ZiCwgVGnhur9uZyBWaeG7h3QsIFZvbGFww7xrLCBXYWxvbiwgV2luYXJheSwg5ZC06K+tLCBpc2lYaG9zYSwg15nXmda015PXmdepLCBZb3LDuWLDoSwgWmXDqnV3cywg5Lit5paHLCBCw6JuLWzDom0tZ8O6LCDnsrXoqp4iKQorCisoZGVmcGFyYW1ldGVyICp0cmljay1zdHJpbmcqIChmb3JtYXQgbmlsICJxdW90ZTogXCIgYmFja3NsYXNoOiBcXCBuZXdsaW5lOiB+JSBiYWNrc3BhY2U6IH5DIH4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYjogflQganVuazogIUAjJCUmKCkoJiUkI3t9e308Pjw+PCIgI1xiYWNrc3BhY2UpKQorCisoZGVmY29uc3RhbnQgKmJpbmFyeS1zZXF1ZW5jZSogIygxMjggMTI5IDEzMCAxMzEgMTMyIDEzMyAxMzQgMTM1IDEzNiAxMzcgMTM4IDEzOSAxNDAgMTQxIDE0MiAxNDMgMTQ0IDE0NSAxNDYgMTQ3IDE0OCAxNDkgMTUwIDE1MSAxNTIgMTUzIDE1NCAxNTUgMTU2IDE1NyAxNTggMTU5IDE2MCAxNjEgMTYyIDE2MyAxNjQgMTY1IDE2NiAxNjcgMTY4IDE2OSAxNzAgMTcxIDE3MiAxNzMgMTc0IDE3NSAxNzYgMTc3IDE3OCAxNzkgMTgwIDE4MSAxODIgMTgzIDE4NCAxODUgMTg2IDE4NyAxODggMTg5IDE5MCAxOTEgMTkyIDE5MyAxOTQgMTk1IDE5NiAxOTcgMTk4IDE5OSAyMDAgMjAxIDIwMiAyMDMgMjA0IDIwNSAyMDYgMjA3IDIwOCAyMDkgMjEwIDIxMSAyMTIgMjEzIDIxNCAyMTUgMjE2IDIxNyAyMTggMjE5IDIyMCAyMjEgMjIyIDIyMyAyMjQgMjI1IDIyNiAyMjcgMjI4IDIyOSAyMzAgMjMxIDIzMiAyMzMgMjM0IDIzNSAyMzYgMjM3IDIzOCAyMzkgMjQwIDI0MSAyNDIgMjQzIDI0NCAyNDUgMjQ2IDI0NyAyNDggMjQ5IDI1MCAyNTEgMjUyIDI1MyAyNTQgMjU1IDAgMSAyIDMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTMgMTQgMTUgMTYgMTcgMTggMTkgMjAgMjEgMjIgMjMgMjQgMjUgMjYgMjcgMjggMjkgMzAgMzEgMzIgMzMgMzQgMzUgMzYgMzcgMzggMzkgNDAgNDEgNDIgNDMgNDQgNDUgNDYgNDcgNDggNDkgNTAgNTEgNTIgNTMgNTQgNTUgNTYgNTcgNTggNTkgNjAgNjEgNjIgNjMgNjQgNjUgNjYgNjcgNjggNjkgNzAgNzEgNzIgNzMgNzQgNzUgNzYgNzcgNzggNzkgODAgODEgODIgODMgODQgODUgODYgODcgODggODkgOTAgOTEgOTIgOTMgOTQgOTUgOTYgOTcgOTggOTkgMTAwIDEwMSAxMDIgMTAzIDEwNCAxMDUgMTA2IDEwNyAxMDggMTA5IDExMCAxMTEgMTEyIDExMyAxMTQgMTE1IDExNiAxMTcgMTE4IDExOSAxMjAgMTIxIDEyMiAxMjMgMTI0IDEyNSAxMjYgMTI3KSkKKworKGRlZnRlc3Qgdm9pZC10ZXN0ICgpCisgIChpcyAobnVsbCAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC12b2lkIHRocmlmdC1jcm9zczo6KnByb3QqKSkpKQorCisoZGVmdGVzdCBib29sZWFuLXRlc3QgKCkKKyAgKGlzICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWJvb2wgdGhyaWZ0LWNyb3NzOjoqcHJvdCogdCkpCisgIChpcyAobm90ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWJvb2wgdGhyaWZ0LWNyb3NzOjoqcHJvdCogbmlsKSkpKQorCisoZGVmdGVzdCBpbnRlZ2VyLXRlc3QgKCkKKyAgKGlzICg9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWJ5dGUgdGhyaWZ0LWNyb3NzOjoqcHJvdCogMTI3KSAxMjcpKQorICAoaXMgKD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtYnl0ZSB0aHJpZnQtY3Jvc3M6Oipwcm90KiAtMTI4KSAtMTI4KSkKKyAgKGlzICg9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWJ5dGUgdGhyaWZ0LWNyb3NzOjoqcHJvdCogNDIpIDQyKSkKKyAgKGlzICg9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWJ5dGUgdGhyaWZ0LWNyb3NzOjoqcHJvdCogMCkgMCkpCisgIChpcyAoPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1pMzIgdGhyaWZ0LWNyb3NzOjoqcHJvdCogMCkgMCkpCisgIChpcyAoPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1pMzIgdGhyaWZ0LWNyb3NzOjoqcHJvdCogMjE0NzQ4MzY0NykgMjE0NzQ4MzY0NykpCisgIChpcyAoPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1pMzIgdGhyaWZ0LWNyb3NzOjoqcHJvdCogLTIxNDc0ODM2NDgpIC0yMTQ3NDgzNjQ4KSkKKyAgKGlzICg9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWk2NCB0aHJpZnQtY3Jvc3M6Oipwcm90KiAwKSAwKSkKKyAgKGlzICg9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWk2NCB0aHJpZnQtY3Jvc3M6Oipwcm90KiA5MjIzMzcyMDM2ODU0Nzc1ODA3KSA5MjIzMzcyMDM2ODU0Nzc1ODA3KSkKKyAgKGlzICg9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWk2NCB0aHJpZnQtY3Jvc3M6Oipwcm90KiAtOTIyMzM3MjAzNjg1NDc3NTgwOCkgLTkyMjMzNzIwMzY4NTQ3NzU4MDgpKSkKKworKGRlZnRlc3QgZG91YmxlLXRlc3QgKCkKKyAgKGlzICg9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWRvdWJsZSB0aHJpZnQtY3Jvc3M6Oipwcm90KiAwLjApIDApKQorICAoaXMgKD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtZG91YmxlIHRocmlmdC1jcm9zczo6KnByb3QqIDQyLjApIDQyKSkKKyAgKGlzICg9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWRvdWJsZSB0aHJpZnQtY3Jvc3M6Oipwcm90KiAtNTU1LjApIC01NTUpKQorICAoaXMgKD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtZG91YmxlIHRocmlmdC1jcm9zczo6KnByb3QqIC01Mi4zNjc4KSAtNTIuMzY3OCkpKQorCisoZGVmdGVzdCBzdHJpbmctdGVzdCAoKQorICAoaXMgKHN0cmluZz0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3Qtc3RyaW5nIHRocmlmdC1jcm9zczo6KnByb3QqICIiKSAiIikpCisgIChpcyAoc3RyaW5nPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1zdHJpbmcgdGhyaWZ0LWNyb3NzOjoqcHJvdCogIihkZWZ1biBib3RzYnVpbGRib3RzICgpIChib3RzYnVpbHNib3RzKSkiKQorICAgICAgICAgICAgICAgIihkZWZ1biBib3RzYnVpbGRib3RzICgpIChib3RzYnVpbHNib3RzKSkiKSkKKyAgKGlzIChzdHJpbmc9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LXN0cmluZyB0aHJpZnQtY3Jvc3M6Oipwcm90KiAqbGFuZy1zdHJpbmcqKSAqbGFuZy1zdHJpbmcqKSkKKyAgKGlzIChzdHJpbmc9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LXN0cmluZyB0aHJpZnQtY3Jvc3M6Oipwcm90KiAqdHJpY2stc3RyaW5nKikgKnRyaWNrLXN0cmluZyopKSkKKworKGRlZnRlc3QgYmluYXJ5LXRlc3QgKCkKKyAgKGlzIChlcXVhbHAgKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtYmluYXJ5IHRocmlmdC1jcm9zczo6KnByb3QqICMoKSkgIygpKSkKKyAgKGlzIChlcXVhbHAgKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtYmluYXJ5IHRocmlmdC1jcm9zczo6KnByb3QqICpiaW5hcnktc2VxdWVuY2UqKSAqYmluYXJ5LXNlcXVlbmNlKikpKQorCisoZGVmdGVzdCBlbnVtLXRlc3QgKCkKKyAgKGlzICg9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWVudW0gdGhyaWZ0LWNyb3NzOjoqcHJvdCogdGhyaWZ0LnRlc3Q6bnVtYmVyei5maXZlKSB0aHJpZnQudGVzdDpudW1iZXJ6LmZpdmUpKQorICAoaXMgKD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtZW51bSB0aHJpZnQtY3Jvc3M6Oipwcm90KiB0aHJpZnQudGVzdDpudW1iZXJ6LmVpZ2h0KSB0aHJpZnQudGVzdDpudW1iZXJ6LmVpZ2h0KSkKKyAgKGlzICg9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWVudW0gdGhyaWZ0LWNyb3NzOjoqcHJvdCogdGhyaWZ0LnRlc3Q6bnVtYmVyei5vbmUpIHRocmlmdC50ZXN0Om51bWJlcnoub25lKSkpCisKKyhkZWZ0ZXN0IHR5cGVkZWYtdGVzdCAoKQorICAoaXMgKD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtdHlwZWRlZiB0aHJpZnQtY3Jvc3M6Oipwcm90KiAzMDk4NTgyMzUwODI1MjMpIDMwOTg1ODIzNTA4MjUyMykpKQorCisoZmlhc2NvOmRlZmluZS10ZXN0LXBhY2thZ2UgIzpzdHJ1Y3RzKQorCisoaW4tcGFja2FnZSAjOnN0cnVjdHMpCisKKyhkZWZwYXJhbWV0ZXIgKnRlc3Qtc3RydWN0KiAodGhyaWZ0LnRlc3Q6bWFrZS14dHJ1Y3QgOnN0cmluZy10aGluZyAiSGVsbCBpcyBlbXB0eS4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpieXRlLXRoaW5nIC0yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDppMzItdGhpbmcgNDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmk2NC10aGluZyA0MjQyNDI0MikpCisKKyhkZWZwYXJhbWV0ZXIgKnRlc3QtbmVzdCogKHRocmlmdC50ZXN0Om1ha2UteHRydWN0MiA6Ynl0ZS10aGluZyA0MgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpzdHJ1Y3QtdGhpbmcgKnRlc3Qtc3RydWN0KgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDppMzItdGhpbmcgLTQyKSkKKworKGRlZnRlc3Qgc3RydWN0LXRlc3QgKCkKKyAgKGxldCAoKHJlYy1zdHJ1Y3QgKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3Qtc3RydWN0IHRocmlmdC1jcm9zczo6KnByb3QqICp0ZXN0LXN0cnVjdCopKSkKKyAgICAoaXMgKHN0cmluZz0gKHRocmlmdC50ZXN0Onh0cnVjdC1zdHJpbmctdGhpbmcgKnRlc3Qtc3RydWN0KikKKyAgICAgICAgICAgICAgICAgKHRocmlmdC50ZXN0Onh0cnVjdC1zdHJpbmctdGhpbmcgcmVjLXN0cnVjdCkpKQorICAgIChpcyAoPSAodGhyaWZ0LnRlc3Q6eHRydWN0LWJ5dGUtdGhpbmcgKnRlc3Qtc3RydWN0KikKKyAgICAgICAgICAgKHRocmlmdC50ZXN0Onh0cnVjdC1ieXRlLXRoaW5nIHJlYy1zdHJ1Y3QpKSkKKyAgICAoaXMgKD0gKHRocmlmdC50ZXN0Onh0cnVjdC1pMzItdGhpbmcgKnRlc3Qtc3RydWN0KikKKyAgICAgICAgICAgKHRocmlmdC50ZXN0Onh0cnVjdC1pMzItdGhpbmcgcmVjLXN0cnVjdCkpKQorICAgIChpcyAoPSAodGhyaWZ0LnRlc3Q6eHRydWN0LWk2NC10aGluZyAqdGVzdC1zdHJ1Y3QqKQorICAgICAgICAgICAodGhyaWZ0LnRlc3Q6eHRydWN0LWk2NC10aGluZyByZWMtc3RydWN0KSkpKSkKKworKGRlZnRlc3QgbmVzdC10ZXN0ICgpCisgIChsZXQqICgocmVjLW5lc3QgKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtbmVzdCB0aHJpZnQtY3Jvc3M6Oipwcm90KiAqdGVzdC1uZXN0KikpCisgICAgICAgICAocmVjLXN0cnVjdCAodGhyaWZ0LnRlc3Q6eHRydWN0Mi1zdHJ1Y3QtdGhpbmcgcmVjLW5lc3QpKSkKKyAgICAoaXMgKHN0cmluZz0gKHRocmlmdC50ZXN0Onh0cnVjdC1zdHJpbmctdGhpbmcgKnRlc3Qtc3RydWN0KikKKyAgICAgICAgICAgICAgICAgKHRocmlmdC50ZXN0Onh0cnVjdC1zdHJpbmctdGhpbmcgcmVjLXN0cnVjdCkpKQorICAgIChpcyAoPSAodGhyaWZ0LnRlc3Q6eHRydWN0LWJ5dGUtdGhpbmcgKnRlc3Qtc3RydWN0KikKKyAgICAgICAgICAgKHRocmlmdC50ZXN0Onh0cnVjdC1ieXRlLXRoaW5nIHJlYy1zdHJ1Y3QpKSkKKyAgICAoaXMgKD0gKHRocmlmdC50ZXN0Onh0cnVjdC1pMzItdGhpbmcgKnRlc3Qtc3RydWN0KikKKyAgICAgICAgICAgKHRocmlmdC50ZXN0Onh0cnVjdC1pMzItdGhpbmcgcmVjLXN0cnVjdCkpKQorICAgIChpcyAoPSAodGhyaWZ0LnRlc3Q6eHRydWN0LWk2NC10aGluZyAqdGVzdC1zdHJ1Y3QqKQorICAgICAgICAgICAodGhyaWZ0LnRlc3Q6eHRydWN0LWk2NC10aGluZyByZWMtc3RydWN0KSkpCisgICAgKGlzICg9ICh0aHJpZnQudGVzdDp4dHJ1Y3QyLWJ5dGUtdGhpbmcgKnRlc3QtbmVzdCopCisgICAgICAgICAgICh0aHJpZnQudGVzdDp4dHJ1Y3QyLWJ5dGUtdGhpbmcgcmVjLW5lc3QpKSkKKyAgICAoaXMgKD0gKHRocmlmdC50ZXN0Onh0cnVjdDItaTMyLXRoaW5nICp0ZXN0LW5lc3QqKQorICAgICAgICAgICAodGhyaWZ0LnRlc3Q6eHRydWN0Mi1pMzItdGhpbmcgcmVjLW5lc3QpKSkpKQorCisoZmlhc2NvOmRlZmluZS10ZXN0LXBhY2thZ2UgIzpjb250YWluZXJzKQorCisoaW4tcGFja2FnZSAjOmNvbnRhaW5lcnMpCisKKyhkZWZ0ZXN0IGxpc3QtdGVzdCAoKQorICAoaXMgKG51bGwgKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtbGlzdCB0aHJpZnQtY3Jvc3M6Oipwcm90KiBuaWwpKSkKKyAgKGlzIChlcXVhbCAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1saXN0IHRocmlmdC1jcm9zczo6KnByb3QqICcoNDIgLTQyIDAgNSkpICcoNDIgLTQyIDAgNSkpKSkKKworKGRlZnRlc3Qgc2V0LXRlc3QgKCkKKyAgKGlzIChudWxsICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LXNldCB0aHJpZnQtY3Jvc3M6Oipwcm90KiBuaWwpKSkKKyAgKGlzIChlcXVhbCAoc29ydCAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1zZXQgdGhyaWZ0LWNyb3NzOjoqcHJvdCogKGxpc3QgNDIgLTQyIDAgNSkpICMnPCkKKyAgICAgICAgICAgICAnKC00MiAwIDUgNDIpKSkpCisKKyhkZWZ1biBtYXA9IChtYXAxIG1hcDIgJmtleSAoY2FyLXByZWRpY2F0ZSAjJ2VxdWFsKSAoY2RyLXByZWRpY2F0ZSAjJ2VxdWFsKSkKKyAgIkNvbXBhcmUgdHdvIGFzc29jIG1hcHMgYWNjb3JkaW5nIHRvIHRoZSBwcmVkaWNhdGVzIGdpdmVuLiIKKyAgKG5vdCAoc2V0LWV4Y2x1c2l2ZS1vciBtYXAxIG1hcDIgOnRlc3QgKGxhbWJkYSAoZWwxIGVsMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYW5kIChmdW5jYWxsIGNhci1wcmVkaWNhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjYXIgZWwxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNhciBlbDIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZ1bmNhbGwgY2RyLXByZWRpY2F0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNkciBlbDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2RyIGVsMikpKSkpKSkKKworKGRlZnRlc3QgbWFwLXRlc3QgKCkKKyAgKGlzIChudWxsICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LW1hcCB0aHJpZnQtY3Jvc3M6Oipwcm90KiBuaWwpKSkKKyAgKGlzIChtYXA9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LW1hcCB0aHJpZnQtY3Jvc3M6Oipwcm90KiAnKCgwIC4gMSkgKDQyIC4gLTQyKSAoNSAuIDUpKSkKKyAgICAgICAgICAgICcoKDAgLiAxKSAoNDIgLiAtNDIpICg1IC4gNSkpKSkKKyAgKGlzIChtYXA9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LW1hcC1tYXAgdGhyaWZ0LWNyb3NzOjoqcHJvdCogNDIpCisgICAgICAgICAgICAnKCgtNCAuICgoLTQgLiAtNCkgKC0zIC4gLTMpICgtMiAuIC0yKSAoLTEgLiAtMSkpKQorICAgICAgICAgICAgICAoNCAuICgoMSAuIDEpICgyIC4gMikgKDMgLiAzKSAoNCAuIDQpKSkpCisgICAgICAgICAgICA6Y2RyLXByZWRpY2F0ZSAjJ21hcD0pKSkKKworKGZpYXNjbzpkZWZpbmUtdGVzdC1wYWNrYWdlICM6ZXhjZXB0aW9ucykKKworKGluLXBhY2thZ2UgIzpleGNlcHRpb25zKQorCisoZGVmdW4gdGVzdC14Y2VwdGlvbiAoZXhwZWN0ZWQtY29kZSBleHBlY3RlZC1tZXNzYWdlIGZ1bmN0aW9uICZyZXN0IGFyZ3MpCisgICJBIGhlbHBlciBmdW5jdGlvbiB0byB0ZXN0IHdoZXRoZXIgeGNlcHRpb24gaXMgc2lnbmFsbGVkLCBhbmQgd2hldGhlciBpdHMgZmllbGRzIGhhdmUgdGhlIGV4cGVjdGVkIHZhbHVlcy4iCisgIChoYW5kbGVyLWNhc2UgKHByb2duIChhcHBseSBmdW5jdGlvbiBhcmdzKQorICAgICAgICAgICAgICAgICAgICAgICBuaWwpCisgICAgKHRocmlmdC50ZXN0OnhjZXB0aW9uIChleCkgKGFuZCAoPSAodGhyaWZ0LnRlc3Q6OnhjZXB0aW9uLWVycm9yLWNvZGUgZXgpIGV4cGVjdGVkLWNvZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyaW5nPSAodGhyaWZ0LnRlc3Q6OnhjZXB0aW9uLW1lc3NhZ2UgZXgpIGV4cGVjdGVkLW1lc3NhZ2UpKSkpKQorCisoZGVmdW4gdGVzdC14Y2VwdGlvbjIgKGV4cGVjdGVkLWNvZGUgZXhwZWN0ZWQtbWVzc2FnZSBmdW5jdGlvbiAmcmVzdCBhcmdzKQorICAiQSBoZWxwZXIgZnVuY3Rpb24gdG8gdGVzdCB3aGV0aGVyIHhjZXB0aW9uMiBpcyBzaWduYWxsZWQsIGFuZCB3aGV0aGVyIGl0cyBmaWVsZHMgaGF2ZSB0aGUgZXhwZWN0ZWQgdmFsdWVzLiIKKyAgKGhhbmRsZXItY2FzZSAocHJvZ24gKGFwcGx5IGZ1bmN0aW9uIGFyZ3MpCisgICAgICAgICAgICAgICAgICAgICAgIG5pbCkKKyAgICAodGhyaWZ0LnRlc3Q6eGNlcHRpb24yIChleCkgKGFuZCAoPSAodGhyaWZ0LnRlc3Q6OnhjZXB0aW9uMi1lcnJvci1jb2RlIGV4KSBleHBlY3RlZC1jb2RlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJpbmc9ICh0aHJpZnQudGVzdDo6eHRydWN0LXN0cmluZy10aGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhyaWZ0LnRlc3Q6OnhjZXB0aW9uMi1zdHJ1Y3QtdGhpbmcgZXgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLW1lc3NhZ2UpKSkpKQorCisoZGVmdGVzdCBleGNlcHRpb24tdGVzdCAoKQorICAoaXMgKHRlc3QteGNlcHRpb24gMTAwMSAiWGNlcHRpb24iICMndGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1leGNlcHRpb24gdGhyaWZ0LWNyb3NzOjoqcHJvdCogIlhjZXB0aW9uIikpCisgIChzaWduYWxzIHRocmlmdDphcHBsaWNhdGlvbi1lcnJvciAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1leGNlcHRpb24gdGhyaWZ0LWNyb3NzOjoqcHJvdCogIlRFeGNlcHRpb24iKSkKKyAgKGZpbmlzaGVzICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWV4Y2VwdGlvbiB0aHJpZnQtY3Jvc3M6Oipwcm90KiAic3VjY2VzcyIpKSkKKworKGRlZnRlc3QgbXVsdGktZXhjZXB0aW9uLXRlc3QgKCkKKyAgKGlzICh0ZXN0LXhjZXB0aW9uIDEwMDEKKyAgICAgICAgICAgICAgICAgICAgICJUaGlzIGlzIGFuIFhjZXB0aW9uIgorICAgICAgICAgICAgICAgICAgICAgIyd0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LW11bHRpLWV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgdGhyaWZ0LWNyb3NzOjoqcHJvdCoKKyAgICAgICAgICAgICAgICAgICAgICJYY2VwdGlvbiIKKyAgICAgICAgICAgICAgICAgICAgICJtZWFuaW5nbGVzcyIpKQorICAoaXMgKHRlc3QteGNlcHRpb24yIDIwMDIKKyAgICAgICAgICAgICAgICAgICAgICAiVGhpcyBpcyBhbiBYY2VwdGlvbjIiCisgICAgICAgICAgICAgICAgICAgICAgIyd0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LW11bHRpLWV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgIHRocmlmdC1jcm9zczo6KnByb3QqCisgICAgICAgICAgICAgICAgICAgICAgIlhjZXB0aW9uMiIKKyAgICAgICAgICAgICAgICAgICAgICAibWVhbmluZ2xlc3MgdG9vISIpKQorICAoaXMgKHN0cmluZz0gImZvb2JhciIgKHRocmlmdC50ZXN0Onh0cnVjdC1zdHJpbmctdGhpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1tdWx0aS1leGNlcHRpb24gdGhyaWZ0LWNyb3NzOjoqcHJvdCoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN1Y2Nlc3MhIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9vYmFyIikpKSkpCisKKyhmaWFzY286ZGVmaW5lLXRlc3QtcGFja2FnZSAjOm1pc2MpCisKKyhpbi1wYWNrYWdlICM6bWlzYykKKworKGRlZnRlc3Qgb25ld2F5LXRlc3QgKCkKKyAgKGlzIChudWxsICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LW9uZXdheSB0aHJpZnQtY3Jvc3M6Oipwcm90KiAxKSkpKQorCisoZmlhc2NvOmRlZmluZS10ZXN0LXBhY2thZ2UgIzptdWx0aXBsZXgpCisKKyhpbi1wYWNrYWdlICM6bXVsdGlwbGV4KQorCisoZGVmdGVzdCBtdWx0aXBsZXgtdGVzdCAoKQorICA7OyBSZW1vdmVkIGZyb20gdGhlIElETCBkZWZpbml0aW9uLgorICA7OyAoZmluaXNoZXMgKHRocmlmdC50ZXN0LnNlY29uZC1zZXJ2aWNlOmJsYWgtYmxhaCB0aHJpZnQtY3Jvc3M6Oipwcm90KikpCisgIChpcyAoc3RyaW5nPSAiYXNkIiAodGhyaWZ0LnRlc3Quc2Vjb25kLXNlcnZpY2U6c2Vjb25kdGVzdC1zdHJpbmcgdGhyaWZ0LWNyb3NzOjoqcHJvdCogImFzZCIpKSkpCmRpZmYgLS1naXQgYS90ZXN0L2NwcC9DTWFrZUxpc3RzLnR4dCBiL3Rlc3QvY3BwL0NNYWtlTGlzdHMudHh0CmluZGV4IDJkNzVmMmUuLjk1ZDI5OTEgMTAwNzU1Ci0tLSBhL3Rlc3QvY3BwL0NNYWtlTGlzdHMudHh0CisrKyBiL3Rlc3QvY3BwL0NNYWtlTGlzdHMudHh0CkBAIC0yMCw4ICsyMCw2IEBACiAjIENvbnRhaW5zIHRoZSB0aHJpZnQgc3BlY2lmaWMgTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZCiBpbmNsdWRlKFRocmlmdE1hY3JvcykKIAotc2V0KEJvb3N0X1VTRV9TVEFUSUNfTElCUyBPTikKLWZpbmRfcGFja2FnZShCb29zdCAxLjUzLjAgUkVRVUlSRUQgQ09NUE9ORU5UUyBwcm9ncmFtX29wdGlvbnMgc3lzdGVtIGZpbGVzeXN0ZW0pCiBpbmNsdWRlX2RpcmVjdG9yaWVzKFNZU1RFTSAiJHtCb29zdF9JTkNMVURFX0RJUlN9IikKIAogZmluZF9wYWNrYWdlKE9wZW5TU0wgUkVRVUlSRUQpCkBAIC0zMCwxMyArMjgsMTYgQEAKIGZpbmRfcGFja2FnZShMaWJldmVudCBSRVFVSVJFRCkgICMgTGliZXZlbnQgY29tZXMgd2l0aCBDTWFrZSBzdXBwb3J0IGZyb20gdXBzdHJlYW0KIGluY2x1ZGVfZGlyZWN0b3JpZXMoU1lTVEVNICR7TElCRVZFTlRfSU5DTFVERV9ESVJTfSkKIAorZmluZF9wYWNrYWdlKFpMSUIgUkVRVUlSRUQpCitpbmNsdWRlX2RpcmVjdG9yaWVzKFNZU1RFTSAke1pMSUJfSU5DTFVERV9ESVJTfSkKKwogI01ha2Ugc3VyZSBnZW4tY3BwIGZpbGVzIGNhbiBiZSBpbmNsdWRlZAogaW5jbHVkZV9kaXJlY3RvcmllcygiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9IikKIGluY2x1ZGVfZGlyZWN0b3JpZXMoIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4tY3BwIikKIGluY2x1ZGVfZGlyZWN0b3JpZXMoIiR7UFJPSkVDVF9TT1VSQ0VfRElSfS9saWIvY3BwL3NyYyIpCiAKLQogc2V0KGNyb3NzdGVzdGdlbmNwcF9TT1VSQ0VTCisgICAgZ2VuLWNwcC9TZWNvbmRTZXJ2aWNlLmNwcAogICAgIGdlbi1jcHAvVGhyaWZ0VGVzdC5jcHAKICAgICBnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuY3BwCiAgICAgZ2VuLWNwcC9UaHJpZnRUZXN0X2NvbnN0YW50cy5jcHAKQEAgLTQ3LDcgKzQ4LDcgQEAKIAogc2V0KGNyb3Nzc3RyZXNzZ2VuY3BwX1NPVVJDRVMKICAgICBnZW4tY3BwL1NlcnZpY2UuY3BwCi0gICAgI2dlbi1jcHAvU3RyZXNzVGVzdF90eXBlcy5jcHAgI2Jhc2ljYWxseSBlbXB0eSwgc28gb21pdHRpbmcKKyAgICBnZW4tY3BwL1N0cmVzc1Rlc3RfdHlwZXMuY3BwCiAgICAgZ2VuLWNwcC9TdHJlc3NUZXN0X2NvbnN0YW50cy5jcHAKICkKIGFkZF9saWJyYXJ5KGNyb3Nzc3RyZXNzZ2VuY3BwIFNUQVRJQyAke2Nyb3Nzc3RyZXNzZ2VuY3BwX1NPVVJDRVN9KQpAQCAtNTcsMTEgKzU4LDEzIEBACiB0YXJnZXRfbGlua19saWJyYXJpZXMoVGVzdFNlcnZlciBjcm9zc3Rlc3RnZW5jcHAgJHtCb29zdF9MSUJSQVJJRVN9ICR7TElCRVZFTlRfTElCfSkKIExJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUZXN0U2VydmVyIHRocmlmdCkKIExJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUZXN0U2VydmVyIHRocmlmdG5iKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFRlc3RTZXJ2ZXIgdGhyaWZ0eikKIAogYWRkX2V4ZWN1dGFibGUoVGVzdENsaWVudCBzcmMvVGVzdENsaWVudC5jcHApCiB0YXJnZXRfbGlua19saWJyYXJpZXMoVGVzdENsaWVudCBjcm9zc3Rlc3RnZW5jcHAgJHtCb29zdF9MSUJSQVJJRVN9ICR7TElCRVZFTlRfTElCfSkKIExJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUZXN0Q2xpZW50IHRocmlmdCkKIExJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUZXN0Q2xpZW50IHRocmlmdG5iKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFRlc3RDbGllbnQgdGhyaWZ0eikKIAogYWRkX2V4ZWN1dGFibGUoU3RyZXNzVGVzdCBzcmMvU3RyZXNzVGVzdC5jcHApCiB0YXJnZXRfbGlua19saWJyYXJpZXMoU3RyZXNzVGVzdCBjcm9zc3N0cmVzc2dlbmNwcCAke0Jvb3N0X0xJQlJBUklFU30gJHtMSUJFVkVOVF9MSUJ9KQpAQCAtODAsMTAgKzgzLDEwIEBACiAjIENvbW1vbiB0aHJpZnQgY29kZSBnZW5lcmF0aW9uIHJ1bGVzCiAjCiAKLWFkZF9jdXN0b21fY29tbWFuZChPVVRQVVQgZ2VuLWNwcC9UaHJpZnRUZXN0LmNwcCBnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuY3BwIGdlbi1jcHAvVGhyaWZ0VGVzdF9jb25zdGFudHMuY3BwCi0gICAgQ09NTUFORCB0aHJpZnQtY29tcGlsZXIgLS1nZW4gY3BwOnRlbXBsYXRlcyxjb2Jfc3R5bGUgLXIgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKK2FkZF9jdXN0b21fY29tbWFuZChPVVRQVVQgZ2VuLWNwcC9TZWNvbmRTZXJ2aWNlLmNwcCBnZW4tY3BwL1NlY29uZFNlcnZpY2UuaCBnZW4tY3BwL1RocmlmdFRlc3QuY3BwIGdlbi1jcHAvVGhyaWZ0VGVzdC5oIGdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5jcHAgZ2VuLWNwcC9UaHJpZnRUZXN0X2NvbnN0YW50cy5jcHAKKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBjcHA6dGVtcGxhdGVzLGNvYl9zdHlsZSAtciAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAogKQogCiBhZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUIGdlbi1jcHAvU3RyZXNzVGVzdF90eXBlcy5jcHAgZ2VuLWNwcC9TdHJlc3NUZXN0X2NvbnN0YW50cy5jcHAgZ2VuLWNwcC9TZXJ2aWNlLmNwcAotICAgIENPTU1BTkQgdGhyaWZ0LWNvbXBpbGVyIC0tZ2VuIGNwcCAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9TdHJlc3NUZXN0LnRocmlmdAorICAgIENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGNwcCAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9TdHJlc3NUZXN0LnRocmlmdAogKQpkaWZmIC0tZ2l0IGEvdGVzdC9jcHAvTWFrZWZpbGUuYW0gYi90ZXN0L2NwcC9NYWtlZmlsZS5hbQppbmRleCA4OWZlZDhmLi5lOGJlODBhIDEwMDc1NQotLS0gYS90ZXN0L2NwcC9NYWtlZmlsZS5hbQorKysgYi90ZXN0L2NwcC9NYWtlZmlsZS5hbQpAQCAtMjEsMTIgKzIxLDE2IEBACiBCVUlMVF9TT1VSQ0VTID0gZ2VuLWNwcC9UaHJpZnRUZXN0LmNwcCBcCiAgICAgICAgICAgICAgICAgZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmNwcCBcCiAgICAgICAgICAgICAgICAgZ2VuLWNwcC9UaHJpZnRUZXN0X2NvbnN0YW50cy5jcHAgXAorICAgICAgICAgICAgICAgIGdlbi1jcHAvU2Vjb25kU2VydmljZS5jcHAgXAogICAgICAgICAgICAgICAgIGdlbi1jcHAvU3RyZXNzVGVzdF90eXBlcy5jcHAgXAogICAgICAgICAgICAgICAgIGdlbi1jcHAvU3RyZXNzVGVzdF9jb25zdGFudHMuY3BwIFwKICAgICAgICAgICAgICAgICBnZW4tY3BwL1NlcnZpY2UuY3BwCiAKIG5vaW5zdF9MVExJQlJBUklFUyA9IGxpYnRlc3RnZW5jcHAubGEgbGlic3RyZXNzdGVzdGdlbmNwcC5sYQogbm9kaXN0X2xpYnRlc3RnZW5jcHBfbGFfU09VUkNFUyA9IFwKKwlnZW4tY3BwL1NlY29uZFNlcnZpY2UuY3BwIFwKKwlnZW4tY3BwL1NlY29uZFNlcnZpY2UuaCBcCisJZ2VuLWNwcC9TZWNvbmRTZXJ2aWNlLnRjYyBcCiAJZ2VuLWNwcC9UaHJpZnRUZXN0X2NvbnN0YW50cy5jcHAgXAogCWdlbi1jcHAvVGhyaWZ0VGVzdF9jb25zdGFudHMuaCBcCiAJZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmNwcCBcCkBAIC02OSw3ICs3Myw3IEBACiAJJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0LmxhIFwKIAkkKHRvcF9idWlsZGRpcikvbGliL2NwcC9saWJ0aHJpZnR6LmxhIFwKIAkkKHRvcF9idWlsZGRpcikvbGliL2NwcC9saWJ0aHJpZnRuYi5sYSBcCi0JLWxldmVudCAtbGJvb3N0X3Byb2dyYW1fb3B0aW9ucyAtbGJvb3N0X3N5c3RlbSAtbGJvb3N0X2ZpbGVzeXN0ZW0KKwktbGV2ZW50IC1sYm9vc3RfcHJvZ3JhbV9vcHRpb25zIC1sYm9vc3Rfc3lzdGVtIC1sYm9vc3RfZmlsZXN5c3RlbSAkKFpMSUJfTElCUykKIAogVGVzdENsaWVudF9TT1VSQ0VTID0gXAogCXNyYy9UZXN0Q2xpZW50LmNwcApAQCAtNzksNyArODMsNyBAQAogCSQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdC5sYSBcCiAJJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0ei5sYSBcCiAJJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0bmIubGEgXAotCS1sZXZlbnQgLWxib29zdF9wcm9ncmFtX29wdGlvbnMgLWxib29zdF9zeXN0ZW0gLWxib29zdF9maWxlc3lzdGVtCisJLWxldmVudCAtbGJvb3N0X3Byb2dyYW1fb3B0aW9ucyAtbGJvb3N0X3N5c3RlbSAtbGJvb3N0X2ZpbGVzeXN0ZW0gJChaTElCX0xJQlMpCiAKIFN0cmVzc1Rlc3RfU09VUkNFUyA9IFwKIAlzcmMvU3RyZXNzVGVzdC5jcHAKQEAgLTk4LDIwICsxMDIsMTggQEAKICMKICMgQ29tbW9uIHRocmlmdCBjb2RlIGdlbmVyYXRpb24gcnVsZXMKICMKLVRIUklGVCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0Ci0KLWdlbi1jcHAvVGhyaWZ0VGVzdC5jcHAgZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmNwcCBnZW4tY3BwL1RocmlmdFRlc3RfY29uc3RhbnRzLmNwcDogJCh0b3Bfc3JjZGlyKS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CitnZW4tY3BwL1RocmlmdFRlc3QuY3BwIGdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5jcHAgZ2VuLWNwcC9UaHJpZnRUZXN0X2NvbnN0YW50cy5jcHAgZ2VuLWNwcC9TZWNvbmRTZXJ2aWNlLmNwcCBnZW4tY3BwL1NlY29uZFNlcnZpY2UuaCBnZW4tY3BwL1NlY29uZFNlcnZpY2UudGNjOiAkKHRvcF9zcmNkaXIpL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQgJChUSFJJRlQpCiAJJChUSFJJRlQpIC0tZ2VuIGNwcDp0ZW1wbGF0ZXMsY29iX3N0eWxlIC1yICQ8CiAKLWdlbi1jcHAvU3RyZXNzVGVzdF90eXBlcy5jcHAgZ2VuLWNwcC9TdHJlc3NUZXN0X2NvbnN0YW50cy5jcHAgZ2VuLWNwcC9TZXJ2aWNlLmNwcDogJCh0b3Bfc3JjZGlyKS90ZXN0L1N0cmVzc1Rlc3QudGhyaWZ0CitnZW4tY3BwL1N0cmVzc1Rlc3RfdHlwZXMuY3BwIGdlbi1jcHAvU3RyZXNzVGVzdF9jb25zdGFudHMuY3BwIGdlbi1jcHAvU2VydmljZS5jcHA6ICQodG9wX3NyY2RpcikvdGVzdC9TdHJlc3NUZXN0LnRocmlmdCAkKFRIUklGVCkKIAkkKFRIUklGVCkgLS1nZW4gY3BwICQ8CiAKIEFNX0NQUEZMQUdTID0gJChCT09TVF9DUFBGTEFHUykgJChMSUJFVkVOVF9DUFBGTEFHUykgLUkkKHRvcF9zcmNkaXIpL2xpYi9jcHAvc3JjIC1JZ2VuLWNwcAotQU1fQ1hYRkxBR1MgPSAtV2FsbCAtV2V4dHJhIC1wZWRhbnRpYworQU1fQ1hYRkxBR1MgPSAtV2FsbCAtV2V4dHJhIC1wZWRhbnRpYyAtRF9fU1REQ19GT1JNQVRfTUFDUk9TIC1EX19TVERDX0xJTUlUX01BQ1JPUwogQU1fTERGTEFHUyA9ICQoQk9PU1RfTERGTEFHUykgJChMSUJFVkVOVF9MREZMQUdTKSAkKFpMSUJfTElCUykKIAogY2xlYW4tbG9jYWw6Ci0JJChSTSkgLXIgZ2VuLWNwcAorCSQoUk0pIGdlbi1jcHAvKgogCiBzdHlsZS1sb2NhbDoKIAkkKENQUFNUWUxFX0NNRCkKQEAgLTEyMCw2ICsxMjIsNCBAQAogCXNyYy9UZXN0Q2xpZW50LmNwcCBcCiAJc3JjL1Rlc3RTZXJ2ZXIuY3BwIFwKIAlzcmMvU3RyZXNzVGVzdC5jcHAgXAotCXNyYy9TdHJlc3NUZXN0Tm9uQmxvY2tpbmcuY3BwIFwKLQlyZWFsbG9jL3JlYWxsb2NfdGVzdC5jIFwKLQlyZWFsbG9jL01ha2VmaWxlCisJc3JjL1N0cmVzc1Rlc3ROb25CbG9ja2luZy5jcHAKZGlmZiAtLWdpdCBhL3Rlc3QvY3BwL3JlYWxsb2MvTWFrZWZpbGUgYi90ZXN0L2NwcC9yZWFsbG9jL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODliYmIzLi4wMDAwMDAwCi0tLSBhL3Rlc3QvY3BwL3JlYWxsb2MvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotIyBUaGlzIHByb2JhYmx5IHNob3VsZCBub3QgZ28gaW50byAibWFrZSBjaGVjayIsIGJlY2F1c2UgaXQgaXMgYW4gZXhwZXJpbWVudCwKLSMgbm90IGEgdGVzdC4gIFNwZWNpZmljYWxseSwgaXQgaXMgbWVhbnQgdG8gZGV0ZXJtaW5lIGhvdyBsaWtlbHkgcmVhbGxvYyBpcwotIyB0byBhdm9pZCBhIGNvcHkuICBUaGlzIGlzIHBvb3JseSBkb2N1bWVudGVkLgotCi1ydW46IHJlYWxsb2NfdGVzdAotCWZvciBpdCBpbiAxIDQgNjQgOyBkbyBcCi0JCWZvciBuYiBpbiAxIDggNjQgNTEyIDsgZG8gXAotCQkJZm9yIG1pbnMgaW4gNjQgNTEyIDsgZG8gXAotCQkJCWZvciBtYXhzIGluIDIwNDggMjYyMTQ0IDsgZG8gXAotCQkJCQlmb3IgZGIgaW4gOCA2NCA7IGRvIFwKLQkJCQkJCS4vcmVhbGxvY190ZXN0ICQkbmIgJCRtaW5zICQkbWF4cyAkJGRiICQkaXQgXAotCQkJCQk7IGRvbmUgXAotCQkJCTsgZG9uZSBcCi0JCQk7IGRvbmUgXAotCQk7IGRvbmUgXAotCTsgZG9uZSBcCi0JPiByYXdfc3RhdHMKLQotQ0ZMQUdTID0gLVdhbGwgLWcgLXN0ZD1jOTkKLUxETElCUyA9IC1sZGwKLXJlYWxsb2NfdGVzdDogcmVhbGxvY190ZXN0LmMKZGlmZiAtLWdpdCBhL3Rlc3QvY3BwL3JlYWxsb2MvcmVhbGxvY190ZXN0LmMgYi90ZXN0L2NwcC9yZWFsbG9jL3JlYWxsb2NfdGVzdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTc2M2FkLi4wMDAwMDAwCi0tLSBhL3Rlc3QvY3BwL3JlYWxsb2MvcmVhbGxvY190ZXN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIF9HTlVfU09VUkNFCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8ZGxmY24uaD4KLQotaW50IGNvcGllczsKLWludCBub25fY29waWVzOwotCi12b2lkICpyZWFsbG9jKHZvaWQgKnB0ciwgc2l6ZV90IHNpemUpIHsKLSAgc3RhdGljIHZvaWQgKigqcmVhbF9yZWFsbG9jKSh2b2lkKiwgc2l6ZV90KSA9IE5VTEw7Ci0gIGlmIChyZWFsX3JlYWxsb2MgPT0gTlVMTCkgewotICAgIHJlYWxfcmVhbGxvYyA9ICh2b2lkKiAoKikgKHZvaWQqLCBzaXplX3QpKSBkbHN5bShSVExEX05FWFQsICJyZWFsbG9jIik7Ci0gIH0KLQotICB2b2lkICpyZXRfcHRyID0gKCpyZWFsX3JlYWxsb2MpKHB0ciwgc2l6ZSk7Ci0KLSAgaWYgKHJldF9wdHIgPT0gcHRyKSB7Ci0gICAgbm9uX2NvcGllcysrOwotICB9IGVsc2UgewotICAgIGNvcGllcysrOwotICB9Ci0KLSAgcmV0dXJuIHJldF9wdHI7Ci19Ci0KLQotc3RydWN0IFRNZW1vcnlCdWZmZXIgewotICB2b2lkKiBwdHI7Ci0gIGludCBzaXplOwotfTsKLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgewotICBpbnQgbnVtX2J1ZmZlcnM7Ci0gIGludCBpbml0X3NpemU7Ci0gIGludCBtYXhfc2l6ZTsKLSAgaW50IGRvdWJsaW5nczsKLSAgaW50IGl0ZXJhdGlvbnM7Ci0KLSAgaWYgKGFyZ2MgPCA2IHx8Ci0gICAgICBhcmdjID4gNyB8fAotICAgICAgKG51bV9idWZmZXJzID0gYXRvaShhcmd2WzFdKSkgPT0gMCB8fAotICAgICAgKGluaXRfc2l6ZSA9IGF0b2koYXJndlsyXSkpID09IDAgfHwKLSAgICAgIChtYXhfc2l6ZSA9IGF0b2koYXJndlszXSkpID09IDAgfHwKLSAgICAgIGluaXRfc2l6ZSA+IG1heF9zaXplIHx8Ci0gICAgICAoaXRlcmF0aW9ucyA9IGF0b2koYXJndls0XSkpID09IDAgfHwKLSAgICAgIChkb3VibGluZ3MgPSBhdG9pKGFyZ3ZbNV0pKSA9PSAwIHx8Ci0gICAgICAoYXJnYyA9PSA3ICYmIGF0b2koYXJndls2XSkgPT0gMCkpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiByZWFsbG9jX3Rlc3QgPG51bV9idWZmZXJzPiA8aW5pdF9zaXplPiA8bWF4X3NpemU+IDxkb3VibGluZ3M+IDxpdGVyYXRpb25zPiBbc2VlZF1cbiIpOwotICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKLSAgfQotCi0gIGZvciAoIGludCBpID0gMCA7IGkgPCBhcmdjIDsgaSsrICkgewotICAgIHByaW50ZigiJXMgIiwgYXJndltpXSk7Ci0gIH0KLSAgcHJpbnRmKCJcbiIpOwotCi0gIGlmIChhcmdjID09IDcpIHsKLSAgICBzcmFuZChhdG9pKGFyZ3ZbNl0pKTsKLSAgfSBlbHNlIHsKLSAgICBzcmFuZCh0aW1lKE5VTEwpKTsKLSAgfQotCi0gIHN0cnVjdCBUTWVtb3J5QnVmZmVyKiBidWZmZXJzID0gY2FsbG9jKG51bV9idWZmZXJzLCBzaXplb2YoKmJ1ZmZlcnMpKTsKLSAgaWYgKGJ1ZmZlcnMgPT0gTlVMTCkgYWJvcnQoKTsKLQotICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgbnVtX2J1ZmZlcnMgOyBpKysgKSB7Ci0gICAgYnVmZmVyc1tpXS5zaXplID0gbWF4X3NpemU7Ci0gIH0KLQotICB3aGlsZSAoaXRlcmF0aW9ucyAtLT4gMCkgewotICAgIGZvciAoIGludCBpID0gMCA7IGkgPCBkb3VibGluZ3MgKiBudW1fYnVmZmVycyA7IGkrKyApIHsKLSAgICAgIHN0cnVjdCBUTWVtb3J5QnVmZmVyKiBidWYgPSAmYnVmZmVyc1tyYW5kKCkgJSBudW1fYnVmZmVyc107Ci0gICAgICBidWYtPnNpemUgKj0gMjsKLSAgICAgIGlmIChidWYtPnNpemUgPD0gbWF4X3NpemUpIHsKLSAgICAgICAgYnVmLT5wdHIgPSByZWFsbG9jKGJ1Zi0+cHRyLCBidWYtPnNpemUpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZnJlZShidWYtPnB0cik7Ci0gICAgICAgIGJ1Zi0+c2l6ZSA9IGluaXRfc2l6ZTsKLSAgICAgICAgYnVmLT5wdHIgPSBtYWxsb2MoYnVmLT5zaXplKTsKLSAgICAgIH0KLSAgICAgIGlmIChidWYtPnB0ciA9PSBOVUxMKSBhYm9ydCgpOwotICAgIH0KLSAgfQotCi0gIHByaW50ZigiTm9uLWNvcGllZCAlZC8lZCAoJS4yZiUlKVxuIiwgbm9uX2NvcGllcywgY29waWVzICsgbm9uX2NvcGllcywgMTAwLjAgKiBub25fY29waWVzIC8gKGNvcGllcyArIG5vbl9jb3BpZXMpKTsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS90ZXN0L2NwcC9zcmMvU3RyZXNzVGVzdC5jcHAgYi90ZXN0L2NwcC9zcmMvU3RyZXNzVGVzdC5jcHAKaW5kZXggOTM3MWJjZS4uNTg1Zjg5YSAxMDA2NDQKLS0tIGEvdGVzdC9jcHAvc3JjL1N0cmVzc1Rlc3QuY3BwCisrKyBiL3Rlc3QvY3BwL3NyYy9TdHJlc3NUZXN0LmNwcApAQCAtMTA3LDggKzEwNyw4IEBACiB9OwogY2xhc3MgQ2xpZW50VGhyZWFkIDogcHVibGljIFJ1bm5hYmxlIHsKIHB1YmxpYzoKLSAgQ2xpZW50VGhyZWFkKGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFNlcnZpY2VJZj4gY2xpZW50LAorICBDbGllbnRUaHJlYWQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxTZXJ2aWNlSWY+IGNsaWVudCwKICAgICAgICAgICAgICAgIE1vbml0b3ImIG1vbml0b3IsCiAgICAgICAgICAgICAgICBzaXplX3QmIHdvcmtlckNvdW50LAogICAgICAgICAgICAgICAgc2l6ZV90IGxvb3BDb3VudCwKQEAgLTIyNCw4ICsyMjQsOCBAQAogICAgIH0KICAgfQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IF90cmFuc3BvcnQ7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFNlcnZpY2VJZj4gX2NsaWVudDsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IF90cmFuc3BvcnQ7CisgIHN0ZDo6c2hhcmVkX3B0cjxTZXJ2aWNlSWY+IF9jbGllbnQ7CiAgIE1vbml0b3ImIF9tb25pdG9yOwogICBzaXplX3QmIF93b3JrZXJDb3VudDsKICAgc2l6ZV90IF9sb29wQ291bnQ7CkBAIC0yODUsMTQgKzI4NSwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXJ2ZXIgb25seS4gIERlZmF1bHQgaXMgIiA8PCBjbGllbnRDb3VudCA8PCBlbmRsCiAgICAgICAgIDw8ICJcdGhlbHAgICAgICAgICAgIFByaW50cyB0aGlzIGhlbHAgdGV4dC4iIDw8IGVuZGwKICAgICAgICAgPDwgIlx0Y2FsbCAgICAgICAgICAgU2VydmljZSBtZXRob2QgdG8gY2FsbC4gIERlZmF1bHQgaXMgIiA8PCBjYWxsTmFtZSA8PCBlbmRsCi0gICAgICAgIDw8ICJcdGxvb3AgICAgICAgICAgIFRoZSBudW1iZXIgb2YgcmVtb3RlIHRocmlmdCBjYWxscyBlYWNoIGNsaWVudCBtYWtlcy4gIERlZmF1bHQgaXMgIiA8PCBsb29wQ291bnQgPDwgZW5kbCAKKyAgICAgICAgPDwgIlx0bG9vcCAgICAgICAgICAgVGhlIG51bWJlciBvZiByZW1vdGUgdGhyaWZ0IGNhbGxzIGVhY2ggY2xpZW50IG1ha2VzLiAgRGVmYXVsdCBpcyAiIDw8IGxvb3BDb3VudCA8PCBlbmRsCiAgICAgICAgIDw8ICJcdHBvcnQgICAgICAgICAgIFRoZSBwb3J0IHRoZSBzZXJ2ZXIgYW5kIGNsaWVudHMgc2hvdWxkIGJpbmQgdG8gIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb3IgdGhyaWZ0IG5ldHdvcmsgY29ubmVjdGlvbnMuICBEZWZhdWx0IGlzICIgPDwgcG9ydCA8PCBlbmRsCi0gICAgICAgIDw8ICJcdHNlcnZlciAgICAgICAgIFJ1biB0aGUgVGhyaWZ0IHNlcnZlciBpbiB0aGlzIHByb2Nlc3MuICBEZWZhdWx0IGlzICIgPDwgcnVuU2VydmVyIDw8IGVuZGwgCisgICAgICAgIDw8ICJcdHNlcnZlciAgICAgICAgIFJ1biB0aGUgVGhyaWZ0IHNlcnZlciBpbiB0aGlzIHByb2Nlc3MuICBEZWZhdWx0IGlzICIgPDwgcnVuU2VydmVyIDw8IGVuZGwKICAgICAgICAgPDwgIlx0c2VydmVyLXR5cGUgICAgVHlwZSBvZiBzZXJ2ZXIsIFwic2ltcGxlXCIgb3IgXCJ0aHJlYWQtcG9vbFwiLiAgRGVmYXVsdCBpcyAiIDw8IHNlcnZlclR5cGUgPDwgZW5kbAogICAgICAgICA8PCAiXHRwcm90b2NvbC10eXBlICBUeXBlIG9mIHByb3RvY29sLCBcImJpbmFyeVwiLCBcImFzY2lpXCIsIG9yIFwieG1sXCIuICBEZWZhdWx0IGlzICIgPDwgcHJvdG9jb2xUeXBlIDw8IGVuZGwKLSAgICAgICAgPDwgIlx0bG9nLXJlcXVlc3QgICAgTG9nIGFsbCByZXF1ZXN0IHRvIC4vcmVxdWVzdGxvZy50bG9nLiBEZWZhdWx0IGlzICIgPDwgbG9nUmVxdWVzdHMgPDwgZW5kbCAKLSAgICAgICAgPDwgIlx0cmVwbGF5LXJlcXVlc3QgUmVwbGF5IHJlcXVlc3RzIGZyb20gbG9nIGZpbGUgKC4vcmVxdWVzdGxvZy50bG9nKSBEZWZhdWx0IGlzICIgPDwgcmVwbGF5UmVxdWVzdHMgPDwgZW5kbCAKKyAgICAgICAgPDwgIlx0bG9nLXJlcXVlc3QgICAgTG9nIGFsbCByZXF1ZXN0IHRvIC4vcmVxdWVzdGxvZy50bG9nLiBEZWZhdWx0IGlzICIgPDwgbG9nUmVxdWVzdHMgPDwgZW5kbAorICAgICAgICA8PCAiXHRyZXBsYXktcmVxdWVzdCBSZXBsYXkgcmVxdWVzdHMgZnJvbSBsb2cgZmlsZSAoLi9yZXF1ZXN0bG9nLnRsb2cpIERlZmF1bHQgaXMgIiA8PCByZXBsYXlSZXF1ZXN0cyA8PCBlbmRsCiAgICAgICAgIDw8ICJcdHdvcmtlcnMgICAgICAgIE51bWJlciBvZiB0aHJlYWQgcG9vbHMgd29ya2Vycy4gIE9ubHkgdmFsaWQgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb3IgdGhyZWFkLXBvb2wgc2VydmVyIHR5cGUuICBEZWZhdWx0IGlzICIgPDwgd29ya2VyQ291bnQgPDwgZW5kbAogICAgICAgICA8PCAiXHRjbGllbnQtdHlwZSAgICBUeXBlIG9mIGNsaWVudCwgXCJyZWd1bGFyXCIgb3IgXCJjb25jdXJyZW50XCIuICBEZWZhdWx0IGlzICIgPDwgY2xpZW50VHlwZSA8PCBlbmRsCkBAIC0zOTAsMjQgKzM5MCwyNCBAQAogICAgIGNlcnIgPDwgdXNhZ2Uuc3RyKCk7CiAgIH0KIAotICBib29zdDo6c2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkKLSAgICAgID0gYm9vc3Q6OnNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PihuZXcgUGxhdGZvcm1UaHJlYWRGYWN0b3J5KCkpOworICBzdGQ6OnNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5CisgICAgICA9IHN0ZDo6c2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+KG5ldyBQbGF0Zm9ybVRocmVhZEZhY3RvcnkoKSk7CiAKICAgLy8gRGlzcGF0Y2hlcgotICBib29zdDo6c2hhcmVkX3B0cjxTZXJ2ZXI+IHNlcnZpY2VIYW5kbGVyKG5ldyBTZXJ2ZXIoKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxTZXJ2ZXI+IHNlcnZpY2VIYW5kbGVyKG5ldyBTZXJ2ZXIoKSk7CiAKICAgaWYgKHJlcGxheVJlcXVlc3RzKSB7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8U2VydmVyPiBzZXJ2aWNlSGFuZGxlcihuZXcgU2VydmVyKCkpOwotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFNlcnZpY2VQcm9jZXNzb3I+IHNlcnZpY2VQcm9jZXNzb3IobmV3IFNlcnZpY2VQcm9jZXNzb3Ioc2VydmljZUhhbmRsZXIpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8U2VydmVyPiBzZXJ2aWNlSGFuZGxlcihuZXcgU2VydmVyKCkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxTZXJ2aWNlUHJvY2Vzc29yPiBzZXJ2aWNlUHJvY2Vzc29yKG5ldyBTZXJ2aWNlUHJvY2Vzc29yKHNlcnZpY2VIYW5kbGVyKSk7CiAKICAgICAvLyBUcmFuc3BvcnRzCi0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VEZpbGVUcmFuc3BvcnQ+IGZpbGVUcmFuc3BvcnQobmV3IFRGaWxlVHJhbnNwb3J0KHJlcXVlc3RMb2dQYXRoKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRGaWxlVHJhbnNwb3J0PiBmaWxlVHJhbnNwb3J0KG5ldyBURmlsZVRyYW5zcG9ydChyZXF1ZXN0TG9nUGF0aCkpOwogICAgIGZpbGVUcmFuc3BvcnQtPnNldENodW5rU2l6ZSgyICogMTAyNCAqIDEwMjQpOwogICAgIGZpbGVUcmFuc3BvcnQtPnNldE1heEV2ZW50U2l6ZSgxMDI0ICogMTYpOwogICAgIGZpbGVUcmFuc3BvcnQtPnNlZWtUb0VuZCgpOwogCiAgICAgLy8gUHJvdG9jb2wgRmFjdG9yeQotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeShuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpOwogCiAgICAgVEZpbGVQcm9jZXNzb3IgZmlsZVByb2Nlc3NvcihzZXJ2aWNlUHJvY2Vzc29yLCBwcm90b2NvbEZhY3RvcnksIGZpbGVUcmFuc3BvcnQpOwogCkBAIC00MTcsMjggKzQxNywyOCBAQAogCiAgIGlmIChydW5TZXJ2ZXIpIHsKIAotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFNlcnZpY2VQcm9jZXNzb3I+IHNlcnZpY2VQcm9jZXNzb3IobmV3IFNlcnZpY2VQcm9jZXNzb3Ioc2VydmljZUhhbmRsZXIpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8U2VydmljZVByb2Nlc3Nvcj4gc2VydmljZVByb2Nlc3NvcihuZXcgU2VydmljZVByb2Nlc3NvcihzZXJ2aWNlSGFuZGxlcikpOwogCiAgICAgLy8gVHJhbnNwb3J0Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4gc2VydmVyU29ja2V0KG5ldyBUU2VydmVyU29ja2V0KHBvcnQpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4gc2VydmVyU29ja2V0KG5ldyBUU2VydmVyU29ja2V0KHBvcnQpKTsKIAogICAgIC8vIFRyYW5zcG9ydCBGYWN0b3J5Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3RvcnkobmV3IFRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkpOwogCiAgICAgLy8gUHJvdG9jb2wgRmFjdG9yeQotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeShuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpOwogCiAgICAgaWYgKGxvZ1JlcXVlc3RzKSB7CiAgICAgICAvLyBpbml0aWFsaXplIHRoZSBsb2cgZmlsZQotICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VEZpbGVUcmFuc3BvcnQ+IGZpbGVUcmFuc3BvcnQobmV3IFRGaWxlVHJhbnNwb3J0KHJlcXVlc3RMb2dQYXRoKSk7CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8VEZpbGVUcmFuc3BvcnQ+IGZpbGVUcmFuc3BvcnQobmV3IFRGaWxlVHJhbnNwb3J0KHJlcXVlc3RMb2dQYXRoKSk7CiAgICAgICBmaWxlVHJhbnNwb3J0LT5zZXRDaHVua1NpemUoMiAqIDEwMjQgKiAxMDI0KTsKICAgICAgIGZpbGVUcmFuc3BvcnQtPnNldE1heEV2ZW50U2l6ZSgxMDI0ICogMTYpOwogCiAgICAgICB0cmFuc3BvcnRGYWN0b3J5Ci0gICAgICAgICAgPSBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRQaXBlZFRyYW5zcG9ydEZhY3RvcnkoZmlsZVRyYW5zcG9ydCkpOworICAgICAgICAgID0gc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFBpcGVkVHJhbnNwb3J0RmFjdG9yeShmaWxlVHJhbnNwb3J0KSk7CiAgICAgfQogCi0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlcj4gc2VydmVyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyPiBzZXJ2ZXI7CiAKICAgICBpZiAoc2VydmVyVHlwZSA9PSAic2ltcGxlIikgewogCkBAIC00NTIsNyArNDUyLDcgQEAKIAogICAgIH0gZWxzZSBpZiAoc2VydmVyVHlwZSA9PSAidGhyZWFkLXBvb2wiKSB7CiAKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyCiAgICAgICAgICAgPSBUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKHdvcmtlckNvdW50KTsKIAogICAgICAgdGhyZWFkTWFuYWdlci0+dGhyZWFkRmFjdG9yeSh0aHJlYWRGYWN0b3J5KTsKQEAgLTQ2NCw5ICs0NjQsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRNYW5hZ2VyKSk7CiAgICAgfQogCi0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFN0YXJ0T2JzZXJ2ZXI+IG9ic2VydmVyKG5ldyBUU3RhcnRPYnNlcnZlcik7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRTdGFydE9ic2VydmVyPiBvYnNlcnZlcihuZXcgVFN0YXJ0T2JzZXJ2ZXIpOwogICAgIHNlcnZlci0+c2V0U2VydmVyRXZlbnRIYW5kbGVyKG9ic2VydmVyKTsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWQ+IHNlcnZlclRocmVhZCA9IHRocmVhZEZhY3RvcnktPm5ld1RocmVhZChzZXJ2ZXIpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+IHNlcnZlclRocmVhZCA9IHRocmVhZEZhY3RvcnktPm5ld1RocmVhZChzZXJ2ZXIpOwogCiAgICAgY2VyciA8PCAiU3RhcnRpbmcgdGhlIHNlcnZlciBvbiBwb3J0ICIgPDwgcG9ydCA8PCBlbmRsOwogCkBAIC00ODUsNyArNDg1LDcgQEAKIAogICAgIHNpemVfdCB0aHJlYWRDb3VudCA9IDA7CiAKLSAgICBzZXQ8Ym9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkPiA+IGNsaWVudFRocmVhZHM7CisgICAgc2V0PHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+ID4gY2xpZW50VGhyZWFkczsKIAogICAgIGlmIChjYWxsTmFtZSA9PSAiZWNob1ZvaWQiKSB7CiAgICAgICBsb29wVHlwZSA9IFRfVk9JRDsKQEAgLTUwNCwyOCArNTA0LDI4IEBACiAgICAgaWYoY2xpZW50VHlwZSA9PSAicmVndWxhciIpIHsKICAgICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBjbGllbnRDb3VudDsgaXgrKykgewogCi0gICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHNvY2tldChuZXcgVFNvY2tldCgiMTI3LjAuMC4xIiwgcG9ydCkpOwotICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUQnVmZmVyZWRUcmFuc3BvcnQ+IGJ1ZmZlcmVkU29ja2V0KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoc29ja2V0LCAyMDQ4KSk7Ci0gICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG9jb2wobmV3IFRCaW5hcnlQcm90b2NvbChidWZmZXJlZFNvY2tldCkpOwotICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxTZXJ2aWNlQ2xpZW50PiBzZXJ2aWNlQ2xpZW50KG5ldyBTZXJ2aWNlQ2xpZW50KHByb3RvY29sKSk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBzb2NrZXQobmV3IFRTb2NrZXQoIjEyNy4wLjAuMSIsIHBvcnQpKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRCdWZmZXJlZFRyYW5zcG9ydD4gYnVmZmVyZWRTb2NrZXQobmV3IFRCdWZmZXJlZFRyYW5zcG9ydChzb2NrZXQsIDIwNDgpKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG9jb2wobmV3IFRCaW5hcnlQcm90b2NvbChidWZmZXJlZFNvY2tldCkpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8U2VydmljZUNsaWVudD4gc2VydmljZUNsaWVudChuZXcgU2VydmljZUNsaWVudChwcm90b2NvbCkpOwogCi0gICAgICAgIGNsaWVudFRocmVhZHMuaW5zZXJ0KHRocmVhZEZhY3RvcnktPm5ld1RocmVhZChib29zdDo6c2hhcmVkX3B0cjxDbGllbnRUaHJlYWQ+KAorICAgICAgICBjbGllbnRUaHJlYWRzLmluc2VydCh0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQoc3RkOjpzaGFyZWRfcHRyPENsaWVudFRocmVhZD4oCiAgICAgICAgICAgICBuZXcgQ2xpZW50VGhyZWFkKHNvY2tldCwgc2VydmljZUNsaWVudCwgbW9uaXRvciwgdGhyZWFkQ291bnQsIGxvb3BDb3VudCwgbG9vcFR5cGUsIE9wZW5BbmRDbG9zZVRyYW5zcG9ydEluVGhyZWFkKSkpKTsKICAgICAgIH0KICAgICB9IGVsc2UgaWYoY2xpZW50VHlwZSA9PSAiY29uY3VycmVudCIpIHsKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHNvY2tldChuZXcgVFNvY2tldCgiMTI3LjAuMC4xIiwgcG9ydCkpOwotICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VEJ1ZmZlcmVkVHJhbnNwb3J0PiBidWZmZXJlZFNvY2tldChuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KHNvY2tldCwgMjA0OCkpOwotICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90b2NvbChuZXcgVEJpbmFyeVByb3RvY29sKGJ1ZmZlcmVkU29ja2V0KSk7Ci0gICAgICAvL2Jvb3N0OjpzaGFyZWRfcHRyPFNlcnZpY2VDbGllbnQ+IHNlcnZpY2VDbGllbnQobmV3IFNlcnZpY2VDbGllbnQocHJvdG9jb2wpKTsKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFNlcnZpY2VDb25jdXJyZW50Q2xpZW50PiBzZXJ2aWNlQ2xpZW50KG5ldyBTZXJ2aWNlQ29uY3VycmVudENsaWVudChwcm90b2NvbCkpOworICAgICAgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHNvY2tldChuZXcgVFNvY2tldCgiMTI3LjAuMC4xIiwgcG9ydCkpOworICAgICAgc3RkOjpzaGFyZWRfcHRyPFRCdWZmZXJlZFRyYW5zcG9ydD4gYnVmZmVyZWRTb2NrZXQobmV3IFRCdWZmZXJlZFRyYW5zcG9ydChzb2NrZXQsIDIwNDgpKTsKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvY29sKG5ldyBUQmluYXJ5UHJvdG9jb2woYnVmZmVyZWRTb2NrZXQpKTsKKyAgICAgIC8vc3RkOjpzaGFyZWRfcHRyPFNlcnZpY2VDbGllbnQ+IHNlcnZpY2VDbGllbnQobmV3IFNlcnZpY2VDbGllbnQocHJvdG9jb2wpKTsKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxTZXJ2aWNlQ29uY3VycmVudENsaWVudD4gc2VydmljZUNsaWVudChuZXcgU2VydmljZUNvbmN1cnJlbnRDbGllbnQocHJvdG9jb2wpKTsKICAgICAgIHNvY2tldC0+b3BlbigpOwogICAgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IGNsaWVudENvdW50OyBpeCsrKSB7Ci0gICAgICAgIGNsaWVudFRocmVhZHMuaW5zZXJ0KHRocmVhZEZhY3RvcnktPm5ld1RocmVhZChib29zdDo6c2hhcmVkX3B0cjxDbGllbnRUaHJlYWQ+KAorICAgICAgICBjbGllbnRUaHJlYWRzLmluc2VydCh0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQoc3RkOjpzaGFyZWRfcHRyPENsaWVudFRocmVhZD4oCiAgICAgICAgICAgICBuZXcgQ2xpZW50VGhyZWFkKHNvY2tldCwgc2VydmljZUNsaWVudCwgbW9uaXRvciwgdGhyZWFkQ291bnQsIGxvb3BDb3VudCwgbG9vcFR5cGUsIERvbnRPcGVuQW5kQ2xvc2VUcmFuc3BvcnRJblRocmVhZCkpKSk7CiAgICAgICB9CiAgICAgfQogCi0gICAgZm9yIChzdGQ6OnNldDxib29zdDo6c2hhcmVkX3B0cjxUaHJlYWQ+ID46OmNvbnN0X2l0ZXJhdG9yIHRocmVhZCA9IGNsaWVudFRocmVhZHMuYmVnaW4oKTsKKyAgICBmb3IgKHN0ZDo6c2V0PHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+ID46OmNvbnN0X2l0ZXJhdG9yIHRocmVhZCA9IGNsaWVudFRocmVhZHMuYmVnaW4oKTsKICAgICAgICAgIHRocmVhZCAhPSBjbGllbnRUaHJlYWRzLmVuZCgpOwogICAgICAgICAgdGhyZWFkKyspIHsKICAgICAgICgqdGhyZWFkKS0+c3RhcnQoKTsKQEAgLTU1OCwxMiArNTU4LDEyIEBACiAgICAgaW50NjRfdCBtaW5UaW1lID0gOTIyMzM3MjAzNjg1NDc3NTgwN0xMOwogICAgIGludDY0X3QgbWF4VGltZSA9IDA7CiAKLSAgICBmb3IgKHNldDxib29zdDo6c2hhcmVkX3B0cjxUaHJlYWQ+ID46Oml0ZXJhdG9yIGl4ID0gY2xpZW50VGhyZWFkcy5iZWdpbigpOworICAgIGZvciAoc2V0PHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+ID46Oml0ZXJhdG9yIGl4ID0gY2xpZW50VGhyZWFkcy5iZWdpbigpOwogICAgICAgICAgaXggIT0gY2xpZW50VGhyZWFkcy5lbmQoKTsKICAgICAgICAgIGl4KyspIHsKIAotICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8Q2xpZW50VGhyZWFkPiBjbGllbnQKLSAgICAgICAgICA9IGJvb3N0OjpkeW5hbWljX3BvaW50ZXJfY2FzdDxDbGllbnRUaHJlYWQ+KCgqaXgpLT5ydW5uYWJsZSgpKTsKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDbGllbnRUaHJlYWQ+IGNsaWVudAorICAgICAgICAgID0gc3RkOjpkeW5hbWljX3BvaW50ZXJfY2FzdDxDbGllbnRUaHJlYWQ+KCgqaXgpLT5ydW5uYWJsZSgpKTsKIAogICAgICAgaW50NjRfdCBkZWx0YSA9IGNsaWVudC0+X2VuZFRpbWUgLSBjbGllbnQtPl9zdGFydFRpbWU7CiAKZGlmZiAtLWdpdCBhL3Rlc3QvY3BwL3NyYy9TdHJlc3NUZXN0Tm9uQmxvY2tpbmcuY3BwIGIvdGVzdC9jcHAvc3JjL1N0cmVzc1Rlc3ROb25CbG9ja2luZy5jcHAKaW5kZXggOGYxNjFjMC4uMWQzZWQ3MyAxMDA2NDQKLS0tIGEvdGVzdC9jcHAvc3JjL1N0cmVzc1Rlc3ROb25CbG9ja2luZy5jcHAKKysrIGIvdGVzdC9jcHAvc3JjL1N0cmVzc1Rlc3ROb25CbG9ja2luZy5jcHAKQEAgLTI5LDE0ICsyOSwxMyBAQAogI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuaD4KICNpbmNsdWRlIDx0aHJpZnQvVExvZ2dpbmcuaD4KIAogI2luY2x1ZGUgIlNlcnZpY2UuaCIKIAotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgotCiAjaW5jbHVkZSA8aW9zdHJlYW0+CiAjaW5jbHVkZSA8c2V0PgogI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KQEAgLTEwOSw4ICsxMDgsOCBAQAogCiBjbGFzcyBDbGllbnRUaHJlYWQgOiBwdWJsaWMgUnVubmFibGUgewogcHVibGljOgotICBDbGllbnRUaHJlYWQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8U2VydmljZUNsaWVudD4gY2xpZW50LAorICBDbGllbnRUaHJlYWQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxTZXJ2aWNlQ2xpZW50PiBjbGllbnQsCiAgICAgICAgICAgICAgICBNb25pdG9yJiBtb25pdG9yLAogICAgICAgICAgICAgICAgc2l6ZV90JiB3b3JrZXJDb3VudCwKICAgICAgICAgICAgICAgIHNpemVfdCBsb29wQ291bnQsCkBAIC0yMjEsOCArMjIwLDggQEAKICAgICB9CiAgIH0KIAotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBfdHJhbnNwb3J0OwotICBib29zdDo6c2hhcmVkX3B0cjxTZXJ2aWNlQ2xpZW50PiBfY2xpZW50OworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gX3RyYW5zcG9ydDsKKyAgc3RkOjpzaGFyZWRfcHRyPFNlcnZpY2VDbGllbnQ+IF9jbGllbnQ7CiAgIE1vbml0b3ImIF9tb25pdG9yOwogICBzaXplX3QmIF93b3JrZXJDb3VudDsKICAgc2l6ZV90IF9sb29wQ291bnQ7CkBAIC0zNDQsMjQgKzM0MywyNCBAQAogICAgIGNlcnIgPDwgdXNhZ2Uuc3RyKCk7CiAgIH0KIAotICBib29zdDo6c2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkKLSAgICAgID0gYm9vc3Q6OnNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PihuZXcgUGxhdGZvcm1UaHJlYWRGYWN0b3J5KCkpOworICBzdGQ6OnNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5CisgICAgICA9IHN0ZDo6c2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+KG5ldyBQbGF0Zm9ybVRocmVhZEZhY3RvcnkoKSk7CiAKICAgLy8gRGlzcGF0Y2hlcgotICBib29zdDo6c2hhcmVkX3B0cjxTZXJ2ZXI+IHNlcnZpY2VIYW5kbGVyKG5ldyBTZXJ2ZXIoKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxTZXJ2ZXI+IHNlcnZpY2VIYW5kbGVyKG5ldyBTZXJ2ZXIoKSk7CiAKICAgaWYgKHJlcGxheVJlcXVlc3RzKSB7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8U2VydmVyPiBzZXJ2aWNlSGFuZGxlcihuZXcgU2VydmVyKCkpOwotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFNlcnZpY2VQcm9jZXNzb3I+IHNlcnZpY2VQcm9jZXNzb3IobmV3IFNlcnZpY2VQcm9jZXNzb3Ioc2VydmljZUhhbmRsZXIpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8U2VydmVyPiBzZXJ2aWNlSGFuZGxlcihuZXcgU2VydmVyKCkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxTZXJ2aWNlUHJvY2Vzc29yPiBzZXJ2aWNlUHJvY2Vzc29yKG5ldyBTZXJ2aWNlUHJvY2Vzc29yKHNlcnZpY2VIYW5kbGVyKSk7CiAKICAgICAvLyBUcmFuc3BvcnRzCi0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VEZpbGVUcmFuc3BvcnQ+IGZpbGVUcmFuc3BvcnQobmV3IFRGaWxlVHJhbnNwb3J0KHJlcXVlc3RMb2dQYXRoKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRGaWxlVHJhbnNwb3J0PiBmaWxlVHJhbnNwb3J0KG5ldyBURmlsZVRyYW5zcG9ydChyZXF1ZXN0TG9nUGF0aCkpOwogICAgIGZpbGVUcmFuc3BvcnQtPnNldENodW5rU2l6ZSgyICogMTAyNCAqIDEwMjQpOwogICAgIGZpbGVUcmFuc3BvcnQtPnNldE1heEV2ZW50U2l6ZSgxMDI0ICogMTYpOwogICAgIGZpbGVUcmFuc3BvcnQtPnNlZWtUb0VuZCgpOwogCiAgICAgLy8gUHJvdG9jb2wgRmFjdG9yeQotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeShuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpOwogCiAgICAgVEZpbGVQcm9jZXNzb3IgZmlsZVByb2Nlc3NvcihzZXJ2aWNlUHJvY2Vzc29yLCBwcm90b2NvbEZhY3RvcnksIGZpbGVUcmFuc3BvcnQpOwogCkBAIC0zNzEsNDUgKzM3MCw1MSBAQAogCiAgIGlmIChydW5TZXJ2ZXIpIHsKIAotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFNlcnZpY2VQcm9jZXNzb3I+IHNlcnZpY2VQcm9jZXNzb3IobmV3IFNlcnZpY2VQcm9jZXNzb3Ioc2VydmljZUhhbmRsZXIpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8U2VydmljZVByb2Nlc3Nvcj4gc2VydmljZVByb2Nlc3NvcihuZXcgU2VydmljZVByb2Nlc3NvcihzZXJ2aWNlSGFuZGxlcikpOwogCiAgICAgLy8gUHJvdG9jb2wgRmFjdG9yeQotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeShuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpOwogCiAgICAgLy8gVHJhbnNwb3J0IEZhY3RvcnkKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3Rvcnk7CiAKICAgICBpZiAobG9nUmVxdWVzdHMpIHsKICAgICAgIC8vIGluaXRpYWxpemUgdGhlIGxvZyBmaWxlCi0gICAgICBib29zdDo6c2hhcmVkX3B0cjxURmlsZVRyYW5zcG9ydD4gZmlsZVRyYW5zcG9ydChuZXcgVEZpbGVUcmFuc3BvcnQocmVxdWVzdExvZ1BhdGgpKTsKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxURmlsZVRyYW5zcG9ydD4gZmlsZVRyYW5zcG9ydChuZXcgVEZpbGVUcmFuc3BvcnQocmVxdWVzdExvZ1BhdGgpKTsKICAgICAgIGZpbGVUcmFuc3BvcnQtPnNldENodW5rU2l6ZSgyICogMTAyNCAqIDEwMjQpOwogICAgICAgZmlsZVRyYW5zcG9ydC0+c2V0TWF4RXZlbnRTaXplKDEwMjQgKiAxNik7CiAKICAgICAgIHRyYW5zcG9ydEZhY3RvcnkKLSAgICAgICAgICA9IGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFBpcGVkVHJhbnNwb3J0RmFjdG9yeShmaWxlVHJhbnNwb3J0KSk7CisgICAgICAgICAgPSBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUUGlwZWRUcmFuc3BvcnRGYWN0b3J5KGZpbGVUcmFuc3BvcnQpKTsKICAgICB9CiAKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWQ+IHNlcnZlclRocmVhZDsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWQ+IHNlcnZlclRocmVhZDI7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gc2VydmVyVGhyZWFkOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+IHNlcnZlclRocmVhZDI7CisgICAgc3RkOjpzaGFyZWRfcHRyPHRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU2VydmVyU29ja2V0PiBuYlNvY2tldDE7CisgICAgc3RkOjpzaGFyZWRfcHRyPHRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU2VydmVyU29ja2V0PiBuYlNvY2tldDI7CiAKICAgICBpZiAoc2VydmVyVHlwZSA9PSAic2ltcGxlIikgewogCi0gICAgICBzZXJ2ZXJUaHJlYWQgPSB0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQoYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlcj4oCi0gICAgICAgICAgbmV3IFROb25ibG9ja2luZ1NlcnZlcihzZXJ2aWNlUHJvY2Vzc29yLCBwcm90b2NvbEZhY3RvcnksIHBvcnQpKSk7Ci0gICAgICBzZXJ2ZXJUaHJlYWQyID0gdGhyZWFkRmFjdG9yeS0+bmV3VGhyZWFkKGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXI+KAotICAgICAgICAgIG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXIoc2VydmljZVByb2Nlc3NvciwgcHJvdG9jb2xGYWN0b3J5LCBwb3J0ICsgMSkpKTsKKyAgICAgIG5iU29ja2V0MS5yZXNldChuZXcgdHJhbnNwb3J0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQocG9ydCkpOworICAgICAgc2VydmVyVGhyZWFkID0gdGhyZWFkRmFjdG9yeS0+bmV3VGhyZWFkKHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyPigKKyAgICAgICAgICBuZXcgVE5vbmJsb2NraW5nU2VydmVyKHNlcnZpY2VQcm9jZXNzb3IsIHByb3RvY29sRmFjdG9yeSwgbmJTb2NrZXQxKSkpOworICAgICAgbmJTb2NrZXQyLnJlc2V0KG5ldyB0cmFuc3BvcnQ6OlROb25ibG9ja2luZ1NlcnZlclNvY2tldChwb3J0ICsgMSkpOworICAgICAgc2VydmVyVGhyZWFkMiA9IHRocmVhZEZhY3RvcnktPm5ld1RocmVhZChzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlcj4oCisgICAgICAgICAgbmV3IFROb25ibG9ja2luZ1NlcnZlcihzZXJ2aWNlUHJvY2Vzc29yLCBwcm90b2NvbEZhY3RvcnksIG5iU29ja2V0MikpKTsKIAogICAgIH0gZWxzZSBpZiAoc2VydmVyVHlwZSA9PSAidGhyZWFkLXBvb2wiKSB7CiAKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyCiAgICAgICAgICAgPSBUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKHdvcmtlckNvdW50KTsKIAogICAgICAgdGhyZWFkTWFuYWdlci0+dGhyZWFkRmFjdG9yeSh0aHJlYWRGYWN0b3J5KTsKICAgICAgIHRocmVhZE1hbmFnZXItPnN0YXJ0KCk7Ci0gICAgICBzZXJ2ZXJUaHJlYWQgPSB0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQoYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlcj4oCi0gICAgICAgICAgbmV3IFROb25ibG9ja2luZ1NlcnZlcihzZXJ2aWNlUHJvY2Vzc29yLCBwcm90b2NvbEZhY3RvcnksIHBvcnQsIHRocmVhZE1hbmFnZXIpKSk7Ci0gICAgICBzZXJ2ZXJUaHJlYWQyID0gdGhyZWFkRmFjdG9yeS0+bmV3VGhyZWFkKGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXI+KAotICAgICAgICAgIG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXIoc2VydmljZVByb2Nlc3NvciwgcHJvdG9jb2xGYWN0b3J5LCBwb3J0ICsgMSwgdGhyZWFkTWFuYWdlcikpKTsKKyAgICAgIG5iU29ja2V0MS5yZXNldChuZXcgdHJhbnNwb3J0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQocG9ydCkpOworICAgICAgc2VydmVyVGhyZWFkID0gdGhyZWFkRmFjdG9yeS0+bmV3VGhyZWFkKHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyPigKKyAgICAgICAgICBuZXcgVE5vbmJsb2NraW5nU2VydmVyKHNlcnZpY2VQcm9jZXNzb3IsIHByb3RvY29sRmFjdG9yeSwgbmJTb2NrZXQxLCB0aHJlYWRNYW5hZ2VyKSkpOworICAgICAgbmJTb2NrZXQyLnJlc2V0KG5ldyB0cmFuc3BvcnQ6OlROb25ibG9ja2luZ1NlcnZlclNvY2tldChwb3J0ICsgMSkpOworICAgICAgc2VydmVyVGhyZWFkMiA9IHRocmVhZEZhY3RvcnktPm5ld1RocmVhZChzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlcj4oCisgICAgICAgICAgbmV3IFROb25ibG9ja2luZ1NlcnZlcihzZXJ2aWNlUHJvY2Vzc29yLCBwcm90b2NvbEZhY3RvcnksIG5iU29ja2V0MiwgdGhyZWFkTWFuYWdlcikpKTsKICAgICB9CiAKICAgICBjZXJyIDw8ICJTdGFydGluZyB0aGUgc2VydmVyIG9uIHBvcnQgIiA8PCBwb3J0IDw8ICIgYW5kICIgPDwgKHBvcnQgKyAxKSA8PCBlbmRsOwpAQCAtNDMxLDcgKzQzNiw3IEBACiAKICAgICBzaXplX3QgdGhyZWFkQ291bnQgPSAwOwogCi0gICAgc2V0PGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZD4gPiBjbGllbnRUaHJlYWRzOworICAgIHNldDxzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPiA+IGNsaWVudFRocmVhZHM7CiAKICAgICBpZiAoY2FsbE5hbWUgPT0gImVjaG9Wb2lkIikgewogICAgICAgbG9vcFR5cGUgPSBUX1ZPSUQ7CkBAIC00NDksMTYgKzQ1NCwxNiBAQAogCiAgICAgZm9yICh1aW50MzJfdCBpeCA9IDA7IGl4IDwgY2xpZW50Q291bnQ7IGl4KyspIHsKIAotICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNvY2tldD4gc29ja2V0KG5ldyBUU29ja2V0KCIxMjcuMC4wLjEiLCBwb3J0ICsgKGl4ICUgMikpKTsKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRGcmFtZWRUcmFuc3BvcnQ+IGZyYW1lZFNvY2tldChuZXcgVEZyYW1lZFRyYW5zcG9ydChzb2NrZXQpKTsKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG9jb2wobmV3IFRCaW5hcnlQcm90b2NvbChmcmFtZWRTb2NrZXQpKTsKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFNlcnZpY2VDbGllbnQ+IHNlcnZpY2VDbGllbnQobmV3IFNlcnZpY2VDbGllbnQocHJvdG9jb2wpKTsKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBzb2NrZXQobmV3IFRTb2NrZXQoIjEyNy4wLjAuMSIsIHBvcnQgKyAoaXggJSAyKSkpOworICAgICAgc3RkOjpzaGFyZWRfcHRyPFRGcmFtZWRUcmFuc3BvcnQ+IGZyYW1lZFNvY2tldChuZXcgVEZyYW1lZFRyYW5zcG9ydChzb2NrZXQpKTsKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvY29sKG5ldyBUQmluYXJ5UHJvdG9jb2woZnJhbWVkU29ja2V0KSk7CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8U2VydmljZUNsaWVudD4gc2VydmljZUNsaWVudChuZXcgU2VydmljZUNsaWVudChwcm90b2NvbCkpOwogCi0gICAgICBjbGllbnRUaHJlYWRzLmluc2VydCh0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQoYm9vc3Q6OnNoYXJlZF9wdHI8Q2xpZW50VGhyZWFkPigKKyAgICAgIGNsaWVudFRocmVhZHMuaW5zZXJ0KHRocmVhZEZhY3RvcnktPm5ld1RocmVhZChzdGQ6OnNoYXJlZF9wdHI8Q2xpZW50VGhyZWFkPigKICAgICAgICAgICBuZXcgQ2xpZW50VGhyZWFkKHNvY2tldCwgc2VydmljZUNsaWVudCwgbW9uaXRvciwgdGhyZWFkQ291bnQsIGxvb3BDb3VudCwgbG9vcFR5cGUpKSkpOwogICAgIH0KIAotICAgIGZvciAoc3RkOjpzZXQ8Ym9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkPiA+Ojpjb25zdF9pdGVyYXRvciB0aHJlYWQgPSBjbGllbnRUaHJlYWRzLmJlZ2luKCk7CisgICAgZm9yIChzdGQ6OnNldDxzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPiA+Ojpjb25zdF9pdGVyYXRvciB0aHJlYWQgPSBjbGllbnRUaHJlYWRzLmJlZ2luKCk7CiAgICAgICAgICB0aHJlYWQgIT0gY2xpZW50VGhyZWFkcy5lbmQoKTsKICAgICAgICAgIHRocmVhZCsrKSB7CiAgICAgICAoKnRocmVhZCktPnN0YXJ0KCk7CkBAIC00OTEsMTIgKzQ5NiwxMiBAQAogICAgIGludDY0X3QgbWluVGltZSA9IDkyMjMzNzIwMzY4NTQ3NzU4MDdMTDsKICAgICBpbnQ2NF90IG1heFRpbWUgPSAwOwogCi0gICAgZm9yIChzZXQ8Ym9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkPiA+OjppdGVyYXRvciBpeCA9IGNsaWVudFRocmVhZHMuYmVnaW4oKTsKKyAgICBmb3IgKHNldDxzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPiA+OjppdGVyYXRvciBpeCA9IGNsaWVudFRocmVhZHMuYmVnaW4oKTsKICAgICAgICAgIGl4ICE9IGNsaWVudFRocmVhZHMuZW5kKCk7CiAgICAgICAgICBpeCsrKSB7CiAKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPENsaWVudFRocmVhZD4gY2xpZW50Ci0gICAgICAgICAgPSBib29zdDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8Q2xpZW50VGhyZWFkPigoKml4KS0+cnVubmFibGUoKSk7CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q2xpZW50VGhyZWFkPiBjbGllbnQKKyAgICAgICAgICA9IHN0ZDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8Q2xpZW50VGhyZWFkPigoKml4KS0+cnVubmFibGUoKSk7CiAKICAgICAgIGludDY0X3QgZGVsdGEgPSBjbGllbnQtPl9lbmRUaW1lIC0gY2xpZW50LT5fc3RhcnRUaW1lOwogCmRpZmYgLS1naXQgYS90ZXN0L2NwcC9zcmMvVGVzdENsaWVudC5jcHAgYi90ZXN0L2NwcC9zcmMvVGVzdENsaWVudC5jcHAKaW5kZXggN2M0MjVhOS4uODlmM2ZkMSAxMDA2NDQKLS0tIGEvdGVzdC9jcHAvc3JjL1Rlc3RDbGllbnQuY3BwCisrKyBiL3Rlc3QvY3BwL3NyYy9UZXN0Q2xpZW50LmNwcApAQCAtMSw0ICsxLDQgQEAKLS8qCivvu78vKgogICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQogICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKICAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCkBAIC0xNywzOSArMTcsNDggQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNkZWZpbmUgX19TVERDX0ZPUk1BVF9NQUNST1MKLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotCisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPGxvY2FsZT4KKyNpbmNsdWRlIDxpb3M+CiAjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8c3N0cmVhbT4KICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEhlYWRlclByb3RvY29sLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTU0xTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RFdmh0dHBDbGllbnRDaGFubmVsLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuaD4gLy8gPGV2ZW50Lmg+CiAKLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLSNpbmNsdWRlIDxib29zdC9wcm9ncmFtX29wdGlvbnMuaHBwPgorI2lmZGVmIEhBVkVfU1RESU5UX0gKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfSU5UVFlQRVNfSAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGJvb3N0L2FsZ29yaXRobS9zdHJpbmcuaHBwPgogI2luY2x1ZGUgPGJvb3N0L2ZpbGVzeXN0ZW0uaHBwPgotI2luY2x1ZGUgPHRocmlmdC9jeHhmdW5jdGlvbmFsLmg+CisjaW5jbHVkZSA8Ym9vc3QvcHJvZ3JhbV9vcHRpb25zLmhwcD4KKyNpbmNsdWRlIDxib29zdC9yYW5kb20vcmFuZG9tX2RldmljZS5ocHA+CiAjaWYgX1dJTjMyCiAjaW5jbHVkZSA8dGhyaWZ0L3dpbmRvd3MvVFdpbnNvY2tTaW5nbGV0b24uaD4KICNlbmRpZgogCisjaW5jbHVkZSAiU2Vjb25kU2VydmljZS5oIgogI2luY2x1ZGUgIlRocmlmdFRlc3QuaCIKIAogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6YXN5bmM7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7CiB1c2luZyBuYW1lc3BhY2UgdGhyaWZ0Ojp0ZXN0OwotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojphc3luYzsKLQotLy8gTGVuZ3RoIG9mIGFyZ3ZbMF0gLSBMZW5ndGggb2Ygc2NyaXB0IGRpcgotI2RlZmluZSBFWEVDVVRBQkxFX0ZJTEVfTkFNRV9MRU5HVEggMTkKIAogLy8gQ3VycmVudCB0aW1lLCBtaWNyb3NlY29uZHMgc2luY2UgdGhlIGVwb2NoCiB1aW50NjRfdCBub3coKSB7CkBAIC02Miw1MyArNzEsODIgQEAKICAgcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgdGVzdFN0cmluZ19jbGllbnRSZXR1cm4oY29uc3QgY2hhciogaG9zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRfYmFzZSogYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkqIHByb3RvY29sRmFjdG9yeSwKK3N0YXRpYyB2b2lkIHRlc3RTdHJpbmdfY2xpZW50UmV0dXJuKGV2ZW50X2Jhc2UqIGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGVzdE5yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VGVzdENvYkNsaWVudCogY2xpZW50KSB7Ci0gICh2b2lkKWhvc3Q7Ci0gICh2b2lkKXBvcnQ7Ci0gICh2b2lkKXByb3RvY29sRmFjdG9yeTsKICAgdHJ5IHsKICAgICBzdHJpbmcgczsKICAgICBjbGllbnQtPnJlY3ZfdGVzdFN0cmluZyhzKTsKLSAgICBjb3V0IDw8ICJ0ZXN0U3RyaW5nOiAiIDw8IHMgPDwgZW5kbDsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7CisgICAgb3MgPDwgInRlc3QiIDw8IHRlc3ROcjsKKyAgICBjb25zdCBib29sIG9rID0gKHMgPT0gb3Muc3RyKCkpOworICAgIGNvdXQgPDwgInRlc3RTdHJpbmc6ICIgPDwgcyA8PCAiICIgPDwgKChvaykgPyAib2siIDogImZhaWxlZCIpIDw8IGVuZGw7CiAgIH0gY2F0Y2ggKFRFeGNlcHRpb24mIGV4bikgewogICAgIGNvdXQgPDwgIkVycm9yOiAiIDw8IGV4bi53aGF0KCkgPDwgZW5kbDsKICAgfQogCi0gIGV2ZW50X2Jhc2VfbG9vcGJyZWFrKGJhc2UpOyAvLyBlbmQgdGVzdAorICBpZiAodGVzdE5yID09IDkpCisgICAgZXZlbnRfYmFzZV9sb29wYnJlYWsoYmFzZSk7IC8vIGVuZCB0ZXN0CiB9CiAKLXN0YXRpYyB2b2lkIHRlc3RWb2lkX2NsaWVudFJldHVybihjb25zdCBjaGFyKiBob3N0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X2Jhc2UqIGJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSogcHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFRlc3RDb2JDbGllbnQqIGNsaWVudCkgeworc3RhdGljIHZvaWQgdGVzdFZvaWRfY2xpZW50UmV0dXJuKGV2ZW50X2Jhc2UqIGJhc2UsIFRocmlmdFRlc3RDb2JDbGllbnQqIGNsaWVudCkgewogICB0cnkgewogICAgIGNsaWVudC0+cmVjdl90ZXN0Vm9pZCgpOwogICAgIGNvdXQgPDwgInRlc3RWb2lkIiA8PCBlbmRsOwogCi0gICAgLy8gbmV4dCB0ZXN0Ci0gICAgZGVsZXRlIGNsaWVudDsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUQXN5bmNDaGFubmVsPiBjaGFubmVsKG5ldyBURXZodHRwQ2xpZW50Q2hhbm5lbChob3N0LCAiLyIsIGhvc3QsIHBvcnQsIGJhc2UpKTsKLSAgICBjbGllbnQgPSBuZXcgVGhyaWZ0VGVzdENvYkNsaWVudChjaGFubmVsLCBwcm90b2NvbEZhY3RvcnkpOwotICAgIGNsaWVudC0+dGVzdFN0cmluZyh0Y3h4OjpiaW5kKHRlc3RTdHJpbmdfY2xpZW50UmV0dXJuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y3h4OjpwbGFjZWhvbGRlcnM6Ol8xKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIlRlc3QiKTsKKyAgICBmb3IgKGludCB0ZXN0TnIgPSAwOyB0ZXN0TnIgPCAxMDsgKyt0ZXN0TnIpIHsKKyAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvczsKKyAgICAgIG9zIDw8ICJ0ZXN0IiA8PCB0ZXN0TnI7CisgICAgICBjbGllbnQtPnRlc3RTdHJpbmcoc3RkOjpiaW5kKHRlc3RTdHJpbmdfY2xpZW50UmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3ROciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSksCisgICAgICAgICAgICAgICAgICAgICAgIG9zLnN0cigpKTsKKyAgICB9CiAgIH0gY2F0Y2ggKFRFeGNlcHRpb24mIGV4bikgewogICAgIGNvdXQgPDwgIkVycm9yOiAiIDw8IGV4bi53aGF0KCkgPDwgZW5kbDsKICAgfQogfQogCisvLyBXb3JrYXJvdW5kIGZvciBhYnNlbnNlIG9mIEMrKzExICJhdXRvIiBrZXl3b3JkLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Citib29sIHByaW50X2VxKFQgZXhwZWN0ZWQsIFQgYWN0dWFsKSB7CisgIGNvdXQgPDwgIigiIDw8IGFjdHVhbCA8PCAiKSIgPDwgZW5kbDsKKyAgaWYgKGV4cGVjdGVkICE9IGFjdHVhbCkgeworICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsIDw8ICJFeHBlY3RlZDogIiA8PCBleHBlY3RlZCA8PCAiIGJ1dCBnb3Q6ICIgPDwgYWN0dWFsIDw8IGVuZGw7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCisjZGVmaW5lIEJBU0VUWVBFX0lERU5USVRZX1RFU1QoZnVuYywgdmFsdWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvdXQgPDwgI2Z1bmMgIigiIDw8IHZhbHVlIDw8ICIpID0gIjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRyeSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCFwcmludF9lcSh2YWx1ZSwgdGVzdENsaWVudC5mdW5jKHZhbHVlKSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICByZXR1cm5fY29kZSB8PSBFUlJfQkFTRVRZUEVTOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGhyb3c7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gY2F0Y2ggKGV4Y2VwdGlvbiAmIGV4KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGwgPDwgZXgud2hhdCgpIDw8IGVuZGw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0JBU0VUWVBFUzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworaW50IGJpbmFyeV90ZXN0KFRocmlmdFRlc3RDbGllbnQmIHRlc3RDbGllbnQsIHN0cmluZzo6c2l6ZV90eXBlIHNpeik7CisKK0JPT1NUX0NPTlNURVhQUl9PUl9DT05TVCBpbnQgRVJSX0JBU0VUWVBFUyA9IDE7CitCT09TVF9DT05TVEVYUFJfT1JfQ09OU1QgaW50IEVSUl9TVFJVQ1RTID0gMjsKK0JPT1NUX0NPTlNURVhQUl9PUl9DT05TVCBpbnQgRVJSX0NPTlRBSU5FUlMgPSA0OworQk9PU1RfQ09OU1RFWFBSX09SX0NPTlNUIGludCBFUlJfRVhDRVBUSU9OUyA9IDg7CitCT09TVF9DT05TVEVYUFJfT1JfQ09OU1QgaW50IEVSUl9VTktOT1dOID0gNjQ7CisKIGludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgewotICBzdHJpbmcgZmlsZV9wYXRoID0gYm9vc3Q6OmZpbGVzeXN0ZW06OnN5c3RlbV9jb21wbGV0ZShhcmd2WzBdKS5zdHJpbmcoKTsKLSAgc3RyaW5nIGRpcl9wYXRoID0gZmlsZV9wYXRoLnN1YnN0cigwLCBmaWxlX3BhdGguc2l6ZSgpIC0gRVhFQ1VUQUJMRV9GSUxFX05BTUVfTEVOR1RIKTsKKyAgY291dC5wcmVjaXNpb24oMTkpOworCisgIHN0cmluZyB0ZXN0RGlyICA9IGJvb3N0OjpmaWxlc3lzdGVtOjpzeXN0ZW1fY29tcGxldGUoYXJndlswXSkucGFyZW50X3BhdGgoKS5wYXJlbnRfcGF0aCgpLnBhcmVudF9wYXRoKCkuc3RyaW5nKCk7CisgIHN0cmluZyBjYVBhdGggICA9IHRlc3REaXIgKyAiL2tleXMvQ0EucGVtIjsKKyAgc3RyaW5nIGNlcnRQYXRoID0gdGVzdERpciArICIva2V5cy9jbGllbnQuY3J0IjsKKyAgc3RyaW5nIGtleVBhdGggID0gdGVzdERpciArICIva2V5cy9jbGllbnQua2V5IjsKKwogI2lmIF9XSU4zMgogICB0cmFuc3BvcnQ6OlRXaW5zb2NrU2luZ2xldG9uOjpjcmVhdGUoKTsKICNlbmRpZgpAQCAtMTE2LDQ3ICsxNTQsNjUgQEAKICAgaW50IHBvcnQgPSA5MDkwOwogICBpbnQgbnVtVGVzdHMgPSAxOwogICBib29sIHNzbCA9IGZhbHNlOworICBib29sIHpsaWIgPSBmYWxzZTsKICAgc3RyaW5nIHRyYW5zcG9ydF90eXBlID0gImJ1ZmZlcmVkIjsKICAgc3RyaW5nIHByb3RvY29sX3R5cGUgPSAiYmluYXJ5IjsKICAgc3RyaW5nIGRvbWFpbl9zb2NrZXQgPSAiIjsKKyAgYm9vbCBhYnN0cmFjdF9uYW1lc3BhY2UgPSBmYWxzZTsKICAgYm9vbCBub2luc2FuZSA9IGZhbHNlOwogCisgIGludCByZXR1cm5fY29kZSA9IDA7CisKICAgYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6b3B0aW9uc19kZXNjcmlwdGlvbiBkZXNjKCJBbGxvd2VkIG9wdGlvbnMiKTsKLSAgZGVzYy5hZGRfb3B0aW9ucygpKCJoZWxwLGgiLAotICAgICAgICAgICAgICAgICAgICAgInByb2R1Y2UgaGVscCBtZXNzYWdlIikoImhvc3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6dmFsdWU8c3RyaW5nPigmaG9zdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPmRlZmF1bHRfdmFsdWUoaG9zdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9zdCB0byBjb25uZWN0IikoInBvcnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3N0Ojpwcm9ncmFtX29wdGlvbnM6OnZhbHVlPGludD4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwb3J0KS0+ZGVmYXVsdF92YWx1ZShwb3J0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUG9ydCBudW1iZXIgdG8gY29ubmVjdCIpKAotICAgICAgImRvbWFpbi1zb2NrZXQiLAotICAgICAgYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6dmFsdWU8c3RyaW5nPigmZG9tYWluX3NvY2tldCktPmRlZmF1bHRfdmFsdWUoZG9tYWluX3NvY2tldCksCi0gICAgICAiRG9tYWluIFNvY2tldCAoZS5nLiAvdG1wL1RocmlmdFRlc3QudGhyaWZ0KSwgaW5zdGVhZCBvZiBob3N0IGFuZCBwb3J0IikoCi0gICAgICAidHJhbnNwb3J0IiwKLSAgICAgIGJvb3N0Ojpwcm9ncmFtX29wdGlvbnM6OnZhbHVlPHN0cmluZz4oJnRyYW5zcG9ydF90eXBlKS0+ZGVmYXVsdF92YWx1ZSh0cmFuc3BvcnRfdHlwZSksCi0gICAgICAiVHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkLCBodHRwLCBldmh0dHAiKSgKLSAgICAgICJwcm90b2NvbCIsCi0gICAgICBib29zdDo6cHJvZ3JhbV9vcHRpb25zOjp2YWx1ZTxzdHJpbmc+KCZwcm90b2NvbF90eXBlKS0+ZGVmYXVsdF92YWx1ZShwcm90b2NvbF90eXBlKSwKLSAgICAgICJQcm90b2NvbDogYmluYXJ5LCBjb21wYWN0LCBqc29uIikoInNzbCIsICJFbmNyeXB0ZWQgVHJhbnNwb3J0IHVzaW5nIFNTTCIpKAotICAgICAgInRlc3Rsb29wcyxuIiwKLSAgICAgIGJvb3N0Ojpwcm9ncmFtX29wdGlvbnM6OnZhbHVlPGludD4oJm51bVRlc3RzKS0+ZGVmYXVsdF92YWx1ZShudW1UZXN0cyksCi0gICAgICAiTnVtYmVyIG9mIFRlc3RzIikoIm5vaW5zYW5lIiwgIkRvIG5vdCBydW4gaW5zYW5pdHkgdGVzdCIpOworICBkZXNjLmFkZF9vcHRpb25zKCkKKyAgICAgICgiaGVscCxoIiwgInByb2R1Y2UgaGVscCBtZXNzYWdlIikKKyAgICAgICgiaG9zdCIsCisgICAgICAgICAgYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6dmFsdWU8c3RyaW5nPigmaG9zdCktPmRlZmF1bHRfdmFsdWUoaG9zdCksCisgICAgICAgICAgIkhvc3QgdG8gY29ubmVjdCIpCisgICAgICAoInBvcnQiLAorICAgICAgICAgIGJvb3N0Ojpwcm9ncmFtX29wdGlvbnM6OnZhbHVlPGludD4oJnBvcnQpLT5kZWZhdWx0X3ZhbHVlKHBvcnQpLAorICAgICAgICAgICJQb3J0IG51bWJlciB0byBjb25uZWN0IikKKyAgICAgICgiZG9tYWluLXNvY2tldCIsCisgICAgICAgICAgYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6dmFsdWU8c3RyaW5nPigmZG9tYWluX3NvY2tldCktPmRlZmF1bHRfdmFsdWUoZG9tYWluX3NvY2tldCksCisgICAgICAgICAgIkRvbWFpbiBTb2NrZXQgKGUuZy4gL3RtcC9UaHJpZnRUZXN0LnRocmlmdCksIGluc3RlYWQgb2YgaG9zdCBhbmQgcG9ydCIpCisgICAgICAoImFic3RyYWN0LW5hbWVzcGFjZSIsCisgICAgICAgICAgIkxvb2sgZm9yIHRoZSBkb21haW4gc29ja2V0IGluIHRoZSBBYnN0cmFjdCBOYW1lc3BhY2UiCisgICAgICAgICAgIiAobm8gY29ubmVjdGlvbiB3aXRoIGZpbGVzeXN0ZW0gcGF0aG5hbWVzKSIpCisgICAgICAoInRyYW5zcG9ydCIsCisgICAgICAgICAgYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6dmFsdWU8c3RyaW5nPigmdHJhbnNwb3J0X3R5cGUpLT5kZWZhdWx0X3ZhbHVlKHRyYW5zcG9ydF90eXBlKSwKKyAgICAgICAgICAiVHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkLCBodHRwLCBldmh0dHAsIHpsaWIiKQorICAgICAgKCJwcm90b2NvbCIsCisgICAgICAgICAgYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6dmFsdWU8c3RyaW5nPigmcHJvdG9jb2xfdHlwZSktPmRlZmF1bHRfdmFsdWUocHJvdG9jb2xfdHlwZSksCisgICAgICAgICAgIlByb3RvY29sOiBiaW5hcnksIGNvbXBhY3QsIGhlYWRlciwganNvbiwgbXVsdGksIG11bHRpYywgbXVsdGloLCBtdWx0aWoiKQorICAgICAgKCJzc2wiLAorICAgICAgICAgICJFbmNyeXB0ZWQgVHJhbnNwb3J0IHVzaW5nIFNTTCIpCisgICAgICAoInpsaWIiLAorICAgICAgICAgICJXcmFwIFRyYW5zcG9ydCB3aXRoIFpsaWIiKQorICAgICAgKCJ0ZXN0bG9vcHMsbiIsCisgICAgICAgICAgYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6dmFsdWU8aW50PigmbnVtVGVzdHMpLT5kZWZhdWx0X3ZhbHVlKG51bVRlc3RzKSwKKyAgICAgICAgICAiTnVtYmVyIG9mIFRlc3RzIikKKyAgICAgICgibm9pbnNhbmUiLAorICAgICAgICAgICJEbyBub3QgcnVuIGluc2FuaXR5IHRlc3QiKTsKIAogICBib29zdDo6cHJvZ3JhbV9vcHRpb25zOjp2YXJpYWJsZXNfbWFwIHZtOwogICBib29zdDo6cHJvZ3JhbV9vcHRpb25zOjpzdG9yZShib29zdDo6cHJvZ3JhbV9vcHRpb25zOjpwYXJzZV9jb21tYW5kX2xpbmUoYXJnYywgYXJndiwgZGVzYyksIHZtKTsKICAgYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6bm90aWZ5KHZtKTsKIAogICBpZiAodm0uY291bnQoImhlbHAiKSkgewotICAgIGNvdXQgPDwgZGVzYyA8PCAiXG4iOwotICAgIHJldHVybiAxOworICAgIGNvdXQgPDwgZGVzYyA8PCBlbmRsOworICAgIHJldHVybiBFUlJfVU5LTk9XTjsKICAgfQogCiAgIHRyeSB7CiAgICAgaWYgKCFwcm90b2NvbF90eXBlLmVtcHR5KCkpIHsKICAgICAgIGlmIChwcm90b2NvbF90eXBlID09ICJiaW5hcnkiKSB7CiAgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gImNvbXBhY3QiKSB7CisgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gImhlYWRlciIpIHsKICAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZSA9PSAianNvbiIpIHsKKyAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZSA9PSAibXVsdGkiKSB7CisgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gIm11bHRpYyIpIHsKKyAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZSA9PSAibXVsdGloIikgeworICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlID09ICJtdWx0aWoiKSB7CiAgICAgICB9IGVsc2UgewogICAgICAgICB0aHJvdyBpbnZhbGlkX2FyZ3VtZW50KCJVbmtub3duIHByb3RvY29sIHR5cGUgIiArIHByb3RvY29sX3R5cGUpOwogICAgICAgfQpAQCAtMTY3LDcwICsyMjMsMTAzIEBACiAgICAgICB9IGVsc2UgaWYgKHRyYW5zcG9ydF90eXBlID09ICJmcmFtZWQiKSB7CiAgICAgICB9IGVsc2UgaWYgKHRyYW5zcG9ydF90eXBlID09ICJodHRwIikgewogICAgICAgfSBlbHNlIGlmICh0cmFuc3BvcnRfdHlwZSA9PSAiZXZodHRwIikgeworICAgICAgfSBlbHNlIGlmICh0cmFuc3BvcnRfdHlwZSA9PSAiemxpYiIpIHsKKyAgICAgICAgLy8gY3Jvc3N0ZXN0IHdpbGwgcGFzcyB6bGliIGFzIGEgdHJhbnNwb3J0IGFuZCBhcyBhIGZsYWcgcmlnaHQgbm93Li4KICAgICAgIH0gZWxzZSB7CiAgICAgICAgIHRocm93IGludmFsaWRfYXJndW1lbnQoIlVua25vd24gdHJhbnNwb3J0IHR5cGUgIiArIHRyYW5zcG9ydF90eXBlKTsKICAgICAgIH0KICAgICB9CiAKLSAgfSBjYXRjaCAoc3RkOjpleGNlcHRpb24mIGUpIHsKKyAgfSBjYXRjaCAoZXhjZXB0aW9uJiBlKSB7CiAgICAgY2VyciA8PCBlLndoYXQoKSA8PCBlbmRsOwotICAgIGNvdXQgPDwgZGVzYyA8PCAiXG4iOwotICAgIHJldHVybiAxOworICAgIGNvdXQgPDwgZGVzYyA8PCBlbmRsOworICAgIHJldHVybiBFUlJfVU5LTk9XTjsKICAgfQogCiAgIGlmICh2bS5jb3VudCgic3NsIikpIHsKICAgICBzc2wgPSB0cnVlOwogICB9CiAKKyAgaWYgKHZtLmNvdW50KCJ6bGliIikpIHsKKyAgICB6bGliID0gdHJ1ZTsKKyAgfQorCisgIGlmICh2bS5jb3VudCgiYWJzdHJhY3QtbmFtZXNwYWNlIikpIHsKKyAgICBhYnN0cmFjdF9uYW1lc3BhY2UgPSB0cnVlOworICB9CisKICAgaWYgKHZtLmNvdW50KCJub2luc2FuZSIpKSB7CiAgICAgbm9pbnNhbmUgPSB0cnVlOwogICB9CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0OwotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvY29sOwotCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHNvY2tldDsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3Rvcnk7CisgIC8vIFRIUklGVC00MTY0OiBUaGUgZmFjdG9yeSBNVVNUIG91dGxpdmUgYW55IHNvY2tldHMgaXQgY3JlYXRlcyBmb3IgY29ycmVjdCBiZWhhdmlvciEKKyAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5OworICBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gc29ja2V0OworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0OworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90b2NvbDsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG9jb2wyOyAgLy8gU2Vjb25kU2VydmljZSBmb3IgbXVsdGlwbGV4ZWQKIAogICBpZiAoc3NsKSB7Ci0gICAgZmFjdG9yeSA9IGJvb3N0OjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PihuZXcgVFNTTFNvY2tldEZhY3RvcnkoKSk7CisgICAgY291dCA8PCAiQ2xpZW50IENlcnRpZmljYXRlIEZpbGU6ICIgPDwgY2VydFBhdGggPDwgZW5kbDsKKyAgICBjb3V0IDw8ICJDbGllbnQgS2V5ICAgICAgICAgRmlsZTogIiA8PCBrZXlQYXRoIDw8IGVuZGw7CisgICAgY291dCA8PCAiQ0EgICAgICAgICAgICAgICAgIEZpbGU6ICIgPDwgY2FQYXRoIDw8IGVuZGw7CisKKyAgICBmYWN0b3J5ID0gc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PihuZXcgVFNTTFNvY2tldEZhY3RvcnkoKSk7CiAgICAgZmFjdG9yeS0+Y2lwaGVycygiQUxMOiFBREg6IUxPVzohRVhQOiFNRDU6QFNUUkVOR1RIIik7Ci0gICAgZmFjdG9yeS0+bG9hZFRydXN0ZWRDZXJ0aWZpY2F0ZXMoKGRpcl9wYXRoICsgIi4uL2tleXMvQ0EucGVtIikuY19zdHIoKSk7CisgICAgZmFjdG9yeS0+bG9hZFRydXN0ZWRDZXJ0aWZpY2F0ZXMoY2FQYXRoLmNfc3RyKCkpOworICAgIGZhY3RvcnktPmxvYWRDZXJ0aWZpY2F0ZShjZXJ0UGF0aC5jX3N0cigpKTsKKyAgICBmYWN0b3J5LT5sb2FkUHJpdmF0ZUtleShrZXlQYXRoLmNfc3RyKCkpOwogICAgIGZhY3RvcnktPmF1dGhlbnRpY2F0ZSh0cnVlKTsKICAgICBzb2NrZXQgPSBmYWN0b3J5LT5jcmVhdGVTb2NrZXQoaG9zdCwgcG9ydCk7CiAgIH0gZWxzZSB7CiAgICAgaWYgKGRvbWFpbl9zb2NrZXQgIT0gIiIpIHsKLSAgICAgIHNvY2tldCA9IGJvb3N0OjpzaGFyZWRfcHRyPFRTb2NrZXQ+KG5ldyBUU29ja2V0KGRvbWFpbl9zb2NrZXQpKTsKKyAgICAgIGlmIChhYnN0cmFjdF9uYW1lc3BhY2UpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgYWJzdHJhY3Rfc29ja2V0KCJcMCIsIDEpOworICAgICAgICBhYnN0cmFjdF9zb2NrZXQgKz0gZG9tYWluX3NvY2tldDsKKyAgICAgICAgc29ja2V0ID0gc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+KG5ldyBUU29ja2V0KGFic3RyYWN0X3NvY2tldCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc29ja2V0ID0gc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+KG5ldyBUU29ja2V0KGRvbWFpbl9zb2NrZXQpKTsKKyAgICAgIH0KICAgICAgIHBvcnQgPSAwOwogICAgIH0gZWxzZSB7Ci0gICAgICBzb2NrZXQgPSBib29zdDo6c2hhcmVkX3B0cjxUU29ja2V0PihuZXcgVFNvY2tldChob3N0LCBwb3J0KSk7CisgICAgICBzb2NrZXQgPSBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4obmV3IFRTb2NrZXQoaG9zdCwgcG9ydCkpOwogICAgIH0KICAgfQogCiAgIGlmICh0cmFuc3BvcnRfdHlwZS5jb21wYXJlKCJodHRwIikgPT0gMCkgewotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGh0dHBTb2NrZXQobmV3IFRIdHRwQ2xpZW50KHNvY2tldCwgaG9zdCwgIi9zZXJ2aWNlIikpOwotICAgIHRyYW5zcG9ydCA9IGh0dHBTb2NrZXQ7CisgICAgdHJhbnNwb3J0ID0gc3RkOjptYWtlX3NoYXJlZDxUSHR0cENsaWVudD4oc29ja2V0LCBob3N0LCAiL3NlcnZpY2UiKTsKICAgfSBlbHNlIGlmICh0cmFuc3BvcnRfdHlwZS5jb21wYXJlKCJmcmFtZWQiKSA9PSAwKSB7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VEZyYW1lZFRyYW5zcG9ydD4gZnJhbWVkU29ja2V0KG5ldyBURnJhbWVkVHJhbnNwb3J0KHNvY2tldCkpOwotICAgIHRyYW5zcG9ydCA9IGZyYW1lZFNvY2tldDsKKyAgICB0cmFuc3BvcnQgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRGcmFtZWRUcmFuc3BvcnQ+KHNvY2tldCk7CiAgIH0gZWxzZSB7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VEJ1ZmZlcmVkVHJhbnNwb3J0PiBidWZmZXJlZFNvY2tldChuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KHNvY2tldCkpOwotICAgIHRyYW5zcG9ydCA9IGJ1ZmZlcmVkU29ja2V0OworICAgIHRyYW5zcG9ydCA9IHN0ZDo6bWFrZV9zaGFyZWQ8VEJ1ZmZlcmVkVHJhbnNwb3J0Pihzb2NrZXQpOwogICB9CiAKLSAgaWYgKHByb3RvY29sX3R5cGUuY29tcGFyZSgianNvbiIpID09IDApIHsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGpzb25Qcm90b2NvbChuZXcgVEpTT05Qcm90b2NvbCh0cmFuc3BvcnQpKTsKLSAgICBwcm90b2NvbCA9IGpzb25Qcm90b2NvbDsKLSAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlLmNvbXBhcmUoImNvbXBhY3QiKSA9PSAwKSB7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBjb21wYWN0UHJvdG9jb2wobmV3IFRDb21wYWN0UHJvdG9jb2wodHJhbnNwb3J0KSk7Ci0gICAgcHJvdG9jb2wgPSBjb21wYWN0UHJvdG9jb2w7CisgIGlmICh6bGliKSB7CisgICAgdHJhbnNwb3J0ID0gc3RkOjptYWtlX3NoYXJlZDxUWmxpYlRyYW5zcG9ydD4odHJhbnNwb3J0KTsKKyAgfQorCisgIGlmIChwcm90b2NvbF90eXBlID09ICJqc29uIiB8fCBwcm90b2NvbF90eXBlID09ICJtdWx0aWoiKSB7CisgICAgcHJvdG9jb2wgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRKU09OUHJvdG9jb2w+KHRyYW5zcG9ydCk7CisgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZSA9PSAiY29tcGFjdCIgfHwgcHJvdG9jb2xfdHlwZSA9PSAibXVsdGljIikgeworICAgIHByb3RvY29sID0gc3RkOjptYWtlX3NoYXJlZDxUQ29tcGFjdFByb3RvY29sPih0cmFuc3BvcnQpOworICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gImhlYWRlciIgfHwgcHJvdG9jb2xfdHlwZSA9PSAibXVsdGloIikgeworICAgIHByb3RvY29sID0gc3RkOjptYWtlX3NoYXJlZDxUSGVhZGVyUHJvdG9jb2w+KHRyYW5zcG9ydCk7CiAgIH0gZWxzZSB7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VEJpbmFyeVByb3RvY29sPiBiaW5hcnlQcm90b2NvbChuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCkpOwotICAgIHByb3RvY29sID0gYmluYXJ5UHJvdG9jb2w7CisgICAgcHJvdG9jb2wgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRCaW5hcnlQcm90b2NvbD4odHJhbnNwb3J0KTsKKyAgfQorCisgIGlmIChib29zdDo6c3RhcnRzX3dpdGgocHJvdG9jb2xfdHlwZSwgIm11bHRpIikpIHsKKyAgcHJvdG9jb2wyID0gc3RkOjptYWtlX3NoYXJlZDxUTXVsdGlwbGV4ZWRQcm90b2NvbD4ocHJvdG9jb2wsICJTZWNvbmRTZXJ2aWNlIik7CisgIC8vIHdlIGRvbid0IG5lZWQgYWNjZXNzIHRvIHRoZSBvcmlnaW5hbCBwcm90b2NvbCBhbnkgbW9yZSwgc28uLi4KKyAgcHJvdG9jb2wgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRNdWx0aXBsZXhlZFByb3RvY29sPihwcm90b2NvbCwgIlRocmlmdFRlc3QiKTsKICAgfQogCiAgIC8vIENvbm5lY3Rpb24gaW5mbwotICBjb3V0IDw8ICJDb25uZWN0aW5nICgiIDw8IHRyYW5zcG9ydF90eXBlIDw8ICIvIiA8PCBwcm90b2NvbF90eXBlIDw8ICIpIHRvOiAiIDw8IGRvbWFpbl9zb2NrZXQ7CisgIGNvdXQgPDwgIkNvbm5lY3RpbmcgKCIgPDwgdHJhbnNwb3J0X3R5cGUgPDwgIi8iIDw8IHByb3RvY29sX3R5cGUgPDwgIikgdG86ICI7CisgIGlmIChhYnN0cmFjdF9uYW1lc3BhY2UpIHsKKyAgICBjb3V0IDw8ICdAJzsKKyAgfQorICBjb3V0IDw8IGRvbWFpbl9zb2NrZXQ7CiAgIGlmIChwb3J0ICE9IDApIHsKICAgICBjb3V0IDw8IGhvc3QgPDwgIjoiIDw8IHBvcnQ7CiAgIH0KQEAgLTI0NCwxNyArMzMzLDE0IEBACiAgICAgY291dCA8PCAiTGliZXZlbnQgRmVhdHVyZXM6IDB4IiA8PCBoZXggPDwgZXZlbnRfYmFzZV9nZXRfZmVhdHVyZXMoYmFzZSkgPDwgZW5kbDsKICNlbmRpZgogCi0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnkobmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSk7CiAKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUQXN5bmNDaGFubmVsPiBjaGFubmVsKAorICAgIHN0ZDo6c2hhcmVkX3B0cjxUQXN5bmNDaGFubmVsPiBjaGFubmVsKAogICAgICAgICBuZXcgVEV2aHR0cENsaWVudENoYW5uZWwoaG9zdC5jX3N0cigpLCAiLyIsIGhvc3QuY19zdHIoKSwgcG9ydCwgYmFzZSkpOwogICAgIFRocmlmdFRlc3RDb2JDbGllbnQqIGNsaWVudCA9IG5ldyBUaHJpZnRUZXN0Q29iQ2xpZW50KGNoYW5uZWwsIHByb3RvY29sRmFjdG9yeS5nZXQoKSk7Ci0gICAgY2xpZW50LT50ZXN0Vm9pZCh0Y3h4OjpiaW5kKHRlc3RWb2lkX2NsaWVudFJldHVybiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdC5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0LAorICAgIGNsaWVudC0+dGVzdFZvaWQoc3RkOjpiaW5kKHRlc3RWb2lkX2NsaWVudFJldHVybiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LmdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y3h4OjpwbGFjZWhvbGRlcnM6Ol8xKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSkpOwogCiAgICAgZXZlbnRfYmFzZV9sb29wKGJhc2UsIDApOwogICAgIHJldHVybiAwOwpAQCAtMjY2LDIwICszNTIsMTQgQEAKICAgdWludDY0X3QgdGltZV9tYXggPSAwOwogICB1aW50NjRfdCB0aW1lX3RvdCA9IDA7CiAKLSAgaW50IHJldHVybl9jb2RlID0gMDsKLSAgaW50IEVSUl9CQVNFVFlQRVMgPSAxOwotICBpbnQgRVJSX1NUUlVDVFMgPSAyOwotICBpbnQgRVJSX0NPTlRBSU5FUlMgPSA0OwotICBpbnQgRVJSX0VYQ0VQVElPTlMgPSA4OwotCiAgIGludCB0ZXN0ID0gMDsKICAgZm9yICh0ZXN0ID0gMDsgdGVzdCA8IG51bVRlc3RzOyArK3Rlc3QpIHsKIAogICAgIHRyeSB7CiAgICAgICB0cmFuc3BvcnQtPm9wZW4oKTsKLSAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiB0dHgpIHsKLSAgICAgIHByaW50ZigiQ29ubmVjdCBmYWlsZWQ6ICVzXG4iLCB0dHgud2hhdCgpKTsKLSAgICAgIHJldHVybiAxOworICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIGV4KSB7CisgICAgICBjb3V0IDw8ICJDb25uZWN0IGZhaWxlZDogIiA8PCBleC53aGF0KCkgPDwgZW5kbDsKKyAgICAgIHJldHVybiBFUlJfVU5LTk9XTjsKICAgICB9CiAKICAgICAvKioKQEAgLTI5MywxNTAgKzM3MywyMjUgQEAKICAgICAgKiBWT0lEIFRFU1QKICAgICAgKi8KICAgICB0cnkgewotICAgICAgcHJpbnRmKCJ0ZXN0Vm9pZCgpIik7CisgICAgICBjb3V0IDw8ICJ0ZXN0Vm9pZCgpIiA8PCBmbHVzaDsKICAgICAgIHRlc3RDbGllbnQudGVzdFZvaWQoKTsKLSAgICAgIHByaW50ZigiID0gdm9pZFxuIik7Ci0gICAgfSBjYXRjaCAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uJiB0YXgpIHsKLSAgICAgIHByaW50ZigiKioqIEZBSUxFRCAqKipcbiIpOwotICAgICAgcHJpbnRmKCIlc1xuIiwgdGF4LndoYXQoKSk7CisgICAgICBjb3V0IDw8ICIgPSB2b2lkIiA8PCBlbmRsOworICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mKSB7CisgICAgICAvLyBTdG9wIGhlcmUgaWYgdHJhbnNwb3J0IGdvdCBicm9rZW4KKyAgICAgIHRocm93OworICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbiYgZXgpIHsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsIDw8IGV4LndoYXQoKSA8PCBlbmRsOwogICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0JBU0VUWVBFUzsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBTVFJJTkcgVEVTVAogICAgICAqLwotICAgIHByaW50ZigidGVzdFN0cmluZyhcIlRlc3RcIikiKTsKKyAgICBjb3V0IDw8ICJ0ZXN0U3RyaW5nKFwiVGVzdFwiKSIgPDwgZmx1c2g7CiAgICAgc3RyaW5nIHM7CiAgICAgdGVzdENsaWVudC50ZXN0U3RyaW5nKHMsICJUZXN0Iik7Ci0gICAgcHJpbnRmKCIgPSBcIiVzXCJcbiIsIHMuY19zdHIoKSk7CisgICAgY291dCA8PCAiID0gIiA8PCBzIDw8IGVuZGw7CiAgICAgaWYgKHMgIT0gIlRlc3QiKSB7Ci0gICAgICBwcmludGYoIioqKiBGQUlMRUQgKioqXG4iKTsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOwogICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0JBU0VUWVBFUzsKICAgICB9CiAKKyAgICAvLworICAgIC8vIE11bHRpcGxleGVkIHByb3RvY29sIC0gY2FsbCBhbm90aGVyIHNlcnZpY2UgbWV0aG9kCisgICAgLy8gaW4gdGhlIG1pZGRsZSBvZiB0aGUgVGhyaWZ0VGVzdAorICAgIC8vCisgICAgaWYgKGJvb3N0OjpzdGFydHNfd2l0aChwcm90b2NvbF90eXBlLCAibXVsdGkiKSkgeworICAgIFNlY29uZFNlcnZpY2VDbGllbnQgc3NjKHByb3RvY29sMik7CisgICAgLy8gdHJhbnNwb3J0IGlzIGFscmVhZHkgb3Blbi4uLgorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgY291dCA8PCAic2Vjb25kU2VydmljZS5zZWNvbmRUZXN0U3RyaW5nKFwiZm9vXCIpID0+ICIgPDwgZmx1c2g7CisgICAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgICAgIHNzYy5zZWNvbmR0ZXN0U3RyaW5nKHJlc3VsdCwgImZvbyIpOworICAgICAgY291dCA8PCAieyIgPDwgcmVzdWx0IDw8ICJ9IiA8PCBlbmRsOworICAgICAgfSBjYXRjaCAoc3RkOjpleGNlcHRpb24mIGUpIHsKKyAgICAgIGNvdXQgPDwgIiAgKioqIEZBSUxFRCAqKiogIiA8PCBlLndoYXQoKSA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0VYQ0VQVElPTlM7CisgICAgfQorICAgIH0KKworICAgIHRyeSB7CisjaWZkZWYgX01TQ19WRVIKKyNwcmFnbWEgd2FybmluZyggcHVzaCApCisjcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0NTY2ICkKKyNlbmRpZgorICAgICAgc3RyaW5nIHN0cigKKyAgICAgICAgICAifXtBZnJpa2FhbnMsIEFsZW1hbm5pc2NoLCBBcmFnb27DqXMsINin2YTYudix2KjZitipLCDZhdi12LHZiSwgIgorICAgICAgICAgICJBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXrJmXJiYXljYW4sINCR0LDRiNKh0L7RgNGCLCBCb2FyaXNjaCwgxb1lbWFpdMSXxaFrYSwgIgorICAgICAgICAgICLQkdC10LvQsNGA0YPRgdC60LDRjywg0JHQtdC70LDRgNGD0YHQutCw0Y8gKNGC0LDRgNCw0YjQutC10LLRltGG0LApLCDQkdGK0LvQs9Cw0YDRgdC60LgsIEJhbWFuYW5rYW4sICIKKyAgICAgICAgICAi4Kas4Ka+4KaC4Kay4Ka+LCBCcmV6aG9uZWcsIEJvc2Fuc2tpLCBDYXRhbMOgLCBNw6xuZy1kxJXMpG5nLW5n4bmzzIQsINCd0L7RhdGH0LjQudC9LCAiCisgICAgICAgICAgIkNlYnVhbm8sIOGPo+GOs+GOqSwgxIxlc2t5LCDQodC70L7QstGjzIHQvdGM0YHQutGKIC8g4rCU4rCO4rCR4rCC4rCh4rCQ4rCg4rCU4rCN4rCfLCDQp9OR0LLQsNGI0LvQsCwgQ3ltcmFlZywgIgorICAgICAgICAgICJEYW5zaywgWmF6YWtpLCDei96o3ojerN6A3qjehN6m3pDesCwgzpXOu867zrfOvc65zrrOrCwgRW1pbGnDoG4gZSBydW1hZ27DsmwsIEVuZ2xpc2gsICIKKyAgICAgICAgICAiRXNwZXJhbnRvLCBFc3Bhw7FvbCwgRWVzdGksIEV1c2thcmEsINmB2KfYsdiz24wsIFN1b21pLCBWw7VybywgRsO4cm95c2t0LCAiCisgICAgICAgICAgIkZyYW7Dp2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwg6LSb6KqeLCBHw6BpZGhsaWcsIEdhbGVnbywgIgorICAgICAgICAgICJBdmHDsWUn4bq9LCDgqpfgq4HgqpzgqrDgqr7gqqTgq4AsIEdhZWxnLCDXoteR16jXmdeqLCDgpLngpL/gpKjgpY3gpKbgpYAsIEZpamkgSGluZGksIEhydmF0c2tpLCAiCisgICAgICAgICAgIktyZXnDsmwgYXlpc3llbiwgTWFneWFyLCDVgNWh1bXVpdaA1aXVtiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsICIKKyAgICAgICAgICAiSWxva2FubywgSWRvLCDDjXNsZW5za2EsIEl0YWxpYW5vLCDml6XmnKzoqp4sIExvamJhbiwgQmFzYSBKYXdhLCAiCisgICAgICAgICAgIuGDpeGDkOGDoOGDl+GDo+GDmuGDmCwgS29uZ28sIEthbGFhbGxpc3V0LCDgspXgsqjgs43gsqjgsqEsIO2VnOq1reyWtCwg0JrRitCw0YDQsNGH0LDQuS3QnNCw0LvQutGK0LDRgCwgIgorICAgICAgICAgICJSaXBvYXJpc2NoLCBLdXJkw64sINCa0L7QvNC4LCBLZXJuZXdlaywg0JrRi9GA0LPRi9C30YfQsCwgTGF0aW5hLCBMYWRpbm8sICIKKyAgICAgICAgICAiTMOrdHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ8OhbGEsIOC6peC6suC6pywgTGlldHV2acWzLCBMYXR2aWXFoXUsIEJhc2EgIgorICAgICAgICAgICJCYW55dW1hc2FuLCBNYWxhZ2FzeSwg0JzQsNC60LXQtNC+0L3RgdC60LgsIOC0ruC0suC0r+C0vuC0s+C0giwg4KSu4KSw4KS+4KSg4KWALCDZhdin2LLZkNix2YjZhtuMLCBCYWhhc2EgIgorICAgICAgICAgICJNZWxheXUsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCDgpKjgpYfgpKrgpL7gpLIg4KSt4KS+4KS34KS+LCBOZWRlcmxhbmRzLCDigKoiCisgICAgICAgICAgIk5vcnNrIChueW5vcnNrKeKArCwg4oCqTm9yc2sgKGJva23DpWwp4oCsLCBOb3Vvcm1hbmQsIERpbsOpIGJpemFhZCwgIgorICAgICAgICAgICJPY2NpdGFuLCDQmNGA0L7QvdCw0YMsIFBhcGlhbWVudHUsIERlaXRzY2gsIFBvbHNraSwg2b7Zhtis2KfYqNuMLCDZvtqa2KrZiCwgIgorICAgICAgICAgICJOb3JmdWsgLyBQaXRrZXJuLCBQb3J0dWd1w6pzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb23Dom7EgywgIgorICAgICAgICAgICLQoNGD0YHRgdC60LjQuSwg0KHQsNGF0LAg0YLRi9C70LAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTw6FtZWdpZWxsYSwgU2ltcGxlICIKKyAgICAgICAgICAiRW5nbGlzaCwgU2xvdmVuxI1pbmEsIFNsb3ZlbsWhxI1pbmEsINCh0YDQv9GB0LrQuCAvIFNycHNraSwgU2VlbHRlcnNrLCAiCisgICAgICAgICAgIlN2ZW5za2EsIEtpc3dhaGlsaSwg4K6k4K6u4K6/4K604K+NLCDgsKTgsYbgsLLgsYHgsJfgsYEsINCi0L7St9C40LrToywg4LmE4LiX4LiiLCBUw7xya21lbsOnZSwgVGFnYWxvZywgIgorICAgICAgICAgICJUw7xya8OnZSwg0KLQsNGC0LDRgNGH0LAvVGF0YXLDp2EsINCj0LrRgNCw0ZfQvdGB0YzQutCwLCDYp9ix2K/ZiCwgVGnhur9uZyBWaeG7h3QsIFZvbGFww7xrLCAiCisgICAgICAgICAgIldhbG9uLCBXaW5hcmF5LCDlkLTor60sIGlzaVhob3NhLCDXmdeZ1rTXk9eZ16ksIFlvcsO5YsOhLCBaZcOqdXdzLCDkuK3mlocsICIKKyAgICAgICAgICAiQsOibi1sw6JtLWfDuiwg57K16KqeIik7CisjaWZkZWYgX01TQ19WRVIKKyNwcmFnbWEgd2FybmluZyggcG9wICkKKyNlbmRpZgorICAgICAgY291dCA8PCAidGVzdFN0cmluZygiIDw8IHN0ciA8PCAiKSA9ICIgPDwgZmx1c2g7CisgICAgICB0ZXN0Q2xpZW50LnRlc3RTdHJpbmcocywgc3RyKTsKKyAgICAgIGNvdXQgPDwgcyA8PCBlbmRsOworICAgICAgaWYgKHMgIT0gc3RyKSB7CisgICAgICAgIGNvdXQuaW1idWUobG9jYWxlKCJlbl9VUy5VVEY4IikpOworICAgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbCA8PCAiRXhwZWN0ZWQgc3RyaW5nOiAiIDw8IHN0ciA8PCAiIGJ1dCBnb3Q6ICIgPDwgcyA8PCBlbmRsIDw8ICJDTEVBUiI7CisgICAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9CQVNFVFlQRVM7CisgICAgICB9CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYpIHsKKyAgICAgIHRocm93OworICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbiYgZXgpIHsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsIDw8IGV4LndoYXQoKSA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0JBU0VUWVBFUzsKKyAgICAgIHJldHVybiByZXR1cm5fY29kZTsKKyAgICB9CisgICAgdHJ5IHsKKyAgICAgIHN0cmluZyBzdHIoCisgICAgICAgICAgInF1b3RlOiBcIiBiYWNrc2xhc2g6IgorICAgICAgICAgICIgZm9yd2FyZHNsYXNoLWVzY2FwZWQ6IFxcLyAiCisgICAgICAgICAgIiBiYWNrc3BhY2U6IFxiIGZvcm1mZWVkOiBcZiBuZXdsaW5lOiBcbiByZXR1cm46IFxyIHRhYjogIgorICAgICAgICAgICIgbm93LWFsbC1vZi10aGVtLXRvZ2V0aGVyOiBcIlxcXFwvXGJcblxyXHQiCisgICAgICAgICAgIiBub3ctYS1idW5jaC1vZi1qdW5rOiAhQCMkJSYoKSgmJSQje317fTw+PD48IgorICAgICAgICAgICIgY2hhci10by10ZXN0LWpzb24tcGFyc2luZzogXV0gXCJdXSBcXFwiIH19fXsgW1tbICIpOworICAgICAgY291dCA8PCAidGVzdFN0cmluZygiIDw8IHN0ciA8PCAiKSA9ICIgPDwgZmx1c2g7CisgICAgICB0ZXN0Q2xpZW50LnRlc3RTdHJpbmcocywgc3RyKTsKKyAgICAgIGNvdXQgPDwgcyA8PCBlbmRsOworICAgICAgaWYgKHMgIT0gc3RyKSB7CisgICAgICAgIGNvdXQuaW1idWUobG9jYWxlKCJlbl9VUy5VVEY4IikpOworICAgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICJFeHBlY3RlZCBzdHJpbmc6ICIgPDwgc3RyIDw8ICIgYnV0IGdvdDogIiA8PCBzIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiQ0xFQVIiOworICAgICAgICA7CisgICAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9CQVNFVFlQRVM7CisgICAgICB9CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYpIHsKKyAgICAgIHRocm93OworICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbiYgZXgpIHsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsIDw8IGV4LndoYXQoKSA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0JBU0VUWVBFUzsKKyAgICAgIHJldHVybiByZXR1cm5fY29kZTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBCT09MIFRFU1QKICAgICAgKi8KLSAgICBwcmludGYoInRlc3RCb29sKHRydWUpIik7Ci0gICAgYm9vbCBibCA9IHRlc3RDbGllbnQudGVzdEJvb2wodHJ1ZSk7Ci0gICAgcHJpbnRmKCIgPSAlc1xuIiwgYmwgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICBpZiAoYmwgIT0gdHJ1ZSkgewotICAgICAgcHJpbnRmKCIqKiogRkFJTEVEICoqKlxuIik7Ci0gICAgICByZXR1cm5fY29kZSB8PSBFUlJfQkFTRVRZUEVTOwotICAgIH0KLQotICAgIHByaW50ZigidGVzdEJvb2woZmFsc2UpIik7Ci0gICAgYmwgPSB0ZXN0Q2xpZW50LnRlc3RCb29sKGZhbHNlKTsKLSAgICBwcmludGYoIiA9ICVzXG4iLCBibCA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICAgIGlmIChibCAhPSBmYWxzZSkgewotICAgICAgcHJpbnRmKCIqKiogRkFJTEVEICoqKlxuIik7Ci0gICAgICByZXR1cm5fY29kZSB8PSBFUlJfQkFTRVRZUEVTOwotICAgIH0KKyAgICBjb3V0IDw8IGJvb2xhbHBoYTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RCb29sLCB0cnVlKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RCb29sLCBmYWxzZSk7CiAKICAgICAvKioKICAgICAgKiBCWVRFIFRFU1QKICAgICAgKi8KLSAgICBwcmludGYoInRlc3RCeXRlKDEpIik7Ci0gICAgdWludDhfdCB1OCA9IHRlc3RDbGllbnQudGVzdEJ5dGUoMSk7Ci0gICAgcHJpbnRmKCIgPSAlZFxuIiwgKGludCl1OCk7Ci0gICAgaWYgKHU4ICE9IDEpIHsKLSAgICAgIHByaW50ZigiKioqIEZBSUxFRCAqKipcbiIpOwotICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0JBU0VUWVBFUzsKLSAgICB9CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0Qnl0ZSwgKGludDhfdCkwKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RCeXRlLCAoaW50OF90KS0xKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RCeXRlLCAoaW50OF90KTQyKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RCeXRlLCAoaW50OF90KS00Mik7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0Qnl0ZSwgKGludDhfdCkxMjcpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEJ5dGUsIChpbnQ4X3QpLTEyOCk7CiAKICAgICAvKioKICAgICAgKiBJMzIgVEVTVAogICAgICAqLwotICAgIHByaW50ZigidGVzdEkzMigtMSkiKTsKLSAgICBpbnQzMl90IGkzMiA9IHRlc3RDbGllbnQudGVzdEkzMigtMSk7Ci0gICAgcHJpbnRmKCIgPSAlZFxuIiwgaTMyKTsKLSAgICBpZiAoaTMyICE9IC0xKSB7Ci0gICAgICBwcmludGYoIioqKiBGQUlMRUQgKioqXG4iKTsKLSAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9CQVNFVFlQRVM7Ci0gICAgfQorICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEkzMiwgMCk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0STMyLCAtMSk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0STMyLCAxOTAwMDAwMTMpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEkzMiwgLTE5MDAwMDAxMyk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0STMyLCAobnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1heCkoKSk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0STMyLCAobnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1pbikoKSk7CiAKICAgICAvKioKICAgICAgKiBJNjQgVEVTVAogICAgICAqLwotICAgIHByaW50ZigidGVzdEk2NCgtMzQzNTk3MzgzNjgpIik7Ci0gICAgaW50NjRfdCBpNjQgPSB0ZXN0Q2xpZW50LnRlc3RJNjQoLTM0MzU5NzM4MzY4TEwpOwotICAgIHByaW50ZigiID0gJSIgUFJJZDY0ICJcbiIsIGk2NCk7Ci0gICAgaWYgKGk2NCAhPSAtMzQzNTk3MzgzNjhMTCkgewotICAgICAgcHJpbnRmKCIqKiogRkFJTEVEICoqKlxuIik7Ci0gICAgICByZXR1cm5fY29kZSB8PSBFUlJfQkFTRVRZUEVTOwotICAgIH0KKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RJNjQsIChpbnQ2NF90KTApOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEk2NCwgKGludDY0X3QpLTEpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEk2NCwgKGludDY0X3QpNzAwMDAwMDAwMDAwMDAwMDEyM0xMKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RJNjQsIChpbnQ2NF90KS03MDAwMDAwMDAwMDAwMDAwMTIzTEwpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEk2NCwgKGludDY0X3QpcG93KHN0YXRpY19jYXN0PGRvdWJsZT4oMkxMKSwgMzIpKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RJNjQsIChpbnQ2NF90KS1wb3coc3RhdGljX2Nhc3Q8ZG91YmxlPigyTEwpLCAzMikpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEk2NCwgKGludDY0X3QpcG93KHN0YXRpY19jYXN0PGRvdWJsZT4oMkxMKSwgMzIpICsgMSk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0STY0LCAoaW50NjRfdCktcG93KHN0YXRpY19jYXN0PGRvdWJsZT4oMkxMKSwgMzIpIC0gMSk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0STY0LCAobnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1heCkoKSk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0STY0LCAobnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1pbikoKSk7CiAKICAgICAvKioKICAgICAgKiBET1VCTEUgVEVTVAogICAgICAqLwotICAgIHByaW50ZigidGVzdERvdWJsZSgtNS4yMDk4NTIzKSIpOwotICAgIGRvdWJsZSBkdWIgPSB0ZXN0Q2xpZW50LnRlc3REb3VibGUoLTUuMjA5ODUyMyk7Ci0gICAgcHJpbnRmKCIgPSAlZlxuIiwgZHViKTsKLSAgICBpZiAoKGR1YiAtICgtNS4yMDk4NTIzKSkgPiAwLjAwMSkgewotICAgICAgcHJpbnRmKCIqKiogRkFJTEVEICoqKlxuIik7CisgICAgLy8gQ29tcGFyaW5nIGRvdWJsZSB2YWx1ZXMgd2l0aCBwbGFpbiBlcXVhbGl0eSBiZWNhdXNlIFRocmlmdCBoYW5kbGVzIGZ1bGwgcHJlY2lzaW9uIG9mIGRvdWJsZQorICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdERvdWJsZSwgMC4wKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3REb3VibGUsIC0xLjApOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdERvdWJsZSwgLTUuMjA5ODUyMyk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0RG91YmxlLCAtMC4wMDAzNDEwMTI0Mzk2Mzg1OTgyNzkpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdERvdWJsZSwgcG93KHN0YXRpY19jYXN0PGRvdWJsZT4oMiksIDMyKSk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0RG91YmxlLCBwb3coc3RhdGljX2Nhc3Q8ZG91YmxlPigyKSwgMzIpICsgMSk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0RG91YmxlLCBwb3coc3RhdGljX2Nhc3Q8ZG91YmxlPigyKSwgNTMpIC0gMSk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0RG91YmxlLCAtcG93KHN0YXRpY19jYXN0PGRvdWJsZT4oMiksIDMyKSk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0RG91YmxlLCAtcG93KHN0YXRpY19jYXN0PGRvdWJsZT4oMiksIDMyKSAtIDEpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdERvdWJsZSwgLXBvdyhzdGF0aWNfY2FzdDxkb3VibGU+KDIpLCA1MykgKyAxKTsKKworICAgIHRyeSB7CisgICAgICBkb3VibGUgZXhwZWN0ZWQgPSBwb3coc3RhdGljX2Nhc3Q8ZG91YmxlPigxMCksIDMwNyk7CisgICAgICBjb3V0IDw8ICJ0ZXN0RG91YmxlKCIgPDwgZXhwZWN0ZWQgPDwgIikgPSAiIDw8IGZsdXNoOworICAgICAgZG91YmxlIGFjdHVhbCA9IHRlc3RDbGllbnQudGVzdERvdWJsZShleHBlY3RlZCk7CisgICAgICBjb3V0IDw8ICIoIiA8PCBhY3R1YWwgPDwgIikiIDw8IGVuZGw7CisgICAgICBpZiAoZXhwZWN0ZWQgLSBhY3R1YWwgPiBwb3coc3RhdGljX2Nhc3Q8ZG91YmxlPigxMCksIDI5MikpIHsKKyAgICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiRXhwZWN0ZWQ6ICIgPDwgZXhwZWN0ZWQgPDwgIiBidXQgZ290OiAiIDw8IGFjdHVhbCA8PCBlbmRsOworICAgICAgfQorICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mKSB7CisgICAgICB0aHJvdzsKKyAgICB9IGNhdGNoIChleGNlcHRpb24mIGV4KSB7CisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbCA8PCBleC53aGF0KCkgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9CQVNFVFlQRVM7CisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIGRvdWJsZSBleHBlY3RlZCA9IHBvdyhzdGF0aWNfY2FzdDxkb3VibGU+KDEwKSwgLTI5Mik7CisgICAgICBjb3V0IDw8ICJ0ZXN0RG91YmxlKCIgPDwgZXhwZWN0ZWQgPDwgIikgPSAiIDw8IGZsdXNoOworICAgICAgZG91YmxlIGFjdHVhbCA9IHRlc3RDbGllbnQudGVzdERvdWJsZShleHBlY3RlZCk7CisgICAgICBjb3V0IDw8ICIoIiA8PCBhY3R1YWwgPDwgIikiIDw8IGVuZGw7CisgICAgICBpZiAoZXhwZWN0ZWQgLSBhY3R1YWwgPiBwb3coc3RhdGljX2Nhc3Q8ZG91YmxlPigxMCksIC0zMDcpKSB7CisgICAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgIkV4cGVjdGVkOiAiIDw8IGV4cGVjdGVkIDw8ICIgYnV0IGdvdDogIiA8PCBhY3R1YWwgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJikgeworICAgICAgdGhyb3c7CisgICAgfSBjYXRjaCAoZXhjZXB0aW9uJiBleCkgeworICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGwgPDwgZXgud2hhdCgpIDw8IGVuZGw7CiAgICAgICByZXR1cm5fY29kZSB8PSBFUlJfQkFTRVRZUEVTOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIEJJTkFSWSBURVNUCiAgICAgICovCi0gICAgcHJpbnRmKCJ0ZXN0QmluYXJ5KFstMTI4Li4xMjddKSA9IHsiKTsKLSAgICBjb25zdCBjaGFyIGJpbl9kYXRhWzI1Nl0KLSAgICAgICAgPSB7LTEyOCwgLTEyNywgLTEyNiwgLTEyNSwgLTEyNCwgLTEyMywgLTEyMiwgLTEyMSwgLTEyMCwgLTExOSwgLTExOCwgLTExNywgLTExNiwgLTExNSwgLTExNCwKLSAgICAgICAgICAgLTExMywgLTExMiwgLTExMSwgLTExMCwgLTEwOSwgLTEwOCwgLTEwNywgLTEwNiwgLTEwNSwgLTEwNCwgLTEwMywgLTEwMiwgLTEwMSwgLTEwMCwgLTk5LAotICAgICAgICAgICAtOTgsICAtOTcsICAtOTYsICAtOTUsICAtOTQsICAtOTMsICAtOTIsICAtOTEsICAtOTAsICAtODksICAtODgsICAtODcsICAtODYsICAtODUsICAtODQsCi0gICAgICAgICAgIC04MywgIC04MiwgIC04MSwgIC04MCwgIC03OSwgIC03OCwgIC03NywgIC03NiwgIC03NSwgIC03NCwgIC03MywgIC03MiwgIC03MSwgIC03MCwgIC02OSwKLSAgICAgICAgICAgLTY4LCAgLTY3LCAgLTY2LCAgLTY1LCAgLTY0LCAgLTYzLCAgLTYyLCAgLTYxLCAgLTYwLCAgLTU5LCAgLTU4LCAgLTU3LCAgLTU2LCAgLTU1LCAgLTU0LAotICAgICAgICAgICAtNTMsICAtNTIsICAtNTEsICAtNTAsICAtNDksICAtNDgsICAtNDcsICAtNDYsICAtNDUsICAtNDQsICAtNDMsICAtNDIsICAtNDEsICAtNDAsICAtMzksCi0gICAgICAgICAgIC0zOCwgIC0zNywgIC0zNiwgIC0zNSwgIC0zNCwgIC0zMywgIC0zMiwgIC0zMSwgIC0zMCwgIC0yOSwgIC0yOCwgIC0yNywgIC0yNiwgIC0yNSwgIC0yNCwKLSAgICAgICAgICAgLTIzLCAgLTIyLCAgLTIxLCAgLTIwLCAgLTE5LCAgLTE4LCAgLTE3LCAgLTE2LCAgLTE1LCAgLTE0LCAgLTEzLCAgLTEyLCAgLTExLCAgLTEwLCAgLTksCi0gICAgICAgICAgIC04LCAgIC03LCAgIC02LCAgIC01LCAgIC00LCAgIC0zLCAgIC0yLCAgIC0xLCAgIDAsICAgIDEsICAgIDIsICAgIDMsICAgIDQsICAgIDUsICAgIDYsCi0gICAgICAgICAgIDcsICAgIDgsICAgIDksICAgIDEwLCAgIDExLCAgIDEyLCAgIDEzLCAgIDE0LCAgIDE1LCAgIDE2LCAgIDE3LCAgIDE4LCAgIDE5LCAgIDIwLCAgIDIxLAotICAgICAgICAgICAyMiwgICAyMywgICAyNCwgICAyNSwgICAyNiwgICAyNywgICAyOCwgICAyOSwgICAzMCwgICAzMSwgICAzMiwgICAzMywgICAzNCwgICAzNSwgICAzNiwKLSAgICAgICAgICAgMzcsICAgMzgsICAgMzksICAgNDAsICAgNDEsICAgNDIsICAgNDMsICAgNDQsICAgNDUsICAgNDYsICAgNDcsICAgNDgsICAgNDksICAgNTAsICAgNTEsCi0gICAgICAgICAgIDUyLCAgIDUzLCAgIDU0LCAgIDU1LCAgIDU2LCAgIDU3LCAgIDU4LCAgIDU5LCAgIDYwLCAgIDYxLCAgIDYyLCAgIDYzLCAgIDY0LCAgIDY1LCAgIDY2LAotICAgICAgICAgICA2NywgICA2OCwgICA2OSwgICA3MCwgICA3MSwgICA3MiwgICA3MywgICA3NCwgICA3NSwgICA3NiwgICA3NywgICA3OCwgICA3OSwgICA4MCwgICA4MSwKLSAgICAgICAgICAgODIsICAgODMsICAgODQsICAgODUsICAgODYsICAgODcsICAgODgsICAgODksICAgOTAsICAgOTEsICAgOTIsICAgOTMsICAgOTQsICAgOTUsICAgOTYsCi0gICAgICAgICAgIDk3LCAgIDk4LCAgIDk5LCAgIDEwMCwgIDEwMSwgIDEwMiwgIDEwMywgIDEwNCwgIDEwNSwgIDEwNiwgIDEwNywgIDEwOCwgIDEwOSwgIDExMCwgIDExMSwKLSAgICAgICAgICAgMTEyLCAgMTEzLCAgMTE0LCAgMTE1LCAgMTE2LCAgMTE3LCAgMTE4LCAgMTE5LCAgMTIwLCAgMTIxLCAgMTIyLCAgMTIzLCAgMTI0LCAgMTI1LCAgMTI2LAotICAgICAgICAgICAxMjd9OwotICAgIHRyeSB7Ci0gICAgICBzdHJpbmcgYmluX3Jlc3VsdDsKLSAgICAgIHRlc3RDbGllbnQudGVzdEJpbmFyeShiaW5fcmVzdWx0LCBzdHJpbmcoYmluX2RhdGEsIDI1NikpOwotICAgICAgaWYgKGJpbl9yZXN1bHQuc2l6ZSgpICE9IDI1NikgewotICAgICAgICBwcmludGYoIn1cbioqKiBGQUlMRUQgKioqXG4iKTsKLSAgICAgICAgcHJpbnRmKCJpbnZhbGlkIGxlbmd0aDogJWx1XG4iLCBiaW5fcmVzdWx0LnNpemUoKSk7Ci0gICAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9CQVNFVFlQRVM7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgYm9vbCBmYWlsZWQgPSBmYWxzZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7ICsraSkgewotICAgICAgICAgIGlmICghZmlyc3QpCi0gICAgICAgICAgICBwcmludGYoIiAsIik7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICBwcmludGYoIiVkIiwgYmluX3Jlc3VsdFtpXSk7Ci0gICAgICAgICAgaWYgKCFmYWlsZWQgJiYgYmluX3Jlc3VsdFtpXSAhPSBpIC0gMTI4KSB7Ci0gICAgICAgICAgICBmYWlsZWQgPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwcmludGYoIn1cbiIpOwotICAgICAgICBpZiAoZmFpbGVkKSB7Ci0gICAgICAgICAgcHJpbnRmKCIqKiogRkFJTEVEICoqKlxuIik7Ci0gICAgICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0JBU0VUWVBFUzsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbiYgZXgpIHsKLSAgICAgIHByaW50ZigifVxuKioqIEZBSUxFRCAqKipcbiIpOwotICAgICAgcHJpbnRmKCIlc1xuIiwgZXgud2hhdCgpKTsKLSAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9CQVNFVFlQRVM7CisgICAgZm9yIChzdHJpbmc6OnNpemVfdHlwZSBpID0gMDsgaSA8IDEzMTA3MyAmJiAhcmV0dXJuX2NvZGU7ICkgeworICAgICAgcmV0dXJuX2NvZGUgfD0gYmluYXJ5X3Rlc3QodGVzdENsaWVudCwgaSk7CisgICAgICBpZiAoaSA+IDApIHsgaSAqPSAyOyB9IGVsc2UgeyArK2k7IH0KICAgICB9CiAKIAogICAgIC8qKgogICAgICAqIFNUUlVDVCBURVNUCiAgICAgICovCi0gICAgcHJpbnRmKCJ0ZXN0U3RydWN0KHtcIlplcm9cIiwgMSwgLTMsIC01fSkiKTsKKyAgICBjb3V0IDw8ICJ0ZXN0U3RydWN0KHtcIlplcm9cIiwgMSwgLTMsIC01fSkiIDw8IGZsdXNoOwogICAgIFh0cnVjdCBvdXQ7CiAgICAgb3V0LnN0cmluZ190aGluZyA9ICJaZXJvIjsKICAgICBvdXQuYnl0ZV90aGluZyA9IDE7CkBAIC00NTAsMTQgKzYwNSwxNCBAQAogICAgICAgICAgICBpbi5pMzJfdGhpbmcsCiAgICAgICAgICAgIGluLmk2NF90aGluZyk7CiAgICAgaWYgKGluICE9IG91dCkgewotICAgICAgcHJpbnRmKCIqKiogRkFJTEVEICoqKlxuIik7CisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKICAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9TVFJVQ1RTOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIE5FU1RFRCBTVFJVQ1QgVEVTVAogICAgICAqLwotICAgIHByaW50ZigidGVzdE5lc3QoezEsIHtcIlplcm9cIiwgMSwgLTMsIC01fSksIDV9Iik7CisgICAgY291dCA8PCAidGVzdE5lc3QoezEsIHtcIlplcm9cIiwgMSwgLTMsIC01fSksIDV9IiA8PCBmbHVzaDsKICAgICBYdHJ1Y3QyIG91dDI7CiAgICAgb3V0Mi5ieXRlX3RoaW5nID0gMTsKICAgICBvdXQyLnN0cnVjdF90aGluZyA9IG91dDsKQEAgLTQ3Myw3ICs2MjgsNyBAQAogICAgICAgICAgICBpbi5pNjRfdGhpbmcsCiAgICAgICAgICAgIGluMi5pMzJfdGhpbmcpOwogICAgIGlmIChpbjIgIT0gb3V0MikgewotICAgICAgcHJpbnRmKCIqKiogRkFJTEVEICoqKlxuIik7CisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKICAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9TVFJVQ1RTOwogICAgIH0KIApAQCAtNDg0LDQwICs2MzksNDAgQEAKICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCA1OyArK2kpIHsKICAgICAgIG1hcG91dC5pbnNlcnQobWFrZV9wYWlyKGksIGkgLSAxMCkpOwogICAgIH0KLSAgICBwcmludGYoInRlc3RNYXAoeyIpOworICAgIGNvdXQgPDwgInRlc3RNYXAoeyIgPDwgZmx1c2g7CiAgICAgbWFwPGludDMyX3QsIGludDMyX3Q+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CiAgICAgYm9vbCBmaXJzdCA9IHRydWU7CiAgICAgZm9yIChtX2l0ZXIgPSBtYXBvdXQuYmVnaW4oKTsgbV9pdGVyICE9IG1hcG91dC5lbmQoKTsgKyttX2l0ZXIpIHsKICAgICAgIGlmIChmaXJzdCkgewogICAgICAgICBmaXJzdCA9IGZhbHNlOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgcHJpbnRmKCIsICIpOworICAgICAgICBjb3V0IDw8ICIsIjsKICAgICAgIH0KLSAgICAgIHByaW50ZigiJWQgPT4gJWQiLCBtX2l0ZXItPmZpcnN0LCBtX2l0ZXItPnNlY29uZCk7CisgICAgICBjb3V0IDw8IG1faXRlci0+Zmlyc3QgPDwgIiA9PiAiIDw8IG1faXRlci0+c2Vjb25kOwogICAgIH0KLSAgICBwcmludGYoIn0pIik7CisgICAgY291dCA8PCAifSkiOwogICAgIG1hcDxpbnQzMl90LCBpbnQzMl90PiBtYXBpbjsKICAgICB0ZXN0Q2xpZW50LnRlc3RNYXAobWFwaW4sIG1hcG91dCk7Ci0gICAgcHJpbnRmKCIgPSB7Iik7CisgICAgY291dCA8PCAiID0geyI7CiAgICAgZmlyc3QgPSB0cnVlOwogICAgIGZvciAobV9pdGVyID0gbWFwaW4uYmVnaW4oKTsgbV9pdGVyICE9IG1hcGluLmVuZCgpOyArK21faXRlcikgewogICAgICAgaWYgKGZpcnN0KSB7CiAgICAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICAgICB9IGVsc2UgewotICAgICAgICBwcmludGYoIiwgIik7CisgICAgICAgIGNvdXQgPDwgIiwiOwogICAgICAgfQotICAgICAgcHJpbnRmKCIlZCA9PiAlZCIsIG1faXRlci0+Zmlyc3QsIG1faXRlci0+c2Vjb25kKTsKKyAgICAgIGNvdXQgPDwgbV9pdGVyLT5maXJzdCA8PCAiID0+ICIgPDwgbV9pdGVyLT5zZWNvbmQ7CiAgICAgfQotICAgIHByaW50ZigifVxuIik7CisgICAgY291dCA8PCAifSIgPDwgZW5kbDsKICAgICBpZiAobWFwaW4gIT0gbWFwb3V0KSB7Ci0gICAgICBwcmludGYoIioqKiBGQUlMRUQgKioqXG4iKTsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOwogICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0NPTlRBSU5FUlM7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogU1RSSU5HIE1BUCBURVNUCiAgICAgICovCi0gICAgcHJpbnRmKCJ0ZXN0U3RyaW5nTWFwKHthID0+IDIsIGIgPT4gYmxhaCwgc29tZSA9PiB0aGluZ30pID0geyIpOworICAgIGNvdXQgPDwgInRlc3RTdHJpbmdNYXAoe2EgPT4gMiwgYiA9PiBibGFoLCBzb21lID0+IHRoaW5nfSkgPSB7IiA8PCBmbHVzaDsKICAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHNtYXBpbjsKICAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHNtYXBvdXQ7CiAgICAgc21hcGluWyJhIl0gPSAiMiI7CkBAIC01MjgsMTkgKzY4MywyMCBAQAogICAgICAgZmlyc3QgPSB0cnVlOwogICAgICAgZm9yIChtYXA8c3RyaW5nLCBzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdCA9IHNtYXBvdXQuYmVnaW4oKTsgaXQgIT0gc21hcG91dC5lbmQoKTsgKytpdCkgewogICAgICAgICBpZiAoZmlyc3QpCi0gICAgICAgICAgcHJpbnRmKCIsIik7CisgICAgICAgICAgY291dCA8PCAiLCI7CiAgICAgICAgIGVsc2UKICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICBwcmludGYoIiVzID0+ICVzIiwgaXQtPmZpcnN0LmNfc3RyKCksIGl0LT5zZWNvbmQuY19zdHIoKSk7CisgICAgICAgIGNvdXQgPDwgaXQtPmZpcnN0IDw8ICIgPT4gIiA8PCBpdC0+c2Vjb25kOwogICAgICAgfQotICAgICAgcHJpbnRmKCJ9XG4iKTsKKyAgICAgIGNvdXQgPDwgIn0iIDw8IGVuZGw7CiAgICAgICBpZiAoc21hcGluICE9IHNtYXBvdXQpIHsKLSAgICAgICAgcHJpbnRmKCIqKiogRkFJTEVEICoqKlxuIik7CisgICAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOwogICAgICAgICByZXR1cm5fY29kZSB8PSBFUlJfQ09OVEFJTkVSUzsKICAgICAgIH0KKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJikgeworICAgICAgdGhyb3c7CiAgICAgfSBjYXRjaCAoZXhjZXB0aW9uJiBleCkgewotICAgICAgcHJpbnRmKCJ9XG4qKiogRkFJTEVEICoqKlxuIik7Ci0gICAgICBwcmludGYoIiVzXG4iLCBleC53aGF0KCkpOworICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGwgPDwgZXgud2hhdCgpIDw8IGVuZGw7CiAgICAgICByZXR1cm5fY29kZSB8PSBFUlJfQ09OVEFJTkVSUzsKICAgICB9CiAKQEAgLTU1MSwxNDQgKzcwNywxNjYgQEAKICAgICBmb3IgKGludDMyX3QgaSA9IC0yOyBpIDwgMzsgKytpKSB7CiAgICAgICBzZXRvdXQuaW5zZXJ0KGkpOwogICAgIH0KLSAgICBwcmludGYoInRlc3RTZXQoeyIpOworICAgIGNvdXQgPDwgInRlc3RTZXQoeyIgPDwgZmx1c2g7CiAgICAgc2V0PGludDMyX3Q+Ojpjb25zdF9pdGVyYXRvciBzX2l0ZXI7CiAgICAgZmlyc3QgPSB0cnVlOwogICAgIGZvciAoc19pdGVyID0gc2V0b3V0LmJlZ2luKCk7IHNfaXRlciAhPSBzZXRvdXQuZW5kKCk7ICsrc19pdGVyKSB7CiAgICAgICBpZiAoZmlyc3QpIHsKICAgICAgICAgZmlyc3QgPSBmYWxzZTsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHByaW50ZigiLCAiKTsKKyAgICAgICAgY291dCA8PCAiLCI7CiAgICAgICB9Ci0gICAgICBwcmludGYoIiVkIiwgKnNfaXRlcik7CisgICAgICBjb3V0IDw8ICpzX2l0ZXI7CiAgICAgfQotICAgIHByaW50ZigifSkiKTsKKyAgICBjb3V0IDw8ICJ9KSI7CiAgICAgc2V0PGludDMyX3Q+IHNldGluOwogICAgIHRlc3RDbGllbnQudGVzdFNldChzZXRpbiwgc2V0b3V0KTsKLSAgICBwcmludGYoIiA9IHsiKTsKKyAgICBjb3V0IDw8ICIgPSB7IjsKICAgICBmaXJzdCA9IHRydWU7CiAgICAgZm9yIChzX2l0ZXIgPSBzZXRpbi5iZWdpbigpOyBzX2l0ZXIgIT0gc2V0aW4uZW5kKCk7ICsrc19pdGVyKSB7CiAgICAgICBpZiAoZmlyc3QpIHsKICAgICAgICAgZmlyc3QgPSBmYWxzZTsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHByaW50ZigiLCAiKTsKKyAgICAgICAgY291dCA8PCAiLCI7CiAgICAgICB9Ci0gICAgICBwcmludGYoIiVkIiwgKnNfaXRlcik7CisgICAgICBjb3V0IDw8ICpzX2l0ZXI7CiAgICAgfQotICAgIHByaW50ZigifVxuIik7CisgICAgY291dCA8PCAifSIgPDwgZW5kbDsKICAgICBpZiAoc2V0aW4gIT0gc2V0b3V0KSB7Ci0gICAgICBwcmludGYoIioqKiBGQUlMRUQgKioqXG4iKTsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOwogICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0NPTlRBSU5FUlM7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogTElTVCBURVNUCiAgICAgICovCi0gICAgdmVjdG9yPGludDMyX3Q+IGxpc3RvdXQ7Ci0gICAgZm9yIChpbnQzMl90IGkgPSAtMjsgaSA8IDM7ICsraSkgewotICAgICAgbGlzdG91dC5wdXNoX2JhY2soaSk7Ci0gICAgfQotICAgIHByaW50ZigidGVzdExpc3QoeyIpOwotICAgIHZlY3RvcjxpbnQzMl90Pjo6Y29uc3RfaXRlcmF0b3IgbF9pdGVyOwotICAgIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKGxfaXRlciA9IGxpc3RvdXQuYmVnaW4oKTsgbF9pdGVyICE9IGxpc3RvdXQuZW5kKCk7ICsrbF9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHByaW50ZigiLCAiKTsKKyAgICBjb3V0IDw8ICJ0ZXN0TGlzdChlbXB0eSkiIDw8IGZsdXNoOworICAgIHRyeSB7CisgICAgICB2ZWN0b3I8aW50MzJfdD4gbGlzdG91dDsKKyAgICAgIHRlc3RDbGllbnQudGVzdExpc3QobGlzdG91dCwgdmVjdG9yPGludDMyX3Q+KCkpOworICAgICAgaWYgKCFsaXN0b3V0LmVtcHR5KCkpIHsKKyAgICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGw7CisgICAgICAgIGNvdXQgPDwgImludmFsaWQgbGVuZ3RoOiAiIDw8IGxpc3RvdXQuc2l6ZSgpIDw8IGVuZGw7CisgICAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9DT05UQUlORVJTOwogICAgICAgfQotICAgICAgcHJpbnRmKCIlZCIsICpsX2l0ZXIpOworICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mKSB7CisgICAgICB0aHJvdzsKKyAgICB9IGNhdGNoIChleGNlcHRpb24mIGV4KSB7CisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbCA8PCBleC53aGF0KCkgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9DT05UQUlORVJTOwogICAgIH0KLSAgICBwcmludGYoIn0pIik7Ci0gICAgdmVjdG9yPGludDMyX3Q+IGxpc3RpbjsKLSAgICB0ZXN0Q2xpZW50LnRlc3RMaXN0KGxpc3RpbiwgbGlzdG91dCk7Ci0gICAgcHJpbnRmKCIgPSB7Iik7Ci0gICAgZmlyc3QgPSB0cnVlOwotICAgIGZvciAobF9pdGVyID0gbGlzdGluLmJlZ2luKCk7IGxfaXRlciAhPSBsaXN0aW4uZW5kKCk7ICsrbF9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHByaW50ZigiLCAiKTsKKyAgICB0cnkgeworICAgICAgdmVjdG9yPGludDMyX3Q+IGxpc3RvdXQ7CisgICAgICBmb3IgKGludDMyX3QgaSA9IC0yOyBpIDwgMzsgKytpKSB7CisgICAgICAgIGxpc3RvdXQucHVzaF9iYWNrKGkpOwogICAgICAgfQotICAgICAgcHJpbnRmKCIlZCIsICpsX2l0ZXIpOwotICAgIH0KLSAgICBwcmludGYoIn1cbiIpOwotICAgIGlmIChsaXN0aW4gIT0gbGlzdG91dCkgewotICAgICAgcHJpbnRmKCIqKiogRkFJTEVEICoqKlxuIik7CisgICAgICBjb3V0IDw8ICJ0ZXN0TGlzdCh7IiA8PCBmbHVzaDsKKyAgICAgIHZlY3RvcjxpbnQzMl90Pjo6Y29uc3RfaXRlcmF0b3IgbF9pdGVyOworICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgZm9yIChsX2l0ZXIgPSBsaXN0b3V0LmJlZ2luKCk7IGxfaXRlciAhPSBsaXN0b3V0LmVuZCgpOyArK2xfaXRlcikgeworICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNvdXQgPDwgIiwiOworICAgICAgICB9CisgICAgICAgIGNvdXQgPDwgKmxfaXRlcjsKKyAgICAgIH0KKyAgICAgIGNvdXQgPDwgIn0pIjsKKyAgICAgIHZlY3RvcjxpbnQzMl90PiBsaXN0aW47CisgICAgICB0ZXN0Q2xpZW50LnRlc3RMaXN0KGxpc3RpbiwgbGlzdG91dCk7CisgICAgICBjb3V0IDw8ICIgPSB7IjsKKyAgICAgIGZpcnN0ID0gdHJ1ZTsKKyAgICAgIGZvciAobF9pdGVyID0gbGlzdGluLmJlZ2luKCk7IGxfaXRlciAhPSBsaXN0aW4uZW5kKCk7ICsrbF9pdGVyKSB7CisgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY291dCA8PCAiLCI7CisgICAgICAgIH0KKyAgICAgICAgY291dCA8PCAqbF9pdGVyOworICAgICAgfQorICAgICAgY291dCA8PCAifSIgPDwgZW5kbDsKKyAgICAgIGlmIChsaXN0aW4gIT0gbGlzdG91dCkgeworICAgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKKyAgICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0NPTlRBSU5FUlM7CisgICAgICB9CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYpIHsKKyAgICAgIHRocm93OworICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbiYgZXgpIHsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsIDw8IGV4LndoYXQoKSA8PCBlbmRsOwogICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0NPTlRBSU5FUlM7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogRU5VTSBURVNUCiAgICAgICovCi0gICAgcHJpbnRmKCJ0ZXN0RW51bShPTkUpIik7CisgICAgY291dCA8PCAidGVzdEVudW0oT05FKSIgPDwgZmx1c2g7CiAgICAgTnVtYmVyejo6dHlwZSByZXQgPSB0ZXN0Q2xpZW50LnRlc3RFbnVtKE51bWJlcno6Ok9ORSk7Ci0gICAgcHJpbnRmKCIgPSAlZFxuIiwgcmV0KTsKKyAgICBjb3V0IDw8ICIgPSAiIDw8IHJldCA8PCBlbmRsOwogICAgIGlmIChyZXQgIT0gTnVtYmVyejo6T05FKSB7Ci0gICAgICBwcmludGYoIioqKiBGQUlMRUQgKioqXG4iKTsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOwogICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX1NUUlVDVFM7CiAgICAgfQogCi0gICAgcHJpbnRmKCJ0ZXN0RW51bShUV08pIik7CisgICAgY291dCA8PCAidGVzdEVudW0oVFdPKSIgPDwgZmx1c2g7CiAgICAgcmV0ID0gdGVzdENsaWVudC50ZXN0RW51bShOdW1iZXJ6OjpUV08pOwotICAgIHByaW50ZigiID0gJWRcbiIsIHJldCk7CisgICAgY291dCA8PCAiID0gIiA8PCByZXQgPDwgZW5kbDsKICAgICBpZiAocmV0ICE9IE51bWJlcno6OlRXTykgewotICAgICAgcHJpbnRmKCIqKiogRkFJTEVEICoqKlxuIik7CisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKICAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9TVFJVQ1RTOwogICAgIH0KIAotICAgIHByaW50ZigidGVzdEVudW0oVEhSRUUpIik7CisgICAgY291dCA8PCAidGVzdEVudW0oVEhSRUUpIiA8PCBmbHVzaDsKICAgICByZXQgPSB0ZXN0Q2xpZW50LnRlc3RFbnVtKE51bWJlcno6OlRIUkVFKTsKLSAgICBwcmludGYoIiA9ICVkXG4iLCByZXQpOworICAgIGNvdXQgPDwgIiA9ICIgPDwgcmV0IDw8IGVuZGw7CiAgICAgaWYgKHJldCAhPSBOdW1iZXJ6OjpUSFJFRSkgewotICAgICAgcHJpbnRmKCIqKiogRkFJTEVEICoqKlxuIik7CisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKICAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9TVFJVQ1RTOwogICAgIH0KIAotICAgIHByaW50ZigidGVzdEVudW0oRklWRSkiKTsKKyAgICBjb3V0IDw8ICJ0ZXN0RW51bShGSVZFKSIgPDwgZmx1c2g7CiAgICAgcmV0ID0gdGVzdENsaWVudC50ZXN0RW51bShOdW1iZXJ6OjpGSVZFKTsKLSAgICBwcmludGYoIiA9ICVkXG4iLCByZXQpOworICAgIGNvdXQgPDwgIiA9ICIgPDwgcmV0IDw8IGVuZGw7CiAgICAgaWYgKHJldCAhPSBOdW1iZXJ6OjpGSVZFKSB7Ci0gICAgICBwcmludGYoIioqKiBGQUlMRUQgKioqXG4iKTsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOwogICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX1NUUlVDVFM7CiAgICAgfQogCi0gICAgcHJpbnRmKCJ0ZXN0RW51bShFSUdIVCkiKTsKKyAgICBjb3V0IDw8ICJ0ZXN0RW51bShFSUdIVCkiIDw8IGZsdXNoOwogICAgIHJldCA9IHRlc3RDbGllbnQudGVzdEVudW0oTnVtYmVyejo6RUlHSFQpOwotICAgIHByaW50ZigiID0gJWRcbiIsIHJldCk7CisgICAgY291dCA8PCAiID0gIiA8PCByZXQgPDwgZW5kbDsKICAgICBpZiAocmV0ICE9IE51bWJlcno6OkVJR0hUKSB7Ci0gICAgICBwcmludGYoIioqKiBGQUlMRUQgKioqXG4iKTsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOwogICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX1NUUlVDVFM7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogVFlQRURFRiBURVNUCiAgICAgICovCi0gICAgcHJpbnRmKCJ0ZXN0VHlwZWRlZigzMDk4NTgyMzUwODI1MjMpIik7CisgICAgY291dCA8PCAidGVzdFR5cGVkZWYoMzA5ODU4MjM1MDgyNTIzKSIgPDwgZmx1c2g7CiAgICAgVXNlcklkIHVpZCA9IHRlc3RDbGllbnQudGVzdFR5cGVkZWYoMzA5ODU4MjM1MDgyNTIzTEwpOwotICAgIHByaW50ZigiID0gJSIgUFJJZDY0ICJcbiIsIHVpZCk7CisgICAgY291dCA8PCAiID0gIiA8PCB1aWQgPDwgZW5kbDsKICAgICBpZiAodWlkICE9IDMwOTg1ODIzNTA4MjUyM0xMKSB7Ci0gICAgICBwcmludGYoIioqKiBGQUlMRUQgKioqXG4iKTsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOwogICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX1NUUlVDVFM7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogTkVTVEVEIE1BUCBURVNUCiAgICAgICovCi0gICAgcHJpbnRmKCJ0ZXN0TWFwTWFwKDEpIik7CisgICAgY291dCA8PCAidGVzdE1hcE1hcCgxKSIgPDwgZmx1c2g7CiAgICAgbWFwPGludDMyX3QsIG1hcDxpbnQzMl90LCBpbnQzMl90PiA+IG1tOwogICAgIHRlc3RDbGllbnQudGVzdE1hcE1hcChtbSwgMSk7Ci0gICAgcHJpbnRmKCIgPSB7Iik7CisgICAgY291dCA8PCAiID0geyI7CiAgICAgbWFwPGludDMyX3QsIG1hcDxpbnQzMl90LCBpbnQzMl90PiA+Ojpjb25zdF9pdGVyYXRvciBtaTsKICAgICBmb3IgKG1pID0gbW0uYmVnaW4oKTsgbWkgIT0gbW0uZW5kKCk7ICsrbWkpIHsKICAgICAgIHByaW50ZigiJWQgPT4geyIsIG1pLT5maXJzdCk7CiAgICAgICBtYXA8aW50MzJfdCwgaW50MzJfdD46OmNvbnN0X2l0ZXJhdG9yIG1pMjsKICAgICAgIGZvciAobWkyID0gbWktPnNlY29uZC5iZWdpbigpOyBtaTIgIT0gbWktPnNlY29uZC5lbmQoKTsgKyttaTIpIHsKLSAgICAgICAgcHJpbnRmKCIlZCA9PiAlZCwgIiwgbWkyLT5maXJzdCwgbWkyLT5zZWNvbmQpOworICAgICAgICBjb3V0IDw8IG1pMi0+Zmlyc3QgPDwgIiA9PiAiIDw8IG1pMi0+c2Vjb25kOwogICAgICAgfQotICAgICAgcHJpbnRmKCJ9LCAiKTsKKyAgICAgIGNvdXQgPDwgIn0sICI7CiAgICAgfQotICAgIHByaW50ZigifVxuIik7CisgICAgY291dCA8PCAifSIgPDwgZW5kbDsKICAgICBpZiAobW0uc2l6ZSgpICE9IDIgfHwKICAgICAgICAgbW1bLTRdWy00XSAhPSAtNCB8fAogICAgICAgICBtbVstNF1bLTNdICE9IC0zIHx8CkBAIC02OTgsNyArODc2LDcgQEAKICAgICAgICAgbW1bNF1bM10gIT0gMyB8fAogICAgICAgICBtbVs0XVsyXSAhPSAyIHx8CiAgICAgICAgIG1tWzRdWzFdICE9IDEpIHsKLSAgICAgIHByaW50ZigiKioqIEZBSUxFRCAqKipcbiIpOworICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGw7CiAgICAgICByZXR1cm5fY29kZSB8PSBFUlJfQ09OVEFJTkVSUzsKICAgICB9CiAKQEAgLTcyMSwxMCArODk5LDEwIEBACiAgICAgICB0cnVjazIuaTY0X3RoaW5nID0gMjsKICAgICAgIGluc2FuZS54dHJ1Y3RzLnB1c2hfYmFjayh0cnVjayk7CiAgICAgICBpbnNhbmUueHRydWN0cy5wdXNoX2JhY2sodHJ1Y2syKTsKLSAgICAgIHByaW50ZigidGVzdEluc2FuaXR5KCkiKTsKKyAgICAgIGNvdXQgPDwgInRlc3RJbnNhbml0eSgpIiA8PCBmbHVzaDsKICAgICAgIG1hcDxVc2VySWQsIG1hcDxOdW1iZXJ6Ojp0eXBlLCBJbnNhbml0eT4gPiB3aG9hOwogICAgICAgdGVzdENsaWVudC50ZXN0SW5zYW5pdHkod2hvYSwgaW5zYW5lKTsKLSAgICAgIHByaW50ZigiID0geyIpOworICAgICAgY291dCA8PCAiID0geyI7CiAgICAgICBtYXA8VXNlcklkLCBtYXA8TnVtYmVyejo6dHlwZSwgSW5zYW5pdHk+ID46OmNvbnN0X2l0ZXJhdG9yIGlfaXRlcjsKICAgICAgIGZvciAoaV9pdGVyID0gd2hvYS5iZWdpbigpOyBpX2l0ZXIgIT0gd2hvYS5lbmQoKTsgKytpX2l0ZXIpIHsKICAgICAgICAgcHJpbnRmKCIlIiBQUklkNjQgIiA9PiB7IiwgaV9pdGVyLT5maXJzdCk7CkBAIC03MzMsMTUgKzkxMSwxNSBAQAogICAgICAgICAgIHByaW50ZigiJWQgPT4geyIsIGkyX2l0ZXItPmZpcnN0KTsKICAgICAgICAgICBtYXA8TnVtYmVyejo6dHlwZSwgVXNlcklkPiB1c2VyTWFwID0gaTJfaXRlci0+c2Vjb25kLnVzZXJNYXA7CiAgICAgICAgICAgbWFwPE51bWJlcno6OnR5cGUsIFVzZXJJZD46OmNvbnN0X2l0ZXJhdG9yIHVtOwotICAgICAgICAgIHByaW50ZigieyIpOworICAgICAgICAgIGNvdXQgPDwgInsiOwogICAgICAgICAgIGZvciAodW0gPSB1c2VyTWFwLmJlZ2luKCk7IHVtICE9IHVzZXJNYXAuZW5kKCk7ICsrdW0pIHsKLSAgICAgICAgICAgIHByaW50ZigiJWQgPT4gJSIgUFJJZDY0ICIsICIsIHVtLT5maXJzdCwgdW0tPnNlY29uZCk7CisgICAgICAgICAgICBjb3V0IDw8IHVtLT5maXJzdCA8PCAiID0+ICIgPDwgdW0tPnNlY29uZDsKICAgICAgICAgICB9Ci0gICAgICAgICAgcHJpbnRmKCJ9LCAiKTsKKyAgICAgICAgICBjb3V0IDw8ICJ9LCAiOwogCiAgICAgICAgICAgdmVjdG9yPFh0cnVjdD4geHRydWN0cyA9IGkyX2l0ZXItPnNlY29uZC54dHJ1Y3RzOwogICAgICAgICAgIHZlY3RvcjxYdHJ1Y3Q+Ojpjb25zdF9pdGVyYXRvciB4OwotICAgICAgICAgIHByaW50ZigieyIpOworICAgICAgICAgIGNvdXQgPDwgInsiOwogICAgICAgICAgIGZvciAoeCA9IHh0cnVjdHMuYmVnaW4oKTsgeCAhPSB4dHJ1Y3RzLmVuZCgpOyArK3gpIHsKICAgICAgICAgICAgIHByaW50Zigie1wiJXNcIiwgJWQsICVkLCAlIiBQUklkNjQgIn0sICIsCiAgICAgICAgICAgICAgICAgICAgeC0+c3RyaW5nX3RoaW5nLmNfc3RyKCksCkBAIC03NDksMTMgKzkyNywxMyBAQAogICAgICAgICAgICAgICAgICAgIHgtPmkzMl90aGluZywKICAgICAgICAgICAgICAgICAgICB4LT5pNjRfdGhpbmcpOwogICAgICAgICAgIH0KLSAgICAgICAgICBwcmludGYoIn0iKTsKKyAgICAgICAgICBjb3V0IDw8ICJ9IjsKIAotICAgICAgICAgIHByaW50ZigifSwgIik7CisgICAgICAgICAgY291dCA8PCAifSwgIjsKICAgICAgICAgfQotICAgICAgICBwcmludGYoIn0sICIpOworICAgICAgICBjb3V0IDw8ICJ9LCAiOwogICAgICAgfQotICAgICAgcHJpbnRmKCJ9XG4iKTsKKyAgICAgIGNvdXQgPDwgIn0iIDw8IGVuZGw7CiAgICAgICBib29sIGZhaWxlZCA9IGZhbHNlOwogICAgICAgbWFwPFVzZXJJZCwgbWFwPE51bWJlcno6OnR5cGUsIEluc2FuaXR5PiA+Ojpjb25zdF9pdGVyYXRvciBpdDEgPSB3aG9hLmZpbmQoVXNlcklkKDEpKTsKICAgICAgIGlmICh3aG9hLnNpemUoKSAhPSAyKSB7CkBAIC03NzgsMTIgKzk1NiwxMiBAQAogICAgICAgICBmYWlsZWQgPSB0cnVlOwogICAgICAgfSBlbHNlIHsKICAgICAgICAgbWFwPE51bWJlcno6OnR5cGUsIEluc2FuaXR5Pjo6Y29uc3RfaXRlcmF0b3IgaXQyNiA9IGl0Mi0+c2Vjb25kLmZpbmQoTnVtYmVyejo6U0lYKTsKLSAgICAgICAgaWYgKGl0MjYgPT0gaXQxLT5zZWNvbmQuZW5kKCkgfHwgaXQyNi0+c2Vjb25kICE9IEluc2FuaXR5KCkpIHsKKyAgICAgICAgaWYgKGl0MjYgPT0gaXQyLT5zZWNvbmQuZW5kKCkgfHwgaXQyNi0+c2Vjb25kICE9IEluc2FuaXR5KCkpIHsKICAgICAgICAgICBmYWlsZWQgPSB0cnVlOwogICAgICAgICB9CiAgICAgICB9CiAgICAgICBpZiAoZmFpbGVkKSB7Ci0gICAgICAgIHByaW50ZigiKioqIEZBSUxFRCAqKipcbiIpOworICAgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKICAgICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX1NUUlVDVFM7CiAgICAgICB9CiAgICAgfQpAQCAtNzkxLDcgKzk2OSw3IEBACiAgICAgLyoqCiAgICAgICogTVVMVEkgVEVTVAogICAgICAqLwotICAgIHByaW50ZigidGVzdE11bHRpKClcbiIpOworICAgIGNvdXQgPDwgInRlc3RNdWx0aSgpIiA8PCBlbmRsOwogICAgIHRyeSB7CiAgICAgICBtYXA8aW50MTZfdCwgc3RyaW5nPiBtdWxfbWFwOwogICAgICAgWHRydWN0IG11bF9yZXN1bHQ7CkBAIC04MDQsMjAgKzk4MiwyMiBAQAogICAgICAgeHhzLmkzMl90aGluZyA9IDQyNDI7CiAgICAgICB4eHMuaTY0X3RoaW5nID0gNDI0MjQyOwogICAgICAgaWYgKG11bF9yZXN1bHQgIT0geHhzKSB7Ci0gICAgICAgIHByaW50ZigiKioqIEZBSUxFRCAqKipcbiIpOworICAgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKICAgICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX1NUUlVDVFM7CiAgICAgICB9CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYpIHsKKyAgICAgIHRocm93OwogICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbiYgZXgpIHsKLSAgICAgIHByaW50ZigiKioqIEZBSUxFRCAqKipcbiIpOworICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGwgPDwgZXgud2hhdCgpIDw8IGVuZGw7CiAgICAgICByZXR1cm5fY29kZSB8PSBFUlJfU1RSVUNUUzsKICAgICB9CiAKICAgICAvKiB0ZXN0IGV4Y2VwdGlvbiAqLwogCiAgICAgdHJ5IHsKLSAgICAgIHByaW50ZigidGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKFwiWGNlcHRpb25cIikgPT4iKTsKKyAgICAgIGNvdXQgPDwgInRlc3RDbGllbnQudGVzdEV4Y2VwdGlvbihcIlhjZXB0aW9uXCIpID0+IiA8PCBmbHVzaDsKICAgICAgIHRlc3RDbGllbnQudGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iKTsKLSAgICAgIHByaW50ZigiICB2b2lkXG4qKiogRkFJTEVEICoqKlxuIik7CisgICAgICBjb3V0IDw8ICIgIHZvaWRcbioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOwogICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0VYQ0VQVElPTlM7CiAKICAgICB9IGNhdGNoIChYY2VwdGlvbiYgZSkgewpAQCAtODI1LDQxICsxMDA1LDQxIEBACiAgICAgfQogCiAgICAgdHJ5IHsKLSAgICAgIHByaW50ZigidGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKFwiVEV4Y2VwdGlvblwiKSA9PiIpOworICAgICAgY291dCA8PCAidGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKFwiVEV4Y2VwdGlvblwiKSA9PiIgPDwgZmx1c2g7CiAgICAgICB0ZXN0Q2xpZW50LnRlc3RFeGNlcHRpb24oIlRFeGNlcHRpb24iKTsKLSAgICAgIHByaW50ZigiICB2b2lkXG4qKiogRkFJTEVEICoqKlxuIik7CisgICAgICBjb3V0IDw8ICIgIHZvaWRcbioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOwogICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0VYQ0VQVElPTlM7CiAKICAgICB9IGNhdGNoIChjb25zdCBURXhjZXB0aW9uJikgewotICAgICAgcHJpbnRmKCIgIENhdWdodCBURXhjZXB0aW9uXG4iKTsKKyAgICAgIGNvdXQgPDwgIiAgQ2F1Z2h0IFRFeGNlcHRpb24iIDw8IGVuZGw7CiAgICAgfQogCiAgICAgdHJ5IHsKLSAgICAgIHByaW50ZigidGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKFwic3VjY2Vzc1wiKSA9PiIpOworICAgICAgY291dCA8PCAidGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKFwic3VjY2Vzc1wiKSA9PiIgPDwgZmx1c2g7CiAgICAgICB0ZXN0Q2xpZW50LnRlc3RFeGNlcHRpb24oInN1Y2Nlc3MiKTsKLSAgICAgIHByaW50ZigiICB2b2lkXG4iKTsKLSAgICB9IGNhdGNoICguLi4pIHsKLSAgICAgIHByaW50ZigiICBleGNlcHRpb25cbioqKiBGQUlMRUQgKioqXG4iKTsKKyAgICAgIGNvdXQgPDwgIiAgdm9pZCIgPDwgZW5kbDsKKyAgICB9IGNhdGNoIChleGNlcHRpb24gJiBleCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGwgPDwgZXgud2hhdCgpIDw8IGVuZGw7CiAgICAgICByZXR1cm5fY29kZSB8PSBFUlJfRVhDRVBUSU9OUzsKICAgICB9CiAKICAgICAvKiB0ZXN0IG11bHRpIGV4Y2VwdGlvbiAqLwogCiAgICAgdHJ5IHsKLSAgICAgIHByaW50ZigidGVzdENsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oXCJYY2VwdGlvblwiLCBcInRlc3QgMVwiKSA9PiIpOworICAgICAgY291dCA8PCAidGVzdENsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oXCJYY2VwdGlvblwiLCBcInRlc3QgMVwiKSA9PiIgPDwgZmx1c2g7CiAgICAgICBYdHJ1Y3QgcmVzdWx0OwogICAgICAgdGVzdENsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24ocmVzdWx0LCAiWGNlcHRpb24iLCAidGVzdCAxIik7Ci0gICAgICBwcmludGYoIiAgcmVzdWx0XG4qKiogRkFJTEVEICoqKlxuIik7CisgICAgICBjb3V0IDw8ICIgIHJlc3VsdFxuKioqIEZBSUxFRCAqKioiIDw8IGVuZGw7CiAgICAgICByZXR1cm5fY29kZSB8PSBFUlJfRVhDRVBUSU9OUzsKICAgICB9IGNhdGNoIChYY2VwdGlvbiYgZSkgewogICAgICAgcHJpbnRmKCIgIHsldSwgXCIlc1wifVxuIiwgZS5lcnJvckNvZGUsIGUubWVzc2FnZS5jX3N0cigpKTsKICAgICB9CiAKICAgICB0cnkgewotICAgICAgcHJpbnRmKCJ0ZXN0Q2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbihcIlhjZXB0aW9uMlwiLCBcInRlc3QgMlwiKSA9PiIpOworICAgICAgY291dCA8PCAidGVzdENsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oXCJYY2VwdGlvbjJcIiwgXCJ0ZXN0IDJcIikgPT4iIDw8IGZsdXNoOwogICAgICAgWHRydWN0IHJlc3VsdDsKICAgICAgIHRlc3RDbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKHJlc3VsdCwgIlhjZXB0aW9uMiIsICJ0ZXN0IDIiKTsKLSAgICAgIHByaW50ZigiICByZXN1bHRcbioqKiBGQUlMRUQgKioqXG4iKTsKKyAgICAgIGNvdXQgPDwgIiAgcmVzdWx0XG4qKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKICAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9FWENFUFRJT05TOwogCiAgICAgfSBjYXRjaCAoWGNlcHRpb24yJiBlKSB7CkBAIC04NjcsMTggKzEwNDcsMTggQEAKICAgICB9CiAKICAgICB0cnkgewotICAgICAgcHJpbnRmKCJ0ZXN0Q2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbihcInN1Y2Nlc3NcIiwgXCJ0ZXN0IDNcIikgPT4iKTsKKyAgICAgIGNvdXQgPDwgInRlc3RDbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKFwic3VjY2Vzc1wiLCBcInRlc3QgM1wiKSA9PiIgPDwgZmx1c2g7CiAgICAgICBYdHJ1Y3QgcmVzdWx0OwogICAgICAgdGVzdENsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24ocmVzdWx0LCAic3VjY2VzcyIsICJ0ZXN0IDMiKTsKICAgICAgIHByaW50ZigiICB7e1wiJXNcIn19XG4iLCByZXN1bHQuc3RyaW5nX3RoaW5nLmNfc3RyKCkpOwotICAgIH0gY2F0Y2ggKC4uLikgewotICAgICAgcHJpbnRmKCIgIGV4Y2VwdGlvblxuKioqIEZBSUxFRCAqKipcbiIpOworICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbiAmIGV4KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbCA8PCBleC53aGF0KCkgPDwgZW5kbDsKICAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9FWENFUFRJT05TOwogICAgIH0KIAogICAgIC8qIHRlc3Qgb25ld2F5IHZvaWQgKi8KICAgICB7Ci0gICAgICBwcmludGYoInRlc3RDbGllbnQudGVzdE9uZXdheSgxKSA9PiIpOworICAgICAgY291dCA8PCAidGVzdENsaWVudC50ZXN0T25ld2F5KDEpID0+IiA8PCBmbHVzaDsKICAgICAgIHVpbnQ2NF90IHN0YXJ0T25ld2F5ID0gbm93KCk7CiAgICAgICB0ZXN0Q2xpZW50LnRlc3RPbmV3YXkoMSk7CiAgICAgICB1aW50NjRfdCBlbGFwc2VkID0gbm93KCkgLSBzdGFydE9uZXdheTsKQEAgLTkwMSwxNiArMTA4MSwxOCBAQAogICAgIC8qKgogICAgICAqIEkzMiBURVNUCiAgICAgICovCi0gICAgcHJpbnRmKCJyZS10ZXN0IHRlc3RJMzIoLTEpIik7Ci0gICAgaTMyID0gdGVzdENsaWVudC50ZXN0STMyKC0xKTsKLSAgICBwcmludGYoIiA9ICVkXG4iLCBpMzIpOworICAgIGNvdXQgPDwgInJlLXRlc3QgdGVzdEkzMigtMSkiIDw8IGZsdXNoOworICAgIGludCBpMzIgPSB0ZXN0Q2xpZW50LnRlc3RJMzIoLTEpOworICAgIGNvdXQgPDwgIiA9ICIgPDwgaTMyIDw8IGVuZGw7CiAgICAgaWYgKGkzMiAhPSAtMSkKICAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9CQVNFVFlQRVM7CiAKKyAgICBjb3V0IDw8IGVuZGwgPDwgIkFsbCB0ZXN0cyBkb25lLiIgPDwgZW5kbCA8PCBmbHVzaDsKKwogICAgIHVpbnQ2NF90IHN0b3AgPSBub3coKTsKICAgICB1aW50NjRfdCB0b3QgPSBzdG9wIC0gc3RhcnQ7CiAKLSAgICBwcmludGYoIlRvdGFsIHRpbWU6ICUiIFBSSXU2NCAiIHVzXG4iLCBzdG9wIC0gc3RhcnQpOworICAgIGNvdXQgPDwgIlRvdGFsIHRpbWU6ICIgPDwgc3RvcCAtIHN0YXJ0IDw8ICIgdXMiIDw8IGVuZGw7CiAKICAgICB0aW1lX3RvdCArPSB0b3Q7CiAgICAgaWYgKHRpbWVfbWluID09IDAgfHwgdG90IDwgdGltZV9taW4pIHsKQEAgLTkyMCwxNiArMTEwMiw3OSBAQAogICAgICAgdGltZV9tYXggPSB0b3Q7CiAgICAgfQogCisgICAgY291dCA8PCBmbHVzaDsKICAgICB0cmFuc3BvcnQtPmNsb3NlKCk7CiAgIH0KIAotICBwcmludGYoIlxuQWxsIHRlc3RzIGRvbmUuXG4iKTsKIAogICB1aW50NjRfdCB0aW1lX2F2ZyA9IHRpbWVfdG90IC8gbnVtVGVzdHM7CiAKLSAgcHJpbnRmKCJNaW4gdGltZTogJSIgUFJJdTY0ICIgdXNcbiIsIHRpbWVfbWluKTsKLSAgcHJpbnRmKCJNYXggdGltZTogJSIgUFJJdTY0ICIgdXNcbiIsIHRpbWVfbWF4KTsKLSAgcHJpbnRmKCJBdmcgdGltZTogJSIgUFJJdTY0ICIgdXNcbiIsIHRpbWVfYXZnKTsKKyAgY291dCA8PCAiTWluIHRpbWU6ICIgPDwgdGltZV9taW4gPDwgIiB1cyIgPDwgZW5kbDsKKyAgY291dCA8PCAiTWF4IHRpbWU6ICIgPDwgdGltZV9tYXggPDwgIiB1cyIgPDwgZW5kbDsKKyAgY291dCA8PCAiQXZnIHRpbWU6ICIgPDwgdGltZV9hdmcgPDwgIiB1cyIgPDwgZW5kbDsKIAogICByZXR1cm4gcmV0dXJuX2NvZGU7CiB9CisKK3ZvaWQgYmluYXJ5X2ZpbGwoc3RkOjpzdHJpbmcmIHN0ciwgc3RyaW5nOjpzaXplX3R5cGUgc2l6KQoreworICAgIHN0YXRpYyBjb25zdCBzaWduZWQgY2hhciBiaW5fZGF0YVsyNTZdCisgICAgICAgID0gey0xMjgsIC0xMjcsIC0xMjYsIC0xMjUsIC0xMjQsIC0xMjMsIC0xMjIsIC0xMjEsIC0xMjAsIC0xMTksIC0xMTgsIC0xMTcsIC0xMTYsIC0xMTUsIC0xMTQsCisgICAgICAgICAgIC0xMTMsIC0xMTIsIC0xMTEsIC0xMTAsIC0xMDksIC0xMDgsIC0xMDcsIC0xMDYsIC0xMDUsIC0xMDQsIC0xMDMsIC0xMDIsIC0xMDEsIC0xMDAsIC05OSwKKyAgICAgICAgICAgLTk4LCAgLTk3LCAgLTk2LCAgLTk1LCAgLTk0LCAgLTkzLCAgLTkyLCAgLTkxLCAgLTkwLCAgLTg5LCAgLTg4LCAgLTg3LCAgLTg2LCAgLTg1LCAgLTg0LAorICAgICAgICAgICAtODMsICAtODIsICAtODEsICAtODAsICAtNzksICAtNzgsICAtNzcsICAtNzYsICAtNzUsICAtNzQsICAtNzMsICAtNzIsICAtNzEsICAtNzAsICAtNjksCisgICAgICAgICAgIC02OCwgIC02NywgIC02NiwgIC02NSwgIC02NCwgIC02MywgIC02MiwgIC02MSwgIC02MCwgIC01OSwgIC01OCwgIC01NywgIC01NiwgIC01NSwgIC01NCwKKyAgICAgICAgICAgLTUzLCAgLTUyLCAgLTUxLCAgLTUwLCAgLTQ5LCAgLTQ4LCAgLTQ3LCAgLTQ2LCAgLTQ1LCAgLTQ0LCAgLTQzLCAgLTQyLCAgLTQxLCAgLTQwLCAgLTM5LAorICAgICAgICAgICAtMzgsICAtMzcsICAtMzYsICAtMzUsICAtMzQsICAtMzMsICAtMzIsICAtMzEsICAtMzAsICAtMjksICAtMjgsICAtMjcsICAtMjYsICAtMjUsICAtMjQsCisgICAgICAgICAgIC0yMywgIC0yMiwgIC0yMSwgIC0yMCwgIC0xOSwgIC0xOCwgIC0xNywgIC0xNiwgIC0xNSwgIC0xNCwgIC0xMywgIC0xMiwgIC0xMSwgIC0xMCwgIC05LAorICAgICAgICAgICAtOCwgICAtNywgICAtNiwgICAtNSwgICAtNCwgICAtMywgICAtMiwgICAtMSwgICAwLCAgICAxLCAgICAyLCAgICAzLCAgICA0LCAgICA1LCAgICA2LAorICAgICAgICAgICA3LCAgICA4LCAgICA5LCAgICAxMCwgICAxMSwgICAxMiwgICAxMywgICAxNCwgICAxNSwgICAxNiwgICAxNywgICAxOCwgICAxOSwgICAyMCwgICAyMSwKKyAgICAgICAgICAgMjIsICAgMjMsICAgMjQsICAgMjUsICAgMjYsICAgMjcsICAgMjgsICAgMjksICAgMzAsICAgMzEsICAgMzIsICAgMzMsICAgMzQsICAgMzUsICAgMzYsCisgICAgICAgICAgIDM3LCAgIDM4LCAgIDM5LCAgIDQwLCAgIDQxLCAgIDQyLCAgIDQzLCAgIDQ0LCAgIDQ1LCAgIDQ2LCAgIDQ3LCAgIDQ4LCAgIDQ5LCAgIDUwLCAgIDUxLAorICAgICAgICAgICA1MiwgICA1MywgICA1NCwgICA1NSwgICA1NiwgICA1NywgICA1OCwgICA1OSwgICA2MCwgICA2MSwgICA2MiwgICA2MywgICA2NCwgICA2NSwgICA2NiwKKyAgICAgICAgICAgNjcsICAgNjgsICAgNjksICAgNzAsICAgNzEsICAgNzIsICAgNzMsICAgNzQsICAgNzUsICAgNzYsICAgNzcsICAgNzgsICAgNzksICAgODAsICAgODEsCisgICAgICAgICAgIDgyLCAgIDgzLCAgIDg0LCAgIDg1LCAgIDg2LCAgIDg3LCAgIDg4LCAgIDg5LCAgIDkwLCAgIDkxLCAgIDkyLCAgIDkzLCAgIDk0LCAgIDk1LCAgIDk2LAorICAgICAgICAgICA5NywgICA5OCwgICA5OSwgICAxMDAsICAxMDEsICAxMDIsICAxMDMsICAxMDQsICAxMDUsICAxMDYsICAxMDcsICAxMDgsICAxMDksICAxMTAsICAxMTEsCisgICAgICAgICAgIDExMiwgIDExMywgIDExNCwgIDExNSwgIDExNiwgIDExNywgIDExOCwgIDExOSwgIDEyMCwgIDEyMSwgIDEyMiwgIDEyMywgIDEyNCwgIDEyNSwgIDEyNiwKKyAgICAgICAgICAgMTI3fTsKKworICAgIHN0ci5yZXNpemUoc2l6KTsKKyAgICBjaGFyICpwdHIgPSAmc3RyWzBdOworICAgIHN0cmluZzo6c2l6ZV90eXBlIHBvcyA9IDA7CisgICAgZm9yIChzdHJpbmc6OnNpemVfdHlwZSBpID0gMDsgaSA8IHNpejsgKytpKQorICAgIHsKKyAgICAgICAgaWYgKHBvcyA9PSAyNTUpIHsgcG9zID0gMDsgfSBlbHNlIHsgKytwb3M7IH0KKyAgICAgICAgKnB0cisrID0gYmluX2RhdGFbcG9zXTsKKyAgICB9Cit9CisKK2ludCBiaW5hcnlfdGVzdChUaHJpZnRUZXN0Q2xpZW50JiB0ZXN0Q2xpZW50LCBzdHJpbmc6OnNpemVfdHlwZSBzaXopCit7CisgICAgc3RyaW5nIGJpbl9yZXF1ZXN0OworICAgIHN0cmluZyBiaW5fcmVzdWx0OworCisgICAgY291dCA8PCAidGVzdEJpbmFyeShzaXogPSAiIDw8IHNpeiA8PCAiKSIgPDwgZW5kbDsKKyAgICBiaW5hcnlfZmlsbChiaW5fcmVxdWVzdCwgc2l6KTsKKyAgICB0cnkgeworICAgICAgICB0ZXN0Q2xpZW50LnRlc3RCaW5hcnkoYmluX3Jlc3VsdCwgYmluX3JlcXVlc3QpOworCisgICAgICAgIGlmIChiaW5fcmVxdWVzdC5zaXplKCkgIT0gYmluX3Jlc3VsdC5zaXplKCkpIHsKKyAgICAgICAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQ6IHJlcXVlc3Qgc2l6ZSAiIDw8IGJpbl9yZXF1ZXN0LnNpemUoKSA8PCAiOyByZXN1bHQgc2l6ZSAiIDw8IGJpbl9yZXN1bHQuc2l6ZSgpIDw8IGVuZGw7CisgICAgICAgICAgICByZXR1cm4gRVJSX0JBU0VUWVBFUzsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoc3RyaW5nOjpzaXplX3R5cGUgaSA9IDA7IGkgPCBzaXo7ICsraSkgeworICAgICAgICAgICAgaWYgKGJpbl9yZXF1ZXN0LmF0KGkpICE9IGJpbl9yZXN1bHQuYXQoaSkpIHsKKyAgICAgICAgICAgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEOiBhdCBwb3NpdGlvbiAiIDw8IGkgPDwgIiByZXF1ZXN0W2ldIGlzIGgiIDw8IGhleCA8PCBiaW5fcmVxdWVzdC5hdChpKSA8PCAiIHJlc3VsdFtpXSBpcyBoIiA8PCBoZXggPDwgYmluX3Jlc3VsdC5hdChpKSA8PCBlbmRsOworICAgICAgICAgICAgICAgIHJldHVybiBFUlJfQkFTRVRZUEVTOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYpIHsKKyAgICAgICAgdGhyb3c7CisgICAgfSBjYXRjaCAoZXhjZXB0aW9uJiBleCkgeworICAgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbCA8PCBleC53aGF0KCkgPDwgZW5kbDsKKyAgICAgICAgcmV0dXJuIEVSUl9CQVNFVFlQRVM7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0L2NwcC9zcmMvVGVzdFNlcnZlci5jcHAgYi90ZXN0L2NwcC9zcmMvVGVzdFNlcnZlci5jcHAKaW5kZXggZTViYzMxZS4uNjIyMjAxNyAxMDA2NDQKLS0tIGEvdGVzdC9jcHAvc3JjL1Rlc3RTZXJ2ZXIuY3BwCisrKyBiL3Rlc3QvY3BwL3NyYy9UZXN0U2VydmVyLmNwcApAQCAtMTcsMzggKzE3LDUxIEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jZGVmaW5lIF9fU1REQ19GT1JNQVRfTUFDUk9TCi0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLQotI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1BsYXRmb3JtVGhyZWFkRmFjdG9yeS5oPgotI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KLSNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5oPgotI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuaD4KLSNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RFdmh0dHBTZXJ2ZXIuaD4KICNpbmNsdWRlIDx0aHJpZnQvYXN5bmMvVEFzeW5jQnVmZmVyUHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RBc3luY1Byb3RvY29sUHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RFdmh0dHBTZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvUGxhdGZvcm1UaHJlYWRGYWN0b3J5Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvY2Vzc29yL1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9USGVhZGVyUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5oPgogI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0Lmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU1NMU2VydmVyU29ja2V0Lmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU1NMU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9USHR0cFNlcnZlci5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEh0dHBUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU1NMU2VydmVyU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU1NMU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0Lmg+CisKKyNpbmNsdWRlICJTZWNvbmRTZXJ2aWNlLmgiCiAjaW5jbHVkZSAiVGhyaWZ0VGVzdC5oIgogCisjaWZkZWYgSEFWRV9TVERJTlRfSAorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9JTlRUWVBFU19ICisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU0lHTkFMX0gKKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNlbmRpZgorCiAjaW5jbHVkZSA8aW9zdHJlYW0+CiAjaW5jbHVkZSA8c3RkZXhjZXB0PgogI2luY2x1ZGUgPHNzdHJlYW0+CiAKKyNpbmNsdWRlIDxib29zdC9hbGdvcml0aG0vc3RyaW5nLmhwcD4KICNpbmNsdWRlIDxib29zdC9wcm9ncmFtX29wdGlvbnMuaHBwPgogI2luY2x1ZGUgPGJvb3N0L2ZpbGVzeXN0ZW0uaHBwPgotI2luY2x1ZGUgPHRocmlmdC9jeHhmdW5jdGlvbmFsLmg+CiAKLSNpbmNsdWRlIDxzaWduYWwuaD4KICNpZiBfV0lOMzIKICNpbmNsdWRlIDx0aHJpZnQvd2luZG93cy9UV2luc29ja1NpbmdsZXRvbi5oPgogI2VuZGlmCkBAIC01NiwxNiArNjksMjQgQEAKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6YXN5bmM7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI7Ci11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmFzeW5jOwogCiB1c2luZyBuYW1lc3BhY2UgdGhyaWZ0Ojp0ZXN0OwogCi0vLyBMZW5ndGggb2YgYXJndlswXSAtIExlbmd0aCBvZiBzY3JpcHQgZGlyCi0jZGVmaW5lIEVYRUNVVEFCTEVfRklMRV9OQU1FX0xFTkdUSCAxOQorLy8gdG8gaGFuZGxlIGEgY29udHJvbGxlZCBzaHV0ZG93biwgc2lnbmFsIGhhbmRsaW5nIGlzIG1hbmRhdG9yeQorI2lmZGVmIEhBVkVfU0lHTkFMX0gKK2FwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6TW9uaXRvciBnTW9uaXRvcjsKK3ZvaWQgc2lnbmFsX2hhbmRsZXIoaW50IHNpZ251bSkKK3sKKyAgaWYgKHNpZ251bSA9PSBTSUdJTlQpIHsKKyAgICBnTW9uaXRvci5ub3RpZnlBbGwoKTsKKyAgfQorfQorI2VuZGlmCiAKIGNsYXNzIFRlc3RIYW5kbGVyIDogcHVibGljIFRocmlmdFRlc3RJZiB7CiBwdWJsaWM6CkBAIC0xMDYsNyArMTI3LDcgQEAKICAgdm9pZCB0ZXN0QmluYXJ5KHN0ZDo6c3RyaW5nJiBfcmV0dXJuLCBjb25zdCBzdGQ6OnN0cmluZyYgdGhpbmcpIHsKICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gaGV4c3RyOwogICAgIGhleHN0ciA8PCBzdGQ6OmhleCA8PCB0aGluZzsKLSAgICBwcmludGYoInRlc3RCaW5hcnkoJXMpXG4iLCBoZXhzdHIuc3RyKCkuY19zdHIoKSk7CisgICAgcHJpbnRmKCJ0ZXN0QmluYXJ5KCVsdTogJXMpXG4iLCBzYWZlX251bWVyaWNfY2FzdDx1bnNpZ25lZCBsb25nPih0aGluZy5zaXplKCkpLCBoZXhzdHIuc3RyKCkuY19zdHIoKSk7CiAgICAgX3JldHVybiA9IHRoaW5nOwogICB9CiAKQEAgLTIyMSwzNCArMjQyLDE0IEBACiAgIH0KIAogICB2b2lkIHRlc3RJbnNhbml0eShtYXA8VXNlcklkLCBtYXA8TnVtYmVyejo6dHlwZSwgSW5zYW5pdHk+ID4mIGluc2FuZSwgY29uc3QgSW5zYW5pdHkmIGFyZ3VtZW50KSB7Ci0gICAgKHZvaWQpYXJndW1lbnQ7CiAgICAgcHJpbnRmKCJ0ZXN0SW5zYW5pdHkoKVxuIik7CiAKLSAgICBYdHJ1Y3QgaGVsbG87Ci0gICAgaGVsbG8uc3RyaW5nX3RoaW5nID0gIkhlbGxvMiI7Ci0gICAgaGVsbG8uYnl0ZV90aGluZyA9IDI7Ci0gICAgaGVsbG8uaTMyX3RoaW5nID0gMjsKLSAgICBoZWxsby5pNjRfdGhpbmcgPSAyOwotCi0gICAgWHRydWN0IGdvb2RieWU7Ci0gICAgZ29vZGJ5ZS5zdHJpbmdfdGhpbmcgPSAiR29vZGJ5ZTQiOwotICAgIGdvb2RieWUuYnl0ZV90aGluZyA9IDQ7Ci0gICAgZ29vZGJ5ZS5pMzJfdGhpbmcgPSA0OwotICAgIGdvb2RieWUuaTY0X3RoaW5nID0gNDsKLQotICAgIEluc2FuaXR5IGNyYXp5OwotICAgIGNyYXp5LnVzZXJNYXAuaW5zZXJ0KG1ha2VfcGFpcihOdW1iZXJ6OjpFSUdIVCwgOCkpOwotICAgIGNyYXp5Lnh0cnVjdHMucHVzaF9iYWNrKGdvb2RieWUpOwotCiAgICAgSW5zYW5pdHkgbG9vbmV5OwotICAgIGNyYXp5LnVzZXJNYXAuaW5zZXJ0KG1ha2VfcGFpcihOdW1iZXJ6OjpGSVZFLCA1KSk7Ci0gICAgY3JhenkueHRydWN0cy5wdXNoX2JhY2soaGVsbG8pOwotCiAgICAgbWFwPE51bWJlcno6OnR5cGUsIEluc2FuaXR5PiBmaXJzdF9tYXA7CiAgICAgbWFwPE51bWJlcno6OnR5cGUsIEluc2FuaXR5PiBzZWNvbmRfbWFwOwogCi0gICAgZmlyc3RfbWFwLmluc2VydChtYWtlX3BhaXIoTnVtYmVyejo6VFdPLCBjcmF6eSkpOwotICAgIGZpcnN0X21hcC5pbnNlcnQobWFrZV9wYWlyKE51bWJlcno6OlRIUkVFLCBjcmF6eSkpOworICAgIGZpcnN0X21hcC5pbnNlcnQobWFrZV9wYWlyKE51bWJlcno6OlRXTywgYXJndW1lbnQpKTsKKyAgICBmaXJzdF9tYXAuaW5zZXJ0KG1ha2VfcGFpcihOdW1iZXJ6OjpUSFJFRSwgYXJndW1lbnQpKTsKIAogICAgIHNlY29uZF9tYXAuaW5zZXJ0KG1ha2VfcGFpcihOdW1iZXJ6OjpTSVgsIGxvb25leSkpOwogCkBAIC0zNDgsMTMgKzM0OSwxOCBAQAogICAgIH0KICAgfQogCi0gIHZvaWQgdGVzdE9uZXdheShjb25zdCBpbnQzMl90IHNsZWVwRm9yKSB7Ci0gICAgcHJpbnRmKCJ0ZXN0T25ld2F5KCVkKTogU2xlZXBpbmcuLi5cbiIsIHNsZWVwRm9yKTsKLSAgICBUSFJJRlRfU0xFRVBfU0VDKHNsZWVwRm9yKTsKLSAgICBwcmludGYoInRlc3RPbmV3YXkoJWQpOiBkb25lIHNsZWVwaW5nIVxuIiwgc2xlZXBGb3IpOworICB2b2lkIHRlc3RPbmV3YXkoY29uc3QgaW50MzJfdCBhTnVtKSB7CisgICAgcHJpbnRmKCJ0ZXN0T25ld2F5KCVkKTogY2FsbCByZWNlaXZlZFxuIiwgYU51bSk7CiAgIH0KIH07CiAKK2NsYXNzIFNlY29uZEhhbmRsZXIgOiBwdWJsaWMgU2Vjb25kU2VydmljZUlmCit7CisgIHB1YmxpYzoKKyAgICB2b2lkIHNlY29uZHRlc3RTdHJpbmcoc3RkOjpzdHJpbmcmIHJlc3VsdCwgY29uc3Qgc3RkOjpzdHJpbmcmIHRoaW5nKQorICAgIHsgcmVzdWx0ID0gInRlc3RTdHJpbmcoXCIiICsgdGhpbmcgKyAiXCIpIjsgfQorfTsKKwogY2xhc3MgVGVzdFByb2Nlc3NvckV2ZW50SGFuZGxlciA6IHB1YmxpYyBUUHJvY2Vzc29yRXZlbnRIYW5kbGVyIHsKICAgdmlydHVhbCB2b2lkKiBnZXRDb250ZXh0KGNvbnN0IGNoYXIqIGZuX25hbWUsIHZvaWQqIHNlcnZlckNvbnRleHQpIHsKICAgICAodm9pZClzZXJ2ZXJDb250ZXh0OwpAQCAtMzg4LDY2ICszOTQsNjYgQEAKIAogY2xhc3MgVGVzdEhhbmRsZXJBc3luYyA6IHB1YmxpYyBUaHJpZnRUZXN0Q29iU3ZJZiB7CiBwdWJsaWM6Ci0gIFRlc3RIYW5kbGVyQXN5bmMoYm9vc3Q6OnNoYXJlZF9wdHI8VGVzdEhhbmRsZXI+JiBoYW5kbGVyKSA6IF9kZWxlZ2F0ZShoYW5kbGVyKSB7fQorICBUZXN0SGFuZGxlckFzeW5jKHN0ZDo6c2hhcmVkX3B0cjxUZXN0SGFuZGxlcj4mIGhhbmRsZXIpIDogX2RlbGVnYXRlKGhhbmRsZXIpIHt9CiAgIHZpcnR1YWwgflRlc3RIYW5kbGVyQXN5bmMoKSB7fQogCi0gIHZpcnR1YWwgdm9pZCB0ZXN0Vm9pZCh0Y3h4OjpmdW5jdGlvbjx2b2lkKCk+IGNvYikgeworICB2aXJ0dWFsIHZvaWQgdGVzdFZvaWQoc3RkOjpmdW5jdGlvbjx2b2lkKCk+IGNvYikgewogICAgIF9kZWxlZ2F0ZS0+dGVzdFZvaWQoKTsKICAgICBjb2IoKTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCB0ZXN0U3RyaW5nKHRjeHg6OmZ1bmN0aW9uPHZvaWQoc3RkOjpzdHJpbmcgY29uc3QmIF9yZXR1cm4pPiBjb2IsCisgIHZpcnR1YWwgdm9pZCB0ZXN0U3RyaW5nKHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6OnN0cmluZyBjb25zdCYgX3JldHVybik+IGNvYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHRoaW5nKSB7CiAgICAgc3RkOjpzdHJpbmcgcmVzOwogICAgIF9kZWxlZ2F0ZS0+dGVzdFN0cmluZyhyZXMsIHRoaW5nKTsKICAgICBjb2IocmVzKTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCB0ZXN0Qm9vbCh0Y3h4OjpmdW5jdGlvbjx2b2lkKGJvb2wgY29uc3QmIF9yZXR1cm4pPiBjb2IsIGNvbnN0IGJvb2wgdGhpbmcpIHsKKyAgdmlydHVhbCB2b2lkIHRlc3RCb29sKHN0ZDo6ZnVuY3Rpb248dm9pZChib29sIGNvbnN0JiBfcmV0dXJuKT4gY29iLCBjb25zdCBib29sIHRoaW5nKSB7CiAgICAgYm9vbCByZXMgPSBfZGVsZWdhdGUtPnRlc3RCb29sKHRoaW5nKTsKICAgICBjb2IocmVzKTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCB0ZXN0Qnl0ZSh0Y3h4OjpmdW5jdGlvbjx2b2lkKGludDhfdCBjb25zdCYgX3JldHVybik+IGNvYiwgY29uc3QgaW50OF90IHRoaW5nKSB7CisgIHZpcnR1YWwgdm9pZCB0ZXN0Qnl0ZShzdGQ6OmZ1bmN0aW9uPHZvaWQoaW50OF90IGNvbnN0JiBfcmV0dXJuKT4gY29iLCBjb25zdCBpbnQ4X3QgdGhpbmcpIHsKICAgICBpbnQ4X3QgcmVzID0gX2RlbGVnYXRlLT50ZXN0Qnl0ZSh0aGluZyk7CiAgICAgY29iKHJlcyk7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgdGVzdEkzMih0Y3h4OjpmdW5jdGlvbjx2b2lkKGludDMyX3QgY29uc3QmIF9yZXR1cm4pPiBjb2IsIGNvbnN0IGludDMyX3QgdGhpbmcpIHsKKyAgdmlydHVhbCB2b2lkIHRlc3RJMzIoc3RkOjpmdW5jdGlvbjx2b2lkKGludDMyX3QgY29uc3QmIF9yZXR1cm4pPiBjb2IsIGNvbnN0IGludDMyX3QgdGhpbmcpIHsKICAgICBpbnQzMl90IHJlcyA9IF9kZWxlZ2F0ZS0+dGVzdEkzMih0aGluZyk7CiAgICAgY29iKHJlcyk7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgdGVzdEk2NCh0Y3h4OjpmdW5jdGlvbjx2b2lkKGludDY0X3QgY29uc3QmIF9yZXR1cm4pPiBjb2IsIGNvbnN0IGludDY0X3QgdGhpbmcpIHsKKyAgdmlydHVhbCB2b2lkIHRlc3RJNjQoc3RkOjpmdW5jdGlvbjx2b2lkKGludDY0X3QgY29uc3QmIF9yZXR1cm4pPiBjb2IsIGNvbnN0IGludDY0X3QgdGhpbmcpIHsKICAgICBpbnQ2NF90IHJlcyA9IF9kZWxlZ2F0ZS0+dGVzdEk2NCh0aGluZyk7CiAgICAgY29iKHJlcyk7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgdGVzdERvdWJsZSh0Y3h4OjpmdW5jdGlvbjx2b2lkKGRvdWJsZSBjb25zdCYgX3JldHVybik+IGNvYiwgY29uc3QgZG91YmxlIHRoaW5nKSB7CisgIHZpcnR1YWwgdm9pZCB0ZXN0RG91YmxlKHN0ZDo6ZnVuY3Rpb248dm9pZChkb3VibGUgY29uc3QmIF9yZXR1cm4pPiBjb2IsIGNvbnN0IGRvdWJsZSB0aGluZykgewogICAgIGRvdWJsZSByZXMgPSBfZGVsZWdhdGUtPnRlc3REb3VibGUodGhpbmcpOwogICAgIGNvYihyZXMpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIHRlc3RCaW5hcnkodGN4eDo6ZnVuY3Rpb248dm9pZChzdGQ6OnN0cmluZyBjb25zdCYgX3JldHVybik+IGNvYiwKKyAgdmlydHVhbCB2b2lkIHRlc3RCaW5hcnkoc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6c3RyaW5nIGNvbnN0JiBfcmV0dXJuKT4gY29iLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdGhpbmcpIHsKICAgICBzdGQ6OnN0cmluZyByZXM7CiAgICAgX2RlbGVnYXRlLT50ZXN0QmluYXJ5KHJlcywgdGhpbmcpOwogICAgIGNvYihyZXMpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIHRlc3RTdHJ1Y3QodGN4eDo6ZnVuY3Rpb248dm9pZChYdHJ1Y3QgY29uc3QmIF9yZXR1cm4pPiBjb2IsIGNvbnN0IFh0cnVjdCYgdGhpbmcpIHsKKyAgdmlydHVhbCB2b2lkIHRlc3RTdHJ1Y3Qoc3RkOjpmdW5jdGlvbjx2b2lkKFh0cnVjdCBjb25zdCYgX3JldHVybik+IGNvYiwgY29uc3QgWHRydWN0JiB0aGluZykgewogICAgIFh0cnVjdCByZXM7CiAgICAgX2RlbGVnYXRlLT50ZXN0U3RydWN0KHJlcywgdGhpbmcpOwogICAgIGNvYihyZXMpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIHRlc3ROZXN0KHRjeHg6OmZ1bmN0aW9uPHZvaWQoWHRydWN0MiBjb25zdCYgX3JldHVybik+IGNvYiwgY29uc3QgWHRydWN0MiYgdGhpbmcpIHsKKyAgdmlydHVhbCB2b2lkIHRlc3ROZXN0KHN0ZDo6ZnVuY3Rpb248dm9pZChYdHJ1Y3QyIGNvbnN0JiBfcmV0dXJuKT4gY29iLCBjb25zdCBYdHJ1Y3QyJiB0aGluZykgewogICAgIFh0cnVjdDIgcmVzOwogICAgIF9kZWxlZ2F0ZS0+dGVzdE5lc3QocmVzLCB0aGluZyk7CiAgICAgY29iKHJlcyk7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgdGVzdE1hcCh0Y3h4OjpmdW5jdGlvbjx2b2lkKHN0ZDo6bWFwPGludDMyX3QsIGludDMyX3Q+IGNvbnN0JiBfcmV0dXJuKT4gY29iLAorICB2aXJ0dWFsIHZvaWQgdGVzdE1hcChzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjptYXA8aW50MzJfdCwgaW50MzJfdD4gY29uc3QmIF9yZXR1cm4pPiBjb2IsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPGludDMyX3QsIGludDMyX3Q+JiB0aGluZykgewogICAgIHN0ZDo6bWFwPGludDMyX3QsIGludDMyX3Q+IHJlczsKICAgICBfZGVsZWdhdGUtPnRlc3RNYXAocmVzLCB0aGluZyk7CkBAIC00NTUsNDAgKzQ2MSw0MCBAQAogICB9CiAKICAgdmlydHVhbCB2b2lkIHRlc3RTdHJpbmdNYXAoCi0gICAgICB0Y3h4OjpmdW5jdGlvbjx2b2lkKHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gY29uc3QmIF9yZXR1cm4pPiBjb2IsCisgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBjb25zdCYgX3JldHVybik+IGNvYiwKICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHRoaW5nKSB7CiAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiByZXM7CiAgICAgX2RlbGVnYXRlLT50ZXN0U3RyaW5nTWFwKHJlcywgdGhpbmcpOwogICAgIGNvYihyZXMpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIHRlc3RTZXQodGN4eDo6ZnVuY3Rpb248dm9pZChzdGQ6OnNldDxpbnQzMl90PiBjb25zdCYgX3JldHVybik+IGNvYiwKKyAgdmlydHVhbCB2b2lkIHRlc3RTZXQoc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6c2V0PGludDMyX3Q+IGNvbnN0JiBfcmV0dXJuKT4gY29iLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNldDxpbnQzMl90PiYgdGhpbmcpIHsKICAgICBzdGQ6OnNldDxpbnQzMl90PiByZXM7CiAgICAgX2RlbGVnYXRlLT50ZXN0U2V0KHJlcywgdGhpbmcpOwogICAgIGNvYihyZXMpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIHRlc3RMaXN0KHRjeHg6OmZ1bmN0aW9uPHZvaWQoc3RkOjp2ZWN0b3I8aW50MzJfdD4gY29uc3QmIF9yZXR1cm4pPiBjb2IsCisgIHZpcnR1YWwgdm9pZCB0ZXN0TGlzdChzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjp2ZWN0b3I8aW50MzJfdD4gY29uc3QmIF9yZXR1cm4pPiBjb2IsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgdGhpbmcpIHsKICAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiByZXM7CiAgICAgX2RlbGVnYXRlLT50ZXN0TGlzdChyZXMsIHRoaW5nKTsKICAgICBjb2IocmVzKTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCB0ZXN0RW51bSh0Y3h4OjpmdW5jdGlvbjx2b2lkKE51bWJlcno6OnR5cGUgY29uc3QmIF9yZXR1cm4pPiBjb2IsCisgIHZpcnR1YWwgdm9pZCB0ZXN0RW51bShzdGQ6OmZ1bmN0aW9uPHZvaWQoTnVtYmVyejo6dHlwZSBjb25zdCYgX3JldHVybik+IGNvYiwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE51bWJlcno6OnR5cGUgdGhpbmcpIHsKICAgICBOdW1iZXJ6Ojp0eXBlIHJlcyA9IF9kZWxlZ2F0ZS0+dGVzdEVudW0odGhpbmcpOwogICAgIGNvYihyZXMpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIHRlc3RUeXBlZGVmKHRjeHg6OmZ1bmN0aW9uPHZvaWQoVXNlcklkIGNvbnN0JiBfcmV0dXJuKT4gY29iLCBjb25zdCBVc2VySWQgdGhpbmcpIHsKKyAgdmlydHVhbCB2b2lkIHRlc3RUeXBlZGVmKHN0ZDo6ZnVuY3Rpb248dm9pZChVc2VySWQgY29uc3QmIF9yZXR1cm4pPiBjb2IsIGNvbnN0IFVzZXJJZCB0aGluZykgewogICAgIFVzZXJJZCByZXMgPSBfZGVsZWdhdGUtPnRlc3RUeXBlZGVmKHRoaW5nKTsKICAgICBjb2IocmVzKTsKICAgfQogCiAgIHZpcnR1YWwgdm9pZCB0ZXN0TWFwTWFwKAotICAgICAgdGN4eDo6ZnVuY3Rpb248dm9pZChzdGQ6Om1hcDxpbnQzMl90LCBzdGQ6Om1hcDxpbnQzMl90LCBpbnQzMl90PiA+IGNvbnN0JiBfcmV0dXJuKT4gY29iLAorICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6bWFwPGludDMyX3QsIHN0ZDo6bWFwPGludDMyX3QsIGludDMyX3Q+ID4gY29uc3QmIF9yZXR1cm4pPiBjb2IsCiAgICAgICBjb25zdCBpbnQzMl90IGhlbGxvKSB7CiAgICAgc3RkOjptYXA8aW50MzJfdCwgc3RkOjptYXA8aW50MzJfdCwgaW50MzJfdD4gPiByZXM7CiAgICAgX2RlbGVnYXRlLT50ZXN0TWFwTWFwKHJlcywgaGVsbG8pOwpAQCAtNDk2LDE0ICs1MDIsMTQgQEAKICAgfQogCiAgIHZpcnR1YWwgdm9pZCB0ZXN0SW5zYW5pdHkoCi0gICAgICB0Y3h4OjpmdW5jdGlvbjx2b2lkKHN0ZDo6bWFwPFVzZXJJZCwgc3RkOjptYXA8TnVtYmVyejo6dHlwZSwgSW5zYW5pdHk+ID4gY29uc3QmIF9yZXR1cm4pPiBjb2IsCisgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjptYXA8VXNlcklkLCBzdGQ6Om1hcDxOdW1iZXJ6Ojp0eXBlLCBJbnNhbml0eT4gPiBjb25zdCYgX3JldHVybik+IGNvYiwKICAgICAgIGNvbnN0IEluc2FuaXR5JiBhcmd1bWVudCkgewogICAgIHN0ZDo6bWFwPFVzZXJJZCwgc3RkOjptYXA8TnVtYmVyejo6dHlwZSwgSW5zYW5pdHk+ID4gcmVzOwogICAgIF9kZWxlZ2F0ZS0+dGVzdEluc2FuaXR5KHJlcywgYXJndW1lbnQpOwogICAgIGNvYihyZXMpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIHRlc3RNdWx0aSh0Y3h4OjpmdW5jdGlvbjx2b2lkKFh0cnVjdCBjb25zdCYgX3JldHVybik+IGNvYiwKKyAgdmlydHVhbCB2b2lkIHRlc3RNdWx0aShzdGQ6OmZ1bmN0aW9uPHZvaWQoWHRydWN0IGNvbnN0JiBfcmV0dXJuKT4gY29iLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCBhcmcwLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgYXJnMSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGFyZzIsCkBAIC01MTYsOCArNTIyLDggQEAKICAgfQogCiAgIHZpcnR1YWwgdm9pZCB0ZXN0RXhjZXB0aW9uKAotICAgICAgdGN4eDo6ZnVuY3Rpb248dm9pZCgpPiBjb2IsCi0gICAgICB0Y3h4OjpmdW5jdGlvbjx2b2lkKDo6YXBhY2hlOjp0aHJpZnQ6OlREZWxheWVkRXhjZXB0aW9uKiBfdGhyb3cpPiBleG5fY29iLAorICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKCk+IGNvYiwKKyAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZCg6OmFwYWNoZTo6dGhyaWZ0OjpURGVsYXllZEV4Y2VwdGlvbiogX3Rocm93KT4gZXhuX2NvYiwKICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhcmcpIHsKICAgICB0cnkgewogICAgICAgX2RlbGVnYXRlLT50ZXN0RXhjZXB0aW9uKGFyZyk7CkBAIC01MjksOCArNTM1LDggQEAKICAgfQogCiAgIHZpcnR1YWwgdm9pZCB0ZXN0TXVsdGlFeGNlcHRpb24oCi0gICAgICB0Y3h4OjpmdW5jdGlvbjx2b2lkKFh0cnVjdCBjb25zdCYgX3JldHVybik+IGNvYiwKLSAgICAgIHRjeHg6OmZ1bmN0aW9uPHZvaWQoOjphcGFjaGU6OnRocmlmdDo6VERlbGF5ZWRFeGNlcHRpb24qIF90aHJvdyk+IGV4bl9jb2IsCisgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoWHRydWN0IGNvbnN0JiBfcmV0dXJuKT4gY29iLAorICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKDo6YXBhY2hlOjp0aHJpZnQ6OlREZWxheWVkRXhjZXB0aW9uKiBfdGhyb3cpPiBleG5fY29iLAogICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGFyZzAsCiAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYXJnMSkgewogICAgIFh0cnVjdCByZXM7CkBAIC01NDMsNTYgKzU0OSw1NyBAQAogICAgIGNvYihyZXMpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIHRlc3RPbmV3YXkodGN4eDo6ZnVuY3Rpb248dm9pZCgpPiBjb2IsIGNvbnN0IGludDMyX3Qgc2Vjb25kc1RvU2xlZXApIHsKKyAgdmlydHVhbCB2b2lkIHRlc3RPbmV3YXkoc3RkOjpmdW5jdGlvbjx2b2lkKCk+IGNvYiwgY29uc3QgaW50MzJfdCBzZWNvbmRzVG9TbGVlcCkgewogICAgIF9kZWxlZ2F0ZS0+dGVzdE9uZXdheShzZWNvbmRzVG9TbGVlcCk7CiAgICAgY29iKCk7CiAgIH0KIAogcHJvdGVjdGVkOgotICBib29zdDo6c2hhcmVkX3B0cjxUZXN0SGFuZGxlcj4gX2RlbGVnYXRlOworICBzdGQ6OnNoYXJlZF9wdHI8VGVzdEhhbmRsZXI+IF9kZWxlZ2F0ZTsKIH07CiAKK25hbWVzcGFjZSBwbyA9IGJvb3N0Ojpwcm9ncmFtX29wdGlvbnM7CisKIGludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgewogCi0gIHN0cmluZyBmaWxlX3BhdGggPSBib29zdDo6ZmlsZXN5c3RlbTo6c3lzdGVtX2NvbXBsZXRlKGFyZ3ZbMF0pLnN0cmluZygpOwotICBzdHJpbmcgZGlyX3BhdGggPSBmaWxlX3BhdGguc3Vic3RyKDAsIGZpbGVfcGF0aC5zaXplKCkgLSBFWEVDVVRBQkxFX0ZJTEVfTkFNRV9MRU5HVEgpOworICBzdHJpbmcgdGVzdERpciA9IGJvb3N0OjpmaWxlc3lzdGVtOjpzeXN0ZW1fY29tcGxldGUoYXJndlswXSkucGFyZW50X3BhdGgoKS5wYXJlbnRfcGF0aCgpLnBhcmVudF9wYXRoKCkuc3RyaW5nKCk7CisgIHN0cmluZyBjZXJ0UGF0aCA9IHRlc3REaXIgKyAiL2tleXMvc2VydmVyLmNydCI7CisgIHN0cmluZyBrZXlQYXRoID0gdGVzdERpciArICIva2V5cy9zZXJ2ZXIua2V5IjsKIAogI2lmIF9XSU4zMgogICB0cmFuc3BvcnQ6OlRXaW5zb2NrU2luZ2xldG9uOjpjcmVhdGUoKTsKICNlbmRpZgogICBpbnQgcG9ydCA9IDkwOTA7CiAgIGJvb2wgc3NsID0gZmFsc2U7CisgIGJvb2wgemxpYiA9IGZhbHNlOwogICBzdHJpbmcgdHJhbnNwb3J0X3R5cGUgPSAiYnVmZmVyZWQiOwogICBzdHJpbmcgcHJvdG9jb2xfdHlwZSA9ICJiaW5hcnkiOwogICBzdHJpbmcgc2VydmVyX3R5cGUgPSAic2ltcGxlIjsKICAgc3RyaW5nIGRvbWFpbl9zb2NrZXQgPSAiIjsKKyAgYm9vbCBhYnN0cmFjdF9uYW1lc3BhY2UgPSBmYWxzZTsKICAgc2l6ZV90IHdvcmtlcnMgPSA0OworICBpbnQgc3RyaW5nX2xpbWl0ID0gMDsKKyAgaW50IGNvbnRhaW5lcl9saW1pdCA9IDA7CiAKLSAgYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6b3B0aW9uc19kZXNjcmlwdGlvbiBkZXNjKCJBbGxvd2VkIG9wdGlvbnMiKTsKLSAgZGVzYy5hZGRfb3B0aW9ucygpKCJoZWxwLGgiLCAicHJvZHVjZSBoZWxwIG1lc3NhZ2UiKSgKLSAgICAgICJwb3J0IiwKLSAgICAgIGJvb3N0Ojpwcm9ncmFtX29wdGlvbnM6OnZhbHVlPGludD4oJnBvcnQpLT5kZWZhdWx0X3ZhbHVlKHBvcnQpLAotICAgICAgIlBvcnQgbnVtYmVyIHRvIGxpc3RlbiIpKCJkb21haW4tc29ja2V0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6cHJvZ3JhbV9vcHRpb25zOjp2YWx1ZTxzdHJpbmc+KCZkb21haW5fc29ja2V0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPmRlZmF1bHRfdmFsdWUoZG9tYWluX3NvY2tldCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuaXggRG9tYWluIFNvY2tldCAoZS5nLiAvdG1wL1RocmlmdFRlc3QudGhyaWZ0KSIpKAotICAgICAgInNlcnZlci10eXBlIiwKLSAgICAgIGJvb3N0Ojpwcm9ncmFtX29wdGlvbnM6OnZhbHVlPHN0cmluZz4oJnNlcnZlcl90eXBlKS0+ZGVmYXVsdF92YWx1ZShzZXJ2ZXJfdHlwZSksCi0gICAgICAidHlwZSBvZiBzZXJ2ZXIsIFwic2ltcGxlXCIsIFwidGhyZWFkLXBvb2xcIiwgXCJ0aHJlYWRlZFwiLCBvciBcIm5vbmJsb2NraW5nXCIiKSgKLSAgICAgICJ0cmFuc3BvcnQiLAotICAgICAgYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6dmFsdWU8c3RyaW5nPigmdHJhbnNwb3J0X3R5cGUpLT5kZWZhdWx0X3ZhbHVlKHRyYW5zcG9ydF90eXBlKSwKLSAgICAgICJ0cmFuc3BvcnQ6IGJ1ZmZlcmVkLCBmcmFtZWQsIGh0dHAiKSgKLSAgICAgICJwcm90b2NvbCIsCi0gICAgICBib29zdDo6cHJvZ3JhbV9vcHRpb25zOjp2YWx1ZTxzdHJpbmc+KCZwcm90b2NvbF90eXBlKS0+ZGVmYXVsdF92YWx1ZShwcm90b2NvbF90eXBlKSwKLSAgICAgICJwcm90b2NvbDogYmluYXJ5LCBjb21wYWN0LCBqc29uIikoInNzbCIsICJFbmNyeXB0ZWQgVHJhbnNwb3J0IHVzaW5nIFNTTCIpKAotICAgICAgInByb2Nlc3Nvci1ldmVudHMiLAotICAgICAgInByb2Nlc3Nvci1ldmVudHMiKSgid29ya2VycyxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6dmFsdWU8c2l6ZV90Pigmd29ya2VycyktPmRlZmF1bHRfdmFsdWUod29ya2VycyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJOdW1iZXIgb2YgdGhyZWFkIHBvb2xzIHdvcmtlcnMuIE9ubHkgdmFsaWQgZm9yIHRocmVhZC1wb29sIHNlcnZlciB0eXBlIik7CisgIHBvOjpvcHRpb25zX2Rlc2NyaXB0aW9uIGRlc2MoIkFsbG93ZWQgb3B0aW9ucyIpOworICBkZXNjLmFkZF9vcHRpb25zKCkKKyAgICAoImhlbHAsaCIsICJwcm9kdWNlIGhlbHAgbWVzc2FnZSIpCisgICAgKCJwb3J0IiwgcG86OnZhbHVlPGludD4oJnBvcnQpLT5kZWZhdWx0X3ZhbHVlKHBvcnQpLCAiUG9ydCBudW1iZXIgdG8gbGlzdGVuIikKKyAgICAoImRvbWFpbi1zb2NrZXQiLCBwbzo6dmFsdWU8c3RyaW5nPigmZG9tYWluX3NvY2tldCkgLT5kZWZhdWx0X3ZhbHVlKGRvbWFpbl9zb2NrZXQpLCAiVW5peCBEb21haW4gU29ja2V0IChlLmcuIC90bXAvVGhyaWZ0VGVzdC50aHJpZnQpIikKKyAgICAoImFic3RyYWN0LW5hbWVzcGFjZSIsICJDcmVhdGUgdGhlIGRvbWFpbiBzb2NrZXQgaW4gdGhlIEFic3RyYWN0IE5hbWVzcGFjZSAobm8gY29ubmVjdGlvbiB3aXRoIGZpbGVzeXN0ZW0gcGF0aG5hbWVzKSIpCisgICAgKCJzZXJ2ZXItdHlwZSIsIHBvOjp2YWx1ZTxzdHJpbmc+KCZzZXJ2ZXJfdHlwZSktPmRlZmF1bHRfdmFsdWUoc2VydmVyX3R5cGUpLCAidHlwZSBvZiBzZXJ2ZXIsIFwic2ltcGxlXCIsIFwidGhyZWFkLXBvb2xcIiwgXCJ0aHJlYWRlZFwiLCBvciBcIm5vbmJsb2NraW5nXCIiKQorICAgICgidHJhbnNwb3J0IiwgcG86OnZhbHVlPHN0cmluZz4oJnRyYW5zcG9ydF90eXBlKS0+ZGVmYXVsdF92YWx1ZSh0cmFuc3BvcnRfdHlwZSksICJ0cmFuc3BvcnQ6IGJ1ZmZlcmVkLCBmcmFtZWQsIGh0dHAsIHpsaWIiKQorICAgICgicHJvdG9jb2wiLCBwbzo6dmFsdWU8c3RyaW5nPigmcHJvdG9jb2xfdHlwZSktPmRlZmF1bHRfdmFsdWUocHJvdG9jb2xfdHlwZSksICJwcm90b2NvbDogYmluYXJ5LCBjb21wYWN0LCBoZWFkZXIsIGpzb24sIG11bHRpLCBtdWx0aWMsIG11bHRpaCwgbXVsdGlqIikKKyAgICAoInNzbCIsICJFbmNyeXB0ZWQgVHJhbnNwb3J0IHVzaW5nIFNTTCIpCisgICAgKCJ6bGliIiwgIldyYXBwZWQgVHJhbnNwb3J0IHVzaW5nIFpsaWIiKQorICAgICgicHJvY2Vzc29yLWV2ZW50cyIsICJwcm9jZXNzb3ItZXZlbnRzIikKKyAgICAoIndvcmtlcnMsbiIsIHBvOjp2YWx1ZTxzaXplX3Q+KCZ3b3JrZXJzKS0+ZGVmYXVsdF92YWx1ZSh3b3JrZXJzKSwgIk51bWJlciBvZiB0aHJlYWQgcG9vbHMgd29ya2Vycy4gT25seSB2YWxpZCBmb3IgdGhyZWFkLXBvb2wgc2VydmVyIHR5cGUiKQorICAgICgic3RyaW5nLWxpbWl0IiwgcG86OnZhbHVlPGludD4oJnN0cmluZ19saW1pdCkpCisgICAgKCJjb250YWluZXItbGltaXQiLCBwbzo6dmFsdWU8aW50PigmY29udGFpbmVyX2xpbWl0KSk7CiAKLSAgYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6dmFyaWFibGVzX21hcCB2bTsKLSAgYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6c3RvcmUoYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6cGFyc2VfY29tbWFuZF9saW5lKGFyZ2MsIGFyZ3YsIGRlc2MpLCB2bSk7Ci0gIGJvb3N0Ojpwcm9ncmFtX29wdGlvbnM6Om5vdGlmeSh2bSk7CisgIHBvOjp2YXJpYWJsZXNfbWFwIHZtOworICBwbzo6c3RvcmUocG86OnBhcnNlX2NvbW1hbmRfbGluZShhcmdjLCBhcmd2LCBkZXNjKSwgdm0pOworICBwbzo6bm90aWZ5KHZtKTsKIAogICBpZiAodm0uY291bnQoImhlbHAiKSkgewogICAgIGNvdXQgPDwgZGVzYyA8PCAiXG4iOwpAQCAtNjE0LDYgKzYyMSwxMSBAQAogICAgICAgaWYgKHByb3RvY29sX3R5cGUgPT0gImJpbmFyeSIpIHsKICAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZSA9PSAiY29tcGFjdCIpIHsKICAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZSA9PSAianNvbiIpIHsKKyAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZSA9PSAiaGVhZGVyIikgeworICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlID09ICJtdWx0aSIpIHsgIC8vIG11bHRpcGxleGVkIGJpbmFyeQorICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlID09ICJtdWx0aWMiKSB7IC8vIG11bHRpcGxleGVkIGNvbXBhY3QKKyAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZSA9PSAibXVsdGloIikgeyAvLyBtdWx0aXBsZXhlZCBoZWFkZXIKKyAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZSA9PSAibXVsdGlqIikgeyAvLyBtdWx0aXBsZXhlZCBqc29uCiAgICAgICB9IGVsc2UgewogICAgICAgICB0aHJvdyBpbnZhbGlkX2FyZ3VtZW50KCJVbmtub3duIHByb3RvY29sIHR5cGUgIiArIHByb3RvY29sX3R5cGUpOwogICAgICAgfQpAQCAtNjIzLDYgKzYzNSw4IEBACiAgICAgICBpZiAodHJhbnNwb3J0X3R5cGUgPT0gImJ1ZmZlcmVkIikgewogICAgICAgfSBlbHNlIGlmICh0cmFuc3BvcnRfdHlwZSA9PSAiZnJhbWVkIikgewogICAgICAgfSBlbHNlIGlmICh0cmFuc3BvcnRfdHlwZSA9PSAiaHR0cCIpIHsKKyAgICAgIH0gZWxzZSBpZiAodHJhbnNwb3J0X3R5cGUgPT0gInpsaWIiKSB7CisgICAgICAgIC8vIGNyb3NzdGVzdGVyIHdpbGwgcGFzcyB6bGliIGFzIGEgZmxhZyBhbmQgYSB0cmFuc3BvcnQgcmlnaHQgbm93Li4uCiAgICAgICB9IGVsc2UgewogICAgICAgICB0aHJvdyBpbnZhbGlkX2FyZ3VtZW50KCJVbmtub3duIHRyYW5zcG9ydCB0eXBlICIgKyB0cmFuc3BvcnRfdHlwZSk7CiAgICAgICB9CkBAIC02MzgsODUgKzY1MiwxMjkgQEAKICAgICBzc2wgPSB0cnVlOwogICB9CiAKLSAgLy8gRGlzcGF0Y2hlcgotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3Rvcnk7Ci0gIGlmIChwcm90b2NvbF90eXBlID09ICJqc29uIikgewotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IGpzb25Qcm90b2NvbEZhY3RvcnkobmV3IFRKU09OUHJvdG9jb2xGYWN0b3J5KCkpOwotICAgIHByb3RvY29sRmFjdG9yeSA9IGpzb25Qcm90b2NvbEZhY3Rvcnk7Ci0gIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZSA9PSAiY29tcGFjdCIpIHsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBjb21wYWN0UHJvdG9jb2xGYWN0b3J5KG5ldyBUQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpKTsKLSAgICBwcm90b2NvbEZhY3RvcnkgPSBjb21wYWN0UHJvdG9jb2xGYWN0b3J5OwotICB9IGVsc2UgewotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IGJpbmFyeVByb3RvY29sRmFjdG9yeSgKLSAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnlUPFRCdWZmZXJCYXNlPigpKTsKLSAgICBwcm90b2NvbEZhY3RvcnkgPSBiaW5hcnlQcm90b2NvbEZhY3Rvcnk7CisgIGlmICh2bS5jb3VudCgiemxpYiIpKSB7CisgICAgemxpYiA9IHRydWU7CiAgIH0KIAotICAvLyBQcm9jZXNzb3IKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VGVzdEhhbmRsZXI+IHRlc3RIYW5kbGVyKG5ldyBUZXN0SGFuZGxlcigpKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyaWZ0VGVzdFByb2Nlc3Nvcj4gdGVzdFByb2Nlc3NvcihuZXcgVGhyaWZ0VGVzdFByb2Nlc3Nvcih0ZXN0SGFuZGxlcikpOworI2lmIGRlZmluZWQoSEFWRV9TSUdOQUxfSCkgJiYgZGVmaW5lZChTSUdQSVBFKQorICBpZiAoc3NsKSB7CisgICAgc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOyAvLyBmb3IgT3BlblNTTCwgb3RoZXJ3aXNlIHdlIGVuZCBhYnJ1cHRseQorICB9CisjZW5kaWYKKworICBpZiAodm0uY291bnQoImFic3RyYWN0LW5hbWVzcGFjZSIpKSB7CisgICAgYWJzdHJhY3RfbmFtZXNwYWNlID0gdHJ1ZTsKKyAgfQorCisgIC8vIERpc3BhdGNoZXIKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeTsKKyAgaWYgKHByb3RvY29sX3R5cGUgPT0gImpzb24iIHx8IHByb3RvY29sX3R5cGUgPT0gIm11bHRpaiIpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4ganNvblByb3RvY29sRmFjdG9yeShuZXcgVEpTT05Qcm90b2NvbEZhY3RvcnkoKSk7CisgICAgcHJvdG9jb2xGYWN0b3J5ID0ganNvblByb3RvY29sRmFjdG9yeTsKKyAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlID09ICJjb21wYWN0IiB8fCBwcm90b2NvbF90eXBlID09ICJtdWx0aWMiKSB7CisgICAgVENvbXBhY3RQcm90b2NvbEZhY3RvcnlUPFRCdWZmZXJCYXNlPiAqY29tcGFjdFByb3RvY29sRmFjdG9yeSA9IG5ldyBUQ29tcGFjdFByb3RvY29sRmFjdG9yeVQ8VEJ1ZmZlckJhc2U+KCk7CisgICAgY29tcGFjdFByb3RvY29sRmFjdG9yeS0+c2V0Q29udGFpbmVyU2l6ZUxpbWl0KGNvbnRhaW5lcl9saW1pdCk7CisgICAgY29tcGFjdFByb3RvY29sRmFjdG9yeS0+c2V0U3RyaW5nU2l6ZUxpbWl0KHN0cmluZ19saW1pdCk7CisgICAgcHJvdG9jb2xGYWN0b3J5LnJlc2V0KGNvbXBhY3RQcm90b2NvbEZhY3RvcnkpOworICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gImhlYWRlciIgfHwgcHJvdG9jb2xfdHlwZSA9PSAibXVsdGloIikgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBoZWFkZXJQcm90b2NvbEZhY3RvcnkobmV3IFRIZWFkZXJQcm90b2NvbEZhY3RvcnkoKSk7CisgICAgcHJvdG9jb2xGYWN0b3J5ID0gaGVhZGVyUHJvdG9jb2xGYWN0b3J5OworICB9IGVsc2UgeworICAgIFRCaW5hcnlQcm90b2NvbEZhY3RvcnlUPFRCdWZmZXJCYXNlPiogYmluYXJ5UHJvdG9jb2xGYWN0b3J5ID0gbmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnlUPFRCdWZmZXJCYXNlPigpOworICAgIGJpbmFyeVByb3RvY29sRmFjdG9yeS0+c2V0Q29udGFpbmVyU2l6ZUxpbWl0KGNvbnRhaW5lcl9saW1pdCk7CisgICAgYmluYXJ5UHJvdG9jb2xGYWN0b3J5LT5zZXRTdHJpbmdTaXplTGltaXQoc3RyaW5nX2xpbWl0KTsKKyAgICBwcm90b2NvbEZhY3RvcnkucmVzZXQoYmluYXJ5UHJvdG9jb2xGYWN0b3J5KTsKKyAgfQorCisgIC8vIFByb2Nlc3NvcnMKKyAgc3RkOjpzaGFyZWRfcHRyPFRlc3RIYW5kbGVyPiB0ZXN0SGFuZGxlcihuZXcgVGVzdEhhbmRsZXIoKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiB0ZXN0UHJvY2Vzc29yKG5ldyBUaHJpZnRUZXN0UHJvY2Vzc29yKHRlc3RIYW5kbGVyKSk7CiAKICAgaWYgKHZtLmNvdW50KCJwcm9jZXNzb3ItZXZlbnRzIikpIHsKICAgICB0ZXN0UHJvY2Vzc29yLT5zZXRFdmVudEhhbmRsZXIoCi0gICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JFdmVudEhhbmRsZXI+KG5ldyBUZXN0UHJvY2Vzc29yRXZlbnRIYW5kbGVyKCkpKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JFdmVudEhhbmRsZXI+KG5ldyBUZXN0UHJvY2Vzc29yRXZlbnRIYW5kbGVyKCkpKTsKICAgfQogCiAgIC8vIFRyYW5zcG9ydAotICBib29zdDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gc3NsU29ja2V0RmFjdG9yeTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4gc2VydmVyU29ja2V0OworICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IHNzbFNvY2tldEZhY3Rvcnk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyU29ja2V0PiBzZXJ2ZXJTb2NrZXQ7CiAKICAgaWYgKHNzbCkgewotICAgIHNzbFNvY2tldEZhY3RvcnkgPSBib29zdDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4obmV3IFRTU0xTb2NrZXRGYWN0b3J5KCkpOwotICAgIHNzbFNvY2tldEZhY3RvcnktPmxvYWRDZXJ0aWZpY2F0ZSgoZGlyX3BhdGggKyAiLi4va2V5cy9zZXJ2ZXIuY3J0IikuY19zdHIoKSk7Ci0gICAgc3NsU29ja2V0RmFjdG9yeS0+bG9hZFByaXZhdGVLZXkoKGRpcl9wYXRoICsgIi4uL2tleXMvc2VydmVyLmtleSIpLmNfc3RyKCkpOworICAgIHNzbFNvY2tldEZhY3RvcnkgPSBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+KG5ldyBUU1NMU29ja2V0RmFjdG9yeSgpKTsKKyAgICBzc2xTb2NrZXRGYWN0b3J5LT5sb2FkQ2VydGlmaWNhdGUoY2VydFBhdGguY19zdHIoKSk7CisgICAgc3NsU29ja2V0RmFjdG9yeS0+bG9hZFByaXZhdGVLZXkoa2V5UGF0aC5jX3N0cigpKTsKICAgICBzc2xTb2NrZXRGYWN0b3J5LT5jaXBoZXJzKCJBTEw6IUFESDohTE9XOiFFWFA6IU1ENTpAU1RSRU5HVEgiKTsKLSAgICBzZXJ2ZXJTb2NrZXQgPSBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyU29ja2V0PihuZXcgVFNTTFNlcnZlclNvY2tldChwb3J0LCBzc2xTb2NrZXRGYWN0b3J5KSk7CisgICAgaWYgKHNlcnZlcl90eXBlICE9ICJub25ibG9ja2luZyIpIHsKKyAgICAgIHNlcnZlclNvY2tldCA9IHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyU29ja2V0PihuZXcgVFNTTFNlcnZlclNvY2tldChwb3J0LCBzc2xTb2NrZXRGYWN0b3J5KSk7CisgICAgfQogICB9IGVsc2UgewogICAgIGlmIChkb21haW5fc29ja2V0ICE9ICIiKSB7Ci0gICAgICB1bmxpbmsoZG9tYWluX3NvY2tldC5jX3N0cigpKTsKLSAgICAgIHNlcnZlclNvY2tldCA9IGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJTb2NrZXQ+KG5ldyBUU2VydmVyU29ja2V0KGRvbWFpbl9zb2NrZXQpKTsKKyAgICAgIGlmIChhYnN0cmFjdF9uYW1lc3BhY2UpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgYWJzdHJhY3Rfc29ja2V0KCJcMCIsIDEpOworICAgICAgICBhYnN0cmFjdF9zb2NrZXQgKz0gZG9tYWluX3NvY2tldDsKKyAgICAgICAgc2VydmVyU29ja2V0ID0gc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJTb2NrZXQ+KG5ldyBUU2VydmVyU29ja2V0KGFic3RyYWN0X3NvY2tldCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdW5saW5rKGRvbWFpbl9zb2NrZXQuY19zdHIoKSk7CisgICAgICAgIHNlcnZlclNvY2tldCA9IHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyU29ja2V0PihuZXcgVFNlcnZlclNvY2tldChkb21haW5fc29ja2V0KSk7CisgICAgICB9CiAgICAgICBwb3J0ID0gMDsKICAgICB9IGVsc2UgewotICAgICAgc2VydmVyU29ja2V0ID0gYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4obmV3IFRTZXJ2ZXJTb2NrZXQocG9ydCkpOworICAgICAgc2VydmVyU29ja2V0ID0gc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJTb2NrZXQ+KG5ldyBUU2VydmVyU29ja2V0KHBvcnQpKTsKICAgICB9CiAgIH0KIAogICAvLyBGYWN0b3J5Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5OworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3Rvcnk7CiAKICAgaWYgKHRyYW5zcG9ydF90eXBlID09ICJodHRwIiAmJiBzZXJ2ZXJfdHlwZSAhPSAibm9uYmxvY2tpbmciKSB7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IGh0dHBUcmFuc3BvcnRGYWN0b3J5KG5ldyBUSHR0cFNlcnZlclRyYW5zcG9ydEZhY3RvcnkoKSk7Ci0gICAgdHJhbnNwb3J0RmFjdG9yeSA9IGh0dHBUcmFuc3BvcnRGYWN0b3J5OworICAgIHRyYW5zcG9ydEZhY3RvcnkgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRIdHRwU2VydmVyVHJhbnNwb3J0RmFjdG9yeT4oKTsKICAgfSBlbHNlIGlmICh0cmFuc3BvcnRfdHlwZSA9PSAiZnJhbWVkIikgewotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiBmcmFtZWRUcmFuc3BvcnRGYWN0b3J5KG5ldyBURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSgpKTsKLSAgICB0cmFuc3BvcnRGYWN0b3J5ID0gZnJhbWVkVHJhbnNwb3J0RmFjdG9yeTsKKyAgICB0cmFuc3BvcnRGYWN0b3J5ID0gc3RkOjptYWtlX3NoYXJlZDxURnJhbWVkVHJhbnNwb3J0RmFjdG9yeT4oKTsKICAgfSBlbHNlIHsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gYnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkpOwotICAgIHRyYW5zcG9ydEZhY3RvcnkgPSBidWZmZXJlZFRyYW5zcG9ydEZhY3Rvcnk7CisgICAgdHJhbnNwb3J0RmFjdG9yeSA9IHN0ZDo6bWFrZV9zaGFyZWQ8VEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeT4oKTsKKyAgfQorCisgIGlmICh6bGliKSB7CisgICAgLy8gaG1tLi4gZG9lc24ndCBzZWVtIHRvIGJlIGEgd2F5IHRvIG1ha2UgaXQgd3JhcCB0aGUgb3RoZXJzLi4uCisgICAgdHJhbnNwb3J0RmFjdG9yeSA9IHN0ZDo6bWFrZV9zaGFyZWQ8VFpsaWJUcmFuc3BvcnRGYWN0b3J5PigpOwogICB9CiAKICAgLy8gU2VydmVyIEluZm8KICAgY291dCA8PCAiU3RhcnRpbmcgXCIiIDw8IHNlcnZlcl90eXBlIDw8ICJcIiBzZXJ2ZXIgKCIgPDwgdHJhbnNwb3J0X3R5cGUgPDwgIi8iIDw8IHByb3RvY29sX3R5cGUKLSAgICAgICA8PCAiKSBsaXN0ZW4gb246ICIgPDwgZG9tYWluX3NvY2tldDsKKyAgICAgICA8PCAiKSBsaXN0ZW4gb246ICI7CisgIGlmIChhYnN0cmFjdF9uYW1lc3BhY2UpIHsKKyAgICBjb3V0IDw8ICdAJzsKKyAgfQorICBjb3V0IDw8IGRvbWFpbl9zb2NrZXQ7CiAgIGlmIChwb3J0ICE9IDApIHsKICAgICBjb3V0IDw8IHBvcnQ7CiAgIH0KICAgY291dCA8PCBlbmRsOwogCisgIC8vIE11bHRpcGxleGVkIFByb2Nlc3NvciBpZiBuZWVkZWQKKyAgaWYgKGJvb3N0OjpzdGFydHNfd2l0aChwcm90b2NvbF90eXBlLCAibXVsdGkiKSkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxTZWNvbmRIYW5kbGVyPiBzZWNvbmRIYW5kbGVyKG5ldyBTZWNvbmRIYW5kbGVyKCkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxTZWNvbmRTZXJ2aWNlUHJvY2Vzc29yPiBzZWNvbmRQcm9jZXNzb3IobmV3IFNlY29uZFNlcnZpY2VQcm9jZXNzb3Ioc2Vjb25kSGFuZGxlcikpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPFRNdWx0aXBsZXhlZFByb2Nlc3Nvcj4gbXVsdGlwbGV4ZWRQcm9jZXNzb3IobmV3IFRNdWx0aXBsZXhlZFByb2Nlc3NvcigpKTsKKyAgICBtdWx0aXBsZXhlZFByb2Nlc3Nvci0+cmVnaXN0ZXJEZWZhdWx0KHRlc3RQcm9jZXNzb3IpOyAvLyBub24tbXVsdGkgY2xpZW50cyBnbyB0byB0aGUgZGVmYXVsdCBwcm9jZXNzb3IgKG11bHRpOmJpbmFyeSwgbXVsdGljOmNvbXBhY3QsIC4uLikKKyAgICBtdWx0aXBsZXhlZFByb2Nlc3Nvci0+cmVnaXN0ZXJQcm9jZXNzb3IoIlRocmlmdFRlc3QiLCB0ZXN0UHJvY2Vzc29yKTsKKyAgICBtdWx0aXBsZXhlZFByb2Nlc3Nvci0+cmVnaXN0ZXJQcm9jZXNzb3IoIlNlY29uZFNlcnZpY2UiLCBzZWNvbmRQcm9jZXNzb3IpOworICAgIHRlc3RQcm9jZXNzb3IgPSBzdGQ6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFRQcm9jZXNzb3I+KG11bHRpcGxleGVkUHJvY2Vzc29yKTsKKyAgfQorCiAgIC8vIFNlcnZlcgotICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6c2VydmVyOjpUU2VydmVyPiBzZXJ2ZXI7CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6c2VydmVyOjpUU2VydmVyPiBzZXJ2ZXI7CiAKICAgaWYgKHNlcnZlcl90eXBlID09ICJzaW1wbGUiKSB7CiAgICAgc2VydmVyLnJlc2V0KG5ldyBUU2ltcGxlU2VydmVyKHRlc3RQcm9jZXNzb3IsIHNlcnZlclNvY2tldCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KSk7CiAgIH0gZWxzZSBpZiAoc2VydmVyX3R5cGUgPT0gInRocmVhZC1wb29sIikgewogCi0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlciA9IFRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIod29ya2Vycyk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeQorICAgICAgICA9IHN0ZDo6c2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+KG5ldyBQbGF0Zm9ybVRocmVhZEZhY3RvcnkoKSk7CiAKLSAgICBib29zdDo6c2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkKLSAgICAgICAgPSBib29zdDo6c2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+KG5ldyBQbGF0Zm9ybVRocmVhZEZhY3RvcnkoKSk7Ci0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlciA9IFRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIod29ya2Vycyk7CiAgICAgdGhyZWFkTWFuYWdlci0+dGhyZWFkRmFjdG9yeSh0aHJlYWRGYWN0b3J5KTsKLQogICAgIHRocmVhZE1hbmFnZXItPnN0YXJ0KCk7CiAKICAgICBzZXJ2ZXIucmVzZXQobmV3IFRUaHJlYWRQb29sU2VydmVyKHRlc3RQcm9jZXNzb3IsCkBAIC03MjUsMTUgKzc4MywxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkTWFuYWdlcikpOwogICB9IGVsc2UgaWYgKHNlcnZlcl90eXBlID09ICJ0aHJlYWRlZCIpIHsKLQogICAgIHNlcnZlci5yZXNldCgKICAgICAgICAgbmV3IFRUaHJlYWRlZFNlcnZlcih0ZXN0UHJvY2Vzc29yLCBzZXJ2ZXJTb2NrZXQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSkpOwogICB9IGVsc2UgaWYgKHNlcnZlcl90eXBlID09ICJub25ibG9ja2luZyIpIHsKICAgICBpZiAodHJhbnNwb3J0X3R5cGUgPT0gImh0dHAiKSB7Ci0gICAgICBib29zdDo6c2hhcmVkX3B0cjxUZXN0SGFuZGxlckFzeW5jPiB0ZXN0SGFuZGxlckFzeW5jKG5ldyBUZXN0SGFuZGxlckFzeW5jKHRlc3RIYW5kbGVyKSk7Ci0gICAgICBib29zdDo6c2hhcmVkX3B0cjxUQXN5bmNQcm9jZXNzb3I+IHRlc3RQcm9jZXNzb3JBc3luYygKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUZXN0SGFuZGxlckFzeW5jPiB0ZXN0SGFuZGxlckFzeW5jKG5ldyBUZXN0SGFuZGxlckFzeW5jKHRlc3RIYW5kbGVyKSk7CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8VEFzeW5jUHJvY2Vzc29yPiB0ZXN0UHJvY2Vzc29yQXN5bmMoCiAgICAgICAgICAgbmV3IFRocmlmdFRlc3RBc3luY1Byb2Nlc3Nvcih0ZXN0SGFuZGxlckFzeW5jKSk7Ci0gICAgICBib29zdDo6c2hhcmVkX3B0cjxUQXN5bmNCdWZmZXJQcm9jZXNzb3I+IHRlc3RCdWZmZXJQcm9jZXNzb3IoCisgICAgICBzdGQ6OnNoYXJlZF9wdHI8VEFzeW5jQnVmZmVyUHJvY2Vzc29yPiB0ZXN0QnVmZmVyUHJvY2Vzc29yKAogICAgICAgICAgIG5ldyBUQXN5bmNQcm90b2NvbFByb2Nlc3Nvcih0ZXN0UHJvY2Vzc29yQXN5bmMsIHByb3RvY29sRmFjdG9yeSkpOwogCiAgICAgICAvLyBub3QgbG9hZGluZyBub25ibG9ja2luZ1NlcnZlciBpbnRvICJzZXJ2ZXIiIGJlY2F1c2UKQEAgLTc0MSwyNiArNzk4LDQxIEBACiAgICAgICAvLyBwcm92aWRlIGEgc3RvcCBtZXRob2QuCiAgICAgICBURXZodHRwU2VydmVyIG5vbmJsb2NraW5nU2VydmVyKHRlc3RCdWZmZXJQcm9jZXNzb3IsIHBvcnQpOwogICAgICAgbm9uYmxvY2tpbmdTZXJ2ZXIuc2VydmUoKTsKKyAgICB9IGVsc2UgaWYgKHRyYW5zcG9ydF90eXBlID09ICJmcmFtZWQiKSB7CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8dHJhbnNwb3J0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQ+IG5iU29ja2V0OworICAgICAgbmJTb2NrZXQucmVzZXQoCisgICAgICAgICAgc3NsID8gbmV3IHRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0KHBvcnQsIHNzbFNvY2tldEZhY3RvcnkpCisgICAgICAgICAgICAgIDogbmV3IHRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU2VydmVyU29ja2V0KHBvcnQpKTsKKyAgICAgIHNlcnZlci5yZXNldChuZXcgVE5vbmJsb2NraW5nU2VydmVyKHRlc3RQcm9jZXNzb3IsIHByb3RvY29sRmFjdG9yeSwgbmJTb2NrZXQpKTsKICAgICB9IGVsc2UgewotICAgICAgc2VydmVyLnJlc2V0KG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXIodGVzdFByb2Nlc3NvciwgcG9ydCkpOworICAgICAgY2VyciA8PCAic2VydmVyLXR5cGUgbm9uYmxvY2tpbmcgcmVxdWlyZXMgdHJhbnNwb3J0IG9mIGh0dHAgb3IgZnJhbWVkIiA8PCBlbmRsOworICAgICAgZXhpdCgxKTsKICAgICB9CiAgIH0KIAogICBpZiAoc2VydmVyLmdldCgpICE9IE5VTEwpIHsKKyAgICBpZiAocHJvdG9jb2xfdHlwZSA9PSAiaGVhZGVyIikgeworICAgICAgLy8gVGVsbCB0aGUgc2VydmVyIHRvIHVzZSB0aGUgc2FtZSBwcm90b2NvbCBmb3IgaW5wdXQgLyBvdXRwdXQKKyAgICAgIC8vIGlmIHVzaW5nIGhlYWRlcgorICAgICAgc2VydmVyLT5zZXRPdXRwdXRQcm90b2NvbEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+KCkpOworICAgIH0KKyAgICAKICAgICBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlBsYXRmb3JtVGhyZWFkRmFjdG9yeSBmYWN0b3J5OwogICAgIGZhY3Rvcnkuc2V0RGV0YWNoZWQoZmFsc2UpOwotICAgIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UnVubmFibGU+IHNlcnZlclRocmVhZFJ1bm5lcihzZXJ2ZXIpOwotICAgIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkPiB0aHJlYWQKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpSdW5uYWJsZT4gc2VydmVyVGhyZWFkUnVubmVyKHNlcnZlcik7CisgICAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkPiB0aHJlYWQKICAgICAgICAgPSBmYWN0b3J5Lm5ld1RocmVhZChzZXJ2ZXJUaHJlYWRSdW5uZXIpOwotICAgIHRocmVhZC0+c3RhcnQoKTsKIAotICAgIC8vIEhBQ0s6IGNyb3NzIGxhbmd1YWdlIHRlc3Qgc3VpdGUgaXMgdW5hYmxlIHRvIGhhbmRsZSBjaW4gcHJvcGVybHkKLSAgICAvLyAgICAgICB0aGF0J3Mgd2h5IHdlIHN0YXkgaW4gYSBlbmRsZXNzIGxvb3AgaGVyZQotICAgIHdoaWxlICgxKSB7Ci0gICAgfQotICAgIC8vIEZJWE1FOiBmaW5kIGFub3RoZXIgd2F5IHRvIHN0b3AgdGhlIHNlcnZlciAoZS5nLiBhIHNpZ25hbCkKLSAgICAvLyBjb3V0PDwiUHJlc3MgZW50ZXIgdG8gc3RvcCB0aGUgc2VydmVyLiI8PGVuZGw7Ci0gICAgLy8gY2luLmlnbm9yZSgpOyAvL3dhaXQgdW50aWwgYSBrZXkgaXMgcHJlc3NlZAorI2lmZGVmIEhBVkVfU0lHTkFMX0gKKyAgICBzaWduYWwoU0lHSU5ULCBzaWduYWxfaGFuZGxlcik7CisjZW5kaWYKKworICAgIHRocmVhZC0+c3RhcnQoKTsKKyAgICBnTW9uaXRvci53YWl0Rm9yZXZlcigpOyAgICAgICAgIC8vIHdhaXQgZm9yIGEgc2h1dGRvd24gc2lnbmFsCisgICAgCisjaWZkZWYgSEFWRV9TSUdOQUxfSAorICAgIHNpZ25hbChTSUdJTlQsIFNJR19ERkwpOworI2VuZGlmCiAKICAgICBzZXJ2ZXItPnN0b3AoKTsKICAgICB0aHJlYWQtPmpvaW4oKTsKQEAgLTc3MCwzICs4NDIsNCBAQAogICBjb3V0IDw8ICJkb25lLiIgPDwgZW5kbDsKICAgcmV0dXJuIDA7CiB9CisKZGlmZiAtLWdpdCBhL3Rlc3QvY3Jvc3NydW5uZXIvX19pbml0X18ucHkgYi90ZXN0L2Nyb3NzcnVubmVyL19faW5pdF9fLnB5CmluZGV4IDA2ZGUyZDAuLjlkMGI4M2EgMTAwNjQ0Ci0tLSBhL3Rlc3QvY3Jvc3NydW5uZXIvX19pbml0X18ucHkKKysrIGIvdGVzdC9jcm9zc3J1bm5lci9fX2luaXRfXy5weQpAQCAtMTcsOSArMTcsNyBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotZnJvbSBjcm9zc3J1bm5lci50ZXN0IGltcG9ydCB0ZXN0X25hbWUKLWZyb20gY3Jvc3NydW5uZXIuY29sbGVjdCBpbXBvcnQgY29sbGVjdF90ZXN0cwotZnJvbSBjcm9zc3J1bm5lci5ydW4gaW1wb3J0IFRlc3REaXNwYXRjaGVyCi1mcm9tIGNyb3NzcnVubmVyLnJlcG9ydCBpbXBvcnQgZ2VuZXJhdGVfa25vd25fZmFpbHVyZXMKLWZyb20gY3Jvc3NydW5uZXIucmVwb3J0IGltcG9ydCBsb2FkX2tub3duX2ZhaWx1cmVzCi1mcm9tIGNyb3NzcnVubmVyLnByZXBhcmUgaW1wb3J0IHByZXBhcmUKK2Zyb20gLnRlc3QgaW1wb3J0IHRlc3RfbmFtZSAgIyBub3FhCitmcm9tIC5jb2xsZWN0IGltcG9ydCBjb2xsZWN0X2Nyb3NzX3Rlc3RzLCBjb2xsZWN0X2ZlYXR1cmVfdGVzdHMgICMgbm9xYQorZnJvbSAucnVuIGltcG9ydCBUZXN0RGlzcGF0Y2hlciAgIyBub3FhCitmcm9tIC5yZXBvcnQgaW1wb3J0IGdlbmVyYXRlX2tub3duX2ZhaWx1cmVzLCBsb2FkX2tub3duX2ZhaWx1cmVzICAjIG5vcWEKZGlmZiAtLWdpdCBhL3Rlc3QvY3Jvc3NydW5uZXIvY29sbGVjdC5weSBiL3Rlc3QvY3Jvc3NydW5uZXIvY29sbGVjdC5weQppbmRleCAxNDVhZmVmLi5lMmQ4OTc4IDEwMDY0NAotLS0gYS90ZXN0L2Nyb3NzcnVubmVyL2NvbGxlY3QucHkKKysrIGIvdGVzdC9jcm9zc3J1bm5lci9jb2xsZWN0LnB5CkBAIC0xOCw5ICsxOCwxMSBAQAogIwogCiBpbXBvcnQgcGxhdGZvcm0KK2ltcG9ydCByZQogZnJvbSBpdGVydG9vbHMgaW1wb3J0IHByb2R1Y3QKIAotZnJvbSBjcm9zc3J1bm5lci51dGlsIGltcG9ydCBtZXJnZV9kaWN0Citmcm9tIC51dGlsIGltcG9ydCBtZXJnZV9kaWN0Citmcm9tIC50ZXN0IGltcG9ydCBUZXN0RW50cnkKIAogIyBUaG9zZSBrZXlzIGFyZSBwYXNzZWQgdG8gZXhlY3V0aW9uIGFzIGlzLgogIyBOb3RlIHRoYXQgdGhlcmUgYXJlIGtleXMgb3RoZXIgdGhhbiB0aGVzZSwgbmFtZWx5OgpAQCAtMzksMTA0ICs0MSwxMjQgQEAKICMgKGUuZy4gImJpbmFyeSIgaXMgZXF1aXZhbGVudCB0byAiYmluYXJ5OmJpbmFyeSIgaW4gdGVzdHMuanNvbikKICMKIFZBTElEX0pTT05fS0VZUyA9IFsKLSAgJ25hbWUnLCAgIyBuYW1lIG9mIHRoZSBsaWJyYXJ5LCB0eXBpY2FsbHkgYSBsYW5ndWFnZSBuYW1lCi0gICd3b3JrZGlyJywgICMgd29yayBkaXJlY3Rvcnkgd2hlcmUgY29tbWFuZCBpcyBleGVjdXRlZAotICAnY29tbWFuZCcsICAjIHRlc3QgY29tbWFuZAotICAnZXh0cmFfYXJncycsICAjIGFyZ3MgYXBwZW5kZWQgdG8gY29tbWFuZCBhZnRlciBvdGhlciBhcmdzIGFyZSBhcHBlbmRlZAotICAnam9pbl9hcmdzJywgICMgd2hldGhlciBhcmdzIHNob3VsZCBiZSBwYXNzZWQgYXMgc2luZ2xlIGNvbmNhdGVuYXRlZCBzdHJpbmcKLSAgJ2VudicsICAjIGFkZGl0aW9uYWwgZW52aXJvbm1lbnRhbCB2YXJpYWJsZQorICAgICduYW1lJywgICMgbmFtZSBvZiB0aGUgbGlicmFyeSwgdHlwaWNhbGx5IGEgbGFuZ3VhZ2UgbmFtZQorICAgICd3b3JrZGlyJywgICMgd29yayBkaXJlY3Rvcnkgd2hlcmUgY29tbWFuZCBpcyBleGVjdXRlZAorICAgICdjb21tYW5kJywgICMgdGVzdCBjb21tYW5kCisgICAgJ2V4dHJhX2FyZ3MnLCAgIyBhcmdzIGFwcGVuZGVkIHRvIGNvbW1hbmQgYWZ0ZXIgb3RoZXIgYXJncyBhcmUgYXBwZW5kZWQKKyAgICAncmVtb3RlX2FyZ3MnLCAgIyBhcmdzIGFkZGVkIHRvIHRoZSBvdGhlciBzaWRlIG9mIHRoZSBwcm9ncmFtCisgICAgJ2pvaW5fYXJncycsICAjIHdoZXRoZXIgYXJncyBzaG91bGQgYmUgcGFzc2VkIGFzIHNpbmdsZSBjb25jYXRlbmF0ZWQgc3RyaW5nCisgICAgJ2VudicsICAjIGFkZGl0aW9uYWwgZW52aXJvbm1lbnRhbCB2YXJpYWJsZQogXQogCi1ERUZBVUxUX0RFTEFZID0gMQorREVGQVVMVF9NQVhfREVMQVkgPSA1CitERUZBVUxUX1NJR05BTCA9IDEKIERFRkFVTFRfVElNRU9VVCA9IDUKIAogCi1kZWYgY29sbGVjdF90ZXN0bGlicyhjb25maWcsIHNlcnZlcl9tYXRjaCwgY2xpZW50X21hdGNoKToKLSAgIiIiQ29sbGVjdHMgc2VydmVyL2NsaWVudCBjb25maWd1cmF0aW9ucyBmcm9tIGxpYnJhcnkgY29uZmlndXJhdGlvbnMiIiIKLSAgZGVmIGV4cGFuZF9saWJzKGNvbmZpZyk6Ci0gICAgZm9yIGxpYiBpbiBjb25maWc6Ci0gICAgICBzdiA9IGxpYi5wb3AoJ3NlcnZlcicsIE5vbmUpCi0gICAgICBjbCA9IGxpYi5wb3AoJ2NsaWVudCcsIE5vbmUpCi0gICAgICB5aWVsZCBsaWIsIHN2LCBjbAorZGVmIF9jb2xsZWN0X3Rlc3RsaWJzKGNvbmZpZywgc2VydmVyX21hdGNoLCBjbGllbnRfbWF0Y2g9W05vbmVdKToKKyAgICAiIiJDb2xsZWN0cyBzZXJ2ZXIvY2xpZW50IGNvbmZpZ3VyYXRpb25zIGZyb20gbGlicmFyeSBjb25maWd1cmF0aW9ucyIiIgorICAgIGRlZiBleHBhbmRfbGlicyhjb25maWcpOgorICAgICAgICBmb3IgbGliIGluIGNvbmZpZzoKKyAgICAgICAgICAgIHN2ID0gbGliLnBvcCgnc2VydmVyJywgTm9uZSkKKyAgICAgICAgICAgIGNsID0gbGliLnBvcCgnY2xpZW50JywgTm9uZSkKKyAgICAgICAgICAgIHlpZWxkIGxpYiwgc3YsIGNsCiAKLSAgZGVmIHlpZWxkX3Rlc3RsaWJzKGJhc2VfY29uZmlncywgY29uZmlncywgbWF0Y2gpOgotICAgIGZvciBiYXNlLCBjb25mIGluIHppcChiYXNlX2NvbmZpZ3MsIGNvbmZpZ3MpOgotICAgICAgaWYgY29uZjoKLSAgICAgICAgaWYgbm90IG1hdGNoIG9yIGJhc2VbJ25hbWUnXSBpbiBtYXRjaDoKLSAgICAgICAgICBwbGF0Zm9ybXMgPSBjb25mLmdldCgncGxhdGZvcm1zJykgb3IgYmFzZS5nZXQoJ3BsYXRmb3JtcycpCi0gICAgICAgICAgaWYgbm90IHBsYXRmb3JtcyBvciBwbGF0Zm9ybS5zeXN0ZW0oKSBpbiBwbGF0Zm9ybXM6Ci0gICAgICAgICAgICB5aWVsZCBtZXJnZV9kaWN0KGJhc2UsIGNvbmYpCisgICAgZGVmIHlpZWxkX3Rlc3RsaWJzKGJhc2VfY29uZmlncywgY29uZmlncywgbWF0Y2gpOgorICAgICAgICBmb3IgYmFzZSwgY29uZiBpbiB6aXAoYmFzZV9jb25maWdzLCBjb25maWdzKToKKyAgICAgICAgICAgIGlmIGNvbmY6CisgICAgICAgICAgICAgICAgaWYgbm90IG1hdGNoIG9yIGJhc2VbJ25hbWUnXSBpbiBtYXRjaDoKKyAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm1zID0gY29uZi5nZXQoJ3BsYXRmb3JtcycpIG9yIGJhc2UuZ2V0KCdwbGF0Zm9ybXMnKQorICAgICAgICAgICAgICAgICAgICBpZiBub3QgcGxhdGZvcm1zIG9yIHBsYXRmb3JtLnN5c3RlbSgpIGluIHBsYXRmb3JtczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIG1lcmdlX2RpY3QoYmFzZSwgY29uZikKIAotICBsaWJzLCBzdnMsIGNscyA9IHppcCgqZXhwYW5kX2xpYnMoY29uZmlnKSkKLSAgc2VydmVycyA9IGxpc3QoeWllbGRfdGVzdGxpYnMobGlicywgc3ZzLCBzZXJ2ZXJfbWF0Y2gpKQotICBjbGllbnRzID0gbGlzdCh5aWVsZF90ZXN0bGlicyhsaWJzLCBjbHMsIGNsaWVudF9tYXRjaCkpCi0gIHJldHVybiBzZXJ2ZXJzLCBjbGllbnRzCisgICAgbGlicywgc3ZzLCBjbHMgPSB6aXAoKmV4cGFuZF9saWJzKGNvbmZpZykpCisgICAgc2VydmVycyA9IGxpc3QoeWllbGRfdGVzdGxpYnMobGlicywgc3ZzLCBzZXJ2ZXJfbWF0Y2gpKQorICAgIGNsaWVudHMgPSBsaXN0KHlpZWxkX3Rlc3RsaWJzKGxpYnMsIGNscywgY2xpZW50X21hdGNoKSkKKyAgICByZXR1cm4gc2VydmVycywgY2xpZW50cwogCiAKLWRlZiBkb19jb2xsZWN0X3Rlc3RzKHNlcnZlcnMsIGNsaWVudHMpOgotICBkZWYgaW50ZXJzZWN0aW9uKGtleSwgbzEsIG8yKToKLSAgICAiIiJpbnRlcnNlY3Rpb24gb2YgdHdvIGNvbGxlY3Rpb25zLgotICAgIGNvbGxlY3Rpb25zIGFyZSByZXBsYWNlZCB3aXRoIHNldHMgdGhlIGZpcnN0IHRpbWUiIiIKLSAgICBkZWYgY2FjaGVkX3NldChvLCBrZXkpOgotICAgICAgdiA9IG9ba2V5XQotICAgICAgaWYgbm90IGlzaW5zdGFuY2Uodiwgc2V0KToKLSAgICAgICAgdiA9IHNldCh2KQotICAgICAgICBvW2tleV0gPSB2Ci0gICAgICByZXR1cm4gdgotICAgIHJldHVybiBjYWNoZWRfc2V0KG8xLCBrZXkpICYgY2FjaGVkX3NldChvMiwga2V5KQotCi0gIGRlZiBpbnRlcnNlY3Rfd2l0aF9zcGVjKGtleSwgbzEsIG8yKToKLSAgICAjIHN0b3JlIGFzIHNldCBvZiAoc3BlYywgaW1wbCkgdHVwbGUKLSAgICBkZWYgY2FjaGVkX3NldChvKToKLSAgICAgIGRlZiB0b19zcGVjX2ltcGxfdHVwbGVzKHZhbHVlcyk6Ci0gICAgICAgIGZvciB2IGluIHZhbHVlczoKLSAgICAgICAgICBzcGVjLCBfLCBpbXBsID0gdi5wYXJ0aXRpb24oJzonKQotICAgICAgICAgIHlpZWxkIHNwZWMsIGltcGwgb3Igc3BlYwotICAgICAgdiA9IG9ba2V5XQotICAgICAgaWYgbm90IGlzaW5zdGFuY2Uodiwgc2V0KToKLSAgICAgICAgdiA9IHNldCh0b19zcGVjX2ltcGxfdHVwbGVzKHNldCh2KSkpCi0gICAgICAgIG9ba2V5XSA9IHYKLSAgICAgIHJldHVybiB2Ci0gICAgZm9yIHNwZWMxLCBpbXBsMSBpbiBjYWNoZWRfc2V0KG8xKToKLSAgICAgIGZvciBzcGVjMiwgaW1wbDIgaW4gY2FjaGVkX3NldChvMik6Ci0gICAgICAgIGlmIHNwZWMxID09IHNwZWMyOgotICAgICAgICAgIG5hbWUgPSBpbXBsMSBpZiBpbXBsMSA9PSBpbXBsMiBlbHNlICclcy0lcycgJSAoaW1wbDEsIGltcGwyKQotICAgICAgICAgIHlpZWxkIG5hbWUsIGltcGwxLCBpbXBsMgotCi0gIGRlZiBtYXliZV9tYXgoa2V5LCBvMSwgbzIsIGRlZmF1bHQpOgotICAgICIiIm1heGltdW0gb2YgdHdvIGlmIHByZXNlbnQsIG90aGVyd2lzZSBkZWZ1bHQgdmFsdWUiIiIKLSAgICB2MSA9IG8xLmdldChrZXkpCi0gICAgdjIgPSBvMi5nZXQoa2V5KQotICAgIHJldHVybiBtYXgodjEsIHYyKSBpZiB2MSBhbmQgdjIgZWxzZSB2MSBvciB2MiBvciBkZWZhdWx0Ci0KLSAgZGVmIGZpbHRlcl93aXRoX3ZhbGlka2V5cyhvKToKLSAgICByZXQgPSB7fQotICAgIGZvciBrZXkgaW4gVkFMSURfSlNPTl9LRVlTOgotICAgICAgaWYga2V5IGluIG86Ci0gICAgICAgIHJldFtrZXldID0gb1trZXldCi0gICAgcmV0dXJuIHJldAotCi0gIGRlZiBtZXJnZV9tZXRhZGF0YShvLCAqKnJldCk6Ci0gICAgZm9yIGtleSBpbiBWQUxJRF9KU09OX0tFWVM6Ci0gICAgICBpZiBrZXkgaW4gbzoKLSAgICAgICAgcmV0W2tleV0gPSBvW2tleV0KLSAgICByZXR1cm4gcmV0Ci0KLSAgZm9yIHN2LCBjbCBpbiBwcm9kdWN0KHNlcnZlcnMsIGNsaWVudHMpOgotICAgIGZvciBwcm90bywgcHJvdG8xLCBwcm90bzIgaW4gaW50ZXJzZWN0X3dpdGhfc3BlYygncHJvdG9jb2xzJywgc3YsIGNsKToKLSAgICAgIGZvciB0cmFucywgdHJhbnMxLCB0cmFuczIgaW4gaW50ZXJzZWN0X3dpdGhfc3BlYygndHJhbnNwb3J0cycsIHN2LCBjbCk6Ci0gICAgICAgIGZvciBzb2NrIGluIGludGVyc2VjdGlvbignc29ja2V0cycsIHN2LCBjbCk6Ci0gICAgICAgICAgeWllbGQgewotICAgICAgICAgICAgJ3NlcnZlcic6IG1lcmdlX21ldGFkYXRhKHN2LCAqKnsncHJvdG9jb2wnOiBwcm90bzEsICd0cmFuc3BvcnQnOiB0cmFuczF9KSwKLSAgICAgICAgICAgICdjbGllbnQnOiBtZXJnZV9tZXRhZGF0YShjbCwgKip7J3Byb3RvY29sJzogcHJvdG8yLCAndHJhbnNwb3J0JzogdHJhbnMyfSksCi0gICAgICAgICAgICAnZGVsYXknOiBtYXliZV9tYXgoJ2RlbGF5Jywgc3YsIGNsLCBERUZBVUxUX0RFTEFZKSwKLSAgICAgICAgICAgICd0aW1lb3V0JzogbWF5YmVfbWF4KCd0aW1lb3V0Jywgc3YsIGNsLCBERUZBVUxUX1RJTUVPVVQpLAotICAgICAgICAgICAgJ3Byb3RvY29sJzogcHJvdG8sCi0gICAgICAgICAgICAndHJhbnNwb3J0JzogdHJhbnMsCi0gICAgICAgICAgICAnc29ja2V0Jzogc29jawotICAgICAgICAgIH0KK2RlZiBjb2xsZWN0X2ZlYXR1cmVzKGNvbmZpZywgbWF0Y2gpOgorICAgIHJlcyA9IGxpc3QobWFwKHJlLmNvbXBpbGUsIG1hdGNoKSkKKyAgICByZXR1cm4gbGlzdChmaWx0ZXIobGFtYmRhIGM6IGFueShtYXAobGFtYmRhIHI6IHIuc2VhcmNoKGNbJ25hbWUnXSksIHJlcykpLCBjb25maWcpKQogCiAKLWRlZiBjb2xsZWN0X3Rlc3RzKHRlc3RzX2RpY3QsIHNlcnZlcl9tYXRjaCwgY2xpZW50X21hdGNoKToKLSAgc3YsIGNsID0gY29sbGVjdF90ZXN0bGlicyh0ZXN0c19kaWN0LCBzZXJ2ZXJfbWF0Y2gsIGNsaWVudF9tYXRjaCkKLSAgcmV0dXJuIGxpc3QoZG9fY29sbGVjdF90ZXN0cyhzdiwgY2wpKQorZGVmIF9kb19jb2xsZWN0X3Rlc3RzKHNlcnZlcnMsIGNsaWVudHMpOgorICAgIGRlZiBpbnRlcnNlY3Rpb24oa2V5LCBvMSwgbzIpOgorICAgICAgICAiIiJpbnRlcnNlY3Rpb24gb2YgdHdvIGNvbGxlY3Rpb25zLgorICAgICAgICBjb2xsZWN0aW9ucyBhcmUgcmVwbGFjZWQgd2l0aCBzZXRzIHRoZSBmaXJzdCB0aW1lIiIiCisgICAgICAgIGRlZiBjYWNoZWRfc2V0KG8sIGtleSk6CisgICAgICAgICAgICB2ID0gb1trZXldCisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh2LCBzZXQpOgorICAgICAgICAgICAgICAgIHYgPSBzZXQodikKKyAgICAgICAgICAgICAgICBvW2tleV0gPSB2CisgICAgICAgICAgICByZXR1cm4gdgorICAgICAgICByZXR1cm4gY2FjaGVkX3NldChvMSwga2V5KSAmIGNhY2hlZF9zZXQobzIsIGtleSkKKworICAgIGRlZiBpbnRlcnNlY3Rfd2l0aF9zcGVjKGtleSwgbzEsIG8yKToKKyAgICAgICAgIyBzdG9yZSBhcyBzZXQgb2YgKHNwZWMsIGltcGwpIHR1cGxlCisgICAgICAgIGRlZiBjYWNoZWRfc2V0KG8pOgorICAgICAgICAgICAgZGVmIHRvX3NwZWNfaW1wbF90dXBsZXModmFsdWVzKToKKyAgICAgICAgICAgICAgICBmb3IgdiBpbiB2YWx1ZXM6CisgICAgICAgICAgICAgICAgICAgIHNwZWMsIF8sIGltcGwgPSB2LnBhcnRpdGlvbignOicpCisgICAgICAgICAgICAgICAgICAgIHlpZWxkIHNwZWMsIGltcGwgb3Igc3BlYworICAgICAgICAgICAgdiA9IG9ba2V5XQorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uodiwgc2V0KToKKyAgICAgICAgICAgICAgICB2ID0gc2V0KHRvX3NwZWNfaW1wbF90dXBsZXMoc2V0KHYpKSkKKyAgICAgICAgICAgICAgICBvW2tleV0gPSB2CisgICAgICAgICAgICByZXR1cm4gdgorICAgICAgICBmb3Igc3BlYzEsIGltcGwxIGluIGNhY2hlZF9zZXQobzEpOgorICAgICAgICAgICAgZm9yIHNwZWMyLCBpbXBsMiBpbiBjYWNoZWRfc2V0KG8yKToKKyAgICAgICAgICAgICAgICBpZiBzcGVjMSA9PSBzcGVjMjoKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGltcGwxIGlmIGltcGwxID09IGltcGwyIGVsc2UgJyVzLSVzJyAlIChpbXBsMSwgaW1wbDIpCisgICAgICAgICAgICAgICAgICAgIHlpZWxkIG5hbWUsIGltcGwxLCBpbXBsMgorCisgICAgZGVmIG1heWJlX21heChrZXksIG8xLCBvMiwgZGVmYXVsdCk6CisgICAgICAgICIiIm1heGltdW0gb2YgdHdvIGlmIHByZXNlbnQsIG90aGVyd2lzZSBkZWZhdWx0IHZhbHVlIiIiCisgICAgICAgIHYxID0gbzEuZ2V0KGtleSkKKyAgICAgICAgdjIgPSBvMi5nZXQoa2V5KQorICAgICAgICByZXR1cm4gbWF4KHYxLCB2MikgaWYgdjEgYW5kIHYyIGVsc2UgdjEgb3IgdjIgb3IgZGVmYXVsdAorCisgICAgZGVmIGZpbHRlcl93aXRoX3ZhbGlka2V5cyhvKToKKyAgICAgICAgcmV0ID0ge30KKyAgICAgICAgZm9yIGtleSBpbiBWQUxJRF9KU09OX0tFWVM6CisgICAgICAgICAgICBpZiBrZXkgaW4gbzoKKyAgICAgICAgICAgICAgICByZXRba2V5XSA9IG9ba2V5XQorICAgICAgICByZXR1cm4gcmV0CisKKyAgICBkZWYgbWVyZ2VfbWV0YWRhdGEobywgKipyZXQpOgorICAgICAgICBmb3Iga2V5IGluIFZBTElEX0pTT05fS0VZUzoKKyAgICAgICAgICAgIGlmIGtleSBpbiBvOgorICAgICAgICAgICAgICAgIHJldFtrZXldID0gb1trZXldCisgICAgICAgIHJldHVybiByZXQKKworICAgIGZvciBzdiwgY2wgaW4gcHJvZHVjdChzZXJ2ZXJzLCBjbGllbnRzKToKKyAgICAgICAgZm9yIHByb3RvLCBwcm90bzEsIHByb3RvMiBpbiBpbnRlcnNlY3Rfd2l0aF9zcGVjKCdwcm90b2NvbHMnLCBzdiwgY2wpOgorICAgICAgICAgICAgZm9yIHRyYW5zLCB0cmFuczEsIHRyYW5zMiBpbiBpbnRlcnNlY3Rfd2l0aF9zcGVjKCd0cmFuc3BvcnRzJywgc3YsIGNsKToKKyAgICAgICAgICAgICAgICBmb3Igc29jayBpbiBpbnRlcnNlY3Rpb24oJ3NvY2tldHMnLCBzdiwgY2wpOgorICAgICAgICAgICAgICAgICAgICB5aWVsZCB7CisgICAgICAgICAgICAgICAgICAgICAgICAnc2VydmVyJzogbWVyZ2VfbWV0YWRhdGEoc3YsICoqeydwcm90b2NvbCc6IHByb3RvMSwgJ3RyYW5zcG9ydCc6IHRyYW5zMX0pLAorICAgICAgICAgICAgICAgICAgICAgICAgJ2NsaWVudCc6IG1lcmdlX21ldGFkYXRhKGNsLCAqKnsncHJvdG9jb2wnOiBwcm90bzIsICd0cmFuc3BvcnQnOiB0cmFuczJ9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdkZWxheSc6IG1heWJlX21heCgnZGVsYXknLCBzdiwgY2wsIERFRkFVTFRfTUFYX0RFTEFZKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdzdG9wX3NpZ25hbCc6IG1heWJlX21heCgnc3RvcF9zaWduYWwnLCBzdiwgY2wsIERFRkFVTFRfU0lHTkFMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICd0aW1lb3V0JzogbWF5YmVfbWF4KCd0aW1lb3V0Jywgc3YsIGNsLCBERUZBVUxUX1RJTUVPVVQpLAorICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb3RvY29sJzogcHJvdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAndHJhbnNwb3J0JzogdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAnc29ja2V0Jzogc29jaworICAgICAgICAgICAgICAgICAgICB9CisKKworZGVmIF9maWx0ZXJfZW50cmllcyh0ZXN0cywgcmVnZXgpOgorICAgIGlmIHJlZ2V4OgorICAgICAgICByZXR1cm4gZmlsdGVyKGxhbWJkYSB0OiByZS5zZWFyY2gocmVnZXgsIFRlc3RFbnRyeS5nZXRfbmFtZSgqKnQpKSwgdGVzdHMpCisgICAgcmV0dXJuIHRlc3RzCisKKworZGVmIGNvbGxlY3RfY3Jvc3NfdGVzdHModGVzdHNfZGljdCwgc2VydmVyX21hdGNoLCBjbGllbnRfbWF0Y2gsIHJlZ2V4KToKKyAgICBzdiwgY2wgPSBfY29sbGVjdF90ZXN0bGlicyh0ZXN0c19kaWN0LCBzZXJ2ZXJfbWF0Y2gsIGNsaWVudF9tYXRjaCkKKyAgICByZXR1cm4gbGlzdChfZmlsdGVyX2VudHJpZXMoX2RvX2NvbGxlY3RfdGVzdHMoc3YsIGNsKSwgcmVnZXgpKQorCisKK2RlZiBjb2xsZWN0X2ZlYXR1cmVfdGVzdHModGVzdHNfZGljdCwgZmVhdHVyZXNfZGljdCwgc2VydmVyX21hdGNoLCBmZWF0dXJlX21hdGNoLCByZWdleCk6CisgICAgc3YsIF8gPSBfY29sbGVjdF90ZXN0bGlicyh0ZXN0c19kaWN0LCBzZXJ2ZXJfbWF0Y2gpCisgICAgZnQgPSBjb2xsZWN0X2ZlYXR1cmVzKGZlYXR1cmVzX2RpY3QsIGZlYXR1cmVfbWF0Y2gpCisgICAgcmV0dXJuIGxpc3QoX2ZpbHRlcl9lbnRyaWVzKF9kb19jb2xsZWN0X3Rlc3RzKHN2LCBmdCksIHJlZ2V4KSkKZGlmZiAtLWdpdCBhL3Rlc3QvY3Jvc3NydW5uZXIvY29tcGF0LnB5IGIvdGVzdC9jcm9zc3J1bm5lci9jb21wYXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFjYTkxYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY3Jvc3NydW5uZXIvY29tcGF0LnB5CkBAIC0wLDAgKzEsMjQgQEAKK2ltcG9ydCBvcworaW1wb3J0IHN5cworCitpZiBzeXMudmVyc2lvbl9pbmZvWzBdID09IDI6CisgICAgX0VOQ09ERSA9IHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKQorCisgICAgZGVmIHBhdGhfam9pbigqYXJncyk6CisgICAgICAgIGJpbl9hcmdzID0gbWFwKGxhbWJkYSBhOiBhLmRlY29kZShfRU5DT0RFKSwgYXJncykKKyAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbigqYmluX2FyZ3MpLmVuY29kZShfRU5DT0RFKQorCisgICAgZGVmIHN0cl9qb2luKHMsIGwpOgorICAgICAgICBiaW5fYXJncyA9IG1hcChsYW1iZGEgYTogYS5kZWNvZGUoX0VOQ09ERSksIGwpCisgICAgICAgIGIgPSBzLmRlY29kZShfRU5DT0RFKQorICAgICAgICByZXR1cm4gYi5qb2luKGJpbl9hcmdzKS5lbmNvZGUoX0VOQ09ERSkKKworICAgIGxvZ2ZpbGVfb3BlbiA9IG9wZW4KKworZWxzZToKKworICAgIHBhdGhfam9pbiA9IG9zLnBhdGguam9pbgorICAgIHN0cl9qb2luID0gc3RyLmpvaW4KKworICAgIGRlZiBsb2dmaWxlX29wZW4oKmFyZ3MpOgorICAgICAgICByZXR1cm4gb3BlbigqYXJncywgZXJyb3JzPSdyZXBsYWNlJykKZGlmZiAtLWdpdCBhL3Rlc3QvY3Jvc3NydW5uZXIvcHJlcGFyZS5weSBiL3Rlc3QvY3Jvc3NydW5uZXIvcHJlcGFyZS5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU0ZjZlZS4uMDAwMDAwMAotLS0gYS90ZXN0L2Nyb3NzcnVubmVyL3ByZXBhcmUucHkKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotaW1wb3J0IG9zCi1pbXBvcnQgc3VicHJvY2VzcwotCi1mcm9tIGNyb3NzcnVubmVyLmNvbGxlY3QgaW1wb3J0IGNvbGxlY3RfdGVzdGxpYnMKLQotCi1kZWYgcHJlcGFyZShjb25maWdfZGljdCwgdGVzdGRpciwgc2VydmVyX21hdGNoLCBjbGllbnRfbWF0Y2gpOgotICBsaWJzLCBsaWJzMiA9IGNvbGxlY3RfdGVzdGxpYnMoY29uZmlnX2RpY3QsIHNlcnZlcl9tYXRjaCwgY2xpZW50X21hdGNoKQotICBsaWJzLmV4dGVuZChsaWJzMikKLQotICBkZWYgcHJlcGFyZXMoKToKLSAgICBmb3IgbGliIGluIGxpYnM6Ci0gICAgICBwcmUgPSBsaWIuZ2V0KCdwcmVwYXJlJykKLSAgICAgIGlmIHByZToKLSAgICAgICAgeWllbGQgcHJlLCBsaWJbJ3dvcmtkaXInXQotCi0gIGRlZiBmaWxlcygpOgotICAgIGZvciBsaWIgaW4gbGliczoKLSAgICAgIHdvcmtkaXIgPSBvcy5wYXRoLmpvaW4odGVzdGRpciwgbGliWyd3b3JrZGlyJ10pCi0gICAgICBmb3IgYyBpbiBsaWJbJ2NvbW1hbmQnXToKLSAgICAgICAgaWYgbm90IGMuc3RhcnRzd2l0aCgnLScpOgotICAgICAgICAgIHAgPSBvcy5wYXRoLmpvaW4od29ya2RpciwgYykKLSAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMocCk6Ci0gICAgICAgICAgICB5aWVsZCBvcy5wYXRoLnNwbGl0KHApCi0KLSAgZGVmIG1ha2UocCk6Ci0gICAgZCwgZiA9IHAKLSAgICB3aXRoIG9wZW4ob3MuZGV2bnVsbCwgJ3cnKSBhcyBkZXZudWxsOgotICAgICAgcmV0dXJuIHN1YnByb2Nlc3MuUG9wZW4oWydtYWtlJywgZl0sIGN3ZD1kLCBzdGRlcnI9ZGV2bnVsbCkKLQotICBmb3IgcHJlLCBkIGluIHByZXBhcmVzKCk6Ci0gICAgc3VicHJvY2Vzcy5Qb3BlbihwcmUsIGN3ZD1kKS53YWl0KCkKLQotICBmb3IgcCBpbiBsaXN0KG1hcChtYWtlLCBzZXQoZmlsZXMoKSkpKToKLSAgICBwLndhaXQoKQotICByZXR1cm4gVHJ1ZQpkaWZmIC0tZ2l0IGEvdGVzdC9jcm9zc3J1bm5lci9yZXBvcnQucHkgYi90ZXN0L2Nyb3NzcnVubmVyL3JlcG9ydC5weQppbmRleCBhMjg0ZDJiLi41YmFmMTYxIDEwMDY0NAotLS0gYS90ZXN0L2Nyb3NzcnVubmVyL3JlcG9ydC5weQorKysgYi90ZXN0L2Nyb3NzcnVubmVyL3JlcG9ydC5weQpAQCAtMTcsNiArMTcsNyBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgogaW1wb3J0IGRhdGV0aW1lCiBpbXBvcnQganNvbgogaW1wb3J0IG11bHRpcHJvY2Vzc2luZwpAQCAtMjgsMzc4ICsyOSw0MTMgQEAKIGltcG9ydCB0aW1lCiBpbXBvcnQgdHJhY2ViYWNrCiAKLWZyb20gY3Jvc3NydW5uZXIudGVzdCBpbXBvcnQgVGVzdEVudHJ5Citmcm9tIC5jb21wYXQgaW1wb3J0IGxvZ2ZpbGVfb3BlbiwgcGF0aF9qb2luLCBzdHJfam9pbgorZnJvbSAudGVzdCBpbXBvcnQgVGVzdEVudHJ5CiAKIExPR19ESVIgPSAnbG9nJwotUkVTVUxUX0hUTUwgPSAncmVzdWx0Lmh0bWwnCitSRVNVTFRfSFRNTCA9ICdpbmRleC5odG1sJwogUkVTVUxUX0pTT04gPSAncmVzdWx0cy5qc29uJwogRkFJTF9KU09OID0gJ2tub3duX2ZhaWx1cmVzXyVzLmpzb24nCiAKIAogZGVmIGdlbmVyYXRlX2tub3duX2ZhaWx1cmVzKHRlc3RkaXIsIG92ZXJ3cml0ZSwgc2F2ZSwgb3V0KToKLSAgZGVmIGNvbGxlY3RfZmFpbHVyZXMocmVzdWx0cyk6Ci0gICAgc3VjY2Vzc19pbmRleCA9IDUKLSAgICBmb3IgciBpbiByZXN1bHRzOgotICAgICAgaWYgbm90IHJbc3VjY2Vzc19pbmRleF06Ci0gICAgICAgIHlpZWxkIFRlc3RFbnRyeS5nZXRfbmFtZSgqcikKLSAgdHJ5OgotICAgIHdpdGggb3Blbihvcy5wYXRoLmpvaW4odGVzdGRpciwgUkVTVUxUX0pTT04pLCAncicpIGFzIGZwOgotICAgICAgcmVzdWx0cyA9IGpzb24ubG9hZChmcCkKLSAgZXhjZXB0IElPRXJyb3I6Ci0gICAgc3lzLnN0ZGVyci53cml0ZSgnVW5hYmxlIHRvIGxvYWQgbGFzdCByZXN1bHQuIERpZCB5b3UgcnVuIHRlc3RzID9cbicpCi0gICAgcmV0dXJuIEZhbHNlCi0gIGZhaWxzID0gY29sbGVjdF9mYWlsdXJlcyhyZXN1bHRzWydyZXN1bHRzJ10pCi0gIGlmIG5vdCBvdmVyd3JpdGU6Ci0gICAga25vd24gPSBsb2FkX2tub3duX2ZhaWx1cmVzKHRlc3RkaXIpCi0gICAga25vd24uZXh0ZW5kKGZhaWxzKQotICAgIGZhaWxzID0ga25vd24KLSAgZmFpbHNfanNvbiA9IGpzb24uZHVtcHMoc29ydGVkKHNldChmYWlscykpLCBpbmRlbnQ9Miwgc2VwYXJhdG9ycz0oJywnLCAnOiAnKSkKLSAgaWYgc2F2ZToKLSAgICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKHRlc3RkaXIsIEZBSUxfSlNPTiAlIHBsYXRmb3JtLnN5c3RlbSgpKSwgJ3crJykgYXMgZnA6Ci0gICAgICBmcC53cml0ZShmYWlsc19qc29uKQotICAgIHN5cy5zdGRvdXQud3JpdGUoJ1N1Y2Nlc3NmdWxseSB1cGRhdGVkIGtub3duIGZhaWx1cmVzLlxuJykKLSAgaWYgb3V0OgotICAgIHN5cy5zdGRvdXQud3JpdGUoZmFpbHNfanNvbikKLSAgICBzeXMuc3Rkb3V0LndyaXRlKCdcbicpCi0gIHJldHVybiBUcnVlCisgICAgZGVmIGNvbGxlY3RfZmFpbHVyZXMocmVzdWx0cyk6CisgICAgICAgIHN1Y2Nlc3NfaW5kZXggPSA1CisgICAgICAgIGZvciByIGluIHJlc3VsdHM6CisgICAgICAgICAgICBpZiBub3QgcltzdWNjZXNzX2luZGV4XToKKyAgICAgICAgICAgICAgICB5aWVsZCBUZXN0RW50cnkuZ2V0X25hbWUoKnIpCisgICAgdHJ5OgorICAgICAgICB3aXRoIGxvZ2ZpbGVfb3BlbihwYXRoX2pvaW4odGVzdGRpciwgUkVTVUxUX0pTT04pLCAncicpIGFzIGZwOgorICAgICAgICAgICAgcmVzdWx0cyA9IGpzb24ubG9hZChmcCkKKyAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgnVW5hYmxlIHRvIGxvYWQgbGFzdCByZXN1bHQuIERpZCB5b3UgcnVuIHRlc3RzID9cbicpCisgICAgICAgIHJldHVybiBGYWxzZQorICAgIGZhaWxzID0gY29sbGVjdF9mYWlsdXJlcyhyZXN1bHRzWydyZXN1bHRzJ10pCisgICAgaWYgbm90IG92ZXJ3cml0ZToKKyAgICAgICAga25vd24gPSBsb2FkX2tub3duX2ZhaWx1cmVzKHRlc3RkaXIpCisgICAgICAgIGtub3duLmV4dGVuZChmYWlscykKKyAgICAgICAgZmFpbHMgPSBrbm93bgorICAgIGZhaWxzX2pzb24gPSBqc29uLmR1bXBzKHNvcnRlZChzZXQoZmFpbHMpKSwgaW5kZW50PTIsIHNlcGFyYXRvcnM9KCcsJywgJzogJykpCisgICAgaWYgc2F2ZToKKyAgICAgICAgd2l0aCBsb2dmaWxlX29wZW4ob3MucGF0aC5qb2luKHRlc3RkaXIsIEZBSUxfSlNPTiAlIHBsYXRmb3JtLnN5c3RlbSgpKSwgJ3crJykgYXMgZnA6CisgICAgICAgICAgICBmcC53cml0ZShmYWlsc19qc29uKQorICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCdTdWNjZXNzZnVsbHkgdXBkYXRlZCBrbm93biBmYWlsdXJlcy5cbicpCisgICAgaWYgb3V0OgorICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKGZhaWxzX2pzb24pCisgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoJ1xuJykKKyAgICByZXR1cm4gVHJ1ZQogCiAKIGRlZiBsb2FkX2tub3duX2ZhaWx1cmVzKHRlc3RkaXIpOgotICB0cnk6Ci0gICAgd2l0aCBvcGVuKG9zLnBhdGguam9pbih0ZXN0ZGlyLCBGQUlMX0pTT04gJSBwbGF0Zm9ybS5zeXN0ZW0oKSksICdyJykgYXMgZnA6Ci0gICAgICByZXR1cm4ganNvbi5sb2FkKGZwKQotICBleGNlcHQgSU9FcnJvcjoKLSAgICByZXR1cm4gW10KKyAgICB0cnk6CisgICAgICAgIHdpdGggbG9nZmlsZV9vcGVuKHBhdGhfam9pbih0ZXN0ZGlyLCBGQUlMX0pTT04gJSBwbGF0Zm9ybS5zeXN0ZW0oKSksICdyJykgYXMgZnA6CisgICAgICAgICAgICByZXR1cm4ganNvbi5sb2FkKGZwKQorICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICByZXR1cm4gW10KIAogCiBjbGFzcyBUZXN0UmVwb3J0ZXIob2JqZWN0KToKLSAgIyBVbmZvcnR1bmF0ZWx5LCBzdGFuZGFyZCBsaWJyYXJ5IGRvZXNuJ3QgaGFuZGxlIHRpbWV6b25lIHdlbGwKLSAgIyBEQVRFVElNRV9GT1JNQVQgPSAnJWEgJWIgJWQgJUg6JU06JVMgJVogJVknCi0gIERBVEVUSU1FX0ZPUk1BVCA9ICclYSAlYiAlZCAlSDolTTolUyAlWScKKyAgICAjIFVuZm9ydHVuYXRlbHksIHN0YW5kYXJkIGxpYnJhcnkgZG9lc24ndCBoYW5kbGUgdGltZXpvbmUgd2VsbAorICAgICMgREFURVRJTUVfRk9STUFUID0gJyVhICViICVkICVIOiVNOiVTICVaICVZJworICAgIERBVEVUSU1FX0ZPUk1BVCA9ICclYSAlYiAlZCAlSDolTTolUyAlWScKIAotICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgc2VsZi5fbG9nID0gbXVsdGlwcm9jZXNzaW5nLmdldF9sb2dnZXIoKQotICAgIHNlbGYuX2xvY2sgPSBtdWx0aXByb2Nlc3NpbmcuTG9jaygpCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLl9sb2cgPSBtdWx0aXByb2Nlc3NpbmcuZ2V0X2xvZ2dlcigpCisgICAgICAgIHNlbGYuX2xvY2sgPSBtdWx0aXByb2Nlc3NpbmcuTG9jaygpCiAKLSAgQGNsYXNzbWV0aG9kCi0gIGRlZiB0ZXN0X2xvZ2ZpbGUoY2xzLCB0ZXN0X25hbWUsIHByb2dfa2luZCwgZGlyPU5vbmUpOgotICAgIHJlbHBhdGggPSBvcy5wYXRoLmpvaW4oJ2xvZycsICclc18lcy5sb2cnICUgKHRlc3RfbmFtZSwgcHJvZ19raW5kKSkKLSAgICByZXR1cm4gcmVscGF0aCBpZiBub3QgZGlyIGVsc2Ugb3MucGF0aC5yZWFscGF0aChvcy5wYXRoLmpvaW4oZGlyLCByZWxwYXRoKSkKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgdGVzdF9sb2dmaWxlKGNscywgdGVzdF9uYW1lLCBwcm9nX2tpbmQsIGRpcj1Ob25lKToKKyAgICAgICAgcmVscGF0aCA9IHBhdGhfam9pbignbG9nJywgJyVzXyVzLmxvZycgJSAodGVzdF9uYW1lLCBwcm9nX2tpbmQpKQorICAgICAgICByZXR1cm4gcmVscGF0aCBpZiBub3QgZGlyIGVsc2Ugb3MucGF0aC5yZWFscGF0aChwYXRoX2pvaW4oZGlyLCByZWxwYXRoKSkKIAotICBkZWYgX3N0YXJ0KHNlbGYpOgotICAgIHNlbGYuX3N0YXJ0X3RpbWUgPSB0aW1lLnRpbWUoKQorICAgIGRlZiBfc3RhcnQoc2VsZik6CisgICAgICAgIHNlbGYuX3N0YXJ0X3RpbWUgPSB0aW1lLnRpbWUoKQogCi0gIEBwcm9wZXJ0eQotICBkZWYgX2VsYXBzZWQoc2VsZik6Ci0gICAgcmV0dXJuIHRpbWUudGltZSgpIC0gc2VsZi5fc3RhcnRfdGltZQorICAgIEBwcm9wZXJ0eQorICAgIGRlZiBfZWxhcHNlZChzZWxmKToKKyAgICAgICAgcmV0dXJuIHRpbWUudGltZSgpIC0gc2VsZi5fc3RhcnRfdGltZQogCi0gIEBjbGFzc21ldGhvZAotICBkZWYgX2Zvcm1hdF9kYXRlKGNscyk6Ci0gICAgcmV0dXJuICclcycgJSBkYXRldGltZS5kYXRldGltZS5ub3coKS5zdHJmdGltZShjbHMuREFURVRJTUVfRk9STUFUKQorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBfZm9ybWF0X2RhdGUoY2xzKToKKyAgICAgICAgcmV0dXJuICclcycgJSBkYXRldGltZS5kYXRldGltZS5ub3coKS5zdHJmdGltZShjbHMuREFURVRJTUVfRk9STUFUKQogCi0gIGRlZiBfcHJpbnRfZGF0ZShzZWxmKToKLSAgICBzZWxmLm91dC53cml0ZSgnJXNcbicgJSBzZWxmLl9mb3JtYXRfZGF0ZSgpKQorICAgIGRlZiBfcHJpbnRfZGF0ZShzZWxmKToKKyAgICAgICAgcHJpbnQoc2VsZi5fZm9ybWF0X2RhdGUoKSwgZmlsZT1zZWxmLm91dCkKIAotICBkZWYgX3ByaW50X2JhcihzZWxmLCBvdXQ9Tm9uZSk6Ci0gICAgKG91dCBvciBzZWxmLm91dCkud3JpdGUoCi0gICAgICAnPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuJykKKyAgICBkZWYgX3ByaW50X2JhcihzZWxmLCBvdXQ9Tm9uZSk6CisgICAgICAgIHByaW50KAorICAgICAgICAgICAgJz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0nLAorICAgICAgICAgICAgZmlsZT0ob3V0IG9yIHNlbGYub3V0KSkKIAotICBkZWYgX3ByaW50X2V4ZWNfdGltZShzZWxmKToKLSAgICBzZWxmLm91dC53cml0ZSgnVGVzdCBleGVjdXRpb24gdG9vayB7Oi4xZn0gc2Vjb25kcy5cbicuZm9ybWF0KHNlbGYuX2VsYXBzZWQpKQorICAgIGRlZiBfcHJpbnRfZXhlY190aW1lKHNlbGYpOgorICAgICAgICBwcmludCgnVGVzdCBleGVjdXRpb24gdG9vayB7Oi4xZn0gc2Vjb25kcy4nLmZvcm1hdChzZWxmLl9lbGFwc2VkKSwgZmlsZT1zZWxmLm91dCkKIAogCiBjbGFzcyBFeGVjUmVwb3J0ZXIoVGVzdFJlcG9ydGVyKToKLSAgZGVmIF9faW5pdF9fKHNlbGYsIHRlc3RkaXIsIHRlc3QsIHByb2cpOgotICAgIHN1cGVyKEV4ZWNSZXBvcnRlciwgc2VsZikuX19pbml0X18oKQotICAgIHNlbGYuX3Rlc3QgPSB0ZXN0Ci0gICAgc2VsZi5fcHJvZyA9IHByb2cKLSAgICBzZWxmLmxvZ3BhdGggPSBzZWxmLnRlc3RfbG9nZmlsZSh0ZXN0Lm5hbWUsIHByb2cua2luZCwgdGVzdGRpcikKLSAgICBzZWxmLm91dCA9IE5vbmUKLQotICBkZWYgYmVnaW4oc2VsZik6Ci0gICAgc2VsZi5fc3RhcnQoKQotICAgIHNlbGYuX29wZW4oKQotICAgIGlmIHNlbGYub3V0IGFuZCBub3Qgc2VsZi5vdXQuY2xvc2VkOgotICAgICAgc2VsZi5fcHJpbnRfaGVhZGVyKCkKLSAgICBlbHNlOgotICAgICAgc2VsZi5fbG9nLmRlYnVnKCdPdXRwdXQgc3RyZWFtIGlzIG5vdCBhdmFpbGFibGUuJykKLQotICBkZWYgZW5kKHNlbGYsIHJldHVybmNvZGUpOgotICAgIHNlbGYuX2xvY2suYWNxdWlyZSgpCi0gICAgdHJ5OgotICAgICAgaWYgc2VsZi5vdXQgYW5kIG5vdCBzZWxmLm91dC5jbG9zZWQ6Ci0gICAgICAgIHNlbGYuX3ByaW50X2Zvb3RlcihyZXR1cm5jb2RlKQotICAgICAgICBzZWxmLl9jbG9zZSgpCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRlc3RkaXIsIHRlc3QsIHByb2cpOgorICAgICAgICBzdXBlcihFeGVjUmVwb3J0ZXIsIHNlbGYpLl9faW5pdF9fKCkKKyAgICAgICAgc2VsZi5fdGVzdCA9IHRlc3QKKyAgICAgICAgc2VsZi5fcHJvZyA9IHByb2cKKyAgICAgICAgc2VsZi5sb2dwYXRoID0gc2VsZi50ZXN0X2xvZ2ZpbGUodGVzdC5uYW1lLCBwcm9nLmtpbmQsIHRlc3RkaXIpCiAgICAgICAgIHNlbGYub3V0ID0gTm9uZQotICAgICAgZWxzZToKLSAgICAgICAgc2VsZi5fbG9nLmRlYnVnKCdPdXRwdXQgc3RyZWFtIGlzIG5vdCBhdmFpbGFibGUuJykKLSAgICBmaW5hbGx5OgotICAgICAgc2VsZi5fbG9jay5yZWxlYXNlKCkKIAotICBkZWYga2lsbGVkKHNlbGYpOgotICAgIHNlbGYuX2xvY2suYWNxdWlyZSgpCi0gICAgdHJ5OgotICAgICAgaWYgc2VsZi5vdXQgYW5kIG5vdCBzZWxmLm91dC5jbG9zZWQ6Ci0gICAgICAgIHNlbGYuX3ByaW50X2Zvb3RlcigpCi0gICAgICAgIHNlbGYuX2Nsb3NlKCkKLSAgICAgICAgc2VsZi5vdXQgPSBOb25lCi0gICAgICBlbHNlOgotICAgICAgICBzZWxmLl9sb2cuZGVidWcoJ091dHB1dCBzdHJlYW0gaXMgbm90IGF2YWlsYWJsZS4nKQotICAgIGZpbmFsbHk6Ci0gICAgICBzZWxmLl9sb2NrLnJlbGVhc2UoKQorICAgIGRlZiBiZWdpbihzZWxmKToKKyAgICAgICAgc2VsZi5fc3RhcnQoKQorICAgICAgICBzZWxmLl9vcGVuKCkKKyAgICAgICAgaWYgc2VsZi5vdXQgYW5kIG5vdCBzZWxmLm91dC5jbG9zZWQ6CisgICAgICAgICAgICBzZWxmLl9wcmludF9oZWFkZXIoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fbG9nLmRlYnVnKCdPdXRwdXQgc3RyZWFtIGlzIG5vdCBhdmFpbGFibGUuJykKIAotICBfaW5pdF9mYWlsdXJlX2V4cHJzID0gewotICAgICdzZXJ2ZXInOiBsaXN0KG1hcChyZS5jb21waWxlLCBbCi0gICAgICAnW0FhXWRkcmVzcyBhbHJlYWR5IGluIHVzZScsCi0gICAgICAnQ291bGQgbm90IGJpbmQnLAotICAgICAgJ0VBRERSSU5VU0UnLAotICAgIF0pKSwKLSAgICAnY2xpZW50JzogbGlzdChtYXAocmUuY29tcGlsZSwgWwotICAgICAgJ1tDY11vbm5lY3Rpb24gcmVmdXNlZCcsCi0gICAgICAnQ291bGQgbm90IGNvbm5lY3QgdG8gbG9jYWxob3N0JywKLSAgICAgICdFQ09OTlJFRlVTRUQnLAotICAgICAgJ05vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnknLCAgIyBkb21haW4gc29ja2V0Ci0gICAgXSkpLAotICB9CisgICAgZGVmIGVuZChzZWxmLCByZXR1cm5jb2RlKToKKyAgICAgICAgc2VsZi5fbG9jay5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgc2VsZi5vdXQgYW5kIG5vdCBzZWxmLm91dC5jbG9zZWQ6CisgICAgICAgICAgICAgICAgc2VsZi5fcHJpbnRfZm9vdGVyKHJldHVybmNvZGUpCisgICAgICAgICAgICAgICAgc2VsZi5fY2xvc2UoKQorICAgICAgICAgICAgICAgIHNlbGYub3V0ID0gTm9uZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLl9sb2cuZGVidWcoJ091dHB1dCBzdHJlYW0gaXMgbm90IGF2YWlsYWJsZS4nKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5fbG9jay5yZWxlYXNlKCkKIAotICBkZWYgbWF5YmVfZmFsc2VfcG9zaXRpdmUoc2VsZik6Ci0gICAgIiIiU2VhcmNoZXMgdGhyb3VnaCBsb2cgZmlsZSBmb3Igc29ja2V0IGJpbmQgZXJyb3IuCi0gICAgUmV0dXJucyBUcnVlIGlmIHN1c3BpY2lvdXMgZXhwcmVzc2lvbiBpcyBmb3VuZCwgb3RoZXJ3aXNlIEZhbHNlIiIiCi0gICAgZGVmIG1hdGNoKGxpbmUpOgotICAgICAgZm9yIGV4cHIgaW4gZXhwcnM6Ci0gICAgICAgIGlmIGV4cHIuc2VhcmNoKGxpbmUpOgotICAgICAgICAgIHJldHVybiBUcnVlCi0gICAgdHJ5OgotICAgICAgaWYgc2VsZi5vdXQgYW5kIG5vdCBzZWxmLm91dC5jbG9zZWQ6CisgICAgZGVmIGtpbGxlZChzZWxmKToKKyAgICAgICAgcHJpbnQoZmlsZT1zZWxmLm91dCkKKyAgICAgICAgcHJpbnQoJ1NlcnZlciBwcm9jZXNzIGlzIHN1Y2Nlc3NmdWxseSBraWxsZWQuJywgZmlsZT1zZWxmLm91dCkKKyAgICAgICAgc2VsZi5lbmQoTm9uZSkKKworICAgIGRlZiBkaWVkKHNlbGYpOgorICAgICAgICBwcmludChmaWxlPXNlbGYub3V0KQorICAgICAgICBwcmludCgnKioqIFNlcnZlciBwcm9jZXNzIGhhcyBkaWVkIHVuZXhwZWN0ZWRseSAqKionLCBmaWxlPXNlbGYub3V0KQorICAgICAgICBzZWxmLmVuZChOb25lKQorCisgICAgX2luaXRfZmFpbHVyZV9leHBycyA9IHsKKyAgICAgICAgJ3NlcnZlcic6IGxpc3QobWFwKHJlLmNvbXBpbGUsIFsKKyAgICAgICAgICAgICdbQWFdZGRyZXNzIGFscmVhZHkgaW4gdXNlJywKKyAgICAgICAgICAgICdDb3VsZCBub3QgYmluZCcsCisgICAgICAgICAgICAnRUFERFJJTlVTRScsCisgICAgICAgIF0pKSwKKyAgICAgICAgJ2NsaWVudCc6IGxpc3QobWFwKHJlLmNvbXBpbGUsIFsKKyAgICAgICAgICAgICdbQ2Ndb25uZWN0aW9uIHJlZnVzZWQnLAorICAgICAgICAgICAgJ0NvdWxkIG5vdCBjb25uZWN0IHRvJywKKyAgICAgICAgICAgICdDb3VsZCBub3Qgb3BlbiBVTklYICcsICAgICAgICMgZG9tYWluIHNvY2tldCAocmIpCisgICAgICAgICAgICAnRUNPTk5SRUZVU0VEJywKKyAgICAgICAgICAgICdlY29ubnJlZnVzZWQnLCAgICAgICAgICAgICAgICMgZXJsCisgICAgICAgICAgICAnQ09OTkVDVElPTi1SRUZVU0VELUVSUk9SJywgICAjIGNsCisgICAgICAgICAgICAnY29ubmVjdCBFTk9FTlQnLCAgICAgICAgICAgICAjIG5vZGVqcyBkb21haW4gc29ja2V0CisgICAgICAgICAgICAnTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeScsICAjIGRvbWFpbiBzb2NrZXQKKyAgICAgICAgICAgICdTb2NrZXRzLlRjcENsaWVudC5Db25uZWN0JywgICMgY3NoYXJwCisgICAgICAgIF0pKSwKKyAgICB9CisKKyAgICBkZWYgbWF5YmVfZmFsc2VfcG9zaXRpdmUoc2VsZik6CisgICAgICAgICIiIlNlYXJjaGVzIHRocm91Z2ggbG9nIGZpbGUgZm9yIHNvY2tldCBiaW5kIGVycm9yLgorICAgICAgICBSZXR1cm5zIFRydWUgaWYgc3VzcGljaW91cyBleHByZXNzaW9uIGlzIGZvdW5kLCBvdGhlcndpc2UgRmFsc2UiIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgc2VsZi5vdXQgYW5kIG5vdCBzZWxmLm91dC5jbG9zZWQ6CisgICAgICAgICAgICAgICAgc2VsZi5vdXQuZmx1c2goKQorICAgICAgICAgICAgZXhwcnMgPSBzZWxmLl9pbml0X2ZhaWx1cmVfZXhwcnNbc2VsZi5fcHJvZy5raW5kXQorCisgICAgICAgICAgICBkZWYgbWF0Y2gobGluZSk6CisgICAgICAgICAgICAgICAgZm9yIGV4cHIgaW4gZXhwcnM6CisgICAgICAgICAgICAgICAgICAgIGlmIGV4cHIuc2VhcmNoKGxpbmUpOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fbG9nLmluZm8oIm1heWJlIGZhbHNlIHBvc2l0aXZlOiAlcyIgJSBsaW5lKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgICAgICAgICAgd2l0aCBsb2dmaWxlX29wZW4oc2VsZi5sb2dwYXRoLCAncicpIGFzIGZwOgorICAgICAgICAgICAgICAgIGlmIGFueShtYXAobWF0Y2gsIGZwKSk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIGV4Y2VwdCAoS2V5Ym9hcmRJbnRlcnJ1cHQsIFN5c3RlbUV4aXQpOgorICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleDoKKyAgICAgICAgICAgIHNlbGYuX2xvZy53YXJuKCdbJXNdOiBFcnJvciB3aGlsZSBkZXRlY3RpbmcgZmFsc2UgcG9zaXRpdmU6ICVzJyAlIChzZWxmLl90ZXN0Lm5hbWUsIHN0cihleCkpKQorICAgICAgICAgICAgc2VsZi5fbG9nLmluZm8odHJhY2ViYWNrLnByaW50X2V4YygpKQorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBfb3BlbihzZWxmKToKKyAgICAgICAgc2VsZi5vdXQgPSBsb2dmaWxlX29wZW4oc2VsZi5sb2dwYXRoLCAndysnKQorCisgICAgZGVmIF9jbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5vdXQuY2xvc2UoKQorCisgICAgZGVmIF9wcmludF9oZWFkZXIoc2VsZik6CisgICAgICAgIHNlbGYuX3ByaW50X2RhdGUoKQorICAgICAgICBwcmludCgnRXhlY3V0aW5nOiAlcycgJSBzdHJfam9pbignICcsIHNlbGYuX3Byb2cuY29tbWFuZCksIGZpbGU9c2VsZi5vdXQpCisgICAgICAgIHByaW50KCdEaXJlY3Rvcnk6ICVzJyAlIHNlbGYuX3Byb2cud29ya2RpciwgZmlsZT1zZWxmLm91dCkKKyAgICAgICAgcHJpbnQoJ2NvbmZpZzpkZWxheTogJXMnICUgc2VsZi5fdGVzdC5kZWxheSwgZmlsZT1zZWxmLm91dCkKKyAgICAgICAgcHJpbnQoJ2NvbmZpZzp0aW1lb3V0OiAlcycgJSBzZWxmLl90ZXN0LnRpbWVvdXQsIGZpbGU9c2VsZi5vdXQpCisgICAgICAgIHNlbGYuX3ByaW50X2JhcigpCiAgICAgICAgIHNlbGYub3V0LmZsdXNoKCkKLSAgICAgIGV4cHJzID0gbGlzdChtYXAocmUuY29tcGlsZSwgc2VsZi5faW5pdF9mYWlsdXJlX2V4cHJzW3NlbGYuX3Byb2cua2luZF0pKQogCi0gICAgICBzZXJ2ZXJfbG9nZmlsZSA9IHNlbGYubG9ncGF0aAotICAgICAgIyBuZWVkIHRvIGhhbmRsZSB1bmljb2RlIGVycm9ycyBvbiBQeXRob24gMwotICAgICAga3dhcmdzID0ge30gaWYgc3lzLnZlcnNpb25faW5mb1swXSA8IDMgZWxzZSB7J2Vycm9ycyc6ICdyZXBsYWNlJ30KLSAgICAgIHdpdGggb3BlbihzZXJ2ZXJfbG9nZmlsZSwgJ3InLCAqKmt3YXJncykgYXMgZnA6Ci0gICAgICAgIGlmIGFueShtYXAobWF0Y2gsIGZwKSk6Ci0gICAgICAgICAgcmV0dXJuIFRydWUKLSAgICBleGNlcHQgKEtleWJvYXJkSW50ZXJydXB0LCBTeXN0ZW1FeGl0KToKLSAgICAgIHJhaXNlCi0gICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleDoKLSAgICAgIHNlbGYuX2xvZy53YXJuKCdbJXNdOiBFcnJvciB3aGlsZSBkZXRlY3RpbmcgZmFsc2UgcG9zaXRpdmU6ICVzJyAlIChzZWxmLl90ZXN0Lm5hbWUsIHN0cihleCkpKQotICAgICAgc2VsZi5fbG9nLmluZm8odHJhY2ViYWNrLnByaW50X2V4YygpKQotICAgIHJldHVybiBGYWxzZQotCi0gIGRlZiBfb3BlbihzZWxmKToKLSAgICBzZWxmLm91dCA9IG9wZW4oc2VsZi5sb2dwYXRoLCAndysnKQotCi0gIGRlZiBfY2xvc2Uoc2VsZik6Ci0gICAgc2VsZi5vdXQuY2xvc2UoKQotCi0gIGRlZiBfcHJpbnRfaGVhZGVyKHNlbGYpOgotICAgIHNlbGYuX3ByaW50X2RhdGUoKQotICAgIHNlbGYub3V0LndyaXRlKCdFeGVjdXRpbmc6ICVzXG4nICUgJyAnLmpvaW4oc2VsZi5fcHJvZy5jb21tYW5kKSkKLSAgICBzZWxmLm91dC53cml0ZSgnRGlyZWN0b3J5OiAlc1xuJyAlIHNlbGYuX3Byb2cud29ya2RpcikKLSAgICBzZWxmLm91dC53cml0ZSgnY29uZmlnOmRlbGF5OiAlc1xuJyAlIHNlbGYuX3Rlc3QuZGVsYXkpCi0gICAgc2VsZi5vdXQud3JpdGUoJ2NvbmZpZzp0aW1lb3V0OiAlc1xuJyAlIHNlbGYuX3Rlc3QudGltZW91dCkKLSAgICBzZWxmLl9wcmludF9iYXIoKQotICAgIHNlbGYub3V0LmZsdXNoKCkKLQotICBkZWYgX3ByaW50X2Zvb3RlcihzZWxmLCByZXR1cm5jb2RlPU5vbmUpOgotICAgIHNlbGYuX3ByaW50X2JhcigpCi0gICAgaWYgcmV0dXJuY29kZSBpcyBub3QgTm9uZToKLSAgICAgIHNlbGYub3V0LndyaXRlKCdSZXR1cm4gY29kZTogJWRcbicgJSByZXR1cm5jb2RlKQotICAgIGVsc2U6Ci0gICAgICBzZWxmLm91dC53cml0ZSgnUHJvY2VzcyBpcyBraWxsZWQuXG4nKQotICAgIHNlbGYuX3ByaW50X2V4ZWNfdGltZSgpCi0gICAgc2VsZi5fcHJpbnRfZGF0ZSgpCisgICAgZGVmIF9wcmludF9mb290ZXIoc2VsZiwgcmV0dXJuY29kZT1Ob25lKToKKyAgICAgICAgc2VsZi5fcHJpbnRfYmFyKCkKKyAgICAgICAgaWYgcmV0dXJuY29kZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHByaW50KCdSZXR1cm4gY29kZTogJWQgKG5lZ2F0aXZlIHZhbHVlcyBpbmRpY2F0ZSBraWxsIGJ5IHNpZ25hbCknICUgcmV0dXJuY29kZSwgZmlsZT1zZWxmLm91dCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50KCdQcm9jZXNzIGlzIGtpbGxlZC4nLCBmaWxlPXNlbGYub3V0KQorICAgICAgICBzZWxmLl9wcmludF9leGVjX3RpbWUoKQorICAgICAgICBzZWxmLl9wcmludF9kYXRlKCkKIAogCiBjbGFzcyBTdW1tYXJ5UmVwb3J0ZXIoVGVzdFJlcG9ydGVyKToKLSAgZGVmIF9faW5pdF9fKHNlbGYsIHRlc3RkaXIsIGNvbmN1cnJlbnQ9VHJ1ZSk6Ci0gICAgc3VwZXIoU3VtbWFyeVJlcG9ydGVyLCBzZWxmKS5fX2luaXRfXygpCi0gICAgc2VsZi50ZXN0ZGlyID0gdGVzdGRpcgotICAgIHNlbGYubG9nZGlyID0gb3MucGF0aC5qb2luKHRlc3RkaXIsIExPR19ESVIpCi0gICAgc2VsZi5vdXRfcGF0aCA9IG9zLnBhdGguam9pbih0ZXN0ZGlyLCBSRVNVTFRfSlNPTikKLSAgICBzZWxmLmNvbmN1cnJlbnQgPSBjb25jdXJyZW50Ci0gICAgc2VsZi5vdXQgPSBzeXMuc3Rkb3V0Ci0gICAgc2VsZi5fcGxhdGZvcm0gPSBwbGF0Zm9ybS5zeXN0ZW0oKQotICAgIHNlbGYuX3JldmlzaW9uID0gc2VsZi5fZ2V0X3JldmlzaW9uKCkKLSAgICBzZWxmLl90ZXN0cyA9IFtdCi0gICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNlbGYubG9nZGlyKToKLSAgICAgIG9zLm1rZGlyKHNlbGYubG9nZGlyKQotICAgIHNlbGYuX2tub3duX2ZhaWx1cmVzID0gbG9hZF9rbm93bl9mYWlsdXJlcyh0ZXN0ZGlyKQotICAgIHNlbGYuX3VuZXhwZWN0ZWRfc3VjY2VzcyA9IFtdCi0gICAgc2VsZi5fdW5leHBlY3RlZF9mYWlsdXJlID0gW10KLSAgICBzZWxmLl9leHBlY3RlZF9mYWlsdXJlID0gW10KLSAgICBzZWxmLl9wcmludF9oZWFkZXIoKQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBiYXNlZGlyLCB0ZXN0ZGlyX3JlbGF0aXZlLCBjb25jdXJyZW50PVRydWUpOgorICAgICAgICBzdXBlcihTdW1tYXJ5UmVwb3J0ZXIsIHNlbGYpLl9faW5pdF9fKCkKKyAgICAgICAgc2VsZi5fYmFzZWRpciA9IGJhc2VkaXIKKyAgICAgICAgc2VsZi5fdGVzdGRpcl9yZWwgPSB0ZXN0ZGlyX3JlbGF0aXZlCisgICAgICAgIHNlbGYubG9nZGlyID0gcGF0aF9qb2luKHNlbGYudGVzdGRpciwgTE9HX0RJUikKKyAgICAgICAgc2VsZi5vdXRfcGF0aCA9IHBhdGhfam9pbihzZWxmLnRlc3RkaXIsIFJFU1VMVF9KU09OKQorICAgICAgICBzZWxmLmNvbmN1cnJlbnQgPSBjb25jdXJyZW50CisgICAgICAgIHNlbGYub3V0ID0gc3lzLnN0ZG91dAorICAgICAgICBzZWxmLl9wbGF0Zm9ybSA9IHBsYXRmb3JtLnN5c3RlbSgpCisgICAgICAgIHNlbGYuX3JldmlzaW9uID0gc2VsZi5fZ2V0X3JldmlzaW9uKCkKKyAgICAgICAgc2VsZi5fdGVzdHMgPSBbXQorICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc2VsZi5sb2dkaXIpOgorICAgICAgICAgICAgb3MubWtkaXIoc2VsZi5sb2dkaXIpCisgICAgICAgIHNlbGYuX2tub3duX2ZhaWx1cmVzID0gbG9hZF9rbm93bl9mYWlsdXJlcyhzZWxmLnRlc3RkaXIpCisgICAgICAgIHNlbGYuX3VuZXhwZWN0ZWRfc3VjY2VzcyA9IFtdCisgICAgICAgIHNlbGYuX2ZsYWt5X3N1Y2Nlc3MgPSBbXQorICAgICAgICBzZWxmLl91bmV4cGVjdGVkX2ZhaWx1cmUgPSBbXQorICAgICAgICBzZWxmLl9leHBlY3RlZF9mYWlsdXJlID0gW10KKyAgICAgICAgc2VsZi5fcHJpbnRfaGVhZGVyKCkKIAotICBkZWYgX2dldF9yZXZpc2lvbihzZWxmKToKLSAgICBwID0gc3VicHJvY2Vzcy5Qb3BlbihbJ2dpdCcsICdyZXYtcGFyc2UnLCAnLS1zaG9ydCcsICdIRUFEJ10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgY3dkPXNlbGYudGVzdGRpciwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSkKLSAgICBvdXQsIF8gPSBwLmNvbW11bmljYXRlKCkKLSAgICByZXR1cm4gb3V0LnN0cmlwKCkKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgdGVzdGRpcihzZWxmKToKKyAgICAgICAgcmV0dXJuIHBhdGhfam9pbihzZWxmLl9iYXNlZGlyLCBzZWxmLl90ZXN0ZGlyX3JlbCkKIAotICBkZWYgX2Zvcm1hdF90ZXN0KHNlbGYsIHRlc3QsIHdpdGhfcmVzdWx0PVRydWUpOgotICAgIG5hbWUgPSAnJXMtJXMnICUgKHRlc3Quc2VydmVyLm5hbWUsIHRlc3QuY2xpZW50Lm5hbWUpCi0gICAgdHJhbnMgPSAnJXMtJXMnICUgKHRlc3QudHJhbnNwb3J0LCB0ZXN0LnNvY2tldCkKLSAgICBpZiBub3Qgd2l0aF9yZXN1bHQ6Ci0gICAgICByZXR1cm4gJ3s6MTlzfXs6MTNzfXs6MjVzfScuZm9ybWF0KG5hbWVbOjE4XSwgdGVzdC5wcm90b2NvbFs6MTJdLCB0cmFuc1s6MjRdKQotICAgIGVsc2U6Ci0gICAgICByZXN1bHQgPSAnc3VjY2VzcycgaWYgdGVzdC5zdWNjZXNzIGVsc2UgKAotICAgICAgICAgICd0aW1lb3V0JyBpZiB0ZXN0LmV4cGlyZWQgZWxzZSAnZmFpbHVyZScpCi0gICAgICByZXN1bHRfc3RyaW5nID0gJyVzKCVkKScgJSAocmVzdWx0LCB0ZXN0LnJldHVybmNvZGUpCi0gICAgICByZXR1cm4gJ3s6MTlzfXs6MTNzfXs6MjVzfXs6c31cbicuZm9ybWF0KG5hbWVbOjE4XSwgdGVzdC5wcm90b2NvbFs6MTJdLCB0cmFuc1s6MjRdLCByZXN1bHRfc3RyaW5nKQotCi0gIGRlZiBfcHJpbnRfdGVzdF9oZWFkZXIoc2VsZik6Ci0gICAgc2VsZi5fcHJpbnRfYmFyKCkKLSAgICBzZWxmLm91dC53cml0ZSgKLSAgICAgICd7OjE5c317OjEzc317OjI1c317OnN9XG4nLmZvcm1hdCgnc2VydmVyLWNsaWVudDonLCAncHJvdG9jb2w6JywgJ3RyYW5zcG9ydDonLCAncmVzdWx0OicpKQotCi0gIGRlZiBfcHJpbnRfaGVhZGVyKHNlbGYpOgotICAgIHNlbGYuX3N0YXJ0KCkKLSAgICBzZWxmLm91dC53cml0ZWxpbmVzKFsKLSAgICAgICdBcGFjaGUgVGhyaWZ0IC0gSW50ZWdyYXRpb24gVGVzdCBTdWl0ZVxuJywKLSAgICBdKQotICAgIHNlbGYuX3ByaW50X2RhdGUoKQotICAgIHNlbGYuX3ByaW50X3Rlc3RfaGVhZGVyKCkKLQotICBkZWYgX3ByaW50X3VuZXhwZWN0ZWRfZmFpbHVyZShzZWxmKToKLSAgICBpZiBsZW4oc2VsZi5fdW5leHBlY3RlZF9mYWlsdXJlKSA+IDA6Ci0gICAgICBzZWxmLm91dC53cml0ZWxpbmVzKFsKLSAgICAgICAgJyoqKiBGb2xsb3dpbmcgJWQgZmFpbHVyZXMgd2VyZSB1bmV4cGVjdGVkICoqKjpcbicgJSBsZW4oc2VsZi5fdW5leHBlY3RlZF9mYWlsdXJlKSwKLSAgICAgICAgJ0lmIGl0IGlzIGludHJvZHVjZWQgYnkgeW91LCBwbGVhc2UgZml4IGl0IGJlZm9yZSBzdWJtaXR0aW5nIHRoZSBjb2RlLlxuJywKLSAgICAgICAgIyAnSWYgbm90LCBwbGVhc2UgcmVwb3J0IGF0IGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUXG4nLAotICAgICAgXSkKLSAgICAgIHNlbGYuX3ByaW50X3Rlc3RfaGVhZGVyKCkKLSAgICAgIGZvciBpIGluIHNlbGYuX3VuZXhwZWN0ZWRfZmFpbHVyZToKLSAgICAgICAgc2VsZi5vdXQud3JpdGUoc2VsZi5fZm9ybWF0X3Rlc3Qoc2VsZi5fdGVzdHNbaV0pKQotICAgICAgc2VsZi5fcHJpbnRfYmFyKCkKLSAgICBlbHNlOgotICAgICAgc2VsZi5vdXQud3JpdGUoJ05vIHVuZXhwZWN0ZWQgZmFpbHVyZXMuXG4nKQotCi0gIGRlZiBfcHJpbnRfdW5leHBlY3RlZF9zdWNjZXNzKHNlbGYpOgotICAgIGlmIGxlbihzZWxmLl91bmV4cGVjdGVkX3N1Y2Nlc3MpID4gMDoKLSAgICAgIHNlbGYub3V0LndyaXRlKAotICAgICAgICAnRm9sbG93aW5nICVkIHRlc3RzIHdlcmUga25vd24gdG8gZmFpbCBidXQgc3VjY2VlZGVkIChpdFwncyBub3JtYWwpOlxuJyAlIGxlbihzZWxmLl91bmV4cGVjdGVkX3N1Y2Nlc3MpKQotICAgICAgc2VsZi5fcHJpbnRfdGVzdF9oZWFkZXIoKQotICAgICAgZm9yIGkgaW4gc2VsZi5fdW5leHBlY3RlZF9zdWNjZXNzOgotICAgICAgICBzZWxmLm91dC53cml0ZShzZWxmLl9mb3JtYXRfdGVzdChzZWxmLl90ZXN0c1tpXSkpCi0gICAgICBzZWxmLl9wcmludF9iYXIoKQotCi0gIGRlZiBfaHR0cF9zZXJ2ZXJfY29tbWFuZChzZWxmLCBwb3J0KToKLSAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdIDwgMzoKLSAgICAgIHJldHVybiAncHl0aG9uIC1tIFNpbXBsZUhUVFBTZXJ2ZXIgJWQnICUgcG9ydAotICAgIGVsc2U6Ci0gICAgICByZXR1cm4gJ3B5dGhvbiAtbSBodHRwLnNlcnZlciAlZCcgJSBwb3J0Ci0KLSAgZGVmIF9wcmludF9mb290ZXIoc2VsZik6Ci0gICAgZmFpbF9jb3VudCA9IGxlbihzZWxmLl9leHBlY3RlZF9mYWlsdXJlKSArIGxlbihzZWxmLl91bmV4cGVjdGVkX2ZhaWx1cmUpCi0gICAgc2VsZi5fcHJpbnRfYmFyKCkKLSAgICBzZWxmLl9wcmludF91bmV4cGVjdGVkX3N1Y2Nlc3MoKQotICAgIHNlbGYuX3ByaW50X3VuZXhwZWN0ZWRfZmFpbHVyZSgpCi0gICAgc2VsZi5fd3JpdGVfaHRtbF9kYXRhKCkKLSAgICBzZWxmLl9hc3NlbWJsZV9sb2coJ3VuZXhwZWN0ZWQgZmFpbHVyZXMnLCBzZWxmLl91bmV4cGVjdGVkX2ZhaWx1cmUpCi0gICAgc2VsZi5fYXNzZW1ibGVfbG9nKCdrbm93biBmYWlsdXJlcycsIHNlbGYuX2V4cGVjdGVkX2ZhaWx1cmUpCi0gICAgc2VsZi5vdXQud3JpdGVsaW5lcyhbCi0gICAgICAnWW91IGNhbiBicm93c2UgcmVzdWx0cyBhdDpcbicsCi0gICAgICAnXHRmaWxlOi8vJXMvJXNcbicgJSAoc2VsZi50ZXN0ZGlyLCBSRVNVTFRfSFRNTCksCi0gICAgICAnIyBJZiB5b3UgdXNlIENocm9tZSwgcnVuOlxuJywKLSAgICAgICcjIFx0Y2QgJXNcbiNcdCVzXG4nICUgKHNlbGYudGVzdGRpciwgc2VsZi5faHR0cF9zZXJ2ZXJfY29tbWFuZCg4MDAxKSksCi0gICAgICAnIyB0aGVuIGJyb3dzZTpcbicsCi0gICAgICAnIyBcdGh0dHA6Ly9sb2NhbGhvc3Q6JWQvJXNcbicgJSAoODAwMSwgUkVTVUxUX0hUTUwpLAotICAgICAgJ0Z1bGwgbG9nIGZvciBlYWNoIHRlc3QgaXMgaGVyZTpcbicsCi0gICAgICAnXHR0ZXN0L2xvZy9jbGllbnRfc2VydmVyX3Byb3RvY29sX3RyYW5zcG9ydF9jbGllbnQubG9nXG4nLAotICAgICAgJ1x0dGVzdC9sb2cvY2xpZW50X3NlcnZlcl9wcm90b2NvbF90cmFuc3BvcnRfc2VydmVyLmxvZ1xuJywKLSAgICAgICclZCBmYWlsZWQgb2YgJWQgdGVzdHMgaW4gdG90YWwuXG4nICUgKGZhaWxfY291bnQsIGxlbihzZWxmLl90ZXN0cykpLAotICAgIF0pCi0gICAgc2VsZi5fcHJpbnRfZXhlY190aW1lKCkKLSAgICBzZWxmLl9wcmludF9kYXRlKCkKLQotICBkZWYgX3JlbmRlcl9yZXN1bHQoc2VsZiwgdGVzdCk6Ci0gICAgcmV0dXJuIFsKLSAgICAgIHRlc3Quc2VydmVyLm5hbWUsCi0gICAgICB0ZXN0LmNsaWVudC5uYW1lLAotICAgICAgdGVzdC5wcm90b2NvbCwKLSAgICAgIHRlc3QudHJhbnNwb3J0LAotICAgICAgdGVzdC5zb2NrZXQsCi0gICAgICB0ZXN0LnN1Y2Nlc3MsCi0gICAgICB0ZXN0LmFzX2V4cGVjdGVkLAotICAgICAgdGVzdC5yZXR1cm5jb2RlLAotICAgICAgewotICAgICAgICAnc2VydmVyJzogc2VsZi50ZXN0X2xvZ2ZpbGUodGVzdC5uYW1lLCB0ZXN0LnNlcnZlci5raW5kKSwKLSAgICAgICAgJ2NsaWVudCc6IHNlbGYudGVzdF9sb2dmaWxlKHRlc3QubmFtZSwgdGVzdC5jbGllbnQua2luZCksCi0gICAgICB9LAotICAgIF0KLQotICBkZWYgX3dyaXRlX2h0bWxfZGF0YShzZWxmKToKLSAgICAiIiJXcml0ZXMgSlNPTiBkYXRhIHRvIGJlIHJlYWQgYnkgcmVzdWx0IGh0bWwiIiIKLSAgICByZXN1bHRzID0gW3NlbGYuX3JlbmRlcl9yZXN1bHQocikgZm9yIHIgaW4gc2VsZi5fdGVzdHNdCi0gICAgd2l0aCBvcGVuKHNlbGYub3V0X3BhdGgsICd3KycpIGFzIGZwOgotICAgICAgZnAud3JpdGUoanNvbi5kdW1wcyh7Ci0gICAgICAgICdkYXRlJzogc2VsZi5fZm9ybWF0X2RhdGUoKSwKLSAgICAgICAgJ3JldmlzaW9uJzogc3RyKHNlbGYuX3JldmlzaW9uKSwKLSAgICAgICAgJ3BsYXRmb3JtJzogc2VsZi5fcGxhdGZvcm0sCi0gICAgICAgICdkdXJhdGlvbic6ICd7Oi4xZn0nLmZvcm1hdChzZWxmLl9lbGFwc2VkKSwKLSAgICAgICAgJ3Jlc3VsdHMnOiByZXN1bHRzLAotICAgICAgfSwgaW5kZW50PTIpKQotCi0gIGRlZiBfYXNzZW1ibGVfbG9nKHNlbGYsIHRpdGxlLCBpbmRleGVzKToKLSAgICBpZiBsZW4oaW5kZXhlcykgPiAwOgotICAgICAgZGVmIGFkZF9wcm9nX2xvZyhmcCwgdGVzdCwgcHJvZ19raW5kKToKLSAgICAgICAgZnAud3JpdGUoJyoqKioqKioqKioqKioqKioqKioqKioqKioqKiAlcyBtZXNzYWdlICoqKioqKioqKioqKioqKioqKioqKioqKioqKlxuJwotICAgICAgICAgICAgICAgICAlIHByb2dfa2luZCkKLSAgICAgICAgcGF0aCA9IHNlbGYudGVzdF9sb2dmaWxlKHRlc3QubmFtZSwgcHJvZ19raW5kLCBzZWxmLnRlc3RkaXIpCi0gICAgICAgIGt3YXJncyA9IHt9IGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPCAzIGVsc2UgeydlcnJvcnMnOiAncmVwbGFjZSd9Ci0gICAgICAgIHdpdGggb3BlbihwYXRoLCAncicsICoqa3dhcmdzKSBhcyBwcm9nX2ZwOgotICAgICAgICAgIGZwLndyaXRlKHByb2dfZnAucmVhZCgpKQotICAgICAgZmlsZW5hbWUgPSB0aXRsZS5yZXBsYWNlKCcgJywgJ18nKSArICcubG9nJwotICAgICAgd2l0aCBvcGVuKG9zLnBhdGguam9pbihzZWxmLmxvZ2RpciwgZmlsZW5hbWUpLCAndysnKSBhcyBmcDoKLSAgICAgICAgZm9yIHRlc3QgaW4gbWFwKHNlbGYuX3Rlc3RzLl9fZ2V0aXRlbV9fLCBpbmRleGVzKToKLSAgICAgICAgICBmcC53cml0ZSgnVEVTVDogWyVzXVxuJyAlIHRlc3QubmFtZSkKLSAgICAgICAgICBhZGRfcHJvZ19sb2coZnAsIHRlc3QsIHRlc3Quc2VydmVyLmtpbmQpCi0gICAgICAgICAgYWRkX3Byb2dfbG9nKGZwLCB0ZXN0LCB0ZXN0LmNsaWVudC5raW5kKQotICAgICAgICAgIGZwLndyaXRlKCcqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbicpCi0gICAgICBzZWxmLm91dC53cml0ZSgnJXMgYXJlIGxvZ2dlZCB0byB0ZXN0LyVzLyVzXG4nICUgKHRpdGxlLmNhcGl0YWxpemUoKSwgTE9HX0RJUiwgZmlsZW5hbWUpKQotCi0gIGRlZiBlbmQoc2VsZik6Ci0gICAgc2VsZi5fcHJpbnRfZm9vdGVyKCkKLSAgICByZXR1cm4gbGVuKHNlbGYuX3VuZXhwZWN0ZWRfZmFpbHVyZSkgPT0gMAotCi0gIGRlZiBhZGRfdGVzdChzZWxmLCB0ZXN0X2RpY3QpOgotICAgIHRlc3QgPSBUZXN0RW50cnkoc2VsZi50ZXN0ZGlyLCAqKnRlc3RfZGljdCkKLSAgICBzZWxmLl9sb2NrLmFjcXVpcmUoKQotICAgIHRyeToKLSAgICAgIGlmIG5vdCBzZWxmLmNvbmN1cnJlbnQ6Ci0gICAgICAgIHNlbGYub3V0LndyaXRlKHNlbGYuX2Zvcm1hdF90ZXN0KHRlc3QsIEZhbHNlKSkKLSAgICAgICAgc2VsZi5vdXQuZmx1c2goKQotICAgICAgc2VsZi5fdGVzdHMuYXBwZW5kKHRlc3QpCi0gICAgICByZXR1cm4gbGVuKHNlbGYuX3Rlc3RzKSAtIDEKLSAgICBmaW5hbGx5OgotICAgICAgc2VsZi5fbG9jay5yZWxlYXNlKCkKLQotICBkZWYgYWRkX3Jlc3VsdChzZWxmLCBpbmRleCwgcmV0dXJuY29kZSwgZXhwaXJlZCk6Ci0gICAgc2VsZi5fbG9jay5hY3F1aXJlKCkKLSAgICB0cnk6Ci0gICAgICBmYWlsZWQgPSByZXR1cm5jb2RlIGlzIE5vbmUgb3IgcmV0dXJuY29kZSAhPSAwCi0gICAgICB0ZXN0ID0gc2VsZi5fdGVzdHNbaW5kZXhdCi0gICAgICBrbm93biA9IHRlc3QubmFtZSBpbiBzZWxmLl9rbm93bl9mYWlsdXJlcwotICAgICAgaWYgZmFpbGVkOgotICAgICAgICBpZiBrbm93bjoKLSAgICAgICAgICBzZWxmLl9sb2cuZGVidWcoJyVzIGZhaWxlZCBhcyBleHBlY3RlZCcgJSB0ZXN0Lm5hbWUpCi0gICAgICAgICAgc2VsZi5fZXhwZWN0ZWRfZmFpbHVyZS5hcHBlbmQoaW5kZXgpCisgICAgZGVmIF9yZXN1bHRfc3RyaW5nKHNlbGYsIHRlc3QpOgorICAgICAgICBpZiB0ZXN0LnN1Y2Nlc3M6CisgICAgICAgICAgICBpZiB0ZXN0LnJldHJ5X2NvdW50ID09IDA6CisgICAgICAgICAgICAgICAgcmV0dXJuICdzdWNjZXNzJworICAgICAgICAgICAgZWxpZiB0ZXN0LnJldHJ5X2NvdW50ID09IDE6CisgICAgICAgICAgICAgICAgcmV0dXJuICdmbGFreSgxIHJldHJ5KScKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuICdmbGFreSglZCByZXRyaWVzKScgJSB0ZXN0LnJldHJ5X2NvdW50CisgICAgICAgIGVsaWYgdGVzdC5leHBpcmVkOgorICAgICAgICAgICAgcmV0dXJuICdmYWlsdXJlKHRpbWVvdXQpJwogICAgICAgICBlbHNlOgotICAgICAgICAgIHNlbGYuX2xvZy5pbmZvKCd1bmV4cGVjdGVkIGZhaWx1cmU6ICVzJyAlIHRlc3QubmFtZSkKLSAgICAgICAgICBzZWxmLl91bmV4cGVjdGVkX2ZhaWx1cmUuYXBwZW5kKGluZGV4KQotICAgICAgZWxpZiBrbm93bjoKLSAgICAgICAgc2VsZi5fbG9nLmluZm8oJ3VuZXhwZWN0ZWQgc3VjY2VzczogJXMnICUgdGVzdC5uYW1lKQotICAgICAgICBzZWxmLl91bmV4cGVjdGVkX3N1Y2Nlc3MuYXBwZW5kKGluZGV4KQotICAgICAgdGVzdC5zdWNjZXNzID0gbm90IGZhaWxlZAotICAgICAgdGVzdC5yZXR1cm5jb2RlID0gcmV0dXJuY29kZQotICAgICAgdGVzdC5leHBpcmVkID0gZXhwaXJlZAotICAgICAgdGVzdC5hc19leHBlY3RlZCA9IGtub3duID09IGZhaWxlZAotICAgICAgaWYgbm90IHNlbGYuY29uY3VycmVudDoKLSAgICAgICAgcmVzdWx0ID0gJ3N1Y2Nlc3MnIGlmIG5vdCBmYWlsZWQgZWxzZSAnZmFpbHVyZScKLSAgICAgICAgcmVzdWx0X3N0cmluZyA9ICclcyglZCknICUgKHJlc3VsdCwgcmV0dXJuY29kZSkKLSAgICAgICAgc2VsZi5vdXQud3JpdGUocmVzdWx0X3N0cmluZyArICdcbicpCi0gICAgICBlbHNlOgotICAgICAgICBzZWxmLm91dC53cml0ZShzZWxmLl9mb3JtYXRfdGVzdCh0ZXN0KSkKLSAgICBmaW5hbGx5OgotICAgICAgc2VsZi5fbG9jay5yZWxlYXNlKCkKKyAgICAgICAgICAgIHJldHVybiAnZmFpbHVyZSglZCknICUgdGVzdC5yZXR1cm5jb2RlCisKKyAgICBkZWYgX2dldF9yZXZpc2lvbihzZWxmKToKKyAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oWydnaXQnLCAncmV2LXBhcnNlJywgJy0tc2hvcnQnLCAnSEVBRCddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjd2Q9c2VsZi50ZXN0ZGlyLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFKQorICAgICAgICBvdXQsIF8gPSBwLmNvbW11bmljYXRlKCkKKyAgICAgICAgcmV0dXJuIG91dC5zdHJpcCgpCisKKyAgICBkZWYgX2Zvcm1hdF90ZXN0KHNlbGYsIHRlc3QsIHdpdGhfcmVzdWx0PVRydWUpOgorICAgICAgICBuYW1lID0gJyVzLSVzJyAlICh0ZXN0LnNlcnZlci5uYW1lLCB0ZXN0LmNsaWVudC5uYW1lKQorICAgICAgICB0cmFucyA9ICclcy0lcycgJSAodGVzdC50cmFuc3BvcnQsIHRlc3Quc29ja2V0KQorICAgICAgICBpZiBub3Qgd2l0aF9yZXN1bHQ6CisgICAgICAgICAgICByZXR1cm4gJ3s6MjRzfXs6MThzfXs6MjVzfScuZm9ybWF0KG5hbWVbOjIzXSwgdGVzdC5wcm90b2NvbFs6MTddLCB0cmFuc1s6MjRdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICd7OjI0c317OjE4c317OjI1c317OnN9XG4nLmZvcm1hdChuYW1lWzoyM10sIHRlc3QucHJvdG9jb2xbOjE3XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNbOjI0XSwgc2VsZi5fcmVzdWx0X3N0cmluZyh0ZXN0KSkKKworICAgIGRlZiBfcHJpbnRfdGVzdF9oZWFkZXIoc2VsZik6CisgICAgICAgIHNlbGYuX3ByaW50X2JhcigpCisgICAgICAgIHByaW50KAorICAgICAgICAgICAgJ3s6MjRzfXs6MThzfXs6MjVzfXs6c30nLmZvcm1hdCgnc2VydmVyLWNsaWVudDonLCAncHJvdG9jb2w6JywgJ3RyYW5zcG9ydDonLCAncmVzdWx0OicpLAorICAgICAgICAgICAgZmlsZT1zZWxmLm91dCkKKworICAgIGRlZiBfcHJpbnRfaGVhZGVyKHNlbGYpOgorICAgICAgICBzZWxmLl9zdGFydCgpCisgICAgICAgIHByaW50KCdBcGFjaGUgVGhyaWZ0IC0gSW50ZWdyYXRpb24gVGVzdCBTdWl0ZScsIGZpbGU9c2VsZi5vdXQpCisgICAgICAgIHNlbGYuX3ByaW50X2RhdGUoKQorICAgICAgICBzZWxmLl9wcmludF90ZXN0X2hlYWRlcigpCisKKyAgICBkZWYgX3ByaW50X3VuZXhwZWN0ZWRfZmFpbHVyZShzZWxmKToKKyAgICAgICAgaWYgbGVuKHNlbGYuX3VuZXhwZWN0ZWRfZmFpbHVyZSkgPiAwOgorICAgICAgICAgICAgc2VsZi5vdXQud3JpdGVsaW5lcyhbCisgICAgICAgICAgICAgICAgJyoqKiBGb2xsb3dpbmcgJWQgZmFpbHVyZXMgd2VyZSB1bmV4cGVjdGVkICoqKjpcbicgJSBsZW4oc2VsZi5fdW5leHBlY3RlZF9mYWlsdXJlKSwKKyAgICAgICAgICAgICAgICAnSWYgaXQgaXMgaW50cm9kdWNlZCBieSB5b3UsIHBsZWFzZSBmaXggaXQgYmVmb3JlIHN1Ym1pdHRpbmcgdGhlIGNvZGUuXG4nLAorICAgICAgICAgICAgICAgICMgJ0lmIG5vdCwgcGxlYXNlIHJlcG9ydCBhdCBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVFxuJywKKyAgICAgICAgICAgIF0pCisgICAgICAgICAgICBzZWxmLl9wcmludF90ZXN0X2hlYWRlcigpCisgICAgICAgICAgICBmb3IgaSBpbiBzZWxmLl91bmV4cGVjdGVkX2ZhaWx1cmU6CisgICAgICAgICAgICAgICAgc2VsZi5vdXQud3JpdGUoc2VsZi5fZm9ybWF0X3Rlc3Qoc2VsZi5fdGVzdHNbaV0pKQorICAgICAgICAgICAgc2VsZi5fcHJpbnRfYmFyKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50KCdObyB1bmV4cGVjdGVkIGZhaWx1cmVzLicsIGZpbGU9c2VsZi5vdXQpCisKKyAgICBkZWYgX3ByaW50X2ZsYWt5X3N1Y2Nlc3Moc2VsZik6CisgICAgICAgIGlmIGxlbihzZWxmLl9mbGFreV9zdWNjZXNzKSA+IDA6CisgICAgICAgICAgICBwcmludCgKKyAgICAgICAgICAgICAgICAnRm9sbG93aW5nICVkIHRlc3RzIHdlcmUgZXhwZWN0ZWQgdG8gY2xlYW5seSBzdWNjZWVkIGJ1dCBuZWVkZWQgcmV0cnk6JyAlIGxlbihzZWxmLl9mbGFreV9zdWNjZXNzKSwKKyAgICAgICAgICAgICAgICBmaWxlPXNlbGYub3V0KQorICAgICAgICAgICAgc2VsZi5fcHJpbnRfdGVzdF9oZWFkZXIoKQorICAgICAgICAgICAgZm9yIGkgaW4gc2VsZi5fZmxha3lfc3VjY2VzczoKKyAgICAgICAgICAgICAgICBzZWxmLm91dC53cml0ZShzZWxmLl9mb3JtYXRfdGVzdChzZWxmLl90ZXN0c1tpXSkpCisgICAgICAgICAgICBzZWxmLl9wcmludF9iYXIoKQorCisgICAgZGVmIF9wcmludF91bmV4cGVjdGVkX3N1Y2Nlc3Moc2VsZik6CisgICAgICAgIGlmIGxlbihzZWxmLl91bmV4cGVjdGVkX3N1Y2Nlc3MpID4gMDoKKyAgICAgICAgICAgIHByaW50KAorICAgICAgICAgICAgICAgICdGb2xsb3dpbmcgJWQgdGVzdHMgd2VyZSBrbm93biB0byBmYWlsIGJ1dCBzdWNjZWVkZWQgKG1heWJlIGZsYWt5KTonICUgbGVuKHNlbGYuX3VuZXhwZWN0ZWRfc3VjY2VzcyksCisgICAgICAgICAgICAgICAgZmlsZT1zZWxmLm91dCkKKyAgICAgICAgICAgIHNlbGYuX3ByaW50X3Rlc3RfaGVhZGVyKCkKKyAgICAgICAgICAgIGZvciBpIGluIHNlbGYuX3VuZXhwZWN0ZWRfc3VjY2VzczoKKyAgICAgICAgICAgICAgICBzZWxmLm91dC53cml0ZShzZWxmLl9mb3JtYXRfdGVzdChzZWxmLl90ZXN0c1tpXSkpCisgICAgICAgICAgICBzZWxmLl9wcmludF9iYXIoKQorCisgICAgZGVmIF9odHRwX3NlcnZlcl9jb21tYW5kKHNlbGYsIHBvcnQpOgorICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdIDwgMzoKKyAgICAgICAgICAgIHJldHVybiAncHl0aG9uIC1tIFNpbXBsZUhUVFBTZXJ2ZXIgJWQnICUgcG9ydAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICdweXRob24gLW0gaHR0cC5zZXJ2ZXIgJWQnICUgcG9ydAorCisgICAgZGVmIF9wcmludF9mb290ZXIoc2VsZik6CisgICAgICAgIGZhaWxfY291bnQgPSBsZW4oc2VsZi5fZXhwZWN0ZWRfZmFpbHVyZSkgKyBsZW4oc2VsZi5fdW5leHBlY3RlZF9mYWlsdXJlKQorICAgICAgICBzZWxmLl9wcmludF9iYXIoKQorICAgICAgICBzZWxmLl9wcmludF91bmV4cGVjdGVkX3N1Y2Nlc3MoKQorICAgICAgICBzZWxmLl9wcmludF9mbGFreV9zdWNjZXNzKCkKKyAgICAgICAgc2VsZi5fcHJpbnRfdW5leHBlY3RlZF9mYWlsdXJlKCkKKyAgICAgICAgc2VsZi5fd3JpdGVfaHRtbF9kYXRhKCkKKyAgICAgICAgc2VsZi5fYXNzZW1ibGVfbG9nKCd1bmV4cGVjdGVkIGZhaWx1cmVzJywgc2VsZi5fdW5leHBlY3RlZF9mYWlsdXJlKQorICAgICAgICBzZWxmLl9hc3NlbWJsZV9sb2coJ2tub3duIGZhaWx1cmVzJywgc2VsZi5fZXhwZWN0ZWRfZmFpbHVyZSkKKyAgICAgICAgc2VsZi5vdXQud3JpdGVsaW5lcyhbCisgICAgICAgICAgICAnWW91IGNhbiBicm93c2UgcmVzdWx0cyBhdDpcbicsCisgICAgICAgICAgICAnXHRmaWxlOi8vJXMvJXNcbicgJSAoc2VsZi50ZXN0ZGlyLCBSRVNVTFRfSFRNTCksCisgICAgICAgICAgICAnIyBJZiB5b3UgdXNlIENocm9tZSwgcnVuOlxuJywKKyAgICAgICAgICAgICcjIFx0Y2QgJXNcbiNcdCVzXG4nICUgKHNlbGYuX2Jhc2VkaXIsIHNlbGYuX2h0dHBfc2VydmVyX2NvbW1hbmQoODAwMSkpLAorICAgICAgICAgICAgJyMgdGhlbiBicm93c2U6XG4nLAorICAgICAgICAgICAgJyMgXHRodHRwOi8vbG9jYWxob3N0OiVkLyVzL1xuJyAlICg4MDAxLCBzZWxmLl90ZXN0ZGlyX3JlbCksCisgICAgICAgICAgICAnRnVsbCBsb2cgZm9yIGVhY2ggdGVzdCBpcyBoZXJlOlxuJywKKyAgICAgICAgICAgICdcdHRlc3QvbG9nL3NlcnZlcl9jbGllbnRfcHJvdG9jb2xfdHJhbnNwb3J0X2NsaWVudC5sb2dcbicsCisgICAgICAgICAgICAnXHR0ZXN0L2xvZy9zZXJ2ZXJfY2xpZW50X3Byb3RvY29sX3RyYW5zcG9ydF9zZXJ2ZXIubG9nXG4nLAorICAgICAgICAgICAgJyVkIGZhaWxlZCBvZiAlZCB0ZXN0cyBpbiB0b3RhbC5cbicgJSAoZmFpbF9jb3VudCwgbGVuKHNlbGYuX3Rlc3RzKSksCisgICAgICAgIF0pCisgICAgICAgIHNlbGYuX3ByaW50X2V4ZWNfdGltZSgpCisgICAgICAgIHNlbGYuX3ByaW50X2RhdGUoKQorCisgICAgZGVmIF9yZW5kZXJfcmVzdWx0KHNlbGYsIHRlc3QpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgdGVzdC5zZXJ2ZXIubmFtZSwKKyAgICAgICAgICAgIHRlc3QuY2xpZW50Lm5hbWUsCisgICAgICAgICAgICB0ZXN0LnByb3RvY29sLAorICAgICAgICAgICAgdGVzdC50cmFuc3BvcnQsCisgICAgICAgICAgICB0ZXN0LnNvY2tldCwKKyAgICAgICAgICAgIHRlc3Quc3VjY2VzcywKKyAgICAgICAgICAgIHRlc3QuYXNfZXhwZWN0ZWQsCisgICAgICAgICAgICB0ZXN0LnJldHVybmNvZGUsCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJ3NlcnZlcic6IHNlbGYudGVzdF9sb2dmaWxlKHRlc3QubmFtZSwgdGVzdC5zZXJ2ZXIua2luZCksCisgICAgICAgICAgICAgICAgJ2NsaWVudCc6IHNlbGYudGVzdF9sb2dmaWxlKHRlc3QubmFtZSwgdGVzdC5jbGllbnQua2luZCksCisgICAgICAgICAgICB9LAorICAgICAgICBdCisKKyAgICBkZWYgX3dyaXRlX2h0bWxfZGF0YShzZWxmKToKKyAgICAgICAgIiIiV3JpdGVzIEpTT04gZGF0YSB0byBiZSByZWFkIGJ5IHJlc3VsdCBodG1sIiIiCisgICAgICAgIHJlc3VsdHMgPSBbc2VsZi5fcmVuZGVyX3Jlc3VsdChyKSBmb3IgciBpbiBzZWxmLl90ZXN0c10KKyAgICAgICAgd2l0aCBsb2dmaWxlX29wZW4oc2VsZi5vdXRfcGF0aCwgJ3crJykgYXMgZnA6CisgICAgICAgICAgICBmcC53cml0ZShqc29uLmR1bXBzKHsKKyAgICAgICAgICAgICAgICAnZGF0ZSc6IHNlbGYuX2Zvcm1hdF9kYXRlKCksCisgICAgICAgICAgICAgICAgJ3JldmlzaW9uJzogc3RyKHNlbGYuX3JldmlzaW9uKSwKKyAgICAgICAgICAgICAgICAncGxhdGZvcm0nOiBzZWxmLl9wbGF0Zm9ybSwKKyAgICAgICAgICAgICAgICAnZHVyYXRpb24nOiAnezouMWZ9Jy5mb3JtYXQoc2VsZi5fZWxhcHNlZCksCisgICAgICAgICAgICAgICAgJ3Jlc3VsdHMnOiByZXN1bHRzLAorICAgICAgICAgICAgfSwgaW5kZW50PTIpKQorCisgICAgZGVmIF9hc3NlbWJsZV9sb2coc2VsZiwgdGl0bGUsIGluZGV4ZXMpOgorICAgICAgICBpZiBsZW4oaW5kZXhlcykgPiAwOgorICAgICAgICAgICAgZGVmIGFkZF9wcm9nX2xvZyhmcCwgdGVzdCwgcHJvZ19raW5kKToKKyAgICAgICAgICAgICAgICBwcmludCgnKioqKioqKioqKioqKioqKioqKioqKioqKioqICVzIG1lc3NhZ2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqJyAlIHByb2dfa2luZCwKKyAgICAgICAgICAgICAgICAgICAgICBmaWxlPWZwKQorICAgICAgICAgICAgICAgIHBhdGggPSBzZWxmLnRlc3RfbG9nZmlsZSh0ZXN0Lm5hbWUsIHByb2dfa2luZCwgc2VsZi50ZXN0ZGlyKQorICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHBhdGgpOgorICAgICAgICAgICAgICAgICAgICB3aXRoIGxvZ2ZpbGVfb3BlbihwYXRoLCAncicpIGFzIHByb2dfZnA6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludChwcm9nX2ZwLnJlYWQoKSwgZmlsZT1mcCkKKyAgICAgICAgICAgIGZpbGVuYW1lID0gdGl0bGUucmVwbGFjZSgnICcsICdfJykgKyAnLmxvZycKKyAgICAgICAgICAgIHdpdGggbG9nZmlsZV9vcGVuKG9zLnBhdGguam9pbihzZWxmLmxvZ2RpciwgZmlsZW5hbWUpLCAndysnKSBhcyBmcDoKKyAgICAgICAgICAgICAgICBmb3IgdGVzdCBpbiBtYXAoc2VsZi5fdGVzdHMuX19nZXRpdGVtX18sIGluZGV4ZXMpOgorICAgICAgICAgICAgICAgICAgICBmcC53cml0ZSgnVEVTVDogWyVzXVxuJyAlIHRlc3QubmFtZSkKKyAgICAgICAgICAgICAgICAgICAgYWRkX3Byb2dfbG9nKGZwLCB0ZXN0LCB0ZXN0LnNlcnZlci5raW5kKQorICAgICAgICAgICAgICAgICAgICBhZGRfcHJvZ19sb2coZnAsIHRlc3QsIHRlc3QuY2xpZW50LmtpbmQpCisgICAgICAgICAgICAgICAgICAgIGZwLndyaXRlKCcqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbicpCisgICAgICAgICAgICBwcmludCgnJXMgYXJlIGxvZ2dlZCB0byAlcy8lcy8lcycgJSAodGl0bGUuY2FwaXRhbGl6ZSgpLCBzZWxmLl90ZXN0ZGlyX3JlbCwgTE9HX0RJUiwgZmlsZW5hbWUpKQorCisgICAgZGVmIGVuZChzZWxmKToKKyAgICAgICAgc2VsZi5fcHJpbnRfZm9vdGVyKCkKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmLl91bmV4cGVjdGVkX2ZhaWx1cmUpID09IDAKKworICAgIGRlZiBhZGRfdGVzdChzZWxmLCB0ZXN0X2RpY3QpOgorICAgICAgICB0ZXN0ID0gVGVzdEVudHJ5KHNlbGYudGVzdGRpciwgKip0ZXN0X2RpY3QpCisgICAgICAgIHNlbGYuX2xvY2suYWNxdWlyZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLmNvbmN1cnJlbnQ6CisgICAgICAgICAgICAgICAgc2VsZi5vdXQud3JpdGUoc2VsZi5fZm9ybWF0X3Rlc3QodGVzdCwgRmFsc2UpKQorICAgICAgICAgICAgICAgIHNlbGYub3V0LmZsdXNoKCkKKyAgICAgICAgICAgIHNlbGYuX3Rlc3RzLmFwcGVuZCh0ZXN0KQorICAgICAgICAgICAgcmV0dXJuIGxlbihzZWxmLl90ZXN0cykgLSAxCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLl9sb2NrLnJlbGVhc2UoKQorCisgICAgZGVmIGFkZF9yZXN1bHQoc2VsZiwgaW5kZXgsIHJldHVybmNvZGUsIGV4cGlyZWQsIHJldHJ5X2NvdW50KToKKyAgICAgICAgc2VsZi5fbG9jay5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZmFpbGVkID0gcmV0dXJuY29kZSBpcyBOb25lIG9yIHJldHVybmNvZGUgIT0gMAorICAgICAgICAgICAgZmxha3kgPSBub3QgZmFpbGVkIGFuZCByZXRyeV9jb3VudCAhPSAwCisgICAgICAgICAgICB0ZXN0ID0gc2VsZi5fdGVzdHNbaW5kZXhdCisgICAgICAgICAgICBrbm93biA9IHRlc3QubmFtZSBpbiBzZWxmLl9rbm93bl9mYWlsdXJlcworICAgICAgICAgICAgaWYgZmFpbGVkOgorICAgICAgICAgICAgICAgIGlmIGtub3duOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9sb2cuZGVidWcoJyVzIGZhaWxlZCBhcyBleHBlY3RlZCcgJSB0ZXN0Lm5hbWUpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2V4cGVjdGVkX2ZhaWx1cmUuYXBwZW5kKGluZGV4KQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2xvZy5pbmZvKCd1bmV4cGVjdGVkIGZhaWx1cmU6ICVzJyAlIHRlc3QubmFtZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fdW5leHBlY3RlZF9mYWlsdXJlLmFwcGVuZChpbmRleCkKKyAgICAgICAgICAgIGVsaWYgZmxha3kgYW5kIG5vdCBrbm93bjoKKyAgICAgICAgICAgICAgICBzZWxmLl9sb2cuaW5mbygndW5leHBlY3RlZCBmbGFreSBzdWNjZXNzOiAlcycgJSB0ZXN0Lm5hbWUpCisgICAgICAgICAgICAgICAgc2VsZi5fZmxha3lfc3VjY2Vzcy5hcHBlbmQoaW5kZXgpCisgICAgICAgICAgICBlbGlmIG5vdCBmbGFreSBhbmQga25vd246CisgICAgICAgICAgICAgICAgc2VsZi5fbG9nLmluZm8oJ3VuZXhwZWN0ZWQgc3VjY2VzczogJXMnICUgdGVzdC5uYW1lKQorICAgICAgICAgICAgICAgIHNlbGYuX3VuZXhwZWN0ZWRfc3VjY2Vzcy5hcHBlbmQoaW5kZXgpCisgICAgICAgICAgICB0ZXN0LnN1Y2Nlc3MgPSBub3QgZmFpbGVkCisgICAgICAgICAgICB0ZXN0LnJldHVybmNvZGUgPSByZXR1cm5jb2RlCisgICAgICAgICAgICB0ZXN0LnJldHJ5X2NvdW50ID0gcmV0cnlfY291bnQKKyAgICAgICAgICAgIHRlc3QuZXhwaXJlZCA9IGV4cGlyZWQKKyAgICAgICAgICAgIHRlc3QuYXNfZXhwZWN0ZWQgPSBrbm93biA9PSBmYWlsZWQKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLmNvbmN1cnJlbnQ6CisgICAgICAgICAgICAgICAgc2VsZi5vdXQud3JpdGUoc2VsZi5fcmVzdWx0X3N0cmluZyh0ZXN0KSArICdcbicpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYub3V0LndyaXRlKHNlbGYuX2Zvcm1hdF90ZXN0KHRlc3QpKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5fbG9jay5yZWxlYXNlKCkKZGlmZiAtLWdpdCBhL3Rlc3QvY3Jvc3NydW5uZXIvcnVuLnB5IGIvdGVzdC9jcm9zc3J1bm5lci9ydW4ucHkKaW5kZXggZTMzMDBiYS4uZWY4ZmI2MCAxMDA2NDQKLS0tIGEvdGVzdC9jcm9zc3J1bm5lci9ydW4ucHkKKysrIGIvdGVzdC9jcm9zc3J1bm5lci9ydW4ucHkKQEAgLTI0LDI5NCArMjQsNDAyIEBACiBpbXBvcnQgcGxhdGZvcm0KIGltcG9ydCByYW5kb20KIGltcG9ydCBzb2NrZXQKLWltcG9ydCBzaWduYWwKIGltcG9ydCBzdWJwcm9jZXNzCi1pbXBvcnQgdGhyZWFkaW5nCitpbXBvcnQgc3lzCiBpbXBvcnQgdGltZQotaW1wb3J0IHRyYWNlYmFjawogCi1mcm9tIGNyb3NzcnVubmVyLnRlc3QgaW1wb3J0IFRlc3RFbnRyeSwgZG9tYWluX3NvY2tldF9wYXRoCi1mcm9tIGNyb3NzcnVubmVyLnJlcG9ydCBpbXBvcnQgRXhlY1JlcG9ydGVyLCBTdW1tYXJ5UmVwb3J0ZXIKK2Zyb20gLmNvbXBhdCBpbXBvcnQgc3RyX2pvaW4KK2Zyb20gLnJlcG9ydCBpbXBvcnQgRXhlY1JlcG9ydGVyLCBTdW1tYXJ5UmVwb3J0ZXIKK2Zyb20gLnRlc3QgaW1wb3J0IFRlc3RFbnRyeQorZnJvbSAudXRpbCBpbXBvcnQgZG9tYWluX3NvY2tldF9wYXRoCiAKLVJFU1VMVF9USU1FT1VUID0gMTI4CiBSRVNVTFRfRVJST1IgPSA2NAorUkVTVUxUX1RJTUVPVVQgPSAxMjgKK1NJR05PTkUgPSAwCitTSUdLSUxMID0gMTUKKworIyBnbG9iYWxzCitwb3J0cyA9IE5vbmUKK3N0b3AgPSBOb25lCiAKIAogY2xhc3MgRXhlY3V0aW9uQ29udGV4dChvYmplY3QpOgotICBkZWYgX19pbml0X18oc2VsZiwgY21kLCBjd2QsIGVudiwgcmVwb3J0KToKLSAgICBzZWxmLl9sb2cgPSBtdWx0aXByb2Nlc3NpbmcuZ2V0X2xvZ2dlcigpCi0gICAgc2VsZi5yZXBvcnQgPSByZXBvcnQKLSAgICBzZWxmLmNtZCA9IGNtZAotICAgIHNlbGYuY3dkID0gY3dkCi0gICAgc2VsZi5lbnYgPSBlbnYKLSAgICBzZWxmLnRpbWVyID0gTm9uZQotICAgIHNlbGYuZXhwaXJlZCA9IEZhbHNlCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNtZCwgY3dkLCBlbnYsIHN0b3Bfc2lnbmFsLCBpc19zZXJ2ZXIsIHJlcG9ydCk6CisgICAgICAgIHNlbGYuX2xvZyA9IG11bHRpcHJvY2Vzc2luZy5nZXRfbG9nZ2VyKCkKKyAgICAgICAgc2VsZi5jbWQgPSBjbWQKKyAgICAgICAgc2VsZi5jd2QgPSBjd2QKKyAgICAgICAgc2VsZi5lbnYgPSBlbnYKKyAgICAgICAgc2VsZi5zdG9wX3NpZ25hbCA9IHN0b3Bfc2lnbmFsCisgICAgICAgIHNlbGYuaXNfc2VydmVyID0gaXNfc2VydmVyCisgICAgICAgIHNlbGYucmVwb3J0ID0gcmVwb3J0CisgICAgICAgIHNlbGYuZXhwaXJlZCA9IEZhbHNlCisgICAgICAgIHNlbGYua2lsbGVkID0gRmFsc2UKKyAgICAgICAgc2VsZi5wcm9jID0gTm9uZQogCi0gIGRlZiBfZXhwaXJlKHNlbGYpOgotICAgIHNlbGYuX2xvZy5pbmZvKCdUaW1lb3V0JykKLSAgICBzZWxmLmV4cGlyZWQgPSBUcnVlCi0gICAgc2VsZi5raWxsKCkKKyAgICBkZWYgX3BvcGVuX2FyZ3Moc2VsZik6CisgICAgICAgIGFyZ3MgPSB7CisgICAgICAgICAgICAnY3dkJzogc2VsZi5jd2QsCisgICAgICAgICAgICAnZW52Jzogc2VsZi5lbnYsCisgICAgICAgICAgICAnc3Rkb3V0Jzogc2VsZi5yZXBvcnQub3V0LAorICAgICAgICAgICAgJ3N0ZGVycic6IHN1YnByb2Nlc3MuU1RET1VULAorICAgICAgICB9CisgICAgICAgICMgbWFrZSBzdXJlIGNoaWxkIHByb2Nlc3NlcyBkb2Vzbid0IHJlbWFpbiBhZnRlciBraWxsaW5nCisgICAgICAgIGlmIHBsYXRmb3JtLnN5c3RlbSgpID09ICdXaW5kb3dzJzoKKyAgICAgICAgICAgIERFVEFDSEVEX1BST0NFU1MgPSAweDAwMDAwMDA4CisgICAgICAgICAgICBhcmdzLnVwZGF0ZShjcmVhdGlvbmZsYWdzPURFVEFDSEVEX1BST0NFU1MgfCBzdWJwcm9jZXNzLkNSRUFURV9ORVdfUFJPQ0VTU19HUk9VUCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGFyZ3MudXBkYXRlKHByZWV4ZWNfZm49b3Muc2V0c2lkKQorICAgICAgICByZXR1cm4gYXJncwogCi0gIGRlZiBraWxsKHNlbGYpOgotICAgIHNlbGYuX2xvZy5kZWJ1ZygnS2lsbGluZyBwcm9jZXNzIDogJWQnICUgc2VsZi5wcm9jLnBpZCkKLSAgICBpZiBwbGF0Zm9ybS5zeXN0ZW0oKSAhPSAnV2luZG93cyc6Ci0gICAgICB0cnk6Ci0gICAgICAgIG9zLmtpbGxwZyhzZWxmLnByb2MucGlkLCBzaWduYWwuU0lHS0lMTCkKLSAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXJyOgotICAgICAgICBzZWxmLl9sb2cuaW5mbygnRmFpbGVkIHRvIGtpbGwgcHJvY2VzcyBncm91cCA6ICVzJyAlIHN0cihlcnIpKQotICAgIHRyeToKLSAgICAgIHNlbGYucHJvYy5raWxsKCkKLSAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGVycjoKLSAgICAgIHNlbGYuX2xvZy5pbmZvKCdGYWlsZWQgdG8ga2lsbCBwcm9jZXNzIDogJXMnICUgc3RyKGVycikpCi0gICAgc2VsZi5yZXBvcnQua2lsbGVkKCkKKyAgICBkZWYgc3RhcnQoc2VsZik6CisgICAgICAgIGpvaW5lZCA9IHN0cl9qb2luKCcgJywgc2VsZi5jbWQpCisgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnQ09NTUFORDogJXMnLCBqb2luZWQpCisgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnV09SS0RJUjogJXMnLCBzZWxmLmN3ZCkKKyAgICAgICAgc2VsZi5fbG9nLmRlYnVnKCdMT0dGSUxFOiAlcycsIHNlbGYucmVwb3J0LmxvZ3BhdGgpCisgICAgICAgIHNlbGYucmVwb3J0LmJlZ2luKCkKKyAgICAgICAgc2VsZi5wcm9jID0gc3VicHJvY2Vzcy5Qb3BlbihzZWxmLmNtZCwgKipzZWxmLl9wb3Blbl9hcmdzKCkpCisgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnICAgIFBJRDogJWQnLCBzZWxmLnByb2MucGlkKQorICAgICAgICBzZWxmLl9sb2cuZGVidWcoJyAgIFBHSUQ6ICVkJywgb3MuZ2V0cGdpZChzZWxmLnByb2MucGlkKSkKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Njb3BlZCgpCiAKLSAgZGVmIF9wb3Blbl9hcmdzKHNlbGYpOgotICAgIGFyZ3MgPSB7Ci0gICAgICAnY3dkJzogc2VsZi5jd2QsCi0gICAgICAnZW52Jzogc2VsZi5lbnYsCi0gICAgICAnc3Rkb3V0Jzogc2VsZi5yZXBvcnQub3V0LAotICAgICAgJ3N0ZGVycic6IHN1YnByb2Nlc3MuU1RET1VULAotICAgIH0KLSAgICAjIG1ha2Ugc3VyZSBjaGlsZCBwcm9jZXNzZXMgZG9lc24ndCByZW1haW4gYWZ0ZXIga2lsbGluZwotICAgIGlmIHBsYXRmb3JtLnN5c3RlbSgpID09ICdXaW5kb3dzJzoKLSAgICAgIERFVEFDSEVEX1BST0NFU1MgPSAweDAwMDAwMDA4Ci0gICAgICBhcmdzLnVwZGF0ZShjcmVhdGlvbmZsYWdzPURFVEFDSEVEX1BST0NFU1MgfCBzdWJwcm9jZXNzLkNSRUFURV9ORVdfUFJPQ0VTU19HUk9VUCkKLSAgICBlbHNlOgotICAgICAgYXJncy51cGRhdGUocHJlZXhlY19mbj1vcy5zZXRzaWQpCi0gICAgcmV0dXJuIGFyZ3MKKyAgICBAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgorICAgIGRlZiBfc2NvcGVkKHNlbGYpOgorICAgICAgICB5aWVsZCBzZWxmCisgICAgICAgIGlmIHNlbGYuaXNfc2VydmVyOgorICAgICAgICAgICAgIyB0aGUgc2VydmVyIGlzIHN1cHBvc2VkIHRvIHJ1biB1bnRpbCB3ZSBzdG9wIGl0CisgICAgICAgICAgICBpZiBzZWxmLnJldHVybmNvZGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5yZXBvcnQuZGllZCgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuc3RvcF9zaWduYWwgIT0gU0lHTk9ORToKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5zaWd3YWl0KHNlbGYuc3RvcF9zaWduYWwpOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXBvcnQuZW5kKHNlbGYucmV0dXJuY29kZSkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVwb3J0LmtpbGxlZCgpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zaWd3YWl0KFNJR0tJTEwpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIHRoZSBjbGllbnQgaXMgc3VwcG9zZWQgdG8gZXhpdCBub3JtYWxseQorICAgICAgICAgICAgaWYgc2VsZi5yZXR1cm5jb2RlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYucmVwb3J0LmVuZChzZWxmLnJldHVybmNvZGUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuc2lnd2FpdChTSUdLSUxMKQorICAgICAgICAgICAgICAgIHNlbGYucmVwb3J0LmtpbGxlZCgpCisgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnW3swfV0gZXhpdGVkIHdpdGggcmV0dXJuIGNvZGUgezF9Jy5mb3JtYXQoc2VsZi5wcm9jLnBpZCwgc2VsZi5yZXR1cm5jb2RlKSkKIAotICBkZWYgc3RhcnQoc2VsZiwgdGltZW91dD0wKToKLSAgICBzZWxmLl9sb2cuZGVidWcoJ0NPTU1BTkQ6ICVzJywgJyAnLmpvaW4oc2VsZi5jbWQpKQotICAgIHNlbGYuX2xvZy5kZWJ1ZygnV09SS0RJUjogJXMnLCBzZWxmLmN3ZCkKLSAgICBzZWxmLl9sb2cuZGVidWcoJ0xPR0ZJTEU6ICVzJywgc2VsZi5yZXBvcnQubG9ncGF0aCkKLSAgICBzZWxmLnJlcG9ydC5iZWdpbigpCi0gICAgc2VsZi5wcm9jID0gc3VicHJvY2Vzcy5Qb3BlbihzZWxmLmNtZCwgKipzZWxmLl9wb3Blbl9hcmdzKCkpCi0gICAgaWYgdGltZW91dCA+IDA6Ci0gICAgICBzZWxmLnRpbWVyID0gdGhyZWFkaW5nLlRpbWVyKHRpbWVvdXQsIHNlbGYuX2V4cGlyZSkKLSAgICAgIHNlbGYudGltZXIuc3RhcnQoKQotICAgIHJldHVybiBzZWxmLl9zY29wZWQoKQorICAgICMgU2VuZCBhIHNpZ25hbCB0byB0aGUgcHJvY2VzcyBhbmQgdGhlbiB3YWl0IGZvciBpdCB0byBlbmQKKyAgICAjIElmIHRoZSBzaWduYWwgcmVxdWVzdGVkIGlzIFNJR05PTkUsIG5vIHNpZ25hbCBpcyBzZW50LCBhbmQKKyAgICAjIGluc3RlYWQgd2UganVzdCB3YWl0IGZvciB0aGUgcHJvY2VzcyB0byBlbmQ7IGZ1cnRoZXIgaWYgaXQKKyAgICAjIGRvZXMgbm90IGVuZCBub3JtYWxseSB3aXRoIFNJR05PTkUsIHdlIG1hcmsgaXQgYXMgZXhwaXJlZC4KKyAgICAjIElmIHRoZSBwcm9jZXNzIGZhaWxzIHRvIGVuZCBhbmQgdGhlIHNpZ25hbCBpcyBub3QgU0lHS0lMTCwKKyAgICAjIGl0IHJlLXJ1bnMgd2l0aCBTSUdLSUxMIHNvIHRoYXQgYSByZWFsIHByb2Nlc3Mga2lsbCBvY2N1cnMKKyAgICAjIHJldHVybnMgVHJ1ZSBpZiB0aGUgcHJvY2VzcyBlbmRlZCwgRmFsc2UgaWYgaXQgbWF5IG5vdCBoYXZlCisgICAgZGVmIHNpZ3dhaXQoc2VsZiwgc2lnPVNJR0tJTEwsIHRpbWVvdXQ9Mik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHNpZyAhPSBTSUdOT05FOgorICAgICAgICAgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnW3swfV0gc2VuZCBzaWduYWwgezF9Jy5mb3JtYXQoc2VsZi5wcm9jLnBpZCwgc2lnKSkKKyAgICAgICAgICAgICAgICBpZiBzaWcgPT0gU0lHS0lMTDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5raWxsZWQgPSBUcnVlCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBpZiBwbGF0Zm9ybS5zeXN0ZW0oKSAhPSAnV2luZG93cyc6CisgICAgICAgICAgICAgICAgICAgICAgICBvcy5raWxscGcob3MuZ2V0cGdpZChzZWxmLnByb2MucGlkKSwgc2lnKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wcm9jLnNlbmRfc2lnbmFsKHNpZykKKyAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9sb2cuaW5mbygnW3swfV0gRmFpbGVkIHRvIGtpbGwgcHJvY2VzcycuZm9ybWF0KHNlbGYucHJvYy5waWQpLCBleGNfaW5mbz1zeXMuZXhjX2luZm8oKSkKKyAgICAgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnW3swfV0gd2FpdCBiZWdpbiwgdGltZW91dCB7MX0gc2VjKHMpJy5mb3JtYXQoc2VsZi5wcm9jLnBpZCwgdGltZW91dCkpCisgICAgICAgICAgICBzZWxmLnByb2MuY29tbXVuaWNhdGUodGltZW91dD10aW1lb3V0KQorICAgICAgICAgICAgc2VsZi5fbG9nLmRlYnVnKCdbezB9XSBwcm9jZXNzIGVuZGVkIHdpdGggcmV0dXJuIGNvZGUgezF9Jy5mb3JtYXQoc2VsZi5wcm9jLnBpZCwgc2VsZi5yZXR1cm5jb2RlKSkKKyAgICAgICAgICAgIHNlbGYucmVwb3J0LmVuZChzZWxmLnJldHVybmNvZGUpCisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBleGNlcHQgc3VicHJvY2Vzcy5UaW1lb3V0RXhwaXJlZDoKKyAgICAgICAgICAgIHNlbGYuX2xvZy5pbmZvKCdbezB9XSB0aW1lb3V0IHdhaXRpbmcgZm9yIHByb2Nlc3MgdG8gZW5kJy5mb3JtYXQoc2VsZi5wcm9jLnBpZCkpCisgICAgICAgICAgICBpZiBzaWcgPT0gU0lHTk9ORToKKyAgICAgICAgICAgICAgICBzZWxmLmV4cGlyZWQgPSBUcnVlCisgICAgICAgICAgICByZXR1cm4gRmFsc2UgaWYgc2lnID09IFNJR0tJTEwgZWxzZSBzZWxmLnNpZ3dhaXQoU0lHS0lMTCwgMSkKIAotICBAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgotICBkZWYgX3Njb3BlZChzZWxmKToKLSAgICB5aWVsZCBzZWxmCi0gICAgc2VsZi5fbG9nLmRlYnVnKCdLaWxsaW5nIHNjb3BlZCBwcm9jZXNzJykKLSAgICBzZWxmLmtpbGwoKQorICAgICMgY2FsbGVkIG9uIHRoZSBjbGllbnQgcHJvY2VzcyB0byB3YWl0IGZvciBpdCB0byBlbmQgbmF0dXJhbGx5CisgICAgZGVmIHdhaXQoc2VsZiwgdGltZW91dCk6CisgICAgICAgIHNlbGYuc2lnd2FpdChTSUdOT05FLCB0aW1lb3V0KQogCi0gIGRlZiB3YWl0KHNlbGYpOgotICAgIHNlbGYucHJvYy5jb21tdW5pY2F0ZSgpCi0gICAgaWYgc2VsZi50aW1lcjoKLSAgICAgIHNlbGYudGltZXIuY2FuY2VsKCkKLSAgICBzZWxmLnJlcG9ydC5lbmQoc2VsZi5yZXR1cm5jb2RlKQotCi0gIEBwcm9wZXJ0eQotICBkZWYgcmV0dXJuY29kZShzZWxmKToKLSAgICByZXR1cm4gc2VsZi5wcm9jLnJldHVybmNvZGUgaWYgc2VsZi5wcm9jIGVsc2UgTm9uZQorICAgIEBwcm9wZXJ0eQorICAgIGRlZiByZXR1cm5jb2RlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5wcm9jLnJldHVybmNvZGUgaWYgc2VsZi5wcm9jIGVsc2UgTm9uZQogCiAKLWRlZiBleGVjX2NvbnRleHQocG9ydCwgdGVzdGRpciwgdGVzdCwgcHJvZyk6Ci0gIHJlcG9ydCA9IEV4ZWNSZXBvcnRlcih0ZXN0ZGlyLCB0ZXN0LCBwcm9nKQotICBwcm9nLmJ1aWxkX2NvbW1hbmQocG9ydCkKLSAgcmV0dXJuIEV4ZWN1dGlvbkNvbnRleHQocHJvZy5jb21tYW5kLCBwcm9nLndvcmtkaXIsIHByb2cuZW52LCByZXBvcnQpCitkZWYgZXhlY19jb250ZXh0KHBvcnQsIGxvZ2RpciwgdGVzdCwgcHJvZywgaXNfc2VydmVyKToKKyAgICByZXBvcnQgPSBFeGVjUmVwb3J0ZXIobG9nZGlyLCB0ZXN0LCBwcm9nKQorICAgIHByb2cuYnVpbGRfY29tbWFuZChwb3J0KQorICAgIHJldHVybiBFeGVjdXRpb25Db250ZXh0KHByb2cuY29tbWFuZCwgcHJvZy53b3JrZGlyLCBwcm9nLmVudiwgcHJvZy5zdG9wX3NpZ25hbCwgaXNfc2VydmVyLCByZXBvcnQpCiAKIAotZGVmIHJ1bl90ZXN0KHRlc3RkaXIsIHRlc3RfZGljdCwgYXN5bmM9VHJ1ZSwgbWF4X3JldHJ5PTMpOgotICB0cnk6CitkZWYgcnVuX3Rlc3QodGVzdGRpciwgbG9nZGlyLCB0ZXN0X2RpY3QsIG1heF9yZXRyeSwgYXN5bmNfbW9kZT1UcnVlKToKICAgICBsb2dnZXIgPSBtdWx0aXByb2Nlc3NpbmcuZ2V0X2xvZ2dlcigpCi0gICAgcmV0cnlfY291bnQgPSAwCi0gICAgdGVzdCA9IFRlc3RFbnRyeSh0ZXN0ZGlyLCAqKnRlc3RfZGljdCkKLSAgICB3aGlsZSBUcnVlOgotICAgICAgaWYgc3RvcC5pc19zZXQoKToKLSAgICAgICAgbG9nZ2VyLmRlYnVnKCdTa2lwcGluZyBiZWNhdXNlIHNodXR0aW5nIGRvd24nKQotICAgICAgICByZXR1cm4gTm9uZQotICAgICAgbG9nZ2VyLmRlYnVnKCdTdGFydCcpCi0gICAgICB3aXRoIFBvcnRBbGxvY2F0b3IuYWxsb2NfcG9ydF9zY29wZWQocG9ydHMsIHRlc3Quc29ja2V0KSBhcyBwb3J0OgotICAgICAgICBsb2dnZXIuZGVidWcoJ1N0YXJ0IHdpdGggcG9ydCAlZCcgJSBwb3J0KQotICAgICAgICBzdiA9IGV4ZWNfY29udGV4dChwb3J0LCB0ZXN0ZGlyLCB0ZXN0LCB0ZXN0LnNlcnZlcikKLSAgICAgICAgY2wgPSBleGVjX2NvbnRleHQocG9ydCwgdGVzdGRpciwgdGVzdCwgdGVzdC5jbGllbnQpCiAKLSAgICAgICAgbG9nZ2VyLmRlYnVnKCdTdGFydGluZyBzZXJ2ZXInKQotICAgICAgICB3aXRoIHN2LnN0YXJ0KCk6Ci0gICAgICAgICAgaWYgdGVzdC5kZWxheSA+IDA6Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0RlbGF5aW5nIGNsaWVudCBmb3IgJS4yZiBzZWNvbmRzJyAlIHRlc3QuZGVsYXkpCi0gICAgICAgICAgICB0aW1lLnNsZWVwKHRlc3QuZGVsYXkpCi0gICAgICAgICAgY2xfcmV0cnlfY291bnQgPSAwCi0gICAgICAgICAgY2xfbWF4X3JldHJ5ID0gMTAKLSAgICAgICAgICBjbF9yZXRyeV93YWl0ID0gMC41Ci0gICAgICAgICAgd2hpbGUgVHJ1ZToKLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnU3RhcnRpbmcgY2xpZW50JykKLSAgICAgICAgICAgIGNsLnN0YXJ0KHRlc3QudGltZW91dCkKLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnV2FpdGluZyBjbGllbnQnKQotICAgICAgICAgICAgY2wud2FpdCgpCi0gICAgICAgICAgICBpZiBub3QgY2wucmVwb3J0Lm1heWJlX2ZhbHNlX3Bvc2l0aXZlKCkgb3IgY2xfcmV0cnlfY291bnQgPj0gY2xfbWF4X3JldHJ5OgotICAgICAgICAgICAgICBpZiBjbF9yZXRyeV9jb3VudCA+IDAgYW5kIGNsX3JldHJ5X2NvdW50IDwgY2xfbWF4X3JldHJ5OgotICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCdbJXNdOiBDb25uZWN0ZWQgYWZ0ZXIgJWQgcmV0cnkgKCUuMmYgc2VjIGVhY2gpJyAlICh0ZXN0LnNlcnZlci5uYW1lLCBjbF9yZXRyeV9jb3VudCwgY2xfcmV0cnlfd2FpdCkpCi0gICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1NlcnZlciBtYXkgbm90IGJlIHJlYWR5LCB3YWl0aW5nICUuMmYgc2Vjb25kLi4uJyAlIGNsX3JldHJ5X3dhaXQpCi0gICAgICAgICAgICB0aW1lLnNsZWVwKGNsX3JldHJ5X3dhaXQpCi0gICAgICAgICAgICBjbF9yZXRyeV9jb3VudCArPSAxCisgICAgZGVmIGVuc3VyZV9zb2NrZXRfb3BlbihzdiwgcG9ydCwgdGVzdCk6CisgICAgICAgIHNsZXB0ID0gMC4xCisgICAgICAgIHRpbWUuc2xlZXAoc2xlcHQpCisgICAgICAgIHNsZWVwX3N0ZXAgPSAwLjEKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGlmIHNsZXB0ID4gdGVzdC5kZWxheToKKyAgICAgICAgICAgICAgICBsb2dnZXIud2FybignW3swfV0gc2xlcHQgZm9yIHsxfSBzZWNvbmRzIGJ1dCBzZXJ2ZXIgaXMgbm90IG9wZW4nLmZvcm1hdChzdi5wcm9jLnBpZCwgc2xlcHQpKQorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAgICAgaWYgdGVzdC5zb2NrZXQgPT0gJ2RvbWFpbic6CisgICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGRvbWFpbl9zb2NrZXRfcGF0aChwb3J0KSk6CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnW3swfV0gZG9tYWluKHVuaXgpIHNvY2tldCBub3QgYXZhaWxhYmxlIHlldC4gc2xlcHQgZm9yIHsxfSBzZWNvbmRzIHNvIGZhcicuZm9ybWF0KHN2LnByb2MucGlkLCBzbGVwdCkpCisgICAgICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAoc2xlZXBfc3RlcCkKKyAgICAgICAgICAgICAgICAgICAgc2xlcHQgKz0gc2xlZXBfc3RlcAorICAgICAgICAgICAgZWxpZiB0ZXN0LnNvY2tldCA9PSAnYWJzdHJhY3QnOgorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgQ3JlYXRlIHNvY2tldHMgZXZlcnkgaXRlcmF0aW9uIGJlY2F1c2UgcmVmdXNlZCBzb2NrZXRzIGNhbm5vdCBiZQorICAgICAgICAgICAgICAgICMgcmV1c2VkIG9uIHNvbWUgc3lzdGVtcy4KKyAgICAgICAgICAgICAgICBzb2NrNCA9IHNvY2tldC5zb2NrZXQoKQorICAgICAgICAgICAgICAgIHNvY2s2ID0gc29ja2V0LnNvY2tldChmYW1pbHk9c29ja2V0LkFGX0lORVQ2KQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgaWYgc29jazQuY29ubmVjdF9leCgoJzEyNy4wLjAuMScsIHBvcnQpKSA9PSAwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBzb2NrNi5jb25uZWN0X2V4KCgnOjoxJywgcG9ydCkpID09IDA6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgICAgICAgICBpZiBzdi5wcm9jLnBvbGwoKSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCdbezB9XSBzZXJ2ZXIgcHJvY2VzcyBpcyBleGl0ZWQnLmZvcm1hdChzdi5wcm9jLnBpZCkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdbezB9XSBzb2NrZXQgbm90IGF2YWlsYWJsZSB5ZXQuIHNsZXB0IGZvciB7MX0gc2Vjb25kcyBzbyBmYXInLmZvcm1hdChzdi5wcm9jLnBpZCwgc2xlcHQpKQorICAgICAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKHNsZWVwX3N0ZXApCisgICAgICAgICAgICAgICAgICAgIHNsZXB0ICs9IHNsZWVwX3N0ZXAKKyAgICAgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgICAgICBzb2NrNC5jbG9zZSgpCisgICAgICAgICAgICAgICAgICAgIHNvY2s2LmNsb3NlKCkKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnW3swfV0gc2VydmVyIHJlYWR5IC0gd2FpdGVkIGZvciB7MX0gc2Vjb25kcycuZm9ybWF0KHN2LnByb2MucGlkLCBzbGVwdCkpCisgICAgICAgICAgICByZXR1cm4gVHJ1ZQogCi0gICAgICBpZiBub3Qgc3YucmVwb3J0Lm1heWJlX2ZhbHNlX3Bvc2l0aXZlKCkgb3IgcmV0cnlfY291bnQgPj0gbWF4X3JldHJ5OgotICAgICAgICBsb2dnZXIuZGVidWcoJ0ZpbmlzaCcpCi0gICAgICAgIHJldHVybiBSRVNVTFRfVElNRU9VVCBpZiBjbC5leHBpcmVkIGVsc2UgY2wucHJvYy5yZXR1cm5jb2RlCi0gICAgICBsb2dnZXIud2FybignWyVzXTogRGV0ZWN0ZWQgc29ja2V0IGJpbmQgZmFpbHVyZSwgcmV0cnlpbmcuLi4nICUgdGVzdC5zZXJ2ZXIubmFtZSkKLSAgICAgIHJldHJ5X2NvdW50ICs9IDEKLSAgZXhjZXB0IChLZXlib2FyZEludGVycnVwdCwgU3lzdGVtRXhpdCk6Ci0gICAgbG9nZ2VyLmluZm8oJ0ludGVycnVwdGVkIGV4ZWN1dGlvbicpCi0gICAgaWYgbm90IGFzeW5jOgotICAgICAgcmFpc2UKLSAgICBzdG9wLnNldCgpCi0gICAgcmV0dXJuIE5vbmUKLSAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleDoKLSAgICBsb2dnZXIud2FybignRXJyb3Igd2hpbGUgZXhlY3V0aW5nIHRlc3QgOiAlcycgJSBzdHIoZXgpKQotICAgIGlmIG5vdCBhc3luYzoKLSAgICAgIHJhaXNlCi0gICAgbG9nZ2VyLmluZm8odHJhY2ViYWNrLnByaW50X2V4YygpKQotICAgIHJldHVybiBSRVNVTFRfRVJST1IKKyAgICB0cnk6CisgICAgICAgIG1heF9iaW5kX3JldHJ5ID0gMworICAgICAgICByZXRyeV9jb3VudCA9IDAKKyAgICAgICAgYmluZF9yZXRyeV9jb3VudCA9IDAKKyAgICAgICAgdGVzdCA9IFRlc3RFbnRyeSh0ZXN0ZGlyLCAqKnRlc3RfZGljdCkKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGlmIHN0b3AuaXNfc2V0KCk6CisgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdTa2lwcGluZyBiZWNhdXNlIHNodXR0aW5nIGRvd24nKQorICAgICAgICAgICAgICAgIHJldHVybiAocmV0cnlfY291bnQsIE5vbmUpCisgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1N0YXJ0JykKKyAgICAgICAgICAgIHdpdGggUG9ydEFsbG9jYXRvci5hbGxvY19wb3J0X3Njb3BlZChwb3J0cywgdGVzdC5zb2NrZXQpIGFzIHBvcnQ6CisgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdTdGFydCB3aXRoIHBvcnQgJWQnICUgcG9ydCkKKyAgICAgICAgICAgICAgICBzdiA9IGV4ZWNfY29udGV4dChwb3J0LCBsb2dkaXIsIHRlc3QsIHRlc3Quc2VydmVyLCBUcnVlKQorICAgICAgICAgICAgICAgIGNsID0gZXhlY19jb250ZXh0KHBvcnQsIGxvZ2RpciwgdGVzdCwgdGVzdC5jbGllbnQsIEZhbHNlKQorCisgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdTdGFydGluZyBzZXJ2ZXInKQorICAgICAgICAgICAgICAgIHdpdGggc3Yuc3RhcnQoKToKKyAgICAgICAgICAgICAgICAgICAgcG9ydF9vayA9IGVuc3VyZV9zb2NrZXRfb3BlbihzdiwgcG9ydCwgdGVzdCkKKyAgICAgICAgICAgICAgICAgICAgaWYgcG9ydF9vazoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RfcmV0cnlfY291bnQgPSAwCisgICAgICAgICAgICAgICAgICAgICAgICBtYXhfY29ubmVjdF9yZXRyeSA9IDEyCisgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0X3JldHJ5X3dhaXQgPSAwLjI1CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHN2LnByb2MucG9sbCgpIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygnbm90IHN0YXJ0aW5nIGNsaWVudCBiZWNhdXNlIHNlcnZlciBwcm9jZXNzIGlzIGFic2VudCcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdTdGFydGluZyBjbGllbnQnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsLnN0YXJ0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1dhaXRpbmcgY2xpZW50ICh1cCB0byAlZCBzZWNzKScgJSB0ZXN0LnRpbWVvdXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2wud2FpdCh0ZXN0LnRpbWVvdXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGNsLnJlcG9ydC5tYXliZV9mYWxzZV9wb3NpdGl2ZSgpIG9yIGNvbm5lY3RfcmV0cnlfY291bnQgPj0gbWF4X2Nvbm5lY3RfcmV0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGNvbm5lY3RfcmV0cnlfY291bnQgPiAwIGFuZCBjb25uZWN0X3JldHJ5X2NvdW50IDwgbWF4X2Nvbm5lY3RfcmV0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygnWyVzXTogQ29ubmVjdGVkIGFmdGVyICVkIHJldHJ5ICglLjJmIHNlYyBlYWNoKScgJSAodGVzdC5zZXJ2ZXIubmFtZSwgY29ubmVjdF9yZXRyeV9jb3VudCwgY29ubmVjdF9yZXRyeV93YWl0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBXYWl0IGZvciA1MG1zIHRvIHNlZSBpZiBzZXJ2ZXIgZG9lcyBub3QgZGllIGF0IHRoZSBlbmQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAoMC4wNSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1NlcnZlciBtYXkgbm90IGJlIHJlYWR5LCB3YWl0aW5nICUuMmYgc2Vjb25kLi4uJyAlIGNvbm5lY3RfcmV0cnlfd2FpdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKGNvbm5lY3RfcmV0cnlfd2FpdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0X3JldHJ5X2NvdW50ICs9IDEKKworICAgICAgICAgICAgaWYgc3YucmVwb3J0Lm1heWJlX2ZhbHNlX3Bvc2l0aXZlKCkgYW5kIGJpbmRfcmV0cnlfY291bnQgPCBtYXhfYmluZF9yZXRyeToKKyAgICAgICAgICAgICAgICBsb2dnZXIud2FybignWyVzXTogRGV0ZWN0ZWQgc29ja2V0IGJpbmQgZmFpbHVyZSwgcmV0cnlpbmcuLi4nLCB0ZXN0LnNlcnZlci5uYW1lKQorICAgICAgICAgICAgICAgIGJpbmRfcmV0cnlfY291bnQgKz0gMQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBSRVNVTFRfVElNRU9VVCBpZiBjbC5leHBpcmVkIGVsc2UgY2wucmV0dXJuY29kZSBpZiAoY2wucHJvYyBhbmQgY2wucHJvYy5wb2xsKCkpIGlzIG5vdCBOb25lIGVsc2UgUkVTVUxUX0VSUk9SCisKKyAgICAgICAgICAgICAgICAjIEZvciBzZXJ2ZXJzIHRoYXQgaGFuZGxlIGEgY29udHJvbGxlZCBzaHV0ZG93biBieSBzaWduYWwKKyAgICAgICAgICAgICAgICAjIGlmIHRoZXkgYXJlIGtpbGxlZCwgb3IgcmV0dXJuIGFuIGVycm9yIGNvZGUsIHRoYXQgaXMgYQorICAgICAgICAgICAgICAgICMgcHJvYmxlbS4gIEZvciBzZXJ2ZXJzIHRoYXQgYXJlIG5vdCBzaWduYWwtYXdhcmUsIHdlIHNpbXBseQorICAgICAgICAgICAgICAgICMga2lsbCB0aGVtIG9mZjsgaWYgd2UgZGlkbid0IGtpbGwgdGhlbSBvZmYsIHNvbWV0aGluZyBlbHNlCisgICAgICAgICAgICAgICAgIyBoYXBwZW5lZCAoY3Jhc2hlZD8pCisgICAgICAgICAgICAgICAgaWYgdGVzdC5zZXJ2ZXIuc3RvcF9zaWduYWwgIT0gMDoKKyAgICAgICAgICAgICAgICAgICAgaWYgc3Yua2lsbGVkIG9yIHN2LnJldHVybmNvZGUgPiAwOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0IHw9IFJFU1VMVF9FUlJPUgorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBzdi5raWxsZWQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgfD0gUkVTVUxUX0VSUk9SCisKKyAgICAgICAgICAgICAgICBpZiByZXN1bHQgPT0gMCBvciByZXRyeV9jb3VudCA+PSBtYXhfcmV0cnk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAocmV0cnlfY291bnQsIHJlc3VsdCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygnWyVzLSVzXTogdGVzdCBmYWlsZWQsIHJldHJ5aW5nLi4uJywgdGVzdC5zZXJ2ZXIubmFtZSwgdGVzdC5jbGllbnQubmFtZSkKKyAgICAgICAgICAgICAgICAgICAgcmV0cnlfY291bnQgKz0gMQorICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgIGlmIG5vdCBhc3luY19tb2RlOgorICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgbG9nZ2VyLndhcm4oJ0Vycm9yIGV4ZWN1dGluZyBbJXNdJywgdGVzdC5uYW1lLCBleGNfaW5mbz1UcnVlKQorICAgICAgICByZXR1cm4gKHJldHJ5X2NvdW50LCBSRVNVTFRfRVJST1IpCisgICAgZXhjZXB0OgorICAgICAgICBsb2dnZXIuaW5mbygnSW50ZXJydXB0ZWQgZXhlY3V0aW9uJywgZXhjX2luZm89VHJ1ZSkKKyAgICAgICAgaWYgbm90IGFzeW5jX21vZGU6CisgICAgICAgICAgICByYWlzZQorICAgICAgICBzdG9wLnNldCgpCisgICAgICAgIHJldHVybiAocmV0cnlfY291bnQsIFJFU1VMVF9FUlJPUikKIAogCiBjbGFzcyBQb3J0QWxsb2NhdG9yKG9iamVjdCk6Ci0gIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICBzZWxmLl9sb2cgPSBtdWx0aXByb2Nlc3NpbmcuZ2V0X2xvZ2dlcigpCi0gICAgc2VsZi5fbG9jayA9IG11bHRpcHJvY2Vzc2luZy5Mb2NrKCkKLSAgICBzZWxmLl9wb3J0cyA9IHNldCgpCi0gICAgc2VsZi5fZG9tX3BvcnRzID0gc2V0KCkKLSAgICBzZWxmLl9sYXN0X2FsbG9jID0gMAorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5fbG9nID0gbXVsdGlwcm9jZXNzaW5nLmdldF9sb2dnZXIoKQorICAgICAgICBzZWxmLl9sb2NrID0gbXVsdGlwcm9jZXNzaW5nLkxvY2soKQorICAgICAgICBzZWxmLl9wb3J0cyA9IHNldCgpCisgICAgICAgIHNlbGYuX2RvbV9wb3J0cyA9IHNldCgpCisgICAgICAgIHNlbGYuX2xhc3RfYWxsb2MgPSAwCiAKLSAgZGVmIF9nZXRfdGNwX3BvcnQoc2VsZik6Ci0gICAgc29jayA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKLSAgICBzb2NrLmJpbmQoKCcxMjcuMC4wLjEnLCAwKSkKLSAgICBwb3J0ID0gc29jay5nZXRzb2NrbmFtZSgpWzFdCi0gICAgc2VsZi5fbG9jay5hY3F1aXJlKCkKLSAgICB0cnk6Ci0gICAgICBvayA9IHBvcnQgbm90IGluIHNlbGYuX3BvcnRzCi0gICAgICBpZiBvazoKLSAgICAgICAgc2VsZi5fcG9ydHMuYWRkKHBvcnQpCi0gICAgICAgIHNlbGYuX2xhc3RfYWxsb2MgPSB0aW1lLnRpbWUoKQotICAgIGZpbmFsbHk6Ci0gICAgICBzZWxmLl9sb2NrLnJlbGVhc2UoKQotICAgICAgc29jay5jbG9zZSgpCi0gICAgcmV0dXJuIHBvcnQgaWYgb2sgZWxzZSBzZWxmLl9nZXRfdGNwX3BvcnQoKQorICAgIGRlZiBfZ2V0X3RjcF9wb3J0KHNlbGYpOgorICAgICAgICBzb2NrID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQorICAgICAgICBzb2NrLnNldHNvY2tvcHQoc29ja2V0LlNPTF9TT0NLRVQsIHNvY2tldC5TT19SRVVTRUFERFIsIDEpCisgICAgICAgIHNvY2suYmluZCgoJycsIDApKQorICAgICAgICBwb3J0ID0gc29jay5nZXRzb2NrbmFtZSgpWzFdCisgICAgICAgIHNlbGYuX2xvY2suYWNxdWlyZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9rID0gcG9ydCBub3QgaW4gc2VsZi5fcG9ydHMKKyAgICAgICAgICAgIGlmIG9rOgorICAgICAgICAgICAgICAgIHNlbGYuX3BvcnRzLmFkZChwb3J0KQorICAgICAgICAgICAgICAgIHNlbGYuX2xhc3RfYWxsb2MgPSB0aW1lLnRpbWUoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5fbG9jay5yZWxlYXNlKCkKKyAgICAgICAgICAgIHNvY2suY2xvc2UoKQorICAgICAgICByZXR1cm4gcG9ydCBpZiBvayBlbHNlIHNlbGYuX2dldF90Y3BfcG9ydCgpCiAKLSAgZGVmIF9nZXRfZG9tYWluX3BvcnQoc2VsZik6Ci0gICAgcG9ydCA9IHJhbmRvbS5yYW5kaW50KDEwMjQsIDY1NTM2KQotICAgIHNlbGYuX2xvY2suYWNxdWlyZSgpCi0gICAgdHJ5OgotICAgICAgb2sgPSBwb3J0IG5vdCBpbiBzZWxmLl9kb21fcG9ydHMKLSAgICAgIGlmIG9rOgotICAgICAgICBzZWxmLl9kb21fcG9ydHMuYWRkKHBvcnQpCi0gICAgZmluYWxseToKLSAgICAgIHNlbGYuX2xvY2sucmVsZWFzZSgpCi0gICAgcmV0dXJuIHBvcnQgaWYgb2sgZWxzZSBzZWxmLl9nZXRfZG9tYWluX3BvcnQoKQorICAgIGRlZiBfZ2V0X2RvbWFpbl9wb3J0KHNlbGYpOgorICAgICAgICBwb3J0ID0gcmFuZG9tLnJhbmRpbnQoMTAyNCwgNjU1MzYpCisgICAgICAgIHNlbGYuX2xvY2suYWNxdWlyZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9rID0gcG9ydCBub3QgaW4gc2VsZi5fZG9tX3BvcnRzCisgICAgICAgICAgICBpZiBvazoKKyAgICAgICAgICAgICAgICBzZWxmLl9kb21fcG9ydHMuYWRkKHBvcnQpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLl9sb2NrLnJlbGVhc2UoKQorICAgICAgICByZXR1cm4gcG9ydCBpZiBvayBlbHNlIHNlbGYuX2dldF9kb21haW5fcG9ydCgpCiAKLSAgZGVmIGFsbG9jX3BvcnQoc2VsZiwgc29ja2V0X3R5cGUpOgotICAgIGlmIHNvY2tldF90eXBlID09ICdkb21haW4nOgotICAgICAgcmV0dXJuIHNlbGYuX2dldF9kb21haW5fcG9ydCgpCi0gICAgZWxzZToKLSAgICAgIHJldHVybiBzZWxmLl9nZXRfdGNwX3BvcnQoKQorICAgIGRlZiBhbGxvY19wb3J0KHNlbGYsIHNvY2tldF90eXBlKToKKyAgICAgICAgaWYgc29ja2V0X3R5cGUgaW4gKCdkb21haW4nLCAnYWJzdHJhY3QnKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9nZXRfZG9tYWluX3BvcnQoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2dldF90Y3BfcG9ydCgpCiAKLSAgIyBzdGF0aWMgbWV0aG9kIGZvciBpbnRlci1wcm9jZXNzIGludm9rYXRpb24KLSAgQHN0YXRpY21ldGhvZAotICBAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgotICBkZWYgYWxsb2NfcG9ydF9zY29wZWQoYWxsb2NhdG9yLCBzb2NrZXRfdHlwZSk6Ci0gICAgcG9ydCA9IGFsbG9jYXRvci5hbGxvY19wb3J0KHNvY2tldF90eXBlKQotICAgIHlpZWxkIHBvcnQKLSAgICBhbGxvY2F0b3IuZnJlZV9wb3J0KHNvY2tldF90eXBlLCBwb3J0KQorICAgICMgc3RhdGljIG1ldGhvZCBmb3IgaW50ZXItcHJvY2VzcyBpbnZva2F0aW9uCisgICAgQHN0YXRpY21ldGhvZAorICAgIEBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCisgICAgZGVmIGFsbG9jX3BvcnRfc2NvcGVkKGFsbG9jYXRvciwgc29ja2V0X3R5cGUpOgorICAgICAgICBwb3J0ID0gYWxsb2NhdG9yLmFsbG9jX3BvcnQoc29ja2V0X3R5cGUpCisgICAgICAgIHlpZWxkIHBvcnQKKyAgICAgICAgYWxsb2NhdG9yLmZyZWVfcG9ydChzb2NrZXRfdHlwZSwgcG9ydCkKIAotICBkZWYgZnJlZV9wb3J0KHNlbGYsIHNvY2tldF90eXBlLCBwb3J0KToKLSAgICBzZWxmLl9sb2cuZGVidWcoJ2ZyZWVfcG9ydCcpCi0gICAgc2VsZi5fbG9jay5hY3F1aXJlKCkKLSAgICB0cnk6Ci0gICAgICBpZiBzb2NrZXRfdHlwZSA9PSAnZG9tYWluJzoKLSAgICAgICAgc2VsZi5fZG9tX3BvcnRzLnJlbW92ZShwb3J0KQotICAgICAgICBwYXRoID0gZG9tYWluX3NvY2tldF9wYXRoKHBvcnQpCi0gICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHBhdGgpOgotICAgICAgICAgIG9zLnJlbW92ZShwYXRoKQotICAgICAgZWxzZToKLSAgICAgICAgc2VsZi5fcG9ydHMucmVtb3ZlKHBvcnQpCi0gICAgZXhjZXB0IElPRXJyb3IgYXMgZXJyOgotICAgICAgc2VsZi5fbG9nLmluZm8oJ0Vycm9yIHdoaWxlIGZyZWVpbmcgcG9ydCA6ICVzJyAlIHN0cihlcnIpKQotICAgIGZpbmFsbHk6Ci0gICAgICBzZWxmLl9sb2NrLnJlbGVhc2UoKQorICAgIGRlZiBmcmVlX3BvcnQoc2VsZiwgc29ja2V0X3R5cGUsIHBvcnQpOgorICAgICAgICBzZWxmLl9sb2cuZGVidWcoJ2ZyZWVfcG9ydCcpCisgICAgICAgIHNlbGYuX2xvY2suYWNxdWlyZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHNvY2tldF90eXBlID09ICdkb21haW4nOgorICAgICAgICAgICAgICAgIHNlbGYuX2RvbV9wb3J0cy5yZW1vdmUocG9ydCkKKyAgICAgICAgICAgICAgICBwYXRoID0gZG9tYWluX3NvY2tldF9wYXRoKHBvcnQpCisgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocGF0aCk6CisgICAgICAgICAgICAgICAgICAgIG9zLnJlbW92ZShwYXRoKQorICAgICAgICAgICAgZWxpZiBzb2NrZXRfdHlwZSA9PSAnYWJzdHJhY3QnOgorICAgICAgICAgICAgICAgIHNlbGYuX2RvbV9wb3J0cy5yZW1vdmUocG9ydCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5fcG9ydHMucmVtb3ZlKHBvcnQpCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgc2VsZi5fbG9nLmluZm8oJ0Vycm9yIHdoaWxlIGZyZWVpbmcgcG9ydCcsIGV4Y19pbmZvPXN5cy5leGNfaW5mbygpKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5fbG9jay5yZWxlYXNlKCkKIAogCiBjbGFzcyBOb25Bc3luY1Jlc3VsdChvYmplY3QpOgotICBkZWYgX19pbml0X18oc2VsZiwgdmFsdWUpOgotICAgIHNlbGYuX3ZhbHVlID0gdmFsdWUKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsdWUpOgorICAgICAgICBzZWxmLl92YWx1ZSA9IHZhbHVlCiAKLSAgZGVmIGdldChzZWxmLCB0aW1lb3V0PU5vbmUpOgotICAgIHJldHVybiBzZWxmLl92YWx1ZQorICAgIGRlZiBnZXQoc2VsZiwgdGltZW91dD1Ob25lKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3ZhbHVlCiAKLSAgZGVmIHdhaXQoc2VsZiwgdGltZW91dD1Ob25lKToKLSAgICBwYXNzCisgICAgZGVmIHdhaXQoc2VsZiwgdGltZW91dD1Ob25lKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkeShzZWxmKToKLSAgICByZXR1cm4gVHJ1ZQorICAgIGRlZiByZWFkeShzZWxmKToKKyAgICAgICAgcmV0dXJuIFRydWUKIAotICBkZWYgc3VjY2Vzc2Z1bChzZWxmKToKLSAgICByZXR1cm4gc2VsZi5fdmFsdWUgPT0gMAorICAgIGRlZiBzdWNjZXNzZnVsKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fdmFsdWUgPT0gMAogCiAKIGNsYXNzIFRlc3REaXNwYXRjaGVyKG9iamVjdCk6Ci0gIGRlZiBfX2luaXRfXyhzZWxmLCB0ZXN0ZGlyLCBjb25jdXJyZW5jeSk6Ci0gICAgc2VsZi5fbG9nID0gbXVsdGlwcm9jZXNzaW5nLmdldF9sb2dnZXIoKQotICAgIHNlbGYudGVzdGRpciA9IHRlc3RkaXIKLSAgICAjIHNlZW1zIG5lZWRlZCBmb3IgcHl0aG9uIDIueCB0byBoYW5kbGUga2V5Ym9hcmQgaW50ZXJydXB0Ci0gICAgc2VsZi5fc3RvcCA9IG11bHRpcHJvY2Vzc2luZy5FdmVudCgpCi0gICAgc2VsZi5fYXN5bmMgPSBjb25jdXJyZW5jeSA+IDEKLSAgICBpZiBub3Qgc2VsZi5fYXN5bmM6Ci0gICAgICBzZWxmLl9wb29sID0gTm9uZQotICAgICAgZ2xvYmFsIHN0b3AKLSAgICAgIGdsb2JhbCBwb3J0cwotICAgICAgc3RvcCA9IHNlbGYuX3N0b3AKLSAgICAgIHBvcnRzID0gUG9ydEFsbG9jYXRvcigpCi0gICAgZWxzZToKLSAgICAgIHNlbGYuX20gPSBtdWx0aXByb2Nlc3NpbmcubWFuYWdlcnMuQmFzZU1hbmFnZXIoKQotICAgICAgc2VsZi5fbS5yZWdpc3RlcigncG9ydHMnLCBQb3J0QWxsb2NhdG9yKQotICAgICAgc2VsZi5fbS5zdGFydCgpCi0gICAgICBzZWxmLl9wb29sID0gbXVsdGlwcm9jZXNzaW5nLlBvb2woY29uY3VycmVuY3ksIHNlbGYuX3Bvb2xfaW5pdCwgKHNlbGYuX20uYWRkcmVzcywpKQotICAgIHNlbGYuX3JlcG9ydCA9IFN1bW1hcnlSZXBvcnRlcih0ZXN0ZGlyLCBjb25jdXJyZW5jeSA+IDEpCi0gICAgc2VsZi5fbG9nLmRlYnVnKAotICAgICAgICAnVGVzdERpc3BhdGNoZXIgc3RhcnRlZCB3aXRoICVkIGNvbmN1cnJlbnQgam9icycgJSBjb25jdXJyZW5jeSkKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGVzdGRpciwgYmFzZWRpciwgbG9nZGlyX3JlbCwgY29uY3VycmVuY3kpOgorICAgICAgICBzZWxmLl9sb2cgPSBtdWx0aXByb2Nlc3NpbmcuZ2V0X2xvZ2dlcigpCisgICAgICAgIHNlbGYudGVzdGRpciA9IHRlc3RkaXIKKyAgICAgICAgc2VsZi5fcmVwb3J0ID0gU3VtbWFyeVJlcG9ydGVyKGJhc2VkaXIsIGxvZ2Rpcl9yZWwsIGNvbmN1cnJlbmN5ID4gMSkKKyAgICAgICAgc2VsZi5sb2dkaXIgPSBzZWxmLl9yZXBvcnQudGVzdGRpcgorICAgICAgICAjIHNlZW1zIG5lZWRlZCBmb3IgcHl0aG9uIDIueCB0byBoYW5kbGUga2V5Ym9hcmQgaW50ZXJydXB0CisgICAgICAgIHNlbGYuX3N0b3AgPSBtdWx0aXByb2Nlc3NpbmcuRXZlbnQoKQorICAgICAgICBzZWxmLl9hc3luYyA9IGNvbmN1cnJlbmN5ID4gMQorICAgICAgICBpZiBub3Qgc2VsZi5fYXN5bmM6CisgICAgICAgICAgICBzZWxmLl9wb29sID0gTm9uZQorICAgICAgICAgICAgZ2xvYmFsIHN0b3AKKyAgICAgICAgICAgIGdsb2JhbCBwb3J0cworICAgICAgICAgICAgc3RvcCA9IHNlbGYuX3N0b3AKKyAgICAgICAgICAgIHBvcnRzID0gUG9ydEFsbG9jYXRvcigpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9tID0gbXVsdGlwcm9jZXNzaW5nLm1hbmFnZXJzLkJhc2VNYW5hZ2VyKCkKKyAgICAgICAgICAgIHNlbGYuX20ucmVnaXN0ZXIoJ3BvcnRzJywgUG9ydEFsbG9jYXRvcikKKyAgICAgICAgICAgIHNlbGYuX20uc3RhcnQoKQorICAgICAgICAgICAgc2VsZi5fcG9vbCA9IG11bHRpcHJvY2Vzc2luZy5Qb29sKGNvbmN1cnJlbmN5LCBzZWxmLl9wb29sX2luaXQsIChzZWxmLl9tLmFkZHJlc3MsKSkKKyAgICAgICAgc2VsZi5fbG9nLmRlYnVnKAorICAgICAgICAgICAgJ1Rlc3REaXNwYXRjaGVyIHN0YXJ0ZWQgd2l0aCAlZCBjb25jdXJyZW50IGpvYnMnICUgY29uY3VycmVuY3kpCiAKLSAgZGVmIF9wb29sX2luaXQoc2VsZiwgYWRkcmVzcyk6Ci0gICAgZ2xvYmFsIHN0b3AKLSAgICBnbG9iYWwgbQotICAgIGdsb2JhbCBwb3J0cwotICAgIHN0b3AgPSBzZWxmLl9zdG9wCi0gICAgbSA9IG11bHRpcHJvY2Vzc2luZy5tYW5hZ2Vycy5CYXNlTWFuYWdlcihhZGRyZXNzKQotICAgIG0uY29ubmVjdCgpCi0gICAgcG9ydHMgPSBtLnBvcnRzKCkKKyAgICBkZWYgX3Bvb2xfaW5pdChzZWxmLCBhZGRyZXNzKToKKyAgICAgICAgZ2xvYmFsIHN0b3AKKyAgICAgICAgZ2xvYmFsIG0KKyAgICAgICAgZ2xvYmFsIHBvcnRzCisgICAgICAgIHN0b3AgPSBzZWxmLl9zdG9wCisgICAgICAgIG0gPSBtdWx0aXByb2Nlc3NpbmcubWFuYWdlcnMuQmFzZU1hbmFnZXIoYWRkcmVzcykKKyAgICAgICAgbS5jb25uZWN0KCkKKyAgICAgICAgcG9ydHMgPSBtLnBvcnRzKCkKIAotICBkZWYgX2Rpc3BhdGNoX3N5bmMoc2VsZiwgdGVzdCwgY29udCk6Ci0gICAgciA9IHJ1bl90ZXN0KHNlbGYudGVzdGRpciwgdGVzdCwgRmFsc2UpCi0gICAgY29udChyKQotICAgIHJldHVybiBOb25Bc3luY1Jlc3VsdChyKQorICAgIGRlZiBfZGlzcGF0Y2hfc3luYyhzZWxmLCB0ZXN0LCBjb250LCBtYXhfcmV0cnkpOgorICAgICAgICByID0gcnVuX3Rlc3Qoc2VsZi50ZXN0ZGlyLCBzZWxmLmxvZ2RpciwgdGVzdCwgbWF4X3JldHJ5LCBhc3luY19tb2RlPUZhbHNlKQorICAgICAgICBjb250KHIpCisgICAgICAgIHJldHVybiBOb25Bc3luY1Jlc3VsdChyKQogCi0gIGRlZiBfZGlzcGF0Y2hfYXN5bmMoc2VsZiwgdGVzdCwgY29udCk6Ci0gICAgcmV0dXJuIHNlbGYuX3Bvb2wuYXBwbHlfYXN5bmMoZnVuYz1ydW5fdGVzdCwgYXJncz0oc2VsZi50ZXN0ZGlyLCB0ZXN0LCksIGNhbGxiYWNrPWNvbnQpCisgICAgZGVmIF9kaXNwYXRjaF9hc3luYyhzZWxmLCB0ZXN0LCBjb250LCBtYXhfcmV0cnkpOgorICAgICAgICBzZWxmLl9sb2cuZGVidWcoJ19kaXNwYXRjaF9hc3luYycpCisgICAgICAgIHJldHVybiBzZWxmLl9wb29sLmFwcGx5X2FzeW5jKGZ1bmM9cnVuX3Rlc3QsIGFyZ3M9KHNlbGYudGVzdGRpciwgc2VsZi5sb2dkaXIsIHRlc3QsIG1heF9yZXRyeSksIGNhbGxiYWNrPWNvbnQpCiAKLSAgZGVmIGRpc3BhdGNoKHNlbGYsIHRlc3QpOgotICAgIGluZGV4ID0gc2VsZi5fcmVwb3J0LmFkZF90ZXN0KHRlc3QpCisgICAgZGVmIGRpc3BhdGNoKHNlbGYsIHRlc3QsIG1heF9yZXRyeSk6CisgICAgICAgIGluZGV4ID0gc2VsZi5fcmVwb3J0LmFkZF90ZXN0KHRlc3QpCiAKLSAgICBkZWYgY29udChyKToKLSAgICAgIGlmIG5vdCBzZWxmLl9zdG9wLmlzX3NldCgpOgotICAgICAgICBzZWxmLl9sb2cuZGVidWcoJ2ZyZWVpbmcgcG9ydCcpCi0gICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnYWRkaW5nIHJlc3VsdCcpCi0gICAgICAgIHNlbGYuX3JlcG9ydC5hZGRfcmVzdWx0KGluZGV4LCByLCByID09IFJFU1VMVF9USU1FT1VUKQotICAgICAgICBzZWxmLl9sb2cuZGVidWcoJ2ZpbmlzaCBjb250aW51YXRpb24nKQotICAgIGZuID0gc2VsZi5fZGlzcGF0Y2hfYXN5bmMgaWYgc2VsZi5fYXN5bmMgZWxzZSBzZWxmLl9kaXNwYXRjaF9zeW5jCi0gICAgcmV0dXJuIGZuKHRlc3QsIGNvbnQpCisgICAgICAgIGRlZiBjb250KHJlc3VsdCk6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5fc3RvcC5pc19zZXQoKToKKyAgICAgICAgICAgICAgICBpZiByZXN1bHQgYW5kIGxlbihyZXN1bHQpID09IDI6CisgICAgICAgICAgICAgICAgICAgIHJldHJ5X2NvdW50LCByZXR1cm5jb2RlID0gcmVzdWx0CisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmV0cnlfY291bnQgPSAwCisgICAgICAgICAgICAgICAgICAgIHJldHVybmNvZGUgPSBSRVNVTFRfRVJST1IKKyAgICAgICAgICAgICAgICBzZWxmLl9sb2cuZGVidWcoJ2ZyZWVpbmcgcG9ydCcpCisgICAgICAgICAgICAgICAgc2VsZi5fbG9nLmRlYnVnKCdhZGRpbmcgcmVzdWx0JykKKyAgICAgICAgICAgICAgICBzZWxmLl9yZXBvcnQuYWRkX3Jlc3VsdChpbmRleCwgcmV0dXJuY29kZSwgcmV0dXJuY29kZSA9PSBSRVNVTFRfVElNRU9VVCwgcmV0cnlfY291bnQpCisgICAgICAgICAgICAgICAgc2VsZi5fbG9nLmRlYnVnKCdmaW5pc2ggY29udGludWF0aW9uJykKKyAgICAgICAgZm4gPSBzZWxmLl9kaXNwYXRjaF9hc3luYyBpZiBzZWxmLl9hc3luYyBlbHNlIHNlbGYuX2Rpc3BhdGNoX3N5bmMKKyAgICAgICAgcmV0dXJuIGZuKHRlc3QsIGNvbnQsIG1heF9yZXRyeSkKIAotICBkZWYgd2FpdChzZWxmKToKLSAgICBpZiBzZWxmLl9hc3luYzoKLSAgICAgIHNlbGYuX3Bvb2wuY2xvc2UoKQotICAgICAgc2VsZi5fcG9vbC5qb2luKCkKLSAgICAgIHNlbGYuX20uc2h1dGRvd24oKQotICAgIHJldHVybiBzZWxmLl9yZXBvcnQuZW5kKCkKKyAgICBkZWYgd2FpdChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fYXN5bmM6CisgICAgICAgICAgICBzZWxmLl9wb29sLmNsb3NlKCkKKyAgICAgICAgICAgIHNlbGYuX3Bvb2wuam9pbigpCisgICAgICAgICAgICBzZWxmLl9tLnNodXRkb3duKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX3JlcG9ydC5lbmQoKQogCi0gIGRlZiB0ZXJtaW5hdGUoc2VsZik6Ci0gICAgc2VsZi5fc3RvcC5zZXQoKQotICAgIGlmIHNlbGYuX2FzeW5jOgotICAgICAgc2VsZi5fcG9vbC50ZXJtaW5hdGUoKQotICAgICAgc2VsZi5fcG9vbC5qb2luKCkKLSAgICAgIHNlbGYuX20uc2h1dGRvd24oKQorICAgIGRlZiB0ZXJtaW5hdGUoc2VsZik6CisgICAgICAgIHNlbGYuX3N0b3Auc2V0KCkKKyAgICAgICAgaWYgc2VsZi5fYXN5bmM6CisgICAgICAgICAgICBzZWxmLl9wb29sLnRlcm1pbmF0ZSgpCisgICAgICAgICAgICBzZWxmLl9wb29sLmpvaW4oKQorICAgICAgICAgICAgc2VsZi5fbS5zaHV0ZG93bigpCmRpZmYgLS1naXQgYS90ZXN0L2Nyb3NzcnVubmVyL3NldHVwLmNmZyBiL3Rlc3QvY3Jvc3NydW5uZXIvc2V0dXAuY2ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYTFmOTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2Nyb3NzcnVubmVyL3NldHVwLmNmZwpAQCAtMCwwICsxLDIgQEAKK1tmbGFrZThdCittYXgtbGluZS1sZW5ndGggPSAxMDAKZGlmZiAtLWdpdCBhL3Rlc3QvY3Jvc3NydW5uZXIvdGVzdC5weSBiL3Rlc3QvY3Jvc3NydW5uZXIvdGVzdC5weQppbmRleCA1MTJlNjY0Li4wZTkxMjg0IDEwMDY0NAotLS0gYS90ZXN0L2Nyb3NzcnVubmVyL3Rlc3QucHkKKysrIGIvdGVzdC9jcm9zc3J1bm5lci90ZXN0LnB5CkBAIC0yMSwxMTYgKzIxLDEyOSBAQAogaW1wb3J0IG11bHRpcHJvY2Vzc2luZwogaW1wb3J0IG9zCiBpbXBvcnQgc3lzCi0KLWZyb20gY3Jvc3NydW5uZXIudXRpbCBpbXBvcnQgbWVyZ2VfZGljdAotCi0KLWRlZiBkb21haW5fc29ja2V0X3BhdGgocG9ydCk6Ci0gIHJldHVybiAnL3RtcC9UaHJpZnRUZXN0LnRocmlmdC4lZCcgJSBwb3J0Citmcm9tIC5jb21wYXQgaW1wb3J0IHBhdGhfam9pbgorZnJvbSAudXRpbCBpbXBvcnQgbWVyZ2VfZGljdCwgZG9tYWluX3NvY2tldF9wYXRoCiAKIAogY2xhc3MgVGVzdFByb2dyYW0ob2JqZWN0KToKLSAgZGVmIF9faW5pdF9fKHNlbGYsIGtpbmQsIG5hbWUsIHByb3RvY29sLCB0cmFuc3BvcnQsIHNvY2tldCwgd29ya2RpciwgY29tbWFuZCwgZW52PU5vbmUsCi0gICAgICAgICAgICAgICBleHRyYV9hcmdzPVtdLCBqb2luX2FyZ3M9RmFsc2UsICoqa3dhcmdzKToKLSAgICBzZWxmLmtpbmQgPSBraW5kCi0gICAgc2VsZi5uYW1lID0gbmFtZQotICAgIHNlbGYucHJvdG9jb2wgPSBwcm90b2NvbAotICAgIHNlbGYudHJhbnNwb3J0ID0gdHJhbnNwb3J0Ci0gICAgc2VsZi5zb2NrZXQgPSBzb2NrZXQKLSAgICBzZWxmLndvcmtkaXIgPSB3b3JrZGlyCi0gICAgc2VsZi5jb21tYW5kID0gTm9uZQotICAgIHNlbGYuX2Jhc2VfY29tbWFuZCA9IHNlbGYuX2ZpeF9jbWRfcGF0aChjb21tYW5kKQotICAgIGlmIGVudjoKLSAgICAgIHNlbGYuZW52ID0gY29weS5jb3B5KG9zLmVudmlyb24pCi0gICAgICBzZWxmLmVudi51cGRhdGUoZW52KQotICAgIGVsc2U6Ci0gICAgICBzZWxmLmVudiA9IG9zLmVudmlyb24KLSAgICBzZWxmLl9leHRyYV9hcmdzID0gZXh0cmFfYXJncwotICAgIHNlbGYuX2pvaW5fYXJncyA9IGpvaW5fYXJncworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBraW5kLCBuYW1lLCBwcm90b2NvbCwgdHJhbnNwb3J0LCBzb2NrZXQsIHdvcmtkaXIsIHN0b3Bfc2lnbmFsLCBjb21tYW5kLCBlbnY9Tm9uZSwKKyAgICAgICAgICAgICAgICAgZXh0cmFfYXJncz1bXSwgZXh0cmFfYXJnczI9W10sIGpvaW5fYXJncz1GYWxzZSwgKiprd2FyZ3MpOgogCi0gIGRlZiBfZml4X2NtZF9wYXRoKHNlbGYsIGNtZCk6Ci0gICAgIyBpZiB0aGUgYXJnIGlzIGEgZmlsZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnksIG1ha2UgaXQgcGF0aAotICAgIGRlZiBhYnNfaWZfZXhpc3RzKGFyZyk6Ci0gICAgICBwID0gb3MucGF0aC5qb2luKHNlbGYud29ya2RpciwgYXJnKQotICAgICAgcmV0dXJuIHAgaWYgb3MucGF0aC5leGlzdHMocCkgZWxzZSBhcmcKKyAgICAgICAgc2VsZi5raW5kID0ga2luZAorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgICAgIHNlbGYucHJvdG9jb2wgPSBwcm90b2NvbAorICAgICAgICBzZWxmLnRyYW5zcG9ydCA9IHRyYW5zcG9ydAorICAgICAgICBzZWxmLnNvY2tldCA9IHNvY2tldAorICAgICAgICBzZWxmLndvcmtkaXIgPSB3b3JrZGlyCisgICAgICAgIHNlbGYuc3RvcF9zaWduYWwgPSBzdG9wX3NpZ25hbAorICAgICAgICBzZWxmLmNvbW1hbmQgPSBOb25lCisgICAgICAgIHNlbGYuX2Jhc2VfY29tbWFuZCA9IHNlbGYuX2ZpeF9jbWRfcGF0aChjb21tYW5kKQorICAgICAgICBpZiBlbnY6CisgICAgICAgICAgICBzZWxmLmVudiA9IGNvcHkuY29weShvcy5lbnZpcm9uKQorICAgICAgICAgICAgc2VsZi5lbnYudXBkYXRlKGVudikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZW52ID0gb3MuZW52aXJvbgorICAgICAgICBzZWxmLl9leHRyYV9hcmdzID0gZXh0cmFfYXJncworICAgICAgICBzZWxmLl9leHRyYV9hcmdzMiA9IGV4dHJhX2FyZ3MyCisgICAgICAgIHNlbGYuX2pvaW5fYXJncyA9IGpvaW5fYXJncwogCi0gICAgaWYgY21kWzBdID09ICdweXRob24nOgotICAgICAgY21kWzBdID0gc3lzLmV4ZWN1dGFibGUKLSAgICBlbHNlOgotICAgICAgY21kWzBdID0gYWJzX2lmX2V4aXN0cyhjbWRbMF0pCi0gICAgcmV0dXJuIGNtZAorICAgIGRlZiBfZml4X2NtZF9wYXRoKHNlbGYsIGNtZCk6CisgICAgICAgICMgaWYgdGhlIGFyZyBpcyBhIGZpbGUgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCBtYWtlIGl0IHBhdGgKKyAgICAgICAgZGVmIGFic19pZl9leGlzdHMoYXJnKToKKyAgICAgICAgICAgIHAgPSBwYXRoX2pvaW4oc2VsZi53b3JrZGlyLCBhcmcpCisgICAgICAgICAgICByZXR1cm4gcCBpZiBvcy5wYXRoLmV4aXN0cyhwKSBlbHNlIGFyZwogCi0gIGRlZiBfc29ja2V0X2FyZyhzZWxmLCBzb2NrZXQsIHBvcnQpOgotICAgIHJldHVybiB7Ci0gICAgICAnaXAtc3NsJzogJy0tc3NsJywKLSAgICAgICdkb21haW4nOiAnLS1kb21haW4tc29ja2V0PSVzJyAlIGRvbWFpbl9zb2NrZXRfcGF0aChwb3J0KSwKLSAgICB9LmdldChzb2NrZXQsIE5vbmUpCisgICAgICAgIGlmIGNtZFswXSA9PSAncHl0aG9uJzoKKyAgICAgICAgICAgIGNtZFswXSA9IHN5cy5leGVjdXRhYmxlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjbWRbMF0gPSBhYnNfaWZfZXhpc3RzKGNtZFswXSkKKyAgICAgICAgcmV0dXJuIGNtZAogCi0gIGRlZiBidWlsZF9jb21tYW5kKHNlbGYsIHBvcnQpOgotICAgIGNtZCA9IGNvcHkuY29weShzZWxmLl9iYXNlX2NvbW1hbmQpCi0gICAgYXJncyA9IFtdCi0gICAgYXJncy5hcHBlbmQoJy0tcHJvdG9jb2w9JyArIHNlbGYucHJvdG9jb2wpCi0gICAgYXJncy5hcHBlbmQoJy0tdHJhbnNwb3J0PScgKyBzZWxmLnRyYW5zcG9ydCkKLSAgICBzb2NrZXRfYXJnID0gc2VsZi5fc29ja2V0X2FyZyhzZWxmLnNvY2tldCwgcG9ydCkKLSAgICBpZiBzb2NrZXRfYXJnOgotICAgICAgYXJncy5hcHBlbmQoc29ja2V0X2FyZykKLSAgICBhcmdzLmFwcGVuZCgnLS1wb3J0PSVkJyAlIHBvcnQpCi0gICAgaWYgc2VsZi5fam9pbl9hcmdzOgotICAgICAgY21kLmFwcGVuZCgnJXMnICUgIiAiLmpvaW4oYXJncykpCi0gICAgZWxzZToKLSAgICAgIGNtZC5leHRlbmQoYXJncykKLSAgICBpZiBzZWxmLl9leHRyYV9hcmdzOgotICAgICAgY21kLmV4dGVuZChzZWxmLl9leHRyYV9hcmdzKQotICAgIHNlbGYuY29tbWFuZCA9IGNtZAotICAgIHJldHVybiBzZWxmLmNvbW1hbmQKKyAgICBkZWYgX3NvY2tldF9hcmdzKHNlbGYsIHNvY2tldCwgcG9ydCk6CisgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICAnaXAtc3NsJzogWyctLXNzbCddLAorICAgICAgICAgICAgJ2RvbWFpbic6IFsnLS1kb21haW4tc29ja2V0PSVzJyAlIGRvbWFpbl9zb2NrZXRfcGF0aChwb3J0KV0sCisgICAgICAgICAgICAnYWJzdHJhY3QnOiBbJy0tYWJzdHJhY3QtbmFtZXNwYWNlJywgJy0tZG9tYWluLXNvY2tldD0lcycgJSBkb21haW5fc29ja2V0X3BhdGgocG9ydCldLAorICAgICAgICB9LmdldChzb2NrZXQsIE5vbmUpCisKKyAgICBkZWYgX3RyYW5zcG9ydF9hcmdzKHNlbGYsIHRyYW5zcG9ydCk6CisgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICAnemxpYic6IFsnLS16bGliJ10sCisgICAgICAgIH0uZ2V0KHRyYW5zcG9ydCwgTm9uZSkKKworICAgIGRlZiBidWlsZF9jb21tYW5kKHNlbGYsIHBvcnQpOgorICAgICAgICBjbWQgPSBjb3B5LmNvcHkoc2VsZi5fYmFzZV9jb21tYW5kKQorICAgICAgICBhcmdzID0gY29weS5jb3B5KHNlbGYuX2V4dHJhX2FyZ3MyKQorICAgICAgICBhcmdzLmFwcGVuZCgnLS1wcm90b2NvbD0nICsgc2VsZi5wcm90b2NvbCkKKyAgICAgICAgYXJncy5hcHBlbmQoJy0tdHJhbnNwb3J0PScgKyBzZWxmLnRyYW5zcG9ydCkKKyAgICAgICAgdHJhbnNwb3J0X2FyZ3MgPSBzZWxmLl90cmFuc3BvcnRfYXJncyhzZWxmLnRyYW5zcG9ydCkKKyAgICAgICAgaWYgdHJhbnNwb3J0X2FyZ3M6CisgICAgICAgICAgICBhcmdzICs9IHRyYW5zcG9ydF9hcmdzCisgICAgICAgIHNvY2tldF9hcmdzID0gc2VsZi5fc29ja2V0X2FyZ3Moc2VsZi5zb2NrZXQsIHBvcnQpCisgICAgICAgIGlmIHNvY2tldF9hcmdzOgorICAgICAgICAgICAgYXJncyArPSBzb2NrZXRfYXJncworICAgICAgICBhcmdzLmFwcGVuZCgnLS1wb3J0PSVkJyAlIHBvcnQpCisgICAgICAgIGlmIHNlbGYuX2pvaW5fYXJnczoKKyAgICAgICAgICAgIGNtZC5hcHBlbmQoJyVzJyAlICIgIi5qb2luKGFyZ3MpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY21kLmV4dGVuZChhcmdzKQorICAgICAgICBpZiBzZWxmLl9leHRyYV9hcmdzOgorICAgICAgICAgICAgY21kLmV4dGVuZChzZWxmLl9leHRyYV9hcmdzKQorICAgICAgICBzZWxmLmNvbW1hbmQgPSBjbWQKKyAgICAgICAgcmV0dXJuIHNlbGYuY29tbWFuZAogCiAKIGNsYXNzIFRlc3RFbnRyeShvYmplY3QpOgotICBkZWYgX19pbml0X18oc2VsZiwgdGVzdGRpciwgc2VydmVyLCBjbGllbnQsIGRlbGF5LCB0aW1lb3V0LCAqKmt3YXJncyk6Ci0gICAgc2VsZi50ZXN0ZGlyID0gdGVzdGRpcgotICAgIHNlbGYuX2xvZyA9IG11bHRpcHJvY2Vzc2luZy5nZXRfbG9nZ2VyKCkKLSAgICBzZWxmLl9jb25maWcgPSBrd2FyZ3MKLSAgICBzZWxmLnByb3RvY29sID0ga3dhcmdzWydwcm90b2NvbCddCi0gICAgc2VsZi50cmFuc3BvcnQgPSBrd2FyZ3NbJ3RyYW5zcG9ydCddCi0gICAgc2VsZi5zb2NrZXQgPSBrd2FyZ3NbJ3NvY2tldCddCi0gICAgc2VsZi5zZXJ2ZXIgPSBUZXN0UHJvZ3JhbSgnc2VydmVyJywgKipzZWxmLl9maXhfd29ya2RpcihtZXJnZV9kaWN0KHNlbGYuX2NvbmZpZywgc2VydmVyKSkpCi0gICAgc2VsZi5jbGllbnQgPSBUZXN0UHJvZ3JhbSgnY2xpZW50JywgKipzZWxmLl9maXhfd29ya2RpcihtZXJnZV9kaWN0KHNlbGYuX2NvbmZpZywgY2xpZW50KSkpCi0gICAgc2VsZi5kZWxheSA9IGRlbGF5Ci0gICAgc2VsZi50aW1lb3V0ID0gdGltZW91dAotICAgIHNlbGYuX25hbWUgPSBOb25lCi0gICAgIyByZXN1bHRzCi0gICAgc2VsZi5zdWNjZXNzID0gTm9uZQotICAgIHNlbGYuYXNfZXhwZWN0ZWQgPSBOb25lCi0gICAgc2VsZi5yZXR1cm5jb2RlID0gTm9uZQotICAgIHNlbGYuZXhwaXJlZCA9IEZhbHNlCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRlc3RkaXIsIHNlcnZlciwgY2xpZW50LCBkZWxheSwgdGltZW91dCwgKiprd2FyZ3MpOgorICAgICAgICBzZWxmLnRlc3RkaXIgPSB0ZXN0ZGlyCisgICAgICAgIHNlbGYuX2xvZyA9IG11bHRpcHJvY2Vzc2luZy5nZXRfbG9nZ2VyKCkKKyAgICAgICAgc2VsZi5fY29uZmlnID0ga3dhcmdzCisgICAgICAgIHNlbGYucHJvdG9jb2wgPSBrd2FyZ3NbJ3Byb3RvY29sJ10KKyAgICAgICAgc2VsZi50cmFuc3BvcnQgPSBrd2FyZ3NbJ3RyYW5zcG9ydCddCisgICAgICAgIHNlbGYuc29ja2V0ID0ga3dhcmdzWydzb2NrZXQnXQorICAgICAgICBzcnZfZGljdCA9IHNlbGYuX2ZpeF93b3JrZGlyKG1lcmdlX2RpY3Qoc2VsZi5fY29uZmlnLCBzZXJ2ZXIpKQorICAgICAgICBjbGlfZGljdCA9IHNlbGYuX2ZpeF93b3JrZGlyKG1lcmdlX2RpY3Qoc2VsZi5fY29uZmlnLCBjbGllbnQpKQorICAgICAgICBjbGlfZGljdFsnZXh0cmFfYXJnczInXSA9IHNydl9kaWN0LnBvcCgncmVtb3RlX2FyZ3MnLCBbXSkKKyAgICAgICAgc3J2X2RpY3RbJ2V4dHJhX2FyZ3MyJ10gPSBjbGlfZGljdC5wb3AoJ3JlbW90ZV9hcmdzJywgW10pCisgICAgICAgIHNlbGYuc2VydmVyID0gVGVzdFByb2dyYW0oJ3NlcnZlcicsICoqc3J2X2RpY3QpCisgICAgICAgIHNlbGYuY2xpZW50ID0gVGVzdFByb2dyYW0oJ2NsaWVudCcsICoqY2xpX2RpY3QpCisgICAgICAgIHNlbGYuZGVsYXkgPSBkZWxheQorICAgICAgICBzZWxmLnRpbWVvdXQgPSB0aW1lb3V0CisgICAgICAgIHNlbGYuX25hbWUgPSBOb25lCisgICAgICAgICMgcmVzdWx0cworICAgICAgICBzZWxmLnN1Y2Nlc3MgPSBOb25lCisgICAgICAgIHNlbGYuYXNfZXhwZWN0ZWQgPSBOb25lCisgICAgICAgIHNlbGYucmV0dXJuY29kZSA9IE5vbmUKKyAgICAgICAgc2VsZi5leHBpcmVkID0gRmFsc2UKKyAgICAgICAgc2VsZi5yZXRyeV9jb3VudCA9IDAKIAotICBkZWYgX2ZpeF93b3JrZGlyKHNlbGYsIGNvbmZpZyk6Ci0gICAga2V5ID0gJ3dvcmtkaXInCi0gICAgcGF0aCA9IGNvbmZpZy5nZXQoa2V5LCBOb25lKQotICAgIGlmIG5vdCBwYXRoOgotICAgICAgcGF0aCA9IHNlbGYudGVzdGRpcgotICAgIGlmIG9zLnBhdGguaXNhYnMocGF0aCk6Ci0gICAgICBwYXRoID0gb3MucGF0aC5yZWFscGF0aChwYXRoKQotICAgIGVsc2U6Ci0gICAgICBwYXRoID0gb3MucGF0aC5yZWFscGF0aChvcy5wYXRoLmpvaW4oc2VsZi50ZXN0ZGlyLCBwYXRoKSkKLSAgICBjb25maWcudXBkYXRlKHtrZXk6IHBhdGh9KQotICAgIHJldHVybiBjb25maWcKKyAgICBkZWYgX2ZpeF93b3JrZGlyKHNlbGYsIGNvbmZpZyk6CisgICAgICAgIGtleSA9ICd3b3JrZGlyJworICAgICAgICBwYXRoID0gY29uZmlnLmdldChrZXksIE5vbmUpCisgICAgICAgIGlmIG5vdCBwYXRoOgorICAgICAgICAgICAgcGF0aCA9IHNlbGYudGVzdGRpcgorICAgICAgICBpZiBvcy5wYXRoLmlzYWJzKHBhdGgpOgorICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGgucmVhbHBhdGgocGF0aCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLnJlYWxwYXRoKHBhdGhfam9pbihzZWxmLnRlc3RkaXIsIHBhdGgpKQorICAgICAgICBjb25maWcudXBkYXRlKHtrZXk6IHBhdGh9KQorICAgICAgICByZXR1cm4gY29uZmlnCiAKLSAgQGNsYXNzbWV0aG9kCi0gIGRlZiBnZXRfbmFtZShjbHMsIHNlcnZlciwgY2xpZW50LCBwcm90bywgdHJhbnMsIHNvY2ssICphcmdzKToKLSAgICByZXR1cm4gJyVzLSVzXyVzXyVzLSVzJyAlIChzZXJ2ZXIsIGNsaWVudCwgcHJvdG8sIHRyYW5zLCBzb2NrKQorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBnZXRfbmFtZShjbHMsIHNlcnZlciwgY2xpZW50LCBwcm90b2NvbCwgdHJhbnNwb3J0LCBzb2NrZXQsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiAnJXMtJXNfJXNfJXMtJXMnICUgKHNlcnZlciwgY2xpZW50LCBwcm90b2NvbCwgdHJhbnNwb3J0LCBzb2NrZXQpCiAKLSAgQHByb3BlcnR5Ci0gIGRlZiBuYW1lKHNlbGYpOgotICAgIGlmIG5vdCBzZWxmLl9uYW1lOgotICAgICAgc2VsZi5fbmFtZSA9IHNlbGYuZ2V0X25hbWUoCi0gICAgICAgICAgc2VsZi5zZXJ2ZXIubmFtZSwgc2VsZi5jbGllbnQubmFtZSwgc2VsZi5wcm90b2NvbCwgc2VsZi50cmFuc3BvcnQsIHNlbGYuc29ja2V0KQotICAgIHJldHVybiBzZWxmLl9uYW1lCisgICAgQHByb3BlcnR5CisgICAgZGVmIG5hbWUoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLl9uYW1lOgorICAgICAgICAgICAgc2VsZi5fbmFtZSA9IHNlbGYuZ2V0X25hbWUoCisgICAgICAgICAgICAgICAgc2VsZi5zZXJ2ZXIubmFtZSwgc2VsZi5jbGllbnQubmFtZSwgc2VsZi5wcm90b2NvbCwgc2VsZi50cmFuc3BvcnQsIHNlbGYuc29ja2V0KQorICAgICAgICByZXR1cm4gc2VsZi5fbmFtZQogCi0gIEBwcm9wZXJ0eQotICBkZWYgdHJhbnNwb3J0X25hbWUoc2VsZik6Ci0gICAgcmV0dXJuICclcy0lcycgJSAoc2VsZi50cmFuc3BvcnQsIHNlbGYuc29ja2V0KQorICAgIEBwcm9wZXJ0eQorICAgIGRlZiB0cmFuc3BvcnRfbmFtZShzZWxmKToKKyAgICAgICAgcmV0dXJuICclcy0lcycgJSAoc2VsZi50cmFuc3BvcnQsIHNlbGYuc29ja2V0KQogCiAKIGRlZiB0ZXN0X25hbWUoc2VydmVyLCBjbGllbnQsIHByb3RvY29sLCB0cmFuc3BvcnQsIHNvY2tldCwgKiprd2FyZ3MpOgotICByZXR1cm4gVGVzdEVudHJ5LmdldF9uYW1lKHNlcnZlclsnbmFtZSddLCBjbGllbnRbJ25hbWUnXSwgcHJvdG9jb2wsIHRyYW5zcG9ydCwgc29ja2V0KQorICAgIHJldHVybiBUZXN0RW50cnkuZ2V0X25hbWUoc2VydmVyWyduYW1lJ10sIGNsaWVudFsnbmFtZSddLCBwcm90b2NvbCwgdHJhbnNwb3J0LCBzb2NrZXQpCmRpZmYgLS1naXQgYS90ZXN0L2Nyb3NzcnVubmVyL3V0aWwucHkgYi90ZXN0L2Nyb3NzcnVubmVyL3V0aWwucHkKaW5kZXggNzUwZWQ0Ny4uYzIxNGRmOCAxMDA2NDQKLS0tIGEvdGVzdC9jcm9zc3J1bm5lci91dGlsLnB5CisrKyBiL3Rlc3QvY3Jvc3NydW5uZXIvdXRpbC5weQpAQCAtMjAsMTIgKzIwLDE2IEBACiBpbXBvcnQgY29weQogCiAKK2RlZiBkb21haW5fc29ja2V0X3BhdGgocG9ydCk6CisgICAgcmV0dXJuICcvdG1wL1RocmlmdFRlc3QudGhyaWZ0LiVkJyAlIHBvcnQKKworCiBkZWYgbWVyZ2VfZGljdChiYXNlLCB1cGRhdGUpOgotICAiIiJVcGRhdGUgZGljdCBjb25jYXRlbmF0aW5nIGxpc3QgdmFsdWVzIiIiCi0gIHJlcyA9IGNvcHkuZGVlcGNvcHkoYmFzZSkKLSAgZm9yIGssIHYgaW4gbGlzdCh1cGRhdGUuaXRlbXMoKSk6Ci0gICAgaWYgayBpbiBsaXN0KHJlcy5rZXlzKCkpIGFuZCBpc2luc3RhbmNlKHYsIGxpc3QpOgotICAgICAgcmVzW2tdLmV4dGVuZCh2KQotICAgIGVsc2U6Ci0gICAgICByZXNba10gPSB2Ci0gIHJldHVybiByZXMKKyAgICAiIiJVcGRhdGUgZGljdCBjb25jYXRlbmF0aW5nIGxpc3QgdmFsdWVzIiIiCisgICAgcmVzID0gY29weS5kZWVwY29weShiYXNlKQorICAgIGZvciBrLCB2IGluIGxpc3QodXBkYXRlLml0ZW1zKCkpOgorICAgICAgICBpZiBrIGluIGxpc3QocmVzLmtleXMoKSkgYW5kIGlzaW5zdGFuY2UodiwgbGlzdCk6CisgICAgICAgICAgICByZXNba10uZXh0ZW5kKHYpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXNba10gPSB2CisgICAgcmV0dXJuIHJlcwpkaWZmIC0tZ2l0IGEvdGVzdC9jc2hhcnAvTWFrZWZpbGUuYW0gYi90ZXN0L2NzaGFycC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDE2NmUzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jc2hhcnAvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw5NSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK0dFTkVSQVRFRCA9IFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L0JvbmsuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvQm9vbHMuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvQm9vbFRlc3QuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvQ3JhenlOZXN0aW5nLmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L0VtcHR5U3RydWN0LmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L0d1ZXNzUHJvdG9jb2xTdHJ1Y3QuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvSW5zYW5pdHkuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvTGFyZ2VEZWx0YXMuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvTGlzdEJvbmtzLmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L0xpc3RUeXBlVmVyc2lvbmluZ1YxLmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L0xpc3RUeXBlVmVyc2lvbmluZ1YyLmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L05lc3RlZExpc3RzQm9uay5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9OZXN0ZWRMaXN0c0kzMngyLmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L05lc3RlZExpc3RzSTMyeDMuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvTmVzdGVkTWl4ZWR4Mi5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9OdW1iZXJ6LmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L09uZUZpZWxkLmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L1NlY29uZFNlcnZpY2UuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvU3RydWN0QS5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9TdHJ1Y3RCLmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L1RocmlmdFRlc3QuQ29uc3RhbnRzLmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L1RocmlmdFRlc3QuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvVmVyc2lvbmluZ1Rlc3RWMS5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9WZXJzaW9uaW5nVGVzdFYyLmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L1hjZXB0aW9uLmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L1hjZXB0aW9uMi5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9YdHJ1Y3QuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvWHRydWN0Mi5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9YdHJ1Y3QzLmNzCisKK0JVSUxUX1NPVVJDRVMgPSAkKEdFTkVSQVRFRCkKKworaWYgTU9OT19NQ1MKK0NTQyA9IG1jcworZWxzZQorQ1NDID0gZ21jcworZW5kaWYKKworaWYgTkVUXzJfMAorQ1NDX0RFRklORVMgPSAtZDpORVRfMl8wCitlbmRpZgorCitMSUJESVIgPSAkKHRvcF9idWlsZGRpcikvbGliL2NzaGFycAorCitUSFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAorCiskKEdFTkVSQVRFRCk6ICQodG9wX3NyY2RpcikvdGVzdC9UaHJpZnRUZXN0LnRocmlmdCAkKFRIUklGVCkKKwkkKFRIUklGVCkgLS1nZW4gY3NoYXJwIC1vIC4gJDwKKworcHJlY3Jvc3M6IFRlc3RDbGllbnRTZXJ2ZXIuZXhlCisKK1RocmlmdEltcGwuZGxsOiAkKEdFTkVSQVRFRCkgJChMSUJESVIpL1RocmlmdC5kbGwKKwkkKENTQykgJChDU0NfREVGSU5FUykgLXQ6bGlicmFyeSAtb3V0OiRAIC1yZWZlcmVuY2U6JChMSUJESVIpL1RocmlmdC5kbGwgJChHRU5FUkFURUQpCisKK1NSQ1MgPSBUZXN0Q2xpZW50LmNzIFRlc3RTZXJ2ZXIuY3MgUHJvZ3JhbS5jcworCitUZXN0Q2xpZW50U2VydmVyLmV4ZTogJChTUkNTKSBUaHJpZnRJbXBsLmRsbAorCSQoQ1NDKSAkKENTQ19ERUZJTkVTKSAtb3V0OiRAIC1yZWZlcmVuY2U6JChMSUJESVIpL1RocmlmdC5kbGwgLXJlZmVyZW5jZTpUaHJpZnRJbXBsLmRsbCAkKFNSQ1MpCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yZiBnZW4tY3NoYXJwICouZXhlICouZGxsCisKK1RFU1RQT1JUID0gOTUwMAorY2hlY2stbG9jYWw6IFRlc3RDbGllbnRTZXJ2ZXIuZXhlCisJTU9OT19QQVRIPSQoTElCRElSKSB0aW1lb3V0IDEwIG1vbm8gVGVzdENsaWVudFNlcnZlci5leGUgc2VydmVyIC0tcG9ydD0kKFRFU1RQT1JUKSAmCisJc2xlZXAgMQorCU1PTk9fUEFUSD0kKExJQkRJUikgbW9ubyBUZXN0Q2xpZW50U2VydmVyLmV4ZSBjbGllbnQgLS1wb3J0PSQoVEVTVFBPUlQpCisKK0VYVFJBX0RJU1QgPSBcCisJUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgXAorCVRocmlmdFRlc3QuY3Nwcm9qIFwKKwlUaHJpZnRUZXN0LnNsbiBcCisJUHJvZ3JhbS5jcyBcCisJVGVzdFNlcnZlci5jcyBcCisJVGVzdENsaWVudC5jcwpkaWZmIC0tZ2l0IGEvdGVzdC9jc2hhcnAvUHJvZ3JhbS5jcyBiL3Rlc3QvY3NoYXJwL1Byb2dyYW0uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVjMDBlMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY3NoYXJwL1Byb2dyYW0uY3MKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UKKy8vCisvLyBTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRSBvciB2aXNpdCB0aGUgVGhyaWZ0IHNpdGUgYXQ6CisvLyBodHRwOi8vZGV2ZWxvcGVycy5mYWNlYm9vay5jb20vdGhyaWZ0LworCit1c2luZyBTeXN0ZW07Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0OwordXNpbmcgVGhyaWZ0LlByb3RvY29sOwordXNpbmcgVGhyaWZ0LlRlc3Q7IC8vZ2VuZXJhdGVkIGNvZGUKKworbmFtZXNwYWNlIFRlc3QKK3sKKyAgICBjbGFzcyBQcm9ncmFtCisgICAgeworICAgICAgICBzdGF0aWMgaW50IE1haW4oc3RyaW5nW10gYXJncykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGFyZ3MuTGVuZ3RoID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIm11c3QgcHJvdmlkZSAnc2VydmVyJyBvciAnY2xpZW50JyBhcmciKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuU2V0QnVmZmVyU2l6ZShDb25zb2xlLkJ1ZmZlcldpZHRoLCA0MDk2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkZhaWxlZCB0byBncm93IHNjcm9sbC1iYWNrIGJ1ZmZlciIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdHJpbmdbXSBzdWJBcmdzID0gbmV3IHN0cmluZ1thcmdzLkxlbmd0aCAtIDFdOworICAgICAgICAgICAgZm9yKGludCBpID0gMTsgaSA8IGFyZ3MuTGVuZ3RoOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3ViQXJnc1tpLTFdID0gYXJnc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhcmdzWzBdID09ICJjbGllbnQiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBUZXN0Q2xpZW50LkV4ZWN1dGUoc3ViQXJncyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChhcmdzWzBdID09ICJzZXJ2ZXIiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBUZXN0U2VydmVyLkV4ZWN1dGUoc3ViQXJncykgPyAwIDogMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiZmlyc3QgYXJndW1lbnQgbXVzdCBiZSAnc2VydmVyJyBvciAnY2xpZW50JyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L2NzaGFycC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL3Rlc3QvY3NoYXJwL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMTAxYTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NzaGFycC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMCwwICsxLDU1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKKworLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZworLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KK1thc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiVGhyaWZ0VGVzdCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJUaHJpZnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCisKKy8vIFNldHRpbmcgQ29tVmlzaWJsZSB0byBmYWxzZSBtYWtlcyB0aGUgdHlwZXMgaW4gdGhpcyBhc3NlbWJseSBub3QgdmlzaWJsZQorLy8gdG8gQ09NIGNvbXBvbmVudHMuICBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgYSB0eXBlIGluIHRoaXMgYXNzZW1ibHkgZnJvbQorLy8gQ09NLCBzZXQgdGhlIENvbVZpc2libGUgYXR0cmlidXRlIHRvIHRydWUgb24gdGhhdCB0eXBlLgorW2Fzc2VtYmx5OiBDb21WaXNpYmxlKGZhbHNlKV0KKworLy8gVGhlIGZvbGxvd2luZyBHVUlEIGlzIGZvciB0aGUgSUQgb2YgdGhlIHR5cGVsaWIgaWYgdGhpcyBwcm9qZWN0IGlzIGV4cG9zZWQgdG8gQ09NCitbYXNzZW1ibHk6IEd1aWQoImY0MWIxOTNiLWYxYWItNDhlZS04ODQzLWY4OGU0MzA4NGUyNiIpXQorCisvLyBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciBhbiBhc3NlbWJseSBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIGZvdXIgdmFsdWVzOgorLy8KKy8vICAgICAgTWFqb3IgVmVyc2lvbgorLy8gICAgICBNaW5vciBWZXJzaW9uCisvLyAgICAgIEJ1aWxkIE51bWJlcgorLy8gICAgICBSZXZpc2lvbgorLy8KKy8vIFlvdSBjYW4gc3BlY2lmeSBhbGwgdGhlIHZhbHVlcyBvciB5b3UgY2FuIGRlZmF1bHQgdGhlIEJ1aWxkIGFuZCBSZXZpc2lvbiBOdW1iZXJzCisvLyBieSB1c2luZyB0aGUgJyonIGFzIHNob3duIGJlbG93OgorLy8gW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4qIildCitbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLjAuMCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUZpbGVWZXJzaW9uKCIxLjAuMC4wIildCmRpZmYgLS1naXQgYS90ZXN0L2NzaGFycC9UZXN0Q2xpZW50LmNzIGIvdGVzdC9jc2hhcnAvVGVzdENsaWVudC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDljMDZlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jc2hhcnAvVGVzdENsaWVudC5jcwpAQCAtMCwwICsxLDg3MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5EaWFnbm9zdGljczsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHkuWDUwOUNlcnRpZmljYXRlczsKK3VzaW5nIFRocmlmdC5Db2xsZWN0aW9uczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbDsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnQ7Cit1c2luZyBUaHJpZnQuVGVzdDsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5BdXRoZW50aWNhdGlvbjsKKworbmFtZXNwYWNlIFRlc3QKK3sKKyAgICBwdWJsaWMgY2xhc3MgVGVzdENsaWVudAorICAgIHsKKyAgICAgICAgcHVibGljIGNsYXNzIFRlc3RQYXJhbXMKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIGludCBudW1JdGVyYXRpb25zID0gMTsKKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgaG9zdCA9ICJsb2NhbGhvc3QiOworICAgICAgICAgICAgcHVibGljIGludCBwb3J0ID0gOTA5MDsKKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgdXJsOworICAgICAgICAgICAgcHVibGljIHN0cmluZyBwaXBlOworICAgICAgICAgICAgcHVibGljIGJvb2wgYnVmZmVyZWQ7CisgICAgICAgICAgICBwdWJsaWMgYm9vbCBmcmFtZWQ7CisgICAgICAgICAgICBwdWJsaWMgc3RyaW5nIHByb3RvY29sOworICAgICAgICAgICAgcHVibGljIGJvb2wgZW5jcnlwdGVkID0gZmFsc2U7CisgICAgICAgICAgICBwdWJsaWMgYm9vbCBtdWx0aXBsZXhlZCA9IGZhbHNlOworICAgICAgICAgICAgcHJvdGVjdGVkIGJvb2wgX2lzRmlyc3RUcmFuc3BvcnQgPSB0cnVlOworCisKKyAgICAgICAgICAgIHB1YmxpYyBUVHJhbnNwb3J0IENyZWF0ZVRyYW5zcG9ydCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHVybCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZW5kcG9pbnQgdHJhbnNwb3J0CisgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQgdHJhbnMgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBpZiAocGlwZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVE5hbWVkUGlwZUNsaWVudFRyYW5zcG9ydChwaXBlKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5jcnlwdGVkKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjZXJ0UGF0aCA9ICIuLi9rZXlzL2NsaWVudC5wMTIiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZSBjZXJ0ID0gbmV3IFg1MDlDZXJ0aWZpY2F0ZTIoY2VydFBhdGgsICJ0aHJpZnQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUVExTU29ja2V0KGhvc3QsIHBvcnQsIDAsIGNlcnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobywgYywgY2hhaW4sIGVycm9ycykgPT4gdHJ1ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIFNzbFByb3RvY29scy5UbHMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gbmV3IFRTb2NrZXQoaG9zdCwgcG9ydCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBsYXllcmVkIHRyYW5zcG9ydAorICAgICAgICAgICAgICAgICAgICBpZiAoYnVmZmVyZWQpCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQodHJhbnMpOworICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWVkKQorICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVEZyYW1lZFRyYW5zcG9ydCh0cmFucyk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9pc0ZpcnN0VHJhbnNwb3J0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL2Vuc3VyZSBwcm9wZXIgb3Blbi9jbG9zZSBvZiB0cmFuc3BvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zLk9wZW4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zLkNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBfaXNGaXJzdFRyYW5zcG9ydCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cmFuczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUSHR0cENsaWVudChuZXcgVXJpKHVybCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRQcm90b2NvbCBDcmVhdGVQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zcG9ydCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocHJvdG9jb2wgPT0gImNvbXBhY3QiKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRDb21wYWN0UHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChwcm90b2NvbCA9PSAianNvbiIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVEpTT05Qcm90b2NvbCh0cmFuc3BvcnQpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIGNvbnN0IGludCBFcnJvckJhc2VUeXBlcyA9IDE7CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IEVycm9yU3RydWN0cyA9IDI7CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IEVycm9yQ29udGFpbmVycyA9IDQ7CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IEVycm9yRXhjZXB0aW9ucyA9IDg7CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IEVycm9yUHJvdG9jb2wgPSAxNjsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgRXJyb3JVbmtub3duID0gNjQ7CisKKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBDbGllbnRUZXN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVGVzdFBhcmFtcyBwYXJhbTsKKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVFRyYW5zcG9ydCB0cmFuc3BvcnQ7CisgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFNlY29uZFNlcnZpY2UuQ2xpZW50IHNlY29uZDsKKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVGhyaWZ0VGVzdC5DbGllbnQgY2xpZW50OworICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbnQgbnVtSXRlcmF0aW9uczsKKyAgICAgICAgICAgIHByaXZhdGUgYm9vbCBkb25lOworCisgICAgICAgICAgICBwdWJsaWMgaW50IFJldHVybkNvZGUgeyBnZXQ7IHNldDsgfQorCisgICAgICAgICAgICBwdWJsaWMgQ2xpZW50VGVzdChUZXN0UGFyYW1zIHBhcmFtaW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGFyYW0gPSBwYXJhbWluOworICAgICAgICAgICAgICAgIHRyYW5zcG9ydCA9IHBhcmFtLkNyZWF0ZVRyYW5zcG9ydCgpOworICAgICAgICAgICAgICAgIFRQcm90b2NvbCBwcm90b2NvbCA9IHBhcmFtLkNyZWF0ZVByb3RvY29sKHRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgaWYgKHBhcmFtLm11bHRpcGxleGVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2Vjb25kID0gbmV3IFNlY29uZFNlcnZpY2UuQ2xpZW50KG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbChwcm90b2NvbCwgIlNlY29uZFNlcnZpY2UiKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNsaWVudCA9IG5ldyBUaHJpZnRUZXN0LkNsaWVudChwcm90b2NvbCk7CisgICAgICAgICAgICAgICAgbnVtSXRlcmF0aW9ucyA9IHBhcmFtLm51bUl0ZXJhdGlvbnM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBFeGVjdXRlKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZG9uZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJFeGVjdXRlIGNhbGxlZCBtb3JlIHRoYW4gb25jZSIpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtSXRlcmF0aW9uczsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdHJhbnNwb3J0LklzT3BlbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQuT3BlbigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJDb25uZWN0IGZhaWxlZDogIiArIGV4Lk1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuQ29kZSB8PSBFcnJvclVua25vd247CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuQ29kZSB8PSBFeGVjdXRlQ2xpZW50VGVzdChjbGllbnQsIHNlY29uZCwgcGFyYW0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJldHVybkNvZGUgfD0gRXJyb3JVbmtub3duOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LkNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJFcnJvciB3aGlsZSBjbG9zaW5nIHRyYW5zcG9ydCIpOworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IEV4ZWN1dGUoc3RyaW5nW10gYXJncykKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVGVzdFBhcmFtcyBwYXJhbSA9IG5ldyBUZXN0UGFyYW1zKCk7CisgICAgICAgICAgICAgICAgaW50IG51bVRocmVhZHMgPSAxOworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLkxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJnc1tpXSA9PSAiLXUiKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLnVybCA9IGFyZ3NbKytpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi1uIikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5udW1JdGVyYXRpb25zID0gQ29udmVydC5Ub0ludDMyKGFyZ3NbKytpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItcGlwZSIpICAvLyAtcGlwZSA8bmFtZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5waXBlID0gYXJnc1srK2ldOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVc2luZyBuYW1lZCBwaXBlcyB0cmFuc3BvcnQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0uQ29udGFpbnMoIi0taG9zdD0iKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5ob3N0ID0gYXJnc1tpXS5TdWJzdHJpbmcoYXJnc1tpXS5JbmRleE9mKCI9IikgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0uQ29udGFpbnMoIi0tcG9ydD0iKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5wb3J0ID0gaW50LlBhcnNlKGFyZ3NbaV0uU3Vic3RyaW5nKGFyZ3NbaV0uSW5kZXhPZigiPSIpKzEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi1iIiB8fCBhcmdzW2ldID09ICItLWJ1ZmZlcmVkIiB8fCBhcmdzW2ldID09ICItLXRyYW5zcG9ydD1idWZmZXJlZCIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0uYnVmZmVyZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVc2luZyBidWZmZXJlZCBzb2NrZXRzIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItZiIgfHwgYXJnc1tpXSA9PSAiLS1mcmFtZWQiICB8fCBhcmdzW2ldID09ICItLXRyYW5zcG9ydD1mcmFtZWQiKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLmZyYW1lZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlVzaW5nIGZyYW1lZCB0cmFuc3BvcnQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi10IikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1UaHJlYWRzID0gQ29udmVydC5Ub0ludDMyKGFyZ3NbKytpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLWNvbXBhY3QiIHx8IGFyZ3NbaV0gPT0gIi0tcHJvdG9jb2w9Y29tcGFjdCIgfHwgYXJnc1tpXSA9PSAiLS1wcm90b2NvbD1tdWx0aWMiKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLnByb3RvY29sID0gImNvbXBhY3QiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVc2luZyBjb21wYWN0IHByb3RvY29sIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLWpzb24iIHx8IGFyZ3NbaV0gPT0gIi0tcHJvdG9jb2w9anNvbiIgfHwgYXJnc1tpXSA9PSAiLS1wcm90b2NvbD1tdWx0aWoiKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLnByb3RvY29sID0gImpzb24iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVc2luZyBKU09OIHByb3RvY29sIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLXNzbCIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0uZW5jcnlwdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVXNpbmcgZW5jcnlwdGVkIHRyYW5zcG9ydCIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJnc1tpXS5TdGFydHNXaXRoKCItLXByb3RvY29sPW11bHRpIikpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0ubXVsdGlwbGV4ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkVycm9yIHdoaWxlICBwYXJzaW5nIGFyZ3VtZW50cyIpOworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRXJyb3JVbmtub3duOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZhciB0ZXN0cyA9IEVudW1lcmFibGUuUmFuZ2UoMCwgbnVtVGhyZWFkcykuU2VsZWN0KF8gPT4gbmV3IENsaWVudFRlc3QocGFyYW0pKS5Ub0FycmF5KCk7CisgICAgICAgICAgICAgICAgLy9pc3N1ZSB0ZXN0cyBvbiBzZXBhcmF0ZSB0aHJlYWRzIHNpbXVsdGFuZW91c2x5CisgICAgICAgICAgICAgICAgdmFyIHRocmVhZHMgPSB0ZXN0cy5TZWxlY3QodGVzdCA9PiBuZXcgVGhyZWFkKHRlc3QuRXhlY3V0ZSkpLlRvQXJyYXkoKTsKKyAgICAgICAgICAgICAgICBEYXRlVGltZSBzdGFydCA9IERhdGVUaW1lLk5vdzsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgdCBpbiB0aHJlYWRzKQorICAgICAgICAgICAgICAgICAgICB0LlN0YXJ0KCk7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHQgaW4gdGhyZWFkcykKKyAgICAgICAgICAgICAgICAgICAgdC5Kb2luKCk7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlRvdGFsIHRpbWU6ICIgKyAoRGF0ZVRpbWUuTm93IC0gc3RhcnQpKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOworICAgICAgICAgICAgICAgIHJldHVybiB0ZXN0cy5TZWxlY3QodCA9PiB0LlJldHVybkNvZGUpLkFnZ3JlZ2F0ZSgocjEsIHIyKSA9PiByMSB8IHIyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gb3V0ZXJFeCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVW5leHBlY3RlZCBlcnJvciIpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKG91dGVyRXguTWVzc2FnZSArICIgU1Q6ICIgKyBvdXRlckV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgICAgIHJldHVybiBFcnJvclVua25vd247CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIHN0cmluZyBCeXRlc1RvSGV4KGJ5dGVbXSBkYXRhKSB7CisgICAgICAgICAgICByZXR1cm4gQml0Q29udmVydGVyLlRvU3RyaW5nKGRhdGEpLlJlcGxhY2UoIi0iLCBzdHJpbmcuRW1wdHkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBieXRlW10gUHJlcGFyZVRlc3REYXRhKGJvb2wgcmFuZG9tRGlzdCwgYm9vbCBodWdlKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBodWdlID0gdHJ1ZSB0ZXN0cyBmb3IgVEhSSUZULTQzNzIKKyAgICAgICAgICAgIGJ5dGVbXSByZXR2YWwgPSBuZXcgYnl0ZVtodWdlID8gMHgxMjM0NSA6IDB4MTAwXTsKKyAgICAgICAgICAgIGludCBpbml0TGVuID0gcmV0dmFsLkxlbmd0aDsKKworICAgICAgICAgICAgLy8gbGluZWFyIGRpc3RyaWJ1dGlvbiwgdW5sZXNzIHJhbmRvbSBpcyByZXF1ZXN0ZWQKKyAgICAgICAgICAgIGlmICghcmFuZG9tRGlzdCkgeworICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdExlbjsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHZhbFtpXSA9IChieXRlKWk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHJhbmRvbSBkaXN0cmlidXRpb24KKyAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdExlbjsgKytpKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsW2ldID0gKGJ5dGUpMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhciBybmQgPSBuZXcgUmFuZG9tKCk7CisgICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGluaXRMZW47ICsraSkgeworICAgICAgICAgICAgICAgIHdoaWxlKCB0cnVlKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBuZXh0UG9zID0gcm5kLk5leHQoKSAlIGluaXRMZW47CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXR2YWxbbmV4dFBvc10gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsW25leHRQb3NdID0gKGJ5dGUpaTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IEV4ZWN1dGVDbGllbnRUZXN0KFRocmlmdFRlc3QuQ2xpZW50IGNsaWVudCwgU2Vjb25kU2VydmljZS5DbGllbnQgc2Vjb25kLCBUZXN0UGFyYW1zIHBhcmFtKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgcmV0dXJuQ29kZSA9IDA7CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RWb2lkKCkiKTsKKyAgICAgICAgICAgIGNsaWVudC50ZXN0Vm9pZCgpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9IHZvaWQiKTsKKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdFN0cmluZyhcIlRlc3RcIikiKTsKKyAgICAgICAgICAgIHN0cmluZyBzID0gY2xpZW50LnRlc3RTdHJpbmcoIlRlc3QiKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSBcIiIgKyBzICsgIlwiIik7CisgICAgICAgICAgICBpZiAoIlRlc3QiICE9IHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBhcmFtLm11bHRpcGxleGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJzZWNvbmRUZXN0U3RyaW5nKFwiVGVzdDJcIikiKTsKKyAgICAgICAgICAgICAgICBzID0gc2Vjb25kLnNlY29uZHRlc3RTdHJpbmcoIlRlc3QyIik7CisgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSBcIiIgKyBzICsgIlwiIik7CisgICAgICAgICAgICAgIGlmICgidGVzdFN0cmluZyhcIlRlc3QyXCIpIiAhPSBzKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JQcm90b2NvbDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0Qm9vbCh0cnVlKSIpOworICAgICAgICAgICAgYm9vbCB0ID0gY2xpZW50LnRlc3RCb29sKChib29sKXRydWUpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyB0KTsKKyAgICAgICAgICAgIGlmICghdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEJvb2woZmFsc2UpIik7CisgICAgICAgICAgICBib29sIGYgPSBjbGllbnQudGVzdEJvb2woKGJvb2wpZmFsc2UpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBmKTsKKyAgICAgICAgICAgIGlmIChmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RCeXRlKDEpIik7CisgICAgICAgICAgICBzYnl0ZSBpOCA9IGNsaWVudC50ZXN0Qnl0ZSgoc2J5dGUpMSk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIGk4KTsKKyAgICAgICAgICAgIGlmICgxICE9IGk4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RJMzIoLTEpIik7CisgICAgICAgICAgICBpbnQgaTMyID0gY2xpZW50LnRlc3RJMzIoLTEpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBpMzIpOworICAgICAgICAgICAgaWYgKC0xICE9IGkzMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0STY0KC0zNDM1OTczODM2OCkiKTsKKyAgICAgICAgICAgIGxvbmcgaTY0ID0gY2xpZW50LnRlc3RJNjQoLTM0MzU5NzM4MzY4KTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgaTY0KTsKKyAgICAgICAgICAgIGlmICgtMzQzNTk3MzgzNjggIT0gaTY0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRPRE86IFZhbGlkYXRlIHJlY2VpdmVkIG1lc3NhZ2UKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3REb3VibGUoNS4zMjUwOTgyMzUpIik7CisgICAgICAgICAgICBkb3VibGUgZHViID0gY2xpZW50LnRlc3REb3VibGUoNS4zMjUwOTgyMzUpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBkdWIpOworICAgICAgICAgICAgaWYgKDUuMzI1MDk4MjM1ICE9IGR1YikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdERvdWJsZSgtMC4wMDAzNDEwMTI0Mzk2Mzg1OTgyNzkpIik7CisgICAgICAgICAgICBkdWIgPSBjbGllbnQudGVzdERvdWJsZSgtMC4wMDAzNDEwMTI0Mzk2Mzg1OTgyNzkpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBkdWIpOworICAgICAgICAgICAgaWYgKC0wLjAwMDM0MTAxMjQzOTYzODU5ODI3OSAhPSBkdWIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpMzIgPSAwOyBpMzIgPCAyOyArK2kzMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgaHVnZSA9IChpMzIgPiAwKTsKKyAgICAgICAgICAgICAgICBieXRlW10gYmluT3V0ID0gUHJlcGFyZVRlc3REYXRhKGZhbHNlLGh1Z2UpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RCaW5hcnkoIiArIEJ5dGVzVG9IZXgoYmluT3V0KSArICIpIik7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBieXRlW10gYmluSW4gPSBjbGllbnQudGVzdEJpbmFyeShiaW5PdXQpOworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIEJ5dGVzVG9IZXgoYmluSW4pKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJpbkluLkxlbmd0aCAhPSBiaW5PdXQuTGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgb2ZzID0gMDsgb2ZzIDwgTWF0aC5NaW4oYmluSW4uTGVuZ3RoLCBiaW5PdXQuTGVuZ3RoKTsgKytvZnMpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmluSW5bb2ZzXSAhPSBiaW5PdXRbb2ZzXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoVGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gYmluYXJ5IGVxdWFscz8gb25seSB3aXRoIGhhc2hjb2RlIG9wdGlvbiBlbmFibGVkIC4uLgorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlRlc3QgQ3JhenlOZXN0aW5nIik7CisgICAgICAgICAgICBpZiggdHlwZW9mKENyYXp5TmVzdGluZykuR2V0TWV0aG9kKCJFcXVhbHMiKS5EZWNsYXJpbmdUeXBlID09IHR5cGVvZihDcmF6eU5lc3RpbmcpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENyYXp5TmVzdGluZyBvbmUgPSBuZXcgQ3JhenlOZXN0aW5nKCk7CisgICAgICAgICAgICAgICAgQ3JhenlOZXN0aW5nIHR3byA9IG5ldyBDcmF6eU5lc3RpbmcoKTsKKyAgICAgICAgICAgICAgICBvbmUuU3RyaW5nX2ZpZWxkID0gImNyYXp5IjsKKyAgICAgICAgICAgICAgICB0d28uU3RyaW5nX2ZpZWxkID0gImNyYXp5IjsKKyAgICAgICAgICAgICAgICBvbmUuQmluYXJ5X2ZpZWxkID0gbmV3IGJ5dGVbMTBdIHsgMHgwMCwgMHgwMSwgMHgwMiwgMHgwNCwgMHgwOCwgMHgxMCwgMHgyMCwgMHg0MCwgMHg4MCwgMHhGRiB9OworICAgICAgICAgICAgICAgIHR3by5CaW5hcnlfZmllbGQgPSBuZXcgYnl0ZVsxMF0geyAweDAwLCAweDAxLCAweDAyLCAweDA0LCAweDA4LCAweDEwLCAweDIwLCAweDQwLCAweDgwLCAweEZGIH07CisgICAgICAgICAgICAgICAgaWYgKCFvbmUuRXF1YWxzKHR3bykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckNvbnRhaW5lcnM7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkNyYXp5TmVzdGluZy5FcXVhbHMgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUT0RPOiBWYWxpZGF0ZSByZWNlaXZlZCBtZXNzYWdlCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0U3RydWN0KHtcIlplcm9cIiwgMSwgLTMsIC01fSkiKTsKKyAgICAgICAgICAgIFh0cnVjdCBvID0gbmV3IFh0cnVjdCgpOworICAgICAgICAgICAgby5TdHJpbmdfdGhpbmcgPSAiWmVybyI7CisgICAgICAgICAgICBvLkJ5dGVfdGhpbmcgPSAoc2J5dGUpMTsKKyAgICAgICAgICAgIG8uSTMyX3RoaW5nID0gLTM7CisgICAgICAgICAgICBvLkk2NF90aGluZyA9IC01OworICAgICAgICAgICAgWHRydWN0IGkgPSBjbGllbnQudGVzdFN0cnVjdChvKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSB7XCIiICsgaS5TdHJpbmdfdGhpbmcgKyAiXCIsICIgKyBpLkJ5dGVfdGhpbmcgKyAiLCAiICsgaS5JMzJfdGhpbmcgKyAiLCAiICsgaS5JNjRfdGhpbmcgKyAifSIpOworCisgICAgICAgICAgICAvLyBUT0RPOiBWYWxpZGF0ZSByZWNlaXZlZCBtZXNzYWdlCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0TmVzdCh7MSwge1wiWmVyb1wiLCAxLCAtMywgLTV9LCA1fSkiKTsKKyAgICAgICAgICAgIFh0cnVjdDIgbzIgPSBuZXcgWHRydWN0MigpOworICAgICAgICAgICAgbzIuQnl0ZV90aGluZyA9IChzYnl0ZSkxOworICAgICAgICAgICAgbzIuU3RydWN0X3RoaW5nID0gbzsKKyAgICAgICAgICAgIG8yLkkzMl90aGluZyA9IDU7CisgICAgICAgICAgICBYdHJ1Y3QyIGkyID0gY2xpZW50LnRlc3ROZXN0KG8yKTsKKyAgICAgICAgICAgIGkgPSBpMi5TdHJ1Y3RfdGhpbmc7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0geyIgKyBpMi5CeXRlX3RoaW5nICsgIiwge1wiIiArIGkuU3RyaW5nX3RoaW5nICsgIlwiLCAiICsgaS5CeXRlX3RoaW5nICsgIiwgIiArIGkuSTMyX3RoaW5nICsgIiwgIiArIGkuSTY0X3RoaW5nICsgIn0sICIgKyBpMi5JMzJfdGhpbmcgKyAifSIpOworCisgICAgICAgICAgICBEaWN0aW9uYXJ5PGludCwgaW50PiBtYXBvdXQgPSBuZXcgRGljdGlvbmFyeTxpbnQsIGludD4oKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgNTsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1hcG91dFtqXSA9IGogLSAxMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RNYXAoeyIpOworICAgICAgICAgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICBmb3JlYWNoIChpbnQga2V5IGluIG1hcG91dC5LZXlzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoa2V5ICsgIiA9PiAiICsgbWFwb3V0W2tleV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgifSkiKTsKKworICAgICAgICAgICAgRGljdGlvbmFyeTxpbnQsIGludD4gbWFwaW4gPSBjbGllbnQudGVzdE1hcChtYXBvdXQpOworCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIgPSB7Iik7CisgICAgICAgICAgICBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICBmb3JlYWNoIChpbnQga2V5IGluIG1hcGluLktleXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShrZXkgKyAiID0+ICIgKyBtYXBpbltrZXldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ9Iik7CisKKyAgICAgICAgICAgIC8vIFRPRE86IFZhbGlkYXRlIHJlY2VpdmVkIG1lc3NhZ2UKKyAgICAgICAgICAgIExpc3Q8aW50PiBsaXN0b3V0ID0gbmV3IExpc3Q8aW50PigpOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IC0yOyBqIDwgMzsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxpc3RvdXQuQWRkKGopOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdExpc3QoeyIpOworICAgICAgICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgZm9yZWFjaCAoaW50IGogaW4gbGlzdG91dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGopOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgifSkiKTsKKworICAgICAgICAgICAgTGlzdDxpbnQ+IGxpc3RpbiA9IGNsaWVudC50ZXN0TGlzdChsaXN0b3V0KTsKKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiID0geyIpOworICAgICAgICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgZm9yZWFjaCAoaW50IGogaW4gbGlzdGluKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoaik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgifSIpOworCisgICAgICAgICAgICAvL3NldAorICAgICAgICAgICAgLy8gVE9ETzogVmFsaWRhdGUgcmVjZWl2ZWQgbWVzc2FnZQorICAgICAgICAgICAgVEhhc2hTZXQ8aW50PiBzZXRvdXQgPSBuZXcgVEhhc2hTZXQ8aW50PigpOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IC0yOyBqIDwgMzsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNldG91dC5BZGQoaik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0U2V0KHsiKTsKKyAgICAgICAgICAgIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvcmVhY2ggKGludCBqIGluIHNldG91dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGopOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgifSkiKTsKKworICAgICAgICAgICAgVEhhc2hTZXQ8aW50PiBzZXRpbiA9IGNsaWVudC50ZXN0U2V0KHNldG91dCk7CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiA9IHsiKTsKKyAgICAgICAgICAgIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvcmVhY2ggKGludCBqIGluIHNldGluKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoaik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgifSIpOworCisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RFbnVtKE9ORSkiKTsKKyAgICAgICAgICAgIE51bWJlcnogcmV0ID0gY2xpZW50LnRlc3RFbnVtKE51bWJlcnouT05FKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgcmV0KTsKKyAgICAgICAgICAgIGlmIChOdW1iZXJ6Lk9ORSAhPSByZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvclN0cnVjdHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RFbnVtKFRXTykiKTsKKyAgICAgICAgICAgIHJldCA9IGNsaWVudC50ZXN0RW51bShOdW1iZXJ6LlRXTyk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIHJldCk7CisgICAgICAgICAgICBpZiAoTnVtYmVyei5UV08gIT0gcmV0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JTdHJ1Y3RzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0RW51bShUSFJFRSkiKTsKKyAgICAgICAgICAgIHJldCA9IGNsaWVudC50ZXN0RW51bShOdW1iZXJ6LlRIUkVFKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgcmV0KTsKKyAgICAgICAgICAgIGlmIChOdW1iZXJ6LlRIUkVFICE9IHJldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yU3RydWN0czsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEVudW0oRklWRSkiKTsKKyAgICAgICAgICAgIHJldCA9IGNsaWVudC50ZXN0RW51bShOdW1iZXJ6LkZJVkUpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyByZXQpOworICAgICAgICAgICAgaWYgKE51bWJlcnouRklWRSAhPSByZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvclN0cnVjdHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RFbnVtKEVJR0hUKSIpOworICAgICAgICAgICAgcmV0ID0gY2xpZW50LnRlc3RFbnVtKE51bWJlcnouRUlHSFQpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyByZXQpOworICAgICAgICAgICAgaWYgKE51bWJlcnouRUlHSFQgIT0gcmV0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JTdHJ1Y3RzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0VHlwZWRlZigzMDk4NTgyMzUwODI1MjMpIik7CisgICAgICAgICAgICBsb25nIHVpZCA9IGNsaWVudC50ZXN0VHlwZWRlZigzMDk4NTgyMzUwODI1MjNMKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgdWlkKTsKKyAgICAgICAgICAgIGlmICgzMDk4NTgyMzUwODI1MjNMICE9IHVpZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yU3RydWN0czsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVE9ETzogVmFsaWRhdGUgcmVjZWl2ZWQgbWVzc2FnZQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdE1hcE1hcCgxKSIpOworICAgICAgICAgICAgRGljdGlvbmFyeTxpbnQsIERpY3Rpb25hcnk8aW50LCBpbnQ+PiBtbSA9IGNsaWVudC50ZXN0TWFwTWFwKDEpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiID0geyIpOworICAgICAgICAgICAgZm9yZWFjaCAoaW50IGtleSBpbiBtbS5LZXlzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoa2V5ICsgIiA9PiB7Iik7CisgICAgICAgICAgICAgICAgRGljdGlvbmFyeTxpbnQsIGludD4gbTIgPSBtbVtrZXldOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKGludCBrMiBpbiBtMi5LZXlzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShrMiArICIgPT4gIiArIG0yW2syXSArICIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ9LCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ9Iik7CisKKyAgICAgICAgICAgIC8vIFRPRE86IFZhbGlkYXRlIHJlY2VpdmVkIG1lc3NhZ2UKKyAgICAgICAgICAgIEluc2FuaXR5IGluc2FuZSA9IG5ldyBJbnNhbml0eSgpOworICAgICAgICAgICAgaW5zYW5lLlVzZXJNYXAgPSBuZXcgRGljdGlvbmFyeTxOdW1iZXJ6LCBsb25nPigpOworICAgICAgICAgICAgaW5zYW5lLlVzZXJNYXBbTnVtYmVyei5GSVZFXSA9IDUwMDBMOworICAgICAgICAgICAgWHRydWN0IHRydWNrID0gbmV3IFh0cnVjdCgpOworICAgICAgICAgICAgdHJ1Y2suU3RyaW5nX3RoaW5nID0gIlRydWNrIjsKKyAgICAgICAgICAgIHRydWNrLkJ5dGVfdGhpbmcgPSAoc2J5dGUpODsKKyAgICAgICAgICAgIHRydWNrLkkzMl90aGluZyA9IDg7CisgICAgICAgICAgICB0cnVjay5JNjRfdGhpbmcgPSA4OworICAgICAgICAgICAgaW5zYW5lLlh0cnVjdHMgPSBuZXcgTGlzdDxYdHJ1Y3Q+KCk7CisgICAgICAgICAgICBpbnNhbmUuWHRydWN0cy5BZGQodHJ1Y2spOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEluc2FuaXR5KCkiKTsKKyAgICAgICAgICAgIERpY3Rpb25hcnk8bG9uZywgRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4+IHdob2EgPSBjbGllbnQudGVzdEluc2FuaXR5KGluc2FuZSk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIgPSB7Iik7CisgICAgICAgICAgICBmb3JlYWNoIChsb25nIGtleSBpbiB3aG9hLktleXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4gdmFsID0gd2hvYVtrZXldOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoa2V5ICsgIiA9PiB7Iik7CisKKyAgICAgICAgICAgICAgICBmb3JlYWNoIChOdW1iZXJ6IGsyIGluIHZhbC5LZXlzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgSW5zYW5pdHkgdjIgPSB2YWxbazJdOworCisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoazIgKyAiID0+IHsiKTsKKyAgICAgICAgICAgICAgICAgICAgRGljdGlvbmFyeTxOdW1iZXJ6LCBsb25nPiB1c2VyTWFwID0gdjIuVXNlck1hcDsKKworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ7Iik7CisgICAgICAgICAgICAgICAgICAgIGlmICh1c2VyTWFwICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKE51bWJlcnogazMgaW4gdXNlck1hcC5LZXlzKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoazMgKyAiID0+ICIgKyB1c2VyTWFwW2szXSArICIsICIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgibnVsbCIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIn0sICIpOworCisgICAgICAgICAgICAgICAgICAgIExpc3Q8WHRydWN0PiB4dHJ1Y3RzID0gdjIuWHRydWN0czsKKworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ7Iik7CisgICAgICAgICAgICAgICAgICAgIGlmICh4dHJ1Y3RzICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKFh0cnVjdCB4IGluIHh0cnVjdHMpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgie1wiIiArIHguU3RyaW5nX3RoaW5nICsgIlwiLCAiICsgeC5CeXRlX3RoaW5nICsgIiwgIiArIHguSTMyX3RoaW5nICsgIiwgIiArIHguSTMyX3RoaW5nICsgIn0sICIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgibnVsbCIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIn0iKTsKKworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ9LCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgifSwgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgifSIpOworCisgICAgICAgICAgICBzYnl0ZSBhcmcwID0gMTsKKyAgICAgICAgICAgIGludCBhcmcxID0gMjsKKyAgICAgICAgICAgIGxvbmcgYXJnMiA9IGxvbmcuTWF4VmFsdWU7CisgICAgICAgICAgICBEaWN0aW9uYXJ5PHNob3J0LCBzdHJpbmc+IG11bHRpRGljdCA9IG5ldyBEaWN0aW9uYXJ5PHNob3J0LCBzdHJpbmc+KCk7CisgICAgICAgICAgICBtdWx0aURpY3RbMV0gPSAib25lIjsKKyAgICAgICAgICAgIE51bWJlcnogYXJnNCA9IE51bWJlcnouRklWRTsKKyAgICAgICAgICAgIGxvbmcgYXJnNSA9IDUwMDAwMDA7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJUZXN0IE11bHRpKCIgKyBhcmcwICsgIiwiICsgYXJnMSArICIsIiArIGFyZzIgKyAiLCIgKyBtdWx0aURpY3QgKyAiLCIgKyBhcmc0ICsgIiwiICsgYXJnNSArICIpIik7CisgICAgICAgICAgICBYdHJ1Y3QgbXVsdGlSZXNwb25zZSA9IGNsaWVudC50ZXN0TXVsdGkoYXJnMCwgYXJnMSwgYXJnMiwgbXVsdGlEaWN0LCBhcmc0LCBhcmc1KTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiA9IFh0cnVjdChieXRlX3RoaW5nOiIgKyBtdWx0aVJlc3BvbnNlLkJ5dGVfdGhpbmcgKyAiLFN0cmluZ190aGluZzoiICsgbXVsdGlSZXNwb25zZS5TdHJpbmdfdGhpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIixpMzJfdGhpbmc6IiArIG11bHRpUmVzcG9uc2UuSTMyX3RoaW5nICsgIixpNjRfdGhpbmc6IiArIG11bHRpUmVzcG9uc2UuSTY0X3RoaW5nICsgIilcbiIpOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdEV4Y2VwdGlvbihcIlhjZXB0aW9uXCIpIik7CisgICAgICAgICAgICAgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oIlhjZXB0aW9uIik7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoWGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGV4LkVycm9yQ29kZSAhPSAxMDAxIHx8IGV4Lk1lc3NhZ2UgIT0gIlhjZXB0aW9uIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgZXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdEV4Y2VwdGlvbihcIlRFeGNlcHRpb25cIikiKTsKKyAgICAgICAgICAgICAgICBjbGllbnQudGVzdEV4Y2VwdGlvbigiVEV4Y2VwdGlvbiIpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFRocmlmdC5URXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIE9LCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgZXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdEV4Y2VwdGlvbihcIm9rXCIpIik7CisgICAgICAgICAgICAgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oIm9rIik7CisgICAgICAgICAgICAgICAgLy8gT0sKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RNdWx0aUV4Y2VwdGlvbihcIlhjZXB0aW9uXCIsIC4uLikiKTsKKyAgICAgICAgICAgICAgICBjbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKCJYY2VwdGlvbiIsICJpZ25vcmUiKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChYY2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZXguRXJyb3JDb2RlICE9IDEwMDEgfHwgZXguTWVzc2FnZSAhPSAiVGhpcyBpcyBhbiBYY2VwdGlvbiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RNdWx0aUV4Y2VwdGlvbihcIlhjZXB0aW9uMlwiLCAuLi4pIik7CisgICAgICAgICAgICAgICAgY2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbigiWGNlcHRpb24yIiwgImlnbm9yZSIpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFhjZXB0aW9uMiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZXguRXJyb3JDb2RlICE9IDIwMDIgfHwgZXguU3RydWN0X3RoaW5nLlN0cmluZ190aGluZyAhPSAiVGhpcyBpcyBhbiBYY2VwdGlvbjIiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0TXVsdGlFeGNlcHRpb24oXCJzdWNjZXNzXCIsIFwiT0tcIikiKTsKKyAgICAgICAgICAgICAgICBpZiAoIk9LIiAhPSBjbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKCJzdWNjZXNzIiwgIk9LIikuU3RyaW5nX3RoaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RvcHdhdGNoIHN3ID0gbmV3IFN0b3B3YXRjaCgpOworICAgICAgICAgICAgc3cuU3RhcnQoKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJUZXN0IE9uZXdheSgxKSIpOworICAgICAgICAgICAgY2xpZW50LnRlc3RPbmV3YXkoMSk7CisgICAgICAgICAgICBzdy5TdG9wKCk7CisgICAgICAgICAgICBpZiAoc3cuRWxhcHNlZE1pbGxpc2Vjb25kcyA+IDEwMDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiVGVzdCBDYWxsdGltZSgpIik7CisgICAgICAgICAgICB2YXIgdGltZXMgPSA1MDsKKyAgICAgICAgICAgIHN3LlJlc2V0KCk7CisgICAgICAgICAgICBzdy5TdGFydCgpOworICAgICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCB0aW1lczsgKytrKQorICAgICAgICAgICAgICAgIGNsaWVudC50ZXN0Vm9pZCgpOworICAgICAgICAgICAgc3cuU3RvcCgpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9IHswfSBtcyBhIHRlc3RWb2lkKCkgY2FsbCIsIHN3LkVsYXBzZWRNaWxsaXNlY29uZHMgLyB0aW1lcyk7CisgICAgICAgICAgICByZXR1cm4gcmV0dXJuQ29kZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvY3NoYXJwL1Rlc3RTZXJ2ZXIuY3MgYi90ZXN0L2NzaGFycC9UZXN0U2VydmVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNjQ1YzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NzaGFycC9UZXN0U2VydmVyLmNzCkBAIC0wLDAgKzEsNTM1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZQorLy8KKy8vIFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFIG9yIHZpc2l0IHRoZSBUaHJpZnQgc2l0ZSBhdDoKKy8vIGh0dHA6Ly9kZXZlbG9wZXJzLmZhY2Vib29rLmNvbS90aHJpZnQvCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHkuWDUwOUNlcnRpZmljYXRlczsKK3VzaW5nIFRocmlmdC5Db2xsZWN0aW9uczsKK3VzaW5nIFRocmlmdC5UZXN0OyAvL2dlbmVyYXRlZCBjb2RlCit1c2luZyBUaHJpZnQuVHJhbnNwb3J0OwordXNpbmcgVGhyaWZ0LlByb3RvY29sOwordXNpbmcgVGhyaWZ0LlNlcnZlcjsKK3VzaW5nIFRocmlmdDsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5BdXRoZW50aWNhdGlvbjsKKworbmFtZXNwYWNlIFRlc3QKK3sKKyAgICBwdWJsaWMgY2xhc3MgVGVzdFNlcnZlcgorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgX2NsaWVudElEID0gLTE7CisgICAgICAgIHB1YmxpYyBkZWxlZ2F0ZSB2b2lkIFRlc3RMb2dEZWxlZ2F0ZShzdHJpbmcgbXNnLCBwYXJhbXMgb2JqZWN0W10gdmFsdWVzKTsKKworICAgICAgICBwdWJsaWMgY2xhc3MgVHJhZGVTZXJ2ZXJFdmVudEhhbmRsZXIgOiBUU2VydmVyRXZlbnRIYW5kbGVyCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgY2FsbENvdW50ID0gMDsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHByZVNlcnZlKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYWxsQ291bnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlQ29udGV4dChUaHJpZnQuUHJvdG9jb2wuVFByb3RvY29sIGlucHV0LCBUaHJpZnQuUHJvdG9jb2wuVFByb3RvY29sIG91dHB1dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYWxsQ291bnQrKzsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGRlbGV0ZUNvbnRleHQoT2JqZWN0IHNlcnZlckNvbnRleHQsIFRocmlmdC5Qcm90b2NvbC5UUHJvdG9jb2wgaW5wdXQsIFRocmlmdC5Qcm90b2NvbC5UUHJvdG9jb2wgb3V0cHV0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhbGxDb3VudCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVibGljIHZvaWQgcHJvY2Vzc0NvbnRleHQoT2JqZWN0IHNlcnZlckNvbnRleHQsIFRocmlmdC5UcmFuc3BvcnQuVFRyYW5zcG9ydCB0cmFuc3BvcnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FsbENvdW50Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKworICAgICAgICBwdWJsaWMgY2xhc3MgVGVzdEhhbmRsZXIgOiBUaHJpZnRUZXN0LklmYWNlLCBUaHJpZnQuVENvbnRyb2xsaW5nSGFuZGxlcgorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgVFNlcnZlciBzZXJ2ZXIgeyBnZXQ7IHNldDsgfQorICAgICAgICAgICAgcHJpdmF0ZSBpbnQgaGFuZGxlcklEOworICAgICAgICAgICAgcHJpdmF0ZSBTdHJpbmdCdWlsZGVyIHJldXNhYmxlU3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBwcml2YXRlIFRlc3RMb2dEZWxlZ2F0ZSB0ZXN0TG9nRGVsZWdhdGU7CisKKyAgICAgICAgICAgIHB1YmxpYyBUZXN0SGFuZGxlcigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGFuZGxlcklEID0gSW50ZXJsb2NrZWQuSW5jcmVtZW50KHJlZiBfY2xpZW50SUQpOworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZSArPSB0ZXN0Q29uc29sZUxvZ2dlcjsKKyAgICAgICAgICAgICAgICB0ZXN0TG9nRGVsZWdhdGUuSW52b2tlKCJOZXcgVGVzdEhhbmRsZXIgaW5zdGFuY2UgY3JlYXRlZCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc29sZUxvZ2dlcihzdHJpbmcgbXNnLCBwYXJhbXMgb2JqZWN0W10gdmFsdWVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5DbGVhcigpOworICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5BcHBlbmRGb3JtYXQoImhhbmRsZXJ7MDpEM306IixoYW5kbGVySUQpOworICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5BcHBlbmRGb3JtYXQobXNnLCB2YWx1ZXMpOworICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5BcHBlbmRMaW5lKCk7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSggcmV1c2FibGVTdHJpbmdCdWlsZGVyLlRvU3RyaW5nKCkgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgdGVzdFZvaWQoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UoInRlc3RWb2lkKCkiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHN0cmluZyB0ZXN0U3RyaW5nKHN0cmluZyB0aGluZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZXN0TG9nRGVsZWdhdGUuSW52b2tlKCJ0ZXN0U3RyaW5nKHswfSkiLCB0aGluZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaW5nOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYm9vbCB0ZXN0Qm9vbChib29sIHRoaW5nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UoInRlc3RCb29sKHswfSkiLCB0aGluZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaW5nOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgc2J5dGUgdGVzdEJ5dGUoc2J5dGUgdGhpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZSgidGVzdEJ5dGUoezB9KSIsIHRoaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpbmc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgdGVzdEkzMihpbnQgdGhpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZSgidGVzdEkzMih7MH0pIiwgdGhpbmcpOworICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGxvbmcgdGVzdEk2NChsb25nIHRoaW5nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UoInRlc3RJNjQoezB9KSIsIHRoaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpbmc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBkb3VibGUgdGVzdERvdWJsZShkb3VibGUgdGhpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZSgidGVzdERvdWJsZSh7MH0pIiwgdGhpbmcpOworICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGJ5dGVbXSB0ZXN0QmluYXJ5KGJ5dGVbXSB0aGluZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJpbmcgaGV4ID0gQml0Q29udmVydGVyLlRvU3RyaW5nKHRoaW5nKS5SZXBsYWNlKCItIiwgc3RyaW5nLkVtcHR5KTsKKyAgICAgICAgICAgICAgICB0ZXN0TG9nRGVsZWdhdGUuSW52b2tlKCJ0ZXN0QmluYXJ5KHswOlh9KSIsIGhleCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaW5nOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgWHRydWN0IHRlc3RTdHJ1Y3QoWHRydWN0IHRoaW5nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UoInRlc3RTdHJ1Y3Qoe3tcInswfVwiLCB7MX0sIHsyfSwgezN9fX0pIiwgdGhpbmcuU3RyaW5nX3RoaW5nLCB0aGluZy5CeXRlX3RoaW5nLCB0aGluZy5JMzJfdGhpbmcsIHRoaW5nLkk2NF90aGluZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaW5nOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgWHRydWN0MiB0ZXN0TmVzdChYdHJ1Y3QyIG5lc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgWHRydWN0IHRoaW5nID0gbmVzdC5TdHJ1Y3RfdGhpbmc7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZSgidGVzdE5lc3Qoe3t7MH0sIHt7XCJ7MX1cIiwgezJ9LCB7M30sIHs0fSwgezV9fX19fSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVzdC5CeXRlX3RoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpbmcuU3RyaW5nX3RoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpbmcuQnl0ZV90aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaW5nLkkzMl90aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaW5nLkk2NF90aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lc3QuSTMyX3RoaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmVzdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIERpY3Rpb25hcnk8aW50LCBpbnQ+IHRlc3RNYXAoRGljdGlvbmFyeTxpbnQsIGludD4gdGhpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkNsZWFyKCk7CisgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZCgidGVzdE1hcCh7eyIpOworICAgICAgICAgICAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKGludCBrZXkgaW4gdGhpbmcuS2V5cykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5BcHBlbmQoIiwgIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZEZvcm1hdCgiezB9ID0+IHsxfSIsIGtleSwgdGhpbmdba2V5XSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5BcHBlbmQoIn19KSIpOworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UocmV1c2FibGVTdHJpbmdCdWlsZGVyLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+IHRlc3RTdHJpbmdNYXAoRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4gdGhpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkNsZWFyKCk7CisgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZCgidGVzdFN0cmluZ01hcCh7eyIpOworICAgICAgICAgICAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyBrZXkgaW4gdGhpbmcuS2V5cykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5BcHBlbmQoIiwgIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZEZvcm1hdCgiezB9ID0+IHsxfSIsIGtleSwgdGhpbmdba2V5XSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5BcHBlbmQoIn19KSIpOworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UocmV1c2FibGVTdHJpbmdCdWlsZGVyLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRIYXNoU2V0PGludD4gdGVzdFNldChUSGFzaFNldDxpbnQ+IHRoaW5nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5DbGVhcigpOworICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5BcHBlbmQoInRlc3RTZXQoe3siKTsKKyAgICAgICAgICAgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoIChpbnQgZWxlbSBpbiB0aGluZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5BcHBlbmQoIiwgIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZEZvcm1hdCgiezB9IiwgZWxlbSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5BcHBlbmQoIn19KSIpOworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UocmV1c2FibGVTdHJpbmdCdWlsZGVyLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIExpc3Q8aW50PiB0ZXN0TGlzdChMaXN0PGludD4gdGhpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkNsZWFyKCk7CisgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZCgidGVzdExpc3Qoe3siKTsKKyAgICAgICAgICAgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoIChpbnQgZWxlbSBpbiB0aGluZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5BcHBlbmQoIiwgIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZEZvcm1hdCgiezB9IiwgZWxlbSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldXNhYmxlU3RyaW5nQnVpbGRlci5BcHBlbmQoIn19KSIpOworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UocmV1c2FibGVTdHJpbmdCdWlsZGVyLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIE51bWJlcnogdGVzdEVudW0oTnVtYmVyeiB0aGluZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZXN0TG9nRGVsZWdhdGUuSW52b2tlKCJ0ZXN0RW51bSh7MH0pIiwgdGhpbmcpOworICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGxvbmcgdGVzdFR5cGVkZWYobG9uZyB0aGluZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZXN0TG9nRGVsZWdhdGUuSW52b2tlKCJ0ZXN0VHlwZWRlZih7MH0pIiwgdGhpbmcpOworICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIERpY3Rpb25hcnk8aW50LCBEaWN0aW9uYXJ5PGludCwgaW50Pj4gdGVzdE1hcE1hcChpbnQgaGVsbG8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZSgidGVzdE1hcE1hcCh7MH0pIiwgaGVsbG8pOworICAgICAgICAgICAgICAgIERpY3Rpb25hcnk8aW50LCBEaWN0aW9uYXJ5PGludCwgaW50Pj4gbWFwbWFwID0KKyAgICAgICAgICAgICAgICAgIG5ldyBEaWN0aW9uYXJ5PGludCwgRGljdGlvbmFyeTxpbnQsIGludD4+KCk7CisKKyAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5PGludCwgaW50PiBwb3MgPSBuZXcgRGljdGlvbmFyeTxpbnQsIGludD4oKTsKKyAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5PGludCwgaW50PiBuZWcgPSBuZXcgRGljdGlvbmFyeTxpbnQsIGludD4oKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IDU7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBvc1tpXSA9IGk7CisgICAgICAgICAgICAgICAgICAgIG5lZ1staV0gPSAtaTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtYXBtYXBbNF0gPSBwb3M7CisgICAgICAgICAgICAgICAgbWFwbWFwWy00XSA9IG5lZzsKKworICAgICAgICAgICAgICAgIHJldHVybiBtYXBtYXA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEluc2FuaXR5CisgICAgICAgICAgICAvLyByZXR1cm5zOgorICAgICAgICAgICAgLy8geyAxID0+IHsgMiA9PiBhcmd1bWVudCwKKyAgICAgICAgICAgIC8vICAgICAgICAgIDMgPT4gYXJndW1lbnQsCisgICAgICAgICAgICAvLyAgICAgICAgfSwKKyAgICAgICAgICAgIC8vICAgMiA9PiB7IDYgPT4gPGVtcHR5IEluc2FuaXR5IHN0cnVjdD4sIH0sCisgICAgICAgICAgICAvLyB9CisgICAgICAgICAgICBwdWJsaWMgRGljdGlvbmFyeTxsb25nLCBEaWN0aW9uYXJ5PE51bWJlcnosIEluc2FuaXR5Pj4gdGVzdEluc2FuaXR5KEluc2FuaXR5IGFyZ3VtZW50KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UoInRlc3RJbnNhbml0eSgpIik7CisKKyAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5PE51bWJlcnosIEluc2FuaXR5PiBmaXJzdF9tYXAgPSBuZXcgRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4oKTsKKyAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5PE51bWJlcnosIEluc2FuaXR5PiBzZWNvbmRfbWFwID0gbmV3IERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+KCk7IDsKKworICAgICAgICAgICAgICAgIGZpcnN0X21hcFtOdW1iZXJ6LlRXT10gPSBhcmd1bWVudDsKKyAgICAgICAgICAgICAgICBmaXJzdF9tYXBbTnVtYmVyei5USFJFRV0gPSBhcmd1bWVudDsKKworICAgICAgICAgICAgICAgIHNlY29uZF9tYXBbTnVtYmVyei5TSVhdID0gbmV3IEluc2FuaXR5KCk7CisKKyAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5PGxvbmcsIERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+PiBpbnNhbmUgPQorICAgICAgICAgICAgICAgICAgbmV3IERpY3Rpb25hcnk8bG9uZywgRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4+KCk7CisgICAgICAgICAgICAgICAgaW5zYW5lWyhsb25nKTFdID0gZmlyc3RfbWFwOworICAgICAgICAgICAgICAgIGluc2FuZVsobG9uZykyXSA9IHNlY29uZF9tYXA7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5zYW5lOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgWHRydWN0IHRlc3RNdWx0aShzYnl0ZSBhcmcwLCBpbnQgYXJnMSwgbG9uZyBhcmcyLCBEaWN0aW9uYXJ5PHNob3J0LCBzdHJpbmc+IGFyZzMsIE51bWJlcnogYXJnNCwgbG9uZyBhcmc1KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UoInRlc3RNdWx0aSgpIik7CisKKyAgICAgICAgICAgICAgICBYdHJ1Y3QgaGVsbG8gPSBuZXcgWHRydWN0KCk7IDsKKyAgICAgICAgICAgICAgICBoZWxsby5TdHJpbmdfdGhpbmcgPSAiSGVsbG8yIjsKKyAgICAgICAgICAgICAgICBoZWxsby5CeXRlX3RoaW5nID0gYXJnMDsKKyAgICAgICAgICAgICAgICBoZWxsby5JMzJfdGhpbmcgPSBhcmcxOworICAgICAgICAgICAgICAgIGhlbGxvLkk2NF90aGluZyA9IGFyZzI7CisgICAgICAgICAgICAgICAgcmV0dXJuIGhlbGxvOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFByaW50ICd0ZXN0RXhjZXB0aW9uKCVzKScgd2l0aCBhcmcgYXMgJyVzJworICAgICAgICAgICAgICogQHBhcmFtIHN0cmluZyBhcmcgLSBhIHN0cmluZyBpbmRpY2F0aW9uIHdoYXQgdHlwZSBvZiBleGNlcHRpb24gdG8gdGhyb3cKKyAgICAgICAgICAgICAqIGlmIGFyZyA9PSAiWGNlcHRpb24iIHRocm93IFhjZXB0aW9uIHdpdGggZXJyb3JDb2RlID0gMTAwMSBhbmQgbWVzc2FnZSA9IGFyZworICAgICAgICAgICAgICogZWxzZW4gaWYgYXJnID09ICJURXhjZXB0aW9uIiB0aHJvdyBURXhjZXB0aW9uCisgICAgICAgICAgICAgKiBlbHNlIGRvIG5vdCB0aHJvdyBhbnl0aGluZworICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0RXhjZXB0aW9uKHN0cmluZyBhcmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZSgidGVzdEV4Y2VwdGlvbih7MH0pIiwgYXJnKTsKKyAgICAgICAgICAgICAgICBpZiAoYXJnID09ICJYY2VwdGlvbiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBYY2VwdGlvbiB4ID0gbmV3IFhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIHguRXJyb3JDb2RlID0gMTAwMTsKKyAgICAgICAgICAgICAgICAgICAgeC5NZXNzYWdlID0gYXJnOworICAgICAgICAgICAgICAgICAgICB0aHJvdyB4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYXJnID09ICJURXhjZXB0aW9uIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUaHJpZnQuVEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBYdHJ1Y3QgdGVzdE11bHRpRXhjZXB0aW9uKHN0cmluZyBhcmcwLCBzdHJpbmcgYXJnMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZXN0TG9nRGVsZWdhdGUuSW52b2tlKCJ0ZXN0TXVsdGlFeGNlcHRpb24oezB9LCB7MX0pIiwgYXJnMCxhcmcxKTsKKyAgICAgICAgICAgICAgICBpZiAoYXJnMCA9PSAiWGNlcHRpb24iKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgWGNlcHRpb24geCA9IG5ldyBYY2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICB4LkVycm9yQ29kZSA9IDEwMDE7CisgICAgICAgICAgICAgICAgICAgIHguTWVzc2FnZSA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uIjsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgeDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnMCA9PSAiWGNlcHRpb24yIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFhjZXB0aW9uMiB4ID0gbmV3IFhjZXB0aW9uMigpOworICAgICAgICAgICAgICAgICAgICB4LkVycm9yQ29kZSA9IDIwMDI7CisgICAgICAgICAgICAgICAgICAgIHguU3RydWN0X3RoaW5nID0gbmV3IFh0cnVjdCgpOworICAgICAgICAgICAgICAgICAgICB4LlN0cnVjdF90aGluZy5TdHJpbmdfdGhpbmcgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbjIiOworICAgICAgICAgICAgICAgICAgICB0aHJvdyB4OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFh0cnVjdCByZXN1bHQgPSBuZXcgWHRydWN0KCk7CisgICAgICAgICAgICAgICAgcmVzdWx0LlN0cmluZ190aGluZyA9IGFyZzE7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgdGVzdFN0b3AoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChzZXJ2ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNlcnZlci5TdG9wKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0T25ld2F5KGludCBhcmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZSgidGVzdE9uZXdheSh7MH0pLCBzbGVlcGluZy4uLiIsIGFyZyk7CisgICAgICAgICAgICAgICAgU3lzdGVtLlRocmVhZGluZy5UaHJlYWQuU2xlZXAoYXJnICogMTAwMCk7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZSgidGVzdE9uZXdheSBmaW5pc2hlZCIpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gLy8gY2xhc3MgVGVzdEhhbmRsZXIKKworICAgICAgICBwcml2YXRlIGVudW0gU2VydmVyVHlwZQorICAgICAgICB7CisgICAgICAgICAgICBUU2ltcGxlU2VydmVyLAorICAgICAgICAgICAgVFRocmVhZGVkU2VydmVyLAorICAgICAgICAgICAgVFRocmVhZFBvb2xTZXJ2ZXIsCisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGVudW0gUHJvY2Vzc29yRmFjdG9yeVR5cGUKKyAgICAgICAgeworICAgICAgICAgICAgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICBUUHJvdG90eXBlUHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbCBFeGVjdXRlKHN0cmluZ1tdIGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJvb2wgdXNlQnVmZmVyZWRTb2NrZXRzID0gZmFsc2UsIHVzZUZyYW1lZCA9IGZhbHNlLCB1c2VFbmNyeXB0aW9uID0gZmFsc2UsIGNvbXBhY3QgPSBmYWxzZSwganNvbiA9IGZhbHNlOworICAgICAgICAgICAgICAgIFNlcnZlclR5cGUgc2VydmVyVHlwZSA9IFNlcnZlclR5cGUuVFNpbXBsZVNlcnZlcjsKKyAgICAgICAgICAgICAgICBQcm9jZXNzb3JGYWN0b3J5VHlwZSBwcm9jZXNzb3JGYWN0b3J5VHlwZSA9IFByb2Nlc3NvckZhY3RvcnlUeXBlLlRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5OworICAgICAgICAgICAgICAgIGludCBwb3J0ID0gOTA5MDsKKyAgICAgICAgICAgICAgICBzdHJpbmcgcGlwZSA9IG51bGw7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLkxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3NbaV0gPT0gIi1waXBlIikgIC8vIC1waXBlIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcGlwZSA9IGFyZ3NbKytpXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldLkNvbnRhaW5zKCItLXBvcnQ9IikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQgPSBpbnQuUGFyc2UoYXJnc1tpXS5TdWJzdHJpbmcoYXJnc1tpXS5JbmRleE9mKCI9IikgKyAxKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLWIiIHx8IGFyZ3NbaV0gPT0gIi0tYnVmZmVyZWQiIHx8IGFyZ3NbaV0gPT0gIi0tdHJhbnNwb3J0PWJ1ZmZlcmVkIikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdXNlQnVmZmVyZWRTb2NrZXRzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItZiIgfHwgYXJnc1tpXSA9PSAiLS1mcmFtZWQiIHx8IGFyZ3NbaV0gPT0gIi0tdHJhbnNwb3J0PWZyYW1lZCIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzZUZyYW1lZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS1jb21wYWN0IiB8fCBhcmdzW2ldID09ICItLXByb3RvY29sPWNvbXBhY3QiKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21wYWN0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLWpzb24iIHx8IGFyZ3NbaV0gPT0gIi0tcHJvdG9jb2w9anNvbiIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGpzb24gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi0tdGhyZWFkZWQiIHx8IGFyZ3NbaV0gPT0gIi0tc2VydmVyLXR5cGU9dGhyZWFkZWQiKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUeXBlID0gU2VydmVyVHlwZS5UVGhyZWFkZWRTZXJ2ZXI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS10aHJlYWRwb29sIiB8fCBhcmdzW2ldID09ICItLXNlcnZlci10eXBlPXRocmVhZHBvb2wiKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUeXBlID0gU2VydmVyVHlwZS5UVGhyZWFkUG9vbFNlcnZlcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLXByb3RvdHlwZSIgfHwgYXJnc1tpXSA9PSAiLS1wcm9jZXNzb3I9cHJvdG90eXBlIikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc29yRmFjdG9yeVR5cGUgPSBQcm9jZXNzb3JGYWN0b3J5VHlwZS5UUHJvdG90eXBlUHJvY2Vzc29yRmFjdG9yeTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLXNzbCIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzZUVuY3J5cHRpb24gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gVHJhbnNwb3J0CisgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCB0cmFuczsKKyAgICAgICAgICAgICAgICBpZiAocGlwZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydChwaXBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHVzZUVuY3J5cHRpb24pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjZXJ0UGF0aCA9ICIuLi9rZXlzL3NlcnZlci5wMTIiOworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVFRMU1NlcnZlclNvY2tldChwb3J0LCAwLCB1c2VCdWZmZXJlZFNvY2tldHMsIG5ldyBYNTA5Q2VydGlmaWNhdGUyKGNlcnRQYXRoLCAidGhyaWZ0IiksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgU3NsUHJvdG9jb2xzLlRscyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUU2VydmVyU29ja2V0KHBvcnQsIDAsIHVzZUJ1ZmZlcmVkU29ja2V0cyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IHByb3RvOworICAgICAgICAgICAgICAgIGlmIChjb21wYWN0KQorICAgICAgICAgICAgICAgICAgICBwcm90byA9IG5ldyBUQ29tcGFjdFByb3RvY29sLkZhY3RvcnkoKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChqc29uKQorICAgICAgICAgICAgICAgICAgICBwcm90byA9IG5ldyBUSlNPTlByb3RvY29sLkZhY3RvcnkoKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHByb3RvID0gbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCk7CisKKyAgICAgICAgICAgICAgICBUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5OworICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzb3JGYWN0b3J5VHlwZSA9PSBQcm9jZXNzb3JGYWN0b3J5VHlwZS5UUHJvdG90eXBlUHJvY2Vzc29yRmFjdG9yeSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NvckZhY3RvcnkgPSBuZXcgVFByb3RvdHlwZVByb2Nlc3NvckZhY3Rvcnk8VGhyaWZ0VGVzdC5Qcm9jZXNzb3IsIFRlc3RIYW5kbGVyPigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBQcm9jZXNzb3IKKyAgICAgICAgICAgICAgICAgICAgVGVzdEhhbmRsZXIgdGVzdEhhbmRsZXIgPSBuZXcgVGVzdEhhbmRsZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VGVzdC5Qcm9jZXNzb3IgdGVzdFByb2Nlc3NvciA9IG5ldyBUaHJpZnRUZXN0LlByb2Nlc3Nvcih0ZXN0SGFuZGxlcik7CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NvckZhY3RvcnkgPSBuZXcgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkodGVzdFByb2Nlc3Nvcik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNGYWN0b3J5OworICAgICAgICAgICAgICAgIGlmICh1c2VGcmFtZWQpCisgICAgICAgICAgICAgICAgICAgIHRyYW5zRmFjdG9yeSA9IG5ldyBURnJhbWVkVHJhbnNwb3J0LkZhY3RvcnkoKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHRyYW5zRmFjdG9yeSA9IG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpOworCisgICAgICAgICAgICAgICAgVFNlcnZlciBzZXJ2ZXJFbmdpbmU7CisgICAgICAgICAgICAgICAgc3dpdGNoIChzZXJ2ZXJUeXBlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTZXJ2ZXJUeXBlLlRUaHJlYWRQb29sU2VydmVyOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyRW5naW5lID0gbmV3IFRUaHJlYWRQb29sU2VydmVyKHByb2Nlc3NvckZhY3RvcnksIHRyYW5zLCB0cmFuc0ZhY3RvcnksIHByb3RvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFNlcnZlclR5cGUuVFRocmVhZGVkU2VydmVyOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyRW5naW5lID0gbmV3IFRUaHJlYWRlZFNlcnZlcihwcm9jZXNzb3JGYWN0b3J5LCB0cmFucywgdHJhbnNGYWN0b3J5LCBwcm90byk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlckVuZ2luZSA9IG5ldyBUU2ltcGxlU2VydmVyKHByb2Nlc3NvckZhY3RvcnksIHRyYW5zLCB0cmFuc0ZhY3RvcnksIHByb3RvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vU2VydmVyIGV2ZW50IGhhbmRsZXIKKyAgICAgICAgICAgICAgICBUcmFkZVNlcnZlckV2ZW50SGFuZGxlciBzZXJ2ZXJFdmVudHMgPSBuZXcgVHJhZGVTZXJ2ZXJFdmVudEhhbmRsZXIoKTsKKyAgICAgICAgICAgICAgICBzZXJ2ZXJFbmdpbmUuc2V0RXZlbnRIYW5kbGVyKHNlcnZlckV2ZW50cyk7CisKKyAgICAgICAgICAgICAgICAvLyBSdW4gaXQKKyAgICAgICAgICAgICAgICBzdHJpbmcgd2hlcmUgPSAocGlwZSAhPSBudWxsID8gIm9uIHBpcGUgIiArIHBpcGUgOiAib24gcG9ydCAiICsgcG9ydCk7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlN0YXJ0aW5nIHRoZSAiICsgc2VydmVyVHlwZS5Ub1N0cmluZygpICsgIiAiICsgd2hlcmUgKworICAgICAgICAgICAgICAgICAgICAocHJvY2Vzc29yRmFjdG9yeVR5cGUgPT0gUHJvY2Vzc29yRmFjdG9yeVR5cGUuVFByb3RvdHlwZVByb2Nlc3NvckZhY3RvcnkgPyAiIHdpdGggcHJvY2Vzc29yIHByb3RvdHlwZSBmYWN0b3J5ICIgOiAiIikgKworICAgICAgICAgICAgICAgICAgICAodXNlQnVmZmVyZWRTb2NrZXRzID8gIiB3aXRoIGJ1ZmZlcmVkIHNvY2tldCIgOiAiIikgKworICAgICAgICAgICAgICAgICAgICAodXNlRnJhbWVkID8gIiB3aXRoIGZyYW1lZCB0cmFuc3BvcnQiIDogIiIpICsKKyAgICAgICAgICAgICAgICAgICAgKHVzZUVuY3J5cHRpb24gPyAiIHdpdGggZW5jcnlwdGlvbiIgOiAiIikgKworICAgICAgICAgICAgICAgICAgICAoY29tcGFjdCA/ICIgd2l0aCBjb21wYWN0IHByb3RvY29sIiA6ICIiKSArCisgICAgICAgICAgICAgICAgICAgIChqc29uID8gIiB3aXRoIGpzb24gcHJvdG9jb2wiIDogIiIpICsKKyAgICAgICAgICAgICAgICAgICAgIi4uLiIpOworICAgICAgICAgICAgICAgIHNlcnZlckVuZ2luZS5TZXJ2ZSgpOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIHgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5FcnJvci5Xcml0ZSh4KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiZG9uZS4iKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9jc2hhcnAvVGhyaWZ0VGVzdC5jc3Byb2ogYi90ZXN0L2NzaGFycC9UaHJpZnRUZXN0LmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzYyOWViCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jc2hhcnAvVGhyaWZ0VGVzdC5jc3Byb2oKQEAgLTAsMCArMSwxNDEgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KKyAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+CisgICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4yMTAyMjwvUHJvZHVjdFZlcnNpb24+CisgICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPgorICAgIDxQcm9qZWN0R3VpZD57NDhERDc1N0YtQ0E5NS00REQ3LUJEQTQtNThEQjZGMTA4QzJDfTwvUHJvamVjdEd1aWQ+CisgICAgPE91dHB1dFR5cGU+RXhlPC9PdXRwdXRUeXBlPgorICAgIDxBcHBEZXNpZ25lckZvbGRlcj5Qcm9wZXJ0aWVzPC9BcHBEZXNpZ25lckZvbGRlcj4KKyAgICA8Um9vdE5hbWVzcGFjZT5UaHJpZnRUZXN0PC9Sb290TmFtZXNwYWNlPgorICAgIDxBc3NlbWJseU5hbWU+VGhyaWZ0VGVzdDwvQXNzZW1ibHlOYW1lPgorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnYzLjU8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+CisgICAgPEZpbGVBbGlnbm1lbnQ+NTEyPC9GaWxlQWxpZ25tZW50PgorICAgIDxJc1dlYkJvb3RzdHJhcHBlcj5mYWxzZTwvSXNXZWJCb290c3RyYXBwZXI+CisgICAgPEZpbGVVcGdyYWRlRmxhZ3M+CisgICAgPC9GaWxlVXBncmFkZUZsYWdzPgorICAgIDxPbGRUb29sc1ZlcnNpb24+My41PC9PbGRUb29sc1ZlcnNpb24+CisgICAgPFVwZ3JhZGVCYWNrdXBMb2NhdGlvbiAvPgorICAgIDxQdWJsaXNoVXJsPnB1Ymxpc2hcPC9QdWJsaXNoVXJsPgorICAgIDxJbnN0YWxsPnRydWU8L0luc3RhbGw+CisgICAgPEluc3RhbGxGcm9tPkRpc2s8L0luc3RhbGxGcm9tPgorICAgIDxVcGRhdGVFbmFibGVkPmZhbHNlPC9VcGRhdGVFbmFibGVkPgorICAgIDxVcGRhdGVNb2RlPkZvcmVncm91bmQ8L1VwZGF0ZU1vZGU+CisgICAgPFVwZGF0ZUludGVydmFsPjc8L1VwZGF0ZUludGVydmFsPgorICAgIDxVcGRhdGVJbnRlcnZhbFVuaXRzPkRheXM8L1VwZGF0ZUludGVydmFsVW5pdHM+CisgICAgPFVwZGF0ZVBlcmlvZGljYWxseT5mYWxzZTwvVXBkYXRlUGVyaW9kaWNhbGx5PgorICAgIDxVcGRhdGVSZXF1aXJlZD5mYWxzZTwvVXBkYXRlUmVxdWlyZWQ+CisgICAgPE1hcEZpbGVFeHRlbnNpb25zPnRydWU8L01hcEZpbGVFeHRlbnNpb25zPgorICAgIDxBcHBsaWNhdGlvblJldmlzaW9uPjA8L0FwcGxpY2F0aW9uUmV2aXNpb24+CisgICAgPEFwcGxpY2F0aW9uVmVyc2lvbj4xLjAuMC4wPC9BcHBsaWNhdGlvblZlcnNpb24+CisgICAgPFVzZUFwcGxpY2F0aW9uVHJ1c3Q+ZmFsc2U8L1VzZUFwcGxpY2F0aW9uVHJ1c3Q+CisgICAgPEJvb3RzdHJhcHBlckVuYWJsZWQ+dHJ1ZTwvQm9vdHN0cmFwcGVyRW5hYmxlZD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxEZWJ1Z1w8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0PkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4KKyAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+CisgICAgPE91dHB1dFBhdGg+YmluXFJlbGVhc2VcPC9PdXRwdXRQYXRoPgorICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldD5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJUaHJpZnRJbXBsLCBWZXJzaW9uPTAuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPU1TSUwiPgorICAgICAgPFNwZWNpZmljVmVyc2lvbj5GYWxzZTwvU3BlY2lmaWNWZXJzaW9uPgorICAgICAgPEhpbnRQYXRoPi5cVGhyaWZ0SW1wbC5kbGw8L0hpbnRQYXRoPgorICAgIDwvUmVmZXJlbmNlPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9ncmFtLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RDbGllbnQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFNlcnZlci5jcyIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5DbGllbnQuMy41Ij4KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgorICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDMuNSBTUDEgQ2xpZW50IFByb2ZpbGU8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+ZmFsc2U8L0luc3RhbGw+CisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuRnJhbWV3b3JrLjIuMCI+CisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KKyAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAyLjAgJTI4eDg2JTI5PC9Qcm9kdWN0TmFtZT4KKyAgICAgIDxJbnN0YWxsPmZhbHNlPC9JbnN0YWxsPgorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkZyYW1ld29yay4zLjAiPgorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+CisgICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy4wICUyOHg4NiUyOTwvUHJvZHVjdE5hbWU+CisgICAgICA8SW5zdGFsbD5mYWxzZTwvSW5zdGFsbD4KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+CisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5GcmFtZXdvcmsuMy41Ij4KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgorICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDMuNTwvUHJvZHVjdE5hbWU+CisgICAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPgorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkZyYW1ld29yay4zLjUuU1AxIj4KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgorICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDMuNSBTUDE8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+ZmFsc2U8L0luc3RhbGw+CisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5XaW5kb3dzLkluc3RhbGxlci4zLjEiPgorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+CisgICAgICA8UHJvZHVjdE5hbWU+V2luZG93cyBJbnN0YWxsZXIgMy4xPC9Qcm9kdWN0TmFtZT4KKyAgICAgIDxJbnN0YWxsPnRydWU8L0luc3RhbGw+CisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlxsaWJcY3NoYXJwXFRocmlmdC5jc3Byb2oiPgorICAgICAgPFByb2plY3Q+ezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH08L1Byb2plY3Q+CisgICAgICA8TmFtZT5UaHJpZnQ8L05hbWU+CisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPgorICA8L0l0ZW1Hcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRUb29sc1BhdGgpXE1pY3Jvc29mdC5DU2hhcnAudGFyZ2V0cyIgLz4KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4KKyAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPgorICA8L1RhcmdldD4KKyAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4KKyAgPC9UYXJnZXQ+CisgIC0tPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8UHJlQnVpbGRFdmVudD5ybWRpciAvcyAvcSAiJChQcm9qZWN0RGlyKWdlbi1jc2hhcnAiCitkZWwgL2YgL3EgIiQoUHJvamVjdERpcilUaHJpZnRJbXBsLmRsbCIKK1NFVCBPVVRQVVRfRElSPSQoUHJvamVjdERpcikKK1NFVCBUSFJJRlRfRklMRT0kKFByb2plY3REaXIpXC4uXFRocmlmdFRlc3QudGhyaWZ0Citmb3IgJTI1JTI1SSBpbiAoIiUyNU9VVFBVVF9ESVIlMjUiKSBkbyBzZXQgU0hPUlRfRElSPSUyNSUyNX5mc0kKK2ZvciAlMjUlMjVJIGluICgiJTI1VEhSSUZUX0ZJTEUlMjUiKSBkbyBzZXQgVEhSSUZUX1NIT1JUPSUyNSUyNX5mc0kKKyIkKFByb2plY3REaXIpXC4uXC4uXGNvbXBpbGVyXGNwcFx0aHJpZnQuZXhlIiAtLWdlbiBjc2hhcnAgLW8gJTI1U0hPUlRfRElSJTI1ICUyNVRIUklGVF9TSE9SVCUyNQorJChNU0J1aWxkVG9vbHNQYXRoKVxDc2MuZXhlIC90OmxpYnJhcnkgL291dDoiJChQcm9qZWN0RGlyKVRocmlmdEltcGwuZGxsIiAvcmVjdXJzZToiJChQcm9qZWN0RGlyKWdlbi1jc2hhcnAiXCogL3JlZmVyZW5jZToiJChQcm9qZWN0RGlyKS4uXC4uXGxpYlxjc2hhcnBcYmluXERlYnVnXFRocmlmdC5kbGwiPC9QcmVCdWlsZEV2ZW50PgorICA8L1Byb3BlcnR5R3JvdXA+Cis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0L2NzaGFycC9UaHJpZnRUZXN0LnNsbiBiL3Rlc3QvY3NoYXJwL1RocmlmdFRlc3Quc2xuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NjVhMDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NzaGFycC9UaHJpZnRUZXN0LnNsbgpAQCAtMCwwICsxLDE3IEBACivvu78KK01pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFNvbHV0aW9uIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDExLjAwCisjIFZpc3VhbCBTdHVkaW8gMjAxMAorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJUaHJpZnRUZXN0IiwgIlRocmlmdFRlc3QuY3Nwcm9qIiwgIns0OERENzU3Ri1DQTk1LTRERDctQkRBNC01OERCNkYxMDhDMkN9IgorRW5kUHJvamVjdAorR2xvYmFsCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvbkNvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcHJlU29sdXRpb24KKwkJRGVidWd8QW55IENQVSA9IERlYnVnfEFueSBDUFUKKwkJUmVsZWFzZXxBbnkgQ1BVID0gUmVsZWFzZXxBbnkgQ1BVCisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oUHJvamVjdENvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcG9zdFNvbHV0aW9uCisJCXs0OERENzU3Ri1DQTk1LTRERDctQkRBNC01OERCNkYxMDhDMkN9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7NDhERDc1N0YtQ0E5NS00REQ3LUJEQTQtNThEQjZGMTA4QzJDfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs0OERENzU3Ri1DQTk1LTRERDctQkRBNC01OERCNkYxMDhDMkN9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezQ4REQ3NTdGLUNBOTUtNERENy1CREE0LTU4REI2RjEwOEMyQ30uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwlFbmRHbG9iYWxTZWN0aW9uCitFbmRHbG9iYWwKZGlmZiAtLWdpdCBhL3Rlc3QvZGFydC9NYWtlZmlsZS5hbSBiL3Rlc3QvZGFydC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzUwZWMyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXJ0L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNDIgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitnZW4tZGFydC90aHJpZnRfdGVzdC9saWIvdGhyaWZ0X3Rlc3QuZGFydDogLi4vVGhyaWZ0VGVzdC50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gZGFydCAuLi9UaHJpZnRUZXN0LnRocmlmdAorCitwdWItZ2V0LWdlbjogZ2VuLWRhcnQvdGhyaWZ0X3Rlc3QvbGliL3RocmlmdF90ZXN0LmRhcnQKKwljZCBnZW4tZGFydC90aHJpZnRfdGVzdDsgJHtEQVJUUFVCfSBnZXQKKworcHViLWdldDogcHViLWdldC1nZW4KKwljZCB0ZXN0X2NsaWVudDsgJHtEQVJUUFVCfSBnZXQKKworc3R1YnM6IGdlbi1kYXJ0L3RocmlmdF90ZXN0L2xpYi90aHJpZnRfdGVzdC5kYXJ0IHB1Yi1nZXQKKworcHJlY3Jvc3M6IHN0dWJzCisKK2NoZWNrOiBzdHVicworCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtciBnZW4tZGFydCB0ZXN0X2NsaWVudC8ucHViCisJZmluZCAuIC10eXBlIGQgLW5hbWUgInBhY2thZ2VzIiB8IHhhcmdzICQoUk0pIC1yCisJZmluZCAuIC10eXBlIGYgLW5hbWUgIi5wYWNrYWdlcyIgfCB4YXJncyAkKFJNKQorCWZpbmQgLiAtdHlwZSBmIC1uYW1lICJwdWJzcGVjLmxvY2siIHwgeGFyZ3MgJChSTSkKKworY2xpZW50OiBzdHVicworCSR7REFSVH0gdGVzdF9jbGllbnQvYmluL21haW4uZGFydApkaWZmIC0tZ2l0IGEvdGVzdC9kYXJ0L3Rlc3RfY2xpZW50Ly5hbmFseXNpc19vcHRpb25zIGIvdGVzdC9kYXJ0L3Rlc3RfY2xpZW50Ly5hbmFseXNpc19vcHRpb25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMGQ0YzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhcnQvdGVzdF9jbGllbnQvLmFuYWx5c2lzX29wdGlvbnMKQEAgLTAsMCArMSwyIEBACithbmFseXplcjoKKyAgc3Ryb25nLW1vZGU6IHRydWUKZGlmZiAtLWdpdCBhL3Rlc3QvZGFydC90ZXN0X2NsaWVudC9iaW4vbWFpbi5kYXJ0IGIvdGVzdC9kYXJ0L3Rlc3RfY2xpZW50L2Jpbi9tYWluLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk2ODQ0YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGFydC90ZXN0X2NsaWVudC9iaW4vbWFpbi5kYXJ0CkBAIC0wLDAgKzEsMzM3IEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gJ0xpY2Vuc2UnKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAnQVMgSVMnIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworaW1wb3J0ICdkYXJ0OmFzeW5jJzsKK2ltcG9ydCAnZGFydDpjb252ZXJ0JzsKK2ltcG9ydCAnZGFydDppbyc7CisKK2ltcG9ydCAncGFja2FnZTphcmdzL2FyZ3MuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6Y29sbGVjdGlvbi9jb2xsZWN0aW9uLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmh0dHAvaHR0cC5kYXJ0JyBhcyBodHRwOworaW1wb3J0ICdwYWNrYWdlOnRocmlmdC90aHJpZnQuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6dGhyaWZ0L3RocmlmdF9jb25zb2xlLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOnRocmlmdF90ZXN0L3RocmlmdF90ZXN0LmRhcnQnOworCitjb25zdCBURVNUX0JBU0VUWVBFUyA9IDE7IC8vIDAwMDAgMDAwMQorY29uc3QgVEVTVF9TVFJVQ1RTID0gMjsgLy8gMDAwMCAwMDEwCitjb25zdCBURVNUX0NPTlRBSU5FUlMgPSA0OyAvLyAwMDAwIDAxMDAKK2NvbnN0IFRFU1RfRVhDRVBUSU9OUyA9IDg7IC8vIDAwMDAgMTAwMAorY29uc3QgVEVTVF9VTktOT1dOID0gNjQ7IC8vIDAxMDAgMDAwMCAoRmFpbGVkIHRvIHByZXBhcmUgZW52aXJvbmVtdCBldGMuKQorY29uc3QgVEVTVF9USU1FT1VUID0gMTI4OyAvLyAxMDAwIDAwMDAKK2NvbnN0IFRFU1RfTk9UVVNFRCA9IDQ4OyAvLyAwMDExIDAwMDAgKHJlc2VydmVkIGJpdHMpCisKK3R5cGVkZWYgRnV0dXJlIEZ1dHVyZUZ1bmN0aW9uKCk7CisKK2NsYXNzIFRUZXN0IHsKKyAgZmluYWwgaW50IGVycm9yQ29kZTsKKyAgZmluYWwgU3RyaW5nIG5hbWU7CisgIGZpbmFsIEZ1dHVyZUZ1bmN0aW9uIGZ1bmM7CisKKyAgVFRlc3QodGhpcy5lcnJvckNvZGUsIHRoaXMubmFtZSwgdGhpcy5mdW5jKTsKK30KKworY2xhc3MgVFRlc3RFcnJvciBleHRlbmRzIEVycm9yIHsKKyAgZmluYWwgYWN0dWFsOworICBmaW5hbCBleHBlY3RlZDsKKworICBUVGVzdEVycm9yKHRoaXMuYWN0dWFsLCB0aGlzLmV4cGVjdGVkKTsKKworICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAnJGFjdHVhbCAhPSAkZXhwZWN0ZWQnOworfQorCitMaXN0PFRUZXN0PiBfdGVzdHM7CitUaHJpZnRUZXN0Q2xpZW50IGNsaWVudDsKK2Jvb2wgdmVyYm9zZTsKKworLy8vIEFkYXB0ZWQgZnJvbSBUZXN0Q2xpZW50LnBocAorbWFpbihMaXN0PFN0cmluZz4gYXJncykgYXN5bmMgeworICBBcmdSZXN1bHRzIHJlc3VsdHMgPSBfcGFyc2VBcmdzKGFyZ3MpOworCisgIGlmIChyZXN1bHRzID09IG51bGwpIHsKKyAgICBleGl0KFRFU1RfVU5LTk9XTik7CisgIH0KKworICB2ZXJib3NlID0gcmVzdWx0c1sndmVyYm9zZSddID09IHRydWU7CisKKyAgYXdhaXQgX2luaXRUZXN0Q2xpZW50KAorICAgICAgaG9zdDogcmVzdWx0c1snaG9zdCddLAorICAgICAgcG9ydDogaW50LnBhcnNlKHJlc3VsdHNbJ3BvcnQnXSksCisgICAgICB0cmFuc3BvcnRUeXBlOiByZXN1bHRzWyd0cmFuc3BvcnQnXSwKKyAgICAgIHByb3RvY29sVHlwZTogcmVzdWx0c1sncHJvdG9jb2wnXSkuY2F0Y2hFcnJvcigoZSkgeworICAgIHN0ZG91dC53cml0ZWxuKCdFcnJvcjonKTsKKyAgICBzdGRvdXQud3JpdGVsbignJGUnKTsKKyAgICBpZiAoZSBpcyBFcnJvcikgeworICAgICAgc3Rkb3V0LndyaXRlbG4oJyR7ZS5zdGFja1RyYWNlfScpOworICAgIH0KKyAgICBleGl0KFRFU1RfVU5LTk9XTik7CisgIH0pOworCisgIC8vIHJ1biB0ZXN0cworICBfdGVzdHMgPSBfY3JlYXRlVGVzdHMoKTsKKworICBpbnQgcmVzdWx0ID0gMDsKKworICBmb3IgKFRUZXN0IHRlc3QgaW4gX3Rlc3RzKSB7CisgICAgaWYgKHZlcmJvc2UpIHN0ZG91dC53cml0ZSgnJHt0ZXN0Lm5hbWV9Li4uICcpOworICAgIHRyeSB7CisgICAgICBhd2FpdCB0ZXN0LmZ1bmMoKTsKKyAgICAgIGlmICh2ZXJib3NlKSBzdGRvdXQud3JpdGVsbignc3VjY2VzcyEnKTsKKyAgICB9IGNhdGNoIChlKSB7CisgICAgICBpZiAodmVyYm9zZSkgc3Rkb3V0LndyaXRlbG4oJyRlJyk7CisgICAgICByZXN1bHQgPSByZXN1bHQgfCB0ZXN0LmVycm9yQ29kZTsKKyAgICB9CisgIH0KKworICBleGl0KHJlc3VsdCk7Cit9CisKK0FyZ1Jlc3VsdHMgX3BhcnNlQXJncyhMaXN0PFN0cmluZz4gYXJncykgeworICB2YXIgcGFyc2VyID0gbmV3IEFyZ1BhcnNlcigpOworICBwYXJzZXIuYWRkT3B0aW9uKCdob3N0JywgZGVmYXVsdHNUbzogJ2xvY2FsaG9zdCcsIGhlbHA6ICdUaGUgc2VydmVyIGhvc3QnKTsKKyAgcGFyc2VyLmFkZE9wdGlvbigncG9ydCcsIGRlZmF1bHRzVG86ICc5MDkwJywgaGVscDogJ1RoZSBwb3J0IHRvIGNvbm5lY3QgdG8nKTsKKyAgcGFyc2VyLmFkZE9wdGlvbigndHJhbnNwb3J0JywKKyAgICAgIGRlZmF1bHRzVG86ICdidWZmZXJlZCcsCisgICAgICBhbGxvd2VkOiBbJ2J1ZmZlcmVkJywgJ2ZyYW1lZCcsICdodHRwJ10sCisgICAgICBoZWxwOiAnVGhlIHRyYW5zcG9ydCBuYW1lJywKKyAgICAgIGFsbG93ZWRIZWxwOiB7CisgICAgICAgICdidWZmZXJlZCc6ICdUQnVmZmVyZWRUcmFuc3BvcnQnLAorICAgICAgICAnZnJhbWVkJzogJ1RGcmFtZWRUcmFuc3BvcnQnCisgICAgICB9KTsKKyAgcGFyc2VyLmFkZE9wdGlvbigncHJvdG9jb2wnLAorICAgICAgZGVmYXVsdHNUbzogJ2JpbmFyeScsCisgICAgICBhbGxvd2VkOiBbJ2JpbmFyeScsICdjb21wYWN0JywgJ2pzb24nXSwKKyAgICAgIGhlbHA6ICdUaGUgcHJvdG9jb2wgbmFtZScsCisgICAgICBhbGxvd2VkSGVscDogeworICAgICAgICAnYmluYXJ5JzogJ1RCaW5hcnlQcm90b2NvbCcsCisgICAgICAgICdjb21wYWN0JzogJ1RDb21wYWN0UHJvdG9jb2wnLAorICAgICAgICAnanNvbic6ICdUSnNvblByb3RvY29sJworICAgICAgfSk7CisgIHBhcnNlci5hZGRGbGFnKCd2ZXJib3NlJywgZGVmYXVsdHNUbzogZmFsc2UpOworCisgIEFyZ1Jlc3VsdHMgcmVzdWx0czsKKyAgdHJ5IHsKKyAgICByZXN1bHRzID0gcGFyc2VyLnBhcnNlKGFyZ3MpOworICB9IGNhdGNoIChlKSB7CisgICAgc3Rkb3V0LndyaXRlbG4oJyRlXG4nKTsKKyAgfQorCisgIGlmIChyZXN1bHRzID09IG51bGwpIHN0ZG91dC53cml0ZShwYXJzZXIudXNhZ2UpOworCisgIHJldHVybiByZXN1bHRzOworfQorCitUUHJvdG9jb2xGYWN0b3J5IGdldFByb3RvY29sRmFjdG9yeShTdHJpbmcgcHJvdG9jb2xUeXBlKSB7CisgIGlmIChwcm90b2NvbFR5cGUgPT0gJ2JpbmFyeScpIHsKKyAgICByZXR1cm4gbmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKTsKKyAgfSBlbHNlIGlmIChwcm90b2NvbFR5cGUgPT0gJ2NvbXBhY3QnKSB7CisgICAgcmV0dXJuIG5ldyBUQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpOworICB9IGVsc2UgaWYgKHByb3RvY29sVHlwZSA9PSAnanNvbicpIHsKKyAgICByZXR1cm4gbmV3IFRKc29uUHJvdG9jb2xGYWN0b3J5KCk7CisgIH0KKworICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvci52YWx1ZShwcm90b2NvbFR5cGUpOworfQorCitGdXR1cmUgX2luaXRUZXN0Q2xpZW50KAorICAgIHtTdHJpbmcgaG9zdCwgaW50IHBvcnQsIFN0cmluZyB0cmFuc3BvcnRUeXBlLCBTdHJpbmcgcHJvdG9jb2xUeXBlfSkgYXN5bmMgeworICBUVHJhbnNwb3J0IHRyYW5zcG9ydDsKKyAgdmFyIHByb3RvY29sRmFjdG9yeSA9IGdldFByb3RvY29sRmFjdG9yeShwcm90b2NvbFR5cGUpOworCisgIGlmICh0cmFuc3BvcnRUeXBlID09ICdodHRwJykgeworICAgIHZhciBodHRwQ2xpZW50ID0gbmV3IGh0dHAuSU9DbGllbnQoKTsKKyAgICB2YXIgdXJpID0gVXJpLnBhcnNlKCdodHRwOi8vJGhvc3Q6JHBvcnQnKTsKKyAgICB2YXIgY29uZmlnID0gbmV3IFRIdHRwQ29uZmlnKHVyaSwge30pOworICAgIHRyYW5zcG9ydCA9IG5ldyBUSHR0cENsaWVudFRyYW5zcG9ydChodHRwQ2xpZW50LCBjb25maWcpOworICB9IGVsc2UgeworICAgIHZhciBzb2NrZXQgPSBhd2FpdCBTb2NrZXQuY29ubmVjdChob3N0LCBwb3J0KTsKKyAgICB0cmFuc3BvcnQgPSBuZXcgVENsaWVudFNvY2tldFRyYW5zcG9ydChuZXcgVFRjcFNvY2tldChzb2NrZXQpKTsKKyAgICBpZiAodHJhbnNwb3J0VHlwZSA9PSAnZnJhbWVkJykgeworICAgICAgdHJhbnNwb3J0ID0gbmV3IFRGcmFtZWRUcmFuc3BvcnQodHJhbnNwb3J0KTsKKyAgICB9CisgIH0KKworICB2YXIgcHJvdG9jb2wgPSBwcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgY2xpZW50ID0gbmV3IFRocmlmdFRlc3RDbGllbnQocHJvdG9jb2wpOworCisgIGF3YWl0IHRyYW5zcG9ydC5vcGVuKCk7Cit9CisKK0xpc3Q8VFRlc3Q+IF9jcmVhdGVUZXN0cygpIHsKKyAgTGlzdDxUVGVzdD4gdGVzdHMgPSBbXTsKKworICB2YXIgeHRydWN0ID0gbmV3IFh0cnVjdCgpCisgICAgLi5zdHJpbmdfdGhpbmcgPSAnWmVybycKKyAgICAuLmJ5dGVfdGhpbmcgPSAxCisgICAgLi5pMzJfdGhpbmcgPSAtMworICAgIC4uaTY0X3RoaW5nID0gLTU7CisKKyAgdGVzdHMuYWRkKG5ldyBUVGVzdChURVNUX0JBU0VUWVBFUywgJ3Rlc3RWb2lkJywgKCkgYXN5bmMgeworICAgIGF3YWl0IGNsaWVudC50ZXN0Vm9pZCgpOworICB9KSk7CisKKyAgdGVzdHMuYWRkKG5ldyBUVGVzdChURVNUX0JBU0VUWVBFUywgJ3Rlc3RTdHJpbmcnLCAoKSBhc3luYyB7CisgICAgdmFyIGlucHV0ID0gJ1Rlc3QnOworICAgIHZhciByZXN1bHQgPSBhd2FpdCBjbGllbnQudGVzdFN0cmluZyhpbnB1dCk7CisgICAgaWYgKHJlc3VsdCAhPSBpbnB1dCkgdGhyb3cgbmV3IFRUZXN0RXJyb3IocmVzdWx0LCBpbnB1dCk7CisgIH0pKTsKKworICB0ZXN0cy5hZGQobmV3IFRUZXN0KFRFU1RfQkFTRVRZUEVTLCAndGVzdEJvb2wnLCAoKSBhc3luYyB7CisgICAgdmFyIGlucHV0ID0gdHJ1ZTsKKyAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnRlc3RCb29sKGlucHV0KTsKKyAgICBpZiAocmVzdWx0ICE9IGlucHV0KSB0aHJvdyBuZXcgVFRlc3RFcnJvcihyZXN1bHQsIGlucHV0KTsKKyAgfSkpOworCisgIHRlc3RzLmFkZChuZXcgVFRlc3QoVEVTVF9CQVNFVFlQRVMsICd0ZXN0Qnl0ZScsICgpIGFzeW5jIHsKKyAgICB2YXIgaW5wdXQgPSA2NDsKKyAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnRlc3RCeXRlKGlucHV0KTsKKyAgICBpZiAocmVzdWx0ICE9IGlucHV0KSB0aHJvdyBuZXcgVFRlc3RFcnJvcihyZXN1bHQsIGlucHV0KTsKKyAgfSkpOworCisgIHRlc3RzLmFkZChuZXcgVFRlc3QoVEVTVF9CQVNFVFlQRVMsICd0ZXN0STMyJywgKCkgYXN5bmMgeworICAgIHZhciBpbnB1dCA9IDIxNDc0ODM2NDc7CisgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGNsaWVudC50ZXN0STMyKGlucHV0KTsKKyAgICBpZiAocmVzdWx0ICE9IGlucHV0KSB0aHJvdyBuZXcgVFRlc3RFcnJvcihyZXN1bHQsIGlucHV0KTsKKyAgfSkpOworCisgIHRlc3RzLmFkZChuZXcgVFRlc3QoVEVTVF9CQVNFVFlQRVMsICd0ZXN0STY0JywgKCkgYXN5bmMgeworICAgIHZhciBpbnB1dCA9IDkyMjMzNzIwMzY4NTQ3NzU4MDc7CisgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGNsaWVudC50ZXN0STY0KGlucHV0KTsKKyAgICBpZiAocmVzdWx0ICE9IGlucHV0KSB0aHJvdyBuZXcgVFRlc3RFcnJvcihyZXN1bHQsIGlucHV0KTsKKyAgfSkpOworCisgIHRlc3RzLmFkZChuZXcgVFRlc3QoVEVTVF9CQVNFVFlQRVMsICd0ZXN0RG91YmxlJywgKCkgYXN5bmMgeworICAgIHZhciBpbnB1dCA9IDMuMTQxNTkyNjsKKyAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnRlc3REb3VibGUoaW5wdXQpOworICAgIGlmIChyZXN1bHQgIT0gaW5wdXQpIHRocm93IG5ldyBUVGVzdEVycm9yKHJlc3VsdCwgaW5wdXQpOworICB9KSk7CisKKyAgdGVzdHMuYWRkKG5ldyBUVGVzdChURVNUX0JBU0VUWVBFUywgJ3Rlc3RCaW5hcnknLCAoKSBhc3luYyB7CisgICAgdmFyIHV0ZjhDb2RlYyA9IGNvbnN0IFV0ZjhDb2RlYygpOworICAgIHZhciBpbnB1dCA9IHV0ZjhDb2RlYy5lbmNvZGUoJ2ZvbycpOworICAgIHZhciByZXN1bHQgPSBhd2FpdCBjbGllbnQudGVzdEJpbmFyeShpbnB1dCk7CisgICAgdmFyIGVxdWFsaXR5ID0gY29uc3QgTGlzdEVxdWFsaXR5KCk7CisgICAgaWYgKCFlcXVhbGl0eS5lcXVhbHMocmVzdWx0LCBpbnB1dCkpIHRocm93IG5ldyBUVGVzdEVycm9yKHJlc3VsdCwgaW5wdXQpOworICB9KSk7CisKKyAgdGVzdHMuYWRkKG5ldyBUVGVzdChURVNUX0NPTlRBSU5FUlMsICd0ZXN0U3RydWN0JywgKCkgYXN5bmMgeworICAgIHZhciByZXN1bHQgPSBhd2FpdCBjbGllbnQudGVzdFN0cnVjdCh4dHJ1Y3QpOworICAgIGlmICgnJHJlc3VsdCcgIT0gJyR4dHJ1Y3QnKSB0aHJvdyBuZXcgVFRlc3RFcnJvcihyZXN1bHQsIHh0cnVjdCk7CisgIH0pKTsKKworICB0ZXN0cy5hZGQobmV3IFRUZXN0KFRFU1RfQ09OVEFJTkVSUywgJ3Rlc3ROZXN0JywgKCkgYXN5bmMgeworICAgIHZhciBpbnB1dCA9IG5ldyBYdHJ1Y3QyKCkKKyAgICAgIC4uYnl0ZV90aGluZyA9IDEKKyAgICAgIC4uc3RydWN0X3RoaW5nID0geHRydWN0CisgICAgICAuLmkzMl90aGluZyA9IC0zOworCisgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGNsaWVudC50ZXN0TmVzdChpbnB1dCk7CisgICAgaWYgKCckcmVzdWx0JyAhPSAnJGlucHV0JykgdGhyb3cgbmV3IFRUZXN0RXJyb3IocmVzdWx0LCBpbnB1dCk7CisgIH0pKTsKKworICB0ZXN0cy5hZGQobmV3IFRUZXN0KFRFU1RfQ09OVEFJTkVSUywgJ3Rlc3RNYXAnLCAoKSBhc3luYyB7CisgICAgTWFwPGludCwgaW50PiBpbnB1dCA9IHsxOiAtMTAsIDI6IC05LCAzOiAtOCwgNDogLTcsIDU6IC02fTsKKworICAgIHZhciByZXN1bHQgPSBhd2FpdCBjbGllbnQudGVzdE1hcChpbnB1dCk7CisgICAgdmFyIGVxdWFsaXR5ID0gY29uc3QgTWFwRXF1YWxpdHkoKTsKKyAgICBpZiAoIWVxdWFsaXR5LmVxdWFscyhyZXN1bHQsIGlucHV0KSkgdGhyb3cgbmV3IFRUZXN0RXJyb3IocmVzdWx0LCBpbnB1dCk7CisgIH0pKTsKKworICB0ZXN0cy5hZGQobmV3IFRUZXN0KFRFU1RfQ09OVEFJTkVSUywgJ3Rlc3RTZXQnLCAoKSBhc3luYyB7CisgICAgdmFyIGlucHV0ID0gbmV3IFNldDxpbnQ+LmZyb20oWy0yLCAtMSwgMCwgMSwgMl0pOworICAgIHZhciByZXN1bHQgPSBhd2FpdCBjbGllbnQudGVzdFNldChpbnB1dCk7CisgICAgdmFyIGVxdWFsaXR5ID0gY29uc3QgU2V0RXF1YWxpdHkoKTsKKyAgICBpZiAoIWVxdWFsaXR5LmVxdWFscyhyZXN1bHQsIGlucHV0KSkgdGhyb3cgbmV3IFRUZXN0RXJyb3IocmVzdWx0LCBpbnB1dCk7CisgIH0pKTsKKworICB0ZXN0cy5hZGQobmV3IFRUZXN0KFRFU1RfQ09OVEFJTkVSUywgJ3Rlc3RMaXN0JywgKCkgYXN5bmMgeworICAgIHZhciBpbnB1dCA9IFstMiwgLTEsIDAsIDEsIDJdOworICAgIHZhciByZXN1bHQgPSBhd2FpdCBjbGllbnQudGVzdExpc3QoaW5wdXQpOworICAgIHZhciBlcXVhbGl0eSA9IGNvbnN0IExpc3RFcXVhbGl0eSgpOworICAgIGlmICghZXF1YWxpdHkuZXF1YWxzKHJlc3VsdCwgaW5wdXQpKSB0aHJvdyBuZXcgVFRlc3RFcnJvcihyZXN1bHQsIGlucHV0KTsKKyAgfSkpOworCisgIHRlc3RzLmFkZChuZXcgVFRlc3QoVEVTVF9DT05UQUlORVJTLCAndGVzdEVudW0nLCAoKSBhc3luYyB7CisgICAgYXdhaXQgX3Rlc3RFbnVtKE51bWJlcnouT05FKTsKKyAgICBhd2FpdCBfdGVzdEVudW0oTnVtYmVyei5UV08pOworICAgIGF3YWl0IF90ZXN0RW51bShOdW1iZXJ6LlRIUkVFKTsKKyAgICBhd2FpdCBfdGVzdEVudW0oTnVtYmVyei5GSVZFKTsKKyAgICBhd2FpdCBfdGVzdEVudW0oTnVtYmVyei5FSUdIVCk7CisgIH0pKTsKKworICB0ZXN0cy5hZGQobmV3IFRUZXN0KFRFU1RfQkFTRVRZUEVTLCAndGVzdFR5cGVkZWYnLCAoKSBhc3luYyB7CisgICAgdmFyIGlucHV0ID0gMzA5ODU4MjM1MDgyNTIzOworICAgIHZhciByZXN1bHQgPSBhd2FpdCBjbGllbnQudGVzdFR5cGVkZWYoaW5wdXQpOworICAgIGlmIChyZXN1bHQgIT0gaW5wdXQpIHRocm93IG5ldyBUVGVzdEVycm9yKHJlc3VsdCwgaW5wdXQpOworICB9KSk7CisKKyAgdGVzdHMuYWRkKG5ldyBUVGVzdChURVNUX0NPTlRBSU5FUlMsICd0ZXN0TWFwTWFwJywgKCkgYXN5bmMgeworICAgIE1hcDxpbnQsIE1hcDxpbnQsIGludD4+IHJlc3VsdCA9IGF3YWl0IGNsaWVudC50ZXN0TWFwTWFwKDEpOworICAgIGlmIChyZXN1bHQuaXNFbXB0eSB8fCByZXN1bHRbcmVzdWx0LmtleXMuZmlyc3RdLmlzRW1wdHkpIHsKKyAgICAgIHRocm93IG5ldyBUVGVzdEVycm9yKHJlc3VsdCwgJ01hcDxpbnQsIE1hcDxpbnQsIGludD4+Jyk7CisgICAgfQorICB9KSk7CisKKyAgdGVzdHMuYWRkKG5ldyBUVGVzdChURVNUX0NPTlRBSU5FUlMsICd0ZXN0SW5zYW5pdHknLCAoKSBhc3luYyB7CisgICAgdmFyIGlucHV0ID0gbmV3IEluc2FuaXR5KCk7CisgICAgaW5wdXQudXNlck1hcCA9IHtOdW1iZXJ6LkZJVkU6IDUwMDB9OworICAgIGlucHV0Lnh0cnVjdHMgPSBbeHRydWN0XTsKKworICAgIE1hcDxpbnQsIE1hcDxpbnQsIEluc2FuaXR5Pj4gcmVzdWx0ID0gYXdhaXQgY2xpZW50LnRlc3RJbnNhbml0eShpbnB1dCk7CisgICAgaWYgKHJlc3VsdC5pc0VtcHR5IHx8IHJlc3VsdFtyZXN1bHQua2V5cy5maXJzdF0uaXNFbXB0eSkgeworICAgICAgdGhyb3cgbmV3IFRUZXN0RXJyb3IocmVzdWx0LCAnTWFwPGludCwgTWFwPGludCwgSW5zYW5pdHk+PicpOworICAgIH0KKyAgfSkpOworCisgIHRlc3RzLmFkZChuZXcgVFRlc3QoVEVTVF9DT05UQUlORVJTLCAndGVzdE11bHRpJywgKCkgYXN5bmMgeworICAgIHZhciBpbnB1dCA9IG5ldyBYdHJ1Y3QoKQorICAgICAgLi5zdHJpbmdfdGhpbmcgPSAnSGVsbG8yJworICAgICAgLi5ieXRlX3RoaW5nID0gMTIzCisgICAgICAuLmkzMl90aGluZyA9IDQ1NgorICAgICAgLi5pNjRfdGhpbmcgPSA3ODk7CisKKyAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnRlc3RNdWx0aShpbnB1dC5ieXRlX3RoaW5nLCBpbnB1dC5pMzJfdGhpbmcsCisgICAgICAgIGlucHV0Lmk2NF90aGluZywgezE6ICdvbmUnfSwgTnVtYmVyei5FSUdIVCwgNTY3OCk7CisgICAgaWYgKCckcmVzdWx0JyAhPSAnJGlucHV0JykgdGhyb3cgbmV3IFRUZXN0RXJyb3IocmVzdWx0LCBpbnB1dCk7CisgIH0pKTsKKworICB0ZXN0cy5hZGQobmV3IFRUZXN0KFRFU1RfRVhDRVBUSU9OUywgJ3Rlc3RFeGNlcHRpb24nLCAoKSBhc3luYyB7CisgICAgdHJ5IHsKKyAgICAgIGF3YWl0IGNsaWVudC50ZXN0RXhjZXB0aW9uKCdYY2VwdGlvbicpOworICAgIH0gb24gWGNlcHRpb24gY2F0Y2ggKF8pIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0aHJvdyBuZXcgVFRlc3RFcnJvcihudWxsLCAnWGNlcHRpb24nKTsKKyAgfSkpOworCisgIHRlc3RzLmFkZChuZXcgVFRlc3QoVEVTVF9FWENFUFRJT05TLCAndGVzdE11bHRpRXhjZXB0aW9uJywgKCkgYXN5bmMgeworICAgIHRyeSB7CisgICAgICBhd2FpdCBjbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKCdYY2VwdGlvbjInLCAnZm9vJyk7CisgICAgfSBvbiBYY2VwdGlvbjIgY2F0Y2ggKF8pIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0aHJvdyBuZXcgVFRlc3RFcnJvcihudWxsLCAnWGNlcHRpb24yJyk7CisgIH0pKTsKKworICByZXR1cm4gdGVzdHM7Cit9CisKK0Z1dHVyZSBfdGVzdEVudW0oaW50IGlucHV0KSBhc3luYyB7CisgIHZhciByZXN1bHQgPSBhd2FpdCBjbGllbnQudGVzdEVudW0oaW5wdXQpOworICBpZiAocmVzdWx0ICE9IGlucHV0KSB0aHJvdyBuZXcgVFRlc3RFcnJvcihyZXN1bHQsIGlucHV0KTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvZGFydC90ZXN0X2NsaWVudC9wdWJzcGVjLnlhbWwgYi90ZXN0L2RhcnQvdGVzdF9jbGllbnQvcHVic3BlYy55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNjQyZjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhcnQvdGVzdF9jbGllbnQvcHVic3BlYy55YW1sCkBAIC0wLDAgKzEsMzYgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAnTGljZW5zZScpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAnQVMgSVMnIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKworbmFtZTogdGhyaWZ0X3Rlc3RfY2xpZW50Cit2ZXJzaW9uOiAxLjAuMAorZGVzY3JpcHRpb246IEEgY2xpZW50IGludGVncmF0aW9uIHRlc3QgZm9yIHRoZSBEYXJ0IFRocmlmdCBsaWJyYXJ5CithdXRob3I6IEFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPgoraG9tZXBhZ2U6IGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZworCitlbnZpcm9ubWVudDoKKyAgc2RrOiAiPj0xLjEzLjAgPDIuMC4wIgorCitkZXBlbmRlbmNpZXM6CisgIGFyZ3M6IF4wLjEzLjAKKyAgaHR0cDogXjAuMTEuMAorICB0aHJpZnQ6CisgICAgcGF0aDogLi4vLi4vLi4vbGliL2RhcnQKKyAgdGhyaWZ0X3Rlc3Q6CisgICAgcGF0aDogLi4vZ2VuLWRhcnQvdGhyaWZ0X3Rlc3QKKworZGV2X2RlcGVuZGVuY2llczoKKyAgdGVzdDogIl4wLjEyLjAiCmRpZmYgLS1naXQgYS90ZXN0L2VybC9NYWtlZmlsZS5hbSBiL3Rlc3QvZXJsL01ha2VmaWxlLmFtCmluZGV4IDE5NDBjZTMuLmZmMjVlODkgMTAwNjQ0Ci0tLSBhL3Rlc3QvZXJsL01ha2VmaWxlLmFtCisrKyBiL3Rlc3QvZXJsL01ha2VmaWxlLmFtCkBAIC0xNywyNCArMTcsMjUgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLVRIUklGVCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0Ci1SRUJBUiA9ICQodG9wX3NyY2RpcikvbGliL2VybC9yZWJhcgotCiBUSFJJRlRfRklMRVMgPSAkKHdpbGRjYXJkIC4uLyoudGhyaWZ0KQogCitpZiBFUkxBTkdfT1RQMTYKK0VSTF9GTEFHID0gZXJsOm90cDE2CitlbHNlCitFUkxfRkxBRyA9IGVybAorZW5kaWYKICMgbWFrZSBzdXJlIFRocmlmdFRlc3QudGhyaWZ0IGlzIGdlbmVyYXRlZCBsYXN0IHRvIHByZXZlbnQgY29uZmxpY3RzIHdpdGggb3RoZXIgKi50aHJpZnQgZmlsZXMKIC5nZW5lcmF0ZWQ6ICQoVEhSSUZUX0ZJTEVTKQogCWZvciBmIGluICQoVEhSSUZUX0ZJTEVTKSA7IGRvIFwKLQkgICQoVEhSSUZUKSAtLWdlbiBlcmwgJCRmIDsgXAorCSAgJChUSFJJRlQpIC0tZ2VuICQoRVJMX0ZMQUcpIC1vIHNyYyAkJGYgOyBcCiAJZG9uZSA7IFwKLQkkKFRIUklGVCkgLS1nZW4gZXJsOmxlZ2FjeW5hbWVzIExlZ2FjeU5hbWVzLnRocmlmdAotCSQoVEhSSUZUKSAtLWdlbiBlcmwgLi4vVGhyaWZ0VGVzdC50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gJChFUkxfRkxBRykgLW8gc3JjIC4uL1RocmlmdFRlc3QudGhyaWZ0CiAJdG91Y2ggLmdlbmVyYXRlZAogCi1jaGVjazogLmdlbmVyYXRlZAotCSQoUkVCQVIpIGV1bml0CitwcmVjcm9zczogLmdlbmVyYXRlZAorCSQoUkVCQVIpIGNvbXBpbGUKIAogY2xlYW46CiAJcm0gLWYgLmdlbmVyYXRlZAotCXJtIC1yZiBnZW4tZXJsCisJcm0gLXJmIHNyYy9nZW4tZXJsCiAJJChSRUJBUikgY2xlYW4KZGlmZiAtLWdpdCBhL3Rlc3QvZXJsL3JlYmFyLmNvbmZpZyBiL3Rlc3QvZXJsL3JlYmFyLmNvbmZpZwppbmRleCA2MDM1ODQ5Li41OWEwNzg4IDEwMDY0NAotLS0gYS90ZXN0L2VybC9yZWJhci5jb25maWcKKysrIGIvdGVzdC9lcmwvcmViYXIuY29uZmlnCkBAIC0xLDUgKzEsNiBAQAore3N1Yl9kaXJzLCBbIi4uLy4uL2xpYi9lcmwiXX0uCisKIHtlcmxfb3B0cywgWwogICBkZWJ1Z19pbmZvLAotICB7aSwgWyJnZW4tZXJsIl19LAotICB7c3JjX2RpcnMsIFsiZ2VuLWVybCJdfQorICB7aSwgIi4uLy4uL2xpYi9lcmwvaW5jbHVkZSJ9CiBdfS4KZGlmZiAtLWdpdCBhL3Rlc3QvZXJsL3NyYy9sZWdhY3lfbmFtZXNfdGVzdC5lcmwgYi90ZXN0L2VybC9zcmMvbGVnYWN5X25hbWVzX3Rlc3QuZXJsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWNlN2QwLi4wMDAwMDAwCi0tLSBhL3Rlc3QvZXJsL3NyYy9sZWdhY3lfbmFtZXNfdGVzdC5lcmwKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0lJQotJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0lJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotJSUKLSUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0lJQotJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSUlIHVuZGVyIHRoZSBMaWNlbnNlLgotJSUKLQotLW1vZHVsZShsZWdhY3lfbmFtZXNfdGVzdCkuCi0tY29tcGlsZShleHBvcnRfYWxsKS4KLQotLWluY2x1ZGVfbGliKCJldW5pdC9pbmNsdWRlL2V1bml0LmhybCIpLgotCi0taW5jbHVkZSgibGVnYWN5TmFtZXNfY29uc3RhbnRzLmhybCIpLgotCi1yZWNvcmRfZ2VuZXJhdGlvbl90ZXN0XygpIC0+Ci0gIFsKLSAgICB7ImNhcGl0YWxpemVkU3RydWN0IHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCi0gICAgICB7Y2FwaXRhbGl6ZWRTdHJ1Y3QsIF8sIF99LAotICAgICAgI2NhcGl0YWxpemVkU3RydWN0e2lkPW51bGwsbWVzc2FnZT1udWxsfQotICAgICl9Ci0gIF0uCi0KLXN0cnVjdF9pbmZvX3Rlc3RfKCkgLT4KLSAgWwotICAgIHsiY2FwaXRhbGl6ZWRTdHJ1Y3QgZXh0ZW5kZWQgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbCi0gICAgICAgIHsxLCB1bmRlZmluZWQsIGkzMiwgJ2lkJywgdW5kZWZpbmVkfSwKLSAgICAgICAgezIsIHVuZGVmaW5lZCwgc3RyaW5nLCAnbWVzc2FnZScsIHVuZGVmaW5lZH0KLSAgICAgIF19LAotICAgICAgbGVnYWN5TmFtZXNfdHlwZXM6c3RydWN0X2luZm9fZXh0KGNhcGl0YWxpemVkU3RydWN0KQotICAgICl9LAotICAgIHsibGlzdENhcGl0YWxpemVkU3RydWN0cyBleHRlbmRlZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFsKLSAgICAgICAgezEsIHVuZGVmaW5lZCwge2xpc3QsIHtzdHJ1Y3QsIHsnbGVnYWN5TmFtZXNfdHlwZXMnLCAnY2FwaXRhbGl6ZWRTdHJ1Y3QnfX19LCAnc3RydWN0cycsIFtdfQotICAgICAgXX0sCi0gICAgICBsZWdhY3lOYW1lc190eXBlczpzdHJ1Y3RfaW5mb19leHQobGlzdENhcGl0YWxpemVkU3RydWN0cykKLSAgICApfQotICBdLgotCi1zZXJ2aWNlX2luZm9fdGVzdF8oKSAtPgotICBbCi0gICAgeyJuYW1lcyBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwge3N0cnVjdCwgeydsZWdhY3lOYW1lc190eXBlcycsICdjYXBpdGFsaXplZFN0cnVjdCd9fX0sCi0gICAgICAgIHsyLCB7c3RydWN0LCB7J2xlZ2FjeU5hbWVzX3R5cGVzJywgJ2NhcGl0YWxpemVkU3RydWN0J319fQotICAgICAgXX0sCi0gICAgICBsZWdhY3lOYW1lc190aHJpZnQ6ZnVuY3Rpb25faW5mbyhuYW1lcywgcGFyYW1zX3R5cGUpCi0gICAgKX0sCi0gICAgeyJuYW1lcyByZXBseSIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCB7J2xlZ2FjeU5hbWVzX3R5cGVzJywgJ2xpc3RDYXBpdGFsaXplZFN0cnVjdHMnfX0sCi0gICAgICBsZWdhY3lOYW1lc190aHJpZnQ6ZnVuY3Rpb25faW5mbyhuYW1lcywgcmVwbHlfdHlwZSkKLSAgICApfSwKLSAgICB7Im5hbWVzIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgW3sxLCB7c3RydWN0LCB7J2xlZ2FjeU5hbWVzX3R5cGVzJywgJ3hjZXB0aW9uJ319fV19LAotICAgICAgbGVnYWN5TmFtZXNfdGhyaWZ0OmZ1bmN0aW9uX2luZm8obmFtZXMsIGV4Y2VwdGlvbnMpCi0gICAgKX0KLSAgXS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2VybC9zcmMvbmFtZV9jb25mbGljdF90ZXN0LmVybCBiL3Rlc3QvZXJsL3NyYy9uYW1lX2NvbmZsaWN0X3Rlc3QuZXJsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTc2ZmZhLi4wMDAwMDAwCi0tLSBhL3Rlc3QvZXJsL3NyYy9uYW1lX2NvbmZsaWN0X3Rlc3QuZXJsCisrKyAvZGV2L251bGwKQEAgLTEsMjk5ICswLDAgQEAKLSUlCi0lJSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0lJSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotJSUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSUlIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotJSUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotJSUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotJSUgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0lJQotJSUgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSUlCi0lJSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0lJSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotJSUgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0lJSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotJSUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotJSUgdW5kZXIgdGhlIExpY2Vuc2UuCi0lJQotCi0tbW9kdWxlKG5hbWVfY29uZmxpY3RfdGVzdCkuCi0tY29tcGlsZShleHBvcnRfYWxsKS4KLQotLWluY2x1ZGVfbGliKCJldW5pdC9pbmNsdWRlL2V1bml0LmhybCIpLgotCi0taW5jbHVkZSgibmFtZV9jb25mbGljdF90ZXN0X2NvbnN0YW50cy5ocmwiKS4KLQotcmVjb3JkX2dlbmVyYXRpb25fdGVzdF8oKSAtPgotICBbCi0gICAgeyJ1c2luZyByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAotICAgICAge3VzaW5nLCBfLCBffSwKLSAgICAgICN1c2luZ3tzaW5nbGU9bnVsbCxpbnRlZ2VyPW51bGx9Ci0gICAgKX0sCi0gICAgeyJkZWxlZ2F0ZSByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAotICAgICAge2RlbGVnYXRlLCBfLCBffSwKLSAgICAgICNkZWxlZ2F0ZXtwYXJ0aWFsPW51bGwsZGVsZWdhdGU9bnVsbH0KLSAgICApfSwKLSAgICB7ImdldCByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAotICAgICAge2dldCwgX30sCi0gICAgICAjZ2V0e3NieXRlPW51bGx9Ci0gICAgKX0sCi0gICAgeyJwYXJ0aWFsIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCi0gICAgICB7cGFydGlhbCwgXywgXywgX30sCi0gICAgICAjcGFydGlhbHt1c2luZz1udWxsfQotICAgICl9LAotICAgIHsiQ2xhc3NBbmRQcm9wIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCi0gICAgICB7J0NsYXNzQW5kUHJvcCcsIF8sIF8sIF8sIF99LAotICAgICAgIydDbGFzc0FuZFByb3AnewotICAgICAgICAnQ2xhc3NBbmRQcm9wJz1udWxsLAotICAgICAgICAnQ2xhc3NBbmRQcm9wXyc9bnVsbCwKLSAgICAgICAgJ0NsYXNzQW5kUHJvcF9fJz1udWxsLAotICAgICAgICAnQ2xhc3NBbmRQcm9wZXInPW51bGwKLSAgICAgIH0KLSAgICApfSwKLSAgICB7InNlY29uZF9jaGFuY2UgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKLSAgICAgIHtzZWNvbmRfY2hhbmNlLCBfLCBfLCBfLCBffSwKLSAgICAgICNzZWNvbmRfY2hhbmNlewotICAgICAgICAnU0VDT05EX0NIQU5DRSc9bnVsbCwKLSAgICAgICAgJ1NFQ09ORF9DSEFOQ0VfJz1udWxsLAotICAgICAgICAnU0VDT05EX0NIQU5DRV9fJz1udWxsLAotICAgICAgICAnU0VDT05EX0NIQU5DRVMnPW51bGwKLSAgICAgIH0KLSAgICApfSwKLSAgICB7Ik5PV19FQVRfVEhJUyByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAotICAgICAgeydOT1dfRUFUX1RISVMnLCBfLCBfLCBfLCBffSwKLSAgICAgICMnTk9XX0VBVF9USElTJ3sKLSAgICAgICAgbm93X2VhdF90aGlzPW51bGwsCi0gICAgICAgIG5vd19lYXRfdGhpc189bnVsbCwKLSAgICAgICAgbm93X2VhdF90aGlzX189bnVsbCwKLSAgICAgICAgbm93X2VhdF90aGlzX2FuZF90aGlzPW51bGwKLSAgICAgIH0KLSAgICApfSwKLSAgICB7IlRoZUVkZ2VDYXNlIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCi0gICAgICB7J1RoZUVkZ2VDYXNlJywgXywgXywgXywgXywgXywgX30sCi0gICAgICAjJ1RoZUVkZ2VDYXNlJ3sKLSAgICAgICAgdGhlRWRnZUNhc2U9bnVsbCwKLSAgICAgICAgdGhlRWRnZUNhc2VfPW51bGwsCi0gICAgICAgIHRoZUVkZ2VDYXNlX189bnVsbCwKLSAgICAgICAgJ1RoZUVkZ2VDYXNlJz1udWxsLAotICAgICAgICAnVGhlRWRnZUNhc2VfJz1udWxsLAotICAgICAgICAnVGhlRWRnZUNhc2VfXyc9bnVsbAotICAgICAgfQotICAgICl9LAotICAgIHsiVHJpY2t5XyByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAotICAgICAgeydUcmlja3lfJywgXywgX30sCi0gICAgICAjJ1RyaWNreV8ne3RyaWNreT1udWxsLCdUcmlja3knPW51bGx9Ci0gICAgKX0sCi0gICAgeyJOZXN0ZWQgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKLSAgICAgIHsnTmVzdGVkJywgXywgXywgXywgXywgXywgX30sCi0gICAgICAjJ05lc3RlZCd7Ci0gICAgICAgICdDbGFzc0FuZFByb3AnPW51bGwsCi0gICAgICAgIHNlY29uZF9jaGFuY2U9bnVsbCwKLSAgICAgICAgJ05PV19FQVRfVEhJUyc9bnVsbCwKLSAgICAgICAgJ1RoZUVkZ2VDYXNlJz1udWxsLAotICAgICAgICAnVHJpY2t5Xyc9bnVsbCwKLSAgICAgICAgJ05lc3RlZCc9bnVsbAotICAgICAgfQotICAgICl9LAotICAgIHsiUHJvYmxlbV8gcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKLSAgICAgIHsnUHJvYmxlbV8nLCBfLCBffSwKLSAgICAgICMnUHJvYmxlbV8ne3Byb2JsZW09bnVsbCwnUHJvYmxlbSc9bnVsbH0KLSAgICApfQotICBdLgotCi1zdHJ1Y3RfaW5mb190ZXN0XygpIC0+Ci0gIFsKLSAgICB7InVzaW5nIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgW3sxLCBkb3VibGV9LHsyLCBkb3VibGV9XX0sCi0gICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8odXNpbmcpCi0gICAgKX0sCi0gICAgeyJkZWxlZ2F0ZSBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFsKLSAgICAgICAgezEsIHN0cmluZ30sCi0gICAgICAgIHsyLCB7c3RydWN0LCB7bmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLCBkZWxlZ2F0ZX19fQotICAgICAgXX0sCi0gICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oZGVsZWdhdGUpCi0gICAgKX0sCi0gICAgeyJnZXQgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbezEsIGJvb2x9XX0sCi0gICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oZ2V0KQotICAgICl9LAotICAgIHsicGFydGlhbCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFsKLSAgICAgICAgezEsIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsIHVzaW5nfX19LAotICAgICAgICB7MiwgYm9vbH0sCi0gICAgICAgIHszLCBib29sfQotICAgICAgXX0sCi0gICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8ocGFydGlhbCkKLSAgICApfSwKLSAgICB7IkNsYXNzQW5kUHJvcCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFt7MSwgYm9vbH0sezIsIGJvb2x9LHszLCBib29sfSx7NCwgYm9vbH1dfSwKLSAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mbygnQ2xhc3NBbmRQcm9wJykKLSAgICApfSwKLSAgICB7InNlY29uZF9jaGFuY2UgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbezEsIGJvb2x9LHsyLCBib29sfSx7MywgYm9vbH0sezQsIGJvb2x9XX0sCi0gICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oc2Vjb25kX2NoYW5jZSkKLSAgICApfSwKLSAgICB7Ik5PV19FQVRfVEhJUyBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFt7MSwgYm9vbH0sezIsIGJvb2x9LHszLCBib29sfSx7NCwgYm9vbH1dfSwKLSAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mbygnTk9XX0VBVF9USElTJykKLSAgICApfSwKLSAgICB7IlRoZUVkZ2VDYXNlIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgW3sxLCBib29sfSx7MiwgYm9vbH0sezMsIGJvb2x9LHs0LCBib29sfSx7NSwgYm9vbH0sezYsIGJvb2x9XX0sCi0gICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oJ1RoZUVkZ2VDYXNlJykKLSAgICApfSwKLSAgICB7IlRyaWNreV8gZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbezEsIGJvb2x9LHsyLCBib29sfV19LAotICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvKCdUcmlja3lfJykKLSAgICApfSwKLSAgICB7Ik5lc3RlZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFsKLSAgICAgICAgezEsIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsICdDbGFzc0FuZFByb3AnfX19LAotICAgICAgICB7Miwge3N0cnVjdCwge25hbWVfY29uZmxpY3RfdGVzdF90eXBlcywgc2Vjb25kX2NoYW5jZX19fSwKLSAgICAgICAgezMsIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsICdOT1dfRUFUX1RISVMnfX19LAotICAgICAgICB7NCwge3N0cnVjdCwge25hbWVfY29uZmxpY3RfdGVzdF90eXBlcywgJ1RoZUVkZ2VDYXNlJ319fSwKLSAgICAgICAgezUsIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsICdUcmlja3lfJ319fSwKLSAgICAgICAgezYsIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsICdOZXN0ZWQnfX19Ci0gICAgICBdfSwKLSAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mbygnTmVzdGVkJykKLSAgICApfSwKLSAgICB7IlByb2JsZW1fIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgW3sxLCBib29sfSx7MiwgYm9vbH1dfSwKLSAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mbygnUHJvYmxlbV8nKQotICAgICl9LAotICAgIHsidXNpbmcgZXh0ZW5kZWQgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbCi0gICAgICAgIHsxLCB1bmRlZmluZWQsIGRvdWJsZSwgc2luZ2xlLCB1bmRlZmluZWR9LAotICAgICAgICB7MiwgdW5kZWZpbmVkLCBkb3VibGUsIGludGVnZXIsIHVuZGVmaW5lZH0KLSAgICAgIF19LAotICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCh1c2luZykKLSAgICApfSwKLSAgICB7ImRlbGVnYXRlIGV4dGVuZGVkIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwgdW5kZWZpbmVkLCBzdHJpbmcsIHBhcnRpYWwsIHVuZGVmaW5lZH0sCi0gICAgICAgIHsyLCB1bmRlZmluZWQsIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsIGRlbGVnYXRlfX0sIGRlbGVnYXRlLCB1bmRlZmluZWR9Ci0gICAgICBdfSwKLSAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoZGVsZWdhdGUpCi0gICAgKX0sCi0gICAgeyJnZXQgZXh0ZW5kZWQgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbezEsIHVuZGVmaW5lZCwgYm9vbCwgc2J5dGUsIHVuZGVmaW5lZH1dfSwKLSAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoZ2V0KQotICAgICl9LAotICAgIHsicGFydGlhbCBleHRlbmRlZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFsKLSAgICAgICAgezEsIHVuZGVmaW5lZCwge3N0cnVjdCwge25hbWVfY29uZmxpY3RfdGVzdF90eXBlcywgdXNpbmd9fSwgdXNpbmcsICN1c2luZ3t9fSwKLSAgICAgICAgezIsIHVuZGVmaW5lZCwgYm9vbCwgcmVhZCwgdW5kZWZpbmVkfSwKLSAgICAgICAgezMsIHVuZGVmaW5lZCwgYm9vbCwgd3JpdGUsIHVuZGVmaW5lZH0KLSAgICAgIF19LAotICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dChwYXJ0aWFsKQotICAgICl9LAotICAgIHsiQ2xhc3NBbmRQcm9wIGV4dGVuZGVkIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwgdW5kZWZpbmVkLCBib29sLCAnQ2xhc3NBbmRQcm9wJywgdW5kZWZpbmVkfSwKLSAgICAgICAgezIsIHVuZGVmaW5lZCwgYm9vbCwgJ0NsYXNzQW5kUHJvcF8nLCB1bmRlZmluZWR9LAotICAgICAgICB7MywgdW5kZWZpbmVkLCBib29sLCAnQ2xhc3NBbmRQcm9wX18nLCB1bmRlZmluZWR9LAotICAgICAgICB7NCwgdW5kZWZpbmVkLCBib29sLCAnQ2xhc3NBbmRQcm9wZXInLCB1bmRlZmluZWR9Ci0gICAgICBdfSwKLSAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ0NsYXNzQW5kUHJvcCcpCi0gICAgKX0sCi0gICAgeyJzZWNvbmRfY2hhbmNlIGV4dGVuZGVkIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwgdW5kZWZpbmVkLCBib29sLCAnU0VDT05EX0NIQU5DRScsIHVuZGVmaW5lZH0sCi0gICAgICAgIHsyLCB1bmRlZmluZWQsIGJvb2wsICdTRUNPTkRfQ0hBTkNFXycsIHVuZGVmaW5lZH0sCi0gICAgICAgIHszLCB1bmRlZmluZWQsIGJvb2wsICdTRUNPTkRfQ0hBTkNFX18nLCB1bmRlZmluZWR9LAotICAgICAgICB7NCwgdW5kZWZpbmVkLCBib29sLCAnU0VDT05EX0NIQU5DRVMnLCB1bmRlZmluZWR9Ci0gICAgICBdfSwKLSAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoc2Vjb25kX2NoYW5jZSkKLSAgICApfSwKLSAgICB7Ik5PV19FQVRfVEhJUyBleHRlbmRlZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFsKLSAgICAgICAgezEsIHVuZGVmaW5lZCwgYm9vbCwgbm93X2VhdF90aGlzLCB1bmRlZmluZWR9LAotICAgICAgICB7MiwgdW5kZWZpbmVkLCBib29sLCBub3dfZWF0X3RoaXNfLCB1bmRlZmluZWR9LAotICAgICAgICB7MywgdW5kZWZpbmVkLCBib29sLCBub3dfZWF0X3RoaXNfXywgdW5kZWZpbmVkfSwKLSAgICAgICAgezQsIHVuZGVmaW5lZCwgYm9vbCwgbm93X2VhdF90aGlzX2FuZF90aGlzLCB1bmRlZmluZWR9Ci0gICAgICBdfSwKLSAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ05PV19FQVRfVEhJUycpCi0gICAgKX0sCi0gICAgeyJUaGVFZGdlQ2FzZSBleHRlbmRlZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFsKLSAgICAgICAgezEsIHVuZGVmaW5lZCwgYm9vbCwgdGhlRWRnZUNhc2UsIHVuZGVmaW5lZH0sCi0gICAgICAgIHsyLCB1bmRlZmluZWQsIGJvb2wsIHRoZUVkZ2VDYXNlXywgdW5kZWZpbmVkfSwKLSAgICAgICAgezMsIHVuZGVmaW5lZCwgYm9vbCwgdGhlRWRnZUNhc2VfXywgdW5kZWZpbmVkfSwKLSAgICAgICAgezQsIHVuZGVmaW5lZCwgYm9vbCwgJ1RoZUVkZ2VDYXNlJywgdW5kZWZpbmVkfSwKLSAgICAgICAgezUsIHVuZGVmaW5lZCwgYm9vbCwgJ1RoZUVkZ2VDYXNlXycsIHVuZGVmaW5lZH0sCi0gICAgICAgIHs2LCB1bmRlZmluZWQsIGJvb2wsICdUaGVFZGdlQ2FzZV9fJywgdW5kZWZpbmVkfQotICAgICAgXX0sCi0gICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCdUaGVFZGdlQ2FzZScpCi0gICAgKX0sCi0gICAgeyJUcmlja3lfIGV4dGVuZGVkIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwgdW5kZWZpbmVkLCBib29sLCB0cmlja3ksIHVuZGVmaW5lZH0sCi0gICAgICAgIHsyLCB1bmRlZmluZWQsIGJvb2wsICdUcmlja3knLCB1bmRlZmluZWR9Ci0gICAgICBdfSwKLSAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ1RyaWNreV8nKQotICAgICl9LAotICAgIHsiTmVzdGVkIGV4dGVuZGVkIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwgdW5kZWZpbmVkLCB7c3RydWN0LCB7Ci0gICAgICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLAotICAgICAgICAgICdDbGFzc0FuZFByb3AnCi0gICAgICAgIH19LCAnQ2xhc3NBbmRQcm9wJywgIydDbGFzc0FuZFByb3Ane319LAotICAgICAgICB7MiwgdW5kZWZpbmVkLCB7c3RydWN0LCB7Ci0gICAgICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLAotICAgICAgICAgIHNlY29uZF9jaGFuY2UKLSAgICAgICAgfX0sIHNlY29uZF9jaGFuY2UsICNzZWNvbmRfY2hhbmNle319LAotICAgICAgICB7MywgdW5kZWZpbmVkLCB7c3RydWN0LCB7Ci0gICAgICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLAotICAgICAgICAgICdOT1dfRUFUX1RISVMnCi0gICAgICAgIH19LCAnTk9XX0VBVF9USElTJywgIydOT1dfRUFUX1RISVMne319LAotICAgICAgICB7NCwgdW5kZWZpbmVkLCB7c3RydWN0LCB7Ci0gICAgICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLAotICAgICAgICAgICdUaGVFZGdlQ2FzZScKLSAgICAgICAgfX0sICdUaGVFZGdlQ2FzZScsICMnVGhlRWRnZUNhc2Une319LAotICAgICAgICB7NSwgdW5kZWZpbmVkLCB7c3RydWN0LCB7Ci0gICAgICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLAotICAgICAgICAgICdUcmlja3lfJwotICAgICAgICB9fSwgJ1RyaWNreV8nLCAjJ1RyaWNreV8ne319LAotICAgICAgICB7NiwgdW5kZWZpbmVkLCB7c3RydWN0LCB7Ci0gICAgICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLAotICAgICAgICAgICdOZXN0ZWQnCi0gICAgICAgIH19LCAnTmVzdGVkJywgdW5kZWZpbmVkfQotICAgICAgXX0sCi0gICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCdOZXN0ZWQnKQotICAgICl9LAotICAgIHsiUHJvYmxlbV8gZXh0ZW5kZWQgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbCi0gICAgICAgIHsxLCB1bmRlZmluZWQsIGJvb2wsIHByb2JsZW0sIHVuZGVmaW5lZH0sCi0gICAgICAgIHsyLCB1bmRlZmluZWQsIGJvb2wsICdQcm9ibGVtJywgdW5kZWZpbmVkfQotICAgICAgXX0sCi0gICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCdQcm9ibGVtXycpCi0gICAgKX0KLSAgXS4KLQotc2VydmljZV9pbmZvX3Rlc3RfKCkgLT4KLSAgWwotICAgIHsiZXZlbnQgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFt7MSwge3N0cnVjdCwge25hbWVfY29uZmxpY3RfdGVzdF90eXBlcywgcGFydGlhbH19fV19LAotICAgICAgZXh0ZXJuX3RocmlmdDpmdW5jdGlvbl9pbmZvKGV2ZW50LCBwYXJhbXNfdHlwZSkKLSAgICApfSwKLSAgICB7ImV2ZW50IHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsIGRlbGVnYXRlfX0sCi0gICAgICBleHRlcm5fdGhyaWZ0OmZ1bmN0aW9uX2luZm8oZXZlbnQsIHJlcGx5X3R5cGUpCi0gICAgKX0sCi0gICAgeyJldmVudCBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFtdfSwKLSAgICAgIGV4dGVybl90aHJpZnQ6ZnVuY3Rpb25faW5mbyhldmVudCwgZXhjZXB0aW9ucykKLSAgICApfSwKLSAgICB7IkZvbyBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgW3sxLCB7c3RydWN0LCB7bmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLCAnTmVzdGVkJ319fV19LAotICAgICAgZXh0ZXJuX3RocmlmdDpmdW5jdGlvbl9pbmZvKCdGb28nLCBwYXJhbXNfdHlwZSkKLSAgICApfSwKLSAgICB7IkZvbyByZXBseSIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbXX0sCi0gICAgICBleHRlcm5fdGhyaWZ0OmZ1bmN0aW9uX2luZm8oJ0ZvbycsIHJlcGx5X3R5cGUpCi0gICAgKX0sCi0gICAgeyJGb28gZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbezEsIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsICdQcm9ibGVtXyd9fX1dfSwKLSAgICAgIGV4dGVybl90aHJpZnQ6ZnVuY3Rpb25faW5mbygnRm9vJywgZXhjZXB0aW9ucykKLSAgICApfQotICBdLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvZXJsL3NyYy90ZXN0X2NsaWVudC5lcmwgYi90ZXN0L2VybC9zcmMvdGVzdF9jbGllbnQuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYWQ1OTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2VybC9zcmMvdGVzdF9jbGllbnQuZXJsCkBAIC0wLDAgKzEsMTc0IEBACislJQorJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCislJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorJSUKKyUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCislJQorJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyUlIHVuZGVyIHRoZSBMaWNlbnNlLgorJSUKKworLW1vZHVsZSh0ZXN0X2NsaWVudCkuCisKKy1leHBvcnQoW3N0YXJ0LzAsIHN0YXJ0LzFdKS4KKworLWluY2x1ZGUoImdlbi1lcmwvdGhyaWZ0X3Rlc3RfdHlwZXMuaHJsIikuCisKKy1yZWNvcmQob3B0aW9ucywge3BvcnQgPSA5MDkwLAorICAgICAgICAgICAgICAgICAgY2xpZW50X29wdHMgPSBbXX0pLgorCitwYXJzZV9hcmdzKEFyZ3MpIC0+IHBhcnNlX2FyZ3MoQXJncywgI29wdGlvbnN7fSkuCitwYXJzZV9hcmdzKFtdLCBPcHRzKSAtPgorICBPcHRzOworcGFyc2VfYXJncyhbSGVhZCB8IFJlc3RdLCBPcHRzKSAtPgorICAgIE5ld09wdHMgPQorICAgICAgICBjYXNlIEhlYWQgb2YKKyAgICAgICAgICAgICItLXBvcnQ9IiArKyBQb3J0IC0+CisgICAgICAgICAgICAgICAgY2FzZSBzdHJpbmc6dG9faW50ZWdlcihQb3J0KSBvZgorICAgICAgICAgICAgICAgICAge0ludFBvcnQsX30gd2hlbiBpc19pbnRlZ2VyKEludFBvcnQpIC0+CisgICAgICAgICAgICAgICAgICAgIE9wdHMjb3B0aW9uc3twb3J0ID0gSW50UG9ydH07CisgICAgICAgICAgICAgICAgICBfRWxzZSAtPgorICAgICAgICAgICAgICAgICAgICBlcmxhbmc6ZXJyb3Ioe2JhZF9hcmcsIEhlYWR9KQorICAgICAgICAgICAgICAgIGVuZDsKKyAgICAgICAgICAgICItLXRyYW5zcG9ydD0iICsrIFRyYW5zIC0+CisgICAgICAgICAgICAgICAgJSBUT0RPOiBFbmFibGUgQnVmZmVyZWQgYW5kIEhUVFAgdHJhbnNwb3J0CisgICAgICAgICAgICAgICAgY2FzZSBUcmFucyBvZgorICAgICAgICAgICAgICAgICAgICAiZnJhbWVkIiAtPgorICAgICAgICAgICAgICAgICAgICAgICAgT3B0cyNvcHRpb25ze2NsaWVudF9vcHRzID0gW3tmcmFtZWQsIHRydWV9IHwgT3B0cyNvcHRpb25zLmNsaWVudF9vcHRzXX07CisgICAgICAgICAgICAgICAgICAgIF9FbHNlIC0+CisgICAgICAgICAgICAgICAgICAgICAgICBPcHRzCisgICAgICAgICAgICAgICAgZW5kOworICAgICAgICAgICAgIi0tc3NsIiAtPgorICAgICAgICAgICAgICAgIHNzbDpzdGFydCgpLAorICAgICAgICAgICAgICAgIFNzbE9wdGlvbnMgPQorICAgICAgICAgICAgICAgICAgICB7c3Nsb3B0aW9ucywgWworICAgICAgICAgICAgICAgICAgICAgICAge2NhY2VydGZpbGUsICIuLi9rZXlzL0NBLnBlbSJ9LAorICAgICAgICAgICAgICAgICAgICAgICAge2NlcnRmaWxlLCAiLi4va2V5cy9jbGllbnQucGVtIn0sCisgICAgICAgICAgICAgICAgICAgICAgICB7a2V5ZmlsZSwgIi4uL2tleXMvY2xpZW50LmtleSJ9CisgICAgICAgICAgICAgICAgICAgIF19LAorICAgICAgICAgICAgICAgIE9wdHMjb3B0aW9uc3tjbGllbnRfb3B0cyA9IFt7c3NsdHJhbnNwb3J0LCB0cnVlfSB8IFtTc2xPcHRpb25zIHwgT3B0cyNvcHRpb25zLmNsaWVudF9vcHRzXV19OworICAgICAgICAgICAgIi0tcHJvdG9jb2w9IiArKyBQcm90byAtPgorICAgICAgICAgICAgICAgIE9wdHMjb3B0aW9uc3tjbGllbnRfb3B0cyA9IFt7cHJvdG9jb2wsIGxpc3RfdG9fYXRvbShQcm90byl9XX07CisgICAgICAgICAgICBfRWxzZSAtPgorICAgICAgICAgICAgICAgIGVybGFuZzplcnJvcih7YmFkX2FyZywgSGVhZH0pCisgICAgICAgIGVuZCwKKyAgICBwYXJzZV9hcmdzKFJlc3QsIE5ld09wdHMpLgorCitzdGFydCgpIC0+IHN0YXJ0KGluaXQ6Z2V0X3BsYWluX2FyZ3VtZW50cygpKS4KK3N0YXJ0KEFyZ3MpIC0+CisgICNvcHRpb25ze3BvcnQgPSBQb3J0LCBjbGllbnRfb3B0cyA9IENsaWVudE9wdHN9ID0gcGFyc2VfYXJncyhBcmdzKSwKKyAge29rLCBDbGllbnQwfSA9IHRocmlmdF9jbGllbnRfdXRpbDpuZXcoCisgICAgIjEyNy4wLjAuMSIsIFBvcnQsIHRocmlmdF90ZXN0X3RocmlmdCwgQ2xpZW50T3B0cyksCisKKyAgRGVtb1h0cnVjdCA9ICMndGhyaWZ0LnRlc3QuWHRydWN0J3sKKyAgICAgICAgICAgICAgICAgIHN0cmluZ190aGluZyA9IDw8Ilplcm8iPj4sCisgICAgICAgICAgICAgICAgICBieXRlX3RoaW5nID0gMSwKKyAgICAgICAgICAgICAgICAgIGkzMl90aGluZyA9IDkxMjgzNjEsCisgICAgICAgICAgICAgICAgICBpNjRfdGhpbmcgPSA5MjIzMzcyMDM2ODU0Nzc1ODA3fSwKKworICBEZW1vTmVzdCA9ICMndGhyaWZ0LnRlc3QuWHRydWN0Mid7CisgICAgYnl0ZV90aGluZyA9IDcsCisgICAgc3RydWN0X3RoaW5nID0gRGVtb1h0cnVjdCwKKyAgICAlIE5vdGUgdGhhdCB3ZSBkb24ndCBzZXQgaTMyX3RoaW5nLCBpdCB3aWxsIGNvbWUgYmFjayBhcyB1bmRlZmluZWQKKyAgICAlIGZyb20gdGhlIFB5dGhvbiBzZXJ2ZXIsIGJ1dCAwIGZyb20gdGhlIEMrKyBzZXJ2ZXIsIHNpbmNlIGl0IGlzIG5vdAorICAgICUgb3B0aW9uYWwKKyAgICBpMzJfdGhpbmcgPSAyfSwKKworICAlIElzIGl0IHNhZmUgdG8gbWF0Y2ggdGhlc2UgdGhpbmdzPworICBEZW1vRGljdCA9IGRpY3Q6ZnJvbV9saXN0KFsge0tleSwgS2V5LTEwfSB8fCBLZXkgPC0gbGlzdHM6c2VxKDAsMTApIF0pLAorICBEZW1vU2V0ID0gc2V0czpmcm9tX2xpc3QoWyBLZXkgfHwgS2V5IDwtIGxpc3RzOnNlcSgtMywzKSBdKSwKKworICBEZW1vSW5zYW5lID0gIyd0aHJpZnQudGVzdC5JbnNhbml0eSd7CisgICAgdXNlck1hcCA9IGRpY3Q6ZnJvbV9saXN0KFt7P1RIUklGVF9URVNUX05VTUJFUlpfRklWRSwgNTAwMH1dKSwKKyAgICB4dHJ1Y3RzID0gWyMndGhyaWZ0LnRlc3QuWHRydWN0J3sgc3RyaW5nX3RoaW5nID0gPDwiVHJ1Y2siPj4sIGJ5dGVfdGhpbmcgPSA4LCBpMzJfdGhpbmcgPSA4LCBpNjRfdGhpbmcgPSA4fV19LAorCisgIGVycm9yX2xvZ2dlcjppbmZvX21zZygidGVzdFZvaWQiKSwKKyAge0NsaWVudDAxLCB7b2ssIG9rfX0gPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MCwgdGVzdFZvaWQsIFtdKSwKKworICBlcnJvcl9sb2dnZXI6aW5mb19tc2coInRlc3RTdHJpbmciKSwKKyAge0NsaWVudDAyLCB7b2ssIDw8IlRlc3QiPj59fSAgICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDAxLCB0ZXN0U3RyaW5nLCBbIlRlc3QiXSksCisgIGVycm9yX2xvZ2dlcjppbmZvX21zZygidGVzdFN0cmluZyIpLAorICB7Q2xpZW50MDMsIHtvaywgPDwiVGVzdCI+Pn19ICAgICAgPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MDIsIHRlc3RTdHJpbmcsIFs8PCJUZXN0Ij4+XSksCisgIGVycm9yX2xvZ2dlcjppbmZvX21zZygidGVzdEJ5dGUiKSwKKyAge0NsaWVudDA0LCB7b2ssIDYzfX0gICAgICAgICAgICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDAzLCB0ZXN0Qnl0ZSwgWzYzXSksCisgIGVycm9yX2xvZ2dlcjppbmZvX21zZygidGVzdEkzMiIpLAorICB7Q2xpZW50MDUsIHtvaywgLTF9fSAgICAgICAgICAgICAgPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MDQsIHRlc3RJMzIsIFstMV0pLAorICBlcnJvcl9sb2dnZXI6aW5mb19tc2coInRlc3RJMzIiKSwKKyAge0NsaWVudDA2LCB7b2ssIDB9fSAgICAgICAgICAgICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDA1LCB0ZXN0STMyLCBbMF0pLAorICBlcnJvcl9sb2dnZXI6aW5mb19tc2coInRlc3RJNjQiKSwKKyAge0NsaWVudDA3LCB7b2ssIC0zNDM1OTczODM2OH19ICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDA2LCB0ZXN0STY0LCBbLTM0MzU5NzM4MzY4XSksCisgIGVycm9yX2xvZ2dlcjppbmZvX21zZygidGVzdERvdWJsZSIpLAorICB7Q2xpZW50MDgsIHtvaywgLTUuMjA5ODUyM319ICAgICAgPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MDcsIHRlc3REb3VibGUsIFstNS4yMDk4NTIzXSksCisgICUlIFRPRE86IGFkZCB0ZXN0QmluYXJ5KCkgY2FsbAorICBlcnJvcl9sb2dnZXI6aW5mb19tc2coInRlc3RTdHJ1Y3QiKSwKKyAge0NsaWVudDA5LCB7b2ssIERlbW9YdHJ1Y3R9fSAgICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDA4LCB0ZXN0U3RydWN0LCBbRGVtb1h0cnVjdF0pLAorICBlcnJvcl9sb2dnZXI6aW5mb19tc2coInRlc3ROZXN0IiksCisgIHtDbGllbnQxMCwge29rLCBEZW1vTmVzdH19ICAgICAgICA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQwOSwgdGVzdE5lc3QsIFtEZW1vTmVzdF0pLAorICBlcnJvcl9sb2dnZXI6aW5mb19tc2coInRlc3RNYXAiKSwKKyAge0NsaWVudDExLCB7b2ssIERlbW9EaWN0fX0gICAgICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDEwLCB0ZXN0TWFwLCBbRGVtb0RpY3RdKSwKKyAgZXJyb3JfbG9nZ2VyOmluZm9fbXNnKCJ0ZXN0U2V0IiksCisgIHtDbGllbnQxMiwge29rLCBEZW1vU2V0fX0gICAgICAgICA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQxMSwgdGVzdFNldCwgW0RlbW9TZXRdKSwKKyAgZXJyb3JfbG9nZ2VyOmluZm9fbXNnKCJ0ZXN0TGlzdCIpLAorICB7Q2xpZW50MTMsIHtvaywgWy0xLDIsM119fSAgICAgICAgPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MTIsIHRlc3RMaXN0LCBbWy0xLDIsM11dKSwKKyAgZXJyb3JfbG9nZ2VyOmluZm9fbXNnKCJ0ZXN0RW51bSIpLAorICB7Q2xpZW50MTQsIHtvaywgMX19ICAgICAgICAgICAgICAgPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MTMsIHRlc3RFbnVtLCBbP1RIUklGVF9URVNUX05VTUJFUlpfT05FXSksCisgIGVycm9yX2xvZ2dlcjppbmZvX21zZygidGVzdFR5cGVkZWYiKSwKKyAge0NsaWVudDE1LCB7b2ssIDMwOTg1ODIzNTA4MjUyM319ID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDE0LCB0ZXN0VHlwZWRlZiwgWzMwOTg1ODIzNTA4MjUyM10pLAorICBlcnJvcl9sb2dnZXI6aW5mb19tc2coInRlc3RJbnNhbml0eSIpLAorICB7Q2xpZW50MTYsIHtvaywgSW5zYW5lUmVzdWx0fX0gICAgPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MTUsIHRlc3RJbnNhbml0eSwgW0RlbW9JbnNhbmVdKSwKKyAgaW86Zm9ybWF0KCJ+cH5uIiwgW0luc2FuZVJlc3VsdF0pLAorCisgIHtDbGllbnQxNywge29rLCAjJ3RocmlmdC50ZXN0Llh0cnVjdCd7c3RyaW5nX3RoaW5nID0gPDwiTWVzc2FnZSI+Pn19fSA9CisgICAgdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDE2LCB0ZXN0TXVsdGlFeGNlcHRpb24sIFsiU2FmZSIsICJNZXNzYWdlIl0pLAorCisgIENsaWVudDE4ID0KKyAgICB0cnkKKyAgICAgIHtDbGllbnRTMSwgUmVzdWx0MX0gPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MTcsIHRlc3RNdWx0aUV4Y2VwdGlvbiwgWyJYY2VwdGlvbiIsICJNZXNzYWdlIl0pLAorICAgICAgaW86Zm9ybWF0KCJVbmV4cGVjdGVkIHJldHVybiEgfnB+biIsIFtSZXN1bHQxXSksCisgICAgICBDbGllbnRTMQorICAgIGNhdGNoCisgICAgICB0aHJvdzp7Q2xpZW50UzIsIHtleGNlcHRpb24sIEV4blMxID0gIyd0aHJpZnQudGVzdC5YY2VwdGlvbid7fX19IC0+CisgICAgICAgICMndGhyaWZ0LnRlc3QuWGNlcHRpb24ne2Vycm9yQ29kZSA9IDEwMDEsIG1lc3NhZ2UgPSA8PCJUaGlzIGlzIGFuIFhjZXB0aW9uIj4+fSA9IEV4blMxLAorICAgICAgICBDbGllbnRTMjsKKyAgICAgIHRocm93OntDbGllbnRTMiwge2V4Y2VwdGlvbiwgX0V4blMxID0gIyd0aHJpZnQudGVzdC5YY2VwdGlvbjIne319fSAtPgorICAgICAgICBpbzpmb3JtYXQoIldyb25nIGV4Y2VwdGlvbiB0eXBlIX5uIiwgW10pLAorICAgICAgICBDbGllbnRTMgorICAgIGVuZCwKKworICBDbGllbnQxOSA9CisgICAgdHJ5CisgICAgICB7Q2xpZW50UzMsIFJlc3VsdDJ9ID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDE4LCB0ZXN0TXVsdGlFeGNlcHRpb24sIFsiWGNlcHRpb24yIiwgIk1lc3NhZ2UiXSksCisgICAgICBpbzpmb3JtYXQoIlVuZXhwZWN0ZWQgcmV0dXJuISB+cH5uIiwgW1Jlc3VsdDJdKSwKKyAgICAgIENsaWVudFMzCisgICAgY2F0Y2gKKyAgICAgIHRocm93OntDbGllbnRTNCwge2V4Y2VwdGlvbiwgX0V4blMyID0gIyd0aHJpZnQudGVzdC5YY2VwdGlvbid7fX19IC0+CisgICAgICAgIGlvOmZvcm1hdCgiV3JvbmcgZXhjZXB0aW9uIHR5cGUhfm4iLCBbXSksCisgICAgICAgIENsaWVudFM0OworICAgICAgdGhyb3c6e0NsaWVudFM0LCB7ZXhjZXB0aW9uLCBFeG5TMiA9ICMndGhyaWZ0LnRlc3QuWGNlcHRpb24yJ3t9fX0gLT4KKyAgICAgICAgIyd0aHJpZnQudGVzdC5YY2VwdGlvbjIne2Vycm9yQ29kZSA9IDIwMDIsCisgICAgICAgICAgICAgICAgICAgc3RydWN0X3RoaW5nID0gIyd0aHJpZnQudGVzdC5YdHJ1Y3QneworICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX3RoaW5nID0gPDwiVGhpcyBpcyBhbiBYY2VwdGlvbjIiPj59fSA9IEV4blMyLAorICAgICAgICBDbGllbnRTNAorICAgIGVuZCwKKworICAlJSBTdGFydGVkID0gZXJsYW5nOm1vbm90b25pY190aW1lKG1pbGxpX3NlY29uZHMpLAorICB7XywgU3RhcnRTZWMsIFN0YXJ0VVNlY30gPSBlcmxhbmc6dGltZXN0YW1wKCksCisgIGVycm9yX2xvZ2dlcjppbmZvX21zZygidGVzdE9uZXdheSIpLAorICB7Q2xpZW50MjAsIHtvaywgb2t9fSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQxOSwgdGVzdE9uZXdheSwgWzFdKSwKKyAge18sIEVuZFNlYywgRW5kVVNlY30gPSBlcmxhbmc6dGltZXN0YW1wKCksCisgIEVsYXBzZWQgPSAoRW5kU2VjIC0gU3RhcnRTZWMpICogMTAwMCArIChFbmRVU2VjIC0gU3RhcnRVU2VjKSAvIDEwMDAsCisgIGlmCisgICAgRWxhcHNlZCA+IDEwMDAgLT4gZXhpdCgxKTsKKyAgICB0cnVlIC0+IHRydWUKKyAgZW5kLAorCisgIHRocmlmdF9jbGllbnQ6Y2xvc2UoQ2xpZW50MjApLgpkaWZmIC0tZ2l0IGEvdGVzdC9lcmwvc3JjL3Rlc3RfdGhyaWZ0X3NlcnZlci5lcmwgYi90ZXN0L2VybC9zcmMvdGVzdF90aHJpZnRfc2VydmVyLmVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWQ4ZGVjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9lcmwvc3JjL3Rlc3RfdGhyaWZ0X3NlcnZlci5lcmwKQEAgLTAsMCArMSwyMzMgQEAKKyUlCislJSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCislJSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorJSUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyUlIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorJSUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorJSUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorJSUgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CislJQorJSUgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyUlCislJSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCislJSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorJSUgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCislJSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorJSUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworJSUgdW5kZXIgdGhlIExpY2Vuc2UuCislJQorCistbW9kdWxlKHRlc3RfdGhyaWZ0X3NlcnZlcikuCisKKy1leHBvcnQoW3N0YXJ0LzAsIHN0YXJ0LzEsIHN0YXJ0X2xpbmsvMiwgaGFuZGxlX2Z1bmN0aW9uLzJdKS4KKworLWluY2x1ZGUoInRocmlmdF9jb25zdGFudHMuaHJsIikuCistaW5jbHVkZSgiZ2VuLWVybC90aHJpZnRfdGVzdF90eXBlcy5ocmwiKS4KKworLXJlY29yZChvcHRpb25zLCB7cG9ydCA9IDkwOTAsCisgICAgICAgICAgICAgICAgICBzZXJ2ZXJfb3B0cyA9IFtdfSkuCisKK3BhcnNlX2FyZ3MoQXJncykgLT4gcGFyc2VfYXJncyhBcmdzLCAjb3B0aW9uc3t9KS4KK3BhcnNlX2FyZ3MoW10sIE9wdHMpIC0+CisgIE9wdHM7CitwYXJzZV9hcmdzKFtIZWFkIHwgUmVzdF0sIE9wdHMpIC0+CisgICAgTmV3T3B0cyA9CisgICAgICAgIGNhc2UgSGVhZCBvZgorICAgICAgICAgICAgIi0tcG9ydD0iICsrIFBvcnQgLT4KKyAgICAgICAgICAgICAgICBjYXNlIHN0cmluZzp0b19pbnRlZ2VyKFBvcnQpIG9mCisgICAgICAgICAgICAgICAgICB7SW50UG9ydCxffSB3aGVuIGlzX2ludGVnZXIoSW50UG9ydCkgLT4KKyAgICAgICAgICAgICAgICAgICAgT3B0cyNvcHRpb25ze3BvcnQgPSBJbnRQb3J0fTsKKyAgICAgICAgICAgICAgICAgIF9FbHNlIC0+CisgICAgICAgICAgICAgICAgICAgIGVybGFuZzplcnJvcih7YmFkX2FyZywgSGVhZH0pCisgICAgICAgICAgICAgICAgZW5kOworICAgICAgICAgICAgIi0tdHJhbnNwb3J0PSIgKysgVHJhbnMgLT4KKyAgICAgICAgICAgICAgICBjYXNlIFRyYW5zIG9mCisgICAgICAgICAgICAgICAgICAgICJmcmFtZWQiIC0+CisgICAgICAgICAgICAgICAgICAgICAgICBPcHRzI29wdGlvbnN7c2VydmVyX29wdHMgPSBbe2ZyYW1lZCwgdHJ1ZX0gfCBPcHRzI29wdGlvbnMuc2VydmVyX29wdHNdfTsKKyAgICAgICAgICAgICAgICAgICAgX0Vsc2UgLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIE9wdHMKKyAgICAgICAgICAgICAgICBlbmQ7CisgICAgICAgICAgICAiLS1zc2wiIC0+CisgICAgICAgICAgICAgICAgc3NsOnN0YXJ0KCksCisgICAgICAgICAgICAgICAgU3NsT3B0aW9ucyA9CisgICAgICAgICAgICAgICAgICAgIHtzc2xvcHRpb25zLCBbCisgICAgICAgICAgICAgICAgICAgICAgICAge2NlcnRmaWxlLCAiLi4va2V5cy9zZXJ2ZXIucGVtIn0KKyAgICAgICAgICAgICAgICAgICAgICAgICx7a2V5ZmlsZSwgICIuLi9rZXlzL3NlcnZlci5rZXkifQorICAgICAgICAgICAgICAgICAgICBdfSwKKyAgICAgICAgICAgICAgICBPcHRzI29wdGlvbnN7c2VydmVyX29wdHMgPSBbe3NzbHRyYW5zcG9ydCwgdHJ1ZX0gfCBbU3NsT3B0aW9ucyB8IE9wdHMjb3B0aW9ucy5zZXJ2ZXJfb3B0c11dfTsKKyAgICAgICAgICAgICItLXByb3RvY29sPSIgKysgUHJvdG8gLT4KKyAgICAgICAgICAgICAgICBPcHRzI29wdGlvbnN7c2VydmVyX29wdHMgPSBbe3Byb3RvY29sLCBsaXN0X3RvX2F0b20oUHJvdG8pfSB8IE9wdHMjb3B0aW9ucy5zZXJ2ZXJfb3B0c119OworICAgICAgICAgICAgX0Vsc2UgLT4KKyAgICAgICAgICAgICAgICBlcmxhbmc6ZXJyb3Ioe2JhZF9hcmcsIEhlYWR9KQorICAgICAgICBlbmQsCisgICAgcGFyc2VfYXJncyhSZXN0LCBOZXdPcHRzKS4KKworc3RhcnQoKSAtPiBzdGFydChpbml0OmdldF9wbGFpbl9hcmd1bWVudHMoKSkuCitzdGFydChBcmdzKSAtPgorICAgICNvcHRpb25ze3BvcnQgPSBQb3J0LCBzZXJ2ZXJfb3B0cyA9IFNlcnZlck9wdHN9ID0gcGFyc2VfYXJncyhBcmdzKSwKKyAgICBzcGF3bihmdW4oKSAtPiBzdGFydF9saW5rKFBvcnQsIFNlcnZlck9wdHMpLCByZWNlaXZlIGFmdGVyIGluZmluaXR5IC0+IG9rIGVuZCBlbmQpLgorCitzdGFydF9saW5rKFBvcnQsIFNlcnZlck9wdHMpIC0+CisgICAgdGhyaWZ0X3NvY2tldF9zZXJ2ZXI6c3RhcnQoW3toYW5kbGVyLCA/TU9EVUxFfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NlcnZpY2UsIHRocmlmdF90ZXN0X3RocmlmdH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtwb3J0LCBQb3J0fV0gKysKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2ZXJPcHRzKS4KKworCitoYW5kbGVfZnVuY3Rpb24odGVzdFZvaWQsIHt9KSAtPgorICAgIGlvOmZvcm1hdCgidGVzdFZvaWR+biIpLAorICAgIG9rOworCitoYW5kbGVfZnVuY3Rpb24odGVzdFN0cmluZywge1N9KSB3aGVuIGlzX2JpbmFyeShTKSAtPgorICAgIGlvOmZvcm1hdCgidGVzdFN0cmluZzogfnB+biIsIFtTXSksCisgICAge3JlcGx5LCBTfTsKKworaGFuZGxlX2Z1bmN0aW9uKHRlc3RCb29sLCB7Qn0pIHdoZW4gaXNfYm9vbGVhbihCKSAtPgorICAgIGlvOmZvcm1hdCgidGVzdEJvb2w6IH5wfm4iLCBbQl0pLAorICAgIHtyZXBseSwgQn07CisKK2hhbmRsZV9mdW5jdGlvbih0ZXN0Qnl0ZSwge0k4fSkgd2hlbiBpc19pbnRlZ2VyKEk4KSAtPgorICAgIGlvOmZvcm1hdCgidGVzdEJ5dGU6IH5wfm4iLCBbSThdKSwKKyAgICB7cmVwbHksIEk4fTsKKworaGFuZGxlX2Z1bmN0aW9uKHRlc3RJMzIsIHtJMzJ9KSB3aGVuIGlzX2ludGVnZXIoSTMyKSAtPgorICAgIGlvOmZvcm1hdCgidGVzdEkzMjogfnB+biIsIFtJMzJdKSwKKyAgICB7cmVwbHksIEkzMn07CisKK2hhbmRsZV9mdW5jdGlvbih0ZXN0STY0LCB7STY0fSkgd2hlbiBpc19pbnRlZ2VyKEk2NCkgLT4KKyAgICBpbzpmb3JtYXQoInRlc3RJNjQ6IH5wfm4iLCBbSTY0XSksCisgICAge3JlcGx5LCBJNjR9OworCitoYW5kbGVfZnVuY3Rpb24odGVzdERvdWJsZSwge0RvdWJsZX0pIHdoZW4gaXNfZmxvYXQoRG91YmxlKSAtPgorICAgIGlvOmZvcm1hdCgidGVzdERvdWJsZTogfnB+biIsIFtEb3VibGVdKSwKKyAgICB7cmVwbHksIERvdWJsZX07CisKK2hhbmRsZV9mdW5jdGlvbih0ZXN0QmluYXJ5LCB7U30pIHdoZW4gaXNfYmluYXJ5KFMpIC0+CisgICAgaW86Zm9ybWF0KCJ0ZXN0QmluYXJ5OiB+cH5uIiwgW1NdKSwKKyAgICB7cmVwbHksIFN9OworCitoYW5kbGVfZnVuY3Rpb24odGVzdFN0cnVjdCwKKyAgICAgICAgICAgICAgICB7U3RydWN0ID0gIyd0aHJpZnQudGVzdC5YdHJ1Y3Qne3N0cmluZ190aGluZyA9IFN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfdGhpbmcgPSBCeXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTMyX3RoaW5nID0gSTMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTY0X3RoaW5nID0gSTY0fX0pCit3aGVuIGlzX2JpbmFyeShTdHJpbmcpLAorICAgICBpc19pbnRlZ2VyKEJ5dGUpLAorICAgICBpc19pbnRlZ2VyKEkzMiksCisgICAgIGlzX2ludGVnZXIoSTY0KSAtPgorICAgIGlvOmZvcm1hdCgidGVzdFN0cnVjdDogfnB+biIsIFtTdHJ1Y3RdKSwKKyAgICB7cmVwbHksIFN0cnVjdH07CisKK2hhbmRsZV9mdW5jdGlvbih0ZXN0TmVzdCwKKyAgICAgICAgICAgICAgICB7TmVzdH0pIHdoZW4gaXNfcmVjb3JkKE5lc3QsICd0aHJpZnQudGVzdC5YdHJ1Y3QyJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3JlY29yZChOZXN0Iyd0aHJpZnQudGVzdC5YdHJ1Y3QyJy5zdHJ1Y3RfdGhpbmcsICd0aHJpZnQudGVzdC5YdHJ1Y3QnKSAtPgorICAgIGlvOmZvcm1hdCgidGVzdE5lc3Q6IH5wfm4iLCBbTmVzdF0pLAorICAgIHtyZXBseSwgTmVzdH07CisKK2hhbmRsZV9mdW5jdGlvbih0ZXN0TWFwLCB7TWFwfSkgLT4KKyAgICBpbzpmb3JtYXQoInRlc3RNYXA6IH5wfm4iLCBbZGljdDp0b19saXN0KE1hcCldKSwKKyAgICB7cmVwbHksIE1hcH07CisKK2hhbmRsZV9mdW5jdGlvbih0ZXN0U3RyaW5nTWFwLCB7TWFwfSkgLT4KKyAgICBpbzpmb3JtYXQoInRlc3RTdHJpbmdNYXA6IH5wfm4iLCBbZGljdDp0b19saXN0KE1hcCldKSwKKyAgICB7cmVwbHksIE1hcH07CisKK2hhbmRsZV9mdW5jdGlvbih0ZXN0U2V0LCB7U2V0fSkgLT4KKyAgICB0cnVlID0gc2V0czppc19zZXQoU2V0KSwKKyAgICBpbzpmb3JtYXQoInRlc3RTZXQ6IH5wfm4iLCBbc2V0czp0b19saXN0KFNldCldKSwKKyAgICB7cmVwbHksIFNldH07CisKK2hhbmRsZV9mdW5jdGlvbih0ZXN0TGlzdCwge0xpc3R9KSB3aGVuIGlzX2xpc3QoTGlzdCkgLT4KKyAgICBpbzpmb3JtYXQoInRlc3RMaXN0OiB+cH5uIiwgW0xpc3RdKSwKKyAgICB7cmVwbHksIExpc3R9OworCitoYW5kbGVfZnVuY3Rpb24odGVzdEVudW0sIHtFbnVtfSkgd2hlbiBpc19pbnRlZ2VyKEVudW0pIC0+CisgICAgaW86Zm9ybWF0KCJ0ZXN0RW51bTogfnB+biIsIFtFbnVtXSksCisgICAge3JlcGx5LCBFbnVtfTsKKworaGFuZGxlX2Z1bmN0aW9uKHRlc3RUeXBlZGVmLCB7VXNlcklEfSkgd2hlbiBpc19pbnRlZ2VyKFVzZXJJRCkgLT4KKyAgICBpbzpmb3JtYXQoInRlc3RUeXBlZGVmOiB+cH5uIiwgW1VzZXJJRF0pLAorICAgIHtyZXBseSwgVXNlcklEfTsKKworaGFuZGxlX2Z1bmN0aW9uKHRlc3RNYXBNYXAsIHtIZWxsb30pIC0+CisgICAgaW86Zm9ybWF0KCJ0ZXN0TWFwTWFwOiB+cH5uIiwgW0hlbGxvXSksCisKKyAgICBQb3NMaXN0ID0gW3tJLCBJfSAgIHx8IEkgPC0gbGlzdHM6c2VxKDEsIDQpXSwKKyAgICBOZWdMaXN0ID0gW3stSSwgLUl9IHx8IEkgPC0gbGlzdHM6c2VxKDEsIDQpXSwKKworICAgIE1hcE1hcCA9IGRpY3Q6ZnJvbV9saXN0KFt7NCwgIGRpY3Q6ZnJvbV9saXN0KFBvc0xpc3QpfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey00LCBkaWN0OmZyb21fbGlzdChOZWdMaXN0KX1dKSwKKyAgICB7cmVwbHksIE1hcE1hcH07CisKK2hhbmRsZV9mdW5jdGlvbih0ZXN0SW5zYW5pdHksIHtJbnNhbml0eX0pIHdoZW4gaXNfcmVjb3JkKEluc2FuaXR5LCAndGhyaWZ0LnRlc3QuSW5zYW5pdHknKSAtPgorICAgIEhlbGxvID0gIyd0aHJpZnQudGVzdC5YdHJ1Y3Qne3N0cmluZ190aGluZyA9IDw8IkhlbGxvMiI+PiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlX3RoaW5nID0gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMzJfdGhpbmcgPSAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk2NF90aGluZyA9IDJ9LAorCisgICAgR29vZGJ5ZSA9ICMndGhyaWZ0LnRlc3QuWHRydWN0J3tzdHJpbmdfdGhpbmcgPSA8PCJHb29kYnllNCI+PiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV90aGluZyA9IDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMzJfdGhpbmcgPSA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTY0X3RoaW5nID0gNH0sCisgICAgQ3JhenkgPSAjJ3RocmlmdC50ZXN0Lkluc2FuaXR5J3sKKyAgICAgICAgICAgICAgIHVzZXJNYXAgPSBkaWN0OmZyb21fbGlzdChbez9USFJJRlRfVEVTVF9OVU1CRVJaX0VJR0hULCA4fV0pLAorICAgICAgICAgICAgICAgeHRydWN0cyA9IFtHb29kYnllXQorICAgICAgICAgICAgICB9LAorCisgICAgTG9vbmV5ID0gIyd0aHJpZnQudGVzdC5JbnNhbml0eSd7fSwKKworICAgIEZpcnN0TWFwID0gZGljdDpmcm9tX2xpc3QoW3s/VEhSSUZUX1RFU1RfTlVNQkVSWl9UV08sIEluc2FuaXR5fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7P1RIUklGVF9URVNUX05VTUJFUlpfVEhSRUUsIEluc2FuaXR5fV0pLAorCisgICAgU2Vjb25kTWFwID0gZGljdDpmcm9tX2xpc3QoW3s/VEhSSUZUX1RFU1RfTlVNQkVSWl9TSVgsIExvb25leX1dKSwKKworICAgIEluc2FuZSA9IGRpY3Q6ZnJvbV9saXN0KFt7MSwgRmlyc3RNYXB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MiwgU2Vjb25kTWFwfV0pLAorCisgICAgaW86Zm9ybWF0KCJSZXR1cm4gPSB+cH5uIiwgW0luc2FuZV0pLAorCisgICAge3JlcGx5LCBJbnNhbmV9OworCitoYW5kbGVfZnVuY3Rpb24odGVzdE11bHRpLCBBcmdzID0ge0FyZzAsIEFyZzEsIEFyZzIsIF9BcmczLCBBcmc0LCBBcmc1fSkKKyAgd2hlbiBpc19pbnRlZ2VyKEFyZzApLAorICAgICAgIGlzX2ludGVnZXIoQXJnMSksCisgICAgICAgaXNfaW50ZWdlcihBcmcyKSwKKyAgICAgICBpc19pbnRlZ2VyKEFyZzQpLAorICAgICAgIGlzX2ludGVnZXIoQXJnNSkgLT4KKworICAgIGlvOmZvcm1hdCgidGVzdE11bHRpKH5wKX5uIiwgW0FyZ3NdKSwKKyAgICB7cmVwbHksICMndGhyaWZ0LnRlc3QuWHRydWN0J3tzdHJpbmdfdGhpbmcgPSA8PCJIZWxsbzIiPj4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV90aGluZyA9IEFyZzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTMyX3RoaW5nID0gQXJnMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpNjRfdGhpbmcgPSBBcmcyfX07CisKK2hhbmRsZV9mdW5jdGlvbih0ZXN0RXhjZXB0aW9uLCB7U3RyaW5nfSkgd2hlbiBpc19iaW5hcnkoU3RyaW5nKSAtPgorICAgIGlvOmZvcm1hdCgidGVzdEV4Y2VwdGlvbih+cCl+biIsIFtTdHJpbmddKSwKKyAgICBjYXNlIFN0cmluZyBvZgorICAgICAgICA8PCJYY2VwdGlvbiI+PiAtPgorICAgICAgICAgICAgdGhyb3coIyd0aHJpZnQudGVzdC5YY2VwdGlvbid7ZXJyb3JDb2RlID0gMTAwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gU3RyaW5nfSk7CisgICAgICAgIDw8IlRFeGNlcHRpb24iPj4gLT4KKyAgICAgICAgICAgIHRocm93KHs/VEFwcGxpY2F0aW9uRXhjZXB0aW9uX1N0cnVjdHVyZX0pOworICAgICAgICBfIC0+CisgICAgICAgICAgICBvaworICAgIGVuZDsKKworaGFuZGxlX2Z1bmN0aW9uKHRlc3RNdWx0aUV4Y2VwdGlvbiwge0FyZzAsIEFyZzF9KSAtPgorICAgIGlvOmZvcm1hdCgidGVzdE11bHRpRXhjZXB0aW9uKH5wLCB+cCl+biIsIFtBcmcwLCBBcmcxXSksCisgICAgY2FzZSBBcmcwIG9mCisgICAgICAgIDw8IlhjZXB0aW9uIj4+IC0+CisgICAgICAgICAgICB0aHJvdygjJ3RocmlmdC50ZXN0LlhjZXB0aW9uJ3tlcnJvckNvZGUgPSAxMDAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gPDwiVGhpcyBpcyBhbiBYY2VwdGlvbiI+Pn0pOworICAgICAgICA8PCJYY2VwdGlvbjIiPj4gLT4KKyAgICAgICAgICAgIHRocm93KCMndGhyaWZ0LnRlc3QuWGNlcHRpb24yJ3tlcnJvckNvZGUgPSAyMDAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0X3RoaW5nID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMndGhyaWZ0LnRlc3QuWHRydWN0J3tzdHJpbmdfdGhpbmcgPSA8PCJUaGlzIGlzIGFuIFhjZXB0aW9uMiI+Pn19KTsKKyAgICAgICAgXyAtPgorICAgICAgICAgICAge3JlcGx5LCAjJ3RocmlmdC50ZXN0Llh0cnVjdCd7c3RyaW5nX3RoaW5nID0gQXJnMX19CisgICAgZW5kOworCitoYW5kbGVfZnVuY3Rpb24odGVzdE9uZXdheSwge1NlY29uZHN9KSAtPgorICAgIGlvOmZvcm1hdCgidGVzdE9uZXdheTogfnB+biIsIFtTZWNvbmRzXSksCisgICAgdGltZXI6c2xlZXAoMTAwMCAqIFNlY29uZHMpLAorICAgIG9rLgpkaWZmIC0tZ2l0IGEvdGVzdC9lcmwvc3JjL3RocmlmdF90ZXN0LmFwcC5zcmMgYi90ZXN0L2VybC9zcmMvdGhyaWZ0X3Rlc3QuYXBwLnNyYwppbmRleCBhMGMzNDhmLi44MGVmOTk2IDEwMDY0NAotLS0gYS90ZXN0L2VybC9zcmMvdGhyaWZ0X3Rlc3QuYXBwLnNyYworKysgYi90ZXN0L2VybC9zcmMvdGhyaWZ0X3Rlc3QuYXBwLnNyYwpAQCAtMTksMTMgKzE5LDE2IEBACiAlJSUgLSotIG1vZGU6ZXJsYW5nIC0qLQoge2FwcGxpY2F0aW9uLCB0aHJpZnRfdGVzdCwgWwogICAlIEEgcXVpY2sgZGVzY3JpcHRpb24gb2YgdGhlIGFwcGxpY2F0aW9uLgotICB7ZGVzY3JpcHRpb24sICJ0ZXN0cyBmb3IgdGhyaWZ0IGVybGFuZyBjb21waWxlciBiYWNrZW5kIn0sCisgIHtkZXNjcmlwdGlvbiwgIlRocmlmdCBjcm9zcyBsYW5ndWFnZSB0ZXN0In0sCiAKICAgJSBUaGUgdmVyc2lvbiBvZiB0aGUgYXBwbGljYXRvbgotICB7dnNuLCAiMC45LjMifSwKKyAge3ZzbiwgIjEuMC4wIn0sCiAKICAgJSBBbGwgbW9kdWxlcyB1c2VkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KLSAge21vZHVsZXMsIFtsZWdhY3lfbmFtZXNfdGVzdCwgbmFtZV9jb25mbGljdF90ZXN0LCB0aHJpZnRfdGVzdF90ZXN0XX0sCisgIHttb2R1bGVzLCBbCisgICAgdGVzdF9jbGllbnQsCisgICAgdGVzdF90aHJpZnRfc2VydmVyCisgIF19LAogCiAgICUgQWxsIG9mIHRoZSByZWdpc3RlcmVkIG5hbWVzIHRoZSBhcHBsaWNhdGlvbiB1c2VzLiBUaGlzIGNhbiBiZSBpZ25vcmVkLgogICB7cmVnaXN0ZXJlZCwgW119LApkaWZmIC0tZ2l0IGEvdGVzdC9lcmwvc3JjL3RocmlmdF90ZXN0X3Rlc3QuZXJsIGIvdGVzdC9lcmwvc3JjL3RocmlmdF90ZXN0X3Rlc3QuZXJsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2RmZTFjLi4wMDAwMDAwCi0tLSBhL3Rlc3QvZXJsL3NyYy90aHJpZnRfdGVzdF90ZXN0LmVybAorKysgL2Rldi9udWxsCkBAIC0xLDY1NSArMCwwIEBACi0lJQotJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0lJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotJSUKLSUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0lJQotJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSUlIHVuZGVyIHRoZSBMaWNlbnNlLgotJSUKLQotJSBkb24ndCByZW5hbWUgdGhpcyB0aHJpZnRfdGVzdCwgaXQgY2xvYmJlcnMgZ2VuZXJhdGVkIGZpbGVzCi0tbW9kdWxlKHRocmlmdF90ZXN0X3Rlc3QpLgotLWNvbXBpbGUoZXhwb3J0X2FsbCkuCi0KLS1pbmNsdWRlX2xpYigiZXVuaXQvaW5jbHVkZS9ldW5pdC5ocmwiKS4KLQotLWluY2x1ZGUoInRocmlmdF90ZXN0X2NvbnN0YW50cy5ocmwiKS4KLQotY29uc3RhbnRfdGVzdF8oKSAtPgotICBbCi0gICAgeyJteU51bWJlcnogZXF1YWxzIDEiLCA/X2Fzc2VydEVxdWFsKDEsID9USFJJRlRfVEVTVF9NWU5VTUJFUlopfQotICBdLgotCi1yZWNvcmRfZ2VuZXJhdGlvbl90ZXN0XygpIC0+Ci0gIFsKLSAgICB7IkJvbmsgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKLSAgICAgIHsnQm9uaycsIF8sIF99LAotICAgICAgIydCb25rJ3ttZXNzYWdlPW51bGwsdHlwZT1udWxsfQotICAgICl9LAotICAgIHsiQm9vbHMgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKLSAgICAgIHsnQm9vbHMnLCBfLCBffSwKLSAgICAgICMnQm9vbHMne2ltX3RydWU9bnVsbCxpbV9mYWxzZT1udWxsfQotICAgICl9LAotICAgIHsiWHRydWN0IHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCi0gICAgICB7J1h0cnVjdCcsIF8sIF8sIF8sIF99LAotICAgICAgIydYdHJ1Y3Qne3N0cmluZ190aGluZz1udWxsLGJ5dGVfdGhpbmc9bnVsbCxpMzJfdGhpbmc9bnVsbCxpNjRfdGhpbmc9bnVsbH0KLSAgICApfSwKLSAgICB7Ilh0cnVjdDIgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKLSAgICAgIHsnWHRydWN0MicsIF8sIF8sIF99LAotICAgICAgIydYdHJ1Y3QyJ3tieXRlX3RoaW5nPW51bGwsc3RydWN0X3RoaW5nPW51bGwsaTMyX3RoaW5nPW51bGx9Ci0gICAgKX0sCi0gICAgeyJYdHJ1Y3QzIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCi0gICAgICB7J1h0cnVjdDMnLCBfLCBfLCBfLCBffSwKLSAgICAgICMnWHRydWN0Myd7c3RyaW5nX3RoaW5nPW51bGwsY2hhbmdlZD1udWxsLGkzMl90aGluZz1udWxsLGk2NF90aGluZz1udWxsfQotICAgICl9LAotICAgIHsiSW5zYW5pdHkgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKLSAgICAgIHsnSW5zYW5pdHknLCBfLCBffSwKLSAgICAgICMnSW5zYW5pdHkne3VzZXJNYXA9bnVsbCx4dHJ1Y3RzPW51bGx9Ci0gICAgKX0sCi0gICAgeyJDcmF6eU5lc3RpbmcgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKLSAgICAgIHsnQ3JhenlOZXN0aW5nJywgXywgXywgXywgX30sCi0gICAgICAjJ0NyYXp5TmVzdGluZyd7Ci0gICAgICAgIHN0cmluZ19maWVsZD1udWxsLAotICAgICAgICBzZXRfZmllbGQ9bnVsbCwKLSAgICAgICAgbGlzdF9maWVsZD1udWxsLAotICAgICAgICBiaW5hcnlfZmllbGQ9bnVsbAotICAgICAgfQotICAgICl9LAotICAgIHsiWGNlcHRpb24gcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKLSAgICAgIHsnWGNlcHRpb24nLCBfLCBffSwKLSAgICAgICMnWGNlcHRpb24ne2Vycm9yQ29kZT1udWxsLG1lc3NhZ2U9bnVsbH0KLSAgICApfSwKLSAgICB7IlhjZXB0aW9uMiByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAotICAgICAgeydYY2VwdGlvbjInLCBfLCBffSwKLSAgICAgICMnWGNlcHRpb24yJ3tlcnJvckNvZGU9bnVsbCxzdHJ1Y3RfdGhpbmc9bnVsbH0KLSAgICApfSwKLSAgICB7IkVtcHR5U3RydWN0IHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goeydFbXB0eVN0cnVjdCd9LCAjJ0VtcHR5U3RydWN0J3t9KX0sCi0gICAgeyJPbmVGaWVsZCByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKHsnT25lRmllbGQnLCBffSwgIydPbmVGaWVsZCd7ZmllbGQ9bnVsbH0pfSwKLSAgICB7IlZlcnNpb25pbmdUZXN0VjEgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKLSAgICAgIHsnVmVyc2lvbmluZ1Rlc3RWMScsIF8sIF8sIF99LAotICAgICAgIydWZXJzaW9uaW5nVGVzdFYxJ3tiZWdpbl9pbl9ib3RoPW51bGwsb2xkX3N0cmluZz1udWxsLGVuZF9pbl9ib3RoPW51bGx9Ci0gICAgKX0sCi0gICAgeyJWZXJzaW9uaW5nVGVzdFYyIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCi0gICAgICB7J1ZlcnNpb25pbmdUZXN0VjInLCBfLCBfLCBfLCBfLCBfLCBfLCBfLCBfLCBfLCBfLCBfLCBffSwKLSAgICAgICMnVmVyc2lvbmluZ1Rlc3RWMid7Ci0gICAgICAgIGJlZ2luX2luX2JvdGg9bnVsbCwKLSAgICAgICAgbmV3aW50PW51bGwsCi0gICAgICAgIG5ld2J5dGU9bnVsbCwKLSAgICAgICAgbmV3c2hvcnQ9bnVsbCwKLSAgICAgICAgbmV3bG9uZz1udWxsLAotICAgICAgICBuZXdkb3VibGU9bnVsbCwKLSAgICAgICAgbmV3c3RydWN0PW51bGwsCi0gICAgICAgIG5ld2xpc3Q9bnVsbCwKLSAgICAgICAgbmV3c2V0PW51bGwsCi0gICAgICAgIG5ld21hcD1udWxsLAotICAgICAgICBuZXdzdHJpbmc9bnVsbCwKLSAgICAgICAgZW5kX2luX2JvdGg9bnVsbAotICAgICAgfQotICAgICl9LAotICAgIHsiTGlzdFR5cGVWZXJzaW9uaW5nVjEgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKLSAgICAgIHsnTGlzdFR5cGVWZXJzaW9uaW5nVjEnLCBfLCBffSwKLSAgICAgICMnTGlzdFR5cGVWZXJzaW9uaW5nVjEne215aW50cz1udWxsLGhlbGxvPW51bGx9Ci0gICAgKX0sCi0gICAgeyJMaXN0VHlwZVZlcnNpb25pbmdWMiByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAotICAgICAgeydMaXN0VHlwZVZlcnNpb25pbmdWMicsIF8sIF99LAotICAgICAgIydMaXN0VHlwZVZlcnNpb25pbmdWMid7c3RyaW5ncz1udWxsLGhlbGxvPW51bGx9Ci0gICAgKX0sCi0gICAgeyJHdWVzc1Byb3RvY29sU3RydWN0IHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCi0gICAgICB7J0d1ZXNzUHJvdG9jb2xTdHJ1Y3QnLCBffSwKLSAgICAgICMnR3Vlc3NQcm90b2NvbFN0cnVjdCd7bWFwX2ZpZWxkPW51bGx9Ci0gICAgKX0sCi0gICAgeyJMYXJnZURlbHRhcyByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAotICAgICAgeydMYXJnZURlbHRhcycsIF8sIF8sIF8sIF8sIF8sIF8sIF8sIF8sIF8sIF99LAotICAgICAgIydMYXJnZURlbHRhcyd7Ci0gICAgICAgIGIxPW51bGwsCi0gICAgICAgIGIxMD1udWxsLAotICAgICAgICBiMTAwPW51bGwsCi0gICAgICAgIGNoZWNrX3RydWU9bnVsbCwKLSAgICAgICAgYjEwMDA9bnVsbCwKLSAgICAgICAgY2hlY2tfZmFsc2U9bnVsbCwKLSAgICAgICAgdmVydHdvMjAwMD1udWxsLAotICAgICAgICBhX3NldDI1MDA9bnVsbCwKLSAgICAgICAgdmVydHdvMzAwMD1udWxsLAotICAgICAgICBiaWdfbnVtYmVycz1udWxsCi0gICAgICB9Ci0gICAgKX0sCi0gICAgeyJOZXN0ZWRMaXN0c0kzMngyIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCi0gICAgICB7J05lc3RlZExpc3RzSTMyeDInLCBffSwKLSAgICAgICMnTmVzdGVkTGlzdHNJMzJ4Mid7aW50ZWdlcmxpc3Q9bnVsbH0KLSAgICApfSwKLSAgICB7Ik5lc3RlZExpc3RzSTMyeDMgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKLSAgICAgIHsnTmVzdGVkTGlzdHNJMzJ4MycsIF99LAotICAgICAgIydOZXN0ZWRMaXN0c0kzMngzJ3tpbnRlZ2VybGlzdD1udWxsfQotICAgICl9LAotICAgIHsiTmVzdGVkTWl4ZWR4MiByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAotICAgICAgeydOZXN0ZWRNaXhlZHgyJywgXywgXywgX30sCi0gICAgICAjJ05lc3RlZE1peGVkeDInewotICAgICAgICBpbnRfc2V0X2xpc3Q9bnVsbCwKLSAgICAgICAgbWFwX2ludF9zdHJzZXQ9bnVsbCwKLSAgICAgICAgbWFwX2ludF9zdHJzZXRfbGlzdD1udWxsCi0gICAgICB9Ci0gICAgKX0sCi0gICAgeyJMaXN0Qm9ua3MgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCh7J0xpc3RCb25rcycsIF99LCAjJ0xpc3RCb25rcyd7Ym9uaz1udWxsfSl9LAotICAgIHsiTmVzdGVkTGlzdHNCb25rIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCi0gICAgICB7J05lc3RlZExpc3RzQm9uaycsIF99LAotICAgICAgIydOZXN0ZWRMaXN0c0Jvbmsne2Jvbms9bnVsbH0KLSAgICApfSwKLSAgICB7IkJvb2xUZXN0IHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCi0gICAgICB7J0Jvb2xUZXN0JywgXywgX30sCi0gICAgICAjJ0Jvb2xUZXN0J3tiPW51bGwscz1udWxsfQotICAgICl9LAotICAgIHsiU3RydWN0QSByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKHsnU3RydWN0QScsIF99LCAjJ1N0cnVjdEEne3M9bnVsbH0pfSwKLSAgICB7IlN0cnVjdEIgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKLSAgICAgIHsnU3RydWN0QicsIF8sIF99LAotICAgICAgIydTdHJ1Y3RCJ3thYT1udWxsLGFiPW51bGx9Ci0gICAgKX0KLSAgXS4KLQotc3RydWN0X2luZm9fdGVzdF8oKSAtPgotICBbCi0gICAgeyJCb25rIGRlZmluaXRpb24gKHNob3J0IHZlcnNpb24pIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFt7MSwgc3RyaW5nfSwgezIsIGkzMn1dfSwKLSAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvKCdCb25rJykKLSAgICApfSwKLSAgICB7IkJvbmsgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbCi0gICAgICAgIHsxLCB1bmRlZmluZWQsIHN0cmluZywgbWVzc2FnZSwgdW5kZWZpbmVkfSwKLSAgICAgICAgezIsIHVuZGVmaW5lZCwgaTMyLCB0eXBlLCB1bmRlZmluZWR9Ci0gICAgICBdfSwKLSAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgnQm9uaycpCi0gICAgKX0sCi0gICAgeyJCb29scyBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFsKLSAgICAgICAgezEsIHVuZGVmaW5lZCwgYm9vbCwgaW1fdHJ1ZSwgdW5kZWZpbmVkfSwKLSAgICAgICAgezIsIHVuZGVmaW5lZCwgYm9vbCwgaW1fZmFsc2UsIHVuZGVmaW5lZH0KLSAgICAgIF19LAotICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCdCb29scycpCi0gICAgKX0sCi0gICAgeyJYdHJ1Y3QgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbCi0gICAgICAgIHsxLCB1bmRlZmluZWQsIHN0cmluZywgc3RyaW5nX3RoaW5nLCB1bmRlZmluZWR9LAotICAgICAgICB7NCwgdW5kZWZpbmVkLCBieXRlLCBieXRlX3RoaW5nLCB1bmRlZmluZWR9LAotICAgICAgICB7OSwgdW5kZWZpbmVkLCBpMzIsIGkzMl90aGluZywgdW5kZWZpbmVkfSwKLSAgICAgICAgezExLCB1bmRlZmluZWQsIGk2NCwgaTY0X3RoaW5nLCB1bmRlZmluZWR9Ci0gICAgICBdfSwKLSAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgnWHRydWN0JykKLSAgICApfSwKLSAgICB7Ilh0cnVjdDIgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbCi0gICAgICAgIHsxLCB1bmRlZmluZWQsIGJ5dGUsIGJ5dGVfdGhpbmcsIHVuZGVmaW5lZH0sCi0gICAgICAgIHsyLCB1bmRlZmluZWQsIHtzdHJ1Y3QsIHsndGhyaWZ0X3Rlc3RfdHlwZXMnLCAnWHRydWN0J319LCBzdHJ1Y3RfdGhpbmcsICMnWHRydWN0J3t9fSwKLSAgICAgICAgezMsIHVuZGVmaW5lZCwgaTMyLCBpMzJfdGhpbmcsIHVuZGVmaW5lZH0KLSAgICAgIF19LAotICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCdYdHJ1Y3QyJykKLSAgICApfSwKLSAgICB7Ilh0cnVjdDMgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbCi0gICAgICAgIHsxLCB1bmRlZmluZWQsIHN0cmluZywgc3RyaW5nX3RoaW5nLCB1bmRlZmluZWR9LAotICAgICAgICB7NCwgdW5kZWZpbmVkLCBpMzIsIGNoYW5nZWQsIHVuZGVmaW5lZH0sCi0gICAgICAgIHs5LCB1bmRlZmluZWQsIGkzMiwgaTMyX3RoaW5nLCB1bmRlZmluZWR9LAotICAgICAgICB7MTEsIHVuZGVmaW5lZCwgaTY0LCBpNjRfdGhpbmcsIHVuZGVmaW5lZH0KLSAgICAgIF19LAotICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCdYdHJ1Y3QzJykKLSAgICApfSwKLSAgICB7Ikluc2FuaXR5IGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwgdW5kZWZpbmVkLCB7bWFwLCBpMzIsIGk2NH0sIHVzZXJNYXAsIGRpY3Q6bmV3KCl9LAotICAgICAgICB7MiwgdW5kZWZpbmVkLCB7bGlzdCwge3N0cnVjdCwgeyd0aHJpZnRfdGVzdF90eXBlcycsICdYdHJ1Y3QnfX19LCB4dHJ1Y3RzLCBbXX0KLSAgICAgIF19LAotICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCdJbnNhbml0eScpCi0gICAgKX0sCi0gICAgeyJDcmF6eU5lc3RpbmcgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbCi0gICAgICAgIHsxLCB1bmRlZmluZWQsIHN0cmluZywgc3RyaW5nX2ZpZWxkLCB1bmRlZmluZWR9LAotICAgICAgICB7Miwgb3B0aW9uYWwsIHtzZXQsIHtzdHJ1Y3QsIHsndGhyaWZ0X3Rlc3RfdHlwZXMnLCAnSW5zYW5pdHknfX19LCBzZXRfZmllbGQsIHNldHM6bmV3KCl9LAotICAgICAgICB7MywgcmVxdWlyZWQsIHtsaXN0LCB7bWFwLCAKLSAgICAgICAgICB7c2V0LCBpMzJ9LAotICAgICAgICAgIHttYXAsIGkzMiwge3NldCwge2xpc3QsIHttYXAsIHtzdHJ1Y3QsIHsndGhyaWZ0X3Rlc3RfdHlwZXMnLCAnSW5zYW5pdHknfX0sIHN0cmluZ319fX0KLSAgICAgICAgfX0sIGxpc3RfZmllbGQsIFtdfSwKLSAgICAgICAgezQsIHVuZGVmaW5lZCwgc3RyaW5nLCBiaW5hcnlfZmllbGQsIHVuZGVmaW5lZH0KLSAgICAgIF19LAotICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCdDcmF6eU5lc3RpbmcnKQotICAgICl9LAotICAgIHsiWGNlcHRpb24gZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbCi0gICAgICAgIHsxLCB1bmRlZmluZWQsIGkzMiwgZXJyb3JDb2RlLCB1bmRlZmluZWR9LAotICAgICAgICB7MiwgdW5kZWZpbmVkLCBzdHJpbmcsIG1lc3NhZ2UsIHVuZGVmaW5lZH0KLSAgICAgIF19LAotICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCdYY2VwdGlvbicpCi0gICAgKX0sCi0gICAgeyJYY2VwdGlvbjIgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbCi0gICAgICAgIHsxLCB1bmRlZmluZWQsIGkzMiwgZXJyb3JDb2RlLCB1bmRlZmluZWR9LAotICAgICAgICB7MiwgdW5kZWZpbmVkLCB7c3RydWN0LCB7J3RocmlmdF90ZXN0X3R5cGVzJywgJ1h0cnVjdCd9fSwgc3RydWN0X3RoaW5nLCAjJ1h0cnVjdCd7fX0KLSAgICAgIF19LAotICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCdYY2VwdGlvbjInKQotICAgICl9LAotICAgIHsiRW1wdHlTdHJ1Y3QgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbXX0sCi0gICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ0VtcHR5U3RydWN0JykKLSAgICApfSwKLSAgICB7Ik9uZUZpZWxkIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwgdW5kZWZpbmVkLCB7c3RydWN0LCB7J3RocmlmdF90ZXN0X3R5cGVzJywgJ0VtcHR5U3RydWN0J319LCBmaWVsZCwgIydFbXB0eVN0cnVjdCd7fX0KLSAgICAgIF19LAotICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCdPbmVGaWVsZCcpCi0gICAgKX0sCi0gICAgeyJWZXJzaW9uaW5nVGVzdFYxIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwgdW5kZWZpbmVkLCBpMzIsIGJlZ2luX2luX2JvdGgsIHVuZGVmaW5lZH0sCi0gICAgICAgIHszLCB1bmRlZmluZWQsIHN0cmluZywgb2xkX3N0cmluZywgdW5kZWZpbmVkfSwKLSAgICAgICAgezEyLCB1bmRlZmluZWQsIGkzMiwgZW5kX2luX2JvdGgsIHVuZGVmaW5lZH0KLSAgICAgIF19LAotICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCdWZXJzaW9uaW5nVGVzdFYxJykKLSAgICApfSwKLSAgICB7IlZlcnNpb25pbmdUZXN0VjIgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbCi0gICAgICAgIHsxLCB1bmRlZmluZWQsIGkzMiwgYmVnaW5faW5fYm90aCwgdW5kZWZpbmVkfSwKLSAgICAgICAgezIsIHVuZGVmaW5lZCwgaTMyLCBuZXdpbnQsIHVuZGVmaW5lZH0sCi0gICAgICAgIHszLCB1bmRlZmluZWQsIGJ5dGUsIG5ld2J5dGUsIHVuZGVmaW5lZH0sCi0gICAgICAgIHs0LCB1bmRlZmluZWQsIGkxNiwgbmV3c2hvcnQsIHVuZGVmaW5lZH0sCi0gICAgICAgIHs1LCB1bmRlZmluZWQsIGk2NCwgbmV3bG9uZywgdW5kZWZpbmVkfSwKLSAgICAgICAgezYsIHVuZGVmaW5lZCwgZG91YmxlLCBuZXdkb3VibGUsIHVuZGVmaW5lZH0sCi0gICAgICAgIHs3LCB1bmRlZmluZWQsIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ0JvbmsnfX0sIG5ld3N0cnVjdCwgIydCb25rJ3t9fSwKLSAgICAgICAgezgsIHVuZGVmaW5lZCwge2xpc3QsIGkzMn0sIG5ld2xpc3QsIFtdfSwKLSAgICAgICAgezksIHVuZGVmaW5lZCwge3NldCwgaTMyfSwgbmV3c2V0LCBzZXRzOm5ldygpfSwKLSAgICAgICAgezEwLCB1bmRlZmluZWQsIHttYXAsIGkzMiwgaTMyfSwgbmV3bWFwLCBkaWN0Om5ldygpfSwKLSAgICAgICAgezExLCB1bmRlZmluZWQsIHN0cmluZywgbmV3c3RyaW5nLCB1bmRlZmluZWR9LAotICAgICAgICB7MTIsIHVuZGVmaW5lZCwgaTMyLCBlbmRfaW5fYm90aCwgdW5kZWZpbmVkfQotICAgICAgXX0sCi0gICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ1ZlcnNpb25pbmdUZXN0VjInKQotICAgICl9LAotICAgIHsiTGlzdFR5cGVWZXJzaW9uaW5nVjEgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbCi0gICAgICAgIHsxLCB1bmRlZmluZWQsIHtsaXN0LCBpMzJ9LCBteWludHMsIFtdfSwKLSAgICAgICAgezIsIHVuZGVmaW5lZCwgc3RyaW5nLCBoZWxsbywgdW5kZWZpbmVkfQotICAgICAgXX0sCi0gICAgICB0aHJpZnRfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ0xpc3RUeXBlVmVyc2lvbmluZ1YxJykKLSAgICApfSwKLSAgICB7Ikxpc3RUeXBlVmVyc2lvbmluZ1YyIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwgdW5kZWZpbmVkLCB7bGlzdCwgc3RyaW5nfSwgc3RyaW5ncywgW119LAotICAgICAgICB7MiwgdW5kZWZpbmVkLCBzdHJpbmcsIGhlbGxvLCB1bmRlZmluZWR9Ci0gICAgICBdfSwKLSAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgnTGlzdFR5cGVWZXJzaW9uaW5nVjInKQotICAgICl9LAotICAgIHsiR3Vlc3NQcm90b2NvbFN0cnVjdCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFsKLSAgICAgICAgezcsIHVuZGVmaW5lZCwge21hcCwgc3RyaW5nLCBzdHJpbmd9LCBtYXBfZmllbGQsIGRpY3Q6bmV3KCl9Ci0gICAgICBdfSwKLSAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgnR3Vlc3NQcm90b2NvbFN0cnVjdCcpCi0gICAgKX0sCi0gICAgeyJMYXJnZURlbHRhcyBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFsKLSAgICAgICAgezEsIHVuZGVmaW5lZCwge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAnQm9vbHMnfX0sIGIxLCAjJ0Jvb2xzJ3t9fSwKLSAgICAgICAgezEwLCB1bmRlZmluZWQsIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ0Jvb2xzJ319LCBiMTAsICMnQm9vbHMne319LAotICAgICAgICB7MTAwLCB1bmRlZmluZWQsIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ0Jvb2xzJ319LCBiMTAwLCAjJ0Jvb2xzJ3t9fSwKLSAgICAgICAgezUwMCwgdW5kZWZpbmVkLCBib29sLCBjaGVja190cnVlLCB1bmRlZmluZWR9LAotICAgICAgICB7MTAwMCwgdW5kZWZpbmVkLCB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICdCb29scyd9fSwgYjEwMDAsICMnQm9vbHMne319LAotICAgICAgICB7MTUwMCwgdW5kZWZpbmVkLCBib29sLCBjaGVja19mYWxzZSwgdW5kZWZpbmVkfSwKLSAgICAgICAgezIwMDAsIHVuZGVmaW5lZCwge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAnVmVyc2lvbmluZ1Rlc3RWMid9fSwgdmVydHdvMjAwMCwgIydWZXJzaW9uaW5nVGVzdFYyJ3t9fSwKLSAgICAgICAgezI1MDAsIHVuZGVmaW5lZCwge3NldCwgc3RyaW5nfSwgYV9zZXQyNTAwLCBzZXRzOm5ldygpfSwKLSAgICAgICAgezMwMDAsIHVuZGVmaW5lZCwge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAnVmVyc2lvbmluZ1Rlc3RWMid9fSwgdmVydHdvMzAwMCwgIydWZXJzaW9uaW5nVGVzdFYyJ3t9fSwKLSAgICAgICAgezQwMDAsIHVuZGVmaW5lZCwge2xpc3QsIGkzMn0sIGJpZ19udW1iZXJzLCBbXX0KLSAgICAgIF19LAotICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCdMYXJnZURlbHRhcycpCi0gICAgKX0sCi0gICAgeyJOZXN0ZWRMaXN0c0kzMngyIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwgdW5kZWZpbmVkLCB7bGlzdCwge2xpc3QsIGkzMn19LCBpbnRlZ2VybGlzdCwgW119Ci0gICAgICBdfSwKLSAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgnTmVzdGVkTGlzdHNJMzJ4MicpCi0gICAgKX0sCi0gICAgeyJOZXN0ZWRMaXN0c0kzMngzIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwgdW5kZWZpbmVkLCB7bGlzdCwge2xpc3QsIHtsaXN0LCBpMzJ9fX0sIGludGVnZXJsaXN0LCBbXX0KLSAgICAgIF19LAotICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCdOZXN0ZWRMaXN0c0kzMngzJykKLSAgICApfSwKLSAgICB7Ik5lc3RlZE1peGVkeDIgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbCi0gICAgICAgIHsxLCB1bmRlZmluZWQsIHtsaXN0LCB7c2V0LCBpMzJ9fSwgaW50X3NldF9saXN0LCBbXX0sCi0gICAgICAgIHsyLCB1bmRlZmluZWQsIHttYXAsIGkzMiwge3NldCwgc3RyaW5nfX0sIG1hcF9pbnRfc3Ryc2V0LCBkaWN0Om5ldygpfSwKLSAgICAgICAgezMsIHVuZGVmaW5lZCwge2xpc3QsIHttYXAsIGkzMiwge3NldCwgc3RyaW5nfX19LCBtYXBfaW50X3N0cnNldF9saXN0LCBbXX0KLSAgICAgIF19LAotICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCdOZXN0ZWRNaXhlZHgyJykKLSAgICApfSwKLSAgICB7Ikxpc3RCb25rcyBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFsKLSAgICAgICAgezEsIHVuZGVmaW5lZCwge2xpc3QsIHtzdHJ1Y3QsIHt0aHJpZnRfdGVzdF90eXBlcywgJ0JvbmsnfX19LCBib25rLCBbXX0KLSAgICAgIF19LAotICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCdMaXN0Qm9ua3MnKQotICAgICl9LAotICAgIHsiTmVzdGVkTGlzdHNCb25rIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwgdW5kZWZpbmVkLCB7bGlzdCwge2xpc3QsIHtsaXN0LCB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICdCb25rJ319fX19LCBib25rLCBbXX0KLSAgICAgIF19LAotICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCdOZXN0ZWRMaXN0c0JvbmsnKQotICAgICl9LAotICAgIHsiQm9vbFRlc3QgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbCi0gICAgICAgIHsxLCBvcHRpb25hbCwgYm9vbCwgYiwgdHJ1ZX0sCi0gICAgICAgIHsyLCBvcHRpb25hbCwgc3RyaW5nLCBzLCAidHJ1ZSJ9Ci0gICAgICBdfSwKLSAgICAgIHRocmlmdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgnQm9vbFRlc3QnKQotICAgICl9LAotICAgIHsiU3RydWN0QSBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFt7MSwgcmVxdWlyZWQsIHN0cmluZywgcywgdW5kZWZpbmVkfV19LAotICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCdTdHJ1Y3RBJykKLSAgICApfSwKLSAgICB7IlN0cnVjdEIgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbCi0gICAgICAgIHsxLCBvcHRpb25hbCwge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAnU3RydWN0QSd9fSwgYWEsICMnU3RydWN0QSd7fX0sCi0gICAgICAgIHsyLCByZXF1aXJlZCwge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAnU3RydWN0QSd9fSwgYWIsICMnU3RydWN0QSd7fX0KLSAgICAgIF19LAotICAgICAgdGhyaWZ0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KCdTdHJ1Y3RCJykKLSAgICApfQotICBdLgotCi1zZXJ2aWNlX2luZm9fdGVzdF8oKSAtPgotICBbCi0gICAgeyJ0ZXN0Vm9pZCBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgW119LAotICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdFZvaWQsIHBhcmFtc190eXBlKQotICAgICl9LAotICAgIHsidGVzdFZvaWQgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgW119LAotICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdFZvaWQsIHJlcGx5X3R5cGUpCi0gICAgKX0sCi0gICAgeyJ0ZXN0Vm9pZCBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFtdfSwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RWb2lkLCBleGNlcHRpb25zKQotICAgICl9LAotICAgIHsidGVzdFN0cmluZyBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgW3sxLCBzdHJpbmd9XX0sCi0gICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0U3RyaW5nLCBwYXJhbXNfdHlwZSkKLSAgICApfSwKLSAgICB7InRlc3RTdHJpbmcgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAotICAgICAgc3RyaW5nLAotICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdFN0cmluZywgcmVwbHlfdHlwZSkKLSAgICApfSwKLSAgICB7InRlc3RTdHJpbmcgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbXX0sCi0gICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0U3RyaW5nLCBleGNlcHRpb25zKQotICAgICl9LAotICAgIHsidGVzdEJ5dGUgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFt7MSwgYnl0ZX1dfSwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RCeXRlLCBwYXJhbXNfdHlwZSkKLSAgICApfSwKLSAgICB7InRlc3RCeXRlIHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIGJ5dGUsCi0gICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0Qnl0ZSwgcmVwbHlfdHlwZSkKLSAgICApfSwKLSAgICB7InRlc3RCeXRlIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgW119LAotICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdEJ5dGUsIGV4Y2VwdGlvbnMpCi0gICAgKX0sCi0gICAgeyJ0ZXN0STMyIHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbezEsIGkzMn1dfSwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RJMzIsIHBhcmFtc190eXBlKQotICAgICl9LAotICAgIHsidGVzdEkzMiByZXBseSIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICBpMzIsCi0gICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0STMyLCByZXBseV90eXBlKQotICAgICl9LAotICAgIHsidGVzdEkzMiBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFtdfSwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RJMzIsIGV4Y2VwdGlvbnMpCi0gICAgKX0sCi0gICAgeyJ0ZXN0STY0IHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbezEsIGk2NH1dfSwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RJNjQsIHBhcmFtc190eXBlKQotICAgICl9LAotICAgIHsidGVzdEk2NCByZXBseSIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICBpNjQsCi0gICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0STY0LCByZXBseV90eXBlKQotICAgICl9LAotICAgIHsidGVzdEk2NCBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFtdfSwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RJNjQsIGV4Y2VwdGlvbnMpCi0gICAgKX0sCi0gICAgeyJ0ZXN0RG91YmxlIHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbezEsIGRvdWJsZX1dfSwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3REb3VibGUsIHBhcmFtc190eXBlKQotICAgICl9LAotICAgIHsidGVzdERvdWJsZSByZXBseSIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICBkb3VibGUsCi0gICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0RG91YmxlLCByZXBseV90eXBlKQotICAgICl9LAotICAgIHsidGVzdERvdWJsZSBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFtdfSwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3REb3VibGUsIGV4Y2VwdGlvbnMpCi0gICAgKX0sCi0gICAgeyJ0ZXN0U3RydWN0IHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbCi0gICAgICAgIHsxLCB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICdYdHJ1Y3QnfX19Ci0gICAgICBdfSwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RTdHJ1Y3QsIHBhcmFtc190eXBlKQotICAgICl9LAotICAgIHsidGVzdFN0cnVjdCByZXBseSIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICdYdHJ1Y3QnfX0sCi0gICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0U3RydWN0LCByZXBseV90eXBlKQotICAgICl9LAotICAgIHsidGVzdFN0cnVjdCBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFtdfSwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RTdHJ1Y3QsIGV4Y2VwdGlvbnMpCi0gICAgKX0sCi0gICAgeyJ0ZXN0TmVzdCBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgWwotICAgICAgICB7MSwge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAnWHRydWN0Mid9fX0KLSAgICAgIF19LAotICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdE5lc3QsIHBhcmFtc190eXBlKQotICAgICl9LAotICAgIHsidGVzdE5lc3QgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAnWHRydWN0Mid9fSwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3ROZXN0LCByZXBseV90eXBlKQotICAgICl9LAotICAgIHsidGVzdE5lc3QgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbXX0sCi0gICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0TmVzdCwgZXhjZXB0aW9ucykKLSAgICApfSwKLSAgICB7InRlc3RNYXAgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFsKLSAgICAgICAgezEsIHttYXAsIGkzMiwgaTMyfX0KLSAgICAgIF19LAotICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdE1hcCwgcGFyYW1zX3R5cGUpCi0gICAgKX0sCi0gICAgeyJ0ZXN0TWFwIHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHttYXAsIGkzMiwgaTMyfSwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RNYXAsIHJlcGx5X3R5cGUpCi0gICAgKX0sCi0gICAgeyJ0ZXN0TWFwIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgW119LAotICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdE1hcCwgZXhjZXB0aW9ucykKLSAgICApfSwKLSAgICB7InRlc3RTdHJpbmdNYXAgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFsKLSAgICAgICAgezEsIHttYXAsIHN0cmluZywgc3RyaW5nfX0KLSAgICAgIF19LAotICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdFN0cmluZ01hcCwgcGFyYW1zX3R5cGUpCi0gICAgKX0sCi0gICAgeyJ0ZXN0U3RyaW5nTWFwIHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHttYXAsIHN0cmluZywgc3RyaW5nfSwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RTdHJpbmdNYXAsIHJlcGx5X3R5cGUpCi0gICAgKX0sCi0gICAgeyJ0ZXN0U3RyaW5nTWFwIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgW119LAotICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdFN0cmluZ01hcCwgZXhjZXB0aW9ucykKLSAgICApfSwKLSAgICB7InRlc3RTZXQgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFsKLSAgICAgICAgezEsIHtzZXQsIGkzMn19Ci0gICAgICBdfSwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RTZXQsIHBhcmFtc190eXBlKQotICAgICl9LAotICAgIHsidGVzdFNldCByZXBseSIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c2V0LCBpMzJ9LAotICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdFNldCwgcmVwbHlfdHlwZSkKLSAgICApfSwKLSAgICB7InRlc3RTZXQgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbXX0sCi0gICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0U2V0LCBleGNlcHRpb25zKQotICAgICl9LAotICAgIHsidGVzdExpc3QgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFsKLSAgICAgICAgezEsIHtsaXN0LCBpMzJ9fQotICAgICAgXX0sCi0gICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0TGlzdCwgcGFyYW1zX3R5cGUpCi0gICAgKX0sCi0gICAgeyJ0ZXN0TGlzdCByZXBseSIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7bGlzdCwgaTMyfSwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RMaXN0LCByZXBseV90eXBlKQotICAgICl9LAotICAgIHsidGVzdExpc3QgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbXX0sCi0gICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0TGlzdCwgZXhjZXB0aW9ucykKLSAgICApfSwKLSAgICB7InRlc3RFbnVtIHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbCi0gICAgICAgIHsxLCBpMzJ9Ci0gICAgICBdfSwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RFbnVtLCBwYXJhbXNfdHlwZSkKLSAgICApfSwKLSAgICB7InRlc3RFbnVtIHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIGkzMiwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RFbnVtLCByZXBseV90eXBlKQotICAgICl9LAotICAgIHsidGVzdEVudW0gZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbXX0sCi0gICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0RW51bSwgZXhjZXB0aW9ucykKLSAgICApfSwKLSAgICB7InRlc3RUeXBlZGVmIHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbezEsIGk2NH1dfSwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RUeXBlZGVmLCBwYXJhbXNfdHlwZSkKLSAgICApfSwKLSAgICB7InRlc3RUeXBlZGVmIHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIGk2NCwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RUeXBlZGVmLCByZXBseV90eXBlKQotICAgICl9LAotICAgIHsidGVzdFR5cGVkZWYgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbXX0sCi0gICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0VHlwZWRlZiwgZXhjZXB0aW9ucykKLSAgICApfSwKLSAgICB7InRlc3RNYXBNYXAgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFsKLSAgICAgICAgezEsIGkzMn0KLSAgICAgIF19LAotICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdE1hcE1hcCwgcGFyYW1zX3R5cGUpCi0gICAgKX0sCi0gICAgeyJ0ZXN0TWFwTWFwIHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHttYXAsIGkzMiwge21hcCwgaTMyLGkzMn19LAotICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdE1hcE1hcCwgcmVwbHlfdHlwZSkKLSAgICApfSwKLSAgICB7InRlc3RNYXBNYXAgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbXX0sCi0gICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0TWFwTWFwLCBleGNlcHRpb25zKQotICAgICl9LAotICAgIHsidGVzdEluc2FuaXR5IHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbCi0gICAgICAgIHsxLCB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICdJbnNhbml0eSd9fX0KLSAgICAgIF19LAotICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdEluc2FuaXR5LCBwYXJhbXNfdHlwZSkKLSAgICApfSwKLSAgICB7InRlc3RJbnNhbml0eSByZXBseSIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7bWFwLCBpNjQsIHttYXAsIGkzMiwge3N0cnVjdCwgeyd0aHJpZnRfdGVzdF90eXBlcycsICdJbnNhbml0eSd9fX19LAotICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdEluc2FuaXR5LCByZXBseV90eXBlKQotICAgICl9LAotICAgIHsidGVzdEluc2FuaXR5IGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgW119LAotICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdEluc2FuaXR5LCBleGNlcHRpb25zKQotICAgICl9LAotICAgIHsidGVzdE11bHRpIHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbCi0gICAgICAgIHsxLCBieXRlfSwKLSAgICAgICAgezIsIGkzMn0sCi0gICAgICAgIHszLCBpNjR9LAotICAgICAgICB7NCwge21hcCwgaTE2LCBzdHJpbmd9fSwKLSAgICAgICAgezUsIGkzMn0sCi0gICAgICAgIHs2LCBpNjR9Ci0gICAgICBdfSwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RNdWx0aSwgcGFyYW1zX3R5cGUpCi0gICAgKX0sCi0gICAgeyJ0ZXN0TXVsdGkgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwge3RocmlmdF90ZXN0X3R5cGVzLCAnWHRydWN0J319LAotICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdE11bHRpLCByZXBseV90eXBlKQotICAgICl9LAotICAgIHsidGVzdE11bHRpIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgW119LAotICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdE11bHRpLCBleGNlcHRpb25zKQotICAgICl9LAotICAgIHsidGVzdEV4Y2VwdGlvbiBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgW3sxLCBzdHJpbmd9XX0sCi0gICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0RXhjZXB0aW9uLCBwYXJhbXNfdHlwZSkKLSAgICApfSwKLSAgICB7InRlc3RFeGNlcHRpb24gcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgW119LAotICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdEV4Y2VwdGlvbiwgcmVwbHlfdHlwZSkKLSAgICApfSwKLSAgICB7InRlc3RFeGNlcHRpb24gZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbCi0gICAgICAgIHsxLCB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICdYY2VwdGlvbid9fX0KLSAgICAgIF19LAotICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdEV4Y2VwdGlvbiwgZXhjZXB0aW9ucykKLSAgICApfSwKLSAgICB7InRlc3RNdWx0aUV4Y2VwdGlvbiBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgW3sxLCBzdHJpbmd9LCB7Miwgc3RyaW5nfV19LAotICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdE11bHRpRXhjZXB0aW9uLCBwYXJhbXNfdHlwZSkKLSAgICApfSwKLSAgICB7InRlc3RNdWx0aUV4Y2VwdGlvbiByZXBseSIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICdYdHJ1Y3QnfX0sCi0gICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0TXVsdGlFeGNlcHRpb24sIHJlcGx5X3R5cGUpCi0gICAgKX0sCi0gICAgeyJ0ZXN0TXVsdGlFeGNlcHRpb24gZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbCi0gICAgICAgIHsxLCB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICdYY2VwdGlvbid9fX0sCi0gICAgICAgIHsyLCB7c3RydWN0LCB7dGhyaWZ0X3Rlc3RfdHlwZXMsICdYY2VwdGlvbjInfX19Ci0gICAgICBdfSwKLSAgICAgIHRocmlmdF90ZXN0X3RocmlmdDpmdW5jdGlvbl9pbmZvKHRlc3RNdWx0aUV4Y2VwdGlvbiwgZXhjZXB0aW9ucykKLSAgICApfSwKLSAgICB7InRlc3RPbmV3YXkgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFt7MSwgaTMyfV19LAotICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdE9uZXdheSwgcGFyYW1zX3R5cGUpCi0gICAgKX0sCi0gICAgeyJ0ZXN0T25ld2F5IHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIG9uZXdheV92b2lkLAotICAgICAgdGhyaWZ0X3Rlc3RfdGhyaWZ0OmZ1bmN0aW9uX2luZm8odGVzdE9uZXdheSwgcmVwbHlfdHlwZSkKLSAgICApfSwKLSAgICB7InRlc3RPbmV3YXkgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbXX0sCi0gICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0T25ld2F5LCBleGNlcHRpb25zKQotICAgICl9LAotICAgIHsiYmxhaEJsYWggcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFtdfSwKLSAgICAgIHNlY29uZF9zZXJ2aWNlX3RocmlmdDpmdW5jdGlvbl9pbmZvKGJsYWhCbGFoLCBwYXJhbXNfdHlwZSkKLSAgICApfSwKLSAgICB7ImJsYWhCbGFoIHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFtdfSwKLSAgICAgIHNlY29uZF9zZXJ2aWNlX3RocmlmdDpmdW5jdGlvbl9pbmZvKGJsYWhCbGFoLCByZXBseV90eXBlKQotICAgICl9LAotICAgIHsiYmxhaEJsYWggZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbXX0sCi0gICAgICBzZWNvbmRfc2VydmljZV90aHJpZnQ6ZnVuY3Rpb25faW5mbyhibGFoQmxhaCwgZXhjZXB0aW9ucykKLSAgICApfSwKLSAgICB7InNlY29uZHRlc3RTdHJpbmcgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFt7MSwgc3RyaW5nfV19LAotICAgICAgc2Vjb25kX3NlcnZpY2VfdGhyaWZ0OmZ1bmN0aW9uX2luZm8oc2Vjb25kdGVzdFN0cmluZywgcGFyYW1zX3R5cGUpCi0gICAgKX0sCi0gICAgeyJzZWNvbmR0ZXN0U3RyaW5nIHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHN0cmluZywKLSAgICAgIHNlY29uZF9zZXJ2aWNlX3RocmlmdDpmdW5jdGlvbl9pbmZvKHNlY29uZHRlc3RTdHJpbmcsIHJlcGx5X3R5cGUpCi0gICAgKX0sCi0gICAgeyJzZWNvbmR0ZXN0U3RyaW5nIGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAotICAgICAge3N0cnVjdCwgW119LAotICAgICAgc2Vjb25kX3NlcnZpY2VfdGhyaWZ0OmZ1bmN0aW9uX2luZm8oc2Vjb25kdGVzdFN0cmluZywgZXhjZXB0aW9ucykKLSAgICApfQotICBdLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvZmVhdHVyZXMvTWFrZWZpbGUuYW0gYi90ZXN0L2ZlYXR1cmVzL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzN2Q3ODkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2ZlYXR1cmVzL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMzAgQEAKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworRVhUUkFfRElTVCA9IFwKKwlsb2NhbF90aHJpZnQgXAorCWluZGV4Lmh0bWwgXAorCWNvbnRhaW5lcl9saW1pdC5weSBcCisJaW5kZXguaHRtbCBcCisJa25vd25fZmFpbHVyZXNfTGludXguanNvbiBcCisJTWFrZWZpbGUuYW0gXAorICAgICAgICBub3NzbHYzLnNoIFwKKwlzdHJpbmdfbGltaXQucHkgXAorCXRlc3RzLmpzb24gXAorCXRoZWFkZXJfYmluYXJ5LnB5IFwKKwlzZXR1cC5jZmcgXAorICAgICAgICB0bHMuc2ggXAorCXV0aWwucHkKZGlmZiAtLWdpdCBhL3Rlc3QvZmVhdHVyZXMvY29udGFpbmVyX2xpbWl0LnB5IGIvdGVzdC9mZWF0dXJlcy9jb250YWluZXJfbGltaXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhmODQ4NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZmVhdHVyZXMvY29udGFpbmVyX2xpbWl0LnB5CkBAIC0wLDAgKzEsNzIgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorCitpbXBvcnQgYXJncGFyc2UKK2ltcG9ydCBzeXMKKworZnJvbSB1dGlsIGltcG9ydCBhZGRfY29tbW9uX2FyZ3MsIGluaXRfcHJvdG9jb2wKK2Zyb20gbG9jYWxfdGhyaWZ0IGltcG9ydCB0aHJpZnQgICMgbm9xYQorZnJvbSB0aHJpZnQuVGhyaWZ0IGltcG9ydCBUTWVzc2FnZVR5cGUsIFRUeXBlCisKKworIyBUT0RPOiBnZW5lcmF0ZSBmcm9tIFRocmlmdFRlc3QudGhyaWZ0CitkZWYgdGVzdF9saXN0KHByb3RvLCB2YWx1ZSk6CisgICAgbWV0aG9kX25hbWUgPSAndGVzdExpc3QnCisgICAgdHR5cGUgPSBUVHlwZS5MSVNUCisgICAgZXR5cGUgPSBUVHlwZS5JMzIKKyAgICBwcm90by53cml0ZU1lc3NhZ2VCZWdpbihtZXRob2RfbmFtZSwgVE1lc3NhZ2VUeXBlLkNBTEwsIDMpCisgICAgcHJvdG8ud3JpdGVTdHJ1Y3RCZWdpbihtZXRob2RfbmFtZSArICdfYXJncycpCisgICAgcHJvdG8ud3JpdGVGaWVsZEJlZ2luKCd0aGluZycsIHR0eXBlLCAxKQorICAgIHByb3RvLndyaXRlTGlzdEJlZ2luKGV0eXBlLCBsZW4odmFsdWUpKQorICAgIGZvciBlIGluIHZhbHVlOgorICAgICAgICBwcm90by53cml0ZUkzMihlKQorICAgIHByb3RvLndyaXRlTGlzdEVuZCgpCisgICAgcHJvdG8ud3JpdGVGaWVsZEVuZCgpCisgICAgcHJvdG8ud3JpdGVGaWVsZFN0b3AoKQorICAgIHByb3RvLndyaXRlU3RydWN0RW5kKCkKKyAgICBwcm90by53cml0ZU1lc3NhZ2VFbmQoKQorICAgIHByb3RvLnRyYW5zLmZsdXNoKCkKKworICAgIF8sIG10eXBlLCBfID0gcHJvdG8ucmVhZE1lc3NhZ2VCZWdpbigpCisgICAgYXNzZXJ0IG10eXBlID09IFRNZXNzYWdlVHlwZS5SRVBMWQorICAgIHByb3RvLnJlYWRTdHJ1Y3RCZWdpbigpCisgICAgXywgZnR5cGUsIGZpZCA9IHByb3RvLnJlYWRGaWVsZEJlZ2luKCkKKyAgICBhc3NlcnQgZmlkID09IDAKKyAgICBhc3NlcnQgZnR5cGUgPT0gdHR5cGUKKyAgICBldHlwZTIsIGxlbjIgPSBwcm90by5yZWFkTGlzdEJlZ2luKCkKKyAgICBhc3NlcnQgZXR5cGUgPT0gZXR5cGUyCisgICAgYXNzZXJ0IGxlbjIgPT0gbGVuKHZhbHVlKQorICAgIGZvciBpIGluIHJhbmdlKGxlbjIpOgorICAgICAgICB2ID0gcHJvdG8ucmVhZEkzMigpCisgICAgICAgIGFzc2VydCB2ID09IHZhbHVlW2ldCisgICAgcHJvdG8ucmVhZExpc3RFbmQoKQorICAgIHByb3RvLnJlYWRGaWVsZEVuZCgpCisgICAgXywgZnR5cGUsIF8gPSBwcm90by5yZWFkRmllbGRCZWdpbigpCisgICAgYXNzZXJ0IGZ0eXBlID09IFRUeXBlLlNUT1AKKyAgICBwcm90by5yZWFkU3RydWN0RW5kKCkKKyAgICBwcm90by5yZWFkTWVzc2FnZUVuZCgpCisKKworZGVmIG1haW4oYXJndik6CisgICAgcCA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKyAgICBhZGRfY29tbW9uX2FyZ3MocCkKKyAgICBwLmFkZF9hcmd1bWVudCgnLS1saW1pdCcsIHR5cGU9aW50KQorICAgIGFyZ3MgPSBwLnBhcnNlX2FyZ3MoKQorICAgIHByb3RvID0gaW5pdF9wcm90b2NvbChhcmdzKQorICAgICMgVE9ETzogdGVzdCBzZXQgYW5kIG1hcAorICAgIHRlc3RfbGlzdChwcm90bywgbGlzdChyYW5nZShhcmdzLmxpbWl0IC0gMSkpKQorICAgIHRlc3RfbGlzdChwcm90bywgbGlzdChyYW5nZShhcmdzLmxpbWl0IC0gMSkpKQorICAgIHByaW50KCdbT0tdOiBsaW1pdCAtIDEnKQorICAgIHRlc3RfbGlzdChwcm90bywgbGlzdChyYW5nZShhcmdzLmxpbWl0KSkpCisgICAgdGVzdF9saXN0KHByb3RvLCBsaXN0KHJhbmdlKGFyZ3MubGltaXQpKSkKKyAgICBwcmludCgnW09LXToganVzdCBsaW1pdCcpCisgICAgdHJ5OgorICAgICAgICB0ZXN0X2xpc3QocHJvdG8sIGxpc3QocmFuZ2UoYXJncy5saW1pdCArIDEpKSkKKyAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICBwcmludCgnW09LXTogbGltaXQgKyAxJykKKyAgICBlbHNlOgorICAgICAgICBwcmludCgnW0VSUk9SXTogbGltaXQgKyAxJykKKyAgICAgICAgYXNzZXJ0IEZhbHNlCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBzeXMuZXhpdChtYWluKHN5cy5hcmd2WzE6XSkpCmRpZmYgLS1naXQgYS90ZXN0L2ZlYXR1cmVzL2luZGV4Lmh0bWwgYi90ZXN0L2ZlYXR1cmVzL2luZGV4Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRhMDAxMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZmVhdHVyZXMvaW5kZXguaHRtbApAQCAtMCwwICsxLDUxIEBACis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KKzwhRE9DVFlQRSBIVE1MPgorPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KKzx0aXRsZT5BcGFjaGUgVGhyaWZ0IC0gaW50ZWdyYXRpb24gdGVzdCBzdWl0ZTwvdGl0bGU+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJodHRwOi8vY2RuLmRhdGF0YWJsZXMubmV0LzEuMTAuNC9jc3MvanF1ZXJ5LmRhdGFUYWJsZXMuY3NzIj4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCIgc3JjPSJodHRwOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0yLjEuMy5taW4uanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04IiBzcmM9Imh0dHA6Ly9jZG4uZGF0YXRhYmxlcy5uZXQvMS4xMC40L2pzL2pxdWVyeS5kYXRhVGFibGVzLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSIuLi9yZXN1bHQuanMiPgorPC9zY3JpcHQ+Cis8L2hlYWQ+Cis8Ym9keT4KKzxoMj5BcGFjaGUgVGhyaWZ0IC0gaW50ZWdyYXRpb24gdGVzdCBzdWl0ZTogUmVzdWx0czwvaDI+Cis8dGFibGUgaWQ9InRlc3RfcmVzdWx0cyIgY2xhc3M9ImRpc3BsYXkiPgorICAgIDx0aGVhZD4KKyAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlNlcnZlcjwvdGg+CisgICAgICAgICAgICA8dGg+Q2xpZW50PC90aD4KKyAgICAgICAgICAgIDx0aD5Qcm90b2NvbDwvdGg+CisgICAgICAgICAgICA8dGg+VHJhbnNwb3J0PC90aD4KKyAgICAgICAgICAgIDx0aD5SZXN1bHQgKGxvZyk8L3RoPgorICAgICAgICAgICAgPHRoPkV4cGVjdGVkPC90aD4KKyAgICAgICAgPC90cj4KKyAgICA8L3RoZWFkPgorPC90YWJsZT4KKzxoMj5UZXN0IEluZm9ybWF0aW9uPC9oMj4KKzxwcmUgaWQ9InRlc3RfaW5mbyI+PC9wcmU+CisKKzxhIGhyZWY9ImxvZyI+YnJvd3NlIHJhdyBsb2cgZmlsZXM8L2E+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rlc3QvZmVhdHVyZXMva25vd25fZmFpbHVyZXNfTGludXguanNvbiBiL3Rlc3QvZmVhdHVyZXMva25vd25fZmFpbHVyZXNfTGludXguanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mzc2OTY4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9mZWF0dXJlcy9rbm93bl9mYWlsdXJlc19MaW51eC5qc29uCkBAIC0wLDAgKzEsNTAgQEAKK1sKKyAgICAiY19nbGliLWxpbWl0X2NvbnRhaW5lcl9sZW5ndGhfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgICAiY19nbGliLWxpbWl0X3N0cmluZ19sZW5ndGhfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgICAiY2wtbGltaXRfc3RyaW5nX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJjbC1saW1pdF9jb250YWluZXJfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgImNwcC10aGVhZGVyX2ZyYW1lZF9iaW5hcnlfbXVsdGloLWhlYWRlcl9idWZmZXJlZC1pcCIsCisgICAgImNwcC10aGVhZGVyX2ZyYW1lZF9jb21wYWN0X211bHRpaC1oZWFkZXJfYnVmZmVyZWQtaXAiLAorICAgICJjcHAtdGhlYWRlcl91bmZyYW1lZF9iaW5hcnlfbXVsdGloLWhlYWRlcl9idWZmZXJlZC1pcCIsCisgICAgImNwcC10aGVhZGVyX3VuZnJhbWVkX2NvbXBhY3RfbXVsdGloLWhlYWRlcl9idWZmZXJlZC1pcCIsCisgICAgImNzaGFycC1saW1pdF9jb250YWluZXJfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgImNzaGFycC1saW1pdF9jb250YWluZXJfbGVuZ3RoX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAgICJjc2hhcnAtbGltaXRfc3RyaW5nX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJjc2hhcnAtbGltaXRfc3RyaW5nX2xlbmd0aF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgICAiZC1saW1pdF9jb250YWluZXJfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgImQtbGltaXRfY29udGFpbmVyX2xlbmd0aF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgICAiZC1saW1pdF9zdHJpbmdfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgImQtbGltaXRfc3RyaW5nX2xlbmd0aF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgICAiZXJsLWxpbWl0X2NvbnRhaW5lcl9sZW5ndGhfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgICAiZXJsLWxpbWl0X2NvbnRhaW5lcl9sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgImVybC1saW1pdF9zdHJpbmdfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgImVybC1saW1pdF9zdHJpbmdfbGVuZ3RoX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAgICJnby1saW1pdF9jb250YWluZXJfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgImdvLWxpbWl0X2NvbnRhaW5lcl9sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgImdvLWxpbWl0X3N0cmluZ19sZW5ndGhfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgICAiZ28tbGltaXRfc3RyaW5nX2xlbmd0aF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgICAiaHMtbGltaXRfY29udGFpbmVyX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJocy1saW1pdF9jb250YWluZXJfbGVuZ3RoX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAgICJocy1saW1pdF9zdHJpbmdfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgImhzLWxpbWl0X3N0cmluZ19sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgIm5vZGVqcy1saW1pdF9jb250YWluZXJfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgIm5vZGVqcy1saW1pdF9jb250YWluZXJfbGVuZ3RoX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAgICJub2RlanMtbGltaXRfc3RyaW5nX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJub2RlanMtbGltaXRfc3RyaW5nX2xlbmd0aF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgICAicGVybC1saW1pdF9jb250YWluZXJfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgInBlcmwtbGltaXRfc3RyaW5nX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJyYi1saW1pdF9jb250YWluZXJfbGVuZ3RoX2FjY2VsLWJpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgInJiLWxpbWl0X2NvbnRhaW5lcl9sZW5ndGhfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgICAicmItbGltaXRfY29udGFpbmVyX2xlbmd0aF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgICAicmItbGltaXRfc3RyaW5nX2xlbmd0aF9hY2NlbC1iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJyYi1saW1pdF9zdHJpbmdfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgInJiLWxpbWl0X3N0cmluZ19sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgInJzLWxpbWl0X2NvbnRhaW5lcl9sZW5ndGhfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgICAicnMtbGltaXRfY29udGFpbmVyX2xlbmd0aF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgICAicnMtbGltaXRfY29udGFpbmVyX2xlbmd0aF9tdWx0aWMtY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgInJzLWxpbWl0X3N0cmluZ19sZW5ndGhfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgICAicnMtbGltaXRfc3RyaW5nX2xlbmd0aF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgICAicnMtbGltaXRfc3RyaW5nX2xlbmd0aF9tdWx0aWMtY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgIm5ldGNvcmUtbGltaXRfc3RyaW5nX2xlbmd0aF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgICAibmV0Y29yZS1saW1pdF9jb250YWluZXJfbGVuZ3RoX2NvbXBhY3RfYnVmZmVyZWQtaXAiCitdCmRpZmYgLS1naXQgYS90ZXN0L2ZlYXR1cmVzL2xvY2FsX3RocmlmdC9fX2luaXRfXy5weSBiL3Rlc3QvZmVhdHVyZXMvbG9jYWxfdGhyaWZ0L19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4NWNlYmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2ZlYXR1cmVzL2xvY2FsX3RocmlmdC9fX2luaXRfXy5weQpAQCAtMCwwICsxLDMyIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW1wb3J0IGdsb2IKK2ltcG9ydCBvcworaW1wb3J0IHN5cworCitfU0NSSVBUX0RJUiA9IG9zLnBhdGgucmVhbHBhdGgob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSkKK19ST09UX0RJUiA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKF9TQ1JJUFRfRElSKSkpCitfTElCRElSID0gb3MucGF0aC5qb2luKF9ST09UX0RJUiwgJ2xpYicsICdweScsICdidWlsZCcsICdsaWIuKicpCisKK2ZvciBsaWJwYXRoIGluIGdsb2IuZ2xvYihfTElCRElSKToKKyAgICBpZiBsaWJwYXRoLmVuZHN3aXRoKCctJWQuJWQnICUgKHN5cy52ZXJzaW9uX2luZm9bMF0sIHN5cy52ZXJzaW9uX2luZm9bMV0pKToKKyAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIGxpYnBhdGgpCisgICAgICAgIHRocmlmdCA9IF9faW1wb3J0X18oJ3RocmlmdCcpCisgICAgICAgIGJyZWFrCmRpZmYgLS1naXQgYS90ZXN0L2ZlYXR1cmVzL25vc3NsdjMuc2ggYi90ZXN0L2ZlYXR1cmVzL25vc3NsdjMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzhjY2EwNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZmVhdHVyZXMvbm9zc2x2My5zaApAQCAtMCwwICsxLDU5IEBACisjIS9iaW4vYmFzaAorCisjCisjIENoZWNrcyB0byBtYWtlIHN1cmUgU1NMdjMgaXMgbm90IGFsbG93ZWQgYnkgYSBzZXJ2ZXIuCisjCisKK1RIUklGVEhPU1Q9bG9jYWxob3N0CitUSFJJRlRQT1JUPTkwOTAKKword2hpbGUgW1sgJCMgLWdlIDEgXV07IGRvCisgIGFyZz0iJDEiCisgIGFyZ0lOPSgke2FyZy8vPS8gfSkKKworICBjYXNlICR7YXJnSU5bMF19IGluCisgICAgLWh8LS1ob3N0KQorICAgIFRIUklGVEhPU1Q9JHthcmdJTlsxXX0KKyAgICBzaGlmdCAjIHBhc3QgYXJndW1lbnQKKyAgICA7OworICAgIC1wfC0tcG9ydCkKKyAgICBUSFJJRlRQT1JUPSR7YXJnSU5bMV19CisgICAgc2hpZnQgIyBwYXN0IGFyZ3VtZW50CisgICAgOzsKKyAgICAqKQorICAgICAgICAgICMgdW5rbm93biBvcHRpb24gaWdub3JlZAorICAgIDs7CisgIGVzYWMKKworICBzaGlmdCAgICMgcGFzdCBhcmd1bWVudCBvciB2YWx1ZQorZG9uZQorCitmdW5jdGlvbiBub3NzbHYzCit7CisgIGxvY2FsIG5lZ28KKyAgbG9jYWwgbmVnb2RlbmllZAorICBsb2NhbCBvcGVuc3NsdgorCisgIG9wZW5zc2x2PSQob3BlbnNzbCB2ZXJzaW9uIHwgY3V0IC1kJyAnIC1mMikKKyAgaWYgW1sgJG9wZW5zc2x2ID4gIjEuMCIgXV07IHRoZW4KKyAgICBlY2hvICJbcGFzc10gT3BlblNTTCAxLjEgb3IgbGF0ZXIgLSBubyBuZWVkIHRvIGNoZWNrIHNzbDMiCisgICAgcmV0dXJuIDAKKyAgZmkKKworICAjIGVjaG8gIm9wZW5zc2wgc19jbGllbnQgLWNvbm5lY3QgJFRIUklGVEhPU1Q6JFRIUklGVFBPUlQgLUNBZmlsZSAuLi9rZXlzL0NBLnBlbSAtc3NsMyAyPiYxIDwgL2Rldi9udWxsIgorICBuZWdvPSQob3BlbnNzbCBzX2NsaWVudCAtY29ubmVjdCAkVEhSSUZUSE9TVDokVEhSSUZUUE9SVCAtQ0FmaWxlIC4uL2tleXMvQ0EucGVtIC1zc2wzIDI+JjEgPCAvZGV2L251bGwpCisgIG5lZ29kZW5pZWQ9JD8KKworICBpZiBbWyAkbmVnb2RlbmllZCAtbmUgMCBdXTsgdGhlbgorICAgIGVjaG8gIltwYXNzXSBTU0x2MyBuZWdvdGlhdGlvbiBkaXNhYmxlZCIKKyAgICBlY2hvICRuZWdvCisgICAgcmV0dXJuIDAKKyAgZmkKKworICBlY2hvICJbZmFpbF0gU1NMdjMgbmVnb3RpYXRpb24gZW5hYmxlZCEgIHN0ZG91dDoiCisgIGVjaG8gJG5lZ28KKyAgcmV0dXJuIDEKK30KKworbm9zc2x2MworZXhpdCAkPwpkaWZmIC0tZ2l0IGEvdGVzdC9mZWF0dXJlcy9zZXR1cC5jZmcgYi90ZXN0L2ZlYXR1cmVzL3NldHVwLmNmZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGExZjk2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9mZWF0dXJlcy9zZXR1cC5jZmcKQEAgLTAsMCArMSwyIEBACitbZmxha2U4XQorbWF4LWxpbmUtbGVuZ3RoID0gMTAwCmRpZmYgLS1naXQgYS90ZXN0L2ZlYXR1cmVzL3N0cmluZ19saW1pdC5weSBiL3Rlc3QvZmVhdHVyZXMvc3RyaW5nX2xpbWl0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4OTkxZDYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2ZlYXR1cmVzL3N0cmluZ19saW1pdC5weQpAQCAtMCwwICsxLDYyIEBACisjIS91c3IvYmluL2VudiBweXRob24KKworaW1wb3J0IGFyZ3BhcnNlCitpbXBvcnQgc3lzCisKK2Zyb20gdXRpbCBpbXBvcnQgYWRkX2NvbW1vbl9hcmdzLCBpbml0X3Byb3RvY29sCitmcm9tIGxvY2FsX3RocmlmdCBpbXBvcnQgdGhyaWZ0ICAjIG5vcWEKK2Zyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgVE1lc3NhZ2VUeXBlLCBUVHlwZQorCisKKyMgVE9ETzogZ2VuZXJhdGUgZnJvbSBUaHJpZnRUZXN0LnRocmlmdAorZGVmIHRlc3Rfc3RyaW5nKHByb3RvLCB2YWx1ZSk6CisgICAgbWV0aG9kX25hbWUgPSAndGVzdFN0cmluZycKKyAgICB0dHlwZSA9IFRUeXBlLlNUUklORworICAgIHByb3RvLndyaXRlTWVzc2FnZUJlZ2luKG1ldGhvZF9uYW1lLCBUTWVzc2FnZVR5cGUuQ0FMTCwgMykKKyAgICBwcm90by53cml0ZVN0cnVjdEJlZ2luKG1ldGhvZF9uYW1lICsgJ19hcmdzJykKKyAgICBwcm90by53cml0ZUZpZWxkQmVnaW4oJ3RoaW5nJywgdHR5cGUsIDEpCisgICAgcHJvdG8ud3JpdGVTdHJpbmcodmFsdWUpCisgICAgcHJvdG8ud3JpdGVGaWVsZEVuZCgpCisgICAgcHJvdG8ud3JpdGVGaWVsZFN0b3AoKQorICAgIHByb3RvLndyaXRlU3RydWN0RW5kKCkKKyAgICBwcm90by53cml0ZU1lc3NhZ2VFbmQoKQorICAgIHByb3RvLnRyYW5zLmZsdXNoKCkKKworICAgIF8sIG10eXBlLCBfID0gcHJvdG8ucmVhZE1lc3NhZ2VCZWdpbigpCisgICAgYXNzZXJ0IG10eXBlID09IFRNZXNzYWdlVHlwZS5SRVBMWQorICAgIHByb3RvLnJlYWRTdHJ1Y3RCZWdpbigpCisgICAgXywgZnR5cGUsIGZpZCA9IHByb3RvLnJlYWRGaWVsZEJlZ2luKCkKKyAgICBhc3NlcnQgZmlkID09IDAKKyAgICBhc3NlcnQgZnR5cGUgPT0gdHR5cGUKKyAgICByZXN1bHQgPSBwcm90by5yZWFkU3RyaW5nKCkKKyAgICBwcm90by5yZWFkRmllbGRFbmQoKQorICAgIF8sIGZ0eXBlLCBfID0gcHJvdG8ucmVhZEZpZWxkQmVnaW4oKQorICAgIGFzc2VydCBmdHlwZSA9PSBUVHlwZS5TVE9QCisgICAgcHJvdG8ucmVhZFN0cnVjdEVuZCgpCisgICAgcHJvdG8ucmVhZE1lc3NhZ2VFbmQoKQorICAgIGFzc2VydCB2YWx1ZSA9PSByZXN1bHQKKworCitkZWYgbWFpbihhcmd2KToKKyAgICBwID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQorICAgIGFkZF9jb21tb25fYXJncyhwKQorICAgIHAuYWRkX2FyZ3VtZW50KCctLWxpbWl0JywgdHlwZT1pbnQpCisgICAgYXJncyA9IHAucGFyc2VfYXJncygpCisgICAgcHJvdG8gPSBpbml0X3Byb3RvY29sKGFyZ3MpCisgICAgdGVzdF9zdHJpbmcocHJvdG8sICdhJyAqIChhcmdzLmxpbWl0IC0gMSkpCisgICAgdGVzdF9zdHJpbmcocHJvdG8sICdhJyAqIChhcmdzLmxpbWl0IC0gMSkpCisgICAgcHJpbnQoJ1tPS106IGxpbWl0IC0gMScpCisgICAgdGVzdF9zdHJpbmcocHJvdG8sICdhJyAqIGFyZ3MubGltaXQpCisgICAgdGVzdF9zdHJpbmcocHJvdG8sICdhJyAqIGFyZ3MubGltaXQpCisgICAgcHJpbnQoJ1tPS106IGp1c3QgbGltaXQnKQorICAgIHRyeToKKyAgICAgICAgdGVzdF9zdHJpbmcocHJvdG8sICdhJyAqIChhcmdzLmxpbWl0ICsgMSkpCisgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgcHJpbnQoJ1tPS106IGxpbWl0ICsgMScpCisgICAgZWxzZToKKyAgICAgICAgcHJpbnQoJ1tFUlJPUl06IGxpbWl0ICsgMScpCisgICAgICAgIGFzc2VydCBGYWxzZQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgbWFpbihzeXMuYXJndlsxOl0pCmRpZmYgLS1naXQgYS90ZXN0L2ZlYXR1cmVzL3Rlc3RzLmpzb24gYi90ZXN0L2ZlYXR1cmVzL3Rlc3RzLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFlMDdkNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZmVhdHVyZXMvdGVzdHMuanNvbgpAQCAtMCwwICsxLDExNCBAQAorWworICB7CisgICAgImRlc2NyaXB0aW9uIjogIlRIZWFkZXIgZGV0ZWN0cyB1bmZyYW1lZCBiaW5hcnkgd2lyZSBmb3JtYXQiLAorICAgICJuYW1lIjogInRoZWFkZXJfdW5mcmFtZWRfYmluYXJ5IiwKKyAgICAiY29tbWFuZCI6IFsKKyAgICAgICJweXRob24iLAorICAgICAgInRoZWFkZXJfYmluYXJ5LnB5IiwKKyAgICAgICItLW92ZXJyaWRlLXByb3RvY29sPWJpbmFyeSIsCisgICAgICAiLS1vdmVycmlkZS10cmFuc3BvcnQ9YnVmZmVyZWQiCisgICAgXSwKKyAgICAicHJvdG9jb2xzIjogWyJoZWFkZXIiXSwKKyAgICAidHJhbnNwb3J0cyI6IFsiYnVmZmVyZWQiXSwKKyAgICAic29ja2V0cyI6IFsiaXAiXSwKKyAgICAid29ya2RpciI6ICJmZWF0dXJlcyIKKyAgfSwKKyAgeworICAgICJkZXNjcmlwdGlvbiI6ICJUSGVhZGVyIGRldGVjdHMgZnJhbWVkIGJpbmFyeSB3aXJlIGZvcm1hdCIsCisgICAgIm5hbWUiOiAidGhlYWRlcl9mcmFtZWRfYmluYXJ5IiwKKyAgICAiY29tbWFuZCI6IFsKKyAgICAgICJweXRob24iLAorICAgICAgInRoZWFkZXJfYmluYXJ5LnB5IiwKKyAgICAgICItLW92ZXJyaWRlLXByb3RvY29sPWJpbmFyeSIsCisgICAgICAiLS1vdmVycmlkZS10cmFuc3BvcnQ9ZnJhbWVkIgorICAgIF0sCisgICAgInByb3RvY29scyI6IFsiaGVhZGVyIl0sCisgICAgInRyYW5zcG9ydHMiOiBbImJ1ZmZlcmVkIl0sCisgICAgInNvY2tldHMiOiBbImlwIl0sCisgICAgIndvcmtkaXIiOiAiZmVhdHVyZXMiCisgIH0sCisgIHsKKyAgICAiZGVzY3JpcHRpb24iOiAiVEhlYWRlciBkZXRlY3RzIHVuZnJhbWVkIGNvbXBhY3Qgd2lyZSBmb3JtYXQiLAorICAgICJuYW1lIjogInRoZWFkZXJfdW5mcmFtZWRfY29tcGFjdCIsCisgICAgImNvbW1hbmQiOiBbCisgICAgICAicHl0aG9uIiwKKyAgICAgICJ0aGVhZGVyX2JpbmFyeS5weSIsCisgICAgICAiLS1vdmVycmlkZS1wcm90b2NvbD1jb21wYWN0IiwKKyAgICAgICItLW92ZXJyaWRlLXRyYW5zcG9ydD1idWZmZXJlZCIKKyAgICBdLAorICAgICJwcm90b2NvbHMiOiBbImhlYWRlciJdLAorICAgICJ0cmFuc3BvcnRzIjogWyJidWZmZXJlZCJdLAorICAgICJzb2NrZXRzIjogWyJpcCJdLAorICAgICJ3b3JrZGlyIjogImZlYXR1cmVzIgorICB9LAorICB7CisgICAgImRlc2NyaXB0aW9uIjogIlRIZWFkZXIgZGV0ZWN0cyBmcmFtZWQgY29tcGFjdCB3aXJlIGZvcm1hdCIsCisgICAgIm5hbWUiOiAidGhlYWRlcl9mcmFtZWRfY29tcGFjdCIsCisgICAgImNvbW1hbmQiOiBbCisgICAgICAicHl0aG9uIiwKKyAgICAgICJ0aGVhZGVyX2JpbmFyeS5weSIsCisgICAgICAiLS1vdmVycmlkZS1wcm90b2NvbD1jb21wYWN0IiwKKyAgICAgICItLW92ZXJyaWRlLXRyYW5zcG9ydD1mcmFtZWQiCisgICAgXSwKKyAgICAicHJvdG9jb2xzIjogWyJoZWFkZXIiXSwKKyAgICAidHJhbnNwb3J0cyI6IFsiYnVmZmVyZWQiXSwKKyAgICAic29ja2V0cyI6IFsiaXAiXSwKKyAgICAid29ya2RpciI6ICJmZWF0dXJlcyIKKyAgfSwKKyAgeworICAgICJuYW1lIjogImxpbWl0X3N0cmluZ19sZW5ndGgiLAorICAgICJjb21tYW5kIjogWworICAgICAgInB5dGhvbiIsCisgICAgICAic3RyaW5nX2xpbWl0LnB5IiwKKyAgICAgICItLWxpbWl0PTUwIgorICAgIF0sCisgICAgInJlbW90ZV9hcmdzIjogWworICAgICAgIi0tc3RyaW5nLWxpbWl0PTUwIgorICAgIF0sCisgICAgInByb3RvY29scyI6IFsKKyAgICAgICJjb21wYWN0IgorICAgIF0sCisgICAgInRyYW5zcG9ydHMiOiBbImJ1ZmZlcmVkIl0sCisgICAgInNvY2tldHMiOiBbImlwIl0sCisgICAgIndvcmtkaXIiOiAiZmVhdHVyZXMiCisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJsaW1pdF9jb250YWluZXJfbGVuZ3RoIiwKKyAgICAiY29tbWFuZCI6IFsKKyAgICAgICJweXRob24iLAorICAgICAgImNvbnRhaW5lcl9saW1pdC5weSIsCisgICAgICAiLS1saW1pdD01MCIKKyAgICBdLAorICAgICJyZW1vdGVfYXJncyI6IFsKKyAgICAgICItLWNvbnRhaW5lci1saW1pdD01MCIKKyAgICBdLAorICAgICJwcm90b2NvbHMiOiBbCisgICAgICAiY29tcGFjdCIKKyAgICBdLAorICAgICJ0cmFuc3BvcnRzIjogWyJidWZmZXJlZCJdLAorICAgICJzb2NrZXRzIjogWyJpcCJdLAorICAgICJ3b3JrZGlyIjogImZlYXR1cmVzIgorICB9LAorICB7CisgICAgIm5hbWUiOiAibm9zc2x2MyIsCisgICAgImNvbW1lbnQiOiAiY2hlY2sgdG8gbWFrZSBzdXJlIFNTTHYzIGlzIG5vdCBzdXBwb3J0ZWQiLAorICAgICJjb21tYW5kIjogWworICAgICAgIm5vc3NsdjMuc2giCisgICAgXSwKKyAgICAicHJvdG9jb2xzIjogWyJiaW5hcnkiXSwKKyAgICAidHJhbnNwb3J0cyI6IFsiYnVmZmVyZWQiXSwKKyAgICAic29ja2V0cyI6IFsiaXAtc3NsIl0sCisgICAgIndvcmtkaXIiOiAiZmVhdHVyZXMiCisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJ0bHMiLAorICAgICJjb21tZW50IjogImNoZWNrIHRvIG1ha2Ugc3VyZSBUTFN2MS4wIG9yIGxhdGVyIGlzIHN1cHBvcnRlZCIsCisgICAgImNvbW1hbmQiOiBbCisgICAgICAidGxzLnNoIgorICAgIF0sCisgICAgInByb3RvY29scyI6IFsiYmluYXJ5Il0sCisgICAgInRyYW5zcG9ydHMiOiBbImJ1ZmZlcmVkIl0sCisgICAgInNvY2tldHMiOiBbImlwLXNzbCJdLAorICAgICJ3b3JrZGlyIjogImZlYXR1cmVzIgorICB9CitdCmRpZmYgLS1naXQgYS90ZXN0L2ZlYXR1cmVzL3RoZWFkZXJfYmluYXJ5LnB5IGIvdGVzdC9mZWF0dXJlcy90aGVhZGVyX2JpbmFyeS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTEzOTlhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9mZWF0dXJlcy90aGVhZGVyX2JpbmFyeS5weQpAQCAtMCwwICsxLDcwIEBACisjIS91c3IvYmluL2VudiBweXRob24KKworaW1wb3J0IGFyZ3BhcnNlCitpbXBvcnQgc29ja2V0CitpbXBvcnQgc3lzCisKK2Zyb20gdXRpbCBpbXBvcnQgYWRkX2NvbW1vbl9hcmdzCitmcm9tIGxvY2FsX3RocmlmdCBpbXBvcnQgdGhyaWZ0ICAjIG5vcWEKK2Zyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgVE1lc3NhZ2VUeXBlLCBUVHlwZQorZnJvbSB0aHJpZnQudHJhbnNwb3J0LlRTb2NrZXQgaW1wb3J0IFRTb2NrZXQKK2Zyb20gdGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0IGltcG9ydCBUQnVmZmVyZWRUcmFuc3BvcnQsIFRGcmFtZWRUcmFuc3BvcnQKK2Zyb20gdGhyaWZ0LnByb3RvY29sLlRCaW5hcnlQcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCitmcm9tIHRocmlmdC5wcm90b2NvbC5UQ29tcGFjdFByb3RvY29sIGltcG9ydCBUQ29tcGFjdFByb3RvY29sCisKKworZGVmIHRlc3Rfdm9pZChwcm90byk6CisgICAgcHJvdG8ud3JpdGVNZXNzYWdlQmVnaW4oJ3Rlc3RWb2lkJywgVE1lc3NhZ2VUeXBlLkNBTEwsIDMpCisgICAgcHJvdG8ud3JpdGVTdHJ1Y3RCZWdpbigndGVzdFZvaWRfYXJncycpCisgICAgcHJvdG8ud3JpdGVGaWVsZFN0b3AoKQorICAgIHByb3RvLndyaXRlU3RydWN0RW5kKCkKKyAgICBwcm90by53cml0ZU1lc3NhZ2VFbmQoKQorICAgIHByb3RvLnRyYW5zLmZsdXNoKCkKKworICAgIF8sIG10eXBlLCBfID0gcHJvdG8ucmVhZE1lc3NhZ2VCZWdpbigpCisgICAgYXNzZXJ0IG10eXBlID09IFRNZXNzYWdlVHlwZS5SRVBMWQorICAgIHByb3RvLnJlYWRTdHJ1Y3RCZWdpbigpCisgICAgXywgZnR5cGUsIF8gPSBwcm90by5yZWFkRmllbGRCZWdpbigpCisgICAgYXNzZXJ0IGZ0eXBlID09IFRUeXBlLlNUT1AKKyAgICBwcm90by5yZWFkU3RydWN0RW5kKCkKKyAgICBwcm90by5yZWFkTWVzc2FnZUVuZCgpCisKKworIyBUSGVhZGVyIHN0YWNrIHNob3VsZCBhY2NlcHQgYmluYXJ5IHByb3RvY29sIHdpdGggb3B0aW9uYWxseSBmcmFtZWQgdHJhbnNwb3J0CitkZWYgbWFpbihhcmd2KToKKyAgICBwID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQorICAgIGFkZF9jb21tb25fYXJncyhwKQorICAgICMgU2luY2UgVEhlYWRlclRyYW5zcG9ydCBhY3RzIGFzIGZyYW1lZCB0cmFuc3BvcnQgd2hlbiBkZXRlY3RlZCBmcmFtZSwgd2UKKyAgICAjIGNhbm5vdCB1c2UgLS10cmFuc3BvcnQ9ZnJhbWVkIGFzIGl0IHdvdWxkIHJlc3VsdCBpbiAyIGxheWVyZWQgZnJhbWVzLgorICAgIHAuYWRkX2FyZ3VtZW50KCctLW92ZXJyaWRlLXRyYW5zcG9ydCcpCisgICAgcC5hZGRfYXJndW1lbnQoJy0tb3ZlcnJpZGUtcHJvdG9jb2wnKQorICAgIGFyZ3MgPSBwLnBhcnNlX2FyZ3MoKQorICAgIGFzc2VydCBhcmdzLnByb3RvY29sID09ICdoZWFkZXInCisgICAgYXNzZXJ0IGFyZ3MudHJhbnNwb3J0ID09ICdidWZmZXJlZCcKKyAgICBhc3NlcnQgbm90IGFyZ3Muc3NsCisKKyAgICBzb2NrID0gVFNvY2tldChhcmdzLmhvc3QsIGFyZ3MucG9ydCwgc29ja2V0X2ZhbWlseT1zb2NrZXQuQUZfSU5FVCkKKyAgICBpZiBub3QgYXJncy5vdmVycmlkZV90cmFuc3BvcnQgb3IgYXJncy5vdmVycmlkZV90cmFuc3BvcnQgPT0gJ2J1ZmZlcmVkJzoKKyAgICAgICAgdHJhbnMgPSBUQnVmZmVyZWRUcmFuc3BvcnQoc29jaykKKyAgICBlbGlmIGFyZ3Mub3ZlcnJpZGVfdHJhbnNwb3J0ID09ICdmcmFtZWQnOgorICAgICAgICBwcmludCgnVEZSQU1FRCcpCisgICAgICAgIHRyYW5zID0gVEZyYW1lZFRyYW5zcG9ydChzb2NrKQorICAgIGVsc2U6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2ludmFsaWQgdHJhbnNwb3J0JykKKyAgICB0cmFucy5vcGVuKCkKKworICAgIGlmIG5vdCBhcmdzLm92ZXJyaWRlX3Byb3RvY29sIG9yIGFyZ3Mub3ZlcnJpZGVfcHJvdG9jb2wgPT0gJ2JpbmFyeSc6CisgICAgICAgIHByb3RvID0gVEJpbmFyeVByb3RvY29sKHRyYW5zKQorICAgIGVsaWYgYXJncy5vdmVycmlkZV9wcm90b2NvbCA9PSAnY29tcGFjdCc6CisgICAgICAgIHByb3RvID0gVENvbXBhY3RQcm90b2NvbCh0cmFucykKKyAgICBlbHNlOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdpbnZhbGlkIHRyYW5zcG9ydCcpCisKKyAgICB0ZXN0X3ZvaWQocHJvdG8pCisgICAgdGVzdF92b2lkKHByb3RvKQorCisgICAgdHJhbnMuY2xvc2UoKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgc3lzLmV4aXQobWFpbihzeXMuYXJndlsxOl0pKQpkaWZmIC0tZ2l0IGEvdGVzdC9mZWF0dXJlcy90bHMuc2ggYi90ZXN0L2ZlYXR1cmVzL3Rscy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kYWRhNmFiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9mZWF0dXJlcy90bHMuc2gKQEAgLTAsMCArMSw3MSBAQAorIyEvYmluL2Jhc2gKKworIworIyBDaGVja3MgdG8gbWFrZSBzdXJlIFRMU3YxLjAgb3IgbGF0ZXIgaXMgYWxsb3dlZCBieSBhIHNlcnZlci4KKyMKKworVEhSSUZUSE9TVD1sb2NhbGhvc3QKK1RIUklGVFBPUlQ9OTA5MAorCit3aGlsZSBbWyAkIyAtZ2UgMSBdXTsgZG8KKyAgYXJnPSIkMSIKKyAgYXJnSU49KCR7YXJnLy89LyB9KQorCisgIGNhc2UgJHthcmdJTlswXX0gaW4KKyAgICAtaHwtLWhvc3QpCisgICAgVEhSSUZUSE9TVD0ke2FyZ0lOWzFdfQorICAgIHNoaWZ0ICMgcGFzdCBhcmd1bWVudAorICAgIDs7CisgICAgLXB8LS1wb3J0KQorICAgIFRIUklGVFBPUlQ9JHthcmdJTlsxXX0KKyAgICBzaGlmdCAjIHBhc3QgYXJndW1lbnQKKyAgICA7OworICAgICopCisgICAgICAgICAgIyB1bmtub3duIG9wdGlvbiBpZ25vcmVkCisgICAgOzsKKyAgZXNhYworCisgIHNoaWZ0ICAgIyBwYXN0IGFyZ3VtZW50IG9yIHZhbHVlCitkb25lCisKK2RlY2xhcmUgLUEgRVhQRUNUX05FR09USUFURQorRVhQRUNUX05FR09USUFURVt0bHMxXT0xCitFWFBFQ1RfTkVHT1RJQVRFW3RsczFfMV09MQorRVhQRUNUX05FR09USUFURVt0bHMxXzJdPTEKKworZmFpbHVyZXM9MAorCitmdW5jdGlvbiB0bHMKK3sKKyAgZm9yIFBST1RPIGluICIkeyFFWFBFQ1RfTkVHT1RJQVRFW0BdfSI7IGRvCisKKyAgICBsb2NhbCBuZWdvCisgICAgbG9jYWwgbmVnb2RlbmllZAorICAgIGxvY2FsIHJlcworCisgICAgZWNobyAib3BlbnNzbCBzX2NsaWVudCAtY29ubmVjdCAkVEhSSUZUSE9TVDokVEhSSUZUUE9SVCAtQ0FmaWxlIC4uL2tleXMvQ0EucGVtIC0kUFJPVE8gMj4mMSA8IC9kZXYvbnVsbCIKKyAgICBuZWdvPSQob3BlbnNzbCBzX2NsaWVudCAtY29ubmVjdCAkVEhSSUZUSE9TVDokVEhSSUZUUE9SVCAtQ0FmaWxlIC4uL2tleXMvQ0EucGVtIC0kUFJPVE8gMj4mMSA8IC9kZXYvbnVsbCkKKyAgICBuZWdvZGVuaWVkPSQ/CisgICAgZWNobyAicmVzdWx0IG9mIGNvbW1hbmQ6ICRuZWdvZGVuaWVkIgorCisgICAgcmVzPSJlbmFibGVkIjsgaWYgW1sgJHtFWFBFQ1RfTkVHT1RJQVRFWyRQUk9UT119IC1lcSAwIF1dOyB0aGVuIHJlcz0iZGlzYWJsZWQiOyBmaQorCisgICAgaWYgW1sgJG5lZ29kZW5pZWQgLW5lICR7RVhQRUNUX05FR09USUFURVskUFJPVE9dfSBdXTsgdGhlbgorICAgICAgZWNobyAiJFBST1RPIG5lZ290aWF0aW9uIGFsbG93ZWQiCisgICAgZWxzZQorICAgICAgZWNobyAiW3dhcm5dICRQUk9UTyBuZWdvdGlhdGlvbiBkaWQgbm90IHdvcmsiCisgICAgICBlY2hvICRuZWdvCisgICAgICAoKGZhaWx1cmVzKyspKQorICAgIGZpCisgIGRvbmUKK30KKwordGxzCisKK2lmIFtbICRmYWlsdXJlcyAtZXEgMyBdXTsgdGhlbgorICBlY2hvICJbZmFpbF0gQXQgbGVhc3Qgb25lIG9mIFRMU3YxLjAsIFRMU3YxLjEsIG9yIFRMU3YxLjIgbmVlZHMgdG8gd29yaywgYnV0IGRvZXMgbm90IgorICBleGl0ICRmYWlsdXJlcworZmkKKworZWNobyAiW3Bhc3NdIEF0IGxlYXN0IG9uZSBvZiBUTFN2MS4wLCBUTFN2MS4xLCBvciBUTFN2MS4yIHdvcmtlZCIKK2V4aXQgMApkaWZmIC0tZ2l0IGEvdGVzdC9mZWF0dXJlcy91dGlsLnB5IGIvdGVzdC9mZWF0dXJlcy91dGlsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhYmJiYmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2ZlYXR1cmVzL3V0aWwucHkKQEAgLTAsMCArMSw0MCBAQAoraW1wb3J0IGFyZ3BhcnNlCitpbXBvcnQgc29ja2V0CisKK2Zyb20gbG9jYWxfdGhyaWZ0IGltcG9ydCB0aHJpZnQgICMgbm9xYQorZnJvbSB0aHJpZnQudHJhbnNwb3J0LlRTb2NrZXQgaW1wb3J0IFRTb2NrZXQKK2Zyb20gdGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0IGltcG9ydCBUQnVmZmVyZWRUcmFuc3BvcnQsIFRGcmFtZWRUcmFuc3BvcnQKK2Zyb20gdGhyaWZ0LnRyYW5zcG9ydC5USHR0cENsaWVudCBpbXBvcnQgVEh0dHBDbGllbnQKK2Zyb20gdGhyaWZ0LnByb3RvY29sLlRCaW5hcnlQcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCitmcm9tIHRocmlmdC5wcm90b2NvbC5UQ29tcGFjdFByb3RvY29sIGltcG9ydCBUQ29tcGFjdFByb3RvY29sCitmcm9tIHRocmlmdC5wcm90b2NvbC5USlNPTlByb3RvY29sIGltcG9ydCBUSlNPTlByb3RvY29sCisKKworZGVmIGFkZF9jb21tb25fYXJncyhwKToKKyAgICBwLmFkZF9hcmd1bWVudCgnLS1ob3N0JywgZGVmYXVsdD0nbG9jYWxob3N0JykKKyAgICBwLmFkZF9hcmd1bWVudCgnLS1wb3J0JywgdHlwZT1pbnQsIGRlZmF1bHQ9OTA5MCkKKyAgICBwLmFkZF9hcmd1bWVudCgnLS1wcm90b2NvbCcsIGRlZmF1bHQ9J2JpbmFyeScpCisgICAgcC5hZGRfYXJndW1lbnQoJy0tdHJhbnNwb3J0JywgZGVmYXVsdD0nYnVmZmVyZWQnKQorICAgIHAuYWRkX2FyZ3VtZW50KCctLXNzbCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScpCisKKworZGVmIHBhcnNlX2NvbW1vbl9hcmdzKGFyZ3YpOgorICAgIHAgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCisgICAgYWRkX2NvbW1vbl9hcmdzKHApCisgICAgcmV0dXJuIHAucGFyc2VfYXJncyhhcmd2KQorCisKK2RlZiBpbml0X3Byb3RvY29sKGFyZ3MpOgorICAgIHNvY2sgPSBUU29ja2V0KGFyZ3MuaG9zdCwgYXJncy5wb3J0LCBzb2NrZXRfZmFtaWx5PXNvY2tldC5BRl9JTkVUKQorICAgIHNvY2suc2V0VGltZW91dCg1MDApCisgICAgdHJhbnMgPSB7CisgICAgICAgICdidWZmZXJlZCc6IFRCdWZmZXJlZFRyYW5zcG9ydCwKKyAgICAgICAgJ2ZyYW1lZCc6IFRGcmFtZWRUcmFuc3BvcnQsCisgICAgICAgICdodHRwJzogVEh0dHBDbGllbnQsCisgICAgfVthcmdzLnRyYW5zcG9ydF0oc29jaykKKyAgICB0cmFucy5vcGVuKCkKKyAgICByZXR1cm4geworICAgICAgICAnYmluYXJ5JzogVEJpbmFyeVByb3RvY29sLAorICAgICAgICAnY29tcGFjdCc6IFRDb21wYWN0UHJvdG9jb2wsCisgICAgICAgICdqc29uJzogVEpTT05Qcm90b2NvbCwKKyAgICB9W2FyZ3MucHJvdG9jb2xdKHRyYW5zKQpkaWZmIC0tZ2l0IGEvdGVzdC9nby9NYWtlZmlsZS5hbSBiL3Rlc3QvZ28vTWFrZWZpbGUuYW0KaW5kZXggMmIyZGJjZS4uNmRhODMzOSAxMDA2NDQKLS0tIGEvdGVzdC9nby9NYWtlZmlsZS5hbQorKysgYi90ZXN0L2dvL01ha2VmaWxlLmFtCkBAIC0xOSw4ICsxOSw3IEBACiAKIEJVSUxUX1NPVVJDRVMgPSBnb3BhdGgKIAotVEhSSUZUID0gJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKLVRIUklGVENNRCA9ICQoVEhSSUZUKSAtb3V0IHNyYy9nZW4gLS1nZW4gZ286dGhyaWZ0X2ltcG9ydD10aHJpZnQKK1RIUklGVENNRCA9ICQoVEhSSUZUKSAtb3V0IHNyYy9nZW4gLS1nZW4gZ286dGhyaWZ0X2ltcG9ydD10aHJpZnQkKENPTVBJTEVSX0VYVFJBRkxBRykKIFRIUklGVFRFU1QgPSAkKHRvcF9zcmNkaXIpL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKIAogcHJlY3Jvc3M6IGJpbi90ZXN0Y2xpZW50IGJpbi90ZXN0c2VydmVyCkBAIC0yOCwxMyArMjcsMTcgQEAKIFRocmlmdFRlc3QudGhyaWZ0OiAkKFRIUklGVFRFU1QpCiAJZ3JlcCAtdiBsaXN0LiptYXAuKmxpc3QuKm1hcCAkKFRIUklGVFRFU1QpID4gVGhyaWZ0VGVzdC50aHJpZnQKIAorLlBIT05ZOiBnb3BhdGgKKwogIyBUaHJpZnQgZm9yIEdPIGhhcyBwcm9ibGVtcyB3aXRoIGNvbXBsZXggbWFwIGtleXM6IFRIUklGVC0yMDYzCiBnb3BhdGg6ICQoVEhSSUZUKSBUaHJpZnRUZXN0LnRocmlmdAogCW1rZGlyIC1wIHNyYy9nZW4KIAkkKFRIUklGVENNRCkgVGhyaWZ0VGVzdC50aHJpZnQKIAkkKFRIUklGVENNRCkgLi4vU3RyZXNzVGVzdC50aHJpZnQKLQlsbiAtbmZzIC4uLy4uLy4uL2xpYi9nby90aHJpZnQgc3JjL3RocmlmdAorCUdPUEFUSD1gcHdkYCAkKEdPKSBnZXQgZ2l0aHViLmNvbS9nb2xhbmcvbW9jay9nb21vY2sgfHwgdHJ1ZQorCXNlZCAtaSAncy9cImNvbnRleHRcIi9cImdvbGFuZy5vcmdcL3hcL25ldFwvY29udGV4dFwiL2cnIHNyYy9naXRodWIuY29tL2dvbGFuZy9tb2NrL2dvbW9jay9jb250cm9sbGVyLmdvIHx8IHRydWUKIAlHT1BBVEg9YHB3ZGAgJChHTykgZ2V0IGdpdGh1Yi5jb20vZ29sYW5nL21vY2svZ29tb2NrCisJbG4gLW5mcyAuLi8uLi8uLi9saWIvZ28vdGhyaWZ0IHNyYy90aHJpZnQKIAl0b3VjaCBnb3BhdGgKIAogYmluL3Rlc3RjbGllbnQ6IGdvcGF0aApAQCAtNTEsNyArNTQsNyBAQAogCiBjaGVja19QUk9HUkFNUzogYmluL3Rlc3RjbGllbnQgYmluL3Rlc3RzZXJ2ZXIgYmluL3N0cmVzcwogCi1jaGVjazogZ29wYXRoCitjaGVjazogZ29wYXRoIGdlbm1vY2sKIAlHT1BBVEg9YHB3ZGAgJChHTykgdGVzdCAtdiBjb21tb24vLi4uCiAKIGdlbm1vY2s6IGdvcGF0aApkaWZmIC0tZ2l0IGEvdGVzdC9nby9zcmMvYmluL3N0cmVzcy9tYWluLmdvIGIvdGVzdC9nby9zcmMvYmluL3N0cmVzcy9tYWluLmdvCmluZGV4IDRmYzg4ZTAuLmYyZTBmMjAgMTAwNjQ0Ci0tLSBhL3Rlc3QvZ28vc3JjL2Jpbi9zdHJlc3MvbWFpbi5nbworKysgYi90ZXN0L2dvL3NyYy9iaW4vc3RyZXNzL21haW4uZ28KQEAgLTIwLDYgKzIwLDcgQEAKIHBhY2thZ2UgbWFpbgogCiBpbXBvcnQgKAorCSJjb250ZXh0IgogCSJmbGFnIgogCSJmbXQiCiAJImdlbi9zdHJlc3MiCkBAIC0yMDEsMTQgKzIwMiwxMyBAQAogCQkJYXRvbWljLkFkZEludDY0KCZjbGljb3VudGVyLCAxKQogCQl9CiAJY2FzZSBlY2hvU2V0OgotCQlzIDo9IG1hcFtpbnQ4XWJvb2x7LTEwOiB0cnVlLCAtOTogdHJ1ZSwgLTg6IHRydWUsIC03OiB0cnVlLCAtNjogdHJ1ZSwgLTU6IHRydWUsIC00OiB0cnVlLCAtMzogdHJ1ZSwgLTI6IHRydWUsIC0xOiB0cnVlLCAwOiB0cnVlLCAxOiB0cnVlLCAyOiB0cnVlLCAzOiB0cnVlLCA0OiB0cnVlLCA1OiB0cnVlLCA2OiB0cnVlLCA3OiB0cnVlLCA4OiB0cnVlfQorCQlzIDo9IG1hcFtpbnQ4XXN0cnVjdHt9ey0xMDoge30sIC05OiB7fSwgLTg6IHt9LCAtNzoge30sIC02OiB7fSwgLTU6IHt9LCAtNDoge30sIC0zOiB7fSwgLTI6IHt9LCAtMToge30sIDA6IHt9LCAxOiB7fSwgMjoge30sIDM6IHt9LCA0OiB7fSwgNToge30sIDY6IHt9LCA3OiB7fSwgODoge319CiAJCWZvciBpIDo9IDA7IGkgPCAqbG9vcDsgaSsrIHsKIAkJCWNsaWVudC5FY2hvU2V0KHMpCiAJCQlhdG9taWMuQWRkSW50NjQoJmNsaWNvdW50ZXIsIDEpCiAJCX0KIAljYXNlIGVjaG9NYXA6Ci0JCW0gOj0gbWFwW2ludDhdaW50OHsKLQkJCS0xMDogMTAsIC05OiA5LCAtODogOCwgLTc6IDcsIC02OiA2LCAtNTogNSwgLTQ6IDQsIC0zOiAzLCAtMjogMiwgLTE6IDEsIDA6IDAsIDE6IDEsIDI6IDIsIDM6IDMsIDQ6IDQsIDU6IDUsIDY6IDYsIDc6IDcsIDg6IDh9CisJCW0gOj0gbWFwW2ludDhdaW50OHstMTA6IDEwLCAtOTogOSwgLTg6IDgsIC03OiA3LCAtNjogNiwgLTU6IDUsIC00OiA0LCAtMzogMywgLTI6IDIsIC0xOiAxLCAwOiAwLCAxOiAxLCAyOiAyLCAzOiAzLCA0OiA0LCA1OiA1LCA2OiA2LCA3OiA3LCA4OiA4fQogCQlmb3IgaSA6PSAwOyBpIDwgKmxvb3A7IGkrKyB7CiAJCQljbGllbnQuRWNob01hcChtKQogCQkJYXRvbWljLkFkZEludDY0KCZjbGljb3VudGVyLCAxKQpAQCAtMjIwLDM1ICsyMjAsMzUgQEAKIAogdHlwZSBoYW5kbGVyIHN0cnVjdHt9CiAKLWZ1bmMgKGggKmhhbmRsZXIpIEVjaG9Wb2lkKCkgKGVyciBlcnJvcikgeworZnVuYyAoaCAqaGFuZGxlcikgRWNob1ZvaWQoY3R4IGNvbnRleHQuQ29udGV4dCkgKGVyciBlcnJvcikgewogCWF0b21pYy5BZGRJbnQ2NCgmY291bnRlciwgMSkKIAlyZXR1cm4gbmlsCiB9Ci1mdW5jIChoICpoYW5kbGVyKSBFY2hvQnl0ZShhcmcgaW50OCkgKHIgaW50OCwgZXJyIGVycm9yKSB7CitmdW5jIChoICpoYW5kbGVyKSBFY2hvQnl0ZShjdHggY29udGV4dC5Db250ZXh0LCBhcmcgaW50OCkgKHIgaW50OCwgZXJyIGVycm9yKSB7CiAJYXRvbWljLkFkZEludDY0KCZjb3VudGVyLCAxKQogCXJldHVybiBhcmcsIG5pbAogfQotZnVuYyAoaCAqaGFuZGxlcikgRWNob0kzMihhcmcgaW50MzIpIChyIGludDMyLCBlcnIgZXJyb3IpIHsKK2Z1bmMgKGggKmhhbmRsZXIpIEVjaG9JMzIoY3R4IGNvbnRleHQuQ29udGV4dCwgYXJnIGludDMyKSAociBpbnQzMiwgZXJyIGVycm9yKSB7CiAJYXRvbWljLkFkZEludDY0KCZjb3VudGVyLCAxKQogCXJldHVybiBhcmcsIG5pbAogfQotZnVuYyAoaCAqaGFuZGxlcikgRWNob0k2NChhcmcgaW50NjQpIChyIGludDY0LCBlcnIgZXJyb3IpIHsKK2Z1bmMgKGggKmhhbmRsZXIpIEVjaG9JNjQoY3R4IGNvbnRleHQuQ29udGV4dCwgYXJnIGludDY0KSAociBpbnQ2NCwgZXJyIGVycm9yKSB7CiAJYXRvbWljLkFkZEludDY0KCZjb3VudGVyLCAxKQogCXJldHVybiBhcmcsIG5pbAogfQotZnVuYyAoaCAqaGFuZGxlcikgRWNob1N0cmluZyhhcmcgc3RyaW5nKSAociBzdHJpbmcsIGVyciBlcnJvcikgeworZnVuYyAoaCAqaGFuZGxlcikgRWNob1N0cmluZyhjdHggY29udGV4dC5Db250ZXh0LCBhcmcgc3RyaW5nKSAociBzdHJpbmcsIGVyciBlcnJvcikgewogCWF0b21pYy5BZGRJbnQ2NCgmY291bnRlciwgMSkKIAlyZXR1cm4gYXJnLCBuaWwKIH0KLWZ1bmMgKGggKmhhbmRsZXIpIEVjaG9MaXN0KGFyZyBbXWludDgpIChyIFtdaW50OCwgZXJyIGVycm9yKSB7CitmdW5jIChoICpoYW5kbGVyKSBFY2hvTGlzdChjdHggY29udGV4dC5Db250ZXh0LCBhcmcgW11pbnQ4KSAociBbXWludDgsIGVyciBlcnJvcikgewogCWF0b21pYy5BZGRJbnQ2NCgmY291bnRlciwgMSkKIAlyZXR1cm4gYXJnLCBuaWwKIH0KLWZ1bmMgKGggKmhhbmRsZXIpIEVjaG9TZXQoYXJnIG1hcFtpbnQ4XWJvb2wpIChyIG1hcFtpbnQ4XWJvb2wsIGVyciBlcnJvcikgeworZnVuYyAoaCAqaGFuZGxlcikgRWNob1NldChjdHggY29udGV4dC5Db250ZXh0LCBhcmcgbWFwW2ludDhdc3RydWN0e30pIChyIG1hcFtpbnQ4XXN0cnVjdHt9LCBlcnIgZXJyb3IpIHsKIAlhdG9taWMuQWRkSW50NjQoJmNvdW50ZXIsIDEpCiAJcmV0dXJuIGFyZywgbmlsCiB9Ci1mdW5jIChoICpoYW5kbGVyKSBFY2hvTWFwKGFyZyBtYXBbaW50OF1pbnQ4KSAociBtYXBbaW50OF1pbnQ4LCBlcnIgZXJyb3IpIHsKK2Z1bmMgKGggKmhhbmRsZXIpIEVjaG9NYXAoY3R4IGNvbnRleHQuQ29udGV4dCwgYXJnIG1hcFtpbnQ4XWludDgpIChyIG1hcFtpbnQ4XWludDgsIGVyciBlcnJvcikgewogCWF0b21pYy5BZGRJbnQ2NCgmY291bnRlciwgMSkKIAlyZXR1cm4gYXJnLCBuaWwKIH0KZGlmZiAtLWdpdCBhL3Rlc3QvZ28vc3JjL2Jpbi90ZXN0Y2xpZW50L21haW4uZ28gYi90ZXN0L2dvL3NyYy9iaW4vdGVzdGNsaWVudC9tYWluLmdvCmluZGV4IGQwZTVmZjguLjQzNTdlZTggMTAwNjQ0Ci0tLSBhL3Rlc3QvZ28vc3JjL2Jpbi90ZXN0Y2xpZW50L21haW4uZ28KKysrIGIvdGVzdC9nby9zcmMvYmluL3Rlc3RjbGllbnQvbWFpbi5nbwpAQCAtMjEsNiArMjEsNyBAQAogCiBpbXBvcnQgKAogCSJjb21tb24iCisJImNvbnRleHQiCiAJImZsYWciCiAJImdlbi90aHJpZnR0ZXN0IgogCXQgImxvZyIKQEAgLTM0LDExICszNSwxMiBAQAogdmFyIHRyYW5zcG9ydCA9IGZsYWcuU3RyaW5nKCJ0cmFuc3BvcnQiLCAiYnVmZmVyZWQiLCAiVHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkLCBodHRwLCB6bGliIikKIHZhciBwcm90b2NvbCA9IGZsYWcuU3RyaW5nKCJwcm90b2NvbCIsICJiaW5hcnkiLCAiUHJvdG9jb2w6IGJpbmFyeSwgY29tcGFjdCwganNvbiIpCiB2YXIgc3NsID0gZmxhZy5Cb29sKCJzc2wiLCBmYWxzZSwgIkVuY3J5cHRlZCBUcmFuc3BvcnQgdXNpbmcgU1NMIikKK3ZhciB6bGliID0gZmxhZy5Cb29sKCJ6bGliIiwgZmFsc2UsICJXcmFwcGVkIFRyYW5zcG9ydCB1c2luZyBabGliIikKIHZhciB0ZXN0bG9vcHMgPSBmbGFnLkludCgidGVzdGxvb3BzIiwgMSwgIk51bWJlciBvZiBUZXN0cyIpCiAKIGZ1bmMgbWFpbigpIHsKIAlmbGFnLlBhcnNlKCkKLQljbGllbnQsIGVyciA6PSBjb21tb24uU3RhcnRDbGllbnQoKmhvc3QsICpwb3J0LCAqZG9tYWluX3NvY2tldCwgKnRyYW5zcG9ydCwgKnByb3RvY29sLCAqc3NsKQorCWNsaWVudCwgXywgZXJyIDo9IGNvbW1vbi5TdGFydENsaWVudCgqaG9zdCwgKnBvcnQsICpkb21haW5fc29ja2V0LCAqdHJhbnNwb3J0LCAqcHJvdG9jb2wsICpzc2wpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWxmKCJVbmFibGUgdG8gc3RhcnQgY2xpZW50OiAiLCBlcnIpCiAJfQpAQCAtNjAsMTQgKzYyLDE1IEBACiB9CiAKIHZhciB4Y2VwdCA9ICZ0aHJpZnR0ZXN0LlhjZXB0aW9ue0Vycm9yQ29kZTogMTAwMSwgTWVzc2FnZTogIlhjZXB0aW9uIn0KK3ZhciBkZWZhdWx0Q3R4ID0gY29udGV4dC5CYWNrZ3JvdW5kKCkKIAogZnVuYyBjYWxsRXZlcnl0aGluZyhjbGllbnQgKnRocmlmdHRlc3QuVGhyaWZ0VGVzdENsaWVudCkgewogCXZhciBlcnIgZXJyb3IKLQlpZiBlcnIgPSBjbGllbnQuVGVzdFZvaWQoKTsgZXJyICE9IG5pbCB7CisJaWYgZXJyID0gY2xpZW50LlRlc3RWb2lkKGRlZmF1bHRDdHgpOyBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFZvaWQoKSBjYWxsOiAiLCBlcnIpCiAJfQogCi0JdGhpbmcsIGVyciA6PSBjbGllbnQuVGVzdFN0cmluZygidGhpbmciKQorCXRoaW5nLCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmcoZGVmYXVsdEN0eCwgInRoaW5nIikKIAlpZiBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFN0cmluZygpIGNhbGw6ICIsIGVycikKIAl9CkBAIC03NSwxNCArNzgsMTQgQEAKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdFN0cmluZygpIHJlc3VsdCwgZXhwZWN0ZWQgJ3RoaW5nJyBnb3QgJyVzJyAiLCB0aGluZykKIAl9CiAKLQlibCwgZXJyIDo9IGNsaWVudC5UZXN0Qm9vbCh0cnVlKQorCWJsLCBlcnIgOj0gY2xpZW50LlRlc3RCb29sKGRlZmF1bHRDdHgsIHRydWUpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RCb29sKCkgY2FsbDogIiwgZXJyKQogCX0KIAlpZiAhYmwgewogCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0Qm9vbCgpIHJlc3VsdCBleHBlY3RlZCB0cnVlLCBnb3QgJWYgIiwgYmwpCiAJfQotCWJsLCBlcnIgPSBjbGllbnQuVGVzdEJvb2woZmFsc2UpCisJYmwsIGVyciA9IGNsaWVudC5UZXN0Qm9vbChkZWZhdWx0Q3R4LCBmYWxzZSkKIAlpZiBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdEJvb2woKSBjYWxsOiAiLCBlcnIpCiAJfQpAQCAtOTAsNyArOTMsNyBAQAogCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0Qm9vbCgpIHJlc3VsdCBleHBlY3RlZCBmYWxzZSwgZ290ICVmICIsIGJsKQogCX0KIAotCWIsIGVyciA6PSBjbGllbnQuVGVzdEJ5dGUoNDIpCisJYiwgZXJyIDo9IGNsaWVudC5UZXN0Qnl0ZShkZWZhdWx0Q3R4LCA0MikKIAlpZiBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdEJ5dGUoKSBjYWxsOiAiLCBlcnIpCiAJfQpAQCAtOTgsNyArMTAxLDcgQEAKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdEJ5dGUoKSByZXN1bHQgZXhwZWN0ZWQgNDIsIGdvdCAlZCAiLCBiKQogCX0KIAotCWkzMiwgZXJyIDo9IGNsaWVudC5UZXN0STMyKDQyNDIpCisJaTMyLCBlcnIgOj0gY2xpZW50LlRlc3RJMzIoZGVmYXVsdEN0eCwgNDI0MikKIAlpZiBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdEkzMigpIGNhbGw6ICIsIGVycikKIAl9CkBAIC0xMDYsNyArMTA5LDcgQEAKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdEkzMigpIHJlc3VsdCBleHBlY3RlZCA0MjQyLCBnb3QgJWQgIiwgaTMyKQogCX0KIAotCWk2NCwgZXJyIDo9IGNsaWVudC5UZXN0STY0KDQyNDI0MikKKwlpNjQsIGVyciA6PSBjbGllbnQuVGVzdEk2NChkZWZhdWx0Q3R4LCA0MjQyNDIpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RJNjQoKSBjYWxsOiAiLCBlcnIpCiAJfQpAQCAtMTE0LDcgKzExNyw3IEBACiAJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIFRlc3RJNjQoKSByZXN1bHQgZXhwZWN0ZWQgNDI0MjQyLCBnb3QgJWQgIiwgaTY0KQogCX0KIAotCWQsIGVyciA6PSBjbGllbnQuVGVzdERvdWJsZSg0Mi40MikKKwlkLCBlcnIgOj0gY2xpZW50LlRlc3REb3VibGUoZGVmYXVsdEN0eCwgNDIuNDIpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3REb3VibGUoKSBjYWxsOiAiLCBlcnIpCiAJfQpAQCAtMTIyLDE0ICsxMjUsMjMgQEAKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdERvdWJsZSgpIHJlc3VsdCBleHBlY3RlZCA0Mi40MiwgZ290ICVmICIsIGQpCiAJfQogCi0JLy8gVE9ETzogYWRkIFRlc3RCaW5hcnkoKSBjYWxsCi0JCisJYmlub3V0IDo9IG1ha2UoW11ieXRlLCAyNTYpCisJZm9yIGkgOj0gMDsgaSA8IDI1NjsgaSsrIHsKKwkJYmlub3V0W2ldID0gYnl0ZShpKQorCX0KKwliaW4sIGVyciA6PSBjbGllbnQuVGVzdEJpbmFyeShkZWZhdWx0Q3R4LCBiaW5vdXQpCisJZm9yIGkgOj0gMDsgaSA8IDI1NjsgaSsrIHsKKwkJaWYgYmlub3V0W2ldICE9IGJpbltpXSB7CisJCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0QmluYXJ5KCkgcmVzdWx0IGV4cGVjdGVkICVkLCBnb3QgJWQgIiwgYmlub3V0W2ldLCBiaW5baV0pCisJCX0KKwl9CisKIAl4cyA6PSB0aHJpZnR0ZXN0Lk5ld1h0cnVjdCgpCiAJeHMuU3RyaW5nVGhpbmcgPSAidGhpbmciCiAJeHMuQnl0ZVRoaW5nID0gNDIKIAl4cy5JMzJUaGluZyA9IDQyNDIKIAl4cy5JNjRUaGluZyA9IDQyNDI0MgotCXhzcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RTdHJ1Y3QoeHMpCisJeHNyZXQsIGVyciA6PSBjbGllbnQuVGVzdFN0cnVjdChkZWZhdWx0Q3R4LCB4cykKIAlpZiBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFN0cnVjdCgpIGNhbGw6ICIsIGVycikKIAl9CkBAIC0xMzksNyArMTUxLDcgQEAKIAogCXgyIDo9IHRocmlmdHRlc3QuTmV3WHRydWN0MigpCiAJeDIuU3RydWN0VGhpbmcgPSB4cwotCXgycmV0LCBlcnIgOj0gY2xpZW50LlRlc3ROZXN0KHgyKQorCXgycmV0LCBlcnIgOj0gY2xpZW50LlRlc3ROZXN0KGRlZmF1bHRDdHgsIHgyKQogCWlmIGVyciAhPSBuaWwgewogCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0TmVzdCgpIGNhbGw6ICIsIGVycikKIAl9CkBAIC0xNDgsNyArMTYwLDcgQEAKIAl9CiAKIAltIDo9IG1hcFtpbnQzMl1pbnQzMnsxOiAyLCAzOiA0LCA1OiA0Mn0KLQltcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RNYXAobSkKKwltcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RNYXAoZGVmYXVsdEN0eCwgbSkKIAlpZiBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdE1hcCgpIGNhbGw6ICIsIGVycikKIAl9CkBAIC0xNTcsNyArMTY5LDcgQEAKIAl9CiAKIAlzbSA6PSBtYXBbc3RyaW5nXXN0cmluZ3siYSI6ICIyIiwgImIiOiAiYmxhaCIsICJzb21lIjogInRoaW5nIn0KLQlzbXJldCwgZXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nTWFwKHNtKQorCXNtcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmdNYXAoZGVmYXVsdEN0eCwgc20pCiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RTdHJpbmdNYXAoKSBjYWxsOiAiLCBlcnIpCiAJfQpAQCAtMTY1LDI1ICsxNzcsMzIgQEAKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdFN0cmluZ01hcCgpIHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwgc20sIHNtcmV0KQogCX0KIAotCXMgOj0gbWFwW2ludDMyXWJvb2x7MTogdHJ1ZSwgMjogdHJ1ZSwgNDI6IHRydWV9Ci0Jc3JldCwgZXJyIDo9IGNsaWVudC5UZXN0U2V0KHMpCisJcyA6PSBbXWludDMyezEsIDIsIDQyfQorCXNyZXQsIGVyciA6PSBjbGllbnQuVGVzdFNldChkZWZhdWx0Q3R4LCBzKQogCWlmIGVyciAhPSBuaWwgewogCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0U2V0KCkgY2FsbDogIiwgZXJyKQogCX0KLQlpZiAhcmVmbGVjdC5EZWVwRXF1YWwocywgc3JldCkgewotCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0U2V0KCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCBzLCBzcmV0KQorCS8vIFNldHMgY2FuIGJlIGluIGFueSBvcmRlciwgYnV0IEdvIHNsaWNlcyBhcmUgb3JkZXJlZCwgc28gcmVmbGVjdC5EZWVwRXF1YWwgd29uJ3Qgd29yay4KKwlzdGVtcCA6PSBtYXBbaW50MzJdc3RydWN0e317fQorCWZvciBfLCB2YWwgOj0gcmFuZ2UgcyB7CisJCXN0ZW1wW3ZhbF0gPSBzdHJ1Y3R7fXt9CisJfQorCWZvciBfLCB2YWwgOj0gcmFuZ2Ugc3JldCB7CisJCWlmIF8sIG9rIDo9IHN0ZW1wW3ZhbF07ICFvayB7CisJCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0U2V0KCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCBzLCBzcmV0KQorCQl9CiAJfQogCiAJbCA6PSBbXWludDMyezEsIDIsIDQyfQotCWxyZXQsIGVyciA6PSBjbGllbnQuVGVzdExpc3QobCkKKwlscmV0LCBlcnIgOj0gY2xpZW50LlRlc3RMaXN0KGRlZmF1bHRDdHgsIGwpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RMaXN0KCkgY2FsbDogIiwgZXJyKQogCX0KIAlpZiAhcmVmbGVjdC5EZWVwRXF1YWwobCwgbHJldCkgewotCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0U2V0KCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCBsLCBscmV0KQorCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0TGlzdCgpIHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwgbCwgbHJldCkKIAl9CiAKLQllcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RFbnVtKHRocmlmdHRlc3QuTnVtYmVyel9UV08pCisJZXJldCwgZXJyIDo9IGNsaWVudC5UZXN0RW51bShkZWZhdWx0Q3R4LCB0aHJpZnR0ZXN0Lk51bWJlcnpfVFdPKQogCWlmIGVyciAhPSBuaWwgewogCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0RW51bSgpIGNhbGw6ICIsIGVycikKIAl9CkBAIC0xOTEsNyArMjEwLDcgQEAKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdEVudW0oKSByZXN1bHQgZXhwZWN0ZWQgJSN2LCBnb3QgJSN2ICIsIHRocmlmdHRlc3QuTnVtYmVyel9UV08sIGVyZXQpCiAJfQogCi0JdHJldCwgZXJyIDo9IGNsaWVudC5UZXN0VHlwZWRlZih0aHJpZnR0ZXN0LlVzZXJJZCg0MikpCisJdHJldCwgZXJyIDo9IGNsaWVudC5UZXN0VHlwZWRlZihkZWZhdWx0Q3R4LCB0aHJpZnR0ZXN0LlVzZXJJZCg0MikpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RUeXBlZGVmKCkgY2FsbDogIiwgZXJyKQogCX0KQEAgLTE5OSw3ICsyMTgsNyBAQAogCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0VHlwZWRlZigpIHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwgdGhyaWZ0dGVzdC5Vc2VySWQoNDIpLCB0cmV0KQogCX0KIAotCW1hcG1hcCwgZXJyIDo9IGNsaWVudC5UZXN0TWFwTWFwKDQyKQorCW1hcG1hcCwgZXJyIDo9IGNsaWVudC5UZXN0TWFwTWFwKGRlZmF1bHRDdHgsIDQyKQogCWlmIGVyciAhPSBuaWwgewogCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0TWFwTWFwKCkgY2FsbDogIiwgZXJyKQogCX0KQEAgLTIwOCw0NCArMjI3LDQ0IEBACiAJfQogCiAJY3JhenkgOj0gdGhyaWZ0dGVzdC5OZXdJbnNhbml0eSgpCi0JY3JhenkuVXNlck1hcCA9IG1hcFt0aHJpZnR0ZXN0Lk51bWJlcnpddGhyaWZ0dGVzdC5Vc2VySWQgewotCQl0aHJpZnR0ZXN0Lk51bWJlcnpfRklWRTogNSwKKwljcmF6eS5Vc2VyTWFwID0gbWFwW3RocmlmdHRlc3QuTnVtYmVyel10aHJpZnR0ZXN0LlVzZXJJZHsKKwkJdGhyaWZ0dGVzdC5OdW1iZXJ6X0ZJVkU6ICA1LAogCQl0aHJpZnR0ZXN0Lk51bWJlcnpfRUlHSFQ6IDgsCiAJfQogCXRydWNrMSA6PSB0aHJpZnR0ZXN0Lk5ld1h0cnVjdCgpCiAJdHJ1Y2sxLlN0cmluZ1RoaW5nID0gIkdvb2RieWU0IgotCXRydWNrMS5CeXRlVGhpbmcgPSA0OwotCXRydWNrMS5JMzJUaGluZyA9IDQ7Ci0JdHJ1Y2sxLkk2NFRoaW5nID0gNDsKKwl0cnVjazEuQnl0ZVRoaW5nID0gNAorCXRydWNrMS5JMzJUaGluZyA9IDQKKwl0cnVjazEuSTY0VGhpbmcgPSA0CiAJdHJ1Y2syIDo9IHRocmlmdHRlc3QuTmV3WHRydWN0KCkKIAl0cnVjazIuU3RyaW5nVGhpbmcgPSAiSGVsbG8yIgotCXRydWNrMi5CeXRlVGhpbmcgPSAyOwotCXRydWNrMi5JMzJUaGluZyA9IDI7Ci0JdHJ1Y2syLkk2NFRoaW5nID0gMjsKLQljcmF6eS5YdHJ1Y3RzID0gW10qdGhyaWZ0dGVzdC5YdHJ1Y3QgeworCXRydWNrMi5CeXRlVGhpbmcgPSAyCisJdHJ1Y2syLkkzMlRoaW5nID0gMgorCXRydWNrMi5JNjRUaGluZyA9IDIKKwljcmF6eS5YdHJ1Y3RzID0gW10qdGhyaWZ0dGVzdC5YdHJ1Y3R7CiAJCXRydWNrMSwKIAkJdHJ1Y2syLAogCX0KLQlpbnNhbml0eSwgZXJyIDo9IGNsaWVudC5UZXN0SW5zYW5pdHkoY3JhenkpCisJaW5zYW5pdHksIGVyciA6PSBjbGllbnQuVGVzdEluc2FuaXR5KGRlZmF1bHRDdHgsIGNyYXp5KQogCWlmIGVyciAhPSBuaWwgewogCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0SW5zYW5pdHkoKSBjYWxsOiAiLCBlcnIpCiAJfQogCWlmICFyZWZsZWN0LkRlZXBFcXVhbChjcmF6eSwgaW5zYW5pdHlbMV1bMl0pIHsKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdEluc2FuaXR5KCkgZmlyc3QgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLAotCQljcmF6eSwKLQkJaW5zYW5pdHlbMV1bMl0pCisJCQljcmF6eSwKKwkJCWluc2FuaXR5WzFdWzJdKQogCX0KIAlpZiAhcmVmbGVjdC5EZWVwRXF1YWwoY3JhenksIGluc2FuaXR5WzFdWzNdKSB7CiAJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIFRlc3RJbnNhbml0eSgpIHNlY29uZCByZXN1bHQgZXhwZWN0ZWQgJSN2LCBnb3QgJSN2ICIsCi0JCWNyYXp5LAotCQlpbnNhbml0eVsxXVszXSkKKwkJCWNyYXp5LAorCQkJaW5zYW5pdHlbMV1bM10pCiAJfQogCWlmIGxlbihpbnNhbml0eVsyXVs2XS5Vc2VyTWFwKSA+IDAgfHwgbGVuKGluc2FuaXR5WzJdWzZdLlh0cnVjdHMpID4gMCB7CiAJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIFRlc3RJbnNhbml0eSgpIG5vbi1lbXB0eSByZXN1bHQgZ290ICUjdiAiLAotCQlpbnNhbml0eVsyXVs2XSkKKwkJCWluc2FuaXR5WzJdWzZdKQogCX0KIAotCXh4c3JldCwgZXJyIDo9IGNsaWVudC5UZXN0TXVsdGkoNDIsIDQyNDIsIDQyNDI0MiwgbWFwW2ludDE2XXN0cmluZ3sxOiAiYmxhaCIsIDI6ICJ0aGluZyJ9LCB0aHJpZnR0ZXN0Lk51bWJlcnpfRUlHSFQsIHRocmlmdHRlc3QuVXNlcklkKDI0KSkKKwl4eHNyZXQsIGVyciA6PSBjbGllbnQuVGVzdE11bHRpKGRlZmF1bHRDdHgsIDQyLCA0MjQyLCA0MjQyNDIsIG1hcFtpbnQxNl1zdHJpbmd7MTogImJsYWgiLCAyOiAidGhpbmcifSwgdGhyaWZ0dGVzdC5OdW1iZXJ6X0VJR0hULCB0aHJpZnR0ZXN0LlVzZXJJZCgyNCkpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RNdWx0aSgpIGNhbGw6ICIsIGVycikKIAl9CkBAIC0yNTMsNyArMjcyLDcgQEAKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdE11bHRpKCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCB4eHMsIHh4c3JldCkKIAl9CiAKLQllcnIgPSBjbGllbnQuVGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iKQorCWVyciA9IGNsaWVudC5UZXN0RXhjZXB0aW9uKGRlZmF1bHRDdHgsICJYY2VwdGlvbiIpCiAJaWYgZXJyID09IG5pbCB7CiAJCXQuRmF0YWxmKCJFeHBlY3RpbmcgZXhjZXB0aW9uIGluIFRlc3RFeGNlcHRpb24oKSBjYWxsIikKIAl9CkBAIC0yNjEsMTMgKzI4MCwxMyBAQAogCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0RXhjZXB0aW9uKCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCB4Y2VwdCwgZXJyKQogCX0KIAotCWVyciA9IGNsaWVudC5UZXN0RXhjZXB0aW9uKCJURXhjZXB0aW9uIikKKwllcnIgPSBjbGllbnQuVGVzdEV4Y2VwdGlvbihkZWZhdWx0Q3R4LCAiVEV4Y2VwdGlvbiIpCiAJXywgb2sgOj0gZXJyLih0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKQogCWlmIGVyciA9PSBuaWwgfHwgIW9rIHsKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdEV4Y2VwdGlvbigpIHJlc3VsdCBleHBlY3RlZCBBcHBsaWNhdGlvbkVycm9yLCBnb3QgJSN2ICIsIGVycikKIAl9CiAKLQlpZ24sIGVyciA6PSBjbGllbnQuVGVzdE11bHRpRXhjZXB0aW9uKCJYY2VwdGlvbiIsICJpZ25vcmVtZSIpCisJaWduLCBlcnIgOj0gY2xpZW50LlRlc3RNdWx0aUV4Y2VwdGlvbihkZWZhdWx0Q3R4LCAiWGNlcHRpb24iLCAiaWdub3JlbWUiKQogCWlmIGlnbiAhPSBuaWwgfHwgZXJyID09IG5pbCB7CiAJCXQuRmF0YWxmKCJFeHBlY3RpbmcgZXhjZXB0aW9uIGluIFRlc3RNdWx0aUV4Y2VwdGlvbigpIGNhbGwiKQogCX0KQEAgLTI3NSw3ICsyOTQsNyBAQAogCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0TXVsdGlFeGNlcHRpb24oKSAlI3YgIiwgZXJyKQogCX0KIAotCWlnbiwgZXJyID0gY2xpZW50LlRlc3RNdWx0aUV4Y2VwdGlvbigiWGNlcHRpb24yIiwgImlnbm9yZW1lIikKKwlpZ24sIGVyciA9IGNsaWVudC5UZXN0TXVsdGlFeGNlcHRpb24oZGVmYXVsdEN0eCwgIlhjZXB0aW9uMiIsICJpZ25vcmVtZSIpCiAJaWYgaWduICE9IG5pbCB8fCBlcnIgPT0gbmlsIHsKIAkJdC5GYXRhbGYoIkV4cGVjdGluZyBleGNlcHRpb24gaW4gVGVzdE11bHRpRXhjZXB0aW9uKCkgY2FsbCIpCiAJfQpAQCAtMjg1LDEzICszMDQsMTMgQEAKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdE11bHRpRXhjZXB0aW9uKCkgJSN2ICIsIGVycikKIAl9CiAKLQllcnIgPSBjbGllbnQuVGVzdE9uZXdheSgyKQorCWVyciA9IGNsaWVudC5UZXN0T25ld2F5KGRlZmF1bHRDdHgsIDIpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RPbmV3YXkoKSBjYWxsOiAiLCBlcnIpCiAJfQogCiAJLy9NYWtlIHN1cmUgdGhlIGNvbm5lY3Rpb24gc3RpbGwgYWxpdmUKLQlpZiBlcnIgPSBjbGllbnQuVGVzdFZvaWQoKTsgZXJyICE9IG5pbCB7CisJaWYgZXJyID0gY2xpZW50LlRlc3RWb2lkKGRlZmF1bHRDdHgpOyBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFZvaWQoKSBjYWxsOiAiLCBlcnIpCiAJfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC9nby9zcmMvYmluL3Rlc3RzZXJ2ZXIvbWFpbi5nbyBiL3Rlc3QvZ28vc3JjL2Jpbi90ZXN0c2VydmVyL21haW4uZ28KaW5kZXggMjkxZGZmNS4uY2EyZDk2NyAxMDA2NDQKLS0tIGEvdGVzdC9nby9zcmMvYmluL3Rlc3RzZXJ2ZXIvbWFpbi5nbworKysgYi90ZXN0L2dvL3NyYy9iaW4vdGVzdHNlcnZlci9tYWluLmdvCkBAIC0yMiw3ICsyMiwxMCBAQAogaW1wb3J0ICgKIAkiY29tbW9uIgogCSJmbGFnIgorCSJmbXQiCiAJImxvZyIKKwkibmV0L2h0dHAiCisJInRocmlmdCIKICkKIAogdmFyIGhvc3QgPSBmbGFnLlN0cmluZygiaG9zdCIsICJsb2NhbGhvc3QiLCAiSG9zdCB0byBjb25uZWN0IikKQEAgLTMxLDEzICszNCwzOCBAQAogdmFyIHRyYW5zcG9ydCA9IGZsYWcuU3RyaW5nKCJ0cmFuc3BvcnQiLCAiYnVmZmVyZWQiLCAiVHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkLCBodHRwLCB6bGliIikKIHZhciBwcm90b2NvbCA9IGZsYWcuU3RyaW5nKCJwcm90b2NvbCIsICJiaW5hcnkiLCAiUHJvdG9jb2w6IGJpbmFyeSwgY29tcGFjdCwganNvbiIpCiB2YXIgc3NsID0gZmxhZy5Cb29sKCJzc2wiLCBmYWxzZSwgIkVuY3J5cHRlZCBUcmFuc3BvcnQgdXNpbmcgU1NMIikKK3ZhciB6bGliID0gZmxhZy5Cb29sKCJ6bGliIiwgZmFsc2UsICJXcmFwcGVkIFRyYW5zcG9ydCB1c2luZyBabGliIikKIHZhciBjZXJ0UGF0aCA9IGZsYWcuU3RyaW5nKCJjZXJ0UGF0aCIsICJrZXlzIiwgIkRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIFNTTCBjZXJ0aWZpY2F0ZXMiKQogCiBmdW5jIG1haW4oKSB7CiAJZmxhZy5QYXJzZSgpCi0Jc2VydmVyLCBlcnIgOj0gY29tbW9uLlN0YXJ0U2VydmVyKCpob3N0LCAqcG9ydCwgKmRvbWFpbl9zb2NrZXQsICp0cmFuc3BvcnQsICpwcm90b2NvbCwgKnNzbCwgKmNlcnRQYXRoLCBjb21tb24uUHJpbnRpbmdIYW5kbGVyKQorCisJcHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSwgZXJyIDo9IGNvbW1vbi5HZXRTZXJ2ZXJQYXJhbXMoKmhvc3QsICpwb3J0LCAqZG9tYWluX3NvY2tldCwgKnRyYW5zcG9ydCwgKnByb3RvY29sLCAqc3NsLCAqY2VydFBhdGgsIGNvbW1vbi5QcmludGluZ0hhbmRsZXIpCisKIAlpZiBlcnIgIT0gbmlsIHsKLQkJbG9nLkZhdGFsZigiVW5hYmxlIHRvIHN0YXJ0IHNlcnZlcjogIiwgZXJyKQorCQlsb2cuRmF0YWxmKCJVbmFibGUgdG8gcHJvY2VzcyBzZXJ2ZXIgcGFyYW1zOiAiLCBlcnIpCiAJfQotCXNlcnZlci5TZXJ2ZSgpCisKKwlpZiAqdHJhbnNwb3J0ID09ICJodHRwIiB7CisJCWh0dHAuSGFuZGxlRnVuYygiLyIsIHRocmlmdC5OZXdUaHJpZnRIYW5kbGVyRnVuYyhwcm9jZXNzb3IsIHByb3RvY29sRmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KSkKKworCQlpZiAqc3NsIHsKKwkJCWVyciA6PSBodHRwLkxpc3RlbkFuZFNlcnZlVExTKGZtdC5TcHJpbnRmKCI6JWQiLCAqcG9ydCksCisJCQkJKmNlcnRQYXRoKyIvc2VydmVyLnBlbSIsICpjZXJ0UGF0aCsiL3NlcnZlci5rZXkiLCBuaWwpCisKKwkJCWlmIGVyciAhPSBuaWwgeworCQkJCWZtdC5QcmludGxuKGVycikKKwkJCQlyZXR1cm4KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWh0dHAuTGlzdGVuQW5kU2VydmUoZm10LlNwcmludGYoIjolZCIsICpwb3J0KSwgbmlsKQorCQl9CisJfSBlbHNlIHsKKwkJc2VydmVyIDo9IHRocmlmdC5OZXdUU2ltcGxlU2VydmVyNChwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KQorCQlpZiBlcnIgPSBzZXJ2ZXIuTGlzdGVuKCk7IGVyciAhPSBuaWwgeworCQkJcmV0dXJuCisJCX0KKwkJZ28gc2VydmVyLkFjY2VwdExvb3AoKQorCQlzZXJ2ZXIuU2VydmUoKQorCX0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvZ28vc3JjL2NvbW1vbi9jbGllbnQuZ28gYi90ZXN0L2dvL3NyYy9jb21tb24vY2xpZW50LmdvCmluZGV4IGU1NWRjNmQuLjIzNmNlNDMgMTAwNjQ0Ci0tLSBhL3Rlc3QvZ28vc3JjL2NvbW1vbi9jbGllbnQuZ28KKysrIGIvdGVzdC9nby9zcmMvY29tbW9uL2NsaWVudC5nbwpAQCAtMjUsNiArMjUsNyBAQAogCSJmbGFnIgogCSJmbXQiCiAJImdlbi90aHJpZnR0ZXN0IgorCSJuZXQvaHR0cCIKIAkidGhyaWZ0IgogKQogCkBAIC00MCw3ICs0MSw3IEBACiAJZG9tYWluX3NvY2tldCBzdHJpbmcsCiAJdHJhbnNwb3J0IHN0cmluZywKIAlwcm90b2NvbCBzdHJpbmcsCi0Jc3NsIGJvb2wpIChjbGllbnQgKnRocmlmdHRlc3QuVGhyaWZ0VGVzdENsaWVudCwgZXJyIGVycm9yKSB7CisJc3NsIGJvb2wpIChjbGllbnQgKnRocmlmdHRlc3QuVGhyaWZ0VGVzdENsaWVudCwgdHJhbnMgdGhyaWZ0LlRUcmFuc3BvcnQsIGVyciBlcnJvcikgewogCiAJaG9zdFBvcnQgOj0gZm10LlNwcmludGYoIiVzOiVkIiwgaG9zdCwgcG9ydCkKIApAQCAtNTUsMTIgKzU2LDExIEBACiAJY2FzZSAiYmluYXJ5IjoKIAkJcHJvdG9jb2xGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RCaW5hcnlQcm90b2NvbEZhY3RvcnlEZWZhdWx0KCkKIAlkZWZhdWx0OgotCQlyZXR1cm4gbmlsLCBmbXQuRXJyb3JmKCJJbnZhbGlkIHByb3RvY29sIHNwZWNpZmllZCAlcyIsIHByb3RvY29sKQorCQlyZXR1cm4gbmlsLCBuaWwsIGZtdC5FcnJvcmYoIkludmFsaWQgcHJvdG9jb2wgc3BlY2lmaWVkICVzIiwgcHJvdG9jb2wpCiAJfQogCWlmIGRlYnVnQ2xpZW50UHJvdG9jb2wgewogCQlwcm90b2NvbEZhY3RvcnkgPSB0aHJpZnQuTmV3VERlYnVnUHJvdG9jb2xGYWN0b3J5KHByb3RvY29sRmFjdG9yeSwgImNsaWVudDoiKQogCX0KLQl2YXIgdHJhbnMgdGhyaWZ0LlRUcmFuc3BvcnQKIAlpZiBzc2wgewogCQl0cmFucywgZXJyID0gdGhyaWZ0Lk5ld1RTU0xTb2NrZXQoaG9zdFBvcnQsICZ0bHMuQ29uZmlne0luc2VjdXJlU2tpcFZlcmlmeTogdHJ1ZX0pCiAJfSBlbHNlIHsKQEAgLTcxLDEzICs3MSwxOSBAQAogCQl9CiAJfQogCWlmIGVyciAhPSBuaWwgewotCQlyZXR1cm4gbmlsLCBlcnIKKwkJcmV0dXJuIG5pbCwgbmlsLCBlcnIKIAl9CiAJc3dpdGNoIHRyYW5zcG9ydCB7CiAJY2FzZSAiaHR0cCI6Ci0JCXRyYW5zLCBlcnIgPSB0aHJpZnQuTmV3VEh0dHBDbGllbnQoZm10LlNwcmludGYoImh0dHA6Ly8lcy9zZXJ2aWNlIiwgaG9zdFBvcnQpKQotCQlpZiBlcnIgIT0gbmlsIHsKLQkJCXJldHVybiBuaWwsIGVycgorCQlpZiBzc2wgeworCQkJdHIgOj0gJmh0dHAuVHJhbnNwb3J0eworCQkJCVRMU0NsaWVudENvbmZpZzogJnRscy5Db25maWd7SW5zZWN1cmVTa2lwVmVyaWZ5OiB0cnVlfSwKKwkJCX0KKwkJCWNsaWVudCA6PSAmaHR0cC5DbGllbnR7VHJhbnNwb3J0OiB0cn0KKwkJCXRyYW5zLCBlcnIgPSB0aHJpZnQuTmV3VEh0dHBQb3N0Q2xpZW50V2l0aE9wdGlvbnMoZm10LlNwcmludGYoImh0dHBzOi8vJXMvIiwgaG9zdFBvcnQpLCB0aHJpZnQuVEh0dHBDbGllbnRPcHRpb25ze0NsaWVudDogY2xpZW50fSkKKwkJCWZtdC5QcmludGxuKGhvc3RQb3J0KQorCQl9IGVsc2UgeworCQkJdHJhbnMsIGVyciA9IHRocmlmdC5OZXdUSHR0cFBvc3RDbGllbnQoZm10LlNwcmludGYoImh0dHA6Ly8lcy8iLCBob3N0UG9ydCkpCiAJCX0KIAljYXNlICJmcmFtZWQiOgogCQl0cmFucyA9IHRocmlmdC5OZXdURnJhbWVkVHJhbnNwb3J0KHRyYW5zKQpAQCAtODUsMTggKzkxLDE5IEBACiAJCXRyYW5zID0gdGhyaWZ0Lk5ld1RCdWZmZXJlZFRyYW5zcG9ydCh0cmFucywgODE5MikKIAljYXNlICJ6bGliIjoKIAkJdHJhbnMsIGVyciA9IHRocmlmdC5OZXdUWmxpYlRyYW5zcG9ydCh0cmFucywgemxpYi5CZXN0Q29tcHJlc3Npb24pCi0JCWlmIGVyciAhPSBuaWwgewotCQkJcmV0dXJuIG5pbCwgZXJyCi0JCX0KIAljYXNlICIiOgogCQl0cmFucyA9IHRyYW5zCiAJZGVmYXVsdDoKLQkJcmV0dXJuIG5pbCwgZm10LkVycm9yZigiSW52YWxpZCB0cmFuc3BvcnQgc3BlY2lmaWVkICVzIiwgdHJhbnNwb3J0KQorCQlyZXR1cm4gbmlsLCBuaWwsIGZtdC5FcnJvcmYoIkludmFsaWQgdHJhbnNwb3J0IHNwZWNpZmllZCAlcyIsIHRyYW5zcG9ydCkKIAl9Ci0KKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIG5pbCwgbmlsLCBlcnIKKwl9CiAJaWYgZXJyID0gdHJhbnMuT3BlbigpOyBlcnIgIT0gbmlsIHsKLQkJcmV0dXJuIG5pbCwgZXJyCisJCXJldHVybiBuaWwsIG5pbCwgZXJyCiAJfQotCWNsaWVudCA9IHRocmlmdHRlc3QuTmV3VGhyaWZ0VGVzdENsaWVudEZhY3RvcnkodHJhbnMsIHByb3RvY29sRmFjdG9yeSkKKwlpcHJvdCA6PSBwcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnMpCisJb3Byb3QgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKQorCWNsaWVudCA9IHRocmlmdHRlc3QuTmV3VGhyaWZ0VGVzdENsaWVudCh0aHJpZnQuTmV3VFN0YW5kYXJkQ2xpZW50KGlwcm90LCBvcHJvdCkpCiAJcmV0dXJuCiB9CmRpZmYgLS1naXQgYS90ZXN0L2dvL3NyYy9jb21tb24vY2xpZW50c2VydmVyX3Rlc3QuZ28gYi90ZXN0L2dvL3NyYy9jb21tb24vY2xpZW50c2VydmVyX3Rlc3QuZ28KaW5kZXggNWM4OTE1YS4uOWY5M2M0YyAxMDA2NDQKLS0tIGEvdGVzdC9nby9zcmMvY29tbW9uL2NsaWVudHNlcnZlcl90ZXN0LmdvCisrKyBiL3Rlc3QvZ28vc3JjL2NvbW1vbi9jbGllbnRzZXJ2ZXJfdGVzdC5nbwpAQCAtMjAsMTIgKzIwLDE1IEBACiBwYWNrYWdlIGNvbW1vbgogCiBpbXBvcnQgKAotCSJnaXRodWIuY29tL2dvbGFuZy9tb2NrL2dvbW9jayIKKwkiY29udGV4dCIKIAkiZXJyb3JzIgogCSJnZW4vdGhyaWZ0dGVzdCIKIAkicmVmbGVjdCIKKwkic3luYyIKIAkidGVzdGluZyIKIAkidGhyaWZ0IgorCisJImdpdGh1Yi5jb20vZ29sYW5nL21vY2svZ29tb2NrIgogKQogCiB0eXBlIHRlc3RfdW5pdCBzdHJ1Y3QgewpAQCAtMzgsNyArNDEsNyBAQAogfQogCiB2YXIgdW5pdHMgPSBbXXRlc3RfdW5pdHsKLQl7IjEyNy4wLjAuMSIsIDkwOTAsICIiLCAiIiwgImJpbmFyeSIsIGZhbHNlfSwKKwl7IjEyNy4wLjAuMSIsIDkwOTUsICIiLCAiIiwgImJpbmFyeSIsIGZhbHNlfSwKIAl7IjEyNy4wLjAuMSIsIDkwOTEsICIiLCAiIiwgImNvbXBhY3QiLCBmYWxzZX0sCiAJeyIxMjcuMC4wLjEiLCA5MDkyLCAiIiwgIiIsICJiaW5hcnkiLCB0cnVlfSwKIAl7IjEyNy4wLjAuMSIsIDkwOTMsICIiLCAiIiwgImNvbXBhY3QiLCB0cnVlfSwKQEAgLTQ2LDI4ICs0OSwzNyBAQAogCiBmdW5jIFRlc3RBbGxDb25uZWN0aW9uKHQgKnRlc3RpbmcuVCkgewogCWNlcnRQYXRoID0gIi4uLy4uLy4uL2tleXMiCisJd2cgOj0gJnN5bmMuV2FpdEdyb3Vwe30KKwl3Zy5BZGQobGVuKHVuaXRzKSkKIAlmb3IgXywgdW5pdCA6PSByYW5nZSB1bml0cyB7Ci0JCXQuTG9nZigiJSN2IiwgdW5pdCkKLQkJZG9Vbml0KHQsICZ1bml0KQorCQlnbyBmdW5jKHUgdGVzdF91bml0KSB7CisJCQlkZWZlciB3Zy5Eb25lKCkKKwkJCWRvVW5pdCh0LCAmdSkKKwkJfSh1bml0KQogCX0KKwl3Zy5XYWl0KCkKIH0KIAogZnVuYyBkb1VuaXQodCAqdGVzdGluZy5ULCB1bml0ICp0ZXN0X3VuaXQpIHsKIAljdHJsIDo9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCiAJZGVmZXIgY3RybC5GaW5pc2goKQogCWhhbmRsZXIgOj0gTmV3TW9ja1RocmlmdFRlc3QoY3RybCkKLQlzZXJ2ZXIsIGVyciA6PSBTdGFydFNlcnZlcih1bml0Lmhvc3QsIHVuaXQucG9ydCwgdW5pdC5kb21haW5fc29ja2V0LCB1bml0LnRyYW5zcG9ydCwgdW5pdC5wcm90b2NvbCwgdW5pdC5zc2wsICIuLi8uLi8uLi9rZXlzIiwgaGFuZGxlcikKLQlpZiBlcnIgIT0gbmlsIHsKLQkJdC5FcnJvcmYoIlVuYWJsZSB0byBzdGFydCBzZXJ2ZXIiLCBlcnIpCi0JCXQuRmFpbE5vdygpCisKKwlwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5LCBlcnIgOj0gR2V0U2VydmVyUGFyYW1zKHVuaXQuaG9zdCwgdW5pdC5wb3J0LCB1bml0LmRvbWFpbl9zb2NrZXQsIHVuaXQudHJhbnNwb3J0LCB1bml0LnByb3RvY29sLCB1bml0LnNzbCwgIi4uLy4uLy4uL2tleXMiLCBoYW5kbGVyKQorCisJc2VydmVyIDo9IHRocmlmdC5OZXdUU2ltcGxlU2VydmVyNChwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KQorCWlmIGVyciA9IHNlcnZlci5MaXN0ZW4oKTsgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCJVbmFibGUgdG8gc3RhcnQgc2VydmVyOiAldiIsIGVycikKKwkJcmV0dXJuCiAJfQorCWdvIHNlcnZlci5BY2NlcHRMb29wKCkKIAlkZWZlciBzZXJ2ZXIuU3RvcCgpCi0JY2xpZW50LCBlcnIgOj0gU3RhcnRDbGllbnQodW5pdC5ob3N0LCB1bml0LnBvcnQsIHVuaXQuZG9tYWluX3NvY2tldCwgdW5pdC50cmFuc3BvcnQsIHVuaXQucHJvdG9jb2wsIHVuaXQuc3NsKQorCWNsaWVudCwgdHJhbnMsIGVyciA6PSBTdGFydENsaWVudCh1bml0Lmhvc3QsIHVuaXQucG9ydCwgdW5pdC5kb21haW5fc29ja2V0LCB1bml0LnRyYW5zcG9ydCwgdW5pdC5wcm90b2NvbCwgdW5pdC5zc2wpCiAJaWYgZXJyICE9IG5pbCB7Ci0JCXQuRXJyb3JmKCJVbmFibGUgdG8gc3RhcnQgY2xpZW50IiwgZXJyKQotCQl0LkZhaWxOb3coKQorCQl0LkVycm9yZigiVW5hYmxlIHRvIHN0YXJ0IGNsaWVudDogJXYiLCBlcnIpCisJCXJldHVybgogCX0KLQlkZWZlciBjbGllbnQuVHJhbnNwb3J0LkNsb3NlKCkKKwlkZWZlciB0cmFucy5DbG9zZSgpCiAJY2FsbEV2ZXJ5dGhpbmdXaXRoTW9jayh0LCBjbGllbnQsIGhhbmRsZXIpCiB9CiAKQEAgLTg0LDEwNiArOTYsMTA3IEBACiB9CiAKIHZhciB4Y2VwdCA9ICZ0aHJpZnR0ZXN0LlhjZXB0aW9ue0Vycm9yQ29kZTogMTAwMSwgTWVzc2FnZTogInNvbWUifQordmFyIGRlZmF1bHRDdHggPSBjb250ZXh0LkJhY2tncm91bmQoKQogCiBmdW5jIGNhbGxFdmVyeXRoaW5nV2l0aE1vY2sodCAqdGVzdGluZy5ULCBjbGllbnQgKnRocmlmdHRlc3QuVGhyaWZ0VGVzdENsaWVudCwgaGFuZGxlciAqTW9ja1RocmlmdFRlc3QpIHsKIAlnb21vY2suSW5PcmRlcigKLQkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0Vm9pZCgpLAotCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RTdHJpbmcoInRoaW5nIikuUmV0dXJuKCJ0aGluZyIsIG5pbCksCi0JCWhhbmRsZXIuRVhQRUNUKCkuVGVzdEJvb2wodHJ1ZSkuUmV0dXJuKHRydWUsIG5pbCksCi0JCWhhbmRsZXIuRVhQRUNUKCkuVGVzdEJvb2woZmFsc2UpLlJldHVybihmYWxzZSwgbmlsKSwKLQkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0Qnl0ZShpbnQ4KDQyKSkuUmV0dXJuKGludDgoNDIpLCBuaWwpLAotCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RJMzIoaW50MzIoNDI0MikpLlJldHVybihpbnQzMig0MjQyKSwgbmlsKSwKLQkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0STY0KGludDY0KDQyNDI0MikpLlJldHVybihpbnQ2NCg0MjQyNDIpLCBuaWwpLAorCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RWb2lkKGdvbW9jay5BbnkoKSksCisJCWhhbmRsZXIuRVhQRUNUKCkuVGVzdFN0cmluZyhnb21vY2suQW55KCksICJ0aGluZyIpLlJldHVybigidGhpbmciLCBuaWwpLAorCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RCb29sKGdvbW9jay5BbnkoKSwgdHJ1ZSkuUmV0dXJuKHRydWUsIG5pbCksCisJCWhhbmRsZXIuRVhQRUNUKCkuVGVzdEJvb2woZ29tb2NrLkFueSgpLCBmYWxzZSkuUmV0dXJuKGZhbHNlLCBuaWwpLAorCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RCeXRlKGdvbW9jay5BbnkoKSwgaW50OCg0MikpLlJldHVybihpbnQ4KDQyKSwgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0STMyKGdvbW9jay5BbnkoKSwgaW50MzIoNDI0MikpLlJldHVybihpbnQzMig0MjQyKSwgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0STY0KGdvbW9jay5BbnkoKSwgaW50NjQoNDI0MjQyKSkuUmV0dXJuKGludDY0KDQyNDI0MiksIG5pbCksCiAJCS8vIFRPRE86IGFkZCBUZXN0QmluYXJ5KCkKLQkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0RG91YmxlKGZsb2F0NjQoNDIuNDIpKS5SZXR1cm4oZmxvYXQ2NCg0Mi40MiksIG5pbCksCi0JCWhhbmRsZXIuRVhQRUNUKCkuVGVzdFN0cnVjdCgmdGhyaWZ0dGVzdC5YdHJ1Y3R7U3RyaW5nVGhpbmc6ICJ0aGluZyIsIEJ5dGVUaGluZzogNDIsIEkzMlRoaW5nOiA0MjQyLCBJNjRUaGluZzogNDI0MjQyfSkuUmV0dXJuKCZ0aHJpZnR0ZXN0Llh0cnVjdHtTdHJpbmdUaGluZzogInRoaW5nIiwgQnl0ZVRoaW5nOiA0MiwgSTMyVGhpbmc6IDQyNDIsIEk2NFRoaW5nOiA0MjQyNDJ9LCBuaWwpLAotCQloYW5kbGVyLkVYUEVDVCgpLlRlc3ROZXN0KCZ0aHJpZnR0ZXN0Llh0cnVjdDJ7U3RydWN0VGhpbmc6ICZ0aHJpZnR0ZXN0Llh0cnVjdHtTdHJpbmdUaGluZzogInRoaW5nIiwgQnl0ZVRoaW5nOiA0MiwgSTMyVGhpbmc6IDQyNDIsIEk2NFRoaW5nOiA0MjQyNDJ9fSkuUmV0dXJuKCZ0aHJpZnR0ZXN0Llh0cnVjdDJ7U3RydWN0VGhpbmc6ICZ0aHJpZnR0ZXN0Llh0cnVjdHtTdHJpbmdUaGluZzogInRoaW5nIiwgQnl0ZVRoaW5nOiA0MiwgSTMyVGhpbmc6IDQyNDIsIEk2NFRoaW5nOiA0MjQyNDJ9fSwgbmlsKSwKLQkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0TWFwKG1hcFtpbnQzMl1pbnQzMnsxOiAyLCAzOiA0LCA1OiA0Mn0pLlJldHVybihtYXBbaW50MzJdaW50MzJ7MTogMiwgMzogNCwgNTogNDJ9LCBuaWwpLAotCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RTdHJpbmdNYXAobWFwW3N0cmluZ11zdHJpbmd7ImEiOiAiMiIsICJiIjogImJsYWgiLCAic29tZSI6ICJ0aGluZyJ9KS5SZXR1cm4obWFwW3N0cmluZ11zdHJpbmd7ImEiOiAiMiIsICJiIjogImJsYWgiLCAic29tZSI6ICJ0aGluZyJ9LCBuaWwpLAotCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RTZXQobWFwW2ludDMyXWJvb2x7MTogdHJ1ZSwgMjogdHJ1ZSwgNDI6IHRydWV9KS5SZXR1cm4obWFwW2ludDMyXWJvb2x7MTogdHJ1ZSwgMjogdHJ1ZSwgNDI6IHRydWV9LCBuaWwpLAotCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RMaXN0KFtdaW50MzJ7MSwgMiwgNDJ9KS5SZXR1cm4oW11pbnQzMnsxLCAyLCA0Mn0sIG5pbCksCi0JCWhhbmRsZXIuRVhQRUNUKCkuVGVzdEVudW0odGhyaWZ0dGVzdC5OdW1iZXJ6X1RXTykuUmV0dXJuKHRocmlmdHRlc3QuTnVtYmVyel9UV08sIG5pbCksCi0JCWhhbmRsZXIuRVhQRUNUKCkuVGVzdFR5cGVkZWYodGhyaWZ0dGVzdC5Vc2VySWQoNDIpKS5SZXR1cm4odGhyaWZ0dGVzdC5Vc2VySWQoNDIpLCBuaWwpLAotCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RNYXBNYXAoaW50MzIoNDIpKS5SZXR1cm4ocm1hcG1hcCwgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0RG91YmxlKGdvbW9jay5BbnkoKSwgZmxvYXQ2NCg0Mi40MikpLlJldHVybihmbG9hdDY0KDQyLjQyKSwgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0U3RydWN0KGdvbW9jay5BbnkoKSwgJnRocmlmdHRlc3QuWHRydWN0e1N0cmluZ1RoaW5nOiAidGhpbmciLCBCeXRlVGhpbmc6IDQyLCBJMzJUaGluZzogNDI0MiwgSTY0VGhpbmc6IDQyNDI0Mn0pLlJldHVybigmdGhyaWZ0dGVzdC5YdHJ1Y3R7U3RyaW5nVGhpbmc6ICJ0aGluZyIsIEJ5dGVUaGluZzogNDIsIEkzMlRoaW5nOiA0MjQyLCBJNjRUaGluZzogNDI0MjQyfSwgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0TmVzdChnb21vY2suQW55KCksICZ0aHJpZnR0ZXN0Llh0cnVjdDJ7U3RydWN0VGhpbmc6ICZ0aHJpZnR0ZXN0Llh0cnVjdHtTdHJpbmdUaGluZzogInRoaW5nIiwgQnl0ZVRoaW5nOiA0MiwgSTMyVGhpbmc6IDQyNDIsIEk2NFRoaW5nOiA0MjQyNDJ9fSkuUmV0dXJuKCZ0aHJpZnR0ZXN0Llh0cnVjdDJ7U3RydWN0VGhpbmc6ICZ0aHJpZnR0ZXN0Llh0cnVjdHtTdHJpbmdUaGluZzogInRoaW5nIiwgQnl0ZVRoaW5nOiA0MiwgSTMyVGhpbmc6IDQyNDIsIEk2NFRoaW5nOiA0MjQyNDJ9fSwgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0TWFwKGdvbW9jay5BbnkoKSwgbWFwW2ludDMyXWludDMyezE6IDIsIDM6IDQsIDU6IDQyfSkuUmV0dXJuKG1hcFtpbnQzMl1pbnQzMnsxOiAyLCAzOiA0LCA1OiA0Mn0sIG5pbCksCisJCWhhbmRsZXIuRVhQRUNUKCkuVGVzdFN0cmluZ01hcChnb21vY2suQW55KCksIG1hcFtzdHJpbmddc3RyaW5neyJhIjogIjIiLCAiYiI6ICJibGFoIiwgInNvbWUiOiAidGhpbmcifSkuUmV0dXJuKG1hcFtzdHJpbmddc3RyaW5neyJhIjogIjIiLCAiYiI6ICJibGFoIiwgInNvbWUiOiAidGhpbmcifSwgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0U2V0KGdvbW9jay5BbnkoKSwgW11pbnQzMnsxLCAyLCA0Mn0pLlJldHVybihbXWludDMyezEsIDIsIDQyfSwgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0TGlzdChnb21vY2suQW55KCksIFtdaW50MzJ7MSwgMiwgNDJ9KS5SZXR1cm4oW11pbnQzMnsxLCAyLCA0Mn0sIG5pbCksCisJCWhhbmRsZXIuRVhQRUNUKCkuVGVzdEVudW0oZ29tb2NrLkFueSgpLCB0aHJpZnR0ZXN0Lk51bWJlcnpfVFdPKS5SZXR1cm4odGhyaWZ0dGVzdC5OdW1iZXJ6X1RXTywgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0VHlwZWRlZihnb21vY2suQW55KCksIHRocmlmdHRlc3QuVXNlcklkKDQyKSkuUmV0dXJuKHRocmlmdHRlc3QuVXNlcklkKDQyKSwgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0TWFwTWFwKGdvbW9jay5BbnkoKSwgaW50MzIoNDIpKS5SZXR1cm4ocm1hcG1hcCwgbmlsKSwKIAkJLy8gVE9ETzogbm90IHRlc3RpbmcgaW5zYW5pdHkKLQkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0TXVsdGkoaW50OCg0MiksIGludDMyKDQyNDIpLCBpbnQ2NCg0MjQyNDIpLCBtYXBbaW50MTZdc3RyaW5nezE6ICJibGFoIiwgMjogInRoaW5nIn0sIHRocmlmdHRlc3QuTnVtYmVyel9FSUdIVCwgdGhyaWZ0dGVzdC5Vc2VySWQoMjQpKS5SZXR1cm4oeHhzLCBuaWwpLAotCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RFeGNlcHRpb24oInNvbWUiKS5SZXR1cm4oeGNlcHQpLAotCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RFeGNlcHRpb24oIlRFeGNlcHRpb24iKS5SZXR1cm4oZXJyb3JzLk5ldygiSnVzdCByYW5kb20gZXhjZXB0aW9uIikpLAotCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RNdWx0aUV4Y2VwdGlvbigiWGNlcHRpb24iLCAiaWdub3JlbWUiKS5SZXR1cm4obmlsLCAmdGhyaWZ0dGVzdC5YY2VwdGlvbntFcnJvckNvZGU6IDEwMDEsIE1lc3NhZ2U6ICJUaGlzIGlzIGFuIFhjZXB0aW9uIn0pLAotCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RNdWx0aUV4Y2VwdGlvbigiWGNlcHRpb24yIiwgImlnbm9yZW1lIikuUmV0dXJuKG5pbCwgJnRocmlmdHRlc3QuWGNlcHRpb24ye0Vycm9yQ29kZTogMjAwMiwgU3RydWN0VGhpbmc6ICZ0aHJpZnR0ZXN0Llh0cnVjdHtTdHJpbmdUaGluZzogIlRoaXMgaXMgYW4gWGNlcHRpb24yIn19KSwKLQkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0T25ld2F5KGludDMyKDIpKS5SZXR1cm4obmlsKSwKLQkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0Vm9pZCgpLAorCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RNdWx0aShnb21vY2suQW55KCksIGludDgoNDIpLCBpbnQzMig0MjQyKSwgaW50NjQoNDI0MjQyKSwgbWFwW2ludDE2XXN0cmluZ3sxOiAiYmxhaCIsIDI6ICJ0aGluZyJ9LCB0aHJpZnR0ZXN0Lk51bWJlcnpfRUlHSFQsIHRocmlmdHRlc3QuVXNlcklkKDI0KSkuUmV0dXJuKHh4cywgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0RXhjZXB0aW9uKGdvbW9jay5BbnkoKSwgInNvbWUiKS5SZXR1cm4oeGNlcHQpLAorCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RFeGNlcHRpb24oZ29tb2NrLkFueSgpLCAiVEV4Y2VwdGlvbiIpLlJldHVybihlcnJvcnMuTmV3KCJKdXN0IHJhbmRvbSBleGNlcHRpb24iKSksCisJCWhhbmRsZXIuRVhQRUNUKCkuVGVzdE11bHRpRXhjZXB0aW9uKGdvbW9jay5BbnkoKSwgIlhjZXB0aW9uIiwgImlnbm9yZW1lIikuUmV0dXJuKG5pbCwgJnRocmlmdHRlc3QuWGNlcHRpb257RXJyb3JDb2RlOiAxMDAxLCBNZXNzYWdlOiAiVGhpcyBpcyBhbiBYY2VwdGlvbiJ9KSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0TXVsdGlFeGNlcHRpb24oZ29tb2NrLkFueSgpLCAiWGNlcHRpb24yIiwgImlnbm9yZW1lIikuUmV0dXJuKG5pbCwgJnRocmlmdHRlc3QuWGNlcHRpb24ye0Vycm9yQ29kZTogMjAwMiwgU3RydWN0VGhpbmc6ICZ0aHJpZnR0ZXN0Llh0cnVjdHtTdHJpbmdUaGluZzogIlRoaXMgaXMgYW4gWGNlcHRpb24yIn19KSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0T25ld2F5KGdvbW9jay5BbnkoKSwgaW50MzIoMikpLlJldHVybihuaWwpLAorCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RWb2lkKGdvbW9jay5BbnkoKSksCiAJKQogCXZhciBlcnIgZXJyb3IKLQlpZiBlcnIgPSBjbGllbnQuVGVzdFZvaWQoKTsgZXJyICE9IG5pbCB7Ci0JCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RWb2lkKCkgY2FsbDogIiwgZXJyKQorCWlmIGVyciA9IGNsaWVudC5UZXN0Vm9pZChkZWZhdWx0Q3R4KTsgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RWb2lkKCkgY2FsbDogJXMiLCBlcnIpCiAJfQogCi0JdGhpbmcsIGVyciA6PSBjbGllbnQuVGVzdFN0cmluZygidGhpbmciKQorCXRoaW5nLCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmcoZGVmYXVsdEN0eCwgInRoaW5nIikKIAlpZiBlcnIgIT0gbmlsIHsKLQkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFN0cmluZygpIGNhbGw6ICIsIGVycikKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFN0cmluZygpIGNhbGw6ICVzIiwgZXJyKQogCX0KIAlpZiB0aGluZyAhPSAidGhpbmciIHsKIAkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgVGVzdFN0cmluZygpIHJlc3VsdCwgZXhwZWN0ZWQgJ3RoaW5nJyBnb3QgJyVzJyAiLCB0aGluZykKIAl9CiAKLQlibCwgZXJyIDo9IGNsaWVudC5UZXN0Qm9vbCh0cnVlKQorCWJsLCBlcnIgOj0gY2xpZW50LlRlc3RCb29sKGRlZmF1bHRDdHgsIHRydWUpCiAJaWYgZXJyICE9IG5pbCB7Ci0JCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RCb29sKCkgY2FsbDogIiwgZXJyKQorCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0Qm9vbCgpIGNhbGw6ICVzIiwgZXJyKQogCX0KIAlpZiAhYmwgewotCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0Qm9vbCgpIHJlc3VsdCBleHBlY3RlZCB0cnVlLCBnb3QgJWYgIiwgYmwpCisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIFRlc3RCb29sKCkgcmVzdWx0IGV4cGVjdGVkIHRydWUsIGdvdCAldiAiLCBibCkKIAl9Ci0JYmwsIGVyciA9IGNsaWVudC5UZXN0Qm9vbChmYWxzZSkKKwlibCwgZXJyID0gY2xpZW50LlRlc3RCb29sKGRlZmF1bHRDdHgsIGZhbHNlKQogCWlmIGVyciAhPSBuaWwgewotCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0Qm9vbCgpIGNhbGw6ICIsIGVycikKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdEJvb2woKSBjYWxsOiAlcyIsIGVycikKIAl9CiAJaWYgYmwgewotCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0Qm9vbCgpIHJlc3VsdCBleHBlY3RlZCBmYWxzZSwgZ290ICVmICIsIGJsKQorCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0Qm9vbCgpIHJlc3VsdCBleHBlY3RlZCBmYWxzZSwgZ290ICV2ICIsIGJsKQogCX0KIAotCWIsIGVyciA6PSBjbGllbnQuVGVzdEJ5dGUoNDIpCisJYiwgZXJyIDo9IGNsaWVudC5UZXN0Qnl0ZShkZWZhdWx0Q3R4LCA0MikKIAlpZiBlcnIgIT0gbmlsIHsKLQkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdEJ5dGUoKSBjYWxsOiAiLCBlcnIpCisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RCeXRlKCkgY2FsbDogJXMiLCBlcnIpCiAJfQogCWlmIGIgIT0gNDIgewogCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0Qnl0ZSgpIHJlc3VsdCBleHBlY3RlZCA0MiwgZ290ICVkICIsIGIpCiAJfQogCi0JaTMyLCBlcnIgOj0gY2xpZW50LlRlc3RJMzIoNDI0MikKKwlpMzIsIGVyciA6PSBjbGllbnQuVGVzdEkzMihkZWZhdWx0Q3R4LCA0MjQyKQogCWlmIGVyciAhPSBuaWwgewotCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0STMyKCkgY2FsbDogIiwgZXJyKQorCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0STMyKCkgY2FsbDogJXMiLCBlcnIpCiAJfQogCWlmIGkzMiAhPSA0MjQyIHsKIAkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgVGVzdEkzMigpIHJlc3VsdCBleHBlY3RlZCA0MjQyLCBnb3QgJWQgIiwgaTMyKQogCX0KIAotCWk2NCwgZXJyIDo9IGNsaWVudC5UZXN0STY0KDQyNDI0MikKKwlpNjQsIGVyciA6PSBjbGllbnQuVGVzdEk2NChkZWZhdWx0Q3R4LCA0MjQyNDIpCiAJaWYgZXJyICE9IG5pbCB7Ci0JCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RJNjQoKSBjYWxsOiAiLCBlcnIpCisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RJNjQoKSBjYWxsOiAlcyIsIGVycikKIAl9CiAJaWYgaTY0ICE9IDQyNDI0MiB7CiAJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIFRlc3RJNjQoKSByZXN1bHQgZXhwZWN0ZWQgNDI0MjQyLCBnb3QgJWQgIiwgaTY0KQogCX0KIAotCWQsIGVyciA6PSBjbGllbnQuVGVzdERvdWJsZSg0Mi40MikKKwlkLCBlcnIgOj0gY2xpZW50LlRlc3REb3VibGUoZGVmYXVsdEN0eCwgNDIuNDIpCiAJaWYgZXJyICE9IG5pbCB7Ci0JCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3REb3VibGUoKSBjYWxsOiAiLCBlcnIpCisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3REb3VibGUoKSBjYWxsOiAlcyIsIGVycikKIAl9CiAJaWYgZCAhPSA0Mi40MiB7CiAJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIFRlc3REb3VibGUoKSByZXN1bHQgZXhwZWN0ZWQgNDIuNDIsIGdvdCAlZiAiLCBkKQogCX0KIAogCS8vIFRPRE86IGFkZCBUZXN0QmluYXJ5KCkgY2FsbAotCQorCiAJeHMgOj0gdGhyaWZ0dGVzdC5OZXdYdHJ1Y3QoKQogCXhzLlN0cmluZ1RoaW5nID0gInRoaW5nIgogCXhzLkJ5dGVUaGluZyA9IDQyCiAJeHMuSTMyVGhpbmcgPSA0MjQyCiAJeHMuSTY0VGhpbmcgPSA0MjQyNDIKLQl4c3JldCwgZXJyIDo9IGNsaWVudC5UZXN0U3RydWN0KHhzKQorCXhzcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RTdHJ1Y3QoZGVmYXVsdEN0eCwgeHMpCiAJaWYgZXJyICE9IG5pbCB7Ci0JCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RTdHJ1Y3QoKSBjYWxsOiAiLCBlcnIpCisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RTdHJ1Y3QoKSBjYWxsOiAlcyIsIGVycikKIAl9CiAJaWYgKnhzICE9ICp4c3JldCB7CiAJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIFRlc3RTdHJ1Y3QoKSByZXN1bHQgZXhwZWN0ZWQgJSN2LCBnb3QgJSN2ICIsIHhzLCB4c3JldCkKQEAgLTE5MSw4MyArMjA0LDkwIEBACiAKIAl4MiA6PSB0aHJpZnR0ZXN0Lk5ld1h0cnVjdDIoKQogCXgyLlN0cnVjdFRoaW5nID0geHMKLQl4MnJldCwgZXJyIDo9IGNsaWVudC5UZXN0TmVzdCh4MikKKwl4MnJldCwgZXJyIDo9IGNsaWVudC5UZXN0TmVzdChkZWZhdWx0Q3R4LCB4MikKIAlpZiBlcnIgIT0gbmlsIHsKLQkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdE5lc3QoKSBjYWxsOiAiLCBlcnIpCisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3ROZXN0KCkgY2FsbDogJXMiLCBlcnIpCiAJfQogCWlmICFyZWZsZWN0LkRlZXBFcXVhbCh4MiwgeDJyZXQpIHsKIAkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgVGVzdE5lc3QoKSByZXN1bHQgZXhwZWN0ZWQgJSN2LCBnb3QgJSN2ICIsIHgyLCB4MnJldCkKIAl9CiAKIAltIDo9IG1hcFtpbnQzMl1pbnQzMnsxOiAyLCAzOiA0LCA1OiA0Mn0KLQltcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RNYXAobSkKKwltcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RNYXAoZGVmYXVsdEN0eCwgbSkKIAlpZiBlcnIgIT0gbmlsIHsKLQkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdE1hcCgpIGNhbGw6ICIsIGVycikKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdE1hcCgpIGNhbGw6ICVzIiwgZXJyKQogCX0KIAlpZiAhcmVmbGVjdC5EZWVwRXF1YWwobSwgbXJldCkgewogCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0TWFwKCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCBtLCBtcmV0KQogCX0KIAogCXNtIDo9IG1hcFtzdHJpbmddc3RyaW5neyJhIjogIjIiLCAiYiI6ICJibGFoIiwgInNvbWUiOiAidGhpbmcifQotCXNtcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmdNYXAoc20pCisJc21yZXQsIGVyciA6PSBjbGllbnQuVGVzdFN0cmluZ01hcChkZWZhdWx0Q3R4LCBzbSkKIAlpZiBlcnIgIT0gbmlsIHsKLQkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFN0cmluZ01hcCgpIGNhbGw6ICIsIGVycikKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFN0cmluZ01hcCgpIGNhbGw6ICVzIiwgZXJyKQogCX0KIAlpZiAhcmVmbGVjdC5EZWVwRXF1YWwoc20sIHNtcmV0KSB7CiAJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIFRlc3RTdHJpbmdNYXAoKSByZXN1bHQgZXhwZWN0ZWQgJSN2LCBnb3QgJSN2ICIsIHNtLCBzbXJldCkKIAl9CiAKLQlzIDo9IG1hcFtpbnQzMl1ib29sezE6IHRydWUsIDI6IHRydWUsIDQyOiB0cnVlfQotCXNyZXQsIGVyciA6PSBjbGllbnQuVGVzdFNldChzKQorCXMgOj0gW11pbnQzMnsxLCAyLCA0Mn0KKwlzcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RTZXQoZGVmYXVsdEN0eCwgcykKIAlpZiBlcnIgIT0gbmlsIHsKLQkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFNldCgpIGNhbGw6ICIsIGVycikKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFNldCgpIGNhbGw6ICVzIiwgZXJyKQogCX0KLQlpZiAhcmVmbGVjdC5EZWVwRXF1YWwocywgc3JldCkgewotCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0U2V0KCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCBzLCBzcmV0KQorCS8vIFNldHMgY2FuIGJlIGluIGFueSBvcmRlciwgYnV0IEdvIHNsaWNlcyBhcmUgb3JkZXJlZCwgc28gcmVmbGVjdC5EZWVwRXF1YWwgd29uJ3Qgd29yay4KKwlzdGVtcCA6PSBtYXBbaW50MzJdc3RydWN0e317fQorCWZvciBfLCB2YWwgOj0gcmFuZ2UgcyB7CisJCXN0ZW1wW3ZhbF0gPSBzdHJ1Y3R7fXt9CisJfQorCWZvciBfLCB2YWwgOj0gcmFuZ2Ugc3JldCB7CisJCWlmIF8sIG9rIDo9IHN0ZW1wW3ZhbF07ICFvayB7CisJCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0U2V0KCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCBzLCBzcmV0KQorCQl9CiAJfQogCiAJbCA6PSBbXWludDMyezEsIDIsIDQyfQotCWxyZXQsIGVyciA6PSBjbGllbnQuVGVzdExpc3QobCkKKwlscmV0LCBlcnIgOj0gY2xpZW50LlRlc3RMaXN0KGRlZmF1bHRDdHgsIGwpCiAJaWYgZXJyICE9IG5pbCB7Ci0JCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RMaXN0KCkgY2FsbDogIiwgZXJyKQorCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0TGlzdCgpIGNhbGw6ICVzIiwgZXJyKQogCX0KIAlpZiAhcmVmbGVjdC5EZWVwRXF1YWwobCwgbHJldCkgewotCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0U2V0KCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCBsLCBscmV0KQorCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0TGlzdCgpIHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwgbCwgbHJldCkKIAl9CiAKLQllcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RFbnVtKHRocmlmdHRlc3QuTnVtYmVyel9UV08pCisJZXJldCwgZXJyIDo9IGNsaWVudC5UZXN0RW51bShkZWZhdWx0Q3R4LCB0aHJpZnR0ZXN0Lk51bWJlcnpfVFdPKQogCWlmIGVyciAhPSBuaWwgewotCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0RW51bSgpIGNhbGw6ICIsIGVycikKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdEVudW0oKSBjYWxsOiAlcyIsIGVycikKIAl9CiAJaWYgZXJldCAhPSB0aHJpZnR0ZXN0Lk51bWJlcnpfVFdPIHsKIAkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgVGVzdEVudW0oKSByZXN1bHQgZXhwZWN0ZWQgJSN2LCBnb3QgJSN2ICIsIHRocmlmdHRlc3QuTnVtYmVyel9UV08sIGVyZXQpCiAJfQogCi0JdHJldCwgZXJyIDo9IGNsaWVudC5UZXN0VHlwZWRlZih0aHJpZnR0ZXN0LlVzZXJJZCg0MikpCisJdHJldCwgZXJyIDo9IGNsaWVudC5UZXN0VHlwZWRlZihkZWZhdWx0Q3R4LCB0aHJpZnR0ZXN0LlVzZXJJZCg0MikpCiAJaWYgZXJyICE9IG5pbCB7Ci0JCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RUeXBlZGVmKCkgY2FsbDogIiwgZXJyKQorCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0VHlwZWRlZigpIGNhbGw6ICVzIiwgZXJyKQogCX0KIAlpZiB0cmV0ICE9IHRocmlmdHRlc3QuVXNlcklkKDQyKSB7CiAJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIFRlc3RUeXBlZGVmKCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCB0aHJpZnR0ZXN0LlVzZXJJZCg0MiksIHRyZXQpCiAJfQogCi0JbWFwbWFwLCBlcnIgOj0gY2xpZW50LlRlc3RNYXBNYXAoNDIpCisJbWFwbWFwLCBlcnIgOj0gY2xpZW50LlRlc3RNYXBNYXAoZGVmYXVsdEN0eCwgNDIpCiAJaWYgZXJyICE9IG5pbCB7Ci0JCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RNYXBtYXAoKSBjYWxsOiAiLCBlcnIpCisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RNYXBtYXAoKSBjYWxsOiAlcyIsIGVycikKIAl9CiAJaWYgIXJlZmxlY3QuRGVlcEVxdWFsKG1hcG1hcCwgcm1hcG1hcCkgewogCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0TWFwbWFwKCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCBybWFwbWFwLCBtYXBtYXApCiAJfQogCi0JeHhzcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RNdWx0aSg0MiwgNDI0MiwgNDI0MjQyLCBtYXBbaW50MTZdc3RyaW5nezE6ICJibGFoIiwgMjogInRoaW5nIn0sIHRocmlmdHRlc3QuTnVtYmVyel9FSUdIVCwgdGhyaWZ0dGVzdC5Vc2VySWQoMjQpKQorCXh4c3JldCwgZXJyIDo9IGNsaWVudC5UZXN0TXVsdGkoZGVmYXVsdEN0eCwgNDIsIDQyNDIsIDQyNDI0MiwgbWFwW2ludDE2XXN0cmluZ3sxOiAiYmxhaCIsIDI6ICJ0aGluZyJ9LCB0aHJpZnR0ZXN0Lk51bWJlcnpfRUlHSFQsIHRocmlmdHRlc3QuVXNlcklkKDI0KSkKIAlpZiBlcnIgIT0gbmlsIHsKLQkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdE11bHRpKCkgY2FsbDogIiwgZXJyKQorCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0TXVsdGkoKSBjYWxsOiAlcyIsIGVycikKIAl9CiAJaWYgIXJlZmxlY3QuRGVlcEVxdWFsKHh4cywgeHhzcmV0KSB7CiAJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIFRlc3RNdWx0aSgpIHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwgeHhzLCB4eHNyZXQpCiAJfQogCi0JZXJyID0gY2xpZW50LlRlc3RFeGNlcHRpb24oInNvbWUiKQorCWVyciA9IGNsaWVudC5UZXN0RXhjZXB0aW9uKGRlZmF1bHRDdHgsICJzb21lIikKIAlpZiBlcnIgPT0gbmlsIHsKIAkJdC5FcnJvcmYoIkV4cGVjdGluZyBleGNlcHRpb24gaW4gVGVzdEV4Y2VwdGlvbigpIGNhbGwiKQogCX0KQEAgLTI3NiwxMyArMjk2LDE2IEBACiAJfQogCiAJLy8gVE9ETzogY29ubmVjdGlvbiBpcyBiZWluZyBjbG9zZWQgb24gdGhpcwotCWVyciA9IGNsaWVudC5UZXN0RXhjZXB0aW9uKCJURXhjZXB0aW9uIikKLQl0ZXgsIG9rIDo9IGVyci4odGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbikKLQlpZiBlcnIgPT0gbmlsIHx8ICFvayB8fCB0ZXguVHlwZUlkKCkgIT0gdGhyaWZ0LklOVEVSTkFMX0VSUk9SIHsKLQkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgVGVzdEV4Y2VwdGlvbigpIHJlc3VsdCBleHBlY3RlZCBBcHBsaWNhdGlvbkVycm9yLCBnb3QgJSN2ICIsIGVycikKKwllcnIgPSBjbGllbnQuVGVzdEV4Y2VwdGlvbihkZWZhdWx0Q3R4LCAiVEV4Y2VwdGlvbiIpCisJaWYgZXJyID09IG5pbCB7CisJCXQuRXJyb3IoImV4cGVjdGVkIGV4Y2VwdGlvbiBnb3QgbmlsIikKKwl9IGVsc2UgaWYgdGV4LCBvayA6PSBlcnIuKHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24pOyAhb2sgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0RXhjZXB0aW9uKCkgcmVzdWx0IGV4cGVjdGVkIEFwcGxpY2F0aW9uRXJyb3IsIGdvdCAlVCAiLCBlcnIpCisJfSBlbHNlIGlmIHRleC5UeXBlSWQoKSAhPSB0aHJpZnQuSU5URVJOQUxfRVJST1IgeworCQl0LkVycm9yZigiZXhwZWN0ZWQgaW50ZXJuYWxfZXJyb3IgZ290ICV2IiwgdGV4LlR5cGVJZCgpKQogCX0KIAotCWlnbiwgZXJyIDo9IGNsaWVudC5UZXN0TXVsdGlFeGNlcHRpb24oIlhjZXB0aW9uIiwgImlnbm9yZW1lIikKKwlpZ24sIGVyciA6PSBjbGllbnQuVGVzdE11bHRpRXhjZXB0aW9uKGRlZmF1bHRDdHgsICJYY2VwdGlvbiIsICJpZ25vcmVtZSIpCiAJaWYgaWduICE9IG5pbCB8fCBlcnIgPT0gbmlsIHsKIAkJdC5FcnJvcmYoIkV4cGVjdGluZyBleGNlcHRpb24gaW4gVGVzdE11bHRpRXhjZXB0aW9uKCkgY2FsbCIpCiAJfQpAQCAtMjkwLDcgKzMxMyw3IEBACiAJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIFRlc3RNdWx0aUV4Y2VwdGlvbigpICUjdiAiLCBlcnIpCiAJfQogCi0JaWduLCBlcnIgPSBjbGllbnQuVGVzdE11bHRpRXhjZXB0aW9uKCJYY2VwdGlvbjIiLCAiaWdub3JlbWUiKQorCWlnbiwgZXJyID0gY2xpZW50LlRlc3RNdWx0aUV4Y2VwdGlvbihkZWZhdWx0Q3R4LCAiWGNlcHRpb24yIiwgImlnbm9yZW1lIikKIAlpZiBpZ24gIT0gbmlsIHx8IGVyciA9PSBuaWwgewogCQl0LkVycm9yZigiRXhwZWN0aW5nIGV4Y2VwdGlvbiBpbiBUZXN0TXVsdGlFeGNlcHRpb24oKSBjYWxsIikKIAl9CkBAIC0zMDAsMTMgKzMyMywxMyBAQAogCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0TXVsdGlFeGNlcHRpb24oKSAlI3YgIiwgZXJyKQogCX0KIAotCWVyciA9IGNsaWVudC5UZXN0T25ld2F5KDIpCisJZXJyID0gY2xpZW50LlRlc3RPbmV3YXkoZGVmYXVsdEN0eCwgMikKIAlpZiBlcnIgIT0gbmlsIHsKLQkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdE9uZXdheSgpIGNhbGw6ICIsIGVycikKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdE9uZXdheSgpIGNhbGw6ICVzIiwgZXJyKQogCX0KIAogCS8vTWFrZSBzdXJlIHRoZSBjb25uZWN0aW9uIHN0aWxsIGFsaXZlCi0JaWYgZXJyID0gY2xpZW50LlRlc3RWb2lkKCk7IGVyciAhPSBuaWwgewotCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0Vm9pZCgpIGNhbGw6ICIsIGVycikKKwlpZiBlcnIgPSBjbGllbnQuVGVzdFZvaWQoZGVmYXVsdEN0eCk7IGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0Vm9pZCgpIGNhbGw6ICVzIiwgZXJyKQogCX0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvZ28vc3JjL2NvbW1vbi9jb250ZXh0X3Rlc3QuZ28gYi90ZXN0L2dvL3NyYy9jb21tb24vY29udGV4dF90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NGRiYjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2dvL3NyYy9jb21tb24vY29udGV4dF90ZXN0LmdvCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb21tb24KKworaW1wb3J0ICgKKwkiY29udGV4dCIKKwkiZm10IgorCSJuZXQiCisJIm5ldC9odHRwIgorCSJuZXQvdXJsIgorCSJvcyIKKwkic3lzY2FsbCIKKwkidGVzdGluZyIKKwkidGhyaWZ0IgorCSJ0aW1lIgorKQorCit0eXBlIHNsb3dIdHRwSGFuZGxlciBzdHJ1Y3R7fQorCitmdW5jIChzbG93SHR0cEhhbmRsZXIpIFNlcnZlSFRUUCh3IGh0dHAuUmVzcG9uc2VXcml0ZXIsIHIgKmh0dHAuUmVxdWVzdCkgeworCXRpbWUuU2xlZXAoMSAqIHRpbWUuU2Vjb25kKQorfQorCitmdW5jIFRlc3RIdHRwQ29udGV4dFRpbWVvdXQodCAqdGVzdGluZy5UKSB7CisJY2VydFBhdGggPSAiLi4vLi4vLi4va2V5cyIKKworCXVuaXQgOj0gdGVzdF91bml0eyIxMjcuMC4wLjEiLCA5MDk2LCAiIiwgImh0dHAiLCAiYmluYXJ5IiwgZmFsc2V9CisKKwlzZXJ2ZXIgOj0gJmh0dHAuU2VydmVye0FkZHI6IHVuaXQuaG9zdCArIGZtdC5TcHJpbnRmKCI6JWQiLCB1bml0LnBvcnQpLCBIYW5kbGVyOiBzbG93SHR0cEhhbmRsZXJ7fX0KKwlnbyBzZXJ2ZXIuTGlzdGVuQW5kU2VydmUoKQorCisJY2xpZW50LCB0cmFucywgZXJyIDo9IFN0YXJ0Q2xpZW50KHVuaXQuaG9zdCwgdW5pdC5wb3J0LCB1bml0LmRvbWFpbl9zb2NrZXQsIHVuaXQudHJhbnNwb3J0LCB1bml0LnByb3RvY29sLCB1bml0LnNzbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIlVuYWJsZSB0byBzdGFydCBjbGllbnQ6ICV2IiwgZXJyKQorCQlyZXR1cm4KKwl9CisJZGVmZXIgdHJhbnMuQ2xvc2UoKQorCisJdW53cmFwRXJyIDo9IGZ1bmMoZXJyIGVycm9yKSBlcnJvciB7CisJCWZvciB7CisJCQlzd2l0Y2ggZXJyLih0eXBlKSB7CisJCQljYXNlIHRocmlmdC5UVHJhbnNwb3J0RXhjZXB0aW9uOgorCQkJCWVyciA9IGVyci4odGhyaWZ0LlRUcmFuc3BvcnRFeGNlcHRpb24pLkVycigpCisJCQljYXNlICp1cmwuRXJyb3I6CisJCQkJZXJyID0gZXJyLigqdXJsLkVycm9yKS5FcnIKKwkJCWNhc2UgKm5ldC5PcEVycm9yOgorCQkJCWVyciA9IGVyci4oKm5ldC5PcEVycm9yKS5FcnIKKwkJCWNhc2UgKm9zLlN5c2NhbGxFcnJvcjoKKwkJCQllcnIgPSBlcnIuKCpvcy5TeXNjYWxsRXJyb3IpLkVycgorCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gZXJyCisJCQl9CisJCX0KKwl9CisKKwlzZXJ2ZXJTdGFydHVwRGVhZGxpbmUgOj0gdGltZS5Ob3coKS5BZGQoNSAqIHRpbWUuU2Vjb25kKQorCWZvciB7CisJCWN0eCwgXyA6PSBjb250ZXh0LldpdGhUaW1lb3V0KGNvbnRleHQuQmFja2dyb3VuZCgpLCA1MCp0aW1lLk1pbGxpc2Vjb25kKQorCQllcnIgPSBjbGllbnQuVGVzdFZvaWQoY3R4KQorCQllcnIgPSB1bndyYXBFcnIoZXJyKQorCQlpZiBlcnIgIT0gc3lzY2FsbC5FQ09OTlJFRlVTRUQgfHwgdGltZS5Ob3coKS5BZnRlcihzZXJ2ZXJTdGFydHVwRGVhZGxpbmUpIHsKKwkJCWJyZWFrCisJCX0KKwkJdGltZS5TbGVlcCh0aW1lLk1pbGxpc2Vjb25kKQorCX0KKworCWlmIGVyciA9PSBuaWwgeworCQl0LkVycm9yZigiUmVxdWVzdCBjb21wbGV0ZWQgKHNob3VsZCBoYXZlIHRpbWVkIG91dCkiKQorCQlyZXR1cm4KKwl9CisKKwkvLyBXZSd2ZSBnb3QgdG8gc3dpdGNoIG9uIGBlcnIuRXJyb3IoKWAgaGVyZSBzaW5jZSBnbzEuNyBkb2Vzbid0IHByb3Blcmx5IHJldHVybgorCS8vIGBjb250ZXh0LkRlYWRsaW5lRXhjZWVkZWRgIGVycm9yIGFuZCBgaHR0cC5lcnJSZXF1ZXN0Q2FuY2VsZWRgIGlzIG5vdCBleHBvcnRlZC4KKwkvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2dvbGFuZy9nby9pc3N1ZXMvMTc3MTEKKwlzd2l0Y2ggZXJyLkVycm9yKCkgeworCWNhc2UgY29udGV4dC5EZWFkbGluZUV4Y2VlZGVkLkVycm9yKCksICJuZXQvaHR0cDogcmVxdWVzdCBjYW5jZWxlZCI6CisJCS8vIEV4cGVjdGVkIGVycm9yCisJZGVmYXVsdDoKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3I6ICVzIiwgZXJyKQorCX0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvZ28vc3JjL2NvbW1vbi9tb2NrX2hhbmRsZXIuZ28gYi90ZXN0L2dvL3NyYy9jb21tb24vbW9ja19oYW5kbGVyLmdvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDk1ZmM2Li4wMDAwMDAwCi0tLSBhL3Rlc3QvZ28vc3JjL2NvbW1vbi9tb2NrX2hhbmRsZXIuZ28KKysrIC9kZXYvbnVsbApAQCAtMSwyODkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBNb2NrR2VuLiBETyBOT1QgRURJVCEKLS8vIFNvdXJjZTogZ2VuL3RocmlmdHRlc3QgKGludGVyZmFjZXM6IFRocmlmdFRlc3QpCi0KLXBhY2thZ2UgY29tbW9uCi0KLWltcG9ydCAoCi0JZ29tb2NrICJnaXRodWIuY29tL2dvbGFuZy9tb2NrL2dvbW9jayIKLQl0aHJpZnR0ZXN0ICJnZW4vdGhyaWZ0dGVzdCIKLSkKLQotLy8gTW9jayBvZiBUaHJpZnRUZXN0IGludGVyZmFjZQotdHlwZSBNb2NrVGhyaWZ0VGVzdCBzdHJ1Y3QgewotCWN0cmwgICAgICpnb21vY2suQ29udHJvbGxlcgotCXJlY29yZGVyICpfTW9ja1RocmlmdFRlc3RSZWNvcmRlcgotfQotCi0vLyBSZWNvcmRlciBmb3IgTW9ja1RocmlmdFRlc3QgKG5vdCBleHBvcnRlZCkKLXR5cGUgX01vY2tUaHJpZnRUZXN0UmVjb3JkZXIgc3RydWN0IHsKLQltb2NrICpNb2NrVGhyaWZ0VGVzdAotfQotCi1mdW5jIE5ld01vY2tUaHJpZnRUZXN0KGN0cmwgKmdvbW9jay5Db250cm9sbGVyKSAqTW9ja1RocmlmdFRlc3QgewotCW1vY2sgOj0gJk1vY2tUaHJpZnRUZXN0e2N0cmw6IGN0cmx9Ci0JbW9jay5yZWNvcmRlciA9ICZfTW9ja1RocmlmdFRlc3RSZWNvcmRlcnttb2NrfQotCXJldHVybiBtb2NrCi19Ci0KLWZ1bmMgKF9tICpNb2NrVGhyaWZ0VGVzdCkgRVhQRUNUKCkgKl9Nb2NrVGhyaWZ0VGVzdFJlY29yZGVyIHsKLQlyZXR1cm4gX20ucmVjb3JkZXIKLX0KLQotZnVuYyAoX20gKk1vY2tUaHJpZnRUZXN0KSBUZXN0Qm9vbChfcGFyYW0wIGJvb2wpIChib29sLCBlcnJvcikgewotCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJUZXN0Qm9vbCIsIF9wYXJhbTApCi0JcmV0MCwgXyA6PSByZXRbMF0uKGJvb2wpCi0JcmV0MSwgXyA6PSByZXRbMV0uKGVycm9yKQotCXJldHVybiByZXQwLCByZXQxCi19Ci0KLWZ1bmMgKF9tciAqX01vY2tUaHJpZnRUZXN0UmVjb3JkZXIpIFRlc3RCb29sKGFyZzAgaW50ZXJmYWNle30pICpnb21vY2suQ2FsbCB7Ci0JcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIlRlc3RCb29sIiwgYXJnMCkKLX0KLQotCi1mdW5jIChfbSAqTW9ja1RocmlmdFRlc3QpIFRlc3RCeXRlKF9wYXJhbTAgaW50OCkgKGludDgsIGVycm9yKSB7Ci0JcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlRlc3RCeXRlIiwgX3BhcmFtMCkKLQlyZXQwLCBfIDo9IHJldFswXS4oaW50OCkKLQlyZXQxLCBfIDo9IHJldFsxXS4oZXJyb3IpCi0JcmV0dXJuIHJldDAsIHJldDEKLX0KLQotZnVuYyAoX21yICpfTW9ja1RocmlmdFRlc3RSZWNvcmRlcikgVGVzdEJ5dGUoYXJnMCBpbnRlcmZhY2V7fSkgKmdvbW9jay5DYWxsIHsKLQlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiVGVzdEJ5dGUiLCBhcmcwKQotfQotCi1mdW5jIChfbSAqTW9ja1RocmlmdFRlc3QpIFRlc3REb3VibGUoX3BhcmFtMCBmbG9hdDY0KSAoZmxvYXQ2NCwgZXJyb3IpIHsKLQlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiVGVzdERvdWJsZSIsIF9wYXJhbTApCi0JcmV0MCwgXyA6PSByZXRbMF0uKGZsb2F0NjQpCi0JcmV0MSwgXyA6PSByZXRbMV0uKGVycm9yKQotCXJldHVybiByZXQwLCByZXQxCi19Ci0KLWZ1bmMgKF9tciAqX01vY2tUaHJpZnRUZXN0UmVjb3JkZXIpIFRlc3REb3VibGUoYXJnMCBpbnRlcmZhY2V7fSkgKmdvbW9jay5DYWxsIHsKLQlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiVGVzdERvdWJsZSIsIGFyZzApCi19Ci0KLWZ1bmMgKF9tICpNb2NrVGhyaWZ0VGVzdCkgVGVzdEJpbmFyeShfcGFyYW0wIFtdYnl0ZSkgKFtdYnl0ZSwgZXJyb3IpIHsKLQlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiVGVzdEJpbmFyeSIsIF9wYXJhbTApCi0JcmV0MCwgXyA6PSByZXRbMF0uKFtdYnl0ZSkKLQlyZXQxLCBfIDo9IHJldFsxXS4oZXJyb3IpCi0JcmV0dXJuIHJldDAsIHJldDEKLX0KLQotZnVuYyAoX21yICpfTW9ja1RocmlmdFRlc3RSZWNvcmRlcikgVGVzdEJpbmFyeShhcmcwIGludGVyZmFjZXt9KSAqZ29tb2NrLkNhbGwgewotCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJUZXN0QmluYXJ5IiwgYXJnMCkKLX0KLQotZnVuYyAoX20gKk1vY2tUaHJpZnRUZXN0KSBUZXN0RW51bShfcGFyYW0wIHRocmlmdHRlc3QuTnVtYmVyeikgKHRocmlmdHRlc3QuTnVtYmVyeiwgZXJyb3IpIHsKLQlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiVGVzdEVudW0iLCBfcGFyYW0wKQotCXJldDAsIF8gOj0gcmV0WzBdLih0aHJpZnR0ZXN0Lk51bWJlcnopCi0JcmV0MSwgXyA6PSByZXRbMV0uKGVycm9yKQotCXJldHVybiByZXQwLCByZXQxCi19Ci0KLWZ1bmMgKF9tciAqX01vY2tUaHJpZnRUZXN0UmVjb3JkZXIpIFRlc3RFbnVtKGFyZzAgaW50ZXJmYWNle30pICpnb21vY2suQ2FsbCB7Ci0JcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIlRlc3RFbnVtIiwgYXJnMCkKLX0KLQotZnVuYyAoX20gKk1vY2tUaHJpZnRUZXN0KSBUZXN0RXhjZXB0aW9uKF9wYXJhbTAgc3RyaW5nKSBlcnJvciB7Ci0JcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlRlc3RFeGNlcHRpb24iLCBfcGFyYW0wKQotCXJldDAsIF8gOj0gcmV0WzBdLihlcnJvcikKLQlyZXR1cm4gcmV0MAotfQotCi1mdW5jIChfbXIgKl9Nb2NrVGhyaWZ0VGVzdFJlY29yZGVyKSBUZXN0RXhjZXB0aW9uKGFyZzAgaW50ZXJmYWNle30pICpnb21vY2suQ2FsbCB7Ci0JcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIlRlc3RFeGNlcHRpb24iLCBhcmcwKQotfQotCi1mdW5jIChfbSAqTW9ja1RocmlmdFRlc3QpIFRlc3RJMzIoX3BhcmFtMCBpbnQzMikgKGludDMyLCBlcnJvcikgewotCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJUZXN0STMyIiwgX3BhcmFtMCkKLQlyZXQwLCBfIDo9IHJldFswXS4oaW50MzIpCi0JcmV0MSwgXyA6PSByZXRbMV0uKGVycm9yKQotCXJldHVybiByZXQwLCByZXQxCi19Ci0KLWZ1bmMgKF9tciAqX01vY2tUaHJpZnRUZXN0UmVjb3JkZXIpIFRlc3RJMzIoYXJnMCBpbnRlcmZhY2V7fSkgKmdvbW9jay5DYWxsIHsKLQlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiVGVzdEkzMiIsIGFyZzApCi19Ci0KLWZ1bmMgKF9tICpNb2NrVGhyaWZ0VGVzdCkgVGVzdEk2NChfcGFyYW0wIGludDY0KSAoaW50NjQsIGVycm9yKSB7Ci0JcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlRlc3RJNjQiLCBfcGFyYW0wKQotCXJldDAsIF8gOj0gcmV0WzBdLihpbnQ2NCkKLQlyZXQxLCBfIDo9IHJldFsxXS4oZXJyb3IpCi0JcmV0dXJuIHJldDAsIHJldDEKLX0KLQotZnVuYyAoX21yICpfTW9ja1RocmlmdFRlc3RSZWNvcmRlcikgVGVzdEk2NChhcmcwIGludGVyZmFjZXt9KSAqZ29tb2NrLkNhbGwgewotCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJUZXN0STY0IiwgYXJnMCkKLX0KLQotZnVuYyAoX20gKk1vY2tUaHJpZnRUZXN0KSBUZXN0SW5zYW5pdHkoX3BhcmFtMCAqdGhyaWZ0dGVzdC5JbnNhbml0eSkgKG1hcFt0aHJpZnR0ZXN0LlVzZXJJZF1tYXBbdGhyaWZ0dGVzdC5OdW1iZXJ6XSp0aHJpZnR0ZXN0Lkluc2FuaXR5LCBlcnJvcikgewotCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJUZXN0SW5zYW5pdHkiLCBfcGFyYW0wKQotCXJldDAsIF8gOj0gcmV0WzBdLihtYXBbdGhyaWZ0dGVzdC5Vc2VySWRdbWFwW3RocmlmdHRlc3QuTnVtYmVyel0qdGhyaWZ0dGVzdC5JbnNhbml0eSkKLQlyZXQxLCBfIDo9IHJldFsxXS4oZXJyb3IpCi0JcmV0dXJuIHJldDAsIHJldDEKLX0KLQotZnVuYyAoX21yICpfTW9ja1RocmlmdFRlc3RSZWNvcmRlcikgVGVzdEluc2FuaXR5KGFyZzAgaW50ZXJmYWNle30pICpnb21vY2suQ2FsbCB7Ci0JcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIlRlc3RJbnNhbml0eSIsIGFyZzApCi19Ci0KLWZ1bmMgKF9tICpNb2NrVGhyaWZ0VGVzdCkgVGVzdExpc3QoX3BhcmFtMCBbXWludDMyKSAoW11pbnQzMiwgZXJyb3IpIHsKLQlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiVGVzdExpc3QiLCBfcGFyYW0wKQotCXJldDAsIF8gOj0gcmV0WzBdLihbXWludDMyKQotCXJldDEsIF8gOj0gcmV0WzFdLihlcnJvcikKLQlyZXR1cm4gcmV0MCwgcmV0MQotfQotCi1mdW5jIChfbXIgKl9Nb2NrVGhyaWZ0VGVzdFJlY29yZGVyKSBUZXN0TGlzdChhcmcwIGludGVyZmFjZXt9KSAqZ29tb2NrLkNhbGwgewotCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJUZXN0TGlzdCIsIGFyZzApCi19Ci0KLWZ1bmMgKF9tICpNb2NrVGhyaWZ0VGVzdCkgVGVzdE1hcChfcGFyYW0wIG1hcFtpbnQzMl1pbnQzMikgKG1hcFtpbnQzMl1pbnQzMiwgZXJyb3IpIHsKLQlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiVGVzdE1hcCIsIF9wYXJhbTApCi0JcmV0MCwgXyA6PSByZXRbMF0uKG1hcFtpbnQzMl1pbnQzMikKLQlyZXQxLCBfIDo9IHJldFsxXS4oZXJyb3IpCi0JcmV0dXJuIHJldDAsIHJldDEKLX0KLQotZnVuYyAoX21yICpfTW9ja1RocmlmdFRlc3RSZWNvcmRlcikgVGVzdE1hcChhcmcwIGludGVyZmFjZXt9KSAqZ29tb2NrLkNhbGwgewotCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJUZXN0TWFwIiwgYXJnMCkKLX0KLQotZnVuYyAoX20gKk1vY2tUaHJpZnRUZXN0KSBUZXN0TWFwTWFwKF9wYXJhbTAgaW50MzIpIChtYXBbaW50MzJdbWFwW2ludDMyXWludDMyLCBlcnJvcikgewotCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJUZXN0TWFwTWFwIiwgX3BhcmFtMCkKLQlyZXQwLCBfIDo9IHJldFswXS4obWFwW2ludDMyXW1hcFtpbnQzMl1pbnQzMikKLQlyZXQxLCBfIDo9IHJldFsxXS4oZXJyb3IpCi0JcmV0dXJuIHJldDAsIHJldDEKLX0KLQotZnVuYyAoX21yICpfTW9ja1RocmlmdFRlc3RSZWNvcmRlcikgVGVzdE1hcE1hcChhcmcwIGludGVyZmFjZXt9KSAqZ29tb2NrLkNhbGwgewotCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJUZXN0TWFwTWFwIiwgYXJnMCkKLX0KLQotZnVuYyAoX20gKk1vY2tUaHJpZnRUZXN0KSBUZXN0TXVsdGkoX3BhcmFtMCBpbnQ4LCBfcGFyYW0xIGludDMyLCBfcGFyYW0yIGludDY0LCBfcGFyYW0zIG1hcFtpbnQxNl1zdHJpbmcsIF9wYXJhbTQgdGhyaWZ0dGVzdC5OdW1iZXJ6LCBfcGFyYW01IHRocmlmdHRlc3QuVXNlcklkKSAoKnRocmlmdHRlc3QuWHRydWN0LCBlcnJvcikgewotCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJUZXN0TXVsdGkiLCBfcGFyYW0wLCBfcGFyYW0xLCBfcGFyYW0yLCBfcGFyYW0zLCBfcGFyYW00LCBfcGFyYW01KQotCXJldDAsIF8gOj0gcmV0WzBdLigqdGhyaWZ0dGVzdC5YdHJ1Y3QpCi0JcmV0MSwgXyA6PSByZXRbMV0uKGVycm9yKQotCXJldHVybiByZXQwLCByZXQxCi19Ci0KLWZ1bmMgKF9tciAqX01vY2tUaHJpZnRUZXN0UmVjb3JkZXIpIFRlc3RNdWx0aShhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1IGludGVyZmFjZXt9KSAqZ29tb2NrLkNhbGwgewotCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJUZXN0TXVsdGkiLCBhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1KQotfQotCi1mdW5jIChfbSAqTW9ja1RocmlmdFRlc3QpIFRlc3RNdWx0aUV4Y2VwdGlvbihfcGFyYW0wIHN0cmluZywgX3BhcmFtMSBzdHJpbmcpICgqdGhyaWZ0dGVzdC5YdHJ1Y3QsIGVycm9yKSB7Ci0JcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlRlc3RNdWx0aUV4Y2VwdGlvbiIsIF9wYXJhbTAsIF9wYXJhbTEpCi0JcmV0MCwgXyA6PSByZXRbMF0uKCp0aHJpZnR0ZXN0Llh0cnVjdCkKLQlyZXQxLCBfIDo9IHJldFsxXS4oZXJyb3IpCi0JcmV0dXJuIHJldDAsIHJldDEKLX0KLQotZnVuYyAoX21yICpfTW9ja1RocmlmdFRlc3RSZWNvcmRlcikgVGVzdE11bHRpRXhjZXB0aW9uKGFyZzAsIGFyZzEgaW50ZXJmYWNle30pICpnb21vY2suQ2FsbCB7Ci0JcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIlRlc3RNdWx0aUV4Y2VwdGlvbiIsIGFyZzAsIGFyZzEpCi19Ci0KLWZ1bmMgKF9tICpNb2NrVGhyaWZ0VGVzdCkgVGVzdE5lc3QoX3BhcmFtMCAqdGhyaWZ0dGVzdC5YdHJ1Y3QyKSAoKnRocmlmdHRlc3QuWHRydWN0MiwgZXJyb3IpIHsKLQlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiVGVzdE5lc3QiLCBfcGFyYW0wKQotCXJldDAsIF8gOj0gcmV0WzBdLigqdGhyaWZ0dGVzdC5YdHJ1Y3QyKQotCXJldDEsIF8gOj0gcmV0WzFdLihlcnJvcikKLQlyZXR1cm4gcmV0MCwgcmV0MQotfQotCi1mdW5jIChfbXIgKl9Nb2NrVGhyaWZ0VGVzdFJlY29yZGVyKSBUZXN0TmVzdChhcmcwIGludGVyZmFjZXt9KSAqZ29tb2NrLkNhbGwgewotCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJUZXN0TmVzdCIsIGFyZzApCi19Ci0KLWZ1bmMgKF9tICpNb2NrVGhyaWZ0VGVzdCkgVGVzdE9uZXdheShfcGFyYW0wIGludDMyKSBlcnJvciB7Ci0JcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlRlc3RPbmV3YXkiLCBfcGFyYW0wKQotCXJldDAsIF8gOj0gcmV0WzBdLihlcnJvcikKLQlyZXR1cm4gcmV0MAotfQotCi1mdW5jIChfbXIgKl9Nb2NrVGhyaWZ0VGVzdFJlY29yZGVyKSBUZXN0T25ld2F5KGFyZzAgaW50ZXJmYWNle30pICpnb21vY2suQ2FsbCB7Ci0JcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIlRlc3RPbmV3YXkiLCBhcmcwKQotfQotCi1mdW5jIChfbSAqTW9ja1RocmlmdFRlc3QpIFRlc3RTZXQoX3BhcmFtMCBtYXBbaW50MzJdYm9vbCkgKG1hcFtpbnQzMl1ib29sLCBlcnJvcikgewotCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJUZXN0U2V0IiwgX3BhcmFtMCkKLQlyZXQwLCBfIDo9IHJldFswXS4obWFwW2ludDMyXWJvb2wpCi0JcmV0MSwgXyA6PSByZXRbMV0uKGVycm9yKQotCXJldHVybiByZXQwLCByZXQxCi19Ci0KLWZ1bmMgKF9tciAqX01vY2tUaHJpZnRUZXN0UmVjb3JkZXIpIFRlc3RTZXQoYXJnMCBpbnRlcmZhY2V7fSkgKmdvbW9jay5DYWxsIHsKLQlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiVGVzdFNldCIsIGFyZzApCi19Ci0KLWZ1bmMgKF9tICpNb2NrVGhyaWZ0VGVzdCkgVGVzdFN0cmluZyhfcGFyYW0wIHN0cmluZykgKHN0cmluZywgZXJyb3IpIHsKLQlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiVGVzdFN0cmluZyIsIF9wYXJhbTApCi0JcmV0MCwgXyA6PSByZXRbMF0uKHN0cmluZykKLQlyZXQxLCBfIDo9IHJldFsxXS4oZXJyb3IpCi0JcmV0dXJuIHJldDAsIHJldDEKLX0KLQotZnVuYyAoX21yICpfTW9ja1RocmlmdFRlc3RSZWNvcmRlcikgVGVzdFN0cmluZyhhcmcwIGludGVyZmFjZXt9KSAqZ29tb2NrLkNhbGwgewotCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJUZXN0U3RyaW5nIiwgYXJnMCkKLX0KLQotZnVuYyAoX20gKk1vY2tUaHJpZnRUZXN0KSBUZXN0U3RyaW5nTWFwKF9wYXJhbTAgbWFwW3N0cmluZ11zdHJpbmcpIChtYXBbc3RyaW5nXXN0cmluZywgZXJyb3IpIHsKLQlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiVGVzdFN0cmluZ01hcCIsIF9wYXJhbTApCi0JcmV0MCwgXyA6PSByZXRbMF0uKG1hcFtzdHJpbmddc3RyaW5nKQotCXJldDEsIF8gOj0gcmV0WzFdLihlcnJvcikKLQlyZXR1cm4gcmV0MCwgcmV0MQotfQotCi1mdW5jIChfbXIgKl9Nb2NrVGhyaWZ0VGVzdFJlY29yZGVyKSBUZXN0U3RyaW5nTWFwKGFyZzAgaW50ZXJmYWNle30pICpnb21vY2suQ2FsbCB7Ci0JcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIlRlc3RTdHJpbmdNYXAiLCBhcmcwKQotfQotCi1mdW5jIChfbSAqTW9ja1RocmlmdFRlc3QpIFRlc3RTdHJ1Y3QoX3BhcmFtMCAqdGhyaWZ0dGVzdC5YdHJ1Y3QpICgqdGhyaWZ0dGVzdC5YdHJ1Y3QsIGVycm9yKSB7Ci0JcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlRlc3RTdHJ1Y3QiLCBfcGFyYW0wKQotCXJldDAsIF8gOj0gcmV0WzBdLigqdGhyaWZ0dGVzdC5YdHJ1Y3QpCi0JcmV0MSwgXyA6PSByZXRbMV0uKGVycm9yKQotCXJldHVybiByZXQwLCByZXQxCi19Ci0KLWZ1bmMgKF9tciAqX01vY2tUaHJpZnRUZXN0UmVjb3JkZXIpIFRlc3RTdHJ1Y3QoYXJnMCBpbnRlcmZhY2V7fSkgKmdvbW9jay5DYWxsIHsKLQlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiVGVzdFN0cnVjdCIsIGFyZzApCi19Ci0KLWZ1bmMgKF9tICpNb2NrVGhyaWZ0VGVzdCkgVGVzdFR5cGVkZWYoX3BhcmFtMCB0aHJpZnR0ZXN0LlVzZXJJZCkgKHRocmlmdHRlc3QuVXNlcklkLCBlcnJvcikgewotCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJUZXN0VHlwZWRlZiIsIF9wYXJhbTApCi0JcmV0MCwgXyA6PSByZXRbMF0uKHRocmlmdHRlc3QuVXNlcklkKQotCXJldDEsIF8gOj0gcmV0WzFdLihlcnJvcikKLQlyZXR1cm4gcmV0MCwgcmV0MQotfQotCi1mdW5jIChfbXIgKl9Nb2NrVGhyaWZ0VGVzdFJlY29yZGVyKSBUZXN0VHlwZWRlZihhcmcwIGludGVyZmFjZXt9KSAqZ29tb2NrLkNhbGwgewotCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJUZXN0VHlwZWRlZiIsIGFyZzApCi19Ci0KLWZ1bmMgKF9tICpNb2NrVGhyaWZ0VGVzdCkgVGVzdFZvaWQoKSBlcnJvciB7Ci0JcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlRlc3RWb2lkIikKLQlyZXQwLCBfIDo9IHJldFswXS4oZXJyb3IpCi0JcmV0dXJuIHJldDAKLX0KLQotZnVuYyAoX21yICpfTW9ja1RocmlmdFRlc3RSZWNvcmRlcikgVGVzdFZvaWQoKSAqZ29tb2NrLkNhbGwgewotCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJUZXN0Vm9pZCIpCi19CmRpZmYgLS1naXQgYS90ZXN0L2dvL3NyYy9jb21tb24vcHJpbnRpbmdfaGFuZGxlci5nbyBiL3Rlc3QvZ28vc3JjL2NvbW1vbi9wcmludGluZ19oYW5kbGVyLmdvCmluZGV4IGJjMzA4YjYuLjJiMjJkMGMgMTAwNjQ0Ci0tLSBhL3Rlc3QvZ28vc3JjL2NvbW1vbi9wcmludGluZ19oYW5kbGVyLmdvCisrKyBiL3Rlc3QvZ28vc3JjL2NvbW1vbi9wcmludGluZ19oYW5kbGVyLmdvCkBAIC0yMCw5ICsyMCwxMCBAQAogcGFja2FnZSBjb21tb24KIAogaW1wb3J0ICgKKwkiY29udGV4dCIKKwkiZW5jb2RpbmcvaGV4IgogCSJlcnJvcnMiCiAJImZtdCIKLQkiZW5jb2RpbmcvaGV4IgogCS4gImdlbi90aHJpZnR0ZXN0IgogCSJ0aW1lIgogKQpAQCAtMzIsNyArMzMsNyBAQAogdHlwZSBwcmludGluZ0hhbmRsZXIgc3RydWN0e30KIAogLy8gUHJpbnRzICJ0ZXN0Vm9pZCgpIiBhbmQgcmV0dXJucyBub3RoaW5nLgotZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0Vm9pZCgpIChlcnIgZXJyb3IpIHsKK2Z1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdFZvaWQoY3R4IGNvbnRleHQuQ29udGV4dCkgKGVyciBlcnJvcikgewogCWZtdC5QcmludGxuKCJ0ZXN0Vm9pZCgpIikKIAlyZXR1cm4gbmlsCiB9CkBAIC00MywxOSArNDQsMTkgQEAKIC8vCiAvLyBQYXJhbWV0ZXJzOgogLy8gIC0gVGhpbmcKLWZ1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdFN0cmluZyh0aGluZyBzdHJpbmcpIChyIHN0cmluZywgZXJyIGVycm9yKSB7CitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RTdHJpbmcoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgc3RyaW5nKSAociBzdHJpbmcsIGVyciBlcnJvcikgewogCWZtdC5QcmludGYoInRlc3RTdHJpbmcoXCIlc1wiKVxuIiwgdGhpbmcpCiAJcmV0dXJuIHRoaW5nLCBuaWwKIH0KIAotLy8gUHJpbnRzICd0ZXN0Qm9vbCgiJWQiKScgd2l0aCB0aGluZyBhcyAndHJ1ZScgb3IgJ2ZhbHNlJworLy8gUHJpbnRzICd0ZXN0Qm9vbCgiJXQiKScgd2l0aCB0aGluZyBhcyAndHJ1ZScgb3IgJ2ZhbHNlJwogLy8gQHBhcmFtIGJvb2wgdGhpbmcgLSB0aGUgYm9vbCB0byBwcmludAogLy8gQHJldHVybiBib29sIC0gcmV0dXJucyB0aGUgYm9vbCAndGhpbmcnCiAvLwogLy8gUGFyYW1ldGVyczoKIC8vICAtIFRoaW5nCi1mdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RCb29sKHRoaW5nIGJvb2wpIChyIGJvb2wsIGVyciBlcnJvcikgewotCWZtdC5QcmludGYoInRlc3RCb29sKCVkKVxuIiwgdGhpbmcpCitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RCb29sKGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIGJvb2wpIChyIGJvb2wsIGVyciBlcnJvcikgeworCWZtdC5QcmludGYoInRlc3RCb29sKCV0KVxuIiwgdGhpbmcpCiAJcmV0dXJuIHRoaW5nLCBuaWwKIH0KIApAQCAtNjUsNyArNjYsNyBAQAogLy8KIC8vIFBhcmFtZXRlcnM6CiAvLyAgLSBUaGluZwotZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0Qnl0ZSh0aGluZyBpbnQ4KSAociBpbnQ4LCBlcnIgZXJyb3IpIHsKK2Z1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdEJ5dGUoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgaW50OCkgKHIgaW50OCwgZXJyIGVycm9yKSB7CiAJZm10LlByaW50ZigidGVzdEJ5dGUoJWQpXG4iLCB0aGluZykKIAlyZXR1cm4gdGhpbmcsIG5pbAogfQpAQCAtNzYsNyArNzcsNyBAQAogLy8KIC8vIFBhcmFtZXRlcnM6CiAvLyAgLSBUaGluZwotZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0STMyKHRoaW5nIGludDMyKSAociBpbnQzMiwgZXJyIGVycm9yKSB7CitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RJMzIoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgaW50MzIpIChyIGludDMyLCBlcnIgZXJyb3IpIHsKIAlmbXQuUHJpbnRmKCJ0ZXN0STMyKCVkKVxuIiwgdGhpbmcpCiAJcmV0dXJuIHRoaW5nLCBuaWwKIH0KQEAgLTg3LDcgKzg4LDcgQEAKIC8vCiAvLyBQYXJhbWV0ZXJzOgogLy8gIC0gVGhpbmcKLWZ1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdEk2NCh0aGluZyBpbnQ2NCkgKHIgaW50NjQsIGVyciBlcnJvcikgeworZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0STY0KGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIGludDY0KSAociBpbnQ2NCwgZXJyIGVycm9yKSB7CiAJZm10LlByaW50ZigidGVzdEk2NCglZClcbiIsIHRoaW5nKQogCXJldHVybiB0aGluZywgbmlsCiB9CkBAIC05OCw3ICs5OSw3IEBACiAvLwogLy8gUGFyYW1ldGVyczoKIC8vICAtIFRoaW5nCi1mdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3REb3VibGUodGhpbmcgZmxvYXQ2NCkgKHIgZmxvYXQ2NCwgZXJyIGVycm9yKSB7CitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3REb3VibGUoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgZmxvYXQ2NCkgKHIgZmxvYXQ2NCwgZXJyIGVycm9yKSB7CiAJZm10LlByaW50ZigidGVzdERvdWJsZSglZilcbiIsIHRoaW5nKQogCXJldHVybiB0aGluZywgbmlsCiB9CkBAIC0xMDksNyArMTEwLDcgQEAKIC8vCiAvLyBQYXJhbWV0ZXJzOgogLy8gIC0gVGhpbmcKLWZ1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdEJpbmFyeSh0aGluZyBbXWJ5dGUpIChyIFtdYnl0ZSwgZXJyIGVycm9yKSB7CitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RCaW5hcnkoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgW11ieXRlKSAociBbXWJ5dGUsIGVyciBlcnJvcikgewogCWZtdC5QcmludGYoInRlc3RCaW5hcnkoJXMpXG4iLCBoZXguRW5jb2RlVG9TdHJpbmcodGhpbmcpKQogCXJldHVybiB0aGluZywgbmlsCiB9CkBAIC0xMjAsNyArMTIxLDcgQEAKIC8vCiAvLyBQYXJhbWV0ZXJzOgogLy8gIC0gVGhpbmcKLWZ1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdFN0cnVjdCh0aGluZyAqWHRydWN0KSAociAqWHRydWN0LCBlcnIgZXJyb3IpIHsKK2Z1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdFN0cnVjdChjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyAqWHRydWN0KSAociAqWHRydWN0LCBlcnIgZXJyb3IpIHsKIAlmbXQuUHJpbnRmKCJ0ZXN0U3RydWN0KHtcIiVzXCIsICVkLCAlZCwgJWR9KVxuIiwgdGhpbmcuU3RyaW5nVGhpbmcsIHRoaW5nLkJ5dGVUaGluZywgdGhpbmcuSTMyVGhpbmcsIHRoaW5nLkk2NFRoaW5nKQogCXJldHVybiB0aGluZywgZXJyCiB9CkBAIC0xMzEsNyArMTMyLDcgQEAKIC8vCiAvLyBQYXJhbWV0ZXJzOgogLy8gIC0gVGhpbmcKLWZ1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdE5lc3QobmVzdCAqWHRydWN0MikgKHIgKlh0cnVjdDIsIGVyciBlcnJvcikgeworZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0TmVzdChjdHggY29udGV4dC5Db250ZXh0LCBuZXN0ICpYdHJ1Y3QyKSAociAqWHRydWN0MiwgZXJyIGVycm9yKSB7CiAJdGhpbmcgOj0gbmVzdC5TdHJ1Y3RUaGluZwogCWZtdC5QcmludGYoInRlc3ROZXN0KHslZCwge1wiJXNcIiwgJWQsICVkLCAlZH0sICVkfSlcbiIsIG5lc3QuQnl0ZVRoaW5nLCB0aGluZy5TdHJpbmdUaGluZywgdGhpbmcuQnl0ZVRoaW5nLCB0aGluZy5JMzJUaGluZywgdGhpbmcuSTY0VGhpbmcsIG5lc3QuSTMyVGhpbmcpCiAJcmV0dXJuIG5lc3QsIG5pbApAQCAtMTQ0LDcgKzE0NSw3IEBACiAvLwogLy8gUGFyYW1ldGVyczoKIC8vICAtIFRoaW5nCi1mdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RNYXAodGhpbmcgbWFwW2ludDMyXWludDMyKSAociBtYXBbaW50MzJdaW50MzIsIGVyciBlcnJvcikgeworZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0TWFwKGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIG1hcFtpbnQzMl1pbnQzMikgKHIgbWFwW2ludDMyXWludDMyLCBlcnIgZXJyb3IpIHsKIAlmbXQuUHJpbnRmKCJ0ZXN0TWFwKHsiKQogCWZpcnN0IDo9IHRydWUKIAlmb3IgaywgdiA6PSByYW5nZSB0aGluZyB7CkBAIC0xNjYsNyArMTY3LDcgQEAKIC8vCiAvLyBQYXJhbWV0ZXJzOgogLy8gIC0gVGhpbmcKLWZ1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdFN0cmluZ01hcCh0aGluZyBtYXBbc3RyaW5nXXN0cmluZykgKHIgbWFwW3N0cmluZ11zdHJpbmcsIGVyciBlcnJvcikgeworZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0U3RyaW5nTWFwKGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIG1hcFtzdHJpbmddc3RyaW5nKSAociBtYXBbc3RyaW5nXXN0cmluZywgZXJyIGVycm9yKSB7CiAJZm10LlByaW50ZigidGVzdFN0cmluZ01hcCh7IikKIAlmaXJzdCA6PSB0cnVlCiAJZm9yIGssIHYgOj0gcmFuZ2UgdGhpbmcgewpAQCAtMTg4LDcgKzE4OSw3IEBACiAvLwogLy8gUGFyYW1ldGVyczoKIC8vICAtIFRoaW5nCi1mdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RTZXQodGhpbmcgbWFwW2ludDMyXWJvb2wpIChyIG1hcFtpbnQzMl1ib29sLCBlcnIgZXJyb3IpIHsKK2Z1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdFNldChjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBbXWludDMyKSAociBbXWludDMyLCBlcnIgZXJyb3IpIHsKIAlmbXQuUHJpbnRmKCJ0ZXN0U2V0KHsiKQogCWZpcnN0IDo9IHRydWUKIAlmb3IgaywgXyA6PSByYW5nZSB0aGluZyB7CkBAIC0yMTAsNyArMjExLDcgQEAKIC8vCiAvLyBQYXJhbWV0ZXJzOgogLy8gIC0gVGhpbmcKLWZ1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdExpc3QodGhpbmcgW11pbnQzMikgKHIgW11pbnQzMiwgZXJyIGVycm9yKSB7CitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RMaXN0KGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIFtdaW50MzIpIChyIFtdaW50MzIsIGVyciBlcnJvcikgewogCWZtdC5QcmludGYoInRlc3RMaXN0KHsiKQogCWZvciBpLCB2IDo9IHJhbmdlIHRoaW5nIHsKIAkJaWYgaSAhPSAwIHsKQEAgLTIyOCw3ICsyMjksNyBAQAogLy8KIC8vIFBhcmFtZXRlcnM6CiAvLyAgLSBUaGluZwotZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0RW51bSh0aGluZyBOdW1iZXJ6KSAociBOdW1iZXJ6LCBlcnIgZXJyb3IpIHsKK2Z1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdEVudW0oY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgTnVtYmVyeikgKHIgTnVtYmVyeiwgZXJyIGVycm9yKSB7CiAJZm10LlByaW50ZigidGVzdEVudW0oJWQpXG4iLCB0aGluZykKIAlyZXR1cm4gdGhpbmcsIG5pbAogfQpAQCAtMjM5LDcgKzI0MCw3IEBACiAvLwogLy8gUGFyYW1ldGVyczoKIC8vICAtIFRoaW5nCi1mdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RUeXBlZGVmKHRoaW5nIFVzZXJJZCkgKHIgVXNlcklkLCBlcnIgZXJyb3IpIHsKK2Z1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdFR5cGVkZWYoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgVXNlcklkKSAociBVc2VySWQsIGVyciBlcnJvcikgewogCWZtdC5QcmludGYoInRlc3RUeXBlZGVmKCVkKVxuIiwgdGhpbmcpCiAJcmV0dXJuIHRoaW5nLCBuaWwKIH0KQEAgLTI1MSw3ICsyNTIsNyBAQAogLy8KIC8vIFBhcmFtZXRlcnM6CiAvLyAgLSBIZWxsbwotZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0TWFwTWFwKGhlbGxvIGludDMyKSAociBtYXBbaW50MzJdbWFwW2ludDMyXWludDMyLCBlcnIgZXJyb3IpIHsKK2Z1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdE1hcE1hcChjdHggY29udGV4dC5Db250ZXh0LCBoZWxsbyBpbnQzMikgKHIgbWFwW2ludDMyXW1hcFtpbnQzMl1pbnQzMiwgZXJyIGVycm9yKSB7CiAJZm10LlByaW50ZigidGVzdE1hcE1hcCglZClcbiIsIGhlbGxvKQogCiAJciA9IG1hcFtpbnQzMl1tYXBbaW50MzJdaW50MzJ7CkBAIC0yNzMsMTQgKzI3NCwxNCBAQAogLy8KIC8vIFBhcmFtZXRlcnM6CiAvLyAgLSBBcmd1bWVudAotZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0SW5zYW5pdHkoYXJndW1lbnQgKkluc2FuaXR5KSAociBtYXBbVXNlcklkXW1hcFtOdW1iZXJ6XSpJbnNhbml0eSwgZXJyIGVycm9yKSB7CitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RJbnNhbml0eShjdHggY29udGV4dC5Db250ZXh0LCBhcmd1bWVudCAqSW5zYW5pdHkpIChyIG1hcFtVc2VySWRdbWFwW051bWJlcnpdKkluc2FuaXR5LCBlcnIgZXJyb3IpIHsKIAlmbXQuUHJpbnRmKCJ0ZXN0SW5zYW5pdHkoKVxuIikKIAlyID0gbWFrZShtYXBbVXNlcklkXW1hcFtOdW1iZXJ6XSpJbnNhbml0eSkKLQlyWzFdID0gbWFwW051bWJlcnpdKkluc2FuaXR5IHsKKwlyWzFdID0gbWFwW051bWJlcnpdKkluc2FuaXR5ewogCQkyOiBhcmd1bWVudCwKIAkJMzogYXJndW1lbnQsCiAJfQotCXJbMl0gPSBtYXBbTnVtYmVyel0qSW5zYW5pdHkgeworCXJbMl0gPSBtYXBbTnVtYmVyel0qSW5zYW5pdHl7CiAJCTY6IE5ld0luc2FuaXR5KCksCiAJfQogCXJldHVybgpAQCAtMzAzLDcgKzMwNCw3IEBACiAvLyAgLSBBcmczCiAvLyAgLSBBcmc0CiAvLyAgLSBBcmc1Ci1mdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RNdWx0aShhcmcwIGludDgsIGFyZzEgaW50MzIsIGFyZzIgaW50NjQsIGFyZzMgbWFwW2ludDE2XXN0cmluZywgYXJnNCBOdW1iZXJ6LCBhcmc1IFVzZXJJZCkgKHIgKlh0cnVjdCwgZXJyIGVycm9yKSB7CitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RNdWx0aShjdHggY29udGV4dC5Db250ZXh0LCBhcmcwIGludDgsIGFyZzEgaW50MzIsIGFyZzIgaW50NjQsIGFyZzMgbWFwW2ludDE2XXN0cmluZywgYXJnNCBOdW1iZXJ6LCBhcmc1IFVzZXJJZCkgKHIgKlh0cnVjdCwgZXJyIGVycm9yKSB7CiAJZm10LlByaW50ZigidGVzdE11bHRpKClcbiIpCiAJciA9IE5ld1h0cnVjdCgpCiAKQEAgLTMyMiw3ICszMjMsNyBAQAogLy8KIC8vIFBhcmFtZXRlcnM6CiAvLyAgLSBBcmcKLWZ1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdEV4Y2VwdGlvbihhcmcgc3RyaW5nKSAoZXJyIGVycm9yKSB7CitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RFeGNlcHRpb24oY3R4IGNvbnRleHQuQ29udGV4dCwgYXJnIHN0cmluZykgKGVyciBlcnJvcikgewogCWZtdC5QcmludGYoInRlc3RFeGNlcHRpb24oJXMpXG4iLCBhcmcpCiAJc3dpdGNoIGFyZyB7CiAJY2FzZSAiWGNlcHRpb24iOgpAQCAtMzQ2LDcgKzM0Nyw3IEBACiAvLyBQYXJhbWV0ZXJzOgogLy8gIC0gQXJnMAogLy8gIC0gQXJnMQotZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0TXVsdGlFeGNlcHRpb24oYXJnMCBzdHJpbmcsIGFyZzEgc3RyaW5nKSAociAqWHRydWN0LCBlcnIgZXJyb3IpIHsKK2Z1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdE11bHRpRXhjZXB0aW9uKGN0eCBjb250ZXh0LkNvbnRleHQsIGFyZzAgc3RyaW5nLCBhcmcxIHN0cmluZykgKHIgKlh0cnVjdCwgZXJyIGVycm9yKSB7CiAJZm10LlByaW50ZigidGVzdE11bHRpRXhjZXB0aW9uKCVzLCAlcylcbiIsIGFyZzAsIGFyZzEpCiAJc3dpdGNoIGFyZzAgewogCkBAIC0zNzUsNyArMzc2LDcgQEAKIC8vCiAvLyBQYXJhbWV0ZXJzOgogLy8gIC0gU2Vjb25kc1RvU2xlZXAKLWZ1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdE9uZXdheShzZWNvbmRzVG9TbGVlcCBpbnQzMikgKGVyciBlcnJvcikgeworZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0T25ld2F5KGN0eCBjb250ZXh0LkNvbnRleHQsIHNlY29uZHNUb1NsZWVwIGludDMyKSAoZXJyIGVycm9yKSB7CiAJZm10LlByaW50ZigidGVzdE9uZXdheSglZCk6IFNsZWVwaW5nLi4uXG4iLCBzZWNvbmRzVG9TbGVlcCkKIAl0aW1lLlNsZWVwKHRpbWUuU2Vjb25kICogdGltZS5EdXJhdGlvbihzZWNvbmRzVG9TbGVlcCkpCiAJZm10LlByaW50ZigidGVzdE9uZXdheSglZCk6IGRvbmUgc2xlZXBpbmchXG4iLCBzZWNvbmRzVG9TbGVlcCkKZGlmZiAtLWdpdCBhL3Rlc3QvZ28vc3JjL2NvbW1vbi9zZXJ2ZXIuZ28gYi90ZXN0L2dvL3NyYy9jb21tb24vc2VydmVyLmdvCmluZGV4IGRjMzgwYjIuLjVhYzQ0MDAgMTAwNjQ0Ci0tLSBhL3Rlc3QvZ28vc3JjL2NvbW1vbi9zZXJ2ZXIuZ28KKysrIGIvdGVzdC9nby9zcmMvY29tbW9uL3NlcnZlci5nbwpAQCAtMzcsNyArMzcsNyBAQAogCWZsYWcuQm9vbFZhcigmZGVidWdTZXJ2ZXJQcm90b2NvbCwgImRlYnVnX3NlcnZlcl9wcm90b2NvbCIsIGZhbHNlLCAidHVybiBzZXJ2ZXIgcHJvdG9jb2wgdHJhY2Ugb24iKQogfQogCi1mdW5jIFN0YXJ0U2VydmVyKAorZnVuYyBHZXRTZXJ2ZXJQYXJhbXMoCiAJaG9zdCBzdHJpbmcsCiAJcG9ydCBpbnQ2NCwKIAlkb21haW5fc29ja2V0IHN0cmluZywKQEAgLTQ1LDggKzQ1LDkgQEAKIAlwcm90b2NvbCBzdHJpbmcsCiAJc3NsIGJvb2wsCiAJY2VydFBhdGggc3RyaW5nLAotCWhhbmRsZXIgdGhyaWZ0dGVzdC5UaHJpZnRUZXN0KSAoc3J2ICp0aHJpZnQuVFNpbXBsZVNlcnZlciwgZXJyIGVycm9yKSB7CisJaGFuZGxlciB0aHJpZnR0ZXN0LlRocmlmdFRlc3QpICh0aHJpZnQuVFByb2Nlc3NvciwgdGhyaWZ0LlRTZXJ2ZXJUcmFuc3BvcnQsIHRocmlmdC5UVHJhbnNwb3J0RmFjdG9yeSwgdGhyaWZ0LlRQcm90b2NvbEZhY3RvcnksIGVycm9yKSB7CiAKKwl2YXIgZXJyIGVycm9yCiAJaG9zdFBvcnQgOj0gZm10LlNwcmludGYoIiVzOiVkIiwgaG9zdCwgcG9ydCkKIAogCXZhciBwcm90b2NvbEZhY3RvcnkgdGhyaWZ0LlRQcm90b2NvbEZhY3RvcnkKQEAgLTYwLDcgKzYxLDcgQEAKIAljYXNlICJiaW5hcnkiOgogCQlwcm90b2NvbEZhY3RvcnkgPSB0aHJpZnQuTmV3VEJpbmFyeVByb3RvY29sRmFjdG9yeURlZmF1bHQoKQogCWRlZmF1bHQ6Ci0JCXJldHVybiBuaWwsIGZtdC5FcnJvcmYoIkludmFsaWQgcHJvdG9jb2wgc3BlY2lmaWVkICVzIiwgcHJvdG9jb2wpCisJCXJldHVybiBuaWwsIG5pbCwgbmlsLCBuaWwsIGZtdC5FcnJvcmYoIkludmFsaWQgcHJvdG9jb2wgc3BlY2lmaWVkICVzIiwgcHJvdG9jb2wpCiAJfQogCWlmIGRlYnVnU2VydmVyUHJvdG9jb2wgewogCQlwcm90b2NvbEZhY3RvcnkgPSB0aHJpZnQuTmV3VERlYnVnUHJvdG9jb2xGYWN0b3J5KHByb3RvY29sRmFjdG9yeSwgInNlcnZlcjoiKQpAQCAtNzAsNyArNzEsNyBAQAogCWlmIHNzbCB7CiAJCWNmZyA6PSBuZXcodGxzLkNvbmZpZykKIAkJaWYgY2VydCwgZXJyIDo9IHRscy5Mb2FkWDUwOUtleVBhaXIoY2VydFBhdGgrIi9zZXJ2ZXIuY3J0IiwgY2VydFBhdGgrIi9zZXJ2ZXIua2V5Iik7IGVyciAhPSBuaWwgewotCQkJcmV0dXJuIG5pbCwgZXJyCisJCQlyZXR1cm4gbmlsLCBuaWwsIG5pbCwgbmlsLCBlcnIKIAkJfSBlbHNlIHsKIAkJCWNmZy5DZXJ0aWZpY2F0ZXMgPSBhcHBlbmQoY2ZnLkNlcnRpZmljYXRlcywgY2VydCkKIAkJfQpAQCAtODMsMTggKzg0LDE1IEBACiAJCX0KIAl9CiAJaWYgZXJyICE9IG5pbCB7Ci0JCXJldHVybiBuaWwsIGVycgorCQlyZXR1cm4gbmlsLCBuaWwsIG5pbCwgbmlsLCBlcnIKIAl9CiAKIAl2YXIgdHJhbnNwb3J0RmFjdG9yeSB0aHJpZnQuVFRyYW5zcG9ydEZhY3RvcnkKIAogCXN3aXRjaCB0cmFuc3BvcnQgewogCWNhc2UgImh0dHAiOgotCQlyZXR1cm4gbmlsLCBmbXQuRXJyb3JmKCJIdHRwIHNlcnZlciB0cmFuc3BvcnQgaXMgbm90IHN1cHBvcnRlZCIpCi0JCS8vIHRyYW5zLCBlcnIgPSB0aHJpZnQuTmV3VEh0dHBDbGllbnQoZm10LlNwcmludGYoImh0dHA6Ly8lcy9zZXJ2aWNlIiwgaG9zdFBvcnQpKQotCQkvLyBpZiBlcnIgIT0gbmlsIHsKLQkJLy8gCXJldHVybiBuaWwsIGVycgotCQkvLyB9CisJCS8vIHRoZXJlIGlzIG5vIHN1Y2ggZmFjdG9yeSwgYW5kIHdlIGRvbid0IG5lZWQgYW55CisJCXRyYW5zcG9ydEZhY3RvcnkgPSBuaWwKIAljYXNlICJmcmFtZWQiOgogCQl0cmFuc3BvcnRGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RUcmFuc3BvcnRGYWN0b3J5KCkKIAkJdHJhbnNwb3J0RmFjdG9yeSA9IHRocmlmdC5OZXdURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSh0cmFuc3BvcnRGYWN0b3J5KQpAQCAtMTA1LDEzICsxMDMsOSBAQAogCWNhc2UgIiI6CiAJCXRyYW5zcG9ydEZhY3RvcnkgPSB0aHJpZnQuTmV3VFRyYW5zcG9ydEZhY3RvcnkoKQogCWRlZmF1bHQ6Ci0JCXJldHVybiBuaWwsIGZtdC5FcnJvcmYoIkludmFsaWQgdHJhbnNwb3J0IHNwZWNpZmllZCAlcyIsIHRyYW5zcG9ydCkKKwkJcmV0dXJuIG5pbCwgbmlsLCBuaWwsIG5pbCwgZm10LkVycm9yZigiSW52YWxpZCB0cmFuc3BvcnQgc3BlY2lmaWVkICVzIiwgdHJhbnNwb3J0KQogCX0KIAlwcm9jZXNzb3IgOj0gdGhyaWZ0dGVzdC5OZXdUaHJpZnRUZXN0UHJvY2Vzc29yKGhhbmRsZXIpCi0Jc2VydmVyIDo9IHRocmlmdC5OZXdUU2ltcGxlU2VydmVyNChwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KQotCWlmIGVyciA9IHNlcnZlci5MaXN0ZW4oKTsgZXJyICE9IG5pbCB7Ci0JCXJldHVybgotCX0KLQlnbyBzZXJ2ZXIuQWNjZXB0TG9vcCgpCi0JcmV0dXJuIHNlcnZlciwgbmlsCisKKwlyZXR1cm4gcHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSwgbmlsCiB9CmRpZmYgLS1naXQgYS90ZXN0L2dvL3NyYy9jb21tb24vc2ltcGxlX2hhbmRsZXIuZ28gYi90ZXN0L2dvL3NyYy9jb21tb24vc2ltcGxlX2hhbmRsZXIuZ28KaW5kZXggOTQ0ZjExYy4uMGM5NDYzZCAxMDA2NDQKLS0tIGEvdGVzdC9nby9zcmMvY29tbW9uL3NpbXBsZV9oYW5kbGVyLmdvCisrKyBiL3Rlc3QvZ28vc3JjL2NvbW1vbi9zaW1wbGVfaGFuZGxlci5nbwpAQCAtNzcsNyArNzcsNyBAQAogCXJldHVybiB0aGluZywgbmlsCiB9CiAKLWZ1bmMgKHAgKnNpbXBsZUhhbmRsZXIpIFRlc3RTZXQodGhpbmcgbWFwW2ludDMyXWJvb2wpIChyIG1hcFtpbnQzMl1ib29sLCBlcnIgZXJyb3IpIHsKK2Z1bmMgKHAgKnNpbXBsZUhhbmRsZXIpIFRlc3RTZXQodGhpbmcgW11pbnQzMikgKHIgW11pbnQzMiwgZXJyIGVycm9yKSB7CiAJcmV0dXJuIHRoaW5nLCBuaWwKIH0KIApkaWZmIC0tZ2l0IGEvdGVzdC9oYXhlL01ha2VmaWxlLmFtIGIvdGVzdC9oYXhlL01ha2VmaWxlLmFtCmluZGV4IDM3Y2NmYzMuLjZjMDQ4M2UgMTAwNjQ0Ci0tLSBhL3Rlc3QvaGF4ZS9NYWtlZmlsZS5hbQorKysgYi90ZXN0L2hheGUvTWFrZWZpbGUuYW0KQEAgLTE3LDE2ICsxNywxNyBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotVEhSSUZUID0gJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKIFRIUklGVENNRCA9ICQoVEhSSUZUKSAtLWdlbiBoYXhlIC1yCiBUSFJJRlRURVNUID0gJCh0b3Bfc3JjZGlyKS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CiAKIEJJTl9DUFAgPSBiaW4vTWFpbi1kZWJ1ZworQklOX1BIUCA9IGJpbi9waHAvTWFpbi1kZWJ1Zy5waHAKK0JJTl9QSFBfV0VCID0gYmluL3BocC13ZWItc2VydmVyL01haW4tZGVidWcucGhwCiAKIGdlbi1oYXhlL3RocmlmdC90ZXN0L1RocmlmdFRlc3QuaHg6ICQoVEhSSUZUVEVTVCkKIAkkKFRIUklGVENNRCkgJChUSFJJRlRURVNUKQogCi1hbGwtbG9jYWw6ICQoQklOX0NQUCkKK2FsbC1sb2NhbDogJChCSU5fQ1BQKSAkKEJJTl9QSFApICQoQklOX1BIUF9XRUIpCiAKICQoQklOX0NQUCk6IFwKIAkJc3JjLyouaHggXApAQCAtMzQsNiArMzUsMTkgQEAKIAkJZ2VuLWhheGUvdGhyaWZ0L3Rlc3QvVGhyaWZ0VGVzdC5oeAogCSQoSEFYRSkgLS1jd2QgLiAgY3BwLmh4bWwKIAorJChCSU5fUEhQKTogXAorCQlzcmMvKi5oeCBcCisJCS4uLy4uL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC8qKi8qLmh4IFwKKwkJZ2VuLWhheGUvdGhyaWZ0L3Rlc3QvVGhyaWZ0VGVzdC5oeAorCSQoSEFYRSkgLS1jd2QgLiAgcGhwLmh4bWwKKworJChCSU5fUEhQX1dFQik6IFwKKwkJc3JjLyouaHggXAorCQkuLi8uLi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvKiovKi5oeCBcCisJCWdlbi1oYXhlL3RocmlmdC90ZXN0L1RocmlmdFRlc3QuaHgKKwkkKEhBWEUpIC0tY3dkIC4gIHBocC13ZWItc2VydmVyLmh4bWwKKworCiAKICNUT0RPOiBvdGhlciBoYXhlIHRhcmdldHMKICMgICAgJChIQVhFKSAgLS1jd2QgLiAgY3NoYXJwCkBAIC00MSwzMCArNTUsNTAgQEAKICMgICAgJChIQVhFKSAgLS1jd2QgLiAgamF2YQogIyAgICAkKEhBWEUpICAtLWN3ZCAuICBqYXZhc2NyaXB0CiAjICAgICQoSEFYRSkgIC0tY3dkIC4gIG5la28KLSMgICAgJChIQVhFKSAgLS1jd2QgLiAgcGhwCiAjICAgICQoSEFYRSkgIC0tY3dkIC4gIHB5dGhvbiAgIyBuZWVkcyBIYXhlIDMuMi4wCiAKIAogY2xlYW4tbG9jYWw6CiAJJChSTSkgLXIgZ2VuLWhheGUgYmluCiAKLWNoZWNrOiAkKEJJTl9DUFApCi0JdGltZW91dCAxMCAkKEJJTl9DUFApIHNlcnZlciAmCisuTk9UUEFSQUxMRUw6CisKK2NoZWNrOiBjaGVja19jcHAgXAorCWNoZWNrX3BocCBcCisJY2hlY2tfcGhwX3dlYiAKKworY2hlY2tfY3BwOiAkKEJJTl9DUFApIAorCXRpbWVvdXQgMjAgJChCSU5fQ1BQKSBzZXJ2ZXIgJgogCXNsZWVwIDEKIAkkKEJJTl9DUFApIGNsaWVudAogCXNsZWVwIDEwCiAKK2NoZWNrX3BocDogJChCSU5fUEhQKSAKKwl0aW1lb3V0IDIwIHBocCAtZiAkKEJJTl9QSFApIHNlcnZlciAmCisJc2xlZXAgMQorCXBocCAtZiAkKEJJTl9QSFApIGNsaWVudAorCXNsZWVwIDEwCisKK2NoZWNrX3BocF93ZWI6ICQoQklOX1BIUF9XRUIpICQoQklOX0NQUCkKKwl0aW1lb3V0IDIwIHBocCAtUyAxMjcuMC4wLjE6OTA5MCByb3V0ZXIucGhwICYKKwlzbGVlcCAxCisJJChCSU5fQ1BQKSBjbGllbnQgLS10cmFuc3BvcnQgaHR0cAorCXNsZWVwIDEwCisKKwogRVhUUkFfRElTVCA9IFwKLSAgICAgICAgICAgICBzcmMgXAotICAgICAgICAgICAgIGNwcC5oeG1sIFwKLSAgICAgICAgICAgICBjc2hhcnAuaHhtbCBcCi0gICAgICAgICAgICAgZmxhc2guaHhtbCBcCi0gICAgICAgICAgICAgamF2YS5oeG1sIFwKLSAgICAgICAgICAgICBqYXZhc2NyaXB0Lmh4bWwgXAotICAgICAgICAgICAgIG5la28uaHhtbCBcCi0gICAgICAgICAgICAgcGhwLmh4bWwgXAotICAgICAgICAgICAgIHB5dGhvbi5oeG1sIFwKLSAgICAgICAgICAgICBwcm9qZWN0LmhpZGUgXAotICAgICAgICAgICAgIFRlc3RDbGllbnRTZXJ2ZXIuaHhwcm9qIFwKLSAgICAgICAgICAgICBtYWtlX2FsbC5iYXQgXAotICAgICAgICAgICAgIG1ha2VfYWxsLnNoCisJc3JjIFwKKwljcHAuaHhtbCBcCisJY3NoYXJwLmh4bWwgXAorCWZsYXNoLmh4bWwgXAorCWphdmEuaHhtbCBcCisJamF2YXNjcmlwdC5oeG1sIFwKKwluZWtvLmh4bWwgXAorCXBocC5oeG1sIFwKKwlweXRob24uaHhtbCBcCisJcm91dGVyLnBocCBcCisJcHJvamVjdC5oaWRlIFwKKwlwaHAtd2ViLXNlcnZlci5oeG1sIFwKKwlUZXN0Q2xpZW50U2VydmVyLmh4cHJvaiBcCisJbWFrZV9hbGwuYmF0IFwKKwltYWtlX2FsbC5zaApkaWZmIC0tZ2l0IGEvdGVzdC9oYXhlL21ha2VfYWxsLnNoIGIvdGVzdC9oYXhlL21ha2VfYWxsLnNoCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggMjYyMTI1OC4uZWIyYzljMgotLS0gYS90ZXN0L2hheGUvbWFrZV9hbGwuc2gKKysrIGIvdGVzdC9oYXhlL21ha2VfYWxsLnNoCkBAIC0xOSw3ICsxOSw3IEBACiAjCiAKICMgaW52b2tlIFRocmlmdCBjb21ucGlsZXIKLXRocmlmdCAtciAtZ2VuIGhheGUgIC4uL1RocmlmdFRlc3QudGhyaWZ0CisuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1yIC1nZW4gaGF4ZSAgLi4vVGhyaWZ0VGVzdC50aHJpZnQKIAogIyBvdXRwdXQgZm9sZGVyCiBpZiBbICEgLWQgYmluIF07IHRoZW4KZGlmZiAtLWdpdCBhL3Rlc3QvaGF4ZS9waHAtd2ViLXNlcnZlci5oeG1sIGIvdGVzdC9oYXhlL3BocC13ZWItc2VydmVyLmh4bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk1YTg1MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaGF4ZS9waHAtd2ViLXNlcnZlci5oeG1sCkBAIC0wLDAgKzEsNDMgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIAorI2ludGVncmF0ZSBmaWxlcyB0byBjbGFzc3BhdGgKKy1jcCBzcmMKKy1jcCBnZW4taGF4ZQorLWNwIC4uLy4uL2xpYi9oYXhlL3NyYworCisjdGhpcyBjbGFzcyB3aWwgYmUgdXNlZCBhcyBlbnRyeSBwb2ludCBmb3IgeW91ciBhcHAuCistbWFpbiBNYWluCisKKyNQSFAgdGFyZ2V0CistcGhwIGJpbi9waHAtd2ViLXNlcnZlci8KKy0tcGhwLWZyb250IE1haW4tZGVidWcucGhwCisKKyNkZWZpbmVzCistRCBwaHB3ZWJzZXJ2ZXIKKworCisjQWRkIGRlYnVnIGluZm9ybWF0aW9uCistZGVidWcKKworI2RlYWQgY29kZSBlbGltaW5hdGlvbiA6IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIG5vIiA6IGRvIG5vdCByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBzdGQiIDogcmVtb3ZlIHVudXNlZCBjb2RlIGluIHRoZSBzdGQgbGliIChkZWZhdWx0KQorIyItZGNlIGZ1bGwiIDogcmVtb3ZlIGFsbCB1bnVzZWQgY29kZQorLWRjZSBmdWxsCmRpZmYgLS1naXQgYS90ZXN0L2hheGUvcGhwLmh4bWwgYi90ZXN0L2hheGUvcGhwLmh4bWwKaW5kZXggMWVhYWM4Yi4uOTY1MTg5OCAxMDA2NDQKLS0tIGEvdGVzdC9oYXhlL3BocC5oeG1sCisrKyBiL3Rlc3QvaGF4ZS9waHAuaHhtbApAQCAtMjYsNyArMjYsOSBAQAogLW1haW4gTWFpbgogCiAjUEhQIHRhcmdldAotLXBocCBiaW4vVHV0b3JpYWwucGhwCistcGhwIGJpbi9waHAvCistLXBocC1mcm9udCBNYWluLWRlYnVnLnBocAorCiAKICNBZGQgZGVidWcgaW5mb3JtYXRpb24KIC1kZWJ1ZwpAQCAtMzUsNCArMzcsNCBAQAogIyItZGNlIG5vIiA6IGRvIG5vdCByZW1vdmUgdW51c2VkIGNvZGUKICMiLWRjZSBzdGQiIDogcmVtb3ZlIHVudXNlZCBjb2RlIGluIHRoZSBzdGQgbGliIChkZWZhdWx0KQogIyItZGNlIGZ1bGwiIDogcmVtb3ZlIGFsbCB1bnVzZWQgY29kZQotLWRjZSBmdWxsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorLWRjZSBmdWxsCmRpZmYgLS1naXQgYS90ZXN0L2hheGUvcm91dGVyLnBocCBiL3Rlc3QvaGF4ZS9yb3V0ZXIucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNDEzNWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2hheGUvcm91dGVyLnBocApAQCAtMCwwICsxLDMxIEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQKKyAqLworCisKKworLy9yb3V0ZXIgZmlsZSB0byBydW4gdGVzdGluZyB3ZWIgc2VydmVyCisKKy8vc2V0X3RpbWVfbGltaXQoMSk7CisKK3JlcXVpcmVfb25jZSAgZGlybmFtZShfX0ZJTEVfXykgLiAnL2Jpbi9waHAtd2ViLXNlcnZlci9NYWluLWRlYnVnLnBocCc7CisKKwpkaWZmIC0tZ2l0IGEvdGVzdC9oYXhlL3NyYy9Bcmd1bWVudHMuaHggYi90ZXN0L2hheGUvc3JjL0FyZ3VtZW50cy5oeAppbmRleCBjYWU5MWRmLi5jYzEwNzQ5IDEwMDY0NAotLS0gYS90ZXN0L2hheGUvc3JjL0FyZ3VtZW50cy5oeAorKysgYi90ZXN0L2hheGUvc3JjL0FyZ3VtZW50cy5oeApAQCAtNzIsMTIgKzcyLDE4IEBACiAKICAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCkgewogICAgICAgICAjaWYgc3lzCi0gICAgICAgIHRyeSB7CisgICAgICAgICAgI2lmICFwaHB3ZWJzZXJ2ZXIKKyAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICBQYXJzZUFyZ3MoKTsKLSAgICAgICAgfSBjYXRjaCAoZSA6IFN0cmluZykgeworICAgICAgICAgIH0gY2F0Y2ggKGUgOiBTdHJpbmcpIHsKICAgICAgICAgICAgIHRyYWNlKEdldEhlbHAoKSk7CiAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgICNlbHNlCisgICAgICAgICAgICAvL2ZvcmNpbmcgc2VydmVyCisgICAgICAgICAgICBzZXJ2ZXIgPSB0cnVlOworICAgICAgICAgICAgdHJhbnNwb3J0ID0gaHR0cDsKKyAgICAgICAgICAjZW5kCiAgICAgICAgICNlbHNlCiAgICAgICAgIHRyYWNlKCJXTjogUGxhdGZvcm0gZG9lcyBub3Qgc3VwcG9ydCBwcm9ncmFtIGFyZ3VtZW50cywgdXNpbmcgZGVmYXVsdHMuIik7CiAgICAgICAgICNlbmQKZGlmZiAtLWdpdCBhL3Rlc3QvaGF4ZS9zcmMvTWFpbi5oeCBiL3Rlc3QvaGF4ZS9zcmMvTWFpbi5oeAppbmRleCAzMGMwNGE2Li45ZWI4MjhmIDEwMDY0NAotLS0gYS90ZXN0L2hheGUvc3JjL01haW4uaHgKKysrIGIvdGVzdC9oYXhlL3NyYy9NYWluLmh4CkBAIC0zMSw2ICszMSwxNSBAQAogY2xhc3MgTWFpbgogewogICAgIHN0YXRpYyBmdW5jdGlvbiBtYWluKCkgeworICAgICAgICAjaWYgcGhwd2Vic2VydmVyCisgICAgICAgIGluaXRQaHBXZWJTZXJ2ZXIoKTsKKyAgICAgICAgLy9jaGVjayBtZXRob2QKKyAgICAgICAgaWYocGhwLldlYi5nZXRNZXRob2QoKSAhPSAnUE9TVCcpIHsKKyAgICAgICAgICBTeXMucHJpbnRsbignaHR0cCBlbmRwb2ludCBmb3IgdGhyaWZ0IHRlc3Qgc2VydmVyJyk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgICNlbmQKKwogICAgICAgICB0cnkgewogICAgICAgICAgICAgdmFyIGFyZ3MgPSBuZXcgQXJndW1lbnRzKCk7CiAKQEAgLTQ4LDQgKzU3LDI3IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAjaWYgcGhwd2Vic2VydmVyCisgICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaW5pdFBocFdlYlNlcnZlcigpCisgICAgeworICAgICAgICAvL3JlbWFwIHRyYWNlIHRvIGVycm9yIGxvZworICAgICAgICBoYXhlLkxvZy50cmFjZSA9IGZ1bmN0aW9uKHY6RHluYW1pYywgP2luZm9zOmhheGUuUG9zSW5mb3MpCisgICAgICAgIHsKKyAgICAgICAgICAvLyBoYW5kbGUgdHJhY2UKKyAgICAgICAgICB2YXIgbmV3VmFsdWUgOiBEeW5hbWljOworICAgICAgICAgIGlmIChpbmZvcyAhPSBudWxsICYmIGluZm9zLmN1c3RvbVBhcmFtcyE9bnVsbCkgeworICAgICAgICAgICAgdmFyIGV4dHJhOlN0cmluZyA9ICIiOworICAgICAgICAgICAgZm9yKCB2IGluIGluZm9zLmN1c3RvbVBhcmFtcyApCisgICAgICAgICAgICAgIGV4dHJhICs9ICIsIiArIHY7CisgICAgICAgICAgICBuZXdWYWx1ZSA9IHYgKyBleHRyYTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBuZXdWYWx1ZSA9IHY7CisgICAgICAgICAgfQorICAgICAgICAgIHZhciBtc2cgPSBpbmZvcyAhPSBudWxsID8gaW5mb3MuZmlsZU5hbWUgKyAnOicgKyBpbmZvcy5saW5lTnVtYmVyICsgJzogJyA6ICcnOworICAgICAgICAgIFN5cy5zdGRlcnIoKS53cml0ZVN0cmluZygnJHttc2d9JHtuZXdWYWx1ZX1cbicpOworICAgICAgICB9CisgICAgfQorICAgICNlbmQKKwogfQpkaWZmIC0tZ2l0IGEvdGVzdC9oYXhlL3NyYy9UZXN0Q2xpZW50Lmh4IGIvdGVzdC9oYXhlL3NyYy9UZXN0Q2xpZW50Lmh4CmluZGV4IDVjMGRlN2MuLjg1MzMxOWUgMTAwNjQ0Ci0tLSBhL3Rlc3QvaGF4ZS9zcmMvVGVzdENsaWVudC5oeAorKysgYi90ZXN0L2hheGUvc3JjL1Rlc3RDbGllbnQuaHgKQEAgLTQzLDYgKzQzLDggQEAKIGltcG9ydCB0aHJpZnQudGVzdC4qOyAgLy8gZ2VuZXJhdGVkIGNvZGUKIAogCit1c2luZyBTdHJpbmdUb29sczsKKwogY2xhc3MgVGVzdFJlc3VsdHMgewogICAgIHByaXZhdGUgdmFyIHN1Y2Nlc3NDbnQgOiBJbnQgPSAwOwogICAgIHByaXZhdGUgdmFyIGVycm9yQ250IDogSW50ID0gMDsKQEAgLTEwMiw3ICsxMDQsNyBAQAogICAgICAgICBpZiAoIGVycm9yQ250ID4gMCkKICAgICAgICAgewogICAgICAgICAgICAgdHJhY2UoJz09PT09PT09PT09PT09PT09PT09PT09PT09PScpOwotICAgICAgICAgICAgICB0cmFjZSgnRkFJTEVEIFRFU1RTOiAkZmFpbGVkVGVzdHMnKTsKKyAgICAgICAgICAgIHRyYWNlKCdGQUlMRUQgVEVTVFM6ICRmYWlsZWRUZXN0cycpOwogICAgICAgICB9CiAgICAgICAgIHRyYWNlKCc9PT09PT09PT09PT09PT09PT09PT09PT09PT0nKTsKICAgICB9CkBAIC0xMTgsMjAgKzEyMCwxNSBAQAogICAgICAgICB7CiAgICAgICAgICAgICB2YXIgZGlmZnQgPSBUaW1lci5zdGFtcCgpOwogCi0gICAgICAgICAgICBpZiggYXJncy5udW1UaHJlYWRzID4gMSkgewotICAgICAgICAgICAgICAgIHZhciB0aHJlYWRzID0gbmV3IExpc3Q8VGhyZWFkPigpOwotICAgICAgICAgICAgICAgIGZvciggdGVzdCBpbiAwIC4uLiBhcmdzLm51bVRocmVhZHMpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyZWFkcy5hZGQoIFN0YXJ0VGhyZWFkKCBhcmdzKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGV4aXRDb2RlID0gMDsKLSAgICAgICAgICAgICAgICBmb3IoIHRocmVhZCBpbiB0aHJlYWRzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGV4aXRDb2RlIHw9IFRocmVhZC5yZWFkTWVzc2FnZSh0cnVlKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIGFyZ3MubnVtVGhyZWFkcyA+IDEpIHsKKyAgICAgICAgICAgICAgICAjaWYgY3BwCisgICAgICAgICAgICAgICAgZXhpdENvZGUgPSBNdWx0aVRocmVhZENsaWVudChhcmdzKTsKKyAgICAgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICAgIHRyYWNlKCdUaHJlYWRzIG5vdCBzdXBwb3J0ZWQvaW1wbGVtZW50ZWQgZm9yIHRoaXMgcGxhdGZvcm0uJyk7CisgICAgICAgICAgICAgICAgZXhpdENvZGUgPSBTaW5nbGVUaHJlYWRDbGllbnQoYXJncyk7CisgICAgICAgICAgICAgICAgI2VuZAogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB2YXIgcnNsdCA9IG5ldyBUZXN0UmVzdWx0cyh0cnVlKTsKLSAgICAgICAgICAgICAgICBSdW5DbGllbnQoYXJncyxyc2x0KTsKLSAgICAgICAgICAgICAgICByc2x0LlByaW50U3VtbWFyeSgpOwotICAgICAgICAgICAgICAgIGV4aXRDb2RlID0gcnNsdC5DYWxjdWxhdGVFeGl0Q29kZSgpOworICAgICAgICAgICAgICAgIGV4aXRDb2RlID0gU2luZ2xlVGhyZWFkQ2xpZW50KGFyZ3MpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBkaWZmdCA9IE1hdGgucm91bmQoIDEwMDAgKiAoVGltZXIuc3RhbXAoKSAtIGRpZmZ0KSkgLyAxMDAwOwpAQCAtMTU0LDYgKzE1MSwzMSBAQAogICAgIH0KIAogCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBTaW5nbGVUaHJlYWRDbGllbnQoYXJncyA6IEFyZ3VtZW50cykgOiAgSW50CisgICAgeworICAgICAgICB2YXIgcnNsdCA9IG5ldyBUZXN0UmVzdWx0cyh0cnVlKTsKKyAgICAgICAgUnVuQ2xpZW50KGFyZ3MscnNsdCk7CisgICAgICAgIHJzbHQuUHJpbnRTdW1tYXJ5KCk7CisgICAgICAgIHJldHVybiByc2x0LkNhbGN1bGF0ZUV4aXRDb2RlKCk7CisgICAgfQorCisKKyAgICAjaWYgY3BwCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBNdWx0aVRocmVhZENsaWVudChhcmdzIDogQXJndW1lbnRzKSA6ICBJbnQKKyAgICB7CisgICAgICAgIHZhciB0aHJlYWRzID0gbmV3IExpc3Q8VGhyZWFkPigpOworICAgICAgICBmb3IoIHRlc3QgaW4gMCAuLi4gYXJncy5udW1UaHJlYWRzKSB7CisgICAgICAgICAgICB0aHJlYWRzLmFkZCggU3RhcnRUaHJlYWQoIGFyZ3MpKTsKKyAgICAgICAgfQorICAgICAgICB2YXIgZXhpdENvZGUgOiBJbnQgPSAwOworICAgICAgICBmb3IoIHRocmVhZCBpbiB0aHJlYWRzKSB7CisgICAgICAgICAgICBleGl0Q29kZSB8PSBUaHJlYWQucmVhZE1lc3NhZ2UodHJ1ZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGV4aXRDb2RlOworICAgIH0KKyAgICAjZW5kCisKKyAgICAjaWYgY3BwCiAgICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gU3RhcnRUaHJlYWQoYXJncyA6IEFyZ3VtZW50cykgOiBUaHJlYWQgewogICAgICAgICB2YXIgdGhyZWFkID0gVGhyZWFkLmNyZWF0ZSgKICAgICAgICAgICAgIGZ1bmN0aW9uKCkgOiBWb2lkIHsKQEAgLTE3OSw2ICsyMDEsNyBAQAogICAgICAgICB0aHJlYWQuc2VuZE1lc3NhZ2UoVGhyZWFkLmN1cnJlbnQoKSk7CiAgICAgICAgIHJldHVybiB0aHJlYWQ7CiAgICAgfQorICAgICNlbmQKIAogCiAgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBSdW5DbGllbnQoYXJncyA6IEFyZ3VtZW50cywgcnNsdCA6IFRlc3RSZXN1bHRzKQpAQCAtMTg5LDcgKzIxMiw5IEBACiAgICAgICAgICAgICBjYXNlIHNvY2tldDoKICAgICAgICAgICAgICAgICB0cmFuc3BvcnQgPSBuZXcgVFNvY2tldChhcmdzLmhvc3QsIGFyZ3MucG9ydCk7CiAgICAgICAgICAgICBjYXNlIGh0dHA6Ci0gICAgICAgICAgICAgICAgdHJhbnNwb3J0ID0gbmV3IFRIdHRwQ2xpZW50KGFyZ3MuaG9zdCk7CisgICAgICAgICAgICAgICAgdmFyIHVyaSA9ICdodHRwOi8vJHthcmdzLmhvc3R9OiR7YXJncy5wb3J0fSc7CisgICAgICAgICAgICAgICAgdHJhY2UoJy0gaHR0cCBjbGllbnQgOiAke3VyaX0nKTsKKyAgICAgICAgICAgICAgICB0cmFuc3BvcnQgPSBuZXcgVEh0dHBDbGllbnQodXJpKTsKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgdGhyb3cgIlVuaGFuZGxlZCB0cmFuc3BvcnQiOwogICAgICAgICB9CkBAIC0yMzUsNyArMjYwLDcgQEAKICAgICB7CiAgICAgICAgIC8vIFdlIG5lZWQgdG8gdGVzdCBhIGZldyBiYXNpYyB0aGluZ3MgdXNlZCBpbiB0aGUgQ2xpZW50VGVzdAogICAgICAgICAvLyBBbnl0aGluZyBlbHNlIGJleW9uZCB0aGlzIHNjb3BlIHNob3VsZCBnbyBpbnRvIC9saWIvaGF4ZS8gaW5zdGVhZAotICAgICAgICByc2x0LlN0YXJ0VGVzdEdyb3VwKCAwKTsKKyAgICAgICAgcnNsdC5TdGFydFRlc3RHcm91cCggVGVzdFJlc3VsdHMuRVhJVENPREVfRkFJTEJJVF9CQVNFVFlQRVMpOwogCiAgICAgICAgIHZhciBtYXAzMiA9IG5ldyBJbnRNYXA8SW50MzI+KCk7CiAgICAgICAgIHZhciBtYXA2NCA9IG5ldyBJbnQ2NE1hcDxJbnQzMj4oKTsKQEAgLTI5Nyw4ICszMjIsOSBAQAogICAgICAgICByc2x0LkV4cGVjdCggYzMyID09IGM2NCwgIkludDY0TWFwPEludDMyPiBUZXN0ICMzMCIpOwogICAgICAgICByc2x0LkV4cGVjdCggJyRrc3VtNjQnID09ICcka3N1bTMyJywgJyRrc3VtNjQgPT0gJGtzdW0zMiAgIFRlc3QgIzMxJyk7CiAKLSAgICAgICAgdmFyIHMzMiA9IG1hcDMyLnRvU3RyaW5nKCk7Ci0gICAgICAgIHZhciBzNjQgPSBtYXA2NC50b1N0cmluZygpOworICAgICAgICAvL2NvbXBhcmUgd2l0aG91dCBzcGFjZXMgYmVjYXVzZSBkaWZmZXIgaW4gcGhwIGFuZCBjcHAKKyAgICAgICAgdmFyIHMzMiA9IG1hcDMyLnRvU3RyaW5nKCkucmVwbGFjZSgnICcsICcnKTsKKyAgICAgICAgdmFyIHM2NCA9IG1hcDY0LnRvU3RyaW5nKCkucmVwbGFjZSgnICcsICcnKTsKICAgICAgICAgcnNsdC5FeHBlY3QoIHMzMiA9PSBzNjQsICJJbnQ2NE1hcDxJbnQzMj4udG9TdHJpbmcoKTogIiArICcgKCIkczMyIiA9PSAiJHM2NCIpIFRlc3QgIzMyJyk7CiAKICAgICAgICAgbWFwMzIucmVtb3ZlKCA0Mik7CkBAIC0zMjIsOCArMzQ4LDggQEAKIAogICAgIC8vIGNvcmUgbW9kdWxlIHVuaXQgdGVzdHMKICAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIE1vZHVsZVVuaXRUZXN0cyggYXJncyA6IEFyZ3VtZW50cywgcnNsdCA6IFRlc3RSZXN1bHRzKSA6IFZvaWQgewotCQkjaWYgZGVidWcKLQkJCisgICAgICAgICNpZiBkZWJ1ZworCiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBCaXRDb252ZXJ0ZXIuVW5pdFRlc3QoKTsKICAgICAgICAgICAgIHJzbHQuRXhwZWN0KCB0cnVlLCAnQml0Q29udmVydGVyLlVuaXRUZXN0ICBUZXN0ICMxMDAnKTsKQEAgLTMzOSw4ICszNjUsOCBAQAogICAgICAgICBjYXRjaCggZSA6IER5bmFtaWMpIHsKICAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBmYWxzZSwgJ1ppZ1phZy5Vbml0VGVzdDogJGUgIFRlc3QgIzEwMScpOwogICAgICAgICB9Ci0JCQotCQkjZW5kCisKKyAgICAgICAgI2VuZAogICAgIH0KIAogCkBAIC00MTgsNiArNDQ0LDEwIEBACiAgICAgICAgICAgICByc2x0LkV4cGVjdCggZS5tZXNzYWdlID09ICJYY2VwdGlvbiIsICd0ZXN0RXhjZXB0aW9uKCJYY2VwdGlvbiIpICAtICBlLm1lc3NhZ2UgPT0gIlhjZXB0aW9uIicpOwogICAgICAgICAgICAgcnNsdC5FeHBlY3QoIGUuZXJyb3JDb2RlID09IDEwMDEsICd0ZXN0RXhjZXB0aW9uKCJYY2VwdGlvbiIpICAtICBlLmVycm9yQ29kZSA9PSAxMDAxJyk7CiAgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKGUgOiBURXhjZXB0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICByc2x0LkV4cGVjdCggZmFsc2UsICd0ZXN0RXhjZXB0aW9uKCJYY2VwdGlvbiIpICAtICAke2V9IDogJHtlLmVycm9yTXNnfScpOworICAgICAgICB9CiAgICAgICAgIGNhdGNoIChlIDogRHluYW1pYykKICAgICAgICAgewogICAgICAgICAgICAgcnNsdC5FeHBlY3QoIGZhbHNlLCAndGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iKSAgLSAgJGUnKTsKQEAgLTQzMSw3ICs0NjEsNyBAQAogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChlIDogVEV4Y2VwdGlvbikKICAgICAgICAgewotICAgICAgICAgICAgcnNsdC5FeHBlY3QoIHRydWUsICd0ZXN0RXhjZXB0aW9uKCJURXhjZXB0aW9uIikgIC0gICRlJyk7CisgICAgICAgICAgICByc2x0LkV4cGVjdCggdHJ1ZSwgJ3Rlc3RFeGNlcHRpb24oIlRFeGNlcHRpb24iKSAgLSAgJGUgOiAke2UuZXJyb3JNc2d9Jyk7CiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKGUgOiBEeW5hbWljKQogICAgICAgICB7CkBAIC00NDksNiArNDc5LDEwIEBACiAgICAgICAgICAgICBjbGllbnQudGVzdEV4Y2VwdGlvbigiYmxhIik7CiAgICAgICAgICAgICByc2x0LkV4cGVjdCggdHJ1ZSwgJ3Rlc3RFeGNlcHRpb24oImJsYSIpIHNob3VsZCBub3QgdGhyb3cnKTsKICAgICAgICAgfQorICAgICAgICBjYXRjaCAoZSA6IFRFeGNlcHRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBmYWxzZSwgJ3Rlc3RFeGNlcHRpb24oImJsYSIpICAtICAke2V9IDogJHtlLmVycm9yTXNnfScpOworICAgICAgICB9CiAgICAgICAgIGNhdGNoIChlIDogRHluYW1pYykKICAgICAgICAgewogICAgICAgICAgICAgcnNsdC5FeHBlY3QoIGZhbHNlLCAndGVzdEV4Y2VwdGlvbigiYmxhIikgIC0gICRlJyk7CkBAIC00NjQsMTEgKzQ5OCwxMSBAQAogICAgICAgICB0cmFjZSgndGVzdEJvb2woJHt0cnVlfSknKTsKICAgICAgICAgdmFyIGIgPSBjbGllbnQudGVzdEJvb2wodHJ1ZSk7CiAgICAgICAgIHRyYWNlKCcgPSAkYicpOwotCQlyc2x0LkV4cGVjdChiLCAnJGIgPT0gIiR7dHJ1ZX0iJyk7CisgICAgICAgIHJzbHQuRXhwZWN0KGIsICckYiA9PSAiJHt0cnVlfSInKTsKICAgICAgICAgdHJhY2UoJ3Rlc3RCb29sKCR7ZmFsc2V9KScpOwogICAgICAgICBiID0gY2xpZW50LnRlc3RCb29sKGZhbHNlKTsKICAgICAgICAgdHJhY2UoJyA9ICRiJyk7Ci0JCXJzbHQuRXhwZWN0KCAhIGIsICckYiA9PSAiJHtmYWxzZX0iJyk7CisgICAgICAgIHJzbHQuRXhwZWN0KCAhIGIsICckYiA9PSAiJHtmYWxzZX0iJyk7CiAKICAgICAgICAgdHJhY2UoJ3Rlc3RTdHJpbmcoIlRlc3QiKScpOwogICAgICAgICB2YXIgcyA9IGNsaWVudC50ZXN0U3RyaW5nKCJUZXN0Iik7CkBAIC04MjAsNiArODU0LDE4IEBACiAgICAgICAgIHRyYWNlKCJ9Iik7CiAKIAorCQkvKioKKwkJKiBTbyB5b3UgdGhpbmsgeW91J3ZlIGdvdCB0aGlzIGFsbCB3b3JrZWQsIG91dCBlaD8KKwkJKgorCQkqIENyZWF0ZXMgYSB0aGUgcmV0dXJuZWQgbWFwIHdpdGggdGhlc2UgdmFsdWVzIGFuZCBwcmludHMgaXQgb3V0OgorCQkqICAgeyAxID0+IHsgMiA9PiBhcmd1bWVudCwKKwkJKiAgICAgICAgICAgIDMgPT4gYXJndW1lbnQsCisJCSogICAgICAgICAgfSwKKwkJKiAgICAgMiA9PiB7IDYgPT4gPGVtcHR5IEluc2FuaXR5IHN0cnVjdD4sIH0sCisJCSogICB9CisJCSogQHJldHVybiBtYXA8VXNlcklkLCBtYXA8TnVtYmVyeixJbnNhbml0eT4+IC0gYSBtYXAgd2l0aCB0aGUgYWJvdmUgdmFsdWVzCisJCSovCisJCQogICAgICAgICB2YXIgZmlyc3RfbWFwID0gd2hvYS5nZXQoSW50NjQubWFrZSgwLDEpKTsKICAgICAgICAgdmFyIHNlY29uZF9tYXAgPSB3aG9hLmdldChJbnQ2NC5tYWtlKDAsMikpOwogICAgICAgICByc2x0LkV4cGVjdCggKGZpcnN0X21hcCAhPSBudWxsKSAmJiAoc2Vjb25kX21hcCAhPSBudWxsKSwgIihmaXJzdF9tYXAgIT0gbnVsbCkgJiYgKHNlY29uZF9tYXAgIT0gbnVsbCkiKTsKQEAgLTgzMSw0MiArODc3LDI3IEBACiAgICAgICAgICAgICByc2x0LkV4cGVjdCggKGNyYXp5MiAhPSBudWxsKSAmJiAoY3JhenkzICE9IG51bGwpICYmIChsb29uZXkgIT0gbnVsbCksCiAgICAgICAgICAgICAgICAgICAgICAgICAiKGNyYXp5MiAhPSBudWxsKSAmJiAoY3JhenkzICE9IG51bGwpICYmIChsb29uZXkgIT0gbnVsbCkiKTsKIAotICAgICAgICAgICAgcnNsdC5FeHBlY3QoIEludDY0LmNvbXBhcmUoIGNyYXp5Mi51c2VyTWFwLmdldChOdW1iZXJ6LkVJR0hUKSwgSW50NjQubWFrZSgwLDgpKSA9PSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgImNyYXp5Mi5Vc2VyTWFwLmdldChOdW1iZXJ6LkVJR0hUKSA9PSA4Iik7Ci0gICAgICAgICAgICByc2x0LkV4cGVjdCggSW50NjQuY29tcGFyZSggY3JhenkzLnVzZXJNYXAuZ2V0KE51bWJlcnouRUlHSFQpLCBJbnQ2NC5tYWtlKDAsOCkpID09IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAiY3JhenkzLlVzZXJNYXAuZ2V0KE51bWJlcnouRUlHSFQpID09IDgiKTsKLSAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBJbnQ2NC5jb21wYXJlKCBjcmF6eTIudXNlck1hcC5nZXQoTnVtYmVyei5GSVZFKSwgSW50NjQubWFrZSgwLDUpKSA9PSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgImNyYXp5Mi5Vc2VyTWFwLmdldChOdW1iZXJ6LkZJVkUpID09IDUiKTsKLSAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBJbnQ2NC5jb21wYXJlKCBjcmF6eTMudXNlck1hcC5nZXQoTnVtYmVyei5GSVZFKSwgSW50NjQubWFrZSgwLDUpKSA9PSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgImNyYXp5My5Vc2VyTWFwLmdldChOdW1iZXJ6LkZJVkUpID09IDUiKTsKLQogICAgICAgICAgICAgdmFyIGNyejJpdGVyID0gY3JhenkyLnh0cnVjdHMuaXRlcmF0b3IoKTsKICAgICAgICAgICAgIHZhciBjcnozaXRlciA9IGNyYXp5My54dHJ1Y3RzLml0ZXJhdG9yKCk7CiAgICAgICAgICAgICByc2x0LkV4cGVjdCggY3J6Mml0ZXIuaGFzTmV4dCgpICYmIGNyejNpdGVyLmhhc05leHQoKSwgImNyejJpdGVyLmhhc05leHQoKSAmJiBjcnozaXRlci5oYXNOZXh0KCkiKTsKICAgICAgICAgICAgIHZhciBnb29kYnllMiA9IGNyejJpdGVyLm5leHQoKTsKICAgICAgICAgICAgIHZhciBnb29kYnllMyA9IGNyejNpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBjcnoyaXRlci5oYXNOZXh0KCkgJiYgY3J6M2l0ZXIuaGFzTmV4dCgpLCAiY3J6Mml0ZXIuaGFzTmV4dCgpICYmIGNyejNpdGVyLmhhc05leHQoKSIpOwotICAgICAgICAgICAgdmFyIGhlbGxvMiA9IGNyejJpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIHZhciBoZWxsbzMgPSBjcnozaXRlci5uZXh0KCk7CiAgICAgICAgICAgICByc2x0LkV4cGVjdCggISAoY3J6Mml0ZXIuaGFzTmV4dCgpIHx8IGNyejNpdGVyLmhhc05leHQoKSksICIhIChjcnoyaXRlci5oYXNOZXh0KCkgfHwgY3J6M2l0ZXIuaGFzTmV4dCgpKSIpOwogCi0gICAgICAgICAgICByc2x0LkV4cGVjdCggaGVsbG8yLnN0cmluZ190aGluZyA9PSAiSGVsbG8yIiwgJ2hlbGxvMi5TdHJpbmdfdGhpbmcgPT0gIkhlbGxvMiInKTsKLSAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBoZWxsbzIuYnl0ZV90aGluZyA9PSAyLCAnaGVsbG8yLkJ5dGVfdGhpbmcgPT0gMicpOwotICAgICAgICAgICAgcnNsdC5FeHBlY3QoIGhlbGxvMi5pMzJfdGhpbmcgPT0gMiwgJ2hlbGxvMi5JMzJfdGhpbmcgPT0gMicpOwotICAgICAgICAgICAgcnNsdC5FeHBlY3QoIEludDY0LmNvbXBhcmUoIGhlbGxvMi5pNjRfdGhpbmcsIEludDY0Lm1ha2UoMCwyKSkgPT0gMCwgJ2hlbGxvMi5JNjRfdGhpbmcgPT0gMicpOwotICAgICAgICAgICAgcnNsdC5FeHBlY3QoIGhlbGxvMy5zdHJpbmdfdGhpbmcgPT0gIkhlbGxvMiIsICdoZWxsbzMuU3RyaW5nX3RoaW5nID09ICJIZWxsbzIiJyk7Ci0gICAgICAgICAgICByc2x0LkV4cGVjdCggaGVsbG8zLmJ5dGVfdGhpbmcgPT0gMiwgJ2hlbGxvMy5CeXRlX3RoaW5nID09IDInKTsKLSAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBoZWxsbzMuaTMyX3RoaW5nID09IDIsICdoZWxsbzMuSTMyX3RoaW5nID09IDInKTsKLSAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBJbnQ2NC5jb21wYXJlKCBoZWxsbzMuaTY0X3RoaW5nLCBJbnQ2NC5tYWtlKDAsMikpID09IDAsICdoZWxsbzMuSTY0X3RoaW5nID09IDInKTsKKwkJCXJzbHQuRXhwZWN0KCBJbnQ2NC5jb21wYXJlKCBjcmF6eTIudXNlck1hcC5nZXQoTnVtYmVyei5GSVZFKSwgaW5zYW5lLnVzZXJNYXAuZ2V0KE51bWJlcnouRklWRSkpID09IDAsICJjcmF6eTIudXNlck1hcFs1XSA9PSBpbnNhbmUudXNlck1hcFs1XSIpOworCQkJcnNsdC5FeHBlY3QoIHRydWNrLnN0cmluZ190aGluZyA9PSBnb29kYnllMi5zdHJpbmdfdGhpbmcsICJ0cnVjay5zdHJpbmdfdGhpbmcgPT0gZ29vZGJ5ZTIuc3RyaW5nX3RoaW5nIik7CisJCQlyc2x0LkV4cGVjdCggdHJ1Y2suYnl0ZV90aGluZyAgPT0gZ29vZGJ5ZTIuYnl0ZV90aGluZywgInRydWNrLmJ5dGVfdGhpbmcgID09IGdvb2RieWUyLmJ5dGVfdGhpbmciKTsKKwkJCXJzbHQuRXhwZWN0KCB0cnVjay5pMzJfdGhpbmcgID09IGdvb2RieWUyLmkzMl90aGluZywgInRydWNrLmkzMl90aGluZyAgPT0gZ29vZGJ5ZTIuaTMyX3RoaW5nIik7CisJCQlyc2x0LkV4cGVjdCggSW50NjQuY29tcGFyZSggdHJ1Y2suaTY0X3RoaW5nLCBnb29kYnllMi5pNjRfdGhpbmcpID09IDAsICJ0cnVjay5pNjRfdGhpbmcgID09IGdvb2RieWUyLmk2NF90aGluZyIpOwogCi0gICAgICAgICAgICByc2x0LkV4cGVjdCggZ29vZGJ5ZTIuc3RyaW5nX3RoaW5nID09ICJHb29kYnllNCIsICdnb29kYnllMi5TdHJpbmdfdGhpbmcgPT0gIkdvb2RieWU0IicpOwotICAgICAgICAgICAgcnNsdC5FeHBlY3QoIGdvb2RieWUyLmJ5dGVfdGhpbmcgPT0gNCwgJ2dvb2RieWUyLkJ5dGVfdGhpbmcgPT0gNCcpOwotICAgICAgICAgICAgcnNsdC5FeHBlY3QoIGdvb2RieWUyLmkzMl90aGluZyA9PSA0LCAnZ29vZGJ5ZTIuSTMyX3RoaW5nID09IDQnKTsKLSAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBJbnQ2NC5jb21wYXJlKCBnb29kYnllMi5pNjRfdGhpbmcsIEludDY0Lm1ha2UoMCw0KSkgPT0gMCwgJ2dvb2RieWUyLkk2NF90aGluZyA9PSA0Jyk7Ci0gICAgICAgICAgICByc2x0LkV4cGVjdCggZ29vZGJ5ZTMuc3RyaW5nX3RoaW5nID09ICJHb29kYnllNCIsICdnb29kYnllMy5TdHJpbmdfdGhpbmcgPT0gIkdvb2RieWU0IicpOwotICAgICAgICAgICAgcnNsdC5FeHBlY3QoIGdvb2RieWUzLmJ5dGVfdGhpbmcgPT0gNCwgJ2dvb2RieWUzLkJ5dGVfdGhpbmcgPT0gNCcpOwotICAgICAgICAgICAgcnNsdC5FeHBlY3QoIGdvb2RieWUzLmkzMl90aGluZyA9PSA0LCAnZ29vZGJ5ZTMuSTMyX3RoaW5nID09IDQnKTsKLSAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBJbnQ2NC5jb21wYXJlKCBnb29kYnllMy5pNjRfdGhpbmcsIEludDY0Lm1ha2UoMCw0KSkgPT0gMCwgJ2dvb2RieWUzLkk2NF90aGluZyA9PSA0Jyk7CisJCQlyc2x0LkV4cGVjdCggSW50NjQuY29tcGFyZSggY3JhenkzLnVzZXJNYXAuZ2V0KE51bWJlcnouRklWRSksIGluc2FuZS51c2VyTWFwLmdldChOdW1iZXJ6LkZJVkUpKSA9PSAwLCAiY3JhenkzLnVzZXJNYXBbNV0gPT0gaW5zYW5lLnVzZXJNYXBbNV0iKTsKKwkJCXJzbHQuRXhwZWN0KCB0cnVjay5zdHJpbmdfdGhpbmcgPT0gZ29vZGJ5ZTMuc3RyaW5nX3RoaW5nLCAidHJ1Y2suc3RyaW5nX3RoaW5nID09IGdvb2RieWUzLnN0cmluZ190aGluZyIpOworCQkJcnNsdC5FeHBlY3QoIHRydWNrLmJ5dGVfdGhpbmcgID09IGdvb2RieWUzLmJ5dGVfdGhpbmcsICJ0cnVjay5ieXRlX3RoaW5nICA9PSBnb29kYnllMy5ieXRlX3RoaW5nIik7CisJCQlyc2x0LkV4cGVjdCggdHJ1Y2suaTMyX3RoaW5nICA9PSBnb29kYnllMy5pMzJfdGhpbmcsICJ0cnVjay5pMzJfdGhpbmcgID09IGdvb2RieWUzLmkzMl90aGluZyIpOworCQkJcnNsdC5FeHBlY3QoIEludDY0LmNvbXBhcmUoIHRydWNrLmk2NF90aGluZywgZ29vZGJ5ZTMuaTY0X3RoaW5nKSA9PSAwLCAidHJ1Y2suaTY0X3RoaW5nICA9PSBnb29kYnllMy5pNjRfdGhpbmciKTsKKwkJCQorCQkJcnNsdC5FeHBlY3QoICEgbG9vbmV5LmlzU2V0KDEpLCAiISBsb29uZXkuaXNTZXQoMSkiKTsKKwkJCXJzbHQuRXhwZWN0KCAhIGxvb25leS5pc1NldCgyKSwgIiEgbG9vbmV5LmlzU2V0KDIpIik7CiAgICAgICAgIH0KIAogICAgICAgICB2YXIgYXJnMCA9IDE7CmRpZmYgLS1naXQgYS90ZXN0L2hheGUvc3JjL1Rlc3RTZXJ2ZXIuaHggYi90ZXN0L2hheGUvc3JjL1Rlc3RTZXJ2ZXIuaHgKaW5kZXggYmZmNWE0Ny4uNDUwYzhmMiAxMDA2NDQKLS0tIGEvdGVzdC9oYXhlL3NyYy9UZXN0U2VydmVyLmh4CisrKyBiL3Rlc3QvaGF4ZS9zcmMvVGVzdFNlcnZlci5oeApAQCAtNDIsOCArNDIsMTggQEAKICAgICAgICAgICAgICAgICB0cmFuc3BvcnQgPSBuZXcgVFNlcnZlclNvY2tldCggYXJncy5wb3J0KTsKICAgICAgICAgICAgIGNhc2UgaHR0cDoKICAgICAgICAgICAgICAgICB0cmFjZSgiLSBodHRwIik7Ci0gICAgICAgICAgICAgICAgdGhyb3cgIkhUVFAgc2VydmVyIG5vdCBpbXBsZW1lbnRlZCB5ZXQiOworICAgICAgICAgICAgICAgICNpZiAhcGhwd2Vic2VydmVyCisgICAgICAgICAgICAgICAgICB0aHJvdyAiSFRUUCBzZXJ2ZXIgbm90IGltcGxlbWVudGVkIHlldCI7CiAgICAgICAgICAgICAgICAgIC8vdHJhbnNwb3J0ID0gbmV3IFRIdHRwU2VydmVyKCB0YXJnZXRIb3N0KTsKKyAgICAgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICAgIHRyYW5zcG9ydCA9ICAgIG5ldyBUV3JhcHBpbmdTZXJ2ZXJUcmFuc3BvcnQoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVFN0cmVhbVRyYW5zcG9ydCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRGaWxlU3RyZWFtKCJwaHA6Ly9pbnB1dCIsIFJlYWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVEZpbGVTdHJlYW0oInBocDovL291dHB1dCIsIEFwcGVuZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgICAgICNlbmQKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgdGhyb3cgIlVuaGFuZGxlZCB0cmFuc3BvcnQiOwogICAgICAgICAgICAgfQpAQCAtODQsNyArOTQsMTIgQEAKICAgICAgICAgICAgIHN3aXRjaCggYXJncy5zZXJ2ZXJ0eXBlKQogICAgICAgICAgICAgewogICAgICAgICAgICAgY2FzZSBzaW1wbGU6Ci0gICAgICAgICAgICAgICAgc2VydmVyID0gbmV3IFRTaW1wbGVTZXJ2ZXIoIHByb2Nlc3NvciwgdHJhbnNwb3J0LCB0cmFuc2ZhY3RvcnksIHByb3RmYWN0b3J5KTsKKyAgICAgICAgICAgICAgICB2YXIgc2ltcGxlU2VydmVyID0gbmV3IFRTaW1wbGVTZXJ2ZXIoIHByb2Nlc3NvciwgdHJhbnNwb3J0LCB0cmFuc2ZhY3RvcnksIHByb3RmYWN0b3J5KTsKKyAgICAgICAgICAgICAgICAjaWYgcGhwd2Vic2VydmVyCisgICAgICAgICAgICAgICAgc2ltcGxlU2VydmVyLnJ1bk9uY2UgPSB0cnVlOworICAgICAgICAgICAgICAgICNlbmQKKyAgICAgICAgICAgICAgICBzZXJ2ZXIgPSBzaW1wbGVTZXJ2ZXI7CisKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgdGhyb3cgIlVuaGFuZGxlZCBzZXJ2ZXIgdHlwZSI7CiAgICAgICAgICAgICB9CkBAIC0xMDYsNyArMTIxLDcgQEAKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoeCA6IFRFeGNlcHRpb24pCiAgICAgICAgIHsKLQkJCXRyYWNlKCckeCAke3guZXJyb3JJRH0gJHt4LmVycm9yTXNnfScpOworICAgICAgICAgICAgdHJhY2UoJyR4ICR7eC5lcnJvcklEfSAke3guZXJyb3JNc2d9Jyk7CiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKHggOiBEeW5hbWljKQogICAgICAgICB7CmRpZmYgLS1naXQgYS90ZXN0L2hheGUvc3JjL1Rlc3RTZXJ2ZXJIYW5kbGVyLmh4IGIvdGVzdC9oYXhlL3NyYy9UZXN0U2VydmVySGFuZGxlci5oeAppbmRleCA3NGE4ODA1Li5iOGEyNTkwIDEwMDY0NAotLS0gYS90ZXN0L2hheGUvc3JjL1Rlc3RTZXJ2ZXJIYW5kbGVyLmh4CisrKyBiL3Rlc3QvaGF4ZS9zcmMvVGVzdFNlcnZlckhhbmRsZXIuaHgKQEAgLTUxLDE0ICs1MSwxNCBAQAogICAgICAgICB0cmFjZSgidGVzdFZvaWQoKSIpOwogICAgIH0KIAotCS8qKgotCSogUHJpbnRzICd0ZXN0Qm9vbCgiJXMiKScgd2hlcmUgJyVzJyB3aXRoIHRoaW5nIGFzICd0cnVlJyBvciAnZmFsc2UnCi0JKiBAcGFyYW0gYm9vbCAgdGhpbmcgLSB0aGUgYm9vbCBkYXRhIHRvIHByaW50Ci0JKiBAcmV0dXJuIGJvb2wgIC0gcmV0dXJucyB0aGUgYm9vbCAndGhpbmcnCi0JKiAKLQkqIEBwYXJhbSB0aGluZwotCSovCi0JcHVibGljIGZ1bmN0aW9uIHRlc3RCb29sKHRoaW5nIDogQm9vbCkgOiBCb29sCisgICAgLyoqCisgICAgKiBQcmludHMgJ3Rlc3RCb29sKCIlcyIpJyB3aGVyZSAnJXMnIHdpdGggdGhpbmcgYXMgJ3RydWUnIG9yICdmYWxzZScKKyAgICAqIEBwYXJhbSBib29sICB0aGluZyAtIHRoZSBib29sIGRhdGEgdG8gcHJpbnQKKyAgICAqIEByZXR1cm4gYm9vbCAgLSByZXR1cm5zIHRoZSBib29sICd0aGluZycKKyAgICAqCisgICAgKiBAcGFyYW0gdGhpbmcKKyAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0Qm9vbCh0aGluZyA6IEJvb2wpIDogQm9vbAogICAgIHsKICAgICAgICAgdHJhY2UoJ3Rlc3RCb29sKCR0aGluZyknKTsKICAgICAgICAgcmV0dXJuIHRoaW5nOwpAQCAtMzUyLDMzICszNTIsMTIgQEAKICAgICB7CiAgICAgICAgIHRyYWNlKCJ0ZXN0SW5zYW5pdHkoKSIpOwogCi0gICAgICAgIHZhciBoZWxsbyA9IG5ldyBYdHJ1Y3QoKTsKLSAgICAgICAgaGVsbG8uc3RyaW5nX3RoaW5nID0gIkhlbGxvMiI7Ci0gICAgICAgIGhlbGxvLmJ5dGVfdGhpbmcgPSAyOwotICAgICAgICBoZWxsby5pMzJfdGhpbmcgPSAyOwotICAgICAgICBoZWxsby5pNjRfdGhpbmcgPSBJbnQ2NC5tYWtlKDAsIDIpOwotCi0gICAgICAgIHZhciBnb29kYnllID0gbmV3IFh0cnVjdCgpOwotICAgICAgICBnb29kYnllLnN0cmluZ190aGluZyA9ICJHb29kYnllNCI7Ci0gICAgICAgIGdvb2RieWUuYnl0ZV90aGluZyA9IDQ7Ci0gICAgICAgIGdvb2RieWUuaTMyX3RoaW5nID0gNDsKLSAgICAgICAgZ29vZGJ5ZS5pNjRfdGhpbmcgPSBJbnQ2NC5tYWtlKDAsIDQpOwotCi0gICAgICAgIHZhciBjcmF6eSA9IG5ldyBJbnNhbml0eSgpOwotICAgICAgICBjcmF6eS51c2VyTWFwID0gbmV3IEludE1hcDwgaGF4ZS5JbnQ2ND4oKTsKLSAgICAgICAgY3JhenkudXNlck1hcC5zZXQoTnVtYmVyei5FSUdIVCwgSW50NjQubWFrZSgwLDgpKTsKLSAgICAgICAgY3JhenkueHRydWN0cyA9IG5ldyBMaXN0PFh0cnVjdD4oKTsKLSAgICAgICAgY3JhenkueHRydWN0cy5hZGQoZ29vZGJ5ZSk7Ci0KLSAgICAgICAgdmFyIGxvb25leSA9IG5ldyBJbnNhbml0eSgpOwotICAgICAgICBjcmF6eS51c2VyTWFwLnNldChOdW1iZXJ6LkZJVkUsIEludDY0Lm1ha2UoMCw1KSk7Ci0gICAgICAgIGNyYXp5Lnh0cnVjdHMuYWRkKGhlbGxvKTsKLQogICAgICAgICB2YXIgZmlyc3RfbWFwID0gbmV3IEludE1hcDwgSW5zYW5pdHk+KCk7Ci0gICAgICAgIGZpcnN0X21hcC5zZXQoTnVtYmVyei5UV08sIGNyYXp5KTsKLSAgICAgICAgZmlyc3RfbWFwLnNldChOdW1iZXJ6LlRIUkVFLCBjcmF6eSk7CisgICAgICAgIGZpcnN0X21hcC5zZXQoTnVtYmVyei5UV08sIGFyZ3VtZW50KTsKKyAgICAgICAgZmlyc3RfbWFwLnNldChOdW1iZXJ6LlRIUkVFLCBhcmd1bWVudCk7CiAKICAgICAgICAgdmFyIHNlY29uZF9tYXAgPSBuZXcgSW50TWFwPCBJbnNhbml0eT4oKTsKKyAgICAgICAgdmFyIGxvb25leSA9IG5ldyBJbnNhbml0eSgpOwogICAgICAgICBzZWNvbmRfbWFwLnNldChOdW1iZXJ6LlNJWCwgbG9vbmV5KTsKIAogICAgICAgICB2YXIgaW5zYW5lID0gbmV3IEludDY0TWFwPCBJbnRNYXA8IEluc2FuaXR5Pj4oKTsKZGlmZiAtLWdpdCBhL3Rlc3QvaHMvQ01ha2VMaXN0cy50eHQgYi90ZXN0L2hzL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhY2EzZmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2hzL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTE0IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworc2V0KGhzX3Rlc3RfZ2VuCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9Db25zdGFudHNEZW1vX0NvbnN0cy5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvQ29uc3RhbnRzRGVtb19UeXBlcy5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvRGVidWdQcm90b1Rlc3RfQ29uc3RzLmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9EZWJ1Z1Byb3RvVGVzdF9UeXBlcy5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvRW1wdHlTZXJ2aWNlX0NsaWVudC5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvRW1wdHlTZXJ2aWNlLmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9FbXB0eVNlcnZpY2VfSWZhY2UuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL0luY2x1ZGVfQ29uc3RzLmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9JbmNsdWRlX1R5cGVzLmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9Jbmhlcml0ZWRfQ2xpZW50LmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9Jbmhlcml0ZWQuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL0luaGVyaXRlZF9JZmFjZS5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvUmV2ZXJzZU9yZGVyU2VydmljZV9DbGllbnQuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL1JldmVyc2VPcmRlclNlcnZpY2UuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL1JldmVyc2VPcmRlclNlcnZpY2VfSWZhY2UuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL1NlY29uZFNlcnZpY2VfQ2xpZW50LmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9TZWNvbmRTZXJ2aWNlLmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9TZWNvbmRTZXJ2aWNlX0lmYWNlLmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9TZXJ2aWNlRm9yRXhjZXB0aW9uV2l0aEFNYXBfQ2xpZW50LmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9TZXJ2aWNlRm9yRXhjZXB0aW9uV2l0aEFNYXAuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL1NlcnZpY2VGb3JFeGNlcHRpb25XaXRoQU1hcF9JZmFjZS5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvU3J2X0NsaWVudC5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvU3J2LmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9TcnZfSWZhY2UuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL1RocmlmdFRlc3RfQ2xpZW50LmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9UaHJpZnRUZXN0X0NvbnN0cy5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvVGhyaWZ0VGVzdC5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvVGhyaWZ0VGVzdF9JZmFjZS5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvVGhyaWZ0VGVzdF9UeXBlcy5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvWW93emFfQ2xpZW50LmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9Zb3d6YS5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvWW93emFfSWZhY2UuaHMKKykKKworc2V0KGhzX2Nyb3NzdGVzdF9hcHBzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L1Rlc3RTZXJ2ZXIKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vVGVzdENsaWVudAorKQorc2V0KGhzX2Nyb3NzdGVzdF9hcmdzCisgICAgLWlnZW4taHMKKyAgICAtb2Rpcj0ke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0KKyAgICAtaGlkaXI9JHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9CispCisKK2lmIChDTUFLRV9CVUlMRF9UWVBFIFNUUkVRVUFMICJEZWJ1ZyIpCisgIHNldChoc19vcHRpbWl6ZSAtTzApCitlbHNlKCkKKyAgc2V0KGhzX29wdGltaXplIC1PMSkKK2VuZGlmKCkKKworYWRkX2N1c3RvbV9jb21tYW5kKAorICAgIE9VVFBVVCAke2hzX2Nyb3NzdGVzdF9hcHBzfQorICAgIENPTU1BTkQgJHtHSEN9ICR7aHNfb3B0aW1pemV9ICR7aHNfY3Jvc3N0ZXN0X2FyZ3N9ICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9UZXN0U2VydmVyLmhzIC1vIFRlc3RTZXJ2ZXIKKyAgICBDT01NQU5EICR7R0hDfSAke2hzX29wdGltaXplfSAke2hzX2Nyb3NzdGVzdF9hcmdzfSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vVGVzdENsaWVudC5ocyAtbyBUZXN0Q2xpZW50CisgICAgREVQRU5EUyAke2hzX3Rlc3RfZ2VufSBoYXNrZWxsX2xpYnJhcnkgVGVzdFNlcnZlci5ocyBUZXN0Q2xpZW50LmhzCispCithZGRfY3VzdG9tX3RhcmdldChoYXNrZWxsX2Nyb3NzdGVzdCBBTEwKKyAgICBDT01NRU5UICJCdWlsZGluZyBIYXNrZWxsIGNyb3NzIHRlc3QgZXhlY3V0YWJsZXMiCisgICAgREVQRU5EUyAke2hzX2Nyb3NzdGVzdF9hcHBzfQorKQorCitzZXQoaHNfdGVzdF9zb3VyY2VzCisgICAgQ29uc3RhbnRzRGVtb19NYWluLmhzCisgICAgRGVidWdQcm90b1Rlc3RfTWFpbi5ocworICAgIEluY2x1ZGVfTWFpbi5ocworICAgIFRocmlmdFRlc3RfTWFpbi5ocworKQorc2V0KGhzX3Rlc3RfYXJncworICAgIC1XYWxsCisgICAgLVhTY29wZWRUeXBlVmFyaWFibGVzCisgICAgLWkke1BST0pFQ1RfU09VUkNFX0RJUn0vbGliL2hzL3NyYworICAgIC1pJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocworKQorYWRkX2N1c3RvbV90YXJnZXQoaGFza2VsbF90ZXN0cyBBTEwgREVQRU5EUyAke2hzX3Rlc3RfZ2VufSkKK2ZvcmVhY2goU1JDICR7aHNfdGVzdF9zb3VyY2VzfSkKKyAgICBnZXRfZmlsZW5hbWVfY29tcG9uZW50KEJBU0UgJHtTUkN9IE5BTUVfV0UpCisgICAgYWRkX3Rlc3QoTkFNRSBIYXNrZWxsVGVzdHMtJHtCQVNFfQorICAgICAgICBDT01NQU5EICR7UlVOX0hBU0tFTEx9ICR7aHNfdGVzdF9hcmdzfSAke1NSQ30KKyAgICAgICAgV09SS0lOR19ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9KQorZW5kZm9yZWFjaCgpCisKK3NldChoc190ZXN0X2dlbl9zb3VyY2VzCisgICAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvQ29uc3RhbnRzRGVtby50aHJpZnQKKyAgICAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQKKyAgICAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorICAgICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L0luY2x1ZGUudGhyaWZ0CispCithZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUICR7aHNfdGVzdF9nZW59CisgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gaHMgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvQ29uc3RhbnRzRGVtby50aHJpZnQKKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBocyAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQKKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBocyAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorICAgIENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGhzICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L0luY2x1ZGUudGhyaWZ0CisgICAgREVQRU5EUyAke2hzX3Rlc3RfZ2VuX3NvdXJjZXN9CispCmRpZmYgLS1naXQgYS90ZXN0L2hzL0RlYnVnUHJvdG9UZXN0X01haW4uaHMgYi90ZXN0L2hzL0RlYnVnUHJvdG9UZXN0X01haW4uaHMKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvdGVzdC9ocy9NYWtlZmlsZS5hbSBiL3Rlc3QvaHMvTWFrZWZpbGUuYW0KaW5kZXggZTE3MTI0OC4uMTc0ODkwNiAxMDA2NDQKLS0tIGEvdGVzdC9ocy9NYWtlZmlsZS5hbQorKysgYi90ZXN0L2hzL01ha2VmaWxlLmFtCkBAIC0xNyw5ICsxNyw3IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1USFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAotCi1zdHViczogLi4vQ29uc3RhbnRzRGVtby50aHJpZnQgLi4vRGVidWdQcm90b1Rlc3QudGhyaWZ0IC4uL1RocmlmdFRlc3QudGhyaWZ0IC4uL0luY2x1ZGUudGhyaWZ0CitzdHViczogJChUSFJJRlQpIC4uL0NvbnN0YW50c0RlbW8udGhyaWZ0IC4uL0RlYnVnUHJvdG9UZXN0LnRocmlmdCAuLi9UaHJpZnRUZXN0LnRocmlmdCAuLi9JbmNsdWRlLnRocmlmdAogCSQoVEhSSUZUKSAtLWdlbiBocyAuLi9Db25zdGFudHNEZW1vLnRocmlmdAogCSQoVEhSSUZUKSAtLWdlbiBocyAuLi9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQKIAkkKFRIUklGVCkgLS1nZW4gaHMgLi4vVGhyaWZ0VGVzdC50aHJpZnQKQEAgLTM5LDMgKzM3LDUgQEAKIGFsbC1sb2NhbDogc3R1YnMKIAlnaGMgLWlnZW4taHMgVGVzdFNlcnZlci5ocwogCWdoYyAtaWdlbi1ocyBUZXN0Q2xpZW50LmhzCisKK3ByZWNyb3NzOiBhbGwtbG9jYWwKZGlmZiAtLWdpdCBhL3Rlc3QvaHMvVGVzdENsaWVudC5ocyBiL3Rlc3QvaHMvVGVzdENsaWVudC5ocwppbmRleCAwNTdhNTYwLi45M2ZiNTkxIDEwMDY0NAotLS0gYS90ZXN0L2hzL1Rlc3RDbGllbnQuaHMKKysrIGIvdGVzdC9ocy9UZXN0Q2xpZW50LmhzCkBAIC0yOSw3ICsyOSw2IEBACiBpbXBvcnQgTmV0d29yay5VUkkKIGltcG9ydCBTeXN0ZW0uRW52aXJvbm1lbnQKIGltcG9ydCBTeXN0ZW0uRXhpdAotaW1wb3J0IFN5c3RlbS5Qb3NpeC5VbmlzdGQKIGltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkxhenkgYXMgTEJTCiBpbXBvcnQgcXVhbGlmaWVkIERhdGEuSGFzaE1hcC5TdHJpY3QgYXMgTWFwCiBpbXBvcnQgcXVhbGlmaWVkIERhdGEuSGFzaFNldCBhcyBTZXQKQEAgLTQ3LDYgKzQ2LDcgQEAKIGltcG9ydCBUaHJpZnQuUHJvdG9jb2wKIGltcG9ydCBUaHJpZnQuUHJvdG9jb2wuQmluYXJ5CiBpbXBvcnQgVGhyaWZ0LlByb3RvY29sLkNvbXBhY3QKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wuSGVhZGVyCiBpbXBvcnQgVGhyaWZ0LlByb3RvY29sLkpTT04KIAogZGF0YSBPcHRpb25zID0gT3B0aW9ucwpAQCAtODYsMTIgKzg2LDE0IEBACiBkYXRhIFByb3RvY29sVHlwZSA9IEJpbmFyeQogICAgICAgICAgICAgICAgICAgfCBDb21wYWN0CiAgICAgICAgICAgICAgICAgICB8IEpTT04KKyAgICAgICAgICAgICAgICAgIHwgSGVhZGVyCiAgICAgICAgICAgICAgICAgICBkZXJpdmluZyAoU2hvdywgRXEpCiAKIGdldFByb3RvY29sIDo6IFN0cmluZyAtPiBQcm90b2NvbFR5cGUKIGdldFByb3RvY29sICJiaW5hcnkiICA9IEJpbmFyeQogZ2V0UHJvdG9jb2wgImNvbXBhY3QiID0gQ29tcGFjdAogZ2V0UHJvdG9jb2wgImpzb24iICAgID0gSlNPTgorZ2V0UHJvdG9jb2wgImhlYWRlciIgPSBIZWFkZXIKIGdldFByb3RvY29sIHAgPSBlcnJvciAkICJVbnN1cHBvcnRlZCBQcm90b2NvbDogIiArKyBwCiAKIGRlZmF1bHRPcHRpb25zIDo6IE9wdGlvbnMKQEAgLTEwNSw3ICsxMDcsNyBAQAogICAsIHRlc3RMb29wcyAgICA9IDEKICAgfQogCi1ydW5DbGllbnQgOjogKFByb3RvY29sIHAsIFRyYW5zcG9ydCB0KSA9PiBwIHQgLT4gSU8gKCkKK3J1bkNsaWVudCA6OiBQcm90b2NvbCBwID0+IHAgLT4gSU8gKCkKIHJ1bkNsaWVudCBwID0gZG8KICAgbGV0IHByb3QgPSAocCxwKQogICBwdXRTdHJMbiAiU3RhcnRpbmcgVGVzdHMiCkBAIC0xNjksMTMgKzE3MSwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgIH0KICAgcHV0U3RyTG4gInRlc3ROZXN0IgogICBuZXN0T3V0IDwtIENsaWVudC50ZXN0TmVzdCBwcm90IG5lc3RJbgotICB3aGVuIChuZXN0SW4gLz0gbmVzdE91dCkgZXhpdFN1Y2Nlc3MKKyAgd2hlbiAobmVzdEluIC89IG5lc3RPdXQpIGV4aXRGYWlsdXJlCiAKICAgLS0gTWFwIFRlc3QKICAgbGV0IG1hcEluID0gTWFwLmZyb21MaXN0ICQgbWFwIChcaSAtPiAoaSwgaS0xMCkpIFsxLi41XQogICBwdXRTdHJMbiAidGVzdE1hcCIKICAgbWFwT3V0IDwtIENsaWVudC50ZXN0TWFwIHByb3QgbWFwSW4KLSAgd2hlbiAobWFwSW4gLz0gbWFwT3V0KSBleGl0U3VjY2VzcworICB3aGVuIChtYXBJbiAvPSBtYXBPdXQpIGV4aXRGYWlsdXJlCiAKICAgLS0gU2V0IFRlc3QKICAgbGV0IHNldEluID0gU2V0LmZyb21MaXN0IFstMi4uM10KQEAgLTI2Nyw2ICsyNjksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICBCaW5hcnkgIC0+IHJ1bkNsaWVudCAkIEJpbmFyeVByb3RvY29sIHQKICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGFjdCAtPiBydW5DbGllbnQgJCBDb21wYWN0UHJvdG9jb2wgdAogICAgICAgICAgICAgICAgICAgICAgICBKU09OICAgIC0+IHJ1bkNsaWVudCAkIEpTT05Qcm90b2NvbCB0CisgICAgICAgICAgICAgICAgICAgICAgIEhlYWRlciAgLT4gY3JlYXRlSGVhZGVyUHJvdG9jb2wgdCB0ID4+PSBydW5DbGllbnQKICAgICBydW5UZXN0IGxvb3BzIHAgdCA9IGRvCiAgICAgICBsZXQgY2xpZW50ID0gbWFrZUNsaWVudCBwIHQKICAgICAgIHJlcGxpY2F0ZU1fIGxvb3BzIGNsaWVudApkaWZmIC0tZ2l0IGEvdGVzdC9ocy9UZXN0U2VydmVyLmhzIGIvdGVzdC9ocy9UZXN0U2VydmVyLmhzCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggYTg4MGE1ZS4uYjc3MzFhYgotLS0gYS90ZXN0L2hzL1Rlc3RTZXJ2ZXIuaHMKKysrIGIvdGVzdC9ocy9UZXN0U2VydmVyLmhzCkBAIC0zMSw3ICszMSw3IEBACiBpbXBvcnQgU3lzdGVtLkVudmlyb25tZW50CiBpbXBvcnQgU3lzdGVtLkV4aXQKIGltcG9ydCBTeXN0ZW0uSU8KLWltcG9ydCBTeXN0ZW0uUG9zaXguVW5pc3RkCitpbXBvcnQgQ29udHJvbC5Db25jdXJyZW50ICh0aHJlYWREZWxheSkKIGltcG9ydCBxdWFsaWZpZWQgU3lzdGVtLklPIGFzIElPCiBpbXBvcnQgcXVhbGlmaWVkIERhdGEuSGFzaE1hcC5TdHJpY3QgYXMgTWFwCiBpbXBvcnQgcXVhbGlmaWVkIERhdGEuSGFzaFNldCBhcyBTZXQKQEAgLTQ4LDYgKzQ4LDcgQEAKIGltcG9ydCBUaHJpZnQuVHJhbnNwb3J0LkhhbmRsZQogaW1wb3J0IFRocmlmdC5Qcm90b2NvbC5CaW5hcnkKIGltcG9ydCBUaHJpZnQuUHJvdG9jb2wuQ29tcGFjdAoraW1wb3J0IFRocmlmdC5Qcm90b2NvbC5IZWFkZXIKIGltcG9ydCBUaHJpZnQuUHJvdG9jb2wuSlNPTgogCiBkYXRhIE9wdGlvbnMgPSBPcHRpb25zCkBAIC05MCwxMSArOTEsMTMgQEAKIGRhdGEgUHJvdG9jb2xUeXBlID0gQmluYXJ5CiAgICAgICAgICAgICAgICAgICB8IENvbXBhY3QKICAgICAgICAgICAgICAgICAgIHwgSlNPTgorICAgICAgICAgICAgICAgICAgfCBIZWFkZXIKIAogZ2V0UHJvdG9jb2wgOjogU3RyaW5nIC0+IFByb3RvY29sVHlwZQogZ2V0UHJvdG9jb2wgImJpbmFyeSIgID0gQmluYXJ5CiBnZXRQcm90b2NvbCAiY29tcGFjdCIgPSBDb21wYWN0CiBnZXRQcm90b2NvbCAianNvbiIgICAgPSBKU09OCitnZXRQcm90b2NvbCAiaGVhZGVyIiAgPSBIZWFkZXIKIGdldFByb3RvY29sIHAgPSBlcnJvciAkIlVuc3VwcG9ydGVkIFByb3RvY29sOiAiICsrIHAKIAogZGVmYXVsdE9wdGlvbnMgOjogT3B0aW9ucwpAQCAtMjM1LDEzICsyMzgsMTMgQEAKICAgICBTeXN0ZW0uSU8ucHV0U3RyTG4gJCAidGVzdE11bHRpRXhjZXB0aW9uKCIgKysgc2hvdyBzMSArKyAiLCAiICsrIHNob3cgczIgKysgICIpIgogICAgIGNhc2UgczEgb2YKICAgICAgICJYY2VwdGlvbiIgICAtPiB0aHJvdyAkIFhjZXB0aW9uIDEwMDEgIlRoaXMgaXMgYW4gWGNlcHRpb24iCi0gICAgICAiWGNlcHRpb24yIiAgLT4gdGhyb3cgJCBYY2VwdGlvbjIgMjAwMiBkZWZhdWx0X1h0cnVjdAorICAgICAgIlhjZXB0aW9uMiIgIC0+IHRocm93ICQgWGNlcHRpb24yIDIwMDIgJCBYdHJ1Y3QgIlRoaXMgaXMgYW4gWGNlcHRpb24yIiAwIDAgMAogICAgICAgIlRFeGNlcHRpb24iIC0+IHRocm93IFRocmlmdEV4Y2VwdGlvbgogICAgICAgXyAtPiByZXR1cm4gZGVmYXVsdF9YdHJ1Y3R7IHh0cnVjdF9zdHJpbmdfdGhpbmcgPSBzMiB9CiAKICAgdGVzdE9uZXdheSBfIGkgPSBkbwogICAgIFN5c3RlbS5JTy5wdXRTdHJMbiAkICJ0ZXN0T25ld2F5KCIgKysgc2hvdyBpICsrICIpOiBTbGVlcGluZy4uLiIKLSAgICBzbGVlcCAoZnJvbUludGVncmFsIGkpCisgICAgdGhyZWFkRGVsYXkgJCAoZnJvbUludGVncmFsIGkpICogMTAwMDAwMAogICAgIFN5c3RlbS5JTy5wdXRTdHJMbiAkICJ0ZXN0T25ld2F5KCIgKysgc2hvdyBpICsrICIpOiBkb25lIHNsZWVwaW5nISIKIAogbWFpbiA6OiBJTyAoKQpAQCAtMjYxLDEzICsyNjQsMTkgQEAKICAgICAgICAgICB0IDwtIGYgc29ja2V0CiAgICAgICAgICAgcmV0dXJuIChwIHQsIHAgdCkKIAorICAgICAgICBoZWFkZXJBY2NlcHRvciBmIHNvY2tldCA9IGRvCisgICAgICAgICAgdCA8LSBmIHNvY2tldAorICAgICAgICAgIHAgPC0gY3JlYXRlSGVhZGVyUHJvdG9jb2wxIHQKKyAgICAgICAgICByZXR1cm4gKHAsIHApCisKICAgICAgICAgZG9SdW5TZXJ2ZXIgcCBmID0gZG8KICAgICAgICAgICBydW5UaHJlYWRlZFNlcnZlciAoYWNjZXB0b3IgcCBmKSBUZXN0SGFuZGxlciBUaHJpZnRUZXN0LnByb2Nlc3MgLiBQb3J0TnVtYmVyIC4gZnJvbUludGVncmFsCiAKICAgICAgICAgcnVuU2VydmVyIHAgZiBwb3J0ID0gY2FzZSBwIG9mCi0gICAgICAgICAgQmluYXJ5ICAtPiBkbyBkb1J1blNlcnZlciBCaW5hcnlQcm90b2NvbCBmIHBvcnQKLSAgICAgICAgICBDb21wYWN0IC0+IGRvIGRvUnVuU2VydmVyIENvbXBhY3RQcm90b2NvbCBmIHBvcnQKLSAgICAgICAgICBKU09OICAgIC0+IGRvIGRvUnVuU2VydmVyIEpTT05Qcm90b2NvbCBmIHBvcnQKKyAgICAgICAgICBCaW5hcnkgIC0+IGRvUnVuU2VydmVyIEJpbmFyeVByb3RvY29sIGYgcG9ydAorICAgICAgICAgIENvbXBhY3QgLT4gZG9SdW5TZXJ2ZXIgQ29tcGFjdFByb3RvY29sIGYgcG9ydAorICAgICAgICAgIEpTT04gICAgLT4gZG9SdW5TZXJ2ZXIgSlNPTlByb3RvY29sIGYgcG9ydAorICAgICAgICAgIEhlYWRlciAgLT4gcnVuVGhyZWFkZWRTZXJ2ZXIgKGhlYWRlckFjY2VwdG9yIGYpIFRlc3RIYW5kbGVyIFRocmlmdFRlc3QucHJvY2VzcyAoUG9ydE51bWJlciAkIGZyb21JbnRlZ3JhbCBwb3J0KQogCiBwYXJzZUZsYWdzIDo6IFtTdHJpbmddIC0+IE9wdGlvbnMgLT4gTWF5YmUgT3B0aW9ucwogcGFyc2VGbGFncyAoZmxhZyA6IGZsYWdzKSBvcHRzID0gZG8KZGlmZiAtLWdpdCBhL3Rlc3QvaHMvVGhyaWZ0VGVzdF9NYWluLmhzIGIvdGVzdC9ocy9UaHJpZnRUZXN0X01haW4uaHMKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvdGVzdC9pbmRleC5odG1sIGIvdGVzdC9pbmRleC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MTFhOTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2luZGV4Lmh0bWwKQEAgLTAsMCArMSw1MSBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0+Cis8IURPQ1RZUEUgSFRNTD4KKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+Cis8dGl0bGU+QXBhY2hlIFRocmlmdCAtIGludGVncmF0aW9uIHRlc3Qgc3VpdGU8L3RpdGxlPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iaHR0cDovL2Nkbi5kYXRhdGFibGVzLm5ldC8xLjEwLjQvY3NzL2pxdWVyeS5kYXRhVGFibGVzLmNzcyI+Cis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiIHNyYz0iaHR0cDovL2NvZGUuanF1ZXJ5LmNvbS9qcXVlcnktMi4xLjMubWluLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCIgc3JjPSJodHRwOi8vY2RuLmRhdGF0YWJsZXMubmV0LzEuMTAuNC9qcy9qcXVlcnkuZGF0YVRhYmxlcy5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0icmVzdWx0LmpzIj4KKzwvc2NyaXB0PgorPC9oZWFkPgorPGJvZHk+Cis8aDI+QXBhY2hlIFRocmlmdCAtIGludGVncmF0aW9uIHRlc3Qgc3VpdGU6IFJlc3VsdHM8L2gyPgorPHRhYmxlIGlkPSJ0ZXN0X3Jlc3VsdHMiIGNsYXNzPSJkaXNwbGF5Ij4KKyAgICA8dGhlYWQ+CisgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD5TZXJ2ZXI8L3RoPgorICAgICAgICAgICAgPHRoPkNsaWVudDwvdGg+CisgICAgICAgICAgICA8dGg+UHJvdG9jb2w8L3RoPgorICAgICAgICAgICAgPHRoPlRyYW5zcG9ydDwvdGg+CisgICAgICAgICAgICA8dGg+UmVzdWx0IChsb2cpPC90aD4KKyAgICAgICAgICAgIDx0aD5FeHBlY3RlZDwvdGg+CisgICAgICAgIDwvdHI+CisgICAgPC90aGVhZD4KKzwvdGFibGU+Cis8aDI+VGVzdCBJbmZvcm1hdGlvbjwvaDI+Cis8cHJlIGlkPSJ0ZXN0X2luZm8iPjwvcHJlPgorCis8YSBocmVmPSJsb2ciPmJyb3dzZSByYXcgbG9nPC9hPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS90ZXN0L2tleXMvUkVBRE1FLm1kIGIvdGVzdC9rZXlzL1JFQURNRS5tZAppbmRleCA1M2ZlMGNjLi4wMTA4MzVkIDEwMDc1NQotLS0gYS90ZXN0L2tleXMvUkVBRE1FLm1kCisrKyBiL3Rlc3Qva2V5cy9SRUFETUUubWQKQEAgLTI2LDcgKzI2LDcgQEAKICAgICBvcGVuc3NsIHg1MDkgLWluIHNlcnZlci5jcnQgLXRleHQgPiBDQS5wZW0KICAgICBjYXQgc2VydmVyLmNydCBzZXJ2ZXIua2V5ID4gc2VydmVyLnBlbQogCi1FeHBvcnQgcGFzc3dvcmQgaXMgKip0aHJpZnQqKgorRXhwb3J0IHBhc3N3b3JkIGlzICJ0aHJpZnQiIHdpdGhvdXQgdGhlIHF1b3RlcwogCiAgICAgb3BlbnNzbCBwa2NzMTIgLWV4cG9ydCAtY2xjZXJ0cyAtaW4gc2VydmVyLmNydCAtaW5rZXkgc2VydmVyLmtleSAtb3V0IHNlcnZlci5wMTIKIApAQCAtNDAsOSArNDAsOSBAQAogCiBzaWduIHRoZSBjbGllbnQgY2VydGlmaWNhdGUgd2l0aCB0aGUgc2VydmVyLmtleQogCi0gICAgb3BlbnNzbCB4NTA5IC1yZXEgLWRheXMgMzY1IC1pbiBjbGllbnQuY3NyIC1DQSBDQS5wZW0gLUNBa2V5IHNlcnZlci5rZXkgLXNldF9zZXJpYWwgMDEgLW91dCBjbGllbnQuY3J0CisgICAgb3BlbnNzbCB4NTA5IC1yZXEgLWRheXMgMzAwMCAtaW4gY2xpZW50LmNzciAtQ0EgQ0EucGVtIC1DQWtleSBzZXJ2ZXIua2V5IC1zZXRfc2VyaWFsIDAxIC1vdXQgY2xpZW50LmNydAogCi1leHBvcnQgY2VydGlmaWNhdGUgaW4gUEtDUzEyIGZvcm1hdCAoRXhwb3J0IHBhc3N3b3JkIGlzICoqdGhyaWZ0KiopCitleHBvcnQgY2VydGlmaWNhdGUgaW4gUEtDUzEyIGZvcm1hdCAoRXhwb3J0IHBhc3N3b3JkIGlzICJ0aHJpZnQiIHdpdGhvdXQgdGhlIHF1b3RlcykKIAogICAgIG9wZW5zc2wgcGtjczEyIC1leHBvcnQgLWNsY2VydHMgLWluIGNsaWVudC5jcnQgLWlua2V5IGNsaWVudC5rZXkgLW91dCBjbGllbnQucDEyCiAKQEAgLTUwLDkgKzUwLDI4IEBACiAKICAgICBvcGVuc3NsIHBrY3MxMiAtaW4gY2xpZW50LnAxMiAtb3V0IGNsaWVudC5wZW0gLWNsY2VydHMKIAorIyMjIGNyZWF0ZSBjbGllbnQga2V5IGFuZCBjZXJ0aWZpY2F0ZSB3aXRoIGFsdG5hbWVzCisKK2NvcHkgb3BlbnNzbC5jbmYgZnJvbSB5b3VyIHN5c3RlbSBlLmcuIC9ldGMvc3NsL29wZW5zc2wuY25mIGFuZCBhcHBlbmQgZm9sbG93aW5nIHRvIHRoZSBlbmQgb2YgWyB2M19yZXEgXQorCisgICAgc3ViamVjdEFsdE5hbWU9QGFsdGVybmF0ZV9uYW1lcworCisgICAgWyBhbHRlcm5hdGVfbmFtZXMgXQorICAgIElQLjE9MTI3LjAuMC4xCisgICAgSVAuMj06OjEKKyAgICBJUC4zPTo6ZmZmZjoxMjcuMC4wLjEKKworY3JlYXRlIGEgc2lnbmluZyByZXF1ZXN0OgorCisgICAgb3BlbnNzbCByZXEgLW5ldyAta2V5IGNsaWVudF92My5rZXkgLW91dCBjbGllbnRfdjMuY3NyIC1jb25maWcgb3BlbnNzbC5jbmYgXAorICAgICAgICAtc3ViaiAiL0M9VVMvU1Q9TWFyeWxhbmQvTD1Gb3Jlc3QgSGlsbC9PPVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi9PVT1BcGFjaGUgVGhyaWZ0L0NOPWxvY2FsaG9zdCIgLWV4dGVuc2lvbnMgdjNfcmVxCisKK3NpZ24gdGhlIGNsaWVudCBjZXJ0aWZpY2F0ZSB3aXRoIHRoZSBzZXJ2ZXIua2V5CisKKyAgICBvcGVuc3NsIHg1MDkgLXJlcSAtZGF5cyAzMDAwIC1pbiBjbGllbnRfdjMuY3NyIC1DQSBDQS5wZW0gLUNBa2V5IHNlcnZlci5rZXkgLXNldF9zZXJpYWwgMDEgLW91dCBjbGllbnRfdjMuY3J0IC1leHRlbnNpb25zIHYzX3JlcSAtZXh0ZmlsZSBvcGVuc3NsLmNuZgogCiAjIyBKYXZhIGtleSBhbmQgY2VydGlmaWNhdGUgaW1wb3J0Ci1KYXZhIFRlc3QgRW52aXJvbm1lbnQgdXNlcyBrZXkgYW5kIHRydXN0IHN0b3JlIHBhc3N3b3JkICoqdGhyaWZ0KioKK0phdmEgVGVzdCBFbnZpcm9ubWVudCB1c2VzIGtleSBhbmQgdHJ1c3Qgc3RvcmUgcGFzc3dvcmQgInRocmlmdCIgd2l0aG91dCB0aGUgcXVvdGVzCiAKIGxpc3Qga2V5c3RvcmUgZW50cmllcwogCkBAIC02NSw3ICs4NCw3IEBACiAKIGRlbGV0ZSBhbiBlbnRyeQogCi0gICAga2V5dG9vbCAtZGVsZXRlIC1zdG9yZXBhc3MgdGhyaWZ0IC1rZXlzdG9yZSAuLi8uLi9saWIvamF2YS90ZXN0Ly50cnVzdHN0b3JlIC1hbGlhcyBzc2x0ZXN0IAorICAgIGtleXRvb2wgLWRlbGV0ZSAtc3RvcmVwYXNzIHRocmlmdCAta2V5c3RvcmUgLi4vLi4vbGliL2phdmEvdGVzdC8udHJ1c3RzdG9yZSAtYWxpYXMgc3NsdGVzdAogCiAKIGltcG9ydCBjZXJ0aWZpY2F0ZSBpbnRvIHRydXN0c3RvcmUKZGlmZiAtLWdpdCBhL3Rlc3Qva2V5cy9jbGllbnQuY3J0IGIvdGVzdC9rZXlzL2NsaWVudC5jcnQKaW5kZXggNjQ1MjZmNi4uODBhOWFkMCAxMDA2NDQKLS0tIGEvdGVzdC9rZXlzL2NsaWVudC5jcnQKKysrIGIvdGVzdC9rZXlzL2NsaWVudC5jcnQKQEAgLTEsMjAgKzEsMjMgQEAKIC0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQotTUlJRFZEQ0NBandDQVFFd0RRWUpLb1pJaHZjTkFRRUZCUUF3Z2JFeEN6QUpCZ05WQkFZVEFsVlRNUkV3RHdZRAorTUlJRDJEQ0NBc0FDQVFFd0RRWUpLb1pJaHZjTkFRRUxCUUF3Z2JFeEN6QUpCZ05WQkFZVEFsVlRNUkV3RHdZRAogVlFRSURBaE5ZWEo1YkdGdVpERVVNQklHQTFVRUJ3d0xSbTl5WlhOMElFaHBiR3d4SnpBbEJnTlZCQW9NSGxSbwogWlNCQmNHRmphR1VnVTI5bWRIZGhjbVVnUm05MWJtUmhkR2x2YmpFV01CUUdBMVVFQ3d3TlFYQmhZMmhsSUZSbwogY21sbWRERVNNQkFHQTFVRUF3d0piRzlqWVd4b2IzTjBNU1F3SWdZSktvWklodmNOQVFrQkZoVmtaWFpBZEdoeQotYVdaMExtRndZV05vWlM1dmNtY3dIaGNOTVRRd05EQTNNVGt3TURNeldoY05NVFV3TkRBM01Ua3dNRE16V2pDQgorYVdaMExtRndZV05vWlM1dmNtY3dIaGNOTVRVeE1qSXpNRGN3TnpVd1doY05NalF3TXpFd01EY3dOelV3V2pDQgogc1RFTE1Ba0dBMVVFQmhNQ1ZWTXhFVEFQQmdOVkJBZ01DRTFoY25sc1lXNWtNUlF3RWdZRFZRUUhEQXRHYjNKbAogYzNRZ1NHbHNiREVuTUNVR0ExVUVDZ3dlVkdobElFRndZV05vWlNCVGIyWjBkMkZ5WlNCR2IzVnVaR0YwYVc5dQogTVJZd0ZBWURWUVFMREExQmNHRmphR1VnVkdoeWFXWjBNUkl3RUFZRFZRUUREQWxzYjJOaGJHaHZjM1F4SkRBaQotQmdrcWhraUc5dzBCQ1FFV0ZXUmxka0IwYUhKcFpuUXVZWEJoWTJobExtOXlaekNCbnpBTkJna3Foa2lHOXcwQgotQVFFRkFBT0JqUUF3Z1lrQ2dZRUFyck0ySGlUZjVMVDFRaDFKQUFMV1VsSnhWSk5jMXVDOC8vd1pJVzhFa2s2egotSDJYa3JBT1c4Q3M3clZmejZRK3gwMHE3eFNIODI1djlSTDZwdjRsN3NQRFNHSzVsdmMrV2tUeERwaVIyRWpJbQotdVdTdFV6Q1JxN0VYaFY1MHBVbm82TUZBQlZ0cXBSUDg3VGlFMWw3WWI4UzMzditnQVZkc3JwSmV3WUlEd1djQwotQXdFQUFUQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFiR2pITGFtRG0xRlFwZ2F0WWlaL2ljN1o4REZCK0NKbwotRmNaSDRod3cyN0JEL1dwUUxzajZUMTU0MEIzNWhzbVo3M3lldjR4Z0x5YmMvU0VJZHVjVDlCSHljMURyRFp0ZgotQ0ZlU3E2T09KdS8xcEpaOW0vZDBpK3NCSmFXZzV3MXlUOCthRUtKYVdZZkYrQzlqWjYrMytJOWFnSUQ1T3BsRQotV3d3emczeFhsbHozamZtdE5sYzBmK2hFMS9YTFdGRTJuWSs1Y0JobHhSZVdIM0hBaFUvcVpMOW4vV2R4Q2pIZAotTnllV3hsRGxtemMyK3VPZVZGNXNJR3pGT2ovcWpHeGMrVXlVWGFhRXVTdmg3ajNydllsWnRuaHZoSit0TWtvUgotS2J4bDFWVVl4eCtqemZoQnkrYkt1NXVHWkIzRjFxdHlZOWZJNURRdXQ3NW5OYnVlUVBHK3F3PT0KK0Jna3Foa2lHOXcwQkNRRVdGV1JsZGtCMGFISnBablF1WVhCaFkyaGxMbTl5WnpDQ0FTSXdEUVlKS29aSWh2Y04KK0FRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFMbC9iSmhnMTdQdTF0Nzg1Skl1d2xoN2UyRTUxZW9XRnZ1eE1XZkgKK2RzVUFWcURhT3o5OU81c3Y4cGdXS1hya1BCdHRFOThUK014L1B3ejVKSHM0UWNyZTNBNWFkbTZjZGFiMEFLdWcKK2VWRzFQdkhyV3pWNGFoZWc0S1VmVlNpTXo4QkcySzNRMVZHdlprZ01SYS9RNDA5RktqVTZaNEQ5dkJHNFBhczMKK1BONUZ4bkFMNlA3MHlXQ0VyMlZ1L3RXSmxDTitxclJEZlNhRTJocW1UMWlyeGFvUGE2MUd2dVJWc0dRM1Rlb0UKK21HZkVOdHZGcUM2cVFXdVNDYkc1YUk0N1J2NjZwcW9XV3hxa3Jjb2xOYzcrdmh4NnJXK3dkRk8zSWxxSVQ4SUcKK3NkUVZwK1k0aXIvZEdwMmVqenFHWkNyZW1QSjF1RUtqTE1wSXVrZGcyNXltSEMwQ0F3RUFBVEFOQmdrcWhraUcKKzl3MEJBUXNGQUFPQ0FRRUFCY1Jkd2M5bWRZOXpPdlRpeHRUaEhyY2lWdnF3cDZSYWlRcU1FVm9tb3pZaWxaRFIKK0o5ME0zSDZLbmxBREpiQ3YwRlh1anNhQXBCNTNhd3E1STdzT2JBWVdGaERKWjlMS2x3MGxERjdLY2hMWGlBbGsKK1hWeXZMMm5KanVKY3hQQ0ZQV2t0d3J3NWJUZ3VSQ0J6RzEySHppa24reHM2dVB1cjdWUVlNMzNqYlhFZGE1UFMKK1VFcXZBVldhT05KQ1g4TURZT3NjVm9KRjBFU3lJK2ZOOTJpcEZhWFI3Zkdham9kL3JjMEFmZU4yR1ZNWkVUdmUKKzIxcGtVeUR3d0NHQTQ0dXZOVUNkMWUzMk54RTNhaDlVQXBDUm41c0dKNjRSNnVycEZUWFQzSUFMRjNrYU9PN1UKK1ZzTWhGclVpWjcrQnc1bkllaUswUU9GNkVpcGorYkp2ckxacFNnPT0KIC0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3Qva2V5cy9jbGllbnQua2V5IGIvdGVzdC9rZXlzL2NsaWVudC5rZXkKaW5kZXggNzAzZTA0NS4uMjVkY2ZkNyAxMDA2NDQKLS0tIGEvdGVzdC9rZXlzL2NsaWVudC5rZXkKKysrIGIvdGVzdC9rZXlzL2NsaWVudC5rZXkKQEAgLTEsMTUgKzEsMjcgQEAKIC0tLS0tQkVHSU4gUlNBIFBSSVZBVEUgS0VZLS0tLS0KLU1JSUNYQUlCQUFLQmdRQ3VzelllSk4va3RQVkNIVWtBQXRaU1VuRlVrMXpXNEx6Ly9Ca2hid1NTVHJNZlplU3MKLUE1YndLenV0Vi9QcEQ3SFRTcnZGSWZ6Ym0vMUV2cW0vaVh1dzhOSVlybVc5ejVhUlBFT21KSFlTTWlhNVpLMVQKLU1KR3JzUmVGWG5TbFNlam93VUFGVzJxbEUvenRPSVRXWHRodnhMZmUvNkFCVjJ5dWtsN0JnZ1BCWndJREFRQUIKLUFvR0FYMVVXWEI2OU92M3d0SEpzcXAvaHVxeVlnWkdrNFBGazBjQU5LcXg5YnlXWkk3SWp0aWFEVUc0WE04SEMKLUxWVk9NY0lmY3pUWDJqTm1Zd1EwZDN3YnpZeDV4STRwMUtwZHhaMlpLZGlseGRVUFNDdXNLS0NPNFdSRS81akMKLThpVzJjenhNZWpjS2dkMjl0bkVKWS9aZzJqWGJlK3lxN0xTRWUrcEx2ek5HWmhrQ1FRRGdLd1BvRDFWbDBieXUKLTQ2bXFJRHc3cmpxRFV1MTR2WTFTN0VZOU5TcnV3bzVTZG9ucXRYbnJiRk91NXVtTnNDSjJ5U28rYUZMd2VOUEUKLTNtVGlETEVyQWtFQXg0SHQvOFBxY095SmdvS2txMHprUjh0cVBIdDFob2F6NFgrUWZmcWhkTy9KVU0yaFdvNFEKLVZiTldYZEVkRmkrRk9nVTZPZVJpcG9tdVBvb2ZRZFI2dFFKQUNvcTdVa3gyVGFXQlpCQWN5SDFmbDhibnhZaysKLTFiREVWcVA1NGFNQWM5MytaMjVmcWdRQ3ljbDhYZnRKL0huT0JSd011b2FaYittZXUrRmhpU2ZqcFFKQkFJT1IKLU1MWFJxb0tyeW9jeHhveGRHZElxMkRWb3FYbDh6WlZ3L1lYR3ljRUcvTGozMG1lWWRqYytIRCtrVHMwNXExODIKLTRVNGFTZUJQdllQcXJIQktRbDBDUUdDSDJrWTZFU3hzTVNvWGNmOFVoMldLVi9pZ0hTVEVZdHg3cmU0Ulhoc0sKLTBmRE91UFR5L2hWQTBERVRQZGRmSTV3RnBPa0tTSldiaGtjSytURmRyenM9CitNSUlFb3dJQkFBS0NBUUVBdVg5c21HRFhzKzdXM3Z6a2tpN0NXSHQ3WVRuVjZoWVcrN0V4WjhkMnhRQldvTm83CitQMzA3bXkveW1CWXBldVE4RzIwVDN4UDR6SDgvRFBra2V6aEJ5dDdjRGxwMmJweDFwdlFBcTZCNVViVSs4ZXRiCitOWGhxRjZEZ3BSOVZLSXpQd0ViWXJkRFZVYTltU0F4RnI5RGpUMFVxTlRwbmdQMjhFYmc5cXpjODNrWEdjQXZvCisvdlRKWUlTdlpXNysxWW1VSTM2cXRFTjlKb1RhR3FaUFdLdkZxZzlyclVhKzVGV3daRGRONmdTWVo4UTIyOFdvCitMcXBCYTVJSnNibG9qanRHL3JxbXFoWmJHcVN0eWlVMXp2NitISHF0YjdCMFU3Y2lXb2hQd2dheDFCV241amlLCit2OTBhblo2UE9vWmtLdDZZOG5XNFFxTXN5a2k2UjJEYm5LWWNMUUlEQVFBQkFvSUJBRm90YkNtWHlzVWFjekxzCitWbUlLZ1VocW4weGd4WEdMVTVrQVJ6aGdhNGpSNVV0RlRGQk5IVkVRT2l0ZGVzVFhkN0VOa2Y5OHdoTUlPU3FoCitZKzdUSm9qdFZxVlRyUWVRNEZGTmhaWHA2WkNqUC9wenBGK1dMbDFXUkYrQm4vQ2FvOVNobkd6RGZUQzh5RWgyCitUdHB0L2xObkdHSFFCc2xha0xjOGpoNVNPREVGZmJ1Z1g4U2RUQ3daWXNlc0tOclhtMXBTLzVJRXVuUHFhUmkwCitJSTBFY25xSEVzZ3FTbytDbGpwVzd1TnhTcnlBMnZTQVZkbFBlajYrOUZaamRJSExQNUFFS1l2azdlOUQyQ01WCisxK2dyTmUvUWtRcHBTaGl6UGlyYmI5M3RIbTg2djVia0RGQ005eVdyaGNNY2p2SUxNWEVUeElwcE1HUG1hY1J1CitqcXRZY0FFQ2dZRUE4VkR6eWxUejRrUzMrRDNuM2hUZ2I0MVhWWWE3ZmVVc2g5OUdXUk8xd1hJRnBIakNJUmpBCis5ci9CWFc5K1J4M3B1VlBoUzhod0xRNEJMZEE3bEZwVjFDOGFnMGUzK3ZuNnpWaXJuejFqdEkrdUhNdlN0emhPCitkNmkwbmYrdzRIWVhvN21ONm85WmRIRWZDOFNGTmJ5bWhDb1ZLaDJESUxEd2I0RVg5UlhOcHkwQ2dZRUF4TWo0CisrdnJrbEovaWxIK1J5MXpzdDR6UVlJd21tM1FXamFyRHJ5cEd1Y0hnZDRqZzV2OUEvQ0pJS1VpOHgwTWpyY3VOCit3VmI3UjhYSnlZekZRUlhJVVhSNkduTGVlU25mcHh6dDRZbGlmQ3ZYeG5PaTh3NGZ2N0tlR0JWNW5wMUVncG84CituV055WkZ4ZHZRRHVDb3ByM1NVb1M5Skk4SlB3VmdBN1QrN0RhUUVDZ1lBR29hdmhibzQ1Tkp3OXBTM2ZDNEhUCitidlhzY3NScVJFY0NBTi9GQ09hZ3gwcGlaN01tQjdFZDFzMHdqU1RTUFg4enladFNZdEs2V2owc0RpSGxCTXFCCitCejVhUnpsR0cyS0tEQnJEU0lPWjdhemlPN094dDBsb3Zta2dRbXVRNzQzY3dQZW1iNFFNMENNRFJzWkdZTVhPCitzZjFjNSt5M2xFVTNPenYyVDBBVWpRS0JnQmxuek9VeU1RS1RKY0NBTzhWaWlOa2xuOTFuR3JEbEt1ZzlUS2czCitzQXZaWU81dHlJTnFIdXl1VEZ5d0hGY3BidGpJTjlQbk0rZlBQRDcrSXBWRmg2Z2tmb01kbzJWSEo2MitpV09kCit4ZzQ3NXM2akxUMXQ3R0ZtWVF6QThRT3VVQ01BWUtUOUtzNlVNakh0aGMzc2t3SnBBcXZQU1VWdUJCQkdWV0g3CitkRlVCQW9HQkFMNjdBUkx1amlBRVZOSHQ1cmFqaXhCNm5jbDcvUitaMnVhd0kxSmZtZG5DWm9uQUtWWllIdVhVCisvNGoyK280UWhKSVBMdFdJb2F4QWtNaWdRdEFrZXNxaXJuM0trL2M3a1pSSW9ONTQ5SFRKdXdacVlxTnA3Q0IvCitrVmk1UjMzNStNOXo0OWk2cUEwUlpzSkdTb1NCazdQdWZHNFJtTGltY1JiR3dyWTkzc1BECiAtLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdC9rZXlzL2NsaWVudC5wMTIgYi90ZXN0L2tleXMvY2xpZW50LnAxMgppbmRleCBhN2Q5NWRmLi41ZDI2NjljIDEwMDY0NAotLS0gYS90ZXN0L2tleXMvY2xpZW50LnAxMgorKysgYi90ZXN0L2tleXMvY2xpZW50LnAxMgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2tleXMvY2xpZW50LnBlbSBiL3Rlc3Qva2V5cy9jbGllbnQucGVtCmluZGV4IGVlNWJjNjEuLjY2ZWY2MjYgMTAwNjQ0Ci0tLSBhL3Rlc3Qva2V5cy9jbGllbnQucGVtCisrKyBiL3Rlc3Qva2V5cy9jbGllbnQucGVtCkBAIC0xLDQ0ICsxLDYwIEBACiBCYWcgQXR0cmlidXRlcwotICAgIGxvY2FsS2V5SUQ6IDA1IDNDIDZBIDlEIDZEIEVDIEEwIEZBIDJGIEFFIDQxIDMyIDBEIDI0IDNBIDIxIDM0IEY2IDA4IDE1IAorICAgIGxvY2FsS2V5SUQ6IDM5IEVDIDNEIDVCIDI4IDE3IERBIEREIDA5IDdBIDYyIDY4IEQ1IDQ0IDFGIEM3IEUyIEY4IEUwIENEIAogc3ViamVjdD0vQz1VUy9TVD1NYXJ5bGFuZC9MPUZvcmVzdCBIaWxsL089VGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uL09VPUFwYWNoZSBUaHJpZnQvQ049bG9jYWxob3N0L2VtYWlsQWRkcmVzcz1kZXZAdGhyaWZ0LmFwYWNoZS5vcmcKIGlzc3Vlcj0vQz1VUy9TVD1NYXJ5bGFuZC9MPUZvcmVzdCBIaWxsL089VGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uL09VPUFwYWNoZSBUaHJpZnQvQ049bG9jYWxob3N0L2VtYWlsQWRkcmVzcz1kZXZAdGhyaWZ0LmFwYWNoZS5vcmcKIC0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQotTUlJRFZEQ0NBandDQVFFd0RRWUpLb1pJaHZjTkFRRUZCUUF3Z2JFeEN6QUpCZ05WQkFZVEFsVlRNUkV3RHdZRAorTUlJRDJEQ0NBc0FDQVFFd0RRWUpLb1pJaHZjTkFRRUxCUUF3Z2JFeEN6QUpCZ05WQkFZVEFsVlRNUkV3RHdZRAogVlFRSURBaE5ZWEo1YkdGdVpERVVNQklHQTFVRUJ3d0xSbTl5WlhOMElFaHBiR3d4SnpBbEJnTlZCQW9NSGxSbwogWlNCQmNHRmphR1VnVTI5bWRIZGhjbVVnUm05MWJtUmhkR2x2YmpFV01CUUdBMVVFQ3d3TlFYQmhZMmhsSUZSbwogY21sbWRERVNNQkFHQTFVRUF3d0piRzlqWVd4b2IzTjBNU1F3SWdZSktvWklodmNOQVFrQkZoVmtaWFpBZEdoeQotYVdaMExtRndZV05vWlM1dmNtY3dIaGNOTVRRd05EQTNNVGt3TURNeldoY05NVFV3TkRBM01Ua3dNRE16V2pDQgorYVdaMExtRndZV05vWlM1dmNtY3dIaGNOTVRVeE1qSXpNRGN3TnpVd1doY05NalF3TXpFd01EY3dOelV3V2pDQgogc1RFTE1Ba0dBMVVFQmhNQ1ZWTXhFVEFQQmdOVkJBZ01DRTFoY25sc1lXNWtNUlF3RWdZRFZRUUhEQXRHYjNKbAogYzNRZ1NHbHNiREVuTUNVR0ExVUVDZ3dlVkdobElFRndZV05vWlNCVGIyWjBkMkZ5WlNCR2IzVnVaR0YwYVc5dQogTVJZd0ZBWURWUVFMREExQmNHRmphR1VnVkdoeWFXWjBNUkl3RUFZRFZRUUREQWxzYjJOaGJHaHZjM1F4SkRBaQotQmdrcWhraUc5dzBCQ1FFV0ZXUmxka0IwYUhKcFpuUXVZWEJoWTJobExtOXlaekNCbnpBTkJna3Foa2lHOXcwQgotQVFFRkFBT0JqUUF3Z1lrQ2dZRUFyck0ySGlUZjVMVDFRaDFKQUFMV1VsSnhWSk5jMXVDOC8vd1pJVzhFa2s2egotSDJYa3JBT1c4Q3M3clZmejZRK3gwMHE3eFNIODI1djlSTDZwdjRsN3NQRFNHSzVsdmMrV2tUeERwaVIyRWpJbQotdVdTdFV6Q1JxN0VYaFY1MHBVbm82TUZBQlZ0cXBSUDg3VGlFMWw3WWI4UzMzditnQVZkc3JwSmV3WUlEd1djQwotQXdFQUFUQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFiR2pITGFtRG0xRlFwZ2F0WWlaL2ljN1o4REZCK0NKbwotRmNaSDRod3cyN0JEL1dwUUxzajZUMTU0MEIzNWhzbVo3M3lldjR4Z0x5YmMvU0VJZHVjVDlCSHljMURyRFp0ZgotQ0ZlU3E2T09KdS8xcEpaOW0vZDBpK3NCSmFXZzV3MXlUOCthRUtKYVdZZkYrQzlqWjYrMytJOWFnSUQ1T3BsRQotV3d3emczeFhsbHozamZtdE5sYzBmK2hFMS9YTFdGRTJuWSs1Y0JobHhSZVdIM0hBaFUvcVpMOW4vV2R4Q2pIZAotTnllV3hsRGxtemMyK3VPZVZGNXNJR3pGT2ovcWpHeGMrVXlVWGFhRXVTdmg3ajNydllsWnRuaHZoSit0TWtvUgotS2J4bDFWVVl4eCtqemZoQnkrYkt1NXVHWkIzRjFxdHlZOWZJNURRdXQ3NW5OYnVlUVBHK3F3PT0KK0Jna3Foa2lHOXcwQkNRRVdGV1JsZGtCMGFISnBablF1WVhCaFkyaGxMbTl5WnpDQ0FTSXdEUVlKS29aSWh2Y04KK0FRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFMbC9iSmhnMTdQdTF0Nzg1Skl1d2xoN2UyRTUxZW9XRnZ1eE1XZkgKK2RzVUFWcURhT3o5OU81c3Y4cGdXS1hya1BCdHRFOThUK014L1B3ejVKSHM0UWNyZTNBNWFkbTZjZGFiMEFLdWcKK2VWRzFQdkhyV3pWNGFoZWc0S1VmVlNpTXo4QkcySzNRMVZHdlprZ01SYS9RNDA5RktqVTZaNEQ5dkJHNFBhczMKK1BONUZ4bkFMNlA3MHlXQ0VyMlZ1L3RXSmxDTitxclJEZlNhRTJocW1UMWlyeGFvUGE2MUd2dVJWc0dRM1Rlb0UKK21HZkVOdHZGcUM2cVFXdVNDYkc1YUk0N1J2NjZwcW9XV3hxa3Jjb2xOYzcrdmh4NnJXK3dkRk8zSWxxSVQ4SUcKK3NkUVZwK1k0aXIvZEdwMmVqenFHWkNyZW1QSjF1RUtqTE1wSXVrZGcyNXltSEMwQ0F3RUFBVEFOQmdrcWhraUcKKzl3MEJBUXNGQUFPQ0FRRUFCY1Jkd2M5bWRZOXpPdlRpeHRUaEhyY2lWdnF3cDZSYWlRcU1FVm9tb3pZaWxaRFIKK0o5ME0zSDZLbmxBREpiQ3YwRlh1anNhQXBCNTNhd3E1STdzT2JBWVdGaERKWjlMS2x3MGxERjdLY2hMWGlBbGsKK1hWeXZMMm5KanVKY3hQQ0ZQV2t0d3J3NWJUZ3VSQ0J6RzEySHppa24reHM2dVB1cjdWUVlNMzNqYlhFZGE1UFMKK1VFcXZBVldhT05KQ1g4TURZT3NjVm9KRjBFU3lJK2ZOOTJpcEZhWFI3Zkdham9kL3JjMEFmZU4yR1ZNWkVUdmUKKzIxcGtVeUR3d0NHQTQ0dXZOVUNkMWUzMk54RTNhaDlVQXBDUm41c0dKNjRSNnVycEZUWFQzSUFMRjNrYU9PN1UKK1ZzTWhGclVpWjcrQnc1bkllaUswUU9GNkVpcGorYkp2ckxacFNnPT0KIC0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KIEJhZyBBdHRyaWJ1dGVzCi0gICAgbG9jYWxLZXlJRDogMDUgM0MgNkEgOUQgNkQgRUMgQTAgRkEgMkYgQUUgNDEgMzIgMEQgMjQgM0EgMjEgMzQgRjYgMDggMTUgCisgICAgbG9jYWxLZXlJRDogMzkgRUMgM0QgNUIgMjggMTcgREEgREQgMDkgN0EgNjIgNjggRDUgNDQgMUYgQzcgRTIgRjggRTAgQ0QgCiBLZXkgQXR0cmlidXRlczogPE5vIEF0dHJpYnV0ZXM+CiAtLS0tLUJFR0lOIEVOQ1JZUFRFRCBQUklWQVRFIEtFWS0tLS0tCi1NSUlDeGpCQUJna3Foa2lHOXcwQkJRMHdNekFiQmdrcWhraUc5dzBCQlF3d0RnUUlXeWVZQUdSQld2d0NBZ2dBCi1NQlFHQ0NxR1NJYjNEUU1IQkFqWEhsQkcrTm1XRHdTQ0FvQlJnSWIyTmk4cUdocnVZVzdCaUtNbFZLUG5EZG5yCi1zTWdTVGd6ZWx3QUxVYXpkNTlCN3BBMW1kQ1ZhelRaMmJxUFpZSjB2Um9tbnU0dW9zbjI0c1hTTndkWWc3cEpkCi1DUm50dEUyQkdseEM0UHFGclZNMUo3b081VGZubzFyclhWc1JpMEo0UXI2R3RqNXh3WlJaaUduTEd0blE5Ry9YCi1Uc1J0TkgvcE5SbmNtdSsyMHhtVEMyRjhFczhxLy80c2NvNVllRWNsY21jQnI3Z29PK1R1c0lIM2dobGYwamJkCi1NOW9UdkVHN1dZM2xTYXJoWnA0UVlsV1drR2ZHZmtkN3JQM3l4aExDaGlqZFZFT0xMNmdmdERPczBBTEJudEFSCi1OWWVTeEZveVRFQkN6OEYrV2pWdDdRUXpBeVJOU0tOREk4cU14TW0vS0RLYUU5MmhTNzZLOFBjQmxiZHkxMThzCi1MZkhOYjN2L3Y0V0Zkam1SSnFQZFd4NXgzY1R3R1d3T0Y0TXFaZDkrWG4rL2lzdThTZlFkMldtU20ycWF3YlFQCi1CcmpvUVN1VVFyWnlMNUFRbUZLa2RRODc1ZkxmTnczSTJja2hwZ01pK1dDV3gxMS84azJkWVpvUDlWVFoxL3lUCi1sMzJGTTR1bnQ3d2FmVTB2VVUydFBjc0VxNFNUZHdXUjVRNEZCUEYzSlJpTWlOeThLenZGZVV0blNYMDhtL3NCCi1CM1VpdzFqS3d3b0J4MWdmUHBxMy9VQnZtQmx2R213QngrN1YraE1mWEJBaUlvRlpGQU1ydVdWZ280R2NPOFp2Ci1zZTljck9PYmlwY1I4ci9xOVZPRjRPbHdDeWhrbDJ5RHdFalFsUkJQa1ExY3BPNEZXa2U3VkFvUlJ0YUNvdjhLCi1vUVlFeFJ3YzE0MWpqaGxadmtYSWEwVHN0WnBIR1pabUJ5RnFicnBjQWh5UndESlkrd3FDM1VGaytNQUxUNkd3Ci1UY2JRTzN5SUlBemZlYU1Za3c2aXNpQWE5NGRPanJZSHFPS0FiWHJ3MGJ0dDN2S0VUVjVYeDBqb2dudU9jQ0M4Ci1pMVI1UzBjTHNabTJqNGtXVjhtWHVDdlhrdnVxL1dnUEMxNjIrL0dScmhFcDF3Q3NTbzhEd0cySQorTUlJRkRqQkFCZ2txaGtpRzl3MEJCUTB3TXpBYkJna3Foa2lHOXcwQkJRd3dEZ1FJUktvbDQyYkFTM0FDQWdnQQorTUJRR0NDcUdTSWIzRFFNSEJBak91bGN5SE1hV3NRU0NCTWdiZVhROHBJWVRFTkttMDhVUGVxeGtDUjJuTHhTTworZ3RSbUJ4RFlqcVl2MzV5NEs4S2h5YkJ2U0JsSVBnRTVqRVd4VUNjYzFRdnk1eWRVUS9YOXBta1U4ZG5tQW1EQworbzB6d2QzbHQyZU5QeSs0V2xpcUZEVm1IckxmWVFGT29JckhqdXpDMGxJNEMyaVBPanhoZmExekZ1bWVkZ3dHUworR3gxMFg1dUVWSDVONjRmVzZCM0J2elFNMHJuMnFyME9OdVNSbXRlUnRJOE5zem5ma2dlSjlhNENJQUY3RTVaMgorSlRHSTEyZWROenpVSjFKaFg0N1pXNG1pUXdDVTVMY3kwMVVacVRGdVVwbUs3RlVRZWd0THkzZTVlREtxK2JJZworWllxNkh4N2x1OGhqVDVrV1pHS3k3MWFZbUhLRWpJMGY3MjdjQWJxRFRHNXVaQkhCandLLzNwL3puUVZRWHhCYgorMStFOUNpS2VGZFhqMkVscHRzbkR5b1R2clN3Si9KcXUxd2tYQmNINUVtYmc3YUpNb2QxSU9zNk9RQjFyUER2ZAorRkZhODR6YnFSTldIU3h4eFlaeGNCOFlaaW5MNi9kUUpuaXNLdTlMTVFkM0JCR3NHV3FIOFp6NXRFdlhqUzVLdgorM2c5SlJhN1FEa1NGMDA1eDZVK3EvNjc4RzJNRytXK05XcWplM05aeDlQc2gvUHRtK2grcTluMkdTdm5pYmlLNQorbUVqOUZJd0dxdUdwYlpVVEs1YVhIY0tONjU3ZEtpSUNzRUplTmFyMWlaem5SbXpyTWJaSitEeHFKblR3K0dBdgorN1liNjMvQ05BdHFTeGl5TkhHWjZOTTJaQTl2QUtZMUhYbjBSVkMweTErOUZtTnBTUnd2M3UvK3lkU0NuSm9uUgorR0VLanpPcU05RG43cXhkK2g0VW5uQTdoWFd4SVRhZ2VCNkc2S21maVhSeGhpV3lxdE9JQ2RDbmVDd3BxOFVaNAorZTBmbTA1TlJXNk0ybXFHUUhzTU5TdlRXZGR3ejViOHdndzRlVnNiK3hReXR4VmRqOWxwQnVCOUt5alFqeFVnVQorM29aeDRLeVdMb0VXamt6dFBBaUszdXY1R2ZvdE5JTWR6blJmT04xK3htMU01c3d0bjN5M1J1MWY2U1RaQzdTcAorcXZiRzdqUG1wQjVnTEVVcmkrY2h3K2FLVVliSjBiODIwT2Q0RkxRWW53TFdyNDZWZWxZbVY0NHh1UjA2d2dxUAorMUhjaE1Tc0h0UytabElpUVFVOWpoZHlUcmw4NkVRSEgzM2RoK1N1YThBaGZld1BSeTJWRnAzWmszNEFVc1djWAorRWZJWUdlbWhxVUQzZHJHMFNNVmJGRk5PYUZHcDllMHRRb3VZT0M2L3FGQnYvU05nUXozbUFFa2NpSlliVXVVWgorVjRZUVB2dGR2U3JJU1YwZTdiakZnZFNFakc3UDdGNkNGcldUcmpVbEhadVdqNi9ySjMrLzFQSGVKVml5aHNySgorWllGZTE0Vy80OFBEeEJSbDRJRUFteGNOMUViMkV6OWVDcXYwSFc3N0h2aUc2eklnbmtQcmhXSGpGR1VweEtrNAorakxmdUIyVGZxOUY3b3p2NEwyUUFuK0YveUt0MVJtMkhoNUo2MWVVSnRBVDYwcGFqZytnSnRqbXB1NVByNEhEbgorYjZwM3htWXdhTDVMZXQxekNBYmJNZmRsREsxNFlqZE9kTS9CRUtwWGI5eTRFSXViWDVBTVk0bGpYZUc5Z3grVAorQjFUdVFWZEowUDV3SUsvRDEwVFF6QVdES2FtMGt2M1JYaWRselJ4cFozc25Sbk4vTDNFVmQ1OFJudGoxT2MweQorRmlJaVNLUnN6RGJQektEeFFFMnNOZ1FjZE8yNEpOTFNhL3NaWXRxMmdSZ3NwbC9ZcUlEbzRaWXFpOXg4RjVPUworcmRQVTVEL0g4TFdSNHZwSkxMOERZckhoNXFGRzNCWDJPSkloUFJTKzQ4cERZdHJSanA3Uy8xWlU2NE9KQXl0aworOTloRHFTcm4xajJhNnlGRThMMlB0eis0VUNGMk9RWEVjOVJxcWViOFFFVXVNU2tOSDRvUStBMkY2dXpMcFppMAorWEg2NFIybmlOQzU2THhWMmkrM1Q1S1JFRkxhaHlrOGVwTFpsdjhZZHhZUjRTYjdKLzV5aW9vSzNnOWhtWVZLTworekxjPQogLS0tLS1FTkQgRU5DUllQVEVEIFBSSVZBVEUgS0VZLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3Qva2V5cy9jbGllbnRfdjMuY3J0IGIvdGVzdC9rZXlzL2NsaWVudF92My5jcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ3ZjE1NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qva2V5cy9jbGllbnRfdjMuY3J0CkBAIC0wLDAgKzEsMjQgQEAKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRUNEQ0NBdkNnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFzRkFEQ0JzVEVMTUFrR0ExVUVCaE1DVlZNeAorRVRBUEJnTlZCQWdNQ0UxaGNubHNZVzVrTVJRd0VnWURWUVFIREF0R2IzSmxjM1FnU0dsc2JERW5NQ1VHQTFVRQorQ2d3ZVZHaGxJRUZ3WVdOb1pTQlRiMlowZDJGeVpTQkdiM1Z1WkdGMGFXOXVNUll3RkFZRFZRUUxEQTFCY0dGagorYUdVZ1ZHaHlhV1owTVJJd0VBWURWUVFEREFsc2IyTmhiR2h2YzNReEpEQWlCZ2txaGtpRzl3MEJDUUVXRldSbAorZGtCMGFISnBablF1WVhCaFkyaGxMbTl5WnpBZUZ3MHhOakF5TWpJeE1UVTROREZhRncweU5EQTFNVEF4TVRVNAorTkRGYU1JR0xNUXN3Q1FZRFZRUUdFd0pWVXpFUk1BOEdBMVVFQ0F3SVRXRnllV3hoYm1ReEZEQVNCZ05WQkFjTQorQzBadmNtVnpkQ0JJYVd4c01TY3dKUVlEVlFRS0RCNVVhR1VnUVhCaFkyaGxJRk52Wm5SM1lYSmxJRVp2ZFc1aworWVhScGIyNHhGakFVQmdOVkJBc01EVUZ3WVdOb1pTQlVhSEpwWm5ReEVqQVFCZ05WQkFNTUNXeHZZMkZzYUc5egorZERDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTFowd2lRblhnNVFNWlpXdWdkLworTzN3b2F0eUh1Y3pKdUZTbVlpUkdXTHIzUHVnQit4dHZqeTByVGNFMk1OeC9iZHNWeHJhcENLQSt0TUZPUmJFbAorc0Y2amswSCtCN0J6R29Jd0hyNk44R1AxVk9vQTJlc3Joc05FejIyYUpJMDBWYUZURkU4Ry9xZ0ZjaWh5YVZXSAorWnNMYTNNYWtPekZVbU9CYVYydExCakNqYXpucVh3M2VvM1h3VUkwQmtnUzliOXZxWGpTY21mV1hEdzUrMWlzNAorYkNndW1HMnpqOUVwTHlwYzlxQ0dOS0ZCTzJZSWcwWHNJSUo4UnBybGlhbmpMNlA0TWZDNkdQT3lXNE5iWmFMZAorRVN2L2J1bXBWeXVWL0MveHFrUGFodk93QnVQRTFsb3haWlB4NlF2MzY4cW43U1ZOVlpPTHlYNzIyc3Bvb0E1RworNmNzQ0F3RUFBYU5QTUUwd0NRWURWUjBUQkFJd0FEQUxCZ05WSFE4RUJBTUNCZUF3TXdZRFZSMFJCQ3d3S29jRQorZndBQUFZY1FBQUFBQUFBQUFBQUFBQUFBQUFBQUFZY1FBQUFBQUFBQUFBQUFBUC8vZndBQUFUQU5CZ2txaGtpRworOXcwQkFRc0ZBQU9DQVFFQUJVRW1lUWtHL1BTOTM1ak1IRHJnLzV6bTRYMnhybkZ0bVR3YjBqZHhmYXU2ei83aAorQWJ4RDVpb3lZN0ZVVE5Dekk2U3lNbzl2Skp0WUNUQ3VFR3I4NEpqVDJSNzIzMno2MGs0YzF6L2F2MDFXM09ydgorRXhIZkFaOGxsaGtmdTAyMDlUNVRhSVlDQjdoREZqNUtEYnRhOGM2ZkVjd3RtbEhRV2ozTTMxbFNOc3I0WnRXVword09iaEszc3FUc09sdUhiaEtOd2xORWF0NDhsYk9RVUMxOUkxV2kzZEFTNm44bHIwbEVoZkdLdnF4dTBWaUFTUworTjFuTGZka1JFR3AzOWJZcEtnMG42RUZ3NWJZeVY0cUUzY25JZWRGSnA3TklPTS82eG5kSk1oL2M1bDZOMnV5WgordXBBclJRcHcvM2orSGtMMXg5YnMrOTAwUUswR0k2QXhnamJvcEE9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdC9rZXlzL2NsaWVudF92My5rZXkgYi90ZXN0L2tleXMvY2xpZW50X3YzLmtleQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTg5ZjczCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9rZXlzL2NsaWVudF92My5rZXkKQEAgLTAsMCArMSwyNyBAQAorLS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQorTUlJRXBBSUJBQUtDQVFFQXRuVENKQ2RlRGxBeGxsYTZCMzg3ZkNocTNJZTV6TW00VktaaUpFWll1dmMrNkFINworRzIrUExTdE53VFl3M0g5dDJ4WEd0cWtJb0Q2MHdVNUZzU1d3WHFPVFFmNEhzSE1hZ2pBZXZvM3dZL1ZVNmdEWgorNnl1R3cwVFBiWm9ralRSVm9WTVVUd2IrcUFWeUtISnBWWWRtd3RyY3hxUTdNVlNZNEZwWGEwc0dNS05yT2VwZgorRGQ2amRmQlFqUUdTQkwxdjIrcGVOSnlaOVpjUERuN1dLemhzS0M2WWJiT1AwU2t2S2x6Mm9JWTBvVUU3WmdpRAorUmV3Z2dueEdtdVdKcWVNdm8vZ3g4TG9ZODdKYmcxdGxvdDBSSy85dTZhbFhLNVg4TC9HcVE5cUc4N0FHNDhUVworV2pGbGsvSHBDL2ZyeXFmdEpVMVZrNHZKZnZiYXltaWdEa2JweXdJREFRQUJBb0lCQVFDSnB5VWhhYUlJWW5CRworNEQrUmtHZ3NqOEd2aDZhaDNqNTNmdC9rUmo2RE1DNEJsQjBDNGZPL1BFQjVXSTBjamZjdnB3bzRuT2FwSHlYNAorQVRtTElNZ2pYbjJtK0NTTTl3bzAxbUVibXJLV2QyME03bjk2Y1doR3dnOU12VkorUmRHazJLMGx3ajAyUG9XVworQmx0NTc2R1R1Tk4vK2orK1Evamlxc1h4YUxUTzAvV2orNGIyZ1FoM244STB1NmJrb2xETG9FUktJZHJMR0hIKworRlUzc2s4YnBVaEhtZWlVVGZ3d2NpK2p1aHRPWTllMzBBRXN0Nnhha0NIYnExbFJSeUVZUHRXTDdvTGRzNnl2MAorVUFLUDd3UzlZbDZkY2VrWFNGMVJacEIrZm92VFcrcVBZbjhhRXVrc2FNejB3Szk2RkNPalZOR1l4TXArWG52bAorc0t4NjNVWkJBb0dCQU9DYkNiSnRPMEhzZ0lhdXZDdkdaNTBhWjF2RHZRUmVDd3JpNGlvdXRFZzRKQ0FYSEVzWAorK2F4ejJKNWozVUVRaEdLcjBFWDlCRzZZYnhHVzBNbWpmM1F4ZVJCKzBXTHBNTVkyU0Z0OTNvQzJSMUFYOWwwSQoraDUwTzZ0WXY1U1htOTZwS3h3UnowMWQ4NG1DSmd3bi9HK2NaL0VKajRyZlpzTmJRc3Q2SlFGdnpBb0dCQU0vMQorZ0xWUXQ1bCtJSys2czY4RW5BREk2Nmk3Y0tlNnNqM3JGUlRhaFpKeEwydlkyOEo5RUIybUYvWEVnQVJTTkpRVgorWC9IOXpEcndLbTlNWDg3L2VDSDJuRWJjKzVxU0dwRFBRbTQ4MkM5RHFzTWl0eENLRDhiYmxlMUJscGpGYjhocgorUjBRM3Y1cTh1NXVvbUxCZHM1ZVVCZVJLTXR1OXRPTUE5S1JTREdqSkFvR0FGNDRLMlV4OVQyK1hGd2pTTVNFUQora3JoSEtLZUJkaWpLcmF5WG5XYmlmMFJyL1hXUEFRMFZvUkZSSVdORnUrSVlrQ1NHcGlCZnk1MXU0SUJaaXh2NworYk5zWFlEUjhqd3Yza29IMDJxdDduekgranBiRXZvTDdmZXdua3FqWk5qMWZzZHMvdmViTHZqd1puWmd1UnVrYgorS3dSZG9UVEtmUTkyYlVEYjBWekJoQ01DZ1lCN0grM09iRFhvQ1FjdFJDc3lpbFliR05wK0VreEc0b0M1ckQvVgorRXZSV21mRHJ0MytWalJwSGs1bElCOG1MeFdnZjdPL2JoTnF3WXBXZFErak4wKys2bkJvMjBvdWRIcmZmMlBhSgorOGpoRTg1bGM0MmJqd2ZwSlVLVlp6YVZ1V2ljdTBHVm5mR0pUS1Q4aWtCV25Cak5Zb1dsRG1ySzE2NEgzalE5TAorWXRDNkVRS0JnUUNhYkZYWEh4NWNJSjJYT200Sy9uVE9HN0NsdkQ4MHhhcHF5R3JvUWQ5RS9jSlVISFBwL3dRNAorYzFkTU81RVZpTTdKUnNLZnhrbDl2TTVvOUlNN3N3bFloNEVNRlNMSk5qemdPWTlYVmt2UWgwdUdiaUpPQk80ZgoraW5VdVduMVlXVWovSEZ0clQrME5vK2NZdlpWY01LckZBeTNLL0F3cFRiZktDazZyb3VsbE5BPT0KKy0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCmRpZmYgLS1naXQgYS90ZXN0L2tub3duX2ZhaWx1cmVzX0xpbnV4Lmpzb24gYi90ZXN0L2tub3duX2ZhaWx1cmVzX0xpbnV4Lmpzb24KaW5kZXggZWUxMmViZi4uMWFiMmFmNSAxMDA2NDQKLS0tIGEvdGVzdC9rbm93bl9mYWlsdXJlc19MaW51eC5qc29uCisrKyBiL3Rlc3Qva25vd25fZmFpbHVyZXNfTGludXguanNvbgpAQCAtMSwyOTUgKzEsNDk0IEBACiBbCi0gICJjX2dsaWItY3BwX2JpbmFyeV9idWZmZXJlZC1pcCIsCi0gICJjX2dsaWItY3BwX2JpbmFyeV9mcmFtZWQtaXAiLAotICAiY19nbGliLWNzaGFycF9iaW5hcnlfYnVmZmVyZWQtaXAiLAotICAiY19nbGliLWNzaGFycF9iaW5hcnlfZnJhbWVkLWlwIiwKLSAgImNfZ2xpYi1oc19iaW5hcnlfYnVmZmVyZWQtaXAiLAotICAiY19nbGliLWhzX2JpbmFyeV9mcmFtZWQtaXAiLAotICAiY19nbGliLW5vZGVqc19iaW5hcnlfYnVmZmVyZWQtaXAiLAotICAiY19nbGliLW5vZGVqc19iaW5hcnlfZnJhbWVkLWlwIiwKLSAgImNfZ2xpYi1weV9iaW5hcnktYWNjZWxfYnVmZmVyZWQtaXAiLAotICAiY19nbGliLXB5X2JpbmFyeS1hY2NlbF9mcmFtZWQtaXAiLAotICAiY19nbGliLXB5X2JpbmFyeV9idWZmZXJlZC1pcCIsCi0gICJjX2dsaWItcHlfYmluYXJ5X2ZyYW1lZC1pcCIsCi0gICJjX2dsaWItcmJfYmluYXJ5LWFjY2VsX2J1ZmZlcmVkLWlwIiwKLSAgImNfZ2xpYi1yYl9iaW5hcnktYWNjZWxfZnJhbWVkLWlwIiwKLSAgImNfZ2xpYi1yYl9iaW5hcnlfYnVmZmVyZWQtaXAiLAotICAiY19nbGliLXJiX2JpbmFyeV9mcmFtZWQtaXAiLAotICAiY3BwLWNwcF9iaW5hcnlfaHR0cC1pcCIsCi0gICJjcHAtY3BwX2NvbXBhY3RfaHR0cC1kb21haW4iLAotICAiY3BwLWNwcF9qc29uX2h0dHAtaXAiLAotICAiY3BwLWNzaGFycF9iaW5hcnlfYnVmZmVyZWQtaXAtc3NsIiwKLSAgImNwcC1jc2hhcnBfYmluYXJ5X2ZyYW1lZC1pcC1zc2wiLAotICAiY3BwLWNzaGFycF9jb21wYWN0X2J1ZmZlcmVkLWlwLXNzbCIsCi0gICJjcHAtY3NoYXJwX2NvbXBhY3RfZnJhbWVkLWlwLXNzbCIsCi0gICJjcHAtY3NoYXJwX2pzb25fYnVmZmVyZWQtaXAtc3NsIiwKLSAgImNwcC1jc2hhcnBfanNvbl9mcmFtZWQtaXAtc3NsIiwKLSAgImNwcC1oc19qc29uX2J1ZmZlcmVkLWlwIiwKLSAgImNwcC1oc19qc29uX2ZyYW1lZC1pcCIsCi0gICJjcHAtaHNfanNvbl9odHRwLWlwIiwKKyAgImNfZ2xpYi1yc19tdWx0aV9idWZmZXJlZC1pcCIsCisgICJjX2dsaWItcnNfbXVsdGlfZnJhbWVkLWlwIiwKKyAgImNfZ2xpYi1yc19tdWx0aWNfYnVmZmVyZWQtaXAiLAorICAiY19nbGliLXJzX211bHRpY19mcmFtZWQtaXAiLAorICAiY2wtY19nbGliX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICJjbC1jX2dsaWJfYmluYXJ5X2ZyYW1lZC1pcCIsCisgICJjbC1jX2dsaWJfbXVsdGktYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgImNsLWNfZ2xpYl9tdWx0aS1iaW5hcnlfZnJhbWVkLWlwIiwKKyAgImNsLWNfZ2xpYl9tdWx0aV9idWZmZXJlZC1pcCIsCisgICJjbC1jX2dsaWJfbXVsdGlfZnJhbWVkLWlwIiwKKyAgImNsLWdvX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICJjbC1nb19iaW5hcnlfZnJhbWVkLWlwIiwKKyAgImNsLXJiX2JpbmFyeS1hY2NlbF9idWZmZXJlZC1pcCIsCisgICJjbC1yYl9iaW5hcnktYWNjZWxfZnJhbWVkLWlwIiwKKyAgImNsLXJiX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICJjbC1yYl9iaW5hcnlfZnJhbWVkLWlwIiwKKyAgImNsLXJzX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICJjbC1yc19iaW5hcnlfZnJhbWVkLWlwIiwKKyAgImNsLXJzX211bHRpLWJpbmFyeV9idWZmZXJlZC1pcCIsCisgICJjbC1yc19tdWx0aS1iaW5hcnlfZnJhbWVkLWlwIiwKKyAgImNsLXJzX211bHRpX2J1ZmZlcmVkLWlwIiwKKyAgImNsLXJzX211bHRpX2ZyYW1lZC1pcCIsCisgICJjcHAtZGFydF9iaW5hcnlfaHR0cC1pcCIsCisgICJjcHAtZGFydF9jb21wYWN0X2h0dHAtaXAiLAorICAiY3BwLWRhcnRfanNvbl9odHRwLWlwIiwKKyAgImNwcC1kYXJ0X211bHRpLWJpbmFyeV9odHRwLWlwIiwKKyAgImNwcC1kYXJ0X211bHRpYy1jb21wYWN0X2h0dHAtaXAiLAorICAiY3BwLWRhcnRfbXVsdGlqLWpzb25faHR0cC1pcCIsCisgICJjcHAtZ29fYmluYXJ5X2h0dHAtaXAiLAorICAiY3BwLWdvX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJjcHAtZ29fY29tcGFjdF9odHRwLWlwIiwKKyAgImNwcC1nb19jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1nb19qc29uX2h0dHAtaXAiLAorICAiY3BwLWdvX2pzb25faHR0cC1pcC1zc2wiLAorICAiY3BwLWdvX211bHRpLWJpbmFyeV9odHRwLWlwIiwKKyAgImNwcC1nb19tdWx0aS1iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAiY3BwLWdvX211bHRpYy1jb21wYWN0X2h0dHAtaXAiLAorICAiY3BwLWdvX211bHRpYy1jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1nb19tdWx0aWotanNvbl9odHRwLWlwIiwKKyAgImNwcC1nb19tdWx0aWotanNvbl9odHRwLWlwLXNzbCIsCiAgICJjcHAtamF2YV9iaW5hcnlfaHR0cC1pcCIsCiAgICJjcHAtamF2YV9iaW5hcnlfaHR0cC1pcC1zc2wiLAogICAiY3BwLWphdmFfY29tcGFjdF9odHRwLWlwIiwKICAgImNwcC1qYXZhX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAogICAiY3BwLWphdmFfanNvbl9odHRwLWlwIiwKICAgImNwcC1qYXZhX2pzb25faHR0cC1pcC1zc2wiLAotICAiY3BwLXJiX2JpbmFyeS1hY2NlbF9idWZmZXJlZC1pcCIsCi0gICJjcHAtcmJfYmluYXJ5LWFjY2VsX2ZyYW1lZC1pcCIsCi0gICJjcHAtcmJfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKLSAgImNwcC1yYl9iaW5hcnlfZnJhbWVkLWlwIiwKLSAgImNwcC1yYl9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKLSAgImNwcC1yYl9jb21wYWN0X2ZyYW1lZC1pcCIsCi0gICJjcHAtcmJfanNvbl9idWZmZXJlZC1pcCIsCi0gICJjcHAtcmJfanNvbl9mcmFtZWQtaXAiLAotICAiY3NoYXJwLWNfZ2xpYl9iaW5hcnlfYnVmZmVyZWQtaXAiLAotICAiY3NoYXJwLWNfZ2xpYl9iaW5hcnlfZnJhbWVkLWlwIiwKLSAgImNzaGFycC1jcHBfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKLSAgImNzaGFycC1jcHBfYmluYXJ5X2J1ZmZlcmVkLWlwLXNzbCIsCi0gICJjc2hhcnAtY3BwX2JpbmFyeV9mcmFtZWQtaXAiLAotICAiY3NoYXJwLWNwcF9iaW5hcnlfZnJhbWVkLWlwLXNzbCIsCi0gICJjc2hhcnAtY3BwX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAotICAiY3NoYXJwLWNwcF9jb21wYWN0X2J1ZmZlcmVkLWlwLXNzbCIsCi0gICJjc2hhcnAtY3BwX2NvbXBhY3RfZnJhbWVkLWlwIiwKLSAgImNzaGFycC1jcHBfY29tcGFjdF9mcmFtZWQtaXAtc3NsIiwKLSAgImNzaGFycC1jcHBfanNvbl9idWZmZXJlZC1pcCIsCi0gICJjc2hhcnAtY3BwX2pzb25fYnVmZmVyZWQtaXAtc3NsIiwKLSAgImNzaGFycC1jcHBfanNvbl9mcmFtZWQtaXAiLAotICAiY3NoYXJwLWNwcF9qc29uX2ZyYW1lZC1pcC1zc2wiLAotICAiY3NoYXJwLWNzaGFycF9iaW5hcnlfYnVmZmVyZWQtaXAtc3NsIiwKLSAgImNzaGFycC1jc2hhcnBfYmluYXJ5X2ZyYW1lZC1pcC1zc2wiLAotICAiY3NoYXJwLWNzaGFycF9jb21wYWN0X2J1ZmZlcmVkLWlwLXNzbCIsCi0gICJjc2hhcnAtY3NoYXJwX2NvbXBhY3RfZnJhbWVkLWlwLXNzbCIsCi0gICJjc2hhcnAtY3NoYXJwX2pzb25fYnVmZmVyZWQtaXAtc3NsIiwKLSAgImNzaGFycC1jc2hhcnBfanNvbl9mcmFtZWQtaXAtc3NsIiwKLSAgImNzaGFycC1nb19iaW5hcnlfYnVmZmVyZWQtaXAiLAotICAiY3NoYXJwLWdvX2JpbmFyeV9idWZmZXJlZC1pcC1zc2wiLAotICAiY3NoYXJwLWdvX2JpbmFyeV9mcmFtZWQtaXAiLAotICAiY3NoYXJwLWdvX2JpbmFyeV9mcmFtZWQtaXAtc3NsIiwKLSAgImNzaGFycC1nb19jb21wYWN0X2J1ZmZlcmVkLWlwIiwKLSAgImNzaGFycC1nb19jb21wYWN0X2J1ZmZlcmVkLWlwLXNzbCIsCi0gICJjc2hhcnAtZ29fY29tcGFjdF9mcmFtZWQtaXAiLAotICAiY3NoYXJwLWdvX2NvbXBhY3RfZnJhbWVkLWlwLXNzbCIsCi0gICJjc2hhcnAtZ29fanNvbl9idWZmZXJlZC1pcCIsCi0gICJjc2hhcnAtZ29fanNvbl9idWZmZXJlZC1pcC1zc2wiLAotICAiY3NoYXJwLWdvX2pzb25fZnJhbWVkLWlwIiwKLSAgImNzaGFycC1nb19qc29uX2ZyYW1lZC1pcC1zc2wiLAotICAiY3NoYXJwLWhzX2JpbmFyeV9idWZmZXJlZC1pcCIsCi0gICJjc2hhcnAtaHNfYmluYXJ5X2ZyYW1lZC1pcCIsCi0gICJjc2hhcnAtaHNfY29tcGFjdF9idWZmZXJlZC1pcCIsCi0gICJjc2hhcnAtaHNfY29tcGFjdF9mcmFtZWQtaXAiLAotICAiY3NoYXJwLWhzX2pzb25fYnVmZmVyZWQtaXAiLAotICAiY3NoYXJwLWhzX2pzb25fZnJhbWVkLWlwIiwKLSAgImNzaGFycC1qYXZhX2JpbmFyeV9idWZmZXJlZC1pcCIsCi0gICJjc2hhcnAtamF2YV9iaW5hcnlfYnVmZmVyZWQtaXAtc3NsIiwKLSAgImNzaGFycC1qYXZhX2JpbmFyeV9mcmFtZWQtZmFzdGZyYW1lZC1pcCIsCi0gICJjc2hhcnAtamF2YV9iaW5hcnlfZnJhbWVkLWZhc3RmcmFtZWQtaXAtc3NsIiwKLSAgImNzaGFycC1qYXZhX2JpbmFyeV9mcmFtZWQtaXAiLAotICAiY3NoYXJwLWphdmFfYmluYXJ5X2ZyYW1lZC1pcC1zc2wiLAotICAiY3NoYXJwLWphdmFfY29tcGFjdF9idWZmZXJlZC1pcCIsCi0gICJjc2hhcnAtamF2YV9jb21wYWN0X2J1ZmZlcmVkLWlwLXNzbCIsCi0gICJjc2hhcnAtamF2YV9jb21wYWN0X2ZyYW1lZC1mYXN0ZnJhbWVkLWlwIiwKLSAgImNzaGFycC1qYXZhX2NvbXBhY3RfZnJhbWVkLWZhc3RmcmFtZWQtaXAtc3NsIiwKLSAgImNzaGFycC1qYXZhX2NvbXBhY3RfZnJhbWVkLWlwIiwKLSAgImNzaGFycC1qYXZhX2NvbXBhY3RfZnJhbWVkLWlwLXNzbCIsCi0gICJjc2hhcnAtamF2YV9qc29uX2J1ZmZlcmVkLWlwIiwKLSAgImNzaGFycC1qYXZhX2pzb25fYnVmZmVyZWQtaXAtc3NsIiwKLSAgImNzaGFycC1qYXZhX2pzb25fZnJhbWVkLWZhc3RmcmFtZWQtaXAiLAotICAiY3NoYXJwLWphdmFfanNvbl9mcmFtZWQtZmFzdGZyYW1lZC1pcC1zc2wiLAotICAiY3NoYXJwLWphdmFfanNvbl9mcmFtZWQtaXAiLAotICAiY3NoYXJwLWphdmFfanNvbl9mcmFtZWQtaXAtc3NsIiwKLSAgImNzaGFycC1ub2RlanNfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKLSAgImNzaGFycC1ub2RlanNfYmluYXJ5X2J1ZmZlcmVkLWlwLXNzbCIsCi0gICJjc2hhcnAtbm9kZWpzX2JpbmFyeV9mcmFtZWQtaXAiLAotICAiY3NoYXJwLW5vZGVqc19iaW5hcnlfZnJhbWVkLWlwLXNzbCIsCi0gICJjc2hhcnAtbm9kZWpzX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAotICAiY3NoYXJwLW5vZGVqc19jb21wYWN0X2J1ZmZlcmVkLWlwLXNzbCIsCi0gICJjc2hhcnAtbm9kZWpzX2NvbXBhY3RfZnJhbWVkLWlwIiwKLSAgImNzaGFycC1ub2RlanNfY29tcGFjdF9mcmFtZWQtaXAtc3NsIiwKLSAgImNzaGFycC1ub2RlanNfanNvbl9idWZmZXJlZC1pcCIsCi0gICJjc2hhcnAtbm9kZWpzX2pzb25fYnVmZmVyZWQtaXAtc3NsIiwKLSAgImNzaGFycC1ub2RlanNfanNvbl9mcmFtZWQtaXAiLAotICAiY3NoYXJwLW5vZGVqc19qc29uX2ZyYW1lZC1pcC1zc2wiLAotICAiY3NoYXJwLXB5X2JpbmFyeS1hY2NlbF9idWZmZXJlZC1pcC1zc2wiLAotICAiY3NoYXJwLXB5X2JpbmFyeS1hY2NlbF9mcmFtZWQtaXAtc3NsIiwKLSAgImNzaGFycC1weV9iaW5hcnlfYnVmZmVyZWQtaXAtc3NsIiwKLSAgImNzaGFycC1weV9iaW5hcnlfZnJhbWVkLWlwLXNzbCIsCi0gICJjc2hhcnAtcHlfY29tcGFjdF9idWZmZXJlZC1pcC1zc2wiLAotICAiY3NoYXJwLXB5X2NvbXBhY3RfZnJhbWVkLWlwLXNzbCIsCi0gICJjc2hhcnAtcHlfanNvbl9idWZmZXJlZC1pcC1zc2wiLAotICAiY3NoYXJwLXB5X2pzb25fZnJhbWVkLWlwLXNzbCIsCi0gICJjc2hhcnAtcmJfYmluYXJ5LWFjY2VsX2J1ZmZlcmVkLWlwIiwKLSAgImNzaGFycC1yYl9iaW5hcnktYWNjZWxfZnJhbWVkLWlwIiwKLSAgImNzaGFycC1yYl9iaW5hcnlfYnVmZmVyZWQtaXAiLAotICAiY3NoYXJwLXJiX2JpbmFyeV9mcmFtZWQtaXAiLAotICAiY3NoYXJwLXJiX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAotICAiY3NoYXJwLXJiX2NvbXBhY3RfZnJhbWVkLWlwIiwKLSAgImNzaGFycC1yYl9qc29uX2J1ZmZlcmVkLWlwIiwKLSAgImNzaGFycC1yYl9qc29uX2ZyYW1lZC1pcCIsCi0gICJnby1jX2dsaWJfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKLSAgImdvLWNfZ2xpYl9iaW5hcnlfZnJhbWVkLWlwIiwKLSAgImdvLWNwcF9qc29uX2J1ZmZlcmVkLWlwIiwKLSAgImdvLWNwcF9qc29uX2J1ZmZlcmVkLWlwLXNzbCIsCi0gICJnby1jcHBfanNvbl9mcmFtZWQtaXAiLAotICAiZ28tY3BwX2pzb25fZnJhbWVkLWlwLXNzbCIsCi0gICJnby1jc2hhcnBfYmluYXJ5X2J1ZmZlcmVkLWlwLXNzbCIsCi0gICJnby1jc2hhcnBfYmluYXJ5X2ZyYW1lZC1pcC1zc2wiLAotICAiZ28tY3NoYXJwX2NvbXBhY3RfYnVmZmVyZWQtaXAtc3NsIiwKLSAgImdvLWNzaGFycF9jb21wYWN0X2ZyYW1lZC1pcC1zc2wiLAotICAiZ28tY3NoYXJwX2pzb25fYnVmZmVyZWQtaXAtc3NsIiwKLSAgImdvLWNzaGFycF9qc29uX2ZyYW1lZC1pcC1zc2wiLAotICAiZ28taHNfanNvbl9idWZmZXJlZC1pcCIsCi0gICJnby1oc19qc29uX2ZyYW1lZC1pcCIsCi0gICJnby1ub2RlanNfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKLSAgImdvLW5vZGVqc19iaW5hcnlfYnVmZmVyZWQtaXAtc3NsIiwKLSAgImdvLW5vZGVqc19iaW5hcnlfZnJhbWVkLWlwIiwKLSAgImdvLW5vZGVqc19iaW5hcnlfZnJhbWVkLWlwLXNzbCIsCi0gICJnby1ub2RlanNfY29tcGFjdF9idWZmZXJlZC1pcCIsCi0gICJnby1ub2RlanNfY29tcGFjdF9idWZmZXJlZC1pcC1zc2wiLAotICAiZ28tbm9kZWpzX2NvbXBhY3RfZnJhbWVkLWlwIiwKLSAgImdvLW5vZGVqc19jb21wYWN0X2ZyYW1lZC1pcC1zc2wiLAotICAiZ28tbm9kZWpzX2pzb25fYnVmZmVyZWQtaXAiLAotICAiZ28tbm9kZWpzX2pzb25fYnVmZmVyZWQtaXAtc3NsIiwKLSAgImdvLW5vZGVqc19qc29uX2ZyYW1lZC1pcCIsCi0gICJnby1ub2RlanNfanNvbl9mcmFtZWQtaXAtc3NsIiwKLSAgImdvLXBlcmxfYmluYXJ5X2J1ZmZlcmVkLWlwLXNzbCIsCi0gICJnby1wZXJsX2JpbmFyeV9mcmFtZWQtaXAtc3NsIiwKLSAgImdvLXJiX2pzb25fYnVmZmVyZWQtaXAiLAotICAiZ28tcmJfanNvbl9mcmFtZWQtaXAiLAotICAiaHMtY3BwX2pzb25fYnVmZmVyZWQtaXAiLAotICAiaHMtY3BwX2pzb25fZnJhbWVkLWlwIiwKKyAgImNwcC1qYXZhX211bHRpLWJpbmFyeV9odHRwLWlwIiwKKyAgImNwcC1qYXZhX211bHRpLWJpbmFyeV9odHRwLWlwLXNzbCIsCisgICJjcHAtamF2YV9tdWx0aV9odHRwLWlwIiwKKyAgImNwcC1qYXZhX211bHRpX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1qYXZhX211bHRpYy1jb21wYWN0X2h0dHAtaXAiLAorICAiY3BwLWphdmFfbXVsdGljLWNvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAiY3BwLWphdmFfbXVsdGljX2h0dHAtaXAiLAorICAiY3BwLWphdmFfbXVsdGljX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1qYXZhX211bHRpai1qc29uX2h0dHAtaXAiLAorICAiY3BwLWphdmFfbXVsdGlqLWpzb25faHR0cC1pcC1zc2wiLAorICAiY3BwLWphdmFfbXVsdGlqX2h0dHAtaXAiLAorICAiY3BwLWphdmFfbXVsdGlqX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1ub2RlanNfYmluYXJ5X2h0dHAtZG9tYWluIiwKKyAgImNwcC1ub2RlanNfYmluYXJ5X2h0dHAtaXAiLAorICAiY3BwLW5vZGVqc19iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAiY3BwLW5vZGVqc19jb21wYWN0X2h0dHAtZG9tYWluIiwKKyAgImNwcC1ub2RlanNfY29tcGFjdF9odHRwLWlwIiwKKyAgImNwcC1ub2RlanNfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJjcHAtbm9kZWpzX2pzb25faHR0cC1kb21haW4iLAorICAiY3BwLW5vZGVqc19qc29uX2h0dHAtaXAiLAorICAiY3BwLW5vZGVqc19qc29uX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1ub2RlanNfbXVsdGktYmluYXJ5X2h0dHAtZG9tYWluIiwKKyAgImNwcC1ub2RlanNfbXVsdGktYmluYXJ5X2h0dHAtaXAiLAorICAiY3BwLW5vZGVqc19tdWx0aS1iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAiY3BwLW5vZGVqc19tdWx0aWMtY29tcGFjdF9odHRwLWRvbWFpbiIsCisgICJjcHAtbm9kZWpzX211bHRpYy1jb21wYWN0X2h0dHAtaXAiLAorICAiY3BwLW5vZGVqc19tdWx0aWMtY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJjcHAtbm9kZWpzX211bHRpai1qc29uX2h0dHAtZG9tYWluIiwKKyAgImNwcC1ub2RlanNfbXVsdGlqLWpzb25faHR0cC1pcCIsCisgICJjcHAtbm9kZWpzX211bHRpai1qc29uX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weTNfYmluYXJ5LWFjY2VsX2h0dHAtaXAiLAorICAiY3BwLXB5M19iaW5hcnktYWNjZWxfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5M19iaW5hcnlfaHR0cC1pcCIsCisgICJjcHAtcHkzX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX2NvbXBhY3QtYWNjZWxjX2h0dHAtaXAiLAorICAiY3BwLXB5M19jb21wYWN0LWFjY2VsY19odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX2NvbXBhY3RfaHR0cC1pcCIsCisgICJjcHAtcHkzX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5M19oZWFkZXJfaHR0cC1pcCIsCisgICJjcHAtcHkzX2hlYWRlcl9odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX2pzb25faHR0cC1pcCIsCisgICJjcHAtcHkzX2pzb25faHR0cC1pcC1zc2wiLAorICAiY3BwLXB5M19tdWx0aS1hY2NlbF9odHRwLWlwIiwKKyAgImNwcC1weTNfbXVsdGktYWNjZWxfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5M19tdWx0aS1iaW5hcnlfaHR0cC1pcCIsCisgICJjcHAtcHkzX211bHRpLWJpbmFyeV9odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX211bHRpLW11bHRpYV9odHRwLWlwIiwKKyAgImNwcC1weTNfbXVsdGktbXVsdGlhX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weTNfbXVsdGlfaHR0cC1pcCIsCisgICJjcHAtcHkzX211bHRpX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weTNfbXVsdGljLWFjY2VsY19odHRwLWlwIiwKKyAgImNwcC1weTNfbXVsdGljLWFjY2VsY19odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX211bHRpYy1jb21wYWN0X2h0dHAtaXAiLAorICAiY3BwLXB5M19tdWx0aWMtY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX211bHRpYy1tdWx0aWFjX2h0dHAtaXAiLAorICAiY3BwLXB5M19tdWx0aWMtbXVsdGlhY19odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX211bHRpY19odHRwLWlwIiwKKyAgImNwcC1weTNfbXVsdGljX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weTNfbXVsdGloLWhlYWRlcl9odHRwLWlwIiwKKyAgImNwcC1weTNfbXVsdGloLWhlYWRlcl9odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX211bHRpai1qc29uX2h0dHAtaXAiLAorICAiY3BwLXB5M19tdWx0aWotanNvbl9odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX211bHRpal9odHRwLWlwIiwKKyAgImNwcC1weTNfbXVsdGlqX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9iaW5hcnktYWNjZWxfaHR0cC1pcCIsCisgICJjcHAtcHlfYmluYXJ5LWFjY2VsX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9iaW5hcnlfaHR0cC1pcCIsCisgICJjcHAtcHlfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9jb21wYWN0LWFjY2VsY19odHRwLWlwIiwKKyAgImNwcC1weV9jb21wYWN0LWFjY2VsY19odHRwLWlwLXNzbCIsCisgICJjcHAtcHlfY29tcGFjdF9odHRwLWlwIiwKKyAgImNwcC1weV9jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9oZWFkZXJfaHR0cC1pcCIsCisgICJjcHAtcHlfaGVhZGVyX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9qc29uX2h0dHAtaXAiLAorICAiY3BwLXB5X2pzb25faHR0cC1pcC1zc2wiLAorICAiY3BwLXB5X211bHRpLWFjY2VsX2h0dHAtaXAiLAorICAiY3BwLXB5X211bHRpLWFjY2VsX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9tdWx0aS1iaW5hcnlfaHR0cC1pcCIsCisgICJjcHAtcHlfbXVsdGktYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9tdWx0aS1tdWx0aWFfaHR0cC1pcCIsCisgICJjcHAtcHlfbXVsdGktbXVsdGlhX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9tdWx0aV9odHRwLWlwIiwKKyAgImNwcC1weV9tdWx0aV9odHRwLWlwLXNzbCIsCisgICJjcHAtcHlfbXVsdGljLWFjY2VsY19odHRwLWlwIiwKKyAgImNwcC1weV9tdWx0aWMtYWNjZWxjX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9tdWx0aWMtY29tcGFjdF9odHRwLWlwIiwKKyAgImNwcC1weV9tdWx0aWMtY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJjcHAtcHlfbXVsdGljLW11bHRpYWNfaHR0cC1pcCIsCisgICJjcHAtcHlfbXVsdGljLW11bHRpYWNfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5X211bHRpY19odHRwLWlwIiwKKyAgImNwcC1weV9tdWx0aWNfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5X211bHRpaC1oZWFkZXJfaHR0cC1pcCIsCisgICJjcHAtcHlfbXVsdGloLWhlYWRlcl9odHRwLWlwLXNzbCIsCisgICJjcHAtcHlfbXVsdGlqLWpzb25faHR0cC1pcCIsCisgICJjcHAtcHlfbXVsdGlqLWpzb25faHR0cC1pcC1zc2wiLAorICAiY3BwLXB5X211bHRpal9odHRwLWlwIiwKKyAgImNwcC1weV9tdWx0aWpfaHR0cC1pcC1zc2wiLAorICAiY3BwLXJzX211bHRpX2J1ZmZlcmVkLWlwIiwKKyAgImNwcC1yc19tdWx0aV9mcmFtZWQtaXAiLAorICAiY3BwLXJzX211bHRpY19idWZmZXJlZC1pcCIsCisgICJjcHAtcnNfbXVsdGljX2ZyYW1lZC1pcCIsCisgICJjc2hhcnAtcmJfYmluYXJ5LWFjY2VsX2J1ZmZlcmVkLWlwLXNzbCIsCisgICJjc2hhcnAtcmJfYmluYXJ5LWFjY2VsX2ZyYW1lZC1pcC1zc2wiLAorICAiY3NoYXJwLXJiX2JpbmFyeV9idWZmZXJlZC1pcC1zc2wiLAorICAiY3NoYXJwLXJiX2JpbmFyeV9mcmFtZWQtaXAtc3NsIiwKKyAgImNzaGFycC1yYl9jb21wYWN0X2J1ZmZlcmVkLWlwLXNzbCIsCisgICJjc2hhcnAtcmJfY29tcGFjdF9mcmFtZWQtaXAtc3NsIiwKKyAgImNzaGFycC1yYl9qc29uX2J1ZmZlcmVkLWlwLXNzbCIsCisgICJjc2hhcnAtcmJfanNvbl9mcmFtZWQtaXAtc3NsIiwKKyAgImQtY2xfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgImQtY2xfYmluYXJ5X2ZyYW1lZC1pcCIsCisgICJkLWNwcF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAiZC1jcHBfYmluYXJ5X2J1ZmZlcmVkLWlwLXNzbCIsCisgICJkLWNwcF9iaW5hcnlfZnJhbWVkLWlwIiwKKyAgImQtY3BwX2JpbmFyeV9mcmFtZWQtaXAtc3NsIiwKKyAgImQtY3BwX2JpbmFyeV9odHRwLWlwIiwKKyAgImQtY3BwX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJkLWNwcF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgImQtY3BwX2NvbXBhY3RfYnVmZmVyZWQtaXAtc3NsIiwKKyAgImQtY3BwX2NvbXBhY3RfZnJhbWVkLWlwIiwKKyAgImQtY3BwX2NvbXBhY3RfZnJhbWVkLWlwLXNzbCIsCisgICJkLWNwcF9jb21wYWN0X2h0dHAtaXAiLAorICAiZC1jcHBfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJkLWNwcF9qc29uX2J1ZmZlcmVkLWlwIiwKKyAgImQtY3BwX2pzb25fYnVmZmVyZWQtaXAtc3NsIiwKKyAgImQtY3BwX2pzb25fZnJhbWVkLWlwIiwKKyAgImQtY3BwX2pzb25fZnJhbWVkLWlwLXNzbCIsCisgICJkLWNwcF9qc29uX2h0dHAtaXAiLAorICAiZC1jcHBfanNvbl9odHRwLWlwLXNzbCIsCisgICJkLWRfYmluYXJ5X2h0dHAtaXAiLAorICAiZC1kX2NvbXBhY3RfaHR0cC1pcCIsCisgICJkLWRfanNvbl9odHRwLWlwIiwKKyAgImQtZGFydF9iaW5hcnlfaHR0cC1pcCIsCisgICJkLWRhcnRfY29tcGFjdF9odHRwLWlwIiwKKyAgImQtZGFydF9qc29uX2h0dHAtaXAiLAorICAiZC1nb19iaW5hcnlfaHR0cC1pcCIsCisgICJkLWdvX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJkLWdvX2NvbXBhY3RfaHR0cC1pcCIsCisgICJkLWdvX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAiZC1nb19qc29uX2h0dHAtaXAiLAorICAiZC1nb19qc29uX2h0dHAtaXAtc3NsIiwKKyAgImQtamF2YV9iaW5hcnlfaHR0cC1pcCIsCisgICJkLWphdmFfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgImQtamF2YV9jb21wYWN0X2h0dHAtaXAiLAorICAiZC1qYXZhX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAiZC1qYXZhX2pzb25faHR0cC1pcCIsCisgICJkLWphdmFfanNvbl9odHRwLWlwLXNzbCIsCisgICJkLWpzX2pzb25faHR0cC1pcCIsCisgICJkLW5vZGVqc19iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAiZC1ub2RlanNfYmluYXJ5X2J1ZmZlcmVkLWlwLXNzbCIsCisgICJkLW5vZGVqc19iaW5hcnlfZnJhbWVkLWlwIiwKKyAgImQtbm9kZWpzX2JpbmFyeV9mcmFtZWQtaXAtc3NsIiwKKyAgImQtbm9kZWpzX2JpbmFyeV9odHRwLWlwIiwKKyAgImQtbm9kZWpzX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJkLW5vZGVqc19jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgImQtbm9kZWpzX2NvbXBhY3RfYnVmZmVyZWQtaXAtc3NsIiwKKyAgImQtbm9kZWpzX2NvbXBhY3RfZnJhbWVkLWlwIiwKKyAgImQtbm9kZWpzX2NvbXBhY3RfZnJhbWVkLWlwLXNzbCIsCisgICJkLW5vZGVqc19jb21wYWN0X2h0dHAtaXAiLAorICAiZC1ub2RlanNfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJkLW5vZGVqc19qc29uX2J1ZmZlcmVkLWlwIiwKKyAgImQtbm9kZWpzX2pzb25fYnVmZmVyZWQtaXAtc3NsIiwKKyAgImQtbm9kZWpzX2pzb25fZnJhbWVkLWlwIiwKKyAgImQtbm9kZWpzX2pzb25fZnJhbWVkLWlwLXNzbCIsCisgICJkLW5vZGVqc19qc29uX2h0dHAtaXAiLAorICAiZC1ub2RlanNfanNvbl9odHRwLWlwLXNzbCIsCisgICJkLW5vZGV0c19iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAiZC1weTNfYmluYXJ5LWFjY2VsX2J1ZmZlcmVkLWlwIiwKKyAgImQtcHkzX2JpbmFyeS1hY2NlbF9idWZmZXJlZC1pcC1zc2wiLAorICAiZC1weTNfYmluYXJ5LWFjY2VsX2ZyYW1lZC1pcCIsCisgICJkLXB5M19iaW5hcnktYWNjZWxfZnJhbWVkLWlwLXNzbCIsCisgICJkLXB5M19iaW5hcnktYWNjZWxfaHR0cC1pcCIsCisgICJkLXB5M19iaW5hcnktYWNjZWxfaHR0cC1pcC1zc2wiLAorICAiZC1weTNfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgImQtcHkzX2JpbmFyeV9idWZmZXJlZC1pcC1zc2wiLAorICAiZC1weTNfYmluYXJ5X2ZyYW1lZC1pcCIsCisgICJkLXB5M19iaW5hcnlfZnJhbWVkLWlwLXNzbCIsCisgICJkLXB5M19iaW5hcnlfaHR0cC1pcCIsCisgICJkLXB5M19iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAiZC1weTNfY29tcGFjdC1hY2NlbGNfYnVmZmVyZWQtaXAiLAorICAiZC1weTNfY29tcGFjdC1hY2NlbGNfYnVmZmVyZWQtaXAtc3NsIiwKKyAgImQtcHkzX2NvbXBhY3QtYWNjZWxjX2ZyYW1lZC1pcCIsCisgICJkLXB5M19jb21wYWN0LWFjY2VsY19mcmFtZWQtaXAtc3NsIiwKKyAgImQtcHkzX2NvbXBhY3QtYWNjZWxjX2h0dHAtaXAiLAorICAiZC1weTNfY29tcGFjdC1hY2NlbGNfaHR0cC1pcC1zc2wiLAorICAiZC1weTNfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICJkLXB5M19jb21wYWN0X2J1ZmZlcmVkLWlwLXNzbCIsCisgICJkLXB5M19jb21wYWN0X2ZyYW1lZC1pcCIsCisgICJkLXB5M19jb21wYWN0X2ZyYW1lZC1pcC1zc2wiLAorICAiZC1weTNfY29tcGFjdF9odHRwLWlwIiwKKyAgImQtcHkzX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAiZC1weTNfanNvbl9idWZmZXJlZC1pcCIsCisgICJkLXB5M19qc29uX2J1ZmZlcmVkLWlwLXNzbCIsCisgICJkLXB5M19qc29uX2ZyYW1lZC1pcCIsCisgICJkLXB5M19qc29uX2ZyYW1lZC1pcC1zc2wiLAorICAiZC1weTNfanNvbl9odHRwLWlwIiwKKyAgImQtcHkzX2pzb25faHR0cC1pcC1zc2wiLAorICAiZC1weV9iaW5hcnktYWNjZWxfYnVmZmVyZWQtaXAiLAorICAiZC1weV9iaW5hcnktYWNjZWxfYnVmZmVyZWQtaXAtc3NsIiwKKyAgImQtcHlfYmluYXJ5LWFjY2VsX2ZyYW1lZC1pcCIsCisgICJkLXB5X2JpbmFyeS1hY2NlbF9mcmFtZWQtaXAtc3NsIiwKKyAgImQtcHlfYmluYXJ5LWFjY2VsX2h0dHAtaXAiLAorICAiZC1weV9iaW5hcnktYWNjZWxfaHR0cC1pcC1zc2wiLAorICAiZC1weV9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAiZC1weV9iaW5hcnlfYnVmZmVyZWQtaXAtc3NsIiwKKyAgImQtcHlfYmluYXJ5X2ZyYW1lZC1pcCIsCisgICJkLXB5X2JpbmFyeV9mcmFtZWQtaXAtc3NsIiwKKyAgImQtcHlfYmluYXJ5X2h0dHAtaXAiLAorICAiZC1weV9iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAiZC1weV9jb21wYWN0LWFjY2VsY19idWZmZXJlZC1pcCIsCisgICJkLXB5X2NvbXBhY3QtYWNjZWxjX2J1ZmZlcmVkLWlwLXNzbCIsCisgICJkLXB5X2NvbXBhY3QtYWNjZWxjX2ZyYW1lZC1pcCIsCisgICJkLXB5X2NvbXBhY3QtYWNjZWxjX2ZyYW1lZC1pcC1zc2wiLAorICAiZC1weV9jb21wYWN0LWFjY2VsY19odHRwLWlwIiwKKyAgImQtcHlfY29tcGFjdC1hY2NlbGNfaHR0cC1pcC1zc2wiLAorICAiZC1weV9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgImQtcHlfY29tcGFjdF9idWZmZXJlZC1pcC1zc2wiLAorICAiZC1weV9jb21wYWN0X2ZyYW1lZC1pcCIsCisgICJkLXB5X2NvbXBhY3RfZnJhbWVkLWlwLXNzbCIsCisgICJkLXB5X2NvbXBhY3RfaHR0cC1pcCIsCisgICJkLXB5X2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAiZC1weV9qc29uX2J1ZmZlcmVkLWlwIiwKKyAgImQtcHlfanNvbl9idWZmZXJlZC1pcC1zc2wiLAorICAiZC1weV9qc29uX2ZyYW1lZC1pcCIsCisgICJkLXB5X2pzb25fZnJhbWVkLWlwLXNzbCIsCisgICJkLXB5X2pzb25faHR0cC1pcCIsCisgICJkLXB5X2pzb25faHR0cC1pcC1zc2wiLAorICAiZXJsLWNwcF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAiZXJsLWNwcF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgImVybC1jc2hhcnBfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgImVybC1jc2hhcnBfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICJlcmwtbm9kZWpzX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICJlcmwtbm9kZWpzX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAiZXJsLW5vZGV0c19iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAiZXJsLXJiX2JpbmFyeS1hY2NlbF9idWZmZXJlZC1pcCIsCisgICJlcmwtcmJfYmluYXJ5LWFjY2VsX2J1ZmZlcmVkLWlwLXNzbCIsCisgICJlcmwtcmJfYmluYXJ5LWFjY2VsX2ZyYW1lZC1pcCIsCisgICJlcmwtcmJfYmluYXJ5LWFjY2VsX2ZyYW1lZC1pcC1zc2wiLAorICAiZXJsLXJiX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICJlcmwtcmJfYmluYXJ5X2J1ZmZlcmVkLWlwLXNzbCIsCisgICJlcmwtcmJfYmluYXJ5X2ZyYW1lZC1pcCIsCisgICJlcmwtcmJfYmluYXJ5X2ZyYW1lZC1pcC1zc2wiLAorICAiZXJsLXJiX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAiZXJsLXJiX2NvbXBhY3RfYnVmZmVyZWQtaXAtc3NsIiwKKyAgImVybC1yYl9jb21wYWN0X2ZyYW1lZC1pcCIsCisgICJlcmwtcmJfY29tcGFjdF9mcmFtZWQtaXAtc3NsIiwKKyAgImdvLWNwcF9iaW5hcnlfaHR0cC1pcCIsCisgICJnby1jcHBfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgImdvLWNwcF9jb21wYWN0X2h0dHAtaXAiLAorICAiZ28tY3BwX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAiZ28tY3BwX2pzb25faHR0cC1pcCIsCisgICJnby1jcHBfanNvbl9odHRwLWlwLXNzbCIsCisgICJnby1kX2JpbmFyeV9odHRwLWlwIiwKKyAgImdvLWRfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgImdvLWRfY29tcGFjdF9odHRwLWlwIiwKKyAgImdvLWRfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJnby1kX2pzb25faHR0cC1pcCIsCisgICJnby1kX2pzb25faHR0cC1pcC1zc2wiLAorICAiZ28tZGFydF9iaW5hcnlfaHR0cC1pcCIsCisgICJnby1kYXJ0X2NvbXBhY3RfaHR0cC1pcCIsCisgICJnby1kYXJ0X2pzb25faHR0cC1pcCIsCisgICJnby1qYXZhX2JpbmFyeV9odHRwLWlwIiwKKyAgImdvLWphdmFfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgImdvLWphdmFfY29tcGFjdF9odHRwLWlwIiwKKyAgImdvLWphdmFfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJnby1qYXZhX2pzb25faHR0cC1pcCIsCisgICJnby1qYXZhX2pzb25faHR0cC1pcC1zc2wiLAorICAiZ28tcHkzX2JpbmFyeS1hY2NlbF96bGliLWlwLXNzbCIsCisgICJnby1weTNfY29tcGFjdC1hY2NlbGNfemxpYi1pcC1zc2wiLAorICAiZ28tcHlfYmluYXJ5LWFjY2VsX3psaWItaXAtc3NsIiwKKyAgImdvLXB5X2NvbXBhY3QtYWNjZWxjX3psaWItaXAtc3NsIiwKKyAgImhzLWNzaGFycF9iaW5hcnlfYnVmZmVyZWQtaXAiLAogICAiaHMtY3NoYXJwX2JpbmFyeV9mcmFtZWQtaXAiLAorICAiaHMtY3NoYXJwX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAogICAiaHMtY3NoYXJwX2NvbXBhY3RfZnJhbWVkLWlwIiwKLSAgImhzLWNzaGFycF9qc29uX2J1ZmZlcmVkLWlwIiwKLSAgImhzLWNzaGFycF9qc29uX2ZyYW1lZC1pcCIsCi0gICJocy1nb19iaW5hcnlfYnVmZmVyZWQtaXAiLAotICAiaHMtZ29fYmluYXJ5X2ZyYW1lZC1pcCIsCi0gICJocy1nb19jb21wYWN0X2J1ZmZlcmVkLWlwIiwKLSAgImhzLWdvX2NvbXBhY3RfZnJhbWVkLWlwIiwKLSAgImhzLWdvX2pzb25fYnVmZmVyZWQtaXAiLAotICAiaHMtZ29fanNvbl9mcmFtZWQtaXAiLAotICAiaHMtbm9kZWpzX2JpbmFyeV9idWZmZXJlZC1pcCIsCi0gICJocy1ub2RlanNfYmluYXJ5X2ZyYW1lZC1pcCIsCi0gICJocy1ub2RlanNfY29tcGFjdF9idWZmZXJlZC1pcCIsCi0gICJocy1ub2RlanNfY29tcGFjdF9mcmFtZWQtaXAiLAotICAiaHMtbm9kZWpzX2pzb25fYnVmZmVyZWQtaXAiLAotICAiaHMtbm9kZWpzX2pzb25fZnJhbWVkLWlwIiwKLSAgImhzLXB5X2pzb25fYnVmZmVyZWQtaXAiLAotICAiaHMtcHlfanNvbl9mcmFtZWQtaXAiLAotICAiaHMtcmJfanNvbl9idWZmZXJlZC1pcCIsCi0gICJocy1yYl9qc29uX2ZyYW1lZC1pcCIsCi0gICJqYXZhLWNzaGFycF9iaW5hcnlfYnVmZmVyZWQtaXAtc3NsIiwKLSAgImphdmEtY3NoYXJwX2JpbmFyeV9mYXN0ZnJhbWVkLWZyYW1lZC1pcC1zc2wiLAotICAiamF2YS1jc2hhcnBfYmluYXJ5X2ZyYW1lZC1pcC1zc2wiLAotICAiamF2YS1jc2hhcnBfY29tcGFjdF9idWZmZXJlZC1pcC1zc2wiLAotICAiamF2YS1jc2hhcnBfY29tcGFjdF9mYXN0ZnJhbWVkLWZyYW1lZC1pcC1zc2wiLAotICAiamF2YS1jc2hhcnBfY29tcGFjdF9mcmFtZWQtaXAtc3NsIiwKLSAgImphdmEtY3NoYXJwX2pzb25fYnVmZmVyZWQtaXAtc3NsIiwKLSAgImphdmEtY3NoYXJwX2pzb25fZmFzdGZyYW1lZC1mcmFtZWQtaXAtc3NsIiwKLSAgImphdmEtY3NoYXJwX2pzb25fZnJhbWVkLWlwLXNzbCIsCi0gICJqYXZhLWhzX2pzb25fYnVmZmVyZWQtaXAiLAotICAiamF2YS1oc19qc29uX2Zhc3RmcmFtZWQtZnJhbWVkLWlwIiwKLSAgImphdmEtaHNfanNvbl9mcmFtZWQtaXAiLAotICAiamF2YS1ub2RlanNfanNvbl9idWZmZXJlZC1pcCIsCi0gICJqYXZhLW5vZGVqc19qc29uX2J1ZmZlcmVkLWlwLXNzbCIsCi0gICJqYXZhLXJiX2pzb25fYnVmZmVyZWQtaXAiLAotICAiamF2YS1yYl9qc29uX2Zhc3RmcmFtZWQtZnJhbWVkLWlwIiwKLSAgImphdmEtcmJfanNvbl9mcmFtZWQtaXAiLAotICAibm9kZWpzLWNfZ2xpYl9iaW5hcnlfYnVmZmVyZWQtaXAiLAotICAibm9kZWpzLWNfZ2xpYl9iaW5hcnlfZnJhbWVkLWlwIiwKLSAgIm5vZGVqcy1jcHBfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKLSAgIm5vZGVqcy1jcHBfYmluYXJ5X2J1ZmZlcmVkLWlwLXNzbCIsCi0gICJub2RlanMtY3BwX2JpbmFyeV9mcmFtZWQtaXAiLAotICAibm9kZWpzLWNwcF9iaW5hcnlfZnJhbWVkLWlwLXNzbCIsCi0gICJub2RlanMtY3BwX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAotICAibm9kZWpzLWNwcF9jb21wYWN0X2J1ZmZlcmVkLWlwLXNzbCIsCi0gICJub2RlanMtY3BwX2NvbXBhY3RfZnJhbWVkLWlwIiwKLSAgIm5vZGVqcy1jcHBfY29tcGFjdF9mcmFtZWQtaXAtc3NsIiwKLSAgIm5vZGVqcy1jcHBfanNvbl9idWZmZXJlZC1pcCIsCisgICJub2RlanMtY3BwX2JpbmFyeV9odHRwLWRvbWFpbiIsCisgICJub2RlanMtY3BwX2JpbmFyeV9odHRwLWlwIiwKKyAgIm5vZGVqcy1jcHBfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1jcHBfY29tcGFjdF9odHRwLWRvbWFpbiIsCisgICJub2RlanMtY3BwX2NvbXBhY3RfaHR0cC1pcCIsCisgICJub2RlanMtY3BwX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAogICAibm9kZWpzLWNwcF9qc29uX2J1ZmZlcmVkLWlwLXNzbCIsCi0gICJub2RlanMtY3BwX2pzb25fZnJhbWVkLWlwIiwKLSAgIm5vZGVqcy1jcHBfanNvbl9mcmFtZWQtaXAtc3NsIiwKLSAgIm5vZGVqcy1jc2hhcnBfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKLSAgIm5vZGVqcy1jc2hhcnBfYmluYXJ5X2J1ZmZlcmVkLWlwLXNzbCIsCi0gICJub2RlanMtY3NoYXJwX2JpbmFyeV9mcmFtZWQtaXAiLAotICAibm9kZWpzLWNzaGFycF9iaW5hcnlfZnJhbWVkLWlwLXNzbCIsCi0gICJub2RlanMtY3NoYXJwX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAotICAibm9kZWpzLWNzaGFycF9jb21wYWN0X2J1ZmZlcmVkLWlwLXNzbCIsCi0gICJub2RlanMtY3NoYXJwX2NvbXBhY3RfZnJhbWVkLWlwIiwKLSAgIm5vZGVqcy1jc2hhcnBfY29tcGFjdF9mcmFtZWQtaXAtc3NsIiwKLSAgIm5vZGVqcy1jc2hhcnBfanNvbl9idWZmZXJlZC1pcCIsCi0gICJub2RlanMtY3NoYXJwX2pzb25fYnVmZmVyZWQtaXAtc3NsIiwKLSAgIm5vZGVqcy1jc2hhcnBfanNvbl9mcmFtZWQtaXAiLAotICAibm9kZWpzLWNzaGFycF9qc29uX2ZyYW1lZC1pcC1zc2wiLAotICAibm9kZWpzLWhzX2JpbmFyeV9idWZmZXJlZC1pcCIsCi0gICJub2RlanMtaHNfYmluYXJ5X2ZyYW1lZC1pcCIsCi0gICJub2RlanMtaHNfY29tcGFjdF9idWZmZXJlZC1pcCIsCi0gICJub2RlanMtaHNfY29tcGFjdF9mcmFtZWQtaXAiLAotICAibm9kZWpzLWhzX2pzb25fYnVmZmVyZWQtaXAiLAotICAibm9kZWpzLWhzX2pzb25fZnJhbWVkLWlwIiwKLSAgIm5vZGVqcy1qYXZhX2pzb25fYnVmZmVyZWQtaXAtc3NsIiwKLSAgIm5vZGVqcy1weV9iaW5hcnktYWNjZWxfYnVmZmVyZWQtaXAiLAotICAibm9kZWpzLXB5X2JpbmFyeS1hY2NlbF9idWZmZXJlZC1pcC1zc2wiLAotICAibm9kZWpzLXB5X2JpbmFyeS1hY2NlbF9mcmFtZWQtaXAiLAotICAibm9kZWpzLXB5X2JpbmFyeS1hY2NlbF9mcmFtZWQtaXAtc3NsIiwKLSAgIm5vZGVqcy1weV9iaW5hcnlfYnVmZmVyZWQtaXAiLAotICAibm9kZWpzLXB5X2JpbmFyeV9idWZmZXJlZC1pcC1zc2wiLAotICAibm9kZWpzLXB5X2JpbmFyeV9mcmFtZWQtaXAiLAotICAibm9kZWpzLXB5X2JpbmFyeV9mcmFtZWQtaXAtc3NsIiwKLSAgIm5vZGVqcy1weV9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKLSAgIm5vZGVqcy1weV9jb21wYWN0X2J1ZmZlcmVkLWlwLXNzbCIsCi0gICJub2RlanMtcHlfY29tcGFjdF9mcmFtZWQtaXAiLAotICAibm9kZWpzLXB5X2NvbXBhY3RfZnJhbWVkLWlwLXNzbCIsCi0gICJub2RlanMtcHlfanNvbl9idWZmZXJlZC1pcCIsCi0gICJub2RlanMtcHlfanNvbl9idWZmZXJlZC1pcC1zc2wiLAotICAibm9kZWpzLXB5X2pzb25fZnJhbWVkLWlwIiwKLSAgIm5vZGVqcy1weV9qc29uX2ZyYW1lZC1pcC1zc2wiLAotICAibm9kZWpzLXJiX2JpbmFyeS1hY2NlbF9idWZmZXJlZC1pcCIsCi0gICJub2RlanMtcmJfYmluYXJ5LWFjY2VsX2ZyYW1lZC1pcCIsCi0gICJub2RlanMtcmJfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKLSAgIm5vZGVqcy1yYl9iaW5hcnlfZnJhbWVkLWlwIiwKLSAgIm5vZGVqcy1yYl9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKLSAgIm5vZGVqcy1yYl9jb21wYWN0X2ZyYW1lZC1pcCIsCi0gICJub2RlanMtcmJfanNvbl9idWZmZXJlZC1pcCIsCi0gICJub2RlanMtcmJfanNvbl9mcmFtZWQtaXAiLAotICAicGVybC1waHBfYmluYXJ5X2ZyYW1lZC1pcCIsCi0gICJweS1jc2hhcnBfYWNjZWwtYmluYXJ5X2J1ZmZlcmVkLWlwLXNzbCIsCi0gICJweS1jc2hhcnBfYWNjZWwtYmluYXJ5X2ZyYW1lZC1pcC1zc2wiLAotICAicHktY3NoYXJwX2JpbmFyeV9idWZmZXJlZC1pcC1zc2wiLAotICAicHktY3NoYXJwX2JpbmFyeV9mcmFtZWQtaXAtc3NsIiwKLSAgInB5LWNzaGFycF9jb21wYWN0X2J1ZmZlcmVkLWlwLXNzbCIsCi0gICJweS1jc2hhcnBfY29tcGFjdF9mcmFtZWQtaXAtc3NsIiwKLSAgInB5LWNzaGFycF9qc29uX2J1ZmZlcmVkLWlwLXNzbCIsCi0gICJweS1jc2hhcnBfanNvbl9mcmFtZWQtaXAtc3NsIiwKLSAgInB5LWhzX2pzb25fYnVmZmVyZWQtaXAiLAotICAicHktaHNfanNvbl9mcmFtZWQtaXAiLAotICAicHktbm9kZWpzX2pzb25fYnVmZmVyZWQtaXAiLAotICAicHktbm9kZWpzX2pzb25fYnVmZmVyZWQtaXAtc3NsIiwKLSAgInB5LW5vZGVqc19qc29uX2ZyYW1lZC1pcCIsCi0gICJweS1ub2RlanNfanNvbl9mcmFtZWQtaXAtc3NsIiwKLSAgInB5LXJiX2FjY2VsLWJpbmFyeV9idWZmZXJlZC1pcCIsCi0gICJweS1yYl9hY2NlbC1iaW5hcnlfZnJhbWVkLWlwIiwKLSAgInB5LXJiX2FjY2VsX2J1ZmZlcmVkLWlwIiwKLSAgInB5LXJiX2FjY2VsX2ZyYW1lZC1pcCIsCi0gICJweS1yYl9iaW5hcnktYWNjZWxfYnVmZmVyZWQtaXAiLAotICAicHktcmJfYmluYXJ5LWFjY2VsX2ZyYW1lZC1pcCIsCi0gICJweS1yYl9iaW5hcnlfYnVmZmVyZWQtaXAiLAotICAicHktcmJfYmluYXJ5X2ZyYW1lZC1pcCIsCi0gICJweS1yYl9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKLSAgInB5LXJiX2NvbXBhY3RfZnJhbWVkLWlwIiwKLSAgInB5LXJiX2pzb25fYnVmZmVyZWQtaXAiLAotICAicHktcmJfanNvbl9mcmFtZWQtaXAiLAotICAicmItY19nbGliX2FjY2VsLWJpbmFyeV9idWZmZXJlZC1pcCIsCi0gICJyYi1jX2dsaWJfYWNjZWwtYmluYXJ5X2ZyYW1lZC1pcCIsCi0gICJyYi1jX2dsaWJfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKLSAgInJiLWNfZ2xpYl9iaW5hcnlfZnJhbWVkLWlwIiwKKyAgIm5vZGVqcy1jcHBfanNvbl9odHRwLWRvbWFpbiIsCisgICJub2RlanMtY3BwX2pzb25faHR0cC1pcCIsCisgICJub2RlanMtY3BwX2pzb25faHR0cC1pcC1zc2wiLAorICAibm9kZWpzLWRfYmluYXJ5X2h0dHAtaXAiLAorICAibm9kZWpzLWRfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1kX2NvbXBhY3RfaHR0cC1pcCIsCisgICJub2RlanMtZF9jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1kX2pzb25faHR0cC1pcCIsCisgICJub2RlanMtZF9qc29uX2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1kYXJ0X2JpbmFyeV9odHRwLWlwIiwKKyAgIm5vZGVqcy1kYXJ0X2NvbXBhY3RfaHR0cC1pcCIsCisgICJub2RlanMtZGFydF9qc29uX2h0dHAtaXAiLAorICAibm9kZWpzLWdvX2JpbmFyeV9odHRwLWlwIiwKKyAgIm5vZGVqcy1nb19iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAibm9kZWpzLWdvX2NvbXBhY3RfaHR0cC1pcCIsCisgICJub2RlanMtZ29fY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJub2RlanMtZ29fanNvbl9odHRwLWlwIiwKKyAgIm5vZGVqcy1nb19qc29uX2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1oc19iaW5hcnlfaHR0cC1pcCIsCisgICJub2RlanMtaHNfY29tcGFjdF9odHRwLWlwIiwKKyAgIm5vZGVqcy1oc19qc29uX2h0dHAtaXAiLAorICAibm9kZWpzLWphdmFfYmluYXJ5X2h0dHAtaXAiLAorICAibm9kZWpzLWphdmFfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1qYXZhX2NvbXBhY3RfaHR0cC1pcCIsCisgICJub2RlanMtamF2YV9jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1qYXZhX2pzb25faHR0cC1pcCIsCisgICJub2RlanMtamF2YV9qc29uX2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1qc19qc29uX2h0dHAtaXAiLAorICAibm9kZWpzLWx1YV9iaW5hcnlfaHR0cC1pcCIsCisgICJub2RlanMtbHVhX2NvbXBhY3RfaHR0cC1pcCIsCisgICJub2RlanMtbHVhX2pzb25faHR0cC1pcCIsCisgICJub2RlanMtcHkzX2JpbmFyeS1hY2NlbF9odHRwLWlwIiwKKyAgIm5vZGVqcy1weTNfYmluYXJ5LWFjY2VsX2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1weTNfYmluYXJ5X2h0dHAtaXAiLAorICAibm9kZWpzLXB5M19iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAibm9kZWpzLXB5M19jb21wYWN0LWFjY2VsY19odHRwLWlwIiwKKyAgIm5vZGVqcy1weTNfY29tcGFjdC1hY2NlbGNfaHR0cC1pcC1zc2wiLAorICAibm9kZWpzLXB5M19jb21wYWN0X2h0dHAtaXAiLAorICAibm9kZWpzLXB5M19jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1weTNfanNvbl9odHRwLWlwIiwKKyAgIm5vZGVqcy1weTNfanNvbl9odHRwLWlwLXNzbCIsCisgICJub2RlanMtcHlfYmluYXJ5LWFjY2VsX2h0dHAtaXAiLAorICAibm9kZWpzLXB5X2JpbmFyeS1hY2NlbF9odHRwLWlwLXNzbCIsCisgICJub2RlanMtcHlfYmluYXJ5X2h0dHAtaXAiLAorICAibm9kZWpzLXB5X2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJub2RlanMtcHlfY29tcGFjdC1hY2NlbGNfaHR0cC1pcCIsCisgICJub2RlanMtcHlfY29tcGFjdC1hY2NlbGNfaHR0cC1pcC1zc2wiLAorICAibm9kZWpzLXB5X2NvbXBhY3RfaHR0cC1pcCIsCisgICJub2RlanMtcHlfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJub2RlanMtcHlfanNvbl9odHRwLWlwIiwKKyAgIm5vZGVqcy1weV9qc29uX2h0dHAtaXAtc3NsIiwKKyAgInBlcmwtcnNfbXVsdGlfYnVmZmVyZWQtaXAiLAorICAicGVybC1yc19tdWx0aV9mcmFtZWQtaXAiLAorICAicHktY3BwX2FjY2VsLWJpbmFyeV9odHRwLWlwIiwKKyAgInB5LWNwcF9hY2NlbC1iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAicHktY3BwX2FjY2VsLWJpbmFyeV96bGliLWlwIiwKKyAgInB5LWNwcF9hY2NlbC1iaW5hcnlfemxpYi1pcC1zc2wiLAorICAicHktY3BwX2FjY2VsYy1jb21wYWN0X2h0dHAtaXAiLAorICAicHktY3BwX2FjY2VsYy1jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgInB5LWNwcF9hY2NlbGMtY29tcGFjdF96bGliLWlwIiwKKyAgInB5LWNwcF9hY2NlbGMtY29tcGFjdF96bGliLWlwLXNzbCIsCisgICJweS1jcHBfYmluYXJ5X2h0dHAtaXAiLAorICAicHktY3BwX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJweS1jcHBfY29tcGFjdF9odHRwLWlwIiwKKyAgInB5LWNwcF9jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgInB5LWNwcF9oZWFkZXJfaHR0cC1pcCIsCisgICJweS1jcHBfaGVhZGVyX2h0dHAtaXAtc3NsIiwKKyAgInB5LWNwcF9qc29uX2h0dHAtaXAiLAorICAicHktY3BwX2pzb25faHR0cC1pcC1zc2wiLAorICAicHktZF9hY2NlbC1iaW5hcnlfaHR0cC1pcCIsCisgICJweS1kX2FjY2VsLWJpbmFyeV9odHRwLWlwLXNzbCIsCisgICJweS1kX2FjY2VsYy1jb21wYWN0X2h0dHAtaXAiLAorICAicHktZF9hY2NlbGMtY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJweS1kX2JpbmFyeV9odHRwLWlwIiwKKyAgInB5LWRfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgInB5LWRfY29tcGFjdF9odHRwLWlwIiwKKyAgInB5LWRfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJweS1kX2pzb25faHR0cC1pcCIsCisgICJweS1kX2pzb25faHR0cC1pcC1zc2wiLAorICAicHktZGFydF9hY2NlbC1iaW5hcnlfaHR0cC1pcCIsCisgICJweS1kYXJ0X2FjY2VsYy1jb21wYWN0X2h0dHAtaXAiLAorICAicHktZGFydF9iaW5hcnlfaHR0cC1pcCIsCisgICJweS1kYXJ0X2NvbXBhY3RfaHR0cC1pcCIsCisgICJweS1kYXJ0X2pzb25faHR0cC1pcCIsCisgICJweS1oc19hY2NlbC1iaW5hcnlfaHR0cC1pcCIsCisgICJweS1oc19hY2NlbGMtY29tcGFjdF9odHRwLWlwIiwKKyAgInB5LWhzX2JpbmFyeV9odHRwLWlwIiwKKyAgInB5LWhzX2NvbXBhY3RfaHR0cC1pcCIsCisgICJweS1oc19oZWFkZXJfaHR0cC1pcCIsCisgICJweS1oc19qc29uX2h0dHAtaXAiLAorICAicHktamF2YV9hY2NlbC1iaW5hcnlfaHR0cC1pcCIsCisgICJweS1qYXZhX2FjY2VsLWJpbmFyeV9odHRwLWlwLXNzbCIsCisgICJweS1qYXZhX2FjY2VsYy1jb21wYWN0X2h0dHAtaXAiLAorICAicHktamF2YV9hY2NlbGMtY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJweS1qYXZhX2JpbmFyeV9odHRwLWlwIiwKKyAgInB5LWphdmFfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgInB5LWphdmFfY29tcGFjdF9odHRwLWlwIiwKKyAgInB5LWphdmFfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJweS1qYXZhX2pzb25faHR0cC1pcCIsCisgICJweS1qYXZhX2pzb25faHR0cC1pcC1zc2wiLAorICAicHktbHVhX2FjY2VsLWJpbmFyeV9odHRwLWlwIiwKKyAgInB5LWx1YV9hY2NlbGMtY29tcGFjdF9odHRwLWlwIiwKKyAgInB5LWx1YV9iaW5hcnlfaHR0cC1pcCIsCisgICJweS1sdWFfY29tcGFjdF9odHRwLWlwIiwKKyAgInB5LWx1YV9qc29uX2h0dHAtaXAiLAorICAicHkzLWNwcF9hY2NlbC1iaW5hcnlfaHR0cC1pcCIsCisgICJweTMtY3BwX2FjY2VsLWJpbmFyeV9odHRwLWlwLXNzbCIsCisgICJweTMtY3BwX2FjY2VsLWJpbmFyeV96bGliLWlwIiwKKyAgInB5My1jcHBfYWNjZWwtYmluYXJ5X3psaWItaXAtc3NsIiwKKyAgInB5My1jcHBfYWNjZWxjLWNvbXBhY3RfaHR0cC1pcCIsCisgICJweTMtY3BwX2FjY2VsYy1jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgInB5My1jcHBfYWNjZWxjLWNvbXBhY3RfemxpYi1pcCIsCisgICJweTMtY3BwX2FjY2VsYy1jb21wYWN0X3psaWItaXAtc3NsIiwKKyAgInB5My1jcHBfYmluYXJ5X2h0dHAtaXAiLAorICAicHkzLWNwcF9iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAicHkzLWNwcF9jb21wYWN0X2h0dHAtaXAiLAorICAicHkzLWNwcF9jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgInB5My1jcHBfaGVhZGVyX2h0dHAtaXAiLAorICAicHkzLWNwcF9oZWFkZXJfaHR0cC1pcC1zc2wiLAorICAicHkzLWNwcF9qc29uX2h0dHAtaXAiLAorICAicHkzLWNwcF9qc29uX2h0dHAtaXAtc3NsIiwKKyAgInB5My1kX2FjY2VsLWJpbmFyeV9odHRwLWlwIiwKKyAgInB5My1kX2FjY2VsLWJpbmFyeV9odHRwLWlwLXNzbCIsCisgICJweTMtZF9hY2NlbGMtY29tcGFjdF9odHRwLWlwIiwKKyAgInB5My1kX2FjY2VsYy1jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgInB5My1kX2JpbmFyeV9odHRwLWlwIiwKKyAgInB5My1kX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJweTMtZF9jb21wYWN0X2h0dHAtaXAiLAorICAicHkzLWRfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJweTMtZF9qc29uX2h0dHAtaXAiLAorICAicHkzLWRfanNvbl9odHRwLWlwLXNzbCIsCisgICJweTMtZGFydF9hY2NlbC1iaW5hcnlfaHR0cC1pcCIsCisgICJweTMtZGFydF9hY2NlbGMtY29tcGFjdF9odHRwLWlwIiwKKyAgInB5My1kYXJ0X2JpbmFyeV9odHRwLWlwIiwKKyAgInB5My1kYXJ0X2NvbXBhY3RfaHR0cC1pcCIsCisgICJweTMtZGFydF9qc29uX2h0dHAtaXAiLAorICAicHkzLWhzX2FjY2VsLWJpbmFyeV9odHRwLWlwIiwKKyAgInB5My1oc19hY2NlbGMtY29tcGFjdF9odHRwLWlwIiwKKyAgInB5My1oc19iaW5hcnlfaHR0cC1pcCIsCisgICJweTMtaHNfY29tcGFjdF9odHRwLWlwIiwKKyAgInB5My1oc19oZWFkZXJfaHR0cC1pcCIsCisgICJweTMtaHNfanNvbl9odHRwLWlwIiwKKyAgInB5My1qYXZhX2FjY2VsLWJpbmFyeV9odHRwLWlwIiwKKyAgInB5My1qYXZhX2FjY2VsLWJpbmFyeV9odHRwLWlwLXNzbCIsCisgICJweTMtamF2YV9hY2NlbGMtY29tcGFjdF9odHRwLWlwIiwKKyAgInB5My1qYXZhX2FjY2VsYy1jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgInB5My1qYXZhX2JpbmFyeV9odHRwLWlwIiwKKyAgInB5My1qYXZhX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJweTMtamF2YV9jb21wYWN0X2h0dHAtaXAiLAorICAicHkzLWphdmFfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJweTMtamF2YV9qc29uX2h0dHAtaXAiLAorICAicHkzLWphdmFfanNvbl9odHRwLWlwLXNzbCIsCisgICJweTMtbHVhX2FjY2VsLWJpbmFyeV9odHRwLWlwIiwKKyAgInB5My1sdWFfYWNjZWxjLWNvbXBhY3RfaHR0cC1pcCIsCisgICJweTMtbHVhX2JpbmFyeV9odHRwLWlwIiwKKyAgInB5My1sdWFfY29tcGFjdF9odHRwLWlwIiwKKyAgInB5My1sdWFfanNvbl9odHRwLWlwIiwKKyAgInJiLWNwcF9qc29uX2J1ZmZlcmVkLWRvbWFpbiIsCiAgICJyYi1jcHBfanNvbl9idWZmZXJlZC1pcCIsCisgICJyYi1jcHBfanNvbl9idWZmZXJlZC1pcC1zc2wiLAorICAicmItY3BwX2pzb25fZnJhbWVkLWRvbWFpbiIsCiAgICJyYi1jcHBfanNvbl9mcmFtZWQtaXAiLAotICAicmItY3NoYXJwX2pzb25fYnVmZmVyZWQtaXAiLAotICAicmItY3NoYXJwX2pzb25fZnJhbWVkLWlwIiwKLSAgInJiLWhzX2pzb25fYnVmZmVyZWQtaXAiLAotICAicmItaHNfanNvbl9mcmFtZWQtaXAiLAotICAicmItbm9kZWpzX2pzb25fYnVmZmVyZWQtaXAiLAotICAicmItbm9kZWpzX2pzb25fZnJhbWVkLWlwIiwKLSAgInJiLXJiX2pzb25fYnVmZmVyZWQtaXAiLAotICAicmItcmJfanNvbl9mcmFtZWQtaXAiCi1dCisgICJyYi1jcHBfanNvbl9mcmFtZWQtaXAtc3NsIgorXQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvbHVhL01ha2VmaWxlLmFtIGIvdGVzdC9sdWEvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ4YzVhZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbHVhL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMzEgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitUSFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAorCisjIFJlbW92ZSAiTWFwVHlwZSA9IiBsaW5lIHRvIGlnbm9yZSBzb21lIG1hcCBidWcgZm9yIG5vdworc3R1YnM6IC4uL1RocmlmdFRlc3QudGhyaWZ0ICQoVEhSSUZUKQorCSQoVEhSSUZUKSAtLWdlbiBsdWEgJDwKKwkkKFNFRCkgLWkuYmFrICdzL01hcFR5cGUgPS8vZycgZ2VuLWx1YS9UaHJpZnRUZXN0X3R0eXBlcy5sdWEKKwkkKFJNKSBnZW4tbHVhL1RocmlmdFRlc3RfdHR5cGVzLmx1YS5iYWsKKworcHJlY3Jvc3M6IHN0dWJzCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIGdlbi1sdWEKZGlmZiAtLWdpdCBhL3Rlc3QvbHVhL3Rlc3RfYmFzaWNfY2xpZW50Lmx1YSBiL3Rlc3QvbHVhL3Rlc3RfYmFzaWNfY2xpZW50Lmx1YQppbmRleCBlNzU3MWY5Li43N2Q4ZDA3IDEwMDY0NAotLS0gYS90ZXN0L2x1YS90ZXN0X2Jhc2ljX2NsaWVudC5sdWEKKysrIGIvdGVzdC9sdWEvdGVzdF9iYXNpY19jbGllbnQubHVhCkBAIC0xLDIyICsxLDI3IEBACi0tLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0tLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0tLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0tLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0tLSB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCistLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCiAKIAogcmVxdWlyZSgnVFNvY2tldCcpCityZXF1aXJlKCdUQnVmZmVyZWRUcmFuc3BvcnQnKQorcmVxdWlyZSgnVEZyYW1lZFRyYW5zcG9ydCcpCityZXF1aXJlKCdUSHR0cFRyYW5zcG9ydCcpCityZXF1aXJlKCdUQ29tcGFjdFByb3RvY29sJykKK3JlcXVpcmUoJ1RKc29uUHJvdG9jb2wnKQogcmVxdWlyZSgnVEJpbmFyeVByb3RvY29sJykKIHJlcXVpcmUoJ1RocmlmdFRlc3RfVGhyaWZ0VGVzdCcpCiByZXF1aXJlKCdsaWJsdWFsb25nbnVtYmVyJykKQEAgLTI1LDI3ICszMCw1OCBAQAogCiBmdW5jdGlvbiB0ZWFyZG93bigpCiAgIGlmIGNsaWVudCB0aGVuCi0gICAgLS0gU2h1dHMgZG93biB0aGUgc2VydmVyCi0gICAgY2xpZW50OnRlc3RWb2lkKCkKLQogICAgIC0tIGNsb3NlIHRoZSBjb25uZWN0aW9uCiAgICAgY2xpZW50OmNsb3NlKCkKICAgZW5kCiBlbmQKIAorZnVuY3Rpb24gcGFyc2VBcmdzKHJhd0FyZ3MpCisgIGxvY2FsIG9wdCA9IHsKKyAgICBwcm90b2NvbD0nYmluYXJ5JywKKyAgICB0cmFuc3BvcnQ9J2J1ZmZlcmVkJywKKyAgICBwb3J0PSc5MDkwJywKKyAgfQorICBmb3IgaSwgc3RyIGluIHBhaXJzKHJhd0FyZ3MpIGRvCisgICAgaWYgaSA+IDAgdGhlbgorICAgICAgaywgdiA9IHN0cmluZy5tYXRjaChzdHIsICctLSgldyspPSgldyspJykKKyAgICAgIGFzc2VydChvcHRba10gfj0gbmlsLCAnVW5rbm93biBhcmd1bWVudCcpCisgICAgICBvcHRba10gPSB2CisgICAgZW5kCisgIGVuZAorICByZXR1cm4gb3B0CitlbmQKKwogZnVuY3Rpb24gYXNzZXJ0RXF1YWwodmFsMSwgdmFsMiwgbXNnKQogICBhc3NlcnQodmFsMSA9PSB2YWwyLCBtc2cpCiBlbmQKIAotZnVuY3Rpb24gdGVzdEJhc2ljQ2xpZW50KCkKK2Z1bmN0aW9uIHRlc3RCYXNpY0NsaWVudChyYXdBcmdzKQorICBsb2NhbCBvcHQgPSBwYXJzZUFyZ3MocmF3QXJncykKICAgbG9jYWwgc29ja2V0ID0gVFNvY2tldDpuZXd7Ci0gICAgcG9ydCA9IDkwOTAKKyAgICBwb3J0ID0gdG9udW1iZXIob3B0LnBvcnQpCiAgIH0KICAgYXNzZXJ0KHNvY2tldCwgJ0ZhaWxlZCB0byBjcmVhdGUgY2xpZW50IHNvY2tldCcpCiAgIHNvY2tldDpzZXRUaW1lb3V0KDUwMDApCiAKLSAgbG9jYWwgcHJvdG9jb2wgPSBUQmluYXJ5UHJvdG9jb2w6bmV3ewotICAgIHRyYW5zID0gc29ja2V0CisgIGxvY2FsIHRyYW5zcG9ydHMgPSB7CisgICAgYnVmZmVyZWQgPSBUQnVmZmVyZWRUcmFuc3BvcnQsCisgICAgZnJhbWVkID0gVEZyYW1lZFRyYW5zcG9ydCwKKyAgICBodHRwID0gVEh0dHBUcmFuc3BvcnQsCisgIH0KKyAgYXNzZXJ0KHRyYW5zcG9ydHNbb3B0LnRyYW5zcG9ydF0gfj0gbmlsKQorICBsb2NhbCB0cmFuc3BvcnQgPSB0cmFuc3BvcnRzW29wdC50cmFuc3BvcnRdOm5ld3sKKyAgICB0cmFucyA9IHNvY2tldCwKKyAgICBpc1NlcnZlciA9IGZhbHNlCisgIH0KKworICBsb2NhbCBwcm90b2NvbHMgPSB7CisgICAgYmluYXJ5ID0gVEJpbmFyeVByb3RvY29sLAorICAgIGNvbXBhY3QgPSBUQ29tcGFjdFByb3RvY29sLAorICAgIGpzb24gPSBUSlNPTlByb3RvY29sLAorICB9CisgIGFzc2VydChwcm90b2NvbHNbb3B0LnByb3RvY29sXSB+PSBuaWwpCisgIGxvY2FsIHByb3RvY29sID0gcHJvdG9jb2xzW29wdC5wcm90b2NvbF06bmV3eworICAgIHRyYW5zID0gdHJhbnNwb3J0CiAgIH0KICAgYXNzZXJ0KHByb3RvY29sLCAnRmFpbGVkIHRvIGNyZWF0ZSBiaW5hcnkgcHJvdG9jb2wnKQogCkBAIC01NCwxNCArOTAsMTggQEAKICAgfQogICBhc3NlcnQoY2xpZW50LCAnRmFpbGVkIHRvIGNyZWF0ZSBjbGllbnQnKQogCi0gIC0tIE9wZW4gdGhlIHNvY2tldAotICBsb2NhbCBzdGF0dXMsIF8gPSBwY2FsbChzb2NrZXQub3Blbiwgc29ja2V0KQorICAtLSBPcGVuIHRoZSB0cmFuc3BvcnQKKyAgbG9jYWwgc3RhdHVzLCBfID0gcGNhbGwodHJhbnNwb3J0Lm9wZW4sIHRyYW5zcG9ydCkKICAgYXNzZXJ0KHN0YXR1cywgJ0ZhaWxlZCB0byBjb25uZWN0IHRvIHNlcnZlcicpCiAKICAgLS0gU3RyaW5nCiAgIGFzc2VydEVxdWFsKGNsaWVudDp0ZXN0U3RyaW5nKCdsYWxhJyksICAnbGFsYScsICAnRmFpbGVkIHRlc3RTdHJpbmcnKQogICBhc3NlcnRFcXVhbChjbGllbnQ6dGVzdFN0cmluZygnd2Fob28nKSwgJ3dhaG9vJywgJ0ZhaWxlZCB0ZXN0U3RyaW5nJykKIAorICAtLSBCb29sCisgIGFzc2VydEVxdWFsKGNsaWVudDp0ZXN0Qm9vbCh0cnVlKSwgdHJ1ZSwgJ0ZhaWxlZCB0ZXN0Qm9vbCB0cnVlJykKKyAgYXNzZXJ0RXF1YWwoY2xpZW50OnRlc3RCb29sKGZhbHNlKSwgZmFsc2UsICdGYWlsZWQgdGVzdEJvb2wgZmFsc2UnKQorCiAgIC0tIEJ5dGUKICAgYXNzZXJ0RXF1YWwoY2xpZW50OnRlc3RCeXRlKDB4MDEpLCAxLCAgICAnRmFpbGVkIHRlc3RCeXRlIDEnKQogICBhc3NlcnRFcXVhbChjbGllbnQ6dGVzdEJ5dGUoMHg0MCksIDY0LCAgICdGYWlsZWQgdGVzdEJ5dGUgMicpCkBAIC0xMjAsMTkgKzE2MCwyMCBAQAogICBhc3NlcnRFcXVhbChjbGllbnQ6dGVzdERvdWJsZShhKSwgYiwgJ0ZhaWxlZCB0ZXN0RG91YmxlIDUnKQogCiAgIC0tIFN0cnVjdAotICBsb2NhbCBhID0geworICBsb2NhbCBvID0gWHRydWN0Om5ld3sKICAgICBzdHJpbmdfdGhpbmcgPSAnWmVybycsCiAgICAgYnl0ZV90aGluZyA9IDEsCiAgICAgaTMyX3RoaW5nID0gLTMsCiAgICAgaTY0X3RoaW5nID0gbG9uZygtNSkKICAgfQorICBsb2NhbCByID0gY2xpZW50OnRlc3RTdHJ1Y3QobykKKyAgYXNzZXJ0RXF1YWwoby5zdHJpbmdfdGhpbmcsIHIuc3RyaW5nX3RoaW5nLCAnRmFpbGVkIHRlc3RTdHJ1Y3QgMScpCisgIGFzc2VydEVxdWFsKG8uYnl0ZV90aGluZywgci5ieXRlX3RoaW5nLCAnRmFpbGVkIHRlc3RTdHJ1Y3QgMicpCisgIGFzc2VydEVxdWFsKG8uaTMyX3RoaW5nLCByLmkzMl90aGluZywgJ0ZhaWxlZCB0ZXN0U3RydWN0IDMnKQorICBhc3NlcnRFcXVhbChvLmk2NF90aGluZywgci5pNjRfdGhpbmcsICdGYWlsZWQgdGVzdFN0cnVjdCA0JykKIAotICAtLSBUT0RPIGZpeCBjbGllbnQgc3RydWN0IGVxdWFsaXR5Ci0gIC0tYXNzZXJ0RXF1YWwoY2xpZW50OnRlc3RTdHJ1Y3QoYSksIGEsICdGYWlsZWQgdGVzdFN0cnVjdCcpCi0KLSAgLS0gQ2FsbCB0aGUgdm9pZCBmdW5jdGlvbiBhbmQgZW5kIHRoZSB0ZXN0IChoYW5kbGVyIHN0b3BzIHNlcnZlcikKLSAgY2xpZW50OnRlc3RWb2lkKCkKKyAgLS0gVE9ETyBhZGQgbGlzdCBtYXAgc2V0IGV4Y2VwdGlvbiBldGMgZXRjCiBlbmQKIAotdGVzdEJhc2ljQ2xpZW50KCkKLXRlYXJkb3duKCkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit0ZXN0QmFzaWNDbGllbnQoYXJnKQordGVhcmRvd24oKQpkaWZmIC0tZ2l0IGEvdGVzdC9sdWEvdGVzdF9iYXNpY19zZXJ2ZXIubHVhIGIvdGVzdC9sdWEvdGVzdF9iYXNpY19zZXJ2ZXIubHVhCmluZGV4IDk2YTFhZTkuLmFjZDJkNzkgMTAwNjQ0Ci0tLSBhL3Rlc3QvbHVhL3Rlc3RfYmFzaWNfc2VydmVyLmx1YQorKysgYi90ZXN0L2x1YS90ZXN0X2Jhc2ljX3NlcnZlci5sdWEKQEAgLTEsMjMgKzEsMjcgQEAKLS0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0tLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0tLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0tLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0tLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS0tIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKy0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCistLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCistLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCistLSB1bmRlciB0aGUgTGljZW5zZS4KIAogcmVxdWlyZSgnVGhyaWZ0VGVzdF9UaHJpZnRUZXN0JykKIHJlcXVpcmUoJ1RTb2NrZXQnKQorcmVxdWlyZSgnVEJ1ZmZlcmVkVHJhbnNwb3J0JykKIHJlcXVpcmUoJ1RGcmFtZWRUcmFuc3BvcnQnKQorcmVxdWlyZSgnVEh0dHBUcmFuc3BvcnQnKQorcmVxdWlyZSgnVENvbXBhY3RQcm90b2NvbCcpCityZXF1aXJlKCdUSnNvblByb3RvY29sJykKIHJlcXVpcmUoJ1RCaW5hcnlQcm90b2NvbCcpCiByZXF1aXJlKCdUU2VydmVyJykKIHJlcXVpcmUoJ2xpYmx1YWxvbmdudW1iZXInKQpAQCAtMjgsMTMgKzMyLDE2IEBACiAKIC0tIFN0b3BzIHRoZSBzZXJ2ZXIKIGZ1bmN0aW9uIFRlc3RIYW5kbGVyOnRlc3RWb2lkKCkKLSAgc2VsZi5fX3NlcnZlcjpzdG9wKCkKIGVuZAogCiBmdW5jdGlvbiBUZXN0SGFuZGxlcjp0ZXN0U3RyaW5nKHN0cikKICAgcmV0dXJuIHN0cgogZW5kCiAKK2Z1bmN0aW9uIFRlc3RIYW5kbGVyOnRlc3RCb29sKGJvb2wpCisgIHJldHVybiBib29sCitlbmQKKwogZnVuY3Rpb24gVGVzdEhhbmRsZXI6dGVzdEJ5dGUoYnl0ZSkKICAgcmV0dXJuIGJ5dGUKIGVuZApAQCAtNjksNyArNzYsMjQgQEAKICAgZW5kCiBlbmQKIAotZnVuY3Rpb24gdGVzdEJhc2ljU2VydmVyKCkKK2Z1bmN0aW9uIHBhcnNlQXJncyhyYXdBcmdzKQorICBsb2NhbCBvcHQgPSB7CisgICAgcHJvdG9jb2w9J2JpbmFyeScsCisgICAgdHJhbnNwb3J0PSdidWZmZXJlZCcsCisgICAgcG9ydD0nOTA5MCcsCisgIH0KKyAgZm9yIGksIHN0ciBpbiBwYWlycyhyYXdBcmdzKSBkbworICAgIGlmIGkgPiAwIHRoZW4KKyAgICAgIGssIHYgPSBzdHJpbmcubWF0Y2goc3RyLCAnLS0oJXcrKT0oJXcrKScpCisgICAgICBhc3NlcnQob3B0W2tdIH49IG5pbCwgJ1Vua25vd24gYXJndW1lbnQnKQorICAgICAgb3B0W2tdID0gdgorICAgIGVuZAorICBlbmQKKyAgcmV0dXJuIG9wdAorZW5kCisKK2Z1bmN0aW9uIHRlc3RCYXNpY1NlcnZlcihyYXdBcmdzKQorICBsb2NhbCBvcHQgPSBwYXJzZUFyZ3MocmF3QXJncykKICAgLS0gSGFuZGxlciAmIFByb2Nlc3NvcgogICBsb2NhbCBoYW5kbGVyID0gVGVzdEhhbmRsZXI6bmV3e30KICAgYXNzZXJ0KGhhbmRsZXIsICdGYWlsZWQgdG8gY3JlYXRlIGhhbmRsZXInKQpAQCAtODAsMTQgKzEwNCwyNCBAQAogCiAgIC0tIFNlcnZlciBTb2NrZXQKICAgbG9jYWwgc29ja2V0ID0gVFNlcnZlclNvY2tldDpuZXd7Ci0gICAgcG9ydCA9IDkwOTAKKyAgICBwb3J0ID0gb3B0LnBvcnQKICAgfQogICBhc3NlcnQoc29ja2V0LCAnRmFpbGVkIHRvIGNyZWF0ZSBzZXJ2ZXIgc29ja2V0JykKIAogICAtLSBUcmFuc3BvcnQgJiBGYWN0b3J5Ci0gIGxvY2FsIHRyYW5zX2ZhY3RvcnkgPSBURnJhbWVkVHJhbnNwb3J0RmFjdG9yeTpuZXd7fQotICBhc3NlcnQodHJhbnNfZmFjdG9yeSwgJ0ZhaWxlZCB0byBjcmVhdGUgZnJhbWVkIHRyYW5zcG9ydCBmYWN0b3J5JykKLSAgbG9jYWwgcHJvdF9mYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sRmFjdG9yeTpuZXd7fQorICBsb2NhbCB0cmFuc3BvcnRzID0geworICAgIGJ1ZmZlcmVkID0gVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSwKKyAgICBmcmFtZWQgPSBURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSwKKyAgICBodHRwID0gVEh0dHBUcmFuc3BvcnRGYWN0b3J5LAorICB9CisgIGFzc2VydCh0cmFuc3BvcnRzW29wdC50cmFuc3BvcnRdLCAnRmFpbGVkIHRvIGNyZWF0ZSBmcmFtZWQgdHJhbnNwb3J0IGZhY3RvcnknKQorICBsb2NhbCB0cmFuc19mYWN0b3J5ID0gdHJhbnNwb3J0c1tvcHQudHJhbnNwb3J0XTpuZXd7fQorICBsb2NhbCBwcm90b2NvbHMgPSB7CisgICAgYmluYXJ5ID0gVEJpbmFyeVByb3RvY29sRmFjdG9yeSwKKyAgICBjb21wYWN0ID0gVENvbXBhY3RQcm90b2NvbEZhY3RvcnksCisgICAganNvbiA9IFRKU09OUHJvdG9jb2xGYWN0b3J5LAorICB9CisgIGxvY2FsIHByb3RfZmFjdG9yeSA9IHByb3RvY29sc1tvcHQucHJvdG9jb2xdOm5ld3t9CiAgIGFzc2VydChwcm90X2ZhY3RvcnksICdGYWlsZWQgdG8gY3JlYXRlIGJpbmFyeSBwcm90b2NvbCBmYWN0b3J5JykKIAogICAtLSBTaW1wbGUgU2VydmVyCkBAIC0xMDQsNSArMTM4LDUgQEAKICAgc2VydmVyID0gbmlsCiBlbmQKIAotdGVzdEJhc2ljU2VydmVyKCkKLXRlYXJkb3duKCkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit0ZXN0QmFzaWNTZXJ2ZXIoYXJnKQordGVhcmRvd24oKQpkaWZmIC0tZ2l0IGEvdGVzdC9uZXRjb3JlL0NsaWVudC8uZ2l0aWdub3JlIGIvdGVzdC9uZXRjb3JlL0NsaWVudC8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZDU1MTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L25ldGNvcmUvQ2xpZW50Ly5naXRpZ25vcmUKQEAgLTAsMCArMSwyIEBACisjIGlnbm9yZSBmb3IgYXV0b2dlbmVyYXRlZCBmaWxlcworL1RocmlmdFRlc3QKZGlmZiAtLWdpdCBhL3Rlc3QvbmV0Y29yZS9DbGllbnQvQ2xpZW50LmNzcHJvaiBiL3Rlc3QvbmV0Y29yZS9DbGllbnQvQ2xpZW50LmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTZhZjM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uZXRjb3JlL0NsaWVudC9DbGllbnQuY3Nwcm9qCkBAIC0wLDAgKzEsMzEgQEAKKzxQcm9qZWN0IFNkaz0iTWljcm9zb2Z0Lk5FVC5TZGsiPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrPm5ldGNvcmVhcHAyLjA8L1RhcmdldEZyYW1ld29yaz4KKyAgICA8QXNzZW1ibHlOYW1lPkNsaWVudDwvQXNzZW1ibHlOYW1lPgorICAgIDxQYWNrYWdlSWQ+Q2xpZW50PC9QYWNrYWdlSWQ+CisgICAgPE91dHB1dFR5cGU+RXhlPC9PdXRwdXRUeXBlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5VGl0bGVBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlUaXRsZUF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseURlc2NyaXB0aW9uQXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5RGVzY3JpcHRpb25BdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb25maWd1cmF0aW9uQXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29uZmlndXJhdGlvbkF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvbXBhbnlBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb21wYW55QXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5UHJvZHVjdEF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseVByb2R1Y3RBdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb3B5cmlnaHRBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb3B5cmlnaHRBdHRyaWJ1dGU+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uTmV0Lkh0dHAuV2luSHR0cEhhbmRsZXIiIFZlcnNpb249Ils0LjQsKSIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLlByaW1pdGl2ZXMiIFZlcnNpb249Ils0LjMsKSIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uU2VydmljZU1vZGVsLlByaW1pdGl2ZXMiIFZlcnNpb249Ils0LjQsKSIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uVGhyZWFkaW5nIiBWZXJzaW9uPSJbNC4zLCkiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxuZXRjb3JlXFRocmlmdFxUaHJpZnQuY3Nwcm9qIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPFRhcmdldCBOYW1lPSJQcmVCdWlsZCIgQmVmb3JlVGFyZ2V0cz0iX0dlbmVyYXRlUmVzdG9yZVByb2plY3RTcGVjO1Jlc3RvcmU7Q29tcGlsZSI+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSInJChPUyknID09ICdXaW5kb3dzX05UJyIgQ29tbWFuZD0id2hlcmUgdGhyaWZ0IiBDb25zb2xlVG9NU0J1aWxkPSJ0cnVlIj4KKyAgICAgIDxPdXRwdXQgVGFza1BhcmFtZXRlcj0iQ29uc29sZU91dHB1dCIgUHJvcGVydHlOYW1lPSJQYXRoVG9UaHJpZnQiIC8+CisgICAgPC9FeGVjPgorICAgIDxFeGVjIENvbmRpdGlvbj0iRXhpc3RzKCckKFBhdGhUb1RocmlmdCknKSIgQ29tbWFuZD0iJnF1b3Q7JChQYXRoVG9UaHJpZnQpJnF1b3Q7IC1vdXQgJChQcm9qZWN0RGlyKSAtZ2VuIG5ldGNvcmU6d2NmLHVuaW9uLHNlcmlhbCxoYXNoY29kZSAtciAuLy4uLy4uL1RocmlmdFRlc3QudGhyaWZ0IiAvPgorICAgIDxFeGVjIENvbmRpdGlvbj0iRXhpc3RzKCd0aHJpZnQnKSIgQ29tbWFuZD0idGhyaWZ0IC1vdXQgJChQcm9qZWN0RGlyKSAtZ2VuIG5ldGNvcmU6d2NmLHVuaW9uLHNlcmlhbCxoYXNoY29kZSAtciAuLy4uLy4uL1RocmlmdFRlc3QudGhyaWZ0IiAvPgorICAgIDxFeGVjIENvbmRpdGlvbj0iRXhpc3RzKCckKFByb2plY3REaXIpLy4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQnKSIgQ29tbWFuZD0iJChQcm9qZWN0RGlyKS8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1vdXQgJChQcm9qZWN0RGlyKSAtZ2VuIG5ldGNvcmU6d2NmLHVuaW9uLHNlcmlhbCxoYXNoY29kZSAtciAuLy4uLy4uL1RocmlmdFRlc3QudGhyaWZ0IiAvPgorICA8L1RhcmdldD4KKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3QvbmV0Y29yZS9DbGllbnQvUHJvZ3JhbS5jcyBiL3Rlc3QvbmV0Y29yZS9DbGllbnQvUHJvZ3JhbS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjEzOWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uZXRjb3JlL0NsaWVudC9Qcm9ncmFtLmNzCkBAIC0wLDAgKzEsNzIgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFRocmlmdFRlc3Q7CisKK25hbWVzcGFjZSBDbGllbnQKK3sKKyAgICBwdWJsaWMgY2xhc3MgUHJvZ3JhbQorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgTWFpbihzdHJpbmdbXSBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLlNldEJ1ZmZlclNpemUoQ29uc29sZS5CdWZmZXJXaWR0aCwgNDA5Nik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJGYWlsZWQgdG8gZ3JvdyBzY3JvbGwtYmFjayBidWZmZXIiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gc3BsaXQgbW9kZSBhbmQgb3B0aW9ucworICAgICAgICAgICAgdmFyIHN1YkFyZ3MgPSBuZXcgTGlzdDxzdHJpbmc+KGFyZ3MpOworICAgICAgICAgICAgdmFyIGZpcnN0QXJnID0gc3RyaW5nLkVtcHR5OworICAgICAgICAgICAgaWYgKHN1YkFyZ3MuQ291bnQgPiAwKQorICAgICAgICAgICAgeyAKKyAgICAgICAgICAgICAgICBmaXJzdEFyZyA9IHN1YkFyZ3NbMF07CisgICAgICAgICAgICAgICAgc3ViQXJncy5SZW1vdmVBdCgwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gcnVuIHdoYXRldmVyIG1vZGUgaXMgY2hvb3NlbgorICAgICAgICAgICAgc3dpdGNoKGZpcnN0QXJnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgImNsaWVudCI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUZXN0Q2xpZW50LkV4ZWN1dGUoc3ViQXJncyk7CisgICAgICAgICAgICAgICAgY2FzZSAiLS1oZWxwIjoKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRIZWxwKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIFByaW50SGVscCgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIFByaW50SGVscCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVc2FnZToiKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIENsaWVudCAgY2xpZW50ICBbb3B0aW9uc10nIik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICBDbGllbnQgIC0taGVscCIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiIpOworCisgICAgICAgICAgICBUZXN0Q2xpZW50LlByaW50T3B0aW9uc0hlbHAoKTsKKyAgICAgICAgfQorICAgIH0KK30KKworCmRpZmYgLS1naXQgYS90ZXN0L25ldGNvcmUvQ2xpZW50L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvdGVzdC9uZXRjb3JlL0NsaWVudC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTcxNTJiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uZXRjb3JlL0NsaWVudC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMCwwICsxLDQzIEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKKworLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZworLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KKworW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJDbGllbnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiVGhyaWZ0IildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoIiIpXQorCisvLyBTZXR0aW5nIENvbVZpc2libGUgdG8gZmFsc2UgbWFrZXMgdGhlIHR5cGVzIGluIHRoaXMgYXNzZW1ibHkgbm90IHZpc2libGUKKy8vIHRvIENPTSBjb21wb25lbnRzLiAgSWYgeW91IG5lZWQgdG8gYWNjZXNzIGEgdHlwZSBpbiB0aGlzIGFzc2VtYmx5IGZyb20KKy8vIENPTSwgc2V0IHRoZSBDb21WaXNpYmxlIGF0dHJpYnV0ZSB0byB0cnVlIG9uIHRoYXQgdHlwZS4KKworW2Fzc2VtYmx5OiBDb21WaXNpYmxlKGZhbHNlKV0KKworLy8gVGhlIGZvbGxvd2luZyBHVUlEIGlzIGZvciB0aGUgSUQgb2YgdGhlIHR5cGVsaWIgaWYgdGhpcyBwcm9qZWN0IGlzIGV4cG9zZWQgdG8gQ09NCisKK1thc3NlbWJseTogR3VpZCgiQjBDMTNEQTAtMzExNy00ODQ0LThBRTgtQjE3NzVFNDYyMjNEIildCisKZGlmZiAtLWdpdCBhL3Rlc3QvbmV0Y29yZS9DbGllbnQvVGVzdENsaWVudC5jcyBiL3Rlc3QvbmV0Y29yZS9DbGllbnQvVGVzdENsaWVudC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmUxOThjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uZXRjb3JlL0NsaWVudC9UZXN0Q2xpZW50LmNzCkBAIC0wLDAgKzEsOTQzIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uRGlhZ25vc3RpY3M7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5OZXQ7Cit1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5BdXRoZW50aWNhdGlvbjsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHkuWDUwOUNlcnRpZmljYXRlczsKK3VzaW5nIFN5c3RlbS5TZXJ2aWNlTW9kZWw7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgVGhyaWZ0LkNvbGxlY3Rpb25zOwordXNpbmcgVGhyaWZ0LlByb3RvY29sczsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnRzOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHMuQ2xpZW50OworCituYW1lc3BhY2UgVGhyaWZ0VGVzdAoreworICAgIHB1YmxpYyBjbGFzcyBUZXN0Q2xpZW50CisgICAgeworICAgICAgICBwcml2YXRlIGNsYXNzIFRlc3RQYXJhbXMKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIGludCBudW1JdGVyYXRpb25zID0gMTsKKyAgICAgICAgICAgIHB1YmxpYyBJUEFkZHJlc3MgaG9zdCA9IElQQWRkcmVzcy5Bbnk7CisgICAgICAgICAgICBwdWJsaWMgaW50IHBvcnQgPSA5MDkwOworICAgICAgICAgICAgcHVibGljIGludCBudW1UaHJlYWRzID0gMTsKKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgdXJsOworICAgICAgICAgICAgcHVibGljIHN0cmluZyBwaXBlOworICAgICAgICAgICAgcHVibGljIGJvb2wgYnVmZmVyZWQ7CisgICAgICAgICAgICBwdWJsaWMgYm9vbCBmcmFtZWQ7CisgICAgICAgICAgICBwdWJsaWMgc3RyaW5nIHByb3RvY29sOworICAgICAgICAgICAgcHVibGljIGJvb2wgZW5jcnlwdGVkID0gZmFsc2U7CisKKyAgICAgICAgICAgIGludGVybmFsIHZvaWQgUGFyc2UoIExpc3Q8c3RyaW5nPiBhcmdzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5Db3VudDsgKytpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3NbaV0gPT0gIi11IikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0gYXJnc1srK2ldOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi1uIikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbnVtSXRlcmF0aW9ucyA9IENvbnZlcnQuVG9JbnQzMihhcmdzWysraV0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0uU3RhcnRzV2l0aCgiLS1waXBlPSIpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwaXBlID0gYXJnc1tpXS5TdWJzdHJpbmcoYXJnc1tpXS5JbmRleE9mKCI9IikgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVc2luZyBuYW1lZCBwaXBlcyB0cmFuc3BvcnQiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldLlN0YXJ0c1dpdGgoIi0taG9zdD0iKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdGhlcmUgZm9yIGlwYWRkcmVzcworICAgICAgICAgICAgICAgICAgICAgICAgaG9zdCA9IG5ldyBJUEFkZHJlc3MoRW5jb2RpbmcuVW5pY29kZS5HZXRCeXRlcyhhcmdzW2ldLlN1YnN0cmluZyhhcmdzW2ldLkluZGV4T2YoIj0iKSArIDEpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXS5TdGFydHNXaXRoKCItLXBvcnQ9IikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQgPSBpbnQuUGFyc2UoYXJnc1tpXS5TdWJzdHJpbmcoYXJnc1tpXS5JbmRleE9mKCI9IikgKyAxKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLWIiIHx8IGFyZ3NbaV0gPT0gIi0tYnVmZmVyZWQiIHx8IGFyZ3NbaV0gPT0gIi0tdHJhbnNwb3J0PWJ1ZmZlcmVkIikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlVzaW5nIGJ1ZmZlcmVkIHNvY2tldHMiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItZiIgfHwgYXJnc1tpXSA9PSAiLS1mcmFtZWQiIHx8IGFyZ3NbaV0gPT0gIi0tdHJhbnNwb3J0PWZyYW1lZCIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVXNpbmcgZnJhbWVkIHRyYW5zcG9ydCIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi10IikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbnVtVGhyZWFkcyA9IENvbnZlcnQuVG9JbnQzMihhcmdzWysraV0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi0tYmluYXJ5IiB8fCBhcmdzW2ldID09ICItLXByb3RvY29sPWJpbmFyeSIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sID0gImJpbmFyeSI7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVXNpbmcgYmluYXJ5IHByb3RvY29sIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS1jb21wYWN0IiB8fCBhcmdzW2ldID09ICItLXByb3RvY29sPWNvbXBhY3QiKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbCA9ICJjb21wYWN0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVc2luZyBjb21wYWN0IHByb3RvY29sIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS1qc29uIiB8fCBhcmdzW2ldID09ICItLXByb3RvY29sPWpzb24iKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbCA9ICJqc29uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVc2luZyBKU09OIHByb3RvY29sIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS1zc2wiKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlVzaW5nIGVuY3J5cHRlZCB0cmFuc3BvcnQiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKGFyZ3NbaV0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBYNTA5Q2VydGlmaWNhdGUyIEdldENsaWVudENlcnQoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBjbGllbnRDZXJ0TmFtZSA9ICJjbGllbnQucDEyIjsKKyAgICAgICAgICAgICAgICB2YXIgcG9zc2libGVQYXRocyA9IG5ldyBMaXN0PHN0cmluZz4KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICIuLi8uLi8uLi9rZXlzLyIsCisgICAgICAgICAgICAgICAgICAgICIuLi8uLi9rZXlzLyIsCisgICAgICAgICAgICAgICAgICAgICIuLi9rZXlzLyIsCisgICAgICAgICAgICAgICAgICAgICJrZXlzLyIsCisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIHN0cmluZyBleGlzdGluZ1BhdGggPSBudWxsOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBwb3NzaWJsZVBhdGggaW4gcG9zc2libGVQYXRocykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBwYXRoID0gUGF0aC5HZXRGdWxsUGF0aChwb3NzaWJsZVBhdGggKyBjbGllbnRDZXJ0TmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChGaWxlLkV4aXN0cyhwYXRoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdQYXRoID0gcGF0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KGV4aXN0aW5nUGF0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCQiQ2Fubm90IGZpbmQgZmlsZToge2NsaWVudENlcnROYW1lfSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHZhciBjZXJ0ID0gbmV3IFg1MDlDZXJ0aWZpY2F0ZTIoZXhpc3RpbmdQYXRoLCAidGhyaWZ0Iik7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gY2VydDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgcHVibGljIFRDbGllbnRUcmFuc3BvcnQgQ3JlYXRlVHJhbnNwb3J0KCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodXJsID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBlbmRwb2ludCB0cmFuc3BvcnQKKyAgICAgICAgICAgICAgICAgICAgVENsaWVudFRyYW5zcG9ydCB0cmFucyA9IG51bGw7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBpcGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVE5hbWVkUGlwZUNsaWVudFRyYW5zcG9ydChwaXBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbmNyeXB0ZWQpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2VydCA9IEdldENsaWVudENlcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjZXJ0ID09IG51bGwgfHwgIWNlcnQuSGFzUHJpdmF0ZUtleSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJDZXJ0aWZpY2F0ZSBkb2Vzbid0IGNvbnRhaW4gcHJpdmF0ZSBrZXkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVFRsc1NvY2tldENsaWVudFRyYW5zcG9ydChob3N0LCBwb3J0LCAwLCBjZXJ0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbmRlciwgY2VydGlmaWNhdGUsIGNoYWluLCBlcnJvcnMpID0+IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIFNzbFByb3RvY29scy5UbHMgfCBTc2xQcm90b2NvbHMuVGxzMTEgfCBTc2xQcm90b2NvbHMuVGxzMTIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gbmV3IFRTb2NrZXRDbGllbnRUcmFuc3BvcnQoaG9zdCwgcG9ydCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBsYXllcmVkIHRyYW5zcG9ydAorICAgICAgICAgICAgICAgICAgICBpZiAoYnVmZmVyZWQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gbmV3IFRCdWZmZXJlZENsaWVudFRyYW5zcG9ydCh0cmFucyk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWVkKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBURnJhbWVkQ2xpZW50VHJhbnNwb3J0KHRyYW5zKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cmFuczsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRIdHRwQ2xpZW50VHJhbnNwb3J0KG5ldyBVcmkodXJsKSwgbnVsbCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUUHJvdG9jb2wgQ3JlYXRlUHJvdG9jb2woVENsaWVudFRyYW5zcG9ydCB0cmFuc3BvcnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHByb3RvY29sID09ICJjb21wYWN0IikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVENvbXBhY3RQcm90b2NvbCh0cmFuc3BvcnQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChwcm90b2NvbCA9PSAianNvbiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRKc29uUHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICBwcml2YXRlIGNvbnN0IGludCBFcnJvckJhc2VUeXBlcyA9IDE7CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IEVycm9yU3RydWN0cyA9IDI7CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IEVycm9yQ29udGFpbmVycyA9IDQ7CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IEVycm9yRXhjZXB0aW9ucyA9IDg7CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IEVycm9yVW5rbm93biA9IDY0OworCisgICAgICAgIHByaXZhdGUgY2xhc3MgQ2xpZW50VGVzdAorICAgICAgICB7CisgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFRDbGllbnRUcmFuc3BvcnQgdHJhbnNwb3J0OworICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBUaHJpZnRUZXN0LkNsaWVudCBjbGllbnQ7CisgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGludCBudW1JdGVyYXRpb25zOworICAgICAgICAgICAgcHJpdmF0ZSBib29sIGRvbmU7CisKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgUmV0dXJuQ29kZSB7IGdldDsgc2V0OyB9CisKKyAgICAgICAgICAgIHB1YmxpYyBDbGllbnRUZXN0KFRlc3RQYXJhbXMgcGFyYW0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJhbnNwb3J0ID0gcGFyYW0uQ3JlYXRlVHJhbnNwb3J0KCk7CisgICAgICAgICAgICAgICAgY2xpZW50ID0gbmV3IFRocmlmdFRlc3QuQ2xpZW50KHBhcmFtLkNyZWF0ZVByb3RvY29sKHRyYW5zcG9ydCkpOworICAgICAgICAgICAgICAgIG51bUl0ZXJhdGlvbnMgPSBwYXJhbS5udW1JdGVyYXRpb25zOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBFeGVjdXRlKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdG9rZW4gPSBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lOworCisgICAgICAgICAgICAgICAgaWYgKGRvbmUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiRXhlY3V0ZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2UiKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bUl0ZXJhdGlvbnM7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRyYW5zcG9ydC5Jc09wZW4pCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0Lk9wZW5Bc3luYyh0b2tlbikuR2V0QXdhaXRlcigpLkdldFJlc3VsdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJDb25uZWN0IGZhaWxlZDogIiArIGV4Lk1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuQ29kZSB8PSBFcnJvclVua25vd247CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiQ29ubmVjdCBmYWlsZWQ6ICIgKyBleC5NZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJldHVybkNvZGUgfD0gRXJyb3JVbmtub3duOworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJldHVybkNvZGUgfD0gRXhlY3V0ZUNsaWVudFRlc3RBc3luYyhjbGllbnQpLkdldEF3YWl0ZXIoKS5HZXRSZXN1bHQoKTsgOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJldHVybkNvZGUgfD0gRXJyb3JVbmtub3duOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LkNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiRXJyb3Igd2hpbGUgY2xvc2luZyB0cmFuc3BvcnQiKTsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCBzdGF0aWMgdm9pZCBQcmludE9wdGlvbnNIZWxwKCkKKyAgICAgICAgeworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkNsaWVudCBvcHRpb25zOiIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiAgLXUgPFVSTD4iKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIC10IDwjIG9mIHRocmVhZHMgdG8gcnVuPiAgICAgICAgZGVmYXVsdCA9IDEiKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIC1uIDwjIG9mIGl0ZXJhdGlvbnM+ICAgICAgICAgICAgcGVyIHRocmVhZCIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiAgLS1waXBlPTxwaXBlIG5hbWU+Iik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICAtLWhvc3Q9PElQIGFkZHJlc3M+Iik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICAtLXBvcnQ9PHBvcnQgbnVtYmVyPiIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiAgLS10cmFuc3BvcnQ9PHRyYW5zcG9ydCBuYW1lPiAgICBvbmUgb2YgYnVmZmVyZWQsZnJhbWVkICAoZGVmYXVsdHMgdG8gbm9uZSkiKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIC0tcHJvdG9jb2w9PHByb3RvY29sIG5hbWU+ICAgICAgb25lIG9mIGNvbXBhY3QsanNvbiAgKGRlZmF1bHRzIHRvIGJpbmFyeSkiKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIC0tc3NsIik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgRXhlY3V0ZShMaXN0PHN0cmluZz4gYXJncykKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHBhcmFtID0gbmV3IFRlc3RQYXJhbXMoKTsKKworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW0uUGFyc2UoYXJncyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkVycm9yIHdoaWxlICBwYXJzaW5nIGFyZ3VtZW50cyIpOworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRXJyb3JVbmtub3duOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZhciB0ZXN0cyA9IEVudW1lcmFibGUuUmFuZ2UoMCwgcGFyYW0ubnVtVGhyZWFkcykuU2VsZWN0KF8gPT4gbmV3IENsaWVudFRlc3QocGFyYW0pKS5Ub0FycmF5KCk7CisKKyAgICAgICAgICAgICAgICAvL2lzc3VlIHRlc3RzIG9uIHNlcGFyYXRlIHRocmVhZHMgc2ltdWx0YW5lb3VzbHkKKyAgICAgICAgICAgICAgICB2YXIgdGhyZWFkcyA9IHRlc3RzLlNlbGVjdCh0ZXN0ID0+IG5ldyBUYXNrKHRlc3QuRXhlY3V0ZSkpLlRvQXJyYXkoKTsKKyAgICAgICAgICAgICAgICB2YXIgc3RhcnQgPSBEYXRlVGltZS5Ob3c7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHQgaW4gdGhyZWFkcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHQuU3RhcnQoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBUYXNrLldhaXRBbGwodGhyZWFkcyk7CisKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVG90YWwgdGltZTogIiArIChEYXRlVGltZS5Ob3cgLSBzdGFydCkpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRlc3RzLlNlbGVjdCh0ID0+IHQuUmV0dXJuQ29kZSkuQWdncmVnYXRlKChyMSwgcjIpID0+IHIxIHwgcjIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBvdXRlckV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVbmV4cGVjdGVkIGVycm9yIik7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUob3V0ZXJFeC5NZXNzYWdlICsgIiBTVDogIiArIG91dGVyRXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVycm9yVW5rbm93bjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIEJ5dGVzVG9IZXgoYnl0ZVtdIGRhdGEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCaXRDb252ZXJ0ZXIuVG9TdHJpbmcoZGF0YSkuUmVwbGFjZSgiLSIsIHN0cmluZy5FbXB0eSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBQcmVwYXJlVGVzdERhdGEoYm9vbCByYW5kb21EaXN0KQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmV0dmFsID0gbmV3IGJ5dGVbMHgxMDBdOworICAgICAgICAgICAgdmFyIGluaXRMZW4gPSBNYXRoLk1pbigweDEwMCwgcmV0dmFsLkxlbmd0aCk7CisKKyAgICAgICAgICAgIC8vIGxpbmVhciBkaXN0cmlidXRpb24sIHVubGVzcyByYW5kb20gaXMgcmVxdWVzdGVkCisgICAgICAgICAgICBpZiAoIXJhbmRvbURpc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbml0TGVuOyArK2kpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR2YWxbaV0gPSAoYnl0ZSlpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyByYW5kb20gZGlzdHJpYnV0aW9uCisgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGluaXRMZW47ICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR2YWxbaV0gPSAoYnl0ZSkwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFyIHJuZCA9IG5ldyBSYW5kb20oKTsKKyAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgaW5pdExlbjsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIG5leHRQb3MgPSBybmQuTmV4dCgpICUgaW5pdExlbjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbFtuZXh0UG9zXSA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWxbbmV4dFBvc10gPSAoYnl0ZSlpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBhc3luYyBUYXNrPGludD4gRXhlY3V0ZUNsaWVudFRlc3RBc3luYyhUaHJpZnRUZXN0LkNsaWVudCBjbGllbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB0b2tlbiA9IENhbmNlbGxhdGlvblRva2VuLk5vbmU7CisgICAgICAgICAgICB2YXIgcmV0dXJuQ29kZSA9IDA7CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RWb2lkKCkiKTsKKyAgICAgICAgICAgIGF3YWl0IGNsaWVudC50ZXN0Vm9pZEFzeW5jKHRva2VuKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSB2b2lkIik7CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RTdHJpbmcoXCJUZXN0XCIpIik7CisgICAgICAgICAgICB2YXIgcyA9IGF3YWl0IGNsaWVudC50ZXN0U3RyaW5nQXN5bmMoIlRlc3QiLCB0b2tlbik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gXCIiICsgcyArICJcIiIpOworICAgICAgICAgICAgaWYgKCJUZXN0IiAhPSBzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RCb29sKHRydWUpIik7CisgICAgICAgICAgICB2YXIgdCA9IGF3YWl0IGNsaWVudC50ZXN0Qm9vbEFzeW5jKChib29sKXRydWUsIHRva2VuKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgdCk7CisgICAgICAgICAgICBpZiAoIXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RCb29sKGZhbHNlKSIpOworICAgICAgICAgICAgdmFyIGYgPSBhd2FpdCBjbGllbnQudGVzdEJvb2xBc3luYygoYm9vbClmYWxzZSwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBmKTsKKyAgICAgICAgICAgIGlmIChmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RCeXRlKDEpIik7CisgICAgICAgICAgICB2YXIgaTggPSBhd2FpdCBjbGllbnQudGVzdEJ5dGVBc3luYygoc2J5dGUpMSwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBpOCk7CisgICAgICAgICAgICBpZiAoMSAhPSBpOCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0STMyKC0xKSIpOworICAgICAgICAgICAgdmFyIGkzMiA9IGF3YWl0IGNsaWVudC50ZXN0STMyQXN5bmMoLTEsIHRva2VuKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgaTMyKTsKKyAgICAgICAgICAgIGlmICgtMSAhPSBpMzIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEk2NCgtMzQzNTk3MzgzNjgpIik7CisgICAgICAgICAgICB2YXIgaTY0ID0gYXdhaXQgY2xpZW50LnRlc3RJNjRBc3luYygtMzQzNTk3MzgzNjgsIHRva2VuKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgaTY0KTsKKyAgICAgICAgICAgIGlmICgtMzQzNTk3MzgzNjggIT0gaTY0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRPRE86IFZhbGlkYXRlIHJlY2VpdmVkIG1lc3NhZ2UKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3REb3VibGUoNS4zMjUwOTgyMzUpIik7CisgICAgICAgICAgICB2YXIgZHViID0gYXdhaXQgY2xpZW50LnRlc3REb3VibGVBc3luYyg1LjMyNTA5ODIzNSwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBkdWIpOworICAgICAgICAgICAgaWYgKDUuMzI1MDk4MjM1ICE9IGR1YikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdERvdWJsZSgtMC4wMDAzNDEwMTI0Mzk2Mzg1OTgyNzkpIik7CisgICAgICAgICAgICBkdWIgPSBhd2FpdCBjbGllbnQudGVzdERvdWJsZUFzeW5jKC0wLjAwMDM0MTAxMjQzOTYzODU5ODI3OSwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBkdWIpOworICAgICAgICAgICAgaWYgKC0wLjAwMDM0MTAxMjQzOTYzODU5ODI3OSAhPSBkdWIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGJpbk91dCA9IFByZXBhcmVUZXN0RGF0YSh0cnVlKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RCaW5hcnkoIiArIEJ5dGVzVG9IZXgoYmluT3V0KSArICIpIik7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgYmluSW4gPSBhd2FpdCBjbGllbnQudGVzdEJpbmFyeUFzeW5jKGJpbk91dCwgdG9rZW4pOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgQnl0ZXNUb0hleChiaW5JbikpOworICAgICAgICAgICAgICAgIGlmIChiaW5Jbi5MZW5ndGggIT0gYmluT3V0Lkxlbmd0aCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKHZhciBvZnMgPSAwOyBvZnMgPCBNYXRoLk1pbihiaW5Jbi5MZW5ndGgsIGJpbk91dC5MZW5ndGgpOyArK29mcykKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJpbkluW29mc10gIT0gYmluT3V0W29mc10pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBiaW5hcnkgZXF1YWxzPyBvbmx5IHdpdGggaGFzaGNvZGUgb3B0aW9uIGVuYWJsZWQgLi4uCisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVGVzdCBDcmF6eU5lc3RpbmciKTsKKyAgICAgICAgICAgIHZhciBvbmUgPSBuZXcgQ3JhenlOZXN0aW5nKCk7CisgICAgICAgICAgICB2YXIgdHdvID0gbmV3IENyYXp5TmVzdGluZygpOworICAgICAgICAgICAgb25lLlN0cmluZ19maWVsZCA9ICJjcmF6eSI7CisgICAgICAgICAgICB0d28uU3RyaW5nX2ZpZWxkID0gImNyYXp5IjsKKyAgICAgICAgICAgIG9uZS5CaW5hcnlfZmllbGQgPSBuZXcgYnl0ZVtdIHsgMHgwMCwgMHgwMSwgMHgwMiwgMHgwNCwgMHgwOCwgMHgxMCwgMHgyMCwgMHg0MCwgMHg4MCwgMHhGRiB9OworICAgICAgICAgICAgdHdvLkJpbmFyeV9maWVsZCA9IG5ldyBieXRlWzEwXSB7IDB4MDAsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsIDB4RkYgfTsKKyAgICAgICAgICAgIGlmICh0eXBlb2YoQ3JhenlOZXN0aW5nKS5HZXRNZXRob2QoIkVxdWFscyIpPy5EZWNsYXJpbmdUeXBlID09IHR5cGVvZihDcmF6eU5lc3RpbmcpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghb25lLkVxdWFscyh0d28pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JDb250YWluZXJzOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJDcmF6eU5lc3RpbmcuRXF1YWxzIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVE9ETzogVmFsaWRhdGUgcmVjZWl2ZWQgbWVzc2FnZQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdFN0cnVjdCh7XCJaZXJvXCIsIDEsIC0zLCAtNX0pIik7CisgICAgICAgICAgICB2YXIgbyA9IG5ldyBYdHJ1Y3QoKTsKKyAgICAgICAgICAgIG8uU3RyaW5nX3RoaW5nID0gIlplcm8iOworICAgICAgICAgICAgby5CeXRlX3RoaW5nID0gKHNieXRlKTE7CisgICAgICAgICAgICBvLkkzMl90aGluZyA9IC0zOworICAgICAgICAgICAgby5JNjRfdGhpbmcgPSAtNTsKKyAgICAgICAgICAgIHZhciBpID0gYXdhaXQgY2xpZW50LnRlc3RTdHJ1Y3RBc3luYyhvLCB0b2tlbik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0ge1wiIiArIGkuU3RyaW5nX3RoaW5nICsgIlwiLCAiICsgaS5CeXRlX3RoaW5nICsgIiwgIiArIGkuSTMyX3RoaW5nICsgIiwgIiArIGkuSTY0X3RoaW5nICsgIn0iKTsKKworICAgICAgICAgICAgLy8gVE9ETzogVmFsaWRhdGUgcmVjZWl2ZWQgbWVzc2FnZQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdE5lc3QoezEsIHtcIlplcm9cIiwgMSwgLTMsIC01fSwgNX0pIik7CisgICAgICAgICAgICB2YXIgbzIgPSBuZXcgWHRydWN0MigpOworICAgICAgICAgICAgbzIuQnl0ZV90aGluZyA9IChzYnl0ZSkxOworICAgICAgICAgICAgbzIuU3RydWN0X3RoaW5nID0gbzsKKyAgICAgICAgICAgIG8yLkkzMl90aGluZyA9IDU7CisgICAgICAgICAgICB2YXIgaTIgPSBhd2FpdCBjbGllbnQudGVzdE5lc3RBc3luYyhvMiwgdG9rZW4pOworICAgICAgICAgICAgaSA9IGkyLlN0cnVjdF90aGluZzsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSB7IiArIGkyLkJ5dGVfdGhpbmcgKyAiLCB7XCIiICsgaS5TdHJpbmdfdGhpbmcgKyAiXCIsICIgKyBpLkJ5dGVfdGhpbmcgKyAiLCAiICsgaS5JMzJfdGhpbmcgKyAiLCAiICsgaS5JNjRfdGhpbmcgKyAifSwgIiArIGkyLkkzMl90aGluZyArICJ9Iik7CisKKyAgICAgICAgICAgIHZhciBtYXBvdXQgPSBuZXcgRGljdGlvbmFyeTxpbnQsIGludD4oKTsKKyAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgNTsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1hcG91dFtqXSA9IGogLSAxMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RNYXAoeyIpOworICAgICAgICAgICAgdmFyIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBrZXkgaW4gbWFwb3V0LktleXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShrZXkgKyAiID0+ICIgKyBtYXBvdXRba2V5XSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ9KSIpOworCisgICAgICAgICAgICB2YXIgbWFwaW4gPSBhd2FpdCBjbGllbnQudGVzdE1hcEFzeW5jKG1hcG91dCwgdG9rZW4pOworCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIgPSB7Iik7CisgICAgICAgICAgICBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIga2V5IGluIG1hcGluLktleXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShrZXkgKyAiID0+ICIgKyBtYXBpbltrZXldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ9Iik7CisKKyAgICAgICAgICAgIC8vIFRPRE86IFZhbGlkYXRlIHJlY2VpdmVkIG1lc3NhZ2UKKyAgICAgICAgICAgIHZhciBsaXN0b3V0ID0gbmV3IExpc3Q8aW50PigpOworICAgICAgICAgICAgZm9yICh2YXIgaiA9IC0yOyBqIDwgMzsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxpc3RvdXQuQWRkKGopOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdExpc3QoeyIpOworICAgICAgICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGogaW4gbGlzdG91dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGopOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgifSkiKTsKKworICAgICAgICAgICAgdmFyIGxpc3RpbiA9IGF3YWl0IGNsaWVudC50ZXN0TGlzdEFzeW5jKGxpc3RvdXQsIHRva2VuKTsKKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiID0geyIpOworICAgICAgICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGogaW4gbGlzdGluKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoaik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgifSIpOworCisgICAgICAgICAgICAvL3NldAorICAgICAgICAgICAgLy8gVE9ETzogVmFsaWRhdGUgcmVjZWl2ZWQgbWVzc2FnZQorICAgICAgICAgICAgdmFyIHNldG91dCA9IG5ldyBUSGFzaFNldDxpbnQ+KCk7CisgICAgICAgICAgICBmb3IgKHZhciBqID0gLTI7IGogPCAzOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2V0b3V0LkFkZChqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RTZXQoeyIpOworICAgICAgICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgZm9yZWFjaCAoaW50IGogaW4gc2V0b3V0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoaik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ9KSIpOworCisgICAgICAgICAgICB2YXIgc2V0aW4gPSBhd2FpdCBjbGllbnQudGVzdFNldEFzeW5jKHNldG91dCwgdG9rZW4pOworCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIgPSB7Iik7CisgICAgICAgICAgICBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICBmb3JlYWNoIChpbnQgaiBpbiBzZXRpbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGopOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIn0iKTsKKworCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0RW51bShPTkUpIik7CisgICAgICAgICAgICB2YXIgcmV0ID0gYXdhaXQgY2xpZW50LnRlc3RFbnVtQXN5bmMoTnVtYmVyei5PTkUsIHRva2VuKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgcmV0KTsKKyAgICAgICAgICAgIGlmIChOdW1iZXJ6Lk9ORSAhPSByZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvclN0cnVjdHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RFbnVtKFRXTykiKTsKKyAgICAgICAgICAgIHJldCA9IGF3YWl0IGNsaWVudC50ZXN0RW51bUFzeW5jKE51bWJlcnouVFdPLCB0b2tlbik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIHJldCk7CisgICAgICAgICAgICBpZiAoTnVtYmVyei5UV08gIT0gcmV0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JTdHJ1Y3RzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0RW51bShUSFJFRSkiKTsKKyAgICAgICAgICAgIHJldCA9IGF3YWl0IGNsaWVudC50ZXN0RW51bUFzeW5jKE51bWJlcnouVEhSRUUsIHRva2VuKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgcmV0KTsKKyAgICAgICAgICAgIGlmIChOdW1iZXJ6LlRIUkVFICE9IHJldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yU3RydWN0czsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEVudW0oRklWRSkiKTsKKyAgICAgICAgICAgIHJldCA9IGF3YWl0IGNsaWVudC50ZXN0RW51bUFzeW5jKE51bWJlcnouRklWRSwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyByZXQpOworICAgICAgICAgICAgaWYgKE51bWJlcnouRklWRSAhPSByZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvclN0cnVjdHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RFbnVtKEVJR0hUKSIpOworICAgICAgICAgICAgcmV0ID0gYXdhaXQgY2xpZW50LnRlc3RFbnVtQXN5bmMoTnVtYmVyei5FSUdIVCwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyByZXQpOworICAgICAgICAgICAgaWYgKE51bWJlcnouRUlHSFQgIT0gcmV0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JTdHJ1Y3RzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0VHlwZWRlZigzMDk4NTgyMzUwODI1MjMpIik7CisgICAgICAgICAgICB2YXIgdWlkID0gYXdhaXQgY2xpZW50LnRlc3RUeXBlZGVmQXN5bmMoMzA5ODU4MjM1MDgyNTIzTCwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyB1aWQpOworICAgICAgICAgICAgaWYgKDMwOTg1ODIzNTA4MjUyM0wgIT0gdWlkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JTdHJ1Y3RzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUT0RPOiBWYWxpZGF0ZSByZWNlaXZlZCBtZXNzYWdlCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0TWFwTWFwKDEpIik7CisgICAgICAgICAgICB2YXIgbW0gPSBhd2FpdCBjbGllbnQudGVzdE1hcE1hcEFzeW5jKDEsIHRva2VuKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiA9IHsiKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBrZXkgaW4gbW0uS2V5cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGtleSArICIgPT4geyIpOworICAgICAgICAgICAgICAgIHZhciBtMiA9IG1tW2tleV07CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGsyIGluIG0yLktleXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGsyICsgIiA9PiAiICsgbTJbazJdICsgIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIn0sICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIn0iKTsKKworICAgICAgICAgICAgLy8gVE9ETzogVmFsaWRhdGUgcmVjZWl2ZWQgbWVzc2FnZQorICAgICAgICAgICAgdmFyIGluc2FuZSA9IG5ldyBJbnNhbml0eSgpOworICAgICAgICAgICAgaW5zYW5lLlVzZXJNYXAgPSBuZXcgRGljdGlvbmFyeTxOdW1iZXJ6LCBsb25nPigpOworICAgICAgICAgICAgaW5zYW5lLlVzZXJNYXBbTnVtYmVyei5GSVZFXSA9IDUwMDBMOworICAgICAgICAgICAgdmFyIHRydWNrID0gbmV3IFh0cnVjdCgpOworICAgICAgICAgICAgdHJ1Y2suU3RyaW5nX3RoaW5nID0gIlRydWNrIjsKKyAgICAgICAgICAgIHRydWNrLkJ5dGVfdGhpbmcgPSAoc2J5dGUpODsKKyAgICAgICAgICAgIHRydWNrLkkzMl90aGluZyA9IDg7CisgICAgICAgICAgICB0cnVjay5JNjRfdGhpbmcgPSA4OworICAgICAgICAgICAgaW5zYW5lLlh0cnVjdHMgPSBuZXcgTGlzdDxYdHJ1Y3Q+KCk7CisgICAgICAgICAgICBpbnNhbmUuWHRydWN0cy5BZGQodHJ1Y2spOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEluc2FuaXR5KCkiKTsKKyAgICAgICAgICAgIHZhciB3aG9hID0gYXdhaXQgY2xpZW50LnRlc3RJbnNhbml0eUFzeW5jKGluc2FuZSwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiID0geyIpOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGtleSBpbiB3aG9hLktleXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHZhbCA9IHdob2Fba2V5XTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGtleSArICIgPT4geyIpOworCisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGsyIGluIHZhbC5LZXlzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHYyID0gdmFsW2syXTsKKworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGsyICsgIiA9PiB7Iik7CisgICAgICAgICAgICAgICAgICAgIHZhciB1c2VyTWFwID0gdjIuVXNlck1hcDsKKworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ7Iik7CisgICAgICAgICAgICAgICAgICAgIGlmICh1c2VyTWFwICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBrMyBpbiB1c2VyTWFwLktleXMpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShrMyArICIgPT4gIiArIHVzZXJNYXBbazNdICsgIiwgIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJudWxsIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgifSwgIik7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHh0cnVjdHMgPSB2Mi5YdHJ1Y3RzOworCisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInsiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHh0cnVjdHMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHggaW4geHRydWN0cykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ7XCIiICsgeC5TdHJpbmdfdGhpbmcgKyAiXCIsICIgKyB4LkJ5dGVfdGhpbmcgKyAiLCAiICsgeC5JMzJfdGhpbmcgKyAiLCAiICsgeC5JMzJfdGhpbmcgKyAifSwgIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJudWxsIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgifSIpOworCisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIn0sICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ9LCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ9Iik7CisKKyAgICAgICAgICAgIHNieXRlIGFyZzAgPSAxOworICAgICAgICAgICAgdmFyIGFyZzEgPSAyOworICAgICAgICAgICAgdmFyIGFyZzIgPSBsb25nLk1heFZhbHVlOworICAgICAgICAgICAgdmFyIG11bHRpRGljdCA9IG5ldyBEaWN0aW9uYXJ5PHNob3J0LCBzdHJpbmc+KCk7CisgICAgICAgICAgICBtdWx0aURpY3RbMV0gPSAib25lIjsKKworICAgICAgICAgICAgdmFyIHRtcE11bHRpRGljdCA9IG5ldyBMaXN0PHN0cmluZz4oKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBwYWlyIGluIG11bHRpRGljdCkKKyAgICAgICAgICAgICAgICB0bXBNdWx0aURpY3QuQWRkKHBhaXIuS2V5ICsiID0+ICIrIHBhaXIuVmFsdWUpOworCisgICAgICAgICAgICB2YXIgYXJnNCA9IE51bWJlcnouRklWRTsKKyAgICAgICAgICAgIGxvbmcgYXJnNSA9IDUwMDAwMDA7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJUZXN0IE11bHRpKCIgKyBhcmcwICsgIiwiICsgYXJnMSArICIsIiArIGFyZzIgKyAiLHsiICsgc3RyaW5nLkpvaW4oIiwiLCB0bXBNdWx0aURpY3QpICsgIn0sIiArIGFyZzQgKyAiLCIgKyBhcmc1ICsgIikiKTsKKyAgICAgICAgICAgIHZhciBtdWx0aVJlc3BvbnNlID0gYXdhaXQgY2xpZW50LnRlc3RNdWx0aUFzeW5jKGFyZzAsIGFyZzEsIGFyZzIsIG11bHRpRGljdCwgYXJnNCwgYXJnNSwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiID0gWHRydWN0KGJ5dGVfdGhpbmc6IiArIG11bHRpUmVzcG9uc2UuQnl0ZV90aGluZyArICIsU3RyaW5nX3RoaW5nOiIgKyBtdWx0aVJlc3BvbnNlLlN0cmluZ190aGluZworICAgICAgICAgICAgICAgICAgICAgICAgICArICIsaTMyX3RoaW5nOiIgKyBtdWx0aVJlc3BvbnNlLkkzMl90aGluZyArICIsaTY0X3RoaW5nOiIgKyBtdWx0aVJlc3BvbnNlLkk2NF90aGluZyArICIpXG4iKTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RFeGNlcHRpb24oXCJYY2VwdGlvblwiKSIpOworICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC50ZXN0RXhjZXB0aW9uQXN5bmMoIlhjZXB0aW9uIiwgdG9rZW4pOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChleC5FcnJvckNvZGUgIT0gMTAwMSB8fCBleC5NZXNzYWdlICE9ICJYY2VwdGlvbiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RFeGNlcHRpb24oXCJURXhjZXB0aW9uXCIpIik7CisgICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LnRlc3RFeGNlcHRpb25Bc3luYygiVEV4Y2VwdGlvbiIsIHRva2VuKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChUaHJpZnQuVEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBPSworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RFeGNlcHRpb24oXCJva1wiKSIpOworICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC50ZXN0RXhjZXB0aW9uQXN5bmMoIm9rIiwgdG9rZW4pOworICAgICAgICAgICAgICAgIC8vIE9LCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgZXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0TXVsdGlFeGNlcHRpb24oXCJYY2VwdGlvblwiLCAuLi4pIik7CisgICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbkFzeW5jKCJYY2VwdGlvbiIsICJpZ25vcmUiLCB0b2tlbik7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoWGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGV4LkVycm9yQ29kZSAhPSAxMDAxIHx8IGV4Lk1lc3NhZ2UgIT0gIlRoaXMgaXMgYW4gWGNlcHRpb24iKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0TXVsdGlFeGNlcHRpb24oXCJYY2VwdGlvbjJcIiwgLi4uKSIpOworICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC50ZXN0TXVsdGlFeGNlcHRpb25Bc3luYygiWGNlcHRpb24yIiwgImlnbm9yZSIsIHRva2VuKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChYY2VwdGlvbjIgZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGV4LkVycm9yQ29kZSAhPSAyMDAyIHx8IGV4LlN0cnVjdF90aGluZy5TdHJpbmdfdGhpbmcgIT0gIlRoaXMgaXMgYW4gWGNlcHRpb24yIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgZXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdE11bHRpRXhjZXB0aW9uKFwic3VjY2Vzc1wiLCBcIk9LXCIpIik7CisgICAgICAgICAgICAgICAgaWYgKCJPSyIgIT0gKGF3YWl0IGNsaWVudC50ZXN0TXVsdGlFeGNlcHRpb25Bc3luYygic3VjY2VzcyIsICJPSyIsIHRva2VuKSkuU3RyaW5nX3RoaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHN3ID0gbmV3IFN0b3B3YXRjaCgpOworICAgICAgICAgICAgc3cuU3RhcnQoKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJUZXN0IE9uZXdheSgxKSIpOworICAgICAgICAgICAgYXdhaXQgY2xpZW50LnRlc3RPbmV3YXlBc3luYygxLCB0b2tlbik7CisgICAgICAgICAgICBzdy5TdG9wKCk7CisgICAgICAgICAgICBpZiAoc3cuRWxhcHNlZE1pbGxpc2Vjb25kcyA+IDEwMDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiVGVzdCBDYWxsdGltZSgpIik7CisgICAgICAgICAgICB2YXIgdGltZXMgPSA1MDsKKyAgICAgICAgICAgIHN3LlJlc2V0KCk7CisgICAgICAgICAgICBzdy5TdGFydCgpOworICAgICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCB0aW1lczsgKytrKQorICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC50ZXN0Vm9pZEFzeW5jKHRva2VuKTsKKyAgICAgICAgICAgIHN3LlN0b3AoKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSB7MH0gbXMgYSB0ZXN0Vm9pZCgpIGNhbGwiLCBzdy5FbGFwc2VkTWlsbGlzZWNvbmRzIC8gdGltZXMpOworICAgICAgICAgICAgcmV0dXJuIHJldHVybkNvZGU7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L25ldGNvcmUvTWFrZWZpbGUuYW0gYi90ZXN0L25ldGNvcmUvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc2ZmZiNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbmV0Y29yZS9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQxIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworU1VCRElSUyA9IC4gCisKK2FsbC1sb2NhbDoKKwkkKERPVE5FVENPUkUpIGJ1aWxkCisKK3ByZWNyb3NzOgorCSQoRE9UTkVUQ09SRSkgYnVpbGQKKworY2xlYW4tbG9jYWw6CisJJChSTSkgLXIgQ2xpZW50L2JpbgorCSQoUk0pIC1yIFNlcnZlci9iaW4KKwkkKFJNKSAtciBDbGllbnQvb2JqCisJJChSTSkgLXIgU2VydmVyL29iagorCSQoUk0pIC1yIFRocmlmdFRlc3QvVGhyaWZ0VGVzdAorCitFWFRSQV9ESVNUID0gXAorCUNsaWVudCBcCisJUkVBRE1FLm1kIFwKKwlTZXJ2ZXIgXAorCVRocmlmdFRlc3Quc2xuIFwKKwlidWlsZC5jbWQgXAorCWJ1aWxkLnNoCmRpZmYgLS1naXQgYS90ZXN0L25ldGNvcmUvUkVBRE1FLm1kIGIvdGVzdC9uZXRjb3JlL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDcyOGQxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uZXRjb3JlL1JFQURNRS5tZApAQCAtMCwwICsxLDIwIEBACisjIEFwYWNoZSBUaHJpZnQgbmV0LWNvcmUtbGliIHRlc3RzCisKK1Rlc3RzIGZvciBUaHJpZnQgY2xpZW50IGxpYnJhcnkgcG9ydGVkIHRvIE1pY3Jvc29mdCAuTmV0IENvcmUgCisKKyMgQ29udGVudAorLSBUaHJpZnRUZXN0IC0gdGVzdHMgZm9yIFRocmlmdCBsaWJyYXJ5IAorCisjIFJldXNlZCBjb21wb25lbnRzIAorLSBORVQgQ29yZSBTdGFuZGFyZCAxLjYgKFNESyAyLjAuMCkKKworIyBIb3cgdG8gYnVpbGQgb24gV2luZG93cworLSBHZXQgVGhyaWZ0IElETCBjb21waWxlciBleGVjdXRhYmxlLCBhZGQgdG8gc29tZSBmb2xkZXIgYW5kIGFkZCBwYXRoIHRvIHRoaXMgZm9sZGVyIGludG8gUEFUSCB2YXJpYWJsZQorLSBPcGVuIFRocmlmdFRlc3Quc2xuIGluIFZpc3VhbCBTdHVkaW8gYW5kIGJ1aWxkCitvciAKKy0gQnVpbGQgd2l0aCBzY3JpcHRzCisKKyMgSG93IHRvIGJ1aWxkIG9uIFVuaXgKKy0gRW5zdXJlIHlvdSBoYXZlIC5ORVQgQ29yZSAyLjAuMCBTREsgaW5zdGFsbGVkIG9yIHVzZSB0aGUgVWJ1bnR1IFhlbmlhbCBkb2NrZXIgaW1hZ2UKKy0gRm9sbG93IGNvbW1vbiBidWlsZCBwcmFjdGljZSBmb3IgVGhyaWZ0OiBib290c3RyYXAsIGNvbmZpZ3VyZSwgYW5kIG1ha2UgcHJlY3Jvc3MKKwpkaWZmIC0tZ2l0IGEvdGVzdC9uZXRjb3JlL1NlcnZlci8uZ2l0aWdub3JlIGIvdGVzdC9uZXRjb3JlL1NlcnZlci8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZDU1MTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L25ldGNvcmUvU2VydmVyLy5naXRpZ25vcmUKQEAgLTAsMCArMSwyIEBACisjIGlnbm9yZSBmb3IgYXV0b2dlbmVyYXRlZCBmaWxlcworL1RocmlmdFRlc3QKZGlmZiAtLWdpdCBhL3Rlc3QvbmV0Y29yZS9TZXJ2ZXIvUHJvZ3JhbS5jcyBiL3Rlc3QvbmV0Y29yZS9TZXJ2ZXIvUHJvZ3JhbS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjQ3ZTViCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uZXRjb3JlL1NlcnZlci9Qcm9ncmFtLmNzCkBAIC0wLDAgKzEsNzIgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFRocmlmdFRlc3Q7CisKK25hbWVzcGFjZSBTZXJ2ZXIKK3sKKyAgICBwdWJsaWMgY2xhc3MgUHJvZ3JhbQorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgTWFpbihzdHJpbmdbXSBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLlNldEJ1ZmZlclNpemUoQ29uc29sZS5CdWZmZXJXaWR0aCwgNDA5Nik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJGYWlsZWQgdG8gZ3JvdyBzY3JvbGwtYmFjayBidWZmZXIiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gc3BsaXQgbW9kZSBhbmQgb3B0aW9ucworICAgICAgICAgICAgdmFyIHN1YkFyZ3MgPSBuZXcgTGlzdDxzdHJpbmc+KGFyZ3MpOworICAgICAgICAgICAgdmFyIGZpcnN0QXJnID0gc3RyaW5nLkVtcHR5OworICAgICAgICAgICAgaWYgKHN1YkFyZ3MuQ291bnQgPiAwKQorICAgICAgICAgICAgeyAKKyAgICAgICAgICAgICAgICBmaXJzdEFyZyA9IHN1YkFyZ3NbMF07CisgICAgICAgICAgICAgICAgc3ViQXJncy5SZW1vdmVBdCgwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gcnVuIHdoYXRldmVyIG1vZGUgaXMgY2hvb3NlbgorICAgICAgICAgICAgc3dpdGNoKGZpcnN0QXJnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgInNlcnZlciI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUZXN0U2VydmVyLkV4ZWN1dGUoc3ViQXJncyk7CisgICAgICAgICAgICAgICAgY2FzZSAiLS1oZWxwIjoKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRIZWxwKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIFByaW50SGVscCgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIFByaW50SGVscCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVc2FnZToiKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIFNlcnZlciAgc2VydmVyICBbb3B0aW9uc10nIik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICBTZXJ2ZXIgIC0taGVscCIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiIpOworCisgICAgICAgICAgICBUZXN0U2VydmVyLlByaW50T3B0aW9uc0hlbHAoKTsKKyAgICAgICAgfQorICAgIH0KK30KKworCmRpZmYgLS1naXQgYS90ZXN0L25ldGNvcmUvU2VydmVyL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvdGVzdC9uZXRjb3JlL1NlcnZlci9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjU0OTVjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uZXRjb3JlL1NlcnZlci9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMCwwICsxLDQzIEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKKworLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZworLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KKworW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJTZXJ2ZXIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiVGhyaWZ0IildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoIiIpXQorCisvLyBTZXR0aW5nIENvbVZpc2libGUgdG8gZmFsc2UgbWFrZXMgdGhlIHR5cGVzIGluIHRoaXMgYXNzZW1ibHkgbm90IHZpc2libGUKKy8vIHRvIENPTSBjb21wb25lbnRzLiAgSWYgeW91IG5lZWQgdG8gYWNjZXNzIGEgdHlwZSBpbiB0aGlzIGFzc2VtYmx5IGZyb20KKy8vIENPTSwgc2V0IHRoZSBDb21WaXNpYmxlIGF0dHJpYnV0ZSB0byB0cnVlIG9uIHRoYXQgdHlwZS4KKworW2Fzc2VtYmx5OiBDb21WaXNpYmxlKGZhbHNlKV0KKworLy8gVGhlIGZvbGxvd2luZyBHVUlEIGlzIGZvciB0aGUgSUQgb2YgdGhlIHR5cGVsaWIgaWYgdGhpcyBwcm9qZWN0IGlzIGV4cG9zZWQgdG8gQ09NCisKK1thc3NlbWJseTogR3VpZCgiQjBDMTNEQTAtMzExNy00ODQ0LThBRTgtQjE3NzVFNDYyMjNEIildCisKZGlmZiAtLWdpdCBhL3Rlc3QvbmV0Y29yZS9TZXJ2ZXIvU2VydmVyLmNzcHJvaiBiL3Rlc3QvbmV0Y29yZS9TZXJ2ZXIvU2VydmVyLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjliNGIxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uZXRjb3JlL1NlcnZlci9TZXJ2ZXIuY3Nwcm9qCkBAIC0wLDAgKzEsMzEgQEAKK++7vzxQcm9qZWN0IFNkaz0iTWljcm9zb2Z0Lk5FVC5TZGsiPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrPm5ldGNvcmVhcHAyLjA8L1RhcmdldEZyYW1ld29yaz4KKyAgICA8QXNzZW1ibHlOYW1lPlNlcnZlcjwvQXNzZW1ibHlOYW1lPgorICAgIDxQYWNrYWdlSWQ+U2VydmVyPC9QYWNrYWdlSWQ+CisgICAgPE91dHB1dFR5cGU+RXhlPC9PdXRwdXRUeXBlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5VGl0bGVBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlUaXRsZUF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseURlc2NyaXB0aW9uQXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5RGVzY3JpcHRpb25BdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb25maWd1cmF0aW9uQXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29uZmlndXJhdGlvbkF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvbXBhbnlBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb21wYW55QXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5UHJvZHVjdEF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseVByb2R1Y3RBdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb3B5cmlnaHRBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb3B5cmlnaHRBdHRyaWJ1dGU+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uTmV0Lkh0dHAuV2luSHR0cEhhbmRsZXIiIFZlcnNpb249Ils0LjQsKSIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLlByaW1pdGl2ZXMiIFZlcnNpb249Ils0LjMsKSIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uU2VydmljZU1vZGVsLlByaW1pdGl2ZXMiIFZlcnNpb249Ils0LjQsKSIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uVGhyZWFkaW5nIiBWZXJzaW9uPSJbNC4zLCkiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxuZXRjb3JlXFRocmlmdFxUaHJpZnQuY3Nwcm9qIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPFRhcmdldCBOYW1lPSJQcmVCdWlsZCIgQmVmb3JlVGFyZ2V0cz0iX0dlbmVyYXRlUmVzdG9yZVByb2plY3RTcGVjO1Jlc3RvcmU7Q29tcGlsZSI+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSInJChPUyknID09ICdXaW5kb3dzX05UJyIgQ29tbWFuZD0id2hlcmUgdGhyaWZ0IiBDb25zb2xlVG9NU0J1aWxkPSJ0cnVlIj4KKyAgICAgIDxPdXRwdXQgVGFza1BhcmFtZXRlcj0iQ29uc29sZU91dHB1dCIgUHJvcGVydHlOYW1lPSJQYXRoVG9UaHJpZnQiIC8+CisgICAgPC9FeGVjPgorICAgIDxFeGVjIENvbmRpdGlvbj0iRXhpc3RzKCckKFBhdGhUb1RocmlmdCknKSIgQ29tbWFuZD0iJnF1b3Q7JChQYXRoVG9UaHJpZnQpJnF1b3Q7IC1vdXQgJChQcm9qZWN0RGlyKSAtZ2VuIG5ldGNvcmU6d2NmLHVuaW9uLHNlcmlhbCxoYXNoY29kZSAtciAuLy4uLy4uL1RocmlmdFRlc3QudGhyaWZ0IiAvPgorICAgIDxFeGVjIENvbmRpdGlvbj0iRXhpc3RzKCd0aHJpZnQnKSIgQ29tbWFuZD0idGhyaWZ0IC1vdXQgJChQcm9qZWN0RGlyKSAtZ2VuIG5ldGNvcmU6d2NmLHVuaW9uLHNlcmlhbCxoYXNoY29kZSAtciAuLy4uLy4uL1RocmlmdFRlc3QudGhyaWZ0IiAvPgorICAgIDxFeGVjIENvbmRpdGlvbj0iRXhpc3RzKCckKFByb2plY3REaXIpLy4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQnKSIgQ29tbWFuZD0iJChQcm9qZWN0RGlyKS8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1vdXQgJChQcm9qZWN0RGlyKSAtZ2VuIG5ldGNvcmU6d2NmLHVuaW9uLHNlcmlhbCxoYXNoY29kZSAtciAuLy4uLy4uL1RocmlmdFRlc3QudGhyaWZ0IiAvPgorICA8L1RhcmdldD4KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L25ldGNvcmUvU2VydmVyL1Rlc3RTZXJ2ZXIuY3MgYi90ZXN0L25ldGNvcmUvU2VydmVyL1Rlc3RTZXJ2ZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZkMzMzNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbmV0Y29yZS9TZXJ2ZXIvVGVzdFNlcnZlci5jcwpAQCAtMCwwICsxLDU5NCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uU2VjdXJpdHkuQXV0aGVudGljYXRpb247Cit1c2luZyBTeXN0ZW0uU2VjdXJpdHkuQ3J5cHRvZ3JhcGh5Llg1MDlDZXJ0aWZpY2F0ZXM7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgTWljcm9zb2Z0LkV4dGVuc2lvbnMuTG9nZ2luZzsKK3VzaW5nIFRocmlmdDsKK3VzaW5nIFRocmlmdC5Db2xsZWN0aW9uczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHM7Cit1c2luZyBUaHJpZnQuU2VydmVyOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHM7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0cy5TZXJ2ZXI7CisKK25hbWVzcGFjZSBUaHJpZnRUZXN0Cit7CisgICAgaW50ZXJuYWwgY2xhc3MgU2VydmVyUGFyYW0KKyAgICB7CisgICAgICAgIGludGVybmFsIGJvb2wgdXNlQnVmZmVyZWRTb2NrZXRzID0gZmFsc2U7CisgICAgICAgIGludGVybmFsIGJvb2wgdXNlRnJhbWVkID0gZmFsc2U7CisgICAgICAgIGludGVybmFsIGJvb2wgdXNlRW5jcnlwdGlvbiA9IGZhbHNlOworICAgICAgICBpbnRlcm5hbCBib29sIGNvbXBhY3QgPSBmYWxzZTsKKyAgICAgICAgaW50ZXJuYWwgYm9vbCBqc29uID0gZmFsc2U7CisgICAgICAgIGludGVybmFsIGludCBwb3J0ID0gOTA5MDsKKyAgICAgICAgaW50ZXJuYWwgc3RyaW5nIHBpcGUgPSBudWxsOworCisgICAgICAgIGludGVybmFsIHZvaWQgUGFyc2UoTGlzdDxzdHJpbmc+IGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5Db3VudDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChhcmdzW2ldLlN0YXJ0c1dpdGgoIi0tcGlwZT0iKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBpcGUgPSBhcmdzW2ldLlN1YnN0cmluZyhhcmdzW2ldLkluZGV4T2YoIj0iKSArIDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldLlN0YXJ0c1dpdGgoIi0tcG9ydD0iKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBvcnQgPSBpbnQuUGFyc2UoYXJnc1tpXS5TdWJzdHJpbmcoYXJnc1tpXS5JbmRleE9mKCI9IikgKyAxKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi1iIiB8fCBhcmdzW2ldID09ICItLWJ1ZmZlcmVkIiB8fCBhcmdzW2ldID09ICItLXRyYW5zcG9ydD1idWZmZXJlZCIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1c2VCdWZmZXJlZFNvY2tldHMgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItZiIgfHwgYXJnc1tpXSA9PSAiLS1mcmFtZWQiIHx8IGFyZ3NbaV0gPT0gIi0tdHJhbnNwb3J0PWZyYW1lZCIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1c2VGcmFtZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLWJpbmFyeSIgfHwgYXJnc1tpXSA9PSAiLS1wcm90b2NvbD1iaW5hcnkiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbm90aGluZyBuZWVkZWQKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS1jb21wYWN0IiB8fCBhcmdzW2ldID09ICItLXByb3RvY29sPWNvbXBhY3QiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY29tcGFjdCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi0tanNvbiIgfHwgYXJnc1tpXSA9PSAiLS1wcm90b2NvbD1qc29uIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGpzb24gPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLXRocmVhZGVkIiB8fCBhcmdzW2ldID09ICItLXNlcnZlci10eXBlPXRocmVhZGVkIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbihhcmdzW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS10aHJlYWRwb29sIiB8fCBhcmdzW2ldID09ICItLXNlcnZlci10eXBlPXRocmVhZHBvb2wiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKGFyZ3NbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLXByb3RvdHlwZSIgfHwgYXJnc1tpXSA9PSAiLS1wcm9jZXNzb3I9cHJvdG90eXBlIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbihhcmdzW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS1zc2wiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdXNlRW5jcnlwdGlvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKGFyZ3NbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIFRlc3RTZXJ2ZXIKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IF9jbGllbnRJRCA9IC0xOworICAgICAgICBwdWJsaWMgZGVsZWdhdGUgdm9pZCBUZXN0TG9nRGVsZWdhdGUoc3RyaW5nIG1zZywgcGFyYW1zIG9iamVjdFtdIHZhbHVlcyk7CisKKyAgICAgICAgcHVibGljIGNsYXNzIE15U2VydmVyRXZlbnRIYW5kbGVyIDogVFNlcnZlckV2ZW50SGFuZGxlcgorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgaW50IGNhbGxDb3VudCA9IDA7CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrIFByZVNlcnZlQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FsbENvdW50Kys7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suQ29tcGxldGVkVGFzazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2s8b2JqZWN0PiBDcmVhdGVDb250ZXh0QXN5bmMoVFByb3RvY29sIGlucHV0LCBUUHJvdG9jb2wgb3V0cHV0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYWxsQ291bnQrKzsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0PG9iamVjdD4obnVsbCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrIERlbGV0ZUNvbnRleHRBc3luYyhvYmplY3Qgc2VydmVyQ29udGV4dCwgVFByb3RvY29sIGlucHV0LCBUUHJvdG9jb2wgb3V0cHV0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYWxsQ291bnQrKzsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Db21wbGV0ZWRUYXNrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzayBQcm9jZXNzQ29udGV4dEFzeW5jKG9iamVjdCBzZXJ2ZXJDb250ZXh0LCBUQ2xpZW50VHJhbnNwb3J0IHRyYW5zcG9ydCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FsbENvdW50Kys7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suQ29tcGxldGVkVGFzazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBjbGFzcyBUZXN0SGFuZGxlckFzeW5jIDogVGhyaWZ0VGVzdC5JQXN5bmMKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIFRCYXNlU2VydmVyIHNlcnZlciB7IGdldDsgc2V0OyB9CisgICAgICAgICAgICBwcml2YXRlIGludCBoYW5kbGVySUQ7CisgICAgICAgICAgICBwcml2YXRlIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgcHJpdmF0ZSBUZXN0TG9nRGVsZWdhdGUgbG9nZ2VyOworCisgICAgICAgICAgICBwdWJsaWMgVGVzdEhhbmRsZXJBc3luYygpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGFuZGxlcklEID0gSW50ZXJsb2NrZWQuSW5jcmVtZW50KHJlZiBfY2xpZW50SUQpOworICAgICAgICAgICAgICAgIGxvZ2dlciArPSB0ZXN0Q29uc29sZUxvZ2dlcjsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKCJOZXcgVGVzdEhhbmRsZXIgaW5zdGFuY2UgY3JlYXRlZCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc29sZUxvZ2dlcihzdHJpbmcgbXNnLCBwYXJhbXMgb2JqZWN0W10gdmFsdWVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNiLkNsZWFyKCk7CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kRm9ybWF0KCJoYW5kbGVyezA6RDN9OiIsIGhhbmRsZXJJRCk7CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kRm9ybWF0KG1zZywgdmFsdWVzKTsKKyAgICAgICAgICAgICAgICBzYi5BcHBlbmRMaW5lKCk7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShzYi5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2sgdGVzdFZvaWRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKCJ0ZXN0Vm9pZCgpIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suQ29tcGxldGVkVGFzazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2s8c3RyaW5nPiB0ZXN0U3RyaW5nQXN5bmMoc3RyaW5nIHRoaW5nLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKCJ0ZXN0U3RyaW5nKHswfSkiLCB0aGluZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdCh0aGluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrPGJvb2w+IHRlc3RCb29sQXN5bmMoYm9vbCB0aGluZywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZSgidGVzdEJvb2woezB9KSIsIHRoaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KHRoaW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2s8c2J5dGU+IHRlc3RCeXRlQXN5bmMoc2J5dGUgdGhpbmcsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2UoInRlc3RCeXRlKHswfSkiLCB0aGluZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdCh0aGluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrPGludD4gdGVzdEkzMkFzeW5jKGludCB0aGluZywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZSgidGVzdEkzMih7MH0pIiwgdGhpbmcpOworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQodGhpbmcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzazxsb25nPiB0ZXN0STY0QXN5bmMobG9uZyB0aGluZywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZSgidGVzdEk2NCh7MH0pIiwgdGhpbmcpOworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQodGhpbmcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzazxkb3VibGU+IHRlc3REb3VibGVBc3luYyhkb3VibGUgdGhpbmcsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2UoInRlc3REb3VibGUoezB9KSIsIHRoaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KHRoaW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2s8Ynl0ZVtdPiB0ZXN0QmluYXJ5QXN5bmMoYnl0ZVtdIHRoaW5nLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgaGV4ID0gQml0Q29udmVydGVyLlRvU3RyaW5nKHRoaW5nKS5SZXBsYWNlKCItIiwgc3RyaW5nLkVtcHR5KTsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKCJ0ZXN0QmluYXJ5KHswOlh9KSIsIGhleCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdCh0aGluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrPFh0cnVjdD4gdGVzdFN0cnVjdEFzeW5jKFh0cnVjdCB0aGluZywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZSgidGVzdFN0cnVjdCh7e1wiezB9XCIsIHsxfSwgezJ9LCB7M319fSkiLCB0aGluZy5TdHJpbmdfdGhpbmcsIHRoaW5nLkJ5dGVfdGhpbmcsIHRoaW5nLkkzMl90aGluZywgdGhpbmcuSTY0X3RoaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KHRoaW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2s8WHRydWN0Mj4gdGVzdE5lc3RBc3luYyhYdHJ1Y3QyIG5lc3QsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB0aGluZyA9IG5lc3QuU3RydWN0X3RoaW5nOworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2UoInRlc3ROZXN0KHt7ezB9LCB7e1wiezF9XCIsIHsyfSwgezN9LCB7NH0sIHs1fX19fX0pIiwKKyAgICAgICAgICAgICAgICAgICAgbmVzdC5CeXRlX3RoaW5nLAorICAgICAgICAgICAgICAgICAgICB0aGluZy5TdHJpbmdfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgIHRoaW5nLkJ5dGVfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgIHRoaW5nLkkzMl90aGluZywKKyAgICAgICAgICAgICAgICAgICAgdGhpbmcuSTY0X3RoaW5nLAorICAgICAgICAgICAgICAgICAgICBuZXN0LkkzMl90aGluZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdChuZXN0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2s8RGljdGlvbmFyeTxpbnQsIGludD4+IHRlc3RNYXBBc3luYyhEaWN0aW9uYXJ5PGludCwgaW50PiB0aGluZywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2IuQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICBzYi5BcHBlbmQoInRlc3RNYXAoe3siKTsKKyAgICAgICAgICAgICAgICB2YXIgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBrZXkgaW4gdGhpbmcuS2V5cykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmRGb3JtYXQoInswfSA9PiB7MX0iLCBrZXksIHRoaW5nW2tleV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzYi5BcHBlbmQoIn19KSIpOworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2Uoc2IuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdCh0aGluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrPERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+PiB0ZXN0U3RyaW5nTWFwQXN5bmMoRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4gdGhpbmcsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNiLkNsZWFyKCk7CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCJ0ZXN0U3RyaW5nTWFwKHt7Iik7CisgICAgICAgICAgICAgICAgdmFyIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIga2V5IGluIHRoaW5nLktleXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoIiwgIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kRm9ybWF0KCJ7MH0gPT4gezF9Iiwga2V5LCB0aGluZ1trZXldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCJ9fSkiKTsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKHNiLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQodGhpbmcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzazxUSGFzaFNldDxpbnQ+PiB0ZXN0U2V0QXN5bmMoVEhhc2hTZXQ8aW50PiB0aGluZywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2IuQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICBzYi5BcHBlbmQoInRlc3RTZXQoe3siKTsKKyAgICAgICAgICAgICAgICB2YXIgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKGludCBlbGVtIGluIHRoaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCIsICIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZEZvcm1hdCgiezB9IiwgZWxlbSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgifX0pIik7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZShzYi5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KHRoaW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2s8TGlzdDxpbnQ+PiB0ZXN0TGlzdEFzeW5jKExpc3Q8aW50PiB0aGluZywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2IuQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICBzYi5BcHBlbmQoInRlc3RMaXN0KHt7Iik7CisgICAgICAgICAgICAgICAgdmFyIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgZWxlbSBpbiB0aGluZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmRGb3JtYXQoInswfSIsIGVsZW0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzYi5BcHBlbmQoIn19KSIpOworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2Uoc2IuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdCh0aGluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrPE51bWJlcno+IHRlc3RFbnVtQXN5bmMoTnVtYmVyeiB0aGluZywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZSgidGVzdEVudW0oezB9KSIsIHRoaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KHRoaW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2s8bG9uZz4gdGVzdFR5cGVkZWZBc3luYyhsb25nIHRoaW5nLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKCJ0ZXN0VHlwZWRlZih7MH0pIiwgdGhpbmcpOworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQodGhpbmcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzazxEaWN0aW9uYXJ5PGludCwgRGljdGlvbmFyeTxpbnQsIGludD4+PiB0ZXN0TWFwTWFwQXN5bmMoaW50IGhlbGxvLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKCJ0ZXN0TWFwTWFwKHswfSkiLCBoZWxsbyk7CisgICAgICAgICAgICAgICAgdmFyIG1hcG1hcCA9IG5ldyBEaWN0aW9uYXJ5PGludCwgRGljdGlvbmFyeTxpbnQsIGludD4+KCk7CisKKyAgICAgICAgICAgICAgICB2YXIgcG9zID0gbmV3IERpY3Rpb25hcnk8aW50LCBpbnQ+KCk7CisgICAgICAgICAgICAgICAgdmFyIG5lZyA9IG5ldyBEaWN0aW9uYXJ5PGludCwgaW50PigpOworICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgNTsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcG9zW2ldID0gaTsKKyAgICAgICAgICAgICAgICAgICAgbmVnWy1pXSA9IC1pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1hcG1hcFs0XSA9IHBvczsKKyAgICAgICAgICAgICAgICBtYXBtYXBbLTRdID0gbmVnOworCisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdChtYXBtYXApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzazxEaWN0aW9uYXJ5PGxvbmcsIERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+Pj4gdGVzdEluc2FuaXR5QXN5bmMoSW5zYW5pdHkgYXJndW1lbnQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2UoInRlc3RJbnNhbml0eSgpIik7CisKKyAgICAgICAgICAgICAgICAvKiogZnJvbSBUaHJpZnRUZXN0LnRocmlmdDoKKyAgICAgICAgICAgICAgICAgKiBTbyB5b3UgdGhpbmsgeW91J3ZlIGdvdCB0aGlzIGFsbCB3b3JrZWQsIG91dCBlaD8KKyAgICAgICAgICAgICAgICAgKgorICAgICAgICAgICAgICAgICAqIENyZWF0ZXMgYSB0aGUgcmV0dXJuZWQgbWFwIHdpdGggdGhlc2UgdmFsdWVzIGFuZCBwcmludHMgaXQgb3V0OgorICAgICAgICAgICAgICAgICAqICAgeyAxID0+IHsgMiA9PiBhcmd1bWVudCwKKyAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgIDMgPT4gYXJndW1lbnQsCisgICAgICAgICAgICAgICAgICogICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgKiAgICAgMiA9PiB7IDYgPT4gPGVtcHR5IEluc2FuaXR5IHN0cnVjdD4sIH0sCisgICAgICAgICAgICAgICAgICogICB9CisgICAgICAgICAgICAgICAgICogQHJldHVybiBtYXA8VXNlcklkLCBtYXA8TnVtYmVyeixJbnNhbml0eT4+IC0gYSBtYXAgd2l0aCB0aGUgYWJvdmUgdmFsdWVzCisgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgICB2YXIgZmlyc3RfbWFwID0gbmV3IERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+KCk7CisgICAgICAgICAgICAgICAgdmFyIHNlY29uZF9tYXAgPSBuZXcgRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4oKTsgOworCisgICAgICAgICAgICAgICAgZmlyc3RfbWFwW051bWJlcnouVFdPXSA9IGFyZ3VtZW50OworICAgICAgICAgICAgICAgIGZpcnN0X21hcFtOdW1iZXJ6LlRIUkVFXSA9IGFyZ3VtZW50OworCisgICAgICAgICAgICAgICAgc2Vjb25kX21hcFtOdW1iZXJ6LlNJWF0gPSBuZXcgSW5zYW5pdHkoKTsKKworICAgICAgICAgICAgICAgIHZhciBpbnNhbmUgPSBuZXcgRGljdGlvbmFyeTxsb25nLCBEaWN0aW9uYXJ5PE51bWJlcnosIEluc2FuaXR5Pj4KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFsxXSA9IGZpcnN0X21hcCwKKyAgICAgICAgICAgICAgICAgICAgWzJdID0gc2Vjb25kX21hcAorICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KGluc2FuZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrPFh0cnVjdD4gdGVzdE11bHRpQXN5bmMoc2J5dGUgYXJnMCwgaW50IGFyZzEsIGxvbmcgYXJnMiwgRGljdGlvbmFyeTxzaG9ydCwgc3RyaW5nPiBhcmczLCBOdW1iZXJ6IGFyZzQsIGxvbmcgYXJnNSwKKyAgICAgICAgICAgICAgICBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKCJ0ZXN0TXVsdGkoKSIpOworCisgICAgICAgICAgICAgICAgdmFyIGhlbGxvID0gbmV3IFh0cnVjdCgpOyA7CisgICAgICAgICAgICAgICAgaGVsbG8uU3RyaW5nX3RoaW5nID0gIkhlbGxvMiI7CisgICAgICAgICAgICAgICAgaGVsbG8uQnl0ZV90aGluZyA9IGFyZzA7CisgICAgICAgICAgICAgICAgaGVsbG8uSTMyX3RoaW5nID0gYXJnMTsKKyAgICAgICAgICAgICAgICBoZWxsby5JNjRfdGhpbmcgPSBhcmcyOworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQoaGVsbG8pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzayB0ZXN0RXhjZXB0aW9uQXN5bmMoc3RyaW5nIGFyZywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZSgidGVzdEV4Y2VwdGlvbih7MH0pIiwgYXJnKTsKKyAgICAgICAgICAgICAgICBpZiAoYXJnID09ICJYY2VwdGlvbiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgeCA9IG5ldyBYY2VwdGlvbgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBFcnJvckNvZGUgPSAxMDAxLAorICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9IGFyZworICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICB0aHJvdyB4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYXJnID09ICJURXhjZXB0aW9uIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkNvbXBsZXRlZFRhc2s7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrPFh0cnVjdD4gdGVzdE11bHRpRXhjZXB0aW9uQXN5bmMoc3RyaW5nIGFyZzAsIHN0cmluZyBhcmcxLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKCJ0ZXN0TXVsdGlFeGNlcHRpb24oezB9LCB7MX0pIiwgYXJnMCwgYXJnMSk7CisgICAgICAgICAgICAgICAgaWYgKGFyZzAgPT0gIlhjZXB0aW9uIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciB4ID0gbmV3IFhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9IDEwMDEsCisgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0gIlRoaXMgaXMgYW4gWGNlcHRpb24iCisgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgIHRocm93IHg7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGFyZzAgPT0gIlhjZXB0aW9uMiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgeCA9IG5ldyBYY2VwdGlvbjIKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0gMjAwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cnVjdF90aGluZyA9IG5ldyBYdHJ1Y3QgeyBTdHJpbmdfdGhpbmcgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbjIiIH0KKyAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgeDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IFh0cnVjdCB7IFN0cmluZ190aGluZyA9IGFyZzEgfTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KHJlc3VsdCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrIHRlc3RPbmV3YXlBc3luYyhpbnQgc2Vjb25kc1RvU2xlZXAsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2UoInRlc3RPbmV3YXkoezB9KSwgc2xlZXBpbmcuLi4iLCBzZWNvbmRzVG9TbGVlcCk7CisgICAgICAgICAgICAgICAgVGFzay5EZWxheShzZWNvbmRzVG9TbGVlcCAqIDEwMDAsIGNhbmNlbGxhdGlvblRva2VuKS5HZXRBd2FpdGVyKCkuR2V0UmVzdWx0KCk7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZSgidGVzdE9uZXdheSBmaW5pc2hlZCIpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suQ29tcGxldGVkVGFzazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGludGVybmFsIHN0YXRpYyB2b2lkIFByaW50T3B0aW9uc0hlbHAoKQorICAgICAgICB7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiU2VydmVyIG9wdGlvbnM6Iik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICAtLXBpcGU9PHBpcGUgbmFtZT4iKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIC0tcG9ydD08cG9ydCBudW1iZXI+Iik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICAtLXRyYW5zcG9ydD08dHJhbnNwb3J0IG5hbWU+ICAgIG9uZSBvZiBidWZmZXJlZCxmcmFtZWQgIChkZWZhdWx0cyB0byBub25lKSIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiAgLS1wcm90b2NvbD08cHJvdG9jb2wgbmFtZT4gICAgICBvbmUgb2YgY29tcGFjdCxqc29uICAoZGVmYXVsdHMgdG8gYmluYXJ5KSIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiAgLS1zZXJ2ZXItdHlwZT08dHlwZT4gICAgICAgICAgICBvbmUgb2YgdGhyZWFkZWQsdGhyZWFkcG9vbCAgKGRlZmF1bHRzIHRvIHNpbXBsZSkiKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIC0tcHJvY2Vzc29yPTxwcm90b3R5cGU+Iik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICAtLXNzbCIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFg1MDlDZXJ0aWZpY2F0ZTIgR2V0U2VydmVyQ2VydCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBzZXJ2ZXJDZXJ0TmFtZSA9ICJzZXJ2ZXIucDEyIjsKKyAgICAgICAgICAgIHZhciBwb3NzaWJsZVBhdGhzID0gbmV3IExpc3Q8c3RyaW5nPgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICIuLi8uLi8uLi9rZXlzLyIsCisgICAgICAgICAgICAgICAgIi4uLy4uL2tleXMvIiwKKyAgICAgICAgICAgICAgICAiLi4va2V5cy8iLAorICAgICAgICAgICAgICAgICJrZXlzLyIsCisgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBzdHJpbmcgZXhpc3RpbmdQYXRoID0gbnVsbDsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBwb3NzaWJsZVBhdGggaW4gcG9zc2libGVQYXRocykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgcGF0aCA9IFBhdGguR2V0RnVsbFBhdGgocG9zc2libGVQYXRoICsgc2VydmVyQ2VydE5hbWUpOworICAgICAgICAgICAgICAgIGlmIChGaWxlLkV4aXN0cyhwYXRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nUGF0aCA9IHBhdGg7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KGV4aXN0aW5nUGF0aCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigkIkNhbm5vdCBmaW5kIGZpbGU6IHtzZXJ2ZXJDZXJ0TmFtZX0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgdmFyIGNlcnQgPSBuZXcgWDUwOUNlcnRpZmljYXRlMihleGlzdGluZ1BhdGgsICJ0aHJpZnQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgcmV0dXJuIGNlcnQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGludCBFeGVjdXRlKExpc3Q8c3RyaW5nPiBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgbG9nZ2VyRmFjdG9yeSA9IG5ldyBMb2dnZXJGYWN0b3J5KCk7Ly8uQWRkQ29uc29sZSgpLkFkZERlYnVnKCk7CisgICAgICAgICAgICB2YXIgbG9nZ2VyID0gbmV3IExvZ2dlckZhY3RvcnkoKS5DcmVhdGVMb2dnZXIoIlRlc3QiKTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHBhcmFtID0gbmV3IFNlcnZlclBhcmFtKCk7CisKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtLlBhcnNlKGFyZ3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJFcnJvciB3aGlsZSAgcGFyc2luZyBhcmd1bWVudHMiKTsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAvLyBUcmFuc3BvcnQKKyAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHRyYW5zOworICAgICAgICAgICAgICAgIGlmIChwYXJhbS5waXBlICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0KHBhcmFtLnBpcGUpOworICAgICAgICAgICAgICAgIH0KKy8vICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLnVzZUZyYW1lZCkKKy8vICAgICAgICAgICAgICAgIHsKKy8vICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUU2VydmVyRnJhbWVkVHJhbnNwb3J0KHBhcmFtLnBvcnQpOworLy8gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbS51c2VFbmNyeXB0aW9uKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2VydCA9IEdldFNlcnZlckNlcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNlcnQgPT0gbnVsbCB8fCAhY2VydC5IYXNQcml2YXRlS2V5KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJDZXJ0aWZpY2F0ZSBkb2Vzbid0IGNvbnRhaW4gcHJpdmF0ZSBrZXkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVFRsc1NlcnZlclNvY2tldFRyYW5zcG9ydChwYXJhbS5wb3J0LCBwYXJhbS51c2VCdWZmZXJlZFNvY2tldHMsIHBhcmFtLnVzZUZyYW1lZCwgY2VydCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbmRlciwgY2VydGlmaWNhdGUsIGNoYWluLCBlcnJvcnMpID0+IHRydWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIFNzbFByb3RvY29scy5UbHMgfCBTc2xQcm90b2NvbHMuVGxzMTEgfCBTc2xQcm90b2NvbHMuVGxzMTIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVFNlcnZlclNvY2tldFRyYW5zcG9ydChwYXJhbS5wb3J0LCAwLCBwYXJhbS51c2VCdWZmZXJlZFNvY2tldHMsIHBhcmFtLnVzZUZyYW1lZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBJVFByb3RvY29sRmFjdG9yeSBwcm90bzsKKyAgICAgICAgICAgICAgICBpZiAocGFyYW0uY29tcGFjdCkKKyAgICAgICAgICAgICAgICAgICAgcHJvdG8gPSBuZXcgVENvbXBhY3RQcm90b2NvbC5GYWN0b3J5KCk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0uanNvbikKKyAgICAgICAgICAgICAgICAgICAgcHJvdG8gPSBuZXcgVEpzb25Qcm90b2NvbC5GYWN0b3J5KCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBwcm90byA9IG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpOworCisgICAgICAgICAgICAgICAgSVRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3Rvcnk7CisKKyAgICAgICAgICAgICAgICAvLyBQcm9jZXNzb3IKKyAgICAgICAgICAgICAgICB2YXIgdGVzdEhhbmRsZXIgPSBuZXcgVGVzdEhhbmRsZXJBc3luYygpOworICAgICAgICAgICAgICAgIHZhciB0ZXN0UHJvY2Vzc29yID0gbmV3IFRocmlmdFRlc3QuQXN5bmNQcm9jZXNzb3IodGVzdEhhbmRsZXIpOworICAgICAgICAgICAgICAgIHByb2Nlc3NvckZhY3RvcnkgPSBuZXcgU2luZ2xldG9uVFByb2Nlc3NvckZhY3RvcnkodGVzdFByb2Nlc3Nvcik7CisKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc0ZhY3RvcnkgPSBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKTsgCisKKyAgICAgICAgICAgICAgICBUQmFzZVNlcnZlciBzZXJ2ZXJFbmdpbmUgPSBuZXcgQXN5bmNCYXNlU2VydmVyKHByb2Nlc3NvckZhY3RvcnksIHRyYW5zLCB0cmFuc0ZhY3RvcnksIHRyYW5zRmFjdG9yeSwgcHJvdG8sIHByb3RvLCBsb2dnZXIpOworCisgICAgICAgICAgICAgICAgLy9TZXJ2ZXIgZXZlbnQgaGFuZGxlcgorICAgICAgICAgICAgICAgIHZhciBzZXJ2ZXJFdmVudHMgPSBuZXcgTXlTZXJ2ZXJFdmVudEhhbmRsZXIoKTsKKyAgICAgICAgICAgICAgICBzZXJ2ZXJFbmdpbmUuU2V0RXZlbnRIYW5kbGVyKHNlcnZlckV2ZW50cyk7CisKKyAgICAgICAgICAgICAgICAvLyBSdW4gaXQKKyAgICAgICAgICAgICAgICB2YXIgd2hlcmUgPSAoISBzdHJpbmcuSXNOdWxsT3JFbXB0eShwYXJhbS5waXBlKSkgPyAib24gcGlwZSAiICsgcGFyYW0ucGlwZSA6ICJvbiBwb3J0ICIgKyBwYXJhbS5wb3J0OworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJTdGFydGluZyB0aGUgQXN5bmNCYXNlU2VydmVyICIgKyB3aGVyZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB3aXRoIHByb2Nlc3NvciBUUHJvdG90eXBlUHJvY2Vzc29yRmFjdG9yeSBwcm90b3R5cGUgZmFjdG9yeSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFyYW0udXNlQnVmZmVyZWRTb2NrZXRzID8gIiB3aXRoIGJ1ZmZlcmVkIHNvY2tldCIgOiAiIikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYXJhbS51c2VGcmFtZWQgPyAiIHdpdGggZnJhbWVkIHRyYW5zcG9ydCIgOiAiIikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYXJhbS51c2VFbmNyeXB0aW9uID8gIiB3aXRoIGVuY3J5cHRpb24iIDogIiIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFyYW0uY29tcGFjdCA/ICIgd2l0aCBjb21wYWN0IHByb3RvY29sIiA6ICIiKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhcmFtLmpzb24gPyAiIHdpdGgganNvbiBwcm90b2NvbCIgOiAiIikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuLi4iKTsKKyAgICAgICAgICAgICAgICBzZXJ2ZXJFbmdpbmUuU2VydmVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKS5HZXRBd2FpdGVyKCkuR2V0UmVzdWx0KCk7CisgICAgICAgICAgICAgICAgQ29uc29sZS5SZWFkTGluZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiB4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuRXJyb3IuV3JpdGUoeCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiZG9uZS4iKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0L25ldGNvcmUvVGhyaWZ0VGVzdC5zbG4gYi90ZXN0L25ldGNvcmUvVGhyaWZ0VGVzdC5zbG4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFiMjQxYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbmV0Y29yZS9UaHJpZnRUZXN0LnNsbgpAQCAtMCwwICsxLDY0IEBACivvu79NaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiAxMi4wMAorIyBWaXN1YWwgU3R1ZGlvIDE1CitWaXN1YWxTdHVkaW9WZXJzaW9uID0gMTUuMC4yNjczMC4xMgorTWluaW11bVZpc3VhbFN0dWRpb1ZlcnNpb24gPSAxMC4wLjQwMjE5LjEKK1Byb2plY3QoIns5QTE5MTAzRi0xNkY3LTQ2NjgtQkU1NC05QTFFN0E0Rjc1NTZ9IikgPSAiVGhyaWZ0IiwgIi4uXC4uXGxpYlxuZXRjb3JlXFRocmlmdFxUaHJpZnQuY3Nwcm9qIiwgIntDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9IgorRW5kUHJvamVjdAorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJDbGllbnQiLCAiQ2xpZW50XENsaWVudC5jc3Byb2oiLCAiezIxMDM5RjI1LTZFRDctNEU4MC1BNTQ1LUVCQzkzNDcyRUJEMX0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlNlcnZlciIsICJTZXJ2ZXJcU2VydmVyLmNzcHJvaiIsICJ7MEM2RTg2ODUtRjE5MS00NDc5LTk4NDItODgyQTM4OTYxMTI3fSIKK0VuZFByb2plY3QKK0dsb2JhbAorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Db25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHByZVNvbHV0aW9uCisJCURlYnVnfEFueSBDUFUgPSBEZWJ1Z3xBbnkgQ1BVCisJCURlYnVnfHg2NCA9IERlYnVnfHg2NAorCQlEZWJ1Z3x4ODYgPSBEZWJ1Z3x4ODYKKwkJUmVsZWFzZXxBbnkgQ1BVID0gUmVsZWFzZXxBbnkgQ1BVCisJCVJlbGVhc2V8eDY0ID0gUmVsZWFzZXx4NjQKKwkJUmVsZWFzZXx4ODYgPSBSZWxlYXNlfHg4NgorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHBvc3RTb2x1dGlvbgorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uRGVidWd8eDg2LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uRGVidWd8eDg2LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uUmVsZWFzZXx4ODYuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LlJlbGVhc2V8eDg2LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJezIxMDM5RjI1LTZFRDctNEU4MC1BNTQ1LUVCQzkzNDcyRUJEMX0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXsyMTAzOUYyNS02RUQ3LTRFODAtQTU0NS1FQkM5MzQ3MkVCRDF9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezIxMDM5RjI1LTZFRDctNEU4MC1BNTQ1LUVCQzkzNDcyRUJEMX0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezIxMDM5RjI1LTZFRDctNEU4MC1BNTQ1LUVCQzkzNDcyRUJEMX0uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXsyMTAzOUYyNS02RUQ3LTRFODAtQTU0NS1FQkM5MzQ3MkVCRDF9LkRlYnVnfHg4Ni5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXsyMTAzOUYyNS02RUQ3LTRFODAtQTU0NS1FQkM5MzQ3MkVCRDF9LkRlYnVnfHg4Ni5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7MjEwMzlGMjUtNkVENy00RTgwLUE1NDUtRUJDOTM0NzJFQkQxfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXsyMTAzOUYyNS02RUQ3LTRFODAtQTU0NS1FQkM5MzQ3MkVCRDF9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXsyMTAzOUYyNS02RUQ3LTRFODAtQTU0NS1FQkM5MzQ3MkVCRDF9LlJlbGVhc2V8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7MjEwMzlGMjUtNkVENy00RTgwLUE1NDUtRUJDOTM0NzJFQkQxfS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXsyMTAzOUYyNS02RUQ3LTRFODAtQTU0NS1FQkM5MzQ3MkVCRDF9LlJlbGVhc2V8eDg2LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7MjEwMzlGMjUtNkVENy00RTgwLUE1NDUtRUJDOTM0NzJFQkQxfS5SZWxlYXNlfHg4Ni5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXswQzZFODY4NS1GMTkxLTQ0NzktOTg0Mi04ODJBMzg5NjExMjd9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7MEM2RTg2ODUtRjE5MS00NDc5LTk4NDItODgyQTM4OTYxMTI3fS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXswQzZFODY4NS1GMTkxLTQ0NzktOTg0Mi04ODJBMzg5NjExMjd9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXswQzZFODY4NS1GMTkxLTQ0NzktOTg0Mi04ODJBMzg5NjExMjd9LkRlYnVnfHg2NC5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7MEM2RTg2ODUtRjE5MS00NDc5LTk4NDItODgyQTM4OTYxMTI3fS5EZWJ1Z3x4ODYuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7MEM2RTg2ODUtRjE5MS00NDc5LTk4NDItODgyQTM4OTYxMTI3fS5EZWJ1Z3x4ODYuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezBDNkU4Njg1LUYxOTEtNDQ3OS05ODQyLTg4MkEzODk2MTEyN30uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7MEM2RTg2ODUtRjE5MS00NDc5LTk4NDItODgyQTM4OTYxMTI3fS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7MEM2RTg2ODUtRjE5MS00NDc5LTk4NDItODgyQTM4OTYxMTI3fS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezBDNkU4Njg1LUYxOTEtNDQ3OS05ODQyLTg4MkEzODk2MTEyN30uUmVsZWFzZXx4NjQuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7MEM2RTg2ODUtRjE5MS00NDc5LTk4NDItODgyQTM4OTYxMTI3fS5SZWxlYXNlfHg4Ni5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezBDNkU4Njg1LUYxOTEtNDQ3OS05ODQyLTg4MkEzODk2MTEyN30uUmVsZWFzZXx4ODYuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uUHJvcGVydGllcykgPSBwcmVTb2x1dGlvbgorCQlIaWRlU29sdXRpb25Ob2RlID0gRkFMU0UKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihFeHRlbnNpYmlsaXR5R2xvYmFscykgPSBwb3N0U29sdXRpb24KKwkJU29sdXRpb25HdWlkID0gezUyQ0U5QTEyLUY2Q0ItNEYwQy1CQjQyLTAxMDU2MTJGNUZGNH0KKwlFbmRHbG9iYWxTZWN0aW9uCitFbmRHbG9iYWwKZGlmZiAtLWdpdCBhL3Rlc3QvbmV0Y29yZS9idWlsZC5jbWQgYi90ZXN0L25ldGNvcmUvYnVpbGQuY21kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliODRlZjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L25ldGNvcmUvYnVpbGQuY21kCkBAIC0wLDAgKzEsMjUgQEAKK0BlY2hvIG9mZgorcmVtIC8qCityZW0gICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorcmVtICAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCityZW0gICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlbSAgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3JlbSAgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCityZW0gICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorcmVtICAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorcmVtICAqCityZW0gICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKK3JlbSAgKgorcmVtICAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3JlbSAgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorcmVtICAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorcmVtICAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCityZW0gICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworcmVtICAqIHVuZGVyIHRoZSBMaWNlbnNlLgorcmVtICAqLworc2V0bG9jYWwKKworZG90bmV0IC0taW5mbworZG90bmV0IGJ1aWxkCisKKzplb2YKZGlmZiAtLWdpdCBhL3Rlc3QvbmV0Y29yZS9idWlsZC5zaCBiL3Rlc3QvbmV0Y29yZS9idWlsZC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jOTdlMzEwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uZXRjb3JlL2J1aWxkLnNoCkBAIC0wLDAgKzEsMjYgQEAKKyMhL3Vzci9iaW4vZW52IGJhc2gKKworIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyNleGl0IGlmIGFueSBjb21tYW5kIGZhaWxzCitzZXQgLWUKKworZG90bmV0IC0taW5mbworZG90bmV0IGJ1aWxkCmRpZmYgLS1naXQgYS90ZXN0L3BlcmwvTWFrZWZpbGUuYW0gYi90ZXN0L3BlcmwvTWFrZWZpbGUuYW0KaW5kZXggZDk3NWY2OS4uMTY1YjlhNyAxMDA2NDQKLS0tIGEvdGVzdC9wZXJsL01ha2VmaWxlLmFtCisrKyBiL3Rlc3QvcGVybC9NYWtlZmlsZS5hbQpAQCAtMTcsOCArMTcsNiBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotVEhSSUZUID0gJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKLQogc3R1YnM6IC4uL1RocmlmdFRlc3QudGhyaWZ0CiAJJChUSFJJRlQpIC0tZ2VuIHBlcmwgLi4vVGhyaWZ0VGVzdC50aHJpZnQKIApkaWZmIC0tZ2l0IGEvdGVzdC9wZXJsL1Rlc3RDbGllbnQucGwgYi90ZXN0L3BlcmwvVGVzdENsaWVudC5wbAppbmRleCA5ZDRhYWIyLi45NmUzYmVjIDEwMDc1NQotLS0gYS90ZXN0L3BlcmwvVGVzdENsaWVudC5wbAorKysgYi90ZXN0L3BlcmwvVGVzdENsaWVudC5wbApAQCAtMTksNyArMTksNyBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotcmVxdWlyZSA1LjYuMDsKK3VzZSA1LjEwLjA7CiB1c2Ugc3RyaWN0OwogdXNlIHdhcm5pbmdzOwogdXNlIERhdGE6OkR1bXBlcjsKQEAgLTMzLDI3ICszMywzNSBAQAogdXNlIFRocmlmdDo6QmluYXJ5UHJvdG9jb2w7CiB1c2UgVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydDsKIHVzZSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydDsKK3VzZSBUaHJpZnQ6Ok11bHRpcGxleGVkUHJvdG9jb2w7CiB1c2UgVGhyaWZ0OjpTU0xTb2NrZXQ7CiB1c2UgVGhyaWZ0OjpTb2NrZXQ7Cit1c2UgVGhyaWZ0OjpVbml4U29ja2V0OwogCit1c2UgVGhyaWZ0VGVzdDo6U2Vjb25kU2VydmljZTsKIHVzZSBUaHJpZnRUZXN0OjpUaHJpZnRUZXN0OwogdXNlIFRocmlmdFRlc3Q6OlR5cGVzOwogCiAkfCsrOwogCiBzdWIgdXNhZ2UgewotICAgIHByaW50IDw8RU9GOworICAgIHByaW50IDw8IkVPRiI7CiBVc2FnZTogJDAgW09QVElPTlNdCiAKIE9wdGlvbnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCkKKyAgLS1jYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0EgdG8gdmFsaWRhdGUgc2VydmVyIHdpdGguCiAgIC0tY2VydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlcnRpZmljYXRlIHRvIHVzZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWlyZWQgaWYgdXNpbmcgLS1zc2wuCisgIC0tY2lwaGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjY2VwdGFibGUgY2lwaGVyIGxpc3QuCisgIC0tZG9tYWluLXNvY2tldCA8ZmlsZT4gICAgICAgICAgICAgICAgICAgICAgIFVzZSBhIHVuaXggZG9tYWluIHNvY2tldC4KICAgLS1oZWxwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hvdyB1c2FnZS4KKyAgLS1rZXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VydGlmaWNhdGUga2V5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1aXJlZCBpZiB1c2luZyAtLXNzbC4KICAgLS1wb3J0IDxwb3J0bnVtPiAgICAgICAgICAgICAgICA5MDkwICAgICAgICAgUG9ydCB0byB1c2UuCiAgIC0tcHJvdG9jb2wge2JpbmFyeX0gICAgICAgICAgICAgYmluYXJ5ICAgICAgIFByb3RvY29sIHRvIHVzZS4KICAgLS1zc2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgcHJlc2VudCwgdXNlIFNTTC4KICAgLS10cmFuc3BvcnQge2J1ZmZlcmVkfGZyYW1lZH0gICBidWZmZXJlZCAgICAgVHJhbnNwb3J0IHRvIHVzZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKIEVPRgogfQogCkBAIC02NCw3ICs3MiwxMSBAQAogKTsKIAogR2V0T3B0aW9ucyhcJW9wdHMsIHF3ICgKKyAgICBjYT1zCiAgICAgY2VydD1zCisgICAgY2lwaGVycz1zCisgICAga2V5PXMKKyAgICBkb21haW4tc29ja2V0PXMKICAgICBoZWxwCiAgICAgaG9zdD1zCiAgICAgcG9ydD1pCkBAIC03OCw5OCArOTAsMTMyIEBACiAgICAgZXhpdCAwOwogfQogCi1pZiAoJG9wdHN7c3NsfSBhbmQgbm90IGRlZmluZWQgJG9wdHN7Y2VydH0pIHsKLSAgICB1c2FnZSgpOwotICAgIGV4aXQgMTsKLX0KLQogbXkgJHNvY2tldCA9IHVuZGVmOwotaWYgKCRvcHRze3NzbH0pIHsKLQkkc29ja2V0ID0gbmV3IFRocmlmdDo6U1NMU29ja2V0KCRvcHRze2hvc3R9LCAkb3B0c3twb3J0fSk7Ci19IGVsc2UgewotCSRzb2NrZXQgPSBuZXcgVGhyaWZ0OjpTb2NrZXQoJG9wdHN7aG9zdH0sICRvcHRze3BvcnR9KTsKK2lmICgkb3B0c3snZG9tYWluLXNvY2tldCd9KSB7CisgICAgJHNvY2tldCA9IFRocmlmdDo6VW5peFNvY2tldC0+bmV3KCRvcHRzeydkb21haW4tc29ja2V0J30pOworfQorZWxzaWYgKCRvcHRze3NzbH0pIHsKKyAgJHNvY2tldCA9IFRocmlmdDo6U1NMU29ja2V0LT5uZXcoXCVvcHRzKTsKK30KK2Vsc2UgeworICAkc29ja2V0ID0gVGhyaWZ0OjpTb2NrZXQtPm5ldygkb3B0c3tob3N0fSwgJG9wdHN7cG9ydH0pOwogfQogCiBteSAkdHJhbnNwb3J0OwogaWYgKCRvcHRze3RyYW5zcG9ydH0gZXEgJ2J1ZmZlcmVkJykgewotICAgICR0cmFuc3BvcnQgPSBuZXcgVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydCgkc29ja2V0LCAxMDI0LCAxMDI0KTsKLX0gZWxzaWYgKCRvcHRze3RyYW5zcG9ydH0gZXEgJ2ZyYW1lZCcpIHsKLSAgICAkdHJhbnNwb3J0ID0gbmV3IFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0KCRzb2NrZXQpOwotfSBlbHNlIHsKKyAgICAkdHJhbnNwb3J0ID0gVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydC0+bmV3KCRzb2NrZXQsIDEwMjQsIDEwMjQpOworfQorZWxzaWYgKCRvcHRze3RyYW5zcG9ydH0gZXEgJ2ZyYW1lZCcpIHsKKyAgICAkdHJhbnNwb3J0ID0gVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQtPm5ldygkc29ja2V0KTsKK30KK2Vsc2UgewogICAgIHVzYWdlKCk7CiAgICAgZXhpdCAxOwogfQogCiBteSAkcHJvdG9jb2w7Ci1pZiAoJG9wdHN7cHJvdG9jb2x9IGVxICdiaW5hcnknKSB7Ci0gICAgJHByb3RvY29sID0gbmV3IFRocmlmdDo6QmluYXJ5UHJvdG9jb2woJHRyYW5zcG9ydCk7Ci19IGVsc2UgeworbXkgJHByb3RvY29sMjsKK2lmICgkb3B0c3twcm90b2NvbH0gZXEgJ2JpbmFyeScgfHwgJG9wdHN7cHJvdG9jb2x9IGVxICdtdWx0aScpIHsKKyAgICAkcHJvdG9jb2wgPSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sLT5uZXcoJHRyYW5zcG9ydCk7Cit9CitlbHNlIHsKICAgICB1c2FnZSgpOwogICAgIGV4aXQgMTsKIH0KIAotbXkgJHRlc3RDbGllbnQgPSBuZXcgVGhyaWZ0VGVzdDo6VGhyaWZ0VGVzdENsaWVudCgkcHJvdG9jb2wpOworbXkgJHNlY29uZFNlcnZpY2UgPSB1bmRlZjsKK2lmIChpbmRleCgkb3B0c3twcm90b2NvbH0sICdtdWx0aScpID09IDApIHsKKyAgJHByb3RvY29sMiAgICAgPSBUaHJpZnQ6Ok11bHRpcGxleGVkUHJvdG9jb2wtPm5ldygkcHJvdG9jb2wsICdTZWNvbmRTZXJ2aWNlJyk7CisgICRwcm90b2NvbCAgICAgID0gVGhyaWZ0OjpNdWx0aXBsZXhlZFByb3RvY29sLT5uZXcoJHByb3RvY29sLCAnVGhyaWZ0VGVzdCcpOworICAkc2Vjb25kU2VydmljZSA9IFRocmlmdFRlc3Q6OlNlY29uZFNlcnZpY2VDbGllbnQtPm5ldygkcHJvdG9jb2wyKTsKK30KKworbXkgJHRlc3RDbGllbnQgPSBUaHJpZnRUZXN0OjpUaHJpZnRUZXN0Q2xpZW50LT5uZXcoJHByb3RvY29sKTsKIAogZXZhbCB7CiAgICR0cmFuc3BvcnQtPm9wZW4oKTsKLX07IAorfTsKIGlmKCRAKXsKICAgICBkaWUoRHVtcGVyKCRAKSk7CiB9CisKK3VzZSBjb25zdGFudCBFUlJfQkFTRVRZUEVTID0+IDE7Cit1c2UgY29uc3RhbnQgRVJSX1NUUlVDVFMgPT4gMjsKK3VzZSBjb25zdGFudCBFUlJfQ09OVEFJTkVSUyA9PiA0OwordXNlIGNvbnN0YW50IEVSUl9FWENFUFRJT05TID0+IDg7Cit1c2UgY29uc3RhbnQgRVJSX1BST1RPQ09MID0+IDE2OwordXNlIGNvbnN0YW50IEVSUl9VTktOT1dOID0+IDY0OworCiBteSAkc3RhcnQgPSBnZXR0aW1lb2ZkYXkoKTsKIAogIwogIyBWT0lEIFRFU1QKICMKLXByaW50KCJ0ZXN0Vm9pZCgpIik7CitwcmludCgndGVzdFZvaWQoKScpOwogJHRlc3RDbGllbnQtPnRlc3RWb2lkKCk7CiBwcmludCgiID0gdm9pZFxuIik7CiAKICMKICMgU1RSSU5HIFRFU1QKICMKLXByaW50KCJ0ZXN0U3RyaW5nKFwiVGVzdFwiKSIpOwotbXkgJHMgPSAkdGVzdENsaWVudC0+dGVzdFN0cmluZygiVGVzdCIpOwotcHJpbnQoIiA9IFwiJHNcIlxuIik7CitwcmludCgndGVzdFN0cmluZygiVGVzdCIpJyk7CitteSAkcyA9ICR0ZXN0Q2xpZW50LT50ZXN0U3RyaW5nKCdUZXN0Jyk7CitwcmludChxcXwgPSAiJHMiXG58KTsKK2V4aXQoRVJSX0JBU0VUWVBFUykgaWYgKCRzIG5lICdUZXN0Jyk7CisKKyMKKyMgTVVMVElQTEVYRUQgVEVTVAorIworaWYgKGluZGV4KCRvcHRze3Byb3RvY29sfSwgJ211bHRpJykgPT0gMCkgeworICAgIHByaW50KCdzZWNvbmR0ZXN0U3RyaW5nKCJUZXN0MiIpJyk7CisgICAgJHMgPSAkc2Vjb25kU2VydmljZS0+c2Vjb25kdGVzdFN0cmluZygnVGVzdDInKTsKKyAgICBwcmludChxcXwgPSAiJHMiXG58KTsKKyAgICBleGl0KEVSUl9QUk9UT0NPTCkgaWYgKCRzIG5lICd0ZXN0U3RyaW5nKCJUZXN0MiIpJyk7Cit9CiAKICMKICMgQk9PTCBURVNUCiAjCi1wcmludCgidGVzdEJvb2woMSkiKTsKK3ByaW50KCd0ZXN0Qm9vbCgxKScpOwogbXkgJHQgPSAkdGVzdENsaWVudC0+dGVzdEJvb2woMSk7CiBwcmludCgiID0gJHRcbiIpOwotcHJpbnQoInRlc3RCb29sKDApIik7CitleGl0KEVSUl9CQVNFVFlQRVMpIGlmICgkdCBuZSAxKTsKK3ByaW50KCd0ZXN0Qm9vbCgwKScpOwogbXkgJGYgPSAkdGVzdENsaWVudC0+dGVzdEJvb2woMCk7CiBwcmludCgiID0gJGZcbiIpOworZXhpdChFUlJfQkFTRVRZUEVTKSBpZiAoJGYgbmUgcXx8KTsKIAogCiAjCiAjIEJZVEUgVEVTVAogIwotcHJpbnQoInRlc3RCeXRlKDEpIik7CitwcmludCgndGVzdEJ5dGUoMSknKTsKIG15ICR1OCA9ICR0ZXN0Q2xpZW50LT50ZXN0Qnl0ZSgxKTsKIHByaW50KCIgPSAkdThcbiIpOwogCiAjCiAjIEkzMiBURVNUCiAjCi1wcmludCgidGVzdEkzMigtMSkiKTsKK3ByaW50KCd0ZXN0STMyKC0xKScpOwogbXkgJGkzMiA9ICR0ZXN0Q2xpZW50LT50ZXN0STMyKC0xKTsKIHByaW50KCIgPSAkaTMyXG4iKTsKK2V4aXQoRVJSX0JBU0VUWVBFUykgaWYgKCRpMzIgbmUgLTEpOwogCiAjCi0jSTY0IFRFU1QKKyMgSTY0IFRFU1QKICMKLXByaW50KCJ0ZXN0STY0KC0zNDM1OTczODM2OCkiKTsKK3ByaW50KCd0ZXN0STY0KC0zNDM1OTczODM2OCknKTsKIG15ICRpNjQgPSAkdGVzdENsaWVudC0+dGVzdEk2NCgtMzQzNTk3MzgzNjgpOwogcHJpbnQoIiA9ICRpNjRcbiIpOworZXhpdChFUlJfQkFTRVRZUEVTKSBpZiAoJGk2NCBuZSAtMzQzNTk3MzgzNjgpOwogCiAjCiAjIERPVUJMRSBURVNUCiAjCi1wcmludCgidGVzdERvdWJsZSgtODUyLjIzNDIzNDIzNCkiKTsKK3ByaW50KCd0ZXN0RG91YmxlKC04NTIuMjM0MjM0MjM0KScpOwogbXkgJGR1YiA9ICR0ZXN0Q2xpZW50LT50ZXN0RG91YmxlKC04NTIuMjM0MjM0MjM0KTsKIHByaW50KCIgPSAkZHViXG4iKTsKK2V4aXQoRVJSX0JBU0VUWVBFUykgaWYgKCRkdWIgbmUgLTg1Mi4yMzQyMzQyMzQpOwogCiAjCiAjIEJJTkFSWSBURVNUICAgLS0tICBUT0RPCkBAIC0xNzksMzMgKzIyNSwzMyBAQAogIwogIyBTVFJVQ1QgVEVTVAogIwotcHJpbnQoInRlc3RTdHJ1Y3Qoe1wiWmVyb1wiLCAxLCAtMywgLTV9KSIpOwotbXkgJG91dCA9IG5ldyBUaHJpZnRUZXN0OjpYdHJ1Y3QoKTsKLSRvdXQtPnN0cmluZ190aGluZygiWmVybyIpOworcHJpbnQoJ3Rlc3RTdHJ1Y3QoeyJaZXJvIiwgMSwgLTMsIC01fSknKTsKK215ICRvdXQgPSBUaHJpZnRUZXN0OjpYdHJ1Y3QtPm5ldygpOworJG91dC0+c3RyaW5nX3RoaW5nKCdaZXJvJyk7CiAkb3V0LT5ieXRlX3RoaW5nKDEpOwogJG91dC0+aTMyX3RoaW5nKC0zKTsKICRvdXQtPmk2NF90aGluZygtNSk7CiBteSAkaW4gPSAkdGVzdENsaWVudC0+dGVzdFN0cnVjdCgkb3V0KTsKLXByaW50KCIgPSB7XCIiLiRpbi0+c3RyaW5nX3RoaW5nLiJcIiwgIi4KLSAgICAgICAgJGluLT5ieXRlX3RoaW5nLiIsICIuCi0gICAgICAgICRpbi0+aTMyX3RoaW5nLiIsICIuCitwcmludCgnID0geyInLiRpbi0+c3RyaW5nX3RoaW5nLiciLCAnLgorICAgICAgICAkaW4tPmJ5dGVfdGhpbmcuJywgJy4KKyAgICAgICAgJGluLT5pMzJfdGhpbmcuJywgJy4KICAgICAgICAgJGluLT5pNjRfdGhpbmcuIn1cbiIpOwogCiAjCiAjIE5FU1RFRCBTVFJVQ1QgVEVTVAogIwotcHJpbnQoInRlc3ROZXN0KHsxLCB7XCJaZXJvXCIsIDEsIC0zLCAtNX0sIDV9Iik7Ci1teSAkb3V0MiA9IG5ldyBUaHJpZnRUZXN0OjpYdHJ1Y3QyKCk7CitwcmludCgndGVzdE5lc3QoezEsIHsiWmVybyIsIDEsIC0zLCAtNX0sIDV9Jyk7CitteSAkb3V0MiA9IFRocmlmdFRlc3Q6Olh0cnVjdDItPm5ldygpOwogJG91dDItPmJ5dGVfdGhpbmcoMSk7CiAkb3V0Mi0+c3RydWN0X3RoaW5nKCRvdXQpOwogJG91dDItPmkzMl90aGluZyg1KTsKIG15ICRpbjIgPSAkdGVzdENsaWVudC0+dGVzdE5lc3QoJG91dDIpOwogJGluID0gJGluMi0+c3RydWN0X3RoaW5nOwotcHJpbnQoIiA9IHsiLiRpbjItPmJ5dGVfdGhpbmcuIiwge1wiIi4KLSAgICAgICRpbi0+c3RyaW5nX3RoaW5nLiJcIiwgIi4KLSAgICAgICRpbi0+Ynl0ZV90aGluZy4iLCAiLgotICAgICAgJGluLT5pMzJfdGhpbmcuIiwgIi4KLSAgICAgICRpbi0+aTY0X3RoaW5nLiJ9LCAiLgorcHJpbnQoJyA9IHsnLiRpbjItPmJ5dGVfdGhpbmcuJywgeyInLgorICAgICAgJGluLT5zdHJpbmdfdGhpbmcuJyIsICcuCisgICAgICAkaW4tPmJ5dGVfdGhpbmcuJywgJy4KKyAgICAgICRpbi0+aTMyX3RoaW5nLicsICcuCisgICAgICAkaW4tPmk2NF90aGluZy4nfSwgJy4KICAgICAgICRpbjItPmkzMl90aGluZy4ifVxuIik7CiAKICMKQEAgLTIxNSwyOCArMjYxLDMwIEBACiBmb3IgKG15ICRpID0gMDsgJGkgPCA1OyArKyRpKSB7CiAgICRtYXBvdXQtPnskaX0gPSAkaS0xMDsKIH0KLXByaW50KCJ0ZXN0TWFwKHsiKTsKK3ByaW50KCd0ZXN0TWFwKHsnKTsKIG15ICRmaXJzdCA9IDE7CiB3aGlsZSggbXkoJGtleSwkdmFsKSA9IGVhY2ggJSRtYXBvdXQpIHsKICAgICBpZiAoJGZpcnN0KSB7CiAgICAgICAgICRmaXJzdCA9IDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcHJpbnQoIiwgIik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBwcmludCgnLCAnKTsKICAgICB9CiAgICAgcHJpbnQoIiRrZXkgPT4gJHZhbCIpOwogfQotcHJpbnQoIn0pIik7CitwcmludCgnfSknKTsKIAogCiBteSAkbWFwaW4gPSAkdGVzdENsaWVudC0+dGVzdE1hcCgkbWFwb3V0KTsKLXByaW50KCIgPSB7Iik7CitwcmludCgnID0geycpOwogCiAkZmlyc3QgPSAxOwogd2hpbGUoIG15KCRrZXksJHZhbCkgPSBlYWNoICUkbWFwaW4pewogICAgIGlmICgkZmlyc3QpIHsKICAgICAgICAgJGZpcnN0ID0gMDsKLSAgICB9IGVsc2UgewotICAgICAgICBwcmludCgiLCAiKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHByaW50KCcsICcpOwogICAgIH0KICAgICBwcmludCgiJGtleSA9PiAkdmFsIik7CiB9CkBAIC0yNTAsMTEgKzI5OCwxMSBAQAogICAgIHB1c2goQCRzZXRvdXQsICRpKTsKIH0KIAotcHJpbnQoInRlc3RTZXQoeyIuam9pbigiLCIsQCRzZXRvdXQpLiJ9KSIpOworcHJpbnQoJ3Rlc3RTZXQoeycuam9pbignLCcsQCRzZXRvdXQpLid9KScpOwogCiBteSAkc2V0aW4gPSAkdGVzdENsaWVudC0+dGVzdFNldCgkc2V0b3V0KTsKIAotcHJpbnQoIiA9IHsiLmpvaW4oIiwiLEAkc2V0b3V0KS4ifVxuIik7CitwcmludCgnID0geycuam9pbignLCcsQCRzZXRvdXQpLiJ9XG4iKTsKIAogIwogIyBMSVNUIFRFU1QKQEAgLTI2NCwxMTEgKzMxMiwxMTEgQEAKICAgICBwdXNoKEAkbGlzdG91dCwgJGkpOwogfQogCi1wcmludCgidGVzdExpc3QoeyIuam9pbigiLCIsQCRsaXN0b3V0KS4ifSkiKTsKK3ByaW50KCd0ZXN0TGlzdCh7Jy5qb2luKCcsJyxAJGxpc3RvdXQpLid9KScpOwogCiBteSAkbGlzdGluID0gJHRlc3RDbGllbnQtPnRlc3RMaXN0KCRsaXN0b3V0KTsKIAotcHJpbnQoIiA9IHsiLmpvaW4oIiwiLEAkbGlzdGluKS4ifVxuIik7CitwcmludCgnID0geycuam9pbignLCcsQCRsaXN0aW4pLiJ9XG4iKTsKIAogIwogIyBFTlVNIFRFU1QKICMKLXByaW50KCJ0ZXN0RW51bShPTkUpIik7CitwcmludCgndGVzdEVudW0oT05FKScpOwogbXkgJHJldCA9ICR0ZXN0Q2xpZW50LT50ZXN0RW51bShUaHJpZnRUZXN0OjpOdW1iZXJ6OjpPTkUpOwogcHJpbnQoIiA9ICRyZXRcbiIpOwogCi1wcmludCgidGVzdEVudW0oVFdPKSIpOworcHJpbnQoJ3Rlc3RFbnVtKFRXTyknKTsKICRyZXQgPSAkdGVzdENsaWVudC0+dGVzdEVudW0oVGhyaWZ0VGVzdDo6TnVtYmVyejo6VFdPKTsKIHByaW50KCIgPSAkcmV0XG4iKTsKIAotcHJpbnQoInRlc3RFbnVtKFRIUkVFKSIpOworcHJpbnQoJ3Rlc3RFbnVtKFRIUkVFKScpOwogJHJldCA9ICR0ZXN0Q2xpZW50LT50ZXN0RW51bShUaHJpZnRUZXN0OjpOdW1iZXJ6OjpUSFJFRSk7CiBwcmludCgiID0gJHJldFxuIik7CiAKLXByaW50KCJ0ZXN0RW51bShGSVZFKSIpOworcHJpbnQoJ3Rlc3RFbnVtKEZJVkUpJyk7CiAkcmV0ID0gJHRlc3RDbGllbnQtPnRlc3RFbnVtKFRocmlmdFRlc3Q6Ok51bWJlcno6OkZJVkUpOwogcHJpbnQoIiA9ICRyZXRcbiIpOwogCi1wcmludCgidGVzdEVudW0oRUlHSFQpIik7CitwcmludCgndGVzdEVudW0oRUlHSFQpJyk7CiAkcmV0ID0gJHRlc3RDbGllbnQtPnRlc3RFbnVtKFRocmlmdFRlc3Q6Ok51bWJlcno6OkVJR0hUKTsKIHByaW50KCIgPSAkcmV0XG4iKTsKIAogIwogIyBUWVBFREVGIFRFU1QKICMKLXByaW50KCJ0ZXN0VHlwZWRlZigzMDk4NTgyMzUwODI1MjMpIik7CitwcmludCgndGVzdFR5cGVkZWYoMzA5ODU4MjM1MDgyNTIzKScpOwogbXkgJHVpZCA9ICR0ZXN0Q2xpZW50LT50ZXN0VHlwZWRlZigzMDk4NTgyMzUwODI1MjMpOwogcHJpbnQoIiA9ICR1aWRcbiIpOwogCiAjCiAjIE5FU1RFRCBNQVAgVEVTVAogIwotcHJpbnQoInRlc3RNYXBNYXAoMSkiKTsKK3ByaW50KCd0ZXN0TWFwTWFwKDEpJyk7CiBteSAkbW0gPSAkdGVzdENsaWVudC0+dGVzdE1hcE1hcCgxKTsKLXByaW50KCIgPSB7Iik7CitwcmludCgnID0geycpOwogd2hpbGUoIG15ICgka2V5LCR2YWwpID0gZWFjaCAlJG1tKSB7CiAgICAgcHJpbnQoIiRrZXkgPT4geyIpOwogICAgIHdoaWxlKCBteSgkazIsJHYyKSA9IGVhY2ggJSR2YWwpIHsKICAgICAgICAgcHJpbnQoIiRrMiA9PiAkdjIsICIpOwogICAgIH0KLSAgICBwcmludCgifSwgIik7CisgICAgcHJpbnQoJ30sICcpOwogfQogcHJpbnQoIn1cbiIpOwogCiAjCiAjIElOU0FOSVRZIFRFU1QKICMKLW15ICRpbnNhbmUgPSBuZXcgVGhyaWZ0VGVzdDo6SW5zYW5pdHkoKTsKK215ICRpbnNhbmUgPSBUaHJpZnRUZXN0OjpJbnNhbml0eS0+bmV3KCk7CiAkaW5zYW5lLT57dXNlck1hcH0tPntUaHJpZnRUZXN0OjpOdW1iZXJ6OjpGSVZFfSA9IDUwMDA7Ci1teSAkdHJ1Y2sgPSBuZXcgVGhyaWZ0VGVzdDo6WHRydWN0KCk7Ci0kdHJ1Y2stPnN0cmluZ190aGluZygiSGVsbG8yIik7CitteSAkdHJ1Y2sgPSBUaHJpZnRUZXN0OjpYdHJ1Y3QtPm5ldygpOworJHRydWNrLT5zdHJpbmdfdGhpbmcoJ0hlbGxvMicpOwogJHRydWNrLT5ieXRlX3RoaW5nKDIpOwogJHRydWNrLT5pMzJfdGhpbmcoMik7CiAkdHJ1Y2stPmk2NF90aGluZygyKTsKLW15ICR0cnVjazIgPSBuZXcgVGhyaWZ0VGVzdDo6WHRydWN0KCk7Ci0kdHJ1Y2syLT5zdHJpbmdfdGhpbmcoIkdvb2RieWU0Iik7CitteSAkdHJ1Y2syID0gVGhyaWZ0VGVzdDo6WHRydWN0LT5uZXcoKTsKKyR0cnVjazItPnN0cmluZ190aGluZygnR29vZGJ5ZTQnKTsKICR0cnVjazItPmJ5dGVfdGhpbmcoNCk7CiAkdHJ1Y2syLT5pMzJfdGhpbmcoNCk7CiAkdHJ1Y2syLT5pNjRfdGhpbmcoNCk7CiBwdXNoKEB7JGluc2FuZS0+e3h0cnVjdHN9fSwgJHRydWNrKTsKIHB1c2goQHskaW5zYW5lLT57eHRydWN0c319LCAkdHJ1Y2syKTsKIAotcHJpbnQoInRlc3RJbnNhbml0eSgpIik7CitwcmludCgndGVzdEluc2FuaXR5KCknKTsKIG15ICR3aG9hID0gJHRlc3RDbGllbnQtPnRlc3RJbnNhbml0eSgkaW5zYW5lKTsKLXByaW50KCIgPSB7Iik7CitwcmludCgnID0geycpOwogd2hpbGUoIG15ICgka2V5LCR2YWwpID0gZWFjaCAlJHdob2EpIHsKICAgICBwcmludCgiJGtleSA9PiB7Iik7CiAgICAgd2hpbGUoIG15KCRrMiwkdjIpID0gZWFjaCAlJHZhbCkgewogICAgICAgICBwcmludCgiJGsyID0+IHsiKTsKICAgICAgICAgbXkgJHVzZXJNYXAgPSAkdjItPnt1c2VyTWFwfTsKLSAgICAgICAgcHJpbnQoInsiKTsKLSAgICAgICAgaWYgKHJlZigkdXNlck1hcCkgZXEgIkhBU0giKSB7CisgICAgICAgIHByaW50KCd7Jyk7CisgICAgICAgIGlmIChyZWYoJHVzZXJNYXApIGVxICdIQVNIJykgewogICAgICAgICAgICAgd2hpbGUoIG15KCRrMywkdjMpID0gZWFjaCAlJHVzZXJNYXApIHsKICAgICAgICAgICAgICAgICBwcmludCgiJGszID0+ICR2MywgIik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgcHJpbnQoIn0sICIpOworICAgICAgICBwcmludCgnfSwgJyk7CiAKICAgICAgICAgbXkgJHh0cnVjdHMgPSAkdjItPnt4dHJ1Y3RzfTsKLSAgICAgICAgcHJpbnQoInsiKTsKLSAgICAgICAgaWYgKHJlZigkeHRydWN0cykgZXEgIkFSUkFZIikgeworICAgICAgICBwcmludCgneycpOworICAgICAgICBpZiAocmVmKCR4dHJ1Y3RzKSBlcSAnQVJSQVknKSB7CiAgICAgICAgICAgICBmb3JlYWNoIG15ICR4IChAJHh0cnVjdHMpIHsKLSAgICAgICAgICAgICAgICBwcmludCgie1wiIi4keC0+e3N0cmluZ190aGluZ30uIlwiLCAiLgotICAgICAgICAgICAgICAgICAgICAgICR4LT57Ynl0ZV90aGluZ30uIiwgIi4keC0+e2kzMl90aGluZ30uIiwgIi4keC0+e2k2NF90aGluZ30uIn0sICIpOworICAgICAgICAgICAgICAgIHByaW50KCd7IicuJHgtPntzdHJpbmdfdGhpbmd9LiciLCAnLgorICAgICAgICAgICAgICAgICAgICAgICR4LT57Ynl0ZV90aGluZ30uJywgJy4keC0+e2kzMl90aGluZ30uJywgJy4keC0+e2k2NF90aGluZ30uJ30sICcpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHByaW50KCJ9Iik7CisgICAgICAgIHByaW50KCd9Jyk7CiAKLSAgICAgICAgcHJpbnQoIn0sICIpOworICAgICAgICBwcmludCgnfSwgJyk7CiAgICAgfQotICAgIHByaW50KCJ9LCAiKTsKKyAgICBwcmludCgnfSwgJyk7CiB9CiBwcmludCgifVxuIik7CiAKICMKICMgRVhDRVBUSU9OIFRFU1QKICMKLXByaW50KCJ0ZXN0RXhjZXB0aW9uKCdYY2VwdGlvbicpIik7CitwcmludChxfHRlc3RFeGNlcHRpb24oJ1hjZXB0aW9uJyl8KTsKIGV2YWwgewogICAgICR0ZXN0Q2xpZW50LT50ZXN0RXhjZXB0aW9uKCdYY2VwdGlvbicpOwogICAgIHByaW50KCIgIHZvaWRcbkZBSUxVUkVcbiIpOwpAQCAtMzgxLDcgKzQyOSw3IEBACiAjIE5vcm1hbCB0ZXN0cyBkb25lLgogIwogbXkgJHN0b3AgPSBnZXR0aW1lb2ZkYXkoKTsKLW15ICRlbHAgID0gc3ByaW50ZigiJWQiLDEwMDAqKCRzdG9wIC0gJHN0YXJ0KSwgMCk7CitteSAkZWxwICA9IHNwcmludGYoJyVkJywxMDAwKigkc3RvcCAtICRzdGFydCksIDApOwogcHJpbnQoIlRvdGFsIHRpbWU6ICRlbHAgbXNcbiIpOwogCiAjCmRpZmYgLS1naXQgYS90ZXN0L3BlcmwvVGVzdFNlcnZlci5wbCBiL3Rlc3QvcGVybC9UZXN0U2VydmVyLnBsCmluZGV4IDViZmE2NDAuLmQyYjlhMzggMTAwNjQ0Ci0tLSBhL3Rlc3QvcGVybC9UZXN0U2VydmVyLnBsCisrKyBiL3Rlc3QvcGVybC9UZXN0U2VydmVyLnBsCkBAIC0xOSwxMyArMTksMTUgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgNS42LjA7Cit1c2UgNS4xMC4wOwogdXNlIHN0cmljdDsKIHVzZSB3YXJuaW5nczsKIHVzZSBEYXRhOjpEdW1wZXI7CiB1c2UgR2V0b3B0OjpMb25nIHF3KEdldE9wdGlvbnMpOwogdXNlIFRpbWU6OkhpUmVzIHF3KGdldHRpbWVvZmRheSk7CiAKKyRTSUd7SU5UfSA9IFwmc2lnaW50X2hhbmRsZXI7CisKIHVzZSBsaWIgJy4uLy4uL2xpYi9wZXJsL2xpYic7CiB1c2UgbGliICdnZW4tcGVybCc7CiAKQEAgLTMzLDIzICszNSwyOCBAQAogdXNlIFRocmlmdDo6QmluYXJ5UHJvdG9jb2w7CiB1c2UgVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydDsKIHVzZSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydDsKK3VzZSBUaHJpZnQ6Ok11bHRpcGxleGVkUHJvY2Vzc29yOwogdXNlIFRocmlmdDo6U1NMU2VydmVyU29ja2V0OwogdXNlIFRocmlmdDo6U2VydmVyU29ja2V0OwogdXNlIFRocmlmdDo6U2VydmVyOwordXNlIFRocmlmdDo6VW5peFNlcnZlclNvY2tldDsKIAordXNlIFRocmlmdFRlc3Q6OlNlY29uZFNlcnZpY2U7CiB1c2UgVGhyaWZ0VGVzdDo6VGhyaWZ0VGVzdDsKIHVzZSBUaHJpZnRUZXN0OjpUeXBlczsKIAogJHwrKzsKIAogc3ViIHVzYWdlIHsKLSAgICBwcmludCA8PEVPRjsKKyAgICBwcmludCA8PCJFT0YiOwogVXNhZ2U6ICQwIFtPUFRJT05TXQogCiBPcHRpb25zOiAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQpCiAgIC0tY2EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlcnRpZmljYXRlIGF1dGhvcml0eSBmaWxlIChvcHRpb25hbCkuCiAgIC0tY2VydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlcnRpZmljYXRlIGZpbGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVpcmVkIGlmIHVzaW5nIC0tc3NsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVpcmVkIGlmIHVzaW5nIC0tc3NsLgorICAtLWNpcGhlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY2NlcHRhYmxlIGNpcGhlciBsaXN0LgorICAtLWRvbWFpbi1zb2NrZXQgPGZpbGU+ICAgICAgICAgICAgICAgICAgICAgICBVc2UgYSB1bml4IGRvbWFpbiBzb2NrZXQuCiAgIC0taGVscCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNob3cgdXNhZ2UuCiAgIC0ta2V5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaXZhdGUga2V5IGZpbGUgZm9yIGNlcnRpZmljYXRlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1aXJlZCBpZiB1c2luZyAtLXNzbCBhbmQgcHJpdmF0ZSBrZXkgaXMKQEAgLTU4LDcgKzY1LDcgQEAKICAgLS1wcm90b2NvbCB7YmluYXJ5fSAgICAgICAgICAgICBiaW5hcnkgICAgICAgUHJvdG9jb2wgdG8gdXNlLgogICAtLXNzbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBwcmVzZW50LCB1c2UgU1NML1RMUy4KICAgLS10cmFuc3BvcnQge2J1ZmZlcmVkfGZyYW1lZH0gICBidWZmZXJlZCAgICAgVHJhbnNwb3J0IHRvIHVzZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKIEVPRgogfQogCkBAIC03MSw2ICs3OCw4IEBACiBHZXRPcHRpb25zKFwlb3B0cywgcXcgKAogICAgIGNhPXMKICAgICBjZXJ0PXMKKyAgICBjaXBoZXJzPXMKKyAgICBkb21haW4tc29ja2V0PXMKICAgICBoZWxwCiAgICAgaG9zdD1zCiAgICAga2V5PXMKQEAgLTkwLDQwICs5OSw2OSBAQAogICAgIGV4aXQgMTsKIH0KIAotbXkgJGhhbmRsZXIgPSBuZXcgVGhyaWZ0VGVzdEhhbmRsZXIoKTsKLW15ICRwcm9jZXNzb3IgPSBuZXcgVGhyaWZ0VGVzdDo6VGhyaWZ0VGVzdFByb2Nlc3NvcigkaGFuZGxlcik7CitteSAkaGFuZGxlciAgICA9IFRocmlmdFRlc3RIYW5kbGVyLT5uZXcoKTsKK215ICRoYW5kbGVyMiAgID0gU2Vjb25kU2VydmljZUhhbmRsZXItPm5ldygpOworbXkgJHByb2Nlc3NvciAgPSBUaHJpZnRUZXN0OjpUaHJpZnRUZXN0UHJvY2Vzc29yLT5uZXcoJGhhbmRsZXIpOworbXkgJHByb2Nlc3NvcjIgPSBUaHJpZnRUZXN0OjpTZWNvbmRTZXJ2aWNlUHJvY2Vzc29yLT5uZXcoJGhhbmRsZXIyKTsKKwogbXkgJHNlcnZlcnNvY2tldDsKLWlmICgkb3B0c3tzc2x9KSB7Ci0gICAgJHNlcnZlcnNvY2tldCA9IG5ldyBUaHJpZnQ6OlNTTFNlcnZlclNvY2tldChcJW9wdHMpOwotfSBlbHNlIHsKLSAgICAkc2VydmVyc29ja2V0ID0gbmV3IFRocmlmdDo6U2VydmVyU29ja2V0KFwlb3B0cyk7CitpZiAoJG9wdHN7J2RvbWFpbi1zb2NrZXQnfSkgeworICAgIHVubGluaygkb3B0c3snZG9tYWluLXNvY2tldCd9KTsKKyAgICAkc2VydmVyc29ja2V0ID0gVGhyaWZ0OjpVbml4U2VydmVyU29ja2V0LT5uZXcoJG9wdHN7J2RvbWFpbi1zb2NrZXQnfSk7Cit9CitlbHNpZiAoJG9wdHN7c3NsfSkgeworICAgICRzZXJ2ZXJzb2NrZXQgPSBUaHJpZnQ6OlNTTFNlcnZlclNvY2tldC0+bmV3KFwlb3B0cyk7Cit9CitlbHNlIHsKKyAgICAkc2VydmVyc29ja2V0ID0gVGhyaWZ0OjpTZXJ2ZXJTb2NrZXQtPm5ldyhcJW9wdHMpOwogfQogbXkgJHRyYW5zcG9ydDsKIGlmICgkb3B0c3t0cmFuc3BvcnR9IGVxICdidWZmZXJlZCcpIHsKLSAgICAkdHJhbnNwb3J0ID0gbmV3IFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCk7Ci19IGVsc2lmICgkb3B0c3t0cmFuc3BvcnR9IGVxICdmcmFtZWQnKSB7Ci0gICAgJHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydEZhY3RvcnkoKTsKLX0gZWxzZSB7CisgICAgJHRyYW5zcG9ydCA9IFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5LT5uZXcoKTsKK30KK2Vsc2lmICgkb3B0c3t0cmFuc3BvcnR9IGVxICdmcmFtZWQnKSB7CisgICAgJHRyYW5zcG9ydCA9IFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0RmFjdG9yeS0+bmV3KCk7Cit9CitlbHNlIHsKICAgICB1c2FnZSgpOwogICAgIGV4aXQgMTsKIH0KIG15ICRwcm90b2NvbDsKLWlmICgkb3B0c3twcm90b2NvbH0gZXEgJ2JpbmFyeScpIHsKLSAgICAkcHJvdG9jb2wgPSBuZXcgVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEZhY3RvcnkoKTsKLX0gZWxzZSB7CitpZiAoJG9wdHN7cHJvdG9jb2x9IGVxICdiaW5hcnknIHx8ICRvcHRze3Byb3RvY29sfSBlcSAnbXVsdGknKSB7CisgICAgJHByb3RvY29sID0gVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEZhY3RvcnktPm5ldygpOworfQorZWxzZSB7CiAgICAgdXNhZ2UoKTsKICAgICBleGl0IDE7CiB9CiAKK2lmIChpbmRleCgkb3B0c3twcm90b2NvbH0sICdtdWx0aScpID09IDApIHsKKyAgbXkgJG5ld1Byb2Nlc3NvciA9IFRocmlmdDo6TXVsdGlwbGV4ZWRQcm9jZXNzb3ItPm5ldygkcHJvdG9jb2wpOworICAkbmV3UHJvY2Vzc29yLT5kZWZhdWx0UHJvY2Vzc29yKCRwcm9jZXNzb3IpOworICAkbmV3UHJvY2Vzc29yLT5yZWdpc3RlclByb2Nlc3NvcignVGhyaWZ0VGVzdCcsICRwcm9jZXNzb3IpOworICAkbmV3UHJvY2Vzc29yLT5yZWdpc3RlclByb2Nlc3NvcignU2Vjb25kU2VydmljZScsICRwcm9jZXNzb3IyKTsKKyAgJHByb2Nlc3NvciA9ICRuZXdQcm9jZXNzb3I7Cit9CisKIG15ICRzc2x0YWcgPSAnJzsKIGlmICgkb3B0c3tzc2x9KSB7Ci0gICAgJHNzbHRhZyA9ICIoU1NMKSI7CisgICAgJHNzbHRhZyA9ICcoU1NMKSc7CiB9Ci1teSAkc2VydmVyID0gbmV3IFRocmlmdDo6U2ltcGxlU2VydmVyKCRwcm9jZXNzb3IsICRzZXJ2ZXJzb2NrZXQsICR0cmFuc3BvcnQsICRwcm90b2NvbCk7Ci1wcmludCAiU3RhcnRpbmcgXCJzaW1wbGVcIiBzZXJ2ZXIgKCRvcHRze3RyYW5zcG9ydH0vJG9wdHN7cHJvdG9jb2x9KSBsaXN0ZW4gb246ICRvcHRze3BvcnR9ICRzc2x0YWdcbiI7CitteSAkbGlzdGVuaW5nX29uID0gIiRvcHRze3BvcnR9ICRzc2x0YWciOworaWYgKCRvcHRzeydkb21haW4tc29ja2V0J30pIHsKKyAgICAkbGlzdGVuaW5nX29uID0gJG9wdHN7J2RvbWFpbi1zb2NrZXQnfTsKK30KK215ICRzZXJ2ZXIgPSBUaHJpZnQ6OlNpbXBsZVNlcnZlci0+bmV3KCRwcm9jZXNzb3IsICRzZXJ2ZXJzb2NrZXQsICR0cmFuc3BvcnQsICRwcm90b2NvbCk7CitwcmludCBxcXxTdGFydGluZyAic2ltcGxlIiBzZXJ2ZXIgKCRvcHRze3RyYW5zcG9ydH0vJG9wdHN7cHJvdG9jb2x9KSBsaXN0ZW4gb246ICRsaXN0ZW5pbmdfb25cbnw7CiAkc2VydmVyLT5zZXJ2ZSgpOworcHJpbnQgImRvbmUuXG4iOwogCi0jIyMgICAgCitzdWIgc2lnaW50X2hhbmRsZXIgeworICBwcmludCAicmVjZWl2ZWQgU0lHSU5ULCBzdG9wcGluZy4uLlxuIjsKKyAgJHNlcnZlci0+c3RvcCgpOworfQorCisjIyMKICMjIyBUZXN0IHNlcnZlciBpbXBsZW1lbnRhdGlvbgogIyMjCiAKQEAgLTEzNyw3MCArMTc1LDY3IEBACiAgICAgcmV0dXJuIGJsZXNzKCRzZWxmLCAkY2xhc3NuYW1lKTsKIH0KIAotc3ViIHRlc3RWb2lkKCkgewotICBwcmludCgidGVzdFZvaWQoKVxuIik7IAorc3ViIHRlc3RWb2lkIHsKKyAgcHJpbnQoInRlc3RWb2lkKClcbiIpOwogfQogCi1zdWIgdGVzdFN0cmluZygpIHsKK3N1YiB0ZXN0U3RyaW5nIHsKICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgbXkgJHRoaW5nID0gc2hpZnQ7CiAgIHByaW50KCJ0ZXN0U3RyaW5nKCR0aGluZylcbiIpOwogICByZXR1cm4gJHRoaW5nOwogfQogCi1zdWIgdGVzdEJvb2woKSB7CitzdWIgdGVzdEJvb2wgewogICBteSAkc2VsZiA9IHNoaWZ0OwogICBteSAkdGhpbmcgPSBzaGlmdDsKLSAgbXkgJHN0ciA9ICR0aGluZyA/ICJ0cnVlIiA6ICJmYWxzZSI7CisgIG15ICRzdHIgPSAkdGhpbmcgPyAndHJ1ZScgOiAnZmFsc2UnOwogICBwcmludCgidGVzdEJvb2woJHN0cilcbiIpOwogICByZXR1cm4gJHRoaW5nOwogfQogCi1zdWIgdGVzdEJ5dGUoKSB7CitzdWIgdGVzdEJ5dGUgewogICBteSAkc2VsZiA9IHNoaWZ0OwogICBteSAkdGhpbmcgPSBzaGlmdDsKICAgcHJpbnQoInRlc3RCeXRlKCR0aGluZylcbiIpOwogICByZXR1cm4gJHRoaW5nOwogfQogCi1zdWIgdGVzdEkzMigpIHsKK3N1YiB0ZXN0STMyIHsKICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgbXkgJHRoaW5nID0gc2hpZnQ7CiAgIHByaW50KCJ0ZXN0STMyKCR0aGluZylcbiIpOwogICByZXR1cm4gJHRoaW5nOwogfQogCi1zdWIgdGVzdEk2NCgpIHsKK3N1YiB0ZXN0STY0IHsKICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgbXkgJHRoaW5nID0gc2hpZnQ7CiAgIHByaW50KCJ0ZXN0STY0KCR0aGluZylcbiIpOwogICByZXR1cm4gJHRoaW5nOwogfQogCi1zdWIgdGVzdERvdWJsZSgpIHsKK3N1YiB0ZXN0RG91YmxlIHsKICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgbXkgJHRoaW5nID0gc2hpZnQ7CiAgIHByaW50KCJ0ZXN0RG91YmxlKCR0aGluZylcbiIpOwogICByZXR1cm4gJHRoaW5nOwogfQogCi1zdWIgdGVzdEJpbmFyeSgpIHsKK3N1YiB0ZXN0QmluYXJ5IHsKICAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgIG15ICR0aGluZyA9IHNoaWZ0OwogICAgIG15IEBieXRlcyA9IHNwbGl0IC8vLCAkdGhpbmc7Ci0gICAgcHJpbnQoInRlc3RCaW5hcnkoIik7Ci0gICAgZm9yZWFjaCAoQGJ5dGVzKQotICAgIHsKLSAgICAgICAgcHJpbnRmICIlMDJseCIsIG9yZCAkXzsKLSAgICB9Ci0gICAgcHJpbnQoIilcbiIpOworICAgIHByaW50ICd0ZXN0QmluYXJ5KCc7CisgICAgcHJpbnRmKCAnJTAybHgnLCBvcmQgJF8gKSBmb3JlYWNoIChAYnl0ZXMpOworICAgIHByaW50ICIpXG4iOwogICAgIHJldHVybiAkdGhpbmc7CiB9CiAKLXN1YiB0ZXN0U3RydWN0KCkgeworc3ViIHRlc3RTdHJ1Y3QgewogICBteSAkc2VsZiA9IHNoaWZ0OwogICBteSAkdGhpbmcgPSBzaGlmdDsKLSAgcHJpbnRmKCJ0ZXN0U3RydWN0KHtcIiVzXCIsICVkLCAlZCwgJWxsZH0pXG4iLAorICBwcmludGYocXF8dGVzdFN0cnVjdCh7IiVzIiwgJWQsICVkLCAlbGxkfSlcbnwsCiAgICAgICAgICAgICR0aGluZy0+e3N0cmluZ190aGluZ30sCiAgICAgICAgICAgICR0aGluZy0+e2J5dGVfdGhpbmd9LAogICAgICAgICAgICAkdGhpbmctPntpMzJfdGhpbmd9LApAQCAtMjA4LDExICsyNDMsMTEgQEAKICAgcmV0dXJuICR0aGluZzsKIH0KIAotc3ViIHRlc3ROZXN0KCkgeworc3ViIHRlc3ROZXN0IHsKICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgbXkgJG5lc3QgPSBzaGlmdDsKICAgbXkgJHRoaW5nID0gJG5lc3QtPntzdHJ1Y3RfdGhpbmd9OwotICBwcmludGYoInRlc3ROZXN0KHslZCwge1wiJXNcIiwgJWQsICVkLCAlbGxkfSwgJWR9KVxuIiwKKyAgcHJpbnRmKHFxfHRlc3ROZXN0KHslZCwgeyIlcyIsICVkLCAlZCwgJWxsZH0sICVkfSlcbnwsCiAgICAgICAgICAgICRuZXN0LT57Ynl0ZV90aGluZ30sCiAgICAgICAgICAgICR0aGluZy0+e3N0cmluZ190aGluZ30sCiAgICAgICAgICAgICR0aGluZy0+e2J5dGVfdGhpbmd9LApAQCAtMjIyLDExOSArMjU3LDg1IEBACiAgIHJldHVybiAkbmVzdDsKIH0KIAotc3ViIHRlc3RNYXAoKSB7CitzdWIgdGVzdE1hcCB7CiAgIG15ICRzZWxmID0gc2hpZnQ7CiAgIG15ICR0aGluZyA9IHNoaWZ0OwotICBwcmludCgidGVzdE1hcCh7Iik7Ci0gIG15ICRmaXJzdCA9IDE7Ci0gIGZvcmVhY2ggbXkgJGtleSAoa2V5cyAlJHRoaW5nKSB7Ci0gICAgaWYgKCRmaXJzdCkgewotICAgICAgICAkZmlyc3QgPSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHByaW50KCIsICIpOwotICAgIH0KLSAgICBwcmludCgiJGtleSA9PiAkdGhpbmctPnska2V5fSIpOwotICB9Ci0gIHByaW50KCJ9KVxuIik7CisgIHByaW50ZiAidGVzdE1hcCh7JXN9KVxuIiwKKyAgICBqb2luKCAnLCAnLAorICAgICAgICAgIG1hcCB7ICRfIC4gJyA9PiAnIC4gJHRoaW5nLT57JF99IH0KKyAgICAgICAgICBzb3J0IGtleXMgJSR0aGluZworICAgICk7CiAgIHJldHVybiAkdGhpbmc7CiB9CiAKLXN1YiB0ZXN0U3RyaW5nTWFwKCkgeworc3ViIHRlc3RTdHJpbmdNYXAgewogICBteSAkc2VsZiA9IHNoaWZ0OwogICBteSAkdGhpbmcgPSBzaGlmdDsKLSAgcHJpbnQoInRlc3RTdHJpbmdNYXAoeyIpOwotICBteSAkZmlyc3QgPSAxOwotICBmb3JlYWNoIG15ICRrZXkgKGtleXMgJSR0aGluZykgewotICAgIGlmICgkZmlyc3QpIHsKLSAgICAgICAgJGZpcnN0ID0gMDsKLSAgICB9IGVsc2UgewotICAgICAgICBwcmludCgiLCAiKTsKLSAgICB9Ci0gICAgcHJpbnQoIiRrZXkgPT4gJHRoaW5nLT57JGtleX0iKTsKLSAgfQotICBwcmludCgifSlcbiIpOworICBwcmludGYgInRlc3RTdHJpbmdNYXAoeyVzfSlcbiIsCisgICAgam9pbiggJywgJywKKyAgICAgICAgICBtYXAgeyAkXyAuICcgPT4gJyAuICR0aGluZy0+eyRffSB9CisgICAgICAgICAgc29ydCBrZXlzICUkdGhpbmcKKyAgICApOwogICByZXR1cm4gJHRoaW5nOwogfQogCi1zdWIgdGVzdFNldCgpIHsKK3N1YiB0ZXN0U2V0IHsKICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgbXkgJHRoaW5nID0gc2hpZnQ7Ci0gIG15IEBhcnI7Ci0gIG15ICRyZXN1bHQgPSBcQGFycjsKLSAgcHJpbnQoInRlc3RTZXQoeyIpOwotICBteSAkZmlyc3QgPSAxOwotICBmb3JlYWNoIG15ICRrZXkgKGtleXMgJSR0aGluZykgewotICAgIGlmICgkZmlyc3QpIHsKLSAgICAgICAgJGZpcnN0ID0gMDsKLSAgICB9IGVsc2UgewotICAgICAgICBwcmludCgiLCAiKTsKLSAgICB9Ci0gICAgcHJpbnQoIiRrZXkiKTsKLSAgICBwdXNoKCRyZXN1bHQsICRrZXkpOwotICB9Ci0gIHByaW50KCJ9KVxuIik7Ci0gIHJldHVybiAkcmVzdWx0OworICBteSBAcmVzdWx0ID0gc29ydCBrZXlzICUkdGhpbmc7CisgIHByaW50ZiAidGVzdFNldCh7JXN9KVxuIiwgam9pbignLCAnLCBAcmVzdWx0ICk7CisgIHJldHVybiBcQHJlc3VsdDsKIH0KIAotc3ViIHRlc3RMaXN0KCkgeworc3ViIHRlc3RMaXN0IHsKICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgbXkgJHRoaW5nID0gc2hpZnQ7Ci0gIHByaW50KCJ0ZXN0TGlzdCh7Iik7Ci0gIG15ICRmaXJzdCA9IDE7Ci0gIGZvcmVhY2ggbXkgJGtleSAoQCR0aGluZykgewotICAgIGlmICgkZmlyc3QpIHsKLSAgICAgICAgJGZpcnN0ID0gMDsKLSAgICB9IGVsc2UgewotICAgICAgICBwcmludCgiLCAiKTsKLSAgICB9Ci0gICAgcHJpbnQoIiRrZXkiKTsKLSAgfQotICBwcmludCgifSlcbiIpOworICBwcmludCAidGVzdExpc3QoeyVzfSlcbiIsIGpvaW4oJywgJywgQCR0aGluZyk7CiAgIHJldHVybiAkdGhpbmc7CiB9CiAKLXN1YiB0ZXN0RW51bSgpIHsKK3N1YiB0ZXN0RW51bSB7CiAgIG15ICRzZWxmID0gc2hpZnQ7CiAgIG15ICR0aGluZyA9IHNoaWZ0OwotICBwcmludCgidGVzdEVudW0oJHRoaW5nKVxuIik7CisgIHByaW50ICJ0ZXN0RW51bSgkdGhpbmcpXG4iOwogICByZXR1cm4gJHRoaW5nOwogfQogCi1zdWIgdGVzdFR5cGVkZWYoKSB7CitzdWIgdGVzdFR5cGVkZWYgewogICBteSAkc2VsZiA9IHNoaWZ0OwogICBteSAkdGhpbmcgPSBzaGlmdDsKICAgcHJpbnQoInRlc3RUeXBlZGVmKCR0aGluZylcbiIpOwogICByZXR1cm4gJHRoaW5nOwogfQogCi1zdWIgdGVzdE1hcE1hcCgpIHsKK3N1YiB0ZXN0TWFwTWFwIHsKICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgbXkgJGhlbGxvID0gc2hpZnQ7Ci0gIAorCiAgIHByaW50ZigidGVzdE1hcE1hcCglZClcbiIsICRoZWxsbyk7CiAgIG15ICRyZXN1bHQgPSB7IDQgPT4geyAxID0+IDEsIDIgPT4gMiwgMyA9PiAzLCA0ID0+IDQgfSwgLTQgPT4geyAtMSA9PiAtMSwgLTIgPT4gLTIsIC0zID0+IC0zLCAtNCA9PiAtNCB9IH07CiAgIHJldHVybiAkcmVzdWx0OwogfQogCi1zdWIgdGVzdEluc2FuaXR5KCkgeworc3ViIHRlc3RJbnNhbml0eSB7CiAgIG15ICRzZWxmID0gc2hpZnQ7CiAgIG15ICRhcmd1bWVudCA9IHNoaWZ0OwogICBwcmludCgidGVzdEluc2FuaXR5KClcbiIpOwogCi0gIG15ICRoZWxsbyA9IG5ldyBUaHJpZnRUZXN0OjpYdHJ1Y3Qoe3N0cmluZ190aGluZyA9PiAiSGVsbG8yIiwgYnl0ZV90aGluZyA9PiAyLCBpMzJfdGhpbmcgPT4gMiwgaTY0X3RoaW5nID0+IDJ9KTsKKyAgbXkgJGhlbGxvID0gVGhyaWZ0VGVzdDo6WHRydWN0LT5uZXcoe3N0cmluZ190aGluZyA9PiAnSGVsbG8yJywgYnl0ZV90aGluZyA9PiAyLCBpMzJfdGhpbmcgPT4gMiwgaTY0X3RoaW5nID0+IDJ9KTsKICAgbXkgQGhlbGxvczsKICAgcHVzaChAaGVsbG9zLCAkaGVsbG8pOwotICBteSAkZ29vZGJ5ZSA9IG5ldyBUaHJpZnRUZXN0OjpYdHJ1Y3Qoe3N0cmluZ190aGluZyA9PiAiR29vZGJ5ZTQiLCBieXRlX3RoaW5nID0+IDQsIGkzMl90aGluZyA9PiA0LCBpNjRfdGhpbmcgPT4gNH0pOworICBteSAkZ29vZGJ5ZSA9IFRocmlmdFRlc3Q6Olh0cnVjdC0+bmV3KHtzdHJpbmdfdGhpbmcgPT4gJ0dvb2RieWU0JywgYnl0ZV90aGluZyA9PiA0LCBpMzJfdGhpbmcgPT4gNCwgaTY0X3RoaW5nID0+IDR9KTsKICAgbXkgQGdvb2RieWVzOwogICBwdXNoKEBnb29kYnllcywgJGdvb2RieWUpOwotICBteSAkY3JhenkgPSBuZXcgVGhyaWZ0VGVzdDo6SW5zYW5pdHkoe3VzZXJNYXAgPT4geyBUaHJpZnRUZXN0OjpOdW1iZXJ6OjpFSUdIVCA9PiA4IH0sIHh0cnVjdHMgPT4gXEBnb29kYnllc30pOwotICBteSAkbG9vbnkgPSBuZXcgVGhyaWZ0VGVzdDo6SW5zYW5pdHkoKTsKKyAgbXkgJGNyYXp5ID0gVGhyaWZ0VGVzdDo6SW5zYW5pdHktPm5ldyh7dXNlck1hcCA9PiB7IFRocmlmdFRlc3Q6Ok51bWJlcno6OkVJR0hUID0+IDggfSwgeHRydWN0cyA9PiBcQGdvb2RieWVzfSk7CisgIG15ICRsb29ueSA9IFRocmlmdFRlc3Q6Okluc2FuaXR5LT5uZXcoKTsKICAgbXkgJHJlc3VsdCA9IHsgMSA9PiB7IFRocmlmdFRlc3Q6Ok51bWJlcno6OlRXTyA9PiAkYXJndW1lbnQsIFRocmlmdFRlc3Q6Ok51bWJlcno6OlRIUkVFID0+ICRhcmd1bWVudCB9LAogICAgICAgICAgICAgICAgICAyID0+IHsgVGhyaWZ0VGVzdDo6TnVtYmVyejo6U0lYID0+ICRsb29ueSB9IH07CiAgIHJldHVybiAkcmVzdWx0OwogfQogCi1zdWIgdGVzdE11bHRpKCkgeworc3ViIHRlc3RNdWx0aSB7CiAgIG15ICRzZWxmID0gc2hpZnQ7CiAgIG15ICRhcmcwID0gc2hpZnQ7CiAgIG15ICRhcmcxID0gc2hpZnQ7CkBAIC0zNDIsNDcgKzM0Myw2OSBAQAogICBteSAkYXJnMyA9IHNoaWZ0OwogICBteSAkYXJnNCA9IHNoaWZ0OwogICBteSAkYXJnNSA9IHNoaWZ0OwotICAKKwogICBwcmludCgidGVzdE11bHRpKClcbiIpOwotICByZXR1cm4gbmV3IFRocmlmdFRlc3Q6Olh0cnVjdCh7c3RyaW5nX3RoaW5nID0+ICJIZWxsbzIiLCBieXRlX3RoaW5nID0+ICRhcmcwLCBpMzJfdGhpbmcgPT4gJGFyZzEsIGk2NF90aGluZyA9PiAkYXJnMn0pOworICByZXR1cm4gVGhyaWZ0VGVzdDo6WHRydWN0LT5uZXcoe3N0cmluZ190aGluZyA9PiAnSGVsbG8yJywgYnl0ZV90aGluZyA9PiAkYXJnMCwgaTMyX3RoaW5nID0+ICRhcmcxLCBpNjRfdGhpbmcgPT4gJGFyZzJ9KTsKIH0KIAotc3ViIHRlc3RFeGNlcHRpb24oKSB7CitzdWIgdGVzdEV4Y2VwdGlvbiB7CiAgIG15ICRzZWxmID0gc2hpZnQ7CiAgIG15ICRhcmcgPSBzaGlmdDsKICAgcHJpbnQoInRlc3RFeGNlcHRpb24oJGFyZylcbiIpOwotICBpZiAoJGFyZyBlcSAiWGNlcHRpb24iKSB7Ci0gICAgZGllIG5ldyBUaHJpZnRUZXN0OjpYY2VwdGlvbih7ZXJyb3JDb2RlID0+IDEwMDEsIG1lc3NhZ2UgPT4gJGFyZ30pOwotICB9IGVsc2lmICgkYXJnIGVxICJURXhjZXB0aW9uIikgewotICAgIGRpZSAiYXN0cmluZyI7ICMgYWxsIHVuaGFuZGxlZCBleGNlcHRpb25zIGJlY29tZSBURXhjZXB0aW9ucwotICB9IGVsc2UgewotICAgIHJldHVybiBuZXcgVGhyaWZ0VGVzdDo6WHRydWN0KHtzdHJpbmdfdGhpbmcgPT4gJGFyZ30pOworICBpZiAoJGFyZyBlcSAnWGNlcHRpb24nKSB7CisgICAgICBkaWUgVGhyaWZ0VGVzdDo6WGNlcHRpb24tPm5ldyh7ZXJyb3JDb2RlID0+IDEwMDEsIG1lc3NhZ2UgPT4gJGFyZ30pOworICB9CisgIGVsc2lmICgkYXJnIGVxICdURXhjZXB0aW9uJykgeworICAgICAgZGllICdhc3RyaW5nJzsgIyBhbGwgdW5oYW5kbGVkIGV4Y2VwdGlvbnMgYmVjb21lIFRFeGNlcHRpb25zCisgIH0KKyAgZWxzZSB7CisgICAgICByZXR1cm4gVGhyaWZ0VGVzdDo6WHRydWN0LT5uZXcoe3N0cmluZ190aGluZyA9PiAkYXJnfSk7CiAgIH0KIH0KIAotc3ViIHRlc3RNdWx0aUV4Y2VwdGlvbigpIHsKK3N1YiB0ZXN0TXVsdGlFeGNlcHRpb24gewogICBteSAkc2VsZiA9IHNoaWZ0OwogICBteSAkYXJnMCA9IHNoaWZ0OwogICBteSAkYXJnMSA9IHNoaWZ0OwogCiAgIHByaW50ZigidGVzdE11bHRpRXhjZXB0aW9uKCVzLCAlcylcbiIsICRhcmcwLCAkYXJnMSk7Ci0gIGlmICgkYXJnMCBlcSAiWGNlcHRpb24iKSB7Ci0gICAgZGllIG5ldyBUaHJpZnRUZXN0OjpYY2VwdGlvbih7ZXJyb3JDb2RlID0+IDEwMDEsIG1lc3NhZ2UgPT4gIlRoaXMgaXMgYW4gWGNlcHRpb24ifSk7Ci0gIH0gZWxzaWYgKCRhcmcwIGVxICJYY2VwdGlvbjIiKSB7Ci0gICAgbXkgJHN0cnVjdF90aGluZyA9IG5ldyBUaHJpZnRUZXN0OjpYdHJ1Y3Qoe3N0cmluZ190aGluZyA9PiAiVGhpcyBpcyBhbiBYY2VwdGlvbjIifSk7Ci0gICAgZGllIG5ldyBUaHJpZnRUZXN0OjpYY2VwdGlvbjIoe2Vycm9yQ29kZSA9PiAyMDAyLCBzdHJ1Y3RfdGhpbmcgPT4gJHN0cnVjdF90aGluZ30pOwotICB9IGVsc2UgewotICAgIHJldHVybiBuZXcgVGhyaWZ0VGVzdDo6WHRydWN0KHtzdHJpbmdfdGhpbmcgPT4gJGFyZzF9KTsKKyAgaWYgKCRhcmcwIGVxICdYY2VwdGlvbicpIHsKKyAgICBkaWUgVGhyaWZ0VGVzdDo6WGNlcHRpb24tPm5ldyh7ZXJyb3JDb2RlID0+IDEwMDEsIG1lc3NhZ2UgPT4gJ1RoaXMgaXMgYW4gWGNlcHRpb24nfSk7CisgIH0KKyAgZWxzaWYgKCRhcmcwIGVxICdYY2VwdGlvbjInKSB7CisgICAgbXkgJHN0cnVjdF90aGluZyA9IFRocmlmdFRlc3Q6Olh0cnVjdC0+bmV3KHtzdHJpbmdfdGhpbmcgPT4gJ1RoaXMgaXMgYW4gWGNlcHRpb24yJ30pOworICAgIGRpZSBUaHJpZnRUZXN0OjpYY2VwdGlvbjItPm5ldyh7ZXJyb3JDb2RlID0+IDIwMDIsIHN0cnVjdF90aGluZyA9PiAkc3RydWN0X3RoaW5nfSk7CisgIH0KKyAgZWxzZSB7CisgICAgcmV0dXJuIFRocmlmdFRlc3Q6Olh0cnVjdC0+bmV3KHtzdHJpbmdfdGhpbmcgPT4gJGFyZzF9KTsKICAgfQogfQogCi1zdWIgdGVzdE9uZXdheSgpIHsKK3N1YiB0ZXN0T25ld2F5IHsKICAgbXkgJHNlbGYgPSBzaGlmdDsKLSAgbXkgJHNsZWVwRm9yID0gc2hpZnQ7Ci0gIHByaW50KCJ0ZXN0T25ld2F5KCRzbGVlcEZvcik6IFNsZWVwaW5nLi4uXG4iKTsKLSAgc2xlZXAgJHNsZWVwRm9yOwotICBwcmludCgidGVzdE9uZXdheSgkc2xlZXBGb3IpOiBkb25lIHNsZWVwaW5nIVxuIik7CisgIG15ICRudW0gPSBzaGlmdDsKKyAgcHJpbnQoInRlc3RPbmV3YXkoJG51bSk6IHJlY2VpdmVkXG4iKTsKIH0KIAorIyMjCisjIyMgVGVzdCBzZXJ2ZXIgaW1wbGVtZW50YXRpb24KKyMjIworCitwYWNrYWdlIFNlY29uZFNlcnZpY2VIYW5kbGVyOworCit1c2UgYmFzZSBxdyggVGhyaWZ0VGVzdDo6U2Vjb25kU2VydmljZUlmICk7CisKK3N1YiBuZXcgeworICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKKyAgICBteSAkc2VsZiA9IHt9OworICAgIHJldHVybiBibGVzcygkc2VsZiwgJGNsYXNzbmFtZSk7Cit9CisKK3N1YiBzZWNvbmR0ZXN0U3RyaW5nIHsKKyAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgbXkgJHRoaW5nID0gc2hpZnQ7CisgIHByaW50KCJ0ZXN0U3RyaW5nKCR0aGluZylcbiIpOworICByZXR1cm4gcXF8dGVzdFN0cmluZygiJHRoaW5nIil8OworfQogCiAxOwpkaWZmIC0tZ2l0IGEvdGVzdC9waHAvTWFrZWZpbGUuYW0gYi90ZXN0L3BocC9NYWtlZmlsZS5hbQppbmRleCAxMTk3NGRhLi43MmY3ZmM1IDEwMDc1NQotLS0gYS90ZXN0L3BocC9NYWtlZmlsZS5hbQorKysgYi90ZXN0L3BocC9NYWtlZmlsZS5hbQpAQCAtMTcsMTggKzE3LDIzIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1USFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAotCiBzdHViczogLi4vVGhyaWZ0VGVzdC50aHJpZnQKIAkkKFRIUklGVCkgLS1nZW4gcGhwIC4uL1RocmlmdFRlc3QudGhyaWZ0CiAJJChUSFJJRlQpIC0tZ2VuIHBocDppbmxpbmVkIC4uL1RocmlmdFRlc3QudGhyaWZ0CisJJChNS0RJUl9QKSBnZW4tcGhwLWNsYXNzbWFwCisJJChUSFJJRlQpIC1vdXQgZ2VuLXBocC1jbGFzc21hcCAtLWdlbiBwaHAgLi4vVGhyaWZ0VGVzdC50aHJpZnQKIAotcHJlY3Jvc3M6IHN0dWJzCitwaHBfZXh0X2RpcjoKKwlta2RpciAtcCBwaHBfZXh0X2RpcgorCWxuIC1zIC4uLy4uLy4uL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvbW9kdWxlcy90aHJpZnRfcHJvdG9jb2wuc28gcGhwX2V4dF9kaXIvCisJbG4gLXMgIiQkKHBocC1jb25maWcgLS1leHRlbnNpb24tZGlyKS9zb2NrZXRzLnNvIiBwaHBfZXh0X2Rpci8KIAotY2hlY2s6IHN0dWJzCitwcmVjcm9zczogc3R1YnMgcGhwX2V4dF9kaXIKKworY2hlY2s6IHN0dWJzIHBocF9leHRfZGlyCiAKIGNsZWFuLWxvY2FsOgotCSQoUk0pIC1yIGdlbi1waHAgZ2VuLXBocGkKKwkkKFJNKSAtciBnZW4tcGhwIGdlbi1waHBpIGdlbi1waHAtY2xhc3NtYXAgcGhwX2V4dF9kaXIKIAotY2xpZW50OiBzdHVicworY2xpZW50OiBzdHVicyBwaHBfZXh0X2RpcgogCXBocCBUZXN0Q2xpZW50LnBocApkaWZmIC0tZ2l0IGEvdGVzdC9waHAvVGVzdENsYXNzbWFwLnBocCBiL3Rlc3QvcGhwL1Rlc3RDbGFzc21hcC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZkMTU5NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcGhwL1Rlc3RDbGFzc21hcC5waHAKQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCis8P3BocAorJEdFTl9ESVIgPSAnZ2VuLXBocC1jbGFzc21hcCc7CitpbmNsdWRlX29uY2UoJ1Rlc3RDbGllbnQucGhwJyk7Cis/PgpkaWZmIC0tZ2l0IGEvdGVzdC9waHAvVGVzdENsaWVudC5waHAgYi90ZXN0L3BocC9UZXN0Q2xpZW50LnBocAppbmRleCBjZTU3ZGMwLi5hY2Q5MDFkIDEwMDc1NQotLS0gYS90ZXN0L3BocC9UZXN0Q2xpZW50LnBocAorKysgYi90ZXN0L3BocC9UZXN0Q2xpZW50LnBocApAQCAtMiw3ICsyLDggQEAKIAogbmFtZXNwYWNlIHRlc3RccGhwOwogCi1yZXF1aXJlX29uY2UgX19ESVJfXy4nLy4uLy4uL2xpYi9waHAvbGliL1RocmlmdC9DbGFzc0xvYWRlci9UaHJpZnRDbGFzc0xvYWRlci5waHAnOworLyoqIEB2YXIgXENvbXBvc2VyXEF1dG9sb2FkXENsYXNzTG9hZGVyICRsb2FkZXIgKi8KKyRsb2FkZXIgPSByZXF1aXJlIF9fRElSX18gLiAnLy4uLy4uL3ZlbmRvci9hdXRvbG9hZC5waHAnOwogCiB1c2UgVGhyaWZ0XENsYXNzTG9hZGVyXFRocmlmdENsYXNzTG9hZGVyOwogCkBAIC0xMywxMCArMTQsMTQgQEAKICAgJE1PREUgPSAnbm9ybWFsJzsKIH0KIAotJGxvYWRlciA9IG5ldyBUaHJpZnRDbGFzc0xvYWRlcigpOwotJGxvYWRlci0+cmVnaXN0ZXJOYW1lc3BhY2UoJ1RocmlmdCcsIF9fRElSX18gLiAnLy4uLy4uL2xpYi9waHAvbGliJyk7Ci0kbG9hZGVyLT5yZWdpc3RlckRlZmluaXRpb24oJ1RocmlmdFRlc3QnLCAkR0VOX0RJUik7Ci0kbG9hZGVyLT5yZWdpc3RlcigpOworCitpZiAoJEdFTl9ESVIgPT0gJ2dlbi1waHAnKSB7CisgICRsb2FkZXItPmFkZFBzcjQoJycsICRHRU5fRElSKTsKK30gZWxzZSB7CisgICRsb2FkZXIgPSBuZXcgVGhyaWZ0Q2xhc3NMb2FkZXIoKTsKKyAgJGxvYWRlci0+cmVnaXN0ZXJEZWZpbml0aW9uKCdUaHJpZnRUZXN0JywgJEdFTl9ESVIpOworICAkbG9hZGVyLT5yZWdpc3RlcigpOworfQogCiAvKgogICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQpAQCAtNDAsNiArNDUsNyBAQAogLyoqIEluY2x1ZGUgdGhlIFRocmlmdCBiYXNlICovCiAvKiogSW5jbHVkZSB0aGUgcHJvdG9jb2xzICovCiB1c2UgVGhyaWZ0XFByb3RvY29sXFRCaW5hcnlQcm90b2NvbDsKK3VzZSBUaHJpZnRcUHJvdG9jb2xcVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQ7CiB1c2UgVGhyaWZ0XFByb3RvY29sXFRDb21wYWN0UHJvdG9jb2w7CiB1c2UgVGhyaWZ0XFByb3RvY29sXFRKU09OUHJvdG9jb2w7CiAKQEAgLTU5LDkgKzY1LDE2IEBACiAgICAgcmV0dXJuIG5ldyBUQ29tcGFjdFByb3RvY29sKCR0cmFuc3BvcnQpOwogICB9IGVsc2UgaWYgKCRQUk9UTyA9PSAnanNvbicpIHsKICAgICByZXR1cm4gbmV3IFRKU09OUHJvdG9jb2woJHRyYW5zcG9ydCk7CisgIH0gZWxzZSBpZiAoJFBST1RPID09ICdhY2NlbCcpIHsKKyAgICBpZiAoIWZ1bmN0aW9uX2V4aXN0cygndGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeScpKSB7CisgICAgICBlY2hvICJBY2NlbGVyYXRpb24gZXh0ZW5zaW9uIGlzIG5vdCBsb2FkZWRcbiI7CisgICAgICBleGl0KDEpOworICAgIH0KKyAgICByZXR1cm4gbmV3IFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKCR0cmFuc3BvcnQpOwogICB9CiAKLSAgZGllICgiLS1wcm90b2NvbCBtdXN0IGJlIG9uZSBvZiB7YmluYXJ5fGNvbXBhY3R8anNvbn0iKTsKKyAgZWNobyAiLS1wcm90b2NvbCBtdXN0IGJlIG9uZSBvZiB7YmluYXJ5fGNvbXBhY3R8anNvbnxhY2NlbH1cbiI7CisgIGV4aXQoMSk7CiB9CiAKICRob3N0ID0gJ2xvY2FsaG9zdCc7CkBAIC04Miw3ICs5NSw3IEBACiAgICAgJE1PREUgPSBzdWJzdHIoJGFyZywgMTIpOwogICB9IGVsc2UgaWYgKHN1YnN0cigkYXJnLCAwLCAxMSkgPT0gJy0tcHJvdG9jb2w9JykgewogICAgICRQUk9UTyA9IHN1YnN0cigkYXJnLCAxMSk7Ci0gIH0gCisgIH0KIH0KIAogJGhvc3RzID0gYXJyYXkoJ2xvY2FsaG9zdCcpOwpAQCAtMTEwLDYgKzEyMywxMiBAQAogCiAkc3RhcnQgPSBtaWNyb3RpbWUodHJ1ZSk7CiAKK2RlZmluZSgnRVJSX0JBU0VUWVBFUycsIDEpOworZGVmaW5lKCdFUlJfU1RSVUNUUycsIDIpOworZGVmaW5lKCdFUlJfQ09OVEFJTkVSUycsIDQpOworZGVmaW5lKCdFUlJfRVhDRVBUSU9OUycsIDgpOworZGVmaW5lKCdFUlJfVU5LTk9XTicsIDY0KTsKKyRleGl0Y29kZSA9IDA7CiAvKioKICAqIFZPSUQgVEVTVAogICovCkBAIC0xMTcsNDAgKzEzNiw1MyBAQAogJHRlc3RDbGllbnQtPnRlc3RWb2lkKCk7CiBwcmludF9yKCIgPSB2b2lkXG4iKTsKIAorZnVuY3Rpb24gcm91bmR0cmlwKCR0ZXN0Q2xpZW50LCAkbWV0aG9kLCAkdmFsdWUpIHsKKyAgZ2xvYmFsICRleGl0Y29kZTsKKyAgcHJpbnRfcigiJG1ldGhvZCgkdmFsdWUpIik7CisgICRyZXQgPSAkdGVzdENsaWVudC0+JG1ldGhvZCgkdmFsdWUpOworICBwcmludF9yKCIgPSBcIiRyZXRcIlxuIik7CisgIGlmICgkdmFsdWUgIT09ICRyZXQpIHsKKyAgICBwcmludF9yKCIqKiogRkFJTEVEICoqKlxuIik7CisgICAgJGV4aXRjb2RlIHw9IEVSUl9CQVNFVFlQRVM7CisgIH0KK30KKwogLyoqCiAgKiBTVFJJTkcgVEVTVAogICovCi1wcmludF9yKCJ0ZXN0U3RyaW5nKFwiVGVzdFwiKSIpOwotJHMgPSAkdGVzdENsaWVudC0+dGVzdFN0cmluZygiVGVzdCIpOwotcHJpbnRfcigiID0gXCIkc1wiXG4iKTsKK3JvdW5kdHJpcCgkdGVzdENsaWVudCwgJ3Rlc3RTdHJpbmcnLCAiVGVzdCIpOworCisvKioKKyAqIEJPT0wgVEVTVAorICovCityb3VuZHRyaXAoJHRlc3RDbGllbnQsICd0ZXN0Qm9vbCcsIHRydWUpOworcm91bmR0cmlwKCR0ZXN0Q2xpZW50LCAndGVzdEJvb2wnLCBmYWxzZSk7CiAKIC8qKgogICogQllURSBURVNUCiAgKi8KLXByaW50X3IoInRlc3RCeXRlKDEpIik7Ci0kdTggPSAkdGVzdENsaWVudC0+dGVzdEJ5dGUoMSk7Ci1wcmludF9yKCIgPSAkdThcbiIpOworcm91bmR0cmlwKCR0ZXN0Q2xpZW50LCAndGVzdEJ5dGUnLCAxKTsKK3JvdW5kdHJpcCgkdGVzdENsaWVudCwgJ3Rlc3RCeXRlJywgLTEpOworcm91bmR0cmlwKCR0ZXN0Q2xpZW50LCAndGVzdEJ5dGUnLCAxMjcpOworcm91bmR0cmlwKCR0ZXN0Q2xpZW50LCAndGVzdEJ5dGUnLCAtMTI4KTsKIAogLyoqCiAgKiBJMzIgVEVTVAogICovCi1wcmludF9yKCJ0ZXN0STMyKC0xKSIpOwotJGkzMiA9ICR0ZXN0Q2xpZW50LT50ZXN0STMyKC0xKTsKLXByaW50X3IoIiA9ICRpMzJcbiIpOworcm91bmR0cmlwKCR0ZXN0Q2xpZW50LCAndGVzdEkzMicsIC0xKTsKIAogLyoqCiAgKiBJNjQgVEVTVAogICovCi1wcmludF9yKCJ0ZXN0STY0KC0zNDM1OTczODM2OCkiKTsKLSRpNjQgPSAkdGVzdENsaWVudC0+dGVzdEk2NCgtMzQzNTk3MzgzNjgpOwotcHJpbnRfcigiID0gJGk2NFxuIik7Cityb3VuZHRyaXAoJHRlc3RDbGllbnQsICd0ZXN0STY0JywgMCk7Cityb3VuZHRyaXAoJHRlc3RDbGllbnQsICd0ZXN0STY0JywgMSk7Cityb3VuZHRyaXAoJHRlc3RDbGllbnQsICd0ZXN0STY0JywgLTEpOworcm91bmR0cmlwKCR0ZXN0Q2xpZW50LCAndGVzdEk2NCcsIC0zNDM1OTczODM2OCk7CiAKIC8qKgogICogRE9VQkxFIFRFU1QKICAqLwotcHJpbnRfcigidGVzdERvdWJsZSgtODUyLjIzNDIzNDIzNCkiKTsKLSRkdWIgPSAkdGVzdENsaWVudC0+dGVzdERvdWJsZSgtODUyLjIzNDIzNDIzNCk7Ci1wcmludF9yKCIgPSAkZHViXG4iKTsKK3JvdW5kdHJpcCgkdGVzdENsaWVudCwgJ3Rlc3REb3VibGUnLCAtODUyLjIzNDIzNDIzNCk7CiAKIC8qKgogICogQklOQVJZIFRFU1QgIC0tICBUT0RPCkBAIC0xNzEsNiArMjAzLDExIEBACiAgICAgICAgICRpbi0+aTMyX3RoaW5nLiIsICIuCiAgICAgICAgICRpbi0+aTY0X3RoaW5nLiJ9XG4iKTsKIAoraWYgKCRpbiAhPSAkb3V0KSB7CisgICAgZWNobyAiKipGQUlMRUQqKlxuIjsKKyAgICAkZXhpdGNvZGUgfD0gRVJSX1NUUlVDVFM7Cit9CisKIC8qKgogICogTkVTVEVEIFNUUlVDVCBURVNUCiAgKi8KQEAgLTE4OCw2ICsyMjUsMTEgQEAKICAgICAgICAgJGluLT5pNjRfdGhpbmcuIn0sICIuCiAgICAgICAgICRpbjItPmkzMl90aGluZy4ifVxuIik7CiAKK2lmICgkaW4yICE9ICRvdXQyKSB7CisgICAgZWNobyAiKipGQUlMRUQqKlxuIjsKKyAgICAkZXhpdGNvZGUgfD0gRVJSX1NUUlVDVFM7Cit9CisKIC8qKgogICogTUFQIFRFU1QKICAqLwpAQCAtMjIwLDM2ICsyNjIsNjkgQEAKIH0KIHByaW50X3IoIn1cbiIpOwogCitpZiAoJG1hcGluICE9ICRtYXBvdXQpIHsKKyAgICBlY2hvICIqKkZBSUxFRCoqXG4iOworICAgICRleGl0Y29kZSB8PSBFUlJfQ09OVEFJTkVSUzsKK30KKworJG1hcG91dCA9IGFycmF5KCk7Citmb3IgKCRpID0gMDsgJGkgPCAxMDsgJGkrKykgeworICAgICRtYXBvdXRbImtleSRpIl0gPSAidmFsJGkiOworfQorcHJpbnRfcigndGVzdFN0cmluZ01hcCh7Jyk7CiskZmlyc3QgPSB0cnVlOworZm9yZWFjaCAoJG1hcG91dCBhcyAka2V5ID0+ICR2YWwpIHsKKyAgaWYgKCRmaXJzdCkgeworICAgICRmaXJzdCA9IGZhbHNlOworICB9IGVsc2UgeworICAgIHByaW50X3IoIiwgIik7CisgIH0KKyAgcHJpbnRfcigiXCIka2V5XCIgPT4gXCIkdmFsXCIiKTsKK30KK3ByaW50X3IoIn0pIik7CiskbWFwaW4gPSAkdGVzdENsaWVudC0+dGVzdFN0cmluZ01hcCgkbWFwb3V0KTsKK3ByaW50X3IoIiA9IHsiKTsKKyRmaXJzdCA9IHRydWU7Citmb3JlYWNoICgkbWFwaW4gYXMgJGtleSA9PiAkdmFsKSB7CisgIGlmICgkZmlyc3QpIHsKKyAgICAkZmlyc3QgPSBmYWxzZTsKKyAgfSBlbHNlIHsKKyAgICBwcmludF9yKCIsICIpOworICB9CisgIHByaW50X3IoIlwiJGtleVwiID0+IFwiJHZhbFwiIik7Cit9CitwcmludF9yKCJ9XG4iKTsKK2tzb3J0KCRtYXBpbik7CitpZiAoJG1hcGluICE9ICRtYXBvdXQpIHsKKyAgICBlY2hvICIqKkZBSUxFRCoqXG4iOworICAgICRleGl0Y29kZSB8PSBFUlJfQ09OVEFJTkVSUzsKK30KKwogLyoqCiAgKiBTRVQgVEVTVAogICovCiAkc2V0b3V0ID0gYXJyYXkoKTs7CiBmb3IgKCRpID0gLTI7ICRpIDwgMzsgKyskaSkgewotICAkc2V0b3V0IFtdPSAkaTsKKyAgJHNldG91dFskaV09IHRydWU7CiB9CiBwcmludF9yKCJ0ZXN0U2V0KHsiKTsKLSRmaXJzdCA9IHRydWU7Ci1mb3JlYWNoICgkc2V0b3V0IGFzICR2YWwpIHsKLSAgaWYgKCRmaXJzdCkgewotICAgICRmaXJzdCA9IGZhbHNlOwotICB9IGVsc2UgewotICAgIHByaW50X3IoIiwgIik7Ci0gIH0KLSAgcHJpbnRfcigkdmFsKTsKLX0KK2VjaG8gaW1wbG9kZSgnLCcsIGFycmF5X2tleXMoJHNldG91dCkpOwogcHJpbnRfcigifSkiKTsKICRzZXRpbiA9ICR0ZXN0Q2xpZW50LT50ZXN0U2V0KCRzZXRvdXQpOwogcHJpbnRfcigiID0geyIpOwotJGZpcnN0ID0gdHJ1ZTsKLWZvcmVhY2ggKCRzZXRpbiBhcyAkdmFsKSB7Ci0gIGlmICgkZmlyc3QpIHsKLSAgICAkZmlyc3QgPSBmYWxzZTsKLSAgfSBlbHNlIHsKLSAgICBwcmludF9yKCIsICIpOwotICB9Ci0gIHByaW50X3IoJHZhbCk7Ci19CitlY2hvIGltcGxvZGUoJywgJywgYXJyYXlfa2V5cygkc2V0aW4pKTsKIHByaW50X3IoIn1cbiIpOworLy8gT3JkZXIgb2Yga2V5cyBpbiBzZXQgZG9lcyBub3QgbWF0dGVyCitrc29ydCgkc2V0aW4pOworaWYgKCRzZXRvdXQgIT09ICRzZXRpbikgeworICAgIGVjaG8gIioqRkFJTEVEKipcbiI7CisgICAgJGV4aXRjb2RlIHw9IEVSUl9DT05UQUlORVJTOworfQorLy8gUmVncmVzc2lvbiB0ZXN0IGZvciBjb3JydXB0ZWQgYXJyYXkKK2lmICgkc2V0aW5bMl0gIT09ICRzZXRvdXRbMl0gfHwgaXNfaW50KCRzZXRpblsyXSkpIHsKKyAgICBlY2hvICIqKkZBSUxFRCoqXG4iOworICAgICRleGl0Y29kZSB8PSBFUlJfQ09OVEFJTkVSUzsKK30KIAogLyoqCiAgKiBMSVNUIFRFU1QKQEAgLTI4MSw2ICszNTYsMTAgQEAKICAgcHJpbnRfcigkdmFsKTsKIH0KIHByaW50X3IoIn1cbiIpOworaWYgKCRsaXN0aW4gIT09ICRsaXN0b3V0KSB7CisgICAgZWNobyAiKipGQUlMRUQqKlxuIjsKKyAgICAkZXhpdGNvZGUgfD0gRVJSX0NPTlRBSU5FUlM7Cit9CiAKIC8qKgogICogRU5VTSBURVNUCkBAIC0yODgsMjIgKzM2Nyw0MiBAQAogcHJpbnRfcigidGVzdEVudW0oT05FKSIpOwogJHJldCA9ICR0ZXN0Q2xpZW50LT50ZXN0RW51bShcVGhyaWZ0VGVzdFxOdW1iZXJ6OjpPTkUpOwogcHJpbnRfcigiID0gJHJldFxuIik7CitpZiAoJHJldCAhPSBcVGhyaWZ0VGVzdFxOdW1iZXJ6OjpPTkUpIHsKKyAgICBlY2hvICIqKkZBSUxFRCoqXG4iOworICAgICRleGl0Y29kZSB8PSBFUlJfU1RSVUNUUzsKK30KIAogcHJpbnRfcigidGVzdEVudW0oVFdPKSIpOwogJHJldCA9ICR0ZXN0Q2xpZW50LT50ZXN0RW51bShcVGhyaWZ0VGVzdFxOdW1iZXJ6OjpUV08pOwogcHJpbnRfcigiID0gJHJldFxuIik7CitpZiAoJHJldCAhPSBcVGhyaWZ0VGVzdFxOdW1iZXJ6OjpUV08pIHsKKyAgICBlY2hvICIqKkZBSUxFRCoqXG4iOworICAgICRleGl0Y29kZSB8PSBFUlJfU1RSVUNUUzsKK30KIAogcHJpbnRfcigidGVzdEVudW0oVEhSRUUpIik7CiAkcmV0ID0gJHRlc3RDbGllbnQtPnRlc3RFbnVtKFxUaHJpZnRUZXN0XE51bWJlcno6OlRIUkVFKTsKIHByaW50X3IoIiA9ICRyZXRcbiIpOworaWYgKCRyZXQgIT0gXFRocmlmdFRlc3RcTnVtYmVyejo6VEhSRUUpIHsKKyAgICBlY2hvICIqKkZBSUxFRCoqXG4iOworICAgICRleGl0Y29kZSB8PSBFUlJfU1RSVUNUUzsKK30KIAogcHJpbnRfcigidGVzdEVudW0oRklWRSkiKTsKICRyZXQgPSAkdGVzdENsaWVudC0+dGVzdEVudW0oXFRocmlmdFRlc3RcTnVtYmVyejo6RklWRSk7CiBwcmludF9yKCIgPSAkcmV0XG4iKTsKK2lmICgkcmV0ICE9IFxUaHJpZnRUZXN0XE51bWJlcno6OkZJVkUpIHsKKyAgICBlY2hvICIqKkZBSUxFRCoqXG4iOworICAgICRleGl0Y29kZSB8PSBFUlJfU1RSVUNUUzsKK30KIAogcHJpbnRfcigidGVzdEVudW0oRUlHSFQpIik7CiAkcmV0ID0gJHRlc3RDbGllbnQtPnRlc3RFbnVtKFxUaHJpZnRUZXN0XE51bWJlcno6OkVJR0hUKTsKIHByaW50X3IoIiA9ICRyZXRcbiIpOworaWYgKCRyZXQgIT0gXFRocmlmdFRlc3RcTnVtYmVyejo6RUlHSFQpIHsKKyAgICBlY2hvICIqKkZBSUxFRCoqXG4iOworICAgICRleGl0Y29kZSB8PSBFUlJfU1RSVUNUUzsKK30KIAogLyoqCiAgKiBUWVBFREVGIFRFU1QKQEAgLTMxMSw2ICs0MTAsMTAgQEAKIHByaW50X3IoInRlc3RUeXBlZGVmKDMwOTg1ODIzNTA4MjUyMykiKTsKICR1aWQgPSAkdGVzdENsaWVudC0+dGVzdFR5cGVkZWYoMzA5ODU4MjM1MDgyNTIzKTsKIHByaW50X3IoIiA9ICR1aWRcbiIpOworaWYgKCR1aWQgIT09IDMwOTg1ODIzNTA4MjUyMykgeworICAgIGVjaG8gIioqRkFJTEVEKipcbiI7CisgICAgJGV4aXRjb2RlIHw9IEVSUl9TVFJVQ1RTOworfQogCiAvKioKICAqIE5FU1RFRCBNQVAgVEVTVApAQCAtMzI2LDYgKzQyOSwxNCBAQAogICBwcmludF9yKCJ9LCAiKTsKIH0KIHByaW50X3IoIn1cbiIpOworJGV4cGVjdGVkX21tID0gWworICAtNCA9PiBbLTQgPT4gLTQsIC0zID0+IC0zLCAtMiA9PiAtMiwgLTEgPT4gLTFdLAorICA0ID0+IFs0ID0+IDQsIDMgPT4gMywgMiA9PiAyLCAxID0+IDFdLAorXTsKK2lmICgkbW0gIT0gJGV4cGVjdGVkX21tKSB7CisgICAgZWNobyAiKipGQUlMRUQqKlxuIjsKKyAgICAkZXhpdGNvZGUgfD0gRVJSX0NPTlRBSU5FUlM7Cit9CiAKIC8qKgogICogSU5TQU5JVFkgVEVTVApAQCAtMzc3LDEwICs0ODgsMjkgQEAKIHRyeSB7CiAgICR0ZXN0Q2xpZW50LT50ZXN0RXhjZXB0aW9uKCdYY2VwdGlvbicpOwogICBwcmludF9yKCIgIHZvaWRcbkZBSUxVUkVcbiIpOworICAkZXhpdGNvZGUgfD0gRVJSX0VYQ0VQVElPTlM7CiB9IGNhdGNoIChcVGhyaWZ0VGVzdFxYY2VwdGlvbiAkeCkgewogICBwcmludF9yKCcgY2F1Z2h0IHhjZXB0aW9uICcuJHgtPmVycm9yQ29kZS4nOiAnLiR4LT5tZXNzYWdlLiJcbiIpOwogfQogCisvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIFRIUklGVC00MjYzCitwcmludF9yKCJ0ZXN0QmluYXJ5U2VyaWFsaXplcl9EZXNlcmlhbGl6ZSgnZm9vJykiKTsKK3RyeSB7CisgIFxUaHJpZnRcU2VyaWFsaXplclxUQmluYXJ5U2VyaWFsaXplcjo6ZGVzZXJpYWxpemUoYmFzZTY0X2RlY29kZSgnZm9vJyksIFxUaHJpZnRUZXN0XFh0cnVjdDI6OmNsYXNzKTsKKyAgZWNobyAiKipGQUlMRUQqKlxuIjsKKyAgJGV4aXRjb2RlIHw9IEVSUl9TVFJVQ1RTOworfSBjYXRjaCAoXFRocmlmdFxFeGNlcHRpb25cVFRyYW5zcG9ydEV4Y2VwdGlvbiAkaGFwcHlfZXhjZXB0aW9uKSB7CisgIC8vIFdlIGV4cGVjdGVkIHRoaXMgZHVlIHRvIGJpbmFyeSBkYXRhIG9mIGJhc2U2NF9kZWNvZGUoJ2ZvbycpIGlzIGxlc3MgdGhlbiA0CisgIC8vIGJ5dGVzIGFuZCBpdCB0cmllcyB0byBmaW5kIHRocmlmdCB2ZXJzaW9uIG51bWJlciBpbiB0aGUgdHJhbnNwb3J0IGJ5CisgIC8vIHJlYWRpbmcgaTMyKCkgYXQgdGhlIGJlZ2lubmluZy4gIENhc3RpbmcgdG8gc3RyaW5nIHZhbGlkYXRlcyB0aGF0CisgIC8vIGV4Y2VwdGlvbiBpcyBzdGlsbCBhY2Nlc3NpYmxlIGluIG1lbW9yeSBhbmQgbm90IGNvcnJ1cHRlZC4gIFdpdGhvdXQgcGF0Y2gsCisgIC8vIFBIUCB3aWxsIGVycm9yIGxvZyB0aGF0IHRoZSBleGNlcHRpb24gZG9lc24ndCBoYXZlIGFueSB0b3N0cmluZyBtZXRob2QsCisgIC8vIHdoaWNoIGlzIGEgbGllIGR1ZSB0byBjb3JydXB0ZWQgbWVtb3J5LgorICBmb3IoJGk9OTk7ICRpID4gMDsgJGktLSkgeworICAgIChzdHJpbmcpJGhhcHB5X2V4Y2VwdGlvbjsKKyAgfQorICBwcmludF9yKCIgIFNVQ0NFU1NcbiIpOworfQogCiAvKioKICAqIE5vcm1hbCB0ZXN0cyBkb25lLgpAQCAtMzk0LDM0ICs1MjQsMzQgQEAKICAqIEV4dHJhbmVvdXMgIkkgZG9uJ3QgdHJ1c3QgUEhQIHRvIHBhY2svdW5wYWNrIGludGVnZXIiIHRlc3RzCiAgKi8KIAoraWYgKCRwcm90b2NvbCBpbnN0YW5jZW9mIFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKSB7CisgICAgLy8gUmVncmVzc2lvbiBjaGVjazogY2hlY2sgdGhhdCBtZXRob2QgbmFtZSBpcyBub3QgZG91YmxlLWZyZWVkCisgICAgLy8gTWV0aG9kIG5hbWUgc2hvdWxkIG5vdCBiZSBhbiBpbnRlcm5lZCBzdHJpbmcuCisgICAgJG1ldGhvZF9uYW1lID0gIlZvaWQiOworICAgICRtZXRob2RfbmFtZSA9ICJ0ZXN0JG1ldGhvZF9uYW1lIjsKKworICAgICRzZXFpZCA9IDA7CisgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0Vm9pZF9hcmdzKCk7CisgICAgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSgkcHJvdG9jb2wsICRtZXRob2RfbmFtZSwgXFRocmlmdFxUeXBlXFRNZXNzYWdlVHlwZTo6Q0FMTCwgJGFyZ3MsICRzZXFpZCwgJHByb3RvY29sLT5pc1N0cmljdFdyaXRlKCkpOworICAgICR0ZXN0Q2xpZW50LT5yZWN2X3Rlc3RWb2lkKCk7CisKK30KKwogLy8gTWF4IEkzMgogJG51bSA9IHBvdygyLCAzMCkgKyAocG93KDIsIDMwKSAtIDEpOwotJG51bTIgPSAkdGVzdENsaWVudC0+dGVzdEkzMigkbnVtKTsKLWlmICgkbnVtICE9ICRudW0yKSB7Ci0gIHByaW50ICJNaXNzZWQgJG51bSA9ICRudW0yXG4iOwotfQorcm91bmR0cmlwKCR0ZXN0Q2xpZW50LCAndGVzdEkzMicsICRudW0pOwogCiAvLyBNaW4gSTMyCiAkbnVtID0gMCAtIHBvdygyLCAzMSk7Ci0kbnVtMiA9ICR0ZXN0Q2xpZW50LT50ZXN0STMyKCRudW0pOwotaWYgKCRudW0gIT0gJG51bTIpIHsKLSAgcHJpbnQgIk1pc3NlZCAkbnVtID0gJG51bTJcbiI7Ci19Cityb3VuZHRyaXAoJHRlc3RDbGllbnQsICd0ZXN0STMyJywgJG51bSk7CiAKIC8vIE1heCBJNjQKICRudW0gPSBwb3coMiwgNjIpICsgKHBvdygyLCA2MikgLSAxKTsKLSRudW0yID0gJHRlc3RDbGllbnQtPnRlc3RJNjQoJG51bSk7Ci1pZiAoJG51bSAhPSAkbnVtMikgewotICBwcmludCAiTWlzc2VkICRudW0gPSAkbnVtMlxuIjsKLX0KK3JvdW5kdHJpcCgkdGVzdENsaWVudCwgJ3Rlc3RJNjQnLCAkbnVtKTsKIAogLy8gTWluIEk2NAotJG51bSA9IDAgLSBwb3coMiwgNjMpOwotJG51bTIgPSAkdGVzdENsaWVudC0+dGVzdEk2NCgkbnVtKTsKLWlmICgkbnVtICE9ICRudW0yKSB7Ci0gIHByaW50ICJNaXNzZWQgJG51bSA9ICRudW0yXG4iOwotfQorJG51bSA9IDAgLSBwb3coMiwgNjIpIC0gcG93KDIsIDYyKTsKK3JvdW5kdHJpcCgkdGVzdENsaWVudCwgJ3Rlc3RJNjQnLCAkbnVtKTsKIAogJHRyYW5zcG9ydC0+Y2xvc2UoKTsKLXJldHVybjsKLQorZXhpdCgkZXhpdGNvZGUpOwpkaWZmIC0tZ2l0IGEvdGVzdC9waHAvdGVzdF9waHAuaW5pIGIvdGVzdC9waHAvdGVzdF9waHAuaW5pCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmOWJiMjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3BocC90ZXN0X3BocC5pbmkKQEAgLTAsMCArMSwyIEBACitleHRlbnNpb249dGhyaWZ0X3Byb3RvY29sLnNvCitleHRlbnNpb249c29ja2V0cy5zbwpkaWZmIC0tZ2l0IGEvdGVzdC9weS50b3JuYWRvL3NldHVwLmNmZyBiL3Rlc3QvcHkudG9ybmFkby9zZXR1cC5jZmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU1ODdjNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcHkudG9ybmFkby9zZXR1cC5jZmcKQEAgLTAsMCArMSwzIEBACitbZmxha2U4XQoraWdub3JlID0gRTQwMgorbWF4LWxpbmUtbGVuZ3RoID0gMTAwCmRpZmYgLS1naXQgYS90ZXN0L3B5LnRvcm5hZG8vdGVzdF9zdWl0ZS5weSBiL3Rlc3QvcHkudG9ybmFkby90ZXN0X3N1aXRlLnB5CmluZGV4IGI2M2VhMmQuLjQ0N2ZkZTYgMTAwNzU1Ci0tLSBhL3Rlc3QvcHkudG9ybmFkby90ZXN0X3N1aXRlLnB5CisrKyBiL3Rlc3QvcHkudG9ybmFkby90ZXN0X3N1aXRlLnB5CkBAIC0yMSwzMCArMjEsMzAgQEAKIAogaW1wb3J0IGRhdGV0aW1lCiBpbXBvcnQgZ2xvYgotaW1wb3J0IHN5cwogaW1wb3J0IG9zCitpbXBvcnQgc3lzCiBpbXBvcnQgdGltZQogaW1wb3J0IHVuaXR0ZXN0CiAKIGJhc2VwYXRoID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpCi1zeXMucGF0aC5pbnNlcnQoMCwgYmFzZXBhdGgrJy9nZW4tcHkudG9ybmFkbycpCi1zeXMucGF0aC5pbnNlcnQoMCwgZ2xvYi5nbG9iKG9zLnBhdGguam9pbihiYXNlcGF0aCwgJy4uLy4uL2xpYi9weS9idWlsZC9saWIuKicpKVswXSkKK3N5cy5wYXRoLmluc2VydCgwLCBiYXNlcGF0aCArICcvZ2VuLXB5LnRvcm5hZG8nKQorc3lzLnBhdGguaW5zZXJ0KDAsIGdsb2IuZ2xvYihvcy5wYXRoLmpvaW4oYmFzZXBhdGgsICcuLi8uLi9saWIvcHkvYnVpbGQvbGliKicpKVswXSkKIAogdHJ5OgogICAgIF9faW1wb3J0X18oJ3Rvcm5hZG8nKQogZXhjZXB0IEltcG9ydEVycm9yOgotICAgIHByaW50ICJtb2R1bGUgYHRvcm5hZG9gIG5vdCBmb3VuZCwgc2tpcHBpbmcgdGVzdCIKKyAgICBwcmludCgibW9kdWxlIGB0b3JuYWRvYCBub3QgZm91bmQsIHNraXBwaW5nIHRlc3QiKQogICAgIHN5cy5leGl0KDApCiAKIGZyb20gdG9ybmFkbyBpbXBvcnQgZ2VuCiBmcm9tIHRvcm5hZG8udGVzdGluZyBpbXBvcnQgQXN5bmNUZXN0Q2FzZSwgZ2V0X3VudXNlZF9wb3J0LCBnZW5fdGVzdAogCiBmcm9tIHRocmlmdCBpbXBvcnQgVFRvcm5hZG8KK2Zyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uCiBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCi1mcm9tIHRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydEV4Y2VwdGlvbgogCiBmcm9tIFRocmlmdFRlc3QgaW1wb3J0IFRocmlmdFRlc3QKLWZyb20gVGhyaWZ0VGVzdC50dHlwZXMgaW1wb3J0ICoKK2Zyb20gVGhyaWZ0VGVzdC50dHlwZXMgaW1wb3J0IFhjZXB0aW9uLCBYdHJ1Y3QKIAogCiBjbGFzcyBUZXN0SGFuZGxlcihvYmplY3QpOgpAQCAtNTUsNiArNTUsOCBAQAogICAgICAgICBwYXNzCiAKICAgICBkZWYgdGVzdFN0cmluZyhzZWxmLCBzKToKKyAgICAgICAgaWYgcyA9PSAndW5leHBlY3RlZF9lcnJvcic6CisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24ocykKICAgICAgICAgcmV0dXJuIHMKIAogICAgIGRlZiB0ZXN0Qnl0ZShzZWxmLCBiKToKQEAgLTg1LDcgKzg3LDcgQEAKICAgICAgICAgICAgIHgubWVzc2FnZSA9IHMKICAgICAgICAgICAgIHJhaXNlIHgKICAgICAgICAgZWxpZiBzID09ICd0aHJvd191bmRlY2xhcmVkJzoKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImZvbyIpCisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCd0ZXN0aW5nIHVuZGVjbGFyZWQgZXhjZXB0aW9uJykKIAogICAgIGRlZiB0ZXN0T25ld2F5KHNlbGYsIHNlY29uZHMpOgogICAgICAgICBzdGFydCA9IHRpbWUudGltZSgpCkBAIC05Nyw2ICs5OSw3IEBACiAgICAgICAgIHNlbGYudGVzdF9pbnN0YW5jZS5pb19sb29wLmFkZF90aW1lb3V0KAogICAgICAgICAgICAgZGF0ZXRpbWUudGltZWRlbHRhKHNlY29uZHM9c2Vjb25kcyksCiAgICAgICAgICAgICBmaXJlX29uZXdheSkKKyAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCd0ZXN0aW5nIGV4Y2VwdGlvbiBpbiBvbmV3YXkgbWV0aG9kJykKIAogICAgIGRlZiB0ZXN0TmVzdChzZWxmLCB0aGluZyk6CiAgICAgICAgIHJldHVybiB0aGluZwpAQCAtMTg3LDEwICsxOTAsMTEgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LmkzMl90aGluZywgLTMpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeS5pNjRfdGhpbmcsIC01KQogCisgICAgQGdlbl90ZXN0CiAgICAgZGVmIHRlc3Rfb25ld2F5KHNlbGYpOgotICAgICAgICBzZWxmLmNsaWVudC50ZXN0T25ld2F5KDAuNSkKLSAgICAgICAgc3RhcnQsIGVuZCwgc2Vjb25kcyA9IHNlbGYud2FpdCh0aW1lb3V0PTEpCi0gICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWxzKHNlY29uZHMsIChlbmQgLSBzdGFydCksIHBsYWNlcz0zKQorICAgICAgICBzZWxmLmNsaWVudC50ZXN0T25ld2F5KDEpCisgICAgICAgIHYgPSB5aWVsZCBzZWxmLmNsaWVudC50ZXN0STMyKC0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYsIC0xKQogCiAgICAgQGdlbl90ZXN0CiAgICAgZGVmIHRlc3RfbWFwKHNlbGYpOgpAQCAtMjAzLDggKzIwNyw2IEBACiAKICAgICBAZ2VuX3Rlc3QKICAgICBkZWYgdGVzdF9leGNlcHRpb24oc2VsZik6Ci0gICAgICAgIHlpZWxkIHNlbGYuY2xpZW50LnRlc3RFeGNlcHRpb24oJ1NhZmUnKQotCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHlpZWxkIHNlbGYuY2xpZW50LnRlc3RFeGNlcHRpb24oJ1hjZXB0aW9uJykKICAgICAgICAgZXhjZXB0IFhjZXB0aW9uIGFzIGV4OgpAQCAtMjE0LDExICsyMTYsMTMgQEAKICAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgZ290dGVuIGV4Y2VwdGlvbiIpCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHlpZWxkIHNlbGYuY2xpZW50LnRlc3RFeGNlcHRpb24oJ3Rocm93X3VuZGVjbGFyZWQnKQotICAgICAgICBleGNlcHQgVFRyYW5zcG9ydEV4Y2VwdGlvbiBhcyBleDoKKyAgICAgICAgZXhjZXB0IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjoKICAgICAgICAgICAgIHBhc3MKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgZ290dGVuIGV4Y2VwdGlvbiIpCiAKKyAgICAgICAgeWllbGQgc2VsZi5jbGllbnQudGVzdEV4Y2VwdGlvbignU2FmZScpCisKIAogZGVmIHN1aXRlKCk6CiAgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQpkaWZmIC0tZ2l0IGEvdGVzdC9weS50d2lzdGVkL01ha2VmaWxlLmFtIGIvdGVzdC9weS50d2lzdGVkL01ha2VmaWxlLmFtCmluZGV4IDUwMjAyMTUuLmQxMTkwOGMgMTAwNjQ0Ci0tLSBhL3Rlc3QvcHkudHdpc3RlZC9NYWtlZmlsZS5hbQorKysgYi90ZXN0L3B5LnR3aXN0ZWQvTWFrZWZpbGUuYW0KQEAgLTE3LDcgKzE3LDcgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLVRIUklGVCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0CitUUklBTCA/PSB0cmlhbAogCiBzdHViczogLi4vVGhyaWZ0VGVzdC50aHJpZnQgLi4vU21hbGxUZXN0LnRocmlmdAogCSQoVEhSSUZUKSAtLWdlbiBweTp0d2lzdGVkIC4uL1RocmlmdFRlc3QudGhyaWZ0CmRpZmYgLS1naXQgYS90ZXN0L3B5LnR3aXN0ZWQvc2V0dXAuY2ZnIGIvdGVzdC9weS50d2lzdGVkL3NldHVwLmNmZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTU4N2M0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9weS50d2lzdGVkL3NldHVwLmNmZwpAQCAtMCwwICsxLDMgQEAKK1tmbGFrZThdCitpZ25vcmUgPSBFNDAyCittYXgtbGluZS1sZW5ndGggPSAxMDAKZGlmZiAtLWdpdCBhL3Rlc3QvcHkudHdpc3RlZC90ZXN0X3N1aXRlLnB5IGIvdGVzdC9weS50d2lzdGVkL3Rlc3Rfc3VpdGUucHkKaW5kZXggMDQ4YWJjNS4uMDJlYjdmMSAxMDA3NTUKLS0tIGEvdGVzdC9weS50d2lzdGVkL3Rlc3Rfc3VpdGUucHkKKysrIGIvdGVzdC9weS50d2lzdGVkL3Rlc3Rfc3VpdGUucHkKQEAgLTE5LDExICsxOSwxNyBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotaW1wb3J0IHN5cywgb3MsIGdsb2IsIHRpbWUKK2ltcG9ydCBnbG9iCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB0aW1lCisKIGJhc2VwYXRoID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpCiBzeXMucGF0aC5pbnNlcnQoMCwgb3MucGF0aC5qb2luKGJhc2VwYXRoLCAnZ2VuLXB5LnR3aXN0ZWQnKSkKIHN5cy5wYXRoLmluc2VydCgwLCBnbG9iLmdsb2Iob3MucGF0aC5qb2luKGJhc2VwYXRoLCAnLi4vLi4vbGliL3B5L2J1aWxkL2xpYi4qJykpWzBdKQogCitmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbgorCiBmcm9tIFRocmlmdFRlc3QgaW1wb3J0IFRocmlmdFRlc3QKIGZyb20gVGhyaWZ0VGVzdC50dHlwZXMgaW1wb3J0IFhjZXB0aW9uLCBYdHJ1Y3QKIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFR3aXN0ZWQKQEAgLTMzLDExICszOSwxMSBAQAogZnJvbSB0d2lzdGVkLmludGVybmV0IGltcG9ydCBkZWZlciwgcmVhY3RvcgogZnJvbSB0d2lzdGVkLmludGVybmV0LnByb3RvY29sIGltcG9ydCBDbGllbnRDcmVhdG9yCiAKLWZyb20gem9wZS5pbnRlcmZhY2UgaW1wb3J0IGltcGxlbWVudHMKK2Zyb20gem9wZS5pbnRlcmZhY2UgaW1wb3J0IGltcGxlbWVudGVyCiAKKworQGltcGxlbWVudGVyKFRocmlmdFRlc3QuSWZhY2UpCiBjbGFzcyBUZXN0SGFuZGxlcjoKLSAgICBpbXBsZW1lbnRzKFRocmlmdFRlc3QuSWZhY2UpCi0KICAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgIHNlbGYub25ld2F5c1F1ZXVlID0gZGVmZXIuRGVmZXJyZWRRdWV1ZSgpCiAKQEAgLTgxLDYgKzg3LDcgQEAKICAgICAgICAgZGVmIGZpcmVPbmV3YXkodCk6CiAgICAgICAgICAgICBzZWxmLm9uZXdheXNRdWV1ZS5wdXQoKHQsIHRpbWUudGltZSgpLCBzZWNvbmRzKSkKICAgICAgICAgcmVhY3Rvci5jYWxsTGF0ZXIoc2Vjb25kcywgZmlyZU9uZXdheSwgdGltZS50aW1lKCkpCisgICAgICAgIHJhaXNlIEV4Y2VwdGlvbignJykKIAogICAgIGRlZiB0ZXN0TmVzdChzZWxmLCB0aGluZyk6CiAgICAgICAgIHJldHVybiB0aGluZwpAQCAtMTAwLDYgKzEwNyw3IEBACiAgICAgZGVmIHRlc3RUeXBlZGVmKHNlbGYsIHRoaW5nKToKICAgICAgICAgcmV0dXJuIHRoaW5nCiAKKwogY2xhc3MgVGhyaWZ0VGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgQGRlZmVyLmlubGluZUNhbGxiYWNrcwpAQCAtMTA4LDE2ICsxMTYsMTUgQEAKICAgICAgICAgc2VsZi5wcm9jZXNzb3IgPSBUaHJpZnRUZXN0LlByb2Nlc3NvcihzZWxmLmhhbmRsZXIpCiAgICAgICAgIHNlbGYucGZhY3RvcnkgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpCiAKLSAgICAgICAgc2VsZi5zZXJ2ZXIgPSByZWFjdG9yLmxpc3RlblRDUCgwLAotICAgICAgICAgICAgVFR3aXN0ZWQuVGhyaWZ0U2VydmVyRmFjdG9yeShzZWxmLnByb2Nlc3NvciwKLSAgICAgICAgICAgIHNlbGYucGZhY3RvcnkpLCBpbnRlcmZhY2U9IjEyNy4wLjAuMSIpCisgICAgICAgIHNlbGYuc2VydmVyID0gcmVhY3Rvci5saXN0ZW5UQ1AoCisgICAgICAgICAgICAwLCBUVHdpc3RlZC5UaHJpZnRTZXJ2ZXJGYWN0b3J5KHNlbGYucHJvY2Vzc29yLCBzZWxmLnBmYWN0b3J5KSwgaW50ZXJmYWNlPSIxMjcuMC4wLjEiKQogCiAgICAgICAgIHNlbGYucG9ydE5vID0gc2VsZi5zZXJ2ZXIuZ2V0SG9zdCgpLnBvcnQKIAogICAgICAgICBzZWxmLnR4Y2xpZW50ID0geWllbGQgQ2xpZW50Q3JlYXRvcihyZWFjdG9yLAotICAgICAgICAgICAgVFR3aXN0ZWQuVGhyaWZ0Q2xpZW50UHJvdG9jb2wsCi0gICAgICAgICAgICBUaHJpZnRUZXN0LkNsaWVudCwKLSAgICAgICAgICAgIHNlbGYucGZhY3RvcnkpLmNvbm5lY3RUQ1AoIjEyNy4wLjAuMSIsIHNlbGYucG9ydE5vKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVHdpc3RlZC5UaHJpZnRDbGllbnRQcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VGVzdC5DbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGZhY3RvcnkpLmNvbm5lY3RUQ1AoIjEyNy4wLjAuMSIsIHNlbGYucG9ydE5vKQogICAgICAgICBzZWxmLmNsaWVudCA9IHNlbGYudHhjbGllbnQuY2xpZW50CiAKICAgICBAZGVmZXIuaW5saW5lQ2FsbGJhY2tzCkBAIC0xNjgsMjIgKzE3NSwyNCBAQAogCiAgICAgQGRlZmVyLmlubGluZUNhbGxiYWNrcwogICAgIGRlZiB0ZXN0RXhjZXB0aW9uKHNlbGYpOgotICAgICAgICB5aWVsZCBzZWxmLmNsaWVudC50ZXN0RXhjZXB0aW9uKCdTYWZlJykKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgeWllbGQgc2VsZi5jbGllbnQudGVzdEV4Y2VwdGlvbignWGNlcHRpb24nKQogICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSBnb3R0ZW4gZXhjZXB0aW9uIikKLSAgICAgICAgZXhjZXB0IFhjZXB0aW9uLCB4OgorICAgICAgICBleGNlcHQgWGNlcHRpb24gYXMgeDoKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHguZXJyb3JDb2RlLCAxMDAxKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeC5tZXNzYWdlLCAnWGNlcHRpb24nKQogCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHlpZWxkIHNlbGYuY2xpZW50LnRlc3RFeGNlcHRpb24oInRocm93X3VuZGVjbGFyZWQiKQotICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSB0aHJvd24gZXhjZXB0aW9uIikKLSAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjogIyB0eXBlIGlzIHVuZGVmaW5lZAorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSBnb3R0ZW4gZXhjZXB0aW9uIikKKyAgICAgICAgZXhjZXB0IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjoKICAgICAgICAgICAgIHBhc3MKIAorICAgICAgICB5aWVsZCBzZWxmLmNsaWVudC50ZXN0RXhjZXB0aW9uKCdTYWZlJykKKwogICAgIEBkZWZlci5pbmxpbmVDYWxsYmFja3MKICAgICBkZWYgdGVzdE9uZXdheShzZWxmKToKICAgICAgICAgeWllbGQgc2VsZi5jbGllbnQudGVzdE9uZXdheSgxKQogICAgICAgICBzdGFydCwgZW5kLCBzZWNvbmRzID0geWllbGQgc2VsZi5oYW5kbGVyLm9uZXdheXNRdWV1ZS5nZXQoKQogICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFscyhzZWNvbmRzLCAoZW5kIC0gc3RhcnQpLCBwbGFjZXM9MSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoKHlpZWxkIHNlbGYuY2xpZW50LnRlc3RJMzIoLTEpKSwgLTEpCmRpZmYgLS1naXQgYS90ZXN0L3B5L0NNYWtlTGlzdHMudHh0IGIvdGVzdC9weS9DTWFrZUxpc3RzLnR4dApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDZjOTA3YmYuLmZiYzIyMTcKLS0tIGEvdGVzdC9weS9DTWFrZUxpc3RzLnR4dAorKysgYi90ZXN0L3B5L0NNYWtlTGlzdHMudHh0CkBAIC0xNywzMiArMTcsMTggQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKK2FkZF90ZXN0KE5BTUUgcHl0aG9uX3Rlc3RfZ2VuZXJhdGUKKyAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0KKyAgICAgICAgICAgIC1EVEhSSUZUQ09NUElMRVI9JDxUQVJHRVRfRklMRTp0aHJpZnQtY29tcGlsZXI+CisgICAgICAgICAgICAtRE1ZX1BST0pFQ1RfRElSPSR7UFJPSkVDVF9TT1VSQ0VfRElSfQorICAgICAgICAgICAgLURNWV9DVVJSRU5UX1NPVVJDRV9ESVI9JHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9CisgICAgICAgICAgICAtRE1ZX0NVUlJFTlRfQklOQVJZX0RJUj0ke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0KKyAgICAtUCAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vZ2VuZXJhdGUuY21ha2UKKykKKwogYWRkX3Rlc3QoTkFNRSBweXRob25fdGVzdAotICAgIENPTU1BTkQgJHtQWVRIT05fRVhFQ1VUQUJMRX0gJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L1J1bkNsaWVudFNlcnZlci5weQotICAgIERFUEVORFMgZ2VuLXB5LWRlZmF1bHQvVGhyaWZ0VGVzdC9UaHJpZnRUZXN0LnB5CisgICAgQ09NTUFORCAke1BZVEhPTl9FWEVDVVRBQkxFfSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vUnVuQ2xpZW50U2VydmVyLnB5IC0tZ2VuLWJhc2U9JHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9CisgICAgREVQRU5EUyBweXRob25fdGVzdF9nZW5lcmF0ZQogICAgIFdPUktJTkdfRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfQogKQogCi1hZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUIGdlbi1weS1kZWZhdWx0L1RocmlmdFRlc3QvVGhyaWZ0VGVzdC5weQotICAgIENPTU1BTkQgdGhyaWZ0LWNvbXBpbGVyIC0tZ2VuIGdlbi1weS1kZWZhdWx0IC1vdXQgZ2VuLXB5LWRlZmF1bHQgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKLSkKLQotYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVCBnZW4tcHktc2xvdHMvVGhyaWZ0VGVzdC9UaHJpZnRUZXN0LnB5Ci0gICAgQ09NTUFORCB0aHJpZnQtY29tcGlsZXIgLS1nZW4gcHk6c2xvdHMgLW91dCBnZW4tcHktc2xvdHMgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKLSkKLQotYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVCBnZW4tcHktbmV3c3R5bGUvVGhyaWZ0VGVzdC9UaHJpZnRUZXN0LnB5Ci0gICAgQ09NTUFORCB0aHJpZnQtY29tcGlsZXIgLS1nZW4gcHk6bmV3X3N0eWxlIC1vdXQgZ2VuLXB5LW5ld3N0eWxlICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0Ci0pCi0KLWFkZF9jdXN0b21fY29tbWFuZChPVVRQVVQgZ2VuLXB5LW5ld3N0eWxlc2xvdHMvVGhyaWZ0VGVzdC9UaHJpZnRUZXN0LnB5Ci0gICAgQ09NTUFORCB0aHJpZnQtY29tcGlsZXIgLS1nZW4gcHk6bmV3X3N0eWxlLHNsb3RzIC1vdXQgZ2VuLXB5LW5ld3N0eWxlc2xvdHMgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKLSkKLQotYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVCBnZW4tcHktZHluYW1pYy9UaHJpZnRUZXN0L1RocmlmdFRlc3QucHkKLSAgICBDT01NQU5EIHRocmlmdC1jb21waWxlciAtLWdlbiBweTpkeW5hbWljIC1vdXQgZ2VuLXB5LWR5bmFtaWMgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKLSkKLQotYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVCBnZW4tcHktZHluYW1pY3Nsb3RzL1RocmlmdFRlc3QvVGhyaWZ0VGVzdC5weQotICAgIENPTU1BTkQgdGhyaWZ0LWNvbXBpbGVyIC0tZ2VuIHB5OmR5bmFtaWMsc2xvdHMgLW91dCBnZW4tcHktZHluYW1pY3Nsb3RzICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0Ci0pCmRpZmYgLS1naXQgYS90ZXN0L3B5L0Zhc3RiaW5hcnlUZXN0LnB5IGIvdGVzdC9weS9GYXN0YmluYXJ5VGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wNWMwYmI2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9weS9GYXN0YmluYXJ5VGVzdC5weQpAQCAtMCwwICsxLDI1NiBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCityIiIiCitQWVRIT05QQVRIPS4vZ2VuLXB5Oi4uLy4uL2xpYi9weS9idWlsZC9saWIuLi4gLi9GYXN0YmluYXJ5VGVzdC5weQorIiIiCisKKyMgVE9ETyhkcmVpc3MpOiBUZXN0IGVycm9yIGNhc2VzLiAgQ2hlY2sgZm9yIG1lbW9yeSBsZWFrcy4KKworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgorCitpbXBvcnQgbWF0aAoraW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgdGltZWl0CisKK2Zyb20gY29weSBpbXBvcnQgZGVlcGNvcHkKK2Zyb20gcHByaW50IGltcG9ydCBwcHJpbnQKKworZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0Citmcm9tIHRocmlmdC5wcm90b2NvbC5UQmluYXJ5UHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbCwgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQKK2Zyb20gdGhyaWZ0LnByb3RvY29sLlRDb21wYWN0UHJvdG9jb2wgaW1wb3J0IFRDb21wYWN0UHJvdG9jb2wsIFRDb21wYWN0UHJvdG9jb2xBY2NlbGVyYXRlZAorCitmcm9tIERlYnVnUHJvdG9UZXN0IGltcG9ydCBTcnYKK2Zyb20gRGVidWdQcm90b1Rlc3QudHR5cGVzIGltcG9ydCBCYWNrd2FyZHMsIEJvbmssIEVtcHR5LCBIb2x5TW9sZXksIE9uZU9mRWFjaCwgUmFuZG9tU3R1ZmYsIFdyYXBwZXIKKworCitjbGFzcyBURGV2TnVsbFRyYW5zcG9ydChUVHJhbnNwb3J0LlRUcmFuc3BvcnRCYXNlKToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBpc09wZW4oc2VsZik6CisgICAgICAgIHJldHVybiBUcnVlCisKKworb29lMSA9IE9uZU9mRWFjaCgpCitvb2UxLmltX3RydWUgPSBUcnVlCitvb2UxLmltX2ZhbHNlID0gRmFsc2UKK29vZTEuYV9iaXRlID0gMHhkNgorb29lMS5pbnRlZ2VyMTYgPSAyNzAwMAorb29lMS5pbnRlZ2VyMzIgPSAxIDw8IDI0Citvb2UxLmludGVnZXI2NCA9IDYwMDAgKiAxMDAwICogMTAwMAorb29lMS5kb3VibGVfcHJlY2lzaW9uID0gbWF0aC5waQorb29lMS5zb21lX2NoYXJhY3RlcnMgPSAiRGVidWcgVEhJUyEiCitvb2UxLnpvbWdfdW5pY29kZSA9IHUiXHhkN1xuXGFcdCIKKworb29lMiA9IE9uZU9mRWFjaCgpCitvb2UyLmludGVnZXIxNiA9IDE2Citvb2UyLmludGVnZXIzMiA9IDMyCitvb2UyLmludGVnZXI2NCA9IDY0Citvb2UyLmRvdWJsZV9wcmVjaXNpb24gPSAobWF0aC5zcXJ0KDUpICsgMSkgLyAyCitvb2UyLnNvbWVfY2hhcmFjdGVycyA9ICI6UiAobWUgZ29pbmcgXCJycnJyXCIpIgorb29lMi56b21nX3VuaWNvZGUgPSB1Ilx4ZDNceDgwXHhlMlx4ODVceGFlXHhjZVx4OWRceDIwIlwKKyAgICAgICAgICAgICAgICAgICAgdSJceGQwXHg5ZFx4Y2VceGJmXHhlMlx4ODVceGJmXHhkMFx4YmUiXAorICAgICAgICAgICAgICAgICAgICB1Ilx4YzlceGExXHhkMFx4YjNceGQwXHhiMFx4Y2ZceDgxXHhlMlx4ODRceDhlIlwKKyAgICAgICAgICAgICAgICAgICAgdSJceDIwXHhjZVx4OTFceDc0XHg3NFx4Y2VceGIxXHhlMlx4ODVceGJkXHhjZVx4YmEiXAorICAgICAgICAgICAgICAgICAgICB1Ilx4YzdceDgzXHhlMlx4ODBceGJjIgorCitpZiBzeXMudmVyc2lvbl9pbmZvWzBdID09IDIgYW5kIG9zLmVudmlyb24uZ2V0KCdUSFJJRlRfVEVTVF9QWV9OT19VVEY4U1RSSU5HUycpOgorICAgIG9vZTEuem9tZ191bmljb2RlID0gb29lMS56b21nX3VuaWNvZGUuZW5jb2RlKCd1dGY4JykKKyAgICBvb2UyLnpvbWdfdW5pY29kZSA9IG9vZTIuem9tZ191bmljb2RlLmVuY29kZSgndXRmOCcpCisKK2htID0gSG9seU1vbGV5KCoqeyJiaWciOiBbXSwgImNvbnRhaW4iOiBzZXQoKSwgImJvbmtzIjoge319KQoraG0uYmlnLmFwcGVuZChvb2UxKQoraG0uYmlnLmFwcGVuZChvb2UyKQoraG0uYmlnWzBdLmFfYml0ZSA9IDB4MjIKK2htLmJpZ1sxXS5hX2JpdGUgPSAweDIyCisKK2htLmNvbnRhaW4uYWRkKCgiYW5kIGEgb25lIiwgImFuZCBhIHR3byIpKQoraG0uY29udGFpbi5hZGQoKCJ0aGVuIGEgb25lLCB0d28iLCAidGhyZWUhIiwgIkZPVVIhIikpCitpZiBzeXMudmVyc2lvbl9pbmZvWzBdID09IDIgYW5kIG9zLmVudmlyb24uZ2V0KCdUSFJJRlRfVEVTVF9QWV9OT19VVEY4U1RSSU5HUycpOgorICAgIGhtLmNvbnRhaW4uYWRkKCh1Ilx4ZDdcblxhXHQiLmVuY29kZSgndXRmOCcpLCkpCitlbHNlOgorICAgIGhtLmNvbnRhaW4uYWRkKCh1Ilx4ZDdcblxhXHQiLCkpCitobS5jb250YWluLmFkZCgoKSkKKworaG0uYm9ua3NbIm5vdGhpbmciXSA9IFtdCitobS5ib25rc1sic29tZXRoaW5nIl0gPSBbCisgICAgQm9uaygqKnsidHlwZSI6IDEsICJtZXNzYWdlIjogIldhaXQuIn0pLAorICAgIEJvbmsoKip7InR5cGUiOiAyLCAibWVzc2FnZSI6ICJXaGF0PyJ9KSwKK10KK2htLmJvbmtzWyJwb2UiXSA9IFsKKyAgICBCb25rKCoqeyJ0eXBlIjogMywgIm1lc3NhZ2UiOiAicXVvdGgifSksCisgICAgQm9uaygqKnsidHlwZSI6IDQsICJtZXNzYWdlIjogInRoZSByYXZlbiJ9KSwKKyAgICBCb25rKCoqeyJ0eXBlIjogNSwgIm1lc3NhZ2UiOiAibmV2ZXJtb3JlIn0pLAorXQorCitycyA9IFJhbmRvbVN0dWZmKCkKK3JzLmEgPSAxCitycy5iID0gMgorcnMuYyA9IDMKK3JzLm15aW50bGlzdCA9IGxpc3QocmFuZ2UoMjApKQorcnMubWFwcyA9IHsxOiBXcmFwcGVyKCoqeyJmb28iOiBFbXB0eSgpfSksIDI6IFdyYXBwZXIoKip7ImZvbyI6IEVtcHR5KCl9KX0KK3JzLmJpZ2ludCA9IDEyNDUyMzQ1MjQzNQorcnMudHJpcGxlID0gMy4xNAorCisjIG1ha2Ugc3VyZSB0aGlzIHNwbGl0cyB0d28gYnVmZmVycyBpbiBhIGJ1ZmZlcmVkIHByb3RvY29sCityc2h1Z2UgPSBSYW5kb21TdHVmZigpCityc2h1Z2UubXlpbnRsaXN0ID0gbGlzdChyYW5nZSgxMDAwMCkpCisKK215X3plcm8gPSBTcnYuSmFua3lfcmVzdWx0KCoqeyJzdWNjZXNzIjogNX0pCisKKworY2xhc3MgVGVzdChvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmYXN0LCBzbG93KToKKyAgICAgICAgc2VsZi5fZmFzdCA9IGZhc3QKKyAgICAgICAgc2VsZi5fc2xvdyA9IHNsb3cKKworICAgIGRlZiBfY2hlY2tfd3JpdGUoc2VsZiwgbyk6CisgICAgICAgIHRyYW5zX2Zhc3QgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQorICAgICAgICB0cmFuc19zbG93ID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkKKyAgICAgICAgcHJvdF9mYXN0ID0gc2VsZi5fZmFzdCh0cmFuc19mYXN0LCBmYWxsYmFjaz1GYWxzZSkKKyAgICAgICAgcHJvdF9zbG93ID0gc2VsZi5fc2xvdyh0cmFuc19zbG93KQorCisgICAgICAgIG8ud3JpdGUocHJvdF9mYXN0KQorICAgICAgICBvLndyaXRlKHByb3Rfc2xvdykKKyAgICAgICAgT1JJRyA9IHRyYW5zX3Nsb3cuZ2V0dmFsdWUoKQorICAgICAgICBNSU5FID0gdHJhbnNfZmFzdC5nZXR2YWx1ZSgpCisgICAgICAgIGlmIE9SSUcgIT0gTUlORToKKyAgICAgICAgICAgIHByaW50KCJhY3R1YWwgIDogJXNcbmV4cGVjdGVkOiAlcyIgJSAocmVwcihNSU5FKSwgcmVwcihPUklHKSkpCisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oJ3dyaXRlIHZhbHVlIG1pc21hdGNoJykKKworICAgIGRlZiBfY2hlY2tfcmVhZChzZWxmLCBvKToKKyAgICAgICAgcHJvdCA9IHNlbGYuX3Nsb3coVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkpCisgICAgICAgIG8ud3JpdGUocHJvdCkKKworICAgICAgICBzbG93X3ZlcnNpb25fYmluYXJ5ID0gcHJvdC50cmFucy5nZXR2YWx1ZSgpCisKKyAgICAgICAgcHJvdCA9IHNlbGYuX2Zhc3QoCisgICAgICAgICAgICBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoc2xvd192ZXJzaW9uX2JpbmFyeSksIGZhbGxiYWNrPUZhbHNlKQorICAgICAgICBjID0gby5fX2NsYXNzX18oKQorICAgICAgICBjLnJlYWQocHJvdCkKKyAgICAgICAgaWYgYyAhPSBvOgorICAgICAgICAgICAgcHJpbnQoImFjdHVhbCAgOiAiKQorICAgICAgICAgICAgcHByaW50KHJlcHIoYykpCisgICAgICAgICAgICBwcmludCgiZXhwZWN0ZWQ6ICIpCisgICAgICAgICAgICBwcHJpbnQocmVwcihvKSkKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigncmVhZCB2YWx1ZSBtaXNtYXRjaCcpCisKKyAgICAgICAgcHJvdCA9IHNlbGYuX2Zhc3QoCisgICAgICAgICAgICBUVHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydCgKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoc2xvd192ZXJzaW9uX2JpbmFyeSkpLCBmYWxsYmFjaz1GYWxzZSkKKyAgICAgICAgYyA9IG8uX19jbGFzc19fKCkKKyAgICAgICAgYy5yZWFkKHByb3QpCisgICAgICAgIGlmIGMgIT0gbzoKKyAgICAgICAgICAgIHByaW50KCJhY3R1YWwgIDogIikKKyAgICAgICAgICAgIHBwcmludChyZXByKGMpKQorICAgICAgICAgICAgcHJpbnQoImV4cGVjdGVkOiAiKQorICAgICAgICAgICAgcHByaW50KHJlcHIobykpCisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oJ3JlYWQgdmFsdWUgbWlzbWF0Y2gnKQorCisgICAgZGVmIGRvX3Rlc3Qoc2VsZik6CisgICAgICAgIHNlbGYuX2NoZWNrX3dyaXRlKEhvbHlNb2xleSgpKQorICAgICAgICBzZWxmLl9jaGVja19yZWFkKEhvbHlNb2xleSgpKQorCisgICAgICAgIHNlbGYuX2NoZWNrX3dyaXRlKGhtKQorICAgICAgICBub19zZXQgPSBkZWVwY29weShobSkKKyAgICAgICAgbm9fc2V0LmNvbnRhaW4gPSBzZXQoKQorICAgICAgICBzZWxmLl9jaGVja19yZWFkKG5vX3NldCkKKyAgICAgICAgc2VsZi5fY2hlY2tfcmVhZChobSkKKworICAgICAgICBzZWxmLl9jaGVja193cml0ZShycykKKyAgICAgICAgc2VsZi5fY2hlY2tfcmVhZChycykKKworICAgICAgICBzZWxmLl9jaGVja193cml0ZShyc2h1Z2UpCisgICAgICAgIHNlbGYuX2NoZWNrX3JlYWQocnNodWdlKQorCisgICAgICAgIHNlbGYuX2NoZWNrX3dyaXRlKG15X3plcm8pCisgICAgICAgIHNlbGYuX2NoZWNrX3JlYWQobXlfemVybykKKworICAgICAgICBzZWxmLl9jaGVja19yZWFkKEJhY2t3YXJkcygqKnsiZmlyc3RfdGFnMiI6IDQsICJzZWNvbmRfdGFnMSI6IDJ9KSkKKworICAgICAgICAjIE9uZSBjYXNlIHdoZXJlIHRoZSBzZXJpYWxpemVkIGZvcm0gY2hhbmdlcywgYnV0IG9ubHkgc3VwZXJmaWNpYWxseS4KKyAgICAgICAgbyA9IEJhY2t3YXJkcygqKnsiZmlyc3RfdGFnMiI6IDQsICJzZWNvbmRfdGFnMSI6IDJ9KQorICAgICAgICB0cmFuc19mYXN0ID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkKKyAgICAgICAgdHJhbnNfc2xvdyA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCisgICAgICAgIHByb3RfZmFzdCA9IHNlbGYuX2Zhc3QodHJhbnNfZmFzdCwgZmFsbGJhY2s9RmFsc2UpCisgICAgICAgIHByb3Rfc2xvdyA9IHNlbGYuX3Nsb3codHJhbnNfc2xvdykKKworICAgICAgICBvLndyaXRlKHByb3RfZmFzdCkKKyAgICAgICAgby53cml0ZShwcm90X3Nsb3cpCisgICAgICAgIE9SSUcgPSB0cmFuc19zbG93LmdldHZhbHVlKCkKKyAgICAgICAgTUlORSA9IHRyYW5zX2Zhc3QuZ2V0dmFsdWUoKQorICAgICAgICBhc3NlcnQgaWQoT1JJRykgIT0gaWQoTUlORSkKKworICAgICAgICBwcm90ID0gc2VsZi5fZmFzdChUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKSwgZmFsbGJhY2s9RmFsc2UpCisgICAgICAgIG8ud3JpdGUocHJvdCkKKyAgICAgICAgcHJvdCA9IHNlbGYuX3Nsb3coCisgICAgICAgICAgICBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIocHJvdC50cmFucy5nZXR2YWx1ZSgpKSkKKyAgICAgICAgYyA9IG8uX19jbGFzc19fKCkKKyAgICAgICAgYy5yZWFkKHByb3QpCisgICAgICAgIGlmIGMgIT0gbzoKKyAgICAgICAgICAgIHByaW50KCJjb3B5OiAiKQorICAgICAgICAgICAgcHByaW50KHJlcHIoYykpCisgICAgICAgICAgICBwcmludCgib3JpZzogIikKKyAgICAgICAgICAgIHBwcmludChyZXByKG8pKQorCisKK2RlZiBkb190ZXN0KGZhc3QsIHNsb3cpOgorICAgIFRlc3QoZmFzdCwgc2xvdykuZG9fdGVzdCgpCisKKworZGVmIGRvX2JlbmNobWFyayhwcm90b2NvbCwgaXRlcnM9NTAwMCwgc2tpcF9zbG93PUZhbHNlKToKKyAgICBzZXR1cCA9ICIiIgorZnJvbSBfX21haW5fXyBpbXBvcnQgaG0sIHJzLCBURGV2TnVsbFRyYW5zcG9ydAorZnJvbSB0aHJpZnQucHJvdG9jb2wuezB9IGltcG9ydCB7MH17MX0KK3RyYW5zID0gVERldk51bGxUcmFuc3BvcnQoKQorcHJvdCA9IHswfXsxfSh0cmFuc3syfSkKKyIiIgorCisgICAgc2V0dXBfZmFzdCA9IHNldHVwLmZvcm1hdChwcm90b2NvbCwgJ0FjY2VsZXJhdGVkJywgJywgZmFsbGJhY2s9RmFsc2UnKQorICAgIGlmIG5vdCBza2lwX3Nsb3c6CisgICAgICAgIHNldHVwX3Nsb3cgPSBzZXR1cC5mb3JtYXQocHJvdG9jb2wsICcnLCAnJykKKworICAgIHByaW50KCJTdGFydGluZyBCZW5jaG1hcmtzIikKKworICAgIGlmIG5vdCBza2lwX3Nsb3c6CisgICAgICAgIHByaW50KCJIb2x5TW9sZXkgU3RhbmRhcmQgPSAlZiIgJQorICAgICAgICAgICAgICB0aW1laXQuVGltZXIoJ2htLndyaXRlKHByb3QpJywgc2V0dXBfc2xvdykudGltZWl0KG51bWJlcj1pdGVycykpCisKKyAgICBwcmludCgiSG9seU1vbGV5IEFjY2VsZXIuID0gJWYiICUKKyAgICAgICAgICB0aW1laXQuVGltZXIoJ2htLndyaXRlKHByb3QpJywgc2V0dXBfZmFzdCkudGltZWl0KG51bWJlcj1pdGVycykpCisKKyAgICBpZiBub3Qgc2tpcF9zbG93OgorICAgICAgICBwcmludCgiRmFzdFN0cnVjdCBTdGFuZGFyZCA9ICVmIiAlCisgICAgICAgICAgICAgIHRpbWVpdC5UaW1lcigncnMud3JpdGUocHJvdCknLCBzZXR1cF9zbG93KS50aW1laXQobnVtYmVyPWl0ZXJzKSkKKworICAgIHByaW50KCJGYXN0U3RydWN0IEFjY2VsZXIuID0gJWYiICUKKyAgICAgICAgICB0aW1laXQuVGltZXIoJ3JzLndyaXRlKHByb3QpJywgc2V0dXBfZmFzdCkudGltZWl0KG51bWJlcj1pdGVycykpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBwcmludCgnVGVzdGluZyBUQmluYXJ5QWNjZWxlcmF0ZWQnKQorICAgIGRvX3Rlc3QoVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQsIFRCaW5hcnlQcm90b2NvbCkKKyAgICBkb19iZW5jaG1hcmsoJ1RCaW5hcnlQcm90b2NvbCcpCisgICAgcHJpbnQoJ1Rlc3RpbmcgVENvbXBhY3RBY2NlbGVyYXRlZCcpCisgICAgZG9fdGVzdChUQ29tcGFjdFByb3RvY29sQWNjZWxlcmF0ZWQsIFRDb21wYWN0UHJvdG9jb2wpCisgICAgZG9fYmVuY2htYXJrKCdUQ29tcGFjdFByb3RvY29sJykKZGlmZiAtLWdpdCBhL3Rlc3QvcHkvTWFrZWZpbGUuYW0gYi90ZXN0L3B5L01ha2VmaWxlLmFtCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggZDNmMGE3ZC4uODI5NjIwMAotLS0gYS90ZXN0L3B5L01ha2VmaWxlLmFtCisrKyBiL3Rlc3QvcHkvTWFrZWZpbGUuYW0KQEAgLTE4LDI3ICsxOCw0MCBAQAogIwogQVVUT01BS0VfT1BUSU9OUyA9IHNlcmlhbC10ZXN0cwogCi1USFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAotCiBweV91bml0X3Rlc3RzID0gUnVuQ2xpZW50U2VydmVyLnB5CiAKIHRocmlmdF9nZW4gPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgZ2VuLXB5L1RocmlmdFRlc3QvX19pbml0X18ucHkgICAgICAgICAgIFwKICAgICAgICAgZ2VuLXB5L0RlYnVnUHJvdG9UZXN0L19faW5pdF9fLnB5IFwKKyAgICAgICAgZ2VuLXB5L0RvdWJsZUNvbnN0YW50c1Rlc3QvX19pbml0X18ucHkgXAorICAgICAgICBnZW4tcHkvUmVjdXJzaXZlL19faW5pdF9fLnB5IFwKICAgICAgICAgZ2VuLXB5LWRlZmF1bHQvVGhyaWZ0VGVzdC9fX2luaXRfXy5weSAgICAgICAgICAgXAogICAgICAgICBnZW4tcHktZGVmYXVsdC9EZWJ1Z1Byb3RvVGVzdC9fX2luaXRfXy5weSBcCisgICAgICAgIGdlbi1weS1kZWZhdWx0L0RvdWJsZUNvbnN0YW50c1Rlc3QvX19pbml0X18ucHkgXAorICAgICAgICBnZW4tcHktZGVmYXVsdC9SZWN1cnNpdmUvX19pbml0X18ucHkgXAogICAgICAgICBnZW4tcHktc2xvdHMvVGhyaWZ0VGVzdC9fX2luaXRfXy5weSAgICAgICAgICAgXAogICAgICAgICBnZW4tcHktc2xvdHMvRGVidWdQcm90b1Rlc3QvX19pbml0X18ucHkgXAotICAgICAgICBnZW4tcHktbmV3c3R5bGUvVGhyaWZ0VGVzdC9fX2luaXRfXy5weSAgICAgICAgICAgXAotICAgICAgICBnZW4tcHktbmV3c3R5bGUvRGVidWdQcm90b1Rlc3QvX19pbml0X18ucHkgXAotICAgICAgICBnZW4tcHktbmV3c3R5bGVzbG90cy9UaHJpZnRUZXN0L19faW5pdF9fLnB5ICAgICAgICAgICBcCi0gICAgICAgIGdlbi1weS1uZXdzdHlsZXNsb3RzL0RlYnVnUHJvdG9UZXN0L19faW5pdF9fLnB5IFwKKyAgICAgICAgZ2VuLXB5LXNsb3RzL0RvdWJsZUNvbnN0YW50c1Rlc3QvX19pbml0X18ucHkgXAorICAgICAgICBnZW4tcHktc2xvdHMvUmVjdXJzaXZlL19faW5pdF9fLnB5IFwKKyAgICAgICAgZ2VuLXB5LW9sZHN0eWxlL1RocmlmdFRlc3QvX19pbml0X18ucHkgXAorICAgICAgICBnZW4tcHktb2xkc3R5bGUvRGVidWdQcm90b1Rlc3QvX19pbml0X18ucHkgXAorICAgICAgICBnZW4tcHktb2xkc3R5bGUvRG91YmxlQ29uc3RhbnRzVGVzdC9fX2luaXRfXy5weSBcCisgICAgICAgIGdlbi1weS1vbGRzdHlsZS9SZWN1cnNpdmUvX19pbml0X18ucHkgXAorICAgICAgICBnZW4tcHktbm9fdXRmOHN0cmluZ3MvVGhyaWZ0VGVzdC9fX2luaXRfXy5weSBcCisgICAgICAgIGdlbi1weS1ub191dGY4c3RyaW5ncy9EZWJ1Z1Byb3RvVGVzdC9fX2luaXRfXy5weSBcCisgICAgICAgIGdlbi1weS1ub191dGY4c3RyaW5ncy9Eb3VibGVDb25zdGFudHNUZXN0L19faW5pdF9fLnB5IFwKKyAgICAgICAgZ2VuLXB5LW5vX3V0ZjhzdHJpbmdzL1JlY3Vyc2l2ZS9fX2luaXRfXy5weSBcCiAgICAgICAgIGdlbi1weS1keW5hbWljL1RocmlmdFRlc3QvX19pbml0X18ucHkgICAgICAgICAgIFwKICAgICAgICAgZ2VuLXB5LWR5bmFtaWMvRGVidWdQcm90b1Rlc3QvX19pbml0X18ucHkgXAorICAgICAgICBnZW4tcHktZHluYW1pYy9Eb3VibGVDb25zdGFudHNUZXN0L19faW5pdF9fLnB5IFwKKyAgICAgICAgZ2VuLXB5LWR5bmFtaWMvUmVjdXJzaXZlL19faW5pdF9fLnB5IFwKICAgICAgICAgZ2VuLXB5LWR5bmFtaWNzbG90cy9UaHJpZnRUZXN0L19faW5pdF9fLnB5ICAgICAgICAgICBcCi0gICAgICAgIGdlbi1weS1keW5hbWljc2xvdHMvRGVidWdQcm90b1Rlc3QvX19pbml0X18ucHkKKyAgICAgICAgZ2VuLXB5LWR5bmFtaWNzbG90cy9EZWJ1Z1Byb3RvVGVzdC9fX2luaXRfXy5weSBcCisgICAgICAgIGdlbi1weS1keW5hbWljc2xvdHMvRG91YmxlQ29uc3RhbnRzVGVzdC9fX2luaXRfXy5weSBcCisgICAgICAgIGdlbi1weS1keW5hbWljc2xvdHMvUmVjdXJzaXZlL19faW5pdF9fLnB5CiAKLXByZWNyb3NzOiAkKFRIUklGVCkgJCh0aHJpZnRfZ2VuKQorCitwcmVjcm9zczogJCh0aHJpZnRfZ2VuKQogQlVJTFRfU09VUkNFUyA9ICQodGhyaWZ0X2dlbikKIAogaGVscGVyX3NjcmlwdHM9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtNTMsMzIgKzY2LDMyIEBACiBURVNUUz0gJChweV91bml0X3Rlc3RzKQogCiAKLWdlbi1weS8lL19faW5pdF9fLnB5OiAuLi8lLnRocmlmdAorZ2VuLXB5LyUvX19pbml0X18ucHk6IC4uLyUudGhyaWZ0ICQoVEhSSUZUKQogCSQoVEhSSUZUKSAtLWdlbiBweSAgJDwKIAotZ2VuLXB5LWRlZmF1bHQvJS9fX2luaXRfXy5weTogLi4vJS50aHJpZnQKK2dlbi1weS1kZWZhdWx0LyUvX19pbml0X18ucHk6IC4uLyUudGhyaWZ0ICQoVEhSSUZUKQogCXRlc3QgLWQgZ2VuLXB5LWRlZmF1bHQgfHwgJChNS0RJUl9QKSBnZW4tcHktZGVmYXVsdAogCSQoVEhSSUZUKSAtLWdlbiBweSAtb3V0IGdlbi1weS1kZWZhdWx0ICQ8CiAKLWdlbi1weS1zbG90cy8lL19faW5pdF9fLnB5OiAuLi8lLnRocmlmdAorZ2VuLXB5LXNsb3RzLyUvX19pbml0X18ucHk6IC4uLyUudGhyaWZ0ICQoVEhSSUZUKQogCXRlc3QgLWQgZ2VuLXB5LXNsb3RzIHx8ICQoTUtESVJfUCkgZ2VuLXB5LXNsb3RzCiAJJChUSFJJRlQpIC0tZ2VuIHB5OnNsb3RzIC1vdXQgZ2VuLXB5LXNsb3RzICQ8CiAKLWdlbi1weS1uZXdzdHlsZS8lL19faW5pdF9fLnB5OiAuLi8lLnRocmlmdAotCXRlc3QgLWQgZ2VuLXB5LW5ld3N0eWxlIHx8ICQoTUtESVJfUCkgZ2VuLXB5LW5ld3N0eWxlCi0JJChUSFJJRlQpIC0tZ2VuIHB5Om5ld19zdHlsZSAtb3V0IGdlbi1weS1uZXdzdHlsZSAkPAorZ2VuLXB5LW9sZHN0eWxlLyUvX19pbml0X18ucHk6IC4uLyUudGhyaWZ0ICQoVEhSSUZUKQorCXRlc3QgLWQgZ2VuLXB5LW9sZHN0eWxlIHx8ICQoTUtESVJfUCkgZ2VuLXB5LW9sZHN0eWxlCisJJChUSFJJRlQpIC0tZ2VuIHB5Om9sZF9zdHlsZSAtb3V0IGdlbi1weS1vbGRzdHlsZSAkPAogCi1nZW4tcHktbmV3c3R5bGVzbG90cy8lL19faW5pdF9fLnB5OiAuLi8lLnRocmlmdAotCXRlc3QgLWQgZ2VuLXB5LW5ld3N0eWxlc2xvdHMgfHwgJChNS0RJUl9QKSBnZW4tcHktbmV3c3R5bGVzbG90cwotCSQoVEhSSUZUKSAtLWdlbiBweTpuZXdfc3R5bGUsc2xvdHMgLW91dCBnZW4tcHktbmV3c3R5bGVzbG90cyAkPAorZ2VuLXB5LW5vX3V0ZjhzdHJpbmdzLyUvX19pbml0X18ucHk6IC4uLyUudGhyaWZ0ICQoVEhSSUZUKQorCXRlc3QgLWQgZ2VuLXB5LW5vX3V0ZjhzdHJpbmdzIHx8ICQoTUtESVJfUCkgZ2VuLXB5LW5vX3V0ZjhzdHJpbmdzCisJJChUSFJJRlQpIC0tZ2VuIHB5Om5vX3V0ZjhzdHJpbmdzIC1vdXQgZ2VuLXB5LW5vX3V0ZjhzdHJpbmdzICQ8CiAKLWdlbi1weS1keW5hbWljLyUvX19pbml0X18ucHk6IC4uLyUudGhyaWZ0CitnZW4tcHktZHluYW1pYy8lL19faW5pdF9fLnB5OiAuLi8lLnRocmlmdCAkKFRIUklGVCkKIAl0ZXN0IC1kIGdlbi1weS1keW5hbWljIHx8ICQoTUtESVJfUCkgZ2VuLXB5LWR5bmFtaWMKIAkkKFRIUklGVCkgLS1nZW4gcHk6ZHluYW1pYyAtb3V0IGdlbi1weS1keW5hbWljICQ8CiAKLWdlbi1weS1keW5hbWljc2xvdHMvJS9fX2luaXRfXy5weTogLi4vJS50aHJpZnQKK2dlbi1weS1keW5hbWljc2xvdHMvJS9fX2luaXRfXy5weTogLi4vJS50aHJpZnQgJChUSFJJRlQpCiAJdGVzdCAtZCBnZW4tcHktZHluYW1pY3Nsb3RzIHx8ICQoTUtESVJfUCkgZ2VuLXB5LWR5bmFtaWNzbG90cwogCSQoVEhSSUZUKSAtLWdlbiBweTpkeW5hbWljLHNsb3RzIC1vdXQgZ2VuLXB5LWR5bmFtaWNzbG90cyAkPAogCiBjbGVhbi1sb2NhbDoKLQkkKFJNKSAtciBnZW4tcHkgZ2VuLXB5LXNsb3RzIGdlbi1weS1kZWZhdWx0IGdlbi1weS1uZXdzdHlsZSBnZW4tcHktbmV3c3R5bGVzbG90cyBnZW4tcHktZHluYW1pYyBnZW4tcHktZHluYW1pY3Nsb3RzCisJJChSTSkgLXIgZ2VuLXB5IGdlbi1weS1zbG90cyBnZW4tcHktZGVmYXVsdCBnZW4tcHktb2xkc3R5bGUgZ2VuLXB5LW5vX3V0ZjhzdHJpbmdzIGdlbi1weS1keW5hbWljIGdlbi1weS1keW5hbWljc2xvdHMKZGlmZiAtLWdpdCBhL3Rlc3QvcHkvUnVuQ2xpZW50U2VydmVyLnB5IGIvdGVzdC9weS9SdW5DbGllbnRTZXJ2ZXIucHkKaW5kZXggYjdmNDMzMi4uNTZhNDA4ZSAxMDA3NTUKLS0tIGEvdGVzdC9weS9SdW5DbGllbnRTZXJ2ZXIucHkKKysrIGIvdGVzdC9weS9SdW5DbGllbnRTZXJ2ZXIucHkKQEAgLTIwLDE5NSArMjAsMzA0IEBACiAjCiAKIGZyb20gX19mdXR1cmVfXyBpbXBvcnQgZGl2aXNpb24KLWltcG9ydCB0aW1lCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCitpbXBvcnQgcGxhdGZvcm0KK2ltcG9ydCBjb3B5CitpbXBvcnQgb3MKK2ltcG9ydCBzaWduYWwKIGltcG9ydCBzb2NrZXQKIGltcG9ydCBzdWJwcm9jZXNzCiBpbXBvcnQgc3lzCi1pbXBvcnQgb3MKLWltcG9ydCBzaWduYWwKK2ltcG9ydCB0aW1lCiBmcm9tIG9wdHBhcnNlIGltcG9ydCBPcHRpb25QYXJzZXIKIAotcGFyc2VyID0gT3B0aW9uUGFyc2VyKCkKLXBhcnNlci5hZGRfb3B0aW9uKCctLWdlbnB5ZGlycycsIHR5cGU9J3N0cmluZycsIGRlc3Q9J2dlbnB5ZGlycycsCi0gICAgZGVmYXVsdD0nZGVmYXVsdCxzbG90cyxuZXdzdHlsZSxuZXdzdHlsZXNsb3RzLGR5bmFtaWMsZHluYW1pY3Nsb3RzJywKLSAgICBoZWxwPSdkaXJlY3RvcnkgZXh0ZW5zaW9ucyBmb3IgZ2VuZXJhdGVkIGNvZGUsIHVzZWQgYXMgc3VmZml4ZXMgZm9yIFwiZ2VuLXB5LSpcIiBhZGRlZCBzeXMucGF0aCBmb3IgaW5kaXZpZHVhbCB0ZXN0cycpCi1wYXJzZXIuYWRkX29wdGlvbigiLS1wb3J0IiwgdHlwZT0iaW50IiwgZGVzdD0icG9ydCIsIGRlZmF1bHQ9OTA5MCwKLSAgICBoZWxwPSJwb3J0IG51bWJlciBmb3Igc2VydmVyIHRvIGxpc3RlbiBvbiIpCi1wYXJzZXIuYWRkX29wdGlvbignLXYnLCAnLS12ZXJib3NlJywgYWN0aW9uPSJzdG9yZV9jb25zdCIsCi0gICAgZGVzdD0idmVyYm9zZSIsIGNvbnN0PTIsCi0gICAgaGVscD0idmVyYm9zZSBvdXRwdXQiKQotcGFyc2VyLmFkZF9vcHRpb24oJy1xJywgJy0tcXVpZXQnLCBhY3Rpb249InN0b3JlX2NvbnN0IiwKLSAgICBkZXN0PSJ2ZXJib3NlIiwgY29uc3Q9MCwKLSAgICBoZWxwPSJtaW5pbWFsIG91dHB1dCIpCi1wYXJzZXIuc2V0X2RlZmF1bHRzKHZlcmJvc2U9MSkKLW9wdGlvbnMsIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCitmcm9tIHV0aWwgaW1wb3J0IGxvY2FsX2xpYnBhdGgKIAotZ2VuZXJhdGVkX2RpcnMgPSBbXQotZm9yIGdwX2RpciBpbiBvcHRpb25zLmdlbnB5ZGlycy5zcGxpdCgnLCcpOgotICBnZW5lcmF0ZWRfZGlycy5hcHBlbmQoJ2dlbi1weS0lcycgJSAoZ3BfZGlyKSkKK1NDUklQVF9ESVIgPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSkKIAotU0NSSVBUUyA9IFsnVFNpbXBsZUpTT05Qcm90b2NvbFRlc3QucHknLAotICAgICAgICAgICAnU2VyaWFsaXphdGlvblRlc3QucHknLAotICAgICAgICAgICAnVGVzdEVvZi5weScsCi0gICAgICAgICAgICdUZXN0U3ludGF4LnB5JywKLSAgICAgICAgICAgJ1Rlc3RTb2NrZXQucHknXQorU0NSSVBUUyA9IFsKKyAgICAnRmFzdGJpbmFyeVRlc3QucHknLAorICAgICdUZXN0RnJvemVuLnB5JywKKyAgICAnVGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLnB5JywKKyAgICAnVFNpbXBsZUpTT05Qcm90b2NvbFRlc3QucHknLAorICAgICdTZXJpYWxpemF0aW9uVGVzdC5weScsCisgICAgJ1Rlc3RFb2YucHknLAorICAgICdUZXN0U3ludGF4LnB5JywKKyAgICAnVGVzdFNvY2tldC5weScsCitdCiBGUkFNRUQgPSBbIlROb25ibG9ja2luZ1NlcnZlciJdCiBTS0lQX1pMSUIgPSBbJ1ROb25ibG9ja2luZ1NlcnZlcicsICdUSHR0cFNlcnZlciddCi1TS0lQX1NTTCA9IFsnVE5vbmJsb2NraW5nU2VydmVyJywgJ1RIdHRwU2VydmVyJ10KK1NLSVBfU1NMID0gWydUSHR0cFNlcnZlciddCiBFWFRSQV9ERUxBWSA9IGRpY3QoVFByb2Nlc3NQb29sU2VydmVyPTUuNSkKIAotUFJPVE9TPSBbCitQUk9UT1MgPSBbCiAgICAgJ2FjY2VsJywKKyAgICAnYWNjZWxjJywKICAgICAnYmluYXJ5JywKICAgICAnY29tcGFjdCcsCi0gICAgJ2pzb24nXQorICAgICdqc29uJywKKyAgICAnaGVhZGVyJywKK10KIAotU0VSVkVSUyA9IFsKLSAgIlRTaW1wbGVTZXJ2ZXIiLAotICAiVFRocmVhZGVkU2VydmVyIiwKLSAgIlRUaHJlYWRQb29sU2VydmVyIiwKLSAgIlRQcm9jZXNzUG9vbFNlcnZlciIsICMgbmV3IQotICAiVEZvcmtpbmdTZXJ2ZXIiLAotICAiVE5vbmJsb2NraW5nU2VydmVyIiwKLSAgIlRIdHRwU2VydmVyIiBdCiAKLSMgVGVzdCBmb3IgcHJlc2VuY2Ugb2YgbXVsdGlwcm9jZXNzaW5nIG1vZHVsZSwgYW5kIGlmIGl0IGlzIG5vdCBwcmVzZW50LCB0aGVuCi0jIHJlbW92ZSBpdCBmcm9tIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBzZXJ2ZXJzLgotdHJ5OgotICBpbXBvcnQgbXVsdGlwcm9jZXNzaW5nCi1leGNlcHQ6Ci0gIHByaW50ICdXYXJuaW5nOiB0aGUgbXVsdGlwcm9jZXNzaW5nIG1vZHVsZSBpcyB1bmF2YWlsYWJsZS4gU2tpcHBpbmcgdGVzdHMgZm9yIFRQcm9jZXNzUG9vbFNlcnZlcicKLSAgU0VSVkVSUy5yZW1vdmUoJ1RQcm9jZXNzUG9vbFNlcnZlcicpCi0KLXRyeToKLSAgaW1wb3J0IHNzbAotZXhjZXB0OgotICBwcmludCAnV2FybmluZywgbm8gc3NsIG1vZHVsZSBhdmFpbGFibGUuIFNraXBwaW5nIGFsbCBTU0wgdGVzdHMuJwotICBTS0lQX1NTTC5leHRlbmQoU0VSVkVSUykKLQotIyBjb21tYW5kbGluZSBwZXJtaXRzIGEgc2luZ2xlIGNsYXNzIG5hbWUgdG8gYmUgc3BlY2lmaWVkIHRvIG92ZXJyaWRlIFNFUlZFUlM9Wy4uLl0KLWlmIGxlbihhcmdzKSA9PSAxOgotICBpZiBhcmdzWzBdIGluIFNFUlZFUlM6Ci0gICAgU0VSVkVSUyA9IGFyZ3MKLSAgZWxzZToKLSAgICBwcmludCAnVW5hdmFpbGFibGUgc2VydmVyIHR5cGUgIiVzIiwgcGxlYXNlIGNob29zZSBvbmUgb2Y6ICVzJyAlIChhcmdzWzBdLCBTRVJWRVJTKQotICAgIHN5cy5leGl0KDApCitkZWYgZGVmYXVsdF9zZXJ2ZXJzKCk6CisgICAgc2VydmVycyA9IFsKKyAgICAgICAgJ1RTaW1wbGVTZXJ2ZXInLAorICAgICAgICAnVFRocmVhZGVkU2VydmVyJywKKyAgICAgICAgJ1RUaHJlYWRQb29sU2VydmVyJywKKyAgICAgICAgJ1ROb25ibG9ja2luZ1NlcnZlcicsCisgICAgICAgICdUSHR0cFNlcnZlcicsCisgICAgXQorICAgIGlmIHBsYXRmb3JtLnN5c3RlbSgpICE9ICdXaW5kb3dzJzoKKyAgICAgICAgc2VydmVycy5hcHBlbmQoJ1RQcm9jZXNzUG9vbFNlcnZlcicpCisgICAgICAgIHNlcnZlcnMuYXBwZW5kKCdURm9ya2luZ1NlcnZlcicpCisgICAgcmV0dXJuIHNlcnZlcnMKIAogCiBkZWYgcmVsZmlsZShmbmFtZSk6Ci0gICAgcmV0dXJuIG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pLCBmbmFtZSkKKyAgICByZXR1cm4gb3MucGF0aC5qb2luKFNDUklQVF9ESVIsIGZuYW1lKQogCi1kZWYgcnVuU2NyaXB0VGVzdChnZW5weWRpciwgc2NyaXB0KToKLSAgc2NyaXB0X2FyZ3MgPSBbc3lzLmV4ZWN1dGFibGUsIHJlbGZpbGUoc2NyaXB0KSBdCi0gIHNjcmlwdF9hcmdzLmFwcGVuZCgnLS1nZW5weWRpcj0lcycgJSBnZW5weWRpcikKLSAgc2VydmVycHJvYyA9IHN1YnByb2Nlc3MuUG9wZW4oc2NyaXB0X2FyZ3MpCi0gIHByaW50ICdcblRlc3Rpbmcgc2NyaXB0OiAlc1xuLS0tLScgJSAoJyAnLmpvaW4oc2NyaXB0X2FyZ3MpKQotICByZXQgPSBzdWJwcm9jZXNzLmNhbGwoc2NyaXB0X2FyZ3MpCi0gIGlmIHJldCAhPSAwOgotICAgIHJhaXNlIEV4Y2VwdGlvbigiU2NyaXB0IHN1YnByb2Nlc3MgZmFpbGVkLCByZXRjb2RlPSVkLCBhcmdzOiAlcyIgJSAocmV0LCAnICcuam9pbihzY3JpcHRfYXJncykpKQogCi1kZWYgcnVuU2VydmljZVRlc3QoZ2VucHlkaXIsIHNlcnZlcl9jbGFzcywgcHJvdG8sIHBvcnQsIHVzZV96bGliLCB1c2Vfc3NsKToKLSAgIyBCdWlsZCBjb21tYW5kIGxpbmUgYXJndW1lbnRzCi0gIHNlcnZlcl9hcmdzID0gW3N5cy5leGVjdXRhYmxlLCByZWxmaWxlKCdUZXN0U2VydmVyLnB5JykgXQotICBjbGlfYXJncyA9IFtzeXMuZXhlY3V0YWJsZSwgcmVsZmlsZSgnVGVzdENsaWVudC5weScpIF0KLSAgZm9yIHdoaWNoIGluIChzZXJ2ZXJfYXJncywgY2xpX2FyZ3MpOgotICAgIHdoaWNoLmFwcGVuZCgnLS1nZW5weWRpcj0lcycgJSBnZW5weWRpcikKLSAgICB3aGljaC5hcHBlbmQoJy0tcHJvdG9jb2w9JXMnICUgcHJvdG8pICMgYWNjZWwsIGJpbmFyeSBvciBjb21wYWN0Ci0gICAgd2hpY2guYXBwZW5kKCctLXBvcnQ9JWQnICUgcG9ydCkgIyBkZWZhdWx0IHRvIDkwOTAKLSAgICBpZiB1c2VfemxpYjoKLSAgICAgIHdoaWNoLmFwcGVuZCgnLS16bGliJykKLSAgICBpZiB1c2Vfc3NsOgotICAgICAgd2hpY2guYXBwZW5kKCctLXNzbCcpCi0gICAgaWYgb3B0aW9ucy52ZXJib3NlID09IDA6Ci0gICAgICB3aGljaC5hcHBlbmQoJy1xJykKLSAgICBpZiBvcHRpb25zLnZlcmJvc2UgPT0gMjoKLSAgICAgIHdoaWNoLmFwcGVuZCgnLXYnKQotICAjIHNlcnZlci1zcGVjaWZpYyBvcHRpb24gdG8gc2VsZWN0IHNlcnZlciBjbGFzcwotICBzZXJ2ZXJfYXJncy5hcHBlbmQoc2VydmVyX2NsYXNzKQotICAjIGNsaWVudC1zcGVjaWZpYyBjbWRsaW5lIG9wdGlvbnMKLSAgaWYgc2VydmVyX2NsYXNzIGluIEZSQU1FRDoKLSAgICBjbGlfYXJncy5hcHBlbmQoJy0tdHJhbnNwb3J0PWZyYW1lZCcpCi0gIGVsc2U6Ci0gICAgIGNsaV9hcmdzLmFwcGVuZCgnLS10cmFuc3BvcnQ9YnVmZmVyZWQnKQotICBpZiBzZXJ2ZXJfY2xhc3MgPT0gJ1RIdHRwU2VydmVyJzoKLSAgICBjbGlfYXJncy5hcHBlbmQoJy0taHR0cD0vJykKLSAgaWYgb3B0aW9ucy52ZXJib3NlID4gMDoKLSAgICBwcmludCAnVGVzdGluZyBzZXJ2ZXIgJXM6ICVzJyAlIChzZXJ2ZXJfY2xhc3MsICcgJy5qb2luKHNlcnZlcl9hcmdzKSkKLSAgc2VydmVycHJvYyA9IHN1YnByb2Nlc3MuUG9wZW4oc2VydmVyX2FyZ3MpCitkZWYgc2V0dXBfcHlwYXRoKGxpYmRpciwgZ2VuZGlyKToKKyAgICBkaXJzID0gW2xpYmRpciwgZ2VuZGlyXQorICAgIGVudiA9IGNvcHkuZGVlcGNvcHkob3MuZW52aXJvbikKKyAgICBweXBhdGggPSBlbnYuZ2V0KCdQWVRIT05QQVRIJywgTm9uZSkKKyAgICBpZiBweXBhdGg6CisgICAgICAgIGRpcnMuYXBwZW5kKHB5cGF0aCkKKyAgICBlbnZbJ1BZVEhPTlBBVEgnXSA9IG9zLnBhdGhzZXAuam9pbihkaXJzKQorICAgIGlmIGdlbmRpci5lbmRzd2l0aCgnZ2VuLXB5LW5vX3V0ZjhzdHJpbmdzJyk6CisgICAgICAgIGVudlsnVEhSSUZUX1RFU1RfUFlfTk9fVVRGOFNUUklOR1MnXSA9ICcxJworICAgIHJldHVybiBlbnYKIAotICBkZWYgZW5zdXJlU2VydmVyQWxpdmUoKToKLSAgICBpZiBzZXJ2ZXJwcm9jLnBvbGwoKSBpcyBub3QgTm9uZToKLSAgICAgIHByaW50ICgnRkFJTDogU2VydmVyIHByb2Nlc3MgKCVzKSBmYWlsZWQgd2l0aCByZXRjb2RlICVkJwotICAgICAgICAgICAgICUgKCcgJy5qb2luKHNlcnZlcl9hcmdzKSwgc2VydmVycHJvYy5yZXR1cm5jb2RlKSkKLSAgICAgIHJhaXNlIEV4Y2VwdGlvbignU2VydmVyIHN1YnByb2Nlc3MgJXMgZGllZCwgYXJnczogJXMnCi0gICAgICAgICAgICAgICAgICAgICAgJSAoc2VydmVyX2NsYXNzLCAnICcuam9pbihzZXJ2ZXJfYXJncykpKQogCi0gICMgV2FpdCBmb3IgdGhlIHNlcnZlciB0byBzdGFydCBhY2NlcHRpbmcgY29ubmVjdGlvbnMgb24gdGhlIGdpdmVuIHBvcnQuCi0gIHNvY2sgPSBzb2NrZXQuc29ja2V0KCkKLSAgc2xlZXBfdGltZSA9IDAuMSAgIyBTZWNvbmRzCi0gIG1heF9hdHRlbXB0cyA9IDEwMAotICB0cnk6Ci0gICAgYXR0ZW1wdCA9IDAKLSAgICB3aGlsZSBzb2NrLmNvbm5lY3RfZXgoKCcxMjcuMC4wLjEnLCBwb3J0KSkgIT0gMDoKLSAgICAgIGF0dGVtcHQgKz0gMQotICAgICAgaWYgYXR0ZW1wdCA+PSBtYXhfYXR0ZW1wdHM6Ci0gICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiVGVzdFNlcnZlciBub3QgcmVhZHkgb24gcG9ydCAlZCBhZnRlciAlLjJmIHNlY29uZHMiCi0gICAgICAgICAgICAgICAgICAgICAgICAlIChwb3J0LCBzbGVlcF90aW1lICogYXR0ZW1wdCkpCi0gICAgICBlbnN1cmVTZXJ2ZXJBbGl2ZSgpCi0gICAgICB0aW1lLnNsZWVwKHNsZWVwX3RpbWUpCi0gIGZpbmFsbHk6Ci0gICAgc29jay5jbG9zZSgpCi0KLSAgdHJ5OgotICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDA6Ci0gICAgICBwcmludCAnVGVzdGluZyBjbGllbnQ6ICVzJyAlICgnICcuam9pbihjbGlfYXJncykpCi0gICAgcmV0ID0gc3VicHJvY2Vzcy5jYWxsKGNsaV9hcmdzKQorZGVmIHJ1blNjcmlwdFRlc3QobGliZGlyLCBnZW5iYXNlLCBnZW5weWRpciwgc2NyaXB0KToKKyAgICBlbnYgPSBzZXR1cF9weXBhdGgobGliZGlyLCBvcy5wYXRoLmpvaW4oZ2VuYmFzZSwgZ2VucHlkaXIpKQorICAgIHNjcmlwdF9hcmdzID0gW3N5cy5leGVjdXRhYmxlLCByZWxmaWxlKHNjcmlwdCldCisgICAgcHJpbnQoJ1xuVGVzdGluZyBzY3JpcHQ6ICVzXG4tLS0tJyAlICgnICcuam9pbihzY3JpcHRfYXJncykpKQorICAgIHJldCA9IHN1YnByb2Nlc3MuY2FsbChzY3JpcHRfYXJncywgZW52PWVudikKICAgICBpZiByZXQgIT0gMDoKLSAgICAgIHJhaXNlIEV4Y2VwdGlvbigiQ2xpZW50IHN1YnByb2Nlc3MgZmFpbGVkLCByZXRjb2RlPSVkLCBhcmdzOiAlcyIgJSAocmV0LCAnICcuam9pbihjbGlfYXJncykpKQotICBmaW5hbGx5OgotICAgICMgY2hlY2sgdGhhdCBzZXJ2ZXIgZGlkbid0IGRpZQotICAgIGVuc3VyZVNlcnZlckFsaXZlKCkKLSAgICBleHRyYV9zbGVlcCA9IEVYVFJBX0RFTEFZLmdldChzZXJ2ZXJfY2xhc3MsIDApCi0gICAgaWYgZXh0cmFfc2xlZXAgPiAwIGFuZCBvcHRpb25zLnZlcmJvc2UgPiAwOgotICAgICAgcHJpbnQgKCdHaXZpbmcgJXMgKHByb3RvPSVzLHpsaWI9JXMsc3NsPSVzKSBhbiBleHRyYSAlZCBzZWNvbmRzIGZvciBjaGlsZCcKLSAgICAgICAgICAgICAncHJvY2Vzc2VzIHRvIHRlcm1pbmF0ZSB2aWEgYWxhcm0nCi0gICAgICAgICAgICAgJSAoc2VydmVyX2NsYXNzLCBwcm90bywgdXNlX3psaWIsIHVzZV9zc2wsIGV4dHJhX3NsZWVwKSkKLSAgICAgIHRpbWUuc2xlZXAoZXh0cmFfc2xlZXApCi0gICAgb3Mua2lsbChzZXJ2ZXJwcm9jLnBpZCwgc2lnbmFsLlNJR0tJTEwpCi0gICAgc2VydmVycHJvYy53YWl0KCkKKyAgICAgICAgcHJpbnQoJyoqKiBGQUlMRUQgKioqJywgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICBwcmludCgnTElCRElSOiAlcycgJSBsaWJkaXIsIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgcHJpbnQoJ1BZX0dFTjogJXMnICUgZ2VucHlkaXIsIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgcHJpbnQoJ1NDUklQVDogJXMnICUgc2NyaXB0LCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiU2NyaXB0IHN1YnByb2Nlc3MgZmFpbGVkLCByZXRjb2RlPSVkLCBhcmdzOiAlcyIgJSAocmV0LCAnICcuam9pbihzY3JpcHRfYXJncykpKQogCi10ZXN0X2NvdW50ID0gMAotIyBydW4gdGVzdHMgd2l0aG91dCBhIGNsaWVudC9zZXJ2ZXIgZmlyc3QKLXByaW50ICctLS0tLS0tLS0tLS0tLS0tJwotcHJpbnQgJyBFeGVjdXRpbmcgaW5kaXZpZHVhbCB0ZXN0IHNjcmlwdHMgd2l0aCB2YXJpb3VzIGdlbmVyYXRlZCBjb2RlIGRpcmVjdG9yaWVzJwotcHJpbnQgJyBEaXJlY3RvcmllcyB0byBiZSB0ZXN0ZWQ6ICcgKyAnLCAnLmpvaW4oZ2VuZXJhdGVkX2RpcnMpCi1wcmludCAnIFNjcmlwdHMgdG8gYmUgdGVzdGVkOiAnICsgJywgJy5qb2luKFNDUklQVFMpCi1wcmludCAnLS0tLS0tLS0tLS0tLS0tLScKLWZvciBnZW5weWRpciBpbiBnZW5lcmF0ZWRfZGlyczoKLSAgZm9yIHNjcmlwdCBpbiBTQ1JJUFRTOgotICAgIHJ1blNjcmlwdFRlc3QoZ2VucHlkaXIsIHNjcmlwdCkKIAotcHJpbnQgJy0tLS0tLS0tLS0tLS0tLS0nCi1wcmludCAnIEV4ZWN1dGluZyBDbGllbnQvU2VydmVyIHRlc3RzIHdpdGggdmFyaW91cyBnZW5lcmF0ZWQgY29kZSBkaXJlY3RvcmllcycKLXByaW50ICcgU2VydmVycyB0byBiZSB0ZXN0ZWQ6ICcgKyAnLCAnLmpvaW4oU0VSVkVSUykKLXByaW50ICcgRGlyZWN0b3JpZXMgdG8gYmUgdGVzdGVkOiAnICsgJywgJy5qb2luKGdlbmVyYXRlZF9kaXJzKQotcHJpbnQgJyBQcm90b2NvbHMgdG8gYmUgdGVzdGVkOiAnICsgJywgJy5qb2luKFBST1RPUykKLXByaW50ICcgT3B0aW9ucyB0byBiZSB0ZXN0ZWQ6IFpMSUIoeWVzL25vKSwgU1NMKHllcy9ubyknCi1wcmludCAnLS0tLS0tLS0tLS0tLS0tLScKLWZvciB0cnlfc2VydmVyIGluIFNFUlZFUlM6Ci0gIGZvciBnZW5weWRpciBpbiBnZW5lcmF0ZWRfZGlyczoKLSAgICBmb3IgdHJ5X3Byb3RvIGluIFBST1RPUzoKLSAgICAgIGZvciB3aXRoX3psaWIgaW4gKEZhbHNlLCBUcnVlKToKK2RlZiBydW5TZXJ2aWNlVGVzdChsaWJkaXIsIGdlbmJhc2UsIGdlbnB5ZGlyLCBzZXJ2ZXJfY2xhc3MsIHByb3RvLCBwb3J0LCB1c2VfemxpYiwgdXNlX3NzbCwgdmVyYm9zZSk6CisgICAgZW52ID0gc2V0dXBfcHlwYXRoKGxpYmRpciwgb3MucGF0aC5qb2luKGdlbmJhc2UsIGdlbnB5ZGlyKSkKKyAgICAjIEJ1aWxkIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKKyAgICBzZXJ2ZXJfYXJncyA9IFtzeXMuZXhlY3V0YWJsZSwgcmVsZmlsZSgnVGVzdFNlcnZlci5weScpXQorICAgIGNsaV9hcmdzID0gW3N5cy5leGVjdXRhYmxlLCByZWxmaWxlKCdUZXN0Q2xpZW50LnB5JyldCisgICAgZm9yIHdoaWNoIGluIChzZXJ2ZXJfYXJncywgY2xpX2FyZ3MpOgorICAgICAgICB3aGljaC5hcHBlbmQoJy0tcHJvdG9jb2w9JXMnICUgcHJvdG8pICAjIGFjY2VsLCBiaW5hcnksIGNvbXBhY3Qgb3IganNvbgorICAgICAgICB3aGljaC5hcHBlbmQoJy0tcG9ydD0lZCcgJSBwb3J0KSAgIyBkZWZhdWx0IHRvIDkwOTAKKyAgICAgICAgaWYgdXNlX3psaWI6CisgICAgICAgICAgICB3aGljaC5hcHBlbmQoJy0temxpYicpCisgICAgICAgIGlmIHVzZV9zc2w6CisgICAgICAgICAgICB3aGljaC5hcHBlbmQoJy0tc3NsJykKKyAgICAgICAgaWYgdmVyYm9zZSA9PSAwOgorICAgICAgICAgICAgd2hpY2guYXBwZW5kKCctcScpCisgICAgICAgIGlmIHZlcmJvc2UgPT0gMjoKKyAgICAgICAgICAgIHdoaWNoLmFwcGVuZCgnLXYnKQorICAgICMgc2VydmVyLXNwZWNpZmljIG9wdGlvbiB0byBzZWxlY3Qgc2VydmVyIGNsYXNzCisgICAgc2VydmVyX2FyZ3MuYXBwZW5kKHNlcnZlcl9jbGFzcykKKyAgICAjIGNsaWVudC1zcGVjaWZpYyBjbWRsaW5lIG9wdGlvbnMKKyAgICBpZiBzZXJ2ZXJfY2xhc3MgaW4gRlJBTUVEOgorICAgICAgICBjbGlfYXJncy5hcHBlbmQoJy0tdHJhbnNwb3J0PWZyYW1lZCcpCisgICAgZWxzZToKKyAgICAgICAgY2xpX2FyZ3MuYXBwZW5kKCctLXRyYW5zcG9ydD1idWZmZXJlZCcpCisgICAgaWYgc2VydmVyX2NsYXNzID09ICdUSHR0cFNlcnZlcic6CisgICAgICAgIGNsaV9hcmdzLmFwcGVuZCgnLS1odHRwPS8nKQorICAgIGlmIHZlcmJvc2UgPiAwOgorICAgICAgICBwcmludCgnVGVzdGluZyBzZXJ2ZXIgJXM6ICVzJyAlIChzZXJ2ZXJfY2xhc3MsICcgJy5qb2luKHNlcnZlcl9hcmdzKSkpCisgICAgc2VydmVycHJvYyA9IHN1YnByb2Nlc3MuUG9wZW4oc2VydmVyX2FyZ3MsIGVudj1lbnYpCisKKyAgICBkZWYgZW5zdXJlU2VydmVyQWxpdmUoKToKKyAgICAgICAgaWYgc2VydmVycHJvYy5wb2xsKCkgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBwcmludCgoJ0ZBSUw6IFNlcnZlciBwcm9jZXNzICglcykgZmFpbGVkIHdpdGggcmV0Y29kZSAlZCcpCisgICAgICAgICAgICAgICAgICAlICgnICcuam9pbihzZXJ2ZXJfYXJncyksIHNlcnZlcnByb2MucmV0dXJuY29kZSkpCisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oJ1NlcnZlciBzdWJwcm9jZXNzICVzIGRpZWQsIGFyZ3M6ICVzJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKHNlcnZlcl9jbGFzcywgJyAnLmpvaW4oc2VydmVyX2FyZ3MpKSkKKworICAgICMgV2FpdCBmb3IgdGhlIHNlcnZlciB0byBzdGFydCBhY2NlcHRpbmcgY29ubmVjdGlvbnMgb24gdGhlIGdpdmVuIHBvcnQuCisgICAgc2xlZXBfdGltZSA9IDAuMSAgIyBTZWNvbmRzCisgICAgbWF4X2F0dGVtcHRzID0gMTAwCisgICAgYXR0ZW1wdCA9IDAKKyAgICB3aGlsZSBUcnVlOgorICAgICAgICBzb2NrNCA9IHNvY2tldC5zb2NrZXQoKQorICAgICAgICBzb2NrNiA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQ2KQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBzb2NrNC5jb25uZWN0X2V4KCgnMTI3LjAuMC4xJywgcG9ydCkpID09IDAgXAorICAgICAgICAgICAgICAgICAgICBvciBzb2NrNi5jb25uZWN0X2V4KCgnOjoxJywgcG9ydCkpID09IDA6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGF0dGVtcHQgKz0gMQorICAgICAgICAgICAgaWYgYXR0ZW1wdCA+PSBtYXhfYXR0ZW1wdHM6CisgICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJUZXN0U2VydmVyIG5vdCByZWFkeSBvbiBwb3J0ICVkIGFmdGVyICUuMmYgc2Vjb25kcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAocG9ydCwgc2xlZXBfdGltZSAqIGF0dGVtcHQpKQorICAgICAgICAgICAgZW5zdXJlU2VydmVyQWxpdmUoKQorICAgICAgICAgICAgdGltZS5zbGVlcChzbGVlcF90aW1lKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc29jazQuY2xvc2UoKQorICAgICAgICAgICAgc29jazYuY2xvc2UoKQorCisgICAgdHJ5OgorICAgICAgICBpZiB2ZXJib3NlID4gMDoKKyAgICAgICAgICAgIHByaW50KCdUZXN0aW5nIGNsaWVudDogJXMnICUgKCcgJy5qb2luKGNsaV9hcmdzKSkpCisgICAgICAgIHJldCA9IHN1YnByb2Nlc3MuY2FsbChjbGlfYXJncywgZW52PWVudikKKyAgICAgICAgaWYgcmV0ICE9IDA6CisgICAgICAgICAgICBwcmludCgnKioqIEZBSUxFRCAqKionLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgICAgICBwcmludCgnTElCRElSOiAlcycgJSBsaWJkaXIsIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgICAgIHByaW50KCdQWV9HRU46ICVzJyAlIGdlbnB5ZGlyLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oIkNsaWVudCBzdWJwcm9jZXNzIGZhaWxlZCwgcmV0Y29kZT0lZCwgYXJnczogJXMiICUgKHJldCwgJyAnLmpvaW4oY2xpX2FyZ3MpKSkKKyAgICBmaW5hbGx5OgorICAgICAgICAjIGNoZWNrIHRoYXQgc2VydmVyIGRpZG4ndCBkaWUKKyAgICAgICAgZW5zdXJlU2VydmVyQWxpdmUoKQorICAgICAgICBleHRyYV9zbGVlcCA9IEVYVFJBX0RFTEFZLmdldChzZXJ2ZXJfY2xhc3MsIDApCisgICAgICAgIGlmIGV4dHJhX3NsZWVwID4gMCBhbmQgdmVyYm9zZSA+IDA6CisgICAgICAgICAgICBwcmludCgnR2l2aW5nICVzIChwcm90bz0lcyx6bGliPSVzLHNzbD0lcykgYW4gZXh0cmEgJWQgc2Vjb25kcyBmb3IgY2hpbGQnCisgICAgICAgICAgICAgICAgICAncHJvY2Vzc2VzIHRvIHRlcm1pbmF0ZSB2aWEgYWxhcm0nCisgICAgICAgICAgICAgICAgICAlIChzZXJ2ZXJfY2xhc3MsIHByb3RvLCB1c2VfemxpYiwgdXNlX3NzbCwgZXh0cmFfc2xlZXApKQorICAgICAgICAgICAgdGltZS5zbGVlcChleHRyYV9zbGVlcCkKKyAgICAgICAgc2lnID0gc2lnbmFsLlNJR0tJTEwgaWYgcGxhdGZvcm0uc3lzdGVtKCkgIT0gJ1dpbmRvd3MnIGVsc2Ugc2lnbmFsLlNJR0FCUlQKKyAgICAgICAgb3Mua2lsbChzZXJ2ZXJwcm9jLnBpZCwgc2lnKQorICAgICAgICBzZXJ2ZXJwcm9jLndhaXQoKQorCisKK2NsYXNzIFRlc3RDYXNlcyhvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBnZW5iYXNlLCBsaWJkaXIsIHBvcnQsIGdlbmRpcnMsIHNlcnZlcnMsIHZlcmJvc2UpOgorICAgICAgICBzZWxmLmdlbmJhc2UgPSBnZW5iYXNlCisgICAgICAgIHNlbGYubGliZGlyID0gbGliZGlyCisgICAgICAgIHNlbGYucG9ydCA9IHBvcnQKKyAgICAgICAgc2VsZi52ZXJib3NlID0gdmVyYm9zZQorICAgICAgICBzZWxmLmdlbmRpcnMgPSBnZW5kaXJzCisgICAgICAgIHNlbGYuc2VydmVycyA9IHNlcnZlcnMKKworICAgIGRlZiBkZWZhdWx0X2NvbmYoc2VsZik6CisgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICAnZ2VuZGlyJzogc2VsZi5nZW5kaXJzWzBdLAorICAgICAgICAgICAgJ3NlcnZlcic6IHNlbGYuc2VydmVyc1swXSwKKyAgICAgICAgICAgICdwcm90byc6IFBST1RPU1swXSwKKyAgICAgICAgICAgICd6bGliJzogRmFsc2UsCisgICAgICAgICAgICAnc3NsJzogRmFsc2UsCisgICAgICAgIH0KKworICAgIGRlZiBydW4oc2VsZiwgY29uZiwgdGVzdF9jb3VudCk6CisgICAgICAgIHdpdGhfemxpYiA9IGNvbmZbJ3psaWInXQorICAgICAgICB3aXRoX3NzbCA9IGNvbmZbJ3NzbCddCisgICAgICAgIHRyeV9zZXJ2ZXIgPSBjb25mWydzZXJ2ZXInXQorICAgICAgICB0cnlfcHJvdG8gPSBjb25mWydwcm90byddCisgICAgICAgIGdlbnB5ZGlyID0gY29uZlsnZ2VuZGlyJ10KICAgICAgICAgIyBza2lwIGFueSBzZXJ2ZXJzIHRoYXQgZG9uJ3Qgd29yayB3aXRoIHRoZSBabGliIHRyYW5zcG9ydAogICAgICAgICBpZiB3aXRoX3psaWIgYW5kIHRyeV9zZXJ2ZXIgaW4gU0tJUF9aTElCOgotICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgIGZvciB3aXRoX3NzbCBpbiAoRmFsc2UsIFRydWUpOgotICAgICAgICAgICMgc2tpcCBhbnkgc2VydmVycyB0aGF0IGRvbid0IHdvcmsgd2l0aCBTU0wKLSAgICAgICAgICBpZiB3aXRoX3NzbCBhbmQgdHJ5X3NlcnZlciBpbiBTS0lQX1NTTDoKLSAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgdGVzdF9jb3VudCArPSAxCi0gICAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMDoKLSAgICAgICAgICAgIHByaW50ICdcblRlc3QgcnVuICMlZDogIChpbmNsdWRlcyAlcykgU2VydmVyPSVzLCAgUHJvdG89JXMsICB6bGliPSVzLCAgU1NMPSVzJyAlICh0ZXN0X2NvdW50LCBnZW5weWRpciwgdHJ5X3NlcnZlciwgdHJ5X3Byb3RvLCB3aXRoX3psaWIsIHdpdGhfc3NsKQotICAgICAgICAgIHJ1blNlcnZpY2VUZXN0KGdlbnB5ZGlyLCB0cnlfc2VydmVyLCB0cnlfcHJvdG8sIG9wdGlvbnMucG9ydCwgd2l0aF96bGliLCB3aXRoX3NzbCkKLSAgICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAwOgotICAgICAgICAgICAgcHJpbnQgJ09LOiBGaW5pc2hlZCAoaW5jbHVkZXMgJXMpICAlcyAvICVzIHByb3RvIC8gemxpYj0lcyAvIFNTTD0lcy4gICAlZCBjb21iaW5hdGlvbnMgdGVzdGVkLicgJSAoZ2VucHlkaXIsIHRyeV9zZXJ2ZXIsIHRyeV9wcm90bywgd2l0aF96bGliLCB3aXRoX3NzbCwgdGVzdF9jb3VudCkKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAjIHNraXAgYW55IHNlcnZlcnMgdGhhdCBkb24ndCB3b3JrIHdpdGggU1NMCisgICAgICAgIGlmIHdpdGhfc3NsIGFuZCB0cnlfc2VydmVyIGluIFNLSVBfU1NMOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGlmIHNlbGYudmVyYm9zZSA+IDA6CisgICAgICAgICAgICBwcmludCgnXG5UZXN0IHJ1biAjJWQ6ICAoaW5jbHVkZXMgJXMpIFNlcnZlcj0lcywgIFByb3RvPSVzLCAgemxpYj0lcywgIFNTTD0lcycKKyAgICAgICAgICAgICAgICAgICUgKHRlc3RfY291bnQsIGdlbnB5ZGlyLCB0cnlfc2VydmVyLCB0cnlfcHJvdG8sIHdpdGhfemxpYiwgd2l0aF9zc2wpKQorICAgICAgICBydW5TZXJ2aWNlVGVzdChzZWxmLmxpYmRpciwgc2VsZi5nZW5iYXNlLCBnZW5weWRpciwgdHJ5X3NlcnZlciwgdHJ5X3Byb3RvLCBzZWxmLnBvcnQsIHdpdGhfemxpYiwgd2l0aF9zc2wsIHNlbGYudmVyYm9zZSkKKyAgICAgICAgaWYgc2VsZi52ZXJib3NlID4gMDoKKyAgICAgICAgICAgIHByaW50KCdPSzogRmluaXNoZWQgKGluY2x1ZGVzICVzKSAgJXMgLyAlcyBwcm90byAvIHpsaWI9JXMgLyBTU0w9JXMuICAgJWQgY29tYmluYXRpb25zIHRlc3RlZC4nCisgICAgICAgICAgICAgICAgICAlIChnZW5weWRpciwgdHJ5X3NlcnZlciwgdHJ5X3Byb3RvLCB3aXRoX3psaWIsIHdpdGhfc3NsLCB0ZXN0X2NvdW50KSkKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiB0ZXN0X2ZlYXR1cmUoc2VsZiwgbmFtZSwgdmFsdWVzKToKKyAgICAgICAgdGVzdF9jb3VudCA9IDAKKyAgICAgICAgY29uZiA9IHNlbGYuZGVmYXVsdF9jb25mKCkKKyAgICAgICAgZm9yIHRyeV9zZXJ2ZXIgaW4gdmFsdWVzOgorICAgICAgICAgICAgY29uZltuYW1lXSA9IHRyeV9zZXJ2ZXIKKyAgICAgICAgICAgIGlmIHNlbGYucnVuKGNvbmYsIHRlc3RfY291bnQpOgorICAgICAgICAgICAgICAgIHRlc3RfY291bnQgKz0gMQorICAgICAgICByZXR1cm4gdGVzdF9jb3VudAorCisgICAgZGVmIHJ1bl9hbGxfdGVzdHMoc2VsZik6CisgICAgICAgIHRlc3RfY291bnQgPSAwCisgICAgICAgIGZvciB0cnlfc2VydmVyIGluIHNlbGYuc2VydmVyczoKKyAgICAgICAgICAgIGZvciBnZW5weWRpciBpbiBzZWxmLmdlbmRpcnM6CisgICAgICAgICAgICAgICAgZm9yIHRyeV9wcm90byBpbiBQUk9UT1M6CisgICAgICAgICAgICAgICAgICAgIGZvciB3aXRoX3psaWIgaW4gKEZhbHNlLCBUcnVlKToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgc2tpcCBhbnkgc2VydmVycyB0aGF0IGRvbid0IHdvcmsgd2l0aCB0aGUgWmxpYiB0cmFuc3BvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHdpdGhfemxpYiBhbmQgdHJ5X3NlcnZlciBpbiBTS0lQX1pMSUI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciB3aXRoX3NzbCBpbiAoRmFsc2UsIFRydWUpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc2tpcCBhbnkgc2VydmVycyB0aGF0IGRvbid0IHdvcmsgd2l0aCBTU0wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB3aXRoX3NzbCBhbmQgdHJ5X3NlcnZlciBpbiBTS0lQX1NTTDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X2NvdW50ICs9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnZlcmJvc2UgPiAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludCgnXG5UZXN0IHJ1biAjJWQ6ICAoaW5jbHVkZXMgJXMpIFNlcnZlcj0lcywgIFByb3RvPSVzLCAgemxpYj0lcywgIFNTTD0lcycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAodGVzdF9jb3VudCwgZ2VucHlkaXIsIHRyeV9zZXJ2ZXIsIHRyeV9wcm90bywgd2l0aF96bGliLCB3aXRoX3NzbCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuU2VydmljZVRlc3Qoc2VsZi5saWJkaXIsIHNlbGYuZ2VuYmFzZSwgZ2VucHlkaXIsIHRyeV9zZXJ2ZXIsIHRyeV9wcm90bywgc2VsZi5wb3J0LCB3aXRoX3psaWIsIHdpdGhfc3NsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYudmVyYm9zZSA+IDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KCdPSzogRmluaXNoZWQgKGluY2x1ZGVzICVzKSAgJXMgLyAlcyBwcm90byAvIHpsaWI9JXMgLyBTU0w9JXMuICAgJWQgY29tYmluYXRpb25zIHRlc3RlZC4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKGdlbnB5ZGlyLCB0cnlfc2VydmVyLCB0cnlfcHJvdG8sIHdpdGhfemxpYiwgd2l0aF9zc2wsIHRlc3RfY291bnQpKQorICAgICAgICByZXR1cm4gdGVzdF9jb3VudAorCisKK2RlZiBtYWluKCk6CisgICAgcGFyc2VyID0gT3B0aW9uUGFyc2VyKCkKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLS1hbGwnLCBhY3Rpb249InN0b3JlX3RydWUiLCBkZXN0PSdhbGwnKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCctLWdlbnB5ZGlycycsIHR5cGU9J3N0cmluZycsIGRlc3Q9J2dlbnB5ZGlycycsCisgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0nZGVmYXVsdCxzbG90cyxvbGRzdHlsZSxub191dGY4c3RyaW5ncyxkeW5hbWljLGR5bmFtaWNzbG90cycsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0nZGlyZWN0b3J5IGV4dGVuc2lvbnMgZm9yIGdlbmVyYXRlZCBjb2RlLCB1c2VkIGFzIHN1ZmZpeGVzIGZvciBcImdlbi1weS0qXCIgYWRkZWQgc3lzLnBhdGggZm9yIGluZGl2aWR1YWwgdGVzdHMnKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCItLXBvcnQiLCB0eXBlPSJpbnQiLCBkZXN0PSJwb3J0IiwgZGVmYXVsdD05MDkwLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9InBvcnQgbnVtYmVyIGZvciBzZXJ2ZXIgdG8gbGlzdGVuIG9uIikKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLXYnLCAnLS12ZXJib3NlJywgYWN0aW9uPSJzdG9yZV9jb25zdCIsCisgICAgICAgICAgICAgICAgICAgICAgZGVzdD0idmVyYm9zZSIsIGNvbnN0PTIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0idmVyYm9zZSBvdXRwdXQiKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCctcScsICctLXF1aWV0JywgYWN0aW9uPSJzdG9yZV9jb25zdCIsCisgICAgICAgICAgICAgICAgICAgICAgZGVzdD0idmVyYm9zZSIsIGNvbnN0PTAsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0ibWluaW1hbCBvdXRwdXQiKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCctTCcsICctLWxpYmRpcicsIGRlc3Q9ImxpYmRpciIsIGRlZmF1bHQ9bG9jYWxfbGlicGF0aCgpLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9ImRpcmVjdG9yeSBwYXRoIHRoYXQgY29udGFpbnMgVGhyaWZ0IFB5dGhvbiBsaWJyYXJ5IikKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLS1nZW4tYmFzZScsIGRlc3Q9Imdlbl9iYXNlIiwgZGVmYXVsdD1TQ1JJUFRfRElSLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9ImRpcmVjdG9yeSBwYXRoIHRoYXQgY29udGFpbnMgVGhyaWZ0IFB5dGhvbiBsaWJyYXJ5IikKKyAgICBwYXJzZXIuc2V0X2RlZmF1bHRzKHZlcmJvc2U9MSkKKyAgICBvcHRpb25zLCBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQorCisgICAgZ2VuZXJhdGVkX2RpcnMgPSBbXQorICAgIGZvciBncF9kaXIgaW4gb3B0aW9ucy5nZW5weWRpcnMuc3BsaXQoJywnKToKKyAgICAgICAgZ2VuZXJhdGVkX2RpcnMuYXBwZW5kKCdnZW4tcHktJXMnICUgKGdwX2RpcikpCisKKyAgICAjIGNvbW1hbmRsaW5lIHBlcm1pdHMgYSBzaW5nbGUgY2xhc3MgbmFtZSB0byBiZSBzcGVjaWZpZWQgdG8gb3ZlcnJpZGUgU0VSVkVSUz1bLi4uXQorICAgIHNlcnZlcnMgPSBkZWZhdWx0X3NlcnZlcnMoKQorICAgIGlmIGxlbihhcmdzKSA9PSAxOgorICAgICAgICBpZiBhcmdzWzBdIGluIHNlcnZlcnM6CisgICAgICAgICAgICBzZXJ2ZXJzID0gYXJncworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQoJ1VuYXZhaWxhYmxlIHNlcnZlciB0eXBlICIlcyIsIHBsZWFzZSBjaG9vc2Ugb25lIG9mOiAlcycgJSAoYXJnc1swXSwgc2VydmVycykpCisgICAgICAgICAgICBzeXMuZXhpdCgwKQorCisgICAgdGVzdHMgPSBUZXN0Q2FzZXMob3B0aW9ucy5nZW5fYmFzZSwgb3B0aW9ucy5saWJkaXIsIG9wdGlvbnMucG9ydCwgZ2VuZXJhdGVkX2RpcnMsIHNlcnZlcnMsIG9wdGlvbnMudmVyYm9zZSkKKworICAgICMgcnVuIHRlc3RzIHdpdGhvdXQgYSBjbGllbnQvc2VydmVyIGZpcnN0CisgICAgcHJpbnQoJy0tLS0tLS0tLS0tLS0tLS0nKQorICAgIHByaW50KCcgRXhlY3V0aW5nIGluZGl2aWR1YWwgdGVzdCBzY3JpcHRzIHdpdGggdmFyaW91cyBnZW5lcmF0ZWQgY29kZSBkaXJlY3RvcmllcycpCisgICAgcHJpbnQoJyBEaXJlY3RvcmllcyB0byBiZSB0ZXN0ZWQ6ICcgKyAnLCAnLmpvaW4oZ2VuZXJhdGVkX2RpcnMpKQorICAgIHByaW50KCcgU2NyaXB0cyB0byBiZSB0ZXN0ZWQ6ICcgKyAnLCAnLmpvaW4oU0NSSVBUUykpCisgICAgcHJpbnQoJy0tLS0tLS0tLS0tLS0tLS0nKQorICAgIGZvciBnZW5weWRpciBpbiBnZW5lcmF0ZWRfZGlyczoKKyAgICAgICAgZm9yIHNjcmlwdCBpbiBTQ1JJUFRTOgorICAgICAgICAgICAgcnVuU2NyaXB0VGVzdChvcHRpb25zLmxpYmRpciwgb3B0aW9ucy5nZW5fYmFzZSwgZ2VucHlkaXIsIHNjcmlwdCkKKworICAgIHByaW50KCctLS0tLS0tLS0tLS0tLS0tJykKKyAgICBwcmludCgnIEV4ZWN1dGluZyBDbGllbnQvU2VydmVyIHRlc3RzIHdpdGggdmFyaW91cyBnZW5lcmF0ZWQgY29kZSBkaXJlY3RvcmllcycpCisgICAgcHJpbnQoJyBTZXJ2ZXJzIHRvIGJlIHRlc3RlZDogJyArICcsICcuam9pbihzZXJ2ZXJzKSkKKyAgICBwcmludCgnIERpcmVjdG9yaWVzIHRvIGJlIHRlc3RlZDogJyArICcsICcuam9pbihnZW5lcmF0ZWRfZGlycykpCisgICAgcHJpbnQoJyBQcm90b2NvbHMgdG8gYmUgdGVzdGVkOiAnICsgJywgJy5qb2luKFBST1RPUykpCisgICAgcHJpbnQoJyBPcHRpb25zIHRvIGJlIHRlc3RlZDogWkxJQih5ZXMvbm8pLCBTU0woeWVzL25vKScpCisgICAgcHJpbnQoJy0tLS0tLS0tLS0tLS0tLS0nKQorCisgICAgaWYgb3B0aW9ucy5hbGw6CisgICAgICAgIHRlc3RzLnJ1bl9hbGxfdGVzdHMoKQorICAgIGVsc2U6CisgICAgICAgIHRlc3RzLnRlc3RfZmVhdHVyZSgnZ2VuZGlyJywgZ2VuZXJhdGVkX2RpcnMpCisgICAgICAgIHRlc3RzLnRlc3RfZmVhdHVyZSgnc2VydmVyJywgc2VydmVycykKKyAgICAgICAgdGVzdHMudGVzdF9mZWF0dXJlKCdwcm90bycsIFBST1RPUykKKyAgICAgICAgdGVzdHMudGVzdF9mZWF0dXJlKCd6bGliJywgW0ZhbHNlLCBUcnVlXSkKKyAgICAgICAgdGVzdHMudGVzdF9mZWF0dXJlKCdzc2wnLCBbRmFsc2UsIFRydWVdKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgc3lzLmV4aXQobWFpbigpKQpkaWZmIC0tZ2l0IGEvdGVzdC9weS9TZXJpYWxpemF0aW9uVGVzdC5weSBiL3Rlc3QvcHkvU2VyaWFsaXphdGlvblRlc3QucHkKaW5kZXggNDBhNTJlNi4uZWY3OTgzNSAxMDA3NTUKLS0tIGEvdGVzdC9weS9TZXJpYWxpemF0aW9uVGVzdC5weQorKysgYi90ZXN0L3B5L1NlcmlhbGl6YXRpb25UZXN0LnB5CkBAIC0xOSwzNTMgKzE5LDQzOSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotaW1wb3J0IHN5cywgZ2xvYgotZnJvbSBvcHRwYXJzZSBpbXBvcnQgT3B0aW9uUGFyc2VyCi1wYXJzZXIgPSBPcHRpb25QYXJzZXIoKQotcGFyc2VyLmFkZF9vcHRpb24oJy0tZ2VucHlkaXInLCB0eXBlPSdzdHJpbmcnLCBkZXN0PSdnZW5weWRpcicsIGRlZmF1bHQ9J2dlbi1weScpCi1vcHRpb25zLCBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQotZGVsIHN5cy5hcmd2WzE6XSAjIGNsZWFuIHVwIGhhY2sgc28gdW5pdHRlc3QgZG9lc24ndCBjb21wbGFpbgotc3lzLnBhdGguaW5zZXJ0KDAsIG9wdGlvbnMuZ2VucHlkaXIpCi1zeXMucGF0aC5pbnNlcnQoMCwgZ2xvYi5nbG9iKCcuLi8uLi9saWIvcHkvYnVpbGQvbGliLionKVswXSkKK2Zyb20gVGhyaWZ0VGVzdC50dHlwZXMgaW1wb3J0ICgKKyAgICBCb25rLAorICAgIEJvb2xzLAorICAgIExhcmdlRGVsdGFzLAorICAgIExpc3RCb25rcywKKyAgICBOZXN0ZWRMaXN0c0JvbmssCisgICAgTmVzdGVkTGlzdHNJMzJ4MiwKKyAgICBOZXN0ZWRMaXN0c0kzMngzLAorICAgIE5lc3RlZE1peGVkeDIsCisgICAgTnVtYmVyeiwKKyAgICBWZXJzaW9uaW5nVGVzdFYxLAorICAgIFZlcnNpb25pbmdUZXN0VjIsCisgICAgWHRydWN0LAorICAgIFh0cnVjdDIsCispCiAKLWZyb20gVGhyaWZ0VGVzdC50dHlwZXMgaW1wb3J0ICoKK2Zyb20gUmVjdXJzaXZlLnR0eXBlcyBpbXBvcnQgUmVjVHJlZQorZnJvbSBSZWN1cnNpdmUudHR5cGVzIGltcG9ydCBSZWNMaXN0Citmcm9tIFJlY3Vyc2l2ZS50dHlwZXMgaW1wb3J0IENvUmVjCitmcm9tIFJlY3Vyc2l2ZS50dHlwZXMgaW1wb3J0IENvUmVjMgorZnJvbSBSZWN1cnNpdmUudHR5cGVzIGltcG9ydCBWZWN0b3JUZXN0CiBmcm9tIERlYnVnUHJvdG9UZXN0LnR0eXBlcyBpbXBvcnQgQ29tcGFjdFByb3RvVGVzdFN0cnVjdCwgRW1wdHkKIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAotZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUU29ja2V0CiBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sLCBUQ29tcGFjdFByb3RvY29sLCBUSlNPTlByb3RvY29sCiBmcm9tIHRocmlmdC5UU2VyaWFsaXphdGlvbiBpbXBvcnQgc2VyaWFsaXplLCBkZXNlcmlhbGl6ZQoraW1wb3J0IHN5cwogaW1wb3J0IHVuaXR0ZXN0Ci1pbXBvcnQgdGltZQorCiAKIGNsYXNzIEFic3RyYWN0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKLSAgZGVmIHNldFVwKHNlbGYpOgotICAgICAgc2VsZi52MW9iaiA9IFZlcnNpb25pbmdUZXN0VjEoCi0gICAgICAgICAgYmVnaW5faW5fYm90aD0xMjM0NSwKLSAgICAgICAgICBvbGRfc3RyaW5nPSdhYWEnLAotICAgICAgICAgIGVuZF9pbl9ib3RoPTU0MzIxLAotICAgICAgICAgICkKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYudjFvYmogPSBWZXJzaW9uaW5nVGVzdFYxKAorICAgICAgICAgICAgYmVnaW5faW5fYm90aD0xMjM0NSwKKyAgICAgICAgICAgIG9sZF9zdHJpbmc9J2FhYScsCisgICAgICAgICAgICBlbmRfaW5fYm90aD01NDMyMSwKKyAgICAgICAgKQogCi0gICAgICBzZWxmLnYyb2JqID0gVmVyc2lvbmluZ1Rlc3RWMigKLSAgICAgICAgICBiZWdpbl9pbl9ib3RoPTEyMzQ1LAotICAgICAgICAgIG5ld2ludD0xLAotICAgICAgICAgIG5ld2J5dGU9MiwKLSAgICAgICAgICBuZXdzaG9ydD0zLAotICAgICAgICAgIG5ld2xvbmc9NCwKLSAgICAgICAgICBuZXdkb3VibGU9NS4wLAotICAgICAgICAgIG5ld3N0cnVjdD1Cb25rKG1lc3NhZ2U9IkhlbGxvISIsIHR5cGU9MTIzKSwKLSAgICAgICAgICBuZXdsaXN0PVs3LDgsOV0sCi0gICAgICAgICAgbmV3c2V0PXNldChbNDIsMSw4XSksCi0gICAgICAgICAgbmV3bWFwPXsxOjIsMjozfSwKLSAgICAgICAgICBuZXdzdHJpbmc9IkhvbGEhIiwKLSAgICAgICAgICBlbmRfaW5fYm90aD01NDMyMSwKLSAgICAgICAgICApCisgICAgICAgIHNlbGYudjJvYmogPSBWZXJzaW9uaW5nVGVzdFYyKAorICAgICAgICAgICAgYmVnaW5faW5fYm90aD0xMjM0NSwKKyAgICAgICAgICAgIG5ld2ludD0xLAorICAgICAgICAgICAgbmV3Ynl0ZT0yLAorICAgICAgICAgICAgbmV3c2hvcnQ9MywKKyAgICAgICAgICAgIG5ld2xvbmc9NCwKKyAgICAgICAgICAgIG5ld2RvdWJsZT01LjAsCisgICAgICAgICAgICBuZXdzdHJ1Y3Q9Qm9uayhtZXNzYWdlPSJIZWxsbyEiLCB0eXBlPTEyMyksCisgICAgICAgICAgICBuZXdsaXN0PVs3LCA4LCA5XSwKKyAgICAgICAgICAgIG5ld3NldD1zZXQoWzQyLCAxLCA4XSksCisgICAgICAgICAgICBuZXdtYXA9ezE6IDIsIDI6IDN9LAorICAgICAgICAgICAgbmV3c3RyaW5nPSJIb2xhISIsCisgICAgICAgICAgICBlbmRfaW5fYm90aD01NDMyMSwKKyAgICAgICAgKQogCi0gICAgICBzZWxmLmJvb2xzID0gQm9vbHMoaW1fdHJ1ZT1UcnVlLCBpbV9mYWxzZT1GYWxzZSkKLSAgICAgIHNlbGYuYm9vbHNfZmxpcHBlZCA9IEJvb2xzKGltX3RydWU9RmFsc2UsIGltX2ZhbHNlPVRydWUpCisgICAgICAgIHNlbGYuYm9vbHMgPSBCb29scyhpbV90cnVlPVRydWUsIGltX2ZhbHNlPUZhbHNlKQorICAgICAgICBzZWxmLmJvb2xzX2ZsaXBwZWQgPSBCb29scyhpbV90cnVlPUZhbHNlLCBpbV9mYWxzZT1UcnVlKQogCi0gICAgICBzZWxmLmxhcmdlX2RlbHRhcyA9IExhcmdlRGVsdGFzICgKLSAgICAgICAgICBiMT1zZWxmLmJvb2xzLAotICAgICAgICAgIGIxMD1zZWxmLmJvb2xzX2ZsaXBwZWQsCi0gICAgICAgICAgYjEwMD1zZWxmLmJvb2xzLAotICAgICAgICAgIGNoZWNrX3RydWU9VHJ1ZSwKLSAgICAgICAgICBiMTAwMD1zZWxmLmJvb2xzX2ZsaXBwZWQsCi0gICAgICAgICAgY2hlY2tfZmFsc2U9RmFsc2UsCi0gICAgICAgICAgdmVydHdvMjAwMD1WZXJzaW9uaW5nVGVzdFYyKG5ld3N0cnVjdD1Cb25rKG1lc3NhZ2U9J1dvcmxkIScsIHR5cGU9MzE0KSksCi0gICAgICAgICAgYV9zZXQyNTAwPXNldChbJ2xhenknLCAnYnJvd24nLCAnY293J10pLAotICAgICAgICAgIHZlcnR3bzMwMDA9VmVyc2lvbmluZ1Rlc3RWMihuZXdzZXQ9c2V0KFsyLCAzLCA1LCA3LCAxMV0pKSwKLSAgICAgICAgICBiaWdfbnVtYmVycz1bMioqOCwgMioqMTYsIDIqKjMxLTEsIC0oMioqMzEtMSldCi0gICAgICAgICAgKQorICAgICAgICBzZWxmLmxhcmdlX2RlbHRhcyA9IExhcmdlRGVsdGFzKAorICAgICAgICAgICAgYjE9c2VsZi5ib29scywKKyAgICAgICAgICAgIGIxMD1zZWxmLmJvb2xzX2ZsaXBwZWQsCisgICAgICAgICAgICBiMTAwPXNlbGYuYm9vbHMsCisgICAgICAgICAgICBjaGVja190cnVlPVRydWUsCisgICAgICAgICAgICBiMTAwMD1zZWxmLmJvb2xzX2ZsaXBwZWQsCisgICAgICAgICAgICBjaGVja19mYWxzZT1GYWxzZSwKKyAgICAgICAgICAgIHZlcnR3bzIwMDA9VmVyc2lvbmluZ1Rlc3RWMihuZXdzdHJ1Y3Q9Qm9uayhtZXNzYWdlPSdXb3JsZCEnLCB0eXBlPTMxNCkpLAorICAgICAgICAgICAgYV9zZXQyNTAwPXNldChbJ2xhenknLCAnYnJvd24nLCAnY293J10pLAorICAgICAgICAgICAgdmVydHdvMzAwMD1WZXJzaW9uaW5nVGVzdFYyKG5ld3NldD1zZXQoWzIsIDMsIDUsIDcsIDExXSkpLAorICAgICAgICAgICAgYmlnX251bWJlcnM9WzIgKiogOCwgMiAqKiAxNiwgMiAqKiAzMSAtIDEsIC0oMiAqKiAzMSAtIDEpXQorICAgICAgICApCiAKLSAgICAgIHNlbGYuY29tcGFjdF9zdHJ1Y3QgPSBDb21wYWN0UHJvdG9UZXN0U3RydWN0KAotICAgICAgICAgIGFfYnl0ZSA9IDEyNywKLSAgICAgICAgICBhX2kxNj0zMjAwMCwKLSAgICAgICAgICBhX2kzMj0xMDAwMDAwMDAwLAotICAgICAgICAgIGFfaTY0PTB4ZmZmZmZmZmZmZiwKLSAgICAgICAgICBhX2RvdWJsZT01LjY3ODksCi0gICAgICAgICAgYV9zdHJpbmc9Im15IHN0cmluZyIsCi0gICAgICAgICAgdHJ1ZV9maWVsZD1UcnVlLAotICAgICAgICAgIGZhbHNlX2ZpZWxkPUZhbHNlLAotICAgICAgICAgIGVtcHR5X3N0cnVjdF9maWVsZD1FbXB0eSgpLAotICAgICAgICAgIGJ5dGVfbGlzdD1bLTEyNywgLTEsIDAsIDEsIDEyN10sCi0gICAgICAgICAgaTE2X2xpc3Q9Wy0xLCAwLCAxLCAweDdmZmZdLAotICAgICAgICAgIGkzMl9saXN0PSBbLTEsIDAsIDB4ZmYsIDB4ZmZmZiwgMHhmZmZmZmYsIDB4N2ZmZmZmZmZdLAotICAgICAgICAgIGk2NF9saXN0PVstMSwgMCwgMHhmZiwgMHhmZmZmLCAweGZmZmZmZiwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZmZmLCAweGZmZmZmZmZmZmZmZiwgMHhmZmZmZmZmZmZmZmZmZiwgMHg3ZmZmZmZmZmZmZmZmZmZmXSwKLSAgICAgICAgICBkb3VibGVfbGlzdD1bMC4xLCAwLjIsIDAuM10sCi0gICAgICAgICAgc3RyaW5nX2xpc3Q9WyJmaXJzdCIsICJzZWNvbmQiLCAidGhpcmQiXSwKLSAgICAgICAgICBib29sZWFuX2xpc3Q9W1RydWUsIFRydWUsIFRydWUsIEZhbHNlLCBGYWxzZSwgRmFsc2VdLAotICAgICAgICAgIHN0cnVjdF9saXN0PVtFbXB0eSgpLCBFbXB0eSgpXSwKLSAgICAgICAgICBieXRlX3NldD1zZXQoWy0xMjcsIC0xLCAwLCAxLCAxMjddKSwKLSAgICAgICAgICBpMTZfc2V0PXNldChbLTEsIDAsIDEsIDB4N2ZmZl0pLAotICAgICAgICAgIGkzMl9zZXQ9c2V0KFsxLCAyLCAzXSksCi0gICAgICAgICAgaTY0X3NldD1zZXQoWy0xLCAwLCAweGZmLCAweGZmZmYsIDB4ZmZmZmZmLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmZmYsIDB4ZmZmZmZmZmZmZmZmLCAweGZmZmZmZmZmZmZmZmZmLCAweDdmZmZmZmZmZmZmZmZmZmZdKSwKLSAgICAgICAgICBkb3VibGVfc2V0PXNldChbMC4xLCAwLjIsIDAuM10pLAotICAgICAgICAgIHN0cmluZ19zZXQ9c2V0KFsiZmlyc3QiLCAic2Vjb25kIiwgInRoaXJkIl0pLAotICAgICAgICAgIGJvb2xlYW5fc2V0PXNldChbVHJ1ZSwgRmFsc2VdKSwKLSAgICAgICAgICAjc3RydWN0X3NldD1zZXQoW0VtcHR5KCldKSwgIyB1bmhhc2hhYmxlIGluc3RhbmNlCi0gICAgICAgICAgYnl0ZV9ieXRlX21hcD17MSA6IDJ9LAotICAgICAgICAgIGkxNl9ieXRlX21hcD17MSA6IDEsIC0xIDogMSwgMHg3ZmZmIDogMX0sCi0gICAgICAgICAgaTMyX2J5dGVfbWFwPXsxIDogMSwgLTEgOiAxLCAweDdmZmZmZmZmIDogMX0sCi0gICAgICAgICAgaTY0X2J5dGVfbWFwPXswIDogMSwgIDEgOiAxLCAtMSA6IDEsIDB4N2ZmZmZmZmZmZmZmZmZmZiA6IDF9LAotICAgICAgICAgIGRvdWJsZV9ieXRlX21hcD17LTEuMSA6IDEsIDEuMSA6IDF9LAotICAgICAgICAgIHN0cmluZ19ieXRlX21hcD17ImZpcnN0IiA6IDEsICJzZWNvbmQiIDogMiwgInRoaXJkIiA6IDMsICIiIDogMH0sCi0gICAgICAgICAgYm9vbGVhbl9ieXRlX21hcD17VHJ1ZSA6IDEsIEZhbHNlOiAwfSwKLSAgICAgICAgICBieXRlX2kxNl9tYXA9ezEgOiAxLCAyIDogLTEsIDMgOiAweDdmZmZ9LAotICAgICAgICAgIGJ5dGVfaTMyX21hcD17MSA6IDEsIDIgOiAtMSwgMyA6IDB4N2ZmZmZmZmZ9LAotICAgICAgICAgIGJ5dGVfaTY0X21hcD17MSA6IDEsIDIgOiAtMSwgMyA6IDB4N2ZmZmZmZmZmZmZmZmZmZn0sCi0gICAgICAgICAgYnl0ZV9kb3VibGVfbWFwPXsxIDogMC4xLCAyIDogLTAuMSwgMyA6IDEwMDAwMDAuMX0sCi0gICAgICAgICAgYnl0ZV9zdHJpbmdfbWFwPXsxIDogIiIsIDIgOiAiYmxhaCIsIDMgOiAibG9vb29vb29vb29vb29vbmcgc3RyaW5nIn0sCi0gICAgICAgICAgYnl0ZV9ib29sZWFuX21hcD17MSA6IFRydWUsIDIgOiBGYWxzZX0sCi0gICAgICAgICAgI2xpc3RfYnl0ZV9tYXAgIyB1bmhhc2hhYmxlCi0gICAgICAgICAgI3NldF9ieXRlX21hcD17c2V0KFsxLCAyLCAzXSkgOiAxLCBzZXQoWzAsIDFdKSA6IDIsIHNldChbXSkgOiAwfSwgIyB1bmhhc2hhYmxlCi0gICAgICAgICAgI21hcF9ieXRlX21hcCAjIHVuaGFzaGFibGUKLSAgICAgICAgICBieXRlX21hcF9tYXA9ezAgOiB7fSwgMSA6IHsxIDogMX0sIDIgOiB7MSA6IDEsIDIgOiAyfX0sCi0gICAgICAgICAgYnl0ZV9zZXRfbWFwPXswIDogc2V0KFtdKSwgMSA6IHNldChbMV0pLCAyIDogc2V0KFsxLCAyXSl9LAotICAgICAgICAgIGJ5dGVfbGlzdF9tYXA9ezAgOiBbXSwgMSA6IFsxXSwgMiA6IFsxLCAyXX0sCi0gICAgICAgICAgKQorICAgICAgICBzZWxmLmNvbXBhY3Rfc3RydWN0ID0gQ29tcGFjdFByb3RvVGVzdFN0cnVjdCgKKyAgICAgICAgICAgIGFfYnl0ZT0xMjcsCisgICAgICAgICAgICBhX2kxNj0zMjAwMCwKKyAgICAgICAgICAgIGFfaTMyPTEwMDAwMDAwMDAsCisgICAgICAgICAgICBhX2k2ND0weGZmZmZmZmZmZmYsCisgICAgICAgICAgICBhX2RvdWJsZT01LjY3ODksCisgICAgICAgICAgICBhX3N0cmluZz0ibXkgc3RyaW5nIiwKKyAgICAgICAgICAgIHRydWVfZmllbGQ9VHJ1ZSwKKyAgICAgICAgICAgIGZhbHNlX2ZpZWxkPUZhbHNlLAorICAgICAgICAgICAgZW1wdHlfc3RydWN0X2ZpZWxkPUVtcHR5KCksCisgICAgICAgICAgICBieXRlX2xpc3Q9Wy0xMjcsIC0xLCAwLCAxLCAxMjddLAorICAgICAgICAgICAgaTE2X2xpc3Q9Wy0xLCAwLCAxLCAweDdmZmZdLAorICAgICAgICAgICAgaTMyX2xpc3Q9Wy0xLCAwLCAweGZmLCAweGZmZmYsIDB4ZmZmZmZmLCAweDdmZmZmZmZmXSwKKyAgICAgICAgICAgIGk2NF9saXN0PVstMSwgMCwgMHhmZiwgMHhmZmZmLCAweGZmZmZmZiwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZmZmLCAweGZmZmZmZmZmZmZmZiwgMHhmZmZmZmZmZmZmZmZmZiwgMHg3ZmZmZmZmZmZmZmZmZmZmXSwKKyAgICAgICAgICAgIGRvdWJsZV9saXN0PVswLjEsIDAuMiwgMC4zXSwKKyAgICAgICAgICAgIHN0cmluZ19saXN0PVsiZmlyc3QiLCAic2Vjb25kIiwgInRoaXJkIl0sCisgICAgICAgICAgICBib29sZWFuX2xpc3Q9W1RydWUsIFRydWUsIFRydWUsIEZhbHNlLCBGYWxzZSwgRmFsc2VdLAorICAgICAgICAgICAgc3RydWN0X2xpc3Q9W0VtcHR5KCksIEVtcHR5KCldLAorICAgICAgICAgICAgYnl0ZV9zZXQ9c2V0KFstMTI3LCAtMSwgMCwgMSwgMTI3XSksCisgICAgICAgICAgICBpMTZfc2V0PXNldChbLTEsIDAsIDEsIDB4N2ZmZl0pLAorICAgICAgICAgICAgaTMyX3NldD1zZXQoWzEsIDIsIDNdKSwKKyAgICAgICAgICAgIGk2NF9zZXQ9c2V0KFstMSwgMCwgMHhmZiwgMHhmZmZmLCAweGZmZmZmZiwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZmZmLCAweGZmZmZmZmZmZmZmZiwgMHhmZmZmZmZmZmZmZmZmZiwgMHg3ZmZmZmZmZmZmZmZmZmZmXSksCisgICAgICAgICAgICBkb3VibGVfc2V0PXNldChbMC4xLCAwLjIsIDAuM10pLAorICAgICAgICAgICAgc3RyaW5nX3NldD1zZXQoWyJmaXJzdCIsICJzZWNvbmQiLCAidGhpcmQiXSksCisgICAgICAgICAgICBib29sZWFuX3NldD1zZXQoW1RydWUsIEZhbHNlXSksCisgICAgICAgICAgICAjIHN0cnVjdF9zZXQ9c2V0KFtFbXB0eSgpXSksICMgdW5oYXNoYWJsZSBpbnN0YW5jZQorICAgICAgICAgICAgYnl0ZV9ieXRlX21hcD17MTogMn0sCisgICAgICAgICAgICBpMTZfYnl0ZV9tYXA9ezE6IDEsIC0xOiAxLCAweDdmZmY6IDF9LAorICAgICAgICAgICAgaTMyX2J5dGVfbWFwPXsxOiAxLCAtMTogMSwgMHg3ZmZmZmZmZjogMX0sCisgICAgICAgICAgICBpNjRfYnl0ZV9tYXA9ezA6IDEsIDE6IDEsIC0xOiAxLCAweDdmZmZmZmZmZmZmZmZmZmY6IDF9LAorICAgICAgICAgICAgZG91YmxlX2J5dGVfbWFwPXstMS4xOiAxLCAxLjE6IDF9LAorICAgICAgICAgICAgc3RyaW5nX2J5dGVfbWFwPXsiZmlyc3QiOiAxLCAic2Vjb25kIjogMiwgInRoaXJkIjogMywgIiI6IDB9LAorICAgICAgICAgICAgYm9vbGVhbl9ieXRlX21hcD17VHJ1ZTogMSwgRmFsc2U6IDB9LAorICAgICAgICAgICAgYnl0ZV9pMTZfbWFwPXsxOiAxLCAyOiAtMSwgMzogMHg3ZmZmfSwKKyAgICAgICAgICAgIGJ5dGVfaTMyX21hcD17MTogMSwgMjogLTEsIDM6IDB4N2ZmZmZmZmZ9LAorICAgICAgICAgICAgYnl0ZV9pNjRfbWFwPXsxOiAxLCAyOiAtMSwgMzogMHg3ZmZmZmZmZmZmZmZmZmZmfSwKKyAgICAgICAgICAgIGJ5dGVfZG91YmxlX21hcD17MTogMC4xLCAyOiAtMC4xLCAzOiAxMDAwMDAwLjF9LAorICAgICAgICAgICAgYnl0ZV9zdHJpbmdfbWFwPXsxOiAiIiwgMjogImJsYWgiLCAzOiAibG9vb29vb29vb29vb29vbmcgc3RyaW5nIn0sCisgICAgICAgICAgICBieXRlX2Jvb2xlYW5fbWFwPXsxOiBUcnVlLCAyOiBGYWxzZX0sCisgICAgICAgICAgICAjIGxpc3RfYnl0ZV9tYXAgIyB1bmhhc2hhYmxlCisgICAgICAgICAgICAjIHNldF9ieXRlX21hcD17c2V0KFsxLCAyLCAzXSkgOiAxLCBzZXQoWzAsIDFdKSA6IDIsIHNldChbXSkgOiAwfSwgIyB1bmhhc2hhYmxlCisgICAgICAgICAgICAjIG1hcF9ieXRlX21hcCAjIHVuaGFzaGFibGUKKyAgICAgICAgICAgIGJ5dGVfbWFwX21hcD17MDoge30sIDE6IHsxOiAxfSwgMjogezE6IDEsIDI6IDJ9fSwKKyAgICAgICAgICAgIGJ5dGVfc2V0X21hcD17MDogc2V0KFtdKSwgMTogc2V0KFsxXSksIDI6IHNldChbMSwgMl0pfSwKKyAgICAgICAgICAgIGJ5dGVfbGlzdF9tYXA9ezA6IFtdLCAxOiBbMV0sIDI6IFsxLCAyXX0sCisgICAgICAgICkKIAotICAgICAgc2VsZi5uZXN0ZWRfbGlzdHNfaTMyeDIgPSBOZXN0ZWRMaXN0c0kzMngyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsgMSwgMSwgMiBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyAyLCA3LCA5IF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIDMsIDUsIDggXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICBzZWxmLm5lc3RlZF9saXN0c19pMzJ4MiA9IE5lc3RlZExpc3RzSTMyeDIoCisgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgWzEsIDEsIDJdLAorICAgICAgICAgICAgICAgIFsyLCA3LCA5XSwKKyAgICAgICAgICAgICAgICBbMywgNSwgOF0KKyAgICAgICAgICAgIF0KKyAgICAgICAgKQogCi0gICAgICBzZWxmLm5lc3RlZF9saXN0c19pMzJ4MyA9IE5lc3RlZExpc3RzSTMyeDMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIDIsIDcsIDkgXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyAzLCA1LCA4IF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsgMSwgMSwgMiBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIDEsIDQsIDkgXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotCi0gICAgICBzZWxmLm5lc3RlZF9taXhlZHgyID0gTmVzdGVkTWl4ZWR4MiggaW50X3NldF9saXN0PVsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0KFsxLDIsM10pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQoWzEsNCw5XSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldChbMSwyLDMsNSw4LDEzLDIxXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldChbLTEsIDAsIDFdKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5vdGUsIHRoZSBzZXRzIGJlbG93IGFyZSBzZXRzIG9mIGNoYXJzLCBzaW5jZSB0aGUgc3RyaW5ncyBhcmUgaXRlcmF0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2ludF9zdHJzZXQ9eyAxMDpzZXQoJ2FiYycpLCAyMDpzZXQoJ2RlZicpLCAzMDpzZXQoJ0dISScpIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9pbnRfc3Ryc2V0X2xpc3Q9WwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDEwOnNldCgnYWJjJyksIDIwOnNldCgnZGVmJyksIDMwOnNldCgnR0hJJykgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAxMDA6c2V0KCdsbW4nKSwgMjAwOnNldCgnb3BxJyksIDMwMDpzZXQoJ1JTVCcpIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMTAwMDpzZXQoJ3V2dycpLCAyMDAwOnNldCgnd3h5JyksIDMwMDA6c2V0KCdYWVonKSB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLQotICAgICAgc2VsZi5uZXN0ZWRfbGlzdHNfYm9uayA9IE5lc3RlZExpc3RzQm9uaygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb25rKG1lc3NhZ2U9J2lubmVyIEEgZmlyc3QnLCB0eXBlPTEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvbmsobWVzc2FnZT0naW5uZXIgQSBzZWNvbmQnLCB0eXBlPTEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9uayhtZXNzYWdlPSdpbm5lciBCIGZpcnN0JywgdHlwZT0yKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9uayhtZXNzYWdlPSdpbm5lciBCIHNlY29uZCcsIHR5cGU9MikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotCi0gICAgICBzZWxmLmxpc3RfYm9ua3MgPSBMaXN0Qm9ua3MoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvbmsobWVzc2FnZT0naW5uZXIgQScsIHR5cGU9MSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvbmsobWVzc2FnZT0naW5uZXIgQicsIHR5cGU9MiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvbmsobWVzc2FnZT0naW5uZXIgQycsIHR5cGU9MCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi0KLSAgZGVmIF9zZXJpYWxpemUoc2VsZiwgb2JqKToKLSAgICB0cmFucyA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCi0gICAgcHJvdCA9IHNlbGYucHJvdG9jb2xfZmFjdG9yeS5nZXRQcm90b2NvbCh0cmFucykKLSAgICBvYmoud3JpdGUocHJvdCkKLSAgICByZXR1cm4gdHJhbnMuZ2V0dmFsdWUoKQotCi0gIGRlZiBfZGVzZXJpYWxpemUoc2VsZiwgb2JqdHlwZSwgZGF0YSk6Ci0gICAgcHJvdCA9IHNlbGYucHJvdG9jb2xfZmFjdG9yeS5nZXRQcm90b2NvbChUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoZGF0YSkpCi0gICAgcmV0ID0gb2JqdHlwZSgpCi0gICAgcmV0LnJlYWQocHJvdCkKLSAgICByZXR1cm4gcmV0Ci0KLSAgZGVmIHRlc3RGb3J3YXJkcyhzZWxmKToKLSAgICBvYmogPSBzZWxmLl9kZXNlcmlhbGl6ZShWZXJzaW9uaW5nVGVzdFYyLCBzZWxmLl9zZXJpYWxpemUoc2VsZi52MW9iaikpCi0gICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLmJlZ2luX2luX2JvdGgsIHNlbGYudjFvYmouYmVnaW5faW5fYm90aCkKLSAgICBzZWxmLmFzc2VydEVxdWFscyhvYmouZW5kX2luX2JvdGgsIHNlbGYudjFvYmouZW5kX2luX2JvdGgpCi0KLSAgZGVmIHRlc3RCYWNrd2FyZHMoc2VsZik6Ci0gICAgb2JqID0gc2VsZi5fZGVzZXJpYWxpemUoVmVyc2lvbmluZ1Rlc3RWMSwgc2VsZi5fc2VyaWFsaXplKHNlbGYudjJvYmopKQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iai5iZWdpbl9pbl9ib3RoLCBzZWxmLnYyb2JqLmJlZ2luX2luX2JvdGgpCi0gICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLmVuZF9pbl9ib3RoLCBzZWxmLnYyb2JqLmVuZF9pbl9ib3RoKQotCi0gIGRlZiB0ZXN0U2VyaWFsaXplVjEoc2VsZik6Ci0gICAgb2JqID0gc2VsZi5fZGVzZXJpYWxpemUoVmVyc2lvbmluZ1Rlc3RWMSwgc2VsZi5fc2VyaWFsaXplKHNlbGYudjFvYmopKQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi52MW9iaikKLQotICBkZWYgdGVzdFNlcmlhbGl6ZVYyKHNlbGYpOgotICAgIG9iaiA9IHNlbGYuX2Rlc2VyaWFsaXplKFZlcnNpb25pbmdUZXN0VjIsIHNlbGYuX3NlcmlhbGl6ZShzZWxmLnYyb2JqKSkKLSAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIHNlbGYudjJvYmopCi0KLSAgZGVmIHRlc3RCb29scyhzZWxmKToKLSAgICBzZWxmLmFzc2VydE5vdEVxdWFscyhzZWxmLmJvb2xzLCBzZWxmLmJvb2xzX2ZsaXBwZWQpCi0gICAgc2VsZi5hc3NlcnROb3RFcXVhbHMoc2VsZi5ib29scywgc2VsZi52MW9iaikKLSAgICBvYmogPSBzZWxmLl9kZXNlcmlhbGl6ZShCb29scywgc2VsZi5fc2VyaWFsaXplKHNlbGYuYm9vbHMpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi5ib29scykKLSAgICBvYmogPSBzZWxmLl9kZXNlcmlhbGl6ZShCb29scywgc2VsZi5fc2VyaWFsaXplKHNlbGYuYm9vbHNfZmxpcHBlZCkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLCBzZWxmLmJvb2xzX2ZsaXBwZWQpCi0gICAgcmVwID0gcmVwcihzZWxmLmJvb2xzKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4ocmVwKSA+IDApCi0KLSAgZGVmIHRlc3RMYXJnZURlbHRhcyhzZWxmKToKLSAgICAjIHRlc3QgbGFyZ2UgZmllbGQgZGVsdGFzIChtZWFuaW5nZnVsIGluIENvbXBhY3RQcm90byBvbmx5KQotICAgIG9iaiA9IHNlbGYuX2Rlc2VyaWFsaXplKExhcmdlRGVsdGFzLCBzZWxmLl9zZXJpYWxpemUoc2VsZi5sYXJnZV9kZWx0YXMpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi5sYXJnZV9kZWx0YXMpCi0gICAgcmVwID0gcmVwcihzZWxmLmxhcmdlX2RlbHRhcykKLSAgICBzZWxmLmFzc2VydFRydWUobGVuKHJlcCkgPiAwKQotCi0gIGRlZiB0ZXN0TmVzdGVkTGlzdHNJMzJ4MihzZWxmKToKLSAgICBvYmogPSBzZWxmLl9kZXNlcmlhbGl6ZShOZXN0ZWRMaXN0c0kzMngyLCBzZWxmLl9zZXJpYWxpemUoc2VsZi5uZXN0ZWRfbGlzdHNfaTMyeDIpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi5uZXN0ZWRfbGlzdHNfaTMyeDIpCi0gICAgcmVwID0gcmVwcihzZWxmLm5lc3RlZF9saXN0c19pMzJ4MikKLSAgICBzZWxmLmFzc2VydFRydWUobGVuKHJlcCkgPiAwKQotCi0gIGRlZiB0ZXN0TmVzdGVkTGlzdHNJMzJ4MyhzZWxmKToKLSAgICBvYmogPSBzZWxmLl9kZXNlcmlhbGl6ZShOZXN0ZWRMaXN0c0kzMngzLCBzZWxmLl9zZXJpYWxpemUoc2VsZi5uZXN0ZWRfbGlzdHNfaTMyeDMpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi5uZXN0ZWRfbGlzdHNfaTMyeDMpCi0gICAgcmVwID0gcmVwcihzZWxmLm5lc3RlZF9saXN0c19pMzJ4MykKLSAgICBzZWxmLmFzc2VydFRydWUobGVuKHJlcCkgPiAwKQotCi0gIGRlZiB0ZXN0TmVzdGVkTWl4ZWR4MihzZWxmKToKLSAgICBvYmogPSBzZWxmLl9kZXNlcmlhbGl6ZShOZXN0ZWRNaXhlZHgyLCBzZWxmLl9zZXJpYWxpemUoc2VsZi5uZXN0ZWRfbWl4ZWR4MikpCi0gICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLCBzZWxmLm5lc3RlZF9taXhlZHgyKQotICAgIHJlcCA9IHJlcHIoc2VsZi5uZXN0ZWRfbWl4ZWR4MikKLSAgICBzZWxmLmFzc2VydFRydWUobGVuKHJlcCkgPiAwKQotCi0gIGRlZiB0ZXN0TmVzdGVkTGlzdHNCb25rKHNlbGYpOgotICAgIG9iaiA9IHNlbGYuX2Rlc2VyaWFsaXplKE5lc3RlZExpc3RzQm9uaywgc2VsZi5fc2VyaWFsaXplKHNlbGYubmVzdGVkX2xpc3RzX2JvbmspKQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi5uZXN0ZWRfbGlzdHNfYm9uaykKLSAgICByZXAgPSByZXByKHNlbGYubmVzdGVkX2xpc3RzX2JvbmspCi0gICAgc2VsZi5hc3NlcnRUcnVlKGxlbihyZXApID4gMCkKLQotICBkZWYgdGVzdExpc3RCb25rcyhzZWxmKToKLSAgICBvYmogPSBzZWxmLl9kZXNlcmlhbGl6ZShMaXN0Qm9ua3MsIHNlbGYuX3NlcmlhbGl6ZShzZWxmLmxpc3RfYm9ua3MpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi5saXN0X2JvbmtzKQotICAgIHJlcCA9IHJlcHIoc2VsZi5saXN0X2JvbmtzKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4ocmVwKSA+IDApCi0KLSAgZGVmIHRlc3RDb21wYWN0U3RydWN0KHNlbGYpOgotICAgICMgdGVzdCBsYXJnZSBmaWVsZCBkZWx0YXMgKG1lYW5pbmdmdWwgaW4gQ29tcGFjdFByb3RvIG9ubHkpCi0gICAgb2JqID0gc2VsZi5fZGVzZXJpYWxpemUoQ29tcGFjdFByb3RvVGVzdFN0cnVjdCwgc2VsZi5fc2VyaWFsaXplKHNlbGYuY29tcGFjdF9zdHJ1Y3QpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi5jb21wYWN0X3N0cnVjdCkKLSAgICByZXAgPSByZXByKHNlbGYuY29tcGFjdF9zdHJ1Y3QpCi0gICAgc2VsZi5hc3NlcnRUcnVlKGxlbihyZXApID4gMCkKLQotICBkZWYgdGVzdEludGVnZXJMaW1pdHMoc2VsZik6Ci0gICAgYmFkX3ZhbHVlcyA9IFtDb21wYWN0UHJvdG9UZXN0U3RydWN0KGFfYnl0ZT0xMjgpLCBDb21wYWN0UHJvdG9UZXN0U3RydWN0KGFfYnl0ZT0tMTI5KSwKLSAgICAgICAgICAgICAgICAgIENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QoYV9pMTY9MzI3NjgpLCBDb21wYWN0UHJvdG9UZXN0U3RydWN0KGFfaTE2PS0zMjc2OSksCi0gICAgICAgICAgICAgICAgICBDb21wYWN0UHJvdG9UZXN0U3RydWN0KGFfaTMyPTIxNDc0ODM2NDgpLCBDb21wYWN0UHJvdG9UZXN0U3RydWN0KGFfaTMyPS0yMTQ3NDgzNjQ5KSwKLSAgICAgICAgICAgICAgICAgIENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QoYV9pNjQ9OTIyMzM3MjAzNjg1NDc3NTgwOCksIENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QoYV9pNjQ9LTkyMjMzNzIwMzY4NTQ3NzU4MDkpCisgICAgICAgIHNlbGYubmVzdGVkX2xpc3RzX2kzMngzID0gTmVzdGVkTGlzdHNJMzJ4MygKKyAgICAgICAgICAgIFsKKyAgICAgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgICAgIFsyLCA3LCA5XSwKKyAgICAgICAgICAgICAgICAgICAgWzMsIDUsIDhdCisgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgICAgIFsxLCAxLCAyXSwKKyAgICAgICAgICAgICAgICAgICAgWzEsIDQsIDldCiAgICAgICAgICAgICAgICAgXQorICAgICAgICAgICAgXQorICAgICAgICApCiAKLSAgICBmb3IgdmFsdWUgaW4gYmFkX3ZhbHVlczoKLSAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEV4Y2VwdGlvbiwgc2VsZi5fc2VyaWFsaXplLCB2YWx1ZSkKKyAgICAgICAgc2VsZi5uZXN0ZWRfbWl4ZWR4MiA9IE5lc3RlZE1peGVkeDIoaW50X3NldF9saXN0PVsKKyAgICAgICAgICAgIHNldChbMSwgMiwgM10pLAorICAgICAgICAgICAgc2V0KFsxLCA0LCA5XSksCisgICAgICAgICAgICBzZXQoWzEsIDIsIDMsIDUsIDgsIDEzLCAyMV0pLAorICAgICAgICAgICAgc2V0KFstMSwgMCwgMV0pCisgICAgICAgIF0sCisgICAgICAgICAgICAjIG5vdGUsIHRoZSBzZXRzIGJlbG93IGFyZSBzZXRzIG9mIGNoYXJzLCBzaW5jZSB0aGUgc3RyaW5ncyBhcmUgaXRlcmF0ZWQKKyAgICAgICAgICAgIG1hcF9pbnRfc3Ryc2V0PXsxMDogc2V0KCdhYmMnKSwgMjA6IHNldCgnZGVmJyksIDMwOiBzZXQoJ0dISScpfSwKKyAgICAgICAgICAgIG1hcF9pbnRfc3Ryc2V0X2xpc3Q9WworICAgICAgICAgICAgICAgIHsxMDogc2V0KCdhYmMnKSwgMjA6IHNldCgnZGVmJyksIDMwOiBzZXQoJ0dISScpfSwKKyAgICAgICAgICAgICAgICB7MTAwOiBzZXQoJ2xtbicpLCAyMDA6IHNldCgnb3BxJyksIDMwMDogc2V0KCdSU1QnKX0sCisgICAgICAgICAgICAgICAgezEwMDA6IHNldCgndXZ3JyksIDIwMDA6IHNldCgnd3h5JyksIDMwMDA6IHNldCgnWFlaJyl9XQorICAgICAgICApCisKKyAgICAgICAgc2VsZi5uZXN0ZWRfbGlzdHNfYm9uayA9IE5lc3RlZExpc3RzQm9uaygKKyAgICAgICAgICAgIFsKKyAgICAgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgICAgIFsKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvbmsobWVzc2FnZT0naW5uZXIgQSBmaXJzdCcsIHR5cGU9MSksCisgICAgICAgICAgICAgICAgICAgICAgICBCb25rKG1lc3NhZ2U9J2lubmVyIEEgc2Vjb25kJywgdHlwZT0xKQorICAgICAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgICAgICAgICBCb25rKG1lc3NhZ2U9J2lubmVyIEIgZmlyc3QnLCB0eXBlPTIpLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9uayhtZXNzYWdlPSdpbm5lciBCIHNlY29uZCcsIHR5cGU9MikKKyAgICAgICAgICAgICAgICAgICAgXQorICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgIF0KKyAgICAgICAgKQorCisgICAgICAgIHNlbGYubGlzdF9ib25rcyA9IExpc3RCb25rcygKKyAgICAgICAgICAgIFsKKyAgICAgICAgICAgICAgICBCb25rKG1lc3NhZ2U9J2lubmVyIEEnLCB0eXBlPTEpLAorICAgICAgICAgICAgICAgIEJvbmsobWVzc2FnZT0naW5uZXIgQicsIHR5cGU9MiksCisgICAgICAgICAgICAgICAgQm9uayhtZXNzYWdlPSdpbm5lciBDJywgdHlwZT0wKQorICAgICAgICAgICAgXQorICAgICAgICApCisKKyAgICBkZWYgX3NlcmlhbGl6ZShzZWxmLCBvYmopOgorICAgICAgICB0cmFucyA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCisgICAgICAgIHByb3QgPSBzZWxmLnByb3RvY29sX2ZhY3RvcnkuZ2V0UHJvdG9jb2wodHJhbnMpCisgICAgICAgIG9iai53cml0ZShwcm90KQorICAgICAgICByZXR1cm4gdHJhbnMuZ2V0dmFsdWUoKQorCisgICAgZGVmIF9kZXNlcmlhbGl6ZShzZWxmLCBvYmp0eXBlLCBkYXRhKToKKyAgICAgICAgcHJvdCA9IHNlbGYucHJvdG9jb2xfZmFjdG9yeS5nZXRQcm90b2NvbChUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoZGF0YSkpCisgICAgICAgIHJldCA9IG9ianR5cGUoKQorICAgICAgICByZXQucmVhZChwcm90KQorICAgICAgICByZXR1cm4gcmV0CisKKyAgICBkZWYgdGVzdEZvcndhcmRzKHNlbGYpOgorICAgICAgICBvYmogPSBzZWxmLl9kZXNlcmlhbGl6ZShWZXJzaW9uaW5nVGVzdFYyLCBzZWxmLl9zZXJpYWxpemUoc2VsZi52MW9iaikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iai5iZWdpbl9pbl9ib3RoLCBzZWxmLnYxb2JqLmJlZ2luX2luX2JvdGgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iai5lbmRfaW5fYm90aCwgc2VsZi52MW9iai5lbmRfaW5fYm90aCkKKworICAgIGRlZiB0ZXN0QmFja3dhcmRzKHNlbGYpOgorICAgICAgICBvYmogPSBzZWxmLl9kZXNlcmlhbGl6ZShWZXJzaW9uaW5nVGVzdFYxLCBzZWxmLl9zZXJpYWxpemUoc2VsZi52Mm9iaikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iai5iZWdpbl9pbl9ib3RoLCBzZWxmLnYyb2JqLmJlZ2luX2luX2JvdGgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iai5lbmRfaW5fYm90aCwgc2VsZi52Mm9iai5lbmRfaW5fYm90aCkKKworICAgIGRlZiB0ZXN0U2VyaWFsaXplVjEoc2VsZik6CisgICAgICAgIG9iaiA9IHNlbGYuX2Rlc2VyaWFsaXplKFZlcnNpb25pbmdUZXN0VjEsIHNlbGYuX3NlcmlhbGl6ZShzZWxmLnYxb2JqKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLCBzZWxmLnYxb2JqKQorCisgICAgZGVmIHRlc3RTZXJpYWxpemVWMihzZWxmKToKKyAgICAgICAgb2JqID0gc2VsZi5fZGVzZXJpYWxpemUoVmVyc2lvbmluZ1Rlc3RWMiwgc2VsZi5fc2VyaWFsaXplKHNlbGYudjJvYmopKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIHNlbGYudjJvYmopCisKKyAgICBkZWYgdGVzdEJvb2xzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFscyhzZWxmLmJvb2xzLCBzZWxmLmJvb2xzX2ZsaXBwZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWxzKHNlbGYuYm9vbHMsIHNlbGYudjFvYmopCisgICAgICAgIG9iaiA9IHNlbGYuX2Rlc2VyaWFsaXplKEJvb2xzLCBzZWxmLl9zZXJpYWxpemUoc2VsZi5ib29scykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi5ib29scykKKyAgICAgICAgb2JqID0gc2VsZi5fZGVzZXJpYWxpemUoQm9vbHMsIHNlbGYuX3NlcmlhbGl6ZShzZWxmLmJvb2xzX2ZsaXBwZWQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIHNlbGYuYm9vbHNfZmxpcHBlZCkKKyAgICAgICAgcmVwID0gcmVwcihzZWxmLmJvb2xzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHJlcCkgPiAwKQorCisgICAgZGVmIHRlc3RMYXJnZURlbHRhcyhzZWxmKToKKyAgICAgICAgIyB0ZXN0IGxhcmdlIGZpZWxkIGRlbHRhcyAobWVhbmluZ2Z1bCBpbiBDb21wYWN0UHJvdG8gb25seSkKKyAgICAgICAgb2JqID0gc2VsZi5fZGVzZXJpYWxpemUoTGFyZ2VEZWx0YXMsIHNlbGYuX3NlcmlhbGl6ZShzZWxmLmxhcmdlX2RlbHRhcykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi5sYXJnZV9kZWx0YXMpCisgICAgICAgIHJlcCA9IHJlcHIoc2VsZi5sYXJnZV9kZWx0YXMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4ocmVwKSA+IDApCisKKyAgICBkZWYgdGVzdE5lc3RlZExpc3RzSTMyeDIoc2VsZik6CisgICAgICAgIG9iaiA9IHNlbGYuX2Rlc2VyaWFsaXplKE5lc3RlZExpc3RzSTMyeDIsIHNlbGYuX3NlcmlhbGl6ZShzZWxmLm5lc3RlZF9saXN0c19pMzJ4MikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi5uZXN0ZWRfbGlzdHNfaTMyeDIpCisgICAgICAgIHJlcCA9IHJlcHIoc2VsZi5uZXN0ZWRfbGlzdHNfaTMyeDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4ocmVwKSA+IDApCisKKyAgICBkZWYgdGVzdE5lc3RlZExpc3RzSTMyeDMoc2VsZik6CisgICAgICAgIG9iaiA9IHNlbGYuX2Rlc2VyaWFsaXplKE5lc3RlZExpc3RzSTMyeDMsIHNlbGYuX3NlcmlhbGl6ZShzZWxmLm5lc3RlZF9saXN0c19pMzJ4MykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi5uZXN0ZWRfbGlzdHNfaTMyeDMpCisgICAgICAgIHJlcCA9IHJlcHIoc2VsZi5uZXN0ZWRfbGlzdHNfaTMyeDMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4ocmVwKSA+IDApCisKKyAgICBkZWYgdGVzdE5lc3RlZE1peGVkeDIoc2VsZik6CisgICAgICAgIG9iaiA9IHNlbGYuX2Rlc2VyaWFsaXplKE5lc3RlZE1peGVkeDIsIHNlbGYuX3NlcmlhbGl6ZShzZWxmLm5lc3RlZF9taXhlZHgyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLCBzZWxmLm5lc3RlZF9taXhlZHgyKQorICAgICAgICByZXAgPSByZXByKHNlbGYubmVzdGVkX21peGVkeDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4ocmVwKSA+IDApCisKKyAgICBkZWYgdGVzdE5lc3RlZExpc3RzQm9uayhzZWxmKToKKyAgICAgICAgb2JqID0gc2VsZi5fZGVzZXJpYWxpemUoTmVzdGVkTGlzdHNCb25rLCBzZWxmLl9zZXJpYWxpemUoc2VsZi5uZXN0ZWRfbGlzdHNfYm9uaykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi5uZXN0ZWRfbGlzdHNfYm9uaykKKyAgICAgICAgcmVwID0gcmVwcihzZWxmLm5lc3RlZF9saXN0c19ib25rKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHJlcCkgPiAwKQorCisgICAgZGVmIHRlc3RMaXN0Qm9ua3Moc2VsZik6CisgICAgICAgIG9iaiA9IHNlbGYuX2Rlc2VyaWFsaXplKExpc3RCb25rcywgc2VsZi5fc2VyaWFsaXplKHNlbGYubGlzdF9ib25rcykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi5saXN0X2JvbmtzKQorICAgICAgICByZXAgPSByZXByKHNlbGYubGlzdF9ib25rcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihyZXApID4gMCkKKworICAgIGRlZiB0ZXN0Q29tcGFjdFN0cnVjdChzZWxmKToKKyAgICAgICAgIyB0ZXN0IGxhcmdlIGZpZWxkIGRlbHRhcyAobWVhbmluZ2Z1bCBpbiBDb21wYWN0UHJvdG8gb25seSkKKyAgICAgICAgb2JqID0gc2VsZi5fZGVzZXJpYWxpemUoQ29tcGFjdFByb3RvVGVzdFN0cnVjdCwgc2VsZi5fc2VyaWFsaXplKHNlbGYuY29tcGFjdF9zdHJ1Y3QpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIHNlbGYuY29tcGFjdF9zdHJ1Y3QpCisgICAgICAgIHJlcCA9IHJlcHIoc2VsZi5jb21wYWN0X3N0cnVjdCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihyZXApID4gMCkKKworICAgIGRlZiB0ZXN0SW50ZWdlckxpbWl0cyhzZWxmKToKKyAgICAgICAgaWYgKHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMiBhbmQgc3lzLnZlcnNpb25faW5mb1sxXSA8PSA2KToKKyAgICAgICAgICAgIHByaW50KCdTa2lwcGluZyB0ZXN0SW50ZWdlckxpbWl0cyBmb3IgUHl0aG9uIDIuNicpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgYmFkX3ZhbHVlcyA9IFtDb21wYWN0UHJvdG9UZXN0U3RydWN0KGFfYnl0ZT0xMjgpLCBDb21wYWN0UHJvdG9UZXN0U3RydWN0KGFfYnl0ZT0tMTI5KSwKKyAgICAgICAgICAgICAgICAgICAgICBDb21wYWN0UHJvdG9UZXN0U3RydWN0KGFfaTE2PTMyNzY4KSwgQ29tcGFjdFByb3RvVGVzdFN0cnVjdChhX2kxNj0tMzI3NjkpLAorICAgICAgICAgICAgICAgICAgICAgIENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QoYV9pMzI9MjE0NzQ4MzY0OCksIENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QoYV9pMzI9LTIxNDc0ODM2NDkpLAorICAgICAgICAgICAgICAgICAgICAgIENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QoYV9pNjQ9OTIyMzM3MjAzNjg1NDc3NTgwOCksIENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QoYV9pNjQ9LTkyMjMzNzIwMzY4NTQ3NzU4MDkpCisgICAgICAgICAgICAgICAgICAgICAgXQorCisgICAgICAgIGZvciB2YWx1ZSBpbiBiYWRfdmFsdWVzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRXhjZXB0aW9uLCBzZWxmLl9zZXJpYWxpemUsIHZhbHVlKQorCisgICAgZGVmIHRlc3RSZWNUcmVlKHNlbGYpOgorICAgICAgICAiIiJFbnN1cmUgcmVjdXJzaXZlIHRyZWUgbm9kZSBjYW4gYmUgY3JlYXRlZC4iIiIKKyAgICAgICAgY2hpbGRyZW4gPSBbXQorICAgICAgICBmb3IgaWR4IGluIHJhbmdlKDEsIDUpOgorICAgICAgICAgICAgbm9kZSA9IFJlY1RyZWUoaXRlbT1pZHgsIGNoaWxkcmVuPU5vbmUpCisgICAgICAgICAgICBjaGlsZHJlbi5hcHBlbmQobm9kZSkKKworICAgICAgICBwYXJlbnQgPSBSZWNUcmVlKGl0ZW09MCwgY2hpbGRyZW49Y2hpbGRyZW4pCisgICAgICAgIHNlcmRlX3BhcmVudCA9IHNlbGYuX2Rlc2VyaWFsaXplKFJlY1RyZWUsIHNlbGYuX3NlcmlhbGl6ZShwYXJlbnQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygwLCBzZXJkZV9wYXJlbnQuaXRlbSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoNCwgbGVuKHNlcmRlX3BhcmVudC5jaGlsZHJlbikpCisgICAgICAgIGZvciBjaGlsZCBpbiBzZXJkZV9wYXJlbnQuY2hpbGRyZW46CisgICAgICAgICAgICAjIENhbm5vdCB1c2UgYXNzZXJ0SXNJbnN0YW5jZSBpbiBweXRob24gMi42PworICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoY2hpbGQsIFJlY1RyZWUpKQorCisgICAgZGVmIF9idWlsZExpbmtlZExpc3Qoc2VsZik6CisgICAgICAgIGhlYWQgPSBjdXIgPSBSZWNMaXN0KGl0ZW09MCkKKyAgICAgICAgZm9yIGlkeCBpbiByYW5nZSgxLCA1KToKKyAgICAgICAgICAgIG5vZGUgPSBSZWNMaXN0KGl0ZW09aWR4KQorICAgICAgICAgICAgY3VyLm5leHRpdGVtID0gbm9kZQorICAgICAgICAgICAgY3VyID0gbm9kZQorICAgICAgICByZXR1cm4gaGVhZAorCisgICAgZGVmIF9jb2xsYXBzZUxpbmtlZExpc3Qoc2VsZiwgaGVhZCk6CisgICAgICAgIG91dF9saXN0ID0gW10KKyAgICAgICAgY3VyID0gaGVhZAorICAgICAgICB3aGlsZSBjdXIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBvdXRfbGlzdC5hcHBlbmQoY3VyLml0ZW0pCisgICAgICAgICAgICBjdXIgPSBjdXIubmV4dGl0ZW0KKyAgICAgICAgcmV0dXJuIG91dF9saXN0CisKKyAgICBkZWYgdGVzdFJlY0xpc3Qoc2VsZik6CisgICAgICAgICIiIkVuc3VyZSByZWN1cnNpdmUgbGlua2VkIGxpc3QgY2FuIGJlIGNyZWF0ZWQuIiIiCisgICAgICAgIHJlY19saXN0ID0gc2VsZi5fYnVpbGRMaW5rZWRMaXN0KCkKKyAgICAgICAgc2VyZGVfbGlzdCA9IHNlbGYuX2Rlc2VyaWFsaXplKFJlY0xpc3QsIHNlbGYuX3NlcmlhbGl6ZShyZWNfbGlzdCkpCisgICAgICAgIG91dF9saXN0ID0gc2VsZi5fY29sbGFwc2VMaW5rZWRMaXN0KHNlcmRlX2xpc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKFswLCAxLCAyLCAzLCA0XSwgb3V0X2xpc3QpCisKKyAgICBkZWYgdGVzdENvUmVjKHNlbGYpOgorICAgICAgICAiIiJFbnN1cmUgY28tcmVjdXJzaXZlIHN0cnVjdHVyZXMgY2FuIGJlIGNyZWF0ZWQuIiIiCisgICAgICAgIGl0ZW0xID0gQ29SZWMoKQorICAgICAgICBpdGVtMiA9IENvUmVjMigpCisKKyAgICAgICAgaXRlbTEub3RoZXIgPSBpdGVtMgorICAgICAgICBpdGVtMi5vdGhlciA9IGl0ZW0xCisKKyAgICAgICAgIyBOT1RFIFtlY29ubmVyNzI0LDIwMTctMDYtMjFdOiBUaGVzZSBvYmplY3RzIGNhbm5vdCBiZSBzZXJpYWxpemVkIGFzIHNlcmlhbGl6YXRpb24KKyAgICAgICAgIyByZXN1bHRzIGluIGFuIGluZmluaXRlIGxvb3AuIGZidGhyaWZ0IGFsc28gc3VmZmVycyBmcm9tIHRoaXMKKyAgICAgICAgIyBwcm9ibGVtLgorCisgICAgZGVmIHRlc3RSZWNWZWN0b3Ioc2VsZik6CisgICAgICAgICIiIkVuc3VyZSBhIGxpc3Qgb2YgcmVjdXJzaXZlIG5vZGVzIGNhbiBiZSBjcmVhdGVkLiIiIgorICAgICAgICBteWxpc3QgPSBbc2VsZi5fYnVpbGRMaW5rZWRMaXN0KCksIHNlbGYuX2J1aWxkTGlua2VkTGlzdCgpXQorICAgICAgICBteXZlYyA9IFZlY3RvclRlc3QobGlzdGVyPW15bGlzdCkKKworICAgICAgICBzZXJkZV92ZWMgPSBzZWxmLl9kZXNlcmlhbGl6ZShWZWN0b3JUZXN0LCBzZWxmLl9zZXJpYWxpemUobXl2ZWMpKQorICAgICAgICBnb2xkZW5fbGlzdCA9IFswLCAxLCAyLCAzLCA0XQorICAgICAgICBmb3IgY3VyX2xpc3QgaW4gc2VyZGVfdmVjLmxpc3RlcjoKKyAgICAgICAgICAgIG91dF9saXN0ID0gc2VsZi5fY29sbGFwc2VMaW5rZWRMaXN0KGN1cl9saXN0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnb2xkZW5fbGlzdCwgb3V0X2xpc3QpCisKIAogY2xhc3MgTm9ybWFsQmluYXJ5VGVzdChBYnN0cmFjdFRlc3QpOgotICBwcm90b2NvbF9mYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKQorICAgIHByb3RvY29sX2ZhY3RvcnkgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpCisKIAogY2xhc3MgQWNjZWxlcmF0ZWRCaW5hcnlUZXN0KEFic3RyYWN0VGVzdCk6Ci0gIHByb3RvY29sX2ZhY3RvcnkgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KCkKKyAgICBwcm90b2NvbF9mYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeShmYWxsYmFjaz1GYWxzZSkKKwogCiBjbGFzcyBDb21wYWN0UHJvdG9jb2xUZXN0KEFic3RyYWN0VGVzdCk6Ci0gIHByb3RvY29sX2ZhY3RvcnkgPSBUQ29tcGFjdFByb3RvY29sLlRDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCkKKyAgICBwcm90b2NvbF9mYWN0b3J5ID0gVENvbXBhY3RQcm90b2NvbC5UQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpCisKKworY2xhc3MgQWNjZWxlcmF0ZWRDb21wYWN0VGVzdChBYnN0cmFjdFRlc3QpOgorICAgIHByb3RvY29sX2ZhY3RvcnkgPSBUQ29tcGFjdFByb3RvY29sLlRDb21wYWN0UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkoZmFsbGJhY2s9RmFsc2UpCisKIAogY2xhc3MgSlNPTlByb3RvY29sVGVzdChBYnN0cmFjdFRlc3QpOgotICBwcm90b2NvbF9mYWN0b3J5ID0gVEpTT05Qcm90b2NvbC5USlNPTlByb3RvY29sRmFjdG9yeSgpCisgICAgcHJvdG9jb2xfZmFjdG9yeSA9IFRKU09OUHJvdG9jb2wuVEpTT05Qcm90b2NvbEZhY3RvcnkoKQorCiAKIGNsYXNzIEFjY2VsZXJhdGVkRnJhbWVkVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gIGRlZiB0ZXN0U3BsaXQoc2VsZik6Ci0gICAgIiIiVGVzdCBGcmFtZWRUcmFuc3BvcnQgYW5kIEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQKKyAgICBkZWYgdGVzdFNwbGl0KHNlbGYpOgorICAgICAgICAiIiJUZXN0IEZyYW1lZFRyYW5zcG9ydCBhbmQgQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZAogCi0gICAgVGVzdHMgdGhhdCBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBhbmQgVEZyYW1lZFRyYW5zcG9ydAotICAgIHBsYXkgbmljZWx5IHRvZ2V0aGVyIHdoZW4gYSByZWFkIHNwYW5zIGEgZnJhbWUiIiIKKyAgICAgICAgVGVzdHMgdGhhdCBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBhbmQgVEZyYW1lZFRyYW5zcG9ydAorICAgICAgICBwbGF5IG5pY2VseSB0b2dldGhlciB3aGVuIGEgcmVhZCBzcGFucyBhIGZyYW1lIiIiCiAKLSAgICBwcm90b2NvbF9mYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeSgpCi0gICAgYmlnc3RyaW5nID0gIiIuam9pbihjaHIoYnl0ZSkgZm9yIGJ5dGUgaW4gcmFuZ2Uob3JkKCJhIiksIG9yZCgieiIpKzEpKQorICAgICAgICBwcm90b2NvbF9mYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeSgpCisgICAgICAgIGJpZ3N0cmluZyA9ICIiLmpvaW4oY2hyKGJ5dGUpIGZvciBieXRlIGluIHJhbmdlKG9yZCgiYSIpLCBvcmQoInoiKSArIDEpKQogCi0gICAgZGF0YWJ1ZiA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCi0gICAgcHJvdCA9IHByb3RvY29sX2ZhY3RvcnkuZ2V0UHJvdG9jb2woZGF0YWJ1ZikKLSAgICBwcm90LndyaXRlSTMyKDQyKQotICAgIHByb3Qud3JpdGVTdHJpbmcoYmlnc3RyaW5nKQotICAgIHByb3Qud3JpdGVJMTYoMjQpCi0gICAgZGF0YSA9IGRhdGFidWYuZ2V0dmFsdWUoKQotICAgIGN1dHBvaW50ID0gbGVuKGRhdGEpLzIKLSAgICBwYXJ0cyA9IFsgZGF0YVs6Y3V0cG9pbnRdLCBkYXRhW2N1dHBvaW50Ol0gXQorICAgICAgICBkYXRhYnVmID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkKKyAgICAgICAgcHJvdCA9IHByb3RvY29sX2ZhY3RvcnkuZ2V0UHJvdG9jb2woZGF0YWJ1ZikKKyAgICAgICAgcHJvdC53cml0ZUkzMig0MikKKyAgICAgICAgcHJvdC53cml0ZVN0cmluZyhiaWdzdHJpbmcpCisgICAgICAgIHByb3Qud3JpdGVJMTYoMjQpCisgICAgICAgIGRhdGEgPSBkYXRhYnVmLmdldHZhbHVlKCkKKyAgICAgICAgY3V0cG9pbnQgPSBsZW4oZGF0YSkgLy8gMgorICAgICAgICBwYXJ0cyA9IFtkYXRhWzpjdXRwb2ludF0sIGRhdGFbY3V0cG9pbnQ6XV0KIAotICAgIGZyYW1lZF9idWZmZXIgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQotICAgIGZyYW1lZF93cml0ZXIgPSBUVHJhbnNwb3J0LlRGcmFtZWRUcmFuc3BvcnQoZnJhbWVkX2J1ZmZlcikKLSAgICBmb3IgcGFydCBpbiBwYXJ0czoKLSAgICAgIGZyYW1lZF93cml0ZXIud3JpdGUocGFydCkKLSAgICAgIGZyYW1lZF93cml0ZXIuZmx1c2goKQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihmcmFtZWRfYnVmZmVyLmdldHZhbHVlKCkpLCBsZW4oZGF0YSkgKyA4KQorICAgICAgICBmcmFtZWRfYnVmZmVyID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkKKyAgICAgICAgZnJhbWVkX3dyaXRlciA9IFRUcmFuc3BvcnQuVEZyYW1lZFRyYW5zcG9ydChmcmFtZWRfYnVmZmVyKQorICAgICAgICBmb3IgcGFydCBpbiBwYXJ0czoKKyAgICAgICAgICAgIGZyYW1lZF93cml0ZXIud3JpdGUocGFydCkKKyAgICAgICAgICAgIGZyYW1lZF93cml0ZXIuZmx1c2goKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oZnJhbWVkX2J1ZmZlci5nZXR2YWx1ZSgpKSwgbGVuKGRhdGEpICsgOCkKIAotICAgICMgUmVjcmVhdGUgZnJhbWVkX2J1ZmZlciBzbyB3ZSBjYW4gcmVhZCBmcm9tIGl0LgotICAgIGZyYW1lZF9idWZmZXIgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoZnJhbWVkX2J1ZmZlci5nZXR2YWx1ZSgpKQotICAgIGZyYW1lZF9yZWFkZXIgPSBUVHJhbnNwb3J0LlRGcmFtZWRUcmFuc3BvcnQoZnJhbWVkX2J1ZmZlcikKLSAgICBwcm90ID0gcHJvdG9jb2xfZmFjdG9yeS5nZXRQcm90b2NvbChmcmFtZWRfcmVhZGVyKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvdC5yZWFkSTMyKCksIDQyKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvdC5yZWFkU3RyaW5nKCksIGJpZ3N0cmluZykKLSAgICBzZWxmLmFzc2VydEVxdWFsKHByb3QucmVhZEkxNigpLCAyNCkKKyAgICAgICAgIyBSZWNyZWF0ZSBmcmFtZWRfYnVmZmVyIHNvIHdlIGNhbiByZWFkIGZyb20gaXQuCisgICAgICAgIGZyYW1lZF9idWZmZXIgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoZnJhbWVkX2J1ZmZlci5nZXR2YWx1ZSgpKQorICAgICAgICBmcmFtZWRfcmVhZGVyID0gVFRyYW5zcG9ydC5URnJhbWVkVHJhbnNwb3J0KGZyYW1lZF9idWZmZXIpCisgICAgICAgIHByb3QgPSBwcm90b2NvbF9mYWN0b3J5LmdldFByb3RvY29sKGZyYW1lZF9yZWFkZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvdC5yZWFkSTMyKCksIDQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHByb3QucmVhZFN0cmluZygpLCBiaWdzdHJpbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvdC5yZWFkSTE2KCksIDI0KQorCiAKIGNsYXNzIFNlcmlhbGl6ZXJzVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKLSAgZGVmIHRlc3RTZXJpYWxpemVUaGVuRGVzZXJpYWxpemUoc2VsZik6Ci0gICAgb2JqID0gWHRydWN0MihpMzJfdGhpbmc9MSwKLSAgICAgICAgICAgICAgICAgIHN0cnVjdF90aGluZz1YdHJ1Y3Qoc3RyaW5nX3RoaW5nPSJmb28iKSkKKyAgICBkZWYgdGVzdFNlcmlhbGl6ZVRoZW5EZXNlcmlhbGl6ZShzZWxmKToKKyAgICAgICAgb2JqID0gWHRydWN0MihpMzJfdGhpbmc9MSwKKyAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3RfdGhpbmc9WHRydWN0KHN0cmluZ190aGluZz0iZm9vIikpCiAKLSAgICBzMSA9IHNlcmlhbGl6ZShvYmopCi0gICAgZm9yIGkgaW4gcmFuZ2UoMTApOgotICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoczEsIHNlcmlhbGl6ZShvYmopKQotICAgICAgb2JqY29weSA9IFh0cnVjdDIoKQotICAgICAgZGVzZXJpYWxpemUob2JqY29weSwgc2VyaWFsaXplKG9iaikpCi0gICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIG9iamNvcHkpCisgICAgICAgIHMxID0gc2VyaWFsaXplKG9iaikKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoczEsIHNlcmlhbGl6ZShvYmopKQorICAgICAgICAgICAgb2JqY29weSA9IFh0cnVjdDIoKQorICAgICAgICAgICAgZGVzZXJpYWxpemUob2JqY29weSwgc2VyaWFsaXplKG9iaikpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIG9iamNvcHkpCiAKLSAgICBvYmogPSBYdHJ1Y3Qoc3RyaW5nX3RoaW5nPSJiYXIiKQotICAgIG9iamNvcHkgPSBYdHJ1Y3QoKQotICAgIGRlc2VyaWFsaXplKG9iamNvcHksIHNlcmlhbGl6ZShvYmopKQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgb2JqY29weSkKKyAgICAgICAgb2JqID0gWHRydWN0KHN0cmluZ190aGluZz0iYmFyIikKKyAgICAgICAgb2JqY29weSA9IFh0cnVjdCgpCisgICAgICAgIGRlc2VyaWFsaXplKG9iamNvcHksIHNlcmlhbGl6ZShvYmopKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIG9iamNvcHkpCiAKLSAgICAjIHRlc3QgYm9vbGVhbnMKLSAgICBvYmogPSBCb29scyhpbV90cnVlPVRydWUsIGltX2ZhbHNlPUZhbHNlKQotICAgIG9iamNvcHkgPSBCb29scygpCi0gICAgZGVzZXJpYWxpemUob2JqY29weSwgc2VyaWFsaXplKG9iaikpCi0gICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLCBvYmpjb3B5KQotICAgIAotICAgICMgdGVzdCBlbnVtcwotICAgIGZvciBudW0sIG5hbWUgaW4gTnVtYmVyei5fVkFMVUVTX1RPX05BTUVTLml0ZXJpdGVtcygpOgotICAgICAgb2JqID0gQm9uayhtZXNzYWdlPSdlbnVtIE51bWJlcnogdmFsdWUgJWQgaXMgc3RyaW5nICVzJyAlIChudW0sIG5hbWUpLCB0eXBlPW51bSkKLSAgICAgIG9iamNvcHkgPSBCb25rKCkKLSAgICAgIGRlc2VyaWFsaXplKG9iamNvcHksIHNlcmlhbGl6ZShvYmopKQotICAgICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLCBvYmpjb3B5KQotICAKKyAgICAgICAgIyB0ZXN0IGJvb2xlYW5zCisgICAgICAgIG9iaiA9IEJvb2xzKGltX3RydWU9VHJ1ZSwgaW1fZmFsc2U9RmFsc2UpCisgICAgICAgIG9iamNvcHkgPSBCb29scygpCisgICAgICAgIGRlc2VyaWFsaXplKG9iamNvcHksIHNlcmlhbGl6ZShvYmopKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIG9iamNvcHkpCisKKyAgICAgICAgIyB0ZXN0IGVudW1zCisgICAgICAgIGZvciBudW0sIG5hbWUgaW4gTnVtYmVyei5fVkFMVUVTX1RPX05BTUVTLml0ZW1zKCk6CisgICAgICAgICAgICBvYmogPSBCb25rKG1lc3NhZ2U9J2VudW0gTnVtYmVyeiB2YWx1ZSAlZCBpcyBzdHJpbmcgJXMnICUgKG51bSwgbmFtZSksIHR5cGU9bnVtKQorICAgICAgICAgICAgb2JqY29weSA9IEJvbmsoKQorICAgICAgICAgICAgZGVzZXJpYWxpemUob2JqY29weSwgc2VyaWFsaXplKG9iaikpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIG9iamNvcHkpCisKIAogZGVmIHN1aXRlKCk6Ci0gIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKLSAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQogCi0gIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShOb3JtYWxCaW5hcnlUZXN0KSkKLSAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKEFjY2VsZXJhdGVkQmluYXJ5VGVzdCkpCi0gIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShDb21wYWN0UHJvdG9jb2xUZXN0KSkKLSAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKEpTT05Qcm90b2NvbFRlc3QpKQotICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoQWNjZWxlcmF0ZWRGcmFtZWRUZXN0KSkKLSAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKFNlcmlhbGl6ZXJzVGVzdCkpCi0gIHJldHVybiBzdWl0ZQorICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShOb3JtYWxCaW5hcnlUZXN0KSkKKyAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoQWNjZWxlcmF0ZWRCaW5hcnlUZXN0KSkKKyAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoQWNjZWxlcmF0ZWRDb21wYWN0VGVzdCkpCisgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKENvbXBhY3RQcm90b2NvbFRlc3QpKQorICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShKU09OUHJvdG9jb2xUZXN0KSkKKyAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoQWNjZWxlcmF0ZWRGcmFtZWRUZXN0KSkKKyAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoU2VyaWFsaXplcnNUZXN0KSkKKyAgICByZXR1cm4gc3VpdGUKKwogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotICB1bml0dGVzdC5tYWluKGRlZmF1bHRUZXN0PSJzdWl0ZSIsIHRlc3RSdW5uZXI9dW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIodmVyYm9zaXR5PTIpKQorICAgIHVuaXR0ZXN0Lm1haW4oZGVmYXVsdFRlc3Q9InN1aXRlIiwgdGVzdFJ1bm5lcj11bml0dGVzdC5UZXh0VGVzdFJ1bm5lcih2ZXJib3NpdHk9MikpCmRpZmYgLS1naXQgYS90ZXN0L3B5L1RTaW1wbGVKU09OUHJvdG9jb2xUZXN0LnB5IGIvdGVzdC9weS9UU2ltcGxlSlNPTlByb3RvY29sVGVzdC5weQppbmRleCAwODAyOTNhLi43Mjk4NzYwIDEwMDY0NAotLS0gYS90ZXN0L3B5L1RTaW1wbGVKU09OUHJvdG9jb2xUZXN0LnB5CisrKyBiL3Rlc3QvcHkvVFNpbXBsZUpTT05Qcm90b2NvbFRlc3QucHkKQEAgLTE5LDE3ICsxOSw3IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1pbXBvcnQgc3lzCi1pbXBvcnQgZ2xvYgotZnJvbSBvcHRwYXJzZSBpbXBvcnQgT3B0aW9uUGFyc2VyCi1wYXJzZXIgPSBPcHRpb25QYXJzZXIoKQotcGFyc2VyLmFkZF9vcHRpb24oJy0tZ2VucHlkaXInLCB0eXBlPSdzdHJpbmcnLCBkZXN0PSdnZW5weWRpcicsIGRlZmF1bHQ9J2dlbi1weScpCi1vcHRpb25zLCBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQotZGVsIHN5cy5hcmd2WzE6XSAjIGNsZWFuIHVwIGhhY2sgc28gdW5pdHRlc3QgZG9lc24ndCBjb21wbGFpbgotc3lzLnBhdGguaW5zZXJ0KDAsIG9wdGlvbnMuZ2VucHlkaXIpCi1zeXMucGF0aC5pbnNlcnQoMCwgZ2xvYi5nbG9iKCcuLi8uLi9saWIvcHkvYnVpbGQvbGliLionKVswXSkKLQotZnJvbSBUaHJpZnRUZXN0LnR0eXBlcyBpbXBvcnQgKgorZnJvbSBUaHJpZnRUZXN0LnR0eXBlcyBpbXBvcnQgQm9uaywgVmVyc2lvbmluZ1Rlc3RWMSwgVmVyc2lvbmluZ1Rlc3RWMgogZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRKU09OUHJvdG9jb2wKIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAogCkBAIC0zOCw4MiArMjgsODEgQEAKIAogCiBjbGFzcyBTaW1wbGVKU09OUHJvdG9jb2xUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgcHJvdG9jb2xfZmFjdG9yeSA9IFRKU09OUHJvdG9jb2wuVFNpbXBsZUpTT05Qcm90b2NvbEZhY3RvcnkoKQorICAgIHByb3RvY29sX2ZhY3RvcnkgPSBUSlNPTlByb3RvY29sLlRTaW1wbGVKU09OUHJvdG9jb2xGYWN0b3J5KCkKIAotICBkZWYgX2Fzc2VydERpY3RFcXVhbChzZWxmLCBhICxiLCBtc2c9Tm9uZSk6Ci0gICAgaWYgaGFzYXR0cihzZWxmLCAnYXNzZXJ0RGljdEVxdWFsJyk6Ci0gICAgICAjIGFzc2VydERpY3RFcXVhbCBvbmx5IGluIFB5dGhvbiAyLjcuIERlcGVuZHMgb24geW91ciBtYWNoaW5lLgotICAgICAgc2VsZi5hc3NlcnREaWN0RXF1YWwoYSwgYiwgbXNnKQotICAgICAgcmV0dXJuCi0gICAgCi0gICAgIyBTdWJzdGl0dXRlIGltcGxlbWVudGF0aW9uIG5vdCBhcyBnb29kIGFzIHVuaXR0ZXN0IGxpYnJhcnkncwotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihhKSwgbGVuKGIpLCBtc2cpCi0gICAgZm9yIGssIHYgaW4gYS5pdGVyaXRlbXMoKToKLSAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShrIGluIGIsIG1zZykKLSAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGIuZ2V0KGspLCB2LCBtc2cpCisgICAgZGVmIF9hc3NlcnREaWN0RXF1YWwoc2VsZiwgYSwgYiwgbXNnPU5vbmUpOgorICAgICAgICBpZiBoYXNhdHRyKHNlbGYsICdhc3NlcnREaWN0RXF1YWwnKToKKyAgICAgICAgICAgICMgYXNzZXJ0RGljdEVxdWFsIG9ubHkgaW4gUHl0aG9uIDIuNy4gRGVwZW5kcyBvbiB5b3VyIG1hY2hpbmUuCisgICAgICAgICAgICBzZWxmLmFzc2VydERpY3RFcXVhbChhLCBiLCBtc2cpCisgICAgICAgICAgICByZXR1cm4KIAotICBkZWYgX3NlcmlhbGl6ZShzZWxmLCBvYmopOgotICAgIHRyYW5zID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkKLSAgICBwcm90ID0gc2VsZi5wcm90b2NvbF9mYWN0b3J5LmdldFByb3RvY29sKHRyYW5zKQotICAgIG9iai53cml0ZShwcm90KQotICAgIHJldHVybiB0cmFucy5nZXR2YWx1ZSgpCisgICAgICAgICMgU3Vic3RpdHV0ZSBpbXBsZW1lbnRhdGlvbiBub3QgYXMgZ29vZCBhcyB1bml0dGVzdCBsaWJyYXJ5J3MKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGEpLCBsZW4oYiksIG1zZykKKyAgICAgICAgZm9yIGssIHYgaW4gYS5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShrIGluIGIsIG1zZykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGIuZ2V0KGspLCB2LCBtc2cpCiAKLSAgZGVmIF9kZXNlcmlhbGl6ZShzZWxmLCBvYmp0eXBlLCBkYXRhKToKLSAgICBwcm90ID0gc2VsZi5wcm90b2NvbF9mYWN0b3J5LmdldFByb3RvY29sKFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihkYXRhKSkKLSAgICByZXQgPSBvYmp0eXBlKCkKLSAgICByZXQucmVhZChwcm90KQotICAgIHJldHVybiByZXQKKyAgICBkZWYgX3NlcmlhbGl6ZShzZWxmLCBvYmopOgorICAgICAgICB0cmFucyA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCisgICAgICAgIHByb3QgPSBzZWxmLnByb3RvY29sX2ZhY3RvcnkuZ2V0UHJvdG9jb2wodHJhbnMpCisgICAgICAgIG9iai53cml0ZShwcm90KQorICAgICAgICByZXR1cm4gdHJhbnMuZ2V0dmFsdWUoKQogCi0gIGRlZiB0ZXN0V3JpdGVPbmx5KHNlbGYpOgotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZGVzZXJpYWxpemUsIFZlcnNpb25pbmdUZXN0VjEsICd7fScpCisgICAgZGVmIF9kZXNlcmlhbGl6ZShzZWxmLCBvYmp0eXBlLCBkYXRhKToKKyAgICAgICAgcHJvdCA9IHNlbGYucHJvdG9jb2xfZmFjdG9yeS5nZXRQcm90b2NvbChUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoZGF0YSkpCisgICAgICAgIHJldCA9IG9ianR5cGUoKQorICAgICAgICByZXQucmVhZChwcm90KQorICAgICAgICByZXR1cm4gcmV0CiAKLSAgZGVmIHRlc3RTaW1wbGVNZXNzYWdlKHNlbGYpOgotICAgICAgdjFvYmogPSBWZXJzaW9uaW5nVGVzdFYxKAotICAgICAgICAgIGJlZ2luX2luX2JvdGg9MTIzNDUsCi0gICAgICAgICAgb2xkX3N0cmluZz0nYWFhJywKLSAgICAgICAgICBlbmRfaW5fYm90aD01NDMyMSkKLSAgICAgIGV4cGVjdGVkID0gZGljdChiZWdpbl9pbl9ib3RoPXYxb2JqLmJlZ2luX2luX2JvdGgsCi0gICAgICAgICAgICAgICAgICAgICAgb2xkX3N0cmluZz12MW9iai5vbGRfc3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgIGVuZF9pbl9ib3RoPXYxb2JqLmVuZF9pbl9ib3RoKQotICAgICAgYWN0dWFsID0ganNvbi5sb2FkcyhzZWxmLl9zZXJpYWxpemUodjFvYmopKQorICAgIGRlZiB0ZXN0V3JpdGVPbmx5KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9kZXNlcmlhbGl6ZSwgVmVyc2lvbmluZ1Rlc3RWMSwgYid7fScpCiAKLSAgICAgIHNlbGYuX2Fzc2VydERpY3RFcXVhbChleHBlY3RlZCwgYWN0dWFsKQotICAgICAKLSAgZGVmIHRlc3RDb21wbGljYXRlZChzZWxmKToKLSAgICAgIHYyb2JqID0gVmVyc2lvbmluZ1Rlc3RWMigKLSAgICAgICAgICBiZWdpbl9pbl9ib3RoPTEyMzQ1LAotICAgICAgICAgIG5ld2ludD0xLAotICAgICAgICAgIG5ld2J5dGU9MiwKLSAgICAgICAgICBuZXdzaG9ydD0zLAotICAgICAgICAgIG5ld2xvbmc9NCwKLSAgICAgICAgICBuZXdkb3VibGU9NS4wLAotICAgICAgICAgIG5ld3N0cnVjdD1Cb25rKG1lc3NhZ2U9IkhlbGxvISIsIHR5cGU9MTIzKSwKLSAgICAgICAgICBuZXdsaXN0PVs3LDgsOV0sCi0gICAgICAgICAgbmV3c2V0PXNldChbNDIsMSw4XSksCi0gICAgICAgICAgbmV3bWFwPXsxOjIsMjozfSwKLSAgICAgICAgICBuZXdzdHJpbmc9IkhvbGEhIiwKLSAgICAgICAgICBlbmRfaW5fYm90aD01NDMyMSkKLSAgICAgIGV4cGVjdGVkID0gZGljdChiZWdpbl9pbl9ib3RoPXYyb2JqLmJlZ2luX2luX2JvdGgsCi0gICAgICAgICAgICAgICAgICAgICAgbmV3aW50PXYyb2JqLm5ld2ludCwKLSAgICAgICAgICAgICAgICAgICAgICBuZXdieXRlPXYyb2JqLm5ld2J5dGUsCi0gICAgICAgICAgICAgICAgICAgICAgbmV3c2hvcnQ9djJvYmoubmV3c2hvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgbmV3bG9uZz12Mm9iai5uZXdsb25nLAotICAgICAgICAgICAgICAgICAgICAgIG5ld2RvdWJsZT12Mm9iai5uZXdkb3VibGUsCi0gICAgICAgICAgICAgICAgICAgICAgbmV3c3RydWN0PWRpY3QobWVzc2FnZT12Mm9iai5uZXdzdHJ1Y3QubWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPXYyb2JqLm5ld3N0cnVjdC50eXBlKSwKLSAgICAgICAgICAgICAgICAgICAgICBuZXdsaXN0PXYyb2JqLm5ld2xpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgbmV3c2V0PWxpc3QodjJvYmoubmV3c2V0KSwKLSAgICAgICAgICAgICAgICAgICAgICBuZXdtYXA9djJvYmoubmV3bWFwLAotICAgICAgICAgICAgICAgICAgICAgIG5ld3N0cmluZz12Mm9iai5uZXdzdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgZW5kX2luX2JvdGg9djJvYmouZW5kX2luX2JvdGgpCi0gICAgICAKLSAgICAgICMgTmVlZCB0byBsb2FkL2R1bXAgYmVjYXVzZSBtYXAga2V5cyBnZXQgZXNjYXBlZC4KLSAgICAgIGV4cGVjdGVkID0ganNvbi5sb2Fkcyhqc29uLmR1bXBzKGV4cGVjdGVkKSkKLSAgICAgIGFjdHVhbCA9IGpzb24ubG9hZHMoc2VsZi5fc2VyaWFsaXplKHYyb2JqKSkKLSAgICAgIHNlbGYuX2Fzc2VydERpY3RFcXVhbChleHBlY3RlZCwgYWN0dWFsKQorICAgIGRlZiB0ZXN0U2ltcGxlTWVzc2FnZShzZWxmKToKKyAgICAgICAgdjFvYmogPSBWZXJzaW9uaW5nVGVzdFYxKAorICAgICAgICAgICAgYmVnaW5faW5fYm90aD0xMjM0NSwKKyAgICAgICAgICAgIG9sZF9zdHJpbmc9J2FhYScsCisgICAgICAgICAgICBlbmRfaW5fYm90aD01NDMyMSkKKyAgICAgICAgZXhwZWN0ZWQgPSBkaWN0KGJlZ2luX2luX2JvdGg9djFvYmouYmVnaW5faW5fYm90aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9sZF9zdHJpbmc9djFvYmoub2xkX3N0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZF9pbl9ib3RoPXYxb2JqLmVuZF9pbl9ib3RoKQorICAgICAgICBhY3R1YWwgPSBqc29uLmxvYWRzKHNlbGYuX3NlcmlhbGl6ZSh2MW9iaikuZGVjb2RlKCdhc2NpaScpKQorCisgICAgICAgIHNlbGYuX2Fzc2VydERpY3RFcXVhbChleHBlY3RlZCwgYWN0dWFsKQorCisgICAgZGVmIHRlc3RDb21wbGljYXRlZChzZWxmKToKKyAgICAgICAgdjJvYmogPSBWZXJzaW9uaW5nVGVzdFYyKAorICAgICAgICAgICAgYmVnaW5faW5fYm90aD0xMjM0NSwKKyAgICAgICAgICAgIG5ld2ludD0xLAorICAgICAgICAgICAgbmV3Ynl0ZT0yLAorICAgICAgICAgICAgbmV3c2hvcnQ9MywKKyAgICAgICAgICAgIG5ld2xvbmc9NCwKKyAgICAgICAgICAgIG5ld2RvdWJsZT01LjAsCisgICAgICAgICAgICBuZXdzdHJ1Y3Q9Qm9uayhtZXNzYWdlPSJIZWxsbyEiLCB0eXBlPTEyMyksCisgICAgICAgICAgICBuZXdsaXN0PVs3LCA4LCA5XSwKKyAgICAgICAgICAgIG5ld3NldD1zZXQoWzQyLCAxLCA4XSksCisgICAgICAgICAgICBuZXdtYXA9ezE6IDIsIDI6IDN9LAorICAgICAgICAgICAgbmV3c3RyaW5nPSJIb2xhISIsCisgICAgICAgICAgICBlbmRfaW5fYm90aD01NDMyMSkKKyAgICAgICAgZXhwZWN0ZWQgPSBkaWN0KGJlZ2luX2luX2JvdGg9djJvYmouYmVnaW5faW5fYm90aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld2ludD12Mm9iai5uZXdpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdieXRlPXYyb2JqLm5ld2J5dGUsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdzaG9ydD12Mm9iai5uZXdzaG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld2xvbmc9djJvYmoubmV3bG9uZywKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld2RvdWJsZT12Mm9iai5uZXdkb3VibGUsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdzdHJ1Y3Q9ZGljdChtZXNzYWdlPXYyb2JqLm5ld3N0cnVjdC5tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT12Mm9iai5uZXdzdHJ1Y3QudHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdsaXN0PXYyb2JqLm5ld2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdzZXQ9bGlzdCh2Mm9iai5uZXdzZXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3bWFwPXYyb2JqLm5ld21hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld3N0cmluZz12Mm9iai5uZXdzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBlbmRfaW5fYm90aD12Mm9iai5lbmRfaW5fYm90aCkKKworICAgICAgICAjIE5lZWQgdG8gbG9hZC9kdW1wIGJlY2F1c2UgbWFwIGtleXMgZ2V0IGVzY2FwZWQuCisgICAgICAgIGV4cGVjdGVkID0ganNvbi5sb2Fkcyhqc29uLmR1bXBzKGV4cGVjdGVkKSkKKyAgICAgICAgYWN0dWFsID0ganNvbi5sb2FkcyhzZWxmLl9zZXJpYWxpemUodjJvYmopLmRlY29kZSgnYXNjaWknKSkKKyAgICAgICAgc2VsZi5fYXNzZXJ0RGljdEVxdWFsKGV4cGVjdGVkLCBhY3R1YWwpCiAKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgdW5pdHRlc3QubWFpbigpCi0KKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL3Rlc3QvcHkvVGVzdENsaWVudC5weSBiL3Rlc3QvcHkvVGVzdENsaWVudC5weQppbmRleCA1MTExMWE2Li5kZGNjZThkIDEwMDc1NQotLS0gYS90ZXN0L3B5L1Rlc3RDbGllbnQucHkKKysrIGIvdGVzdC9weS9UZXN0Q2xpZW50LnB5CkBAIC0xLDUgKzEsNSBAQAogIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCi0KKyMgLSotIGNvZGluZzogdXRmLTggLSotCiAjCiAjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKICMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKQEAgLTE5LDI1NCArMTksNDI4IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1pbXBvcnQgZ2xvYgogaW1wb3J0IG9zCiBpbXBvcnQgc3lzCiBpbXBvcnQgdGltZQogaW1wb3J0IHVuaXR0ZXN0CiBmcm9tIG9wdHBhcnNlIGltcG9ydCBPcHRpb25QYXJzZXIKIAotcGFyc2VyID0gT3B0aW9uUGFyc2VyKCkKLXBhcnNlci5hZGRfb3B0aW9uKCctLWdlbnB5ZGlyJywgdHlwZT0nc3RyaW5nJywgZGVzdD0nZ2VucHlkaXInLAotICAgICAgICAgICAgICAgICAgZGVmYXVsdD0nZ2VuLXB5JywKLSAgICAgICAgICAgICAgICAgIGhlbHA9J2luY2x1ZGUgdGhpcyBsb2NhbCBkaXJlY3RvcnkgaW4gc3lzLnBhdGggZm9yIGxvY2F0aW5nIGdlbmVyYXRlZCBjb2RlJykKLXBhcnNlci5hZGRfb3B0aW9uKCItLXBvcnQiLCB0eXBlPSJpbnQiLCBkZXN0PSJwb3J0IiwKLSAgICBoZWxwPSJjb25uZWN0IHRvIHNlcnZlciBhdCBwb3J0IikKLXBhcnNlci5hZGRfb3B0aW9uKCItLWhvc3QiLCB0eXBlPSJzdHJpbmciLCBkZXN0PSJob3N0IiwKLSAgICBoZWxwPSJjb25uZWN0IHRvIHNlcnZlciIpCi1wYXJzZXIuYWRkX29wdGlvbigiLS16bGliIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwgZGVzdD0iemxpYiIsCi0gICAgaGVscD0idXNlIHpsaWIgd3JhcHBlciBmb3IgY29tcHJlc3NlZCB0cmFuc3BvcnQiKQotcGFyc2VyLmFkZF9vcHRpb24oIi0tc3NsIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwgZGVzdD0ic3NsIiwKLSAgICBoZWxwPSJ1c2UgU1NMIGZvciBlbmNyeXB0ZWQgdHJhbnNwb3J0IikKLXBhcnNlci5hZGRfb3B0aW9uKCItLWh0dHAiLCBkZXN0PSJodHRwX3BhdGgiLAotICAgIGhlbHA9IlVzZSB0aGUgSFRUUCB0cmFuc3BvcnQgd2l0aCB0aGUgc3BlY2lmaWVkIHBhdGgiKQotcGFyc2VyLmFkZF9vcHRpb24oJy12JywgJy0tdmVyYm9zZScsIGFjdGlvbj0ic3RvcmVfY29uc3QiLAotICAgIGRlc3Q9InZlcmJvc2UiLCBjb25zdD0yLAotICAgIGhlbHA9InZlcmJvc2Ugb3V0cHV0IikKLXBhcnNlci5hZGRfb3B0aW9uKCctcScsICctLXF1aWV0JywgYWN0aW9uPSJzdG9yZV9jb25zdCIsCi0gICAgZGVzdD0idmVyYm9zZSIsIGNvbnN0PTAsCi0gICAgaGVscD0ibWluaW1hbCBvdXRwdXQiKQotcGFyc2VyLmFkZF9vcHRpb24oJy0tcHJvdG9jb2wnLCAgZGVzdD0icHJvdG8iLCB0eXBlPSJzdHJpbmciLAotICAgIGhlbHA9InByb3RvY29sIHRvIHVzZSwgb25lIG9mOiBhY2NlbCwgYmluYXJ5LCBjb21wYWN0LCBqc29uIikKLXBhcnNlci5hZGRfb3B0aW9uKCctLXRyYW5zcG9ydCcsICBkZXN0PSJ0cmFucyIsIHR5cGU9InN0cmluZyIsCi0gICAgaGVscD0idHJhbnNwb3J0IHRvIHVzZSwgb25lIG9mOiBidWZmZXJlZCwgZnJhbWVkIikKLXBhcnNlci5zZXRfZGVmYXVsdHMoZnJhbWVkPUZhbHNlLCBodHRwX3BhdGg9Tm9uZSwgdmVyYm9zZT0xLCBob3N0PSdsb2NhbGhvc3QnLCBwb3J0PTkwOTAsIHByb3RvPSdiaW5hcnknKQotb3B0aW9ucywgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKK2Zyb20gdXRpbCBpbXBvcnQgbG9jYWxfbGlicGF0aAogCi1zY3JpcHRfZGlyID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpCi1saWJfZGlyID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUoc2NyaXB0X2RpcikpLCAnbGliJywgJ3B5JywgJ2J1aWxkJywgJ2xpYi4qJykKLXN5cy5wYXRoLmluc2VydCgwLCBvcy5wYXRoLmpvaW4oc2NyaXB0X2Rpciwgb3B0aW9ucy5nZW5weWRpcikpCi1zeXMucGF0aC5pbnNlcnQoMCwgZ2xvYi5nbG9iKGxpYl9kaXIpWzBdKQotCi1mcm9tIFRocmlmdFRlc3QgaW1wb3J0IFRocmlmdFRlc3QsIFNlY29uZFNlcnZpY2UKLWZyb20gVGhyaWZ0VGVzdC50dHlwZXMgaW1wb3J0ICoKLWZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAotZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUU29ja2V0Ci1mcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRIdHRwQ2xpZW50Ci1mcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRabGliVHJhbnNwb3J0Ci1mcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCi1mcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVENvbXBhY3RQcm90b2NvbAotZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRKU09OUHJvdG9jb2wKK1NDUklQVF9ESVIgPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSkKIAogCiBjbGFzcyBBYnN0cmFjdFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgotICBkZWYgc2V0VXAoc2VsZik6Ci0gICAgaWYgb3B0aW9ucy5odHRwX3BhdGg6Ci0gICAgICBzZWxmLnRyYW5zcG9ydCA9IFRIdHRwQ2xpZW50LlRIdHRwQ2xpZW50KG9wdGlvbnMuaG9zdCwgcG9ydD1vcHRpb25zLnBvcnQsIHBhdGg9b3B0aW9ucy5odHRwX3BhdGgpCi0gICAgZWxzZToKLSAgICAgIGlmIG9wdGlvbnMuc3NsOgotICAgICAgICBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRTU0xTb2NrZXQKLSAgICAgICAgc29ja2V0ID0gVFNTTFNvY2tldC5UU1NMU29ja2V0KG9wdGlvbnMuaG9zdCwgb3B0aW9ucy5wb3J0LCB2YWxpZGF0ZT1GYWxzZSkKLSAgICAgIGVsc2U6Ci0gICAgICAgIHNvY2tldCA9IFRTb2NrZXQuVFNvY2tldChvcHRpb25zLmhvc3QsIG9wdGlvbnMucG9ydCkKLSAgICAgICMgZnJhbWUgb3IgYnVmZmVyIGRlcGVuZGluZyB1cG9uIGFyZ3MKLSAgICAgIHNlbGYudHJhbnNwb3J0ID0gVFRyYW5zcG9ydC5UQnVmZmVyZWRUcmFuc3BvcnQoc29ja2V0KQotICAgICAgaWYgb3B0aW9ucy50cmFucyA9PSAnZnJhbWVkJzoKLSAgICAgICAgc2VsZi50cmFuc3BvcnQgPSBUVHJhbnNwb3J0LlRGcmFtZWRUcmFuc3BvcnQoc29ja2V0KQotICAgICAgZWxpZiBvcHRpb25zLnRyYW5zID09ICdidWZmZXJlZCc6Ci0gICAgICAgIHNlbGYudHJhbnNwb3J0ID0gVFRyYW5zcG9ydC5UQnVmZmVyZWRUcmFuc3BvcnQoc29ja2V0KQotICAgICAgZWxpZiBvcHRpb25zLnRyYW5zID09ICcnOgotICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcignVW5rbm93biAtLXRyYW5zcG9ydCBvcHRpb246ICVzJyAlIG9wdGlvbnMudHJhbnMpCi0gICAgICBpZiBvcHRpb25zLnpsaWI6Ci0gICAgICAgIHNlbGYudHJhbnNwb3J0ID0gVFpsaWJUcmFuc3BvcnQuVFpsaWJUcmFuc3BvcnQoc2VsZi50cmFuc3BvcnQsIDkpCi0gICAgc2VsZi50cmFuc3BvcnQub3BlbigpCi0gICAgcHJvdG9jb2wgPSBzZWxmLnByb3RvY29sX2ZhY3RvcnkuZ2V0UHJvdG9jb2woc2VsZi50cmFuc3BvcnQpCi0gICAgc2VsZi5jbGllbnQgPSBUaHJpZnRUZXN0LkNsaWVudChwcm90b2NvbCkKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIGlmIG9wdGlvbnMudHJhbnMgPT0gJ2h0dHAnOgorICAgICAgICAgICAgdXJpID0gJ3swfTovL3sxfTp7Mn17M30nLmZvcm1hdCgoJ2h0dHBzJyBpZiBvcHRpb25zLnNzbCBlbHNlICdodHRwJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuaG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3B0aW9ucy5odHRwX3BhdGggaWYgb3B0aW9ucy5odHRwX3BhdGggZWxzZSAnLycpKQorICAgICAgICAgICAgaWYgb3B0aW9ucy5zc2w6CisgICAgICAgICAgICAgICAgX19jYWZpbGUgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKFNDUklQVF9ESVIpLCAia2V5cyIsICJDQS5wZW0iKQorICAgICAgICAgICAgICAgIF9fY2VydGZpbGUgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKFNDUklQVF9ESVIpLCAia2V5cyIsICJjbGllbnQuY3J0IikKKyAgICAgICAgICAgICAgICBfX2tleWZpbGUgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKFNDUklQVF9ESVIpLCAia2V5cyIsICJjbGllbnQua2V5IikKKyAgICAgICAgICAgICAgICBzZWxmLnRyYW5zcG9ydCA9IFRIdHRwQ2xpZW50LlRIdHRwQ2xpZW50KHVyaSwgY2FmaWxlPV9fY2FmaWxlLCBjZXJ0X2ZpbGU9X19jZXJ0ZmlsZSwga2V5X2ZpbGU9X19rZXlmaWxlKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnRyYW5zcG9ydCA9IFRIdHRwQ2xpZW50LlRIdHRwQ2xpZW50KHVyaSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIG9wdGlvbnMuc3NsOgorICAgICAgICAgICAgICAgIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFNTTFNvY2tldAorICAgICAgICAgICAgICAgIHNvY2tldCA9IFRTU0xTb2NrZXQuVFNTTFNvY2tldChvcHRpb25zLmhvc3QsIG9wdGlvbnMucG9ydCwgdmFsaWRhdGU9RmFsc2UpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNvY2tldCA9IFRTb2NrZXQuVFNvY2tldChvcHRpb25zLmhvc3QsIG9wdGlvbnMucG9ydCkKKyAgICAgICAgICAgICMgZnJhbWUgb3IgYnVmZmVyIGRlcGVuZGluZyB1cG9uIGFyZ3MKKyAgICAgICAgICAgIHNlbGYudHJhbnNwb3J0ID0gVFRyYW5zcG9ydC5UQnVmZmVyZWRUcmFuc3BvcnQoc29ja2V0KQorICAgICAgICAgICAgaWYgb3B0aW9ucy50cmFucyA9PSAnZnJhbWVkJzoKKyAgICAgICAgICAgICAgICBzZWxmLnRyYW5zcG9ydCA9IFRUcmFuc3BvcnQuVEZyYW1lZFRyYW5zcG9ydChzb2NrZXQpCisgICAgICAgICAgICBlbGlmIG9wdGlvbnMudHJhbnMgPT0gJ2J1ZmZlcmVkJzoKKyAgICAgICAgICAgICAgICBzZWxmLnRyYW5zcG9ydCA9IFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0KHNvY2tldCkKKyAgICAgICAgICAgIGVsaWYgb3B0aW9ucy50cmFucyA9PSAnJzoKKyAgICAgICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcignVW5rbm93biAtLXRyYW5zcG9ydCBvcHRpb246ICVzJyAlIG9wdGlvbnMudHJhbnMpCisgICAgICAgICAgICBpZiBvcHRpb25zLnpsaWI6CisgICAgICAgICAgICAgICAgc2VsZi50cmFuc3BvcnQgPSBUWmxpYlRyYW5zcG9ydC5UWmxpYlRyYW5zcG9ydChzZWxmLnRyYW5zcG9ydCwgOSkKKyAgICAgICAgc2VsZi50cmFuc3BvcnQub3BlbigpCisgICAgICAgIHByb3RvY29sID0gc2VsZi5nZXRfcHJvdG9jb2woc2VsZi50cmFuc3BvcnQpCisgICAgICAgIHNlbGYuY2xpZW50ID0gVGhyaWZ0VGVzdC5DbGllbnQocHJvdG9jb2wpCisgICAgICAgICMgZm9yIG11bHRpcGxleGVkIHNlcnZpY2VzOgorICAgICAgICBwcm90b2NvbDIgPSBzZWxmLmdldF9wcm90b2NvbDIoc2VsZi50cmFuc3BvcnQpCisgICAgICAgIHNlbGYuY2xpZW50MiA9IFNlY29uZFNlcnZpY2UuQ2xpZW50KHByb3RvY29sMikgaWYgcHJvdG9jb2wyIGlzIG5vdCBOb25lIGVsc2UgTm9uZQogCi0gIGRlZiB0ZWFyRG93bihzZWxmKToKLSAgICAjIENsb3NlIQotICAgIHNlbGYudHJhbnNwb3J0LmNsb3NlKCkKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYudHJhbnNwb3J0LmNsb3NlKCkKIAotICBkZWYgdGVzdFZvaWQoc2VsZik6Ci0gICAgcHJpbnQoJ3Rlc3RWb2lkJykKLSAgICBzZWxmLmNsaWVudC50ZXN0Vm9pZCgpCisgICAgZGVmIHRlc3RWb2lkKHNlbGYpOgorICAgICAgICBwcmludCgndGVzdFZvaWQnKQorICAgICAgICBzZWxmLmNsaWVudC50ZXN0Vm9pZCgpCiAKLSAgZGVmIHRlc3RTdHJpbmcoc2VsZik6Ci0gICAgcHJpbnQoJ3Rlc3RTdHJpbmcnKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdFN0cmluZygnUHl0aG9uJyAqIDIwKSwgJ1B5dGhvbicgKiAyMCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RTdHJpbmcoJycpLCAnJykKKyAgICBkZWYgdGVzdFN0cmluZyhzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3RTdHJpbmcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RTdHJpbmcoJ1B5dGhvbicgKiAyMCksICdQeXRob24nICogMjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdFN0cmluZygnJyksICcnKQorICAgICAgICBzMSA9IHUnXGJcdFxuL1xcXFxccnt9OuODkeOCpOOCveODsyInCisgICAgICAgIHMyID0gdSIiIkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvbsOpcywg2KfZhNi52LHYqNmK2KksINmF2LXYsdmJLAorICAgICAgICBBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXrJmXJiYXljYW4sINCR0LDRiNKh0L7RgNGCLCBCb2FyaXNjaCwgxb1lbWFpdMSXxaFrYSwKKyAgICAgICAg0JHQtdC70LDRgNGD0YHQutCw0Y8sINCR0LXQu9Cw0YDRg9GB0LrQsNGPICjRgtCw0YDQsNGI0LrQtdCy0ZbRhtCwKSwg0JHRitC70LPQsNGA0YHQutC4LCBCYW1hbmFua2FuLAorICAgICAgICDgpqzgpr7gpoLgprLgpr4sIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsw6AsIE3DrG5nLWTElcykbmctbmfhubPMhCwg0J3QvtGF0YfQuNC50L0sCisgICAgICAgIENlYnVhbm8sIOGPo+GOs+GOqSwgxIxlc2t5LCDQodC70L7QstGjzIHQvdGM0YHQutGKIC8g4rCU4rCO4rCR4rCC4rCh4rCQ4rCg4rCU4rCN4rCfLCDQp9OR0LLQsNGI0LvQsCwgQ3ltcmFlZywKKyAgICAgICAgRGFuc2ssIFphemFraSwg3oveqN6I3qzegN6o3oTept6Q3rAsIM6VzrvOu863zr3Ouc66zqwsIEVtaWxpw6BuIGUgcnVtYWduw7JsLCBFbmdsaXNoLAorICAgICAgICBFc3BlcmFudG8sIEVzcGHDsW9sLCBFZXN0aSwgRXVza2FyYSwg2YHYp9ix2LPbjCwgU3VvbWksIFbDtXJvLCBGw7hyb3lza3QsCisgICAgICAgIEZyYW7Dp2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwg6LSb6KqeLCBHw6BpZGhsaWcsIEdhbGVnbywKKyAgICAgICAgQXZhw7FlJ+G6vSwg4KqX4KuB4Kqc4Kqw4Kq+4Kqk4KuALCBHYWVsZywg16LXkdeo15nXqiwg4KS54KS/4KSo4KWN4KSm4KWALCBGaWppIEhpbmRpLCBIcnZhdHNraSwKKyAgICAgICAgS3JlecOybCBheWlzeWVuLCBNYWd5YXIsINWA1aHVtdWl1oDVpdW2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwKKyAgICAgICAgSWxva2FubywgSWRvLCDDjXNsZW5za2EsIEl0YWxpYW5vLCDml6XmnKzoqp4sIExvamJhbiwgQmFzYSBKYXdhLAorICAgICAgICDhg6Xhg5Dhg6Dhg5fhg6Phg5rhg5gsIEtvbmdvLCBLYWxhYWxsaXN1dCwg4LKV4LKo4LON4LKo4LKhLCDtlZzqta3slrQsINCa0YrQsNGA0LDRh9Cw0Lkt0JzQsNC70LrRitCw0YAsCisgICAgICAgIFJpcG9hcmlzY2gsIEt1cmTDriwg0JrQvtC80LgsIEtlcm5ld2VrLCDQmtGL0YDQs9GL0LfRh9CwLCBMYXRpbmEsIExhZGlubywKKyAgICAgICAgTMOrdHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ8OhbGEsIOC6peC6suC6pywgTGlldHV2acWzLCBMYXR2aWXFoXUsIEJhc2EKKyAgICAgICAgQmFueXVtYXNhbiwgTWFsYWdhc3ksINCc0LDQutC10LTQvtC90YHQutC4LCDgtK7gtLLgtK/gtL7gtLPgtIIsIOCkruCksOCkvuCkoOClgCwg2YXYp9iy2ZDYsdmI2YbbjCwgQmFoYXNhCisgICAgICAgIE1lbGF5dSwgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIOCkqOClh+CkquCkvuCksiDgpK3gpL7gpLfgpL4sIE5lZGVybGFuZHMsIOKAqgorICAgICAgICBOb3JzayAobnlub3JzaynigKwsIOKAqk5vcnNrIChib2ttw6VsKeKArCwgTm91b3JtYW5kLCBEaW7DqSBiaXphYWQsCisgICAgICAgIE9jY2l0YW4sINCY0YDQvtC90LDRgywgUGFwaWFtZW50dSwgRGVpdHNjaCwgUG9sc2tpLCDZvtmG2KzYp9io24wsINm+2prYqtmILAorICAgICAgICBOb3JmdWsgLyBQaXRrZXJuLCBQb3J0dWd1w6pzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb23Dom7EgywKKyAgICAgICAg0KDRg9GB0YHQutC40LksINCh0LDRhdCwINGC0YvQu9CwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU8OhbWVnaWVsbGEsIFNpbXBsZQorICAgICAgICBFbmdsaXNoLCBTbG92ZW7EjWluYSwgU2xvdmVuxaHEjWluYSwg0KHRgNC/0YHQutC4IC8gU3Jwc2tpLCBTZWVsdGVyc2ssCisgICAgICAgIFN2ZW5za2EsIEtpc3dhaGlsaSwg4K6k4K6u4K6/4K604K+NLCDgsKTgsYbgsLLgsYHgsJfgsYEsINCi0L7St9C40LrToywg4LmE4LiX4LiiLCBUw7xya21lbsOnZSwgVGFnYWxvZywKKyAgICAgICAgVMO8cmvDp2UsINCi0LDRgtCw0YDRh9CwL1RhdGFyw6dhLCDQo9C60YDQsNGX0L3RgdGM0LrQsCwg2KfYsdiv2YgsIFRp4bq/bmcgVmnhu4d0LCBWb2xhcMO8aywKKyAgICAgICAgV2Fsb24sIFdpbmFyYXksIOWQtOivrSwgaXNpWGhvc2EsINeZ15nWtNeT15nXqSwgWW9yw7liw6EsIFplw6p1d3MsIOS4reaWhywKKyAgICAgICAgQsOibi1sw6JtLWfDuiwg57K16KqeIiIiCisgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMiBhbmQgb3MuZW52aXJvbi5nZXQoJ1RIUklGVF9URVNUX1BZX05PX1VURjhTVFJJTkdTJyk6CisgICAgICAgICAgICBzMSA9IHMxLmVuY29kZSgndXRmOCcpCisgICAgICAgICAgICBzMiA9IHMyLmVuY29kZSgndXRmOCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdFN0cmluZyhzMSksIHMxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RTdHJpbmcoczIpLCBzMikKIAotICBkZWYgdGVzdEJvb2woc2VsZik6Ci0gICAgcHJpbnQoJ3Rlc3RCb29sJykKLSAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RCb29sKFRydWUpLCBUcnVlKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdEJvb2woRmFsc2UpLCBGYWxzZSkKKyAgICBkZWYgdGVzdE11bHRpcGxleGVkKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmNsaWVudDIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBwcmludCgndGVzdE11bHRpcGxleGVkJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQyLnNlY29uZHRlc3RTdHJpbmcoJ2Zvb2JhcicpLCAndGVzdFN0cmluZygiZm9vYmFyIiknKQogCi0gIGRlZiB0ZXN0Qnl0ZShzZWxmKToKLSAgICBwcmludCgndGVzdEJ5dGUnKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdEJ5dGUoNjMpLCA2MykKLSAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RCeXRlKC0xMjcpLCAtMTI3KQorICAgIGRlZiB0ZXN0Qm9vbChzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3RCb29sJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0Qm9vbChUcnVlKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0Qm9vbChGYWxzZSksIEZhbHNlKQogCi0gIGRlZiB0ZXN0STMyKHNlbGYpOgotICAgIHByaW50KCd0ZXN0STMyJykKLSAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RJMzIoLTEpLCAtMSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RJMzIoMCksIDApCisgICAgZGVmIHRlc3RCeXRlKHNlbGYpOgorICAgICAgICBwcmludCgndGVzdEJ5dGUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RCeXRlKDYzKSwgNjMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdEJ5dGUoLTEyNyksIC0xMjcpCiAKLSAgZGVmIHRlc3RJNjQoc2VsZik6Ci0gICAgcHJpbnQoJ3Rlc3RJNjQnKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdEk2NCgxKSwgMSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RJNjQoLTM0MzU5NzM4MzY4KSwgLTM0MzU5NzM4MzY4KQorICAgIGRlZiB0ZXN0STMyKHNlbGYpOgorICAgICAgICBwcmludCgndGVzdEkzMicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdEkzMigtMSksIC0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RJMzIoMCksIDApCiAKLSAgZGVmIHRlc3REb3VibGUoc2VsZik6Ci0gICAgcHJpbnQoJ3Rlc3REb3VibGUnKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdERvdWJsZSgtNS4yMzUwOTgyMzUpLCAtNS4yMzUwOTgyMzUpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0RG91YmxlKDApLCAwKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdERvdWJsZSgtMSksIC0xKQorICAgIGRlZiB0ZXN0STY0KHNlbGYpOgorICAgICAgICBwcmludCgndGVzdEk2NCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdEk2NCgxKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0STY0KC0zNDM1OTczODM2OCksIC0zNDM1OTczODM2OCkKIAotICBkZWYgdGVzdEJpbmFyeShzZWxmKToKLSAgICBpZiBpc2luc3RhbmNlKHNlbGYsIEpTT05UZXN0KToKLSAgICAgIHNlbGYuc2tpcFRlc3QoJ0pTT04gcHJvdG9jb2wgZG9lcyBub3QgaGFuZGxlIGJpbmFyeSBjb3JyZWN0bHkuJykKLSAgICBwcmludCgndGVzdEJpbmFyeScpCi0gICAgdmFsID0gYnl0ZWFycmF5KFtpIGZvciBpIGluIHJhbmdlKDAsIDI1NildKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnl0ZWFycmF5KHNlbGYuY2xpZW50LnRlc3RCaW5hcnkoYnl0ZXModmFsKSkpLCB2YWwpCisgICAgZGVmIHRlc3REb3VibGUoc2VsZik6CisgICAgICAgIHByaW50KCd0ZXN0RG91YmxlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0RG91YmxlKC01LjIzNTA5ODIzNSksIC01LjIzNTA5ODIzNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0RG91YmxlKDApLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3REb3VibGUoLTEpLCAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0RG91YmxlKC0wLjAwMDM0MTAxMjQzOTYzODU5ODI3OSksIC0wLjAwMDM0MTAxMjQzOTYzODU5ODI3OSkKIAotICBkZWYgdGVzdFN0cnVjdChzZWxmKToKLSAgICBwcmludCgndGVzdFN0cnVjdCcpCi0gICAgeCA9IFh0cnVjdCgpCi0gICAgeC5zdHJpbmdfdGhpbmcgPSAiWmVybyIKLSAgICB4LmJ5dGVfdGhpbmcgPSAxCi0gICAgeC5pMzJfdGhpbmcgPSAtMwotICAgIHguaTY0X3RoaW5nID0gLTUKLSAgICB5ID0gc2VsZi5jbGllbnQudGVzdFN0cnVjdCh4KQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeCkKKyAgICBkZWYgdGVzdEJpbmFyeShzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3RCaW5hcnknKQorICAgICAgICB2YWwgPSBieXRlYXJyYXkoW2kgZm9yIGkgaW4gcmFuZ2UoMCwgMjU2KV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnl0ZWFycmF5KHNlbGYuY2xpZW50LnRlc3RCaW5hcnkoYnl0ZXModmFsKSkpLCB2YWwpCiAKLSAgZGVmIHRlc3ROZXN0KHNlbGYpOgotICAgIHByaW50KCd0ZXN0TmVzdCcpCi0gICAgaW5uZXIgPSBYdHJ1Y3Qoc3RyaW5nX3RoaW5nPSJaZXJvIiwgYnl0ZV90aGluZz0xLCBpMzJfdGhpbmc9LTMsIGk2NF90aGluZz0tNSkKLSAgICB4ID0gWHRydWN0MihzdHJ1Y3RfdGhpbmc9aW5uZXIsIGJ5dGVfdGhpbmc9MCwgaTMyX3RoaW5nPTApCi0gICAgeSA9IHNlbGYuY2xpZW50LnRlc3ROZXN0KHgpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh5LCB4KQorICAgIGRlZiB0ZXN0U3RydWN0KHNlbGYpOgorICAgICAgICBwcmludCgndGVzdFN0cnVjdCcpCisgICAgICAgIHggPSBYdHJ1Y3QoKQorICAgICAgICB4LnN0cmluZ190aGluZyA9ICJaZXJvIgorICAgICAgICB4LmJ5dGVfdGhpbmcgPSAxCisgICAgICAgIHguaTMyX3RoaW5nID0gLTMKKyAgICAgICAgeC5pNjRfdGhpbmcgPSAtNQorICAgICAgICB5ID0gc2VsZi5jbGllbnQudGVzdFN0cnVjdCh4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHksIHgpCiAKLSAgZGVmIHRlc3RNYXAoc2VsZik6Ci0gICAgcHJpbnQoJ3Rlc3RNYXAnKQotICAgIHggPSB7MDoxLCAxOjIsIDI6MywgMzo0LCAtMTotMn0KLSAgICB5ID0gc2VsZi5jbGllbnQudGVzdE1hcCh4KQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeCkKKyAgICBkZWYgdGVzdE5lc3Qoc2VsZik6CisgICAgICAgIHByaW50KCd0ZXN0TmVzdCcpCisgICAgICAgIGlubmVyID0gWHRydWN0KHN0cmluZ190aGluZz0iWmVybyIsIGJ5dGVfdGhpbmc9MSwgaTMyX3RoaW5nPS0zLCBpNjRfdGhpbmc9LTUpCisgICAgICAgIHggPSBYdHJ1Y3QyKHN0cnVjdF90aGluZz1pbm5lciwgYnl0ZV90aGluZz0wLCBpMzJfdGhpbmc9MCkKKyAgICAgICAgeSA9IHNlbGYuY2xpZW50LnRlc3ROZXN0KHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeCkKIAotICBkZWYgdGVzdFNldChzZWxmKToKLSAgICBwcmludCgndGVzdFNldCcpCi0gICAgeCA9IHNldChbOCwgMSwgNDJdKQotICAgIHkgPSBzZWxmLmNsaWVudC50ZXN0U2V0KHgpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh5LCB4KQorICAgIGRlZiB0ZXN0TWFwKHNlbGYpOgorICAgICAgICBwcmludCgndGVzdE1hcCcpCisgICAgICAgIHggPSB7MDogMSwgMTogMiwgMjogMywgMzogNCwgLTE6IC0yfQorICAgICAgICB5ID0gc2VsZi5jbGllbnQudGVzdE1hcCh4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHksIHgpCiAKLSAgZGVmIHRlc3RMaXN0KHNlbGYpOgotICAgIHByaW50KCd0ZXN0TGlzdCcpCi0gICAgeCA9IFsxLCA0LCA5LCAtNDJdCi0gICAgeSA9IHNlbGYuY2xpZW50LnRlc3RMaXN0KHgpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh5LCB4KQorICAgIGRlZiB0ZXN0U2V0KHNlbGYpOgorICAgICAgICBwcmludCgndGVzdFNldCcpCisgICAgICAgIHggPSBzZXQoWzgsIDEsIDQyXSkKKyAgICAgICAgeSA9IHNlbGYuY2xpZW50LnRlc3RTZXQoeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LCB4KQogCi0gIGRlZiB0ZXN0RW51bShzZWxmKToKLSAgICB4ID0gTnVtYmVyei5GSVZFCi0gICAgeSA9IHNlbGYuY2xpZW50LnRlc3RFbnVtKHgpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh5LCB4KQorICAgIGRlZiB0ZXN0TGlzdChzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3RMaXN0JykKKyAgICAgICAgeCA9IFsxLCA0LCA5LCAtNDJdCisgICAgICAgIHkgPSBzZWxmLmNsaWVudC50ZXN0TGlzdCh4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHksIHgpCiAKLSAgZGVmIHRlc3RUeXBlZGVmKHNlbGYpOgotICAgIHggPSAweGZmZmZmZmZmZmZmZmZmICMgNyBieXRlcyBvZiAweGZmCi0gICAgeSA9IHNlbGYuY2xpZW50LnRlc3RUeXBlZGVmKHgpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh5LCB4KQorICAgIGRlZiB0ZXN0RW51bShzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3RFbnVtJykKKyAgICAgICAgeCA9IE51bWJlcnouRklWRQorICAgICAgICB5ID0gc2VsZi5jbGllbnQudGVzdEVudW0oeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LCB4KQogCi0gIGRlZiB0ZXN0TWFwTWFwKHNlbGYpOgotICAgICMgZG9lcyBub3Qgd29yazogZGljdCgpIGlzIG5vdCBhIGhhc2hhYmxlIHR5cGUsIHNvIGEgZGljdCgpIGNhbm5vdCBiZSB1c2VkIGFzIGEga2V5IGluIGFub3RoZXIgZGljdCgpCi0gICAgI3ggPSB7IHsxOjEwLCAyOjIwfSwgezE6MTAwLCAyOjIwMCwgMzozMDB9LCB7MToxMDAwLCAyOjIwMDAsIDM6MzAwMCwgNDo0MDAwfSB9Ci0gICAgdHJ5OgotICAgICAgeSA9IHNlbGYuY2xpZW50LnRlc3RNYXBNYXAoKQotICAgIGV4Y2VwdDoKLSAgICAgIHBhc3MKKyAgICBkZWYgdGVzdFR5cGVkZWYoc2VsZik6CisgICAgICAgIHByaW50KCd0ZXN0VHlwZWRlZicpCisgICAgICAgIHggPSAweGZmZmZmZmZmZmZmZmZmICAjIDcgYnl0ZXMgb2YgMHhmZgorICAgICAgICB5ID0gc2VsZi5jbGllbnQudGVzdFR5cGVkZWYoeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LCB4KQogCi0gIGRlZiB0ZXN0TXVsdGkoc2VsZik6Ci0gICAgeHBlY3RlZCA9IFh0cnVjdChzdHJpbmdfdGhpbmc9J0hlbGxvMicsIGJ5dGVfdGhpbmc9NzQsIGkzMl90aGluZz0weGZmMDBmZiwgaTY0X3RoaW5nPTB4ZmZmZmZmZmZkMGQwKQotICAgIHkgPSBzZWxmLmNsaWVudC50ZXN0TXVsdGkoeHBlY3RlZC5ieXRlX3RoaW5nLAotICAgICAgICAgIHhwZWN0ZWQuaTMyX3RoaW5nLAotICAgICAgICAgIHhwZWN0ZWQuaTY0X3RoaW5nLAotICAgICAgICAgIHsgMDonYWJjJyB9LAotICAgICAgICAgIE51bWJlcnouRklWRSwKLSAgICAgICAgICAweGYwZjBmMCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHksIHhwZWN0ZWQpCisgICAgZGVmIHRlc3RNYXBNYXAoc2VsZik6CisgICAgICAgIHByaW50KCd0ZXN0TWFwTWFwJykKKyAgICAgICAgeCA9IHsKKyAgICAgICAgICAgIC00OiB7LTQ6IC00LCAtMzogLTMsIC0yOiAtMiwgLTE6IC0xfSwKKyAgICAgICAgICAgIDQ6IHs0OiA0LCAzOiAzLCAyOiAyLCAxOiAxfSwKKyAgICAgICAgfQorICAgICAgICB5ID0gc2VsZi5jbGllbnQudGVzdE1hcE1hcCg0MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LCB4KQogCi0gIGRlZiB0ZXN0RXhjZXB0aW9uKHNlbGYpOgotICAgIHNlbGYuY2xpZW50LnRlc3RFeGNlcHRpb24oJ1NhZmUnKQotICAgIHRyeToKLSAgICAgIHNlbGYuY2xpZW50LnRlc3RFeGNlcHRpb24oJ1hjZXB0aW9uJykKLSAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgZ290dGVuIGV4Y2VwdGlvbiIpCi0gICAgZXhjZXB0IFhjZXB0aW9uLCB4OgotICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LmVycm9yQ29kZSwgMTAwMSkKLSAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5tZXNzYWdlLCAnWGNlcHRpb24nKQotICAgICAgIyBUT0RPIGVuc3VyZSBzYW1lIGJlaGF2aW9yIGZvciByZXByIHdpdGhpbiBnZW5lcmF0ZWQgcHl0aG9uIHZhcmlhbnRzCi0gICAgICAjIGVuc3VyZSBleGNlcHRpb24ncyByZXByIG1ldGhvZCB3b3JrcwotICAgICAgI3hfcmVwciA9IHJlcHIoeCkKLSAgICAgICNzZWxmLmFzc2VydEVxdWFsKHhfcmVwciwgJ1hjZXB0aW9uKGVycm9yQ29kZT0xMDAxLCBtZXNzYWdlPVwnWGNlcHRpb25cJyknKQorICAgIGRlZiB0ZXN0TXVsdGkoc2VsZik6CisgICAgICAgIHByaW50KCd0ZXN0TXVsdGknKQorICAgICAgICB4cGVjdGVkID0gWHRydWN0KHN0cmluZ190aGluZz0nSGVsbG8yJywgYnl0ZV90aGluZz03NCwgaTMyX3RoaW5nPTB4ZmYwMGZmLCBpNjRfdGhpbmc9MHhmZmZmZmZmZmQwZDApCisgICAgICAgIHkgPSBzZWxmLmNsaWVudC50ZXN0TXVsdGkoeHBlY3RlZC5ieXRlX3RoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhwZWN0ZWQuaTMyX3RoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhwZWN0ZWQuaTY0X3RoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswOiAnYWJjJ30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyei5GSVZFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZjBmMGYwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHksIHhwZWN0ZWQpCiAKLSAgICB0cnk6Ci0gICAgICBzZWxmLmNsaWVudC50ZXN0RXhjZXB0aW9uKCJ0aHJvd191bmRlY2xhcmVkIikKLSAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgdGhyb3duIGV4Y2VwdGlvbiIpCi0gICAgZXhjZXB0IEV4Y2VwdGlvbjogIyB0eXBlIGlzIHVuZGVmaW5lZAotICAgICAgcGFzcworICAgIGRlZiB0ZXN0RXhjZXB0aW9uKHNlbGYpOgorICAgICAgICBwcmludCgndGVzdEV4Y2VwdGlvbicpCisgICAgICAgIHNlbGYuY2xpZW50LnRlc3RFeGNlcHRpb24oJ1NhZmUnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmNsaWVudC50ZXN0RXhjZXB0aW9uKCdYY2VwdGlvbicpCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIGdvdHRlbiBleGNlcHRpb24iKQorICAgICAgICBleGNlcHQgWGNlcHRpb24gYXMgeDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5lcnJvckNvZGUsIDEwMDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgubWVzc2FnZSwgJ1hjZXB0aW9uJykKKyAgICAgICAgICAgICMgVE9ETyBlbnN1cmUgc2FtZSBiZWhhdmlvciBmb3IgcmVwciB3aXRoaW4gZ2VuZXJhdGVkIHB5dGhvbiB2YXJpYW50cworICAgICAgICAgICAgIyBlbnN1cmUgZXhjZXB0aW9uJ3MgcmVwciBtZXRob2Qgd29ya3MKKyAgICAgICAgICAgICMgeF9yZXByID0gcmVwcih4KQorICAgICAgICAgICAgIyBzZWxmLmFzc2VydEVxdWFsKHhfcmVwciwgJ1hjZXB0aW9uKGVycm9yQ29kZT0xMDAxLCBtZXNzYWdlPVwnWGNlcHRpb25cJyknKQogCi0gIGRlZiB0ZXN0T25ld2F5KHNlbGYpOgotICAgIHN0YXJ0ID0gdGltZS50aW1lKCkKLSAgICBzZWxmLmNsaWVudC50ZXN0T25ld2F5KDEpICMgdHlwZSBpcyBpbnQsIG5vdCBmbG9hdAotICAgIGVuZCA9IHRpbWUudGltZSgpCi0gICAgc2VsZi5hc3NlcnRUcnVlKGVuZCAtIHN0YXJ0IDwgMywKLSAgICAgICAgICAgICAgICAgICAgIm9uZXdheSBzbGVlcCB0b29rICVmIHNlYyIgJSAoZW5kIC0gc3RhcnQpKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmNsaWVudC50ZXN0RXhjZXB0aW9uKCdURXhjZXB0aW9uJykKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgZ290dGVuIGV4Y2VwdGlvbiIpCisgICAgICAgIGV4Y2VwdCBURXhjZXB0aW9uIGFzIHg6CisgICAgICAgICAgICBwYXNzCiAKLSAgZGVmIHRlc3RPbmV3YXlUaGVuTm9ybWFsKHNlbGYpOgotICAgIHNlbGYuY2xpZW50LnRlc3RPbmV3YXkoMSkgIyB0eXBlIGlzIGludCwgbm90IGZsb2F0Ci0gICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0U3RyaW5nKCdQeXRob24nKSwgJ1B5dGhvbicpCisgICAgICAgICMgU2hvdWxkIG5vdCB0aHJvdworICAgICAgICBzZWxmLmNsaWVudC50ZXN0RXhjZXB0aW9uKCdzdWNjZXNzJykKKworICAgIGRlZiB0ZXN0TXVsdGlFeGNlcHRpb24oc2VsZik6CisgICAgICAgIHByaW50KCd0ZXN0TXVsdGlFeGNlcHRpb24nKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmNsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oJ1hjZXB0aW9uJywgJ2lnbm9yZScpCisgICAgICAgIGV4Y2VwdCBYY2VwdGlvbiBhcyBleDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXguZXJyb3JDb2RlLCAxMDAxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleC5tZXNzYWdlLCAnVGhpcyBpcyBhbiBYY2VwdGlvbicpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKCdYY2VwdGlvbjInLCAnaWdub3JlJykKKyAgICAgICAgZXhjZXB0IFhjZXB0aW9uMiBhcyBleDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXguZXJyb3JDb2RlLCAyMDAyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleC5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nLCAnVGhpcyBpcyBhbiBYY2VwdGlvbjInKQorCisgICAgICAgIHkgPSBzZWxmLmNsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oJ3N1Y2Nlc3MnLCAnZm9vYmFyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LnN0cmluZ190aGluZywgJ2Zvb2JhcicpCisKKyAgICBkZWYgdGVzdE9uZXdheShzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3RPbmV3YXknKQorICAgICAgICBzdGFydCA9IHRpbWUudGltZSgpCisgICAgICAgIHNlbGYuY2xpZW50LnRlc3RPbmV3YXkoMSkgICMgdHlwZSBpcyBpbnQsIG5vdCBmbG9hdAorICAgICAgICBlbmQgPSB0aW1lLnRpbWUoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZW5kIC0gc3RhcnQgPCAzLAorICAgICAgICAgICAgICAgICAgICAgICAgIm9uZXdheSBzbGVlcCB0b29rICVmIHNlYyIgJSAoZW5kIC0gc3RhcnQpKQorCisgICAgZGVmIHRlc3RPbmV3YXlUaGVuTm9ybWFsKHNlbGYpOgorICAgICAgICBwcmludCgndGVzdE9uZXdheVRoZW5Ob3JtYWwnKQorICAgICAgICBzZWxmLmNsaWVudC50ZXN0T25ld2F5KDEpICAjIHR5cGUgaXMgaW50LCBub3QgZmxvYXQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0U3RyaW5nKCdQeXRob24nKSwgJ1B5dGhvbicpCiAKIAotY2xhc3MgTm9ybWFsQmluYXJ5VGVzdChBYnN0cmFjdFRlc3QpOgotICBwcm90b2NvbF9mYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKQorY2xhc3MgTXVsdGlwbGV4ZWRPcHRpb25hbFRlc3QoQWJzdHJhY3RUZXN0KToKKyAgICBkZWYgZ2V0X3Byb3RvY29sMihzZWxmLCB0cmFuc3BvcnQpOgorICAgICAgICByZXR1cm4gTm9uZQogCi1jbGFzcyBDb21wYWN0VGVzdChBYnN0cmFjdFRlc3QpOgotICBwcm90b2NvbF9mYWN0b3J5ID0gVENvbXBhY3RQcm90b2NvbC5UQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpCiAKLWNsYXNzIEpTT05UZXN0KEFic3RyYWN0VGVzdCk6Ci0gIHByb3RvY29sX2ZhY3RvcnkgPSBUSlNPTlByb3RvY29sLlRKU09OUHJvdG9jb2xGYWN0b3J5KCkKK2NsYXNzIEJpbmFyeVRlc3QoTXVsdGlwbGV4ZWRPcHRpb25hbFRlc3QpOgorICAgIGRlZiBnZXRfcHJvdG9jb2woc2VsZiwgdHJhbnNwb3J0KToKKyAgICAgICAgcmV0dXJuIFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KQogCi1jbGFzcyBBY2NlbGVyYXRlZEJpbmFyeVRlc3QoQWJzdHJhY3RUZXN0KToKLSAgcHJvdG9jb2xfZmFjdG9yeSA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkoKQorCitjbGFzcyBNdWx0aXBsZXhlZEJpbmFyeVRlc3QoTXVsdGlwbGV4ZWRPcHRpb25hbFRlc3QpOgorICAgIGRlZiBnZXRfcHJvdG9jb2woc2VsZiwgdHJhbnNwb3J0KToKKyAgICAgICAgd3JhcHBlZF9wcm90byA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KQorICAgICAgICByZXR1cm4gVE11bHRpcGxleGVkUHJvdG9jb2wuVE11bHRpcGxleGVkUHJvdG9jb2wod3JhcHBlZF9wcm90bywgIlRocmlmdFRlc3QiKQorCisgICAgZGVmIGdldF9wcm90b2NvbDIoc2VsZiwgdHJhbnNwb3J0KToKKyAgICAgICAgd3JhcHBlZF9wcm90byA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KQorICAgICAgICByZXR1cm4gVE11bHRpcGxleGVkUHJvdG9jb2wuVE11bHRpcGxleGVkUHJvdG9jb2wod3JhcHBlZF9wcm90bywgIlNlY29uZFNlcnZpY2UiKQorCisKK2NsYXNzIEFjY2VsZXJhdGVkQmluYXJ5VGVzdChNdWx0aXBsZXhlZE9wdGlvbmFsVGVzdCk6CisgICAgZGVmIGdldF9wcm90b2NvbChzZWxmLCB0cmFuc3BvcnQpOgorICAgICAgICByZXR1cm4gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeShmYWxsYmFjaz1GYWxzZSkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KQorCisKK2NsYXNzIE11bHRpcGxleGVkQWNjZWxlcmF0ZWRCaW5hcnlUZXN0KE11bHRpcGxleGVkT3B0aW9uYWxUZXN0KToKKyAgICBkZWYgZ2V0X3Byb3RvY29sKHNlbGYsIHRyYW5zcG9ydCk6CisgICAgICAgIHdyYXBwZWRfcHJvdG8gPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KGZhbGxiYWNrPUZhbHNlKS5nZXRQcm90b2NvbCh0cmFuc3BvcnQpCisgICAgICAgIHJldHVybiBUTXVsdGlwbGV4ZWRQcm90b2NvbC5UTXVsdGlwbGV4ZWRQcm90b2NvbCh3cmFwcGVkX3Byb3RvLCAiVGhyaWZ0VGVzdCIpCisKKyAgICBkZWYgZ2V0X3Byb3RvY29sMihzZWxmLCB0cmFuc3BvcnQpOgorICAgICAgICB3cmFwcGVkX3Byb3RvID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeShmYWxsYmFjaz1GYWxzZSkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KQorICAgICAgICByZXR1cm4gVE11bHRpcGxleGVkUHJvdG9jb2wuVE11bHRpcGxleGVkUHJvdG9jb2wod3JhcHBlZF9wcm90bywgIlNlY29uZFNlcnZpY2UiKQorCisKK2NsYXNzIENvbXBhY3RUZXN0KE11bHRpcGxleGVkT3B0aW9uYWxUZXN0KToKKyAgICBkZWYgZ2V0X3Byb3RvY29sKHNlbGYsIHRyYW5zcG9ydCk6CisgICAgICAgIHJldHVybiBUQ29tcGFjdFByb3RvY29sLlRDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KQorCisKK2NsYXNzIE11bHRpcGxleGVkQ29tcGFjdFRlc3QoTXVsdGlwbGV4ZWRPcHRpb25hbFRlc3QpOgorICAgIGRlZiBnZXRfcHJvdG9jb2woc2VsZiwgdHJhbnNwb3J0KToKKyAgICAgICAgd3JhcHBlZF9wcm90byA9IFRDb21wYWN0UHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKS5nZXRQcm90b2NvbCh0cmFuc3BvcnQpCisgICAgICAgIHJldHVybiBUTXVsdGlwbGV4ZWRQcm90b2NvbC5UTXVsdGlwbGV4ZWRQcm90b2NvbCh3cmFwcGVkX3Byb3RvLCAiVGhyaWZ0VGVzdCIpCisKKyAgICBkZWYgZ2V0X3Byb3RvY29sMihzZWxmLCB0cmFuc3BvcnQpOgorICAgICAgICB3cmFwcGVkX3Byb3RvID0gVENvbXBhY3RQcm90b2NvbC5UQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpLmdldFByb3RvY29sKHRyYW5zcG9ydCkKKyAgICAgICAgcmV0dXJuIFRNdWx0aXBsZXhlZFByb3RvY29sLlRNdWx0aXBsZXhlZFByb3RvY29sKHdyYXBwZWRfcHJvdG8sICJTZWNvbmRTZXJ2aWNlIikKKworCitjbGFzcyBBY2NlbGVyYXRlZENvbXBhY3RUZXN0KE11bHRpcGxleGVkT3B0aW9uYWxUZXN0KToKKyAgICBkZWYgZ2V0X3Byb3RvY29sKHNlbGYsIHRyYW5zcG9ydCk6CisgICAgICAgIHJldHVybiBUQ29tcGFjdFByb3RvY29sLlRDb21wYWN0UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkoZmFsbGJhY2s9RmFsc2UpLmdldFByb3RvY29sKHRyYW5zcG9ydCkKKworCitjbGFzcyBNdWx0aXBsZXhlZEFjY2VsZXJhdGVkQ29tcGFjdFRlc3QoTXVsdGlwbGV4ZWRPcHRpb25hbFRlc3QpOgorICAgIGRlZiBnZXRfcHJvdG9jb2woc2VsZiwgdHJhbnNwb3J0KToKKyAgICAgICAgd3JhcHBlZF9wcm90byA9IFRDb21wYWN0UHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeShmYWxsYmFjaz1GYWxzZSkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KQorICAgICAgICByZXR1cm4gVE11bHRpcGxleGVkUHJvdG9jb2wuVE11bHRpcGxleGVkUHJvdG9jb2wod3JhcHBlZF9wcm90bywgIlRocmlmdFRlc3QiKQorCisgICAgZGVmIGdldF9wcm90b2NvbDIoc2VsZiwgdHJhbnNwb3J0KToKKyAgICAgICAgd3JhcHBlZF9wcm90byA9IFRDb21wYWN0UHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeShmYWxsYmFjaz1GYWxzZSkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KQorICAgICAgICByZXR1cm4gVE11bHRpcGxleGVkUHJvdG9jb2wuVE11bHRpcGxleGVkUHJvdG9jb2wod3JhcHBlZF9wcm90bywgIlNlY29uZFNlcnZpY2UiKQorCisKK2NsYXNzIEpTT05UZXN0KE11bHRpcGxleGVkT3B0aW9uYWxUZXN0KToKKyAgICBkZWYgZ2V0X3Byb3RvY29sKHNlbGYsIHRyYW5zcG9ydCk6CisgICAgICAgIHJldHVybiBUSlNPTlByb3RvY29sLlRKU09OUHJvdG9jb2xGYWN0b3J5KCkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KQorCisKK2NsYXNzIE11bHRpcGxleGVkSlNPTlRlc3QoTXVsdGlwbGV4ZWRPcHRpb25hbFRlc3QpOgorICAgIGRlZiBnZXRfcHJvdG9jb2woc2VsZiwgdHJhbnNwb3J0KToKKyAgICAgICAgd3JhcHBlZF9wcm90byA9IFRKU09OUHJvdG9jb2wuVEpTT05Qcm90b2NvbEZhY3RvcnkoKS5nZXRQcm90b2NvbCh0cmFuc3BvcnQpCisgICAgICAgIHJldHVybiBUTXVsdGlwbGV4ZWRQcm90b2NvbC5UTXVsdGlwbGV4ZWRQcm90b2NvbCh3cmFwcGVkX3Byb3RvLCAiVGhyaWZ0VGVzdCIpCisKKyAgICBkZWYgZ2V0X3Byb3RvY29sMihzZWxmLCB0cmFuc3BvcnQpOgorICAgICAgICB3cmFwcGVkX3Byb3RvID0gVEpTT05Qcm90b2NvbC5USlNPTlByb3RvY29sRmFjdG9yeSgpLmdldFByb3RvY29sKHRyYW5zcG9ydCkKKyAgICAgICAgcmV0dXJuIFRNdWx0aXBsZXhlZFByb3RvY29sLlRNdWx0aXBsZXhlZFByb3RvY29sKHdyYXBwZWRfcHJvdG8sICJTZWNvbmRTZXJ2aWNlIikKKworCitjbGFzcyBIZWFkZXJUZXN0KE11bHRpcGxleGVkT3B0aW9uYWxUZXN0KToKKyAgICBkZWYgZ2V0X3Byb3RvY29sKHNlbGYsIHRyYW5zcG9ydCk6CisgICAgICAgIGZhY3RvcnkgPSBUSGVhZGVyUHJvdG9jb2wuVEhlYWRlclByb3RvY29sRmFjdG9yeSgpCisgICAgICAgIHJldHVybiBmYWN0b3J5LmdldFByb3RvY29sKHRyYW5zcG9ydCkKKwogCiBkZWYgc3VpdGUoKToKLSAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQotICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKLSAgaWYgb3B0aW9ucy5wcm90byA9PSAnYmluYXJ5JzogIyBsb29rIGZvciAtLXByb3RvIG9uIGNtZGxpbmUKLSAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoTm9ybWFsQmluYXJ5VGVzdCkpCi0gIGVsaWYgb3B0aW9ucy5wcm90byA9PSAnYWNjZWwnOgotICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShBY2NlbGVyYXRlZEJpbmFyeVRlc3QpKQotICBlbGlmIG9wdGlvbnMucHJvdG8gPT0gJ2NvbXBhY3QnOgotICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShDb21wYWN0VGVzdCkpCi0gIGVsaWYgb3B0aW9ucy5wcm90byA9PSAnanNvbic6Ci0gICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKEpTT05UZXN0KSkKLSAgZWxzZToKLSAgICByYWlzZSBBc3NlcnRpb25FcnJvcignVW5rbm93biBwcm90b2NvbCBnaXZlbiB3aXRoIC0tcHJvdG9jb2w6ICVzJyAlIG9wdGlvbnMucHJvdG8pCi0gIHJldHVybiBzdWl0ZQorICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKyAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKyAgICBpZiBvcHRpb25zLnByb3RvID09ICdiaW5hcnknOiAgIyBsb29rIGZvciAtLXByb3RvIG9uIGNtZGxpbmUKKyAgICAgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKEJpbmFyeVRlc3QpKQorICAgIGVsaWYgb3B0aW9ucy5wcm90byA9PSAnYWNjZWwnOgorICAgICAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoQWNjZWxlcmF0ZWRCaW5hcnlUZXN0KSkKKyAgICBlbGlmIG9wdGlvbnMucHJvdG8gPT0gJ2FjY2VsYyc6CisgICAgICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShBY2NlbGVyYXRlZENvbXBhY3RUZXN0KSkKKyAgICBlbGlmIG9wdGlvbnMucHJvdG8gPT0gJ2NvbXBhY3QnOgorICAgICAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoQ29tcGFjdFRlc3QpKQorICAgIGVsaWYgb3B0aW9ucy5wcm90byA9PSAnaGVhZGVyJzoKKyAgICAgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKEhlYWRlclRlc3QpKQorICAgIGVsaWYgb3B0aW9ucy5wcm90byA9PSAnanNvbic6CisgICAgICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShKU09OVGVzdCkpCisgICAgZWxpZiBvcHRpb25zLnByb3RvID09ICdtdWx0aSc6CisgICAgICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShNdWx0aXBsZXhlZEJpbmFyeVRlc3QpKQorICAgIGVsaWYgb3B0aW9ucy5wcm90byA9PSAnbXVsdGlhJzoKKyAgICAgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKE11bHRpcGxleGVkQWNjZWxlcmF0ZWRCaW5hcnlUZXN0KSkKKyAgICBlbGlmIG9wdGlvbnMucHJvdG8gPT0gJ211bHRpYWMnOgorICAgICAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoTXVsdGlwbGV4ZWRBY2NlbGVyYXRlZENvbXBhY3RUZXN0KSkKKyAgICBlbGlmIG9wdGlvbnMucHJvdG8gPT0gJ211bHRpYyc6CisgICAgICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShNdWx0aXBsZXhlZENvbXBhY3RUZXN0KSkKKyAgICBlbGlmIG9wdGlvbnMucHJvdG8gPT0gJ211bHRpaic6CisgICAgICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShNdWx0aXBsZXhlZEpTT05UZXN0KSkKKyAgICBlbHNlOgorICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcignVW5rbm93biBwcm90b2NvbCBnaXZlbiB3aXRoIC0tcHJvdG9jb2w6ICVzJyAlIG9wdGlvbnMucHJvdG8pCisgICAgcmV0dXJuIHN1aXRlCisKIAogY2xhc3MgT3duQXJnc1Rlc3RQcm9ncmFtKHVuaXR0ZXN0LlRlc3RQcm9ncmFtKToKICAgICBkZWYgcGFyc2VBcmdzKHNlbGYsIGFyZ3YpOgogICAgICAgICBpZiBhcmdzOgogICAgICAgICAgICAgc2VsZi50ZXN0TmFtZXMgPSBhcmdzCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLnRlc3ROYW1lcyA9IChzZWxmLmRlZmF1bHRUZXN0LCkKKyAgICAgICAgICAgIHNlbGYudGVzdE5hbWVzID0gKFtzZWxmLmRlZmF1bHRUZXN0XSkKICAgICAgICAgc2VsZi5jcmVhdGVUZXN0cygpCiAKKwogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLSAgT3duQXJnc1Rlc3RQcm9ncmFtKGRlZmF1bHRUZXN0PSJzdWl0ZSIsIHRlc3RSdW5uZXI9dW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIodmVyYm9zaXR5PTEpKQorICAgIHBhcnNlciA9IE9wdGlvblBhcnNlcigpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy0tbGlicHlkaXInLCB0eXBlPSdzdHJpbmcnLCBkZXN0PSdsaWJweWRpcicsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0naW5jbHVkZSB0aGlzIGRpcmVjdG9yeSBpbiBzeXMucGF0aCBmb3IgbG9jYXRpbmcgbGlicmFyeSBjb2RlJykKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLS1nZW5weWRpcicsIHR5cGU9J3N0cmluZycsIGRlc3Q9J2dlbnB5ZGlyJywKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdpbmNsdWRlIHRoaXMgZGlyZWN0b3J5IGluIHN5cy5wYXRoIGZvciBsb2NhdGluZyBnZW5lcmF0ZWQgY29kZScpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oIi0tcG9ydCIsIHR5cGU9ImludCIsIGRlc3Q9InBvcnQiLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9ImNvbm5lY3QgdG8gc2VydmVyIGF0IHBvcnQiKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCItLWhvc3QiLCB0eXBlPSJzdHJpbmciLCBkZXN0PSJob3N0IiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJjb25uZWN0IHRvIHNlcnZlciIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oIi0temxpYiIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGRlc3Q9InpsaWIiLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9InVzZSB6bGliIHdyYXBwZXIgZm9yIGNvbXByZXNzZWQgdHJhbnNwb3J0IikKKyAgICBwYXJzZXIuYWRkX29wdGlvbigiLS1zc2wiLCBhY3Rpb249InN0b3JlX3RydWUiLCBkZXN0PSJzc2wiLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9InVzZSBTU0wgZm9yIGVuY3J5cHRlZCB0cmFuc3BvcnQiKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCItLWh0dHAiLCBkZXN0PSJodHRwX3BhdGgiLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IlVzZSB0aGUgSFRUUCB0cmFuc3BvcnQgd2l0aCB0aGUgc3BlY2lmaWVkIHBhdGgiKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCctdicsICctLXZlcmJvc2UnLCBhY3Rpb249InN0b3JlX2NvbnN0IiwKKyAgICAgICAgICAgICAgICAgICAgICBkZXN0PSJ2ZXJib3NlIiwgY29uc3Q9MiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJ2ZXJib3NlIG91dHB1dCIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy1xJywgJy0tcXVpZXQnLCBhY3Rpb249InN0b3JlX2NvbnN0IiwKKyAgICAgICAgICAgICAgICAgICAgICBkZXN0PSJ2ZXJib3NlIiwgY29uc3Q9MCwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJtaW5pbWFsIG91dHB1dCIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy0tcHJvdG9jb2wnLCBkZXN0PSJwcm90byIsIHR5cGU9InN0cmluZyIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0icHJvdG9jb2wgdG8gdXNlLCBvbmUgb2Y6IGFjY2VsLCBhY2NlbGMsIGJpbmFyeSwgY29tcGFjdCwgaGVhZGVyLCBqc29uLCBtdWx0aSwgbXVsdGlhLCBtdWx0aWFjLCBtdWx0aWMsIG11bHRpaiIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy0tdHJhbnNwb3J0JywgZGVzdD0idHJhbnMiLCB0eXBlPSJzdHJpbmciLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9InRyYW5zcG9ydCB0byB1c2UsIG9uZSBvZjogYnVmZmVyZWQsIGZyYW1lZCwgaHR0cCIpCisgICAgcGFyc2VyLnNldF9kZWZhdWx0cyhmcmFtZWQ9RmFsc2UsIGh0dHBfcGF0aD1Ob25lLCB2ZXJib3NlPTEsIGhvc3Q9J2xvY2FsaG9zdCcsIHBvcnQ9OTA5MCwgcHJvdG89J2JpbmFyeScpCisgICAgb3B0aW9ucywgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKKworICAgIGlmIG9wdGlvbnMuZ2VucHlkaXI6CisgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBvcy5wYXRoLmpvaW4oU0NSSVBUX0RJUiwgb3B0aW9ucy5nZW5weWRpcikpCisgICAgc3lzLnBhdGguaW5zZXJ0KDAsIGxvY2FsX2xpYnBhdGgoKSkKKworICAgIGlmIG9wdGlvbnMuaHR0cF9wYXRoOgorICAgICAgICBvcHRpb25zLnRyYW5zID0gJ2h0dHAnCisKKyAgICBmcm9tIFRocmlmdFRlc3QgaW1wb3J0IFNlY29uZFNlcnZpY2UKKyAgICBmcm9tIFRocmlmdFRlc3QgaW1wb3J0IFRocmlmdFRlc3QKKyAgICBmcm9tIFRocmlmdFRlc3QudHR5cGVzIGltcG9ydCBYdHJ1Y3QsIFh0cnVjdDIsIE51bWJlcnosIFhjZXB0aW9uLCBYY2VwdGlvbjIKKyAgICBmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRFeGNlcHRpb24KKyAgICBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKKyAgICBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRTb2NrZXQKKyAgICBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRIdHRwQ2xpZW50CisgICAgZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUWmxpYlRyYW5zcG9ydAorICAgIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKKyAgICBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVENvbXBhY3RQcm90b2NvbAorICAgIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUSGVhZGVyUHJvdG9jb2wKKyAgICBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEpTT05Qcm90b2NvbAorICAgIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUTXVsdGlwbGV4ZWRQcm90b2NvbAorCisgICAgT3duQXJnc1Rlc3RQcm9ncmFtKGRlZmF1bHRUZXN0PSJzdWl0ZSIsIHRlc3RSdW5uZXI9dW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIodmVyYm9zaXR5PTEpKQpkaWZmIC0tZ2l0IGEvdGVzdC9weS9UZXN0RW9mLnB5IGIvdGVzdC9weS9UZXN0RW9mLnB5CmluZGV4IGE5ZDgxZjEuLjBiNGE4MjkgMTAwNzU1Ci0tLSBhL3Rlc3QvcHkvVGVzdEVvZi5weQorKysgYi90ZXN0L3B5L1Rlc3RFb2YucHkKQEAgLTE5LDExOCArMTksMTE0IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1pbXBvcnQgc3lzLCBnbG9iCi1mcm9tIG9wdHBhcnNlIGltcG9ydCBPcHRpb25QYXJzZXIKLXBhcnNlciA9IE9wdGlvblBhcnNlcigpCi1wYXJzZXIuYWRkX29wdGlvbignLS1nZW5weWRpcicsIHR5cGU9J3N0cmluZycsIGRlc3Q9J2dlbnB5ZGlyJywgZGVmYXVsdD0nZ2VuLXB5JykKLW9wdGlvbnMsIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCi1kZWwgc3lzLmFyZ3ZbMTpdICMgY2xlYW4gdXAgaGFjayBzbyB1bml0dGVzdCBkb2Vzbid0IGNvbXBsYWluCi1zeXMucGF0aC5pbnNlcnQoMCwgb3B0aW9ucy5nZW5weWRpcikKLXN5cy5wYXRoLmluc2VydCgwLCBnbG9iLmdsb2IoJy4uLy4uL2xpYi9weS9idWlsZC9saWIuKicpWzBdKQotCi1mcm9tIFRocmlmdFRlc3QgaW1wb3J0IFRocmlmdFRlc3QKLWZyb20gVGhyaWZ0VGVzdC50dHlwZXMgaW1wb3J0ICoKK2Zyb20gVGhyaWZ0VGVzdC50dHlwZXMgaW1wb3J0IFh0cnVjdAogZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0Ci1mcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRTb2NrZXQKIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQ29tcGFjdFByb3RvY29sCiBpbXBvcnQgdW5pdHRlc3QKLWltcG9ydCB0aW1lCisKIAogY2xhc3MgVGVzdEVvZih1bml0dGVzdC5UZXN0Q2FzZSk6CiAKLSAgZGVmIG1ha2VfZGF0YShzZWxmLCBwZmFjdG9yeT1Ob25lKToKLSAgICB0cmFucyA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCi0gICAgaWYgcGZhY3Rvcnk6Ci0gICAgICBwcm90ID0gcGZhY3RvcnkuZ2V0UHJvdG9jb2wodHJhbnMpCi0gICAgZWxzZToKLSAgICAgIHByb3QgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sKHRyYW5zKQorICAgIGRlZiBtYWtlX2RhdGEoc2VsZiwgcGZhY3Rvcnk9Tm9uZSk6CisgICAgICAgIHRyYW5zID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkKKyAgICAgICAgaWYgcGZhY3Rvcnk6CisgICAgICAgICAgICBwcm90ID0gcGZhY3RvcnkuZ2V0UHJvdG9jb2wodHJhbnMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcm90ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbCh0cmFucykKIAotICAgIHggPSBYdHJ1Y3QoKQotICAgIHguc3RyaW5nX3RoaW5nID0gIlplcm8iCi0gICAgeC5ieXRlX3RoaW5nID0gMAorICAgICAgICB4ID0gWHRydWN0KCkKKyAgICAgICAgeC5zdHJpbmdfdGhpbmcgPSAiWmVybyIKKyAgICAgICAgeC5ieXRlX3RoaW5nID0gMAogCi0gICAgeC53cml0ZShwcm90KQorICAgICAgICB4LndyaXRlKHByb3QpCiAKLSAgICB4ID0gWHRydWN0KCkKLSAgICB4LnN0cmluZ190aGluZyA9ICJPbmUiCi0gICAgeC5ieXRlX3RoaW5nID0gMQorICAgICAgICB4ID0gWHRydWN0KCkKKyAgICAgICAgeC5zdHJpbmdfdGhpbmcgPSAiT25lIgorICAgICAgICB4LmJ5dGVfdGhpbmcgPSAxCiAKLSAgICB4LndyaXRlKHByb3QpCisgICAgICAgIHgud3JpdGUocHJvdCkKIAotICAgIHJldHVybiB0cmFucy5nZXR2YWx1ZSgpCisgICAgICAgIHJldHVybiB0cmFucy5nZXR2YWx1ZSgpCiAKLSAgZGVmIHRlc3RUcmFuc3BvcnRSZWFkQWxsKHNlbGYpOgotICAgICIiIlRlc3QgdGhhdCByZWFkQWxsIG9uIGFueSB0eXBlIG9mIHRyYW5zcG9ydCB0aHJvd3MgYW4gRU9GRXJyb3IiIiIKLSAgICB0cmFucyA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihzZWxmLm1ha2VfZGF0YSgpKQotICAgIHRyYW5zLnJlYWRBbGwoMSkKKyAgICBkZWYgdGVzdFRyYW5zcG9ydFJlYWRBbGwoc2VsZik6CisgICAgICAgICIiIlRlc3QgdGhhdCByZWFkQWxsIG9uIGFueSB0eXBlIG9mIHRyYW5zcG9ydCB0aHJvd3MgYW4gRU9GRXJyb3IiIiIKKyAgICAgICAgdHJhbnMgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoc2VsZi5tYWtlX2RhdGEoKSkKKyAgICAgICAgdHJhbnMucmVhZEFsbCgxKQogCi0gICAgdHJ5OgotICAgICAgdHJhbnMucmVhZEFsbCgxMDAwMCkKLSAgICBleGNlcHQgRU9GRXJyb3I6Ci0gICAgICByZXR1cm4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdHJhbnMucmVhZEFsbCgxMDAwMCkKKyAgICAgICAgZXhjZXB0IEVPRkVycm9yOgorICAgICAgICAgICAgcmV0dXJuCiAKLSAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIGdvdHRlbiBFT0ZFcnJvciIpCisgICAgICAgIHNlbGYuZmFpbCgiU2hvdWxkIGhhdmUgZ290dGVuIEVPRkVycm9yIikKIAotICBkZWYgZW9mVGVzdEhlbHBlcihzZWxmLCBwZmFjdG9yeSk6Ci0gICAgdHJhbnMgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoc2VsZi5tYWtlX2RhdGEocGZhY3RvcnkpKQotICAgIHByb3QgPSBwZmFjdG9yeS5nZXRQcm90b2NvbCh0cmFucykKKyAgICBkZWYgZW9mVGVzdEhlbHBlcihzZWxmLCBwZmFjdG9yeSk6CisgICAgICAgIHRyYW5zID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKHNlbGYubWFrZV9kYXRhKHBmYWN0b3J5KSkKKyAgICAgICAgcHJvdCA9IHBmYWN0b3J5LmdldFByb3RvY29sKHRyYW5zKQogCi0gICAgeCA9IFh0cnVjdCgpCi0gICAgeC5yZWFkKHByb3QpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh4LnN0cmluZ190aGluZywgIlplcm8iKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5ieXRlX3RoaW5nLCAwKQotCi0gICAgeCA9IFh0cnVjdCgpCi0gICAgeC5yZWFkKHByb3QpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh4LnN0cmluZ190aGluZywgIk9uZSIpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh4LmJ5dGVfdGhpbmcsIDEpCi0KLSAgICB0cnk6Ci0gICAgICB4ID0gWHRydWN0KCkKLSAgICAgIHgucmVhZChwcm90KQotICAgIGV4Y2VwdCBFT0ZFcnJvcjoKLSAgICAgIHJldHVybgotCi0gICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSBnb3R0ZW4gRU9GRXJyb3IiKQotCi0gIGRlZiBlb2ZUZXN0SGVscGVyU3RyZXNzKHNlbGYsIHBmYWN0b3J5KToKLSAgICAiIiJUZWVzdCB0aGUgYWJpbGl0eSBvZiBUQmluYXJ5UHJvdG9jb2wgdG8gZGVhbCB3aXRoIHRoZSByZW1vdmFsIG9mIGV2ZXJ5IGJ5dGUgaW4gdGhlIGZpbGUiIiIKLSAgICAjIFRPRE86IHdlIHNob3VsZCBtYWtlIHN1cmUgdGhpcyBjb3ZlcnMgbW9yZSBvZiB0aGUgY29kZSBwYXRocwotCi0gICAgZGF0YSA9IHNlbGYubWFrZV9kYXRhKHBmYWN0b3J5KQotICAgIGZvciBpIGluIHhyYW5nZSgwLCBsZW4oZGF0YSkgKyAxKToKLSAgICAgIHRyYW5zID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKGRhdGFbMDppXSkKLSAgICAgIHByb3QgPSBwZmFjdG9yeS5nZXRQcm90b2NvbCh0cmFucykKLSAgICAgIHRyeToKICAgICAgICAgeCA9IFh0cnVjdCgpCiAgICAgICAgIHgucmVhZChwcm90KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguc3RyaW5nX3RoaW5nLCAiWmVybyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5ieXRlX3RoaW5nLCAwKQorCisgICAgICAgIHggPSBYdHJ1Y3QoKQogICAgICAgICB4LnJlYWQocHJvdCkKLSAgICAgICAgeC5yZWFkKHByb3QpCi0gICAgICBleGNlcHQgRU9GRXJyb3I6Ci0gICAgICAgIGNvbnRpbnVlCi0gICAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIGdvdHRlbiBhbiBFT0ZFcnJvciIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5zdHJpbmdfdGhpbmcsICJPbmUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguYnl0ZV90aGluZywgMSkKIAotICBkZWYgdGVzdEJpbmFyeVByb3RvY29sRW9mKHNlbGYpOgotICAgICIiIlRlc3QgdGhhdCBUQmluYXJ5UHJvdG9jb2wgdGhyb3dzIGFuIEVPRkVycm9yIHdoZW4gaXQgcmVhY2hlcyB0aGUgZW5kIG9mIHRoZSBzdHJlYW0iIiIKLSAgICBzZWxmLmVvZlRlc3RIZWxwZXIoVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkKLSAgICBzZWxmLmVvZlRlc3RIZWxwZXJTdHJlc3MoVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgeCA9IFh0cnVjdCgpCisgICAgICAgICAgICB4LnJlYWQocHJvdCkKKyAgICAgICAgZXhjZXB0IEVPRkVycm9yOgorICAgICAgICAgICAgcmV0dXJuCiAKLSAgZGVmIHRlc3RCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRW9mKHNlbGYpOgotICAgICIiIlRlc3QgdGhhdCBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCB0aHJvd3MgYW4gRU9GRXJyb3Igd2hlbiBpdCByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSIiIgotICAgIHNlbGYuZW9mVGVzdEhlbHBlcihUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KCkpCi0gICAgc2VsZi5lb2ZUZXN0SGVscGVyU3RyZXNzKFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkoKSkKKyAgICAgICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSBnb3R0ZW4gRU9GRXJyb3IiKQogCi0gIGRlZiB0ZXN0Q29tcGFjdFByb3RvY29sRW9mKHNlbGYpOgotICAgICIiIlRlc3QgdGhhdCBUQ29tcGFjdFByb3RvY29sIHRocm93cyBhbiBFT0ZFcnJvciB3aGVuIGl0IHJlYWNoZXMgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIiIiCi0gICAgc2VsZi5lb2ZUZXN0SGVscGVyKFRDb21wYWN0UHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKSkKLSAgICBzZWxmLmVvZlRlc3RIZWxwZXJTdHJlc3MoVENvbXBhY3RQcm90b2NvbC5UQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpKQorICAgIGRlZiBlb2ZUZXN0SGVscGVyU3RyZXNzKHNlbGYsIHBmYWN0b3J5KToKKyAgICAgICAgIiIiVGVzdCB0aGUgYWJpbGl0eSBvZiBUQmluYXJ5UHJvdG9jb2wgdG8gZGVhbCB3aXRoIHRoZSByZW1vdmFsIG9mIGV2ZXJ5IGJ5dGUgaW4gdGhlIGZpbGUiIiIKKyAgICAgICAgIyBUT0RPOiB3ZSBzaG91bGQgbWFrZSBzdXJlIHRoaXMgY292ZXJzIG1vcmUgb2YgdGhlIGNvZGUgcGF0aHMKKworICAgICAgICBkYXRhID0gc2VsZi5tYWtlX2RhdGEocGZhY3RvcnkpCisgICAgICAgIGZvciBpIGluIHJhbmdlKDAsIGxlbihkYXRhKSArIDEpOgorICAgICAgICAgICAgdHJhbnMgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoZGF0YVswOmldKQorICAgICAgICAgICAgcHJvdCA9IHBmYWN0b3J5LmdldFByb3RvY29sKHRyYW5zKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHggPSBYdHJ1Y3QoKQorICAgICAgICAgICAgICAgIHgucmVhZChwcm90KQorICAgICAgICAgICAgICAgIHgucmVhZChwcm90KQorICAgICAgICAgICAgICAgIHgucmVhZChwcm90KQorICAgICAgICAgICAgZXhjZXB0IEVPRkVycm9yOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIGdvdHRlbiBhbiBFT0ZFcnJvciIpCisKKyAgICBkZWYgdGVzdEJpbmFyeVByb3RvY29sRW9mKHNlbGYpOgorICAgICAgICAiIiJUZXN0IHRoYXQgVEJpbmFyeVByb3RvY29sIHRocm93cyBhbiBFT0ZFcnJvciB3aGVuIGl0IHJlYWNoZXMgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIiIiCisgICAgICAgIHNlbGYuZW9mVGVzdEhlbHBlcihUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKQorICAgICAgICBzZWxmLmVvZlRlc3RIZWxwZXJTdHJlc3MoVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkKKworICAgIGRlZiB0ZXN0QmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEJpbmFyeUVvZihzZWxmKToKKyAgICAgICAgIiIiVGVzdCB0aGF0IFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIHRocm93cyBhbiBFT0ZFcnJvciB3aGVuIGl0IHJlYWNoZXMgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIiIiCisgICAgICAgIHNlbGYuZW9mVGVzdEhlbHBlcihUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KGZhbGxiYWNrPUZhbHNlKSkKKyAgICAgICAgc2VsZi5lb2ZUZXN0SGVscGVyU3RyZXNzKFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkoZmFsbGJhY2s9RmFsc2UpKQorCisgICAgZGVmIHRlc3RDb21wYWN0UHJvdG9jb2xFb2Yoc2VsZik6CisgICAgICAgICIiIlRlc3QgdGhhdCBUQ29tcGFjdFByb3RvY29sIHRocm93cyBhbiBFT0ZFcnJvciB3aGVuIGl0IHJlYWNoZXMgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIiIiCisgICAgICAgIHNlbGYuZW9mVGVzdEhlbHBlcihUQ29tcGFjdFByb3RvY29sLlRDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCkpCisgICAgICAgIHNlbGYuZW9mVGVzdEhlbHBlclN0cmVzcyhUQ29tcGFjdFByb3RvY29sLlRDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCkpCisKKyAgICBkZWYgdGVzdENvbXBhY3RQcm90b2NvbEFjY2VsZXJhdGVkQ29tcGFjdEVvZihzZWxmKToKKyAgICAgICAgIiIiVGVzdCB0aGF0IFRDb21wYWN0UHJvdG9jb2xBY2NlbGVyYXRlZCB0aHJvd3MgYW4gRU9GRXJyb3Igd2hlbiBpdCByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSIiIgorICAgICAgICBzZWxmLmVvZlRlc3RIZWxwZXIoVENvbXBhY3RQcm90b2NvbC5UQ29tcGFjdFByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KGZhbGxiYWNrPUZhbHNlKSkKKyAgICAgICAgc2VsZi5lb2ZUZXN0SGVscGVyU3RyZXNzKFRDb21wYWN0UHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeShmYWxsYmFjaz1GYWxzZSkpCisKIAogZGVmIHN1aXRlKCk6Ci0gIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKLSAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCi0gIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShUZXN0RW9mKSkKLSAgcmV0dXJuIHN1aXRlCisgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShUZXN0RW9mKSkKKyAgICByZXR1cm4gc3VpdGUKKwogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotICB1bml0dGVzdC5tYWluKGRlZmF1bHRUZXN0PSJzdWl0ZSIsIHRlc3RSdW5uZXI9dW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIodmVyYm9zaXR5PTIpKQorICAgIHVuaXR0ZXN0Lm1haW4oZGVmYXVsdFRlc3Q9InN1aXRlIiwgdGVzdFJ1bm5lcj11bml0dGVzdC5UZXh0VGVzdFJ1bm5lcih2ZXJib3NpdHk9MikpCmRpZmYgLS1naXQgYS90ZXN0L3B5L1Rlc3RGcm96ZW4ucHkgYi90ZXN0L3B5L1Rlc3RGcm96ZW4ucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmQyNTk1YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcHkvVGVzdEZyb3plbi5weQpAQCAtMCwwICsxLDEyMyBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitmcm9tIERlYnVnUHJvdG9UZXN0LnR0eXBlcyBpbXBvcnQgQ29tcGFjdFByb3RvVGVzdFN0cnVjdCwgRW1wdHksIFdyYXBwZXIKK2Zyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgVEZyb3plbkRpY3QKK2Zyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAorZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbCwgVENvbXBhY3RQcm90b2NvbAoraW1wb3J0IGNvbGxlY3Rpb25zCitpbXBvcnQgdW5pdHRlc3QKKworCitjbGFzcyBUZXN0RnJvemVuQmFzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIF9yb3VuZHRyaXAoc2VsZiwgc3JjLCBkc3QpOgorICAgICAgICBvdHJhbnMgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQorICAgICAgICBvcHRvcm8gPSBzZWxmLnByb3RvY29sKG90cmFucykKKyAgICAgICAgc3JjLndyaXRlKG9wdG9ybykKKyAgICAgICAgaXRyYW5zID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKG90cmFucy5nZXR2YWx1ZSgpKQorICAgICAgICBpcHJvdG8gPSBzZWxmLnByb3RvY29sKGl0cmFucykKKyAgICAgICAgcmV0dXJuIGRzdC5yZWFkKGlwcm90bykgb3IgZHN0CisKKyAgICBkZWYgdGVzdF9kaWN0X2lzX2hhc2hhYmxlX29ubHlfYWZ0ZXJfZnJvemVuKHNlbGYpOgorICAgICAgICBkMCA9IHt9CisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNpbnN0YW5jZShkMCwgY29sbGVjdGlvbnMuSGFzaGFibGUpKQorICAgICAgICBkMSA9IFRGcm96ZW5EaWN0KGQwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShkMSwgY29sbGVjdGlvbnMuSGFzaGFibGUpKQorCisgICAgZGVmIHRlc3Rfc3RydWN0X3dpdGhfY29sbGVjdGlvbl9maWVsZHMoc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0X3NldChzZWxmKToKKyAgICAgICAgIiIiVGVzdCB0aGF0IGFubm90YXRlZCBzZXQgZmllbGQgY2FuIGJlIHNlcmlhbGl6ZWQgYW5kIGRlc2VyaWFsaXplZCIiIgorICAgICAgICB4ID0gQ29tcGFjdFByb3RvVGVzdFN0cnVjdChzZXRfYnl0ZV9tYXA9eworICAgICAgICAgICAgZnJvemVuc2V0KFs0MiwgMTAwLCAtMTAwXSk6IDk5LAorICAgICAgICAgICAgZnJvemVuc2V0KFswXSk6IDEwMCwKKyAgICAgICAgICAgIGZyb3plbnNldChbXSk6IDAsCisgICAgICAgIH0pCisgICAgICAgIHgyID0gc2VsZi5fcm91bmR0cmlwKHgsIENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Mi5zZXRfYnl0ZV9tYXBbZnJvemVuc2V0KFs0MiwgMTAwLCAtMTAwXSldLCA5OSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Mi5zZXRfYnl0ZV9tYXBbZnJvemVuc2V0KFswXSldLCAxMDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeDIuc2V0X2J5dGVfbWFwW2Zyb3plbnNldChbXSldLCAwKQorCisgICAgZGVmIHRlc3RfbWFwKHNlbGYpOgorICAgICAgICAiIiJUZXN0IHRoYXQgYW5ub3RhdGVkIG1hcCBmaWVsZCBjYW4gYmUgc2VyaWFsaXplZCBhbmQgZGVzZXJpYWxpemVkIiIiCisgICAgICAgIHggPSBDb21wYWN0UHJvdG9UZXN0U3RydWN0KG1hcF9ieXRlX21hcD17CisgICAgICAgICAgICBURnJvemVuRGljdCh7NDI6IDQyLCAxMDA6IC0xMDB9KTogOTksCisgICAgICAgICAgICBURnJvemVuRGljdCh7MDogMH0pOiAxMDAsCisgICAgICAgICAgICBURnJvemVuRGljdCh7fSk6IDAsCisgICAgICAgIH0pCisgICAgICAgIHgyID0gc2VsZi5fcm91bmR0cmlwKHgsIENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Mi5tYXBfYnl0ZV9tYXBbVEZyb3plbkRpY3QoezQyOiA0MiwgMTAwOiAtMTAwfSldLCA5OSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Mi5tYXBfYnl0ZV9tYXBbVEZyb3plbkRpY3QoezA6IDB9KV0sIDEwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Mi5tYXBfYnl0ZV9tYXBbVEZyb3plbkRpY3Qoe30pXSwgMCkKKworICAgIGRlZiB0ZXN0X2xpc3Qoc2VsZik6CisgICAgICAgICIiIlRlc3QgdGhhdCBhbm5vdGF0ZWQgbGlzdCBmaWVsZCBjYW4gYmUgc2VyaWFsaXplZCBhbmQgZGVzZXJpYWxpemVkIiIiCisgICAgICAgIHggPSBDb21wYWN0UHJvdG9UZXN0U3RydWN0KGxpc3RfYnl0ZV9tYXA9eworICAgICAgICAgICAgKDQyLCAxMDAsIC0xMDApOiA5OSwKKyAgICAgICAgICAgICgwLCk6IDEwMCwKKyAgICAgICAgICAgICgpOiAwLAorICAgICAgICB9KQorICAgICAgICB4MiA9IHNlbGYuX3JvdW5kdHJpcCh4LCBDb21wYWN0UHJvdG9UZXN0U3RydWN0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeDIubGlzdF9ieXRlX21hcFsoNDIsIDEwMCwgLTEwMCldLCA5OSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Mi5saXN0X2J5dGVfbWFwWygwLCldLCAxMDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeDIubGlzdF9ieXRlX21hcFsoKV0sIDApCisKKyAgICBkZWYgdGVzdF9lbXB0eV9zdHJ1Y3Qoc2VsZik6CisgICAgICAgICIiIlRlc3QgdGhhdCBhbm5vdGF0ZWQgZW1wdHkgc3RydWN0IGNhbiBiZSBzZXJpYWxpemVkIGFuZCBkZXNlcmlhbGl6ZWQiIiIKKyAgICAgICAgeCA9IENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QoZW1wdHlfc3RydWN0X2ZpZWxkPUVtcHR5KCkpCisgICAgICAgIHgyID0gc2VsZi5fcm91bmR0cmlwKHgsIENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Mi5lbXB0eV9zdHJ1Y3RfZmllbGQsIEVtcHR5KCkpCisKKyAgICBkZWYgdGVzdF9zdHJ1Y3Qoc2VsZik6CisgICAgICAgICIiIlRlc3QgdGhhdCBhbm5vdGF0ZWQgc3RydWN0IGNhbiBiZSBzZXJpYWxpemVkIGFuZCBkZXNlcmlhbGl6ZWQiIiIKKyAgICAgICAgeCA9IFdyYXBwZXIoZm9vPUVtcHR5KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5mb28sIEVtcHR5KCkpCisgICAgICAgIHgyID0gc2VsZi5fcm91bmR0cmlwKHgsIFdyYXBwZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeDIuZm9vLCBFbXB0eSgpKQorCisKK2NsYXNzIFRlc3RGcm96ZW4oVGVzdEZyb3plbkJhc2UpOgorICAgIGRlZiBwcm90b2NvbChzZWxmLCB0cmFucyk6CisgICAgICAgIHJldHVybiBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpLmdldFByb3RvY29sKHRyYW5zKQorCisKK2NsYXNzIFRlc3RGcm96ZW5BY2NlbGVyYXRlZEJpbmFyeShUZXN0RnJvemVuQmFzZSk6CisgICAgZGVmIHByb3RvY29sKHNlbGYsIHRyYW5zKToKKyAgICAgICAgcmV0dXJuIFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkoZmFsbGJhY2s9RmFsc2UpLmdldFByb3RvY29sKHRyYW5zKQorCisKK2NsYXNzIFRlc3RGcm96ZW5BY2NlbGVyYXRlZENvbXBhY3QoVGVzdEZyb3plbkJhc2UpOgorICAgIGRlZiBwcm90b2NvbChzZWxmLCB0cmFucyk6CisgICAgICAgIHJldHVybiBUQ29tcGFjdFByb3RvY29sLlRDb21wYWN0UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkoZmFsbGJhY2s9RmFsc2UpLmdldFByb3RvY29sKHRyYW5zKQorCisKK2RlZiBzdWl0ZSgpOgorICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKyAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKyAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoVGVzdEZyb3plbikpCisgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKFRlc3RGcm96ZW5BY2NlbGVyYXRlZEJpbmFyeSkpCisgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKFRlc3RGcm96ZW5BY2NlbGVyYXRlZENvbXBhY3QpKQorICAgIHJldHVybiBzdWl0ZQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdW5pdHRlc3QubWFpbihkZWZhdWx0VGVzdD0ic3VpdGUiLCB0ZXN0UnVubmVyPXVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKHZlcmJvc2l0eT0yKSkKZGlmZiAtLWdpdCBhL3Rlc3QvcHkvVGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLnB5IGIvdGVzdC9weS9UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA5MDNkOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcHkvVGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLnB5CkBAIC0wLDAgKzEsMTc3IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW1wb3J0IHVuaXR0ZXN0CisKK2Zyb20gRG91YmxlQ29uc3RhbnRzVGVzdCBpbXBvcnQgY29uc3RhbnRzCisKKyMKKyMgSW4gb3JkZXIgdG8gcnVuIHRoZSB0ZXN0IHVuZGVyIFdpbmRvd3MuIFdlIG5lZWQgdG8gY3JlYXRlIHN5bWJvbGljIGxpbmsKKyMgbmFtZSAndGhyaWZ0JyB0byAnLi4vc3JjJyBmb2xkZXIgYnkgdXNpbmc6CisjCisjIG1rbGluayAvRCB0aHJpZnQgLi5cc3JjCisjCisKKworY2xhc3MgVGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBBU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNUID0gXAorICAgICAgICAiZmFpbGVkIHRvIHZlcmlmeSBhIGRvdWJsZSBjb25zdGFudCBnZW5lcmF0ZWQgYnkgVGhyaWZ0IChleHBlY3RlZCA9ICVmLCBnb3QgPSAlZikiCisgICAgQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9MSVNUX1RFU1QgPVwKKyAgICAgICAgImZhaWxlZCB0byB2ZXJpZnkgYSBsaXN0IGl0ZW0gYnkgVGhyaWZ0IChleHBlY3RlZCA9ICVmLCBnb3QgPSAlZikiCisgICAgQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTID0gInRoZSByZW5kZXJlZCB2YXJpYWJsZSB3aXRoIG5hbWUgJXMgaXMgbm90IG9mIGRvdWJsZSB0eXBlIgorCisgICAgIyB0byBtYWtlIHN1cmUgdGhlIHZhcmlhYmxlcyBpbnNpZGUgVGhyaWZ0IGZpbGVzIGFyZSBnZW5lcmF0ZWQgY29ycmVjdGx5CisgICAgZGVmIHRlc3RfcmVuZGVyZWRfZG91YmxlX2NvbnN0YW50cyhzZWxmKToKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVCA9IDEuMAorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5UID0gLTEwMC4wCisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVCA9IDkyMjMzNzIwMzY4NTQ3NzU4MDcuMAorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UID0gLTkyMjMzNzIwMzY4NTQ3NzU4MDcuMAorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMUyA9IDMuMTQxNTkyNjUzNTkKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFID0gMTAwMDAwMC4xCisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRSA9IC0xMDAwMDAwLjEKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRSA9IDEuN2UrMzA4CisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSA9IDkyMjMzNzIwMzY4NTQ3NzU4MTYuNDMKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRSA9IC0xLjdlKzMwOAorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFID0gLTkyMjMzNzIwMzY4NTQ3NzU4MTYuNDMKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbCgKKyAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5UX1RFU1QsIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlQsIHBsYWNlcz03LAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNUICUgKAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlQsIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5UX1RFU1QpKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKAorICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlRfVEVTVCwgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVCwKKyAgICAgICAgICAgIHBsYWNlcz03LAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNUICUgKAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlQsCisgICAgICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlRfVEVTVCkpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoCisgICAgICAgICAgICBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5UX1RFU1QsIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVCwKKyAgICAgICAgICAgIHBsYWNlcz03LAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNUICUgKAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVCwKKyAgICAgICAgICAgICAgICBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5UX1RFU1QpKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKAorICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlRfVEVTVCwgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVCwKKyAgICAgICAgICAgIHBsYWNlcz03LAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNUICUgKAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlQsCisgICAgICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlRfVEVTVCkpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoCisgICAgICAgICAgICBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFNfVEVTVCwKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTLCBwbGFjZXM9NywKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCAlICgKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMUywKKyAgICAgICAgICAgICAgICBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFNfVEVTVCkpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoCisgICAgICAgICAgICBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRSwKKyAgICAgICAgICAgIHBsYWNlcz03LAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNUICUgKAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRSwKKyAgICAgICAgICAgICAgICBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKAorICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRV9URVNULAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFLCBwbGFjZXM9NywKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCAlICgKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEUsCisgICAgICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUKSkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbCgKKyAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFX1RFU1QsIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEUsIHBsYWNlcz03LAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNUICUgKAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEUsCisgICAgICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEVfVEVTVCkpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoCisgICAgICAgICAgICBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEUsIHBsYWNlcz03LAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNUICUgKAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSwKKyAgICAgICAgICAgICAgICBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKAorICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEVfVEVTVCwgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRSwgcGxhY2VzPTcsCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QgJSAoCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRSwKKyAgICAgICAgICAgICAgICBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRV9URVNUKSkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbCgKKyAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFLCBwbGFjZXM9NywKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCAlICgKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFLAorICAgICAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgICAgICBpc2luc3RhbmNlKGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5UX1RFU1QsIGZsb2F0KSwKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTICUKKyAgICAgICAgICAgICJET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5UX1RFU1QiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgICAgICBpc2luc3RhbmNlKGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5UX1RFU1QsIGZsb2F0KSwKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTICUKKyAgICAgICAgICAgICJET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5UX1RFU1QiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgICAgICBpc2luc3RhbmNlKGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlRfVEVTVCwgZmxvYXQpLAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MgJQorICAgICAgICAgICAgIkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVF9URVNUIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICAgICAgaXNpbnN0YW5jZShjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVF9URVNULCBmbG9hdCksCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUyAlCisgICAgICAgICAgICAiRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVF9URVNUIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICAgICAgaXNpbnN0YW5jZShjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFNfVEVTVCwgZmxvYXQpLAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MgJQorICAgICAgICAgICAgIkRPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTX1RFU1QiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgICAgICBpc2luc3RhbmNlKGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCwgZmxvYXQpLAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MgJQorICAgICAgICAgICAgIkRPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRV9URVNUIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICAgICAgaXNpbnN0YW5jZShjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsIGZsb2F0KSwKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTICUKKyAgICAgICAgICAgICJET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIGlzaW5zdGFuY2UoY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEVfVEVTVCwgZmxvYXQpLAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MgJQorICAgICAgICAgICAgIkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEVfVEVTVCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIGlzaW5zdGFuY2UoY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNULCBmbG9hdCksCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUyAlCisgICAgICAgICAgICAiRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgICAgICBpc2luc3RhbmNlKGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFX1RFU1QsIGZsb2F0KSwKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTICUKKyAgICAgICAgICAgICJET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFX1RFU1QiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgICAgICBpc2luc3RhbmNlKGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsIGZsb2F0KSwKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTICUKKyAgICAgICAgICAgICJET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QiKQorCisgICAgIyB0byBtYWtlIHN1cmUgdGhlIHZhcmlhYmxlcyBpbnNpZGUgVGhyaWZ0IGZpbGVzIGFyZSBnZW5lcmF0ZWQgY29ycmVjdGx5CisgICAgZGVmIHRlc3RfcmVuZGVyZWRfZG91YmxlX2xpc3Qoc2VsZik6CisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9MSVNUID0gWzEuMCwgLTEwMC4wLCAxMDAuMCwgOTIyMzM3MjAzNjg1NDc3NTgwNy4wLCAtOTIyMzM3MjAzNjg1NDc3NTgwNy4wLCAzLjE0MTU5MjY1MzU5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAwLjEsIC0xMDAwMDAwLjEsIDEuN2UrMzA4LCAtMS43ZSszMDgsIDkyMjMzNzIwMzY4NTQ3NzU4MTYuNDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC05MjIzMzcyMDM2ODU0Nzc1ODE2LjQzXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjb25zdGFudHMuRE9VQkxFX0xJU1RfVEVTVCksIGxlbihFWFBFQ1RFRF9ET1VCTEVfTElTVCkpCisgICAgICAgIGZvciBpLCBleHBlY3RlZFZhbHVlIGluIGVudW1lcmF0ZShFWFBFQ1RFRF9ET1VCTEVfTElTVCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGNvbnN0YW50cy5ET1VCTEVfTElTVF9URVNUW2ldLCBleHBlY3RlZFZhbHVlLCBwbGFjZXM9NykKKworCitkZWYgc3VpdGUoKToKKyAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKFRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cykpCisgICAgcmV0dXJuIHN1aXRlCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB1bml0dGVzdC5tYWluKGRlZmF1bHRUZXN0PSJzdWl0ZSIsIHRlc3RSdW5uZXI9dW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIodmVyYm9zaXR5PTIpKQpkaWZmIC0tZ2l0IGEvdGVzdC9weS9UZXN0U2VydmVyLnB5IGIvdGVzdC9weS9UZXN0U2VydmVyLnB5CmluZGV4IGI1Njk2Y2EuLmFiYTBkNDIgMTAwNzU1Ci0tLSBhL3Rlc3QvcHkvVGVzdFNlcnZlci5weQorKysgYi90ZXN0L3B5L1Rlc3RTZXJ2ZXIucHkKQEAgLTE5LDI4MyArMTksMzI0IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBkaXZpc2lvbgotaW1wb3J0IGdsb2IKIGltcG9ydCBsb2dnaW5nCiBpbXBvcnQgb3MKK2ltcG9ydCBzaWduYWwKIGltcG9ydCBzeXMKIGltcG9ydCB0aW1lCiBmcm9tIG9wdHBhcnNlIGltcG9ydCBPcHRpb25QYXJzZXIKIAotIyBQcmludCBUU2VydmVyIGxvZyB0byBzdGRvdXQgc28gdGhhdCB0aGUgdGVzdC1ydW5uZXIgY2FuIHJlZGlyZWN0IGl0IHRvIGxvZyBmaWxlcwotbG9nZ2luZy5iYXNpY0NvbmZpZygpCitmcm9tIHV0aWwgaW1wb3J0IGxvY2FsX2xpYnBhdGgKIAotcGFyc2VyID0gT3B0aW9uUGFyc2VyKCkKLXBhcnNlci5hZGRfb3B0aW9uKCctLWdlbnB5ZGlyJywgdHlwZT0nc3RyaW5nJywgZGVzdD0nZ2VucHlkaXInLAotICAgICAgICAgICAgICAgICAgZGVmYXVsdD0nZ2VuLXB5JywKLSAgICAgICAgICAgICAgICAgIGhlbHA9J2luY2x1ZGUgdGhpcyBsb2NhbCBkaXJlY3RvcnkgaW4gc3lzLnBhdGggZm9yIGxvY2F0aW5nIGdlbmVyYXRlZCBjb2RlJykKLXBhcnNlci5hZGRfb3B0aW9uKCItLXBvcnQiLCB0eXBlPSJpbnQiLCBkZXN0PSJwb3J0IiwKLSAgICBoZWxwPSJwb3J0IG51bWJlciBmb3Igc2VydmVyIHRvIGxpc3RlbiBvbiIpCi1wYXJzZXIuYWRkX29wdGlvbigiLS16bGliIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwgZGVzdD0iemxpYiIsCi0gICAgaGVscD0idXNlIHpsaWIgd3JhcHBlciBmb3IgY29tcHJlc3NlZCB0cmFuc3BvcnQiKQotcGFyc2VyLmFkZF9vcHRpb24oIi0tc3NsIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwgZGVzdD0ic3NsIiwKLSAgICBoZWxwPSJ1c2UgU1NMIGZvciBlbmNyeXB0ZWQgdHJhbnNwb3J0IikKLXBhcnNlci5hZGRfb3B0aW9uKCctdicsICctLXZlcmJvc2UnLCBhY3Rpb249InN0b3JlX2NvbnN0IiwKLSAgICBkZXN0PSJ2ZXJib3NlIiwgY29uc3Q9MiwKLSAgICBoZWxwPSJ2ZXJib3NlIG91dHB1dCIpCi1wYXJzZXIuYWRkX29wdGlvbignLXEnLCAnLS1xdWlldCcsIGFjdGlvbj0ic3RvcmVfY29uc3QiLAotICAgIGRlc3Q9InZlcmJvc2UiLCBjb25zdD0wLAotICAgIGhlbHA9Im1pbmltYWwgb3V0cHV0IikKLXBhcnNlci5hZGRfb3B0aW9uKCctLXByb3RvY29sJywgIGRlc3Q9InByb3RvIiwgdHlwZT0ic3RyaW5nIiwKLSAgICBoZWxwPSJwcm90b2NvbCB0byB1c2UsIG9uZSBvZjogYWNjZWwsIGJpbmFyeSwgY29tcGFjdCwganNvbiIpCi1wYXJzZXIuYWRkX29wdGlvbignLS10cmFuc3BvcnQnLCAgZGVzdD0idHJhbnMiLCB0eXBlPSJzdHJpbmciLAotICAgIGhlbHA9InRyYW5zcG9ydCB0byB1c2UsIG9uZSBvZjogYnVmZmVyZWQsIGZyYW1lZCIpCi1wYXJzZXIuc2V0X2RlZmF1bHRzKHBvcnQ9OTA5MCwgdmVyYm9zZT0xLCBwcm90bz0nYmluYXJ5JykKLW9wdGlvbnMsIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCi0KLXNjcmlwdF9kaXIgPSBvcy5wYXRoLnJlYWxwYXRoKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpICAjIDwtLSBhYnNvbHV0ZSBkaXIgdGhlIHNjcmlwdCBpcyBpbgotbGliX2RpciA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKHNjcmlwdF9kaXIpKSwgJ2xpYicsICdweScsICdidWlsZCcsICdsaWIuKicpCi0KLXN5cy5wYXRoLmluc2VydCgwLCBvcy5wYXRoLmpvaW4oc2NyaXB0X2Rpciwgb3B0aW9ucy5nZW5weWRpcikpCi1zeXMucGF0aC5pbnNlcnQoMCwgZ2xvYi5nbG9iKGxpYl9kaXIpWzBdKQotCi1mcm9tIFRocmlmdFRlc3QgaW1wb3J0IFRocmlmdFRlc3QKLWZyb20gVGhyaWZ0VGVzdC50dHlwZXMgaW1wb3J0ICoKLWZyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgVEV4Y2VwdGlvbgotZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0Ci1mcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRTb2NrZXQKLWZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFpsaWJUcmFuc3BvcnQKLWZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKLWZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQ29tcGFjdFByb3RvY29sCi1mcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEpTT05Qcm90b2NvbAotZnJvbSB0aHJpZnQuc2VydmVyIGltcG9ydCBUU2VydmVyLCBUTm9uYmxvY2tpbmdTZXJ2ZXIsIFRIdHRwU2VydmVyCi0KLVBST1RfRkFDVE9SSUVTID0gewotICAgICdiaW5hcnknOiBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSwKLSAgICAnYWNjZWwnOiBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5LAotICAgICdjb21wYWN0JzogVENvbXBhY3RQcm90b2NvbC5UQ29tcGFjdFByb3RvY29sRmFjdG9yeSwKLSAgICAnanNvbic6IFRKU09OUHJvdG9jb2wuVEpTT05Qcm90b2NvbEZhY3RvcnksCi19CitTQ1JJUFRfRElSID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpCiAKIAogY2xhc3MgVGVzdEhhbmRsZXIob2JqZWN0KToKLSAgZGVmIHRlc3RWb2lkKHNlbGYpOgotICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6Ci0gICAgICBwcmludCgndGVzdFZvaWQoKScpCisgICAgZGVmIHRlc3RWb2lkKHNlbGYpOgorICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCd0ZXN0Vm9pZCgpJykKIAotICBkZWYgdGVzdFN0cmluZyhzZWxmLCBzdHIpOgotICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6Ci0gICAgICBwcmludCgndGVzdFN0cmluZyglcyknICUgc3RyKQotICAgIHJldHVybiBzdHIKKyAgICBkZWYgdGVzdFN0cmluZyhzZWxmLCBzdHIpOgorICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCd0ZXN0U3RyaW5nKCVzKScgJSBzdHIpCisgICAgICAgIHJldHVybiBzdHIKIAotICBkZWYgdGVzdEJvb2woc2VsZiwgYm9vbGVhbik6Ci0gICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKLSAgICAgIHByaW50KCd0ZXN0Qm9vbCglcyknICUgc3RyKGJvb2xlYW4pLmxvd2VyKCkpCi0gICAgcmV0dXJuIGJvb2xlYW4KKyAgICBkZWYgdGVzdEJvb2woc2VsZiwgYm9vbGVhbik6CisgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3RCb29sKCVzKScgJSBzdHIoYm9vbGVhbikubG93ZXIoKSkKKyAgICAgICAgcmV0dXJuIGJvb2xlYW4KIAotICBkZWYgdGVzdEJ5dGUoc2VsZiwgYnl0ZSk6Ci0gICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKLSAgICAgIHByaW50KCd0ZXN0Qnl0ZSglZCknICUgYnl0ZSkKLSAgICByZXR1cm4gYnl0ZQorICAgIGRlZiB0ZXN0Qnl0ZShzZWxmLCBieXRlKToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdEJ5dGUoJWQpJyAlIGJ5dGUpCisgICAgICAgIHJldHVybiBieXRlCiAKLSAgZGVmIHRlc3RJMTYoc2VsZiwgaTE2KToKLSAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgotICAgICAgcHJpbnQoJ3Rlc3RJMTYoJWQpJyAlIGkxNikKLSAgICByZXR1cm4gaTE2CisgICAgZGVmIHRlc3RJMTYoc2VsZiwgaTE2KToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdEkxNiglZCknICUgaTE2KQorICAgICAgICByZXR1cm4gaTE2CiAKLSAgZGVmIHRlc3RJMzIoc2VsZiwgaTMyKToKLSAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgotICAgICAgcHJpbnQoJ3Rlc3RJMzIoJWQpJyAlIGkzMikKLSAgICByZXR1cm4gaTMyCisgICAgZGVmIHRlc3RJMzIoc2VsZiwgaTMyKToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdEkzMiglZCknICUgaTMyKQorICAgICAgICByZXR1cm4gaTMyCiAKLSAgZGVmIHRlc3RJNjQoc2VsZiwgaTY0KToKLSAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgotICAgICAgcHJpbnQoJ3Rlc3RJNjQoJWQpJyAlIGk2NCkKLSAgICByZXR1cm4gaTY0CisgICAgZGVmIHRlc3RJNjQoc2VsZiwgaTY0KToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdEk2NCglZCknICUgaTY0KQorICAgICAgICByZXR1cm4gaTY0CiAKLSAgZGVmIHRlc3REb3VibGUoc2VsZiwgZHViKToKLSAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgotICAgICAgcHJpbnQoJ3Rlc3REb3VibGUoJWYpJyAlIGR1YikKLSAgICByZXR1cm4gZHViCisgICAgZGVmIHRlc3REb3VibGUoc2VsZiwgZHViKToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdERvdWJsZSglZiknICUgZHViKQorICAgICAgICByZXR1cm4gZHViCiAKLSAgZGVmIHRlc3RCaW5hcnkoc2VsZiwgdGhpbmcpOgotICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6Ci0gICAgICBwcmludCgndGVzdEJpbmFyeSgpJykgICMgVE9ETzogaGV4IG91dHB1dAotICAgIHJldHVybiB0aGluZworICAgIGRlZiB0ZXN0QmluYXJ5KHNlbGYsIHRoaW5nKToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdEJpbmFyeSgpJykgICMgVE9ETzogaGV4IG91dHB1dAorICAgICAgICByZXR1cm4gdGhpbmcKIAotICBkZWYgdGVzdFN0cnVjdChzZWxmLCB0aGluZyk6Ci0gICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKLSAgICAgIHByaW50KCd0ZXN0U3RydWN0KHslcywgJWQsICVkLCAlZH0pJyAlICh0aGluZy5zdHJpbmdfdGhpbmcsIHRoaW5nLmJ5dGVfdGhpbmcsIHRoaW5nLmkzMl90aGluZywgdGhpbmcuaTY0X3RoaW5nKSkKLSAgICByZXR1cm4gdGhpbmcKKyAgICBkZWYgdGVzdFN0cnVjdChzZWxmLCB0aGluZyk6CisgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3RTdHJ1Y3QoeyVzLCAlcywgJXMsICVzfSknICUgKHRoaW5nLnN0cmluZ190aGluZywgdGhpbmcuYnl0ZV90aGluZywgdGhpbmcuaTMyX3RoaW5nLCB0aGluZy5pNjRfdGhpbmcpKQorICAgICAgICByZXR1cm4gdGhpbmcKIAotICBkZWYgdGVzdEV4Y2VwdGlvbihzZWxmLCBhcmcpOgotICAgICMgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKLSAgICBwcmludCgndGVzdEV4Y2VwdGlvbiglcyknICUgYXJnKQotICAgIGlmIGFyZyA9PSAnWGNlcHRpb24nOgotICAgICAgcmFpc2UgWGNlcHRpb24oZXJyb3JDb2RlPTEwMDEsIG1lc3NhZ2U9YXJnKQotICAgIGVsaWYgYXJnID09ICdURXhjZXB0aW9uJzoKLSAgICAgIHJhaXNlIFRFeGNlcHRpb24obWVzc2FnZT0nVGhpcyBpcyBhIFRFeGNlcHRpb24nKQorICAgIGRlZiB0ZXN0RXhjZXB0aW9uKHNlbGYsIGFyZyk6CisgICAgICAgICMgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgbG9nZ2luZy5pbmZvKCd0ZXN0RXhjZXB0aW9uKCVzKScgJSBhcmcpCisgICAgICAgIGlmIGFyZyA9PSAnWGNlcHRpb24nOgorICAgICAgICAgICAgcmFpc2UgWGNlcHRpb24oZXJyb3JDb2RlPTEwMDEsIG1lc3NhZ2U9YXJnKQorICAgICAgICBlbGlmIGFyZyA9PSAnVEV4Y2VwdGlvbic6CisgICAgICAgICAgICByYWlzZSBURXhjZXB0aW9uKG1lc3NhZ2U9J1RoaXMgaXMgYSBURXhjZXB0aW9uJykKIAotICBkZWYgdGVzdE11bHRpRXhjZXB0aW9uKHNlbGYsIGFyZzAsIGFyZzEpOgotICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6Ci0gICAgICBwcmludCgndGVzdE11bHRpRXhjZXB0aW9uKCVzLCAlcyknICUgKGFyZzAsIGFyZzEpKQotICAgIGlmIGFyZzAgPT0gJ1hjZXB0aW9uJzoKLSAgICAgIHJhaXNlIFhjZXB0aW9uKGVycm9yQ29kZT0xMDAxLCBtZXNzYWdlPSdUaGlzIGlzIGFuIFhjZXB0aW9uJykKLSAgICBlbGlmIGFyZzAgPT0gJ1hjZXB0aW9uMic6Ci0gICAgICByYWlzZSBYY2VwdGlvbjIoCi0gICAgICAgIGVycm9yQ29kZT0yMDAyLAotICAgICAgICBzdHJ1Y3RfdGhpbmc9WHRydWN0KHN0cmluZ190aGluZz0nVGhpcyBpcyBhbiBYY2VwdGlvbjInKSkKLSAgICByZXR1cm4gWHRydWN0KHN0cmluZ190aGluZz1hcmcxKQorICAgIGRlZiB0ZXN0TXVsdGlFeGNlcHRpb24oc2VsZiwgYXJnMCwgYXJnMSk6CisgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3RNdWx0aUV4Y2VwdGlvbiglcywgJXMpJyAlIChhcmcwLCBhcmcxKSkKKyAgICAgICAgaWYgYXJnMCA9PSAnWGNlcHRpb24nOgorICAgICAgICAgICAgcmFpc2UgWGNlcHRpb24oZXJyb3JDb2RlPTEwMDEsIG1lc3NhZ2U9J1RoaXMgaXMgYW4gWGNlcHRpb24nKQorICAgICAgICBlbGlmIGFyZzAgPT0gJ1hjZXB0aW9uMic6CisgICAgICAgICAgICByYWlzZSBYY2VwdGlvbjIoCisgICAgICAgICAgICAgICAgZXJyb3JDb2RlPTIwMDIsCisgICAgICAgICAgICAgICAgc3RydWN0X3RoaW5nPVh0cnVjdChzdHJpbmdfdGhpbmc9J1RoaXMgaXMgYW4gWGNlcHRpb24yJykpCisgICAgICAgIHJldHVybiBYdHJ1Y3Qoc3RyaW5nX3RoaW5nPWFyZzEpCiAKLSAgZGVmIHRlc3RPbmV3YXkoc2VsZiwgc2Vjb25kcyk6Ci0gICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKLSAgICAgIHByaW50KCd0ZXN0T25ld2F5KCVkKSA9PiBzbGVlcGluZy4uLicgJSBzZWNvbmRzKQotICAgIHRpbWUuc2xlZXAoc2Vjb25kcyAvIDMpICAjIGJlIHF1aWNrCi0gICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKLSAgICAgIHByaW50KCdkb25lIHNsZWVwaW5nJykKKyAgICBkZWYgdGVzdE9uZXdheShzZWxmLCBzZWNvbmRzKToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdE9uZXdheSglZCkgPT4gc2xlZXBpbmcuLi4nICUgc2Vjb25kcykKKyAgICAgICAgdGltZS5zbGVlcChzZWNvbmRzIC8gMykgICMgYmUgcXVpY2sKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygnZG9uZSBzbGVlcGluZycpCiAKLSAgZGVmIHRlc3ROZXN0KHNlbGYsIHRoaW5nKToKLSAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgotICAgICAgcHJpbnQoJ3Rlc3ROZXN0KCVzKScgJSB0aGluZykKLSAgICByZXR1cm4gdGhpbmcKKyAgICBkZWYgdGVzdE5lc3Qoc2VsZiwgdGhpbmcpOgorICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCd0ZXN0TmVzdCglcyknICUgdGhpbmcpCisgICAgICAgIHJldHVybiB0aGluZwogCi0gIGRlZiB0ZXN0TWFwKHNlbGYsIHRoaW5nKToKLSAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgotICAgICAgcHJpbnQoJ3Rlc3RNYXAoJXMpJyAlIHRoaW5nKQotICAgIHJldHVybiB0aGluZworICAgIGRlZiB0ZXN0TWFwKHNlbGYsIHRoaW5nKToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdE1hcCglcyknICUgdGhpbmcpCisgICAgICAgIHJldHVybiB0aGluZwogCi0gIGRlZiB0ZXN0U3RyaW5nTWFwKHNlbGYsIHRoaW5nKToKLSAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgotICAgICAgcHJpbnQoJ3Rlc3RTdHJpbmdNYXAoJXMpJyAlIHRoaW5nKQotICAgIHJldHVybiB0aGluZworICAgIGRlZiB0ZXN0U3RyaW5nTWFwKHNlbGYsIHRoaW5nKToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdFN0cmluZ01hcCglcyknICUgdGhpbmcpCisgICAgICAgIHJldHVybiB0aGluZwogCi0gIGRlZiB0ZXN0U2V0KHNlbGYsIHRoaW5nKToKLSAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgotICAgICAgcHJpbnQoJ3Rlc3RTZXQoJXMpJyAlIHRoaW5nKQotICAgIHJldHVybiB0aGluZworICAgIGRlZiB0ZXN0U2V0KHNlbGYsIHRoaW5nKToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdFNldCglcyknICUgdGhpbmcpCisgICAgICAgIHJldHVybiB0aGluZwogCi0gIGRlZiB0ZXN0TGlzdChzZWxmLCB0aGluZyk6Ci0gICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKLSAgICAgIHByaW50KCd0ZXN0TGlzdCglcyknICUgdGhpbmcpCi0gICAgcmV0dXJuIHRoaW5nCisgICAgZGVmIHRlc3RMaXN0KHNlbGYsIHRoaW5nKToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdExpc3QoJXMpJyAlIHRoaW5nKQorICAgICAgICByZXR1cm4gdGhpbmcKIAotICBkZWYgdGVzdEVudW0oc2VsZiwgdGhpbmcpOgotICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6Ci0gICAgICBwcmludCgndGVzdEVudW0oJXMpJyAlIHRoaW5nKQotICAgIHJldHVybiB0aGluZworICAgIGRlZiB0ZXN0RW51bShzZWxmLCB0aGluZyk6CisgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3RFbnVtKCVzKScgJSB0aGluZykKKyAgICAgICAgcmV0dXJuIHRoaW5nCiAKLSAgZGVmIHRlc3RUeXBlZGVmKHNlbGYsIHRoaW5nKToKLSAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgotICAgICAgcHJpbnQoJ3Rlc3RUeXBlZGVmKCVzKScgJSB0aGluZykKLSAgICByZXR1cm4gdGhpbmcKKyAgICBkZWYgdGVzdFR5cGVkZWYoc2VsZiwgdGhpbmcpOgorICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCd0ZXN0VHlwZWRlZiglcyknICUgdGhpbmcpCisgICAgICAgIHJldHVybiB0aGluZwogCi0gIGRlZiB0ZXN0TWFwTWFwKHNlbGYsIHRoaW5nKToKLSAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgotICAgICAgcHJpbnQoJ3Rlc3RNYXBNYXAoJXMpJyAlIHRoaW5nKQotICAgIHJldHVybiB7Ci0gICAgICAtNDogewotICAgICAgICAtNDogLTQsCi0gICAgICAgIC0zOiAtMywKLSAgICAgICAgLTI6IC0yLAotICAgICAgICAtMTogLTEsCi0gICAgICB9LAotICAgICAgNDogewotICAgICAgICA0OiA0LAotICAgICAgICAzOiAzLAotICAgICAgICAyOiAyLAotICAgICAgICAxOiAxLAotICAgICAgfSwKKyAgICBkZWYgdGVzdE1hcE1hcChzZWxmLCB0aGluZyk6CisgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3RNYXBNYXAoJXMpJyAlIHRoaW5nKQorICAgICAgICByZXR1cm4geworICAgICAgICAgICAgLTQ6IHsKKyAgICAgICAgICAgICAgICAtNDogLTQsCisgICAgICAgICAgICAgICAgLTM6IC0zLAorICAgICAgICAgICAgICAgIC0yOiAtMiwKKyAgICAgICAgICAgICAgICAtMTogLTEsCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgNDogeworICAgICAgICAgICAgICAgIDQ6IDQsCisgICAgICAgICAgICAgICAgMzogMywKKyAgICAgICAgICAgICAgICAyOiAyLAorICAgICAgICAgICAgICAgIDE6IDEsCisgICAgICAgICAgICB9LAorICAgICAgICB9CisKKyAgICBkZWYgdGVzdEluc2FuaXR5KHNlbGYsIGFyZ3VtZW50KToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdEluc2FuaXR5KCVzKScgJSBhcmd1bWVudCkKKyAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgIDE6IHsKKyAgICAgICAgICAgICAgICAyOiBhcmd1bWVudCwKKyAgICAgICAgICAgICAgICAzOiBhcmd1bWVudCwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAyOiB7NjogSW5zYW5pdHkoKX0sCisgICAgICAgIH0KKworICAgIGRlZiB0ZXN0TXVsdGkoc2VsZiwgYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSk6CisgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3RNdWx0aSglcyknICUgW2FyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzVdKQorICAgICAgICByZXR1cm4gWHRydWN0KHN0cmluZ190aGluZz0nSGVsbG8yJywKKyAgICAgICAgICAgICAgICAgICAgICBieXRlX3RoaW5nPWFyZzAsIGkzMl90aGluZz1hcmcxLCBpNjRfdGhpbmc9YXJnMikKKworCitkZWYgbWFpbihvcHRpb25zKToKKyAgICAjIHNldCB1cCB0aGUgcHJvdG9jb2wgZmFjdG9yeSBmb3JtIHRoZSAtLXByb3RvY29sIG9wdGlvbgorICAgIHByb3RfZmFjdG9yaWVzID0geworICAgICAgICAnYWNjZWwnOiBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KCksCisgICAgICAgICdhY2NlbGMnOiBUQ29tcGFjdFByb3RvY29sLlRDb21wYWN0UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkoKSwKKyAgICAgICAgJ2JpbmFyeSc6IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCksCisgICAgICAgICdjb21wYWN0JzogVENvbXBhY3RQcm90b2NvbC5UQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpLAorICAgICAgICAnaGVhZGVyJzogVEhlYWRlclByb3RvY29sLlRIZWFkZXJQcm90b2NvbEZhY3RvcnkoYWxsb3dlZF9jbGllbnRfdHlwZXM9WworICAgICAgICAgICAgVEhlYWRlclRyYW5zcG9ydC5USGVhZGVyQ2xpZW50VHlwZS5IRUFERVJTLAorICAgICAgICAgICAgVEhlYWRlclRyYW5zcG9ydC5USGVhZGVyQ2xpZW50VHlwZS5GUkFNRURfQklOQVJZLAorICAgICAgICAgICAgVEhlYWRlclRyYW5zcG9ydC5USGVhZGVyQ2xpZW50VHlwZS5VTkZSQU1FRF9CSU5BUlksCisgICAgICAgICAgICBUSGVhZGVyVHJhbnNwb3J0LlRIZWFkZXJDbGllbnRUeXBlLkZSQU1FRF9DT01QQUNULAorICAgICAgICAgICAgVEhlYWRlclRyYW5zcG9ydC5USGVhZGVyQ2xpZW50VHlwZS5VTkZSQU1FRF9DT01QQUNULAorICAgICAgICBdKSwKKyAgICAgICAgJ2pzb24nOiBUSlNPTlByb3RvY29sLlRKU09OUHJvdG9jb2xGYWN0b3J5KCksCiAgICAgfQotCi0gIGRlZiB0ZXN0SW5zYW5pdHkoc2VsZiwgYXJndW1lbnQpOgotICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6Ci0gICAgICBwcmludCgndGVzdEluc2FuaXR5KCVzKScgJSBhcmd1bWVudCkKLSAgICByZXR1cm4gewotICAgICAgMTogewotICAgICAgICAyOiBhcmd1bWVudCwKLSAgICAgICAgMzogYXJndW1lbnQsCi0gICAgICB9LAotICAgICAgMjogezY6IEluc2FuaXR5KCl9LAotICAgIH0KLQotICBkZWYgdGVzdE11bHRpKHNlbGYsIGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpOgotICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6Ci0gICAgICBwcmludCgndGVzdE11bHRpKCVzKScgJSBbYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNV0pCi0gICAgcmV0dXJuIFh0cnVjdChzdHJpbmdfdGhpbmc9J0hlbGxvMicsCi0gICAgICAgICAgICAgICAgICBieXRlX3RoaW5nPWFyZzAsIGkzMl90aGluZz1hcmcxLCBpNjRfdGhpbmc9YXJnMikKLQotCi0jIHNldCB1cCB0aGUgcHJvdG9jb2wgZmFjdG9yeSBmb3JtIHRoZSAtLXByb3RvY29sIG9wdGlvbgotcGZhY3RvcnlfY2xzID0gUFJPVF9GQUNUT1JJRVMuZ2V0KG9wdGlvbnMucHJvdG8sIE5vbmUpCi1pZiBwZmFjdG9yeV9jbHMgaXMgTm9uZToKLSAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoJ1Vua25vd24gLS1wcm90b2NvbCBvcHRpb246ICVzJyAlIG9wdGlvbnMucHJvdG8pCi1wZmFjdG9yeSA9IHBmYWN0b3J5X2NscygpCi0KLSMgZ2V0IHRoZSBzZXJ2ZXIgdHlwZSAoVFNpbXBsZVNlcnZlciwgVE5vbmJsb2NraW5nU2VydmVyLCBldGMuLi4pCi1pZiBsZW4oYXJncykgPiAxOgotICByYWlzZSBBc3NlcnRpb25FcnJvcignT25seSBvbmUgc2VydmVyIHR5cGUgbWF5IGJlIHNwZWNpZmllZCwgbm90IG11bHRpcGxlIHR5cGVzLicpCi1zZXJ2ZXJfdHlwZSA9IGFyZ3NbMF0KLQotIyBTZXQgdXAgdGhlIGhhbmRsZXIgYW5kIHByb2Nlc3NvciBvYmplY3RzCi1oYW5kbGVyICAgPSBUZXN0SGFuZGxlcigpCi1wcm9jZXNzb3IgPSBUaHJpZnRUZXN0LlByb2Nlc3NvcihoYW5kbGVyKQotCi0jIEhhbmRsZSBUSHR0cFNlcnZlciBhcyBhIHNwZWNpYWwgY2FzZQotaWYgc2VydmVyX3R5cGUgPT0gJ1RIdHRwU2VydmVyJzoKLSAgc2VydmVyID1USHR0cFNlcnZlci5USHR0cFNlcnZlcihwcm9jZXNzb3IsICgnJywgb3B0aW9ucy5wb3J0KSwgcGZhY3RvcnkpCi0gIHNlcnZlci5zZXJ2ZSgpCi0gIHN5cy5leGl0KDApCi0KLSMgc2V0IHVwIHNlcnZlciB0cmFuc3BvcnQgYW5kIHRyYW5zcG9ydCBmYWN0b3J5Ci0KLWFic19rZXlfcGF0aCA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoc2NyaXB0X2RpciksICdrZXlzJywgJ3NlcnZlci5wZW0nKQotCi1ob3N0ID0gTm9uZQotaWYgb3B0aW9ucy5zc2w6Ci0gIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFNTTFNvY2tldAotICB0cmFuc3BvcnQgPSBUU1NMU29ja2V0LlRTU0xTZXJ2ZXJTb2NrZXQoaG9zdCwgb3B0aW9ucy5wb3J0LCBjZXJ0ZmlsZT1hYnNfa2V5X3BhdGgpCi1lbHNlOgotICB0cmFuc3BvcnQgPSBUU29ja2V0LlRTZXJ2ZXJTb2NrZXQoaG9zdCwgb3B0aW9ucy5wb3J0KQotdGZhY3RvcnkgPSBUVHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoKQotaWYgb3B0aW9ucy50cmFucyA9PSAnYnVmZmVyZWQnOgotICB0ZmFjdG9yeSA9IFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSgpCi1lbGlmIG9wdGlvbnMudHJhbnMgPT0gJ2ZyYW1lZCc6Ci0gIHRmYWN0b3J5ID0gVFRyYW5zcG9ydC5URnJhbWVkVHJhbnNwb3J0RmFjdG9yeSgpCi1lbGlmIG9wdGlvbnMudHJhbnMgPT0gJyc6Ci0gIHJhaXNlIEFzc2VydGlvbkVycm9yKCdVbmtub3duIC0tdHJhbnNwb3J0IG9wdGlvbjogJXMnICUgb3B0aW9ucy50cmFucykKLWVsc2U6Ci0gIHRmYWN0b3J5ID0gVFRyYW5zcG9ydC5UQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkKLSMgaWYgLS16bGliLCB0aGVuIHdyYXAgc2VydmVyIHRyYW5zcG9ydCwgYW5kIHVzZSBhIGRpZmZlcmVudCB0cmFuc3BvcnQgZmFjdG9yeQotaWYgb3B0aW9ucy56bGliOgotICB0cmFuc3BvcnQgPSBUWmxpYlRyYW5zcG9ydC5UWmxpYlRyYW5zcG9ydCh0cmFuc3BvcnQpICMgd3JhcCAgd2l0aCB6bGliCi0gIHRmYWN0b3J5ID0gVFpsaWJUcmFuc3BvcnQuVFpsaWJUcmFuc3BvcnRGYWN0b3J5KCkKLQotIyBkbyBzZXJ2ZXItc3BlY2lmaWMgc2V0dXAgaGVyZToKLWlmIHNlcnZlcl90eXBlID09ICJUTm9uYmxvY2tpbmdTZXJ2ZXIiOgotICBzZXJ2ZXIgPSBUTm9uYmxvY2tpbmdTZXJ2ZXIuVE5vbmJsb2NraW5nU2VydmVyKHByb2Nlc3NvciwgdHJhbnNwb3J0LCBpbnB1dFByb3RvY29sRmFjdG9yeT1wZmFjdG9yeSkKLWVsaWYgc2VydmVyX3R5cGUgPT0gIlRQcm9jZXNzUG9vbFNlcnZlciI6Ci0gIGltcG9ydCBzaWduYWwKLSAgZnJvbSB0aHJpZnQuc2VydmVyIGltcG9ydCBUUHJvY2Vzc1Bvb2xTZXJ2ZXIKLSAgc2VydmVyID0gVFByb2Nlc3NQb29sU2VydmVyLlRQcm9jZXNzUG9vbFNlcnZlcihwcm9jZXNzb3IsIHRyYW5zcG9ydCwgdGZhY3RvcnksIHBmYWN0b3J5KQotICBzZXJ2ZXIuc2V0TnVtV29ya2Vycyg1KQotCi0gIGRlZiBzZXRfYWxhcm0oKToKLSAgICBkZWYgY2xlYW5fc2h1dGRvd24oc2lnbnVtLCBmcmFtZSk6Ci0gICAgICBmb3Igd29ya2VyIGluIHNlcnZlci53b3JrZXJzOgotICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAwOgotICAgICAgICAgIHByaW50KCdUZXJtaW5hdGluZyB3b3JrZXI6ICVzJyAlIHdvcmtlcikKLSAgICAgICAgd29ya2VyLnRlcm1pbmF0ZSgpCi0gICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAwOgotICAgICAgICBwcmludCgnUmVxdWVzdGluZyBzZXJ2ZXIgdG8gc3RvcCgpJykKLSAgICAgIHRyeToKLSAgICAgICAgc2VydmVyLnN0b3AoKQotICAgICAgZXhjZXB0OgorICAgIHBmYWN0b3J5ID0gcHJvdF9mYWN0b3JpZXMuZ2V0KG9wdGlvbnMucHJvdG8sIE5vbmUpCisgICAgaWYgcGZhY3RvcnkgaXMgTm9uZToKKyAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoJ1Vua25vd24gLS1wcm90b2NvbCBvcHRpb246ICVzJyAlIG9wdGlvbnMucHJvdG8pCisgICAgdHJ5OgorICAgICAgICBwZmFjdG9yeS5zdHJpbmdfbGVuZ3RoX2xpbWl0ID0gb3B0aW9ucy5zdHJpbmdfbGltaXQKKyAgICAgICAgcGZhY3RvcnkuY29udGFpbmVyX2xlbmd0aF9saW1pdCA9IG9wdGlvbnMuY29udGFpbmVyX2xpbWl0CisgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgIyBJZ25vcmUgZXJyb3JzIGZvciB0aG9zZSBwcm90b2NvbHMgdGhhdCBkb2VzIG5vdCBzdXBwb3J0IGxlbmd0aCBsaW1pdAogICAgICAgICBwYXNzCi0gICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHQUxSTSwgY2xlYW5fc2h1dGRvd24pCi0gICAgc2lnbmFsLmFsYXJtKDQpCi0gIHNldF9hbGFybSgpCi1lbHNlOgotICAjIGxvb2sgdXAgc2VydmVyIGNsYXNzIGR5bmFtaWNhbGx5IHRvIGluc3RhbnRpYXRlIHNlcnZlcgotICBTZXJ2ZXJDbGFzcyA9IGdldGF0dHIoVFNlcnZlciwgc2VydmVyX3R5cGUpCi0gIHNlcnZlciA9IFNlcnZlckNsYXNzKHByb2Nlc3NvciwgdHJhbnNwb3J0LCB0ZmFjdG9yeSwgcGZhY3RvcnkpCi0jIGVudGVyIHNlcnZlciBtYWluIGxvb3AKLXNlcnZlci5zZXJ2ZSgpCisKKyAgICAjIGdldCB0aGUgc2VydmVyIHR5cGUgKFRTaW1wbGVTZXJ2ZXIsIFROb25ibG9ja2luZ1NlcnZlciwgZXRjLi4uKQorICAgIGlmIGxlbihhcmdzKSA+IDE6CisgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCdPbmx5IG9uZSBzZXJ2ZXIgdHlwZSBtYXkgYmUgc3BlY2lmaWVkLCBub3QgbXVsdGlwbGUgdHlwZXMuJykKKyAgICBzZXJ2ZXJfdHlwZSA9IGFyZ3NbMF0KKyAgICBpZiBvcHRpb25zLnRyYW5zID09ICdodHRwJzoKKyAgICAgICAgc2VydmVyX3R5cGUgPSAnVEh0dHBTZXJ2ZXInCisKKyAgICAjIFNldCB1cCB0aGUgaGFuZGxlciBhbmQgcHJvY2Vzc29yIG9iamVjdHMKKyAgICBoYW5kbGVyID0gVGVzdEhhbmRsZXIoKQorICAgIHByb2Nlc3NvciA9IFRocmlmdFRlc3QuUHJvY2Vzc29yKGhhbmRsZXIpCisKKyAgICBnbG9iYWwgc2VydmVyCisKKyAgICAjIEhhbmRsZSBUSHR0cFNlcnZlciBhcyBhIHNwZWNpYWwgY2FzZQorICAgIGlmIHNlcnZlcl90eXBlID09ICdUSHR0cFNlcnZlcic6CisgICAgICAgIGlmIG9wdGlvbnMuc3NsOgorICAgICAgICAgICAgX19jZXJ0ZmlsZSA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoU0NSSVBUX0RJUiksICJrZXlzIiwgInNlcnZlci5jcnQiKQorICAgICAgICAgICAgX19rZXlmaWxlID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShTQ1JJUFRfRElSKSwgImtleXMiLCAic2VydmVyLmtleSIpCisgICAgICAgICAgICBzZXJ2ZXIgPSBUSHR0cFNlcnZlci5USHR0cFNlcnZlcihwcm9jZXNzb3IsICgnJywgb3B0aW9ucy5wb3J0KSwgcGZhY3RvcnksIGNlcnRfZmlsZT1fX2NlcnRmaWxlLCBrZXlfZmlsZT1fX2tleWZpbGUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZXJ2ZXIgPSBUSHR0cFNlcnZlci5USHR0cFNlcnZlcihwcm9jZXNzb3IsICgnJywgb3B0aW9ucy5wb3J0KSwgcGZhY3RvcnkpCisgICAgICAgIHNlcnZlci5zZXJ2ZSgpCisgICAgICAgIHN5cy5leGl0KDApCisKKyAgICAjIHNldCB1cCBzZXJ2ZXIgdHJhbnNwb3J0IGFuZCB0cmFuc3BvcnQgZmFjdG9yeQorCisgICAgYWJzX2tleV9wYXRoID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShTQ1JJUFRfRElSKSwgJ2tleXMnLCAnc2VydmVyLnBlbScpCisKKyAgICBob3N0ID0gTm9uZQorICAgIGlmIG9wdGlvbnMuc3NsOgorICAgICAgICBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRTU0xTb2NrZXQKKyAgICAgICAgdHJhbnNwb3J0ID0gVFNTTFNvY2tldC5UU1NMU2VydmVyU29ja2V0KGhvc3QsIG9wdGlvbnMucG9ydCwgY2VydGZpbGU9YWJzX2tleV9wYXRoKQorICAgIGVsc2U6CisgICAgICAgIHRyYW5zcG9ydCA9IFRTb2NrZXQuVFNlcnZlclNvY2tldChob3N0LCBvcHRpb25zLnBvcnQpCisgICAgdGZhY3RvcnkgPSBUVHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoKQorICAgIGlmIG9wdGlvbnMudHJhbnMgPT0gJ2J1ZmZlcmVkJzoKKyAgICAgICAgdGZhY3RvcnkgPSBUVHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoKQorICAgIGVsaWYgb3B0aW9ucy50cmFucyA9PSAnZnJhbWVkJzoKKyAgICAgICAgdGZhY3RvcnkgPSBUVHJhbnNwb3J0LlRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KCkKKyAgICBlbGlmIG9wdGlvbnMudHJhbnMgPT0gJyc6CisgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCdVbmtub3duIC0tdHJhbnNwb3J0IG9wdGlvbjogJXMnICUgb3B0aW9ucy50cmFucykKKyAgICBlbHNlOgorICAgICAgICB0ZmFjdG9yeSA9IFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSgpCisgICAgIyBpZiAtLXpsaWIsIHRoZW4gd3JhcCBzZXJ2ZXIgdHJhbnNwb3J0LCBhbmQgdXNlIGEgZGlmZmVyZW50IHRyYW5zcG9ydCBmYWN0b3J5CisgICAgaWYgb3B0aW9ucy56bGliOgorICAgICAgICB0cmFuc3BvcnQgPSBUWmxpYlRyYW5zcG9ydC5UWmxpYlRyYW5zcG9ydCh0cmFuc3BvcnQpICAjIHdyYXAgIHdpdGggemxpYgorICAgICAgICB0ZmFjdG9yeSA9IFRabGliVHJhbnNwb3J0LlRabGliVHJhbnNwb3J0RmFjdG9yeSgpCisKKyAgICAjIGRvIHNlcnZlci1zcGVjaWZpYyBzZXR1cCBoZXJlOgorICAgIGlmIHNlcnZlcl90eXBlID09ICJUTm9uYmxvY2tpbmdTZXJ2ZXIiOgorICAgICAgICBzZXJ2ZXIgPSBUTm9uYmxvY2tpbmdTZXJ2ZXIuVE5vbmJsb2NraW5nU2VydmVyKHByb2Nlc3NvciwgdHJhbnNwb3J0LCBpbnB1dFByb3RvY29sRmFjdG9yeT1wZmFjdG9yeSkKKyAgICBlbGlmIHNlcnZlcl90eXBlID09ICJUUHJvY2Vzc1Bvb2xTZXJ2ZXIiOgorICAgICAgICBpbXBvcnQgc2lnbmFsCisgICAgICAgIGZyb20gdGhyaWZ0LnNlcnZlciBpbXBvcnQgVFByb2Nlc3NQb29sU2VydmVyCisgICAgICAgIHNlcnZlciA9IFRQcm9jZXNzUG9vbFNlcnZlci5UUHJvY2Vzc1Bvb2xTZXJ2ZXIocHJvY2Vzc29yLCB0cmFuc3BvcnQsIHRmYWN0b3J5LCBwZmFjdG9yeSkKKyAgICAgICAgc2VydmVyLnNldE51bVdvcmtlcnMoNSkKKworICAgICAgICBkZWYgc2V0X2FsYXJtKCk6CisgICAgICAgICAgICBkZWYgY2xlYW5fc2h1dGRvd24oc2lnbnVtLCBmcmFtZSk6CisgICAgICAgICAgICAgICAgZm9yIHdvcmtlciBpbiBzZXJ2ZXIud29ya2VyczoKKyAgICAgICAgICAgICAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygnVGVybWluYXRpbmcgd29ya2VyOiAlcycgJSB3b3JrZXIpCisgICAgICAgICAgICAgICAgICAgIHdvcmtlci50ZXJtaW5hdGUoKQorICAgICAgICAgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDA6CisgICAgICAgICAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygnUmVxdWVzdGluZyBzZXJ2ZXIgdG8gc3RvcCgpJykKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHNlcnZlci5zdG9wKCkKKyAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdBTFJNLCBjbGVhbl9zaHV0ZG93bikKKyAgICAgICAgICAgIHNpZ25hbC5hbGFybSg0KQorICAgICAgICBzZXRfYWxhcm0oKQorICAgIGVsc2U6CisgICAgICAgICMgbG9vayB1cCBzZXJ2ZXIgY2xhc3MgZHluYW1pY2FsbHkgdG8gaW5zdGFudGlhdGUgc2VydmVyCisgICAgICAgIFNlcnZlckNsYXNzID0gZ2V0YXR0cihUU2VydmVyLCBzZXJ2ZXJfdHlwZSkKKyAgICAgICAgc2VydmVyID0gU2VydmVyQ2xhc3MocHJvY2Vzc29yLCB0cmFuc3BvcnQsIHRmYWN0b3J5LCBwZmFjdG9yeSkKKyAgICAjIGVudGVyIHNlcnZlciBtYWluIGxvb3AKKyAgICBzZXJ2ZXIuc2VydmUoKQorCisKK2RlZiBleGl0X2dyYWNlZnVsbHkoc2lnbnVtLCBmcmFtZSk6CisgICAgcHJpbnQoIlNJR0lOVCByZWNlaXZlZFxuIikKKyAgICBzZXJ2ZXIuc2h1dGRvd24oKSAgICMgZG9lc24ndCB3b3JrIHByb3Blcmx5LCB5ZXQKKyAgICBzeXMuZXhpdCgwKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHSU5ULCBleGl0X2dyYWNlZnVsbHkpCisKKyAgICBwYXJzZXIgPSBPcHRpb25QYXJzZXIoKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCctLWxpYnB5ZGlyJywgdHlwZT0nc3RyaW5nJywgZGVzdD0nbGlicHlkaXInLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2luY2x1ZGUgdGhpcyBkaXJlY3RvcnkgdG8gc3lzLnBhdGggZm9yIGxvY2F0aW5nIGxpYnJhcnkgY29kZScpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy0tZ2VucHlkaXInLCB0eXBlPSdzdHJpbmcnLCBkZXN0PSdnZW5weWRpcicsCisgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0nZ2VuLXB5JywKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdpbmNsdWRlIHRoaXMgZGlyZWN0b3J5IHRvIHN5cy5wYXRoIGZvciBsb2NhdGluZyBnZW5lcmF0ZWQgY29kZScpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oIi0tcG9ydCIsIHR5cGU9ImludCIsIGRlc3Q9InBvcnQiLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9InBvcnQgbnVtYmVyIGZvciBzZXJ2ZXIgdG8gbGlzdGVuIG9uIikKKyAgICBwYXJzZXIuYWRkX29wdGlvbigiLS16bGliIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwgZGVzdD0iemxpYiIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0idXNlIHpsaWIgd3JhcHBlciBmb3IgY29tcHJlc3NlZCB0cmFuc3BvcnQiKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCItLXNzbCIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGRlc3Q9InNzbCIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0idXNlIFNTTCBmb3IgZW5jcnlwdGVkIHRyYW5zcG9ydCIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy12JywgJy0tdmVyYm9zZScsIGFjdGlvbj0ic3RvcmVfY29uc3QiLAorICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9InZlcmJvc2UiLCBjb25zdD0yLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9InZlcmJvc2Ugb3V0cHV0IikKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLXEnLCAnLS1xdWlldCcsIGFjdGlvbj0ic3RvcmVfY29uc3QiLAorICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9InZlcmJvc2UiLCBjb25zdD0wLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9Im1pbmltYWwgb3V0cHV0IikKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLS1wcm90b2NvbCcsIGRlc3Q9InByb3RvIiwgdHlwZT0ic3RyaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJwcm90b2NvbCB0byB1c2UsIG9uZSBvZjogYWNjZWwsIGFjY2VsYywgYmluYXJ5LCBjb21wYWN0LCBqc29uIikKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLS10cmFuc3BvcnQnLCBkZXN0PSJ0cmFucyIsIHR5cGU9InN0cmluZyIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0idHJhbnNwb3J0IHRvIHVzZSwgb25lIG9mOiBidWZmZXJlZCwgZnJhbWVkLCBodHRwIikKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLS1jb250YWluZXItbGltaXQnLCBkZXN0PSdjb250YWluZXJfbGltaXQnLCB0eXBlPSdpbnQnLCBkZWZhdWx0PU5vbmUpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy0tc3RyaW5nLWxpbWl0JywgZGVzdD0nc3RyaW5nX2xpbWl0JywgdHlwZT0naW50JywgZGVmYXVsdD1Ob25lKQorICAgIHBhcnNlci5zZXRfZGVmYXVsdHMocG9ydD05MDkwLCB2ZXJib3NlPTEsIHByb3RvPSdiaW5hcnknLCB0cmFuc3BvcnQ9J2J1ZmZlcmVkJykKKyAgICBvcHRpb25zLCBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQorCisgICAgIyBQcmludCBUU2VydmVyIGxvZyB0byBzdGRvdXQgc28gdGhhdCB0aGUgdGVzdC1ydW5uZXIgY2FuIHJlZGlyZWN0IGl0IHRvIGxvZyBmaWxlcworICAgIGxvZ2dpbmcuYmFzaWNDb25maWcobGV2ZWw9b3B0aW9ucy52ZXJib3NlKQorCisgICAgc3lzLnBhdGguaW5zZXJ0KDAsIG9zLnBhdGguam9pbihTQ1JJUFRfRElSLCBvcHRpb25zLmdlbnB5ZGlyKSkKKyAgICBzeXMucGF0aC5pbnNlcnQoMCwgbG9jYWxfbGlicGF0aCgpKQorCisgICAgZnJvbSBUaHJpZnRUZXN0IGltcG9ydCBUaHJpZnRUZXN0CisgICAgZnJvbSBUaHJpZnRUZXN0LnR0eXBlcyBpbXBvcnQgWHRydWN0LCBYY2VwdGlvbiwgWGNlcHRpb24yLCBJbnNhbml0eQorICAgIGZyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgVEV4Y2VwdGlvbgorICAgIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVEhlYWRlclRyYW5zcG9ydAorICAgIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAorICAgIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFNvY2tldAorICAgIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFpsaWJUcmFuc3BvcnQKKyAgICBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCisgICAgZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRDb21wYWN0UHJvdG9jb2wKKyAgICBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEhlYWRlclByb3RvY29sCisgICAgZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRKU09OUHJvdG9jb2wKKyAgICBmcm9tIHRocmlmdC5zZXJ2ZXIgaW1wb3J0IFRTZXJ2ZXIsIFROb25ibG9ja2luZ1NlcnZlciwgVEh0dHBTZXJ2ZXIKKworICAgIHN5cy5leGl0KG1haW4ob3B0aW9ucykpCmRpZmYgLS1naXQgYS90ZXN0L3B5L1Rlc3RTb2NrZXQucHkgYi90ZXN0L3B5L1Rlc3RTb2NrZXQucHkKaW5kZXggYjliZGYyNy4uNjE5ZWIxMCAxMDA3NTUKLS0tIGEvdGVzdC9weS9UZXN0U29ja2V0LnB5CisrKyBiL3Rlc3QvcHkvVGVzdFNvY2tldC5weQpAQCAtMTksMjkgKzE5LDE2IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1pbXBvcnQgc3lzLCBnbG9iCi1mcm9tIG9wdHBhcnNlIGltcG9ydCBPcHRpb25QYXJzZXIKLXBhcnNlciA9IE9wdGlvblBhcnNlcigpCi1wYXJzZXIuYWRkX29wdGlvbignLS1nZW5weWRpcicsIHR5cGU9J3N0cmluZycsIGRlc3Q9J2dlbnB5ZGlyJywgZGVmYXVsdD0nZ2VuLXB5JykKLW9wdGlvbnMsIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCi1kZWwgc3lzLmFyZ3ZbMTpdICMgY2xlYW4gdXAgaGFjayBzbyB1bml0dGVzdCBkb2Vzbid0IGNvbXBsYWluCi1zeXMucGF0aC5pbnNlcnQoMCwgb3B0aW9ucy5nZW5weWRpcikKLXN5cy5wYXRoLmluc2VydCgwLCBnbG9iLmdsb2IoJy4uLy4uL2xpYi9weS9idWlsZC9saWIuKicpWzBdKQotCi1mcm9tIFRocmlmdFRlc3QgaW1wb3J0IFRocmlmdFRlc3QKLWZyb20gVGhyaWZ0VGVzdC50dHlwZXMgaW1wb3J0ICoKLWZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAogZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUU29ja2V0Ci1mcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCB0aW1lCiBpbXBvcnQgc29ja2V0CiBpbXBvcnQgcmFuZG9tCi1mcm9tIG9wdHBhcnNlIGltcG9ydCBPcHRpb25QYXJzZXIKKwogCiBjbGFzcyBUaW1lb3V0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHNldFVwKHNlbGYpOgotICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoNTApOgorICAgICAgICBmb3IgaSBpbiByYW5nZSg1MCk6CiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgIyBmaW5kIGEgcG9ydCB3ZSBjYW4gdXNlCiAgICAgICAgICAgICAgICAgc2VsZi5saXN0ZW5fc29jayA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKQEAgLTQ5LDcgKzM2LDcgQEAKICAgICAgICAgICAgICAgICBzZWxmLmxpc3Rlbl9zb2NrLmJpbmQoKCdsb2NhbGhvc3QnLCBzZWxmLnBvcnQpKQogICAgICAgICAgICAgICAgIHNlbGYubGlzdGVuX3NvY2subGlzdGVuKDUpCiAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICAgICAgaWYgaSA9PSA0OToKICAgICAgICAgICAgICAgICAgICAgcmFpc2UKIApAQCAtNTgsMTIgKzQ1LDEyIEBACiAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgbGVha3kgPSBbXQotICAgICAgICAgICAgZm9yIGkgaW4geHJhbmdlKDEwMCk6CisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgxMDApOgogICAgICAgICAgICAgICAgIHNvY2tldCA9IFRTb2NrZXQuVFNvY2tldCgnbG9jYWxob3N0Jywgc2VsZi5wb3J0KQogICAgICAgICAgICAgICAgIHNvY2tldC5zZXRUaW1lb3V0KDEwKQogICAgICAgICAgICAgICAgIHNvY2tldC5vcGVuKCkKICAgICAgICAgICAgICAgICBsZWFreS5hcHBlbmQoc29ja2V0KQotICAgICAgICBleGNlcHQ6CisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICBzZWxmLmFzc2VydF8odGltZS50aW1lKCkgLSBzdGFydHRpbWUgPCA1LjApCiAKICAgICBkZWYgdGVzdFdyaXRlVGltZW91dChzZWxmKToKQEAgLTc1LDE1ICs2MiwxNyBAQAogICAgICAgICAgICAgc29ja2V0Lm9wZW4oKQogICAgICAgICAgICAgbHNvY2sgPSBzZWxmLmxpc3Rlbl9zb2NrLmFjY2VwdCgpCiAgICAgICAgICAgICB3aGlsZSBUcnVlOgotICAgICAgICAgICAgICAgIHNvY2tldC53cml0ZSgiaGkiICogMTAwKQorICAgICAgICAgICAgICAgIGxzb2NrLndyaXRlKCJoaSIgKiAxMDApCiAKLSAgICAgICAgZXhjZXB0OgorICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHRpbWUudGltZSgpIC0gc3RhcnR0aW1lIDwgNS4wKQogCi1zdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCi1sb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKIAotc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKFRpbWVvdXRUZXN0KSkKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQogCi10ZXN0UnVubmVyID0gdW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIodmVyYm9zaXR5PTIpCi10ZXN0UnVubmVyLnJ1bihzdWl0ZSkKKyAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoVGltZW91dFRlc3QpKQorCisgICAgdGVzdFJ1bm5lciA9IHVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKHZlcmJvc2l0eT0yKQorICAgIHRlc3RSdW5uZXIucnVuKHN1aXRlKQpkaWZmIC0tZ2l0IGEvdGVzdC9weS9UZXN0U3ludGF4LnB5IGIvdGVzdC9weS9UZXN0U3ludGF4LnB5CmluZGV4IDlmNzFjZjUuLmRiZTc5NzUgMTAwNzU1Ci0tLSBhL3Rlc3QvcHkvVGVzdFN5bnRheC5weQorKysgYi90ZXN0L3B5L1Rlc3RTeW50YXgucHkKQEAgLTE5LDE1ICsxOSw2IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1pbXBvcnQgc3lzLCBnbG9iCi1mcm9tIG9wdHBhcnNlIGltcG9ydCBPcHRpb25QYXJzZXIKLXBhcnNlciA9IE9wdGlvblBhcnNlcigpCi1wYXJzZXIuYWRkX29wdGlvbignLS1nZW5weWRpcicsIHR5cGU9J3N0cmluZycsIGRlc3Q9J2dlbnB5ZGlyJywgZGVmYXVsdD0nZ2VuLXB5JykKLW9wdGlvbnMsIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCi1kZWwgc3lzLmFyZ3ZbMTpdICMgY2xlYW4gdXAgaGFjayBzbyB1bml0dGVzdCBkb2Vzbid0IGNvbXBsYWluCi1zeXMucGF0aC5pbnNlcnQoMCwgb3B0aW9ucy5nZW5weWRpcikKLXN5cy5wYXRoLmluc2VydCgwLCBnbG9iLmdsb2IoJy4uLy4uL2xpYi9weS9idWlsZC9saWIuKicpWzBdKQotCiAjIEp1c3QgaW1wb3J0IHRoZXNlIGdlbmVyYXRlZCBmaWxlcyB0byBtYWtlIHN1cmUgdGhleSBhcmUgc3ludGFjdGljYWxseSB2YWxpZAotZnJvbSBEZWJ1Z1Byb3RvVGVzdCBpbXBvcnQgRW1wdHlTZXJ2aWNlCi1mcm9tIERlYnVnUHJvdG9UZXN0IGltcG9ydCBJbmhlcml0ZWQKK2Zyb20gRGVidWdQcm90b1Rlc3QgaW1wb3J0IEVtcHR5U2VydmljZSAgIyBub3FhCitmcm9tIERlYnVnUHJvdG9UZXN0IGltcG9ydCBJbmhlcml0ZWQgICMgbm9xYQpkaWZmIC0tZ2l0IGEvdGVzdC9weS9nZW5lcmF0ZS5jbWFrZSBiL3Rlc3QvcHkvZ2VuZXJhdGUuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVkMTRjYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcHkvZ2VuZXJhdGUuY21ha2UKQEAgLTAsMCArMSwzNiBAQAorbWFjcm8oR0VORVJBVEUgRklMRU5BTUUgR0VORVJBVE9SIE9VVFBVVERJUikKKyAgZmlsZShNQUtFX0RJUkVDVE9SWSAke01ZX0NVUlJFTlRfQklOQVJZX0RJUn0vJHtPVVRQVVRESVJ9KQorICBleGVjdXRlX3Byb2Nlc3MoQ09NTUFORCAke1RIUklGVENPTVBJTEVSfSAtLWdlbiAke0dFTkVSQVRPUn0gLW91dCAke01ZX0NVUlJFTlRfQklOQVJZX0RJUn0vJHtPVVRQVVRESVJ9ICR7RklMRU5BTUV9CisgICAgICAgICAgICAgICAgICBSRVNVTFRfVkFSSUFCTEUgQ01EX1JFU1VMVCkKKyAgaWYoQ01EX1JFU1VMVCkKKyAgICAgICAgbWVzc2FnZShGQVRBTF9FUlJPUiAiRXJyb3IgZ2VuZXJhdGluZyAke0ZJTEVOQU1FfSB3aXRoIGdlbmVyYXRvciAke0dFTkVSQVRPUn0iKQorICBlbmRpZigpCitlbmRtYWNybyhHRU5FUkFURSkKKworZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCBweSBnZW4tcHktZGVmYXVsdCkKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQgcHk6c2xvdHMgZ2VuLXB5LXNsb3RzKQorZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCBweTpvbGRfc3R5bGUgZ2VuLXB5LW9sZHN0eWxlKQorZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCBweTpub191dGY4c3RyaW5ncyBnZW4tcHktbm9fdXRmOHN0cmluZ3MpCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0IHB5OmR5bmFtaWMgZ2VuLXB5LWR5bmFtaWMpCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0IHB5OmR5bmFtaWMsc2xvdHMgZ2VuLXB5LWR5bmFtaWNzbG90cykKKworZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQgcHkgZ2VuLXB5LWRlZmF1bHQpCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L0RlYnVnUHJvdG9UZXN0LnRocmlmdCBweTpzbG90cyBnZW4tcHktc2xvdHMpCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L0RlYnVnUHJvdG9UZXN0LnRocmlmdCBweTpvbGRfc3R5bGUgZ2VuLXB5LW9sZHN0eWxlKQorZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQgcHk6bm9fdXRmOHN0cmluZ3MgZ2VuLXB5LW5vX3V0ZjhzdHJpbmdzKQorZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQgcHk6ZHluYW1pYyBnZW4tcHktZHluYW1pYykKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvRGVidWdQcm90b1Rlc3QudGhyaWZ0IHB5OmR5bmFtaWMsc2xvdHMgZ2VuLXB5LWR5bmFtaWNzbG90cykKKworZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9Eb3VibGVDb25zdGFudHNUZXN0LnRocmlmdCBweSBnZW4tcHktZGVmYXVsdCkKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvRG91YmxlQ29uc3RhbnRzVGVzdC50aHJpZnQgcHk6c2xvdHMgZ2VuLXB5LXNsb3RzKQorZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9Eb3VibGVDb25zdGFudHNUZXN0LnRocmlmdCBweTpvbGRfc3R5bGUgZ2VuLXB5LW9sZHN0eWxlKQorZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9Eb3VibGVDb25zdGFudHNUZXN0LnRocmlmdCBweTpub191dGY4c3RyaW5ncyBnZW4tcHktbm9fdXRmOHN0cmluZ3MpCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L0RvdWJsZUNvbnN0YW50c1Rlc3QudGhyaWZ0IHB5OmR5bmFtaWMgZ2VuLXB5LWR5bmFtaWMpCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L0RvdWJsZUNvbnN0YW50c1Rlc3QudGhyaWZ0IHB5OmR5bmFtaWMsc2xvdHMgZ2VuLXB5LWR5bmFtaWNzbG90cykKKworZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9SZWN1cnNpdmUudGhyaWZ0IHB5IGdlbi1weS1kZWZhdWx0KQorZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9SZWN1cnNpdmUudGhyaWZ0IHB5OnNsb3RzIGdlbi1weS1zbG90cykKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvUmVjdXJzaXZlLnRocmlmdCBweTpvbGRfc3R5bGUgZ2VuLXB5LW9sZHN0eWxlKQorZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9SZWN1cnNpdmUudGhyaWZ0IHB5Om5vX3V0ZjhzdHJpbmdzIGdlbi1weS1ub191dGY4c3RyaW5ncykKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvUmVjdXJzaXZlLnRocmlmdCBweTpkeW5hbWljIGdlbi1weS1keW5hbWljKQorZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9SZWN1cnNpdmUudGhyaWZ0IHB5OmR5bmFtaWMsc2xvdHMgZ2VuLXB5LWR5bmFtaWNzbG90cykKZGlmZiAtLWdpdCBhL3Rlc3QvcHkvc2V0dXAuY2ZnIGIvdGVzdC9weS9zZXR1cC5jZmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RhMWY5NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcHkvc2V0dXAuY2ZnCkBAIC0wLDAgKzEsMiBAQAorW2ZsYWtlOF0KK21heC1saW5lLWxlbmd0aCA9IDEwMApkaWZmIC0tZ2l0IGEvdGVzdC9weS91dGlsLnB5IGIvdGVzdC9weS91dGlsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyYjNmNWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3B5L3V0aWwucHkKQEAgLTAsMCArMSwzMiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2ltcG9ydCBnbG9iCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKKworX1NDUklQVF9ESVIgPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSkKK19ST09UX0RJUiA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUoX1NDUklQVF9ESVIpKQorCisKK2RlZiBsb2NhbF9saWJwYXRoKCk6CisgICAgZ2xvYmRpciA9IG9zLnBhdGguam9pbihfUk9PVF9ESVIsICdsaWInLCAncHknLCAnYnVpbGQnLCAnbGliLionKQorICAgIGZvciBsaWJwYXRoIGluIGdsb2IuZ2xvYihnbG9iZGlyKToKKyAgICAgICAgaWYgbGlicGF0aC5lbmRzd2l0aCgnLSVkLiVkJyAlIChzeXMudmVyc2lvbl9pbmZvWzBdLCBzeXMudmVyc2lvbl9pbmZvWzFdKSk6CisgICAgICAgICAgICByZXR1cm4gbGlicGF0aApkaWZmIC0tZ2l0IGEvdGVzdC9yYi9HZW1maWxlIGIvdGVzdC9yYi9HZW1maWxlCmluZGV4IDgzMDFlNDQuLjRmZjA1MzkgMTAwNjQ0Ci0tLSBhL3Rlc3QvcmIvR2VtZmlsZQorKysgYi90ZXN0L3JiL0dlbWZpbGUKQEAgLTIsNSArMiw2IEBACiAKIHJlcXVpcmUgInJ1YnlnZW1zIgogCi1nZW0gInJhY2siLCAifj4gMS41LjIiCi1nZW0gInRoaW4iLCAifj4gMS41LjAiCitnZW0gJ3JhY2snLCAnfj4gMi4wJywgJz49IDIuMC40JworZ2VtICd0aGluJywgJ34+IDEuNycsICc+PSAxLjcuMicKK2dlbSAndGVzdC11bml0JywgJ34+IDMuMicsICc+PSAzLjIuNycKZGlmZiAtLWdpdCBhL3Rlc3QvcmIvTWFrZWZpbGUuYW0gYi90ZXN0L3JiL01ha2VmaWxlLmFtCmluZGV4IDdiNzRjNmMuLmNmZGMxNDkgMTAwNjQ0Ci0tLSBhL3Rlc3QvcmIvTWFrZWZpbGUuYW0KKysrIGIvdGVzdC9yYi9NYWtlZmlsZS5hbQpAQCAtMTcsMTEgKzE3LDEwIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1USFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAotCiBzdHViczogJChUSFJJRlQpIC4uL1RocmlmdFRlc3QudGhyaWZ0IC4uL1NtYWxsVGVzdC50aHJpZnQKIAkkKFRIUklGVCkgLS1nZW4gcmIgLi4vVGhyaWZ0VGVzdC50aHJpZnQKIAkkKFRIUklGVCkgLS1nZW4gcmIgLi4vU21hbGxUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiByYiAuLi9SZWN1cnNpdmUudGhyaWZ0CiAKIHByZWNyb3NzOiBzdHVicwogCmRpZmYgLS1naXQgYS90ZXN0L3JiL2dlbmVyYXRpb24vdGVzdF9yZWN1cnNpdmUucmIgYi90ZXN0L3JiL2dlbmVyYXRpb24vdGVzdF9yZWN1cnNpdmUucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkxMmY3MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcmIvZ2VuZXJhdGlvbi90ZXN0X3JlY3Vyc2l2ZS5yYgpAQCAtMCwwICsxLDQxIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworcmVxdWlyZSBGaWxlLmpvaW4oRmlsZS5kaXJuYW1lKF9fRklMRV9fKSwgJy4uL3Rlc3RfaGVscGVyJykKK3JlcXVpcmUgJ3JlY3Vyc2l2ZV90eXBlcycKKworY2xhc3MgVGVzdFJlY3Vyc2l2ZUdlbmVyYXRpb24gPCBUZXN0OjpVbml0OjpUZXN0Q2FzZQorICBDSElMRF9JVEVNID0gImNoaWxkIGl0ZW0iCisgIFBBUkVOVF9JVEVNID0gInBhcmVudCBpdGVtIgorCisgIGRlZiB0ZXN0X2Nhbl9jcmVhdGVfcmVjdXJzaXZlX3RyZWUKKworICAgIGNoaWxkX3RyZWUgPSBSZWNUcmVlLm5ldworICAgIGNoaWxkX3RyZWUuaXRlbSA9IENISUxEX0lURU0KKworICAgIHBhcmVudF90cmVlID0gUmVjVHJlZS5uZXcKKyAgICBwYXJlbnRfdHJlZS5pdGVtID0gUEFSRU5UX0lURU0KKyAgICBwYXJlbnRfdHJlZS5jaGlsZHJlbiA9IFtjaGlsZF90cmVlXQorCisgICAgYXNzZXJ0X2VxdWFsKFBBUkVOVF9JVEVNLCBwYXJlbnRfdHJlZS5pdGVtKQorICAgIGFzc2VydF9lcXVhbCgxLCBwYXJlbnRfdHJlZS5jaGlsZHJlbi5sZW5ndGgpCisgICAgYXNzZXJ0X2VxdWFsKENISUxEX0lURU0sIHBhcmVudF90cmVlLmNoaWxkcmVuLmZpcnN0Lml0ZW0pCisgICAgYXNzZXJ0X25pbChwYXJlbnRfdHJlZS5jaGlsZHJlbi5maXJzdC5jaGlsZHJlbikKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL3Rlc3QvcmIvaW50ZWdyYXRpb24vVGVzdENsaWVudC5yYiBiL3Rlc3QvcmIvaW50ZWdyYXRpb24vVGVzdENsaWVudC5yYgppbmRleCBiMzFhMDI0Li42MzlhY2E5IDEwMDc1NQotLS0gYS90ZXN0L3JiL2ludGVncmF0aW9uL1Rlc3RDbGllbnQucmIKKysrIGIvdGVzdC9yYi9pbnRlZ3JhdGlvbi9UZXN0Q2xpZW50LnJiCkBAIC0xLDQgKzEsNSBAQAogIyEvdXNyL2Jpbi9lbnYgcnVieQorIyBlbmNvZGluZzogdXRmLTgKIAogIwogIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCkBAIC0yNSwzNSArMjYsNjMgQEAKIHJlcXVpcmUgJ3RocmlmdCcKIHJlcXVpcmUgJ3RocmlmdF90ZXN0JwogCi0kcHJvdG9jb2xUeXBlID0gImJpbmFyeSIKKyRkb21haW5fc29ja2V0ID0gbmlsCiAkaG9zdCA9ICJsb2NhbGhvc3QiCiAkcG9ydCA9IDkwOTAKKyRwcm90b2NvbFR5cGUgPSAiYmluYXJ5IgorJHNzbCA9IGZhbHNlCiAkdHJhbnNwb3J0ID0gImJ1ZmZlcmVkIgorCiBBUkdWLmVhY2ggZG98YXwKICAgaWYgYSA9PSAiLS1oZWxwIgogICAgIHB1dHMgIkFsbG93ZWQgb3B0aW9uczoiCiAgICAgcHV0cyAiXHQgLWggWyAtLWhlbHAgXSBcdCBwcm9kdWNlIGhlbHAgbWVzc2FnZSIKLSAgICBwdXRzICJcdC0taG9zdCBhcmcgKD1sb2NhbGhvc3QpIFx0IEhvc3QgdG8gY29ubmVjdCIKLSAgICBwdXRzICJcdC0tcG9ydCBhcmcgKD05MDkwKSBcdCBQb3J0IG51bWJlciB0byBsaXN0ZW4iCi0gICAgcHV0cyAiXHQtLXByb3RvY29sIGFyZyAoPWJpbmFyeSkgXHQgcHJvdG9jb2w6IGJpbmFyeSwgYWNjZWwiCisgICAgcHV0cyAiXHQtLWRvbWFpbi1zb2NrZXQgYXJnICg9KSBcdCBVbml4IGRvbWFpbiBzb2NrZXQgcGF0aCIKKyAgICBwdXRzICJcdC0taG9zdCBhcmcgKD1sb2NhbGhvc3QpIFx0IEhvc3QgdG8gY29ubmVjdCBcdCBub3QgdmFsaWQgd2l0aCBkb21haW4tc29ja2V0IgorICAgIHB1dHMgIlx0LS1wb3J0IGFyZyAoPTkwOTApIFx0IFBvcnQgbnVtYmVyIHRvIGxpc3RlbiBcdCBub3QgdmFsaWQgd2l0aCBkb21haW4tc29ja2V0IgorICAgIHB1dHMgIlx0LS1wcm90b2NvbCBhcmcgKD1iaW5hcnkpIFx0IHByb3RvY29sOiBhY2NlbCwgYmluYXJ5LCBjb21wYWN0LCBqc29uIgorICAgIHB1dHMgIlx0LS1zc2wgXHQgdXNlIHNzbCBcdCBub3QgdmFsaWQgd2l0aCBkb21haW4tc29ja2V0IgogICAgIHB1dHMgIlx0LS10cmFuc3BvcnQgYXJnICg9YnVmZmVyZWQpIHRyYW5zcG9ydDogYnVmZmVyZWQsIGZyYW1lZCwgaHR0cCIKICAgICBleGl0CisgIGVsc2lmIGEuc3RhcnRfd2l0aD8oIi0tZG9tYWluLXNvY2tldCIpCisgICAgJGRvbWFpbl9zb2NrZXQgPSBhLnNwbGl0KCI9IilbMV0KICAgZWxzaWYgYS5zdGFydF93aXRoPygiLS1ob3N0IikKICAgICAkaG9zdCA9IGEuc3BsaXQoIj0iKVsxXQogICBlbHNpZiBhLnN0YXJ0X3dpdGg/KCItLXByb3RvY29sIikKICAgICAkcHJvdG9jb2xUeXBlID0gYS5zcGxpdCgiPSIpWzFdCisgIGVsc2lmIGEgPT0gIi0tc3NsIgorICAgICRzc2wgPSB0cnVlCiAgIGVsc2lmIGEuc3RhcnRfd2l0aD8oIi0tdHJhbnNwb3J0IikKICAgICAkdHJhbnNwb3J0ID0gYS5zcGxpdCgiPSIpWzFdCiAgIGVsc2lmIGEuc3RhcnRfd2l0aD8oIi0tcG9ydCIpCi0gICAgJHBvcnQgPSBhLnNwbGl0KCI9IilbMV0udG9faSAKKyAgICAkcG9ydCA9IGEuc3BsaXQoIj0iKVsxXS50b19pCiAgIGVuZAogZW5kCi1BUkdWPVtdCiAKIGNsYXNzIFNpbXBsZUNsaWVudFRlc3QgPCBUZXN0OjpVbml0OjpUZXN0Q2FzZQotICBkZWYgc2V0dXAgCisgIGRlZiBzZXR1cAogICAgIHVubGVzcyBAc29ja2V0Ci0gICAgICBAc29ja2V0ICAgPSBUaHJpZnQ6OlNvY2tldC5uZXcoJGhvc3QsICRwb3J0KQorICAgICAgaWYgJGRvbWFpbl9zb2NrZXQudG9fcy5zdHJpcC5lbXB0eT8KKyAgICAgICAgaWYgJHNzbAorICAgICAgICAgICMgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGZvciBydWJ5IGNyb3NzdGVzdCBpcyB0ZXN0L3JiL2dlbi1yYgorICAgICAgICAgIGtleXNEaXIgPSBGaWxlLmpvaW4oRmlsZS5kaXJuYW1lKEZpbGUuZGlybmFtZShEaXIucHdkKSksICJrZXlzIikKKyAgICAgICAgICBjdHggPSBPcGVuU1NMOjpTU0w6OlNTTENvbnRleHQubmV3CisgICAgICAgICAgY3R4LmNhX2ZpbGUgPSBGaWxlLmpvaW4oa2V5c0RpciwgIkNBLnBlbSIpCisgICAgICAgICAgY3R4LmNlcnQgPSBPcGVuU1NMOjpYNTA5OjpDZXJ0aWZpY2F0ZS5uZXcoRmlsZS5vcGVuKEZpbGUuam9pbihrZXlzRGlyLCAiY2xpZW50LmNydCIpKSkKKyAgICAgICAgICBjdHguY2VydF9zdG9yZSA9IE9wZW5TU0w6Olg1MDk6OlN0b3JlLm5ldworICAgICAgICAgIGN0eC5jZXJ0X3N0b3JlLmFkZF9maWxlKEZpbGUuam9pbihrZXlzRGlyLCAnc2VydmVyLnBlbScpKQorICAgICAgICAgIGN0eC5rZXkgPSBPcGVuU1NMOjpQS2V5OjpSU0EubmV3KEZpbGUub3BlbihGaWxlLmpvaW4oa2V5c0RpciwgImNsaWVudC5rZXkiKSkpCisgICAgICAgICAgY3R4Lm9wdGlvbnMgPSBPcGVuU1NMOjpTU0w6Ok9QX05PX1NTTHYyIHwgT3BlblNTTDo6U1NMOjpPUF9OT19TU0x2MworICAgICAgICAgIGN0eC5zc2xfdmVyc2lvbiA9IDpTU0x2MjMKKyAgICAgICAgICBjdHgudmVyaWZ5X21vZGUgPSBPcGVuU1NMOjpTU0w6OlZFUklGWV9QRUVSCisgICAgICAgICAgQHNvY2tldCA9IFRocmlmdDo6U1NMU29ja2V0Lm5ldygkaG9zdCwgJHBvcnQsIG5pbCwgY3R4KQorICAgICAgICBlbHNlCisgICAgICAgICAgQHNvY2tldCA9IFRocmlmdDo6U29ja2V0Lm5ldygkaG9zdCwgJHBvcnQpCisgICAgICAgIGVuZAorICAgICAgZWxzZQorICAgICAgICBAc29ja2V0ID0gVGhyaWZ0OjpVTklYU29ja2V0Lm5ldygkZG9tYWluX3NvY2tldCkKKyAgICAgIGVuZAorICAgICAgCiAgICAgICBpZiAkdHJhbnNwb3J0ID09ICJidWZmZXJlZCIKICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSA9IFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQubmV3KEBzb2NrZXQpCiAgICAgICBlbHNpZiAkdHJhbnNwb3J0ID09ICJmcmFtZWQiCkBAIC03MywxMSArMTAyLDE1IEBACiAgICAgICBlbHNlCiAgICAgICAgIHJhaXNlICdVbmtub3duIHByb3RvY29sIHR5cGUnCiAgICAgICBlbmQKLSAgICAgIEBjbGllbnQgICA9IFRocmlmdDo6VGVzdDo6VGhyaWZ0VGVzdDo6Q2xpZW50Lm5ldyhAcHJvdG9jb2wpCisgICAgICBAY2xpZW50ID0gVGhyaWZ0OjpUZXN0OjpUaHJpZnRUZXN0OjpDbGllbnQubmV3KEBwcm90b2NvbCkKICAgICAgIEBzb2NrZXQub3BlbgogICAgIGVuZAogICBlbmQKLSAgCisKKyAgZGVmIHRlYXJkb3duCisgICAgQHNvY2tldC5jbG9zZQorICBlbmQKKwogICBkZWYgdGVzdF92b2lkCiAgICAgcCAndGVzdF92b2lkJwogICAgIEBjbGllbnQudGVzdFZvaWQoKQpAQCAtODUsNyArMTE4LDQxIEBACiAKICAgZGVmIHRlc3Rfc3RyaW5nCiAgICAgcCAndGVzdF9zdHJpbmcnCi0gICAgYXNzZXJ0X2VxdWFsKEBjbGllbnQudGVzdFN0cmluZygnc3RyaW5nJyksICdzdHJpbmcnKQorICAgIHRlc3Rfc3RyaW5nID0KKyAgICAgICdxdW90ZTogXCIgYmFja3NsYXNoOicgKworICAgICAgJyBmb3J3YXJkc2xhc2gtZXNjYXBlZDogXC8gJyArCisgICAgICAnIGJhY2tzcGFjZTogXGIgZm9ybWZlZWQ6IFxmIG5ld2xpbmU6IFxuIHJldHVybjogXHIgdGFiOiAnICsKKyAgICAgICcgbm93LWFsbC1vZi10aGVtLXRvZ2V0aGVyOiAiXFxcL1xiXG5cclx0JyArCisgICAgICAnIG5vdy1hLWJ1bmNoLW9mLWp1bms6ICFAIyQlJigpKCYlJCN7fXt9PD48PjwnICsKKyAgICAgICcgY2hhci10by10ZXN0LWpzb24tcGFyc2luZzogXV0gXCJdXSBcXCIgfX19eyBbW1sgJworICAgIHRlc3Rfc3RyaW5nID0gIkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvbsOpcywg2KfZhNi52LHYqNmK2KksINmF2LXYsdmJLCAiICsKKyAgICAgICJBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXrJmXJiYXljYW4sINCR0LDRiNKh0L7RgNGCLCBCb2FyaXNjaCwgxb1lbWFpdMSXxaFrYSwgIiArCisgICAgICAi0JHQtdC70LDRgNGD0YHQutCw0Y8sINCR0LXQu9Cw0YDRg9GB0LrQsNGPICjRgtCw0YDQsNGI0LrQtdCy0ZbRhtCwKSwg0JHRitC70LPQsNGA0YHQutC4LCBCYW1hbmFua2FuLCAiICsKKyAgICAgICLgpqzgpr7gpoLgprLgpr4sIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsw6AsIE3DrG5nLWTElcykbmctbmfhubPMhCwg0J3QvtGF0YfQuNC50L0sICIgKworICAgICAgIkNlYnVhbm8sIOGPo+GOs+GOqSwgxIxlc2t5LCDQodC70L7QstGjzIHQvdGM0YHQutGKIC8g4rCU4rCO4rCR4rCC4rCh4rCQ4rCg4rCU4rCN4rCfLCDQp9OR0LLQsNGI0LvQsCwgQ3ltcmFlZywgIiArCisgICAgICAiRGFuc2ssIFphemFraSwg3oveqN6I3qzegN6o3oTept6Q3rAsIM6VzrvOu863zr3Ouc66zqwsIEVtaWxpw6BuIGUgcnVtYWduw7JsLCBFbmdsaXNoLCAiICsKKyAgICAgICJFc3BlcmFudG8sIEVzcGHDsW9sLCBFZXN0aSwgRXVza2FyYSwg2YHYp9ix2LPbjCwgU3VvbWksIFbDtXJvLCBGw7hyb3lza3QsICIgKworICAgICAgIkZyYW7Dp2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwg6LSb6KqeLCBHw6BpZGhsaWcsIEdhbGVnbywgIiArCisgICAgICAiQXZhw7FlJ+G6vSwg4KqX4KuB4Kqc4Kqw4Kq+4Kqk4KuALCBHYWVsZywg16LXkdeo15nXqiwg4KS54KS/4KSo4KWN4KSm4KWALCBGaWppIEhpbmRpLCBIcnZhdHNraSwgIiArCisgICAgICAiS3JlecOybCBheWlzeWVuLCBNYWd5YXIsINWA1aHVtdWl1oDVpdW2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwgIiArCisgICAgICAiSWxva2FubywgSWRvLCDDjXNsZW5za2EsIEl0YWxpYW5vLCDml6XmnKzoqp4sIExvamJhbiwgQmFzYSBKYXdhLCAiICsKKyAgICAgICLhg6Xhg5Dhg6Dhg5fhg6Phg5rhg5gsIEtvbmdvLCBLYWxhYWxsaXN1dCwg4LKV4LKo4LON4LKo4LKhLCDtlZzqta3slrQsINCa0YrQsNGA0LDRh9Cw0Lkt0JzQsNC70LrRitCw0YAsICIgKworICAgICAgIlJpcG9hcmlzY2gsIEt1cmTDriwg0JrQvtC80LgsIEtlcm5ld2VrLCDQmtGL0YDQs9GL0LfRh9CwLCBMYXRpbmEsIExhZGlubywgIiArCisgICAgICAiTMOrdHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ8OhbGEsIOC6peC6suC6pywgTGlldHV2acWzLCBMYXR2aWXFoXUsIEJhc2EgIiArCisgICAgICAiQmFueXVtYXNhbiwgTWFsYWdhc3ksINCc0LDQutC10LTQvtC90YHQutC4LCDgtK7gtLLgtK/gtL7gtLPgtIIsIOCkruCksOCkvuCkoOClgCwg2YXYp9iy2ZDYsdmI2YbbjCwgQmFoYXNhICIgKworICAgICAgIk1lbGF5dSwgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIOCkqOClh+CkquCkvuCksiDgpK3gpL7gpLfgpL4sIE5lZGVybGFuZHMsIOKAqiIgKworICAgICAgIk5vcnNrIChueW5vcnNrKeKArCwg4oCqTm9yc2sgKGJva23DpWwp4oCsLCBOb3Vvcm1hbmQsIERpbsOpIGJpemFhZCwgIiArCisgICAgICAiT2NjaXRhbiwg0JjRgNC+0L3QsNGDLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBQb2xza2ksINm+2YbYrNin2KjbjCwg2b7amtiq2YgsICIgKworICAgICAgIk5vcmZ1ayAvIFBpdGtlcm4sIFBvcnR1Z3XDqnMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbcOibsSDLCAiICsKKyAgICAgICLQoNGD0YHRgdC60LjQuSwg0KHQsNGF0LAg0YLRi9C70LAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTw6FtZWdpZWxsYSwgU2ltcGxlICIgKworICAgICAgIkVuZ2xpc2gsIFNsb3ZlbsSNaW5hLCBTbG92ZW7FocSNaW5hLCDQodGA0L/RgdC60LggLyBTcnBza2ksIFNlZWx0ZXJzaywgIiArCisgICAgICAiU3ZlbnNrYSwgS2lzd2FoaWxpLCDgrqTgrq7grr/grrTgr40sIOCwpOCxhuCwsuCxgeCwl+CxgSwg0KLQvtK30LjQutOjLCDguYTguJfguKIsIFTDvHJrbWVuw6dlLCBUYWdhbG9nLCAiICsKKyAgICAgICJUw7xya8OnZSwg0KLQsNGC0LDRgNGH0LAvVGF0YXLDp2EsINCj0LrRgNCw0ZfQvdGB0YzQutCwLCDYp9ix2K/ZiCwgVGnhur9uZyBWaeG7h3QsIFZvbGFww7xrLCAiICsKKyAgICAgICJXYWxvbiwgV2luYXJheSwg5ZC06K+tLCBpc2lYaG9zYSwg15nXmda015PXmdepLCBZb3LDuWLDoSwgWmXDqnV3cywg5Lit5paHLCAiICsKKyAgICAgICJCw6JuLWzDom0tZ8O6LCDnsrXoqp4iCisKKyAgICByZXN1bHRfc3RyaW5nID0gQGNsaWVudC50ZXN0U3RyaW5nKHRlc3Rfc3RyaW5nKQorICAgIGFzc2VydF9lcXVhbCh0ZXN0X3N0cmluZywgcmVzdWx0X3N0cmluZy5mb3JjZV9lbmNvZGluZyhFbmNvZGluZzo6VVRGXzgpKQogICBlbmQKIAogICBkZWYgdGVzdF9ib29sCkBAIC0xMTcsNyArMTg0LDcgQEAKIAogICBkZWYgdGVzdF9kb3VibGUKICAgICBwICd0ZXN0X2RvdWJsZScKLSAgICB2YWwgPSAzLjE0CisgICAgdmFsID0gMy4xNDE1OTI2NTM1ODk3OTMyMzg0NgogICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3REb3VibGUodmFsKSwgdmFsKQogICAgIGFzc2VydF9lcXVhbChAY2xpZW50LnRlc3REb3VibGUoLXZhbCksIC12YWwpCiAgICAgYXNzZXJ0X2tpbmRfb2YoRmxvYXQsIEBjbGllbnQudGVzdERvdWJsZSh2YWwpKQpAQCAtMTI1LDExICsxOTIsMTEgQEAKIAogICBkZWYgdGVzdF9iaW5hcnkKICAgICBwICd0ZXN0X2JpbmFyeScKLSAgICB2YWwgPSBbNDIsIDAsIDE0MiwgMjQyXQorICAgIHZhbCA9ICgwLi4uMjU2KS5yZXZlcnNlX2VhY2gudG9fYQogICAgIHJldCA9IEBjbGllbnQudGVzdEJpbmFyeSh2YWwucGFjaygnQyonKSkKICAgICBhc3NlcnRfZXF1YWwodmFsLCByZXQuYnl0ZXMudG9fYSkKICAgZW5kCi0gIAorCiAgIGRlZiB0ZXN0X21hcAogICAgIHAgJ3Rlc3RfbWFwJwogICAgIHZhbCA9IHsxID0+IDEsIDIgPT4gMiwgMyA9PiAzfQpAQCAtMzA1LDkgKzM3Miw5IEBACiAgIGRlZiB0ZXN0X29uZXdheQogICAgIHAgJ3Rlc3Rfb25ld2F5JwogICAgIHRpbWUxID0gVGltZS5ub3cudG9fZgotICAgIEBjbGllbnQudGVzdE9uZXdheSgzKQorICAgIEBjbGllbnQudGVzdE9uZXdheSgxKQogICAgIHRpbWUyID0gVGltZS5ub3cudG9fZgotICAgIGFzc2VydF9lcXVhbCgodGltZTItdGltZTEpKjEwMDAwMDA8NDAwLCB0cnVlKQorICAgIGFzc2VydF9vcGVyYXRvciAodGltZTItdGltZTEpLCA6PCwgMC4xCiAgIGVuZAogCiBlbmQKZGlmZiAtLWdpdCBhL3Rlc3QvcmIvaW50ZWdyYXRpb24vVGVzdFNlcnZlci5yYiBiL3Rlc3QvcmIvaW50ZWdyYXRpb24vVGVzdFNlcnZlci5yYgppbmRleCAwMDIxZTJhLi43Y2FmNmE4IDEwMDc1NQotLS0gYS90ZXN0L3JiL2ludGVncmF0aW9uL1Rlc3RTZXJ2ZXIucmIKKysrIGIvdGVzdC9yYi9pbnRlZ3JhdGlvbi9UZXN0U2VydmVyLnJiCkBAIC0zMiw2ICszMiw4IEBACiAgICA6dGVzdEVudW0sIDp0ZXN0VHlwZWRlZiwgOnRlc3RNdWx0aUV4Y2VwdGlvbl0uZWFjaCBkbyB8bWV0aHwKIAogICAgIGRlZmluZV9tZXRob2QobWV0aCkgZG8gfHRoaW5nfAorICAgICAgcCBtZXRoCisgICAgICBwIHRoaW5nCiAgICAgICB0aGluZwogICAgIGVuZAogCkBAIC0xMDQsMjEgKzEwNiwzMCBAQAogCiBlbmQKIAotcHJvdG9jb2wgPSAiYmluYXJ5IgorZG9tYWluX3NvY2tldCA9IG5pbAogcG9ydCA9IDkwOTAKK3Byb3RvY29sID0gImJpbmFyeSIKK0Bwcm90b2NvbEZhY3RvcnkgPSBuaWwKK3NzbCA9IGZhbHNlCiB0cmFuc3BvcnQgPSAiYnVmZmVyZWQiCi1AdHJhbnNwb3J0RmFjdG9yeSA9IFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5Lm5ldwotQHByb3RvY29sRmFjdG9yeSA9IFRocmlmdDo6QmluYXJ5UHJvdG9jb2xGYWN0b3J5Lm5ldworQHRyYW5zcG9ydEZhY3RvcnkgPSBuaWwKKwogQVJHVi5lYWNoIGRvfGF8CiAgIGlmIGEgPT0gIi0taGVscCIKICAgICBwdXRzICJBbGxvd2VkIG9wdGlvbnM6IgogICAgIHB1dHMgIlx0IC1oIFsgLS1oZWxwIF0gXHQgcHJvZHVjZSBoZWxwIG1lc3NhZ2UiCi0gICAgcHV0cyAiXHQtLXBvcnQgYXJnICg9OTA5MCkgXHQgUG9ydCBudW1iZXIgdG8gbGlzdGVuIgotICAgIHB1dHMgIlx0LS1wcm90b2NvbCBhcmcgKD1iaW5hcnkpIFx0IHByb3RvY29sOiBiaW5hcnksIGFjY2VsIgorICAgIHB1dHMgIlx0LS1kb21haW4tc29ja2V0IGFyZyAoPSkgXHQgVW5peCBkb21haW4gc29ja2V0IHBhdGgiCisgICAgcHV0cyAiXHQtLXBvcnQgYXJnICg9OTA5MCkgXHQgUG9ydCBudW1iZXIgdG8gbGlzdGVuIFx0IG5vdCB2YWxpZCB3aXRoIGRvbWFpbi1zb2NrZXQiCisgICAgcHV0cyAiXHQtLXByb3RvY29sIGFyZyAoPWJpbmFyeSkgXHQgcHJvdG9jb2w6IGFjY2VsLCBiaW5hcnksIGNvbXBhY3QsIGpzb24iCisgICAgcHV0cyAiXHQtLXNzbCBcdCB1c2Ugc3NsIFx0IG5vdCB2YWxpZCB3aXRoIGRvbWFpbi1zb2NrZXQiCiAgICAgcHV0cyAiXHQtLXRyYW5zcG9ydCBhcmcgKD1idWZmZXJlZCkgdHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkLCBodHRwIgogICAgIGV4aXQKKyAgZWxzaWYgYS5zdGFydF93aXRoPygiLS1kb21haW4tc29ja2V0IikKKyAgICBkb21haW5fc29ja2V0ID0gYS5zcGxpdCgiPSIpWzFdCiAgIGVsc2lmIGEuc3RhcnRfd2l0aD8oIi0tcHJvdG9jb2wiKQogICAgIHByb3RvY29sID0gYS5zcGxpdCgiPSIpWzFdCisgIGVsc2lmIGEgPT0gIi0tc3NsIgorICAgIHNzbCA9IHRydWUKICAgZWxzaWYgYS5zdGFydF93aXRoPygiLS10cmFuc3BvcnQiKQogICAgIHRyYW5zcG9ydCA9IGEuc3BsaXQoIj0iKVsxXQogICBlbHNpZiBhLnN0YXJ0X3dpdGg/KCItLXBvcnQiKQpAQCAtMTI2LDkgKzEzNyw3IEBACiAgIGVuZAogZW5kCiAKLWlmIHByb3RvY29sID09ICJiaW5hcnkiCi0gIEBwcm90b2NvbEZhY3RvcnkgPSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sRmFjdG9yeS5uZXcKLWVsc2lmIHByb3RvY29sID09ICIiCitpZiBwcm90b2NvbCA9PSAiYmluYXJ5IiB8fCBwcm90b2NvbC50b19zLnN0cmlwLmVtcHR5PwogICBAcHJvdG9jb2xGYWN0b3J5ID0gVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEZhY3RvcnkubmV3CiBlbHNpZiBwcm90b2NvbCA9PSAiY29tcGFjdCIKICAgQHByb3RvY29sRmFjdG9yeSA9IFRocmlmdDo6Q29tcGFjdFByb3RvY29sRmFjdG9yeS5uZXcKQEAgLTE0MCw5ICsxNDksNyBAQAogICByYWlzZSAnVW5rbm93biBwcm90b2NvbCB0eXBlJwogZW5kCiAKLWlmIHRyYW5zcG9ydCA9PSAiYnVmZmVyZWQiCi0gIEB0cmFuc3BvcnRGYWN0b3J5ID0gVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkubmV3Ci1lbHNpZiB0cmFuc3BvcnQgPT0gIiIKK2lmIHRyYW5zcG9ydCA9PSAiYnVmZmVyZWQiIHx8IHRyYW5zcG9ydC50b19zLnN0cmlwLmVtcHR5PwogICBAdHJhbnNwb3J0RmFjdG9yeSA9IFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5Lm5ldwogZWxzaWYgdHJhbnNwb3J0ID09ICJmcmFtZWQiCiAgIEB0cmFuc3BvcnRGYWN0b3J5ID0gVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnRGYWN0b3J5Lm5ldwpAQCAtMTUwLDggKzE1NywzMiBAQAogICByYWlzZSAnVW5rbm93biB0cmFuc3BvcnQgdHlwZScKIGVuZAogCi1AaGFuZGxlciAgID0gU2ltcGxlSGFuZGxlci5uZXcKK0BoYW5kbGVyID0gU2ltcGxlSGFuZGxlci5uZXcKIEBwcm9jZXNzb3IgPSBUaHJpZnQ6OlRlc3Q6OlRocmlmdFRlc3Q6OlByb2Nlc3Nvci5uZXcoQGhhbmRsZXIpCi1AdHJhbnNwb3J0ID0gVGhyaWZ0OjpTZXJ2ZXJTb2NrZXQubmV3KHBvcnQpCi1Ac2VydmVyICAgID0gVGhyaWZ0OjpUaHJlYWRlZFNlcnZlci5uZXcoQHByb2Nlc3NvciwgQHRyYW5zcG9ydCwgQHRyYW5zcG9ydEZhY3RvcnksIEBwcm90b2NvbEZhY3RvcnkpCitAdHJhbnNwb3J0ID0gbmlsCitpZiBkb21haW5fc29ja2V0LnRvX3Muc3RyaXAuZW1wdHk/CisgIGlmIHNzbAorICAgICMgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGZvciBydWJ5IGNyb3NzdGVzdCBpcyB0ZXN0L3JiL2dlbi1yYgorICAgIGtleXNEaXIgPSBGaWxlLmpvaW4oRmlsZS5kaXJuYW1lKEZpbGUuZGlybmFtZShEaXIucHdkKSksICJrZXlzIikKKyAgICBjdHggPSBPcGVuU1NMOjpTU0w6OlNTTENvbnRleHQubmV3CisgICAgY3R4LmNhX2ZpbGUgPSBGaWxlLmpvaW4oa2V5c0RpciwgIkNBLnBlbSIpCisgICAgY3R4LmNlcnQgPSBPcGVuU1NMOjpYNTA5OjpDZXJ0aWZpY2F0ZS5uZXcoRmlsZS5vcGVuKEZpbGUuam9pbihrZXlzRGlyLCAic2VydmVyLmNydCIpKSkKKyAgICBjdHguY2VydF9zdG9yZSA9IE9wZW5TU0w6Olg1MDk6OlN0b3JlLm5ldworICAgIGN0eC5jZXJ0X3N0b3JlLmFkZF9maWxlKEZpbGUuam9pbihrZXlzRGlyLCAnY2xpZW50LnBlbScpKQorICAgIGN0eC5rZXkgPSBPcGVuU1NMOjpQS2V5OjpSU0EubmV3KEZpbGUub3BlbihGaWxlLmpvaW4oa2V5c0RpciwgInNlcnZlci5rZXkiKSkpCisgICAgY3R4Lm9wdGlvbnMgPSBPcGVuU1NMOjpTU0w6Ok9QX05PX1NTTHYyIHwgT3BlblNTTDo6U1NMOjpPUF9OT19TU0x2MworICAgIGN0eC5zc2xfdmVyc2lvbiA9IDpTU0x2MjMKKyAgICBjdHgudmVyaWZ5X21vZGUgPSBPcGVuU1NMOjpTU0w6OlZFUklGWV9QRUVSCisgICAgQHRyYW5zcG9ydCA9IFRocmlmdDo6U1NMU2VydmVyU29ja2V0Lm5ldyhuaWwsIHBvcnQsIGN0eCkKKyAgZWxzZQorICAgIEB0cmFuc3BvcnQgPSBUaHJpZnQ6OlNlcnZlclNvY2tldC5uZXcocG9ydCkKKyAgZW5kCitlbHNlCisgIEB0cmFuc3BvcnQgPSBUaHJpZnQ6OlVOSVhTZXJ2ZXJTb2NrZXQubmV3KGRvbWFpbl9zb2NrZXQpCitlbmQKKworQHNlcnZlciA9IFRocmlmdDo6VGhyZWFkZWRTZXJ2ZXIubmV3KEBwcm9jZXNzb3IsIEB0cmFuc3BvcnQsIEB0cmFuc3BvcnRGYWN0b3J5LCBAcHJvdG9jb2xGYWN0b3J5KQorCitwdXRzICJTdGFydGluZyBUZXN0U2VydmVyICN7QHNlcnZlci50b19zfSIKIEBzZXJ2ZXIuc2VydmUKK3B1dHMgImRvbmUuIgpkaWZmIC0tZ2l0IGEvdGVzdC9yZXN1bHQuaHRtbCBiL3Rlc3QvcmVzdWx0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmOTE4YmUuLjAwMDAwMDAKLS0tIGEvdGVzdC9yZXN1bHQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLTwhLS0KLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gdW5kZXIgdGhlIExpY2Vuc2UuCi0KLS0tPgotPCFET0NUWVBFIEhUTUw+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgY2hhcnNldD0idXRmLTgiPgotPHRpdGxlPkFwYWNoZSBUaHJpZnQgLSBpbnRlZ3JhdGlvbiB0ZXN0IHN1aXRlPC90aXRsZT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Imh0dHA6Ly9jZG4uZGF0YXRhYmxlcy5uZXQvMS4xMC40L2Nzcy9qcXVlcnkuZGF0YVRhYmxlcy5jc3MiPgotPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04IiBzcmM9Imh0dHA6Ly9jb2RlLmpxdWVyeS5jb20vanF1ZXJ5LTIuMS4zLm1pbi5qcyI+PC9zY3JpcHQ+Ci08c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiIHNyYz0iaHR0cDovL2Nkbi5kYXRhdGFibGVzLm5ldC8xLjEwLjQvanMvanF1ZXJ5LmRhdGFUYWJsZXMuanMiPjwvc2NyaXB0PgotPHNjcmlwdD4KLSQuZ2V0SlNPTigncmVzdWx0cy5qc29uJywgZnVuY3Rpb24ocmVzdWx0cykgewotICAgICQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgewotICAgICAgICB2YXIgdHJhbnNwb3J0ID0gMzsKLSAgICAgICAgdmFyIHNvY2tldCA9IDQ7Ci0gICAgICAgIHZhciBzdWNjZXNzID0gNTsKLSAgICAgICAgdmFyIGV4cGVjdGVkID0gNjsKLSAgICAgICAgdmFyIHJldHVybkNvZGUgPSA3OwotICAgICAgICB2YXIgbG9nRmlsZSA9IDg7Ci0gICAgICAgIHRlc3RUYWJsZSA9ICQoJyN0ZXN0X3Jlc3VsdHMnKS5EYXRhVGFibGUoewotICAgICAgICAgICAgZGF0YTogcmVzdWx0c1sncmVzdWx0cyddLAotICAgICAgICAgICAgY29sdW1uRGVmczogWwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0czogMywKLSAgICAgICAgICAgICAgICAgICAgcmVuZGVyOiBmdW5jdGlvbihkYXRhLCB0eXBlLCByb3cpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByb3dbdHJhbnNwb3J0XSArICctJyArIHJvd1tzb2NrZXRdOwotICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXRzOiA0LAotICAgICAgICAgICAgICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKGRhdGEsIHR5cGUsIHJvdykgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChyb3dbc3VjY2Vzc10gPyAnc3VjY2VzcycgOiAnZmFpbHVyZScpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJygnICsgKHJvd1tyZXR1cm5Db2RlXSA9PSAxMjggPyAndGltZW91dCcgOiByb3dbcmV0dXJuQ29kZV0pICsgJyknCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJyg8YSBocmVmPSInICsgcm93W2xvZ0ZpbGVdLnNlcnZlciArICciPlNlcnZlcjwvYT4sICcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAnPGEgaHJlZj0iJyArIHJvd1tsb2dGaWxlXS5jbGllbnQgKyAnIj5DbGllbnQ8L2E+KSc7Ci0gICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldHM6IDUsCi0gICAgICAgICAgICAgICAgICAgIHJlbmRlcjogZnVuY3Rpb24oZGF0YSwgdHlwZSwgcm93KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyAneWVzJyByYXRoZXIgdGhhbiAnZXhwZWN0ZWQnIHRvIGVhc2Ugc2VhcmNoCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcm93W2V4cGVjdGVkXSA/ICd5ZXMnIDogJ3VuZXhwZWN0ZWQnOwotICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIF0sCi0gICAgICAgIH0pOwotICAgICAgICAkKCcjdGVzdF9yZXN1bHRzX2ZpbHRlciBsYWJlbCBpbnB1dCcpLmZvY3VzKCkudmFsKCd1bmV4cGVjdGVkIGZhaWx1cmUnKTsKLSAgICAgICAgJCgnI3Rlc3RfaW5mbycpLnRleHQoCi0gICAgICAgICAgICAiVGVzdCBEYXRlOiAgICAgIiArIHJlc3VsdHNbJ2RhdGUnXSArICJcbiIgKwotICAgICAgICAgICAgIlJldmlzaW9uOiAgICAgICIgKyByZXN1bHRzWydyZXZpc2lvbiddICsgIlxuIiArCi0gICAgICAgICAgICAiUGxhdGZvcm06ICAgICAgIiArIHJlc3VsdHNbJ3BsYXRmb3JtJ10gKyAiXG4iICsKLSAgICAgICAgICAgICJUZXN0IGR1cmF0aW9uOiAiICsgcmVzdWx0c1snZHVyYXRpb24nXSkgKyAiIHNlY29uZHMiOwotICAgIH0pOwotfSk7Ci08L3NjcmlwdD4KLTwvaGVhZD4KLTxib2R5PgotPGgyPkFwYWNoZSBUaHJpZnQgLSBpbnRlZ3JhdGlvbiB0ZXN0IHN1aXRlOiBSZXN1bHRzPC9oMj4KLTx0YWJsZSBpZD0idGVzdF9yZXN1bHRzIiBjbGFzcz0iZGlzcGxheSI+Ci0gICAgPHRoZWFkPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgICA8dGg+U2VydmVyPC90aD4KLSAgICAgICAgICAgIDx0aD5DbGllbnQ8L3RoPgotICAgICAgICAgICAgPHRoPlByb3RvY29sPC90aD4KLSAgICAgICAgICAgIDx0aD5UcmFuc3BvcnQ8L3RoPgotICAgICAgICAgICAgPHRoPlJlc3VsdCAobG9nKTwvdGg+Ci0gICAgICAgICAgICA8dGg+RXhwZWN0ZWQ8L3RoPgotICAgICAgICA8L3RyPgotICAgIDwvdGhlYWQ+Ci08L3RhYmxlPgotPGgyPlRlc3QgSW5mb3JtYXRpb248L2gyPgotPHByZSBpZD0idGVzdF9pbmZvIj48L3ByZT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rlc3QvcmVzdWx0LmpzIGIvdGVzdC9yZXN1bHQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThiMWE1OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcmVzdWx0LmpzCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIHVuZGVyIHRoZSBMaWNlbnNlLgorCisqLworCiskLmdldEpTT04oJ3Jlc3VsdHMuanNvbicsIGZ1bmN0aW9uKHJlc3VsdHMpIHsKKyAgICAkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKKyAgICAgICAgdmFyIHRyYW5zcG9ydCA9IDM7CisgICAgICAgIHZhciBzb2NrZXQgPSA0OworICAgICAgICB2YXIgc3VjY2VzcyA9IDU7CisgICAgICAgIHZhciBleHBlY3RlZCA9IDY7CisgICAgICAgIHZhciByZXR1cm5Db2RlID0gNzsKKyAgICAgICAgdmFyIGxvZ0ZpbGUgPSA4OworICAgICAgICB0ZXN0VGFibGUgPSAkKCcjdGVzdF9yZXN1bHRzJykuRGF0YVRhYmxlKHsKKyAgICAgICAgICAgIGRhdGE6IHJlc3VsdHNbJ3Jlc3VsdHMnXSwKKyAgICAgICAgICAgIGNvbHVtbkRlZnM6IFsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRhcmdldHM6IDMsCisgICAgICAgICAgICAgICAgICAgIHJlbmRlcjogZnVuY3Rpb24oZGF0YSwgdHlwZSwgcm93KSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcm93W3RyYW5zcG9ydF0gKyAnLScgKyByb3dbc29ja2V0XTsKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0czogNCwKKyAgICAgICAgICAgICAgICAgICAgcmVuZGVyOiBmdW5jdGlvbihkYXRhLCB0eXBlLCByb3cpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocm93W3N1Y2Nlc3NdID8gJ3N1Y2Nlc3MnIDogJ2ZhaWx1cmUnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICcoJyArIChyb3dbcmV0dXJuQ29kZV0gPT0gMTI4ID8gJ3RpbWVvdXQnIDogcm93W3JldHVybkNvZGVdKSArICcpJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICcoPGEgaHJlZj0iJyArIHJvd1tsb2dGaWxlXS5zZXJ2ZXIgKyAnIj5TZXJ2ZXI8L2E+LCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJzxhIGhyZWY9IicgKyByb3dbbG9nRmlsZV0uY2xpZW50ICsgJyI+Q2xpZW50PC9hPiknOworICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0YXJnZXRzOiA1LAorICAgICAgICAgICAgICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKGRhdGEsIHR5cGUsIHJvdykgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gJ3llcycgcmF0aGVyIHRoYW4gJ2V4cGVjdGVkJyB0byBlYXNlIHNlYXJjaAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJvd1tleHBlY3RlZF0gPyAneWVzJyA6ICd1bmV4cGVjdGVkJzsKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBdLAorICAgICAgICB9KTsKKyAgICAgICAgJCgnI3Rlc3RfcmVzdWx0c19maWx0ZXIgbGFiZWwgaW5wdXQnKS5mb2N1cygpLnZhbCgndW5leHBlY3RlZCBmYWlsdXJlJyk7CisgICAgICAgICQoJyN0ZXN0X2luZm8nKS50ZXh0KAorICAgICAgICAgICAgIlRlc3QgRGF0ZTogICAgICIgKyByZXN1bHRzWydkYXRlJ10gKyAiXG4iICsKKyAgICAgICAgICAgICJSZXZpc2lvbjogICAgICAiICsgcmVzdWx0c1sncmV2aXNpb24nXSArICJcbiIgKworICAgICAgICAgICAgIlBsYXRmb3JtOiAgICAgICIgKyByZXN1bHRzWydwbGF0Zm9ybSddICsgIlxuIiArCisgICAgICAgICAgICAiVGVzdCBkdXJhdGlvbjogIiArIHJlc3VsdHNbJ2R1cmF0aW9uJ10pICsgIiBzZWNvbmRzIjsKKyAgICB9KTsKK30pOworCmRpZmYgLS1naXQgYS90ZXN0L3JzL0NhcmdvLnRvbWwgYi90ZXN0L3JzL0NhcmdvLnRvbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIzNWUzYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcnMvQ2FyZ28udG9tbApAQCAtMCwwICsxLDE3IEBACitbcGFja2FnZV0KK25hbWUgPSAidGhyaWZ0LXRlc3QiCit2ZXJzaW9uID0gIjAuMS4wIgorbGljZW5zZSA9ICJBcGFjaGUtMi4wIgorYXV0aG9ycyA9IFsiQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+Il0KK3B1Ymxpc2ggPSBmYWxzZQorCitbZGVwZW5kZW5jaWVzXQorY2xhcCA9ICI8Mi4yOC4wIgorZW52X2xvZ2dlciA9ICIwLjQuMCIKK2xvZyA9ICIwLjMuNyIKK29yZGVyZWQtZmxvYXQgPSAiMC4zLjAiCit0cnlfZnJvbSA9ICIwLjIuMCIKKworW2RlcGVuZGVuY2llcy50aHJpZnRdCitwYXRoID0gIi4uLy4uL2xpYi9ycyIKKwpkaWZmIC0tZ2l0IGEvdGVzdC9ycy9NYWtlZmlsZS5hbSBiL3Rlc3QvcnMvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ5MDViNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcnMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw0MCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3N0dWJzOiAuLi9UaHJpZnRUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAtSSAuL3RocmlmdHMgLW91dCBzcmMgLS1nZW4gcnMgLi4vVGhyaWZ0VGVzdC50aHJpZnQKKworcHJlY3Jvc3M6IHN0dWJzCisJJChDQVJHTykgYnVpbGQKKwlbIC1kIGJpbiBdIHx8IG1rZGlyIGJpbgorCWNwIHRhcmdldC9kZWJ1Zy90ZXN0X3NlcnZlciBiaW4vdGVzdF9zZXJ2ZXIKKwljcCB0YXJnZXQvZGVidWcvdGVzdF9jbGllbnQgYmluL3Rlc3RfY2xpZW50CisKK2NsZWFuLWxvY2FsOgorCSQoQ0FSR08pIGNsZWFuCisJLSQoUk0pIENhcmdvLmxvY2sKKwktJChSTSkgc3JjL3RocmlmdF90ZXN0LnJzCisJLSQoUk0pIC1yIGJpbgorCitFWFRSQV9ESVNUID0gXAorCUNhcmdvLnRvbWwgXAorICAgICAgICBzcmMvbGliLnJzIFwKKwlzcmMvYmluL3Rlc3Rfc2VydmVyLnJzIFwKKwlzcmMvYmluL3Rlc3RfY2xpZW50LnJzCisKZGlmZiAtLWdpdCBhL3Rlc3QvcnMvc3JjL2Jpbi90ZXN0X2NsaWVudC5ycyBiL3Rlc3QvcnMvc3JjL2Jpbi90ZXN0X2NsaWVudC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWI1Yjg4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9ycy9zcmMvYmluL3Rlc3RfY2xpZW50LnJzCkBAIC0wLDAgKzEsNjA1IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNbbWFjcm9fdXNlXQorZXh0ZXJuIGNyYXRlIGxvZzsKK2V4dGVybiBjcmF0ZSBlbnZfbG9nZ2VyOworCisjW21hY3JvX3VzZV0KK2V4dGVybiBjcmF0ZSBjbGFwOworZXh0ZXJuIGNyYXRlIG9yZGVyZWRfZmxvYXQ7CitleHRlcm4gY3JhdGUgdGhyaWZ0OworZXh0ZXJuIGNyYXRlIHRocmlmdF90ZXN0OyAvLyBodWguIEkgaGF2ZSB0byBkbyB0aGlzIHRvIHVzZSBteSBsaWIKKwordXNlIG9yZGVyZWRfZmxvYXQ6Ok9yZGVyZWRGbG9hdDsKK3VzZSBzdGQ6OmNvbGxlY3Rpb25zOjp7QlRyZWVNYXAsIEJUcmVlU2V0fTsKK3VzZSBzdGQ6OmZtdDo6RGVidWc7CisKK3VzZSB0aHJpZnQ6OnByb3RvY29sOjp7VEJpbmFyeUlucHV0UHJvdG9jb2wsIFRCaW5hcnlPdXRwdXRQcm90b2NvbCwgVENvbXBhY3RJbnB1dFByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICBUQ29tcGFjdE91dHB1dFByb3RvY29sLCBUSW5wdXRQcm90b2NvbCwgVE11bHRpcGxleGVkT3V0cHV0UHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgIFRPdXRwdXRQcm90b2NvbH07Cit1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OntSZWFkSGFsZiwgVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydCwgVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICBURnJhbWVkUmVhZFRyYW5zcG9ydCwgVEZyYW1lZFdyaXRlVHJhbnNwb3J0LCBUSW9DaGFubmVsLCBUUmVhZFRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRUY3BDaGFubmVsLCBUV3JpdGVUcmFuc3BvcnQsIFdyaXRlSGFsZn07Cit1c2UgdGhyaWZ0X3Rlc3Q6Oio7CisKK2ZuIG1haW4oKSB7CisgICAgZW52X2xvZ2dlcjo6aW5pdCgpLmV4cGVjdCgibG9nZ2VyIHNldHVwIGZhaWxlZCIpOworCisgICAgZGVidWchKCJpbml0aWFsaXplZCBsb2dnZXIgLSBydW5uaW5nIGNyb3NzLXRlc3QgY2xpZW50Iik7CisKKyAgICBtYXRjaCBydW4oKSB7CisgICAgICAgIE9rKCgpKSA9PiBpbmZvISgiY3Jvc3MtdGVzdCBjbGllbnQgc3VjY2VlZGVkIiksCisgICAgICAgIEVycihlKSA9PiB7CisgICAgICAgICAgICBpbmZvISgiY3Jvc3MtdGVzdCBjbGllbnQgZmFpbGVkIHdpdGggZXJyb3Igezo/fSIsIGUpOworICAgICAgICAgICAgc3RkOjpwcm9jZXNzOjpleGl0KDEpOworICAgICAgICB9CisgICAgfQorfQorCitmbiBydW4oKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geworICAgIC8vIHVuc3VwcG9ydGVkIG9wdGlvbnM6CisgICAgLy8gLS1kb21haW4tc29ja2V0CisgICAgLy8gLS1uYW1lZC1waXBlCisgICAgLy8gLS1hbm9uLXBpcGVzCisgICAgLy8gLS1zc2wKKyAgICAvLyAtLXRocmVhZHMKKyAgICBsZXQgbWF0Y2hlcyA9IGNsYXBfYXBwIShydXN0X3Rlc3RfY2xpZW50ID0+CisgICAgICAgICh2ZXJzaW9uOiAiMS4wIikKKyAgICAgICAgKGF1dGhvcjogIkFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPiIpCisgICAgICAgIChhYm91dDogIlJ1c3QgVGhyaWZ0IHRlc3QgY2xpZW50IikKKyAgICAgICAgKEBhcmcgaG9zdDogLS1ob3N0ICt0YWtlc192YWx1ZSAiSG9zdCBvbiB3aGljaCB0aGUgVGhyaWZ0IHRlc3Qgc2VydmVyIGlzIGxvY2F0ZWQiKQorICAgICAgICAoQGFyZyBwb3J0OiAtLXBvcnQgK3Rha2VzX3ZhbHVlICJQb3J0IG9uIHdoaWNoIHRoZSBUaHJpZnQgdGVzdCBzZXJ2ZXIgaXMgbGlzdGVuaW5nIikKKyAgICAgICAgKEBhcmcgdHJhbnNwb3J0OiAtLXRyYW5zcG9ydCArdGFrZXNfdmFsdWUgIlRocmlmdCB0cmFuc3BvcnQgaW1wbGVtZW50YXRpb24gdG8gdXNlIChcImJ1ZmZlcmVkXCIsIFwiZnJhbWVkXCIpIikKKyAgICAgICAgKEBhcmcgcHJvdG9jb2w6IC0tcHJvdG9jb2wgK3Rha2VzX3ZhbHVlICJUaHJpZnQgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gdG8gdXNlIChcImJpbmFyeVwiLCBcImNvbXBhY3RcIikiKQorICAgICAgICAoQGFyZyB0ZXN0bG9vcHM6IC1uIC0tdGVzdGxvb3BzICt0YWtlc192YWx1ZSAiTnVtYmVyIG9mIHRpbWVzIHRvIHJ1biB0ZXN0cyIpCisgICAgKQorICAgICAgICAuZ2V0X21hdGNoZXMoKTsKKworICAgIGxldCBob3N0ID0gbWF0Y2hlcy52YWx1ZV9vZigiaG9zdCIpLnVud3JhcF9vcigiMTI3LjAuMC4xIik7CisgICAgbGV0IHBvcnQgPSB2YWx1ZV90IShtYXRjaGVzLCAicG9ydCIsIHUxNikudW53cmFwX29yKDkwOTApOworICAgIGxldCB0ZXN0bG9vcHMgPSB2YWx1ZV90IShtYXRjaGVzLCAidGVzdGxvb3BzIiwgdTgpLnVud3JhcF9vcigxKTsKKyAgICBsZXQgdHJhbnNwb3J0ID0gbWF0Y2hlcy52YWx1ZV9vZigidHJhbnNwb3J0IikudW53cmFwX29yKCJidWZmZXJlZCIpOworICAgIGxldCBwcm90b2NvbCA9IG1hdGNoZXMudmFsdWVfb2YoInByb3RvY29sIikudW53cmFwX29yKCJiaW5hcnkiKTsKKworCisgICAgbGV0IG11dCB0aHJpZnRfdGVzdF9jbGllbnQgPSB7CisgICAgICAgIGxldCAoaV9wcm90LCBvX3Byb3QpID0gYnVpbGRfcHJvdG9jb2xzKGhvc3QsIHBvcnQsIHRyYW5zcG9ydCwgcHJvdG9jb2wsICJUaHJpZnRUZXN0Iik/OworICAgICAgICBUaHJpZnRUZXN0U3luY0NsaWVudDo6bmV3KGlfcHJvdCwgb19wcm90KQorICAgIH07CisKKyAgICBsZXQgbXV0IHNlY29uZF9zZXJ2aWNlX2NsaWVudCA9IGlmIHByb3RvY29sLnN0YXJ0c193aXRoKCJtdWx0aSIpIHsKKyAgICAgICAgbGV0IChpX3Byb3QsIG9fcHJvdCkgPSBidWlsZF9wcm90b2NvbHMoaG9zdCwgcG9ydCwgdHJhbnNwb3J0LCBwcm90b2NvbCwgIlNlY29uZFNlcnZpY2UiKT87CisgICAgICAgIFNvbWUoU2Vjb25kU2VydmljZVN5bmNDbGllbnQ6Om5ldyhpX3Byb3QsIG9fcHJvdCkpCisgICAgfSBlbHNlIHsKKyAgICAgICAgTm9uZQorICAgIH07CisKKyAgICBpbmZvISgKKyAgICAgICAgImNvbm5lY3RpbmcgdG8ge306e30gd2l0aCB7fSt7fSBzdGFjayIsCisgICAgICAgIGhvc3QsCisgICAgICAgIHBvcnQsCisgICAgICAgIHByb3RvY29sLAorICAgICAgICB0cmFuc3BvcnQKKyAgICApOworCisgICAgZm9yIF8gaW4gMC4udGVzdGxvb3BzIHsKKyAgICAgICAgbWFrZV90aHJpZnRfY2FsbHMoJm11dCB0aHJpZnRfdGVzdF9jbGllbnQsICZtdXQgc2Vjb25kX3NlcnZpY2VfY2xpZW50KT8KKyAgICB9CisKKyAgICBPaygoKSkKK30KKworZm4gYnVpbGRfcHJvdG9jb2xzKAorICAgIGhvc3Q6ICZzdHIsCisgICAgcG9ydDogdTE2LAorICAgIHRyYW5zcG9ydDogJnN0ciwKKyAgICBwcm90b2NvbDogJnN0ciwKKyAgICBzZXJ2aWNlX25hbWU6ICZzdHIsCispIC0+IHRocmlmdDo6UmVzdWx0PChCb3g8VElucHV0UHJvdG9jb2w+LCBCb3g8VE91dHB1dFByb3RvY29sPik+IHsKKyAgICBsZXQgKGlfY2hhbiwgb19jaGFuKSA9IHRjcF9jaGFubmVsKGhvc3QsIHBvcnQpPzsKKworICAgIGxldCAoaV90cmFuLCBvX3RyYW4pOiAoQm94PFRSZWFkVHJhbnNwb3J0PiwgQm94PFRXcml0ZVRyYW5zcG9ydD4pID0gbWF0Y2ggdHJhbnNwb3J0IHsKKyAgICAgICAgImJ1ZmZlcmVkIiA9PiB7CisgICAgICAgICAgICAoQm94OjpuZXcoVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydDo6bmV3KGlfY2hhbikpLAorICAgICAgICAgICAgIEJveDo6bmV3KFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0OjpuZXcob19jaGFuKSkpCisgICAgICAgIH0KKyAgICAgICAgImZyYW1lZCIgPT4geworICAgICAgICAgICAgKEJveDo6bmV3KFRGcmFtZWRSZWFkVHJhbnNwb3J0OjpuZXcoaV9jaGFuKSksCisgICAgICAgICAgICAgQm94OjpuZXcoVEZyYW1lZFdyaXRlVHJhbnNwb3J0OjpuZXcob19jaGFuKSkpCisgICAgICAgIH0KKyAgICAgICAgdW5tYXRjaGVkID0+IHJldHVybiBFcnIoZm9ybWF0ISgidW5zdXBwb3J0ZWQgdHJhbnNwb3J0IHt9IiwgdW5tYXRjaGVkKS5pbnRvKCkpLAorICAgIH07CisKKyAgICBsZXQgKGlfcHJvdCwgb19wcm90KTogKEJveDxUSW5wdXRQcm90b2NvbD4sIEJveDxUT3V0cHV0UHJvdG9jb2w+KSA9IG1hdGNoIHByb3RvY29sIHsKKyAgICAgICAgImJpbmFyeSIgPT4geworICAgICAgICAgICAgKEJveDo6bmV3KFRCaW5hcnlJbnB1dFByb3RvY29sOjpuZXcoaV90cmFuLCB0cnVlKSksCisgICAgICAgICAgICAgQm94OjpuZXcoVEJpbmFyeU91dHB1dFByb3RvY29sOjpuZXcob190cmFuLCB0cnVlKSkpCisgICAgICAgIH0KKyAgICAgICAgIm11bHRpIiA9PiB7CisgICAgICAgICAgICAoQm94OjpuZXcoVEJpbmFyeUlucHV0UHJvdG9jb2w6Om5ldyhpX3RyYW4sIHRydWUpKSwKKyAgICAgICAgICAgICBCb3g6Om5ldygKKyAgICAgICAgICAgICAgICBUTXVsdGlwbGV4ZWRPdXRwdXRQcm90b2NvbDo6bmV3KAorICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgIFRCaW5hcnlPdXRwdXRQcm90b2NvbDo6bmV3KG9fdHJhbiwgdHJ1ZSksCisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICkpCisgICAgICAgIH0KKyAgICAgICAgImNvbXBhY3QiID0+IHsKKyAgICAgICAgICAgIChCb3g6Om5ldyhUQ29tcGFjdElucHV0UHJvdG9jb2w6Om5ldyhpX3RyYW4pKSwKKyAgICAgICAgICAgICBCb3g6Om5ldyhUQ29tcGFjdE91dHB1dFByb3RvY29sOjpuZXcob190cmFuKSkpCisgICAgICAgIH0KKyAgICAgICAgIm11bHRpYyIgPT4geworICAgICAgICAgICAgKEJveDo6bmV3KFRDb21wYWN0SW5wdXRQcm90b2NvbDo6bmV3KGlfdHJhbikpLAorICAgICAgICAgICAgIEJveDo6bmV3KFRNdWx0aXBsZXhlZE91dHB1dFByb3RvY29sOjpuZXcoc2VydmljZV9uYW1lLCBUQ29tcGFjdE91dHB1dFByb3RvY29sOjpuZXcob190cmFuKSksKSkKKyAgICAgICAgfQorICAgICAgICB1bm1hdGNoZWQgPT4gcmV0dXJuIEVycihmb3JtYXQhKCJ1bnN1cHBvcnRlZCBwcm90b2NvbCB7fSIsIHVubWF0Y2hlZCkuaW50bygpKSwKKyAgICB9OworCisgICAgT2soKGlfcHJvdCwgb19wcm90KSkKK30KKworLy8gRklYTUU6IGV4cG9zZSAib3BlbiIgdGhyb3VnaCB0aGUgY2xpZW50IGludGVyZmFjZSBzbyBJIGRvbid0IGhhdmUgdG8gZWFybHkKKy8vIG9wZW4KK2ZuIHRjcF9jaGFubmVsKAorICAgIGhvc3Q6ICZzdHIsCisgICAgcG9ydDogdTE2LAorKSAtPiB0aHJpZnQ6OlJlc3VsdDwoUmVhZEhhbGY8VFRjcENoYW5uZWw+LCBXcml0ZUhhbGY8VFRjcENoYW5uZWw+KT4geworICAgIGxldCBtdXQgYyA9IFRUY3BDaGFubmVsOjpuZXcoKTsKKyAgICBjLm9wZW4oJmZvcm1hdCEoInt9Ont9IiwgaG9zdCwgcG9ydCkpPzsKKyAgICBjLnNwbGl0KCkKK30KKwordHlwZSBCdWlsZFRocmlmdFRlc3RDbGllbnQgPSBUaHJpZnRUZXN0U3luY0NsaWVudDxCb3g8VElucHV0UHJvdG9jb2w+LCBCb3g8VE91dHB1dFByb3RvY29sPj47Cit0eXBlIEJ1aWx0U2Vjb25kU2VydmljZUNsaWVudCA9IFNlY29uZFNlcnZpY2VTeW5jQ2xpZW50PEJveDxUSW5wdXRQcm90b2NvbD4sIEJveDxUT3V0cHV0UHJvdG9jb2w+PjsKKworI1tjZmdfYXR0cihmZWF0dXJlID0gImNhcmdvLWNsaXBweSIsIGFsbG93KGN5Y2xvbWF0aWNfY29tcGxleGl0eSkpXQorZm4gbWFrZV90aHJpZnRfY2FsbHMoCisgICAgdGhyaWZ0X3Rlc3RfY2xpZW50OiAmbXV0IEJ1aWxkVGhyaWZ0VGVzdENsaWVudCwKKyAgICBzZWNvbmRfc2VydmljZV9jbGllbnQ6ICZtdXQgT3B0aW9uPEJ1aWx0U2Vjb25kU2VydmljZUNsaWVudD4sCispIC0+IFJlc3VsdDwoKSwgdGhyaWZ0OjpFcnJvcj4geworICAgIGluZm8hKCJ0ZXN0Vm9pZCIpOworICAgIHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X3ZvaWQoKT87CisKKyAgICBpbmZvISgidGVzdFN0cmluZyIpOworICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQoCisgICAgICAgIHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X3N0cmluZygidGhpbmciLnRvX293bmVkKCkpLAorICAgICAgICAidGhpbmciLnRvX293bmVkKCksCisgICAgKT87CisKKyAgICBpbmZvISgidGVzdEJvb2wiKTsKKyAgICB2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X2Jvb2wodHJ1ZSksIHRydWUpPzsKKworICAgIGluZm8hKCJ0ZXN0Qm9vbCIpOworICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQodGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3RfYm9vbChmYWxzZSksIGZhbHNlKT87CisKKyAgICBpbmZvISgidGVzdEJ5dGUiKTsKKyAgICB2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X2J5dGUoNDIpLCA0Mik/OworCisgICAgaW5mbyEoInRlc3RpMzIiKTsKKyAgICB2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X2kzMigxMTU5MzQ4Mzc0KSwgMTE1OTM0ODM3NCk/OworCisgICAgaW5mbyEoInRlc3RpNjQiKTsKKyAgICAvLyB0cnkhKHZlcmlmeV9leHBlY3RlZF9yZXN1bHQodGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3RfaTY0KC04NjUxODI5ODc5NDM4Mjk0NTY1KSwKKyAgICAvLyAtODY1MTgyOTg3OTQzODI5NDU2NSkpOworICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQoCisgICAgICAgIHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X2k2NChpNjQ6Om1pbl92YWx1ZSgpKSwKKyAgICAgICAgaTY0OjptaW5fdmFsdWUoKSwKKyAgICApPzsKKworICAgIGluZm8hKCJ0ZXN0RG91YmxlIik7CisgICAgdmVyaWZ5X2V4cGVjdGVkX3Jlc3VsdCgKKyAgICAgICAgdGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3RfZG91YmxlKE9yZGVyZWRGbG9hdDo6ZnJvbSg0Mi40MikpLAorICAgICAgICBPcmRlcmVkRmxvYXQ6OmZyb20oNDIuNDIpLAorICAgICk/OworCisgICAgaW5mbyEoInRlc3RUeXBlZGVmIik7CisgICAgeworICAgICAgICBsZXQgdV9zbmQ6IFVzZXJJZCA9IDIzNDg7CisgICAgICAgIGxldCB1X2NtcDogVXNlcklkID0gMjM0ODsKKyAgICAgICAgdmVyaWZ5X2V4cGVjdGVkX3Jlc3VsdCh0aHJpZnRfdGVzdF9jbGllbnQudGVzdF90eXBlZGVmKHVfc25kKSwgdV9jbXApPzsKKyAgICB9CisKKyAgICBpbmZvISgidGVzdEVudW0iKTsKKyAgICB7CisgICAgICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQodGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3RfZW51bShOdW1iZXJ6OjpUd28pLCBOdW1iZXJ6OjpUd28pPzsKKyAgICB9CisKKyAgICBpbmZvISgidGVzdEJpbmFyeSIpOworICAgIHsKKyAgICAgICAgbGV0IGJfc25kID0gdmVjIVsweDc3LCAweDMwLCAweDMwLCAweDc0LCAweDIxLCAweDIwLCAweDUyLCAweDc1LCAweDczLCAweDc0XTsKKyAgICAgICAgbGV0IGJfY21wID0gdmVjIVsweDc3LCAweDMwLCAweDMwLCAweDc0LCAweDIxLCAweDIwLCAweDUyLCAweDc1LCAweDczLCAweDc0XTsKKyAgICAgICAgdmVyaWZ5X2V4cGVjdGVkX3Jlc3VsdCh0aHJpZnRfdGVzdF9jbGllbnQudGVzdF9iaW5hcnkoYl9zbmQpLCBiX2NtcCk/OworICAgIH0KKworICAgIGluZm8hKCJ0ZXN0U3RydWN0Iik7CisgICAgeworICAgICAgICBsZXQgeF9zbmQgPSBYdHJ1Y3QgeworICAgICAgICAgICAgc3RyaW5nX3RoaW5nOiBTb21lKCJmb28iLnRvX293bmVkKCkpLAorICAgICAgICAgICAgYnl0ZV90aGluZzogU29tZSgxMiksCisgICAgICAgICAgICBpMzJfdGhpbmc6IFNvbWUoMjE5MTI5KSwKKyAgICAgICAgICAgIGk2NF90aGluZzogU29tZSgxMjkzODQ5MjgxOCksCisgICAgICAgIH07CisgICAgICAgIGxldCB4X2NtcCA9IFh0cnVjdCB7CisgICAgICAgICAgICBzdHJpbmdfdGhpbmc6IFNvbWUoImZvbyIudG9fb3duZWQoKSksCisgICAgICAgICAgICBieXRlX3RoaW5nOiBTb21lKDEyKSwKKyAgICAgICAgICAgIGkzMl90aGluZzogU29tZSgyMTkxMjkpLAorICAgICAgICAgICAgaTY0X3RoaW5nOiBTb21lKDEyOTM4NDkyODE4KSwKKyAgICAgICAgfTsKKyAgICAgICAgdmVyaWZ5X2V4cGVjdGVkX3Jlc3VsdCh0aHJpZnRfdGVzdF9jbGllbnQudGVzdF9zdHJ1Y3QoeF9zbmQpLCB4X2NtcCk/OworICAgIH0KKworICAgIC8vIFh0cnVjdCBhZ2Fpbiwgd2l0aCBvcHRpb25hbCB2YWx1ZXMKKyAgICAvLyBGSVhNRTogYXBwYXJlbnRseSB0aGUgZXJsYW5nIHRocmlmdCBzZXJ2ZXIgZG9lcyBub3QgbGlrZSBvcHQtaW4tcmVxLW91dAorICAgIC8vIHBhcmFtZXRlcnMgdGhhdCBhcmUgdW5kZWZpbmVkLiBKb3kuCisgICAgLy8geworICAgIC8vIGxldCB4X3NuZCA9IFh0cnVjdCB7IHN0cmluZ190aGluZzogU29tZSgiZm9vIi50b19vd25lZCgpKSwgYnl0ZV90aGluZzogTm9uZSwKKyAgICAvLyBpMzJfdGhpbmc6IE5vbmUsIGk2NF90aGluZzogU29tZSgxMjkzODQ5MjgxOCkgfTsKKyAgICAvLyBsZXQgeF9jbXAgPSBYdHJ1Y3QgeyBzdHJpbmdfdGhpbmc6IFNvbWUoImZvbyIudG9fb3duZWQoKSksIGJ5dGVfdGhpbmc6CisgICAgLy8gU29tZSgwKSwgaTMyX3RoaW5nOiBTb21lKDApLCBpNjRfdGhpbmc6IFNvbWUoMTI5Mzg0OTI4MTgpIH07IC8vIHRoZSBDKysKKyAgICAvLyBzZXJ2ZXIgaXMgcmVzcG9uZGluZyBjb3JyZWN0bHkKKyAgICAvLyB0cnkhKHZlcmlmeV9leHBlY3RlZF9yZXN1bHQodGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3Rfc3RydWN0KHhfc25kKSwgeF9jbXApKTsKKyAgICAvLyB9CisgICAgLy8KKworICAgIGluZm8hKCJ0ZXN0TmVzdCIpOyAvLyAoRklYTUU6IHRyeSBYdHJ1Y3QyIHdpdGggb3B0aW9uYWwgdmFsdWVzKQorICAgIHsKKyAgICAgICAgbGV0IHhfc25kID0gWHRydWN0MiB7CisgICAgICAgICAgICBieXRlX3RoaW5nOiBTb21lKDMyKSwKKyAgICAgICAgICAgIHN0cnVjdF90aGluZzogU29tZSgKKyAgICAgICAgICAgICAgICBYdHJ1Y3QgeworICAgICAgICAgICAgICAgICAgICBzdHJpbmdfdGhpbmc6IFNvbWUoImZvbyIudG9fb3duZWQoKSksCisgICAgICAgICAgICAgICAgICAgIGJ5dGVfdGhpbmc6IFNvbWUoMSksCisgICAgICAgICAgICAgICAgICAgIGkzMl90aGluZzogU29tZSgzMjQzODIwOTgpLAorICAgICAgICAgICAgICAgICAgICBpNjRfdGhpbmc6IFNvbWUoMTI5Mzg0OTI4MTgpLAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICApLAorICAgICAgICAgICAgaTMyX3RoaW5nOiBTb21lKDI5MzQ4MTA5OCksCisgICAgICAgIH07CisgICAgICAgIGxldCB4X2NtcCA9IFh0cnVjdDIgeworICAgICAgICAgICAgYnl0ZV90aGluZzogU29tZSgzMiksCisgICAgICAgICAgICBzdHJ1Y3RfdGhpbmc6IFNvbWUoCisgICAgICAgICAgICAgICAgWHRydWN0IHsKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nX3RoaW5nOiBTb21lKCJmb28iLnRvX293bmVkKCkpLAorICAgICAgICAgICAgICAgICAgICBieXRlX3RoaW5nOiBTb21lKDEpLAorICAgICAgICAgICAgICAgICAgICBpMzJfdGhpbmc6IFNvbWUoMzI0MzgyMDk4KSwKKyAgICAgICAgICAgICAgICAgICAgaTY0X3RoaW5nOiBTb21lKDEyOTM4NDkyODE4KSwKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgKSwKKyAgICAgICAgICAgIGkzMl90aGluZzogU29tZSgyOTM0ODEwOTgpLAorICAgICAgICB9OworICAgICAgICB2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X25lc3QoeF9zbmQpLCB4X2NtcCk/OworICAgIH0KKworICAgIC8vIGRvIHRoZSBtdWx0aXBsZXhlZCBjYWxscyB3aGlsZSBtYWtpbmcgdGhlIG1haW4gVGhyaWZ0VGVzdCBjYWxscworICAgIGlmIGxldCBTb21lKHJlZiBtdXQgY2xpZW50KSA9IHNlY29uZF9zZXJ2aWNlX2NsaWVudC5hc19tdXQoKSB7CisgICAgICAgIGluZm8hKCJTZWNvbmRTZXJ2aWNlIHNlY29uZHRlc3RTdHJpbmciKTsKKyAgICAgICAgeworICAgICAgICAgICAgdmVyaWZ5X2V4cGVjdGVkX3Jlc3VsdCgKKyAgICAgICAgICAgICAgICBjbGllbnQuc2Vjb25kdGVzdF9zdHJpbmcoInRlc3Rfc3RyaW5nIi50b19vd25lZCgpKSwKKyAgICAgICAgICAgICAgICAidGVzdFN0cmluZyhcInRlc3Rfc3RyaW5nXCIpIi50b19vd25lZCgpLAorICAgICAgICAgICAgKT87CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbmZvISgidGVzdExpc3QiKTsKKyAgICB7CisgICAgICAgIGxldCBtdXQgdl9zbmQ6IFZlYzxpMzI+ID0gVmVjOjpuZXcoKTsKKyAgICAgICAgdl9zbmQucHVzaCgyOTM4NCk7CisgICAgICAgIHZfc25kLnB1c2goMjM4KTsKKyAgICAgICAgdl9zbmQucHVzaCgzMjQ5OCk7CisKKyAgICAgICAgbGV0IG11dCB2X2NtcDogVmVjPGkzMj4gPSBWZWM6Om5ldygpOworICAgICAgICB2X2NtcC5wdXNoKDI5Mzg0KTsKKyAgICAgICAgdl9jbXAucHVzaCgyMzgpOworICAgICAgICB2X2NtcC5wdXNoKDMyNDk4KTsKKworICAgICAgICB2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X2xpc3Qodl9zbmQpLCB2X2NtcCk/OworICAgIH0KKworICAgIGluZm8hKCJ0ZXN0U2V0Iik7CisgICAgeworICAgICAgICBsZXQgbXV0IHNfc25kOiBCVHJlZVNldDxpMzI+ID0gQlRyZWVTZXQ6Om5ldygpOworICAgICAgICBzX3NuZC5pbnNlcnQoMjkzNDgxKTsKKyAgICAgICAgc19zbmQuaW5zZXJ0KDIzKTsKKyAgICAgICAgc19zbmQuaW5zZXJ0KDMyMzQpOworCisgICAgICAgIGxldCBtdXQgc19jbXA6IEJUcmVlU2V0PGkzMj4gPSBCVHJlZVNldDo6bmV3KCk7CisgICAgICAgIHNfY21wLmluc2VydCgyOTM0ODEpOworICAgICAgICBzX2NtcC5pbnNlcnQoMjMpOworICAgICAgICBzX2NtcC5pbnNlcnQoMzIzNCk7CisKKyAgICAgICAgdmVyaWZ5X2V4cGVjdGVkX3Jlc3VsdCh0aHJpZnRfdGVzdF9jbGllbnQudGVzdF9zZXQoc19zbmQpLCBzX2NtcCk/OworICAgIH0KKworICAgIGluZm8hKCJ0ZXN0TWFwIik7CisgICAgeworICAgICAgICBsZXQgbXV0IG1fc25kOiBCVHJlZU1hcDxpMzIsIGkzMj4gPSBCVHJlZU1hcDo6bmV3KCk7CisgICAgICAgIG1fc25kLmluc2VydCgyLCA0KTsKKyAgICAgICAgbV9zbmQuaW5zZXJ0KDQsIDYpOworICAgICAgICBtX3NuZC5pbnNlcnQoOCwgNyk7CisKKyAgICAgICAgbGV0IG11dCBtX2NtcDogQlRyZWVNYXA8aTMyLCBpMzI+ID0gQlRyZWVNYXA6Om5ldygpOworICAgICAgICBtX2NtcC5pbnNlcnQoMiwgNCk7CisgICAgICAgIG1fY21wLmluc2VydCg0LCA2KTsKKyAgICAgICAgbV9jbXAuaW5zZXJ0KDgsIDcpOworCisgICAgICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQodGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3RfbWFwKG1fc25kKSwgbV9jbXApPzsKKyAgICB9CisKKyAgICBpbmZvISgidGVzdFN0cmluZ01hcCIpOworICAgIHsKKyAgICAgICAgbGV0IG11dCBtX3NuZDogQlRyZWVNYXA8U3RyaW5nLCBTdHJpbmc+ID0gQlRyZWVNYXA6Om5ldygpOworICAgICAgICBtX3NuZC5pbnNlcnQoIjIiLnRvX293bmVkKCksICI0X3N0cmluZyIudG9fb3duZWQoKSk7CisgICAgICAgIG1fc25kLmluc2VydCgiNCIudG9fb3duZWQoKSwgIjZfc3RyaW5nIi50b19vd25lZCgpKTsKKyAgICAgICAgbV9zbmQuaW5zZXJ0KCI4Ii50b19vd25lZCgpLCAiN19zdHJpbmciLnRvX293bmVkKCkpOworCisgICAgICAgIGxldCBtdXQgbV9yY3Y6IEJUcmVlTWFwPFN0cmluZywgU3RyaW5nPiA9IEJUcmVlTWFwOjpuZXcoKTsKKyAgICAgICAgbV9yY3YuaW5zZXJ0KCIyIi50b19vd25lZCgpLCAiNF9zdHJpbmciLnRvX293bmVkKCkpOworICAgICAgICBtX3Jjdi5pbnNlcnQoIjQiLnRvX293bmVkKCksICI2X3N0cmluZyIudG9fb3duZWQoKSk7CisgICAgICAgIG1fcmN2Lmluc2VydCgiOCIudG9fb3duZWQoKSwgIjdfc3RyaW5nIi50b19vd25lZCgpKTsKKworICAgICAgICB2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X3N0cmluZ19tYXAobV9zbmQpLCBtX3Jjdik/OworICAgIH0KKworICAgIC8vIG5lc3RlZCBtYXAKKyAgICAvLyBleHBlY3QgOiB7LTQgPT4gey00ID0+IC00LCAtMyA9PiAtMywgLTIgPT4gLTIsIC0xID0+IC0xLCB9LCA0ID0+IHsxID0+IDEsIDIKKyAgICAvLyA9PiAyLCAzID0+IDMsIDQgPT4gNCwgfSwgfQorICAgIGluZm8hKCJ0ZXN0TWFwTWFwIik7CisgICAgeworICAgICAgICBsZXQgbXV0IG1fY21wX25lc3RlZF8wOiBCVHJlZU1hcDxpMzIsIGkzMj4gPSBCVHJlZU1hcDo6bmV3KCk7CisgICAgICAgIGZvciBpIGluICgtNCBhcyBpMzIpLi4wIHsKKyAgICAgICAgICAgIG1fY21wX25lc3RlZF8wLmluc2VydChpLCBpKTsKKyAgICAgICAgfQorICAgICAgICBsZXQgbXV0IG1fY21wX25lc3RlZF8xOiBCVHJlZU1hcDxpMzIsIGkzMj4gPSBCVHJlZU1hcDo6bmV3KCk7CisgICAgICAgIGZvciBpIGluIDEuLjUgeworICAgICAgICAgICAgbV9jbXBfbmVzdGVkXzEuaW5zZXJ0KGksIGkpOworICAgICAgICB9CisKKyAgICAgICAgbGV0IG11dCBtX2NtcDogQlRyZWVNYXA8aTMyLCBCVHJlZU1hcDxpMzIsIGkzMj4+ID0gQlRyZWVNYXA6Om5ldygpOworICAgICAgICBtX2NtcC5pbnNlcnQoLTQsIG1fY21wX25lc3RlZF8wKTsKKyAgICAgICAgbV9jbXAuaW5zZXJ0KDQsIG1fY21wX25lc3RlZF8xKTsKKworICAgICAgICB2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X21hcF9tYXAoNDIpLCBtX2NtcCk/OworICAgIH0KKworICAgIGluZm8hKCJ0ZXN0TXVsdGkiKTsKKyAgICB7CisgICAgICAgIGxldCBtdXQgbV9zbmQ6IEJUcmVlTWFwPGkxNiwgU3RyaW5nPiA9IEJUcmVlTWFwOjpuZXcoKTsKKyAgICAgICAgbV9zbmQuaW5zZXJ0KDEyOTgsICJmaXp6Ii50b19vd25lZCgpKTsKKyAgICAgICAgbV9zbmQuaW5zZXJ0KC0xNDgsICJidXp6Ii50b19vd25lZCgpKTsKKworICAgICAgICBsZXQgc19jbXAgPSBYdHJ1Y3QgeworICAgICAgICAgICAgc3RyaW5nX3RoaW5nOiBTb21lKCJIZWxsbzIiLnRvX293bmVkKCkpLAorICAgICAgICAgICAgYnl0ZV90aGluZzogU29tZSgxKSwKKyAgICAgICAgICAgIGkzMl90aGluZzogU29tZSgtMTIzOTQ4KSwKKyAgICAgICAgICAgIGk2NF90aGluZzogU29tZSgtMTkyMzQxMjM5ODEpLAorICAgICAgICB9OworCisgICAgICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQoCisgICAgICAgICAgICB0aHJpZnRfdGVzdF9jbGllbnQudGVzdF9tdWx0aSgxLCAtMTIzOTQ4LCAtMTkyMzQxMjM5ODEsIG1fc25kLCBOdW1iZXJ6OjpFaWdodCwgODEpLAorICAgICAgICAgICAgc19jbXAsCisgICAgICAgICk/OworICAgIH0KKworICAgIC8vIEluc2FuaXR5CisgICAgLy8gcmV0dXJuczoKKyAgICAvLyB7IDEgPT4geyAyID0+IGFyZ3VtZW50LAorICAgIC8vICAgICAgICAgIDMgPT4gYXJndW1lbnQsCisgICAgLy8gICAgICAgIH0sCisgICAgLy8gICAyID0+IHsgNiA9PiA8ZW1wdHkgSW5zYW5pdHkgc3RydWN0PiwgfSwKKyAgICAvLyB9CisgICAgeworICAgICAgICBsZXQgbXV0IGFyZ19tYXBfdXNlcm1hcDogQlRyZWVNYXA8TnVtYmVyeiwgaTY0PiA9IEJUcmVlTWFwOjpuZXcoKTsKKyAgICAgICAgYXJnX21hcF91c2VybWFwLmluc2VydChOdW1iZXJ6OjpPbmUsIDQyODkpOworICAgICAgICBhcmdfbWFwX3VzZXJtYXAuaW5zZXJ0KE51bWJlcno6OkVpZ2h0LCAxOSk7CisKKyAgICAgICAgbGV0IG11dCBhcmdfdmVjX3h0cnVjdHM6IFZlYzxYdHJ1Y3Q+ID0gVmVjOjpuZXcoKTsKKyAgICAgICAgYXJnX3ZlY194dHJ1Y3RzLnB1c2goCisgICAgICAgICAgICBYdHJ1Y3QgeworICAgICAgICAgICAgICAgIHN0cmluZ190aGluZzogU29tZSgiZm9vIi50b19vd25lZCgpKSwKKyAgICAgICAgICAgICAgICBieXRlX3RoaW5nOiBTb21lKDgpLAorICAgICAgICAgICAgICAgIGkzMl90aGluZzogU29tZSgyOSksCisgICAgICAgICAgICAgICAgaTY0X3RoaW5nOiBTb21lKDkyMzg0KSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICk7CisgICAgICAgIGFyZ192ZWNfeHRydWN0cy5wdXNoKAorICAgICAgICAgICAgWHRydWN0IHsKKyAgICAgICAgICAgICAgICBzdHJpbmdfdGhpbmc6IFNvbWUoImJhciIudG9fb3duZWQoKSksCisgICAgICAgICAgICAgICAgYnl0ZV90aGluZzogU29tZSgyOCksCisgICAgICAgICAgICAgICAgaTMyX3RoaW5nOiBTb21lKDIpLAorICAgICAgICAgICAgICAgIGk2NF90aGluZzogU29tZSgtMTI4MSksCisgICAgICAgICAgICB9LAorICAgICAgICApOworICAgICAgICBhcmdfdmVjX3h0cnVjdHMucHVzaCgKKyAgICAgICAgICAgIFh0cnVjdCB7CisgICAgICAgICAgICAgICAgc3RyaW5nX3RoaW5nOiBTb21lKCJiYXoiLnRvX293bmVkKCkpLAorICAgICAgICAgICAgICAgIGJ5dGVfdGhpbmc6IFNvbWUoMCksCisgICAgICAgICAgICAgICAgaTMyX3RoaW5nOiBTb21lKDM5NDg1MzkpLAorICAgICAgICAgICAgICAgIGk2NF90aGluZzogU29tZSgtMTI5Mzg0OTIpLAorICAgICAgICAgICAgfSwKKyAgICAgICAgKTsKKworICAgICAgICBsZXQgbXV0IHNfY21wX25lc3RlZF8xOiBCVHJlZU1hcDxOdW1iZXJ6LCBJbnNhbml0eT4gPSBCVHJlZU1hcDo6bmV3KCk7CisgICAgICAgIGxldCBpbnNhbml0eSA9IEluc2FuaXR5IHsKKyAgICAgICAgICAgIHVzZXJfbWFwOiBTb21lKGFyZ19tYXBfdXNlcm1hcCksCisgICAgICAgICAgICB4dHJ1Y3RzOiBTb21lKGFyZ192ZWNfeHRydWN0cyksCisgICAgICAgIH07CisgICAgICAgIHNfY21wX25lc3RlZF8xLmluc2VydChOdW1iZXJ6OjpUd28sIGluc2FuaXR5LmNsb25lKCkpOworICAgICAgICBzX2NtcF9uZXN0ZWRfMS5pbnNlcnQoTnVtYmVyejo6VGhyZWUsIGluc2FuaXR5LmNsb25lKCkpOworCisgICAgICAgIGxldCBtdXQgc19jbXBfbmVzdGVkXzI6IEJUcmVlTWFwPE51bWJlcnosIEluc2FuaXR5PiA9IEJUcmVlTWFwOjpuZXcoKTsKKyAgICAgICAgbGV0IGVtcHR5X2luc2FuaXR5ID0gSW5zYW5pdHkgeworICAgICAgICAgICAgdXNlcl9tYXA6IFNvbWUoQlRyZWVNYXA6Om5ldygpKSwKKyAgICAgICAgICAgIHh0cnVjdHM6IFNvbWUoVmVjOjpuZXcoKSksCisgICAgICAgIH07CisgICAgICAgIHNfY21wX25lc3RlZF8yLmluc2VydChOdW1iZXJ6OjpTaXgsIGVtcHR5X2luc2FuaXR5KTsKKworICAgICAgICBsZXQgbXV0IHNfY21wOiBCVHJlZU1hcDxVc2VySWQsIEJUcmVlTWFwPE51bWJlcnosIEluc2FuaXR5Pj4gPSBCVHJlZU1hcDo6bmV3KCk7CisgICAgICAgIHNfY21wLmluc2VydCgxIGFzIFVzZXJJZCwgc19jbXBfbmVzdGVkXzEpOworICAgICAgICBzX2NtcC5pbnNlcnQoMiBhcyBVc2VySWQsIHNfY21wX25lc3RlZF8yKTsKKworICAgICAgICB2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X2luc2FuaXR5KGluc2FuaXR5LmNsb25lKCkpLCBzX2NtcCk/OworICAgIH0KKworICAgIGluZm8hKCJ0ZXN0RXhjZXB0aW9uIC0gcmVtb3RlIHRocm93cyBYY2VwdGlvbiIpOworICAgIHsKKyAgICAgICAgbGV0IHIgPSB0aHJpZnRfdGVzdF9jbGllbnQudGVzdF9leGNlcHRpb24oIlhjZXB0aW9uIi50b19vd25lZCgpKTsKKyAgICAgICAgbGV0IHggPSBtYXRjaCByIHsKKyAgICAgICAgICAgIEVycih0aHJpZnQ6OkVycm9yOjpVc2VyKHJlZiBlKSkgPT4geworICAgICAgICAgICAgICAgIG1hdGNoIGUuZG93bmNhc3RfcmVmOjo8WGNlcHRpb24+KCkgeworICAgICAgICAgICAgICAgICAgICBTb21lKHgpID0+IE9rKHgpLAorICAgICAgICAgICAgICAgICAgICBOb25lID0+IEVycih0aHJpZnQ6OkVycm9yOjpVc2VyKCJkaWQgbm90IGdldCBleHBlY3RlZCBYY2VwdGlvbiBzdHJ1Y3QiLmludG8oKSksKSwKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfID0+IEVycih0aHJpZnQ6OkVycm9yOjpVc2VyKCJkaWQgbm90IGdldCBleGNlcHRpb24iLmludG8oKSkpLAorICAgICAgICB9PzsKKworICAgICAgICBsZXQgeF9jbXAgPSBYY2VwdGlvbiB7CisgICAgICAgICAgICBlcnJvcl9jb2RlOiBTb21lKDEwMDEpLAorICAgICAgICAgICAgbWVzc2FnZTogU29tZSgiWGNlcHRpb24iLnRvX293bmVkKCkpLAorICAgICAgICB9OworCisgICAgICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQoT2soeCksICZ4X2NtcCk/OworICAgIH0KKworICAgIGluZm8hKCJ0ZXN0RXhjZXB0aW9uIC0gcmVtb3RlIHRocm93cyBUQXBwbGljYXRpb25FeGNlcHRpb24iKTsKKyAgICB7CisgICAgICAgIGxldCByID0gdGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3RfZXhjZXB0aW9uKCJURXhjZXB0aW9uIi50b19vd25lZCgpKTsKKyAgICAgICAgbWF0Y2ggciB7CisgICAgICAgICAgICBFcnIodGhyaWZ0OjpFcnJvcjo6QXBwbGljYXRpb24ocmVmIGUpKSA9PiB7CisgICAgICAgICAgICAgICAgaW5mbyEoInJlY2VpdmVkIGFuIHs6P30iLCBlKTsKKyAgICAgICAgICAgICAgICBPaygoKSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF8gPT4gRXJyKHRocmlmdDo6RXJyb3I6OlVzZXIoImRpZCBub3QgZ2V0IGV4Y2VwdGlvbiIuaW50bygpKSksCisgICAgICAgIH0/OworICAgIH0KKworICAgIGluZm8hKCJ0ZXN0RXhjZXB0aW9uIC0gcmVtb3RlIHN1Y2NlZWRzIik7CisgICAgeworICAgICAgICBsZXQgciA9IHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X2V4Y2VwdGlvbigiZm9vIi50b19vd25lZCgpKTsKKyAgICAgICAgbWF0Y2ggciB7CisgICAgICAgICAgICBPayhfKSA9PiBPaygoKSksCisgICAgICAgICAgICBfID0+IEVycih0aHJpZnQ6OkVycm9yOjpVc2VyKCJyZWNlaXZlZCBhbiBleGNlcHRpb24iLmludG8oKSkpLAorICAgICAgICB9PzsKKyAgICB9CisKKyAgICBpbmZvISgidGVzdE11bHRpRXhjZXB0aW9uIC0gcmVtb3RlIHRocm93cyBYY2VwdGlvbiIpOworICAgIHsKKyAgICAgICAgbGV0IHIgPQorICAgICAgICAgICAgdGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3RfbXVsdGlfZXhjZXB0aW9uKCJYY2VwdGlvbiIudG9fb3duZWQoKSwgImlnbm9yZWQiLnRvX293bmVkKCkpOworICAgICAgICBsZXQgeCA9IG1hdGNoIHIgeworICAgICAgICAgICAgRXJyKHRocmlmdDo6RXJyb3I6OlVzZXIocmVmIGUpKSA9PiB7CisgICAgICAgICAgICAgICAgbWF0Y2ggZS5kb3duY2FzdF9yZWY6OjxYY2VwdGlvbj4oKSB7CisgICAgICAgICAgICAgICAgICAgIFNvbWUoeCkgPT4gT2soeCksCisgICAgICAgICAgICAgICAgICAgIE5vbmUgPT4gRXJyKHRocmlmdDo6RXJyb3I6OlVzZXIoImRpZCBub3QgZ2V0IGV4cGVjdGVkIFhjZXB0aW9uIHN0cnVjdCIuaW50bygpKSwpLAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF8gPT4gRXJyKHRocmlmdDo6RXJyb3I6OlVzZXIoImRpZCBub3QgZ2V0IGV4Y2VwdGlvbiIuaW50bygpKSksCisgICAgICAgIH0/OworCisgICAgICAgIGxldCB4X2NtcCA9IFhjZXB0aW9uIHsKKyAgICAgICAgICAgIGVycm9yX2NvZGU6IFNvbWUoMTAwMSksCisgICAgICAgICAgICBtZXNzYWdlOiBTb21lKCJUaGlzIGlzIGFuIFhjZXB0aW9uIi50b19vd25lZCgpKSwKKyAgICAgICAgfTsKKworICAgICAgICB2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KE9rKHgpLCAmeF9jbXApPzsKKyAgICB9CisKKyAgICBpbmZvISgidGVzdE11bHRpRXhjZXB0aW9uIC0gcmVtb3RlIHRocm93cyBYY2VwdGlvbjIiKTsKKyAgICB7CisgICAgICAgIGxldCByID0KKyAgICAgICAgICAgIHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X211bHRpX2V4Y2VwdGlvbigiWGNlcHRpb24yIi50b19vd25lZCgpLCAiaWdub3JlZCIudG9fb3duZWQoKSk7CisgICAgICAgIGxldCB4ID0gbWF0Y2ggciB7CisgICAgICAgICAgICBFcnIodGhyaWZ0OjpFcnJvcjo6VXNlcihyZWYgZSkpID0+IHsKKyAgICAgICAgICAgICAgICBtYXRjaCBlLmRvd25jYXN0X3JlZjo6PFhjZXB0aW9uMj4oKSB7CisgICAgICAgICAgICAgICAgICAgIFNvbWUoeCkgPT4gT2soeCksCisgICAgICAgICAgICAgICAgICAgIE5vbmUgPT4gRXJyKHRocmlmdDo6RXJyb3I6OlVzZXIoImRpZCBub3QgZ2V0IGV4cGVjdGVkIFhjZXB0aW9uIHN0cnVjdCIuaW50bygpKSwpLAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF8gPT4gRXJyKHRocmlmdDo6RXJyb3I6OlVzZXIoImRpZCBub3QgZ2V0IGV4Y2VwdGlvbiIuaW50bygpKSksCisgICAgICAgIH0/OworCisgICAgICAgIGxldCB4X2NtcCA9IFhjZXB0aW9uMiB7CisgICAgICAgICAgICBlcnJvcl9jb2RlOiBTb21lKDIwMDIpLAorICAgICAgICAgICAgc3RydWN0X3RoaW5nOiBTb21lKAorICAgICAgICAgICAgICAgIFh0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZ190aGluZzogU29tZSgiVGhpcyBpcyBhbiBYY2VwdGlvbjIiLnRvX293bmVkKCkpLAorICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSB0aGlzIGlzIGFuIE9QVF9JTl9SRVFfT1VUIGZpZWxkIHRoZSBzZW5kZXIgc2V0cyBhIGRlZmF1bHQKKyAgICAgICAgICAgICAgICAgICAgYnl0ZV90aGluZzogU29tZSgwKSwKKyAgICAgICAgICAgICAgICAgICAgLy8gc2luY2UgdGhpcyBpcyBhbiBPUFRfSU5fUkVRX09VVCBmaWVsZCB0aGUgc2VuZGVyIHNldHMgYSBkZWZhdWx0CisgICAgICAgICAgICAgICAgICAgIGkzMl90aGluZzogU29tZSgwKSwKKyAgICAgICAgICAgICAgICAgICAgLy8gc2luY2UgdGhpcyBpcyBhbiBPUFRfSU5fUkVRX09VVCBmaWVsZCB0aGUgc2VuZGVyIHNldHMgYSBkZWZhdWx0CisgICAgICAgICAgICAgICAgICAgIGk2NF90aGluZzogU29tZSgwKSwKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgKSwKKyAgICAgICAgfTsKKworICAgICAgICB2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KE9rKHgpLCAmeF9jbXApPzsKKyAgICB9CisKKyAgICBpbmZvISgidGVzdE11bHRpRXhjZXB0aW9uIC0gcmVtb3RlIHN1Y2NlZWRzIik7CisgICAgeworICAgICAgICBsZXQgciA9IHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X211bHRpX2V4Y2VwdGlvbigiaGFoYSIudG9fb3duZWQoKSwgIlJFVFVSTkVEIi50b19vd25lZCgpKTsKKyAgICAgICAgbGV0IHggPSBtYXRjaCByIHsKKyAgICAgICAgICAgIEVycihlKSA9PiBFcnIodGhyaWZ0OjpFcnJvcjo6VXNlcihmb3JtYXQhKCJyZWNlaXZlZCBhbiB1bmV4cGVjdGVkIGV4Y2VwdGlvbiB7Oj99IiwgZSkuaW50bygpLCksKSwKKyAgICAgICAgICAgIF8gPT4gciwKKyAgICAgICAgfT87CisKKyAgICAgICAgbGV0IHhfY21wID0gWHRydWN0IHsKKyAgICAgICAgICAgIHN0cmluZ190aGluZzogU29tZSgiUkVUVVJORUQiLnRvX293bmVkKCkpLAorICAgICAgICAgICAgLy8gc2luY2UgdGhpcyBpcyBhbiBPUFRfSU5fUkVRX09VVCBmaWVsZCB0aGUgc2VuZGVyIHNldHMgYSBkZWZhdWx0CisgICAgICAgICAgICBieXRlX3RoaW5nOiBTb21lKDApLAorICAgICAgICAgICAgLy8gc2luY2UgdGhpcyBpcyBhbiBPUFRfSU5fUkVRX09VVCBmaWVsZCB0aGUgc2VuZGVyIHNldHMgYSBkZWZhdWx0CisgICAgICAgICAgICBpMzJfdGhpbmc6IFNvbWUoMCksCisgICAgICAgICAgICAvLyBzaW5jZSB0aGlzIGlzIGFuIE9QVF9JTl9SRVFfT1VUIGZpZWxkIHRoZSBzZW5kZXIgc2V0cyBhIGRlZmF1bHQKKyAgICAgICAgICAgIGk2NF90aGluZzogU29tZSgwKSwKKyAgICAgICAgfTsKKworICAgICAgICB2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KE9rKHgpLCB4X2NtcCk/OworICAgIH0KKworICAgIGluZm8hKCJ0ZXN0T25lV2F5IC0gcmVtb3RlIHNsZWVwcyBmb3IgMSBzZWNvbmQiKTsKKyAgICB7CisgICAgICAgIHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X29uZXdheSgxKT87CisgICAgfQorCisgICAgLy8gZmluYWwgdGVzdCB0byB2ZXJpZnkgdGhhdCB0aGUgY29ubmVjdGlvbiBpcyBzdGlsbCB3cml0YWJsZSBhZnRlciB0aGUgb25lLXdheQorICAgIC8vIGNhbGwKKyAgICB0aHJpZnRfdGVzdF9jbGllbnQudGVzdF92b2lkKCkKK30KKworI1tjZmdfYXR0cihmZWF0dXJlID0gImNhcmdvLWNsaXBweSIsIGFsbG93KG5lZWRsZXNzX3Bhc3NfYnlfdmFsdWUpKV0KK2ZuIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQ8VDogRGVidWcgKyBQYXJ0aWFsRXEgKyBTaXplZD4oCisgICAgYWN0dWFsOiBSZXN1bHQ8VCwgdGhyaWZ0OjpFcnJvcj4sCisgICAgZXhwZWN0ZWQ6IFQsCispIC0+IFJlc3VsdDwoKSwgdGhyaWZ0OjpFcnJvcj4geworICAgIGluZm8hKCIqKiogRVhQRUNURUQ6IE9rKHs6P30pIiwgZXhwZWN0ZWQpOworICAgIGluZm8hKCIqKiogQUNUVUFMICA6IHs6P30iLCBhY3R1YWwpOworICAgIG1hdGNoIGFjdHVhbCB7CisgICAgICAgIE9rKHYpID0+IHsKKyAgICAgICAgICAgIGlmIHYgPT0gZXhwZWN0ZWQgeworICAgICAgICAgICAgICAgIGluZm8hKCIqKiogT0sgKioqIik7CisgICAgICAgICAgICAgICAgT2soKCkpCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGluZm8hKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIEVycih0aHJpZnQ6OkVycm9yOjpVc2VyKGZvcm1hdCEoImV4cGVjdGVkIHs6P30gYnV0IGdvdCB7Oj99IiwgJmV4cGVjdGVkLCAmdikuaW50bygpKSwpCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRXJyKGUpID0+IEVycihlKSwKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3JzL3NyYy9iaW4vdGVzdF9zZXJ2ZXIucnMgYi90ZXN0L3JzL3NyYy9iaW4vdGVzdF9zZXJ2ZXIucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFjMWVjNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcnMvc3JjL2Jpbi90ZXN0X3NlcnZlci5ycwpAQCAtMCwwICsxLDM5OCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjW21hY3JvX3VzZV0KK2V4dGVybiBjcmF0ZSBsb2c7CitleHRlcm4gY3JhdGUgZW52X2xvZ2dlcjsKKworI1ttYWNyb191c2VdCitleHRlcm4gY3JhdGUgY2xhcDsKK2V4dGVybiBjcmF0ZSBvcmRlcmVkX2Zsb2F0OworZXh0ZXJuIGNyYXRlIHRocmlmdDsKK2V4dGVybiBjcmF0ZSB0aHJpZnRfdGVzdDsKKwordXNlIG9yZGVyZWRfZmxvYXQ6Ok9yZGVyZWRGbG9hdDsKK3VzZSBzdGQ6OmNvbGxlY3Rpb25zOjp7QlRyZWVNYXAsIEJUcmVlU2V0fTsKK3VzZSBzdGQ6OnRocmVhZDsKK3VzZSBzdGQ6OnRpbWU6OkR1cmF0aW9uOworCit1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RCaW5hcnlJbnB1dFByb3RvY29sRmFjdG9yeSwgVEJpbmFyeU91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgVENvbXBhY3RJbnB1dFByb3RvY29sRmFjdG9yeSwgVENvbXBhY3RPdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgIFRJbnB1dFByb3RvY29sRmFjdG9yeSwgVE91dHB1dFByb3RvY29sRmFjdG9yeX07Cit1c2UgdGhyaWZ0OjpzZXJ2ZXI6OntUTXVsdGlwbGV4ZWRQcm9jZXNzb3IsIFRTZXJ2ZXJ9OwordXNlIHRocmlmdDo6dHJhbnNwb3J0Ojp7VEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydEZhY3RvcnksIFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRGcmFtZWRSZWFkVHJhbnNwb3J0RmFjdG9yeSwgVEZyYW1lZFdyaXRlVHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRSZWFkVHJhbnNwb3J0RmFjdG9yeSwgVFdyaXRlVHJhbnNwb3J0RmFjdG9yeX07Cit1c2UgdGhyaWZ0X3Rlc3Q6Oio7CisKK2ZuIG1haW4oKSB7CisgICAgZW52X2xvZ2dlcjo6aW5pdCgpLmV4cGVjdCgibG9nZ2VyIHNldHVwIGZhaWxlZCIpOworCisgICAgZGVidWchKCJpbml0aWFsaXplZCBsb2dnZXIgLSBydW5uaW5nIGNyb3NzLXRlc3Qgc2VydmVyIik7CisKKyAgICBtYXRjaCBydW4oKSB7CisgICAgICAgIE9rKCgpKSA9PiBpbmZvISgiY3Jvc3MtdGVzdCBzZXJ2ZXIgc3VjY2VlZGVkIiksCisgICAgICAgIEVycihlKSA9PiB7CisgICAgICAgICAgICBpbmZvISgiY3Jvc3MtdGVzdCBzZXJ2ZXIgZmFpbGVkIHdpdGggZXJyb3Igezo/fSIsIGUpOworICAgICAgICAgICAgc3RkOjpwcm9jZXNzOjpleGl0KDEpOworICAgICAgICB9CisgICAgfQorfQorCitmbiBydW4oKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geworCisgICAgLy8gdW5zdXBwb3J0ZWQgb3B0aW9uczoKKyAgICAvLyAtLWRvbWFpbi1zb2NrZXQKKyAgICAvLyAtLW5hbWVkLXBpcGUKKyAgICAvLyAtLXNzbAorICAgIGxldCBtYXRjaGVzID0gY2xhcF9hcHAhKHJ1c3RfdGVzdF9jbGllbnQgPT4KKyAgICAgICAgKHZlcnNpb246ICIxLjAiKQorICAgICAgICAoYXV0aG9yOiAiQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+IikKKyAgICAgICAgKGFib3V0OiAiUnVzdCBUaHJpZnQgdGVzdCBzZXJ2ZXIiKQorICAgICAgICAoQGFyZyBwb3J0OiAtLXBvcnQgK3Rha2VzX3ZhbHVlICJwb3J0IG9uIHdoaWNoIHRoZSB0ZXN0IHNlcnZlciBsaXN0ZW5zIikKKyAgICAgICAgKEBhcmcgdHJhbnNwb3J0OiAtLXRyYW5zcG9ydCArdGFrZXNfdmFsdWUgInRyYW5zcG9ydCBpbXBsZW1lbnRhdGlvbiB0byB1c2UgKFwiYnVmZmVyZWRcIiwgXCJmcmFtZWRcIikiKQorICAgICAgICAoQGFyZyBwcm90b2NvbDogLS1wcm90b2NvbCArdGFrZXNfdmFsdWUgInByb3RvY29sIGltcGxlbWVudGF0aW9uIHRvIHVzZSAoXCJiaW5hcnlcIiwgXCJjb21wYWN0XCIpIikKKyAgICAgICAgKEBhcmcgc2VydmVyX3R5cGU6IC0tc2VydmVyX3R5cGUgK3Rha2VzX3ZhbHVlICJ0eXBlIG9mIHNlcnZlciBpbnN0YW50aWF0ZWQgKFwic2ltcGxlXCIsIFwidGhyZWFkLXBvb2xcIikiKQorICAgICAgICAoQGFyZyB3b3JrZXJzOiAtbiAtLXdvcmtlcnMgK3Rha2VzX3ZhbHVlICJudW1iZXIgb2YgdGhyZWFkLXBvb2wgd29ya2VycyAoXCI0XCIpIikKKyAgICApCisgICAgICAgICAgICAuZ2V0X21hdGNoZXMoKTsKKworICAgIGxldCBwb3J0ID0gdmFsdWVfdCEobWF0Y2hlcywgInBvcnQiLCB1MTYpLnVud3JhcF9vcig5MDkwKTsKKyAgICBsZXQgdHJhbnNwb3J0ID0gbWF0Y2hlcy52YWx1ZV9vZigidHJhbnNwb3J0IikudW53cmFwX29yKCJidWZmZXJlZCIpOworICAgIGxldCBwcm90b2NvbCA9IG1hdGNoZXMudmFsdWVfb2YoInByb3RvY29sIikudW53cmFwX29yKCJiaW5hcnkiKTsKKyAgICBsZXQgc2VydmVyX3R5cGUgPSBtYXRjaGVzLnZhbHVlX29mKCJzZXJ2ZXJfdHlwZSIpLnVud3JhcF9vcigidGhyZWFkLXBvb2wiKTsKKyAgICBsZXQgd29ya2VycyA9IHZhbHVlX3QhKG1hdGNoZXMsICJ3b3JrZXJzIiwgdXNpemUpLnVud3JhcF9vcig0KTsKKyAgICBsZXQgbGlzdGVuX2FkZHJlc3MgPSBmb3JtYXQhKCIxMjcuMC4wLjE6e30iLCBwb3J0KTsKKworICAgIGluZm8hKCJiaW5kaW5nIHRvIHt9IiwgbGlzdGVuX2FkZHJlc3MpOworCisgICAgbGV0IChpX3RyYW5zcG9ydF9mYWN0b3J5LCBvX3RyYW5zcG9ydF9mYWN0b3J5KTogKEJveDxUUmVhZFRyYW5zcG9ydEZhY3Rvcnk+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb3g8VFdyaXRlVHJhbnNwb3J0RmFjdG9yeT4pID0KKyAgICAgICAgbWF0Y2ggJip0cmFuc3BvcnQgeworICAgICAgICAgICAgImJ1ZmZlcmVkIiA9PiB7CisgICAgICAgICAgICAgICAgKEJveDo6bmV3KFRCdWZmZXJlZFJlYWRUcmFuc3BvcnRGYWN0b3J5OjpuZXcoKSksCisgICAgICAgICAgICAgICAgIEJveDo6bmV3KFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0RmFjdG9yeTo6bmV3KCkpKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgImZyYW1lZCIgPT4geworICAgICAgICAgICAgICAgIChCb3g6Om5ldyhURnJhbWVkUmVhZFRyYW5zcG9ydEZhY3Rvcnk6Om5ldygpKSwKKyAgICAgICAgICAgICAgICAgQm94OjpuZXcoVEZyYW1lZFdyaXRlVHJhbnNwb3J0RmFjdG9yeTo6bmV3KCkpKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdW5rbm93biA9PiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVycihmb3JtYXQhKCJ1bnN1cHBvcnRlZCB0cmFuc3BvcnQgdHlwZSB7fSIsIHVua25vd24pLmludG8oKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICBsZXQgKGlfcHJvdG9jb2xfZmFjdG9yeSwgb19wcm90b2NvbF9mYWN0b3J5KTogKEJveDxUSW5wdXRQcm90b2NvbEZhY3Rvcnk+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm94PFRPdXRwdXRQcm90b2NvbEZhY3Rvcnk+KSA9CisgICAgICAgIG1hdGNoICYqcHJvdG9jb2wgeworICAgICAgICAgICAgImJpbmFyeSIgfCAibXVsdGkiIHwgIm11bHRpOmJpbmFyeSIgPT4geworICAgICAgICAgICAgICAgIChCb3g6Om5ldyhUQmluYXJ5SW5wdXRQcm90b2NvbEZhY3Rvcnk6Om5ldygpKSwKKyAgICAgICAgICAgICAgICAgQm94OjpuZXcoVEJpbmFyeU91dHB1dFByb3RvY29sRmFjdG9yeTo6bmV3KCkpKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgImNvbXBhY3QiIHwgIm11bHRpYyIgfCAibXVsdGk6Y29tcGFjdCIgPT4geworICAgICAgICAgICAgICAgIChCb3g6Om5ldyhUQ29tcGFjdElucHV0UHJvdG9jb2xGYWN0b3J5OjpuZXcoKSksCisgICAgICAgICAgICAgICAgIEJveDo6bmV3KFRDb21wYWN0T3V0cHV0UHJvdG9jb2xGYWN0b3J5OjpuZXcoKSkpCisgICAgICAgICAgICB9CisgICAgICAgICAgICB1bmtub3duID0+IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRXJyKGZvcm1hdCEoInVuc3VwcG9ydGVkIHRyYW5zcG9ydCB0eXBlIHt9IiwgdW5rbm93bikuaW50bygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgIGxldCB0ZXN0X3Byb2Nlc3NvciA9IFRocmlmdFRlc3RTeW5jUHJvY2Vzc29yOjpuZXcoVGhyaWZ0VGVzdFN5bmNIYW5kbGVySW1wbCB7fSk7CisKKyAgICBtYXRjaCAmKnNlcnZlcl90eXBlIHsKKyAgICAgICAgInNpbXBsZSIgfCAidGhyZWFkLXBvb2wiID0+IHsKKyAgICAgICAgICAgIGlmIHByb3RvY29sID09ICJtdWx0aSIgfHwgcHJvdG9jb2wgPT0gIm11bHRpYyIgeworICAgICAgICAgICAgICAgIGxldCBzZWNvbmRfc2VydmljZV9wcm9jZXNzb3IgPSBTZWNvbmRTZXJ2aWNlU3luY1Byb2Nlc3Nvcjo6bmV3KFNlY29uZFNlcnZpY2VTeW5jSGFuZGxlckltcGwge30sKTsKKworICAgICAgICAgICAgICAgIGxldCBtdXQgbXVsdGlwbGV4ZWRfcHJvY2Vzc29yID0gVE11bHRpcGxleGVkUHJvY2Vzc29yOjpuZXcoKTsKKyAgICAgICAgICAgICAgICBtdWx0aXBsZXhlZF9wcm9jZXNzb3IKKyAgICAgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKCJUaHJpZnRUZXN0IiwgQm94OjpuZXcodGVzdF9wcm9jZXNzb3IpLCB0cnVlKT87CisgICAgICAgICAgICAgICAgbXVsdGlwbGV4ZWRfcHJvY2Vzc29yCisgICAgICAgICAgICAgICAgICAgIC5yZWdpc3RlcigiU2Vjb25kU2VydmljZSIsIEJveDo6bmV3KHNlY29uZF9zZXJ2aWNlX3Byb2Nlc3NvciksIGZhbHNlKT87CisKKyAgICAgICAgICAgICAgICBsZXQgbXV0IHNlcnZlciA9IFRTZXJ2ZXI6Om5ldygKKyAgICAgICAgICAgICAgICAgICAgaV90cmFuc3BvcnRfZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgaV9wcm90b2NvbF9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICBvX3RyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICBvX3Byb3RvY29sX2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgIG11bHRpcGxleGVkX3Byb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgd29ya2VycywKKyAgICAgICAgICAgICAgICApOworCisgICAgICAgICAgICAgICAgc2VydmVyLmxpc3RlbigmbGlzdGVuX2FkZHJlc3MpCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxldCBtdXQgc2VydmVyID0gVFNlcnZlcjo6bmV3KAorICAgICAgICAgICAgICAgICAgICBpX3RyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICBpX3Byb3RvY29sX2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgIG9fdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgIG9fcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgdGVzdF9wcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgIHdvcmtlcnMsCisgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgICAgIHNlcnZlci5saXN0ZW4oJmxpc3Rlbl9hZGRyZXNzKQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHVua25vd24gPT4gRXJyKGZvcm1hdCEoInVuc3VwcG9ydGVkIHNlcnZlciB0eXBlIHt9IiwgdW5rbm93bikuaW50bygpKSwKKyAgICB9Cit9CisKK3N0cnVjdCBUaHJpZnRUZXN0U3luY0hhbmRsZXJJbXBsOworaW1wbCBUaHJpZnRUZXN0U3luY0hhbmRsZXIgZm9yIFRocmlmdFRlc3RTeW5jSGFuZGxlckltcGwgeworICAgIGZuIGhhbmRsZV90ZXN0X3ZvaWQoJnNlbGYpIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7CisgICAgICAgIGluZm8hKCJ0ZXN0Vm9pZCgpIik7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIGhhbmRsZV90ZXN0X3N0cmluZygmc2VsZiwgdGhpbmc6IFN0cmluZykgLT4gdGhyaWZ0OjpSZXN1bHQ8U3RyaW5nPiB7CisgICAgICAgIGluZm8hKCJ0ZXN0U3RyaW5nKHt9KSIsICZ0aGluZyk7CisgICAgICAgIE9rKHRoaW5nKQorICAgIH0KKworICAgIGZuIGhhbmRsZV90ZXN0X2Jvb2woJnNlbGYsIHRoaW5nOiBib29sKSAtPiB0aHJpZnQ6OlJlc3VsdDxib29sPiB7CisgICAgICAgIGluZm8hKCJ0ZXN0Qm9vbCh7fSkiLCB0aGluZyk7CisgICAgICAgIE9rKHRoaW5nKQorICAgIH0KKworICAgIGZuIGhhbmRsZV90ZXN0X2J5dGUoJnNlbGYsIHRoaW5nOiBpOCkgLT4gdGhyaWZ0OjpSZXN1bHQ8aTg+IHsKKyAgICAgICAgaW5mbyEoInRlc3RCeXRlKHt9KSIsIHRoaW5nKTsKKyAgICAgICAgT2sodGhpbmcpCisgICAgfQorCisgICAgZm4gaGFuZGxlX3Rlc3RfaTMyKCZzZWxmLCB0aGluZzogaTMyKSAtPiB0aHJpZnQ6OlJlc3VsdDxpMzI+IHsKKyAgICAgICAgaW5mbyEoInRlc3RpMzIoe30pIiwgdGhpbmcpOworICAgICAgICBPayh0aGluZykKKyAgICB9CisKKyAgICBmbiBoYW5kbGVfdGVzdF9pNjQoJnNlbGYsIHRoaW5nOiBpNjQpIC0+IHRocmlmdDo6UmVzdWx0PGk2ND4geworICAgICAgICBpbmZvISgidGVzdGk2NCh7fSkiLCB0aGluZyk7CisgICAgICAgIE9rKHRoaW5nKQorICAgIH0KKworICAgIGZuIGhhbmRsZV90ZXN0X2RvdWJsZSgmc2VsZiwgdGhpbmc6IE9yZGVyZWRGbG9hdDxmNjQ+KSAtPiB0aHJpZnQ6OlJlc3VsdDxPcmRlcmVkRmxvYXQ8ZjY0Pj4geworICAgICAgICBpbmZvISgidGVzdERvdWJsZSh7fSkiLCB0aGluZyk7CisgICAgICAgIE9rKHRoaW5nKQorICAgIH0KKworICAgIGZuIGhhbmRsZV90ZXN0X2JpbmFyeSgmc2VsZiwgdGhpbmc6IFZlYzx1OD4pIC0+IHRocmlmdDo6UmVzdWx0PFZlYzx1OD4+IHsKKyAgICAgICAgaW5mbyEoInRlc3RCaW5hcnkoezo/fSkiLCB0aGluZyk7CisgICAgICAgIE9rKHRoaW5nKQorICAgIH0KKworICAgIGZuIGhhbmRsZV90ZXN0X3N0cnVjdCgmc2VsZiwgdGhpbmc6IFh0cnVjdCkgLT4gdGhyaWZ0OjpSZXN1bHQ8WHRydWN0PiB7CisgICAgICAgIGluZm8hKCJ0ZXN0U3RydWN0KHs6P30pIiwgdGhpbmcpOworICAgICAgICBPayh0aGluZykKKyAgICB9CisKKyAgICBmbiBoYW5kbGVfdGVzdF9uZXN0KCZzZWxmLCB0aGluZzogWHRydWN0MikgLT4gdGhyaWZ0OjpSZXN1bHQ8WHRydWN0Mj4geworICAgICAgICBpbmZvISgidGVzdE5lc3Qoezo/fSkiLCB0aGluZyk7CisgICAgICAgIE9rKHRoaW5nKQorICAgIH0KKworICAgIGZuIGhhbmRsZV90ZXN0X21hcCgmc2VsZiwgdGhpbmc6IEJUcmVlTWFwPGkzMiwgaTMyPikgLT4gdGhyaWZ0OjpSZXN1bHQ8QlRyZWVNYXA8aTMyLCBpMzI+PiB7CisgICAgICAgIGluZm8hKCJ0ZXN0TWFwKHs6P30pIiwgdGhpbmcpOworICAgICAgICBPayh0aGluZykKKyAgICB9CisKKyAgICBmbiBoYW5kbGVfdGVzdF9zdHJpbmdfbWFwKAorICAgICAgICAmc2VsZiwKKyAgICAgICAgdGhpbmc6IEJUcmVlTWFwPFN0cmluZywgU3RyaW5nPiwKKyAgICApIC0+IHRocmlmdDo6UmVzdWx0PEJUcmVlTWFwPFN0cmluZywgU3RyaW5nPj4geworICAgICAgICBpbmZvISgidGVzdFN0cmluZ01hcCh7Oj99KSIsIHRoaW5nKTsKKyAgICAgICAgT2sodGhpbmcpCisgICAgfQorCisgICAgZm4gaGFuZGxlX3Rlc3Rfc2V0KCZzZWxmLCB0aGluZzogQlRyZWVTZXQ8aTMyPikgLT4gdGhyaWZ0OjpSZXN1bHQ8QlRyZWVTZXQ8aTMyPj4geworICAgICAgICBpbmZvISgidGVzdFNldCh7Oj99KSIsIHRoaW5nKTsKKyAgICAgICAgT2sodGhpbmcpCisgICAgfQorCisgICAgZm4gaGFuZGxlX3Rlc3RfbGlzdCgmc2VsZiwgdGhpbmc6IFZlYzxpMzI+KSAtPiB0aHJpZnQ6OlJlc3VsdDxWZWM8aTMyPj4geworICAgICAgICBpbmZvISgidGVzdExpc3Qoezo/fSkiLCB0aGluZyk7CisgICAgICAgIE9rKHRoaW5nKQorICAgIH0KKworICAgIGZuIGhhbmRsZV90ZXN0X2VudW0oJnNlbGYsIHRoaW5nOiBOdW1iZXJ6KSAtPiB0aHJpZnQ6OlJlc3VsdDxOdW1iZXJ6PiB7CisgICAgICAgIGluZm8hKCJ0ZXN0RW51bSh7Oj99KSIsIHRoaW5nKTsKKyAgICAgICAgT2sodGhpbmcpCisgICAgfQorCisgICAgZm4gaGFuZGxlX3Rlc3RfdHlwZWRlZigmc2VsZiwgdGhpbmc6IFVzZXJJZCkgLT4gdGhyaWZ0OjpSZXN1bHQ8VXNlcklkPiB7CisgICAgICAgIGluZm8hKCJ0ZXN0VHlwZWRlZih7fSkiLCB0aGluZyk7CisgICAgICAgIE9rKHRoaW5nKQorICAgIH0KKworICAgIC8vLyBAcmV0dXJuIG1hcDxpMzIsbWFwPGkzMixpMzI+PiAtIHJldHVybnMgYSBkaWN0aW9uYXJ5IHdpdGggdGhlc2UgdmFsdWVzOgorICAgIC8vLyB7LTQgPT4gey00ID0+IC00LCAtMyA9PiAtMywgLTIgPT4gLTIsIC0xID0+IC0xLCB9LCA0ID0+IHsxID0+IDEsIDIgPT4KKyAgICAvLy8gMiwgMyA9PiAzLCA0ID0+IDQsIH0sIH0KKyAgICBmbiBoYW5kbGVfdGVzdF9tYXBfbWFwKCZzZWxmLCBoZWxsbzogaTMyKSAtPiB0aHJpZnQ6OlJlc3VsdDxCVHJlZU1hcDxpMzIsIEJUcmVlTWFwPGkzMiwgaTMyPj4+IHsKKyAgICAgICAgaW5mbyEoInRlc3RNYXBNYXAoe30pIiwgaGVsbG8pOworCisgICAgICAgIGxldCBtdXQgaW5uZXJfbWFwXzA6IEJUcmVlTWFwPGkzMiwgaTMyPiA9IEJUcmVlTWFwOjpuZXcoKTsKKyAgICAgICAgZm9yIGkgaW4gLTQuLigwIGFzIGkzMikgeworICAgICAgICAgICAgaW5uZXJfbWFwXzAuaW5zZXJ0KGksIGkpOworICAgICAgICB9CisKKyAgICAgICAgbGV0IG11dCBpbm5lcl9tYXBfMTogQlRyZWVNYXA8aTMyLCBpMzI+ID0gQlRyZWVNYXA6Om5ldygpOworICAgICAgICBmb3IgaSBpbiAxLi41IHsKKyAgICAgICAgICAgIGlubmVyX21hcF8xLmluc2VydChpLCBpKTsKKyAgICAgICAgfQorCisgICAgICAgIGxldCBtdXQgcmV0X21hcDogQlRyZWVNYXA8aTMyLCBCVHJlZU1hcDxpMzIsIGkzMj4+ID0gQlRyZWVNYXA6Om5ldygpOworICAgICAgICByZXRfbWFwLmluc2VydCgtNCwgaW5uZXJfbWFwXzApOworICAgICAgICByZXRfbWFwLmluc2VydCg0LCBpbm5lcl9tYXBfMSk7CisKKyAgICAgICAgT2socmV0X21hcCkKKyAgICB9CisKKyAgICAvLy8gQ3JlYXRlcyBhIHRoZSByZXR1cm5lZCBtYXAgd2l0aCB0aGVzZSB2YWx1ZXMgYW5kIHByaW50cyBpdCBvdXQ6CisgICAgLy8vICAgICB7IDEgPT4geyAyID0+IGFyZ3VtZW50LAorICAgIC8vLyAgICAgICAgICAgICAgMyA9PiBhcmd1bWVudCwKKyAgICAvLy8gICAgICAgICAgICB9LAorICAgIC8vLyAgICAgICAyID0+IHsgNiA9PiA8ZW1wdHkgSW5zYW5pdHkgc3RydWN0PiwgfSwKKyAgICAvLy8gICAgIH0KKyAgICAvLy8gcmV0dXJuIG1hcDxVc2VySWQsIG1hcDxOdW1iZXJ6LEluc2FuaXR5Pj4gLSBhIG1hcCB3aXRoIHRoZSBhYm92ZSB2YWx1ZXMKKyAgICBmbiBoYW5kbGVfdGVzdF9pbnNhbml0eSgKKyAgICAgICAgJnNlbGYsCisgICAgICAgIGFyZ3VtZW50OiBJbnNhbml0eSwKKyAgICApIC0+IHRocmlmdDo6UmVzdWx0PEJUcmVlTWFwPFVzZXJJZCwgQlRyZWVNYXA8TnVtYmVyeiwgSW5zYW5pdHk+Pj4geworICAgICAgICBpbmZvISgidGVzdEluc2FuaXR5KHs6P30pIiwgYXJndW1lbnQpOworICAgICAgICBsZXQgbXV0IG1hcF8wOiBCVHJlZU1hcDxOdW1iZXJ6LCBJbnNhbml0eT4gPSBCVHJlZU1hcDo6bmV3KCk7CisgICAgICAgIG1hcF8wLmluc2VydChOdW1iZXJ6OjpUd28sIGFyZ3VtZW50LmNsb25lKCkpOworICAgICAgICBtYXBfMC5pbnNlcnQoTnVtYmVyejo6VGhyZWUsIGFyZ3VtZW50LmNsb25lKCkpOworCisgICAgICAgIGxldCBtdXQgbWFwXzE6IEJUcmVlTWFwPE51bWJlcnosIEluc2FuaXR5PiA9IEJUcmVlTWFwOjpuZXcoKTsKKyAgICAgICAgbGV0IGluc2FuaXR5ID0gSW5zYW5pdHkgeworICAgICAgICAgICAgdXNlcl9tYXA6IE5vbmUsCisgICAgICAgICAgICB4dHJ1Y3RzOiBOb25lLAorICAgICAgICB9OworICAgICAgICBtYXBfMS5pbnNlcnQoTnVtYmVyejo6U2l4LCBpbnNhbml0eSk7CisKKyAgICAgICAgbGV0IG11dCByZXQ6IEJUcmVlTWFwPFVzZXJJZCwgQlRyZWVNYXA8TnVtYmVyeiwgSW5zYW5pdHk+PiA9IEJUcmVlTWFwOjpuZXcoKTsKKyAgICAgICAgcmV0Lmluc2VydCgxLCBtYXBfMCk7CisgICAgICAgIHJldC5pbnNlcnQoMiwgbWFwXzEpOworCisgICAgICAgIE9rKHJldCkKKyAgICB9CisKKyAgICAvLy8gcmV0dXJucyBhbiBYdHJ1Y3Qgd2l0aDoKKyAgICAvLy8gc3RyaW5nX3RoaW5nID0gIkhlbGxvMiIsIGJ5dGVfdGhpbmcgPSBhcmcwLCBpMzJfdGhpbmcgPSBhcmcxIGFuZAorICAgIC8vLyBpNjRfdGhpbmcgPSBhcmcyCisgICAgZm4gaGFuZGxlX3Rlc3RfbXVsdGkoCisgICAgICAgICZzZWxmLAorICAgICAgICBhcmcwOiBpOCwKKyAgICAgICAgYXJnMTogaTMyLAorICAgICAgICBhcmcyOiBpNjQsCisgICAgICAgIF86IEJUcmVlTWFwPGkxNiwgU3RyaW5nPiwKKyAgICAgICAgXzogTnVtYmVyeiwKKyAgICAgICAgXzogVXNlcklkLAorICAgICkgLT4gdGhyaWZ0OjpSZXN1bHQ8WHRydWN0PiB7CisgICAgICAgIGxldCB4X3JldCA9IFh0cnVjdCB7CisgICAgICAgICAgICBzdHJpbmdfdGhpbmc6IFNvbWUoIkhlbGxvMiIudG9fb3duZWQoKSksCisgICAgICAgICAgICBieXRlX3RoaW5nOiBTb21lKGFyZzApLAorICAgICAgICAgICAgaTMyX3RoaW5nOiBTb21lKGFyZzEpLAorICAgICAgICAgICAgaTY0X3RoaW5nOiBTb21lKGFyZzIpLAorICAgICAgICB9OworCisgICAgICAgIE9rKHhfcmV0KQorICAgIH0KKworICAgIC8vLyBpZiBhcmcgPT0gIlhjZXB0aW9uIiB0aHJvdyBYY2VwdGlvbiB3aXRoIGVycm9yQ29kZSA9IDEwMDEgYW5kIG1lc3NhZ2UgPQorICAgIC8vLyBhcmcKKyAgICAvLy8gZWxzZSBpZiBhcmcgPT0gIlRFeGNlcHRpb24iIHRocm93IFRFeGNlcHRpb24KKyAgICAvLy8gZWxzZSBkbyBub3QgdGhyb3cgYW55dGhpbmcKKyAgICBmbiBoYW5kbGVfdGVzdF9leGNlcHRpb24oJnNlbGYsIGFyZzogU3RyaW5nKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geworICAgICAgICBpbmZvISgidGVzdEV4Y2VwdGlvbih7fSkiLCBhcmcpOworCisgICAgICAgIG1hdGNoICYqYXJnIHsKKyAgICAgICAgICAgICJYY2VwdGlvbiIgPT4geworICAgICAgICAgICAgICAgIEVycigKKyAgICAgICAgICAgICAgICAgICAgKFhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfY29kZTogU29tZSgxMDAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogU29tZShhcmcpLAorICAgICAgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgICAgICAuaW50bygpLAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICJURXhjZXB0aW9uIiA9PiBFcnIoInRoaXMgaXMgYSByYW5kb20gZXJyb3IiLmludG8oKSksCisgICAgICAgICAgICBfID0+IE9rKCgpKSwKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLyBpZiBhcmcwID09ICJYY2VwdGlvbiI6CisgICAgLy8vIHRocm93IFhjZXB0aW9uIHdpdGggZXJyb3JDb2RlID0gMTAwMSBhbmQgbWVzc2FnZSA9ICJUaGlzIGlzIGFuCisgICAgLy8vIFhjZXB0aW9uIgorICAgIC8vLyBlbHNlIGlmIGFyZzAgPT0gIlhjZXB0aW9uMiI6CisgICAgLy8vIHRocm93IFhjZXB0aW9uMiB3aXRoIGVycm9yQ29kZSA9IDIwMDIgYW5kIHN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcgPQorICAgIC8vLyAiVGhpcyBpcyBhbiBYY2VwdGlvbjIiCisgICAgLy8gZWxzZToKKyAgICAvLyAgIGRvIG5vdCB0aHJvdyBhbnl0aGluZyBhbmQgcmV0dXJuIFh0cnVjdCB3aXRoIHN0cmluZ190aGluZyA9IGFyZzEKKyAgICBmbiBoYW5kbGVfdGVzdF9tdWx0aV9leGNlcHRpb24oJnNlbGYsIGFyZzA6IFN0cmluZywgYXJnMTogU3RyaW5nKSAtPiB0aHJpZnQ6OlJlc3VsdDxYdHJ1Y3Q+IHsKKyAgICAgICAgbWF0Y2ggJiphcmcwIHsKKyAgICAgICAgICAgICJYY2VwdGlvbiIgPT4geworICAgICAgICAgICAgICAgIEVycigKKyAgICAgICAgICAgICAgICAgICAgKFhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfY29kZTogU29tZSgxMDAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogU29tZSgiVGhpcyBpcyBhbiBYY2VwdGlvbiIudG9fb3duZWQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5pbnRvKCksCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgIlhjZXB0aW9uMiIgPT4geworICAgICAgICAgICAgICAgIEVycigKKyAgICAgICAgICAgICAgICAgICAgKFhjZXB0aW9uMiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX2NvZGU6IFNvbWUoMjAwMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdF90aGluZzogU29tZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYdHJ1Y3QgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfdGhpbmc6IFNvbWUoIlRoaXMgaXMgYW4gWGNlcHRpb24yIi50b19vd25lZCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV90aGluZzogTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTMyX3RoaW5nOiBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpNjRfdGhpbmc6IE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5pbnRvKCksCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgXyA9PiB7CisgICAgICAgICAgICAgICAgT2soCisgICAgICAgICAgICAgICAgICAgIFh0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfdGhpbmc6IFNvbWUoYXJnMSksCisgICAgICAgICAgICAgICAgICAgICAgICBieXRlX3RoaW5nOiBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgaTMyX3RoaW5nOiBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgaTY0X3RoaW5nOiBOb25lLAorICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZuIGhhbmRsZV90ZXN0X29uZXdheSgmc2VsZiwgc2Vjb25kc190b19zbGVlcDogaTMyKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geworICAgICAgICB0aHJlYWQ6OnNsZWVwKER1cmF0aW9uOjpmcm9tX3NlY3Moc2Vjb25kc190b19zbGVlcCBhcyB1NjQpKTsKKyAgICAgICAgT2soKCkpCisgICAgfQorfQorCitzdHJ1Y3QgU2Vjb25kU2VydmljZVN5bmNIYW5kbGVySW1wbDsKK2ltcGwgU2Vjb25kU2VydmljZVN5bmNIYW5kbGVyIGZvciBTZWNvbmRTZXJ2aWNlU3luY0hhbmRsZXJJbXBsIHsKKyAgICBmbiBoYW5kbGVfc2Vjb25kdGVzdF9zdHJpbmcoJnNlbGYsIHRoaW5nOiBTdHJpbmcpIC0+IHRocmlmdDo6UmVzdWx0PFN0cmluZz4geworICAgICAgICBpbmZvISgiKHNlY29uZCl0ZXN0U3RyaW5nKHt9KSIsICZ0aGluZyk7CisgICAgICAgIGxldCByZXQgPSBmb3JtYXQhKCJ0ZXN0U3RyaW5nKFwie31cIikiLCAmdGhpbmcpOworICAgICAgICBPayhyZXQpCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9ycy9zcmMvbGliLnJzIGIvdGVzdC9ycy9zcmMvbGliLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3OWJmOTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3JzL3NyYy9saWIucnMKQEAgLTAsMCArMSwyMyBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitleHRlcm4gY3JhdGUgb3JkZXJlZF9mbG9hdDsKK2V4dGVybiBjcmF0ZSB0aHJpZnQ7CitleHRlcm4gY3JhdGUgdHJ5X2Zyb207CisKK21vZCB0aHJpZnRfdGVzdDsKK3B1YiB1c2UgdGhyaWZ0X3Rlc3Q6Oio7CmRpZmYgLS1naXQgYS90ZXN0L3Rlc3QucHkgYi90ZXN0L3Rlc3QucHkKaW5kZXggMTE3NjM2OS4uZjU5MjU2YSAxMDA3NTUKLS0tIGEvdGVzdC90ZXN0LnB5CisrKyBiL3Rlc3QvdGVzdC5weQpAQCAtMSw0ICsxLDQgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwogIwogIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCkBAIC0xOCwxMDYgKzE4LDE3NSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotIyBBcGFjaGUgVGhyaWZ0IC0gaW50ZWdyYXRpb24gdGVzdCBzdWl0ZQorIworIyBBcGFjaGUgVGhyaWZ0IC0gaW50ZWdyYXRpb24gKGNyb3NzKSB0ZXN0IHN1aXRlCiAjCiAjIHRlc3RzIGRpZmZlcmVudCBzZXJ2ZXItY2xpZW50LCBwcm90b2NvbCBhbmQgdHJhbnNwb3J0IGNvbWJpbmF0aW9ucwogIwotIyBUaGlzIHNjcmlwdCBzdXBwb3J0cyBweXRob24gMi43IGFuZCBsYXRlci4KLSMgcHl0aG9uIDMueCBpcyByZWNvbW1lbmRlZCBmb3IgYmV0dGVyIHN0YWJpbGl0eS4KLSMKLSMgVE9ETzogZWxpbWluYXRlIGEgZmV3IDIuNyBvY2N1cnJlbmNlcyB0byBzdXBwb3J0IDIuNiA/CisjIFRoaXMgc2NyaXB0IHJlcXVpcmVzIHB5dGhvbiAzLnggZHVlIHRvIHRoZSBpbXByb3ZlbWVudHMgaW4KKyMgc3VicHJvY2VzcyBtYW5hZ2VtZW50IHRoYXQgYXJlIG5lZWRlZCBmb3IgcmVsaWFiaWxpdHkuCiAjCiAKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KK2Zyb20gaXRlcnRvb2xzIGltcG9ydCBjaGFpbgogaW1wb3J0IGpzb24KIGltcG9ydCBsb2dnaW5nCiBpbXBvcnQgbXVsdGlwcm9jZXNzaW5nCi1pbXBvcnQgb3B0cGFyc2UKK2ltcG9ydCBhcmdwYXJzZQogaW1wb3J0IG9zCiBpbXBvcnQgc3lzCiAKIGltcG9ydCBjcm9zc3J1bm5lcgorZnJvbSBjcm9zc3J1bm5lci5jb21wYXQgaW1wb3J0IHBhdGhfam9pbgogCi1URVNUX0RJUiA9IG9zLnBhdGgucmVhbHBhdGgob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSkKLUNPTkZJR19QQVRIID0gb3MucGF0aC5qb2luKFRFU1RfRElSLCAndGVzdHMuanNvbicpCisjIDMuMyBpbnRyb2R1Y2VkIHN1YnByb2Nlc3MgdGltZW91dHMgb24gd2FpdGluZyBmb3IgY2hpbGQKK3JlcV92ZXJzaW9uID0gKDMsIDMpCitjdXJfdmVyc2lvbiA9IHN5cy52ZXJzaW9uX2luZm8KK2Fzc2VydCAoY3VyX3ZlcnNpb24gPj0gcmVxX3ZlcnNpb24pLCAiUHl0aG9uIDMuMyBvciBsYXRlciBpcyByZXF1aXJlZCBmb3IgcHJvcGVyIG9wZXJhdGlvbi4iCiAKIAotZGVmIHByZXBhcmUoc2VydmVyX21hdGNoLCBjbGllbnRfbWF0Y2gpOgotICB3aXRoIG9wZW4oQ09ORklHX1BBVEgsICdyJykgYXMgZnA6Ci0gICAgaiA9IGpzb24ubG9hZChmcCkKLSAgcmV0dXJuIGNyb3NzcnVubmVyLnByZXBhcmUoaiwgVEVTVF9ESVIsIHNlcnZlcl9tYXRjaCwgY2xpZW50X21hdGNoKQorUk9PVF9ESVIgPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5yZWFscGF0aChvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKSkKK1RFU1RfRElSX1JFTEFUSVZFID0gJ3Rlc3QnCitURVNUX0RJUiA9IHBhdGhfam9pbihST09UX0RJUiwgVEVTVF9ESVJfUkVMQVRJVkUpCitGRUFUVVJFX0RJUl9SRUxBVElWRSA9IHBhdGhfam9pbihURVNUX0RJUl9SRUxBVElWRSwgJ2ZlYXR1cmVzJykKK0NPTkZJR19GSUxFID0gJ3Rlc3RzLmpzb24nCiAKIAotZGVmIHJ1bl90ZXN0cyhzZXJ2ZXJfbWF0Y2gsIGNsaWVudF9tYXRjaCwgam9icywgc2tpcF9rbm93bl9mYWlsdXJlcyk6Ci0gIGxvZ2dlciA9IG11bHRpcHJvY2Vzc2luZy5nZXRfbG9nZ2VyKCkKLSAgbG9nZ2VyLmRlYnVnKCdDb2xsZWN0aW5nIHRlc3RzJykKLSAgd2l0aCBvcGVuKENPTkZJR19QQVRILCAncicpIGFzIGZwOgotICAgIGogPSBqc29uLmxvYWQoZnApCi0gIHRlc3RzID0gbGlzdChjcm9zc3J1bm5lci5jb2xsZWN0X3Rlc3RzKGosIHNlcnZlcl9tYXRjaCwgY2xpZW50X21hdGNoKSkKLSAgaWYgc2tpcF9rbm93bl9mYWlsdXJlczoKLSAgICBrbm93biA9IGNyb3NzcnVubmVyLmxvYWRfa25vd25fZmFpbHVyZXMoVEVTVF9ESVIpCi0gICAgdGVzdHMgPSBsaXN0KGZpbHRlcihsYW1iZGEgdDogY3Jvc3NydW5uZXIudGVzdF9uYW1lKCoqdCkgbm90IGluIGtub3duLCB0ZXN0cykpCitkZWYgcnVuX2Nyb3NzX3Rlc3RzKHNlcnZlcl9tYXRjaCwgY2xpZW50X21hdGNoLCBqb2JzLCBza2lwX2tub3duX2ZhaWx1cmVzLCBvbmx5X2tub3duX2ZhaWx1cmVzLCByZXRyeV9jb3VudCwgcmVnZXgpOgorICAgIGxvZ2dlciA9IG11bHRpcHJvY2Vzc2luZy5nZXRfbG9nZ2VyKCkKKyAgICBsb2dnZXIuZGVidWcoJ0NvbGxlY3RpbmcgdGVzdHMnKQorICAgIHdpdGggb3BlbihwYXRoX2pvaW4oVEVTVF9ESVIsIENPTkZJR19GSUxFKSwgJ3InKSBhcyBmcDoKKyAgICAgICAgaiA9IGpzb24ubG9hZChmcCkKKyAgICB0ZXN0cyA9IGNyb3NzcnVubmVyLmNvbGxlY3RfY3Jvc3NfdGVzdHMoaiwgc2VydmVyX21hdGNoLCBjbGllbnRfbWF0Y2gsIHJlZ2V4KQorICAgIGlmIG5vdCB0ZXN0czoKKyAgICAgICAgcHJpbnQoJ05vIHRlc3QgZm91bmQgdGhhdCBtYXRjaGVzIHRoZSBjcml0ZXJpYScsIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgcHJpbnQoJyAgc2VydmVyczogJXMnICUgc2VydmVyX21hdGNoLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgIHByaW50KCcgIGNsaWVudHM6ICVzJyAlIGNsaWVudF9tYXRjaCwgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICBpZiBvbmx5X2tub3duX2ZhaWx1cmVzOgorICAgICAgICBsb2dnZXIuZGVidWcoJ09ubHkgcnVubmluZyBrbm93biBmYWlsdXJlcycpCisgICAgICAgIGtub3duID0gY3Jvc3NydW5uZXIubG9hZF9rbm93bl9mYWlsdXJlcyhURVNUX0RJUikKKyAgICAgICAgdGVzdHMgPSBsaXN0KGZpbHRlcihsYW1iZGEgdDogY3Jvc3NydW5uZXIudGVzdF9uYW1lKCoqdCkgaW4ga25vd24sIHRlc3RzKSkKKyAgICBpZiBza2lwX2tub3duX2ZhaWx1cmVzOgorICAgICAgICBsb2dnZXIuZGVidWcoJ1NraXBwaW5nIGtub3duIGZhaWx1cmVzJykKKyAgICAgICAga25vd24gPSBjcm9zc3J1bm5lci5sb2FkX2tub3duX2ZhaWx1cmVzKFRFU1RfRElSKQorICAgICAgICB0ZXN0cyA9IGxpc3QoZmlsdGVyKGxhbWJkYSB0OiBjcm9zc3J1bm5lci50ZXN0X25hbWUoKip0KSBub3QgaW4ga25vd24sIHRlc3RzKSkKIAotICBkaXNwYXRjaGVyID0gY3Jvc3NydW5uZXIuVGVzdERpc3BhdGNoZXIoVEVTVF9ESVIsIGpvYnMpCi0gIGxvZ2dlci5kZWJ1ZygnRXhlY3V0aW5nICVkIHRlc3RzJyAlIGxlbih0ZXN0cykpCi0gIHRyeToKLSAgICBmb3IgciBpbiBbZGlzcGF0Y2hlci5kaXNwYXRjaCh0ZXN0KSBmb3IgdGVzdCBpbiB0ZXN0c106Ci0gICAgICByLndhaXQoKQotICAgIGxvZ2dlci5kZWJ1ZygnV2FpdGluZyBmb3IgY29tcGxldGlvbicpCi0gICAgcmV0dXJuIGRpc3BhdGNoZXIud2FpdCgpCi0gIGV4Y2VwdCAoS2V5Ym9hcmRJbnRlcnJ1cHQsIFN5c3RlbUV4aXQpOgotICAgIGxvZ2dlci5kZWJ1ZygnSW50ZXJydXB0ZWQsIHNodXR0aW5nIGRvd24nKQotICAgIGRpc3BhdGNoZXIudGVybWluYXRlKCkKLSAgICByZXR1cm4gRmFsc2UKKyAgICBkaXNwYXRjaGVyID0gY3Jvc3NydW5uZXIuVGVzdERpc3BhdGNoZXIoVEVTVF9ESVIsIFJPT1RfRElSLCBURVNUX0RJUl9SRUxBVElWRSwgam9icykKKyAgICBsb2dnZXIuZGVidWcoJ0V4ZWN1dGluZyAlZCB0ZXN0cycgJSBsZW4odGVzdHMpKQorICAgIHRyeToKKyAgICAgICAgZm9yIHIgaW4gW2Rpc3BhdGNoZXIuZGlzcGF0Y2godGVzdCwgcmV0cnlfY291bnQpIGZvciB0ZXN0IGluIHRlc3RzXToKKyAgICAgICAgICAgIHIud2FpdCgpCisgICAgICAgIGxvZ2dlci5kZWJ1ZygnV2FpdGluZyBmb3IgY29tcGxldGlvbicpCisgICAgICAgIHJldHVybiBkaXNwYXRjaGVyLndhaXQoKQorICAgIGV4Y2VwdCAoS2V5Ym9hcmRJbnRlcnJ1cHQsIFN5c3RlbUV4aXQpOgorICAgICAgICBsb2dnZXIuZGVidWcoJ0ludGVycnVwdGVkLCBzaHV0dGluZyBkb3duJykKKyAgICAgICAgZGlzcGF0Y2hlci50ZXJtaW5hdGUoKQorICAgICAgICByZXR1cm4gRmFsc2UKKworCitkZWYgcnVuX2ZlYXR1cmVfdGVzdHMoc2VydmVyX21hdGNoLCBmZWF0dXJlX21hdGNoLCBqb2JzLCBza2lwX2tub3duX2ZhaWx1cmVzLCBvbmx5X2tub3duX2ZhaWx1cmVzLCByZXRyeV9jb3VudCwgcmVnZXgpOgorICAgIGJhc2VkaXIgPSBwYXRoX2pvaW4oUk9PVF9ESVIsIEZFQVRVUkVfRElSX1JFTEFUSVZFKQorICAgIGxvZ2dlciA9IG11bHRpcHJvY2Vzc2luZy5nZXRfbG9nZ2VyKCkKKyAgICBsb2dnZXIuZGVidWcoJ0NvbGxlY3RpbmcgdGVzdHMnKQorICAgIHdpdGggb3BlbihwYXRoX2pvaW4oVEVTVF9ESVIsIENPTkZJR19GSUxFKSwgJ3InKSBhcyBmcDoKKyAgICAgICAgaiA9IGpzb24ubG9hZChmcCkKKyAgICB3aXRoIG9wZW4ocGF0aF9qb2luKGJhc2VkaXIsIENPTkZJR19GSUxFKSwgJ3InKSBhcyBmcDoKKyAgICAgICAgajIgPSBqc29uLmxvYWQoZnApCisgICAgdGVzdHMgPSBjcm9zc3J1bm5lci5jb2xsZWN0X2ZlYXR1cmVfdGVzdHMoaiwgajIsIHNlcnZlcl9tYXRjaCwgZmVhdHVyZV9tYXRjaCwgcmVnZXgpCisgICAgaWYgbm90IHRlc3RzOgorICAgICAgICBwcmludCgnTm8gdGVzdCBmb3VuZCB0aGF0IG1hdGNoZXMgdGhlIGNyaXRlcmlhJywgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICBwcmludCgnICBzZXJ2ZXJzOiAlcycgJSBzZXJ2ZXJfbWF0Y2gsIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgcHJpbnQoJyAgZmVhdHVyZXM6ICVzJyAlIGZlYXR1cmVfbWF0Y2gsIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgaWYgb25seV9rbm93bl9mYWlsdXJlczoKKyAgICAgICAgbG9nZ2VyLmRlYnVnKCdPbmx5IHJ1bm5pbmcga25vd24gZmFpbHVyZXMnKQorICAgICAgICBrbm93biA9IGNyb3NzcnVubmVyLmxvYWRfa25vd25fZmFpbHVyZXMoYmFzZWRpcikKKyAgICAgICAgdGVzdHMgPSBsaXN0KGZpbHRlcihsYW1iZGEgdDogY3Jvc3NydW5uZXIudGVzdF9uYW1lKCoqdCkgaW4ga25vd24sIHRlc3RzKSkKKyAgICBpZiBza2lwX2tub3duX2ZhaWx1cmVzOgorICAgICAgICBsb2dnZXIuZGVidWcoJ1NraXBwaW5nIGtub3duIGZhaWx1cmVzJykKKyAgICAgICAga25vd24gPSBjcm9zc3J1bm5lci5sb2FkX2tub3duX2ZhaWx1cmVzKGJhc2VkaXIpCisgICAgICAgIHRlc3RzID0gbGlzdChmaWx0ZXIobGFtYmRhIHQ6IGNyb3NzcnVubmVyLnRlc3RfbmFtZSgqKnQpIG5vdCBpbiBrbm93biwgdGVzdHMpKQorCisgICAgZGlzcGF0Y2hlciA9IGNyb3NzcnVubmVyLlRlc3REaXNwYXRjaGVyKFRFU1RfRElSLCBST09UX0RJUiwgRkVBVFVSRV9ESVJfUkVMQVRJVkUsIGpvYnMpCisgICAgbG9nZ2VyLmRlYnVnKCdFeGVjdXRpbmcgJWQgdGVzdHMnICUgbGVuKHRlc3RzKSkKKyAgICB0cnk6CisgICAgICAgIGZvciByIGluIFtkaXNwYXRjaGVyLmRpc3BhdGNoKHRlc3QsIHJldHJ5X2NvdW50KSBmb3IgdGVzdCBpbiB0ZXN0c106CisgICAgICAgICAgICByLndhaXQoKQorICAgICAgICBsb2dnZXIuZGVidWcoJ1dhaXRpbmcgZm9yIGNvbXBsZXRpb24nKQorICAgICAgICByZXR1cm4gZGlzcGF0Y2hlci53YWl0KCkKKyAgICBleGNlcHQgKEtleWJvYXJkSW50ZXJydXB0LCBTeXN0ZW1FeGl0KToKKyAgICAgICAgbG9nZ2VyLmRlYnVnKCdJbnRlcnJ1cHRlZCwgc2h1dHRpbmcgZG93bicpCisgICAgICAgIGRpc3BhdGNoZXIudGVybWluYXRlKCkKKyAgICAgICAgcmV0dXJuIEZhbHNlCiAKIAogZGVmIGRlZmF1bHRfY29uY3VycmVudHkoKToKLSAgdHJ5OgotICAgIHJldHVybiBpbnQob3MuZW52aXJvbi5nZXQoJ1RIUklGVF9DUk9TU1RFU1RfQ09OQ1VSUkVOQ1knKSkKLSAgZXhjZXB0IChUeXBlRXJyb3IsIFZhbHVlRXJyb3IpOgotICAgICMgU2luY2UgbXVjaCB0aW1lIGlzIHNwZW50IHNsZWVwaW5nLCB1c2UgbWFueSB0aHJlYWRzCi0gICAgcmV0dXJuIGludChtdWx0aXByb2Nlc3NpbmcuY3B1X2NvdW50KCkgKiAxLjI1KSArIDEKKyAgICB0cnk6CisgICAgICAgIHJldHVybiBpbnQob3MuZW52aXJvbi5nZXQoJ1RIUklGVF9DUk9TU1RFU1RfQ09OQ1VSUkVOQ1knKSkKKyAgICBleGNlcHQgKFR5cGVFcnJvciwgVmFsdWVFcnJvcik6CisgICAgICAgICMgU2luY2UgbXVjaCB0aW1lIGlzIHNwZW50IHNsZWVwaW5nLCB1c2UgbWFueSB0aHJlYWRzCisgICAgICAgIHJldHVybiBpbnQobXVsdGlwcm9jZXNzaW5nLmNwdV9jb3VudCgpICogMS4yNSkgKyAxCiAKIAogZGVmIG1haW4oYXJndik6Ci0gIHBhcnNlciA9IG9wdHBhcnNlLk9wdGlvblBhcnNlcigpCi0gIHBhcnNlci5hZGRfb3B0aW9uKCctLXNlcnZlcicsIHR5cGU9J3N0cmluZycsIGRlc3Q9J3NlcnZlcnMnLCBkZWZhdWx0PScnLAotICAgICAgICAgICAgICAgICAgICBoZWxwPSdsaXN0IG9mIHNlcnZlcnMgdG8gdGVzdCBzZXBhcmF0ZWQgYnkgY29tbWFzLCBlZzotIC0tc2VydmVyPWNwcCxqYXZhJykKLSAgcGFyc2VyLmFkZF9vcHRpb24oJy0tY2xpZW50JywgdHlwZT0nc3RyaW5nJywgZGVzdD0nY2xpZW50cycsIGRlZmF1bHQ9JycsCi0gICAgICAgICAgICAgICAgICAgIGhlbHA9J2xpc3Qgb2YgY2xpZW50cyB0byB0ZXN0IHNlcGFyYXRlZCBieSBjb21tYXMsIGVnOi0gLS1jbGllbnQ9Y3BwLGphdmEnKQotICBwYXJzZXIuYWRkX29wdGlvbignLXMnLCAnLS1za2lwLWtub3duLWZhaWx1cmVzJywgYWN0aW9uPSdzdG9yZV90cnVlJywgZGVzdD0nc2tpcF9rbm93bl9mYWlsdXJlcycsCi0gICAgICAgICAgICAgICAgICAgIGhlbHA9J2RvIG5vdCBleGVjdXRlIHRlc3RzIHRoYXQgYXJlIGtub3duIHRvIGZhaWwnKQotICBwYXJzZXIuYWRkX29wdGlvbignLWonLCAnLS1qb2JzJywgdHlwZT0naW50JywgZGVzdD0nam9icycsCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9ZGVmYXVsdF9jb25jdXJyZW50eSgpLAotICAgICAgICAgICAgICAgICAgICBoZWxwPSdudW1iZXIgb2YgY29uY3VycmVudCB0ZXN0IGV4ZWN1dGlvbnMnKQotICBnID0gb3B0cGFyc2UuT3B0aW9uR3JvdXAocGFyc2VyLCAnQWR2YW5jZWQnKQotICBnLmFkZF9vcHRpb24oJy12JywgJy0tdmVyYm9zZScsIGFjdGlvbj0nc3RvcmVfY29uc3QnLAotICAgICAgICAgICAgICAgZGVzdD0nbG9nX2xldmVsJywgY29uc3Q9bG9nZ2luZy5ERUJVRywgZGVmYXVsdD1sb2dnaW5nLldBUk5JTkcsCi0gICAgICAgICAgICAgICBoZWxwPSdzaG93IGRlYnVnIG91dHB1dCBmb3IgdGVzdCBydW5uZXInKQotICBnLmFkZF9vcHRpb24oJy1QJywgJy0tcHJpbnQtZXhwZWN0ZWQtZmFpbHVyZXMnLCBjaG9pY2VzPVsnbWVyZ2UnLCAnb3ZlcndyaXRlJ10sCi0gICAgICAgICAgICAgICBkZXN0PSdwcmludF9mYWlsdXJlcycsIGRlZmF1bHQ9Tm9uZSwKLSAgICAgICAgICAgICAgIGhlbHA9ImdlbmVyYXRlIGV4cGVjdGVkIGZhaWx1cmVzIGJhc2VkIG9uIGxhc3QgcmVzdWx0IGFuZCBwcmludCB0byBzdGRvdXQiKQotICBnLmFkZF9vcHRpb24oJy1VJywgJy0tdXBkYXRlLWV4cGVjdGVkLWZhaWx1cmVzJywgY2hvaWNlcz1bJ21lcmdlJywgJ292ZXJ3cml0ZSddLAotICAgICAgICAgICAgICAgZGVzdD0ndXBkYXRlX2ZhaWx1cmVzJywgZGVmYXVsdD1Ob25lLAotICAgICAgICAgICAgICAgaGVscD0iZ2VuZXJhdGUgZXhwZWN0ZWQgZmFpbHVyZXMgYmFzZWQgb24gbGFzdCByZXN1bHQgYW5kIHNhdmUgdG8gZGVmYXVsdCBmaWxlIGxvY2F0aW9uIikKLSAgZy5hZGRfb3B0aW9uKCctLXByZXBhcmUnLCBhY3Rpb249J3N0b3JlX3RydWUnLAotICAgICAgICAgICAgICAgZGVzdD0ncHJlcGFyZScsCi0gICAgICAgICAgICAgICBoZWxwPSJ0cnkgdG8gcHJlcGFyZSBmaWxlcyBuZWVkZWQgZm9yIGNyb3NzIHRlc3QgKGV4cGVyaW1lbnRhbCkiKQotICBwYXJzZXIuYWRkX29wdGlvbl9ncm91cChnKQotICBsb2dnZXIgPSBtdWx0aXByb2Nlc3NpbmcubG9nX3RvX3N0ZGVycigpCi0gIG9wdGlvbnMsIF8gPSBwYXJzZXIucGFyc2VfYXJncyhhcmd2KQotICBzZXJ2ZXJfbWF0Y2ggPSBvcHRpb25zLnNlcnZlcnMuc3BsaXQoJywnKSBpZiBvcHRpb25zLnNlcnZlcnMgZWxzZSBbXQotICBjbGllbnRfbWF0Y2ggPSBvcHRpb25zLmNsaWVudHMuc3BsaXQoJywnKSBpZiBvcHRpb25zLmNsaWVudHMgZWxzZSBbXQotICBsb2dnZXIuc2V0TGV2ZWwob3B0aW9ucy5sb2dfbGV2ZWwpCisgICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tc2VydmVyJywgZGVmYXVsdD0nJywgbmFyZ3M9JyonLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nbGlzdCBvZiBzZXJ2ZXJzIHRvIHRlc3QnKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tY2xpZW50JywgZGVmYXVsdD0nJywgbmFyZ3M9JyonLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nbGlzdCBvZiBjbGllbnRzIHRvIHRlc3QnKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy1GJywgJy0tZmVhdHVyZXMnLCBuYXJncz0nKicsIGRlZmF1bHQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3J1biBzZXJ2ZXIgZmVhdHVyZSB0ZXN0cyBpbnN0ZWFkIG9mIGNyb3NzIGxhbmd1YWdlIHRlc3RzJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctUicsICctLXJlZ2V4JywgaGVscD0ndGVzdCBuYW1lIHBhdHRlcm4gdG8gcnVuJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctbycsICctLW9ubHkta25vd25fZmFpbHVyZXMnLCBhY3Rpb249J3N0b3JlX3RydWUnLCBkZXN0PSdvbmx5X2tub3duX2ZhaWx1cmVzJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J29ubHkgZXhlY3V0ZSB0ZXN0cyB0aGF0IGFyZSBrbm93biB0byBmYWlsJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctcycsICctLXNraXAta25vd24tZmFpbHVyZXMnLCBhY3Rpb249J3N0b3JlX3RydWUnLCBkZXN0PSdza2lwX2tub3duX2ZhaWx1cmVzJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2RvIG5vdCBleGVjdXRlIHRlc3RzIHRoYXQgYXJlIGtub3duIHRvIGZhaWwnKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy1yJywgJy0tcmV0cnktY291bnQnLCB0eXBlPWludCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9MCwgaGVscD0nbWF4aW11bSByZXRyeSBvbiBmYWlsdXJlJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctaicsICctLWpvYnMnLCB0eXBlPWludCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9ZGVmYXVsdF9jb25jdXJyZW50eSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nbnVtYmVyIG9mIGNvbmN1cnJlbnQgdGVzdCBleGVjdXRpb25zJykKIAotICBpZiBvcHRpb25zLnByZXBhcmU6Ci0gICAgcmVzID0gcHJlcGFyZShzZXJ2ZXJfbWF0Y2gsIGNsaWVudF9tYXRjaCkKLSAgZWxpZiBvcHRpb25zLnVwZGF0ZV9mYWlsdXJlcyBvciBvcHRpb25zLnByaW50X2ZhaWx1cmVzOgotICAgIHJlcyA9IGNyb3NzcnVubmVyLmdlbmVyYXRlX2tub3duX2ZhaWx1cmVzKAotICAgICAgICBURVNUX0RJUiwgb3B0aW9ucy51cGRhdGVfZmFpbHVyZXMgPT0gJ292ZXJ3cml0ZScsCi0gICAgICAgIG9wdGlvbnMudXBkYXRlX2ZhaWx1cmVzLCBvcHRpb25zLnByaW50X2ZhaWx1cmVzKQotICBlbHNlOgotICAgIHJlcyA9IHJ1bl90ZXN0cyhzZXJ2ZXJfbWF0Y2gsIGNsaWVudF9tYXRjaCwgb3B0aW9ucy5qb2JzLCBvcHRpb25zLnNraXBfa25vd25fZmFpbHVyZXMpCi0gIHJldHVybiAwIGlmIHJlcyBlbHNlIDEKKyAgICBnID0gcGFyc2VyLmFkZF9hcmd1bWVudF9ncm91cCh0aXRsZT0nQWR2YW5jZWQnKQorICAgIGcuYWRkX2FyZ3VtZW50KCctdicsICctLXZlcmJvc2UnLCBhY3Rpb249J3N0b3JlX2NvbnN0JywKKyAgICAgICAgICAgICAgICAgICBkZXN0PSdsb2dfbGV2ZWwnLCBjb25zdD1sb2dnaW5nLkRFQlVHLCBkZWZhdWx0PWxvZ2dpbmcuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICBoZWxwPSdzaG93IGRlYnVnIG91dHB1dCBmb3IgdGVzdCBydW5uZXInKQorICAgIGcuYWRkX2FyZ3VtZW50KCctUCcsICctLXByaW50LWV4cGVjdGVkLWZhaWx1cmVzJywgY2hvaWNlcz1bJ21lcmdlJywgJ292ZXJ3cml0ZSddLAorICAgICAgICAgICAgICAgICAgIGRlc3Q9J3ByaW50X2ZhaWx1cmVzJywKKyAgICAgICAgICAgICAgICAgICBoZWxwPSJnZW5lcmF0ZSBleHBlY3RlZCBmYWlsdXJlcyBiYXNlZCBvbiBsYXN0IHJlc3VsdCBhbmQgcHJpbnQgdG8gc3Rkb3V0IikKKyAgICBnLmFkZF9hcmd1bWVudCgnLVUnLCAnLS11cGRhdGUtZXhwZWN0ZWQtZmFpbHVyZXMnLCBjaG9pY2VzPVsnbWVyZ2UnLCAnb3ZlcndyaXRlJ10sCisgICAgICAgICAgICAgICAgICAgZGVzdD0ndXBkYXRlX2ZhaWx1cmVzJywKKyAgICAgICAgICAgICAgICAgICBoZWxwPSJnZW5lcmF0ZSBleHBlY3RlZCBmYWlsdXJlcyBiYXNlZCBvbiBsYXN0IHJlc3VsdCBhbmQgc2F2ZSB0byBkZWZhdWx0IGZpbGUgbG9jYXRpb24iKQorICAgIG9wdGlvbnMgPSBwYXJzZXIucGFyc2VfYXJncyhhcmd2KQorCisgICAgbG9nZ2VyID0gbXVsdGlwcm9jZXNzaW5nLmxvZ190b19zdGRlcnIoKQorICAgIGxvZ2dlci5zZXRMZXZlbChvcHRpb25zLmxvZ19sZXZlbCkKKworICAgIGlmIG9wdGlvbnMuZmVhdHVyZXMgaXMgbm90IE5vbmUgYW5kIG9wdGlvbnMuY2xpZW50OgorICAgICAgICBwcmludCgnQ2Fubm90IHNwZWNpZnkgYm90aCAtLWZlYXR1cmVzIGFuZCAtLWNsaWVudCAnLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgIHJldHVybiAxCisKKyAgICAjIEFsbG93IG11bHRpcGxlIGFyZ3Mgc2VwYXJhdGVkIHdpdGggJywnIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CisgICAgc2VydmVyX21hdGNoID0gbGlzdChjaGFpbigqW3guc3BsaXQoJywnKSBmb3IgeCBpbiBvcHRpb25zLnNlcnZlcl0pKQorICAgIGNsaWVudF9tYXRjaCA9IGxpc3QoY2hhaW4oKlt4LnNwbGl0KCcsJykgZm9yIHggaW4gb3B0aW9ucy5jbGllbnRdKSkKKworICAgIGlmIG9wdGlvbnMudXBkYXRlX2ZhaWx1cmVzIG9yIG9wdGlvbnMucHJpbnRfZmFpbHVyZXM6CisgICAgICAgIGRpcmUgPSBwYXRoX2pvaW4oUk9PVF9ESVIsIEZFQVRVUkVfRElSX1JFTEFUSVZFKSBpZiBvcHRpb25zLmZlYXR1cmVzIGlzIG5vdCBOb25lIGVsc2UgVEVTVF9ESVIKKyAgICAgICAgcmVzID0gY3Jvc3NydW5uZXIuZ2VuZXJhdGVfa25vd25fZmFpbHVyZXMoCisgICAgICAgICAgICBkaXJlLCBvcHRpb25zLnVwZGF0ZV9mYWlsdXJlcyA9PSAnb3ZlcndyaXRlJywKKyAgICAgICAgICAgIG9wdGlvbnMudXBkYXRlX2ZhaWx1cmVzLCBvcHRpb25zLnByaW50X2ZhaWx1cmVzKQorICAgIGVsaWYgb3B0aW9ucy5mZWF0dXJlcyBpcyBub3QgTm9uZToKKyAgICAgICAgZmVhdHVyZXMgPSBvcHRpb25zLmZlYXR1cmVzIG9yIFsnLionXQorICAgICAgICByZXMgPSBydW5fZmVhdHVyZV90ZXN0cyhzZXJ2ZXJfbWF0Y2gsIGZlYXR1cmVzLCBvcHRpb25zLmpvYnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuc2tpcF9rbm93bl9mYWlsdXJlcywgb3B0aW9ucy5vbmx5X2tub3duX2ZhaWx1cmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnJldHJ5X2NvdW50LCBvcHRpb25zLnJlZ2V4KQorICAgIGVsc2U6CisgICAgICAgIHJlcyA9IHJ1bl9jcm9zc190ZXN0cyhzZXJ2ZXJfbWF0Y2gsIGNsaWVudF9tYXRjaCwgb3B0aW9ucy5qb2JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5za2lwX2tub3duX2ZhaWx1cmVzLCBvcHRpb25zLm9ubHlfa25vd25fZmFpbHVyZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnJldHJ5X2NvdW50LCBvcHRpb25zLnJlZ2V4KQorICAgIHJldHVybiAwIGlmIHJlcyBlbHNlIDEKKwogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICBzeXMuZXhpdChtYWluKHN5cy5hcmd2WzE6XSkpCisgICAgc3lzLmV4aXQobWFpbihzeXMuYXJndlsxOl0pKQpkaWZmIC0tZ2l0IGEvdGVzdC90ZXN0cy5qc29uIGIvdGVzdC90ZXN0cy5qc29uCmluZGV4IGNiMmYwZTIuLjQzZDZkZWQgMTAwNjQ0Ci0tLSBhL3Rlc3QvdGVzdHMuanNvbgorKysgYi90ZXN0L3Rlc3RzLmpzb24KQEAgLTUsMTQgKzUsMjYgQEAKICAgICAgICJMaW51eCIKICAgICBdLAogICAgICJzZXJ2ZXIiOiB7Ci0gICAgICAiZGVsYXkiOiAxLAogICAgICAgImNvbW1hbmQiOiBbCi0gICAgICAgICJ0ZXN0X3NlcnZlciIKKyAgICAgICAgInRlc3Rfc2VydmVyIiwKKyAgICAgICAgIi0tbHQtZGVidWciCisgICAgICBdLAorICAgICAgInByb3RvY29scyI6IFsKKyAgICAgICAgImJpbmFyeTptdWx0aSIsCisgICAgICAgICJjb21wYWN0Om11bHRpYyIKICAgICAgIF0KICAgICB9LAogICAgICJjbGllbnQiOiB7CiAgICAgICAiY29tbWFuZCI6IFsKLSAgICAgICAgInRlc3RfY2xpZW50IgorICAgICAgICAidGVzdF9jbGllbnQiLAorICAgICAgICAiLS1sdC1kZWJ1ZyIKKyAgICAgIF0sCisgICAgICAicHJvdG9jb2xzIjogWworICAgICAgICAibXVsdGk6YmluYXJ5IiwKKyAgICAgICAgIm11bHRpYzpjb21wYWN0IgorICAgICAgXSwKKyAgICAgICJzb2NrZXRzIjogWworICAgICAgICAiaXAtc3NsIgogICAgICAgXQogICAgIH0sCiAgICAgInRyYW5zcG9ydHMiOiBbCkBAIC0yMywxNCArMzUsNjIgQEAKICAgICAgICJpcCIKICAgICBdLAogICAgICJwcm90b2NvbHMiOiBbCi0gICAgICAiYmluYXJ5IgorICAgICAgImJpbmFyeSIsCisgICAgICAiY29tcGFjdCIsCisgICAgICAibXVsdGkiLAorICAgICAgIm11bHRpYyIKICAgICBdLAogICAgICJ3b3JrZGlyIjogImNfZ2xpYiIKICAgfSwKICAgeworICAgICJuYW1lIjogImNsIiwKKyAgICAic2VydmVyIjogeworICAgICAgImNvbW1hbmQiOiBbIlRlc3RTZXJ2ZXIiXSwKKyAgICAgICJ3b3JrZGlyIjogImNsIiwKKyAgICAgICJwcm90b2NvbHMiOiBbImJpbmFyeSIsICJtdWx0aSJdLAorICAgICAgInRyYW5zcG9ydHMiOiBbImJ1ZmZlcmVkIiwgImZyYW1lZCJdLAorICAgICAgInNvY2tldHMiOiBbImlwIl0KKyAgICB9LAorICAgICJjbGllbnQiOiB7CisgICAgICAiY29tbWFuZCI6IFsiVGVzdENsaWVudCJdLAorICAgICAgIndvcmtkaXIiOiAiY2wiLAorICAgICAgInByb3RvY29scyI6IFsiYmluYXJ5IiwgIm11bHRpIl0sCisgICAgICAidHJhbnNwb3J0cyI6IFsiYnVmZmVyZWQiLCAiZnJhbWVkIl0sCisgICAgICAic29ja2V0cyI6IFsiaXAiXQorICAgIH0KKyAgfSwKKyAgeworICAgICJuYW1lIjogImQiLAorICAgICJzZXJ2ZXIiOiB7CisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgInRocmlmdF90ZXN0X3NlcnZlciIsCisgICAgICAgICItLXRyYWNlIgorICAgICAgXQorICAgIH0sCisgICAgImNsaWVudCI6IHsKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAidGhyaWZ0X3Rlc3RfY2xpZW50IgorICAgICAgXQorICAgIH0sCisgICAgInRyYW5zcG9ydHMiOiBbCisgICAgICAiaHR0cCIsCisgICAgICAiYnVmZmVyZWQiLAorICAgICAgImZyYW1lZCIKKyAgICBdLAorICAgICJzb2NrZXRzIjogWworICAgICAgImlwIiwKKyAgICAgICJpcC1zc2wiCisgICAgXSwKKyAgICAicHJvdG9jb2xzIjogWworICAgICAgImJpbmFyeSIsCisgICAgICAiY29tcGFjdCIsCisgICAgICAianNvbiIKKyAgICBdLAorICAgICJ3b3JrZGlyIjogIi4uL2xpYi9kL3Rlc3QiCisgIH0sCisgIHsKICAgICAibmFtZSI6ICJnbyIsCiAgICAgInNlcnZlciI6IHsKLSAgICAgICJkZWxheSI6IDEsCiAgICAgICAiY29tbWFuZCI6IFsKICAgICAgICAgInRlc3RzZXJ2ZXIiLAogICAgICAgICAiLS1jZXJ0UGF0aD0uLi8uLi9rZXlzIgpAQCAtNDQsNyArMTA0LDkgQEAKICAgICB9LAogICAgICJ0cmFuc3BvcnRzIjogWwogICAgICAgImJ1ZmZlcmVkIiwKLSAgICAgICJmcmFtZWQiCisgICAgICAiZnJhbWVkIiwKKyAgICAgICJodHRwIiwKKyAgICAgICJ6bGliIgogICAgIF0sCiAgICAgInNvY2tldHMiOiBbCiAgICAgICAiaXAiLApAQCAtNTksMjkgKzEyMSwzMCBAQAogICB9LAogICB7CiAgICAgIm5hbWUiOiAiamF2YSIsCi0gICAgImpvaW5fYXJncyI6IHRydWUsCi0gICAgImNvbW1hbmQiOiBbCi0gICAgICAiYW50IiwKLSAgICAgICItZiIsCi0gICAgICAiYnVpbGQueG1sIiwKLSAgICAgICItRG5vLWdlbi10aHJpZnQ9XCJcIiIsCi0gICAgICAiLUR0ZXN0YXJncyIKLSAgICBdLAotICAgICJwcmVwYXJlIjogWwotICAgICAgImFudCIsCi0gICAgICAiLWYiLAotICAgICAgImJ1aWxkLnhtbCIsCi0gICAgICAiY29tcGlsZS10ZXN0IgotICAgIF0sCisgICAgImpvaW5fYXJncyI6IGZhbHNlLAogICAgICJzZXJ2ZXIiOiB7Ci0gICAgICAiZGVsYXkiOiA1LAotICAgICAgImV4dHJhX2FyZ3MiOiBbInJ1bi10ZXN0c2VydmVyIl0KKyAgICAgICJkZWxheSI6IDE1LAorICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJidWlsZC9ydW5zZXJ2ZXIiCisgICAgICBdLAorICAgICAgInByb3RvY29scyI6IFsKKyAgICAgICAgImJpbmFyeTptdWx0aSIsCisgICAgICAgICJjb21wYWN0Om11bHRpYyIsCisgICAgICAgICJqc29uOm11bHRpaiIKKyAgICAgIF0KICAgICB9LAogICAgICJjbGllbnQiOiB7CiAgICAgICAidGltZW91dCI6IDEzLAotICAgICAgImV4dHJhX2FyZ3MiOiBbInJ1bi10ZXN0Y2xpZW50Il0sCisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgImJ1aWxkL3J1bmNsaWVudCIKKyAgICAgIF0sCiAgICAgICAidHJhbnNwb3J0cyI6IFsKICAgICAgICAgImh0dHAiCisgICAgICBdLAorICAgICAgInByb3RvY29scyI6IFsKKyAgICAgICAgIm11bHRpOmJpbmFyeSIsCisgICAgICAgICJtdWx0aWM6Y29tcGFjdCIsCisgICAgICAgICJtdWx0aWo6anNvbiIKICAgICAgIF0KICAgICB9LAogICAgICJ0cmFuc3BvcnRzIjogWwpAQCAtOTAsMTMgKzE1MywxNiBAQAogICAgICAgImZyYW1lZDpmYXN0ZnJhbWVkIgogICAgIF0sCiAgICAgInNvY2tldHMiOiBbCi0gICAgICAiaXAtc3NsIiwKLSAgICAgICJpcCIKKyAgICAgICJpcCIsCisgICAgICAiaXAtc3NsIgogICAgIF0sCiAgICAgInByb3RvY29scyI6IFsKLSAgICAgICJjb21wYWN0IiwKICAgICAgICJiaW5hcnkiLAotICAgICAgImpzb24iCisgICAgICAiY29tcGFjdCIsCisgICAgICAianNvbiIsCisgICAgICAibXVsdGkiLAorICAgICAgIm11bHRpYyIsCisgICAgICAibXVsdGlqIgogICAgIF0sCiAgICAgIndvcmtkaXIiOiAiLi4vbGliL2phdmEiCiAgIH0sCkBAIC0xMDYsNyArMTcyLDYgQEAKICAgICAgICJOT0RFX1BBVEgiOiAiLi4vbGliIgogICAgIH0sCiAgICAgInNlcnZlciI6IHsKLSAgICAgICJkZWxheSI6IDEsCiAgICAgICAiY29tbWFuZCI6IFsKICAgICAgICAgIm5vZGUiLAogICAgICAgICAic2VydmVyLmpzIiwKQEAgLTExNCw3ICsxNzksNyBAQAogICAgICAgXQogICAgIH0sCiAgICAgImNsaWVudCI6IHsKLSAgICAgICJ0aW1lb3V0IjogMi45LAorICAgICAgInRpbWVvdXQiOiA2LAogICAgICAgImNvbW1hbmQiOiBbCiAgICAgICAgICJub2RlIiwKICAgICAgICAgImNsaWVudC5qcyIsCkBAIC0xMjMsMTEgKzE4OCwxMyBAQAogICAgIH0sCiAgICAgInRyYW5zcG9ydHMiOiBbCiAgICAgICAiYnVmZmVyZWQiLAotICAgICAgImZyYW1lZCIKKyAgICAgICJmcmFtZWQiLAorICAgICAgImh0dHAiCiAgICAgXSwKICAgICAic29ja2V0cyI6IFsKKyAgICAgICJpcCIsCiAgICAgICAiaXAtc3NsIiwKLSAgICAgICJpcCIKKyAgICAgICJkb21haW4iCiAgICAgXSwKICAgICAicHJvdG9jb2xzIjogWwogICAgICAgImNvbXBhY3QiLApAQCAtMTYwLDYgKzIyNyw3IEBACiAgICAgICAiaXAiCiAgICAgXSwKICAgICAicHJvdG9jb2xzIjogWworICAgICAgImhlYWRlciIsCiAgICAgICAiY29tcGFjdCIsCiAgICAgICAiYmluYXJ5IiwKICAgICAgICJqc29uIgpAQCAtMTY5LDcgKzIzNyw2IEBACiAgIHsKICAgICAibmFtZSI6ICJweSIsCiAgICAgInNlcnZlciI6IHsKLSAgICAgICJkZWxheSI6IDEsCiAgICAgICAiZXh0cmFfYXJncyI6IFsiVFNpbXBsZVNlcnZlciJdLAogICAgICAgImNvbW1hbmQiOiBbCiAgICAgICAgICJUZXN0U2VydmVyLnB5IiwKQEAgLTE4MSw2MSArMjQ4LDEzNyBAQAogICAgICAgInRpbWVvdXQiOiAxMCwKICAgICAgICJjb21tYW5kIjogWwogICAgICAgICAiVGVzdENsaWVudC5weSIsCisgICAgICAgICItLXZlcmJvc2UiLAogICAgICAgICAiLS1ob3N0PWxvY2FsaG9zdCIsCiAgICAgICAgICItLWdlbnB5ZGlyPWdlbi1weSIKKyAgICAgIF0sCisgICAgICAicHJvdG9jb2xzIjogWworICAgICAgICAibXVsdGkiLAorICAgICAgICAibXVsdGk6bXVsdGlhIiwKKyAgICAgICAgIm11bHRpYyIsCisgICAgICAgICJtdWx0aWM6bXVsdGlhYyIsCisgICAgICAgICJtdWx0aWoiCiAgICAgICBdCiAgICAgfSwKICAgICAidHJhbnNwb3J0cyI6IFsKICAgICAgICJidWZmZXJlZCIsCi0gICAgICAiZnJhbWVkIgorICAgICAgImZyYW1lZCIsCisgICAgICAiaHR0cCIsCisgICAgICAiemxpYiIKICAgICBdLAogICAgICJzb2NrZXRzIjogWwotICAgICAgImlwLXNzbCIsCi0gICAgICAiaXAiCisgICAgICAiaXAiLAorICAgICAgImlwLXNzbCIKICAgICBdLAogICAgICJwcm90b2NvbHMiOiBbCiAgICAgICAiY29tcGFjdCIsCiAgICAgICAiYmluYXJ5IiwKICAgICAgICJqc29uIiwKLSAgICAgICJiaW5hcnk6YWNjZWwiCisgICAgICAiYmluYXJ5OmFjY2VsIiwKKyAgICAgICJjb21wYWN0OmFjY2VsYyIsCisgICAgICAiaGVhZGVyIgorICAgIF0sCisgICAgIndvcmtkaXIiOiAicHkiCisgIH0sCisgIHsKKyAgICAiY29tbWVudCI6ICJVc2luZyAncHl0aG9uMycgZXhlY3V0YWJsZSB0byB0ZXN0IHB5MiBhbmQgMyBhdCBvbmNlIiwKKyAgICAibmFtZSI6ICJweTMiLAorICAgICJzZXJ2ZXIiOiB7CisgICAgICAiZXh0cmFfYXJncyI6IFsiVFNpbXBsZVNlcnZlciJdLAorICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJweXRob24zIiwKKyAgICAgICAgIlRlc3RTZXJ2ZXIucHkiLAorICAgICAgICAiLS12ZXJib3NlIiwKKyAgICAgICAgIi0tZ2VucHlkaXI9Z2VuLXB5IgorICAgICAgXQorICAgIH0sCisgICAgImNsaWVudCI6IHsKKyAgICAgICJ0aW1lb3V0IjogMTAsCisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgInB5dGhvbjMiLAorICAgICAgICAiVGVzdENsaWVudC5weSIsCisgICAgICAgICItLWhvc3Q9bG9jYWxob3N0IiwKKyAgICAgICAgIi0tZ2VucHlkaXI9Z2VuLXB5IgorICAgICAgXSwKKyAgICAgICJwcm90b2NvbHMiOiBbCisgICAgICAgICJtdWx0aSIsCisgICAgICAgICJtdWx0aTptdWx0aWEiLAorICAgICAgICAibXVsdGljIiwKKyAgICAgICAgIm11bHRpYzptdWx0aWFjIiwKKyAgICAgICAgIm11bHRpaiIKKyAgICAgIF0KKyAgICB9LAorICAgICJ0cmFuc3BvcnRzIjogWworICAgICAgImJ1ZmZlcmVkIiwKKyAgICAgICJmcmFtZWQiLAorICAgICAgImh0dHAiLAorICAgICAgInpsaWIiCisgICAgXSwKKyAgICAic29ja2V0cyI6IFsKKyAgICAgICJpcCIsCisgICAgICAiaXAtc3NsIgorICAgIF0sCisgICAgInByb3RvY29scyI6IFsKKyAgICAgICJjb21wYWN0IiwKKyAgICAgICJiaW5hcnkiLAorICAgICAgImpzb24iLAorICAgICAgImJpbmFyeTphY2NlbCIsCisgICAgICAiY29tcGFjdDphY2NlbGMiLAorICAgICAgImhlYWRlciIKICAgICBdLAogICAgICJ3b3JrZGlyIjogInB5IgogICB9LAogICB7CiAgICAgIm5hbWUiOiAiY3BwIiwKICAgICAic2VydmVyIjogewotICAgICAgImRlbGF5IjogMiwKICAgICAgICJjb21tYW5kIjogWwogICAgICAgICAiVGVzdFNlcnZlciIKKyAgICAgIF0sCisgICAgICAicHJvdG9jb2xzIjogWworICAgICAgICAiYmluYXJ5Om11bHRpIiwKKyAgICAgICAgImNvbXBhY3Q6bXVsdGljIiwKKyAgICAgICAgImhlYWRlcjptdWx0aWgiLAorICAgICAgICAianNvbjptdWx0aWoiCiAgICAgICBdCiAgICAgfSwKICAgICAiY2xpZW50IjogewogICAgICAgInRpbWVvdXQiOiA4LAogICAgICAgImNvbW1hbmQiOiBbCiAgICAgICAgICJUZXN0Q2xpZW50IgorICAgICAgXSwKKyAgICAgICJwcm90b2NvbHMiOiBbCisgICAgICAgICJtdWx0aTpiaW5hcnkiLAorICAgICAgICAibXVsdGljOmNvbXBhY3QiLAorICAgICAgICAibXVsdGloOmhlYWRlciIsCisgICAgICAgICJtdWx0aWo6anNvbiIKICAgICAgIF0KICAgICB9LAogICAgICJ0cmFuc3BvcnRzIjogWwogICAgICAgImJ1ZmZlcmVkIiwKICAgICAgICJodHRwIiwKLSAgICAgICJmcmFtZWQiCisgICAgICAiZnJhbWVkIiwKKyAgICAgICJ6bGliIgogICAgIF0sCiAgICAgInNvY2tldHMiOiBbCi0gICAgICAiaXAtc3NsIiwKICAgICAgICJpcCIsCisgICAgICAiaXAtc3NsIiwKICAgICAgICJkb21haW4iCiAgICAgXSwKICAgICAicHJvdG9jb2xzIjogWwogICAgICAgImNvbXBhY3QiLAogICAgICAgImJpbmFyeSIsCi0gICAgICAianNvbiIKKyAgICAgICJqc29uIiwKKyAgICAgICJoZWFkZXIiLAorICAgICAgIm11bHRpIiwKKyAgICAgICJtdWx0aWMiLAorICAgICAgIm11bHRpaCIsCisgICAgICAibXVsdGlqIgogICAgIF0sCiAgICAgIndvcmtkaXIiOiAiY3BwIgogICB9LAogICB7CiAgICAgIm5hbWUiOiAicmIiLAogICAgICJzZXJ2ZXIiOiB7Ci0gICAgICAiZGVsYXkiOiAxLAogICAgICAgImNvbW1hbmQiOiBbCiAgICAgICAgICJydWJ5IiwKICAgICAgICAgIi4uL2ludGVncmF0aW9uL1Rlc3RTZXJ2ZXIucmIiCkBAIC0yNDYsNyArMzg5LDcgQEAKICAgICAgICJjb21tYW5kIjogWwogICAgICAgICAicnVieSIsCiAgICAgICAgICIuLi9pbnRlZ3JhdGlvbi9UZXN0Q2xpZW50LnJiIiwKLSAgICAgICAgIi0taG9zdD0xMjcuMC4wLjEiCisgICAgICAgICItLSIKICAgICAgIF0KICAgICB9LAogICAgICJ0cmFuc3BvcnRzIjogWwpAQCAtMjU0LDIwICszOTcsMjIgQEAKICAgICAgICJmcmFtZWQiCiAgICAgXSwKICAgICAic29ja2V0cyI6IFsKLSAgICAgICJpcCIKKyAgICAgICJkb21haW4iLAorICAgICAgImlwIiwKKyAgICAgICJpcC1zc2wiCiAgICAgXSwKICAgICAicHJvdG9jb2xzIjogWwotICAgICAgImNvbXBhY3QiLAogICAgICAgImJpbmFyeSIsCi0gICAgICAianNvbiIsCi0gICAgICAiYmluYXJ5OmFjY2VsIgorICAgICAgImJpbmFyeTphY2NlbCIsCisgICAgICAiY29tcGFjdCIsCisgICAgICAianNvbiIKICAgICBdLAogICAgICJ3b3JrZGlyIjogInJiL2dlbi1yYiIKICAgfSwKICAgewogICAgICJuYW1lIjogImNzaGFycCIsCiAgICAgImVudiI6IHsKLSAgICAgICJNT05PX1BBVEgiOiAiLi4vLi4iCisgICAgICAiTU9OT19QQVRIIjogIi4uLy4uL2xpYi9jc2hhcnAvIgogICAgIH0sCiAgICAgInRyYW5zcG9ydHMiOiBbCiAgICAgICAiYnVmZmVyZWQiLApAQCAtMjgzLDI1ICs0MjgsMzAgQEAKICAgICAgICJqc29uIgogICAgIF0sCiAgICAgInNlcnZlciI6IHsKLSAgICAgICJkZWxheSI6IDMsCiAgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgIm1vbm8iLAogICAgICAgICAiVGVzdENsaWVudFNlcnZlci5leGUiLAotICAgICAgICAic2VydmVyIiwKLSAgICAgICAgIi0tY2VydD0uLi8uLi8uLi8uLi90ZXN0L2tleXMvc2VydmVyLnBlbSIKKyAgICAgICAgInNlcnZlciIKICAgICAgIF0KICAgICB9LAogICAgICJjbGllbnQiOiB7CiAgICAgICAidGltZW91dCI6IDksCiAgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgIm1vbm8iLAogICAgICAgICAiVGVzdENsaWVudFNlcnZlci5leGUiLAotICAgICAgICAiY2xpZW50IiwKLSAgICAgICAgIi0tY2VydD0uLi8uLi8uLi8uLi90ZXN0L2tleXMvY2xpZW50LnBlbSIKKyAgICAgICAgImNsaWVudCIKKyAgICAgIF0sCisgICAgICAicHJvdG9jb2xzIjogWworICAgICAgICAibXVsdGkiLAorICAgICAgICAibXVsdGljIiwKKyAgICAgICAgIm11bHRpOmJpbmFyeSIsCisgICAgICAgICJtdWx0aWM6Y29tcGFjdCIKICAgICAgIF0KICAgICB9LAotICAgICJ3b3JrZGlyIjogIi4uL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRUZXN0IgorICAgICJ3b3JrZGlyIjogImNzaGFycCIKICAgfSwKICAgewotICAgICJuYW1lIjogInBlcmwiLAorICAgICJuYW1lIjogIm5ldGNvcmUiLAogICAgICJ0cmFuc3BvcnRzIjogWwogICAgICAgImJ1ZmZlcmVkIiwKICAgICAgICJmcmFtZWQiCkBAIC0zMTEsNyArNDYxLDQ1IEBACiAgICAgICAiaXAtc3NsIgogICAgIF0sCiAgICAgInByb3RvY29scyI6IFsKLSAgICAgICJiaW5hcnkiCisgICAgICAiYmluYXJ5IiwKKyAgICAgICJjb21wYWN0IiwKKyAgICAgICJqc29uIgorICAgIF0sCisgICAgInNlcnZlciI6IHsKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAiZG90bmV0IiwKKyAgICAgICAgInJ1biIsCisgICAgICAgICItLW5vLWJ1aWxkIiwKKyAgICAgICAgIi0tcHJvamVjdD1TZXJ2ZXIvU2VydmVyLmNzcHJvaiIsCisgICAgICAgICJzZXJ2ZXIiCisgICAgICBdCisgICAgfSwKKyAgICAiY2xpZW50IjogeworICAgICAgInRpbWVvdXQiOiAxMCwKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAiZG90bmV0IiwKKyAgICAgICAgInJ1biIsCisgICAgICAgICItLW5vLWJ1aWxkIiwKKyAgICAgICAgIi0tcHJvamVjdD1DbGllbnQvQ2xpZW50LmNzcHJvaiIsCisgICAgICAgICJjbGllbnQiCisgICAgICBdCisgICAgfSwKKyAgICAgICAgIndvcmtkaXIiOiAibmV0Y29yZSIKKyAgfSwKKyAgeworICAgICJuYW1lIjogInBlcmwiLAorICAgICJ0cmFuc3BvcnRzIjogWworICAgICAgImJ1ZmZlcmVkIiwKKyAgICAgICJmcmFtZWQiCisgICAgXSwKKyAgICAic29ja2V0cyI6IFsKKyAgICAgICJpcCIsCisgICAgICAiaXAtc3NsIiwKKyAgICAgICJkb21haW4iCisgICAgXSwKKyAgICAicHJvdG9jb2xzIjogWworICAgICAgImJpbmFyeSIsCisgICAgICAibXVsdGkiCiAgICAgXSwKICAgICAiY2xpZW50IjogewogICAgICAgImNvbW1hbmQiOiBbCkBAIC0zMTksNyArNTA3LDEyIEBACiAgICAgICAgICItSWdlbi1wZXJsLyIsCiAgICAgICAgICItSS4uLy4uL2xpYi9wZXJsL2xpYi8iLAogICAgICAgICAiVGVzdENsaWVudC5wbCIsCi0gICAgICAgICItLWNlcnQ9Li4vLi4vdGVzdC9rZXlzL2NsaWVudC5wZW0iCisgICAgICAgICItLWNhPS4uL2tleXMvQ0EucGVtIiwKKyAgICAgICAgIi0tY2VydD0uLi9rZXlzL2NsaWVudC5jcnQiLAorICAgICAgICAiLS1rZXk9Li4va2V5cy9jbGllbnQua2V5IgorICAgICAgXSwKKyAgICAgICJwcm90b2NvbHMiOiBbCisgICAgICAgICJtdWx0aTpiaW5hcnkiCiAgICAgICBdCiAgICAgfSwKICAgICAic2VydmVyIjogewpAQCAtMzI4LDggKzUyMSwxMSBAQAogICAgICAgICAiLUlnZW4tcGVybC8iLAogICAgICAgICAiLUkuLi8uLi9saWIvcGVybC9saWIvIiwKICAgICAgICAgIlRlc3RTZXJ2ZXIucGwiLAotICAgICAgICAiLS1jZXJ0PS4uLy4uL3Rlc3Qva2V5cy9zZXJ2ZXIucGVtIiwKLSAgICAgICAgIi0ta2V5PS4uLy4uL3Rlc3Qva2V5cy9zZXJ2ZXIua2V5IgorICAgICAgICAiLS1jZXJ0PS4uL2tleXMvc2VydmVyLmNydCIsCisgICAgICAgICItLWtleT0uLi9rZXlzL3NlcnZlci5rZXkiCisgICAgICBdLAorICAgICAgInByb3RvY29scyI6IFsKKyAgICAgICAgImJpbmFyeTptdWx0aSIKICAgICAgIF0KICAgICB9LAogICAgICJ3b3JrZGlyIjogInBlcmwiCkBAIC0zNTIsOSArNTQ4LDIwMiBAQAogICAgICAgXSwKICAgICAgICJjb21tYW5kIjogWwogICAgICAgICAicGhwIiwKKyAgICAgICAgIi1kZXh0ZW5zaW9uX2Rpcj1waHBfZXh0X2RpciIsCisgICAgICAgICItLXBocC1pbmk9dGVzdF9waHAuaW5pIiwKKyAgICAgICAgIi0tbm8tcGhwLWluaSIsCisgICAgICAgICItZGRpc3BsYXlfZXJyb3JzPXN0ZGVyciIsCisgICAgICAgICItZGxvZ19lcnJvcnM9MCIsCisgICAgICAgICItZGVycm9yX3JlcG9ydGluZz1FX0FMTCIsCiAgICAgICAgICJUZXN0Q2xpZW50LnBocCIKICAgICAgIF0KICAgICB9LAogICAgICJ3b3JrZGlyIjogInBocCIKKyAgfSwKKyAgeworICAgICJuYW1lIjogImRhcnQiLAorICAgICJjbGllbnQiOiB7CisgICAgICAidHJhbnNwb3J0cyI6IFsKKyAgICAgICAgImJ1ZmZlcmVkIiwKKyAgICAgICAgImZyYW1lZCIsCisgICAgICAgICJodHRwIgorICAgICAgXSwKKyAgICAgICJzb2NrZXRzIjogWworICAgICAgICAiaXAiCisgICAgICBdLAorICAgICAgInByb3RvY29scyI6IFsKKyAgICAgICAgImJpbmFyeSIsCisgICAgICAgICJjb21wYWN0IiwKKyAgICAgICAgImpzb24iCisgICAgICBdLAorICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJkYXJ0IiwKKyAgICAgICAgInRlc3RfY2xpZW50L2Jpbi9tYWluLmRhcnQiCisgICAgICBdCisgICAgfSwKKyAgICAid29ya2RpciI6ICJkYXJ0IgorICB9LAorICB7CisgICAgIm5hbWUiOiAiZXJsIiwKKyAgICAidHJhbnNwb3J0cyI6IFsKKyAgICAgICJidWZmZXJlZCIsCisgICAgICAiZnJhbWVkIgorICAgIF0sCisgICAgInNvY2tldHMiOiBbCisgICAgICAiaXAiLAorICAgICAgImlwLXNzbCIKKyAgICBdLAorICAgICJwcm90b2NvbHMiOiBbCisgICAgICAiYmluYXJ5IiwKKyAgICAgICJjb21wYWN0IgorICAgIF0sCisgICAgImNsaWVudCI6IHsKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAiZXJsIiwKKyAgICAgICAgIitLIiwKKyAgICAgICAgInRydWUiLAorICAgICAgICAiLW5vc2hlbGwiLAorICAgICAgICAiLXBhIiwKKyAgICAgICAgIi4uLy4uL2xpYi9lcmwvZWJpbi8iLAorICAgICAgICAiLXBhIiwKKyAgICAgICAgIi4vZWJpbiIsCisgICAgICAgICItcyIsCisgICAgICAgICJ0ZXN0X2NsaWVudCIsCisgICAgICAgICItcyIsCisgICAgICAgICJpbml0IiwKKyAgICAgICAgInN0b3AiLAorICAgICAgICAiLWV4dHJhIgorICAgICAgXQorICAgIH0sCisgICAgInNlcnZlciI6IHsKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAiZXJsIiwKKyAgICAgICAgIitLIiwKKyAgICAgICAgInRydWUiLAorICAgICAgICAiLW5vc2hlbGwiLAorICAgICAgICAiLXBhIiwKKyAgICAgICAgIi4uLy4uL2xpYi9lcmwvZWJpbi8iLAorICAgICAgICAiLXBhIiwKKyAgICAgICAgIi4vZWJpbiIsCisgICAgICAgICItcyIsCisgICAgICAgICJ0ZXN0X3RocmlmdF9zZXJ2ZXIiLAorICAgICAgICAiLWV4dHJhIgorICAgICAgXQorICAgIH0sCisgICAgIndvcmtkaXIiOiAiZXJsIgorICB9LAorICB7CisgICAgIm5hbWUiOiAianMiLAorICAgICJ0cmFuc3BvcnRzIjogWworICAgICAgImh0dHAiCisgICAgXSwKKyAgICAic29ja2V0cyI6IFsKKyAgICAgICJpcCIKKyAgICBdLAorICAgICJwcm90b2NvbHMiOiBbCisgICAgICAianNvbiIKKyAgICBdLAorICAgICJjbGllbnQiOiB7CisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgInBoYW50b21qcyIsCisgICAgICAgICJ0ZXN0L3BoYW50b20tY2xpZW50LmpzIgorICAgICAgXQorICAgIH0sCisgICAgIndvcmtkaXIiOiAiLi4vbGliL2pzIgorICB9LAorICB7CisgICAgIm5hbWUiOiAibHVhIiwKKyAgICAiVE9ETyI6ICJBZGQgZGxsIHRvIExVQV9DUEFUSCIsCisgICAgImVudiI6IHsKKyAgICAgICJMVUFfUEFUSCI6ICI7O2dlbi1sdWEvPy5sdWE7Li4vLi4vbGliL2x1YS8/Lmx1YSIsCisgICAgICAiTFVBX0NQQVRIIjogIjs7Li4vLi4vbGliL2x1YS8ubGlicy8/LnNvIgorICAgIH0sCisgICAgImNsaWVudCI6IHsKKyAgICAgICJ0aW1lb3V0IjogNSwKKyAgICAgICJ0cmFuc3BvcnRzIjogWworICAgICAgICAiYnVmZmVyZWQiLAorICAgICAgICAiZnJhbWVkIiwKKyAgICAgICAgImh0dHAiCisgICAgICBdLAorICAgICAgInNvY2tldHMiOiBbCisgICAgICAgICJpcCIKKyAgICAgIF0sCisgICAgICAicHJvdG9jb2xzIjogWworICAgICAgICAiYmluYXJ5IiwKKyAgICAgICAgImNvbXBhY3QiLAorICAgICAgICAianNvbiIKKyAgICAgIF0sCisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgImx1YSIsCisgICAgICAgICJ0ZXN0X2Jhc2ljX2NsaWVudC5sdWEiCisgICAgICBdCisgICAgfSwKKyAgICAid29ya2RpciI6ICJsdWEiCisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJycyIsCisgICAgImVudiI6IHsKKyAgICAgICJSVVNUX0JBQ0tUUkFDRSI6ICIxIiwKKyAgICAgICJSVVNUX0xPRyI6ICJpbmZvIgorICAgIH0sCisgICAgInNlcnZlciI6IHsKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAidGVzdF9zZXJ2ZXIiCisgICAgICBdLAorICAgICAgInByb3RvY29scyI6IFsKKyAgICAgICAgImJpbmFyeTptdWx0aSIsCisgICAgICAgICJjb21wYWN0Om11bHRpYyIKKyAgICAgIF0KKyAgICB9LAorICAgICJjbGllbnQiOiB7CisgICAgICAidGltZW91dCI6IDYsCisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgInRlc3RfY2xpZW50IgorICAgICAgXSwKKyAgICAgICJwcm90b2NvbHMiOiBbCisgICAgICAgICJtdWx0aTpiaW5hcnkiLAorICAgICAgICAibXVsdGljOmNvbXBhY3QiCisgICAgICBdCisgICAgfSwKKyAgICAic29ja2V0cyI6IFsKKyAgICAgICJpcCIKKyAgICBdLAorICAgICJ0cmFuc3BvcnRzIjogWworICAgICAgImJ1ZmZlcmVkIiwKKyAgICAgICJmcmFtZWQiCisgICAgXSwKKyAgICAicHJvdG9jb2xzIjogWworICAgICAgImJpbmFyeSIsCisgICAgICAiY29tcGFjdCIsCisgICAgICAibXVsdGkiLAorICAgICAgIm11bHRpYyIKKyAgICBdLAorICAgICJ3b3JrZGlyIjogInJzL2JpbiIKKyAgfSwKKyAgeworICAgICJuYW1lIjogIm5vZGV0cyIsCisgICAgImVudiI6IHsKKyAgICAgICJOT0RFX1BBVEgiOiAiLi4vbGliIgorICAgIH0sCisgICAgInNlcnZlciI6IHsKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAicnVuU2VydmVyLnNoIgorICAgICAgXQorICAgIH0sCisgICAgImNsaWVudCI6IHsKKyAgICAgICJ0aW1lb3V0IjogNiwKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAicnVuQ2xpZW50LnNoIgorICAgICAgXQorICAgIH0sCisgICAgInByb3RvY29scyI6IFsKKyAgICAgICJiaW5hcnkiCisgICAgXSwKKyAgICAic29ja2V0cyI6IFsKKyAgICAgICJpcCIKKyAgICBdLAorICAgICJ0cmFuc3BvcnRzIjogWworICAgICAgImJ1ZmZlcmVkIgorICAgIF0sCisgICAgIndvcmtkaXIiOiAiLi4vbGliL25vZGV0cy90ZXN0IgogICB9CiBdCmRpZmYgLS1naXQgYS90ZXN0L3ZhbGdyaW5kLnN1cHByZXNzIGIvdGVzdC92YWxncmluZC5zdXBwcmVzcwppbmRleCA0MWY5NDE0Li5kZTE3Y2I4IDEwMDY0NAotLS0gYS90ZXN0L3ZhbGdyaW5kLnN1cHByZXNzCisrKyBiL3Rlc3QvdmFsZ3JpbmQuc3VwcHJlc3MKQEAgLTUsNSArNSw0OSBAQAogICAgZnVuOm1hbGxvYwogICAgZnVuOl9aTjVib29zdDZkZXRhaWwyNWdldF9vbmNlX3Blcl90aHJlYWRfZXBvY2hFdgogfQoreworICAgYm9vc3R0aHJlYWRzL29uY2UvaWdub3JlCisgICBIZWxncmluZDpSYWNlCisgICBmdW46X1pONWJvb3N0MTN0aHJlYWRfZGV0YWlsMTdlbnRlcl9vbmNlX3JlZ2lvbkVSTlNfOW9uY2VfZmxhZ0UKKyAgIGZ1bjpfWk41Ym9vc3Q2ZGV0YWlsMjNnZXRfY3VycmVudF90aHJlYWRfZGF0YUV2CisgICBmdW46X1pONWJvb3N0NmRldGFpbDIwaW50ZXJydXB0aW9uX2NoZWNrZXJDMUVQMTVwdGhyZWFkX211dGV4X3RQMTRwdGhyZWFkX2NvbmRfdAorICAgZnVuOl9aTjVib29zdDIyY29uZGl0aW9uX3ZhcmlhYmxlX2FueTR3YWl0SU5TXzExdW5pcXVlX2xvY2tJTlNfMTF0aW1lZF9tdXRleEVFRUVFdlJUXworICAgZnVuOl9aTjZhcGFjaGU2dGhyaWZ0MTFjb25jdXJyZW5jeTdNb25pdG9yNEltcGwxMXdhaXRGb3JldmVyRXYKKyAgIGZ1bjpfWk42YXBhY2hlNnRocmlmdDExY29uY3VycmVuY3k3TW9uaXRvcjRJbXBsMTl3YWl0Rm9yVGltZVJlbGF0aXZlRWwKKyAgIGZ1bjpfWk42YXBhY2hlNnRocmlmdDExY29uY3VycmVuY3k3TW9uaXRvcjRJbXBsNHdhaXRFbAorICAgZnVuOl9aTks2YXBhY2hlNnRocmlmdDExY29uY3VycmVuY3k3TW9uaXRvcjR3YWl0RWwKKyAgIGZ1bjpfWk42YXBhY2hlNnRocmlmdDExY29uY3VycmVuY3kxMUJvb3N0VGhyZWFkNXN0YXJ0RXYKKyAgIGZ1bjpfWk42YXBhY2hlNnRocmlmdDExY29uY3VycmVuY3k0dGVzdDE4VGhyZWFkRmFjdG9yeVRlc3RzMTJyZWFwTlRocmVhZHNFaWkKKyAgIGZ1bjptYWluCit9Cit7CisgICBwdGhyZWFkL2NyZWF0aW9uLXRscy9pZ25vcmUKKyAgIEhlbGdyaW5kOlJhY2UKKyAgIGZ1bjptZW1wY3B5CisgICBmdW46X2RsX2FsbG9jYXRlX3Rsc19pbml0CisgICBmdW46Z2V0X2NhY2hlZF9zdGFjaworICAgZnVuOmFsbG9jYXRlX3N0YWNrCisgICBmdW46cHRocmVhZF9jcmVhdGVAQEdMSUJDXzIuMioKKyAgIG9iajovdXNyL2xpYi92YWxncmluZC92Z3ByZWxvYWRfaGVsZ3JpbmQtYW1kNjQtbGludXguc28KKyAgIGZ1bjpfWk42YXBhY2hlNnRocmlmdDExY29uY3VycmVuY3kxM1B0aHJlYWRUaHJlYWQ1c3RhcnRFdgorICAgZnVuOl9aTjZhcGFjaGU2dGhyaWZ0MTFjb25jdXJyZW5jeTR0ZXN0MThUaHJlYWRGYWN0b3J5VGVzdHMxMnJlYXBOVGhyZWFkc0VpaQorICAgZnVuOm1haW4KK30KK3sKKyAgIGJvb3N0LXRocmVhZC9jcmVhdGlvbi10bHMvaWdub3JlCisgICBIZWxncmluZDpSYWNlCisgICBmdW46bWVtcGNweQorICAgZnVuOl9kbF9hbGxvY2F0ZV90bHNfaW5pdAorICAgZnVuOmdldF9jYWNoZWRfc3RhY2sKKyAgIGZ1bjphbGxvY2F0ZV9zdGFjaworICAgZnVuOnB0aHJlYWRfY3JlYXRlQEBHTElCQ18yLjIuNQorICAgb2JqOi91c3IvbGliL3ZhbGdyaW5kL3ZncHJlbG9hZF9oZWxncmluZC1hbWQ2NC1saW51eC5zbworICAgZnVuOl9aTjVib29zdDZ0aHJlYWQyMXN0YXJ0X3RocmVhZF9ub2V4Y2VwdEV2CisgICBmdW46X1pONWJvb3N0NnRocmVhZDEyc3RhcnRfdGhyZWFkRXYKKyAgIGZ1bjpfWk41Ym9vc3Q2dGhyZWFkQzFJU3Q1X0JpbmRJRlBGUHZTM19FUzNfRUVFRU9UXworICAgZnVuOl9aTjZhcGFjaGU2dGhyaWZ0MTFjb25jdXJyZW5jeTExQm9vc3RUaHJlYWQ1c3RhcnRFdgorICAgZnVuOl9aTjZhcGFjaGU2dGhyaWZ0MTFjb25jdXJyZW5jeTR0ZXN0MThUaHJlYWRGYWN0b3J5VGVzdHMxMnJlYXBOVGhyZWFkc0VpaQorICAgZnVuOm1haW4KK30KIAogCmRpZmYgLS1naXQgYS90dXRvcmlhbC9NYWtlZmlsZS5hbSBiL3R1dG9yaWFsL01ha2VmaWxlLmFtCmluZGV4IDQ3NzExYTkuLjA0OTk0NjAgMTAwNzU1Ci0tLSBhL3R1dG9yaWFsL01ha2VmaWxlLmFtCisrKyBiL3R1dG9yaWFsL01ha2VmaWxlLmFtCkBAIC0zMSw2ICszMSwxMCBAQAogU1VCRElSUyArPSBjcHAKIGVuZGlmCiAKK2lmIFdJVEhfRAorU1VCRElSUyArPSBkCitlbmRpZgorCiBpZiBXSVRIX0pBVkEKIFNVQkRJUlMgKz0gamF2YQogU1VCRElSUyArPSBqcwpAQCAtNTQsNiArNTgsMTAgQEAKIFNVQkRJUlMgKz0gaGF4ZQogZW5kaWYKIAoraWYgV0lUSF9ET1RORVRDT1JFCitTVUJESVJTICs9IG5ldGNvcmUKK2VuZGlmCisKIGlmIFdJVEhfR08KIFNVQkRJUlMgKz0gZ28KIGVuZGlmCkBAIC02Miw2ICs3MCwxOCBAQAogU1VCRElSUyArPSBub2RlanMKIGVuZGlmCiAKK2lmIFdJVEhfREFSVAorU1VCRElSUyArPSBkYXJ0CitlbmRpZgorCitpZiBXSVRIX1JTCitTVUJESVJTICs9IHJzCitlbmRpZgorCitpZiBXSVRIX0NMCitTVUJESVJTICs9IGNsCitlbmRpZgorCiAjCiAjIGdlbmVyYXRlIGh0bWwgZm9yIFRocmlmdFRlc3QudGhyaWZ0CiAjCmRpZmYgLS1naXQgYS90dXRvcmlhbC9jX2dsaWIvTWFrZWZpbGUuYW0gYi90dXRvcmlhbC9jX2dsaWIvTWFrZWZpbGUuYW0KaW5kZXggNTY1ZjYzNS4uNGRiZTY1NSAxMDA3NTUKLS0tIGEvdHV0b3JpYWwvY19nbGliL01ha2VmaWxlLmFtCisrKyBiL3R1dG9yaWFsL2NfZ2xpYi9NYWtlZmlsZS5hbQpAQCAtMjQsMTEgKzI0LDkgQEAKIAlnZW4tY19nbGliL3NoYXJlZF90eXBlcy5oIFwKIAlnZW4tY19nbGliL3R1dG9yaWFsX3R5cGVzLmgKIAotQU1fQ0ZMQUdTID0gLWcgLVdhbGwgLVdleHRyYSAtcGVkYW50aWMgJChHTElCX0NGTEFHUykgJChHT0JKRUNUX0NGTEFHUykgQEdDT1ZfQ0ZMQUdTQAorQU1fQ0ZMQUdTID0gLWcgLVdhbGwgLVdleHRyYSAtcGVkYW50aWMgJChHTElCX0NGTEFHUykgJChHT0JKRUNUX0NGTEFHUykgJChPUEVOU1NMX0lOQ0xVREVTKSBAR0NPVl9DRkxBR1NACiBBTV9DUFBGTEFHUyA9IC1JJCh0b3Bfc3JjZGlyKS9saWIvY19nbGliL3NyYyAtSWdlbi1jX2dsaWIKLUFNX0xERkxBR1MgPSAkKEdMSUJfTElCUykgJChHT0JKRUNUX0xJQlMpIEBHQ09WX0xERkxBR1NACi0KLVRIUklGVCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0CitBTV9MREZMQUdTID0gJChHTElCX0xJQlMpICQoR09CSkVDVF9MSUJTKSAkKE9QRU5TU0xfTERGTEFHUykgJChPUEVOU1NMX0xJQlMpIEBHQ09WX0xERkxBR1NACiAKIG5vaW5zdF9MVExJQlJBUklFUyA9IFwKIAlsaWJ0dXRvcmlhbGdlbmNnbGliLmxhCkBAIC01NSw2ICs1Myw3IEBACiAKIHR1dG9yaWFsX3NlcnZlcl9TT1VSQ0VTID0gXAogCWNfZ2xpYl9zZXJ2ZXIuYwordHV0b3JpYWxfc2VydmVyX0xERkxBR1MgPSAkKE9QRU5TU0xfTElCUykKIAogdHV0b3JpYWxfc2VydmVyX0xEQUREID0gXAogCWxpYnR1dG9yaWFsZ2VuY2dsaWIubGEgXApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvY2wvTWFrZWZpbGUuYW0gYi90dXRvcmlhbC9jbC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yYjIwMTNhCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvY2wvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw2NSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3NldHVwLWxvY2FsLWxpc3AtZW52OiBlbnN1cmUtZXh0ZXJuYWxzLnNoCisJYmFzaCBlbnN1cmUtZXh0ZXJuYWxzLnNoCisKK2dlbi1jbDogJCh0b3Bfc3JjZGlyKS90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gY2wgLXIgJDwKKworQUxMX0ZJTEVfUFJFUkVRUyA9IFwKKwkJICAgbG9hZC1sb2NhbGx5Lmxpc3AgXAorCQkgICBtYWtlLXR1dG9yaWFsLXNlcnZlci5saXNwIFwKKwkJICAgbWFrZS10dXRvcmlhbC1jbGllbnQubGlzcCBcCisJCSAgIHNoYXJlZC1pbXBsZW1lbnRhdGlvbi5saXNwIFwKKwkJICAgdGhyaWZ0LXR1dG9yaWFsLmFzZCBcCisJCSAgIHR1dG9yaWFsLWltcGxlbWVudGF0aW9uLmxpc3AKKworIyBOT1RFOiB0aGUgc2VydmVyIGFuZCBjbGllbnQgY2Fubm90IGJlIGJ1aWx0IGluIHBhcmFsbGVsCisjIGJlY2F1c2Ugb24gbG9hZGluZyB0aGUgbWFrZS10dXRvcmlhbC0qIHNjcmlwdHMgU0JDTCB3aWxsCisjIGF0dGVtcHQgdG8gY29tcGlsZSB0aGVpciBkZXBlbmRlbmNpZXMuIFVuZm9ydHVuYXRlbHksCisjIGJlY2F1c2UgdGhlaXIgZGVwZW5kZW5jaWVzIGFyZSBzaGFyZWQsIHBhcmFsbGVsIGpvYnMgY2FuCisjIGVuZCB1cCBvdmVyd3JpdGluZyBvciBjb3JydXB0aW5nIHRoZSBjb21waWxlZCBmaWxlcworYWxsLWxvY2FsOiBnZW4tY2wgc2V0dXAtbG9jYWwtbGlzcC1lbnYgJChBTExfRklMRV9QUkVSRVFTKQorCSQoU0JDTCkgLS1zY3JpcHQgbWFrZS10dXRvcmlhbC1zZXJ2ZXIubGlzcAorCSQoU0JDTCkgLS1zY3JpcHQgbWFrZS10dXRvcmlhbC1jbGllbnQubGlzcAorCit0dXRvcmlhbHNlcnZlcjogYWxsCisJLi9UdXRvcmlhbFNlcnZlcgorCit0dXRvcmlhbGNsaWVudDogYWxsCisJLi9UdXRvcmlhbENsaWVudAorCitjbGVhbi1sb2NhbDoKKwktJChSTSkgLXIgZ2VuLSoKKwktJChSTSkgLXIgZXh0ZXJuYWxzCisJLSQoUk0pIC1yIHF1aWNrbGlzcAorCS0kKFJNKSAtciBsaWIKKwktJChSTSkgcXVpY2tsaXNwLmxpc3AKKwktJChSTSkgYmFja3BvcnQtdXBkYXRlLnppcAorCS0kKFJNKSBzaGFyZWQtaW1wbGVtZW50YXRpb24uZmFzbAorCS0kKFJNKSB0dXRvcmlhbC1pbXBsZW1lbnRhdGlvbi5mYXNsCisJLSQoUk0pIFR1dG9yaWFsU2VydmVyCisJLSQoUk0pIFR1dG9yaWFsQ2xpZW50CisKK0VYVFJBX0RJU1QgPSBcCisJdHV0b3JpYWwtaW1wbGVtZW50YXRpb24ubGlzcCBcCisJc2hhcmVkLWltcGxlbWVudGF0aW9uLmxpc3AgXAorCXRocmlmdC10dXRvcmlhbC5hc2QgXAorCW1ha2UtdHV0b3JpYWwtc2VydmVyLmxpc3AgXAorCW1ha2UtdHV0b3JpYWwtY2xpZW50Lmxpc3AKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NsL2Vuc3VyZS1leHRlcm5hbHMuc2ggYi90dXRvcmlhbC9jbC9lbnN1cmUtZXh0ZXJuYWxzLnNoCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjVhZThjNTYKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9jbC9lbnN1cmUtZXh0ZXJuYWxzLnNoCkBAIC0wLDAgKzEgQEAKKy4uLy4uL2xpYi9jbC9lbnN1cmUtZXh0ZXJuYWxzLnNoClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvY2wvbG9hZC1sb2NhbGx5Lmxpc3AgYi90dXRvcmlhbC9jbC9sb2FkLWxvY2FsbHkubGlzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTJhMGEyCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvY2wvbG9hZC1sb2NhbGx5Lmxpc3AKQEAgLTAsMCArMSwyMiBAQAorKGluLXBhY2thZ2UgIzpjbC11c2VyKQorCis7Ozs7IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOzs7OyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis7Ozs7IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOzs7OworOzs7OyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis7Ozs7Cis7Ozs7IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzs7OzsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzs7OzsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis7Ozs7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzs7OzsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKzs7OzsgSnVzdCBhIHNjcmlwdCBmb3IgbG9hZGluZyB0aGUgbGlicmFyeSBpdHNlbGYsIHVzaW5nIGJ1bmRsZWQgZGVwZW5kZW5jaWVzLgorOzs7OyBUaGlzIGlzIGFuIGlkZW50aWNhbCBjb3B5IG9mIHRoZSBmaWxlIGluIGxpYi9jbC4KKworKHJlcXVpcmUgImFzZGYiKQorCisobG9hZCAobWVyZ2UtcGF0aG5hbWVzICJleHRlcm5hbHMvYnVuZGxlLmxpc3AiICpsb2FkLXRydWVuYW1lKikpCisoYXNkZjpsb2FkLWFzZCAobWVyZ2UtcGF0aG5hbWVzICJsaWIvZGUuc2V0Zi50aHJpZnQtYmFja3BvcnQtdXBkYXRlL3RocmlmdC5hc2QiICpsb2FkLXRydWVuYW1lKikpCisoYXNkZjpsb2FkLXN5c3RlbSA6dGhyaWZ0KQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvY2wvbWFrZS10dXRvcmlhbC1jbGllbnQubGlzcCBiL3R1dG9yaWFsL2NsL21ha2UtdHV0b3JpYWwtY2xpZW50Lmxpc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E2ZDg2MQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2NsL21ha2UtdHV0b3JpYWwtY2xpZW50Lmxpc3AKQEAgLTAsMCArMSw1MSBAQAorKGluLXBhY2thZ2UgIzpjbC11c2VyKQorCis7Ozs7IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOzs7OyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis7Ozs7IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOzs7OworOzs7OyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis7Ozs7Cis7Ozs7IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzs7OzsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzs7OzsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis7Ozs7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzs7OzsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyhyZXF1aXJlICJhc2RmIikKKyhsb2FkIChtZXJnZS1wYXRobmFtZXMgImxvYWQtbG9jYWxseS5saXNwIiAqbG9hZC10cnVlbmFtZSopKQorKGFzZGY6bG9hZC1zeXN0ZW0gOm5ldC5kaWRpZXJ2ZXJuYS5jbG9uKQorKGFzZGY6bG9hZC1hc2QgKG1lcmdlLXBhdGhuYW1lcyAiZ2VuLWNsL3NoYXJlZC90aHJpZnQtZ2VuLXNoYXJlZC5hc2QiICpsb2FkLXRydWVuYW1lKikpCisoYXNkZjpsb2FkLWFzZCAobWVyZ2UtcGF0aG5hbWVzICJnZW4tY2wvdHV0b3JpYWwvdGhyaWZ0LWdlbi10dXRvcmlhbC5hc2QiICpsb2FkLXRydWVuYW1lKikpCisoYXNkZjpsb2FkLWFzZCAobWVyZ2UtcGF0aG5hbWVzICJ0aHJpZnQtdHV0b3JpYWwuYXNkIiAqbG9hZC10cnVlbmFtZSopKQorKGFzZGY6bG9hZC1zeXN0ZW0gOnRocmlmdC10dXRvcmlhbCkKKworKG5ldC5kaWRpZXJ2ZXJuYS5jbG9uOm5pY2tuYW1lLXBhY2thZ2UpCisKKyhkZWZ1biBtYWluICgpCisgICJFbnRyeSBwb2ludCBmb3IgdGhlIGJpbmFyeS4iCisgICh0aHJpZnQ6d2l0aC1jbGllbnQgKHByb3QgI3UidGhyaWZ0Oi8vMTI3LjAuMC4xOjkwOTAiKQorICAgICh0dXRvcmlhbC5jYWxjdWxhdG9yOnBpbmcgcHJvdCkKKyAgICAoZm9ybWF0IHQgInBpbmcoKX4lIikKKyAgICAoZm9ybWF0IHQgIjEgKyAxID0gfmF+JSIgKHR1dG9yaWFsLmNhbGN1bGF0b3I6YWRkIHByb3QgMSAxKSkKKyAgICAobGV0ICgod29yay1pbnN0YW5jZSAodHV0b3JpYWw6bWFrZS13b3JrIDpudW0xIDUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpudW0yIDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpvcCB0dXRvcmlhbDpvcGVyYXRpb24uZGl2aWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Y29tbWVudCAiQm9veWEhIikpKQorICAgICAgKGhhbmRsZXItY2FzZSAoZm9ybWF0IHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNSAvIDAgPSB+YSAtIE9oLCByZWFsbHk/IEFuIGV4Y2VwdGlvbiBzaG91bGQgaGF2ZSBiZWVuIHRocm93biBoZXJlLn4lIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0dXRvcmlhbC5jYWxjdWxhdG9yOmNhbGN1bGF0ZSBwcm90IDEgd29yay1pbnN0YW5jZSkpCisgICAgICAgICh0dXRvcmlhbDppbnZhbGlkb3BlcmF0aW9uIChlKQorICAgICAgICAgIChmb3JtYXQgdCAiLS0tfiUoRXhwZWN0ZWQpIEludmFsaWQgT3BlcmF0aW9uIGNhdWdodDogfiV+YX4lLS0tfiUiIGUpKSkpCisgICAgKGxldCAoKHdvcmstaW5zdGFuY2UgKHR1dG9yaWFsOm1ha2Utd29yayA6bnVtMSAxNQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOm51bTIgMTAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpvcCB0dXRvcmlhbDpvcGVyYXRpb24uc3VidHJhY3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpjb21tZW50ICJQbGF5aW5nIG5pY2UgdGhpcyB0aW1lLiIpKSkKKyAgICAgIChoYW5kbGVyLWNhc2UgKGZvcm1hdCB0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjE1IC0gMTAgPSB+YX4lIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0dXRvcmlhbC5jYWxjdWxhdG9yOmNhbGN1bGF0ZSBwcm90IDEgd29yay1pbnN0YW5jZSkpCisgICAgICAgICh0dXRvcmlhbDppbnZhbGlkb3BlcmF0aW9uIChlKQorICAgICAgICAgIChmb3JtYXQgdCAiLS0tfiUoVW5leHBlY3RlZCkgSW52YWxpZCBPcGVyYXRpb24gY2F1Z2h0OiB+JX5hfiUtLS1+JSIgZSkpKSkKKyAgICAoZm9ybWF0IHQgIkNoZWNrIGxvZzogfmF+JSIgKHNoYXJlZC5zaGFyZWQtc2VydmljZTpnZXQtc3RydWN0IHByb3QgMSkpKSkKKworKGNsb246ZHVtcCAiVHV0b3JpYWxDbGllbnQiIG1haW4pCmRpZmYgLS1naXQgYS90dXRvcmlhbC9jbC9tYWtlLXR1dG9yaWFsLXNlcnZlci5saXNwIGIvdHV0b3JpYWwvY2wvbWFrZS10dXRvcmlhbC1zZXJ2ZXIubGlzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2YxYTkwCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvY2wvbWFrZS10dXRvcmlhbC1zZXJ2ZXIubGlzcApAQCAtMCwwICsxLDI5IEBACisoaW4tcGFja2FnZSAjOmNsLXVzZXIpCisKKzs7OzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7Ozs7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzs7OzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Ozs7Cis7Ozs7ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzs7OzsKKzs7OzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOzs7OyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOzs7OyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzs7OzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOzs7OyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworKHJlcXVpcmUgImFzZGYiKQorKGxvYWQgKG1lcmdlLXBhdGhuYW1lcyAibG9hZC1sb2NhbGx5Lmxpc3AiICpsb2FkLXRydWVuYW1lKikpCisoYXNkZjpsb2FkLXN5c3RlbSA6bmV0LmRpZGllcnZlcm5hLmNsb24pCisoYXNkZjpsb2FkLWFzZCAobWVyZ2UtcGF0aG5hbWVzICJnZW4tY2wvc2hhcmVkL3RocmlmdC1nZW4tc2hhcmVkLmFzZCIgKmxvYWQtdHJ1ZW5hbWUqKSkKKyhhc2RmOmxvYWQtYXNkIChtZXJnZS1wYXRobmFtZXMgImdlbi1jbC90dXRvcmlhbC90aHJpZnQtZ2VuLXR1dG9yaWFsLmFzZCIgKmxvYWQtdHJ1ZW5hbWUqKSkKKyhhc2RmOmxvYWQtYXNkIChtZXJnZS1wYXRobmFtZXMgInRocmlmdC10dXRvcmlhbC5hc2QiICpsb2FkLXRydWVuYW1lKikpCisoYXNkZjpsb2FkLXN5c3RlbSA6dGhyaWZ0LXR1dG9yaWFsKQorCisobmV0LmRpZGllcnZlcm5hLmNsb246bmlja25hbWUtcGFja2FnZSkKKworKGRlZnVuIG1haW4gKCkKKyAgIkVudHJ5IHBvaW50IGZvciB0aGUgYmluYXJ5LiIKKyAgKHRocmlmdDpzZXJ2ZSAjdSJ0aHJpZnQ6Ly8xMjcuMC4wLjE6OTA5MCIgdHV0b3JpYWw6Y2FsY3VsYXRvcikpCisKKyhjbG9uOmR1bXAgIlR1dG9yaWFsU2VydmVyIiBtYWluKQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvY2wvc2hhcmVkLWltcGxlbWVudGF0aW9uLmxpc3AgYi90dXRvcmlhbC9jbC9zaGFyZWQtaW1wbGVtZW50YXRpb24ubGlzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTk3NjI2Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvY2wvc2hhcmVkLWltcGxlbWVudGF0aW9uLmxpc3AKQEAgLTAsMCArMSwyNSBAQAorKGluLXBhY2thZ2UgIzpzaGFyZWQtaW1wbGVtZW50YXRpb24pCisKKzs7OzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7Ozs7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzs7OzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Ozs7Cis7Ozs7ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzs7OzsKKzs7OzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOzs7OyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOzs7OyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzs7OzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOzs7OyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworKGRlZnZhciAqc3RydWN0cyogKG1ha2UtaGFzaC10YWJsZSkpCisKKyhkZWZ1biBzaGFyZWQuc2hhcmVkLXNlcnZpY2UtaW1wbGVtZW50YXRpb246Z2V0LXN0cnVjdCAoa2V5KQorICAoZm9ybWF0IHQgImdldFN0cnVjdCh+YSl+JSIga2V5KQorICAoZ2V0aGFzaCBrZXkgKnN0cnVjdHMqKSkKKworKGRlZnVuIGFkZC1sb2cgKGtleSB2YWx1ZSkKKyAgKHNldGYgKGdldGhhc2gga2V5ICpzdHJ1Y3RzKikKKyAgICAgICAgKG1ha2UtaW5zdGFuY2UgJ3NoYXJlZDpzaGFyZWRzdHJ1Y3QKKyAgICAgICAgICAgICAgICAgICAgICAgOmtleSBrZXkKKyAgICAgICAgICAgICAgICAgICAgICAgOnZhbHVlICh3cml0ZS10by1zdHJpbmcgdmFsdWUpKSkpCmRpZmYgLS1naXQgYS90dXRvcmlhbC9jbC90aHJpZnQtdHV0b3JpYWwuYXNkIGIvdHV0b3JpYWwvY2wvdGhyaWZ0LXR1dG9yaWFsLmFzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTAzNTM3Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvY2wvdGhyaWZ0LXR1dG9yaWFsLmFzZApAQCAtMCwwICsxLDE3IEBACis7Ozs7IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOzs7OyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis7Ozs7IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOzs7OworOzs7OyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis7Ozs7Cis7Ozs7IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzs7OzsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzs7OzsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis7Ozs7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzs7OzsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyhhc2RmOmRlZnN5c3RlbSAjOnRocmlmdC10dXRvcmlhbAorICA6ZGVwZW5kcy1vbiAoIzp0aHJpZnQtZ2VuLXR1dG9yaWFsKQorICA6c2VyaWFsIHQKKyAgOmNvbXBvbmVudHMgKCg6ZmlsZSAic2hhcmVkLWltcGxlbWVudGF0aW9uIikKKyAgICAgICAgICAgICAgICg6ZmlsZSAidHV0b3JpYWwtaW1wbGVtZW50YXRpb24iKSkpCmRpZmYgLS1naXQgYS90dXRvcmlhbC9jbC90dXRvcmlhbC1pbXBsZW1lbnRhdGlvbi5saXNwIGIvdHV0b3JpYWwvY2wvdHV0b3JpYWwtaW1wbGVtZW50YXRpb24ubGlzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzkyZmU0Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvY2wvdHV0b3JpYWwtaW1wbGVtZW50YXRpb24ubGlzcApAQCAtMCwwICsxLDQxIEBACisoaW4tcGFja2FnZSAjOnR1dG9yaWFsLWltcGxlbWVudGF0aW9uKQorCis7Ozs7IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOzs7OyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis7Ozs7IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOzs7OworOzs7OyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis7Ozs7Cis7Ozs7IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzs7OzsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzs7OzsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis7Ozs7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzs7OzsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyhkZWZ1biB0dXRvcmlhbC5jYWxjdWxhdG9yLWltcGxlbWVudGF0aW9uOnBpbmcgKCkKKyAgKGZvcm1hdCB0ICJwaW5nKCl+JSIpKQorCisoZGVmdW4gdHV0b3JpYWwuY2FsY3VsYXRvci1pbXBsZW1lbnRhdGlvbjphZGQgKG51bTEgbnVtMikKKyAgKGZvcm1hdCB0ICJhZGQofmEsIH5hKX4lIiBudW0xIG51bTIpCisgICgrIG51bTEgbnVtMikpCisKKyhkZWZ1biB0dXRvcmlhbC5jYWxjdWxhdG9yLWltcGxlbWVudGF0aW9uOmNhbGN1bGF0ZSAobG9naWQgd29yaykKKyAgKGZvcm1hdCB0ICJjYWxjdWxhdGUofmEsIH5hKX4lIiBsb2dpZCB3b3JrKQorICAoaGFuZGxlci1jYXNlCisgICAgICAobGV0KiAoKG51bTEgKHR1dG9yaWFsOndvcmstbnVtMSB3b3JrKSkKKyAgICAgICAgICAgICAobnVtMiAodHV0b3JpYWw6d29yay1udW0yIHdvcmspKQorICAgICAgICAgICAgIChvcCAodHV0b3JpYWw6d29yay1vcCB3b3JrKSkKKyAgICAgICAgICAgICAocmVzdWx0CisgICAgICAgICAgICAgIChjb25kCisgICAgICAgICAgICAgICAgKCg9IG9wIHR1dG9yaWFsOm9wZXJhdGlvbi5hZGQpICgrIG51bTEgbnVtMikpCisgICAgICAgICAgICAgICAgKCg9IG9wIHR1dG9yaWFsOm9wZXJhdGlvbi5zdWJ0cmFjdCkgKC0gbnVtMSBudW0yKSkKKyAgICAgICAgICAgICAgICAoKD0gb3AgdHV0b3JpYWw6b3BlcmF0aW9uLm11bHRpcGx5KSAoKiBudW0xIG51bTIpKQorICAgICAgICAgICAgICAgICgoPSBvcCB0dXRvcmlhbDpvcGVyYXRpb24uZGl2aWRlKSAoLyBudW0xIG51bTIpKSkpKQorICAgICAgICAoc2hhcmVkLWltcGxlbWVudGF0aW9uOjphZGQtbG9nIGxvZ2lkIHJlc3VsdCkKKyAgICAgICAgcmVzdWx0KQorICAgIChkaXZpc2lvbi1ieS16ZXJvICgpIChlcnJvciAndHV0b3JpYWw6aW52YWxpZG9wZXJhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6d2h5ICJEaXZpc2lvbiBieSB6ZXJvLiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOndoYXQtb3AgKHR1dG9yaWFsOndvcmstb3Agd29yaykpKSkpCisKKyhkZWZ1biB0dXRvcmlhbC5jYWxjdWxhdG9yLWltcGxlbWVudGF0aW9uOnppcCAoKQorICAoZm9ybWF0IHQgInppcCgpfiUiKSkKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NwcC9DTWFrZUxpc3RzLnR4dCBiL3R1dG9yaWFsL2NwcC9DTWFrZUxpc3RzLnR4dAppbmRleCAyYjBjMTQzLi44NjM0YjQxIDEwMDY0NAotLS0gYS90dXRvcmlhbC9jcHAvQ01ha2VMaXN0cy50eHQKKysrIGIvdHV0b3JpYWwvY3BwL0NNYWtlTGlzdHMudHh0CkBAIC0xNyw3ICsxNyw2IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1maW5kX3BhY2thZ2UoQm9vc3QgMS41My4wIFJFUVVJUkVEKQogaW5jbHVkZV9kaXJlY3RvcmllcyhTWVNURU0gIiR7Qm9vc3RfSU5DTFVERV9ESVJTfSIpCiAKICNNYWtlIHN1cmUgZ2VuLWNwcCBmaWxlcyBjYW4gYmUgaW5jbHVkZWQKQEAgLTI3LDcgKzI2LDcgQEAKIAogaW5jbHVkZShUaHJpZnRNYWNyb3MpCiAKLXNldCh0dXRvcmlhbGdlbmNwcF9TT1VSQ0VTIAorc2V0KHR1dG9yaWFsZ2VuY3BwX1NPVVJDRVMKICAgICBnZW4tY3BwL0NhbGN1bGF0b3IuY3BwCiAgICAgZ2VuLWNwcC9TaGFyZWRTZXJ2aWNlLmNwcAogICAgIGdlbi1jcHAvc2hhcmVkX2NvbnN0YW50cy5jcHAKQEAgLTM5LDEzICszOCwxOSBAQAogTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKHR1dG9yaWFsZ2VuY3BwIHRocmlmdCkKIAogYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVCBnZW4tY3BwL0NhbGN1bGF0b3IuY3BwIGdlbi1jcHAvU2hhcmVkU2VydmljZS5jcHAgZ2VuLWNwcC9zaGFyZWRfY29uc3RhbnRzLmNwcCBnZW4tY3BwL3NoYXJlZF90eXBlcy5jcHAgZ2VuLWNwcC90dXRvcmlhbF9jb25zdGFudHMuY3BwIGdlbi1jcHAvdHV0b3JpYWxfdHlwZXMuY3BwCi0gICAgQ09NTUFORCB0aHJpZnQtY29tcGlsZXIgLS1nZW4gY3BwIC1yICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQKKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBjcHAgLXIgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdAogKQogCiBhZGRfZXhlY3V0YWJsZShUdXRvcmlhbFNlcnZlciBDcHBTZXJ2ZXIuY3BwKQogdGFyZ2V0X2xpbmtfbGlicmFyaWVzKFR1dG9yaWFsU2VydmVyIHR1dG9yaWFsZ2VuY3BwKQogTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFR1dG9yaWFsU2VydmVyIHRocmlmdCkKK2lmIChaTElCX0ZPVU5EKQorICB0YXJnZXRfbGlua19saWJyYXJpZXMoVHV0b3JpYWxTZXJ2ZXIgJHtaTElCX0xJQlJBUklFU30pCitlbmRpZiAoKQogCiBhZGRfZXhlY3V0YWJsZShUdXRvcmlhbENsaWVudCBDcHBDbGllbnQuY3BwKQogdGFyZ2V0X2xpbmtfbGlicmFyaWVzKFR1dG9yaWFsQ2xpZW50IHR1dG9yaWFsZ2VuY3BwKQogTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFR1dG9yaWFsQ2xpZW50IHRocmlmdCkKK2lmIChaTElCX0ZPVU5EKQorICB0YXJnZXRfbGlua19saWJyYXJpZXMoVHV0b3JpYWxDbGllbnQgJHtaTElCX0xJQlJBUklFU30pCitlbmRpZiAoKQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvY3BwL0NwcENsaWVudC5jcHAgYi90dXRvcmlhbC9jcHAvQ3BwQ2xpZW50LmNwcAppbmRleCAyNzYzZmVlLi41MjA4NDExIDEwMDY0NAotLS0gYS90dXRvcmlhbC9jcHAvQ3BwQ2xpZW50LmNwcAorKysgYi90dXRvcmlhbC9jcHAvQ3BwQ2xpZW50LmNwcApAQCAtMzQsOSArMzQsOSBAQAogdXNpbmcgbmFtZXNwYWNlIHNoYXJlZDsKIAogaW50IG1haW4oKSB7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHNvY2tldChuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgOTA5MCkpOwotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQobmV3IFRCdWZmZXJlZFRyYW5zcG9ydChzb2NrZXQpKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90b2NvbChuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCkpOworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gc29ja2V0KG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCA5MDkwKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQobmV3IFRCdWZmZXJlZFRyYW5zcG9ydChzb2NrZXQpKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG9jb2wobmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpKTsKICAgQ2FsY3VsYXRvckNsaWVudCBjbGllbnQocHJvdG9jb2wpOwogCiAgIHRyeSB7CmRpZmYgLS1naXQgYS90dXRvcmlhbC9jcHAvQ3BwU2VydmVyLmNwcCBiL3R1dG9yaWFsL2NwcC9DcHBTZXJ2ZXIuY3BwCmluZGV4IGVhZmZmYTkuLmY3Mzc5ZDUgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2NwcC9DcHBTZXJ2ZXIuY3BwCisrKyBiL3R1dG9yaWFsL2NwcC9DcHBTZXJ2ZXIuY3BwCkBAIC0yOCw4ICsyOCw2IEBACiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaD4KICNpbmNsdWRlIDx0aHJpZnQvVFRvU3RyaW5nLmg+CiAKLSNpbmNsdWRlIDxib29zdC9tYWtlX3NoYXJlZC5ocHA+Ci0KICNpbmNsdWRlIDxpb3N0cmVhbT4KICNpbmNsdWRlIDxzdGRleGNlcHQ+CiAjaW5jbHVkZSA8c3N0cmVhbT4KQEAgLTExOCw3ICsxMTYsNyBAQAogICB2aXJ0dWFsIH5DYWxjdWxhdG9yQ2xvbmVGYWN0b3J5KCkge30KICAgdmlydHVhbCBDYWxjdWxhdG9ySWYqIGdldEhhbmRsZXIoY29uc3QgOjphcGFjaGU6OnRocmlmdDo6VENvbm5lY3Rpb25JbmZvJiBjb25uSW5mbykKICAgewotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHNvY2sgPSBib29zdDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VFNvY2tldD4oY29ubkluZm8udHJhbnNwb3J0KTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gc29jayA9IHN0ZDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VFNvY2tldD4oY29ubkluZm8udHJhbnNwb3J0KTsKICAgICBjb3V0IDw8ICJJbmNvbWluZyBjb25uZWN0aW9uXG4iOwogICAgIGNvdXQgPDwgIlx0U29ja2V0SW5mbzogIiAgPDwgc29jay0+Z2V0U29ja2V0SW5mbygpIDw8ICJcbiI7CiAgICAgY291dCA8PCAiXHRQZWVySG9zdDogIiAgICA8PCBzb2NrLT5nZXRQZWVySG9zdCgpIDw8ICJcbiI7CkBAIC0xMzMsMTggKzEzMSwxOCBAQAogCiBpbnQgbWFpbigpIHsKICAgVFRocmVhZGVkU2VydmVyIHNlcnZlcigKLSAgICBib29zdDo6bWFrZV9zaGFyZWQ8Q2FsY3VsYXRvclByb2Nlc3NvckZhY3Rvcnk+KGJvb3N0OjptYWtlX3NoYXJlZDxDYWxjdWxhdG9yQ2xvbmVGYWN0b3J5PigpKSwKLSAgICBib29zdDo6bWFrZV9zaGFyZWQ8VFNlcnZlclNvY2tldD4oOTA5MCksIC8vcG9ydAotICAgIGJvb3N0OjptYWtlX3NoYXJlZDxUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5PigpLAotICAgIGJvb3N0OjptYWtlX3NoYXJlZDxUQmluYXJ5UHJvdG9jb2xGYWN0b3J5PigpKTsKKyAgICBzdGQ6Om1ha2Vfc2hhcmVkPENhbGN1bGF0b3JQcm9jZXNzb3JGYWN0b3J5PihzdGQ6Om1ha2Vfc2hhcmVkPENhbGN1bGF0b3JDbG9uZUZhY3Rvcnk+KCkpLAorICAgIHN0ZDo6bWFrZV9zaGFyZWQ8VFNlcnZlclNvY2tldD4oOTA5MCksIC8vcG9ydAorICAgIHN0ZDo6bWFrZV9zaGFyZWQ8VEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeT4oKSwKKyAgICBzdGQ6Om1ha2Vfc2hhcmVkPFRCaW5hcnlQcm90b2NvbEZhY3Rvcnk+KCkpOwogCiAgIC8qCiAgIC8vIGlmIHlvdSBkb24ndCBuZWVkIHBlci1jb25uZWN0aW9uIHN0YXRlLCBkbyB0aGUgZm9sbG93aW5nIGluc3RlYWQKICAgVFRocmVhZGVkU2VydmVyIHNlcnZlcigKLSAgICBib29zdDo6bWFrZV9zaGFyZWQ8Q2FsY3VsYXRvclByb2Nlc3Nvcj4oYm9vc3Q6Om1ha2Vfc2hhcmVkPENhbGN1bGF0b3JIYW5kbGVyPigpKSwKLSAgICBib29zdDo6bWFrZV9zaGFyZWQ8VFNlcnZlclNvY2tldD4oOTA5MCksIC8vcG9ydAotICAgIGJvb3N0OjptYWtlX3NoYXJlZDxUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5PigpLAotICAgIGJvb3N0OjptYWtlX3NoYXJlZDxUQmluYXJ5UHJvdG9jb2xGYWN0b3J5PigpKTsKKyAgICBzdGQ6Om1ha2Vfc2hhcmVkPENhbGN1bGF0b3JQcm9jZXNzb3I+KHN0ZDo6bWFrZV9zaGFyZWQ8Q2FsY3VsYXRvckhhbmRsZXI+KCkpLAorICAgIHN0ZDo6bWFrZV9zaGFyZWQ8VFNlcnZlclNvY2tldD4oOTA5MCksIC8vcG9ydAorICAgIHN0ZDo6bWFrZV9zaGFyZWQ8VEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeT4oKSwKKyAgICBzdGQ6Om1ha2Vfc2hhcmVkPFRCaW5hcnlQcm90b2NvbEZhY3Rvcnk+KCkpOwogICAqLwogCiAgIC8qKgpAQCAtMTUyLDI1ICsxNTAsMjUgQEAKIAogICAvLyBUaGlzIHNlcnZlciBvbmx5IGFsbG93cyBvbmUgY29ubmVjdGlvbiBhdCBhIHRpbWUsIGJ1dCBzcGF3bnMgbm8gdGhyZWFkcwogICBUU2ltcGxlU2VydmVyIHNlcnZlcigKLSAgICBib29zdDo6bWFrZV9zaGFyZWQ8Q2FsY3VsYXRvclByb2Nlc3Nvcj4oYm9vc3Q6Om1ha2Vfc2hhcmVkPENhbGN1bGF0b3JIYW5kbGVyPigpKSwKLSAgICBib29zdDo6bWFrZV9zaGFyZWQ8VFNlcnZlclNvY2tldD4oOTA5MCksCi0gICAgYm9vc3Q6Om1ha2Vfc2hhcmVkPFRCdWZmZXJlZFRyYW5zcG9ydEZhY3Rvcnk+KCksCi0gICAgYm9vc3Q6Om1ha2Vfc2hhcmVkPFRCaW5hcnlQcm90b2NvbEZhY3Rvcnk+KCkpOworICAgIHN0ZDo6bWFrZV9zaGFyZWQ8Q2FsY3VsYXRvclByb2Nlc3Nvcj4oc3RkOjptYWtlX3NoYXJlZDxDYWxjdWxhdG9ySGFuZGxlcj4oKSksCisgICAgc3RkOjptYWtlX3NoYXJlZDxUU2VydmVyU29ja2V0Pig5MDkwKSwKKyAgICBzdGQ6Om1ha2Vfc2hhcmVkPFRCdWZmZXJlZFRyYW5zcG9ydEZhY3Rvcnk+KCksCisgICAgc3RkOjptYWtlX3NoYXJlZDxUQmluYXJ5UHJvdG9jb2xGYWN0b3J5PigpKTsKIAogICBjb25zdCBpbnQgd29ya2VyQ291bnQgPSA0OwogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIgPQorICBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlciA9CiAgICAgVGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcih3b3JrZXJDb3VudCk7CiAgIHRocmVhZE1hbmFnZXItPnRocmVhZEZhY3RvcnkoCi0gICAgYm9vc3Q6Om1ha2Vfc2hhcmVkPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4oKSk7CisgICAgc3RkOjptYWtlX3NoYXJlZDxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+KCkpOwogICB0aHJlYWRNYW5hZ2VyLT5zdGFydCgpOwogCiAgIC8vIFRoaXMgc2VydmVyIGFsbG93cyAid29ya2VyQ291bnQiIGNvbm5lY3Rpb24gYXQgYSB0aW1lLCBhbmQgcmV1c2VzIHRocmVhZHMKICAgVFRocmVhZFBvb2xTZXJ2ZXIgc2VydmVyKAotICAgIGJvb3N0OjptYWtlX3NoYXJlZDxDYWxjdWxhdG9yUHJvY2Vzc29yRmFjdG9yeT4oYm9vc3Q6Om1ha2Vfc2hhcmVkPENhbGN1bGF0b3JDbG9uZUZhY3Rvcnk+KCkpLAotICAgIGJvb3N0OjptYWtlX3NoYXJlZDxUU2VydmVyU29ja2V0Pig5MDkwKSwKLSAgICBib29zdDo6bWFrZV9zaGFyZWQ8VEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeT4oKSwKLSAgICBib29zdDo6bWFrZV9zaGFyZWQ8VEJpbmFyeVByb3RvY29sRmFjdG9yeT4oKSwKKyAgICBzdGQ6Om1ha2Vfc2hhcmVkPENhbGN1bGF0b3JQcm9jZXNzb3JGYWN0b3J5PihzdGQ6Om1ha2Vfc2hhcmVkPENhbGN1bGF0b3JDbG9uZUZhY3Rvcnk+KCkpLAorICAgIHN0ZDo6bWFrZV9zaGFyZWQ8VFNlcnZlclNvY2tldD4oOTA5MCksCisgICAgc3RkOjptYWtlX3NoYXJlZDxUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5PigpLAorICAgIHN0ZDo6bWFrZV9zaGFyZWQ8VEJpbmFyeVByb3RvY29sRmFjdG9yeT4oKSwKICAgICB0aHJlYWRNYW5hZ2VyKTsKICAgKi8KIApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvY3BwL01ha2VmaWxlLmFtIGIvdHV0b3JpYWwvY3BwL01ha2VmaWxlLmFtCmluZGV4IGQ4YTlkYmMuLjQ5Y2YzYmUgMTAwNzU1Ci0tLSBhL3R1dG9yaWFsL2NwcC9NYWtlZmlsZS5hbQorKysgYi90dXRvcmlhbC9jcHAvTWFrZWZpbGUuYW0KQEAgLTYxLDggKzYxLDYgQEAKICMKICMgQ29tbW9uIHRocmlmdCBjb2RlIGdlbmVyYXRpb24gcnVsZXMKICMKLVRIUklGVCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0Ci0KIGdlbi1jcHAvQ2FsY3VsYXRvci5jcHAgZ2VuLWNwcC9TaGFyZWRTZXJ2aWNlLmNwcCBnZW4tY3BwL3NoYXJlZF9jb25zdGFudHMuY3BwIGdlbi1jcHAvc2hhcmVkX3R5cGVzLmNwcCBnZW4tY3BwL3R1dG9yaWFsX2NvbnN0YW50cy5jcHAgZ2VuLWNwcC90dXRvcmlhbF90eXBlcy5jcHA6ICQodG9wX3NyY2RpcikvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CiAJJChUSFJJRlQpIC0tZ2VuIGNwcCAtciAkPAogCkBAIC03MSw3ICs2OSw3IEBACiBBTV9MREZMQUdTID0gJChCT09TVF9MREZMQUdTKSAkKExJQkVWRU5UX0xERkxBR1MpCiAKIGNsZWFuLWxvY2FsOgotCSQoUk0pIC1yIGdlbi1jcHAKKwkkKFJNKSBnZW4tY3BwLyoKIAogdHV0b3JpYWxzZXJ2ZXI6IGFsbAogCS4vVHV0b3JpYWxTZXJ2ZXIKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBDbGllbnQvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwQ2xpZW50L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCmluZGV4IDcyYWU2MTYuLjFmZjY1OGMgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBDbGllbnQvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKKysrIGIvdHV0b3JpYWwvY3NoYXJwL0NzaGFycENsaWVudC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMjcsOSArMjcsOSBAQAogW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJDc2hhcnBDbGllbnQiKV0KIFthc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiIildCiBbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiQ3NoYXJwQ2xpZW50IildCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJDb3B5cmlnaHQgwqkgMjAxMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJUaHJpZnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQogW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCiBbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCiAKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBTZXJ2ZXIvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwU2VydmVyL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCmluZGV4IDI4YTY5ZDIuLjc0ZmE0NzYgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBTZXJ2ZXIvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKKysrIGIvdHV0b3JpYWwvY3NoYXJwL0NzaGFycFNlcnZlci9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMjcsOSArMjcsOSBAQAogW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJDc2hhcnBTZXJ2ZXIiKV0KIFthc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiIildCiBbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiQ3NoYXJwU2VydmVyIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJDb3B5cmlnaHQgwqkgMjAxMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJUaHJpZnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQogW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCiBbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCiAKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2QvTWFrZWZpbGUgYi90dXRvcmlhbC9kL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2VlOWFmLi4wMDAwMDAwCi0tLSBhL3R1dG9yaWFsL2QvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotTElCX0RfRElSID0gLi4vLi4vbGliL2QKLQotR0VOX1NSQyA9IC4uL2dlbi1kL3NoYXJlL1NoYXJlZFNlcnZpY2UuZCAuLi9nZW4tZC9zaGFyZS9zaGFyZWRfdHlwZXMuZCBcCi0JLi4vZ2VuLWQvdHV0b3JpYWwvdHV0b3JpYWxfdHlwZXMuZCAuLi9nZW4tZC90dXRvcmlhbC9DYWxjdWxhdG9yLmQKLQotZGVmYXVsdDogc2VydmVyIGNsaWVudCBhc3luY19jbGllbnQKLQotc2VydmVyOiBzZXJ2ZXIuZAotCWRtZCAtSSR7TElCX0RfRElSfS9zcmMgLUwtTCR7TElCX0RfRElSfSAtTC1sdGhyaWZ0ZCBzZXJ2ZXIuZCAke0dFTl9TUkN9Ci0KLWNsaWVudDogY2xpZW50LmQKLQlkbWQgLUkke0xJQl9EX0RJUn0vc3JjIC1MLUwke0xJQl9EX0RJUn0gLUwtbHRocmlmdGQgY2xpZW50LmQgJHtHRU5fU1JDfQotCi1hc3luY19jbGllbnQ6IGFzeW5jX2NsaWVudC5kCi0JZG1kIC1JJHtMSUJfRF9ESVJ9L3NyYyAtTC1MJHtMSUJfRF9ESVJ9IC1MLWx0aHJpZnRkLWV2ZW50IC1MLWx0aHJpZnRkIC1MLWxldmVudCBhc3luY19jbGllbnQuZCAke0dFTl9TUkN9Ci0KLWNsZWFuOgotCSQoUk0pIC1mIHNlcnZlciBjbGllbnQgYXN5bmNfY2xpZW50CmRpZmYgLS1naXQgYS90dXRvcmlhbC9kL01ha2VmaWxlLmFtIGIvdHV0b3JpYWwvZC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGM4YjI5Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQ2IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworTElCX0RfRElSID0gJCh0b3Bfc3JjZGlyKS9saWIvZAorCitHRU5fU1JDID0gZ2VuLWQvc2hhcmUvU2hhcmVkU2VydmljZS5kIGdlbi1kL3NoYXJlL3NoYXJlZF90eXBlcy5kIFwKKwlnZW4tZC90dXRvcmlhbC90dXRvcmlhbF90eXBlcy5kIGdlbi1kL3R1dG9yaWFsL0NhbGN1bGF0b3IuZAorCiskKEdFTl9TUkMpOiAkKHRvcF9zcmNkaXIpL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdAorCSQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0IC0tZ2VuIGQgLXIgJDwKKworc2VydmVyOiBzZXJ2ZXIuZCAkKEdFTl9TUkMpCisJJChETUQpIC1JJHtMSUJfRF9ESVJ9L3NyYyAtTC1MJHtMSUJfRF9ESVJ9IC1MLWx0aHJpZnRkIHNlcnZlci5kICR7R0VOX1NSQ30KKworY2xpZW50OiBjbGllbnQuZCAkKEdFTl9TUkMpCisJJChETUQpIC1JJHtMSUJfRF9ESVJ9L3NyYyAtTC1MJHtMSUJfRF9ESVJ9IC1MLWx0aHJpZnRkIGNsaWVudC5kICR7R0VOX1NSQ30KKworUFJPR1MgPSBzZXJ2ZXIgY2xpZW50CisKK2lmIFdJVEhfRF9FVkVOVF9URVNUUworYXN5bmNfY2xpZW50OiBhc3luY19jbGllbnQuZCAkKEdFTl9TUkMpCisJJChETUQpIC1JJHtMSUJfRF9ESVJ9L3NyYyAtTC1MJHtMSUJfRF9ESVJ9IC1MLWx0aHJpZnRkLWV2ZW50IC1MLWx0aHJpZnRkIC1MLWxldmVudCBhc3luY19jbGllbnQuZCAke0dFTl9TUkN9CisKK1BST0dTICs9IGFzeW5jX2NsaWVudAorZW5kaWYKKworYWxsLWxvY2FsOiAkKFBST0dTKQorCitjbGVhbjoKKwkkKFJNKSAtZiAkKFBST0dTKQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZGFydC9NYWtlZmlsZS5hbSBiL3R1dG9yaWFsL2RhcnQvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ5NWFjYQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2RhcnQvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw3MyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK0JVSUxUX1NPVVJDRVMgPSBnZW4tZGFydC90dXRvcmlhbC9saWIvdHV0b3JpYWwuZGFydCBnZW4tZGFydC9zaGFyZWQvbGliL3NoYXJlZC5kYXJ0CisKK2dlbi1kYXJ0L3R1dG9yaWFsL2xpYi90dXRvcmlhbC5kYXJ0IGdlbi1kYXJ0L3NoYXJlZC9saWIvc2hhcmVkLmRhcnQ6ICQodG9wX3NyY2RpcikvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGRhcnQgLXIgJDwKKworYWxsLWxvY2FsOiBnZW4tZGFydC90dXRvcmlhbC9saWIvdHV0b3JpYWwuZGFydCBwdWItZ2V0CisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIGdlbi0qCisJZmluZCAuIC10eXBlIGQgLW5hbWUgInBhY2thZ2VzIiB8IHhhcmdzICQoUk0pIC1yCisJZmluZCAuIC10eXBlIGYgLW5hbWUgIi5wYWNrYWdlcyIgfCB4YXJncyAkKFJNKQorCWZpbmQgLiAtdHlwZSBmIC1uYW1lICJwdWJzcGVjLmxvY2siIHwgeGFyZ3MgJChSTSkKKworcHViLWdldDogcHViLWdldC1nZW4gcHViLWdldC1jbGllbnQgcHViLWdldC1jb25zb2xlLWNsaWVudCBwdWItZ2V0LXNlcnZlcgorCitwdWItZ2V0LWdlbjogcHViLWdldC10dXRvcmlhbCBwdWItZ2V0LXNoYXJlZAorCitwdWItZ2V0LXR1dG9yaWFsOiBnZW4tZGFydC90dXRvcmlhbC9saWIvdHV0b3JpYWwuZGFydAorCWNkIGdlbi1kYXJ0L3R1dG9yaWFsOyAke0RBUlRQVUJ9IGdldAorCitwdWItZ2V0LXNoYXJlZDogZ2VuLWRhcnQvc2hhcmVkL2xpYi9zaGFyZWQuZGFydAorCWNkIGdlbi1kYXJ0L3NoYXJlZDsgJHtEQVJUUFVCfSBnZXQKKworcHViLWdldC1jbGllbnQ6CisJY2QgY2xpZW50OyAke0RBUlRQVUJ9IGdldAorCitwdWItZ2V0LWNvbnNvbGUtY2xpZW50OgorCWNkIGNvbnNvbGVfY2xpZW50OyAke0RBUlRQVUJ9IGdldAorCitwdWItZ2V0LXNlcnZlcjoKKwljZCBzZXJ2ZXI7ICR7REFSVFBVQn0gZ2V0CisKK3R1dG9yaWFsc2VydmVyOiBwdWItZ2V0LWdlbiBwdWItZ2V0LXNlcnZlcgorCSR7REFSVH0gc2VydmVyL2Jpbi9tYWluLmRhcnQKKwordHV0b3JpYWxjbGllbnQ6IHB1Yi1nZXQtZ2VuIHB1Yi1nZXQtY2xpZW50CisJY2QgY2xpZW50OyAke0RBUlRQVUJ9IHNlcnZlCisKK3R1dG9yaWFsY29uc29sZWNsaWVudDogcHViLWdldC1jb25zb2xlLWNsaWVudAorCSR7REFSVH0gY29uc29sZV9jbGllbnQvYmluL21haW4uZGFydAorCitFWFRSQV9ESVNUID0gXAorCWNsaWVudC93ZWIvY2xpZW50LmRhcnQgXAorCWNsaWVudC93ZWIvaW5kZXguaHRtbCBcCisJY2xpZW50L3dlYi9zdHlsZXMuY3NzIFwKKwljbGllbnQvcHVic3BlYy55YW1sIFwKKwljb25zb2xlX2NsaWVudC9iaW4vbWFpbi5kYXJ0IFwKKwljb25zb2xlX2NsaWVudC9wdWJzcGVjLnlhbWwgXAorCXNlcnZlci9iaW4vbWFpbi5kYXJ0IFwKKwlzZXJ2ZXIvcHVic3BlYy55YW1sIFwKKwljb25zb2xlX2NsaWVudC8uYW5hbHlzaXNfb3B0aW9ucyBcCisJY2xpZW50Ly5hbmFseXNpc19vcHRpb25zIFwKKwlzZXJ2ZXIvLmFuYWx5c2lzX29wdGlvbnMgXAorCWJ1aWxkLnNoCmRpZmYgLS1naXQgYS90dXRvcmlhbC9kYXJ0L2J1aWxkLnNoIGIvdHV0b3JpYWwvZGFydC9idWlsZC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWJlMDRhCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZGFydC9idWlsZC5zaApAQCAtMCwwICsxLDU2IEBACisjIS9iaW4vc2gKKworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICdMaWNlbnNlJyk7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICdBUyBJUycgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorCitzZXQgLWU7CitybSAtciBnZW4tZGFydCB8fCB0cnVlOworCit0aHJpZnQgLS1nZW4gZGFydCAuLi9zaGFyZWQudGhyaWZ0OworY2QgZ2VuLWRhcnQvc2hhcmVkOworcHViIGdldDsKK2NkIC4uLy4uOworCit0aHJpZnQgLS1nZW4gZGFydCAuLi90dXRvcmlhbC50aHJpZnQ7CitjZCBnZW4tZGFydC90dXRvcmlhbDsKK3B1YiBnZXQ7CitjZCAuLi8uLjsKKworY2QgY2xpZW50OworcHViIGdldDsKK2NkIC4uOworCitjZCBjb25zb2xlX2NsaWVudDsKK3B1YiBnZXQ7CitjZCAuLjsKKworY2Qgc2VydmVyOworcHViIGdldDsKK2NkIC4uOworCitkYXJ0Zm10IC13IGdlbi1kYXJ0OworCitlY2hvICJcbkVuam95IHRoZSBEYXJ0IHR1dG9yaWFsISI7CitlY2hvICJcblRvIHJ1biB0aGUgc2VydmVyOiI7CitlY2hvICI+IGRhcnQgc2VydmVyL2Jpbi9tYWluLmRhcnQiOworZWNobyAiXG5UbyBydW4gdGhlIGNsaWVudDoiOworZWNobyAiIyBTZXJ2ZSB0aGUgYXBwIGZyb20gdGhlIGNsaWVudCBkaXJlY3RvcnkgYW5kIHZpZXcgaW4gYSBicm93c2VyIjsKK2VjaG8gIj4gY2QgY2xpZW50OyI7CitlY2hvICI+IHB1YiBzZXJ2ZTsiOworZWNobyAiXG5UbyBydW4gdGhlIGNvbnNvbGUgY2xpZW50OiI7CitlY2hvICI+IGRhcnQgY29uc29sZV9jbGllbnQvYmluL21haW4uZGFydCI7CitlY2hvICIiOwpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZGFydC9jbGllbnQvLmFuYWx5c2lzX29wdGlvbnMgYi90dXRvcmlhbC9kYXJ0L2NsaWVudC8uYW5hbHlzaXNfb3B0aW9ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTBkNGM1Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZGFydC9jbGllbnQvLmFuYWx5c2lzX29wdGlvbnMKQEAgLTAsMCArMSwyIEBACithbmFseXplcjoKKyAgc3Ryb25nLW1vZGU6IHRydWUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2RhcnQvY2xpZW50L3B1YnNwZWMueWFtbCBiL3R1dG9yaWFsL2RhcnQvY2xpZW50L3B1YnNwZWMueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGVkZTE0Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZGFydC9jbGllbnQvcHVic3BlYy55YW1sCkBAIC0wLDAgKzEsMzQgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAnTGljZW5zZScpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAnQVMgSVMnIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKworbmFtZTogdHV0b3JpYWxfY2xpZW50Cit2ZXJzaW9uOiAxLjAuMAorZGVzY3JpcHRpb246IEEgRGFydCBjbGllbnQgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFwYWNoZSBUaHJpZnQgdHV0b3JpYWwKK2F1dGhvcjogQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+Citob21lcGFnZTogaHR0cDovL3RocmlmdC5hcGFjaGUub3JnCisKK2Vudmlyb25tZW50OgorICBzZGs6ICI+PTEuMTMuMCA8Mi4wLjAiCisKK2RlcGVuZGVuY2llczoKKyAgYnJvd3NlcjogXjAuMTAuMAorICBzaGFyZWQ6CisgICAgcGF0aDogLi4vZ2VuLWRhcnQvc2hhcmVkCisgIHRocmlmdDoKKyAgICBwYXRoOiAuLi8uLi8uLi9saWIvZGFydAorICB0dXRvcmlhbDoKKyAgICBwYXRoOiAuLi9nZW4tZGFydC90dXRvcmlhbApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZGFydC9jbGllbnQvd2ViL2NsaWVudC5kYXJ0IGIvdHV0b3JpYWwvZGFydC9jbGllbnQvd2ViL2NsaWVudC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMDJkMGQKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9kYXJ0L2NsaWVudC93ZWIvY2xpZW50LmRhcnQKQEAgLTAsMCArMSwyNzggQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbXBvcnQgJ2RhcnQ6aHRtbCc7CisKK2ltcG9ydCAncGFja2FnZTp0aHJpZnQvdGhyaWZ0LmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOnRocmlmdC90aHJpZnRfYnJvd3Nlci5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTpzaGFyZWQvc2hhcmVkLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOnR1dG9yaWFsL3R1dG9yaWFsLmRhcnQnOworCisvLy8gQWRhcHRlZCBmcm9tIHRoZSBBUzMgdHV0b3JpYWwKK3ZvaWQgbWFpbigpIHsKKyAgbmV3IENhbGN1bGF0b3JVSShxdWVyeVNlbGVjdG9yKCcjb3V0cHV0JykpLnN0YXJ0KCk7Cit9CisKK2NsYXNzIENhbGN1bGF0b3JVSSB7CisgIGZpbmFsIERpdkVsZW1lbnQgb3V0cHV0OworCisgIENhbGN1bGF0b3JVSSh0aGlzLm91dHB1dCk7CisKKyAgVFRyYW5zcG9ydCBfdHJhbnNwb3J0OworICBDYWxjdWxhdG9yIF9jYWxjdWxhdG9yQ2xpZW50OworCisgIHZvaWQgc3RhcnQoKSB7CisgICAgX2J1aWxkSW50ZXJmYWNlKCk7CisgICAgX2luaXRDb25uZWN0aW9uKCk7CisgIH0KKworICB2b2lkIF92YWxpZGF0ZSgpIHsKKyAgICBpZiAoIV90cmFuc3BvcnQuaXNPcGVuKSB7CisgICAgICB3aW5kb3cuYWxlcnQoIlRoZSB0cmFuc3BvcnQgaXMgbm90IG9wZW4hIik7CisgICAgfQorICB9CisKKyAgdm9pZCBfaW5pdENvbm5lY3Rpb24oKSB7CisgICAgX3RyYW5zcG9ydCA9IG5ldyBUQXN5bmNDbGllbnRTb2NrZXRUcmFuc3BvcnQoCisgICAgICAgIG5ldyBUV2ViU29ja2V0KFVyaS5wYXJzZSgnd3M6Ly8xMjcuMC4wLjE6OTA5MC93cycpKSwKKyAgICAgICAgbmV3IFRNZXNzYWdlUmVhZGVyKG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpKTsKKyAgICBUUHJvdG9jb2wgcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKF90cmFuc3BvcnQpOworICAgIF90cmFuc3BvcnQub3BlbigpOworCisgICAgX2NhbGN1bGF0b3JDbGllbnQgPSBuZXcgQ2FsY3VsYXRvckNsaWVudChwcm90b2NvbCk7CisgIH0KKworICB2b2lkIF9idWlsZEludGVyZmFjZSgpIHsKKyAgICBvdXRwdXQuY2hpbGRyZW4uZm9yRWFjaCgoZSkgeworICAgICAgZS5yZW1vdmUoKTsKKyAgICB9KTsKKworICAgIF9idWlsZFBpbmdDb21wb25lbnQoKTsKKworICAgIF9idWlsZEFkZENvbXBvbmVudCgpOworCisgICAgX2J1aWxkQ2FsY3VsYXRvckNvbXBvbmVudCgpOworCisgICAgX2J1aWxkR2V0U3RydWN0Q29tcG9uZW50KCk7CisgIH0KKworICB2b2lkIF9idWlsZFBpbmdDb21wb25lbnQoKSB7CisgICAgb3V0cHV0LmFwcGVuZChuZXcgSGVhZGluZ0VsZW1lbnQuaDMoKS4udGV4dCA9ICJQaW5nIik7CisgICAgQnV0dG9uRWxlbWVudCBwaW5nQnV0dG9uID0gbmV3IEJ1dHRvbkVsZW1lbnQoKQorICAgICAgLi50ZXh0ID0gIlBJTkciCisgICAgICAuLm9uQ2xpY2subGlzdGVuKF9vblBpbmdDbGljayk7CisgICAgb3V0cHV0LmFwcGVuZChwaW5nQnV0dG9uKTsKKyAgfQorCisgIHZvaWQgX29uUGluZ0NsaWNrKE1vdXNlRXZlbnQgZSkgeworICAgIF92YWxpZGF0ZSgpOworCisgICAgX2NhbGN1bGF0b3JDbGllbnQucGluZygpOworICB9CisKKyAgdm9pZCBfYnVpbGRBZGRDb21wb25lbnQoKSB7CisgICAgb3V0cHV0LmFwcGVuZChuZXcgSGVhZGluZ0VsZW1lbnQuaDMoKS4udGV4dCA9ICJBZGQiKTsKKyAgICBJbnB1dEVsZW1lbnQgbnVtMSA9IG5ldyBJbnB1dEVsZW1lbnQoKQorICAgICAgLi5pZCA9ICJhZGQxIgorICAgICAgLi50eXBlID0gIm51bWJlciIKKyAgICAgIC4uc3R5bGUuZm9udFNpemUgPSAiMTRweCIKKyAgICAgIC4uc3R5bGUud2lkdGggPSAiNTBweCI7CisgICAgb3V0cHV0LmFwcGVuZChudW0xKTsKKyAgICBTcGFuRWxlbWVudCBvcCA9IG5ldyBTcGFuRWxlbWVudCgpCisgICAgICAuLnRleHQgPSAiKyIKKyAgICAgIC4uc3R5bGUuZm9udFNpemUgPSAiMTRweCIKKyAgICAgIC4uc3R5bGUubWFyZ2luTGVmdCA9ICIxMHB4IjsKKyAgICBvdXRwdXQuYXBwZW5kKG9wKTsKKyAgICBJbnB1dEVsZW1lbnQgbnVtMiA9IG5ldyBJbnB1dEVsZW1lbnQoKQorICAgICAgLi5pZCA9ICJhZGQyIgorICAgICAgLi50eXBlID0gIm51bWJlciIKKyAgICAgIC4uc3R5bGUuZm9udFNpemUgPSAiMTRweCIKKyAgICAgIC4uc3R5bGUud2lkdGggPSAiNTBweCIKKyAgICAgIC4uc3R5bGUubWFyZ2luTGVmdCA9ICIxMHB4IjsKKyAgICBvdXRwdXQuYXBwZW5kKG51bTIpOworICAgIEJ1dHRvbkVsZW1lbnQgYWRkQnV0dG9uID0gbmV3IEJ1dHRvbkVsZW1lbnQoKQorICAgICAgLi50ZXh0ID0gIj0iCisgICAgICAuLnN0eWxlLmZvbnRTaXplID0gIjE0cHgiCisgICAgICAuLnN0eWxlLm1hcmdpbkxlZnQgPSAiMTBweCIKKyAgICAgIC4ub25DbGljay5saXN0ZW4oX29uQWRkQ2xpY2spOworICAgIG91dHB1dC5hcHBlbmQoYWRkQnV0dG9uKTsKKyAgICBTcGFuRWxlbWVudCByZXN1bHQgPSBuZXcgU3BhbkVsZW1lbnQoKQorICAgICAgLi5pZCA9ICJhZGRSZXN1bHQiCisgICAgICAuLnN0eWxlLmZvbnRTaXplID0gIjE0cHgiCisgICAgICAuLnN0eWxlLm1hcmdpbkxlZnQgPSAiMTBweCI7CisgICAgb3V0cHV0LmFwcGVuZChyZXN1bHQpOworICB9CisKKyAgdm9pZCBfb25BZGRDbGljayhNb3VzZUV2ZW50IGUpIHsKKyAgICBfdmFsaWRhdGUoKTsKKworICAgIElucHV0RWxlbWVudCBudW0xID0gcXVlcnlTZWxlY3RvcigiI2FkZDEiKTsKKyAgICBJbnB1dEVsZW1lbnQgbnVtMiA9IHF1ZXJ5U2VsZWN0b3IoIiNhZGQyIik7CisgICAgU3BhbkVsZW1lbnQgcmVzdWx0ID0gcXVlcnlTZWxlY3RvcigiI2FkZFJlc3VsdCIpOworCisgICAgX2NhbGN1bGF0b3JDbGllbnQKKyAgICAgICAgLmFkZChpbnQucGFyc2UobnVtMS52YWx1ZSksIGludC5wYXJzZShudW0yLnZhbHVlKSkKKyAgICAgICAgLnRoZW4oKGludCBuKSB7CisgICAgICByZXN1bHQudGV4dCA9ICIkbiI7CisgICAgfSk7CisgIH0KKworICB2b2lkIF9idWlsZENhbGN1bGF0b3JDb21wb25lbnQoKSB7CisgICAgb3V0cHV0LmFwcGVuZChuZXcgSGVhZGluZ0VsZW1lbnQuaDMoKS4udGV4dCA9ICJDYWxjdWxhdG9yIik7CisgICAgSW5wdXRFbGVtZW50IG51bTEgPSBuZXcgSW5wdXRFbGVtZW50KCkKKyAgICAgIC4uaWQgPSAiY2FsYzEiCisgICAgICAuLnR5cGUgPSAibnVtYmVyIgorICAgICAgLi5zdHlsZS5mb250U2l6ZSA9ICIxNHB4IgorICAgICAgLi5zdHlsZS53aWR0aCA9ICI1MHB4IjsKKyAgICBvdXRwdXQuYXBwZW5kKG51bTEpOworICAgIFNlbGVjdEVsZW1lbnQgb3AgPSBuZXcgU2VsZWN0RWxlbWVudCgpCisgICAgICAuLmlkID0gImNhbGNPcCIKKyAgICAgIC4ubXVsdGlwbGUgPSBmYWxzZQorICAgICAgLi5zZWxlY3RlZEluZGV4ID0gMAorICAgICAgLi5zdHlsZS5mb250U2l6ZSA9ICIxNnB4IgorICAgICAgLi5zdHlsZS5tYXJnaW5MZWZ0ID0gIjEwcHgiCisgICAgICAuLnN0eWxlLndpZHRoID0gIjUwcHgiOworICAgIE9wdGlvbkVsZW1lbnQgYWRkT3AgPSBuZXcgT3B0aW9uRWxlbWVudCgpCisgICAgICAuLnRleHQgPSAiKyIKKyAgICAgIC4udmFsdWUgPSBPcGVyYXRpb24uQURELnRvU3RyaW5nKCk7CisgICAgb3AuYWRkKGFkZE9wLCAwKTsKKyAgICBPcHRpb25FbGVtZW50IHN1YnRyYWN0T3AgPSBuZXcgT3B0aW9uRWxlbWVudCgpCisgICAgICAuLnRleHQgPSAiLSIKKyAgICAgIC4udmFsdWUgPSBPcGVyYXRpb24uU1VCVFJBQ1QudG9TdHJpbmcoKTsKKyAgICBvcC5hZGQoc3VidHJhY3RPcCwgMSk7CisgICAgT3B0aW9uRWxlbWVudCBtdWx0aXBseU9wID0gbmV3IE9wdGlvbkVsZW1lbnQoKQorICAgICAgLi50ZXh0ID0gIioiCisgICAgICAuLnZhbHVlID0gT3BlcmF0aW9uLk1VTFRJUExZLnRvU3RyaW5nKCk7CisgICAgb3AuYWRkKG11bHRpcGx5T3AsIDIpOworICAgIE9wdGlvbkVsZW1lbnQgZGl2aWRlT3AgPSBuZXcgT3B0aW9uRWxlbWVudCgpCisgICAgICAuLnRleHQgPSAiLyIKKyAgICAgIC4udmFsdWUgPSBPcGVyYXRpb24uRElWSURFLnRvU3RyaW5nKCk7CisgICAgb3AuYWRkKGRpdmlkZU9wLCAzKTsKKyAgICBvdXRwdXQuYXBwZW5kKG9wKTsKKyAgICBJbnB1dEVsZW1lbnQgbnVtMiA9IG5ldyBJbnB1dEVsZW1lbnQoKQorICAgICAgLi5pZCA9ICJjYWxjMiIKKyAgICAgIC4udHlwZSA9ICJudW1iZXIiCisgICAgICAuLnN0eWxlLmZvbnRTaXplID0gIjE0cHgiCisgICAgICAuLnN0eWxlLndpZHRoID0gIjUwcHgiCisgICAgICAuLnN0eWxlLm1hcmdpbkxlZnQgPSAiMTBweCI7CisgICAgb3V0cHV0LmFwcGVuZChudW0yKTsKKyAgICBCdXR0b25FbGVtZW50IGNhbGNCdXR0b24gPSBuZXcgQnV0dG9uRWxlbWVudCgpCisgICAgICAuLnRleHQgPSAiPSIKKyAgICAgIC4uc3R5bGUuZm9udFNpemUgPSAiMTRweCIKKyAgICAgIC4uc3R5bGUubWFyZ2luTGVmdCA9ICIxMHB4IgorICAgICAgLi5vbkNsaWNrLmxpc3Rlbihfb25DYWxjQ2xpY2spOworICAgIG91dHB1dC5hcHBlbmQoY2FsY0J1dHRvbik7CisgICAgU3BhbkVsZW1lbnQgcmVzdWx0ID0gbmV3IFNwYW5FbGVtZW50KCkKKyAgICAgIC4uaWQgPSAiY2FsY1Jlc3VsdCIKKyAgICAgIC4uc3R5bGUuZm9udFNpemUgPSAiMTRweCIKKyAgICAgIC4uc3R5bGUubWFyZ2luTGVmdCA9ICIxMHB4IjsKKyAgICBvdXRwdXQuYXBwZW5kKHJlc3VsdCk7CisgICAgb3V0cHV0LmFwcGVuZChuZXcgQlJFbGVtZW50KCkpOworICAgIG91dHB1dC5hcHBlbmQobmV3IEJSRWxlbWVudCgpKTsKKyAgICBMYWJlbEVsZW1lbnQgbG9nSWRMYWJlbCA9IG5ldyBMYWJlbEVsZW1lbnQoKQorICAgICAgLi50ZXh0ID0gIkxvZyBJRDoiCisgICAgICAuLnN0eWxlLmZvbnRTaXplID0gIjE0cHgiOworICAgIG91dHB1dC5hcHBlbmQobG9nSWRMYWJlbCk7CisgICAgSW5wdXRFbGVtZW50IGxvZ0lkID0gbmV3IElucHV0RWxlbWVudCgpCisgICAgICAuLmlkID0gImxvZ0lkIgorICAgICAgLi50eXBlID0gIm51bWJlciIKKyAgICAgIC4udmFsdWUgPSAiMSIKKyAgICAgIC4uc3R5bGUuZm9udFNpemUgPSAiMTRweCIKKyAgICAgIC4uc3R5bGUud2lkdGggPSAiNTBweCIKKyAgICAgIC4uc3R5bGUubWFyZ2luTGVmdCA9ICIxMHB4IjsKKyAgICBvdXRwdXQuYXBwZW5kKGxvZ0lkKTsKKyAgICBMYWJlbEVsZW1lbnQgY29tbWVudExhYmVsID0gbmV3IExhYmVsRWxlbWVudCgpCisgICAgICAuLnRleHQgPSAiQ29tbWVudDoiCisgICAgICAuLnN0eWxlLmZvbnRTaXplID0gIjE0cHgiCisgICAgICAuLnN0eWxlLm1hcmdpbkxlZnQgPSAiMTBweCI7CisgICAgb3V0cHV0LmFwcGVuZChjb21tZW50TGFiZWwpOworICAgIElucHV0RWxlbWVudCBjb21tZW50ID0gbmV3IElucHV0RWxlbWVudCgpCisgICAgICAuLmlkID0gImNvbW1lbnQiCisgICAgICAuLnN0eWxlLmZvbnRTaXplID0gIjE0cHgiCisgICAgICAuLnN0eWxlLndpZHRoID0gIjEwMHB4IgorICAgICAgLi5zdHlsZS5tYXJnaW5MZWZ0ID0gIjEwcHgiOworICAgIG91dHB1dC5hcHBlbmQoY29tbWVudCk7CisgIH0KKworICB2b2lkIF9vbkNhbGNDbGljayhNb3VzZUV2ZW50IGUpIHsKKyAgICBfdmFsaWRhdGUoKTsKKworICAgIElucHV0RWxlbWVudCBudW0xID0gcXVlcnlTZWxlY3RvcigiI2NhbGMxIik7CisgICAgSW5wdXRFbGVtZW50IG51bTIgPSBxdWVyeVNlbGVjdG9yKCIjY2FsYzIiKTsKKyAgICBTZWxlY3RFbGVtZW50IG9wID0gcXVlcnlTZWxlY3RvcigiI2NhbGNPcCIpOworICAgIFNwYW5FbGVtZW50IHJlc3VsdCA9IHF1ZXJ5U2VsZWN0b3IoIiNjYWxjUmVzdWx0Iik7CisgICAgSW5wdXRFbGVtZW50IGxvZ0lkID0gcXVlcnlTZWxlY3RvcigiI2xvZ0lkIik7CisgICAgSW5wdXRFbGVtZW50IGNvbW1lbnQgPSBxdWVyeVNlbGVjdG9yKCIjY29tbWVudCIpOworCisgICAgaW50IGxvZ0lkVmFsdWUgPSBpbnQucGFyc2UobG9nSWQudmFsdWUpOworICAgIGxvZ0lkLnZhbHVlID0gKGxvZ0lkVmFsdWUgKyAxKS50b1N0cmluZygpOworCisgICAgV29yayB3b3JrID0gbmV3IFdvcmsoKTsKKyAgICB3b3JrLm51bTEgPSBpbnQucGFyc2UobnVtMS52YWx1ZSk7CisgICAgd29yay5udW0yID0gaW50LnBhcnNlKG51bTIudmFsdWUpOworICAgIHdvcmsub3AgPSBpbnQucGFyc2Uob3Aub3B0aW9uc1tvcC5zZWxlY3RlZEluZGV4XS52YWx1ZSk7CisgICAgd29yay5jb21tZW50ID0gY29tbWVudC52YWx1ZTsKKworICAgIF9jYWxjdWxhdG9yQ2xpZW50LmNhbGN1bGF0ZShsb2dJZFZhbHVlLCB3b3JrKS50aGVuKChpbnQgbikgeworICAgICAgcmVzdWx0LnRleHQgPSAiJG4iOworICAgIH0pOworICB9CisKKyAgdm9pZCBfYnVpbGRHZXRTdHJ1Y3RDb21wb25lbnQoKSB7CisgICAgb3V0cHV0LmFwcGVuZChuZXcgSGVhZGluZ0VsZW1lbnQuaDMoKS4udGV4dCA9ICJHZXQgU3RydWN0Iik7CisgICAgTGFiZWxFbGVtZW50IGxvZ0lkTGFiZWwgPSBuZXcgTGFiZWxFbGVtZW50KCkKKyAgICAgIC4udGV4dCA9ICJTdHJ1Y3QgS2V5OiIKKyAgICAgIC4uc3R5bGUuZm9udFNpemUgPSAiMTRweCI7CisgICAgb3V0cHV0LmFwcGVuZChsb2dJZExhYmVsKTsKKyAgICBJbnB1dEVsZW1lbnQgbG9nSWQgPSBuZXcgSW5wdXRFbGVtZW50KCkKKyAgICAgIC4uaWQgPSAic3RydWN0S2V5IgorICAgICAgLi50eXBlID0gIm51bWJlciIKKyAgICAgIC4udmFsdWUgPSAiMSIKKyAgICAgIC4uc3R5bGUuZm9udFNpemUgPSAiMTRweCIKKyAgICAgIC4uc3R5bGUud2lkdGggPSAiNTBweCIKKyAgICAgIC4uc3R5bGUubWFyZ2luTGVmdCA9ICIxMHB4IjsKKyAgICBvdXRwdXQuYXBwZW5kKGxvZ0lkKTsKKyAgICBCdXR0b25FbGVtZW50IGdldFN0cnVjdEJ1dHRvbiA9IG5ldyBCdXR0b25FbGVtZW50KCkKKyAgICAgIC4udGV4dCA9ICJHRVQiCisgICAgICAuLnN0eWxlLmZvbnRTaXplID0gIjE0cHgiCisgICAgICAuLnN0eWxlLm1hcmdpbkxlZnQgPSAiMTBweCIKKyAgICAgIC4ub25DbGljay5saXN0ZW4oX29uR2V0U3RydWN0Q2xpY2spOworICAgIG91dHB1dC5hcHBlbmQoZ2V0U3RydWN0QnV0dG9uKTsKKyAgICBvdXRwdXQuYXBwZW5kKG5ldyBCUkVsZW1lbnQoKSk7CisgICAgb3V0cHV0LmFwcGVuZChuZXcgQlJFbGVtZW50KCkpOworICAgIFRleHRBcmVhRWxlbWVudCByZXN1bHQgPSBuZXcgVGV4dEFyZWFFbGVtZW50KCkKKyAgICAgIC4uaWQgPSAiZ2V0U3RydWN0UmVzdWx0IgorICAgICAgLi5zdHlsZS5mb250U2l6ZSA9ICIxNHB4IgorICAgICAgLi5zdHlsZS53aWR0aCA9ICIzMDBweCIKKyAgICAgIC4uc3R5bGUuaGVpZ2h0ID0gIjUwcHgiCisgICAgICAuLnN0eWxlLm1hcmdpbkxlZnQgPSAiMTBweCI7CisgICAgb3V0cHV0LmFwcGVuZChyZXN1bHQpOworICB9CisKKyAgdm9pZCBfb25HZXRTdHJ1Y3RDbGljayhNb3VzZUV2ZW50IGUpIHsKKyAgICBfdmFsaWRhdGUoKTsKKworICAgIElucHV0RWxlbWVudCBzdHJ1Y3RLZXkgPSBxdWVyeVNlbGVjdG9yKCIjc3RydWN0S2V5Iik7CisgICAgVGV4dEFyZWFFbGVtZW50IHJlc3VsdCA9IHF1ZXJ5U2VsZWN0b3IoIiNnZXRTdHJ1Y3RSZXN1bHQiKTsKKworICAgIF9jYWxjdWxhdG9yQ2xpZW50CisgICAgICAgIC5nZXRTdHJ1Y3QoaW50LnBhcnNlKHN0cnVjdEtleS52YWx1ZSkpCisgICAgICAgIC50aGVuKChTaGFyZWRTdHJ1Y3QgcykgeworICAgICAgcmVzdWx0LnRleHQgPSAiJHtzLnRvU3RyaW5nKCl9IjsKKyAgICB9KTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZGFydC9jbGllbnQvd2ViL2luZGV4Lmh0bWwgYi90dXRvcmlhbC9kYXJ0L2NsaWVudC93ZWIvaW5kZXguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGIxODRlCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZGFydC9jbGllbnQvd2ViL2luZGV4Lmh0bWwKQEAgLTAsMCArMSwzNiBAQAorPCEtLQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IURPQ1RZUEUgaHRtbD4KKzxodG1sPgorPGhlYWQ+CisgICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgorICAgIDxtZXRhIGh0dHAtZXF1aXY9IlgtVUEtQ29tcGF0aWJsZSIgY29udGVudD0iSUU9ZWRnZSI+CisgICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAiPgorICAgIDx0aXRsZT5UaHJpZnQgVHV0b3JpYWw8L3RpdGxlPgorICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0ic3R5bGVzLmNzcyI+CisgICAgPHNjcmlwdCBhc3luYyBzcmM9ImNsaWVudC5kYXJ0IiB0eXBlPSJhcHBsaWNhdGlvbi9kYXJ0Ij48L3NjcmlwdD4KKyAgICA8c2NyaXB0IGFzeW5jIHNyYz0icGFja2FnZXMvYnJvd3Nlci9kYXJ0LmpzIj48L3NjcmlwdD4KKzwvaGVhZD4KKworPGJvZHk+CisKKyAgPGRpdiBpZD0ib3V0cHV0Ij48L2Rpdj4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZGFydC9jbGllbnQvd2ViL3N0eWxlcy5jc3MgYi90dXRvcmlhbC9kYXJ0L2NsaWVudC93ZWIvc3R5bGVzLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDMxNTAyCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZGFydC9jbGllbnQvd2ViL3N0eWxlcy5jc3MKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworQGltcG9ydCB1cmwoaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PVJvYm90byk7CisKK2h0bWwsIGJvZHkgeworICAgIHdpZHRoOiAxMDAlOworICAgIGhlaWdodDogMTAwJTsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMTBweDsKKyAgICBmb250LWZhbWlseTogJ1JvYm90bycsIHNhbnMtc2VyaWY7Cit9CisKK2gzIHsKKyAgICBib3JkZXItYm90dG9tOiBzb2xpZDsKKyAgICBib3JkZXItd2lkdGg6IHRoaW47CisgICAgcGFkZGluZy10b3A6IDIwcHg7Cit9CmRpZmYgLS1naXQgYS90dXRvcmlhbC9kYXJ0L2NvbnNvbGVfY2xpZW50Ly5hbmFseXNpc19vcHRpb25zIGIvdHV0b3JpYWwvZGFydC9jb25zb2xlX2NsaWVudC8uYW5hbHlzaXNfb3B0aW9ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTBkNGM1Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZGFydC9jb25zb2xlX2NsaWVudC8uYW5hbHlzaXNfb3B0aW9ucwpAQCAtMCwwICsxLDIgQEAKK2FuYWx5emVyOgorICBzdHJvbmctbW9kZTogdHJ1ZQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZGFydC9jb25zb2xlX2NsaWVudC9iaW4vbWFpbi5kYXJ0IGIvdHV0b3JpYWwvZGFydC9jb25zb2xlX2NsaWVudC9iaW4vbWFpbi5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkYTIwNmEKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9kYXJ0L2NvbnNvbGVfY2xpZW50L2Jpbi9tYWluLmRhcnQKQEAgLTAsMCArMSwxNDkgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbXBvcnQgJ2RhcnQ6YXN5bmMnOworaW1wb3J0ICdkYXJ0OmlvJzsKKworaW1wb3J0ICdwYWNrYWdlOmFyZ3MvYXJncy5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTpsb2dnaW5nL2xvZ2dpbmcuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6dGhyaWZ0L3RocmlmdC5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTp0aHJpZnQvdGhyaWZ0X2NvbnNvbGUuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6dHV0b3JpYWwvdHV0b3JpYWwuZGFydCc7CisKK1RUcmFuc3BvcnQgX3RyYW5zcG9ydDsKK0NhbGN1bGF0b3IgX2NhbGN1bGF0b3I7CitpbnQgbG9naWQgPSAwOworCitjb25zdCBNYXA8U3RyaW5nLCBpbnQ+IG9wZXJhdGlvbkxvb2t1cCA9IGNvbnN0IHsKKyAgJysnOiBPcGVyYXRpb24uQURELAorICAnLSc6IE9wZXJhdGlvbi5TVUJUUkFDVCwKKyAgJyonOiBPcGVyYXRpb24uTVVMVElQTFksCisgICcvJzogT3BlcmF0aW9uLkRJVklERQorfTsKKworbWFpbihMaXN0PFN0cmluZz4gYXJncykgeworICBMb2dnZXIucm9vdC5sZXZlbCA9IExldmVsLkFMTDsKKyAgTG9nZ2VyLnJvb3Qub25SZWNvcmQubGlzdGVuKChMb2dSZWNvcmQgcmVjKSB7CisgICAgcHJpbnQoJyR7cmVjLmxldmVsLm5hbWV9OiAke3JlYy50aW1lfTogJHtyZWMubWVzc2FnZX0nKTsKKyAgfSk7CisKKyAgdmFyIHBhcnNlciA9IG5ldyBBcmdQYXJzZXIoKTsKKyAgcGFyc2VyLmFkZE9wdGlvbigncG9ydCcsIGRlZmF1bHRzVG86ICc5MDkwJywgaGVscDogJ1RoZSBwb3J0IHRvIGNvbm5lY3QgdG8nKTsKKworICBBcmdSZXN1bHRzIHJlc3VsdHM7CisgIHRyeSB7CisgICAgcmVzdWx0cyA9IHBhcnNlci5wYXJzZShhcmdzKTsKKyAgfSBjYXRjaCAoZSkgeworICAgIHJlc3VsdHMgPSBudWxsOworICB9CisKKyAgaWYgKHJlc3VsdHMgPT0gbnVsbCkgeworICAgIHByaW50KHBhcnNlci51c2FnZSk7CisgICAgZXhpdCgwKTsKKyAgfQorCisgIGludCBwb3J0ID0gaW50LnBhcnNlKHJlc3VsdHNbJ3BvcnQnXSk7CisKKyAgX2luaXRDb25uZWN0aW9uKHBvcnQpLnRoZW4oKF8pID0+IF9ydW4oKSk7Cit9CisKK0Z1dHVyZSBfaW5pdENvbm5lY3Rpb24oaW50IHBvcnQpIGFzeW5jIHsKKyAgdmFyIHNvY2tldCA9IGF3YWl0IFNvY2tldC5jb25uZWN0KCcxMjcuMC4wLjEnLCBwb3J0KTsKKyAgX3RyYW5zcG9ydCA9IG5ldyBUQXN5bmNDbGllbnRTb2NrZXRUcmFuc3BvcnQoCisgICAgICBuZXcgVFRjcFNvY2tldChzb2NrZXQpLCBuZXcgVE1lc3NhZ2VSZWFkZXIobmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkpOworICBUUHJvdG9jb2wgcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKF90cmFuc3BvcnQpOworICBhd2FpdCBfdHJhbnNwb3J0Lm9wZW4oKTsKKworICBfY2FsY3VsYXRvciA9IG5ldyBDYWxjdWxhdG9yQ2xpZW50KHByb3RvY29sKTsKK30KKworRnV0dXJlIF9ydW4oKSBhc3luYyB7CisgIF9oZWxwKCk7CisKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBzdGRvdXQud3JpdGUoIj4gIik7CisgICAgdmFyIGlucHV0ID0gc3RkaW4ucmVhZExpbmVTeW5jKCk7CisgICAgdmFyIHBhcnRzID0gaW5wdXQuc3BsaXQoJyAnKTsKKyAgICB2YXIgY29tbWFuZCA9IHBhcnRzWzBdOworICAgIHZhciBhcmdzID0gcGFydHMubGVuZ3RoID4gMSA/IHBhcnRzLnN1Ymxpc3QoMSkgOiBbXTsKKworICAgIHN3aXRjaCAoY29tbWFuZCkgeworICAgICAgY2FzZSAncGluZyc6CisgICAgICAgIGF3YWl0IF9waW5nKCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlICdhZGQnOgorICAgICAgICBhd2FpdCBfYWRkKGludC5wYXJzZShhcmdzWzBdKSwgaW50LnBhcnNlKGFyZ3NbMV0pKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgJ2NhbGMnOgorICAgICAgICBpbnQgb3AgPSBvcGVyYXRpb25Mb29rdXBbYXJnc1sxXV07CisgICAgICAgIGlmICghT3BlcmF0aW9uLlZBTElEX1ZBTFVFUy5jb250YWlucyhvcCkpIHsKKyAgICAgICAgICBzdGRvdXQud3JpdGVsbignVW5rbm93biBvcGVyYXRvciAke2FyZ3NbMV19Jyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICB2YXIgd29yayA9IG5ldyBXb3JrKCkKKyAgICAgICAgICAuLm51bTEgPSBpbnQucGFyc2UoYXJnc1swXSkKKyAgICAgICAgICAuLm9wID0gb3AKKyAgICAgICAgICAuLm51bTIgPSBpbnQucGFyc2UoYXJnc1syXSkKKyAgICAgICAgICAuLmNvbW1lbnQgPSBhcmdzLmxlbmd0aCA+IDMgPyBhcmdzWzNdIDogJyc7CisKKyAgICAgICAgYXdhaXQgX2NhbGMod29yayk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlICdzdHJ1Y3QnOgorICAgICAgICBhd2FpdCBfc3RydWN0KGludC5wYXJzZShhcmdzWzBdKSk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlICdoZWxwJzoKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIF9oZWxwKCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCit2b2lkIF9oZWxwKCkgeworICBzdGRvdXQud3JpdGVsbignQ29tbWFuZHM6Jyk7CisgIHN0ZG91dC53cml0ZWxuKCcgIGhlbHAnKTsKKyAgc3Rkb3V0LndyaXRlbG4oJyAgcGluZycpOworICBzdGRvdXQud3JpdGVsbignICBhZGQgeCB5Jyk7CisgIHN0ZG91dC53cml0ZWxuKCcgIGNhbGMgeCBvcCB5IFtjb21tZW50XScpOworICBzdGRvdXQud3JpdGVsbignICBzdHJ1Y3QgaWQnKTsKKyAgc3Rkb3V0LndyaXRlbG4oJycpOworfQorCitGdXR1cmUgX3BpbmcoKSBhc3luYyB7CisgIGF3YWl0IF9jYWxjdWxhdG9yLnBpbmcoKTsKKyAgc3Rkb3V0LndyaXRlbG4oJ3Bpbmcgc3VjY2VlZGVkJyk7Cit9CisKK0Z1dHVyZSBfYWRkKGludCB4LCBpbnQgeSkgYXN5bmMgeworICBpbnQgcmVzdWx0ID0gYXdhaXQgX2NhbGN1bGF0b3IuYWRkKHgsIHkpOworICBzdGRvdXQud3JpdGVsbignPSAkcmVzdWx0Jyk7Cit9CisKK0Z1dHVyZSBfY2FsYyhXb3JrIHdvcmspIGFzeW5jIHsKKyAgaW50IHJlc3VsdCA9IGF3YWl0IF9jYWxjdWxhdG9yLmNhbGN1bGF0ZShsb2dpZCsrLCB3b3JrKTsKKyAgc3Rkb3V0LndyaXRlbG4oJz0gJHJlc3VsdCcpOworfQorCitGdXR1cmUgX3N0cnVjdChpbnQga2V5KSBhc3luYyB7CisgIHZhciBzdHJ1Y3QgPSBhd2FpdCBfY2FsY3VsYXRvci5nZXRTdHJ1Y3Qoa2V5KTsKKyAgc3Rkb3V0LndyaXRlbG4oc3RydWN0LnRvU3RyaW5nKCkpOworfQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZGFydC9jb25zb2xlX2NsaWVudC9wdWJzcGVjLnlhbWwgYi90dXRvcmlhbC9kYXJ0L2NvbnNvbGVfY2xpZW50L3B1YnNwZWMueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzRlMjZmCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZGFydC9jb25zb2xlX2NsaWVudC9wdWJzcGVjLnlhbWwKQEAgLTAsMCArMSwzNiBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICdMaWNlbnNlJyk7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICdBUyBJUycgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorCituYW1lOiB0dXRvcmlhbF9jb25zb2xlX2NsaWVudAordmVyc2lvbjogMS4wLjAKK2Rlc2NyaXB0aW9uOiA+CisgIEEgRGFydCBjb25zb2xlIGNsaWVudCB0byBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQXBhY2hlIFRocmlmdCB0dXRvcmlhbAorYXV0aG9yOiBBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KK2hvbWVwYWdlOiBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcKKworZW52aXJvbm1lbnQ6CisgIHNkazogIj49MS4xMy4wIDwyLjAuMCIKKworZGVwZW5kZW5jaWVzOgorICBhcmdzOiBeMC4xMy4wCisgIGNvbGxlY3Rpb246IF4xLjEuMAorICBzaGFyZWQ6CisgICAgcGF0aDogLi4vZ2VuLWRhcnQvc2hhcmVkCisgIHRocmlmdDoKKyAgICBwYXRoOiAuLi8uLi8uLi9saWIvZGFydAorICB0dXRvcmlhbDoKKyAgICBwYXRoOiAuLi9nZW4tZGFydC90dXRvcmlhbApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZGFydC9zZXJ2ZXIvLmFuYWx5c2lzX29wdGlvbnMgYi90dXRvcmlhbC9kYXJ0L3NlcnZlci8uYW5hbHlzaXNfb3B0aW9ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTBkNGM1Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZGFydC9zZXJ2ZXIvLmFuYWx5c2lzX29wdGlvbnMKQEAgLTAsMCArMSwyIEBACithbmFseXplcjoKKyAgc3Ryb25nLW1vZGU6IHRydWUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2RhcnQvc2VydmVyL2Jpbi9tYWluLmRhcnQgYi90dXRvcmlhbC9kYXJ0L3NlcnZlci9iaW4vbWFpbi5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YWMzMGQKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9kYXJ0L3NlcnZlci9iaW4vbWFpbi5kYXJ0CkBAIC0wLDAgKzEsMTYzIEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworaW1wb3J0ICdkYXJ0OmFzeW5jJzsKK2ltcG9ydCAnZGFydDppbyc7CisKK2ltcG9ydCAncGFja2FnZTphcmdzL2FyZ3MuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6bG9nZ2luZy9sb2dnaW5nLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOnRocmlmdC90aHJpZnQuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6dGhyaWZ0L3RocmlmdF9jb25zb2xlLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOnR1dG9yaWFsL3R1dG9yaWFsLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOnNoYXJlZC9zaGFyZWQuZGFydCc7CisKK1RQcm90b2NvbCBfcHJvdG9jb2w7CitUUHJvY2Vzc29yIF9wcm9jZXNzb3I7CitXZWJTb2NrZXQgX3dlYlNvY2tldDsKKworbWFpbihMaXN0PFN0cmluZz4gYXJncykgeworICBMb2dnZXIucm9vdC5sZXZlbCA9IExldmVsLkFMTDsKKyAgTG9nZ2VyLnJvb3Qub25SZWNvcmQubGlzdGVuKChMb2dSZWNvcmQgcmVjKSB7CisgICAgcHJpbnQoJyR7cmVjLmxldmVsLm5hbWV9OiAke3JlYy50aW1lfTogJHtyZWMubWVzc2FnZX0nKTsKKyAgfSk7CisKKyAgdmFyIHBhcnNlciA9IG5ldyBBcmdQYXJzZXIoKTsKKyAgcGFyc2VyLmFkZE9wdGlvbigncG9ydCcsIGRlZmF1bHRzVG86ICc5MDkwJywgaGVscDogJ1RoZSBwb3J0IHRvIGxpc3RlbiBvbicpOworICBwYXJzZXIuYWRkT3B0aW9uKCd0eXBlJywKKyAgICAgIGRlZmF1bHRzVG86ICd3cycsCisgICAgICBhbGxvd2VkOiBbJ3dzJywgJ3RjcCddLAorICAgICAgaGVscDogJ1RoZSB0eXBlIG9mIHNvY2tldCcsCisgICAgICBhbGxvd2VkSGVscDogeyd3cyc6ICdXZWJTb2NrZXQnLCAndGNwJzogJ1RDUCBTb2NrZXQnfSk7CisKKyAgQXJnUmVzdWx0cyByZXN1bHRzOworICB0cnkgeworICAgIHJlc3VsdHMgPSBwYXJzZXIucGFyc2UoYXJncyk7CisgIH0gY2F0Y2ggKGUpIHsKKyAgICByZXN1bHRzID0gbnVsbDsKKyAgfQorCisgIGlmIChyZXN1bHRzID09IG51bGwpIHsKKyAgICBwcmludChwYXJzZXIudXNhZ2UpOworICAgIGV4aXQoMCk7CisgIH0KKworICBpbnQgcG9ydCA9IGludC5wYXJzZShyZXN1bHRzWydwb3J0J10pOworICBTdHJpbmcgc29ja2V0VHlwZSA9IHJlc3VsdHNbJ3R5cGUnXTsKKworICBpZiAoc29ja2V0VHlwZSA9PSAndGNwJykgeworICAgIF9ydW5UY3BTZXJ2ZXIocG9ydCk7CisgIH0gZWxzZSBpZiAoc29ja2V0VHlwZSA9PSAnd3MnKSB7CisgICAgX3J1bldlYlNvY2tldFNlcnZlcihwb3J0KTsKKyAgfQorfQorCitGdXR1cmUgX3J1bldlYlNvY2tldFNlcnZlcihpbnQgcG9ydCkgYXN5bmMgeworICB2YXIgaHR0cFNlcnZlciA9IGF3YWl0IEh0dHBTZXJ2ZXIuYmluZCgnMTI3LjAuMC4xJywgcG9ydCk7CisgIHByaW50KCdsaXN0ZW5pbmcgZm9yIFdlYlNvY2tldCBjb25uZWN0aW9ucyBvbiAkcG9ydCcpOworCisgIGh0dHBTZXJ2ZXIubGlzdGVuKChIdHRwUmVxdWVzdCByZXF1ZXN0KSBhc3luYyB7CisgICAgaWYgKHJlcXVlc3QudXJpLnBhdGggPT0gJy93cycpIHsKKyAgICAgIF93ZWJTb2NrZXQgPSBhd2FpdCBXZWJTb2NrZXRUcmFuc2Zvcm1lci51cGdyYWRlKHJlcXVlc3QpOworICAgICAgYXdhaXQgX2luaXRQcm9jZXNzb3IobmV3IFRXZWJTb2NrZXQoX3dlYlNvY2tldCkpOworICAgIH0gZWxzZSB7CisgICAgICBwcmludCgnSW52YWxpZCBwYXRoOiAke3JlcXVlc3QudXJpLnBhdGh9Jyk7CisgICAgfQorICB9KTsKK30KKworRnV0dXJlIF9ydW5UY3BTZXJ2ZXIoaW50IHBvcnQpIGFzeW5jIHsKKyAgdmFyIHNlcnZlclNvY2tldCA9IGF3YWl0IFNlcnZlclNvY2tldC5iaW5kKCcxMjcuMC4wLjEnLCBwb3J0KTsKKyAgcHJpbnQoJ2xpc3RlbmluZyBmb3IgVENQIGNvbm5lY3Rpb25zIG9uICRwb3J0Jyk7CisKKyAgU29ja2V0IHNvY2tldCA9IGF3YWl0IHNlcnZlclNvY2tldC5maXJzdDsKKyAgYXdhaXQgX2luaXRQcm9jZXNzb3IobmV3IFRUY3BTb2NrZXQoc29ja2V0KSk7Cit9CisKK0Z1dHVyZSBfaW5pdFByb2Nlc3NvcihUU29ja2V0IHNvY2tldCkgYXN5bmMgeworICBUU2VydmVyU29ja2V0VHJhbnNwb3J0IHRyYW5zcG9ydCA9IG5ldyBUU2VydmVyU29ja2V0VHJhbnNwb3J0KHNvY2tldCk7CisgIHRyYW5zcG9ydC5vbkluY29taW5nTWVzc2FnZS5saXN0ZW4oX3Byb2Nlc3NNZXNzYWdlKTsKKyAgX3Byb2Nlc3NvciA9IG5ldyBDYWxjdWxhdG9yUHJvY2Vzc29yKG5ldyBDYWxjdWxhdG9yU2VydmVyKCkpOworICBfcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCk7CisgIGF3YWl0IF9wcm90b2NvbC50cmFuc3BvcnQub3BlbigpOworCisgIHByaW50KCdjb25uZWN0ZWQnKTsKK30KKworRnV0dXJlIF9wcm9jZXNzTWVzc2FnZShfKSBhc3luYyB7CisgIF9wcm9jZXNzb3IucHJvY2VzcyhfcHJvdG9jb2wsIF9wcm90b2NvbCk7Cit9CisKK2NsYXNzIENhbGN1bGF0b3JTZXJ2ZXIgaW1wbGVtZW50cyBDYWxjdWxhdG9yIHsKKyAgZmluYWwgTWFwPGludCwgU2hhcmVkU3RydWN0PiBfbG9nID0ge307CisKKyAgRnV0dXJlIHBpbmcoKSBhc3luYyB7CisgICAgcHJpbnQoJ3BpbmcoKScpOworICB9CisKKyAgRnV0dXJlPGludD4gYWRkKGludCBudW0xLCBpbnQgbnVtMikgYXN5bmMgeworICAgIHByaW50KCdhZGQoJG51bTEsICRudW0yKScpOworCisgICAgcmV0dXJuIG51bTEgKyBudW0yOworICB9CisKKyAgRnV0dXJlPGludD4gY2FsY3VsYXRlKGludCBsb2dpZCwgV29yayB3b3JrKSBhc3luYyB7CisgICAgcHJpbnQoJ2NhbHVsYXRlKCRsb2dpZCwgJHt3b3JrLnRvU3RyaW5nKCl9KScpOworCisgICAgaW50IHZhbDsKKworICAgIHN3aXRjaCAod29yay5vcCkgeworICAgICAgY2FzZSBPcGVyYXRpb24uQUREOgorICAgICAgICB2YWwgPSB3b3JrLm51bTEgKyB3b3JrLm51bTI7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIE9wZXJhdGlvbi5TVUJUUkFDVDoKKyAgICAgICAgdmFsID0gd29yay5udW0xIC0gd29yay5udW0yOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBPcGVyYXRpb24uTVVMVElQTFk6CisgICAgICAgIHZhbCA9IHdvcmsubnVtMSAqIHdvcmsubnVtMjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgT3BlcmF0aW9uLkRJVklERToKKyAgICAgICAgaWYgKHdvcmsubnVtMiA9PSAwKSB7CisgICAgICAgICAgdmFyIHggPSBuZXcgSW52YWxpZE9wZXJhdGlvbigpOworICAgICAgICAgIHgud2hhdE9wID0gd29yay5vcDsKKyAgICAgICAgICB4LndoeSA9ICdDYW5ub3QgZGl2aWRlIGJ5IDAnOworICAgICAgICAgIHRocm93IHg7CisgICAgICAgIH0KKyAgICAgICAgdmFsID0gKHdvcmsubnVtMSAvIHdvcmsubnVtMikuZmxvb3IoKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgdmFyIGxvZyA9IG5ldyBTaGFyZWRTdHJ1Y3QoKTsKKyAgICBsb2cua2V5ID0gbG9naWQ7CisgICAgbG9nLnZhbHVlID0gJyR2YWwgIiR7d29yay5jb21tZW50fSInOworICAgIHRoaXMuX2xvZ1tsb2dpZF0gPSBsb2c7CisKKyAgICByZXR1cm4gdmFsOworICB9CisKKyAgRnV0dXJlIHppcCgpIGFzeW5jIHsKKyAgICBwcmludCgnemlwKCknKTsKKyAgfQorCisgIEZ1dHVyZTxTaGFyZWRTdHJ1Y3Q+IGdldFN0cnVjdChpbnQga2V5KSBhc3luYyB7CisgICAgcHJpbnQoJ2dldFN0cnVjdCgka2V5KScpOworCisgICAgcmV0dXJuIF9sb2dba2V5XTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZGFydC9zZXJ2ZXIvcHVic3BlYy55YW1sIGIvdHV0b3JpYWwvZGFydC9zZXJ2ZXIvcHVic3BlYy55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZDA3MzcKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9kYXJ0L3NlcnZlci9wdWJzcGVjLnlhbWwKQEAgLTAsMCArMSwzNCBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICdMaWNlbnNlJyk7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICdBUyBJUycgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorCituYW1lOiB0dXRvcmlhbF9zZXJ2ZXIKK3ZlcnNpb246IDEuMC4wCitkZXNjcmlwdGlvbjogQSBEYXJ0IHNlcnZlciB0byBzdXBwb3J0IHRoZSBBcGFjaGUgVGhyaWZ0IHR1dG9yaWFsCithdXRob3I6IEFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPgoraG9tZXBhZ2U6IGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZworCitlbnZpcm9ubWVudDoKKyAgc2RrOiAiPj0xLjEzLjAgPDIuMC4wIgorCitkZXBlbmRlbmNpZXM6CisgIGFyZ3M6IF4wLjEzLjAKKyAgc2hhcmVkOgorICAgIHBhdGg6IC4uL2dlbi1kYXJ0L3NoYXJlZAorICB0aHJpZnQ6CisgICAgcGF0aDogLi4vLi4vLi4vbGliL2RhcnQKKyAgdHV0b3JpYWw6CisgICAgcGF0aDogLi4vZ2VuLWRhcnQvdHV0b3JpYWwKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2RlbHBoaS9EZWxwaGlDbGllbnQvRGVscGhpQ2xpZW50LmRwciBiL3R1dG9yaWFsL2RlbHBoaS9EZWxwaGlDbGllbnQvRGVscGhpQ2xpZW50LmRwcgppbmRleCAwZjM4MGIwLi43NGQwZDQ1IDEwMDY0NAotLS0gYS90dXRvcmlhbC9kZWxwaGkvRGVscGhpQ2xpZW50L0RlbHBoaUNsaWVudC5kcHIKKysrIGIvdHV0b3JpYWwvZGVscGhpL0RlbHBoaUNsaWVudC9EZWxwaGlDbGllbnQuZHByCkBAIC0yNiw3ICsyNiw3IEBACiAgIEdlbmVyaWNzLkNvbGxlY3Rpb25zLAogICBUaHJpZnQgaW4gJy4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5wYXMnLAogICBUaHJpZnQuQ29sbGVjdGlvbnMgaW4gJy4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5Db2xsZWN0aW9ucy5wYXMnLAotICBUaHJpZnQuQ29uc29sZSBpbiAnLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LkNvbnNvbGUucGFzJywKKyAgVGhyaWZ0LkV4Y2VwdGlvbiBpbiAnLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LkV4Y2VwdGlvbi5wYXMnLAogICBUaHJpZnQuVXRpbHMgaW4gJy4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5VdGlscy5wYXMnLAogICBUaHJpZnQuU3RyZWFtIGluICcuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuU3RyZWFtLnBhcycsCiAgIFRocmlmdC5Qcm90b2NvbCBpbiAnLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlByb3RvY29sLnBhcycsCkBAIC02MiwxMCArNjIsMTAgQEAKICAgICB0cmFuc3BvcnQuT3BlbjsKIAogICAgIGNsaWVudC5waW5nOwotICAgIENvbnNvbGUuV3JpdGVMaW5lKCdwaW5nKCknKTsKKyAgICBXcml0ZUxuKCdwaW5nKCknKTsKIAogICAgIHN1bSA6PSBjbGllbnQuYWRkKCAxLCAxKTsKLSAgICBDb25zb2xlLldyaXRlTGluZSggRm9ybWF0KCAnMSsxPSVkJywgW3N1bV0pKTsKKyAgICBXcml0ZUxuKCBGb3JtYXQoICcxKzE9JWQnLCBbc3VtXSkpOwogCiAgICAgd29yayA6PSBUV29ya0ltcGwuQ3JlYXRlOwogCkBAIC03NCwxMSArNzQsMTEgQEAKICAgICB3b3JrLk51bTIgOj0gMDsKICAgICB0cnkKICAgICAgIHF1b3RpZW50IDo9IGNsaWVudC5jYWxjdWxhdGUoMSwgd29yayk7Ci0gICAgICBDb25zb2xlLldyaXRlTGluZSggJ1dob2Egd2UgY2FuIGRpdmlkZSBieSAwJyk7Ci0gICAgICBDb25zb2xlLldyaXRlTGluZSggRm9ybWF0KCcxLzA9JWQnLFtxdW90aWVudF0pKTsKKyAgICAgIFdyaXRlTG4oICdXaG9hIHdlIGNhbiBkaXZpZGUgYnkgMCcpOworICAgICAgV3JpdGVMbiggRm9ybWF0KCcxLzA9JWQnLFtxdW90aWVudF0pKTsKICAgICBleGNlcHQKICAgICAgIG9uIGlvOiBUSW52YWxpZE9wZXJhdGlvbgotICAgICAgZG8gQ29uc29sZS5Xcml0ZUxpbmUoICdJbnZhbGlkIG9wZXJhdGlvbjogJyArIGlvLldoeSk7CisgICAgICBkbyBXcml0ZUxuKCAnSW52YWxpZCBvcGVyYXRpb246ICcgKyBpby5XaHkpOwogICAgIGVuZDsKIAogICAgIHdvcmsuT3AgICA6PSBUT3BlcmF0aW9uLlNVQlRSQUNUOwpAQCAtODYsMjAgKzg2LDIwIEBACiAgICAgd29yay5OdW0yIDo9IDEwOwogICAgIHRyeQogICAgICAgZGlmZiA6PSBjbGllbnQuY2FsY3VsYXRlKCAxLCB3b3JrKTsKLSAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCBGb3JtYXQoJzE1LTEwPSVkJywgW2RpZmZdKSk7CisgICAgICBXcml0ZUxuKCBGb3JtYXQoJzE1LTEwPSVkJywgW2RpZmZdKSk7CiAgICAgZXhjZXB0CiAgICAgICBvbiBpbzogVEludmFsaWRPcGVyYXRpb24KLSAgICAgIGRvIENvbnNvbGUuV3JpdGVMaW5lKCAnSW52YWxpZCBvcGVyYXRpb246ICcgKyBpby5XaHkpOworICAgICAgZG8gV3JpdGVMbiggJ0ludmFsaWQgb3BlcmF0aW9uOiAnICsgaW8uV2h5KTsKICAgICBlbmQ7CiAKICAgICBsb2cgOj0gY2xpZW50LmdldFN0cnVjdCgxKTsKLSAgICBDb25zb2xlLldyaXRlTGluZSggRm9ybWF0KCAnQ2hlY2sgbG9nOiAlcycsIFtsb2cuVmFsdWVdKSk7CisgICAgV3JpdGVMbiggRm9ybWF0KCAnQ2hlY2sgbG9nOiAlcycsIFtsb2cuVmFsdWVdKSk7CiAKICAgICB0cmFuc3BvcnQuQ2xvc2UoKTsKIAogICBleGNlcHQKICAgICBvbiBlIDogRXhjZXB0aW9uCi0gICAgZG8gQ29uc29sZS5Xcml0ZUxpbmUoIGUuQ2xhc3NOYW1lKyc6ICcrZS5NZXNzYWdlKTsKKyAgICBkbyBXcml0ZUxuKCBlLkNsYXNzTmFtZSsnOiAnK2UuTWVzc2FnZSk7CiAgIGVuZDsKIGVuZDsKIApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZGVscGhpL0RlbHBoaUNsaWVudC9EZWxwaGlDbGllbnQuZHByb2ogYi90dXRvcmlhbC9kZWxwaGkvRGVscGhpQ2xpZW50L0RlbHBoaUNsaWVudC5kcHJvagppbmRleCAzNGFhNTMzLi5kMDY3OTkyIDEwMDY0NAotLS0gYS90dXRvcmlhbC9kZWxwaGkvRGVscGhpQ2xpZW50L0RlbHBoaUNsaWVudC5kcHJvagorKysgYi90dXRvcmlhbC9kZWxwaGkvRGVscGhpQ2xpZW50L0RlbHBoaUNsaWVudC5kcHJvagpAQCAtMSwxMTkgKzEsMTE5IEBACi3vu78gICAgPFByb2plY3QgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+Ci0gICAgICAgIDxQcm9wZXJ0eUdyb3VwPgotICAgICAgICAgICAgPFByb2plY3RHdWlkPnsyQjhGQjNBMS0yRjlFLTQ4ODMtOEM1My0wRjU2MjIwQjM0RjZ9PC9Qcm9qZWN0R3VpZD4KLSAgICAgICAgICAgIDxNYWluU291cmNlPkRlbHBoaUNsaWVudC5kcHI8L01haW5Tb3VyY2U+Ci0gICAgICAgICAgICA8UHJvamVjdFZlcnNpb24+MTIuMzwvUHJvamVjdFZlcnNpb24+Ci0gICAgICAgICAgICA8QmFzaXM+VHJ1ZTwvQmFzaXM+Ci0gICAgICAgICAgICA8Q29uZmlnIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PScnIj5EZWJ1ZzwvQ29uZmlnPgotICAgICAgICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4KLSAgICAgICAgICAgIDxBcHBUeXBlPkNvbnNvbGU8L0FwcFR5cGU+Ci0gICAgICAgICAgICA8RnJhbWV3b3JrVHlwZT5Ob25lPC9GcmFtZXdvcmtUeXBlPgotICAgICAgICAgICAgPERDQ19EQ0NDb21waWxlcj5EQ0MzMjwvRENDX0RDQ0NvbXBpbGVyPgotICAgICAgICA8L1Byb3BlcnR5R3JvdXA+Ci0gICAgICAgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PSdCYXNpcycgb3IgJyQoQmFzZSknIT0nJyI+Ci0gICAgICAgICAgICA8QmFzZT50cnVlPC9CYXNlPgotICAgICAgICA8L1Byb3BlcnR5R3JvdXA+Ci0gICAgICAgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PSdEZWJ1Zycgb3IgJyQoQ2ZnXzEpJyE9JyciPgotICAgICAgICAgICAgPENmZ18xPnRydWU8L0NmZ18xPgotICAgICAgICAgICAgPENmZ1BhcmVudD5CYXNlPC9DZmdQYXJlbnQ+Ci0gICAgICAgICAgICA8QmFzZT50cnVlPC9CYXNlPgotICAgICAgICA8L1Byb3BlcnR5R3JvdXA+Ci0gICAgICAgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PSdSZWxlYXNlJyBvciAnJChDZmdfMiknIT0nJyI+Ci0gICAgICAgICAgICA8Q2ZnXzI+dHJ1ZTwvQ2ZnXzI+Ci0gICAgICAgICAgICA8Q2ZnUGFyZW50PkJhc2U8L0NmZ1BhcmVudD4KLSAgICAgICAgICAgIDxCYXNlPnRydWU8L0Jhc2U+Ci0gICAgICAgIDwvUHJvcGVydHlHcm91cD4KLSAgICAgICAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChCYXNlKSchPScnIj4KLSAgICAgICAgICAgIDxEQ0NfVW5pdFNlYXJjaFBhdGg+Li5cLi5cLi5cbGliXGRlbHBoaVxzcmM7JChEQ0NfVW5pdFNlYXJjaFBhdGgpPC9EQ0NfVW5pdFNlYXJjaFBhdGg+Ci0gICAgICAgICAgICA8RENDX0ltYWdlQmFzZT4wMDQwMDAwMDwvRENDX0ltYWdlQmFzZT4KLSAgICAgICAgICAgIDxEQ0NfRGN1T3V0cHV0Pi5cZGN1XCQoQ29uZmlnKVwkKFBsYXRmb3JtKTwvRENDX0RjdU91dHB1dD4KLSAgICAgICAgICAgIDxEQ0NfVW5pdEFsaWFzPldpblR5cGVzPVdpbmRvd3M7V2luUHJvY3M9V2luZG93cztEYmlUeXBlcz1CREU7RGJpUHJvY3M9QkRFOyQoRENDX1VuaXRBbGlhcyk8L0RDQ19Vbml0QWxpYXM+Ci0gICAgICAgICAgICA8RENDX0V4ZU91dHB1dD4uLlxiaW5cJChDb25maWcpXCQoUGxhdGZvcm0pPC9EQ0NfRXhlT3V0cHV0PgotICAgICAgICAgICAgPERDQ19FPmZhbHNlPC9EQ0NfRT4KLSAgICAgICAgICAgIDxEQ0NfTj5mYWxzZTwvRENDX04+Ci0gICAgICAgICAgICA8RENDX1M+ZmFsc2U8L0RDQ19TPgotICAgICAgICAgICAgPERDQ19GPmZhbHNlPC9EQ0NfRj4KLSAgICAgICAgICAgIDxEQ0NfSz5mYWxzZTwvRENDX0s+Ci0gICAgICAgIDwvUHJvcGVydHlHcm91cD4KLSAgICAgICAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDZmdfMSknIT0nJyI+Ci0gICAgICAgICAgICA8RENDX0RlZmluZT5ERUJVRzskKERDQ19EZWZpbmUpPC9EQ0NfRGVmaW5lPgotICAgICAgICAgICAgPERDQ19PcHRpbWl6ZT5mYWxzZTwvRENDX09wdGltaXplPgotICAgICAgICAgICAgPERDQ19HZW5lcmF0ZVN0YWNrRnJhbWVzPnRydWU8L0RDQ19HZW5lcmF0ZVN0YWNrRnJhbWVzPgotICAgICAgICA8L1Byb3BlcnR5R3JvdXA+Ci0gICAgICAgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ2ZnXzIpJyE9JyciPgotICAgICAgICAgICAgPERDQ19Mb2NhbERlYnVnU3ltYm9scz5mYWxzZTwvRENDX0xvY2FsRGVidWdTeW1ib2xzPgotICAgICAgICAgICAgPERDQ19EZWZpbmU+UkVMRUFTRTskKERDQ19EZWZpbmUpPC9EQ0NfRGVmaW5lPgotICAgICAgICAgICAgPERDQ19TeW1ib2xSZWZlcmVuY2VJbmZvPjA8L0RDQ19TeW1ib2xSZWZlcmVuY2VJbmZvPgotICAgICAgICAgICAgPERDQ19EZWJ1Z0luZm9ybWF0aW9uPmZhbHNlPC9EQ0NfRGVidWdJbmZvcm1hdGlvbj4KLSAgICAgICAgPC9Qcm9wZXJ0eUdyb3VwPgotICAgICAgICA8SXRlbUdyb3VwPgotICAgICAgICAgICAgPERlbHBoaUNvbXBpbGUgSW5jbHVkZT0iRGVscGhpQ2xpZW50LmRwciI+Ci0gICAgICAgICAgICAgICAgPE1haW5Tb3VyY2U+TWFpblNvdXJjZTwvTWFpblNvdXJjZT4KLSAgICAgICAgICAgIDwvRGVscGhpQ29tcGlsZT4KLSAgICAgICAgICAgIDxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LnBhcyIvPgotICAgICAgICAgICAgPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuQ29sbGVjdGlvbnMucGFzIi8+Ci0gICAgICAgICAgICA8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5Db25zb2xlLnBhcyIvPgotICAgICAgICAgICAgPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuVXRpbHMucGFzIi8+Ci0gICAgICAgICAgICA8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5TdHJlYW0ucGFzIi8+Ci0gICAgICAgICAgICA8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5Qcm90b2NvbC5wYXMiLz4KLSAgICAgICAgICAgIDxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlNlcnZlci5wYXMiLz4KLSAgICAgICAgICAgIDxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlRyYW5zcG9ydC5wYXMiLz4KLSAgICAgICAgICAgIDxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cZ2VuLWRlbHBoaVxTaGFyZWQucGFzIi8+Ci0gICAgICAgICAgICA8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXGdlbi1kZWxwaGlcVHV0b3JpYWwucGFzIi8+Ci0gICAgICAgICAgICA8QnVpbGRDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2UiPgotICAgICAgICAgICAgICAgIDxLZXk+Q2ZnXzI8L0tleT4KLSAgICAgICAgICAgICAgICA8Q2ZnUGFyZW50PkJhc2U8L0NmZ1BhcmVudD4KLSAgICAgICAgICAgIDwvQnVpbGRDb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPEJ1aWxkQ29uZmlndXJhdGlvbiBJbmNsdWRlPSJCYXNpcyI+Ci0gICAgICAgICAgICAgICAgPEtleT5CYXNlPC9LZXk+Ci0gICAgICAgICAgICA8L0J1aWxkQ29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDxCdWlsZENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWciPgotICAgICAgICAgICAgICAgIDxLZXk+Q2ZnXzE8L0tleT4KLSAgICAgICAgICAgICAgICA8Q2ZnUGFyZW50PkJhc2U8L0NmZ1BhcmVudD4KLSAgICAgICAgICAgIDwvQnVpbGRDb25maWd1cmF0aW9uPgotICAgICAgICA8L0l0ZW1Hcm91cD4KLSAgICAgICAgPEltcG9ydCBDb25kaXRpb249IkV4aXN0cygnJChCRFMpXEJpblxDb2RlR2Vhci5EZWxwaGkuVGFyZ2V0cycpIiBQcm9qZWN0PSIkKEJEUylcQmluXENvZGVHZWFyLkRlbHBoaS5UYXJnZXRzIi8+Ci0gICAgICAgIDxJbXBvcnQgQ29uZGl0aW9uPSJFeGlzdHMoJyQoQVBQREFUQSlcRW1iYXJjYWRlcm9cJChCRFNBUFBEQVRBQkFTRURJUilcJChQUk9EVUNUVkVSU0lPTilcVXNlclRvb2xzLnByb2onKSIgUHJvamVjdD0iJChBUFBEQVRBKVxFbWJhcmNhZGVyb1wkKEJEU0FQUERBVEFCQVNFRElSKVwkKFBST0RVQ1RWRVJTSU9OKVxVc2VyVG9vbHMucHJvaiIvPgotICAgICAgICA8UHJvamVjdEV4dGVuc2lvbnM+Ci0gICAgICAgICAgICA8Qm9ybGFuZC5QZXJzb25hbGl0eT5EZWxwaGkuUGVyc29uYWxpdHkuMTI8L0JvcmxhbmQuUGVyc29uYWxpdHk+Ci0gICAgICAgICAgICA8Qm9ybGFuZC5Qcm9qZWN0VHlwZS8+Ci0gICAgICAgICAgICA8Qm9ybGFuZFByb2plY3Q+Ci0gICAgICAgICAgICAgICAgPERlbHBoaS5QZXJzb25hbGl0eT4KLSAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvIE5hbWU9IkluY2x1ZGVWZXJJbmZvIj5UcnVlPC9WZXJzaW9uSW5mbz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mbyBOYW1lPSJBdXRvSW5jQnVpbGQiPkZhbHNlPC9WZXJzaW9uSW5mbz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mbyBOYW1lPSJNYWpvclZlciI+MTwvVmVyc2lvbkluZm8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm8gTmFtZT0iTWlub3JWZXIiPjA8L1ZlcnNpb25JbmZvPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvIE5hbWU9IlJlbGVhc2UiPjA8L1ZlcnNpb25JbmZvPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvIE5hbWU9IkJ1aWxkIj4wPC9WZXJzaW9uSW5mbz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mbyBOYW1lPSJEZWJ1ZyI+RmFsc2U8L1ZlcnNpb25JbmZvPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvIE5hbWU9IlByZVJlbGVhc2UiPkZhbHNlPC9WZXJzaW9uSW5mbz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mbyBOYW1lPSJTcGVjaWFsIj5GYWxzZTwvVmVyc2lvbkluZm8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm8gTmFtZT0iUHJpdmF0ZSI+RmFsc2U8L1ZlcnNpb25JbmZvPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvIE5hbWU9IkRMTCI+RmFsc2U8L1ZlcnNpb25JbmZvPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvIE5hbWU9IkxvY2FsZSI+MTAzMzwvVmVyc2lvbkluZm8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm8gTmFtZT0iQ29kZVBhZ2UiPjEyNTI8L1ZlcnNpb25JbmZvPgotICAgICAgICAgICAgICAgICAgICA8L1ZlcnNpb25JbmZvPgotICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm9LZXlzPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJDb21wYW55TmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJGaWxlRGVzY3JpcHRpb24iPlRocmlmdCBUdXRvcmlhbDwvVmVyc2lvbkluZm9LZXlzPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJGaWxlVmVyc2lvbiI+MS4wLjAuMDwvVmVyc2lvbkluZm9LZXlzPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJJbnRlcm5hbE5hbWUiPkRlbHBoaUNsaWVudDwvVmVyc2lvbkluZm9LZXlzPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJMZWdhbENvcHlyaWdodCI+Q29weXJpZ2h0IMKpIDIwMTIgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9WZXJzaW9uSW5mb0tleXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm9LZXlzIE5hbWU9IkxlZ2FsVHJhZGVtYXJrcyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJPcmlnaW5hbEZpbGVuYW1lIj5EZWxwaGlDbGllbnQuZXhlPC9WZXJzaW9uSW5mb0tleXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm9LZXlzIE5hbWU9IlByb2R1Y3ROYW1lIj5UaHJpZnQ8L1ZlcnNpb25JbmZvS2V5cz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mb0tleXMgTmFtZT0iUHJvZHVjdFZlcnNpb24iPjEuMC4wLjA8L1ZlcnNpb25JbmZvS2V5cz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mb0tleXMgTmFtZT0iQ29tbWVudHMiLz4KLSAgICAgICAgICAgICAgICAgICAgPC9WZXJzaW9uSW5mb0tleXM+Ci0gICAgICAgICAgICAgICAgICAgIDxTb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U291cmNlIE5hbWU9Ik1haW5Tb3VyY2UiPkRlbHBoaUNsaWVudC5kcHI8L1NvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPC9Tb3VyY2U+Ci0gICAgICAgICAgICAgICAgPC9EZWxwaGkuUGVyc29uYWxpdHk+Ci0gICAgICAgICAgICAgICAgPFBsYXRmb3Jtcz4KLSAgICAgICAgICAgICAgICAgICAgPFBsYXRmb3JtIHZhbHVlPSJXaW4zMiI+VHJ1ZTwvUGxhdGZvcm0+Ci0gICAgICAgICAgICAgICAgPC9QbGF0Zm9ybXM+Ci0gICAgICAgICAgICA8L0JvcmxhbmRQcm9qZWN0PgotICAgICAgICAgICAgPFByb2plY3RGaWxlVmVyc2lvbj4xMjwvUHJvamVjdEZpbGVWZXJzaW9uPgotICAgICAgICA8L1Byb2plY3RFeHRlbnNpb25zPgotICAgIDwvUHJvamVjdD4KK++7vwk8UHJvamVjdCB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKwkJPFByb3BlcnR5R3JvdXA+CisJCQk8UHJvamVjdEd1aWQ+ezJCOEZCM0ExLTJGOUUtNDg4My04QzUzLTBGNTYyMjBCMzRGNn08L1Byb2plY3RHdWlkPgorCQkJPE1haW5Tb3VyY2U+RGVscGhpQ2xpZW50LmRwcjwvTWFpblNvdXJjZT4KKwkJCTxQcm9qZWN0VmVyc2lvbj4xMi4zPC9Qcm9qZWN0VmVyc2lvbj4KKwkJCTxCYXNpcz5UcnVlPC9CYXNpcz4KKwkJCTxDb25maWcgQ29uZGl0aW9uPSInJChDb25maWcpJz09JyciPkRlYnVnPC9Db25maWc+CisJCQk8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPgorCQkJPEFwcFR5cGU+Q29uc29sZTwvQXBwVHlwZT4KKwkJCTxGcmFtZXdvcmtUeXBlPk5vbmU8L0ZyYW1ld29ya1R5cGU+CisJCQk8RENDX0RDQ0NvbXBpbGVyPkRDQzMyPC9EQ0NfRENDQ29tcGlsZXI+CisJCTwvUHJvcGVydHlHcm91cD4KKwkJPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWcpJz09J0Jhc2lzJyBvciAnJChCYXNlKSchPScnIj4KKwkJCTxCYXNlPnRydWU8L0Jhc2U+CisJCTwvUHJvcGVydHlHcm91cD4KKwkJPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWcpJz09J0RlYnVnJyBvciAnJChDZmdfMSknIT0nJyI+CisJCQk8Q2ZnXzE+dHJ1ZTwvQ2ZnXzE+CisJCQk8Q2ZnUGFyZW50PkJhc2U8L0NmZ1BhcmVudD4KKwkJCTxCYXNlPnRydWU8L0Jhc2U+CisJCTwvUHJvcGVydHlHcm91cD4KKwkJPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWcpJz09J1JlbGVhc2UnIG9yICckKENmZ18yKSchPScnIj4KKwkJCTxDZmdfMj50cnVlPC9DZmdfMj4KKwkJCTxDZmdQYXJlbnQ+QmFzZTwvQ2ZnUGFyZW50PgorCQkJPEJhc2U+dHJ1ZTwvQmFzZT4KKwkJPC9Qcm9wZXJ0eUdyb3VwPgorCQk8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKEJhc2UpJyE9JyciPgorCQkJPERDQ19Vbml0U2VhcmNoUGF0aD4uLlwuLlwuLlxsaWJcZGVscGhpXHNyYzskKERDQ19Vbml0U2VhcmNoUGF0aCk8L0RDQ19Vbml0U2VhcmNoUGF0aD4KKwkJCTxEQ0NfSW1hZ2VCYXNlPjAwNDAwMDAwPC9EQ0NfSW1hZ2VCYXNlPgorCQkJPERDQ19EY3VPdXRwdXQ+LlxkY3VcJChDb25maWcpXCQoUGxhdGZvcm0pPC9EQ0NfRGN1T3V0cHV0PgorCQkJPERDQ19Vbml0QWxpYXM+V2luVHlwZXM9V2luZG93cztXaW5Qcm9jcz1XaW5kb3dzO0RiaVR5cGVzPUJERTtEYmlQcm9jcz1CREU7JChEQ0NfVW5pdEFsaWFzKTwvRENDX1VuaXRBbGlhcz4KKwkJCTxEQ0NfRXhlT3V0cHV0Pi4uXGJpblwkKENvbmZpZylcJChQbGF0Zm9ybSk8L0RDQ19FeGVPdXRwdXQ+CisJCQk8RENDX0U+ZmFsc2U8L0RDQ19FPgorCQkJPERDQ19OPmZhbHNlPC9EQ0NfTj4KKwkJCTxEQ0NfUz5mYWxzZTwvRENDX1M+CisJCQk8RENDX0Y+ZmFsc2U8L0RDQ19GPgorCQkJPERDQ19LPmZhbHNlPC9EQ0NfSz4KKwkJPC9Qcm9wZXJ0eUdyb3VwPgorCQk8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENmZ18xKSchPScnIj4KKwkJCTxEQ0NfRGVmaW5lPkRFQlVHOyQoRENDX0RlZmluZSk8L0RDQ19EZWZpbmU+CisJCQk8RENDX09wdGltaXplPmZhbHNlPC9EQ0NfT3B0aW1pemU+CisJCQk8RENDX0dlbmVyYXRlU3RhY2tGcmFtZXM+dHJ1ZTwvRENDX0dlbmVyYXRlU3RhY2tGcmFtZXM+CisJCTwvUHJvcGVydHlHcm91cD4KKwkJPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDZmdfMiknIT0nJyI+CisJCQk8RENDX0xvY2FsRGVidWdTeW1ib2xzPmZhbHNlPC9EQ0NfTG9jYWxEZWJ1Z1N5bWJvbHM+CisJCQk8RENDX0RlZmluZT5SRUxFQVNFOyQoRENDX0RlZmluZSk8L0RDQ19EZWZpbmU+CisJCQk8RENDX1N5bWJvbFJlZmVyZW5jZUluZm8+MDwvRENDX1N5bWJvbFJlZmVyZW5jZUluZm8+CisJCQk8RENDX0RlYnVnSW5mb3JtYXRpb24+ZmFsc2U8L0RDQ19EZWJ1Z0luZm9ybWF0aW9uPgorCQk8L1Byb3BlcnR5R3JvdXA+CisJCTxJdGVtR3JvdXA+CisJCQk8RGVscGhpQ29tcGlsZSBJbmNsdWRlPSJEZWxwaGlDbGllbnQuZHByIj4KKwkJCQk8TWFpblNvdXJjZT5NYWluU291cmNlPC9NYWluU291cmNlPgorCQkJPC9EZWxwaGlDb21waWxlPgorCQkJPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQucGFzIi8+CisJCQk8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5Db2xsZWN0aW9ucy5wYXMiLz4KKwkJCTxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LkV4Y2VwdGlvbi5wYXMiLz4KKwkJCTxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlV0aWxzLnBhcyIvPgorCQkJPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuU3RyZWFtLnBhcyIvPgorCQkJPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuUHJvdG9jb2wucGFzIi8+CisJCQk8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5TZXJ2ZXIucGFzIi8+CisJCQk8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5UcmFuc3BvcnQucGFzIi8+CisJCQk8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXGdlbi1kZWxwaGlcU2hhcmVkLnBhcyIvPgorCQkJPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlxnZW4tZGVscGhpXFR1dG9yaWFsLnBhcyIvPgorCQkJPEJ1aWxkQ29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlIj4KKwkJCQk8S2V5PkNmZ18yPC9LZXk+CisJCQkJPENmZ1BhcmVudD5CYXNlPC9DZmdQYXJlbnQ+CisJCQk8L0J1aWxkQ29uZmlndXJhdGlvbj4KKwkJCTxCdWlsZENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iQmFzaXMiPgorCQkJCTxLZXk+QmFzZTwvS2V5PgorCQkJPC9CdWlsZENvbmZpZ3VyYXRpb24+CisJCQk8QnVpbGRDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnIj4KKwkJCQk8S2V5PkNmZ18xPC9LZXk+CisJCQkJPENmZ1BhcmVudD5CYXNlPC9DZmdQYXJlbnQ+CisJCQk8L0J1aWxkQ29uZmlndXJhdGlvbj4KKwkJPC9JdGVtR3JvdXA+CisJCTxJbXBvcnQgQ29uZGl0aW9uPSJFeGlzdHMoJyQoQkRTKVxCaW5cQ29kZUdlYXIuRGVscGhpLlRhcmdldHMnKSIgUHJvamVjdD0iJChCRFMpXEJpblxDb2RlR2Vhci5EZWxwaGkuVGFyZ2V0cyIvPgorCQk8SW1wb3J0IENvbmRpdGlvbj0iRXhpc3RzKCckKEFQUERBVEEpXEVtYmFyY2FkZXJvXCQoQkRTQVBQREFUQUJBU0VESVIpXCQoUFJPRFVDVFZFUlNJT04pXFVzZXJUb29scy5wcm9qJykiIFByb2plY3Q9IiQoQVBQREFUQSlcRW1iYXJjYWRlcm9cJChCRFNBUFBEQVRBQkFTRURJUilcJChQUk9EVUNUVkVSU0lPTilcVXNlclRvb2xzLnByb2oiLz4KKwkJPFByb2plY3RFeHRlbnNpb25zPgorCQkJPEJvcmxhbmQuUGVyc29uYWxpdHk+RGVscGhpLlBlcnNvbmFsaXR5LjEyPC9Cb3JsYW5kLlBlcnNvbmFsaXR5PgorCQkJPEJvcmxhbmQuUHJvamVjdFR5cGUvPgorCQkJPEJvcmxhbmRQcm9qZWN0PgorCQkJCTxEZWxwaGkuUGVyc29uYWxpdHk+CisJCQkJCTxWZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJJbmNsdWRlVmVySW5mbyI+VHJ1ZTwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iQXV0b0luY0J1aWxkIj5GYWxzZTwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iTWFqb3JWZXIiPjA8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9Ik1pbm9yVmVyIj4xMjwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iUmVsZWFzZSI+MDwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iQnVpbGQiPjA8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkRlYnVnIj5GYWxzZTwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iUHJlUmVsZWFzZSI+RmFsc2U8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IlNwZWNpYWwiPkZhbHNlPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJQcml2YXRlIj5GYWxzZTwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iRExMIj5GYWxzZTwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iTG9jYWxlIj4xMDMzPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJDb2RlUGFnZSI+MTI1MjwvVmVyc2lvbkluZm8+CisJCQkJCTwvVmVyc2lvbkluZm8+CisJCQkJCTxWZXJzaW9uSW5mb0tleXM+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9IkNvbXBhbnlOYW1lIi8+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9IkZpbGVEZXNjcmlwdGlvbiI+VGhyaWZ0IFR1dG9yaWFsPC9WZXJzaW9uSW5mb0tleXM+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9IkZpbGVWZXJzaW9uIj4xLjAuMC4wPC9WZXJzaW9uSW5mb0tleXM+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9IkludGVybmFsTmFtZSI+RGVscGhpQ2xpZW50PC9WZXJzaW9uSW5mb0tleXM+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9IkxlZ2FsQ29weXJpZ2h0Ij5Db3B5cmlnaHQgwqkgMjAxMiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L1ZlcnNpb25JbmZvS2V5cz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iTGVnYWxUcmFkZW1hcmtzIi8+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9Ik9yaWdpbmFsRmlsZW5hbWUiPkRlbHBoaUNsaWVudC5leGU8L1ZlcnNpb25JbmZvS2V5cz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iUHJvZHVjdE5hbWUiPlRocmlmdDwvVmVyc2lvbkluZm9LZXlzPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJQcm9kdWN0VmVyc2lvbiI+MS4wLjAuMDwvVmVyc2lvbkluZm9LZXlzPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJDb21tZW50cyIvPgorCQkJCQk8L1ZlcnNpb25JbmZvS2V5cz4KKwkJCQkJPFNvdXJjZT4KKwkJCQkJCTxTb3VyY2UgTmFtZT0iTWFpblNvdXJjZSI+RGVscGhpQ2xpZW50LmRwcjwvU291cmNlPgorCQkJCQk8L1NvdXJjZT4KKwkJCQk8L0RlbHBoaS5QZXJzb25hbGl0eT4KKwkJCQk8UGxhdGZvcm1zPgorCQkJCQk8UGxhdGZvcm0gdmFsdWU9IldpbjMyIj5UcnVlPC9QbGF0Zm9ybT4KKwkJCQk8L1BsYXRmb3Jtcz4KKwkJCTwvQm9ybGFuZFByb2plY3Q+CisJCQk8UHJvamVjdEZpbGVWZXJzaW9uPjEyPC9Qcm9qZWN0RmlsZVZlcnNpb24+CisJCTwvUHJvamVjdEV4dGVuc2lvbnM+CisJPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZGVscGhpL0RlbHBoaVNlcnZlci9EZWxwaGlTZXJ2ZXIuZHByIGIvdHV0b3JpYWwvZGVscGhpL0RlbHBoaVNlcnZlci9EZWxwaGlTZXJ2ZXIuZHByCmluZGV4IDlkNTRhMmUuLjVmNDJlN2UgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2RlbHBoaS9EZWxwaGlTZXJ2ZXIvRGVscGhpU2VydmVyLmRwcgorKysgYi90dXRvcmlhbC9kZWxwaGkvRGVscGhpU2VydmVyL0RlbHBoaVNlcnZlci5kcHIKQEAgLTI4LDcgKzI4LDcgQEAKICAgR2VuZXJpY3MuQ29sbGVjdGlvbnMsCiAgIFRocmlmdCBpbiAnLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LnBhcycsCiAgIFRocmlmdC5Db2xsZWN0aW9ucyBpbiAnLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LkNvbGxlY3Rpb25zLnBhcycsCi0gIFRocmlmdC5Db25zb2xlIGluICcuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuQ29uc29sZS5wYXMnLAorICBUaHJpZnQuRXhjZXB0aW9uIGluICcuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuRXhjZXB0aW9uLnBhcycsCiAgIFRocmlmdC5VdGlscyBpbiAnLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlV0aWxzLnBhcycsCiAgIFRocmlmdC5TdHJlYW0gaW4gJy4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5TdHJlYW0ucGFzJywKICAgVGhyaWZ0LlByb3RvY29sIGluICcuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuUHJvdG9jb2wucGFzJywKQEAgLTg2LDEzICs4NiwxMyBAQAogCiBwcm9jZWR1cmUgVENhbGN1bGF0b3JIYW5kbGVyLnBpbmc7CiBiZWdpbgotICBDb25zb2xlLldyaXRlTGluZSggJ3BpbmcoKScpOworICBXcml0ZUxuKCAncGluZygpJyk7CiBlbmQ7CiAKIAogZnVuY3Rpb24gVENhbGN1bGF0b3JIYW5kbGVyLmFkZChudW0xOiBJbnRlZ2VyOyBudW0yOiBJbnRlZ2VyKTogSW50ZWdlcjsKIGJlZ2luCi0gIENvbnNvbGUuV3JpdGVMaW5lKCBGb3JtYXQoICdhZGQoICVkLCAlZCknLCBbbnVtMSwgbnVtMl0pKTsKKyAgV3JpdGVMbiggRm9ybWF0KCAnYWRkKCAlZCwgJWQpJywgW251bTEsIG51bTJdKSk7CiAgIHJlc3VsdCA6PSBudW0xICsgbnVtMjsKIGVuZDsKIApAQCAtMTAxLDcgKzEwMSw3IEBACiB2YXIgZW50cnkgOiBJU2hhcmVkU3RydWN0OwogYmVnaW4KICAgdHJ5Ci0gICAgQ29uc29sZS5Xcml0ZUxpbmUoIEZvcm1hdCgnY2FsY3VsYXRlKCAlZCwgWyVkLCVkLCVkXSknLCBbbG9naWQsIE9yZCh3Lk9wKSwgdy5OdW0xLCB3Lk51bTJdKSk7CisgICAgV3JpdGVMbiggRm9ybWF0KCdjYWxjdWxhdGUoICVkLCBbJWQsJWQsJWRdKScsIFtsb2dpZCwgT3JkKHcuT3ApLCB3Lk51bTEsIHcuTnVtMl0pKTsKIAogICAgIGNhc2Ugdy5PcCBvZgogICAgICAgVE9wZXJhdGlvbi5BREQgICAgICA6ICByZXN1bHQgOj0gdy5OdW0xICsgdy5OdW0yOwpAQCAtMTI2LDE0ICsxMjYsMTQgQEAKIAogZnVuY3Rpb24gVENhbGN1bGF0b3JIYW5kbGVyLmdldFN0cnVjdChrZXk6IEludGVnZXIpOiBJU2hhcmVkU3RydWN0OwogYmVnaW4KLSAgQ29uc29sZS5Xcml0ZUxpbmUoIEZvcm1hdCggJ2dldFN0cnVjdCglZCknLCBba2V5XSkpOworICBXcml0ZUxuKCBGb3JtYXQoICdnZXRTdHJ1Y3QoJWQpJywgW2tleV0pKTsKICAgcmVzdWx0IDo9IEZMb2dba2V5XTsKIGVuZDsKIAogCiBwcm9jZWR1cmUgVENhbGN1bGF0b3JIYW5kbGVyLnppcDsKIGJlZ2luCi0gIENvbnNvbGUuV3JpdGVMaW5lKCAnemlwKCknKTsKKyAgV3JpdGVMbiggJ3ppcCgpJyk7CiBlbmQ7CiAKIApAQCAtMTUyLDE0ICsxNTIsMTQgQEAKICAgICB0cmFuc3BvcnQgOj0gVFNlcnZlclNvY2tldEltcGwuQ3JlYXRlKCA5MDkwKTsKICAgICBzZXJ2ZXIgICAgOj0gVFNpbXBsZVNlcnZlci5DcmVhdGUoIHByb2Nlc3NvciwgdHJhbnNwb3J0KTsKIAotICAgIENvbnNvbGUuV3JpdGVMaW5lKCAnU3RhcnRpbmcgdGhlIHNlcnZlci4uLicpOworICAgIFdyaXRlTG4oICdTdGFydGluZyB0aGUgc2VydmVyLi4uJyk7CiAgICAgc2VydmVyLlNlcnZlKCk7CiAKICAgZXhjZXB0Ci0gICAgb24gZTogRXhjZXB0aW9uIGRvIENvbnNvbGUuV3JpdGVMaW5lKCBlLk1lc3NhZ2UpOworICAgIG9uIGU6IEV4Y2VwdGlvbiBkbyBXcml0ZUxuKCBlLk1lc3NhZ2UpOwogICBlbmQ7CiAKLSAgQ29uc29sZS5Xcml0ZUxpbmUoJ2RvbmUuJyk7CisgIFdyaXRlTG4oJ2RvbmUuJyk7CiBlbmQ7CiAKIApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZGVscGhpL0RlbHBoaVNlcnZlci9EZWxwaGlTZXJ2ZXIuZHByb2ogYi90dXRvcmlhbC9kZWxwaGkvRGVscGhpU2VydmVyL0RlbHBoaVNlcnZlci5kcHJvagppbmRleCA3NDgxMWJjLi5lMzRhNmExIDEwMDY0NAotLS0gYS90dXRvcmlhbC9kZWxwaGkvRGVscGhpU2VydmVyL0RlbHBoaVNlcnZlci5kcHJvagorKysgYi90dXRvcmlhbC9kZWxwaGkvRGVscGhpU2VydmVyL0RlbHBoaVNlcnZlci5kcHJvagpAQCAtMSwxMTggKzEsMTE4IEBACi3vu78gICAgPFByb2plY3QgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+Ci0gICAgICAgIDxQcm9wZXJ0eUdyb3VwPgotICAgICAgICAgICAgPFByb2plY3RHdWlkPnsyQjhGQjNBMS0yRjlFLTQ4ODMtOEM1My0wRjU2MjIwQjM0RjZ9PC9Qcm9qZWN0R3VpZD4KLSAgICAgICAgICAgIDxNYWluU291cmNlPkRlbHBoaVNlcnZlci5kcHI8L01haW5Tb3VyY2U+Ci0gICAgICAgICAgICA8UHJvamVjdFZlcnNpb24+MTIuMzwvUHJvamVjdFZlcnNpb24+Ci0gICAgICAgICAgICA8QmFzaXM+VHJ1ZTwvQmFzaXM+Ci0gICAgICAgICAgICA8Q29uZmlnIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PScnIj5EZWJ1ZzwvQ29uZmlnPgotICAgICAgICAgICAgPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4KLSAgICAgICAgICAgIDxBcHBUeXBlPkNvbnNvbGU8L0FwcFR5cGU+Ci0gICAgICAgICAgICA8RnJhbWV3b3JrVHlwZT5Ob25lPC9GcmFtZXdvcmtUeXBlPgotICAgICAgICAgICAgPERDQ19EQ0NDb21waWxlcj5EQ0MzMjwvRENDX0RDQ0NvbXBpbGVyPgotICAgICAgICA8L1Byb3BlcnR5R3JvdXA+Ci0gICAgICAgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PSdCYXNpcycgb3IgJyQoQmFzZSknIT0nJyI+Ci0gICAgICAgICAgICA8QmFzZT50cnVlPC9CYXNlPgotICAgICAgICA8L1Byb3BlcnR5R3JvdXA+Ci0gICAgICAgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PSdEZWJ1Zycgb3IgJyQoQ2ZnXzEpJyE9JyciPgotICAgICAgICAgICAgPENmZ18xPnRydWU8L0NmZ18xPgotICAgICAgICAgICAgPENmZ1BhcmVudD5CYXNlPC9DZmdQYXJlbnQ+Ci0gICAgICAgICAgICA8QmFzZT50cnVlPC9CYXNlPgotICAgICAgICA8L1Byb3BlcnR5R3JvdXA+Ci0gICAgICAgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PSdSZWxlYXNlJyBvciAnJChDZmdfMiknIT0nJyI+Ci0gICAgICAgICAgICA8Q2ZnXzI+dHJ1ZTwvQ2ZnXzI+Ci0gICAgICAgICAgICA8Q2ZnUGFyZW50PkJhc2U8L0NmZ1BhcmVudD4KLSAgICAgICAgICAgIDxCYXNlPnRydWU8L0Jhc2U+Ci0gICAgICAgIDwvUHJvcGVydHlHcm91cD4KLSAgICAgICAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChCYXNlKSchPScnIj4KLSAgICAgICAgICAgIDxEQ0NfSW1hZ2VCYXNlPjAwNDAwMDAwPC9EQ0NfSW1hZ2VCYXNlPgotICAgICAgICAgICAgPERDQ19EY3VPdXRwdXQ+LlxkY3VcJChDb25maWcpXCQoUGxhdGZvcm0pPC9EQ0NfRGN1T3V0cHV0PgotICAgICAgICAgICAgPERDQ19Vbml0QWxpYXM+V2luVHlwZXM9V2luZG93cztXaW5Qcm9jcz1XaW5kb3dzO0RiaVR5cGVzPUJERTtEYmlQcm9jcz1CREU7JChEQ0NfVW5pdEFsaWFzKTwvRENDX1VuaXRBbGlhcz4KLSAgICAgICAgICAgIDxEQ0NfRXhlT3V0cHV0Pi4uXGJpblwkKENvbmZpZylcJChQbGF0Zm9ybSk8L0RDQ19FeGVPdXRwdXQ+Ci0gICAgICAgICAgICA8RENDX0U+ZmFsc2U8L0RDQ19FPgotICAgICAgICAgICAgPERDQ19OPmZhbHNlPC9EQ0NfTj4KLSAgICAgICAgICAgIDxEQ0NfUz5mYWxzZTwvRENDX1M+Ci0gICAgICAgICAgICA8RENDX0Y+ZmFsc2U8L0RDQ19GPgotICAgICAgICAgICAgPERDQ19LPmZhbHNlPC9EQ0NfSz4KLSAgICAgICAgPC9Qcm9wZXJ0eUdyb3VwPgotICAgICAgICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENmZ18xKSchPScnIj4KLSAgICAgICAgICAgIDxEQ0NfRGVmaW5lPkRFQlVHOyQoRENDX0RlZmluZSk8L0RDQ19EZWZpbmU+Ci0gICAgICAgICAgICA8RENDX09wdGltaXplPmZhbHNlPC9EQ0NfT3B0aW1pemU+Ci0gICAgICAgICAgICA8RENDX0dlbmVyYXRlU3RhY2tGcmFtZXM+dHJ1ZTwvRENDX0dlbmVyYXRlU3RhY2tGcmFtZXM+Ci0gICAgICAgIDwvUHJvcGVydHlHcm91cD4KLSAgICAgICAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDZmdfMiknIT0nJyI+Ci0gICAgICAgICAgICA8RENDX0xvY2FsRGVidWdTeW1ib2xzPmZhbHNlPC9EQ0NfTG9jYWxEZWJ1Z1N5bWJvbHM+Ci0gICAgICAgICAgICA8RENDX0RlZmluZT5SRUxFQVNFOyQoRENDX0RlZmluZSk8L0RDQ19EZWZpbmU+Ci0gICAgICAgICAgICA8RENDX1N5bWJvbFJlZmVyZW5jZUluZm8+MDwvRENDX1N5bWJvbFJlZmVyZW5jZUluZm8+Ci0gICAgICAgICAgICA8RENDX0RlYnVnSW5mb3JtYXRpb24+ZmFsc2U8L0RDQ19EZWJ1Z0luZm9ybWF0aW9uPgotICAgICAgICA8L1Byb3BlcnR5R3JvdXA+Ci0gICAgICAgIDxJdGVtR3JvdXA+Ci0gICAgICAgICAgICA8RGVscGhpQ29tcGlsZSBJbmNsdWRlPSJEZWxwaGlTZXJ2ZXIuZHByIj4KLSAgICAgICAgICAgICAgICA8TWFpblNvdXJjZT5NYWluU291cmNlPC9NYWluU291cmNlPgotICAgICAgICAgICAgPC9EZWxwaGlDb21waWxlPgotICAgICAgICAgICAgPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQucGFzIi8+Ci0gICAgICAgICAgICA8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5Db2xsZWN0aW9ucy5wYXMiLz4KLSAgICAgICAgICAgIDxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LkNvbnNvbGUucGFzIi8+Ci0gICAgICAgICAgICA8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5VdGlscy5wYXMiLz4KLSAgICAgICAgICAgIDxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlN0cmVhbS5wYXMiLz4KLSAgICAgICAgICAgIDxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlByb3RvY29sLnBhcyIvPgotICAgICAgICAgICAgPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuU2VydmVyLnBhcyIvPgotICAgICAgICAgICAgPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuVHJhbnNwb3J0LnBhcyIvPgotICAgICAgICAgICAgPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlxnZW4tZGVscGhpXFNoYXJlZC5wYXMiLz4KLSAgICAgICAgICAgIDxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cZ2VuLWRlbHBoaVxUdXRvcmlhbC5wYXMiLz4KLSAgICAgICAgICAgIDxCdWlsZENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZSI+Ci0gICAgICAgICAgICAgICAgPEtleT5DZmdfMjwvS2V5PgotICAgICAgICAgICAgICAgIDxDZmdQYXJlbnQ+QmFzZTwvQ2ZnUGFyZW50PgotICAgICAgICAgICAgPC9CdWlsZENvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8QnVpbGRDb25maWd1cmF0aW9uIEluY2x1ZGU9IkJhc2lzIj4KLSAgICAgICAgICAgICAgICA8S2V5PkJhc2U8L0tleT4KLSAgICAgICAgICAgIDwvQnVpbGRDb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPEJ1aWxkQ29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1ZyI+Ci0gICAgICAgICAgICAgICAgPEtleT5DZmdfMTwvS2V5PgotICAgICAgICAgICAgICAgIDxDZmdQYXJlbnQ+QmFzZTwvQ2ZnUGFyZW50PgotICAgICAgICAgICAgPC9CdWlsZENvbmZpZ3VyYXRpb24+Ci0gICAgICAgIDwvSXRlbUdyb3VwPgotICAgICAgICA8SW1wb3J0IENvbmRpdGlvbj0iRXhpc3RzKCckKEJEUylcQmluXENvZGVHZWFyLkRlbHBoaS5UYXJnZXRzJykiIFByb2plY3Q9IiQoQkRTKVxCaW5cQ29kZUdlYXIuRGVscGhpLlRhcmdldHMiLz4KLSAgICAgICAgPEltcG9ydCBDb25kaXRpb249IkV4aXN0cygnJChBUFBEQVRBKVxFbWJhcmNhZGVyb1wkKEJEU0FQUERBVEFCQVNFRElSKVwkKFBST0RVQ1RWRVJTSU9OKVxVc2VyVG9vbHMucHJvaicpIiBQcm9qZWN0PSIkKEFQUERBVEEpXEVtYmFyY2FkZXJvXCQoQkRTQVBQREFUQUJBU0VESVIpXCQoUFJPRFVDVFZFUlNJT04pXFVzZXJUb29scy5wcm9qIi8+Ci0gICAgICAgIDxQcm9qZWN0RXh0ZW5zaW9ucz4KLSAgICAgICAgICAgIDxCb3JsYW5kLlBlcnNvbmFsaXR5PkRlbHBoaS5QZXJzb25hbGl0eS4xMjwvQm9ybGFuZC5QZXJzb25hbGl0eT4KLSAgICAgICAgICAgIDxCb3JsYW5kLlByb2plY3RUeXBlLz4KLSAgICAgICAgICAgIDxCb3JsYW5kUHJvamVjdD4KLSAgICAgICAgICAgICAgICA8RGVscGhpLlBlcnNvbmFsaXR5PgotICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm8gTmFtZT0iSW5jbHVkZVZlckluZm8iPlRydWU8L1ZlcnNpb25JbmZvPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvIE5hbWU9IkF1dG9JbmNCdWlsZCI+RmFsc2U8L1ZlcnNpb25JbmZvPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvIE5hbWU9Ik1ham9yVmVyIj4xPC9WZXJzaW9uSW5mbz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mbyBOYW1lPSJNaW5vclZlciI+MDwvVmVyc2lvbkluZm8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm8gTmFtZT0iUmVsZWFzZSI+MDwvVmVyc2lvbkluZm8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm8gTmFtZT0iQnVpbGQiPjA8L1ZlcnNpb25JbmZvPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvIE5hbWU9IkRlYnVnIj5GYWxzZTwvVmVyc2lvbkluZm8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm8gTmFtZT0iUHJlUmVsZWFzZSI+RmFsc2U8L1ZlcnNpb25JbmZvPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvIE5hbWU9IlNwZWNpYWwiPkZhbHNlPC9WZXJzaW9uSW5mbz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mbyBOYW1lPSJQcml2YXRlIj5GYWxzZTwvVmVyc2lvbkluZm8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm8gTmFtZT0iRExMIj5GYWxzZTwvVmVyc2lvbkluZm8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm8gTmFtZT0iTG9jYWxlIj4xMDMzPC9WZXJzaW9uSW5mbz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mbyBOYW1lPSJDb2RlUGFnZSI+MTI1MjwvVmVyc2lvbkluZm8+Ci0gICAgICAgICAgICAgICAgICAgIDwvVmVyc2lvbkluZm8+Ci0gICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mb0tleXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm9LZXlzIE5hbWU9IkNvbXBhbnlOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm9LZXlzIE5hbWU9IkZpbGVEZXNjcmlwdGlvbiI+VGhyaWZ0IFR1dG9yaWFsPC9WZXJzaW9uSW5mb0tleXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm9LZXlzIE5hbWU9IkZpbGVWZXJzaW9uIj4xLjAuMC4wPC9WZXJzaW9uSW5mb0tleXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm9LZXlzIE5hbWU9IkludGVybmFsTmFtZSI+RGVscGhpU2VydmVyPC9WZXJzaW9uSW5mb0tleXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm9LZXlzIE5hbWU9IkxlZ2FsQ29weXJpZ2h0Ij5Db3B5cmlnaHQgwqkgMjAxMiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L1ZlcnNpb25JbmZvS2V5cz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mb0tleXMgTmFtZT0iTGVnYWxUcmFkZW1hcmtzIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm9LZXlzIE5hbWU9Ik9yaWdpbmFsRmlsZW5hbWUiPkRlbHBoaVNlcnZlci5leGU8L1ZlcnNpb25JbmZvS2V5cz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mb0tleXMgTmFtZT0iUHJvZHVjdE5hbWUiPlRocmlmdDwvVmVyc2lvbkluZm9LZXlzPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJQcm9kdWN0VmVyc2lvbiI+MS4wLjAuMDwvVmVyc2lvbkluZm9LZXlzPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJDb21tZW50cyIvPgotICAgICAgICAgICAgICAgICAgICA8L1ZlcnNpb25JbmZvS2V5cz4KLSAgICAgICAgICAgICAgICAgICAgPFNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxTb3VyY2UgTmFtZT0iTWFpblNvdXJjZSI+RGVscGhpU2VydmVyLmRwcjwvU291cmNlPgotICAgICAgICAgICAgICAgICAgICA8L1NvdXJjZT4KLSAgICAgICAgICAgICAgICA8L0RlbHBoaS5QZXJzb25hbGl0eT4KLSAgICAgICAgICAgICAgICA8UGxhdGZvcm1zPgotICAgICAgICAgICAgICAgICAgICA8UGxhdGZvcm0gdmFsdWU9IldpbjMyIj5UcnVlPC9QbGF0Zm9ybT4KLSAgICAgICAgICAgICAgICA8L1BsYXRmb3Jtcz4KLSAgICAgICAgICAgIDwvQm9ybGFuZFByb2plY3Q+Ci0gICAgICAgICAgICA8UHJvamVjdEZpbGVWZXJzaW9uPjEyPC9Qcm9qZWN0RmlsZVZlcnNpb24+Ci0gICAgICAgIDwvUHJvamVjdEV4dGVuc2lvbnM+Ci0gICAgPC9Qcm9qZWN0Pgor77u/CTxQcm9qZWN0IHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorCQk8UHJvcGVydHlHcm91cD4KKwkJCTxQcm9qZWN0R3VpZD57MkI4RkIzQTEtMkY5RS00ODgzLThDNTMtMEY1NjIyMEIzNEY2fTwvUHJvamVjdEd1aWQ+CisJCQk8TWFpblNvdXJjZT5EZWxwaGlTZXJ2ZXIuZHByPC9NYWluU291cmNlPgorCQkJPFByb2plY3RWZXJzaW9uPjEyLjM8L1Byb2plY3RWZXJzaW9uPgorCQkJPEJhc2lzPlRydWU8L0Jhc2lzPgorCQkJPENvbmZpZyBDb25kaXRpb249IickKENvbmZpZyknPT0nJyI+RGVidWc8L0NvbmZpZz4KKwkJCTxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+CisJCQk8QXBwVHlwZT5Db25zb2xlPC9BcHBUeXBlPgorCQkJPEZyYW1ld29ya1R5cGU+Tm9uZTwvRnJhbWV3b3JrVHlwZT4KKwkJCTxEQ0NfRENDQ29tcGlsZXI+RENDMzI8L0RDQ19EQ0NDb21waWxlcj4KKwkJPC9Qcm9wZXJ0eUdyb3VwPgorCQk8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZyknPT0nQmFzaXMnIG9yICckKEJhc2UpJyE9JyciPgorCQkJPEJhc2U+dHJ1ZTwvQmFzZT4KKwkJPC9Qcm9wZXJ0eUdyb3VwPgorCQk8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZyknPT0nRGVidWcnIG9yICckKENmZ18xKSchPScnIj4KKwkJCTxDZmdfMT50cnVlPC9DZmdfMT4KKwkJCTxDZmdQYXJlbnQ+QmFzZTwvQ2ZnUGFyZW50PgorCQkJPEJhc2U+dHJ1ZTwvQmFzZT4KKwkJPC9Qcm9wZXJ0eUdyb3VwPgorCQk8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZyknPT0nUmVsZWFzZScgb3IgJyQoQ2ZnXzIpJyE9JyciPgorCQkJPENmZ18yPnRydWU8L0NmZ18yPgorCQkJPENmZ1BhcmVudD5CYXNlPC9DZmdQYXJlbnQ+CisJCQk8QmFzZT50cnVlPC9CYXNlPgorCQk8L1Byb3BlcnR5R3JvdXA+CisJCTxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQmFzZSknIT0nJyI+CisJCQk8RENDX0ltYWdlQmFzZT4wMDQwMDAwMDwvRENDX0ltYWdlQmFzZT4KKwkJCTxEQ0NfRGN1T3V0cHV0Pi5cZGN1XCQoQ29uZmlnKVwkKFBsYXRmb3JtKTwvRENDX0RjdU91dHB1dD4KKwkJCTxEQ0NfVW5pdEFsaWFzPldpblR5cGVzPVdpbmRvd3M7V2luUHJvY3M9V2luZG93cztEYmlUeXBlcz1CREU7RGJpUHJvY3M9QkRFOyQoRENDX1VuaXRBbGlhcyk8L0RDQ19Vbml0QWxpYXM+CisJCQk8RENDX0V4ZU91dHB1dD4uLlxiaW5cJChDb25maWcpXCQoUGxhdGZvcm0pPC9EQ0NfRXhlT3V0cHV0PgorCQkJPERDQ19FPmZhbHNlPC9EQ0NfRT4KKwkJCTxEQ0NfTj5mYWxzZTwvRENDX04+CisJCQk8RENDX1M+ZmFsc2U8L0RDQ19TPgorCQkJPERDQ19GPmZhbHNlPC9EQ0NfRj4KKwkJCTxEQ0NfSz5mYWxzZTwvRENDX0s+CisJCTwvUHJvcGVydHlHcm91cD4KKwkJPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDZmdfMSknIT0nJyI+CisJCQk8RENDX0RlZmluZT5ERUJVRzskKERDQ19EZWZpbmUpPC9EQ0NfRGVmaW5lPgorCQkJPERDQ19PcHRpbWl6ZT5mYWxzZTwvRENDX09wdGltaXplPgorCQkJPERDQ19HZW5lcmF0ZVN0YWNrRnJhbWVzPnRydWU8L0RDQ19HZW5lcmF0ZVN0YWNrRnJhbWVzPgorCQk8L1Byb3BlcnR5R3JvdXA+CisJCTxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ2ZnXzIpJyE9JyciPgorCQkJPERDQ19Mb2NhbERlYnVnU3ltYm9scz5mYWxzZTwvRENDX0xvY2FsRGVidWdTeW1ib2xzPgorCQkJPERDQ19EZWZpbmU+UkVMRUFTRTskKERDQ19EZWZpbmUpPC9EQ0NfRGVmaW5lPgorCQkJPERDQ19TeW1ib2xSZWZlcmVuY2VJbmZvPjA8L0RDQ19TeW1ib2xSZWZlcmVuY2VJbmZvPgorCQkJPERDQ19EZWJ1Z0luZm9ybWF0aW9uPmZhbHNlPC9EQ0NfRGVidWdJbmZvcm1hdGlvbj4KKwkJPC9Qcm9wZXJ0eUdyb3VwPgorCQk8SXRlbUdyb3VwPgorCQkJPERlbHBoaUNvbXBpbGUgSW5jbHVkZT0iRGVscGhpU2VydmVyLmRwciI+CisJCQkJPE1haW5Tb3VyY2U+TWFpblNvdXJjZTwvTWFpblNvdXJjZT4KKwkJCTwvRGVscGhpQ29tcGlsZT4KKwkJCTxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LnBhcyIvPgorCQkJPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuQ29sbGVjdGlvbnMucGFzIi8+CisJCQk8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5FeGNlcHRpb24ucGFzIi8+CisJCQk8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5VdGlscy5wYXMiLz4KKwkJCTxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlN0cmVhbS5wYXMiLz4KKwkJCTxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlByb3RvY29sLnBhcyIvPgorCQkJPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuU2VydmVyLnBhcyIvPgorCQkJPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuVHJhbnNwb3J0LnBhcyIvPgorCQkJPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlxnZW4tZGVscGhpXFNoYXJlZC5wYXMiLz4KKwkJCTxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cZ2VuLWRlbHBoaVxUdXRvcmlhbC5wYXMiLz4KKwkJCTxCdWlsZENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZSI+CisJCQkJPEtleT5DZmdfMjwvS2V5PgorCQkJCTxDZmdQYXJlbnQ+QmFzZTwvQ2ZnUGFyZW50PgorCQkJPC9CdWlsZENvbmZpZ3VyYXRpb24+CisJCQk8QnVpbGRDb25maWd1cmF0aW9uIEluY2x1ZGU9IkJhc2lzIj4KKwkJCQk8S2V5PkJhc2U8L0tleT4KKwkJCTwvQnVpbGRDb25maWd1cmF0aW9uPgorCQkJPEJ1aWxkQ29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1ZyI+CisJCQkJPEtleT5DZmdfMTwvS2V5PgorCQkJCTxDZmdQYXJlbnQ+QmFzZTwvQ2ZnUGFyZW50PgorCQkJPC9CdWlsZENvbmZpZ3VyYXRpb24+CisJCTwvSXRlbUdyb3VwPgorCQk8SW1wb3J0IENvbmRpdGlvbj0iRXhpc3RzKCckKEJEUylcQmluXENvZGVHZWFyLkRlbHBoaS5UYXJnZXRzJykiIFByb2plY3Q9IiQoQkRTKVxCaW5cQ29kZUdlYXIuRGVscGhpLlRhcmdldHMiLz4KKwkJPEltcG9ydCBDb25kaXRpb249IkV4aXN0cygnJChBUFBEQVRBKVxFbWJhcmNhZGVyb1wkKEJEU0FQUERBVEFCQVNFRElSKVwkKFBST0RVQ1RWRVJTSU9OKVxVc2VyVG9vbHMucHJvaicpIiBQcm9qZWN0PSIkKEFQUERBVEEpXEVtYmFyY2FkZXJvXCQoQkRTQVBQREFUQUJBU0VESVIpXCQoUFJPRFVDVFZFUlNJT04pXFVzZXJUb29scy5wcm9qIi8+CisJCTxQcm9qZWN0RXh0ZW5zaW9ucz4KKwkJCTxCb3JsYW5kLlBlcnNvbmFsaXR5PkRlbHBoaS5QZXJzb25hbGl0eS4xMjwvQm9ybGFuZC5QZXJzb25hbGl0eT4KKwkJCTxCb3JsYW5kLlByb2plY3RUeXBlLz4KKwkJCTxCb3JsYW5kUHJvamVjdD4KKwkJCQk8RGVscGhpLlBlcnNvbmFsaXR5PgorCQkJCQk8VmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iSW5jbHVkZVZlckluZm8iPlRydWU8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkF1dG9JbmNCdWlsZCI+RmFsc2U8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9Ik1ham9yVmVyIj4wPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJNaW5vclZlciI+MTI8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IlJlbGVhc2UiPjA8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkJ1aWxkIj4wPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJEZWJ1ZyI+RmFsc2U8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IlByZVJlbGVhc2UiPkZhbHNlPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJTcGVjaWFsIj5GYWxzZTwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iUHJpdmF0ZSI+RmFsc2U8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkRMTCI+RmFsc2U8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkxvY2FsZSI+MTAzMzwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iQ29kZVBhZ2UiPjEyNTI8L1ZlcnNpb25JbmZvPgorCQkJCQk8L1ZlcnNpb25JbmZvPgorCQkJCQk8VmVyc2lvbkluZm9LZXlzPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJDb21wYW55TmFtZSIvPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJGaWxlRGVzY3JpcHRpb24iPlRocmlmdCBUdXRvcmlhbDwvVmVyc2lvbkluZm9LZXlzPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJGaWxlVmVyc2lvbiI+MS4wLjAuMDwvVmVyc2lvbkluZm9LZXlzPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJJbnRlcm5hbE5hbWUiPkRlbHBoaVNlcnZlcjwvVmVyc2lvbkluZm9LZXlzPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJMZWdhbENvcHlyaWdodCI+Q29weXJpZ2h0IMKpIDIwMTIgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9WZXJzaW9uSW5mb0tleXM+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9IkxlZ2FsVHJhZGVtYXJrcyIvPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJPcmlnaW5hbEZpbGVuYW1lIj5EZWxwaGlTZXJ2ZXIuZXhlPC9WZXJzaW9uSW5mb0tleXM+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9IlByb2R1Y3ROYW1lIj5UaHJpZnQ8L1ZlcnNpb25JbmZvS2V5cz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iUHJvZHVjdFZlcnNpb24iPjEuMC4wLjA8L1ZlcnNpb25JbmZvS2V5cz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iQ29tbWVudHMiLz4KKwkJCQkJPC9WZXJzaW9uSW5mb0tleXM+CisJCQkJCTxTb3VyY2U+CisJCQkJCQk8U291cmNlIE5hbWU9Ik1haW5Tb3VyY2UiPkRlbHBoaVNlcnZlci5kcHI8L1NvdXJjZT4KKwkJCQkJPC9Tb3VyY2U+CisJCQkJPC9EZWxwaGkuUGVyc29uYWxpdHk+CisJCQkJPFBsYXRmb3Jtcz4KKwkJCQkJPFBsYXRmb3JtIHZhbHVlPSJXaW4zMiI+VHJ1ZTwvUGxhdGZvcm0+CisJCQkJPC9QbGF0Zm9ybXM+CisJCQk8L0JvcmxhbmRQcm9qZWN0PgorCQkJPFByb2plY3RGaWxlVmVyc2lvbj4xMjwvUHJvamVjdEZpbGVWZXJzaW9uPgorCQk8L1Byb2plY3RFeHRlbnNpb25zPgorCTwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2VybC9jbGllbnQuZXJsIGIvdHV0b3JpYWwvZXJsL2NsaWVudC5lcmwKaW5kZXggNWQ0MDkxNi4uMDM3NDIyMCAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvZXJsL2NsaWVudC5lcmwKKysrIGIvdHV0b3JpYWwvZXJsL2NsaWVudC5lcmwKQEAgLTI4LDcgKzI4LDcgQEAKICAgICBvay4KIAogdCgpIC0+Ci0gICAgUG9ydCA9IDk5OTksCisgICAgUG9ydCA9IDkwOTAsCiAKICAgICB7b2ssIENsaWVudDB9ID0gdGhyaWZ0X2NsaWVudF91dGlsOm5ldygiMTI3LjAuMC4xIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3J0LApAQCAtNDQsNyArNDQsNyBAQAogICAgIHtDbGllbnQzLCB7b2ssIFN1bTF9fSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQyLCBhZGQsIFsxLCA0XSksCiAgICAgaW86Zm9ybWF0KCIxKzQ9fnB+biIsIFtTdW0xXSksCiAKLSAgICBXb3JrID0gI3dvcmt7b3A9P3R1dG9yaWFsX09wZXJhdGlvbl9TVUJUUkFDVCwKKyAgICBXb3JrID0gIydXb3JrJ3tvcD0/VFVUT1JJQUxfT1BFUkFUSU9OX1NVQlRSQUNULAogICAgICAgICAgICAgICAgICBudW0xPTE1LAogICAgICAgICAgICAgICAgICBudW0yPTEwfSwKICAgICB7Q2xpZW50NCwge29rLCBEaWZmfX0gPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MywgY2FsY3VsYXRlLCBbMSwgV29ya10pLApAQCAtNTUsNyArNTUsNyBAQAogCiAgICAgQ2xpZW50NiA9CiAgICAgICAgIHRyeQotICAgICAgICAgICAgV29yazEgPSAjd29ya3tvcD0/dHV0b3JpYWxfT3BlcmF0aW9uX0RJVklERSwKKyAgICAgICAgICAgIFdvcmsxID0gIydXb3JrJ3tvcD0/VFVUT1JJQUxfT1BFUkFUSU9OX0RJVklERSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtMT0xLAogICAgICAgICAgICAgICAgICAgICAgICAgICBudW0yPTB9LAogICAgICAgICAgICAge0NsaWVudFMxLCB7b2ssIF9RdW90fX0gPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50NSwgY2FsY3VsYXRlLCBbMiwgV29yazFdKSwKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2VybC9jbGllbnQuc2ggYi90dXRvcmlhbC9lcmwvY2xpZW50LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCBhNDE3ZTBkLi4wMDAwMDAwCi0tLSBhL3R1dG9yaWFsL2VybC9jbGllbnQuc2gKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1zZXJ2ZXIuc2gKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90dXRvcmlhbC9lcmwvY2xpZW50LnNoIGIvdHV0b3JpYWwvZXJsL2NsaWVudC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43NzVhZmI2Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZXJsL2NsaWVudC5zaApAQCAtMCwwICsxLDM3IEBACisjIS9iaW4vc2gKKworIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK0VSTF9USFJJRlQ9Li4vLi4vbGliL2VybAorCitpZiAhIFsgLWQgJHtFUkxfVEhSSUZUfS9lYmluIF07IHRoZW4KKyAgICBlY2hvICJQbGVhc2UgYnVpbGQgdGhlIFRocmlmdCBsaWJyYXJ5IGJ5IHJ1bm5pbmcgXGBtYWtlJyBpbiAke0VSTF9USFJJRlR9IgorICAgIGV4aXQgMQorZmkKKworaWYgISBbIC1kIGdlbi1lcmwgXTsgdGhlbgorICAuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1yIC0tZ2VuIGVybCAuLi90dXRvcmlhbC50aHJpZnQKK2ZpCisKKworZXJsYyAtSSAke0VSTF9USFJJRlR9L2luY2x1ZGUgLUkgJHtFUkxfVEhSSUZUfS9lYmluIFwKKyAgICAgLUkgZ2VuLWVybCAtbyBnZW4tZXJsIGdlbi1lcmwvKi5lcmwgJiYKKyAgZXJsYyAtSSAke0VSTF9USFJJRlR9L2luY2x1ZGUgLUkgZ2VuLWVybCAqLmVybCAmJgorICBlcmwgK0sgdHJ1ZSAtcGEgJHtFUkxfVEhSSUZUfS9lYmluIC1wYSBnZW4tZXJsCmRpZmYgLS1naXQgYS90dXRvcmlhbC9lcmwvanNvbl9jbGllbnQuZXJsIGIvdHV0b3JpYWwvZXJsL2pzb25fY2xpZW50LmVybAppbmRleCA1MjRlOWFlLi4wYjM5Y2VkIDEwMDY0NAotLS0gYS90dXRvcmlhbC9lcmwvanNvbl9jbGllbnQuZXJsCisrKyBiL3R1dG9yaWFsL2VybC9qc29uX2NsaWVudC5lcmwKQEAgLTI3LDggKzI3LDggQEAKIAogLWV4cG9ydChbdC8wXSkuCiAKLSUlIENsaWVudCBjb25zdHJ1Y3RvciBmb3IgdGhlIGNvbW1vbi1jYXNlIG9mIHNvY2tldCB0cmFuc3BvcnRzCi0lJSB3aXRoIHRoZSBiaW5hcnkgcHJvdG9jb2wKKyUlIENsaWVudCBjb25zdHJ1Y3RvciBmb3IgdGhlIGh0dHAgdHJhbnNwb3J0cworJSUgd2l0aCB0aGUganNvbiBwcm90b2NvbAogbmV3X2NsaWVudChIb3N0LCBQYXRoLCBTZXJ2aWNlLCBfT3B0aW9ucykgLT4KICAgICB7UHJvdG9PcHRzLCBUcmFuc09wdHN9ID0ge1tdLFtdfSwKICAgICBUcmFuc3BvcnRGYWN0b3J5ID0gZnVuKCkgLT4gdGhyaWZ0X2h0dHBfdHJhbnNwb3J0Om5ldyhIb3N0LCBQYXRoLCBUcmFuc09wdHMpIGVuZCwKQEAgLTU1LDcgKzU1LDcgQEAKICAgICB7Q2xpZW50Mywge29rLCBTdW0xfX0gPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MiwgYWRkLCBbMSwgNF0pLAogICAgIGlvOmZvcm1hdCgiMSs0PX5wfm4iLCBbU3VtMV0pLAogCi0gICAgV29yayA9ICN3b3Jre29wPT90dXRvcmlhbF9PcGVyYXRpb25fU1VCVFJBQ1QsCisgICAgV29yayA9ICMnV29yayd7b3A9P1RVVE9SSUFMX09QRVJBVElPTl9TVUJUUkFDVCwKICAgICAgICAgICAgICAgICAgbnVtMT0xNSwKICAgICAgICAgICAgICAgICAgbnVtMj0xMH0sCiAgICAge0NsaWVudDQsIHtvaywgRGlmZn19ID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDMsIGNhbGN1bGF0ZSwgWzEsIFdvcmtdKSwKQEAgLTY2LDcgKzY2LDcgQEAKIAogICAgIENsaWVudDYgPQogICAgICAgICB0cnkKLSAgICAgICAgICAgIFdvcmsxID0gI3dvcmt7b3A9P3R1dG9yaWFsX09wZXJhdGlvbl9ESVZJREUsCisgICAgICAgICAgICBXb3JrMSA9ICMnV29yayd7b3A9P1RVVE9SSUFMX09QRVJBVElPTl9ESVZJREUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bTE9MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtMj0wfSwKICAgICAgICAgICAgIHtDbGllbnRTMSwge29rLCBfUXVvdH19ID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDUsIGNhbGN1bGF0ZSwgWzIsIFdvcmsxXSksCmRpZmYgLS1naXQgYS90dXRvcmlhbC9lcmwvc2VydmVyLmVybCBiL3R1dG9yaWFsL2VybC9zZXJ2ZXIuZXJsCmluZGV4IGYxZTczNTcuLjY0N2NjMjQgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2VybC9zZXJ2ZXIuZXJsCisrKyBiL3R1dG9yaWFsL2VybC9zZXJ2ZXIuZXJsCkBAIC0zNiwyNSArMzYsMjUgQEAKICAgICBOMStOMi4KIAogY2FsY3VsYXRlKExvZ2lkLCBXb3JrKSAtPgotICAgIHsgT3AsIE51bTEsIE51bTIgfSA9IHsgV29yayN3b3JrLm9wLCBXb3JrI3dvcmsubnVtMSwgV29yayN3b3JrLm51bTIgfSwKKyAgICB7IE9wLCBOdW0xLCBOdW0yIH0gPSB7IFdvcmsjJ1dvcmsnLm9wLCBXb3JrIydXb3JrJy5udW0xLCBXb3JrIydXb3JrJy5udW0yIH0sCiAgICAgZGVidWcoImNhbGN1bGF0ZSh+cCwge35wLH5wLH5wfSkiLCBbTG9naWQsIE9wLCBOdW0xLCBOdW0yXSksCiAgICAgY2FzZSBPcCBvZgotICAgICAgICA/dHV0b3JpYWxfT3BlcmF0aW9uX0FERCAgICAgIC0+IE51bTEgKyBOdW0yOwotICAgICAgICA/dHV0b3JpYWxfT3BlcmF0aW9uX1NVQlRSQUNUIC0+IE51bTEgLSBOdW0yOwotICAgICAgICA/dHV0b3JpYWxfT3BlcmF0aW9uX01VTFRJUExZIC0+IE51bTEgKiBOdW0yOworICAgICAgICA/VFVUT1JJQUxfT1BFUkFUSU9OX0FERCAgICAgIC0+IE51bTEgKyBOdW0yOworICAgICAgICA/VFVUT1JJQUxfT1BFUkFUSU9OX1NVQlRSQUNUIC0+IE51bTEgLSBOdW0yOworICAgICAgICA/VFVUT1JJQUxfT1BFUkFUSU9OX01VTFRJUExZIC0+IE51bTEgKiBOdW0yOwogCi0gICAgICAgID90dXRvcmlhbF9PcGVyYXRpb25fRElWSURFIHdoZW4gTnVtMiA9PSAwIC0+Ci0gICAgICAgICAgdGhyb3coI2ludmFsaWRPcGVyYXRpb257d2hhdE9wPU9wLCB3aHk9IkNhbm5vdCBkaXZpZGUgYnkgMCJ9KTsKLSAgICAgICAgP3R1dG9yaWFsX09wZXJhdGlvbl9ESVZJREUgLT4KKyAgICAgICAgP1RVVE9SSUFMX09QRVJBVElPTl9ESVZJREUgd2hlbiBOdW0yID09IDAgLT4KKyAgICAgICAgICB0aHJvdygjJ0ludmFsaWRPcGVyYXRpb24ne3doYXRPcD1PcCwgd2h5PSJDYW5ub3QgZGl2aWRlIGJ5IDAifSk7CisgICAgICAgID9UVVRPUklBTF9PUEVSQVRJT05fRElWSURFIC0+CiAgICAgICAgICAgTnVtMSBkaXYgTnVtMjsKIAogICAgICAgICBfRWxzZSAtPgotICAgICAgICAgIHRocm93KCNpbnZhbGlkT3BlcmF0aW9ue3doYXRPcD1PcCwgd2h5PSJJbnZhbGlkIG9wZXJhdGlvbiJ9KQorICAgICAgICAgIHRocm93KCMnSW52YWxpZE9wZXJhdGlvbid7d2hhdE9wPU9wLCB3aHk9IkludmFsaWQgb3BlcmF0aW9uIn0pCiAgICAgZW5kLgogCiBnZXRTdHJ1Y3QoS2V5KSAtPgogICAgIGRlYnVnKCJnZXRTdHJ1Y3QofnApIiwgW0tleV0pLAotICAgICNzaGFyZWRTdHJ1Y3R7a2V5PUtleSwgdmFsdWU9IlJBUkcifS4KKyAgICAjJ1NoYXJlZFN0cnVjdCd7a2V5PUtleSwgdmFsdWU9IlJBUkcifS4KIAogemlwKCkgLT4KICAgICBkZWJ1ZygiemlwIiwgW10pLApAQCAtNjMsNyArNjMsNyBAQAogJSUKIAogc3RhcnQoKSAtPgotICAgIHN0YXJ0KDk5OTkpLgorICAgIHN0YXJ0KDkwOTApLgogCiBzdGFydChQb3J0KSAtPgogICAgIEhhbmRsZXIgICA9ID9NT0RVTEUsCmRpZmYgLS1naXQgYS90dXRvcmlhbC9nby9NYWtlZmlsZS5hbSBiL3R1dG9yaWFsL2dvL01ha2VmaWxlLmFtCmluZGV4IGE3MDdkNWQuLmJkNTdkNjUgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2dvL01ha2VmaWxlLmFtCisrKyBiL3R1dG9yaWFsL2dvL01ha2VmaWxlLmFtCkBAIC0xNywzMCArMTcsMjggQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLVRIUklGVCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0Ci0KIGdlbi1nby90dXRvcmlhbC9jYWxjdWxhdG9yLmdvIGdlbi1nby9zaGFyZWQvc2hhcmVkX3NlcnZpY2UuZ286ICQodG9wX3NyY2RpcikvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0Ci0JJChUSFJJRlQpIC0tZ2VuIGdvIC1yICQ8CisJJChUSFJJRlQpIC0tZ2VuIGdvJChDT01QSUxFUl9FWFRSQUZMQUcpIC1yICQ8CiAKIGFsbC1sb2NhbDogZ2VuLWdvL3R1dG9yaWFsL2NhbGN1bGF0b3IuZ28KIAotCi1jaGVjazogc3JjL2dpdC5hcGFjaGUub3JnL3RocmlmdC5naXQvbGliL2dvL3RocmlmdAotCSQoVEhSSUZUKSAtciAtLWdlbiBnbyAkKHRvcF9zcmNkaXIpL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdAorY2hlY2s6IHNyYy9naXRodWIuY29tL2FwYWNoZS90aHJpZnQvbGliL2dvL3RocmlmdCB0aGlyZHBhcnR5LWRlcAorCSQoVEhSSUZUKSAtciAtLWdlbiBnbyQoQ09NUElMRVJfRVhUUkFGTEFHKSAkKHRvcF9zcmNkaXIpL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdAogCWNwIC1yIGdlbi1nby8qIHNyYy8KLQlHT1BBVEg9YHB3ZGAgJChHTykgYnVpbGQgLi8uLi4KLQlHT1BBVEg9YHB3ZGAgJChHTykgYnVpbGQgLW8gZ28tdHV0b3JpYWwgc3JjLyouZ28KKwlHT1BBVEg9YHB3ZGAgJChHTykgYnVpbGQgLW8gZ28tdHV0b3JpYWwgLi9zcmMKIAlHT1BBVEg9YHB3ZGAgJChHTykgYnVpbGQgLW8gY2FsY3VsYXRvci1yZW1vdGUgc3JjL3R1dG9yaWFsL2NhbGN1bGF0b3ItcmVtb3RlL2NhbGN1bGF0b3ItcmVtb3RlLmdvCiAKLXNyYy9naXQuYXBhY2hlLm9yZy90aHJpZnQuZ2l0L2xpYi9nby90aHJpZnQ6Ci0JbWtkaXIgLXAgc3JjL2dpdC5hcGFjaGUub3JnL3RocmlmdC5naXQvbGliL2dvCi0JbG4gLXNmICQocmVhbHBhdGggJCh0b3Bfc3JjZGlyKS9saWIvZ28vdGhyaWZ0KSBzcmMvZ2l0LmFwYWNoZS5vcmcvdGhyaWZ0LmdpdC9saWIvZ28vdGhyaWZ0CitzcmMvZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L2xpYi9nby90aHJpZnQ6CisJbWtkaXIgLXAgc3JjL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC9saWIvZ28KKwlsbiAtc2YgJChyZWFscGF0aCAkKHRvcF9zcmNkaXIpL2xpYi9nby90aHJpZnQpIHNyYy9naXRodWIuY29tL2FwYWNoZS90aHJpZnQvbGliL2dvL3RocmlmdAorCit0aGlyZHBhcnR5LWRlcDoKIAogdHV0b3JpYWxzZXJ2ZXI6IGFsbAogCUdPUEFUSD1gcHdkYCAkKEdPKSBydW4gc3JjLyouZ28gLXNlcnZlcj10cnVlCiAKIHR1dG9yaWFsY2xpZW50OiBhbGwKLQlHT1BBVEg9YHB3ZGAgJChHTykgcnVuIHNyYy8qLmdvIAorCUdPUEFUSD1gcHdkYCAkKEdPKSBydW4gc3JjLyouZ28KIAogdHV0b3JpYWxzZWN1cmVzZXJ2ZXI6IGFsbAogCUdPUEFUSD1gcHdkYCAkKEdPKSBydW4gc3JjLyouZ28gLXNlcnZlcj10cnVlIC1zZWN1cmU9dHJ1ZQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZ28vc3JjL2NsaWVudC5nbyBiL3R1dG9yaWFsL2dvL3NyYy9jbGllbnQuZ28KaW5kZXggYTQ5N2Q3Zi4uZTNlYmUwMCAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvZ28vc3JjL2NsaWVudC5nbworKysgYi90dXRvcmlhbC9nby9zcmMvY2xpZW50LmdvCkBAIC0yMCwyNCArMjAsMjggQEAKICAqLwogCiBpbXBvcnQgKAorCSJjb250ZXh0IgogCSJjcnlwdG8vdGxzIgogCSJmbXQiCi0JImdpdC5hcGFjaGUub3JnL3RocmlmdC5naXQvbGliL2dvL3RocmlmdCIKIAkidHV0b3JpYWwiCisKKwkiZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L2xpYi9nby90aHJpZnQiCiApCiAKK3ZhciBkZWZhdWx0Q3R4ID0gY29udGV4dC5CYWNrZ3JvdW5kKCkKKwogZnVuYyBoYW5kbGVDbGllbnQoY2xpZW50ICp0dXRvcmlhbC5DYWxjdWxhdG9yQ2xpZW50KSAoZXJyIGVycm9yKSB7Ci0JY2xpZW50LlBpbmcoKQorCWNsaWVudC5QaW5nKGRlZmF1bHRDdHgpCiAJZm10LlByaW50bG4oInBpbmcoKSIpCiAKLQlzdW0sIF8gOj0gY2xpZW50LkFkZCgxLCAxKQorCXN1bSwgXyA6PSBjbGllbnQuQWRkKGRlZmF1bHRDdHgsIDEsIDEpCiAJZm10LlByaW50KCIxKzE9Iiwgc3VtLCAiXG4iKQogCiAJd29yayA6PSB0dXRvcmlhbC5OZXdXb3JrKCkKIAl3b3JrLk9wID0gdHV0b3JpYWwuT3BlcmF0aW9uX0RJVklERQogCXdvcmsuTnVtMSA9IDEKIAl3b3JrLk51bTIgPSAwCi0JcXVvdGllbnQsIGVyciA6PSBjbGllbnQuQ2FsY3VsYXRlKDEsIHdvcmspCisJcXVvdGllbnQsIGVyciA6PSBjbGllbnQuQ2FsY3VsYXRlKGRlZmF1bHRDdHgsIDEsIHdvcmspCiAJaWYgZXJyICE9IG5pbCB7CiAJCXN3aXRjaCB2IDo9IGVyci4odHlwZSkgewogCQljYXNlICp0dXRvcmlhbC5JbnZhbGlkT3BlcmF0aW9uOgpAQCAtNTMsNyArNTcsNyBAQAogCXdvcmsuT3AgPSB0dXRvcmlhbC5PcGVyYXRpb25fU1VCVFJBQ1QKIAl3b3JrLk51bTEgPSAxNQogCXdvcmsuTnVtMiA9IDEwCi0JZGlmZiwgZXJyIDo9IGNsaWVudC5DYWxjdWxhdGUoMSwgd29yaykKKwlkaWZmLCBlcnIgOj0gY2xpZW50LkNhbGN1bGF0ZShkZWZhdWx0Q3R4LCAxLCB3b3JrKQogCWlmIGVyciAhPSBuaWwgewogCQlzd2l0Y2ggdiA6PSBlcnIuKHR5cGUpIHsKIAkJY2FzZSAqdHV0b3JpYWwuSW52YWxpZE9wZXJhdGlvbjoKQEAgLTY2LDcgKzcwLDcgQEAKIAkJZm10LlByaW50KCIxNS0xMD0iLCBkaWZmLCAiXG4iKQogCX0KIAotCWxvZywgZXJyIDo9IGNsaWVudC5HZXRTdHJ1Y3QoMSkKKwlsb2csIGVyciA6PSBjbGllbnQuR2V0U3RydWN0KGRlZmF1bHRDdHgsIDEpCiAJaWYgZXJyICE9IG5pbCB7CiAJCWZtdC5QcmludGxuKCJVbmFibGUgdG8gZ2V0IHN0cnVjdDoiLCBlcnIpCiAJCXJldHVybiBlcnIKQEAgLTkwLDEwICs5NCwxNSBAQAogCQlmbXQuUHJpbnRsbigiRXJyb3Igb3BlbmluZyBzb2NrZXQ6IiwgZXJyKQogCQlyZXR1cm4gZXJyCiAJfQotCXRyYW5zcG9ydCA9IHRyYW5zcG9ydEZhY3RvcnkuR2V0VHJhbnNwb3J0KHRyYW5zcG9ydCkKKwl0cmFuc3BvcnQsIGVyciA9IHRyYW5zcG9ydEZhY3RvcnkuR2V0VHJhbnNwb3J0KHRyYW5zcG9ydCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KIAlkZWZlciB0cmFuc3BvcnQuQ2xvc2UoKQogCWlmIGVyciA6PSB0cmFuc3BvcnQuT3BlbigpOyBlcnIgIT0gbmlsIHsKIAkJcmV0dXJuIGVycgogCX0KLQlyZXR1cm4gaGFuZGxlQ2xpZW50KHR1dG9yaWFsLk5ld0NhbGN1bGF0b3JDbGllbnRGYWN0b3J5KHRyYW5zcG9ydCwgcHJvdG9jb2xGYWN0b3J5KSkKKwlpcHJvdCA6PSBwcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnNwb3J0KQorCW9wcm90IDo9IHByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbCh0cmFuc3BvcnQpCisJcmV0dXJuIGhhbmRsZUNsaWVudCh0dXRvcmlhbC5OZXdDYWxjdWxhdG9yQ2xpZW50KHRocmlmdC5OZXdUU3RhbmRhcmRDbGllbnQoaXByb3QsIG9wcm90KSkpCiB9CmRpZmYgLS1naXQgYS90dXRvcmlhbC9nby9zcmMvaGFuZGxlci5nbyBiL3R1dG9yaWFsL2dvL3NyYy9oYW5kbGVyLmdvCmluZGV4IDE3NjM4MzIuLjVjMGVlZDAgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2dvL3NyYy9oYW5kbGVyLmdvCisrKyBiL3R1dG9yaWFsL2dvL3NyYy9oYW5kbGVyLmdvCkBAIC0yMCw2ICsyMCw3IEBACiAgKi8KIAogaW1wb3J0ICgKKwkiY29udGV4dCIKIAkiZm10IgogCSJzaGFyZWQiCiAJInN0cmNvbnYiCkBAIC0zNCwxNyArMzUsMTcgQEAKIAlyZXR1cm4gJkNhbGN1bGF0b3JIYW5kbGVye2xvZzogbWFrZShtYXBbaW50XSpzaGFyZWQuU2hhcmVkU3RydWN0KX0KIH0KIAotZnVuYyAocCAqQ2FsY3VsYXRvckhhbmRsZXIpIFBpbmcoKSAoZXJyIGVycm9yKSB7CitmdW5jIChwICpDYWxjdWxhdG9ySGFuZGxlcikgUGluZyhjdHggY29udGV4dC5Db250ZXh0KSAoZXJyIGVycm9yKSB7CiAJZm10LlByaW50KCJwaW5nKClcbiIpCiAJcmV0dXJuIG5pbAogfQogCi1mdW5jIChwICpDYWxjdWxhdG9ySGFuZGxlcikgQWRkKG51bTEgaW50MzIsIG51bTIgaW50MzIpIChyZXR2YWwxNyBpbnQzMiwgZXJyIGVycm9yKSB7CitmdW5jIChwICpDYWxjdWxhdG9ySGFuZGxlcikgQWRkKGN0eCBjb250ZXh0LkNvbnRleHQsIG51bTEgaW50MzIsIG51bTIgaW50MzIpIChyZXR2YWwxNyBpbnQzMiwgZXJyIGVycm9yKSB7CiAJZm10LlByaW50KCJhZGQoIiwgbnVtMSwgIiwiLCBudW0yLCAiKVxuIikKIAlyZXR1cm4gbnVtMSArIG51bTIsIG5pbAogfQogCi1mdW5jIChwICpDYWxjdWxhdG9ySGFuZGxlcikgQ2FsY3VsYXRlKGxvZ2lkIGludDMyLCB3ICp0dXRvcmlhbC5Xb3JrKSAodmFsIGludDMyLCBlcnIgZXJyb3IpIHsKK2Z1bmMgKHAgKkNhbGN1bGF0b3JIYW5kbGVyKSBDYWxjdWxhdGUoY3R4IGNvbnRleHQuQ29udGV4dCwgbG9naWQgaW50MzIsIHcgKnR1dG9yaWFsLldvcmspICh2YWwgaW50MzIsIGVyciBlcnJvcikgewogCWZtdC5QcmludCgiY2FsY3VsYXRlKCIsIGxvZ2lkLCAiLCB7Iiwgdy5PcCwgIiwiLCB3Lk51bTEsICIsIiwgdy5OdW0yLCAifSlcbiIpCiAJc3dpdGNoIHcuT3AgewogCWNhc2UgdHV0b3JpYWwuT3BlcmF0aW9uX0FERDoKQEAgLTg5LDEzICs5MCwxMyBAQAogCXJldHVybiB2YWwsIGVycgogfQogCi1mdW5jIChwICpDYWxjdWxhdG9ySGFuZGxlcikgR2V0U3RydWN0KGtleSBpbnQzMikgKCpzaGFyZWQuU2hhcmVkU3RydWN0LCBlcnJvcikgeworZnVuYyAocCAqQ2FsY3VsYXRvckhhbmRsZXIpIEdldFN0cnVjdChjdHggY29udGV4dC5Db250ZXh0LCBrZXkgaW50MzIpICgqc2hhcmVkLlNoYXJlZFN0cnVjdCwgZXJyb3IpIHsKIAlmbXQuUHJpbnQoImdldFN0cnVjdCgiLCBrZXksICIpXG4iKQogCXYsIF8gOj0gcC5sb2dbaW50KGtleSldCiAJcmV0dXJuIHYsIG5pbAogfQogCi1mdW5jIChwICpDYWxjdWxhdG9ySGFuZGxlcikgWmlwKCkgKGVyciBlcnJvcikgeworZnVuYyAocCAqQ2FsY3VsYXRvckhhbmRsZXIpIFppcChjdHggY29udGV4dC5Db250ZXh0KSAoZXJyIGVycm9yKSB7CiAJZm10LlByaW50KCJ6aXAoKVxuIikKIAlyZXR1cm4gbmlsCiB9CmRpZmYgLS1naXQgYS90dXRvcmlhbC9nby9zcmMvbWFpbi5nbyBiL3R1dG9yaWFsL2dvL3NyYy9tYWluLmdvCmluZGV4IDYzMTU0ZTMuLjc3MzBkN2IgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2dvL3NyYy9tYWluLmdvCisrKyBiL3R1dG9yaWFsL2dvL3NyYy9tYWluLmdvCkBAIC0yMiw3ICsyMiw3IEBACiBpbXBvcnQgKAogCSJmbGFnIgogCSJmbXQiCi0JImdpdC5hcGFjaGUub3JnL3RocmlmdC5naXQvbGliL2dvL3RocmlmdCIKKwkiZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L2xpYi9nby90aHJpZnQiCiAJIm9zIgogKQogCmRpZmYgLS1naXQgYS90dXRvcmlhbC9nby9zcmMvc2VydmVyLmdvIGIvdHV0b3JpYWwvZ28vc3JjL3NlcnZlci5nbwppbmRleCBlNGM0Yjk3Li45NTcwOGViIDEwMDY0NAotLS0gYS90dXRvcmlhbC9nby9zcmMvc2VydmVyLmdvCisrKyBiL3R1dG9yaWFsL2dvL3NyYy9zZXJ2ZXIuZ28KQEAgLTIyLDcgKzIyLDcgQEAKIGltcG9ydCAoCiAJImNyeXB0by90bHMiCiAJImZtdCIKLQkiZ2l0LmFwYWNoZS5vcmcvdGhyaWZ0LmdpdC9saWIvZ28vdGhyaWZ0IgorCSJnaXRodWIuY29tL2FwYWNoZS90aHJpZnQvbGliL2dvL3RocmlmdCIKIAkidHV0b3JpYWwiCiApCiAKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2hheGUvTWFrZWZpbGUuYW0gYi90dXRvcmlhbC9oYXhlL01ha2VmaWxlLmFtCmluZGV4IGMzYzUyMDQuLmU2ZjI3MTMgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2hheGUvTWFrZWZpbGUuYW0KKysrIGIvdHV0b3JpYWwvaGF4ZS9NYWtlZmlsZS5hbQpAQCAtMTcsNDcgKzE3LDgxIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1USFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAorQklOX0NQUCA9IGJpbi9NYWluLWRlYnVnCitCSU5fUEhQID0gYmluL3BocC9NYWluLWRlYnVnLnBocAorQklOX1BIUF9XRUIgPSBiaW4vcGhwLXdlYi1zZXJ2ZXIvTWFpbi1kZWJ1Zy5waHAKIAogZ2VuLWhheGUvdHV0b3JpYWwvY2FsY3VsYXRvci5oeCBnZW4taGF4ZS9zaGFyZWQvc2hhcmVkX3NlcnZpY2UuaHg6ICQodG9wX3NyY2RpcikvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CiAJJChUSFJJRlQpIC0tZ2VuIGhheGUgLXIgJDwKIAotYWxsLWxvY2FsOiBiaW4vTWFpbi1kZWJ1ZworYWxsLWxvY2FsOiAkKEJJTl9DUFApICQoQklOX1BIUCkgJChCSU5fUEhQX1dFQikKIAogY2hlY2s6IGdlbi1oYXhlL3R1dG9yaWFsL2NhbGN1bGF0b3IuaHgKIAotYmluL01haW4tZGVidWc6IFwKKyQoQklOX0NQUCk6IFwKIAkJc3JjLyouaHggXAogCQkuLi8uLi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvKiovKi5oeCBcCiAJCWdlbi1oYXhlL3R1dG9yaWFsL2NhbGN1bGF0b3IuaHgKIAkkKEhBWEUpIC0tY3dkIC4gIGNwcC5oeG1sCiAKKyQoQklOX1BIUCk6IFwKKwkJc3JjLyouaHggXAorCQkuLi8uLi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvKiovKi5oeCBcCisJCWdlbi1oYXhlL3R1dG9yaWFsL2NhbGN1bGF0b3IuaHgKKwkkKEhBWEUpIC0tY3dkIC4gIHBocC5oeG1sCisKKyQoQklOX1BIUF9XRUIpOiBcCisJCXNyYy8qLmh4IFwKKwkJLi4vLi4vbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0LyoqLyouaHggXAorCQlnZW4taGF4ZS90dXRvcmlhbC9jYWxjdWxhdG9yLmh4CisJJChIQVhFKSAtLWN3ZCAuICBwaHAtd2ViLXNlcnZlci5oeG1sCisKIHR1dG9yaWFsc2VydmVyOiBhbGwKLQliaW4vTWFpbi1kZWJ1ZyBzZXJ2ZXIKKwkkKEJJTl9DUFApIHNlcnZlcgorCit0dXRvcmlhbHNlcnZlcl9waHA6IGFsbAorCXBocCAtZiAkKEJJTl9QSFApIHNlcnZlcgogCiB0dXRvcmlhbGNsaWVudDogYWxsCi0JYmluL01haW4tZGVidWcKKwkkKEJJTl9DUFApCisKK3R1dG9yaWFsY2xpZW50X3BocDogYWxsCisJcGhwIC1mICQoQklOX1BIUCkgCiAKIHR1dG9yaWFsc2VjdXJlc2VydmVyOiBhbGwKLQliaW4vTWFpbi1kZWJ1ZyBzZXJ2ZXIgc2VjdXJlCisJJChCSU5fQ1BQKSBzZXJ2ZXIgc2VjdXJlCisKK3R1dG9yaWFsc2VjdXJlc2VydmVyX3BocDogYWxsCisJcGhwIC1mICQoQklOX1BIUCkgc2VydmVyIHNlY3VyZQogCiB0dXRvcmlhbHNlY3VyZWNsaWVudDogYWxsCi0JYmluL01haW4tZGVidWcgc2VjdXJlCisJJChCSU5fQ1BQKSBzZWN1cmUKKwordHV0b3JpYWxzZWN1cmVjbGllbnRfcGhwOiBhbGwKKwlwaHAgLWYgJChCSU5fUEhQKSBzZWN1cmUKKwordHV0b3JpYWxzZXJ2ZXJfcGhwX2h0dHA6IGFsbAorCXBocCAtUyAxMjcuMC4wLjE6OTA5MCByb3V0ZXIucGhwCisKK3R1dG9yaWFsY2xpZW50X2h0dHA6IGFsbAorCSQoQklOX0NQUCkgY2xpZW50IGh0dHAKIAogY2xlYW4tbG9jYWw6CiAJJChSTSkgLXIgZ2VuLWhheGUgYmluCiAKIEVYVFJBX0RJU1QgPSBcCi0gICAgICAgICAgICAgc3JjIFwKLSAgICAgICAgICAgICBjcHAuaHhtbCBcCi0gICAgICAgICAgICAgY3NoYXJwLmh4bWwgXAotICAgICAgICAgICAgIGZsYXNoLmh4bWwgXAotICAgICAgICAgICAgIGphdmEuaHhtbCBcCi0gICAgICAgICAgICAgamF2YXNjcmlwdC5oeG1sIFwKLSAgICAgICAgICAgICBuZWtvLmh4bWwgXAotICAgICAgICAgICAgIHBocC5oeG1sIFwKLSAgICAgICAgICAgICBweXRob24uaHhtbCBcCi0gICAgICAgICAgICAgcHJvamVjdC5oaWRlIFwKLSAgICAgICAgICAgICBUdXRvcmlhbC5oeHByb2ogXAotICAgICAgICAgICAgIG1ha2VfYWxsLmJhdCBcCi0gICAgICAgICAgICAgbWFrZV9hbGwuc2gKKwlzcmMgXAorCWNwcC5oeG1sIFwKKwljc2hhcnAuaHhtbCBcCisJZmxhc2guaHhtbCBcCisJamF2YS5oeG1sIFwKKwlqYXZhc2NyaXB0Lmh4bWwgXAorCXBocC13ZWItc2VydmVyLmh4bWwgXAorCW5la28uaHhtbCBcCisJcGhwLmh4bWwgXAorCXB5dGhvbi5oeG1sIFwKKwlyb3V0ZXIucGhwIFwKKwlwcm9qZWN0LmhpZGUgXAorCVR1dG9yaWFsLmh4cHJvaiBcCisJbWFrZV9hbGwuYmF0IFwKKwltYWtlX2FsbC5zaApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvaGF4ZS9waHAtd2ViLXNlcnZlci5oeG1sIGIvdHV0b3JpYWwvaGF4ZS9waHAtd2ViLXNlcnZlci5oeG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NWE4NTIKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9oYXhlL3BocC13ZWItc2VydmVyLmh4bWwKQEAgLTAsMCArMSw0MyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisgCisjaW50ZWdyYXRlIGZpbGVzIHRvIGNsYXNzcGF0aAorLWNwIHNyYworLWNwIGdlbi1oYXhlCistY3AgLi4vLi4vbGliL2hheGUvc3JjCisKKyN0aGlzIGNsYXNzIHdpbCBiZSB1c2VkIGFzIGVudHJ5IHBvaW50IGZvciB5b3VyIGFwcC4KKy1tYWluIE1haW4KKworI1BIUCB0YXJnZXQKKy1waHAgYmluL3BocC13ZWItc2VydmVyLworLS1waHAtZnJvbnQgTWFpbi1kZWJ1Zy5waHAKKworI2RlZmluZXMKKy1EIHBocHdlYnNlcnZlcgorCisKKyNBZGQgZGVidWcgaW5mb3JtYXRpb24KKy1kZWJ1ZworCisjZGVhZCBjb2RlIGVsaW1pbmF0aW9uIDogcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugbm8iIDogZG8gbm90IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIHN0ZCIgOiByZW1vdmUgdW51c2VkIGNvZGUgaW4gdGhlIHN0ZCBsaWIgKGRlZmF1bHQpCisjIi1kY2UgZnVsbCIgOiByZW1vdmUgYWxsIHVudXNlZCBjb2RlCistZGNlIGZ1bGwKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2hheGUvcGhwLmh4bWwgYi90dXRvcmlhbC9oYXhlL3BocC5oeG1sCmluZGV4IDFlYWFjOGIuLmMyZjY4ODcgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2hheGUvcGhwLmh4bWwKKysrIGIvdHV0b3JpYWwvaGF4ZS9waHAuaHhtbApAQCAtMjYsNyArMjYsOCBAQAogLW1haW4gTWFpbgogCiAjUEhQIHRhcmdldAotLXBocCBiaW4vVHV0b3JpYWwucGhwCistcGhwIGJpbi9waHAvCistLXBocC1mcm9udCBNYWluLWRlYnVnLnBocAogCiAjQWRkIGRlYnVnIGluZm9ybWF0aW9uCiAtZGVidWcKQEAgLTM1LDQgKzM2LDQgQEAKICMiLWRjZSBubyIgOiBkbyBub3QgcmVtb3ZlIHVudXNlZCBjb2RlCiAjIi1kY2Ugc3RkIiA6IHJlbW92ZSB1bnVzZWQgY29kZSBpbiB0aGUgc3RkIGxpYiAoZGVmYXVsdCkKICMiLWRjZSBmdWxsIiA6IHJlbW92ZSBhbGwgdW51c2VkIGNvZGUKLS1kY2UgZnVsbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKy1kY2UgZnVsbApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvaGF4ZS9yb3V0ZXIucGhwIGIvdHV0b3JpYWwvaGF4ZS9yb3V0ZXIucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNDEzNWMKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9oYXhlL3JvdXRlci5waHAKQEAgLTAsMCArMSwzMSBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0CisgKi8KKworCisKKy8vcm91dGVyIGZpbGUgdG8gcnVuIHRlc3Rpbmcgd2ViIHNlcnZlcgorCisvL3NldF90aW1lX2xpbWl0KDEpOworCityZXF1aXJlX29uY2UgIGRpcm5hbWUoX19GSUxFX18pIC4gJy9iaW4vcGhwLXdlYi1zZXJ2ZXIvTWFpbi1kZWJ1Zy5waHAnOworCisKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2hheGUvc3JjL01haW4uaHggYi90dXRvcmlhbC9oYXhlL3NyYy9NYWluLmh4CmluZGV4IDhmMTY4YzEuLjZiZWJlNzEgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2hheGUvc3JjL01haW4uaHgKKysrIGIvdHV0b3JpYWwvaGF4ZS9zcmMvTWFpbi5oeApAQCAtNTEsNyArNTEsOCBAQAogICAgIHByaXZhdGUgc3RhdGljIHZhciB0YXJnZXRQb3J0IDogSW50ID0gOTA5MDsKIAogICAgIHN0YXRpYyBmdW5jdGlvbiBtYWluKCkgewotICAgICAgICAjaWYgISAoZmxhc2ggfHwganMpCisKKyAgICAgICAgI2lmICEgKGZsYXNoIHx8IGpzIHx8IHBocHdlYnNlcnZlcikKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgUGFyc2VBcmdzKCk7CiAgICAgICAgIH0gY2F0Y2ggKGUgOiBTdHJpbmcpIHsKQEAgLTU5LDYgKzYwLDE3IEBACiAgICAgICAgICAgICB0cmFjZShHZXRIZWxwKCkpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CisKKyAgICAgICAgI2Vsc2VpZiAgcGhwd2Vic2VydmVyCisgICAgICAgIC8vZm9yY2luZyBzZXJ2ZXIKKyAgICAgICAgc2VydmVyID0gdHJ1ZTsKKyAgICAgICAgdHJucyA9IGh0dHA7CisgICAgICAgIGluaXRQaHBXZWJTZXJ2ZXIoKTsKKyAgICAgICAgLy9jaGVjayBtZXRob2QKKyAgICAgICAgaWYocGhwLldlYi5nZXRNZXRob2QoKSAhPSAnUE9TVCcpIHsKKyAgICAgICAgICBTeXMucHJpbnRsbignaHR0cCBlbmRwb2ludCBmb3IgdGhyaWZ0IHRlc3Qgc2VydmVyJyk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAgICAgICAgICNlbmQKIAogICAgICAgICB0cnkgewpAQCAtNzMsNiArODUsMjkgQEAKICAgICAgICAgdHJhY2UoIkNvbXBsZXRlZC4iKTsKICAgICB9CiAKKyAgICAjaWYgcGhwd2Vic2VydmVyCisgICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaW5pdFBocFdlYlNlcnZlcigpCisgICAgeworICAgICAgICAvL3JlbWFwIHRyYWNlIHRvIGVycm9yIGxvZworICAgICAgICBoYXhlLkxvZy50cmFjZSA9IGZ1bmN0aW9uKHY6RHluYW1pYywgP2luZm9zOmhheGUuUG9zSW5mb3MpCisgICAgICAgIHsKKyAgICAgICAgICAvLyBoYW5kbGUgdHJhY2UKKyAgICAgICAgICB2YXIgbmV3VmFsdWUgOiBEeW5hbWljOworICAgICAgICAgIGlmIChpbmZvcyAhPSBudWxsICYmIGluZm9zLmN1c3RvbVBhcmFtcyE9bnVsbCkgeworICAgICAgICAgICAgdmFyIGV4dHJhOlN0cmluZyA9ICIiOworICAgICAgICAgICAgZm9yKCB2IGluIGluZm9zLmN1c3RvbVBhcmFtcyApCisgICAgICAgICAgICAgIGV4dHJhICs9ICIsIiArIHY7CisgICAgICAgICAgICBuZXdWYWx1ZSA9IHYgKyBleHRyYTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBuZXdWYWx1ZSA9IHY7CisgICAgICAgICAgfQorICAgICAgICAgIHZhciBtc2cgPSBpbmZvcyAhPSBudWxsID8gaW5mb3MuZmlsZU5hbWUgKyAnOicgKyBpbmZvcy5saW5lTnVtYmVyICsgJzogJyA6ICcnOworICAgICAgICAgIFN5cy5zdGRlcnIoKS53cml0ZVN0cmluZygnJHttc2d9JHtuZXdWYWx1ZX1cbicpOworICAgICAgICB9CisgICAgfQorICAgICNlbmQKKwogCiAgICAgI2lmICEgKGZsYXNoIHx8IGpzKQogCkBAIC0xNTQsOCArMTg5LDkgQEAKICAgICAgICAgICAgICB0cmFjZSgnLSBzb2NrZXQgdHJhbnNwb3J0ICR0YXJnZXRIb3N0OiR0YXJnZXRQb3J0Jyk7CiAgICAgICAgICAgICB0cmFuc3BvcnQgPSBuZXcgVFNvY2tldCggdGFyZ2V0SG9zdCwgdGFyZ2V0UG9ydCk7CiAgICAgICAgIGNhc2UgaHR0cDoKLSAgICAgICAgICAgICB0cmFjZSgnLSBIVFRQIHRyYW5zcG9ydCAkdGFyZ2V0SG9zdCcpOwotICAgICAgICAgICAgdHJhbnNwb3J0ID0gbmV3IFRIdHRwQ2xpZW50KCB0YXJnZXRIb3N0KTsKKyAgICAgICAgICAgIHZhciB1cmkgPSAnaHR0cDovLyR7dGFyZ2V0SG9zdH06JHt0YXJnZXRQb3J0fSc7CisgICAgICAgICAgICB0cmFjZSgnLSBIVFRQIHRyYW5zcG9ydCAkdXJpJyk7CisgICAgICAgICAgICB0cmFuc3BvcnQgPSBuZXcgVEh0dHBDbGllbnQodXJpKTsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHRocm93ICJVbmhhbmRsZWQgdHJhbnNwb3J0IjsKICAgICAgICAgfQpAQCAtMjY3LDkgKzMwMywyMCBAQAogICAgICAgICAgICAgdHJhbnNwb3J0ID0gbmV3IFRTZXJ2ZXJTb2NrZXQoIHRhcmdldFBvcnQpOwogICAgICAgICAgICAgI2VuZAogICAgICAgICBjYXNlIGh0dHA6Ci0gICAgICAgICAgICB0aHJvdyAiSFRUUCBzZXJ2ZXIgbm90IGltcGxlbWVudGVkIHlldCI7Ci0gICAgICAgICAgICAgLy90cmFjZSgiLSBodHRwIHRyYW5zcG9ydCIpOwotICAgICAgICAgICAgIC8vdHJhbnNwb3J0ID0gbmV3IFRIdHRwQ2xpZW50KCB0YXJnZXRIb3N0KTsKKyAgICAgICAgICAgICNpZiAhcGhwd2Vic2VydmVyCisgICAgICAgICAgICAgIHRocm93ICJIVFRQIHNlcnZlciBub3QgaW1wbGVtZW50ZWQgeWV0IjsKKyAgICAgICAgICAgICAgLy90cmFjZSgiLSBodHRwIHRyYW5zcG9ydCIpOworICAgICAgICAgICAgICAvL3RyYW5zcG9ydCA9IG5ldyBUSHR0cENsaWVudCggdGFyZ2V0SG9zdCk7CisgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICB0cmFjZSgiLSBodHRwIHRyYW5zcG9ydCIpOworICAgICAgICAgICAgICB0cmFuc3BvcnQgPSBuZXcgVFdyYXBwaW5nU2VydmVyVHJhbnNwb3J0KAorICAgICAgICAgICAgICAgICAgICAgIG5ldyBUU3RyZWFtVHJhbnNwb3J0KAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRGaWxlU3RyZWFtKCJwaHA6Ly9pbnB1dCIsIFJlYWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRGaWxlU3RyZWFtKCJwaHA6Ly9vdXRwdXQiLCBBcHBlbmQpCisgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgI2VuZAogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgdGhyb3cgIlVuaGFuZGxlZCB0cmFuc3BvcnQiOwogICAgICAgICB9CkBAIC0zMDEsNiArMzQ4LDEwIEBACiAgICAgICAgIHZhciBoYW5kbGVyID0gbmV3IENhbGN1bGF0b3JIYW5kbGVyKCk7CiAgICAgICAgIHZhciBwcm9jZXNzb3IgPSBuZXcgQ2FsY3VsYXRvclByb2Nlc3NvcihoYW5kbGVyKTsKICAgICAgICAgdmFyIHNlcnZlciA9IG5ldyBUU2ltcGxlU2VydmVyKCBwcm9jZXNzb3IsIHRyYW5zcG9ydCwgdHJhbnNmYWN0b3J5LCBwcm90ZmFjdG9yeSk7CisgICAgICAgICNpZiBwaHB3ZWJzZXJ2ZXIKKyAgICAgICAgc2VydmVyLnJ1bk9uY2UgPSB0cnVlOworICAgICAgICAjZW5kCisKICAgICAgICAgcmV0dXJuIHNlcnZlcjsKICAgICB9CiAKQEAgLTMyMSw0ICszNzIsNCBAQAogICAgIH0KIAogfQotIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKwpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvaHMvTElDRU5TRSBiL3R1dG9yaWFsL2hzL0xJQ0VOU0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I2ZDdkNwotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2hzL0xJQ0VOU0UKQEAgLTAsMCArMSwyMzkgQEAKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKworICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisKKyAgIDEuIERlZmluaXRpb25zLgorCisgICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KKyAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKyAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCisgICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKKyAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKyAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisKKyAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAorICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKyAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKKyAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKworICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaworICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKworICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAorICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKKyAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgorICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KKworICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKyAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKKyAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKKyAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAorICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorCisgICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisgICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KKworICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisgICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisKKyAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAorICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKKyAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisgICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKyAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCisgICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisgICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQorICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCisgICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKworICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorCisgICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKKyAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKyAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCisgICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorCisgICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKKyAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90CisgICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCisgICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cworICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCisgICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCisgICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorCisgICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCisgICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKyAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCisKKyAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKKyAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisKKyAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisgICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCisgICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKKyAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgorCisgICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKyAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAorICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKKyAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisgICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKKyAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKyAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKKyAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCisgICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisgICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisKKyAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKyAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAorICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKyAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5CisgICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgorICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CisgICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCisgICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKworICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKKyAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KKworICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKKyAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKKyAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCisgICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQorICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCisgICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCisgICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKKyAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KKworICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCisKKyAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTT0ZUV0FSRSBESVNUUklCVVRFRCBXSVRIIFRIUklGVDoKKworVGhlIEFwYWNoZSBUaHJpZnQgc29mdHdhcmUgaW5jbHVkZXMgYSBudW1iZXIgb2Ygc3ViY29tcG9uZW50cyB3aXRoCitzZXBhcmF0ZSBjb3B5cmlnaHQgbm90aWNlcyBhbmQgbGljZW5zZSB0ZXJtcy4gWW91ciB1c2Ugb2YgdGhlIHNvdXJjZQorY29kZSBmb3IgdGhlIHRoZXNlIHN1YmNvbXBvbmVudHMgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kCitjb25kaXRpb25zIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZXMuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitQb3J0aW9ucyBvZiB0aGUgZm9sbG93aW5nIGZpbGVzIGFyZSBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2U6CisKKyAgbGliL2VybC9zcmMvTWFrZWZpbGUuYW0KKworUGxlYXNlIHNlZSBkb2Mvb3RwLWJhc2UtbGljZW5zZS50eHQgZm9yIHRoZSBmdWxsIHRlcm1zIG9mIHRoaXMgbGljZW5zZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0ZvciB0aGUgYWNsb2NhbC9heF9ib29zdF9iYXNlLm00IGFuZCBjb250cmliL2ZiMzAzL2FjbG9jYWwvYXhfYm9vc3RfYmFzZS5tNCBjb21wb25lbnRzOgorCisjICAgQ29weXJpZ2h0IChjKSAyMDA3IFRob21hcyBQb3JzY2hiZXJnIDx0aG9tYXNAcmFuZHNwcmluZ2VyLmRlPgorIworIyAgIENvcHlpbmcgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIGZpbGUsIHdpdGggb3Igd2l0aG91dAorIyAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgcm95YWx0eSBwcm92aWRlZAorIyAgIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIG5vdGljZSBhcmUgcHJlc2VydmVkLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRm9yIHRoZSBsaWIvbm9kZWpzL2xpYi90aHJpZnQvanNvbl9wYXJzZS5qczoKKworLyoKKyAgICBqc29uX3BhcnNlLmpzCisgICAgMjAxNS0wNS0wMgorICAgIFB1YmxpYyBEb21haW4uCisgICAgTk8gV0FSUkFOVFkgRVhQUkVTU0VEIE9SIElNUExJRUQuIFVTRSBBVCBZT1VSIE9XTiBSSVNLLgorCisqLworKEJ5IERvdWdsYXMgQ3JvY2tmb3JkIDxkb3VnbGFzQGNyb2NrZm9yZC5jb20+KQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2hzL01ha2VmaWxlLmFtIGIvdHV0b3JpYWwvaHMvTWFrZWZpbGUuYW0KaW5kZXggZjI3NGViNi4uYTNlY2NjMiAxMDA3NTUKLS0tIGEvdHV0b3JpYWwvaHMvTWFrZWZpbGUuYW0KKysrIGIvdHV0b3JpYWwvaHMvTWFrZWZpbGUuYW0KQEAgLTM3LDMgKzM3LDYgQEAKIAogdHV0b3JpYWxjbGllbnQ6IGFsbAogCWRpc3QvYnVpbGQvSGFza2VsbENsaWVudC9IYXNrZWxsQ2xpZW50CisKK0VYVFJBX0RJU1QgPSBcCisJTElDRU5TRQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvaHMvVGhyaWZ0VHV0b3JpYWwuY2FiYWwgYi90dXRvcmlhbC9ocy9UaHJpZnRUdXRvcmlhbC5jYWJhbAppbmRleCBlNmYwMTgyLi42MmU2ODJmIDEwMDc1NQotLS0gYS90dXRvcmlhbC9ocy9UaHJpZnRUdXRvcmlhbC5jYWJhbAorKysgYi90dXRvcmlhbC9ocy9UaHJpZnRUdXRvcmlhbC5jYWJhbApAQCAtMTgsNyArMTgsNyBAQAogLS0KIAogTmFtZTogICAgICAgICAgIFRocmlmdFR1dG9yaWFsCi1WZXJzaW9uOiAgICAgICAgMC4xLjAKK1ZlcnNpb246ICAgICAgICAxLjAuMAogQ2FiYWwtVmVyc2lvbjogID49IDEuNAogTGljZW5zZTogICAgICAgIE90aGVyTGljZW5zZQogQ2F0ZWdvcnk6ICAgICAgIEZvcmVpZ24KQEAgLTI3LDcgKzI3LDcgQEAKIEhvbWVwYWdlOiAgICAgICBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcKIEJ1Zy1SZXBvcnRzOiAgICBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVAogTWFpbnRhaW5lcjogICAgIGRldkB0aHJpZnQuYXBhY2hlLm9yZwotTGljZW5zZS1GaWxlOiAgIC4uLy4uL0xJQ0VOU0UKK0xpY2Vuc2UtRmlsZTogICBMSUNFTlNFCiAKIERlc2NyaXB0aW9uOgogICBIYXNrZWxsIHR1dG9yaWFsIGZvciB0aGUgQXBhY2hlIFRocmlmdCBSUEMgc3lzdGVtLiBSZXF1aXJlcyB0aGUgdXNlIG9mIHRoZSB0aHJpZnQgY29kZSBnZW5lcmF0b3IuCmRpZmYgLS1naXQgYS90dXRvcmlhbC9qYXZhL2J1aWxkLnhtbCBiL3R1dG9yaWFsL2phdmEvYnVpbGQueG1sCmluZGV4IDc2MzhkNWIuLjU1Y2RiOGYgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2phdmEvYnVpbGQueG1sCisrKyBiL3R1dG9yaWFsL2phdmEvYnVpbGQueG1sCkBAIC0yNSwxMSArMjUsMTMgQEAKICAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkIiBsb2NhdGlvbj0iYnVpbGQiIC8+CiAKICAgPHBhdGggaWQ9ImxpYnMuY2xhc3NwYXRoIj4KLSAgICA8ZmlsZXNldCBkaXI9Ii4uLy4uL2xpYi9qYXZhL2J1aWxkIj4KLSAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIiAvPgotICAgICAgPGV4Y2x1ZGUgbmFtZT0iLXRlc3QuamFyIiAvPgorICAgIDxmaWxlc2V0IGRpcj0iLi4vLi4vbGliL2phdmEvYnVpbGQvbGlicyI+CisgICAgICA8aW5jbHVkZSBuYW1lPSJsaWJ0aHJpZnQqLmphciIgLz4KKyAgICAgIDxleGNsdWRlIG5hbWU9ImxpYnRocmlmdCp0ZXN0LmphciIgLz4KKyAgICAgIDxleGNsdWRlIG5hbWU9ImxpYnRocmlmdCpqYXZhZG9jLmphciIgLz4KKyAgICAgIDxleGNsdWRlIG5hbWU9ImxpYnRocmlmdCpzb3VyY2VzLmphciIgLz4KICAgICA8L2ZpbGVzZXQ+Ci0gICAgPGZpbGVzZXQgZGlyPSIuLi8uLi9saWIvamF2YS9idWlsZC9saWIiPgorICAgIDxmaWxlc2V0IGRpcj0iLi4vLi4vbGliL2phdmEvYnVpbGQvZGVwcyI+CiAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciIgLz4KICAgICA8L2ZpbGVzZXQ+CiAgIDwvcGF0aD4KQEAgLTQyLDcgKzQ0LDcgQEAKICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtidWlsZH0iIC8+CiAgICAgPHBhdGhlbGVtZW50IHBhdGg9InR1dG9yaWFsLmphciIgLz4KICAgPC9wYXRoPgotICAKKwogICA8dGFyZ2V0IG5hbWU9ImluaXQiPgogICAgIDx0c3RhbXAgLz4KICAgICA8bWtkaXIgZGlyPSIke2J1aWxkfSIvPgpAQCAtNTAsOCArNTIsOCBAQAogICA8L3RhcmdldD4KIAogICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUiIGRlcGVuZHM9ImluaXQsIGdlbmVyYXRlIj4KLSAgICA8amF2YWMgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIiBzcmNkaXI9IiR7Z2VufSIgZGVzdGRpcj0iJHtidWlsZH0iIGNsYXNzcGF0aHJlZj0ibGlicy5jbGFzc3BhdGgiIC8+Ci0gICAgPGphdmFjIGluY2x1ZGVhbnRydW50aW1lPSJmYWxzZSIgc3JjZGlyPSIke3NyY30iIGRlc3RkaXI9IiR7YnVpbGR9IiBjbGFzc3BhdGhyZWY9ImJ1aWxkLmNsYXNzcGF0aCIgLz4KKyAgICA8amF2YWMgY29tcGlsZXI9Im1vZGVybiIgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIiBzcmNkaXI9IiR7Z2VufSIgZGVzdGRpcj0iJHtidWlsZH0iIGNsYXNzcGF0aHJlZj0ibGlicy5jbGFzc3BhdGgiIC8+CisgICAgPGphdmFjIGNvbXBpbGVyPSJtb2Rlcm4iIGluY2x1ZGVhbnRydW50aW1lPSJmYWxzZSIgc3JjZGlyPSIke3NyY30iIGRlc3RkaXI9IiR7YnVpbGR9IiBjbGFzc3BhdGhyZWY9ImJ1aWxkLmNsYXNzcGF0aCIgLz4KICAgPC90YXJnZXQ+CiAKICAgPHRhcmdldCBuYW1lPSJ0ZXN0IiBkZXBlbmRzPSJ0dXRvcmlhbCIgLz4KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2pzL2J1aWxkLnhtbCBiL3R1dG9yaWFsL2pzL2J1aWxkLnhtbAppbmRleCBhOWE5YWQ0Li4wM2E2ZTdjIDEwMDY0NAotLS0gYS90dXRvcmlhbC9qcy9idWlsZC54bWwKKysrIGIvdHV0b3JpYWwvanMvYnVpbGQueG1sCkBAIC0zMSwxMSArMzEsMTMgQEAKICAgPHByb3BlcnR5IG5hbWU9InRocmlmdC5qYXZhLmRpciIgbG9jYXRpb249IiR7dGhyaWZ0LmRpcn0vbGliL2phdmEiIC8+CiAKICAgPHBhdGggaWQ9ImxpYnMuY2xhc3NwYXRoIj4KLSAgICA8ZmlsZXNldCBkaXI9Ii4uLy4uL2xpYi9qYXZhL2J1aWxkIj4KLSAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIiAvPgotICAgICAgPGV4Y2x1ZGUgbmFtZT0iLXRlc3QuamFyIiAvPgorICAgIDxmaWxlc2V0IGRpcj0iJHt0aHJpZnQuamF2YS5kaXJ9L2J1aWxkL2xpYnMiPgorICAgICAgPGluY2x1ZGUgbmFtZT0ibGlidGhyaWZ0Ki5qYXIiIC8+CisgICAgICA8ZXhjbHVkZSBuYW1lPSJsaWJ0aHJpZnQqdGVzdC5qYXIiIC8+CisgICAgICA8ZXhjbHVkZSBuYW1lPSJsaWJ0aHJpZnQqamF2YWRvYy5qYXIiIC8+CisgICAgICA8ZXhjbHVkZSBuYW1lPSJsaWJ0aHJpZnQqc291cmNlcy5qYXIiIC8+CiAgICAgPC9maWxlc2V0PgotICAgIDxmaWxlc2V0IGRpcj0iLi4vLi4vbGliL2phdmEvYnVpbGQvbGliIj4KKyAgICA8ZmlsZXNldCBkaXI9IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC9kZXBzIj4KICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIiAvPgogICAgIDwvZmlsZXNldD4KICAgPC9wYXRoPgpAQCAtNTEsMTMgKzUzLDEzIEBACiAgIDwvdGFyZ2V0PgogCiAgIDx0YXJnZXQgbmFtZT0iY29tcGlsZSIgZGVwZW5kcz0iaW5pdCI+Ci0gICAgPGphdmFjIGluY2x1ZGVhbnRydW50aW1lPSJmYWxzZSIgc3JjZGlyPSIke2dlbn0iIGRlc3RkaXI9IiR7YnVpbGR9IiBjbGFzc3BhdGhyZWY9ImxpYnMuY2xhc3NwYXRoIiAvPgotICAgIDxqYXZhYyBpbmNsdWRlYW50cnVudGltZT0iZmFsc2UiIHNyY2Rpcj0iJHtqYXZhc3JjfSIgZGVzdGRpcj0iJHtidWlsZH0iIGNsYXNzcGF0aHJlZj0iYnVpbGQuY2xhc3NwYXRoIj4KKyAgICA8amF2YWMgY29tcGlsZXI9Im1vZGVybiIgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIiBzcmNkaXI9IiR7Z2VufSIgZGVzdGRpcj0iJHtidWlsZH0iIGNsYXNzcGF0aHJlZj0ibGlicy5jbGFzc3BhdGgiIC8+CisgICAgPGphdmFjIGNvbXBpbGVyPSJtb2Rlcm4iIGluY2x1ZGVhbnRydW50aW1lPSJmYWxzZSIgc3JjZGlyPSIke2phdmFzcmN9IiBkZXN0ZGlyPSIke2J1aWxkfSIgY2xhc3NwYXRocmVmPSJidWlsZC5jbGFzc3BhdGgiPgogICAgICAgPGV4Y2x1ZGUgbmFtZT0iSmF2YUNsaWVudC5qYXZhIi8+CiAgICAgICA8ZXhjbHVkZSBuYW1lPSJKYXZhU2VydmVyLmphdmEiLz4KICAgICAgIDxpbmNsdWRlIG5hbWU9IkNhbGN1bGF0b3JIYW5kbGVyLmphdmEiLz4KICAgICA8L2phdmFjPgotICAgIDxqYXZhYyBpbmNsdWRlYW50cnVudGltZT0iZmFsc2UiIHNyY2Rpcj0iJHtzcmN9IiBkZXN0ZGlyPSIke2J1aWxkfSIgY2xhc3NwYXRocmVmPSJidWlsZC5jbGFzc3BhdGgiPgorICAgIDxqYXZhYyBjb21waWxlcj0ibW9kZXJuIiBpbmNsdWRlYW50cnVudGltZT0iZmFsc2UiIHNyY2Rpcj0iJHtzcmN9IiBkZXN0ZGlyPSIke2J1aWxkfSIgY2xhc3NwYXRocmVmPSJidWlsZC5jbGFzc3BhdGgiPgogICAgICAgPGNvbXBpbGVyYXJnIHZhbHVlPSItWGxpbnQ6YWxsIi8+CiAgICAgPC9qYXZhYz4KICAgPC90YXJnZXQ+CkBAIC04MCw3ICs4Miw3IEBACiAgICAgICA8YXJnIGxpbmU9Ii0tZ2VuIGpzIC1yICAuLi90dXRvcmlhbC50aHJpZnQiLz4KICAgICA8L2V4ZWM+CiAgIDwvdGFyZ2V0PgotICAKKwogICA8dGFyZ2V0IG5hbWU9ImNsZWFuIj4KICAgICA8ZGVsZXRlIGRpcj0iJHtidWlsZH0iIC8+CiAgICAgPGRlbGV0ZSBkaXI9Imdlbi1qcyIvPgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvanMvdHV0b3JpYWwuaHRtbCBiL3R1dG9yaWFsL2pzL3R1dG9yaWFsLmh0bWwKaW5kZXggZDdmMzk0NS4uZDAyMGJlZCAxMDA3NTUKLS0tIGEvdHV0b3JpYWwvanMvdHV0b3JpYWwuaHRtbAorKysgYi90dXRvcmlhbC9qcy90dXRvcmlhbC5odG1sCkBAIC05OCw3ICs5OCw3IEBACiAgIDwvdGFibGU+CiAgIDwvZm9ybT4KICAgCi0gIDxwPlRoaXMgSmF2YSBTY3JpcHQgZXhhbXBsZSB1c2VzIDxhIGhyZWY9Imh0dHBzOi8vZ2l0LXdpcC11cy5hcGFjaGUub3JnL3JlcG9zL2FzZj9wPXRocmlmdC5naXQ7YT1ibG9iO2Y9dHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0O2hiPUhFQUQiPnR1dG9yaWFsLnRocmlmdDwvYT4gYW5kIGEgVGhyaWZ0IHNlcnZlciB1c2luZyBKU09OIHByb3RvY29sIGFuZCBIVFRQIHRyYW5zcG9ydC4KKyAgPHA+VGhpcyBKYXZhIFNjcmlwdCBleGFtcGxlIHVzZXMgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQvYmxvYi9tYXN0ZXIvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0Ij50dXRvcmlhbC50aHJpZnQ8L2E+IGFuZCBhIFRocmlmdCBzZXJ2ZXIgdXNpbmcgSlNPTiBwcm90b2NvbCBhbmQgSFRUUCB0cmFuc3BvcnQuCiAgIDwvcD4KICAgICA8cD4KICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3ZhbGlkYXRvci53My5vcmcvY2hlY2svcmVmZXJlciI+PGltZwpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbmV0Y29yZS8uZ2l0aWdub3JlIGIvdHV0b3JpYWwvbmV0Y29yZS8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MzhiYjIKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9uZXRjb3JlLy5naXRpZ25vcmUKQEAgLTAsMCArMSBAQAorISoqLyoucGZ4ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbmV0Y29yZS9DbGllbnQvQ2xpZW50LmNzcHJvaiBiL3R1dG9yaWFsL25ldGNvcmUvQ2xpZW50L0NsaWVudC5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTExMjcyZAotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL25ldGNvcmUvQ2xpZW50L0NsaWVudC5jc3Byb2oKQEAgLTAsMCArMSwxOSBAQAorPFByb2plY3QgU2RrPSJNaWNyb3NvZnQuTkVULlNkayI+CisKKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPFRhcmdldEZyYW1ld29yaz5uZXRjb3JlYXBwMi4wPC9UYXJnZXRGcmFtZXdvcms+CisgICAgPEFzc2VtYmx5TmFtZT5DbGllbnQ8L0Fzc2VtYmx5TmFtZT4KKyAgICA8UGFja2FnZUlkPkNsaWVudDwvUGFja2FnZUlkPgorICAgIDxPdXRwdXRUeXBlPkV4ZTwvT3V0cHV0VHlwZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvbmZpZ3VyYXRpb25BdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb25maWd1cmF0aW9uQXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5Q29tcGFueUF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUNvbXBhbnlBdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlQcm9kdWN0QXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5UHJvZHVjdEF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvcHlyaWdodEF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUNvcHlyaWdodEF0dHJpYnV0ZT4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorCisgIDxJdGVtR3JvdXA+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cSW50ZXJmYWNlc1xJbnRlcmZhY2VzLmNzcHJvaiIgLz4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcbmV0Y29yZVxUaHJpZnRcVGhyaWZ0LmNzcHJvaiIgLz4KKyAgPC9JdGVtR3JvdXA+CisKKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25ldGNvcmUvQ2xpZW50L1Byb2dyYW0uY3MgYi90dXRvcmlhbC9uZXRjb3JlL0NsaWVudC9Qcm9ncmFtLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNWQ4YzcKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9uZXRjb3JlL0NsaWVudC9Qcm9ncmFtLmNzCkBAIC0wLDAgKzEsMzU1IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLk5ldDsKK3VzaW5nIFN5c3RlbS5OZXQuU2VjdXJpdHk7Cit1c2luZyBTeXN0ZW0uU2VjdXJpdHkuQ3J5cHRvZ3JhcGh5Llg1MDlDZXJ0aWZpY2F0ZXM7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIE1pY3Jvc29mdC5FeHRlbnNpb25zLkxvZ2dpbmc7Cit1c2luZyBUaHJpZnQ7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHM7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0cy5DbGllbnQ7Cit1c2luZyB0dXRvcmlhbDsKK3VzaW5nIHNoYXJlZDsKKworbmFtZXNwYWNlIENsaWVudAoreworICAgIHB1YmxpYyBjbGFzcyBQcm9ncmFtCisgICAgeworICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBJTG9nZ2VyIExvZ2dlciA9IG5ldyBMb2dnZXJGYWN0b3J5KCkuQWRkQ29uc29sZSgpLkFkZERlYnVnKCkuQ3JlYXRlTG9nZ2VyKG5hbWVvZihDbGllbnQpKTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIERpc3BsYXlIZWxwKCkKKyAgICAgICAgeworICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKEAiCitVc2FnZTogCisgICAgQ2xpZW50LmV4ZSAtaGVscAorICAgICAgICB3aWxsIGRpcGxheSBoZWxwIGluZm9ybWF0aW9uIAorCisgICAgQ2xpZW50LmV4ZSAtdHI6PHRyYW5zcG9ydD4gLXByOjxwcm90b2NvbD4gLW1jOjxudW1DbGllbnRzPgorICAgICAgICB3aWxsIHJ1biBjbGllbnQgd2l0aCBzcGVjaWZpZWQgYXJndW1lbnRzICh0Y3AgdHJhbnNwb3J0IGFuZCBiaW5hcnkgcHJvdG9jb2wgYnkgZGVmYXVsdCkgYW5kIHdpdGggMSBjbGllbnQKKworT3B0aW9uczoKKyAgICAtdHIgKHRyYW5zcG9ydCk6IAorICAgICAgICB0Y3AgLSAoZGVmYXVsdCkgdGNwIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKGhvc3QgLSAiImxvY2FsaG9zdCIiLCBwb3J0IC0gOTA5MCkKKyAgICAgICAgdGNwYnVmZmVyZWQgLSBidWZmZXJlZCB0cmFuc3BvcnQgb3ZlciB0Y3Agd2lsbCBiZSB1c2VkIChob3N0IC0gIiJsb2NhbGhvc3QiIiwgcG9ydCAtIDkwOTApCisgICAgICAgIG5hbWVkcGlwZSAtIG5hbWVkcGlwZSB0cmFuc3BvcnQgd2lsbCBiZSB1c2VkIChwaXBlIGFkZHJlc3MgLSAiIi50ZXN0IiIpCisgICAgICAgIGh0dHAgLSBodHRwIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKGFkZHJlc3MgLSAiImh0dHA6Ly9sb2NhbGhvc3Q6OTA5MCIiKSAgICAgICAgCisgICAgICAgIHRjcHRscyAtIHRjcCB0bHMgdHJhbnNwb3J0IHdpbGwgYmUgdXNlZCAoaG9zdCAtICIibG9jYWxob3N0IiIsIHBvcnQgLSA5MDkwKQorICAgICAgICBmcmFtZWQgLSB0Y3AgZnJhbWVkIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKGhvc3QgLSAiImxvY2FsaG9zdCIiLCBwb3J0IC0gOTA5MCkKKworICAgIC1wciAocHJvdG9jb2wpOiAKKyAgICAgICAgYmluYXJ5IC0gKGRlZmF1bHQpIGJpbmFyeSBwcm90b2NvbCB3aWxsIGJlIHVzZWQKKyAgICAgICAgY29tcGFjdCAtIGNvbXBhY3QgcHJvdG9jb2wgd2lsbCBiZSB1c2VkCisgICAgICAgIGpzb24gLSBqc29uIHByb3RvY29sIHdpbGwgYmUgdXNlZAorICAgICAgICBtdWx0aXBsZXhlZCAtIG11bHRpcGxleGVkIHByb3RvY29sIHdpbGwgYmUgdXNlZAorCisgICAgLW1jIChtdWx0aXBsZSBjbGllbnRzKToKKyAgICAgICAgPG51bUNsaWVudHM+IC0gbnVtYmVyIG9mIG11bHRpcGxlIGNsaWVudHMgdG8gY29ubmVjdCB0byBzZXJ2ZXIgKG1heCAxMDAsIGRlZmF1bHQgMSkKKworU2FtcGxlOgorICAgIENsaWVudC5leGUgLXRyOnRjcCAtcDpiaW5hcnkKKyIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIE1haW4oc3RyaW5nW10gYXJncykKKyAgICAgICAgeworICAgICAgICAgICAgYXJncyA9IGFyZ3MgPz8gbmV3IHN0cmluZ1swXTsKKworICAgICAgICAgICAgaWYgKGFyZ3MuQW55KHggPT4geC5TdGFydHNXaXRoKCItaGVscCIsIFN0cmluZ0NvbXBhcmlzb24uT3JkaW5hbElnbm9yZUNhc2UpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEaXNwbGF5SGVscCgpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCJTdGFydGluZyBjbGllbnQuLi4iKTsKKworICAgICAgICAgICAgdXNpbmcgKHZhciBzb3VyY2UgPSBuZXcgQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSdW5Bc3luYyhhcmdzLCBzb3VyY2UuVG9rZW4pLkdldEF3YWl0ZXIoKS5HZXRSZXN1bHQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGFzeW5jIFRhc2sgUnVuQXN5bmMoc3RyaW5nW10gYXJncywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBudW1DbGllbnRzID0gR2V0TnVtYmVyT2ZDbGllbnRzKGFyZ3MpOworCisgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJTZWxlY3RlZCAjIG9mIGNsaWVudHM6IHtudW1DbGllbnRzfSIpOworCisgICAgICAgICAgICB2YXIgdHJhbnNwb3J0cyA9IG5ldyBUQ2xpZW50VHJhbnNwb3J0W251bUNsaWVudHNdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1DbGllbnRzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHQgPSBHZXRUcmFuc3BvcnQoYXJncyk7CisgICAgICAgICAgICAgICAgdHJhbnNwb3J0c1tpXSA9IHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigkIlNlbGVjdGVkIGNsaWVudCB0cmFuc3BvcnQ6IHt0cmFuc3BvcnRzWzBdfSIpOworCisgICAgICAgICAgICB2YXIgcHJvdG9jb2xzID0gbmV3IFR1cGxlPFByb3RvY29sLCBUUHJvdG9jb2w+W251bUNsaWVudHNdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1DbGllbnRzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHAgPSBHZXRQcm90b2NvbChhcmdzLCB0cmFuc3BvcnRzW2ldKTsKKyAgICAgICAgICAgICAgICBwcm90b2NvbHNbaV0gPSBwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJTZWxlY3RlZCBjbGllbnQgcHJvdG9jb2w6IHtwcm90b2NvbHNbMF0uSXRlbTF9Iik7CisKKyAgICAgICAgICAgIHZhciB0YXNrcyA9IG5ldyBUYXNrW251bUNsaWVudHNdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1DbGllbnRzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHRhc2sgPSBSdW5DbGllbnRBc3luYyhwcm90b2NvbHNbaV0sIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICB0YXNrc1tpXSA9IHRhc2s7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFRhc2suV2FpdEFsbCh0YXNrcyk7CisKKyAgICAgICAgICAgIGF3YWl0IFRhc2suQ29tcGxldGVkVGFzazsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFRDbGllbnRUcmFuc3BvcnQgR2V0VHJhbnNwb3J0KHN0cmluZ1tdIGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB0cmFuc3BvcnQgPSBhcmdzLkZpcnN0T3JEZWZhdWx0KHggPT4geC5TdGFydHNXaXRoKCItdHIiKSk/LlNwbGl0KCc6Jyk/WzFdOworCisgICAgICAgICAgICBUcmFuc3BvcnQgc2VsZWN0ZWRUcmFuc3BvcnQ7CisgICAgICAgICAgICBpZiAoRW51bS5UcnlQYXJzZSh0cmFuc3BvcnQsIHRydWUsIG91dCBzZWxlY3RlZFRyYW5zcG9ydCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChzZWxlY3RlZFRyYW5zcG9ydCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVHJhbnNwb3J0LlRjcDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVFNvY2tldENsaWVudFRyYW5zcG9ydChJUEFkZHJlc3MuTG9vcGJhY2ssIDkwOTApOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRyYW5zcG9ydC5OYW1lZFBpcGU6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFROYW1lZFBpcGVDbGllbnRUcmFuc3BvcnQoIi50ZXN0Iik7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVHJhbnNwb3J0Lkh0dHA6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRIdHRwQ2xpZW50VHJhbnNwb3J0KG5ldyBVcmkoImh0dHA6Ly9sb2NhbGhvc3Q6OTA5MCIpLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUcmFuc3BvcnQuVGNwQnVmZmVyZWQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRCdWZmZXJlZENsaWVudFRyYW5zcG9ydChuZXcgVFNvY2tldENsaWVudFRyYW5zcG9ydChJUEFkZHJlc3MuTG9vcGJhY2ssIDkwOTApKTsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUcmFuc3BvcnQuVGNwVGxzOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUVGxzU29ja2V0Q2xpZW50VHJhbnNwb3J0KElQQWRkcmVzcy5Mb29wYmFjaywgOTA5MCwgR2V0Q2VydGlmaWNhdGUoKSwgQ2VydFZhbGlkYXRvciwgTG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUcmFuc3BvcnQuRnJhbWVkOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBURnJhbWVkQ2xpZW50VHJhbnNwb3J0KG5ldyBUU29ja2V0Q2xpZW50VHJhbnNwb3J0KElQQWRkcmVzcy5Mb29wYmFjaywgOTA5MCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG5ldyBUU29ja2V0Q2xpZW50VHJhbnNwb3J0KElQQWRkcmVzcy5Mb29wYmFjaywgOTA5MCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgR2V0TnVtYmVyT2ZDbGllbnRzKHN0cmluZ1tdIGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBudW1DbGllbnRzID0gYXJncy5GaXJzdE9yRGVmYXVsdCh4ID0+IHguU3RhcnRzV2l0aCgiLW1jIikpPy5TcGxpdCgnOicpP1sxXTsKKworICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCQiU2VsZWN0ZWQgIyBvZiBjbGllbnRzOiB7bnVtQ2xpZW50c30iKTsKKworICAgICAgICAgICAgaW50IGM7CisgICAgICAgICAgICBpZiggaW50LlRyeVBhcnNlKG51bUNsaWVudHMsIG91dCBjKSAmJiAoMCA8IGMpICYmIChjIDw9IDEwMCkpCisJCQkJcmV0dXJuIGM7CisJCQllbHNlCisJCQkJcmV0dXJuIDE7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBYNTA5Q2VydGlmaWNhdGUyIEdldENlcnRpZmljYXRlKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gZHVlIHRvIGZpbGVzIGxvY2F0aW9uIGluIG5ldCBjb3JlIGJldHRlciB0byB0YWtlIGNlcnRzIGZyb20gdG9wIGZvbGRlcgorICAgICAgICAgICAgdmFyIGNlcnRGaWxlID0gR2V0Q2VydFBhdGgoRGlyZWN0b3J5LkdldFBhcmVudChEaXJlY3RvcnkuR2V0Q3VycmVudERpcmVjdG9yeSgpKSk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFg1MDlDZXJ0aWZpY2F0ZTIoY2VydEZpbGUsICJUaHJpZnRUZXN0Iik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBzdHJpbmcgR2V0Q2VydFBhdGgoRGlyZWN0b3J5SW5mbyBkaSwgaW50IG1heENvdW50ID0gNikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHRvcERpciA9IGRpOworICAgICAgICAgICAgdmFyIGNlcnRGaWxlID0KKyAgICAgICAgICAgICAgICB0b3BEaXIuRW51bWVyYXRlRmlsZXMoIlRocmlmdFRlc3QucGZ4IiwgU2VhcmNoT3B0aW9uLkFsbERpcmVjdG9yaWVzKQorICAgICAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgIGlmIChjZXJ0RmlsZSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChtYXhDb3VudCA9PSAwKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJDYW5ub3QgZmluZCBmaWxlIGluIGRpcmVjdG9yaWVzIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldENlcnRQYXRoKGRpLlBhcmVudCwgbWF4Q291bnQgLSAxKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGNlcnRGaWxlLkZ1bGxOYW1lOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWDUwOUNlcnRpZmljYXRlIExvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayhvYmplY3Qgc2VuZGVyLAorICAgICAgICAgICAgc3RyaW5nIHRhcmdldEhvc3QsIFg1MDlDZXJ0aWZpY2F0ZUNvbGxlY3Rpb24gbG9jYWxDZXJ0aWZpY2F0ZXMsCisgICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGUgcmVtb3RlQ2VydGlmaWNhdGUsIHN0cmluZ1tdIGFjY2VwdGFibGVJc3N1ZXJzKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gR2V0Q2VydGlmaWNhdGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGJvb2wgQ2VydFZhbGlkYXRvcihvYmplY3Qgc2VuZGVyLCBYNTA5Q2VydGlmaWNhdGUgY2VydGlmaWNhdGUsCisgICAgICAgICAgICBYNTA5Q2hhaW4gY2hhaW4sIFNzbFBvbGljeUVycm9ycyBzc2xQb2xpY3lFcnJvcnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgVHVwbGU8UHJvdG9jb2wsIFRQcm90b2NvbD4gR2V0UHJvdG9jb2woc3RyaW5nW10gYXJncywgVENsaWVudFRyYW5zcG9ydCB0cmFuc3BvcnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBwcm90b2NvbCA9IGFyZ3MuRmlyc3RPckRlZmF1bHQoeCA9PiB4LlN0YXJ0c1dpdGgoIi1wciIpKT8uU3BsaXQoJzonKT9bMV07CisKKyAgICAgICAgICAgIFByb3RvY29sIHNlbGVjdGVkUHJvdG9jb2w7CisgICAgICAgICAgICBpZiAoRW51bS5UcnlQYXJzZShwcm90b2NvbCwgdHJ1ZSwgb3V0IHNlbGVjdGVkUHJvdG9jb2wpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoc2VsZWN0ZWRQcm90b2NvbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUHJvdG9jb2wuQmluYXJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUdXBsZTxQcm90b2NvbCwgVFByb3RvY29sPihzZWxlY3RlZFByb3RvY29sLCBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCkpOworICAgICAgICAgICAgICAgICAgICBjYXNlIFByb3RvY29sLkNvbXBhY3Q6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFR1cGxlPFByb3RvY29sLCBUUHJvdG9jb2w+KHNlbGVjdGVkUHJvdG9jb2wsIG5ldyBUQ29tcGFjdFByb3RvY29sKHRyYW5zcG9ydCkpOworICAgICAgICAgICAgICAgICAgICBjYXNlIFByb3RvY29sLkpzb246CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFR1cGxlPFByb3RvY29sLCBUUHJvdG9jb2w+KHNlbGVjdGVkUHJvdG9jb2wsIG5ldyBUSnNvblByb3RvY29sKHRyYW5zcG9ydCkpOworICAgICAgICAgICAgICAgICAgICBjYXNlIFByb3RvY29sLk11bHRpcGxleGVkOgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQgcmV0dXJucyBCaW5hcnlQcm90b2NvbCB0byBhdm9pZCBtYWtpbmcgd3JhcHBlZCBwcm90b2NvbCBhcyBwdWJsaWMgaW4gVFByb3RvY29sRGVjb3JhdG9yIChpbiBSdW5DbGllbnRBc3luYyBpdCB3aWxsIGJlIHdyYXBwZWQgaW50byBNdWx0aXBsZXhlZCBwcm90b2NvbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVHVwbGU8UHJvdG9jb2wsIFRQcm90b2NvbD4oc2VsZWN0ZWRQcm90b2NvbCwgbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgVHVwbGU8UHJvdG9jb2wsIFRQcm90b2NvbD4oc2VsZWN0ZWRQcm90b2NvbCwgbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGFzeW5jIFRhc2sgUnVuQ2xpZW50QXN5bmMoVHVwbGU8UHJvdG9jb2wsIFRQcm90b2NvbD4gcHJvdG9jb2xUdXBsZSwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBwcm90b2NvbCA9IHByb3RvY29sVHVwbGUuSXRlbTI7CisgICAgICAgICAgICAgICAgdmFyIHByb3RvY29sVHlwZSA9IHByb3RvY29sVHVwbGUuSXRlbTE7CisKKyAgICAgICAgICAgICAgICBUQmFzZUNsaWVudCBjbGllbnQgPSBudWxsOworCisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAocHJvdG9jb2xUeXBlICE9IFByb3RvY29sLk11bHRpcGxleGVkKQorICAgICAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudCA9IG5ldyBDYWxjdWxhdG9yLkNsaWVudChwcm90b2NvbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBFeGVjdXRlQ2FsY3VsYXRvckNsaWVudE9wZXJhdGlvbnMoY2FuY2VsbGF0aW9uVG9rZW4sIChDYWxjdWxhdG9yLkNsaWVudCljbGllbnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQgdXNlcyBiaW5hcnkgcHJvdG9jb2wgdGhlcmUgIHRvIGNyZWF0ZSBNdWx0aXBsZXhlZCBwcm90b2NvbHMKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtdWx0aXBsZXggPSBuZXcgVE11bHRpcGxleGVkUHJvdG9jb2wocHJvdG9jb2wsIG5hbWVvZihDYWxjdWxhdG9yKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQgPSBuZXcgQ2FsY3VsYXRvci5DbGllbnQobXVsdGlwbGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IEV4ZWN1dGVDYWxjdWxhdG9yQ2xpZW50T3BlcmF0aW9ucyhjYW5jZWxsYXRpb25Ub2tlbiwgKENhbGN1bGF0b3IuQ2xpZW50KWNsaWVudCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpcGxleCA9IG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbChwcm90b2NvbCwgbmFtZW9mKFNoYXJlZFNlcnZpY2UpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudCA9IG5ldyBTaGFyZWRTZXJ2aWNlLkNsaWVudChtdWx0aXBsZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgRXhlY3V0ZVNoYXJlZFNlcnZpY2VDbGllbnRPcGVyYXRpb25zKGNhbmNlbGxhdGlvblRva2VuLCAoU2hhcmVkU2VydmljZS5DbGllbnQpY2xpZW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ0Vycm9yKCQie2NsaWVudD8uQ2xpZW50SWR9ICIgKyBleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHByb3RvY29sLlRyYW5zcG9ydC5DbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChUQXBwbGljYXRpb25FeGNlcHRpb24geCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMb2dnZXIuTG9nRXJyb3IoeC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGFzeW5jIFRhc2sgRXhlY3V0ZUNhbGN1bGF0b3JDbGllbnRPcGVyYXRpb25zKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuLCBDYWxjdWxhdG9yLkNsaWVudCBjbGllbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IGNsaWVudC5PcGVuVHJhbnNwb3J0QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICAvLyBBc3luYyB2ZXJzaW9uCisKKyAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigkIntjbGllbnQuQ2xpZW50SWR9IFBpbmdBc3luYygpIik7CisgICAgICAgICAgICBhd2FpdCBjbGllbnQucGluZ0FzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCQie2NsaWVudC5DbGllbnRJZH0gQWRkQXN5bmMoMSwxKSIpOworICAgICAgICAgICAgdmFyIHN1bSA9IGF3YWl0IGNsaWVudC5hZGRBc3luYygxLCAxLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJ7Y2xpZW50LkNsaWVudElkfSBBZGRBc3luYygxLDEpPXtzdW19Iik7CisKKyAgICAgICAgICAgIHZhciB3b3JrID0gbmV3IFdvcmsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBPcCA9IE9wZXJhdGlvbi5ESVZJREUsCisgICAgICAgICAgICAgICAgTnVtMSA9IDEsCisgICAgICAgICAgICAgICAgTnVtMiA9IDAKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigkIntjbGllbnQuQ2xpZW50SWR9IENhbGN1bGF0ZUFzeW5jKDEpIik7CisgICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LmNhbGN1bGF0ZUFzeW5jKDEsIHdvcmssIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJ7Y2xpZW50LkNsaWVudElkfSBXaG9hIHdlIGNhbiBkaXZpZGUgYnkgMCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEludmFsaWRPcGVyYXRpb24gaW8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCQie2NsaWVudC5DbGllbnRJZH0gSW52YWxpZCBvcGVyYXRpb246ICIgKyBpbyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdvcmsuT3AgPSBPcGVyYXRpb24uU1VCVFJBQ1Q7CisgICAgICAgICAgICB3b3JrLk51bTEgPSAxNTsKKyAgICAgICAgICAgIHdvcmsuTnVtMiA9IDEwOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJ7Y2xpZW50LkNsaWVudElkfSBDYWxjdWxhdGVBc3luYygxKSIpOworICAgICAgICAgICAgICAgIHZhciBkaWZmID0gYXdhaXQgY2xpZW50LmNhbGN1bGF0ZUFzeW5jKDEsIHdvcmssIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJ7Y2xpZW50LkNsaWVudElkfSAxNS0xMD17ZGlmZn0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJbnZhbGlkT3BlcmF0aW9uIGlvKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigkIntjbGllbnQuQ2xpZW50SWR9IEludmFsaWQgb3BlcmF0aW9uOiAiICsgaW8pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJ7Y2xpZW50LkNsaWVudElkfSBHZXRTdHJ1Y3RBc3luYygxKSIpOworICAgICAgICAgICAgdmFyIGxvZyA9IGF3YWl0IGNsaWVudC5nZXRTdHJ1Y3RBc3luYygxLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJ7Y2xpZW50LkNsaWVudElkfSBDaGVjayBsb2c6IHtsb2cuVmFsdWV9Iik7CisKKyAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigkIntjbGllbnQuQ2xpZW50SWR9IFppcEFzeW5jKCkgd2l0aCBkZWxheSAxMDBtYyBvbiBzZXJ2ZXIgc2lkZSIpOworICAgICAgICAgICAgYXdhaXQgY2xpZW50LnppcEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIHN0YXRpYyBhc3luYyBUYXNrIEV4ZWN1dGVTaGFyZWRTZXJ2aWNlQ2xpZW50T3BlcmF0aW9ucyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbiwgU2hhcmVkU2VydmljZS5DbGllbnQgY2xpZW50KQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBjbGllbnQuT3BlblRyYW5zcG9ydEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgLy8gQXN5bmMgdmVyc2lvbgorCisgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJ7Y2xpZW50LkNsaWVudElkfSBTaGFyZWRTZXJ2aWNlIEdldFN0cnVjdEFzeW5jKDEpIik7CisgICAgICAgICAgICB2YXIgbG9nID0gYXdhaXQgY2xpZW50LmdldFN0cnVjdEFzeW5jKDEsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigkIntjbGllbnQuQ2xpZW50SWR9IFNoYXJlZFNlcnZpY2UgVmFsdWU6IHtsb2cuVmFsdWV9Iik7CisgICAgICAgIH0KKworCisgICAgICAgIHByaXZhdGUgZW51bSBUcmFuc3BvcnQKKyAgICAgICAgeworICAgICAgICAgICAgVGNwLAorICAgICAgICAgICAgTmFtZWRQaXBlLAorICAgICAgICAgICAgSHR0cCwKKyAgICAgICAgICAgIFRjcEJ1ZmZlcmVkLAorICAgICAgICAgICAgRnJhbWVkLAorICAgICAgICAgICAgVGNwVGxzCisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGVudW0gUHJvdG9jb2wKKyAgICAgICAgeworICAgICAgICAgICAgQmluYXJ5LAorICAgICAgICAgICAgQ29tcGFjdCwKKyAgICAgICAgICAgIEpzb24sCisgICAgICAgICAgICBNdWx0aXBsZXhlZAorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbmV0Y29yZS9DbGllbnQvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi90dXRvcmlhbC9uZXRjb3JlL0NsaWVudC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjgzODJlCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0Y29yZS9DbGllbnQvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKQEAgLTAsMCArMSw0MCBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Cit1c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOworCisvLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nCisvLyBzZXQgb2YgYXR0cmlidXRlcy4gQ2hhbmdlIHRoZXNlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbW9kaWZ5IHRoZSBpbmZvcm1hdGlvbgorLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGFzc2VtYmx5LgorCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiVGhyaWZ0IildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQorCisvLyBTZXR0aW5nIENvbVZpc2libGUgdG8gZmFsc2UgbWFrZXMgdGhlIHR5cGVzIGluIHRoaXMgYXNzZW1ibHkgbm90IHZpc2libGUKKy8vIHRvIENPTSBjb21wb25lbnRzLiAgSWYgeW91IG5lZWQgdG8gYWNjZXNzIGEgdHlwZSBpbiB0aGlzIGFzc2VtYmx5IGZyb20KKy8vIENPTSwgc2V0IHRoZSBDb21WaXNpYmxlIGF0dHJpYnV0ZSB0byB0cnVlIG9uIHRoYXQgdHlwZS4KKworW2Fzc2VtYmx5OiBDb21WaXNpYmxlKGZhbHNlKV0KKworLy8gVGhlIGZvbGxvd2luZyBHVUlEIGlzIGZvciB0aGUgSUQgb2YgdGhlIHR5cGVsaWIgaWYgdGhpcyBwcm9qZWN0IGlzIGV4cG9zZWQgdG8gQ09NCisKK1thc3NlbWJseTogR3VpZCgiZGU3OGEwMWItZjdjNi00OWQxLTk3ZGEtNjY5ZDJlZDM3NjQxIildClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbmV0Y29yZS9DbGllbnQvUHJvcGVydGllcy9sYXVuY2hTZXR0aW5ncy5qc29uIGIvdHV0b3JpYWwvbmV0Y29yZS9DbGllbnQvUHJvcGVydGllcy9sYXVuY2hTZXR0aW5ncy5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiN2I2MGQKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9uZXRjb3JlL0NsaWVudC9Qcm9wZXJ0aWVzL2xhdW5jaFNldHRpbmdzLmpzb24KQEAgLTAsMCArMSw4IEBACit7CisgICJwcm9maWxlcyI6IHsKKyAgICAiQ2xpZW50IjogeworICAgICAgImNvbW1hbmROYW1lIjogIlByb2plY3QiLAorICAgICAgImNvbW1hbmRMaW5lQXJncyI6ICItcDptdWx0aXBsZXhlZCIKKyAgICB9CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90dXRvcmlhbC9uZXRjb3JlL0NsaWVudC9UaHJpZnRUZXN0LnBmeCBiL3R1dG9yaWFsL25ldGNvcmUvQ2xpZW50L1RocmlmdFRlc3QucGZ4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwZGVkMjgKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9uZXRjb3JlL0NsaWVudC9UaHJpZnRUZXN0LnBmeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90dXRvcmlhbC9uZXRjb3JlL0ludGVyZmFjZXMvLmdpdGlnbm9yZSBiL3R1dG9yaWFsL25ldGNvcmUvSW50ZXJmYWNlcy8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNzQ0NmUKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9uZXRjb3JlL0ludGVyZmFjZXMvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDMgQEAKKyMgaWdub3JlIGZvciBhdXRvZ2VuZXJhdGVkIGZpbGVzCisvc2hhcmVkCisvdHV0b3JpYWwKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25ldGNvcmUvSW50ZXJmYWNlcy9JbnRlcmZhY2VzLmNzcHJvaiBiL3R1dG9yaWFsL25ldGNvcmUvSW50ZXJmYWNlcy9JbnRlcmZhY2VzLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Mjk3YTA2Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0Y29yZS9JbnRlcmZhY2VzL0ludGVyZmFjZXMuY3Nwcm9qCkBAIC0wLDAgKzEsMzAgQEAKKzxQcm9qZWN0IFNkaz0iTWljcm9zb2Z0Lk5FVC5TZGsiPgorCisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxUYXJnZXRGcmFtZXdvcms+bmV0c3RhbmRhcmQyLjA8L1RhcmdldEZyYW1ld29yaz4KKyAgICA8QXNzZW1ibHlOYW1lPkludGVyZmFjZXM8L0Fzc2VtYmx5TmFtZT4KKyAgICA8UGFja2FnZUlkPkludGVyZmFjZXM8L1BhY2thZ2VJZD4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvbmZpZ3VyYXRpb25BdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb25maWd1cmF0aW9uQXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5Q29tcGFueUF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUNvbXBhbnlBdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlQcm9kdWN0QXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5UHJvZHVjdEF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvcHlyaWdodEF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUNvcHlyaWdodEF0dHJpYnV0ZT4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorCisgIDxJdGVtR3JvdXA+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi4vLi4vLi4vbGliL25ldGNvcmUvVGhyaWZ0L1RocmlmdC5jc3Byb2oiIC8+CisgIDwvSXRlbUdyb3VwPgorCisgIDxJdGVtR3JvdXA+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlNlcnZpY2VNb2RlbC5QcmltaXRpdmVzIiBWZXJzaW9uPSJbNC40LCkiIC8+CisgIDwvSXRlbUdyb3VwPgorCisgIDxUYXJnZXQgTmFtZT0iUHJlQnVpbGQiIEJlZm9yZVRhcmdldHM9Il9HZW5lcmF0ZVJlc3RvcmVQcm9qZWN0U3BlYztSZXN0b3JlO0NvbXBpbGUiPgorICAgIDxFeGVjIENvbmRpdGlvbj0iJyQoT1MpJyA9PSAnV2luZG93c19OVCciIENvbW1hbmQ9IndoZXJlIHRocmlmdCIgQ29uc29sZVRvTVNCdWlsZD0idHJ1ZSI+CisgICAgICA8T3V0cHV0IFRhc2tQYXJhbWV0ZXI9IkNvbnNvbGVPdXRwdXQiIFByb3BlcnR5TmFtZT0iUGF0aFRvVGhyaWZ0IiAvPgorICAgIDwvRXhlYz4KKyAgICA8RXhlYyBDb25kaXRpb249IkV4aXN0cygnJChQYXRoVG9UaHJpZnQpJykiIENvbW1hbmQ9IiQoUGF0aFRvVGhyaWZ0KSAtb3V0ICQoUHJvamVjdERpcikgLWdlbiBuZXRjb3JlOndjZix1bmlvbixzZXJpYWwsaGFzaGNvZGUgLXIgLi8uLi8uLi90dXRvcmlhbC50aHJpZnQiIC8+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSJFeGlzdHMoJ3RocmlmdCcpIiBDb21tYW5kPSJ0aHJpZnQgLW91dCAkKFByb2plY3REaXIpIC1nZW4gbmV0Y29yZTp3Y2YsdW5pb24sc2VyaWFsLGhhc2hjb2RlIC1yIC4vLi4vLi4vdHV0b3JpYWwudGhyaWZ0IiAvPgorICAgIDxFeGVjIENvbmRpdGlvbj0iRXhpc3RzKCcuLy4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQnKSIgQ29tbWFuZD0iLi8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1vdXQgJChQcm9qZWN0RGlyKSAtZ2VuIG5ldGNvcmU6d2NmLHVuaW9uLHNlcmlhbCxoYXNoY29kZSAtciAuLy4uLy4uL3R1dG9yaWFsLnRocmlmdCIgLz4KKyAgPC9UYXJnZXQ+CisKKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25ldGNvcmUvSW50ZXJmYWNlcy9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL3R1dG9yaWFsL25ldGNvcmUvSW50ZXJmYWNlcy9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTI2YjE3Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0Y29yZS9JbnRlcmZhY2VzL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCkBAIC0wLDAgKzEsNDAgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKKworLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZworLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KKworW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIlRocmlmdCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KKworLy8gU2V0dGluZyBDb21WaXNpYmxlIHRvIGZhbHNlIG1ha2VzIHRoZSB0eXBlcyBpbiB0aGlzIGFzc2VtYmx5IG5vdCB2aXNpYmxlCisvLyB0byBDT00gY29tcG9uZW50cy4gIElmIHlvdSBuZWVkIHRvIGFjY2VzcyBhIHR5cGUgaW4gdGhpcyBhc3NlbWJseSBmcm9tCisvLyBDT00sIHNldCB0aGUgQ29tVmlzaWJsZSBhdHRyaWJ1dGUgdG8gdHJ1ZSBvbiB0aGF0IHR5cGUuCisKK1thc3NlbWJseTogQ29tVmlzaWJsZShmYWxzZSldCisKKy8vIFRoZSBmb2xsb3dpbmcgR1VJRCBpcyBmb3IgdGhlIElEIG9mIHRoZSB0eXBlbGliIGlmIHRoaXMgcHJvamVjdCBpcyBleHBvc2VkIHRvIENPTQorCitbYXNzZW1ibHk6IEd1aWQoIjRkMTMxNjNkLTkwNjctNGM5Yy04YWYwLTY0ZTA4NDUxMzk3ZCIpXQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25ldGNvcmUvTWFrZWZpbGUuYW0gYi90dXRvcmlhbC9uZXRjb3JlL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMDU1NTYKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9uZXRjb3JlL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNDIgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitTVUJESVJTID0gLiAKKworYWxsLWxvY2FsOgorCSQoRE9UTkVUQ09SRSkgYnVpbGQKKworY2xlYW4tbG9jYWw6CisJJChSTSkgSW50ZXJmYWNlcy5kbGwKKwkkKFJNKSAtciBDbGllbnQvYmluCisJJChSTSkgLXIgQ2xpZW50L29iagorCSQoUk0pIC1yIFNlcnZlci9iaW4KKwkkKFJNKSAtciBTZXJ2ZXIvb2JqCisJJChSTSkgLXIgSW50ZXJmYWNlcy9iaW4KKwkkKFJNKSAtciBJbnRlcmZhY2VzL29iagorCitFWFRSQV9ESVNUID0gXAorCUNsaWVudCBcCisJSW50ZXJmYWNlcyBcCisJUkVBRE1FLm1kIFwKKwlTZXJ2ZXIgXAorCVR1dG9yaWFsLnNsbiBcCisJYnVpbGQuY21kIFwKKwlidWlsZC5zaAorCQkJIApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbmV0Y29yZS9SRUFETUUubWQgYi90dXRvcmlhbC9uZXRjb3JlL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjZlZjkyCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0Y29yZS9SRUFETUUubWQKQEAgLTAsMCArMSwyNzggQEAKKyMgQnVpbGRpbmcgb2Ygc2FtcGxlcyBmb3IgZGlmZmVyZW50IHBsYXRmb3JtcyAKKworIyBSZXVzZWQgY29tcG9uZW50cyAKKy0gTkVUIENvcmUgU3RhbmRhcmQgMi4wCistIE5FVCBDb3JlIEFwcCAyLjAKKworIyBIb3cgdG8gYnVpbGQKKy0gRG93bmxvYWQgYW5kIGluc3RhbGwgdGhlIGxhdGVzdCAuTkVUIENvcmUgU0RLIGZvciB5b3VyIHBsYXRmb3JtIGh0dHBzOi8vd3d3Lm1pY3Jvc29mdC5jb20vbmV0L2NvcmUjd2luZG93c3ZzMjAxNSAoYXJjaGl2ZSBmb3IgU0RLIDEuMC4wLXByZXZpZXcyLTAwMzEyMSBsb2NhdGVkIGJ5OiBodHRwczovL2dpdGh1Yi5jb20vZG90bmV0L2NvcmUvYmxvYi9tYXN0ZXIvcmVsZWFzZS1ub3Rlcy9kb3dubG9hZC1hcmNoaXZlLm1kKQorLSBFbnN1cmUgdGhhdCB5b3UgaGF2ZSB0aHJpZnQuZXhlIHdoaWNoIHN1cHBvcnRzIG5ldGNvcmUgbGliIGFuZCBpdCBhZGRlZCB0byBQQVRIIAorLSBHbyB0byBjdXJyZW50IGZvbGRlciAKKy0gUnVuICoqYnVpbGQuc2gqKiBvciAqKmJ1aWxkLmNtZCoqIGZyb20gdGhlIHJvb3Qgb2YgY2xvbmVkIHJlcG9zaXRvcnkKKy0gQ2hlY2sgdGVzdHMgaW4gKipzcmMvVGVzdHMqKiBmb2xkZXIKKy0gQ29udGludWUgd2l0aCAvdHV0b3JpYWxzL25ldGNvcmUgCisKKyMgSG93IHRvIHJ1biAKKworTm90ZXM6IGRvdG5ldCBydW4gc3VwcG9ydHMgcGFzc2luZyBhcmd1bWVudHMgdG8gYXBwIGFmdGVyIC0tIHN5bWJvbHMgKGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL2RvdG5ldC9hcnRpY2xlcy9jb3JlL3Rvb2xzL2RvdG5ldC1ydW4pIC0gZXhhbXBsZTogKipkb3RuZXQgcnVuIC0tIC1oKiogd2lsbCBzaG93IGhlbHAgZm9yIGFwcAorCistIGJ1aWxkIAorLSBnbyB0byBmb2xkZXIgKENsaWVudC9TZXJ2ZXIpIAorLSBydW4gd2l0aCBzcGVjaWZ5aW5nIG9mIGNvcnJlY3QgcGFyYW1ldGVycyAqKmRvdG5ldCBydW4gLXRyOnRjcCAtcHI6bXVsdGlwbGV4ZWQqKiwgKipkb3RuZXQgcnVuIC1oZWxwKiogKGxhdGVyLCBhZnRlciBtaWdyYXRpb24gdG8gY3Nwcm9qIGFuZCBsYXRlc3QgU0RLIHdpbGwgYmUgcG9zc2liaWxpdHkgdG8gdXNlIG1vcmUgdXNhYmxlIGZvcm0gKipkb3RuZXQgcnVuIC0tIGFyZ3VtZW50cyoqKQorCisjTm90ZXMKKy0gUG9zc2libGUgYWRkaW5nIGFkZGl0aW9uYWwgcGxhdGZvcm1zIGFmdGVyIHN0YWJpbGl6YXRpb24gb2YgLk5FVCBDb3JlIChydW50aW1lcywgcGxhdGZvcm1zIChSZWQgSGF0IExpbnV4LCBPcGVuU3VzZSwgZXRjLikgCisKKyNLbm93biBpc3N1ZXMKKy0gSW4gdHJhY2UgbG9nZ2luZyBtb2RlIHlvdSBjYW4gc2VlIHNvbWUgbm90IGltcG9ydGFudCBpbnRlcm5hbCBleGNlcHRpb25zCisKKyMgUnVubmluZyBvZiBzYW1wbGVzIAorUGxlYXNlIGluc3RhbGwgVGhyaWZ0IEMjIC5ORVQgQ29yZSBsaWJyYXJ5IG9yIGNvcHkgc291cmNlcyBhbmQgYnVpbGQgdGhlbSB0byBjb3JyZWNseSBidWlsZCBhbmQgcnVuIHNhbXBsZXMgCisKKyMgTmV0Q29yZSBTZXJ2ZXIKKworVXNhZ2U6IAorCisgICAgU2VydmVyLmV4ZSAtaAorICAgICAgICB3aWxsIGRpcGxheSBoZWxwIGluZm9ybWF0aW9uIAorCisgICAgU2VydmVyLmV4ZSAtdHI6PHRyYW5zcG9ydD4gLXByOjxwcm90b2NvbD4gCisgICAgICAgIHdpbGwgcnVuIHNlcnZlciB3aXRoIHNwZWNpZmllZCBhcmd1bWVudHMgKHRjcCB0cmFuc3BvcnQgYW5kIGJpbmFyeSBwcm90b2NvbCBieSBkZWZhdWx0KQorCitPcHRpb25zOgorCisgICAgLXRyICh0cmFuc3BvcnQpOiAKKyAgICAgICAgdGNwIC0gKGRlZmF1bHQpIHRjcCB0cmFuc3BvcnQgd2lsbCBiZSB1c2VkIChob3N0IC0gIiJsb2NhbGhvc3QiIiwgcG9ydCAtIDkwOTApCisgICAgICAgIHRjcGJ1ZmZlcmVkIC0gdGNwIGJ1ZmZlcmVkIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKGhvc3QgLSAiImxvY2FsaG9zdCIiLCBwb3J0IC0gOTA5MCkKKyAgICAgICAgbmFtZWRwaXBlIC0gbmFtZWRwaXBlIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKHBpcGUgYWRkcmVzcyAtICIiLnRlc3QiIikKKyAgICAgICAgaHR0cCAtIGh0dHAgdHJhbnNwb3J0IHdpbGwgYmUgdXNlZCAoaHR0cCBhZGRyZXNzIC0gIiJsb2NhbGhvc3Q6OTA5MCIiKQorICAgICAgICB0Y3B0bHMgLSB0Y3AgdHJhbnNwb3J0IHdpdGggdGxzIHdpbGwgYmUgdXNlZCAoaG9zdCAtICIibG9jYWxob3N0IiIsIHBvcnQgLSA5MDkwKQorICAgICAgICBmcmFtZWQgLSB0Y3AgZnJhbWVkIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKGhvc3QgLSAiImxvY2FsaG9zdCIiLCBwb3J0IC0gOTA5MCkKKworICAgIC1wciAocHJvdG9jb2wpOiAKKyAgICAgICAgYmluYXJ5IC0gKGRlZmF1bHQpIGJpbmFyeSBwcm90b2NvbCB3aWxsIGJlIHVzZWQKKyAgICAgICAgY29tcGFjdCAtIGNvbXBhY3QgcHJvdG9jb2wgd2lsbCBiZSB1c2VkCisgICAgICAgIGpzb24gLSBqc29uIHByb3RvY29sIHdpbGwgYmUgdXNlZAorCQkKK1NhbXBsZToKKworICAgIFNlcnZlci5leGUgLXRyOnRjcAorCisqKlJlbWFya3MqKjoKKworICAgIEZvciBUY3BUbHMgbW9kZSBjZXJ0aWZpY2F0ZSdzIGZpbGUgVGhyaWZ0VGVzdC5wZnggc2hvdWxkIGJlIGluIGRpcmVjdG9yeSB3aXRoIGJpbmFyaWVzIGluIGNhc2Ugb2YgY29tbWFuZCBsaW5lIHVzYWdlIChvciBhdCBwcm9qZWN0IGxldmVsIGluIGNhc2Ugb2YgZGVidWdnaW5nIGZyb20gSURFKS4KKyAgICBQYXNzd29yZCBmb3IgY2VydGlmaWNhdGUgLSAiVGhyaWZ0VGVzdCIuCisKKworCisjIE5ldENvcmUgQ2xpZW50CisKK1VzYWdlOiAKKworICAgIENsaWVudC5leGUgLWgKKyAgICAgICAgd2lsbCBkaXBsYXkgaGVscCBpbmZvcm1hdGlvbiAKKworICAgIENsaWVudC5leGUgLXRyOjx0cmFuc3BvcnQ+IC1wcjo8cHJvdG9jb2w+IC1tYzo8bnVtQ2xpZW50cz4KKyAgICAgICAgd2lsbCBydW4gY2xpZW50IHdpdGggc3BlY2lmaWVkIGFyZ3VtZW50cyAodGNwIHRyYW5zcG9ydCBhbmQgYmluYXJ5IHByb3RvY29sIGJ5IGRlZmF1bHQpCisKK09wdGlvbnM6CisKKyAgICAtdHIgKHRyYW5zcG9ydCk6IAorICAgICAgICB0Y3AgLSAoZGVmYXVsdCkgdGNwIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKGhvc3QgLSAiImxvY2FsaG9zdCIiLCBwb3J0IC0gOTA5MCkKKyAgICAgICAgdGNwYnVmZmVyZWQgLSBidWZmZXJlZCB0cmFuc3BvcnQgb3ZlciB0Y3Agd2lsbCBiZSB1c2VkIChob3N0IC0gIiJsb2NhbGhvc3QiIiwgcG9ydCAtIDkwOTApCisgICAgICAgIG5hbWVkcGlwZSAtIG5hbWVkcGlwZSB0cmFuc3BvcnQgd2lsbCBiZSB1c2VkIChwaXBlIGFkZHJlc3MgLSAiIi50ZXN0IiIpCisgICAgICAgIGh0dHAgLSBodHRwIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKGFkZHJlc3MgLSAiImh0dHA6Ly9sb2NhbGhvc3Q6OTA5MCIiKSAgICAgICAgCisgICAgICAgIHRjcHRscyAtIHRjcCB0bHMgdHJhbnNwb3J0IHdpbGwgYmUgdXNlZCAoaG9zdCAtICIibG9jYWxob3N0IiIsIHBvcnQgLSA5MDkwKQorICAgICAgICBmcmFtZWQgLSB0Y3AgZnJhbWVkIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKGhvc3QgLSAiImxvY2FsaG9zdCIiLCBwb3J0IC0gOTA5MCkKKworICAgIC1wciAocHJvdG9jb2wpOiAKKyAgICAgICAgYmluYXJ5IC0gKGRlZmF1bHQpIGJpbmFyeSBwcm90b2NvbCB3aWxsIGJlIHVzZWQKKyAgICAgICAgY29tcGFjdCAtIGNvbXBhY3QgcHJvdG9jb2wgd2lsbCBiZSB1c2VkCisgICAgICAgIGpzb24gLSBqc29uIHByb3RvY29sIHdpbGwgYmUgdXNlZAorICAgICAgICAKKyAgICAtbWMgKG11bHRpcGxlIGNsaWVudHMpOgorICAgICAgICA8bnVtQ2xpZW50cz4gLSBudW1iZXIgb2YgbXVsdGlwbGUgY2xpZW50cyB0byBjb25uZWN0IHRvIHNlcnZlciAobWF4IDEwMCwgZGVmYXVsdCAxKQorCitTYW1wbGU6CisKKyAgICBDbGllbnQuZXhlIC10cjp0Y3AgLXByOmJpbmFyeSAtbWM6MTAKKworUmVtYXJrczoKKworICAgIEZvciBUY3BUbHMgbW9kZSBjZXJ0aWZpY2F0ZSdzIGZpbGUgVGhyaWZ0VGVzdC5wZnggc2hvdWxkIGJlIGluIGRpcmVjdG9yeSAKKwl3aXRoIGJpbmFyaWVzIGluIGNhc2Ugb2YgY29tbWFuZCBsaW5lIHVzYWdlIChvciBhdCBwcm9qZWN0IGxldmVsIGluIGNhc2Ugb2YgZGVidWdnaW5nIGZyb20gSURFKS4KKyAgICBQYXNzd29yZCBmb3IgY2VydGlmaWNhdGUgLSAiVGhyaWZ0VGVzdCIuCisKKyMgSG93IHRvIHRlc3QgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIE5ldENvcmUgYW5kIFB5dGhvbgorCisqIEdlbmVyYXRlIGNvZGUgd2l0aCB0aGUgbGF0ZXN0ICoqdGhyaWZ0LmV4ZSoqIHV0aWwKKyogRW5zdXJlIHRoYXQgKip0aHJpZnQuZXhlKiogdXRpbCBnZW5lcmF0ZWQgZm9sZGVyICoqZ2VuLXB5Kiogd2l0aCBnZW5lcmF0ZWQgY29kZSBmb3IgUHl0aG9uCisqIENyZWF0ZSAqKmNsaWVudC5weSoqIGFuZCAqKnNlcnZlci5weSoqIGZyb20gdGhlIGNvZGUgZXhhbXBsZXMgYmVsb3cgYW5kIHNhdmUgdGhlbSB0byB0aGUgZm9sZGVyIHdpdGggcHJldmlvc2x5IGdlbmVyYXRlZCBmb2xkZXIgKipnZW4tcHkqKgorKiBSdW4gbmV0Y29yZSBzYW1wbGVzIChjbGllbnQgYW5kIHNlcnZlcikgYW5kIHB5dGhvbiBzYW1wbGVzIChjbGllbnQgYW5kIHNlcnZlcikKKworUmVtYXJrczoKKworU2FtcGxlcyBvZiBjbGllbnQgYW5kIHNlcnZlciBjb2RlIGJlbG93IHVzZSBjb3JyZWN0IG1ldGhvZHMgKG9wZXJhdGlvbnMpIAorYW5kIGZpZWxkcyAocHJvcGVydGllcykgYWNjb3JkaW5nIHRvIGdlbmVyYXRlZCBjb250cmFjdHMgZnJvbSAqLnRocmlmdCBmaWxlcworCitBdCBXaW5kb3dzIDEwIGFkZCByZWNvcmQgKioxMjcuMC4wLjEgdGVzdHNlcnZlcioqIHRvICoqQzpcV2luZG93c1xTeXN0ZW0zMlxkcml2ZXJzXGV0Y1xob3N0cyoqIGZpbGUKK2ZvciBjb3JyZWN0IHdvcmsgb2YgcHl0aG9uIHNlcnZlcgorCisKKyoqUHl0aG9uIENsaWVudDoqKgorCQorYGBgcHl0aG9uCitpbXBvcnQgc3lzCitpbXBvcnQgZ2xvYgorc3lzLnBhdGguYXBwZW5kKCdnZW4tcHknKQorCitmcm9tIHR1dG9yaWFsIGltcG9ydCBDYWxjdWxhdG9yCitmcm9tIHR1dG9yaWFsLnR0eXBlcyBpbXBvcnQgSW52YWxpZE9wZXJhdGlvbiwgT3BlcmF0aW9uLCBXb3JrCisKK2Zyb20gdGhyaWZ0IGltcG9ydCBUaHJpZnQKK2Zyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFNvY2tldAorZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0Citmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCisKKworZGVmIG1haW4oKToKKyAgICAjIE1ha2Ugc29ja2V0CisgICAgdHJhbnNwb3J0ID0gVFNvY2tldC5UU29ja2V0KCcxMjcuMC4wLjEnLCA5MDkwKQorCisgICAgIyBCdWZmZXJpbmcgaXMgY3JpdGljYWwuIFJhdyBzb2NrZXRzIGFyZSB2ZXJ5IHNsb3cKKyAgICB0cmFuc3BvcnQgPSBUVHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydCh0cmFuc3BvcnQpCisKKyAgICAjIFdyYXAgaW4gYSBwcm90b2NvbAorICAgIHByb3RvY29sID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpCisKKyAgICAjIENyZWF0ZSBhIGNsaWVudCB0byB1c2UgdGhlIHByb3RvY29sIGVuY29kZXIKKyAgICBjbGllbnQgPSBDYWxjdWxhdG9yLkNsaWVudChwcm90b2NvbCkKKworICAgICMgQ29ubmVjdCEKKyAgICB0cmFuc3BvcnQub3BlbigpCisKKyAgICBjbGllbnQuUGluZygpCisgICAgcHJpbnQoJ3BpbmcoKScpCisKKyAgICBzdW0gPSBjbGllbnQuQWRkKDEsIDEpCisgICAgcHJpbnQoKCcxKzE9JWQnICUgKHN1bSkpKQorCisgICAgd29yayA9IFdvcmsoKQorCisgICAgd29yay5PcCA9IE9wZXJhdGlvbi5EaXZpZGUKKyAgICB3b3JrLk51bTEgPSAxCisgICAgd29yay5OdW0yID0gMAorCisgICAgdHJ5OgorICAgICAgICBxdW90aWVudCA9IGNsaWVudC5DYWxjdWxhdGUoMSwgd29yaykKKyAgICAgICAgcHJpbnQoJ1dob2E/IFlvdSBrbm93IGhvdyB0byBkaXZpZGUgYnkgemVybz8nKQorICAgICAgICBwcmludCgnRllJIHRoZSBhbnN3ZXIgaXMgJWQnICUgcXVvdGllbnQpCisgICAgZXhjZXB0IEludmFsaWRPcGVyYXRpb24gYXMgZToKKyAgICAgICAgcHJpbnQoKCdJbnZhbGlkT3BlcmF0aW9uOiAlcicgJSBlKSkKKworICAgIHdvcmsuT3AgPSBPcGVyYXRpb24uU3Vic3RyYWN0CisgICAgd29yay5OdW0xID0gMTUKKyAgICB3b3JrLk51bTIgPSAxMAorCisgICAgZGlmZiA9IGNsaWVudC5DYWxjdWxhdGUoMSwgd29yaykKKyAgICBwcmludCgoJzE1LTEwPSVkJyAlIChkaWZmKSkpCisKKyAgICBsb2cgPSBjbGllbnQuR2V0U3RydWN0KDEpCisgICAgcHJpbnQoKCdDaGVjayBsb2c6ICVzJyAlIChsb2cuVmFsdWUpKSkKKworICAgIGNsaWVudC5aaXAoKQorICAgIHByaW50KCd6aXAoKScpCisKKyAgICAjIENsb3NlIQorICAgIHRyYW5zcG9ydC5jbG9zZSgpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIHRyeToKKyAgICBtYWluKCkKKyAgZXhjZXB0IFRocmlmdC5URXhjZXB0aW9uIGFzIHR4OgorICAgIHByaW50KCclcycgJSB0eC5tZXNzYWdlKQorYGBgCisKKworKipQeXRob24gU2VydmVyOioqCisKKworYGBgcHl0aG9uCitpbXBvcnQgZ2xvYgoraW1wb3J0IHN5cworc3lzLnBhdGguYXBwZW5kKCdnZW4tcHknKQorCitmcm9tIHR1dG9yaWFsIGltcG9ydCBDYWxjdWxhdG9yCitmcm9tIHR1dG9yaWFsLnR0eXBlcyBpbXBvcnQgSW52YWxpZE9wZXJhdGlvbiwgT3BlcmF0aW9uCisKK2Zyb20gc2hhcmVkLnR0eXBlcyBpbXBvcnQgU2hhcmVkU3RydWN0CisKK2Zyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFNvY2tldAorZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0Citmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCitmcm9tIHRocmlmdC5zZXJ2ZXIgaW1wb3J0IFRTZXJ2ZXIKKworCitjbGFzcyBDYWxjdWxhdG9ySGFuZGxlcjoKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYubG9nID0ge30KKworICAgIGRlZiBQaW5nKHNlbGYpOgorICAgICAgICBwcmludCgncGluZygpJykKKworICAgIGRlZiBBZGQoc2VsZiwgbjEsIG4yKToKKyAgICAgICAgcHJpbnQoJ2FkZCglZCwlZCknICUgKG4xLCBuMikpCisgICAgICAgIHJldHVybiBuMSArIG4yCisKKyAgICBkZWYgQ2FsY3VsYXRlKHNlbGYsIGxvZ2lkLCB3b3JrKToKKyAgICAgICAgcHJpbnQoJ2NhbGN1bGF0ZSglZCwgJXIpJyAlIChsb2dpZCwgd29yaykpCisKKyAgICAgICAgaWYgd29yay5PcCA9PSBPcGVyYXRpb24uQWRkOgorICAgICAgICAgICAgdmFsID0gd29yay5OdW0xICsgd29yay5OdW0yCisgICAgICAgIGVsaWYgd29yay5PcCA9PSBPcGVyYXRpb24uU3Vic3RyYWN0OgorICAgICAgICAgICAgdmFsID0gd29yay5OdW0xIC0gd29yay5OdW0yCisgICAgICAgIGVsaWYgd29yay5PcCA9PSBPcGVyYXRpb24uTXVsdGlwbHk6CisgICAgICAgICAgICB2YWwgPSB3b3JrLk51bTEgKiB3b3JrLk51bTIKKyAgICAgICAgZWxpZiB3b3JrLk9wID09IE9wZXJhdGlvbi5EaXZpZGU6CisgICAgICAgICAgICBpZiB3b3JrLk51bTIgPT0gMDoKKyAgICAgICAgICAgICAgICB4ID0gSW52YWxpZE9wZXJhdGlvbigpCisgICAgICAgICAgICAgICAgeC5XaGF0T3AgPSB3b3JrLk9wCisgICAgICAgICAgICAgICAgeC5XaHkgPSAnQ2Fubm90IGRpdmlkZSBieSAwJworICAgICAgICAgICAgICAgIHJhaXNlIHgKKyAgICAgICAgICAgIHZhbCA9IHdvcmsuTnVtMSAvIHdvcmsuTnVtMgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgeCA9IEludmFsaWRPcGVyYXRpb24oKQorICAgICAgICAgICAgeC5XaGF0T3AgPSB3b3JrLk9wCisgICAgICAgICAgICB4LldoeSA9ICdJbnZhbGlkIG9wZXJhdGlvbicKKyAgICAgICAgICAgIHJhaXNlIHgKKworICAgICAgICBsb2cgPSBTaGFyZWRTdHJ1Y3QoKQorICAgICAgICBsb2cuS2V5ID0gbG9naWQKKyAgICAgICAgbG9nLlZhbHVlID0gJyVkJyAlICh2YWwpCisgICAgICAgIHNlbGYubG9nW2xvZ2lkXSA9IGxvZworCisgICAgICAgIHJldHVybiB2YWwKKworICAgIGRlZiBHZXRTdHJ1Y3Qoc2VsZiwga2V5KToKKyAgICAgICAgcHJpbnQoJ2dldFN0cnVjdCglZCknICUgKGtleSkpCisgICAgICAgIHJldHVybiBzZWxmLmxvZ1trZXldCisKKyAgICBkZWYgWmlwKHNlbGYpOgorICAgICAgICBwcmludCgnemlwKCknKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGhhbmRsZXIgPSBDYWxjdWxhdG9ySGFuZGxlcigpCisgICAgcHJvY2Vzc29yID0gQ2FsY3VsYXRvci5Qcm9jZXNzb3IoaGFuZGxlcikKKyAgICB0cmFuc3BvcnQgPSBUU29ja2V0LlRTZXJ2ZXJTb2NrZXQoaG9zdD0idGVzdHNlcnZlciIsIHBvcnQ9OTA5MCkKKyAgICB0ZmFjdG9yeSA9IFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSgpCisgICAgcGZhY3RvcnkgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpCisKKyAgICBzZXJ2ZXIgPSBUU2VydmVyLlRTaW1wbGVTZXJ2ZXIocHJvY2Vzc29yLCB0cmFuc3BvcnQsIHRmYWN0b3J5LCBwZmFjdG9yeSkKKyAgICBwcmludCgnU3RhcnRpbmcgdGhlIHNlcnZlci4uLicpCisgICAgc2VydmVyLnNlcnZlKCkKKyAgICBwcmludCgnZG9uZS4nKQorCisgICAgIyBZb3UgY291bGQgZG8gb25lIG9mIHRoZXNlIGZvciBhIG11bHRpdGhyZWFkZWQgc2VydmVyCisgICAgIyBzZXJ2ZXIgPSBUU2VydmVyLlRUaHJlYWRlZFNlcnZlcihwcm9jZXNzb3IsIHRyYW5zcG9ydCwgdGZhY3RvcnksIHBmYWN0b3J5KQorICAgICMgc2VydmVyID0gVFNlcnZlci5UVGhyZWFkUG9vbFNlcnZlcihwcm9jZXNzb3IsIHRyYW5zcG9ydCwgdGZhY3RvcnksIHBmYWN0b3J5KQorYGBgCmRpZmYgLS1naXQgYS90dXRvcmlhbC9uZXRjb3JlL1NlcnZlci9Qcm9ncmFtLmNzIGIvdHV0b3JpYWwvbmV0Y29yZS9TZXJ2ZXIvUHJvZ3JhbS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTE4MWJhCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0Y29yZS9TZXJ2ZXIvUHJvZ3JhbS5jcwpAQCAtMCwwICsxLDQyOCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5OZXQuU2VjdXJpdHk7Cit1c2luZyBTeXN0ZW0uU2VjdXJpdHkuQ3J5cHRvZ3JhcGh5Llg1MDlDZXJ0aWZpY2F0ZXM7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIE1pY3Jvc29mdC5Bc3BOZXRDb3JlLkJ1aWxkZXI7Cit1c2luZyBNaWNyb3NvZnQuQXNwTmV0Q29yZS5Ib3N0aW5nOwordXNpbmcgTWljcm9zb2Z0LkV4dGVuc2lvbnMuQ29uZmlndXJhdGlvbjsKK3VzaW5nIE1pY3Jvc29mdC5FeHRlbnNpb25zLkRlcGVuZGVuY3lJbmplY3Rpb247Cit1c2luZyBNaWNyb3NvZnQuRXh0ZW5zaW9ucy5Mb2dnaW5nOwordXNpbmcgVGhyaWZ0OwordXNpbmcgVGhyaWZ0LlByb3RvY29sczsKK3VzaW5nIFRocmlmdC5TZXJ2ZXI7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0czsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnRzLlNlcnZlcjsKK3VzaW5nIHR1dG9yaWFsOwordXNpbmcgc2hhcmVkOworCituYW1lc3BhY2UgU2VydmVyCit7CisgICAgcHVibGljIGNsYXNzIFByb2dyYW0KKyAgICB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IElMb2dnZXIgTG9nZ2VyID0gbmV3IExvZ2dlckZhY3RvcnkoKS5BZGRDb25zb2xlKExvZ0xldmVsLlRyYWNlKS5BZGREZWJ1ZyhMb2dMZXZlbC5UcmFjZSkuQ3JlYXRlTG9nZ2VyKG5hbWVvZihTZXJ2ZXIpKTsKKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgTWFpbihzdHJpbmdbXSBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICBhcmdzID0gYXJncyA/PyBuZXcgc3RyaW5nWzBdOworCisgICAgICAgICAgICBpZiAoYXJncy5BbnkoeCA9PiB4LlN0YXJ0c1dpdGgoIi1oZWxwIiwgU3RyaW5nQ29tcGFyaXNvbi5PcmRpbmFsSWdub3JlQ2FzZSkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERpc3BsYXlIZWxwKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1c2luZyAodmFyIHNvdXJjZSA9IG5ldyBDYW5jZWxsYXRpb25Ub2tlblNvdXJjZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJ1bkFzeW5jKGFyZ3MsIHNvdXJjZS5Ub2tlbikuR2V0QXdhaXRlcigpLkdldFJlc3VsdCgpOworCisgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCJQcmVzcyBhbnkga2V5IHRvIHN0b3AuLi4iKTsKKworICAgICAgICAgICAgICAgIENvbnNvbGUuUmVhZExpbmUoKTsKKyAgICAgICAgICAgICAgICBzb3VyY2UuQ2FuY2VsKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigiU2VydmVyIHN0b3BwZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgRGlzcGxheUhlbHAoKQorICAgICAgICB7CisgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oQCIKK1VzYWdlOiAKKyAgICBTZXJ2ZXIuZXhlIC1oZWxwCisgICAgICAgIHdpbGwgZGlwbGF5IGhlbHAgaW5mb3JtYXRpb24gCisKKyAgICBTZXJ2ZXIuZXhlIC10cjo8dHJhbnNwb3J0PiAtcHI6PHByb3RvY29sPgorICAgICAgICB3aWxsIHJ1biBzZXJ2ZXIgd2l0aCBzcGVjaWZpZWQgYXJndW1lbnRzICh0Y3AgdHJhbnNwb3J0IGFuZCBiaW5hcnkgcHJvdG9jb2wgYnkgZGVmYXVsdCkKKworT3B0aW9uczoKKyAgICAtdHIgKHRyYW5zcG9ydCk6IAorICAgICAgICB0Y3AgLSAoZGVmYXVsdCkgdGNwIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKGhvc3QgLSAiImxvY2FsaG9zdCIiLCBwb3J0IC0gOTA5MCkKKyAgICAgICAgdGNwYnVmZmVyZWQgLSB0Y3AgYnVmZmVyZWQgdHJhbnNwb3J0IHdpbGwgYmUgdXNlZCAoaG9zdCAtICIibG9jYWxob3N0IiIsIHBvcnQgLSA5MDkwKQorICAgICAgICBuYW1lZHBpcGUgLSBuYW1lZHBpcGUgdHJhbnNwb3J0IHdpbGwgYmUgdXNlZCAocGlwZSBhZGRyZXNzIC0gIiIudGVzdCIiKQorICAgICAgICBodHRwIC0gaHR0cCB0cmFuc3BvcnQgd2lsbCBiZSB1c2VkIChodHRwIGFkZHJlc3MgLSAiImxvY2FsaG9zdDo5MDkwIiIpCisgICAgICAgIHRjcHRscyAtIHRjcCB0cmFuc3BvcnQgd2l0aCB0bHMgd2lsbCBiZSB1c2VkIChob3N0IC0gIiJsb2NhbGhvc3QiIiwgcG9ydCAtIDkwOTApCisgICAgICAgIGZyYW1lZCAtIHRjcCBmcmFtZWQgdHJhbnNwb3J0IHdpbGwgYmUgdXNlZCAoaG9zdCAtICIibG9jYWxob3N0IiIsIHBvcnQgLSA5MDkwKQorCisgICAgLXByIChwcm90b2NvbCk6IAorICAgICAgICBiaW5hcnkgLSAoZGVmYXVsdCkgYmluYXJ5IHByb3RvY29sIHdpbGwgYmUgdXNlZAorICAgICAgICBjb21wYWN0IC0gY29tcGFjdCBwcm90b2NvbCB3aWxsIGJlIHVzZWQKKyAgICAgICAganNvbiAtIGpzb24gcHJvdG9jb2wgd2lsbCBiZSB1c2VkCisgICAgICAgIG11bHRpcGxleGVkIC0gbXVsdGlwbGV4ZWQgcHJvdG9jb2wgd2lsbCBiZSB1c2VkCisKK1NhbXBsZToKKyAgICBTZXJ2ZXIuZXhlIC10cjp0Y3AgCisiKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGFzeW5jIFRhc2sgUnVuQXN5bmMoc3RyaW5nW10gYXJncywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBzZWxlY3RlZFRyYW5zcG9ydCA9IEdldFRyYW5zcG9ydChhcmdzKTsKKyAgICAgICAgICAgIHZhciBzZWxlY3RlZFByb3RvY29sID0gR2V0UHJvdG9jb2woYXJncyk7CisKKyAgICAgICAgICAgIGlmIChzZWxlY3RlZFRyYW5zcG9ydCA9PSBUcmFuc3BvcnQuSHR0cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuZXcgSHR0cFNlcnZlclNhbXBsZSgpLlJ1bihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgUnVuU2VsZWN0ZWRDb25maWd1cmF0aW9uQXN5bmMoc2VsZWN0ZWRUcmFuc3BvcnQsIHNlbGVjdGVkUHJvdG9jb2wsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFByb3RvY29sIEdldFByb3RvY29sKHN0cmluZ1tdIGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB0cmFuc3BvcnQgPSBhcmdzLkZpcnN0T3JEZWZhdWx0KHggPT4geC5TdGFydHNXaXRoKCItcHIiKSk/LlNwbGl0KCc6Jyk/WzFdOworCisgICAgICAgICAgICBFbnVtLlRyeVBhcnNlKHRyYW5zcG9ydCwgdHJ1ZSwgb3V0IFByb3RvY29sIHNlbGVjdGVkUHJvdG9jb2wpOworCisgICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRQcm90b2NvbDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFRyYW5zcG9ydCBHZXRUcmFuc3BvcnQoc3RyaW5nW10gYXJncykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHRyYW5zcG9ydCA9IGFyZ3MuRmlyc3RPckRlZmF1bHQoeCA9PiB4LlN0YXJ0c1dpdGgoIi10ciIpKT8uU3BsaXQoJzonKT9bMV07CisKKyAgICAgICAgICAgIEVudW0uVHJ5UGFyc2UodHJhbnNwb3J0LCB0cnVlLCBvdXQgVHJhbnNwb3J0IHNlbGVjdGVkVHJhbnNwb3J0KTsKKworICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkVHJhbnNwb3J0OworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgVGFzayBSdW5TZWxlY3RlZENvbmZpZ3VyYXRpb25Bc3luYyhUcmFuc3BvcnQgdHJhbnNwb3J0LCBQcm90b2NvbCBwcm90b2NvbCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmYWJyaWMgPSBuZXcgTG9nZ2VyRmFjdG9yeSgpLkFkZENvbnNvbGUoTG9nTGV2ZWwuVHJhY2UpLkFkZERlYnVnKExvZ0xldmVsLlRyYWNlKTsKKyAgICAgICAgICAgIHZhciBoYW5kbGVyID0gbmV3IENhbGN1bGF0b3JBc3luY0hhbmRsZXIoKTsKKyAgICAgICAgICAgIElUQXN5bmNQcm9jZXNzb3IgcHJvY2Vzc29yID0gbnVsbDsKKworICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQgPSBudWxsOworCisgICAgICAgICAgICBzd2l0Y2ggKHRyYW5zcG9ydCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIFRyYW5zcG9ydC5UY3A6CisgICAgICAgICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydCA9IG5ldyBUU2VydmVyU29ja2V0VHJhbnNwb3J0KDkwOTApOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFRyYW5zcG9ydC5UY3BCdWZmZXJlZDoKKyAgICAgICAgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0ID0gbmV3IFRTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQocG9ydDogOTA5MCwgY2xpZW50VGltZW91dDogMTAwMDAsIHVzZUJ1ZmZlcmVkU29ja2V0czogdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgVHJhbnNwb3J0Lk5hbWVkUGlwZToKKyAgICAgICAgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0ID0gbmV3IFROYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnQoIi50ZXN0Iik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgVHJhbnNwb3J0LlRjcFRsczoKKyAgICAgICAgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0ID0gbmV3IFRUbHNTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQoOTA5MCwgZmFsc2UsIEdldENlcnRpZmljYXRlKCksIENsaWVudENlcnRWYWxpZGF0b3IsIExvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgVHJhbnNwb3J0LkZyYW1lZDoKKyAgICAgICAgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0ID0gbmV3IFRTZXJ2ZXJGcmFtZWRUcmFuc3BvcnQoOTA5MCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBJVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeTsKKyAgICAgICAgICAgIElUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeTsKKworICAgICAgICAgICAgc3dpdGNoIChwcm90b2NvbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIFByb3RvY29sLkJpbmFyeToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5ID0gbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeSA9IG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpOworICAgICAgICAgICAgICAgICAgICBwcm9jZXNzb3IgPSBuZXcgQ2FsY3VsYXRvci5Bc3luY1Byb2Nlc3NvcihoYW5kbGVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUHJvdG9jb2wuQ29tcGFjdDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5ID0gbmV3IFRDb21wYWN0UHJvdG9jb2wuRmFjdG9yeSgpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnkgPSBuZXcgVENvbXBhY3RQcm90b2NvbC5GYWN0b3J5KCk7CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NvciA9IG5ldyBDYWxjdWxhdG9yLkFzeW5jUHJvY2Vzc29yKGhhbmRsZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBQcm90b2NvbC5Kc29uOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnkgPSBuZXcgVEpzb25Qcm90b2NvbC5GYWN0b3J5KCk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeSA9IG5ldyBUSnNvblByb3RvY29sLkZhY3RvcnkoKTsKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc29yID0gbmV3IENhbGN1bGF0b3IuQXN5bmNQcm9jZXNzb3IoaGFuZGxlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFByb3RvY29sLk11bHRpcGxleGVkOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnkgPSBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5ID0gbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGNhbGNIYW5kbGVyID0gbmV3IENhbGN1bGF0b3JBc3luY0hhbmRsZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGNhbGNQcm9jZXNzb3IgPSBuZXcgQ2FsY3VsYXRvci5Bc3luY1Byb2Nlc3NvcihjYWxjSGFuZGxlcik7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHNoYXJlZFNlcnZpY2VIYW5kbGVyID0gbmV3IFNoYXJlZFNlcnZpY2VBc3luY0hhbmRsZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHNoYXJlZFNlcnZpY2VQcm9jZXNzb3IgPSBuZXcgU2hhcmVkU2VydmljZS5Bc3luY1Byb2Nlc3NvcihzaGFyZWRTZXJ2aWNlSGFuZGxlcik7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIG11bHRpcGxleGVkUHJvY2Vzc29yID0gbmV3IFRNdWx0aXBsZXhlZFByb2Nlc3NvcigpOworICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZXhlZFByb2Nlc3Nvci5SZWdpc3RlclByb2Nlc3NvcihuYW1lb2YoQ2FsY3VsYXRvciksIGNhbGNQcm9jZXNzb3IpOworICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZXhlZFByb2Nlc3Nvci5SZWdpc3RlclByb2Nlc3NvcihuYW1lb2YoU2hhcmVkU2VydmljZSksIHNoYXJlZFNlcnZpY2VQcm9jZXNzb3IpOworCisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NvciA9IG11bHRpcGxleGVkUHJvY2Vzc29yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbihuYW1lb2YocHJvdG9jb2wpLCBwcm90b2NvbCwgbnVsbCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigKKyAgICAgICAgICAgICAgICAgICAgJCJTZWxlY3RlZCBUQXN5bmNTZXJ2ZXIgd2l0aCB7c2VydmVyVHJhbnNwb3J0fSB0cmFuc3BvcnQsIHtwcm9jZXNzb3J9IHByb2Nlc3NvciBhbmQge2lucHV0UHJvdG9jb2xGYWN0b3J5fSBwcm90b2NvbCBmYWN0b3JpZXMiKTsKKworICAgICAgICAgICAgICAgIHZhciBzZXJ2ZXIgPSBuZXcgQXN5bmNCYXNlU2VydmVyKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LCBmYWJyaWMpOworCisgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCJTdGFydGluZyB0aGUgc2VydmVyLi4uIik7CisgICAgICAgICAgICAgICAgYXdhaXQgc2VydmVyLlNlcnZlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiB4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbih4LlRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWDUwOUNlcnRpZmljYXRlMiBHZXRDZXJ0aWZpY2F0ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGR1ZSB0byBmaWxlcyBsb2NhdGlvbiBpbiBuZXQgY29yZSBiZXR0ZXIgdG8gdGFrZSBjZXJ0cyBmcm9tIHRvcCBmb2xkZXIKKyAgICAgICAgICAgIHZhciBjZXJ0RmlsZSA9IEdldENlcnRQYXRoKERpcmVjdG9yeS5HZXRQYXJlbnQoRGlyZWN0b3J5LkdldEN1cnJlbnREaXJlY3RvcnkoKSkpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBYNTA5Q2VydGlmaWNhdGUyKGNlcnRGaWxlLCAiVGhyaWZ0VGVzdCIpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgc3RyaW5nIEdldENlcnRQYXRoKERpcmVjdG9yeUluZm8gZGksIGludCBtYXhDb3VudCA9IDYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB0b3BEaXIgPSBkaTsKKyAgICAgICAgICAgIHZhciBjZXJ0RmlsZSA9CisgICAgICAgICAgICAgICAgdG9wRGlyLkVudW1lcmF0ZUZpbGVzKCJUaHJpZnRUZXN0LnBmeCIsIFNlYXJjaE9wdGlvbi5BbGxEaXJlY3RvcmllcykKKyAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICBpZiAoY2VydEZpbGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobWF4Q291bnQgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigiQ2Fubm90IGZpbmQgZmlsZSBpbiBkaXJlY3RvcmllcyIpOworICAgICAgICAgICAgICAgIHJldHVybiBHZXRDZXJ0UGF0aChkaS5QYXJlbnQsIG1heENvdW50IC0gMSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBjZXJ0RmlsZS5GdWxsTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFg1MDlDZXJ0aWZpY2F0ZSBMb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sob2JqZWN0IHNlbmRlciwKKyAgICAgICAgICAgIHN0cmluZyB0YXJnZXRIb3N0LCBYNTA5Q2VydGlmaWNhdGVDb2xsZWN0aW9uIGxvY2FsQ2VydGlmaWNhdGVzLAorICAgICAgICAgICAgWDUwOUNlcnRpZmljYXRlIHJlbW90ZUNlcnRpZmljYXRlLCBzdHJpbmdbXSBhY2NlcHRhYmxlSXNzdWVycykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEdldENlcnRpZmljYXRlKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sIENsaWVudENlcnRWYWxpZGF0b3Iob2JqZWN0IHNlbmRlciwgWDUwOUNlcnRpZmljYXRlIGNlcnRpZmljYXRlLAorICAgICAgICAgICAgWDUwOUNoYWluIGNoYWluLCBTc2xQb2xpY3lFcnJvcnMgc3NsUG9saWN5RXJyb3JzKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgZW51bSBUcmFuc3BvcnQKKyAgICAgICAgeworICAgICAgICAgICAgVGNwLAorICAgICAgICAgICAgVGNwQnVmZmVyZWQsCisgICAgICAgICAgICBOYW1lZFBpcGUsCisgICAgICAgICAgICBIdHRwLAorICAgICAgICAgICAgVGNwVGxzLAorICAgICAgICAgICAgRnJhbWVkCisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGVudW0gUHJvdG9jb2wKKyAgICAgICAgeworICAgICAgICAgICAgQmluYXJ5LAorICAgICAgICAgICAgQ29tcGFjdCwKKyAgICAgICAgICAgIEpzb24sCisgICAgICAgICAgICBNdWx0aXBsZXhlZAorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGNsYXNzIEh0dHBTZXJ2ZXJTYW1wbGUKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIHZvaWQgUnVuKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBjb25maWcgPSBuZXcgQ29uZmlndXJhdGlvbkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAuQWRkRW52aXJvbm1lbnRWYXJpYWJsZXMocHJlZml4OiAiQVNQTkVUQ09SRV8iKQorICAgICAgICAgICAgICAgICAgICAuQnVpbGQoKTsKKworICAgICAgICAgICAgICAgIHZhciBob3N0ID0gbmV3IFdlYkhvc3RCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgLlVzZUNvbmZpZ3VyYXRpb24oY29uZmlnKQorICAgICAgICAgICAgICAgICAgICAuVXNlS2VzdHJlbCgpCisgICAgICAgICAgICAgICAgICAgIC5Vc2VVcmxzKCJodHRwOi8vbG9jYWxob3N0OjkwOTAiKQorICAgICAgICAgICAgICAgICAgICAuVXNlQ29udGVudFJvb3QoRGlyZWN0b3J5LkdldEN1cnJlbnREaXJlY3RvcnkoKSkKKyAgICAgICAgICAgICAgICAgICAgLlVzZVN0YXJ0dXA8U3RhcnR1cD4oKQorICAgICAgICAgICAgICAgICAgICAuQnVpbGQoKTsKKworICAgICAgICAgICAgICAgIGhvc3QuUnVuQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pLkdldEF3YWl0ZXIoKS5HZXRSZXN1bHQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGNsYXNzIFN0YXJ0dXAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgU3RhcnR1cChJSG9zdGluZ0Vudmlyb25tZW50IGVudikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBidWlsZGVyID0gbmV3IENvbmZpZ3VyYXRpb25CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5TZXRCYXNlUGF0aChlbnYuQ29udGVudFJvb3RQYXRoKQorICAgICAgICAgICAgICAgICAgICAgICAgLkFkZEVudmlyb25tZW50VmFyaWFibGVzKCk7CisKKyAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbiA9IGJ1aWxkZXIuQnVpbGQoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwdWJsaWMgSUNvbmZpZ3VyYXRpb25Sb290IENvbmZpZ3VyYXRpb24geyBnZXQ7IH0KKworICAgICAgICAgICAgICAgIC8vIFRoaXMgbWV0aG9kIGdldHMgY2FsbGVkIGJ5IHRoZSBydW50aW1lLiBVc2UgdGhpcyBtZXRob2QgdG8gYWRkIHNlcnZpY2VzIHRvIHRoZSBjb250YWluZXIuCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgQ29uZmlndXJlU2VydmljZXMoSVNlcnZpY2VDb2xsZWN0aW9uIHNlcnZpY2VzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2VydmljZXMuQWRkVHJhbnNpZW50PENhbGN1bGF0b3IuSUFzeW5jLCBDYWxjdWxhdG9yQXN5bmNIYW5kbGVyPigpOworICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlcy5BZGRUcmFuc2llbnQ8SVRBc3luY1Byb2Nlc3NvciwgQ2FsY3VsYXRvci5Bc3luY1Byb2Nlc3Nvcj4oKTsKKyAgICAgICAgICAgICAgICAgICAgc2VydmljZXMuQWRkVHJhbnNpZW50PFRIdHRwU2VydmVyVHJhbnNwb3J0LCBUSHR0cFNlcnZlclRyYW5zcG9ydD4oKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBUaGlzIG1ldGhvZCBnZXRzIGNhbGxlZCBieSB0aGUgcnVudGltZS4gVXNlIHRoaXMgbWV0aG9kIHRvIGNvbmZpZ3VyZSB0aGUgSFRUUCByZXF1ZXN0IHBpcGVsaW5lLgorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIENvbmZpZ3VyZShJQXBwbGljYXRpb25CdWlsZGVyIGFwcCwgSUhvc3RpbmdFbnZpcm9ubWVudCBlbnYsCisgICAgICAgICAgICAgICAgICAgIElMb2dnZXJGYWN0b3J5IGxvZ2dlckZhY3RvcnkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcHAuVXNlTWlkZGxld2FyZTxUSHR0cFNlcnZlclRyYW5zcG9ydD4oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgY2xhc3MgQ2FsY3VsYXRvckFzeW5jSGFuZGxlciA6IENhbGN1bGF0b3IuSUFzeW5jCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRGljdGlvbmFyeTxpbnQsIFNoYXJlZFN0cnVjdD4gX2xvZyA9IG5ldyBEaWN0aW9uYXJ5PGludCwgU2hhcmVkU3RydWN0PigpOworCisgICAgICAgICAgICBwdWJsaWMgQ2FsY3VsYXRvckFzeW5jSGFuZGxlcigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrPFNoYXJlZFN0cnVjdD4gZ2V0U3RydWN0QXN5bmMoaW50IGtleSwKKyAgICAgICAgICAgICAgICBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oIkdldFN0cnVjdEFzeW5jKHswfSkiLCBrZXkpOworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21SZXN1bHQoX2xvZ1trZXldKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgcGluZ0FzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigiUGluZ0FzeW5jKCkiKTsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkNvbXBsZXRlZFRhc2s7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrPGludD4gYWRkQXN5bmMoaW50IG51bTEsIGludCBudW0yLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJBZGRBc3luYyh7bnVtMX0se251bTJ9KSIpOworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21SZXN1bHQobnVtMSArIG51bTIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYXN5bmMgVGFzazxpbnQ+IGNhbGN1bGF0ZUFzeW5jKGludCBsb2dpZCwgV29yayB3LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJDYWxjdWxhdGVBc3luYyh7bG9naWR9LCBbe3cuT3B9LHt3Lk51bTF9LHt3Lk51bTJ9XSkiKTsKKworICAgICAgICAgICAgICAgIHZhciB2YWwgPSAwOworICAgICAgICAgICAgICAgIHN3aXRjaCAody5PcCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgT3BlcmF0aW9uLkFERDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHcuTnVtMSArIHcuTnVtMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgT3BlcmF0aW9uLlNVQlRSQUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gdy5OdW0xIC0gdy5OdW0yOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPcGVyYXRpb24uTVVMVElQTFk6CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSB3Lk51bTEgKiB3Lk51bTI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIE9wZXJhdGlvbi5ESVZJREU6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAody5OdW0yID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlvID0gbmV3IEludmFsaWRPcGVyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdoYXRPcCA9IChpbnQpIHcuT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdoeSA9ICJDYW5ub3QgZGl2aWRlIGJ5IDAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGlvOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gdy5OdW0xIC8gdy5OdW0yOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlvID0gbmV3IEludmFsaWRPcGVyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaGF0T3AgPSAoaW50KSB3Lk9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdoeSA9ICJVbmtub3duIG9wZXJhdGlvbiIKKyAgICAgICAgICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGlvOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdmFyIGVudHJ5ID0gbmV3IFNoYXJlZFN0cnVjdAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgS2V5ID0gbG9naWQsCisgICAgICAgICAgICAgICAgICAgIFZhbHVlID0gdmFsLlRvU3RyaW5nKCkKKyAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgX2xvZ1tsb2dpZF0gPSBlbnRyeTsKKworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21SZXN1bHQodmFsKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgemlwQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCJaaXBBc3luYygpIHdpdGggZGVsYXkgMTAwbWMiKTsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkRlbGF5KDEwMCwgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgY2xhc3MgU2hhcmVkU2VydmljZUFzeW5jSGFuZGxlciA6IFNoYXJlZFNlcnZpY2UuSUFzeW5jCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrPFNoYXJlZFN0cnVjdD4gZ2V0U3RydWN0QXN5bmMoaW50IGtleSwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCJHZXRTdHJ1Y3RBc3luYyh7MH0pIiwga2V5KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tUmVzdWx0KG5ldyBTaGFyZWRTdHJ1Y3QoKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgS2V5ID0ga2V5LAorICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9ICJHZXRTdHJ1Y3RBc3luYyIKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25ldGNvcmUvU2VydmVyL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvdHV0b3JpYWwvbmV0Y29yZS9TZXJ2ZXIvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA0NDIzNQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL25ldGNvcmUvU2VydmVyL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCkBAIC0wLDAgKzEsNDAgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKKworLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZworLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KKworW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIlRocmlmdCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KKworLy8gU2V0dGluZyBDb21WaXNpYmxlIHRvIGZhbHNlIG1ha2VzIHRoZSB0eXBlcyBpbiB0aGlzIGFzc2VtYmx5IG5vdCB2aXNpYmxlCisvLyB0byBDT00gY29tcG9uZW50cy4gIElmIHlvdSBuZWVkIHRvIGFjY2VzcyBhIHR5cGUgaW4gdGhpcyBhc3NlbWJseSBmcm9tCisvLyBDT00sIHNldCB0aGUgQ29tVmlzaWJsZSBhdHRyaWJ1dGUgdG8gdHJ1ZSBvbiB0aGF0IHR5cGUuCisKK1thc3NlbWJseTogQ29tVmlzaWJsZShmYWxzZSldCisKKy8vIFRoZSBmb2xsb3dpbmcgR1VJRCBpcyBmb3IgdGhlIElEIG9mIHRoZSB0eXBlbGliIGlmIHRoaXMgcHJvamVjdCBpcyBleHBvc2VkIHRvIENPTQorCitbYXNzZW1ibHk6IEd1aWQoImUyMTBmYzEwLTVhZmYtNGIwNC1hYzIxLTU4YWZjN2I3NGIwYyIpXQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25ldGNvcmUvU2VydmVyL1Byb3BlcnRpZXMvbGF1bmNoU2V0dGluZ3MuanNvbiBiL3R1dG9yaWFsL25ldGNvcmUvU2VydmVyL1Byb3BlcnRpZXMvbGF1bmNoU2V0dGluZ3MuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODA3NmZmCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0Y29yZS9TZXJ2ZXIvUHJvcGVydGllcy9sYXVuY2hTZXR0aW5ncy5qc29uCkBAIC0wLDAgKzEsOCBAQAoreworICAicHJvZmlsZXMiOiB7CisgICAgIlNlcnZlciI6IHsKKyAgICAgICJjb21tYW5kTmFtZSI6ICJQcm9qZWN0IiwKKyAgICAgICJjb21tYW5kTGluZUFyZ3MiOiAiLXA6bXVsdGlwbGV4ZWQiCisgICAgfQorICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbmV0Y29yZS9TZXJ2ZXIvU2VydmVyLmNzcHJvaiBiL3R1dG9yaWFsL25ldGNvcmUvU2VydmVyL1NlcnZlci5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZiZDMwMwotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL25ldGNvcmUvU2VydmVyL1NlcnZlci5jc3Byb2oKQEAgLTAsMCArMSwyNiBAQAorPFByb2plY3QgU2RrPSJNaWNyb3NvZnQuTkVULlNkay5XZWIiPgorCisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxUYXJnZXRGcmFtZXdvcms+bmV0Y29yZWFwcDIuMDwvVGFyZ2V0RnJhbWV3b3JrPgorICAgIDxBc3NlbWJseU5hbWU+U2VydmVyPC9Bc3NlbWJseU5hbWU+CisgICAgPFBhY2thZ2VJZD5TZXJ2ZXI8L1BhY2thZ2VJZD4KKyAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb25maWd1cmF0aW9uQXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29uZmlndXJhdGlvbkF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvbXBhbnlBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb21wYW55QXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5UHJvZHVjdEF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseVByb2R1Y3RBdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb3B5cmlnaHRBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb3B5cmlnaHRBdHRyaWJ1dGU+CisgIDwvUHJvcGVydHlHcm91cD4KKworICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uL0ludGVyZmFjZXMvSW50ZXJmYWNlcy5jc3Byb2oiIC8+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi4vLi4vLi4vbGliL25ldGNvcmUvVGhyaWZ0L1RocmlmdC5jc3Byb2oiIC8+CisgIDwvSXRlbUdyb3VwPgorCisgIDxJdGVtR3JvdXA+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LkFzcE5ldENvcmUiIFZlcnNpb249IlsyLjAsKSIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuQXNwTmV0Q29yZS5TZXJ2ZXIuSUlTSW50ZWdyYXRpb24iIFZlcnNpb249IlsyLjAsKSIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuQXNwTmV0Q29yZS5TZXJ2ZXIuS2VzdHJlbCIgVmVyc2lvbj0iWzIuMCwpIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5FeHRlbnNpb25zLkNvbmZpZ3VyYXRpb24uRmlsZUV4dGVuc2lvbnMiIFZlcnNpb249IlsyLjAsKSIgLz4KKyAgPC9JdGVtR3JvdXA+CisKKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25ldGNvcmUvU2VydmVyL1RocmlmdFRlc3QucGZ4IGIvdHV0b3JpYWwvbmV0Y29yZS9TZXJ2ZXIvVGhyaWZ0VGVzdC5wZngKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBkZWQyOAotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL25ldGNvcmUvU2VydmVyL1RocmlmdFRlc3QucGZ4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25ldGNvcmUvVHV0b3JpYWwuc2xuIGIvdHV0b3JpYWwvbmV0Y29yZS9UdXRvcmlhbC5zbG4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRkY2Q0NgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL25ldGNvcmUvVHV0b3JpYWwuc2xuCkBAIC0wLDAgKzEsNzggQEAKK01pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFNvbHV0aW9uIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDEyLjAwCisjIFZpc3VhbCBTdHVkaW8gMTUKK1Zpc3VhbFN0dWRpb1ZlcnNpb24gPSAxNS4wLjI2MTE0LjIKK01pbmltdW1WaXN1YWxTdHVkaW9WZXJzaW9uID0gMTAuMC40MDIxOS4xCitQcm9qZWN0KCJ7OUExOTEwM0YtMTZGNy00NjY4LUJFNTQtOUExRTdBNEY3NTU2fSIpID0gIlRocmlmdCIsICIuLlwuLlxsaWJcbmV0Y29yZVxUaHJpZnRcVGhyaWZ0LmNzcHJvaiIsICJ7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fSIKK0VuZFByb2plY3QKK1Byb2plY3QoIns5QTE5MTAzRi0xNkY3LTQ2NjgtQkU1NC05QTFFN0E0Rjc1NTZ9IikgPSAiSW50ZXJmYWNlcyIsICJJbnRlcmZhY2VzXEludGVyZmFjZXMuY3Nwcm9qIiwgIntCOUUyNEQ4NC0yNzEyLTQxNTgtOEYxQS1EREU0NENEMUJCMEF9IgorRW5kUHJvamVjdAorUHJvamVjdCgiezlBMTkxMDNGLTE2RjctNDY2OC1CRTU0LTlBMUU3QTRGNzU1Nn0iKSA9ICJDbGllbnQiLCAiQ2xpZW50XENsaWVudC5jc3Byb2oiLCAie0U0Q0ExRUYwLUIxODEtNEE1RC1BMDJDLURCMDc1MEE1OUNERn0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OUExOTEwM0YtMTZGNy00NjY4LUJFNTQtOUExRTdBNEY3NTU2fSIpID0gIlNlcnZlciIsICJTZXJ2ZXJcU2VydmVyLmNzcHJvaiIsICJ7RTA4RjVCODQtMkI0QS00RTA5LTgyRDEtRTA3MTU3NzVDRTVFfSIKK0VuZFByb2plY3QKK0dsb2JhbAorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Db25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHByZVNvbHV0aW9uCisJCURlYnVnfEFueSBDUFUgPSBEZWJ1Z3xBbnkgQ1BVCisJCURlYnVnfHg2NCA9IERlYnVnfHg2NAorCQlEZWJ1Z3x4ODYgPSBEZWJ1Z3x4ODYKKwkJUmVsZWFzZXxBbnkgQ1BVID0gUmVsZWFzZXxBbnkgQ1BVCisJCVJlbGVhc2V8eDY0ID0gUmVsZWFzZXx4NjQKKwkJUmVsZWFzZXx4ODYgPSBSZWxlYXNlfHg4NgorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHBvc3RTb2x1dGlvbgorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uRGVidWd8eDg2LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uRGVidWd8eDg2LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uUmVsZWFzZXx4ODYuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LlJlbGVhc2V8eDg2LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0I5RTI0RDg0LTI3MTItNDE1OC04RjFBLURERTQ0Q0QxQkIwQX0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtCOUUyNEQ4NC0yNzEyLTQxNTgtOEYxQS1EREU0NENEMUJCMEF9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0I5RTI0RDg0LTI3MTItNDE1OC04RjFBLURERTQ0Q0QxQkIwQX0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0I5RTI0RDg0LTI3MTItNDE1OC04RjFBLURERTQ0Q0QxQkIwQX0uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtCOUUyNEQ4NC0yNzEyLTQxNTgtOEYxQS1EREU0NENEMUJCMEF9LkRlYnVnfHg4Ni5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtCOUUyNEQ4NC0yNzEyLTQxNTgtOEYxQS1EREU0NENEMUJCMEF9LkRlYnVnfHg4Ni5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7QjlFMjREODQtMjcxMi00MTU4LThGMUEtRERFNDRDRDFCQjBBfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtCOUUyNEQ4NC0yNzEyLTQxNTgtOEYxQS1EREU0NENEMUJCMEF9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtCOUUyNEQ4NC0yNzEyLTQxNTgtOEYxQS1EREU0NENEMUJCMEF9LlJlbGVhc2V8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7QjlFMjREODQtMjcxMi00MTU4LThGMUEtRERFNDRDRDFCQjBBfS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtCOUUyNEQ4NC0yNzEyLTQxNTgtOEYxQS1EREU0NENEMUJCMEF9LlJlbGVhc2V8eDg2LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7QjlFMjREODQtMjcxMi00MTU4LThGMUEtRERFNDRDRDFCQjBBfS5SZWxlYXNlfHg4Ni5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtFNENBMUVGMC1CMTgxLTRBNUQtQTAyQy1EQjA3NTBBNTlDREZ9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7RTRDQTFFRjAtQjE4MS00QTVELUEwMkMtREIwNzUwQTU5Q0RGfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtFNENBMUVGMC1CMTgxLTRBNUQtQTAyQy1EQjA3NTBBNTlDREZ9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtFNENBMUVGMC1CMTgxLTRBNUQtQTAyQy1EQjA3NTBBNTlDREZ9LkRlYnVnfHg2NC5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7RTRDQTFFRjAtQjE4MS00QTVELUEwMkMtREIwNzUwQTU5Q0RGfS5EZWJ1Z3x4ODYuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7RTRDQTFFRjAtQjE4MS00QTVELUEwMkMtREIwNzUwQTU5Q0RGfS5EZWJ1Z3x4ODYuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0U0Q0ExRUYwLUIxODEtNEE1RC1BMDJDLURCMDc1MEE1OUNERn0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7RTRDQTFFRjAtQjE4MS00QTVELUEwMkMtREIwNzUwQTU5Q0RGfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7RTRDQTFFRjAtQjE4MS00QTVELUEwMkMtREIwNzUwQTU5Q0RGfS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0U0Q0ExRUYwLUIxODEtNEE1RC1BMDJDLURCMDc1MEE1OUNERn0uUmVsZWFzZXx4NjQuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7RTRDQTFFRjAtQjE4MS00QTVELUEwMkMtREIwNzUwQTU5Q0RGfS5SZWxlYXNlfHg4Ni5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0U0Q0ExRUYwLUIxODEtNEE1RC1BMDJDLURCMDc1MEE1OUNERn0uUmVsZWFzZXx4ODYuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7RTA4RjVCODQtMkI0QS00RTA5LTgyRDEtRTA3MTU3NzVDRTVFfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0UwOEY1Qjg0LTJCNEEtNEUwOS04MkQxLUUwNzE1Nzc1Q0U1RX0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7RTA4RjVCODQtMkI0QS00RTA5LTgyRDEtRTA3MTU3NzVDRTVFfS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7RTA4RjVCODQtMkI0QS00RTA5LTgyRDEtRTA3MTU3NzVDRTVFfS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0UwOEY1Qjg0LTJCNEEtNEUwOS04MkQxLUUwNzE1Nzc1Q0U1RX0uRGVidWd8eDg2LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0UwOEY1Qjg0LTJCNEEtNEUwOS04MkQxLUUwNzE1Nzc1Q0U1RX0uRGVidWd8eDg2LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtFMDhGNUI4NC0yQjRBLTRFMDktODJEMS1FMDcxNTc3NUNFNUV9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0UwOEY1Qjg0LTJCNEEtNEUwOS04MkQxLUUwNzE1Nzc1Q0U1RX0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0UwOEY1Qjg0LTJCNEEtNEUwOS04MkQxLUUwNzE1Nzc1Q0U1RX0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtFMDhGNUI4NC0yQjRBLTRFMDktODJEMS1FMDcxNTc3NUNFNUV9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0UwOEY1Qjg0LTJCNEEtNEUwOS04MkQxLUUwNzE1Nzc1Q0U1RX0uUmVsZWFzZXx4ODYuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtFMDhGNUI4NC0yQjRBLTRFMDktODJEMS1FMDcxNTc3NUNFNUV9LlJlbGVhc2V8eDg2LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvblByb3BlcnRpZXMpID0gcHJlU29sdXRpb24KKwkJSGlkZVNvbHV0aW9uTm9kZSA9IEZBTFNFCisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oRXh0ZW5zaWJpbGl0eUdsb2JhbHMpID0gcG9zdFNvbHV0aW9uCisJCVNvbHV0aW9uR3VpZCA9IHswNzBBNUQxRC1CMjlELTQ2MDMtOTk5RC02OTNEQjQ0NEFEMER9CisJRW5kR2xvYmFsU2VjdGlvbgorRW5kR2xvYmFsCmRpZmYgLS1naXQgYS90dXRvcmlhbC9uZXRjb3JlL2J1aWxkLmNtZCBiL3R1dG9yaWFsL25ldGNvcmUvYnVpbGQuY21kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliODRlZjIKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9uZXRjb3JlL2J1aWxkLmNtZApAQCAtMCwwICsxLDI1IEBACitAZWNobyBvZmYKK3JlbSAvKgorcmVtICAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK3JlbSAgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorcmVtICAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZW0gICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCityZW0gICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorcmVtICAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3JlbSAgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK3JlbSAgKgorcmVtICAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCityZW0gICoKK3JlbSAgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCityZW0gICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KK3JlbSAgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK3JlbSAgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorcmVtICAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3JlbSAgKiB1bmRlciB0aGUgTGljZW5zZS4KK3JlbSAgKi8KK3NldGxvY2FsCisKK2RvdG5ldCAtLWluZm8KK2RvdG5ldCBidWlsZAorCis6ZW9mCmRpZmYgLS1naXQgYS90dXRvcmlhbC9uZXRjb3JlL2J1aWxkLnNoIGIvdHV0b3JpYWwvbmV0Y29yZS9idWlsZC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jOTdlMzEwCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0Y29yZS9idWlsZC5zaApAQCAtMCwwICsxLDI2IEBACisjIS91c3IvYmluL2VudiBiYXNoCisKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjZXhpdCBpZiBhbnkgY29tbWFuZCBmYWlscworc2V0IC1lCisKK2RvdG5ldCAtLWluZm8KK2RvdG5ldCBidWlsZApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbm9kZWpzL01ha2VmaWxlLmFtIGIvdHV0b3JpYWwvbm9kZWpzL01ha2VmaWxlLmFtCmluZGV4IGVjZjNiMmIuLjE1MTZmZWMgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL25vZGVqcy9NYWtlZmlsZS5hbQorKysgYi90dXRvcmlhbC9ub2RlanMvTWFrZWZpbGUuYW0KQEAgLTE3LDggKzE3LDYgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLVRIUklGVCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0Ci0KIGdlbi1ub2RlanMvQ2FsY3VsYXRvci5qcyBnZW4tbm9kZWpzL1NoYXJlZFNlcnZpY2UuanM6ICQodG9wX3NyY2RpcikvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CiAJJChUSFJJRlQpIC0tZ2VuIGpzOm5vZGUgLXIgJDwKIApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbm9kZWpzL05vZGVDbGllbnQuanMgYi90dXRvcmlhbC9ub2RlanMvTm9kZUNsaWVudC5qcwppbmRleCA3NGFhNTVhLi5iNDg4NmU4IDEwMDY0NAotLS0gYS90dXRvcmlhbC9ub2RlanMvTm9kZUNsaWVudC5qcworKysgYi90dXRvcmlhbC9ub2RlanMvTm9kZUNsaWVudC5qcwpAQCAtMTgsMTQgKzE4LDEyIEBACiAgKi8KIAogdmFyIHRocmlmdCA9IHJlcXVpcmUoJ3RocmlmdCcpOwotdmFyIFRocmlmdFRyYW5zcG9ydHMgPSByZXF1aXJlKCd0aHJpZnQvdHJhbnNwb3J0Jyk7Ci12YXIgVGhyaWZ0UHJvdG9jb2xzID0gcmVxdWlyZSgndGhyaWZ0L3Byb3RvY29sJyk7CiB2YXIgQ2FsY3VsYXRvciA9IHJlcXVpcmUoJy4vZ2VuLW5vZGVqcy9DYWxjdWxhdG9yJyk7CiB2YXIgdHR5cGVzID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL3R1dG9yaWFsX3R5cGVzJyk7Citjb25zdCBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKTsKIAotCi10cmFuc3BvcnQgPSBUaHJpZnRUcmFuc3BvcnRzLlRCdWZmZXJlZFRyYW5zcG9ydCgpCi1wcm90b2NvbCA9IFRocmlmdFByb3RvY29scy5UQmluYXJ5UHJvdG9jb2woKQordmFyIHRyYW5zcG9ydCA9IHRocmlmdC5UQnVmZmVyZWRUcmFuc3BvcnQ7Cit2YXIgcHJvdG9jb2wgPSB0aHJpZnQuVEJpbmFyeVByb3RvY29sOwogCiB2YXIgY29ubmVjdGlvbiA9IHRocmlmdC5jcmVhdGVDb25uZWN0aW9uKCJsb2NhbGhvc3QiLCA5MDkwLCB7CiAgIHRyYW5zcG9ydCA6IHRyYW5zcG9ydCwKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25vZGVqcy9Ob2RlQ2xpZW50UHJvbWlzZS5qcyBiL3R1dG9yaWFsL25vZGVqcy9Ob2RlQ2xpZW50UHJvbWlzZS5qcwppbmRleCA3YmNmODg0Li4yY2RjMTg0IDEwMDY0NAotLS0gYS90dXRvcmlhbC9ub2RlanMvTm9kZUNsaWVudFByb21pc2UuanMKKysrIGIvdHV0b3JpYWwvbm9kZWpzL05vZGVDbGllbnRQcm9taXNlLmpzCkBAIC0xOCwxNCArMTgsMTIgQEAKICAqLwogCiB2YXIgdGhyaWZ0ID0gcmVxdWlyZSgndGhyaWZ0Jyk7Ci12YXIgVGhyaWZ0VHJhbnNwb3J0cyA9IHJlcXVpcmUoJ3RocmlmdC90cmFuc3BvcnQnKTsKLXZhciBUaHJpZnRQcm90b2NvbHMgPSByZXF1aXJlKCd0aHJpZnQvcHJvdG9jb2wnKTsKIHZhciBDYWxjdWxhdG9yID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL0NhbGN1bGF0b3InKTsKIHZhciB0dHlwZXMgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvdHV0b3JpYWxfdHlwZXMnKTsKK2NvbnN0IGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpOwogCi0KLXRyYW5zcG9ydCA9IFRocmlmdFRyYW5zcG9ydHMuVEJ1ZmZlcmVkVHJhbnNwb3J0KCkKLXByb3RvY29sID0gVGhyaWZ0UHJvdG9jb2xzLlRCaW5hcnlQcm90b2NvbCgpCit2YXIgdHJhbnNwb3J0ID0gdGhyaWZ0LlRCdWZmZXJlZFRyYW5zcG9ydDsKK3ZhciBwcm90b2NvbCA9IHRocmlmdC5UQmluYXJ5UHJvdG9jb2w7CiAKIHZhciBjb25uZWN0aW9uID0gdGhyaWZ0LmNyZWF0ZUNvbm5lY3Rpb24oImxvY2FsaG9zdCIsIDkwOTAsIHsKICAgdHJhbnNwb3J0IDogdHJhbnNwb3J0LApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvb2NhbWwvX29hc2lzIGIvdHV0b3JpYWwvb2NhbWwvX29hc2lzCmluZGV4IDg2OWNhZjEuLjc0NWMwOTYgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL29jYW1sL19vYXNpcworKysgYi90dXRvcmlhbC9vY2FtbC9fb2FzaXMKQEAgLTEsNSArMSw1IEBACiBOYW1lOiB0dXRvcmlhbAotVmVyc2lvbjogMC45LjMKK1ZlcnNpb246IDEuMC4wCiBPQVNJU0Zvcm1hdDogMC4zCiBTeW5vcHNpczogT0NhbWwgVHV0b3JpYWwgZXhhbXBsZQogQXV0aG9yczogQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+CmRpZmYgLS1naXQgYS90dXRvcmlhbC9wZXJsL1BlcmxDbGllbnQucGwgYi90dXRvcmlhbC9wZXJsL1BlcmxDbGllbnQucGwKaW5kZXggMWQ1OTY1Ni4uN2MyMzI4OSAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvcGVybC9QZXJsQ2xpZW50LnBsCisrKyBiL3R1dG9yaWFsL3BlcmwvUGVybENsaWVudC5wbApAQCAtMzcsMTAgKzM3LDEwIEBACiAKIHVzZSBEYXRhOjpEdW1wZXI7CiAKLW15ICRzb2NrZXQgICAgPSBuZXcgVGhyaWZ0OjpTb2NrZXQoJ2xvY2FsaG9zdCcsOTA5MCk7Ci1teSAkdHJhbnNwb3J0ID0gbmV3IFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQoJHNvY2tldCwxMDI0LDEwMjQpOwotbXkgJHByb3RvY29sICA9IG5ldyBUaHJpZnQ6OkJpbmFyeVByb3RvY29sKCR0cmFuc3BvcnQpOwotbXkgJGNsaWVudCAgICA9IG5ldyB0dXRvcmlhbDo6Q2FsY3VsYXRvckNsaWVudCgkcHJvdG9jb2wpOworbXkgJHNvY2tldCAgICA9IFRocmlmdDo6U29ja2V0LT5uZXcoJ2xvY2FsaG9zdCcsOTA5MCk7CitteSAkdHJhbnNwb3J0ID0gVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydC0+bmV3KCRzb2NrZXQsMTAyNCwxMDI0KTsKK215ICRwcm90b2NvbCAgPSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sLT5uZXcoJHRyYW5zcG9ydCk7CitteSAkY2xpZW50ICAgID0gdHV0b3JpYWw6OkNhbGN1bGF0b3JDbGllbnQtPm5ldygkcHJvdG9jb2wpOwogCiAKIGV2YWx7CkBAIC01Myw3ICs1Myw3IEBACiAgICAgbXkgJHN1bSA9ICRjbGllbnQtPmFkZCgxLDEpOwogICAgIHByaW50ICIxKzE9JHN1bVxuIjsKIAotICAgIG15ICR3b3JrID0gbmV3IHR1dG9yaWFsOjpXb3JrKCk7CisgICAgbXkgJHdvcmsgPSB0dXRvcmlhbDo6V29yay0+bmV3KCk7CiAKICAgICAkd29yay0+b3AodHV0b3JpYWw6Ok9wZXJhdGlvbjo6RElWSURFKTsKICAgICAkd29yay0+bnVtMSgxKTsKQEAgLTYzLDcgKzYzLDcgQEAKICAgICAgICAgJGNsaWVudC0+Y2FsY3VsYXRlKDEsICR3b3JrKTsKICAgICAgICAgcHJpbnQgIldob2EhIFdlIGNhbiBkaXZpZGUgYnkgemVybz9cbiI7CiAgICAgfTsgaWYoJEApIHsKLSAgICAgICAgd2FybiAiSW52YWxpZE9wZXJhdGlvbjogIi5EdW1wZXIoJEApOworICAgICAgICB3YXJuICdJbnZhbGlkT3BlcmF0aW9uOiAnLkR1bXBlcigkQCk7CiAgICAgfQogCiAgICAgJHdvcmstPm9wKHR1dG9yaWFsOjpPcGVyYXRpb246OlNVQlRSQUNUKTsKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3BlcmwvUGVybFNlcnZlci5wbCBiL3R1dG9yaWFsL3BlcmwvUGVybFNlcnZlci5wbAppbmRleCBhZGVjOTc4Li5kZmU2Yjg5IDEwMDY0NAotLS0gYS90dXRvcmlhbC9wZXJsL1BlcmxTZXJ2ZXIucGwKKysrIGIvdHV0b3JpYWwvcGVybC9QZXJsU2VydmVyLnBsCkBAIC0xLDQgKzEsNCBAQAotIyEvdXNyL2Jpbi9wZXJsCisjIS91c3IvYmluL2VudiBwZXJsCiAKICMKICMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQpAQCAtNjcsMjAgKzY3LDIwIEBACiAgIH0gZWxzaWYgKCRvcCA9PSB0dXRvcmlhbDo6T3BlcmF0aW9uOjpESVZJREUpIHsKICAgICBpZiAoJG51bTIgPT0gMCkKICAgICB7Ci0gICAgICBteSAkeCA9IG5ldyB0dXRvcmlhbDo6SW52YWxpZE9wZXJhdGlvbjsKKyAgICAgIG15ICR4ID0gdHV0b3JpYWw6OkludmFsaWRPcGVyYXRpb24tPm5ldygpOwogICAgICAgJHgtPndoYXRPcCgkb3ApOwogICAgICAgJHgtPndoeSgnQ2Fubm90IGRpdmlkZSBieSAwJyk7CiAgICAgICBkaWUgJHg7CiAgICAgfQogICAgICR2YWwgPSAkbnVtMSAvICRudW0yOwogICB9IGVsc2UgewotICAgIG15ICR4ID0gbmV3IHR1dG9yaWFsOjpJbnZhbGlkT3BlcmF0aW9uOworICAgIG15ICR4ID0gdHV0b3JpYWw6OkludmFsaWRPcGVyYXRpb24tPm5ldygpOwogICAgICR4LT53aGF0T3AoJG9wKTsKICAgICAkeC0+d2h5KCdJbnZhbGlkIG9wZXJhdGlvbicpOwogICAgIGRpZSAkeDsKICAgfQogCi0gIG15ICRsb2cgPSBuZXcgc2hhcmVkOjpTaGFyZWRTdHJ1Y3Q7CisgIG15ICRsb2cgPSBzaGFyZWQ6OlNoYXJlZFN0cnVjdC0+bmV3KCk7CiAgICRsb2ctPmtleSgkbG9naWQpOwogICAkbG9nLT52YWx1ZShpbnQoJHZhbCkpOwogICAkc2VsZi0+e2xvZ30tPnskbG9naWR9ID0gJGxvZzsKQEAgLTEwNCwxMCArMTA0LDEwIEBACiAKIAogZXZhbCB7Ci0gIG15ICRoYW5kbGVyICAgICAgID0gbmV3IENhbGN1bGF0b3JIYW5kbGVyOwotICBteSAkcHJvY2Vzc29yICAgICA9IG5ldyB0dXRvcmlhbDo6Q2FsY3VsYXRvclByb2Nlc3NvcigkaGFuZGxlcik7Ci0gIG15ICRzZXJ2ZXJzb2NrZXQgID0gbmV3IFRocmlmdDo6U2VydmVyU29ja2V0KDkwOTApOwotICBteSAkZm9ya2luZ3NlcnZlciA9IG5ldyBUaHJpZnQ6OkZvcmtpbmdTZXJ2ZXIoJHByb2Nlc3NvciwgJHNlcnZlcnNvY2tldCk7CisgIG15ICRoYW5kbGVyICAgICAgID0gQ2FsY3VsYXRvckhhbmRsZXItPm5ldygpOworICBteSAkcHJvY2Vzc29yICAgICA9IHR1dG9yaWFsOjpDYWxjdWxhdG9yUHJvY2Vzc29yLT5uZXcoJGhhbmRsZXIpOworICBteSAkc2VydmVyc29ja2V0ICA9IFRocmlmdDo6U2VydmVyU29ja2V0LT5uZXcoOTA5MCk7CisgIG15ICRmb3JraW5nc2VydmVyID0gVGhyaWZ0OjpGb3JraW5nU2VydmVyLT5uZXcoJHByb2Nlc3NvciwgJHNlcnZlcnNvY2tldCk7CiAgIHByaW50ICJTdGFydGluZyB0aGUgc2VydmVyLi4uXG4iOwogICAkZm9ya2luZ3NlcnZlci0+c2VydmUoKTsKICAgcHJpbnQgImRvbmUuXG4iOwpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcGhwL1BocENsaWVudC5waHAgYi90dXRvcmlhbC9waHAvUGhwQ2xpZW50LnBocAppbmRleCBkMjYyYjhmLi45MmRjM2NiIDEwMDc1NQotLS0gYS90dXRvcmlhbC9waHAvUGhwQ2xpZW50LnBocAorKysgYi90dXRvcmlhbC9waHAvUGhwQ2xpZW50LnBocApAQCAtNSw3ICs1LDcgQEAKIAogZXJyb3JfcmVwb3J0aW5nKEVfQUxMKTsKIAotcmVxdWlyZV9vbmNlIF9fRElSX18uJy8uLi8uLi9saWIvcGhwL2xpYi9UaHJpZnQvQ2xhc3NMb2FkZXIvVGhyaWZ0Q2xhc3NMb2FkZXIucGhwJzsKK3JlcXVpcmVfb25jZSBfX0RJUl9fLicvLi4vLi4vbGliL3BocC9saWIvQ2xhc3NMb2FkZXIvVGhyaWZ0Q2xhc3NMb2FkZXIucGhwJzsKIAogdXNlIFRocmlmdFxDbGFzc0xvYWRlclxUaHJpZnRDbGFzc0xvYWRlcjsKIApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcGhwL1BocFNlcnZlci5waHAgYi90dXRvcmlhbC9waHAvUGhwU2VydmVyLnBocAppbmRleCAyMmFlNDNlLi41YTliNDliIDEwMDc1NQotLS0gYS90dXRvcmlhbC9waHAvUGhwU2VydmVyLnBocAorKysgYi90dXRvcmlhbC9waHAvUGhwU2VydmVyLnBocApAQCAtNSw3ICs1LDcgQEAKIAogZXJyb3JfcmVwb3J0aW5nKEVfQUxMKTsKIAotcmVxdWlyZV9vbmNlIF9fRElSX18uJy8uLi8uLi9saWIvcGhwL2xpYi9UaHJpZnQvQ2xhc3NMb2FkZXIvVGhyaWZ0Q2xhc3NMb2FkZXIucGhwJzsKK3JlcXVpcmVfb25jZSBfX0RJUl9fLicvLi4vLi4vbGliL3BocC9saWIvQ2xhc3NMb2FkZXIvVGhyaWZ0Q2xhc3NMb2FkZXIucGhwJzsKIAogdXNlIFRocmlmdFxDbGFzc0xvYWRlclxUaHJpZnRDbGFzc0xvYWRlcjsKIApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcGhwL3J1bnNlcnZlci5weSBiL3R1dG9yaWFsL3BocC9ydW5zZXJ2ZXIucHkKaW5kZXggYWUyOWZlZC4uMDc3ZGFhMSAxMDA3NTUKLS0tIGEvdHV0b3JpYWwvcGhwL3J1bnNlcnZlci5weQorKysgYi90dXRvcmlhbC9waHAvcnVuc2VydmVyLnB5CkBAIC0yNiw3ICsyNiw4IEBACiAjIGNoZGlyKDIpIGludG8gdGhlIHR1dG9yaWFsIGRpcmVjdG9yeS4KIG9zLmNoZGlyKG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5yZWFscGF0aChfX2ZpbGVfXykpKSkKIAorCiBjbGFzcyBIYW5kbGVyKENHSUhUVFBTZXJ2ZXIuQ0dJSFRUUFJlcXVlc3RIYW5kbGVyKToKLSAgY2dpX2RpcmVjdG9yaWVzICA9IFsnL3BocCddCisgICAgY2dpX2RpcmVjdG9yaWVzID0gWycvcGhwJ10KIAogQmFzZUhUVFBTZXJ2ZXIuSFRUUFNlcnZlcigoJycsIDgwODApLCBIYW5kbGVyKS5zZXJ2ZV9mb3JldmVyKCkKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3B5LnRvcm5hZG8vTWFrZWZpbGUuYW0gYi90dXRvcmlhbC9weS50b3JuYWRvL01ha2VmaWxlLmFtCmluZGV4IDZhYzYwMjMuLjRiNzNjMWUgMTAwNzU1Ci0tLSBhL3R1dG9yaWFsL3B5LnRvcm5hZG8vTWFrZWZpbGUuYW0KKysrIGIvdHV0b3JpYWwvcHkudG9ybmFkby9NYWtlZmlsZS5hbQpAQCAtMTcsOCArMTcsNiBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotVEhSSUZUID0gJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKLQogZ2VuLXB5LnRvcm5hZG8vdHV0b3JpYWwvQ2FsY3VsYXRvci5weSBnZW4tcHkudG9ybmFkby9zaGFyZWQvU2hhcmVkU2VydmljZS5weTogJCh0b3Bfc3JjZGlyKS90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQKIAkkKFRIUklGVCkgLS1nZW4gcHk6dG9ybmFkbyAtciAkPAogCmRpZmYgLS1naXQgYS90dXRvcmlhbC9weS50b3JuYWRvL1B5dGhvbkNsaWVudC5weSBiL3R1dG9yaWFsL3B5LnRvcm5hZG8vUHl0aG9uQ2xpZW50LnB5CmluZGV4IDk1ZDc4YjguLjQyNjE0NmYgMTAwNzU1Ci0tLSBhL3R1dG9yaWFsL3B5LnRvcm5hZG8vUHl0aG9uQ2xpZW50LnB5CisrKyBiL3R1dG9yaWFsL3B5LnRvcm5hZG8vUHl0aG9uQ2xpZW50LnB5CkBAIC0xOSwxOCArMTksMTcgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLWltcG9ydCBzeXMKIGltcG9ydCBnbG9iCi1zeXMucGF0aC5hcHBlbmQoJ2dlbi1weS50b3JuYWRvJykKLXN5cy5wYXRoLmluc2VydCgwLCBnbG9iLmdsb2IoJy4uLy4uL2xpYi9weS9idWlsZC9saWIuKicpWzBdKQotCiBpbXBvcnQgbG9nZ2luZworaW1wb3J0IHN5cworCitzeXMucGF0aC5hcHBlbmQoJ2dlbi1weS50b3JuYWRvJykKK3N5cy5wYXRoLmluc2VydCgwLCBnbG9iLmdsb2IoJy4uLy4uL2xpYi9weS9idWlsZC9saWIqJylbMF0pCiAKIGZyb20gdHV0b3JpYWwgaW1wb3J0IENhbGN1bGF0b3IKIGZyb20gdHV0b3JpYWwudHR5cGVzIGltcG9ydCBPcGVyYXRpb24sIFdvcmssIEludmFsaWRPcGVyYXRpb24KIAogZnJvbSB0aHJpZnQgaW1wb3J0IFRUb3JuYWRvCi1mcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRTb2NrZXQKIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAogZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAogCkBAIC0zOCwzOSArMzcsMzggQEAKIGZyb20gdG9ybmFkbyBpbXBvcnQgaW9sb29wCiAKIAotQGdlbi5lbmdpbmUKLWRlZiBjb21tdW5pY2F0ZShjYWxsYmFjaz1Ob25lKToKK0BnZW4uY29yb3V0aW5lCitkZWYgY29tbXVuaWNhdGUoKToKICAgICAjIGNyZWF0ZSBjbGllbnQKICAgICB0cmFuc3BvcnQgPSBUVG9ybmFkby5UVG9ybmFkb1N0cmVhbVRyYW5zcG9ydCgnbG9jYWxob3N0JywgOTA5MCkKKyAgICAjIG9wZW4gdGhlIHRyYW5zcG9ydCwgYmFpbCBvbiBlcnJvcgorICAgIHRyeToKKyAgICAgICAgeWllbGQgdHJhbnNwb3J0Lm9wZW4oKQorICAgICAgICBwcmludCgnVHJhbnNwb3J0IGlzIG9wZW5lZCcpCisgICAgZXhjZXB0IFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbiBhcyBleDoKKyAgICAgICAgbG9nZ2luZy5lcnJvcihleCkKKyAgICAgICAgcmFpc2UgZ2VuLlJldHVybigpCisKICAgICBwZmFjdG9yeSA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkKICAgICBjbGllbnQgPSBDYWxjdWxhdG9yLkNsaWVudCh0cmFuc3BvcnQsIHBmYWN0b3J5KQogCi0gICAgIyBvcGVuIHRoZSB0cmFuc3BvcnQsIGJhaWwgb24gZXJyb3IKLSAgICB0cnk6Ci0gICAgICAgIHlpZWxkIGdlbi5UYXNrKHRyYW5zcG9ydC5vcGVuKQotICAgIGV4Y2VwdCBUVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb24gYXMgZXg6Ci0gICAgICAgIGxvZ2dpbmcuZXJyb3IoZXgpCi0gICAgICAgIGlmIGNhbGxiYWNrOgotICAgICAgICAgICAgY2FsbGJhY2soKQotICAgICAgICByZXR1cm4KLQogICAgICMgcGluZwotICAgIHlpZWxkIGdlbi5UYXNrKGNsaWVudC5waW5nKQotICAgIHByaW50ICJwaW5nKCkiCisgICAgeWllbGQgY2xpZW50LnBpbmcoKQorICAgIHByaW50KCJwaW5nKCkiKQogCiAgICAgIyBhZGQKLSAgICBzdW1fID0geWllbGQgZ2VuLlRhc2soY2xpZW50LmFkZCwgMSwgMSkKLSAgICBwcmludCAiMSArIDEgPSB7fSIuZm9ybWF0KHN1bV8pCisgICAgc3VtXyA9IHlpZWxkIGNsaWVudC5hZGQoMSwgMSkKKyAgICBwcmludCgiMSArIDEgPSB7MH0iLmZvcm1hdChzdW1fKSkKIAogICAgICMgbWFrZSBhIG9uZXdheSBjYWxsIHdpdGhvdXQgYSBjYWxsYmFjayAoc2NoZWR1bGUgdGhlIHdyaXRlIGFuZCBjb250aW51ZQogICAgICMgd2l0aG91dCBibG9ja2luZykKICAgICBjbGllbnQuemlwKCkKLSAgICBwcmludCAiemlwKCkgd2l0aG91dCBjYWxsYmFjayIKKyAgICBwcmludCgiemlwKCkgd2l0aG91dCBjYWxsYmFjayIpCiAKICAgICAjIG1ha2UgYSBvbmV3YXkgY2FsbCB3aXRoIGEgY2FsbGJhY2sgKHdlJ2xsIHdhaXQgZm9yIHRoZSBzdHJlYW0gd3JpdGUgdG8KICAgICAjIGNvbXBsZXRlIGJlZm9yZSBjb250aW51aW5nKQotICAgIHlpZWxkIGdlbi5UYXNrKGNsaWVudC56aXApCi0gICAgcHJpbnQgInppcCgpIHdpdGggY2FsbGJhY2siCisgICAgY2xpZW50LnppcCgpCisgICAgcHJpbnQoInppcCgpIHdpdGggY2FsbGJhY2siKQogCiAgICAgIyBjYWxjdWxhdGUgMS8wCiAgICAgd29yayA9IFdvcmsoKQpAQCAtNzksMzcgKzc3LDMxIEBACiAgICAgd29yay5udW0yID0gMAogCiAgICAgdHJ5OgotICAgICAgICBxdW90aWVudCA9IHlpZWxkIGdlbi5UYXNrKGNsaWVudC5jYWxjdWxhdGUsIDEsIHdvcmspCi0gICAgICAgIHByaW50ICJXaG9hPyBZb3Uga25vdyBob3cgdG8gZGl2aWRlIGJ5IHplcm8/IgorICAgICAgICBxdW90aWVudCA9IHlpZWxkIGNsaWVudC5jYWxjdWxhdGUoMSwgd29yaykKKyAgICAgICAgcHJpbnQoIldob2E/IFlvdSBrbm93IGhvdyB0byBkaXZpZGUgYnkgemVybyA/IC0+IHswfSIuZm9ybWF0KHF1b3RpZW50KSkKICAgICBleGNlcHQgSW52YWxpZE9wZXJhdGlvbiBhcyBpbzoKLSAgICAgICAgcHJpbnQgIkludmFsaWRPcGVyYXRpb246IHt9Ii5mb3JtYXQoaW8pCisgICAgICAgIHByaW50KCJJbnZhbGlkT3BlcmF0aW9uOiB7MH0iLmZvcm1hdChpbykpCiAKICAgICAjIGNhbGN1bGF0ZSAxNS0xMAogICAgIHdvcmsub3AgPSBPcGVyYXRpb24uU1VCVFJBQ1QKICAgICB3b3JrLm51bTEgPSAxNQogICAgIHdvcmsubnVtMiA9IDEwCiAKLSAgICBkaWZmID0geWllbGQgZ2VuLlRhc2soY2xpZW50LmNhbGN1bGF0ZSwgMSwgd29yaykKLSAgICBwcmludCAiMTUgLSAxMCA9IHt9Ii5mb3JtYXQoZGlmZikKKyAgICBkaWZmID0geWllbGQgY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrKQorICAgIHByaW50KCIxNSAtIDEwID0gezB9Ii5mb3JtYXQoZGlmZikpCiAKICAgICAjIGdldFN0cnVjdAotICAgIGxvZyA9IHlpZWxkIGdlbi5UYXNrKGNsaWVudC5nZXRTdHJ1Y3QsIDEpCi0gICAgcHJpbnQgIkNoZWNrIGxvZzoge30iLmZvcm1hdChsb2cudmFsdWUpCisgICAgbG9nID0geWllbGQgY2xpZW50LmdldFN0cnVjdCgxKQorICAgIHByaW50KCJDaGVjayBsb2c6IHswfSIuZm9ybWF0KGxvZy52YWx1ZSkpCiAKICAgICAjIGNsb3NlIHRoZSB0cmFuc3BvcnQKICAgICBjbGllbnQuX3RyYW5zcG9ydC5jbG9zZSgpCi0KLSAgICBpZiBjYWxsYmFjazoKLSAgICAgICAgY2FsbGJhY2soKQorICAgIHJhaXNlIGdlbi5SZXR1cm4oKQogCiAKIGRlZiBtYWluKCk6CiAgICAgIyBjcmVhdGUgYW4gaW9sb29wLCBkbyB0aGUgYWJvdmUsIHRoZW4gc3RvcAotICAgIGlvX2xvb3AgPSBpb2xvb3AuSU9Mb29wLmluc3RhbmNlKCkKLSAgICBkZWYgdGhpc19qb2ludCgpOgotICAgICAgICBjb21tdW5pY2F0ZShjYWxsYmFjaz1pb19sb29wLnN0b3ApCi0gICAgaW9fbG9vcC5hZGRfY2FsbGJhY2sodGhpc19qb2ludCkKLSAgICBpb19sb29wLnN0YXJ0KCkKKyAgICBpb2xvb3AuSU9Mb29wLmN1cnJlbnQoKS5ydW5fc3luYyhjb21tdW5pY2F0ZSkKIAogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcHkudG9ybmFkby9QeXRob25TZXJ2ZXIucHkgYi90dXRvcmlhbC9weS50b3JuYWRvL1B5dGhvblNlcnZlci5weQppbmRleCA3YTM0MTA3Li5lMDIyOWEyIDEwMDc1NQotLS0gYS90dXRvcmlhbC9weS50b3JuYWRvL1B5dGhvblNlcnZlci5weQorKysgYi90dXRvcmlhbC9weS50b3JuYWRvL1B5dGhvblNlcnZlci5weQpAQCAtMTksMTAgKzE5LDExIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1pbXBvcnQgc3lzCiBpbXBvcnQgZ2xvYgoraW1wb3J0IHN5cworCiBzeXMucGF0aC5hcHBlbmQoJ2dlbi1weS50b3JuYWRvJykKLXN5cy5wYXRoLmluc2VydCgwLCBnbG9iLmdsb2IoJy4uLy4uL2xpYi9weS9idWlsZC9saWIuKicpWzBdKQorc3lzLnBhdGguaW5zZXJ0KDAsIGdsb2IuZ2xvYignLi4vLi4vbGliL3B5L2J1aWxkL2xpYionKVswXSkKIAogZnJvbSB0dXRvcmlhbCBpbXBvcnQgQ2FsY3VsYXRvcgogZnJvbSB0dXRvcmlhbC50dHlwZXMgaW1wb3J0IE9wZXJhdGlvbiwgSW52YWxpZE9wZXJhdGlvbgpAQCAtMzAsMTAgKzMxLDcgQEAKIGZyb20gc2hhcmVkLnR0eXBlcyBpbXBvcnQgU2hhcmVkU3RydWN0CiAKIGZyb20gdGhyaWZ0IGltcG9ydCBUVG9ybmFkbwotZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUU29ja2V0Ci1mcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKLWZyb20gdGhyaWZ0LnNlcnZlciBpbXBvcnQgVFNlcnZlcgogCiBmcm9tIHRvcm5hZG8gaW1wb3J0IGlvbG9vcAogCkBAIC00MiwxNiArNDAsMTUgQEAKICAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgIHNlbGYubG9nID0ge30KIAotICAgIGRlZiBwaW5nKHNlbGYsIGNhbGxiYWNrKToKLSAgICAgICAgcHJpbnQgInBpbmcoKSIKLSAgICAgICAgY2FsbGJhY2soKQorICAgIGRlZiBwaW5nKHNlbGYpOgorICAgICAgICBwcmludCgicGluZygpIikKIAotICAgIGRlZiBhZGQoc2VsZiwgbjEsIG4yLCBjYWxsYmFjayk6Ci0gICAgICAgIHByaW50ICJhZGQoe30sIHt9KSIuZm9ybWF0KG4xLCBuMikKLSAgICAgICAgY2FsbGJhY2sobjEgKyBuMikKKyAgICBkZWYgYWRkKHNlbGYsIG4xLCBuMik6CisgICAgICAgIHByaW50KCJhZGQoe30sIHt9KSIuZm9ybWF0KG4xLCBuMikpCisgICAgICAgIHJldHVybiBuMSArIG4yCiAKLSAgICBkZWYgY2FsY3VsYXRlKHNlbGYsIGxvZ2lkLCB3b3JrLCBjYWxsYmFjayk6Ci0gICAgICAgIHByaW50ICJjYWxjdWxhdGUoe30sIHt9KSIuZm9ybWF0KGxvZ2lkLCB3b3JrKQorICAgIGRlZiBjYWxjdWxhdGUoc2VsZiwgbG9naWQsIHdvcmspOgorICAgICAgICBwcmludCgiY2FsY3VsYXRlKHt9LCB7fSkiLmZvcm1hdChsb2dpZCwgd29yaykpCiAKICAgICAgICAgaWYgd29yay5vcCA9PSBPcGVyYXRpb24uQUREOgogICAgICAgICAgICAgdmFsID0gd29yay5udW0xICsgd29yay5udW0yCkBAIC03NiwxNSArNzMsMTQgQEAKICAgICAgICAgbG9nLmtleSA9IGxvZ2lkCiAgICAgICAgIGxvZy52YWx1ZSA9ICclZCcgJSAodmFsKQogICAgICAgICBzZWxmLmxvZ1tsb2dpZF0gPSBsb2cKLSAgICAgICAgY2FsbGJhY2sodmFsKQorICAgICAgICByZXR1cm4gdmFsCiAKLSAgICBkZWYgZ2V0U3RydWN0KHNlbGYsIGtleSwgY2FsbGJhY2spOgotICAgICAgICBwcmludCAiZ2V0U3RydWN0KHt9KSIuZm9ybWF0KGtleSkKLSAgICAgICAgY2FsbGJhY2soc2VsZi5sb2dba2V5XSkKKyAgICBkZWYgZ2V0U3RydWN0KHNlbGYsIGtleSk6CisgICAgICAgIHByaW50KCJnZXRTdHJ1Y3Qoe30pIi5mb3JtYXQoa2V5KSkKKyAgICAgICAgcmV0dXJuIHNlbGYubG9nW2tleV0KIAotICAgIGRlZiB6aXAoc2VsZiwgY2FsbGJhY2spOgotICAgICAgICBwcmludCAiemlwKCkiCi0gICAgICAgIGNhbGxiYWNrKCkKKyAgICBkZWYgemlwKHNlbGYpOgorICAgICAgICBwcmludCgiemlwKCkiKQogCiAKIGRlZiBtYWluKCk6CkBAIC05MywxMSArODksMTEgQEAKICAgICBwZmFjdG9yeSA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkKICAgICBzZXJ2ZXIgPSBUVG9ybmFkby5UVG9ybmFkb1NlcnZlcihwcm9jZXNzb3IsIHBmYWN0b3J5KQogCi0gICAgcHJpbnQgIlN0YXJ0aW5nIHRoZSBzZXJ2ZXIuLi4iCisgICAgcHJpbnQoIlN0YXJ0aW5nIHRoZSBzZXJ2ZXIuLi4iKQogICAgIHNlcnZlci5iaW5kKDkwOTApCiAgICAgc2VydmVyLnN0YXJ0KDEpCiAgICAgaW9sb29wLklPTG9vcC5pbnN0YW5jZSgpLnN0YXJ0KCkKLSAgICBwcmludCAiZG9uZS4iCisgICAgcHJpbnQoImRvbmUuIikKIAogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcHkudHdpc3RlZC9NYWtlZmlsZS5hbSBiL3R1dG9yaWFsL3B5LnR3aXN0ZWQvTWFrZWZpbGUuYW0KaW5kZXggYzZjYmQ0NS4uNTBjZDM0MiAxMDA3NTUKLS0tIGEvdHV0b3JpYWwvcHkudHdpc3RlZC9NYWtlZmlsZS5hbQorKysgYi90dXRvcmlhbC9weS50d2lzdGVkL01ha2VmaWxlLmFtCkBAIC0xNyw4ICsxNyw2IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1USFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAotCiBnZW4tcHkvdHV0b3JpYWwvQ2FsY3VsYXRvci5weSBnZW4tcHkvc2hhcmVkL1NoYXJlZFNlcnZpY2UucHk6ICQodG9wX3NyY2RpcikvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CiAJJChUSFJJRlQpIC0tZ2VuIHB5OnR3aXN0ZWQgLXIgJDwKIApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcHkudHdpc3RlZC9QeXRob25DbGllbnQucHkgYi90dXRvcmlhbC9weS50d2lzdGVkL1B5dGhvbkNsaWVudC5weQppbmRleCA5ZTA4NmYwLi42M2RkZTdlIDEwMDc1NQotLS0gYS90dXRvcmlhbC9weS50d2lzdGVkL1B5dGhvbkNsaWVudC5weQorKysgYi90dXRvcmlhbC9weS50d2lzdGVkL1B5dGhvbkNsaWVudC5weQpAQCAtMTksNTEgKzE5LDUzIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1pbXBvcnQgc3lzLCBnbG9iCitpbXBvcnQgZ2xvYgoraW1wb3J0IHN5cwogc3lzLnBhdGguYXBwZW5kKCdnZW4tcHkudHdpc3RlZCcpCi1zeXMucGF0aC5pbnNlcnQoMCwgZ2xvYi5nbG9iKCcuLi8uLi9saWIvcHkvYnVpbGQvbGliLionKVswXSkKK3N5cy5wYXRoLmluc2VydCgwLCBnbG9iLmdsb2IoJy4uLy4uL2xpYi9weS9idWlsZC9saWIqJylbMF0pCiAKIGZyb20gdHV0b3JpYWwgaW1wb3J0IENhbGN1bGF0b3IKLWZyb20gdHV0b3JpYWwudHR5cGVzIGltcG9ydCAqCitmcm9tIHR1dG9yaWFsLnR0eXBlcyBpbXBvcnQgSW52YWxpZE9wZXJhdGlvbiwgT3BlcmF0aW9uLCBXb3JrCiAKIGZyb20gdHdpc3RlZC5pbnRlcm5ldC5kZWZlciBpbXBvcnQgaW5saW5lQ2FsbGJhY2tzCiBmcm9tIHR3aXN0ZWQuaW50ZXJuZXQgaW1wb3J0IHJlYWN0b3IKIGZyb20gdHdpc3RlZC5pbnRlcm5ldC5wcm90b2NvbCBpbXBvcnQgQ2xpZW50Q3JlYXRvcgogCi1mcm9tIHRocmlmdCBpbXBvcnQgVGhyaWZ0CiBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUd2lzdGVkCiBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCiAKKwogQGlubGluZUNhbGxiYWNrcwogZGVmIG1haW4oY2xpZW50KToKLSAgeWllbGQgY2xpZW50LnBpbmcoKQotICBwcmludCAncGluZygpJworICAgIHlpZWxkIGNsaWVudC5waW5nKCkKKyAgICBwcmludCgncGluZygpJykKIAotICBzdW0gPSB5aWVsZCBjbGllbnQuYWRkKDEsMSkKLSAgcHJpbnQgJzErMT0lZCcgJSAoc3VtKQorICAgIHN1bSA9IHlpZWxkIGNsaWVudC5hZGQoMSwgMSkKKyAgICBwcmludCgoJzErMT0lZCcgJSAoc3VtKSkpCiAKLSAgd29yayA9IFdvcmsoKQorICAgIHdvcmsgPSBXb3JrKCkKIAotICB3b3JrLm9wID0gT3BlcmF0aW9uLkRJVklERQotICB3b3JrLm51bTEgPSAxCi0gIHdvcmsubnVtMiA9IDAKKyAgICB3b3JrLm9wID0gT3BlcmF0aW9uLkRJVklERQorICAgIHdvcmsubnVtMSA9IDEKKyAgICB3b3JrLm51bTIgPSAwCiAKLSAgdHJ5OgotICAgIHF1b3RpZW50ID0geWllbGQgY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrKQotICAgIHByaW50ICdXaG9hPyBZb3Uga25vdyBob3cgdG8gZGl2aWRlIGJ5IHplcm8/JwotICBleGNlcHQgSW52YWxpZE9wZXJhdGlvbiwgaW86Ci0gICAgcHJpbnQgJ0ludmFsaWRPcGVyYXRpb246ICVyJyAlIGlvCisgICAgdHJ5OgorICAgICAgICBxdW90aWVudCA9IHlpZWxkIGNsaWVudC5jYWxjdWxhdGUoMSwgd29yaykKKyAgICAgICAgcHJpbnQoJ1dob2E/IFlvdSBrbm93IGhvdyB0byBkaXZpZGUgYnkgemVybz8nKQorICAgICAgICBwcmludCgnRllJIHRoZSBhbnN3ZXIgaXMgJWQnICUgcXVvdGllbnQpCisgICAgZXhjZXB0IEludmFsaWRPcGVyYXRpb24gYXMgZToKKyAgICAgICAgcHJpbnQoKCdJbnZhbGlkT3BlcmF0aW9uOiAlcicgJSBlKSkKIAotICB3b3JrLm9wID0gT3BlcmF0aW9uLlNVQlRSQUNUCi0gIHdvcmsubnVtMSA9IDE1Ci0gIHdvcmsubnVtMiA9IDEwCisgICAgd29yay5vcCA9IE9wZXJhdGlvbi5TVUJUUkFDVAorICAgIHdvcmsubnVtMSA9IDE1CisgICAgd29yay5udW0yID0gMTAKIAotICBkaWZmID0geWllbGQgY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrKQotICBwcmludCAnMTUtMTA9JWQnICUgKGRpZmYpCisgICAgZGlmZiA9IHlpZWxkIGNsaWVudC5jYWxjdWxhdGUoMSwgd29yaykKKyAgICBwcmludCgoJzE1LTEwPSVkJyAlIChkaWZmKSkpCiAKLSAgbG9nID0geWllbGQgY2xpZW50LmdldFN0cnVjdCgxKQotICBwcmludCAnQ2hlY2sgbG9nOiAlcycgJSAobG9nLnZhbHVlKQotICByZWFjdG9yLnN0b3AoKQorICAgIGxvZyA9IHlpZWxkIGNsaWVudC5nZXRTdHJ1Y3QoMSkKKyAgICBwcmludCgoJ0NoZWNrIGxvZzogJXMnICUgKGxvZy52YWx1ZSkpKQorICAgIHJlYWN0b3Iuc3RvcCgpCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgZCA9IENsaWVudENyZWF0b3IocmVhY3RvciwKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3B5LnR3aXN0ZWQvUHl0aG9uU2VydmVyLnB5IGIvdHV0b3JpYWwvcHkudHdpc3RlZC9QeXRob25TZXJ2ZXIucHkKaW5kZXggMjI3ZjZkNC4uMWIwZTJkNSAxMDA3NTUKLS0tIGEvdHV0b3JpYWwvcHkudHdpc3RlZC9QeXRob25TZXJ2ZXIucHkKKysrIGIvdHV0b3JpYWwvcHkudHdpc3RlZC9QeXRob25TZXJ2ZXIucHkKQEAgLTE5LDEyICsxOSwxMyBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotaW1wb3J0IHN5cywgZ2xvYgoraW1wb3J0IGdsb2IKK2ltcG9ydCBzeXMKIHN5cy5wYXRoLmFwcGVuZCgnZ2VuLXB5LnR3aXN0ZWQnKQotc3lzLnBhdGguaW5zZXJ0KDAsIGdsb2IuZ2xvYignLi4vLi4vbGliL3B5L2J1aWxkL2xpYi4qJylbMF0pCitzeXMucGF0aC5pbnNlcnQoMCwgZ2xvYi5nbG9iKCcuLi8uLi9saWIvcHkvYnVpbGQvbGliKicpWzBdKQogCiBmcm9tIHR1dG9yaWFsIGltcG9ydCBDYWxjdWxhdG9yCi1mcm9tIHR1dG9yaWFsLnR0eXBlcyBpbXBvcnQgKgorZnJvbSB0dXRvcmlhbC50dHlwZXMgaW1wb3J0IEludmFsaWRPcGVyYXRpb24sIE9wZXJhdGlvbgogCiBmcm9tIHNoYXJlZC50dHlwZXMgaW1wb3J0IFNoYXJlZFN0cnVjdAogCkBAIC0zMyw2MSArMzQsNjMgQEAKIAogZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHdpc3RlZAogZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAotZnJvbSB0aHJpZnQuc2VydmVyIGltcG9ydCBUU2VydmVyCisKIAogY2xhc3MgQ2FsY3VsYXRvckhhbmRsZXI6Ci0gIGltcGxlbWVudHMoQ2FsY3VsYXRvci5JZmFjZSkgIAotICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgc2VsZi5sb2cgPSB7fQorICAgIGltcGxlbWVudHMoQ2FsY3VsYXRvci5JZmFjZSkKIAotICBkZWYgcGluZyhzZWxmKToKLSAgICBwcmludCAncGluZygpJworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5sb2cgPSB7fQogCi0gIGRlZiBhZGQoc2VsZiwgbjEsIG4yKToKLSAgICBwcmludCAnYWRkKCVkLCVkKScgJSAobjEsIG4yKQotICAgIHJldHVybiBuMStuMgorICAgIGRlZiBwaW5nKHNlbGYpOgorICAgICAgICBwcmludCgncGluZygpJykKIAotICBkZWYgY2FsY3VsYXRlKHNlbGYsIGxvZ2lkLCB3b3JrKToKLSAgICBwcmludCAnY2FsY3VsYXRlKCVkLCAlciknICUgKGxvZ2lkLCB3b3JrKQorICAgIGRlZiBhZGQoc2VsZiwgbjEsIG4yKToKKyAgICAgICAgcHJpbnQoJ2FkZCglZCwlZCknICUgKG4xLCBuMikpCisgICAgICAgIHJldHVybiBuMSArIG4yCiAKLSAgICBpZiB3b3JrLm9wID09IE9wZXJhdGlvbi5BREQ6Ci0gICAgICB2YWwgPSB3b3JrLm51bTEgKyB3b3JrLm51bTIKLSAgICBlbGlmIHdvcmsub3AgPT0gT3BlcmF0aW9uLlNVQlRSQUNUOgotICAgICAgdmFsID0gd29yay5udW0xIC0gd29yay5udW0yCi0gICAgZWxpZiB3b3JrLm9wID09IE9wZXJhdGlvbi5NVUxUSVBMWToKLSAgICAgIHZhbCA9IHdvcmsubnVtMSAqIHdvcmsubnVtMgotICAgIGVsaWYgd29yay5vcCA9PSBPcGVyYXRpb24uRElWSURFOgotICAgICAgaWYgd29yay5udW0yID09IDA6Ci0gICAgICAgIHggPSBJbnZhbGlkT3BlcmF0aW9uKCkKLSAgICAgICAgeC53aGF0T3AgPSB3b3JrLm9wCi0gICAgICAgIHgud2h5ID0gJ0Nhbm5vdCBkaXZpZGUgYnkgMCcKLSAgICAgICAgcmFpc2UgeAotICAgICAgdmFsID0gd29yay5udW0xIC8gd29yay5udW0yCi0gICAgZWxzZToKLSAgICAgIHggPSBJbnZhbGlkT3BlcmF0aW9uKCkKLSAgICAgIHgud2hhdE9wID0gd29yay5vcAotICAgICAgeC53aHkgPSAnSW52YWxpZCBvcGVyYXRpb24nCi0gICAgICByYWlzZSB4CisgICAgZGVmIGNhbGN1bGF0ZShzZWxmLCBsb2dpZCwgd29yayk6CisgICAgICAgIHByaW50KCdjYWxjdWxhdGUoJWQsICVyKScgJSAobG9naWQsIHdvcmspKQogCi0gICAgbG9nID0gU2hhcmVkU3RydWN0KCkKLSAgICBsb2cua2V5ID0gbG9naWQKLSAgICBsb2cudmFsdWUgPSAnJWQnICUgKHZhbCkKLSAgICBzZWxmLmxvZ1tsb2dpZF0gPSBsb2cKKyAgICAgICAgaWYgd29yay5vcCA9PSBPcGVyYXRpb24uQUREOgorICAgICAgICAgICAgdmFsID0gd29yay5udW0xICsgd29yay5udW0yCisgICAgICAgIGVsaWYgd29yay5vcCA9PSBPcGVyYXRpb24uU1VCVFJBQ1Q6CisgICAgICAgICAgICB2YWwgPSB3b3JrLm51bTEgLSB3b3JrLm51bTIKKyAgICAgICAgZWxpZiB3b3JrLm9wID09IE9wZXJhdGlvbi5NVUxUSVBMWToKKyAgICAgICAgICAgIHZhbCA9IHdvcmsubnVtMSAqIHdvcmsubnVtMgorICAgICAgICBlbGlmIHdvcmsub3AgPT0gT3BlcmF0aW9uLkRJVklERToKKyAgICAgICAgICAgIGlmIHdvcmsubnVtMiA9PSAwOgorICAgICAgICAgICAgICAgIHggPSBJbnZhbGlkT3BlcmF0aW9uKCkKKyAgICAgICAgICAgICAgICB4LndoYXRPcCA9IHdvcmsub3AKKyAgICAgICAgICAgICAgICB4LndoeSA9ICdDYW5ub3QgZGl2aWRlIGJ5IDAnCisgICAgICAgICAgICAgICAgcmFpc2UgeAorICAgICAgICAgICAgdmFsID0gd29yay5udW0xIC8gd29yay5udW0yCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB4ID0gSW52YWxpZE9wZXJhdGlvbigpCisgICAgICAgICAgICB4LndoYXRPcCA9IHdvcmsub3AKKyAgICAgICAgICAgIHgud2h5ID0gJ0ludmFsaWQgb3BlcmF0aW9uJworICAgICAgICAgICAgcmFpc2UgeAogCi0gICAgcmV0dXJuIHZhbAorICAgICAgICBsb2cgPSBTaGFyZWRTdHJ1Y3QoKQorICAgICAgICBsb2cua2V5ID0gbG9naWQKKyAgICAgICAgbG9nLnZhbHVlID0gJyVkJyAlICh2YWwpCisgICAgICAgIHNlbGYubG9nW2xvZ2lkXSA9IGxvZwogCi0gIGRlZiBnZXRTdHJ1Y3Qoc2VsZiwga2V5KToKLSAgICBwcmludCAnZ2V0U3RydWN0KCVkKScgJSAoa2V5KQotICAgIHJldHVybiBzZWxmLmxvZ1trZXldCisgICAgICAgIHJldHVybiB2YWwKIAotICBkZWYgemlwKHNlbGYpOgotICAgIHByaW50ICd6aXAoKScKKyAgICBkZWYgZ2V0U3RydWN0KHNlbGYsIGtleSk6CisgICAgICAgIHByaW50KCdnZXRTdHJ1Y3QoJWQpJyAlIChrZXkpKQorICAgICAgICByZXR1cm4gc2VsZi5sb2dba2V5XQorCisgICAgZGVmIHppcChzZWxmKToKKyAgICAgICAgcHJpbnQoJ3ppcCgpJykKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICBoYW5kbGVyID0gQ2FsY3VsYXRvckhhbmRsZXIoKQogICAgIHByb2Nlc3NvciA9IENhbGN1bGF0b3IuUHJvY2Vzc29yKGhhbmRsZXIpCiAgICAgcGZhY3RvcnkgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpCi0gICAgc2VydmVyID0gcmVhY3Rvci5saXN0ZW5UQ1AoOTA5MCwKLSAgICAgICAgICAgICAgICBUVHdpc3RlZC5UaHJpZnRTZXJ2ZXJGYWN0b3J5KHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICBwZmFjdG9yeSksIGludGVyZmFjZT0iMTI3LjAuMC4xIikKKyAgICBzZXJ2ZXIgPSByZWFjdG9yLmxpc3RlblRDUCgKKyAgICAgICAgOTA5MCwKKyAgICAgICAgVFR3aXN0ZWQuVGhyaWZ0U2VydmVyRmFjdG9yeShwcm9jZXNzb3IsIHBmYWN0b3J5KSwKKyAgICAgICAgaW50ZXJmYWNlPSIxMjcuMC4wLjEiKQogICAgIHJlYWN0b3IucnVuKCkKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3B5LnR3aXN0ZWQvUHl0aG9uU2VydmVyLnRhYyBiL3R1dG9yaWFsL3B5LnR3aXN0ZWQvUHl0aG9uU2VydmVyLnRhYwppbmRleCAxZDBiNmM0Li4wNDc5NjM2IDEwMDc1NQotLS0gYS90dXRvcmlhbC9weS50d2lzdGVkL1B5dGhvblNlcnZlci50YWMKKysrIGIvdHV0b3JpYWwvcHkudHdpc3RlZC9QeXRob25TZXJ2ZXIudGFjCkBAIC0yMiwxMiArMjIsMTQgQEAKIGZyb20gdHdpc3RlZC5hcHBsaWNhdGlvbiBpbXBvcnQgaW50ZXJuZXQsIHNlcnZpY2UKIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFR3aXN0ZWQKIAotaW1wb3J0IHN5cywgZ2xvYgoraW1wb3J0IGdsb2IKK2ltcG9ydCBzeXMKIHN5cy5wYXRoLmFwcGVuZCgnZ2VuLXB5LnR3aXN0ZWQnKQotc3lzLnBhdGguaW5zZXJ0KDAsIGdsb2IuZ2xvYignLi4vLi4vbGliL3B5L2J1aWxkL2xpYi4qJylbMF0pCitzeXMucGF0aC5pbnNlcnQoMCwgZ2xvYi5nbG9iKCcuLi8uLi9saWIvcHkvYnVpbGQvbGliKicpWzBdKQogZnJvbSB0dXRvcmlhbCBpbXBvcnQgQ2FsY3VsYXRvcgotZnJvbSB0dXRvcmlhbC50dHlwZXMgaW1wb3J0ICoKIGZyb20gUHl0aG9uU2VydmVyIGltcG9ydCBDYWxjdWxhdG9ySGFuZGxlcgorZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAorCiAKIGRlZiBtYWtlX2FwcGxpY2F0aW9uKCk6CiAgICAgYXBwbGljYXRpb24gPSBzZXJ2aWNlLkFwcGxpY2F0aW9uKCdDYWxjU2VydmVyJykKQEAgLTM1LDggKzM3LDkgQEAKICAgICBoYW5kbGVyID0gQ2FsY3VsYXRvckhhbmRsZXIoKQogICAgIHByb2Nlc3NvciA9IENhbGN1bGF0b3IuUHJvY2Vzc29yKGhhbmRsZXIpCiAKLSAgICBzZXJ2ZXJGYWN0b3J5ID0gVFR3aXN0ZWQuVGhyaWZ0U2VydmVyRmFjdG9yeShwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKQorICAgIHNlcnZlckZhY3RvcnkgPSBUVHdpc3RlZC5UaHJpZnRTZXJ2ZXJGYWN0b3J5KAorICAgICAgICBwcm9jZXNzb3IsCisgICAgICAgIFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpCiAKICAgICBjYWxjU2VydmljZSA9IGludGVybmV0LlRDUFNlcnZlcig5MDkwLCBzZXJ2ZXJGYWN0b3J5KQogCkBAIC00Niw0ICs0OSw1IEBACiAKICAgICByZXR1cm4gYXBwbGljYXRpb24KIAotYXBwbGljYXRpb24gPSBtYWtlX2FwcGxpY2F0aW9uKCkKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgYXBwbGljYXRpb24gPSBtYWtlX2FwcGxpY2F0aW9uKCkKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3B5L01ha2VmaWxlLmFtIGIvdHV0b3JpYWwvcHkvTWFrZWZpbGUuYW0KaW5kZXggMjM5N2ExMi4uN2RiODE2ZCAxMDA3NTUKLS0tIGEvdHV0b3JpYWwvcHkvTWFrZWZpbGUuYW0KKysrIGIvdHV0b3JpYWwvcHkvTWFrZWZpbGUuYW0KQEAgLTE3LDggKzE3LDYgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLVRIUklGVCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0Ci0KIGdlbi1weS90dXRvcmlhbC9DYWxjdWxhdG9yLnB5IGdlbi1weS9zaGFyZWQvU2hhcmVkU2VydmljZS5weTogJCh0b3Bfc3JjZGlyKS90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQKIAkkKFRIUklGVCkgLS1nZW4gcHkgLXIgJDwKIApAQCAtMzQsNSArMzIsNiBAQAogCSQoUk0pIC1yIGdlbi0qCiAKIEVYVFJBX0RJU1QgPSBcCisJc2V0dXAuY2ZnIFwKIAlQeXRob25TZXJ2ZXIucHkgXAogCVB5dGhvbkNsaWVudC5weQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcHkvUHl0aG9uQ2xpZW50LnB5IGIvdHV0b3JpYWwvcHkvUHl0aG9uQ2xpZW50LnB5CmluZGV4IDA1NTRlZTEuLmE2YzE5NjYgMTAwNzU1Ci0tLSBhL3R1dG9yaWFsL3B5L1B5dGhvbkNsaWVudC5weQorKysgYi90dXRvcmlhbC9weS9QeXRob25DbGllbnQucHkKQEAgLTE5LDY1ICsxOSw3MSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotaW1wb3J0IHN5cywgZ2xvYgoraW1wb3J0IHN5cworaW1wb3J0IGdsb2IKIHN5cy5wYXRoLmFwcGVuZCgnZ2VuLXB5JykKLXN5cy5wYXRoLmluc2VydCgwLCBnbG9iLmdsb2IoJy4uLy4uL2xpYi9weS9idWlsZC9saWIuKicpWzBdKQorc3lzLnBhdGguaW5zZXJ0KDAsIGdsb2IuZ2xvYignLi4vLi4vbGliL3B5L2J1aWxkL2xpYionKVswXSkKIAogZnJvbSB0dXRvcmlhbCBpbXBvcnQgQ2FsY3VsYXRvcgotZnJvbSB0dXRvcmlhbC50dHlwZXMgaW1wb3J0ICoKK2Zyb20gdHV0b3JpYWwudHR5cGVzIGltcG9ydCBJbnZhbGlkT3BlcmF0aW9uLCBPcGVyYXRpb24sIFdvcmsKIAogZnJvbSB0aHJpZnQgaW1wb3J0IFRocmlmdAogZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUU29ja2V0CiBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKIAotdHJ5OgogCi0gICMgTWFrZSBzb2NrZXQKLSAgdHJhbnNwb3J0ID0gVFNvY2tldC5UU29ja2V0KCdsb2NhbGhvc3QnLCA5MDkwKQorZGVmIG1haW4oKToKKyAgICAjIE1ha2Ugc29ja2V0CisgICAgdHJhbnNwb3J0ID0gVFNvY2tldC5UU29ja2V0KCdsb2NhbGhvc3QnLCA5MDkwKQogCi0gICMgQnVmZmVyaW5nIGlzIGNyaXRpY2FsLiBSYXcgc29ja2V0cyBhcmUgdmVyeSBzbG93Ci0gIHRyYW5zcG9ydCA9IFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0KHRyYW5zcG9ydCkKKyAgICAjIEJ1ZmZlcmluZyBpcyBjcml0aWNhbC4gUmF3IHNvY2tldHMgYXJlIHZlcnkgc2xvdworICAgIHRyYW5zcG9ydCA9IFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0KHRyYW5zcG9ydCkKIAotICAjIFdyYXAgaW4gYSBwcm90b2NvbAotICBwcm90b2NvbCA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KQorICAgICMgV3JhcCBpbiBhIHByb3RvY29sCisgICAgcHJvdG9jb2wgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCkKIAotICAjIENyZWF0ZSBhIGNsaWVudCB0byB1c2UgdGhlIHByb3RvY29sIGVuY29kZXIKLSAgY2xpZW50ID0gQ2FsY3VsYXRvci5DbGllbnQocHJvdG9jb2wpCisgICAgIyBDcmVhdGUgYSBjbGllbnQgdG8gdXNlIHRoZSBwcm90b2NvbCBlbmNvZGVyCisgICAgY2xpZW50ID0gQ2FsY3VsYXRvci5DbGllbnQocHJvdG9jb2wpCiAKLSAgIyBDb25uZWN0IQotICB0cmFuc3BvcnQub3BlbigpCisgICAgIyBDb25uZWN0IQorICAgIHRyYW5zcG9ydC5vcGVuKCkKIAotICBjbGllbnQucGluZygpCi0gIHByaW50ICdwaW5nKCknCisgICAgY2xpZW50LnBpbmcoKQorICAgIHByaW50KCdwaW5nKCknKQogCi0gIHN1bSA9IGNsaWVudC5hZGQoMSwxKQotICBwcmludCAnMSsxPSVkJyAlIChzdW0pCisgICAgc3VtXyA9IGNsaWVudC5hZGQoMSwgMSkKKyAgICBwcmludCgnMSsxPSVkJyAlIHN1bV8pCiAKLSAgd29yayA9IFdvcmsoKQorICAgIHdvcmsgPSBXb3JrKCkKIAotICB3b3JrLm9wID0gT3BlcmF0aW9uLkRJVklERQotICB3b3JrLm51bTEgPSAxCi0gIHdvcmsubnVtMiA9IDAKKyAgICB3b3JrLm9wID0gT3BlcmF0aW9uLkRJVklERQorICAgIHdvcmsubnVtMSA9IDEKKyAgICB3b3JrLm51bTIgPSAwCiAKLSAgdHJ5OgotICAgIHF1b3RpZW50ID0gY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrKQotICAgIHByaW50ICdXaG9hPyBZb3Uga25vdyBob3cgdG8gZGl2aWRlIGJ5IHplcm8/JwotICBleGNlcHQgSW52YWxpZE9wZXJhdGlvbiwgaW86Ci0gICAgcHJpbnQgJ0ludmFsaWRPcGVyYXRpb246ICVyJyAlIGlvCisgICAgdHJ5OgorICAgICAgICBxdW90aWVudCA9IGNsaWVudC5jYWxjdWxhdGUoMSwgd29yaykKKyAgICAgICAgcHJpbnQoJ1dob2E/IFlvdSBrbm93IGhvdyB0byBkaXZpZGUgYnkgemVybz8nKQorICAgICAgICBwcmludCgnRllJIHRoZSBhbnN3ZXIgaXMgJWQnICUgcXVvdGllbnQpCisgICAgZXhjZXB0IEludmFsaWRPcGVyYXRpb24gYXMgZToKKyAgICAgICAgcHJpbnQoJ0ludmFsaWRPcGVyYXRpb246ICVyJyAlIGUpCiAKLSAgd29yay5vcCA9IE9wZXJhdGlvbi5TVUJUUkFDVAotICB3b3JrLm51bTEgPSAxNQotICB3b3JrLm51bTIgPSAxMAorICAgIHdvcmsub3AgPSBPcGVyYXRpb24uU1VCVFJBQ1QKKyAgICB3b3JrLm51bTEgPSAxNQorICAgIHdvcmsubnVtMiA9IDEwCiAKLSAgZGlmZiA9IGNsaWVudC5jYWxjdWxhdGUoMSwgd29yaykKLSAgcHJpbnQgJzE1LTEwPSVkJyAlIChkaWZmKQorICAgIGRpZmYgPSBjbGllbnQuY2FsY3VsYXRlKDEsIHdvcmspCisgICAgcHJpbnQoJzE1LTEwPSVkJyAlIGRpZmYpCiAKLSAgbG9nID0gY2xpZW50LmdldFN0cnVjdCgxKQotICBwcmludCAnQ2hlY2sgbG9nOiAlcycgJSAobG9nLnZhbHVlKQorICAgIGxvZyA9IGNsaWVudC5nZXRTdHJ1Y3QoMSkKKyAgICBwcmludCgnQ2hlY2sgbG9nOiAlcycgJSBsb2cudmFsdWUpCiAKLSAgIyBDbG9zZSEKLSAgdHJhbnNwb3J0LmNsb3NlKCkKKyAgICAjIENsb3NlIQorICAgIHRyYW5zcG9ydC5jbG9zZSgpCiAKLWV4Y2VwdCBUaHJpZnQuVEV4Y2VwdGlvbiwgdHg6Ci0gIHByaW50ICclcycgJSAodHgubWVzc2FnZSkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0cnk6CisgICAgICAgIG1haW4oKQorICAgIGV4Y2VwdCBUaHJpZnQuVEV4Y2VwdGlvbiBhcyB0eDoKKyAgICAgICAgcHJpbnQoJyVzJyAlIHR4Lm1lc3NhZ2UpCmRpZmYgLS1naXQgYS90dXRvcmlhbC9weS9QeXRob25TZXJ2ZXIucHkgYi90dXRvcmlhbC9weS9QeXRob25TZXJ2ZXIucHkKaW5kZXggNTMzYjBlYS4uZTY0MjFlZiAxMDA3NTUKLS0tIGEvdHV0b3JpYWwvcHkvUHl0aG9uU2VydmVyLnB5CisrKyBiL3R1dG9yaWFsL3B5L1B5dGhvblNlcnZlci5weQpAQCAtMTksMTIgKzE5LDEzIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1pbXBvcnQgc3lzLCBnbG9iCitpbXBvcnQgZ2xvYgoraW1wb3J0IHN5cwogc3lzLnBhdGguYXBwZW5kKCdnZW4tcHknKQotc3lzLnBhdGguaW5zZXJ0KDAsIGdsb2IuZ2xvYignLi4vLi4vbGliL3B5L2J1aWxkL2xpYi4qJylbMF0pCitzeXMucGF0aC5pbnNlcnQoMCwgZ2xvYi5nbG9iKCcuLi8uLi9saWIvcHkvYnVpbGQvbGliKicpWzBdKQogCiBmcm9tIHR1dG9yaWFsIGltcG9ydCBDYWxjdWxhdG9yCi1mcm9tIHR1dG9yaWFsLnR0eXBlcyBpbXBvcnQgKgorZnJvbSB0dXRvcmlhbC50dHlwZXMgaW1wb3J0IEludmFsaWRPcGVyYXRpb24sIE9wZXJhdGlvbgogCiBmcm9tIHNoYXJlZC50dHlwZXMgaW1wb3J0IFNoYXJlZFN0cnVjdAogCkBAIC0zMyw2NSArMzQsNzAgQEAKIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKIGZyb20gdGhyaWZ0LnNlcnZlciBpbXBvcnQgVFNlcnZlcgogCisKIGNsYXNzIENhbGN1bGF0b3JIYW5kbGVyOgotICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgc2VsZi5sb2cgPSB7fQorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5sb2cgPSB7fQogCi0gIGRlZiBwaW5nKHNlbGYpOgotICAgIHByaW50ICdwaW5nKCknCisgICAgZGVmIHBpbmcoc2VsZik6CisgICAgICAgIHByaW50KCdwaW5nKCknKQogCi0gIGRlZiBhZGQoc2VsZiwgbjEsIG4yKToKLSAgICBwcmludCAnYWRkKCVkLCVkKScgJSAobjEsIG4yKQotICAgIHJldHVybiBuMStuMgorICAgIGRlZiBhZGQoc2VsZiwgbjEsIG4yKToKKyAgICAgICAgcHJpbnQoJ2FkZCglZCwlZCknICUgKG4xLCBuMikpCisgICAgICAgIHJldHVybiBuMSArIG4yCiAKLSAgZGVmIGNhbGN1bGF0ZShzZWxmLCBsb2dpZCwgd29yayk6Ci0gICAgcHJpbnQgJ2NhbGN1bGF0ZSglZCwgJXIpJyAlIChsb2dpZCwgd29yaykKKyAgICBkZWYgY2FsY3VsYXRlKHNlbGYsIGxvZ2lkLCB3b3JrKToKKyAgICAgICAgcHJpbnQoJ2NhbGN1bGF0ZSglZCwgJXIpJyAlIChsb2dpZCwgd29yaykpCiAKLSAgICBpZiB3b3JrLm9wID09IE9wZXJhdGlvbi5BREQ6Ci0gICAgICB2YWwgPSB3b3JrLm51bTEgKyB3b3JrLm51bTIKLSAgICBlbGlmIHdvcmsub3AgPT0gT3BlcmF0aW9uLlNVQlRSQUNUOgotICAgICAgdmFsID0gd29yay5udW0xIC0gd29yay5udW0yCi0gICAgZWxpZiB3b3JrLm9wID09IE9wZXJhdGlvbi5NVUxUSVBMWToKLSAgICAgIHZhbCA9IHdvcmsubnVtMSAqIHdvcmsubnVtMgotICAgIGVsaWYgd29yay5vcCA9PSBPcGVyYXRpb24uRElWSURFOgotICAgICAgaWYgd29yay5udW0yID09IDA6Ci0gICAgICAgIHggPSBJbnZhbGlkT3BlcmF0aW9uKCkKLSAgICAgICAgeC53aGF0T3AgPSB3b3JrLm9wCi0gICAgICAgIHgud2h5ID0gJ0Nhbm5vdCBkaXZpZGUgYnkgMCcKLSAgICAgICAgcmFpc2UgeAotICAgICAgdmFsID0gd29yay5udW0xIC8gd29yay5udW0yCi0gICAgZWxzZToKLSAgICAgIHggPSBJbnZhbGlkT3BlcmF0aW9uKCkKLSAgICAgIHgud2hhdE9wID0gd29yay5vcAotICAgICAgeC53aHkgPSAnSW52YWxpZCBvcGVyYXRpb24nCi0gICAgICByYWlzZSB4CisgICAgICAgIGlmIHdvcmsub3AgPT0gT3BlcmF0aW9uLkFERDoKKyAgICAgICAgICAgIHZhbCA9IHdvcmsubnVtMSArIHdvcmsubnVtMgorICAgICAgICBlbGlmIHdvcmsub3AgPT0gT3BlcmF0aW9uLlNVQlRSQUNUOgorICAgICAgICAgICAgdmFsID0gd29yay5udW0xIC0gd29yay5udW0yCisgICAgICAgIGVsaWYgd29yay5vcCA9PSBPcGVyYXRpb24uTVVMVElQTFk6CisgICAgICAgICAgICB2YWwgPSB3b3JrLm51bTEgKiB3b3JrLm51bTIKKyAgICAgICAgZWxpZiB3b3JrLm9wID09IE9wZXJhdGlvbi5ESVZJREU6CisgICAgICAgICAgICBpZiB3b3JrLm51bTIgPT0gMDoKKyAgICAgICAgICAgICAgICB4ID0gSW52YWxpZE9wZXJhdGlvbigpCisgICAgICAgICAgICAgICAgeC53aGF0T3AgPSB3b3JrLm9wCisgICAgICAgICAgICAgICAgeC53aHkgPSAnQ2Fubm90IGRpdmlkZSBieSAwJworICAgICAgICAgICAgICAgIHJhaXNlIHgKKyAgICAgICAgICAgIHZhbCA9IHdvcmsubnVtMSAvIHdvcmsubnVtMgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgeCA9IEludmFsaWRPcGVyYXRpb24oKQorICAgICAgICAgICAgeC53aGF0T3AgPSB3b3JrLm9wCisgICAgICAgICAgICB4LndoeSA9ICdJbnZhbGlkIG9wZXJhdGlvbicKKyAgICAgICAgICAgIHJhaXNlIHgKIAotICAgIGxvZyA9IFNoYXJlZFN0cnVjdCgpCi0gICAgbG9nLmtleSA9IGxvZ2lkCi0gICAgbG9nLnZhbHVlID0gJyVkJyAlICh2YWwpCi0gICAgc2VsZi5sb2dbbG9naWRdID0gbG9nCisgICAgICAgIGxvZyA9IFNoYXJlZFN0cnVjdCgpCisgICAgICAgIGxvZy5rZXkgPSBsb2dpZAorICAgICAgICBsb2cudmFsdWUgPSAnJWQnICUgKHZhbCkKKyAgICAgICAgc2VsZi5sb2dbbG9naWRdID0gbG9nCiAKLSAgICByZXR1cm4gdmFsCisgICAgICAgIHJldHVybiB2YWwKIAotICBkZWYgZ2V0U3RydWN0KHNlbGYsIGtleSk6Ci0gICAgcHJpbnQgJ2dldFN0cnVjdCglZCknICUgKGtleSkKLSAgICByZXR1cm4gc2VsZi5sb2dba2V5XQorICAgIGRlZiBnZXRTdHJ1Y3Qoc2VsZiwga2V5KToKKyAgICAgICAgcHJpbnQoJ2dldFN0cnVjdCglZCknICUgKGtleSkpCisgICAgICAgIHJldHVybiBzZWxmLmxvZ1trZXldCiAKLSAgZGVmIHppcChzZWxmKToKLSAgICBwcmludCAnemlwKCknCisgICAgZGVmIHppcChzZWxmKToKKyAgICAgICAgcHJpbnQoJ3ppcCgpJykKIAotaGFuZGxlciA9IENhbGN1bGF0b3JIYW5kbGVyKCkKLXByb2Nlc3NvciA9IENhbGN1bGF0b3IuUHJvY2Vzc29yKGhhbmRsZXIpCi10cmFuc3BvcnQgPSBUU29ja2V0LlRTZXJ2ZXJTb2NrZXQocG9ydD05MDkwKQotdGZhY3RvcnkgPSBUVHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoKQotcGZhY3RvcnkgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpCiAKLXNlcnZlciA9IFRTZXJ2ZXIuVFNpbXBsZVNlcnZlcihwcm9jZXNzb3IsIHRyYW5zcG9ydCwgdGZhY3RvcnksIHBmYWN0b3J5KQoraWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBoYW5kbGVyID0gQ2FsY3VsYXRvckhhbmRsZXIoKQorICAgIHByb2Nlc3NvciA9IENhbGN1bGF0b3IuUHJvY2Vzc29yKGhhbmRsZXIpCisgICAgdHJhbnNwb3J0ID0gVFNvY2tldC5UU2VydmVyU29ja2V0KGhvc3Q9JzEyNy4wLjAuMScsIHBvcnQ9OTA5MCkKKyAgICB0ZmFjdG9yeSA9IFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSgpCisgICAgcGZhY3RvcnkgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpCiAKLSMgWW91IGNvdWxkIGRvIG9uZSBvZiB0aGVzZSBmb3IgYSBtdWx0aXRocmVhZGVkIHNlcnZlcgotI3NlcnZlciA9IFRTZXJ2ZXIuVFRocmVhZGVkU2VydmVyKHByb2Nlc3NvciwgdHJhbnNwb3J0LCB0ZmFjdG9yeSwgcGZhY3RvcnkpCi0jc2VydmVyID0gVFNlcnZlci5UVGhyZWFkUG9vbFNlcnZlcihwcm9jZXNzb3IsIHRyYW5zcG9ydCwgdGZhY3RvcnksIHBmYWN0b3J5KQorICAgIHNlcnZlciA9IFRTZXJ2ZXIuVFNpbXBsZVNlcnZlcihwcm9jZXNzb3IsIHRyYW5zcG9ydCwgdGZhY3RvcnksIHBmYWN0b3J5KQogCi1wcmludCAnU3RhcnRpbmcgdGhlIHNlcnZlci4uLicKLXNlcnZlci5zZXJ2ZSgpCi1wcmludCAnZG9uZS4nCisgICAgIyBZb3UgY291bGQgZG8gb25lIG9mIHRoZXNlIGZvciBhIG11bHRpdGhyZWFkZWQgc2VydmVyCisgICAgIyBzZXJ2ZXIgPSBUU2VydmVyLlRUaHJlYWRlZFNlcnZlcigKKyAgICAjICAgICBwcm9jZXNzb3IsIHRyYW5zcG9ydCwgdGZhY3RvcnksIHBmYWN0b3J5KQorICAgICMgc2VydmVyID0gVFNlcnZlci5UVGhyZWFkUG9vbFNlcnZlcigKKyAgICAjICAgICBwcm9jZXNzb3IsIHRyYW5zcG9ydCwgdGZhY3RvcnksIHBmYWN0b3J5KQorCisgICAgcHJpbnQoJ1N0YXJ0aW5nIHRoZSBzZXJ2ZXIuLi4nKQorICAgIHNlcnZlci5zZXJ2ZSgpCisgICAgcHJpbnQoJ2RvbmUuJykKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3B5L3NldHVwLmNmZyBiL3R1dG9yaWFsL3B5L3NldHVwLmNmZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTcxMjBhCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvcHkvc2V0dXAuY2ZnCkBAIC0wLDAgKzEsMiBAQAorW2ZsYWtlOF0KK2lnbm9yZSA9IEU0MDIKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3JiL01ha2VmaWxlLmFtIGIvdHV0b3JpYWwvcmIvTWFrZWZpbGUuYW0KaW5kZXggMzY5ZTkwMy4uOTM3MjQxMyAxMDA3NTUKLS0tIGEvdHV0b3JpYWwvcmIvTWFrZWZpbGUuYW0KKysrIGIvdHV0b3JpYWwvcmIvTWFrZWZpbGUuYW0KQEAgLTE3LDggKzE3LDYgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLVRIUklGVCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0Ci0KIGdlbi1weS9jYWxjdWxhdG9yLnJiIGdlbi1weS9zaGFyZWRfc2VydmljZS5yYjogJCh0b3Bfc3JjZGlyKS90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQKIAkkKFRIUklGVCkgLS1nZW4gcmIgLXIgJDwKIApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcnMvQ2FyZ28udG9tbCBiL3R1dG9yaWFsL3JzL0NhcmdvLnRvbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEwYTBkYQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL3JzL0NhcmdvLnRvbWwKQEAgLTAsMCArMSwxNiBAQAorW3BhY2thZ2VdCituYW1lID0gInRocmlmdC10dXRvcmlhbCIKK3ZlcnNpb24gPSAiMC4xLjAiCitsaWNlbnNlID0gIkFwYWNoZS0yLjAiCithdXRob3JzID0gWyJBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4iXQorZXhjbHVkZSA9IFsiTWFrZWZpbGUqIiwgInNoYXJlZC5ycyIsICJ0dXRvcmlhbC5ycyJdCitwdWJsaXNoID0gZmFsc2UKKworW2RlcGVuZGVuY2llc10KK2NsYXAgPSAiPDIuMjguMCIKK29yZGVyZWQtZmxvYXQgPSAiMC4zLjAiCit0cnlfZnJvbSA9ICIwLjIuMCIKKworW2RlcGVuZGVuY2llcy50aHJpZnRdCitwYXRoID0gIi4uLy4uL2xpYi9ycyIKKwpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcnMvTWFrZWZpbGUuYW0gYi90dXRvcmlhbC9ycy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjYzMzFlCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvcnMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw1MiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK1RIUklGVCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0CisKK2dlbi1ycy90dXRvcmlhbC5ycyBnZW4tcnMvc2hhcmVkLnJzOiAkKHRvcF9zcmNkaXIpL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdAorCSQoVEhSSUZUKSAtb3V0IHNyYyAtLWdlbiBycyAtciAkPAorCithbGwtbG9jYWw6IGdlbi1ycy90dXRvcmlhbC5ycworCSQoQ0FSR08pIGJ1aWxkCisJWyAtZCBiaW4gXSB8fCBta2RpciBiaW4KKwljcCB0YXJnZXQvZGVidWcvdHV0b3JpYWxfc2VydmVyIGJpbi90dXRvcmlhbF9zZXJ2ZXIKKwljcCB0YXJnZXQvZGVidWcvdHV0b3JpYWxfY2xpZW50IGJpbi90dXRvcmlhbF9jbGllbnQKKworY2hlY2s6IGFsbAorCit0dXRvcmlhbHNlcnZlcjogYWxsCisJYmluL3R1dG9yaWFsX3NlcnZlcgkKKwordHV0b3JpYWxjbGllbnQ6IGFsbAorCWJpbi90dXRvcmlhbF9jbGllbnQKKworY2xlYW4tbG9jYWw6CisJJChDQVJHTykgY2xlYW4KKwktJChSTSkgQ2FyZ28ubG9jaworCS0kKFJNKSBzcmMvc2hhcmVkLnJzCisJLSQoUk0pIHNyYy90dXRvcmlhbC5ycworCS0kKFJNKSAtciBiaW4KKworRVhUUkFfRElTVCA9IFwKKwlDYXJnby50b21sIFwKKwlzcmMvbGliLnJzIFwKKwlzcmMvYmluL3R1dG9yaWFsX3NlcnZlci5ycyBcCisJc3JjL2Jpbi90dXRvcmlhbF9jbGllbnQucnMgXAorCVJFQURNRS5tZAorCmRpZmYgLS1naXQgYS90dXRvcmlhbC9ycy9SRUFETUUubWQgYi90dXRvcmlhbC9ycy9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg0ZTlmOAotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL3JzL1JFQURNRS5tZApAQCAtMCwwICsxLDMxNyBAQAorIyBSdXN0IExhbmd1YWdlIEJpbmRpbmdzIGZvciBUaHJpZnQKKworIyMgR2V0dGluZyBTdGFydGVkCisKKzEuIEdldCB0aGUgW1RocmlmdCBjb21waWxlcl0oaHR0cHM6Ly90aHJpZnQuYXBhY2hlLm9yZykuCisKKzIuIEFkZCB0aGUgZm9sbG93aW5nIGNyYXRlcyB0byB5b3VyIGBDYXJnby50b21sYC4KKworYGBgdG9tbAordGhyaWZ0ID0gIngueS56IiAjIHgueS56IGlzIHRoZSB2ZXJzaW9uIG9mIHRoZSB0aHJpZnQgY29tcGlsZXIKK29yZGVyZWRfZmxvYXQgPSAiMC4zLjAiCit0cnlfZnJvbSA9ICIwLjIuMCIKK2BgYAorCiszLiBBZGQgdGhlIHNhbWUgY3JhdGVzIHRvIHlvdXIgYGxpYi5yc2Agb3IgYG1haW4ucnNgLgorCitgYGBydXN0CitleHRlcm4gY3JhdGUgb3JkZXJlZF9mbG9hdDsKK2V4dGVybiBjcmF0ZSB0aHJpZnQ7CitleHRlcm4gY3JhdGUgdHJ5X2Zyb207CitgYGAKKworNC4gR2VuZXJhdGUgUnVzdCBzb3VyY2VzIGZvciB5b3VyIElETCAoZm9yIGV4YW1wbGUsIGBUdXRvcmlhbC50aHJpZnRgKS4KKworYGBgc2hlbGwKK3RocmlmdCAtb3V0IG15X3J1c3RfcHJvZ3JhbS9zcmMgLS1nZW4gcnMgLXIgVHV0b3JpYWwudGhyaWZ0CitgYGAKKworNS4gVXNlIHRoZSBnZW5lcmF0ZWQgc291cmNlIGluIHlvdXIgY29kZS4KKworYGBgcnVzdAorLy8gYWRkIGV4dGVybiBjcmF0ZXMgaGVyZSwgb3IgaW4geW91ciBsaWIucnMKK2V4dGVybiBjcmF0ZSBvcmRlcmVkX2Zsb2F0OworZXh0ZXJuIGNyYXRlIHRocmlmdDsKK2V4dGVybiBjcmF0ZSB0cnlfZnJvbTsKKworLy8gZ2VuZXJhdGVkIFJ1c3QgbW9kdWxlCit1c2UgdHV0b3JpYWw7CisKK3VzZSB0aHJpZnQ6OnByb3RvY29sOjp7VENvbXBhY3RJbnB1dFByb3RvY29sLCBUQ29tcGFjdE91dHB1dFByb3RvY29sfTsKK3VzZSB0aHJpZnQ6OnByb3RvY29sOjp7VElucHV0UHJvdG9jb2wsIFRPdXRwdXRQcm90b2NvbH07Cit1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OntURnJhbWVkUmVhZFRyYW5zcG9ydCwgVEZyYW1lZFdyaXRlVHJhbnNwb3J0fTsKK3VzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6e1RJb0NoYW5uZWwsIFRUY3BDaGFubmVsfTsKK3VzZSB0dXRvcmlhbDo6e0NhbGN1bGF0b3JTeW5jQ2xpZW50LCBUQ2FsY3VsYXRvclN5bmNDbGllbnR9OwordXNlIHR1dG9yaWFsOjp7T3BlcmF0aW9uLCBXb3JrfTsKKworZm4gbWFpbigpIHsKKyAgICBtYXRjaCBydW4oKSB7CisgICAgICAgIE9rKCgpKSA9PiBwcmludGxuISgiY2xpZW50IHJhbiBzdWNjZXNzZnVsbHkiKSwKKyAgICAgICAgRXJyKGUpID0+IHsKKyAgICAgICAgICAgIHByaW50bG4hKCJjbGllbnQgZmFpbGVkIHdpdGggezo/fSIsIGUpOworICAgICAgICAgICAgc3RkOjpwcm9jZXNzOjpleGl0KDEpOworICAgICAgICB9CisgICAgfQorfQorCitmbiBydW4oKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geworICAgIC8vCisgICAgLy8gYnVpbGQgY2xpZW50CisgICAgLy8KKworICAgIHByaW50bG4hKCJjb25uZWN0IHRvIHNlcnZlciBvbiAxMjcuMC4wLjE6OTA5MCIpOworICAgIGxldCBtdXQgYyA9IFRUY3BUcmFuc3BvcnQ6Om5ldygpOworICAgIGMub3BlbigiMTI3LjAuMC4xOjkwOTAiKT87CisKKyAgICBsZXQgKGlfY2hhbiwgb19jaGFuKSA9IGMuc3BsaXQoKT87CisgICAgCisgICAgbGV0IGlfcHJvdCA9IFRDb21wYWN0SW5wdXRQcm90b2NvbDo6bmV3KAorICAgICAgICBURnJhbWVkUmVhZFRyYW5zcG9ydDo6bmV3KGlfY2hhbikKKyAgICApOworICAgIGxldCBvX3Byb3QgPSBUQ29tcGFjdE91dHB1dFByb3RvY29sOjpuZXcoCisgICAgICAgIFRGcmFtZWRXcml0ZVRyYW5zcG9ydDo6bmV3KG9fY2hhbikKKyAgICApOworCisgICAgbGV0IGNsaWVudCA9IENhbGN1bGF0b3JTeW5jQ2xpZW50OjpuZXcoaV9wcm90LCBvX3Byb3QpOworCisgICAgLy8KKyAgICAvLyBhbHJpZ2h0ISAtIGxldCdzIG1ha2Ugc29tZSBjYWxscworICAgIC8vCisKKyAgICAvLyB0d28td2F5LCB2b2lkIHJldHVybgorICAgIGNsaWVudC5waW5nKCk/OworCisgICAgLy8gdHdvLXdheSB3aXRoIHNvbWUgcmV0dXJuCisgICAgbGV0IHJlcyA9IGNsaWVudC5jYWxjdWxhdGUoCisgICAgICAgIDcyLAorICAgICAgICBXb3JrOjpuZXcoNywgOCwgT3BlcmF0aW9uOjpNVUxUSVBMWSwgTm9uZSkKKyAgICApPzsKKyAgICBwcmludGxuISgibXVsdGlwbGllZCA3IGFuZCA4LCBnb3Qge30iLCByZXMpOworCisgICAgLy8gdHdvLXdheSBhbmQgcmV0dXJucyBhIFRocmlmdC1kZWZpbmVkIGV4Y2VwdGlvbgorICAgIGxldCByZXMgPSBjbGllbnQuY2FsY3VsYXRlKAorICAgICAgICA3NywKKyAgICAgICAgV29yazo6bmV3KDIsIDAsIE9wZXJhdGlvbjo6RElWSURFLCBOb25lKQorICAgICk7CisgICAgbWF0Y2ggcmVzIHsKKyAgICAgICAgT2sodikgPT4gcGFuaWMhKCJzaG91bGRuJ3QgaGF2ZSBzdWNjZWVkZWQgd2l0aCByZXN1bHQge30iLCB2KSwKKyAgICAgICAgRXJyKGUpID0+IHByaW50bG4hKCJkaXZpZGUgYnkgemVybyBmYWlsZWQgd2l0aCB7Oj99IiwgZSksCisgICAgfQorCisgICAgLy8gb25lLXdheQorICAgIGNsaWVudC56aXAoKT87CisKKyAgICAvLyBkb25lIQorICAgIE9rKCgpKQorfQorYGBgCisKKyMjIENvZGUgR2VuZXJhdGlvbgorCisjIyMgVGhyaWZ0IEZpbGVzIGFuZCBHZW5lcmF0ZWQgTW9kdWxlcworCitUaGUgVGhyaWZ0IGNvZGUgZ2VuZXJhdG9yIHRha2VzIGVhY2ggVGhyaWZ0IGZpbGUgYW5kIGdlbmVyYXRlcyBhIFJ1c3QgbW9kdWxlCit3aXRoIHRoZSBzYW1lIG5hbWUgc25ha2UtY2FzZWQuIEZvciBleGFtcGxlLCBydW5uaW5nIHRoZSBjb21waWxlciBvbgorYFRocmlmdFRlc3QudGhyaWZ0YCBjcmVhdGVzIGB0aHJpZnRfdGVzdC5yc2AuIFRvIHVzZSB0aGVzZSBnZW5lcmF0ZWQgZmlsZXMgYWRkCitgbW9kIC4uLmAgYW5kIGB1c2UgLi4uYCBkZWNsYXJhdGlvbnMgdG8geW91ciBgbGliLnJzYCBvciBgbWFpbi5yc2AgLSBvbmUgZm9yCitlYWNoIGdlbmVyYXRlZCBmaWxlLgorCisjIyMgUmVzdWx0cyBhbmQgRXJyb3JzCisKK1RoZSBUaHJpZnQgcnVudGltZSBsaWJyYXJ5IGRlZmluZXMgYSBgdGhyaWZ0OjpSZXN1bHRgIGFuZCBhIGB0aHJpZnQ6OkVycm9yYCB0eXBlLAorYm90aCBvZiB3aGljaCBhcmUgdXNlZCB0aHJvdWdodCB0aGUgcnVudGltZSBsaWJyYXJ5IGFuZCBpbiBhbGwgZ2VuZXJhdGVkIGNvZGUuCitDb252ZXJzaW9ucyBhcmUgZGVmaW5lZCBmcm9tIGBzdGQ6OmlvOjpFcnJvcmAsIGBzdHJgIGFuZCBgU3RyaW5nYCBpbnRvCitgdGhyaWZ0OjpFcnJvcmAuCisKKyMjIyBUaHJpZnQgVHlwZSBhbmQgdGhlaXIgUnVzdCBFcXVpdmFsZW50cworCitUaHJpZnQgZGVmaW5lcyBhIG51bWJlciBvZiB0eXBlcywgZWFjaCBvZiB3aGljaCBpcyB0cmFuc2xhdGVkIGludG8gaXRzIFJ1c3QKK2VxdWl2YWxlbnQgYnkgdGhlIGNvZGUgZ2VuZXJhdG9yLgorCisqIFByaW1pdGl2ZXMgKGJvb2wsIGk4LCBpMTYsIGkzMiwgaTY0LCBkb3VibGUsIHN0cmluZywgYmluYXJ5KQorKiBUeXBlZGVmcworKiBFbnVtcworKiBDb250YWluZXJzCisqIFN0cnVjdHMKKyogVW5pb25zCisqIEV4Y2VwdGlvbnMKKyogU2VydmljZXMKKyogQ29uc3RhbnRzIChwcmltaXRpdmVzLCBjb250YWluZXJzLCBzdHJ1Y3RzKQorCitJbiBhZGRpdGlvbiwgdW5sZXNzIG90aGVyd2lzZSBub3RlZCwgdGhyaWZ0IGluY2x1ZGVzIGFyZSB0cmFuc2xhdGVkIGludG8KK2B1c2UgLi4uYCBzdGF0ZW1lbnRzIGluIHRoZSBnZW5lcmF0ZWQgY29kZSwgYW5kIGFsbCBkZWNsYXJhdGlvbnMsIHBhcmFtZXRlcnMsCit0cmFpdHMgYW5kIHR5cGVzIGluIHRoZSBnZW5lcmF0ZWQgY29kZSBhcmUgbmFtZXNwYWNlZCBhcHByb3ByaWF0ZWx5LgorCitUaGUgZm9sbG93aW5nIHN1YnNlY3Rpb25zIGNvdmVyIGVhY2ggdHlwZSBhbmQgdGhlaXIgZ2VuZXJhdGVkIFJ1c3QgZXF1aXZhbGVudC4KKworIyMjIFByaW1pdGl2ZXMKKworVGhyaWZ0IHByaW1pdGl2ZXMgaGF2ZSBzdHJhaWdodGZvcndhcmQgUnVzdCBlcXVpdmFsZW50cy4KKworKiBib29sOiBgYm9vbGAKKyogaTg6IGBpOGAKKyogaTE2OiBgaTE2YAorKiBpMzI6IGBpMzJgCisqIGk2NDogYGk2NGAKKyogZG91YmxlOiBgT3JkZXJlZEZsb2F0PGY2ND5gCisqIHN0cmluZzogYFN0cmluZ2AKKyogYmluYXJ5OiBgVmVjPHU4PmAKKworIyMjIFR5cGVkZWZzCisKK0EgdHlwZWRlZiBpcyB0cmFuc2xhdGVkIHRvIGEgYHB1YiB0eXBlYCBkZWNsYXJhdGlvbi4KKworYGBgdGhyaWZ0Cit0eXBlZGVmIGk2NCBVc2VySWQKKwordHlwZWRlZiBtYXA8c3RyaW5nLCBVc2VySWQ+IE1hcFR5cGUKK2BgYAorYGBgcnVzdAorcHViIHR5cGUgVXNlcklkID0gaTY0OworCitwdWIgdHlwZSBNYXBUeXBlID0gQlRyZWVNYXA8U3RyaW5nLCBCb25rPjsKK2BgYAorCisjIyMgRW51bXMKKworQSBUaHJpZnQgZW51bSBpcyByZXByZXNlbnRlZCBhcyBhIFJ1c3QgZW51bSwgYW5kIGVhY2ggdmFyaWFudCBpcyB0cmFuc2NyaWJlZCAxOjEuCisKK2BgYHRocmlmdAorZW51bSBOdW1iZXJ6Cit7CisgICAgT05FID0gMSwKKyAgICBUV08sCisgICAgVEhSRUUsCisgICAgRklWRSA9IDUsCisgICAgU0lYLAorICAgIEVJR0hUID0gOAorfQorYGBgCisKK2BgYHJ1c3QKKyNbZGVyaXZlKENvcHksIENsb25lLCBEZWJ1ZywgRXEsIE9yZCwgUGFydGlhbEVxLCBQYXJ0aWFsT3JkKV0KK3B1YiBlbnVtIE51bWJlcnogeworICAgIE9ORSA9IDEsCisgICAgVFdPID0gMiwKKyAgICBUSFJFRSA9IDMsCisgICAgRklWRSA9IDUsCisgICAgU0lYID0gNiwKKyAgICBFSUdIVCA9IDgsCit9CisKK2ltcGwgVHJ5RnJvbTxpMzI+IGZvciBOdW1iZXJ6IHsKKyAgICAvLyAuLi4KK30KKworYGBgCisKKyMjIyBDb250YWluZXJzCisKK1RocmlmdCBoYXMgdGhyZWUgY29udGFpbmVyIHR5cGVzOiBsaXN0LCBzZXQgYW5kIG1hcC4gVGhleSBhcmUgdHJhbnNsYXRlZCBpbnRvCitSdXN0IGBWZWNgLCBgQlRyZWVTZXRgIGFuZCBgQlRyZWVNYXBgIHJlc3BlY3RpdmVseS4gQW55IFRocmlmdCB0eXBlICh0aGlzCitpbmNsdWRlcyBzdHJ1Y3RzLCBlbnVtcyBhbmQgdHlwZWRlZnMpIGNhbiBiZSBhIGxpc3Qvc2V0IGVsZW1lbnQgb3IgYSBtYXAKK2tleS92YWx1ZS4KKworIyMjIyBMaXN0CisKK2BgYHRocmlmdAorbGlzdCA8aTMyPiBudW1iZXJzCitgYGAKKworYGBgcnVzdAorbnVtYmVyczogVmVjPGkzMj4KK2BgYAorCisjIyMjIFNldAorCitgYGB0aHJpZnQKK3NldCA8aTMyPiBudW1iZXJzCitgYGAKKworYGBgcnVzdAorbnVtYmVyczogQlRyZWVTZXQ8aTMyPgorYGBgCisKKyMjIyMgTWFwCisKK2BgYHRocmlmdAorbWFwIDxzdHJpbmcsIGkzMj4gbnVtYmVycworYGBgCisKK2BgYHJ1c3QKK251bWJlcnM6IEJUcmVlTWFwPFN0cmluZywgaTMyPgorYGBgCisKKyMjIyBTdHJ1Y3RzCisKK0EgVGhyaWZ0IHN0cnVjdCBpcyByZXByZXNlbnRlZCBhcyBhIFJ1c3Qgc3RydWN0LCBhbmQgZWFjaCBmaWVsZCB0cmFuc2NyaWJlZCAxOjEuCisKK2BgYHRocmlmdAorc3RydWN0IENyYXp5TmVzdGluZyB7CisgICAgMTogc3RyaW5nIHN0cmluZ19maWVsZCwKKyAgICAyOiBvcHRpb25hbCBzZXQ8SW5zYW5pdHk+IHNldF9maWVsZCwKKyAgICAzOiByZXF1aXJlZCBsaXN0PAorICAgICAgICAgbWFwPHNldDxpMzI+LCBtYXA8aTMyLHNldDxsaXN0PG1hcDxJbnNhbml0eSxzdHJpbmc+Pj4+PgorICAgICAgID4KKyAgICA0OiBiaW5hcnkgYmluYXJ5X2ZpZWxkCit9CitgYGAKK2BgYHJ1c3QKKyNbZGVyaXZlKENsb25lLCBEZWJ1ZywgRXEsIE9yZCwgUGFydGlhbEVxLCBQYXJ0aWFsT3JkKV0KK3B1YiBzdHJ1Y3QgQ3JhenlOZXN0aW5nIHsKKyAgICBwdWIgc3RyaW5nX2ZpZWxkOiBPcHRpb248U3RyaW5nPiwKKyAgICBwdWIgc2V0X2ZpZWxkOiBPcHRpb248QlRyZWVTZXQ8SW5zYW5pdHk+PiwKKyAgICBwdWIgbGlzdF9maWVsZDogVmVjPAorICAgICAgICBCVHJlZU1hcDwKKyAgICAgICAgICAgIEJUcmVlU2V0PGkzMj4sCisgICAgICAgICAgICBCVHJlZU1hcDxpMzIsIEJUcmVlU2V0PFZlYzxCVHJlZU1hcDxJbnNhbml0eSwgU3RyaW5nPj4+PgorICAgICAgICA+CisgICAgPiwKKyAgICBwdWIgYmluYXJ5X2ZpZWxkOiBPcHRpb248VmVjPHU4Pj4sCit9CisKK2ltcGwgQ3JhenlOZXN0aW5nIHsKKyAgICBwdWIgZm4gcmVhZF9mcm9tX2luX3Byb3RvY29sKGlfcHJvdDogJm11dCBUSW5wdXRQcm90b2NvbCkKKyAgICAtPgorICAgIHRocmlmdDo6UmVzdWx0PENyYXp5TmVzdGluZz4geworICAgICAgICAvLyAuLi4KKyAgICB9CisgICAgcHViIGZuIHdyaXRlX3RvX291dF9wcm90b2NvbCgmc2VsZiwgb19wcm90OiAmbXV0IFRPdXRwdXRQcm90b2NvbCkKKyAgICAtPgorICAgIHRocmlmdDo6UmVzdWx0PCgpPiB7CisgICAgICAgIC8vIC4uLgorICAgIH0KK30KKworYGBgCisjIyMjIyBPcHRpb25hbGl0eQorCitUaHJpZnQgaGFzIDMgIm9wdGlvbmFsaXR5IiB0eXBlczoKKworMS4gUmVxdWlyZWQKKzIuIE9wdGlvbmFsCiszLiBEZWZhdWx0CisKK1RoZSBSdXN0IGNvZGUgZ2VuZXJhdG9yIGVuY29kZXMgKlJlcXVpcmVkKiBmaWVsZHMgYXMgdGhlIGJhcmUgdHlwZSBpdHNlbGYsIHdoaWxlCisqT3B0aW9uYWwqIGFuZCAqRGVmYXVsdCogZmllbGRzIGFyZSBlbmNvZGVkIGFzIGBPcHRpb248VHlwZU5hbWU+YC4KKworYGBgdGhyaWZ0CitzdHJ1Y3QgRm9vIHsKKyAgICAxOiByZXF1aXJlZCBzdHJpbmcgYmFyICAvLyAxLiByZXF1aXJlZAorICAgIDI6IG9wdGlvbmFsIHN0cmluZyBiYXogIC8vIDIuIG9wdGlvbmFsCisgICAgMzogc3RyaW5nIHF1eCAgICAgICAgICAgLy8gMy4gZGVmYXVsdAorfQorYGBgCisKK2BgYHJ1c3QKK3B1YiBzdHJ1Y3QgRm9vIHsKKyAgICBiYXI6IFN0cmluZywgICAgICAgICAgICAvLyAxLiByZXF1aXJlZAorICAgIGJhejogT3B0aW9uPFN0cmluZz4sICAgIC8vIDIuIG9wdGlvbmFsCisgICAgcXV4OiBPcHRpb248U3RyaW5nPiwgICAgLy8gMy4gZGVmYXVsdAorfQorYGBgCisKKyMjIEtub3duIElzc3VlcworCisqIFN0cnVjdCBjb25zdGFudHMgYXJlIG5vdCBzdXBwb3J0ZWQKKyogTWFwLCBsaXN0IGFuZCBzZXQgY29uc3RhbnRzIHJlcXVpcmUgYSBjb25zdCBob2xkZXIgc3RydWN0CmRpZmYgLS1naXQgYS90dXRvcmlhbC9ycy9zcmMvYmluL3R1dG9yaWFsX2NsaWVudC5ycyBiL3R1dG9yaWFsL3JzL3NyYy9iaW4vdHV0b3JpYWxfY2xpZW50LnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MGZhZmMKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9ycy9zcmMvYmluL3R1dG9yaWFsX2NsaWVudC5ycwpAQCAtMCwwICsxLDEzMCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjW21hY3JvX3VzZV0KK2V4dGVybiBjcmF0ZSBjbGFwOworCitleHRlcm4gY3JhdGUgdGhyaWZ0OworZXh0ZXJuIGNyYXRlIHRocmlmdF90dXRvcmlhbDsKKwordXNlIHRocmlmdDo6cHJvdG9jb2w6OntUQ29tcGFjdElucHV0UHJvdG9jb2wsIFRDb21wYWN0T3V0cHV0UHJvdG9jb2x9OwordXNlIHRocmlmdDo6dHJhbnNwb3J0Ojp7CisgICAgUmVhZEhhbGYsIFRGcmFtZWRSZWFkVHJhbnNwb3J0LCBURnJhbWVkV3JpdGVUcmFuc3BvcnQsIFRJb0NoYW5uZWwsIFRUY3BDaGFubmVsLCBXcml0ZUhhbGYsCit9OworCit1c2UgdGhyaWZ0X3R1dG9yaWFsOjpzaGFyZWQ6OlRTaGFyZWRTZXJ2aWNlU3luY0NsaWVudDsKK3VzZSB0aHJpZnRfdHV0b3JpYWw6OnR1dG9yaWFsOjp7Q2FsY3VsYXRvclN5bmNDbGllbnQsIE9wZXJhdGlvbiwgVENhbGN1bGF0b3JTeW5jQ2xpZW50LCBXb3JrfTsKKworZm4gbWFpbigpIHsKKyAgICBtYXRjaCBydW4oKSB7CisgICAgICAgIE9rKCgpKSA9PiBwcmludGxuISgidHV0b3JpYWwgY2xpZW50IHJhbiBzdWNjZXNzZnVsbHkiKSwKKyAgICAgICAgRXJyKGUpID0+IHsKKyAgICAgICAgICAgIHByaW50bG4hKCJ0dXRvcmlhbCBjbGllbnQgZmFpbGVkIHdpdGggZXJyb3Igezo/fSIsIGUpOworICAgICAgICAgICAgc3RkOjpwcm9jZXNzOjpleGl0KDEpOworICAgICAgICB9CisgICAgfQorfQorCitmbiBydW4oKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geworICAgIGxldCBvcHRpb25zID0gY2xhcF9hcHAhKHJ1c3RfdHV0b3JpYWxfY2xpZW50ID0+CisgICAgICAgICh2ZXJzaW9uOiAiMC4xLjAiKQorICAgICAgICAoYXV0aG9yOiAiQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+IikKKyAgICAgICAgKGFib3V0OiAiVGhyaWZ0IFJ1c3QgdHV0b3JpYWwgY2xpZW50IikKKyAgICAgICAgKEBhcmcgaG9zdDogLS1ob3N0ICt0YWtlc192YWx1ZSAiaG9zdCBvbiB3aGljaCB0aGUgdHV0b3JpYWwgc2VydmVyIGxpc3RlbnMiKQorICAgICAgICAoQGFyZyBwb3J0OiAtLXBvcnQgK3Rha2VzX3ZhbHVlICJwb3J0IG9uIHdoaWNoIHRoZSB0dXRvcmlhbCBzZXJ2ZXIgbGlzdGVucyIpCisgICAgKTsKKyAgICBsZXQgbWF0Y2hlcyA9IG9wdGlvbnMuZ2V0X21hdGNoZXMoKTsKKworICAgIC8vIGdldCBhbnkgcGFzc2VkLWluIGFyZ3Mgb3IgdGhlIGRlZmF1bHRzCisgICAgbGV0IGhvc3QgPSBtYXRjaGVzLnZhbHVlX29mKCJob3N0IikudW53cmFwX29yKCIxMjcuMC4wLjEiKTsKKyAgICBsZXQgcG9ydCA9IHZhbHVlX3QhKG1hdGNoZXMsICJwb3J0IiwgdTE2KS51bndyYXBfb3IoOTA5MCk7CisKKyAgICAvLyBidWlsZCBvdXIgY2xpZW50IGFuZCBjb25uZWN0IHRvIHRoZSBob3N0OnBvcnQKKyAgICBsZXQgbXV0IGNsaWVudCA9IG5ld19jbGllbnQoaG9zdCwgcG9ydCk/OworCisgICAgLy8gYWxyaWdodCEKKyAgICAvLyBsZXQncyBzdGFydCBtYWtpbmcgc29tZSBjYWxscworCisgICAgLy8gbGV0J3Mgc3RhcnQgd2l0aCBhIHBpbmc7IHRoZSBzZXJ2ZXIgc2hvdWxkIHJlc3BvbmQKKyAgICBwcmludGxuISgicGluZyEiKTsKKyAgICBjbGllbnQucGluZygpPzsKKworICAgIC8vIHNpbXBsZSBhZGQKKyAgICBwcmludGxuISgiYWRkIik7CisgICAgbGV0IHJlcyA9IGNsaWVudC5hZGQoMSwgMik/OworICAgIHByaW50bG4hKCJhZGRlZCAxLCAyIGFuZCBnb3Qge30iLCByZXMpOworCisgICAgbGV0IGxvZ2lkID0gMzI7CisKKyAgICAvLyBsZXQncyBkby4uLmEgbXVsdGlwbHkhCisgICAgbGV0IHJlcyA9IGNsaWVudC5jYWxjdWxhdGUobG9naWQsIFdvcms6Om5ldyg3LCA4LCBPcGVyYXRpb246Ok11bHRpcGx5LCBOb25lKSk/OworICAgIHByaW50bG4hKCJtdWx0aXBsaWVkIDcgYW5kIDggYW5kIGdvdCB7fSIsIHJlcyk7CisKKyAgICAvLyBsZXQncyBnZXQgdGhlIGxvZyBmb3IgaXQKKyAgICBsZXQgcmVzID0gY2xpZW50LmdldF9zdHJ1Y3QoMzIpPzsKKyAgICBwcmludGxuISgiZ290IGxvZyB7Oj99IGZvciBvcGVyYXRpb24ge30iLCByZXMsIGxvZ2lkKTsKKworICAgIC8vIG9rIC0gbGV0J3MgYmUgYmFkIDooCisgICAgLy8gZG8gYSBkaXZpZGUgYnkgMAorICAgIC8vIGxvZ2lkIGRvZXNuJ3QgbWF0dGVyOyB3b24ndCBiZSByZWNvcmRlZAorICAgIGxldCByZXMgPSBjbGllbnQuY2FsY3VsYXRlKDc3LCBXb3JrOjpuZXcoMiwgMCwgT3BlcmF0aW9uOjpEaXZpZGUsICJ3ZSBiYWQiLnRvX293bmVkKCkpKTsKKworICAgIC8vIHdlIHNob3VsZCBoYXZlIGdvdHRlbiBhbiBleGNlcHRpb24gYmFjaworICAgIG1hdGNoIHJlcyB7CisgICAgICAgIE9rKHYpID0+IHBhbmljISgic2hvdWxkIG5vdCBoYXZlIHN1Y2NlZWRlZCB3aXRoIHJlc3VsdCB7fSIsIHYpLAorICAgICAgICBFcnIoZSkgPT4gcHJpbnRsbiEoImRpdmlkZSBieSB6ZXJvIGZhaWxlZCB3aXRoIGVycm9yIHs6P30iLCBlKSwKKyAgICB9CisKKyAgICAvLyBsZXQncyBkbyBhIG9uZS13YXkgY2FsbAorICAgIHByaW50bG4hKCJ6aXAiKTsKKyAgICBjbGllbnQuemlwKCk/OworCisgICAgLy8gYW5kIHRoZW4gY2xvc2Ugb3V0IHdpdGggYSBmaW5hbCBwaW5nCisgICAgcHJpbnRsbiEoInBpbmchIik7CisgICAgY2xpZW50LnBpbmcoKT87CisKKyAgICBPaygoKSkKK30KKwordHlwZSBDbGllbnRJbnB1dFByb3RvY29sID0gVENvbXBhY3RJbnB1dFByb3RvY29sPFRGcmFtZWRSZWFkVHJhbnNwb3J0PFJlYWRIYWxmPFRUY3BDaGFubmVsPj4+OwordHlwZSBDbGllbnRPdXRwdXRQcm90b2NvbCA9IFRDb21wYWN0T3V0cHV0UHJvdG9jb2w8VEZyYW1lZFdyaXRlVHJhbnNwb3J0PFdyaXRlSGFsZjxUVGNwQ2hhbm5lbD4+PjsKKworZm4gbmV3X2NsaWVudCgKKyAgICBob3N0OiAmc3RyLAorICAgIHBvcnQ6IHUxNiwKKykgLT4gdGhyaWZ0OjpSZXN1bHQ8Q2FsY3VsYXRvclN5bmNDbGllbnQ8Q2xpZW50SW5wdXRQcm90b2NvbCwgQ2xpZW50T3V0cHV0UHJvdG9jb2w+PiB7CisgICAgbGV0IG11dCBjID0gVFRjcENoYW5uZWw6Om5ldygpOworCisgICAgLy8gb3BlbiB0aGUgdW5kZXJseWluZyBUQ1Agc3RyZWFtCisgICAgcHJpbnRsbiEoImNvbm5lY3RpbmcgdG8gdHV0b3JpYWwgc2VydmVyIG9uIHt9Ont9IiwgaG9zdCwgcG9ydCk7CisgICAgYy5vcGVuKCZmb3JtYXQhKCJ7fTp7fSIsIGhvc3QsIHBvcnQpKT87CisKKyAgICAvLyBjbG9uZSB0aGUgVENQIGNoYW5uZWwgaW50byB0d28gaGFsdmVzLCBvbmUgd2hpY2gKKyAgICAvLyB3ZSdsbCB1c2UgZm9yIHJlYWRpbmcsIHRoZSBvdGhlciBmb3Igd3JpdGluZworICAgIGxldCAoaV9jaGFuLCBvX2NoYW4pID0gYy5zcGxpdCgpPzsKKworICAgIC8vIHdyYXAgdGhlIHJhdyBzb2NrZXRzIChzbG93KSB3aXRoIGEgYnVmZmVyZWQgdHJhbnNwb3J0IG9mIHNvbWUga2luZAorICAgIGxldCBpX3RyYW4gPSBURnJhbWVkUmVhZFRyYW5zcG9ydDo6bmV3KGlfY2hhbik7CisgICAgbGV0IG9fdHJhbiA9IFRGcmFtZWRXcml0ZVRyYW5zcG9ydDo6bmV3KG9fY2hhbik7CisKKyAgICAvLyBub3cgY3JlYXRlIHRoZSBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbnMKKyAgICBsZXQgaV9wcm90ID0gVENvbXBhY3RJbnB1dFByb3RvY29sOjpuZXcoaV90cmFuKTsKKyAgICBsZXQgb19wcm90ID0gVENvbXBhY3RPdXRwdXRQcm90b2NvbDo6bmV3KG9fdHJhbik7CisKKyAgICAvLyB3ZSdyZSBkb25lIQorICAgIE9rKENhbGN1bGF0b3JTeW5jQ2xpZW50OjpuZXcoaV9wcm90LCBvX3Byb3QpKQorfQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcnMvc3JjL2Jpbi90dXRvcmlhbF9zZXJ2ZXIucnMgYi90dXRvcmlhbC9ycy9zcmMvYmluL3R1dG9yaWFsX3NlcnZlci5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWIxYTJiCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvcnMvc3JjL2Jpbi90dXRvcmlhbF9zZXJ2ZXIucnMKQEAgLTAsMCArMSwxNzkgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworI1ttYWNyb191c2VdCitleHRlcm4gY3JhdGUgY2xhcDsKKworZXh0ZXJuIGNyYXRlIHRocmlmdDsKK2V4dGVybiBjcmF0ZSB0aHJpZnRfdHV0b3JpYWw7CisKK3VzZSBzdGQ6OmNvbGxlY3Rpb25zOjpIYXNoTWFwOwordXNlIHN0ZDo6Y29udmVydDo6e0Zyb20sIEludG99OwordXNlIHN0ZDo6ZGVmYXVsdDo6RGVmYXVsdDsKK3VzZSBzdGQ6OnN5bmM6Ok11dGV4OworCit1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RDb21wYWN0SW5wdXRQcm90b2NvbEZhY3RvcnksIFRDb21wYWN0T3V0cHV0UHJvdG9jb2xGYWN0b3J5fTsKK3VzZSB0aHJpZnQ6OnNlcnZlcjo6VFNlcnZlcjsKKwordXNlIHRocmlmdDo6dHJhbnNwb3J0Ojp7VEZyYW1lZFJlYWRUcmFuc3BvcnRGYWN0b3J5LCBURnJhbWVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5fTsKK3VzZSB0aHJpZnRfdHV0b3JpYWw6OnNoYXJlZDo6e1NoYXJlZFNlcnZpY2VTeW5jSGFuZGxlciwgU2hhcmVkU3RydWN0fTsKK3VzZSB0aHJpZnRfdHV0b3JpYWw6OnR1dG9yaWFsOjp7Q2FsY3VsYXRvclN5bmNIYW5kbGVyLCBDYWxjdWxhdG9yU3luY1Byb2Nlc3Nvcn07Cit1c2UgdGhyaWZ0X3R1dG9yaWFsOjp0dXRvcmlhbDo6e0ludmFsaWRPcGVyYXRpb24sIE9wZXJhdGlvbiwgV29ya307CisKK2ZuIG1haW4oKSB7CisgICAgbWF0Y2ggcnVuKCkgeworICAgICAgICBPaygoKSkgPT4gcHJpbnRsbiEoInR1dG9yaWFsIHNlcnZlciByYW4gc3VjY2Vzc2Z1bGx5IiksCisgICAgICAgIEVycihlKSA9PiB7CisgICAgICAgICAgICBwcmludGxuISgidHV0b3JpYWwgc2VydmVyIGZhaWxlZCB3aXRoIGVycm9yIHs6P30iLCBlKTsKKyAgICAgICAgICAgIHN0ZDo6cHJvY2Vzczo6ZXhpdCgxKTsKKyAgICAgICAgfQorICAgIH0KK30KKworZm4gcnVuKCkgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsKKyAgICBsZXQgb3B0aW9ucyA9IGNsYXBfYXBwIShydXN0X3R1dG9yaWFsX3NlcnZlciA9PgorICAgICAgICAodmVyc2lvbjogIjAuMS4wIikKKyAgICAgICAgKGF1dGhvcjogIkFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPiIpCisgICAgICAgIChhYm91dDogIlRocmlmdCBSdXN0IHR1dG9yaWFsIHNlcnZlciIpCisgICAgICAgIChAYXJnIHBvcnQ6IC0tcG9ydCArdGFrZXNfdmFsdWUgInBvcnQgb24gd2hpY2ggdGhlIHR1dG9yaWFsIHNlcnZlciBsaXN0ZW5zIikKKyAgICApOworICAgIGxldCBtYXRjaGVzID0gb3B0aW9ucy5nZXRfbWF0Y2hlcygpOworCisgICAgbGV0IHBvcnQgPSB2YWx1ZV90IShtYXRjaGVzLCAicG9ydCIsIHUxNikudW53cmFwX29yKDkwOTApOworICAgIGxldCBsaXN0ZW5fYWRkcmVzcyA9IGZvcm1hdCEoIjEyNy4wLjAuMTp7fSIsIHBvcnQpOworCisgICAgcHJpbnRsbiEoImJpbmRpbmcgdG8ge30iLCBsaXN0ZW5fYWRkcmVzcyk7CisKKyAgICBsZXQgaV90cmFuX2ZhY3QgPSBURnJhbWVkUmVhZFRyYW5zcG9ydEZhY3Rvcnk6Om5ldygpOworICAgIGxldCBpX3Byb3RfZmFjdCA9IFRDb21wYWN0SW5wdXRQcm90b2NvbEZhY3Rvcnk6Om5ldygpOworCisgICAgbGV0IG9fdHJhbl9mYWN0ID0gVEZyYW1lZFdyaXRlVHJhbnNwb3J0RmFjdG9yeTo6bmV3KCk7CisgICAgbGV0IG9fcHJvdF9mYWN0ID0gVENvbXBhY3RPdXRwdXRQcm90b2NvbEZhY3Rvcnk6Om5ldygpOworCisgICAgLy8gZGVtdXggaW5jb21pbmcgbWVzc2FnZXMKKyAgICBsZXQgcHJvY2Vzc29yID0gQ2FsY3VsYXRvclN5bmNQcm9jZXNzb3I6Om5ldyhDYWxjdWxhdG9yU2VydmVyIHsKKyAgICAgICAgLi5EZWZhdWx0OjpkZWZhdWx0KCkKKyAgICB9KTsKKworICAgIC8vIGNyZWF0ZSB0aGUgc2VydmVyIGFuZCBzdGFydCBsaXN0ZW5pbmcKKyAgICBsZXQgbXV0IHNlcnZlciA9IFRTZXJ2ZXI6Om5ldygKKyAgICAgICAgaV90cmFuX2ZhY3QsCisgICAgICAgIGlfcHJvdF9mYWN0LAorICAgICAgICBvX3RyYW5fZmFjdCwKKyAgICAgICAgb19wcm90X2ZhY3QsCisgICAgICAgIHByb2Nlc3NvciwKKyAgICAgICAgMTAsCisgICAgKTsKKworICAgIHNlcnZlci5saXN0ZW4oJmxpc3Rlbl9hZGRyZXNzKQorfQorCisvLy8gSGFuZGxlcyBpbmNvbWluZyBDYWxjdWxhdG9yIHNlcnZpY2UgY2FsbHMuCitzdHJ1Y3QgQ2FsY3VsYXRvclNlcnZlciB7CisgICAgbG9nOiBNdXRleDxIYXNoTWFwPGkzMiwgU2hhcmVkU3RydWN0Pj4sCit9CisKK2ltcGwgRGVmYXVsdCBmb3IgQ2FsY3VsYXRvclNlcnZlciB7CisgICAgZm4gZGVmYXVsdCgpIC0+IENhbGN1bGF0b3JTZXJ2ZXIgeworICAgICAgICBDYWxjdWxhdG9yU2VydmVyIHsKKyAgICAgICAgICAgIGxvZzogTXV0ZXg6Om5ldyhIYXNoTWFwOjpuZXcoKSksCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIHNpbmNlIENhbGN1bGF0b3IgZXh0ZW5kcyBTaGFyZWRTZXJ2aWNlIHdlIGhhdmUgdG8gaW1wbGVtZW50IHRoZQorLy8gaGFuZGxlciBmb3IgYm90aCB0cmFpdHMuCisvLworCisvLyBTaGFyZWRTZXJ2aWNlIGhhbmRsZXIKK2ltcGwgU2hhcmVkU2VydmljZVN5bmNIYW5kbGVyIGZvciBDYWxjdWxhdG9yU2VydmVyIHsKKyAgICBmbiBoYW5kbGVfZ2V0X3N0cnVjdCgmc2VsZiwga2V5OiBpMzIpIC0+IHRocmlmdDo6UmVzdWx0PFNoYXJlZFN0cnVjdD4geworICAgICAgICBsZXQgbG9nID0gc2VsZi5sb2cubG9jaygpLnVud3JhcCgpOworICAgICAgICBsb2cuZ2V0KCZrZXkpCisgICAgICAgICAgICAuY2xvbmVkKCkKKyAgICAgICAgICAgIC5va19vcl9lbHNlKHx8IGZvcm1hdCEoImNvdWxkIG5vdCBmaW5kIGxvZyBmb3Iga2V5IHt9Iiwga2V5KS5pbnRvKCkpCisgICAgfQorfQorCisvLyBDYWxjdWxhdG9yIGhhbmRsZXIKK2ltcGwgQ2FsY3VsYXRvclN5bmNIYW5kbGVyIGZvciBDYWxjdWxhdG9yU2VydmVyIHsKKyAgICBmbiBoYW5kbGVfcGluZygmc2VsZikgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgcHJpbnRsbiEoInBvbmchIik7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIGhhbmRsZV9hZGQoJnNlbGYsIG51bTE6IGkzMiwgbnVtMjogaTMyKSAtPiB0aHJpZnQ6OlJlc3VsdDxpMzI+IHsKKyAgICAgICAgcHJpbnRsbiEoImhhbmRsaW5nIGFkZDogbjE6e30gbjI6e30iLCBudW0xLCBudW0yKTsKKyAgICAgICAgT2sobnVtMSArIG51bTIpCisgICAgfQorCisgICAgZm4gaGFuZGxlX2NhbGN1bGF0ZSgmc2VsZiwgbG9naWQ6IGkzMiwgdzogV29yaykgLT4gdGhyaWZ0OjpSZXN1bHQ8aTMyPiB7CisgICAgICAgIHByaW50bG4hKCJoYW5kbGluZyBjYWxjdWxhdGU6IGw6e30sIHc6ezo/fSIsIGxvZ2lkLCB3KTsKKworICAgICAgICBsZXQgcmVzID0gaWYgbGV0IFNvbWUocmVmIG9wKSA9IHcub3AgeworICAgICAgICAgICAgaWYgdy5udW0xLmlzX25vbmUoKSB8fCB3Lm51bTIuaXNfbm9uZSgpIHsKKyAgICAgICAgICAgICAgICBFcnIoSW52YWxpZE9wZXJhdGlvbiB7CisgICAgICAgICAgICAgICAgICAgIHdoYXRfb3A6IFNvbWUoKm9wIGFzIGkzMiksCisgICAgICAgICAgICAgICAgICAgIHdoeTogU29tZSgibm8gb3BlcmFuZHMgc3BlY2lmaWVkIi50b19vd25lZCgpKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBzbyB0aGF0IEkgZG9uJ3QgaGF2ZSB0byBjYWxsIHVud3JhcCgpIG11bHRpcGxlIHRpbWVzIGJlbG93CisgICAgICAgICAgICAgICAgbGV0IG51bTEgPSB3Lm51bTEuYXNfcmVmKCkuZXhwZWN0KCJvcGVyYW5kcyBjaGVja2VkIik7CisgICAgICAgICAgICAgICAgbGV0IG51bTIgPSB3Lm51bTIuYXNfcmVmKCkuZXhwZWN0KCJvcGVyYW5kcyBjaGVja2VkIik7CisKKyAgICAgICAgICAgICAgICBtYXRjaCAqb3AgeworICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb246OkFkZCA9PiBPayhudW0xICsgbnVtMiksCisgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvbjo6U3VidHJhY3QgPT4gT2sobnVtMSAtIG51bTIpLAorICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb246Ok11bHRpcGx5ID0+IE9rKG51bTEgKiBudW0yKSwKKyAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uOjpEaXZpZGUgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKm51bTIgPT0gMCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyKEludmFsaWRPcGVyYXRpb24geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGF0X29wOiBTb21lKCpvcCBhcyBpMzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aHk6IFNvbWUoImRpdmlkZSBieSAwIi50b19vd25lZCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPayhudW0xIC8gbnVtMikKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEVycihJbnZhbGlkT3BlcmF0aW9uOjpuZXcoCisgICAgICAgICAgICAgICAgTm9uZSwKKyAgICAgICAgICAgICAgICAibm8gb3BlcmF0aW9uIHNwZWNpZmllZCIudG9fb3duZWQoKSwKKyAgICAgICAgICAgICkpCisgICAgICAgIH07CisKKyAgICAgICAgLy8gaWYgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCBsb2cgaXQKKyAgICAgICAgaWYgbGV0IE9rKHJlZiB2KSA9IHJlcyB7CisgICAgICAgICAgICBsZXQgbXV0IGxvZyA9IHNlbGYubG9nLmxvY2soKS51bndyYXAoKTsKKyAgICAgICAgICAgIGxvZy5pbnNlcnQobG9naWQsIFNoYXJlZFN0cnVjdDo6bmV3KGxvZ2lkLCBmb3JtYXQhKCJ7fSIsIHYpKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyB0aGUgdHJ5ISBtYWNybyBhdXRvbWF0aWNhbGx5IG1hcHMgZXJyb3JzCisgICAgICAgIC8vIGJ1dCwgc2luY2Ugd2UgYXJlbid0IHVzaW5nIHRoYXQgaGVyZSB3ZSBoYXZlIHRvIG1hcCBlcnJvcnMgbWFudWFsbHkKKyAgICAgICAgLy8KKyAgICAgICAgLy8gZXhjZXB0aW9uIHN0cnVjdHMgZGVmaW5lZCBpbiB0aGUgSURMIGhhdmUgYW4gYXV0by1nZW5lcmF0ZWQKKyAgICAgICAgLy8gaW1wbCBvZiBGcm9tOjpmcm9tCisgICAgICAgIHJlcy5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgZm4gaGFuZGxlX3ppcCgmc2VsZikgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgcHJpbnRsbiEoImhhbmRsaW5nIHppcCIpOworICAgICAgICBPaygoKSkKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90dXRvcmlhbC9ycy9zcmMvbGliLnJzIGIvdHV0b3JpYWwvcnMvc3JjL2xpYi5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDAwN2U1Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvcnMvc3JjL2xpYi5ycwpAQCAtMCwwICsxLDIzIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK2V4dGVybiBjcmF0ZSBvcmRlcmVkX2Zsb2F0OworZXh0ZXJuIGNyYXRlIHRocmlmdDsKK2V4dGVybiBjcmF0ZSB0cnlfZnJvbTsKKworcHViIG1vZCBzaGFyZWQ7CitwdWIgbW9kIHR1dG9yaWFsOwpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvc2hhcmVkLnRocmlmdCBiL3R1dG9yaWFsL3NoYXJlZC50aHJpZnQKaW5kZXggNjBlOGU3YS4uZjE2ODViZCAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvc2hhcmVkLnRocmlmdAorKysgYi90dXRvcmlhbC9zaGFyZWQudGhyaWZ0CkBAIC0yMiwxMiArMjIsMTUgQEAKICAqIHRoZXNlIGRlZmluaXRpb25zLgogICovCiAKK25hbWVzcGFjZSBjbCBzaGFyZWQKIG5hbWVzcGFjZSBjcHAgc2hhcmVkCiBuYW1lc3BhY2UgZCBzaGFyZSAvLyAic2hhcmVkIiB3b3VsZCBjb2xsaWRlIHdpdGggdGhlIGVwb255bW91cyBEIGtleXdvcmQuCituYW1lc3BhY2UgZGFydCBzaGFyZWQKIG5hbWVzcGFjZSBqYXZhIHNoYXJlZAogbmFtZXNwYWNlIHBlcmwgc2hhcmVkCiBuYW1lc3BhY2UgcGhwIHNoYXJlZAogbmFtZXNwYWNlIGhheGUgc2hhcmVkCituYW1lc3BhY2UgbmV0Y29yZSBzaGFyZWQKIAogc3RydWN0IFNoYXJlZFN0cnVjdCB7CiAgIDE6IGkzMiBrZXkKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdCBiL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdAppbmRleCA1NzFhYjhlLi5lMDI3NTQ2IDEwMDY0NAotLS0gYS90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQKKysrIGIvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CkBAIC0zMiw3ICszMiw3IEBACiAgKiBUaGUgZmlyc3QgdGhpbmcgdG8ga25vdyBhYm91dCBhcmUgdHlwZXMuIFRoZSBhdmFpbGFibGUgdHlwZXMgaW4gVGhyaWZ0IGFyZToKICAqCiAgKiAgYm9vbCAgICAgICAgQm9vbGVhbiwgb25lIGJ5dGUKLSAqICBieXRlICAgICAgICBTaWduZWQgYnl0ZQorICogIGk4IChieXRlKSAgIFNpZ25lZCA4LWJpdCBpbnRlZ2VyCiAgKiAgaTE2ICAgICAgICAgU2lnbmVkIDE2LWJpdCBpbnRlZ2VyCiAgKiAgaTMyICAgICAgICAgU2lnbmVkIDMyLWJpdCBpbnRlZ2VyCiAgKiAgaTY0ICAgICAgICAgU2lnbmVkIDY0LWJpdCBpbnRlZ2VyCkBAIC02MiwxMiArNjIsMTYgQEAKICAqIFRocmlmdCBmaWxlcyBjYW4gbmFtZXNwYWNlLCBwYWNrYWdlLCBvciBwcmVmaXggdGhlaXIgb3V0cHV0IGluIHZhcmlvdXMKICAqIHRhcmdldCBsYW5ndWFnZXMuCiAgKi8KKworbmFtZXNwYWNlIGNsIHR1dG9yaWFsCiBuYW1lc3BhY2UgY3BwIHR1dG9yaWFsCiBuYW1lc3BhY2UgZCB0dXRvcmlhbAorbmFtZXNwYWNlIGRhcnQgdHV0b3JpYWwKIG5hbWVzcGFjZSBqYXZhIHR1dG9yaWFsCiBuYW1lc3BhY2UgcGhwIHR1dG9yaWFsCiBuYW1lc3BhY2UgcGVybCB0dXRvcmlhbAogbmFtZXNwYWNlIGhheGUgdHV0b3JpYWwKK25hbWVzcGFjZSBuZXRjb3JlIHR1dG9yaWFsCiAKIC8qKgogICogVGhyaWZ0IGxldHMgeW91IGRvIHR5cGVkZWZzIHRvIGdldCBwcmV0dHkgbmFtZXMgZm9yIHlvdXIgdHlwZXMuIFN0YW5kYXJkCg==